ZGlmZiAtLWdpdCBhL0RvYy9BQ0tTIGIvRG9jL0FDS1MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMjY2MmQuLjAwMDAwMDAKLS0tIGEvRG9jL0FDS1MKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotQ29udHJpYnV0b3JzIHRvIHRoZSBQeXRob24gRG9jdW1lbnRhdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGlzIGZpbGUgbGlzdHMgcGVvcGxlIHdobyBoYXZlIGNvbnRyaWJ1dGVkIGluIHNvbWUgd2F5IHRvIHRoZSBQeXRob24KLWRvY3VtZW50YXRpb24uICBJdCBpcyBwcm9iYWJseSBub3QgY29tcGxldGUgLS0gaWYgeW91IGZlZWwgdGhhdCB5b3Ugb3IKLWFueW9uZSBlbHNlIHNob3VsZCBiZSBvbiB0aGlzIGxpc3QsIHBsZWFzZSBsZXQgdXMga25vdyAoc2VuZCBlbWFpbCB0bwotZG9jc0BweXRob24ub3JnKSwgYW5kIHdlJ2xsIGJlIGdsYWQgdG8gY29ycmVjdCB0aGUgcHJvYmxlbS4KLQotSXQgaXMgb25seSB3aXRoIHRoZSBpbnB1dCBhbmQgY29udHJpYnV0aW9ucyBvZiB0aGUgUHl0aG9uIGNvbW11bml0eQotdGhhdCBQeXRob24gaGFzIHN1Y2ggd29uZGVyZnVsIGRvY3VtZW50YXRpb24gLS0gVGhhbmsgWW91IQotCi1JbiB0aGUgb2ZmaWNpYWwgc291cmNlcywgdGhpcyBmaWxlIGlzIGVuY29kZWQgaW4gSVNPLTg4NTktMSAoTGF0aW4tMSkuCi0KLQotICAtRnJlZAotCi0KLUFhaHoKLU1pY2hhZWwgQWJib3R0Ci1TdGV2ZSBBbGV4YW5kZXIKLUppbSBBaGxzdHJvbQotRnJlZCBBbGxlbgotQS4gQW1vcm9zbwotUGVociBBbmRlcnNvbgotT2xpdmVyIEFuZHJpY2gKLUplc8O6cyBDZWEgQXZpw7NuCi1EYW5pZWwgQmFyY2xheQotQ2hyaXMgQmFya2VyCi1Eb24gQmFzaGZvcmQKLUFudGhvbnkgQmF4dGVyCi1CZW5uZXR0IEJlbnNvbgotSm9uYXRoYW4gQmxhY2sKLVJvYmluIEJvZXJkaWprCi1NaWNoYWwgQm96b24KLUFhcm9uIEJyYW5jb3R0aQotS2VpdGggQnJpZ2dzCi1MZWUgQnVzYnkKLUxvcmVuem8gTS4gQ2F0dWNjaQotTWF1cm8gQ2ljb2duaW5pCi1HaWxsZXMgQ2l2YXJpbwotTWlrZSBDbGFya3NvbgotU3RldmUgQ2xpZnQKLURhdmUgQ29sZQotTWF0dGhldyBDb3dsZXMKLUplcmVteSBDcmF2ZW4KLUFuZHJldyBEYWxrZQotQmVuIERhcm5lbGwKLUwuIFBldGVyIERldXRzY2gKLVJvYmVydCBEb25vaHVlCi1GcmVkIEwuIERyYWtlLCBKci4KLUplZmYgRXBsZXIKLU1pY2hhZWwgRXJuc3QKLUJsYW1lIEFuZHkgRXNraWxzc29uCi1DYXJleSBFdmFucwotTWFydGlqbiBGYWFzc2VuCi1DYXJsIEZleW5tYW4KLUhlcm7DoW4gTWFydMOtbmV6IEZvZmZhbmkKLVN0ZWZhbiBGcmFua2UKLUppbSBGdWx0b24KLVBldGVyIEZ1bmsKLUxlbGUgR2FpZmF4Ci1NYXR0aGV3IEdhbGxhZ2hlcgotQmVuIEdlcnR6ZmllbGQKLU5hZGltIEdoYXpuYXZpCi1Kb25hdGhhbiBHaWRkeQotU2hlbGxleSBHb29jaAotTmF0aGFuaWVsIEdyYXkKLUdyYW50IEdyaWZmaW4KLVRob21hcyBHdWV0dGxlcgotQW5kZXJzIEhhbW1hcnF1aXN0Ci1NYXJrIEhhbW1vbmQKLUhhcmFsZCBIYW5jaGUtT2xzZW4KLU1hbnVzIEhhbmQKLUdlcmhhcmQgSMOkcmluZwotVHJhdmlzIEIuIEhhcnR3ZWxsCi1KYW5rbyBIYXVzZXIKLUJlcm5oYXJkIEhlcnpvZwotTWFnbnVzIEwuIEhldGxhbmQKLUtvbnJhZCBIaW5zZW4KLVN0ZWZhbiBIb2ZmbWVpc3RlcgotQWxiZXJ0IEhvZmthbXAKLUdyZWdvciBIb2ZmbGVpdAotU3RldmUgSG9sZGVuCi1UaG9tYXMgSG9sZW5zdGVpbgotR2Vycml0IEhvbGwKLVJvYiBIb29mdAotQnJpYW4gSG9vcGVyCi1SYW5kYWxsIEhvcHBlcgotTWljaGFlbCBIdWRzb24KLUVyaWMgSHVzcwotSmVyZW15IEh5bHRvbgotUm9nZXIgSXJ3aW4KLUphY2sgSmFuc2VuCi1QaGlsaXAgSC4gSmVuc2VuCi1QZWRybyBEaWF6IEppbWVuZXoKLUtlbnQgSm9obnNvbgotTHVjYXMgZGUgSm9uZ2UKLUFuZHJlYXMgSnVuZwotUm9iZXJ0IEtlcm4KLUppbSBLZXJyCi1KYW4gS2ltCi1HcmVnIEtvY2hhbnNraQotR3VpZG8gS29sbGVyaWUKLVBldGVyIEEuIEtvcmVuCi1EYW5pZWwgS296YW4KLUFuZHJldyBNLiBLdWNobGluZwotRGF2ZSBLdWhsbWFuCi1Fcm5vIEt1dXNlbGEKLURldGxlZiBMYW5uZXJ0Ci1QaWVycyBMYXVkZXIKLUdseXBoIExlZmtvd2l0egotTWFyYy1BbmRyw6kgTGVtYnVyZwotVWxmIEEuIExpbmRncmVuCi1FdmVyZXR0IExpcG1hbgotTWlya28gTGlzcwotTWFydGluIHZvbiBMw7Z3aXMKLUZyZWRyaWsgTHVuZGgKLUplZmYgTWFjRG9uYWxkCi1Kb2huIE1hY2hpbgotQW5kcmV3IE1hY0ludHlyZQotVmxhZGltaXIgTWFyYW5nb3pvdgotVmluY2VudCBNYXJjaGV0dGkKLUxhdXJhIE1hdHNvbgotRGFuaWVsIE1heQotRG91ZyBNZW5uZWxsYQotUGFvbG8gTWlsYW5pCi1Ta2lwIE1vbnRhbmFybwotUGF1bCBNb29yZQotUm9zcyBNb29yZQotU2pvZXJkIE11bGxlbmRlcgotRGFsZSBOYWdhdGEKLU5nIFBoZW5nIFNpb25nCi1Lb3JheSBPbmVyCi1Ub21hcyBPcHBlbHN0cnVwCi1EZW5pcyBTLiBPdGtpZGFjaAotWm9va28gTydXaGllbGFjcm9ueAotV2lsbGlhbSBQYXJrCi1Kb29uYXMgUGFhbGFzbWFhCi1IYXJyaSBQYXNhbmVuCi1CbyBQZW5nCi1UaW0gUGV0ZXJzCi1DaHJpc3RvcGhlciBQZXRyaWxsaQotSnVzdGluIEQuIFBldHRpdAotQ2hyaXMgUGhvZW5peAotRnJhbsOnb2lzIFBpbmFyZAotUGF1bCBQcmVzY29kCi1FcmljIFMuIFJheW1vbmQKLUVkd2FyZCBLLiBSZWFtCi1TZWFuIFJlaWZzY2huZWlkZXIKLUJlcm5oYXJkIFJlaXRlcgotQXJtaW4gUmlnbwotV2VzIFJpc2hlbAotSmltIFJvc2tpbmQKLUd1aWRvIHZhbiBSb3NzdW0KLURvbmFsZCBXYWxsYWNlIFJvdXNlIElJCi1OaWNrIFJ1c3NvCi1DaHJpcyBSeWxhbmQKLUNvbnN0YW50aW5hIFMuCi1IdWdoIFNhc3NlCi1Cb2IgU2F2YWdlCi1TY290dCBTY2hyYW0KLU5laWwgU2NoZW1lbmF1ZXIKLUJhcnJ5IFNjb3R0Ci1Kb2FraW0gU2VybmJyYW50Ci1KdXN0aW4gU2hlZWh5Ci1NaWNoYWVsIFNpbWNpY2gKLUlvbmVsIFNpbWlvbmVzY3UKLUdyZWdvcnkgUC4gU21pdGgKLVJveSBTbWl0aAotQ2xheSBTcGVuY2UKLU5pY2hvbGFzIFNwaWVzCi1UYWdlIFN0YWJlbGwtS3VsbwotRnJhbmsgU3RhamFubwotQW50aG9ueSBTdGFya3MKLUdyZWcgU3RlaW4KLVBldGVyIFN0b2VocgotTWFyayBTdW1tZXJmaWVsZAotUmV1YmVuIFN1bW5lcgotS2FsbGUgU3ZlbnNzb24KLUppbSBUaXR0c2xlcgotVmlsbGUgVmFpbmlvCi1NYXJ0aWpuIFZyaWVzCi1DaGFybGVzIEcuIFdhbGRtYW4KLUdyZWcgV2FyZAotQmFycnkgV2Fyc2F3Ci1Db3JyYW4gV2Vic3RlcgotR2x5biBXZWJzdGVyCi1Cb2IgV2VpbmVyCi1FZGR5IFdlbGJvdXJuZQotTWF0cyBXaWNobWFubgotR2VycnkgV2llbmVyCi1UaW1vdGh5IFdpbGQKLUNvbGxpbiBXaW50ZXIKLUJsYWtlIFdpbnRvbgotRGFuIFdvbGZlCi1TdGV2ZW4gV29yawotVGhvbWFzIFdvdXRlcnMKLUthLVBpbmcgWWVlCi1Sb3J5IFlvcmtlCi1Nb3NoZSBaYWRrYQotTWlsYW4gWmFtYXphbAotQ2hlbmcgWmhhbmcKZGlmZiAtLWdpdCBhL0RvYy9NYWtlZmlsZSBiL0RvYy9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RhOTY5MC4uMDAwMDAwMAotLS0gYS9Eb2MvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw3MzYgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgUHl0aG9uIGRvY3VtZW50YXRpb24KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jCi0jIFNlZSBhbHNvIHRoZSBSRUFETUUgZmlsZS4KLSMKLSMgVGhpcyBpcyBhIGJpdCBvZiBhIG1lc3MuICBUaGUgZG9jdW1lbnRzIGFyZSBpZGVudGlmaWVkIGJ5IHNob3J0IG5hbWVzOgotIyAgIGFwaSAtLSBQeXRob24vQyBBUEkgUmVmZXJlbmNlIE1hbnVhbAotIyAgIGRvYyAtLSBEb2N1bWVudGluZyBQeXRob24KLSMgICBleHQgLS0gRXh0ZW5kaW5nIGFuZCBFbWJlZGRpbmcgdGhlIFB5dGhvbiBJbnRlcnByZXRlcgotIyAgIGxpYiAtLSBMaWJyYXJ5IFJlZmVyZW5jZSBNYW51YWwKLSMgICBtYWMgLS0gTWFjaW50b3NoIExpYnJhcnkgTW9kdWxlcwotIyAgIHJlZiAtLSBQeXRob24gUmVmZXJlbmNlIE1hbnVhbAotIyAgIHR1dCAtLSBQeXRob24gVHV0b3JpYWwKLSMgICBpbnN0IC0tIEluc3RhbGxpbmcgUHl0aG9uIE1vZHVsZXMKLSMgICBkaXN0IC0tIERpc3RyaWJ1dGluZyBQeXRob24gTW9kdWxlcwotIwotIyBUaGUgTGFUZVggc291cmNlcyBmb3IgZWFjaCBvZiB0aGVzZSBkb2N1bWVudHMgYXJlIGluIHN1YmRpcmVjdG9yaWVzCi0jIHdpdGggdGhlIHRocmVlLWxldHRlciBkZXNpZ25hdGlvbnMgYWJvdmUgYXMgdGhlIGRpcmVjdG9yeSBuYW1lcy4KLSMKLSMgVGhlIG1haW4gdGFyZ2V0IGNyZWF0ZXMgSFRNTCBmb3IgZWFjaCBvZiB0aGUgZG9jdW1lbnRzLiAgWW91IGNhbgotIyBhbHNvIGRvICJtYWtlIGxpYiIgKGV0Yy4pIHRvIGNyZWF0ZSB0aGUgSFRNTCB2ZXJzaW9ucyBvZiBpbmRpdmlkdWFsCi0jIGRvY3VtZW50cy4KLSMKLSMgVGhlIGRvY3VtZW50IGNsYXNzZXMgYW5kIHN0eWxlcyBhcmUgaW4gdGhlIHRleGlucHV0cy8gZGlyZWN0b3J5LgotIyBUaGVzZSBkZWZpbmUgYSBudW1iZXIgb2YgbWFjcm9zIHRoYXQgYXJlIHNpbWlsYXIgaW4gbmFtZSBhbmQgaW50ZW50Ci0jIGFzIG1hY3JvcyBpbiBUZXhpbmZvIChlLmcuIFxjb2Rley4uLn0gYW5kIFxlbXBoey4uLn0pLCBhcyB3ZWxsIGFzIGEKLSMgbnVtYmVyIG9mIGVudmlyb25tZW50cyBmb3IgZm9ybWF0dGluZyBmdW5jdGlvbiBhbmQgZGF0YSBkZWZpbml0aW9ucy4KLSMgRG9jdW1lbnRhdGlvbiBmb3IgdGhlIG1hY3JvcyBpcyBpbmNsdWRlZCBpbiAiRG9jdW1lbnRpbmcgUHl0aG9uIjsgc2VlCi0jIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvY3VycmVudC9kb2MvZG9jLmh0bWwsIG9yIHRoZSBzb3VyY2VzIGZvcgotIyB0aGlzIGRvY3VtZW50IGluIHRoZSBkb2MvIGRpcmVjdG9yeS4KLSMKLSMgRXZlcnl0aGluZyBpcyBwcm9jZXNzZWQgYnkgTGFUZVguICBTZWUgdGhlIGZpbGUgYFJFQURNRScgZm9yIG1vcmUKLSMgaW5mb3JtYXRpb24gb24gdGhlIHRvb2xzIG5lZWRlZCBmb3IgcHJvY2Vzc2luZy4KLSMKLSMgVGhlcmUncyBhIHByb2JsZW0gd2l0aCBnZW5lcmF0aW5nIHRoZSBpbmRleCB3aGljaCBoYXMgYmVlbiBzb2x2ZWQgYnkKLSMgYSBzZWQgY29tbWFuZCBhcHBsaWVkIHRvIHRoZSBpbmRleCBmaWxlLiAgVGhlIHNoZWxsIHNjcmlwdCBmaXhfaGFjawotIyBkb2VzIHRoaXMgKHRoZSBNYWtlZmlsZSB0YWtlcyBjYXJlIG9mIGNhbGxpbmcgaXQpLgotIwotIyBBZGRpdGlvbmFsIHRhcmdldHMgYXR0ZW1wdCB0byBjb252ZXJ0IHNlbGVjdGVkIExhVGVYIHNvdXJjZXMgdG8KLSMgdmFyaW91cyBvdGhlciBmb3JtYXRzLiAgVGhlc2UgYXJlIGdlbmVyYWxseSBzaXRlIHNwZWNpZmljIGJlY2F1c2UKLSMgdGhlIHRvb2xzIHVzZWQgYXJlIGFsbCBidXQgdW5pdmVyc2FsLiAgVGhlc2UgdGFyZ2V0cyBhcmU6Ci0jCi0jICAgcHMgIC0tIGNvbnZlcnQgYWxsIGRvY3VtZW50cyBmcm9tIExhVGVYIHRvIFBvc3RTY3JpcHQKLSMgICBwZGYgLS0gY29udmVydCBhbGwgZG9jdW1lbnRzIGZyb20gTGFUZVggdG8gdGhlCi0jCQlQb3J0YWJsZSBEb2N1bWVudCBGb3JtYXQKLSMKLSMgU2VlIHRoZSBSRUFETUUgZmlsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZSB0YXJnZXRzLgotIwotIyBUaGUgZm9ybWF0dGVkIG91dHB1dCBpcyBsb2NhdGVkIGluIHN1YmRpcmVjdG9yaWVzLiAgRm9yIFBERiBhbmQKLSMgUG9zdFNjcmlwdCwgbG9vayBpbiB0aGUgcGFwZXItJChQQVBFUikvIGRpcmVjdG9yeS4gIEZvciBIVE1MLCBsb29rIGluCi0jIHRoZSBodG1sLyBkaXJlY3RvcnkuICBJZiB5b3Ugd2FudCB0byBmaXggdGhlIEdOVSBpbmZvIHByb2Nlc3MsIGxvb2sKLSMgaW4gdGhlIGluZm8vIGRpcmVjdG9yeTsgcGxlYXNlIHNlbmQgcGF0Y2hlcyB0byBkb2NzQHB5dGhvbi5vcmcuCi0KLSMgVGhpcyBNYWtlZmlsZSBvbmx5IGluY2x1ZGVzIGluZm9ybWF0aW9uIG9uIGhvdyB0byBwZXJmb3JtIGJ1aWxkczsgZm9yCi0jIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24sIHNlZSBNYWtlZmlsZS5kZXBzLgotCi0jIEN1c3RvbWl6YXRpb24gLS0geW91ICptYXkqIGhhdmUgdG8gZWRpdCB0aGlzCi0KLSMgWW91IGNvdWxkIHNldCB0aGlzIHRvIGE0OgotUEFQRVI9bGV0dGVyCi0KLSMgSWRlYWxseSwgeW91IHNob3VsZG4ndCBuZWVkIHRvIGVkaXQgYmV5b25kIHRoaXMgcG9pbnQKLQotSU5GT0RJUj0JaW5mbwotVE9PTFNESVI9CXRvb2xzCi0KLSMgVGhpcyBpcyB0aGUgKmRvY3VtZW50YXRpb24qIHJlbGVhc2UsIGFuZCBpcyB1c2VkIHRvIGNvbnN0cnVjdCB0aGUKLSMgZmlsZSBuYW1lcyBvZiB0aGUgZG93bmxvYWRhYmxlIHRhcmJhbGxzLiAgSXQgaXMgaW5pdGlhbGl6ZWQgYnkgdGhlCi0jIGdldHZlcnNpb25pbmZvIHNjcmlwdCB0byBlbnN1cmUgdGhhdCB0aGUgcmlnaHQgdmVyc2lvbiBudW1iZXIgaXMKLSMgdXNlZDsgdGhlIHNjcmlwdCB3aWxsIGFsc28gd3JpdGUgY29tbW9udGV4L3BhdGNobGV2ZWwudGV4IGlmIHRoYXQKLSMgZG9lc24ndCBleGlzdCBvciBuZWVkcyB0byBiZSBjaGFuZ2VkLiAgRG9jdW1lbnRzIHdoaWNoIGRlcGVuZCBvbiB0aGUKLSMgdmVyc2lvbiBudW1iZXIgc2hvdWxkIHVzZSBcaW5wdXR7cGF0Y2hsZXZlbH0gYW5kIGluY2x1ZGUKLSMgY29tbW9udGV4L3BhdGNobGV2ZWwudGV4IGluIHRoZWlyIGRlcGVuZGVuY2llcy4KLVJFTEVBU0U9JChzaGVsbCAkKFBZVEhPTikgdG9vbHMvZ2V0dmVyc2lvbmluZm8pCi0KLVBZVEhPTj0JICAgJChQV0QpLy4uL3B5dGhvbgotRFZJUFM9CSAgIGR2aXBzIC1OMCAtdCAkKFBBUEVSKQotCi0jIFRoaXMgaXMgdWdseSEgIFRoZSBpc3N1ZSBoZXJlIGlzIHRoYXQgdGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgbGV2ZWxzCi0jIGluIHRoZSBkaXJlY3RvcnkgdHJlZSBhdCB3aGljaCB3ZSBleGVjdXRlIG1raG93dG8sIHNvIHdlIGNhbid0Ci0jIGRlZmluZSBpdCBqdXN0IG9uY2UgdXNpbmcgYSByZWxhdGl2ZSBwYXRoIChhdCBsZWFzdCBub3Qgd2l0aCB0aGUKLSMgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBhbmQgTWFrZWZpbGUgc3RydWN0dXJlKS4gIFdlIHVzZSB0aGUgR05VaXNoCi0jICQoc2hlbGwpIGZ1bmN0aW9uIGhlcmUgdG8gd29yayBhcm91bmQgdGhhdCByZXN0cmljdGlvbiBieQotIyBpZGVudGlmeWluZyBta2hvd3RvIGFuZCB0aGUgY29tbW9udGV4LyBkaXJlY3RvcnkgdXNpbmcgYWJzb2x1dGUgcGF0aHMuCi0jCi0jIElmIHlvdXIgZG9jIGJ1aWxkIGZhaWxzIGltbWVkaWF0ZWx5LCB5b3UgbWF5IG5lZWQgdG8gc3dpdGNoIHRvIEdOVSBtYWtlLgotIyAoZS5nLiBPcGVuQlNEIG5lZWRzIHBhY2thZ2UgZ21ha2UgaW5zdGFsbGVkOyB1c2UgZ21ha2UgaW5zdGVhZCBvZiBtYWtlKQotUFdEPSQoc2hlbGwgcHdkKQotCi0jIChUaGUgdHJhaWxpbmcgY29sb24gaW4gdGhlIHZhbHVlIGlzIG5lZWRlZDsgVGVYIHBsYWNlcyBpdHMgZGVmYXVsdAotIyBzZXQgb2YgcGF0aHMgYXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBlbXB0eSBzdHJpbmcgaW4gdGhlIHBhdGggbGlzdC4pCi1URVhJTlBVVFM9JChQV0QpL2NvbW1vbnRleDoKLQotIyBUaGUgbWtob3d0byBzY3JpcHQgY2FuIGJlIHJ1biBmcm9tIHRoZSBjaGVja291dCB1c2luZyB0aGUgZmlyc3QKLSMgdmVyc2lvbiBvZiB0aGlzIHZhcmlhYmxlIGRlZmluaXRpb24sIG9yIGZyb20gYSBwcmVmZXJyZWQgdmVyc2lvbgotIyB1c2luZyB0aGUgc2Vjb25kIHZlcnNpb24uICBUaGUgc3RhbmRhcmQgZG9jdW1lbnRhdGlvbiBpcyB0eXBpY2FsbHkKLSMgYnVpbHQgdXNpbmcgdGhlIHNlY29uZCBmbGF2b3IsIHdoZXJlIHRoZSBwcmVmZXJyZWQgdmVyc2lvbiBpcyBmcm9tCi0jIHRoZSBQeXRob24gQ1ZTIHRydW5rLgotTUtIT1dUTz0gICBURVhJTlBVVFM9JChURVhJTlBVVFMpICQoUFlUSE9OKSAkKFBXRCkvdG9vbHMvbWtob3d0bwotCi1NS0RWST0JICAgJChNS0hPV1RPKSAtLXBhcGVyPSQoUEFQRVIpIC0tZHZpCi1NS0hUTUw9CSAgICQoTUtIT1dUTykgLS1odG1sIC0tYWJvdXQgaHRtbC9zdGRhYm91dC5kYXQgXAotCQktLWljb25zZXJ2ZXIgLi4vaWNvbnMgLS1mYXZpY29uIC4uL2ljb25zL3B5ZmF2LnBuZyBcCi0JCS0tYWRkcmVzcyAkKFBZVEhPTkRPQ1MpIC0tdXAtbGluayAuLi9pbmRleC5odG1sIFwKLQkJLS11cC10aXRsZSAiUHl0aG9uIERvY3VtZW50YXRpb24gSW5kZXgiIFwKLQkJLS1nbG9iYWwtbW9kdWxlLWluZGV4ICIuLi9tb2RpbmRleC5odG1sIiAtLWR2aXBzLXNhZmUKLU1LSVNJTE9IVE1MPSQoTUtIT1dUTykgLS1odG1sIC0tYWJvdXQgaHRtbC9zdGRhYm91dC5kYXQgXAotCQktLWljb25zZXJ2ZXIgLi4vaWNvbnMgXAotCQktLWwyaC1pbml0IHBlcmwvaXNpbG8ucGVybCAtLW51bWVyaWMgLS1zcGxpdCAxIFwKLQkJLS1kdmlwcy1zYWZlCi1NS0lTSUxPPSAgIGlTaWxvMzg2IC1VIC15IC1yQ1IgLWQwCi1NS1BERj0JICAgJChNS0hPV1RPKSAtLXBhcGVyPSQoUEFQRVIpIC0tcGRmCi1NS1BTPQkgICAkKE1LSE9XVE8pIC0tcGFwZXI9JChQQVBFUikgLS1wcwotCi1CVUlMRElOREVYPSQoVE9PTFNESVIpL2J1aWxkaW5kZXgucHkKLQotUFlUSE9ORE9DUz0iU2VlIDxpPjxhIGhyZWY9XCJhYm91dC5odG1sXCI+QWJvdXQgdGhpcyBkb2N1bWVudC4uLjwvYT48L2k+IGZvciBpbmZvcm1hdGlvbiBvbiBzdWdnZXN0aW5nIGNoYW5nZXMuIgotSFRNTEJBU0U9ICBmaWxlOmBwd2RgCi0KLSMgVGhlIGVtYWNzIGJpbmFyeSB1c2VkIHRvIGJ1aWxkIHRoZSBpbmZvIGRvY3MuIEdOVSBFbWFjcyAyMSBpcyByZXF1aXJlZC4KLUVNQUNTPSAgICAgZW1hY3MKLQotIyBUaGUgZW5kIG9mIHRoaXMgc2hvdWxkIHJlZmxlY3QgdGhlIG1ham9yL21pbm9yIHZlcnNpb24gbnVtYmVycyBvZgotIyB0aGUgcmVsZWFzZToKLVdIQVRTTkVXPXdoYXRzbmV3MzAKLQotIyB3aGF0J3Mgd2hhdAotTUFORFZJRklMRVM9CXBhcGVyLSQoUEFQRVIpL2FwaS5kdmkgcGFwZXItJChQQVBFUikvZXh0LmR2aSBcCi0JCXBhcGVyLSQoUEFQRVIpL2xpYi5kdmkgcGFwZXItJChQQVBFUikvbWFjLmR2aSBcCi0JCXBhcGVyLSQoUEFQRVIpL3JlZi5kdmkgcGFwZXItJChQQVBFUikvdHV0LmR2aQotSE9XVE9EVklGSUxFUz0JcGFwZXItJChQQVBFUikvZG9jLmR2aSBwYXBlci0kKFBBUEVSKS9pbnN0LmR2aSBcCi0JCXBhcGVyLSQoUEFQRVIpL2Rpc3QuZHZpIHBhcGVyLSQoUEFQRVIpLyQoV0hBVFNORVcpLmR2aQotCi1NQU5QREZGSUxFUz0JcGFwZXItJChQQVBFUikvYXBpLnBkZiBwYXBlci0kKFBBUEVSKS9leHQucGRmIFwKLQkJcGFwZXItJChQQVBFUikvbGliLnBkZiBwYXBlci0kKFBBUEVSKS9tYWMucGRmIFwKLQkJcGFwZXItJChQQVBFUikvcmVmLnBkZiBwYXBlci0kKFBBUEVSKS90dXQucGRmCi1IT1dUT1BERkZJTEVTPQlwYXBlci0kKFBBUEVSKS9kb2MucGRmIHBhcGVyLSQoUEFQRVIpL2luc3QucGRmIFwKLQkJcGFwZXItJChQQVBFUikvZGlzdC5wZGYgcGFwZXItJChQQVBFUikvJChXSEFUU05FVykucGRmCi0KLU1BTlBTRklMRVM9CXBhcGVyLSQoUEFQRVIpL2FwaS5wcyBwYXBlci0kKFBBUEVSKS9leHQucHMgXAotCQlwYXBlci0kKFBBUEVSKS9saWIucHMgcGFwZXItJChQQVBFUikvbWFjLnBzIFwKLQkJcGFwZXItJChQQVBFUikvcmVmLnBzIHBhcGVyLSQoUEFQRVIpL3R1dC5wcwotSE9XVE9QU0ZJTEVTPQlwYXBlci0kKFBBUEVSKS9kb2MucHMgcGFwZXItJChQQVBFUikvaW5zdC5wcyBcCi0JCXBhcGVyLSQoUEFQRVIpL2Rpc3QucHMgcGFwZXItJChQQVBFUikvJChXSEFUU05FVykucHMKLQotRFZJRklMRVM9CSQoTUFORFZJRklMRVMpICQoSE9XVE9EVklGSUxFUykKLVBERkZJTEVTPQkkKE1BTlBERkZJTEVTKSAkKEhPV1RPUERGRklMRVMpCi1QU0ZJTEVTPQkkKE1BTlBTRklMRVMpICQoSE9XVE9QU0ZJTEVTKQotCi1IVE1MQ1NTRklMRVM9aHRtbC9hcGkvYXBpLmNzcyBcCi0JaHRtbC9kb2MvZG9jLmNzcyBcCi0JaHRtbC9leHQvZXh0LmNzcyBcCi0JaHRtbC9saWIvbGliLmNzcyBcCi0JaHRtbC9tYWMvbWFjLmNzcyBcCi0JaHRtbC9yZWYvcmVmLmNzcyBcCi0JaHRtbC90dXQvdHV0LmNzcyBcCi0JaHRtbC9pbnN0L2luc3QuY3NzIFwKLQlodG1sL2Rpc3QvZGlzdC5jc3MKLQotSVNJTE9DU1NGSUxFUz1pc2lsby9hcGkvYXBpLmNzcyBcCi0JaXNpbG8vZG9jL2RvYy5jc3MgXAotCWlzaWxvL2V4dC9leHQuY3NzIFwKLQlpc2lsby9saWIvbGliLmNzcyBcCi0JaXNpbG8vbWFjL21hYy5jc3MgXAotCWlzaWxvL3JlZi9yZWYuY3NzIFwKLQlpc2lsby90dXQvdHV0LmNzcyBcCi0JaXNpbG8vaW5zdC9pbnN0LmNzcyBcCi0JaXNpbG8vZGlzdC9kaXN0LmNzcwotCi1BTExDU1NGSUxFUz0kKEhUTUxDU1NGSUxFUykgJChJU0lMT0NTU0ZJTEVTKQotCi1JTkRFWEZJTEVTPWh0bWwvYXBpL2FwaS5odG1sIFwKLQlodG1sL2RvYy9kb2MuaHRtbCBcCi0JaHRtbC9leHQvZXh0Lmh0bWwgXAotCWh0bWwvbGliL2xpYi5odG1sIFwKLQlodG1sL21hYy9tYWMuaHRtbCBcCi0JaHRtbC9yZWYvcmVmLmh0bWwgXAotCWh0bWwvdHV0L3R1dC5odG1sIFwKLQlodG1sL2luc3QvaW5zdC5odG1sIFwKLQlodG1sL2Rpc3QvZGlzdC5odG1sIFwKLQlodG1sL3doYXRzbmV3LyQoV0hBVFNORVcpLmh0bWwKLQotQUxMSFRNTEZJTEVTPSQoSU5ERVhGSUxFUykgaHRtbC9pbmRleC5odG1sIGh0bWwvbW9kaW5kZXguaHRtbCBodG1sL2Fja3MuaHRtbAotCi1DT01NT05QRVJMPSBwZXJsL21hbnVhbC5wZXJsIHBlcmwvcHl0aG9uLnBlcmwgcGVybC9sMmhpbml0LnBlcmwKLQotQU5OT0FQST1hcGkvcmVmY291bnRzLmRhdCB0b29scy9hbm5vLWFwaS5weQotCi1pbmNsdWRlIE1ha2VmaWxlLmRlcHMKLQotIyBUaGVzZSBtdXN0IGJlIGRlY2xhcmVkIHBob255IHNpbmNlIHRoZXJlCi0jIGFyZSBkaXJlY3RvcmllcyB3aXRoIG1hdGNoaW5nIG5hbWVzOgotLlBIT05ZOiBhcGkgZG9jIGV4dCBsaWIgbWFjIHJlZiB0dXQgaW5zdCBkaXN0Ci0uUEhPTlk6IGh0bWwgaW5mbyBpc2lsbwotCi0KLSMgTWFpbiB0YXJnZXQKLWRlZmF1bHQ6CWh0bWwKLWFsbDoJCWh0bWwgZHZpIHBzIHBkZiBpc2lsbwotCi1kdmk6CSQoRFZJRklMRVMpCi1wZGY6CSQoUERGRklMRVMpCi1wczoJJChQU0ZJTEVTKQotCi13b3JsZDoJcHMgcGRmIGh0bWwgZGlzdGZpbGVzCi0KLQotIyBSdWxlcyB0byBidWlsZCBQb3N0U2NyaXB0IGFuZCBQREYgZm9ybWF0cwotLlNVRkZJWEVTOiAuZHZpIC5wcwotCi0uZHZpLnBzOgotCSQoRFZJUFMpIC1vICRAICQ8Ci0KLQotIyBUYXJnZXRzIGZvciBlYWNoIGRvY3VtZW50OgotIyBQeXRob24vQyBBUEkgUmVmZXJlbmNlIE1hbnVhbAotcGFwZXItJChQQVBFUikvYXBpLmR2aTogJChBTk5PQVBJRklMRVMpCi0JY2QgcGFwZXItJChQQVBFUikgJiYgJChNS0RWSSkgYXBpLnRleAotCi1wYXBlci0kKFBBUEVSKS9hcGkucGRmOiAkKEFOTk9BUElGSUxFUykKLQljZCBwYXBlci0kKFBBUEVSKSAmJiAkKE1LUERGKSBhcGkudGV4Ci0KLXBhcGVyLSQoUEFQRVIpL2FwaS50ZXg6IGFwaS9hcGkudGV4Ci0JY3AgYXBpL2FwaS50ZXggJEAKLQotcGFwZXItJChQQVBFUikvYWJzdHJhY3QudGV4OiBhcGkvYWJzdHJhY3QudGV4ICQoQU5OT0FQSSkKLQkkKFBZVEhPTikgJChUT09MU0RJUikvYW5uby1hcGkucHkgLW8gJEAgYXBpL2Fic3RyYWN0LnRleAotCi1wYXBlci0kKFBBUEVSKS9jb25jcmV0ZS50ZXg6IGFwaS9jb25jcmV0ZS50ZXggJChBTk5PQVBJKQotCSQoUFlUSE9OKSAkKFRPT0xTRElSKS9hbm5vLWFwaS5weSAtbyAkQCBhcGkvY29uY3JldGUudGV4Ci0KLXBhcGVyLSQoUEFQRVIpL2V4Y2VwdGlvbnMudGV4OiBhcGkvZXhjZXB0aW9ucy50ZXggJChBTk5PQVBJKQotCSQoUFlUSE9OKSAkKFRPT0xTRElSKS9hbm5vLWFwaS5weSAtbyAkQCBhcGkvZXhjZXB0aW9ucy50ZXgKLQotcGFwZXItJChQQVBFUikvaW5pdC50ZXg6IGFwaS9pbml0LnRleCAkKEFOTk9BUEkpCi0JJChQWVRIT04pICQoVE9PTFNESVIpL2Fubm8tYXBpLnB5IC1vICRAIGFwaS9pbml0LnRleAotCi1wYXBlci0kKFBBUEVSKS9pbnRyby50ZXg6IGFwaS9pbnRyby50ZXgKLQljcCBhcGkvaW50cm8udGV4ICRACi0KLXBhcGVyLSQoUEFQRVIpL21lbW9yeS50ZXg6IGFwaS9tZW1vcnkudGV4ICQoQU5OT0FQSSkKLQkkKFBZVEhPTikgJChUT09MU0RJUikvYW5uby1hcGkucHkgLW8gJEAgYXBpL21lbW9yeS50ZXgKLQotcGFwZXItJChQQVBFUikvbmV3dHlwZXMudGV4OiBhcGkvbmV3dHlwZXMudGV4ICQoQU5OT0FQSSkKLQkkKFBZVEhPTikgJChUT09MU0RJUikvYW5uby1hcGkucHkgLW8gJEAgYXBpL25ld3R5cGVzLnRleAotCi1wYXBlci0kKFBBUEVSKS9yZWZjb3VudGluZy50ZXg6IGFwaS9yZWZjb3VudGluZy50ZXggJChBTk5PQVBJKQotCSQoUFlUSE9OKSAkKFRPT0xTRElSKS9hbm5vLWFwaS5weSAtbyAkQCBhcGkvcmVmY291bnRpbmcudGV4Ci0KLXBhcGVyLSQoUEFQRVIpL3V0aWxpdGllcy50ZXg6IGFwaS91dGlsaXRpZXMudGV4ICQoQU5OT0FQSSkKLQkkKFBZVEhPTikgJChUT09MU0RJUikvYW5uby1hcGkucHkgLW8gJEAgYXBpL3V0aWxpdGllcy50ZXgKLQotcGFwZXItJChQQVBFUikvdmVyeWhpZ2gudGV4OiBhcGkvdmVyeWhpZ2gudGV4ICQoQU5OT0FQSSkKLQkkKFBZVEhPTikgJChUT09MU0RJUikvYW5uby1hcGkucHkgLW8gJEAgYXBpL3ZlcnloaWdoLnRleAotCi0jIERpc3RyaWJ1dGluZyBQeXRob24gTW9kdWxlcwotcGFwZXItJChQQVBFUikvZGlzdC5kdmk6ICQoRElTVEZJTEVTKQotCWNkIHBhcGVyLSQoUEFQRVIpICYmICQoTUtEVkkpIC4uL2Rpc3QvZGlzdC50ZXgKLQotcGFwZXItJChQQVBFUikvZGlzdC5wZGY6ICQoRElTVEZJTEVTKQotCWNkIHBhcGVyLSQoUEFQRVIpICYmICQoTUtQREYpIC4uL2Rpc3QvZGlzdC50ZXgKLQotIyBEb2N1bWVudGluZyBQeXRob24KLXBhcGVyLSQoUEFQRVIpL2RvYy5kdmk6ICQoRE9DRklMRVMpCi0JY2QgcGFwZXItJChQQVBFUikgJiYgJChNS0RWSSkgLi4vZG9jL2RvYy50ZXgKLQotcGFwZXItJChQQVBFUikvZG9jLnBkZjogJChET0NGSUxFUykKLQljZCBwYXBlci0kKFBBUEVSKSAmJiAkKE1LUERGKSAuLi9kb2MvZG9jLnRleAotCi0jIEV4dGVuZGluZyBhbmQgRW1iZWRkaW5nIHRoZSBQeXRob24gSW50ZXJwcmV0ZXIKLXBhcGVyLSQoUEFQRVIpL2V4dC5kdmk6ICQoRVhURklMRVMpCi0JY2QgcGFwZXItJChQQVBFUikgJiYgJChNS0RWSSkgLi4vZXh0L2V4dC50ZXgKLQotcGFwZXItJChQQVBFUikvZXh0LnBkZjogJChFWFRGSUxFUykKLQljZCBwYXBlci0kKFBBUEVSKSAmJiAkKE1LUERGKSAuLi9leHQvZXh0LnRleAotCi0jIEluc3RhbGxpbmcgUHl0aG9uIE1vZHVsZXMKLXBhcGVyLSQoUEFQRVIpL2luc3QuZHZpOiAkKElOU1RGSUxFUykKLQljZCBwYXBlci0kKFBBUEVSKSAmJiAkKE1LRFZJKSAuLi9pbnN0L2luc3QudGV4Ci0KLXBhcGVyLSQoUEFQRVIpL2luc3QucGRmOiAkKElOU1RGSUxFUykKLQljZCBwYXBlci0kKFBBUEVSKSAmJiAkKE1LUERGKSAuLi9pbnN0L2luc3QudGV4Ci0KLSMgUHl0aG9uIExpYnJhcnkgUmVmZXJlbmNlCi1wYXBlci0kKFBBUEVSKS9saWIuZHZpOiAkKExJQkZJTEVTKQotCWNkIHBhcGVyLSQoUEFQRVIpICYmICQoTUtEVkkpIC4uL2xpYi9saWIudGV4Ci0KLXBhcGVyLSQoUEFQRVIpL2xpYi5wZGY6ICQoTElCRklMRVMpCi0JY2QgcGFwZXItJChQQVBFUikgJiYgJChNS1BERikgLi4vbGliL2xpYi50ZXgKLQotIyBNYWNpbnRvc2ggTGlicmFyeSBNb2R1bGVzCi1wYXBlci0kKFBBUEVSKS9tYWMuZHZpOiAkKE1BQ0ZJTEVTKQotCWNkIHBhcGVyLSQoUEFQRVIpICYmICQoTUtEVkkpIC4uL21hYy9tYWMudGV4Ci0KLXBhcGVyLSQoUEFQRVIpL21hYy5wZGY6ICQoTUFDRklMRVMpCi0JY2QgcGFwZXItJChQQVBFUikgJiYgJChNS1BERikgLi4vbWFjL21hYy50ZXgKLQotIyBQeXRob24gUmVmZXJlbmNlIE1hbnVhbAotcGFwZXItJChQQVBFUikvcmVmLmR2aTogJChSRUZGSUxFUykKLQljZCBwYXBlci0kKFBBUEVSKSAmJiAkKE1LRFZJKSAuLi9yZWYvcmVmLnRleAotCi1wYXBlci0kKFBBUEVSKS9yZWYucGRmOiAkKFJFRkZJTEVTKQotCWNkIHBhcGVyLSQoUEFQRVIpICYmICQoTUtQREYpIC4uL3JlZi9yZWYudGV4Ci0KLSMgUHl0aG9uIFR1dG9yaWFsCi1wYXBlci0kKFBBUEVSKS90dXQuZHZpOiAkKFRVVEZJTEVTKQotCWNkIHBhcGVyLSQoUEFQRVIpICYmICQoTUtEVkkpIC4uL3R1dC90dXQudGV4Ci0KLXBhcGVyLSQoUEFQRVIpL3R1dC5wZGY6ICQoVFVURklMRVMpCi0JY2QgcGFwZXItJChQQVBFUikgJiYgJChNS1BERikgLi4vdHV0L3R1dC50ZXgKLQotIyBXaGF0J3MgTmV3IGluIFB5dGhvbiBYLlkKLXBhcGVyLSQoUEFQRVIpLyQoV0hBVFNORVcpLmR2aTogd2hhdHNuZXcvJChXSEFUU05FVykudGV4Ci0JY2QgcGFwZXItJChQQVBFUikgJiYgJChNS0RWSSkgLi4vd2hhdHNuZXcvJChXSEFUU05FVykudGV4Ci0KLXBhcGVyLSQoUEFQRVIpLyQoV0hBVFNORVcpLnBkZjogd2hhdHNuZXcvJChXSEFUU05FVykudGV4Ci0JY2QgcGFwZXItJChQQVBFUikgJiYgJChNS1BERikgLi4vd2hhdHNuZXcvJChXSEFUU05FVykudGV4Ci0KLSMgVGhlIHJlbWFpbmluZyBwYXJ0IG9mIHRoZSBNYWtlZmlsZSBpcyBjb25jZXJuZWQgd2l0aCB2YXJpb3VzCi0jIGNvbnZlcnNpb25zLCBhcyBkZXNjcmliZWQgYWJvdmUuICBTZWUgYWxzbyB0aGUgUkVBRE1FIGZpbGUuCi0KLWluZm86Ci0JY2QgJChJTkZPRElSKSAmJiAkKE1BS0UpIEVNQUNTPSQoRU1BQ1MpIFdIQVRTTkVXPSQoV0hBVFNORVcpCi0KLSMgVGFyZ2V0cyB0byBjb252ZXJ0IHRoZSBtYW51YWxzIHRvIEhUTUwgdXNpbmcgTmlrb3MgRHJha29zJyBMYVRlWCB0bwotIyBIVE1MIGNvbnZlcnRlci4gIEZvciBtb3JlIGluZm8gb24gdGhpcyBwcm9ncmFtLCBzZWUKLSMgPFVSTDpodHRwOi8vY2JsLmxlZWRzLmFjLnVrL25pa29zL3RleDJodG1sL2RvYy9sYXRleDJodG1sL2xhdGV4Mmh0bWwuaHRtbD4uCi0KLSMgTm90ZSB0aGF0IExhVGVYMkhUTUwgaW5zZXJ0cyByZWZlcmVuY2VzIHRvIGFuIGljb25zIGRpcmVjdG9yeSBpbgotIyBlYWNoIHBhZ2UgdGhhdCBpdCBnZW5lcmF0ZXMuICBJIGhhdmUgcGxhY2VkIGEgY29weSBvZiB0aGlzIGRpcmVjdG9yeQotIyBpbiB0aGUgZGlzdHJpYnV0aW9uIHRvIHNpbXBsaWZ5IHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGEKLSMgc2VsZi1jb250YWluZWQgSFRNTCBkaXN0cmlidXRpb247IGZvciB0aGlzIHB1cnBvc2UgSSBoYXZlIGFsc28gYWRkZWQKLSMgYSAodHJpdmlhbCkgaW5kZXguaHRtbC4gIENoYW5nZSB0aGUgZGVmaW5pdGlvbiBvZiAkSUNPTlNFUlZFUiBpbgotIyBwZXJsL2wyaGluaXQucGVybCB0byB1c2UgYSBkaWZmZXJlbnQgbG9jYXRpb24gZm9yIHRoZSBpY29ucyBkaXJlY3RvcnkuCi0KLSMgSWYgeW91IGhhdmUgdGhlIHN0YW5kYXJkIExhVGVYMkhUTUwgaWNvbnMgaW5zdGFsbGVkLCB0aGUgdmVyc2lvbnMgc2hpcHBlZAotIyB3aXRoIHRoaXMgZG9jdW1lbnRhdGlvbiBzaG91bGQgYmUgc3RvcmVkIGluIGEgc2VwYXJhdGUgZGlyZWN0b3J5IGFuZCB1c2VkCi0jIGluc3RlYWQuICBUaGUgc3RhbmRhcmQgc2V0IGRvZXMgKm5vdCogaW5jbHVkZSBhbGwgdGhlIGljb25zIHVzZWQgaW4gdGhlCi0jIFB5dGhvbiBkb2N1bWVudGF0aW9uLgotCi0kKEFMTENTU0ZJTEVTKTogaHRtbC9zdHlsZS5jc3MKLQljcCAkPCAkQAotCi0kKElOREVYRklMRVMpOiAkKENPTU1PTlBFUkwpIGh0bWwvc3RkYWJvdXQuZGF0IHRvb2xzL25vZGUybGFiZWwucGwKLQotaHRtbC9hY2tzLmh0bWw6IEFDS1MgJChUT09MU0RJUikvc3VwcG9ydC5weSAkKFRPT0xTRElSKS9ta2Fja3NodG1sCi0JJChQWVRIT04pICQoVE9PTFNESVIpL21rYWNrc2h0bWwgLS1hZGRyZXNzICQoUFlUSE9ORE9DUykgXAotCQktLWZhdmljb24gaWNvbnMvcHlmYXYucG5nIFwKLQkJLS1vdXRwdXQgaHRtbC9hY2tzLmh0bWwgPEFDS1MKLQotCi0jIGh0bWwvaW5kZXguaHRtbCBpcyBkZXBlbmRlbnQgb24gJChJTkRFWEZJTEVTKSBzaW5jZSB3ZSB3YW50IHRoZSBkYXRlCi0jIG9uIHRoZSBmcm9udCBpbmRleCB0byBiZSB1cGRhdGVkIHdoZW5ldmVyIGFueSBvZiB0aGUgY2hpbGQgZG9jdW1lbnRzCi0jIGFyZSB1cGRhdGVkIGFuZCBib2lsZXJwbGF0ZS50ZXggdXNlcyBcdG9kYXkgYXMgdGhlIGRhdGUuICBUaGUgaW5kZXgKLSMgZmlsZXMgYXJlIG5vdCB1c2VkIHRvIGFjdHVhbGx5IGdlbmVyYXRlIGNvbnRlbnQuCi0KLUJPSUxFUlBMQVRFPWNvbW1vbnRleC9ib2lsZXJwbGF0ZS50ZXgKLWh0bWwvaW5kZXguaHRtbDogJChJTkRFWEZJTEVTKQotaHRtbC9pbmRleC5odG1sOiBodG1sL2luZGV4Lmh0bWwuaW4gJChCT0lMRVJQTEFURSkgdG9vbHMvcmV3cml0ZS5weQotCSQoUFlUSE9OKSB0b29scy9yZXdyaXRlLnB5ICQoQk9JTEVSUExBVEUpIFwKLQkJUkVMRUFTRT0kKFJFTEVBU0UpIFdIQVRTTkVXPSQoV0hBVFNORVcpIFwKLQkJPCQ8ID4kQAotCi1odG1sL21vZGluZGV4Lmh0bWw6ICQoVE9PTFNESVIpL3N1cHBvcnQucHkgJChUT09MU0RJUikvbWttb2RpbmRleAotaHRtbC9tb2RpbmRleC5odG1sOiBodG1sL2Rpc3QvZGlzdC5odG1sCi1odG1sL21vZGluZGV4Lmh0bWw6IGh0bWwvbGliL2xpYi5odG1sIGh0bWwvbWFjL21hYy5odG1sCi0JY2QgaHRtbCAmJiBcCi0JICQoUFlUSE9OKSAuLi8kKFRPT0xTRElSKS9ta21vZGluZGV4IC0tY29sdW1ucyAzIFwKLQkJLS1vdXRwdXQgbW9kaW5kZXguaHRtbCAtLWFkZHJlc3MgJChQWVRIT05ET0NTKSBcCi0JCS0tZmF2aWNvbiBpY29ucy9weWZhdi5wbmcgXAotCQlkaXN0L21vZGluZGV4Lmh0bWwgXAotCQlsaWIvbW9kaW5kZXguaHRtbCBtYWMvbW9kaW5kZXguaHRtbAotCi1odG1sOgkkKEFMTEhUTUxGSUxFUykgJChIVE1MQ1NTRklMRVMpCi0KLWFwaTogaHRtbC9hcGkvYXBpLmh0bWwgaHRtbC9hcGkvYXBpLmNzcwotaHRtbC9hcGkvYXBpLmh0bWw6ICQoQVBJRklMRVMpIGFwaS9yZWZjb3VudHMuZGF0Ci0JJChNS0hUTUwpIC0tZGlyIGh0bWwvYXBpIGFwaS9hcGkudGV4Ci0KLWRvYzogaHRtbC9kb2MvZG9jLmh0bWwgaHRtbC9kb2MvZG9jLmNzcwotaHRtbC9kb2MvZG9jLmh0bWw6ICQoRE9DRklMRVMpCi0JJChNS0hUTUwpIC0tZGlyIGh0bWwvZG9jIGRvYy9kb2MudGV4Ci0KLWV4dDogaHRtbC9leHQvZXh0Lmh0bWwgaHRtbC9leHQvZXh0LmNzcwotaHRtbC9leHQvZXh0Lmh0bWw6ICQoRVhURklMRVMpCi0JJChNS0hUTUwpIC0tZGlyIGh0bWwvZXh0IGV4dC9leHQudGV4Ci0KLWxpYjogaHRtbC9saWIvbGliLmh0bWwgaHRtbC9saWIvbGliLmNzcwotaHRtbC9saWIvbGliLmh0bWw6ICQoTElCRklMRVMpCi0JJChNS0hUTUwpIC0tZGlyIGh0bWwvbGliIGxpYi9saWIudGV4Ci0KLW1hYzogaHRtbC9tYWMvbWFjLmh0bWwgaHRtbC9tYWMvbWFjLmNzcwotaHRtbC9tYWMvbWFjLmh0bWw6ICQoTUFDRklMRVMpCi0JJChNS0hUTUwpIC0tZGlyIGh0bWwvbWFjIG1hYy9tYWMudGV4Ci0KLXJlZjogaHRtbC9yZWYvcmVmLmh0bWwgaHRtbC9yZWYvcmVmLmNzcwotaHRtbC9yZWYvcmVmLmh0bWw6ICQoUkVGRklMRVMpCi0JJChNS0hUTUwpIC0tZGlyIGh0bWwvcmVmIHJlZi9yZWYudGV4Ci0KLXR1dDogaHRtbC90dXQvdHV0Lmh0bWwgaHRtbC90dXQvdHV0LmNzcwotaHRtbC90dXQvdHV0Lmh0bWw6ICQoVFVURklMRVMpCi0JJChNS0hUTUwpIC0tZGlyIGh0bWwvdHV0IC0tbnVtZXJpYyAtLXNwbGl0IDMgdHV0L3R1dC50ZXgKLQotaW5zdDogaHRtbC9pbnN0L2luc3QuaHRtbCBodG1sL2luc3QvaW5zdC5jc3MKLWh0bWwvaW5zdC9pbnN0Lmh0bWw6ICQoSU5TVEZJTEVTKSBwZXJsL2Rpc3R1dGlscy5wZXJsCi0JJChNS0hUTUwpIC0tZGlyIGh0bWwvaW5zdCAtLXNwbGl0IDQgaW5zdC9pbnN0LnRleAotCi1kaXN0OiBodG1sL2Rpc3QvZGlzdC5odG1sIGh0bWwvZGlzdC9kaXN0LmNzcwotaHRtbC9kaXN0L2Rpc3QuaHRtbDogJChESVNURklMRVMpIHBlcmwvZGlzdHV0aWxzLnBlcmwKLQkkKE1LSFRNTCkgLS1kaXIgaHRtbC9kaXN0IC0tc3BsaXQgNCBkaXN0L2Rpc3QudGV4Ci0KLXdoYXRzbmV3OiBodG1sL3doYXRzbmV3LyQoV0hBVFNORVcpLmh0bWwKLWh0bWwvd2hhdHNuZXcvJChXSEFUU05FVykuaHRtbDogd2hhdHNuZXcvJChXSEFUU05FVykudGV4Ci0JJChNS0hUTUwpIC0tZGlyIGh0bWwvd2hhdHNuZXcgLS1zcGxpdCA0IHdoYXRzbmV3LyQoV0hBVFNORVcpLnRleAotCi0KLSMgVGhlIGlTaWxvIGZvcm1hdCBpcyB1c2VkIGJ5IHRoZSBpU2lsbyBkb2N1bWVudCByZWFkZXIgZm9yIFBhbG1PUyBkZXZpY2VzLgotCi1JU0lMT0lOREVYRklMRVM9aXNpbG8vYXBpL2FwaS5odG1sIFwKLQlpc2lsby9kb2MvZG9jLmh0bWwgXAotCWlzaWxvL2V4dC9leHQuaHRtbCBcCi0JaXNpbG8vbGliL2xpYi5odG1sIFwKLQlpc2lsby9tYWMvbWFjLmh0bWwgXAotCWlzaWxvL3JlZi9yZWYuaHRtbCBcCi0JaXNpbG8vdHV0L3R1dC5odG1sIFwKLQlpc2lsby9pbnN0L2luc3QuaHRtbCBcCi0JaXNpbG8vZGlzdC9kaXN0Lmh0bWwgXAotCWlzaWxvL3doYXRzbmV3LyQoV0hBVFNORVcpLmh0bWwKLQotJChJU0lMT0lOREVYRklMRVMpOiAkKENPTU1PTlBFUkwpIGh0bWwvc3RkYWJvdXQuZGF0IHBlcmwvaXNpbG8ucGVybAotCi1pc2lsbzoJaXNpbG8vcHl0aG9uLWFwaS5wZGIgXAotCWlzaWxvL3B5dGhvbi1kb2MucGRiIFwKLQlpc2lsby9weXRob24tZXh0LnBkYiBcCi0JaXNpbG8vcHl0aG9uLWxpYi5wZGIgXAotCWlzaWxvL3B5dGhvbi1tYWMucGRiIFwKLQlpc2lsby9weXRob24tcmVmLnBkYiBcCi0JaXNpbG8vcHl0aG9uLXR1dC5wZGIgXAotCWlzaWxvL3B5dGhvbi1kaXN0LnBkYiBcCi0JaXNpbG8vcHl0aG9uLWluc3QucGRiIFwKLQlpc2lsby9weXRob24td2hhdHNuZXcucGRiCi0KLWlzaWxvL3B5dGhvbi1hcGkucGRiOiBpc2lsby9hcGkvYXBpLmh0bWwgaXNpbG8vYXBpL2FwaS5jc3MKLQkkKE1LSVNJTE8pICItaVB5dGhvbi9DIEFQSSBSZWZlcmVuY2UgTWFudWFsIiBcCi0JCWlzaWxvL2FwaS9hcGkuaHRtbCAkQAotCi1pc2lsby9weXRob24tZG9jLnBkYjogaXNpbG8vZG9jL2RvYy5odG1sIGlzaWxvL2RvYy9kb2MuY3NzCi0JJChNS0lTSUxPKSAiLWlEb2N1bWVudGluZyBQeXRob24iIFwKLQkJaXNpbG8vZG9jL2RvYy5odG1sICRACi0KLWlzaWxvL3B5dGhvbi1leHQucGRiOiBpc2lsby9leHQvZXh0Lmh0bWwgaXNpbG8vZXh0L2V4dC5jc3MKLQkkKE1LSVNJTE8pICItaUV4dGVuZGluZyAmIEVtYmVkZGluZyBQeXRob24iIFwKLQkJaXNpbG8vZXh0L2V4dC5odG1sICRACi0KLWlzaWxvL3B5dGhvbi1saWIucGRiOiBpc2lsby9saWIvbGliLmh0bWwgaXNpbG8vbGliL2xpYi5jc3MKLQkkKE1LSVNJTE8pICItaVB5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZSIgXAotCQlpc2lsby9saWIvbGliLmh0bWwgJEAKLQotaXNpbG8vcHl0aG9uLW1hYy5wZGI6IGlzaWxvL21hYy9tYWMuaHRtbCBpc2lsby9tYWMvbWFjLmNzcwotCSQoTUtJU0lMTykgIi1pUHl0aG9uL0MgQVBJIFJlZmVyZW5jZSBNYW51YWwiIFwKLQkJaXNpbG8vbWFjL21hYy5odG1sICRACi0KLWlzaWxvL3B5dGhvbi1yZWYucGRiOiBpc2lsby9yZWYvcmVmLmh0bWwgaXNpbG8vcmVmL3JlZi5jc3MKLQkkKE1LSVNJTE8pICItaVB5dGhvbiBSZWZlcmVuY2UgTWFudWFsIiBcCi0JCWlzaWxvL3JlZi9yZWYuaHRtbCAkQAotCi1pc2lsby9weXRob24tdHV0LnBkYjogaXNpbG8vdHV0L3R1dC5odG1sIGlzaWxvL3R1dC90dXQuY3NzCi0JJChNS0lTSUxPKSAiLWlQeXRob24gVHV0b3JpYWwiIFwKLQkJaXNpbG8vdHV0L3R1dC5odG1sICRACi0KLWlzaWxvL3B5dGhvbi1kaXN0LnBkYjogaXNpbG8vZGlzdC9kaXN0Lmh0bWwgaXNpbG8vZGlzdC9kaXN0LmNzcwotCSQoTUtJU0lMTykgIi1pRGlzdHJpYnV0aW5nIFB5dGhvbiBNb2R1bGVzIiBcCi0JCWlzaWxvL2Rpc3QvZGlzdC5odG1sICRACi0KLWlzaWxvL3B5dGhvbi1pbnN0LnBkYjogaXNpbG8vaW5zdC9pbnN0Lmh0bWwgaXNpbG8vaW5zdC9pbnN0LmNzcwotCSQoTUtJU0lMTykgIi1pSW5zdGFsbGluZyBQeXRob24gTW9kdWxlcyIgXAotCQlpc2lsby9pbnN0L2luc3QuaHRtbCAkQAotCi1pc2lsby9weXRob24td2hhdHNuZXcucGRiOiBpc2lsby93aGF0c25ldy8kKFdIQVRTTkVXKS5odG1sIGlzaWxvL3doYXRzbmV3LyQoV0hBVFNORVcpLmNzcwotCSQoTUtJU0lMTykgIi1pV2hhdCdzIE5ldyBpbiBQeXRob24gWC5ZIiBcCi0JCWlzaWxvL3doYXRzbmV3LyQoV0hBVFNORVcpLmh0bWwgJEAKLQotaXNpbG8vYXBpL2FwaS5odG1sOiAkKEFQSUZJTEVTKSBhcGkvcmVmY291bnRzLmRhdAotCSQoTUtJU0lMT0hUTUwpIC0tZGlyIGlzaWxvL2FwaSBhcGkvYXBpLnRleAotCi1pc2lsby9kb2MvZG9jLmh0bWw6ICQoRE9DRklMRVMpCi0JJChNS0lTSUxPSFRNTCkgLS1kaXIgaXNpbG8vZG9jIGRvYy9kb2MudGV4Ci0KLWlzaWxvL2V4dC9leHQuaHRtbDogJChFWFRGSUxFUykKLQkkKE1LSVNJTE9IVE1MKSAtLWRpciBpc2lsby9leHQgZXh0L2V4dC50ZXgKLQotaXNpbG8vbGliL2xpYi5odG1sOiAkKExJQkZJTEVTKQotCSQoTUtJU0lMT0hUTUwpIC0tZGlyIGlzaWxvL2xpYiBsaWIvbGliLnRleAotCi1pc2lsby9tYWMvbWFjLmh0bWw6ICQoTUFDRklMRVMpCi0JJChNS0lTSUxPSFRNTCkgLS1kaXIgaXNpbG8vbWFjIG1hYy9tYWMudGV4Ci0KLWlzaWxvL3JlZi9yZWYuaHRtbDogJChSRUZGSUxFUykKLQkkKE1LSVNJTE9IVE1MKSAtLWRpciBpc2lsby9yZWYgcmVmL3JlZi50ZXgKLQotaXNpbG8vdHV0L3R1dC5odG1sOiAkKFRVVEZJTEVTKQotCSQoTUtJU0lMT0hUTUwpIC0tZGlyIGlzaWxvL3R1dCB0dXQvdHV0LnRleAotCi1pc2lsby9pbnN0L2luc3QuaHRtbDogJChJTlNURklMRVMpIHBlcmwvZGlzdHV0aWxzLnBlcmwKLQkkKE1LSVNJTE9IVE1MKSAtLWRpciBpc2lsby9pbnN0IGluc3QvaW5zdC50ZXgKLQotaXNpbG8vZGlzdC9kaXN0Lmh0bWw6ICQoRElTVEZJTEVTKSBwZXJsL2Rpc3R1dGlscy5wZXJsCi0JJChNS0lTSUxPSFRNTCkgLS1kaXIgaXNpbG8vZGlzdCBkaXN0L2Rpc3QudGV4Ci0KLWlzaWxvL3doYXRzbmV3LyQoV0hBVFNORVcpLmh0bWw6IHdoYXRzbmV3LyQoV0hBVFNORVcpLnRleAotCSQoTUtJU0lMT0hUTUwpIC0tZGlyIGlzaWxvL3doYXRzbmV3IHdoYXRzbmV3LyQoV0hBVFNORVcpLnRleAotCi0jIFRoZXNlIGFyZSB1c2VmdWwgaWYgeW91IG5lZWQgdG8gdHJhbnNwb3J0IHRoZSBpU2lsby1yZWFkeSBIVE1MIHRvCi0jIGFub3RoZXIgbWFjaGluZSB0byBwZXJmb3JtIHRoZSBjb252ZXJzaW9uOgotCi1pc2lsb3ppcDogIGlzaWxvLWh0bWwtJChSRUxFQVNFKS56aXAKLQotaXNpbG8taHRtbC0kKFJFTEVBU0UpLnppcDoJJChJU0lMT0lOREVYRklMRVMpCi0Jcm0gLWYgJEAKLQljZCBpc2lsbyAmJiBcCi0JCXppcCAtcSAtOSAuLi8kQCAqLyouY3NzICovKi5odG1sICovKi50eHQKLQotCi0jIHdlYmNoZWNrZXIgbmVlZHMgYW4gZXh0cmEgZmxhZyB0byBwcm9jZXNzIHRoZSBodWdlIGluZGV4IGZyb20gdGhlIGxpYnJlZgotV0VCQ0hFQ0tFUj0kKFBZVEhPTikgLi4vVG9vbHMvd2ViY2hlY2tlci93ZWJjaGVja2VyLnB5Ci1IVE1MQkFTRT0gIGZpbGU6YHB3ZGAvaHRtbAotCi13ZWJjaGVjazogJChBTExIVE1MRklMRVMpCi0JJChXRUJDSEVDS0VSKSAkKEhUTUxCQVNFKS9hcGkvCi0JJChXRUJDSEVDS0VSKSAkKEhUTUxCQVNFKS9kb2MvCi0JJChXRUJDSEVDS0VSKSAkKEhUTUxCQVNFKS9leHQvCi0JJChXRUJDSEVDS0VSKSAtbTI5MDAwMCAkKEhUTUxCQVNFKS9saWIvCi0JJChXRUJDSEVDS0VSKSAkKEhUTUxCQVNFKS9tYWMvCi0JJChXRUJDSEVDS0VSKSAkKEhUTUxCQVNFKS9yZWYvCi0JJChXRUJDSEVDS0VSKSAkKEhUTUxCQVNFKS90dXQvCi0JJChXRUJDSEVDS0VSKSAkKEhUTUxCQVNFKS9kaXN0LwotCSQoV0VCQ0hFQ0tFUikgJChIVE1MQkFTRSkvaW5zdC8KLQkkKFdFQkNIRUNLRVIpICQoSFRNTEJBU0UpL3doYXRzbmV3LwotCi1mYXN0d2ViY2hlY2s6ICQoQUxMSFRNTEZJTEVTKQotCSQoV0VCQ0hFQ0tFUikgLXggJChIVE1MQkFTRSkvYXBpLwotCSQoV0VCQ0hFQ0tFUikgLXggJChIVE1MQkFTRSkvZG9jLwotCSQoV0VCQ0hFQ0tFUikgLXggJChIVE1MQkFTRSkvZXh0LwotCSQoV0VCQ0hFQ0tFUikgLXggLW0yOTAwMDAgJChIVE1MQkFTRSkvbGliLwotCSQoV0VCQ0hFQ0tFUikgLXggJChIVE1MQkFTRSkvbWFjLwotCSQoV0VCQ0hFQ0tFUikgLXggJChIVE1MQkFTRSkvcmVmLwotCSQoV0VCQ0hFQ0tFUikgLXggJChIVE1MQkFTRSkvdHV0LwotCSQoV0VCQ0hFQ0tFUikgLXggJChIVE1MQkFTRSkvZGlzdC8KLQkkKFdFQkNIRUNLRVIpIC14ICQoSFRNTEJBU0UpL2luc3QvCi0JJChXRUJDSEVDS0VSKSAteCAkKEhUTUxCQVNFKS93aGF0c25ldy8KLQotCi0jIFJlbGVhc2UgcGFja2FnaW5nIHRhcmdldHM6Ci0KLXBhcGVyLSQoUEFQRVIpL1JFQURNRTogJChQU0ZJTEVTKSAkKFRPT0xTRElSKS9nZXRwYWdlY291bnRzCi0JY2QgcGFwZXItJChQQVBFUikgJiYgLi4vJChUT09MU0RJUikvZ2V0cGFnZWNvdW50cyAtciAkKFJFTEVBU0UpID4uLi8kQAotCi1pbmZvLSQoUkVMRUFTRSkudGd6OiBpbmZvCi0JY2QgJChJTkZPRElSKSAmJiB0YXIgY2YgLSBSRUFETUUgcHl0aG9uLmRpciBweXRob24tKi5pbmZvKiBcCi0JCXwgZ3ppcCAtOSA+Li4vJEAKLQotaW5mby0kKFJFTEVBU0UpLnRhci5iejI6IGluZm8KLQljZCAkKElORk9ESVIpICYmIHRhciBjZiAtIFJFQURNRSBweXRob24uZGlyIHB5dGhvbi0qLmluZm8qIFwKLQkJfCBiemlwMiAtOSA+Li4vJEAKLQotbGF0ZXgtJChSRUxFQVNFKS50Z3o6Ci0JJChQWVRIT04pICQoVE9PTFNESVIpL21rc291cmNlcGtnIC0tZ3ppcCAkKFJFTEVBU0UpCi0KLWxhdGV4LSQoUkVMRUFTRSkudGFyLmJ6MjoKLQkkKFBZVEhPTikgJChUT09MU0RJUikvbWtzb3VyY2Vwa2cgLS1iemlwMiAkKFJFTEVBU0UpCi0KLWxhdGV4LSQoUkVMRUFTRSkuemlwOgotCXJtIC1mICRACi0JJChQWVRIT04pICQoVE9PTFNESVIpL21rc291cmNlcGtnIC0temlwICQoUkVMRUFTRSkKLQotcGRmLSQoUEFQRVIpLSQoUkVMRUFTRSkudGFyOiAkKFBERkZJTEVTKQotCXJtIC1mICRACi0JbWtkaXIgUHl0aG9uLURvY3MtJChSRUxFQVNFKQotCWNwIHBhcGVyLSQoUEFQRVIpLyoucGRmIFB5dGhvbi1Eb2NzLSQoUkVMRUFTRSkKLQl0YXIgY2YgJEAgUHl0aG9uLURvY3MtJChSRUxFQVNFKQotCXJtIC1yIFB5dGhvbi1Eb2NzLSQoUkVMRUFTRSkKLQotcGRmLSQoUEFQRVIpLSQoUkVMRUFTRSkudGd6OiBwZGYtJChQQVBFUiktJChSRUxFQVNFKS50YXIKLQlnemlwIC05IDwkPyA+JEAKLQotcGRmLSQoUEFQRVIpLSQoUkVMRUFTRSkudGFyLmJ6MjogcGRmLSQoUEFQRVIpLSQoUkVMRUFTRSkudGFyCi0JYnppcDIgLTkgPCQ/ID4kQAotCi1wZGYtJChQQVBFUiktJChSRUxFQVNFKS56aXA6IHBkZgotCXJtIC1mICRACi0JbWtkaXIgUHl0aG9uLURvY3MtJChSRUxFQVNFKQotCWNwIHBhcGVyLSQoUEFQRVIpLyoucGRmIFB5dGhvbi1Eb2NzLSQoUkVMRUFTRSkKLQl6aXAgLXEgLXIgLTkgJEAgUHl0aG9uLURvY3MtJChSRUxFQVNFKQotCXJtIC1yIFB5dGhvbi1Eb2NzLSQoUkVMRUFTRSkKLQotcG9zdHNjcmlwdC0kKFBBUEVSKS0kKFJFTEVBU0UpLnRhcjogJChQU0ZJTEVTKSBwYXBlci0kKFBBUEVSKS9SRUFETUUKLQlybSAtZiAkQAotCW1rZGlyIFB5dGhvbi1Eb2NzLSQoUkVMRUFTRSkKLQljcCBwYXBlci0kKFBBUEVSKS8qLnBzIFB5dGhvbi1Eb2NzLSQoUkVMRUFTRSkKLQljcCBwYXBlci0kKFBBUEVSKS9SRUFETUUgUHl0aG9uLURvY3MtJChSRUxFQVNFKQotCXRhciBjZiAkQCBQeXRob24tRG9jcy0kKFJFTEVBU0UpCi0Jcm0gLXIgUHl0aG9uLURvY3MtJChSRUxFQVNFKQotCi1wb3N0c2NyaXB0LSQoUEFQRVIpLSQoUkVMRUFTRSkudGFyLmJ6MjogcG9zdHNjcmlwdC0kKFBBUEVSKS0kKFJFTEVBU0UpLnRhcgotCWJ6aXAyIC05IDwkPCA+JEAKLQotcG9zdHNjcmlwdC0kKFBBUEVSKS0kKFJFTEVBU0UpLnRnejogcG9zdHNjcmlwdC0kKFBBUEVSKS0kKFJFTEVBU0UpLnRhcgotCWd6aXAgLTkgPCQ8ID4kQAotCi1wb3N0c2NyaXB0LSQoUEFQRVIpLSQoUkVMRUFTRSkuemlwOiAkKFBTRklMRVMpIHBhcGVyLSQoUEFQRVIpL1JFQURNRQotCXJtIC1mICRACi0JbWtkaXIgUHl0aG9uLURvY3MtJChSRUxFQVNFKQotCWNwIHBhcGVyLSQoUEFQRVIpLyoucHMgUHl0aG9uLURvY3MtJChSRUxFQVNFKQotCWNwIHBhcGVyLSQoUEFQRVIpL1JFQURNRSBQeXRob24tRG9jcy0kKFJFTEVBU0UpCi0JemlwIC1xIC1yIC05ICRAIFB5dGhvbi1Eb2NzLSQoUkVMRUFTRSkKLQlybSAtciBQeXRob24tRG9jcy0kKFJFTEVBU0UpCi0KLUhUTUxQS0dGSUxFUz0qLmh0bWwgKi8qLmNzcyAqLyouaHRtbCAqLyouZ2lmICovKi5wbmcgKi8qLnR4dAotCi1odG1sLSQoUkVMRUFTRSkudGFyOgkkKEFMTEhUTUxGSUxFUykgJChIVE1MQ1NTRklMRVMpCi0JbWtkaXIgUHl0aG9uLURvY3MtJChSRUxFQVNFKQotCS1maW5kIGh0bWwgLW5hbWUgJyouZ2lmJyAtc2l6ZSAwIHwgeGFyZ3Mgcm0gLWYKLQljZCBodG1sICYmIHRhciBjZiAuLi90ZW1wLnRhciAkKEhUTUxQS0dGSUxFUykKLQljZCBQeXRob24tRG9jcy0kKFJFTEVBU0UpICYmIHRhciB4ZiAuLi90ZW1wLnRhcgotCXJtIHRlbXAudGFyCi0JdGFyIGNmIGh0bWwtJChSRUxFQVNFKS50YXIgUHl0aG9uLURvY3MtJChSRUxFQVNFKQotCXJtIC1yIFB5dGhvbi1Eb2NzLSQoUkVMRUFTRSkKLQotaHRtbC0kKFJFTEVBU0UpLnRnejoJaHRtbC0kKFJFTEVBU0UpLnRhcgotCWd6aXAgLTkgPCQ/ID4kQAotCi1odG1sLSQoUkVMRUFTRSkudGFyLmJ6MjogaHRtbC0kKFJFTEVBU0UpLnRhcgotCWJ6aXAyIC05IDwkPyA+JEAKLQotaHRtbC0kKFJFTEVBU0UpLnppcDoJJChBTExIVE1MRklMRVMpICQoSFRNTENTU0ZJTEVTKQotCXJtIC1mICRACi0JbWtkaXIgUHl0aG9uLURvY3MtJChSRUxFQVNFKQotCWNkIGh0bWwgJiYgdGFyIGNmIC4uL3RlbXAudGFyICQoSFRNTFBLR0ZJTEVTKQotCWNkIFB5dGhvbi1Eb2NzLSQoUkVMRUFTRSkgJiYgdGFyIHhmIC4uL3RlbXAudGFyCi0Jcm0gdGVtcC50YXIKLQl6aXAgLXEgLXIgLTkgJEAgUHl0aG9uLURvY3MtJChSRUxFQVNFKQotCXJtIC1yIFB5dGhvbi1Eb2NzLSQoUkVMRUFTRSkKLQotaXNpbG8tJChSRUxFQVNFKS56aXA6CWlzaWxvCi0Jcm0gLWYgJEAKLQlta2RpciBQeXRob24tRG9jcy0kKFJFTEVBU0UpCi0JY3AgaXNpbG8vcHl0aG9uLSoucGRiIFB5dGhvbi1Eb2NzLSQoUkVMRUFTRSkKLQl6aXAgLXEgLXIgLTkgJEAgUHl0aG9uLURvY3MtJChSRUxFQVNFKQotCXJtIC1yIFB5dGhvbi1Eb2NzLSQoUkVMRUFTRSkKLQotCi0jIGNvbnZlbmllbmNlIHRhcmdldHM6Ci0KLXRhcmh0bWw6CWh0bWwtJChSRUxFQVNFKS50Z3oKLXRhcmluZm86CWluZm8tJChSRUxFQVNFKS50Z3oKLXRhcnBzOgkJcG9zdHNjcmlwdC0kKFBBUEVSKS0kKFJFTEVBU0UpLnRnegotdGFycGRmOgkJcGRmLSQoUEFQRVIpLSQoUkVMRUFTRSkudGd6Ci10YXJsYXRleDoJbGF0ZXgtJChSRUxFQVNFKS50Z3oKLQotdGFyYmFsbHM6CXRhcnBkZiB0YXJwcyB0YXJodG1sCi0KLXppcGh0bWw6CWh0bWwtJChSRUxFQVNFKS56aXAKLXppcHBzOgkJcG9zdHNjcmlwdC0kKFBBUEVSKS0kKFJFTEVBU0UpLnppcAotemlwcGRmOgkJcGRmLSQoUEFQRVIpLSQoUkVMRUFTRSkuemlwCi16aXBsYXRleDoJbGF0ZXgtJChSRUxFQVNFKS56aXAKLXppcGlzaWxvOglpc2lsby0kKFJFTEVBU0UpLnppcAotCi16aXBzOgkJemlwcGRmIHppcHBzIHppcGh0bWwKLQotYnppcGh0bWw6CWh0bWwtJChSRUxFQVNFKS50YXIuYnoyCi1iemlwaW5mbzoJaW5mby0kKFJFTEVBU0UpLnRhci5iejIKLWJ6aXBwczoJCXBvc3RzY3JpcHQtJChQQVBFUiktJChSRUxFQVNFKS50YXIuYnoyCi1iemlwcGRmOglwZGYtJChQQVBFUiktJChSRUxFQVNFKS50YXIuYnoyCi1iemlwbGF0ZXg6CWxhdGV4LSQoUkVMRUFTRSkudGFyLmJ6MgotCi1iemlwczoJCWJ6aXBwZGYgYnppcHBzIGJ6aXBodG1sCi0KLWRpc3RodG1sOgliemlwaHRtbCB6aXBodG1sCi1kaXN0aW5mbzoJYnppcGluZm8KLWRpc3RwczoJCWJ6aXBwcyB6aXBwcwotZGlzdHBkZjoJYnppcHBkZiB6aXBwZGYKLWRpc3RsYXRleDoJYnppcGxhdGV4IHppcGxhdGV4Ci0KLSMgV2UgdXNlIHRoZSAicGtnbGlzdCIgdGFyZ2V0IGF0IHRoZSBlbmQgb2YgdGhlc2UgdG8gZW5zdXJlIHRoZQotIyBwYWNrYWdlIGxpc3QgaXMgdXBkYXRlZCBhZnRlciBidWlsZGluZyBlaXRoZXIgb2YgdGhlc2U7IHRoaXMgc2VlbXMgYQotIyByZWFzb25hYmxlIGNvbXByb21pc2UgYmV0d2VlbiBvbmx5IGJ1aWxkaW5nIGl0IGZvciBkaXN0ZmlsZXMgb3IKLSMgaGF2aW5nIHRvIGJ1aWxkIGl0IG1hbnVhbGx5LiAgRG9pbmcgaXQgaGVyZSBhbGxvd3MgdGhlIHBhY2thZ2VzIGZvcgotIyBkaXN0cmlidXRpb24gdG8gYmUgYnVpbHQgdXNpbmcgZWl0aGVyIG9mCi0jICAgICBtYWtlIGRpc3RmaWxlcyAmJiBtYWtlIFBBUEVSPWE0IHBhcGVyZGlzdAotIyAgICAgbWFrZSBwYXBlcmRpc3QgJiYgbWFrZSBQQVBFUj1hNCBkaXN0ZmlsZXMKLSMgVGhlIHNtYWxsIGFtb3VudCBvZiBhZGRpdGlvbmFsIHdvcmsgaXMgYSBzbWFsbCBwcmljZSB0byBwYXkgZm9yIG5vdAotIyBoYXZpbmcgdG8gcmVtZW1iZXIgd2hpY2ggb3JkZXIgdG8gZG8gaXQgaW4uIDspCi1wYXBlcmRpc3Q6CWRpc3RwZGYgZGlzdHBzIHBrZ2xpc3QKLWVkaXN0OgkJZGlzdGh0bWwgcGtnbGlzdAotCi0jIFRoZSBwa2dsaXN0Lmh0bWwgZmlsZSBpcyB1c2VkIGFzIHBhcnQgb2YgdGhlIGRvd25sb2FkLmh0bWwgcGFnZSBvbgotIyBweXRob24ub3JnOyBpdCBpcyBub3QgdXNlZCBhcyBpbnRlcm1lZGlhdGUgaW5wdXQgaGVyZSBvciBhcyBwYXJ0IG9mCi0jIHRoZSBwYWNrYWdlcyBjcmVhdGVkLgotcGtnbGlzdDoKLQkkKFRPT0xTRElSKS9ta3BrZ2xpc3QgPnBrZ2xpc3QuaHRtbAotCi1kaXN0ZmlsZXM6CXBhcGVyZGlzdCBlZGlzdAotCSQoVE9PTFNESVIpL21rc291cmNlcGtnIC0tYnppcDIgLS16aXAgJChSRUxFQVNFKQotCSQoVE9PTFNESVIpL21rcGtnbGlzdCA+cGtnbGlzdC5odG1sCi0KLQotIyBIb3VzZWtlZXBpbmcgdGFyZ2V0cwotCi0jIFJlbW92ZSB0ZW1wb3JhcnkgZmlsZXM7IGFsbCBleGNlcHQgdGhlIGZvbGxvd2luZzoKLSMgLSBzb3VyY2VzOiAudGV4LCAuYmliLCAuc3R5LCAqLmNscwotIyAtIHVzZWZ1bCByZXN1bHRzOiAuZHZpLCAucGRmLCAucHMsIC50ZXhpLCAuaW5mbwotY2xlYW46Ci0Jcm0gLWYgaHRtbC0kKFJFTEVBU0UpLnRhcgotCWNkICQoSU5GT0RJUikgJiYgJChNQUtFKSBjbGVhbgotCi0jIFJlbW92ZSB0ZW1wb3JhcmllcyBhcyB3ZWxsIGFzIGZpbmFsIHByb2R1Y3RzCi1jbG9iYmVyOgotCXJtIC1mIGh0bWwtJChSRUxFQVNFKS50YXIKLQlybSAtZiBodG1sLSQoUkVMRUFTRSkudGd6IGluZm8tJChSRUxFQVNFKS50Z3oKLQlybSAtZiBwZGYtJChSRUxFQVNFKS50Z3ogcG9zdHNjcmlwdC0kKFJFTEVBU0UpLnRnegotCXJtIC1mIGxhdGV4LSQoUkVMRUFTRSkudGd6IGh0bWwtJChSRUxFQVNFKS56aXAKLQlybSAtZiBwZGYtJChSRUxFQVNFKS56aXAgcG9zdHNjcmlwdC0kKFJFTEVBU0UpLnppcAotCXJtIC1mICQoRFZJRklMRVMpICQoUFNGSUxFUykgJChQREZGSUxFUykKLQljZCAkKElORk9ESVIpICYmICQoTUFLRSkgY2xvYmJlcgotCXJtIC1mIHBhcGVyLSQoUEFQRVIpLyoudGV4IHBhcGVyLSQoUEFQRVIpLyouaW5kIHBhcGVyLSQoUEFQRVIpLyouaWR4Ci0Jcm0gLWYgcGFwZXItJChQQVBFUikvKi5sMmggcGFwZXItJChQQVBFUikvKi5ob3cgcGFwZXItJChQQVBFUikvUkVBRE1FCi0Jcm0gLXJmIGh0bWwvaW5kZXguaHRtbCBodG1sL21vZGluZGV4Lmh0bWwgaHRtbC9hY2tzLmh0bWwKLQlybSAtcmYgaHRtbC9hcGkvIGh0bWwvZG9jLyBodG1sL2V4dC8gaHRtbC9saWIvIGh0bWwvbWFjLwotCXJtIC1yZiBodG1sL3JlZi8gaHRtbC90dXQvIGh0bWwvaW5zdC8gaHRtbC9kaXN0LwotCXJtIC1yZiBodG1sL3doYXRzbmV3LwotCXJtIC1yZiBpc2lsby9hcGkvIGlzaWxvL2RvYy8gaXNpbG8vZXh0LyBpc2lsby9saWIvIGlzaWxvL21hYy8KLQlybSAtcmYgaXNpbG8vcmVmLyBpc2lsby90dXQvIGlzaWxvL2luc3QvIGlzaWxvL2Rpc3QvCi0Jcm0gLXJmIGlzaWxvL3doYXRzbmV3LwotCXJtIC1mIGlzaWxvL3B5dGhvbi0qLnBkYiBpc2lsby0kKFJFTEVBU0UpLnppcAotCi1yZWFsY2xlYW4gZGlzdGNsZWFuOiAgY2xvYmJlcgpkaWZmIC0tZ2l0IGEvRG9jL01ha2VmaWxlLmRlcHMgYi9Eb2MvTWFrZWZpbGUuZGVwcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRiMDkwYi4uMDAwMDAwMAotLS0gYS9Eb2MvTWFrZWZpbGUuZGVwcworKysgL2Rldi9udWxsCkBAIC0xLDM2MCArMCwwIEBACi0jIExhVGVYIHNvdXJjZSBkZXBlbmRlbmNpZXMuCi0KLUNPTU1PTlNUWUxFUz0gdGV4aW5wdXRzL3B5dGhvbi5zdHkgXAotCXRleGlucHV0cy9weXBhcGVyLnN0eQotCi1JTkRFWFNUWUxFUz10ZXhpbnB1dHMvcHl0aG9uLmlzdAotCi1DT01NT05URVg9Y29tbW9udGV4L2NvcHlyaWdodC50ZXggXAotCWNvbW1vbnRleC9saWNlbnNlLnRleCBcCi0JY29tbW9udGV4L3BhdGNobGV2ZWwudGV4IFwKLQljb21tb250ZXgvYm9pbGVycGxhdGUudGV4Ci0KLU1BTlNUWUxFUz0gdGV4aW5wdXRzL2ZuY3ljaGFwLnN0eSBcCi0JdGV4aW5wdXRzL21hbnVhbC5jbHMgXAotCSQoQ09NTU9OU1RZTEVTKQotCi1IT1dUT1NUWUxFUz0gdGV4aW5wdXRzL2hvd3RvLmNscyBcCi0JJChDT01NT05TVFlMRVMpCi0KLQotQVBJRklMRVM9ICQoTUFOU1RZTEVTKSAkKElOREVYU1RZTEVTKSAkKENPTU1PTlRFWCkgXAotCWFwaS9hcGkudGV4IFwKLQlhcGkvYWJzdHJhY3QudGV4IFwKLQlhcGkvY29uY3JldGUudGV4IFwKLQlhcGkvZXhjZXB0aW9ucy50ZXggXAotCWFwaS9pbml0LnRleCBcCi0JYXBpL2ludHJvLnRleCBcCi0JYXBpL21lbW9yeS50ZXggXAotCWFwaS9uZXd0eXBlcy50ZXggXAotCWFwaS9yZWZjb3VudGluZy50ZXggXAotCWFwaS91dGlsaXRpZXMudGV4IFwKLQlhcGkvdmVyeWhpZ2gudGV4IFwKLQljb21tb250ZXgvdHlwZXN0cnVjdC5oIFwKLQljb21tb250ZXgvcmVwb3J0aW5nYnVncy50ZXgKLQotIyBUaGVzZSBmaWxlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhvc2UgbGlzdGVkIGFib3ZlLCBhbmQgYXJlIHVzZWQgdG8KLSMgZ2VuZXJhdGUgdGhlIHR5cGVzZXQgdmVyc2lvbnMgb2YgdGhlIG1hbnVhbHMuICBUaGUgbGlzdCBpcyBkZWZpbmVkCi0jIGhlcmUgdG8gbWFrZSBpdCBlYXNpZXIgdG8gZW5zdXJlIHBhcmFsbGVsaXNtLgotQU5OT0FQSUZJTEVTPSAkKE1BTlNUWUxFUykgJChJTkRFWFNUWUxFUykgJChDT01NT05URVgpIGFwaS9yZWZjb3VudHMuZGF0IFwKLQlwYXBlci0kKFBBUEVSKS9hcGkudGV4IFwKLQlwYXBlci0kKFBBUEVSKS9hYnN0cmFjdC50ZXggXAotCXBhcGVyLSQoUEFQRVIpL2NvbmNyZXRlLnRleCBcCi0JcGFwZXItJChQQVBFUikvZXhjZXB0aW9ucy50ZXggXAotCXBhcGVyLSQoUEFQRVIpL2luaXQudGV4IFwKLQlwYXBlci0kKFBBUEVSKS9pbnRyby50ZXggXAotCXBhcGVyLSQoUEFQRVIpL21lbW9yeS50ZXggXAotCXBhcGVyLSQoUEFQRVIpL25ld3R5cGVzLnRleCBcCi0JcGFwZXItJChQQVBFUikvcmVmY291bnRpbmcudGV4IFwKLQlwYXBlci0kKFBBUEVSKS91dGlsaXRpZXMudGV4IFwKLQlwYXBlci0kKFBBUEVSKS92ZXJ5aGlnaC50ZXggXAotCWNvbW1vbnRleC9yZXBvcnRpbmdidWdzLnRleAotCi1ET0NGSUxFUz0gJChIT1dUT1NUWUxFUykgXAotCWNvbW1vbnRleC9ib2lsZXJwbGF0ZS50ZXggXAotCXRleGlucHV0cy9sdHhtYXJrdXAuc3R5IFwKLQlkb2MvZG9jLnRleAotCi1FWFRGSUxFUz0gZXh0L2V4dC50ZXggJChNQU5TVFlMRVMpICQoSU5ERVhTVFlMRVMpICQoQ09NTU9OVEVYKSBcCi0JZXh0L2V4dGVuZGluZy50ZXggXAotCWV4dC9uZXd0eXBlcy50ZXggXAotCWV4dC9idWlsZGluZy50ZXggXAotCWV4dC93aW5kb3dzLnRleCBcCi0JZXh0L2VtYmVkZGluZy50ZXggXAotCWV4dC9ub2RkeS5jIFwKLQlleHQvbm9kZHkyLmMgXAotCWV4dC9ub2RkeTMuYyBcCi0JZXh0L25vZGR5NC5jIFwKLQlleHQvcnVuLWZ1bmMuYyBcCi0JY29tbW9udGV4L3R5cGVzdHJ1Y3QuaCBcCi0JY29tbW9udGV4L3JlcG9ydGluZ2J1Z3MudGV4Ci0KLVRVVEZJTEVTPSB0dXQvdHV0LnRleCB0dXQvZ2xvc3NhcnkudGV4ICQoTUFOU1RZTEVTKSAkKENPTU1PTlRFWCkKLQotIyBMYVRlWCBzb3VyY2UgZmlsZXMgZm9yIHRoZSBQeXRob24gUmVmZXJlbmNlIE1hbnVhbAotUkVGRklMRVM9ICQoTUFOU1RZTEVTKSAkKElOREVYU1RZTEVTKSAkKENPTU1PTlRFWCkgXAotCXJlZi9yZWYudGV4IFwKLQlyZWYvcmVmMS50ZXggXAotCXJlZi9yZWYyLnRleCBcCi0JcmVmL3JlZjMudGV4IFwKLQlyZWYvcmVmNC50ZXggXAotCXJlZi9yZWY1LnRleCBcCi0JcmVmL3JlZjYudGV4IFwKLQlyZWYvcmVmNy50ZXggXAotCXJlZi9yZWY4LnRleCAKLQotIyBMYVRlWCBzb3VyY2UgZmlsZXMgZm9yIHRoZSBQeXRob24gTGlicmFyeSBSZWZlcmVuY2UKLUxJQkZJTEVTPSAkKE1BTlNUWUxFUykgJChJTkRFWFNUWUxFUykgJChDT01NT05URVgpIFwKLQljb21tb250ZXgvcmVwb3J0aW5nYnVncy50ZXggXAotCWxpYi9saWIudGV4IFwKLQlsaWIvYXN0dGFibGUudGV4IFwKLQlsaWIvZGlzdHV0aWxzLnRleCBcCi0JbGliL2VtYWlsLnRleCBcCi0JbGliL2VtYWlsZW5jb2RlcnMudGV4IFwKLQlsaWIvZW1haWxleGMudGV4IFwKLQlsaWIvZW1haWxnZW5lcmF0b3IudGV4IFwKLQlsaWIvZW1haWxpdGVyLnRleCBcCi0JbGliL2VtYWlsbWVzc2FnZS50ZXggXAotCWxpYi9lbWFpbHBhcnNlci50ZXggXAotCWxpYi9lbWFpbHV0aWwudGV4IFwKLQlsaWIvbGliaW50cm8udGV4IFwKLQlsaWIvbGlib2Jqcy50ZXggXAotCWxpYi9saWJzdGR0eXBlcy50ZXggXAotCWxpYi9saWJleGNzLnRleCBcCi0JbGliL2xpYmNvbnN0cy50ZXggXAotCWxpYi9saWJmdW5jcy50ZXggXAotCWxpYi9saWJweXRob24udGV4IFwKLQlsaWIvbGlic3lzLnRleCBcCi0JbGliL2xpYnBsYXRmb3JtLnRleCBcCi0JbGliL2xpYmZwZWN0bC50ZXggXAotCWxpYi9saWJnYy50ZXggXAotCWxpYi9saWJ3ZWFrcmVmLnRleCBcCi0JbGliL2xpYmluc3BlY3QudGV4IFwKLQlsaWIvbGlicHlkb2MudGV4IFwKLQlsaWIvbGliZGlmZmxpYi50ZXggXAotCWxpYi9saWJkb2N0ZXN0LnRleCBcCi0JbGliL2xpYnVuaXR0ZXN0LnRleCBcCi0JbGliL2xpYnRlc3QudGV4IFwKLQlsaWIvbGlidHlwZXMudGV4IFwKLQlsaWIvbGlidHJhY2ViYWNrLnRleCBcCi0JbGliL2xpYnBpY2tsZS50ZXggXAotCWxpYi9saWJzaGVsdmUudGV4IFwKLQlsaWIvbGliY29weS50ZXggXAotCWxpYi9saWJtYXJzaGFsLnRleCBcCi0JbGliL2xpYndhcm5pbmdzLnRleCBcCi0JbGliL2xpYmltcC50ZXggXAotCWxpYi9saWJ6aXBpbXBvcnQudGV4IFwKLQlsaWIvbGlicnVucHkudGV4IFwKLQlsaWIvbGlicGtndXRpbC50ZXggXAotCWxpYi9saWJwYXJzZXIudGV4IFwKLQlsaWIvbGliYmx0aW4udGV4IFwKLQlsaWIvbGlibWFpbi50ZXggXAotCWxpYi9saWJmdXR1cmUudGV4IFwKLQlsaWIvbGlic3RyaW5ncy50ZXggXAotCWxpYi9saWJzdHJpbmcudGV4IFwKLQlsaWIvbGlidGV4dHdyYXAudGV4IFwKLQlsaWIvbGliY29kZWNzLnRleCBcCi0JbGliL2xpYnVuaWNvZGVkYXRhLnRleCBcCi0JbGliL2xpYnN0cmluZ3ByZXAudGV4IFwKLQlsaWIvbGlic3RydWN0LnRleCBcCi0JbGliL2xpYm1pc2MudGV4IFwKLQlsaWIvbGlibWF0aC50ZXggXAotCWxpYi9saWJkZWNpbWFsLnRleCBcCi0JbGliL2xpYmFycmF5LnRleCBcCi0JbGliL2xpYmFsbG9zLnRleCBcCi0JbGliL2xpYm9zLnRleCBcCi0JbGliL2xpYmRhdGV0aW1lLnRleCBcCi0JbGliL3R6aW5mby1leGFtcGxlcy5weSBcCi0JbGliL2xpYnRpbWUudGV4IFwKLQlsaWIvbGliZ2V0b3B0LnRleCBcCi0JbGliL2xpYm9wdHBhcnNlLnRleCBcCi0JbGliL2Nhc2VsZXNzLnB5IFwKLQlsaWIvcmVxdWlyZWRfMS5weSBcCi0JbGliL3JlcXVpcmVkXzIucHkgXAotCWxpYi9saWJ0ZW1wZmlsZS50ZXggXAotCWxpYi9saWJlcnJuby50ZXggXAotCWxpYi9saWJjdHlwZXMudGV4IFwKLQlsaWIvbGlic29tZW9zLnRleCBcCi0JbGliL2xpYnNpZ25hbC50ZXggXAotCWxpYi9saWJzb2NrZXQudGV4IFwKLQlsaWIvbGlic2VsZWN0LnRleCBcCi0JbGliL2xpYnRocmVhZC50ZXggXAotCWxpYi9saWJkdW1teXRocmVhZC50ZXggXAotCWxpYi9saWJ1bml4LnRleCBcCi0JbGliL2xpYnBvc2l4LnRleCBcCi0JbGliL2xpYnBvc2l4cGF0aC50ZXggXAotCWxpYi9saWJwd2QudGV4IFwKLQlsaWIvbGlic3B3ZC50ZXggXAotCWxpYi9saWJncnAudGV4IFwKLQlsaWIvbGliY3J5cHQudGV4IFwKLQlsaWIvbGliZGJtLnRleCBcCi0JbGliL2xpYmdkYm0udGV4IFwKLQlsaWIvbGlidGVybWlvcy50ZXggXAotCWxpYi9saWJmY250bC50ZXggXAotCWxpYi9saWJzeXNsb2cudGV4IFwKLQlsaWIvbGlibG9nZ2luZy50ZXggXAotCWxpYi9saWJwZGIudGV4IFwKLQlsaWIvbGlicHJvZmlsZS50ZXggXAotCWxpYi9saWJob3RzaG90LnRleCBcCi0JbGliL2xpYnRpbWVpdC50ZXggXAotCWxpYi9saWJ0cmFjZS50ZXggXAotCWxpYi9saWJjZ2kudGV4IFwKLQlsaWIvbGliY2dpdGIudGV4IFwKLQlsaWIvbGlidXJsbGliLnRleCBcCi0JbGliL2xpYnVybGxpYjIudGV4IFwKLQlsaWIvbGliaHR0cGxpYi50ZXggXAotCWxpYi9saWJmdHBsaWIudGV4IFwKLQlsaWIvbGlibm50cGxpYi50ZXggXAotCWxpYi9saWJ1cmxwYXJzZS50ZXggXAotCWxpYi9saWJodG1scGFyc2VyLnRleCBcCi0JbGliL2xpYmh0bWxsaWIudGV4IFwKLQlsaWIvbGlic2dtbGxpYi50ZXggXAotCWxpYi9saWJyZmM4MjIudGV4IFwKLQlsaWIvbGlibWltZXRvb2xzLnRleCBcCi0JbGliL2xpYmJpbmFzY2lpLnRleCBcCi0JbGliL2xpYm1tLnRleCBcCi0JbGliL2xpYmF1ZGlvb3AudGV4IFwKLQlsaWIvbGliYWlmYy50ZXggXAotCWxpYi9saWJvc3NhdWRpb2Rldi50ZXggXAotCWxpYi9saWJjcnlwdG8udGV4IFwKLQlsaWIvbGliaGFzaGxpYi50ZXggXAotCWxpYi9saWJobWFjLnRleCBcCi0JbGliL2xpYnhkcmxpYi50ZXggXAotCWxpYi9saWJpbWdoZHIudGV4IFwKLQlsaWIvbGliZm9ybWF0dGVyLnRleCBcCi0JbGliL2xpYm9wZXJhdG9yLnRleCBcCi0JbGliL2xpYnJlc291cmNlLnRleCBcCi0JbGliL2xpYnN0YXQudGV4IFwKLQlsaWIvbGlic3RyaW5naW8udGV4IFwKLQlsaWIvbGlidG9rZW4udGV4IFwKLQlsaWIvbGlia2V5d29yZC50ZXggXAotCWxpYi9saWJ1bmRvYy50ZXggXAotCWxpYi9saWJtYWlsY2FwLnRleCBcCi0JbGliL2xpYmdsb2IudGV4IFwKLQlsaWIvbGlidXNlci50ZXggXAotCWxpYi9saWJhbnlkYm0udGV4IFwKLQlsaWIvbGliYnNkZGIudGV4IFwKLQlsaWIvbGliZHVtYmRibS50ZXggXAotCWxpYi9saWJkYmhhc2gudGV4IFwKLQlsaWIvbGlicmFuZG9tLnRleCBcCi0JbGliL2xpYnNpdGUudGV4IFwKLQlsaWIvbGlid2hpY2hkYi50ZXggXAotCWxpYi9saWJiYXNlNjQudGV4IFwKLQlsaWIvbGliZm5tYXRjaC50ZXggXAotCWxpYi9saWJxdW9wcmkudGV4IFwKLQlsaWIvbGliemxpYi50ZXggXAotCWxpYi9saWJzb2Nrc3ZyLnRleCBcCi0JbGliL2xpYm1haWxib3gudGV4IFwKLQlsaWIvbGliY29tbWFuZHMudGV4IFwKLQlsaWIvbGliY21hdGgudGV4IFwKLQlsaWIvbGliZ3ppcC50ZXggXAotCWxpYi9saWJiejIudGV4IFwKLQlsaWIvbGliemlwZmlsZS50ZXggXAotCWxpYi9saWJwcHJpbnQudGV4IFwKLQlsaWIvbGliY29kZS50ZXggXAotCWxpYi9saWJyZS50ZXggXAotCWxpYi9saWJ1c2VyZGljdC50ZXggXAotCWxpYi9saWJkaXMudGV4IFwKLQlsaWIvbGlieG1scnBjbGliLnRleCBcCi0JbGliL2xpYnNpbXBsZXhtbHJwYy50ZXggXAotCWxpYi9saWJkb2N4bWxycGMudGV4IFwKLQlsaWIvbGlicHlleHBhdC50ZXggXAotCWxpYi9saWJmdW5jdG9vbHMudGV4IFwKLQlsaWIveG1sZG9tLnRleCBcCi0JbGliL3htbGRvbW1pbmlkb20udGV4IFwKLQlsaWIveG1sZG9tcHVsbGRvbS50ZXggXAotCWxpYi94bWxzYXgudGV4IFwKLQlsaWIveG1sc2F4aGFuZGxlci50ZXggXAotCWxpYi94bWxzYXh1dGlscy50ZXggXAotCWxpYi94bWxzYXhyZWFkZXIudGV4IFwKLQlsaWIvbGliZXRyZWUudGV4IFwKLQlsaWIvbGlicXVldWUudGV4IFwKLQlsaWIvbGlibG9jYWxlLnRleCBcCi0JbGliL2xpYmdldHRleHQudGV4IFwKLQlsaWIvbGliYmFzZWh0dHAudGV4IFwKLQlsaWIvbGliY29va2llLnRleCBcCi0JbGliL2xpYmNvb2tpZWxpYi50ZXggXAotCWxpYi9saWJjb3B5cmVnLnRleCBcCi0JbGliL2xpYnN5bWJvbC50ZXggXAotCWxpYi9saWJiaW5oZXgudGV4IFwKLQlsaWIvbGlidXUudGV4IFwKLQlsaWIvbGliZmlsZWlucHV0LnRleCBcCi0JbGliL2xpYmltYXBsaWIudGV4IFwKLQlsaWIvbGlicG9wbGliLnRleCBcCi0JbGliL2xpYmNhbGVuZGFyLnRleCBcCi0JbGliL2xpYmJpc2VjdC50ZXggXAotCWxpYi9saWJjb2xsZWN0aW9ucy50ZXggXAotCWxpYi9saWJoZWFwcS50ZXggXAotCWxpYi9saWJtaW1ldHlwZXMudGV4IFwKLQlsaWIvbGlic210cGxpYi50ZXggXAotCWxpYi9saWJzbXRwZC50ZXggXAotCWxpYi9saWJjbWQudGV4IFwKLQlsaWIvbGlibXVsdGlmaWxlLnRleCBcCi0JbGliL2xpYnRocmVhZGluZy50ZXggXAotCWxpYi9saWJkdW1teXRocmVhZGluZy50ZXggXAotCWxpYi9saWJ3ZWJicm93c2VyLnRleCBcCi0JbGliL2ludGVybmV0LnRleCBcCi0JbGliL25ldGRhdGEudGV4IFwKLQlsaWIvbWFya3VwLnRleCBcCi0JbGliL2xhbmd1YWdlLnRleCBcCi0JbGliL2xpYnB5Y29tcGlsZS50ZXggXAotCWxpYi9saWJjb21waWxlYWxsLnRleCBcCi0JbGliL2xpYnNobGV4LnRleCBcCi0JbGliL2xpYm5ldHJjLnRleCBcCi0JbGliL2xpYnJvYm90cGFyc2VyLnRleCBcCi0JbGliL2xpYmdldHBhc3MudGV4IFwKLQlsaWIvbGlic2h1dGlsLnRleCBcCi0JbGliL2xpYnJlcHIudGV4IFwKLQlsaWIvbGlibXNpbGliLnRleCBcCi0JbGliL2xpYm1zdmNydC50ZXggXAotCWxpYi9saWJ3aW5yZWcudGV4IFwKLQlsaWIvbGlid2luc291bmQudGV4IFwKLQlsaWIvd2luZG93cy50ZXggXAotCWxpYi9saWJweWNsYnIudGV4IFwKLQlsaWIvbGlidG9rZW5pemUudGV4IFwKLQlsaWIvbGlidGFibmFubnkudGV4IFwKLQlsaWIvbGlibWhsaWIudGV4IFwKLQlsaWIvbGlidGVsbmV0bGliLnRleCBcCi0JbGliL2xpYmNvbG9yc3lzLnRleCBcCi0JbGliL2xpYmZwZm9ybWF0LnRleCBcCi0JbGliL2xpYmNnaWh0dHAudGV4IFwKLQlsaWIvbGlic2ltcGxlaHR0cC50ZXggXAotCWxpYi9saWJsaW5lY2FjaGUudGV4IFwKLQlsaWIvbGlibmV3LnRleCBcCi0JbGliL2xpYmRpcmNhY2hlLnRleCBcCi0JbGliL2xpYmZpbGVjbXAudGV4IFwKLQlsaWIvbGlic3VuYXUudGV4IFwKLQlsaWIvbGlid2F2ZS50ZXggXAotCWxpYi9saWJjaHVuay50ZXggXAotCWxpYi9saWJjb2Rlb3AudGV4IFwKLQlsaWIvbGliY3Vyc2VzLnRleCBcCi0JbGliL2xpYmN1cnNlc3BhbmVsLnRleCBcCi0JbGliL2xpYmFzY2lpLnRleCBcCi0JbGliL2xpYmRsLnRleCBcCi0JbGliL2xpYm11dGV4LnRleCBcCi0JbGliL2xpYm5pcy50ZXggXAotCWxpYi9saWJwaXBlcy50ZXggXAotCWxpYi9saWJwdHkudGV4IFwKLQlsaWIvbGlicmVhZGxpbmUudGV4IFwKLQlsaWIvbGlicmxjb21wbGV0ZXIudGV4IFwKLQlsaWIvbGlic2NoZWQudGV4IFwKLQlsaWIvbGlic3RhdHZmcy50ZXggXAotCWxpYi9saWJ0dHkudGV4IFwKLQlsaWIvbGliYXN5bmNvcmUudGV4IFwKLQlsaWIvbGliYXN5bmNoYXQudGV4IFwKLQlsaWIvbGliYXRleGl0LnRleCBcCi0JbGliL2xpYm1tYXAudGV4IFwKLQlsaWIvdGtpbnRlci50ZXggXAotCWxpYi9saWJ0dXJ0bGUudGV4IFwKLQlsaWIvbGlidGFyZmlsZS50ZXggXAotCWxpYi9saWJjc3YudGV4IFwKLQlsaWIvbGliY2ZncGFyc2VyLnRleCBcCi0JbGliL2xpYnNxbGl0ZTMudGV4Ci0KLSMgTGFUZVggc291cmNlIGZpbGVzIGZvciBNYWNpbnRvc2ggTGlicmFyeSBNb2R1bGVzLgotTUFDRklMRVM9ICQoSE9XVE9TVFlMRVMpICQoSU5ERVhTVFlMRVMpICQoQ09NTU9OVEVYKSBcCi0JbWFjL21hYy50ZXggXAotCW1hYy91c2luZy50ZXggXAotCW1hYy9zY3JpcHRpbmcudGV4IFwKLQltYWMvdG9vbGJveC50ZXggXAotCW1hYy91bmRvYy50ZXggXAotCW1hYy9saWJjb2xvcnBpY2tlci50ZXggXAotCW1hYy9saWJtYWMudGV4IFwKLQltYWMvbGliZ2Vuc3VpdGVtb2R1bGUudGV4IFwKLQltYWMvbGliYWV0b29scy50ZXggXAotCW1hYy9saWJhZXBhY2sudGV4IFwKLQltYWMvbGliYWV0eXBlcy50ZXggXAotCW1hYy9saWJtYWNvcy50ZXggXAotCW1hYy9saWJtYWNvc3Rvb2xzLnRleCBcCi0JbWFjL2xpYm1hY3VpLnRleCBcCi0JbWFjL2xpYm1hY2ljLnRleCBcCi0JbWFjL2xpYmZyYW1ld29yay50ZXggXAotCW1hYy9saWJhdXRvZ2lsLnRleCBcCi0JbWFjL2xpYm1pbmlhZS50ZXggXAotCW1hYy9saWJzY3JhcC50ZXgKLQotSU5TVEZJTEVTID0gJChIT1dUT1NUWUxFUykgaW5zdC9pbnN0LnRleAotCi1ESVNURklMRVMgPSAkKEhPV1RPU1RZTEVTKSBcCi0JZGlzdC9kaXN0LnRleCBcCi0JZGlzdC9zeXNjb25maWcudGV4CmRpZmYgLS1naXQgYS9Eb2MvUkVBRE1FIGIvRG9jL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQyNmJhMi4uMDAwMDAwMAotLS0gYS9Eb2MvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLVB5dGhvbiBzdGFuZGFyZCBkb2N1bWVudGF0aW9uIC0tIGluIExhVGVYCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgTGFUZVggc291cmNlcyB0byB0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24KLWFuZCB0b29scyByZXF1aXJlZCB0byBzdXBwb3J0IHRoZSBmb3JtYXR0aW5nIHByb2Nlc3MuICBUaGUgZG9jdW1lbnRzCi1ub3cgcmVxdWlyZSBMYVRlWDJlOyBMYVRlWCAyLjA5IGNvbXBhdGliaWxpdHkgaGFzIGJlZW4gZHJvcHBlZC4KLQotSWYgeW91IGRvbid0IGhhdmUgTGFUZVgsIG9yIGlmIHlvdSdkIHJhdGhlciBub3QgZm9ybWF0IHRoZQotZG9jdW1lbnRhdGlvbiB5b3Vyc2VsZiwgeW91IGNhbiBmdHAgYSB0YXIgZmlsZSBjb250YWluaW5nIEhUTUwsIFBERiwKLW9yIFBvc3RTY3JpcHQgdmVyc2lvbnMgb2YgYWxsIGRvY3VtZW50cy4gIEFkZGl0aW9uYWwgZm9ybWF0cyBtYXkgYmUKLWF2YWlsYWJsZS4gIFRoZXNlIHNob3VsZCBiZSBpbiB0aGUgc2FtZSBwbGFjZSB3aGVyZSB5b3UgZmV0Y2hlZCB0aGUKLW1haW4gUHl0aG9uIGRpc3RyaWJ1dGlvbiAodHJ5IDxodHRwOi8vd3d3LnB5dGhvbi5vcmcvPiBvcgotPGZ0cDovL2Z0cC5weXRob24ub3JnL3B1Yi9weXRob24vPikuCi0KLVRoZSBmb2xsb3dpbmcgYXJlIHRoZSBMYVRlWCBzb3VyY2UgZmlsZXM6Ci0KLQlhcGkvKi50ZXgJUHl0aG9uL0MgQVBJIFJlZmVyZW5jZSBNYW51YWwKLQlkb2MvKi50ZXgJRG9jdW1lbnRpbmcgUHl0aG9uCi0JZXh0LyoudGV4CUV4dGVuZGluZyBhbmQgRW1iZWRkaW5nIHRoZSBQeXRob24gSW50ZXJwcmV0ZXIKLQlsaWIvKi50ZXgJUHl0aG9uIExpYnJhcnkgUmVmZXJlbmNlCi0JbWFjLyoudGV4CU1hY2ludG9zaCBMaWJyYXJ5IE1vZHVsZXMKLQlyZWYvKi50ZXgJUHl0aG9uIFJlZmVyZW5jZSBNYW51YWwKLQl0dXQvKi50ZXgJUHl0aG9uIFR1dG9yaWFsCi0gICAgICAgIGluc3QvKi50ZXggICAgICBJbnN0YWxsaW5nIFB5dGhvbiBNb2R1bGVzCi0gICAgICAgIGRpc3QvKi50ZXggICAgICBEaXN0cmlidXRpbmcgUHl0aG9uIE1vZHVsZXMKLQotTW9zdCB1c2UgdGhlICJtYW51YWwiIGRvY3VtZW50IGNsYXNzIGFuZCAicHl0aG9uIiBwYWNrYWdlLCBkZXJpdmVkIGZyb20gCi10aGUgb2xkICJteWZvcm1hdC5zdHkiIHN0eWxlIGZpbGUuICBUaGUgTWFjaW50b3NoIExpYnJhcnkgTW9kdWxlcwotZG9jdW1lbnQgdXNlcyB0aGUgImhvd3RvIiBkb2N1bWVudCBjbGFzcyBpbnN0ZWFkLiAgVGhlc2UgY29udGFpbnMgbWFueQotbWFjcm8gZGVmaW5pdGlvbnMgdXNlZnVsIGluIGRvY3VtZW50aW5nIFB5dGhvbiwgYW5kIHNldCBzb21lIHN0eWxlCi1wYXJhbWV0ZXJzLgotCi1UaGVyZSdzIGEgTWFrZWZpbGUgdG8gY2FsbCBMYVRlWCBhbmQgdGhlIG90aGVyIHV0aWxpdGllcyBpbiB0aGUgcmlnaHQKLW9yZGVyIGFuZCB0aGUgcmlnaHQgbnVtYmVyIG9mIHRpbWVzLiAgQnkgZGVmYXVsdCwgaXQgd2lsbCBidWlsZCB0aGUKLUhUTUwgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnRhdGlvbiwgYnV0IERWSSwgUERGLCBhbmQgUG9zdFNjcmlwdCBjYW4KLWFsc28gYmUgbWFkZS4gIFRvIHZpZXcgdGhlIGdlbmVyYXRlZCBIVE1MLCBwb2ludCB5b3VyIGZhdm9yaXRlIGJyb3dzZXIKLWF0IHRoZSB0b3AtbGV2ZWwgaW5kZXggKGh0bWwvaW5kZXguaHRtbCkgYWZ0ZXIgcnVubmluZyAibWFrZSIuCi0KLVRoZSBNYWtlZmlsZSBjYW4gYWxzbyBwcm9kdWNlIERWSSBmaWxlcyBmb3IgZWFjaCBkb2N1bWVudCBtYWRlOyB0bwotcHJldmlldyB0aGVtLCB1c2UgeGR2aS4gIFBvc3RTY3JpcHQgaXMgcHJvZHVjZWQgYnkgdGhlIHNhbWUgTWFrZWZpbGUKLXRhcmdldCB0aGF0IHByb2R1Y2VzIHRoZSBEVkkgZmlsZXMuICBUaGlzIHVzZXMgdGhlIGR2aXBzIHRvb2wuCi1QcmludGluZyBkZXBlbmRzIG9uIGxvY2FsIGNvbnZlbnRpb25zOyBhdCBvdXIgc2l0ZSwgd2UgdXNlIGxwci4gIEZvcgotZXhhbXBsZToKLQotCW1ha2UgcGFwZXItbGV0dGVyL2xpYi5wcwkjIGNyZWF0ZSBsaWIuZHZpIGFuZCBsaWIucHMKLQl4ZHZpIHBhcGVyLWxldHRlci9saWIuZHZpCSMgcHJldmlldyBsaWIuZHZpCi0JbHByIHBhcGVyLWxldHRlci9saWIucHMJCSMgcHJpbnQgb24gZGVmYXVsdCBwcmludGVyCi0KLQotV2hhdCBpZiBJIGZpbmQgYSBidWc/Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRmlyc3QsIGNoZWNrIHRoYXQgdGhlIGJ1ZyBpcyBwcmVzZW50IGluIHRoZSBkZXZlbG9wbWVudCB2ZXJzaW9uIG9mIHRoZQotZG9jdW1lbnRhdGlvbiBhdCA8aHR0cDovL3d3dy5weXRob24ub3JnL2Rldi9kb2MvZGV2ZWwvPjsgd2UgbWF5Ci1oYXZlIGFscmVhZHkgZml4ZWQgaXQuCi0KLUlmIHdlIGhhdmVuJ3QsIHRlbGwgdXMgYWJvdXQgaXQuICBXZSdkIGxpa2UgdGhlIGRvY3VtZW50YXRpb24gdG8gYmUKLWNvbXBsZXRlIGFuZCBhY2N1cmF0ZSwgYnV0IGhhdmUgbGltaXRlZCB0aW1lLiAgSWYgeW91IGRpc2NvdmVyIGFueQotaW5jb25zaXN0ZW5jaWVzIGJldHdlZW4gdGhlIGRvY3VtZW50YXRpb24gYW5kIGltcGxlbWVudGF0aW9uLCBvciBqdXN0Ci1oYXZlIHN1Z2dlc3Rpb25zIGFzIHRvIGhvdyB0byBpbXByb3ZlIHRoZSBkb2N1bWVudGF0aW9uLCBsZXQgaXMga25vdyEKLVNwZWNpZmljIGJ1Z3MgYW5kIHBhdGNoZXMgc2hvdWxkIGJlIHJlcG9ydGVkIHVzaW5nIG91ciBidWcgJiBwYXRjaAotZGF0YWJhc2VzIGF0OgotCi0JaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9weXRob24KLQotT3RoZXIgc3VnZ2VzdGlvbnMgb3IgcXVlc3Rpb25zIHNob3VsZCBiZSBzZW50IHRvIHRoZSBQeXRob24KLURvY3VtZW50YXRpb24gVGVhbToKLQotCWRvY3NAcHl0aG9uLm9yZwotCi1UaGFua3MhCi0KLQotV2hhdCB0b29scyBkbyBJIG5lZWQ/Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotWW91IG5lZWQgdG8gaW5zdGFsbCBQeXRob247IHNvbWUgb2YgdGhlIHNjcmlwdHMgdXNlZCB0byBwcm9kdWNlIHRoZQotZG9jdW1lbnRhdGlvbiBhcmUgd3JpdHRlbiBpbiBQeXRob24uICBZb3UgZG9uJ3QgbmVlZCB0aGlzCi1kb2N1bWVudGF0aW9uIHRvIGluc3RhbGwgUHl0aG9uOyBpbnN0cnVjdGlvbnMgYXJlIGluY2x1ZGVkIGluIHRoZQotUkVBRE1FIGZpbGUgaW4gdGhlIFB5dGhvbiBkaXN0cmlidXRpb24uCi0KLVRoZSBzaW1wbGVzdCB3YXkgdG8gZ2V0IHRoZSByZXN0IG9mIHRoZSB0b29scyBpbiB0aGUgY29uZmlndXJhdGlvbiB3ZQotdXNlZCBpcyB0byBpbnN0YWxsIHRoZSB0ZVRlWCBUZVggZGlzdHJpYnV0aW9uLCB2ZXJzaW9ucyAwLjkgb3IgbmV3ZXIuCi1Nb3JlIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBvbiB0ZVRlWCBhdCA8aHR0cDovL3d3dy50dWcub3JnL3RldGV4Lz4uCi1UaGlzIGlzIGEgVW5peC1vbmx5IFRlWCBkaXN0cmlidXRpb24gYXQgdGhpcyB0aW1lLiAgVGhpcyBkb2N1bWVudGF0aW9uCi1yZWxlYXNlIHdhcyB0ZXN0ZWQgd2l0aCB0aGUgMS4wLjcgcmVsZWFzZSwgYnV0IHRoZXJlIGhhdmUgYmVlbiBubwotc3Vic3RhbnRpYWwgY2hhbmdlcyBzaW5jZSBsYXRlIGluIHRoZSAwLjkgc2VyaWVzLCB3aGljaCB3ZSB1c2VkCi1leHRlbnNpdmVseSBmb3IgcHJldmlvdXMgdmVyc2lvbnMgd2l0aG91dCBhbnkgZGlmZmljdWx0eS4KLQotSWYgeW91IGRvbid0IHdhbnQgdG8gZ2V0IHRlVGVYLCBoZXJlIGlzIHdoYXQgeW91J2xsIG5lZWQ6Ci0KLVRvIGNyZWF0ZSBEVkksIFBERiwgb3IgUG9zdFNjcmlwdCBmaWxlczoKLQotCS0gTGFUZVgyZSwgMTk5NS8xMi8wMSBvciBuZXdlci4gIE9sZGVyIHZlcnNpb25zIGFyZSBsaWtlbHkgdG8gCi0JICBjaG9rZS4KLQotCS0gbWFrZWluZGV4LiAgVGhpcyBpcyB1c2VkIHRvIHByb2R1Y2UgdGhlIGluZGV4ZXMgZm9yIHRoZQotCSAgbGlicmFyeSByZWZlcmVuY2UgYW5kIFB5dGhvbi9DIEFQSSByZWZlcmVuY2UuCi0KLVRvIGNyZWF0ZSBQREYgZmlsZXM6Ci0KLQktIHBkZmxhdGV4LiAgV2UgdXNlZCB0aGUgb25lIGluIHRoZSB0ZVRlWCBkaXN0cmlidXRpb24gKHBkZlRlWAotICAgICAgICAgIHZlcnNpb24gMy4xNDE1OS0xM2QgKFdlYjJDIDcuMy4xKSBhdCB0aGUgdGltZSBvZiB0aGlzCi0gICAgICAgICAgd3JpdGluZykuICBWZXJzaW9ucyBldmVuIGEgY291cGxlIG9mIHBhdGNobGV2ZWxzIGVhcmxpZXIgYXJlCi0gICAgICAgICAgaGlnaGx5IGxpa2VseSB0byBmYWlsIGR1ZSB0byBzeW50YXggY2hhbmdlcyBmb3Igc29tZSBvZiB0aGUKLSAgICAgICAgICBwZGZ0ZXggcHJpbWl0aXZlcy4KLQotVG8gY3JlYXRlIFBvc3RTY3JpcHQgZmlsZXM6Ci0KLQktIGR2aXBzLiAgTW9zdCBUZVggaW5zdGFsbGF0aW9ucyBpbmNsdWRlIHRoaXMuICBJZiB5b3UgZG9uJ3QKLQkgIGhhdmUgb25lLCBjaGVjayBDVEFOICg8ZnRwOi8vY3Rhbi50dWcub3JnL3RleC1hcmNoaXZlLz4pLgotCi1UbyBjcmVhdGUgaW5mbyBmaWxlczoKLQotCU5vdGUgdGhhdCBpbmZvIHN1cHBvcnQgaXMgY3VycmVudGx5IGJlaW5nIHJldmlzZWQgdXNpbmcgbmV3Ci0JY29udmVyc2lvbiB0b29scyBieSBNaWNoYWVsIEVybnN0IDxtZXJuc3RAY3Mud2FzaGluZ3Rvbi5lZHU+LgotCi0JLSBtYWtlaW5mby4gIFRoaXMgaXMgYXZhaWxhYmxlIGZyb20gYW55IEdOVSBtaXJyb3IuCi0KLQktIGVtYWNzIG9yIHhlbWFjcy4gIEVtYWNzIGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGFzCi0JICBtYWtlaW5mbywgYW5kIHhlbWFjcyBpcyBhdmFpbGFibGUgZnJvbSBmdHAueGVtYWNzLm9yZy4KLQotCS0gUGVybC4gIEZpbmQgdGhlIHNvZnR3YXJlIGF0Ci0JICA8aHR0cDovL2xhbmd1YWdlLnBlcmwuY29tL2luZm8vc29mdHdhcmUuaHRtbD4uCi0KLQktIEhUTUw6OkVsZW1lbnQuICBJZiB5b3UgZG9uJ3QgaGF2ZSB0aGlzIGluc3RhbGxlZCwgeW91IGNhbiBnZXQKLQkgIHRoaXMgZnJvbSBDUEFOLiAgVXNlIHRoZSBjb21tYW5kOgotCi0JICBwZXJsIC1lICd1c2UgQ1BBTjsgQ1BBTjo6aW5zdGFsbCgiSFRNTDo6RWxlbWVudCIpOycKLQotCSAgWW91IG1heSBuZWVkIHRvIGJlIHJvb3QgdG8gZG8gdGhpcy4KLQotVG8gY3JlYXRlIEhUTUwgZmlsZXM6Ci0KLQktIFBlcmwgNS42LjAgb3IgbmV3ZXIuICBGaW5kIHRoZSBzb2Z0d2FyZSBhdAotCSAgPGh0dHA6Ly9sYW5ndWFnZS5wZXJsLmNvbS9pbmZvL3NvZnR3YXJlLmh0bWw+LgotCi0JLSBMYVRlWDJIVE1MIDk5LjJiOCBvciBuZXdlci4gIE9sZGVyIHZlcnNpb25zIGFyZSBub3QKLQkgIHN1cHBvcnRlZDsgZWFjaCB2ZXJzaW9uIGNoYW5nZXMgZW5vdWdoIHRoYXQgc3VwcG9ydGluZwotCSAgbXVsdGlwbGUgdmVyc2lvbnMgaXMgbm90IGxpa2VseSB0byB3b3JrLiAgTWFueSBvbGRlcgotCSAgdmVyc2lvbnMgZG9uJ3Qgd29yayB3aXRoIFBlcmwgNS42IGFzIHdlbGwuICBUaGlzIGFsc28gc2NyZXdzCi0JICB1cCBjb2RlIGZyYWdtZW50cy4gIDstKCAgUmVsZWFzZXMgYXJlIGF2YWlsYWJsZSBhdDoKLQkgIDxodHRwOi8vd3d3LmxhdGV4Mmh0bWwub3JnLz4uCi0KLQotSSBnb3QgYSBtYWtlIGVycm9yOiAibWFrZTogZG9uJ3Qga25vdyBob3cgdG8gbWFrZSBjb21tb250ZXgvcGF0Y2hsZXZlbC50ZXguIgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Zb3VyIHZlcnNpb24gb2YgbWFrZSBkb2Vzbid0IHN1cHBvcnQgdGhlICdzaGVsbCcgZnVuY3Rpb24uICBZb3Ugd2lsbCBuZWVkIHRvCi11c2UgYSB2ZXJzaW9uIHdoaWNoIGRvZXMsIGUuZy4gR05VIG1ha2UuCi0KLQotTGFUZVggKG9yIHBkZkxhVGVYKSByYW4gb3V0IG9mIG1lbW9yeTsgaG93IGNhbiBJIGZpeCBpdD8KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoaXMgaXMga25vd24gdG8gYmUgYSBwcm9ibGVtIGF0IGxlYXN0IG9uIE1hYyBPUyBYLCBidXQgaXQgaGFzIGJlZW4KLW9ic2VydmVkIG9uIG90aGVyIHN5c3RlbXMgaW4gdGhlIHBhc3QuCi0KLU9uIHNvbWUgc3lzdGVtcywgdGhlIGRlZmF1bHQgc2l6ZXMgb2Ygc29tZSBvZiB0aGUgbWVtb3J5IHBvb2xzCi1hbGxvY2F0ZWQgYnkgVGVYIG5lZWRzIHRvIGJlIGNoYW5nZWQ7IHRoaXMgaXMgYSBjb25maWd1cmF0aW9uIHNldHRpbmcKLWZvciBpbnN0YWxsYXRpb25zIGJhc2VkIG9uIHdlYjJjIChtb3N0IGlmIG5vdCBhbGwgaW5zdGFsbGF0aW9ucykuCi1UaGlzIGlzIHVzdWFsbHkgc2V0IGluIGEgZmlsZSBuYW1lZCB0ZXhtZi93ZWIyYy90ZXhtZi5jbmYgKHdoZXJlIHRoZQotdG9wLWxldmVsIHRleG1mLyBkaXJlY3RvcnkgaXMgcGFydCBvZiB0aGUgVGVYIGluc3RhbGxhdGlvbikuICBJZiB5b3UKLWdldCBhICJidWZmZXIgb3ZlcmZsb3ciIHdhcm5pbmcgZnJvbSBMYVRlWCwgb3BlbiB0aGF0IGNvbmZpZ3VyYXRpb24KLWZpbGUgYW5kIGxvb2sgZm9yIHRoZSAibWFpbl9tZW1vcnkucGRmbGF0ZXgiIHNldHRpbmcuICBJZiB0aGVyZSBpcyBub3QKLW9uZSwgeW91IGNhbiBhZGQgYSBsaW5lIHdpdGggdGhlIHNldHRpbmcuICBUaGUgdmFsdWUgMTUwMDAwMCBzZWVtcyB0bwotYmUgc3VmZmljaWVudCBmb3IgZm9ybWF0dGluZyB0aGUgUHl0aG9uIGRvY3VtZXRhbnRpb24uCi0KLQotV2hhdCBpZiBUaW1lcyBmb250cyBhcmUgbm90IGF2YWlsYWJsZT8KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUFzIGRpc3RyaWJ1dGVkLCB0aGUgTGFUZVggZG9jdW1lbnRzIHVzZSBQb3N0U2NyaXB0IFRpbWVzIGZvbnRzLiAgVGhpcwotaXMgZG9uZSBzaW5jZSB0aGV5IGFyZSBtdWNoIGJldHRlciBsb29raW5nIGFuZCBwcm9kdWNlIHNtYWxsZXIKLVBvc3RTY3JpcHQgZmlsZXMuICBJZiwgaG93ZXZlciwgeW91ciBUZVggaW5zdGFsbGF0aW9uIGRvZXMgbm90IHN1cHBvcnQKLXRoZW0sIHRoZXkgbWF5IGJlIGVhc2lseSBkaXNhYmxlZC4gIEVkaXQgdGhlIGZpbGUKLXRleGlucHV0cy9weXBhcGVyLnN0eSBhbmQgY29tbWVudCBvdXQgdGhlIGxpbmUgdGhhdCBzdGFydHMKLSJcUmVxdWlyZVBhY2thZ2V7dGltZXN9IiBieSBpbnNlcnRpbmcgYSAiJSIgY2hhcmFjdGVyIGF0IHRoZSBiZWdpbm5pbmcKLW9mIHRoZSBsaW5lLiAgSWYgeW91J3JlIGZvcm1hdHRpbmcgdGhlIGRvY3MgZm9yIEE0IHBhcGVyIGluc3RlYWQgb2YKLVVTLUxldHRlciBwYXBlciwgY2hhbmdlIHBhcGVyLWE0L3B5cGFwZXIuc3R5IGluc3RlYWQuICBBbiBhbHRlcm5hdGl2ZQotaXMgdG8gaW5zdGFsbCB0aGUgcmlnaHQgZm9udHMgYW5kIExhVGVYIHN0eWxlIGZpbGUuCi0KLQotV2hhdCBpZiBJIHdhbnQgdG8gdXNlIEE0IHBhcGVyPwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1JbnN0ZWFkIG9mIGJ1aWxkaW5nIHRoZSBQb3N0U2NyaXB0IGJ5IGdpdmluZyB0aGUgY29tbWFuZCAibWFrZSBwcyIsCi1naXZlIHRoZSBjb21tYW5kICJtYWtlIFBBUEVSPWE0IHBzIjsgdGhlIG91dHB1dCB3aWxsIGJlIHByb2R1Y2VkIGluCi10aGUgcGFwZXItYTQvIHN1YmRpcmVjdG9yeS4gIChZb3UgY2FuIHVzZSAibWFrZSBQQVBFUj1hNCBwZGYiIGlmIHlvdSdkCi1yYXRoZXIgaGF2ZSBQREYgb3V0cHV0LikKLQotCi1NYWtpbmcgSFRNTCBmaWxlcwotLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIExhVGVYIGRvY3VtZW50cyBjYW4gYmUgY29udmVydGVkIHRvIEhUTUwgdXNpbmcgTmlrb3MgRHJha29zJwotTGFUZVgySFRNTCBjb252ZXJ0ZXIuICBTZWUgdGhlIE1ha2VmaWxlOyBhZnRlciBzb21lIHR3aWRkbGluZywgIm1ha2UiCi1zaG91bGQgZG8gdGhlIHRyaWNrLgotCi0KLVdoYXQgZWxzZSBpcyBpbiBoZXJlPwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZXJlIGlzIGEgbmV3IExhVGVYIGRvY3VtZW50IGNsYXNzIGNhbGxlZCAiaG93dG8iLiAgVGhpcyBpcyB1c2VkIGZvcgotdGhlIG5ldyBzZXJpZXMgb2YgUHl0aG9uIEhPV1RPIGRvY3VtZW50cyB3aGljaCBpcyBiZWluZyBjb29yZGluYXRlZCBieQotQW5kcmV3IEt1Y2hsaW5nIDxha3VjaGxpbkBtZW1zLWV4Y2hhbmdlLm9yZz4uICBUaGUgZmlsZQotdGVtcGxhdGVzL2hvd3RvLnRleCBpcyBhIGNvbW1lbnRlZCBleGFtcGxlIHdoaWNoIG1heSBiZSB1c2VkIGFzIGEKLXRlbXBsYXRlLiAgQSBQeXRob24gc2NyaXB0IHRvICJkbyB0aGUgcmlnaHQgdGhpbmciIHRvIGZvcm1hdCBhIGhvd3RvCi1kb2N1bWVudCBpcyBpbmNsdWRlZCBhcyB0b29scy9ta2hvd3RvLiAgVGhlc2UgZG9jdW1lbnRzIGNhbiBiZQotZm9ybWF0dGVkIGFzIEhUTUwsIFBERiwgUG9zdFNjcmlwdCwgb3IgQVNDSUkgZmlsZXMuICBVc2UgIm1raG93dG8KLS0taGVscCIgZm9yIGluZm9ybWF0aW9uIG9uIHVzaW5nIHRoZSBmb3JtYXR0aW5nIHRvb2wuCi0KLUZvciBhdXRob3JzIG9mIG1vZHVsZSBkb2N1bWVudGF0aW9uLCB0aGVyZSBpcyBhIGZpbGUKLXRlbXBsYXRlcy9tb2R1bGUudGV4IHdoaWNoIG1heSBiZSB1c2VkIGFzIGEgdGVtcGxhdGUgZm9yIGEgbW9kdWxlCi1zZWN0aW9uLiAgVGhpcyBtYXkgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGVpdGhlciB0aGUgaG93dG8gb3IKLW1hbnVhbCBkb2N1bWVudCBjbGFzcy4gIENyZWF0ZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYSBuZXcgbW9kdWxlIGJ5Ci1jb3B5aW5nIHRoZSB0ZW1wbGF0ZSB0byBsaWI8bXltb2R1bGU+LnRleCBhbmQgZWRpdGluZyBhY2NvcmRpbmcgdG8gdGhlIAotaW5zdHJ1Y3Rpb25zIGluIHRoZSBjb21tZW50cy4KLQotRG9jdW1lbnRhdGlvbiBvbiB0aGUgYXV0aG9yaW5nIFB5dGhvbiBkb2N1bWVudGF0aW9uLCBpbmNsdWRpbmcKLWluZm9ybWF0aW9uIGFib3V0IGJvdGggc3R5bGUgYW5kIG1hcmt1cCwgaXMgYXZhaWxhYmxlIGluIHRoZQotIkRvY3VtZW50aW5nIFB5dGhvbiIgbWFudWFsLgotCi0KLUNvcHlyaWdodCBub3RpY2UKLT09PT09PT09PT09PT09PT0KLQotVGhlIFB5dGhvbiBzb3VyY2UgaXMgY29weXJpZ2h0ZWQsIGJ1dCB5b3UgY2FuIGZyZWVseSB1c2UgYW5kIGNvcHkgaXQKLWFzIGxvbmcgYXMgeW91IGRvbid0IGNoYW5nZSBvciByZW1vdmUgdGhlIGNvcHlyaWdodCBub3RpY2U6Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAwMC0yMDA3IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotQ29weXJpZ2h0IChjKSAyMDAwIEJlT3Blbi5jb20uCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi1Db3B5cmlnaHQgKGMpIDE5OTUtMjAwMCBDb3Jwb3JhdGlvbiBmb3IgTmF0aW9uYWwgUmVzZWFyY2ggSW5pdGlhdGl2ZXMuCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi1Db3B5cmlnaHQgKGMpIDE5OTEtMTk5NSBTdGljaHRpbmcgTWF0aGVtYXRpc2NoIENlbnRydW0uCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi1TZWUgdGhlIGZpbGUgImNvbW1vbnRleC9saWNlbnNlLnRleCIgZm9yIGluZm9ybWF0aW9uIG9uIHVzYWdlIGFuZAotcmVkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCBhbmQgZm9yIGEgRElTQ0xBSU1FUiBPRiBBTEwgV0FSUkFOVElFUy4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvYy9UT0RPIGIvRG9jL1RPRE8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNDY3ZmUuLjAwMDAwMDAKLS0tIGEvRG9jL1RPRE8KKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi1QWVRIT04gRE9DVU1FTlRBVElPTiBUTy1ETyBMSVNUCQkJLSotIGluZGVudGVkLXRleHQgLSotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUdlbmVyYWwKLS0tLS0tLS0KLQotKiBGaWd1cmUgb3V0IEhUTUxIZWxwIGdlbmVyYXRpb24gZm9yIHRoZSBXaW5kb3dzIHdvcmxkLgotCi0KLVB5dGhvbi9DIEFQSQotLS0tLS0tLS0tLS0tCi0KLSogVGhlICJWZXJ5IEhpZ2ggTGV2ZWwgSW50ZXJmYWNlIiBpbiB0aGUgQVBJIGRvY3VtZW50IGhhcyBiZWVuCi0gIHJlcXVlc3RlZDsgSSBndWVzcyBpdCB3b3VsZG4ndCBodXJ0IHRvIGZpbGwgaW4gYSBiaXQgdGhlcmUuICBSZXF1ZXN0IAotICBieSBBbGJlcnQgSG9ma2FtcCA8YS5ob2ZrYW1wQHd0Yi50dWUubmw+LiAgKFBhcnRseSBkb25lLikKLQotKiBEZXNjcmliZSBpbXBsZW1lbnRpbmcgdHlwZXMgaW4gQywgaW5jbHVkaW5nIHVzZSBvZiB0aGUgJ3NlbGYnCi0gIHBhcmFtZXRlciB0byB0aGUgbWV0aG9kIGltcGxlbWVudGF0aW9uIGZ1bmN0aW9uLiAgKE1pc3NpbmcgbWF0ZXJpYWwKLSAgbWVudGlvbmVkIGluIHRoZSBFeHRlbmRpbmcgJiBFbWJlZGRpbmcgbWFudWFsLCBzZWN0aW9uIDEuMTsgcHJvYmxlbQotICByZXBvcnRlZCBieSBDbGF5IFNwZW5jZSA8Y3NwZW5jZUBzYXJub2ZmLmNvbT4uKSAgSGVhdmlseSBpbXBhY3RzIG9uZQotICBjaGFwdGVyIG9mIHRoZSBQeXRob24vQyBBUEkgbWFudWFsLgotCi0qIE1pc3NpbmcgUHlBcmdfUGFyc2VUdXBsZSgpLCBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoKSwKLSAgUHlfQnVpbGRWYWx1ZSgpLiAgSW5mb3JtYXRpb24gcmVxdWVzdGVkIGJ5IEdyZWcgS29jaGFuc2tpCi0gIDxncGtAYmVsbC1sYWJzLmNvbT4uICBQeUV2YWxfRXZhbENvZGUoKSBoYXMgYWxzbyBiZWVuIHJlcXVlc3RlZC4KLQotRXh0ZW5kaW5nICYgRW1iZWRkaW5nCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotKiBNb3JlIGluZm9ybWF0aW9uIGlzIG5lZWRlZCBhYm91dCBidWlsZGluZyBkeW5hbWljYWxseSBsaW5rZWQKLSAgZXh0ZW5zaW9ucyBpbiBDKysuICBTcGVjaWZpY2FsbHksIHRoZSBleHRlbnNpb25zIG11c3QgYmUgbGlua2VkCi0gIGFnYWluc3QgdGhlIEMrKyBsaWJyYXJpZXMgKGFuZCBwb3NzaWJseSBydW50aW1lKS4gIEFsc28gbm90ZWQgYnkKLSAgQWxiZXJ0IEhvZmthbXAgPGEuaG9ma2FtcEB3dGIudHVlLm5sPi4KLQotUmVmZXJlbmNlIE1hbnVhbAotLS0tLS0tLS0tLS0tLS0tLQotCi0qIERvY3VtZW50IHRoZSBFeHRlbmRlZCBDYWxsIFN5bnRheCBpbiB0aGUgbGFuZ3VhZ2UgcmVmZXJlbmNlLgotICBbSmVyZW15IEh5bHRvbl0KLQotKiBEb2N1bWVudCBuZXcgY29tcGFyaXNvbiBzdXBwb3J0IGZvciByZWN1cnNpdmUgb2JqZWN0cyAobGFuZy4gcmVmLj8KLSAgbGlicmFyeSByZWYuPyAoY21wKCkgZnVuY3Rpb24pLiAgW0plcmVteSBIeWx0b25dCi0KLUxpYnJhcnkgUmVmZXJlbmNlCi0tLS0tLS0tLS0tLS0tLS0tLQotCi0qIFVwZGF0ZSB0aGUgcGlja2xlIGRvY3VtZW50YXRpb24gdG8gZGVzY3JpYmUgYWxsIG9mIHRoZSBjdXJyZW50Ci0gIGJlaGF2aW9yOyBvbmx5IGEgc3Vic2V0IGlzIGRlc2NyaWJlZC4gIF9fcmVkdWNlX18sIGV0Yy4gIFBhcnRpYWwKLSAgdXBkYXRlIHN1Ym1pdHRlZCBieSBKaW0gS2VyciA8amJrZXJyQHNyLmhwLmNvbT4uCi0KLSogVXBkYXRlIHRoZSBodHRwbGliIGRvY3VtZW50YXRpb24gdG8gbWF0Y2ggR3JlZyBTdGVpbidzIEhUVFAvMS4xCi0gIHN1cHBvcnQgYW5kIG5ldyBjbGFzc2VzLiAgKEdyZWcsIHRoaXMgaXMgeW91cnMhKQotCi1UdXRvcmlhbAotLS0tLS0tLS0KLQotKiBVcGRhdGUgdHV0b3JpYWwgdG8gdXNlIHN0cmluZyBtZXRob2RzIGFuZCB0YWxrIGFib3V0IGJhY2t3YXJkCi0gIGNvbXBhdGliaWxpdHkgb2Ygc2FtZS4KLQotCi1OT1QgV09SVEggVEhFIFRST1VCTEUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0qIEluIHRoZSBpbmRleGVzLCBzb21lIHN1Yml0ZW0gZW50cmllcyBhcmUgc2VwYXJhdGVkIGZyb20gdGhlIGl0ZW0KLSAgZW50cmllcyBieSBjb2x1bW4tIG9yIHBhZ2UtYnJlYWtzLiAgUmVwb3J0ZWQgYnkgTG9yZW56byBNLiBDYXR1Y2NpCi0gIDxsb3JlbnpvQGFyZ29uLnJvbWEyLmluZm4uaXQ+LiAgVGhpcyBvbmUgd2lsbCBiZSBoYXJkOyBwcm9iYWJseSBub3QKLSAgcmVhbGx5IHdvcnRoIHRoZSBwYWluLiAgKE9ubHkgYW4gaXNzdWUgYXQgYWxsIHdoZW4gYSBoZWFkZXItbGV0dGVyCi0gIGFuZCB0aGUgZmlyc3QgaW5kZXggZW50cnkgZ2V0IHNlcGFyYXRlZCAtLSBjYW4gY2hhbmdlIGFzIHNvb24gYXMgd2UKLSAgY2hhbmdlIHRoZSBpbmRleCBlbnRyaWVzIGluIHRoZSB0ZXh0LikgIEFsc28gb25seSBhIHByb2JsZW0gaW4gdGhlCi0gIHByaW50IHZlcnNpb24uCi0KLSogRml4IHByb2JsZW0gd2l0aCBob3d0byBkb2N1bWVudHMgZ2V0dGluZyB0aGUgbGFzdCBtb2R1bGUgc3lub3BzaXMKLSAgdHdpY2UgKGluIFxsb2NhbG1vZHVsZXRhYmxlKSBzbyB3ZSBjYW4gZ2V0IHJpZCBvZiB0aGUgdWdseSAndW5pcScKLSAgaGFjayBpbiB0b29scy9ta2hvd3RvLiAgKFByb2JhYmx5IG5vdCB3b3J0aCB0aGUgdHJvdWJsZSBvZiBmaXhpbmcuKQpkaWZmIC0tZ2l0IGEvRG9jL2FwaS9hYnN0cmFjdC50ZXggYi9Eb2MvYXBpL2Fic3RyYWN0LnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViNTNkNy4uMDAwMDAwMAotLS0gYS9Eb2MvYXBpL2Fic3RyYWN0LnRleAorKysgL2Rldi9udWxsCkBAIC0xLDEwMzcgKzAsMCBAQAotXGNoYXB0ZXJ7QWJzdHJhY3QgT2JqZWN0cyBMYXllciBcbGFiZWx7YWJzdHJhY3R9fQotCi1UaGUgZnVuY3Rpb25zIGluIHRoaXMgY2hhcHRlciBpbnRlcmFjdCB3aXRoIFB5dGhvbiBvYmplY3RzIHJlZ2FyZGxlc3MKLW9mIHRoZWlyIHR5cGUsIG9yIHdpdGggd2lkZSBjbGFzc2VzIG9mIG9iamVjdCB0eXBlcyAoZS5nLiBhbGwKLW51bWVyaWNhbCB0eXBlcywgb3IgYWxsIHNlcXVlbmNlIHR5cGVzKS4gIFdoZW4gdXNlZCBvbiBvYmplY3QgdHlwZXMKLWZvciB3aGljaCB0aGV5IGRvIG5vdCBhcHBseSwgdGhleSB3aWxsIHJhaXNlIGEgUHl0aG9uIGV4Y2VwdGlvbi4KLQotSXQgaXMgbm90IHBvc3NpYmxlIHRvIHVzZSB0aGVzZSBmdW5jdGlvbnMgb24gb2JqZWN0cyB0aGF0IGFyZSBub3QgcHJvcGVybHkKLWluaXRpYWxpemVkLCBzdWNoIGFzIGEgbGlzdCBvYmplY3QgdGhhdCBoYXMgYmVlbiBjcmVhdGVkIGJ5Ci1cY2Z1bmN0aW9ue1B5TGlzdF9OZXcoKX0sIGJ1dCB3aG9zZSBpdGVtcyBoYXZlIG5vdCBiZWVuIHNldCB0byBzb21lCi1ub24tXGNvZGV7TlVMTH0gdmFsdWUgeWV0LgotCi1cc2VjdGlvbntPYmplY3QgUHJvdG9jb2wgXGxhYmVse29iamVjdH19Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlPYmplY3RfUHJpbnR9e1B5T2JqZWN0ICpvLCBGSUxFICpmcCwgaW50IGZsYWdzfQotICBQcmludCBhbiBvYmplY3QgXHZhcntvfSwgb24gZmlsZSBcdmFye2ZwfS4gIFJldHVybnMgXGNvZGV7LTF9IG9uCi0gIGVycm9yLiAgVGhlIGZsYWdzIGFyZ3VtZW50IGlzIHVzZWQgdG8gZW5hYmxlIGNlcnRhaW4gcHJpbnRpbmcKLSAgb3B0aW9ucy4gIFRoZSBvbmx5IG9wdGlvbiBjdXJyZW50bHkgc3VwcG9ydGVkIGlzCi0gIFxjb25zdGFudHtQeV9QUklOVF9SQVd9OyBpZiBnaXZlbiwgdGhlIFxmdW5jdGlvbntzdHIoKX0gb2YgdGhlCi0gIG9iamVjdCBpcyB3cml0dGVuIGluc3RlYWQgb2YgdGhlIFxmdW5jdGlvbntyZXByKCl9LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlPYmplY3RfSGFzQXR0clN0cmluZ317UHlPYmplY3QgKm8sIGNvbnN0IGNoYXIgKmF0dHJfbmFtZX0KLSAgUmV0dXJucyBcY29kZXsxfSBpZiBcdmFye299IGhhcyB0aGUgYXR0cmlidXRlIFx2YXJ7YXR0cl9uYW1lfSwgYW5kCi0gIFxjb2RlezB9IG90aGVyd2lzZS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb24KLSAgXHNhbXB7aGFzYXR0cihcdmFye299LCBcdmFye2F0dHJfbmFtZX0pfS4gIFRoaXMgZnVuY3Rpb24gYWx3YXlzCi0gIHN1Y2NlZWRzLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlPYmplY3RfR2V0QXR0clN0cmluZ317UHlPYmplY3QgKm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmF0dHJfbmFtZX0KLSAgUmV0cmlldmUgYW4gYXR0cmlidXRlIG5hbWVkIFx2YXJ7YXR0cl9uYW1lfSBmcm9tIG9iamVjdCBcdmFye299LgotICBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgdmFsdWUgb24gc3VjY2Vzcywgb3IgXE5VTEx7fSBvbiBmYWlsdXJlLgotICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbgotICBcc2FtcHtcdmFye299Llx2YXJ7YXR0cl9uYW1lfX0uCi1cZW5ke2NmdW5jZGVzY30KLQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5T2JqZWN0X0hhc0F0dHJ9e1B5T2JqZWN0ICpvLCBQeU9iamVjdCAqYXR0cl9uYW1lfQotICBSZXR1cm5zIFxjb2RlezF9IGlmIFx2YXJ7b30gaGFzIHRoZSBhdHRyaWJ1dGUgXHZhcnthdHRyX25hbWV9LCBhbmQKLSAgXGNvZGV7MH0gb3RoZXJ3aXNlLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbgotICBcc2FtcHtoYXNhdHRyKFx2YXJ7b30sIFx2YXJ7YXR0cl9uYW1lfSl9LiAgVGhpcyBmdW5jdGlvbiBhbHdheXMKLSAgc3VjY2VlZHMuCi1cZW5ke2NmdW5jZGVzY30KLQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5T2JqZWN0X0dldEF0dHJ9e1B5T2JqZWN0ICpvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXR0cl9uYW1lfQotICBSZXRyaWV2ZSBhbiBhdHRyaWJ1dGUgbmFtZWQgXHZhcnthdHRyX25hbWV9IGZyb20gb2JqZWN0IFx2YXJ7b30uCi0gIFJldHVybnMgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBvbiBzdWNjZXNzLCBvciBcTlVMTHt9IG9uIGZhaWx1cmUuICBUaGlzCi0gIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbgotICBcc2FtcHtcdmFye299Llx2YXJ7YXR0cl9uYW1lfX0uCi1cZW5ke2NmdW5jZGVzY30KLQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5T2JqZWN0X1NldEF0dHJTdHJpbmd9e1B5T2JqZWN0ICpvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphdHRyX25hbWUsIFB5T2JqZWN0ICp2fQotICBTZXQgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgbmFtZWQgXHZhcnthdHRyX25hbWV9LCBmb3Igb2JqZWN0Ci0gIFx2YXJ7b30sIHRvIHRoZSB2YWx1ZSBcdmFye3Z9LiBSZXR1cm5zIFxjb2Rley0xfSBvbiBmYWlsdXJlLiAgVGhpcwotICBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIHN0YXRlbWVudAotICBcc2FtcHtcdmFye299Llx2YXJ7YXR0cl9uYW1lfSA9IFx2YXJ7dn19LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeU9iamVjdF9TZXRBdHRyfXtQeU9iamVjdCAqbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmF0dHJfbmFtZSwgUHlPYmplY3QgKnZ9Ci0gIFNldCB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBuYW1lZCBcdmFye2F0dHJfbmFtZX0sIGZvciBvYmplY3QKLSAgXHZhcntvfSwgdG8gdGhlIHZhbHVlIFx2YXJ7dn0uIFJldHVybnMgXGNvZGV7LTF9IG9uIGZhaWx1cmUuICBUaGlzCi0gIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gc3RhdGVtZW50Ci0gIFxzYW1we1x2YXJ7b30uXHZhcnthdHRyX25hbWV9ID0gXHZhcnt2fX0uCi1cZW5ke2NmdW5jZGVzY30KLQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5T2JqZWN0X0RlbEF0dHJTdHJpbmd9e1B5T2JqZWN0ICpvLCBjb25zdCBjaGFyICphdHRyX25hbWV9Ci0gIERlbGV0ZSBhdHRyaWJ1dGUgbmFtZWQgXHZhcnthdHRyX25hbWV9LCBmb3Igb2JqZWN0IFx2YXJ7b30uIFJldHVybnMKLSAgXGNvZGV7LTF9IG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLSAgc3RhdGVtZW50OiBcc2FtcHtkZWwgXHZhcntvfS5cdmFye2F0dHJfbmFtZX19LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeU9iamVjdF9EZWxBdHRyfXtQeU9iamVjdCAqbywgUHlPYmplY3QgKmF0dHJfbmFtZX0KLSAgRGVsZXRlIGF0dHJpYnV0ZSBuYW1lZCBcdmFye2F0dHJfbmFtZX0sIGZvciBvYmplY3QgXHZhcntvfS4gUmV0dXJucwotICBcY29kZXstMX0gb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotICBzdGF0ZW1lbnQgXHNhbXB7ZGVsIFx2YXJ7b30uXHZhcnthdHRyX25hbWV9fS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlPYmplY3RfUmljaENvbXBhcmV9e1B5T2JqZWN0ICpvMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpvMiwgaW50IG9waWR9Ci0gIENvbXBhcmUgdGhlIHZhbHVlcyBvZiBcdmFye28xfSBhbmQgXHZhcntvMn0gdXNpbmcgdGhlIG9wZXJhdGlvbgotICBzcGVjaWZpZWQgYnkgXHZhcntvcGlkfSwgd2hpY2ggbXVzdCBiZSBvbmUgb2YKLSAgXGNvbnN0YW50e1B5X0xUfSwKLSAgXGNvbnN0YW50e1B5X0xFfSwKLSAgXGNvbnN0YW50e1B5X0VRfSwKLSAgXGNvbnN0YW50e1B5X05FfSwKLSAgXGNvbnN0YW50e1B5X0dUfSwgb3IKLSAgXGNvbnN0YW50e1B5X0dFfSwgY29ycmVzcG9uZGluZyB0bwotICBcY29kZXs8fSwKLSAgXGNvZGV7PD19LAotICBcY29kZXs9PX0sCi0gIFxjb2RleyE9fSwKLSAgXGNvZGV7Pn0sIG9yCi0gIFxjb2Rlez49fSByZXNwZWN0aXZlbHkuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uCi0gIFxzYW1we1x2YXJ7bzF9IG9wIFx2YXJ7bzJ9fSwgd2hlcmUgXGNvZGV7b3B9IGlzIHRoZSBvcGVyYXRvcgotICBjb3JyZXNwb25kaW5nIHRvIFx2YXJ7b3BpZH0uIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBjb21wYXJpc29uIG9uCi0gIHN1Y2Nlc3MsIG9yIFxOVUxMe30gb24gZmFpbHVyZS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5T2JqZWN0X1JpY2hDb21wYXJlQm9vbH17UHlPYmplY3QgKm8xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpvMiwgaW50IG9waWR9Ci0gIENvbXBhcmUgdGhlIHZhbHVlcyBvZiBcdmFye28xfSBhbmQgXHZhcntvMn0gdXNpbmcgdGhlIG9wZXJhdGlvbgotICBzcGVjaWZpZWQgYnkgXHZhcntvcGlkfSwgd2hpY2ggbXVzdCBiZSBvbmUgb2YKLSAgXGNvbnN0YW50e1B5X0xUfSwKLSAgXGNvbnN0YW50e1B5X0xFfSwKLSAgXGNvbnN0YW50e1B5X0VRfSwKLSAgXGNvbnN0YW50e1B5X05FfSwKLSAgXGNvbnN0YW50e1B5X0dUfSwgb3IKLSAgXGNvbnN0YW50e1B5X0dFfSwgY29ycmVzcG9uZGluZyB0bwotICBcY29kZXs8fSwKLSAgXGNvZGV7PD19LAotICBcY29kZXs9PX0sCi0gIFxjb2RleyE9fSwKLSAgXGNvZGV7Pn0sIG9yCi0gIFxjb2Rlez49fSByZXNwZWN0aXZlbHkuIFJldHVybnMgXGNvZGV7LTF9IG9uIGVycm9yLCBcY29kZXswfSBpZiB0aGUKLSAgcmVzdWx0IGlzIGZhbHNlLCBcY29kZXsxfSBvdGhlcndpc2UuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlCi0gIFB5dGhvbiBleHByZXNzaW9uIFxzYW1we1x2YXJ7bzF9IG9wIFx2YXJ7bzJ9fSwgd2hlcmUKLSAgXGNvZGV7b3B9IGlzIHRoZSBvcGVyYXRvciBjb3JyZXNwb25kaW5nIHRvIFx2YXJ7b3BpZH0uCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeU9iamVjdF9DbXB9e1B5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yLCBpbnQgKnJlc3VsdH0KLSAgQ29tcGFyZSB0aGUgdmFsdWVzIG9mIFx2YXJ7bzF9IGFuZCBcdmFye28yfSB1c2luZyBhIHJvdXRpbmUgcHJvdmlkZWQKLSAgYnkgXHZhcntvMX0sIGlmIG9uZSBleGlzdHMsIG90aGVyd2lzZSB3aXRoIGEgcm91dGluZSBwcm92aWRlZCBieQotICBcdmFye28yfS4gIFRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmlzb24gaXMgcmV0dXJuZWQgaW4KLSAgXHZhcntyZXN1bHR9LiAgUmV0dXJucyBcY29kZXstMX0gb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQKLSAgb2YgdGhlIFB5dGhvbiBzdGF0ZW1lbnRcYmlmdW5jaW5kZXh7Y21wfSBcc2FtcHtcdmFye3Jlc3VsdH0gPQotICBjbXAoXHZhcntvMX0sIFx2YXJ7bzJ9KX0uCi1cZW5ke2NmdW5jZGVzY30KLQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5T2JqZWN0X0NvbXBhcmV9e1B5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yfQotICBDb21wYXJlIHRoZSB2YWx1ZXMgb2YgXHZhcntvMX0gYW5kIFx2YXJ7bzJ9IHVzaW5nIGEgcm91dGluZSBwcm92aWRlZAotICBieSBcdmFye28xfSwgaWYgb25lIGV4aXN0cywgb3RoZXJ3aXNlIHdpdGggYSByb3V0aW5lIHByb3ZpZGVkIGJ5Ci0gIFx2YXJ7bzJ9LiAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIG9uIHN1Y2Nlc3MuICBPbgotICBlcnJvciwgdGhlIHZhbHVlIHJldHVybmVkIGlzIHVuZGVmaW5lZDsgdXNlCi0gIFxjZnVuY3Rpb257UHlFcnJfT2NjdXJyZWQoKX0gdG8gZGV0ZWN0IGFuIGVycm9yLiAgVGhpcyBpcyBlcXVpdmFsZW50Ci0gIHRvIHRoZSBQeXRob24gZXhwcmVzc2lvblxiaWZ1bmNpbmRleHtjbXB9IFxzYW1we2NtcChcdmFye28xfSwKLSAgXHZhcntvMn0pfS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlPYmplY3RfUmVwcn17UHlPYmplY3QgKm99Ci0gIENvbXB1dGUgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2Ygb2JqZWN0IFx2YXJ7b30uICBSZXR1cm5zIHRoZQotICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb24gc3VjY2VzcywgXE5VTEx7fSBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUKLSAgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb24gXHNhbXB7cmVwcihcdmFye299KX0uICBDYWxsZWQgYnkKLSAgdGhlIFxmdW5jdGlvbntyZXByKCl9XGJpZnVuY2luZGV4e3JlcHJ9IGJ1aWx0LWluIGZ1bmN0aW9uIGFuZCBieQotICByZXZlcnNlIHF1b3Rlcy4KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlPYmplY3RfU3RyfXtQeU9iamVjdCAqb30KLSAgQ29tcHV0ZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBvYmplY3QgXHZhcntvfS4gIFJldHVybnMgdGhlCi0gIHN0cmluZyByZXByZXNlbnRhdGlvbiBvbiBzdWNjZXNzLCBcTlVMTHt9IG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZQotICBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbiBcc2FtcHtzdHIoXHZhcntvfSl9LiAgQ2FsbGVkIGJ5Ci0gIHRoZSBcZnVuY3Rpb257c3RyKCl9XGJpZnVuY2luZGV4e3N0cn0gYnVpbHQtaW4gZnVuY3Rpb24gYW5kIGJ5IHRoZQotICBca2V5d29yZHtwcmludH0gc3RhdGVtZW50LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeU9iamVjdF9Vbmljb2RlfXtQeU9iamVjdCAqb30KLSAgQ29tcHV0ZSBhIFVuaWNvZGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIG9iamVjdCBcdmFye299LiAgUmV0dXJucwotICB0aGUgVW5pY29kZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb24gc3VjY2VzcywgXE5VTEx7fSBvbiBmYWlsdXJlLgotICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbgotICBcc2FtcHt1bmljb2RlKFx2YXJ7b30pfS4gIENhbGxlZCBieSB0aGUKLSAgXGZ1bmN0aW9ue3VuaWNvZGUoKX1cYmlmdW5jaW5kZXh7dW5pY29kZX0gYnVpbHQtaW4gZnVuY3Rpb24uCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeU9iamVjdF9Jc0luc3RhbmNlfXtQeU9iamVjdCAqaW5zdCwgUHlPYmplY3QgKmNsc30KLSAgUmV0dXJucyBcY29kZXsxfSBpZiBcdmFye2luc3R9IGlzIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyBcdmFye2Nsc30KLSAgb3IgYSBzdWJjbGFzcyBvZiBcdmFye2Nsc30sIG9yIFxjb2RlezB9IGlmIG5vdC4gIE9uIGVycm9yLCByZXR1cm5zCi0gIFxjb2Rley0xfSBhbmQgc2V0cyBhbiBleGNlcHRpb24uICBJZiBcdmFye2Nsc30gaXMgYSB0eXBlIG9iamVjdAotICByYXRoZXIgdGhhbiBhIGNsYXNzIG9iamVjdCwgXGNmdW5jdGlvbntQeU9iamVjdF9Jc0luc3RhbmNlKCl9Ci0gIHJldHVybnMgXGNvZGV7MX0gaWYgXHZhcntpbnN0fSBpcyBvZiB0eXBlIFx2YXJ7Y2xzfS4gIElmIFx2YXJ7Y2xzfQotICBpcyBhIHR1cGxlLCB0aGUgY2hlY2sgd2lsbCBiZSBkb25lIGFnYWluc3QgZXZlcnkgZW50cnkgaW4gXHZhcntjbHN9LgotICBUaGUgcmVzdWx0IHdpbGwgYmUgXGNvZGV7MX0gd2hlbiBhdCBsZWFzdCBvbmUgb2YgdGhlIGNoZWNrcyByZXR1cm5zCi0gIFxjb2RlezF9LCBvdGhlcndpc2UgaXQgd2lsbCBiZSBcY29kZXswfS4gSWYgXHZhcntpbnN0fSBpcyBub3QgYSBjbGFzcwotICBpbnN0YW5jZSBhbmQgXHZhcntjbHN9IGlzIG5laXRoZXIgYSB0eXBlIG9iamVjdCwgbm9yIGEgY2xhc3Mgb2JqZWN0LAotICBub3IgYSB0dXBsZSwgXHZhcntpbnN0fSBtdXN0IGhhdmUgYSBcbWVtYmVye19fY2xhc3NfX30gYXR0cmlidXRlCi0gIC0tLSB0aGUgY2xhc3MgcmVsYXRpb25zaGlwIG9mIHRoZSB2YWx1ZSBvZiB0aGF0IGF0dHJpYnV0ZSB3aXRoCi0gIFx2YXJ7Y2xzfSB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSByZXN1bHQgb2YgdGhpcyBmdW5jdGlvbi4KLSAgXHZlcnNpb25hZGRlZHsyLjF9Ci0gIFx2ZXJzaW9uY2hhbmdlZFtTdXBwb3J0IGZvciBhIHR1cGxlIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgYWRkZWRdezIuMn0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1TdWJjbGFzcyBkZXRlcm1pbmF0aW9uIGlzIGRvbmUgaW4gYSBmYWlybHkgc3RyYWlnaHRmb3J3YXJkIHdheSwgYnV0Ci1pbmNsdWRlcyBhIHdyaW5rbGUgdGhhdCBpbXBsZW1lbnRvcnMgb2YgZXh0ZW5zaW9ucyB0byB0aGUgY2xhc3Mgc3lzdGVtCi1tYXkgd2FudCB0byBiZSBhd2FyZSBvZi4gIElmIFxjbGFzc3tBfSBhbmQgXGNsYXNze0J9IGFyZSBjbGFzcwotb2JqZWN0cywgXGNsYXNze0J9IGlzIGEgc3ViY2xhc3Mgb2YgXGNsYXNze0F9IGlmIGl0IGluaGVyaXRzIGZyb20KLVxjbGFzc3tBfSBlaXRoZXIgZGlyZWN0bHkgb3IgaW5kaXJlY3RseS4gIElmIGVpdGhlciBpcyBub3QgYSBjbGFzcwotb2JqZWN0LCBhIG1vcmUgZ2VuZXJhbCBtZWNoYW5pc20gaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGNsYXNzCi1yZWxhdGlvbnNoaXAgb2YgdGhlIHR3byBvYmplY3RzLiAgV2hlbiB0ZXN0aW5nIGlmIFx2YXJ7Qn0gaXMgYQotc3ViY2xhc3Mgb2YgXHZhcntBfSwgaWYgXHZhcntBfSBpcyBcdmFye0J9LAotXGNmdW5jdGlvbntQeU9iamVjdF9Jc1N1YmNsYXNzKCl9IHJldHVybnMgdHJ1ZS4gIElmIFx2YXJ7QX0gYW5kCi1cdmFye0J9IGFyZSBkaWZmZXJlbnQgb2JqZWN0cywgXHZhcntCfSdzIFxtZW1iZXJ7X19iYXNlc19ffSBhdHRyaWJ1dGUKLWlzIHNlYXJjaGVkIGluIGEgZGVwdGgtZmlyc3QgZmFzaGlvbiBmb3IgXHZhcntBfSAtLS0gdGhlIHByZXNlbmNlIG9mCi10aGUgXG1lbWJlcntfX2Jhc2VzX199IGF0dHJpYnV0ZSBpcyBjb25zaWRlcmVkIHN1ZmZpY2llbnQgZm9yIHRoaXMKLWRldGVybWluYXRpb24uCi0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlPYmplY3RfSXNTdWJjbGFzc317UHlPYmplY3QgKmRlcml2ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpjbHN9Ci0gIFJldHVybnMgXGNvZGV7MX0gaWYgdGhlIGNsYXNzIFx2YXJ7ZGVyaXZlZH0gaXMgaWRlbnRpY2FsIHRvIG9yCi0gIGRlcml2ZWQgZnJvbSB0aGUgY2xhc3MgXHZhcntjbHN9LCBvdGhlcndpc2UgcmV0dXJucyBcY29kZXswfS4gIEluCi0gIGNhc2Ugb2YgYW4gZXJyb3IsIHJldHVybnMgXGNvZGV7LTF9LiBJZiBcdmFye2Nsc30KLSAgaXMgYSB0dXBsZSwgdGhlIGNoZWNrIHdpbGwgYmUgZG9uZSBhZ2FpbnN0IGV2ZXJ5IGVudHJ5IGluIFx2YXJ7Y2xzfS4KLSAgVGhlIHJlc3VsdCB3aWxsIGJlIFxjb2RlezF9IHdoZW4gYXQgbGVhc3Qgb25lIG9mIHRoZSBjaGVja3MgcmV0dXJucwotICBcY29kZXsxfSwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgXGNvZGV7MH0uIElmIGVpdGhlciBcdmFye2Rlcml2ZWR9IG9yCi0gIFx2YXJ7Y2xzfSBpcyBub3QgYW4gYWN0dWFsIGNsYXNzIG9iamVjdCAob3IgdHVwbGUpLCB0aGlzIGZ1bmN0aW9uCi0gIHVzZXMgdGhlIGdlbmVyaWMgYWxnb3JpdGhtIGRlc2NyaWJlZCBhYm92ZS4KLSAgXHZlcnNpb25hZGRlZHsyLjF9Ci0gIFx2ZXJzaW9uY2hhbmdlZFtPbGRlciB2ZXJzaW9ucyBvZiBQeXRob24gZGlkIG5vdCBzdXBwb3J0IGEgdHVwbGUKLSAgICAgICAgICAgICAgICAgIGFzIHRoZSBzZWNvbmQgYXJndW1lbnRdezIuM30KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlDYWxsYWJsZV9DaGVja317UHlPYmplY3QgKm99Ci0gIERldGVybWluZSBpZiB0aGUgb2JqZWN0IFx2YXJ7b30gaXMgY2FsbGFibGUuICBSZXR1cm4gXGNvZGV7MX0gaWYgdGhlCi0gIG9iamVjdCBpcyBjYWxsYWJsZSBhbmQgXGNvZGV7MH0gb3RoZXJ3aXNlLiAgVGhpcyBmdW5jdGlvbiBhbHdheXMKLSAgc3VjY2VlZHMuCi1cZW5ke2NmdW5jZGVzY30KLQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5T2JqZWN0X0NhbGx9e1B5T2JqZWN0ICpjYWxsYWJsZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqa3d9Ci0gIENhbGwgYSBjYWxsYWJsZSBQeXRob24gb2JqZWN0IFx2YXJ7Y2FsbGFibGVfb2JqZWN0fSwgd2l0aCBhcmd1bWVudHMKLSAgZ2l2ZW4gYnkgdGhlIHR1cGxlIFx2YXJ7YXJnc30sIGFuZCBuYW1lZCBhcmd1bWVudHMgZ2l2ZW4gYnkgdGhlCi0gIGRpY3Rpb25hcnkgXHZhcntrd30uIElmIG5vIG5hbWVkIGFyZ3VtZW50cyBhcmUgbmVlZGVkLCBcdmFye2t3fSBtYXkKLSAgYmUgXE5VTEx7fS4gXHZhcnthcmdzfSBtdXN0IG5vdCBiZSBcTlVMTHt9LCB1c2UgYW4gZW1wdHkgdHVwbGUgaWYKLSAgbm8gYXJndW1lbnRzIGFyZSBuZWVkZWQuIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgY2FsbCBvbiBzdWNjZXNzLAotICBvciBcTlVMTHt9IG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLSAgZXhwcmVzc2lvbiBcc2FtcHtcdmFye2NhbGxhYmxlX29iamVjdH0oKlx2YXJ7YXJnc30sICoqXHZhcntrd30pfS4KLSAgXHZlcnNpb25hZGRlZHsyLjJ9Ci1cZW5ke2NmdW5jZGVzY30KLQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5T2JqZWN0X0NhbGxPYmplY3R9e1B5T2JqZWN0ICpjYWxsYWJsZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzfQotICBDYWxsIGEgY2FsbGFibGUgUHl0aG9uIG9iamVjdCBcdmFye2NhbGxhYmxlX29iamVjdH0sIHdpdGggYXJndW1lbnRzCi0gIGdpdmVuIGJ5IHRoZSB0dXBsZSBcdmFye2FyZ3N9LiAgSWYgbm8gYXJndW1lbnRzIGFyZSBuZWVkZWQsIHRoZW4KLSAgXHZhcnthcmdzfSBtYXkgYmUgXE5VTEwuICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGNhbGwgb24KLSAgc3VjY2Vzcywgb3IgXE5VTEx7fSBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUKLSAgUHl0aG9uIGV4cHJlc3Npb24gXHNhbXB7XHZhcntjYWxsYWJsZV9vYmplY3R9KCpcdmFye2FyZ3N9KX0uCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeU9iamVjdF9DYWxsRnVuY3Rpb259e1B5T2JqZWN0ICpjYWxsYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpmb3JtYXQsIFxtb3JlYXJnc30KLSAgQ2FsbCBhIGNhbGxhYmxlIFB5dGhvbiBvYmplY3QgXHZhcntjYWxsYWJsZX0sIHdpdGggYSB2YXJpYWJsZQotICBudW1iZXIgb2YgQyBhcmd1bWVudHMuICBUaGUgQyBhcmd1bWVudHMgYXJlIGRlc2NyaWJlZCB1c2luZyBhCi0gIFxjZnVuY3Rpb257UHlfQnVpbGRWYWx1ZSgpfSBzdHlsZSBmb3JtYXQgc3RyaW5nLiAgVGhlIGZvcm1hdCBtYXkgYmUKLSAgXE5VTEwsIGluZGljYXRpbmcgdGhhdCBubyBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLiAgUmV0dXJucyB0aGUKLSAgcmVzdWx0IG9mIHRoZSBjYWxsIG9uIHN1Y2Nlc3MsIG9yIFxOVUxMe30gb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlCi0gIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uIFxzYW1we1x2YXJ7Y2FsbGFibGV9KCpcdmFye2FyZ3N9KX0uCi0gIE5vdGUgdGhhdCBpZiB5b3Ugb25seSBwYXNzIFxjdHlwZXtQeU9iamVjdCAqfSBhcmdzLAotICBcY2Z1bmN0aW9ue1B5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3N9IGlzIGEgZmFzdGVyIGFsdGVybmF0aXZlLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeU9iamVjdF9DYWxsTWV0aG9kfXtQeU9iamVjdCAqbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqbWV0aG9kLCBjaGFyICpmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxtb3JlYXJnc30KLSAgQ2FsbCB0aGUgbWV0aG9kIG5hbWVkIFx2YXJ7bWV0aG9kfSBvZiBvYmplY3QgXHZhcntvfSB3aXRoIGEgdmFyaWFibGUKLSAgbnVtYmVyIG9mIEMgYXJndW1lbnRzLiAgVGhlIEMgYXJndW1lbnRzIGFyZSBkZXNjcmliZWQgYnkgYQotICBcY2Z1bmN0aW9ue1B5X0J1aWxkVmFsdWUoKX0gZm9ybWF0IHN0cmluZyB0aGF0IHNob3VsZCAKLSAgcHJvZHVjZSBhIHR1cGxlLiAgVGhlIGZvcm1hdCBtYXkgYmUgXE5VTEwsCi0gIGluZGljYXRpbmcgdGhhdCBubyBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlCi0gIGNhbGwgb24gc3VjY2Vzcywgb3IgXE5VTEx7fSBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZgotICB0aGUgUHl0aG9uIGV4cHJlc3Npb24gXHNhbXB7XHZhcntvfS5cdmFye21ldGhvZH0oXHZhcnthcmdzfSl9LgotICBOb3RlIHRoYXQgaWYgeW91IG9ubHkgcGFzcyBcY3R5cGV7UHlPYmplY3QgKn0gYXJncywKLSAgXGNmdW5jdGlvbntQeU9iamVjdF9DYWxsTWV0aG9kT2JqQXJnc30gaXMgYSBmYXN0ZXIgYWx0ZXJuYXRpdmUuCi1cZW5ke2NmdW5jZGVzY30KLQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3N9e1B5T2JqZWN0ICpjYWxsYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG1vcmVhcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcY29kZXtOVUxMfX0KLSAgQ2FsbCBhIGNhbGxhYmxlIFB5dGhvbiBvYmplY3QgXHZhcntjYWxsYWJsZX0sIHdpdGggYSB2YXJpYWJsZQotICBudW1iZXIgb2YgXGN0eXBle1B5T2JqZWN0Kn0gYXJndW1lbnRzLiAgVGhlIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQKLSAgYXMgYSB2YXJpYWJsZSBudW1iZXIgb2YgcGFyYW1ldGVycyBmb2xsb3dlZCBieSBcTlVMTC4KLSAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBjYWxsIG9uIHN1Y2Nlc3MsIG9yIFxOVUxMe30gb24gZmFpbHVyZS4KLSAgXHZlcnNpb25hZGRlZHsyLjJ9Ci1cZW5ke2NmdW5jZGVzY30KLQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzfXtQeU9iamVjdCAqbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG1vcmVhcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXGNvZGV7TlVMTH19Ci0gIENhbGxzIGEgbWV0aG9kIG9mIHRoZSBvYmplY3QgXHZhcntvfSwgd2hlcmUgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZAotICBpcyBnaXZlbiBhcyBhIFB5dGhvbiBzdHJpbmcgb2JqZWN0IGluIFx2YXJ7bmFtZX0uICBJdCBpcyBjYWxsZWQgd2l0aAotICBhIHZhcmlhYmxlIG51bWJlciBvZiBcY3R5cGV7UHlPYmplY3QqfSBhcmd1bWVudHMuICBUaGUgYXJndW1lbnRzIGFyZQotICBwcm92aWRlZCBhcyBhIHZhcmlhYmxlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGZvbGxvd2VkIGJ5IFxOVUxMLgotICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGNhbGwgb24gc3VjY2Vzcywgb3IgXE5VTEx7fSBvbiBmYWlsdXJlLgotICBcdmVyc2lvbmFkZGVkezIuMn0KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxiZWdpbntjZnVuY2Rlc2N9e2xvbmd9e1B5T2JqZWN0X0hhc2h9e1B5T2JqZWN0ICpvfQotICBDb21wdXRlIGFuZCByZXR1cm4gdGhlIGhhc2ggdmFsdWUgb2YgYW4gb2JqZWN0IFx2YXJ7b30uICBPbiBmYWlsdXJlLAotICByZXR1cm4gXGNvZGV7LTF9LiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb24KLSAgXHNhbXB7aGFzaChcdmFye299KX0uXGJpZnVuY2luZGV4e2hhc2h9Ci1cZW5ke2NmdW5jZGVzY30KLQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5T2JqZWN0X0lzVHJ1ZX17UHlPYmplY3QgKm99Ci0gIFJldHVybnMgXGNvZGV7MX0gaWYgdGhlIG9iamVjdCBcdmFye299IGlzIGNvbnNpZGVyZWQgdG8gYmUgdHJ1ZSwgYW5kCi0gIFxjb2RlezB9IG90aGVyd2lzZS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb24KLSAgXHNhbXB7bm90IG5vdCBcdmFye299fS4gIE9uIGZhaWx1cmUsIHJldHVybiBcY29kZXstMX0uIAotXGVuZHtjZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeU9iamVjdF9Ob3R9e1B5T2JqZWN0ICpvfQotICBSZXR1cm5zIFxjb2RlezB9IGlmIHRoZSBvYmplY3QgXHZhcntvfSBpcyBjb25zaWRlcmVkIHRvIGJlIHRydWUsIGFuZAotICBcY29kZXsxfSBvdGhlcndpc2UuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbiBleHByZXNzaW9uCi0gIFxzYW1we25vdCBcdmFye299fS4gIE9uIGZhaWx1cmUsIHJldHVybiBcY29kZXstMX0uIAotXGVuZHtjZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeU9iamVjdF9UeXBlfXtQeU9iamVjdCAqb30KLSAgV2hlbiBcdmFye299IGlzIG5vbi1cTlVMTCwgcmV0dXJucyBhIHR5cGUgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8KLSAgdGhlIG9iamVjdCB0eXBlIG9mIG9iamVjdCBcdmFye299LiBPbiBmYWlsdXJlLCByYWlzZXMKLSAgXGV4Y2VwdGlvbntTeXN0ZW1FcnJvcn0gYW5kIHJldHVybnMgXE5VTEwuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KLSAgdGhlIFB5dGhvbiBleHByZXNzaW9uIFxjb2Rle3R5cGUoXHZhcntvfSl9LlxiaWZ1bmNpbmRleHt0eXBlfQotICBUaGlzIGZ1bmN0aW9uIGluY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgcmV0dXJuIHZhbHVlLgotICBUaGVyZSdzIHJlYWxseSBubyByZWFzb24gdG8gdXNlIHRoaXMgZnVuY3Rpb24gaW5zdGVhZCBvZiB0aGUKLSAgY29tbW9uIGV4cHJlc3Npb24gXGNvZGV7XHZhcntvfS0+b2JfdHlwZX0sIHdoaWNoIHJldHVybnMgYSBwb2ludGVyCi0gIG9mIHR5cGUgXGN0eXBle1B5VHlwZU9iamVjdCp9LCBleGNlcHQgd2hlbiB0aGUgaW5jcmVtZW50ZWQgcmVmZXJlbmNlCi0gIGNvdW50IGlzIG5lZWRlZC4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5T2JqZWN0X1R5cGVDaGVja317UHlPYmplY3QgKm8sIFB5VHlwZU9iamVjdCAqdHlwZX0KLSAgUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBcdmFye299IGlzIG9mIHR5cGUgXHZhcnt0eXBlfSBvciBhIHN1YnR5cGUKLSAgb2YgXHZhcnt0eXBlfS4gIEJvdGggcGFyYW1ldGVycyBtdXN0IGJlIG5vbi1cTlVMTC4KLSAgXHZlcnNpb25hZGRlZHsyLjJ9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlfc3NpemVfdH17UHlPYmplY3RfTGVuZ3RofXtQeU9iamVjdCAqb30KLVxjZnVuY2xpbmV7UHlfc3NpemVfdH17UHlPYmplY3RfU2l6ZX17UHlPYmplY3QgKm99Ci0gIFJldHVybiB0aGUgbGVuZ3RoIG9mIG9iamVjdCBcdmFye299LiAgSWYgdGhlIG9iamVjdCBcdmFye299IHByb3ZpZGVzCi0gIGVpdGhlciB0aGUgc2VxdWVuY2UgYW5kIG1hcHBpbmcgcHJvdG9jb2xzLCB0aGUgc2VxdWVuY2UgbGVuZ3RoIGlzCi0gIHJldHVybmVkLiAgT24gZXJyb3IsIFxjb2Rley0xfSBpcyByZXR1cm5lZC4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQKLSAgdG8gdGhlIFB5dGhvbiBleHByZXNzaW9uIFxzYW1we2xlbihcdmFye299KX0uXGJpZnVuY2luZGV4e2xlbn0KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlPYmplY3RfR2V0SXRlbX17UHlPYmplY3QgKm8sIFB5T2JqZWN0ICprZXl9Ci0gIFJldHVybiBlbGVtZW50IG9mIFx2YXJ7b30gY29ycmVzcG9uZGluZyB0byB0aGUgb2JqZWN0IFx2YXJ7a2V5fSBvcgotICBcTlVMTHt9IG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbgotICBcc2FtcHtcdmFye299W1x2YXJ7a2V5fV19LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeU9iamVjdF9TZXRJdGVtfXtQeU9iamVjdCAqbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmtleSwgUHlPYmplY3QgKnZ9Ci0gIE1hcCB0aGUgb2JqZWN0IFx2YXJ7a2V5fSB0byB0aGUgdmFsdWUgXHZhcnt2fS4gIFJldHVybnMgXGNvZGV7LTF9IG9uCi0gIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gc3RhdGVtZW50Ci0gIFxzYW1we1x2YXJ7b31bXHZhcntrZXl9XSA9IFx2YXJ7dn19LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeU9iamVjdF9EZWxJdGVtfXtQeU9iamVjdCAqbywgUHlPYmplY3QgKmtleX0KLSAgRGVsZXRlIHRoZSBtYXBwaW5nIGZvciBcdmFye2tleX0gZnJvbSBcdmFye299LiAgUmV0dXJucyBcY29kZXstMX0gb24KLSAgZmFpbHVyZS4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIHN0YXRlbWVudCBcc2FtcHtkZWwKLSAgXHZhcntvfVtcdmFye2tleX1dfS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5T2JqZWN0X0FzRmlsZURlc2NyaXB0b3J9e1B5T2JqZWN0ICpvfQotICBEZXJpdmVzIGEgZmlsZS1kZXNjcmlwdG9yIGZyb20gYSBQeXRob24gb2JqZWN0LiAgSWYgdGhlIG9iamVjdCBpcyBhbgotICBpbnRlZ2VyIG9yIGxvbmcgaW50ZWdlciwgaXRzIHZhbHVlIGlzIHJldHVybmVkLiAgSWYgbm90LCB0aGUKLSAgb2JqZWN0J3MgXG1ldGhvZHtmaWxlbm8oKX0gbWV0aG9kIGlzIGNhbGxlZCBpZiBpdCBleGlzdHM7IHRoZSBtZXRob2QKLSAgbXVzdCByZXR1cm4gYW4gaW50ZWdlciBvciBsb25nIGludGVnZXIsIHdoaWNoIGlzIHJldHVybmVkIGFzIHRoZQotICBmaWxlIGRlc2NyaXB0b3IgdmFsdWUuICBSZXR1cm5zIFxjb2Rley0xfSBvbiBmYWlsdXJlLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlPYmplY3RfRGlyfXtQeU9iamVjdCAqb30KLSAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbiBcc2FtcHtkaXIoXHZhcntvfSl9LAotICByZXR1cm5pbmcgYSAocG9zc2libHkgZW1wdHkpIGxpc3Qgb2Ygc3RyaW5ncyBhcHByb3ByaWF0ZSBmb3IgdGhlCi0gIG9iamVjdCBhcmd1bWVudCwgb3IgXE5VTEx7fSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IuICBJZiB0aGUgYXJndW1lbnQKLSAgaXMgXE5VTEwsIHRoaXMgaXMgbGlrZSB0aGUgUHl0aG9uIFxzYW1we2RpcigpfSwgcmV0dXJuaW5nIHRoZSBuYW1lcwotICBvZiB0aGUgY3VycmVudCBsb2NhbHM7IGluIHRoaXMgY2FzZSwgaWYgbm8gZXhlY3V0aW9uIGZyYW1lIGlzIGFjdGl2ZQotICB0aGVuIFxOVUxMe30gaXMgcmV0dXJuZWQgYnV0IFxjZnVuY3Rpb257UHlFcnJfT2NjdXJyZWQoKX0gd2lsbAotICByZXR1cm4gZmFsc2UuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeU9iamVjdF9HZXRJdGVyfXtQeU9iamVjdCAqb30KLSAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbiBcc2FtcHtpdGVyKFx2YXJ7b30pfS4KLSAgSXQgcmV0dXJucyBhIG5ldyBpdGVyYXRvciBmb3IgdGhlIG9iamVjdCBhcmd1bWVudCwgb3IgdGhlIG9iamVjdCAKLSAgaXRzZWxmIGlmIHRoZSBvYmplY3QgaXMgYWxyZWFkeSBhbiBpdGVyYXRvci4gIFJhaXNlcwotICBcZXhjZXB0aW9ue1R5cGVFcnJvcn0gYW5kIHJldHVybnMgXE5VTEx7fSBpZiB0aGUgb2JqZWN0IGNhbm5vdCBiZQotICBpdGVyYXRlZC4KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxzZWN0aW9ue051bWJlciBQcm90b2NvbCBcbGFiZWx7bnVtYmVyfX0KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeU51bWJlcl9DaGVja317UHlPYmplY3QgKm99Ci0gIFJldHVybnMgXGNvZGV7MX0gaWYgdGhlIG9iamVjdCBcdmFye299IHByb3ZpZGVzIG51bWVyaWMgcHJvdG9jb2xzLAotICBhbmQgZmFsc2Ugb3RoZXJ3aXNlLiAgVGhpcyBmdW5jdGlvbiBhbHdheXMgc3VjY2VlZHMuCi1cZW5ke2NmdW5jZGVzY30KLQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5TnVtYmVyX0FkZH17UHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzJ9Ci0gIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhZGRpbmcgXHZhcntvMX0gYW5kIFx2YXJ7bzJ9LCBvciBcTlVMTHt9IG9uCi0gIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbgotICBcc2FtcHtcdmFye28xfSArIFx2YXJ7bzJ9fS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlOdW1iZXJfU3VidHJhY3R9e1B5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yfQotICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc3VidHJhY3RpbmcgXHZhcntvMn0gZnJvbSBcdmFye28xfSwgb3IgXE5VTEx7fQotICBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb24KLSAgXHNhbXB7XHZhcntvMX0gLSBcdmFye28yfX0uCi1cZW5ke2NmdW5jZGVzY30KLQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5TnVtYmVyX011bHRpcGx5fXtQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMn0KLSAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIG11bHRpcGx5aW5nIFx2YXJ7bzF9IGFuZCBcdmFye28yfSwgb3IgXE5VTEx7fQotICBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb24KLSAgXHNhbXB7XHZhcntvMX0gKiBcdmFye28yfX0uCi1cZW5ke2NmdW5jZGVzY30KLQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5TnVtYmVyX0RpdmlkZX17UHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzJ9Ci0gIFJldHVybnMgdGhlIHJlc3VsdCBvZiBkaXZpZGluZyBcdmFye28xfSBieSBcdmFye28yfSwgb3IgXE5VTEx7fSBvbgotICBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb24KLSAgXHNhbXB7XHZhcntvMX0gLyBcdmFye28yfX0uCi1cZW5ke2NmdW5jZGVzY30KLQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5TnVtYmVyX0Zsb29yRGl2aWRlfXtQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMn0KLSAgUmV0dXJuIHRoZSBmbG9vciBvZiBcdmFye28xfSBkaXZpZGVkIGJ5IFx2YXJ7bzJ9LCBvciBcTlVMTHt9IG9uCi0gIGZhaWx1cmUuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGBgY2xhc3NpYycnIGRpdmlzaW9uIG9mCi0gIGludGVnZXJzLgotICBcdmVyc2lvbmFkZGVkezIuMn0KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlOdW1iZXJfVHJ1ZURpdmlkZX17UHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzJ9Ci0gIFJldHVybiBhIHJlYXNvbmFibGUgYXBwcm94aW1hdGlvbiBmb3IgdGhlIG1hdGhlbWF0aWNhbCB2YWx1ZSBvZgotICBcdmFye28xfSBkaXZpZGVkIGJ5IFx2YXJ7bzJ9LCBvciBcTlVMTHt9IG9uIGZhaWx1cmUuICBUaGUgcmV0dXJuCi0gIHZhbHVlIGlzIGBgYXBwcm94aW1hdGUnJyBiZWNhdXNlIGJpbmFyeSBmbG9hdGluZyBwb2ludCBudW1iZXJzIGFyZQotICBhcHByb3hpbWF0ZTsgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJlcHJlc2VudCBhbGwgcmVhbCBudW1iZXJzIGluCi0gIGJhc2UgdHdvLiAgVGhpcyBmdW5jdGlvbiBjYW4gcmV0dXJuIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUgd2hlbgotICBwYXNzZWQgdHdvIGludGVnZXJzLgotICBcdmVyc2lvbmFkZGVkezIuMn0KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlOdW1iZXJfUmVtYWluZGVyfXtQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMn0KLSAgUmV0dXJucyB0aGUgcmVtYWluZGVyIG9mIGRpdmlkaW5nIFx2YXJ7bzF9IGJ5IFx2YXJ7bzJ9LCBvciBcTlVMTHt9Ci0gIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbgotICBcc2FtcHtcdmFye28xfSBcJVwgXHZhcntvMn19LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeU51bWJlcl9EaXZtb2R9e1B5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yfQotICBTZWUgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIFxmdW5jdGlvbntkaXZtb2QoKX1cYmlmdW5jaW5kZXh7ZGl2bW9kfS4KLSAgUmV0dXJucyBcTlVMTHt9IG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLSAgZXhwcmVzc2lvbiBcc2FtcHtkaXZtb2QoXHZhcntvMX0sIFx2YXJ7bzJ9KX0uCi1cZW5ke2NmdW5jZGVzY30KLQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5TnVtYmVyX1Bvd2VyfXtQeU9iamVjdCAqbzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbzIsIFB5T2JqZWN0ICpvM30KLSAgU2VlIHRoZSBidWlsdC1pbiBmdW5jdGlvbiBcZnVuY3Rpb257cG93KCl9XGJpZnVuY2luZGV4e3Bvd30uCi0gIFJldHVybnMgXE5VTEx7fSBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCi0gIGV4cHJlc3Npb24gXHNhbXB7cG93KFx2YXJ7bzF9LCBcdmFye28yfSwgXHZhcntvM30pfSwgd2hlcmUgXHZhcntvM30KLSAgaXMgb3B0aW9uYWwuICBJZiBcdmFye28zfSBpcyB0byBiZSBpZ25vcmVkLCBwYXNzIFxjZGF0YXtQeV9Ob25lfSBpbgotICBpdHMgcGxhY2UgKHBhc3NpbmcgXE5VTEx7fSBmb3IgXHZhcntvM30gd291bGQgY2F1c2UgYW4gaWxsZWdhbAotICBtZW1vcnkgYWNjZXNzKS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlOdW1iZXJfTmVnYXRpdmV9e1B5T2JqZWN0ICpvfQotICBSZXR1cm5zIHRoZSBuZWdhdGlvbiBvZiBcdmFye299IG9uIHN1Y2Nlc3MsIG9yIFxOVUxMe30gb24gZmFpbHVyZS4KLSAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb24gXHNhbXB7LVx2YXJ7b319LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeU51bWJlcl9Qb3NpdGl2ZX17UHlPYmplY3QgKm99Ci0gIFJldHVybnMgXHZhcntvfSBvbiBzdWNjZXNzLCBvciBcTlVMTHt9IG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZQotICBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbiBcc2FtcHsrXHZhcntvfX0uCi1cZW5ke2NmdW5jZGVzY30KLQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5TnVtYmVyX0Fic29sdXRlfXtQeU9iamVjdCAqb30KLSAgUmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgXHZhcntvfSwgb3IgXE5VTEx7fSBvbiBmYWlsdXJlLiAgVGhpcwotICBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb24gXHNhbXB7YWJzKFx2YXJ7b30pfS4KLSAgXGJpZnVuY2luZGV4e2Fic30KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlOdW1iZXJfSW52ZXJ0fXtQeU9iamVjdCAqb30KLSAgUmV0dXJucyB0aGUgYml0d2lzZSBuZWdhdGlvbiBvZiBcdmFye299IG9uIHN1Y2Nlc3MsIG9yIFxOVUxMe30gb24KLSAgZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uCi0gIFxzYW1we1x+XHZhcntvfX0uCi1cZW5ke2NmdW5jZGVzY30KLQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5TnVtYmVyX0xzaGlmdH17UHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzJ9Ci0gIFJldHVybnMgdGhlIHJlc3VsdCBvZiBsZWZ0IHNoaWZ0aW5nIFx2YXJ7bzF9IGJ5IFx2YXJ7bzJ9IG9uIHN1Y2Nlc3MsCi0gIG9yIFxOVUxMe30gb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotICBleHByZXNzaW9uIFxzYW1we1x2YXJ7bzF9IDxcY29kZXs8fSBcdmFye28yfX0uCi1cZW5ke2NmdW5jZGVzY30KLQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5TnVtYmVyX1JzaGlmdH17UHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzJ9Ci0gIFJldHVybnMgdGhlIHJlc3VsdCBvZiByaWdodCBzaGlmdGluZyBcdmFye28xfSBieSBcdmFye28yfSBvbgotICBzdWNjZXNzLCBvciBcTlVMTHt9IG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZQotICBQeXRob24gZXhwcmVzc2lvbiBcc2FtcHtcdmFye28xfSA+XGNvZGV7Pn0gXHZhcntvMn19LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeU51bWJlcl9BbmR9e1B5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yfQotICBSZXR1cm5zIHRoZSBgYGJpdHdpc2UgYW5kJycgb2YgXHZhcntvMX0gYW5kIFx2YXJ7bzJ9IG9uIHN1Y2Nlc3MgYW5kCi0gIFxOVUxMe30gb24gZmFpbHVyZS4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb24KLSAgXHNhbXB7XHZhcntvMX0gXCZcIFx2YXJ7bzJ9fS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlOdW1iZXJfWG9yfXtQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMn0KLSAgUmV0dXJucyB0aGUgYGBiaXR3aXNlIGV4Y2x1c2l2ZSBvcicnIG9mIFx2YXJ7bzF9IGJ5IFx2YXJ7bzJ9IG9uCi0gIHN1Y2Nlc3MsIG9yIFxOVUxMe30gb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlCi0gIFB5dGhvbiBleHByZXNzaW9uIFxzYW1we1x2YXJ7bzF9IFx0ZXh0YXNjaWljaXJjdW17fSBcdmFye28yfX0uCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeU51bWJlcl9Pcn17UHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzJ9Ci0gIFJldHVybnMgdGhlIGBgYml0d2lzZSBvcicnIG9mIFx2YXJ7bzF9IGFuZCBcdmFye28yfSBvbiBzdWNjZXNzLCBvcgotICBcTlVMTHt9IG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbgotICBcc2FtcHtcdmFye28xfSB8IFx2YXJ7bzJ9fS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlOdW1iZXJfSW5QbGFjZUFkZH17UHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzJ9Ci0gIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhZGRpbmcgXHZhcntvMX0gYW5kIFx2YXJ7bzJ9LCBvciBcTlVMTHt9IG9uCi0gIGZhaWx1cmUuICBUaGUgb3BlcmF0aW9uIGlzIGRvbmUgXGVtcGh7aW4tcGxhY2V9IHdoZW4gXHZhcntvMX0KLSAgc3VwcG9ydHMgaXQuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gc3RhdGVtZW50Ci0gIFxzYW1we1x2YXJ7bzF9ICs9IFx2YXJ7bzJ9fS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlOdW1iZXJfSW5QbGFjZVN1YnRyYWN0fXtQeU9iamVjdCAqbzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm8yfQotICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc3VidHJhY3RpbmcgXHZhcntvMn0gZnJvbSBcdmFye28xfSwgb3IgXE5VTEx7fQotICBvbiBmYWlsdXJlLiAgVGhlIG9wZXJhdGlvbiBpcyBkb25lIFxlbXBoe2luLXBsYWNlfSB3aGVuIFx2YXJ7bzF9Ci0gIHN1cHBvcnRzIGl0LiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIHN0YXRlbWVudAotICBcc2FtcHtcdmFye28xfSAtPSBcdmFye28yfX0uCi1cZW5ke2NmdW5jZGVzY30KLQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5TnVtYmVyX0luUGxhY2VNdWx0aXBseX17UHlPYmplY3QgKm8xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpvMn0KLSAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIG11bHRpcGx5aW5nIFx2YXJ7bzF9IGFuZCBcdmFye28yfSwgb3IgXE5VTEx7fQotICBvbiBmYWlsdXJlLiAgVGhlIG9wZXJhdGlvbiBpcyBkb25lIFxlbXBoe2luLXBsYWNlfSB3aGVuIFx2YXJ7bzF9Ci0gIHN1cHBvcnRzIGl0LiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIHN0YXRlbWVudAotICBcc2FtcHtcdmFye28xfSAqPSBcdmFye28yfX0uCi1cZW5ke2NmdW5jZGVzY30KLQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5TnVtYmVyX0luUGxhY2VEaXZpZGV9e1B5T2JqZWN0ICpvMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm8yfQotICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgZGl2aWRpbmcgXHZhcntvMX0gYnkgXHZhcntvMn0sIG9yIFxOVUxMe30gb24KLSAgZmFpbHVyZS4gIFRoZSBvcGVyYXRpb24gaXMgZG9uZSBcZW1waHtpbi1wbGFjZX0gd2hlbiBcdmFye28xfQotICBzdXBwb3J0cyBpdC4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIHN0YXRlbWVudAotICBcc2FtcHtcdmFye28xfSAvPSBcdmFye28yfX0uCi1cZW5ke2NmdW5jZGVzY30KLQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5TnVtYmVyX0luUGxhY2VGbG9vckRpdmlkZX17UHlPYmplY3QgKm8xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpvMn0KLSAgUmV0dXJucyB0aGUgbWF0aGVtYXRpY2FsIGZsb29yIG9mIGRpdmlkaW5nIFx2YXJ7bzF9IGJ5IFx2YXJ7bzJ9LCBvcgotICBcTlVMTHt9IG9uIGZhaWx1cmUuICBUaGUgb3BlcmF0aW9uIGlzIGRvbmUgXGVtcGh7aW4tcGxhY2V9IHdoZW4KLSAgXHZhcntvMX0gc3VwcG9ydHMgaXQuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLSAgc3RhdGVtZW50IFxzYW1we1x2YXJ7bzF9IC8vPSBcdmFye28yfX0uCi0gIFx2ZXJzaW9uYWRkZWR7Mi4yfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeU51bWJlcl9JblBsYWNlVHJ1ZURpdmlkZX17UHlPYmplY3QgKm8xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm8yfQotICBSZXR1cm4gYSByZWFzb25hYmxlIGFwcHJveGltYXRpb24gZm9yIHRoZSBtYXRoZW1hdGljYWwgdmFsdWUgb2YKLSAgXHZhcntvMX0gZGl2aWRlZCBieSBcdmFye28yfSwgb3IgXE5VTEx7fSBvbiBmYWlsdXJlLiAgVGhlIHJldHVybgotICB2YWx1ZSBpcyBgYGFwcHJveGltYXRlJycgYmVjYXVzZSBiaW5hcnkgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBhcmUKLSAgYXBwcm94aW1hdGU7IGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZXByZXNlbnQgYWxsIHJlYWwgbnVtYmVycyBpbgotICBiYXNlIHR3by4gIFRoaXMgZnVuY3Rpb24gY2FuIHJldHVybiBhIGZsb2F0aW5nIHBvaW50IHZhbHVlIHdoZW4KLSAgcGFzc2VkIHR3byBpbnRlZ2Vycy4gIFRoZSBvcGVyYXRpb24gaXMgZG9uZSBcZW1waHtpbi1wbGFjZX0gd2hlbgotICBcdmFye28xfSBzdXBwb3J0cyBpdC4KLSAgXHZlcnNpb25hZGRlZHsyLjJ9Ci1cZW5ke2NmdW5jZGVzY30KLQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5TnVtYmVyX0luUGxhY2VSZW1haW5kZXJ9e1B5T2JqZWN0ICpvMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm8yfQotICBSZXR1cm5zIHRoZSByZW1haW5kZXIgb2YgZGl2aWRpbmcgXHZhcntvMX0gYnkgXHZhcntvMn0sIG9yIFxOVUxMe30KLSAgb24gZmFpbHVyZS4gIFRoZSBvcGVyYXRpb24gaXMgZG9uZSBcZW1waHtpbi1wbGFjZX0gd2hlbiBcdmFye28xfQotICBzdXBwb3J0cyBpdC4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBzdGF0ZW1lbnQKLSAgXHNhbXB7XHZhcntvMX0gXCU9IFx2YXJ7bzJ9fS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlOdW1iZXJfSW5QbGFjZVBvd2VyfXtQeU9iamVjdCAqbzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm8yLCBQeU9iamVjdCAqbzN9Ci0gIFNlZSB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gXGZ1bmN0aW9ue3BvdygpfS5cYmlmdW5jaW5kZXh7cG93fQotICBSZXR1cm5zIFxOVUxMe30gb24gZmFpbHVyZS4gIFRoZSBvcGVyYXRpb24gaXMgZG9uZSBcZW1waHtpbi1wbGFjZX0KLSAgd2hlbiBcdmFye28xfSBzdXBwb3J0cyBpdC4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotICBzdGF0ZW1lbnQgXHNhbXB7XHZhcntvMX0gKio9IFx2YXJ7bzJ9fSB3aGVuIG8zIGlzIFxjZGF0YXtQeV9Ob25lfSwKLSAgb3IgYW4gaW4tcGxhY2UgdmFyaWFudCBvZiBcc2FtcHtwb3coXHZhcntvMX0sIFx2YXJ7bzJ9LCBcdmFye28zfSl9Ci0gIG90aGVyd2lzZS4gSWYgXHZhcntvM30gaXMgdG8gYmUgaWdub3JlZCwgcGFzcyBcY2RhdGF7UHlfTm9uZX0gaW4gaXRzCi0gIHBsYWNlIChwYXNzaW5nIFxOVUxMe30gZm9yIFx2YXJ7bzN9IHdvdWxkIGNhdXNlIGFuIGlsbGVnYWwgbWVtb3J5Ci0gIGFjY2VzcykuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeU51bWJlcl9JblBsYWNlTHNoaWZ0fXtQeU9iamVjdCAqbzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpvMn0KLSAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGxlZnQgc2hpZnRpbmcgXHZhcntvMX0gYnkgXHZhcntvMn0gb24gc3VjY2VzcywKLSAgb3IgXE5VTEx7fSBvbiBmYWlsdXJlLiAgVGhlIG9wZXJhdGlvbiBpcyBkb25lIFxlbXBoe2luLXBsYWNlfSB3aGVuCi0gIFx2YXJ7bzF9IHN1cHBvcnRzIGl0LiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCi0gIHN0YXRlbWVudCBcc2FtcHtcdmFye28xfSA8XGNvZGV7PD19IFx2YXJ7bzJ9fS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlOdW1iZXJfSW5QbGFjZVJzaGlmdH17UHlPYmplY3QgKm8xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbzJ9Ci0gIFJldHVybnMgdGhlIHJlc3VsdCBvZiByaWdodCBzaGlmdGluZyBcdmFye28xfSBieSBcdmFye28yfSBvbgotICBzdWNjZXNzLCBvciBcTlVMTHt9IG9uIGZhaWx1cmUuICBUaGUgb3BlcmF0aW9uIGlzIGRvbmUKLSAgXGVtcGh7aW4tcGxhY2V9IHdoZW4gXHZhcntvMX0gc3VwcG9ydHMgaXQuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50Ci0gIG9mIHRoZSBQeXRob24gc3RhdGVtZW50IFxzYW1we1x2YXJ7bzF9ID4+PSBcdmFye28yfX0uCi1cZW5ke2NmdW5jZGVzY30KLQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5TnVtYmVyX0luUGxhY2VBbmR9e1B5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yfQotICBSZXR1cm5zIHRoZSBgYGJpdHdpc2UgYW5kJycgb2YgXHZhcntvMX0gYW5kIFx2YXJ7bzJ9IG9uIHN1Y2Nlc3MgYW5kCi0gIFxOVUxMe30gb24gZmFpbHVyZS4gVGhlIG9wZXJhdGlvbiBpcyBkb25lIFxlbXBoe2luLXBsYWNlfSB3aGVuCi0gIFx2YXJ7bzF9IHN1cHBvcnRzIGl0LiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCi0gIHN0YXRlbWVudCBcc2FtcHtcdmFye28xfSBcJj0gXHZhcntvMn19LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeU51bWJlcl9JblBsYWNlWG9yfXtQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMn0KLSAgUmV0dXJucyB0aGUgYGBiaXR3aXNlIGV4Y2x1c2l2ZSBvcicnIG9mIFx2YXJ7bzF9IGJ5IFx2YXJ7bzJ9IG9uCi0gIHN1Y2Nlc3MsIG9yIFxOVUxMe30gb24gZmFpbHVyZS4gIFRoZSBvcGVyYXRpb24gaXMgZG9uZQotICBcZW1waHtpbi1wbGFjZX0gd2hlbiBcdmFye28xfSBzdXBwb3J0cyBpdC4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQKLSAgb2YgdGhlIFB5dGhvbiBzdGF0ZW1lbnQgXHNhbXB7XHZhcntvMX0gXHRleHRhc2NpaWNpcmN1bT0gXHZhcntvMn19LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlOdW1iZXJfSW5QbGFjZU9yfXtQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMn0KLSAgUmV0dXJucyB0aGUgYGBiaXR3aXNlIG9yJycgb2YgXHZhcntvMX0gYW5kIFx2YXJ7bzJ9IG9uIHN1Y2Nlc3MsIG9yCi0gIFxOVUxMe30gb24gZmFpbHVyZS4gIFRoZSBvcGVyYXRpb24gaXMgZG9uZSBcZW1waHtpbi1wbGFjZX0gd2hlbgotICBcdmFye28xfSBzdXBwb3J0cyBpdC4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotICBzdGF0ZW1lbnQgXHNhbXB7XHZhcntvMX0gfD0gXHZhcntvMn19LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlOdW1iZXJfSW50fXtQeU9iamVjdCAqb30KLSAgUmV0dXJucyB0aGUgXHZhcntvfSBjb252ZXJ0ZWQgdG8gYW4gaW50ZWdlciBvYmplY3Qgb24gc3VjY2Vzcywgb3IKLSAgXE5VTEx7fSBvbiBmYWlsdXJlLiAgSWYgdGhlIGFyZ3VtZW50IGlzIG91dHNpZGUgdGhlIGludGVnZXIgcmFuZ2UKLSAgYSBsb25nIG9iamVjdCB3aWxsIGJlIHJldHVybmVkIGluc3RlYWQuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQKLSAgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uIFxzYW1we2ludChcdmFye299KX0uXGJpZnVuY2luZGV4e2ludH0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5TnVtYmVyX0xvbmd9e1B5T2JqZWN0ICpvfQotICBSZXR1cm5zIHRoZSBcdmFye299IGNvbnZlcnRlZCB0byBhIGxvbmcgaW50ZWdlciBvYmplY3Qgb24gc3VjY2VzcywKLSAgb3IgXE5VTEx7fSBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCi0gIGV4cHJlc3Npb24gXHNhbXB7bG9uZyhcdmFye299KX0uXGJpZnVuY2luZGV4e2xvbmd9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeU51bWJlcl9GbG9hdH17UHlPYmplY3QgKm99Ci0gIFJldHVybnMgdGhlIFx2YXJ7b30gY29udmVydGVkIHRvIGEgZmxvYXQgb2JqZWN0IG9uIHN1Y2Nlc3MsIG9yCi0gIFxOVUxMe30gb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uCi0gIFxzYW1we2Zsb2F0KFx2YXJ7b30pfS5cYmlmdW5jaW5kZXh7ZmxvYXR9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeU51bWJlcl9JbmRleH17UHlPYmplY3QgKm99Ci0gIFJldHVybnMgdGhlIFx2YXJ7b30gY29udmVydGVkIHRvIGEgUHl0aG9uIGludCBvciBsb25nIG9uIHN1Y2Nlc3Mgb3IgXE5VTEx7fQotICB3aXRoIGEgVHlwZUVycm9yIGV4Y2VwdGlvbiByYWlzZWQgb24gZmFpbHVyZS4KLSAgXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlfc3NpemVfdH17UHlOdW1iZXJfQXNTc2l6ZV90fXtQeU9iamVjdCAqbywgUHlPYmplY3QgKmV4Y30KLSAgUmV0dXJucyBcdmFye299IGNvbnZlcnRlZCB0byBhIFB5X3NzaXplX3QgdmFsdWUgaWYgXHZhcntvfQotICBjYW4gYmUgaW50ZXJwcmV0ZWQgYXMgYW4gaW50ZWdlci4gSWYgXHZhcntvfSBjYW4gYmUgY29udmVydGVkIHRvIGEgUHl0aG9uCi0gIGludCBvciBsb25nIGJ1dCB0aGUgYXR0ZW1wdCB0byBjb252ZXJ0IHRvIGEgUHlfc3NpemVfdCB2YWx1ZQotICB3b3VsZCByYWlzZSBhbiBcZXhjZXB0aW9ue092ZXJmbG93RXJyb3J9LCB0aGVuIHRoZSBcdmFye2V4Y30gYXJndW1lbnQKLSAgaXMgdGhlIHR5cGUgb2YgZXhjZXB0aW9uIHRoYXQgd2lsbCBiZSByYWlzZWQgKHVzdWFsbHkgXGV4Y2VwdGlvbntJbmRleEVycm9yfQotICBvciBcZXhjZXB0aW9ue092ZXJmbG93RXJyb3J9KS4gIElmIFx2YXJ7ZXhjfSBpcyBcTlVMTHt9LCB0aGVuIHRoZSBleGNlcHRpb24KLSAgaXMgY2xlYXJlZCBhbmQgdGhlIHZhbHVlIGlzIGNsaXBwZWQgdG8gXHZhcntQWV9TU0laRV9UX01JTn0KLSAgZm9yIGEgbmVnYXRpdmUgaW50ZWdlciBvciBcdmFye1BZX1NTSVpFX1RfTUFYfSBmb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyLgotICBcdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5SW5kZXhfQ2hlY2t9e1B5T2JqZWN0ICpvfQotICBSZXR1cm5zIFRydWUgaWYgXHZhcntvfSBpcyBhbiBpbmRleCBpbnRlZ2VyIChoYXMgdGhlIG5iX2luZGV4IHNsb3Qgb2YgCi0gIHRoZSB0cF9hc19udW1iZXIgc3RydWN0dXJlIGZpbGxlZCBpbikuICAKLSAgXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke2NmdW5jZGVzY30KLQotCi1cc2VjdGlvbntTZXF1ZW5jZSBQcm90b2NvbCBcbGFiZWx7c2VxdWVuY2V9fQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5U2VxdWVuY2VfQ2hlY2t9e1B5T2JqZWN0ICpvfQotICBSZXR1cm4gXGNvZGV7MX0gaWYgdGhlIG9iamVjdCBwcm92aWRlcyBzZXF1ZW5jZSBwcm90b2NvbCwgYW5kCi0gIFxjb2RlezB9IG90aGVyd2lzZS4gIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHN1Y2NlZWRzLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5X3NzaXplX3R9e1B5U2VxdWVuY2VfU2l6ZX17UHlPYmplY3QgKm99Ci0gIFJldHVybnMgdGhlIG51bWJlciBvZiBvYmplY3RzIGluIHNlcXVlbmNlIFx2YXJ7b30gb24gc3VjY2VzcywgYW5kCi0gIFxjb2Rley0xfSBvbiBmYWlsdXJlLiAgRm9yIG9iamVjdHMgdGhhdCBkbyBub3QgcHJvdmlkZSBzZXF1ZW5jZQotICBwcm90b2NvbCwgdGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbgotICBcc2FtcHtsZW4oXHZhcntvfSl9LlxiaWZ1bmNpbmRleHtsZW59Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlfc3NpemVfdH17UHlTZXF1ZW5jZV9MZW5ndGh9e1B5T2JqZWN0ICpvfQotICBBbHRlcm5hdGUgbmFtZSBmb3IgXGNmdW5jdGlvbntQeVNlcXVlbmNlX1NpemUoKX0uCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeVNlcXVlbmNlX0NvbmNhdH17UHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzJ9Ci0gIFJldHVybiB0aGUgY29uY2F0ZW5hdGlvbiBvZiBcdmFye28xfSBhbmQgXHZhcntvMn0gb24gc3VjY2VzcywgYW5kCi0gIFxOVUxMe30gb24gZmFpbHVyZS4gICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLSAgZXhwcmVzc2lvbiBcc2FtcHtcdmFye28xfSArIFx2YXJ7bzJ9fS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlTZXF1ZW5jZV9SZXBlYXR9e1B5T2JqZWN0ICpvLCBQeV9zc2l6ZV90IGNvdW50fQotICBSZXR1cm4gdGhlIHJlc3VsdCBvZiByZXBlYXRpbmcgc2VxdWVuY2Ugb2JqZWN0IFx2YXJ7b30gXHZhcntjb3VudH0KLSAgdGltZXMsIG9yIFxOVUxMe30gb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotICBleHByZXNzaW9uIFxzYW1we1x2YXJ7b30gKiBcdmFye2NvdW50fX0uCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeVNlcXVlbmNlX0luUGxhY2VDb25jYXR9e1B5T2JqZWN0ICpvMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbzJ9Ci0gIFJldHVybiB0aGUgY29uY2F0ZW5hdGlvbiBvZiBcdmFye28xfSBhbmQgXHZhcntvMn0gb24gc3VjY2VzcywgYW5kCi0gIFxOVUxMe30gb24gZmFpbHVyZS4gIFRoZSBvcGVyYXRpb24gaXMgZG9uZSBcZW1waHtpbi1wbGFjZX0gd2hlbgotICBcdmFye28xfSBzdXBwb3J0cyBpdC4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotICBleHByZXNzaW9uIFxzYW1we1x2YXJ7bzF9ICs9IFx2YXJ7bzJ9fS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlTZXF1ZW5jZV9JblBsYWNlUmVwZWF0fXtQeU9iamVjdCAqbywgUHlfc3NpemVfdCBjb3VudH0KLSAgUmV0dXJuIHRoZSByZXN1bHQgb2YgcmVwZWF0aW5nIHNlcXVlbmNlIG9iamVjdCBcdmFye299IFx2YXJ7Y291bnR9Ci0gIHRpbWVzLCBvciBcTlVMTHt9IG9uIGZhaWx1cmUuICBUaGUgb3BlcmF0aW9uIGlzIGRvbmUgXGVtcGh7aW4tcGxhY2V9Ci0gIHdoZW4gXHZhcntvfSBzdXBwb3J0cyBpdC4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotICBleHByZXNzaW9uIFxzYW1we1x2YXJ7b30gKj0gXHZhcntjb3VudH19LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeVNlcXVlbmNlX0dldEl0ZW19e1B5T2JqZWN0ICpvLCBQeV9zc2l6ZV90IGl9Ci0gIFJldHVybiB0aGUgXHZhcntpfXRoIGVsZW1lbnQgb2YgXHZhcntvfSwgb3IgXE5VTEx7fSBvbiBmYWlsdXJlLgotICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbgotICBcc2FtcHtcdmFye299W1x2YXJ7aX1dfS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlTZXF1ZW5jZV9HZXRTbGljZX17UHlPYmplY3QgKm8sIFB5X3NzaXplX3QgaTEsIFB5X3NzaXplX3QgaTJ9Ci0gIFJldHVybiB0aGUgc2xpY2Ugb2Ygc2VxdWVuY2Ugb2JqZWN0IFx2YXJ7b30gYmV0d2VlbiBcdmFye2kxfSBhbmQKLSAgXHZhcntpMn0sIG9yIFxOVUxMe30gb24gZmFpbHVyZS4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUKLSAgUHl0aG9uIGV4cHJlc3Npb24gXHNhbXB7XHZhcntvfVtcdmFye2kxfTpcdmFye2kyfV19LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeVNlcXVlbmNlX1NldEl0ZW19e1B5T2JqZWN0ICpvLCBQeV9zc2l6ZV90IGksIFB5T2JqZWN0ICp2fQotICBBc3NpZ24gb2JqZWN0IFx2YXJ7dn0gdG8gdGhlIFx2YXJ7aX10aCBlbGVtZW50IG9mIFx2YXJ7b30uICBSZXR1cm5zCi0gIFxjb2Rley0xfSBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCi0gIHN0YXRlbWVudCBcc2FtcHtcdmFye299W1x2YXJ7aX1dID0gXHZhcnt2fX0uICBUaGlzIGZ1bmN0aW9uIFxlbXBoe2RvZXMgbm90fQotICBzdGVhbCBhIHJlZmVyZW5jZSB0byBcdmFye3Z9LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlTZXF1ZW5jZV9EZWxJdGVtfXtQeU9iamVjdCAqbywgUHlfc3NpemVfdCBpfQotICBEZWxldGUgdGhlIFx2YXJ7aX10aCBlbGVtZW50IG9mIG9iamVjdCBcdmFye299LiAgUmV0dXJucyBcY29kZXstMX0KLSAgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBzdGF0ZW1lbnQKLSAgXHNhbXB7ZGVsIFx2YXJ7b31bXHZhcntpfV19LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlTZXF1ZW5jZV9TZXRTbGljZX17UHlPYmplY3QgKm8sIFB5X3NzaXplX3QgaTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgaTIsIFB5T2JqZWN0ICp2fQotICBBc3NpZ24gdGhlIHNlcXVlbmNlIG9iamVjdCBcdmFye3Z9IHRvIHRoZSBzbGljZSBpbiBzZXF1ZW5jZSBvYmplY3QKLSAgXHZhcntvfSBmcm9tIFx2YXJ7aTF9IHRvIFx2YXJ7aTJ9LiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUKLSAgUHl0aG9uIHN0YXRlbWVudCBcc2FtcHtcdmFye299W1x2YXJ7aTF9Olx2YXJ7aTJ9XSA9IFx2YXJ7dn19LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlTZXF1ZW5jZV9EZWxTbGljZX17UHlPYmplY3QgKm8sIFB5X3NzaXplX3QgaTEsIFB5X3NzaXplX3QgaTJ9Ci0gIERlbGV0ZSB0aGUgc2xpY2UgaW4gc2VxdWVuY2Ugb2JqZWN0IFx2YXJ7b30gZnJvbSBcdmFye2kxfSB0bwotICBcdmFye2kyfS4gIFJldHVybnMgXGNvZGV7LTF9IG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mCi0gIHRoZSBQeXRob24gc3RhdGVtZW50IFxzYW1we2RlbCBcdmFye299W1x2YXJ7aTF9Olx2YXJ7aTJ9XX0uCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlfc3NpemVfdH17UHlTZXF1ZW5jZV9Db3VudH17UHlPYmplY3QgKm8sIFB5T2JqZWN0ICp2YWx1ZX0KLSAgUmV0dXJuIHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgXHZhcnt2YWx1ZX0gaW4gXHZhcntvfSwgdGhhdCBpcywKLSAgcmV0dXJuIHRoZSBudW1iZXIgb2Yga2V5cyBmb3Igd2hpY2ggXGNvZGV7XHZhcntvfVtcdmFye2tleX1dID09Ci0gIFx2YXJ7dmFsdWV9fS4gIE9uIGZhaWx1cmUsIHJldHVybiBcY29kZXstMX0uICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KLSAgdGhlIFB5dGhvbiBleHByZXNzaW9uIFxzYW1we1x2YXJ7b30uY291bnQoXHZhcnt2YWx1ZX0pfS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5U2VxdWVuY2VfQ29udGFpbnN9e1B5T2JqZWN0ICpvLCBQeU9iamVjdCAqdmFsdWV9Ci0gIERldGVybWluZSBpZiBcdmFye299IGNvbnRhaW5zIFx2YXJ7dmFsdWV9LiAgSWYgYW4gaXRlbSBpbiBcdmFye299IGlzCi0gIGVxdWFsIHRvIFx2YXJ7dmFsdWV9LCByZXR1cm4gXGNvZGV7MX0sIG90aGVyd2lzZSByZXR1cm4gXGNvZGV7MH0uCi0gIE9uIGVycm9yLCByZXR1cm4gXGNvZGV7LTF9LiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24KLSAgZXhwcmVzc2lvbiBcc2FtcHtcdmFye3ZhbHVlfSBpbiBcdmFye299fS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeV9zc2l6ZV90fXtQeVNlcXVlbmNlX0luZGV4fXtQeU9iamVjdCAqbywgUHlPYmplY3QgKnZhbHVlfQotICBSZXR1cm4gdGhlIGZpcnN0IGluZGV4IFx2YXJ7aX0gZm9yIHdoaWNoIFxjb2Rle1x2YXJ7b31bXHZhcntpfV0gPT0KLSAgXHZhcnt2YWx1ZX19LiAgT24gZXJyb3IsIHJldHVybiBcY29kZXstMX0uICAgIFRoaXMgaXMgZXF1aXZhbGVudCB0bwotICB0aGUgUHl0aG9uIGV4cHJlc3Npb24gXHNhbXB7XHZhcntvfS5pbmRleChcdmFye3ZhbHVlfSl9LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlTZXF1ZW5jZV9MaXN0fXtQeU9iamVjdCAqb30KLSAgUmV0dXJuIGEgbGlzdCBvYmplY3Qgd2l0aCB0aGUgc2FtZSBjb250ZW50cyBhcyB0aGUgYXJiaXRyYXJ5Ci0gIHNlcXVlbmNlIFx2YXJ7b30uICBUaGUgcmV0dXJuZWQgbGlzdCBpcyBndWFyYW50ZWVkIHRvIGJlIG5ldy4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5U2VxdWVuY2VfVHVwbGV9e1B5T2JqZWN0ICpvfQotICBSZXR1cm4gYSB0dXBsZSBvYmplY3Qgd2l0aCB0aGUgc2FtZSBjb250ZW50cyBhcyB0aGUgYXJiaXRyYXJ5Ci0gIHNlcXVlbmNlIFx2YXJ7b30gb3IgXE5VTEx7fSBvbiBmYWlsdXJlLiAgSWYgXHZhcntvfSBpcyBhIHR1cGxlLAotICBhIG5ldyByZWZlcmVuY2Ugd2lsbCBiZSByZXR1cm5lZCwgb3RoZXJ3aXNlIGEgdHVwbGUgd2lsbCBiZQotICBjb25zdHJ1Y3RlZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBjb250ZW50cy4gIFRoaXMgaXMgZXF1aXZhbGVudAotICB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb24gXHNhbXB7dHVwbGUoXHZhcntvfSl9LgotICBcYmlmdW5jaW5kZXh7dHVwbGV9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeVNlcXVlbmNlX0Zhc3R9e1B5T2JqZWN0ICpvLCBjb25zdCBjaGFyICptfQotICBSZXR1cm5zIHRoZSBzZXF1ZW5jZSBcdmFye299IGFzIGEgdHVwbGUsIHVubGVzcyBpdCBpcyBhbHJlYWR5IGEKLSAgdHVwbGUgb3IgbGlzdCwgaW4gd2hpY2ggY2FzZSBcdmFye299IGlzIHJldHVybmVkLiAgVXNlCi0gIFxjZnVuY3Rpb257UHlTZXF1ZW5jZV9GYXN0X0dFVF9JVEVNKCl9IHRvIGFjY2VzcyB0aGUgbWVtYmVycyBvZiB0aGUKLSAgcmVzdWx0LiAgUmV0dXJucyBcTlVMTHt9IG9uIGZhaWx1cmUuICBJZiB0aGUgb2JqZWN0IGlzIG5vdCBhCi0gIHNlcXVlbmNlLCByYWlzZXMgXGV4Y2VwdGlvbntUeXBlRXJyb3J9IHdpdGggXHZhcnttfSBhcyB0aGUgbWVzc2FnZQotICB0ZXh0LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlTZXF1ZW5jZV9GYXN0X0dFVF9JVEVNfXtQeU9iamVjdCAqbywgUHlfc3NpemVfdCBpfQotICBSZXR1cm4gdGhlIFx2YXJ7aX10aCBlbGVtZW50IG9mIFx2YXJ7b30sIGFzc3VtaW5nIHRoYXQgXHZhcntvfSB3YXMKLSAgcmV0dXJuZWQgYnkgXGNmdW5jdGlvbntQeVNlcXVlbmNlX0Zhc3QoKX0sIFx2YXJ7b30gaXMgbm90IFxOVUxMLAotICBhbmQgdGhhdCBcdmFye2l9IGlzIHdpdGhpbiBib3VuZHMuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqKn17UHlTZXF1ZW5jZV9GYXN0X0lURU1TfXtQeU9iamVjdCAqb30KLSAgUmV0dXJuIHRoZSB1bmRlcmx5aW5nIGFycmF5IG9mIFB5T2JqZWN0IHBvaW50ZXJzLiAgQXNzdW1lcyB0aGF0Ci0gIFx2YXJ7b30gd2FzIHJldHVybmVkIGJ5IFxjZnVuY3Rpb257UHlTZXF1ZW5jZV9GYXN0KCl9IGFuZAotICBcdmFye299IGlzIG5vdCBcTlVMTC4KLSAgXHZlcnNpb25hZGRlZHsyLjR9ICAKLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5U2VxdWVuY2VfSVRFTX17UHlPYmplY3QgKm8sIFB5X3NzaXplX3QgaX0KLSAgUmV0dXJuIHRoZSBcdmFye2l9dGggZWxlbWVudCBvZiBcdmFye299IG9yIFxOVUxMe30gb24gZmFpbHVyZS4KLSAgTWFjcm8gZm9ybSBvZiBcY2Z1bmN0aW9ue1B5U2VxdWVuY2VfR2V0SXRlbSgpfSBidXQgd2l0aG91dCBjaGVja2luZwotICB0aGF0IFxjZnVuY3Rpb257UHlTZXF1ZW5jZV9DaGVjayhcdmFye299KX0gaXMgdHJ1ZSBhbmQgd2l0aG91dAotICBhZGp1c3RtZW50IGZvciBuZWdhdGl2ZSBpbmRpY2VzLgotICBcdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeV9zc2l6ZV90fXtQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkV9e1B5T2JqZWN0ICpvfQotICBSZXR1cm5zIHRoZSBsZW5ndGggb2YgXHZhcntvfSwgYXNzdW1pbmcgdGhhdCBcdmFye299IHdhcwotICByZXR1cm5lZCBieSBcY2Z1bmN0aW9ue1B5U2VxdWVuY2VfRmFzdCgpfSBhbmQgdGhhdCBcdmFye299IGlzCi0gIG5vdCBcTlVMTC4gIFRoZSBzaXplIGNhbiBhbHNvIGJlIGdvdHRlbiBieSBjYWxsaW5nCi0gIFxjZnVuY3Rpb257UHlTZXF1ZW5jZV9TaXplKCl9IG9uIFx2YXJ7b30sIGJ1dAotICBcY2Z1bmN0aW9ue1B5U2VxdWVuY2VfRmFzdF9HRVRfU0laRSgpfSBpcyBmYXN0ZXIgYmVjYXVzZSBpdCBjYW4KLSAgYXNzdW1lIFx2YXJ7b30gaXMgYSBsaXN0IG9yIHR1cGxlLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLQotXHNlY3Rpb257TWFwcGluZyBQcm90b2NvbCBcbGFiZWx7bWFwcGluZ319Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlNYXBwaW5nX0NoZWNrfXtQeU9iamVjdCAqb30KLSAgUmV0dXJuIFxjb2RlezF9IGlmIHRoZSBvYmplY3QgcHJvdmlkZXMgbWFwcGluZyBwcm90b2NvbCwgYW5kCi0gIFxjb2RlezB9IG90aGVyd2lzZS4gIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHN1Y2NlZWRzLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue2NmdW5jZGVzY317UHlfc3NpemVfdH17UHlNYXBwaW5nX0xlbmd0aH17UHlPYmplY3QgKm99Ci0gIFJldHVybnMgdGhlIG51bWJlciBvZiBrZXlzIGluIG9iamVjdCBcdmFye299IG9uIHN1Y2Nlc3MsIGFuZAotICBcY29kZXstMX0gb24gZmFpbHVyZS4gIEZvciBvYmplY3RzIHRoYXQgZG8gbm90IHByb3ZpZGUgbWFwcGluZwotICBwcm90b2NvbCwgdGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbgotICBcc2FtcHtsZW4oXHZhcntvfSl9LlxiaWZ1bmNpbmRleHtsZW59Ci1cZW5ke2NmdW5jZGVzY30KLQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5TWFwcGluZ19EZWxJdGVtU3RyaW5nfXtQeU9iamVjdCAqbywgY2hhciAqa2V5fQotICBSZW1vdmUgdGhlIG1hcHBpbmcgZm9yIG9iamVjdCBcdmFye2tleX0gZnJvbSB0aGUgb2JqZWN0IFx2YXJ7b30uCi0gIFJldHVybiBcY29kZXstMX0gb24gZmFpbHVyZS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uCi0gIHN0YXRlbWVudCBcc2FtcHtkZWwgXHZhcntvfVtcdmFye2tleX1dfS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlNYXBwaW5nX0RlbEl0ZW19e1B5T2JqZWN0ICpvLCBQeU9iamVjdCAqa2V5fQotICBSZW1vdmUgdGhlIG1hcHBpbmcgZm9yIG9iamVjdCBcdmFye2tleX0gZnJvbSB0aGUgb2JqZWN0IFx2YXJ7b30uCi0gIFJldHVybiBcY29kZXstMX0gb24gZmFpbHVyZS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uCi0gIHN0YXRlbWVudCBcc2FtcHtkZWwgXHZhcntvfVtcdmFye2tleX1dfS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlNYXBwaW5nX0hhc0tleVN0cmluZ317UHlPYmplY3QgKm8sIGNoYXIgKmtleX0KLSAgT24gc3VjY2VzcywgcmV0dXJuIFxjb2RlezF9IGlmIHRoZSBtYXBwaW5nIG9iamVjdCBoYXMgdGhlIGtleQotICBcdmFye2tleX0gYW5kIFxjb2RlezB9IG90aGVyd2lzZS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uCi0gIGV4cHJlc3Npb24gXHNhbXB7XHZhcntvfS5oYXNfa2V5KFx2YXJ7a2V5fSl9LiAgVGhpcyBmdW5jdGlvbiBhbHdheXMKLSAgc3VjY2VlZHMuCi1cZW5ke2NmdW5jZGVzY30KLQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5TWFwcGluZ19IYXNLZXl9e1B5T2JqZWN0ICpvLCBQeU9iamVjdCAqa2V5fQotICBSZXR1cm4gXGNvZGV7MX0gaWYgdGhlIG1hcHBpbmcgb2JqZWN0IGhhcyB0aGUga2V5IFx2YXJ7a2V5fSBhbmQKLSAgXGNvZGV7MH0gb3RoZXJ3aXNlLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbgotICBcc2FtcHtcdmFye299Lmhhc19rZXkoXHZhcntrZXl9KX0uICBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBzdWNjZWVkcy4KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlNYXBwaW5nX0tleXN9e1B5T2JqZWN0ICpvfQotICBPbiBzdWNjZXNzLCByZXR1cm4gYSBsaXN0IG9mIHRoZSBrZXlzIGluIG9iamVjdCBcdmFye299LiAgT24KLSAgZmFpbHVyZSwgcmV0dXJuIFxOVUxMLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbiBleHByZXNzaW9uCi0gIFxzYW1we1x2YXJ7b30ua2V5cygpfS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlNYXBwaW5nX1ZhbHVlc317UHlPYmplY3QgKm99Ci0gIE9uIHN1Y2Nlc3MsIHJldHVybiBhIGxpc3Qgb2YgdGhlIHZhbHVlcyBpbiBvYmplY3QgXHZhcntvfS4gIE9uCi0gIGZhaWx1cmUsIHJldHVybiBcTlVMTC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbgotICBcc2FtcHtcdmFye299LnZhbHVlcygpfS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlNYXBwaW5nX0l0ZW1zfXtQeU9iamVjdCAqb30KLSAgT24gc3VjY2VzcywgcmV0dXJuIGEgbGlzdCBvZiB0aGUgaXRlbXMgaW4gb2JqZWN0IFx2YXJ7b30sIHdoZXJlIGVhY2gKLSAgaXRlbSBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgYSBrZXktdmFsdWUgcGFpci4gIE9uIGZhaWx1cmUsIHJldHVybgotICBcTlVMTC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbgotICBcc2FtcHtcdmFye299Lml0ZW1zKCl9LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeU1hcHBpbmdfR2V0SXRlbVN0cmluZ317UHlPYmplY3QgKm8sIGNoYXIgKmtleX0KLSAgUmV0dXJuIGVsZW1lbnQgb2YgXHZhcntvfSBjb3JyZXNwb25kaW5nIHRvIHRoZSBvYmplY3QgXHZhcntrZXl9IG9yCi0gIFxOVUxMe30gb24gZmFpbHVyZS4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb24KLSAgXHNhbXB7XHZhcntvfVtcdmFye2tleX1dfS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5TWFwcGluZ19TZXRJdGVtU3RyaW5nfXtQeU9iamVjdCAqbywgY2hhciAqa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnZ9Ci0gIE1hcCB0aGUgb2JqZWN0IFx2YXJ7a2V5fSB0byB0aGUgdmFsdWUgXHZhcnt2fSBpbiBvYmplY3QgXHZhcntvfS4KLSAgUmV0dXJucyBcY29kZXstMX0gb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotICBzdGF0ZW1lbnQgXHNhbXB7XHZhcntvfVtcdmFye2tleX1dID0gXHZhcnt2fX0uCi1cZW5ke2NmdW5jZGVzY30KLQotCi1cc2VjdGlvbntJdGVyYXRvciBQcm90b2NvbCBcbGFiZWx7aXRlcmF0b3J9fQotCi1cdmVyc2lvbmFkZGVkezIuMn0KLQotVGhlcmUgYXJlIG9ubHkgYSBjb3VwbGUgb2YgZnVuY3Rpb25zIHNwZWNpZmljYWxseSBmb3Igd29ya2luZyB3aXRoCi1pdGVyYXRvcnMuCi0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlJdGVyX0NoZWNrfXtQeU9iamVjdCAqb30KLSAgUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBcdmFye299IHN1cHBvcnRzIHRoZSBpdGVyYXRvciBwcm90b2NvbC4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5SXRlcl9OZXh0fXtQeU9iamVjdCAqb30KLSAgUmV0dXJuIHRoZSBuZXh0IHZhbHVlIGZyb20gdGhlIGl0ZXJhdGlvbiBcdmFye299LiAgSWYgdGhlIG9iamVjdCBpcwotICBhbiBpdGVyYXRvciwgdGhpcyByZXRyaWV2ZXMgdGhlIG5leHQgdmFsdWUgZnJvbSB0aGUgaXRlcmF0aW9uLCBhbmQKLSAgcmV0dXJucyBcTlVMTHt9IHdpdGggbm8gZXhjZXB0aW9uIHNldCBpZiB0aGVyZSBhcmUgbm8gcmVtYWluaW5nCi0gIGl0ZW1zLiAgSWYgdGhlIG9iamVjdCBpcyBub3QgYW4gaXRlcmF0b3IsIFxleGNlcHRpb257VHlwZUVycm9yfSBpcwotICByYWlzZWQsIG9yIGlmIHRoZXJlIGlzIGFuIGVycm9yIGluIHJldHJpZXZpbmcgdGhlIGl0ZW0sIHJldHVybnMKLSAgXE5VTEx7fSBhbmQgcGFzc2VzIGFsb25nIHRoZSBleGNlcHRpb24uCi1cZW5ke2NmdW5jZGVzY30KLQotVG8gd3JpdGUgYSBsb29wIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYW4gaXRlcmF0b3IsIHRoZSBDIGNvZGUgc2hvdWxkCi1sb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLVB5T2JqZWN0ICppdGVyYXRvciA9IFB5T2JqZWN0X0dldEl0ZXIob2JqKTsKLVB5T2JqZWN0ICppdGVtOwotCi1pZiAoaXRlcmF0b3IgPT0gTlVMTCkgewotICAgIC8qIHByb3BhZ2F0ZSBlcnJvciAqLwotfQotCi13aGlsZSAoaXRlbSA9IFB5SXRlcl9OZXh0KGl0ZXJhdG9yKSkgewotICAgIC8qIGRvIHNvbWV0aGluZyB3aXRoIGl0ZW0gKi8KLSAgICAuLi4KLSAgICAvKiByZWxlYXNlIHJlZmVyZW5jZSB3aGVuIGRvbmUgKi8KLSAgICBQeV9ERUNSRUYoaXRlbSk7Ci19Ci0KLVB5X0RFQ1JFRihpdGVyYXRvcik7Ci0KLWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgLyogcHJvcGFnYXRlIGVycm9yICovCi19Ci1lbHNlIHsKLSAgICAvKiBjb250aW51ZSBkb2luZyB1c2VmdWwgd29yayAqLwotfQotXGVuZHt2ZXJiYXRpbX0KLQotCi1cc2VjdGlvbntCdWZmZXIgUHJvdG9jb2wgXGxhYmVse2Fic3RyYWN0LWJ1ZmZlcn19Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlPYmplY3RfQXNDaGFyQnVmZmVyfXtQeU9iamVjdCAqb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqYnVmZmVyX2xlbn0KLSAgUmV0dXJucyBhIHBvaW50ZXIgdG8gYSByZWFkLW9ubHkgbWVtb3J5IGxvY2F0aW9uIHVzZWFibGUgYXMgY2hhcmFjdGVyLQotICBiYXNlZCBpbnB1dC4gIFRoZSBcdmFye29ian0gYXJndW1lbnQgbXVzdCBzdXBwb3J0IHRoZSBzaW5nbGUtc2VnbWVudAotICBjaGFyYWN0ZXIgYnVmZmVyIGludGVyZmFjZS4gIE9uIHN1Y2Nlc3MsIHJldHVybnMgXGNvZGV7MH0sIHNldHMKLSAgXHZhcntidWZmZXJ9IHRvIHRoZSBtZW1vcnkgbG9jYXRpb24gYW5kIFx2YXJ7YnVmZmVyX2xlbn0gdG8gdGhlIGJ1ZmZlcgotICBsZW5ndGguICBSZXR1cm5zIFxjb2Rley0xfSBhbmQgc2V0cyBhIFxleGNlcHRpb257VHlwZUVycm9yfSBvbiBlcnJvci4KLSAgXHZlcnNpb25hZGRlZHsxLjZ9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeU9iamVjdF9Bc1JlYWRCdWZmZXJ9e1B5T2JqZWN0ICpvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqKmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90ICpidWZmZXJfbGVufQotICBSZXR1cm5zIGEgcG9pbnRlciB0byBhIHJlYWQtb25seSBtZW1vcnkgbG9jYXRpb24gY29udGFpbmluZwotICBhcmJpdHJhcnkgZGF0YS4gIFRoZSBcdmFye29ian0gYXJndW1lbnQgbXVzdCBzdXBwb3J0IHRoZQotICBzaW5nbGUtc2VnbWVudCByZWFkYWJsZSBidWZmZXIgaW50ZXJmYWNlLiAgT24gc3VjY2VzcywgcmV0dXJucwotICBcY29kZXswfSwgc2V0cyBcdmFye2J1ZmZlcn0gdG8gdGhlIG1lbW9yeSBsb2NhdGlvbiBhbmQgXHZhcntidWZmZXJfbGVufQotICB0byB0aGUgYnVmZmVyIGxlbmd0aC4gIFJldHVybnMgXGNvZGV7LTF9IGFuZCBzZXRzIGEKLSAgXGV4Y2VwdGlvbntUeXBlRXJyb3J9IG9uIGVycm9yLgotICBcdmVyc2lvbmFkZGVkezEuNn0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5T2JqZWN0X0NoZWNrUmVhZEJ1ZmZlcn17UHlPYmplY3QgKm99Ci0gIFJldHVybnMgXGNvZGV7MX0gaWYgXHZhcntvfSBzdXBwb3J0cyB0aGUgc2luZ2xlLXNlZ21lbnQgcmVhZGFibGUKLSAgYnVmZmVyIGludGVyZmFjZS4gIE90aGVyd2lzZSByZXR1cm5zIFxjb2RlezB9LgotICBcdmVyc2lvbmFkZGVkezIuMn0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5T2JqZWN0X0FzV3JpdGVCdWZmZXJ9e1B5T2JqZWN0ICpvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKmJ1ZmZlcl9sZW59Ci0gIFJldHVybnMgYSBwb2ludGVyIHRvIGEgd3JpdGVhYmxlIG1lbW9yeSBsb2NhdGlvbi4gIFRoZSBcdmFye29ian0KLSAgYXJndW1lbnQgbXVzdCBzdXBwb3J0IHRoZSBzaW5nbGUtc2VnbWVudCwgY2hhcmFjdGVyIGJ1ZmZlcgotICBpbnRlcmZhY2UuICBPbiBzdWNjZXNzLCByZXR1cm5zIFxjb2RlezB9LCBzZXRzIFx2YXJ7YnVmZmVyfSB0byB0aGUKLSAgbWVtb3J5IGxvY2F0aW9uIGFuZCBcdmFye2J1ZmZlcl9sZW59IHRvIHRoZSBidWZmZXIgbGVuZ3RoLiAgUmV0dXJucwotICBcY29kZXstMX0gYW5kIHNldHMgYSBcZXhjZXB0aW9ue1R5cGVFcnJvcn0gb24gZXJyb3IuCi0gIFx2ZXJzaW9uYWRkZWR7MS42fQotXGVuZHtjZnVuY2Rlc2N9CmRpZmYgLS1naXQgYS9Eb2MvYXBpL2FwaS50ZXggYi9Eb2MvYXBpL2FwaS50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjhmNWIuLjAwMDAwMDAKLS0tIGEvRG9jL2FwaS9hcGkudGV4CisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotXGRvY3VtZW50Y2xhc3N7bWFudWFsfQotCi1cdGl0bGV7UHl0aG9uL0MgQVBJIFJlZmVyZW5jZSBNYW51YWx9Ci0KLVxpbnB1dHtib2lsZXJwbGF0ZX0KLQotXG1ha2VpbmRleAkJCSUgdGVsbCBcaW5kZXggdG8gYWN0dWFsbHkgd3JpdGUgdGhlIC5pZHggZmlsZQotCi0KLVxiZWdpbntkb2N1bWVudH0KLQotXG1ha2V0aXRsZQotCi1caWZodG1sCi1cY2hhcHRlcip7RnJvbnQgTWF0dGVyXGxhYmVse2Zyb250fX0KLVxmaQotCi1caW5wdXR7Y29weXJpZ2h0fQotCi1cYmVnaW57YWJzdHJhY3R9Ci0KLVxub2luZGVudAotVGhpcyBtYW51YWwgZG9jdW1lbnRzIHRoZSBBUEkgdXNlZCBieSBDIGFuZCBcQ3Bwe30gcHJvZ3JhbW1lcnMgd2hvCi13YW50IHRvIHdyaXRlIGV4dGVuc2lvbiBtb2R1bGVzIG9yIGVtYmVkIFB5dGhvbi4gIEl0IGlzIGEgY29tcGFuaW9uIHRvCi1cY2l0ZXRpdGxlWy4uL2V4dC9leHQuaHRtbF17RXh0ZW5kaW5nIGFuZCBFbWJlZGRpbmcgdGhlIFB5dGhvbgotSW50ZXJwcmV0ZXJ9LCB3aGljaCBkZXNjcmliZXMgdGhlIGdlbmVyYWwgcHJpbmNpcGxlcyBvZiBleHRlbnNpb24KLXdyaXRpbmcgYnV0IGRvZXMgbm90IGRvY3VtZW50IHRoZSBBUEkgZnVuY3Rpb25zIGluIGRldGFpbC4KLQotXHdhcm5pbmd7VGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50IGlzIGluY29tcGxldGUuICBJIGhvcGUKLXRoYXQgaXQgaXMgbmV2ZXJ0aGVsZXNzIHVzZWZ1bC4gIEkgd2lsbCBjb250aW51ZSB0byB3b3JrIG9uIGl0LCBhbmQKLXJlbGVhc2UgbmV3IHZlcnNpb25zIGZyb20gdGltZSB0byB0aW1lLCBpbmRlcGVuZGVudCBmcm9tIFB5dGhvbiBzb3VyY2UKLWNvZGUgcmVsZWFzZXMufQotCi1cZW5ke2Fic3RyYWN0fQotCi1cdGFibGVvZmNvbnRlbnRzCi0KLQotXGlucHV0e2ludHJvfQotXGlucHV0e3ZlcnloaWdofQotXGlucHV0e3JlZmNvdW50aW5nfQotXGlucHV0e2V4Y2VwdGlvbnN9Ci1caW5wdXR7dXRpbGl0aWVzfQotXGlucHV0e2Fic3RyYWN0fQotXGlucHV0e2NvbmNyZXRlfQotXGlucHV0e2luaXR9Ci1caW5wdXR7bWVtb3J5fQotXGlucHV0e25ld3R5cGVzfQotCi0KLVxhcHBlbmRpeAotXGNoYXB0ZXJ7UmVwb3J0aW5nIEJ1Z3N9Ci1caW5wdXR7cmVwb3J0aW5nYnVnc30KLQotXGNoYXB0ZXJ7SGlzdG9yeSBhbmQgTGljZW5zZX0KLVxpbnB1dHtsaWNlbnNlfQotCi1caW5wdXR7YXBpLmluZH0JCQklIEluZGV4IC0tIG11c3QgYmUgbGFzdAotCi1cZW5ke2RvY3VtZW50fQpkaWZmIC0tZ2l0IGEvRG9jL2FwaS9jb25jcmV0ZS50ZXggYi9Eb2MvYXBpL2NvbmNyZXRlLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRiMTlkMC4uMDAwMDAwMAotLS0gYS9Eb2MvYXBpL2NvbmNyZXRlLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDMzMjYgKzAsMCBAQAotXGNoYXB0ZXJ7Q29uY3JldGUgT2JqZWN0cyBMYXllciBcbGFiZWx7Y29uY3JldGV9fQotCi0KLVRoZSBmdW5jdGlvbnMgaW4gdGhpcyBjaGFwdGVyIGFyZSBzcGVjaWZpYyB0byBjZXJ0YWluIFB5dGhvbiBvYmplY3QKLXR5cGVzLiAgUGFzc2luZyB0aGVtIGFuIG9iamVjdCBvZiB0aGUgd3JvbmcgdHlwZSBpcyBub3QgYSBnb29kIGlkZWE7Ci1pZiB5b3UgcmVjZWl2ZSBhbiBvYmplY3QgZnJvbSBhIFB5dGhvbiBwcm9ncmFtIGFuZCB5b3UgYXJlIG5vdCBzdXJlCi10aGF0IGl0IGhhcyB0aGUgcmlnaHQgdHlwZSwgeW91IG11c3QgcGVyZm9ybSBhIHR5cGUgY2hlY2sgZmlyc3Q7Ci1mb3IgZXhhbXBsZSwgdG8gY2hlY2sgdGhhdCBhbiBvYmplY3QgaXMgYSBkaWN0aW9uYXJ5LCB1c2UKLVxjZnVuY3Rpb257UHlEaWN0X0NoZWNrKCl9LiAgVGhlIGNoYXB0ZXIgaXMgc3RydWN0dXJlZCBsaWtlIHRoZQotYGBmYW1pbHkgdHJlZScnIG9mIFB5dGhvbiBvYmplY3QgdHlwZXMuCi0KLVx3YXJuaW5ne1doaWxlIHRoZSBmdW5jdGlvbnMgZGVzY3JpYmVkIGluIHRoaXMgY2hhcHRlciBjYXJlZnVsbHkgY2hlY2sKLXRoZSB0eXBlIG9mIHRoZSBvYmplY3RzIHdoaWNoIGFyZSBwYXNzZWQgaW4sIG1hbnkgb2YgdGhlbSBkbyBub3QgY2hlY2sKLWZvciBcTlVMTHt9IGJlaW5nIHBhc3NlZCBpbnN0ZWFkIG9mIGEgdmFsaWQgb2JqZWN0LiAgQWxsb3dpbmcgXE5VTEx7fQotdG8gYmUgcGFzc2VkIGluIGNhbiBjYXVzZSBtZW1vcnkgYWNjZXNzIHZpb2xhdGlvbnMgYW5kIGltbWVkaWF0ZQotdGVybWluYXRpb24gb2YgdGhlIGludGVycHJldGVyLn0KLQotCi1cc2VjdGlvbntGdW5kYW1lbnRhbCBPYmplY3RzIFxsYWJlbHtmdW5kYW1lbnRhbH19Ci0KLVRoaXMgc2VjdGlvbiBkZXNjcmliZXMgUHl0aG9uIHR5cGUgb2JqZWN0cyBhbmQgdGhlIHNpbmdsZXRvbiBvYmplY3QKLVxjb2Rle05vbmV9LgotCi0KLVxzdWJzZWN0aW9ue1R5cGUgT2JqZWN0cyBcbGFiZWx7dHlwZU9iamVjdHN9fQotCi1cb2JpbmRleHt0eXBlfQotXGJlZ2lue2N0eXBlZGVzY317UHlUeXBlT2JqZWN0fQotICBUaGUgQyBzdHJ1Y3R1cmUgb2YgdGhlIG9iamVjdHMgdXNlZCB0byBkZXNjcmliZSBidWlsdC1pbiB0eXBlcy4KLVxlbmR7Y3R5cGVkZXNjfQotCi1cYmVnaW57Y3ZhcmRlc2N9e1B5T2JqZWN0Kn17UHlUeXBlX1R5cGV9Ci0gIFRoaXMgaXMgdGhlIHR5cGUgb2JqZWN0IGZvciB0eXBlIG9iamVjdHM7IGl0IGlzIHRoZSBzYW1lIG9iamVjdCBhcwotICBcY29kZXt0eXBlfSBhbmQgXGNvZGV7dHlwZXMuVHlwZVR5cGV9IGluIHRoZSBQeXRob24gbGF5ZXIuCi0gIFx3aXRoc3ViaXRlbXsoaW4gbW9kdWxlIHR5cGVzKX17XHR0aW5kZXh7VHlwZVR5cGV9fQotXGVuZHtjdmFyZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeVR5cGVfQ2hlY2t9e1B5T2JqZWN0ICpvfQotICBSZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IFx2YXJ7b30gaXMgYSB0eXBlIG9iamVjdCwgaW5jbHVkaW5nCi0gIGluc3RhbmNlcyBvZiB0eXBlcyBkZXJpdmVkIGZyb20gdGhlIHN0YW5kYXJkIHR5cGUgb2JqZWN0LiAgUmV0dXJuCi0gIGZhbHNlIGluIGFsbCBvdGhlciBjYXNlcy4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5VHlwZV9DaGVja0V4YWN0fXtQeU9iamVjdCAqb30KLSAgUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBcdmFye299IGlzIGEgdHlwZSBvYmplY3QsIGJ1dCBub3QgYQotICBzdWJ0eXBlIG9mIHRoZSBzdGFuZGFyZCB0eXBlIG9iamVjdC4gIFJldHVybiBmYWxzZSBpbiBhbGwgb3RoZXIKLSAgY2FzZXMuCi0gIFx2ZXJzaW9uYWRkZWR7Mi4yfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlUeXBlX0hhc0ZlYXR1cmV9e1B5T2JqZWN0ICpvLCBpbnQgZmVhdHVyZX0KLSAgUmV0dXJuIHRydWUgaWYgdGhlIHR5cGUgb2JqZWN0IFx2YXJ7b30gc2V0cyB0aGUgZmVhdHVyZQotICBcdmFye2ZlYXR1cmV9LiAgVHlwZSBmZWF0dXJlcyBhcmUgZGVub3RlZCBieSBzaW5nbGUgYml0IGZsYWdzLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlUeXBlX0lTX0dDfXtQeU9iamVjdCAqb30KLSAgUmV0dXJuIHRydWUgaWYgdGhlIHR5cGUgb2JqZWN0IGluY2x1ZGVzIHN1cHBvcnQgZm9yIHRoZSBjeWNsZQotICBkZXRlY3RvcjsgdGhpcyB0ZXN0cyB0aGUgdHlwZSBmbGFnIFxjb25zdGFudHtQeV9UUEZMQUdTX0hBVkVfR0N9LgotICBcdmVyc2lvbmFkZGVkezIuMH0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5VHlwZV9Jc1N1YnR5cGV9e1B5VHlwZU9iamVjdCAqYSwgUHlUeXBlT2JqZWN0ICpifQotICBSZXR1cm4gdHJ1ZSBpZiBcdmFye2F9IGlzIGEgc3VidHlwZSBvZiBcdmFye2J9LgotICBcdmVyc2lvbmFkZGVkezIuMn0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5VHlwZV9HZW5lcmljQWxsb2N9e1B5VHlwZU9iamVjdCAqdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBuaXRlbXN9Ci0gIFx2ZXJzaW9uYWRkZWR7Mi4yfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlUeXBlX0dlbmVyaWNOZXd9e1B5VHlwZU9iamVjdCAqdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzfQotICBcdmVyc2lvbmFkZGVkezIuMn0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5VHlwZV9SZWFkeX17UHlUeXBlT2JqZWN0ICp0eXBlfQotICBGaW5hbGl6ZSBhIHR5cGUgb2JqZWN0LiAgVGhpcyBzaG91bGQgYmUgY2FsbGVkIG9uIGFsbCB0eXBlIG9iamVjdHMKLSAgdG8gZmluaXNoIHRoZWlyIGluaXRpYWxpemF0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IKLSAgYWRkaW5nIGluaGVyaXRlZCBzbG90cyBmcm9tIGEgdHlwZSdzIGJhc2UgY2xhc3MuICBSZXR1cm4gXGNvZGV7MH0KLSAgb24gc3VjY2Vzcywgb3IgcmV0dXJuIFxjb2Rley0xfSBhbmQgc2V0cyBhbiBleGNlcHRpb24gb24gZXJyb3IuCi0gIFx2ZXJzaW9uYWRkZWR7Mi4yfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLQotXHN1YnNlY3Rpb257VGhlIE5vbmUgT2JqZWN0IFxsYWJlbHtub25lT2JqZWN0fX0KLQotXG9iaW5kZXh7Tm9uZX0KLU5vdGUgdGhhdCB0aGUgXGN0eXBle1B5VHlwZU9iamVjdH0gZm9yIFxjb2Rle05vbmV9IGlzIG5vdCBkaXJlY3RseQotZXhwb3NlZCBpbiB0aGUgUHl0aG9uL0MgQVBJLiAgU2luY2UgXGNvZGV7Tm9uZX0gaXMgYSBzaW5nbGV0b24sCi10ZXN0aW5nIGZvciBvYmplY3QgaWRlbnRpdHkgKHVzaW5nIFxzYW1wez09fSBpbiBDKSBpcyBzdWZmaWNpZW50LgotVGhlcmUgaXMgbm8gXGNmdW5jdGlvbntQeU5vbmVfQ2hlY2soKX0gZnVuY3Rpb24gZm9yIHRoZSBzYW1lIHJlYXNvbi4KLQotXGJlZ2lue2N2YXJkZXNjfXtQeU9iamVjdCp9e1B5X05vbmV9Ci0gIFRoZSBQeXRob24gXGNvZGV7Tm9uZX0gb2JqZWN0LCBkZW5vdGluZyBsYWNrIG9mIHZhbHVlLiAgVGhpcyBvYmplY3QKLSAgaGFzIG5vIG1ldGhvZHMuICBJdCBuZWVkcyB0byBiZSB0cmVhdGVkIGp1c3QgbGlrZSBhbnkgb3RoZXIgb2JqZWN0Ci0gIHdpdGggcmVzcGVjdCB0byByZWZlcmVuY2UgY291bnRzLgotXGVuZHtjdmFyZGVzY30KLQotXGJlZ2lue2NzaW1wbGVtYWNyb2Rlc2N9e1B5X1JFVFVSTl9OT05FfQotICBQcm9wZXJseSBoYW5kbGUgcmV0dXJuaW5nIFxjZGF0YXtQeV9Ob25lfSBmcm9tIHdpdGhpbiBhIEMgZnVuY3Rpb24uCi0gIFx2ZXJzaW9uYWRkZWR7Mi40fQotXGVuZHtjc2ltcGxlbWFjcm9kZXNjfQotCi0KLVxzZWN0aW9ue051bWVyaWMgT2JqZWN0cyBcbGFiZWx7bnVtZXJpY09iamVjdHN9fQotCi1cb2JpbmRleHtudW1lcmljfQotCi0KLVxzdWJzZWN0aW9ue1BsYWluIEludGVnZXIgT2JqZWN0cyBcbGFiZWx7aW50T2JqZWN0c319Ci0KLVxvYmluZGV4e2ludGVnZXJ9Ci1cYmVnaW57Y3R5cGVkZXNjfXtQeUludE9iamVjdH0KLSAgVGhpcyBzdWJ0eXBlIG9mIFxjdHlwZXtQeU9iamVjdH0gcmVwcmVzZW50cyBhIFB5dGhvbiBpbnRlZ2VyCi0gIG9iamVjdC4KLVxlbmR7Y3R5cGVkZXNjfQotCi1cYmVnaW57Y3ZhcmRlc2N9e1B5VHlwZU9iamVjdH17UHlJbnRfVHlwZX0KLSAgVGhpcyBpbnN0YW5jZSBvZiBcY3R5cGV7UHlUeXBlT2JqZWN0fSByZXByZXNlbnRzIHRoZSBQeXRob24gcGxhaW4KLSAgaW50ZWdlciB0eXBlLiAgVGhpcyBpcyB0aGUgc2FtZSBvYmplY3QgYXMgXGNvZGV7aW50fSBhbmQKLSAgXGNvZGV7dHlwZXMuSW50VHlwZX0uCi0gIFx3aXRoc3ViaXRlbXsoaW4gbW9kdWxlcyB0eXBlcyl9e1x0dGluZGV4e0ludFR5cGV9fQotXGVuZHtjdmFyZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeUludF9DaGVja317UHlPYmplY3QgKm99Ci0gIFJldHVybiB0cnVlIGlmIFx2YXJ7b30gaXMgb2YgdHlwZSBcY2RhdGF7UHlJbnRfVHlwZX0gb3IgYSBzdWJ0eXBlCi0gIG9mIFxjZGF0YXtQeUludF9UeXBlfS4KLSAgXHZlcnNpb25jaGFuZ2VkW0FsbG93ZWQgc3VidHlwZXMgdG8gYmUgYWNjZXB0ZWRdezIuMn0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5SW50X0NoZWNrRXhhY3R9e1B5T2JqZWN0ICpvfQotICBSZXR1cm4gdHJ1ZSBpZiBcdmFye299IGlzIG9mIHR5cGUgXGNkYXRhe1B5SW50X1R5cGV9LCBidXQgbm90IGEKLSAgc3VidHlwZSBvZiBcY2RhdGF7UHlJbnRfVHlwZX0uCi0gIFx2ZXJzaW9uYWRkZWR7Mi4yfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlJbnRfRnJvbVN0cmluZ317Y2hhciAqc3RyLCBjaGFyICoqcGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJhc2V9Ci0gIFJldHVybiBhIG5ldyBcY3R5cGV7UHlJbnRPYmplY3R9IG9yIFxjdHlwZXtQeUxvbmdPYmplY3R9IGJhc2VkIG9uIHRoZQotICBzdHJpbmcgdmFsdWUgaW4gXHZhcntzdHJ9LCB3aGljaCBpcyBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gdGhlIHJhZGl4IGluCi0gIFx2YXJ7YmFzZX0uICBJZiBcdmFye3BlbmR9IGlzIG5vbi1cTlVMTHt9LCBcY29kZXsqXHZhcntwZW5kfX0gd2lsbCBwb2ludCB0bwotICB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIFx2YXJ7c3RyfSB3aGljaCBmb2xsb3dzIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUKLSAgbnVtYmVyLiAgSWYgXHZhcntiYXNlfSBpcyBcY29kZXswfSwgdGhlIHJhZGl4IHdpbGwgYmUgZGV0ZXJtaW5lZCBiYXNlZCBvbgotICB0aGUgbGVhZGluZyBjaGFyYWN0ZXJzIG9mIFx2YXJ7c3RyfTogaWYgXHZhcntzdHJ9IHN0YXJ0cyB3aXRoIFxjb2RleycweCd9Ci0gIG9yIFxjb2RleycwWCd9LCByYWRpeCAxNiB3aWxsIGJlIHVzZWQ7IGlmIFx2YXJ7c3RyfSBzdGFydHMgd2l0aAotICBcY29kZXsnMCd9LCByYWRpeCA4IHdpbGwgYmUgdXNlZDsgb3RoZXJ3aXNlIHJhZGl4IDEwIHdpbGwgYmUgdXNlZC4gIElmCi0gIFx2YXJ7YmFzZX0gaXMgbm90IFxjb2RlezB9LCBpdCBtdXN0IGJlIGJldHdlZW4gXGNvZGV7Mn0gYW5kIFxjb2RlezM2fSwKLSAgaW5jbHVzaXZlLiAgTGVhZGluZyBzcGFjZXMgYXJlIGlnbm9yZWQuICBJZiB0aGVyZSBhcmUgbm8gZGlnaXRzLAotICBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IHdpbGwgYmUgcmFpc2VkLiAgSWYgdGhlIHN0cmluZyByZXByZXNlbnRzIGEgbnVtYmVyCi0gIHRvbyBsYXJnZSB0byBiZSBjb250YWluZWQgd2l0aGluIHRoZSBtYWNoaW5lJ3MgXGN0eXBle2xvbmcgaW50fSB0eXBlIGFuZAotICBvdmVyZmxvdyB3YXJuaW5ncyBhcmUgYmVpbmcgc3VwcHJlc3NlZCwgYSBcY3R5cGV7UHlMb25nT2JqZWN0fSB3aWxsIGJlCi0gIHJldHVybmVkLiAgSWYgb3ZlcmZsb3cgd2FybmluZ3MgYXJlIG5vdCBiZWluZyBzdXBwcmVzc2VkLCBcTlVMTHt9IHdpbGwgYmUKLSAgcmV0dXJuZWQgaW4gdGhpcyBjYXNlLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlJbnRfRnJvbUxvbmd9e2xvbmcgaXZhbH0KLSAgQ3JlYXRlIGEgbmV3IGludGVnZXIgb2JqZWN0IHdpdGggYSB2YWx1ZSBvZiBcdmFye2l2YWx9LgotCi0gIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGtlZXBzIGFuIGFycmF5IG9mIGludGVnZXIgb2JqZWN0cyBmb3IgYWxsCi0gIGludGVnZXJzIGJldHdlZW4gXGNvZGV7LTV9IGFuZCBcY29kZXsyNTZ9LCB3aGVuIHlvdSBjcmVhdGUgYW4gaW50IGluCi0gIHRoYXQgcmFuZ2UgeW91IGFjdHVhbGx5IGp1c3QgZ2V0IGJhY2sgYSByZWZlcmVuY2UgdG8gdGhlIGV4aXN0aW5nCi0gIG9iamVjdC4gU28gaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGNoYW5nZSB0aGUgdmFsdWUgb2YgXGNvZGV7MX0uICBJCi0gIHN1c3BlY3QgdGhlIGJlaGF2aW91ciBvZiBQeXRob24gaW4gdGhpcyBjYXNlIGlzIHVuZGVmaW5lZC4gOi0pCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeUludF9Gcm9tU3NpemVfdH17UHlfc3NpemVfdCBpdmFsfQotICBDcmVhdGUgYSBuZXcgaW50ZWdlciBvYmplY3Qgd2l0aCBhIHZhbHVlIG9mIFx2YXJ7aXZhbH0uCi0gIElmIHRoZSB2YWx1ZSBleGNlZWRzIFxjb2Rle0xPTkdfTUFYfSwgYSBsb25nIGludGVnZXIgb2JqZWN0IGlzCi0gIHJldHVybmVkLgotCi0gXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317bG9uZ317UHlJbnRfQXNMb25nfXtQeU9iamVjdCAqaW99Ci0gIFdpbGwgZmlyc3QgYXR0ZW1wdCB0byBjYXN0IHRoZSBvYmplY3QgdG8gYSBcY3R5cGV7UHlJbnRPYmplY3R9LCBpZgotICBpdCBpcyBub3QgYWxyZWFkeSBvbmUsIGFuZCB0aGVuIHJldHVybiBpdHMgdmFsdWUuIElmIHRoZXJlIGlzIGFuCi0gIGVycm9yLCBcY29kZXstMX0gaXMgcmV0dXJuZWQsIGFuZCB0aGUgY2FsbGVyIHNob3VsZCBjaGVjawotICBcY29kZXtQeUVycl9PY2N1cnJlZCgpfSB0byBmaW5kIG91dCB3aGV0aGVyIHRoZXJlIHdhcyBhbiBlcnJvciwgb3IKLSAgd2hldGhlciB0aGUgdmFsdWUganVzdCBoYXBwZW5lZCB0byBiZSAtMS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtsb25nfXtQeUludF9BU19MT05HfXtQeU9iamVjdCAqaW99Ci0gIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG9iamVjdCBcdmFye2lvfS4gIE5vIGVycm9yIGNoZWNraW5nIGlzCi0gIHBlcmZvcm1lZC4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXt1bnNpZ25lZCBsb25nfXtQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2t9e1B5T2JqZWN0ICppb30KLSAgV2lsbCBmaXJzdCBhdHRlbXB0IHRvIGNhc3QgdGhlIG9iamVjdCB0byBhIFxjdHlwZXtQeUludE9iamVjdH0gb3IKLSAgXGN0eXBle1B5TG9uZ09iamVjdH0sIGlmIGl0IGlzIG5vdCBhbHJlYWR5IG9uZSwgYW5kIHRoZW4gcmV0dXJuIGl0cwotICB2YWx1ZSBhcyB1bnNpZ25lZCBsb25nLiAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjaGVjayBmb3Igb3ZlcmZsb3cuCi0gIFx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e3Vuc2lnbmVkIFBZX0xPTkdfTE9OR317UHlJbnRfQXNVbnNpZ25lZExvbmdMb25nTWFza317UHlPYmplY3QgKmlvfQotICBXaWxsIGZpcnN0IGF0dGVtcHQgdG8gY2FzdCB0aGUgb2JqZWN0IHRvIGEgXGN0eXBle1B5SW50T2JqZWN0fSBvcgotICBcY3R5cGV7UHlMb25nT2JqZWN0fSwgaWYgaXQgaXMgbm90IGFscmVhZHkgb25lLCBhbmQgdGhlbiByZXR1cm4gaXRzCi0gIHZhbHVlIGFzIHVuc2lnbmVkIGxvbmcgbG9uZywgd2l0aG91dCBjaGVja2luZyBmb3Igb3ZlcmZsb3cuCi0gIFx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5X3NzaXplX3R9e1B5SW50X0FzU3NpemVfdH17UHlPYmplY3QgKmlvfQotICBXaWxsIGZpcnN0IGF0dGVtcHQgdG8gY2FzdCB0aGUgb2JqZWN0IHRvIGEgXGN0eXBle1B5SW50T2JqZWN0fSBvcgotICBcY3R5cGV7UHlMb25nT2JqZWN0fSwgaWYgaXQgaXMgbm90IGFscmVhZHkgb25lLCBhbmQgdGhlbiByZXR1cm4gaXRzCi0gIHZhbHVlIGFzIFxjdHlwZXtQeV9zc2l6ZV90fS4KLSAgXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317bG9uZ317UHlJbnRfR2V0TWF4fXt9Ci0gIFJldHVybiB0aGUgc3lzdGVtJ3MgaWRlYSBvZiB0aGUgbGFyZ2VzdCBpbnRlZ2VyIGl0IGNhbiBoYW5kbGUKLSAgKFxjb25zdGFudHtMT05HX01BWH1cdHRpbmRleHtMT05HX01BWH0sIGFzIGRlZmluZWQgaW4gdGhlIHN5c3RlbQotICBoZWFkZXIgZmlsZXMpLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxzdWJzZWN0aW9ue0Jvb2xlYW4gT2JqZWN0cyBcbGFiZWx7Ym9vbE9iamVjdHN9fQotCi1Cb29sZWFucyBpbiBQeXRob24gYXJlIGltcGxlbWVudGVkIGFzIGEgc3ViY2xhc3Mgb2YgaW50ZWdlcnMuICBUaGVyZQotYXJlIG9ubHkgdHdvIGJvb2xlYW5zLCBcY29uc3RhbnR7UHlfRmFsc2V9IGFuZCBcY29uc3RhbnR7UHlfVHJ1ZX0uICBBcwotc3VjaCwgdGhlIG5vcm1hbCBjcmVhdGlvbiBhbmQgZGVsZXRpb24gZnVuY3Rpb25zIGRvbid0IGFwcGx5IHRvCi1ib29sZWFucy4gIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSBhdmFpbGFibGUsIGhvd2V2ZXIuCi0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlCb29sX0NoZWNrfXtQeU9iamVjdCAqb30KLSAgUmV0dXJuIHRydWUgaWYgXHZhcntvfSBpcyBvZiB0eXBlIFxjZGF0YXtQeUJvb2xfVHlwZX0uCi0gIFx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjdmFyZGVzY317UHlPYmplY3QqfXtQeV9GYWxzZX0KLSAgVGhlIFB5dGhvbiBcY29kZXtGYWxzZX0gb2JqZWN0LiAgVGhpcyBvYmplY3QgaGFzIG5vIG1ldGhvZHMuICBJdCBuZWVkcyB0bwotICBiZSB0cmVhdGVkIGp1c3QgbGlrZSBhbnkgb3RoZXIgb2JqZWN0IHdpdGggcmVzcGVjdCB0byByZWZlcmVuY2UgY291bnRzLgotXGVuZHtjdmFyZGVzY30KLQotXGJlZ2lue2N2YXJkZXNjfXtQeU9iamVjdCp9e1B5X1RydWV9Ci0gIFRoZSBQeXRob24gXGNvZGV7VHJ1ZX0gb2JqZWN0LiAgVGhpcyBvYmplY3QgaGFzIG5vIG1ldGhvZHMuICBJdCBuZWVkcyB0bwotICBiZSB0cmVhdGVkIGp1c3QgbGlrZSBhbnkgb3RoZXIgb2JqZWN0IHdpdGggcmVzcGVjdCB0byByZWZlcmVuY2UgY291bnRzLgotXGVuZHtjdmFyZGVzY30KLQotXGJlZ2lue2NzaW1wbGVtYWNyb2Rlc2N9e1B5X1JFVFVSTl9GQUxTRX0KLSAgUmV0dXJuIFxjb25zdGFudHtQeV9GYWxzZX0gZnJvbSBhIGZ1bmN0aW9uLCBwcm9wZXJseSBpbmNyZW1lbnRpbmcgaXRzCi0gIHJlZmVyZW5jZSBjb3VudC4KLVx2ZXJzaW9uYWRkZWR7Mi40fQotXGVuZHtjc2ltcGxlbWFjcm9kZXNjfQotCi1cYmVnaW57Y3NpbXBsZW1hY3JvZGVzY317UHlfUkVUVVJOX1RSVUV9Ci0gIFJldHVybiBcY29uc3RhbnR7UHlfVHJ1ZX0gZnJvbSBhIGZ1bmN0aW9uLCBwcm9wZXJseSBpbmNyZW1lbnRpbmcgaXRzCi0gIHJlZmVyZW5jZSBjb3VudC4KLVx2ZXJzaW9uYWRkZWR7Mi40fQotXGVuZHtjc2ltcGxlbWFjcm9kZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5Qm9vbF9Gcm9tTG9uZ317bG9uZyB2fQotICBSZXR1cm4gYSBuZXcgcmVmZXJlbmNlIHRvIFxjb25zdGFudHtQeV9UcnVlfSBvciBcY29uc3RhbnR7UHlfRmFsc2V9Ci0gIGRlcGVuZGluZyBvbiB0aGUgdHJ1dGggdmFsdWUgb2YgXHZhcnt2fS4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxzdWJzZWN0aW9ue0xvbmcgSW50ZWdlciBPYmplY3RzIFxsYWJlbHtsb25nT2JqZWN0c319Ci0KLVxvYmluZGV4e2xvbmcgaW50ZWdlcn0KLVxiZWdpbntjdHlwZWRlc2N9e1B5TG9uZ09iamVjdH0KLSAgVGhpcyBzdWJ0eXBlIG9mIFxjdHlwZXtQeU9iamVjdH0gcmVwcmVzZW50cyBhIFB5dGhvbiBsb25nIGludGVnZXIKLSAgb2JqZWN0LgotXGVuZHtjdHlwZWRlc2N9Ci0KLVxiZWdpbntjdmFyZGVzY317UHlUeXBlT2JqZWN0fXtQeUxvbmdfVHlwZX0KLSAgVGhpcyBpbnN0YW5jZSBvZiBcY3R5cGV7UHlUeXBlT2JqZWN0fSByZXByZXNlbnRzIHRoZSBQeXRob24gbG9uZwotICBpbnRlZ2VyIHR5cGUuICBUaGlzIGlzIHRoZSBzYW1lIG9iamVjdCBhcyBcY29kZXtsb25nfSBhbmQKLSAgXGNvZGV7dHlwZXMuTG9uZ1R5cGV9LgotICBcd2l0aHN1Yml0ZW17KGluIG1vZHVsZXMgdHlwZXMpfXtcdHRpbmRleHtMb25nVHlwZX19Ci1cZW5ke2N2YXJkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5TG9uZ19DaGVja317UHlPYmplY3QgKnB9Ci0gIFJldHVybiB0cnVlIGlmIGl0cyBhcmd1bWVudCBpcyBhIFxjdHlwZXtQeUxvbmdPYmplY3R9IG9yIGEgc3VidHlwZQotICBvZiBcY3R5cGV7UHlMb25nT2JqZWN0fS4KLSAgXHZlcnNpb25jaGFuZ2VkW0FsbG93ZWQgc3VidHlwZXMgdG8gYmUgYWNjZXB0ZWRdezIuMn0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5TG9uZ19DaGVja0V4YWN0fXtQeU9iamVjdCAqcH0KLSAgUmV0dXJuIHRydWUgaWYgaXRzIGFyZ3VtZW50IGlzIGEgXGN0eXBle1B5TG9uZ09iamVjdH0sIGJ1dCBub3QgYQotICBzdWJ0eXBlIG9mIFxjdHlwZXtQeUxvbmdPYmplY3R9LgotICBcdmVyc2lvbmFkZGVkezIuMn0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5TG9uZ19Gcm9tTG9uZ317bG9uZyB2fQotICBSZXR1cm4gYSBuZXcgXGN0eXBle1B5TG9uZ09iamVjdH0gb2JqZWN0IGZyb20gXHZhcnt2fSwgb3IgXE5VTEx7fQotICBvbiBmYWlsdXJlLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlMb25nX0Zyb21VbnNpZ25lZExvbmd9e3Vuc2lnbmVkIGxvbmcgdn0KLSAgUmV0dXJuIGEgbmV3IFxjdHlwZXtQeUxvbmdPYmplY3R9IG9iamVjdCBmcm9tIGEgQyBcY3R5cGV7dW5zaWduZWQKLSAgbG9uZ30sIG9yIFxOVUxMe30gb24gZmFpbHVyZS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5TG9uZ19Gcm9tTG9uZ0xvbmd9e1BZX0xPTkdfTE9ORyB2fQotICBSZXR1cm4gYSBuZXcgXGN0eXBle1B5TG9uZ09iamVjdH0gb2JqZWN0IGZyb20gYSBDIFxjdHlwZXtsb25nIGxvbmd9LAotICBvciBcTlVMTHt9IG9uIGZhaWx1cmUuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmd9e3Vuc2lnbmVkIFBZX0xPTkdfTE9ORyB2fQotICBSZXR1cm4gYSBuZXcgXGN0eXBle1B5TG9uZ09iamVjdH0gb2JqZWN0IGZyb20gYSBDIFxjdHlwZXt1bnNpZ25lZAotICBsb25nIGxvbmd9LCBvciBcTlVMTHt9IG9uIGZhaWx1cmUuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeUxvbmdfRnJvbURvdWJsZX17ZG91YmxlIHZ9Ci0gIFJldHVybiBhIG5ldyBcY3R5cGV7UHlMb25nT2JqZWN0fSBvYmplY3QgZnJvbSB0aGUgaW50ZWdlciBwYXJ0IG9mCi0gIFx2YXJ7dn0sIG9yIFxOVUxMe30gb24gZmFpbHVyZS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5TG9uZ19Gcm9tU3RyaW5nfXtjaGFyICpzdHIsIGNoYXIgKipwZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJhc2V9Ci0gIFJldHVybiBhIG5ldyBcY3R5cGV7UHlMb25nT2JqZWN0fSBiYXNlZCBvbiB0aGUgc3RyaW5nIHZhbHVlIGluCi0gIFx2YXJ7c3RyfSwgd2hpY2ggaXMgaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvIHRoZSByYWRpeCBpbgotICBcdmFye2Jhc2V9LiAgSWYgXHZhcntwZW5kfSBpcyBub24tXE5VTEx7fSwgXGNvZGV7Klx2YXJ7cGVuZH19IHdpbGwKLSAgcG9pbnQgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBpbiBcdmFye3N0cn0gd2hpY2ggZm9sbG93cyB0aGUKLSAgcmVwcmVzZW50YXRpb24gb2YgdGhlIG51bWJlci4gIElmIFx2YXJ7YmFzZX0gaXMgXGNvZGV7MH0sIHRoZSByYWRpeAotICB3aWxsIGJlIGRldGVybWluZWQgYmFzZWQgb24gdGhlIGxlYWRpbmcgY2hhcmFjdGVycyBvZiBcdmFye3N0cn06IGlmCi0gIFx2YXJ7c3RyfSBzdGFydHMgd2l0aCBcY29kZXsnMHgnfSBvciBcY29kZXsnMFgnfSwgcmFkaXggMTYgd2lsbCBiZQotICB1c2VkOyBpZiBcdmFye3N0cn0gc3RhcnRzIHdpdGggXGNvZGV7JzAnfSwgcmFkaXggOCB3aWxsIGJlIHVzZWQ7Ci0gIG90aGVyd2lzZSByYWRpeCAxMCB3aWxsIGJlIHVzZWQuICBJZiBcdmFye2Jhc2V9IGlzIG5vdCBcY29kZXswfSwgaXQKLSAgbXVzdCBiZSBiZXR3ZWVuIFxjb2RlezJ9IGFuZCBcY29kZXszNn0sIGluY2x1c2l2ZS4gIExlYWRpbmcgc3BhY2VzCi0gIGFyZSBpZ25vcmVkLiAgSWYgdGhlcmUgYXJlIG5vIGRpZ2l0cywgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSB3aWxsIGJlCi0gIHJhaXNlZC4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5TG9uZ19Gcm9tVW5pY29kZX17UHlfVU5JQ09ERSAqdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbmd0aCwgaW50IGJhc2V9Ci0gIENvbnZlcnQgYSBzZXF1ZW5jZSBvZiBVbmljb2RlIGRpZ2l0cyB0byBhIFB5dGhvbiBsb25nIGludGVnZXIKLSAgdmFsdWUuICBUaGUgZmlyc3QgcGFyYW1ldGVyLCBcdmFye3V9LCBwb2ludHMgdG8gdGhlIGZpcnN0IGNoYXJhY3RlcgotICBvZiB0aGUgVW5pY29kZSBzdHJpbmcsIFx2YXJ7bGVuZ3RofSBnaXZlcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMsCi0gIGFuZCBcdmFye2Jhc2V9IGlzIHRoZSByYWRpeCBmb3IgdGhlIGNvbnZlcnNpb24uICBUaGUgcmFkaXggbXVzdCBiZQotICBpbiB0aGUgcmFuZ2UgWzIsIDM2XTsgaWYgaXQgaXMgb3V0IG9mIHJhbmdlLCBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9Ci0gIHdpbGwgYmUgcmFpc2VkLgotICBcdmVyc2lvbmFkZGVkezEuNn0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5TG9uZ19Gcm9tVm9pZFB0cn17dm9pZCAqcH0KLSAgQ3JlYXRlIGEgUHl0aG9uIGludGVnZXIgb3IgbG9uZyBpbnRlZ2VyIGZyb20gdGhlIHBvaW50ZXIgXHZhcntwfS4KLSAgVGhlIHBvaW50ZXIgdmFsdWUgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSByZXN1bHRpbmcgdmFsdWUgdXNpbmcKLSAgXGNmdW5jdGlvbntQeUxvbmdfQXNWb2lkUHRyKCl9LgotICBcdmVyc2lvbmFkZGVkezEuNS4yfQotICBcdmVyc2lvbmNoYW5nZWRbSWYgdGhlIGludGVnZXIgaXMgbGFyZ2VyIHRoYW4gTE9OR19NQVgsCi0gIGEgcG9zaXRpdmUgbG9uZyBpbnRlZ2VyIGlzIHJldHVybmVkXXsyLjV9Ci0gXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2xvbmd9e1B5TG9uZ19Bc0xvbmd9e1B5T2JqZWN0ICpweWxvbmd9Ci0gIFJldHVybiBhIEMgXGN0eXBle2xvbmd9IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb250ZW50cyBvZgotICBcdmFye3B5bG9uZ30uICBJZiBcdmFye3B5bG9uZ30gaXMgZ3JlYXRlciB0aGFuCi0gIFxjb25zdGFudHtMT05HX01BWH1cdHRpbmRleHtMT05HX01BWH0sIGFuIFxleGNlcHRpb257T3ZlcmZsb3dFcnJvcn0KLSAgaXMgcmFpc2VkLgotICBcd2l0aHN1Yml0ZW17KGJ1aWx0LWluIGV4Y2VwdGlvbil9e1x0dGluZGV4e092ZXJmbG93RXJyb3J9fQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e3Vuc2lnbmVkIGxvbmd9e1B5TG9uZ19Bc1Vuc2lnbmVkTG9uZ317UHlPYmplY3QgKnB5bG9uZ30KLSAgUmV0dXJuIGEgQyBcY3R5cGV7dW5zaWduZWQgbG9uZ30gcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbnRlbnRzIG9mCi0gIFx2YXJ7cHlsb25nfS4gIElmIFx2YXJ7cHlsb25nfSBpcyBncmVhdGVyIHRoYW4KLSAgXGNvbnN0YW50e1VMT05HX01BWH1cdHRpbmRleHtVTE9OR19NQVh9LCBhbgotICBcZXhjZXB0aW9ue092ZXJmbG93RXJyb3J9IGlzIHJhaXNlZC4KLSAgXHdpdGhzdWJpdGVteyhidWlsdC1pbiBleGNlcHRpb24pfXtcdHRpbmRleHtPdmVyZmxvd0Vycm9yfX0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQWV9MT05HX0xPTkd9e1B5TG9uZ19Bc0xvbmdMb25nfXtQeU9iamVjdCAqcHlsb25nfQotICBSZXR1cm4gYSBDIFxjdHlwZXtsb25nIGxvbmd9IGZyb20gYSBQeXRob24gbG9uZyBpbnRlZ2VyLiAgSWYKLSAgXHZhcntweWxvbmd9IGNhbm5vdCBiZSByZXByZXNlbnRlZCBhcyBhIFxjdHlwZXtsb25nIGxvbmd9LCBhbgotICBcZXhjZXB0aW9ue092ZXJmbG93RXJyb3J9IHdpbGwgYmUgcmFpc2VkLgotICBcdmVyc2lvbmFkZGVkezIuMn0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXt1bnNpZ25lZCBQWV9MT05HX0xPTkd9e1B5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmd9e1B5T2JqZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpweWxvbmd9Ci0gIFJldHVybiBhIEMgXGN0eXBle3Vuc2lnbmVkIGxvbmcgbG9uZ30gZnJvbSBhIFB5dGhvbiBsb25nIGludGVnZXIuCi0gIElmIFx2YXJ7cHlsb25nfSBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgYXMgYW4gXGN0eXBle3Vuc2lnbmVkIGxvbmcKLSAgbG9uZ30sIGFuIFxleGNlcHRpb257T3ZlcmZsb3dFcnJvcn0gd2lsbCBiZSByYWlzZWQgaWYgdGhlIHZhbHVlIGlzCi0gIHBvc2l0aXZlLCBvciBhIFxleGNlcHRpb257VHlwZUVycm9yfSB3aWxsIGJlIHJhaXNlZCBpZiB0aGUgdmFsdWUgaXMKLSAgbmVnYXRpdmUuCi0gIFx2ZXJzaW9uYWRkZWR7Mi4yfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e3Vuc2lnbmVkIGxvbmd9e1B5TG9uZ19Bc1Vuc2lnbmVkTG9uZ01hc2t9e1B5T2JqZWN0ICppb30KLSAgUmV0dXJuIGEgQyBcY3R5cGV7dW5zaWduZWQgbG9uZ30gZnJvbSBhIFB5dGhvbiBsb25nIGludGVnZXIsIHdpdGhvdXQKLSAgY2hlY2tpbmcgZm9yIG92ZXJmbG93LgotICBcdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXt1bnNpZ25lZCBQWV9MT05HX0xPTkd9e1B5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrfXtQeU9iamVjdCAqaW99Ci0gIFJldHVybiBhIEMgXGN0eXBle3Vuc2lnbmVkIGxvbmcgbG9uZ30gZnJvbSBhIFB5dGhvbiBsb25nIGludGVnZXIsIHdpdGhvdXQKLSAgY2hlY2tpbmcgZm9yIG92ZXJmbG93LgotICBcdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtkb3VibGV9e1B5TG9uZ19Bc0RvdWJsZX17UHlPYmplY3QgKnB5bG9uZ30KLSAgUmV0dXJuIGEgQyBcY3R5cGV7ZG91YmxlfSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29udGVudHMgb2YKLSAgXHZhcntweWxvbmd9LiAgSWYgXHZhcntweWxvbmd9IGNhbm5vdCBiZSBhcHByb3hpbWF0ZWx5IHJlcHJlc2VudGVkCi0gIGFzIGEgXGN0eXBle2RvdWJsZX0sIGFuIFxleGNlcHRpb257T3ZlcmZsb3dFcnJvcn0gZXhjZXB0aW9uIGlzCi0gIHJhaXNlZCBhbmQgXGNvZGV7LTEuMH0gd2lsbCBiZSByZXR1cm5lZC4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXt2b2lkKn17UHlMb25nX0FzVm9pZFB0cn17UHlPYmplY3QgKnB5bG9uZ30KLSAgQ29udmVydCBhIFB5dGhvbiBpbnRlZ2VyIG9yIGxvbmcgaW50ZWdlciBcdmFye3B5bG9uZ30gdG8gYSBDCi0gIFxjdHlwZXt2b2lkfSBwb2ludGVyLiAgSWYgXHZhcntweWxvbmd9IGNhbm5vdCBiZSBjb252ZXJ0ZWQsIGFuCi0gIFxleGNlcHRpb257T3ZlcmZsb3dFcnJvcn0gd2lsbCBiZSByYWlzZWQuICBUaGlzIGlzIG9ubHkgYXNzdXJlZCB0bwotICBwcm9kdWNlIGEgdXNhYmxlIFxjdHlwZXt2b2lkfSBwb2ludGVyIGZvciB2YWx1ZXMgY3JlYXRlZCB3aXRoCi0gIFxjZnVuY3Rpb257UHlMb25nX0Zyb21Wb2lkUHRyKCl9LgotICBcdmVyc2lvbmFkZGVkezEuNS4yfQotICBcdmVyc2lvbmNoYW5nZWRbRm9yIHZhbHVlcyBvdXRzaWRlIDAuLkxPTkdfTUFYLCBib3RoIHNpZ25lZCBhbmQKLSAgdW5zaWduZWQgaW50ZWdlcnMgYXJlIGFjY2NlcHRlZF17Mi41fQotXGVuZHtjZnVuY2Rlc2N9Ci0KLQotXHN1YnNlY3Rpb257RmxvYXRpbmcgUG9pbnQgT2JqZWN0cyBcbGFiZWx7ZmxvYXRPYmplY3RzfX0KLQotXG9iaW5kZXh7ZmxvYXRpbmcgcG9pbnR9Ci1cYmVnaW57Y3R5cGVkZXNjfXtQeUZsb2F0T2JqZWN0fQotICBUaGlzIHN1YnR5cGUgb2YgXGN0eXBle1B5T2JqZWN0fSByZXByZXNlbnRzIGEgUHl0aG9uIGZsb2F0aW5nIHBvaW50Ci0gIG9iamVjdC4KLVxlbmR7Y3R5cGVkZXNjfQotCi1cYmVnaW57Y3ZhcmRlc2N9e1B5VHlwZU9iamVjdH17UHlGbG9hdF9UeXBlfQotICBUaGlzIGluc3RhbmNlIG9mIFxjdHlwZXtQeVR5cGVPYmplY3R9IHJlcHJlc2VudHMgdGhlIFB5dGhvbiBmbG9hdGluZwotICBwb2ludCB0eXBlLiAgVGhpcyBpcyB0aGUgc2FtZSBvYmplY3QgYXMgXGNvZGV7ZmxvYXR9IGFuZAotICBcY29kZXt0eXBlcy5GbG9hdFR5cGV9LgotICBcd2l0aHN1Yml0ZW17KGluIG1vZHVsZXMgdHlwZXMpfXtcdHRpbmRleHtGbG9hdFR5cGV9fQotXGVuZHtjdmFyZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeUZsb2F0X0NoZWNrfXtQeU9iamVjdCAqcH0KLSAgUmV0dXJuIHRydWUgaWYgaXRzIGFyZ3VtZW50IGlzIGEgXGN0eXBle1B5RmxvYXRPYmplY3R9IG9yIGEgc3VidHlwZQotICBvZiBcY3R5cGV7UHlGbG9hdE9iamVjdH0uCi0gIFx2ZXJzaW9uY2hhbmdlZFtBbGxvd2VkIHN1YnR5cGVzIHRvIGJlIGFjY2VwdGVkXXsyLjJ9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeUZsb2F0X0NoZWNrRXhhY3R9e1B5T2JqZWN0ICpwfQotICBSZXR1cm4gdHJ1ZSBpZiBpdHMgYXJndW1lbnQgaXMgYSBcY3R5cGV7UHlGbG9hdE9iamVjdH0sIGJ1dCBub3QgYQotICBzdWJ0eXBlIG9mIFxjdHlwZXtQeUZsb2F0T2JqZWN0fS4KLSAgXHZlcnNpb25hZGRlZHsyLjJ9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeUZsb2F0X0Zyb21TdHJpbmd9e1B5T2JqZWN0ICpzdHJ9Ci0gIENyZWF0ZSBhIFxjdHlwZXtQeUZsb2F0T2JqZWN0fSBvYmplY3QgYmFzZWQgb24gdGhlIHN0cmluZyB2YWx1ZSBpbgotICBcdmFye3N0cn0sIG9yIFxOVUxMe30gb24gZmFpbHVyZS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5RmxvYXRfRnJvbURvdWJsZX17ZG91YmxlIHZ9Ci0gIENyZWF0ZSBhIFxjdHlwZXtQeUZsb2F0T2JqZWN0fSBvYmplY3QgZnJvbSBcdmFye3Z9LCBvciBcTlVMTHt9IG9uCi0gIGZhaWx1cmUuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317ZG91YmxlfXtQeUZsb2F0X0FzRG91YmxlfXtQeU9iamVjdCAqcHlmbG9hdH0KLSAgUmV0dXJuIGEgQyBcY3R5cGV7ZG91YmxlfSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29udGVudHMgb2YKLSAgXHZhcntweWZsb2F0fS4gIElmIFx2YXJ7cHlmbG9hdH0gaXMgbm90IGEgUHl0aG9uIGZsb2F0aW5nIHBvaW50Ci0gIG9iamVjdCBidXQgaGFzIGEgXG1ldGhvZHtfX2Zsb2F0X199IG1ldGhvZCwgdGhpcyBtZXRob2Qgd2lsbCBmaXJzdAotICBiZSBjYWxsZWQgdG8gY29udmVydCBcdmFye3B5ZmxvYXR9IGludG8gYSBmbG9hdC4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtkb3VibGV9e1B5RmxvYXRfQVNfRE9VQkxFfXtQeU9iamVjdCAqcHlmbG9hdH0KLSAgUmV0dXJuIGEgQyBcY3R5cGV7ZG91YmxlfSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29udGVudHMgb2YKLSAgXHZhcntweWZsb2F0fSwgYnV0IHdpdGhvdXQgZXJyb3IgY2hlY2tpbmcuCi1cZW5ke2NmdW5jZGVzY30KLQotCi1cc3Vic2VjdGlvbntDb21wbGV4IE51bWJlciBPYmplY3RzIFxsYWJlbHtjb21wbGV4T2JqZWN0c319Ci0KLVxvYmluZGV4e2NvbXBsZXggbnVtYmVyfQotUHl0aG9uJ3MgY29tcGxleCBudW1iZXIgb2JqZWN0cyBhcmUgaW1wbGVtZW50ZWQgYXMgdHdvIGRpc3RpbmN0IHR5cGVzCi13aGVuIHZpZXdlZCBmcm9tIHRoZSBDIEFQSTogIG9uZSBpcyB0aGUgUHl0aG9uIG9iamVjdCBleHBvc2VkIHRvCi1QeXRob24gcHJvZ3JhbXMsIGFuZCB0aGUgb3RoZXIgaXMgYSBDIHN0cnVjdHVyZSB3aGljaCByZXByZXNlbnRzIHRoZQotYWN0dWFsIGNvbXBsZXggbnVtYmVyIHZhbHVlLiAgVGhlIEFQSSBwcm92aWRlcyBmdW5jdGlvbnMgZm9yIHdvcmtpbmcKLXdpdGggYm90aC4KLQotXHN1YnN1YnNlY3Rpb257Q29tcGxleCBOdW1iZXJzIGFzIEMgU3RydWN0dXJlc30KLQotTm90ZSB0aGF0IHRoZSBmdW5jdGlvbnMgd2hpY2ggYWNjZXB0IHRoZXNlIHN0cnVjdHVyZXMgYXMgcGFyYW1ldGVycwotYW5kIHJldHVybiB0aGVtIGFzIHJlc3VsdHMgZG8gc28gXGVtcGh7YnkgdmFsdWV9IHJhdGhlciB0aGFuCi1kZXJlZmVyZW5jaW5nIHRoZW0gdGhyb3VnaCBwb2ludGVycy4gIFRoaXMgaXMgY29uc2lzdGVudCB0aHJvdWdob3V0Ci10aGUgQVBJLgotCi1cYmVnaW57Y3R5cGVkZXNjfXtQeV9jb21wbGV4fQotICBUaGUgQyBzdHJ1Y3R1cmUgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIHZhbHVlIHBvcnRpb24gb2YgYSBQeXRob24KLSAgY29tcGxleCBudW1iZXIgb2JqZWN0LiAgTW9zdCBvZiB0aGUgZnVuY3Rpb25zIGZvciBkZWFsaW5nIHdpdGgKLSAgY29tcGxleCBudW1iZXIgb2JqZWN0cyB1c2Ugc3RydWN0dXJlcyBvZiB0aGlzIHR5cGUgYXMgaW5wdXQgb3IKLSAgb3V0cHV0IHZhbHVlcywgYXMgYXBwcm9wcmlhdGUuICBJdCBpcyBkZWZpbmVkIGFzOgotCi1cYmVnaW57dmVyYmF0aW19Ci10eXBlZGVmIHN0cnVjdCB7Ci0gICBkb3VibGUgcmVhbDsKLSAgIGRvdWJsZSBpbWFnOwotfSBQeV9jb21wbGV4OwotXGVuZHt2ZXJiYXRpbX0KLVxlbmR7Y3R5cGVkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeV9jb21wbGV4fXtfUHlfY19zdW19e1B5X2NvbXBsZXggbGVmdCwgUHlfY29tcGxleCByaWdodH0KLSAgUmV0dXJuIHRoZSBzdW0gb2YgdHdvIGNvbXBsZXggbnVtYmVycywgdXNpbmcgdGhlIEMKLSAgXGN0eXBle1B5X2NvbXBsZXh9IHJlcHJlc2VudGF0aW9uLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5X2NvbXBsZXh9e19QeV9jX2RpZmZ9e1B5X2NvbXBsZXggbGVmdCwgUHlfY29tcGxleCByaWdodH0KLSAgUmV0dXJuIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGNvbXBsZXggbnVtYmVycywgdXNpbmcgdGhlIEMKLSAgXGN0eXBle1B5X2NvbXBsZXh9IHJlcHJlc2VudGF0aW9uLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5X2NvbXBsZXh9e19QeV9jX25lZ317UHlfY29tcGxleCBjb21wbGV4fQotICBSZXR1cm4gdGhlIG5lZ2F0aW9uIG9mIHRoZSBjb21wbGV4IG51bWJlciBcdmFye2NvbXBsZXh9LCB1c2luZyB0aGUgQwotICBcY3R5cGV7UHlfY29tcGxleH0gcmVwcmVzZW50YXRpb24uCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlfY29tcGxleH17X1B5X2NfcHJvZH17UHlfY29tcGxleCBsZWZ0LCBQeV9jb21wbGV4IHJpZ2h0fQotICBSZXR1cm4gdGhlIHByb2R1Y3Qgb2YgdHdvIGNvbXBsZXggbnVtYmVycywgdXNpbmcgdGhlIEMKLSAgXGN0eXBle1B5X2NvbXBsZXh9IHJlcHJlc2VudGF0aW9uLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5X2NvbXBsZXh9e19QeV9jX3F1b3R9e1B5X2NvbXBsZXggZGl2aWRlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9jb21wbGV4IGRpdmlzb3J9Ci0gIFJldHVybiB0aGUgcXVvdGllbnQgb2YgdHdvIGNvbXBsZXggbnVtYmVycywgdXNpbmcgdGhlIEMKLSAgXGN0eXBle1B5X2NvbXBsZXh9IHJlcHJlc2VudGF0aW9uLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5X2NvbXBsZXh9e19QeV9jX3Bvd317UHlfY29tcGxleCBudW0sIFB5X2NvbXBsZXggZXhwfQotICBSZXR1cm4gdGhlIGV4cG9uZW50aWF0aW9uIG9mIFx2YXJ7bnVtfSBieSBcdmFye2V4cH0sIHVzaW5nIHRoZSBDCi0gIFxjdHlwZXtQeV9jb21wbGV4fSByZXByZXNlbnRhdGlvbi4KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxzdWJzdWJzZWN0aW9ue0NvbXBsZXggTnVtYmVycyBhcyBQeXRob24gT2JqZWN0c30KLQotXGJlZ2lue2N0eXBlZGVzY317UHlDb21wbGV4T2JqZWN0fQotICBUaGlzIHN1YnR5cGUgb2YgXGN0eXBle1B5T2JqZWN0fSByZXByZXNlbnRzIGEgUHl0aG9uIGNvbXBsZXggbnVtYmVyCi0gIG9iamVjdC4KLVxlbmR7Y3R5cGVkZXNjfQotCi1cYmVnaW57Y3ZhcmRlc2N9e1B5VHlwZU9iamVjdH17UHlDb21wbGV4X1R5cGV9Ci0gIFRoaXMgaW5zdGFuY2Ugb2YgXGN0eXBle1B5VHlwZU9iamVjdH0gcmVwcmVzZW50cyB0aGUgUHl0aG9uIGNvbXBsZXgKLSAgbnVtYmVyIHR5cGUuIEl0IGlzIHRoZSBzYW1lIG9iamVjdCBhcyBcY29kZXtjb21wbGV4fSBhbmQKLSAgXGNvZGV7dHlwZXMuQ29tcGxleFR5cGV9LgotXGVuZHtjdmFyZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeUNvbXBsZXhfQ2hlY2t9e1B5T2JqZWN0ICpwfQotICBSZXR1cm4gdHJ1ZSBpZiBpdHMgYXJndW1lbnQgaXMgYSBcY3R5cGV7UHlDb21wbGV4T2JqZWN0fSBvciBhCi0gIHN1YnR5cGUgb2YgXGN0eXBle1B5Q29tcGxleE9iamVjdH0uCi0gIFx2ZXJzaW9uY2hhbmdlZFtBbGxvd2VkIHN1YnR5cGVzIHRvIGJlIGFjY2VwdGVkXXsyLjJ9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeUNvbXBsZXhfQ2hlY2tFeGFjdH17UHlPYmplY3QgKnB9Ci0gIFJldHVybiB0cnVlIGlmIGl0cyBhcmd1bWVudCBpcyBhIFxjdHlwZXtQeUNvbXBsZXhPYmplY3R9LCBidXQgbm90IGEKLSAgc3VidHlwZSBvZiBcY3R5cGV7UHlDb21wbGV4T2JqZWN0fS4KLSAgXHZlcnNpb25hZGRlZHsyLjJ9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeUNvbXBsZXhfRnJvbUNDb21wbGV4fXtQeV9jb21wbGV4IHZ9Ci0gIENyZWF0ZSBhIG5ldyBQeXRob24gY29tcGxleCBudW1iZXIgb2JqZWN0IGZyb20gYSBDCi0gIFxjdHlwZXtQeV9jb21wbGV4fSB2YWx1ZS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5Q29tcGxleF9Gcm9tRG91Ymxlc317ZG91YmxlIHJlYWwsIGRvdWJsZSBpbWFnfQotICBSZXR1cm4gYSBuZXcgXGN0eXBle1B5Q29tcGxleE9iamVjdH0gb2JqZWN0IGZyb20gXHZhcntyZWFsfSBhbmQKLSAgXHZhcntpbWFnfS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtkb3VibGV9e1B5Q29tcGxleF9SZWFsQXNEb3VibGV9e1B5T2JqZWN0ICpvcH0KLSAgUmV0dXJuIHRoZSByZWFsIHBhcnQgb2YgXHZhcntvcH0gYXMgYSBDIFxjdHlwZXtkb3VibGV9LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2RvdWJsZX17UHlDb21wbGV4X0ltYWdBc0RvdWJsZX17UHlPYmplY3QgKm9wfQotICBSZXR1cm4gdGhlIGltYWdpbmFyeSBwYXJ0IG9mIFx2YXJ7b3B9IGFzIGEgQyBcY3R5cGV7ZG91YmxlfS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeV9jb21wbGV4fXtQeUNvbXBsZXhfQXNDQ29tcGxleH17UHlPYmplY3QgKm9wfQotICBSZXR1cm4gdGhlIFxjdHlwZXtQeV9jb21wbGV4fSB2YWx1ZSBvZiB0aGUgY29tcGxleCBudW1iZXIgXHZhcntvcH0uCi0gIFx2ZXJzaW9uY2hhbmdlZFtJZiBcdmFye29wfSBpcyBub3QgYSBQeXRob24gY29tcGxleCBudW1iZXIgb2JqZWN0Ci0gICAgICAgICAgICAgICAgICBidXQgaGFzIGEgXG1ldGhvZHtfX2NvbXBsZXhfX30gbWV0aG9kLCB0aGlzIG1ldGhvZAotCQkgIHdpbGwgZmlyc3QgYmUgY2FsbGVkIHRvIGNvbnZlcnQgXHZhcntvcH0gdG8gYSBQeXRob24KLQkJICBjb21wbGV4IG51bWJlciBvYmplY3RdezIuNn0KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLQotXHNlY3Rpb257U2VxdWVuY2UgT2JqZWN0cyBcbGFiZWx7c2VxdWVuY2VPYmplY3RzfX0KLQotXG9iaW5kZXh7c2VxdWVuY2V9Ci1HZW5lcmljIG9wZXJhdGlvbnMgb24gc2VxdWVuY2Ugb2JqZWN0cyB3ZXJlIGRpc2N1c3NlZCBpbiB0aGUgcHJldmlvdXMKLWNoYXB0ZXI7IHRoaXMgc2VjdGlvbiBkZWFscyB3aXRoIHRoZSBzcGVjaWZpYyBraW5kcyBvZiBzZXF1ZW5jZQotb2JqZWN0cyB0aGF0IGFyZSBpbnRyaW5zaWMgdG8gdGhlIFB5dGhvbiBsYW5ndWFnZS4KLQotCi1cc3Vic2VjdGlvbntTdHJpbmcgT2JqZWN0cyBcbGFiZWx7c3RyaW5nT2JqZWN0c319Ci0KLVRoZXNlIGZ1bmN0aW9ucyByYWlzZSBcZXhjZXB0aW9ue1R5cGVFcnJvcn0gd2hlbiBleHBlY3RpbmcgYSBzdHJpbmcKLXBhcmFtZXRlciBhbmQgYXJlIGNhbGxlZCB3aXRoIGEgbm9uLXN0cmluZyBwYXJhbWV0ZXIuCi0KLVxvYmluZGV4e3N0cmluZ30KLVxiZWdpbntjdHlwZWRlc2N9e1B5U3RyaW5nT2JqZWN0fQotICBUaGlzIHN1YnR5cGUgb2YgXGN0eXBle1B5T2JqZWN0fSByZXByZXNlbnRzIGEgUHl0aG9uIHN0cmluZyBvYmplY3QuCi1cZW5ke2N0eXBlZGVzY30KLQotXGJlZ2lue2N2YXJkZXNjfXtQeVR5cGVPYmplY3R9e1B5U3RyaW5nX1R5cGV9Ci0gIFRoaXMgaW5zdGFuY2Ugb2YgXGN0eXBle1B5VHlwZU9iamVjdH0gcmVwcmVzZW50cyB0aGUgUHl0aG9uIHN0cmluZwotICB0eXBlOyBpdCBpcyB0aGUgc2FtZSBvYmplY3QgYXMgXGNvZGV7c3RyfSBhbmQgXGNvZGV7dHlwZXMuU3RyaW5nVHlwZX0KLSAgaW4gdGhlIFB5dGhvbiBsYXllci4KLSAgXHdpdGhzdWJpdGVteyhpbiBtb2R1bGUgdHlwZXMpfXtcdHRpbmRleHtTdHJpbmdUeXBlfX0uCi1cZW5ke2N2YXJkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5U3RyaW5nX0NoZWNrfXtQeU9iamVjdCAqb30KLSAgUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBcdmFye299IGlzIGEgc3RyaW5nIG9iamVjdCBvciBhbiBpbnN0YW5jZQotICBvZiBhIHN1YnR5cGUgb2YgdGhlIHN0cmluZyB0eXBlLgotICBcdmVyc2lvbmNoYW5nZWRbQWxsb3dlZCBzdWJ0eXBlcyB0byBiZSBhY2NlcHRlZF17Mi4yfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlTdHJpbmdfQ2hlY2tFeGFjdH17UHlPYmplY3QgKm99Ci0gIFJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgXHZhcntvfSBpcyBhIHN0cmluZyBvYmplY3QsIGJ1dCBub3QgYW4KLSAgaW5zdGFuY2Ugb2YgYSBzdWJ0eXBlIG9mIHRoZSBzdHJpbmcgdHlwZS4KLSAgXHZlcnNpb25hZGRlZHsyLjJ9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeVN0cmluZ19Gcm9tU3RyaW5nfXtjb25zdCBjaGFyICp2fQotICBSZXR1cm4gYSBuZXcgc3RyaW5nIG9iamVjdCB3aXRoIGEgY29weSBvZiB0aGUgc3RyaW5nIFx2YXJ7dn0gYXMgdmFsdWUKLSAgb24gc3VjY2VzcywgYW5kIFxOVUxMe30gb24gZmFpbHVyZS4gIFRoZSBwYXJhbWV0ZXIgXHZhcnt2fSBtdXN0IG5vdCBiZQotICBcTlVMTHt9OyBpdCB3aWxsIG5vdCBiZSBjaGVja2VkLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemV9e2NvbnN0IGNoYXIgKnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbn0KLSAgUmV0dXJuIGEgbmV3IHN0cmluZyBvYmplY3Qgd2l0aCBhIGNvcHkgb2YgdGhlIHN0cmluZyBcdmFye3Z9IGFzIHZhbHVlCi0gIGFuZCBsZW5ndGggXHZhcntsZW59IG9uIHN1Y2Nlc3MsIGFuZCBcTlVMTHt9IG9uIGZhaWx1cmUuICBJZiBcdmFye3Z9IGlzCi0gIFxOVUxMe30sIHRoZSBjb250ZW50cyBvZiB0aGUgc3RyaW5nIGFyZSB1bmluaXRpYWxpemVkLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlTdHJpbmdfRnJvbUZvcm1hdH17Y29uc3QgY2hhciAqZm9ybWF0LCAuLi59Ci0gIFRha2UgYSBDIFxjZnVuY3Rpb257cHJpbnRmKCl9LXN0eWxlIFx2YXJ7Zm9ybWF0fSBzdHJpbmcgYW5kIGEKLSAgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cywgY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSByZXN1bHRpbmcKLSAgUHl0aG9uIHN0cmluZyBhbmQgcmV0dXJuIGEgc3RyaW5nIHdpdGggdGhlIHZhbHVlcyBmb3JtYXR0ZWQgaW50bwotICBpdC4gIFRoZSB2YXJpYWJsZSBhcmd1bWVudHMgbXVzdCBiZSBDIHR5cGVzIGFuZCBtdXN0IGNvcnJlc3BvbmQKLSAgZXhhY3RseSB0byB0aGUgZm9ybWF0IGNoYXJhY3RlcnMgaW4gdGhlIFx2YXJ7Zm9ybWF0fSBzdHJpbmcuICBUaGUKLSAgZm9sbG93aW5nIGZvcm1hdCBjaGFyYWN0ZXJzIGFyZSBhbGxvd2VkOgotCi0gICUgVGhpcyBzaG91bGQgYmUgZXhhY3RseSB0aGUgc2FtZSBhcyB0aGUgdGFibGUgaW4gUHlFcnJfRm9ybWF0LgotICAlIE9uZSBzaG91bGQganVzdCByZWZlciB0byB0aGUgb3RoZXIuCi0KLSAgJSBUaGUgZGVzY3JpcHRpb25zIGZvciAlemQgYW5kICV6dSBhcmUgd3JvbmcsIGJ1dCB0aGUgdHJ1dGggaXMgY29tcGxpY2F0ZWQKLSAgJSBiZWNhdXNlIG5vdCBhbGwgY29tcGlsZXJzIHN1cHBvcnQgdGhlICV6IHdpZHRoIG1vZGlmaWVyIC0tIHdlIGZha2UgaXQKLSAgJSB3aGVuIG5lY2Vzc2FyeSB2aWEgaW50ZXJwb2xhdGluZyBQWV9GT1JNQVRfU0laRV9ULgotCi0gICUgJXUsICVsdSwgJXp1IHNob3VsZCBoYXZlICJuZXcgaW4gUHl0aG9uIDIuNSIgYmx1cmJzLgotCi0gIFxiZWdpbnt0YWJsZWlpaX17bHxsfGx9e21lbWJlcn17Rm9ybWF0IENoYXJhY3RlcnN9e1R5cGV9e0NvbW1lbnR9Ci0gICAgXGxpbmVpaWl7XCVcJX17XGVtcGh7bi9hfX17VGhlIGxpdGVyYWwgXCUgY2hhcmFjdGVyLn0KLSAgICBcbGluZWlpaXtcJWN9e2ludH17QSBzaW5nbGUgY2hhcmFjdGVyLCByZXByZXNlbnRlZCBhcyBhbiBDIGludC59Ci0gICAgXGxpbmVpaWl7XCVkfXtpbnR9e0V4YWN0bHkgZXF1aXZhbGVudCB0byBcY29kZXtwcmludGYoIlwlZCIpfS59Ci0gICAgXGxpbmVpaWl7XCV1fXt1bnNpZ25lZCBpbnR9e0V4YWN0bHkgZXF1aXZhbGVudCB0byBcY29kZXtwcmludGYoIlwldSIpfS59Ci0gICAgXGxpbmVpaWl7XCVsZH17bG9uZ317RXhhY3RseSBlcXVpdmFsZW50IHRvIFxjb2Rle3ByaW50ZigiXCVsZCIpfS59Ci0gICAgXGxpbmVpaWl7XCVsdX17dW5zaWduZWQgbG9uZ317RXhhY3RseSBlcXVpdmFsZW50IHRvIFxjb2Rle3ByaW50ZigiXCVsdSIpfS59Ci0gICAgXGxpbmVpaWl7XCV6ZH17UHlfc3NpemVfdH17RXhhY3RseSBlcXVpdmFsZW50IHRvIFxjb2Rle3ByaW50ZigiXCV6ZCIpfS59Ci0gICAgXGxpbmVpaWl7XCV6dX17c2l6ZV90fXtFeGFjdGx5IGVxdWl2YWxlbnQgdG8gXGNvZGV7cHJpbnRmKCJcJXp1Iil9Ln0KLSAgICBcbGluZWlpaXtcJWl9e2ludH17RXhhY3RseSBlcXVpdmFsZW50IHRvIFxjb2Rle3ByaW50ZigiXCVpIil9Ln0KLSAgICBcbGluZWlpaXtcJXh9e2ludH17RXhhY3RseSBlcXVpdmFsZW50IHRvIFxjb2Rle3ByaW50ZigiXCV4Iil9Ln0KLSAgICBcbGluZWlpaXtcJXN9e2NoYXIqfXtBIG51bGwtdGVybWluYXRlZCBDIGNoYXJhY3RlciBhcnJheS59Ci0gICAgXGxpbmVpaWl7XCVwfXt2b2lkKn17VGhlIGhleCByZXByZXNlbnRhdGlvbiBvZiBhIEMgcG9pbnRlci4KLQlNb3N0bHkgZXF1aXZhbGVudCB0byBcY29kZXtwcmludGYoIlwlcCIpfSBleGNlcHQgdGhhdCBpdCBpcwotCWd1YXJhbnRlZWQgdG8gc3RhcnQgd2l0aCB0aGUgbGl0ZXJhbCBcY29kZXsweH0gcmVnYXJkbGVzcyBvZgotCXdoYXQgdGhlIHBsYXRmb3JtJ3MgXGNvZGV7cHJpbnRmfSB5aWVsZHMufQotICBcZW5ke3RhYmxlaWlpfQotCi0gIEFuIHVucmVjb2duaXplZCBmb3JtYXQgY2hhcmFjdGVyIGNhdXNlcyBhbGwgdGhlIHJlc3Qgb2YgdGhlIGZvcm1hdAotICBzdHJpbmcgdG8gYmUgY29waWVkIGFzLWlzIHRvIHRoZSByZXN1bHQgc3RyaW5nLCBhbmQgYW55IGV4dHJhCi0gIGFyZ3VtZW50cyBkaXNjYXJkZWQuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeVN0cmluZ19Gcm9tRm9ybWF0Vn17Y29uc3QgY2hhciAqZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCB2YXJnc30KLSAgSWRlbnRpY2FsIHRvIFxmdW5jdGlvbntQeVN0cmluZ19Gcm9tRm9ybWF0KCl9IGV4Y2VwdCB0aGF0IGl0IHRha2VzCi0gIGV4YWN0bHkgdHdvIGFyZ3VtZW50cy4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeV9zc2l6ZV90fXtQeVN0cmluZ19TaXplfXtQeU9iamVjdCAqc3RyaW5nfQotICBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGluIHN0cmluZyBvYmplY3QgXHZhcntzdHJpbmd9LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5X3NzaXplX3R9e1B5U3RyaW5nX0dFVF9TSVpFfXtQeU9iamVjdCAqc3RyaW5nfQotICBNYWNybyBmb3JtIG9mIFxjZnVuY3Rpb257UHlTdHJpbmdfU2l6ZSgpfSBidXQgd2l0aG91dCBlcnJvcgotICBjaGVja2luZy4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtjaGFyKn17UHlTdHJpbmdfQXNTdHJpbmd9e1B5T2JqZWN0ICpzdHJpbmd9Ci0gIFJldHVybiBhIE5VTC10ZXJtaW5hdGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb250ZW50cyBvZgotICBcdmFye3N0cmluZ30uICBUaGUgcG9pbnRlciByZWZlcnMgdG8gdGhlIGludGVybmFsIGJ1ZmZlciBvZgotICBcdmFye3N0cmluZ30sIG5vdCBhIGNvcHkuICBUaGUgZGF0YSBtdXN0IG5vdCBiZSBtb2RpZmllZCBpbiBhbnkgd2F5LAotICB1bmxlc3MgdGhlIHN0cmluZyB3YXMganVzdCBjcmVhdGVkIHVzaW5nCi0gIFxjb2Rle1B5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIFx2YXJ7c2l6ZX0pfS4KLSAgSXQgbXVzdCBub3QgYmUgZGVhbGxvY2F0ZWQuICBJZiBcdmFye3N0cmluZ30gaXMgYSBVbmljb2RlIG9iamVjdCwKLSAgdGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgZGVmYXVsdCBlbmNvZGluZyBvZiBcdmFye3N0cmluZ30gYW5kCi0gIG9wZXJhdGVzIG9uIHRoYXQuICBJZiBcdmFye3N0cmluZ30gaXMgbm90IGEgc3RyaW5nIG9iamVjdCBhdCBhbGwsCi0gIFxjZnVuY3Rpb257UHlTdHJpbmdfQXNTdHJpbmcoKX0gcmV0dXJucyBcTlVMTHt9IGFuZCByYWlzZXMKLSAgXGV4Y2VwdGlvbntUeXBlRXJyb3J9LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2NoYXIqfXtQeVN0cmluZ19BU19TVFJJTkd9e1B5T2JqZWN0ICpzdHJpbmd9Ci0gIE1hY3JvIGZvcm0gb2YgXGNmdW5jdGlvbntQeVN0cmluZ19Bc1N0cmluZygpfSBidXQgd2l0aG91dCBlcnJvcgotICBjaGVja2luZy4gIE9ubHkgc3RyaW5nIG9iamVjdHMgYXJlIHN1cHBvcnRlZDsgbm8gVW5pY29kZSBvYmplY3RzCi0gIHNob3VsZCBiZSBwYXNzZWQuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemV9e1B5T2JqZWN0ICpvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90ICpsZW5ndGh9Ci0gIFJldHVybiBhIE5VTC10ZXJtaW5hdGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb250ZW50cyBvZiB0aGUKLSAgb2JqZWN0IFx2YXJ7b2JqfSB0aHJvdWdoIHRoZSBvdXRwdXQgdmFyaWFibGVzIFx2YXJ7YnVmZmVyfSBhbmQKLSAgXHZhcntsZW5ndGh9LgotCi0gIFRoZSBmdW5jdGlvbiBhY2NlcHRzIGJvdGggc3RyaW5nIGFuZCBVbmljb2RlIG9iamVjdHMgYXMgaW5wdXQuIEZvcgotICBVbmljb2RlIG9iamVjdHMgaXQgcmV0dXJucyB0aGUgZGVmYXVsdCBlbmNvZGVkIHZlcnNpb24gb2YgdGhlCi0gIG9iamVjdC4gIElmIFx2YXJ7bGVuZ3RofSBpcyBcTlVMTHt9LCB0aGUgcmVzdWx0aW5nIGJ1ZmZlciBtYXkgbm90Ci0gIGNvbnRhaW4gTlVMIGNoYXJhY3RlcnM7IGlmIGl0IGRvZXMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIFxjb2Rley0xfQotICBhbmQgYSBcZXhjZXB0aW9ue1R5cGVFcnJvcn0gaXMgcmFpc2VkLgotCi0gIFRoZSBidWZmZXIgcmVmZXJzIHRvIGFuIGludGVybmFsIHN0cmluZyBidWZmZXIgb2YgXHZhcntvYmp9LCBub3QgYQotICBjb3B5LiBUaGUgZGF0YSBtdXN0IG5vdCBiZSBtb2RpZmllZCBpbiBhbnkgd2F5LCB1bmxlc3MgdGhlIHN0cmluZwotICB3YXMganVzdCBjcmVhdGVkIHVzaW5nIFxjb2Rle1B5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsCi0gIFx2YXJ7c2l6ZX0pfS4gIEl0IG11c3Qgbm90IGJlIGRlYWxsb2NhdGVkLiAgSWYgXHZhcntzdHJpbmd9IGlzIGEKLSAgVW5pY29kZSBvYmplY3QsIHRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIGRlZmF1bHQgZW5jb2Rpbmcgb2YKLSAgXHZhcntzdHJpbmd9IGFuZCBvcGVyYXRlcyBvbiB0aGF0LiAgSWYgXHZhcntzdHJpbmd9IGlzIG5vdCBhIHN0cmluZwotICBvYmplY3QgYXQgYWxsLCBcY2Z1bmN0aW9ue1B5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZSgpfSByZXR1cm5zCi0gIFxjb2Rley0xfSBhbmQgcmFpc2VzIFxleGNlcHRpb257VHlwZUVycm9yfS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXt2b2lkfXtQeVN0cmluZ19Db25jYXR9e1B5T2JqZWN0ICoqc3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbmV3cGFydH0KLSAgQ3JlYXRlIGEgbmV3IHN0cmluZyBvYmplY3QgaW4gXHZhcnsqc3RyaW5nfSBjb250YWluaW5nIHRoZSBjb250ZW50cwotICBvZiBcdmFye25ld3BhcnR9IGFwcGVuZGVkIHRvIFx2YXJ7c3RyaW5nfTsgdGhlIGNhbGxlciB3aWxsIG93biB0aGUKLSAgbmV3IHJlZmVyZW5jZS4gIFRoZSByZWZlcmVuY2UgdG8gdGhlIG9sZCB2YWx1ZSBvZiBcdmFye3N0cmluZ30gd2lsbAotICBiZSBzdG9sZW4uICBJZiB0aGUgbmV3IHN0cmluZyBjYW5ub3QgYmUgY3JlYXRlZCwgdGhlIG9sZCByZWZlcmVuY2UKLSAgdG8gXHZhcntzdHJpbmd9IHdpbGwgc3RpbGwgYmUgZGlzY2FyZGVkIGFuZCB0aGUgdmFsdWUgb2YKLSAgXHZhcnsqc3RyaW5nfSB3aWxsIGJlIHNldCB0byBcTlVMTHt9OyB0aGUgYXBwcm9wcmlhdGUgZXhjZXB0aW9uIHdpbGwKLSAgYmUgc2V0LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e3ZvaWR9e1B5U3RyaW5nX0NvbmNhdEFuZERlbH17UHlPYmplY3QgKipzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpuZXdwYXJ0fQotICBDcmVhdGUgYSBuZXcgc3RyaW5nIG9iamVjdCBpbiBcdmFyeypzdHJpbmd9IGNvbnRhaW5pbmcgdGhlIGNvbnRlbnRzCi0gIG9mIFx2YXJ7bmV3cGFydH0gYXBwZW5kZWQgdG8gXHZhcntzdHJpbmd9LiAgVGhpcyB2ZXJzaW9uIGRlY3JlbWVudHMKLSAgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBcdmFye25ld3BhcnR9LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17X1B5U3RyaW5nX1Jlc2l6ZX17UHlPYmplY3QgKipzdHJpbmcsIFB5X3NzaXplX3QgbmV3c2l6ZX0KLSAgQSB3YXkgdG8gcmVzaXplIGEgc3RyaW5nIG9iamVjdCBldmVuIHRob3VnaCBpdCBpcyBgYGltbXV0YWJsZScnLgotICBPbmx5IHVzZSB0aGlzIHRvIGJ1aWxkIHVwIGEgYnJhbmQgbmV3IHN0cmluZyBvYmplY3Q7IGRvbid0IHVzZSB0aGlzCi0gIGlmIHRoZSBzdHJpbmcgbWF5IGFscmVhZHkgYmUga25vd24gaW4gb3RoZXIgcGFydHMgb2YgdGhlIGNvZGUuICBJdAotICBpcyBhbiBlcnJvciB0byBjYWxsIHRoaXMgZnVuY3Rpb24gaWYgdGhlIHJlZmNvdW50IG9uIHRoZSBpbnB1dCBzdHJpbmcKLSAgb2JqZWN0IGlzIG5vdCBvbmUuCi0gIFBhc3MgdGhlIGFkZHJlc3Mgb2YgYW4gZXhpc3Rpbmcgc3RyaW5nIG9iamVjdCBhcyBhbiBsdmFsdWUgKGl0IG1heQotICBiZSB3cml0dGVuIGludG8pLCBhbmQgdGhlIG5ldyBzaXplIGRlc2lyZWQuICBPbiBzdWNjZXNzLCBcdmFyeypzdHJpbmd9Ci0gIGhvbGRzIHRoZSByZXNpemVkIHN0cmluZyBvYmplY3QgYW5kIFxjb2RlezB9IGlzIHJldHVybmVkOyB0aGUgYWRkcmVzcyBpbgotICBcdmFyeypzdHJpbmd9IG1heSBkaWZmZXIgZnJvbSBpdHMgaW5wdXQgdmFsdWUuICBJZiB0aGUKLSAgcmVhbGxvY2F0aW9uIGZhaWxzLCB0aGUgb3JpZ2luYWwgc3RyaW5nIG9iamVjdCBhdCBcdmFyeypzdHJpbmd9IGlzCi0gIGRlYWxsb2NhdGVkLCBcdmFyeypzdHJpbmd9IGlzIHNldCB0byBcTlVMTHt9LCBhIG1lbW9yeSBleGNlcHRpb24gaXMgc2V0LAotICBhbmQgXGNvZGV7LTF9IGlzIHJldHVybmVkLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlTdHJpbmdfRm9ybWF0fXtQeU9iamVjdCAqZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzfQotICBSZXR1cm4gYSBuZXcgc3RyaW5nIG9iamVjdCBmcm9tIFx2YXJ7Zm9ybWF0fSBhbmQgXHZhcnthcmdzfS4KLSAgQW5hbG9nb3VzIHRvIFxjb2Rle1x2YXJ7Zm9ybWF0fSBcJVwgXHZhcnthcmdzfX0uICBUaGUgXHZhcnthcmdzfQotICBhcmd1bWVudCBtdXN0IGJlIGEgdHVwbGUuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317dm9pZH17UHlTdHJpbmdfSW50ZXJuSW5QbGFjZX17UHlPYmplY3QgKipzdHJpbmd9Ci0gIEludGVybiB0aGUgYXJndW1lbnQgXHZhcnsqc3RyaW5nfSBpbiBwbGFjZS4gIFRoZSBhcmd1bWVudCBtdXN0IGJlCi0gIHRoZSBhZGRyZXNzIG9mIGEgcG9pbnRlciB2YXJpYWJsZSBwb2ludGluZyB0byBhIFB5dGhvbiBzdHJpbmcKLSAgb2JqZWN0LiAgSWYgdGhlcmUgaXMgYW4gZXhpc3RpbmcgaW50ZXJuZWQgc3RyaW5nIHRoYXQgaXMgdGhlIHNhbWUgYXMKLSAgXHZhcnsqc3RyaW5nfSwgaXQgc2V0cyBcdmFyeypzdHJpbmd9IHRvIGl0IChkZWNyZW1lbnRpbmcgdGhlCi0gIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgb2xkIHN0cmluZyBvYmplY3QgYW5kIGluY3JlbWVudGluZyB0aGUKLSAgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBpbnRlcm5lZCBzdHJpbmcgb2JqZWN0KSwgb3RoZXJ3aXNlIGl0IGxlYXZlcwotICBcdmFyeypzdHJpbmd9IGFsb25lIGFuZCBpbnRlcm5zIGl0IChpbmNyZW1lbnRpbmcgaXRzIHJlZmVyZW5jZQotICBjb3VudCkuICAoQ2xhcmlmaWNhdGlvbjogZXZlbiB0aG91Z2ggdGhlcmUgaXMgYSBsb3Qgb2YgdGFsayBhYm91dAotICByZWZlcmVuY2UgY291bnRzLCB0aGluayBvZiB0aGlzIGZ1bmN0aW9uIGFzIHJlZmVyZW5jZS1jb3VudC1uZXV0cmFsOwotICB5b3Ugb3duIHRoZSBvYmplY3QgYWZ0ZXIgdGhlIGNhbGwgaWYgYW5kIG9ubHkgaWYgeW91IG93bmVkIGl0IGJlZm9yZQotICB0aGUgY2FsbC4pCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nfXtjb25zdCBjaGFyICp2fQotICBBIGNvbWJpbmF0aW9uIG9mIFxjZnVuY3Rpb257UHlTdHJpbmdfRnJvbVN0cmluZygpfSBhbmQKLSAgXGNmdW5jdGlvbntQeVN0cmluZ19JbnRlcm5JblBsYWNlKCl9LCByZXR1cm5pbmcgZWl0aGVyIGEgbmV3IHN0cmluZwotICBvYmplY3QgdGhhdCBoYXMgYmVlbiBpbnRlcm5lZCwgb3IgYSBuZXcgKGBgb3duZWQnJykgcmVmZXJlbmNlIHRvIGFuCi0gIGVhcmxpZXIgaW50ZXJuZWQgc3RyaW5nIG9iamVjdCB3aXRoIHRoZSBzYW1lIHZhbHVlLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlTdHJpbmdfRGVjb2RlfXtjb25zdCBjaGFyICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnN9Ci0gIENyZWF0ZSBhbiBvYmplY3QgYnkgZGVjb2RpbmcgXHZhcntzaXplfSBieXRlcyBvZiB0aGUgZW5jb2RlZAotICBidWZmZXIgXHZhcntzfSB1c2luZyB0aGUgY29kZWMgcmVnaXN0ZXJlZCBmb3IKLSAgXHZhcntlbmNvZGluZ30uICBcdmFye2VuY29kaW5nfSBhbmQgXHZhcntlcnJvcnN9IGhhdmUgdGhlIHNhbWUKLSAgbWVhbmluZyBhcyB0aGUgcGFyYW1ldGVycyBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZQotICBcZnVuY3Rpb257dW5pY29kZSgpfSBidWlsdC1pbiBmdW5jdGlvbi4gIFRoZSBjb2RlYyB0byBiZSB1c2VkIGlzCi0gIGxvb2tlZCB1cCB1c2luZyB0aGUgUHl0aG9uIGNvZGVjIHJlZ2lzdHJ5LiAgUmV0dXJuIFxOVUxMe30gaWYKLSAgYW4gZXhjZXB0aW9uIHdhcyByYWlzZWQgYnkgdGhlIGNvZGVjLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlTdHJpbmdfQXNEZWNvZGVkT2JqZWN0fXtQeU9iamVjdCAqc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzfQotICBEZWNvZGUgYSBzdHJpbmcgb2JqZWN0IGJ5IHBhc3NpbmcgaXQgdG8gdGhlIGNvZGVjIHJlZ2lzdGVyZWQgZm9yCi0gIFx2YXJ7ZW5jb2Rpbmd9IGFuZCByZXR1cm4gdGhlIHJlc3VsdCBhcyBQeXRob24KLSAgb2JqZWN0LiBcdmFye2VuY29kaW5nfSBhbmQgXHZhcntlcnJvcnN9IGhhdmUgdGhlIHNhbWUgbWVhbmluZyBhcyB0aGUKLSAgcGFyYW1ldGVycyBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzdHJpbmcgXG1ldGhvZHtlbmNvZGUoKX0gbWV0aG9kLgotICBUaGUgY29kZWMgdG8gYmUgdXNlZCBpcyBsb29rZWQgdXAgdXNpbmcgdGhlIFB5dGhvbiBjb2RlYyByZWdpc3RyeS4KLSAgUmV0dXJuIFxOVUxMe30gaWYgYW4gZXhjZXB0aW9uIHdhcyByYWlzZWQgYnkgdGhlIGNvZGVjLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlTdHJpbmdfRW5jb2RlfXtjb25zdCBjaGFyICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnN9Ci0gIEVuY29kZSB0aGUgXGN0eXBle2NoYXJ9IGJ1ZmZlciBvZiB0aGUgZ2l2ZW4gc2l6ZSBieSBwYXNzaW5nIGl0IHRvCi0gIHRoZSBjb2RlYyByZWdpc3RlcmVkIGZvciBcdmFye2VuY29kaW5nfSBhbmQgcmV0dXJuIGEgUHl0aG9uIG9iamVjdC4KLSAgXHZhcntlbmNvZGluZ30gYW5kIFx2YXJ7ZXJyb3JzfSBoYXZlIHRoZSBzYW1lIG1lYW5pbmcgYXMgdGhlCi0gIHBhcmFtZXRlcnMgb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgc3RyaW5nIFxtZXRob2R7ZW5jb2RlKCl9IG1ldGhvZC4KLSAgVGhlIGNvZGVjIHRvIGJlIHVzZWQgaXMgbG9va2VkIHVwIHVzaW5nIHRoZSBQeXRob24gY29kZWMKLSAgcmVnaXN0cnkuICBSZXR1cm4gXE5VTEx7fSBpZiBhbiBleGNlcHRpb24gd2FzIHJhaXNlZCBieSB0aGUKLSAgY29kZWMuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeVN0cmluZ19Bc0VuY29kZWRPYmplY3R9e1B5T2JqZWN0ICpzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnN9Ci0gIEVuY29kZSBhIHN0cmluZyBvYmplY3QgdXNpbmcgdGhlIGNvZGVjIHJlZ2lzdGVyZWQgZm9yCi0gIFx2YXJ7ZW5jb2Rpbmd9IGFuZCByZXR1cm4gdGhlIHJlc3VsdCBhcyBQeXRob24gb2JqZWN0LgotICBcdmFye2VuY29kaW5nfSBhbmQgXHZhcntlcnJvcnN9IGhhdmUgdGhlIHNhbWUgbWVhbmluZyBhcyB0aGUKLSAgcGFyYW1ldGVycyBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzdHJpbmcgXG1ldGhvZHtlbmNvZGUoKX0gbWV0aG9kLgotICBUaGUgY29kZWMgdG8gYmUgdXNlZCBpcyBsb29rZWQgdXAgdXNpbmcgdGhlIFB5dGhvbiBjb2RlYyByZWdpc3RyeS4KLSAgUmV0dXJuIFxOVUxMe30gaWYgYW4gZXhjZXB0aW9uIHdhcyByYWlzZWQgYnkgdGhlIGNvZGVjLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLQotXHN1YnNlY3Rpb257VW5pY29kZSBPYmplY3RzIFxsYWJlbHt1bmljb2RlT2JqZWN0c319Ci1cc2VjdGlvbmF1dGhvcntNYXJjLUFuZHJlIExlbWJ1cmd9e21hbEBsZW1idXJnLmNvbX0KLQotJS0tLSBVbmljb2RlIFR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGVzZSBhcmUgdGhlIGJhc2ljIFVuaWNvZGUgb2JqZWN0IHR5cGVzIHVzZWQgZm9yIHRoZSBVbmljb2RlCi1pbXBsZW1lbnRhdGlvbiBpbiBQeXRob246Ci0KLVxiZWdpbntjdHlwZWRlc2N9e1B5X1VOSUNPREV9Ci0gIFRoaXMgdHlwZSByZXByZXNlbnRzIHRoZSBzdG9yYWdlIHR5cGUgd2hpY2ggaXMgdXNlZCBieSBQeXRob24KLSAgaW50ZXJuYWxseSBhcyBiYXNpcyBmb3IgaG9sZGluZyBVbmljb2RlIG9yZGluYWxzLiAgUHl0aG9uJ3MgZGVmYXVsdAotICBidWlsZHMgdXNlIGEgMTYtYml0IHR5cGUgZm9yIFxjdHlwZXtQeV9VTklDT0RFfSBhbmQgc3RvcmUgVW5pY29kZQotICB2YWx1ZXMgaW50ZXJuYWxseSBhcyBVQ1MyLiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGJ1aWxkIGEgVUNTNAotICB2ZXJzaW9uIG9mIFB5dGhvbiAobW9zdCByZWNlbnQgTGludXggZGlzdHJpYnV0aW9ucyBjb21lIHdpdGggVUNTNAotICBidWlsZHMgb2YgUHl0aG9uKS4gVGhlc2UgYnVpbGRzIHRoZW4gdXNlIGEgMzItYml0IHR5cGUgZm9yCi0gIFxjdHlwZXtQeV9VTklDT0RFfSBhbmQgc3RvcmUgVW5pY29kZSBkYXRhIGludGVybmFsbHkgYXMgVUNTNC4gT24KLSAgcGxhdGZvcm1zIHdoZXJlIFxjdHlwZXt3Y2hhcl90fSBpcyBhdmFpbGFibGUgYW5kIGNvbXBhdGlibGUgd2l0aCB0aGUKLSAgY2hvc2VuIFB5dGhvbiBVbmljb2RlIGJ1aWxkIHZhcmlhbnQsIFxjdHlwZXtQeV9VTklDT0RFfSBpcyBhIHR5cGVkZWYKLSAgYWxpYXMgZm9yIFxjdHlwZXt3Y2hhcl90fSB0byBlbmhhbmNlIG5hdGl2ZSBwbGF0Zm9ybSBjb21wYXRpYmlsaXR5LgotICBPbiBhbGwgb3RoZXIgcGxhdGZvcm1zLCBcY3R5cGV7UHlfVU5JQ09ERX0gaXMgYSB0eXBlZGVmIGFsaWFzIGZvcgotICBlaXRoZXIgXGN0eXBle3Vuc2lnbmVkIHNob3J0fSAoVUNTMikgb3IgXGN0eXBle3Vuc2lnbmVkIGxvbmd9Ci0gIChVQ1M0KS4KLVxlbmR7Y3R5cGVkZXNjfQotCi1Ob3RlIHRoYXQgVUNTMiBhbmQgVUNTNCBQeXRob24gYnVpbGRzIGFyZSBub3QgYmluYXJ5IGNvbXBhdGlibGUuCi1QbGVhc2Uga2VlcCB0aGlzIGluIG1pbmQgd2hlbiB3cml0aW5nIGV4dGVuc2lvbnMgb3IgaW50ZXJmYWNlcy4KLQotXGJlZ2lue2N0eXBlZGVzY317UHlVbmljb2RlT2JqZWN0fQotICBUaGlzIHN1YnR5cGUgb2YgXGN0eXBle1B5T2JqZWN0fSByZXByZXNlbnRzIGEgUHl0aG9uIFVuaWNvZGUgb2JqZWN0LgotXGVuZHtjdHlwZWRlc2N9Ci0KLVxiZWdpbntjdmFyZGVzY317UHlUeXBlT2JqZWN0fXtQeVVuaWNvZGVfVHlwZX0KLSAgVGhpcyBpbnN0YW5jZSBvZiBcY3R5cGV7UHlUeXBlT2JqZWN0fSByZXByZXNlbnRzIHRoZSBQeXRob24gVW5pY29kZQotICB0eXBlLiAgSXQgaXMgZXhwb3NlZCB0byBQeXRob24gY29kZSBhcyBcY29kZXt1bmljb2RlfSBhbmQKLSAgXGNvZGV7dHlwZXMuVW5pY29kZVR5cGV9LgotXGVuZHtjdmFyZGVzY30KLQotVGhlIGZvbGxvd2luZyBBUElzIGFyZSByZWFsbHkgQyBtYWNyb3MgYW5kIGNhbiBiZSB1c2VkIHRvIGRvIGZhc3QKLWNoZWNrcyBhbmQgdG8gYWNjZXNzIGludGVybmFsIHJlYWQtb25seSBkYXRhIG9mIFVuaWNvZGUgb2JqZWN0czoKLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeVVuaWNvZGVfQ2hlY2t9e1B5T2JqZWN0ICpvfQotICBSZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IFx2YXJ7b30gaXMgYSBVbmljb2RlIG9iamVjdCBvciBhbgotICBpbnN0YW5jZSBvZiBhIFVuaWNvZGUgc3VidHlwZS4KLSAgXHZlcnNpb25jaGFuZ2VkW0FsbG93ZWQgc3VidHlwZXMgdG8gYmUgYWNjZXB0ZWRdezIuMn0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5VW5pY29kZV9DaGVja0V4YWN0fXtQeU9iamVjdCAqb30KLSAgUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBcdmFye299IGlzIGEgVW5pY29kZSBvYmplY3QsIGJ1dCBub3QgYW4KLSAgaW5zdGFuY2Ugb2YgYSBzdWJ0eXBlLgotICBcdmVyc2lvbmFkZGVkezIuMn0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeV9zc2l6ZV90fXtQeVVuaWNvZGVfR0VUX1NJWkV9e1B5T2JqZWN0ICpvfQotICBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIG9iamVjdC4gIFx2YXJ7b30gaGFzIHRvIGJlIGEKLSAgXGN0eXBle1B5VW5pY29kZU9iamVjdH0gKG5vdCBjaGVja2VkKS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeV9zc2l6ZV90fXtQeVVuaWNvZGVfR0VUX0RBVEFfU0laRX17UHlPYmplY3QgKm99Ci0gIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgb2JqZWN0J3MgaW50ZXJuYWwgYnVmZmVyIGluIGJ5dGVzLiAgXHZhcntvfQotICBoYXMgdG8gYmUgYSBcY3R5cGV7UHlVbmljb2RlT2JqZWN0fSAobm90IGNoZWNrZWQpLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5X1VOSUNPREUqfXtQeVVuaWNvZGVfQVNfVU5JQ09ERX17UHlPYmplY3QgKm99Ci0gIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGludGVybmFsIFxjdHlwZXtQeV9VTklDT0RFfSBidWZmZXIgb2YgdGhlCi0gIG9iamVjdC4gIFx2YXJ7b30gaGFzIHRvIGJlIGEgXGN0eXBle1B5VW5pY29kZU9iamVjdH0gKG5vdCBjaGVja2VkKS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtjb25zdCBjaGFyKn17UHlVbmljb2RlX0FTX0RBVEF9e1B5T2JqZWN0ICpvfQotICBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBpbnRlcm5hbCBidWZmZXIgb2YgdGhlIG9iamVjdC4KLSAgXHZhcntvfSBoYXMgdG8gYmUgYSBcY3R5cGV7UHlVbmljb2RlT2JqZWN0fSAobm90IGNoZWNrZWQpLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLSUgLS0tIFVuaWNvZGUgY2hhcmFjdGVyIHByb3BlcnRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVVuaWNvZGUgcHJvdmlkZXMgbWFueSBkaWZmZXJlbnQgY2hhcmFjdGVyIHByb3BlcnRpZXMuIFRoZSBtb3N0IG9mdGVuCi1uZWVkZWQgb25lcyBhcmUgYXZhaWxhYmxlIHRocm91Z2ggdGhlc2UgbWFjcm9zIHdoaWNoIGFyZSBtYXBwZWQgdG8gQwotZnVuY3Rpb25zIGRlcGVuZGluZyBvbiB0aGUgUHl0aG9uIGNvbmZpZ3VyYXRpb24uCi0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlfVU5JQ09ERV9JU1NQQUNFfXtQeV9VTklDT0RFIGNofQotICBSZXR1cm4gMSBvciAwIGRlcGVuZGluZyBvbiB3aGV0aGVyIFx2YXJ7Y2h9IGlzIGEgd2hpdGVzcGFjZQotICBjaGFyYWN0ZXIuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeV9VTklDT0RFX0lTTE9XRVJ9e1B5X1VOSUNPREUgY2h9Ci0gIFJldHVybiAxIG9yIDAgZGVwZW5kaW5nIG9uIHdoZXRoZXIgXHZhcntjaH0gaXMgYSBsb3dlcmNhc2UgY2hhcmFjdGVyLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlfVU5JQ09ERV9JU1VQUEVSfXtQeV9VTklDT0RFIGNofQotICBSZXR1cm4gMSBvciAwIGRlcGVuZGluZyBvbiB3aGV0aGVyIFx2YXJ7Y2h9IGlzIGFuIHVwcGVyY2FzZQotICBjaGFyYWN0ZXIuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeV9VTklDT0RFX0lTVElUTEV9e1B5X1VOSUNPREUgY2h9Ci0gIFJldHVybiAxIG9yIDAgZGVwZW5kaW5nIG9uIHdoZXRoZXIgXHZhcntjaH0gaXMgYSB0aXRsZWNhc2UgY2hhcmFjdGVyLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlfVU5JQ09ERV9JU0xJTkVCUkVBS317UHlfVU5JQ09ERSBjaH0KLSAgUmV0dXJuIDEgb3IgMCBkZXBlbmRpbmcgb24gd2hldGhlciBcdmFye2NofSBpcyBhIGxpbmVicmVhayBjaGFyYWN0ZXIuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeV9VTklDT0RFX0lTREVDSU1BTH17UHlfVU5JQ09ERSBjaH0KLSAgUmV0dXJuIDEgb3IgMCBkZXBlbmRpbmcgb24gd2hldGhlciBcdmFye2NofSBpcyBhIGRlY2ltYWwgY2hhcmFjdGVyLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlfVU5JQ09ERV9JU0RJR0lUfXtQeV9VTklDT0RFIGNofQotICBSZXR1cm4gMSBvciAwIGRlcGVuZGluZyBvbiB3aGV0aGVyIFx2YXJ7Y2h9IGlzIGEgZGlnaXQgY2hhcmFjdGVyLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlfVU5JQ09ERV9JU05VTUVSSUN9e1B5X1VOSUNPREUgY2h9Ci0gIFJldHVybiAxIG9yIDAgZGVwZW5kaW5nIG9uIHdoZXRoZXIgXHZhcntjaH0gaXMgYSBudW1lcmljIGNoYXJhY3Rlci4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5X1VOSUNPREVfSVNBTFBIQX17UHlfVU5JQ09ERSBjaH0KLSAgUmV0dXJuIDEgb3IgMCBkZXBlbmRpbmcgb24gd2hldGhlciBcdmFye2NofSBpcyBhbiBhbHBoYWJldGljCi0gIGNoYXJhY3Rlci4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5X1VOSUNPREVfSVNBTE5VTX17UHlfVU5JQ09ERSBjaH0KLSAgUmV0dXJuIDEgb3IgMCBkZXBlbmRpbmcgb24gd2hldGhlciBcdmFye2NofSBpcyBhbiBhbHBoYW51bWVyaWMKLSAgY2hhcmFjdGVyLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVRoZXNlIEFQSXMgY2FuIGJlIHVzZWQgZm9yIGZhc3QgZGlyZWN0IGNoYXJhY3RlciBjb252ZXJzaW9uczoKLQotXGJlZ2lue2NmdW5jZGVzY317UHlfVU5JQ09ERX17UHlfVU5JQ09ERV9UT0xPV0VSfXtQeV9VTklDT0RFIGNofQotICBSZXR1cm4gdGhlIGNoYXJhY3RlciBcdmFye2NofSBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeV9VTklDT0RFfXtQeV9VTklDT0RFX1RPVVBQRVJ9e1B5X1VOSUNPREUgY2h9Ci0gIFJldHVybiB0aGUgY2hhcmFjdGVyIFx2YXJ7Y2h9IGNvbnZlcnRlZCB0byB1cHBlciBjYXNlLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5X1VOSUNPREV9e1B5X1VOSUNPREVfVE9USVRMRX17UHlfVU5JQ09ERSBjaH0KLSAgUmV0dXJuIHRoZSBjaGFyYWN0ZXIgXHZhcntjaH0gY29udmVydGVkIHRvIHRpdGxlIGNhc2UuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeV9VTklDT0RFX1RPREVDSU1BTH17UHlfVU5JQ09ERSBjaH0KLSAgUmV0dXJuIHRoZSBjaGFyYWN0ZXIgXHZhcntjaH0gY29udmVydGVkIHRvIGEgZGVjaW1hbCBwb3NpdGl2ZQotICBpbnRlZ2VyLiAgUmV0dXJuIFxjb2Rley0xfSBpZiB0aGlzIGlzIG5vdCBwb3NzaWJsZS4gIFRoaXMgbWFjcm8KLSAgZG9lcyBub3QgcmFpc2UgZXhjZXB0aW9ucy4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5X1VOSUNPREVfVE9ESUdJVH17UHlfVU5JQ09ERSBjaH0KLSAgUmV0dXJuIHRoZSBjaGFyYWN0ZXIgXHZhcntjaH0gY29udmVydGVkIHRvIGEgc2luZ2xlIGRpZ2l0IGludGVnZXIuCi0gIFJldHVybiBcY29kZXstMX0gaWYgdGhpcyBpcyBub3QgcG9zc2libGUuICBUaGlzIG1hY3JvIGRvZXMgbm90IHJhaXNlCi0gIGV4Y2VwdGlvbnMuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317ZG91YmxlfXtQeV9VTklDT0RFX1RPTlVNRVJJQ317UHlfVU5JQ09ERSBjaH0KLSAgUmV0dXJuIHRoZSBjaGFyYWN0ZXIgXHZhcntjaH0gY29udmVydGVkIHRvIGEgZG91YmxlLgotICBSZXR1cm4gXGNvZGV7LTEuMH0gaWYgdGhpcyBpcyBub3QgcG9zc2libGUuICBUaGlzIG1hY3JvIGRvZXMgbm90IHJhaXNlCi0gIGV4Y2VwdGlvbnMuCi1cZW5ke2NmdW5jZGVzY30KLQotJSAtLS0gUGxhaW4gUHlfVU5JQ09ERSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVG8gY3JlYXRlIFVuaWNvZGUgb2JqZWN0cyBhbmQgYWNjZXNzIHRoZWlyIGJhc2ljIHNlcXVlbmNlIHByb3BlcnRpZXMsCi11c2UgdGhlc2UgQVBJczoKLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeVVuaWNvZGVfRnJvbVVuaWNvZGV9e2NvbnN0IFB5X1VOSUNPREUgKnUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzaXplfQotICBDcmVhdGUgYSBVbmljb2RlIE9iamVjdCBmcm9tIHRoZSBQeV9VTklDT0RFIGJ1ZmZlciBcdmFye3V9IG9mIHRoZQotICBnaXZlbiBzaXplLiBcdmFye3V9IG1heSBiZSBcTlVMTHt9IHdoaWNoIGNhdXNlcyB0aGUgY29udGVudHMgdG8gYmUKLSAgdW5kZWZpbmVkLiBJdCBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGZpbGwgaW4gdGhlIG5lZWRlZAotICBkYXRhLiAgVGhlIGJ1ZmZlciBpcyBjb3BpZWQgaW50byB0aGUgbmV3IG9iamVjdC4gSWYgdGhlIGJ1ZmZlciBpcwotICBub3QgXE5VTEx7fSwgdGhlIHJldHVybiB2YWx1ZSBtaWdodCBiZSBhIHNoYXJlZCBvYmplY3QuIFRoZXJlZm9yZSwKLSAgbW9kaWZpY2F0aW9uIG9mIHRoZSByZXN1bHRpbmcgVW5pY29kZSBvYmplY3QgaXMgb25seSBhbGxvd2VkIHdoZW4KLSAgXHZhcnt1fSBpcyBcTlVMTHt9LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlVbmljb2RlX0Zyb21TdHJpbmdBbmRTaXplfXtjb25zdCBjaGFyICp1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgc2l6ZX0KLSAgQ3JlYXRlIGEgVW5pY29kZSBPYmplY3QgZnJvbSB0aGUgY2hhciBidWZmZXIgXHZhcnt1fS4KLSAgVGhlIGJ5dGVzIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYmVpbmcgVVRGLTggZW5jb2RlZC4gCi0gIFx2YXJ7dX0gbWF5IGFsc28gYmUgXE5VTEx7fSB3aGljaCBjYXVzZXMgdGhlCi0gIGNvbnRlbnRzIHRvIGJlIHVuZGVmaW5lZC4gSXQgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eSB0byBmaWxsCi0gIGluIHRoZSBuZWVkZWQgZGF0YS4gIFRoZSBidWZmZXIgaXMgY29waWVkIGludG8gdGhlIG5ldyBvYmplY3QuCi0gIElmIHRoZSBidWZmZXIgaXMgbm90IFxOVUxMe30sIHRoZSByZXR1cm4gdmFsdWUgbWlnaHQgYmUgYSBzaGFyZWQgb2JqZWN0LgotICBUaGVyZWZvcmUsIG1vZGlmaWNhdGlvbiBvZiB0aGUgcmVzdWx0aW5nIFVuaWNvZGUgb2JqZWN0IGlzIG9ubHkgYWxsb3dlZAotICB3aGVuIFx2YXJ7dX0gaXMgXE5VTEx7fS4KLSAgXHZlcnNpb25hZGRlZHszLjB9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeVVuaWNvZGVfRnJvbVN0cmluZ317Y29uc3QgY2hhcip1fQotICAgQ3JlYXRlIGEgVW5pY29kZSBvYmplY3QgZnJvbSBhbiBVVEYtOCBlbmNvZGVkIG51bGwtdGVybWluYXRlZAotICAgY2hhciBidWZmZXIgXHZhcnt1fS4KLSAgIFx2ZXJzaW9uYWRkZWR7My4wfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlVbmljb2RlX0Zyb21Gb3JtYXR9e2NvbnN0IGNoYXIgKmZvcm1hdCwgLi4ufQotICBUYWtlIGEgQyBcY2Z1bmN0aW9ue3ByaW50ZigpfS1zdHlsZSBcdmFye2Zvcm1hdH0gc3RyaW5nIGFuZCBhCi0gIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMsIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nCi0gIFB5dGhvbiB1bmljb2RlIHN0cmluZyBhbmQgcmV0dXJuIGEgc3RyaW5nIHdpdGggdGhlIHZhbHVlcyBmb3JtYXR0ZWQgaW50bwotICBpdC4gIFRoZSB2YXJpYWJsZSBhcmd1bWVudHMgbXVzdCBiZSBDIHR5cGVzIGFuZCBtdXN0IGNvcnJlc3BvbmQKLSAgZXhhY3RseSB0byB0aGUgZm9ybWF0IGNoYXJhY3RlcnMgaW4gdGhlIFx2YXJ7Zm9ybWF0fSBzdHJpbmcuICBUaGUKLSAgZm9sbG93aW5nIGZvcm1hdCBjaGFyYWN0ZXJzIGFyZSBhbGxvd2VkOgotCi0gICUgVGhlIGRlc2NyaXB0aW9ucyBmb3IgJXpkIGFuZCAlenUgYXJlIHdyb25nLCBidXQgdGhlIHRydXRoIGlzIGNvbXBsaWNhdGVkCi0gICUgYmVjYXVzZSBub3QgYWxsIGNvbXBpbGVycyBzdXBwb3J0IHRoZSAleiB3aWR0aCBtb2RpZmllciAtLSB3ZSBmYWtlIGl0Ci0gICUgd2hlbiBuZWNlc3NhcnkgdmlhIGludGVycG9sYXRpbmcgUFlfRk9STUFUX1NJWkVfVC4KLQotICBcYmVnaW57dGFibGVpaWl9e2x8bHxsfXttZW1iZXJ9e0Zvcm1hdCBDaGFyYWN0ZXJzfXtUeXBlfXtDb21tZW50fQotICAgIFxsaW5laWlpe1wlXCV9e1xlbXBoe24vYX19e1RoZSBsaXRlcmFsIFwlIGNoYXJhY3Rlci59Ci0gICAgXGxpbmVpaWl7XCVjfXtpbnR9e0Egc2luZ2xlIGNoYXJhY3RlciwgcmVwcmVzZW50ZWQgYXMgYW4gQyBpbnQufQotICAgIFxsaW5laWlpe1wlZH17aW50fXtFeGFjdGx5IGVxdWl2YWxlbnQgdG8gXGNvZGV7cHJpbnRmKCJcJWQiKX0ufQotICAgIFxsaW5laWlpe1wldX17dW5zaWduZWQgaW50fXtFeGFjdGx5IGVxdWl2YWxlbnQgdG8gXGNvZGV7cHJpbnRmKCJcJXUiKX0ufQotICAgIFxsaW5laWlpe1wlbGR9e2xvbmd9e0V4YWN0bHkgZXF1aXZhbGVudCB0byBcY29kZXtwcmludGYoIlwlbGQiKX0ufQotICAgIFxsaW5laWlpe1wlbHV9e3Vuc2lnbmVkIGxvbmd9e0V4YWN0bHkgZXF1aXZhbGVudCB0byBcY29kZXtwcmludGYoIlwlbHUiKX0ufQotICAgIFxsaW5laWlpe1wlemR9e1B5X3NzaXplX3R9e0V4YWN0bHkgZXF1aXZhbGVudCB0byBcY29kZXtwcmludGYoIlwlemQiKX0ufQotICAgIFxsaW5laWlpe1wlenV9e3NpemVfdH17RXhhY3RseSBlcXVpdmFsZW50IHRvIFxjb2Rle3ByaW50ZigiXCV6dSIpfS59Ci0gICAgXGxpbmVpaWl7XCVpfXtpbnR9e0V4YWN0bHkgZXF1aXZhbGVudCB0byBcY29kZXtwcmludGYoIlwlaSIpfS59Ci0gICAgXGxpbmVpaWl7XCV4fXtpbnR9e0V4YWN0bHkgZXF1aXZhbGVudCB0byBcY29kZXtwcmludGYoIlwleCIpfS59Ci0gICAgXGxpbmVpaWl7XCVzfXtjaGFyKn17QSBudWxsLXRlcm1pbmF0ZWQgQyBjaGFyYWN0ZXIgYXJyYXkufQotICAgIFxsaW5laWlpe1wlcH17dm9pZCp9e1RoZSBoZXggcmVwcmVzZW50YXRpb24gb2YgYSBDIHBvaW50ZXIuCi0JTW9zdGx5IGVxdWl2YWxlbnQgdG8gXGNvZGV7cHJpbnRmKCJcJXAiKX0gZXhjZXB0IHRoYXQgaXQgaXMKLQlndWFyYW50ZWVkIHRvIHN0YXJ0IHdpdGggdGhlIGxpdGVyYWwgXGNvZGV7MHh9IHJlZ2FyZGxlc3Mgb2YKLQl3aGF0IHRoZSBwbGF0Zm9ybSdzIFxjb2Rle3ByaW50Zn0geWllbGRzLn0KLSAgICBcbGluZWlpaXtcJVV9e1B5T2JqZWN0Kn17QSB1bmljb2RlIG9iamVjdC59Ci0gICAgXGxpbmVpaWl7XCVWfXtQeU9iamVjdCosIGNoYXIgKn17QSB1bmljb2RlIG9iamVjdCAod2hpY2ggbWF5IGJlIFxOVUxMe30pCi0JYW5kIGEgbnVsbC10ZXJtaW5hdGVkIEMgY2hhcmFjdGVyIGFycmF5IGFzIGEgc2Vjb25kIHBhcmFtZXRlciAod2hpY2gKLQl3aWxsIGJlIHVzZWQsIGlmIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgXE5VTEx7fSkufQotICAgIFxsaW5laWlpe1wlU317UHlPYmplY3QqfXtUaGUgcmVzdWx0IG9mIGNhbGxpbmcgXGZ1bmN0aW9ue1B5T2JqZWN0X1VuaWNvZGUoKX0ufQotICAgIFxsaW5laWlpe1wlUn17UHlPYmplY3QqfXtUaGUgcmVzdWx0IG9mIGNhbGxpbmcgXGZ1bmN0aW9ue1B5T2JqZWN0X1JlcHIoKX0ufQotICBcZW5ke3RhYmxlaWlpfQotCi0gIEFuIHVucmVjb2duaXplZCBmb3JtYXQgY2hhcmFjdGVyIGNhdXNlcyBhbGwgdGhlIHJlc3Qgb2YgdGhlIGZvcm1hdAotICBzdHJpbmcgdG8gYmUgY29waWVkIGFzLWlzIHRvIHRoZSByZXN1bHQgc3RyaW5nLCBhbmQgYW55IGV4dHJhCi0gIGFyZ3VtZW50cyBkaXNjYXJkZWQuCi0gIFx2ZXJzaW9uYWRkZWR7My4wfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlVbmljb2RlX0Zyb21Gb3JtYXRWfXtjb25zdCBjaGFyICpmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IHZhcmdzfQotICBJZGVudGljYWwgdG8gXGZ1bmN0aW9ue1B5VW5pY29kZV9Gcm9tRm9ybWF0KCl9IGV4Y2VwdCB0aGF0IGl0IHRha2VzCi0gIGV4YWN0bHkgdHdvIGFyZ3VtZW50cy4KLSAgXHZlcnNpb25hZGRlZHszLjB9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlfVU5JQ09ERSp9e1B5VW5pY29kZV9Bc1VuaWNvZGV9e1B5T2JqZWN0ICp1bmljb2RlfQotICBSZXR1cm4gYSByZWFkLW9ubHkgcG9pbnRlciB0byB0aGUgVW5pY29kZSBvYmplY3QncyBpbnRlcm5hbAotICBcY3R5cGV7UHlfVU5JQ09ERX0gYnVmZmVyLCBcTlVMTHt9IGlmIFx2YXJ7dW5pY29kZX0gaXMgbm90IGEgVW5pY29kZQotICBvYmplY3QuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlfc3NpemVfdH17UHlVbmljb2RlX0dldFNpemV9e1B5T2JqZWN0ICp1bmljb2RlfQotICBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgVW5pY29kZSBvYmplY3QuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3R9e1B5T2JqZWN0ICpvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9yc30KLSAgQ29lcmNlIGFuIGVuY29kZWQgb2JqZWN0IFx2YXJ7b2JqfSB0byBhbiBVbmljb2RlIG9iamVjdCBhbmQgcmV0dXJuIGEKLSAgcmVmZXJlbmNlIHdpdGggaW5jcmVtZW50ZWQgcmVmY291bnQuCi0gIAotICBTdHJpbmcgYW5kIG90aGVyIGNoYXIgYnVmZmVyIGNvbXBhdGlibGUgb2JqZWN0cyBhcmUgZGVjb2RlZAotICBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGVuY29kaW5nIGFuZCB1c2luZyB0aGUgZXJyb3IgaGFuZGxpbmcKLSAgZGVmaW5lZCBieSBlcnJvcnMuICBCb3RoIGNhbiBiZSBcTlVMTHt9IHRvIGhhdmUgdGhlIGludGVyZmFjZQotICB1c2UgdGhlIGRlZmF1bHQgdmFsdWVzIChzZWUgdGhlIG5leHQgc2VjdGlvbiBmb3IgZGV0YWlscykuCi0KLSAgQWxsIG90aGVyIG9iamVjdHMsIGluY2x1ZGluZyBVbmljb2RlIG9iamVjdHMsIGNhdXNlIGEKLSAgXGV4Y2VwdGlvbntUeXBlRXJyb3J9IHRvIGJlIHNldC4KLQotICBUaGUgQVBJIHJldHVybnMgXE5VTEx7fSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IuICBUaGUgY2FsbGVyIGlzCi0gIHJlc3BvbnNpYmxlIGZvciBkZWNyZWYnaW5nIHRoZSByZXR1cm5lZCBvYmplY3RzLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlVbmljb2RlX0Zyb21PYmplY3R9e1B5T2JqZWN0ICpvYmp9Ci0gIFNob3J0Y3V0IGZvciBcY29kZXtQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3Qob2JqLCBOVUxMLCAic3RyaWN0Iil9Ci0gIHdoaWNoIGlzIHVzZWQgdGhyb3VnaG91dCB0aGUgaW50ZXJwcmV0ZXIgd2hlbmV2ZXIgY29lcmNpb24gdG8KLSAgVW5pY29kZSBpcyBuZWVkZWQuCi1cZW5ke2NmdW5jZGVzY30KLQotJSAtLS0gd2NoYXJfdCBzdXBwb3J0IGZvciBwbGF0Zm9ybXMgd2hpY2ggc3VwcG9ydCBpdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSWYgdGhlIHBsYXRmb3JtIHN1cHBvcnRzIFxjdHlwZXt3Y2hhcl90fSBhbmQgcHJvdmlkZXMgYSBoZWFkZXIgZmlsZQotd2NoYXIuaCwgUHl0aG9uIGNhbiBpbnRlcmZhY2UgZGlyZWN0bHkgdG8gdGhpcyB0eXBlIHVzaW5nIHRoZQotZm9sbG93aW5nIGZ1bmN0aW9ucy4gU3VwcG9ydCBpcyBvcHRpbWl6ZWQgaWYgUHl0aG9uJ3Mgb3duCi1cY3R5cGV7UHlfVU5JQ09ERX0gdHlwZSBpcyBpZGVudGljYWwgdG8gdGhlIHN5c3RlbSdzIFxjdHlwZXt3Y2hhcl90fS4KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeVVuaWNvZGVfRnJvbVdpZGVDaGFyfXtjb25zdCB3Y2hhcl90ICp3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHNpemV9Ci0gIENyZWF0ZSBhIFVuaWNvZGUgb2JqZWN0IGZyb20gdGhlIFxjdHlwZXt3Y2hhcl90fSBidWZmZXIgXHZhcnt3fSBvZgotICB0aGUgZ2l2ZW4gc2l6ZS4gIFJldHVybiBcTlVMTHt9IG9uIGZhaWx1cmUuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlfc3NpemVfdH17UHlVbmljb2RlX0FzV2lkZUNoYXJ9e1B5VW5pY29kZU9iamVjdCAqdW5pY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QgKncsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHNpemV9Ci0gIENvcHkgdGhlIFVuaWNvZGUgb2JqZWN0IGNvbnRlbnRzIGludG8gdGhlIFxjdHlwZXt3Y2hhcl90fSBidWZmZXIKLSAgXHZhcnt3fS4gIEF0IG1vc3QgXHZhcntzaXplfSBcY3R5cGV7d2NoYXJfdH0gY2hhcmFjdGVycyBhcmUgY29waWVkCi0gIChleGNsdWRpbmcgYSBwb3NzaWJseSB0cmFpbGluZyAwLXRlcm1pbmF0aW9uIGNoYXJhY3RlcikuICBSZXR1cm4KLSAgdGhlIG51bWJlciBvZiBcY3R5cGV7d2NoYXJfdH0gY2hhcmFjdGVycyBjb3BpZWQgb3IgLTEgaW4gY2FzZSBvZiBhbgotICBlcnJvci4gIE5vdGUgdGhhdCB0aGUgcmVzdWx0aW5nIFxjdHlwZXt3Y2hhcl90fSBzdHJpbmcgbWF5IG9yIG1heQotICBub3QgYmUgMC10ZXJtaW5hdGVkLiAgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8gbWFrZQotICBzdXJlIHRoYXQgdGhlIFxjdHlwZXt3Y2hhcl90fSBzdHJpbmcgaXMgMC10ZXJtaW5hdGVkIGluIGNhc2UgdGhpcyBpcwotICByZXF1aXJlZCBieSB0aGUgYXBwbGljYXRpb24uCi1cZW5ke2NmdW5jZGVzY30KLQotCi1cc3Vic3Vic2VjdGlvbntCdWlsdC1pbiBDb2RlY3MgXGxhYmVse2J1aWx0aW5Db2RlY3N9fQotCi1QeXRob24gcHJvdmlkZXMgYSBzZXQgb2YgYnVpbHRpbiBjb2RlY3Mgd2hpY2ggYXJlIHdyaXR0ZW4gaW4gQwotZm9yIHNwZWVkLiBBbGwgb2YgdGhlc2UgY29kZWNzIGFyZSBkaXJlY3RseSB1c2FibGUgdmlhIHRoZQotZm9sbG93aW5nIGZ1bmN0aW9ucy4KLQotTWFueSBvZiB0aGUgZm9sbG93aW5nIEFQSXMgdGFrZSB0d28gYXJndW1lbnRzIGVuY29kaW5nIGFuZAotZXJyb3JzLiBUaGVzZSBwYXJhbWV0ZXJzIGVuY29kaW5nIGFuZCBlcnJvcnMgaGF2ZSB0aGUgc2FtZSBzZW1hbnRpY3MKLWFzIHRoZSBvbmVzIG9mIHRoZSBidWlsdGluIHVuaWNvZGUoKSBVbmljb2RlIG9iamVjdCBjb25zdHJ1Y3Rvci4KLQotU2V0dGluZyBlbmNvZGluZyB0byBcTlVMTHt9IGNhdXNlcyB0aGUgZGVmYXVsdCBlbmNvZGluZyB0byBiZSB1c2VkCi13aGljaCBpcyBcQVNDSUkuICBUaGUgZmlsZSBzeXN0ZW0gY2FsbHMgc2hvdWxkIHVzZQotXGNkYXRhe1B5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2Rpbmd9IGFzIHRoZSBlbmNvZGluZyBmb3IgZmlsZQotbmFtZXMuIFRoaXMgdmFyaWFibGUgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgcmVhZC1vbmx5OiBPbiBzb21lIHN5c3RlbXMsCi1pdCB3aWxsIGJlIGEgcG9pbnRlciB0byBhIHN0YXRpYyBzdHJpbmcsIG9uIG90aGVycywgaXQgd2lsbCBjaGFuZ2UgYXQKLXJ1bi10aW1lIChzdWNoIGFzIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGludm9rZXMgc2V0bG9jYWxlKS4KLQotRXJyb3IgaGFuZGxpbmcgaXMgc2V0IGJ5IGVycm9ycyB3aGljaCBtYXkgYWxzbyBiZSBzZXQgdG8gXE5VTEx7fQotbWVhbmluZyB0byB1c2UgdGhlIGRlZmF1bHQgaGFuZGxpbmcgZGVmaW5lZCBmb3IgdGhlIGNvZGVjLiAgRGVmYXVsdAotZXJyb3IgaGFuZGxpbmcgZm9yIGFsbCBidWlsdGluIGNvZGVjcyBpcyBgYHN0cmljdCcnCi0oXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSBpcyByYWlzZWQpLgotCi1UaGUgY29kZWNzIGFsbCB1c2UgYSBzaW1pbGFyIGludGVyZmFjZS4gIE9ubHkgZGV2aWF0aW9uIGZyb20gdGhlCi1mb2xsb3dpbmcgZ2VuZXJpYyBvbmVzIGFyZSBkb2N1bWVudGVkIGZvciBzaW1wbGljaXR5LgotCi0lIC0tLSBHZW5lcmljIENvZGVjcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGVzZSBhcmUgdGhlIGdlbmVyaWMgY29kZWMgQVBJczoKLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeVVuaWNvZGVfRGVjb2RlfXtjb25zdCBjaGFyICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnN9Ci0gIENyZWF0ZSBhIFVuaWNvZGUgb2JqZWN0IGJ5IGRlY29kaW5nIFx2YXJ7c2l6ZX0gYnl0ZXMgb2YgdGhlIGVuY29kZWQKLSAgc3RyaW5nIFx2YXJ7c30uICBcdmFye2VuY29kaW5nfSBhbmQgXHZhcntlcnJvcnN9IGhhdmUgdGhlIHNhbWUKLSAgbWVhbmluZyBhcyB0aGUgcGFyYW1ldGVycyBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZQotICBcZnVuY3Rpb257dW5pY29kZSgpfSBidWlsdGluIGZ1bmN0aW9uLiAgVGhlIGNvZGVjIHRvIGJlIHVzZWQgaXMKLSAgbG9va2VkIHVwIHVzaW5nIHRoZSBQeXRob24gY29kZWMgcmVnaXN0cnkuICBSZXR1cm4gXE5VTEx7fSBpZiBhbgotICBleGNlcHRpb24gd2FzIHJhaXNlZCBieSB0aGUgY29kZWMuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeVVuaWNvZGVfRW5jb2RlfXtjb25zdCBQeV9VTklDT0RFICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnN9Ci0gIEVuY29kZSB0aGUgXGN0eXBle1B5X1VOSUNPREV9IGJ1ZmZlciBvZiB0aGUgZ2l2ZW4gc2l6ZSBhbmQgcmV0dXJuCi0gIGEgUHl0aG9uIHN0cmluZyBvYmplY3QuICBcdmFye2VuY29kaW5nfSBhbmQgXHZhcntlcnJvcnN9IGhhdmUgdGhlCi0gIHNhbWUgbWVhbmluZyBhcyB0aGUgcGFyYW1ldGVycyBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBVbmljb2RlCi0gIFxtZXRob2R7ZW5jb2RlKCl9IG1ldGhvZC4gIFRoZSBjb2RlYyB0byBiZSB1c2VkIGlzIGxvb2tlZCB1cCB1c2luZwotICB0aGUgUHl0aG9uIGNvZGVjIHJlZ2lzdHJ5LiAgUmV0dXJuIFxOVUxMe30gaWYgYW4gZXhjZXB0aW9uIHdhcwotICByYWlzZWQgYnkgdGhlIGNvZGVjLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZ317UHlPYmplY3QgKnVuaWNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnN9Ci0gIEVuY29kZSBhIFVuaWNvZGUgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHJlc3VsdCBhcyBQeXRob24gc3RyaW5nCi0gIG9iamVjdC4gXHZhcntlbmNvZGluZ30gYW5kIFx2YXJ7ZXJyb3JzfSBoYXZlIHRoZSBzYW1lIG1lYW5pbmcgYXMgdGhlCi0gIHBhcmFtZXRlcnMgb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgVW5pY29kZSBcbWV0aG9ke2VuY29kZSgpfSBtZXRob2QuCi0gIFRoZSBjb2RlYyB0byBiZSB1c2VkIGlzIGxvb2tlZCB1cCB1c2luZyB0aGUgUHl0aG9uIGNvZGVjIHJlZ2lzdHJ5LgotICBSZXR1cm4gXE5VTEx7fSBpZiBhbiBleGNlcHRpb24gd2FzIHJhaXNlZCBieSB0aGUgY29kZWMuCi1cZW5ke2NmdW5jZGVzY30KLQotJSAtLS0gVVRGLTggQ29kZWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlc2UgYXJlIHRoZSBVVEYtOCBjb2RlYyBBUElzOgotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5VW5pY29kZV9EZWNvZGVVVEY4fXtjb25zdCBjaGFyICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9yc30KLSAgQ3JlYXRlIGEgVW5pY29kZSBvYmplY3QgYnkgZGVjb2RpbmcgXHZhcntzaXplfSBieXRlcyBvZiB0aGUgVVRGLTgKLSAgZW5jb2RlZCBzdHJpbmcgXHZhcntzfS4gUmV0dXJuIFxOVUxMe30gaWYgYW4gZXhjZXB0aW9uIHdhcyByYWlzZWQKLSAgYnkgdGhlIGNvZGVjLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlVbmljb2RlX0RlY29kZVVURjhTdGF0ZWZ1bH17Y29uc3QgY2hhciAqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKmNvbnN1bWVkfQotICBJZiBcdmFye2NvbnN1bWVkfSBpcyBcTlVMTHt9LCBiZWhhdmUgbGlrZSBcY2Z1bmN0aW9ue1B5VW5pY29kZV9EZWNvZGVVVEY4KCl9LgotICBJZiBcdmFye2NvbnN1bWVkfSBpcyBub3QgXE5VTEx7fSwgdHJhaWxpbmcgaW5jb21wbGV0ZSBVVEYtOCBieXRlIHNlcXVlbmNlcwotICB3aWxsIG5vdCBiZSB0cmVhdGVkIGFzIGFuIGVycm9yLiBUaG9zZSBieXRlcyB3aWxsIG5vdCBiZSBkZWNvZGVkIGFuZCB0aGUKLSAgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgaGF2ZSBiZWVuIGRlY29kZWQgd2lsbCBiZSBzdG9yZWQgaW4gXHZhcntjb25zdW1lZH0uCi0gIFx2ZXJzaW9uYWRkZWR7Mi40fQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlVbmljb2RlX0VuY29kZVVURjh9e2NvbnN0IFB5X1VOSUNPREUgKnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzfQotICBFbmNvZGUgdGhlIFxjdHlwZXtQeV9VTklDT0RFfSBidWZmZXIgb2YgdGhlIGdpdmVuIHNpemUgdXNpbmcgVVRGLTgKLSAgYW5kIHJldHVybiBhIFB5dGhvbiBzdHJpbmcgb2JqZWN0LiAgUmV0dXJuIFxOVUxMe30gaWYgYW4gZXhjZXB0aW9uCi0gIHdhcyByYWlzZWQgYnkgdGhlIGNvZGVjLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlVbmljb2RlX0FzVVRGOFN0cmluZ317UHlPYmplY3QgKnVuaWNvZGV9Ci0gIEVuY29kZSBhIFVuaWNvZGUgb2JqZWN0cyB1c2luZyBVVEYtOCBhbmQgcmV0dXJuIHRoZSByZXN1bHQgYXMKLSAgUHl0aG9uIHN0cmluZyBvYmplY3QuICBFcnJvciBoYW5kbGluZyBpcyBgYHN0cmljdCcnLiAgUmV0dXJuCi0gIFxOVUxMe30gaWYgYW4gZXhjZXB0aW9uIHdhcyByYWlzZWQgYnkgdGhlIGNvZGVjLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLSUgLS0tIFVURi0xNiBDb2RlY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLVRoZXNlIGFyZSB0aGUgVVRGLTE2IGNvZGVjIEFQSXM6Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlVbmljb2RlX0RlY29kZVVURjE2fXtjb25zdCBjaGFyICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpieXRlb3JkZXJ9Ci0gIERlY29kZSBcdmFye2xlbmd0aH0gYnl0ZXMgZnJvbSBhIFVURi0xNiBlbmNvZGVkIGJ1ZmZlciBzdHJpbmcgYW5kCi0gIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBVbmljb2RlIG9iamVjdC4gIFx2YXJ7ZXJyb3JzfSAoaWYKLSAgbm9uLVxOVUxMe30pIGRlZmluZXMgdGhlIGVycm9yIGhhbmRsaW5nLiBJdCBkZWZhdWx0cyB0byBgYHN0cmljdCcnLgotCi0gIElmIFx2YXJ7Ynl0ZW9yZGVyfSBpcyBub24tXE5VTEx7fSwgdGhlIGRlY29kZXIgc3RhcnRzIGRlY29kaW5nIHVzaW5nCi0gIHRoZSBnaXZlbiBieXRlIG9yZGVyOgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAqYnl0ZW9yZGVyID09IC0xOiBsaXR0bGUgZW5kaWFuCi0gICAqYnl0ZW9yZGVyID09IDA6ICBuYXRpdmUgb3JkZXIKLSAgICpieXRlb3JkZXIgPT0gMTogIGJpZyBlbmRpYW4KLVxlbmR7dmVyYmF0aW19Ci0KLSAgYW5kIHRoZW4gc3dpdGNoZXMgaWYgdGhlIGZpcnN0IHR3byBieXRlcyBvZiB0aGUgaW5wdXQgZGF0YSBhcmUgYSBieXRlIG9yZGVyCi0gIG1hcmsgKEJPTSkgYW5kIHRoZSBzcGVjaWZpZWQgYnl0ZSBvcmRlciBpcyBuYXRpdmUgb3JkZXIuICBUaGlzIEJPTSBpcyBub3QKLSAgY29waWVkIGludG8gdGhlIHJlc3VsdGluZyBVbmljb2RlIHN0cmluZy4gIEFmdGVyIGNvbXBsZXRpb24sIFx2YXJ7KmJ5dGVvcmRlcn0KLSAgaXMgc2V0IHRvIHRoZSBjdXJyZW50IGJ5dGUgb3JkZXIgYXQgdGhlLgotCi0gIElmIFx2YXJ7Ynl0ZW9yZGVyfSBpcyBcTlVMTHt9LCB0aGUgY29kZWMgc3RhcnRzIGluIG5hdGl2ZSBvcmRlciBtb2RlLgotCi0gIFJldHVybiBcTlVMTHt9IGlmIGFuIGV4Y2VwdGlvbiB3YXMgcmFpc2VkIGJ5IHRoZSBjb2RlYy4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5VW5pY29kZV9EZWNvZGVVVEYxNlN0YXRlZnVsfXtjb25zdCBjaGFyICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpieXRlb3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKmNvbnN1bWVkfQotICBJZiBcdmFye2NvbnN1bWVkfSBpcyBcTlVMTHt9LCBiZWhhdmUgbGlrZQotICBcY2Z1bmN0aW9ue1B5VW5pY29kZV9EZWNvZGVVVEYxNigpfS4gSWYgXHZhcntjb25zdW1lZH0gaXMgbm90IFxOVUxMe30sCi0gIFxjZnVuY3Rpb257UHlVbmljb2RlX0RlY29kZVVURjE2U3RhdGVmdWwoKX0gd2lsbCBub3QgdHJlYXQgdHJhaWxpbmcgaW5jb21wbGV0ZQotICBVVEYtMTYgYnl0ZSBzZXF1ZW5jZXMgKHN1Y2ggYXMgYW4gb2RkIG51bWJlciBvZiBieXRlcyBvciBhIHNwbGl0IHN1cnJvZ2F0ZSBwYWlyKQotICBhcyBhbiBlcnJvci4gVGhvc2UgYnl0ZXMgd2lsbCBub3QgYmUgZGVjb2RlZCBhbmQgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0Ci0gIGhhdmUgYmVlbiBkZWNvZGVkIHdpbGwgYmUgc3RvcmVkIGluIFx2YXJ7Y29uc3VtZWR9LgotICBcdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5VW5pY29kZV9FbmNvZGVVVEYxNn17Y29uc3QgUHlfVU5JQ09ERSAqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBieXRlb3JkZXJ9Ci0gIFJldHVybiBhIFB5dGhvbiBzdHJpbmcgb2JqZWN0IGhvbGRpbmcgdGhlIFVURi0xNiBlbmNvZGVkIHZhbHVlIG9mCi0gIHRoZSBVbmljb2RlIGRhdGEgaW4gXHZhcntzfS4gIElmIFx2YXJ7Ynl0ZW9yZGVyfSBpcyBub3QgXGNvZGV7MH0sCi0gIG91dHB1dCBpcyB3cml0dGVuIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIGJ5dGUgb3JkZXI6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgIGJ5dGVvcmRlciA9PSAtMTogbGl0dGxlIGVuZGlhbgotICAgYnl0ZW9yZGVyID09IDA6ICBuYXRpdmUgYnl0ZSBvcmRlciAod3JpdGVzIGEgQk9NIG1hcmspCi0gICBieXRlb3JkZXIgPT0gMTogIGJpZyBlbmRpYW4KLVxlbmR7dmVyYmF0aW19Ci0KLSAgSWYgYnl0ZW9yZGVyIGlzIFxjb2RlezB9LCB0aGUgb3V0cHV0IHN0cmluZyB3aWxsIGFsd2F5cyBzdGFydCB3aXRoCi0gIHRoZSBVbmljb2RlIEJPTSBtYXJrIChVK0ZFRkYpLiBJbiB0aGUgb3RoZXIgdHdvIG1vZGVzLCBubyBCT00gbWFyawotICBpcyBwcmVwZW5kZWQuCi0KLSAgSWYgXHZhcntQeV9VTklDT0RFX1dJREV9IGlzIGRlZmluZWQsIGEgc2luZ2xlIFxjdHlwZXtQeV9VTklDT0RFfQotICB2YWx1ZSBtYXkgZ2V0IHJlcHJlc2VudGVkIGFzIGEgc3Vycm9nYXRlIHBhaXIuIElmIGl0IGlzIG5vdAotICBkZWZpbmVkLCBlYWNoIFxjdHlwZXtQeV9VTklDT0RFfSB2YWx1ZXMgaXMgaW50ZXJwcmV0ZWQgYXMgYW4KLSAgVUNTLTIgY2hhcmFjdGVyLgotCi0gIFJldHVybiBcTlVMTHt9IGlmIGFuIGV4Y2VwdGlvbiB3YXMgcmFpc2VkIGJ5IHRoZSBjb2RlYy4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5VW5pY29kZV9Bc1VURjE2U3RyaW5nfXtQeU9iamVjdCAqdW5pY29kZX0KLSAgUmV0dXJuIGEgUHl0aG9uIHN0cmluZyB1c2luZyB0aGUgVVRGLTE2IGVuY29kaW5nIGluIG5hdGl2ZSBieXRlCi0gIG9yZGVyLiBUaGUgc3RyaW5nIGFsd2F5cyBzdGFydHMgd2l0aCBhIEJPTSBtYXJrLiAgRXJyb3IgaGFuZGxpbmcgaXMKLSAgYGBzdHJpY3QnJy4gIFJldHVybiBcTlVMTHt9IGlmIGFuIGV4Y2VwdGlvbiB3YXMgcmFpc2VkIGJ5IHRoZQotICBjb2RlYy4KLVxlbmR7Y2Z1bmNkZXNjfQotCi0lIC0tLSBVbmljb2RlLUVzY2FwZSBDb2RlY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGVzZSBhcmUgdGhlIGBgVW5pY29kZSBFc2NhcGUnJyBjb2RlYyBBUElzOgotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5VW5pY29kZV9EZWNvZGVVbmljb2RlRXNjYXBlfXtjb25zdCBjaGFyICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9yc30KLSAgQ3JlYXRlIGEgVW5pY29kZSBvYmplY3QgYnkgZGVjb2RpbmcgXHZhcntzaXplfSBieXRlcyBvZiB0aGUKLSAgVW5pY29kZS1Fc2NhcGUgZW5jb2RlZCBzdHJpbmcgXHZhcntzfS4gIFJldHVybiBcTlVMTHt9IGlmIGFuCi0gIGV4Y2VwdGlvbiB3YXMgcmFpc2VkIGJ5IHRoZSBjb2RlYy4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5VW5pY29kZV9FbmNvZGVVbmljb2RlRXNjYXBlfXtjb25zdCBQeV9VTklDT0RFICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHNpemV9Ci0gIEVuY29kZSB0aGUgXGN0eXBle1B5X1VOSUNPREV9IGJ1ZmZlciBvZiB0aGUgZ2l2ZW4gc2l6ZSB1c2luZwotICBVbmljb2RlLUVzY2FwZSBhbmQgcmV0dXJuIGEgUHl0aG9uIHN0cmluZyBvYmplY3QuICBSZXR1cm4gXE5VTEx7fQotICBpZiBhbiBleGNlcHRpb24gd2FzIHJhaXNlZCBieSB0aGUgY29kZWMuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeVVuaWNvZGVfQXNVbmljb2RlRXNjYXBlU3RyaW5nfXtQeU9iamVjdCAqdW5pY29kZX0KLSAgRW5jb2RlIGEgVW5pY29kZSBvYmplY3RzIHVzaW5nIFVuaWNvZGUtRXNjYXBlIGFuZCByZXR1cm4gdGhlCi0gIHJlc3VsdCBhcyBQeXRob24gc3RyaW5nIG9iamVjdC4gIEVycm9yIGhhbmRsaW5nIGlzIGBgc3RyaWN0JycuCi0gIFJldHVybiBcTlVMTHt9IGlmIGFuIGV4Y2VwdGlvbiB3YXMgcmFpc2VkIGJ5IHRoZSBjb2RlYy4KLVxlbmR7Y2Z1bmNkZXNjfQotCi0lIC0tLSBSYXctVW5pY29kZS1Fc2NhcGUgQ29kZWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGVzZSBhcmUgdGhlIGBgUmF3IFVuaWNvZGUgRXNjYXBlJycgY29kZWMgQVBJczoKLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeVVuaWNvZGVfRGVjb2RlUmF3VW5pY29kZUVzY2FwZX17Y29uc3QgY2hhciAqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnN9Ci0gIENyZWF0ZSBhIFVuaWNvZGUgb2JqZWN0IGJ5IGRlY29kaW5nIFx2YXJ7c2l6ZX0gYnl0ZXMgb2YgdGhlCi0gIFJhdy1Vbmljb2RlLUVzY2FwZSBlbmNvZGVkIHN0cmluZyBcdmFye3N9LiAgUmV0dXJuIFxOVUxMe30gaWYgYW4KLSAgZXhjZXB0aW9uIHdhcyByYWlzZWQgYnkgdGhlIGNvZGVjLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlVbmljb2RlX0VuY29kZVJhd1VuaWNvZGVFc2NhcGV9e2NvbnN0IFB5X1VOSUNPREUgKnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzfQotICBFbmNvZGUgdGhlIFxjdHlwZXtQeV9VTklDT0RFfSBidWZmZXIgb2YgdGhlIGdpdmVuIHNpemUgdXNpbmcKLSAgUmF3LVVuaWNvZGUtRXNjYXBlIGFuZCByZXR1cm4gYSBQeXRob24gc3RyaW5nIG9iamVjdC4gIFJldHVybgotICBcTlVMTHt9IGlmIGFuIGV4Y2VwdGlvbiB3YXMgcmFpc2VkIGJ5IHRoZSBjb2RlYy4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5VW5pY29kZV9Bc1Jhd1VuaWNvZGVFc2NhcGVTdHJpbmd9e1B5T2JqZWN0ICp1bmljb2RlfQotICBFbmNvZGUgYSBVbmljb2RlIG9iamVjdHMgdXNpbmcgUmF3LVVuaWNvZGUtRXNjYXBlIGFuZCByZXR1cm4gdGhlCi0gIHJlc3VsdCBhcyBQeXRob24gc3RyaW5nIG9iamVjdC4gRXJyb3IgaGFuZGxpbmcgaXMgYGBzdHJpY3QnJy4KLSAgUmV0dXJuIFxOVUxMe30gaWYgYW4gZXhjZXB0aW9uIHdhcyByYWlzZWQgYnkgdGhlIGNvZGVjLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLSUgLS0tIExhdGluLTEgQ29kZWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZXNlIGFyZSB0aGUgTGF0aW4tMSBjb2RlYyBBUElzOgotTGF0aW4tMSBjb3JyZXNwb25kcyB0byB0aGUgZmlyc3QgMjU2IFVuaWNvZGUgb3JkaW5hbHMgYW5kIG9ubHkgdGhlc2UKLWFyZSBhY2NlcHRlZCBieSB0aGUgY29kZWNzIGR1cmluZyBlbmNvZGluZy4KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeVVuaWNvZGVfRGVjb2RlTGF0aW4xfXtjb25zdCBjaGFyICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9yc30KLSAgQ3JlYXRlIGEgVW5pY29kZSBvYmplY3QgYnkgZGVjb2RpbmcgXHZhcntzaXplfSBieXRlcyBvZiB0aGUgTGF0aW4tMQotICBlbmNvZGVkIHN0cmluZyBcdmFye3N9LiAgUmV0dXJuIFxOVUxMe30gaWYgYW4gZXhjZXB0aW9uIHdhcyByYWlzZWQKLSAgYnkgdGhlIGNvZGVjLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlVbmljb2RlX0VuY29kZUxhdGluMX17Y29uc3QgUHlfVU5JQ09ERSAqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnN9Ci0gIEVuY29kZSB0aGUgXGN0eXBle1B5X1VOSUNPREV9IGJ1ZmZlciBvZiB0aGUgZ2l2ZW4gc2l6ZSB1c2luZwotICBMYXRpbi0xIGFuZCByZXR1cm4gYSBQeXRob24gc3RyaW5nIG9iamVjdC4gIFJldHVybiBcTlVMTHt9IGlmIGFuCi0gIGV4Y2VwdGlvbiB3YXMgcmFpc2VkIGJ5IHRoZSBjb2RlYy4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5VW5pY29kZV9Bc0xhdGluMVN0cmluZ317UHlPYmplY3QgKnVuaWNvZGV9Ci0gIEVuY29kZSBhIFVuaWNvZGUgb2JqZWN0cyB1c2luZyBMYXRpbi0xIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBhcwotICBQeXRob24gc3RyaW5nIG9iamVjdC4gIEVycm9yIGhhbmRsaW5nIGlzIGBgc3RyaWN0JycuICBSZXR1cm4KLSAgXE5VTEx7fSBpZiBhbiBleGNlcHRpb24gd2FzIHJhaXNlZCBieSB0aGUgY29kZWMuCi1cZW5ke2NmdW5jZGVzY30KLQotJSAtLS0gQVNDSUkgQ29kZWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlc2UgYXJlIHRoZSBcQVNDSUl7fSBjb2RlYyBBUElzLiAgT25seSA3LWJpdCBcQVNDSUl7fSBkYXRhIGlzCi1hY2NlcHRlZC4gQWxsIG90aGVyIGNvZGVzIGdlbmVyYXRlIGVycm9ycy4KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeVVuaWNvZGVfRGVjb2RlQVNDSUl9e2NvbnN0IGNoYXIgKnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9yc30KLSAgQ3JlYXRlIGEgVW5pY29kZSBvYmplY3QgYnkgZGVjb2RpbmcgXHZhcntzaXplfSBieXRlcyBvZiB0aGUKLSAgXEFTQ0lJe30gZW5jb2RlZCBzdHJpbmcgXHZhcntzfS4gIFJldHVybiBcTlVMTHt9IGlmIGFuIGV4Y2VwdGlvbgotICB3YXMgcmFpc2VkIGJ5IHRoZSBjb2RlYy4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5VW5pY29kZV9FbmNvZGVBU0NJSX17Y29uc3QgUHlfVU5JQ09ERSAqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzfQotICBFbmNvZGUgdGhlIFxjdHlwZXtQeV9VTklDT0RFfSBidWZmZXIgb2YgdGhlIGdpdmVuIHNpemUgdXNpbmcKLSAgXEFTQ0lJe30gYW5kIHJldHVybiBhIFB5dGhvbiBzdHJpbmcgb2JqZWN0LiAgUmV0dXJuIFxOVUxMe30gaWYgYW4KLSAgZXhjZXB0aW9uIHdhcyByYWlzZWQgYnkgdGhlIGNvZGVjLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlVbmljb2RlX0FzQVNDSUlTdHJpbmd9e1B5T2JqZWN0ICp1bmljb2RlfQotICBFbmNvZGUgYSBVbmljb2RlIG9iamVjdHMgdXNpbmcgXEFTQ0lJe30gYW5kIHJldHVybiB0aGUgcmVzdWx0IGFzCi0gIFB5dGhvbiBzdHJpbmcgb2JqZWN0LiAgRXJyb3IgaGFuZGxpbmcgaXMgYGBzdHJpY3QnJy4gIFJldHVybgotICBcTlVMTHt9IGlmIGFuIGV4Y2VwdGlvbiB3YXMgcmFpc2VkIGJ5IHRoZSBjb2RlYy4KLVxlbmR7Y2Z1bmNkZXNjfQotCi0lIC0tLSBDaGFyYWN0ZXIgTWFwIENvZGVjcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGVzZSBhcmUgdGhlIG1hcHBpbmcgY29kZWMgQVBJczoKLQotVGhpcyBjb2RlYyBpcyBzcGVjaWFsIGluIHRoYXQgaXQgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IG1hbnkKLWRpZmZlcmVudCBjb2RlY3MgKGFuZCB0aGlzIGlzIGluIGZhY3Qgd2hhdCB3YXMgZG9uZSB0byBvYnRhaW4gbW9zdCBvZgotdGhlIHN0YW5kYXJkIGNvZGVjcyBpbmNsdWRlZCBpbiB0aGUgXG1vZHVsZXtlbmNvZGluZ3N9IHBhY2thZ2UpLiBUaGUKLWNvZGVjIHVzZXMgbWFwcGluZyB0byBlbmNvZGUgYW5kIGRlY29kZSBjaGFyYWN0ZXJzLgotCi1EZWNvZGluZyBtYXBwaW5ncyBtdXN0IG1hcCBzaW5nbGUgc3RyaW5nIGNoYXJhY3RlcnMgdG8gc2luZ2xlIFVuaWNvZGUKLWNoYXJhY3RlcnMsIGludGVnZXJzICh3aGljaCBhcmUgdGhlbiBpbnRlcnByZXRlZCBhcyBVbmljb2RlIG9yZGluYWxzKQotb3IgTm9uZSAobWVhbmluZyAidW5kZWZpbmVkIG1hcHBpbmciIGFuZCBjYXVzaW5nIGFuIGVycm9yKS4KLQotRW5jb2RpbmcgbWFwcGluZ3MgbXVzdCBtYXAgc2luZ2xlIFVuaWNvZGUgY2hhcmFjdGVycyB0byBzaW5nbGUgc3RyaW5nCi1jaGFyYWN0ZXJzLCBpbnRlZ2VycyAod2hpY2ggYXJlIHRoZW4gaW50ZXJwcmV0ZWQgYXMgTGF0aW4tMSBvcmRpbmFscykKLW9yIE5vbmUgKG1lYW5pbmcgInVuZGVmaW5lZCBtYXBwaW5nIiBhbmQgY2F1c2luZyBhbiBlcnJvcikuCi0KLVRoZSBtYXBwaW5nIG9iamVjdHMgcHJvdmlkZWQgbXVzdCBvbmx5IHN1cHBvcnQgdGhlIF9fZ2V0aXRlbV9fIG1hcHBpbmcKLWludGVyZmFjZS4KLQotSWYgYSBjaGFyYWN0ZXIgbG9va3VwIGZhaWxzIHdpdGggYSBMb29rdXBFcnJvciwgdGhlIGNoYXJhY3RlciBpcwotY29waWVkIGFzLWlzIG1lYW5pbmcgdGhhdCBpdHMgb3JkaW5hbCB2YWx1ZSB3aWxsIGJlIGludGVycHJldGVkIGFzCi1Vbmljb2RlIG9yIExhdGluLTEgb3JkaW5hbCByZXNwLiBCZWNhdXNlIG9mIHRoaXMsIG1hcHBpbmdzIG9ubHkgbmVlZAotdG8gY29udGFpbiB0aG9zZSBtYXBwaW5ncyB3aGljaCBtYXAgY2hhcmFjdGVycyB0byBkaWZmZXJlbnQgY29kZQotcG9pbnRzLgotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5VW5pY29kZV9EZWNvZGVDaGFybWFwfXtjb25zdCBjaGFyICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICptYXBwaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnN9Ci0gIENyZWF0ZSBhIFVuaWNvZGUgb2JqZWN0IGJ5IGRlY29kaW5nIFx2YXJ7c2l6ZX0gYnl0ZXMgb2YgdGhlIGVuY29kZWQKLSAgc3RyaW5nIFx2YXJ7c30gdXNpbmcgdGhlIGdpdmVuIFx2YXJ7bWFwcGluZ30gb2JqZWN0LiAgUmV0dXJuCi0gIFxOVUxMe30gaWYgYW4gZXhjZXB0aW9uIHdhcyByYWlzZWQgYnkgdGhlIGNvZGVjLiBJZiBcdmFye21hcHBpbmd9IGlzIFxOVUxMe30KLSAgbGF0aW4tMSBkZWNvZGluZyB3aWxsIGJlIGRvbmUuIEVsc2UgaXQgY2FuIGJlIGEgZGljdGlvbmFyeSBtYXBwaW5nIGJ5dGUgb3IgYQotICB1bmljb2RlIHN0cmluZywgd2hpY2ggaXMgdHJlYXRlZCBhcyBhIGxvb2t1cCB0YWJsZS4gQnl0ZSB2YWx1ZXMgZ3JlYXRlcgotICB0aGF0IHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBhbmQgVStGRkZFICJjaGFyYWN0ZXJzIiBhcmUgdHJlYXRlZCBhcwotICAidW5kZWZpbmVkIG1hcHBpbmciLgotICBcdmVyc2lvbmNoYW5nZWRbQWxsb3dlZCB1bmljb2RlIHN0cmluZyBhcyBtYXBwaW5nIGFyZ3VtZW50XXsyLjR9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeVVuaWNvZGVfRW5jb2RlQ2hhcm1hcH17Y29uc3QgUHlfVU5JQ09ERSAqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbWFwcGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzfQotICBFbmNvZGUgdGhlIFxjdHlwZXtQeV9VTklDT0RFfSBidWZmZXIgb2YgdGhlIGdpdmVuIHNpemUgdXNpbmcgdGhlCi0gIGdpdmVuIFx2YXJ7bWFwcGluZ30gb2JqZWN0IGFuZCByZXR1cm4gYSBQeXRob24gc3RyaW5nIG9iamVjdC4KLSAgUmV0dXJuIFxOVUxMe30gaWYgYW4gZXhjZXB0aW9uIHdhcyByYWlzZWQgYnkgdGhlIGNvZGVjLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlVbmljb2RlX0FzQ2hhcm1hcFN0cmluZ317UHlPYmplY3QgKnVuaWNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICptYXBwaW5nfQotICBFbmNvZGUgYSBVbmljb2RlIG9iamVjdHMgdXNpbmcgdGhlIGdpdmVuIFx2YXJ7bWFwcGluZ30gb2JqZWN0IGFuZAotICByZXR1cm4gdGhlIHJlc3VsdCBhcyBQeXRob24gc3RyaW5nIG9iamVjdC4gIEVycm9yIGhhbmRsaW5nIGlzCi0gIGBgc3RyaWN0JycuICBSZXR1cm4gXE5VTEx7fSBpZiBhbiBleGNlcHRpb24gd2FzIHJhaXNlZCBieSB0aGUKLSAgY29kZWMuCi1cZW5ke2NmdW5jZGVzY30KLQotVGhlIGZvbGxvd2luZyBjb2RlYyBBUEkgaXMgc3BlY2lhbCBpbiB0aGF0IG1hcHMgVW5pY29kZSB0byBVbmljb2RlLgotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5VW5pY29kZV9UcmFuc2xhdGVDaGFybWFwfXtjb25zdCBQeV9VTklDT0RFICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzfQotICBUcmFuc2xhdGUgYSBcY3R5cGV7UHlfVU5JQ09ERX0gYnVmZmVyIG9mIHRoZSBnaXZlbiBsZW5ndGggYnkKLSAgYXBwbHlpbmcgYSBjaGFyYWN0ZXIgbWFwcGluZyBcdmFye3RhYmxlfSB0byBpdCBhbmQgcmV0dXJuIHRoZQotICByZXN1bHRpbmcgVW5pY29kZSBvYmplY3QuICBSZXR1cm4gXE5VTEx7fSB3aGVuIGFuIGV4Y2VwdGlvbiB3YXMKLSAgcmFpc2VkIGJ5IHRoZSBjb2RlYy4KLQotICBUaGUgXHZhcnttYXBwaW5nfSB0YWJsZSBtdXN0IG1hcCBVbmljb2RlIG9yZGluYWwgaW50ZWdlcnMgdG8gVW5pY29kZQotICBvcmRpbmFsIGludGVnZXJzIG9yIE5vbmUgKGNhdXNpbmcgZGVsZXRpb24gb2YgdGhlIGNoYXJhY3RlcikuCi0KLSAgTWFwcGluZyB0YWJsZXMgbmVlZCBvbmx5IHByb3ZpZGUgdGhlIFxtZXRob2R7X19nZXRpdGVtX18oKX0KLSAgaW50ZXJmYWNlOyBkaWN0aW9uYXJpZXMgYW5kIHNlcXVlbmNlcyB3b3JrIHdlbGwuICBVbm1hcHBlZCBjaGFyYWN0ZXIKLSAgb3JkaW5hbHMgKG9uZXMgd2hpY2ggY2F1c2UgYSBcZXhjZXB0aW9ue0xvb2t1cEVycm9yfSkgYXJlIGxlZnQKLSAgdW50b3VjaGVkIGFuZCBhcmUgY29waWVkIGFzLWlzLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLSUgLS0tIE1CQ1MgY29kZWNzIGZvciBXaW5kb3dzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZXNlIGFyZSB0aGUgTUJDUyBjb2RlYyBBUElzLiBUaGV5IGFyZSBjdXJyZW50bHkgb25seSBhdmFpbGFibGUgb24KLVdpbmRvd3MgYW5kIHVzZSB0aGUgV2luMzIgTUJDUyBjb252ZXJ0ZXJzIHRvIGltcGxlbWVudCB0aGUKLWNvbnZlcnNpb25zLiAgTm90ZSB0aGF0IE1CQ1MgKG9yIERCQ1MpIGlzIGEgY2xhc3Mgb2YgZW5jb2RpbmdzLCBub3QKLWp1c3Qgb25lLiAgVGhlIHRhcmdldCBlbmNvZGluZyBpcyBkZWZpbmVkIGJ5IHRoZSB1c2VyIHNldHRpbmdzIG9uIHRoZQotbWFjaGluZSBydW5uaW5nIHRoZSBjb2RlYy4KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeVVuaWNvZGVfRGVjb2RlTUJDU317Y29uc3QgY2hhciAqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnN9Ci0gIENyZWF0ZSBhIFVuaWNvZGUgb2JqZWN0IGJ5IGRlY29kaW5nIFx2YXJ7c2l6ZX0gYnl0ZXMgb2YgdGhlIE1CQ1MKLSAgZW5jb2RlZCBzdHJpbmcgXHZhcntzfS4gIFJldHVybiBcTlVMTHt9IGlmIGFuIGV4Y2VwdGlvbiB3YXMKLSAgcmFpc2VkIGJ5IHRoZSBjb2RlYy4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5VW5pY29kZV9EZWNvZGVNQkNTU3RhdGVmdWx9e2NvbnN0IGNoYXIgKnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqY29uc3VtZWR9Ci0gIElmIFx2YXJ7Y29uc3VtZWR9IGlzIFxOVUxMe30sIGJlaGF2ZSBsaWtlCi0gIFxjZnVuY3Rpb257UHlVbmljb2RlX0RlY29kZU1CQ1MoKX0uIElmIFx2YXJ7Y29uc3VtZWR9IGlzIG5vdCBcTlVMTHt9LAotICBcY2Z1bmN0aW9ue1B5VW5pY29kZV9EZWNvZGVNQkNTU3RhdGVmdWwoKX0gd2lsbCBub3QgZGVjb2RlIHRyYWlsaW5nIGxlYWQKLSAgYnl0ZSBhbmQgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGhhdmUgYmVlbiBkZWNvZGVkIHdpbGwgYmUgc3RvcmVkIGluCi0gIFx2YXJ7Y29uc3VtZWR9LgotICBcdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5VW5pY29kZV9FbmNvZGVNQkNTfXtjb25zdCBQeV9VTklDT0RFICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9yc30KLSAgRW5jb2RlIHRoZSBcY3R5cGV7UHlfVU5JQ09ERX0gYnVmZmVyIG9mIHRoZSBnaXZlbiBzaXplIHVzaW5nIE1CQ1MKLSAgYW5kIHJldHVybiBhIFB5dGhvbiBzdHJpbmcgb2JqZWN0LiAgUmV0dXJuIFxOVUxMe30gaWYgYW4gZXhjZXB0aW9uCi0gIHdhcyByYWlzZWQgYnkgdGhlIGNvZGVjLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlVbmljb2RlX0FzTUJDU1N0cmluZ317UHlPYmplY3QgKnVuaWNvZGV9Ci0gIEVuY29kZSBhIFVuaWNvZGUgb2JqZWN0cyB1c2luZyBNQkNTIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBhcwotICBQeXRob24gc3RyaW5nIG9iamVjdC4gIEVycm9yIGhhbmRsaW5nIGlzIGBgc3RyaWN0JycuICBSZXR1cm4KLSAgXE5VTEx7fSBpZiBhbiBleGNlcHRpb24gd2FzIHJhaXNlZCBieSB0aGUgY29kZWMuCi1cZW5ke2NmdW5jZGVzY30KLQotJSAtLS0gTWV0aG9kcyAmIFNsb3RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotXHN1YnN1YnNlY3Rpb257TWV0aG9kcyBhbmQgU2xvdCBGdW5jdGlvbnMgXGxhYmVse3VuaWNvZGVNZXRob2RzQW5kU2xvdHN9fQotCi1UaGUgZm9sbG93aW5nIEFQSXMgYXJlIGNhcGFibGUgb2YgaGFuZGxpbmcgVW5pY29kZSBvYmplY3RzIGFuZCBzdHJpbmdzCi1vbiBpbnB1dCAod2UgcmVmZXIgdG8gdGhlbSBhcyBzdHJpbmdzIGluIHRoZSBkZXNjcmlwdGlvbnMpIGFuZCByZXR1cm4KLVVuaWNvZGUgb2JqZWN0cyBvciBpbnRlZ2VycyBhcyBhcHByb3ByaWF0ZS4KLQotVGhleSBhbGwgcmV0dXJuIFxOVUxMe30gb3IgXGNvZGV7LTF9IGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMuCi0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlVbmljb2RlX0NvbmNhdH17UHlPYmplY3QgKmxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpyaWdodH0KLSAgQ29uY2F0IHR3byBzdHJpbmdzIGdpdmluZyBhIG5ldyBVbmljb2RlIHN0cmluZy4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5VW5pY29kZV9TcGxpdH17UHlPYmplY3QgKnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnNlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heHNwbGl0fQotICBTcGxpdCBhIHN0cmluZyBnaXZpbmcgYSBsaXN0IG9mIFVuaWNvZGUgc3RyaW5ncy4gIElmIHNlcCBpcyBcTlVMTHt9LAotICBzcGxpdHRpbmcgd2lsbCBiZSBkb25lIGF0IGFsbCB3aGl0ZXNwYWNlIHN1YnN0cmluZ3MuICBPdGhlcndpc2UsCi0gIHNwbGl0cyBvY2N1ciBhdCB0aGUgZ2l2ZW4gc2VwYXJhdG9yLiAgQXQgbW9zdCBcdmFye21heHNwbGl0fSBzcGxpdHMKLSAgd2lsbCBiZSBkb25lLiAgSWYgbmVnYXRpdmUsIG5vIGxpbWl0IGlzIHNldC4gIFNlcGFyYXRvcnMgYXJlIG5vdAotICBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIGxpc3QuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeVVuaWNvZGVfU3BsaXRsaW5lc317UHlPYmplY3QgKnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQga2VlcGVuZH0KLSAgU3BsaXQgYSBVbmljb2RlIHN0cmluZyBhdCBsaW5lIGJyZWFrcywgcmV0dXJuaW5nIGEgbGlzdCBvZiBVbmljb2RlCi0gIHN0cmluZ3MuICBDUkxGIGlzIGNvbnNpZGVyZWQgdG8gYmUgb25lIGxpbmUgYnJlYWsuICBJZiBcdmFye2tlZXBlbmR9Ci0gIGlzIDAsIHRoZSBMaW5lIGJyZWFrIGNoYXJhY3RlcnMgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nCi0gIHN0cmluZ3MuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeVVuaWNvZGVfVHJhbnNsYXRlfXtQeU9iamVjdCAqc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9yc30KLSAgVHJhbnNsYXRlIGEgc3RyaW5nIGJ5IGFwcGx5aW5nIGEgY2hhcmFjdGVyIG1hcHBpbmcgdGFibGUgdG8gaXQgYW5kCi0gIHJldHVybiB0aGUgcmVzdWx0aW5nIFVuaWNvZGUgb2JqZWN0LgotCi0gIFRoZSBtYXBwaW5nIHRhYmxlIG11c3QgbWFwIFVuaWNvZGUgb3JkaW5hbCBpbnRlZ2VycyB0byBVbmljb2RlCi0gIG9yZGluYWwgaW50ZWdlcnMgb3IgTm9uZSAoY2F1c2luZyBkZWxldGlvbiBvZiB0aGUgY2hhcmFjdGVyKS4KLQotICBNYXBwaW5nIHRhYmxlcyBuZWVkIG9ubHkgcHJvdmlkZSB0aGUgXG1ldGhvZHtfX2dldGl0ZW1fXygpfQotICBpbnRlcmZhY2U7IGRpY3Rpb25hcmllcyBhbmQgc2VxdWVuY2VzIHdvcmsgd2VsbC4gIFVubWFwcGVkIGNoYXJhY3RlcgotICBvcmRpbmFscyAob25lcyB3aGljaCBjYXVzZSBhIFxleGNlcHRpb257TG9va3VwRXJyb3J9KSBhcmUgbGVmdAotICB1bnRvdWNoZWQgYW5kIGFyZSBjb3BpZWQgYXMtaXMuCi0KLSAgXHZhcntlcnJvcnN9IGhhcyB0aGUgdXN1YWwgbWVhbmluZyBmb3IgY29kZWNzLiBJdCBtYXkgYmUgXE5VTEx7fQotICB3aGljaCBpbmRpY2F0ZXMgdG8gdXNlIHRoZSBkZWZhdWx0IGVycm9yIGhhbmRsaW5nLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlVbmljb2RlX0pvaW59e1B5T2JqZWN0ICpzZXBhcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqc2VxfQotICBKb2luIGEgc2VxdWVuY2Ugb2Ygc3RyaW5ncyB1c2luZyB0aGUgZ2l2ZW4gc2VwYXJhdG9yIGFuZCByZXR1cm4gdGhlCi0gIHJlc3VsdGluZyBVbmljb2RlIHN0cmluZy4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5VW5pY29kZV9UYWlsbWF0Y2h9e1B5T2JqZWN0ICpzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpzdWJzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyZWN0aW9ufQotICBSZXR1cm4gMSBpZiBcdmFye3N1YnN0cn0gbWF0Y2hlcyBcdmFye3N0cn1bXHZhcntzdGFydH06XHZhcntlbmR9XSBhdAotICB0aGUgZ2l2ZW4gdGFpbCBlbmQgKFx2YXJ7ZGlyZWN0aW9ufSA9PSAtMSBtZWFucyB0byBkbyBhIHByZWZpeAotICBtYXRjaCwgXHZhcntkaXJlY3Rpb259ID09IDEgYSBzdWZmaXggbWF0Y2gpLCAwIG90aGVyd2lzZS4KLSAgUmV0dXJuIFxjb2Rley0xfSBpZiBhbiBlcnJvciBvY2N1cnJlZC4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeV9zc2l6ZV90fXtQeVVuaWNvZGVfRmluZH17UHlPYmplY3QgKnN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpzdWJzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyZWN0aW9ufQotICBSZXR1cm4gdGhlIGZpcnN0IHBvc2l0aW9uIG9mIFx2YXJ7c3Vic3RyfSBpbgotICBcdmFye3N0cn1bXHZhcntzdGFydH06XHZhcntlbmR9XSB1c2luZyB0aGUgZ2l2ZW4gXHZhcntkaXJlY3Rpb259Ci0gIChcdmFye2RpcmVjdGlvbn0gPT0gMSBtZWFucyB0byBkbyBhIGZvcndhcmQgc2VhcmNoLAotICBcdmFye2RpcmVjdGlvbn0gPT0gLTEgYSBiYWNrd2FyZCBzZWFyY2gpLiAgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUKLSAgaW5kZXggb2YgdGhlIGZpcnN0IG1hdGNoOyBhIHZhbHVlIG9mIFxjb2Rley0xfSBpbmRpY2F0ZXMgdGhhdCBubwotICBtYXRjaCB3YXMgZm91bmQsIGFuZCBcY29kZXstMn0gaW5kaWNhdGVzIHRoYXQgYW4gZXJyb3Igb2NjdXJyZWQgYW5kCi0gIGFuIGV4Y2VwdGlvbiBoYXMgYmVlbiBzZXQuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlfc3NpemVfdH17UHlVbmljb2RlX0NvdW50fXtQeU9iamVjdCAqc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpzdWJzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGVuZH0KLSAgUmV0dXJuIHRoZSBudW1iZXIgb2Ygbm9uLW92ZXJsYXBwaW5nIG9jY3VycmVuY2VzIG9mIFx2YXJ7c3Vic3RyfSBpbgotICBcY29kZXtcdmFye3N0cn1bXHZhcntzdGFydH06XHZhcntlbmR9XX0uICBSZXR1cm4gXGNvZGV7LTF9IGlmIGFuCi0gIGVycm9yIG9jY3VycmVkLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlVbmljb2RlX1JlcGxhY2V9e1B5T2JqZWN0ICpzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqc3Vic3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnJlcGxzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50fQotICBSZXBsYWNlIGF0IG1vc3QgXHZhcnttYXhjb3VudH0gb2NjdXJyZW5jZXMgb2YgXHZhcntzdWJzdHJ9IGluCi0gIFx2YXJ7c3RyfSB3aXRoIFx2YXJ7cmVwbHN0cn0gYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIFVuaWNvZGUgb2JqZWN0LgotICBcdmFye21heGNvdW50fSA9PSAtMSBtZWFucyByZXBsYWNlIGFsbCBvY2N1cnJlbmNlcy4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5VW5pY29kZV9Db21wYXJlfXtQeU9iamVjdCAqbGVmdCwgUHlPYmplY3QgKnJpZ2h0fQotICBDb21wYXJlIHR3byBzdHJpbmdzIGFuZCByZXR1cm4gLTEsIDAsIDEgZm9yIGxlc3MgdGhhbiwgZXF1YWwsIGFuZAotICBncmVhdGVyIHRoYW4sIHJlc3BlY3RpdmVseS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5VW5pY29kZV9SaWNoQ29tcGFyZX17UHlPYmplY3QgKmxlZnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpyaWdodCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9wfQotCi0gIFJpY2ggY29tcGFyZSB0d28gdW5pY29kZSBzdHJpbmdzIGFuZCByZXR1cm4gb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gIFxiZWdpbntpdGVtaXplfQotICAgIFxpdGVtIFxjb2Rle05VTEx9IGluIGNhc2UgYW4gZXhjZXB0aW9uIHdhcyByYWlzZWQKLSAgICBcaXRlbSBcY29uc3RhbnR7UHlfVHJ1ZX0gb3IgXGNvbnN0YW50e1B5X0ZhbHNlfSBmb3Igc3VjY2Vzc2Z1bCBjb21wYXJpc29ucwotICAgIFxpdGVtIFxjb25zdGFudHtQeV9Ob3RJbXBsZW1lbnRlZH0gaW4gY2FzZSB0aGUgdHlwZSBjb21iaW5hdGlvbiBpcyB1bmtub3duCi0gIFxlbmR7aXRlbWl6ZX0KLQotICAgTm90ZSB0aGF0IFxjb25zdGFudHtQeV9FUX0gYW5kIFxjb25zdGFudHtQeV9ORX0gY29tcGFyaXNvbnMgY2FuIGNhdXNlIGEKLSAgIFxleGNlcHRpb257VW5pY29kZVdhcm5pbmd9IGluIGNhc2UgdGhlIGNvbnZlcnNpb24gb2YgdGhlIGFyZ3VtZW50cyB0bwotICAgVW5pY29kZSBmYWlscyB3aXRoIGEgXGV4Y2VwdGlvbntVbmljb2RlRGVjb2RlRXJyb3J9LgotCi0gICBQb3NzaWJsZSB2YWx1ZXMgZm9yIFx2YXJ7b3B9IGFyZQotICAgXGNvbnN0YW50e1B5X0dUfSwgXGNvbnN0YW50e1B5X0dFfSwgXGNvbnN0YW50e1B5X0VRfSwKLSAgIFxjb25zdGFudHtQeV9ORX0sIFxjb25zdGFudHtQeV9MVH0sIGFuZCBcY29uc3RhbnR7UHlfTEV9LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlVbmljb2RlX0Zvcm1hdH17UHlPYmplY3QgKmZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJnc30KLSAgUmV0dXJuIGEgbmV3IHN0cmluZyBvYmplY3QgZnJvbSBcdmFye2Zvcm1hdH0gYW5kIFx2YXJ7YXJnc307IHRoaXMKLSAgaXMgYW5hbG9nb3VzIHRvIFxjb2Rle1x2YXJ7Zm9ybWF0fSBcJVwgXHZhcnthcmdzfX0uICBUaGUKLSAgXHZhcnthcmdzfSBhcmd1bWVudCBtdXN0IGJlIGEgdHVwbGUuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeVVuaWNvZGVfQ29udGFpbnN9e1B5T2JqZWN0ICpjb250YWluZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmVsZW1lbnR9Ci0gIENoZWNrIHdoZXRoZXIgXHZhcntlbGVtZW50fSBpcyBjb250YWluZWQgaW4gXHZhcntjb250YWluZXJ9IGFuZAotICByZXR1cm4gdHJ1ZSBvciBmYWxzZSBhY2NvcmRpbmdseS4KLQotICBcdmFye2VsZW1lbnR9IGhhcyB0byBjb2VyY2UgdG8gYSBvbmUgZWxlbWVudCBVbmljb2RlCi0gIHN0cmluZy4gXGNvZGV7LTF9IGlzIHJldHVybmVkIGlmIHRoZXJlIHdhcyBhbiBlcnJvci4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXt2b2lkfXtQeVVuaWNvZGVfSW50ZXJuSW5QbGFjZX17UHlPYmplY3QgKipzdHJpbmd9Ci0gIEludGVybiB0aGUgYXJndW1lbnQgXHZhcnsqc3RyaW5nfSBpbiBwbGFjZS4gIFRoZSBhcmd1bWVudCBtdXN0IGJlCi0gIHRoZSBhZGRyZXNzIG9mIGEgcG9pbnRlciB2YXJpYWJsZSBwb2ludGluZyB0byBhIFB5dGhvbiB1bmljb2RlIHN0cmluZwotICBvYmplY3QuICBJZiB0aGVyZSBpcyBhbiBleGlzdGluZyBpbnRlcm5lZCBzdHJpbmcgdGhhdCBpcyB0aGUgc2FtZSBhcwotICBcdmFyeypzdHJpbmd9LCBpdCBzZXRzIFx2YXJ7KnN0cmluZ30gdG8gaXQgKGRlY3JlbWVudGluZyB0aGUKLSAgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBvbGQgc3RyaW5nIG9iamVjdCBhbmQgaW5jcmVtZW50aW5nIHRoZQotICByZWZlcmVuY2UgY291bnQgb2YgdGhlIGludGVybmVkIHN0cmluZyBvYmplY3QpLCBvdGhlcndpc2UgaXQgbGVhdmVzCi0gIFx2YXJ7KnN0cmluZ30gYWxvbmUgYW5kIGludGVybnMgaXQgKGluY3JlbWVudGluZyBpdHMgcmVmZXJlbmNlCi0gIGNvdW50KS4gIChDbGFyaWZpY2F0aW9uOiBldmVuIHRob3VnaCB0aGVyZSBpcyBhIGxvdCBvZiB0YWxrIGFib3V0Ci0gIHJlZmVyZW5jZSBjb3VudHMsIHRoaW5rIG9mIHRoaXMgZnVuY3Rpb24gYXMgcmVmZXJlbmNlLWNvdW50LW5ldXRyYWw7Ci0gIHlvdSBvd24gdGhlIG9iamVjdCBhZnRlciB0aGUgY2FsbCBpZiBhbmQgb25seSBpZiB5b3Ugb3duZWQgaXQgYmVmb3JlCi0gIHRoZSBjYWxsLikKLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5VW5pY29kZV9JbnRlcm5Gcm9tU3RyaW5nfXtjb25zdCBjaGFyICp2fQotICBBIGNvbWJpbmF0aW9uIG9mIFxjZnVuY3Rpb257UHlVbmljb2RlX0Zyb21TdHJpbmcoKX0gYW5kCi0gIFxjZnVuY3Rpb257UHlVbmljb2RlX0ludGVybkluUGxhY2UoKX0sIHJldHVybmluZyBlaXRoZXIgYSBuZXcgdW5pY29kZQotICBzdHJpbmcgb2JqZWN0IHRoYXQgaGFzIGJlZW4gaW50ZXJuZWQsIG9yIGEgbmV3IChgYG93bmVkJycpIHJlZmVyZW5jZSB0bwotICBhbiBlYXJsaWVyIGludGVybmVkIHN0cmluZyBvYmplY3Qgd2l0aCB0aGUgc2FtZSB2YWx1ZS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxzdWJzZWN0aW9ue0J1ZmZlciBPYmplY3RzIFxsYWJlbHtidWZmZXJPYmplY3RzfX0KLVxzZWN0aW9uYXV0aG9ye0dyZWcgU3RlaW59e2dzdGVpbkBseXJhLm9yZ30KLQotXG9iaW5kZXh7YnVmZmVyfQotUHl0aG9uIG9iamVjdHMgaW1wbGVtZW50ZWQgaW4gQyBjYW4gZXhwb3J0IGEgZ3JvdXAgb2YgZnVuY3Rpb25zIGNhbGxlZAotdGhlIGBgYnVmZmVyXGluZGV4e2J1ZmZlciBpbnRlcmZhY2V9IGludGVyZmFjZS4nJyAgVGhlc2UgZnVuY3Rpb25zIGNhbgotYmUgdXNlZCBieSBhbiBvYmplY3QgdG8gZXhwb3NlIGl0cyBkYXRhIGluIGEgcmF3LCBieXRlLW9yaWVudGVkCi1mb3JtYXQuIENsaWVudHMgb2YgdGhlIG9iamVjdCBjYW4gdXNlIHRoZSBidWZmZXIgaW50ZXJmYWNlIHRvIGFjY2VzcwotdGhlIG9iamVjdCBkYXRhIGRpcmVjdGx5LCB3aXRob3V0IG5lZWRpbmcgdG8gY29weSBpdCBmaXJzdC4KLQotVHdvIGV4YW1wbGVzIG9mIG9iamVjdHMgdGhhdCBzdXBwb3J0Ci10aGUgYnVmZmVyIGludGVyZmFjZSBhcmUgc3RyaW5ncyBhbmQgYXJyYXlzLiBUaGUgc3RyaW5nIG9iamVjdCBleHBvc2VzCi10aGUgY2hhcmFjdGVyIGNvbnRlbnRzIGluIHRoZSBidWZmZXIgaW50ZXJmYWNlJ3MgYnl0ZS1vcmllbnRlZAotZm9ybS4gQW4gYXJyYXkgY2FuIGFsc28gZXhwb3NlIGl0cyBjb250ZW50cywgYnV0IGl0IHNob3VsZCBiZSBub3RlZAotdGhhdCBhcnJheSBlbGVtZW50cyBtYXkgYmUgbXVsdGktYnl0ZSB2YWx1ZXMuCi0KLUFuIGV4YW1wbGUgdXNlciBvZiB0aGUgYnVmZmVyIGludGVyZmFjZSBpcyB0aGUgZmlsZSBvYmplY3QncwotXG1ldGhvZHt3cml0ZSgpfSBtZXRob2QuIEFueSBvYmplY3QgdGhhdCBjYW4gZXhwb3J0IGEgc2VyaWVzIG9mIGJ5dGVzCi10aHJvdWdoIHRoZSBidWZmZXIgaW50ZXJmYWNlIGNhbiBiZSB3cml0dGVuIHRvIGEgZmlsZS4gVGhlcmUgYXJlIGEKLW51bWJlciBvZiBmb3JtYXQgY29kZXMgdG8gXGNmdW5jdGlvbntQeUFyZ19QYXJzZVR1cGxlKCl9IHRoYXQgb3BlcmF0ZQotYWdhaW5zdCBhbiBvYmplY3QncyBidWZmZXIgaW50ZXJmYWNlLCByZXR1cm5pbmcgZGF0YSBmcm9tIHRoZSB0YXJnZXQKLW9iamVjdC4KLQotTW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgYnVmZmVyIGludGVyZmFjZSBpcyBwcm92aWRlZCBpbiB0aGUgc2VjdGlvbgotYGBCdWZmZXIgT2JqZWN0IFN0cnVjdHVyZXMnJyAoc2VjdGlvbn5ccmVme2J1ZmZlci1zdHJ1Y3RzfSksIHVuZGVyCi10aGUgZGVzY3JpcHRpb24gZm9yIFxjdHlwZXtQeUJ1ZmZlclByb2NzfVx0dGluZGV4e1B5QnVmZmVyUHJvY3N9LgotCi1BIGBgYnVmZmVyIG9iamVjdCcnIGlzIGRlZmluZWQgaW4gdGhlIFxmaWxle2J1ZmZlcm9iamVjdC5ofSBoZWFkZXIKLShpbmNsdWRlZCBieSBcZmlsZXtQeXRob24uaH0pLiBUaGVzZSBvYmplY3RzIGxvb2sgdmVyeSBzaW1pbGFyIHRvCi1zdHJpbmcgb2JqZWN0cyBhdCB0aGUgUHl0aG9uIHByb2dyYW1taW5nIGxldmVsOiB0aGV5IHN1cHBvcnQgc2xpY2luZywKLWluZGV4aW5nLCBjb25jYXRlbmF0aW9uLCBhbmQgc29tZSBvdGhlciBzdGFuZGFyZCBzdHJpbmcKLW9wZXJhdGlvbnMuIEhvd2V2ZXIsIHRoZWlyIGRhdGEgY2FuIGNvbWUgZnJvbSBvbmUgb2YgdHdvIHNvdXJjZXM6IGZyb20KLWEgYmxvY2sgb2YgbWVtb3J5LCBvciBmcm9tIGFub3RoZXIgb2JqZWN0IHdoaWNoIGV4cG9ydHMgdGhlIGJ1ZmZlcgotaW50ZXJmYWNlLgotCi1CdWZmZXIgb2JqZWN0cyBhcmUgdXNlZnVsIGFzIGEgd2F5IHRvIGV4cG9zZSB0aGUgZGF0YSBmcm9tIGFub3RoZXIKLW9iamVjdCdzIGJ1ZmZlciBpbnRlcmZhY2UgdG8gdGhlIFB5dGhvbiBwcm9ncmFtbWVyLiBUaGV5IGNhbiBhbHNvIGJlCi11c2VkIGFzIGEgemVyby1jb3B5IHNsaWNpbmcgbWVjaGFuaXNtLiBVc2luZyB0aGVpciBhYmlsaXR5IHRvCi1yZWZlcmVuY2UgYSBibG9jayBvZiBtZW1vcnksIGl0IGlzIHBvc3NpYmxlIHRvIGV4cG9zZSBhbnkgZGF0YSB0byB0aGUKLVB5dGhvbiBwcm9ncmFtbWVyIHF1aXRlIGVhc2lseS4gVGhlIG1lbW9yeSBjb3VsZCBiZSBhIGxhcmdlLCBjb25zdGFudAotYXJyYXkgaW4gYSBDIGV4dGVuc2lvbiwgaXQgY291bGQgYmUgYSByYXcgYmxvY2sgb2YgbWVtb3J5IGZvcgotbWFuaXB1bGF0aW9uIGJlZm9yZSBwYXNzaW5nIHRvIGFuIG9wZXJhdGluZyBzeXN0ZW0gbGlicmFyeSwgb3IgaXQKLWNvdWxkIGJlIHVzZWQgdG8gcGFzcyBhcm91bmQgc3RydWN0dXJlZCBkYXRhIGluIGl0cyBuYXRpdmUsIGluLW1lbW9yeQotZm9ybWF0LgotCi1cYmVnaW57Y3R5cGVkZXNjfXtQeUJ1ZmZlck9iamVjdH0KLSAgVGhpcyBzdWJ0eXBlIG9mIFxjdHlwZXtQeU9iamVjdH0gcmVwcmVzZW50cyBhIGJ1ZmZlciBvYmplY3QuCi1cZW5ke2N0eXBlZGVzY30KLQotXGJlZ2lue2N2YXJkZXNjfXtQeVR5cGVPYmplY3R9e1B5QnVmZmVyX1R5cGV9Ci0gIFRoZSBpbnN0YW5jZSBvZiBcY3R5cGV7UHlUeXBlT2JqZWN0fSB3aGljaCByZXByZXNlbnRzIHRoZSBQeXRob24KLSAgYnVmZmVyIHR5cGU7IGl0IGlzIHRoZSBzYW1lIG9iamVjdCBhcyBcY29kZXtidWZmZXJ9IGFuZCAKLSAgXGNvZGV7dHlwZXMuQnVmZmVyVHlwZX0gaW4gdGhlIFB5dGhvbiBsYXllci4KLSAgXHdpdGhzdWJpdGVteyhpbiBtb2R1bGUgdHlwZXMpfXtcdHRpbmRleHtCdWZmZXJUeXBlfX0uCi1cZW5ke2N2YXJkZXNjfQotCi1cYmVnaW57Y3ZhcmRlc2N9e2ludH17UHlfRU5EX09GX0JVRkZFUn0KLSAgVGhpcyBjb25zdGFudCBtYXkgYmUgcGFzc2VkIGFzIHRoZSBcdmFye3NpemV9IHBhcmFtZXRlciB0bwotICBcY2Z1bmN0aW9ue1B5QnVmZmVyX0Zyb21PYmplY3QoKX0gb3IKLSAgXGNmdW5jdGlvbntQeUJ1ZmZlcl9Gcm9tUmVhZFdyaXRlT2JqZWN0KCl9LiAgSXQgaW5kaWNhdGVzIHRoYXQgdGhlCi0gIG5ldyBcY3R5cGV7UHlCdWZmZXJPYmplY3R9IHNob3VsZCByZWZlciB0byBcdmFye2Jhc2V9IG9iamVjdCBmcm9tCi0gIHRoZSBzcGVjaWZpZWQgXHZhcntvZmZzZXR9IHRvIHRoZSBlbmQgb2YgaXRzIGV4cG9ydGVkIGJ1ZmZlci4gIFVzaW5nCi0gIHRoaXMgZW5hYmxlcyB0aGUgY2FsbGVyIHRvIGF2b2lkIHF1ZXJ5aW5nIHRoZSBcdmFye2Jhc2V9IG9iamVjdCBmb3IKLSAgaXRzIGxlbmd0aC4KLVxlbmR7Y3ZhcmRlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlCdWZmZXJfQ2hlY2t9e1B5T2JqZWN0ICpwfQotICBSZXR1cm4gdHJ1ZSBpZiB0aGUgYXJndW1lbnQgaGFzIHR5cGUgXGNkYXRhe1B5QnVmZmVyX1R5cGV9LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlCdWZmZXJfRnJvbU9iamVjdH17UHlPYmplY3QgKmJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgb2Zmc2V0LCBQeV9zc2l6ZV90IHNpemV9Ci0gIFJldHVybiBhIG5ldyByZWFkLW9ubHkgYnVmZmVyIG9iamVjdC4gIFRoaXMgcmFpc2VzCi0gIFxleGNlcHRpb257VHlwZUVycm9yfSBpZiBcdmFye2Jhc2V9IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgcmVhZC1vbmx5Ci0gIGJ1ZmZlciBwcm90b2NvbCBvciBkb2Vzbid0IHByb3ZpZGUgZXhhY3RseSBvbmUgYnVmZmVyIHNlZ21lbnQsIG9yIGl0Ci0gIHJhaXNlcyBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IGlmIFx2YXJ7b2Zmc2V0fSBpcyBsZXNzIHRoYW4gemVyby4gVGhlCi0gIGJ1ZmZlciB3aWxsIGhvbGQgYSByZWZlcmVuY2UgdG8gdGhlIFx2YXJ7YmFzZX0gb2JqZWN0LCBhbmQgdGhlCi0gIGJ1ZmZlcidzIGNvbnRlbnRzIHdpbGwgcmVmZXIgdG8gdGhlIFx2YXJ7YmFzZX0gb2JqZWN0J3MgYnVmZmVyCi0gIGludGVyZmFjZSwgc3RhcnRpbmcgYXMgcG9zaXRpb24gXHZhcntvZmZzZXR9IGFuZCBleHRlbmRpbmcgZm9yCi0gIFx2YXJ7c2l6ZX0gYnl0ZXMuIElmIFx2YXJ7c2l6ZX0gaXMgXGNvbnN0YW50e1B5X0VORF9PRl9CVUZGRVJ9LCB0aGVuCi0gIHRoZSBuZXcgYnVmZmVyJ3MgY29udGVudHMgZXh0ZW5kIHRvIHRoZSBsZW5ndGggb2YgdGhlIFx2YXJ7YmFzZX0KLSAgb2JqZWN0J3MgZXhwb3J0ZWQgYnVmZmVyIGRhdGEuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeUJ1ZmZlcl9Gcm9tUmVhZFdyaXRlT2JqZWN0fXtQeU9iamVjdCAqYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgc2l6ZX0KLSAgUmV0dXJuIGEgbmV3IHdyaXRhYmxlIGJ1ZmZlciBvYmplY3QuICBQYXJhbWV0ZXJzIGFuZCBleGNlcHRpb25zIGFyZQotICBzaW1pbGFyIHRvIHRob3NlIGZvciBcY2Z1bmN0aW9ue1B5QnVmZmVyX0Zyb21PYmplY3QoKX0uICBJZiB0aGUKLSAgXHZhcntiYXNlfSBvYmplY3QgZG9lcyBub3QgZXhwb3J0IHRoZSB3cml0ZWFibGUgYnVmZmVyIHByb3RvY29sLAotICB0aGVuIFxleGNlcHRpb257VHlwZUVycm9yfSBpcyByYWlzZWQuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeUJ1ZmZlcl9Gcm9tTWVtb3J5fXt2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZX0KLSAgUmV0dXJuIGEgbmV3IHJlYWQtb25seSBidWZmZXIgb2JqZWN0IHRoYXQgcmVhZHMgZnJvbSBhIHNwZWNpZmllZAotICBsb2NhdGlvbiBpbiBtZW1vcnksIHdpdGggYSBzcGVjaWZpZWQgc2l6ZS4gIFRoZSBjYWxsZXIgaXMKLSAgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgdGhlIG1lbW9yeSBidWZmZXIsIHBhc3NlZCBpbiBhcwotICBcdmFye3B0cn0sIGlzIG5vdCBkZWFsbG9jYXRlZCB3aGlsZSB0aGUgcmV0dXJuZWQgYnVmZmVyIG9iamVjdAotICBleGlzdHMuICBSYWlzZXMgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSBpZiBcdmFye3NpemV9IGlzIGxlc3MgdGhhbgotICB6ZXJvLiAgTm90ZSB0aGF0IFxjb25zdGFudHtQeV9FTkRfT0ZfQlVGRkVSfSBtYXkgXGVtcGh7bm90fSBiZQotICBwYXNzZWQgZm9yIHRoZSBcdmFye3NpemV9IHBhcmFtZXRlcjsgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSB3aWxsIGJlCi0gIHJhaXNlZCBpbiB0aGF0IGNhc2UuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeUJ1ZmZlcl9Gcm9tUmVhZFdyaXRlTWVtb3J5fXt2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZX0KLSAgU2ltaWxhciB0byBcY2Z1bmN0aW9ue1B5QnVmZmVyX0Zyb21NZW1vcnkoKX0sIGJ1dCB0aGUgcmV0dXJuZWQKLSAgYnVmZmVyIGlzIHdyaXRhYmxlLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlCdWZmZXJfTmV3fXtQeV9zc2l6ZV90IHNpemV9Ci0gIFJldHVybiBhIG5ldyB3cml0YWJsZSBidWZmZXIgb2JqZWN0IHRoYXQgbWFpbnRhaW5zIGl0cyBvd24gbWVtb3J5Ci0gIGJ1ZmZlciBvZiBcdmFye3NpemV9IGJ5dGVzLiAgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSBpcyByZXR1cm5lZCBpZgotICBcdmFye3NpemV9IGlzIG5vdCB6ZXJvIG9yIHBvc2l0aXZlLiAgTm90ZSB0aGF0IHRoZSBtZW1vcnkgYnVmZmVyIChhcwotICByZXR1cm5lZCBieSBcY2Z1bmN0aW9ue1B5T2JqZWN0X0FzV3JpdGVCdWZmZXIoKX0pIGlzIG5vdCBzcGVjaWZpY2FsbHkKLSAgYWxpZ25lZC4KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxzdWJzZWN0aW9ue1R1cGxlIE9iamVjdHMgXGxhYmVse3R1cGxlT2JqZWN0c319Ci0KLVxvYmluZGV4e3R1cGxlfQotXGJlZ2lue2N0eXBlZGVzY317UHlUdXBsZU9iamVjdH0KLSAgVGhpcyBzdWJ0eXBlIG9mIFxjdHlwZXtQeU9iamVjdH0gcmVwcmVzZW50cyBhIFB5dGhvbiB0dXBsZSBvYmplY3QuCi1cZW5ke2N0eXBlZGVzY30KLQotXGJlZ2lue2N2YXJkZXNjfXtQeVR5cGVPYmplY3R9e1B5VHVwbGVfVHlwZX0KLSAgVGhpcyBpbnN0YW5jZSBvZiBcY3R5cGV7UHlUeXBlT2JqZWN0fSByZXByZXNlbnRzIHRoZSBQeXRob24gdHVwbGUKLSAgdHlwZTsgaXQgaXMgdGhlIHNhbWUgb2JqZWN0IGFzIFxjb2Rle3R1cGxlfSBhbmQgXGNvZGV7dHlwZXMuVHVwbGVUeXBlfQotICBpbiB0aGUgUHl0aG9uIGxheWVyLlx3aXRoc3ViaXRlbXsoaW4gbW9kdWxlIHR5cGVzKX17XHR0aW5kZXh7VHVwbGVUeXBlfX0uCi1cZW5ke2N2YXJkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5VHVwbGVfQ2hlY2t9e1B5T2JqZWN0ICpwfQotICBSZXR1cm4gdHJ1ZSBpZiBcdmFye3B9IGlzIGEgdHVwbGUgb2JqZWN0IG9yIGFuIGluc3RhbmNlIG9mIGEgc3VidHlwZQotICBvZiB0aGUgdHVwbGUgdHlwZS4KLSAgXHZlcnNpb25jaGFuZ2VkW0FsbG93ZWQgc3VidHlwZXMgdG8gYmUgYWNjZXB0ZWRdezIuMn0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5VHVwbGVfQ2hlY2tFeGFjdH17UHlPYmplY3QgKnB9Ci0gIFJldHVybiB0cnVlIGlmIFx2YXJ7cH0gaXMgYSB0dXBsZSBvYmplY3QsIGJ1dCBub3QgYW4gaW5zdGFuY2Ugb2YgYQotICBzdWJ0eXBlIG9mIHRoZSB0dXBsZSB0eXBlLgotICBcdmVyc2lvbmFkZGVkezIuMn0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5VHVwbGVfTmV3fXtQeV9zc2l6ZV90IGxlbn0KLSAgUmV0dXJuIGEgbmV3IHR1cGxlIG9iamVjdCBvZiBzaXplIFx2YXJ7bGVufSwgb3IgXE5VTEx7fSBvbiBmYWlsdXJlLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlUdXBsZV9QYWNrfXtQeV9zc2l6ZV90IG4sIFxtb3JlYXJnc30KLSAgUmV0dXJuIGEgbmV3IHR1cGxlIG9iamVjdCBvZiBzaXplIFx2YXJ7bn0sIG9yIFxOVUxMe30gb24gZmFpbHVyZS4KLSAgVGhlIHR1cGxlIHZhbHVlcyBhcmUgaW5pdGlhbGl6ZWQgdG8gdGhlIHN1YnNlcXVlbnQgXHZhcntufSBDIGFyZ3VtZW50cwotICBwb2ludGluZyB0byBQeXRob24gb2JqZWN0cy4gIFxzYW1we1B5VHVwbGVfUGFjaygyLCBcdmFye2F9LCBcdmFye2J9KX0KLSAgaXMgZXF1aXZhbGVudCB0byBcc2FtcHtQeV9CdWlsZFZhbHVlKCIoT08pIiwgXHZhcnthfSwgXHZhcntifSl9LgotICBcdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5VHVwbGVfU2l6ZX17UHlPYmplY3QgKnB9Ci0gIFRha2UgYSBwb2ludGVyIHRvIGEgdHVwbGUgb2JqZWN0LCBhbmQgcmV0dXJuIHRoZSBzaXplIG9mIHRoYXQKLSAgdHVwbGUuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeVR1cGxlX0dFVF9TSVpFfXtQeU9iamVjdCAqcH0KLSAgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSB0dXBsZSBcdmFye3B9LCB3aGljaCBtdXN0IGJlIG5vbi1cTlVMTHt9IGFuZAotICBwb2ludCB0byBhIHR1cGxlOyBubyBlcnJvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeVR1cGxlX0dldEl0ZW19e1B5T2JqZWN0ICpwLCBQeV9zc2l6ZV90IHBvc30KLSAgUmV0dXJuIHRoZSBvYmplY3QgYXQgcG9zaXRpb24gXHZhcntwb3N9IGluIHRoZSB0dXBsZSBwb2ludGVkIHRvIGJ5Ci0gIFx2YXJ7cH0uICBJZiBcdmFye3Bvc30gaXMgb3V0IG9mIGJvdW5kcywgcmV0dXJuIFxOVUxMe30gYW5kIHNldHMgYW4KLSAgXGV4Y2VwdGlvbntJbmRleEVycm9yfSBleGNlcHRpb24uCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeVR1cGxlX0dFVF9JVEVNfXtQeU9iamVjdCAqcCwgUHlfc3NpemVfdCBwb3N9Ci0gIExpa2UgXGNmdW5jdGlvbntQeVR1cGxlX0dldEl0ZW0oKX0sIGJ1dCBkb2VzIG5vIGNoZWNraW5nIG9mIGl0cwotICBhcmd1bWVudHMuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeVR1cGxlX0dldFNsaWNlfXtQeU9iamVjdCAqcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBsb3csIFB5X3NzaXplX3QgaGlnaH0KLSAgVGFrZSBhIHNsaWNlIG9mIHRoZSB0dXBsZSBwb2ludGVkIHRvIGJ5IFx2YXJ7cH0gZnJvbSBcdmFye2xvd30gdG8KLSAgXHZhcntoaWdofSBhbmQgcmV0dXJuIGl0IGFzIGEgbmV3IHR1cGxlLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlUdXBsZV9TZXRJdGVtfXtQeU9iamVjdCAqcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHBvcywgUHlPYmplY3QgKm99Ci0gIEluc2VydCBhIHJlZmVyZW5jZSB0byBvYmplY3QgXHZhcntvfSBhdCBwb3NpdGlvbiBcdmFye3Bvc30gb2YgdGhlCi0gIHR1cGxlIHBvaW50ZWQgdG8gYnkgXHZhcntwfS4gUmV0dXJuIFxjb2RlezB9IG9uIHN1Y2Nlc3MuCi0gIFxub3Rle1RoaXMgZnVuY3Rpb24gYGBzdGVhbHMnJyBhIHJlZmVyZW5jZSB0byBcdmFye299Ln0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXt2b2lkfXtQeVR1cGxlX1NFVF9JVEVNfXtQeU9iamVjdCAqcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgcG9zLCBQeU9iamVjdCAqb30KLSAgTGlrZSBcY2Z1bmN0aW9ue1B5VHVwbGVfU2V0SXRlbSgpfSwgYnV0IGRvZXMgbm8gZXJyb3IgY2hlY2tpbmcsIGFuZAotICBzaG91bGQgXGVtcGh7b25seX0gYmUgdXNlZCB0byBmaWxsIGluIGJyYW5kIG5ldyB0dXBsZXMuICBcbm90ZXtUaGlzCi0gIGZ1bmN0aW9uIGBgc3RlYWxzJycgYSByZWZlcmVuY2UgdG8gXHZhcntvfS59Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtfUHlUdXBsZV9SZXNpemV9e1B5T2JqZWN0ICoqcCwgUHlfc3NpemVfdCBuZXdzaXplfQotICBDYW4gYmUgdXNlZCB0byByZXNpemUgYSB0dXBsZS4gIFx2YXJ7bmV3c2l6ZX0gd2lsbCBiZSB0aGUgbmV3IGxlbmd0aAotICBvZiB0aGUgdHVwbGUuICBCZWNhdXNlIHR1cGxlcyBhcmUgXGVtcGh7c3VwcG9zZWR9IHRvIGJlIGltbXV0YWJsZSwKLSAgdGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGlmIHRoZXJlIGlzIG9ubHkgb25lIHJlZmVyZW5jZSB0byB0aGUKLSAgb2JqZWN0LiAgRG8gXGVtcGh7bm90fSB1c2UgdGhpcyBpZiB0aGUgdHVwbGUgbWF5IGFscmVhZHkgYmUga25vd24gdG8KLSAgc29tZSBvdGhlciBwYXJ0IG9mIHRoZSBjb2RlLiAgVGhlIHR1cGxlIHdpbGwgYWx3YXlzIGdyb3cgb3Igc2hyaW5rCi0gIGF0IHRoZSBlbmQuICBUaGluayBvZiB0aGlzIGFzIGRlc3Ryb3lpbmcgdGhlIG9sZCB0dXBsZSBhbmQgY3JlYXRpbmcKLSAgYSBuZXcgb25lLCBvbmx5IG1vcmUgZWZmaWNpZW50bHkuICBSZXR1cm5zIFxjb2RlezB9IG9uIHN1Y2Nlc3MuCi0gIENsaWVudCBjb2RlIHNob3VsZCBuZXZlciBhc3N1bWUgdGhhdCB0aGUgcmVzdWx0aW5nIHZhbHVlIG9mCi0gIFxjb2RleypcdmFye3B9fSB3aWxsIGJlIHRoZSBzYW1lIGFzIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCi0gIElmIHRoZSBvYmplY3QgcmVmZXJlbmNlZCBieSBcY29kZXsqXHZhcntwfX0gaXMgcmVwbGFjZWQsIHRoZQotICBvcmlnaW5hbCBcY29kZXsqXHZhcntwfX0gaXMgZGVzdHJveWVkLiAgT24gZmFpbHVyZSwgcmV0dXJucwotICBcY29kZXstMX0gYW5kIHNldHMgXGNvZGV7Klx2YXJ7cH19IHRvIFxOVUxMe30sIGFuZCByYWlzZXMKLSAgXGV4Y2VwdGlvbntNZW1vcnlFcnJvcn0gb3IKLSAgXGV4Y2VwdGlvbntTeXN0ZW1FcnJvcn0uCi0gIFx2ZXJzaW9uY2hhbmdlZFtSZW1vdmVkIHVudXNlZCB0aGlyZCBwYXJhbWV0ZXIsIFx2YXJ7bGFzdF9pc19zdGlja3l9XXsyLjJ9Ci1cZW5ke2NmdW5jZGVzY30KLQotCi1cc3Vic2VjdGlvbntMaXN0IE9iamVjdHMgXGxhYmVse2xpc3RPYmplY3RzfX0KLQotXG9iaW5kZXh7bGlzdH0KLVxiZWdpbntjdHlwZWRlc2N9e1B5TGlzdE9iamVjdH0KLSAgVGhpcyBzdWJ0eXBlIG9mIFxjdHlwZXtQeU9iamVjdH0gcmVwcmVzZW50cyBhIFB5dGhvbiBsaXN0IG9iamVjdC4KLVxlbmR7Y3R5cGVkZXNjfQotCi1cYmVnaW57Y3ZhcmRlc2N9e1B5VHlwZU9iamVjdH17UHlMaXN0X1R5cGV9Ci0gIFRoaXMgaW5zdGFuY2Ugb2YgXGN0eXBle1B5VHlwZU9iamVjdH0gcmVwcmVzZW50cyB0aGUgUHl0aG9uIGxpc3QKLSAgdHlwZS4gIFRoaXMgaXMgdGhlIHNhbWUgb2JqZWN0IGFzIFxjb2Rle2xpc3R9IGFuZCBcY29kZXt0eXBlcy5MaXN0VHlwZX0KLSAgaW4gdGhlIFB5dGhvbiBsYXllci5cd2l0aHN1Yml0ZW17KGluIG1vZHVsZSB0eXBlcyl9e1x0dGluZGV4e0xpc3RUeXBlfX0KLVxlbmR7Y3ZhcmRlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlMaXN0X0NoZWNrfXtQeU9iamVjdCAqcH0KLSAgUmV0dXJuIHRydWUgaWYgXHZhcntwfSBpcyBhIGxpc3Qgb2JqZWN0IG9yIGFuIGluc3RhbmNlIG9mIGEKLSAgc3VidHlwZSBvZiB0aGUgbGlzdCB0eXBlLgotICBcdmVyc2lvbmNoYW5nZWRbQWxsb3dlZCBzdWJ0eXBlcyB0byBiZSBhY2NlcHRlZF17Mi4yfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlMaXN0X0NoZWNrRXhhY3R9e1B5T2JqZWN0ICpwfQotICBSZXR1cm4gdHJ1ZSBpZiBcdmFye3B9IGlzIGEgbGlzdCBvYmplY3QsIGJ1dCBub3QgYW4gaW5zdGFuY2Ugb2YgYQotICBzdWJ0eXBlIG9mIHRoZSBsaXN0IHR5cGUuCi0gIFx2ZXJzaW9uYWRkZWR7Mi4yfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlMaXN0X05ld317UHlfc3NpemVfdCBsZW59Ci0gIFJldHVybiBhIG5ldyBsaXN0IG9mIGxlbmd0aCBcdmFye2xlbn0gb24gc3VjY2Vzcywgb3IgXE5VTEx7fSBvbgotICBmYWlsdXJlLgotICBcbm90ZXtJZiBcdmFye2xlbmd0aH0gaXMgZ3JlYXRlciB0aGFuIHplcm8sIHRoZSByZXR1cm5lZCBsaXN0IG9iamVjdCdzCi0gICAgICAgIGl0ZW1zIGFyZSBzZXQgdG8gXGNvZGV7TlVMTH0uICBUaHVzIHlvdSBjYW5ub3QgdXNlIGFic3RyYWN0Ci0gICAgICAgIEFQSSBmdW5jdGlvbnMgc3VjaCBhcyBcY2Z1bmN0aW9ue1B5U2VxdWVuY2VfU2V0SXRlbSgpfSAKLSAgICAgICAgb3IgZXhwb3NlIHRoZSBvYmplY3QgdG8gUHl0aG9uIGNvZGUgYmVmb3JlIHNldHRpbmcgYWxsIGl0ZW1zIHRvIGEKLSAgICAgICAgcmVhbCBvYmplY3Qgd2l0aCBcY2Z1bmN0aW9ue1B5TGlzdF9TZXRJdGVtKCl9Ln0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeV9zc2l6ZV90fXtQeUxpc3RfU2l6ZX17UHlPYmplY3QgKmxpc3R9Ci0gIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IG9iamVjdCBpbiBcdmFye2xpc3R9OyB0aGlzIGlzCi0gIGVxdWl2YWxlbnQgdG8gXHNhbXB7bGVuKFx2YXJ7bGlzdH0pfSBvbiBhIGxpc3Qgb2JqZWN0LgotICBcYmlmdW5jaW5kZXh7bGVufQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5X3NzaXplX3R9e1B5TGlzdF9HRVRfU0laRX17UHlPYmplY3QgKmxpc3R9Ci0gIE1hY3JvIGZvcm0gb2YgXGNmdW5jdGlvbntQeUxpc3RfU2l6ZSgpfSB3aXRob3V0IGVycm9yIGNoZWNraW5nLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlMaXN0X0dldEl0ZW19e1B5T2JqZWN0ICpsaXN0LCBQeV9zc2l6ZV90IGluZGV4fQotICBSZXR1cm4gdGhlIG9iamVjdCBhdCBwb3NpdGlvbiBcdmFye3Bvc30gaW4gdGhlIGxpc3QgcG9pbnRlZCB0byBieQotICBcdmFye3B9LiAgVGhlIHBvc2l0aW9uIG11c3QgYmUgcG9zaXRpdmUsIGluZGV4aW5nIGZyb20gdGhlIGVuZCBvZiB0aGUKLSAgbGlzdCBpcyBub3Qgc3VwcG9ydGVkLiAgSWYgXHZhcntwb3N9IGlzIG91dCBvZiBib3VuZHMsIHJldHVybiBcTlVMTHt9Ci0gIGFuZCBzZXQgYW4gXGV4Y2VwdGlvbntJbmRleEVycm9yfSBleGNlcHRpb24uCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeUxpc3RfR0VUX0lURU19e1B5T2JqZWN0ICpsaXN0LCBQeV9zc2l6ZV90IGl9Ci0gIE1hY3JvIGZvcm0gb2YgXGNmdW5jdGlvbntQeUxpc3RfR2V0SXRlbSgpfSB3aXRob3V0IGVycm9yIGNoZWNraW5nLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlMaXN0X1NldEl0ZW19e1B5T2JqZWN0ICpsaXN0LCBQeV9zc2l6ZV90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKml0ZW19Ci0gIFNldCB0aGUgaXRlbSBhdCBpbmRleCBcdmFye2luZGV4fSBpbiBsaXN0IHRvIFx2YXJ7aXRlbX0uICBSZXR1cm4KLSAgXGNvZGV7MH0gb24gc3VjY2VzcyBvciBcY29kZXstMX0gb24gZmFpbHVyZS4gIFxub3Rle1RoaXMgZnVuY3Rpb24KLSAgYGBzdGVhbHMnJyBhIHJlZmVyZW5jZSB0byBcdmFye2l0ZW19IGFuZCBkaXNjYXJkcyBhIHJlZmVyZW5jZSB0byBhbgotICBpdGVtIGFscmVhZHkgaW4gdGhlIGxpc3QgYXQgdGhlIGFmZmVjdGVkIHBvc2l0aW9uLn0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXt2b2lkfXtQeUxpc3RfU0VUX0lURU19e1B5T2JqZWN0ICpsaXN0LCBQeV9zc2l6ZV90IGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm99Ci0gIE1hY3JvIGZvcm0gb2YgXGNmdW5jdGlvbntQeUxpc3RfU2V0SXRlbSgpfSB3aXRob3V0IGVycm9yIGNoZWNraW5nLgotICBUaGlzIGlzIG5vcm1hbGx5IG9ubHkgdXNlZCB0byBmaWxsIGluIG5ldyBsaXN0cyB3aGVyZSB0aGVyZSBpcyBubwotICBwcmV2aW91cyBjb250ZW50LgotICBcbm90ZXtUaGlzIGZ1bmN0aW9uIGBgc3RlYWxzJycgYSByZWZlcmVuY2UgdG8gXHZhcntpdGVtfSwgYW5kLAotICB1bmxpa2UgXGNmdW5jdGlvbntQeUxpc3RfU2V0SXRlbSgpfSwgZG9lcyBcZW1waHtub3R9IGRpc2NhcmQgYQotICByZWZlcmVuY2UgdG8gYW55IGl0ZW0gdGhhdCBpdCBiZWluZyByZXBsYWNlZDsgYW55IHJlZmVyZW5jZSBpbgotICBcdmFye2xpc3R9IGF0IHBvc2l0aW9uIFx2YXJ7aX0gd2lsbCBiZSBsZWFrZWQufQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlMaXN0X0luc2VydH17UHlPYmplY3QgKmxpc3QsIFB5X3NzaXplX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICppdGVtfQotICBJbnNlcnQgdGhlIGl0ZW0gXHZhcntpdGVtfSBpbnRvIGxpc3QgXHZhcntsaXN0fSBpbiBmcm9udCBvZiBpbmRleAotICBcdmFye2luZGV4fS4gIFJldHVybiBcY29kZXswfSBpZiBzdWNjZXNzZnVsOyByZXR1cm4gXGNvZGV7LTF9IGFuZAotICBzZXQgYW4gZXhjZXB0aW9uIGlmIHVuc3VjY2Vzc2Z1bC4gIEFuYWxvZ291cyB0bwotICBcY29kZXtcdmFye2xpc3R9Lmluc2VydChcdmFye2luZGV4fSwgXHZhcntpdGVtfSl9LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlMaXN0X0FwcGVuZH17UHlPYmplY3QgKmxpc3QsIFB5T2JqZWN0ICppdGVtfQotICBBcHBlbmQgdGhlIG9iamVjdCBcdmFye2l0ZW19IGF0IHRoZSBlbmQgb2YgbGlzdCBcdmFye2xpc3R9LgotICBSZXR1cm4gXGNvZGV7MH0gaWYgc3VjY2Vzc2Z1bDsgcmV0dXJuIFxjb2Rley0xfSBhbmQgc2V0IGFuCi0gIGV4Y2VwdGlvbiBpZiB1bnN1Y2Nlc3NmdWwuICBBbmFsb2dvdXMgdG8KLSAgXGNvZGV7XHZhcntsaXN0fS5hcHBlbmQoXHZhcntpdGVtfSl9LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlMaXN0X0dldFNsaWNlfXtQeU9iamVjdCAqbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGxvdywgUHlfc3NpemVfdCBoaWdofQotICBSZXR1cm4gYSBsaXN0IG9mIHRoZSBvYmplY3RzIGluIFx2YXJ7bGlzdH0gY29udGFpbmluZyB0aGUgb2JqZWN0cwotICBcZW1waHtiZXR3ZWVufSBcdmFye2xvd30gYW5kIFx2YXJ7aGlnaH0uICBSZXR1cm4gXE5VTEx7fSBhbmQgc2V0Ci0gIGFuIGV4Y2VwdGlvbiBpZiB1bnN1Y2Nlc3NmdWwuCi0gIEFuYWxvZ291cyB0byBcY29kZXtcdmFye2xpc3R9W1x2YXJ7bG93fTpcdmFye2hpZ2h9XX0uCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeUxpc3RfU2V0U2xpY2V9e1B5T2JqZWN0ICpsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbG93LCBQeV9zc2l6ZV90IGhpZ2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKml0ZW1saXN0fQotICBTZXQgdGhlIHNsaWNlIG9mIFx2YXJ7bGlzdH0gYmV0d2VlbiBcdmFye2xvd30gYW5kIFx2YXJ7aGlnaH0gdG8gdGhlCi0gIGNvbnRlbnRzIG9mIFx2YXJ7aXRlbWxpc3R9LiAgQW5hbG9nb3VzIHRvCi0gIFxjb2Rle1x2YXJ7bGlzdH1bXHZhcntsb3d9Olx2YXJ7aGlnaH1dID0gXHZhcntpdGVtbGlzdH19LgotICBUaGUgXHZhcntpdGVtbGlzdH0gbWF5IGJlIFxOVUxMe30sIGluZGljYXRpbmcgdGhlIGFzc2lnbm1lbnQKLSAgb2YgYW4gZW1wdHkgbGlzdCAoc2xpY2UgZGVsZXRpb24pLgotICBSZXR1cm4gXGNvZGV7MH0gb24gc3VjY2VzcywgXGNvZGV7LTF9IG9uIGZhaWx1cmUuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeUxpc3RfU29ydH17UHlPYmplY3QgKmxpc3R9Ci0gIFNvcnQgdGhlIGl0ZW1zIG9mIFx2YXJ7bGlzdH0gaW4gcGxhY2UuICBSZXR1cm4gXGNvZGV7MH0gb24KLSAgc3VjY2VzcywgXGNvZGV7LTF9IG9uIGZhaWx1cmUuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KLSAgXHNhbXB7XHZhcntsaXN0fS5zb3J0KCl9LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlMaXN0X1JldmVyc2V9e1B5T2JqZWN0ICpsaXN0fQotICBSZXZlcnNlIHRoZSBpdGVtcyBvZiBcdmFye2xpc3R9IGluIHBsYWNlLiAgUmV0dXJuIFxjb2RlezB9IG9uCi0gIHN1Y2Nlc3MsIFxjb2Rley0xfSBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZgotICBcc2FtcHtcdmFye2xpc3R9LnJldmVyc2UoKX0uCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeUxpc3RfQXNUdXBsZX17UHlPYmplY3QgKmxpc3R9Ci0gIFJldHVybiBhIG5ldyB0dXBsZSBvYmplY3QgY29udGFpbmluZyB0aGUgY29udGVudHMgb2YgXHZhcntsaXN0fTsKLSAgZXF1aXZhbGVudCB0byBcc2FtcHt0dXBsZShcdmFye2xpc3R9KX0uXGJpZnVuY2luZGV4e3R1cGxlfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLQotXHNlY3Rpb257TWFwcGluZyBPYmplY3RzIFxsYWJlbHttYXBPYmplY3RzfX0KLQotXG9iaW5kZXh7bWFwcGluZ30KLQotCi1cc3Vic2VjdGlvbntEaWN0aW9uYXJ5IE9iamVjdHMgXGxhYmVse2RpY3RPYmplY3RzfX0KLQotXG9iaW5kZXh7ZGljdGlvbmFyeX0KLVxiZWdpbntjdHlwZWRlc2N9e1B5RGljdE9iamVjdH0KLSAgVGhpcyBzdWJ0eXBlIG9mIFxjdHlwZXtQeU9iamVjdH0gcmVwcmVzZW50cyBhIFB5dGhvbiBkaWN0aW9uYXJ5Ci0gIG9iamVjdC4KLVxlbmR7Y3R5cGVkZXNjfQotCi1cYmVnaW57Y3ZhcmRlc2N9e1B5VHlwZU9iamVjdH17UHlEaWN0X1R5cGV9Ci0gIFRoaXMgaW5zdGFuY2Ugb2YgXGN0eXBle1B5VHlwZU9iamVjdH0gcmVwcmVzZW50cyB0aGUgUHl0aG9uCi0gIGRpY3Rpb25hcnkgdHlwZS4gIFRoaXMgaXMgZXhwb3NlZCB0byBQeXRob24gcHJvZ3JhbXMgYXMKLSAgXGNvZGV7ZGljdH0gYW5kIFxjb2Rle3R5cGVzLkRpY3RUeXBlfS4KLSAgXHdpdGhzdWJpdGVteyhpbiBtb2R1bGUgdHlwZXMpfXtcdHRpbmRleHtEaWN0VHlwZX1cdHRpbmRleHtEaWN0aW9uYXJ5VHlwZX19Ci1cZW5ke2N2YXJkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5RGljdF9DaGVja317UHlPYmplY3QgKnB9Ci0gIFJldHVybiB0cnVlIGlmIFx2YXJ7cH0gaXMgYSBkaWN0IG9iamVjdCBvciBhbiBpbnN0YW5jZSBvZiBhCi0gIHN1YnR5cGUgb2YgdGhlIGRpY3QgdHlwZS4KLSAgXHZlcnNpb25jaGFuZ2VkW0FsbG93ZWQgc3VidHlwZXMgdG8gYmUgYWNjZXB0ZWRdezIuMn0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5RGljdF9DaGVja0V4YWN0fXtQeU9iamVjdCAqcH0KLSAgUmV0dXJuIHRydWUgaWYgXHZhcntwfSBpcyBhIGRpY3Qgb2JqZWN0LCBidXQgbm90IGFuIGluc3RhbmNlIG9mIGEKLSAgc3VidHlwZSBvZiB0aGUgZGljdCB0eXBlLgotICBcdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5RGljdF9OZXd9e30KLSAgUmV0dXJuIGEgbmV3IGVtcHR5IGRpY3Rpb25hcnksIG9yIFxOVUxMe30gb24gZmFpbHVyZS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5RGljdFByb3h5X05ld317UHlPYmplY3QgKmRpY3R9Ci0gIFJldHVybiBhIHByb3h5IG9iamVjdCBmb3IgYSBtYXBwaW5nIHdoaWNoIGVuZm9yY2VzIHJlYWQtb25seQotICBiZWhhdmlvci4gIFRoaXMgaXMgbm9ybWFsbHkgdXNlZCB0byBjcmVhdGUgYSBwcm94eSB0byBwcmV2ZW50Ci0gIG1vZGlmaWNhdGlvbiBvZiB0aGUgZGljdGlvbmFyeSBmb3Igbm9uLWR5bmFtaWMgY2xhc3MgdHlwZXMuCi0gIFx2ZXJzaW9uYWRkZWR7Mi4yfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e3ZvaWR9e1B5RGljdF9DbGVhcn17UHlPYmplY3QgKnB9Ci0gIEVtcHR5IGFuIGV4aXN0aW5nIGRpY3Rpb25hcnkgb2YgYWxsIGtleS12YWx1ZSBwYWlycy4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5RGljdF9Db250YWluc317UHlPYmplY3QgKnAsIFB5T2JqZWN0ICprZXl9Ci0gIERldGVybWluZSBpZiBkaWN0aW9uYXJ5IFx2YXJ7cH0gY29udGFpbnMgXHZhcntrZXl9LiAgSWYgYW4gaXRlbQotICBpbiBcdmFye3B9IGlzIG1hdGNoZXMgXHZhcntrZXl9LCByZXR1cm4gXGNvZGV7MX0sIG90aGVyd2lzZSByZXR1cm4KLSAgXGNvZGV7MH0uICBPbiBlcnJvciwgcmV0dXJuIFxjb2Rley0xfS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUKLSAgUHl0aG9uIGV4cHJlc3Npb24gXHNhbXB7XHZhcntrZXl9IGluIFx2YXJ7cH19LgotICBcdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5RGljdF9Db3B5fXtQeU9iamVjdCAqcH0KLSAgUmV0dXJuIGEgbmV3IGRpY3Rpb25hcnkgdGhhdCBjb250YWlucyB0aGUgc2FtZSBrZXktdmFsdWUgcGFpcnMgYXMKLSAgXHZhcntwfS4KLSAgXHZlcnNpb25hZGRlZHsxLjZ9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeURpY3RfU2V0SXRlbX17UHlPYmplY3QgKnAsIFB5T2JqZWN0ICprZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqdmFsfQotICBJbnNlcnQgXHZhcnt2YWx1ZX0gaW50byB0aGUgZGljdGlvbmFyeSBcdmFye3B9IHdpdGggYSBrZXkgb2YKLSAgXHZhcntrZXl9LiAgXHZhcntrZXl9IG11c3QgYmUgaGFzaGFibGU7IGlmIGl0IGlzbid0LAotICBcZXhjZXB0aW9ue1R5cGVFcnJvcn0gd2lsbCBiZSByYWlzZWQuCi0gIFJldHVybiBcY29kZXswfSBvbiBzdWNjZXNzIG9yIFxjb2Rley0xfSBvbiBmYWlsdXJlLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlEaWN0X1NldEl0ZW1TdHJpbmd9e1B5T2JqZWN0ICpwLAotICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5LAotICAgICAgICAgICAgUHlPYmplY3QgKnZhbH0KLSAgSW5zZXJ0IFx2YXJ7dmFsdWV9IGludG8gdGhlIGRpY3Rpb25hcnkgXHZhcntwfSB1c2luZyBcdmFye2tleX0gYXMgYQotICBrZXkuIFx2YXJ7a2V5fSBzaG91bGQgYmUgYSBcY3R5cGV7Y2hhcip9LiAgVGhlIGtleSBvYmplY3QgaXMgY3JlYXRlZAotICB1c2luZyBcY29kZXtQeVN0cmluZ19Gcm9tU3RyaW5nKFx2YXJ7a2V5fSl9LiBSZXR1cm4gXGNvZGV7MH0gb24KLSAgc3VjY2VzcyBvciBcY29kZXstMX0gb24gZmFpbHVyZS4KLSAgXHR0aW5kZXh7UHlTdHJpbmdfRnJvbVN0cmluZygpfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlEaWN0X0RlbEl0ZW19e1B5T2JqZWN0ICpwLCBQeU9iamVjdCAqa2V5fQotICBSZW1vdmUgdGhlIGVudHJ5IGluIGRpY3Rpb25hcnkgXHZhcntwfSB3aXRoIGtleSBcdmFye2tleX0uCi0gIFx2YXJ7a2V5fSBtdXN0IGJlIGhhc2hhYmxlOyBpZiBpdCBpc24ndCwgXGV4Y2VwdGlvbntUeXBlRXJyb3J9IGlzCi0gIHJhaXNlZC4gIFJldHVybiBcY29kZXswfSBvbiBzdWNjZXNzIG9yIFxjb2Rley0xfSBvbiBmYWlsdXJlLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlEaWN0X0RlbEl0ZW1TdHJpbmd9e1B5T2JqZWN0ICpwLCBjaGFyICprZXl9Ci0gIFJlbW92ZSB0aGUgZW50cnkgaW4gZGljdGlvbmFyeSBcdmFye3B9IHdoaWNoIGhhcyBhIGtleSBzcGVjaWZpZWQgYnkKLSAgdGhlIHN0cmluZyBcdmFye2tleX0uICBSZXR1cm4gXGNvZGV7MH0gb24gc3VjY2VzcyBvciBcY29kZXstMX0gb24KLSAgZmFpbHVyZS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5RGljdF9HZXRJdGVtfXtQeU9iamVjdCAqcCwgUHlPYmplY3QgKmtleX0KLSAgUmV0dXJuIHRoZSBvYmplY3QgZnJvbSBkaWN0aW9uYXJ5IFx2YXJ7cH0gd2hpY2ggaGFzIGEga2V5Ci0gIFx2YXJ7a2V5fS4gIFJldHVybiBcTlVMTHt9IGlmIHRoZSBrZXkgXHZhcntrZXl9IGlzIG5vdCBwcmVzZW50LCBidXQKLSAgXGVtcGh7d2l0aG91dH0gc2V0dGluZyBhbiBleGNlcHRpb24uCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeURpY3RfR2V0SXRlbVN0cmluZ317UHlPYmplY3QgKnAsIGNvbnN0IGNoYXIgKmtleX0KLSAgVGhpcyBpcyB0aGUgc2FtZSBhcyBcY2Z1bmN0aW9ue1B5RGljdF9HZXRJdGVtKCl9LCBidXQgXHZhcntrZXl9IGlzCi0gIHNwZWNpZmllZCBhcyBhIFxjdHlwZXtjaGFyKn0sIHJhdGhlciB0aGFuIGEgXGN0eXBle1B5T2JqZWN0Kn0uCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeURpY3RfSXRlbXN9e1B5T2JqZWN0ICpwfQotICBSZXR1cm4gYSBcY3R5cGV7UHlMaXN0T2JqZWN0fSBjb250YWluaW5nIGFsbCB0aGUgaXRlbXMgZnJvbSB0aGUKLSAgZGljdGlvbmFyeSwgYXMgaW4gdGhlIGRpY3Rpb25hcnkgbWV0aG9kIFxtZXRob2R7aXRlbXMoKX0gKHNlZSB0aGUKLSAgXGNpdGV0aXRsZVsuLi9saWIvbGliLmh0bWxde1B5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZX0pLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlEaWN0X0tleXN9e1B5T2JqZWN0ICpwfQotICBSZXR1cm4gYSBcY3R5cGV7UHlMaXN0T2JqZWN0fSBjb250YWluaW5nIGFsbCB0aGUga2V5cyBmcm9tIHRoZQotICBkaWN0aW9uYXJ5LCBhcyBpbiB0aGUgZGljdGlvbmFyeSBtZXRob2QgXG1ldGhvZHtrZXlzKCl9IChzZWUgdGhlCi0gIFxjaXRldGl0bGVbLi4vbGliL2xpYi5odG1sXXtQeXRob24gTGlicmFyeSBSZWZlcmVuY2V9KS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5RGljdF9WYWx1ZXN9e1B5T2JqZWN0ICpwfQotICBSZXR1cm4gYSBcY3R5cGV7UHlMaXN0T2JqZWN0fSBjb250YWluaW5nIGFsbCB0aGUgdmFsdWVzIGZyb20gdGhlCi0gIGRpY3Rpb25hcnkgXHZhcntwfSwgYXMgaW4gdGhlIGRpY3Rpb25hcnkgbWV0aG9kIFxtZXRob2R7dmFsdWVzKCl9Ci0gIChzZWUgdGhlIFxjaXRldGl0bGVbLi4vbGliL2xpYi5odG1sXXtQeXRob24gTGlicmFyeSBSZWZlcmVuY2V9KS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeV9zc2l6ZV90fXtQeURpY3RfU2l6ZX17UHlPYmplY3QgKnB9Ci0gIFJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBkaWN0aW9uYXJ5LiAgVGhpcyBpcyBlcXVpdmFsZW50Ci0gIHRvIFxzYW1we2xlbihcdmFye3B9KX0gb24gYSBkaWN0aW9uYXJ5LlxiaWZ1bmNpbmRleHtsZW59Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeURpY3RfTmV4dH17UHlPYmplY3QgKnAsIFB5X3NzaXplX3QgKnBwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqKnBrZXksIFB5T2JqZWN0ICoqcHZhbHVlfQotICBJdGVyYXRlIG92ZXIgYWxsIGtleS12YWx1ZSBwYWlycyBpbiB0aGUgZGljdGlvbmFyeSBcdmFye3B9LiAgVGhlCi0gIFxjdHlwZXtpbnR9IHJlZmVycmVkIHRvIGJ5IFx2YXJ7cHBvc30gbXVzdCBiZSBpbml0aWFsaXplZCB0bwotICBcY29kZXswfSBwcmlvciB0byB0aGUgZmlyc3QgY2FsbCB0byB0aGlzIGZ1bmN0aW9uIHRvIHN0YXJ0IHRoZQotICBpdGVyYXRpb247IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgZm9yIGVhY2ggcGFpciBpbiB0aGUKLSAgZGljdGlvbmFyeSwgYW5kIGZhbHNlIG9uY2UgYWxsIHBhaXJzIGhhdmUgYmVlbiByZXBvcnRlZC4gIFRoZQotICBwYXJhbWV0ZXJzIFx2YXJ7cGtleX0gYW5kIFx2YXJ7cHZhbHVlfSBzaG91bGQgZWl0aGVyIHBvaW50IHRvCi0gIFxjdHlwZXtQeU9iamVjdCp9IHZhcmlhYmxlcyB0aGF0IHdpbGwgYmUgZmlsbGVkIGluIHdpdGggZWFjaCBrZXkgYW5kCi0gIHZhbHVlLCByZXNwZWN0aXZlbHksIG9yIG1heSBiZSBcTlVMTHt9LiAgQW55IHJlZmVyZW5jZXMgcmV0dXJuZWQgdGhyb3VnaAotICB0aGVtIGFyZSBib3Jyb3dlZC4gIFx2YXJ7cHBvc30gc2hvdWxkIG5vdCBiZSBhbHRlcmVkIGR1cmluZyBpdGVyYXRpb24uCi0gIEl0cyB2YWx1ZSByZXByZXNlbnRzIG9mZnNldHMgd2l0aGluIHRoZSBpbnRlcm5hbCBkaWN0aW9uYXJ5IHN0cnVjdHVyZSwKLSAgYW5kIHNpbmNlIHRoZSBzdHJ1Y3R1cmUgaXMgc3BhcnNlLCB0aGUgb2Zmc2V0cyBhcmUgbm90IGNvbnNlY3V0aXZlLgotCi0gIEZvciBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1QeU9iamVjdCAqa2V5LCAqdmFsdWU7Ci1QeV9zc2l6ZV90IHBvcyA9IDA7Ci0KLXdoaWxlIChQeURpY3RfTmV4dChzZWxmLT5kaWN0LCAmcG9zLCAma2V5LCAmdmFsdWUpKSB7Ci0gICAgLyogZG8gc29tZXRoaW5nIGludGVyZXN0aW5nIHdpdGggdGhlIHZhbHVlcy4uLiAqLwotICAgIC4uLgotfQotXGVuZHt2ZXJiYXRpbX0KLQotICBUaGUgZGljdGlvbmFyeSBcdmFye3B9IHNob3VsZCBub3QgYmUgbXV0YXRlZCBkdXJpbmcgaXRlcmF0aW9uLiAgSXQKLSAgaXMgc2FmZSAoc2luY2UgUHl0aG9uIDIuMSkgdG8gbW9kaWZ5IHRoZSB2YWx1ZXMgb2YgdGhlIGtleXMgYXMgeW91Ci0gIGl0ZXJhdGUgb3ZlciB0aGUgZGljdGlvbmFyeSwgYnV0IG9ubHkgc28gbG9uZyBhcyB0aGUgc2V0IG9mIGtleXMKLSAgZG9lcyBub3QgY2hhbmdlLiAgRm9yIGV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLVB5T2JqZWN0ICprZXksICp2YWx1ZTsKLVB5X3NzaXplX3QgcG9zID0gMDsKLQotd2hpbGUgKFB5RGljdF9OZXh0KHNlbGYtPmRpY3QsICZwb3MsICZrZXksICZ2YWx1ZSkpIHsKLSAgICBpbnQgaSA9IFB5SW50X0FTX0xPTkcodmFsdWUpICsgMTsKLSAgICBQeU9iamVjdCAqbyA9IFB5SW50X0Zyb21Mb25nKGkpOwotICAgIGlmIChvID09IE5VTEwpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBpZiAoUHlEaWN0X1NldEl0ZW0oc2VsZi0+ZGljdCwga2V5LCBvKSA8IDApIHsKLSAgICAgICAgUHlfREVDUkVGKG8pOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIFB5X0RFQ1JFRihvKTsKLX0KLVxlbmR7dmVyYmF0aW19Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeURpY3RfTWVyZ2V9e1B5T2JqZWN0ICphLCBQeU9iamVjdCAqYiwgaW50IG92ZXJyaWRlfQotICBJdGVyYXRlIG92ZXIgbWFwcGluZyBvYmplY3QgXHZhcntifSBhZGRpbmcga2V5LXZhbHVlIHBhaXJzIHRvIGRpY3Rpb25hcnkKLSAgXHZhcnthfS4KLSAgXHZhcntifSBtYXkgYmUgYSBkaWN0aW9uYXJ5LCBvciBhbnkgb2JqZWN0IHN1cHBvcnRpbmcKLSAgXGZ1bmN0aW9ue1B5TWFwcGluZ19LZXlzKCl9IGFuZCBcZnVuY3Rpb257UHlPYmplY3RfR2V0SXRlbSgpfS4KLSAgSWYgXHZhcntvdmVycmlkZX0gaXMgdHJ1ZSwgZXhpc3RpbmcgcGFpcnMgaW4gXHZhcnthfSB3aWxsCi0gIGJlIHJlcGxhY2VkIGlmIGEgbWF0Y2hpbmcga2V5IGlzIGZvdW5kIGluIFx2YXJ7Yn0sIG90aGVyd2lzZSBwYWlycwotICB3aWxsIG9ubHkgYmUgYWRkZWQgaWYgdGhlcmUgaXMgbm90IGEgbWF0Y2hpbmcga2V5IGluIFx2YXJ7YX0uCi0gIFJldHVybiBcY29kZXswfSBvbiBzdWNjZXNzIG9yIFxjb2Rley0xfSBpZiBhbiBleGNlcHRpb24gd2FzCi0gIHJhaXNlZC4KLVx2ZXJzaW9uYWRkZWR7Mi4yfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlEaWN0X1VwZGF0ZX17UHlPYmplY3QgKmEsIFB5T2JqZWN0ICpifQotICBUaGlzIGlzIHRoZSBzYW1lIGFzIFxjb2Rle1B5RGljdF9NZXJnZShcdmFye2F9LCBcdmFye2J9LCAxKX0gaW4gQywKLSAgb3IgXGNvZGV7XHZhcnthfS51cGRhdGUoXHZhcntifSl9IGluIFB5dGhvbi4gIFJldHVybiBcY29kZXswfSBvbgotICBzdWNjZXNzIG9yIFxjb2Rley0xfSBpZiBhbiBleGNlcHRpb24gd2FzIHJhaXNlZC4KLSAgXHZlcnNpb25hZGRlZHsyLjJ9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeURpY3RfTWVyZ2VGcm9tU2VxMn17UHlPYmplY3QgKmEsIFB5T2JqZWN0ICpzZXEyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG92ZXJyaWRlfQotICBVcGRhdGUgb3IgbWVyZ2UgaW50byBkaWN0aW9uYXJ5IFx2YXJ7YX0sIGZyb20gdGhlIGtleS12YWx1ZSBwYWlycyBpbgotICBcdmFye3NlcTJ9LiAgXHZhcntzZXEyfSBtdXN0IGJlIGFuIGl0ZXJhYmxlIG9iamVjdCBwcm9kdWNpbmcKLSAgaXRlcmFibGUgb2JqZWN0cyBvZiBsZW5ndGggMiwgdmlld2VkIGFzIGtleS12YWx1ZSBwYWlycy4gIEluIGNhc2Ugb2YKLSAgZHVwbGljYXRlIGtleXMsIHRoZSBsYXN0IHdpbnMgaWYgXHZhcntvdmVycmlkZX0gaXMgdHJ1ZSwgZWxzZSB0aGUKLSAgZmlyc3Qgd2lucy4KLSAgUmV0dXJuIFxjb2RlezB9IG9uIHN1Y2Nlc3Mgb3IgXGNvZGV7LTF9IGlmIGFuIGV4Y2VwdGlvbgotICB3YXMgcmFpc2VkLgotICBFcXVpdmFsZW50IFB5dGhvbiAoZXhjZXB0IGZvciB0aGUgcmV0dXJuIHZhbHVlKToKLQotXGJlZ2lue3ZlcmJhdGltfQotZGVmIFB5RGljdF9NZXJnZUZyb21TZXEyKGEsIHNlcTIsIG92ZXJyaWRlKToKLSAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZXEyOgotICAgICAgICBpZiBvdmVycmlkZSBvciBrZXkgbm90IGluIGE6Ci0gICAgICAgICAgICBhW2tleV0gPSB2YWx1ZQotXGVuZHt2ZXJiYXRpbX0KLQotICBcdmVyc2lvbmFkZGVkezIuMn0KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxzZWN0aW9ue090aGVyIE9iamVjdHMgXGxhYmVse290aGVyT2JqZWN0c319Ci0KLVxzdWJzZWN0aW9ue0NsYXNzIE9iamVjdHMgXGxhYmVse2NsYXNzT2JqZWN0c319Ci0KLVxvYmluZGV4e2NsYXNzfQotTm90ZSB0aGF0IHRoZSBjbGFzcyBvYmplY3RzIGRlc2NyaWJlZCBoZXJlIHJlcHJlc2VudCBvbGQtc3R5bGUgY2xhc3NlcywKLXdoaWNoIHdpbGwgZ28gYXdheSBpbiBQeXRob24gMy4gV2hlbiBjcmVhdGluZyBuZXcgdHlwZXMgZm9yIGV4dGVuc2lvbgotbW9kdWxlcywgeW91IHdpbGwgd2FudCB0byB3b3JrIHdpdGggdHlwZSBvYmplY3RzIChzZWN0aW9uCi1ccmVme3R5cGVPYmplY3RzfSkuCi0KLVxiZWdpbntjdHlwZWRlc2N9e1B5Q2xhc3NPYmplY3R9Ci0gIFRoZSBDIHN0cnVjdHVyZSBvZiB0aGUgb2JqZWN0cyB1c2VkIHRvIGRlc2NyaWJlIGJ1aWx0LWluIGNsYXNzZXMuCi1cZW5ke2N0eXBlZGVzY30KLQotXGJlZ2lue2N2YXJkZXNjfXtQeU9iamVjdCp9e1B5Q2xhc3NfVHlwZX0KLSAgVGhpcyBpcyB0aGUgdHlwZSBvYmplY3QgZm9yIGNsYXNzIG9iamVjdHM7IGl0IGlzIHRoZSBzYW1lIG9iamVjdCBhcwotICBcY29kZXt0eXBlcy5DbGFzc1R5cGV9IGluIHRoZSBQeXRob24gbGF5ZXIuCi0gIFx3aXRoc3ViaXRlbXsoaW4gbW9kdWxlIHR5cGVzKX17XHR0aW5kZXh7Q2xhc3NUeXBlfX0KLVxlbmR7Y3ZhcmRlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlDbGFzc19DaGVja317UHlPYmplY3QgKm99Ci0gIFJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgXHZhcntvfSBpcyBhIGNsYXNzIG9iamVjdCwgaW5jbHVkaW5nCi0gIGluc3RhbmNlcyBvZiB0eXBlcyBkZXJpdmVkIGZyb20gdGhlIHN0YW5kYXJkIGNsYXNzIG9iamVjdC4gIFJldHVybgotICBmYWxzZSBpbiBhbGwgb3RoZXIgY2FzZXMuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeUNsYXNzX0lzU3ViY2xhc3N9e1B5T2JqZWN0ICprbGFzcywgUHlPYmplY3QgKmJhc2V9Ci0gIFJldHVybiB0cnVlIGlmIFx2YXJ7a2xhc3N9IGlzIGEgc3ViY2xhc3Mgb2YgXHZhcntiYXNlfS4gUmV0dXJuIGZhbHNlIGluCi0gIGFsbCBvdGhlciBjYXNlcy4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cc3Vic2VjdGlvbntGaWxlIE9iamVjdHMgXGxhYmVse2ZpbGVPYmplY3RzfX0KLQotXG9iaW5kZXh7ZmlsZX0KLVB5dGhvbidzIGJ1aWx0LWluIGZpbGUgb2JqZWN0cyBhcmUgaW1wbGVtZW50ZWQgZW50aXJlbHkgb24gdGhlCi1cY3R5cGV7RklMRSp9IHN1cHBvcnQgZnJvbSB0aGUgQyBzdGFuZGFyZCBsaWJyYXJ5LiAgVGhpcyBpcyBhbgotaW1wbGVtZW50YXRpb24gZGV0YWlsIGFuZCBtYXkgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlcyBvZiBQeXRob24uCi0KLVxiZWdpbntjdHlwZWRlc2N9e1B5RmlsZU9iamVjdH0KLSAgVGhpcyBzdWJ0eXBlIG9mIFxjdHlwZXtQeU9iamVjdH0gcmVwcmVzZW50cyBhIFB5dGhvbiBmaWxlIG9iamVjdC4KLVxlbmR7Y3R5cGVkZXNjfQotCi1cYmVnaW57Y3ZhcmRlc2N9e1B5VHlwZU9iamVjdH17UHlGaWxlX1R5cGV9Ci0gIFRoaXMgaW5zdGFuY2Ugb2YgXGN0eXBle1B5VHlwZU9iamVjdH0gcmVwcmVzZW50cyB0aGUgUHl0aG9uIGZpbGUKLSAgdHlwZS4gIFRoaXMgaXMgZXhwb3NlZCB0byBQeXRob24gcHJvZ3JhbXMgYXMgXGNvZGV7ZmlsZX0gYW5kCi0gIFxjb2Rle3R5cGVzLkZpbGVUeXBlfS4KLSAgXHdpdGhzdWJpdGVteyhpbiBtb2R1bGUgdHlwZXMpfXtcdHRpbmRleHtGaWxlVHlwZX19Ci1cZW5ke2N2YXJkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5RmlsZV9DaGVja317UHlPYmplY3QgKnB9Ci0gIFJldHVybiB0cnVlIGlmIGl0cyBhcmd1bWVudCBpcyBhIFxjdHlwZXtQeUZpbGVPYmplY3R9IG9yIGEgc3VidHlwZQotICBvZiBcY3R5cGV7UHlGaWxlT2JqZWN0fS4KLSAgXHZlcnNpb25jaGFuZ2VkW0FsbG93ZWQgc3VidHlwZXMgdG8gYmUgYWNjZXB0ZWRdezIuMn0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5RmlsZV9DaGVja0V4YWN0fXtQeU9iamVjdCAqcH0KLSAgUmV0dXJuIHRydWUgaWYgaXRzIGFyZ3VtZW50IGlzIGEgXGN0eXBle1B5RmlsZU9iamVjdH0sIGJ1dCBub3QgYQotICBzdWJ0eXBlIG9mIFxjdHlwZXtQeUZpbGVPYmplY3R9LgotICBcdmVyc2lvbmFkZGVkezIuMn0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5RmlsZV9Gcm9tU3RyaW5nfXtjaGFyICpmaWxlbmFtZSwgY2hhciAqbW9kZX0KLSAgT24gc3VjY2VzcywgcmV0dXJuIGEgbmV3IGZpbGUgb2JqZWN0IHRoYXQgaXMgb3BlbmVkIG9uIHRoZSBmaWxlCi0gIGdpdmVuIGJ5IFx2YXJ7ZmlsZW5hbWV9LCB3aXRoIGEgZmlsZSBtb2RlIGdpdmVuIGJ5IFx2YXJ7bW9kZX0sIHdoZXJlCi0gIFx2YXJ7bW9kZX0gaGFzIHRoZSBzYW1lIHNlbWFudGljcyBhcyB0aGUgc3RhbmRhcmQgQyByb3V0aW5lCi0gIFxjZnVuY3Rpb257Zm9wZW4oKX1cdHRpbmRleHtmb3BlbigpfS4gIE9uIGZhaWx1cmUsIHJldHVybiBcTlVMTHt9LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlGaWxlX0Zyb21GaWxlfXtGSUxFICpmcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpuYW1lLCBjaGFyICptb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKmNsb3NlKShGSUxFKil9Ci0gIENyZWF0ZSBhIG5ldyBcY3R5cGV7UHlGaWxlT2JqZWN0fSBmcm9tIHRoZSBhbHJlYWR5LW9wZW4gc3RhbmRhcmQgQwotICBmaWxlIHBvaW50ZXIsIFx2YXJ7ZnB9LiAgVGhlIGZ1bmN0aW9uIFx2YXJ7Y2xvc2V9IHdpbGwgYmUgY2FsbGVkCi0gIHdoZW4gdGhlIGZpbGUgc2hvdWxkIGJlIGNsb3NlZC4gIFJldHVybiBcTlVMTHt9IG9uIGZhaWx1cmUuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317RklMRSp9e1B5RmlsZV9Bc0ZpbGV9e1B5T2JqZWN0ICpwfQotICBSZXR1cm4gdGhlIGZpbGUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBcdmFye3B9IGFzIGEgXGN0eXBle0ZJTEUqfS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5RmlsZV9HZXRMaW5lfXtQeU9iamVjdCAqcCwgaW50IG59Ci0gIEVxdWl2YWxlbnQgdG8gXGNvZGV7XHZhcntwfS5yZWFkbGluZShcb3B0aW9uYWx7XHZhcntufX0pfSwgdGhpcwotICBmdW5jdGlvbiByZWFkcyBvbmUgbGluZSBmcm9tIHRoZSBvYmplY3QgXHZhcntwfS4gIFx2YXJ7cH0gbWF5IGJlIGEKLSAgZmlsZSBvYmplY3Qgb3IgYW55IG9iamVjdCB3aXRoIGEgXG1ldGhvZHtyZWFkbGluZSgpfSBtZXRob2QuICBJZgotICBcdmFye259IGlzIFxjb2RlezB9LCBleGFjdGx5IG9uZSBsaW5lIGlzIHJlYWQsIHJlZ2FyZGxlc3Mgb2YgdGhlCi0gIGxlbmd0aCBvZiB0aGUgbGluZS4gIElmIFx2YXJ7bn0gaXMgZ3JlYXRlciB0aGFuIFxjb2RlezB9LCBubyBtb3JlCi0gIHRoYW4gXHZhcntufSBieXRlcyB3aWxsIGJlIHJlYWQgZnJvbSB0aGUgZmlsZTsgYSBwYXJ0aWFsIGxpbmUgY2FuIGJlCi0gIHJldHVybmVkLiAgSW4gYm90aCBjYXNlcywgYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGlmIHRoZSBlbmQgb2YKLSAgdGhlIGZpbGUgaXMgcmVhY2hlZCBpbW1lZGlhdGVseS4gIElmIFx2YXJ7bn0gaXMgbGVzcyB0aGFuIFxjb2RlezB9LAotICBob3dldmVyLCBvbmUgbGluZSBpcyByZWFkIHJlZ2FyZGxlc3Mgb2YgbGVuZ3RoLCBidXQKLSAgXGV4Y2VwdGlvbntFT0ZFcnJvcn0gaXMgcmFpc2VkIGlmIHRoZSBlbmQgb2YgdGhlIGZpbGUgaXMgcmVhY2hlZAotICBpbW1lZGlhdGVseS4KLSAgXHdpdGhzdWJpdGVteyhidWlsdC1pbiBleGNlcHRpb24pfXtcdHRpbmRleHtFT0ZFcnJvcn19Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeUZpbGVfTmFtZX17UHlPYmplY3QgKnB9Ci0gIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZmlsZSBzcGVjaWZpZWQgYnkgXHZhcntwfSBhcyBhIHN0cmluZwotICBvYmplY3QuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317dm9pZH17UHlGaWxlX1NldEJ1ZlNpemV9e1B5RmlsZU9iamVjdCAqcCwgaW50IG59Ci0gIEF2YWlsYWJsZSBvbiBzeXN0ZW1zIHdpdGggXGNmdW5jdGlvbntzZXR2YnVmKCl9XHR0aW5kZXh7c2V0dmJ1ZigpfQotICBvbmx5LiAgVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZmlsZSBvYmplY3QKLSAgY3JlYXRpb24uCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeUZpbGVfRW5jb2Rpbmd9e1B5RmlsZU9iamVjdCAqcCwgY2hhciAqZW5jfQotICBTZXQgdGhlIGZpbGUncyBlbmNvZGluZyBmb3IgVW5pY29kZSBvdXRwdXQgdG8gXHZhcntlbmN9LiBSZXR1cm4KLSAgMSBvbiBzdWNjZXNzIGFuZCAwIG9uIGZhaWx1cmUuCi0gIFx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlGaWxlX1NvZnRTcGFjZX17UHlPYmplY3QgKnAsIGludCBuZXdmbGFnfQotICBUaGlzIGZ1bmN0aW9uIGV4aXN0cyBmb3IgaW50ZXJuYWwgdXNlIGJ5IHRoZSBpbnRlcnByZXRlci4gIFNldCB0aGUKLSAgXG1lbWJlcntzb2Z0c3BhY2V9IGF0dHJpYnV0ZSBvZiBcdmFye3B9IHRvIFx2YXJ7bmV3ZmxhZ30gYW5kCi0gIFx3aXRoc3ViaXRlbXsoZmlsZSBhdHRyaWJ1dGUpfXtcdHRpbmRleHtzb2Z0c3BhY2V9fXJldHVybiB0aGUKLSAgcHJldmlvdXMgdmFsdWUuICBcdmFye3B9IGRvZXMgbm90IGhhdmUgdG8gYmUgYSBmaWxlIG9iamVjdCBmb3IgdGhpcwotICBmdW5jdGlvbiB0byB3b3JrIHByb3Blcmx5OyBhbnkgb2JqZWN0IGlzIHN1cHBvcnRlZCAodGhvdWdodCBpdHMgb25seQotICBpbnRlcmVzdGluZyBpZiB0aGUgXG1lbWJlcntzb2Z0c3BhY2V9IGF0dHJpYnV0ZSBjYW4gYmUgc2V0KS4gIFRoaXMKLSAgZnVuY3Rpb24gY2xlYXJzIGFueSBlcnJvcnMsIGFuZCB3aWxsIHJldHVybiBcY29kZXswfSBhcyB0aGUgcHJldmlvdXMKLSAgdmFsdWUgaWYgdGhlIGF0dHJpYnV0ZSBlaXRoZXIgZG9lcyBub3QgZXhpc3Qgb3IgaWYgdGhlcmUgd2VyZSBlcnJvcnMKLSAgaW4gcmV0cmlldmluZyBpdC4gIFRoZXJlIGlzIG5vIHdheSB0byBkZXRlY3QgZXJyb3JzIGZyb20gdGhpcwotICBmdW5jdGlvbiwgYnV0IGRvaW5nIHNvIHNob3VsZCBub3QgYmUgbmVlZGVkLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlGaWxlX1dyaXRlT2JqZWN0fXtQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3N9Ci0gIFdyaXRlIG9iamVjdCBcdmFye29ian0gdG8gZmlsZSBvYmplY3QgXHZhcntwfS4gIFRoZSBvbmx5IHN1cHBvcnRlZAotICBmbGFnIGZvciBcdmFye2ZsYWdzfSBpcwotICBcY29uc3RhbnR7UHlfUFJJTlRfUkFXfVx0dGluZGV4e1B5X1BSSU5UX1JBV307IGlmIGdpdmVuLCB0aGUKLSAgXGZ1bmN0aW9ue3N0cigpfSBvZiB0aGUgb2JqZWN0IGlzIHdyaXR0ZW4gaW5zdGVhZCBvZiB0aGUKLSAgXGZ1bmN0aW9ue3JlcHIoKX0uICBSZXR1cm4gXGNvZGV7MH0gb24gc3VjY2VzcyBvciBcY29kZXstMX0gb24KLSAgZmFpbHVyZTsgdGhlIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbiB3aWxsIGJlIHNldC4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5RmlsZV9Xcml0ZVN0cmluZ317Y29uc3QgY2hhciAqcywgUHlPYmplY3QgKnB9Ci0gIFdyaXRlIHN0cmluZyBcdmFye3N9IHRvIGZpbGUgb2JqZWN0IFx2YXJ7cH0uICBSZXR1cm4gXGNvZGV7MH0gb24KLSAgc3VjY2VzcyBvciBcY29kZXstMX0gb24gZmFpbHVyZTsgdGhlIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbiB3aWxsIGJlCi0gIHNldC4KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxzdWJzZWN0aW9ue0luc3RhbmNlIE9iamVjdHMgXGxhYmVse2luc3RhbmNlT2JqZWN0c319Ci0KLVxvYmluZGV4e2luc3RhbmNlfQotVGhlcmUgYXJlIHZlcnkgZmV3IGZ1bmN0aW9ucyBzcGVjaWZpYyB0byBpbnN0YW5jZSBvYmplY3RzLgotCi1cYmVnaW57Y3ZhcmRlc2N9e1B5VHlwZU9iamVjdH17UHlJbnN0YW5jZV9UeXBlfQotICBUeXBlIG9iamVjdCBmb3IgY2xhc3MgaW5zdGFuY2VzLgotXGVuZHtjdmFyZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeUluc3RhbmNlX0NoZWNrfXtQeU9iamVjdCAqb2JqfQotICBSZXR1cm4gdHJ1ZSBpZiBcdmFye29ian0gaXMgYW4gaW5zdGFuY2UuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeUluc3RhbmNlX05ld317UHlPYmplY3QgKmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICprd30KLSAgQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgc3BlY2lmaWMgY2xhc3MuICBUaGUgcGFyYW1ldGVycyBcdmFye2FyZ30KLSAgYW5kIFx2YXJ7a3d9IGFyZSB1c2VkIGFzIHRoZSBwb3NpdGlvbmFsIGFuZCBrZXl3b3JkIHBhcmFtZXRlcnMgdG8KLSAgdGhlIG9iamVjdCdzIGNvbnN0cnVjdG9yLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlJbnN0YW5jZV9OZXdSYXd9e1B5T2JqZWN0ICpjbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpkaWN0fQotICBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYSBzcGVjaWZpYyBjbGFzcyB3aXRob3V0IGNhbGxpbmcgaXRzCi0gIGNvbnN0cnVjdG9yLiAgXHZhcntjbGFzc30gaXMgdGhlIGNsYXNzIG9mIG5ldyBvYmplY3QuICBUaGUKLSAgXHZhcntkaWN0fSBwYXJhbWV0ZXIgd2lsbCBiZSB1c2VkIGFzIHRoZSBvYmplY3QncyBcbWVtYmVye19fZGljdF9ffTsKLSAgaWYgXE5VTEx7fSwgYSBuZXcgZGljdGlvbmFyeSB3aWxsIGJlIGNyZWF0ZWQgZm9yIHRoZSBpbnN0YW5jZS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxzdWJzZWN0aW9ue0Z1bmN0aW9uIE9iamVjdHMgXGxhYmVse2Z1bmN0aW9uLW9iamVjdHN9fQotCi1cb2JpbmRleHtmdW5jdGlvbn0KLVRoZXJlIGFyZSBhIGZldyBmdW5jdGlvbnMgc3BlY2lmaWMgdG8gUHl0aG9uIGZ1bmN0aW9ucy4KLQotXGJlZ2lue2N0eXBlZGVzY317UHlGdW5jdGlvbk9iamVjdH0KLSAgVGhlIEMgc3RydWN0dXJlIHVzZWQgZm9yIGZ1bmN0aW9ucy4KLVxlbmR7Y3R5cGVkZXNjfQotCi1cYmVnaW57Y3ZhcmRlc2N9e1B5VHlwZU9iamVjdH17UHlGdW5jdGlvbl9UeXBlfQotICBUaGlzIGlzIGFuIGluc3RhbmNlIG9mIFxjdHlwZXtQeVR5cGVPYmplY3R9IGFuZCByZXByZXNlbnRzIHRoZQotICBQeXRob24gZnVuY3Rpb24gdHlwZS4gIEl0IGlzIGV4cG9zZWQgdG8gUHl0aG9uIHByb2dyYW1tZXJzIGFzCi0gIFxjb2Rle3R5cGVzLkZ1bmN0aW9uVHlwZX0uCi0gIFx3aXRoc3ViaXRlbXsoaW4gbW9kdWxlIHR5cGVzKX17XHR0aW5kZXh7TWV0aG9kVHlwZX19Ci1cZW5ke2N2YXJkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5RnVuY3Rpb25fQ2hlY2t9e1B5T2JqZWN0ICpvfQotICBSZXR1cm4gdHJ1ZSBpZiBcdmFye299IGlzIGEgZnVuY3Rpb24gb2JqZWN0IChoYXMgdHlwZQotICBcY2RhdGF7UHlGdW5jdGlvbl9UeXBlfSkuICBUaGUgcGFyYW1ldGVyIG11c3Qgbm90IGJlIFxOVUxMe30uCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeUZ1bmN0aW9uX05ld317UHlPYmplY3QgKmNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqZ2xvYmFsc30KLSAgUmV0dXJuIGEgbmV3IGZ1bmN0aW9uIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGNvZGUgb2JqZWN0Ci0gIFx2YXJ7Y29kZX0uIFx2YXJ7Z2xvYmFsc30gbXVzdCBiZSBhIGRpY3Rpb25hcnkgd2l0aCB0aGUgZ2xvYmFsCi0gIHZhcmlhYmxlcyBhY2Nlc3NpYmxlIHRvIHRoZSBmdW5jdGlvbi4KLQotICBUaGUgZnVuY3Rpb24ncyBkb2NzdHJpbmcsIG5hbWUgYW5kIFx2YXJ7X19tb2R1bGVfX30gYXJlIHJldHJpZXZlZAotICBmcm9tIHRoZSBjb2RlIG9iamVjdCwgdGhlIGFyZ3VtZW50IGRlZmF1bHRzIGFuZCBjbG9zdXJlIGFyZSBzZXQgdG8KLSAgXE5VTEx7fS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5RnVuY3Rpb25fR2V0Q29kZX17UHlPYmplY3QgKm9wfQotICBSZXR1cm4gdGhlIGNvZGUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZnVuY3Rpb24gb2JqZWN0IFx2YXJ7b3B9LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlGdW5jdGlvbl9HZXRHbG9iYWxzfXtQeU9iamVjdCAqb3B9Ci0gIFJldHVybiB0aGUgZ2xvYmFscyBkaWN0aW9uYXJ5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZnVuY3Rpb24gb2JqZWN0Ci0gIFx2YXJ7b3B9LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlGdW5jdGlvbl9HZXRNb2R1bGV9e1B5T2JqZWN0ICpvcH0KLSAgUmV0dXJuIHRoZSBcdmFye19fbW9kdWxlX199IGF0dHJpYnV0ZSBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0IFx2YXJ7b3B9LgotICBUaGlzIGlzIG5vcm1hbGx5IGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1vZHVsZSBuYW1lLCBidXQgY2FuIGJlIHNldAotICB0byBhbnkgb3RoZXIgb2JqZWN0IGJ5IFB5dGhvbiBjb2RlLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlGdW5jdGlvbl9HZXREZWZhdWx0c317UHlPYmplY3QgKm9wfQotICBSZXR1cm4gdGhlIGFyZ3VtZW50IGRlZmF1bHQgdmFsdWVzIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QgXHZhcntvcH0uCi0gIFRoaXMgY2FuIGJlIGEgdHVwbGUgb2YgYXJndW1lbnRzIG9yIFxOVUxMe30uCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeUZ1bmN0aW9uX1NldERlZmF1bHRzfXtQeU9iamVjdCAqb3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpkZWZhdWx0c30KLSAgU2V0IHRoZSBhcmd1bWVudCBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIGZ1bmN0aW9uIG9iamVjdCBcdmFye29wfS4KLSAgXHZhcntkZWZhdWx0c30gbXVzdCBiZSBcdmFye1B5X05vbmV9IG9yIGEgdHVwbGUuCi0KLSAgUmFpc2VzIFxleGNlcHRpb257U3lzdGVtRXJyb3J9IGFuZCByZXR1cm5zIFxjb2Rley0xfSBvbiBmYWlsdXJlLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlGdW5jdGlvbl9HZXRDbG9zdXJlfXtQeU9iamVjdCAqb3B9Ci0gIFJldHVybiB0aGUgY2xvc3VyZSBhc3NvY2lhdGVkIHdpdGggdGhlIGZ1bmN0aW9uIG9iamVjdCBcdmFye29wfS4KLSAgVGhpcyBjYW4gYmUgXE5VTEx7fSBvciBhIHR1cGxlIG9mIGNlbGwgb2JqZWN0cy4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5RnVuY3Rpb25fU2V0Q2xvc3VyZX17UHlPYmplY3QgKm9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpjbG9zdXJlfQotICBTZXQgdGhlIGNsb3N1cmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBmdW5jdGlvbiBvYmplY3QgXHZhcntvcH0uCi0gIFx2YXJ7Y2xvc3VyZX0gbXVzdCBiZSBcdmFye1B5X05vbmV9IG9yIGEgdHVwbGUgb2YgY2VsbCBvYmplY3RzLgotCi0gIFJhaXNlcyBcZXhjZXB0aW9ue1N5c3RlbUVycm9yfSBhbmQgcmV0dXJucyBcY29kZXstMX0gb24gZmFpbHVyZS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxzdWJzZWN0aW9ue01ldGhvZCBPYmplY3RzIFxsYWJlbHttZXRob2Qtb2JqZWN0c319Ci0KLVxvYmluZGV4e21ldGhvZH0KLVRoZXJlIGFyZSBzb21lIHVzZWZ1bCBmdW5jdGlvbnMgdGhhdCBhcmUgdXNlZnVsIGZvciB3b3JraW5nIHdpdGgKLW1ldGhvZCBvYmplY3RzLgotCi1cYmVnaW57Y3ZhcmRlc2N9e1B5VHlwZU9iamVjdH17UHlNZXRob2RfVHlwZX0KLSAgVGhpcyBpbnN0YW5jZSBvZiBcY3R5cGV7UHlUeXBlT2JqZWN0fSByZXByZXNlbnRzIHRoZSBQeXRob24gbWV0aG9kCi0gIHR5cGUuICBUaGlzIGlzIGV4cG9zZWQgdG8gUHl0aG9uIHByb2dyYW1zIGFzIFxjb2Rle3R5cGVzLk1ldGhvZFR5cGV9LgotICBcd2l0aHN1Yml0ZW17KGluIG1vZHVsZSB0eXBlcyl9e1x0dGluZGV4e01ldGhvZFR5cGV9fQotXGVuZHtjdmFyZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeU1ldGhvZF9DaGVja317UHlPYmplY3QgKm99Ci0gIFJldHVybiB0cnVlIGlmIFx2YXJ7b30gaXMgYSBtZXRob2Qgb2JqZWN0IChoYXMgdHlwZQotICBcY2RhdGF7UHlNZXRob2RfVHlwZX0pLiAgVGhlIHBhcmFtZXRlciBtdXN0IG5vdCBiZSBcTlVMTHt9LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlNZXRob2RfTmV3fXtQeU9iamVjdCAqZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmNsYXNzfQotICBSZXR1cm4gYSBuZXcgbWV0aG9kIG9iamVjdCwgd2l0aCBcdmFye2Z1bmN9IGJlaW5nIGFueSBjYWxsYWJsZQotICBvYmplY3Q7IHRoaXMgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgbWV0aG9kIGlzCi0gIGNhbGxlZC4gIElmIHRoaXMgbWV0aG9kIHNob3VsZCBiZSBib3VuZCB0byBhbiBpbnN0YW5jZSwgXHZhcntzZWxmfQotICBzaG91bGQgYmUgdGhlIGluc3RhbmNlIGFuZCBcdmFye2NsYXNzfSBzaG91bGQgYmUgdGhlIGNsYXNzIG9mCi0gIFx2YXJ7c2VsZn0sIG90aGVyd2lzZSBcdmFye3NlbGZ9IHNob3VsZCBiZSBcTlVMTHt9IGFuZCBcdmFye2NsYXNzfQotICBzaG91bGQgYmUgdGhlIGNsYXNzIHdoaWNoIHByb3ZpZGVzIHRoZSB1bmJvdW5kIG1ldGhvZC4uCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeU1ldGhvZF9DbGFzc317UHlPYmplY3QgKm1ldGh9Ci0gIFJldHVybiB0aGUgY2xhc3Mgb2JqZWN0IGZyb20gd2hpY2ggdGhlIG1ldGhvZCBcdmFye21ldGh9IHdhcwotICBjcmVhdGVkOyBpZiB0aGlzIHdhcyBjcmVhdGVkIGZyb20gYW4gaW5zdGFuY2UsIGl0IHdpbGwgYmUgdGhlIGNsYXNzCi0gIG9mIHRoZSBpbnN0YW5jZS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5TWV0aG9kX0dFVF9DTEFTU317UHlPYmplY3QgKm1ldGh9Ci0gIE1hY3JvIHZlcnNpb24gb2YgXGNmdW5jdGlvbntQeU1ldGhvZF9DbGFzcygpfSB3aGljaCBhdm9pZHMgZXJyb3IKLSAgY2hlY2tpbmcuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeU1ldGhvZF9GdW5jdGlvbn17UHlPYmplY3QgKm1ldGh9Ci0gIFJldHVybiB0aGUgZnVuY3Rpb24gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgbWV0aG9kIFx2YXJ7bWV0aH0uCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeU1ldGhvZF9HRVRfRlVOQ1RJT059e1B5T2JqZWN0ICptZXRofQotICBNYWNybyB2ZXJzaW9uIG9mIFxjZnVuY3Rpb257UHlNZXRob2RfRnVuY3Rpb24oKX0gd2hpY2ggYXZvaWRzIGVycm9yCi0gIGNoZWNraW5nLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlNZXRob2RfU2VsZn17UHlPYmplY3QgKm1ldGh9Ci0gIFJldHVybiB0aGUgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXRob2QgXHZhcnttZXRofSBpZiBpdCBpcwotICBib3VuZCwgb3RoZXJ3aXNlIHJldHVybiBcTlVMTHt9LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlNZXRob2RfR0VUX1NFTEZ9e1B5T2JqZWN0ICptZXRofQotICBNYWNybyB2ZXJzaW9uIG9mIFxjZnVuY3Rpb257UHlNZXRob2RfU2VsZigpfSB3aGljaCBhdm9pZHMgZXJyb3IKLSAgY2hlY2tpbmcuCi1cZW5ke2NmdW5jZGVzY30KLQotCi1cc3Vic2VjdGlvbntNb2R1bGUgT2JqZWN0cyBcbGFiZWx7bW9kdWxlT2JqZWN0c319Ci0KLVxvYmluZGV4e21vZHVsZX0KLVRoZXJlIGFyZSBvbmx5IGEgZmV3IGZ1bmN0aW9ucyBzcGVjaWFsIHRvIG1vZHVsZSBvYmplY3RzLgotCi1cYmVnaW57Y3ZhcmRlc2N9e1B5VHlwZU9iamVjdH17UHlNb2R1bGVfVHlwZX0KLSAgVGhpcyBpbnN0YW5jZSBvZiBcY3R5cGV7UHlUeXBlT2JqZWN0fSByZXByZXNlbnRzIHRoZSBQeXRob24gbW9kdWxlCi0gIHR5cGUuICBUaGlzIGlzIGV4cG9zZWQgdG8gUHl0aG9uIHByb2dyYW1zIGFzCi0gIFxjb2Rle3R5cGVzLk1vZHVsZVR5cGV9LgotICBcd2l0aHN1Yml0ZW17KGluIG1vZHVsZSB0eXBlcyl9e1x0dGluZGV4e01vZHVsZVR5cGV9fQotXGVuZHtjdmFyZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeU1vZHVsZV9DaGVja317UHlPYmplY3QgKnB9Ci0gIFJldHVybiB0cnVlIGlmIFx2YXJ7cH0gaXMgYSBtb2R1bGUgb2JqZWN0LCBvciBhIHN1YnR5cGUgb2YgYSBtb2R1bGUKLSAgb2JqZWN0LgotICBcdmVyc2lvbmNoYW5nZWRbQWxsb3dlZCBzdWJ0eXBlcyB0byBiZSBhY2NlcHRlZF17Mi4yfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlNb2R1bGVfQ2hlY2tFeGFjdH17UHlPYmplY3QgKnB9Ci0gIFJldHVybiB0cnVlIGlmIFx2YXJ7cH0gaXMgYSBtb2R1bGUgb2JqZWN0LCBidXQgbm90IGEgc3VidHlwZSBvZgotICBcY2RhdGF7UHlNb2R1bGVfVHlwZX0uCi0gIFx2ZXJzaW9uYWRkZWR7Mi4yfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlNb2R1bGVfTmV3fXtjb25zdCBjaGFyICpuYW1lfQotICBSZXR1cm4gYSBuZXcgbW9kdWxlIG9iamVjdCB3aXRoIHRoZSBcbWVtYmVye19fbmFtZV9ffSBhdHRyaWJ1dGUgc2V0Ci0gIHRvIFx2YXJ7bmFtZX0uICBPbmx5IHRoZSBtb2R1bGUncyBcbWVtYmVye19fZG9jX199IGFuZAotICBcbWVtYmVye19fbmFtZV9ffSBhdHRyaWJ1dGVzIGFyZSBmaWxsZWQgaW47IHRoZSBjYWxsZXIgaXMKLSAgcmVzcG9uc2libGUgZm9yIHByb3ZpZGluZyBhIFxtZW1iZXJ7X19maWxlX199IGF0dHJpYnV0ZS4KLSAgXHdpdGhzdWJpdGVteyhtb2R1bGUgYXR0cmlidXRlKX17Ci0gICAgXHR0aW5kZXh7X19uYW1lX199XHR0aW5kZXh7X19kb2NfX31cdHRpbmRleHtfX2ZpbGVfX319Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeU1vZHVsZV9HZXREaWN0fXtQeU9iamVjdCAqbW9kdWxlfQotICBSZXR1cm4gdGhlIGRpY3Rpb25hcnkgb2JqZWN0IHRoYXQgaW1wbGVtZW50cyBcdmFye21vZHVsZX0ncwotICBuYW1lc3BhY2U7IHRoaXMgb2JqZWN0IGlzIHRoZSBzYW1lIGFzIHRoZSBcbWVtYmVye19fZGljdF9ffQotICBhdHRyaWJ1dGUgb2YgdGhlIG1vZHVsZSBvYmplY3QuICBUaGlzIGZ1bmN0aW9uIG5ldmVyIGZhaWxzLgotICBcd2l0aHN1Yml0ZW17KG1vZHVsZSBhdHRyaWJ1dGUpfXtcdHRpbmRleHtfX2RpY3RfX319Ci0gIEl0IGlzIHJlY29tbWVuZGVkIGV4dGVuc2lvbnMgdXNlIG90aGVyIFxjZnVuY3Rpb257UHlNb2R1bGVfKigpfQotICBhbmQgXGNmdW5jdGlvbntQeU9iamVjdF8qKCl9IGZ1bmN0aW9ucyByYXRoZXIgdGhhbiBkaXJlY3RseQotICBtYW5pcHVsYXRlIGEgbW9kdWxlJ3MgXG1lbWJlcntfX2RpY3RfX30uCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317Y2hhcip9e1B5TW9kdWxlX0dldE5hbWV9e1B5T2JqZWN0ICptb2R1bGV9Ci0gIFJldHVybiBcdmFye21vZHVsZX0ncyBcbWVtYmVye19fbmFtZV9ffSB2YWx1ZS4gIElmIHRoZSBtb2R1bGUgZG9lcwotICBub3QgcHJvdmlkZSBvbmUsIG9yIGlmIGl0IGlzIG5vdCBhIHN0cmluZywgXGV4Y2VwdGlvbntTeXN0ZW1FcnJvcn0KLSAgaXMgcmFpc2VkIGFuZCBcTlVMTHt9IGlzIHJldHVybmVkLgotICBcd2l0aHN1Yml0ZW17KG1vZHVsZSBhdHRyaWJ1dGUpfXtcdHRpbmRleHtfX25hbWVfX319Ci0gIFx3aXRoc3ViaXRlbXsoYnVpbHQtaW4gZXhjZXB0aW9uKX17XHR0aW5kZXh7U3lzdGVtRXJyb3J9fQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2NoYXIqfXtQeU1vZHVsZV9HZXRGaWxlbmFtZX17UHlPYmplY3QgKm1vZHVsZX0KLSAgUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGZyb20gd2hpY2ggXHZhcnttb2R1bGV9IHdhcyBsb2FkZWQgdXNpbmcKLSAgXHZhcnttb2R1bGV9J3MgXG1lbWJlcntfX2ZpbGVfX30gYXR0cmlidXRlLiAgSWYgdGhpcyBpcyBub3QgZGVmaW5lZCwKLSAgb3IgaWYgaXQgaXMgbm90IGEgc3RyaW5nLCByYWlzZSBcZXhjZXB0aW9ue1N5c3RlbUVycm9yfSBhbmQgcmV0dXJuCi0gIFxOVUxMe30uCi0gIFx3aXRoc3ViaXRlbXsobW9kdWxlIGF0dHJpYnV0ZSl9e1x0dGluZGV4e19fZmlsZV9ffX0KLSAgXHdpdGhzdWJpdGVteyhidWlsdC1pbiBleGNlcHRpb24pfXtcdHRpbmRleHtTeXN0ZW1FcnJvcn19Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeU1vZHVsZV9BZGRPYmplY3R9e1B5T2JqZWN0ICptb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgUHlPYmplY3QgKnZhbHVlfQotICBBZGQgYW4gb2JqZWN0IHRvIFx2YXJ7bW9kdWxlfSBhcyBcdmFye25hbWV9LiAgVGhpcyBpcyBhIGNvbnZlbmllbmNlCi0gIGZ1bmN0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIGZyb20gdGhlIG1vZHVsZSdzIGluaXRpYWxpemF0aW9uCi0gIGZ1bmN0aW9uLiAgVGhpcyBzdGVhbHMgYSByZWZlcmVuY2UgdG8gXHZhcnt2YWx1ZX0uICBSZXR1cm4KLSAgXGNvZGV7LTF9IG9uIGVycm9yLCBcY29kZXswfSBvbiBzdWNjZXNzLgotICBcdmVyc2lvbmFkZGVkezIuMH0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5TW9kdWxlX0FkZEludENvbnN0YW50fXtQeU9iamVjdCAqbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgbG9uZyB2YWx1ZX0KLSAgQWRkIGFuIGludGVnZXIgY29uc3RhbnQgdG8gXHZhcnttb2R1bGV9IGFzIFx2YXJ7bmFtZX0uICBUaGlzCi0gIGNvbnZlbmllbmNlIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZyb20gdGhlIG1vZHVsZSdzIGluaXRpYWxpemF0aW9uCi0gIGZ1bmN0aW9uLiBSZXR1cm4gXGNvZGV7LTF9IG9uIGVycm9yLCBcY29kZXswfSBvbiBzdWNjZXNzLgotICBcdmVyc2lvbmFkZGVkezIuMH0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50fXtQeU9iamVjdCAqbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWV9Ci0gIEFkZCBhIHN0cmluZyBjb25zdGFudCB0byBcdmFye21vZHVsZX0gYXMgXHZhcntuYW1lfS4gIFRoaXMKLSAgY29udmVuaWVuY2UgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZnJvbSB0aGUgbW9kdWxlJ3MgaW5pdGlhbGl6YXRpb24KLSAgZnVuY3Rpb24uICBUaGUgc3RyaW5nIFx2YXJ7dmFsdWV9IG11c3QgYmUgbnVsbC10ZXJtaW5hdGVkLiAgUmV0dXJuCi0gIFxjb2Rley0xfSBvbiBlcnJvciwgXGNvZGV7MH0gb24gc3VjY2Vzcy4KLSAgXHZlcnNpb25hZGRlZHsyLjB9Ci1cZW5ke2NmdW5jZGVzY30KLQotCi1cc3Vic2VjdGlvbntJdGVyYXRvciBPYmplY3RzIFxsYWJlbHtpdGVyYXRvci1vYmplY3RzfX0KLQotUHl0aG9uIHByb3ZpZGVzIHR3byBnZW5lcmFsLXB1cnBvc2UgaXRlcmF0b3Igb2JqZWN0cy4gIFRoZSBmaXJzdCwgYQotc2VxdWVuY2UgaXRlcmF0b3IsIHdvcmtzIHdpdGggYW4gYXJiaXRyYXJ5IHNlcXVlbmNlIHN1cHBvcnRpbmcgdGhlCi1cbWV0aG9ke19fZ2V0aXRlbV9fKCl9IG1ldGhvZC4gIFRoZSBzZWNvbmQgd29ya3Mgd2l0aCBhIGNhbGxhYmxlCi1vYmplY3QgYW5kIGEgc2VudGluZWwgdmFsdWUsIGNhbGxpbmcgdGhlIGNhbGxhYmxlIGZvciBlYWNoIGl0ZW0gaW4gdGhlCi1zZXF1ZW5jZSwgYW5kIGVuZGluZyB0aGUgaXRlcmF0aW9uIHdoZW4gdGhlIHNlbnRpbmVsIHZhbHVlIGlzCi1yZXR1cm5lZC4KLQotXGJlZ2lue2N2YXJkZXNjfXtQeVR5cGVPYmplY3R9e1B5U2VxSXRlcl9UeXBlfQotICBUeXBlIG9iamVjdCBmb3IgaXRlcmF0b3Igb2JqZWN0cyByZXR1cm5lZCBieQotICBcY2Z1bmN0aW9ue1B5U2VxSXRlcl9OZXcoKX0gYW5kIHRoZSBvbmUtYXJndW1lbnQgZm9ybSBvZiB0aGUKLSAgXGZ1bmN0aW9ue2l0ZXIoKX0gYnVpbHQtaW4gZnVuY3Rpb24gZm9yIGJ1aWx0LWluIHNlcXVlbmNlIHR5cGVzLgotICBcdmVyc2lvbmFkZGVkezIuMn0KLVxlbmR7Y3ZhcmRlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlTZXFJdGVyX0NoZWNrfXtvcH0KLSAgUmV0dXJuIHRydWUgaWYgdGhlIHR5cGUgb2YgXHZhcntvcH0gaXMgXGNkYXRhe1B5U2VxSXRlcl9UeXBlfS4KLSAgXHZlcnNpb25hZGRlZHsyLjJ9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeVNlcUl0ZXJfTmV3fXtQeU9iamVjdCAqc2VxfQotICBSZXR1cm4gYW4gaXRlcmF0b3IgdGhhdCB3b3JrcyB3aXRoIGEgZ2VuZXJhbCBzZXF1ZW5jZSBvYmplY3QsCi0gIFx2YXJ7c2VxfS4gIFRoZSBpdGVyYXRpb24gZW5kcyB3aGVuIHRoZSBzZXF1ZW5jZSByYWlzZXMKLSAgXGV4Y2VwdGlvbntJbmRleEVycm9yfSBmb3IgdGhlIHN1YnNjcmlwdGluZyBvcGVyYXRpb24uCi0gIFx2ZXJzaW9uYWRkZWR7Mi4yfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjdmFyZGVzY317UHlUeXBlT2JqZWN0fXtQeUNhbGxJdGVyX1R5cGV9Ci0gIFR5cGUgb2JqZWN0IGZvciBpdGVyYXRvciBvYmplY3RzIHJldHVybmVkIGJ5Ci0gIFxjZnVuY3Rpb257UHlDYWxsSXRlcl9OZXcoKX0gYW5kIHRoZSB0d28tYXJndW1lbnQgZm9ybSBvZiB0aGUKLSAgXGZ1bmN0aW9ue2l0ZXIoKX0gYnVpbHQtaW4gZnVuY3Rpb24uCi0gIFx2ZXJzaW9uYWRkZWR7Mi4yfQotXGVuZHtjdmFyZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeUNhbGxJdGVyX0NoZWNrfXtvcH0KLSAgUmV0dXJuIHRydWUgaWYgdGhlIHR5cGUgb2YgXHZhcntvcH0gaXMgXGNkYXRhe1B5Q2FsbEl0ZXJfVHlwZX0uCi0gIFx2ZXJzaW9uYWRkZWR7Mi4yfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlDYWxsSXRlcl9OZXd9e1B5T2JqZWN0ICpjYWxsYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpzZW50aW5lbH0KLSAgUmV0dXJuIGEgbmV3IGl0ZXJhdG9yLiAgVGhlIGZpcnN0IHBhcmFtZXRlciwgXHZhcntjYWxsYWJsZX0sIGNhbiBiZQotICBhbnkgUHl0aG9uIGNhbGxhYmxlIG9iamVjdCB0aGF0IGNhbiBiZSBjYWxsZWQgd2l0aCBubyBwYXJhbWV0ZXJzOwotICBlYWNoIGNhbGwgdG8gaXQgc2hvdWxkIHJldHVybiB0aGUgbmV4dCBpdGVtIGluIHRoZSBpdGVyYXRpb24uICBXaGVuCi0gIFx2YXJ7Y2FsbGFibGV9IHJldHVybnMgYSB2YWx1ZSBlcXVhbCB0byBcdmFye3NlbnRpbmVsfSwgdGhlCi0gIGl0ZXJhdGlvbiB3aWxsIGJlIHRlcm1pbmF0ZWQuCi0gIFx2ZXJzaW9uYWRkZWR7Mi4yfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLQotXHN1YnNlY3Rpb257RGVzY3JpcHRvciBPYmplY3RzIFxsYWJlbHtkZXNjcmlwdG9yLW9iamVjdHN9fQotCi1gYERlc2NyaXB0b3JzJycgYXJlIG9iamVjdHMgdGhhdCBkZXNjcmliZSBzb21lIGF0dHJpYnV0ZSBvZiBhbiBvYmplY3QuCi1UaGV5IGFyZSBmb3VuZCBpbiB0aGUgZGljdGlvbmFyeSBvZiB0eXBlIG9iamVjdHMuCi0KLVxiZWdpbntjdmFyZGVzY317UHlUeXBlT2JqZWN0fXtQeVByb3BlcnR5X1R5cGV9Ci0gIFRoZSB0eXBlIG9iamVjdCBmb3IgdGhlIGJ1aWx0LWluIGRlc2NyaXB0b3IgdHlwZXMuCi0gIFx2ZXJzaW9uYWRkZWR7Mi4yfQotXGVuZHtjdmFyZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeURlc2NyX05ld0dldFNldH17UHlUeXBlT2JqZWN0ICp0eXBlLAotCQkJCQkgICAgICAgIHN0cnVjdCBQeUdldFNldERlZiAqZ2V0c2V0fQotICBcdmVyc2lvbmFkZGVkezIuMn0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5RGVzY3JfTmV3TWVtYmVyfXtQeVR5cGVPYmplY3QgKnR5cGUsCi0JCQkJCSAgICAgICAgc3RydWN0IFB5TWVtYmVyRGVmICptZXRofQotICBcdmVyc2lvbmFkZGVkezIuMn0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5RGVzY3JfTmV3TWV0aG9kfXtQeVR5cGVPYmplY3QgKnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgUHlNZXRob2REZWYgKm1ldGh9Ci0gIFx2ZXJzaW9uYWRkZWR7Mi4yfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlEZXNjcl9OZXdXcmFwcGVyfXtQeVR5cGVPYmplY3QgKnR5cGUsCi0JCQkJCQkgc3RydWN0IHdyYXBwZXJiYXNlICp3cmFwcGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKndyYXBwZWR9Ci0gIFx2ZXJzaW9uYWRkZWR7Mi4yfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlEZXNjcl9OZXdDbGFzc01ldGhvZH17UHlUeXBlT2JqZWN0ICp0eXBlLAotCQkJCQkJICAgICBQeU1ldGhvZERlZiAqbWV0aG9kfQotICBcdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5RGVzY3JfSXNEYXRhfXtQeU9iamVjdCAqZGVzY3J9Ci0gIFJldHVybiB0cnVlIGlmIHRoZSBkZXNjcmlwdG9yIG9iamVjdHMgXHZhcntkZXNjcn0gZGVzY3JpYmVzIGEgZGF0YQotICBhdHRyaWJ1dGUsIG9yIGZhbHNlIGlmIGl0IGRlc2NyaWJlcyBhIG1ldGhvZC4gIFx2YXJ7ZGVzY3J9IG11c3QgYmUgYQotICBkZXNjcmlwdG9yIG9iamVjdDsgdGhlcmUgaXMgbm8gZXJyb3IgY2hlY2tpbmcuCi0gIFx2ZXJzaW9uYWRkZWR7Mi4yfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlXcmFwcGVyX05ld317UHlPYmplY3QgKiwgUHlPYmplY3QgKn0KLSAgXHZlcnNpb25hZGRlZHsyLjJ9Ci1cZW5ke2NmdW5jZGVzY30KLQotCi1cc3Vic2VjdGlvbntTbGljZSBPYmplY3RzIFxsYWJlbHtzbGljZS1vYmplY3RzfX0KLQotXGJlZ2lue2N2YXJkZXNjfXtQeVR5cGVPYmplY3R9e1B5U2xpY2VfVHlwZX0KLSAgVGhlIHR5cGUgb2JqZWN0IGZvciBzbGljZSBvYmplY3RzLiAgVGhpcyBpcyB0aGUgc2FtZSBhcwotICBcY29kZXtzbGljZX0gYW5kIFxjb2Rle3R5cGVzLlNsaWNlVHlwZX0uCi0gIFx3aXRoc3ViaXRlbXsoaW4gbW9kdWxlIHR5cGVzKX17XHR0aW5kZXh7U2xpY2VUeXBlfX0KLVxlbmR7Y3ZhcmRlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlTbGljZV9DaGVja317UHlPYmplY3QgKm9ifQotICBSZXR1cm4gdHJ1ZSBpZiBcdmFye29ifSBpcyBhIHNsaWNlIG9iamVjdDsgXHZhcntvYn0gbXVzdCBub3QgYmUKLSAgXE5VTEx7fS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5U2xpY2VfTmV3fXtQeU9iamVjdCAqc3RhcnQsIFB5T2JqZWN0ICpzdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnN0ZXB9Ci0gIFJldHVybiBhIG5ldyBzbGljZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzLiAgVGhlIFx2YXJ7c3RhcnR9LAotICBcdmFye3N0b3B9LCBhbmQgXHZhcntzdGVwfSBwYXJhbWV0ZXJzIGFyZSB1c2VkIGFzIHRoZSB2YWx1ZXMgb2YgdGhlCi0gIHNsaWNlIG9iamVjdCBhdHRyaWJ1dGVzIG9mIHRoZSBzYW1lIG5hbWVzLiAgQW55IG9mIHRoZSB2YWx1ZXMgbWF5IGJlCi0gIFxOVUxMe30sIGluIHdoaWNoIGNhc2UgdGhlIFxjb2Rle05vbmV9IHdpbGwgYmUgdXNlZCBmb3IgdGhlCi0gIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlLiAgUmV0dXJuIFxOVUxMe30gaWYgdGhlIG5ldyBvYmplY3QgY291bGQKLSAgbm90IGJlIGFsbG9jYXRlZC4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5U2xpY2VfR2V0SW5kaWNlc317UHlTbGljZU9iamVjdCAqc2xpY2UsIFB5X3NzaXplX3QgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKnN0YXJ0LCBQeV9zc2l6ZV90ICpzdG9wLCBQeV9zc2l6ZV90ICpzdGVwfQotUmV0cmlldmUgdGhlIHN0YXJ0LCBzdG9wIGFuZCBzdGVwIGluZGljZXMgZnJvbSB0aGUgc2xpY2Ugb2JqZWN0Ci1cdmFye3NsaWNlfSwgYXNzdW1pbmcgYSBzZXF1ZW5jZSBvZiBsZW5ndGggXHZhcntsZW5ndGh9LiBUcmVhdHMKLWluZGljZXMgZ3JlYXRlciB0aGFuIFx2YXJ7bGVuZ3RofSBhcyBlcnJvcnMuCi0KLVJldHVybnMgMCBvbiBzdWNjZXNzIGFuZCAtMSBvbiBlcnJvciB3aXRoIG5vIGV4Y2VwdGlvbiBzZXQgKHVubGVzcyBvbmUKLW9mIHRoZSBpbmRpY2VzIHdhcyBub3QgXGNvbnN0YW50e05vbmV9IGFuZCBmYWlsZWQgdG8gYmUgY29udmVydGVkIHRvCi1hbiBpbnRlZ2VyLCBpbiB3aGljaCBjYXNlIC0xIGlzIHJldHVybmVkIHdpdGggYW4gZXhjZXB0aW9uIHNldCkuCi0KLVlvdSBwcm9iYWJseSBkbyBub3Qgd2FudCB0byB1c2UgdGhpcyBmdW5jdGlvbi4gIElmIHlvdSB3YW50IHRvIHVzZQotc2xpY2Ugb2JqZWN0cyBpbiB2ZXJzaW9ucyBvZiBQeXRob24gcHJpb3IgdG8gMi4zLCB5b3Ugd291bGQgcHJvYmFibHkKLWRvIHdlbGwgdG8gaW5jb3Jwb3JhdGUgdGhlIHNvdXJjZSBvZiBcY2Z1bmN0aW9ue1B5U2xpY2VfR2V0SW5kaWNlc0V4fSwKLXN1aXRhYmx5IHJlbmFtZWQsIGluIHRoZSBzb3VyY2Ugb2YgeW91ciBleHRlbnNpb24uCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeVNsaWNlX0dldEluZGljZXNFeH17UHlTbGljZU9iamVjdCAqc2xpY2UsIFB5X3NzaXplX3QgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqc3RhcnQsIFB5X3NzaXplX3QgKnN0b3AsIFB5X3NzaXplX3QgKnN0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90ICpzbGljZWxlbmd0aH0KLVVzYWJsZSByZXBsYWNlbWVudCBmb3IgXGNmdW5jdGlvbntQeVNsaWNlX0dldEluZGljZXN9LiAgUmV0cmlldmUgdGhlCi1zdGFydCwgc3RvcCwgYW5kIHN0ZXAgaW5kaWNlcyBmcm9tIHRoZSBzbGljZSBvYmplY3QgXHZhcntzbGljZX0KLWFzc3VtaW5nIGEgc2VxdWVuY2Ugb2YgbGVuZ3RoIFx2YXJ7bGVuZ3RofSwgYW5kIHN0b3JlIHRoZSBsZW5ndGggb2YKLXRoZSBzbGljZSBpbiBcdmFye3NsaWNlbGVuZ3RofS4gIE91dCBvZiBib3VuZHMgaW5kaWNlcyBhcmUgY2xpcHBlZCBpbgotYSBtYW5uZXIgY29uc2lzdGVudCB3aXRoIHRoZSBoYW5kbGluZyBvZiBub3JtYWwgc2xpY2VzLgotCi1SZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgLTEgb24gZXJyb3Igd2l0aCBleGNlcHRpb24gc2V0LgotCi1cdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxzdWJzZWN0aW9ue1dlYWsgUmVmZXJlbmNlIE9iamVjdHMgXGxhYmVse3dlYWtyZWYtb2JqZWN0c319Ci0KLVB5dGhvbiBzdXBwb3J0cyBcZW1waHt3ZWFrIHJlZmVyZW5jZXN9IGFzIGZpcnN0LWNsYXNzIG9iamVjdHMuICBUaGVyZQotYXJlIHR3byBzcGVjaWZpYyBvYmplY3QgdHlwZXMgd2hpY2ggZGlyZWN0bHkgaW1wbGVtZW50IHdlYWsKLXJlZmVyZW5jZXMuICBUaGUgZmlyc3QgaXMgYSBzaW1wbGUgcmVmZXJlbmNlIG9iamVjdCwgYW5kIHRoZSBzZWNvbmQKLWFjdHMgYXMgYSBwcm94eSBmb3IgdGhlIG9yaWdpbmFsIG9iamVjdCBhcyBtdWNoIGFzIGl0IGNhbi4KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeVdlYWtyZWZfQ2hlY2t9e29ifQotICBSZXR1cm4gdHJ1ZSBpZiBcdmFye29ifSBpcyBlaXRoZXIgYSByZWZlcmVuY2Ugb3IgcHJveHkgb2JqZWN0LgotICBcdmVyc2lvbmFkZGVkezIuMn0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5V2Vha3JlZl9DaGVja1JlZn17b2J9Ci0gIFJldHVybiB0cnVlIGlmIFx2YXJ7b2J9IGlzIGEgcmVmZXJlbmNlIG9iamVjdC4KLSAgXHZlcnNpb25hZGRlZHsyLjJ9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeVdlYWtyZWZfQ2hlY2tQcm94eX17b2J9Ci0gIFJldHVybiB0cnVlIGlmIFx2YXJ7b2J9IGlzIGEgcHJveHkgb2JqZWN0LgotICBcdmVyc2lvbmFkZGVkezIuMn0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5V2Vha3JlZl9OZXdSZWZ9e1B5T2JqZWN0ICpvYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmNhbGxiYWNrfQotICBSZXR1cm4gYSB3ZWFrIHJlZmVyZW5jZSBvYmplY3QgZm9yIHRoZSBvYmplY3QgXHZhcntvYn0uICBUaGlzIHdpbGwKLSAgYWx3YXlzIHJldHVybiBhIG5ldyByZWZlcmVuY2UsIGJ1dCBpcyBub3QgZ3VhcmFudGVlZCB0byBjcmVhdGUgYSBuZXcKLSAgb2JqZWN0OyBhbiBleGlzdGluZyByZWZlcmVuY2Ugb2JqZWN0IG1heSBiZSByZXR1cm5lZC4gIFRoZSBzZWNvbmQKLSAgcGFyYW1ldGVyLCBcdmFye2NhbGxiYWNrfSwgY2FuIGJlIGEgY2FsbGFibGUgb2JqZWN0IHRoYXQgcmVjZWl2ZXMKLSAgbm90aWZpY2F0aW9uIHdoZW4gXHZhcntvYn0gaXMgZ2FyYmFnZSBjb2xsZWN0ZWQ7IGl0IHNob3VsZCBhY2NlcHQgYQotICBzaW5nbGUgcGFyYW1ldGVyLCB3aGljaCB3aWxsIGJlIHRoZSB3ZWFrIHJlZmVyZW5jZSBvYmplY3QgaXRzZWxmLgotICBcdmFye2NhbGxiYWNrfSBtYXkgYWxzbyBiZSBcY29kZXtOb25lfSBvciBcTlVMTHt9LiAgSWYgXHZhcntvYn0KLSAgaXMgbm90IGEgd2Vha2x5LXJlZmVyZW5jYWJsZSBvYmplY3QsIG9yIGlmIFx2YXJ7Y2FsbGJhY2t9IGlzIG5vdAotICBjYWxsYWJsZSwgXGNvZGV7Tm9uZX0sIG9yIFxOVUxMe30sIHRoaXMgd2lsbCByZXR1cm4gXE5VTEx7fSBhbmQKLSAgcmFpc2UgXGV4Y2VwdGlvbntUeXBlRXJyb3J9LgotICBcdmVyc2lvbmFkZGVkezIuMn0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5V2Vha3JlZl9OZXdQcm94eX17UHlPYmplY3QgKm9iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpjYWxsYmFja30KLSAgUmV0dXJuIGEgd2VhayByZWZlcmVuY2UgcHJveHkgb2JqZWN0IGZvciB0aGUgb2JqZWN0IFx2YXJ7b2J9LiAgVGhpcwotICB3aWxsIGFsd2F5cyByZXR1cm4gYSBuZXcgcmVmZXJlbmNlLCBidXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gY3JlYXRlCi0gIGEgbmV3IG9iamVjdDsgYW4gZXhpc3RpbmcgcHJveHkgb2JqZWN0IG1heSBiZSByZXR1cm5lZC4gIFRoZSBzZWNvbmQKLSAgcGFyYW1ldGVyLCBcdmFye2NhbGxiYWNrfSwgY2FuIGJlIGEgY2FsbGFibGUgb2JqZWN0IHRoYXQgcmVjZWl2ZXMKLSAgbm90aWZpY2F0aW9uIHdoZW4gXHZhcntvYn0gaXMgZ2FyYmFnZSBjb2xsZWN0ZWQ7IGl0IHNob3VsZCBhY2NlcHQgYQotICBzaW5nbGUgcGFyYW1ldGVyLCB3aGljaCB3aWxsIGJlIHRoZSB3ZWFrIHJlZmVyZW5jZSBvYmplY3QgaXRzZWxmLgotICBcdmFye2NhbGxiYWNrfSBtYXkgYWxzbyBiZSBcY29kZXtOb25lfSBvciBcTlVMTHt9LiAgSWYgXHZhcntvYn0gaXMgbm90Ci0gIGEgd2Vha2x5LXJlZmVyZW5jYWJsZSBvYmplY3QsIG9yIGlmIFx2YXJ7Y2FsbGJhY2t9IGlzIG5vdCBjYWxsYWJsZSwKLSAgXGNvZGV7Tm9uZX0sIG9yIFxOVUxMe30sIHRoaXMgd2lsbCByZXR1cm4gXE5VTEx7fSBhbmQgcmFpc2UKLSAgXGV4Y2VwdGlvbntUeXBlRXJyb3J9LgotICBcdmVyc2lvbmFkZGVkezIuMn0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5V2Vha3JlZl9HZXRPYmplY3R9e1B5T2JqZWN0ICpyZWZ9Ci0gIFJldHVybiB0aGUgcmVmZXJlbmNlZCBvYmplY3QgZnJvbSBhIHdlYWsgcmVmZXJlbmNlLCBcdmFye3JlZn0uICBJZgotICB0aGUgcmVmZXJlbnQgaXMgbm8gbG9uZ2VyIGxpdmUsIHJldHVybnMgXGNvZGV7Tm9uZX0uCi0gIFx2ZXJzaW9uYWRkZWR7Mi4yfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlXZWFrcmVmX0dFVF9PQkpFQ1R9e1B5T2JqZWN0ICpyZWZ9Ci0gIFNpbWlsYXIgdG8gXGNmdW5jdGlvbntQeVdlYWtyZWZfR2V0T2JqZWN0KCl9LCBidXQgaW1wbGVtZW50ZWQgYXMgYQotICBtYWNybyB0aGF0IGRvZXMgbm8gZXJyb3IgY2hlY2tpbmcuCi0gIFx2ZXJzaW9uYWRkZWR7Mi4yfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLQotXHN1YnNlY3Rpb257Q09iamVjdHMgXGxhYmVse2NPYmplY3RzfX0KLQotXG9iaW5kZXh7Q09iamVjdH0KLVJlZmVyIHRvIFxlbXBoe0V4dGVuZGluZyBhbmQgRW1iZWRkaW5nIHRoZSBQeXRob24gSW50ZXJwcmV0ZXJ9LAotc2VjdGlvbn4xLjEyLCBgYFByb3ZpZGluZyBhIEMgQVBJIGZvciBhbiBFeHRlbnNpb24gTW9kdWxlLCcnIGZvciBtb3JlCi1pbmZvcm1hdGlvbiBvbiB1c2luZyB0aGVzZSBvYmplY3RzLgotCi0KLVxiZWdpbntjdHlwZWRlc2N9e1B5Q09iamVjdH0KLSAgVGhpcyBzdWJ0eXBlIG9mIFxjdHlwZXtQeU9iamVjdH0gcmVwcmVzZW50cyBhbiBvcGFxdWUgdmFsdWUsIHVzZWZ1bAotICBmb3IgQyBleHRlbnNpb24gbW9kdWxlcyB3aG8gbmVlZCB0byBwYXNzIGFuIG9wYXF1ZSB2YWx1ZSAoYXMgYQotICBcY3R5cGV7dm9pZCp9IHBvaW50ZXIpIHRocm91Z2ggUHl0aG9uIGNvZGUgdG8gb3RoZXIgQyBjb2RlLiAgSXQgaXMKLSAgb2Z0ZW4gdXNlZCB0byBtYWtlIGEgQyBmdW5jdGlvbiBwb2ludGVyIGRlZmluZWQgaW4gb25lIG1vZHVsZQotICBhdmFpbGFibGUgdG8gb3RoZXIgbW9kdWxlcywgc28gdGhlIHJlZ3VsYXIgaW1wb3J0IG1lY2hhbmlzbSBjYW4gYmUKLSAgdXNlZCB0byBhY2Nlc3MgQyBBUElzIGRlZmluZWQgaW4gZHluYW1pY2FsbHkgbG9hZGVkIG1vZHVsZXMuCi1cZW5ke2N0eXBlZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeUNPYmplY3RfQ2hlY2t9e1B5T2JqZWN0ICpwfQotICBSZXR1cm4gdHJ1ZSBpZiBpdHMgYXJndW1lbnQgaXMgYSBcY3R5cGV7UHlDT2JqZWN0fS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5Q09iamVjdF9Gcm9tVm9pZFB0cn17dm9pZCogY29iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZGVzdHIpKHZvaWQgKil9Ci0gIENyZWF0ZSBhIFxjdHlwZXtQeUNPYmplY3R9IGZyb20gdGhlIFxjb2Rle3ZvaWQgKn1cdmFye2NvYmp9LiAgVGhlCi0gIFx2YXJ7ZGVzdHJ9IGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIG9iamVjdCBpcyByZWNsYWltZWQsCi0gIHVubGVzcyBpdCBpcyBcTlVMTHt9LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlDT2JqZWN0X0Zyb21Wb2lkUHRyQW5kRGVzY317dm9pZCogY29iaiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGRlc2MsIHZvaWQgKCpkZXN0cikodm9pZCAqLCB2b2lkICopfQotICBDcmVhdGUgYSBcY3R5cGV7UHlDT2JqZWN0fSBmcm9tIHRoZSBcY3R5cGV7dm9pZCAqfVx2YXJ7Y29ian0uICBUaGUKLSAgXHZhcntkZXN0cn0gZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgb2JqZWN0IGlzIHJlY2xhaW1lZC4KLSAgVGhlIFx2YXJ7ZGVzY30gYXJndW1lbnQgY2FuIGJlIHVzZWQgdG8gcGFzcyBleHRyYSBjYWxsYmFjayBkYXRhIGZvcgotICB0aGUgZGVzdHJ1Y3RvciBmdW5jdGlvbi4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXt2b2lkKn17UHlDT2JqZWN0X0FzVm9pZFB0cn17UHlPYmplY3QqIHNlbGZ9Ci0gIFJldHVybiB0aGUgb2JqZWN0IFxjdHlwZXt2b2lkICp9IHRoYXQgdGhlIFxjdHlwZXtQeUNPYmplY3R9Ci0gIFx2YXJ7c2VsZn0gd2FzIGNyZWF0ZWQgd2l0aC4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXt2b2lkKn17UHlDT2JqZWN0X0dldERlc2N9e1B5T2JqZWN0KiBzZWxmfQotICBSZXR1cm4gdGhlIGRlc2NyaXB0aW9uIFxjdHlwZXt2b2lkICp9IHRoYXQgdGhlIFxjdHlwZXtQeUNPYmplY3R9Ci0gIFx2YXJ7c2VsZn0gd2FzIGNyZWF0ZWQgd2l0aC4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5Q09iamVjdF9TZXRWb2lkUHRyfXtQeU9iamVjdCogc2VsZiwgdm9pZCogY29ian0KLSAgU2V0IHRoZSB2b2lkIHBvaW50ZXIgaW5zaWRlIFx2YXJ7c2VsZn0gdG8gXHZhcntjb2JqfS4KLSAgVGhlIFxjdHlwZXtQeUNPYmplY3R9IG11c3Qgbm90IGhhdmUgYW4gYXNzb2NpYXRlZCBkZXN0cnVjdG9yLgotICBSZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLQotXHN1YnNlY3Rpb257Q2VsbCBPYmplY3RzIFxsYWJlbHtjZWxsLW9iamVjdHN9fQotCi1gYENlbGwnJyBvYmplY3RzIGFyZSB1c2VkIHRvIGltcGxlbWVudCB2YXJpYWJsZXMgcmVmZXJlbmNlZCBieQotbXVsdGlwbGUgc2NvcGVzLiAgRm9yIGVhY2ggc3VjaCB2YXJpYWJsZSwgYSBjZWxsIG9iamVjdCBpcyBjcmVhdGVkIHRvCi1zdG9yZSB0aGUgdmFsdWU7IHRoZSBsb2NhbCB2YXJpYWJsZXMgb2YgZWFjaCBzdGFjayBmcmFtZSB0aGF0Ci1yZWZlcmVuY2VzIHRoZSB2YWx1ZSBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgY2VsbHMgZnJvbSBvdXRlcgotc2NvcGVzIHdoaWNoIGFsc28gdXNlIHRoYXQgdmFyaWFibGUuICBXaGVuIHRoZSB2YWx1ZSBpcyBhY2Nlc3NlZCwgdGhlCi12YWx1ZSBjb250YWluZWQgaW4gdGhlIGNlbGwgaXMgdXNlZCBpbnN0ZWFkIG9mIHRoZSBjZWxsIG9iamVjdAotaXRzZWxmLiAgVGhpcyBkZS1yZWZlcmVuY2luZyBvZiB0aGUgY2VsbCBvYmplY3QgcmVxdWlyZXMgc3VwcG9ydCBmcm9tCi10aGUgZ2VuZXJhdGVkIGJ5dGUtY29kZTsgdGhlc2UgYXJlIG5vdCBhdXRvbWF0aWNhbGx5IGRlLXJlZmVyZW5jZWQKLXdoZW4gYWNjZXNzZWQuICBDZWxsIG9iamVjdHMgYXJlIG5vdCBsaWtlbHkgdG8gYmUgdXNlZnVsIGVsc2V3aGVyZS4KLQotXGJlZ2lue2N0eXBlZGVzY317UHlDZWxsT2JqZWN0fQotICBUaGUgQyBzdHJ1Y3R1cmUgdXNlZCBmb3IgY2VsbCBvYmplY3RzLgotXGVuZHtjdHlwZWRlc2N9Ci0KLVxiZWdpbntjdmFyZGVzY317UHlUeXBlT2JqZWN0fXtQeUNlbGxfVHlwZX0KLSAgVGhlIHR5cGUgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gY2VsbCBvYmplY3RzLgotXGVuZHtjdmFyZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeUNlbGxfQ2hlY2t9e29ifQotICBSZXR1cm4gdHJ1ZSBpZiBcdmFye29ifSBpcyBhIGNlbGwgb2JqZWN0OyBcdmFye29ifSBtdXN0IG5vdCBiZQotICBcTlVMTHt9LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlDZWxsX05ld317UHlPYmplY3QgKm9ifQotICBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBjZWxsIG9iamVjdCBjb250YWluaW5nIHRoZSB2YWx1ZSBcdmFye29ifS4KLSAgVGhlIHBhcmFtZXRlciBtYXkgYmUgXE5VTEx7fS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5Q2VsbF9HZXR9e1B5T2JqZWN0ICpjZWxsfQotICBSZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSBjZWxsIFx2YXJ7Y2VsbH0uCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeUNlbGxfR0VUfXtQeU9iamVjdCAqY2VsbH0KLSAgUmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGUgY2VsbCBcdmFye2NlbGx9LCBidXQgd2l0aG91dCBjaGVja2luZwotICB0aGF0IFx2YXJ7Y2VsbH0gaXMgbm9uLVxOVUxMe30gYW5kIGEgY2VsbCBvYmplY3QuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeUNlbGxfU2V0fXtQeU9iamVjdCAqY2VsbCwgUHlPYmplY3QgKnZhbHVlfQotICBTZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBjZWxsIG9iamVjdCBcdmFye2NlbGx9IHRvIFx2YXJ7dmFsdWV9LiAgVGhpcwotICByZWxlYXNlcyB0aGUgcmVmZXJlbmNlIHRvIGFueSBjdXJyZW50IGNvbnRlbnQgb2YgdGhlIGNlbGwuCi0gIFx2YXJ7dmFsdWV9IG1heSBiZSBcTlVMTHt9LiAgXHZhcntjZWxsfSBtdXN0IGJlIG5vbi1cTlVMTHt9OyBpZiBpdCBpcwotICBub3QgYSBjZWxsIG9iamVjdCwgXGNvZGV7LTF9IHdpbGwgYmUgcmV0dXJuZWQuICBPbiBzdWNjZXNzLCBcY29kZXswfQotICB3aWxsIGJlIHJldHVybmVkLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e3ZvaWR9e1B5Q2VsbF9TRVR9e1B5T2JqZWN0ICpjZWxsLCBQeU9iamVjdCAqdmFsdWV9Ci0gIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBjZWxsIG9iamVjdCBcdmFye2NlbGx9IHRvIFx2YXJ7dmFsdWV9LiAgTm8KLSAgcmVmZXJlbmNlIGNvdW50cyBhcmUgYWRqdXN0ZWQsIGFuZCBubyBjaGVja3MgYXJlIG1hZGUgZm9yIHNhZmV0eTsKLSAgXHZhcntjZWxsfSBtdXN0IGJlIG5vbi1cTlVMTHt9IGFuZCBtdXN0IGJlIGEgY2VsbCBvYmplY3QuCi1cZW5ke2NmdW5jZGVzY30KLQotCi1cc3Vic2VjdGlvbntHZW5lcmF0b3IgT2JqZWN0cyBcbGFiZWx7Z2VuLW9iamVjdHN9fQotCi1HZW5lcmF0b3Igb2JqZWN0cyBhcmUgd2hhdCBQeXRob24gdXNlcyB0byBpbXBsZW1lbnQgZ2VuZXJhdG9yIGl0ZXJhdG9ycy4KLVRoZXkgYXJlIG5vcm1hbGx5IGNyZWF0ZWQgYnkgaXRlcmF0aW5nIG92ZXIgYSBmdW5jdGlvbiB0aGF0IHlpZWxkcyB2YWx1ZXMsCi1yYXRoZXIgdGhhbiBleHBsaWNpdGx5IGNhbGxpbmcgXGNmdW5jdGlvbntQeUdlbl9OZXd9LgotCi1cYmVnaW57Y3R5cGVkZXNjfXtQeUdlbk9iamVjdH0KLSAgVGhlIEMgc3RydWN0dXJlIHVzZWQgZm9yIGdlbmVyYXRvciBvYmplY3RzLgotXGVuZHtjdHlwZWRlc2N9Ci0KLVxiZWdpbntjdmFyZGVzY317UHlUeXBlT2JqZWN0fXtQeUdlbl9UeXBlfQotICBUaGUgdHlwZSBvYmplY3QgY29ycmVzcG9uZGluZyB0byBnZW5lcmF0b3Igb2JqZWN0cwotXGVuZHtjdmFyZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeUdlbl9DaGVja317b2J9Ci0gIFJldHVybiB0cnVlIGlmIFx2YXJ7b2J9IGlzIGEgZ2VuZXJhdG9yIG9iamVjdDsgXHZhcntvYn0gbXVzdCBub3QgYmUKLSAgXE5VTEx7fS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5R2VuX0NoZWNrRXhhY3R9e29ifQotICBSZXR1cm4gdHJ1ZSBpZiBcdmFye29ifSdzIHR5cGUgaXMgXHZhcntQeUdlbl9UeXBlfQotICBpcyBhIGdlbmVyYXRvciBvYmplY3Q7IFx2YXJ7b2J9IG11c3Qgbm90IGJlCi0gIFxOVUxMe30uCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeUdlbl9OZXd9e1B5RnJhbWVPYmplY3QgKmZyYW1lfQotICBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBnZW5lcmF0b3Igb2JqZWN0IGJhc2VkIG9uIHRoZSBcdmFye2ZyYW1lfSBvYmplY3QuCi0gIEEgcmVmZXJlbmNlIHRvIFx2YXJ7ZnJhbWV9IGlzIHN0b2xlbiBieSB0aGlzIGZ1bmN0aW9uLgotICBUaGUgcGFyYW1ldGVyIG11c3Qgbm90IGJlIFxOVUxMe30uCi1cZW5ke2NmdW5jZGVzY30KLQotCi1cc3Vic2VjdGlvbntEYXRlVGltZSBPYmplY3RzIFxsYWJlbHtkYXRldGltZS1vYmplY3RzfX0KLQotVmFyaW91cyBkYXRlIGFuZCB0aW1lIG9iamVjdHMgYXJlIHN1cHBsaWVkIGJ5IHRoZSBcbW9kdWxle2RhdGV0aW1lfQotbW9kdWxlLiAgQmVmb3JlIHVzaW5nIGFueSBvZiB0aGVzZSBmdW5jdGlvbnMsIHRoZSBoZWFkZXIgZmlsZQotXGZpbGV7ZGF0ZXRpbWUuaH0gbXVzdCBiZSBpbmNsdWRlZCBpbiB5b3VyIHNvdXJjZSAobm90ZSB0aGF0IHRoaXMgaXMKLW5vdCBpbmNsdWRlZCBieSBcZmlsZXtQeXRob24uaH0pLCBhbmQgdGhlIG1hY3JvCi1cY2Z1bmN0aW9ue1B5RGF0ZVRpbWVfSU1QT1JUfSBtdXN0IGJlIGludm9rZWQuICBUaGUgbWFjcm8gcHV0cyBhCi1wb2ludGVyIHRvIGEgQyBzdHJ1Y3R1cmUgaW50byBhIHN0YXRpYyB2YXJpYWJsZSwgCi1cY29kZXtQeURhdGVUaW1lQVBJfSwgdGhhdCBpcyB1c2VkIGJ5IHRoZSBmb2xsb3dpbmcgbWFjcm9zLgotCi1UeXBlLWNoZWNrIG1hY3JvczoKLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeURhdGVfQ2hlY2t9e1B5T2JqZWN0ICpvYn0KLSAgUmV0dXJuIHRydWUgaWYgXHZhcntvYn0gaXMgb2YgdHlwZSBcY2RhdGF7UHlEYXRlVGltZV9EYXRlVHlwZX0gb3IKLSAgYSBzdWJ0eXBlIG9mIFxjZGF0YXtQeURhdGVUaW1lX0RhdGVUeXBlfS4gIFx2YXJ7b2J9IG11c3Qgbm90IGJlCi0gIFxOVUxMe30uCi0gIFx2ZXJzaW9uYWRkZWR7Mi40fQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlEYXRlX0NoZWNrRXhhY3R9e1B5T2JqZWN0ICpvYn0KLSAgUmV0dXJuIHRydWUgaWYgXHZhcntvYn0gaXMgb2YgdHlwZSBcY2RhdGF7UHlEYXRlVGltZV9EYXRlVHlwZX0uCi0gIFx2YXJ7b2J9IG11c3Qgbm90IGJlIFxOVUxMe30uCi0gIFx2ZXJzaW9uYWRkZWR7Mi40fQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlEYXRlVGltZV9DaGVja317UHlPYmplY3QgKm9ifQotICBSZXR1cm4gdHJ1ZSBpZiBcdmFye29ifSBpcyBvZiB0eXBlIFxjZGF0YXtQeURhdGVUaW1lX0RhdGVUaW1lVHlwZX0gb3IKLSAgYSBzdWJ0eXBlIG9mIFxjZGF0YXtQeURhdGVUaW1lX0RhdGVUaW1lVHlwZX0uICBcdmFye29ifSBtdXN0IG5vdCBiZQotICBcTlVMTHt9LgotICBcdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5RGF0ZVRpbWVfQ2hlY2tFeGFjdH17UHlPYmplY3QgKm9ifQotICBSZXR1cm4gdHJ1ZSBpZiBcdmFye29ifSBpcyBvZiB0eXBlIFxjZGF0YXtQeURhdGVUaW1lX0RhdGVUaW1lVHlwZX0uCi0gIFx2YXJ7b2J9IG11c3Qgbm90IGJlIFxOVUxMe30uCi0gIFx2ZXJzaW9uYWRkZWR7Mi40fQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlUaW1lX0NoZWNrfXtQeU9iamVjdCAqb2J9Ci0gIFJldHVybiB0cnVlIGlmIFx2YXJ7b2J9IGlzIG9mIHR5cGUgXGNkYXRhe1B5RGF0ZVRpbWVfVGltZVR5cGV9IG9yCi0gIGEgc3VidHlwZSBvZiBcY2RhdGF7UHlEYXRlVGltZV9UaW1lVHlwZX0uICBcdmFye29ifSBtdXN0IG5vdCBiZQotICBcTlVMTHt9LgotICBcdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5VGltZV9DaGVja0V4YWN0fXtQeU9iamVjdCAqb2J9Ci0gIFJldHVybiB0cnVlIGlmIFx2YXJ7b2J9IGlzIG9mIHR5cGUgXGNkYXRhe1B5RGF0ZVRpbWVfVGltZVR5cGV9LgotICBcdmFye29ifSBtdXN0IG5vdCBiZSBcTlVMTHt9LgotICBcdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5RGVsdGFfQ2hlY2t9e1B5T2JqZWN0ICpvYn0KLSAgUmV0dXJuIHRydWUgaWYgXHZhcntvYn0gaXMgb2YgdHlwZSBcY2RhdGF7UHlEYXRlVGltZV9EZWx0YVR5cGV9IG9yCi0gIGEgc3VidHlwZSBvZiBcY2RhdGF7UHlEYXRlVGltZV9EZWx0YVR5cGV9LiAgXHZhcntvYn0gbXVzdCBub3QgYmUKLSAgXE5VTEx7fS4KLSAgXHZlcnNpb25hZGRlZHsyLjR9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeURlbHRhX0NoZWNrRXhhY3R9e1B5T2JqZWN0ICpvYn0KLSAgUmV0dXJuIHRydWUgaWYgXHZhcntvYn0gaXMgb2YgdHlwZSBcY2RhdGF7UHlEYXRlVGltZV9EZWx0YVR5cGV9LgotICBcdmFye29ifSBtdXN0IG5vdCBiZSBcTlVMTHt9LgotICBcdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5VFpJbmZvX0NoZWNrfXtQeU9iamVjdCAqb2J9Ci0gIFJldHVybiB0cnVlIGlmIFx2YXJ7b2J9IGlzIG9mIHR5cGUgXGNkYXRhe1B5RGF0ZVRpbWVfVFpJbmZvVHlwZX0gb3IKLSAgYSBzdWJ0eXBlIG9mIFxjZGF0YXtQeURhdGVUaW1lX1RaSW5mb1R5cGV9LiAgXHZhcntvYn0gbXVzdCBub3QgYmUKLSAgXE5VTEx7fS4KLSAgXHZlcnNpb25hZGRlZHsyLjR9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeVRaSW5mb19DaGVja0V4YWN0fXtQeU9iamVjdCAqb2J9Ci0gIFJldHVybiB0cnVlIGlmIFx2YXJ7b2J9IGlzIG9mIHR5cGUgXGNkYXRhe1B5RGF0ZVRpbWVfVFpJbmZvVHlwZX0uCi0gIFx2YXJ7b2J9IG11c3Qgbm90IGJlIFxOVUxMe30uCi0gIFx2ZXJzaW9uYWRkZWR7Mi40fQotXGVuZHtjZnVuY2Rlc2N9Ci0KLU1hY3JvcyB0byBjcmVhdGUgb2JqZWN0czoKLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeURhdGVfRnJvbURhdGV9e2ludCB5ZWFyLCBpbnQgbW9udGgsIGludCBkYXl9Ci0gIFJldHVybiBhIFxjb2Rle2RhdGV0aW1lLmRhdGV9IG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgeWVhciwgbW9udGgKLSAgYW5kIGRheS4KLSAgXHZlcnNpb25hZGRlZHsyLjR9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeURhdGVUaW1lX0Zyb21EYXRlQW5kVGltZX17aW50IHllYXIsIGludCBtb250aCwKLSAgICAgICAgaW50IGRheSwgaW50IGhvdXIsIGludCBtaW51dGUsIGludCBzZWNvbmQsIGludCB1c2Vjb25kfQotICBSZXR1cm4gYSBcY29kZXtkYXRldGltZS5kYXRldGltZX0gb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCB5ZWFyLCBtb250aCwKLSAgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCBhbmQgbWljcm9zZWNvbmQuCi0gIFx2ZXJzaW9uYWRkZWR7Mi40fQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlUaW1lX0Zyb21UaW1lfXtpbnQgaG91ciwgaW50IG1pbnV0ZSwKLSAgICAgICAgaW50IHNlY29uZCwgaW50IHVzZWNvbmR9Ci0gIFJldHVybiBhIFxjb2Rle2RhdGV0aW1lLnRpbWV9IG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgaG91ciwgbWludXRlLAotICBzZWNvbmQgYW5kIG1pY3Jvc2Vjb25kLgotICBcdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5RGVsdGFfRnJvbURTVX17aW50IGRheXMsIGludCBzZWNvbmRzLAotICAgICAgICBpbnQgdXNlY29uZHN9Ci0gIFJldHVybiBhIFxjb2Rle2RhdGV0aW1lLnRpbWVkZWx0YX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gbnVtYmVyCi0gIG9mIGRheXMsIHNlY29uZHMgYW5kIG1pY3Jvc2Vjb25kcy4gIE5vcm1hbGl6YXRpb24gaXMgcGVyZm9ybWVkIHNvIHRoYXQKLSAgdGhlIHJlc3VsdGluZyBudW1iZXIgb2YgbWljcm9zZWNvbmRzIGFuZCBzZWNvbmRzIGxpZSBpbiB0aGUgcmFuZ2VzCi0gIGRvY3VtZW50ZWQgZm9yIFxjb2Rle2RhdGV0aW1lLnRpbWVkZWx0YX0gb2JqZWN0cy4KLSAgXHZlcnNpb25hZGRlZHsyLjR9Ci1cZW5ke2NmdW5jZGVzY30KLQotTWFjcm9zIHRvIGV4dHJhY3QgZmllbGRzIGZyb20gZGF0ZSBvYmplY3RzLiAgVGhlIGFyZ3VtZW50IG11c3QgYmUgYW4KLWluc3RhbmNlIG9mIFxjZGF0YXtQeURhdGVUaW1lX0RhdGV9LCBpbmNsdWRpbmcgc3ViY2xhc3NlcyAoc3VjaCBhcwotXGNkYXRhe1B5RGF0ZVRpbWVfRGF0ZVRpbWV9KS4gIFRoZSBhcmd1bWVudCBtdXN0IG5vdCBiZSBcTlVMTHt9LCBhbmQKLXRoZSB0eXBlIGlzIG5vdCBjaGVja2VkOgotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5RGF0ZVRpbWVfR0VUX1lFQVJ9e1B5RGF0ZVRpbWVfRGF0ZSAqb30KLSAgUmV0dXJuIHRoZSB5ZWFyLCBhcyBhIHBvc2l0aXZlIGludC4KLSAgXHZlcnNpb25hZGRlZHsyLjR9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeURhdGVUaW1lX0dFVF9NT05USH17UHlEYXRlVGltZV9EYXRlICpvfQotICBSZXR1cm4gdGhlIG1vbnRoLCBhcyBhbiBpbnQgZnJvbSAxIHRocm91Z2ggMTIuCi0gIFx2ZXJzaW9uYWRkZWR7Mi40fQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlEYXRlVGltZV9HRVRfREFZfXtQeURhdGVUaW1lX0RhdGUgKm99Ci0gIFJldHVybiB0aGUgZGF5LCBhcyBhbiBpbnQgZnJvbSAxIHRocm91Z2ggMzEuCi0gIFx2ZXJzaW9uYWRkZWR7Mi40fQotXGVuZHtjZnVuY2Rlc2N9Ci0KLU1hY3JvcyB0byBleHRyYWN0IGZpZWxkcyBmcm9tIGRhdGV0aW1lIG9iamVjdHMuICBUaGUgYXJndW1lbnQgbXVzdCBiZSBhbgotaW5zdGFuY2Ugb2YgXGNkYXRhe1B5RGF0ZVRpbWVfRGF0ZVRpbWV9LCBpbmNsdWRpbmcgc3ViY2xhc3Nlcy4KLVRoZSBhcmd1bWVudCBtdXN0IG5vdCBiZSBcTlVMTHt9LCBhbmQgdGhlIHR5cGUgaXMgbm90IGNoZWNrZWQ6Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlEYXRlVGltZV9EQVRFX0dFVF9IT1VSfXtQeURhdGVUaW1lX0RhdGVUaW1lICpvfQotICBSZXR1cm4gdGhlIGhvdXIsIGFzIGFuIGludCBmcm9tIDAgdGhyb3VnaCAyMy4KLSAgXHZlcnNpb25hZGRlZHsyLjR9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeURhdGVUaW1lX0RBVEVfR0VUX01JTlVURX17UHlEYXRlVGltZV9EYXRlVGltZSAqb30KLSAgUmV0dXJuIHRoZSBtaW51dGUsIGFzIGFuIGludCBmcm9tIDAgdGhyb3VnaCA1OS4KLSAgXHZlcnNpb25hZGRlZHsyLjR9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeURhdGVUaW1lX0RBVEVfR0VUX1NFQ09ORH17UHlEYXRlVGltZV9EYXRlVGltZSAqb30KLSAgUmV0dXJuIHRoZSBzZWNvbmQsIGFzIGFuIGludCBmcm9tIDAgdGhyb3VnaCA1OS4KLSAgXHZlcnNpb25hZGRlZHsyLjR9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeURhdGVUaW1lX0RBVEVfR0VUX01JQ1JPU0VDT05EfXtQeURhdGVUaW1lX0RhdGVUaW1lICpvfQotICBSZXR1cm4gdGhlIG1pY3Jvc2Vjb25kLCBhcyBhbiBpbnQgZnJvbSAwIHRocm91Z2ggOTk5OTk5LgotICBcdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1NYWNyb3MgdG8gZXh0cmFjdCBmaWVsZHMgZnJvbSB0aW1lIG9iamVjdHMuICBUaGUgYXJndW1lbnQgbXVzdCBiZSBhbgotaW5zdGFuY2Ugb2YgXGNkYXRhe1B5RGF0ZVRpbWVfVGltZX0sIGluY2x1ZGluZyBzdWJjbGFzc2VzLgotVGhlIGFyZ3VtZW50IG11c3Qgbm90IGJlIFxOVUxMe30sIGFuZCB0aGUgdHlwZSBpcyBub3QgY2hlY2tlZDoKLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeURhdGVUaW1lX1RJTUVfR0VUX0hPVVJ9e1B5RGF0ZVRpbWVfVGltZSAqb30KLSAgUmV0dXJuIHRoZSBob3VyLCBhcyBhbiBpbnQgZnJvbSAwIHRocm91Z2ggMjMuCi0gIFx2ZXJzaW9uYWRkZWR7Mi40fQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlEYXRlVGltZV9USU1FX0dFVF9NSU5VVEV9e1B5RGF0ZVRpbWVfVGltZSAqb30KLSAgUmV0dXJuIHRoZSBtaW51dGUsIGFzIGFuIGludCBmcm9tIDAgdGhyb3VnaCA1OS4KLSAgXHZlcnNpb25hZGRlZHsyLjR9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeURhdGVUaW1lX1RJTUVfR0VUX1NFQ09ORH17UHlEYXRlVGltZV9UaW1lICpvfQotICBSZXR1cm4gdGhlIHNlY29uZCwgYXMgYW4gaW50IGZyb20gMCB0aHJvdWdoIDU5LgotICBcdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5RGF0ZVRpbWVfVElNRV9HRVRfTUlDUk9TRUNPTkR9e1B5RGF0ZVRpbWVfVGltZSAqb30KLSAgUmV0dXJuIHRoZSBtaWNyb3NlY29uZCwgYXMgYW4gaW50IGZyb20gMCB0aHJvdWdoIDk5OTk5OS4KLSAgXHZlcnNpb25hZGRlZHsyLjR9Ci1cZW5ke2NmdW5jZGVzY30KLQotTWFjcm9zIGZvciB0aGUgY29udmVuaWVuY2Ugb2YgbW9kdWxlcyBpbXBsZW1lbnRpbmcgdGhlIERCIEFQSToKLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeURhdGVUaW1lX0Zyb21UaW1lc3RhbXB9e1B5T2JqZWN0ICphcmdzfQotICBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBcY29kZXtkYXRldGltZS5kYXRldGltZX0gb2JqZWN0IGdpdmVuIGFuIGFyZ3VtZW50Ci0gIHR1cGxlIHN1aXRhYmxlIGZvciBwYXNzaW5nIHRvIFxjb2Rle2RhdGV0aW1lLmRhdGV0aW1lLmZyb210aW1lc3RhbXAoKX0uCi0gIFx2ZXJzaW9uYWRkZWR7Mi40fQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlEYXRlX0Zyb21UaW1lc3RhbXB9e1B5T2JqZWN0ICphcmdzfQotICBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBcY29kZXtkYXRldGltZS5kYXRlfSBvYmplY3QgZ2l2ZW4gYW4gYXJndW1lbnQKLSAgdHVwbGUgc3VpdGFibGUgZm9yIHBhc3NpbmcgdG8gXGNvZGV7ZGF0ZXRpbWUuZGF0ZS5mcm9tdGltZXN0YW1wKCl9LgotICBcdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxzdWJzZWN0aW9ue1NldCBPYmplY3RzIFxsYWJlbHtzZXRPYmplY3RzfX0KLVxzZWN0aW9uYXV0aG9ye1JheW1vbmQgRC4gSGV0dGluZ2VyfXtweXRob25AcmNuLmNvbX0KLQotXG9iaW5kZXh7c2V0fQotXG9iaW5kZXh7ZnJvemVuc2V0fQotXHZlcnNpb25hZGRlZHsyLjV9Ci0KLVRoaXMgc2VjdGlvbiBkZXRhaWxzIHRoZSBwdWJsaWMgQVBJIGZvciBcY2xhc3N7c2V0fSBhbmQgXGNsYXNze2Zyb3plbnNldH0KLW9iamVjdHMuICBBbnkgZnVuY3Rpb25hbGl0eSBub3QgbGlzdGVkIGJlbG93IGlzIGJlc3QgYWNjZXNzZWQgdXNpbmcgdGhlCi1laXRoZXIgdGhlIGFic3RyYWN0IG9iamVjdCBwcm90b2NvbCAoaW5jbHVkaW5nCi1cY2Z1bmN0aW9ue1B5T2JqZWN0X0NhbGxNZXRob2QoKX0sIFxjZnVuY3Rpb257UHlPYmplY3RfUmljaENvbXBhcmVCb29sKCl9LAotXGNmdW5jdGlvbntQeU9iamVjdF9IYXNoKCl9LCBcY2Z1bmN0aW9ue1B5T2JqZWN0X1JlcHIoKX0sCi1cY2Z1bmN0aW9ue1B5T2JqZWN0X0lzVHJ1ZSgpfSwgXGNmdW5jdGlvbntQeU9iamVjdF9QcmludCgpfSwgYW5kCi1cY2Z1bmN0aW9ue1B5T2JqZWN0X0dldEl0ZXIoKX0pCi1vciB0aGUgYWJzdHJhY3QgbnVtYmVyIHByb3RvY29sIChpbmNsdWRpbmcKLVxjZnVuY3Rpb257UHlOdW1iZXJfQW5kKCl9LCBcY2Z1bmN0aW9ue1B5TnVtYmVyX1N1YnRyYWN0KCl9LAotXGNmdW5jdGlvbntQeU51bWJlcl9PcigpfSwgXGNmdW5jdGlvbntQeU51bWJlcl9Yb3IoKX0sCi1cY2Z1bmN0aW9ue1B5TnVtYmVyX0luUGxhY2VBbmQoKX0sIFxjZnVuY3Rpb257UHlOdW1iZXJfSW5QbGFjZVN1YnRyYWN0KCl9LAotXGNmdW5jdGlvbntQeU51bWJlcl9JblBsYWNlT3IoKX0sIGFuZCBcY2Z1bmN0aW9ue1B5TnVtYmVyX0luUGxhY2VYb3IoKX0pLgotCi1cYmVnaW57Y3R5cGVkZXNjfXtQeVNldE9iamVjdH0KLSAgVGhpcyBzdWJ0eXBlIG9mIFxjdHlwZXtQeU9iamVjdH0gaXMgdXNlZCB0byBob2xkIHRoZSBpbnRlcm5hbCBkYXRhIGZvcgotICBib3RoIFxjbGFzc3tzZXR9IGFuZCBcY2xhc3N7ZnJvemVuc2V0fSBvYmplY3RzLiAgSXQgaXMgbGlrZSBhCi0gIFxjdHlwZXtQeURpY3RPYmplY3R9IGluIHRoYXQgaXQgaXMgYSBmaXhlZCBzaXplIGZvciBzbWFsbCBzZXRzCi0gIChtdWNoIGxpa2UgdHVwbGUgc3RvcmFnZSkgYW5kIHdpbGwgcG9pbnQgdG8gYSBzZXBhcmF0ZSwgdmFyaWFibGUgc2l6ZWQKLSAgYmxvY2sgb2YgbWVtb3J5IGZvciBtZWRpdW0gYW5kIGxhcmdlIHNpemVkIHNldHMgKG11Y2ggbGlrZSBsaXN0IHN0b3JhZ2UpLgotICBOb25lIG9mIHRoZSBmaWVsZHMgb2YgdGhpcyBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGNvbnNpZGVyZWQgcHVibGljIGFuZAotICBhcmUgc3ViamVjdCB0byBjaGFuZ2UuICBBbGwgYWNjZXNzIHNob3VsZCBiZSBkb25lIHRocm91Z2ggdGhlCi0gIGRvY3VtZW50ZWQgQVBJIHJhdGhlciB0aGFuIGJ5IG1hbmlwdWxhdGluZyB0aGUgdmFsdWVzIGluIHRoZSBzdHJ1Y3R1cmUuCi0KLVxlbmR7Y3R5cGVkZXNjfQotCi1cYmVnaW57Y3ZhcmRlc2N9e1B5VHlwZU9iamVjdH17UHlTZXRfVHlwZX0KLSAgVGhpcyBpcyBhbiBpbnN0YW5jZSBvZiBcY3R5cGV7UHlUeXBlT2JqZWN0fSByZXByZXNlbnRpbmcgdGhlIFB5dGhvbgotICBcY2xhc3N7c2V0fSB0eXBlLgotXGVuZHtjdmFyZGVzY30KLQotXGJlZ2lue2N2YXJkZXNjfXtQeVR5cGVPYmplY3R9e1B5RnJvemVuU2V0X1R5cGV9Ci0gIFRoaXMgaXMgYW4gaW5zdGFuY2Ugb2YgXGN0eXBle1B5VHlwZU9iamVjdH0gcmVwcmVzZW50aW5nIHRoZSBQeXRob24KLSAgXGNsYXNze2Zyb3plbnNldH0gdHlwZS4KLVxlbmR7Y3ZhcmRlc2N9Ci0KLQotVGhlIGZvbGxvd2luZyB0eXBlIGNoZWNrIG1hY3JvcyB3b3JrIG9uIHBvaW50ZXJzIHRvIGFueSBQeXRob24gb2JqZWN0LgotTGlrZXdpc2UsIHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgd29yayB3aXRoIGFueSBpdGVyYWJsZSBQeXRob24gb2JqZWN0LgotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5QW55U2V0X0NoZWNrfXtQeU9iamVjdCAqcH0KLSAgUmV0dXJuIHRydWUgaWYgXHZhcntwfSBpcyBhIFxjbGFzc3tzZXR9IG9iamVjdCwgYSBcY2xhc3N7ZnJvemVuc2V0fQotICBvYmplY3QsIG9yIGFuIGluc3RhbmNlIG9mIGEgc3VidHlwZS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5QW55U2V0X0NoZWNrRXhhY3R9e1B5T2JqZWN0ICpwfQotICBSZXR1cm4gdHJ1ZSBpZiBcdmFye3B9IGlzIGEgXGNsYXNze3NldH0gb2JqZWN0IG9yIGEgXGNsYXNze2Zyb3plbnNldH0KLSAgb2JqZWN0IGJ1dCBub3QgYW4gaW5zdGFuY2Ugb2YgYSBzdWJ0eXBlLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlGcm96ZW5TZXRfQ2hlY2tFeGFjdH17UHlPYmplY3QgKnB9Ci0gIFJldHVybiB0cnVlIGlmIFx2YXJ7cH0gaXMgYSBcY2xhc3N7ZnJvemVuc2V0fSBvYmplY3QKLSAgYnV0IG5vdCBhbiBpbnN0YW5jZSBvZiBhIHN1YnR5cGUuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeVNldF9OZXd9e1B5T2JqZWN0ICppdGVyYWJsZX0KLSAgUmV0dXJuIGEgbmV3IFxjbGFzc3tzZXR9IGNvbnRhaW5pbmcgb2JqZWN0cyByZXR1cm5lZCBieSB0aGUKLSAgXHZhcntpdGVyYWJsZX0uICBUaGUgXHZhcntpdGVyYWJsZX0gbWF5IGJlIFxOVUxMe30gdG8gY3JlYXRlIGEKLSAgbmV3IGVtcHR5IHNldC4gIFJldHVybiB0aGUgbmV3IHNldCBvbiBzdWNjZXNzIG9yIFxOVUxMe30gb24KLSAgZmFpbHVyZS4gIFJhaXNlIFxleGNlcHRpb257VHlwZUVycm9yfSBpZiBcdmFye2l0ZXJhYmxlfSBpcwotICBub3QgYWN0dWFsbHkgaXRlcmFibGUuICBUaGUgY29uc3RydWN0b3IgaXMgYWxzbyB1c2VmdWwgZm9yCi0gIGNvcHlpbmcgYSBzZXQgKFxjb2Rle2M9c2V0KHMpfSkuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeUZyb3plblNldF9OZXd9e1B5T2JqZWN0ICppdGVyYWJsZX0KLSAgUmV0dXJuIGEgbmV3IFxjbGFzc3tmcm96ZW5zZXR9IGNvbnRhaW5pbmcgb2JqZWN0cyByZXR1cm5lZCBieSB0aGUKLSAgXHZhcntpdGVyYWJsZX0uICBUaGUgXHZhcntpdGVyYWJsZX0gbWF5IGJlIFxOVUxMe30gdG8gY3JlYXRlIGEKLSAgbmV3IGVtcHR5IGZyb3plbnNldC4gIFJldHVybiB0aGUgbmV3IHNldCBvbiBzdWNjZXNzIG9yIFxOVUxMe30gb24KLSAgZmFpbHVyZS4gIFJhaXNlIFxleGNlcHRpb257VHlwZUVycm9yfSBpZiBcdmFye2l0ZXJhYmxlfSBpcwotICBub3QgYWN0dWFsbHkgaXRlcmFibGUuCi1cZW5ke2NmdW5jZGVzY30KLQotCi1UaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhbmQgbWFjcm9zIGFyZSBhdmFpbGFibGUgZm9yIGluc3RhbmNlcyBvZgotXGNsYXNze3NldH0gb3IgXGNsYXNze2Zyb3plbnNldH0gb3IgaW5zdGFuY2VzIG9mIHRoZWlyIHN1YnR5cGVzLgotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5U2V0X1NpemV9e1B5T2JqZWN0ICphbnlzZXR9Ci0gIFJldHVybiB0aGUgbGVuZ3RoIG9mIGEgXGNsYXNze3NldH0gb3IgXGNsYXNze2Zyb3plbnNldH0gb2JqZWN0LgotICBFcXVpdmFsZW50IHRvIFxzYW1we2xlbihcdmFye2FueXNldH0pfS4gIFJhaXNlcyBhCi0gIFxleGNlcHRpb257UHlFeGNfU3lzdGVtRXJyb3J9IGlmIFx2YXJ7YW55c2V0fSBpcyBub3QgYSBcY2xhc3N7c2V0fSwKLSAgXGNsYXNze2Zyb3plbnNldH0sIG9yIGFuIGluc3RhbmNlIG9mIGEgc3VidHlwZS4KLSAgXGJpZnVuY2luZGV4e2xlbn0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5U2V0X0dFVF9TSVpFfXtQeU9iamVjdCAqYW55c2V0fQotICBNYWNybyBmb3JtIG9mIFxjZnVuY3Rpb257UHlTZXRfU2l6ZSgpfSB3aXRob3V0IGVycm9yIGNoZWNraW5nLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlTZXRfQ29udGFpbnN9e1B5T2JqZWN0ICphbnlzZXQsIFB5T2JqZWN0ICprZXl9Ci0gIFJldHVybiAxIGlmIGZvdW5kLCAwIGlmIG5vdCBmb3VuZCwgYW5kIC0xIGlmIGFuIGVycm9yIGlzCi0gIGVuY291bnRlcmVkLiAgVW5saWtlIHRoZSBQeXRob24gXG1ldGhvZHtfX2NvbnRhaW5zX18oKX0gbWV0aG9kLCB0aGlzCi0gIGZ1bmN0aW9uIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgY29udmVydCB1bmhhc2hhYmxlIHNldHMgaW50byB0ZW1wb3JhcnkKLSAgZnJvemVuc2V0cy4gIFJhaXNlIGEgXGV4Y2VwdGlvbntUeXBlRXJyb3J9IGlmIHRoZSBcdmFye2tleX0gaXMgdW5oYXNoYWJsZS4KLSAgUmFpc2UgXGV4Y2VwdGlvbntQeUV4Y19TeXN0ZW1FcnJvcn0gaWYgXHZhcnthbnlzZXR9IGlzIG5vdCBhIFxjbGFzc3tzZXR9LAotICBcY2xhc3N7ZnJvemVuc2V0fSwgb3IgYW4gaW5zdGFuY2Ugb2YgYSBzdWJ0eXBlLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgZm9yIGluc3RhbmNlcyBvZiBcY2xhc3N7c2V0fSBvcgotaXRzIHN1YnR5cGVzIGJ1dCBub3QgZm9yIGluc3RhbmNlcyBvZiBcY2xhc3N7ZnJvemVuc2V0fSBvciBpdHMgc3VidHlwZXMuCi0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlTZXRfQWRkfXtQeU9iamVjdCAqc2V0LCBQeU9iamVjdCAqa2V5fQotICBBZGQgXHZhcntrZXl9IHRvIGEgXGNsYXNze3NldH0gaW5zdGFuY2UuICBEb2VzIG5vdCBhcHBseSB0bwotICBcY2xhc3N7ZnJvemVuc2V0fSBpbnN0YW5jZXMuICBSZXR1cm4gMCBvbiBzdWNjZXNzIG9yIC0xIG9uIGZhaWx1cmUuCi0gIFJhaXNlIGEgXGV4Y2VwdGlvbntUeXBlRXJyb3J9IGlmIHRoZSBcdmFye2tleX0gaXMgdW5oYXNoYWJsZS4KLSAgUmFpc2UgYSBcZXhjZXB0aW9ue01lbW9yeUVycm9yfSBpZiB0aGVyZSBpcyBubyByb29tIHRvIGdyb3cuCi0gIFJhaXNlIGEgXGV4Y2VwdGlvbntTeXN0ZW1FcnJvcn0gaWYgXHZhcntzZXR9IGlzIGFuIG5vdCBhbiBpbnN0YW5jZQotICBvZiBcY2xhc3N7c2V0fSBvciBpdHMgc3VidHlwZS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5U2V0X0Rpc2NhcmR9e1B5T2JqZWN0ICpzZXQsIFB5T2JqZWN0ICprZXl9Ci0gIFJldHVybiAxIGlmIGZvdW5kIGFuZCByZW1vdmVkLCAwIGlmIG5vdCBmb3VuZCAobm8gYWN0aW9uIHRha2VuKSwKLSAgYW5kIC0xIGlmIGFuIGVycm9yIGlzIGVuY291bnRlcmVkLiAgRG9lcyBub3QgcmFpc2UgXGV4Y2VwdGlvbntLZXlFcnJvcn0KLSAgZm9yIG1pc3Npbmcga2V5cy4gIFJhaXNlIGEgXGV4Y2VwdGlvbntUeXBlRXJyb3J9IGlmIHRoZSBcdmFye2tleX0gaXMKLSAgdW5oYXNoYWJsZS4gIFVubGlrZSB0aGUgUHl0aG9uIFxtZXRob2R7ZGlzY2FyZCgpfSBtZXRob2QsIHRoaXMgZnVuY3Rpb24KLSAgZG9lcyBub3QgYXV0b21hdGljYWxseSBjb252ZXJ0IHVuaGFzaGFibGUgc2V0cyBpbnRvIHRlbXBvcmFyeSBmcm96ZW5zZXRzLgotICBSYWlzZSBcZXhjZXB0aW9ue1B5RXhjX1N5c3RlbUVycm9yfSBpZiBcdmFye3NldH0gaXMgYW4gbm90IGFuIGluc3RhbmNlCi0gIG9mIFxjbGFzc3tzZXR9IG9yIGl0cyBzdWJ0eXBlLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlTZXRfUG9wfXtQeU9iamVjdCAqc2V0fQotICBSZXR1cm4gYSBuZXcgcmVmZXJlbmNlIHRvIGFuIGFyYml0cmFyeSBvYmplY3QgaW4gdGhlIFx2YXJ7c2V0fSwKLSAgYW5kIHJlbW92ZXMgdGhlIG9iamVjdCBmcm9tIHRoZSBcdmFye3NldH0uICBSZXR1cm4gXE5VTEx7fSBvbgotICBmYWlsdXJlLiAgUmFpc2UgXGV4Y2VwdGlvbntLZXlFcnJvcn0gaWYgdGhlIHNldCBpcyBlbXB0eS4KLSAgUmFpc2UgYSBcZXhjZXB0aW9ue1N5c3RlbUVycm9yfSBpZiBcdmFye3NldH0gaXMgYW4gbm90IGFuIGluc3RhbmNlCi0gIG9mIFxjbGFzc3tzZXR9IG9yIGl0cyBzdWJ0eXBlLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlTZXRfQ2xlYXJ9e1B5T2JqZWN0ICpzZXR9Ci0gIEVtcHR5IGFuIGV4aXN0aW5nIHNldCBvZiBhbGwgZWxlbWVudHMuCi1cZW5ke2NmdW5jZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9hcGkvZXhjZXB0aW9ucy50ZXggYi9Eb2MvYXBpL2V4Y2VwdGlvbnMudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Njc2OTYzLi4wMDAwMDAwCi0tLSBhL0RvYy9hcGkvZXhjZXB0aW9ucy50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw0MjggKzAsMCBAQAotXGNoYXB0ZXJ7RXhjZXB0aW9uIEhhbmRsaW5nIFxsYWJlbHtleGNlcHRpb25IYW5kbGluZ319Ci0KLVRoZSBmdW5jdGlvbnMgZGVzY3JpYmVkIGluIHRoaXMgY2hhcHRlciB3aWxsIGxldCB5b3UgaGFuZGxlIGFuZCByYWlzZSBQeXRob24KLWV4Y2VwdGlvbnMuICBJdCBpcyBpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCBzb21lIG9mIHRoZSBiYXNpY3Mgb2YKLVB5dGhvbiBleGNlcHRpb24gaGFuZGxpbmcuICBJdCB3b3JrcyBzb21ld2hhdCBsaWtlIHRoZQotXFVOSVh7fSBcY2RhdGF7ZXJybm99IHZhcmlhYmxlOiB0aGVyZSBpcyBhIGdsb2JhbCBpbmRpY2F0b3IgKHBlcgotdGhyZWFkKSBvZiB0aGUgbGFzdCBlcnJvciB0aGF0IG9jY3VycmVkLiAgTW9zdCBmdW5jdGlvbnMgZG9uJ3QgY2xlYXIKLXRoaXMgb24gc3VjY2VzcywgYnV0IHdpbGwgc2V0IGl0IHRvIGluZGljYXRlIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3Igb24KLWZhaWx1cmUuICBNb3N0IGZ1bmN0aW9ucyBhbHNvIHJldHVybiBhbiBlcnJvciBpbmRpY2F0b3IsIHVzdWFsbHkKLVxOVUxMe30gaWYgdGhleSBhcmUgc3VwcG9zZWQgdG8gcmV0dXJuIGEgcG9pbnRlciwgb3IgXGNvZGV7LTF9IGlmIHRoZXkKLXJldHVybiBhbiBpbnRlZ2VyIChleGNlcHRpb246IHRoZSBcY2Z1bmN0aW9ue1B5QXJnXyooKX0gZnVuY3Rpb25zCi1yZXR1cm4gXGNvZGV7MX0gZm9yIHN1Y2Nlc3MgYW5kIFxjb2RlezB9IGZvciBmYWlsdXJlKS4KLQotV2hlbiBhIGZ1bmN0aW9uIG11c3QgZmFpbCBiZWNhdXNlIHNvbWUgZnVuY3Rpb24gaXQgY2FsbGVkIGZhaWxlZCwgaXQKLWdlbmVyYWxseSBkb2Vzbid0IHNldCB0aGUgZXJyb3IgaW5kaWNhdG9yOyB0aGUgZnVuY3Rpb24gaXQgY2FsbGVkCi1hbHJlYWR5IHNldCBpdC4gIEl0IGlzIHJlc3BvbnNpYmxlIGZvciBlaXRoZXIgaGFuZGxpbmcgdGhlIGVycm9yIGFuZAotY2xlYXJpbmcgdGhlIGV4Y2VwdGlvbiBvciByZXR1cm5pbmcgYWZ0ZXIgY2xlYW5pbmcgdXAgYW55IHJlc291cmNlcyBpdAotaG9sZHMgKHN1Y2ggYXMgb2JqZWN0IHJlZmVyZW5jZXMgb3IgbWVtb3J5IGFsbG9jYXRpb25zKTsgaXQgc2hvdWxkCi1cZW1waHtub3R9IGNvbnRpbnVlIG5vcm1hbGx5IGlmIGl0IGlzIG5vdCBwcmVwYXJlZCB0byBoYW5kbGUgdGhlCi1lcnJvci4gIElmIHJldHVybmluZyBkdWUgdG8gYW4gZXJyb3IsIGl0IGlzIGltcG9ydGFudCB0byBpbmRpY2F0ZSB0bwotdGhlIGNhbGxlciB0aGF0IGFuIGVycm9yIGhhcyBiZWVuIHNldC4gIElmIHRoZSBlcnJvciBpcyBub3QgaGFuZGxlZCBvcgotY2FyZWZ1bGx5IHByb3BhZ2F0ZWQsIGFkZGl0aW9uYWwgY2FsbHMgaW50byB0aGUgUHl0aG9uL0MgQVBJIG1heSBub3QKLWJlaGF2ZSBhcyBpbnRlbmRlZCBhbmQgbWF5IGZhaWwgaW4gbXlzdGVyaW91cyB3YXlzLgotCi1UaGUgZXJyb3IgaW5kaWNhdG9yIGNvbnNpc3RzIG9mIHRocmVlIFB5dGhvbiBvYmplY3RzIGNvcnJlc3BvbmRpbmcgdG8KLXRoZSByZXN1bHQgb2YgXGNvZGV7c3lzLmV4Y19pbmZvKCl9LiAgQVBJIGZ1bmN0aW9ucyBleGlzdCB0byBpbnRlcmFjdAotd2l0aCB0aGUgZXJyb3IgaW5kaWNhdG9yIGluIHZhcmlvdXMgd2F5cy4gIFRoZXJlIGlzIGEgc2VwYXJhdGUKLWVycm9yIGluZGljYXRvciBmb3IgZWFjaCB0aHJlYWQuCi0KLSUgWFhYIE9yZGVyIG9mIHRoZXNlIHNob3VsZCBiZSBtb3JlIHRob3VnaHRmdWwuCi0lIEVpdGhlciBhbHBoYWJldGljYWwgb3Igc29tZSBraW5kIG9mIHN0cnVjdHVyZS4KLQotXGJlZ2lue2NmdW5jZGVzY317dm9pZH17UHlFcnJfUHJpbnR9e30KLSAgUHJpbnQgYSBzdGFuZGFyZCB0cmFjZWJhY2sgdG8gXGNvZGV7c3lzLnN0ZGVycn0gYW5kIGNsZWFyIHRoZSBlcnJvcgotICBpbmRpY2F0b3IuICBDYWxsIHRoaXMgZnVuY3Rpb24gb25seSB3aGVuIHRoZSBlcnJvciBpbmRpY2F0b3IgaXMKLSAgc2V0LiAgKE90aGVyd2lzZSBpdCB3aWxsIGNhdXNlIGEgZmF0YWwgZXJyb3IhKQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlFcnJfT2NjdXJyZWR9e30KLSAgVGVzdCB3aGV0aGVyIHRoZSBlcnJvciBpbmRpY2F0b3IgaXMgc2V0LiAgSWYgc2V0LCByZXR1cm4gdGhlCi0gIGV4Y2VwdGlvbiBcZW1waHt0eXBlfSAodGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBsYXN0IGNhbGwgdG8gb25lIG9mCi0gIHRoZSBcY2Z1bmN0aW9ue1B5RXJyX1NldCooKX0gZnVuY3Rpb25zIG9yIHRvCi0gIFxjZnVuY3Rpb257UHlFcnJfUmVzdG9yZSgpfSkuICBJZiBub3Qgc2V0LCByZXR1cm4gXE5VTEwuICBZb3UgZG8KLSAgbm90IG93biBhIHJlZmVyZW5jZSB0byB0aGUgcmV0dXJuIHZhbHVlLCBzbyB5b3UgZG8gbm90IG5lZWQgdG8KLSAgXGNmdW5jdGlvbntQeV9ERUNSRUYoKX0gaXQuICBcbm90ZXtEbyBub3QgY29tcGFyZSB0aGUgcmV0dXJuIHZhbHVlCi0gICAgdG8gYSBzcGVjaWZpYyBleGNlcHRpb247IHVzZSBcY2Z1bmN0aW9ue1B5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoKX0KLSAgICBpbnN0ZWFkLCBzaG93biBiZWxvdy4gIChUaGUgY29tcGFyaXNvbiBjb3VsZCBlYXNpbHkgZmFpbCBzaW5jZSB0aGUKLSAgICBleGNlcHRpb24gbWF5IGJlIGFuIGluc3RhbmNlIGluc3RlYWQgb2YgYSBjbGFzcywgaW4gdGhlIGNhc2Ugb2YgYQotICAgIGNsYXNzIGV4Y2VwdGlvbiwgb3IgaXQgbWF5IHRoZSBhIHN1YmNsYXNzIG9mIHRoZSBleHBlY3RlZAotICAgIGV4Y2VwdGlvbi4pfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlFcnJfRXhjZXB0aW9uTWF0Y2hlc317UHlPYmplY3QgKmV4Y30KLSAgRXF1aXZhbGVudCB0byBcc2FtcHtQeUVycl9HaXZlbkV4Y2VwdGlvbk1hdGNoZXMoUHlFcnJfT2NjdXJyZWQoKSwKLSAgXHZhcntleGN9KX0uICBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIGFuIGV4Y2VwdGlvbiBpcwotICBhY3R1YWxseSBzZXQ7IGEgbWVtb3J5IGFjY2VzcyB2aW9sYXRpb24gd2lsbCBvY2N1ciBpZiBubyBleGNlcHRpb24KLSAgaGFzIGJlZW4gcmFpc2VkLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlFcnJfR2l2ZW5FeGNlcHRpb25NYXRjaGVzfXtQeU9iamVjdCAqZ2l2ZW4sIFB5T2JqZWN0ICpleGN9Ci0gIFJldHVybiB0cnVlIGlmIHRoZSBcdmFye2dpdmVufSBleGNlcHRpb24gbWF0Y2hlcyB0aGUgZXhjZXB0aW9uIGluCi0gIFx2YXJ7ZXhjfS4gIElmIFx2YXJ7ZXhjfSBpcyBhIGNsYXNzIG9iamVjdCwgdGhpcyBhbHNvIHJldHVybnMgdHJ1ZQotICB3aGVuIFx2YXJ7Z2l2ZW59IGlzIGFuIGluc3RhbmNlIG9mIGEgc3ViY2xhc3MuICBJZiBcdmFye2V4Y30gaXMgYQotICB0dXBsZSwgYWxsIGV4Y2VwdGlvbnMgaW4gdGhlIHR1cGxlIChhbmQgcmVjdXJzaXZlbHkgaW4gc3VidHVwbGVzKQotICBhcmUgc2VhcmNoZWQgZm9yIGEgbWF0Y2guICBJZiBcdmFye2dpdmVufSBpcyBcTlVMTCwgYSBtZW1vcnkgYWNjZXNzCi0gIHZpb2xhdGlvbiB3aWxsIG9jY3VyLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e3ZvaWR9e1B5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbn17UHlPYmplY3QqKmV4YywgUHlPYmplY3QqKnZhbCwgUHlPYmplY3QqKnRifQotICBVbmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMsIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkKLSAgXGNmdW5jdGlvbntQeUVycl9GZXRjaCgpfSBiZWxvdyBjYW4gYmUgYGB1bm5vcm1hbGl6ZWQnJywgbWVhbmluZwotICB0aGF0IFxjb2RleypcdmFye2V4Y319IGlzIGEgY2xhc3Mgb2JqZWN0IGJ1dCBcY29kZXsqXHZhcnt2YWx9fSBpcwotICBub3QgYW4gaW5zdGFuY2Ugb2YgdGhlICBzYW1lIGNsYXNzLiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0bwotICBpbnN0YW50aWF0ZSB0aGUgY2xhc3MgaW4gdGhhdCBjYXNlLiAgSWYgdGhlIHZhbHVlcyBhcmUgYWxyZWFkeQotICBub3JtYWxpemVkLCBub3RoaW5nIGhhcHBlbnMuICBUaGUgZGVsYXllZCBub3JtYWxpemF0aW9uIGlzCi0gIGltcGxlbWVudGVkIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317dm9pZH17UHlFcnJfQ2xlYXJ9e30KLSAgQ2xlYXIgdGhlIGVycm9yIGluZGljYXRvci4gIElmIHRoZSBlcnJvciBpbmRpY2F0b3IgaXMgbm90IHNldCwgdGhlcmUKLSAgaXMgbm8gZWZmZWN0LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e3ZvaWR9e1B5RXJyX0ZldGNofXtQeU9iamVjdCAqKnB0eXBlLCBQeU9iamVjdCAqKnB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqKnB0cmFjZWJhY2t9Ci0gIFJldHJpZXZlIHRoZSBlcnJvciBpbmRpY2F0b3IgaW50byB0aHJlZSB2YXJpYWJsZXMgd2hvc2UgYWRkcmVzc2VzCi0gIGFyZSBwYXNzZWQuICBJZiB0aGUgZXJyb3IgaW5kaWNhdG9yIGlzIG5vdCBzZXQsIHNldCBhbGwgdGhyZWUKLSAgdmFyaWFibGVzIHRvIFxOVUxMLiAgSWYgaXQgaXMgc2V0LCBpdCB3aWxsIGJlIGNsZWFyZWQgYW5kIHlvdSBvd24gYQotICByZWZlcmVuY2UgdG8gZWFjaCBvYmplY3QgcmV0cmlldmVkLiAgVGhlIHZhbHVlIGFuZCB0cmFjZWJhY2sgb2JqZWN0Ci0gIG1heSBiZSBcTlVMTHt9IGV2ZW4gd2hlbiB0aGUgdHlwZSBvYmplY3QgaXMgbm90LiAgXG5vdGV7VGhpcwotICBmdW5jdGlvbiBpcyBub3JtYWxseSBvbmx5IHVzZWQgYnkgY29kZSB0aGF0IG5lZWRzIHRvIGhhbmRsZQotICBleGNlcHRpb25zIG9yIGJ5IGNvZGUgdGhhdCBuZWVkcyB0byBzYXZlIGFuZCByZXN0b3JlIHRoZSBlcnJvcgotICBpbmRpY2F0b3IgdGVtcG9yYXJpbHkufQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e3ZvaWR9e1B5RXJyX1Jlc3RvcmV9e1B5T2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqdHJhY2ViYWNrfQotICBTZXQgIHRoZSBlcnJvciBpbmRpY2F0b3IgZnJvbSB0aGUgdGhyZWUgb2JqZWN0cy4gIElmIHRoZSBlcnJvcgotICBpbmRpY2F0b3IgaXMgYWxyZWFkeSBzZXQsIGl0IGlzIGNsZWFyZWQgZmlyc3QuICBJZiB0aGUgb2JqZWN0cyBhcmUKLSAgXE5VTEwsIHRoZSBlcnJvciBpbmRpY2F0b3IgaXMgY2xlYXJlZC4gIERvIG5vdCBwYXNzIGEgXE5VTEx7fSB0eXBlCi0gIGFuZCBub24tXE5VTEx7fSB2YWx1ZSBvciB0cmFjZWJhY2suICBUaGUgZXhjZXB0aW9uIHR5cGUgc2hvdWxkIGJlIGEKLSAgY2xhc3MuICBEbyBub3QgcGFzcyBhbiBpbnZhbGlkIGV4Y2VwdGlvbiB0eXBlIG9yIHZhbHVlLgotICAoVmlvbGF0aW5nIHRoZXNlIHJ1bGVzIHdpbGwgY2F1c2Ugc3VidGxlIHByb2JsZW1zIGxhdGVyLikgIFRoaXMgY2FsbAotICB0YWtlcyBhd2F5IGEgcmVmZXJlbmNlIHRvIGVhY2ggb2JqZWN0OiB5b3UgbXVzdCBvd24gYSByZWZlcmVuY2UgdG8KLSAgZWFjaCBvYmplY3QgYmVmb3JlIHRoZSBjYWxsIGFuZCBhZnRlciB0aGUgY2FsbCB5b3Ugbm8gbG9uZ2VyIG93bgotICB0aGVzZSByZWZlcmVuY2VzLiAgKElmIHlvdSBkb24ndCB1bmRlcnN0YW5kIHRoaXMsIGRvbid0IHVzZSB0aGlzCi0gIGZ1bmN0aW9uLiAgSSB3YXJuZWQgeW91LikgIFxub3Rle1RoaXMgZnVuY3Rpb24gaXMgbm9ybWFsbHkgb25seSB1c2VkCi0gIGJ5IGNvZGUgdGhhdCBuZWVkcyB0byBzYXZlIGFuZCByZXN0b3JlIHRoZSBlcnJvciBpbmRpY2F0b3IKLSAgdGVtcG9yYXJpbHk7IHVzZSBcY2Z1bmN0aW9ue1B5RXJyX0ZldGNoKCl9IHRvIHNhdmUgdGhlIGN1cnJlbnQKLSAgZXhjZXB0aW9uIHN0YXRlLn0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXt2b2lkfXtQeUVycl9TZXRTdHJpbmd9e1B5T2JqZWN0ICp0eXBlLCBjb25zdCBjaGFyICptZXNzYWdlfQotICBUaGlzIGlzIHRoZSBtb3N0IGNvbW1vbiB3YXkgdG8gc2V0IHRoZSBlcnJvciBpbmRpY2F0b3IuICBUaGUgZmlyc3QKLSAgYXJndW1lbnQgc3BlY2lmaWVzIHRoZSBleGNlcHRpb24gdHlwZTsgaXQgaXMgbm9ybWFsbHkgb25lIG9mIHRoZQotICBzdGFuZGFyZCBleGNlcHRpb25zLCBlLmcuIFxjZGF0YXtQeUV4Y19SdW50aW1lRXJyb3J9LiAgWW91IG5lZWQgbm90Ci0gIGluY3JlbWVudCBpdHMgcmVmZXJlbmNlIGNvdW50LiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyBhbiBlcnJvcgotICBtZXNzYWdlOyBpdCBpcyBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgb2JqZWN0LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e3ZvaWR9e1B5RXJyX1NldE9iamVjdH17UHlPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICp2YWx1ZX0KLSAgVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIFxjZnVuY3Rpb257UHlFcnJfU2V0U3RyaW5nKCl9IGJ1dCBsZXRzCi0gIHlvdSBzcGVjaWZ5IGFuIGFyYml0cmFyeSBQeXRob24gb2JqZWN0IGZvciB0aGUgYGB2YWx1ZScnIG9mIHRoZQotICBleGNlcHRpb24uCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeUVycl9Gb3JtYXR9e1B5T2JqZWN0ICpleGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCBcbW9yZWFyZ3N9Ci0gIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgZXJyb3IgaW5kaWNhdG9yIGFuZCByZXR1cm5zIFxOVUxMLgotICBcdmFye2V4Y2VwdGlvbn0gc2hvdWxkIGJlIGEgUHl0aG9uIGV4Y2VwdGlvbiAoY2xhc3MsIG5vdAotICBhbiBpbnN0YW5jZSkuICBcdmFye2Zvcm1hdH0gc2hvdWxkIGJlIGEgc3RyaW5nLCBjb250YWluaW5nIGZvcm1hdAotICBjb2Rlcywgc2ltaWxhciB0byBcY2Z1bmN0aW9ue3ByaW50ZigpfS4gVGhlIFxjb2Rle3dpZHRoLnByZWNpc2lvbn0KLSAgYmVmb3JlIGEgZm9ybWF0IGNvZGUgaXMgcGFyc2VkLCBidXQgdGhlIHdpZHRoIHBhcnQgaXMgaWdub3JlZC4KLQotICAlIFRoaXMgc2hvdWxkIGJlIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIHRhYmxlIGluIFB5U3RyaW5nX0Zyb21Gb3JtYXQuCi0gICUgT25lIHNob3VsZCBqdXN0IHJlZmVyIHRvIHRoZSBvdGhlci4KLQotICAlIFRoZSBkZXNjcmlwdGlvbnMgZm9yICV6ZCBhbmQgJXp1IGFyZSB3cm9uZywgYnV0IHRoZSB0cnV0aCBpcyBjb21wbGljYXRlZAotICAlIGJlY2F1c2Ugbm90IGFsbCBjb21waWxlcnMgc3VwcG9ydCB0aGUgJXogd2lkdGggbW9kaWZpZXIgLS0gd2UgZmFrZSBpdAotICAlIHdoZW4gbmVjZXNzYXJ5IHZpYSBpbnRlcnBvbGF0aW5nIFBZX0ZPUk1BVF9TSVpFX1QuCi0KLSAgJSAldSwgJWx1LCAlenUgc2hvdWxkIGhhdmUgIm5ldyBpbiBQeXRob24gMi41IiBibHVyYnMuCi0KLSAgXGJlZ2lue3RhYmxlaWlpfXtsfGx8bH17bWVtYmVyfXtGb3JtYXQgQ2hhcmFjdGVyc317VHlwZX17Q29tbWVudH0KLSAgICBcbGluZWlpaXtcJVwlfXtcZW1waHtuL2F9fXtUaGUgbGl0ZXJhbCBcJSBjaGFyYWN0ZXIufQotICAgIFxsaW5laWlpe1wlY317aW50fXtBIHNpbmdsZSBjaGFyYWN0ZXIsIHJlcHJlc2VudGVkIGFzIGFuIEMgaW50Ln0KLSAgICBcbGluZWlpaXtcJWR9e2ludH17RXhhY3RseSBlcXVpdmFsZW50IHRvIFxjb2Rle3ByaW50ZigiXCVkIil9Ln0KLSAgICBcbGluZWlpaXtcJXV9e3Vuc2lnbmVkIGludH17RXhhY3RseSBlcXVpdmFsZW50IHRvIFxjb2Rle3ByaW50ZigiXCV1Iil9Ln0KLSAgICBcbGluZWlpaXtcJWxkfXtsb25nfXtFeGFjdGx5IGVxdWl2YWxlbnQgdG8gXGNvZGV7cHJpbnRmKCJcJWxkIil9Ln0KLSAgICBcbGluZWlpaXtcJWx1fXt1bnNpZ25lZCBsb25nfXtFeGFjdGx5IGVxdWl2YWxlbnQgdG8gXGNvZGV7cHJpbnRmKCJcJWx1Iil9Ln0KLSAgICBcbGluZWlpaXtcJXpkfXtQeV9zc2l6ZV90fXtFeGFjdGx5IGVxdWl2YWxlbnQgdG8gXGNvZGV7cHJpbnRmKCJcJXpkIil9Ln0KLSAgICBcbGluZWlpaXtcJXp1fXtzaXplX3R9e0V4YWN0bHkgZXF1aXZhbGVudCB0byBcY29kZXtwcmludGYoIlwlenUiKX0ufQotICAgIFxsaW5laWlpe1wlaX17aW50fXtFeGFjdGx5IGVxdWl2YWxlbnQgdG8gXGNvZGV7cHJpbnRmKCJcJWkiKX0ufQotICAgIFxsaW5laWlpe1wleH17aW50fXtFeGFjdGx5IGVxdWl2YWxlbnQgdG8gXGNvZGV7cHJpbnRmKCJcJXgiKX0ufQotICAgIFxsaW5laWlpe1wlc317Y2hhcip9e0EgbnVsbC10ZXJtaW5hdGVkIEMgY2hhcmFjdGVyIGFycmF5Ln0KLSAgICBcbGluZWlpaXtcJXB9e3ZvaWQqfXtUaGUgaGV4IHJlcHJlc2VudGF0aW9uIG9mIGEgQyBwb2ludGVyLgotCU1vc3RseSBlcXVpdmFsZW50IHRvIFxjb2Rle3ByaW50ZigiXCVwIil9IGV4Y2VwdCB0aGF0IGl0IGlzCi0JZ3VhcmFudGVlZCB0byBzdGFydCB3aXRoIHRoZSBsaXRlcmFsIFxjb2RlezB4fSByZWdhcmRsZXNzIG9mCi0Jd2hhdCB0aGUgcGxhdGZvcm0ncyBcY29kZXtwcmludGZ9IHlpZWxkcy59Ci0gIFxlbmR7dGFibGVpaWl9Ci0KLSAgQW4gdW5yZWNvZ25pemVkIGZvcm1hdCBjaGFyYWN0ZXIgY2F1c2VzIGFsbCB0aGUgcmVzdCBvZiB0aGUgZm9ybWF0Ci0gIHN0cmluZyB0byBiZSBjb3BpZWQgYXMtaXMgdG8gdGhlIHJlc3VsdCBzdHJpbmcsIGFuZCBhbnkgZXh0cmEKLSAgYXJndW1lbnRzIGRpc2NhcmRlZC4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXt2b2lkfXtQeUVycl9TZXROb25lfXtQeU9iamVjdCAqdHlwZX0KLSAgVGhpcyBpcyBhIHNob3J0aGFuZCBmb3IgXHNhbXB7UHlFcnJfU2V0T2JqZWN0KFx2YXJ7dHlwZX0sCi0gIFB5X05vbmUpfS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5RXJyX0JhZEFyZ3VtZW50fXt9Ci0gIFRoaXMgaXMgYSBzaG9ydGhhbmQgZm9yIFxzYW1we1B5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0gIFx2YXJ7bWVzc2FnZX0pfSwgd2hlcmUgXHZhcnttZXNzYWdlfSBpbmRpY2F0ZXMgdGhhdCBhIGJ1aWx0LWluCi0gIG9wZXJhdGlvbiB3YXMgaW52b2tlZCB3aXRoIGFuIGlsbGVnYWwgYXJndW1lbnQuICBJdCBpcyBtb3N0bHkgZm9yCi0gIGludGVybmFsIHVzZS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5RXJyX05vTWVtb3J5fXt9Ci0gIFRoaXMgaXMgYSBzaG9ydGhhbmQgZm9yIFxzYW1we1B5RXJyX1NldE5vbmUoUHlFeGNfTWVtb3J5RXJyb3IpfTsgaXQKLSAgcmV0dXJucyBcTlVMTHt9IHNvIGFuIG9iamVjdCBhbGxvY2F0aW9uIGZ1bmN0aW9uIGNhbiB3cml0ZQotICBcc2FtcHtyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTt9IHdoZW4gaXQgcnVucyBvdXQgb2YgbWVtb3J5LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlFcnJfU2V0RnJvbUVycm5vfXtQeU9iamVjdCAqdHlwZX0KLSAgVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIHJhaXNlIGFuIGV4Y2VwdGlvbiB3aGVuIGEgQwotICBsaWJyYXJ5IGZ1bmN0aW9uIGhhcyByZXR1cm5lZCBhbiBlcnJvciBhbmQgc2V0IHRoZSBDIHZhcmlhYmxlCi0gIFxjZGF0YXtlcnJub30uICBJdCBjb25zdHJ1Y3RzIGEgdHVwbGUgb2JqZWN0IHdob3NlIGZpcnN0IGl0ZW0gaXMgdGhlCi0gIGludGVnZXIgXGNkYXRhe2Vycm5vfSB2YWx1ZSBhbmQgd2hvc2Ugc2Vjb25kIGl0ZW0gaXMgdGhlCi0gIGNvcnJlc3BvbmRpbmcgZXJyb3IgbWVzc2FnZSAoZ290dGVuIGZyb20KLSAgXGNmdW5jdGlvbntzdHJlcnJvcigpfVx0dGluZGV4e3N0cmVycm9yKCl9KSwgYW5kIHRoZW4gY2FsbHMKLSAgXHNhbXB7UHlFcnJfU2V0T2JqZWN0KFx2YXJ7dHlwZX0sIFx2YXJ7b2JqZWN0fSl9LiAgT24gXFVOSVgsIHdoZW4KLSAgdGhlIFxjZGF0YXtlcnJub30gdmFsdWUgaXMgXGNvbnN0YW50e0VJTlRSfSwgaW5kaWNhdGluZyBhbgotICBpbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbCwgdGhpcyBjYWxscwotICBcY2Z1bmN0aW9ue1B5RXJyX0NoZWNrU2lnbmFscygpfSwgYW5kIGlmIHRoYXQgc2V0IHRoZSBlcnJvcgotICBpbmRpY2F0b3IsIGxlYXZlcyBpdCBzZXQgdG8gdGhhdC4gIFRoZSBmdW5jdGlvbiBhbHdheXMgcmV0dXJucwotICBcTlVMTCwgc28gYSB3cmFwcGVyIGZ1bmN0aW9uIGFyb3VuZCBhIHN5c3RlbSBjYWxsIGNhbiB3cml0ZQotICBcc2FtcHtyZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFx2YXJ7dHlwZX0pO30gd2hlbiB0aGUgc3lzdGVtIGNhbGwKLSAgcmV0dXJucyBhbiBlcnJvci4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZX17UHlPYmplY3QgKnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWV9Ci0gIFNpbWlsYXIgdG8gXGNmdW5jdGlvbntQeUVycl9TZXRGcm9tRXJybm8oKX0sIHdpdGggdGhlIGFkZGl0aW9uYWwKLSAgYmVoYXZpb3IgdGhhdCBpZiBcdmFye2ZpbGVuYW1lfSBpcyBub3QgXE5VTEwsIGl0IGlzIHBhc3NlZCB0byB0aGUKLSAgY29uc3RydWN0b3Igb2YgXHZhcnt0eXBlfSBhcyBhIHRoaXJkIHBhcmFtZXRlci4gIEluIHRoZSBjYXNlIG9mCi0gIGV4Y2VwdGlvbnMgc3VjaCBhcyBcZXhjZXB0aW9ue0lPRXJyb3J9IGFuZCBcZXhjZXB0aW9ue09TRXJyb3J9LCB0aGlzCi0gIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBcbWVtYmVye2ZpbGVuYW1lfSBhdHRyaWJ1dGUgb2YgdGhlIGV4Y2VwdGlvbgotICBpbnN0YW5jZS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5RXJyX1NldEZyb21XaW5kb3dzRXJyfXtpbnQgaWVycn0KLSAgVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIHJhaXNlIFxleGNlcHRpb257V2luZG93c0Vycm9yfS4KLSAgSWYgY2FsbGVkIHdpdGggXHZhcntpZXJyfSBvZiBcY2RhdGF7MH0sIHRoZSBlcnJvciBjb2RlIHJldHVybmVkIGJ5IGEKLSAgY2FsbCB0byBcY2Z1bmN0aW9ue0dldExhc3RFcnJvcigpfSBpcyB1c2VkIGluc3RlYWQuICBJdCBjYWxscyB0aGUKLSAgV2luMzIgZnVuY3Rpb24gXGNmdW5jdGlvbntGb3JtYXRNZXNzYWdlKCl9IHRvIHJldHJpZXZlIHRoZSBXaW5kb3dzCi0gIGRlc2NyaXB0aW9uIG9mIGVycm9yIGNvZGUgZ2l2ZW4gYnkgXHZhcntpZXJyfSBvcgotICBcY2Z1bmN0aW9ue0dldExhc3RFcnJvcigpfSwgdGhlbiBpdCBjb25zdHJ1Y3RzIGEgdHVwbGUgb2JqZWN0IHdob3NlCi0gIGZpcnN0IGl0ZW0gaXMgdGhlIFx2YXJ7aWVycn0gdmFsdWUgYW5kIHdob3NlIHNlY29uZCBpdGVtIGlzIHRoZQotICBjb3JyZXNwb25kaW5nIGVycm9yIG1lc3NhZ2UgKGdvdHRlbiBmcm9tCi0gIFxjZnVuY3Rpb257Rm9ybWF0TWVzc2FnZSgpfSksIGFuZCB0aGVuIGNhbGxzCi0gIFxzYW1we1B5RXJyX1NldE9iamVjdChcdmFye1B5RXhjX1dpbmRvd3NFcnJvcn0sIFx2YXJ7b2JqZWN0fSl9LgotICBUaGlzIGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5zIFxOVUxMLgotICBBdmFpbGFiaWxpdHk6IFdpbmRvd3MuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeUVycl9TZXRFeGNGcm9tV2luZG93c0Vycn17UHlPYmplY3QgKnR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZXJyfQotICBTaW1pbGFyIHRvIFxjZnVuY3Rpb257UHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoKX0sIHdpdGggYW4gYWRkaXRpb25hbAotICBwYXJhbWV0ZXIgc3BlY2lmeWluZyB0aGUgZXhjZXB0aW9uIHR5cGUgdG8gYmUgcmFpc2VkLgotICBBdmFpbGFiaWxpdHk6IFdpbmRvd3MuCi0gIFx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWV9e2ludCBpZXJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lfQotICBTaW1pbGFyIHRvIFxjZnVuY3Rpb257UHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoKX0sIHdpdGggdGhlCi0gIGFkZGl0aW9uYWwgYmVoYXZpb3IgdGhhdCBpZiBcdmFye2ZpbGVuYW1lfSBpcyBub3QgXE5VTEwsIGl0IGlzCi0gIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3Igb2YgXGV4Y2VwdGlvbntXaW5kb3dzRXJyb3J9IGFzIGEgdGhpcmQKLSAgcGFyYW1ldGVyLgotICBBdmFpbGFiaWxpdHk6IFdpbmRvd3MuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZX0KLQl7UHlPYmplY3QgKnR5cGUsIGludCBpZXJyLCBjaGFyICpmaWxlbmFtZX0KLSAgU2ltaWxhciB0byBcY2Z1bmN0aW9ue1B5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lKCl9LCB3aXRoCi0gIGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyIHNwZWNpZnlpbmcgdGhlIGV4Y2VwdGlvbiB0eXBlIHRvIGJlIHJhaXNlZC4KLSAgQXZhaWxhYmlsaXR5OiBXaW5kb3dzLgotICBcdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXt2b2lkfXtQeUVycl9CYWRJbnRlcm5hbENhbGx9e30KLSAgVGhpcyBpcyBhIHNob3J0aGFuZCBmb3IgXHNhbXB7UHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLSAgXHZhcnttZXNzYWdlfSl9LCB3aGVyZSBcdmFye21lc3NhZ2V9IGluZGljYXRlcyB0aGF0IGFuIGludGVybmFsCi0gIG9wZXJhdGlvbiAoZS5nLiBhIFB5dGhvbi9DIEFQSSBmdW5jdGlvbikgd2FzIGludm9rZWQgd2l0aCBhbiBpbGxlZ2FsCi0gIGFyZ3VtZW50LiAgSXQgaXMgbW9zdGx5IGZvciBpbnRlcm5hbCB1c2UuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeUVycl9XYXJuRXh9e1B5T2JqZWN0ICpjYXRlZ29yeSwgY2hhciAqbWVzc2FnZSwgaW50IHN0YWNrbGV2ZWx9Ci0gIElzc3VlIGEgd2FybmluZyBtZXNzYWdlLiAgVGhlIFx2YXJ7Y2F0ZWdvcnl9IGFyZ3VtZW50IGlzIGEgd2FybmluZwotICBjYXRlZ29yeSAoc2VlIGJlbG93KSBvciBcTlVMTDsgdGhlIFx2YXJ7bWVzc2FnZX0gYXJndW1lbnQgaXMgYQotICBtZXNzYWdlIHN0cmluZy4gIFx2YXJ7c3RhY2tsZXZlbH0gaXMgYSBwb3NpdGl2ZSBudW1iZXIgZ2l2aW5nIGEKLSAgbnVtYmVyIG9mIHN0YWNrIGZyYW1lczsgdGhlIHdhcm5pbmcgd2lsbCBiZSBpc3N1ZWQgZnJvbSB0aGUgCi0gIGN1cnJlbnRseSBleGVjdXRpbmcgbGluZSBvZiBjb2RlIGluIHRoYXQgc3RhY2sgZnJhbWUuICBBIFx2YXJ7c3RhY2tsZXZlbH0KLSAgb2YgMSBpcyB0aGUgZnVuY3Rpb24gY2FsbGluZyBcY2Z1bmN0aW9ue1B5RXJyX1dhcm5FeCgpfSwgMiBpcyAKLSAgdGhlIGZ1bmN0aW9uIGFib3ZlIHRoYXQsIGFuZCBzbyBmb3J0aC4KLQotICBUaGlzIGZ1bmN0aW9uIG5vcm1hbGx5IHByaW50cyBhIHdhcm5pbmcgbWVzc2FnZSB0byBcdmFye3N5cy5zdGRlcnJ9OwotICBob3dldmVyLCBpdCBpcyBhbHNvIHBvc3NpYmxlIHRoYXQgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCB0aGF0Ci0gIHdhcm5pbmdzIGFyZSB0byBiZSB0dXJuZWQgaW50byBlcnJvcnMsIGFuZCBpbiB0aGF0IGNhc2UgdGhpcyB3aWxsCi0gIHJhaXNlIGFuIGV4Y2VwdGlvbi4gIEl0IGlzIGFsc28gcG9zc2libGUgdGhhdCB0aGUgZnVuY3Rpb24gcmFpc2VzIGFuCi0gIGV4Y2VwdGlvbiBiZWNhdXNlIG9mIGEgcHJvYmxlbSB3aXRoIHRoZSB3YXJuaW5nIG1hY2hpbmVyeSAodGhlCi0gIGltcGxlbWVudGF0aW9uIGltcG9ydHMgdGhlIFxtb2R1bGV7d2FybmluZ3N9IG1vZHVsZSB0byBkbyB0aGUgaGVhdnkKLSAgbGlmdGluZykuICBUaGUgcmV0dXJuIHZhbHVlIGlzIFxjb2RlezB9IGlmIG5vIGV4Y2VwdGlvbiBpcyByYWlzZWQsCi0gIG9yIFxjb2Rley0xfSBpZiBhbiBleGNlcHRpb24gaXMgcmFpc2VkLiAgKEl0IGlzIG5vdCBwb3NzaWJsZSB0bwotICBkZXRlcm1pbmUgd2hldGhlciBhIHdhcm5pbmcgbWVzc2FnZSBpcyBhY3R1YWxseSBwcmludGVkLCBub3Igd2hhdAotICB0aGUgcmVhc29uIGlzIGZvciB0aGUgZXhjZXB0aW9uOyB0aGlzIGlzIGludGVudGlvbmFsLikgIElmIGFuCi0gIGV4Y2VwdGlvbiBpcyByYWlzZWQsIHRoZSBjYWxsZXIgc2hvdWxkIGRvIGl0cyBub3JtYWwgZXhjZXB0aW9uCi0gIGhhbmRsaW5nIChmb3IgZXhhbXBsZSwgXGNmdW5jdGlvbntQeV9ERUNSRUYoKX0gb3duZWQgcmVmZXJlbmNlcyBhbmQKLSAgcmV0dXJuIGFuIGVycm9yIHZhbHVlKS4KLQotICBXYXJuaW5nIGNhdGVnb3JpZXMgbXVzdCBiZSBzdWJjbGFzc2VzIG9mIFxjZGF0YXtXYXJuaW5nfTsgdGhlCi0gIGRlZmF1bHQgd2FybmluZyBjYXRlZ29yeSBpcyBcY2RhdGF7UnVudGltZVdhcm5pbmd9LiAgVGhlIHN0YW5kYXJkCi0gIFB5dGhvbiB3YXJuaW5nIGNhdGVnb3JpZXMgYXJlIGF2YWlsYWJsZSBhcyBnbG9iYWwgdmFyaWFibGVzIHdob3NlCi0gIG5hbWVzIGFyZSBcc2FtcHtQeUV4Y199IGZvbGxvd2VkIGJ5IHRoZSBQeXRob24gZXhjZXB0aW9uIG5hbWUuCi0gIFRoZXNlIGhhdmUgdGhlIHR5cGUgXGN0eXBle1B5T2JqZWN0Kn07IHRoZXkgYXJlIGFsbCBjbGFzcyBvYmplY3RzLgotICBUaGVpciBuYW1lcyBhcmUgXGNkYXRhe1B5RXhjX1dhcm5pbmd9LCBcY2RhdGF7UHlFeGNfVXNlcldhcm5pbmd9LAotICBcY2RhdGF7UHlFeGNfVW5pY29kZVdhcm5pbmd9LCBcY2RhdGF7UHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nfSwKLSAgXGNkYXRhe1B5RXhjX1N5bnRheFdhcm5pbmd9LCBcY2RhdGF7UHlFeGNfUnVudGltZVdhcm5pbmd9LCBhbmQKLSAgXGNkYXRhe1B5RXhjX0Z1dHVyZVdhcm5pbmd9LiAgXGNkYXRhe1B5RXhjX1dhcm5pbmd9IGlzIGEgc3ViY2xhc3Mgb2YKLSAgXGNkYXRhe1B5RXhjX0V4Y2VwdGlvbn07IHRoZSBvdGhlciB3YXJuaW5nIGNhdGVnb3JpZXMgYXJlIHN1YmNsYXNzZXMKLSAgb2YgXGNkYXRhe1B5RXhjX1dhcm5pbmd9LgotCi0gIEZvciBpbmZvcm1hdGlvbiBhYm91dCB3YXJuaW5nIGNvbnRyb2wsIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlCi0gIFxtb2R1bGV7d2FybmluZ3N9IG1vZHVsZSBhbmQgdGhlIFxwcm9ncmFtb3B0ey1XfSBvcHRpb24gaW4gdGhlCi0gIGNvbW1hbmQgbGluZSBkb2N1bWVudGF0aW9uLiAgVGhlcmUgaXMgbm8gQyBBUEkgZm9yIHdhcm5pbmcgY29udHJvbC4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5RXJyX1dhcm5FeHBsaWNpdH17UHlPYmplY3QgKmNhdGVnb3J5LAotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgbGluZW5vLAotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1vZHVsZSwgUHlPYmplY3QgKnJlZ2lzdHJ5fQotICBJc3N1ZSBhIHdhcm5pbmcgbWVzc2FnZSB3aXRoIGV4cGxpY2l0IGNvbnRyb2wgb3ZlciBhbGwgd2FybmluZwotICBhdHRyaWJ1dGVzLiAgVGhpcyBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCB3cmFwcGVyIGFyb3VuZCB0aGUgUHl0aG9uCi0gIGZ1bmN0aW9uIFxmdW5jdGlvbnt3YXJuaW5ncy53YXJuX2V4cGxpY2l0KCl9LCBzZWUgdGhlcmUgZm9yIG1vcmUKLSAgaW5mb3JtYXRpb24uICBUaGUgXHZhcnttb2R1bGV9IGFuZCBcdmFye3JlZ2lzdHJ5fSBhcmd1bWVudHMgbWF5IGJlCi0gIHNldCB0byBcTlVMTHt9IHRvIGdldCB0aGUgZGVmYXVsdCBlZmZlY3QgZGVzY3JpYmVkIHRoZXJlLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlFcnJfQ2hlY2tTaWduYWxzfXt9Ci0gIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggUHl0aG9uJ3Mgc2lnbmFsIGhhbmRsaW5nLiAgSXQgY2hlY2tzCi0gIHdoZXRoZXIgYSBzaWduYWwgaGFzIGJlZW4gc2VudCB0byB0aGUgcHJvY2Vzc2VzIGFuZCBpZiBzbywgaW52b2tlcwotICB0aGUgY29ycmVzcG9uZGluZyBzaWduYWwgaGFuZGxlci4gIElmIHRoZQotICBcbW9kdWxle3NpZ25hbH1ccmVmYmltb2RpbmRleHtzaWduYWx9IG1vZHVsZSBpcyBzdXBwb3J0ZWQsIHRoaXMgY2FuCi0gIGludm9rZSBhIHNpZ25hbCBoYW5kbGVyIHdyaXR0ZW4gaW4gUHl0aG9uLiAgSW4gYWxsIGNhc2VzLCB0aGUKLSAgZGVmYXVsdCBlZmZlY3QgZm9yIFxjb25zdGFudHtTSUdJTlR9XHR0aW5kZXh7U0lHSU5UfSBpcyB0byByYWlzZSB0aGUKLSAgXHdpdGhzdWJpdGVteyhidWlsdC1pbiBleGNlcHRpb24pfXtcdHRpbmRleHtLZXlib2FyZEludGVycnVwdH19Ci0gIFxleGNlcHRpb257S2V5Ym9hcmRJbnRlcnJ1cHR9IGV4Y2VwdGlvbi4gIElmIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQKLSAgdGhlIGVycm9yIGluZGljYXRvciBpcyBzZXQgYW5kIHRoZSBmdW5jdGlvbiByZXR1cm5zIFxjb2Rley0xfTsKLSAgb3RoZXJ3aXNlIHRoZSBmdW5jdGlvbiByZXR1cm5zIFxjb2RlezB9LiAgVGhlIGVycm9yIGluZGljYXRvciBtYXkgb3IKLSAgbWF5IG5vdCBiZSBjbGVhcmVkIGlmIGl0IHdhcyBwcmV2aW91c2x5IHNldC4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXt2b2lkfXtQeUVycl9TZXRJbnRlcnJ1cHR9e30KLSAgVGhpcyBmdW5jdGlvbiBzaW11bGF0ZXMgdGhlIGVmZmVjdCBvZiBhCi0gIFxjb25zdGFudHtTSUdJTlR9XHR0aW5kZXh7U0lHSU5UfSBzaWduYWwgYXJyaXZpbmcgLS0tIHRoZSBuZXh0IHRpbWUKLSAgXGNmdW5jdGlvbntQeUVycl9DaGVja1NpZ25hbHMoKX0gaXMgY2FsbGVkLAotICBcd2l0aHN1Yml0ZW17KGJ1aWx0LWluIGV4Y2VwdGlvbil9e1x0dGluZGV4e0tleWJvYXJkSW50ZXJydXB0fX0KLSAgXGV4Y2VwdGlvbntLZXlib2FyZEludGVycnVwdH0gd2lsbCBiZSByYWlzZWQuICBJdCBtYXkgYmUgY2FsbGVkCi0gIHdpdGhvdXQgaG9sZGluZyB0aGUgaW50ZXJwcmV0ZXIgbG9jay4KLSAgJSBYWFggVGhpcyB3YXMgZGVzY3JpYmVkIGFzIG9ic29sZXRlLCBidXQgaXMgdXNlZCBpbgotICAlIHRocmVhZC5pbnRlcnJ1cHRfbWFpbigpICh1c2VkIGZyb20gSURMRSksIHNvIGl0J3Mgc3RpbGwgbmVlZGVkLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlFcnJfTmV3RXhjZXB0aW9ufXtjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpkaWN0fQotICBUaGlzIHV0aWxpdHkgZnVuY3Rpb24gY3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBleGNlcHRpb24gb2JqZWN0LgotICBUaGUgXHZhcntuYW1lfSBhcmd1bWVudCBtdXN0IGJlIHRoZSBuYW1lIG9mIHRoZSBuZXcgZXhjZXB0aW9uLCBhIEMKLSAgc3RyaW5nIG9mIHRoZSBmb3JtIFxjb2Rle21vZHVsZS5jbGFzc30uICBUaGUgXHZhcntiYXNlfSBhbmQKLSAgXHZhcntkaWN0fSBhcmd1bWVudHMgYXJlIG5vcm1hbGx5IFxOVUxMLiAgVGhpcyBjcmVhdGVzIGEgY2xhc3MKLSAgb2JqZWN0IGRlcml2ZWQgZnJvbSBcZXhjZXB0aW9ue0V4Y2VwdGlvbn0gKGFjY2Vzc2libGUgaW4gQyBhcwotICBcY2RhdGF7UHlFeGNfRXhjZXB0aW9ufSkuCi0KLSAgVGhlIFxtZW1iZXJ7X19tb2R1bGVfX30gYXR0cmlidXRlIG9mIHRoZSBuZXcgY2xhc3MgaXMgc2V0IHRvIHRoZQotICBmaXJzdCBwYXJ0ICh1cCB0byB0aGUgbGFzdCBkb3QpIG9mIHRoZSBcdmFye25hbWV9IGFyZ3VtZW50LCBhbmQgdGhlCi0gIGNsYXNzIG5hbWUgaXMgc2V0IHRvIHRoZSBsYXN0IHBhcnQgKGFmdGVyIHRoZSBsYXN0IGRvdCkuICBUaGUKLSAgXHZhcntiYXNlfSBhcmd1bWVudCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFsdGVybmF0ZSBiYXNlIGNsYXNzZXM7Ci0gIGl0IGNhbiBlaXRoZXIgYmUgb25seSBvbmUgY2xhc3Mgb3IgYSB0dXBsZSBvZiBjbGFzc2VzLgotICBUaGUgXHZhcntkaWN0fSBhcmd1bWVudCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgZGljdGlvbmFyeSBvZiBjbGFzcwotICB2YXJpYWJsZXMgYW5kIG1ldGhvZHMuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317dm9pZH17UHlFcnJfV3JpdGVVbnJhaXNhYmxlfXtQeU9iamVjdCAqb2JqfQotICBUaGlzIHV0aWxpdHkgZnVuY3Rpb24gcHJpbnRzIGEgd2FybmluZyBtZXNzYWdlIHRvIFxjb2Rle3N5cy5zdGRlcnJ9Ci0gIHdoZW4gYW4gZXhjZXB0aW9uIGhhcyBiZWVuIHNldCBidXQgaXQgaXMgaW1wb3NzaWJsZSBmb3IgdGhlCi0gIGludGVycHJldGVyIHRvIGFjdHVhbGx5IHJhaXNlIHRoZSBleGNlcHRpb24uICBJdCBpcyB1c2VkLCBmb3IKLSAgZXhhbXBsZSwgd2hlbiBhbiBleGNlcHRpb24gb2NjdXJzIGluIGFuIFxtZXRob2R7X19kZWxfXygpfSBtZXRob2QuCi0KLSAgVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGEgc2luZ2xlIGFyZ3VtZW50IFx2YXJ7b2JqfSB0aGF0Ci0gIGlkZW50aWZpZXMgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHVucmFpc2FibGUgZXhjZXB0aW9uIG9jY3VycmVkLgotICBUaGUgcmVwciBvZiBcdmFye29ian0gd2lsbCBiZSBwcmludGVkIGluIHRoZSB3YXJuaW5nIG1lc3NhZ2UuCi1cZW5ke2NmdW5jZGVzY30KLQotXHNlY3Rpb257U3RhbmRhcmQgRXhjZXB0aW9ucyBcbGFiZWx7c3RhbmRhcmRFeGNlcHRpb25zfX0KLQotQWxsIHN0YW5kYXJkIFB5dGhvbiBleGNlcHRpb25zIGFyZSBhdmFpbGFibGUgYXMgZ2xvYmFsIHZhcmlhYmxlcyB3aG9zZQotbmFtZXMgYXJlIFxzYW1we1B5RXhjX30gZm9sbG93ZWQgYnkgdGhlIFB5dGhvbiBleGNlcHRpb24gbmFtZS4gIFRoZXNlCi1oYXZlIHRoZSB0eXBlIFxjdHlwZXtQeU9iamVjdCp9OyB0aGV5IGFyZSBhbGwgY2xhc3Mgb2JqZWN0cy4gIEZvcgotY29tcGxldGVuZXNzLCBoZXJlIGFyZSBhbGwgdGhlIHZhcmlhYmxlczoKLQotXGJlZ2lue3RhYmxlaWlpfXtsfGx8Y317Y2RhdGF9e0MgTmFtZX17UHl0aG9uIE5hbWV9e05vdGVzfQotICBcbGluZWlpaXtQeUV4Y19CYXNlRXhjZXB0aW9uXHR0aW5kZXh7UHlFeGNfQmFzZUV4Y2VwdGlvbn19e1xleGNlcHRpb257QmFzZUV4Y2VwdGlvbn19eygxKSwgKDQpfQotICBcbGluZWlpaXtQeUV4Y19FeGNlcHRpb25cdHRpbmRleHtQeUV4Y19FeGNlcHRpb259fXtcZXhjZXB0aW9ue0V4Y2VwdGlvbn19eygxKX0KLSAgXGxpbmVpaWl7UHlFeGNfQXJpdGhtZXRpY0Vycm9yXHR0aW5kZXh7UHlFeGNfQXJpdGhtZXRpY0Vycm9yfX17XGV4Y2VwdGlvbntBcml0aG1ldGljRXJyb3J9fXsoMSl9Ci0gIFxsaW5laWlpe1B5RXhjX0xvb2t1cEVycm9yXHR0aW5kZXh7UHlFeGNfTG9va3VwRXJyb3J9fXtcZXhjZXB0aW9ue0xvb2t1cEVycm9yfX17KDEpfQotICBcbGluZWlpaXtQeUV4Y19Bc3NlcnRpb25FcnJvclx0dGluZGV4e1B5RXhjX0Fzc2VydGlvbkVycm9yfX17XGV4Y2VwdGlvbntBc3NlcnRpb25FcnJvcn19e30KLSAgXGxpbmVpaWl7UHlFeGNfQXR0cmlidXRlRXJyb3JcdHRpbmRleHtQeUV4Y19BdHRyaWJ1dGVFcnJvcn19e1xleGNlcHRpb257QXR0cmlidXRlRXJyb3J9fXt9Ci0gIFxsaW5laWlpe1B5RXhjX0VPRkVycm9yXHR0aW5kZXh7UHlFeGNfRU9GRXJyb3J9fXtcZXhjZXB0aW9ue0VPRkVycm9yfX17fQotICBcbGluZWlpaXtQeUV4Y19FbnZpcm9ubWVudEVycm9yXHR0aW5kZXh7UHlFeGNfRW52aXJvbm1lbnRFcnJvcn19e1xleGNlcHRpb257RW52aXJvbm1lbnRFcnJvcn19eygxKX0KLSAgXGxpbmVpaWl7UHlFeGNfRmxvYXRpbmdQb2ludEVycm9yXHR0aW5kZXh7UHlFeGNfRmxvYXRpbmdQb2ludEVycm9yfX17XGV4Y2VwdGlvbntGbG9hdGluZ1BvaW50RXJyb3J9fXt9Ci0gIFxsaW5laWlpe1B5RXhjX0lPRXJyb3JcdHRpbmRleHtQeUV4Y19JT0Vycm9yfX17XGV4Y2VwdGlvbntJT0Vycm9yfX17fQotICBcbGluZWlpaXtQeUV4Y19JbXBvcnRFcnJvclx0dGluZGV4e1B5RXhjX0ltcG9ydEVycm9yfX17XGV4Y2VwdGlvbntJbXBvcnRFcnJvcn19e30KLSAgXGxpbmVpaWl7UHlFeGNfSW5kZXhFcnJvclx0dGluZGV4e1B5RXhjX0luZGV4RXJyb3J9fXtcZXhjZXB0aW9ue0luZGV4RXJyb3J9fXt9Ci0gIFxsaW5laWlpe1B5RXhjX0tleUVycm9yXHR0aW5kZXh7UHlFeGNfS2V5RXJyb3J9fXtcZXhjZXB0aW9ue0tleUVycm9yfX17fQotICBcbGluZWlpaXtQeUV4Y19LZXlib2FyZEludGVycnVwdFx0dGluZGV4e1B5RXhjX0tleWJvYXJkSW50ZXJydXB0fX17XGV4Y2VwdGlvbntLZXlib2FyZEludGVycnVwdH19e30KLSAgXGxpbmVpaWl7UHlFeGNfTWVtb3J5RXJyb3JcdHRpbmRleHtQeUV4Y19NZW1vcnlFcnJvcn19e1xleGNlcHRpb257TWVtb3J5RXJyb3J9fXt9Ci0gIFxsaW5laWlpe1B5RXhjX05hbWVFcnJvclx0dGluZGV4e1B5RXhjX05hbWVFcnJvcn19e1xleGNlcHRpb257TmFtZUVycm9yfX17fQotICBcbGluZWlpaXtQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yXHR0aW5kZXh7UHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvcn19e1xleGNlcHRpb257Tm90SW1wbGVtZW50ZWRFcnJvcn19e30KLSAgXGxpbmVpaWl7UHlFeGNfT1NFcnJvclx0dGluZGV4e1B5RXhjX09TRXJyb3J9fXtcZXhjZXB0aW9ue09TRXJyb3J9fXt9Ci0gIFxsaW5laWlpe1B5RXhjX092ZXJmbG93RXJyb3JcdHRpbmRleHtQeUV4Y19PdmVyZmxvd0Vycm9yfX17XGV4Y2VwdGlvbntPdmVyZmxvd0Vycm9yfX17fQotICBcbGluZWlpaXtQeUV4Y19SZWZlcmVuY2VFcnJvclx0dGluZGV4e1B5RXhjX1JlZmVyZW5jZUVycm9yfX17XGV4Y2VwdGlvbntSZWZlcmVuY2VFcnJvcn19eygyKX0KLSAgXGxpbmVpaWl7UHlFeGNfUnVudGltZUVycm9yXHR0aW5kZXh7UHlFeGNfUnVudGltZUVycm9yfX17XGV4Y2VwdGlvbntSdW50aW1lRXJyb3J9fXt9Ci0gIFxsaW5laWlpe1B5RXhjX1N5bnRheEVycm9yXHR0aW5kZXh7UHlFeGNfU3ludGF4RXJyb3J9fXtcZXhjZXB0aW9ue1N5bnRheEVycm9yfX17fQotICBcbGluZWlpaXtQeUV4Y19TeXN0ZW1FcnJvclx0dGluZGV4e1B5RXhjX1N5c3RlbUVycm9yfX17XGV4Y2VwdGlvbntTeXN0ZW1FcnJvcn19e30KLSAgXGxpbmVpaWl7UHlFeGNfU3lzdGVtRXhpdFx0dGluZGV4e1B5RXhjX1N5c3RlbUV4aXR9fXtcZXhjZXB0aW9ue1N5c3RlbUV4aXR9fXt9Ci0gIFxsaW5laWlpe1B5RXhjX1R5cGVFcnJvclx0dGluZGV4e1B5RXhjX1R5cGVFcnJvcn19e1xleGNlcHRpb257VHlwZUVycm9yfX17fQotICBcbGluZWlpaXtQeUV4Y19WYWx1ZUVycm9yXHR0aW5kZXh7UHlFeGNfVmFsdWVFcnJvcn19e1xleGNlcHRpb257VmFsdWVFcnJvcn19e30KLSAgXGxpbmVpaWl7UHlFeGNfV2luZG93c0Vycm9yXHR0aW5kZXh7UHlFeGNfV2luZG93c0Vycm9yfX17XGV4Y2VwdGlvbntXaW5kb3dzRXJyb3J9fXsoMyl9Ci0gIFxsaW5laWlpe1B5RXhjX1plcm9EaXZpc2lvbkVycm9yXHR0aW5kZXh7UHlFeGNfWmVyb0RpdmlzaW9uRXJyb3J9fXtcZXhjZXB0aW9ue1plcm9EaXZpc2lvbkVycm9yfX17fQotXGVuZHt0YWJsZWlpaX0KLQotXG5vaW5kZW50Ci1Ob3RlczoKLVxiZWdpbntkZXNjcmlwdGlvbn0KLVxpdGVtWygxKV0KLSAgVGhpcyBpcyBhIGJhc2UgY2xhc3MgZm9yIG90aGVyIHN0YW5kYXJkIGV4Y2VwdGlvbnMuCi0KLVxpdGVtWygyKV0KLSAgVGhpcyBpcyB0aGUgc2FtZSBhcyBcZXhjZXB0aW9ue3dlYWtyZWYuUmVmZXJlbmNlRXJyb3J9LgotCi1caXRlbVsoMyldCi0gIE9ubHkgZGVmaW5lZCBvbiBXaW5kb3dzOyBwcm90ZWN0IGNvZGUgdGhhdCB1c2VzIHRoaXMgYnkgdGVzdGluZyB0aGF0Ci0gIHRoZSBwcmVwcm9jZXNzb3IgbWFjcm8gXGNvZGV7TVNfV0lORE9XU30gaXMgZGVmaW5lZC4KLQotXGl0ZW1bKDQpXQotICBcdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7ZGVzY3JpcHRpb259Ci0KLQotXHNlY3Rpb257RGVwcmVjYXRpb24gb2YgU3RyaW5nIEV4Y2VwdGlvbnN9Ci0KLUFsbCBleGNlcHRpb25zIGJ1aWx0IGludG8gUHl0aG9uIG9yIHByb3ZpZGVkIGluIHRoZSBzdGFuZGFyZCBsaWJyYXJ5Ci1hcmUgZGVyaXZlZCBmcm9tIFxleGNlcHRpb257QmFzZUV4Y2VwdGlvbn0uCi1cd2l0aHN1Yml0ZW17KGJ1aWx0LWluIGV4Y2VwdGlvbil9e1x0dGluZGV4e0Jhc2VFeGNlcHRpb259fQotCi1TdHJpbmcgZXhjZXB0aW9ucyBhcmUgc3RpbGwgc3VwcG9ydGVkIGluIHRoZSBpbnRlcnByZXRlciB0byBhbGxvdwotZXhpc3RpbmcgY29kZSB0byBydW4gdW5tb2RpZmllZCwgYnV0IHRoaXMgd2lsbCBhbHNvIGNoYW5nZSBpbiBhIGZ1dHVyZQotcmVsZWFzZS4KZGlmZiAtLWdpdCBhL0RvYy9hcGkvaW5pdC50ZXggYi9Eb2MvYXBpL2luaXQudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmZjZjYxLi4wMDAwMDAwCi0tLSBhL0RvYy9hcGkvaW5pdC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw4ODQgKzAsMCBAQAotXGNoYXB0ZXJ7SW5pdGlhbGl6YXRpb24sIEZpbmFsaXphdGlvbiwgYW5kIFRocmVhZHMKLSAgICAgICAgIFxsYWJlbHtpbml0aWFsaXphdGlvbn19Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e3ZvaWR9e1B5X0luaXRpYWxpemV9e30KLSAgSW5pdGlhbGl6ZSB0aGUgUHl0aG9uIGludGVycHJldGVyLiAgSW4gYW4gYXBwbGljYXRpb24gZW1iZWRkaW5nIAotICBQeXRob24sIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgdXNpbmcgYW55IG90aGVyIFB5dGhvbi9DIEFQSQotICBmdW5jdGlvbnM7IHdpdGggdGhlIGV4Y2VwdGlvbiBvZgotICBcY2Z1bmN0aW9ue1B5X1NldFByb2dyYW1OYW1lKCl9XHR0aW5kZXh7UHlfU2V0UHJvZ3JhbU5hbWUoKX0sCi0gIFxjZnVuY3Rpb257UHlFdmFsX0luaXRUaHJlYWRzKCl9XHR0aW5kZXh7UHlFdmFsX0luaXRUaHJlYWRzKCl9LAotICBcY2Z1bmN0aW9ue1B5RXZhbF9SZWxlYXNlTG9jaygpfVx0dGluZGV4e1B5RXZhbF9SZWxlYXNlTG9jaygpfSwKLSAgYW5kIFxjZnVuY3Rpb257UHlFdmFsX0FjcXVpcmVMb2NrKCl9XHR0aW5kZXh7UHlFdmFsX0FjcXVpcmVMb2NrKCl9LgotICBUaGlzIGluaXRpYWxpemVzIHRoZSB0YWJsZSBvZiBsb2FkZWQgbW9kdWxlcyAoXGNvZGV7c3lzLm1vZHVsZXN9KSwKLSAgYW5kXHdpdGhzdWJpdGVteyhpbiBtb2R1bGUgc3lzKX17XHR0aW5kZXh7bW9kdWxlc31cdHRpbmRleHtwYXRofX0KLSAgY3JlYXRlcyB0aGUgZnVuZGFtZW50YWwgbW9kdWxlcwotICBcbW9kdWxle19fYnVpbHRpbl9ffVxyZWZiaW1vZGluZGV4e19fYnVpbHRpbl9ffSwKLSAgXG1vZHVsZXtfX21haW5fX31ccmVmYmltb2RpbmRleHtfX21haW5fX30gYW5kCi0gIFxtb2R1bGV7c3lzfVxyZWZiaW1vZGluZGV4e3N5c30uICBJdCBhbHNvIGluaXRpYWxpemVzIHRoZSBtb2R1bGUKLSAgc2VhcmNoXGluZGV4aWlpe21vZHVsZX17c2VhcmNofXtwYXRofSBwYXRoIChcY29kZXtzeXMucGF0aH0pLgotICBJdCBkb2VzIG5vdCBzZXQgXGNvZGV7c3lzLmFyZ3Z9OyB1c2UKLSAgXGNmdW5jdGlvbntQeVN5c19TZXRBcmd2KCl9XHR0aW5kZXh7UHlTeXNfU2V0QXJndigpfSBmb3IgdGhhdC4gIFRoaXMKLSAgaXMgYSBuby1vcCB3aGVuIGNhbGxlZCBmb3IgYSBzZWNvbmQgdGltZSAod2l0aG91dCBjYWxsaW5nCi0gIFxjZnVuY3Rpb257UHlfRmluYWxpemUoKX1cdHRpbmRleHtQeV9GaW5hbGl6ZSgpfSBmaXJzdCkuICBUaGVyZSBpcwotICBubyByZXR1cm4gdmFsdWU7IGl0IGlzIGEgZmF0YWwgZXJyb3IgaWYgdGhlIGluaXRpYWxpemF0aW9uIGZhaWxzLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e3ZvaWR9e1B5X0luaXRpYWxpemVFeH17aW50IGluaXRzaWdzfQotICBUaGlzIGZ1bmN0aW9uIHdvcmtzIGxpa2UgXGNmdW5jdGlvbntQeV9Jbml0aWFsaXplKCl9IGlmCi0gIFx2YXJ7aW5pdHNpZ3N9IGlzIDEuIElmIFx2YXJ7aW5pdHNpZ3N9IGlzIDAsIGl0IHNraXBzCi0gIGluaXRpYWxpemF0aW9uIHJlZ2lzdHJhdGlvbiBvZiBzaWduYWwgaGFuZGxlcnMsIHdoaWNoCi0gIG1pZ2h0IGJlIHVzZWZ1bCB3aGVuIFB5dGhvbiBpcyBlbWJlZGRlZC4gXHZlcnNpb25hZGRlZHsyLjR9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeV9Jc0luaXRpYWxpemVkfXt9Ci0gIFJldHVybiB0cnVlIChub256ZXJvKSB3aGVuIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgaGFzIGJlZW4KLSAgaW5pdGlhbGl6ZWQsIGZhbHNlICh6ZXJvKSBpZiBub3QuICBBZnRlciBcY2Z1bmN0aW9ue1B5X0ZpbmFsaXplKCl9Ci0gIGlzIGNhbGxlZCwgdGhpcyByZXR1cm5zIGZhbHNlIHVudGlsIFxjZnVuY3Rpb257UHlfSW5pdGlhbGl6ZSgpfSBpcwotICBjYWxsZWQgYWdhaW4uCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317dm9pZH17UHlfRmluYWxpemV9e30KLSAgVW5kbyBhbGwgaW5pdGlhbGl6YXRpb25zIG1hZGUgYnkgXGNmdW5jdGlvbntQeV9Jbml0aWFsaXplKCl9IGFuZAotICBzdWJzZXF1ZW50IHVzZSBvZiBQeXRob24vQyBBUEkgZnVuY3Rpb25zLCBhbmQgZGVzdHJveSBhbGwKLSAgc3ViLWludGVycHJldGVycyAoc2VlIFxjZnVuY3Rpb257UHlfTmV3SW50ZXJwcmV0ZXIoKX0gYmVsb3cpIHRoYXQKLSAgd2VyZSBjcmVhdGVkIGFuZCBub3QgeWV0IGRlc3Ryb3llZCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvCi0gIFxjZnVuY3Rpb257UHlfSW5pdGlhbGl6ZSgpfS4gIElkZWFsbHksIHRoaXMgZnJlZXMgYWxsIG1lbW9yeQotICBhbGxvY2F0ZWQgYnkgdGhlIFB5dGhvbiBpbnRlcnByZXRlci4gIFRoaXMgaXMgYSBuby1vcCB3aGVuIGNhbGxlZAotICBmb3IgYSBzZWNvbmQgdGltZSAod2l0aG91dCBjYWxsaW5nIFxjZnVuY3Rpb257UHlfSW5pdGlhbGl6ZSgpfSBhZ2FpbgotICBmaXJzdCkuICBUaGVyZSBpcyBubyByZXR1cm4gdmFsdWU7IGVycm9ycyBkdXJpbmcgZmluYWxpemF0aW9uIGFyZQotICBpZ25vcmVkLgotCi0gIFRoaXMgZnVuY3Rpb24gaXMgcHJvdmlkZWQgZm9yIGEgbnVtYmVyIG9mIHJlYXNvbnMuICBBbiBlbWJlZGRpbmcKLSAgYXBwbGljYXRpb24gbWlnaHQgd2FudCB0byByZXN0YXJ0IFB5dGhvbiB3aXRob3V0IGhhdmluZyB0byByZXN0YXJ0Ci0gIHRoZSBhcHBsaWNhdGlvbiBpdHNlbGYuICBBbiBhcHBsaWNhdGlvbiB0aGF0IGhhcyBsb2FkZWQgdGhlIFB5dGhvbgotICBpbnRlcnByZXRlciBmcm9tIGEgZHluYW1pY2FsbHkgbG9hZGFibGUgbGlicmFyeSAob3IgRExMKSBtaWdodCB3YW50Ci0gIHRvIGZyZWUgYWxsIG1lbW9yeSBhbGxvY2F0ZWQgYnkgUHl0aG9uIGJlZm9yZSB1bmxvYWRpbmcgdGhlCi0gIERMTC4gRHVyaW5nIGEgaHVudCBmb3IgbWVtb3J5IGxlYWtzIGluIGFuIGFwcGxpY2F0aW9uIGEgZGV2ZWxvcGVyCi0gIG1pZ2h0IHdhbnQgdG8gZnJlZSBhbGwgbWVtb3J5IGFsbG9jYXRlZCBieSBQeXRob24gYmVmb3JlIGV4aXRpbmcKLSAgZnJvbSB0aGUgYXBwbGljYXRpb24uCi0KLSAgXHN0cm9uZ3tCdWdzIGFuZCBjYXZlYXRzOn0gVGhlIGRlc3RydWN0aW9uIG9mIG1vZHVsZXMgYW5kIG9iamVjdHMgaW4KLSAgbW9kdWxlcyBpcyBkb25lIGluIHJhbmRvbSBvcmRlcjsgdGhpcyBtYXkgY2F1c2UgZGVzdHJ1Y3RvcnMKLSAgKFxtZXRob2R7X19kZWxfXygpfSBtZXRob2RzKSB0byBmYWlsIHdoZW4gdGhleSBkZXBlbmQgb24gb3RoZXIKLSAgb2JqZWN0cyAoZXZlbiBmdW5jdGlvbnMpIG9yIG1vZHVsZXMuICBEeW5hbWljYWxseSBsb2FkZWQgZXh0ZW5zaW9uCi0gIG1vZHVsZXMgbG9hZGVkIGJ5IFB5dGhvbiBhcmUgbm90IHVubG9hZGVkLiAgU21hbGwgYW1vdW50cyBvZiBtZW1vcnkKLSAgYWxsb2NhdGVkIGJ5IHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgbWF5IG5vdCBiZSBmcmVlZCAoaWYgeW91IGZpbmQgYQotICBsZWFrLCBwbGVhc2UgcmVwb3J0IGl0KS4gIE1lbW9yeSB0aWVkIHVwIGluIGNpcmN1bGFyIHJlZmVyZW5jZXMKLSAgYmV0d2VlbiBvYmplY3RzIGlzIG5vdCBmcmVlZC4gIFNvbWUgbWVtb3J5IGFsbG9jYXRlZCBieSBleHRlbnNpb24KLSAgbW9kdWxlcyBtYXkgbm90IGJlIGZyZWVkLiAgU29tZSBleHRlbnNpb25zIG1heSBub3Qgd29yayBwcm9wZXJseSBpZgotICB0aGVpciBpbml0aWFsaXphdGlvbiByb3V0aW5lIGlzIGNhbGxlZCBtb3JlIHRoYW4gb25jZTsgdGhpcyBjYW4KLSAgaGFwcGVuIGlmIGFuIGFwcGxpY2F0aW9uIGNhbGxzIFxjZnVuY3Rpb257UHlfSW5pdGlhbGl6ZSgpfSBhbmQKLSAgXGNmdW5jdGlvbntQeV9GaW5hbGl6ZSgpfSBtb3JlIHRoYW4gb25jZS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeVRocmVhZFN0YXRlKn17UHlfTmV3SW50ZXJwcmV0ZXJ9e30KLSAgQ3JlYXRlIGEgbmV3IHN1Yi1pbnRlcnByZXRlci4gIFRoaXMgaXMgYW4gKGFsbW9zdCkgdG90YWxseSBzZXBhcmF0ZQotICBlbnZpcm9ubWVudCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiBQeXRob24gY29kZS4gIEluIHBhcnRpY3VsYXIsIHRoZQotICBuZXcgaW50ZXJwcmV0ZXIgaGFzIHNlcGFyYXRlLCBpbmRlcGVuZGVudCB2ZXJzaW9ucyBvZiBhbGwgaW1wb3J0ZWQKLSAgbW9kdWxlcywgaW5jbHVkaW5nIHRoZSBmdW5kYW1lbnRhbCBtb2R1bGVzCi0gIFxtb2R1bGV7X19idWlsdGluX199XHJlZmJpbW9kaW5kZXh7X19idWlsdGluX199LAotICBcbW9kdWxle19fbWFpbl9ffVxyZWZiaW1vZGluZGV4e19fbWFpbl9ffSBhbmQKLSAgXG1vZHVsZXtzeXN9XHJlZmJpbW9kaW5kZXh7c3lzfS4gIFRoZSB0YWJsZSBvZiBsb2FkZWQgbW9kdWxlcwotICAoXGNvZGV7c3lzLm1vZHVsZXN9KSBhbmQgdGhlIG1vZHVsZSBzZWFyY2ggcGF0aCAoXGNvZGV7c3lzLnBhdGh9KQotICBhcmUgYWxzbyBzZXBhcmF0ZS4gIFRoZSBuZXcgZW52aXJvbm1lbnQgaGFzIG5vIFxjb2Rle3N5cy5hcmd2fQotICB2YXJpYWJsZS4gIEl0IGhhcyBuZXcgc3RhbmRhcmQgSS9PIHN0cmVhbSBmaWxlIG9iamVjdHMKLSAgXGNvZGV7c3lzLnN0ZGlufSwgXGNvZGV7c3lzLnN0ZG91dH0gYW5kIFxjb2Rle3N5cy5zdGRlcnJ9IChob3dldmVyCi0gIHRoZXNlIHJlZmVyIHRvIHRoZSBzYW1lIHVuZGVybHlpbmcgXGN0eXBle0ZJTEV9IHN0cnVjdHVyZXMgaW4gdGhlIEMKLSAgbGlicmFyeSkuCi0gIFx3aXRoc3ViaXRlbXsoaW4gbW9kdWxlIHN5cyl9ewotICAgIFx0dGluZGV4e3N0ZG91dH1cdHRpbmRleHtzdGRlcnJ9XHR0aW5kZXh7c3RkaW59fQotCi0gIFRoZSByZXR1cm4gdmFsdWUgcG9pbnRzIHRvIHRoZSBmaXJzdCB0aHJlYWQgc3RhdGUgY3JlYXRlZCBpbiB0aGUgbmV3Ci0gIHN1Yi1pbnRlcnByZXRlci4gIFRoaXMgdGhyZWFkIHN0YXRlIGlzIG1hZGUgaW4gdGhlIGN1cnJlbnQgdGhyZWFkCi0gIHN0YXRlLiAgTm90ZSB0aGF0IG5vIGFjdHVhbCB0aHJlYWQgaXMgY3JlYXRlZDsgc2VlIHRoZSBkaXNjdXNzaW9uIG9mCi0gIHRocmVhZCBzdGF0ZXMgYmVsb3cuICBJZiBjcmVhdGlvbiBvZiB0aGUgbmV3IGludGVycHJldGVyIGlzCi0gIHVuc3VjY2Vzc2Z1bCwgXE5VTEx7fSBpcyByZXR1cm5lZDsgbm8gZXhjZXB0aW9uIGlzIHNldCBzaW5jZSB0aGUKLSAgZXhjZXB0aW9uIHN0YXRlIGlzIHN0b3JlZCBpbiB0aGUgY3VycmVudCB0aHJlYWQgc3RhdGUgYW5kIHRoZXJlIG1heQotICBub3QgYmUgYSBjdXJyZW50IHRocmVhZCBzdGF0ZS4gIChMaWtlIGFsbCBvdGhlciBQeXRob24vQyBBUEkKLSAgZnVuY3Rpb25zLCB0aGUgZ2xvYmFsIGludGVycHJldGVyIGxvY2sgbXVzdCBiZSBoZWxkIGJlZm9yZSBjYWxsaW5nCi0gIHRoaXMgZnVuY3Rpb24gYW5kIGlzIHN0aWxsIGhlbGQgd2hlbiBpdCByZXR1cm5zOyBob3dldmVyLCB1bmxpa2UKLSAgbW9zdCBvdGhlciBQeXRob24vQyBBUEkgZnVuY3Rpb25zLCB0aGVyZSBuZWVkbid0IGJlIGEgY3VycmVudCB0aHJlYWQKLSAgc3RhdGUgb24gZW50cnkuKQotCi0gIEV4dGVuc2lvbiBtb2R1bGVzIGFyZSBzaGFyZWQgYmV0d2VlbiAoc3ViLSlpbnRlcnByZXRlcnMgYXMgZm9sbG93czoKLSAgdGhlIGZpcnN0IHRpbWUgYSBwYXJ0aWN1bGFyIGV4dGVuc2lvbiBpcyBpbXBvcnRlZCwgaXQgaXMgaW5pdGlhbGl6ZWQKLSAgbm9ybWFsbHksIGFuZCBhIChzaGFsbG93KSBjb3B5IG9mIGl0cyBtb2R1bGUncyBkaWN0aW9uYXJ5IGlzCi0gIHNxdWlycmVsZWQgYXdheS4gIFdoZW4gdGhlIHNhbWUgZXh0ZW5zaW9uIGlzIGltcG9ydGVkIGJ5IGFub3RoZXIKLSAgKHN1Yi0paW50ZXJwcmV0ZXIsIGEgbmV3IG1vZHVsZSBpcyBpbml0aWFsaXplZCBhbmQgZmlsbGVkIHdpdGggdGhlCi0gIGNvbnRlbnRzIG9mIHRoaXMgY29weTsgdGhlIGV4dGVuc2lvbidzIFxjb2Rle2luaXR9IGZ1bmN0aW9uIGlzIG5vdAotICBjYWxsZWQuICBOb3RlIHRoYXQgdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB3aGF0IGhhcHBlbnMgd2hlbiBhbgotICBleHRlbnNpb24gaXMgaW1wb3J0ZWQgYWZ0ZXIgdGhlIGludGVycHJldGVyIGhhcyBiZWVuIGNvbXBsZXRlbHkKLSAgcmUtaW5pdGlhbGl6ZWQgYnkgY2FsbGluZwotICBcY2Z1bmN0aW9ue1B5X0ZpbmFsaXplKCl9XHR0aW5kZXh7UHlfRmluYWxpemUoKX0gYW5kCi0gIFxjZnVuY3Rpb257UHlfSW5pdGlhbGl6ZSgpfVx0dGluZGV4e1B5X0luaXRpYWxpemUoKX07IGluIHRoYXQgY2FzZSwKLSAgdGhlIGV4dGVuc2lvbidzIFxjb2Rle2luaXRcdmFye21vZHVsZX19IGZ1bmN0aW9uIFxlbXBoe2lzfSBjYWxsZWQKLSAgYWdhaW4uCi0KLSAgXHN0cm9uZ3tCdWdzIGFuZCBjYXZlYXRzOn0gQmVjYXVzZSBzdWItaW50ZXJwcmV0ZXJzIChhbmQgdGhlIG1haW4KLSAgaW50ZXJwcmV0ZXIpIGFyZSBwYXJ0IG9mIHRoZSBzYW1lIHByb2Nlc3MsIHRoZSBpbnN1bGF0aW9uIGJldHdlZW4KLSAgdGhlbSBpc24ndCBwZXJmZWN0IC0tLSBmb3IgZXhhbXBsZSwgdXNpbmcgbG93LWxldmVsIGZpbGUgb3BlcmF0aW9ucwotICBsaWtlIFx3aXRoc3ViaXRlbXsoaW4gbW9kdWxlIG9zKX17XHR0aW5kZXh7Y2xvc2UoKX19Ci0gIFxmdW5jdGlvbntvcy5jbG9zZSgpfSB0aGV5IGNhbiAoYWNjaWRlbnRhbGx5IG9yIG1hbGljaW91c2x5KSBhZmZlY3QKLSAgZWFjaCBvdGhlcidzIG9wZW4gZmlsZXMuICBCZWNhdXNlIG9mIHRoZSB3YXkgZXh0ZW5zaW9ucyBhcmUgc2hhcmVkCi0gIGJldHdlZW4gKHN1Yi0paW50ZXJwcmV0ZXJzLCBzb21lIGV4dGVuc2lvbnMgbWF5IG5vdCB3b3JrIHByb3Blcmx5OwotICB0aGlzIGlzIGVzcGVjaWFsbHkgbGlrZWx5IHdoZW4gdGhlIGV4dGVuc2lvbiBtYWtlcyB1c2Ugb2YgKHN0YXRpYykKLSAgZ2xvYmFsIHZhcmlhYmxlcywgb3Igd2hlbiB0aGUgZXh0ZW5zaW9uIG1hbmlwdWxhdGVzIGl0cyBtb2R1bGUncwotICBkaWN0aW9uYXJ5IGFmdGVyIGl0cyBpbml0aWFsaXphdGlvbi4gIEl0IGlzIHBvc3NpYmxlIHRvIGluc2VydAotICBvYmplY3RzIGNyZWF0ZWQgaW4gb25lIHN1Yi1pbnRlcnByZXRlciBpbnRvIGEgbmFtZXNwYWNlIG9mIGFub3RoZXIKLSAgc3ViLWludGVycHJldGVyOyB0aGlzIHNob3VsZCBiZSBkb25lIHdpdGggZ3JlYXQgY2FyZSB0byBhdm9pZAotICBzaGFyaW5nIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMsIG1ldGhvZHMsIGluc3RhbmNlcyBvciBjbGFzc2VzCi0gIGJldHdlZW4gc3ViLWludGVycHJldGVycywgc2luY2UgaW1wb3J0IG9wZXJhdGlvbnMgZXhlY3V0ZWQgYnkgc3VjaAotICBvYmplY3RzIG1heSBhZmZlY3QgdGhlIHdyb25nIChzdWItKWludGVycHJldGVyJ3MgZGljdGlvbmFyeSBvZgotICBsb2FkZWQgbW9kdWxlcy4gIChYWFggVGhpcyBpcyBhIGhhcmQtdG8tZml4IGJ1ZyB0aGF0IHdpbGwgYmUKLSAgYWRkcmVzc2VkIGluIGEgZnV0dXJlIHJlbGVhc2UuKQotCi0gIEFsc28gbm90ZSB0aGF0IHRoZSB1c2Ugb2YgdGhpcyBmdW5jdGlvbmFsaXR5IGlzIGluY29tcGF0aWJsZSB3aXRoCi0gIGV4dGVuc2lvbiBtb2R1bGVzIHN1Y2ggYXMgUHlPYmpDIGFuZCBjdHlwZXMgdGhhdCB1c2UgdGhlCi0gIFxjZnVuY3Rpb257UHlHSUxTdGF0ZV8qfSBBUElzIChhbmQgdGhpcyBpcyBpbmhlcmVudCBpbiB0aGUgd2F5IHRoZQotICBcY2Z1bmN0aW9ue1B5R0lMU3RhdGVfKn0gZnVuY3Rpb25zIHdvcmspLiAgU2ltcGxlIHRoaW5ncyBtYXkgd29yaywKLSAgYnV0IGNvbmZ1c2luZyBiZWhhdmlvciB3aWxsIGFsd2F5cyBiZSBuZWFyLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e3ZvaWR9e1B5X0VuZEludGVycHJldGVyfXtQeVRocmVhZFN0YXRlICp0c3RhdGV9Ci0gIERlc3Ryb3kgdGhlIChzdWItKWludGVycHJldGVyIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiB0aHJlYWQgc3RhdGUuCi0gIFRoZSBnaXZlbiB0aHJlYWQgc3RhdGUgbXVzdCBiZSB0aGUgY3VycmVudCB0aHJlYWQgc3RhdGUuICBTZWUgdGhlCi0gIGRpc2N1c3Npb24gb2YgdGhyZWFkIHN0YXRlcyBiZWxvdy4gIFdoZW4gdGhlIGNhbGwgcmV0dXJucywgdGhlCi0gIGN1cnJlbnQgdGhyZWFkIHN0YXRlIGlzIFxOVUxMLiAgQWxsIHRocmVhZCBzdGF0ZXMgYXNzb2NpYXRlZCB3aXRoCi0gIHRoaXMgaW50ZXJwcmV0ZXIgYXJlIGRlc3Ryb3llZC4gIChUaGUgZ2xvYmFsIGludGVycHJldGVyIGxvY2sgbXVzdAotICBiZSBoZWxkIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gYW5kIGlzIHN0aWxsIGhlbGQgd2hlbiBpdAotICByZXR1cm5zLikgIFxjZnVuY3Rpb257UHlfRmluYWxpemUoKX1cdHRpbmRleHtQeV9GaW5hbGl6ZSgpfSB3aWxsCi0gIGRlc3Ryb3kgYWxsIHN1Yi1pbnRlcnByZXRlcnMgdGhhdCBoYXZlbid0IGJlZW4gZXhwbGljaXRseSBkZXN0cm95ZWQKLSAgYXQgdGhhdCBwb2ludC4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXt2b2lkfXtQeV9TZXRQcm9ncmFtTmFtZX17Y2hhciAqbmFtZX0KLSAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZQotICBcY2Z1bmN0aW9ue1B5X0luaXRpYWxpemUoKX1cdHRpbmRleHtQeV9Jbml0aWFsaXplKCl9IGlzIGNhbGxlZAotICBmb3IgdGhlIGZpcnN0IHRpbWUsIGlmIGl0IGlzIGNhbGxlZCBhdCBhbGwuICBJdCB0ZWxscyB0aGUKLSAgaW50ZXJwcmV0ZXIgdGhlIHZhbHVlIG9mIHRoZSBcY29kZXthcmd2WzBdfSBhcmd1bWVudCB0byB0aGUKLSAgXGNmdW5jdGlvbnttYWluKCl9XHR0aW5kZXh7bWFpbigpfSBmdW5jdGlvbiBvZiB0aGUgcHJvZ3JhbS4gIFRoaXMgaXMKLSAgdXNlZCBieSBcY2Z1bmN0aW9ue1B5X0dldFBhdGgoKX1cdHRpbmRleHtQeV9HZXRQYXRoKCl9IGFuZCBzb21lCi0gIG90aGVyIGZ1bmN0aW9ucyBiZWxvdyB0byBmaW5kIHRoZSBQeXRob24gcnVuLXRpbWUgbGlicmFyaWVzIHJlbGF0aXZlCi0gIHRvIHRoZSBpbnRlcnByZXRlciBleGVjdXRhYmxlLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMKLSAgXGNvZGV7J3B5dGhvbid9LiAgVGhlIGFyZ3VtZW50IHNob3VsZCBwb2ludCB0byBhIHplcm8tdGVybWluYXRlZAotICBjaGFyYWN0ZXIgc3RyaW5nIGluIHN0YXRpYyBzdG9yYWdlIHdob3NlIGNvbnRlbnRzIHdpbGwgbm90IGNoYW5nZQotICBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBwcm9ncmFtJ3MgZXhlY3V0aW9uLiAgTm8gY29kZSBpbiB0aGUgUHl0aG9uCi0gIGludGVycHJldGVyIHdpbGwgY2hhbmdlIHRoZSBjb250ZW50cyBvZiB0aGlzIHN0b3JhZ2UuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317Y2hhcip9e1B5X0dldFByb2dyYW1OYW1lfXt9Ci0gIFJldHVybiB0aGUgcHJvZ3JhbSBuYW1lIHNldCB3aXRoCi0gIFxjZnVuY3Rpb257UHlfU2V0UHJvZ3JhbU5hbWUoKX1cdHRpbmRleHtQeV9TZXRQcm9ncmFtTmFtZSgpfSwgb3IgdGhlCi0gIGRlZmF1bHQuICBUaGUgcmV0dXJuZWQgc3RyaW5nIHBvaW50cyBpbnRvIHN0YXRpYyBzdG9yYWdlOyB0aGUgY2FsbGVyCi0gIHNob3VsZCBub3QgbW9kaWZ5IGl0cyB2YWx1ZS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtjaGFyKn17UHlfR2V0UHJlZml4fXt9Ci0gIFJldHVybiB0aGUgXGVtcGh7cHJlZml4fSBmb3IgaW5zdGFsbGVkIHBsYXRmb3JtLWluZGVwZW5kZW50IGZpbGVzLgotICBUaGlzIGlzIGRlcml2ZWQgdGhyb3VnaCBhIG51bWJlciBvZiBjb21wbGljYXRlZCBydWxlcyBmcm9tIHRoZQotICBwcm9ncmFtIG5hbWUgc2V0IHdpdGggXGNmdW5jdGlvbntQeV9TZXRQcm9ncmFtTmFtZSgpfSBhbmQgc29tZQotICBlbnZpcm9ubWVudCB2YXJpYWJsZXM7IGZvciBleGFtcGxlLCBpZiB0aGUgcHJvZ3JhbSBuYW1lIGlzCi0gIFxjb2RleycvdXNyL2xvY2FsL2Jpbi9weXRob24nfSwgdGhlIHByZWZpeCBpcyBcY29kZXsnL3Vzci9sb2NhbCd9LgotICBUaGUgcmV0dXJuZWQgc3RyaW5nIHBvaW50cyBpbnRvIHN0YXRpYyBzdG9yYWdlOyB0aGUgY2FsbGVyIHNob3VsZAotICBub3QgbW9kaWZ5IGl0cyB2YWx1ZS4gIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIFxtYWtldmFye3ByZWZpeH0KLSAgdmFyaWFibGUgaW4gdGhlIHRvcC1sZXZlbCBcZmlsZXtNYWtlZmlsZX0gYW5kIHRoZQotICBcbG9uZ3Byb2dyYW1vcHR7cHJlZml4fSBhcmd1bWVudCB0byB0aGUgXHByb2dyYW17Y29uZmlndXJlfSBzY3JpcHQKLSAgYXQgYnVpbGQgdGltZS4gIFRoZSB2YWx1ZSBpcyBhdmFpbGFibGUgdG8gUHl0aG9uIGNvZGUgYXMKLSAgXGNvZGV7c3lzLnByZWZpeH0uICBJdCBpcyBvbmx5IHVzZWZ1bCBvbiBcVU5JWHt9LiAgU2VlIGFsc28gdGhlIG5leHQKLSAgZnVuY3Rpb24uCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317Y2hhcip9e1B5X0dldEV4ZWNQcmVmaXh9e30KLSAgUmV0dXJuIHRoZSBcZW1waHtleGVjLXByZWZpeH0gZm9yIGluc3RhbGxlZAotICBwbGF0Zm9ybS1cZW1waHtkZX1wZW5kZW50IGZpbGVzLiAgVGhpcyBpcyBkZXJpdmVkIHRocm91Z2ggYSBudW1iZXIKLSAgb2YgY29tcGxpY2F0ZWQgcnVsZXMgZnJvbSB0aGUgcHJvZ3JhbSBuYW1lIHNldCB3aXRoCi0gIFxjZnVuY3Rpb257UHlfU2V0UHJvZ3JhbU5hbWUoKX0gYW5kIHNvbWUgZW52aXJvbm1lbnQgdmFyaWFibGVzOyBmb3IKLSAgZXhhbXBsZSwgaWYgdGhlIHByb2dyYW0gbmFtZSBpcyBcY29kZXsnL3Vzci9sb2NhbC9iaW4vcHl0aG9uJ30sIHRoZQotICBleGVjLXByZWZpeCBpcyBcY29kZXsnL3Vzci9sb2NhbCd9LiAgVGhlIHJldHVybmVkIHN0cmluZyBwb2ludHMgaW50bwotICBzdGF0aWMgc3RvcmFnZTsgdGhlIGNhbGxlciBzaG91bGQgbm90IG1vZGlmeSBpdHMgdmFsdWUuICBUaGlzCi0gIGNvcnJlc3BvbmRzIHRvIHRoZSBcbWFrZXZhcntleGVjX3ByZWZpeH0gdmFyaWFibGUgaW4gdGhlIHRvcC1sZXZlbAotICBcZmlsZXtNYWtlZmlsZX0gYW5kIHRoZSBcbG9uZ3Byb2dyYW1vcHR7ZXhlYy1wcmVmaXh9IGFyZ3VtZW50IHRvIHRoZQotICBccHJvZ3JhbXtjb25maWd1cmV9IHNjcmlwdCBhdCBidWlsZCAgdGltZS4gIFRoZSB2YWx1ZSBpcyBhdmFpbGFibGUKLSAgdG8gUHl0aG9uIGNvZGUgYXMgXGNvZGV7c3lzLmV4ZWNfcHJlZml4fS4gIEl0IGlzIG9ubHkgdXNlZnVsIG9uCi0gIFxVTklYLgotCi0gIEJhY2tncm91bmQ6IFRoZSBleGVjLXByZWZpeCBkaWZmZXJzIGZyb20gdGhlIHByZWZpeCB3aGVuIHBsYXRmb3JtCi0gIGRlcGVuZGVudCBmaWxlcyAoc3VjaCBhcyBleGVjdXRhYmxlcyBhbmQgc2hhcmVkIGxpYnJhcmllcykgYXJlCi0gIGluc3RhbGxlZCBpbiBhIGRpZmZlcmVudCBkaXJlY3RvcnkgdHJlZS4gIEluIGEgdHlwaWNhbCBpbnN0YWxsYXRpb24sCi0gIHBsYXRmb3JtIGRlcGVuZGVudCBmaWxlcyBtYXkgYmUgaW5zdGFsbGVkIGluIHRoZQotICBcZmlsZXsvdXNyL2xvY2FsL3BsYXR9IHN1YnRyZWUgd2hpbGUgcGxhdGZvcm0gaW5kZXBlbmRlbnQgbWF5IGJlCi0gIGluc3RhbGxlZCBpbiBcZmlsZXsvdXNyL2xvY2FsfS4KLQotICBHZW5lcmFsbHkgc3BlYWtpbmcsIGEgcGxhdGZvcm0gaXMgYSBjb21iaW5hdGlvbiBvZiBoYXJkd2FyZSBhbmQKLSAgc29mdHdhcmUgZmFtaWxpZXMsIGUuZy4gIFNwYXJjIG1hY2hpbmVzIHJ1bm5pbmcgdGhlIFNvbGFyaXMgMi54Ci0gIG9wZXJhdGluZyBzeXN0ZW0gYXJlIGNvbnNpZGVyZWQgdGhlIHNhbWUgcGxhdGZvcm0sIGJ1dCBJbnRlbAotICBtYWNoaW5lcyBydW5uaW5nIFNvbGFyaXMgMi54IGFyZSBhbm90aGVyIHBsYXRmb3JtLCBhbmQgSW50ZWwKLSAgbWFjaGluZXMgcnVubmluZyBMaW51eCBhcmUgeWV0IGFub3RoZXIgcGxhdGZvcm0uICBEaWZmZXJlbnQgbWFqb3IKLSAgcmV2aXNpb25zIG9mIHRoZSBzYW1lIG9wZXJhdGluZyBzeXN0ZW0gZ2VuZXJhbGx5IGFsc28gZm9ybSBkaWZmZXJlbnQKLSAgcGxhdGZvcm1zLiAgTm9uLVxVTklYe30gb3BlcmF0aW5nIHN5c3RlbXMgYXJlIGEgZGlmZmVyZW50IHN0b3J5OyB0aGUKLSAgaW5zdGFsbGF0aW9uIHN0cmF0ZWdpZXMgb24gdGhvc2Ugc3lzdGVtcyBhcmUgc28gZGlmZmVyZW50IHRoYXQgdGhlCi0gIHByZWZpeCBhbmQgZXhlYy1wcmVmaXggYXJlIG1lYW5pbmdsZXNzLCBhbmQgc2V0IHRvIHRoZSBlbXB0eSBzdHJpbmcuCi0gIE5vdGUgdGhhdCBjb21waWxlZCBQeXRob24gYnl0ZWNvZGUgZmlsZXMgYXJlIHBsYXRmb3JtIGluZGVwZW5kZW50Ci0gIChidXQgbm90IGluZGVwZW5kZW50IGZyb20gdGhlIFB5dGhvbiB2ZXJzaW9uIGJ5IHdoaWNoIHRoZXkgd2VyZQotICBjb21waWxlZCEpLgotCi0gIFN5c3RlbSBhZG1pbmlzdHJhdG9ycyB3aWxsIGtub3cgaG93IHRvIGNvbmZpZ3VyZSB0aGUgXHByb2dyYW17bW91bnR9Ci0gIG9yIFxwcm9ncmFte2F1dG9tb3VudH0gcHJvZ3JhbXMgdG8gc2hhcmUgXGZpbGV7L3Vzci9sb2NhbH0gYmV0d2VlbgotICBwbGF0Zm9ybXMgd2hpbGUgaGF2aW5nIFxmaWxley91c3IvbG9jYWwvcGxhdH0gYmUgYSBkaWZmZXJlbnQKLSAgZmlsZXN5c3RlbSBmb3IgZWFjaCBwbGF0Zm9ybS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtjaGFyKn17UHlfR2V0UHJvZ3JhbUZ1bGxQYXRofXt9Ci0gIFJldHVybiB0aGUgZnVsbCBwcm9ncmFtIG5hbWUgb2YgdGhlIFB5dGhvbiBleGVjdXRhYmxlOyB0aGlzIGlzIAotICBjb21wdXRlZCBhcyBhIHNpZGUtZWZmZWN0IG9mIGRlcml2aW5nIHRoZSBkZWZhdWx0IG1vZHVsZSBzZWFyY2ggcGF0aCAKLSAgZnJvbSB0aGUgcHJvZ3JhbSBuYW1lIChzZXQgYnkKLSAgXGNmdW5jdGlvbntQeV9TZXRQcm9ncmFtTmFtZSgpfVx0dGluZGV4e1B5X1NldFByb2dyYW1OYW1lKCl9IGFib3ZlKS4KLSAgVGhlIHJldHVybmVkIHN0cmluZyBwb2ludHMgaW50byBzdGF0aWMgc3RvcmFnZTsgdGhlIGNhbGxlciBzaG91bGQKLSAgbm90IG1vZGlmeSBpdHMgdmFsdWUuICBUaGUgdmFsdWUgaXMgYXZhaWxhYmxlIHRvIFB5dGhvbiBjb2RlIGFzCi0gIFxjb2Rle3N5cy5leGVjdXRhYmxlfS4KLSAgXHdpdGhzdWJpdGVteyhpbiBtb2R1bGUgc3lzKX17XHR0aW5kZXh7ZXhlY3V0YWJsZX19Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317Y2hhcip9e1B5X0dldFBhdGh9e30KLSAgXGluZGV4aWlpe21vZHVsZX17c2VhcmNofXtwYXRofQotICBSZXR1cm4gdGhlIGRlZmF1bHQgbW9kdWxlIHNlYXJjaCBwYXRoOyB0aGlzIGlzIGNvbXB1dGVkIGZyb20gdGhlIAotICBwcm9ncmFtIG5hbWUgKHNldCBieSBcY2Z1bmN0aW9ue1B5X1NldFByb2dyYW1OYW1lKCl9IGFib3ZlKSBhbmQgc29tZQotICBlbnZpcm9ubWVudCB2YXJpYWJsZXMuICBUaGUgcmV0dXJuZWQgc3RyaW5nIGNvbnNpc3RzIG9mIGEgc2VyaWVzIG9mCi0gIGRpcmVjdG9yeSBuYW1lcyBzZXBhcmF0ZWQgYnkgYSBwbGF0Zm9ybSBkZXBlbmRlbnQgZGVsaW1pdGVyCi0gIGNoYXJhY3Rlci4gIFRoZSBkZWxpbWl0ZXIgY2hhcmFjdGVyIGlzIFxjaGFyYWN0ZXJ7On0gb24gXFVOSVh7fSBhbmQgTWFjIE9TIFgsCi0gIFxjaGFyYWN0ZXJ7O30gb24gV2luZG93cy4gIFRoZSByZXR1cm5lZCBzdHJpbmcgcG9pbnRzIGludG8KLSAgc3RhdGljIHN0b3JhZ2U7IHRoZSBjYWxsZXIgc2hvdWxkIG5vdCBtb2RpZnkgaXRzIHZhbHVlLiAgVGhlIHZhbHVlCi0gIGlzIGF2YWlsYWJsZSB0byBQeXRob24gY29kZSBhcyB0aGUgbGlzdAotICBcY29kZXtzeXMucGF0aH1cd2l0aHN1Yml0ZW17KGluIG1vZHVsZSBzeXMpfXtcdHRpbmRleHtwYXRofX0sIHdoaWNoCi0gIG1heSBiZSBtb2RpZmllZCB0byBjaGFuZ2UgdGhlIGZ1dHVyZSBzZWFyY2ggcGF0aCBmb3IgbG9hZGVkCi0gIG1vZHVsZXMuCi0KLSAgJSBYWFggc2hvdWxkIGdpdmUgdGhlIGV4YWN0IHJ1bGVzCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317Y29uc3QgY2hhcip9e1B5X0dldFZlcnNpb259e30KLSAgUmV0dXJuIHRoZSB2ZXJzaW9uIG9mIHRoaXMgUHl0aG9uIGludGVycHJldGVyLiAgVGhpcyBpcyBhIHN0cmluZwotICB0aGF0IGxvb2tzIHNvbWV0aGluZyBsaWtlCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLSIxLjUgKCM2NywgRGVjIDMxIDE5OTcsIDIyOjM0OjI4KSBbR0NDIDIuNy4yLjJdIgotXGVuZHt2ZXJiYXRpbX0KLQotICBUaGUgZmlyc3Qgd29yZCAodXAgdG8gdGhlIGZpcnN0IHNwYWNlIGNoYXJhY3RlcikgaXMgdGhlIGN1cnJlbnQKLSAgUHl0aG9uIHZlcnNpb247IHRoZSBmaXJzdCB0aHJlZSBjaGFyYWN0ZXJzIGFyZSB0aGUgbWFqb3IgYW5kIG1pbm9yCi0gIHZlcnNpb24gc2VwYXJhdGVkIGJ5IGEgcGVyaW9kLiAgVGhlIHJldHVybmVkIHN0cmluZyBwb2ludHMgaW50bwotICBzdGF0aWMgc3RvcmFnZTsgdGhlIGNhbGxlciBzaG91bGQgbm90IG1vZGlmeSBpdHMgdmFsdWUuICBUaGUgdmFsdWUKLSAgaXMgYXZhaWxhYmxlIHRvIFB5dGhvbiBjb2RlIGFzIFxjb2Rle3N5cy52ZXJzaW9ufS4KLSAgXHdpdGhzdWJpdGVteyhpbiBtb2R1bGUgc3lzKX17XHR0aW5kZXh7dmVyc2lvbn19Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317Y29uc3QgY2hhcip9e1B5X0dldEJ1aWxkTnVtYmVyfXt9Ci0gIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIFN1YnZlcnNpb24gcmV2aXNpb24gdGhhdCB0aGlzIFB5dGhvbgotICBleGVjdXRhYmxlIHdhcyBidWlsdCBmcm9tLiAgVGhpcyBudW1iZXIgaXMgYSBzdHJpbmcgYmVjYXVzZSBpdCBtYXkgY29udGFpbiBhCi0gIHRyYWlsaW5nICdNJyBpZiBQeXRob24gd2FzIGJ1aWx0IGZyb20gYSBtaXhlZCByZXZpc2lvbiBzb3VyY2UgdHJlZS4KLSAgXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317Y29uc3QgY2hhcip9e1B5X0dldFBsYXRmb3JtfXt9Ci0gIFJldHVybiB0aGUgcGxhdGZvcm0gaWRlbnRpZmllciBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0uICBPbiBcVU5JWCwKLSAgdGhpcyBpcyBmb3JtZWQgZnJvbSB0aGUgYGBvZmZpY2lhbCcnIG5hbWUgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0sCi0gIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlLCBmb2xsb3dlZCBieSB0aGUgbWFqb3IgcmV2aXNpb24gbnVtYmVyOwotICBlLmcuLCBmb3IgU29sYXJpcyAyLngsIHdoaWNoIGlzIGFsc28ga25vd24gYXMgU3VuT1MgNS54LCB0aGUgdmFsdWUKLSAgaXMgXGNvZGV7J3N1bm9zNSd9LiAgT24gTWFjIE9TIFgsIGl0IGlzIFxjb2RleydkYXJ3aW4nfS4gIE9uIFdpbmRvd3MsCi0gIGl0IGlzIFxjb2Rleyd3aW4nfS4gIFRoZSByZXR1cm5lZCBzdHJpbmcgcG9pbnRzIGludG8gc3RhdGljIHN0b3JhZ2U7Ci0gIHRoZSBjYWxsZXIgc2hvdWxkIG5vdCBtb2RpZnkgaXRzIHZhbHVlLiAgVGhlIHZhbHVlIGlzIGF2YWlsYWJsZSB0bwotICBQeXRob24gY29kZSBhcyBcY29kZXtzeXMucGxhdGZvcm19LgotICBcd2l0aHN1Yml0ZW17KGluIG1vZHVsZSBzeXMpfXtcdHRpbmRleHtwbGF0Zm9ybX19Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317Y29uc3QgY2hhcip9e1B5X0dldENvcHlyaWdodH17fQotICBSZXR1cm4gdGhlIG9mZmljaWFsIGNvcHlyaWdodCBzdHJpbmcgZm9yIHRoZSBjdXJyZW50IFB5dGhvbiB2ZXJzaW9uLAotICBmb3IgZXhhbXBsZQotCi0gIFxjb2RleydDb3B5cmlnaHQgMTk5MS0xOTk1IFN0aWNodGluZyBNYXRoZW1hdGlzY2ggQ2VudHJ1bSwgQW1zdGVyZGFtJ30KLQotICBUaGUgcmV0dXJuZWQgc3RyaW5nIHBvaW50cyBpbnRvIHN0YXRpYyBzdG9yYWdlOyB0aGUgY2FsbGVyIHNob3VsZAotICBub3QgbW9kaWZ5IGl0cyB2YWx1ZS4gIFRoZSB2YWx1ZSBpcyBhdmFpbGFibGUgdG8gUHl0aG9uIGNvZGUgYXMKLSAgXGNvZGV7c3lzLmNvcHlyaWdodH0uCi0gIFx3aXRoc3ViaXRlbXsoaW4gbW9kdWxlIHN5cyl9e1x0dGluZGV4e2NvcHlyaWdodH19Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317Y29uc3QgY2hhcip9e1B5X0dldENvbXBpbGVyfXt9Ci0gIFJldHVybiBhbiBpbmRpY2F0aW9uIG9mIHRoZSBjb21waWxlciB1c2VkIHRvIGJ1aWxkIHRoZSBjdXJyZW50Ci0gIFB5dGhvbiB2ZXJzaW9uLCBpbiBzcXVhcmUgYnJhY2tldHMsIGZvciBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0iW0dDQyAyLjcuMi4yXSIKLVxlbmR7dmVyYmF0aW19Ci0KLSAgVGhlIHJldHVybmVkIHN0cmluZyBwb2ludHMgaW50byBzdGF0aWMgc3RvcmFnZTsgdGhlIGNhbGxlciBzaG91bGQKLSAgbm90IG1vZGlmeSBpdHMgdmFsdWUuICBUaGUgdmFsdWUgaXMgYXZhaWxhYmxlIHRvIFB5dGhvbiBjb2RlIGFzIHBhcnQKLSAgb2YgdGhlIHZhcmlhYmxlIFxjb2Rle3N5cy52ZXJzaW9ufS4KLSAgXHdpdGhzdWJpdGVteyhpbiBtb2R1bGUgc3lzKX17XHR0aW5kZXh7dmVyc2lvbn19Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317Y29uc3QgY2hhcip9e1B5X0dldEJ1aWxkSW5mb317fQotICBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlcXVlbmNlIG51bWJlciBhbmQgYnVpbGQgZGF0ZSBhbmQgdGltZSAKLSAgb2YgdGhlIGN1cnJlbnQgUHl0aG9uIGludGVycHJldGVyIGluc3RhbmNlLCBmb3IgZXhhbXBsZQotCi1cYmVnaW57dmVyYmF0aW19Ci0iIzY3LCBBdWcgIDEgMTk5NywgMjI6MzQ6MjgiCi1cZW5ke3ZlcmJhdGltfQotCi0gIFRoZSByZXR1cm5lZCBzdHJpbmcgcG9pbnRzIGludG8gc3RhdGljIHN0b3JhZ2U7IHRoZSBjYWxsZXIgc2hvdWxkCi0gIG5vdCBtb2RpZnkgaXRzIHZhbHVlLiAgVGhlIHZhbHVlIGlzIGF2YWlsYWJsZSB0byBQeXRob24gY29kZSBhcyBwYXJ0Ci0gIG9mIHRoZSB2YXJpYWJsZSBcY29kZXtzeXMudmVyc2lvbn0uCi0gIFx3aXRoc3ViaXRlbXsoaW4gbW9kdWxlIHN5cyl9e1x0dGluZGV4e3ZlcnNpb259fQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e3ZvaWR9e1B5U3lzX1NldEFyZ3Z9e2ludCBhcmdjLCBjaGFyICoqYXJndn0KLSAgU2V0IFxjb2Rle3N5cy5hcmd2fSBiYXNlZCBvbiBcdmFye2FyZ2N9IGFuZCBcdmFye2FyZ3Z9LiAgVGhlc2UKLSAgcGFyYW1ldGVycyBhcmUgc2ltaWxhciB0byB0aG9zZSBwYXNzZWQgdG8gdGhlIHByb2dyYW0ncwotICBcY2Z1bmN0aW9ue21haW4oKX1cdHRpbmRleHttYWluKCl9IGZ1bmN0aW9uIHdpdGggdGhlIGRpZmZlcmVuY2UgdGhhdAotICB0aGUgZmlyc3QgZW50cnkgc2hvdWxkIHJlZmVyIHRvIHRoZSBzY3JpcHQgZmlsZSB0byBiZSBleGVjdXRlZAotICByYXRoZXIgdGhhbiB0aGUgZXhlY3V0YWJsZSBob3N0aW5nIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIuICBJZiB0aGVyZQotICBpc24ndCBhIHNjcmlwdCB0aGF0IHdpbGwgYmUgcnVuLCB0aGUgZmlyc3QgZW50cnkgaW4gXHZhcnthcmd2fSBjYW4KLSAgYmUgYW4gZW1wdHkgc3RyaW5nLiAgSWYgdGhpcyBmdW5jdGlvbiBmYWlscyB0byBpbml0aWFsaXplCi0gIFxjb2Rle3N5cy5hcmd2fSwgYSBmYXRhbCBjb25kaXRpb24gaXMgc2lnbmFsbGVkIHVzaW5nCi0gIFxjZnVuY3Rpb257UHlfRmF0YWxFcnJvcigpfVx0dGluZGV4e1B5X0ZhdGFsRXJyb3IoKX0uCi0gIFx3aXRoc3ViaXRlbXsoaW4gbW9kdWxlIHN5cyl9e1x0dGluZGV4e2FyZ3Z9fQotICAlIFhYWCBpbXBsLiBkb2Vzbid0IHNlZW0gY29uc2lzdGVudCBpbiBhbGxvd2luZyAwL05VTEwgZm9yIHRoZSBwYXJhbXM7IAotICAlIGNoZWNrIHcvIEd1aWRvLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLSUgWFhYIE90aGVyIFB5U3lzIHRoaW5naWVzIChkb2Vzbid0IHJlYWxseSBiZWxvbmcgaW4gdGhpcyBjaGFwdGVyKQotCi1cc2VjdGlvbntUaHJlYWQgU3RhdGUgYW5kIHRoZSBHbG9iYWwgSW50ZXJwcmV0ZXIgTG9jawotICAgICAgICAgXGxhYmVse3RocmVhZHN9fQotCi1caW5kZXh7Z2xvYmFsIGludGVycHJldGVyIGxvY2t9Ci1caW5kZXh7aW50ZXJwcmV0ZXIgbG9ja30KLVxpbmRleHtsb2NrLCBpbnRlcnByZXRlcn0KLQotVGhlIFB5dGhvbiBpbnRlcnByZXRlciBpcyBub3QgZnVsbHkgdGhyZWFkIHNhZmUuICBJbiBvcmRlciB0byBzdXBwb3J0Ci1tdWx0aS10aHJlYWRlZCBQeXRob24gcHJvZ3JhbXMsIHRoZXJlJ3MgYSBnbG9iYWwgbG9jayB0aGF0IG11c3QgYmUKLWhlbGQgYnkgdGhlIGN1cnJlbnQgdGhyZWFkIGJlZm9yZSBpdCBjYW4gc2FmZWx5IGFjY2VzcyBQeXRob24gb2JqZWN0cy4KLVdpdGhvdXQgdGhlIGxvY2ssIGV2ZW4gdGhlIHNpbXBsZXN0IG9wZXJhdGlvbnMgY291bGQgY2F1c2UgcHJvYmxlbXMgaW4KLWEgbXVsdGktdGhyZWFkZWQgcHJvZ3JhbTogZm9yIGV4YW1wbGUsIHdoZW4gdHdvIHRocmVhZHMgc2ltdWx0YW5lb3VzbHkKLWluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBzYW1lIG9iamVjdCwgdGhlIHJlZmVyZW5jZSBjb3VudAotY291bGQgZW5kIHVwIGJlaW5nIGluY3JlbWVudGVkIG9ubHkgb25jZSBpbnN0ZWFkIG9mIHR3aWNlLgotCi1UaGVyZWZvcmUsIHRoZSBydWxlIGV4aXN0cyB0aGF0IG9ubHkgdGhlIHRocmVhZCB0aGF0IGhhcyBhY3F1aXJlZCB0aGUKLWdsb2JhbCBpbnRlcnByZXRlciBsb2NrIG1heSBvcGVyYXRlIG9uIFB5dGhvbiBvYmplY3RzIG9yIGNhbGwgUHl0aG9uL0MKLUFQSSBmdW5jdGlvbnMuICBJbiBvcmRlciB0byBzdXBwb3J0IG11bHRpLXRocmVhZGVkIFB5dGhvbiBwcm9ncmFtcywKLXRoZSBpbnRlcnByZXRlciByZWd1bGFybHkgcmVsZWFzZXMgYW5kIHJlYWNxdWlyZXMgdGhlIGxvY2sgLS0tIGJ5Ci1kZWZhdWx0LCBldmVyeSAxMDAgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb25zICh0aGlzIGNhbiBiZSBjaGFuZ2VkIHdpdGgKLVx3aXRoc3ViaXRlbXsoaW4gbW9kdWxlIHN5cyl9e1x0dGluZGV4e3NldGNoZWNraW50ZXJ2YWwoKX19Ci1cZnVuY3Rpb257c3lzLnNldGNoZWNraW50ZXJ2YWwoKX0pLiAgVGhlIGxvY2sgaXMgYWxzbyByZWxlYXNlZCBhbmQKLXJlYWNxdWlyZWQgYXJvdW5kIHBvdGVudGlhbGx5IGJsb2NraW5nIEkvTyBvcGVyYXRpb25zIGxpa2UgcmVhZGluZyBvcgotd3JpdGluZyBhIGZpbGUsIHNvIHRoYXQgb3RoZXIgdGhyZWFkcyBjYW4gcnVuIHdoaWxlIHRoZSB0aHJlYWQgdGhhdAotcmVxdWVzdHMgdGhlIEkvTyBpcyB3YWl0aW5nIGZvciB0aGUgSS9PIG9wZXJhdGlvbiB0byBjb21wbGV0ZS4KLQotVGhlIFB5dGhvbiBpbnRlcnByZXRlciBuZWVkcyB0byBrZWVwIHNvbWUgYm9va2tlZXBpbmcgaW5mb3JtYXRpb24KLXNlcGFyYXRlIHBlciB0aHJlYWQgLS0tIGZvciB0aGlzIGl0IHVzZXMgYSBkYXRhIHN0cnVjdHVyZSBjYWxsZWQKLVxjdHlwZXtQeVRocmVhZFN0YXRlfVx0dGluZGV4e1B5VGhyZWFkU3RhdGV9LiAgVGhlcmUncyBvbmUgZ2xvYmFsCi12YXJpYWJsZSwgaG93ZXZlcjogdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQKLVxjdHlwZXtQeVRocmVhZFN0YXRlfVx0dGluZGV4e1B5VGhyZWFkU3RhdGV9IHN0cnVjdHVyZS4gIFdoaWxlIG1vc3QKLXRocmVhZCBwYWNrYWdlcyBoYXZlIGEgd2F5IHRvIHN0b3JlIGBgcGVyLXRocmVhZCBnbG9iYWwgZGF0YSwnJwotUHl0aG9uJ3MgaW50ZXJuYWwgcGxhdGZvcm0gaW5kZXBlbmRlbnQgdGhyZWFkIGFic3RyYWN0aW9uIGRvZXNuJ3QKLXN1cHBvcnQgdGhpcyB5ZXQuICBUaGVyZWZvcmUsIHRoZSBjdXJyZW50IHRocmVhZCBzdGF0ZSBtdXN0IGJlCi1tYW5pcHVsYXRlZCBleHBsaWNpdGx5LgotCi1UaGlzIGlzIGVhc3kgZW5vdWdoIGluIG1vc3QgY2FzZXMuICBNb3N0IGNvZGUgbWFuaXB1bGF0aW5nIHRoZSBnbG9iYWwKLWludGVycHJldGVyIGxvY2sgaGFzIHRoZSBmb2xsb3dpbmcgc2ltcGxlIHN0cnVjdHVyZToKLQotXGJlZ2lue3ZlcmJhdGltfQotU2F2ZSB0aGUgdGhyZWFkIHN0YXRlIGluIGEgbG9jYWwgdmFyaWFibGUuCi1SZWxlYXNlIHRoZSBpbnRlcnByZXRlciBsb2NrLgotLi4uRG8gc29tZSBibG9ja2luZyBJL08gb3BlcmF0aW9uLi4uCi1SZWFjcXVpcmUgdGhlIGludGVycHJldGVyIGxvY2suCi1SZXN0b3JlIHRoZSB0aHJlYWQgc3RhdGUgZnJvbSB0aGUgbG9jYWwgdmFyaWFibGUuCi1cZW5ke3ZlcmJhdGltfQotCi1UaGlzIGlzIHNvIGNvbW1vbiB0aGF0IGEgcGFpciBvZiBtYWNyb3MgZXhpc3RzIHRvIHNpbXBsaWZ5IGl0OgotCi1cYmVnaW57dmVyYmF0aW19Ci1QeV9CRUdJTl9BTExPV19USFJFQURTCi0uLi5EbyBzb21lIGJsb2NraW5nIEkvTyBvcGVyYXRpb24uLi4KLVB5X0VORF9BTExPV19USFJFQURTCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUKLVxjc2ltcGxlbWFjcm97UHlfQkVHSU5fQUxMT1dfVEhSRUFEU31cdHRpbmRleHtQeV9CRUdJTl9BTExPV19USFJFQURTfQotbWFjcm8gb3BlbnMgYSBuZXcgYmxvY2sgYW5kIGRlY2xhcmVzIGEgaGlkZGVuIGxvY2FsIHZhcmlhYmxlOyB0aGUKLVxjc2ltcGxlbWFjcm97UHlfRU5EX0FMTE9XX1RIUkVBRFN9XHR0aW5kZXh7UHlfRU5EX0FMTE9XX1RIUkVBRFN9Ci1tYWNybyBjbG9zZXMgdGhlIGJsb2NrLiAgQW5vdGhlciBhZHZhbnRhZ2Ugb2YgdXNpbmcgdGhlc2UgdHdvIG1hY3JvcwotaXMgdGhhdCB3aGVuIFB5dGhvbiBpcyBjb21waWxlZCB3aXRob3V0IHRocmVhZCBzdXBwb3J0LCB0aGV5IGFyZQotZGVmaW5lZCBlbXB0eSwgdGh1cyBzYXZpbmcgdGhlIHRocmVhZCBzdGF0ZSBhbmQgbG9jayBtYW5pcHVsYXRpb25zLgotCi1XaGVuIHRocmVhZCBzdXBwb3J0IGlzIGVuYWJsZWQsIHRoZSBibG9jayBhYm92ZSBleHBhbmRzIHRvIHRoZQotZm9sbG93aW5nIGNvZGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICBQeVRocmVhZFN0YXRlICpfc2F2ZTsKLQotICAgIF9zYXZlID0gUHlFdmFsX1NhdmVUaHJlYWQoKTsKLSAgICAuLi5EbyBzb21lIGJsb2NraW5nIEkvTyBvcGVyYXRpb24uLi4KLSAgICBQeUV2YWxfUmVzdG9yZVRocmVhZChfc2F2ZSk7Ci1cZW5ke3ZlcmJhdGltfQotCi1Vc2luZyBldmVuIGxvd2VyIGxldmVsIHByaW1pdGl2ZXMsIHdlIGNhbiBnZXQgcm91Z2hseSB0aGUgc2FtZSBlZmZlY3QKLWFzIGZvbGxvd3M6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICBQeVRocmVhZFN0YXRlICpfc2F2ZTsKLQotICAgIF9zYXZlID0gUHlUaHJlYWRTdGF0ZV9Td2FwKE5VTEwpOwotICAgIFB5RXZhbF9SZWxlYXNlTG9jaygpOwotICAgIC4uLkRvIHNvbWUgYmxvY2tpbmcgSS9PIG9wZXJhdGlvbi4uLgotICAgIFB5RXZhbF9BY3F1aXJlTG9jaygpOwotICAgIFB5VGhyZWFkU3RhdGVfU3dhcChfc2F2ZSk7Ci1cZW5ke3ZlcmJhdGltfQotCi1UaGVyZSBhcmUgc29tZSBzdWJ0bGUgZGlmZmVyZW5jZXM7IGluIHBhcnRpY3VsYXIsCi1cY2Z1bmN0aW9ue1B5RXZhbF9SZXN0b3JlVGhyZWFkKCl9XHR0aW5kZXh7UHlFdmFsX1Jlc3RvcmVUaHJlYWQoKX0gc2F2ZXMKLWFuZCByZXN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlICBnbG9iYWwgdmFyaWFibGUKLVxjZGF0YXtlcnJub31cdHRpbmRleHtlcnJub30sIHNpbmNlIHRoZSBsb2NrIG1hbmlwdWxhdGlvbiBkb2VzIG5vdAotZ3VhcmFudGVlIHRoYXQgXGNkYXRhe2Vycm5vfSBpcyBsZWZ0IGFsb25lLiAgQWxzbywgd2hlbiB0aHJlYWQgc3VwcG9ydAotaXMgZGlzYWJsZWQsCi1cY2Z1bmN0aW9ue1B5RXZhbF9TYXZlVGhyZWFkKCl9XHR0aW5kZXh7UHlFdmFsX1NhdmVUaHJlYWQoKX0gYW5kCi1cY2Z1bmN0aW9ue1B5RXZhbF9SZXN0b3JlVGhyZWFkKCl9IGRvbid0IG1hbmlwdWxhdGUgdGhlIGxvY2s7IGluIHRoaXMKLWNhc2UsIFxjZnVuY3Rpb257UHlFdmFsX1JlbGVhc2VMb2NrKCl9XHR0aW5kZXh7UHlFdmFsX1JlbGVhc2VMb2NrKCl9IGFuZAotXGNmdW5jdGlvbntQeUV2YWxfQWNxdWlyZUxvY2soKX1cdHRpbmRleHtQeUV2YWxfQWNxdWlyZUxvY2soKX0gYXJlIG5vdAotYXZhaWxhYmxlLiAgVGhpcyBpcyBkb25lIHNvIHRoYXQgZHluYW1pY2FsbHkgbG9hZGVkIGV4dGVuc2lvbnMKLWNvbXBpbGVkIHdpdGggdGhyZWFkIHN1cHBvcnQgZW5hYmxlZCBjYW4gYmUgbG9hZGVkIGJ5IGFuIGludGVycHJldGVyCi10aGF0IHdhcyBjb21waWxlZCB3aXRoIGRpc2FibGVkIHRocmVhZCBzdXBwb3J0LgotCi1UaGUgZ2xvYmFsIGludGVycHJldGVyIGxvY2sgaXMgdXNlZCB0byBwcm90ZWN0IHRoZSBwb2ludGVyIHRvIHRoZQotY3VycmVudCB0aHJlYWQgc3RhdGUuICBXaGVuIHJlbGVhc2luZyB0aGUgbG9jayBhbmQgc2F2aW5nIHRoZSB0aHJlYWQKLXN0YXRlLCB0aGUgY3VycmVudCB0aHJlYWQgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHJldHJpZXZlZCBiZWZvcmUgdGhlCi1sb2NrIGlzIHJlbGVhc2VkIChzaW5jZSBhbm90aGVyIHRocmVhZCBjb3VsZCBpbW1lZGlhdGVseSBhY3F1aXJlIHRoZQotbG9jayBhbmQgc3RvcmUgaXRzIG93biB0aHJlYWQgc3RhdGUgaW4gdGhlIGdsb2JhbCB2YXJpYWJsZSkuCi1Db252ZXJzZWx5LCB3aGVuIGFjcXVpcmluZyB0aGUgbG9jayBhbmQgcmVzdG9yaW5nIHRoZSB0aHJlYWQgc3RhdGUsCi10aGUgbG9jayBtdXN0IGJlIGFjcXVpcmVkIGJlZm9yZSBzdG9yaW5nIHRoZSB0aHJlYWQgc3RhdGUgcG9pbnRlci4KLQotV2h5IGFtIEkgZ29pbmcgb24gd2l0aCBzbyBtdWNoIGRldGFpbCBhYm91dCB0aGlzPyAgQmVjYXVzZSB3aGVuCi10aHJlYWRzIGFyZSBjcmVhdGVkIGZyb20gQywgdGhleSBkb24ndCBoYXZlIHRoZSBnbG9iYWwgaW50ZXJwcmV0ZXIKLWxvY2ssIG5vciBpcyB0aGVyZSBhIHRocmVhZCBzdGF0ZSBkYXRhIHN0cnVjdHVyZSBmb3IgdGhlbS4gIFN1Y2gKLXRocmVhZHMgbXVzdCBib290c3RyYXAgdGhlbXNlbHZlcyBpbnRvIGV4aXN0ZW5jZSwgYnkgZmlyc3QgY3JlYXRpbmcgYQotdGhyZWFkIHN0YXRlIGRhdGEgc3RydWN0dXJlLCB0aGVuIGFjcXVpcmluZyB0aGUgbG9jaywgYW5kIGZpbmFsbHkKLXN0b3JpbmcgdGhlaXIgdGhyZWFkIHN0YXRlIHBvaW50ZXIsIGJlZm9yZSB0aGV5IGNhbiBzdGFydCB1c2luZyB0aGUKLVB5dGhvbi9DIEFQSS4gIFdoZW4gdGhleSBhcmUgZG9uZSwgdGhleSBzaG91bGQgcmVzZXQgdGhlIHRocmVhZCBzdGF0ZQotcG9pbnRlciwgcmVsZWFzZSB0aGUgbG9jaywgYW5kIGZpbmFsbHkgZnJlZSB0aGVpciB0aHJlYWQgc3RhdGUgZGF0YQotc3RydWN0dXJlLgotCi1CZWdpbm5pbmcgd2l0aCB2ZXJzaW9uIDIuMywgdGhyZWFkcyBjYW4gbm93IHRha2UgYWR2YW50YWdlIG9mIHRoZSAKLVxjZnVuY3Rpb257UHlHSUxTdGF0ZV8qKCl9IGZ1bmN0aW9ucyB0byBkbyBhbGwgb2YgdGhlIGFib3ZlCi1hdXRvbWF0aWNhbGx5LiAgVGhlIHR5cGljYWwgaWRpb20gZm9yIGNhbGxpbmcgaW50byBQeXRob24gZnJvbSBhIEMKLXRocmVhZCBpcyBub3c6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICBQeUdJTFN0YXRlX1NUQVRFIGdzdGF0ZTsKLSAgICBnc3RhdGUgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOwotCi0gICAgLyogUGVyZm9ybSBQeXRob24gYWN0aW9ucyBoZXJlLiAgKi8KLSAgICByZXN1bHQgPSBDYWxsU29tZUZ1bmN0aW9uKCk7Ci0gICAgLyogZXZhbHVhdGUgcmVzdWx0ICovCi0KLSAgICAvKiBSZWxlYXNlIHRoZSB0aHJlYWQuIE5vIFB5dGhvbiBBUEkgYWxsb3dlZCBiZXlvbmQgdGhpcyBwb2ludC4gKi8KLSAgICBQeUdJTFN0YXRlX1JlbGVhc2UoZ3N0YXRlKTsKLVxlbmR7dmVyYmF0aW19Ci0KLU5vdGUgdGhhdCB0aGUgXGNmdW5jdGlvbntQeUdJTFN0YXRlXyooKX0gZnVuY3Rpb25zIGFzc3VtZSB0aGVyZSBpcwotb25seSBvbmUgZ2xvYmFsIGludGVycHJldGVyIChjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYnkKLVxjZnVuY3Rpb257UHlfSW5pdGlhbGl6ZSgpfSkuICBQeXRob24gc3RpbGwgc3VwcG9ydHMgdGhlIGNyZWF0aW9uIG9mCi1hZGRpdGlvbmFsIGludGVycHJldGVycyAodXNpbmcgXGNmdW5jdGlvbntQeV9OZXdJbnRlcnByZXRlcigpfSksIGJ1dAotbWl4aW5nIG11bHRpcGxlIGludGVycHJldGVycyBhbmQgdGhlIFxjZnVuY3Rpb257UHlHSUxTdGF0ZV8qKCl9IEFQSSBpcwotdW5zdXBwb3J0ZWQuCi0KLVxiZWdpbntjdHlwZWRlc2N9e1B5SW50ZXJwcmV0ZXJTdGF0ZX0KLSAgVGhpcyBkYXRhIHN0cnVjdHVyZSByZXByZXNlbnRzIHRoZSBzdGF0ZSBzaGFyZWQgYnkgYSBudW1iZXIgb2YKLSAgY29vcGVyYXRpbmcgdGhyZWFkcy4gIFRocmVhZHMgYmVsb25naW5nIHRvIHRoZSBzYW1lIGludGVycHJldGVyCi0gIHNoYXJlIHRoZWlyIG1vZHVsZSBhZG1pbmlzdHJhdGlvbiBhbmQgYSBmZXcgb3RoZXIgaW50ZXJuYWwgaXRlbXMuCi0gIFRoZXJlIGFyZSBubyBwdWJsaWMgbWVtYmVycyBpbiB0aGlzIHN0cnVjdHVyZS4KLQotICBUaHJlYWRzIGJlbG9uZ2luZyB0byBkaWZmZXJlbnQgaW50ZXJwcmV0ZXJzIGluaXRpYWxseSBzaGFyZSBub3RoaW5nLAotICBleGNlcHQgcHJvY2VzcyBzdGF0ZSBsaWtlIGF2YWlsYWJsZSBtZW1vcnksIG9wZW4gZmlsZSBkZXNjcmlwdG9ycwotICBhbmQgc3VjaC4gIFRoZSBnbG9iYWwgaW50ZXJwcmV0ZXIgbG9jayBpcyBhbHNvIHNoYXJlZCBieSBhbGwKLSAgdGhyZWFkcywgcmVnYXJkbGVzcyBvZiB0byB3aGljaCBpbnRlcnByZXRlciB0aGV5IGJlbG9uZy4KLVxlbmR7Y3R5cGVkZXNjfQotCi1cYmVnaW57Y3R5cGVkZXNjfXtQeVRocmVhZFN0YXRlfQotICBUaGlzIGRhdGEgc3RydWN0dXJlIHJlcHJlc2VudHMgdGhlIHN0YXRlIG9mIGEgc2luZ2xlIHRocmVhZC4gIFRoZQotICBvbmx5IHB1YmxpYyBkYXRhIG1lbWJlciBpcyBcY3R5cGV7UHlJbnRlcnByZXRlclN0YXRlCi0gICp9XG1lbWJlcntpbnRlcnB9LCB3aGljaCBwb2ludHMgdG8gdGhpcyB0aHJlYWQncyBpbnRlcnByZXRlciBzdGF0ZS4KLVxlbmR7Y3R5cGVkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXt2b2lkfXtQeUV2YWxfSW5pdFRocmVhZHN9e30KLSAgSW5pdGlhbGl6ZSBhbmQgYWNxdWlyZSB0aGUgZ2xvYmFsIGludGVycHJldGVyIGxvY2suICBJdCBzaG91bGQgYmUKLSAgY2FsbGVkIGluIHRoZSBtYWluIHRocmVhZCBiZWZvcmUgY3JlYXRpbmcgYSBzZWNvbmQgdGhyZWFkIG9yCi0gIGVuZ2FnaW5nIGluIGFueSBvdGhlciB0aHJlYWQgb3BlcmF0aW9ucyBzdWNoIGFzCi0gIFxjZnVuY3Rpb257UHlFdmFsX1JlbGVhc2VMb2NrKCl9XHR0aW5kZXh7UHlFdmFsX1JlbGVhc2VMb2NrKCl9IG9yCi0gIFxjb2Rle1B5RXZhbF9SZWxlYXNlVGhyZWFkKFx2YXJ7dHN0YXRlfSl9XHR0aW5kZXh7UHlFdmFsX1JlbGVhc2VUaHJlYWQoKX0uCi0gIEl0IGlzIG5vdCBuZWVkZWQgYmVmb3JlIGNhbGxpbmcKLSAgXGNmdW5jdGlvbntQeUV2YWxfU2F2ZVRocmVhZCgpfVx0dGluZGV4e1B5RXZhbF9TYXZlVGhyZWFkKCl9IG9yCi0gIFxjZnVuY3Rpb257UHlFdmFsX1Jlc3RvcmVUaHJlYWQoKX1cdHRpbmRleHtQeUV2YWxfUmVzdG9yZVRocmVhZCgpfS4KLQotICBUaGlzIGlzIGEgbm8tb3Agd2hlbiBjYWxsZWQgZm9yIGEgc2Vjb25kIHRpbWUuICBJdCBpcyBzYWZlIHRvIGNhbGwKLSAgdGhpcyBmdW5jdGlvbiBiZWZvcmUgY2FsbGluZwotICBcY2Z1bmN0aW9ue1B5X0luaXRpYWxpemUoKX1cdHRpbmRleHtQeV9Jbml0aWFsaXplKCl9LgotCi0gIFdoZW4gb25seSB0aGUgbWFpbiB0aHJlYWQgZXhpc3RzLCBubyBsb2NrIG9wZXJhdGlvbnMgYXJlIG5lZWRlZC4KLSAgVGhpcyBpcyBhIGNvbW1vbiBzaXR1YXRpb24gKG1vc3QgUHl0aG9uIHByb2dyYW1zIGRvIG5vdCB1c2UKLSAgdGhyZWFkcyksIGFuZCB0aGUgbG9jayBvcGVyYXRpb25zIHNsb3cgdGhlIGludGVycHJldGVyIGRvd24gYSBiaXQuCi0gIFRoZXJlZm9yZSwgdGhlIGxvY2sgaXMgbm90IGNyZWF0ZWQgaW5pdGlhbGx5LiAgVGhpcyBzaXR1YXRpb24gaXMKLSAgZXF1aXZhbGVudCB0byBoYXZpbmcgYWNxdWlyZWQgdGhlIGxvY2s6ICB3aGVuIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUKLSAgdGhyZWFkLCBhbGwgb2JqZWN0IGFjY2Vzc2VzIGFyZSBzYWZlLiAgVGhlcmVmb3JlLCB3aGVuIHRoaXMgZnVuY3Rpb24KLSAgaW5pdGlhbGl6ZXMgdGhlIGxvY2ssIGl0IGFsc28gYWNxdWlyZXMgaXQuICBCZWZvcmUgdGhlIFB5dGhvbgotICBcbW9kdWxle3RocmVhZH1ccmVmYmltb2RpbmRleHt0aHJlYWR9IG1vZHVsZSBjcmVhdGVzIGEgbmV3IHRocmVhZCwKLSAga25vd2luZyB0aGF0IGVpdGhlciBpdCBoYXMgdGhlIGxvY2sgb3IgdGhlIGxvY2sgaGFzbid0IGJlZW4gY3JlYXRlZAotICB5ZXQsIGl0IGNhbGxzIFxjZnVuY3Rpb257UHlFdmFsX0luaXRUaHJlYWRzKCl9LiAgV2hlbiB0aGlzIGNhbGwKLSAgcmV0dXJucywgaXQgaXMgZ3VhcmFudGVlZCB0aGF0IHRoZSBsb2NrIGhhcyBiZWVuIGNyZWF0ZWQgYW5kIHRoYXQgdGhlCi0gIGNhbGxpbmcgdGhyZWFkIGhhcyBhY3F1aXJlZCBpdC4KLQotICBJdCBpcyBcc3Ryb25ne25vdH0gc2FmZSB0byBjYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiBpdCBpcyB1bmtub3duCi0gIHdoaWNoIHRocmVhZCAoaWYgYW55KSBjdXJyZW50bHkgaGFzIHRoZSBnbG9iYWwgaW50ZXJwcmV0ZXIgbG9jay4KLQotICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBhdmFpbGFibGUgd2hlbiB0aHJlYWQgc3VwcG9ydCBpcyBkaXNhYmxlZCBhdAotICBjb21waWxlIHRpbWUuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeUV2YWxfVGhyZWFkc0luaXRpYWxpemVkfXt9Ci0gIFJldHVybnMgYSBub24temVybyB2YWx1ZSBpZiBcY2Z1bmN0aW9ue1B5RXZhbF9Jbml0VGhyZWFkcygpfSBoYXMgYmVlbgotICBjYWxsZWQuICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgd2l0aG91dCBob2xkaW5nIHRoZSBsb2NrLCBhbmQKLSAgdGhlcmVmb3JlIGNhbiBiZSB1c2VkIHRvIGF2b2lkIGNhbGxzIHRvIHRoZSBsb2NraW5nIEFQSSB3aGVuIHJ1bm5pbmcKLSAgc2luZ2xlLXRocmVhZGVkLiAgVGhpcyBmdW5jdGlvbiBpcyBub3QgYXZhaWxhYmxlIHdoZW4gdGhyZWFkIHN1cHBvcnQKLSAgaXMgZGlzYWJsZWQgYXQgY29tcGlsZSB0aW1lLiBcdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXt2b2lkfXtQeUV2YWxfQWNxdWlyZUxvY2t9e30KLSAgQWNxdWlyZSB0aGUgZ2xvYmFsIGludGVycHJldGVyIGxvY2suICBUaGUgbG9jayBtdXN0IGhhdmUgYmVlbgotICBjcmVhdGVkIGVhcmxpZXIuICBJZiB0aGlzIHRocmVhZCBhbHJlYWR5IGhhcyB0aGUgbG9jaywgYSBkZWFkbG9jawotICBlbnN1ZXMuICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBhdmFpbGFibGUgd2hlbiB0aHJlYWQgc3VwcG9ydCBpcwotICBkaXNhYmxlZCBhdCBjb21waWxlIHRpbWUuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317dm9pZH17UHlFdmFsX1JlbGVhc2VMb2NrfXt9Ci0gIFJlbGVhc2UgdGhlIGdsb2JhbCBpbnRlcnByZXRlciBsb2NrLiAgVGhlIGxvY2sgbXVzdCBoYXZlIGJlZW4KLSAgY3JlYXRlZCBlYXJsaWVyLiAgVGhpcyBmdW5jdGlvbiBpcyBub3QgYXZhaWxhYmxlIHdoZW4gdGhyZWFkIHN1cHBvcnQKLSAgaXMgZGlzYWJsZWQgYXQgY29tcGlsZSB0aW1lLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e3ZvaWR9e1B5RXZhbF9BY3F1aXJlVGhyZWFkfXtQeVRocmVhZFN0YXRlICp0c3RhdGV9Ci0gIEFjcXVpcmUgdGhlIGdsb2JhbCBpbnRlcnByZXRlciBsb2NrIGFuZCBzZXQgdGhlIGN1cnJlbnQgdGhyZWFkCi0gIHN0YXRlIHRvIFx2YXJ7dHN0YXRlfSwgd2hpY2ggc2hvdWxkIG5vdCBiZSBcTlVMTC4gIFRoZSBsb2NrIG11c3QKLSAgaGF2ZSBiZWVuIGNyZWF0ZWQgZWFybGllci4gIElmIHRoaXMgdGhyZWFkIGFscmVhZHkgaGFzIHRoZSBsb2NrLAotICBkZWFkbG9jayBlbnN1ZXMuICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBhdmFpbGFibGUgd2hlbiB0aHJlYWQgc3VwcG9ydAotICBpcyBkaXNhYmxlZCBhdCBjb21waWxlIHRpbWUuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317dm9pZH17UHlFdmFsX1JlbGVhc2VUaHJlYWR9e1B5VGhyZWFkU3RhdGUgKnRzdGF0ZX0KLSAgUmVzZXQgdGhlIGN1cnJlbnQgdGhyZWFkIHN0YXRlIHRvIFxOVUxMe30gYW5kIHJlbGVhc2UgdGhlIGdsb2JhbAotICBpbnRlcnByZXRlciBsb2NrLiAgVGhlIGxvY2sgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCBlYXJsaWVyIGFuZCBtdXN0Ci0gIGJlIGhlbGQgYnkgdGhlIGN1cnJlbnQgdGhyZWFkLiAgVGhlIFx2YXJ7dHN0YXRlfSBhcmd1bWVudCwgd2hpY2gKLSAgbXVzdCBub3QgYmUgXE5VTEwsIGlzIG9ubHkgdXNlZCB0byBjaGVjayB0aGF0IGl0IHJlcHJlc2VudHMgdGhlCi0gIGN1cnJlbnQgdGhyZWFkIHN0YXRlIC0tLSBpZiBpdCBpc24ndCwgYSBmYXRhbCBlcnJvciBpcyByZXBvcnRlZC4KLSAgVGhpcyBmdW5jdGlvbiBpcyBub3QgYXZhaWxhYmxlIHdoZW4gdGhyZWFkIHN1cHBvcnQgaXMgZGlzYWJsZWQgYXQKLSAgY29tcGlsZSB0aW1lLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5VGhyZWFkU3RhdGUqfXtQeUV2YWxfU2F2ZVRocmVhZH17fQotICBSZWxlYXNlIHRoZSBpbnRlcnByZXRlciBsb2NrIChpZiBpdCBoYXMgYmVlbiBjcmVhdGVkIGFuZCB0aHJlYWQKLSAgc3VwcG9ydCBpcyBlbmFibGVkKSBhbmQgcmVzZXQgdGhlIHRocmVhZCBzdGF0ZSB0byBcTlVMTCwgcmV0dXJuaW5nCi0gIHRoZSBwcmV2aW91cyB0aHJlYWQgc3RhdGUgKHdoaWNoIGlzIG5vdCBcTlVMTCkuICBJZiB0aGUgbG9jayBoYXMKLSAgYmVlbiBjcmVhdGVkLCB0aGUgY3VycmVudCB0aHJlYWQgbXVzdCBoYXZlIGFjcXVpcmVkIGl0LiAgKFRoaXMKLSAgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIGV2ZW4gd2hlbiB0aHJlYWQgc3VwcG9ydCBpcyBkaXNhYmxlZCBhdAotICBjb21waWxlIHRpbWUuKQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e3ZvaWR9e1B5RXZhbF9SZXN0b3JlVGhyZWFkfXtQeVRocmVhZFN0YXRlICp0c3RhdGV9Ci0gIEFjcXVpcmUgdGhlIGludGVycHJldGVyIGxvY2sgKGlmIGl0IGhhcyBiZWVuIGNyZWF0ZWQgYW5kIHRocmVhZAotICBzdXBwb3J0IGlzIGVuYWJsZWQpIGFuZCBzZXQgdGhlIHRocmVhZCBzdGF0ZSB0byBcdmFye3RzdGF0ZX0sIHdoaWNoCi0gIG11c3Qgbm90IGJlIFxOVUxMLiAgSWYgdGhlIGxvY2sgaGFzIGJlZW4gY3JlYXRlZCwgdGhlIGN1cnJlbnQgdGhyZWFkCi0gIG11c3Qgbm90IGhhdmUgYWNxdWlyZWQgaXQsIG90aGVyd2lzZSBkZWFkbG9jayBlbnN1ZXMuICAoVGhpcwotICBmdW5jdGlvbiBpcyBhdmFpbGFibGUgZXZlbiB3aGVuIHRocmVhZCBzdXBwb3J0IGlzIGRpc2FibGVkIGF0Ci0gIGNvbXBpbGUgdGltZS4pCi1cZW5ke2NmdW5jZGVzY30KLQotVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIG5vcm1hbGx5IHVzZWQgd2l0aG91dCBhIHRyYWlsaW5nIHNlbWljb2xvbjsKLWxvb2sgZm9yIGV4YW1wbGUgdXNhZ2UgaW4gdGhlIFB5dGhvbiBzb3VyY2UgZGlzdHJpYnV0aW9uLgotCi1cYmVnaW57Y3NpbXBsZW1hY3JvZGVzY317UHlfQkVHSU5fQUxMT1dfVEhSRUFEU30KLSAgVGhpcyBtYWNybyBleHBhbmRzIHRvCi0gIFxzYW1we1x7IFB5VGhyZWFkU3RhdGUgKl9zYXZlOyBfc2F2ZSA9IFB5RXZhbF9TYXZlVGhyZWFkKCk7fS4KLSAgTm90ZSB0aGF0IGl0IGNvbnRhaW5zIGFuIG9wZW5pbmcgYnJhY2U7IGl0IG11c3QgYmUgbWF0Y2hlZCB3aXRoIGEKLSAgZm9sbG93aW5nIFxjc2ltcGxlbWFjcm97UHlfRU5EX0FMTE9XX1RIUkVBRFN9IG1hY3JvLiAgU2VlIGFib3ZlIGZvcgotICBmdXJ0aGVyIGRpc2N1c3Npb24gb2YgdGhpcyBtYWNyby4gIEl0IGlzIGEgbm8tb3Agd2hlbiB0aHJlYWQgc3VwcG9ydAotICBpcyBkaXNhYmxlZCBhdCBjb21waWxlIHRpbWUuCi1cZW5ke2NzaW1wbGVtYWNyb2Rlc2N9Ci0KLVxiZWdpbntjc2ltcGxlbWFjcm9kZXNjfXtQeV9FTkRfQUxMT1dfVEhSRUFEU30KLSAgVGhpcyBtYWNybyBleHBhbmRzIHRvIFxzYW1we1B5RXZhbF9SZXN0b3JlVGhyZWFkKF9zYXZlKTsgXH19LgotICBOb3RlIHRoYXQgaXQgY29udGFpbnMgYSBjbG9zaW5nIGJyYWNlOyBpdCBtdXN0IGJlIG1hdGNoZWQgd2l0aCBhbgotICBlYXJsaWVyIFxjc2ltcGxlbWFjcm97UHlfQkVHSU5fQUxMT1dfVEhSRUFEU30gbWFjcm8uICBTZWUgYWJvdmUgZm9yCi0gIGZ1cnRoZXIgZGlzY3Vzc2lvbiBvZiB0aGlzIG1hY3JvLiAgSXQgaXMgYSBuby1vcCB3aGVuIHRocmVhZCBzdXBwb3J0Ci0gIGlzIGRpc2FibGVkIGF0IGNvbXBpbGUgdGltZS4KLVxlbmR7Y3NpbXBsZW1hY3JvZGVzY30KLQotXGJlZ2lue2NzaW1wbGVtYWNyb2Rlc2N9e1B5X0JMT0NLX1RIUkVBRFN9Ci0gIFRoaXMgbWFjcm8gZXhwYW5kcyB0byBcc2FtcHtQeUV2YWxfUmVzdG9yZVRocmVhZChfc2F2ZSk7fTogaXQgaXMKLSAgZXF1aXZhbGVudCB0byBcY3NpbXBsZW1hY3Jve1B5X0VORF9BTExPV19USFJFQURTfSB3aXRob3V0IHRoZQotICBjbG9zaW5nIGJyYWNlLiAgSXQgaXMgYSBuby1vcCB3aGVuIHRocmVhZCBzdXBwb3J0IGlzIGRpc2FibGVkIGF0Ci0gIGNvbXBpbGUgdGltZS4KLVxlbmR7Y3NpbXBsZW1hY3JvZGVzY30KLQotXGJlZ2lue2NzaW1wbGVtYWNyb2Rlc2N9e1B5X1VOQkxPQ0tfVEhSRUFEU30KLSAgVGhpcyBtYWNybyBleHBhbmRzIHRvIFxzYW1we19zYXZlID0gUHlFdmFsX1NhdmVUaHJlYWQoKTt9OiBpdCBpcwotICBlcXVpdmFsZW50IHRvIFxjc2ltcGxlbWFjcm97UHlfQkVHSU5fQUxMT1dfVEhSRUFEU30gd2l0aG91dCB0aGUKLSAgb3BlbmluZyBicmFjZSBhbmQgdmFyaWFibGUgZGVjbGFyYXRpb24uICBJdCBpcyBhIG5vLW9wIHdoZW4gdGhyZWFkCi0gIHN1cHBvcnQgaXMgZGlzYWJsZWQgYXQgY29tcGlsZSB0aW1lLgotXGVuZHtjc2ltcGxlbWFjcm9kZXNjfQotCi1BbGwgb2YgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIG9ubHkgYXZhaWxhYmxlIHdoZW4gdGhyZWFkIHN1cHBvcnQKLWlzIGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lLCBhbmQgbXVzdCBiZSBjYWxsZWQgb25seSB3aGVuIHRoZQotaW50ZXJwcmV0ZXIgbG9jayBoYXMgYmVlbiBjcmVhdGVkLgotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeUludGVycHJldGVyU3RhdGUqfXtQeUludGVycHJldGVyU3RhdGVfTmV3fXt9Ci0gIENyZWF0ZSBhIG5ldyBpbnRlcnByZXRlciBzdGF0ZSBvYmplY3QuICBUaGUgaW50ZXJwcmV0ZXIgbG9jayBuZWVkCi0gIG5vdCBiZSBoZWxkLCBidXQgbWF5IGJlIGhlbGQgaWYgaXQgaXMgbmVjZXNzYXJ5IHRvIHNlcmlhbGl6ZSBjYWxscwotICB0byB0aGlzIGZ1bmN0aW9uLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e3ZvaWR9e1B5SW50ZXJwcmV0ZXJTdGF0ZV9DbGVhcn17UHlJbnRlcnByZXRlclN0YXRlICppbnRlcnB9Ci0gIFJlc2V0IGFsbCBpbmZvcm1hdGlvbiBpbiBhbiBpbnRlcnByZXRlciBzdGF0ZSBvYmplY3QuICBUaGUKLSAgaW50ZXJwcmV0ZXIgbG9jayBtdXN0IGJlIGhlbGQuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317dm9pZH17UHlJbnRlcnByZXRlclN0YXRlX0RlbGV0ZX17UHlJbnRlcnByZXRlclN0YXRlICppbnRlcnB9Ci0gIERlc3Ryb3kgYW4gaW50ZXJwcmV0ZXIgc3RhdGUgb2JqZWN0LiAgVGhlIGludGVycHJldGVyIGxvY2sgbmVlZCBub3QKLSAgYmUgaGVsZC4gIFRoZSBpbnRlcnByZXRlciBzdGF0ZSBtdXN0IGhhdmUgYmVlbiByZXNldCB3aXRoIGEgcHJldmlvdXMKLSAgY2FsbCB0byBcY2Z1bmN0aW9ue1B5SW50ZXJwcmV0ZXJTdGF0ZV9DbGVhcigpfS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeVRocmVhZFN0YXRlKn17UHlUaHJlYWRTdGF0ZV9OZXd9e1B5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwfQotICBDcmVhdGUgYSBuZXcgdGhyZWFkIHN0YXRlIG9iamVjdCBiZWxvbmdpbmcgdG8gdGhlIGdpdmVuIGludGVycHJldGVyCi0gIG9iamVjdC4gIFRoZSBpbnRlcnByZXRlciBsb2NrIG5lZWQgbm90IGJlIGhlbGQsIGJ1dCBtYXkgYmUgaGVsZCBpZgotICBpdCBpcyBuZWNlc3NhcnkgdG8gc2VyaWFsaXplIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24uCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317dm9pZH17UHlUaHJlYWRTdGF0ZV9DbGVhcn17UHlUaHJlYWRTdGF0ZSAqdHN0YXRlfQotICBSZXNldCBhbGwgaW5mb3JtYXRpb24gaW4gYSB0aHJlYWQgc3RhdGUgb2JqZWN0LiAgVGhlIGludGVycHJldGVyIGxvY2sKLSAgbXVzdCBiZSBoZWxkLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e3ZvaWR9e1B5VGhyZWFkU3RhdGVfRGVsZXRlfXtQeVRocmVhZFN0YXRlICp0c3RhdGV9Ci0gIERlc3Ryb3kgYSB0aHJlYWQgc3RhdGUgb2JqZWN0LiAgVGhlIGludGVycHJldGVyIGxvY2sgbmVlZCBub3QgYmUKLSAgaGVsZC4gIFRoZSB0aHJlYWQgc3RhdGUgbXVzdCBoYXZlIGJlZW4gcmVzZXQgd2l0aCBhIHByZXZpb3VzIGNhbGwgdG8KLSAgXGNmdW5jdGlvbntQeVRocmVhZFN0YXRlX0NsZWFyKCl9LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5VGhyZWFkU3RhdGUqfXtQeVRocmVhZFN0YXRlX0dldH17fQotICBSZXR1cm4gdGhlIGN1cnJlbnQgdGhyZWFkIHN0YXRlLiAgVGhlIGludGVycHJldGVyIGxvY2sgbXVzdCBiZQotICBoZWxkLiAgV2hlbiB0aGUgY3VycmVudCB0aHJlYWQgc3RhdGUgaXMgXE5VTEwsIHRoaXMgaXNzdWVzIGEgZmF0YWwKLSAgZXJyb3IgKHNvIHRoYXQgdGhlIGNhbGxlciBuZWVkbid0IGNoZWNrIGZvciBcTlVMTCkuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlUaHJlYWRTdGF0ZSp9e1B5VGhyZWFkU3RhdGVfU3dhcH17UHlUaHJlYWRTdGF0ZSAqdHN0YXRlfQotICBTd2FwIHRoZSBjdXJyZW50IHRocmVhZCBzdGF0ZSB3aXRoIHRoZSB0aHJlYWQgc3RhdGUgZ2l2ZW4gYnkgdGhlCi0gIGFyZ3VtZW50IFx2YXJ7dHN0YXRlfSwgd2hpY2ggbWF5IGJlIFxOVUxMLiAgVGhlIGludGVycHJldGVyIGxvY2sKLSAgbXVzdCBiZSBoZWxkLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlUaHJlYWRTdGF0ZV9HZXREaWN0fXt9Ci0gIFJldHVybiBhIGRpY3Rpb25hcnkgaW4gd2hpY2ggZXh0ZW5zaW9ucyBjYW4gc3RvcmUgdGhyZWFkLXNwZWNpZmljCi0gIHN0YXRlIGluZm9ybWF0aW9uLiAgRWFjaCBleHRlbnNpb24gc2hvdWxkIHVzZSBhIHVuaXF1ZSBrZXkgdG8gdXNlIHRvCi0gIHN0b3JlIHN0YXRlIGluIHRoZSBkaWN0aW9uYXJ5LiAgSXQgaXMgb2theSB0byBjYWxsIHRoaXMgZnVuY3Rpb24KLSAgd2hlbiBubyBjdXJyZW50IHRocmVhZCBzdGF0ZSBpcyBhdmFpbGFibGUuCi0gIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBcTlVMTCwgbm8gZXhjZXB0aW9uIGhhcyBiZWVuIHJhaXNlZCBhbmQgdGhlCi0gIGNhbGxlciBzaG91bGQgYXNzdW1lIG5vIGN1cnJlbnQgdGhyZWFkIHN0YXRlIGlzIGF2YWlsYWJsZS4KLSAgXHZlcnNpb25jaGFuZ2VkW1ByZXZpb3VzbHkgdGhpcyBjb3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIGEgY3VycmVudAotICB0aHJlYWQgaXMgYWN0aXZlLCBhbmQgXE5VTEx7fSBtZWFudCB0aGF0IGFuIGV4Y2VwdGlvbiB3YXMgcmFpc2VkXXsyLjN9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeVRocmVhZFN0YXRlX1NldEFzeW5jRXhjfXtsb25nIGlkLCBQeU9iamVjdCAqZXhjfQotICBBc3luY2hyb25vdXNseSByYWlzZSBhbiBleGNlcHRpb24gaW4gYSB0aHJlYWQuCi0gIFRoZSBcdmFye2lkfSBhcmd1bWVudCBpcyB0aGUgdGhyZWFkIGlkIG9mIHRoZSB0YXJnZXQgdGhyZWFkOwotICBcdmFye2V4Y30gaXMgdGhlIGV4Y2VwdGlvbiBvYmplY3QgdG8gYmUgcmFpc2VkLgotICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHN0ZWFsIGFueSByZWZlcmVuY2VzIHRvIFx2YXJ7ZXhjfS4KLSAgVG8gcHJldmVudCBuYWl2ZSBtaXN1c2UsIHlvdSBtdXN0IHdyaXRlIHlvdXIgb3duIEMgZXh0ZW5zaW9uCi0gIHRvIGNhbGwgdGhpcy4gIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIEdJTCBoZWxkLgotICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhyZWFkIHN0YXRlcyBtb2RpZmllZDsgdGhpcyBpcyBub3JtYWxseSBvbmUsIGJ1dAotICB3aWxsIGJlIHplcm8gaWYgdGhlIHRocmVhZCBpZCBpc24ndCBmb3VuZC4gIElmIFx2YXJ7ZXhjfSBpcwotICBcY29uc3RhbnR7TlVMTH0sIHRoZSBwZW5kaW5nIGV4Y2VwdGlvbiAoaWYgYW55KSBmb3IgdGhlIHRocmVhZCBpcyBjbGVhcmVkLgotICBUaGlzIHJhaXNlcyBubyBleGNlcHRpb25zLgotICBcdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeUdJTFN0YXRlX1NUQVRFfXtQeUdJTFN0YXRlX0Vuc3VyZX17fQotRW5zdXJlIHRoYXQgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIHJlYWR5IHRvIGNhbGwgdGhlIFB5dGhvbiBDIEFQSQotcmVnYXJkbGVzcyBvZiB0aGUgY3VycmVudCBzdGF0ZSBvZiBQeXRob24sIG9yIG9mIGl0cyB0aHJlYWQgbG9jay4KLVRoaXMgbWF5IGJlIGNhbGxlZCBhcyBtYW55IHRpbWVzIGFzIGRlc2lyZWQgYnkgYSB0aHJlYWQgYXMgbG9uZyBhcwotZWFjaCBjYWxsIGlzIG1hdGNoZWQgd2l0aCBhIGNhbGwgdG8gXGNmdW5jdGlvbntQeUdJTFN0YXRlX1JlbGVhc2UoKX0uCi1JbiBnZW5lcmFsLCBvdGhlciB0aHJlYWQtcmVsYXRlZCBBUElzIG1heSBiZSB1c2VkIGJldHdlZW4KLVxjZnVuY3Rpb257UHlHSUxTdGF0ZV9FbnN1cmUoKX0gYW5kIFxjZnVuY3Rpb257UHlHSUxTdGF0ZV9SZWxlYXNlKCl9Ci1jYWxscyBhcyBsb25nIGFzIHRoZSB0aHJlYWQgc3RhdGUgaXMgcmVzdG9yZWQgdG8gaXRzIHByZXZpb3VzIHN0YXRlCi1iZWZvcmUgdGhlIFJlbGVhc2UoKS4gIEZvciBleGFtcGxlLCBub3JtYWwgdXNhZ2Ugb2YgdGhlCi1cY3NpbXBsZW1hY3Jve1B5X0JFR0lOX0FMTE9XX1RIUkVBRFN9IGFuZAotXGNzaW1wbGVtYWNyb3tQeV9FTkRfQUxMT1dfVEhSRUFEU30gbWFjcm9zIGlzIGFjY2VwdGFibGUuCi0gICAgCi1UaGUgcmV0dXJuIHZhbHVlIGlzIGFuIG9wYXF1ZSAiaGFuZGxlIiB0byB0aGUgdGhyZWFkIHN0YXRlIHdoZW4KLVxjZnVuY3Rpb257UHlHSUxTdGF0ZV9BY3F1aXJlKCl9IHdhcyBjYWxsZWQsIGFuZCBtdXN0IGJlIHBhc3NlZCB0bwotXGNmdW5jdGlvbntQeUdJTFN0YXRlX1JlbGVhc2UoKX0gdG8gZW5zdXJlIFB5dGhvbiBpcyBsZWZ0IGluIHRoZSBzYW1lCi1zdGF0ZS4gRXZlbiB0aG91Z2ggcmVjdXJzaXZlIGNhbGxzIGFyZSBhbGxvd2VkLCB0aGVzZSBoYW5kbGVzCi1cZW1waHtjYW5ub3R9IGJlIHNoYXJlZCAtIGVhY2ggdW5pcXVlIGNhbGwgdG8KLVxjZnVuY3Rpb257UHlHSUxTdGF0ZV9FbnN1cmV9IG11c3Qgc2F2ZSB0aGUgaGFuZGxlIGZvciBpdHMgY2FsbCB0bwotXGNmdW5jdGlvbntQeUdJTFN0YXRlX1JlbGVhc2V9LgotICAgIAotV2hlbiB0aGUgZnVuY3Rpb24gcmV0dXJucywgdGhlIGN1cnJlbnQgdGhyZWFkIHdpbGwgaG9sZCB0aGUgR0lMLgotRmFpbHVyZSBpcyBhIGZhdGFsIGVycm9yLgotICBcdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXt2b2lkfXtQeUdJTFN0YXRlX1JlbGVhc2V9e1B5R0lMU3RhdGVfU1RBVEV9Ci1SZWxlYXNlIGFueSByZXNvdXJjZXMgcHJldmlvdXNseSBhY3F1aXJlZC4gIEFmdGVyIHRoaXMgY2FsbCwgUHl0aG9uJ3MKLXN0YXRlIHdpbGwgYmUgdGhlIHNhbWUgYXMgaXQgd2FzIHByaW9yIHRvIHRoZSBjb3JyZXNwb25kaW5nCi1cY2Z1bmN0aW9ue1B5R0lMU3RhdGVfRW5zdXJlfSBjYWxsIChidXQgZ2VuZXJhbGx5IHRoaXMgc3RhdGUgd2lsbCBiZQotdW5rbm93biB0byB0aGUgY2FsbGVyLCBoZW5jZSB0aGUgdXNlIG9mIHRoZSBHSUxTdGF0ZSBBUEkuKQotICAgIAotRXZlcnkgY2FsbCB0byBcY2Z1bmN0aW9ue1B5R0lMU3RhdGVfRW5zdXJlKCl9IG11c3QgYmUgbWF0Y2hlZCBieSBhIGNhbGwgdG8gCi1cY2Z1bmN0aW9ue1B5R0lMU3RhdGVfUmVsZWFzZSgpfSBvbiB0aGUgc2FtZSB0aHJlYWQuCi0gIFx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLQotXHNlY3Rpb257UHJvZmlsaW5nIGFuZCBUcmFjaW5nIFxsYWJlbHtwcm9maWxpbmd9fQotCi1cc2VjdGlvbmF1dGhvcntGcmVkIEwuIERyYWtlLCBKci59e2ZkcmFrZUBhY20ub3JnfQotCi1UaGUgUHl0aG9uIGludGVycHJldGVyIHByb3ZpZGVzIHNvbWUgbG93LWxldmVsIHN1cHBvcnQgZm9yIGF0dGFjaGluZwotcHJvZmlsaW5nIGFuZCBleGVjdXRpb24gdHJhY2luZyBmYWNpbGl0aWVzLiAgVGhlc2UgYXJlIHVzZWQgZm9yCi1wcm9maWxpbmcsIGRlYnVnZ2luZywgYW5kIGNvdmVyYWdlIGFuYWx5c2lzIHRvb2xzLgotCi1TdGFydGluZyB3aXRoIFB5dGhvbiAyLjIsIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZhY2lsaXR5IHdhcwotc3Vic3RhbnRpYWxseSByZXZpc2VkLCBhbmQgYW4gaW50ZXJmYWNlIGZyb20gQyB3YXMgYWRkZWQuICBUaGlzIEMKLWludGVyZmFjZSBhbGxvd3MgdGhlIHByb2ZpbGluZyBvciB0cmFjaW5nIGNvZGUgdG8gYXZvaWQgdGhlIG92ZXJoZWFkCi1vZiBjYWxsaW5nIHRocm91Z2ggUHl0aG9uLWxldmVsIGNhbGxhYmxlIG9iamVjdHMsIG1ha2luZyBhIGRpcmVjdCBDCi1mdW5jdGlvbiBjYWxsIGluc3RlYWQuICBUaGUgZXNzZW50aWFsIGF0dHJpYnV0ZXMgb2YgdGhlIGZhY2lsaXR5IGhhdmUKLW5vdCBjaGFuZ2VkOyB0aGUgaW50ZXJmYWNlIGFsbG93cyB0cmFjZSBmdW5jdGlvbnMgdG8gYmUgaW5zdGFsbGVkCi1wZXItdGhyZWFkLCBhbmQgdGhlIGJhc2ljIGV2ZW50cyByZXBvcnRlZCB0byB0aGUgdHJhY2UgZnVuY3Rpb24gYXJlCi10aGUgc2FtZSBhcyBoYWQgYmVlbiByZXBvcnRlZCB0byB0aGUgUHl0aG9uLWxldmVsIHRyYWNlIGZ1bmN0aW9ucyBpbgotcHJldmlvdXMgdmVyc2lvbnMuCi0KLVxiZWdpbntjdHlwZWRlc2N9W1B5X3RyYWNlZnVuY117aW50ICgqUHlfdHJhY2VmdW5jKShQeU9iamVjdCAqb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUZyYW1lT2JqZWN0ICpmcmFtZSwgaW50IHdoYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmcpfQotICBUaGUgdHlwZSBvZiB0aGUgdHJhY2UgZnVuY3Rpb24gcmVnaXN0ZXJlZCB1c2luZwotICBcY2Z1bmN0aW9ue1B5RXZhbF9TZXRQcm9maWxlKCl9IGFuZCBcY2Z1bmN0aW9ue1B5RXZhbF9TZXRUcmFjZSgpfS4KLSAgVGhlIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgb2JqZWN0IHBhc3NlZCB0byB0aGUgcmVnaXN0cmF0aW9uCi0gIGZ1bmN0aW9uIGFzIFx2YXJ7b2JqfSwgXHZhcntmcmFtZX0gaXMgdGhlIGZyYW1lIG9iamVjdCB0byB3aGljaCB0aGUKLSAgZXZlbnQgcGVydGFpbnMsIFx2YXJ7d2hhdH0gaXMgb25lIG9mIHRoZSBjb25zdGFudHMKLSAgXGNvbnN0YW50e1B5VHJhY2VfQ0FMTH0sIFxjb25zdGFudHtQeVRyYWNlX0VYQ0VQVElPTn0sCi0gIFxjb25zdGFudHtQeVRyYWNlX0xJTkV9LCBcY29uc3RhbnR7UHlUcmFjZV9SRVRVUk59LAotICBcY29uc3RhbnR7UHlUcmFjZV9DX0NBTEx9LCBcY29uc3RhbnR7UHlUcmFjZV9DX0VYQ0VQVElPTn0sCi0gIG9yIFxjb25zdGFudHtQeVRyYWNlX0NfUkVUVVJOfSwgYW5kIFx2YXJ7YXJnfQotICBkZXBlbmRzIG9uIHRoZSB2YWx1ZSBvZiBcdmFye3doYXR9OgotCi0gIFxiZWdpbnt0YWJsZWlpfXtsfGx9e2NvbnN0YW50fXtWYWx1ZSBvZiBcdmFye3doYXR9fXtNZWFuaW5nIG9mIFx2YXJ7YXJnfX0KLSAgICBcbGluZWlpe1B5VHJhY2VfQ0FMTH17QWx3YXlzIFxOVUxMLn0KLSAgICBcbGluZWlpe1B5VHJhY2VfRVhDRVBUSU9OfXtFeGNlcHRpb24gaW5mb3JtYXRpb24gYXMgcmV0dXJuZWQgYnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcZnVuY3Rpb257c3lzLmV4Y19pbmZvKCl9Ln0KLSAgICBcbGluZWlpe1B5VHJhY2VfTElORX17QWx3YXlzIFxOVUxMLn0KLSAgICBcbGluZWlpe1B5VHJhY2VfUkVUVVJOfXtWYWx1ZSBiZWluZyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLn0KLSAgICBcbGluZWlpe1B5VHJhY2VfQ19DQUxMfXtOYW1lIG9mIGZ1bmN0aW9uIGJlaW5nIGNhbGxlZC59Ci0gICAgXGxpbmVpaXtQeVRyYWNlX0NfRVhDRVBUSU9OfXtBbHdheXMgXE5VTEwufQotICAgIFxsaW5laWl7UHlUcmFjZV9DX1JFVFVSTn17QWx3YXlzIFxOVUxMLn0KLSAgXGVuZHt0YWJsZWlpfQotXGVuZHtjdHlwZWRlc2N9Ci0KLVxiZWdpbntjdmFyZGVzY317aW50fXtQeVRyYWNlX0NBTEx9Ci0gIFRoZSB2YWx1ZSBvZiB0aGUgXHZhcnt3aGF0fSBwYXJhbWV0ZXIgdG8gYSBcY3R5cGV7UHlfdHJhY2VmdW5jfQotICBmdW5jdGlvbiB3aGVuIGEgbmV3IGNhbGwgdG8gYSBmdW5jdGlvbiBvciBtZXRob2QgaXMgYmVpbmcgcmVwb3J0ZWQsCi0gIG9yIGEgbmV3IGVudHJ5IGludG8gYSBnZW5lcmF0b3IuICBOb3RlIHRoYXQgdGhlIGNyZWF0aW9uIG9mIHRoZQotICBpdGVyYXRvciBmb3IgYSBnZW5lcmF0b3IgZnVuY3Rpb24gaXMgbm90IHJlcG9ydGVkIGFzIHRoZXJlIGlzIG5vCi0gIGNvbnRyb2wgdHJhbnNmZXIgdG8gdGhlIFB5dGhvbiBieXRlY29kZSBpbiB0aGUgY29ycmVzcG9uZGluZyBmcmFtZS4KLVxlbmR7Y3ZhcmRlc2N9Ci0KLVxiZWdpbntjdmFyZGVzY317aW50fXtQeVRyYWNlX0VYQ0VQVElPTn0KLSAgVGhlIHZhbHVlIG9mIHRoZSBcdmFye3doYXR9IHBhcmFtZXRlciB0byBhIFxjdHlwZXtQeV90cmFjZWZ1bmN9Ci0gIGZ1bmN0aW9uIHdoZW4gYW4gZXhjZXB0aW9uIGhhcyBiZWVuIHJhaXNlZC4gIFRoZSBjYWxsYmFjayBmdW5jdGlvbgotICBpcyBjYWxsZWQgd2l0aCB0aGlzIHZhbHVlIGZvciBcdmFye3doYXR9IHdoZW4gYWZ0ZXIgYW55IGJ5dGVjb2RlIGlzCi0gIHByb2Nlc3NlZCBhZnRlciB3aGljaCB0aGUgZXhjZXB0aW9uIGJlY29tZXMgc2V0IHdpdGhpbiB0aGUgZnJhbWUKLSAgYmVpbmcgZXhlY3V0ZWQuICBUaGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCBhcyBleGNlcHRpb24gcHJvcGFnYXRpb24KLSAgY2F1c2VzIHRoZSBQeXRob24gc3RhY2sgdG8gdW53aW5kLCB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkIHVwb24KLSAgcmV0dXJuIHRvIGVhY2ggZnJhbWUgYXMgdGhlIGV4Y2VwdGlvbiBwcm9wYWdhdGVzLiAgT25seSB0cmFjZQotICBmdW5jdGlvbnMgcmVjZWl2ZXMgdGhlc2UgZXZlbnRzOyB0aGV5IGFyZSBub3QgbmVlZGVkIGJ5IHRoZQotICBwcm9maWxlci4KLVxlbmR7Y3ZhcmRlc2N9Ci0KLVxiZWdpbntjdmFyZGVzY317aW50fXtQeVRyYWNlX0xJTkV9Ci0gIFRoZSB2YWx1ZSBwYXNzZWQgYXMgdGhlIFx2YXJ7d2hhdH0gcGFyYW1ldGVyIHRvIGEgdHJhY2UgZnVuY3Rpb24KLSAgKGJ1dCBub3QgYSBwcm9maWxpbmcgZnVuY3Rpb24pIHdoZW4gYSBsaW5lLW51bWJlciBldmVudCBpcyBiZWluZwotICByZXBvcnRlZC4KLVxlbmR7Y3ZhcmRlc2N9Ci0KLVxiZWdpbntjdmFyZGVzY317aW50fXtQeVRyYWNlX1JFVFVSTn0KLSAgVGhlIHZhbHVlIGZvciB0aGUgXHZhcnt3aGF0fSBwYXJhbWV0ZXIgdG8gXGN0eXBle1B5X3RyYWNlZnVuY30KLSAgZnVuY3Rpb25zIHdoZW4gYSBjYWxsIGlzIHJldHVybmluZyB3aXRob3V0IHByb3BhZ2F0aW5nIGFuIGV4Y2VwdGlvbi4KLVxlbmR7Y3ZhcmRlc2N9Ci0KLVxiZWdpbntjdmFyZGVzY317aW50fXtQeVRyYWNlX0NfQ0FMTH0KLSAgVGhlIHZhbHVlIGZvciB0aGUgXHZhcnt3aGF0fSBwYXJhbWV0ZXIgdG8gXGN0eXBle1B5X3RyYWNlZnVuY30KLSAgZnVuY3Rpb25zIHdoZW4gYSBDIGZ1bmN0aW9uIGlzIGFib3V0IHRvIGJlIGNhbGxlZC4KLVxlbmR7Y3ZhcmRlc2N9Ci0KLVxiZWdpbntjdmFyZGVzY317aW50fXtQeVRyYWNlX0NfRVhDRVBUSU9OfQotICBUaGUgdmFsdWUgZm9yIHRoZSBcdmFye3doYXR9IHBhcmFtZXRlciB0byBcY3R5cGV7UHlfdHJhY2VmdW5jfQotICBmdW5jdGlvbnMgd2hlbiBhIEMgZnVuY3Rpb24gaGFzIHRocm93biBhbiBleGNlcHRpb24uCi1cZW5ke2N2YXJkZXNjfQotCi1cYmVnaW57Y3ZhcmRlc2N9e2ludH17UHlUcmFjZV9DX1JFVFVSTn0KLSAgVGhlIHZhbHVlIGZvciB0aGUgXHZhcnt3aGF0fSBwYXJhbWV0ZXIgdG8gXGN0eXBle1B5X3RyYWNlZnVuY30KLSAgZnVuY3Rpb25zIHdoZW4gYSBDIGZ1bmN0aW9uIGhhcyByZXR1cm5lZC4KLVxlbmR7Y3ZhcmRlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e3ZvaWR9e1B5RXZhbF9TZXRQcm9maWxlfXtQeV90cmFjZWZ1bmMgZnVuYywgUHlPYmplY3QgKm9ian0KLSAgU2V0IHRoZSBwcm9maWxlciBmdW5jdGlvbiB0byBcdmFye2Z1bmN9LiAgVGhlIFx2YXJ7b2JqfSBwYXJhbWV0ZXIgaXMKLSAgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiBhcyBpdHMgZmlyc3QgcGFyYW1ldGVyLCBhbmQgbWF5IGJlIGFueSBQeXRob24KLSAgb2JqZWN0LCBvciBcTlVMTC4gIElmIHRoZSBwcm9maWxlIGZ1bmN0aW9uIG5lZWRzIHRvIG1haW50YWluIHN0YXRlLAotICB1c2luZyBhIGRpZmZlcmVudCB2YWx1ZSBmb3IgXHZhcntvYmp9IGZvciBlYWNoIHRocmVhZCBwcm92aWRlcyBhCi0gIGNvbnZlbmllbnQgYW5kIHRocmVhZC1zYWZlIHBsYWNlIHRvIHN0b3JlIGl0LiAgVGhlIHByb2ZpbGUgZnVuY3Rpb24KLSAgaXMgY2FsbGVkIGZvciBhbGwgbW9uaXRvcmVkIGV2ZW50cyBleGNlcHQgdGhlIGxpbmUtbnVtYmVyIGV2ZW50cy4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXt2b2lkfXtQeUV2YWxfU2V0VHJhY2V9e1B5X3RyYWNlZnVuYyBmdW5jLCBQeU9iamVjdCAqb2JqfQotICBTZXQgdGhlIHRyYWNpbmcgZnVuY3Rpb24gdG8gXHZhcntmdW5jfS4gIFRoaXMgaXMgc2ltaWxhciB0bwotICBcY2Z1bmN0aW9ue1B5RXZhbF9TZXRQcm9maWxlKCl9LCBleGNlcHQgdGhlIHRyYWNpbmcgZnVuY3Rpb24gZG9lcwotICByZWNlaXZlIGxpbmUtbnVtYmVyIGV2ZW50cy4KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxzZWN0aW9ue0FkdmFuY2VkIERlYnVnZ2VyIFN1cHBvcnQgXGxhYmVse2FkdmFuY2VkLWRlYnVnZ2luZ319Ci1cc2VjdGlvbmF1dGhvcntGcmVkIEwuIERyYWtlLCBKci59e2ZkcmFrZUBhY20ub3JnfQotCi1UaGVzZSBmdW5jdGlvbnMgYXJlIG9ubHkgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBhZHZhbmNlZCBkZWJ1Z2dpbmcKLXRvb2xzLgotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeUludGVycHJldGVyU3RhdGUqfXtQeUludGVycHJldGVyU3RhdGVfSGVhZH17fQotICBSZXR1cm4gdGhlIGludGVycHJldGVyIHN0YXRlIG9iamVjdCBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCBvZiBhbGwKLSAgc3VjaCBvYmplY3RzLgotICBcdmVyc2lvbmFkZGVkezIuMn0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeUludGVycHJldGVyU3RhdGUqfXtQeUludGVycHJldGVyU3RhdGVfTmV4dH17UHlJbnRlcnByZXRlclN0YXRlICppbnRlcnB9Ci0gIFJldHVybiB0aGUgbmV4dCBpbnRlcnByZXRlciBzdGF0ZSBvYmplY3QgYWZ0ZXIgXHZhcntpbnRlcnB9IGZyb20gdGhlCi0gIGxpc3Qgb2YgYWxsIHN1Y2ggb2JqZWN0cy4KLSAgXHZlcnNpb25hZGRlZHsyLjJ9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlUaHJlYWRTdGF0ZSAqfXtQeUludGVycHJldGVyU3RhdGVfVGhyZWFkSGVhZH17UHlJbnRlcnByZXRlclN0YXRlICppbnRlcnB9Ci0gIFJldHVybiB0aGUgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBcY3R5cGV7UHlUaHJlYWRTdGF0ZX0gb2JqZWN0IGluCi0gIHRoZSBsaXN0IG9mIHRocmVhZHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnRlcnByZXRlciBcdmFye2ludGVycH0uCi0gIFx2ZXJzaW9uYWRkZWR7Mi4yfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5VGhyZWFkU3RhdGUqfXtQeVRocmVhZFN0YXRlX05leHR9e1B5VGhyZWFkU3RhdGUgKnRzdGF0ZX0KLSAgUmV0dXJuIHRoZSBuZXh0IHRocmVhZCBzdGF0ZSBvYmplY3QgYWZ0ZXIgXHZhcnt0c3RhdGV9IGZyb20gdGhlIGxpc3QKLSAgb2YgYWxsIHN1Y2ggb2JqZWN0cyBiZWxvbmdpbmcgdG8gdGhlIHNhbWUgXGN0eXBle1B5SW50ZXJwcmV0ZXJTdGF0ZX0KLSAgb2JqZWN0LgotICBcdmVyc2lvbmFkZGVkezIuMn0KLVxlbmR7Y2Z1bmNkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2FwaS9pbnRyby50ZXggYi9Eb2MvYXBpL2ludHJvLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk0NTE4MC4uMDAwMDAwMAotLS0gYS9Eb2MvYXBpL2ludHJvLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDYyNCArMCwwIEBACi1cY2hhcHRlcntJbnRyb2R1Y3Rpb24gXGxhYmVse2ludHJvfX0KLQotCi1UaGUgQXBwbGljYXRpb24gUHJvZ3JhbW1lcidzIEludGVyZmFjZSB0byBQeXRob24gZ2l2ZXMgQyBhbmQKLVxDcHB7fSBwcm9ncmFtbWVycyBhY2Nlc3MgdG8gdGhlIFB5dGhvbiBpbnRlcnByZXRlciBhdCBhIHZhcmlldHkgb2YKLWxldmVscy4gIFRoZSBBUEkgaXMgZXF1YWxseSB1c2FibGUgZnJvbSBcQ3BwLCBidXQgZm9yIGJyZXZpdHkgaXQgaXMKLWdlbmVyYWxseSByZWZlcnJlZCB0byBhcyB0aGUgUHl0aG9uL0MgQVBJLiAgVGhlcmUgYXJlIHR3bwotZnVuZGFtZW50YWxseSBkaWZmZXJlbnQgcmVhc29ucyBmb3IgdXNpbmcgdGhlIFB5dGhvbi9DIEFQSS4gIFRoZSBmaXJzdAotcmVhc29uIGlzIHRvIHdyaXRlIFxlbXBoe2V4dGVuc2lvbiBtb2R1bGVzfSBmb3Igc3BlY2lmaWMgcHVycG9zZXM7Ci10aGVzZSBhcmUgQyBtb2R1bGVzIHRoYXQgZXh0ZW5kIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIuICBUaGlzIGlzCi1wcm9iYWJseSB0aGUgbW9zdCBjb21tb24gdXNlLiAgVGhlIHNlY29uZCByZWFzb24gaXMgdG8gdXNlIFB5dGhvbiBhcyBhCi1jb21wb25lbnQgaW4gYSBsYXJnZXIgYXBwbGljYXRpb247IHRoaXMgdGVjaG5pcXVlIGlzIGdlbmVyYWxseQotcmVmZXJyZWQgdG8gYXMgXGRmbntlbWJlZGRpbmd9IFB5dGhvbiBpbiBhbiBhcHBsaWNhdGlvbi4KLQotV3JpdGluZyBhbiBleHRlbnNpb24gbW9kdWxlIGlzIGEgcmVsYXRpdmVseSB3ZWxsLXVuZGVyc3Rvb2QgcHJvY2VzcywgCi13aGVyZSBhIGBgY29va2Jvb2snJyBhcHByb2FjaCB3b3JrcyB3ZWxsLiAgVGhlcmUgYXJlIHNldmVyYWwgdG9vbHMgCi10aGF0IGF1dG9tYXRlIHRoZSBwcm9jZXNzIHRvIHNvbWUgZXh0ZW50LiAgV2hpbGUgcGVvcGxlIGhhdmUgZW1iZWRkZWQgCi1QeXRob24gaW4gb3RoZXIgYXBwbGljYXRpb25zIHNpbmNlIGl0cyBlYXJseSBleGlzdGVuY2UsIHRoZSBwcm9jZXNzIG9mIAotZW1iZWRkaW5nIFB5dGhvbiBpcyBsZXNzIHN0cmFpZ2h0Zm9yd2FyZCB0aGFuIHdyaXRpbmcgYW4gZXh0ZW5zaW9uLiAgCi0KLU1hbnkgQVBJIGZ1bmN0aW9ucyBhcmUgdXNlZnVsIGluZGVwZW5kZW50IG9mIHdoZXRoZXIgeW91J3JlIGVtYmVkZGluZyAKLW9yIGV4dGVuZGluZyBQeXRob247IG1vcmVvdmVyLCBtb3N0IGFwcGxpY2F0aW9ucyB0aGF0IGVtYmVkIFB5dGhvbiAKLXdpbGwgbmVlZCB0byBwcm92aWRlIGEgY3VzdG9tIGV4dGVuc2lvbiBhcyB3ZWxsLCBzbyBpdCdzIHByb2JhYmx5IGEgCi1nb29kIGlkZWEgdG8gYmVjb21lIGZhbWlsaWFyIHdpdGggd3JpdGluZyBhbiBleHRlbnNpb24gYmVmb3JlIAotYXR0ZW1wdGluZyB0byBlbWJlZCBQeXRob24gaW4gYSByZWFsIGFwcGxpY2F0aW9uLgotCi0KLVxzZWN0aW9ue0luY2x1ZGUgRmlsZXMgXGxhYmVse2luY2x1ZGVzfX0KLQotQWxsIGZ1bmN0aW9uLCB0eXBlIGFuZCBtYWNybyBkZWZpbml0aW9ucyBuZWVkZWQgdG8gdXNlIHRoZSBQeXRob24vQwotQVBJIGFyZSBpbmNsdWRlZCBpbiB5b3VyIGNvZGUgYnkgdGhlIGZvbGxvd2luZyBsaW5lOgotCi1cYmVnaW57dmVyYmF0aW19Ci0jaW5jbHVkZSAiUHl0aG9uLmgiCi1cZW5ke3ZlcmJhdGltfQotCi1UaGlzIGltcGxpZXMgaW5jbHVzaW9uIG9mIHRoZSBmb2xsb3dpbmcgc3RhbmRhcmQgaGVhZGVyczoKLVxjb2RlezxzdGRpby5oPn0sIFxjb2RlezxzdHJpbmcuaD59LCBcY29kZXs8ZXJybm8uaD59LAotXGNvZGV7PGxpbWl0cy5oPn0sIGFuZCBcY29kZXs8c3RkbGliLmg+fSAoaWYgYXZhaWxhYmxlKS4KLQotXGJlZ2lue25vdGljZX1bd2FybmluZ10KLSAgU2luY2UgUHl0aG9uIG1heSBkZWZpbmUgc29tZSBwcmUtcHJvY2Vzc29yIGRlZmluaXRpb25zIHdoaWNoIGFmZmVjdAotICB0aGUgc3RhbmRhcmQgaGVhZGVycyBvbiBzb21lIHN5c3RlbXMsIHlvdSBcZW1waHttdXN0fSBpbmNsdWRlCi0gIFxmaWxle1B5dGhvbi5ofSBiZWZvcmUgYW55IHN0YW5kYXJkIGhlYWRlcnMgYXJlIGluY2x1ZGVkLgotXGVuZHtub3RpY2V9Ci0KLUFsbCB1c2VyIHZpc2libGUgbmFtZXMgZGVmaW5lZCBieSBQeXRob24uaCAoZXhjZXB0IHRob3NlIGRlZmluZWQgYnkKLXRoZSBpbmNsdWRlZCBzdGFuZGFyZCBoZWFkZXJzKSBoYXZlIG9uZSBvZiB0aGUgcHJlZml4ZXMgXHNhbXB7UHl9IG9yCi1cc2FtcHtfUHl9LiAgTmFtZXMgYmVnaW5uaW5nIHdpdGggXHNhbXB7X1B5fSBhcmUgZm9yIGludGVybmFsIHVzZSBieQotdGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGV4dGVuc2lvbiB3cml0ZXJzLgotU3RydWN0dXJlIG1lbWJlciBuYW1lcyBkbyBub3QgaGF2ZSBhIHJlc2VydmVkIHByZWZpeC4KLQotXHN0cm9uZ3tJbXBvcnRhbnQ6fSB1c2VyIGNvZGUgc2hvdWxkIG5ldmVyIGRlZmluZSBuYW1lcyB0aGF0IGJlZ2luCi13aXRoIFxzYW1we1B5fSBvciBcc2FtcHtfUHl9LiAgVGhpcyBjb25mdXNlcyB0aGUgcmVhZGVyLCBhbmQKLWplb3BhcmRpemVzIHRoZSBwb3J0YWJpbGl0eSBvZiB0aGUgdXNlciBjb2RlIHRvIGZ1dHVyZSBQeXRob24KLXZlcnNpb25zLCB3aGljaCBtYXkgZGVmaW5lIGFkZGl0aW9uYWwgbmFtZXMgYmVnaW5uaW5nIHdpdGggb25lIG9mCi10aGVzZSBwcmVmaXhlcy4KLQotVGhlIGhlYWRlciBmaWxlcyBhcmUgdHlwaWNhbGx5IGluc3RhbGxlZCB3aXRoIFB5dGhvbi4gIE9uIFxVTklYLCB0aGVzZSAKLWFyZSBsb2NhdGVkIGluIHRoZSBkaXJlY3RvcmllcwotXGZpbGV7XGVudnZhcntwcmVmaXh9L2luY2x1ZGUvcHl0aG9uXHZhcnt2ZXJzaW9ufS99IGFuZAotXGZpbGV7XGVudnZhcntleGVjX3ByZWZpeH0vaW5jbHVkZS9weXRob25cdmFye3ZlcnNpb259L30sIHdoZXJlCi1cZW52dmFye3ByZWZpeH0gYW5kIFxlbnZ2YXJ7ZXhlY19wcmVmaXh9IGFyZSBkZWZpbmVkIGJ5IHRoZQotY29ycmVzcG9uZGluZyBwYXJhbWV0ZXJzIHRvIFB5dGhvbidzIFxwcm9ncmFte2NvbmZpZ3VyZX0gc2NyaXB0IGFuZAotXHZhcnt2ZXJzaW9ufSBpcyBcY29kZXtzeXMudmVyc2lvbls6M119LiAgT24gV2luZG93cywgdGhlIGhlYWRlcnMgYXJlCi1pbnN0YWxsZWQgaW4gXGZpbGV7XGVudnZhcntwcmVmaXh9L2luY2x1ZGV9LCB3aGVyZSBcZW52dmFye3ByZWZpeH0gaXMKLXRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IHNwZWNpZmllZCB0byB0aGUgaW5zdGFsbGVyLgotCi1UbyBpbmNsdWRlIHRoZSBoZWFkZXJzLCBwbGFjZSBib3RoIGRpcmVjdG9yaWVzIChpZiBkaWZmZXJlbnQpIG9uIHlvdXIKLWNvbXBpbGVyJ3Mgc2VhcmNoIHBhdGggZm9yIGluY2x1ZGVzLiAgRG8gXGVtcGh7bm90fSBwbGFjZSB0aGUgcGFyZW50Ci1kaXJlY3RvcmllcyBvbiB0aGUgc2VhcmNoIHBhdGggYW5kIHRoZW4gdXNlCi1cc2FtcHtcI2luY2x1ZGUgPHB5dGhvblxzaG9ydHZlcnNpb24vUHl0aG9uLmg+fTsgdGhpcyB3aWxsIGJyZWFrIG9uCi1tdWx0aS1wbGF0Zm9ybSBidWlsZHMgc2luY2UgdGhlIHBsYXRmb3JtIGluZGVwZW5kZW50IGhlYWRlcnMgdW5kZXIKLVxlbnZ2YXJ7cHJlZml4fSBpbmNsdWRlIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBoZWFkZXJzIGZyb20KLVxlbnZ2YXJ7ZXhlY19wcmVmaXh9LgotCi1cQ3Bwe30gdXNlcnMgc2hvdWxkIG5vdGUgdGhhdCB0aG91Z2ggdGhlIEFQSSBpcyBkZWZpbmVkIGVudGlyZWx5IHVzaW5nCi1DLCB0aGUgaGVhZGVyIGZpbGVzIGRvIHByb3Blcmx5IGRlY2xhcmUgdGhlIGVudHJ5IHBvaW50cyB0byBiZQotXGNvZGV7ZXh0ZXJuICJDIn0sIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcgc3BlY2lhbCB0byB1c2UKLXRoZSBBUEkgZnJvbSBcQ3BwLgotCi0KLVxzZWN0aW9ue09iamVjdHMsIFR5cGVzIGFuZCBSZWZlcmVuY2UgQ291bnRzIFxsYWJlbHtvYmplY3RzfX0KLQotTW9zdCBQeXRob24vQyBBUEkgZnVuY3Rpb25zIGhhdmUgb25lIG9yIG1vcmUgYXJndW1lbnRzIGFzIHdlbGwgYXMgYQotcmV0dXJuIHZhbHVlIG9mIHR5cGUgXGN0eXBle1B5T2JqZWN0Kn0uICBUaGlzIHR5cGUgaXMgYSBwb2ludGVyCi10byBhbiBvcGFxdWUgZGF0YSB0eXBlIHJlcHJlc2VudGluZyBhbiBhcmJpdHJhcnkgUHl0aG9uCi1vYmplY3QuICBTaW5jZSBhbGwgUHl0aG9uIG9iamVjdCB0eXBlcyBhcmUgdHJlYXRlZCB0aGUgc2FtZSB3YXkgYnkgdGhlCi1QeXRob24gbGFuZ3VhZ2UgaW4gbW9zdCBzaXR1YXRpb25zIChlLmcuLCBhc3NpZ25tZW50cywgc2NvcGUgcnVsZXMsCi1hbmQgYXJndW1lbnQgcGFzc2luZyksIGl0IGlzIG9ubHkgZml0dGluZyB0aGF0IHRoZXkgc2hvdWxkIGJlCi1yZXByZXNlbnRlZCBieSBhIHNpbmdsZSBDIHR5cGUuICBBbG1vc3QgYWxsIFB5dGhvbiBvYmplY3RzIGxpdmUgb24gdGhlCi1oZWFwOiB5b3UgbmV2ZXIgZGVjbGFyZSBhbiBhdXRvbWF0aWMgb3Igc3RhdGljIHZhcmlhYmxlIG9mIHR5cGUKLVxjdHlwZXtQeU9iamVjdH0sIG9ubHkgcG9pbnRlciB2YXJpYWJsZXMgb2YgdHlwZSBcY3R5cGV7UHlPYmplY3QqfSBjYW4gCi1iZSBkZWNsYXJlZC4gIFRoZSBzb2xlIGV4Y2VwdGlvbiBhcmUgdGhlIHR5cGUgb2JqZWN0c1xvYmluZGV4e3R5cGV9Owotc2luY2UgdGhlc2UgbXVzdCBuZXZlciBiZSBkZWFsbG9jYXRlZCwgdGhleSBhcmUgdHlwaWNhbGx5IHN0YXRpYwotXGN0eXBle1B5VHlwZU9iamVjdH0gb2JqZWN0cy4KLQotQWxsIFB5dGhvbiBvYmplY3RzIChldmVuIFB5dGhvbiBpbnRlZ2VycykgaGF2ZSBhIFxkZm57dHlwZX0gYW5kIGEKLVxkZm57cmVmZXJlbmNlIGNvdW50fS4gIEFuIG9iamVjdCdzIHR5cGUgZGV0ZXJtaW5lcyB3aGF0IGtpbmQgb2Ygb2JqZWN0IAotaXQgaXMgKGUuZy4sIGFuIGludGVnZXIsIGEgbGlzdCwgb3IgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb247IHRoZXJlIGFyZSAKLW1hbnkgbW9yZSBhcyBleHBsYWluZWQgaW4gdGhlIFxjaXRldGl0bGVbLi4vcmVmL3JlZi5odG1sXXtQeXRob24KLVJlZmVyZW5jZSBNYW51YWx9KS4gIEZvciBlYWNoIG9mIHRoZSB3ZWxsLWtub3duIHR5cGVzIHRoZXJlIGlzIGEgbWFjcm8KLXRvIGNoZWNrIHdoZXRoZXIgYW4gb2JqZWN0IGlzIG9mIHRoYXQgdHlwZTsgZm9yIGluc3RhbmNlLAotXHNhbXB7UHlMaXN0X0NoZWNrKFx2YXJ7YX0pfSBpcyB0cnVlIGlmIChhbmQgb25seSBpZikgdGhlIG9iamVjdAotcG9pbnRlZCB0byBieSBcdmFye2F9IGlzIGEgUHl0aG9uIGxpc3QuCi0KLQotXHN1YnNlY3Rpb257UmVmZXJlbmNlIENvdW50cyBcbGFiZWx7cmVmY291bnRzfX0KLQotVGhlIHJlZmVyZW5jZSBjb3VudCBpcyBpbXBvcnRhbnQgYmVjYXVzZSB0b2RheSdzIGNvbXB1dGVycyBoYXZlIGEgCi1maW5pdGUgKGFuZCBvZnRlbiBzZXZlcmVseSBsaW1pdGVkKSBtZW1vcnkgc2l6ZTsgaXQgY291bnRzIGhvdyBtYW55IAotZGlmZmVyZW50IHBsYWNlcyB0aGVyZSBhcmUgdGhhdCBoYXZlIGEgcmVmZXJlbmNlIHRvIGFuIG9iamVjdC4gIFN1Y2ggYSAKLXBsYWNlIGNvdWxkIGJlIGFub3RoZXIgb2JqZWN0LCBvciBhIGdsb2JhbCAob3Igc3RhdGljKSBDIHZhcmlhYmxlLCBvciAKLWEgbG9jYWwgdmFyaWFibGUgaW4gc29tZSBDIGZ1bmN0aW9uLiAgV2hlbiBhbiBvYmplY3QncyByZWZlcmVuY2UgY291bnQgCi1iZWNvbWVzIHplcm8sIHRoZSBvYmplY3QgaXMgZGVhbGxvY2F0ZWQuICBJZiBpdCBjb250YWlucyByZWZlcmVuY2VzIHRvIAotb3RoZXIgb2JqZWN0cywgdGhlaXIgcmVmZXJlbmNlIGNvdW50IGlzIGRlY3JlbWVudGVkLiAgVGhvc2Ugb3RoZXIgCi1vYmplY3RzIG1heSBiZSBkZWFsbG9jYXRlZCBpbiB0dXJuLCBpZiB0aGlzIGRlY3JlbWVudCBtYWtlcyB0aGVpciAKLXJlZmVyZW5jZSBjb3VudCBiZWNvbWUgemVybywgYW5kIHNvIG9uLiAgKFRoZXJlJ3MgYW4gb2J2aW91cyBwcm9ibGVtIAotd2l0aCBvYmplY3RzIHRoYXQgcmVmZXJlbmNlIGVhY2ggb3RoZXIgaGVyZTsgZm9yIG5vdywgdGhlIHNvbHV0aW9uIGlzIAotYGBkb24ndCBkbyB0aGF0LicnKQotCi1SZWZlcmVuY2UgY291bnRzIGFyZSBhbHdheXMgbWFuaXB1bGF0ZWQgZXhwbGljaXRseS4gIFRoZSBub3JtYWwgd2F5IGlzIAotdG8gdXNlIHRoZSBtYWNybyBcY2Z1bmN0aW9ue1B5X0lOQ1JFRigpfVx0dGluZGV4e1B5X0lOQ1JFRigpfSB0bwotaW5jcmVtZW50IGFuIG9iamVjdCdzIHJlZmVyZW5jZSBjb3VudCBieSBvbmUsIGFuZAotXGNmdW5jdGlvbntQeV9ERUNSRUYoKX1cdHRpbmRleHtQeV9ERUNSRUYoKX0gdG8gZGVjcmVtZW50IGl0IGJ5ICAKLW9uZS4gIFRoZSBcY2Z1bmN0aW9ue1B5X0RFQ1JFRigpfSBtYWNybyBpcyBjb25zaWRlcmFibHkgbW9yZSBjb21wbGV4Ci10aGFuIHRoZSBpbmNyZWYgb25lLCBzaW5jZSBpdCBtdXN0IGNoZWNrIHdoZXRoZXIgdGhlIHJlZmVyZW5jZSBjb3VudAotYmVjb21lcyB6ZXJvIGFuZCB0aGVuIGNhdXNlIHRoZSBvYmplY3QncyBkZWFsbG9jYXRvciB0byBiZSBjYWxsZWQuCi1UaGUgZGVhbGxvY2F0b3IgaXMgYSBmdW5jdGlvbiBwb2ludGVyIGNvbnRhaW5lZCBpbiB0aGUgb2JqZWN0J3MgdHlwZQotc3RydWN0dXJlLiAgVGhlIHR5cGUtc3BlY2lmaWMgZGVhbGxvY2F0b3IgdGFrZXMgY2FyZSBvZiBkZWNyZW1lbnRpbmcKLXRoZSByZWZlcmVuY2UgY291bnRzIGZvciBvdGhlciBvYmplY3RzIGNvbnRhaW5lZCBpbiB0aGUgb2JqZWN0IGlmIHRoaXMKLWlzIGEgY29tcG91bmQgb2JqZWN0IHR5cGUsIHN1Y2ggYXMgYSBsaXN0LCBhcyB3ZWxsIGFzIHBlcmZvcm1pbmcgYW55Ci1hZGRpdGlvbmFsIGZpbmFsaXphdGlvbiB0aGF0J3MgbmVlZGVkLiAgVGhlcmUncyBubyBjaGFuY2UgdGhhdCB0aGUKLXJlZmVyZW5jZSBjb3VudCBjYW4gb3ZlcmZsb3c7IGF0IGxlYXN0IGFzIG1hbnkgYml0cyBhcmUgdXNlZCB0byBob2xkCi10aGUgcmVmZXJlbmNlIGNvdW50IGFzIHRoZXJlIGFyZSBkaXN0aW5jdCBtZW1vcnkgbG9jYXRpb25zIGluIHZpcnR1YWwKLW1lbW9yeSAoYXNzdW1pbmcgXGNvZGV7c2l6ZW9mKGxvbmcpID49IHNpemVvZihjaGFyKil9KS4gIFRodXMsIHRoZQotcmVmZXJlbmNlIGNvdW50IGluY3JlbWVudCBpcyBhIHNpbXBsZSBvcGVyYXRpb24uCi0KLUl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gaW5jcmVtZW50IGFuIG9iamVjdCdzIHJlZmVyZW5jZSBjb3VudCBmb3IgZXZlcnkgCi1sb2NhbCB2YXJpYWJsZSB0aGF0IGNvbnRhaW5zIGEgcG9pbnRlciB0byBhbiBvYmplY3QuICBJbiB0aGVvcnksIHRoZSAKLW9iamVjdCdzIHJlZmVyZW5jZSBjb3VudCBnb2VzIHVwIGJ5IG9uZSB3aGVuIHRoZSB2YXJpYWJsZSBpcyBtYWRlIHRvIAotcG9pbnQgdG8gaXQgYW5kIGl0IGdvZXMgZG93biBieSBvbmUgd2hlbiB0aGUgdmFyaWFibGUgZ29lcyBvdXQgb2YgCi1zY29wZS4gIEhvd2V2ZXIsIHRoZXNlIHR3byBjYW5jZWwgZWFjaCBvdGhlciBvdXQsIHNvIGF0IHRoZSBlbmQgdGhlIAotcmVmZXJlbmNlIGNvdW50IGhhc24ndCBjaGFuZ2VkLiAgVGhlIG9ubHkgcmVhbCByZWFzb24gdG8gdXNlIHRoZSAKLXJlZmVyZW5jZSBjb3VudCBpcyB0byBwcmV2ZW50IHRoZSBvYmplY3QgZnJvbSBiZWluZyBkZWFsbG9jYXRlZCBhcyAKLWxvbmcgYXMgb3VyIHZhcmlhYmxlIGlzIHBvaW50aW5nIHRvIGl0LiAgSWYgd2Uga25vdyB0aGF0IHRoZXJlIGlzIGF0IAotbGVhc3Qgb25lIG90aGVyIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IHRoYXQgbGl2ZXMgYXQgbGVhc3QgYXMgbG9uZyBhcyAKLW91ciB2YXJpYWJsZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBpbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCAKLXRlbXBvcmFyaWx5LiAgQW4gaW1wb3J0YW50IHNpdHVhdGlvbiB3aGVyZSB0aGlzIGFyaXNlcyBpcyBpbiBvYmplY3RzIAotdGhhdCBhcmUgcGFzc2VkIGFzIGFyZ3VtZW50cyB0byBDIGZ1bmN0aW9ucyBpbiBhbiBleHRlbnNpb24gbW9kdWxlIAotdGhhdCBhcmUgY2FsbGVkIGZyb20gUHl0aG9uOyB0aGUgY2FsbCBtZWNoYW5pc20gZ3VhcmFudGVlcyB0byBob2xkIGEgCi1yZWZlcmVuY2UgdG8gZXZlcnkgYXJndW1lbnQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgY2FsbC4KLQotSG93ZXZlciwgYSBjb21tb24gcGl0ZmFsbCBpcyB0byBleHRyYWN0IGFuIG9iamVjdCBmcm9tIGEgbGlzdCBhbmQKLWhvbGQgb24gdG8gaXQgZm9yIGEgd2hpbGUgd2l0aG91dCBpbmNyZW1lbnRpbmcgaXRzIHJlZmVyZW5jZSBjb3VudC4KLVNvbWUgb3RoZXIgb3BlcmF0aW9uIG1pZ2h0IGNvbmNlaXZhYmx5IHJlbW92ZSB0aGUgb2JqZWN0IGZyb20gdGhlCi1saXN0LCBkZWNyZW1lbnRpbmcgaXRzIHJlZmVyZW5jZSBjb3VudCBhbmQgcG9zc2libGUgZGVhbGxvY2F0aW5nIGl0LgotVGhlIHJlYWwgZGFuZ2VyIGlzIHRoYXQgaW5ub2NlbnQtbG9va2luZyBvcGVyYXRpb25zIG1heSBpbnZva2UKLWFyYml0cmFyeSBQeXRob24gY29kZSB3aGljaCBjb3VsZCBkbyB0aGlzOyB0aGVyZSBpcyBhIGNvZGUgcGF0aCB3aGljaAotYWxsb3dzIGNvbnRyb2wgdG8gZmxvdyBiYWNrIHRvIHRoZSB1c2VyIGZyb20gYSBcY2Z1bmN0aW9ue1B5X0RFQ1JFRigpfSwKLXNvIGFsbW9zdCBhbnkgb3BlcmF0aW9uIGlzIHBvdGVudGlhbGx5IGRhbmdlcm91cy4KLQotQSBzYWZlIGFwcHJvYWNoIGlzIHRvIGFsd2F5cyB1c2UgdGhlIGdlbmVyaWMgb3BlcmF0aW9ucyAoZnVuY3Rpb25zIAotd2hvc2UgbmFtZSBiZWdpbnMgd2l0aCBcc2FtcHtQeU9iamVjdF99LCBcc2FtcHtQeU51bWJlcl99LAotXHNhbXB7UHlTZXF1ZW5jZV99IG9yIFxzYW1we1B5TWFwcGluZ199KS4gIFRoZXNlIG9wZXJhdGlvbnMgYWx3YXlzCi1pbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgb2JqZWN0IHRoZXkgcmV0dXJuLiAgVGhpcyBsZWF2ZXMKLXRoZSBjYWxsZXIgd2l0aCB0aGUgcmVzcG9uc2liaWxpdHkgdG8gY2FsbAotXGNmdW5jdGlvbntQeV9ERUNSRUYoKX0gd2hlbiB0aGV5IGFyZSBkb25lIHdpdGggdGhlIHJlc3VsdDsgdGhpcyBzb29uCi1iZWNvbWVzIHNlY29uZCBuYXR1cmUuCi0KLQotXHN1YnN1YnNlY3Rpb257UmVmZXJlbmNlIENvdW50IERldGFpbHMgXGxhYmVse3JlZmNvdW50RGV0YWlsc319Ci0KLVRoZSByZWZlcmVuY2UgY291bnQgYmVoYXZpb3Igb2YgZnVuY3Rpb25zIGluIHRoZSBQeXRob24vQyBBUEkgaXMgYmVzdCAKLWV4cGxhaW5lZCBpbiB0ZXJtcyBvZiBcZW1waHtvd25lcnNoaXAgb2YgcmVmZXJlbmNlc30uICBPd25lcnNoaXAKLXBlcnRhaW5zIHRvIHJlZmVyZW5jZXMsIG5ldmVyIHRvIG9iamVjdHMgKG9iamVjdHMgYXJlIG5vdCBvd25lZDogdGhleQotYXJlIGFsd2F5cyBzaGFyZWQpLiAgIk93bmluZyBhIHJlZmVyZW5jZSIgbWVhbnMgYmVpbmcgcmVzcG9uc2libGUgZm9yCi1jYWxsaW5nIFB5X0RFQ1JFRiBvbiBpdCB3aGVuIHRoZSByZWZlcmVuY2UgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gCi1Pd25lcnNoaXAgY2FuIGFsc28gYmUgdHJhbnNmZXJyZWQsIG1lYW5pbmcgdGhhdCB0aGUgY29kZSB0aGF0IHJlY2VpdmVzCi1vd25lcnNoaXAgb2YgdGhlIHJlZmVyZW5jZSB0aGVuIGJlY29tZXMgcmVzcG9uc2libGUgZm9yIGV2ZW50dWFsbHkKLWRlY3JlZidpbmcgaXQgYnkgY2FsbGluZyBcY2Z1bmN0aW9ue1B5X0RFQ1JFRigpfSBvcgotXGNmdW5jdGlvbntQeV9YREVDUkVGKCl9IHdoZW4gaXQncyBubyBsb25nZXIgbmVlZGVkLS0tb3IgcGFzc2luZyBvbgotdGhpcyByZXNwb25zaWJpbGl0eSAodXN1YWxseSB0byBpdHMgY2FsbGVyKS4KLVdoZW4gYSBmdW5jdGlvbiBwYXNzZXMgb3duZXJzaGlwIG9mIGEgcmVmZXJlbmNlIG9uIHRvIGl0cyBjYWxsZXIsIHRoZQotY2FsbGVyIGlzIHNhaWQgdG8gcmVjZWl2ZSBhIFxlbXBoe25ld30gcmVmZXJlbmNlLiAgV2hlbiBubyBvd25lcnNoaXAKLWlzIHRyYW5zZmVycmVkLCB0aGUgY2FsbGVyIGlzIHNhaWQgdG8gXGVtcGh7Ym9ycm93fSB0aGUgcmVmZXJlbmNlLgotTm90aGluZyBuZWVkcyB0byBiZSBkb25lIGZvciBhIGJvcnJvd2VkIHJlZmVyZW5jZS4KLQotQ29udmVyc2VseSwgd2hlbiBhIGNhbGxpbmcgZnVuY3Rpb24gcGFzc2VzIGl0IGEgcmVmZXJlbmNlIHRvIGFuIAotb2JqZWN0LCB0aGVyZSBhcmUgdHdvIHBvc3NpYmlsaXRpZXM6IHRoZSBmdW5jdGlvbiBcZW1waHtzdGVhbHN9IGEgCi1yZWZlcmVuY2UgdG8gdGhlIG9iamVjdCwgb3IgaXQgZG9lcyBub3QuICBcZW1waHtTdGVhbGluZyBhIHJlZmVyZW5jZX0KLW1lYW5zIHRoYXQgd2hlbiB5b3UgcGFzcyBhIHJlZmVyZW5jZSB0byBhIGZ1bmN0aW9uLCB0aGF0IGZ1bmN0aW9uCi1hc3N1bWVzIHRoYXQgaXQgbm93IG93bnMgdGhhdCByZWZlcmVuY2UsIGFuZCB5b3UgYXJlIG5vdCByZXNwb25zaWJsZQotZm9yIGl0IGFueSBsb25nZXIuCi0KLUZldyBmdW5jdGlvbnMgc3RlYWwgcmVmZXJlbmNlczsgdGhlIHR3byBub3RhYmxlIGV4Y2VwdGlvbnMgYXJlCi1cY2Z1bmN0aW9ue1B5TGlzdF9TZXRJdGVtKCl9XHR0aW5kZXh7UHlMaXN0X1NldEl0ZW0oKX0gYW5kCi1cY2Z1bmN0aW9ue1B5VHVwbGVfU2V0SXRlbSgpfVx0dGluZGV4e1B5VHVwbGVfU2V0SXRlbSgpfSwgd2hpY2ggCi1zdGVhbCBhIHJlZmVyZW5jZSB0byB0aGUgaXRlbSAoYnV0IG5vdCB0byB0aGUgdHVwbGUgb3IgbGlzdCBpbnRvIHdoaWNoCi10aGUgaXRlbSBpcyBwdXQhKS4gIFRoZXNlIGZ1bmN0aW9ucyB3ZXJlIGRlc2lnbmVkIHRvIHN0ZWFsIGEgcmVmZXJlbmNlCi1iZWNhdXNlIG9mIGEgY29tbW9uIGlkaW9tIGZvciBwb3B1bGF0aW5nIGEgdHVwbGUgb3IgbGlzdCB3aXRoIG5ld2x5Ci1jcmVhdGVkIG9iamVjdHM7IGZvciBleGFtcGxlLCB0aGUgY29kZSB0byBjcmVhdGUgdGhlIHR1cGxlIFxjb2RleygxLAotMiwgInRocmVlIil9IGNvdWxkIGxvb2sgbGlrZSB0aGlzIChmb3JnZXR0aW5nIGFib3V0IGVycm9yIGhhbmRsaW5nIGZvcgotdGhlIG1vbWVudDsgYSBiZXR0ZXIgd2F5IHRvIGNvZGUgdGhpcyBpcyBzaG93biBiZWxvdyk6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLVB5T2JqZWN0ICp0OwotCi10ID0gUHlUdXBsZV9OZXcoMyk7Ci1QeVR1cGxlX1NldEl0ZW0odCwgMCwgUHlJbnRfRnJvbUxvbmcoMUwpKTsKLVB5VHVwbGVfU2V0SXRlbSh0LCAxLCBQeUludF9Gcm9tTG9uZygyTCkpOwotUHlUdXBsZV9TZXRJdGVtKHQsIDIsIFB5U3RyaW5nX0Zyb21TdHJpbmcoInRocmVlIikpOwotXGVuZHt2ZXJiYXRpbX0KLQotSGVyZSwgXGNmdW5jdGlvbntQeUludF9Gcm9tTG9uZygpfSByZXR1cm5zIGEgbmV3IHJlZmVyZW5jZSB3aGljaCBpcwotaW1tZWRpYXRlbHkgc3RvbGVuIGJ5IFxjZnVuY3Rpb257UHlUdXBsZV9TZXRJdGVtKCl9LiAgV2hlbiB5b3Ugd2FudCB0bwota2VlcCB1c2luZyBhbiBvYmplY3QgYWx0aG91Z2ggdGhlIHJlZmVyZW5jZSB0byBpdCB3aWxsIGJlIHN0b2xlbiwKLXVzZSBcY2Z1bmN0aW9ue1B5X0lOQ1JFRigpfSB0byBncmFiIGFub3RoZXIgcmVmZXJlbmNlIGJlZm9yZSBjYWxsaW5nIHRoZQotcmVmZXJlbmNlLXN0ZWFsaW5nIGZ1bmN0aW9uLgotCi1JbmNpZGVudGFsbHksIFxjZnVuY3Rpb257UHlUdXBsZV9TZXRJdGVtKCl9IGlzIHRoZSBcZW1waHtvbmx5fSB3YXkgdG8KLXNldCB0dXBsZSBpdGVtczsgXGNmdW5jdGlvbntQeVNlcXVlbmNlX1NldEl0ZW0oKX0gYW5kCi1cY2Z1bmN0aW9ue1B5T2JqZWN0X1NldEl0ZW0oKX0gcmVmdXNlIHRvIGRvIHRoaXMgc2luY2UgdHVwbGVzIGFyZSBhbgotaW1tdXRhYmxlIGRhdGEgdHlwZS4gIFlvdSBzaG91bGQgb25seSB1c2UKLVxjZnVuY3Rpb257UHlUdXBsZV9TZXRJdGVtKCl9IGZvciB0dXBsZXMgdGhhdCB5b3UgYXJlIGNyZWF0aW5nCi15b3Vyc2VsZi4KLQotRXF1aXZhbGVudCBjb2RlIGZvciBwb3B1bGF0aW5nIGEgbGlzdCBjYW4gYmUgd3JpdHRlbiB1c2luZwotXGNmdW5jdGlvbntQeUxpc3RfTmV3KCl9IGFuZCBcY2Z1bmN0aW9ue1B5TGlzdF9TZXRJdGVtKCl9LgotCi1Ib3dldmVyLCBpbiBwcmFjdGljZSwgeW91IHdpbGwgcmFyZWx5IHVzZSB0aGVzZSB3YXlzIG9mCi1jcmVhdGluZyBhbmQgcG9wdWxhdGluZyBhIHR1cGxlIG9yIGxpc3QuICBUaGVyZSdzIGEgZ2VuZXJpYyBmdW5jdGlvbiwKLVxjZnVuY3Rpb257UHlfQnVpbGRWYWx1ZSgpfSwgdGhhdCBjYW4gY3JlYXRlIG1vc3QgY29tbW9uIG9iamVjdHMgZnJvbQotQyB2YWx1ZXMsIGRpcmVjdGVkIGJ5IGEgXGRmbntmb3JtYXQgc3RyaW5nfS4gIEZvciBleGFtcGxlLCB0aGUKLWFib3ZlIHR3byBibG9ja3Mgb2YgY29kZSBjb3VsZCBiZSByZXBsYWNlZCBieSB0aGUgZm9sbG93aW5nICh3aGljaAotYWxzbyB0YWtlcyBjYXJlIG9mIHRoZSBlcnJvciBjaGVja2luZyk6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLVB5T2JqZWN0ICp0dXBsZSwgKmxpc3Q7Ci0KLXR1cGxlID0gUHlfQnVpbGRWYWx1ZSgiKGlpcykiLCAxLCAyLCAidGhyZWUiKTsKLWxpc3QgPSBQeV9CdWlsZFZhbHVlKCJbaWlzXSIsIDEsIDIsICJ0aHJlZSIpOwotXGVuZHt2ZXJiYXRpbX0KLQotSXQgaXMgbXVjaCBtb3JlIGNvbW1vbiB0byB1c2UgXGNmdW5jdGlvbntQeU9iamVjdF9TZXRJdGVtKCl9IGFuZAotZnJpZW5kcyB3aXRoIGl0ZW1zIHdob3NlIHJlZmVyZW5jZXMgeW91IGFyZSBvbmx5IGJvcnJvd2luZywgbGlrZQotYXJndW1lbnRzIHRoYXQgd2VyZSBwYXNzZWQgaW4gdG8gdGhlIGZ1bmN0aW9uIHlvdSBhcmUgd3JpdGluZy4gIEluCi10aGF0IGNhc2UsIHRoZWlyIGJlaGF2aW91ciByZWdhcmRpbmcgcmVmZXJlbmNlIGNvdW50cyBpcyBtdWNoIHNhbmVyLAotc2luY2UgeW91IGRvbid0IGhhdmUgdG8gaW5jcmVtZW50IGEgcmVmZXJlbmNlIGNvdW50IHNvIHlvdSBjYW4gZ2l2ZSBhCi1yZWZlcmVuY2UgYXdheSAoYGBoYXZlIGl0IGJlIHN0b2xlbicnKS4gIEZvciBleGFtcGxlLCB0aGlzIGZ1bmN0aW9uCi1zZXRzIGFsbCBpdGVtcyBvZiBhIGxpc3QgKGFjdHVhbGx5LCBhbnkgbXV0YWJsZSBzZXF1ZW5jZSkgdG8gYSBnaXZlbgotaXRlbToKLQotXGJlZ2lue3ZlcmJhdGltfQotaW50Ci1zZXRfYWxsKFB5T2JqZWN0ICp0YXJnZXQsIFB5T2JqZWN0ICppdGVtKQotewotICAgIGludCBpLCBuOwotCi0gICAgbiA9IFB5T2JqZWN0X0xlbmd0aCh0YXJnZXQpOwotICAgIGlmIChuIDwgMCkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgUHlPYmplY3QgKmluZGV4ID0gUHlJbnRfRnJvbUxvbmcoaSk7Ci0gICAgICAgIGlmICghaW5kZXgpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGlmIChQeU9iamVjdF9TZXRJdGVtKHRhcmdldCwgaW5kZXgsIGl0ZW0pIDwgMCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgUHlfREVDUkVGKGluZGV4KTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci1cZW5ke3ZlcmJhdGltfQotXHR0aW5kZXh7c2V0X2FsbCgpfQotCi1UaGUgc2l0dWF0aW9uIGlzIHNsaWdodGx5IGRpZmZlcmVudCBmb3IgZnVuY3Rpb24gcmV0dXJuIHZhbHVlcy4gIAotV2hpbGUgcGFzc2luZyBhIHJlZmVyZW5jZSB0byBtb3N0IGZ1bmN0aW9ucyBkb2VzIG5vdCBjaGFuZ2UgeW91ciAKLW93bmVyc2hpcCByZXNwb25zaWJpbGl0aWVzIGZvciB0aGF0IHJlZmVyZW5jZSwgbWFueSBmdW5jdGlvbnMgdGhhdCAKLXJldHVybiBhIHJlZmVyZW5jZSB0byBhbiBvYmplY3QgZ2l2ZSB5b3Ugb3duZXJzaGlwIG9mIHRoZSByZWZlcmVuY2UuCi1UaGUgcmVhc29uIGlzIHNpbXBsZTogaW4gbWFueSBjYXNlcywgdGhlIHJldHVybmVkIG9iamVjdCBpcyBjcmVhdGVkIAotb24gdGhlIGZseSwgYW5kIHRoZSByZWZlcmVuY2UgeW91IGdldCBpcyB0aGUgb25seSByZWZlcmVuY2UgdG8gdGhlIAotb2JqZWN0LiAgVGhlcmVmb3JlLCB0aGUgZ2VuZXJpYyBmdW5jdGlvbnMgdGhhdCByZXR1cm4gb2JqZWN0IAotcmVmZXJlbmNlcywgbGlrZSBcY2Z1bmN0aW9ue1B5T2JqZWN0X0dldEl0ZW0oKX0gYW5kIAotXGNmdW5jdGlvbntQeVNlcXVlbmNlX0dldEl0ZW0oKX0sIGFsd2F5cyByZXR1cm4gYSBuZXcgcmVmZXJlbmNlICh0aGUKLWNhbGxlciBiZWNvbWVzIHRoZSBvd25lciBvZiB0aGUgcmVmZXJlbmNlKS4KLQotSXQgaXMgaW1wb3J0YW50IHRvIHJlYWxpemUgdGhhdCB3aGV0aGVyIHlvdSBvd24gYSByZWZlcmVuY2UgcmV0dXJuZWQgCi1ieSBhIGZ1bmN0aW9uIGRlcGVuZHMgb24gd2hpY2ggZnVuY3Rpb24geW91IGNhbGwgb25seSAtLS0gXGVtcGh7dGhlCi1wbHVtYWdlfSAodGhlIHR5cGUgb2YgdGhlIG9iamVjdCBwYXNzZWQgYXMgYW4KLWFyZ3VtZW50IHRvIHRoZSBmdW5jdGlvbikgXGVtcGh7ZG9lc24ndCBlbnRlciBpbnRvIGl0IX0gIFRodXMsIGlmIHlvdSAKLWV4dHJhY3QgYW4gaXRlbSBmcm9tIGEgbGlzdCB1c2luZyBcY2Z1bmN0aW9ue1B5TGlzdF9HZXRJdGVtKCl9LCB5b3UKLWRvbid0IG93biB0aGUgcmVmZXJlbmNlIC0tLSBidXQgaWYgeW91IG9idGFpbiB0aGUgc2FtZSBpdGVtIGZyb20gdGhlCi1zYW1lIGxpc3QgdXNpbmcgXGNmdW5jdGlvbntQeVNlcXVlbmNlX0dldEl0ZW0oKX0gKHdoaWNoIGhhcHBlbnMgdG8KLXRha2UgZXhhY3RseSB0aGUgc2FtZSBhcmd1bWVudHMpLCB5b3UgZG8gb3duIGEgcmVmZXJlbmNlIHRvIHRoZQotcmV0dXJuZWQgb2JqZWN0LgotCi1IZXJlIGlzIGFuIGV4YW1wbGUgb2YgaG93IHlvdSBjb3VsZCB3cml0ZSBhIGZ1bmN0aW9uIHRoYXQgY29tcHV0ZXMgdGhlCi1zdW0gb2YgdGhlIGl0ZW1zIGluIGEgbGlzdCBvZiBpbnRlZ2Vyczsgb25jZSB1c2luZyAKLVxjZnVuY3Rpb257UHlMaXN0X0dldEl0ZW0oKX1cdHRpbmRleHtQeUxpc3RfR2V0SXRlbSgpfSwgYW5kIG9uY2UgdXNpbmcKLVxjZnVuY3Rpb257UHlTZXF1ZW5jZV9HZXRJdGVtKCl9XHR0aW5kZXh7UHlTZXF1ZW5jZV9HZXRJdGVtKCl9LgotCi1cYmVnaW57dmVyYmF0aW19Ci1sb25nCi1zdW1fbGlzdChQeU9iamVjdCAqbGlzdCkKLXsKLSAgICBpbnQgaSwgbjsKLSAgICBsb25nIHRvdGFsID0gMDsKLSAgICBQeU9iamVjdCAqaXRlbTsKLQotICAgIG4gPSBQeUxpc3RfU2l6ZShsaXN0KTsKLSAgICBpZiAobiA8IDApCi0gICAgICAgIHJldHVybiAtMTsgLyogTm90IGEgbGlzdCAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgaXRlbSA9IFB5TGlzdF9HZXRJdGVtKGxpc3QsIGkpOyAvKiBDYW4ndCBmYWlsICovCi0gICAgICAgIGlmICghUHlJbnRfQ2hlY2soaXRlbSkpIGNvbnRpbnVlOyAvKiBTa2lwIG5vbi1pbnRlZ2VycyAqLwotICAgICAgICB0b3RhbCArPSBQeUludF9Bc0xvbmcoaXRlbSk7Ci0gICAgfQotICAgIHJldHVybiB0b3RhbDsKLX0KLVxlbmR7dmVyYmF0aW19Ci1cdHRpbmRleHtzdW1fbGlzdCgpfQotCi1cYmVnaW57dmVyYmF0aW19Ci1sb25nCi1zdW1fc2VxdWVuY2UoUHlPYmplY3QgKnNlcXVlbmNlKQotewotICAgIGludCBpLCBuOwotICAgIGxvbmcgdG90YWwgPSAwOwotICAgIFB5T2JqZWN0ICppdGVtOwotICAgIG4gPSBQeVNlcXVlbmNlX0xlbmd0aChzZXF1ZW5jZSk7Ci0gICAgaWYgKG4gPCAwKQotICAgICAgICByZXR1cm4gLTE7IC8qIEhhcyBubyBsZW5ndGggKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgIGl0ZW0gPSBQeVNlcXVlbmNlX0dldEl0ZW0oc2VxdWVuY2UsIGkpOwotICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIC0xOyAvKiBOb3QgYSBzZXF1ZW5jZSwgb3Igb3RoZXIgZmFpbHVyZSAqLwotICAgICAgICBpZiAoUHlJbnRfQ2hlY2soaXRlbSkpCi0gICAgICAgICAgICB0b3RhbCArPSBQeUludF9Bc0xvbmcoaXRlbSk7Ci0gICAgICAgIFB5X0RFQ1JFRihpdGVtKTsgLyogRGlzY2FyZCByZWZlcmVuY2Ugb3duZXJzaGlwICovCi0gICAgfQotICAgIHJldHVybiB0b3RhbDsKLX0KLVxlbmR7dmVyYmF0aW19Ci1cdHRpbmRleHtzdW1fc2VxdWVuY2UoKX0KLQotCi1cc3Vic2VjdGlvbntUeXBlcyBcbGFiZWx7dHlwZXN9fQotCi1UaGVyZSBhcmUgZmV3IG90aGVyIGRhdGEgdHlwZXMgdGhhdCBwbGF5IGEgc2lnbmlmaWNhbnQgcm9sZSBpbiAKLXRoZSBQeXRob24vQyBBUEk7IG1vc3QgYXJlIHNpbXBsZSBDIHR5cGVzIHN1Y2ggYXMgXGN0eXBle2ludH0sIAotXGN0eXBle2xvbmd9LCBcY3R5cGV7ZG91YmxlfSBhbmQgXGN0eXBle2NoYXIqfS4gIEEgZmV3IHN0cnVjdHVyZSB0eXBlcyAKLWFyZSB1c2VkIHRvIGRlc2NyaWJlIHN0YXRpYyB0YWJsZXMgdXNlZCB0byBsaXN0IHRoZSBmdW5jdGlvbnMgZXhwb3J0ZWQgCi1ieSBhIG1vZHVsZSBvciB0aGUgZGF0YSBhdHRyaWJ1dGVzIG9mIGEgbmV3IG9iamVjdCB0eXBlLCBhbmQgYW5vdGhlcgotaXMgdXNlZCB0byBkZXNjcmliZSB0aGUgdmFsdWUgb2YgYSBjb21wbGV4IG51bWJlci4gIFRoZXNlIHdpbGwgCi1iZSBkaXNjdXNzZWQgdG9nZXRoZXIgd2l0aCB0aGUgZnVuY3Rpb25zIHRoYXQgdXNlIHRoZW0uCi0KLQotXHNlY3Rpb257RXhjZXB0aW9ucyBcbGFiZWx7ZXhjZXB0aW9uc319Ci0KLVRoZSBQeXRob24gcHJvZ3JhbW1lciBvbmx5IG5lZWRzIHRvIGRlYWwgd2l0aCBleGNlcHRpb25zIGlmIHNwZWNpZmljIAotZXJyb3IgaGFuZGxpbmcgaXMgcmVxdWlyZWQ7IHVuaGFuZGxlZCBleGNlcHRpb25zIGFyZSBhdXRvbWF0aWNhbGx5IAotcHJvcGFnYXRlZCB0byB0aGUgY2FsbGVyLCB0aGVuIHRvIHRoZSBjYWxsZXIncyBjYWxsZXIsIGFuZCBzbyBvbiwgdW50aWwKLXRoZXkgcmVhY2ggdGhlIHRvcC1sZXZlbCBpbnRlcnByZXRlciwgd2hlcmUgdGhleSBhcmUgcmVwb3J0ZWQgdG8gdGhlIAotdXNlciBhY2NvbXBhbmllZCBieSBhIHN0YWNrIHRyYWNlYmFjay4KLQotRm9yIEMgcHJvZ3JhbW1lcnMsIGhvd2V2ZXIsIGVycm9yIGNoZWNraW5nIGFsd2F5cyBoYXMgdG8gYmUgZXhwbGljaXQuICAKLUFsbCBmdW5jdGlvbnMgaW4gdGhlIFB5dGhvbi9DIEFQSSBjYW4gcmFpc2UgZXhjZXB0aW9ucywgdW5sZXNzIGFuIAotZXhwbGljaXQgY2xhaW0gaXMgbWFkZSBvdGhlcndpc2UgaW4gYSBmdW5jdGlvbidzIGRvY3VtZW50YXRpb24uICBJbiAKLWdlbmVyYWwsIHdoZW4gYSBmdW5jdGlvbiBlbmNvdW50ZXJzIGFuIGVycm9yLCBpdCBzZXRzIGFuIGV4Y2VwdGlvbiwgCi1kaXNjYXJkcyBhbnkgb2JqZWN0IHJlZmVyZW5jZXMgdGhhdCBpdCBvd25zLCBhbmQgcmV0dXJucyBhbiAKLWVycm9yIGluZGljYXRvciAtLS0gdXN1YWxseSBcTlVMTHt9IG9yIFxjb2Rley0xfS4gIEEgZmV3IGZ1bmN0aW9ucyAKLXJldHVybiBhIEJvb2xlYW4gdHJ1ZS9mYWxzZSByZXN1bHQsIHdpdGggZmFsc2UgaW5kaWNhdGluZyBhbiBlcnJvci4KLVZlcnkgZmV3IGZ1bmN0aW9ucyByZXR1cm4gbm8gZXhwbGljaXQgZXJyb3IgaW5kaWNhdG9yIG9yIGhhdmUgYW4gCi1hbWJpZ3VvdXMgcmV0dXJuIHZhbHVlLCBhbmQgcmVxdWlyZSBleHBsaWNpdCB0ZXN0aW5nIGZvciBlcnJvcnMgd2l0aCAKLVxjZnVuY3Rpb257UHlFcnJfT2NjdXJyZWQoKX1cdHRpbmRleHtQeUVycl9PY2N1cnJlZCgpfS4KLQotRXhjZXB0aW9uIHN0YXRlIGlzIG1haW50YWluZWQgaW4gcGVyLXRocmVhZCBzdG9yYWdlICh0aGlzIGlzIAotZXF1aXZhbGVudCB0byB1c2luZyBnbG9iYWwgc3RvcmFnZSBpbiBhbiB1bnRocmVhZGVkIGFwcGxpY2F0aW9uKS4gIEEgCi10aHJlYWQgY2FuIGJlIGluIG9uZSBvZiB0d28gc3RhdGVzOiBhbiBleGNlcHRpb24gaGFzIG9jY3VycmVkLCBvciBub3QuCi1UaGUgZnVuY3Rpb24gXGNmdW5jdGlvbntQeUVycl9PY2N1cnJlZCgpfSBjYW4gYmUgdXNlZCB0byBjaGVjayBmb3IKLXRoaXM6IGl0IHJldHVybnMgYSBib3Jyb3dlZCByZWZlcmVuY2UgdG8gdGhlIGV4Y2VwdGlvbiB0eXBlIG9iamVjdAotd2hlbiBhbiBleGNlcHRpb24gaGFzIG9jY3VycmVkLCBhbmQgXE5VTEx7fSBvdGhlcndpc2UuICBUaGVyZSBhcmUgYQotbnVtYmVyIG9mIGZ1bmN0aW9ucyB0byBzZXQgdGhlIGV4Y2VwdGlvbiBzdGF0ZToKLVxjZnVuY3Rpb257UHlFcnJfU2V0U3RyaW5nKCl9XHR0aW5kZXh7UHlFcnJfU2V0U3RyaW5nKCl9IGlzIHRoZSBtb3N0Ci1jb21tb24gKHRob3VnaCBub3QgdGhlIG1vc3QgZ2VuZXJhbCkgZnVuY3Rpb24gdG8gc2V0IHRoZSBleGNlcHRpb24KLXN0YXRlLCBhbmQgXGNmdW5jdGlvbntQeUVycl9DbGVhcigpfVx0dGluZGV4e1B5RXJyX0NsZWFyKCl9IGNsZWFycyB0aGUKLWV4Y2VwdGlvbiBzdGF0ZS4KLQotVGhlIGZ1bGwgZXhjZXB0aW9uIHN0YXRlIGNvbnNpc3RzIG9mIHRocmVlIG9iamVjdHMgKGFsbCBvZiB3aGljaCBjYW4gCi1iZSBcTlVMTCk6IHRoZSBleGNlcHRpb24gdHlwZSwgdGhlIGNvcnJlc3BvbmRpbmcgZXhjZXB0aW9uIAotdmFsdWUsIGFuZCB0aGUgdHJhY2ViYWNrLiAgVGhlc2UgaGF2ZSB0aGUgc2FtZSBtZWFuaW5ncyBhcyB0aGUgUHl0aG9uCi1yZXN1bHQgb2YgXGNvZGV7c3lzLmV4Y19pbmZvKCl9OyBob3dldmVyLCB0aGV5IGFyZSBub3QgdGhlIHNhbWU6IHRoZSBQeXRob24KLW9iamVjdHMgcmVwcmVzZW50IHRoZSBsYXN0IGV4Y2VwdGlvbiBiZWluZyBoYW5kbGVkIGJ5IGEgUHl0aG9uIAotXGtleXdvcmR7dHJ5fSBcbGRvdHNcIFxrZXl3b3Jke2V4Y2VwdH0gc3RhdGVtZW50LCB3aGlsZSB0aGUgQyBsZXZlbAotZXhjZXB0aW9uIHN0YXRlIG9ubHkgZXhpc3RzIHdoaWxlIGFuIGV4Y2VwdGlvbiBpcyBiZWluZyBwYXNzZWQgb24KLWJldHdlZW4gQyBmdW5jdGlvbnMgdW50aWwgaXQgcmVhY2hlcyB0aGUgUHl0aG9uIGJ5dGVjb2RlIGludGVycHJldGVyJ3MgCi1tYWluIGxvb3AsIHdoaWNoIHRha2VzIGNhcmUgb2YgdHJhbnNmZXJyaW5nIGl0IHRvIFxjb2Rle3N5cy5leGNfaW5mbygpfQotYW5kIGZyaWVuZHMuCi0KLU5vdGUgdGhhdCBzdGFydGluZyB3aXRoIFB5dGhvbiAxLjUsIHRoZSBwcmVmZXJyZWQsIHRocmVhZC1zYWZlIHdheSB0byAKLWFjY2VzcyB0aGUgZXhjZXB0aW9uIHN0YXRlIGZyb20gUHl0aG9uIGNvZGUgaXMgdG8gY2FsbCB0aGUgZnVuY3Rpb24KLVx3aXRoc3ViaXRlbXsoaW4gbW9kdWxlIHN5cyl9e1x0dGluZGV4e2V4Y19pbmZvKCl9fQotXGZ1bmN0aW9ue3N5cy5leGNfaW5mbygpfSwgd2hpY2ggcmV0dXJucyB0aGUgcGVyLXRocmVhZCBleGNlcHRpb24gc3RhdGUgCi1mb3IgUHl0aG9uIGNvZGUuICBBbHNvLCB0aGUgc2VtYW50aWNzIG9mIGJvdGggd2F5cyB0byBhY2Nlc3MgdGhlIAotZXhjZXB0aW9uIHN0YXRlIGhhdmUgY2hhbmdlZCBzbyB0aGF0IGEgZnVuY3Rpb24gd2hpY2ggY2F0Y2hlcyBhbiAKLWV4Y2VwdGlvbiB3aWxsIHNhdmUgYW5kIHJlc3RvcmUgaXRzIHRocmVhZCdzIGV4Y2VwdGlvbiBzdGF0ZSBzbyBhcyB0byAKLXByZXNlcnZlIHRoZSBleGNlcHRpb24gc3RhdGUgb2YgaXRzIGNhbGxlci4gIFRoaXMgcHJldmVudHMgY29tbW9uIGJ1Z3MgCi1pbiBleGNlcHRpb24gaGFuZGxpbmcgY29kZSBjYXVzZWQgYnkgYW4gaW5ub2NlbnQtbG9va2luZyBmdW5jdGlvbiAKLW92ZXJ3cml0aW5nIHRoZSBleGNlcHRpb24gYmVpbmcgaGFuZGxlZDsgaXQgYWxzbyByZWR1Y2VzIHRoZSBvZnRlbiAKLXVud2FudGVkIGxpZmV0aW1lIGV4dGVuc2lvbiBmb3Igb2JqZWN0cyB0aGF0IGFyZSByZWZlcmVuY2VkIGJ5IHRoZSAKLXN0YWNrIGZyYW1lcyBpbiB0aGUgdHJhY2ViYWNrLgotCi1BcyBhIGdlbmVyYWwgcHJpbmNpcGxlLCBhIGZ1bmN0aW9uIHRoYXQgY2FsbHMgYW5vdGhlciBmdW5jdGlvbiB0byAKLXBlcmZvcm0gc29tZSB0YXNrIHNob3VsZCBjaGVjayB3aGV0aGVyIHRoZSBjYWxsZWQgZnVuY3Rpb24gcmFpc2VkIGFuIAotZXhjZXB0aW9uLCBhbmQgaWYgc28sIHBhc3MgdGhlIGV4Y2VwdGlvbiBzdGF0ZSBvbiB0byBpdHMgY2FsbGVyLiAgSXQgCi1zaG91bGQgZGlzY2FyZCBhbnkgb2JqZWN0IHJlZmVyZW5jZXMgdGhhdCBpdCBvd25zLCBhbmQgcmV0dXJuIGFuIAotZXJyb3IgaW5kaWNhdG9yLCBidXQgaXQgc2hvdWxkIFxlbXBoe25vdH0gc2V0IGFub3RoZXIgZXhjZXB0aW9uIC0tLQotdGhhdCB3b3VsZCBvdmVyd3JpdGUgdGhlIGV4Y2VwdGlvbiB0aGF0IHdhcyBqdXN0IHJhaXNlZCwgYW5kIGxvc2UKLWltcG9ydGFudCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXhhY3QgY2F1c2Ugb2YgdGhlIGVycm9yLgotCi1BIHNpbXBsZSBleGFtcGxlIG9mIGRldGVjdGluZyBleGNlcHRpb25zIGFuZCBwYXNzaW5nIHRoZW0gb24gaXMgc2hvd24KLWluIHRoZSBcY2Z1bmN0aW9ue3N1bV9zZXF1ZW5jZSgpfVx0dGluZGV4e3N1bV9zZXF1ZW5jZSgpfSBleGFtcGxlCi1hYm92ZS4gIEl0IHNvIGhhcHBlbnMgdGhhdCB0aGF0IGV4YW1wbGUgZG9lc24ndCBuZWVkIHRvIGNsZWFuIHVwIGFueQotb3duZWQgcmVmZXJlbmNlcyB3aGVuIGl0IGRldGVjdHMgYW4gZXJyb3IuICBUaGUgZm9sbG93aW5nIGV4YW1wbGUKLWZ1bmN0aW9uIHNob3dzIHNvbWUgZXJyb3IgY2xlYW51cC4gIEZpcnN0LCB0byByZW1pbmQgeW91IHdoeSB5b3UgbGlrZQotUHl0aG9uLCB3ZSBzaG93IHRoZSBlcXVpdmFsZW50IFB5dGhvbiBjb2RlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1kZWYgaW5jcl9pdGVtKGRpY3QsIGtleSk6Ci0gICAgdHJ5OgotICAgICAgICBpdGVtID0gZGljdFtrZXldCi0gICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICBpdGVtID0gMAotICAgIGRpY3Rba2V5XSA9IGl0ZW0gKyAxCi1cZW5ke3ZlcmJhdGltfQotXHR0aW5kZXh7aW5jcl9pdGVtKCl9Ci0KLUhlcmUgaXMgdGhlIGNvcnJlc3BvbmRpbmcgQyBjb2RlLCBpbiBhbGwgaXRzIGdsb3J5OgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbnQKLWluY3JfaXRlbShQeU9iamVjdCAqZGljdCwgUHlPYmplY3QgKmtleSkKLXsKLSAgICAvKiBPYmplY3RzIGFsbCBpbml0aWFsaXplZCB0byBOVUxMIGZvciBQeV9YREVDUkVGICovCi0gICAgUHlPYmplY3QgKml0ZW0gPSBOVUxMLCAqY29uc3Rfb25lID0gTlVMTCwgKmluY3JlbWVudGVkX2l0ZW0gPSBOVUxMOwotICAgIGludCBydiA9IC0xOyAvKiBSZXR1cm4gdmFsdWUgaW5pdGlhbGl6ZWQgdG8gLTEgKGZhaWx1cmUpICovCi0KLSAgICBpdGVtID0gUHlPYmplY3RfR2V0SXRlbShkaWN0LCBrZXkpOwotICAgIGlmIChpdGVtID09IE5VTEwpIHsKLSAgICAgICAgLyogSGFuZGxlIEtleUVycm9yIG9ubHk6ICovCi0gICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19LZXlFcnJvcikpCi0gICAgICAgICAgICBnb3RvIGVycm9yOwotCi0gICAgICAgIC8qIENsZWFyIHRoZSBlcnJvciBhbmQgdXNlIHplcm86ICovCi0gICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgIGl0ZW0gPSBQeUludF9Gcm9tTG9uZygwTCk7Ci0gICAgICAgIGlmIChpdGVtID09IE5VTEwpCi0gICAgICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLSAgICBjb25zdF9vbmUgPSBQeUludF9Gcm9tTG9uZygxTCk7Ci0gICAgaWYgKGNvbnN0X29uZSA9PSBOVUxMKQotICAgICAgICBnb3RvIGVycm9yOwotCi0gICAgaW5jcmVtZW50ZWRfaXRlbSA9IFB5TnVtYmVyX0FkZChpdGVtLCBjb25zdF9vbmUpOwotICAgIGlmIChpbmNyZW1lbnRlZF9pdGVtID09IE5VTEwpCi0gICAgICAgIGdvdG8gZXJyb3I7Ci0KLSAgICBpZiAoUHlPYmplY3RfU2V0SXRlbShkaWN0LCBrZXksIGluY3JlbWVudGVkX2l0ZW0pIDwgMCkKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICBydiA9IDA7IC8qIFN1Y2Nlc3MgKi8KLSAgICAvKiBDb250aW51ZSB3aXRoIGNsZWFudXAgY29kZSAqLwotCi0gZXJyb3I6Ci0gICAgLyogQ2xlYW51cCBjb2RlLCBzaGFyZWQgYnkgc3VjY2VzcyBhbmQgZmFpbHVyZSBwYXRoICovCi0KLSAgICAvKiBVc2UgUHlfWERFQ1JFRigpIHRvIGlnbm9yZSBOVUxMIHJlZmVyZW5jZXMgKi8KLSAgICBQeV9YREVDUkVGKGl0ZW0pOwotICAgIFB5X1hERUNSRUYoY29uc3Rfb25lKTsKLSAgICBQeV9YREVDUkVGKGluY3JlbWVudGVkX2l0ZW0pOwotCi0gICAgcmV0dXJuIHJ2OyAvKiAtMSBmb3IgZXJyb3IsIDAgZm9yIHN1Y2Nlc3MgKi8KLX0KLVxlbmR7dmVyYmF0aW19Ci1cdHRpbmRleHtpbmNyX2l0ZW0oKX0KLQotVGhpcyBleGFtcGxlIHJlcHJlc2VudHMgYW4gZW5kb3JzZWQgdXNlIG9mIHRoZSBca2V5d29yZHtnb3RvfSBzdGF0ZW1lbnQgCi1pbiBDISAgSXQgaWxsdXN0cmF0ZXMgdGhlIHVzZSBvZgotXGNmdW5jdGlvbntQeUVycl9FeGNlcHRpb25NYXRjaGVzKCl9XHR0aW5kZXh7UHlFcnJfRXhjZXB0aW9uTWF0Y2hlcygpfSBhbmQKLVxjZnVuY3Rpb257UHlFcnJfQ2xlYXIoKX1cdHRpbmRleHtQeUVycl9DbGVhcigpfSB0bwotaGFuZGxlIHNwZWNpZmljIGV4Y2VwdGlvbnMsIGFuZCB0aGUgdXNlIG9mCi1cY2Z1bmN0aW9ue1B5X1hERUNSRUYoKX1cdHRpbmRleHtQeV9YREVDUkVGKCl9IHRvCi1kaXNwb3NlIG9mIG93bmVkIHJlZmVyZW5jZXMgdGhhdCBtYXkgYmUgXE5VTEx7fSAobm90ZSB0aGUKLVxjaGFyYWN0ZXJ7WH0gaW4gdGhlIG5hbWU7IFxjZnVuY3Rpb257UHlfREVDUkVGKCl9IHdvdWxkIGNyYXNoIHdoZW4KLWNvbmZyb250ZWQgd2l0aCBhIFxOVUxMe30gcmVmZXJlbmNlKS4gIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoZQotdmFyaWFibGVzIHVzZWQgdG8gaG9sZCBvd25lZCByZWZlcmVuY2VzIGFyZSBpbml0aWFsaXplZCB0byBcTlVMTHt9IGZvcgotdGhpcyB0byB3b3JrOyBsaWtld2lzZSwgdGhlIHByb3Bvc2VkIHJldHVybiB2YWx1ZSBpcyBpbml0aWFsaXplZCB0bwotXGNvZGV7LTF9IChmYWlsdXJlKSBhbmQgb25seSBzZXQgdG8gc3VjY2VzcyBhZnRlciB0aGUgZmluYWwgY2FsbCBtYWRlCi1pcyBzdWNjZXNzZnVsLgotCi0KLVxzZWN0aW9ue0VtYmVkZGluZyBQeXRob24gXGxhYmVse2VtYmVkZGluZ319Ci0KLVRoZSBvbmUgaW1wb3J0YW50IHRhc2sgdGhhdCBvbmx5IGVtYmVkZGVycyAoYXMgb3Bwb3NlZCB0byBleHRlbnNpb24KLXdyaXRlcnMpIG9mIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgaGF2ZSB0byB3b3JyeSBhYm91dCBpcyB0aGUKLWluaXRpYWxpemF0aW9uLCBhbmQgcG9zc2libHkgdGhlIGZpbmFsaXphdGlvbiwgb2YgdGhlIFB5dGhvbgotaW50ZXJwcmV0ZXIuICBNb3N0IGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGludGVycHJldGVyIGNhbiBvbmx5IGJlIHVzZWQKLWFmdGVyIHRoZSBpbnRlcnByZXRlciBoYXMgYmVlbiBpbml0aWFsaXplZC4KLQotVGhlIGJhc2ljIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGlzCi1cY2Z1bmN0aW9ue1B5X0luaXRpYWxpemUoKX1cdHRpbmRleHtQeV9Jbml0aWFsaXplKCl9LgotVGhpcyBpbml0aWFsaXplcyB0aGUgdGFibGUgb2YgbG9hZGVkIG1vZHVsZXMsIGFuZCBjcmVhdGVzIHRoZQotZnVuZGFtZW50YWwgbW9kdWxlcyBcbW9kdWxle19fYnVpbHRpbl9ffVxyZWZiaW1vZGluZGV4e19fYnVpbHRpbl9ffSwKLVxtb2R1bGV7X19tYWluX199XHJlZmJpbW9kaW5kZXh7X19tYWluX199LCBcbW9kdWxle3N5c31ccmVmYmltb2RpbmRleHtzeXN9LAotYW5kIFxtb2R1bGV7ZXhjZXB0aW9uc30uXHJlZmJpbW9kaW5kZXh7ZXhjZXB0aW9uc30gIEl0IGFsc28gaW5pdGlhbGl6ZXMKLXRoZSBtb2R1bGUgc2VhcmNoIHBhdGggKFxjb2Rle3N5cy5wYXRofSkuJQotXGluZGV4aWlpe21vZHVsZX17c2VhcmNofXtwYXRofQotXHdpdGhzdWJpdGVteyhpbiBtb2R1bGUgc3lzKX17XHR0aW5kZXh7cGF0aH19Ci0KLVxjZnVuY3Rpb257UHlfSW5pdGlhbGl6ZSgpfSBkb2VzIG5vdCBzZXQgdGhlIGBgc2NyaXB0IGFyZ3VtZW50IGxpc3QnJyAKLShcY29kZXtzeXMuYXJndn0pLiAgSWYgdGhpcyB2YXJpYWJsZSBpcyBuZWVkZWQgYnkgUHl0aG9uIGNvZGUgdGhhdCAKLXdpbGwgYmUgZXhlY3V0ZWQgbGF0ZXIsIGl0IG11c3QgYmUgc2V0IGV4cGxpY2l0bHkgd2l0aCBhIGNhbGwgdG8gCi1cY29kZXtQeVN5c19TZXRBcmd2KFx2YXJ7YXJnY30sCi1cdmFye2FyZ3Z9KX1cdHRpbmRleHtQeVN5c19TZXRBcmd2KCl9IHN1YnNlcXVlbnQgdG8gdGhlIGNhbGwgdG8KLVxjZnVuY3Rpb257UHlfSW5pdGlhbGl6ZSgpfS4KLQotT24gbW9zdCBzeXN0ZW1zIChpbiBwYXJ0aWN1bGFyLCBvbiBcVU5JWHt9IGFuZCBXaW5kb3dzLCBhbHRob3VnaCB0aGUKLWRldGFpbHMgYXJlIHNsaWdodGx5IGRpZmZlcmVudCksCi1cY2Z1bmN0aW9ue1B5X0luaXRpYWxpemUoKX0gY2FsY3VsYXRlcyB0aGUgbW9kdWxlIHNlYXJjaCBwYXRoIGJhc2VkCi11cG9uIGl0cyBiZXN0IGd1ZXNzIGZvciB0aGUgbG9jYXRpb24gb2YgdGhlIHN0YW5kYXJkIFB5dGhvbgotaW50ZXJwcmV0ZXIgZXhlY3V0YWJsZSwgYXNzdW1pbmcgdGhhdCB0aGUgUHl0aG9uIGxpYnJhcnkgaXMgZm91bmQgaW4gYQotZml4ZWQgbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIFB5dGhvbiBpbnRlcnByZXRlciBleGVjdXRhYmxlLiAgSW4KLXBhcnRpY3VsYXIsIGl0IGxvb2tzIGZvciBhIGRpcmVjdG9yeSBuYW1lZAotXGZpbGV7bGliL3B5dGhvblxzaG9ydHZlcnNpb259IHJlbGF0aXZlIHRvIHRoZSBwYXJlbnQgZGlyZWN0b3J5IHdoZXJlCi10aGUgZXhlY3V0YWJsZSBuYW1lZCBcZmlsZXtweXRob259IGlzIGZvdW5kIG9uIHRoZSBzaGVsbCBjb21tYW5kCi1zZWFyY2ggcGF0aCAodGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFxlbnZ2YXJ7UEFUSH0pLgotCi1Gb3IgaW5zdGFuY2UsIGlmIHRoZSBQeXRob24gZXhlY3V0YWJsZSBpcyBmb3VuZCBpbgotXGZpbGV7L3Vzci9sb2NhbC9iaW4vcHl0aG9ufSwgaXQgd2lsbCBhc3N1bWUgdGhhdCB0aGUgbGlicmFyaWVzIGFyZSBpbgotXGZpbGV7L3Vzci9sb2NhbC9saWIvcHl0aG9uXHNob3J0dmVyc2lvbn0uICAoSW4gZmFjdCwgdGhpcyBwYXJ0aWN1bGFyIHBhdGgKLWlzIGFsc28gdGhlIGBgZmFsbGJhY2snJyBsb2NhdGlvbiwgdXNlZCB3aGVuIG5vIGV4ZWN1dGFibGUgZmlsZSBuYW1lZAotXGZpbGV7cHl0aG9ufSBpcyBmb3VuZCBhbG9uZyBcZW52dmFye1BBVEh9LikgIFRoZSB1c2VyIGNhbiBvdmVycmlkZQotdGhpcyBiZWhhdmlvciBieSBzZXR0aW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBcZW52dmFye1BZVEhPTkhPTUV9LAotb3IgaW5zZXJ0IGFkZGl0aW9uYWwgZGlyZWN0b3JpZXMgaW4gZnJvbnQgb2YgdGhlIHN0YW5kYXJkIHBhdGggYnkKLXNldHRpbmcgXGVudnZhcntQWVRIT05QQVRIfS4KLQotVGhlIGVtYmVkZGluZyBhcHBsaWNhdGlvbiBjYW4gc3RlZXIgdGhlIHNlYXJjaCBieSBjYWxsaW5nIAotXGNvZGV7UHlfU2V0UHJvZ3JhbU5hbWUoXHZhcntmaWxlfSl9XHR0aW5kZXh7UHlfU2V0UHJvZ3JhbU5hbWUoKX0gXGVtcGh7YmVmb3JlfSBjYWxsaW5nIAotXGNmdW5jdGlvbntQeV9Jbml0aWFsaXplKCl9LiAgTm90ZSB0aGF0IFxlbnZ2YXJ7UFlUSE9OSE9NRX0gc3RpbGwKLW92ZXJyaWRlcyB0aGlzIGFuZCBcZW52dmFye1BZVEhPTlBBVEh9IGlzIHN0aWxsIGluc2VydGVkIGluIGZyb250IG9mCi10aGUgc3RhbmRhcmQgcGF0aC4gIEFuIGFwcGxpY2F0aW9uIHRoYXQgcmVxdWlyZXMgdG90YWwgY29udHJvbCBoYXMgdG8KLXByb3ZpZGUgaXRzIG93biBpbXBsZW1lbnRhdGlvbiBvZgotXGNmdW5jdGlvbntQeV9HZXRQYXRoKCl9XHR0aW5kZXh7UHlfR2V0UGF0aCgpfSwKLVxjZnVuY3Rpb257UHlfR2V0UHJlZml4KCl9XHR0aW5kZXh7UHlfR2V0UHJlZml4KCl9LAotXGNmdW5jdGlvbntQeV9HZXRFeGVjUHJlZml4KCl9XHR0aW5kZXh7UHlfR2V0RXhlY1ByZWZpeCgpfSwgYW5kCi1cY2Z1bmN0aW9ue1B5X0dldFByb2dyYW1GdWxsUGF0aCgpfVx0dGluZGV4e1B5X0dldFByb2dyYW1GdWxsUGF0aCgpfSAoYWxsCi1kZWZpbmVkIGluIFxmaWxle01vZHVsZXMvZ2V0cGF0aC5jfSkuCi0KLVNvbWV0aW1lcywgaXQgaXMgZGVzaXJhYmxlIHRvIGBgdW5pbml0aWFsaXplJycgUHl0aG9uLiAgRm9yIGluc3RhbmNlLCAKLXRoZSBhcHBsaWNhdGlvbiBtYXkgd2FudCB0byBzdGFydCBvdmVyIChtYWtlIGFub3RoZXIgY2FsbCB0byAKLVxjZnVuY3Rpb257UHlfSW5pdGlhbGl6ZSgpfSkgb3IgdGhlIGFwcGxpY2F0aW9uIGlzIHNpbXBseSBkb25lIHdpdGggaXRzIAotdXNlIG9mIFB5dGhvbiBhbmQgd2FudHMgdG8gZnJlZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IFB5dGhvbi4gIFRoaXMKLWNhbiBiZSBhY2NvbXBsaXNoZWQgYnkgY2FsbGluZyBcY2Z1bmN0aW9ue1B5X0ZpbmFsaXplKCl9LiAgVGhlIGZ1bmN0aW9uCi1cY2Z1bmN0aW9ue1B5X0lzSW5pdGlhbGl6ZWQoKX1cdHRpbmRleHtQeV9Jc0luaXRpYWxpemVkKCl9IHJldHVybnMKLXRydWUgaWYgUHl0aG9uIGlzIGN1cnJlbnRseSBpbiB0aGUgaW5pdGlhbGl6ZWQgc3RhdGUuICBNb3JlCi1pbmZvcm1hdGlvbiBhYm91dCB0aGVzZSBmdW5jdGlvbnMgaXMgZ2l2ZW4gaW4gYSBsYXRlciBjaGFwdGVyLgotTm90aWNlIHRoYXQgXGNmdW5jdGlvbntQeV9GaW5hbGl6ZX0gZG9lcyBcZW1waHtub3R9IGZyZWUgYWxsIG1lbW9yeQotYWxsb2NhdGVkIGJ5IHRoZSBQeXRob24gaW50ZXJwcmV0ZXIsIGUuZy4gbWVtb3J5IGFsbG9jYXRlZCBieSBleHRlbnNpb24KLW1vZHVsZXMgY3VycmVudGx5IGNhbm5vdCBiZSByZWxlYXNlZC4KLQotCi1cc2VjdGlvbntEZWJ1Z2dpbmcgQnVpbGRzIFxsYWJlbHtkZWJ1Z2dpbmd9fQotCi1QeXRob24gY2FuIGJlIGJ1aWx0IHdpdGggc2V2ZXJhbCBtYWNyb3MgdG8gZW5hYmxlIGV4dHJhIGNoZWNrcyBvZiB0aGUKLWludGVycHJldGVyIGFuZCBleHRlbnNpb24gbW9kdWxlcy4gIFRoZXNlIGNoZWNrcyB0ZW5kIHRvIGFkZCBhIGxhcmdlCi1hbW91bnQgb2Ygb3ZlcmhlYWQgdG8gdGhlIHJ1bnRpbWUgc28gdGhleSBhcmUgbm90IGVuYWJsZWQgYnkgZGVmYXVsdC4KLQotQSBmdWxsIGxpc3Qgb2YgdGhlIHZhcmlvdXMgdHlwZXMgb2YgZGVidWdnaW5nIGJ1aWxkcyBpcyBpbiB0aGUgZmlsZQotXGZpbGV7TWlzYy9TcGVjaWFsQnVpbGRzLnR4dH0gaW4gdGhlIFB5dGhvbiBzb3VyY2UgZGlzdHJpYnV0aW9uLgotQnVpbGRzIGFyZSBhdmFpbGFibGUgdGhhdCBzdXBwb3J0IHRyYWNpbmcgb2YgcmVmZXJlbmNlIGNvdW50cywKLWRlYnVnZ2luZyB0aGUgbWVtb3J5IGFsbG9jYXRvciwgb3IgbG93LWxldmVsIHByb2ZpbGluZyBvZiB0aGUgbWFpbgotaW50ZXJwcmV0ZXIgbG9vcC4gIE9ubHkgdGhlIG1vc3QgZnJlcXVlbnRseS11c2VkIGJ1aWxkcyB3aWxsIGJlCi1kZXNjcmliZWQgaW4gdGhlIHJlbWFpbmRlciBvZiB0aGlzIHNlY3Rpb24uCi0KLUNvbXBpbGluZyB0aGUgaW50ZXJwcmV0ZXIgd2l0aCB0aGUgXGNzaW1wbGVtYWNyb3tQeV9ERUJVR30gbWFjcm8KLWRlZmluZWQgcHJvZHVjZXMgd2hhdCBpcyBnZW5lcmFsbHkgbWVhbnQgYnkgImEgZGVidWcgYnVpbGQiIG9mIFB5dGhvbi4KLVxjc2ltcGxlbWFjcm97UHlfREVCVUd9IGlzIGVuYWJsZWQgaW4gdGhlIFxVTklYe30gYnVpbGQgYnkgYWRkaW5nCi1cbG9uZ3Byb2dyYW1vcHR7d2l0aC1weWRlYnVnfSB0byB0aGUgXGZpbGV7Y29uZmlndXJlfSBjb21tYW5kLiAgSXQgaXMgYWxzbwotaW1wbGllZCBieSB0aGUgcHJlc2VuY2Ugb2YgdGhlIG5vdC1QeXRob24tc3BlY2lmaWMKLVxjc2ltcGxlbWFjcm97X0RFQlVHfSBtYWNyby4gIFdoZW4gXGNzaW1wbGVtYWNyb3tQeV9ERUJVR30gaXMgZW5hYmxlZAotaW4gdGhlIFxVTklYe30gYnVpbGQsIGNvbXBpbGVyIG9wdGltaXphdGlvbiBpcyBkaXNhYmxlZC4KLQotSW4gYWRkaXRpb24gdG8gdGhlIHJlZmVyZW5jZSBjb3VudCBkZWJ1Z2dpbmcgZGVzY3JpYmVkIGJlbG93LCB0aGUKLWZvbGxvd2luZyBleHRyYSBjaGVja3MgYXJlIHBlcmZvcm1lZDoKLQotXGJlZ2lue2l0ZW1pemV9Ci0gICAgICBcaXRlbSBFeHRyYSBjaGVja3MgYXJlIGFkZGVkIHRvIHRoZSBvYmplY3QgYWxsb2NhdG9yLgotICAgICAgXGl0ZW0gRXh0cmEgY2hlY2tzIGFyZSBhZGRlZCB0byB0aGUgcGFyc2VyIGFuZCBjb21waWxlci4KLSAgICAgIFxpdGVtIERvd25jYXN0cyBmcm9tIHdpZGUgdHlwZXMgdG8gbmFycm93IHR5cGVzIGFyZSBjaGVja2VkIGZvcgotICAgICAgICAgICAgbG9zcyBvZiBpbmZvcm1hdGlvbi4KLSAgICAgIFxpdGVtIEEgbnVtYmVyIG9mIGFzc2VydGlvbnMgYXJlIGFkZGVkIHRvIHRoZSBkaWN0aW9uYXJ5IGFuZCBzZXQKLSAgICAgICAgICAgIGltcGxlbWVudGF0aW9ucy4gIEluIGFkZGl0aW9uLCB0aGUgc2V0IG9iamVjdCBhY3F1aXJlcyBhCi0gICAgICAgICAgICBcbWV0aG9ke3Rlc3RfY19hcGl9IG1ldGhvZC4KLSAgICAgIFxpdGVtIFNhbml0eSBjaGVja3Mgb2YgdGhlIGlucHV0IGFyZ3VtZW50cyBhcmUgYWRkZWQgdG8gZnJhbWUKLSAgICAgICAgICAgIGNyZWF0aW9uLiAKLSAgICAgIFxpdGVtIFRoZSBzdG9yYWdlIGZvciBsb25nIGludHMgaXMgaW5pdGlhbGl6ZWQgd2l0aCBhIGtub3duCi0gICAgICAgICAgICBpbnZhbGlkIHBhdHRlcm4gdG8gY2F0Y2ggcmVmZXJlbmNlIHRvIHVuaW5pdGlhbGl6ZWQKLSAgICAgICAgICAgIGRpZ2l0cy4gCi0gICAgICBcaXRlbSBMb3ctbGV2ZWwgdHJhY2luZyBhbmQgZXh0cmEgZXhjZXB0aW9uIGNoZWNraW5nIGFyZSBhZGRlZAotICAgICAgICAgICAgdG8gdGhlIHJ1bnRpbWUgdmlydHVhbCBtYWNoaW5lLgotICAgICAgXGl0ZW0gRXh0cmEgY2hlY2tzIGFyZSBhZGRlZCB0byB0aGUgbWVtb3J5IGFyZW5hIGltcGxlbWVudGF0aW9uLgotICAgICAgXGl0ZW0gRXh0cmEgZGVidWdnaW5nIGlzIGFkZGVkIHRvIHRoZSB0aHJlYWQgbW9kdWxlLgotXGVuZHtpdGVtaXplfQotCi1UaGVyZSBtYXkgYmUgYWRkaXRpb25hbCBjaGVja3Mgbm90IG1lbnRpb25lZCBoZXJlLgotCi1EZWZpbmluZyBcY3NpbXBsZW1hY3Jve1B5X1RSQUNFX1JFRlN9IGVuYWJsZXMgcmVmZXJlbmNlIHRyYWNpbmcuICBXaGVuCi1kZWZpbmVkLCBhIGNpcmN1bGFyIGRvdWJseSBsaW5rZWQgbGlzdCBvZiBhY3RpdmUgb2JqZWN0cyBpcyBtYWludGFpbmVkCi1ieSBhZGRpbmcgdHdvIGV4dHJhIGZpZWxkcyB0byBldmVyeSBcY3R5cGV7UHlPYmplY3R9LiAgVG90YWwKLWFsbG9jYXRpb25zIGFyZSB0cmFja2VkIGFzIHdlbGwuICBVcG9uIGV4aXQsIGFsbCBleGlzdGluZyByZWZlcmVuY2VzCi1hcmUgcHJpbnRlZC4gIChJbiBpbnRlcmFjdGl2ZSBtb2RlIHRoaXMgaGFwcGVucyBhZnRlciBldmVyeSBzdGF0ZW1lbnQKLXJ1biBieSB0aGUgaW50ZXJwcmV0ZXIuKSAgSW1wbGllZCBieSBcY3NpbXBsZW1hY3Jve1B5X0RFQlVHfS4KLQotUGxlYXNlIHJlZmVyIHRvIFxmaWxle01pc2MvU3BlY2lhbEJ1aWxkcy50eHR9IGluIHRoZSBQeXRob24gc291cmNlCi1kaXN0cmlidXRpb24gZm9yIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24uCmRpZmYgLS1naXQgYS9Eb2MvYXBpL21lbW9yeS50ZXggYi9Eb2MvYXBpL21lbW9yeS50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YWJlOTguLjAwMDAwMDAKLS0tIGEvRG9jL2FwaS9tZW1vcnkudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLVxjaGFwdGVye01lbW9yeSBNYW5hZ2VtZW50IFxsYWJlbHttZW1vcnl9fQotXHNlY3Rpb25hdXRob3J7VmxhZGltaXIgTWFyYW5nb3pvdn17VmxhZGltaXIuTWFyYW5nb3pvdkBpbnJpYWxwZXMuZnJ9Ci0KLQotXHNlY3Rpb257T3ZlcnZpZXcgXGxhYmVse21lbW9yeU92ZXJ2aWV3fX0KLQotTWVtb3J5IG1hbmFnZW1lbnQgaW4gUHl0aG9uIGludm9sdmVzIGEgcHJpdmF0ZSBoZWFwIGNvbnRhaW5pbmcgYWxsCi1QeXRob24gb2JqZWN0cyBhbmQgZGF0YSBzdHJ1Y3R1cmVzLiBUaGUgbWFuYWdlbWVudCBvZiB0aGlzIHByaXZhdGUKLWhlYXAgaXMgZW5zdXJlZCBpbnRlcm5hbGx5IGJ5IHRoZSBcZW1waHtQeXRob24gbWVtb3J5IG1hbmFnZXJ9LiAgVGhlCi1QeXRob24gbWVtb3J5IG1hbmFnZXIgaGFzIGRpZmZlcmVudCBjb21wb25lbnRzIHdoaWNoIGRlYWwgd2l0aCB2YXJpb3VzCi1keW5hbWljIHN0b3JhZ2UgbWFuYWdlbWVudCBhc3BlY3RzLCBsaWtlIHNoYXJpbmcsIHNlZ21lbnRhdGlvbiwKLXByZWFsbG9jYXRpb24gb3IgY2FjaGluZy4KLQotQXQgdGhlIGxvd2VzdCBsZXZlbCwgYSByYXcgbWVtb3J5IGFsbG9jYXRvciBlbnN1cmVzIHRoYXQgdGhlcmUgaXMKLWVub3VnaCByb29tIGluIHRoZSBwcml2YXRlIGhlYXAgZm9yIHN0b3JpbmcgYWxsIFB5dGhvbi1yZWxhdGVkIGRhdGEKLWJ5IGludGVyYWN0aW5nIHdpdGggdGhlIG1lbW9yeSBtYW5hZ2VyIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtLiBPbiB0b3AKLW9mIHRoZSByYXcgbWVtb3J5IGFsbG9jYXRvciwgc2V2ZXJhbCBvYmplY3Qtc3BlY2lmaWMgYWxsb2NhdG9ycwotb3BlcmF0ZSBvbiB0aGUgc2FtZSBoZWFwIGFuZCBpbXBsZW1lbnQgZGlzdGluY3QgbWVtb3J5IG1hbmFnZW1lbnQKLXBvbGljaWVzIGFkYXB0ZWQgdG8gdGhlIHBlY3VsaWFyaXRpZXMgb2YgZXZlcnkgb2JqZWN0IHR5cGUuIEZvcgotZXhhbXBsZSwgaW50ZWdlciBvYmplY3RzIGFyZSBtYW5hZ2VkIGRpZmZlcmVudGx5IHdpdGhpbiB0aGUgaGVhcCB0aGFuCi1zdHJpbmdzLCB0dXBsZXMgb3IgZGljdGlvbmFyaWVzIGJlY2F1c2UgaW50ZWdlcnMgaW1wbHkgZGlmZmVyZW50Ci1zdG9yYWdlIHJlcXVpcmVtZW50cyBhbmQgc3BlZWQvc3BhY2UgdHJhZGVvZmZzLiBUaGUgUHl0aG9uIG1lbW9yeQotbWFuYWdlciB0aHVzIGRlbGVnYXRlcyBzb21lIG9mIHRoZSB3b3JrIHRvIHRoZSBvYmplY3Qtc3BlY2lmaWMKLWFsbG9jYXRvcnMsIGJ1dCBlbnN1cmVzIHRoYXQgdGhlIGxhdHRlciBvcGVyYXRlIHdpdGhpbiB0aGUgYm91bmRzIG9mCi10aGUgcHJpdmF0ZSBoZWFwLgotCi1JdCBpcyBpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCB0aGF0IHRoZSBtYW5hZ2VtZW50IG9mIHRoZSBQeXRob24gaGVhcAotaXMgcGVyZm9ybWVkIGJ5IHRoZSBpbnRlcnByZXRlciBpdHNlbGYgYW5kIHRoYXQgdGhlIHVzZXIgaGFzIG5vCi1jb250cm9sIG92ZXIgaXQsIGV2ZW4gaWYgc2hlIHJlZ3VsYXJseSBtYW5pcHVsYXRlcyBvYmplY3QgcG9pbnRlcnMgdG8KLW1lbW9yeSBibG9ja3MgaW5zaWRlIHRoYXQgaGVhcC4gIFRoZSBhbGxvY2F0aW9uIG9mIGhlYXAgc3BhY2UgZm9yCi1QeXRob24gb2JqZWN0cyBhbmQgb3RoZXIgaW50ZXJuYWwgYnVmZmVycyBpcyBwZXJmb3JtZWQgb24gZGVtYW5kIGJ5Ci10aGUgUHl0aG9uIG1lbW9yeSBtYW5hZ2VyIHRocm91Z2ggdGhlIFB5dGhvbi9DIEFQSSBmdW5jdGlvbnMgbGlzdGVkIGluCi10aGlzIGRvY3VtZW50LgotCi1UbyBhdm9pZCBtZW1vcnkgY29ycnVwdGlvbiwgZXh0ZW5zaW9uIHdyaXRlcnMgc2hvdWxkIG5ldmVyIHRyeSB0bwotb3BlcmF0ZSBvbiBQeXRob24gb2JqZWN0cyB3aXRoIHRoZSBmdW5jdGlvbnMgZXhwb3J0ZWQgYnkgdGhlIEMKLWxpYnJhcnk6IFxjZnVuY3Rpb257bWFsbG9jKCl9XHR0aW5kZXh7bWFsbG9jKCl9LAotXGNmdW5jdGlvbntjYWxsb2MoKX1cdHRpbmRleHtjYWxsb2MoKX0sCi1cY2Z1bmN0aW9ue3JlYWxsb2MoKX1cdHRpbmRleHtyZWFsbG9jKCl9IGFuZAotXGNmdW5jdGlvbntmcmVlKCl9XHR0aW5kZXh7ZnJlZSgpfS4gIFRoaXMgd2lsbCByZXN1bHQgaW4gCi1taXhlZCBjYWxscyBiZXR3ZWVuIHRoZSBDIGFsbG9jYXRvciBhbmQgdGhlIFB5dGhvbiBtZW1vcnkgbWFuYWdlcgotd2l0aCBmYXRhbCBjb25zZXF1ZW5jZXMsIGJlY2F1c2UgdGhleSBpbXBsZW1lbnQgZGlmZmVyZW50IGFsZ29yaXRobXMKLWFuZCBvcGVyYXRlIG9uIGRpZmZlcmVudCBoZWFwcy4gIEhvd2V2ZXIsIG9uZSBtYXkgc2FmZWx5IGFsbG9jYXRlIGFuZAotcmVsZWFzZSBtZW1vcnkgYmxvY2tzIHdpdGggdGhlIEMgbGlicmFyeSBhbGxvY2F0b3IgZm9yIGluZGl2aWR1YWwKLXB1cnBvc2VzLCBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICBQeU9iamVjdCAqcmVzOwotICAgIGNoYXIgKmJ1ZiA9IChjaGFyICopIG1hbGxvYyhCVUZTSVopOyAvKiBmb3IgSS9PICovCi0KLSAgICBpZiAoYnVmID09IE5VTEwpCi0gICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotICAgIC4uLkRvIHNvbWUgSS9PIG9wZXJhdGlvbiBpbnZvbHZpbmcgYnVmLi4uCi0gICAgcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwotICAgIGZyZWUoYnVmKTsgLyogbWFsbG9jJ2VkICovCi0gICAgcmV0dXJuIHJlczsKLVxlbmR7dmVyYmF0aW19Ci0KLUluIHRoaXMgZXhhbXBsZSwgdGhlIG1lbW9yeSByZXF1ZXN0IGZvciB0aGUgSS9PIGJ1ZmZlciBpcyBoYW5kbGVkIGJ5Ci10aGUgQyBsaWJyYXJ5IGFsbG9jYXRvci4gVGhlIFB5dGhvbiBtZW1vcnkgbWFuYWdlciBpcyBpbnZvbHZlZCBvbmx5Ci1pbiB0aGUgYWxsb2NhdGlvbiBvZiB0aGUgc3RyaW5nIG9iamVjdCByZXR1cm5lZCBhcyBhIHJlc3VsdC4KLQotSW4gbW9zdCBzaXR1YXRpb25zLCBob3dldmVyLCBpdCBpcyByZWNvbW1lbmRlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZnJvbQotdGhlIFB5dGhvbiBoZWFwIHNwZWNpZmljYWxseSBiZWNhdXNlIHRoZSBsYXR0ZXIgaXMgdW5kZXIgY29udHJvbCBvZgotdGhlIFB5dGhvbiBtZW1vcnkgbWFuYWdlci4gRm9yIGV4YW1wbGUsIHRoaXMgaXMgcmVxdWlyZWQgd2hlbiB0aGUKLWludGVycHJldGVyIGlzIGV4dGVuZGVkIHdpdGggbmV3IG9iamVjdCB0eXBlcyB3cml0dGVuIGluIEMuIEFub3RoZXIKLXJlYXNvbiBmb3IgdXNpbmcgdGhlIFB5dGhvbiBoZWFwIGlzIHRoZSBkZXNpcmUgdG8gXGVtcGh7aW5mb3JtfSB0aGUKLVB5dGhvbiBtZW1vcnkgbWFuYWdlciBhYm91dCB0aGUgbWVtb3J5IG5lZWRzIG9mIHRoZSBleHRlbnNpb24gbW9kdWxlLgotRXZlbiB3aGVuIHRoZSByZXF1ZXN0ZWQgbWVtb3J5IGlzIHVzZWQgZXhjbHVzaXZlbHkgZm9yIGludGVybmFsLAotaGlnaGx5LXNwZWNpZmljIHB1cnBvc2VzLCBkZWxlZ2F0aW5nIGFsbCBtZW1vcnkgcmVxdWVzdHMgdG8gdGhlIFB5dGhvbgotbWVtb3J5IG1hbmFnZXIgY2F1c2VzIHRoZSBpbnRlcnByZXRlciB0byBoYXZlIGEgbW9yZSBhY2N1cmF0ZSBpbWFnZSBvZgotaXRzIG1lbW9yeSBmb290cHJpbnQgYXMgYSB3aG9sZS4gQ29uc2VxdWVudGx5LCB1bmRlciBjZXJ0YWluCi1jaXJjdW1zdGFuY2VzLCB0aGUgUHl0aG9uIG1lbW9yeSBtYW5hZ2VyIG1heSBvciBtYXkgbm90IHRyaWdnZXIKLWFwcHJvcHJpYXRlIGFjdGlvbnMsIGxpa2UgZ2FyYmFnZSBjb2xsZWN0aW9uLCBtZW1vcnkgY29tcGFjdGlvbiBvcgotb3RoZXIgcHJldmVudGl2ZSBwcm9jZWR1cmVzLiBOb3RlIHRoYXQgYnkgdXNpbmcgdGhlIEMgbGlicmFyeQotYWxsb2NhdG9yIGFzIHNob3duIGluIHRoZSBwcmV2aW91cyBleGFtcGxlLCB0aGUgYWxsb2NhdGVkIG1lbW9yeSBmb3IKLXRoZSBJL08gYnVmZmVyIGVzY2FwZXMgY29tcGxldGVseSB0aGUgUHl0aG9uIG1lbW9yeSBtYW5hZ2VyLgotCi0KLVxzZWN0aW9ue01lbW9yeSBJbnRlcmZhY2UgXGxhYmVse21lbW9yeUludGVyZmFjZX19Ci0KLVRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gc2V0cywgbW9kZWxlZCBhZnRlciB0aGUgQU5TSSBDIHN0YW5kYXJkLAotYnV0IHNwZWNpZnlpbmcgIGJlaGF2aW9yIHdoZW4gcmVxdWVzdGluZyB6ZXJvIGJ5dGVzLAotYXJlIGF2YWlsYWJsZSBmb3IgYWxsb2NhdGluZyBhbmQgcmVsZWFzaW5nIG1lbW9yeSBmcm9tIHRoZSBQeXRob24gaGVhcDoKLQotCi1cYmVnaW57Y2Z1bmNkZXNjfXt2b2lkKn17UHlNZW1fTWFsbG9jfXtzaXplX3Qgbn0KLSAgQWxsb2NhdGVzIFx2YXJ7bn0gYnl0ZXMgYW5kIHJldHVybnMgYSBwb2ludGVyIG9mIHR5cGUgXGN0eXBle3ZvaWQqfQotICB0byB0aGUgYWxsb2NhdGVkIG1lbW9yeSwgb3IgXE5VTEx7fSBpZiB0aGUgcmVxdWVzdCBmYWlscy4KLSAgUmVxdWVzdGluZyB6ZXJvIGJ5dGVzIHJldHVybnMgYSBkaXN0aW5jdCBub24tXE5VTEx7fSBwb2ludGVyIGlmCi0gIHBvc3NpYmxlLCBhcyBpZiBcY2Z1bmN0aW9ue1B5TWVtX01hbGxvYygxKX0gaGFkIGJlZW4gY2FsbGVkIGluc3RlYWQuCi0gIFRoZSBtZW1vcnkgd2lsbCBub3QgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGluIGFueSB3YXkuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317dm9pZCp9e1B5TWVtX1JlYWxsb2N9e3ZvaWQgKnAsIHNpemVfdCBufQotICBSZXNpemVzIHRoZSBtZW1vcnkgYmxvY2sgcG9pbnRlZCB0byBieSBcdmFye3B9IHRvIFx2YXJ7bn0gYnl0ZXMuCi0gIFRoZSBjb250ZW50cyB3aWxsIGJlIHVuY2hhbmdlZCB0byB0aGUgbWluaW11bSBvZiB0aGUgb2xkIGFuZCB0aGUgbmV3Ci0gIHNpemVzLiBJZiBcdmFye3B9IGlzIFxOVUxMLCB0aGUgY2FsbCBpcyBlcXVpdmFsZW50IHRvCi0gIFxjZnVuY3Rpb257UHlNZW1fTWFsbG9jKFx2YXJ7bn0pfTsgZWxzZSBpZiBcdmFye259IGlzIGVxdWFsIHRvIHplcm8sIHRoZQotICBtZW1vcnkgYmxvY2sgaXMgcmVzaXplZCBidXQgaXMgbm90IGZyZWVkLCBhbmQgdGhlIHJldHVybmVkIHBvaW50ZXIKLSAgaXMgbm9uLVxOVUxMLiAgVW5sZXNzIFx2YXJ7cH0gaXMgXE5VTEwsIGl0IG11c3QgaGF2ZSBiZWVuCi0gIHJldHVybmVkIGJ5IGEgcHJldmlvdXMgY2FsbCB0byBcY2Z1bmN0aW9ue1B5TWVtX01hbGxvYygpfSBvcgotICBcY2Z1bmN0aW9ue1B5TWVtX1JlYWxsb2MoKX0uIElmIHRoZSByZXF1ZXN0IGZhaWxzLAotICBcY2Z1bmN0aW9ue1B5TWVtX1JlYWxsb2MoKX0gcmV0dXJucyBcTlVMTHt9IGFuZCBcdmFye3B9IHJlbWFpbnMgYQotICB2YWxpZCBwb2ludGVyIHRvIHRoZSBwcmV2aW91cyBtZW1vcnkgYXJlYS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXt2b2lkfXtQeU1lbV9GcmVlfXt2b2lkICpwfQotICBGcmVlcyB0aGUgbWVtb3J5IGJsb2NrIHBvaW50ZWQgdG8gYnkgXHZhcntwfSwgd2hpY2ggbXVzdCBoYXZlIGJlZW4KLSAgcmV0dXJuZWQgYnkgYSBwcmV2aW91cyBjYWxsIHRvIFxjZnVuY3Rpb257UHlNZW1fTWFsbG9jKCl9IG9yCi0gIFxjZnVuY3Rpb257UHlNZW1fUmVhbGxvYygpfS4gIE90aGVyd2lzZSwgb3IgaWYKLSAgXGNmdW5jdGlvbntQeU1lbV9GcmVlKHApfSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLCB1bmRlZmluZWQKLSAgYmVoYXZpb3Igb2NjdXJzLiBJZiBcdmFye3B9IGlzIFxOVUxMLCBubyBvcGVyYXRpb24gaXMgcGVyZm9ybWVkLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVRoZSBmb2xsb3dpbmcgdHlwZS1vcmllbnRlZCBtYWNyb3MgYXJlIHByb3ZpZGVkIGZvciBjb252ZW5pZW5jZS4gIE5vdGUgCi10aGF0IFx2YXJ7VFlQRX0gcmVmZXJzIHRvIGFueSBDIHR5cGUuCi0KLVxiZWdpbntjZnVuY2Rlc2N9e1x2YXJ7VFlQRX0qfXtQeU1lbV9OZXd9e1RZUEUsIHNpemVfdCBufQotICBTYW1lIGFzIFxjZnVuY3Rpb257UHlNZW1fTWFsbG9jKCl9LCBidXQgYWxsb2NhdGVzIFxjb2RleyhcdmFye259ICoKLSAgc2l6ZW9mKFx2YXJ7VFlQRX0pKX0gYnl0ZXMgb2YgbWVtb3J5LiAgUmV0dXJucyBhIHBvaW50ZXIgY2FzdCB0bwotICBcY3R5cGV7XHZhcntUWVBFfSp9LiAgVGhlIG1lbW9yeSB3aWxsIG5vdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgaW4KLSAgYW55IHdheS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtcdmFye1RZUEV9Kn17UHlNZW1fUmVzaXplfXt2b2lkICpwLCBUWVBFLCBzaXplX3Qgbn0KLSAgU2FtZSBhcyBcY2Z1bmN0aW9ue1B5TWVtX1JlYWxsb2MoKX0sIGJ1dCB0aGUgbWVtb3J5IGJsb2NrIGlzIHJlc2l6ZWQKLSAgdG8gXGNvZGV7KFx2YXJ7bn0gKiBzaXplb2YoXHZhcntUWVBFfSkpfSBieXRlcy4gIFJldHVybnMgYSBwb2ludGVyCi0gIGNhc3QgdG8gXGN0eXBle1x2YXJ7VFlQRX0qfS4gT24gcmV0dXJuLCBcdmFye3B9IHdpbGwgYmUgYSBwb2ludGVyIHRvCi0gIHRoZSBuZXcgbWVtb3J5IGFyZWEsIG9yIFxOVUxMe30gaW4gdGhlIGV2ZW50IG9mIGZhaWx1cmUuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317dm9pZH17UHlNZW1fRGVsfXt2b2lkICpwfQotICBTYW1lIGFzIFxjZnVuY3Rpb257UHlNZW1fRnJlZSgpfS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1JbiBhZGRpdGlvbiwgdGhlIGZvbGxvd2luZyBtYWNybyBzZXRzIGFyZSBwcm92aWRlZCBmb3IgY2FsbGluZyB0aGUKLVB5dGhvbiBtZW1vcnkgYWxsb2NhdG9yIGRpcmVjdGx5LCB3aXRob3V0IGludm9sdmluZyB0aGUgQyBBUEkgZnVuY3Rpb25zCi1saXN0ZWQgYWJvdmUuIEhvd2V2ZXIsIG5vdGUgdGhhdCB0aGVpciB1c2UgZG9lcyBub3QgcHJlc2VydmUgYmluYXJ5Ci1jb21wYXRpYmlsaXR5IGFjcm9zcyBQeXRob24gdmVyc2lvbnMgYW5kIGlzIHRoZXJlZm9yZSBkZXByZWNhdGVkIGluCi1leHRlbnNpb24gbW9kdWxlcy4KLQotXGNmdW5jdGlvbntQeU1lbV9NQUxMT0MoKX0sIFxjZnVuY3Rpb257UHlNZW1fUkVBTExPQygpfSwgXGNmdW5jdGlvbntQeU1lbV9GUkVFKCl9LgotCi1cY2Z1bmN0aW9ue1B5TWVtX05FVygpfSwgXGNmdW5jdGlvbntQeU1lbV9SRVNJWkUoKX0sIFxjZnVuY3Rpb257UHlNZW1fREVMKCl9LgotCi0KLVxzZWN0aW9ue0V4YW1wbGVzIFxsYWJlbHttZW1vcnlFeGFtcGxlc319Ci0KLUhlcmUgaXMgdGhlIGV4YW1wbGUgZnJvbSBzZWN0aW9uIFxyZWZ7bWVtb3J5T3ZlcnZpZXd9LCByZXdyaXR0ZW4gc28KLXRoYXQgdGhlIEkvTyBidWZmZXIgaXMgYWxsb2NhdGVkIGZyb20gdGhlIFB5dGhvbiBoZWFwIGJ5IHVzaW5nIHRoZQotZmlyc3QgZnVuY3Rpb24gc2V0OgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgUHlPYmplY3QgKnJlczsKLSAgICBjaGFyICpidWYgPSAoY2hhciAqKSBQeU1lbV9NYWxsb2MoQlVGU0laKTsgLyogZm9yIEkvTyAqLwotCi0gICAgaWYgKGJ1ZiA9PSBOVUxMKQotICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLSAgICAvKiAuLi5EbyBzb21lIEkvTyBvcGVyYXRpb24gaW52b2x2aW5nIGJ1Zi4uLiAqLwotICAgIHJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKLSAgICBQeU1lbV9GcmVlKGJ1Zik7IC8qIGFsbG9jYXRlZCB3aXRoIFB5TWVtX01hbGxvYyAqLwotICAgIHJldHVybiByZXM7Ci1cZW5ke3ZlcmJhdGltfQotCi1UaGUgc2FtZSBjb2RlIHVzaW5nIHRoZSB0eXBlLW9yaWVudGVkIGZ1bmN0aW9uIHNldDoKLQotXGJlZ2lue3ZlcmJhdGltfQotICAgIFB5T2JqZWN0ICpyZXM7Ci0gICAgY2hhciAqYnVmID0gUHlNZW1fTmV3KGNoYXIsIEJVRlNJWik7IC8qIGZvciBJL08gKi8KLQotICAgIGlmIChidWYgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0gICAgLyogLi4uRG8gc29tZSBJL08gb3BlcmF0aW9uIGludm9sdmluZyBidWYuLi4gKi8KLSAgICByZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7Ci0gICAgUHlNZW1fRGVsKGJ1Zik7IC8qIGFsbG9jYXRlZCB3aXRoIFB5TWVtX05ldyAqLwotICAgIHJldHVybiByZXM7Ci1cZW5ke3ZlcmJhdGltfQotCi1Ob3RlIHRoYXQgaW4gdGhlIHR3byBleGFtcGxlcyBhYm92ZSwgdGhlIGJ1ZmZlciBpcyBhbHdheXMKLW1hbmlwdWxhdGVkIHZpYSBmdW5jdGlvbnMgYmVsb25naW5nIHRvIHRoZSBzYW1lIHNldC4gSW5kZWVkLCBpdAotaXMgcmVxdWlyZWQgdG8gdXNlIHRoZSBzYW1lIG1lbW9yeSBBUEkgZmFtaWx5IGZvciBhIGdpdmVuCi1tZW1vcnkgYmxvY2ssIHNvIHRoYXQgdGhlIHJpc2sgb2YgbWl4aW5nIGRpZmZlcmVudCBhbGxvY2F0b3JzIGlzCi1yZWR1Y2VkIHRvIGEgbWluaW11bS4gVGhlIGZvbGxvd2luZyBjb2RlIHNlcXVlbmNlIGNvbnRhaW5zIHR3byBlcnJvcnMsCi1vbmUgb2Ygd2hpY2ggaXMgbGFiZWxlZCBhcyBcZW1waHtmYXRhbH0gYmVjYXVzZSBpdCBtaXhlcyB0d28gZGlmZmVyZW50Ci1hbGxvY2F0b3JzIG9wZXJhdGluZyBvbiBkaWZmZXJlbnQgaGVhcHMuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLWNoYXIgKmJ1ZjEgPSBQeU1lbV9OZXcoY2hhciwgQlVGU0laKTsKLWNoYXIgKmJ1ZjIgPSAoY2hhciAqKSBtYWxsb2MoQlVGU0laKTsKLWNoYXIgKmJ1ZjMgPSAoY2hhciAqKSBQeU1lbV9NYWxsb2MoQlVGU0laKTsKLS4uLgotUHlNZW1fRGVsKGJ1ZjMpOyAgLyogV3JvbmcgLS0gc2hvdWxkIGJlIFB5TWVtX0ZyZWUoKSAqLwotZnJlZShidWYyKTsgICAgICAgLyogUmlnaHQgLS0gYWxsb2NhdGVkIHZpYSBtYWxsb2MoKSAqLwotZnJlZShidWYxKTsgICAgICAgLyogRmF0YWwgLS0gc2hvdWxkIGJlIFB5TWVtX0RlbCgpICAqLwotXGVuZHt2ZXJiYXRpbX0KLQotSW4gYWRkaXRpb24gdG8gdGhlIGZ1bmN0aW9ucyBhaW1lZCBhdCBoYW5kbGluZyByYXcgbWVtb3J5IGJsb2NrcyBmcm9tCi10aGUgUHl0aG9uIGhlYXAsIG9iamVjdHMgaW4gUHl0aG9uIGFyZSBhbGxvY2F0ZWQgYW5kIHJlbGVhc2VkIHdpdGgKLVxjZnVuY3Rpb257UHlPYmplY3RfTmV3KCl9LCBcY2Z1bmN0aW9ue1B5T2JqZWN0X05ld1ZhcigpfSBhbmQKLVxjZnVuY3Rpb257UHlPYmplY3RfRGVsKCl9LgotCi1UaGVzZSB3aWxsIGJlIGV4cGxhaW5lZCBpbiB0aGUgbmV4dCBjaGFwdGVyIG9uIGRlZmluaW5nIGFuZAotaW1wbGVtZW50aW5nIG5ldyBvYmplY3QgdHlwZXMgaW4gQy4KZGlmZiAtLWdpdCBhL0RvYy9hcGkvbmV3dHlwZXMudGV4IGIvRG9jL2FwaS9uZXd0eXBlcy50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3YWQ3YTUuLjAwMDAwMDAKLS0tIGEvRG9jL2FwaS9uZXd0eXBlcy50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzgwICswLDAgQEAKLVxjaGFwdGVye09iamVjdCBJbXBsZW1lbnRhdGlvbiBTdXBwb3J0IFxsYWJlbHtuZXdUeXBlc319Ci0KLQotVGhpcyBjaGFwdGVyIGRlc2NyaWJlcyB0aGUgZnVuY3Rpb25zLCB0eXBlcywgYW5kIG1hY3JvcyB1c2VkIHdoZW4KLWRlZmluaW5nIG5ldyBvYmplY3QgdHlwZXMuCi0KLQotXHNlY3Rpb257QWxsb2NhdGluZyBPYmplY3RzIG9uIHRoZSBIZWFwCi0gICAgICAgICBcbGFiZWx7YWxsb2NhdGluZy1vYmplY3RzfX0KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtfUHlPYmplY3RfTmV3fXtQeVR5cGVPYmplY3QgKnR5cGV9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlWYXJPYmplY3QqfXtfUHlPYmplY3RfTmV3VmFyfXtQeVR5cGVPYmplY3QgKnR5cGUsIFB5X3NzaXplX3Qgc2l6ZX0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXt2b2lkfXtfUHlPYmplY3RfRGVsfXtQeU9iamVjdCAqb3B9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeU9iamVjdF9Jbml0fXtQeU9iamVjdCAqb3AsCi0JCQkJCSAgICBQeVR5cGVPYmplY3QgKnR5cGV9Ci0gIEluaXRpYWxpemUgYSBuZXdseS1hbGxvY2F0ZWQgb2JqZWN0IFx2YXJ7b3B9IHdpdGggaXRzIHR5cGUgYW5kCi0gIGluaXRpYWwgcmVmZXJlbmNlLiAgUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgb2JqZWN0LiAgSWYgXHZhcnt0eXBlfQotICBpbmRpY2F0ZXMgdGhhdCB0aGUgb2JqZWN0IHBhcnRpY2lwYXRlcyBpbiB0aGUgY3ljbGljIGdhcmJhZ2UKLSAgZGV0ZWN0b3IsIGl0IGlzIGFkZGVkIHRvIHRoZSBkZXRlY3RvcidzIHNldCBvZiBvYnNlcnZlZCBvYmplY3RzLgotICBPdGhlciBmaWVsZHMgb2YgdGhlIG9iamVjdCBhcmUgbm90IGFmZmVjdGVkLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5VmFyT2JqZWN0Kn17UHlPYmplY3RfSW5pdFZhcn17UHlWYXJPYmplY3QgKm9wLAotCQkJCQkJICBQeVR5cGVPYmplY3QgKnR5cGUsIFB5X3NzaXplX3Qgc2l6ZX0KLSAgVGhpcyBkb2VzIGV2ZXJ5dGhpbmcgXGNmdW5jdGlvbntQeU9iamVjdF9Jbml0KCl9IGRvZXMsIGFuZCBhbHNvCi0gIGluaXRpYWxpemVzIHRoZSBsZW5ndGggaW5mb3JtYXRpb24gZm9yIGEgdmFyaWFibGUtc2l6ZSBvYmplY3QuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317XHZhcntUWVBFfSp9e1B5T2JqZWN0X05ld317VFlQRSwgUHlUeXBlT2JqZWN0ICp0eXBlfQotICBBbGxvY2F0ZSBhIG5ldyBQeXRob24gb2JqZWN0IHVzaW5nIHRoZSBDIHN0cnVjdHVyZSB0eXBlIFx2YXJ7VFlQRX0KLSAgYW5kIHRoZSBQeXRob24gdHlwZSBvYmplY3QgXHZhcnt0eXBlfS4gIEZpZWxkcyBub3QgZGVmaW5lZCBieSB0aGUKLSAgUHl0aG9uIG9iamVjdCBoZWFkZXIgYXJlIG5vdCBpbml0aWFsaXplZDsgdGhlIG9iamVjdCdzIHJlZmVyZW5jZQotICBjb3VudCB3aWxsIGJlIG9uZS4gIFRoZSBzaXplIG9mIHRoZSBtZW1vcnkKLSAgYWxsb2NhdGlvbiBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIFxtZW1iZXJ7dHBfYmFzaWNzaXplfSBmaWVsZCBvZiB0aGUKLSAgdHlwZSBvYmplY3QuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317XHZhcntUWVBFfSp9e1B5T2JqZWN0X05ld1Zhcn17VFlQRSwgUHlUeXBlT2JqZWN0ICp0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzaXplfQotICBBbGxvY2F0ZSBhIG5ldyBQeXRob24gb2JqZWN0IHVzaW5nIHRoZSBDIHN0cnVjdHVyZSB0eXBlIFx2YXJ7VFlQRX0KLSAgYW5kIHRoZSBQeXRob24gdHlwZSBvYmplY3QgXHZhcnt0eXBlfS4gIEZpZWxkcyBub3QgZGVmaW5lZCBieSB0aGUKLSAgUHl0aG9uIG9iamVjdCBoZWFkZXIgYXJlIG5vdCBpbml0aWFsaXplZC4gIFRoZSBhbGxvY2F0ZWQgbWVtb3J5Ci0gIGFsbG93cyBmb3IgdGhlIFx2YXJ7VFlQRX0gc3RydWN0dXJlIHBsdXMgXHZhcntzaXplfSBmaWVsZHMgb2YgdGhlCi0gIHNpemUgZ2l2ZW4gYnkgdGhlIFxtZW1iZXJ7dHBfaXRlbXNpemV9IGZpZWxkIG9mIFx2YXJ7dHlwZX0uICBUaGlzIGlzCi0gIHVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIG9iamVjdHMgbGlrZSB0dXBsZXMsIHdoaWNoIGFyZSBhYmxlIHRvCi0gIGRldGVybWluZSB0aGVpciBzaXplIGF0IGNvbnN0cnVjdGlvbiB0aW1lLiAgRW1iZWRkaW5nIHRoZSBhcnJheSBvZgotICBmaWVsZHMgaW50byB0aGUgc2FtZSBhbGxvY2F0aW9uIGRlY3JlYXNlcyB0aGUgbnVtYmVyIG9mIGFsbG9jYXRpb25zLAotICBpbXByb3ZpbmcgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IGVmZmljaWVuY3kuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317dm9pZH17UHlPYmplY3RfRGVsfXtQeU9iamVjdCAqb3B9Ci0gIFJlbGVhc2VzIG1lbW9yeSBhbGxvY2F0ZWQgdG8gYW4gb2JqZWN0IHVzaW5nCi0gIFxjZnVuY3Rpb257UHlPYmplY3RfTmV3KCl9IG9yIFxjZnVuY3Rpb257UHlPYmplY3RfTmV3VmFyKCl9LiAgVGhpcwotICBpcyBub3JtYWxseSBjYWxsZWQgZnJvbSB0aGUgXG1lbWJlcnt0cF9kZWFsbG9jfSBoYW5kbGVyIHNwZWNpZmllZCBpbgotICB0aGUgb2JqZWN0J3MgdHlwZS4gIFRoZSBmaWVsZHMgb2YgdGhlIG9iamVjdCBzaG91bGQgbm90IGJlIGFjY2Vzc2VkCi0gIGFmdGVyIHRoaXMgY2FsbCBhcyB0aGUgbWVtb3J5IGlzIG5vIGxvbmdlciBhIHZhbGlkIFB5dGhvbiBvYmplY3QuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeV9Jbml0TW9kdWxlfXtjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1ldGhvZERlZiAqbWV0aG9kc30KLSAgQ3JlYXRlIGEgbmV3IG1vZHVsZSBvYmplY3QgYmFzZWQgb24gYSBuYW1lIGFuZCB0YWJsZSBvZiBmdW5jdGlvbnMsCi0gIHJldHVybmluZyB0aGUgbmV3IG1vZHVsZSBvYmplY3QuCi0KLSAgXHZlcnNpb25jaGFuZ2VkW09sZGVyIHZlcnNpb25zIG9mIFB5dGhvbiBkaWQgbm90IHN1cHBvcnQgXE5VTEx7fSBhcwotICAgICAgICAgICAgICAgICAgdGhlIHZhbHVlIGZvciB0aGUgXHZhcnttZXRob2RzfSBhcmd1bWVudF17Mi4zfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlfSW5pdE1vZHVsZTN9e2NoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1ldGhvZERlZiAqbWV0aG9kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmRvY30KLSAgQ3JlYXRlIGEgbmV3IG1vZHVsZSBvYmplY3QgYmFzZWQgb24gYSBuYW1lIGFuZCB0YWJsZSBvZiBmdW5jdGlvbnMsCi0gIHJldHVybmluZyB0aGUgbmV3IG1vZHVsZSBvYmplY3QuICBJZiBcdmFye2RvY30gaXMgbm9uLVxOVUxMLCBpdCB3aWxsCi0gIGJlIHVzZWQgdG8gZGVmaW5lIHRoZSBkb2NzdHJpbmcgZm9yIHRoZSBtb2R1bGUuCi0KLSAgXHZlcnNpb25jaGFuZ2VkW09sZGVyIHZlcnNpb25zIG9mIFB5dGhvbiBkaWQgbm90IHN1cHBvcnQgXE5VTEx7fSBhcwotICAgICAgICAgICAgICAgICAgdGhlIHZhbHVlIGZvciB0aGUgXHZhcnttZXRob2RzfSBhcmd1bWVudF17Mi4zfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlfSW5pdE1vZHVsZTR9e2NoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1ldGhvZERlZiAqbWV0aG9kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmRvYywgUHlPYmplY3QgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXBpdmVyfQotICBDcmVhdGUgYSBuZXcgbW9kdWxlIG9iamVjdCBiYXNlZCBvbiBhIG5hbWUgYW5kIHRhYmxlIG9mIGZ1bmN0aW9ucywKLSAgcmV0dXJuaW5nIHRoZSBuZXcgbW9kdWxlIG9iamVjdC4gIElmIFx2YXJ7ZG9jfSBpcyBub24tXE5VTEwsIGl0IHdpbGwKLSAgYmUgdXNlZCB0byBkZWZpbmUgdGhlIGRvY3N0cmluZyBmb3IgdGhlIG1vZHVsZS4gIElmIFx2YXJ7c2VsZn0gaXMKLSAgbm9uLVxOVUxMLCBpdCB3aWxsIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zIG9mIHRoZSBtb2R1bGUgYXMgdGhlaXIKLSAgKG90aGVyd2lzZSBcTlVMTCkgZmlyc3QgcGFyYW1ldGVyLiAgKFRoaXMgd2FzIGFkZGVkIGFzIGFuCi0gIGV4cGVyaW1lbnRhbCBmZWF0dXJlLCBhbmQgdGhlcmUgYXJlIG5vIGtub3duIHVzZXMgaW4gdGhlIGN1cnJlbnQKLSAgdmVyc2lvbiBvZiBQeXRob24uKSAgRm9yIFx2YXJ7YXBpdmVyfSwgdGhlIG9ubHkgdmFsdWUgd2hpY2ggc2hvdWxkCi0gIGJlIHBhc3NlZCBpcyBkZWZpbmVkIGJ5IHRoZSBjb25zdGFudCBcY29uc3RhbnR7UFlUSE9OX0FQSV9WRVJTSU9OfS4KLQotICBcbm90ZXtNb3N0IHVzZXMgb2YgdGhpcyBmdW5jdGlvbiBzaG91bGQgcHJvYmFibHkgYmUgdXNpbmcKLSAgdGhlIFxjZnVuY3Rpb257UHlfSW5pdE1vZHVsZTMoKX0gaW5zdGVhZDsgb25seSB1c2UgdGhpcyBpZiB5b3UgYXJlCi0gIHN1cmUgeW91IG5lZWQgaXQufQotCi0gIFx2ZXJzaW9uY2hhbmdlZFtPbGRlciB2ZXJzaW9ucyBvZiBQeXRob24gZGlkIG5vdCBzdXBwb3J0IFxOVUxMe30gYXMKLSAgICAgICAgICAgICAgICAgIHRoZSB2YWx1ZSBmb3IgdGhlIFx2YXJ7bWV0aG9kc30gYXJndW1lbnRdezIuM30KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y3ZhcmRlc2N9e1B5T2JqZWN0fXtfUHlfTm9uZVN0cnVjdH0KLSAgT2JqZWN0IHdoaWNoIGlzIHZpc2libGUgaW4gUHl0aG9uIGFzIFxjb2Rle05vbmV9LiAgVGhpcyBzaG91bGQgb25seQotICBiZSBhY2Nlc3NlZCB1c2luZyB0aGUgXGNvZGV7UHlfTm9uZX0gbWFjcm8sIHdoaWNoIGV2YWx1YXRlcyB0byBhCi0gIHBvaW50ZXIgdG8gdGhpcyBvYmplY3QuCi1cZW5ke2N2YXJkZXNjfQotCi0KLVxzZWN0aW9ue0NvbW1vbiBPYmplY3QgU3RydWN0dXJlcyBcbGFiZWx7Y29tbW9uLXN0cnVjdHN9fQotCi1UaGVyZSBhcmUgYSBsYXJnZSBudW1iZXIgb2Ygc3RydWN0dXJlcyB3aGljaCBhcmUgdXNlZCBpbiB0aGUKLWRlZmluaXRpb24gb2Ygb2JqZWN0IHR5cGVzIGZvciBQeXRob24uICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZXNlCi1zdHJ1Y3R1cmVzIGFuZCBob3cgdGhleSBhcmUgdXNlZC4KLQotQWxsIFB5dGhvbiBvYmplY3RzIHVsdGltYXRlbHkgc2hhcmUgYSBzbWFsbCBudW1iZXIgb2YgZmllbGRzIGF0IHRoZQotYmVnaW5uaW5nIG9mIHRoZSBvYmplY3QncyByZXByZXNlbnRhdGlvbiBpbiBtZW1vcnkuICBUaGVzZSBhcmUKLXJlcHJlc2VudGVkIGJ5IHRoZSBcY3R5cGV7UHlPYmplY3R9IGFuZCBcY3R5cGV7UHlWYXJPYmplY3R9IHR5cGVzLAotd2hpY2ggYXJlIGRlZmluZWQsIGluIHR1cm4sIGJ5IHRoZSBleHBhbnNpb25zIG9mIHNvbWUgbWFjcm9zIGFsc28KLXVzZWQsIHdoZXRoZXIgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwgaW4gdGhlIGRlZmluaXRpb24gb2YgYWxsIG90aGVyCi1QeXRob24gb2JqZWN0cy4KLQotXGJlZ2lue2N0eXBlZGVzY317UHlPYmplY3R9Ci0gIEFsbCBvYmplY3QgdHlwZXMgYXJlIGV4dGVuc2lvbnMgb2YgdGhpcyB0eXBlLiAgVGhpcyBpcyBhIHR5cGUgd2hpY2gKLSAgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIFB5dGhvbiBuZWVkcyB0byB0cmVhdCBhIHBvaW50ZXIgdG8gYW4KLSAgb2JqZWN0IGFzIGFuIG9iamVjdC4gIEluIGEgbm9ybWFsIGBgcmVsZWFzZScnIGJ1aWxkLCBpdCBjb250YWlucwotICBvbmx5IHRoZSBvYmplY3RzIHJlZmVyZW5jZSBjb3VudCBhbmQgYSBwb2ludGVyIHRvIHRoZSBjb3JyZXNwb25kaW5nCi0gIHR5cGUgb2JqZWN0LiAgSXQgY29ycmVzcG9uZHMgdG8gdGhlIGZpZWxkcyBkZWZpbmVkIGJ5IHRoZQotICBleHBhbnNpb24gb2YgdGhlIFxjb2Rle1B5T2JqZWN0X0hFQUR9IG1hY3JvLgotXGVuZHtjdHlwZWRlc2N9Ci0KLVxiZWdpbntjdHlwZWRlc2N9e1B5VmFyT2JqZWN0fQotICBUaGlzIGlzIGFuIGV4dGVuc2lvbiBvZiBcY3R5cGV7UHlPYmplY3R9IHRoYXQgYWRkcyB0aGUKLSAgXG1lbWJlcntvYl9zaXplfSBmaWVsZC4gIFRoaXMgaXMgb25seSB1c2VkIGZvciBvYmplY3RzIHRoYXQgaGF2ZQotICBzb21lIG5vdGlvbiBvZiBcZW1waHtsZW5ndGh9LiAgVGhpcyB0eXBlIGRvZXMgbm90IG9mdGVuIGFwcGVhciBpbgotICB0aGUgUHl0aG9uL0MgQVBJLiAgSXQgY29ycmVzcG9uZHMgdG8gdGhlIGZpZWxkcyBkZWZpbmVkIGJ5IHRoZQotICBleHBhbnNpb24gb2YgdGhlIFxjb2Rle1B5T2JqZWN0X1ZBUl9IRUFEfSBtYWNyby4KLVxlbmR7Y3R5cGVkZXNjfQotCi1UaGVzZSBtYWNyb3MgYXJlIHVzZWQgaW4gdGhlIGRlZmluaXRpb24gb2YgXGN0eXBle1B5T2JqZWN0fSBhbmQKLVxjdHlwZXtQeVZhck9iamVjdH06Ci0KLVxiZWdpbntjc2ltcGxlbWFjcm9kZXNjfXtQeU9iamVjdF9IRUFEfQotICBUaGlzIGlzIGEgbWFjcm8gd2hpY2ggZXhwYW5kcyB0byB0aGUgZGVjbGFyYXRpb25zIG9mIHRoZSBmaWVsZHMgb2YKLSAgdGhlIFxjdHlwZXtQeU9iamVjdH0gdHlwZTsgaXQgaXMgdXNlZCB3aGVuIGRlY2xhcmluZyBuZXcgdHlwZXMgd2hpY2gKLSAgcmVwcmVzZW50IG9iamVjdHMgd2l0aG91dCBhIHZhcnlpbmcgbGVuZ3RoLiAgVGhlIHNwZWNpZmljIGZpZWxkcyBpdAotICBleHBhbmRzIHRvIGRlcGVuZCBvbiB0aGUgZGVmaW5pdGlvbiBvZgotICBcY3NpbXBsZW1hY3Jve1B5X1RSQUNFX1JFRlN9LiAgQnkgZGVmYXVsdCwgdGhhdCBtYWNybyBpcyBub3QKLSAgZGVmaW5lZCwgYW5kIFxjc2ltcGxlbWFjcm97UHlPYmplY3RfSEVBRH0gZXhwYW5kcyB0bzoKLSAgXGJlZ2lue3ZlcmJhdGltfQotICAgIFB5X3NzaXplX3Qgb2JfcmVmY250OwotICAgIFB5VHlwZU9iamVjdCAqb2JfdHlwZTsKLSAgXGVuZHt2ZXJiYXRpbX0KLSAgV2hlbiBcY3NpbXBsZW1hY3Jve1B5X1RSQUNFX1JFRlN9IGlzIGRlZmluZWQsIGl0IGV4cGFuZHMgdG86Ci0gIFxiZWdpbnt2ZXJiYXRpbX0KLSAgICBQeU9iamVjdCAqX29iX25leHQsICpfb2JfcHJldjsKLSAgICBQeV9zc2l6ZV90IG9iX3JlZmNudDsKLSAgICBQeVR5cGVPYmplY3QgKm9iX3R5cGU7Ci0gIFxlbmR7dmVyYmF0aW19Ci1cZW5ke2NzaW1wbGVtYWNyb2Rlc2N9Ci0KLVxiZWdpbntjc2ltcGxlbWFjcm9kZXNjfXtQeU9iamVjdF9WQVJfSEVBRH0KLSAgVGhpcyBpcyBhIG1hY3JvIHdoaWNoIGV4cGFuZHMgdG8gdGhlIGRlY2xhcmF0aW9ucyBvZiB0aGUgZmllbGRzIG9mCi0gIHRoZSBcY3R5cGV7UHlWYXJPYmplY3R9IHR5cGU7IGl0IGlzIHVzZWQgd2hlbiBkZWNsYXJpbmcgbmV3IHR5cGVzIHdoaWNoCi0gIHJlcHJlc2VudCBvYmplY3RzIHdpdGggYSBsZW5ndGggdGhhdCB2YXJpZXMgZnJvbSBpbnN0YW5jZSB0bwotICBpbnN0YW5jZS4gIFRoaXMgbWFjcm8gYWx3YXlzIGV4cGFuZHMgdG86Ci0gIFxiZWdpbnt2ZXJiYXRpbX0KLSAgICBQeU9iamVjdF9IRUFECi0gICAgUHlfc3NpemVfdCBvYl9zaXplOwotICBcZW5ke3ZlcmJhdGltfQotICBOb3RlIHRoYXQgXGNzaW1wbGVtYWNyb3tQeU9iamVjdF9IRUFEfSBpcyBwYXJ0IG9mIHRoZSBleHBhbnNpb24sIGFuZAotICB0aGF0IGl0cyBvd24gZXhwYW5zaW9uIHZhcmllcyBkZXBlbmRpbmcgb24gdGhlIGRlZmluaXRpb24gb2YKLSAgXGNzaW1wbGVtYWNyb3tQeV9UUkFDRV9SRUZTfS4KLVxlbmR7Y3NpbXBsZW1hY3JvZGVzY30KLQotUHlPYmplY3RfSEVBRF9JTklUCi0KLVxiZWdpbntjdHlwZWRlc2N9e1B5Q0Z1bmN0aW9ufQotICBUeXBlIG9mIHRoZSBmdW5jdGlvbnMgdXNlZCB0byBpbXBsZW1lbnQgbW9zdCBQeXRob24gY2FsbGFibGVzIGluIEMuCi0gIEZ1bmN0aW9ucyBvZiB0aGlzIHR5cGUgdGFrZSB0d28gXGN0eXBle1B5T2JqZWN0Kn0gcGFyYW1ldGVycyBhbmQKLSAgcmV0dXJuIG9uZSBzdWNoIHZhbHVlLiAgSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBcTlVMTCwgYW4gZXhjZXB0aW9uCi0gIHNoYWxsIGhhdmUgYmVlbiBzZXQuICBJZiBub3QgXE5VTEwsIHRoZSByZXR1cm4gdmFsdWUgaXMgaW50ZXJwcmV0ZWQKLSAgYXMgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gYXMgZXhwb3NlZCBpbiBQeXRob24uICBUaGUKLSAgZnVuY3Rpb24gbXVzdCByZXR1cm4gYSBuZXcgcmVmZXJlbmNlLgotXGVuZHtjdHlwZWRlc2N9Ci0KLVxiZWdpbntjdHlwZWRlc2N9e1B5TWV0aG9kRGVmfQotICBTdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSBhIG1ldGhvZCBvZiBhbiBleHRlbnNpb24gdHlwZS4gIFRoaXMKLSAgc3RydWN0dXJlIGhhcyBmb3VyIGZpZWxkczoKLQotICBcYmVnaW57dGFibGVpaWl9e2x8bHxsfXttZW1iZXJ9e0ZpZWxkfXtDIFR5cGV9e01lYW5pbmd9Ci0gICAgXGxpbmVpaWl7bWxfbmFtZX17Y2hhciAqfXtuYW1lIG9mIHRoZSBtZXRob2R9Ci0gICAgXGxpbmVpaWl7bWxfbWV0aH17UHlDRnVuY3Rpb259e3BvaW50ZXIgdG8gdGhlIEMgaW1wbGVtZW50YXRpb259Ci0gICAgXGxpbmVpaWl7bWxfZmxhZ3N9e2ludH17ZmxhZyBiaXRzIGluZGljYXRpbmcgaG93IHRoZSBjYWxsIHNob3VsZCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdGVkfQotICAgIFxsaW5laWlpe21sX2RvY317Y2hhciAqfXtwb2ludHMgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBkb2NzdHJpbmd9Ci0gIFxlbmR7dGFibGVpaWl9Ci1cZW5ke2N0eXBlZGVzY30KLQotVGhlIFxtZW1iZXJ7bWxfbWV0aH0gaXMgYSBDIGZ1bmN0aW9uIHBvaW50ZXIuICBUaGUgZnVuY3Rpb25zIG1heSBiZSBvZgotZGlmZmVyZW50IHR5cGVzLCBidXQgdGhleSBhbHdheXMgcmV0dXJuIFxjdHlwZXtQeU9iamVjdCp9LiAgSWYgdGhlCi1mdW5jdGlvbiBpcyBub3Qgb2YgdGhlIFxjdHlwZXtQeUNGdW5jdGlvbn0sIHRoZSBjb21waWxlciB3aWxsIHJlcXVpcmUKLWEgY2FzdCBpbiB0aGUgbWV0aG9kIHRhYmxlLiAgRXZlbiB0aG91Z2ggXGN0eXBle1B5Q0Z1bmN0aW9ufSBkZWZpbmVzCi10aGUgZmlyc3QgcGFyYW1ldGVyIGFzIFxjdHlwZXtQeU9iamVjdCp9LCBpdCBpcyBjb21tb24gdGhhdCB0aGUgbWV0aG9kCi1pbXBsZW1lbnRhdGlvbiB1c2VzIGEgdGhlIHNwZWNpZmljIEMgdHlwZSBvZiB0aGUgXHZhcntzZWxmfSBvYmplY3QuCi0KLVRoZSBcbWVtYmVye21sX2ZsYWdzfSBmaWVsZCBpcyBhIGJpdGZpZWxkIHdoaWNoIGNhbiBpbmNsdWRlIHRoZQotZm9sbG93aW5nIGZsYWdzLiAgVGhlIGluZGl2aWR1YWwgZmxhZ3MgaW5kaWNhdGUgZWl0aGVyIGEgY2FsbGluZwotY29udmVudGlvbiBvciBhIGJpbmRpbmcgY29udmVudGlvbi4gIE9mIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gZmxhZ3MsCi1vbmx5IFxjb25zdGFudHtNRVRIX1ZBUkFSR1N9IGFuZCBcY29uc3RhbnR7TUVUSF9LRVlXT1JEU30gY2FuIGJlCi1jb21iaW5lZCAoYnV0IG5vdGUgdGhhdCBcY29uc3RhbnR7TUVUSF9LRVlXT1JEU30gYWxvbmUgaXMgZXF1aXZhbGVudAotdG8gXGNvZGV7XGNvbnN0YW50e01FVEhfVkFSQVJHU30gfCBcY29uc3RhbnR7TUVUSF9LRVlXT1JEU319KS4KLUFueSBvZiB0aGUgY2FsbGluZyBjb252ZW50aW9uIGZsYWdzIGNhbiBiZSBjb21iaW5lZCB3aXRoIGEKLWJpbmRpbmcgZmxhZy4KLQotXGJlZ2lue2RhdGFkZXNjfXtNRVRIX1ZBUkFSR1N9Ci0gIFRoaXMgaXMgdGhlIHR5cGljYWwgY2FsbGluZyBjb252ZW50aW9uLCB3aGVyZSB0aGUgbWV0aG9kcyBoYXZlIHRoZQotICB0eXBlIFxjdHlwZXtQeUNGdW5jdGlvbn0uIFRoZSBmdW5jdGlvbiBleHBlY3RzIHR3bwotICBcY3R5cGV7UHlPYmplY3QqfSB2YWx1ZXMuICBUaGUgZmlyc3Qgb25lIGlzIHRoZSBcdmFye3NlbGZ9IG9iamVjdCBmb3IKLSAgbWV0aG9kczsgZm9yIG1vZHVsZSBmdW5jdGlvbnMsIGl0IGhhcyB0aGUgdmFsdWUgZ2l2ZW4gdG8KLSAgXGNmdW5jdGlvbntQeV9Jbml0TW9kdWxlNCgpfSAob3IgXE5VTEx7fSBpZgotICBcY2Z1bmN0aW9ue1B5X0luaXRNb2R1bGUoKX0gd2FzIHVzZWQpLiAgVGhlIHNlY29uZCBwYXJhbWV0ZXIKLSAgKG9mdGVuIGNhbGxlZCBcdmFye2FyZ3N9KSBpcyBhIHR1cGxlIG9iamVjdCByZXByZXNlbnRpbmcgYWxsCi0gIGFyZ3VtZW50cy4gVGhpcyBwYXJhbWV0ZXIgaXMgdHlwaWNhbGx5IHByb2Nlc3NlZCB1c2luZwotICBcY2Z1bmN0aW9ue1B5QXJnX1BhcnNlVHVwbGUoKX0gb3IgXGNmdW5jdGlvbntQeUFyZ19VbnBhY2tUdXBsZX0uCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e01FVEhfS0VZV09SRFN9Ci0gIE1ldGhvZHMgd2l0aCB0aGVzZSBmbGFncyBtdXN0IGJlIG9mIHR5cGUKLSAgXGN0eXBle1B5Q0Z1bmN0aW9uV2l0aEtleXdvcmRzfS4gIFRoZSBmdW5jdGlvbiBleHBlY3RzIHRocmVlCi0gIHBhcmFtZXRlcnM6IFx2YXJ7c2VsZn0sIFx2YXJ7YXJnc30sIGFuZCBhIGRpY3Rpb25hcnkgb2YgYWxsIHRoZQotICBrZXl3b3JkIGFyZ3VtZW50cy4gIFRoZSBmbGFnIGlzIHR5cGljYWxseSBjb21iaW5lZCB3aXRoCi0gIFxjb25zdGFudHtNRVRIX1ZBUkFSR1N9LCBhbmQgdGhlIHBhcmFtZXRlcnMgYXJlIHR5cGljYWxseSBwcm9jZXNzZWQKLSAgdXNpbmcgXGNmdW5jdGlvbntQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoKX0uCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e01FVEhfTk9BUkdTfQotICBNZXRob2RzIHdpdGhvdXQgcGFyYW1ldGVycyBkb24ndCBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgYXJndW1lbnRzIGFyZQotICBnaXZlbiBpZiB0aGV5IGFyZSBsaXN0ZWQgd2l0aCB0aGUgXGNvbnN0YW50e01FVEhfTk9BUkdTfSBmbGFnLiAgVGhleQotICBuZWVkIHRvIGJlIG9mIHR5cGUgXGN0eXBle1B5Q0Z1bmN0aW9ufS4gIFdoZW4gdXNlZCB3aXRoIG9iamVjdAotICBtZXRob2RzLCB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIHR5cGljYWxseSBuYW1lZCBcY29kZXtzZWxmfSBhbmQgd2lsbAotICBob2xkIGEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgaW5zdGFuY2UuICBJbiBhbGwgY2FzZXMgdGhlIHNlY29uZAotICBwYXJhbWV0ZXIgd2lsbCBiZSBcTlVMTC4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317TUVUSF9PfQotICBNZXRob2RzIHdpdGggYSBzaW5nbGUgb2JqZWN0IGFyZ3VtZW50IGNhbiBiZSBsaXN0ZWQgd2l0aCB0aGUKLSAgXGNvbnN0YW50e01FVEhfT30gZmxhZywgaW5zdGVhZCBvZiBpbnZva2luZwotICBcY2Z1bmN0aW9ue1B5QXJnX1BhcnNlVHVwbGUoKX0gd2l0aCBhIFxjb2RleyJPIn0gYXJndW1lbnQuIFRoZXkgaGF2ZQotICB0aGUgdHlwZSBcY3R5cGV7UHlDRnVuY3Rpb259LCB3aXRoIHRoZSBcdmFye3NlbGZ9IHBhcmFtZXRlciwgYW5kIGEKLSAgXGN0eXBle1B5T2JqZWN0Kn0gcGFyYW1ldGVyIHJlcHJlc2VudGluZyB0aGUgc2luZ2xlIGFyZ3VtZW50LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtNRVRIX09MREFSR1N9Ci0gIFRoaXMgY2FsbGluZyBjb252ZW50aW9uIGlzIGRlcHJlY2F0ZWQuICBUaGUgbWV0aG9kIG11c3QgYmUgb2YgdHlwZQotICBcY3R5cGV7UHlDRnVuY3Rpb259LiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyBcTlVMTHt9IGlmIG5vIGFyZ3VtZW50cwotICBhcmUgZ2l2ZW4sIGEgc2luZ2xlIG9iamVjdCBpZiBleGFjdGx5IG9uZSBhcmd1bWVudCBpcyBnaXZlbiwgYW5kIGEKLSAgdHVwbGUgb2Ygb2JqZWN0cyBpZiBtb3JlIHRoYW4gb25lIGFyZ3VtZW50IGlzIGdpdmVuLiAgVGhlcmUgaXMgbm8KLSAgd2F5IGZvciBhIGZ1bmN0aW9uIHVzaW5nIHRoaXMgY29udmVudGlvbiB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEKLSAgY2FsbCB3aXRoIG11bHRpcGxlIGFyZ3VtZW50cyBhbmQgYSBjYWxsIHdpdGggYSB0dXBsZSBhcyB0aGUgb25seQotICBhcmd1bWVudC4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVRoZXNlIHR3byBjb25zdGFudHMgYXJlIG5vdCB1c2VkIHRvIGluZGljYXRlIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24KLWJ1dCB0aGUgYmluZGluZyB3aGVuIHVzZSB3aXRoIG1ldGhvZHMgb2YgY2xhc3Nlcy4gIFRoZXNlIG1heSBub3QgYmUKLXVzZWQgZm9yIGZ1bmN0aW9ucyBkZWZpbmVkIGZvciBtb2R1bGVzLiAgQXQgbW9zdCBvbmUgb2YgdGhlc2UgZmxhZ3MKLW1heSBiZSBzZXQgZm9yIGFueSBnaXZlbiBtZXRob2QuCi0KLVxiZWdpbntkYXRhZGVzY317TUVUSF9DTEFTU30KLSAgVGhlIG1ldGhvZCB3aWxsIGJlIHBhc3NlZCB0aGUgdHlwZSBvYmplY3QgYXMgdGhlIGZpcnN0IHBhcmFtZXRlcgotICByYXRoZXIgdGhhbiBhbiBpbnN0YW5jZSBvZiB0aGUgdHlwZS4gIFRoaXMgaXMgdXNlZCB0byBjcmVhdGUKLSAgXGVtcGh7Y2xhc3MgbWV0aG9kc30sIHNpbWlsYXIgdG8gd2hhdCBpcyBjcmVhdGVkIHdoZW4gdXNpbmcgdGhlCi0gIFxmdW5jdGlvbntjbGFzc21ldGhvZCgpfVxiaWZ1bmNpbmRleHtjbGFzc21ldGhvZH0gYnVpbHQtaW4KLSAgZnVuY3Rpb24uCi0gIFx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtNRVRIX1NUQVRJQ30KLSAgVGhlIG1ldGhvZCB3aWxsIGJlIHBhc3NlZCBcTlVMTHt9IGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgcmF0aGVyIHRoYW4KLSAgYW4gaW5zdGFuY2Ugb2YgdGhlIHR5cGUuICBUaGlzIGlzIHVzZWQgdG8gY3JlYXRlIFxlbXBoe3N0YXRpYwotICBtZXRob2RzfSwgc2ltaWxhciB0byB3aGF0IGlzIGNyZWF0ZWQgd2hlbiB1c2luZyB0aGUKLSAgXGZ1bmN0aW9ue3N0YXRpY21ldGhvZCgpfVxiaWZ1bmNpbmRleHtzdGF0aWNtZXRob2R9IGJ1aWx0LWluCi0gIGZ1bmN0aW9uLgotICBcdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7ZGF0YWRlc2N9Ci0KLU9uZSBvdGhlciBjb25zdGFudCBjb250cm9scyB3aGV0aGVyIGEgbWV0aG9kIGlzIGxvYWRlZCBpbiBwbGFjZSBvZgotYW5vdGhlciBkZWZpbml0aW9uIHdpdGggdGhlIHNhbWUgbWV0aG9kIG5hbWUuCi0KLVxiZWdpbntkYXRhZGVzY317TUVUSF9DT0VYSVNUfQotICBUaGUgbWV0aG9kIHdpbGwgYmUgbG9hZGVkIGluIHBsYWNlIG9mIGV4aXN0aW5nIGRlZmluaXRpb25zLiAgV2l0aG91dAotICBcdmFye01FVEhfQ09FWElTVH0sIHRoZSBkZWZhdWx0IGlzIHRvIHNraXAgcmVwZWF0ZWQgZGVmaW5pdGlvbnMuICBTaW5jZQotICBzbG90IHdyYXBwZXJzIGFyZSBsb2FkZWQgYmVmb3JlIHRoZSBtZXRob2QgdGFibGUsIHRoZSBleGlzdGVuY2Ugb2YgYQotICBcdmFye3NxX2NvbnRhaW5zfSBzbG90LCBmb3IgZXhhbXBsZSwgd291bGQgZ2VuZXJhdGUgYSB3cmFwcGVkIG1ldGhvZAotICBuYW1lZCBcbWV0aG9ke19fY29udGFpbnNfXygpfSBhbmQgcHJlY2x1ZGUgdGhlIGxvYWRpbmcgb2YgYQotICBjb3JyZXNwb25kaW5nIFB5Q0Z1bmN0aW9uIHdpdGggdGhlIHNhbWUgbmFtZS4gIFdpdGggdGhlIGZsYWcgZGVmaW5lZCwKLSAgdGhlIFB5Q0Z1bmN0aW9uIHdpbGwgYmUgbG9hZGVkIGluIHBsYWNlIG9mIHRoZSB3cmFwcGVyIG9iamVjdCBhbmQgd2lsbAotICBjby1leGlzdCB3aXRoIHRoZSBzbG90LiAgVGhpcyBpcyBoZWxwZnVsIGJlY2F1c2UgY2FsbHMgdG8gUHlDRnVuY3Rpb25zCi0gIGFyZSBvcHRpbWl6ZWQgbW9yZSB0aGFuIHdyYXBwZXIgb2JqZWN0IGNhbGxzLgotICBcdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlfRmluZE1ldGhvZH17UHlNZXRob2REZWYgdGFibGVbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm9iLCBjaGFyICpuYW1lfQotICBSZXR1cm4gYSBib3VuZCBtZXRob2Qgb2JqZWN0IGZvciBhbiBleHRlbnNpb24gdHlwZSBpbXBsZW1lbnRlZCBpbgotICBDLiAgVGhpcyBjYW4gYmUgdXNlZnVsIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhCi0gIFxtZW1iZXJ7dHBfZ2V0YXR0cm99IG9yIFxtZW1iZXJ7dHBfZ2V0YXR0cn0gaGFuZGxlciB0aGF0IGRvZXMgbm90Ci0gIHVzZSB0aGUgXGNmdW5jdGlvbntQeU9iamVjdF9HZW5lcmljR2V0QXR0cigpfSBmdW5jdGlvbi4KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxzZWN0aW9ue1R5cGUgT2JqZWN0cyBcbGFiZWx7dHlwZS1zdHJ1Y3RzfX0KLQotUGVyaGFwcyBvbmUgb2YgdGhlIG1vc3QgaW1wb3J0YW50IHN0cnVjdHVyZXMgb2YgdGhlIFB5dGhvbiBvYmplY3QKLXN5c3RlbSBpcyB0aGUgc3RydWN0dXJlIHRoYXQgZGVmaW5lcyBhIG5ldyB0eXBlOiB0aGUKLVxjdHlwZXtQeVR5cGVPYmplY3R9IHN0cnVjdHVyZS4gIFR5cGUgb2JqZWN0cyBjYW4gYmUgaGFuZGxlZCB1c2luZyBhbnkKLW9mIHRoZSBcY2Z1bmN0aW9ue1B5T2JqZWN0XyooKX0gb3IgXGNmdW5jdGlvbntQeVR5cGVfKigpfSBmdW5jdGlvbnMsCi1idXQgZG8gbm90IG9mZmVyIG11Y2ggdGhhdCdzIGludGVyZXN0aW5nIHRvIG1vc3QgUHl0aG9uIGFwcGxpY2F0aW9ucy4KLVRoZXNlIG9iamVjdHMgYXJlIGZ1bmRhbWVudGFsIHRvIGhvdyBvYmplY3RzIGJlaGF2ZSwgc28gdGhleSBhcmUgdmVyeQotaW1wb3J0YW50IHRvIHRoZSBpbnRlcnByZXRlciBpdHNlbGYgYW5kIHRvIGFueSBleHRlbnNpb24gbW9kdWxlIHRoYXQKLWltcGxlbWVudHMgbmV3IHR5cGVzLgotCi1UeXBlIG9iamVjdHMgYXJlIGZhaXJseSBsYXJnZSBjb21wYXJlZCB0byBtb3N0IG9mIHRoZSBzdGFuZGFyZCB0eXBlcy4KLVRoZSByZWFzb24gZm9yIHRoZSBzaXplIGlzIHRoYXQgZWFjaCB0eXBlIG9iamVjdCBzdG9yZXMgYSBsYXJnZSBudW1iZXIKLW9mIHZhbHVlcywgbW9zdGx5IEMgZnVuY3Rpb24gcG9pbnRlcnMsIGVhY2ggb2Ygd2hpY2ggaW1wbGVtZW50cyBhCi1zbWFsbCBwYXJ0IG9mIHRoZSB0eXBlJ3MgZnVuY3Rpb25hbGl0eS4gIFRoZSBmaWVsZHMgb2YgdGhlIHR5cGUgb2JqZWN0Ci1hcmUgZXhhbWluZWQgaW4gZGV0YWlsIGluIHRoaXMgc2VjdGlvbi4gIFRoZSBmaWVsZHMgd2lsbCBiZSBkZXNjcmliZWQKLWluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IG9jY3VyIGluIHRoZSBzdHJ1Y3R1cmUuCi0KLVR5cGVkZWZzOgotdW5hcnlmdW5jLCBiaW5hcnlmdW5jLCB0ZXJuYXJ5ZnVuYywgaW5xdWlyeSwgY29lcmNpb24sIGludGFyZ2Z1bmMsCi1pbnRpbnRhcmdmdW5jLCBpbnRvYmphcmdwcm9jLCBpbnRpbnRvYmphcmdwcm9jLCBvYmpvYmphcmdwcm9jLAotZGVzdHJ1Y3RvciwgZnJlZWZ1bmMsIHByaW50ZnVuYywgZ2V0YXR0cmZ1bmMsIGdldGF0dHJvZnVuYywgc2V0YXR0cmZ1bmMsCi1zZXRhdHRyb2Z1bmMsIGNtcGZ1bmMsIHJlcHJmdW5jLCBoYXNoZnVuYwotCi1UaGUgc3RydWN0dXJlIGRlZmluaXRpb24gZm9yIFxjdHlwZXtQeVR5cGVPYmplY3R9IGNhbiBiZSBmb3VuZCBpbgotXGZpbGV7SW5jbHVkZS9vYmplY3QuaH0uICBGb3IgY29udmVuaWVuY2Ugb2YgcmVmZXJlbmNlLCB0aGlzIHJlcGVhdHMKLXRoZSBkZWZpbml0aW9uIGZvdW5kIHRoZXJlOgotCi1cdmVyYmF0aW1pbnB1dHt0eXBlc3RydWN0Lmh9Ci0KLVRoZSB0eXBlIG9iamVjdCBzdHJ1Y3R1cmUgZXh0ZW5kcyB0aGUgXGN0eXBle1B5VmFyT2JqZWN0fSBzdHJ1Y3R1cmUuCi1UaGUgXG1lbWJlcntvYl9zaXplfSBmaWVsZCBpcyB1c2VkIGZvciBkeW5hbWljIHR5cGVzIChjcmVhdGVkCi1ieSAgXGZ1bmN0aW9ue3R5cGVfbmV3KCl9LCB1c3VhbGx5IGNhbGxlZCBmcm9tIGEgY2xhc3Mgc3RhdGVtZW50KS4KLU5vdGUgdGhhdCBcY2RhdGF7UHlUeXBlX1R5cGV9ICh0aGUgbWV0YXR5cGUpIGluaXRpYWxpemVzCi1cbWVtYmVye3RwX2l0ZW1zaXplfSwgd2hpY2ggbWVhbnMgdGhhdCBpdHMgaW5zdGFuY2VzIChpLmUuIHR5cGUKLW9iamVjdHMpIFxlbXBoe211c3R9IGhhdmUgdGhlIFxtZW1iZXJ7b2Jfc2l6ZX0gZmllbGQuCi0KLVxiZWdpbntjbWVtYmVyZGVzY317UHlPYmplY3R9e1B5T2JqZWN0Kn17X29iX25leHR9Ci1cY21lbWJlcmxpbmV7UHlPYmplY3R9e1B5T2JqZWN0Kn17X29iX3ByZXZ9Ci0gIFRoZXNlIGZpZWxkcyBhcmUgb25seSBwcmVzZW50IHdoZW4gdGhlIG1hY3JvIFxjb2Rle1B5X1RSQUNFX1JFRlN9IGlzCi0gIGRlZmluZWQuICBUaGVpciBpbml0aWFsaXphdGlvbiB0byBcTlVMTHt9IGlzIHRha2VuIGNhcmUgb2YgYnkgdGhlCi0gIFxjb2Rle1B5T2JqZWN0X0hFQURfSU5JVH0gbWFjcm8uICBGb3Igc3RhdGljYWxseSBhbGxvY2F0ZWQgb2JqZWN0cywKLSAgdGhlc2UgZmllbGRzIGFsd2F5cyByZW1haW4gXE5VTEwuICBGb3IgZHluYW1pY2FsbHkgYWxsb2NhdGVkCi0gIG9iamVjdHMsIHRoZXNlIHR3byBmaWVsZHMgYXJlIHVzZWQgdG8gbGluayB0aGUgb2JqZWN0IGludG8gYQotICBkb3VibHktbGlua2VkIGxpc3Qgb2YgXGVtcGh7YWxsfSBsaXZlIG9iamVjdHMgb24gdGhlIGhlYXAuICBUaGlzCi0gIGNvdWxkIGJlIHVzZWQgZm9yIHZhcmlvdXMgZGVidWdnaW5nIHB1cnBvc2VzOyBjdXJyZW50bHkgdGhlIG9ubHkgdXNlCi0gIGlzIHRvIHByaW50IHRoZSBvYmplY3RzIHRoYXQgYXJlIHN0aWxsIGFsaXZlIGF0IHRoZSBlbmQgb2YgYSBydW4KLSAgd2hlbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgXGVudnZhcntQWVRIT05EVU1QUkVGU30gaXMgc2V0LgotCi0gIFRoZXNlIGZpZWxkcyBhcmUgbm90IGluaGVyaXRlZCBieSBzdWJ0eXBlcy4KLVxlbmR7Y21lbWJlcmRlc2N9Ci0KLVxiZWdpbntjbWVtYmVyZGVzY317UHlPYmplY3R9e1B5X3NzaXplX3R9e29iX3JlZmNudH0KLSAgVGhpcyBpcyB0aGUgdHlwZSBvYmplY3QncyByZWZlcmVuY2UgY291bnQsIGluaXRpYWxpemVkIHRvIFxjb2RlezF9Ci0gIGJ5IHRoZSBcY29kZXtQeU9iamVjdF9IRUFEX0lOSVR9IG1hY3JvLiAgTm90ZSB0aGF0IGZvciBzdGF0aWNhbGx5Ci0gIGFsbG9jYXRlZCB0eXBlIG9iamVjdHMsIHRoZSB0eXBlJ3MgaW5zdGFuY2VzIChvYmplY3RzIHdob3NlCi0gIFxtZW1iZXJ7b2JfdHlwZX0gcG9pbnRzIGJhY2sgdG8gdGhlIHR5cGUpIGRvIFxlbXBoe25vdH0gY291bnQgYXMKLSAgcmVmZXJlbmNlcy4gIEJ1dCBmb3IgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHR5cGUgb2JqZWN0cywgdGhlCi0gIGluc3RhbmNlcyBcZW1waHtkb30gY291bnQgYXMgcmVmZXJlbmNlcy4KLQotICBUaGlzIGZpZWxkIGlzIG5vdCBpbmhlcml0ZWQgYnkgc3VidHlwZXMuCi1cZW5ke2NtZW1iZXJkZXNjfQotCi1cYmVnaW57Y21lbWJlcmRlc2N9e1B5T2JqZWN0fXtQeVR5cGVPYmplY3QqfXtvYl90eXBlfQotICBUaGlzIGlzIHRoZSB0eXBlJ3MgdHlwZSwgaW4gb3RoZXIgd29yZHMgaXRzIG1ldGF0eXBlLiAgSXQgaXMKLSAgaW5pdGlhbGl6ZWQgYnkgdGhlIGFyZ3VtZW50IHRvIHRoZSBcY29kZXtQeU9iamVjdF9IRUFEX0lOSVR9IG1hY3JvLAotICBhbmQgaXRzIHZhbHVlIHNob3VsZCBub3JtYWxseSBiZSBcY29kZXtcJlB5VHlwZV9UeXBlfS4gIEhvd2V2ZXIsIGZvcgotICBkeW5hbWljYWxseSBsb2FkYWJsZSBleHRlbnNpb24gbW9kdWxlcyB0aGF0IG11c3QgYmUgdXNhYmxlIG9uCi0gIFdpbmRvd3MgKGF0IGxlYXN0KSwgdGhlIGNvbXBpbGVyIGNvbXBsYWlucyB0aGF0IHRoaXMgaXMgbm90IGEgdmFsaWQKLSAgaW5pdGlhbGl6ZXIuICBUaGVyZWZvcmUsIHRoZSBjb252ZW50aW9uIGlzIHRvIHBhc3MgXE5VTEx7fSB0byB0aGUKLSAgXGNvZGV7UHlPYmplY3RfSEVBRF9JTklUfSBtYWNybyBhbmQgdG8gaW5pdGlhbGl6ZSB0aGlzIGZpZWxkCi0gIGV4cGxpY2l0bHkgYXQgdGhlIHN0YXJ0IG9mIHRoZSBtb2R1bGUncyBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiwKLSAgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIGlzIHR5cGljYWxseSBkb25lIGxpa2UgdGhpczoKLQotXGJlZ2lue3ZlcmJhdGltfQotRm9vX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLVxlbmR7dmVyYmF0aW19Ci0KLSAgVGhpcyBzaG91bGQgYmUgZG9uZSBiZWZvcmUgYW55IGluc3RhbmNlcyBvZiB0aGUgdHlwZSBhcmUgY3JlYXRlZC4KLSAgXGNmdW5jdGlvbntQeVR5cGVfUmVhZHkoKX0gY2hlY2tzIGlmIFxtZW1iZXJ7b2JfdHlwZX0gaXMgXE5VTEwsIGFuZAotICBpZiBzbywgaW5pdGlhbGl6ZXMgaXQ6IGluIFB5dGhvbiAyLjIsIGl0IGlzIHNldCB0bwotICBcY29kZXtcJlB5VHlwZV9UeXBlfTsgaW4gUHl0aG9uIDIuMi4xIGFuZCBsYXRlciBpdCBpcwotICBpbml0aWFsaXplZCB0byB0aGUgXG1lbWJlcntvYl90eXBlfSBmaWVsZCBvZiB0aGUgYmFzZSBjbGFzcy4KLSAgXGNmdW5jdGlvbntQeVR5cGVfUmVhZHkoKX0gd2lsbCBub3QgY2hhbmdlIHRoaXMgZmllbGQgaWYgaXQgaXMKLSAgbm9uLXplcm8uCi0KLSAgSW4gUHl0aG9uIDIuMiwgdGhpcyBmaWVsZCBpcyBub3QgaW5oZXJpdGVkIGJ5IHN1YnR5cGVzLiAgSW4gMi4yLjEsCi0gIGFuZCBpbiAyLjMgYW5kIGJleW9uZCwgaXQgaXMgaW5oZXJpdGVkIGJ5IHN1YnR5cGVzLgotXGVuZHtjbWVtYmVyZGVzY30KLQotXGJlZ2lue2NtZW1iZXJkZXNjfXtQeVZhck9iamVjdH17UHlfc3NpemVfdH17b2Jfc2l6ZX0KLSAgRm9yIHN0YXRpY2FsbHkgYWxsb2NhdGVkIHR5cGUgb2JqZWN0cywgdGhpcyBzaG91bGQgYmUgaW5pdGlhbGl6ZWQKLSAgdG8gemVyby4gIEZvciBkeW5hbWljYWxseSBhbGxvY2F0ZWQgdHlwZSBvYmplY3RzLCB0aGlzIGZpZWxkIGhhcyBhCi0gIHNwZWNpYWwgaW50ZXJuYWwgbWVhbmluZy4KLQotICBUaGlzIGZpZWxkIGlzIG5vdCBpbmhlcml0ZWQgYnkgc3VidHlwZXMuCi1cZW5ke2NtZW1iZXJkZXNjfQotCi1cYmVnaW57Y21lbWJlcmRlc2N9e1B5VHlwZU9iamVjdH17Y2hhcip9e3RwX25hbWV9Ci0gIFBvaW50ZXIgdG8gYSBOVUwtdGVybWluYXRlZCBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgdHlwZS4KLSAgRm9yIHR5cGVzIHRoYXQgYXJlIGFjY2Vzc2libGUgYXMgbW9kdWxlIGdsb2JhbHMsIHRoZSBzdHJpbmcgc2hvdWxkCi0gIGJlIHRoZSBmdWxsIG1vZHVsZSBuYW1lLCBmb2xsb3dlZCBieSBhIGRvdCwgZm9sbG93ZWQgYnkgdGhlIHR5cGUKLSAgbmFtZTsgZm9yIGJ1aWx0LWluIHR5cGVzLCBpdCBzaG91bGQgYmUganVzdCB0aGUgdHlwZSBuYW1lLiAgSWYgdGhlCi0gIG1vZHVsZSBpcyBhIHN1Ym1vZHVsZSBvZiBhIHBhY2thZ2UsIHRoZSBmdWxsIHBhY2thZ2UgbmFtZSBpcyBwYXJ0IG9mCi0gIHRoZSBmdWxsIG1vZHVsZSBuYW1lLiAgRm9yIGV4YW1wbGUsIGEgdHlwZSBuYW1lZCBcY2xhc3N7VH0gZGVmaW5lZAotICBpbiBtb2R1bGUgXG1vZHVsZXtNfSBpbiBzdWJwYWNrYWdlIFxtb2R1bGV7UX0gaW4gcGFja2FnZSBcbW9kdWxle1B9Ci0gIHNob3VsZCBoYXZlIHRoZSBcbWVtYmVye3RwX25hbWV9IGluaXRpYWxpemVyIFxjb2RleyJQLlEuTS5UIn0uCi0KLSAgRm9yIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCB0eXBlIG9iamVjdHMsIHRoaXMgc2hvdWxkIGp1c3QgYmUgdGhlIHR5cGUKLSAgbmFtZSwgYW5kIHRoZSBtb2R1bGUgbmFtZSBleHBsaWNpdGx5IHN0b3JlZCBpbiB0aGUgdHlwZSBkaWN0IGFzIHRoZQotICB2YWx1ZSBmb3Iga2V5IFxjb2RleydfX21vZHVsZV9fJ30uCi0KLSAgRm9yIHN0YXRpY2FsbHkgYWxsb2NhdGVkIHR5cGUgb2JqZWN0cywgdGhlIHRwX25hbWUgZmllbGQgc2hvdWxkCi0gIGNvbnRhaW4gYSBkb3QuICBFdmVyeXRoaW5nIGJlZm9yZSB0aGUgbGFzdCBkb3QgaXMgbWFkZSBhY2Nlc3NpYmxlIGFzCi0gIHRoZSBcbWVtYmVye19fbW9kdWxlX199IGF0dHJpYnV0ZSwgYW5kIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGxhc3QgZG90Ci0gIGlzIG1hZGUgYWNjZXNzaWJsZSBhcyB0aGUgXG1lbWJlcntfX25hbWVfX30gYXR0cmlidXRlLgotCi0gIElmIG5vIGRvdCBpcyBwcmVzZW50LCB0aGUgZW50aXJlIFxtZW1iZXJ7dHBfbmFtZX0gZmllbGQgaXMgbWFkZQotICBhY2Nlc3NpYmxlIGFzIHRoZSBcbWVtYmVye19fbmFtZV9ffSBhdHRyaWJ1dGUsIGFuZCB0aGUKLSAgXG1lbWJlcntfX21vZHVsZV9ffSBhdHRyaWJ1dGUgaXMgdW5kZWZpbmVkICh1bmxlc3MgZXhwbGljaXRseSBzZXQgaW4KLSAgdGhlIGRpY3Rpb25hcnksIGFzIGV4cGxhaW5lZCBhYm92ZSkuICBUaGlzIG1lYW5zIHlvdXIgdHlwZSB3aWxsIGJlCi0gIGltcG9zc2libGUgdG8gcGlja2xlLgotCi0gIFRoaXMgZmllbGQgaXMgbm90IGluaGVyaXRlZCBieSBzdWJ0eXBlcy4KLVxlbmR7Y21lbWJlcmRlc2N9Ci0KLVxiZWdpbntjbWVtYmVyZGVzY317UHlUeXBlT2JqZWN0fXtQeV9zc2l6ZV90fXt0cF9iYXNpY3NpemV9Ci1cY21lbWJlcmxpbmV7UHlUeXBlT2JqZWN0fXtQeV9zc2l6ZV90fXt0cF9pdGVtc2l6ZX0KLSAgVGhlc2UgZmllbGRzIGFsbG93IGNhbGN1bGF0aW5nIHRoZSBzaXplIGluIGJ5dGVzIG9mIGluc3RhbmNlcyBvZgotICB0aGUgdHlwZS4KLQotICBUaGVyZSBhcmUgdHdvIGtpbmRzIG9mIHR5cGVzOiB0eXBlcyB3aXRoIGZpeGVkLWxlbmd0aCBpbnN0YW5jZXMgaGF2ZQotICBhIHplcm8gXG1lbWJlcnt0cF9pdGVtc2l6ZX0gZmllbGQsIHR5cGVzIHdpdGggdmFyaWFibGUtbGVuZ3RoCi0gIGluc3RhbmNlcyBoYXZlIGEgbm9uLXplcm8gXG1lbWJlcnt0cF9pdGVtc2l6ZX0gZmllbGQuICBGb3IgYSB0eXBlCi0gIHdpdGggZml4ZWQtbGVuZ3RoIGluc3RhbmNlcywgYWxsIGluc3RhbmNlcyBoYXZlIHRoZSBzYW1lIHNpemUsCi0gIGdpdmVuIGluIFxtZW1iZXJ7dHBfYmFzaWNzaXplfS4KLQotICBGb3IgYSB0eXBlIHdpdGggdmFyaWFibGUtbGVuZ3RoIGluc3RhbmNlcywgdGhlIGluc3RhbmNlcyBtdXN0IGhhdmUKLSAgYW4gXG1lbWJlcntvYl9zaXplfSBmaWVsZCwgYW5kIHRoZSBpbnN0YW5jZSBzaXplIGlzCi0gIFxtZW1iZXJ7dHBfYmFzaWNzaXplfSBwbHVzIE4gdGltZXMgXG1lbWJlcnt0cF9pdGVtc2l6ZX0sIHdoZXJlIE4gaXMKLSAgdGhlIGBgbGVuZ3RoJycgb2YgdGhlIG9iamVjdC4gIFRoZSB2YWx1ZSBvZiBOIGlzIHR5cGljYWxseSBzdG9yZWQgaW4KLSAgdGhlIGluc3RhbmNlJ3MgXG1lbWJlcntvYl9zaXplfSBmaWVsZC4gIFRoZXJlIGFyZSBleGNlcHRpb25zOiAgZm9yCi0gIGV4YW1wbGUsIGxvbmcgaW50cyB1c2UgYSBuZWdhdGl2ZSBcbWVtYmVye29iX3NpemV9IHRvIGluZGljYXRlIGEKLSAgbmVnYXRpdmUgbnVtYmVyLCBhbmQgTiBpcyBcY29kZXthYnMoXG1lbWJlcntvYl9zaXplfSl9IHRoZXJlLiAgQWxzbywKLSAgdGhlIHByZXNlbmNlIG9mIGFuIFxtZW1iZXJ7b2Jfc2l6ZX0gZmllbGQgaW4gdGhlIGluc3RhbmNlIGxheW91dAotICBkb2Vzbid0IG1lYW4gdGhhdCB0aGUgaW5zdGFuY2Ugc3RydWN0dXJlIGlzIHZhcmlhYmxlLWxlbmd0aCAoZm9yCi0gIGV4YW1wbGUsIHRoZSBzdHJ1Y3R1cmUgZm9yIHRoZSBsaXN0IHR5cGUgaGFzIGZpeGVkLWxlbmd0aCBpbnN0YW5jZXMsCi0gIHlldCB0aG9zZSBpbnN0YW5jZXMgaGF2ZSBhIG1lYW5pbmdmdWwgXG1lbWJlcntvYl9zaXplfSBmaWVsZCkuCi0KLSAgVGhlIGJhc2ljIHNpemUgaW5jbHVkZXMgdGhlIGZpZWxkcyBpbiB0aGUgaW5zdGFuY2UgZGVjbGFyZWQgYnkgdGhlCi0gIG1hY3JvIFxjc2ltcGxlbWFjcm97UHlPYmplY3RfSEVBRH0gb3IKLSAgXGNzaW1wbGVtYWNyb3tQeU9iamVjdF9WQVJfSEVBRH0gKHdoaWNoZXZlciBpcyB1c2VkIHRvIGRlY2xhcmUgdGhlCi0gIGluc3RhbmNlIHN0cnVjdCkgYW5kIHRoaXMgaW4gdHVybiBpbmNsdWRlcyB0aGUgXG1lbWJlcntfb2JfcHJldn0gYW5kCi0gIFxtZW1iZXJ7X29iX25leHR9IGZpZWxkcyBpZiB0aGV5IGFyZSBwcmVzZW50LiAgVGhpcyBtZWFucyB0aGF0IHRoZQotICBvbmx5IGNvcnJlY3Qgd2F5IHRvIGdldCBhbiBpbml0aWFsaXplciBmb3IgdGhlIFxtZW1iZXJ7dHBfYmFzaWNzaXplfQotICBpcyB0byB1c2UgdGhlIFxrZXl3b3Jke3NpemVvZn0gb3BlcmF0b3Igb24gdGhlIHN0cnVjdCB1c2VkIHRvCi0gIGRlY2xhcmUgdGhlIGluc3RhbmNlIGxheW91dC4gIFRoZSBiYXNpYyBzaXplIGRvZXMgbm90IGluY2x1ZGUgdGhlIEdDCi0gIGhlYWRlciBzaXplICh0aGlzIGlzIG5ldyBpbiBQeXRob24gMi4yOyBpbiAyLjEgYW5kIDIuMCwgdGhlIEdDCi0gIGhlYWRlciBzaXplIHdhcyBpbmNsdWRlZCBpbiBcbWVtYmVye3RwX2Jhc2ljc2l6ZX0pLgotCi0gIFRoZXNlIGZpZWxkcyBhcmUgaW5oZXJpdGVkIHNlcGFyYXRlbHkgYnkgc3VidHlwZXMuICBJZiB0aGUgYmFzZSB0eXBlCi0gIGhhcyBhIG5vbi16ZXJvIFxtZW1iZXJ7dHBfaXRlbXNpemV9LCBpdCBpcyBnZW5lcmFsbHkgbm90IHNhZmUgdG8gc2V0Ci0gIFxtZW1iZXJ7dHBfaXRlbXNpemV9IHRvIGEgZGlmZmVyZW50IG5vbi16ZXJvIHZhbHVlIGluIGEgc3VidHlwZQotICAodGhvdWdoIHRoaXMgZGVwZW5kcyBvbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGJhc2UgdHlwZSkuCi0KLSAgQSBub3RlIGFib3V0IGFsaWdubWVudDogaWYgdGhlIHZhcmlhYmxlIGl0ZW1zIHJlcXVpcmUgYSBwYXJ0aWN1bGFyCi0gIGFsaWdubWVudCwgdGhpcyBzaG91bGQgYmUgdGFrZW4gY2FyZSBvZiBieSB0aGUgdmFsdWUgb2YKLSAgXG1lbWJlcnt0cF9iYXNpY3NpemV9LiAgRXhhbXBsZTogc3VwcG9zZSBhIHR5cGUgaW1wbGVtZW50cyBhbiBhcnJheQotICBvZiBcY29kZXtkb3VibGV9LiBcbWVtYmVye3RwX2l0ZW1zaXplfSBpcyBcY29kZXtzaXplb2YoZG91YmxlKX0uCi0gIEl0IGlzIHRoZSBwcm9ncmFtbWVyJ3MgcmVzcG9uc2liaWxpdHkgdGhhdCBcbWVtYmVye3RwX2Jhc2ljc2l6ZX0gaXMKLSAgYSBtdWx0aXBsZSBvZiBcY29kZXtzaXplb2YoZG91YmxlKX0gKGFzc3VtaW5nIHRoaXMgaXMgdGhlIGFsaWdubWVudAotICByZXF1aXJlbWVudCBmb3IgXGNvZGV7ZG91YmxlfSkuCi1cZW5ke2NtZW1iZXJkZXNjfQotCi1cYmVnaW57Y21lbWJlcmRlc2N9e1B5VHlwZU9iamVjdH17ZGVzdHJ1Y3Rvcn17dHBfZGVhbGxvY30KLSAgQSBwb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBkZXN0cnVjdG9yIGZ1bmN0aW9uLiAgVGhpcyBmdW5jdGlvbiBtdXN0Ci0gIGJlIGRlZmluZWQgdW5sZXNzIHRoZSB0eXBlIGd1YXJhbnRlZXMgdGhhdCBpdHMgaW5zdGFuY2VzIHdpbGwgbmV2ZXIKLSAgYmUgZGVhbGxvY2F0ZWQgKGFzIGlzIHRoZSBjYXNlIGZvciB0aGUgc2luZ2xldG9ucyBcY29kZXtOb25lfSBhbmQKLSAgXGNvZGV7RWxsaXBzaXN9KS4KLQotICBUaGUgZGVzdHJ1Y3RvciBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIFxjZnVuY3Rpb257UHlfREVDUkVGKCl9IGFuZAotICBcY2Z1bmN0aW9ue1B5X1hERUNSRUYoKX0gbWFjcm9zIHdoZW4gdGhlIG5ldyByZWZlcmVuY2UgY291bnQgaXMKLSAgemVyby4gIEF0IHRoaXMgcG9pbnQsIHRoZSBpbnN0YW5jZSBpcyBzdGlsbCBpbiBleGlzdGVuY2UsIGJ1dCB0aGVyZQotICBhcmUgbm8gcmVmZXJlbmNlcyB0byBpdC4gIFRoZSBkZXN0cnVjdG9yIGZ1bmN0aW9uIHNob3VsZCBmcmVlIGFsbAotICByZWZlcmVuY2VzIHdoaWNoIHRoZSBpbnN0YW5jZSBvd25zLCBmcmVlIGFsbCBtZW1vcnkgYnVmZmVycyBvd25lZCBieQotICB0aGUgaW5zdGFuY2UgKHVzaW5nIHRoZSBmcmVlaW5nIGZ1bmN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlCi0gIGFsbG9jYXRpb24gZnVuY3Rpb24gdXNlZCB0byBhbGxvY2F0ZSB0aGUgYnVmZmVyKSwgYW5kIGZpbmFsbHkgKGFzCi0gIGl0cyBsYXN0IGFjdGlvbikgY2FsbCB0aGUgdHlwZSdzIFxtZW1iZXJ7dHBfZnJlZX0gZnVuY3Rpb24uICBJZiB0aGUKLSAgdHlwZSBpcyBub3Qgc3VidHlwYWJsZSAoZG9lc24ndCBoYXZlIHRoZQotICBcY29uc3RhbnR7UHlfVFBGTEFHU19CQVNFVFlQRX0gZmxhZyBiaXQgc2V0KSwgaXQgaXMgcGVybWlzc2libGUgdG8KLSAgY2FsbCB0aGUgb2JqZWN0IGRlYWxsb2NhdG9yIGRpcmVjdGx5IGluc3RlYWQgb2YgdmlhCi0gIFxtZW1iZXJ7dHBfZnJlZX0uICBUaGUgb2JqZWN0IGRlYWxsb2NhdG9yIHNob3VsZCBiZSB0aGUgb25lIHVzZWQgdG8KLSAgYWxsb2NhdGUgdGhlIGluc3RhbmNlOyB0aGlzIGlzIG5vcm1hbGx5IFxjZnVuY3Rpb257UHlPYmplY3RfRGVsKCl9Ci0gIGlmIHRoZSBpbnN0YW5jZSB3YXMgYWxsb2NhdGVkIHVzaW5nIFxjZnVuY3Rpb257UHlPYmplY3RfTmV3KCl9IG9yCi0gIFxjZnVuY3Rpb257UHlPYmplY3RfVmFyTmV3KCl9LCBvciBcY2Z1bmN0aW9ue1B5T2JqZWN0X0dDX0RlbCgpfSBpZgotICB0aGUgaW5zdGFuY2Ugd2FzIGFsbG9jYXRlZCB1c2luZyBcY2Z1bmN0aW9ue1B5T2JqZWN0X0dDX05ldygpfSBvcgotICBcY2Z1bmN0aW9ue1B5T2JqZWN0X0dDX1Zhck5ldygpfS4KLQotICBUaGlzIGZpZWxkIGlzIGluaGVyaXRlZCBieSBzdWJ0eXBlcy4KLVxlbmR7Y21lbWJlcmRlc2N9Ci0KLVxiZWdpbntjbWVtYmVyZGVzY317UHlUeXBlT2JqZWN0fXtwcmludGZ1bmN9e3RwX3ByaW50fQotICBBbiBvcHRpb25hbCBwb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBwcmludCBmdW5jdGlvbi4KLQotICBUaGUgcHJpbnQgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgd2hlbiB0aGUgaW5zdGFuY2UgaXMgcHJpbnRlZCB0byBhCi0gIFxlbXBoe3JlYWx9IGZpbGU7IHdoZW4gaXQgaXMgcHJpbnRlZCB0byBhIHBzZXVkby1maWxlIChsaWtlIGEKLSAgXGNsYXNze1N0cmluZ0lPfSBpbnN0YW5jZSksIHRoZSBpbnN0YW5jZSdzIFxtZW1iZXJ7dHBfcmVwcn0gb3IKLSAgXG1lbWJlcnt0cF9zdHJ9IGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjb252ZXJ0IGl0IHRvIGEgc3RyaW5nLiAgVGhlc2UKLSAgYXJlIGFsc28gY2FsbGVkIHdoZW4gdGhlIHR5cGUncyBcbWVtYmVye3RwX3ByaW50fSBmaWVsZCBpcyBcTlVMTC4gIEEKLSAgdHlwZSBzaG91bGQgbmV2ZXIgaW1wbGVtZW50IFxtZW1iZXJ7dHBfcHJpbnR9IGluIGEgd2F5IHRoYXQgcHJvZHVjZXMKLSAgZGlmZmVyZW50IG91dHB1dCB0aGFuIFxtZW1iZXJ7dHBfcmVwcn0gb3IgXG1lbWJlcnt0cF9zdHJ9IHdvdWxkLgotCi0gIFRoZSBwcmludCBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgYXMKLSAgXGNmdW5jdGlvbntQeU9iamVjdF9QcmludCgpfTogXGNvZGV7aW50IHRwX3ByaW50KFB5T2JqZWN0ICpzZWxmLCBGSUxFCi0gICpmaWxlLCBpbnQgZmxhZ3MpfS4gIFRoZSBcdmFye3NlbGZ9IGFyZ3VtZW50IGlzIHRoZSBpbnN0YW5jZSB0byBiZQotICBwcmludGVkLiAgVGhlIFx2YXJ7ZmlsZX0gYXJndW1lbnQgaXMgdGhlIHN0ZGlvIGZpbGUgdG8gd2hpY2ggaXQgaXMKLSAgdG8gYmUgcHJpbnRlZC4gIFRoZSBcdmFye2ZsYWdzfSBhcmd1bWVudCBpcyBjb21wb3NlZCBvZiBmbGFnIGJpdHMuCi0gIFRoZSBvbmx5IGZsYWcgYml0IGN1cnJlbnRseSBkZWZpbmVkIGlzIFxjb25zdGFudHtQeV9QUklOVF9SQVd9LgotICBXaGVuIHRoZSBcY29uc3RhbnR7UHlfUFJJTlRfUkFXfSBmbGFnIGJpdCBpcyBzZXQsIHRoZSBpbnN0YW5jZQotICBzaG91bGQgYmUgcHJpbnRlZCB0aGUgc2FtZSB3YXkgYXMgXG1lbWJlcnt0cF9zdHJ9IHdvdWxkIGZvcm1hdCBpdDsKLSAgd2hlbiB0aGUgXGNvbnN0YW50e1B5X1BSSU5UX1JBV30gZmxhZyBiaXQgaXMgY2xlYXIsIHRoZSBpbnN0YW5jZQotICBzaG91bGQgYmUgcHJpbnRlZCB0aGUgc2FtZSB3YXMgYXMgXG1lbWJlcnt0cF9yZXByfSB3b3VsZCBmb3JtYXQgaXQuCi0gIEl0IHNob3VsZCByZXR1cm4gXGNvZGV7LTF9IGFuZCBzZXQgYW4gZXhjZXB0aW9uIGNvbmRpdGlvbiB3aGVuIGFuCi0gIGVycm9yIG9jY3VycmVkIGR1cmluZyB0aGUgY29tcGFyaXNvbi4KLQotICBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBcbWVtYmVye3RwX3ByaW50fSBmaWVsZCB3aWxsIGJlIGRlcHJlY2F0ZWQuCi0gIEluIGFueSBjYXNlLCBpdCBpcyByZWNvbW1lbmRlZCBub3QgdG8gZGVmaW5lIFxtZW1iZXJ7dHBfcHJpbnR9LCBidXQKLSAgaW5zdGVhZCB0byByZWx5IG9uIFxtZW1iZXJ7dHBfcmVwcn0gYW5kIFxtZW1iZXJ7dHBfc3RyfSBmb3IKLSAgcHJpbnRpbmcuCi0KLSAgVGhpcyBmaWVsZCBpcyBpbmhlcml0ZWQgYnkgc3VidHlwZXMuCi1cZW5ke2NtZW1iZXJkZXNjfQotCi1cYmVnaW57Y21lbWJlcmRlc2N9e1B5VHlwZU9iamVjdH17Z2V0YXR0cmZ1bmN9e3RwX2dldGF0dHJ9Ci0gIEFuIG9wdGlvbmFsIHBvaW50ZXIgdG8gdGhlIGdldC1hdHRyaWJ1dGUtc3RyaW5nIGZ1bmN0aW9uLgotCi0gIFRoaXMgZmllbGQgaXMgZGVwcmVjYXRlZC4gIFdoZW4gaXQgaXMgZGVmaW5lZCwgaXQgc2hvdWxkIHBvaW50IHRvIGEKLSAgZnVuY3Rpb24gdGhhdCBhY3RzIHRoZSBzYW1lIGFzIHRoZSBcbWVtYmVye3RwX2dldGF0dHJvfSBmdW5jdGlvbiwKLSAgYnV0IHRha2luZyBhIEMgc3RyaW5nIGluc3RlYWQgb2YgYSBQeXRob24gc3RyaW5nIG9iamVjdCB0byBnaXZlIHRoZQotICBhdHRyaWJ1dGUgbmFtZS4gIFRoZSBzaWduYXR1cmUgaXMgdGhlIHNhbWUgYXMgZm9yCi0gIFxjZnVuY3Rpb257UHlPYmplY3RfR2V0QXR0clN0cmluZygpfS4KLQotICBUaGlzIGZpZWxkIGlzIGluaGVyaXRlZCBieSBzdWJ0eXBlcyB0b2dldGhlciB3aXRoCi0gIFxtZW1iZXJ7dHBfZ2V0YXR0cm99OiBhIHN1YnR5cGUgaW5oZXJpdHMgYm90aCBcbWVtYmVye3RwX2dldGF0dHJ9Ci0gIGFuZCBcbWVtYmVye3RwX2dldGF0dHJvfSBmcm9tIGl0cyBiYXNlIHR5cGUgd2hlbiB0aGUgc3VidHlwZSdzCi0gIFxtZW1iZXJ7dHBfZ2V0YXR0cn0gYW5kIFxtZW1iZXJ7dHBfZ2V0YXR0cm99IGFyZSBib3RoIFxOVUxMLgotXGVuZHtjbWVtYmVyZGVzY30KLQotXGJlZ2lue2NtZW1iZXJkZXNjfXtQeVR5cGVPYmplY3R9e3NldGF0dHJmdW5jfXt0cF9zZXRhdHRyfQotICBBbiBvcHRpb25hbCBwb2ludGVyIHRvIHRoZSBzZXQtYXR0cmlidXRlLXN0cmluZyBmdW5jdGlvbi4KLQotICBUaGlzIGZpZWxkIGlzIGRlcHJlY2F0ZWQuICBXaGVuIGl0IGlzIGRlZmluZWQsIGl0IHNob3VsZCBwb2ludCB0byBhCi0gIGZ1bmN0aW9uIHRoYXQgYWN0cyB0aGUgc2FtZSBhcyB0aGUgXG1lbWJlcnt0cF9zZXRhdHRyb30gZnVuY3Rpb24sCi0gIGJ1dCB0YWtpbmcgYSBDIHN0cmluZyBpbnN0ZWFkIG9mIGEgUHl0aG9uIHN0cmluZyBvYmplY3QgdG8gZ2l2ZSB0aGUKLSAgYXR0cmlidXRlIG5hbWUuICBUaGUgc2lnbmF0dXJlIGlzIHRoZSBzYW1lIGFzIGZvcgotICBcY2Z1bmN0aW9ue1B5T2JqZWN0X1NldEF0dHJTdHJpbmcoKX0uCi0KLSAgVGhpcyBmaWVsZCBpcyBpbmhlcml0ZWQgYnkgc3VidHlwZXMgdG9nZXRoZXIgd2l0aAotICBcbWVtYmVye3RwX3NldGF0dHJvfTogYSBzdWJ0eXBlIGluaGVyaXRzIGJvdGggXG1lbWJlcnt0cF9zZXRhdHRyfQotICBhbmQgXG1lbWJlcnt0cF9zZXRhdHRyb30gZnJvbSBpdHMgYmFzZSB0eXBlIHdoZW4gdGhlIHN1YnR5cGUncwotICBcbWVtYmVye3RwX3NldGF0dHJ9IGFuZCBcbWVtYmVye3RwX3NldGF0dHJvfSBhcmUgYm90aCBcTlVMTC4KLVxlbmR7Y21lbWJlcmRlc2N9Ci0KLVxiZWdpbntjbWVtYmVyZGVzY317UHlUeXBlT2JqZWN0fXtjbXBmdW5jfXt0cF9jb21wYXJlfQotICBBbiBvcHRpb25hbCBwb2ludGVyIHRvIHRoZSB0aHJlZS13YXkgY29tcGFyaXNvbiBmdW5jdGlvbi4KLQotICBUaGUgc2lnbmF0dXJlIGlzIHRoZSBzYW1lIGFzIGZvciBcY2Z1bmN0aW9ue1B5T2JqZWN0X0NvbXBhcmUoKX0uCi0gIFRoZSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIFxjb2RlezF9IGlmIFx2YXJ7c2VsZn0gZ3JlYXRlciB0aGFuCi0gIFx2YXJ7b3RoZXJ9LCBcY29kZXswfSBpZiBcdmFye3NlbGZ9IGlzIGVxdWFsIHRvIFx2YXJ7b3RoZXJ9LCBhbmQKLSAgXGNvZGV7LTF9IGlmIFx2YXJ7c2VsZn0gbGVzcyB0aGFuIFx2YXJ7b3RoZXJ9LiAgSXQgc2hvdWxkIHJldHVybgotICBcY29kZXstMX0gYW5kIHNldCBhbiBleGNlcHRpb24gY29uZGl0aW9uIHdoZW4gYW4gZXJyb3Igb2NjdXJyZWQKLSAgZHVyaW5nIHRoZSBjb21wYXJpc29uLgotCi0gIFRoaXMgZmllbGQgaXMgaW5oZXJpdGVkIGJ5IHN1YnR5cGVzIHRvZ2V0aGVyIHdpdGgKLSAgXG1lbWJlcnt0cF9yaWNoY29tcGFyZX0gYW5kIFxtZW1iZXJ7dHBfaGFzaH06IGEgc3VidHlwZXMgaW5oZXJpdHMKLSAgYWxsIHRocmVlIG9mIFxtZW1iZXJ7dHBfY29tcGFyZX0sIFxtZW1iZXJ7dHBfcmljaGNvbXBhcmV9LCBhbmQKLSAgXG1lbWJlcnt0cF9oYXNofSB3aGVuIHRoZSBzdWJ0eXBlJ3MgXG1lbWJlcnt0cF9jb21wYXJlfSwKLSAgXG1lbWJlcnt0cF9yaWNoY29tcGFyZX0sIGFuZCBcbWVtYmVye3RwX2hhc2h9IGFyZSBhbGwgXE5VTEwuCi1cZW5ke2NtZW1iZXJkZXNjfQotCi1cYmVnaW57Y21lbWJlcmRlc2N9e1B5VHlwZU9iamVjdH17cmVwcmZ1bmN9e3RwX3JlcHJ9Ci0gIEFuIG9wdGlvbmFsIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IGltcGxlbWVudHMgdGhlIGJ1aWx0LWluCi0gIGZ1bmN0aW9uIFxmdW5jdGlvbntyZXByKCl9LlxiaWZ1bmNpbmRleHtyZXByfQotCi0gIFRoZSBzaWduYXR1cmUgaXMgdGhlIHNhbWUgYXMgZm9yIFxjZnVuY3Rpb257UHlPYmplY3RfUmVwcigpfTsgaXQKLSAgbXVzdCByZXR1cm4gYSBzdHJpbmcgb3IgYSBVbmljb2RlIG9iamVjdC4gIElkZWFsbHksIHRoaXMgZnVuY3Rpb24KLSAgc2hvdWxkIHJldHVybiBhIHN0cmluZyB0aGF0LCB3aGVuIHBhc3NlZCB0byBcZnVuY3Rpb257ZXZhbCgpfSwgZ2l2ZW4KLSAgYSBzdWl0YWJsZSBlbnZpcm9ubWVudCwgcmV0dXJucyBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSB2YWx1ZS4gIElmCi0gIHRoaXMgaXMgbm90IGZlYXNpYmxlLCBpdCBzaG91bGQgcmV0dXJuIGEgc3RyaW5nIHN0YXJ0aW5nIHdpdGgKLSAgXGNoYXJhY3RlcntcdGV4dGxlc3N9IGFuZCBlbmRpbmcgd2l0aCBcY2hhcmFjdGVye1x0ZXh0Z3JlYXRlcn0gZnJvbQotICB3aGljaCBib3RoIHRoZSB0eXBlIGFuZCB0aGUgdmFsdWUgb2YgdGhlIG9iamVjdCBjYW4gYmUgZGVkdWNlZC4KLQotICBXaGVuIHRoaXMgZmllbGQgaXMgbm90IHNldCwgYSBzdHJpbmcgb2YgdGhlIGZvcm0gXHNhbXB7PFwlcyBvYmplY3QKLSAgYXQgXCVwPn0gaXMgcmV0dXJuZWQsIHdoZXJlIFxjb2Rle1wlc30gaXMgcmVwbGFjZWQgYnkgdGhlIHR5cGUgbmFtZSwKLSAgYW5kIFxjb2Rle1wlcH0gYnkgdGhlIG9iamVjdCdzIG1lbW9yeSBhZGRyZXNzLgotCi0gIFRoaXMgZmllbGQgaXMgaW5oZXJpdGVkIGJ5IHN1YnR5cGVzLgotXGVuZHtjbWVtYmVyZGVzY30KLQotUHlOdW1iZXJNZXRob2RzICp0cF9hc19udW1iZXI7Ci0KLSAgICBYWFgKLQotUHlTZXF1ZW5jZU1ldGhvZHMgKnRwX2FzX3NlcXVlbmNlOwotCi0gICAgWFhYCi0KLVB5TWFwcGluZ01ldGhvZHMgKnRwX2FzX21hcHBpbmc7Ci0KLSAgICBYWFgKLQotXGJlZ2lue2NtZW1iZXJkZXNjfXtQeVR5cGVPYmplY3R9e2hhc2hmdW5jfXt0cF9oYXNofQotICBBbiBvcHRpb25hbCBwb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCBpbXBsZW1lbnRzIHRoZSBidWlsdC1pbgotICBmdW5jdGlvbiBcZnVuY3Rpb257aGFzaCgpfS5cYmlmdW5jaW5kZXh7aGFzaH0KLQotICBUaGUgc2lnbmF0dXJlIGlzIHRoZSBzYW1lIGFzIGZvciBcY2Z1bmN0aW9ue1B5T2JqZWN0X0hhc2goKX07IGl0Ci0gIG11c3QgcmV0dXJuIGEgQyBsb25nLiAgVGhlIHZhbHVlIFxjb2Rley0xfSBzaG91bGQgbm90IGJlIHJldHVybmVkIGFzCi0gIGEgbm9ybWFsIHJldHVybiB2YWx1ZTsgd2hlbiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBjb21wdXRhdGlvbgotICBvZiB0aGUgaGFzaCB2YWx1ZSwgdGhlIGZ1bmN0aW9uIHNob3VsZCBzZXQgYW4gZXhjZXB0aW9uIGFuZCByZXR1cm4KLSAgXGNvZGV7LTF9LgotCi0gIFdoZW4gdGhpcyBmaWVsZCBpcyBub3Qgc2V0LCB0d28gcG9zc2liaWxpdGllcyBleGlzdDogaWYgdGhlCi0gIFxtZW1iZXJ7dHBfY29tcGFyZX0gYW5kIFxtZW1iZXJ7dHBfcmljaGNvbXBhcmV9IGZpZWxkcyBhcmUgYm90aAotICBcTlVMTCwgYSBkZWZhdWx0IGhhc2ggdmFsdWUgYmFzZWQgb24gdGhlIG9iamVjdCdzIGFkZHJlc3MgaXMKLSAgcmV0dXJuZWQ7IG90aGVyd2lzZSwgYSBcZXhjZXB0aW9ue1R5cGVFcnJvcn0gaXMgcmFpc2VkLgotCi0gIFRoaXMgZmllbGQgaXMgaW5oZXJpdGVkIGJ5IHN1YnR5cGVzIHRvZ2V0aGVyIHdpdGgKLSAgXG1lbWJlcnt0cF9yaWNoY29tcGFyZX0gYW5kIFxtZW1iZXJ7dHBfY29tcGFyZX06IGEgc3VidHlwZXMgaW5oZXJpdHMKLSAgYWxsIHRocmVlIG9mIFxtZW1iZXJ7dHBfY29tcGFyZX0sIFxtZW1iZXJ7dHBfcmljaGNvbXBhcmV9LCBhbmQKLSAgXG1lbWJlcnt0cF9oYXNofSwgd2hlbiB0aGUgc3VidHlwZSdzIFxtZW1iZXJ7dHBfY29tcGFyZX0sCi0gIFxtZW1iZXJ7dHBfcmljaGNvbXBhcmV9IGFuZCBcbWVtYmVye3RwX2hhc2h9IGFyZSBhbGwgXE5VTEwuCi1cZW5ke2NtZW1iZXJkZXNjfQotCi1cYmVnaW57Y21lbWJlcmRlc2N9e1B5VHlwZU9iamVjdH17dGVybmFyeWZ1bmN9e3RwX2NhbGx9Ci0gIEFuIG9wdGlvbmFsIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IGltcGxlbWVudHMgY2FsbGluZyB0aGUKLSAgb2JqZWN0LiAgVGhpcyBzaG91bGQgYmUgXE5VTEx7fSBpZiB0aGUgb2JqZWN0IGlzIG5vdCBjYWxsYWJsZS4gIFRoZQotICBzaWduYXR1cmUgaXMgdGhlIHNhbWUgYXMgZm9yIFxjZnVuY3Rpb257UHlPYmplY3RfQ2FsbCgpfS4KLQotICBUaGlzIGZpZWxkIGlzIGluaGVyaXRlZCBieSBzdWJ0eXBlcy4KLVxlbmR7Y21lbWJlcmRlc2N9Ci0KLVxiZWdpbntjbWVtYmVyZGVzY317UHlUeXBlT2JqZWN0fXtyZXByZnVuY317dHBfc3RyfQotICBBbiBvcHRpb25hbCBwb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCBpbXBsZW1lbnRzIHRoZSBidWlsdC1pbgotICBvcGVyYXRpb24gXGZ1bmN0aW9ue3N0cigpfS4gIChOb3RlIHRoYXQgXGNsYXNze3N0cn0gaXMgYSB0eXBlIG5vdywKLSAgYW5kIFxmdW5jdGlvbntzdHIoKX0gY2FsbHMgdGhlIGNvbnN0cnVjdG9yIGZvciB0aGF0IHR5cGUuICBUaGlzCi0gIGNvbnN0cnVjdG9yIGNhbGxzIFxjZnVuY3Rpb257UHlPYmplY3RfU3RyKCl9IHRvIGRvIHRoZSBhY3R1YWwgd29yaywKLSAgYW5kIFxjZnVuY3Rpb257UHlPYmplY3RfU3RyKCl9IHdpbGwgY2FsbCB0aGlzIGhhbmRsZXIuKQotCi0gIFRoZSBzaWduYXR1cmUgaXMgdGhlIHNhbWUgYXMgZm9yIFxjZnVuY3Rpb257UHlPYmplY3RfU3RyKCl9OyBpdCBtdXN0Ci0gIHJldHVybiBhIHN0cmluZyBvciBhIFVuaWNvZGUgb2JqZWN0LiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGEKLSAgYGBmcmllbmRseScnIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0LCBhcyB0aGlzIGlzIHRoZQotICByZXByZXNlbnRhdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCBieSB0aGUgcHJpbnQgc3RhdGVtZW50LgotCi0gIFdoZW4gdGhpcyBmaWVsZCBpcyBub3Qgc2V0LCBcY2Z1bmN0aW9ue1B5T2JqZWN0X1JlcHIoKX0gaXMgY2FsbGVkIHRvCi0gIHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLQotICBUaGlzIGZpZWxkIGlzIGluaGVyaXRlZCBieSBzdWJ0eXBlcy4KLVxlbmR7Y21lbWJlcmRlc2N9Ci0KLVxiZWdpbntjbWVtYmVyZGVzY317UHlUeXBlT2JqZWN0fXtnZXRhdHRyb2Z1bmN9e3RwX2dldGF0dHJvfQotICBBbiBvcHRpb25hbCBwb2ludGVyIHRvIHRoZSBnZXQtYXR0cmlidXRlIGZ1bmN0aW9uLgotCi0gIFRoZSBzaWduYXR1cmUgaXMgdGhlIHNhbWUgYXMgZm9yIFxjZnVuY3Rpb257UHlPYmplY3RfR2V0QXR0cigpfS4gIEl0Ci0gIGlzIHVzdWFsbHkgY29udmVuaWVudCB0byBzZXQgdGhpcyBmaWVsZCB0bwotICBcY2Z1bmN0aW9ue1B5T2JqZWN0X0dlbmVyaWNHZXRBdHRyKCl9LCB3aGljaCBpbXBsZW1lbnRzIHRoZSBub3JtYWwKLSAgd2F5IG9mIGxvb2tpbmcgZm9yIG9iamVjdCBhdHRyaWJ1dGVzLgotCi0gIFRoaXMgZmllbGQgaXMgaW5oZXJpdGVkIGJ5IHN1YnR5cGVzIHRvZ2V0aGVyIHdpdGgKLSAgXG1lbWJlcnt0cF9nZXRhdHRyfTogYSBzdWJ0eXBlIGluaGVyaXRzIGJvdGggXG1lbWJlcnt0cF9nZXRhdHRyfSBhbmQKLSAgXG1lbWJlcnt0cF9nZXRhdHRyb30gZnJvbSBpdHMgYmFzZSB0eXBlIHdoZW4gdGhlIHN1YnR5cGUncwotICBcbWVtYmVye3RwX2dldGF0dHJ9IGFuZCBcbWVtYmVye3RwX2dldGF0dHJvfSBhcmUgYm90aCBcTlVMTC4KLVxlbmR7Y21lbWJlcmRlc2N9Ci0KLVxiZWdpbntjbWVtYmVyZGVzY317UHlUeXBlT2JqZWN0fXtzZXRhdHRyb2Z1bmN9e3RwX3NldGF0dHJvfQotICBBbiBvcHRpb25hbCBwb2ludGVyIHRvIHRoZSBzZXQtYXR0cmlidXRlIGZ1bmN0aW9uLgotCi0gIFRoZSBzaWduYXR1cmUgaXMgdGhlIHNhbWUgYXMgZm9yIFxjZnVuY3Rpb257UHlPYmplY3RfU2V0QXR0cigpfS4gIEl0Ci0gIGlzIHVzdWFsbHkgY29udmVuaWVudCB0byBzZXQgdGhpcyBmaWVsZCB0bwotICBcY2Z1bmN0aW9ue1B5T2JqZWN0X0dlbmVyaWNTZXRBdHRyKCl9LCB3aGljaCBpbXBsZW1lbnRzIHRoZSBub3JtYWwKLSAgd2F5IG9mIHNldHRpbmcgb2JqZWN0IGF0dHJpYnV0ZXMuCi0KLSAgVGhpcyBmaWVsZCBpcyBpbmhlcml0ZWQgYnkgc3VidHlwZXMgdG9nZXRoZXIgd2l0aAotICBcbWVtYmVye3RwX3NldGF0dHJ9OiBhIHN1YnR5cGUgaW5oZXJpdHMgYm90aCBcbWVtYmVye3RwX3NldGF0dHJ9IGFuZAotICBcbWVtYmVye3RwX3NldGF0dHJvfSBmcm9tIGl0cyBiYXNlIHR5cGUgd2hlbiB0aGUgc3VidHlwZSdzCi0gIFxtZW1iZXJ7dHBfc2V0YXR0cn0gYW5kIFxtZW1iZXJ7dHBfc2V0YXR0cm99IGFyZSBib3RoIFxOVUxMLgotXGVuZHtjbWVtYmVyZGVzY30KLQotXGJlZ2lue2NtZW1iZXJkZXNjfXtQeVR5cGVPYmplY3R9e1B5QnVmZmVyUHJvY3MqfXt0cF9hc19idWZmZXJ9Ci0gIFBvaW50ZXIgdG8gYW4gYWRkaXRpb25hbCBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBmaWVsZHMgcmVsZXZhbnQgb25seSB0bwotICBvYmplY3RzIHdoaWNoIGltcGxlbWVudCB0aGUgYnVmZmVyIGludGVyZmFjZS4gIFRoZXNlIGZpZWxkcyBhcmUKLSAgZG9jdW1lbnRlZCBpbiBgYEJ1ZmZlciBPYmplY3QgU3RydWN0dXJlcycnIChzZWN0aW9uCi0gIFxyZWZ7YnVmZmVyLXN0cnVjdHN9KS4KLQotICBUaGUgXG1lbWJlcnt0cF9hc19idWZmZXJ9IGZpZWxkIGlzIG5vdCBpbmhlcml0ZWQsIGJ1dCB0aGUgY29udGFpbmVkCi0gIGZpZWxkcyBhcmUgaW5oZXJpdGVkIGluZGl2aWR1YWxseS4KLVxlbmR7Y21lbWJlcmRlc2N9Ci0KLVxiZWdpbntjbWVtYmVyZGVzY317UHlUeXBlT2JqZWN0fXtsb25nfXt0cF9mbGFnc30KLSAgVGhpcyBmaWVsZCBpcyBhIGJpdCBtYXNrIG9mIHZhcmlvdXMgZmxhZ3MuICBTb21lIGZsYWdzIGluZGljYXRlCi0gIHZhcmlhbnQgc2VtYW50aWNzIGZvciBjZXJ0YWluIHNpdHVhdGlvbnM7IG90aGVycyBhcmUgdXNlZCB0bwotICBpbmRpY2F0ZSB0aGF0IGNlcnRhaW4gZmllbGRzIGluIHRoZSB0eXBlIG9iamVjdCAob3IgaW4gdGhlIGV4dGVuc2lvbgotICBzdHJ1Y3R1cmVzIHJlZmVyZW5jZWQgdmlhIFxtZW1iZXJ7dHBfYXNfbnVtYmVyfSwKLSAgXG1lbWJlcnt0cF9hc19zZXF1ZW5jZX0sIFxtZW1iZXJ7dHBfYXNfbWFwcGluZ30sIGFuZAotICBcbWVtYmVye3RwX2FzX2J1ZmZlcn0pIHRoYXQgd2VyZSBoaXN0b3JpY2FsbHkgbm90IGFsd2F5cyBwcmVzZW50IGFyZQotICB2YWxpZDsgaWYgc3VjaCBhIGZsYWcgYml0IGlzIGNsZWFyLCB0aGUgdHlwZSBmaWVsZHMgaXQgZ3VhcmRzIG11c3QKLSAgbm90IGJlIGFjY2Vzc2VkIGFuZCBtdXN0IGJlIGNvbnNpZGVyZWQgdG8gaGF2ZSBhIHplcm8gb3IgXE5VTEx7fQotICB2YWx1ZSBpbnN0ZWFkLgotCi0gIEluaGVyaXRhbmNlIG9mIHRoaXMgZmllbGQgaXMgY29tcGxpY2F0ZWQuICBNb3N0IGZsYWcgYml0cyBhcmUKLSAgaW5oZXJpdGVkIGluZGl2aWR1YWxseSwgaS5lLiBpZiB0aGUgYmFzZSB0eXBlIGhhcyBhIGZsYWcgYml0IHNldCwKLSAgdGhlIHN1YnR5cGUgaW5oZXJpdHMgdGhpcyBmbGFnIGJpdC4gIFRoZSBmbGFnIGJpdHMgdGhhdCBwZXJ0YWluIHRvCi0gIGV4dGVuc2lvbiBzdHJ1Y3R1cmVzIGFyZSBzdHJpY3RseSBpbmhlcml0ZWQgaWYgdGhlIGV4dGVuc2lvbgotICBzdHJ1Y3R1cmUgaXMgaW5oZXJpdGVkLCBpLmUuIHRoZSBiYXNlIHR5cGUncyB2YWx1ZSBvZiB0aGUgZmxhZyBiaXQKLSAgaXMgY29waWVkIGludG8gdGhlIHN1YnR5cGUgdG9nZXRoZXIgd2l0aCBhIHBvaW50ZXIgdG8gdGhlIGV4dGVuc2lvbgotICBzdHJ1Y3R1cmUuICBUaGUgXGNvbnN0YW50e1B5X1RQRkxBR1NfSEFWRV9HQ30gZmxhZyBiaXQgaXMgaW5oZXJpdGVkCi0gIHRvZ2V0aGVyIHdpdGggdGhlIFxtZW1iZXJ7dHBfdHJhdmVyc2V9IGFuZCBcbWVtYmVye3RwX2NsZWFyfSBmaWVsZHMsCi0gIGkuZS4gaWYgdGhlIFxjb25zdGFudHtQeV9UUEZMQUdTX0hBVkVfR0N9IGZsYWcgYml0IGlzIGNsZWFyIGluIHRoZQotICBzdWJ0eXBlIGFuZCB0aGUgXG1lbWJlcnt0cF90cmF2ZXJzZX0gYW5kIFxtZW1iZXJ7dHBfY2xlYXJ9IGZpZWxkcyBpbgotICB0aGUgc3VidHlwZSBleGlzdCAoYXMgaW5kaWNhdGVkIGJ5IHRoZQotICBcY29uc3RhbnR7UHlfVFBGTEFHU19IQVZFX1JJQ0hDT01QQVJFfSBmbGFnIGJpdCkgYW5kIGhhdmUgXE5VTEx7fQotICB2YWx1ZXMuCi0KLSAgVGhlIGZvbGxvd2luZyBiaXQgbWFza3MgYXJlIGN1cnJlbnRseSBkZWZpbmVkOyB0aGVzZSBjYW4gYmUgb3ItZWQKLSAgdG9nZXRoZXIgdXNpbmcgdGhlIFxjb2Rle3x9IG9wZXJhdG9yIHRvIGZvcm0gdGhlIHZhbHVlIG9mIHRoZQotICBcbWVtYmVye3RwX2ZsYWdzfSBmaWVsZC4gIFRoZSBtYWNybyBcY2Z1bmN0aW9ue1B5VHlwZV9IYXNGZWF0dXJlKCl9Ci0gIHRha2VzIGEgdHlwZSBhbmQgYSBmbGFncyB2YWx1ZSwgXHZhcnt0cH0gYW5kIFx2YXJ7Zn0sIGFuZCBjaGVja3MKLSAgd2hldGhlciBcY29kZXtcdmFye3RwfS0+dHBfZmxhZ3MgXCYgXHZhcntmfX0gaXMgbm9uLXplcm8uCi0KLSAgXGJlZ2lue2RhdGFkZXNjfXtQeV9UUEZMQUdTX0hBVkVfR0VUQ0hBUkJVRkZFUn0KLSAgICBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZSBcY3R5cGV7UHlCdWZmZXJQcm9jc30gc3RydWN0IHJlZmVyZW5jZWQgYnkKLSAgICBcbWVtYmVye3RwX2FzX2J1ZmZlcn0gaGFzIHRoZSBcbWVtYmVye2JmX2dldGNoYXJidWZmZXJ9IGZpZWxkLgotICBcZW5ke2RhdGFkZXNjfQotCi0gIFxiZWdpbntkYXRhZGVzY317UHlfVFBGTEFHU19IQVZFX1NFUVVFTkNFX0lOfQotICAgIElmIHRoaXMgYml0IGlzIHNldCwgdGhlIFxjdHlwZXtQeVNlcXVlbmNlTWV0aG9kc30gc3RydWN0Ci0gICAgcmVmZXJlbmNlZCBieSBcbWVtYmVye3RwX2FzX3NlcXVlbmNlfSBoYXMgdGhlIFxtZW1iZXJ7c3FfY29udGFpbnN9Ci0gICAgZmllbGQuCi0gIFxlbmR7ZGF0YWRlc2N9Ci0KLSAgXGJlZ2lue2RhdGFkZXNjfXtQeV9UUEZMQUdTX0dDfQotICAgIFRoaXMgYml0IGlzIG9ic29sZXRlLiAgVGhlIGJpdCBpdCB1c2VkIHRvIG5hbWUgaXMgbm8gbG9uZ2VyIGluCi0gICAgdXNlLiAgVGhlIHN5bWJvbCBpcyBub3cgZGVmaW5lZCBhcyB6ZXJvLgotICBcZW5ke2RhdGFkZXNjfQotCi0gIFxiZWdpbntkYXRhZGVzY317UHlfVFBGTEFHU19IQVZFX0lOUExBQ0VPUFN9Ci0gICAgSWYgdGhpcyBiaXQgaXMgc2V0LCB0aGUgXGN0eXBle1B5U2VxdWVuY2VNZXRob2RzfSBzdHJ1Y3QKLSAgICByZWZlcmVuY2VkIGJ5IFxtZW1iZXJ7dHBfYXNfc2VxdWVuY2V9IGFuZCB0aGUKLSAgICBcY3R5cGV7UHlOdW1iZXJNZXRob2RzfSBzdHJ1Y3R1cmUgcmVmZXJlbmNlZCBieQotICAgIFxtZW1iZXJ7dHBfYXNfbnVtYmVyfSBjb250YWluIHRoZSBmaWVsZHMgZm9yIGluLXBsYWNlIG9wZXJhdG9ycy4KLSAgICBJbiBwYXJ0aWN1bGFyLCB0aGlzIG1lYW5zIHRoYXQgdGhlIFxjdHlwZXtQeU51bWJlck1ldGhvZHN9Ci0gICAgc3RydWN0dXJlIGhhcyB0aGUgZmllbGRzIFxtZW1iZXJ7bmJfaW5wbGFjZV9hZGR9LAotICAgIFxtZW1iZXJ7bmJfaW5wbGFjZV9zdWJ0cmFjdH0sIFxtZW1iZXJ7bmJfaW5wbGFjZV9tdWx0aXBseX0sCi0gICAgXG1lbWJlcntuYl9pbnBsYWNlX2RpdmlkZX0sIFxtZW1iZXJ7bmJfaW5wbGFjZV9yZW1haW5kZXJ9LAotICAgIFxtZW1iZXJ7bmJfaW5wbGFjZV9wb3dlcn0sIFxtZW1iZXJ7bmJfaW5wbGFjZV9sc2hpZnR9LAotICAgIFxtZW1iZXJ7bmJfaW5wbGFjZV9yc2hpZnR9LCBcbWVtYmVye25iX2lucGxhY2VfYW5kfSwKLSAgICBcbWVtYmVye25iX2lucGxhY2VfeG9yfSwgYW5kIFxtZW1iZXJ7bmJfaW5wbGFjZV9vcn07IGFuZCB0aGUKLSAgICBcY3R5cGV7UHlTZXF1ZW5jZU1ldGhvZHN9IHN0cnVjdCBoYXMgdGhlIGZpZWxkcwotICAgIFxtZW1iZXJ7c3FfaW5wbGFjZV9jb25jYXR9IGFuZCBcbWVtYmVye3NxX2lucGxhY2VfcmVwZWF0fS4KLSAgXGVuZHtkYXRhZGVzY30KLQotICBcYmVnaW57ZGF0YWRlc2N9e1B5X1RQRkxBR1NfQ0hFQ0tUWVBFU30KLSAgICBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZSBiaW5hcnkgYW5kIHRlcm5hcnkgb3BlcmF0aW9ucyBpbiB0aGUKLSAgICBcY3R5cGV7UHlOdW1iZXJNZXRob2RzfSBzdHJ1Y3R1cmUgcmVmZXJlbmNlZCBieQotICAgIFxtZW1iZXJ7dHBfYXNfbnVtYmVyfSBhY2NlcHQgYXJndW1lbnRzIG9mIGFyYml0cmFyeSBvYmplY3QgdHlwZXMsCi0gICAgYW5kIGRvIHRoZWlyIG93biB0eXBlIGNvbnZlcnNpb25zIGlmIG5lZWRlZC4gIElmIHRoaXMgYml0IGlzCi0gICAgY2xlYXIsIHRob3NlIG9wZXJhdGlvbnMgcmVxdWlyZSB0aGF0IGFsbCBhcmd1bWVudHMgaGF2ZSB0aGUKLSAgICBjdXJyZW50IHR5cGUgYXMgdGhlaXIgdHlwZSwgYW5kIHRoZSBjYWxsZXIgaXMgc3VwcG9zZWQgdG8gcGVyZm9ybQotICAgIGEgY29lcmNpb24gb3BlcmF0aW9uIGZpcnN0LiAgVGhpcyBhcHBsaWVzIHRvIFxtZW1iZXJ7bmJfYWRkfSwKLSAgICBcbWVtYmVye25iX3N1YnRyYWN0fSwgXG1lbWJlcntuYl9tdWx0aXBseX0sIFxtZW1iZXJ7bmJfZGl2aWRlfSwKLSAgICBcbWVtYmVye25iX3JlbWFpbmRlcn0sIFxtZW1iZXJ7bmJfZGl2bW9kfSwgXG1lbWJlcntuYl9wb3dlcn0sCi0gICAgXG1lbWJlcntuYl9sc2hpZnR9LCBcbWVtYmVye25iX3JzaGlmdH0sIFxtZW1iZXJ7bmJfYW5kfSwKLSAgICBcbWVtYmVye25iX3hvcn0sIGFuZCBcbWVtYmVye25iX29yfS4KLSAgXGVuZHtkYXRhZGVzY30KLQotICBcYmVnaW57ZGF0YWRlc2N9e1B5X1RQRkxBR1NfSEFWRV9SSUNIQ09NUEFSRX0KLSAgICBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZSB0eXBlIG9iamVjdCBoYXMgdGhlCi0gICAgXG1lbWJlcnt0cF9yaWNoY29tcGFyZX0gZmllbGQsIGFzIHdlbGwgYXMgdGhlIFxtZW1iZXJ7dHBfdHJhdmVyc2V9Ci0gICAgYW5kIHRoZSBcbWVtYmVye3RwX2NsZWFyfSBmaWVsZHMuCi0gIFxlbmR7ZGF0YWRlc2N9Ci0KLSAgXGJlZ2lue2RhdGFkZXNjfXtQeV9UUEZMQUdTX0hBVkVfV0VBS1JFRlN9Ci0gICAgSWYgdGhpcyBiaXQgaXMgc2V0LCB0aGUgXG1lbWJlcnt0cF93ZWFrbGlzdG9mZnNldH0gZmllbGQgaXMKLSAgICBkZWZpbmVkLiAgSW5zdGFuY2VzIG9mIGEgdHlwZSBhcmUgd2Vha2x5IHJlZmVyZW5jZWFibGUgaWYgdGhlCi0gICAgdHlwZSdzIFxtZW1iZXJ7dHBfd2Vha2xpc3RvZmZzZXR9IGZpZWxkIGhhcyBhIHZhbHVlIGdyZWF0ZXIgdGhhbgotICAgIHplcm8uCi0gIFxlbmR7ZGF0YWRlc2N9Ci0KLSAgXGJlZ2lue2RhdGFkZXNjfXtQeV9UUEZMQUdTX0hBVkVfSVRFUn0KLSAgICBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZSB0eXBlIG9iamVjdCBoYXMgdGhlIFxtZW1iZXJ7dHBfaXRlcn0gYW5kCi0gICAgXG1lbWJlcnt0cF9pdGVybmV4dH0gZmllbGRzLgotICBcZW5ke2RhdGFkZXNjfQotCi0gIFxiZWdpbntkYXRhZGVzY317UHlfVFBGTEFHU19IQVZFX0NMQVNTfQotICAgIElmIHRoaXMgYml0IGlzIHNldCwgdGhlIHR5cGUgb2JqZWN0IGhhcyBzZXZlcmFsIG5ldyBmaWVsZHMgZGVmaW5lZAotICAgIHN0YXJ0aW5nIGluIFB5dGhvbiAyLjI6IFxtZW1iZXJ7dHBfbWV0aG9kc30sIFxtZW1iZXJ7dHBfbWVtYmVyc30sCi0gICAgXG1lbWJlcnt0cF9nZXRzZXR9LCBcbWVtYmVye3RwX2Jhc2V9LCBcbWVtYmVye3RwX2RpY3R9LAotICAgIFxtZW1iZXJ7dHBfZGVzY3JfZ2V0fSwgXG1lbWJlcnt0cF9kZXNjcl9zZXR9LAotICAgIFxtZW1iZXJ7dHBfZGljdG9mZnNldH0sIFxtZW1iZXJ7dHBfaW5pdH0sIFxtZW1iZXJ7dHBfYWxsb2N9LAotICAgIFxtZW1iZXJ7dHBfbmV3fSwgXG1lbWJlcnt0cF9mcmVlfSwgXG1lbWJlcnt0cF9pc19nY30sCi0gICAgXG1lbWJlcnt0cF9iYXNlc30sIFxtZW1iZXJ7dHBfbXJvfSwgXG1lbWJlcnt0cF9jYWNoZX0sCi0gICAgXG1lbWJlcnt0cF9zdWJjbGFzc2VzfSwgYW5kIFxtZW1iZXJ7dHBfd2Vha2xpc3R9LgotICBcZW5ke2RhdGFkZXNjfQotCi0gIFxiZWdpbntkYXRhZGVzY317UHlfVFBGTEFHU19IRUFQVFlQRX0KLSAgICBUaGlzIGJpdCBpcyBzZXQgd2hlbiB0aGUgdHlwZSBvYmplY3QgaXRzZWxmIGlzIGFsbG9jYXRlZCBvbiB0aGUKLSAgICBoZWFwLiAgSW4gdGhpcyBjYXNlLCB0aGUgXG1lbWJlcntvYl90eXBlfSBmaWVsZCBvZiBpdHMgaW5zdGFuY2VzCi0gICAgaXMgY29uc2lkZXJlZCBhIHJlZmVyZW5jZSB0byB0aGUgdHlwZSwgYW5kIHRoZSB0eXBlIG9iamVjdCBpcwotICAgIElOQ1JFRidlZCB3aGVuIGEgbmV3IGluc3RhbmNlIGlzIGNyZWF0ZWQsIGFuZCBERUNSRUYnZWQgd2hlbiBhbgotICAgIGluc3RhbmNlIGlzIGRlc3Ryb3llZCAodGhpcyBkb2VzIG5vdCBhcHBseSB0byBpbnN0YW5jZXMgb2YKLSAgICBzdWJ0eXBlczsgb25seSB0aGUgdHlwZSByZWZlcmVuY2VkIGJ5IHRoZSBpbnN0YW5jZSdzIG9iX3R5cGUgZ2V0cwotICAgIElOQ1JFRidlZCBvciBERUNSRUYnZWQpLgotICBcZW5ke2RhdGFkZXNjfQotCi0gIFxiZWdpbntkYXRhZGVzY317UHlfVFBGTEFHU19CQVNFVFlQRX0KLSAgICBUaGlzIGJpdCBpcyBzZXQgd2hlbiB0aGUgdHlwZSBjYW4gYmUgdXNlZCBhcyB0aGUgYmFzZSB0eXBlIG9mCi0gICAgYW5vdGhlciB0eXBlLiAgSWYgdGhpcyBiaXQgaXMgY2xlYXIsIHRoZSB0eXBlIGNhbm5vdCBiZSBzdWJ0eXBlZAotICAgIChzaW1pbGFyIHRvIGEgImZpbmFsIiBjbGFzcyBpbiBKYXZhKS4KLSAgXGVuZHtkYXRhZGVzY30KLQotICBcYmVnaW57ZGF0YWRlc2N9e1B5X1RQRkxBR1NfUkVBRFl9Ci0gICAgVGhpcyBiaXQgaXMgc2V0IHdoZW4gdGhlIHR5cGUgb2JqZWN0IGhhcyBiZWVuIGZ1bGx5IGluaXRpYWxpemVkIGJ5Ci0gICAgXGNmdW5jdGlvbntQeVR5cGVfUmVhZHkoKX0uCi0gIFxlbmR7ZGF0YWRlc2N9Ci0KLSAgXGJlZ2lue2RhdGFkZXNjfXtQeV9UUEZMQUdTX1JFQURZSU5HfQotICAgIFRoaXMgYml0IGlzIHNldCB3aGlsZSBcY2Z1bmN0aW9ue1B5VHlwZV9SZWFkeSgpfSBpcyBpbiB0aGUgcHJvY2VzcwotICAgIG9mIGluaXRpYWxpemluZyB0aGUgdHlwZSBvYmplY3QuCi0gIFxlbmR7ZGF0YWRlc2N9Ci0KLSAgXGJlZ2lue2RhdGFkZXNjfXtQeV9UUEZMQUdTX0hBVkVfR0N9Ci0gICAgVGhpcyBiaXQgaXMgc2V0IHdoZW4gdGhlIG9iamVjdCBzdXBwb3J0cyBnYXJiYWdlIGNvbGxlY3Rpb24uICBJZgotICAgIHRoaXMgYml0IGlzIHNldCwgaW5zdGFuY2VzIG11c3QgYmUgY3JlYXRlZCB1c2luZwotICAgIFxjZnVuY3Rpb257UHlPYmplY3RfR0NfTmV3KCl9IGFuZCBkZXN0cm95ZWQgdXNpbmcKLSAgICBcY2Z1bmN0aW9ue1B5T2JqZWN0X0dDX0RlbCgpfS4gIE1vcmUgaW5mb3JtYXRpb24gaW4gc2VjdGlvbiBYWFgKLSAgICBhYm91dCBnYXJiYWdlIGNvbGxlY3Rpb24uICBUaGlzIGJpdCBhbHNvIGltcGxpZXMgdGhhdCB0aGUKLSAgICBHQy1yZWxhdGVkIGZpZWxkcyBcbWVtYmVye3RwX3RyYXZlcnNlfSBhbmQgXG1lbWJlcnt0cF9jbGVhcn0gYXJlCi0gICAgcHJlc2VudCBpbiB0aGUgdHlwZSBvYmplY3Q7IGJ1dCB0aG9zZSBmaWVsZHMgYWxzbyBleGlzdCB3aGVuCi0gICAgXGNvbnN0YW50e1B5X1RQRkxBR1NfSEFWRV9HQ30gaXMgY2xlYXIgYnV0Ci0gICAgXGNvbnN0YW50e1B5X1RQRkxBR1NfSEFWRV9SSUNIQ09NUEFSRX0gaXMgc2V0LgotICBcZW5ke2RhdGFkZXNjfQotCi0gIFxiZWdpbntkYXRhZGVzY317UHlfVFBGTEFHU19ERUZBVUxUfQotICAgIFRoaXMgaXMgYSBiaXRtYXNrIG9mIGFsbCB0aGUgYml0cyB0aGF0IHBlcnRhaW4gdG8gdGhlIGV4aXN0ZW5jZSBvZgotICAgIGNlcnRhaW4gZmllbGRzIGluIHRoZSB0eXBlIG9iamVjdCBhbmQgaXRzIGV4dGVuc2lvbiBzdHJ1Y3R1cmVzLgotICAgIEN1cnJlbnRseSwgaXQgaW5jbHVkZXMgdGhlIGZvbGxvd2luZyBiaXRzOgotICAgIFxjb25zdGFudHtQeV9UUEZMQUdTX0hBVkVfR0VUQ0hBUkJVRkZFUn0sCi0gICAgXGNvbnN0YW50e1B5X1RQRkxBR1NfSEFWRV9TRVFVRU5DRV9JTn0sCi0gICAgXGNvbnN0YW50e1B5X1RQRkxBR1NfSEFWRV9JTlBMQUNFT1BTfSwKLSAgICBcY29uc3RhbnR7UHlfVFBGTEFHU19IQVZFX1JJQ0hDT01QQVJFfSwKLSAgICBcY29uc3RhbnR7UHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTfSwKLSAgICBcY29uc3RhbnR7UHlfVFBGTEFHU19IQVZFX0lURVJ9LCBhbmQKLSAgICBcY29uc3RhbnR7UHlfVFBGTEFHU19IQVZFX0NMQVNTfS4KLSAgXGVuZHtkYXRhZGVzY30KLVxlbmR7Y21lbWJlcmRlc2N9Ci0KLVxiZWdpbntjbWVtYmVyZGVzY317UHlUeXBlT2JqZWN0fXtjaGFyKn17dHBfZG9jfQotICBBbiBvcHRpb25hbCBwb2ludGVyIHRvIGEgTlVMLXRlcm1pbmF0ZWQgQyBzdHJpbmcgZ2l2aW5nIHRoZQotICBkb2NzdHJpbmcgZm9yIHRoaXMgdHlwZSBvYmplY3QuICBUaGlzIGlzIGV4cG9zZWQgYXMgdGhlCi0gIFxtZW1iZXJ7X19kb2NfX30gYXR0cmlidXRlIG9uIHRoZSB0eXBlIGFuZCBpbnN0YW5jZXMgb2YgdGhlIHR5cGUuCi0KLSAgVGhpcyBmaWVsZCBpcyBcZW1waHtub3R9IGluaGVyaXRlZCBieSBzdWJ0eXBlcy4KLVxlbmR7Y21lbWJlcmRlc2N9Ci0KLVRoZSBmb2xsb3dpbmcgdGhyZWUgZmllbGRzIG9ubHkgZXhpc3QgaWYgdGhlCi1cY29uc3RhbnR7UHlfVFBGTEFHU19IQVZFX1JJQ0hDT01QQVJFfSBmbGFnIGJpdCBpcyBzZXQuCi0KLVxiZWdpbntjbWVtYmVyZGVzY317UHlUeXBlT2JqZWN0fXt0cmF2ZXJzZXByb2N9e3RwX3RyYXZlcnNlfQotICBBbiBvcHRpb25hbCBwb2ludGVyIHRvIGEgdHJhdmVyc2FsIGZ1bmN0aW9uIGZvciB0aGUgZ2FyYmFnZQotICBjb2xsZWN0b3IuICBUaGlzIGlzIG9ubHkgdXNlZCBpZiB0aGUgXGNvbnN0YW50e1B5X1RQRkxBR1NfSEFWRV9HQ30KLSAgZmxhZyBiaXQgaXMgc2V0LiAgTW9yZSBpbmZvcm1hdGlvbiBhYm91dCBQeXRob24ncyBnYXJiYWdlIGNvbGxlY3Rpb24KLSAgc2NoZW1lIGNhbiBiZSBmb3VuZCBpbiBzZWN0aW9uIFxyZWZ7c3VwcG9ydGluZy1jeWNsZS1kZXRlY3Rpb259LgotCi0gIFRoZSBcbWVtYmVye3RwX3RyYXZlcnNlfSBwb2ludGVyIGlzIHVzZWQgYnkgdGhlIGdhcmJhZ2UgY29sbGVjdG9yCi0gIHRvIGRldGVjdCByZWZlcmVuY2UgY3ljbGVzLiBBIHR5cGljYWwgaW1wbGVtZW50YXRpb24gb2YgYQotICBcbWVtYmVye3RwX3RyYXZlcnNlfSBmdW5jdGlvbiBzaW1wbHkgY2FsbHMgXGNmdW5jdGlvbntQeV9WSVNJVCgpfSBvbgotICBlYWNoIG9mIHRoZSBpbnN0YW5jZSdzIG1lbWJlcnMgdGhhdCBhcmUgUHl0aG9uIG9iamVjdHMuICBGb3IgZXhhbXBlLCB0aGlzCi0gIGlzIGZ1bmN0aW9uIFxjZnVuY3Rpb257bG9jYWxfdHJhdmVyc2V9IGZyb20gdGhlIFxtb2R1bGV7dGhyZWFkfSBleHRlbnNpb24KLSAgbW9kdWxlOgotCi0gIFxiZWdpbnt2ZXJiYXRpbX0KLSAgc3RhdGljIGludAotICBsb2NhbF90cmF2ZXJzZShsb2NhbG9iamVjdCAqc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCi0gIHsKLSAgICAgIFB5X1ZJU0lUKHNlbGYtPmFyZ3MpOwotICAgICAgUHlfVklTSVQoc2VsZi0+a3cpOwotICAgICAgUHlfVklTSVQoc2VsZi0+ZGljdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgfQotICBcZW5ke3ZlcmJhdGltfQotCi0gIE5vdGUgdGhhdCBcY2Z1bmN0aW9ue1B5X1ZJU0lUKCl9IGlzIGNhbGxlZCBvbmx5IG9uIHRob3NlIG1lbWJlcnMgdGhhdCBjYW4KLSAgcGFydGljaXBhdGUgaW4gcmVmZXJlbmNlIGN5Y2xlcy4gIEFsdGhvdWdoIHRoZXJlIGlzIGFsc28gYQotICBcc2FtcHtzZWxmLT5rZXl9IG1lbWJlciwgaXQgY2FuIG9ubHkgYmUgXE5VTEx7fSBvciBhIFB5dGhvbiBzdHJpbmcgYW5kCi0gIHRoZXJlZm9yZSBjYW5ub3QgYmUgcGFydCBvZiBhIHJlZmVyZW5jZSBjeWNsZS4KLQotICBPbiB0aGUgb3RoZXIgaGFuZCwgZXZlbiBpZiB5b3Uga25vdyBhIG1lbWJlciBjYW4gbmV2ZXIgYmUgcGFydCBvZiBhIGN5Y2xlLAotICBhcyBhIGRlYnVnZ2luZyBhaWQgeW91IG1heSB3YW50IHRvIHZpc2l0IGl0IGFueXdheSBqdXN0IHNvIHRoZQotICBcbW9kdWxle2djfSBtb2R1bGUncyBcZnVuY3Rpb257Z2V0X3JlZmVyZW50cygpfSBmdW5jdGlvbiB3aWxsIGluY2x1ZGUgaXQuCi0KLSAgTm90ZSB0aGF0IFxjZnVuY3Rpb257UHlfVklTSVQoKX0gcmVxdWlyZXMgdGhlIFx2YXJ7dmlzaXR9IGFuZCBcdmFye2FyZ30KLSAgcGFyYW1ldGVycyB0byBcY2Z1bmN0aW9ue2xvY2FsX3RyYXZlcnNlfSB0byBoYXZlIHRoZXNlIHNwZWNpZmljIG5hbWVzOwotICBkb24ndCBuYW1lIHRoZW0ganVzdCBhbnl0aGluZy4KLQotICBUaGlzIGZpZWxkIGlzIGluaGVyaXRlZCBieSBzdWJ0eXBlcyB0b2dldGhlciB3aXRoIFxtZW1iZXJ7dHBfY2xlYXJ9Ci0gIGFuZCB0aGUgXGNvbnN0YW50e1B5X1RQRkxBR1NfSEFWRV9HQ30gZmxhZyBiaXQ6IHRoZSBmbGFnIGJpdCwKLSAgXG1lbWJlcnt0cF90cmF2ZXJzZX0sIGFuZCBcbWVtYmVye3RwX2NsZWFyfSBhcmUgYWxsIGluaGVyaXRlZCBmcm9tCi0gIHRoZSBiYXNlIHR5cGUgaWYgdGhleSBhcmUgYWxsIHplcm8gaW4gdGhlIHN1YnR5cGUgXGVtcGh7YW5kfSB0aGUKLSAgc3VidHlwZSBoYXMgdGhlIFxjb25zdGFudHtQeV9UUEZMQUdTX0hBVkVfUklDSENPTVBBUkV9IGZsYWcgYml0IHNldC4KLVxlbmR7Y21lbWJlcmRlc2N9Ci0KLVxiZWdpbntjbWVtYmVyZGVzY317UHlUeXBlT2JqZWN0fXtpbnF1aXJ5fXt0cF9jbGVhcn0KLSAgQW4gb3B0aW9uYWwgcG9pbnRlciB0byBhIGNsZWFyIGZ1bmN0aW9uIGZvciB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IuCi0gIFRoaXMgaXMgb25seSB1c2VkIGlmIHRoZSBcY29uc3RhbnR7UHlfVFBGTEFHU19IQVZFX0dDfSBmbGFnIGJpdCBpcwotICBzZXQuCi0KLSAgVGhlIFxtZW1iZXJ7dHBfY2xlYXJ9IG1lbWJlciBmdW5jdGlvbiBpcyB1c2VkIHRvIGJyZWFrIHJlZmVyZW5jZQotICBjeWNsZXMgaW4gY3ljbGljIGdhcmJhZ2UgZGV0ZWN0ZWQgYnkgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLiAgVGFrZW4KLSAgdG9nZXRoZXIsIGFsbCBcbWVtYmVye3RwX2NsZWFyfSBmdW5jdGlvbnMgaW4gdGhlIHN5c3RlbSBtdXN0IGNvbWJpbmUgdG8KLSAgYnJlYWsgYWxsIHJlZmVyZW5jZSBjeWNsZXMuICBUaGlzIGlzIHN1YnRsZSwgYW5kIGlmIGluIGFueSBkb3VidCBzdXBwbHkgYQotICBcbWVtYmVye3RwX2NsZWFyfSBmdW5jdGlvbi4gIEZvciBleGFtcGxlLCB0aGUgdHVwbGUgdHlwZSBkb2VzIG5vdAotICBpbXBsZW1lbnQgYSBcbWVtYmVye3RwX2NsZWFyfSBmdW5jdGlvbiwgYmVjYXVzZSBpdCdzIHBvc3NpYmxlIHRvIHByb3ZlCi0gIHRoYXQgbm8gcmVmZXJlbmNlIGN5Y2xlIGNhbiBiZSBjb21wb3NlZCBlbnRpcmVseSBvZiB0dXBsZXMuICBUaGVyZWZvcmUKLSAgdGhlIFxtZW1iZXJ7dHBfY2xlYXJ9IGZ1bmN0aW9ucyBvZiBvdGhlciB0eXBlcyBtdXN0IGJlIHN1ZmZpY2llbnQgdG8KLSAgYnJlYWsgYW55IGN5Y2xlIGNvbnRhaW5pbmcgYSB0dXBsZS4gIFRoaXMgaXNuJ3QgaW1tZWRpYXRlbHkgb2J2aW91cywgYW5kCi0gIHRoZXJlJ3MgcmFyZWx5IGEgZ29vZCByZWFzb24gdG8gYXZvaWQgaW1wbGVtZW50aW5nIFxtZW1iZXJ7dHBfY2xlYXJ9LgotCi0gIEltcGxlbWVudGF0aW9ucyBvZiBcbWVtYmVye3RwX2NsZWFyfSBzaG91bGQgZHJvcCB0aGUgaW5zdGFuY2UncwotICByZWZlcmVuY2VzIHRvIHRob3NlIG9mIGl0cyBtZW1iZXJzIHRoYXQgbWF5IGJlIFB5dGhvbiBvYmplY3RzLCBhbmQgc2V0Ci0gIGl0cyBwb2ludGVycyB0byB0aG9zZSBtZW1iZXJzIHRvIFxOVUxMe30sIGFzIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKLQotICBcYmVnaW57dmVyYmF0aW19Ci0gIHN0YXRpYyBpbnQKLSAgbG9jYWxfY2xlYXIobG9jYWxvYmplY3QgKnNlbGYpCi0gIHsKLSAgICAgIFB5X0NMRUFSKHNlbGYtPmtleSk7Ci0gICAgICBQeV9DTEVBUihzZWxmLT5hcmdzKTsKLSAgICAgIFB5X0NMRUFSKHNlbGYtPmt3KTsKLSAgICAgIFB5X0NMRUFSKHNlbGYtPmRpY3QpOwotICAgICAgcmV0dXJuIDA7Ci0gIH0KLSAgXGVuZHt2ZXJiYXRpbX0KLQotICBUaGUgXGNmdW5jdGlvbntQeV9DTEVBUigpfSBtYWNybyBzaG91bGQgYmUgdXNlZCwgYmVjYXVzZSBjbGVhcmluZwotICByZWZlcmVuY2VzIGlzIGRlbGljYXRlOiAgdGhlIHJlZmVyZW5jZSB0byB0aGUgY29udGFpbmVkIG9iamVjdCBtdXN0IG5vdCBiZQotICBkZWNyZW1lbnRlZCB1bnRpbCBhZnRlciB0aGUgcG9pbnRlciB0byB0aGUgY29udGFpbmVkIG9iamVjdCBpcyBzZXQgdG8KLSAgXE5VTEx7fS4gIFRoaXMgaXMgYmVjYXVzZSBkZWNyZW1lbnRpbmcgdGhlIHJlZmVyZW5jZSBjb3VudCBtYXkgY2F1c2UKLSAgdGhlIGNvbnRhaW5lZCBvYmplY3QgdG8gYmVjb21lIHRyYXNoLCB0cmlnZ2VyaW5nIGEgY2hhaW4gb2YgcmVjbGFtYXRpb24KLSAgYWN0aXZpdHkgdGhhdCBtYXkgaW5jbHVkZSBpbnZva2luZyBhcmJpdHJhcnkgUHl0aG9uIGNvZGUgKGR1ZSB0bwotICBmaW5hbGl6ZXJzLCBvciB3ZWFrcmVmIGNhbGxiYWNrcywgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250YWluZWQgb2JqZWN0KS4KLSAgSWYgaXQncyBwb3NzaWJsZSBmb3Igc3VjaCBjb2RlIHRvIHJlZmVyZW5jZSBcdmFye3NlbGZ9IGFnYWluLCBpdCdzCi0gIGltcG9ydGFudCB0aGF0IHRoZSBwb2ludGVyIHRvIHRoZSBjb250YWluZWQgb2JqZWN0IGJlIFxOVUxMe30gYXQgdGhhdAotICB0aW1lLCBzbyB0aGF0IFx2YXJ7c2VsZn0ga25vd3MgdGhlIGNvbnRhaW5lZCBvYmplY3QgY2FuIG5vIGxvbmdlciBiZQotICB1c2VkLiAgVGhlIFxjZnVuY3Rpb257UHlfQ0xFQVIoKX0gbWFjcm8gcGVyZm9ybXMgdGhlIG9wZXJhdGlvbnMgaW4gYQotICBzYWZlIG9yZGVyLgotCi0gIEJlY2F1c2UgdGhlIGdvYWwgb2YgXG1lbWJlcnt0cF9jbGVhcn0gZnVuY3Rpb25zIGlzIHRvIGJyZWFrIHJlZmVyZW5jZQotICBjeWNsZXMsIGl0J3Mgbm90IG5lY2Vzc2FyeSB0byBjbGVhciBjb250YWluZWQgb2JqZWN0cyBsaWtlIFB5dGhvbiBzdHJpbmdzCi0gIG9yIFB5dGhvbiBpbnRlZ2Vycywgd2hpY2ggY2FuJ3QgcGFydGljaXBhdGUgaW4gcmVmZXJlbmNlIGN5Y2xlcy4KLSAgT24gdGhlIG90aGVyIGhhbmQsIGl0IG1heSBiZSBjb252ZW5pZW50IHRvIGNsZWFyIGFsbCBjb250YWluZWQgUHl0aG9uCi0gIG9iamVjdHMsIGFuZCB3cml0ZSB0aGUgdHlwZSdzIFxtZW1iZXJ7dHBfZGVhbGxvY30gZnVuY3Rpb24gdG8KLSAgaW52b2tlIFxtZW1iZXJ7dHBfY2xlYXJ9LgotCi0gIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgUHl0aG9uJ3MgZ2FyYmFnZSBjb2xsZWN0aW9uCi0gIHNjaGVtZSBjYW4gYmUgZm91bmQgaW4gc2VjdGlvbiBccmVme3N1cHBvcnRpbmctY3ljbGUtZGV0ZWN0aW9ufS4KLQotICBUaGlzIGZpZWxkIGlzIGluaGVyaXRlZCBieSBzdWJ0eXBlcyB0b2dldGhlciB3aXRoIFxtZW1iZXJ7dHBfdHJhdmVyc2V9Ci0gIGFuZCB0aGUgXGNvbnN0YW50e1B5X1RQRkxBR1NfSEFWRV9HQ30gZmxhZyBiaXQ6IHRoZSBmbGFnIGJpdCwKLSAgXG1lbWJlcnt0cF90cmF2ZXJzZX0sIGFuZCBcbWVtYmVye3RwX2NsZWFyfSBhcmUgYWxsIGluaGVyaXRlZCBmcm9tCi0gIHRoZSBiYXNlIHR5cGUgaWYgdGhleSBhcmUgYWxsIHplcm8gaW4gdGhlIHN1YnR5cGUgXGVtcGh7YW5kfSB0aGUKLSAgc3VidHlwZSBoYXMgdGhlIFxjb25zdGFudHtQeV9UUEZMQUdTX0hBVkVfUklDSENPTVBBUkV9IGZsYWcgYml0IHNldC4KLVxlbmR7Y21lbWJlcmRlc2N9Ci0KLVxiZWdpbntjbWVtYmVyZGVzY317UHlUeXBlT2JqZWN0fXtyaWNoY21wZnVuY317dHBfcmljaGNvbXBhcmV9Ci0gIEFuIG9wdGlvbmFsIHBvaW50ZXIgdG8gdGhlIHJpY2ggY29tcGFyaXNvbiBmdW5jdGlvbi4KLQotICBUaGUgc2lnbmF0dXJlIGlzIHRoZSBzYW1lIGFzIGZvciBcY2Z1bmN0aW9ue1B5T2JqZWN0X1JpY2hDb21wYXJlKCl9LgotICBUaGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uICh1c3VhbGx5Ci0gIFxjb2Rle1B5X1RydWV9IG9yIFxjb2Rle1B5X0ZhbHNlfSkuICBJZiB0aGUgY29tcGFyaXNvbiBpcyB1bmRlZmluZWQsCi0gIGl0IG11c3QgcmV0dXJuIFxjb2Rle1B5X05vdEltcGxlbWVudGVkfSwgaWYgYW5vdGhlciBlcnJvciBvY2N1cnJlZAotICBpdCBtdXN0IHJldHVybiBcY29kZXtOVUxMfSBhbmQgc2V0IGFuIGV4Y2VwdGlvbiBjb25kaXRpb24uCi0KLSAgVGhpcyBmaWVsZCBpcyBpbmhlcml0ZWQgYnkgc3VidHlwZXMgdG9nZXRoZXIgd2l0aAotICBcbWVtYmVye3RwX2NvbXBhcmV9IGFuZCBcbWVtYmVye3RwX2hhc2h9OiBhIHN1YnR5cGUgaW5oZXJpdHMgYWxsCi0gIHRocmVlIG9mIFxtZW1iZXJ7dHBfY29tcGFyZX0sIFxtZW1iZXJ7dHBfcmljaGNvbXBhcmV9LCBhbmQKLSAgXG1lbWJlcnt0cF9oYXNofSwgd2hlbiB0aGUgc3VidHlwZSdzIFxtZW1iZXJ7dHBfY29tcGFyZX0sCi0gIFxtZW1iZXJ7dHBfcmljaGNvbXBhcmV9LCBhbmQgXG1lbWJlcnt0cF9oYXNofSBhcmUgYWxsIFxOVUxMLgotCi0gIFRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIGFyZSBkZWZpbmVkIHRvIGJlIHVzZWQgYXMgdGhlIHRoaXJkIGFyZ3VtZW50Ci0gIGZvciBcbWVtYmVye3RwX3JpY2hjb21wYXJlfSBhbmQgZm9yIFxjZnVuY3Rpb257UHlPYmplY3RfUmljaENvbXBhcmUoKX06Ci0KLSAgXGJlZ2lue3RhYmxlaWl9e2x8Y317Y29uc3RhbnR9e0NvbnN0YW50fXtDb21wYXJpc29ufQotICAgIFxsaW5laWl7UHlfTFR9e1xjb2Rlezx9fQotICAgIFxsaW5laWl7UHlfTEV9e1xjb2Rlezw9fX0KLSAgICBcbGluZWlpe1B5X0VRfXtcY29kZXs9PX19Ci0gICAgXGxpbmVpaXtQeV9ORX17XGNvZGV7IT19fQotICAgIFxsaW5laWl7UHlfR1R9e1xjb2Rlez59fQotICAgIFxsaW5laWl7UHlfR0V9e1xjb2Rlez49fX0KLSAgXGVuZHt0YWJsZWlpfQotXGVuZHtjbWVtYmVyZGVzY30KLQotVGhlIG5leHQgZmllbGQgb25seSBleGlzdHMgaWYgdGhlIFxjb25zdGFudHtQeV9UUEZMQUdTX0hBVkVfV0VBS1JFRlN9Ci1mbGFnIGJpdCBpcyBzZXQuCi0KLVxiZWdpbntjbWVtYmVyZGVzY317UHlUeXBlT2JqZWN0fXtsb25nfXt0cF93ZWFrbGlzdG9mZnNldH0KLSAgSWYgdGhlIGluc3RhbmNlcyBvZiB0aGlzIHR5cGUgYXJlIHdlYWtseSByZWZlcmVuY2VhYmxlLCB0aGlzIGZpZWxkCi0gIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvIGFuZCBjb250YWlucyB0aGUgb2Zmc2V0IGluIHRoZSBpbnN0YW5jZQotICBzdHJ1Y3R1cmUgb2YgdGhlIHdlYWsgcmVmZXJlbmNlIGxpc3QgaGVhZCAoaWdub3JpbmcgdGhlIEdDIGhlYWRlciwKLSAgaWYgcHJlc2VudCk7IHRoaXMgb2Zmc2V0IGlzIHVzZWQgYnkKLSAgXGNmdW5jdGlvbntQeU9iamVjdF9DbGVhcldlYWtSZWZzKCl9IGFuZCB0aGUKLSAgXGNmdW5jdGlvbntQeVdlYWtyZWZfKigpfSBmdW5jdGlvbnMuICBUaGUgaW5zdGFuY2Ugc3RydWN0dXJlIG5lZWRzCi0gIHRvIGluY2x1ZGUgYSBmaWVsZCBvZiB0eXBlIFxjdHlwZXtQeU9iamVjdCp9IHdoaWNoIGlzIGluaXRpYWxpemVkIHRvCi0gIFxOVUxMLgotCi0gIERvIG5vdCBjb25mdXNlIHRoaXMgZmllbGQgd2l0aCBcbWVtYmVye3RwX3dlYWtsaXN0fTsgdGhhdCBpcyB0aGUKLSAgbGlzdCBoZWFkIGZvciB3ZWFrIHJlZmVyZW5jZXMgdG8gdGhlIHR5cGUgb2JqZWN0IGl0c2VsZi4KLQotICBUaGlzIGZpZWxkIGlzIGluaGVyaXRlZCBieSBzdWJ0eXBlcywgYnV0IHNlZSB0aGUgcnVsZXMgbGlzdGVkIGJlbG93LgotICBBIHN1YnR5cGUgbWF5IG92ZXJyaWRlIHRoaXMgb2Zmc2V0OyB0aGlzIG1lYW5zIHRoYXQgdGhlIHN1YnR5cGUgdXNlcwotICBhIGRpZmZlcmVudCB3ZWFrIHJlZmVyZW5jZSBsaXN0IGhlYWQgdGhhbiB0aGUgYmFzZSB0eXBlLiAgU2luY2UgdGhlCi0gIGxpc3QgaGVhZCBpcyBhbHdheXMgZm91bmQgdmlhIFxtZW1iZXJ7dHBfd2Vha2xpc3RvZmZzZXR9LCB0aGlzCi0gIHNob3VsZCBub3QgYmUgYSBwcm9ibGVtLgotCi0gIFdoZW4gYSB0eXBlIGRlZmluZWQgYnkgYSBjbGFzcyBzdGF0ZW1lbnQgaGFzIG5vIFxtZW1iZXJ7X19zbG90c19ffQotICBkZWNsYXJhdGlvbiwgYW5kIG5vbmUgb2YgaXRzIGJhc2UgdHlwZXMgYXJlIHdlYWtseSByZWZlcmVuY2VhYmxlLAotICB0aGUgdHlwZSBpcyBtYWRlIHdlYWtseSByZWZlcmVuY2VhYmxlIGJ5IGFkZGluZyBhIHdlYWsgcmVmZXJlbmNlCi0gIGxpc3QgaGVhZCBzbG90IHRvIHRoZSBpbnN0YW5jZSBsYXlvdXQgYW5kIHNldHRpbmcgdGhlCi0gIFxtZW1iZXJ7dHBfd2Vha2xpc3RvZmZzZXR9IG9mIHRoYXQgc2xvdCdzIG9mZnNldC4KLQotICBXaGVuIGEgdHlwZSdzIFxtZW1iZXJ7X19zbG90c19ffSBkZWNsYXJhdGlvbiBjb250YWlucyBhIHNsb3QgbmFtZWQKLSAgXG1lbWJlcntfX3dlYWtyZWZfX30sIHRoYXQgc2xvdCBiZWNvbWVzIHRoZSB3ZWFrIHJlZmVyZW5jZSBsaXN0IGhlYWQKLSAgZm9yIGluc3RhbmNlcyBvZiB0aGUgdHlwZSwgYW5kIHRoZSBzbG90J3Mgb2Zmc2V0IGlzIHN0b3JlZCBpbiB0aGUKLSAgdHlwZSdzIFxtZW1iZXJ7dHBfd2Vha2xpc3RvZmZzZXR9LgotCi0gIFdoZW4gYSB0eXBlJ3MgXG1lbWJlcntfX3Nsb3RzX199IGRlY2xhcmF0aW9uIGRvZXMgbm90IGNvbnRhaW4gYSBzbG90Ci0gIG5hbWVkIFxtZW1iZXJ7X193ZWFrcmVmX199LCB0aGUgdHlwZSBpbmhlcml0cyBpdHMKLSAgXG1lbWJlcnt0cF93ZWFrbGlzdG9mZnNldH0gZnJvbSBpdHMgYmFzZSB0eXBlLgotXGVuZHtjbWVtYmVyZGVzY30KLQotVGhlIG5leHQgdHdvIGZpZWxkcyBvbmx5IGV4aXN0IGlmIHRoZQotXGNvbnN0YW50e1B5X1RQRkxBR1NfSEFWRV9DTEFTU30gZmxhZyBiaXQgaXMgc2V0LgotCi1cYmVnaW57Y21lbWJlcmRlc2N9e1B5VHlwZU9iamVjdH17Z2V0aXRlcmZ1bmN9e3RwX2l0ZXJ9Ci0gIEFuIG9wdGlvbmFsIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gaXRlcmF0b3IgZm9yIHRoZQotICBvYmplY3QuICBJdHMgcHJlc2VuY2Ugbm9ybWFsbHkgc2lnbmFscyB0aGF0IHRoZSBpbnN0YW5jZXMgb2YgdGhpcwotICB0eXBlIGFyZSBpdGVyYWJsZSAoYWx0aG91Z2ggc2VxdWVuY2VzIG1heSBiZSBpdGVyYWJsZSB3aXRob3V0IHRoaXMKLSAgZnVuY3Rpb24sIGFuZCBjbGFzc2ljIGluc3RhbmNlcyBhbHdheXMgaGF2ZSB0aGlzIGZ1bmN0aW9uLCBldmVuIGlmCi0gIHRoZXkgZG9uJ3QgZGVmaW5lIGFuIFxtZXRob2R7X19pdGVyX18oKX0gbWV0aG9kKS4KLQotICBUaGlzIGZ1bmN0aW9uIGhhcyB0aGUgc2FtZSBzaWduYXR1cmUgYXMKLSAgXGNmdW5jdGlvbntQeU9iamVjdF9HZXRJdGVyKCl9LgotCi0gIFRoaXMgZmllbGQgaXMgaW5oZXJpdGVkIGJ5IHN1YnR5cGVzLgotXGVuZHtjbWVtYmVyZGVzY30KLQotXGJlZ2lue2NtZW1iZXJkZXNjfXtQeVR5cGVPYmplY3R9e2l0ZXJuZXh0ZnVuY317dHBfaXRlcm5leHR9Ci0gIEFuIG9wdGlvbmFsIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG5leHQgaXRlbSBpbiBhbgotICBpdGVyYXRvciwgb3IgcmFpc2VzIFxleGNlcHRpb257U3RvcEl0ZXJhdGlvbn0gd2hlbiB0aGUgaXRlcmF0b3IgaXMKLSAgZXhoYXVzdGVkLiAgSXRzIHByZXNlbmNlIG5vcm1hbGx5IHNpZ25hbHMgdGhhdCB0aGUgaW5zdGFuY2VzIG9mIHRoaXMKLSAgdHlwZSBhcmUgaXRlcmF0b3JzIChhbHRob3VnaCBjbGFzc2ljIGluc3RhbmNlcyBhbHdheXMgaGF2ZSB0aGlzCi0gIGZ1bmN0aW9uLCBldmVuIGlmIHRoZXkgZG9uJ3QgZGVmaW5lIGEgXG1ldGhvZHtfX25leHRfXygpfSBtZXRob2QpLgotCi0gIEl0ZXJhdG9yIHR5cGVzIHNob3VsZCBhbHNvIGRlZmluZSB0aGUgXG1lbWJlcnt0cF9pdGVyfSBmdW5jdGlvbiwgYW5kCi0gIHRoYXQgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0aGUgaXRlcmF0b3IgaW5zdGFuY2UgaXRzZWxmIChub3QgYSBuZXcKLSAgaXRlcmF0b3IgaW5zdGFuY2UpLgotCi0gIFRoaXMgZnVuY3Rpb24gaGFzIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyBcY2Z1bmN0aW9ue1B5SXRlcl9OZXh0KCl9LgotCi0gIFRoaXMgZmllbGQgaXMgaW5oZXJpdGVkIGJ5IHN1YnR5cGVzLgotXGVuZHtjbWVtYmVyZGVzY30KLQotVGhlIG5leHQgZmllbGRzLCB1cCB0byBhbmQgaW5jbHVkaW5nIFxtZW1iZXJ7dHBfd2Vha2xpc3R9LCBvbmx5IGV4aXN0Ci1pZiB0aGUgXGNvbnN0YW50e1B5X1RQRkxBR1NfSEFWRV9DTEFTU30gZmxhZyBiaXQgaXMgc2V0LgotCi1cYmVnaW57Y21lbWJlcmRlc2N9e1B5VHlwZU9iamVjdH17c3RydWN0IFB5TWV0aG9kRGVmKn17dHBfbWV0aG9kc30KLSAgQW4gb3B0aW9uYWwgcG9pbnRlciB0byBhIHN0YXRpYyBcTlVMTC10ZXJtaW5hdGVkIGFycmF5IG9mCi0gIFxjdHlwZXtQeU1ldGhvZERlZn0gc3RydWN0dXJlcywgZGVjbGFyaW5nIHJlZ3VsYXIgbWV0aG9kcyBvZiB0aGlzCi0gIHR5cGUuCi0KLSAgRm9yIGVhY2ggZW50cnkgaW4gdGhlIGFycmF5LCBhbiBlbnRyeSBpcyBhZGRlZCB0byB0aGUgdHlwZSdzCi0gIGRpY3Rpb25hcnkgKHNlZSBcbWVtYmVye3RwX2RpY3R9IGJlbG93KSBjb250YWluaW5nIGEgbWV0aG9kCi0gIGRlc2NyaXB0b3IuCi0KLSAgVGhpcyBmaWVsZCBpcyBub3QgaW5oZXJpdGVkIGJ5IHN1YnR5cGVzIChtZXRob2RzIGFyZQotICBpbmhlcml0ZWQgdGhyb3VnaCBhIGRpZmZlcmVudCBtZWNoYW5pc20pLgotXGVuZHtjbWVtYmVyZGVzY30KLQotXGJlZ2lue2NtZW1iZXJkZXNjfXtQeVR5cGVPYmplY3R9e3N0cnVjdCBQeU1lbWJlckRlZip9e3RwX21lbWJlcnN9Ci0gIEFuIG9wdGlvbmFsIHBvaW50ZXIgdG8gYSBzdGF0aWMgXE5VTEwtdGVybWluYXRlZCBhcnJheSBvZgotICBcY3R5cGV7UHlNZW1iZXJEZWZ9IHN0cnVjdHVyZXMsIGRlY2xhcmluZyByZWd1bGFyIGRhdGEgbWVtYmVycwotICAoZmllbGRzIG9yIHNsb3RzKSBvZiBpbnN0YW5jZXMgb2YgdGhpcyB0eXBlLgotCi0gIEZvciBlYWNoIGVudHJ5IGluIHRoZSBhcnJheSwgYW4gZW50cnkgaXMgYWRkZWQgdG8gdGhlIHR5cGUncwotICBkaWN0aW9uYXJ5IChzZWUgXG1lbWJlcnt0cF9kaWN0fSBiZWxvdykgY29udGFpbmluZyBhIG1lbWJlcgotICBkZXNjcmlwdG9yLgotCi0gIFRoaXMgZmllbGQgaXMgbm90IGluaGVyaXRlZCBieSBzdWJ0eXBlcyAobWVtYmVycyBhcmUgaW5oZXJpdGVkCi0gIHRocm91Z2ggYSBkaWZmZXJlbnQgbWVjaGFuaXNtKS4KLVxlbmR7Y21lbWJlcmRlc2N9Ci0KLVxiZWdpbntjbWVtYmVyZGVzY317UHlUeXBlT2JqZWN0fXtzdHJ1Y3QgUHlHZXRTZXREZWYqfXt0cF9nZXRzZXR9Ci0gIEFuIG9wdGlvbmFsIHBvaW50ZXIgdG8gYSBzdGF0aWMgXE5VTEwtdGVybWluYXRlZCBhcnJheSBvZgotICBcY3R5cGV7UHlHZXRTZXREZWZ9IHN0cnVjdHVyZXMsIGRlY2xhcmluZyBjb21wdXRlZCBhdHRyaWJ1dGVzIG9mCi0gIGluc3RhbmNlcyBvZiB0aGlzIHR5cGUuCi0KLSAgRm9yIGVhY2ggZW50cnkgaW4gdGhlIGFycmF5LCBhbiBlbnRyeSBpcyBhZGRlZCB0byB0aGUgdHlwZSdzCi0gIGRpY3Rpb25hcnkgKHNlZSBcbWVtYmVye3RwX2RpY3R9IGJlbG93KSBjb250YWluaW5nIGEgZ2V0c2V0Ci0gIGRlc2NyaXB0b3IuCi0KLSAgVGhpcyBmaWVsZCBpcyBub3QgaW5oZXJpdGVkIGJ5IHN1YnR5cGVzIChjb21wdXRlZCBhdHRyaWJ1dGVzIGFyZQotICBpbmhlcml0ZWQgdGhyb3VnaCBhIGRpZmZlcmVudCBtZWNoYW5pc20pLgotCi0gIERvY3MgZm9yIFB5R2V0U2V0RGVmIChYWFggYmVsb25nIGVsc2V3aGVyZSk6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXR5cGVkZWYgUHlPYmplY3QgKigqZ2V0dGVyKShQeU9iamVjdCAqLCB2b2lkICopOwotdHlwZWRlZiBpbnQgKCpzZXR0ZXIpKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosIHZvaWQgKik7Ci0KLXR5cGVkZWYgc3RydWN0IFB5R2V0U2V0RGVmIHsKLSAgICBjaGFyICpuYW1lOyAgICAvKiBhdHRyaWJ1dGUgbmFtZSAqLwotICAgIGdldHRlciBnZXQ7ICAgIC8qIEMgZnVuY3Rpb24gdG8gZ2V0IHRoZSBhdHRyaWJ1dGUgKi8KLSAgICBzZXR0ZXIgc2V0OyAgICAvKiBDIGZ1bmN0aW9uIHRvIHNldCB0aGUgYXR0cmlidXRlICovCi0gICAgY2hhciAqZG9jOyAgICAgLyogb3B0aW9uYWwgZG9jIHN0cmluZyAqLwotICAgIHZvaWQgKmNsb3N1cmU7IC8qIG9wdGlvbmFsIGFkZGl0aW9uYWwgZGF0YSBmb3IgZ2V0dGVyIGFuZCBzZXR0ZXIgKi8KLX0gUHlHZXRTZXREZWY7Ci1cZW5ke3ZlcmJhdGltfQotXGVuZHtjbWVtYmVyZGVzY30KLQotXGJlZ2lue2NtZW1iZXJkZXNjfXtQeVR5cGVPYmplY3R9e1B5VHlwZU9iamVjdCp9e3RwX2Jhc2V9Ci0gIEFuIG9wdGlvbmFsIHBvaW50ZXIgdG8gYSBiYXNlIHR5cGUgZnJvbSB3aGljaCB0eXBlIHByb3BlcnRpZXMgYXJlCi0gIGluaGVyaXRlZC4gIEF0IHRoaXMgbGV2ZWwsIG9ubHkgc2luZ2xlIGluaGVyaXRhbmNlIGlzIHN1cHBvcnRlZDsKLSAgbXVsdGlwbGUgaW5oZXJpdGFuY2UgcmVxdWlyZSBkeW5hbWljYWxseSBjcmVhdGluZyBhIHR5cGUgb2JqZWN0IGJ5Ci0gIGNhbGxpbmcgdGhlIG1ldGF0eXBlLgotCi0gIFRoaXMgZmllbGQgaXMgbm90IGluaGVyaXRlZCBieSBzdWJ0eXBlcyAob2J2aW91c2x5KSwgYnV0IGl0IGRlZmF1bHRzCi0gIHRvIFxjb2Rle1wmUHlCYXNlT2JqZWN0X1R5cGV9ICh3aGljaCB0byBQeXRob24gcHJvZ3JhbW1lcnMgaXMga25vd24KLSAgYXMgdGhlIHR5cGUgXGNsYXNze29iamVjdH0pLgotXGVuZHtjbWVtYmVyZGVzY30KLQotXGJlZ2lue2NtZW1iZXJkZXNjfXtQeVR5cGVPYmplY3R9e1B5T2JqZWN0Kn17dHBfZGljdH0KLSAgVGhlIHR5cGUncyBkaWN0aW9uYXJ5IGlzIHN0b3JlZCBoZXJlIGJ5IFxjZnVuY3Rpb257UHlUeXBlX1JlYWR5KCl9LgotCi0gIFRoaXMgZmllbGQgc2hvdWxkIG5vcm1hbGx5IGJlIGluaXRpYWxpemVkIHRvIFxOVUxMe30gYmVmb3JlCi0gIFB5VHlwZV9SZWFkeSBpcyBjYWxsZWQ7IGl0IG1heSBhbHNvIGJlIGluaXRpYWxpemVkIHRvIGEgZGljdGlvbmFyeQotICBjb250YWluaW5nIGluaXRpYWwgYXR0cmlidXRlcyBmb3IgdGhlIHR5cGUuICBPbmNlCi0gIFxjZnVuY3Rpb257UHlUeXBlX1JlYWR5KCl9IGhhcyBpbml0aWFsaXplZCB0aGUgdHlwZSwgZXh0cmEKLSAgYXR0cmlidXRlcyBmb3IgdGhlIHR5cGUgbWF5IGJlIGFkZGVkIHRvIHRoaXMgZGljdGlvbmFyeSBvbmx5IGlmIHRoZXkKLSAgZG9uJ3QgY29ycmVzcG9uZCB0byBvdmVybG9hZGVkIG9wZXJhdGlvbnMgKGxpa2UgXG1ldGhvZHtfX2FkZF9fKCl9KS4KLQotICBUaGlzIGZpZWxkIGlzIG5vdCBpbmhlcml0ZWQgYnkgc3VidHlwZXMgKHRob3VnaCB0aGUgYXR0cmlidXRlcwotICBkZWZpbmVkIGluIGhlcmUgYXJlIGluaGVyaXRlZCB0aHJvdWdoIGEgZGlmZmVyZW50IG1lY2hhbmlzbSkuCi1cZW5ke2NtZW1iZXJkZXNjfQotCi1cYmVnaW57Y21lbWJlcmRlc2N9e1B5VHlwZU9iamVjdH17ZGVzY3JnZXRmdW5jfXt0cF9kZXNjcl9nZXR9Ci0gIEFuIG9wdGlvbmFsIHBvaW50ZXIgdG8gYSAiZGVzY3JpcHRvciBnZXQiIGZ1bmN0aW9uLgotCi0KLSAgVGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSBpcwotCi1cYmVnaW57dmVyYmF0aW19Ci1QeU9iamVjdCAqIHRwX2Rlc2NyX2dldChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKnR5cGUpOwotXGVuZHt2ZXJiYXRpbX0KLQotICBYWFggYmxhaCwgYmxhaC4KLQotICBUaGlzIGZpZWxkIGlzIGluaGVyaXRlZCBieSBzdWJ0eXBlcy4KLVxlbmR7Y21lbWJlcmRlc2N9Ci0KLVxiZWdpbntjbWVtYmVyZGVzY317UHlUeXBlT2JqZWN0fXtkZXNjcnNldGZ1bmN9e3RwX2Rlc2NyX3NldH0KLSAgQW4gb3B0aW9uYWwgcG9pbnRlciB0byBhICJkZXNjcmlwdG9yIHNldCIgZnVuY3Rpb24uCi0KLSAgVGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSBpcwotCi1cYmVnaW57dmVyYmF0aW19Ci1pbnQgdHBfZGVzY3Jfc2V0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqdmFsdWUpOwotXGVuZHt2ZXJiYXRpbX0KLQotICBUaGlzIGZpZWxkIGlzIGluaGVyaXRlZCBieSBzdWJ0eXBlcy4KLQotICBYWFggYmxhaCwgYmxhaC4KLQotXGVuZHtjbWVtYmVyZGVzY30KLQotXGJlZ2lue2NtZW1iZXJkZXNjfXtQeVR5cGVPYmplY3R9e2xvbmd9e3RwX2RpY3RvZmZzZXR9Ci0gIElmIHRoZSBpbnN0YW5jZXMgb2YgdGhpcyB0eXBlIGhhdmUgYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgaW5zdGFuY2UKLSAgdmFyaWFibGVzLCB0aGlzIGZpZWxkIGlzIG5vbi16ZXJvIGFuZCBjb250YWlucyB0aGUgb2Zmc2V0IGluIHRoZQotICBpbnN0YW5jZXMgb2YgdGhlIHR5cGUgb2YgdGhlIGluc3RhbmNlIHZhcmlhYmxlIGRpY3Rpb25hcnk7IHRoaXMKLSAgb2Zmc2V0IGlzIHVzZWQgYnkgXGNmdW5jdGlvbntQeU9iamVjdF9HZW5lcmljR2V0QXR0cigpfS4KLQotICBEbyBub3QgY29uZnVzZSB0aGlzIGZpZWxkIHdpdGggXG1lbWJlcnt0cF9kaWN0fTsgdGhhdCBpcyB0aGUKLSAgZGljdGlvbmFyeSBmb3IgYXR0cmlidXRlcyBvZiB0aGUgdHlwZSBvYmplY3QgaXRzZWxmLgotCi0gIElmIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLCBpdCBzcGVjaWZpZXMgdGhlCi0gIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgaW5zdGFuY2Ugc3RydWN0dXJlLiAgSWYgdGhlIHZhbHVlIGlzCi0gIGxlc3MgdGhhbiB6ZXJvLCBpdCBzcGVjaWZpZXMgdGhlIG9mZnNldCBmcm9tIHRoZSBcZW1waHtlbmR9IG9mIHRoZQotICBpbnN0YW5jZSBzdHJ1Y3R1cmUuICBBIG5lZ2F0aXZlIG9mZnNldCBpcyBtb3JlIGV4cGVuc2l2ZSB0byB1c2UsIGFuZAotICBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gdGhlIGluc3RhbmNlIHN0cnVjdHVyZSBjb250YWlucyBhCi0gIHZhcmlhYmxlLWxlbmd0aCBwYXJ0LiAgVGhpcyBpcyB1c2VkIGZvciBleGFtcGxlIHRvIGFkZCBhbiBpbnN0YW5jZQotICB2YXJpYWJsZSBkaWN0aW9uYXJ5IHRvIHN1YnR5cGVzIG9mIFxjbGFzc3tzdHJ9IG9yIFxjbGFzc3t0dXBsZX0uCi0gIE5vdGUgdGhhdCB0aGUgXG1lbWJlcnt0cF9iYXNpY3NpemV9IGZpZWxkIHNob3VsZCBhY2NvdW50IGZvciB0aGUKLSAgZGljdGlvbmFyeSBhZGRlZCB0byB0aGUgZW5kIGluIHRoYXQgY2FzZSwgZXZlbiB0aG91Z2ggdGhlIGRpY3Rpb25hcnkKLSAgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBiYXNpYyBvYmplY3QgbGF5b3V0LiAgT24gYSBzeXN0ZW0gd2l0aCBhCi0gIHBvaW50ZXIgc2l6ZSBvZiA0IGJ5dGVzLCBcbWVtYmVye3RwX2RpY3RvZmZzZXR9IHNob3VsZCBiZSBzZXQgdG8KLSAgXGNvZGV7LTR9IHRvIGluZGljYXRlIHRoYXQgdGhlIGRpY3Rpb25hcnkgaXMgYXQgdGhlIHZlcnkgZW5kIG9mIHRoZQotICBzdHJ1Y3R1cmUuCi0KLSAgVGhlIHJlYWwgZGljdGlvbmFyeSBvZmZzZXQgaW4gYW4gaW5zdGFuY2UgY2FuIGJlIGNvbXB1dGVkIGZyb20gYQotICBuZWdhdGl2ZSBcbWVtYmVye3RwX2RpY3RvZmZzZXR9IGFzIGZvbGxvd3M6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWRpY3RvZmZzZXQgPSB0cF9iYXNpY3NpemUgKyBhYnMob2Jfc2l6ZSkqdHBfaXRlbXNpemUgKyB0cF9kaWN0b2Zmc2V0Ci1pZiBkaWN0b2Zmc2V0IGlzIG5vdCBhbGlnbmVkIG9uIHNpemVvZih2b2lkKik6Ci0gICAgcm91bmQgdXAgdG8gc2l6ZW9mKHZvaWQqKQotXGVuZHt2ZXJiYXRpbX0KLQotICB3aGVyZSBcbWVtYmVye3RwX2Jhc2ljc2l6ZX0sIFxtZW1iZXJ7dHBfaXRlbXNpemV9IGFuZAotICBcbWVtYmVye3RwX2RpY3RvZmZzZXR9IGFyZSB0YWtlbiBmcm9tIHRoZSB0eXBlIG9iamVjdCwgYW5kCi0gIFxtZW1iZXJ7b2Jfc2l6ZX0gaXMgdGFrZW4gZnJvbSB0aGUgaW5zdGFuY2UuICBUaGUgYWJzb2x1dGUgdmFsdWUgaXMKLSAgdGFrZW4gYmVjYXVzZSBsb25nIGludHMgdXNlIHRoZSBzaWduIG9mIFxtZW1iZXJ7b2Jfc2l6ZX0gdG8gc3RvcmUKLSAgdGhlIHNpZ24gb2YgdGhlIG51bWJlci4gIChUaGVyZSdzIG5ldmVyIGEgbmVlZCB0byBkbyB0aGlzCi0gIGNhbGN1bGF0aW9uIHlvdXJzZWxmOyBpdCBpcyBkb25lIGZvciB5b3UgYnkKLSAgXGNmdW5jdGlvbntfUHlPYmplY3RfR2V0RGljdFB0cigpfS4pCi0KLSAgVGhpcyBmaWVsZCBpcyBpbmhlcml0ZWQgYnkgc3VidHlwZXMsIGJ1dCBzZWUgdGhlIHJ1bGVzIGxpc3RlZCBiZWxvdy4KLSAgQSBzdWJ0eXBlIG1heSBvdmVycmlkZSB0aGlzIG9mZnNldDsgdGhpcyBtZWFucyB0aGF0IHRoZSBzdWJ0eXBlCi0gIGluc3RhbmNlcyBzdG9yZSB0aGUgZGljdGlvbmFyeSBhdCBhIGRpZmZlcmVuY2Ugb2Zmc2V0IHRoYW4gdGhlIGJhc2UKLSAgdHlwZS4gIFNpbmNlIHRoZSBkaWN0aW9uYXJ5IGlzIGFsd2F5cyBmb3VuZCB2aWEKLSAgXG1lbWJlcnt0cF9kaWN0b2Zmc2V0fSwgdGhpcyBzaG91bGQgbm90IGJlIGEgcHJvYmxlbS4KLQotICBXaGVuIGEgdHlwZSBkZWZpbmVkIGJ5IGEgY2xhc3Mgc3RhdGVtZW50IGhhcyBubyBcbWVtYmVye19fc2xvdHNfX30KLSAgZGVjbGFyYXRpb24sIGFuZCBub25lIG9mIGl0cyBiYXNlIHR5cGVzIGhhcyBhbiBpbnN0YW5jZSB2YXJpYWJsZQotICBkaWN0aW9uYXJ5LCBhIGRpY3Rpb25hcnkgc2xvdCBpcyBhZGRlZCB0byB0aGUgaW5zdGFuY2UgbGF5b3V0IGFuZAotICB0aGUgXG1lbWJlcnt0cF9kaWN0b2Zmc2V0fSBpcyBzZXQgdG8gdGhhdCBzbG90J3Mgb2Zmc2V0LgotCi0gIFdoZW4gYSB0eXBlIGRlZmluZWQgYnkgYSBjbGFzcyBzdGF0ZW1lbnQgaGFzIGEgXG1lbWJlcntfX3Nsb3RzX199Ci0gIGRlY2xhcmF0aW9uLCB0aGUgdHlwZSBpbmhlcml0cyBpdHMgXG1lbWJlcnt0cF9kaWN0b2Zmc2V0fSBmcm9tIGl0cwotICBiYXNlIHR5cGUuCi0KLSAgKEFkZGluZyBhIHNsb3QgbmFtZWQgXG1lbWJlcntfX2RpY3RfX30gdG8gdGhlIFxtZW1iZXJ7X19zbG90c19ffQotICBkZWNsYXJhdGlvbiBkb2VzIG5vdCBoYXZlIHRoZSBleHBlY3RlZCBlZmZlY3QsIGl0IGp1c3QgY2F1c2VzCi0gIGNvbmZ1c2lvbi4gIE1heWJlIHRoaXMgc2hvdWxkIGJlIGFkZGVkIGFzIGEgZmVhdHVyZSBqdXN0IGxpa2UKLSAgXG1lbWJlcntfX3dlYWtyZWZfX30gdGhvdWdoLikKLVxlbmR7Y21lbWJlcmRlc2N9Ci0KLVxiZWdpbntjbWVtYmVyZGVzY317UHlUeXBlT2JqZWN0fXtpbml0cHJvY317dHBfaW5pdH0KLSAgQW4gb3B0aW9uYWwgcG9pbnRlciB0byBhbiBpbnN0YW5jZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi4KLQotICBUaGlzIGZ1bmN0aW9uIGNvcnJlc3BvbmRzIHRvIHRoZSBcbWV0aG9ke19faW5pdF9fKCl9IG1ldGhvZCBvZgotICBjbGFzc2VzLiAgTGlrZSBcbWV0aG9ke19faW5pdF9fKCl9LCBpdCBpcyBwb3NzaWJsZSB0byBjcmVhdGUgYW4KLSAgaW5zdGFuY2Ugd2l0aG91dCBjYWxsaW5nIFxtZXRob2R7X19pbml0X18oKX0sIGFuZCBpdCBpcyBwb3NzaWJsZSB0bwotICByZWluaXRpYWxpemUgYW4gaW5zdGFuY2UgYnkgY2FsbGluZyBpdHMgXG1ldGhvZHtfX2luaXRfXygpfSBtZXRob2QKLSAgYWdhaW4uCi0KLSAgVGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSBpcwotCi1cYmVnaW57dmVyYmF0aW19Ci1pbnQgdHBfaW5pdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQotXGVuZHt2ZXJiYXRpbX0KLQotICBUaGUgc2VsZiBhcmd1bWVudCBpcyB0aGUgaW5zdGFuY2UgdG8gYmUgaW5pdGlhbGl6ZWQ7IHRoZSBcdmFye2FyZ3N9Ci0gIGFuZCBcdmFye2t3ZHN9IGFyZ3VtZW50cyByZXByZXNlbnQgcG9zaXRpb25hbCBhbmQga2V5d29yZCBhcmd1bWVudHMKLSAgb2YgdGhlIGNhbGwgdG8gXG1ldGhvZHtfX2luaXRfXygpfS4KLQotICBUaGUgXG1lbWJlcnt0cF9pbml0fSBmdW5jdGlvbiwgaWYgbm90IFxOVUxMLCBpcyBjYWxsZWQgd2hlbiBhbgotICBpbnN0YW5jZSBpcyBjcmVhdGVkIG5vcm1hbGx5IGJ5IGNhbGxpbmcgaXRzIHR5cGUsIGFmdGVyIHRoZSB0eXBlJ3MKLSAgXG1lbWJlcnt0cF9uZXd9IGZ1bmN0aW9uIGhhcyByZXR1cm5lZCBhbiBpbnN0YW5jZSBvZiB0aGUgdHlwZS4gIElmCi0gIHRoZSBcbWVtYmVye3RwX25ld30gZnVuY3Rpb24gcmV0dXJucyBhbiBpbnN0YW5jZSBvZiBzb21lIG90aGVyIHR5cGUKLSAgdGhhdCBpcyBub3QgYSBzdWJ0eXBlIG9mIHRoZSBvcmlnaW5hbCB0eXBlLCBubyBcbWVtYmVye3RwX2luaXR9Ci0gIGZ1bmN0aW9uIGlzIGNhbGxlZDsgaWYgXG1lbWJlcnt0cF9uZXd9IHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgYQotICBzdWJ0eXBlIG9mIHRoZSBvcmlnaW5hbCB0eXBlLCB0aGUgc3VidHlwZSdzIFxtZW1iZXJ7dHBfaW5pdH0gaXMKLSAgY2FsbGVkLiAgKFZFUlNJT04gTk9URTogZGVzY3JpYmVkIGhlcmUgaXMgd2hhdCBpcyBpbXBsZW1lbnRlZCBpbgotICBQeXRob24gMi4yLjEgYW5kIGxhdGVyLiAgSW4gUHl0aG9uIDIuMiwgdGhlIFxtZW1iZXJ7dHBfaW5pdH0gb2YgdGhlCi0gIHR5cGUgb2YgdGhlIG9iamVjdCByZXR1cm5lZCBieSBcbWVtYmVye3RwX25ld30gd2FzIGFsd2F5cyBjYWxsZWQsIGlmCi0gIG5vdCBcTlVMTC4pCi0KLSAgVGhpcyBmaWVsZCBpcyBpbmhlcml0ZWQgYnkgc3VidHlwZXMuCi1cZW5ke2NtZW1iZXJkZXNjfQotCi1cYmVnaW57Y21lbWJlcmRlc2N9e1B5VHlwZU9iamVjdH17YWxsb2NmdW5jfXt0cF9hbGxvY30KLSAgQW4gb3B0aW9uYWwgcG9pbnRlciB0byBhbiBpbnN0YW5jZSBhbGxvY2F0aW9uIGZ1bmN0aW9uLgotCi0gIFRoZSBmdW5jdGlvbiBzaWduYXR1cmUgaXMKLQotXGJlZ2lue3ZlcmJhdGltfQotUHlPYmplY3QgKnRwX2FsbG9jKFB5VHlwZU9iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBuaXRlbXMpCi1cZW5ke3ZlcmJhdGltfQotCi0gIFRoZSBwdXJwb3NlIG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gc2VwYXJhdGUgbWVtb3J5IGFsbG9jYXRpb24gZnJvbQotICBtZW1vcnkgaW5pdGlhbGl6YXRpb24uICBJdCBzaG91bGQgcmV0dXJuIGEgcG9pbnRlciB0byBhIGJsb2NrIG9mCi0gIG1lbW9yeSBvZiBhZGVxdWF0ZSBsZW5ndGggZm9yIHRoZSBpbnN0YW5jZSwgc3VpdGFibHkgYWxpZ25lZCwgYW5kCi0gIGluaXRpYWxpemVkIHRvIHplcm9zLCBidXQgd2l0aCBcbWVtYmVye29iX3JlZmNudH0gc2V0IHRvIFxjb2RlezF9Ci0gIGFuZCBcbWVtYmVye29iX3R5cGV9IHNldCB0byB0aGUgdHlwZSBhcmd1bWVudC4gIElmIHRoZSB0eXBlJ3MKLSAgXG1lbWJlcnt0cF9pdGVtc2l6ZX0gaXMgbm9uLXplcm8sIHRoZSBvYmplY3QncyBcbWVtYmVye29iX3NpemV9IGZpZWxkCi0gIHNob3VsZCBiZSBpbml0aWFsaXplZCB0byBcdmFye25pdGVtc30gYW5kIHRoZSBsZW5ndGggb2YgdGhlCi0gIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2sgc2hvdWxkIGJlIFxjb2Rle3RwX2Jhc2ljc2l6ZSArCi0gIFx2YXJ7bml0ZW1zfSp0cF9pdGVtc2l6ZX0sIHJvdW5kZWQgdXAgdG8gYSBtdWx0aXBsZSBvZgotICBcY29kZXtzaXplb2Yodm9pZCopfTsgb3RoZXJ3aXNlLCBcdmFye25pdGVtc30gaXMgbm90IHVzZWQgYW5kIHRoZQotICBsZW5ndGggb2YgdGhlIGJsb2NrIHNob3VsZCBiZSBcbWVtYmVye3RwX2Jhc2ljc2l6ZX0uCi0KLSAgRG8gbm90IHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGRvIGFueSBvdGhlciBpbnN0YW5jZSBpbml0aWFsaXphdGlvbiwKLSAgbm90IGV2ZW4gdG8gYWxsb2NhdGUgYWRkaXRpb25hbCBtZW1vcnk7IHRoYXQgc2hvdWxkIGJlIGRvbmUgYnkKLSAgXG1lbWJlcnt0cF9uZXd9LgotCi0gIFRoaXMgZmllbGQgaXMgaW5oZXJpdGVkIGJ5IHN0YXRpYyBzdWJ0eXBlcywgYnV0IG5vdCBieSBkeW5hbWljCi0gIHN1YnR5cGVzIChzdWJ0eXBlcyBjcmVhdGVkIGJ5IGEgY2xhc3Mgc3RhdGVtZW50KTsgaW4gdGhlIGxhdHRlciwKLSAgdGhpcyBmaWVsZCBpcyBhbHdheXMgc2V0IHRvIFxjZnVuY3Rpb257UHlUeXBlX0dlbmVyaWNBbGxvY30sIHRvCi0gIGZvcmNlIGEgc3RhbmRhcmQgaGVhcCBhbGxvY2F0aW9uIHN0cmF0ZWd5LiAgVGhhdCBpcyBhbHNvIHRoZQotICByZWNvbW1lbmRlZCB2YWx1ZSBmb3Igc3RhdGljYWxseSBkZWZpbmVkIHR5cGVzLgotXGVuZHtjbWVtYmVyZGVzY30KLQotXGJlZ2lue2NtZW1iZXJkZXNjfXtQeVR5cGVPYmplY3R9e25ld2Z1bmN9e3RwX25ld30KLSAgQW4gb3B0aW9uYWwgcG9pbnRlciB0byBhbiBpbnN0YW5jZSBjcmVhdGlvbiBmdW5jdGlvbi4KLQotICBJZiB0aGlzIGZ1bmN0aW9uIGlzIFxOVUxMe30gZm9yIGEgcGFydGljdWxhciB0eXBlLCB0aGF0IHR5cGUgY2Fubm90Ci0gIGJlIGNhbGxlZCB0byBjcmVhdGUgbmV3IGluc3RhbmNlczsgcHJlc3VtYWJseSB0aGVyZSBpcyBzb21lIG90aGVyCi0gIHdheSB0byBjcmVhdGUgaW5zdGFuY2VzLCBsaWtlIGEgZmFjdG9yeSBmdW5jdGlvbi4KLQotICBUaGUgZnVuY3Rpb24gc2lnbmF0dXJlIGlzCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLVB5T2JqZWN0ICp0cF9uZXcoUHlUeXBlT2JqZWN0ICpzdWJ0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCi1cZW5ke3ZlcmJhdGltfQotCi0gIFRoZSBzdWJ0eXBlIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgYmVpbmcgY3JlYXRlZDsgdGhlCi0gIFx2YXJ7YXJnc30gYW5kIFx2YXJ7a3dkc30gYXJndW1lbnRzIHJlcHJlc2VudCBwb3NpdGlvbmFsIGFuZCBrZXl3b3JkCi0gIGFyZ3VtZW50cyBvZiB0aGUgY2FsbCB0byB0aGUgdHlwZS4gIE5vdGUgdGhhdCBzdWJ0eXBlIGRvZXNuJ3QgaGF2ZQotICB0byBlcXVhbCB0aGUgdHlwZSB3aG9zZSBcbWVtYmVye3RwX25ld30gZnVuY3Rpb24gaXMgY2FsbGVkOyBpdCBtYXkKLSAgYmUgYSBzdWJ0eXBlIG9mIHRoYXQgdHlwZSAoYnV0IG5vdCBhbiB1bnJlbGF0ZWQgdHlwZSkuCi0KLSAgVGhlIFxtZW1iZXJ7dHBfbmV3fSBmdW5jdGlvbiBzaG91bGQgY2FsbAotICBcY29kZXtcdmFye3N1YnR5cGV9LT50cF9hbGxvYyhcdmFye3N1YnR5cGV9LCBcdmFye25pdGVtc30pfSB0bwotICBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIG9iamVjdCwgYW5kIHRoZW4gZG8gb25seSBhcyBtdWNoIGZ1cnRoZXIKLSAgaW5pdGlhbGl6YXRpb24gYXMgaXMgYWJzb2x1dGVseSBuZWNlc3NhcnkuICBJbml0aWFsaXphdGlvbiB0aGF0IGNhbgotICBzYWZlbHkgYmUgaWdub3JlZCBvciByZXBlYXRlZCBzaG91bGQgYmUgcGxhY2VkIGluIHRoZQotICBcbWVtYmVye3RwX2luaXR9IGhhbmRsZXIuICBBIGdvb2QgcnVsZSBvZiB0aHVtYiBpcyB0aGF0IGZvcgotICBpbW11dGFibGUgdHlwZXMsIGFsbCBpbml0aWFsaXphdGlvbiBzaG91bGQgdGFrZSBwbGFjZSBpbgotICBcbWVtYmVye3RwX25ld30sIHdoaWxlIGZvciBtdXRhYmxlIHR5cGVzLCBtb3N0IGluaXRpYWxpemF0aW9uIHNob3VsZAotICBiZSBkZWZlcnJlZCB0byBcbWVtYmVye3RwX2luaXR9LgotCi0gIFRoaXMgZmllbGQgaXMgaW5oZXJpdGVkIGJ5IHN1YnR5cGVzLCBleGNlcHQgaXQgaXMgbm90IGluaGVyaXRlZCBieQotICBzdGF0aWMgdHlwZXMgd2hvc2UgXG1lbWJlcnt0cF9iYXNlfSBpcyBcTlVMTHt9IG9yCi0gIFxjb2Rle1wmUHlCYXNlT2JqZWN0X1R5cGV9LiAgVGhlIGxhdHRlciBleGNlcHRpb24gaXMgYSBwcmVjYXV0aW9uIHNvCi0gIHRoYXQgb2xkIGV4dGVuc2lvbiB0eXBlcyBkb24ndCBiZWNvbWUgY2FsbGFibGUgc2ltcGx5IGJ5IGJlaW5nCi0gIGxpbmtlZCB3aXRoIFB5dGhvbiAyLjIuCi1cZW5ke2NtZW1iZXJkZXNjfQotCi1cYmVnaW57Y21lbWJlcmRlc2N9e1B5VHlwZU9iamVjdH17ZGVzdHJ1Y3Rvcn17dHBfZnJlZX0KLSAgQW4gb3B0aW9uYWwgcG9pbnRlciB0byBhbiBpbnN0YW5jZSBkZWFsbG9jYXRpb24gZnVuY3Rpb24uCi0KLSAgVGhlIHNpZ25hdHVyZSBvZiB0aGlzIGZ1bmN0aW9uIGhhcyBjaGFuZ2VkIHNsaWdodGx5OiBpbiBQeXRob24KLSAgMi4yIGFuZCAyLjIuMSwgaXRzIHNpZ25hdHVyZSBpcyBcY3R5cGV7ZGVzdHJ1Y3Rvcn06Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXZvaWQgdHBfZnJlZShQeU9iamVjdCAqKQotXGVuZHt2ZXJiYXRpbX0KLQotICBJbiBQeXRob24gMi4zIGFuZCBiZXlvbmQsIGl0cyBzaWduYXR1cmUgaXMgXGN0eXBle2ZyZWVmdW5jfToKLQotXGJlZ2lue3ZlcmJhdGltfQotdm9pZCB0cF9mcmVlKHZvaWQgKikKLVxlbmR7dmVyYmF0aW19Ci0KLSAgVGhlIG9ubHkgaW5pdGlhbGl6ZXIgdGhhdCBpcyBjb21wYXRpYmxlIHdpdGggYm90aCB2ZXJzaW9ucyBpcwotICBcY29kZXtfUHlPYmplY3RfRGVsfSwgd2hvc2UgZGVmaW5pdGlvbiBoYXMgc3VpdGFibHkgYWRhcHRlZCBpbgotICBQeXRob24gMi4zLgotCi0gIFRoaXMgZmllbGQgaXMgaW5oZXJpdGVkIGJ5IHN0YXRpYyBzdWJ0eXBlcywgYnV0IG5vdCBieSBkeW5hbWljCi0gIHN1YnR5cGVzIChzdWJ0eXBlcyBjcmVhdGVkIGJ5IGEgY2xhc3Mgc3RhdGVtZW50KTsgaW4gdGhlIGxhdHRlciwKLSAgdGhpcyBmaWVsZCBpcyBzZXQgdG8gYSBkZWFsbG9jYXRvciBzdWl0YWJsZSB0byBtYXRjaAotICBcY2Z1bmN0aW9ue1B5VHlwZV9HZW5lcmljQWxsb2MoKX0gYW5kIHRoZSB2YWx1ZSBvZiB0aGUKLSAgXGNvbnN0YW50e1B5X1RQRkxBR1NfSEFWRV9HQ30gZmxhZyBiaXQuCi1cZW5ke2NtZW1iZXJkZXNjfQotCi1cYmVnaW57Y21lbWJlcmRlc2N9e1B5VHlwZU9iamVjdH17aW5xdWlyeX17dHBfaXNfZ2N9Ci0gIEFuIG9wdGlvbmFsIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiBjYWxsZWQgYnkgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLgotCi0gIFRoZSBnYXJiYWdlIGNvbGxlY3RvciBuZWVkcyB0byBrbm93IHdoZXRoZXIgYSBwYXJ0aWN1bGFyIG9iamVjdCBpcwotICBjb2xsZWN0aWJsZSBvciBub3QuICBOb3JtYWxseSwgaXQgaXMgc3VmZmljaWVudCB0byBsb29rIGF0IHRoZQotICBvYmplY3QncyB0eXBlJ3MgXG1lbWJlcnt0cF9mbGFnc30gZmllbGQsIGFuZCBjaGVjayB0aGUKLSAgXGNvbnN0YW50e1B5X1RQRkxBR1NfSEFWRV9HQ30gZmxhZyBiaXQuICBCdXQgc29tZSB0eXBlcyBoYXZlIGEKLSAgbWl4dHVyZSBvZiBzdGF0aWNhbGx5IGFuZCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgaW5zdGFuY2VzLCBhbmQgdGhlCi0gIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGluc3RhbmNlcyBhcmUgbm90IGNvbGxlY3RpYmxlLiAgU3VjaCB0eXBlcwotICBzaG91bGQgZGVmaW5lIHRoaXMgZnVuY3Rpb247IGl0IHNob3VsZCByZXR1cm4gXGNvZGV7MX0gZm9yIGEKLSAgY29sbGVjdGlibGUgaW5zdGFuY2UsIGFuZCBcY29kZXswfSBmb3IgYSBub24tY29sbGVjdGlibGUgaW5zdGFuY2UuCi0gIFRoZSBzaWduYXR1cmUgaXMKLQotXGJlZ2lue3ZlcmJhdGltfQotaW50IHRwX2lzX2djKFB5T2JqZWN0ICpzZWxmKQotXGVuZHt2ZXJiYXRpbX0KLQotICAoVGhlIG9ubHkgZXhhbXBsZSBvZiB0aGlzIGFyZSB0eXBlcyB0aGVtc2VsdmVzLiAgVGhlIG1ldGF0eXBlLAotICBcY2RhdGF7UHlUeXBlX1R5cGV9LCBkZWZpbmVzIHRoaXMgZnVuY3Rpb24gdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbgotICBzdGF0aWNhbGx5IGFuZCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgdHlwZXMuKQotCi0gIFRoaXMgZmllbGQgaXMgaW5oZXJpdGVkIGJ5IHN1YnR5cGVzLiAgKFZFUlNJT04gTk9URTogaW4gUHl0aG9uCi0gIDIuMiwgaXQgd2FzIG5vdCBpbmhlcml0ZWQuICBJdCBpcyBpbmhlcml0ZWQgaW4gMi4yLjEgYW5kIGxhdGVyCi0gIHZlcnNpb25zLikKLVxlbmR7Y21lbWJlcmRlc2N9Ci0KLVxiZWdpbntjbWVtYmVyZGVzY317UHlUeXBlT2JqZWN0fXtQeU9iamVjdCp9e3RwX2Jhc2VzfQotICBUdXBsZSBvZiBiYXNlIHR5cGVzLgotCi0gIFRoaXMgaXMgc2V0IGZvciB0eXBlcyBjcmVhdGVkIGJ5IGEgY2xhc3Mgc3RhdGVtZW50LiAgSXQgc2hvdWxkIGJlCi0gIFxOVUxMe30gZm9yIHN0YXRpY2FsbHkgZGVmaW5lZCB0eXBlcy4KLQotICBUaGlzIGZpZWxkIGlzIG5vdCBpbmhlcml0ZWQuCi1cZW5ke2NtZW1iZXJkZXNjfQotCi1cYmVnaW57Y21lbWJlcmRlc2N9e1B5VHlwZU9iamVjdH17UHlPYmplY3QqfXt0cF9tcm99Ci0gIFR1cGxlIGNvbnRhaW5pbmcgdGhlIGV4cGFuZGVkIHNldCBvZiBiYXNlIHR5cGVzLCBzdGFydGluZyB3aXRoIHRoZQotICB0eXBlIGl0c2VsZiBhbmQgZW5kaW5nIHdpdGggXGNsYXNze29iamVjdH0sIGluIE1ldGhvZCBSZXNvbHV0aW9uCi0gIE9yZGVyLgotCi0gIFRoaXMgZmllbGQgaXMgbm90IGluaGVyaXRlZDsgaXQgaXMgY2FsY3VsYXRlZCBmcmVzaCBieQotICBcY2Z1bmN0aW9ue1B5VHlwZV9SZWFkeSgpfS4KLVxlbmR7Y21lbWJlcmRlc2N9Ci0KLVxiZWdpbntjbWVtYmVyZGVzY317UHlUeXBlT2JqZWN0fXtQeU9iamVjdCp9e3RwX2NhY2hlfQotICBVbnVzZWQuICBOb3QgaW5oZXJpdGVkLiAgSW50ZXJuYWwgdXNlIG9ubHkuCi1cZW5ke2NtZW1iZXJkZXNjfQotCi1cYmVnaW57Y21lbWJlcmRlc2N9e1B5VHlwZU9iamVjdH17UHlPYmplY3QqfXt0cF9zdWJjbGFzc2VzfQotICBMaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyB0byBzdWJjbGFzc2VzLiAgTm90IGluaGVyaXRlZC4gIEludGVybmFsCi0gIHVzZSBvbmx5LgotXGVuZHtjbWVtYmVyZGVzY30KLQotXGJlZ2lue2NtZW1iZXJkZXNjfXtQeVR5cGVPYmplY3R9e1B5T2JqZWN0Kn17dHBfd2Vha2xpc3R9Ci0gIFdlYWsgcmVmZXJlbmNlIGxpc3QgaGVhZCwgZm9yIHdlYWsgcmVmZXJlbmNlcyB0byB0aGlzIHR5cGUKLSAgb2JqZWN0LiAgTm90IGluaGVyaXRlZC4gIEludGVybmFsIHVzZSBvbmx5LgotXGVuZHtjbWVtYmVyZGVzY30KLQotVGhlIHJlbWFpbmluZyBmaWVsZHMgYXJlIG9ubHkgZGVmaW5lZCBpZiB0aGUgZmVhdHVyZSB0ZXN0IG1hY3JvCi1cY29uc3RhbnR7Q09VTlRfQUxMT0NTfSBpcyBkZWZpbmVkLCBhbmQgYXJlIGZvciBpbnRlcm5hbCB1c2Ugb25seS4KLVRoZXkgYXJlIGRvY3VtZW50ZWQgaGVyZSBmb3IgY29tcGxldGVuZXNzLiAgTm9uZSBvZiB0aGVzZSBmaWVsZHMgYXJlCi1pbmhlcml0ZWQgYnkgc3VidHlwZXMuCi0KLVxiZWdpbntjbWVtYmVyZGVzY317UHlUeXBlT2JqZWN0fXtQeV9zc2l6ZV90fXt0cF9hbGxvY3N9Ci0gIE51bWJlciBvZiBhbGxvY2F0aW9ucy4KLVxlbmR7Y21lbWJlcmRlc2N9Ci0KLVxiZWdpbntjbWVtYmVyZGVzY317UHlUeXBlT2JqZWN0fXtQeV9zc2l6ZV90fXt0cF9mcmVlc30KLSAgTnVtYmVyIG9mIGZyZWVzLgotXGVuZHtjbWVtYmVyZGVzY30KLQotXGJlZ2lue2NtZW1iZXJkZXNjfXtQeVR5cGVPYmplY3R9e1B5X3NzaXplX3R9e3RwX21heGFsbG9jfQotICBNYXhpbXVtIHNpbXVsdGFuZW91c2x5IGFsbG9jYXRlZCBvYmplY3RzLgotXGVuZHtjbWVtYmVyZGVzY30KLQotXGJlZ2lue2NtZW1iZXJkZXNjfXtQeVR5cGVPYmplY3R9e1B5VHlwZU9iamVjdCp9e3RwX25leHR9Ci0gIFBvaW50ZXIgdG8gdGhlIG5leHQgdHlwZSBvYmplY3Qgd2l0aCBhIG5vbi16ZXJvIFxtZW1iZXJ7dHBfYWxsb2NzfQotICBmaWVsZC4KLVxlbmR7Y21lbWJlcmRlc2N9Ci0KLUFsc28sIG5vdGUgdGhhdCwgaW4gYSBnYXJiYWdlIGNvbGxlY3RlZCBQeXRob24sIHRwX2RlYWxsb2MgbWF5IGJlCi1jYWxsZWQgZnJvbSBhbnkgUHl0aG9uIHRocmVhZCwgbm90IGp1c3QgdGhlIHRocmVhZCB3aGljaCBjcmVhdGVkIHRoZQotb2JqZWN0IChpZiB0aGUgb2JqZWN0IGJlY29tZXMgcGFydCBvZiBhIHJlZmNvdW50IGN5Y2xlLCB0aGF0IGN5Y2xlCi1taWdodCBiZSBjb2xsZWN0ZWQgYnkgYSBnYXJiYWdlIGNvbGxlY3Rpb24gb24gYW55IHRocmVhZCkuICBUaGlzIGlzCi1ub3QgYSBwcm9ibGVtIGZvciBQeXRob24gQVBJIGNhbGxzLCBzaW5jZSB0aGUgdGhyZWFkIG9uIHdoaWNoCi10cF9kZWFsbG9jIGlzIGNhbGxlZCB3aWxsIG93biB0aGUgR2xvYmFsIEludGVycHJldGVyIExvY2sgKEdJTCkuCi1Ib3dldmVyLCBpZiB0aGUgb2JqZWN0IGJlaW5nIGRlc3Ryb3llZCBpbiB0dXJuIGRlc3Ryb3lzIG9iamVjdHMgZnJvbQotc29tZSBvdGhlciBDIG9yIFxDcHB7fSBsaWJyYXJ5LCBjYXJlIHNob3VsZCBiZSB0YWtlbiB0byBlbnN1cmUgdGhhdAotZGVzdHJveWluZyB0aG9zZSBvYmplY3RzIG9uIHRoZSB0aHJlYWQgd2hpY2ggY2FsbGVkIHRwX2RlYWxsb2Mgd2lsbAotbm90IHZpb2xhdGUgYW55IGFzc3VtcHRpb25zIG9mIHRoZSBsaWJyYXJ5LgotCi1cc2VjdGlvbntNYXBwaW5nIE9iamVjdCBTdHJ1Y3R1cmVzIFxsYWJlbHttYXBwaW5nLXN0cnVjdHN9fQotCi1cYmVnaW57Y3R5cGVkZXNjfXtQeU1hcHBpbmdNZXRob2RzfQotICBTdHJ1Y3R1cmUgdXNlZCB0byBob2xkIHBvaW50ZXJzIHRvIHRoZSBmdW5jdGlvbnMgdXNlZCB0byBpbXBsZW1lbnQKLSAgdGhlIG1hcHBpbmcgcHJvdG9jb2wgZm9yIGFuIGV4dGVuc2lvbiB0eXBlLgotXGVuZHtjdHlwZWRlc2N9Ci0KLQotXHNlY3Rpb257TnVtYmVyIE9iamVjdCBTdHJ1Y3R1cmVzIFxsYWJlbHtudW1iZXItc3RydWN0c319Ci0KLVxiZWdpbntjdHlwZWRlc2N9e1B5TnVtYmVyTWV0aG9kc30KLSAgU3RydWN0dXJlIHVzZWQgdG8gaG9sZCBwb2ludGVycyB0byB0aGUgZnVuY3Rpb25zIGFuIGV4dGVuc2lvbiB0eXBlCi0gIHVzZXMgdG8gaW1wbGVtZW50IHRoZSBudW1iZXIgcHJvdG9jb2wuCi1cZW5ke2N0eXBlZGVzY30KLQotCi1cc2VjdGlvbntTZXF1ZW5jZSBPYmplY3QgU3RydWN0dXJlcyBcbGFiZWx7c2VxdWVuY2Utc3RydWN0c319Ci0KLVxiZWdpbntjdHlwZWRlc2N9e1B5U2VxdWVuY2VNZXRob2RzfQotICBTdHJ1Y3R1cmUgdXNlZCB0byBob2xkIHBvaW50ZXJzIHRvIHRoZSBmdW5jdGlvbnMgd2hpY2ggYW4gb2JqZWN0Ci0gIHVzZXMgdG8gaW1wbGVtZW50IHRoZSBzZXF1ZW5jZSBwcm90b2NvbC4KLVxlbmR7Y3R5cGVkZXNjfQotCi0KLVxzZWN0aW9ue0J1ZmZlciBPYmplY3QgU3RydWN0dXJlcyBcbGFiZWx7YnVmZmVyLXN0cnVjdHN9fQotXHNlY3Rpb25hdXRob3J7R3JlZyBKLiBTdGVpbn17Z3JlZ0BseXJhLm9yZ30KLQotVGhlIGJ1ZmZlciBpbnRlcmZhY2UgZXhwb3J0cyBhIG1vZGVsIHdoZXJlIGFuIG9iamVjdCBjYW4gZXhwb3NlIGl0cwotaW50ZXJuYWwgZGF0YSBhcyBhIHNldCBvZiBjaHVua3Mgb2YgZGF0YSwgd2hlcmUgZWFjaCBjaHVuayBpcwotc3BlY2lmaWVkIGFzIGEgcG9pbnRlci9sZW5ndGggcGFpci4gIFRoZXNlIGNodW5rcyBhcmUgY2FsbGVkCi1cZGZue3NlZ21lbnRzfSBhbmQgYXJlIHByZXN1bWVkIHRvIGJlIG5vbi1jb250aWd1b3VzIGluIG1lbW9yeS4KLQotSWYgYW4gb2JqZWN0IGRvZXMgbm90IGV4cG9ydCB0aGUgYnVmZmVyIGludGVyZmFjZSwgdGhlbiBpdHMKLVxtZW1iZXJ7dHBfYXNfYnVmZmVyfSBtZW1iZXIgaW4gdGhlIFxjdHlwZXtQeVR5cGVPYmplY3R9IHN0cnVjdHVyZQotc2hvdWxkIGJlIFxOVUxMLiAgT3RoZXJ3aXNlLCB0aGUgXG1lbWJlcnt0cF9hc19idWZmZXJ9IHdpbGwgcG9pbnQgdG8KLWEgXGN0eXBle1B5QnVmZmVyUHJvY3N9IHN0cnVjdHVyZS4KLQotXG5vdGV7SXQgaXMgdmVyeSBpbXBvcnRhbnQgdGhhdCB5b3VyIFxjdHlwZXtQeVR5cGVPYmplY3R9IHN0cnVjdHVyZQotdXNlcyBcY29uc3RhbnR7UHlfVFBGTEFHU19ERUZBVUxUfSBmb3IgdGhlIHZhbHVlIG9mIHRoZQotXG1lbWJlcnt0cF9mbGFnc30gbWVtYmVyIHJhdGhlciB0aGFuIFxjb2RlezB9LiAgVGhpcyB0ZWxscyB0aGUgUHl0aG9uCi1ydW50aW1lIHRoYXQgeW91ciBcY3R5cGV7UHlCdWZmZXJQcm9jc30gc3RydWN0dXJlIGNvbnRhaW5zIHRoZQotXG1lbWJlcntiZl9nZXRjaGFyYnVmZmVyfSBzbG90LiBPbGRlciB2ZXJzaW9ucyBvZiBQeXRob24gZGlkIG5vdCBoYXZlCi10aGlzIG1lbWJlciwgc28gYSBuZXcgUHl0aG9uIGludGVycHJldGVyIHVzaW5nIGFuIG9sZCBleHRlbnNpb24gbmVlZHMKLXRvIGJlIGFibGUgdG8gdGVzdCBmb3IgaXRzIHByZXNlbmNlIGJlZm9yZSB1c2luZyBpdC59Ci0KLVxiZWdpbntjdHlwZWRlc2N9e1B5QnVmZmVyUHJvY3N9Ci0gIFN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIHdoaWNoIGRlZmluZSBhbgotICBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYnVmZmVyIHByb3RvY29sLgotCi0gIFRoZSBmaXJzdCBzbG90IGlzIFxtZW1iZXJ7YmZfZ2V0cmVhZGJ1ZmZlcn0sIG9mIHR5cGUKLSAgXGN0eXBle2dldHJlYWRidWZmZXJwcm9jfS4gIElmIHRoaXMgc2xvdCBpcyBcTlVMTCwgdGhlbiB0aGUgb2JqZWN0Ci0gIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyBmcm9tIHRoZSBpbnRlcm5hbCBkYXRhLiAgVGhpcyBpcwotICBub24tc2Vuc2ljYWwsIHNvIGltcGxlbWVudG9ycyBzaG91bGQgZmlsbCB0aGlzIGluLCBidXQgY2FsbGVycwotICBzaG91bGQgdGVzdCB0aGF0IHRoZSBzbG90IGNvbnRhaW5zIGEgbm9uLVxOVUxMe30gdmFsdWUuCi0KLSAgVGhlIG5leHQgc2xvdCBpcyBcbWVtYmVye2JmX2dldHdyaXRlYnVmZmVyfSBoYXZpbmcgdHlwZQotICBcY3R5cGV7Z2V0d3JpdGVidWZmZXJwcm9jfS4gIFRoaXMgc2xvdCBtYXkgYmUgXE5VTEx7fSBpZiB0aGUgb2JqZWN0Ci0gIGRvZXMgbm90IGFsbG93IHdyaXRpbmcgaW50byBpdHMgcmV0dXJuZWQgYnVmZmVycy4KLQotICBUaGUgdGhpcmQgc2xvdCBpcyBcbWVtYmVye2JmX2dldHNlZ2NvdW50fSwgd2l0aCB0eXBlCi0gIFxjdHlwZXtnZXRzZWdjb3VudHByb2N9LiAgVGhpcyBzbG90IG11c3Qgbm90IGJlIFxOVUxMe30gYW5kIGlzIHVzZWQKLSAgdG8gaW5mb3JtIHRoZSBjYWxsZXIgaG93IG1hbnkgc2VnbWVudHMgdGhlIG9iamVjdCBjb250YWlucy4gIFNpbXBsZQotICBvYmplY3RzIHN1Y2ggYXMgXGN0eXBle1B5U3RyaW5nX1R5cGV9IGFuZCBcY3R5cGV7UHlCdWZmZXJfVHlwZX0KLSAgb2JqZWN0cyBjb250YWluIGEgc2luZ2xlIHNlZ21lbnQuCi0KLSAgVGhlIGxhc3Qgc2xvdCBpcyBcbWVtYmVye2JmX2dldGNoYXJidWZmZXJ9LCBvZiB0eXBlCi0gIFxjdHlwZXtnZXRjaGFyYnVmZmVycHJvY30uICBUaGlzIHNsb3Qgd2lsbCBvbmx5IGJlIHByZXNlbnQgaWYgdGhlCi0gIFxjb25zdGFudHtQeV9UUEZMQUdTX0hBVkVfR0VUQ0hBUkJVRkZFUn0gZmxhZyBpcyBwcmVzZW50IGluIHRoZQotICBcbWVtYmVye3RwX2ZsYWdzfSBmaWVsZCBvZiB0aGUgb2JqZWN0J3MgXGN0eXBle1B5VHlwZU9iamVjdH0uCi0gIEJlZm9yZSB1c2luZyB0aGlzIHNsb3QsIHRoZSBjYWxsZXIgc2hvdWxkIHRlc3Qgd2hldGhlciBpdCBpcyBwcmVzZW50Ci0gIGJ5IHVzaW5nIHRoZQotICBcY2Z1bmN0aW9ue1B5VHlwZV9IYXNGZWF0dXJlKCl9XHR0aW5kZXh7UHlUeXBlX0hhc0ZlYXR1cmUoKX0KLSAgZnVuY3Rpb24uICBJZiB0aGUgZmxhZyBpcyBwcmVzZW50LCBcbWVtYmVye2JmX2dldGNoYXJidWZmZXJ9IG1heSBiZQotICBcTlVMTCwKLSAgaW5kaWNhdGluZyB0aGF0IHRoZSBvYmplY3QncwotICBjb250ZW50cyBjYW5ub3QgYmUgdXNlZCBhcyBcZW1waHs4LWJpdCBjaGFyYWN0ZXJzfS4KLSAgVGhlIHNsb3QgZnVuY3Rpb24gbWF5IGFsc28gcmFpc2UgYW4gZXJyb3IgaWYgdGhlIG9iamVjdCdzIGNvbnRlbnRzCi0gIGNhbm5vdCBiZSBpbnRlcnByZXRlZCBhcyA4LWJpdCBjaGFyYWN0ZXJzLiAgRm9yIGV4YW1wbGUsIGlmIHRoZQotICBvYmplY3QgaXMgYW4gYXJyYXkgd2hpY2ggaXMgY29uZmlndXJlZCB0byBob2xkIGZsb2F0aW5nIHBvaW50Ci0gIHZhbHVlcywgYW4gZXhjZXB0aW9uIG1heSBiZSByYWlzZWQgaWYgYSBjYWxsZXIgYXR0ZW1wdHMgdG8gdXNlCi0gIFxtZW1iZXJ7YmZfZ2V0Y2hhcmJ1ZmZlcn0gdG8gZmV0Y2ggYSBzZXF1ZW5jZSBvZiA4LWJpdCBjaGFyYWN0ZXJzLgotICBUaGlzIG5vdGlvbiBvZiBleHBvcnRpbmcgdGhlIGludGVybmFsIGJ1ZmZlcnMgYXMgYGB0ZXh0JycgaXMgdXNlZCB0bwotICBkaXN0aW5ndWlzaCBiZXR3ZWVuIG9iamVjdHMgdGhhdCBhcmUgYmluYXJ5IGluIG5hdHVyZSwgYW5kIHRob3NlCi0gIHdoaWNoIGhhdmUgY2hhcmFjdGVyLWJhc2VkIGNvbnRlbnQuCi0KLSAgXG5vdGV7VGhlIGN1cnJlbnQgcG9saWN5IHNlZW1zIHRvIHN0YXRlIHRoYXQgdGhlc2UgY2hhcmFjdGVycwotICBtYXkgYmUgbXVsdGktYnl0ZSBjaGFyYWN0ZXJzLiBUaGlzIGltcGxpZXMgdGhhdCBhIGJ1ZmZlciBzaXplIG9mCi0gIFx2YXJ7Tn0gZG9lcyBub3QgbWVhbiB0aGVyZSBhcmUgXHZhcntOfSBjaGFyYWN0ZXJzIHByZXNlbnQufQotXGVuZHtjdHlwZWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317UHlfVFBGTEFHU19IQVZFX0dFVENIQVJCVUZGRVJ9Ci0gIEZsYWcgYml0IHNldCBpbiB0aGUgdHlwZSBzdHJ1Y3R1cmUgdG8gaW5kaWNhdGUgdGhhdCB0aGUKLSAgXG1lbWJlcntiZl9nZXRjaGFyYnVmZmVyfSBzbG90IGlzIGtub3duLiAgVGhpcyBiZWluZyBzZXQgZG9lcyBub3QKLSAgaW5kaWNhdGUgdGhhdCB0aGUgb2JqZWN0IHN1cHBvcnRzIHRoZSBidWZmZXIgaW50ZXJmYWNlIG9yIHRoYXQgdGhlCi0gIFxtZW1iZXJ7YmZfZ2V0Y2hhcmJ1ZmZlcn0gc2xvdCBpcyBub24tXE5VTEwuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57Y3R5cGVkZXNjfVtnZXRyZWFkYnVmZmVycHJvY117UHlfc3NpemVfdCAoKnJlYWRidWZmZXJwcm9jKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBzZWdtZW50LCB2b2lkICoqcHRycHRyKX0KLSAgUmV0dXJuIGEgcG9pbnRlciB0byBhIHJlYWRhYmxlIHNlZ21lbnQgb2YgdGhlIGJ1ZmZlciBpbgotICBcY29kZXsqXHZhcntwdHJwdHJ9fS4gIFRoaXMgZnVuY3Rpb24KLSAgaXMgYWxsb3dlZCB0byByYWlzZSBhbiBleGNlcHRpb24sIGluIHdoaWNoIGNhc2UgaXQgbXVzdCByZXR1cm4KLSAgXGNvZGV7LTF9LiAgVGhlIFx2YXJ7c2VnbWVudH0gd2hpY2ggaXMgc3BlY2lmaWVkIG11c3QgYmUgemVybyBvcgotICBwb3NpdGl2ZSwgYW5kIHN0cmljdGx5IGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIHNlZ21lbnRzIHJldHVybmVkIGJ5Ci0gIHRoZSBcbWVtYmVye2JmX2dldHNlZ2NvdW50fSBzbG90IGZ1bmN0aW9uLiAgT24gc3VjY2VzcywgaXQgcmV0dXJucwotICB0aGUgbGVuZ3RoIG9mIHRoZSBzZWdtZW50LCBhbmQgc2V0cyBcY29kZXsqXHZhcntwdHJwdHJ9fSB0byBhCi0gIHBvaW50ZXIgdG8gdGhhdCBtZW1vcnkuCi1cZW5ke2N0eXBlZGVzY30KLQotXGJlZ2lue2N0eXBlZGVzY31bZ2V0d3JpdGVidWZmZXJwcm9jXXtQeV9zc2l6ZV90ICgqd3JpdGVidWZmZXJwcm9jKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBzZWdtZW50LCB2b2lkICoqcHRycHRyKX0KLSAgUmV0dXJuIGEgcG9pbnRlciB0byBhIHdyaXRhYmxlIG1lbW9yeSBidWZmZXIgaW4KLSAgXGNvZGV7Klx2YXJ7cHRycHRyfX0sIGFuZCB0aGUgbGVuZ3RoIG9mIHRoYXQgc2VnbWVudCBhcyB0aGUgZnVuY3Rpb24KLSAgcmV0dXJuIHZhbHVlLiAgVGhlIG1lbW9yeSBidWZmZXIgbXVzdCBjb3JyZXNwb25kIHRvIGJ1ZmZlciBzZWdtZW50Ci0gIFx2YXJ7c2VnbWVudH0uICBNdXN0IHJldHVybiBcY29kZXstMX0gYW5kIHNldCBhbiBleGNlcHRpb24gb24KLSAgZXJyb3IuICBcZXhjZXB0aW9ue1R5cGVFcnJvcn0gc2hvdWxkIGJlIHJhaXNlZCBpZiB0aGUgb2JqZWN0IG9ubHkKLSAgc3VwcG9ydHMgcmVhZC1vbmx5IGJ1ZmZlcnMsIGFuZCBcZXhjZXB0aW9ue1N5c3RlbUVycm9yfSBzaG91bGQgYmUKLSAgcmFpc2VkIHdoZW4gXHZhcntzZWdtZW50fSBzcGVjaWZpZXMgYSBzZWdtZW50IHRoYXQgZG9lc24ndCBleGlzdC4KLSUgV2h5IGRvZXNuJ3QgaXQgcmFpc2UgVmFsdWVFcnJvciBmb3IgdGhpcyBvbmU/Ci0lIEdKUzogYmVjYXVzZSB5b3Ugc2hvdWxkbid0IGJlIGNhbGxpbmcgaXQgd2l0aCBhbiBpbnZhbGlkCi0lICAgICAgc2VnbWVudC4gVGhhdCBpbmRpY2F0ZXMgYSBibGF0YW50IHByb2dyYW1taW5nIGVycm9yIGluIHRoZSBDCi0lICAgICAgY29kZS4KLVxlbmR7Y3R5cGVkZXNjfQotCi1cYmVnaW57Y3R5cGVkZXNjfVtnZXRzZWdjb3VudHByb2Nde1B5X3NzaXplX3QgKCpzZWdjb3VudHByb2MpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90ICpsZW5wKX0KLSAgUmV0dXJuIHRoZSBudW1iZXIgb2YgbWVtb3J5IHNlZ21lbnRzIHdoaWNoIGNvbXByaXNlIHRoZSBidWZmZXIuICBJZgotICBcdmFye2xlbnB9IGlzIG5vdCBcTlVMTCwgdGhlIGltcGxlbWVudGF0aW9uIG11c3QgcmVwb3J0IHRoZSBzdW0gb2YKLSAgdGhlIHNpemVzIChpbiBieXRlcykgb2YgYWxsIHNlZ21lbnRzIGluIFxjb2RleypcdmFye2xlbnB9fS4KLSAgVGhlIGZ1bmN0aW9uIGNhbm5vdCBmYWlsLgotXGVuZHtjdHlwZWRlc2N9Ci0KLVxiZWdpbntjdHlwZWRlc2N9W2dldGNoYXJidWZmZXJwcm9jXXtQeV9zc2l6ZV90ICgqY2hhcmJ1ZmZlcnByb2MpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IHNlZ21lbnQsIGNvbnN0IGNoYXIgKipwdHJwdHIpfQotICBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIHNlZ21lbnQgXHZhcntzZWdtZW50fSB0aGF0IFx2YXJ7cHRycHRyfSAKLSAgaXMgc2V0IHRvLiAgXGNvZGV7Klx2YXJ7cHRycHRyfX0gaXMgc2V0IHRvIHRoZSBtZW1vcnkgYnVmZmVyLgotICBSZXR1cm5zIFxjb2Rley0xfSBvbiBlcnJvci4KLVxlbmR7Y3R5cGVkZXNjfQotCi0KLVxzZWN0aW9ue1N1cHBvcnRpbmcgdGhlIEl0ZXJhdG9yIFByb3RvY29sCi0gICAgICAgICBcbGFiZWx7c3VwcG9ydGluZy1pdGVyYXRpb259fQotCi0KLVxzZWN0aW9ue1N1cHBvcnRpbmcgQ3ljbGljIEdhcmJhZ2UgQ29sbGVjdGlvbgotICAgICAgICAgXGxhYmVse3N1cHBvcnRpbmctY3ljbGUtZGV0ZWN0aW9ufX0KLQotUHl0aG9uJ3Mgc3VwcG9ydCBmb3IgZGV0ZWN0aW5nIGFuZCBjb2xsZWN0aW5nIGdhcmJhZ2Ugd2hpY2ggaW52b2x2ZXMKLWNpcmN1bGFyIHJlZmVyZW5jZXMgcmVxdWlyZXMgc3VwcG9ydCBmcm9tIG9iamVjdCB0eXBlcyB3aGljaCBhcmUKLWBgY29udGFpbmVycycnIGZvciBvdGhlciBvYmplY3RzIHdoaWNoIG1heSBhbHNvIGJlIGNvbnRhaW5lcnMuICBUeXBlcwotd2hpY2ggZG8gbm90IHN0b3JlIHJlZmVyZW5jZXMgdG8gb3RoZXIgb2JqZWN0cywgb3Igd2hpY2ggb25seSBzdG9yZQotcmVmZXJlbmNlcyB0byBhdG9taWMgdHlwZXMgKHN1Y2ggYXMgbnVtYmVycyBvciBzdHJpbmdzKSwgZG8gbm90IG5lZWQKLXRvIHByb3ZpZGUgYW55IGV4cGxpY2l0IHN1cHBvcnQgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbi4KLQotQW4gZXhhbXBsZSBzaG93aW5nIHRoZSB1c2Ugb2YgdGhlc2UgaW50ZXJmYWNlcyBjYW4gYmUgZm91bmQgaW4KLWBgXHVsaW5re1N1cHBvcnRpbmcgdGhlIEN5Y2xlCi1Db2xsZWN0b3J9ey4uL2V4dC9leGFtcGxlLWN5Y2xlLXN1cHBvcnQuaHRtbH0nJyBpbgotXGNpdGV0aXRsZVsuLi9leHQvZXh0Lmh0bWxde0V4dGVuZGluZyBhbmQgRW1iZWRkaW5nIHRoZSBQeXRob24KLUludGVycHJldGVyfS4KLQotVG8gY3JlYXRlIGEgY29udGFpbmVyIHR5cGUsIHRoZSBcbWVtYmVye3RwX2ZsYWdzfSBmaWVsZCBvZiB0aGUgdHlwZQotb2JqZWN0IG11c3QgaW5jbHVkZSB0aGUgXGNvbnN0YW50e1B5X1RQRkxBR1NfSEFWRV9HQ30gYW5kIHByb3ZpZGUgYW4KLWltcGxlbWVudGF0aW9uIG9mIHRoZSBcbWVtYmVye3RwX3RyYXZlcnNlfSBoYW5kbGVyLiAgSWYgaW5zdGFuY2VzIG9mIHRoZQotdHlwZSBhcmUgbXV0YWJsZSwgYSBcbWVtYmVye3RwX2NsZWFyfSBpbXBsZW1lbnRhdGlvbiBtdXN0IGFsc28gYmUKLXByb3ZpZGVkLgotCi1cYmVnaW57ZGF0YWRlc2N9e1B5X1RQRkxBR1NfSEFWRV9HQ30KLSAgT2JqZWN0cyB3aXRoIGEgdHlwZSB3aXRoIHRoaXMgZmxhZyBzZXQgbXVzdCBjb25mb3JtIHdpdGggdGhlIHJ1bGVzCi0gIGRvY3VtZW50ZWQgaGVyZS4gIEZvciBjb252ZW5pZW5jZSB0aGVzZSBvYmplY3RzIHdpbGwgYmUgcmVmZXJyZWQgdG8KLSAgYXMgY29udGFpbmVyIG9iamVjdHMuCi1cZW5ke2RhdGFkZXNjfQotCi1Db25zdHJ1Y3RvcnMgZm9yIGNvbnRhaW5lciB0eXBlcyBtdXN0IGNvbmZvcm0gdG8gdHdvIHJ1bGVzOgotCi1cYmVnaW57ZW51bWVyYXRlfQotXGl0ZW0gIFRoZSBtZW1vcnkgZm9yIHRoZSBvYmplY3QgbXVzdCBiZSBhbGxvY2F0ZWQgdXNpbmcKLSAgICAgICBcY2Z1bmN0aW9ue1B5T2JqZWN0X0dDX05ldygpfSBvciBcY2Z1bmN0aW9ue1B5T2JqZWN0X0dDX1Zhck5ldygpfS4KLQotXGl0ZW0gIE9uY2UgYWxsIHRoZSBmaWVsZHMgd2hpY2ggbWF5IGNvbnRhaW4gcmVmZXJlbmNlcyB0byBvdGhlcgotICAgICAgIGNvbnRhaW5lcnMgYXJlIGluaXRpYWxpemVkLCBpdCBtdXN0IGNhbGwKLSAgICAgICBcY2Z1bmN0aW9ue1B5T2JqZWN0X0dDX1RyYWNrKCl9LgotXGVuZHtlbnVtZXJhdGV9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1x2YXJ7VFlQRX0qfXtQeU9iamVjdF9HQ19OZXd9e1RZUEUsIFB5VHlwZU9iamVjdCAqdHlwZX0KLSAgQW5hbG9nb3VzIHRvIFxjZnVuY3Rpb257UHlPYmplY3RfTmV3KCl9IGJ1dCBmb3IgY29udGFpbmVyIG9iamVjdHMgd2l0aAotICB0aGUgXGNvbnN0YW50e1B5X1RQRkxBR1NfSEFWRV9HQ30gZmxhZyBzZXQuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317XHZhcntUWVBFfSp9e1B5T2JqZWN0X0dDX05ld1Zhcn17VFlQRSwgUHlUeXBlT2JqZWN0ICp0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzaXplfQotICBBbmFsb2dvdXMgdG8gXGNmdW5jdGlvbntQeU9iamVjdF9OZXdWYXIoKX0gYnV0IGZvciBjb250YWluZXIgb2JqZWN0cwotICB3aXRoIHRoZSBcY29uc3RhbnR7UHlfVFBGTEFHU19IQVZFX0dDfSBmbGFnIHNldC4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeVZhck9iamVjdCAqfXtQeU9iamVjdF9HQ19SZXNpemV9e1B5VmFyT2JqZWN0ICpvcCwgUHlfc3NpemVfdH0KLSAgUmVzaXplIGFuIG9iamVjdCBhbGxvY2F0ZWQgYnkgXGNmdW5jdGlvbntQeU9iamVjdF9OZXdWYXIoKX0uICBSZXR1cm5zCi0gIHRoZSByZXNpemVkIG9iamVjdCBvciBcTlVMTHt9IG9uIGZhaWx1cmUuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317dm9pZH17UHlPYmplY3RfR0NfVHJhY2t9e1B5T2JqZWN0ICpvcH0KLSAgQWRkcyB0aGUgb2JqZWN0IFx2YXJ7b3B9IHRvIHRoZSBzZXQgb2YgY29udGFpbmVyIG9iamVjdHMgdHJhY2tlZCBieQotICB0aGUgY29sbGVjdG9yLiAgVGhlIGNvbGxlY3RvciBjYW4gcnVuIGF0IHVuZXhwZWN0ZWQgdGltZXMgc28gb2JqZWN0cwotICBtdXN0IGJlIHZhbGlkIHdoaWxlIGJlaW5nIHRyYWNrZWQuICBUaGlzIHNob3VsZCBiZSBjYWxsZWQgb25jZSBhbGwKLSAgdGhlIGZpZWxkcyBmb2xsb3dlZCBieSB0aGUgXG1lbWJlcnt0cF90cmF2ZXJzZX0gaGFuZGxlciBiZWNvbWUgdmFsaWQsCi0gIHVzdWFsbHkgbmVhciB0aGUgZW5kIG9mIHRoZSBjb25zdHJ1Y3Rvci4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXt2b2lkfXtfUHlPYmplY3RfR0NfVFJBQ0t9e1B5T2JqZWN0ICpvcH0KLSAgQSBtYWNybyB2ZXJzaW9uIG9mIFxjZnVuY3Rpb257UHlPYmplY3RfR0NfVHJhY2soKX0uICBJdCBzaG91bGQgbm90IGJlCi0gIHVzZWQgZm9yIGV4dGVuc2lvbiBtb2R1bGVzLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVNpbWlsYXJseSwgdGhlIGRlYWxsb2NhdG9yIGZvciB0aGUgb2JqZWN0IG11c3QgY29uZm9ybSB0byBhIHNpbWlsYXIKLXBhaXIgb2YgcnVsZXM6Ci0KLVxiZWdpbntlbnVtZXJhdGV9Ci1caXRlbSAgQmVmb3JlIGZpZWxkcyB3aGljaCByZWZlciB0byBvdGhlciBjb250YWluZXJzIGFyZSBpbnZhbGlkYXRlZCwKLSAgICAgICBcY2Z1bmN0aW9ue1B5T2JqZWN0X0dDX1VuVHJhY2soKX0gbXVzdCBiZSBjYWxsZWQuCi0KLVxpdGVtICBUaGUgb2JqZWN0J3MgbWVtb3J5IG11c3QgYmUgZGVhbGxvY2F0ZWQgdXNpbmcKLSAgICAgICBcY2Z1bmN0aW9ue1B5T2JqZWN0X0dDX0RlbCgpfS4KLVxlbmR7ZW51bWVyYXRlfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXt2b2lkfXtQeU9iamVjdF9HQ19EZWx9e3ZvaWQgKm9wfQotICBSZWxlYXNlcyBtZW1vcnkgYWxsb2NhdGVkIHRvIGFuIG9iamVjdCB1c2luZwotICBcY2Z1bmN0aW9ue1B5T2JqZWN0X0dDX05ldygpfSBvciBcY2Z1bmN0aW9ue1B5T2JqZWN0X0dDX05ld1ZhcigpfS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXt2b2lkfXtQeU9iamVjdF9HQ19VblRyYWNrfXt2b2lkICpvcH0KLSAgUmVtb3ZlIHRoZSBvYmplY3QgXHZhcntvcH0gZnJvbSB0aGUgc2V0IG9mIGNvbnRhaW5lciBvYmplY3RzIHRyYWNrZWQKLSAgYnkgdGhlIGNvbGxlY3Rvci4gIE5vdGUgdGhhdCBcY2Z1bmN0aW9ue1B5T2JqZWN0X0dDX1RyYWNrKCl9IGNhbiBiZQotICBjYWxsZWQgYWdhaW4gb24gdGhpcyBvYmplY3QgdG8gYWRkIGl0IGJhY2sgdG8gdGhlIHNldCBvZiB0cmFja2VkCi0gIG9iamVjdHMuICBUaGUgZGVhbGxvY2F0b3IgKFxtZW1iZXJ7dHBfZGVhbGxvY30gaGFuZGxlcikgc2hvdWxkIGNhbGwKLSAgdGhpcyBmb3IgdGhlIG9iamVjdCBiZWZvcmUgYW55IG9mIHRoZSBmaWVsZHMgdXNlZCBieSB0aGUKLSAgXG1lbWJlcnt0cF90cmF2ZXJzZX0gaGFuZGxlciBiZWNvbWUgaW52YWxpZC4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXt2b2lkfXtfUHlPYmplY3RfR0NfVU5UUkFDS317UHlPYmplY3QgKm9wfQotICBBIG1hY3JvIHZlcnNpb24gb2YgXGNmdW5jdGlvbntQeU9iamVjdF9HQ19VblRyYWNrKCl9LiAgSXQgc2hvdWxkIG5vdCBiZQotICB1c2VkIGZvciBleHRlbnNpb24gbW9kdWxlcy4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1UaGUgXG1lbWJlcnt0cF90cmF2ZXJzZX0gaGFuZGxlciBhY2NlcHRzIGEgZnVuY3Rpb24gcGFyYW1ldGVyIG9mIHRoaXMKLXR5cGU6Ci0KLVxiZWdpbntjdHlwZWRlc2N9W3Zpc2l0cHJvY117aW50ICgqdmlzaXRwcm9jKShQeU9iamVjdCAqb2JqZWN0LCB2b2lkICphcmcpfQotICBUeXBlIG9mIHRoZSB2aXNpdG9yIGZ1bmN0aW9uIHBhc3NlZCB0byB0aGUgXG1lbWJlcnt0cF90cmF2ZXJzZX0KLSAgaGFuZGxlci4gIFRoZSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdpdGggYW4gb2JqZWN0IHRvIHRyYXZlcnNlCi0gIGFzIFx2YXJ7b2JqZWN0fSBhbmQgdGhlIHRoaXJkIHBhcmFtZXRlciB0byB0aGUgXG1lbWJlcnt0cF90cmF2ZXJzZX0KLSAgaGFuZGxlciBhcyBcdmFye2FyZ30uICBUaGUgUHl0aG9uIGNvcmUgdXNlcyBzZXZlcmFsIHZpc2l0b3IgZnVuY3Rpb25zCi0gIHRvIGltcGxlbWVudCBjeWNsaWMgZ2FyYmFnZSBkZXRlY3Rpb247IGl0J3Mgbm90IGV4cGVjdGVkIHRoYXQgdXNlcnMgd2lsbAotICBuZWVkIHRvIHdyaXRlIHRoZWlyIG93biB2aXNpdG9yIGZ1bmN0aW9ucy4KLVxlbmR7Y3R5cGVkZXNjfQotCi1UaGUgXG1lbWJlcnt0cF90cmF2ZXJzZX0gaGFuZGxlciBtdXN0IGhhdmUgdGhlIGZvbGxvd2luZyB0eXBlOgotCi1cYmVnaW57Y3R5cGVkZXNjfVt0cmF2ZXJzZXByb2Nde2ludCAoKnRyYXZlcnNlcHJvYykoUHlPYmplY3QgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKX0KLSAgVHJhdmVyc2FsIGZ1bmN0aW9uIGZvciBhIGNvbnRhaW5lciBvYmplY3QuICBJbXBsZW1lbnRhdGlvbnMgbXVzdAotICBjYWxsIHRoZSBcdmFye3Zpc2l0fSBmdW5jdGlvbiBmb3IgZWFjaCBvYmplY3QgZGlyZWN0bHkgY29udGFpbmVkIGJ5Ci0gIFx2YXJ7c2VsZn0sIHdpdGggdGhlIHBhcmFtZXRlcnMgdG8gXHZhcnt2aXNpdH0gYmVpbmcgdGhlIGNvbnRhaW5lZAotICBvYmplY3QgYW5kIHRoZSBcdmFye2FyZ30gdmFsdWUgcGFzc2VkIHRvIHRoZSBoYW5kbGVyLiAgVGhlIFx2YXJ7dmlzaXR9Ci0gIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGNhbGxlZCB3aXRoIGEgXE5VTEx7fSBvYmplY3QgYXJndW1lbnQuICBJZgotICBcdmFye3Zpc2l0fSByZXR1cm5zIGEgbm9uLXplcm8gdmFsdWUKLSAgdGhhdCB2YWx1ZSBzaG91bGQgYmUgcmV0dXJuZWQgaW1tZWRpYXRlbHkuCi1cZW5ke2N0eXBlZGVzY30KLQotVG8gc2ltcGxpZnkgd3JpdGluZyBcbWVtYmVye3RwX3RyYXZlcnNlfSBoYW5kbGVycywgYQotXGNmdW5jdGlvbntQeV9WSVNJVCgpfSBtYWNybyBpcyBwcm92aWRlZC4gIEluIG9yZGVyIHRvIHVzZSB0aGlzIG1hY3JvLAotdGhlIFxtZW1iZXJ7dHBfdHJhdmVyc2V9IGltcGxlbWVudGF0aW9uIG11c3QgbmFtZSBpdHMgYXJndW1lbnRzCi1leGFjdGx5IFx2YXJ7dmlzaXR9IGFuZCBcdmFye2FyZ306Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e3ZvaWR9e1B5X1ZJU0lUfXtQeU9iamVjdCAqb30KLSAgQ2FsbCB0aGUgXHZhcnt2aXNpdH0gY2FsbGJhY2ssIHdpdGggYXJndW1lbnRzIFx2YXJ7b30gYW5kIFx2YXJ7YXJnfS4KLSAgSWYgXHZhcnt2aXNpdH0gcmV0dXJucyBhIG5vbi16ZXJvIHZhbHVlLCB0aGVuIHJldHVybiBpdC4gIFVzaW5nIHRoaXMKLSAgbWFjcm8sIFxtZW1iZXJ7dHBfdHJhdmVyc2V9IGhhbmRsZXJzIGxvb2sgbGlrZToKLQotXGJlZ2lue3ZlcmJhdGltfQotc3RhdGljIGludAotbXlfdHJhdmVyc2UoTm9kZHkgKnNlbGYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQotewotICAgIFB5X1ZJU0lUKHNlbGYtPmZvbyk7Ci0gICAgUHlfVklTSVQoc2VsZi0+YmFyKTsKLSAgICByZXR1cm4gMDsKLX0KLVxlbmR7dmVyYmF0aW19Ci0KLVx2ZXJzaW9uYWRkZWR7Mi40fQotXGVuZHtjZnVuY2Rlc2N9Ci0KLQotVGhlIFxtZW1iZXJ7dHBfY2xlYXJ9IGhhbmRsZXIgbXVzdCBiZSBvZiB0aGUgXGN0eXBle2lucXVpcnl9IHR5cGUsIG9yCi1cTlVMTHt9IGlmIHRoZSBvYmplY3QgaXMgaW1tdXRhYmxlLgotCi1cYmVnaW57Y3R5cGVkZXNjfVtpbnF1aXJ5XXtpbnQgKCppbnF1aXJ5KShQeU9iamVjdCAqc2VsZil9Ci0gIERyb3AgcmVmZXJlbmNlcyB0aGF0IG1heSBoYXZlIGNyZWF0ZWQgcmVmZXJlbmNlIGN5Y2xlcy4gIEltbXV0YWJsZQotICBvYmplY3RzIGRvIG5vdCBoYXZlIHRvIGRlZmluZSB0aGlzIG1ldGhvZCBzaW5jZSB0aGV5IGNhbiBuZXZlcgotICBkaXJlY3RseSBjcmVhdGUgcmVmZXJlbmNlIGN5Y2xlcy4gIE5vdGUgdGhhdCB0aGUgb2JqZWN0IG11c3Qgc3RpbGwKLSAgYmUgdmFsaWQgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCAoZG9uJ3QganVzdCBjYWxsCi0gIFxjZnVuY3Rpb257UHlfREVDUkVGKCl9IG9uIGEgcmVmZXJlbmNlKS4gIFRoZSBjb2xsZWN0b3Igd2lsbCBjYWxsCi0gIHRoaXMgbWV0aG9kIGlmIGl0IGRldGVjdHMgdGhhdCB0aGlzIG9iamVjdCBpcyBpbnZvbHZlZCBpbiBhCi0gIHJlZmVyZW5jZSBjeWNsZS4KLVxlbmR7Y3R5cGVkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2FwaS9yZWZjb3VudGluZy50ZXggYi9Eb2MvYXBpL3JlZmNvdW50aW5nLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc3NTQzYi4uMDAwMDAwMAotLS0gYS9Eb2MvYXBpL3JlZmNvdW50aW5nLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLVxjaGFwdGVye1JlZmVyZW5jZSBDb3VudGluZyBcbGFiZWx7Y291bnRpbmdSZWZzfX0KLQotCi1UaGUgbWFjcm9zIGluIHRoaXMgc2VjdGlvbiBhcmUgdXNlZCBmb3IgbWFuYWdpbmcgcmVmZXJlbmNlIGNvdW50cwotb2YgUHl0aG9uIG9iamVjdHMuCi0KLQotXGJlZ2lue2NmdW5jZGVzY317dm9pZH17UHlfSU5DUkVGfXtQeU9iamVjdCAqb30KLSAgSW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgZm9yIG9iamVjdCBcdmFye299LiAgVGhlIG9iamVjdCBtdXN0Ci0gIG5vdCBiZSBcTlVMTDsgaWYgeW91IGFyZW4ndCBzdXJlIHRoYXQgaXQgaXNuJ3QgXE5VTEwsIHVzZQotICBcY2Z1bmN0aW9ue1B5X1hJTkNSRUYoKX0uCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317dm9pZH17UHlfWElOQ1JFRn17UHlPYmplY3QgKm99Ci0gIEluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IGZvciBvYmplY3QgXHZhcntvfS4gIFRoZSBvYmplY3QgbWF5IGJlCi0gIFxOVUxMLCBpbiB3aGljaCBjYXNlIHRoZSBtYWNybyBoYXMgbm8gZWZmZWN0LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e3ZvaWR9e1B5X0RFQ1JFRn17UHlPYmplY3QgKm99Ci0gIERlY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IGZvciBvYmplY3QgXHZhcntvfS4gIFRoZSBvYmplY3QgbXVzdAotICBub3QgYmUgXE5VTEw7IGlmIHlvdSBhcmVuJ3Qgc3VyZSB0aGF0IGl0IGlzbid0IFxOVUxMLCB1c2UKLSAgXGNmdW5jdGlvbntQeV9YREVDUkVGKCl9LiAgSWYgdGhlIHJlZmVyZW5jZSBjb3VudCByZWFjaGVzIHplcm8sIHRoZQotICBvYmplY3QncyB0eXBlJ3MgZGVhbGxvY2F0aW9uIGZ1bmN0aW9uICh3aGljaCBtdXN0IG5vdCBiZSBcTlVMTCkgaXMKLSAgaW52b2tlZC4KLQotICBcd2FybmluZ3tUaGUgZGVhbGxvY2F0aW9uIGZ1bmN0aW9uIGNhbiBjYXVzZSBhcmJpdHJhcnkgUHl0aG9uIGNvZGUKLSAgdG8gYmUgaW52b2tlZCAoZS5nLiB3aGVuIGEgY2xhc3MgaW5zdGFuY2Ugd2l0aCBhIFxtZXRob2R7X19kZWxfXygpfQotICBtZXRob2QgaXMgZGVhbGxvY2F0ZWQpLiAgV2hpbGUgZXhjZXB0aW9ucyBpbiBzdWNoIGNvZGUgYXJlIG5vdAotICBwcm9wYWdhdGVkLCB0aGUgZXhlY3V0ZWQgY29kZSBoYXMgZnJlZSBhY2Nlc3MgdG8gYWxsIFB5dGhvbiBnbG9iYWwKLSAgdmFyaWFibGVzLiAgVGhpcyBtZWFucyB0aGF0IGFueSBvYmplY3QgdGhhdCBpcyByZWFjaGFibGUgZnJvbSBhCi0gIGdsb2JhbCB2YXJpYWJsZSBzaG91bGQgYmUgaW4gYSBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZQotICBcY2Z1bmN0aW9ue1B5X0RFQ1JFRigpfSBpcyBpbnZva2VkLiAgRm9yIGV4YW1wbGUsIGNvZGUgdG8gZGVsZXRlIGFuCi0gIG9iamVjdCBmcm9tIGEgbGlzdCBzaG91bGQgY29weSBhIHJlZmVyZW5jZSB0byB0aGUgZGVsZXRlZCBvYmplY3QgaW4KLSAgYSB0ZW1wb3JhcnkgdmFyaWFibGUsIHVwZGF0ZSB0aGUgbGlzdCBkYXRhIHN0cnVjdHVyZSwgYW5kIHRoZW4gY2FsbAotICBcY2Z1bmN0aW9ue1B5X0RFQ1JFRigpfSBmb3IgdGhlIHRlbXBvcmFyeSB2YXJpYWJsZS59Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317dm9pZH17UHlfWERFQ1JFRn17UHlPYmplY3QgKm99Ci0gIERlY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IGZvciBvYmplY3QgXHZhcntvfS4gIFRoZSBvYmplY3QgbWF5IGJlCi0gIFxOVUxMLCBpbiB3aGljaCBjYXNlIHRoZSBtYWNybyBoYXMgbm8gZWZmZWN0OyBvdGhlcndpc2UgdGhlIGVmZmVjdAotICBpcyB0aGUgc2FtZSBhcyBmb3IgXGNmdW5jdGlvbntQeV9ERUNSRUYoKX0sIGFuZCB0aGUgc2FtZSB3YXJuaW5nCi0gIGFwcGxpZXMuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317dm9pZH17UHlfQ0xFQVJ9e1B5T2JqZWN0ICpvfQotICBEZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBmb3Igb2JqZWN0IFx2YXJ7b30uICBUaGUgb2JqZWN0IG1heSBiZQotICBcTlVMTCwgaW4gd2hpY2ggY2FzZSB0aGUgbWFjcm8gaGFzIG5vIGVmZmVjdDsgb3RoZXJ3aXNlIHRoZSBlZmZlY3QKLSAgaXMgdGhlIHNhbWUgYXMgZm9yIFxjZnVuY3Rpb257UHlfREVDUkVGKCl9LCBleGNlcHQgdGhhdCB0aGUgYXJndW1lbnQKLSAgaXMgYWxzbyBzZXQgdG8gXE5VTEwuICBUaGUgd2FybmluZyBmb3IgXGNmdW5jdGlvbntQeV9ERUNSRUYoKX0gZG9lcwotICBub3QgYXBwbHkgd2l0aCByZXNwZWN0IHRvIHRoZSBvYmplY3QgcGFzc2VkIGJlY2F1c2UgdGhlIG1hY3JvCi0gIGNhcmVmdWxseSB1c2VzIGEgdGVtcG9yYXJ5IHZhcmlhYmxlIGFuZCBzZXRzIHRoZSBhcmd1bWVudCB0byBcTlVMTAotICBiZWZvcmUgZGVjcmVtZW50aW5nIGl0cyByZWZlcmVuY2UgY291bnQuCi0KLSAgSXQgaXMgYSBnb29kIGlkZWEgdG8gdXNlIHRoaXMgbWFjcm8gd2hlbmV2ZXIgZGVjcmVtZW50aW5nIHRoZSB2YWx1ZQotICBvZiBhIHZhcmlhYmxlIHRoYXQgbWlnaHQgYmUgdHJhdmVyc2VkIGR1cmluZyBnYXJiYWdlIGNvbGxlY3Rpb24uCi0KLVx2ZXJzaW9uYWRkZWR7Mi40fQotXGVuZHtjZnVuY2Rlc2N9Ci0KLQotVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGZvciBydW50aW1lIGR5bmFtaWMgZW1iZWRkaW5nIG9mIFB5dGhvbjoKLVxjZnVuY3Rpb257UHlfSW5jUmVmKFB5T2JqZWN0ICpvKX0sIFxjZnVuY3Rpb257UHlfRGVjUmVmKFB5T2JqZWN0ICpvKX0uCi1UaGV5IGFyZSBzaW1wbHkgZXhwb3J0ZWQgZnVuY3Rpb24gdmVyc2lvbnMgb2YgXGNmdW5jdGlvbntQeV9YSU5DUkVGKCl9IGFuZCAKLVxjZnVuY3Rpb257UHlfWERFQ1JFRigpfSwgcmVzcGVjdGl2ZWx5LgotCi1UaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBvciBtYWNyb3MgYXJlIG9ubHkgZm9yIHVzZSB3aXRoaW4gdGhlCi1pbnRlcnByZXRlciBjb3JlOiBcY2Z1bmN0aW9ue19QeV9EZWFsbG9jKCl9LAotXGNmdW5jdGlvbntfUHlfRm9yZ2V0UmVmZXJlbmNlKCl9LCBcY2Z1bmN0aW9ue19QeV9OZXdSZWZlcmVuY2UoKX0sIGFzCi13ZWxsIGFzIHRoZSBnbG9iYWwgdmFyaWFibGUgXGNkYXRhe19QeV9SZWZUb3RhbH0uCmRpZmYgLS1naXQgYS9Eb2MvYXBpL3JlZmNvdW50cy5kYXQgYi9Eb2MvYXBpL3JlZmNvdW50cy5kYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MTk3YzguLjAwMDAwMDAKLS0tIGEvRG9jL2FwaS9yZWZjb3VudHMuZGF0CisrKyAvZGV2L251bGwKQEAgLTEsMTc1MSArMCwwIEBACi0jIENyZWF0ZWQgYnkgU2tpcCBNb250YW5hcm8gPHNraXBAbW9qYW0uY29tPi4KLQotIyBGb3JtYXQ6Ci0jCWZ1bmN0aW9uICc6JyB0eXBlICc6JyBbcGFyYW0gbmFtZV0gJzonIFtyZWZjb3VudCBlZmZlY3RdICc6JyBbY29tbWVudF0KLSMgSWYgdGhlIHBhcmFtIG5hbWUgc2xvdCBpcyBlbXB0eSwgdGhhdCBsaW5lIGNvcnJlc3BvbmRzIHRvIHRoZSBmdW5jdGlvbidzCi0jIHJldHVybiB2YWx1ZSwgb3RoZXJ3aXNlIGl0J3MgdGhlIHR5cGUgb2YgdGhlIG5hbWVkIHBhcmFtZXRlci4KLQotIyBUaGUgZmlyc3QgbGluZSBvZiBhIGZ1bmN0aW9uIGJsb2NrIGdpdmVzIHR5cGUvcmVmY291bnQgaW5mb3JtYXRpb24gZm9yIHRoZQotIyBmdW5jdGlvbidzIHJldHVybiB2YWx1ZS4gIFN1Y2Nlc3NpdmUgbGluZXMgd2l0aCB0aGUgc2FtZSBmdW5jdGlvbiBuYW1lCi0jIGNvcnJlc3BvbmQgdG8gdGhlIGZ1bmN0aW9uJ3MgcGFyYW1ldGVyIGxpc3QgYW5kIGFwcGVhciBpbiB0aGUgb3JkZXIgdGhlCi0jIHBhcmFtZXRlcnMgYXBwZWFyIGluIHRoZSBmdW5jdGlvbidzIHByb3RvdHlwZS4KLQotIyBGb3IgcmVhZGFiaWxpdHksIGVhY2ggZnVuY3Rpb24ncyBsaW5lcyBhcmUgc3Vycm91bmRlZCBieSBhIGJsYW5rIGxpbmUuCi0jIFRoZSBibG9ja3MgYXJlIHNvcnRlZCBhbHBoYWJldGljYWxseSBieSBmdW5jdGlvbiBuYW1lLgotCi0jIFJlZmNvdW50IGJlaGF2aW9yIGlzIGdpdmVuIGZvciBhbGwgUHlPYmplY3QqIHR5cGVzOiAwIChubyBjaGFuZ2UpLCArMQotIyAoaW5jcmVtZW50KSBhbmQgLTEgKGRlY3JlbWVudCkuICBBIGJsYW5rIHJlZmNvdW50IGZpZWxkIGluZGljYXRlcyB0aGUKLSMgcGFyYW1ldGVyIG9yIGZ1bmN0aW9uIHZhbHVlIGlzIG5vdCBhIFB5T2JqZWN0KiBhbmQgaXMgdGhlcmVmb3JlIG5vdAotIyBzdWJqZWN0IHRvIHJlZmVyZW5jZSBjb3VudGluZy4gIEEgc3BlY2lhbCBjYXNlIGZvciB0aGUgdmFsdWUgIm51bGwiCi0jICh3aXRob3V0IHF1b3RlcykgaXMgdXNlZCBmb3IgZnVuY3Rpb25zIHdoaWNoIHJldHVybiBhIFB5T2JqZWN0KiB0eXBlIGJ1dAotIyBhbHdheXMgcmV0dXJuIE5VTEwuICBUaGlzIGlzIHVzZWQgYnkgc29tZSBvZiB0aGUgUHlFcnJfKigpIGZ1bmN0aW9ucywgaW4KLSMgcGFydGljdWxhci4KLQotIyBYWFggTk9URTogdGhlIDAvKzEvLTEgcmVmY291bnQgaW5mb3JtYXRpb24gZm9yIGFyZ3VtZW50cyBpcwotIyBjb25mdXNpbmchICBNdWNoIG1vcmUgdXNlZnVsIHdvdWxkIGJlIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlCi0jIGZ1bmN0aW9uICJzdGVhbHMiIGEgcmVmZXJlbmNlIHRvIHRoZSBhcmd1bWVudCBvciBub3QuICBUYWtlIGZvcgotIyBleGFtcGxlIFB5TGlzdF9TZXRJdGVtKGxpc3QsIGksIGl0ZW0pLiAgVGhpcyBsaXN0cyBhcyBhIDAgY2hhbmdlIGZvcgotIyBib3RoIHRoZSBsaXN0IGFuZCB0aGUgaXRlbSBhcmd1bWVudHMuICBIb3dldmVyLCBpbiBmYWN0IGl0IHN0ZWFscyBhCi0jIHJlZmVyZW5jZSB0byB0aGUgaXRlbSBhcmd1bWVudCEKLQotIyBUaGUgcGFyYW1ldGVyIG5hbWVzIGFyZSBhcyB0aGV5IGFwcGVhciBpbiB0aGUgQVBJIG1hbnVhbCwgbm90IHRoZSBzb3VyY2UKLSMgY29kZS4gCi0KLVB5Qm9vbF9Gcm9tTG9uZzpQeU9iamVjdCo6OisxOgotUHlCb29sX0Zyb21Mb25nOmxvbmc6djowOgotCi1QeUJ1ZmZlcl9Gcm9tT2JqZWN0OlB5T2JqZWN0Kjo6KzE6Ci1QeUJ1ZmZlcl9Gcm9tT2JqZWN0OlB5T2JqZWN0KjpiYXNlOisxOgotUHlCdWZmZXJfRnJvbU9iamVjdDppbnQ6b2Zmc2V0OjoKLVB5QnVmZmVyX0Zyb21PYmplY3Q6aW50OnNpemU6OgotCi1QeUJ1ZmZlcl9Gcm9tUmVhZFdyaXRlT2JqZWN0OlB5T2JqZWN0Kjo6KzE6Ci1QeUJ1ZmZlcl9Gcm9tUmVhZFdyaXRlT2JqZWN0OlB5T2JqZWN0KjpiYXNlOisxOgotUHlCdWZmZXJfRnJvbVJlYWRXcml0ZU9iamVjdDppbnQ6b2Zmc2V0OjoKLVB5QnVmZmVyX0Zyb21SZWFkV3JpdGVPYmplY3Q6aW50OnNpemU6OgotCi1QeUJ1ZmZlcl9Gcm9tTWVtb3J5OlB5T2JqZWN0Kjo6KzE6Ci1QeUJ1ZmZlcl9Gcm9tTWVtb3J5OnZvaWQqOnB0cjo6Ci1QeUJ1ZmZlcl9Gcm9tTWVtb3J5OmludDpzaXplOjoKLQotUHlCdWZmZXJfRnJvbVJlYWRXcml0ZU1lbW9yeTpQeU9iamVjdCo6OisxOgotUHlCdWZmZXJfRnJvbVJlYWRXcml0ZU1lbW9yeTp2b2lkKjpwdHI6OgotUHlCdWZmZXJfRnJvbVJlYWRXcml0ZU1lbW9yeTppbnQ6c2l6ZTo6Ci0KLVB5QnVmZmVyX05ldzpQeU9iamVjdCo6OisxOgotUHlCdWZmZXJfTmV3OmludDpzaXplOjoKLQotUHlDT2JqZWN0X0FzVm9pZFB0cjp2b2lkKjo6OgotUHlDT2JqZWN0X0FzVm9pZFB0cjpQeU9iamVjdCo6c2VsZjowOgotCi1QeUNPYmplY3RfRnJvbVZvaWRQdHI6UHlPYmplY3QqOjorMToKLVB5Q09iamVjdF9Gcm9tVm9pZFB0cjp2b2lkKjpjb2JqOjoKLVB5Q09iamVjdF9Gcm9tVm9pZFB0cjo6dm9pZCAoKiBkZXN0cikodm9pZCogKTo6Ci0KLVB5Q09iamVjdF9Gcm9tVm9pZFB0ckFuZERlc2M6UHlPYmplY3QqOjorMToKLVB5Q09iamVjdF9Gcm9tVm9pZFB0ckFuZERlc2M6dm9pZCo6Y29iajo6Ci1QeUNPYmplY3RfRnJvbVZvaWRQdHJBbmREZXNjOnZvaWQqOmRlc2M6OgotUHlDT2JqZWN0X0Zyb21Wb2lkUHRyQW5kRGVzYzp2b2lkKCopKHZvaWQqLHZvaWQqKTpkZXN0cjo6Ci0KLVB5Q09iamVjdF9HZXREZXNjOnZvaWQqOjo6Ci1QeUNPYmplY3RfR2V0RGVzYzpQeU9iamVjdCo6c2VsZjowOgotCi1QeUNlbGxfTmV3OlB5T2JqZWN0Kjo6KzE6Ci1QeUNlbGxfTmV3OlB5T2JqZWN0KjpvYjowOgotCi1QeUNlbGxfR0VUOlB5T2JqZWN0Kjo6MDoKLVB5Q2VsbF9HRVQ6UHlPYmplY3QqOm9iOjA6Ci0KLVB5Q2VsbF9HZXQ6UHlPYmplY3QqOjorMToKLVB5Q2VsbF9HZXQ6UHlPYmplY3QqOmNlbGw6MDoKLQotUHlDZWxsX1NFVDp2b2lkOjo6Ci1QeUNlbGxfU0VUOlB5T2JqZWN0KjpjZWxsOjA6Ci1QeUNlbGxfU0VUOlB5T2JqZWN0Kjp2YWx1ZTowOgotCi1QeUNlbGxfU2V0OmludDo6OgotUHlDZWxsX1NldDpQeU9iamVjdCo6Y2VsbDowOgotUHlDZWxsX1NldDpQeU9iamVjdCo6dmFsdWU6MDoKLQotUHlDYWxsSXRlcl9OZXc6UHlPYmplY3QqOjorMToKLVB5Q2FsbEl0ZXJfTmV3OlB5T2JqZWN0KjpjYWxsYWJsZTo6Ci1QeUNhbGxJdGVyX05ldzpQeU9iamVjdCo6c2VudGluZWw6OgotCi1QeUNhbGxhYmxlX0NoZWNrOmludDo6OgotUHlDYWxsYWJsZV9DaGVjazpQeU9iamVjdCo6bzowOgotCi1QeUNvbXBsZXhfQXNDQ29tcGxleDpQeV9jb21wbGV4Ojo6Ci1QeUNvbXBsZXhfQXNDQ29tcGxleDpQeU9iamVjdCo6b3A6MDoKLQotUHlDb21wbGV4X0NoZWNrOmludDo6OgotUHlDb21wbGV4X0NoZWNrOlB5T2JqZWN0KjpwOjA6Ci0KLVB5Q29tcGxleF9Gcm9tQ0NvbXBsZXg6UHlPYmplY3QqOjorMToKLVB5Q29tcGxleF9Gcm9tQ0NvbXBsZXg6OlB5X2NvbXBsZXggdjo6Ci0KLVB5Q29tcGxleF9Gcm9tRG91YmxlczpQeU9iamVjdCo6OisxOgotUHlDb21wbGV4X0Zyb21Eb3VibGVzOjpkb3VibGUgcmVhbDo6Ci1QeUNvbXBsZXhfRnJvbURvdWJsZXM6OmRvdWJsZSBpbWFnOjoKLQotUHlDb21wbGV4X0ltYWdBc0RvdWJsZTpkb3VibGU6OjoKLVB5Q29tcGxleF9JbWFnQXNEb3VibGU6UHlPYmplY3QqOm9wOjA6Ci0KLVB5Q29tcGxleF9SZWFsQXNEb3VibGU6ZG91YmxlOjo6Ci1QeUNvbXBsZXhfUmVhbEFzRG91YmxlOlB5T2JqZWN0KjpvcDowOgotCi1QeURhdGVfRnJvbURhdGU6UHlPYmplY3QqOjorMToKLVB5RGF0ZV9Gcm9tRGF0ZTppbnQ6eWVhcjo6Ci1QeURhdGVfRnJvbURhdGU6aW50Om1vbnRoOjoKLVB5RGF0ZV9Gcm9tRGF0ZTppbnQ6ZGF5OjoKLQotUHlEYXRlX0Zyb21UaW1lc3RhbXA6UHlPYmplY3QqOjorMToKLVB5RGF0ZV9Gcm9tVGltZXN0YW1wOlB5T2JqZWN0KjphcmdzOjA6Ci0KLVB5RGF0ZVRpbWVfRnJvbURhdGVBbmRUaW1lOlB5T2JqZWN0Kjo6KzE6Ci1QeURhdGVUaW1lX0Zyb21EYXRlQW5kVGltZTppbnQ6eWVhcjo6Ci1QeURhdGVUaW1lX0Zyb21EYXRlQW5kVGltZTppbnQ6bW9udGg6OgotUHlEYXRlVGltZV9Gcm9tRGF0ZUFuZFRpbWU6aW50OmRheTo6Ci1QeURhdGVUaW1lX0Zyb21EYXRlQW5kVGltZTppbnQ6aG91cjo6Ci1QeURhdGVUaW1lX0Zyb21EYXRlQW5kVGltZTppbnQ6bWludXRlOjoKLVB5RGF0ZVRpbWVfRnJvbURhdGVBbmRUaW1lOmludDpzZWNvbmQ6OgotUHlEYXRlVGltZV9Gcm9tRGF0ZUFuZFRpbWU6aW50OnVzZWNvbmQ6OgotCi1QeURhdGVUaW1lX0Zyb21UaW1lc3RhbXA6UHlPYmplY3QqOjorMToKLVB5RGF0ZVRpbWVfRnJvbVRpbWVzdGFtcDpQeU9iamVjdCo6YXJnczowOgotCi1QeURlbHRhX0Zyb21EU1U6UHlPYmplY3QqOjorMToKLVB5RGVsdGFfRnJvbURTVTppbnQ6ZGF5czo6Ci1QeURlbHRhX0Zyb21EU1U6aW50OnNlY29uZHM6OgotUHlEZWx0YV9Gcm9tRFNVOmludDp1c2Vjb25kczo6Ci0KLVB5RGVzY3JfTmV3Q2xhc3NNZXRob2Q6UHlPYmplY3QqOjorMToKLVB5RGVzY3JfTmV3Q2xhc3NNZXRob2Q6UHlUeXBlT2JqZWN0Kjp0eXBlOjoKLVB5RGVzY3JfTmV3Q2xhc3NNZXRob2Q6UHlNZXRob2REZWYqOm1ldGhvZDo6Ci0KLVB5RGVzY3JfTmV3R2V0U2V0OlB5T2JqZWN0Kjo6KzE6Ci1QeURlc2NyX05ld0dldFNldDpQeVR5cGVPYmplY3QqOnR5cGU6OgotUHlEZXNjcl9OZXdHZXRTZXQ6UHlHZXRTZXREZWYqOmdldHNldDo6Ci0KLVB5RGVzY3JfTmV3TWVtYmVyOlB5T2JqZWN0Kjo6KzE6Ci1QeURlc2NyX05ld01lbWJlcjpQeVR5cGVPYmplY3QqOnR5cGU6OgotUHlEZXNjcl9OZXdNZW1iZXI6UHlNZW1iZXJEZWYqOm1lbWJlcjo6Ci0KLVB5RGVzY3JfTmV3TWV0aG9kOlB5T2JqZWN0Kjo6KzE6Ci1QeURlc2NyX05ld01ldGhvZDpQeVR5cGVPYmplY3QqOnR5cGU6OgotUHlEZXNjcl9OZXdNZXRob2Q6UHlNZXRob2REZWYqOm1ldGg6OgotCi1QeURlc2NyX05ld1dyYXBwZXI6UHlPYmplY3QqOjorMToKLVB5RGVzY3JfTmV3V3JhcHBlcjpQeVR5cGVPYmplY3QqOnR5cGU6OgotUHlEZXNjcl9OZXdXcmFwcGVyOnN0cnVjdCB3cmFwcGVyYmFzZSo6YmFzZTo6Ci1QeURlc2NyX05ld1dyYXBwZXI6dm9pZCo6d3JhcHBlZDo6Ci0KLVB5RGljdF9DaGVjazppbnQ6OjoKLVB5RGljdF9DaGVjazpQeU9iamVjdCo6cDowOgotCi1QeURpY3RfQ2xlYXI6dm9pZDo6OgotUHlEaWN0X0NsZWFyOlB5T2JqZWN0KjpwOjA6Ci0KLVB5RGljdF9EZWxJdGVtOmludDo6OgotUHlEaWN0X0RlbEl0ZW06UHlPYmplY3QqOnA6MDoKLVB5RGljdF9EZWxJdGVtOlB5T2JqZWN0KjprZXk6MDoKLQotUHlEaWN0X0RlbEl0ZW1TdHJpbmc6aW50Ojo6Ci1QeURpY3RfRGVsSXRlbVN0cmluZzpQeU9iamVjdCo6cDowOgotUHlEaWN0X0RlbEl0ZW1TdHJpbmc6Y2hhcio6a2V5OjoKLQotUHlEaWN0X0dldEl0ZW06UHlPYmplY3QqOjowOjAKLVB5RGljdF9HZXRJdGVtOlB5T2JqZWN0KjpwOjA6Ci1QeURpY3RfR2V0SXRlbTpQeU9iamVjdCo6a2V5OjA6Ci0KLVB5RGljdF9HZXRJdGVtU3RyaW5nOlB5T2JqZWN0Kjo6MDoKLVB5RGljdF9HZXRJdGVtU3RyaW5nOlB5T2JqZWN0KjpwOjA6Ci1QeURpY3RfR2V0SXRlbVN0cmluZzpjaGFyKjprZXk6OgotCi1QeURpY3RfSXRlbXM6UHlPYmplY3QqOjorMToKLVB5RGljdF9JdGVtczpQeU9iamVjdCo6cDowOgotCi1QeURpY3RfS2V5czpQeU9iamVjdCo6OisxOgotUHlEaWN0X0tleXM6UHlPYmplY3QqOnA6MDoKLQotUHlEaWN0X05ldzpQeU9iamVjdCo6OisxOgotCi1QeURpY3RfQ29weTpQeU9iamVjdCo6OisxOgotUHlEaWN0X0NvcHk6UHlPYmplY3QqOnA6MDoKLQotUHlEaWN0X05leHQ6aW50Ojo6Ci1QeURpY3RfTmV4dDpQeU9iamVjdCo6cDowOgotUHlEaWN0X05leHQ6aW50OnBwb3M6OgotUHlEaWN0X05leHQ6UHlPYmplY3QqKjpwa2V5OjA6Ci1QeURpY3RfTmV4dDpQeU9iamVjdCoqOnB2YWx1ZTowOgotCi1QeURpY3RfU2V0SXRlbTppbnQ6OjoKLVB5RGljdF9TZXRJdGVtOlB5T2JqZWN0KjpwOjA6Ci1QeURpY3RfU2V0SXRlbTpQeU9iamVjdCo6a2V5OisxOgotUHlEaWN0X1NldEl0ZW06UHlPYmplY3QqOnZhbDorMToKLQotUHlEaWN0X1NldEl0ZW1TdHJpbmc6aW50Ojo6Ci1QeURpY3RfU2V0SXRlbVN0cmluZzpQeU9iamVjdCo6cDowOgotUHlEaWN0X1NldEl0ZW1TdHJpbmc6Y2hhcio6a2V5OjoKLVB5RGljdF9TZXRJdGVtU3RyaW5nOlB5T2JqZWN0Kjp2YWw6KzE6Ci0KLVB5RGljdF9TaXplOmludDo6OgotUHlEaWN0X1NpemU6UHlPYmplY3QqOnA6OgotCi1QeURpY3RfVmFsdWVzOlB5T2JqZWN0Kjo6KzE6Ci1QeURpY3RfVmFsdWVzOlB5T2JqZWN0KjpwOjA6Ci0KLVB5RGljdFByb3h5X05ldzpQeU9iamVjdCo6OisxOgotUHlEaWN0UHJveHlfTmV3OlB5T2JqZWN0KjpkaWN0OjA6Ci0KLVB5RXJyX0JhZEFyZ3VtZW50OmludDo6OgotCi1QeUVycl9CYWRJbnRlcm5hbENhbGw6dm9pZDo6OgotCi1QeUVycl9DaGVja1NpZ25hbHM6aW50Ojo6Ci0KLVB5RXJyX0NsZWFyOnZvaWQ6OjoKLQotUHlFcnJfRXhjZXB0aW9uTWF0Y2hlczppbnQ6OjoKLVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXM6UHlPYmplY3QqOmV4YzowOgotCi1QeUVycl9GZXRjaDp2b2lkOjo6Ci1QeUVycl9GZXRjaDpQeU9iamVjdCoqOnB0eXBlOjA6Ci1QeUVycl9GZXRjaDpQeU9iamVjdCoqOnB2YWx1ZTowOgotUHlFcnJfRmV0Y2g6UHlPYmplY3QqKjpwdHJhY2ViYWNrOjA6Ci0KLVB5RXJyX0dpdmVuRXhjZXB0aW9uTWF0Y2hlczppbnQ6OjoKLVB5RXJyX0dpdmVuRXhjZXB0aW9uTWF0Y2hlczpQeU9iamVjdCo6Z2l2ZW46MDoKLVB5RXJyX0dpdmVuRXhjZXB0aW9uTWF0Y2hlczpQeU9iamVjdCo6ZXhjOjA6Ci0KLVB5RXJyX05ld0V4Y2VwdGlvbjpQeU9iamVjdCo6OisxOgotUHlFcnJfTmV3RXhjZXB0aW9uOmNoYXIqOm5hbWU6OgotUHlFcnJfTmV3RXhjZXB0aW9uOlB5T2JqZWN0KjpiYXNlOjA6Ci1QeUVycl9OZXdFeGNlcHRpb246UHlPYmplY3QqOmRpY3Q6MDoKLQotUHlFcnJfTm9NZW1vcnk6UHlPYmplY3QqOjpudWxsOgotCi1QeUVycl9Ob3JtYWxpemVFeGNlcHRpb246dm9pZDo6OgotUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uOlB5T2JqZWN0Kio6ZXhjOjo/Pz8KLVB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbjpQeU9iamVjdCoqOnZhbDo6Pz8/Ci1QeUVycl9Ob3JtYWxpemVFeGNlcHRpb246UHlPYmplY3QqKjp0Yjo6Pz8/Ci0KLVB5RXJyX09jY3VycmVkOlB5T2JqZWN0Kjo6MDoKLQotUHlFcnJfUHJpbnQ6dm9pZDo6OgotCi1QeUVycl9SZXN0b3JlOnZvaWQ6OjoKLVB5RXJyX1Jlc3RvcmU6UHlPYmplY3QqOnR5cGU6LTE6Ci1QeUVycl9SZXN0b3JlOlB5T2JqZWN0Kjp2YWx1ZTotMToKLVB5RXJyX1Jlc3RvcmU6UHlPYmplY3QqOnRyYWNlYmFjazotMToKLQotUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnI6UHlPYmplY3QqOjpudWxsOgotUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnI6UHlPYmplY3QqOnR5cGU6MDoKLVB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyOmludDppZXJyOjoKLQotUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWU6UHlPYmplY3QqOjpudWxsOgotUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWU6UHlPYmplY3QqOnR5cGU6MDoKLVB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lOmludDppZXJyOjoKLVB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lOmNoYXIqOmZpbGVuYW1lOjoKLQotUHlFcnJfU2V0RnJvbUVycm5vOlB5T2JqZWN0Kjo6bnVsbDoKLVB5RXJyX1NldEZyb21FcnJubzpQeU9iamVjdCo6dHlwZTowOgotCi1QeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWU6UHlPYmplY3QqOjpudWxsOgotUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lOlB5T2JqZWN0Kjp0eXBlOjA6Ci1QeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWU6Y2hhcio6ZmlsZW5hbWU6OgotCi1QeUVycl9TZXRGcm9tV2luZG93c0VycjpQeU9iamVjdCo6Om51bGw6Ci1QeUVycl9TZXRGcm9tV2luZG93c0VycjppbnQ6aWVycjo6Ci0KLVB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lOlB5T2JqZWN0Kjo6bnVsbDoKLVB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lOmludDppZXJyOjoKLVB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lOmNoYXIqOmZpbGVuYW1lOjoKLQotUHlFcnJfU2V0SW50ZXJydXB0OnZvaWQ6OjoKLQotUHlFcnJfU2V0Tm9uZTp2b2lkOjo6Ci1QeUVycl9TZXROb25lOlB5T2JqZWN0Kjp0eXBlOisxOgotCi1QeUVycl9TZXRPYmplY3Q6dm9pZDo6OgotUHlFcnJfU2V0T2JqZWN0OlB5T2JqZWN0Kjp0eXBlOisxOgotUHlFcnJfU2V0T2JqZWN0OlB5T2JqZWN0Kjp2YWx1ZTorMToKLQotUHlFcnJfU2V0U3RyaW5nOnZvaWQ6OjoKLVB5RXJyX1NldFN0cmluZzpQeU9iamVjdCo6dHlwZTorMToKLVB5RXJyX1NldFN0cmluZzpjaGFyKjptZXNzYWdlOjoKLQotUHlFcnJfRm9ybWF0OlB5T2JqZWN0Kjo6bnVsbDoKLVB5RXJyX0Zvcm1hdDpQeU9iamVjdCo6ZXhjZXB0aW9uOisxOgotUHlFcnJfRm9ybWF0OmNoYXIqOmZvcm1hdDo6Ci1QeUVycl9Gb3JtYXQ6Oi4uLjo6Ci0KLVB5RXJyX1dhcm46aW50Ojo6Ci1QeUVycl9XYXJuOlB5T2JqZWN0KjpjYXRlZ29yeTowOgotUHlFcnJfV2FybjpjaGFyKjptZXNzYWdlOjoKLQotUHlFcnJfV2FybkV4OmludDo6OgotUHlFcnJfV2FybkV4OlB5T2JqZWN0KjpjYXRlZ29yeTowOgotUHlFcnJfV2FybkV4OmNvbnN0IGNoYXIqOm1lc3NhZ2U6OgotUHlFcnJfV2FybkV4OlB5X3NzaXplX3Q6c3RhY2tfbGV2ZWw6OgotCi1QeUV2YWxfQWNxdWlyZUxvY2s6dm9pZDo6OgotCi1QeUV2YWxfQWNxdWlyZVRocmVhZDp2b2lkOjo6Ci1QeUV2YWxfQWNxdWlyZVRocmVhZDpQeVRocmVhZFN0YXRlKjp0c3RhdGU6OgotCi1QeUV2YWxfSW5pdFRocmVhZHM6dm9pZDo6OgotCi1QeUV2YWxfUmVsZWFzZUxvY2s6dm9pZDo6OgotCi1QeUV2YWxfUmVsZWFzZVRocmVhZDp2b2lkOjo6Ci1QeUV2YWxfUmVsZWFzZVRocmVhZDpQeVRocmVhZFN0YXRlKjp0c3RhdGU6OgotCi1QeUV2YWxfUmVzdG9yZVRocmVhZDp2b2lkOjo6Ci1QeUV2YWxfUmVzdG9yZVRocmVhZDpQeVRocmVhZFN0YXRlKjp0c3RhdGU6OgotCi1QeUV2YWxfU2F2ZVRocmVhZDpQeVRocmVhZFN0YXRlKjo6OgotCi1QeUV2YWxfRXZhbENvZGU6UHlPYmplY3QqOjorMToKLVB5RXZhbF9FdmFsQ29kZTpQeUNvZGVPYmplY3QqOmNvOjA6Ci1QeUV2YWxfRXZhbENvZGU6UHlPYmplY3QqOmdsb2JhbHM6MDoKLVB5RXZhbF9FdmFsQ29kZTpQeU9iamVjdCo6bG9jYWxzOjA6Ci0KLVB5RmlsZV9Bc0ZpbGU6RklMRSo6OjoKLVB5RmlsZV9Bc0ZpbGU6UHlGaWxlT2JqZWN0KjpwOjA6Ci0KLVB5RmlsZV9DaGVjazppbnQ6OjoKLVB5RmlsZV9DaGVjazpQeU9iamVjdCo6cDowOgotCi1QeUZpbGVfRnJvbUZpbGU6UHlPYmplY3QqOjorMToKLVB5RmlsZV9Gcm9tRmlsZTpGSUxFKjpmcDo6Ci1QeUZpbGVfRnJvbUZpbGU6Y2hhcio6bmFtZTo6Ci1QeUZpbGVfRnJvbUZpbGU6Y2hhcio6bW9kZTo6Ci1QeUZpbGVfRnJvbUZpbGU6aW50KCo6Y2xvc2UpOjoKLQotUHlGaWxlX0Zyb21TdHJpbmc6UHlPYmplY3QqOjorMToKLVB5RmlsZV9Gcm9tU3RyaW5nOmNoYXIqOm5hbWU6OgotUHlGaWxlX0Zyb21TdHJpbmc6Y2hhcio6bW9kZTo6Ci0KLVB5RmlsZV9HZXRMaW5lOlB5T2JqZWN0Kjo6KzE6Ci1QeUZpbGVfR2V0TGluZTpQeU9iamVjdCo6cDo6Ci1QeUZpbGVfR2V0TGluZTppbnQ6bjo6Ci0KLVB5RmlsZV9OYW1lOlB5T2JqZWN0Kjo6MDoKLVB5RmlsZV9OYW1lOlB5T2JqZWN0KjpwOjA6Ci0KLVB5RmlsZV9TZXRCdWZTaXplOnZvaWQ6OjoKLVB5RmlsZV9TZXRCdWZTaXplOlB5RmlsZU9iamVjdCo6cDowOgotUHlGaWxlX1NldEJ1ZlNpemU6aW50Om46OgotCi1QeUZpbGVfU29mdFNwYWNlOmludDo6OgotUHlGaWxlX1NvZnRTcGFjZTpQeUZpbGVPYmplY3QqOnA6MDoKLVB5RmlsZV9Tb2Z0U3BhY2U6aW50Om5ld2ZsYWc6OgotCi1QeUZpbGVfV3JpdGVPYmplY3Q6aW50Ojo6Ci1QeUZpbGVfV3JpdGVPYmplY3Q6UHlPYmplY3QqOm9iajowOgotUHlGaWxlX1dyaXRlT2JqZWN0OlB5RmlsZU9iamVjdCo6cDowOgotUHlGaWxlX1dyaXRlT2JqZWN0OmludDpmbGFnczo6Ci0KLVB5RmlsZV9Xcml0ZVN0cmluZzppbnQ6OjoKLVB5RmlsZV9Xcml0ZVN0cmluZzpjb25zdCBjaGFyKjpzOjoKLVB5RmlsZV9Xcml0ZVN0cmluZzpQeUZpbGVPYmplY3QqOnA6MDoKLVB5RmlsZV9Xcml0ZVN0cmluZzppbnQ6ZmxhZ3M6OgotCi1QeUZsb2F0X0FTX0RPVUJMRTpkb3VibGU6OjoKLVB5RmxvYXRfQVNfRE9VQkxFOlB5T2JqZWN0KjpweWZsb2F0OjA6Ci0KLVB5RmxvYXRfQXNEb3VibGU6ZG91YmxlOjo6Ci1QeUZsb2F0X0FzRG91YmxlOlB5T2JqZWN0KjpweWZsb2F0OjA6Ci0KLVB5RmxvYXRfQ2hlY2s6aW50Ojo6Ci1QeUZsb2F0X0NoZWNrOlB5T2JqZWN0KjpwOjA6Ci0KLVB5RmxvYXRfRnJvbURvdWJsZTpQeU9iamVjdCo6OisxOgotUHlGbG9hdF9Gcm9tRG91YmxlOmRvdWJsZTp2OjoKLQotUHlGbG9hdF9Gcm9tU3RyaW5nOlB5T2JqZWN0Kjo6KzE6Ci1QeUZsb2F0X0Zyb21TdHJpbmc6UHlPYmplY3QqOnN0cjowOgotCi1QeUZyb3plblNldF9OZXc6UHlPYmplY3QqOjorMToKLVB5RnJvemVuU2V0X05ldzpQeU9iamVjdCo6aXRlcmFibGU6MDoKLQotUHlGdW5jdGlvbl9HZXRDbG9zdXJlOlB5T2JqZWN0Kjo6MDoKLVB5RnVuY3Rpb25fR2V0Q2xvc3VyZTpQeU9iamVjdCo6b3A6MDoKLQotUHlGdW5jdGlvbl9HZXRDb2RlOlB5T2JqZWN0Kjo6MDoKLVB5RnVuY3Rpb25fR2V0Q29kZTpQeU9iamVjdCo6b3A6MDoKLQotUHlGdW5jdGlvbl9HZXREZWZhdWx0czpQeU9iamVjdCo6OjA6Ci1QeUZ1bmN0aW9uX0dldERlZmF1bHRzOlB5T2JqZWN0KjpvcDowOgotCi1QeUZ1bmN0aW9uX0dldEdsb2JhbHM6UHlPYmplY3QqOjowOgotUHlGdW5jdGlvbl9HZXRHbG9iYWxzOlB5T2JqZWN0KjpvcDowOgotCi1QeUZ1bmN0aW9uX0dldE1vZHVsZTpQeU9iamVjdCo6OjA6Ci1QeUZ1bmN0aW9uX0dldE1vZHVsZTpQeU9iamVjdCo6b3A6MDoKLQotUHlGdW5jdGlvbl9OZXc6UHlPYmplY3QqOjorMToKLVB5RnVuY3Rpb25fTmV3OlB5T2JqZWN0Kjpjb2RlOisxOgotUHlGdW5jdGlvbl9OZXc6UHlPYmplY3QqOmdsb2JhbHM6KzE6Ci0KLVB5RnVuY3Rpb25fU2V0Q2xvc3VyZTppbnQ6OjoKLVB5RnVuY3Rpb25fU2V0Q2xvc3VyZTpQeU9iamVjdCo6b3A6MDoKLVB5RnVuY3Rpb25fU2V0Q2xvc3VyZTpQeU9iamVjdCo6Y2xvc3VyZTorMToKLQotUHlGdW5jdGlvbl9TZXREZWZhdWx0czppbnQ6OjoKLVB5RnVuY3Rpb25fU2V0RGVmYXVsdHM6UHlPYmplY3QqOm9wOjA6Ci1QeUZ1bmN0aW9uX1NldERlZmF1bHRzOlB5T2JqZWN0KjpkZWZhdWx0czorMToKLQotUHlHZW5fTmV3OlB5T2JqZWN0Kjo6KzE6Ci1QeUdlbl9OZXc6UHlGcmFtZU9iamVjdCo6ZnJhbWU6MDoKLQotUHlfSW5pdE1vZHVsZTpQeU9iamVjdCo6OjA6Ci1QeV9Jbml0TW9kdWxlOmNoYXIqOm5hbWU6OgotUHlfSW5pdE1vZHVsZTpQeU1ldGhvZERlZltdOm1ldGhvZHM6OgotCi1QeV9Jbml0TW9kdWxlMzpQeU9iamVjdCo6OjA6Ci1QeV9Jbml0TW9kdWxlMzpjaGFyKjpuYW1lOjoKLVB5X0luaXRNb2R1bGUzOlB5TWV0aG9kRGVmW106bWV0aG9kczo6Ci1QeV9Jbml0TW9kdWxlMzpjaGFyKjpkb2M6OgotCi1QeV9Jbml0TW9kdWxlNDpQeU9iamVjdCo6OjA6Ci1QeV9Jbml0TW9kdWxlNDpjaGFyKjpuYW1lOjoKLVB5X0luaXRNb2R1bGU0OlB5TWV0aG9kRGVmW106bWV0aG9kczo6Ci1QeV9Jbml0TW9kdWxlNDpjaGFyKjpkb2M6OgotUHlfSW5pdE1vZHVsZTQ6UHlPYmplY3QqOnNlbGY6OgotUHlfSW5pdE1vZHVsZTQ6aW50OmFwaXZlcjo6dXN1YWxseSBwcm92aWRlZCBieSBQeV9Jbml0TW9kdWxlIG9yIFB5X0luaXRNb2R1bGUzCi0KLVB5SW1wb3J0X0FkZE1vZHVsZTpQeU9iamVjdCo6OjA6cmVmZXJlbmNlIGJvcnJvd2VkIGZyb20gc3lzLm1vZHVsZXMKLVB5SW1wb3J0X0FkZE1vZHVsZTpjaGFyKjpuYW1lOjoKLQotUHlJbXBvcnRfQ2xlYW51cDp2b2lkOjo6Ci0KLVB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlOlB5T2JqZWN0Kjo6KzE6Ci1QeUltcG9ydF9FeGVjQ29kZU1vZHVsZTpjaGFyKjpuYW1lOjoKLVB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlOlB5T2JqZWN0KjpjbzowOgotCi1QeUltcG9ydF9HZXRNYWdpY051bWJlcjpsb25nOjo6Ci0KLVB5SW1wb3J0X0dldE1vZHVsZURpY3Q6UHlPYmplY3QqOjowOgotCi1QeUltcG9ydF9JbXBvcnQ6UHlPYmplY3QqOjorMToKLVB5SW1wb3J0X0ltcG9ydDpQeU9iamVjdCo6bmFtZTowOgotCi1QeUltcG9ydF9JbXBvcnRGcm96ZW5Nb2R1bGU6aW50Ojo6Ci1QeUltcG9ydF9JbXBvcnRGcm96ZW5Nb2R1bGU6Y2hhcio6OjoKLQotUHlJbXBvcnRfSW1wb3J0TW9kdWxlOlB5T2JqZWN0Kjo6KzE6Ci1QeUltcG9ydF9JbXBvcnRNb2R1bGU6Y2hhcio6bmFtZTo6Ci0KLVB5SW1wb3J0X0ltcG9ydE1vZHVsZUV4OlB5T2JqZWN0Kjo6KzE6Ci1QeUltcG9ydF9JbXBvcnRNb2R1bGVFeDpjaGFyKjpuYW1lOjoKLVB5SW1wb3J0X0ltcG9ydE1vZHVsZUV4OlB5T2JqZWN0KjpnbG9iYWxzOjA6Pz8/Ci1QeUltcG9ydF9JbXBvcnRNb2R1bGVFeDpQeU9iamVjdCo6bG9jYWxzOjA6Pz8/Ci1QeUltcG9ydF9JbXBvcnRNb2R1bGVFeDpQeU9iamVjdCo6ZnJvbWxpc3Q6MDo/Pz8KLQotUHlJbXBvcnRfUmVsb2FkTW9kdWxlOlB5T2JqZWN0Kjo6KzE6Ci1QeUltcG9ydF9SZWxvYWRNb2R1bGU6UHlPYmplY3QqOm06MDoKLQotUHlJbnN0YW5jZV9OZXc6UHlPYmplY3QqOjorMToKLVB5SW5zdGFuY2VfTmV3OlB5T2JqZWN0KjprbGFzczorMToKLVB5SW5zdGFuY2VfTmV3OlB5T2JqZWN0Kjphcmc6MDoKLVB5SW5zdGFuY2VfTmV3OlB5T2JqZWN0KjprdzowOgotCi1QeUluc3RhbmNlX05ld1JhdzpQeU9iamVjdCo6OisxOgotUHlJbnN0YW5jZV9OZXdSYXc6UHlPYmplY3QqOmtsYXNzOisxOgotUHlJbnN0YW5jZV9OZXdSYXc6UHlPYmplY3QqOmRpY3Q6KzE6Ci0KLVB5SW50X0FTX0xPTkc6bG9uZzo6OgotUHlJbnRfQVNfTE9ORzpQeUludE9iamVjdCo6aW86MDoKLQotUHlJbnRfQXNMb25nOmxvbmc6OjoKLVB5SW50X0FzTG9uZzpQeU9iamVjdCo6aW86MDoKLQotUHlJbnRfQ2hlY2s6aW50Ojo6Ci1QeUludF9DaGVjazpQeU9iamVjdCo6b3A6MDoKLQotUHlJbnRfRnJvbUxvbmc6UHlPYmplY3QqOjorMToKLVB5SW50X0Zyb21Mb25nOmxvbmc6aXZhbDo6Ci0KLVB5SW50X0Zyb21TdHJpbmc6UHlPYmplY3QqOjorMToKLVB5SW50X0Zyb21TdHJpbmc6Y2hhcio6c3RyOjA6Ci1QeUludF9Gcm9tU3RyaW5nOmNoYXIqKjpwZW5kOjA6Ci1QeUludF9Gcm9tU3RyaW5nOmludDpiYXNlOjA6Ci0KLVB5SW50X0Zyb21Tc2l6ZV90OlB5T2JqZWN0Kjo6KzE6Ci1QeUludF9Gcm9tU3NpemVfdDpQeV9zc2l6ZV90Oml2YWw6OgotCi1QeUludF9HZXRNYXg6bG9uZzo6OgotCi1QeUludGVycHJldGVyU3RhdGVfQ2xlYXI6dm9pZDo6OgotUHlJbnRlcnByZXRlclN0YXRlX0NsZWFyOlB5SW50ZXJwcmV0ZXJTdGF0ZSo6aW50ZXJwOjoKLQotUHlJbnRlcnByZXRlclN0YXRlX0RlbGV0ZTp2b2lkOjo6Ci1QeUludGVycHJldGVyU3RhdGVfRGVsZXRlOlB5SW50ZXJwcmV0ZXJTdGF0ZSo6aW50ZXJwOjoKLQotUHlJbnRlcnByZXRlclN0YXRlX05ldzpQeUludGVycHJldGVyU3RhdGUqOjo6Ci0KLVB5SXRlcl9DaGVjazppbnQ6bzowOgotCi1QeUl0ZXJfTmV4dDpQeU9iamVjdCo6OisxOgotUHlJdGVyX05leHQ6UHlPYmplY3QqOm86MDoKLQotUHlMaXN0X0FwcGVuZDppbnQ6OjoKLVB5TGlzdF9BcHBlbmQ6UHlPYmplY3QqOmxpc3Q6MDoKLVB5TGlzdF9BcHBlbmQ6UHlPYmplY3QqOml0ZW06KzE6Ci0KLVB5TGlzdF9Bc1R1cGxlOlB5T2JqZWN0Kjo6KzE6Ci1QeUxpc3RfQXNUdXBsZTpQeU9iamVjdCo6bGlzdDowOgotCi1QeUxpc3RfQ2hlY2s6aW50Ojo6Ci1QeUxpc3RfQ2hlY2s6UHlPYmplY3QqOnA6MDoKLQotUHlMaXN0X0dFVF9JVEVNOlB5T2JqZWN0Kjo6MDoKLVB5TGlzdF9HRVRfSVRFTTpQeU9iamVjdCo6bGlzdDowOgotUHlMaXN0X0dFVF9JVEVNOmludDppOjA6Ci0KLVB5TGlzdF9HRVRfU0laRTppbnQ6OjoKLVB5TGlzdF9HRVRfU0laRTpQeU9iamVjdCo6bGlzdDowOgotCi1QeUxpc3RfR2V0SXRlbTpQeU9iamVjdCo6OjA6Ci1QeUxpc3RfR2V0SXRlbTpQeU9iamVjdCo6bGlzdDowOgotUHlMaXN0X0dldEl0ZW06aW50OmluZGV4OjoKLQotUHlMaXN0X0dldFNsaWNlOlB5T2JqZWN0Kjo6KzE6Ci1QeUxpc3RfR2V0U2xpY2U6UHlPYmplY3QqOmxpc3Q6MDoKLVB5TGlzdF9HZXRTbGljZTppbnQ6bG93OjoKLVB5TGlzdF9HZXRTbGljZTppbnQ6aGlnaDo6Ci0KLVB5TGlzdF9JbnNlcnQ6aW50Ojo6Ci1QeUxpc3RfSW5zZXJ0OlB5T2JqZWN0KjpsaXN0OjA6Ci1QeUxpc3RfSW5zZXJ0OmludDppbmRleDo6Ci1QeUxpc3RfSW5zZXJ0OlB5T2JqZWN0KjppdGVtOisxOgotCi1QeUxpc3RfTmV3OlB5T2JqZWN0Kjo6KzE6Ci1QeUxpc3RfTmV3OmludDpsZW46OgotCi1QeUxpc3RfUmV2ZXJzZTppbnQ6OjoKLVB5TGlzdF9SZXZlcnNlOlB5T2JqZWN0KjpsaXN0OjA6Ci0KLVB5TGlzdF9TRVRfSVRFTTp2b2lkOjo6Ci1QeUxpc3RfU0VUX0lURU06UHlPYmplY3QqOmxpc3Q6MDoKLVB5TGlzdF9TRVRfSVRFTTppbnQ6aTo6Ci1QeUxpc3RfU0VUX0lURU06UHlPYmplY3QqOm86MDoKLQotUHlMaXN0X1NldEl0ZW06aW50Ojo6Ci1QeUxpc3RfU2V0SXRlbTpQeU9iamVjdCo6bGlzdDowOgotUHlMaXN0X1NldEl0ZW06aW50OmluZGV4OjoKLVB5TGlzdF9TZXRJdGVtOlB5T2JqZWN0KjppdGVtOjA6Ci0KLVB5TGlzdF9TZXRTbGljZTppbnQ6OjoKLVB5TGlzdF9TZXRTbGljZTpQeU9iamVjdCo6bGlzdDowOgotUHlMaXN0X1NldFNsaWNlOmludDpsb3c6OgotUHlMaXN0X1NldFNsaWNlOmludDpoaWdoOjoKLVB5TGlzdF9TZXRTbGljZTpQeU9iamVjdCo6aXRlbWxpc3Q6MDpidXQgaW5jcmVmcyBpdHMgZWxlbWVudHM/Ci0KLVB5TGlzdF9TaXplOmludDo6OgotUHlMaXN0X1NpemU6UHlPYmplY3QqOmxpc3Q6MDoKLQotUHlMaXN0X1NvcnQ6aW50Ojo6Ci1QeUxpc3RfU29ydDpQeU9iamVjdCo6bGlzdDowOgotCi1QeUxvbmdfQXNEb3VibGU6ZG91YmxlOjo6Ci1QeUxvbmdfQXNEb3VibGU6UHlPYmplY3QqOnB5bG9uZzowOgotCi1QeUxvbmdfQXNMb25nOmxvbmc6OjoKLVB5TG9uZ19Bc0xvbmc6UHlPYmplY3QqOnB5bG9uZzowOgotCi1QeUxvbmdfQXNVbnNpZ25lZExvbmc6dW5zaWduZWQgbG9uZzo6OgotUHlMb25nX0FzVW5zaWduZWRMb25nOlB5T2JqZWN0KjpweWxvbmc6MDoKLQotUHlMb25nX0NoZWNrOmludDo6OgotUHlMb25nX0NoZWNrOlB5T2JqZWN0KjpwOjA6Ci0KLVB5TG9uZ19Gcm9tRG91YmxlOlB5T2JqZWN0Kjo6KzE6Ci1QeUxvbmdfRnJvbURvdWJsZTpkb3VibGU6djo6Ci0KLVB5TG9uZ19Gcm9tTG9uZzpQeU9iamVjdCo6OisxOgotUHlMb25nX0Zyb21Mb25nOmxvbmc6djo6Ci0KLVB5TG9uZ19Gcm9tTG9uZ0xvbmc6UHlPYmplY3QqOjorMToKLVB5TG9uZ19Gcm9tTG9uZ0xvbmc6bG9uZyBsb25nOnY6OgotCi1QeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmc6UHlPYmplY3QqOjorMToKLVB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZzp1bnNpZ25lZCBsb25nIGxvbmc6djo6Ci0KLVB5TG9uZ19Gcm9tU3RyaW5nOlB5T2JqZWN0Kjo6KzE6Ci1QeUxvbmdfRnJvbVN0cmluZzpjaGFyKjpzdHI6OgotUHlMb25nX0Zyb21TdHJpbmc6Y2hhcioqOnBlbmQ6OgotUHlMb25nX0Zyb21TdHJpbmc6aW50OmJhc2U6OgotCi1QeUxvbmdfRnJvbVVuaWNvZGU6UHlPYmplY3QqOjorMToKLVB5TG9uZ19Gcm9tVW5pY29kZTpQeV9VTklDT0RFOnU6OgotUHlMb25nX0Zyb21Vbmljb2RlOmludDpsZW5ndGg6OgotUHlMb25nX0Zyb21Vbmljb2RlOmludDpiYXNlOjoKLQotUHlMb25nX0Zyb21VbnNpZ25lZExvbmc6UHlPYmplY3QqOjorMToKLVB5TG9uZ19Gcm9tVW5zaWduZWRMb25nOnVuc2lnbmVkbG9uZzp2OjoKLQotUHlMb25nX0Zyb21Wb2lkUHRyOlB5T2JqZWN0Kjo6KzE6Ci1QeUxvbmdfRnJvbVZvaWRQdHI6dm9pZCo6cDo6Ci0KLVB5TWFwcGluZ19DaGVjazppbnQ6OjoKLVB5TWFwcGluZ19DaGVjazpQeU9iamVjdCo6bzowOgotCi1QeU1hcHBpbmdfRGVsSXRlbTppbnQ6OjoKLVB5TWFwcGluZ19EZWxJdGVtOlB5T2JqZWN0KjpvOjA6Ci1QeU1hcHBpbmdfRGVsSXRlbTpQeU9iamVjdCo6a2V5OjA6Ci0KLVB5TWFwcGluZ19EZWxJdGVtU3RyaW5nOmludDo6OgotUHlNYXBwaW5nX0RlbEl0ZW1TdHJpbmc6UHlPYmplY3QqOm86MDoKLVB5TWFwcGluZ19EZWxJdGVtU3RyaW5nOmNoYXIqOmtleTo6Ci0KLVB5TWFwcGluZ19HZXRJdGVtU3RyaW5nOlB5T2JqZWN0Kjo6KzE6Ci1QeU1hcHBpbmdfR2V0SXRlbVN0cmluZzpQeU9iamVjdCo6bzowOgotUHlNYXBwaW5nX0dldEl0ZW1TdHJpbmc6Y2hhcio6a2V5OjoKLQotUHlNYXBwaW5nX0hhc0tleTppbnQ6OjoKLVB5TWFwcGluZ19IYXNLZXk6UHlPYmplY3QqOm86MDoKLVB5TWFwcGluZ19IYXNLZXk6UHlPYmplY3QqOmtleTo6Ci0KLVB5TWFwcGluZ19IYXNLZXlTdHJpbmc6aW50Ojo6Ci1QeU1hcHBpbmdfSGFzS2V5U3RyaW5nOlB5T2JqZWN0KjpvOjA6Ci1QeU1hcHBpbmdfSGFzS2V5U3RyaW5nOmNoYXIqOmtleTo6Ci0KLVB5TWFwcGluZ19JdGVtczpQeU9iamVjdCo6OisxOgotUHlNYXBwaW5nX0l0ZW1zOlB5T2JqZWN0KjpvOjA6Ci0KLVB5TWFwcGluZ19LZXlzOlB5T2JqZWN0Kjo6KzE6Ci1QeU1hcHBpbmdfS2V5czpQeU9iamVjdCo6bzowOgotCi1QeU1hcHBpbmdfTGVuZ3RoOmludDo6OgotUHlNYXBwaW5nX0xlbmd0aDpQeU9iamVjdCo6bzowOgotCi1QeU1hcHBpbmdfU2V0SXRlbVN0cmluZzppbnQ6OjoKLVB5TWFwcGluZ19TZXRJdGVtU3RyaW5nOlB5T2JqZWN0KjpvOjA6Ci1QeU1hcHBpbmdfU2V0SXRlbVN0cmluZzpjaGFyKjprZXk6OgotUHlNYXBwaW5nX1NldEl0ZW1TdHJpbmc6UHlPYmplY3QqOnY6KzE6Ci0KLVB5TWFwcGluZ19WYWx1ZXM6UHlPYmplY3QqOjorMToKLVB5TWFwcGluZ19WYWx1ZXM6UHlPYmplY3QqOm86MDoKLQotUHlNYXJzaGFsX1JlYWRMYXN0T2JqZWN0RnJvbUZpbGU6UHlPYmplY3QqOjorMToKLVB5TWFyc2hhbF9SZWFkTGFzdE9iamVjdEZyb21GaWxlOkZJTEUqOmZpbGU6OgotCi1QeU1hcnNoYWxfUmVhZE9iamVjdEZyb21GaWxlOlB5T2JqZWN0Kjo6KzE6Ci1QeU1hcnNoYWxfUmVhZE9iamVjdEZyb21GaWxlOkZJTEUqOmZpbGU6OgotCi1QeU1hcnNoYWxfUmVhZE9iamVjdEZyb21TdHJpbmc6UHlPYmplY3QqOjorMToKLVB5TWFyc2hhbF9SZWFkT2JqZWN0RnJvbVN0cmluZzpjaGFyKjpzdHJpbmc6OgotUHlNYXJzaGFsX1JlYWRPYmplY3RGcm9tU3RyaW5nOmludDpsZW46OgotCi1QeU1hcnNoYWxfV3JpdGVPYmplY3RUb1N0cmluZzpQeU9iamVjdCo6OisxOgotUHlNYXJzaGFsX1dyaXRlT2JqZWN0VG9TdHJpbmc6UHlPYmplY3QqOnZhbHVlOjA6Ci0KLVB5TWV0aG9kX0NsYXNzOlB5T2JqZWN0Kjo6MDoKLVB5TWV0aG9kX0NsYXNzOlB5T2JqZWN0KjppbTowOgotCi1QeU1ldGhvZF9GdW5jdGlvbjpQeU9iamVjdCo6OjA6Ci1QeU1ldGhvZF9GdW5jdGlvbjpQeU9iamVjdCo6aW06MDoKLQotUHlNZXRob2RfR0VUX0NMQVNTOlB5T2JqZWN0Kjo6MDoKLVB5TWV0aG9kX0dFVF9DTEFTUzpQeU9iamVjdCo6aW06MDoKLQotUHlNZXRob2RfR0VUX0ZVTkNUSU9OOlB5T2JqZWN0Kjo6MDoKLVB5TWV0aG9kX0dFVF9GVU5DVElPTjpQeU9iamVjdCo6aW06MDoKLQotUHlNZXRob2RfR0VUX1NFTEY6UHlPYmplY3QqOjowOgotUHlNZXRob2RfR0VUX1NFTEY6UHlPYmplY3QqOmltOjA6Ci0KLVB5TWV0aG9kX05ldzpQeU9iamVjdCo6OisxOgotUHlNZXRob2RfTmV3OlB5T2JqZWN0KjpmdW5jOjA6Ci1QeU1ldGhvZF9OZXc6UHlPYmplY3QqOnNlbGY6MDoKLVB5TWV0aG9kX05ldzpQeU9iamVjdCo6Y2xhc3M6MDoKLQotUHlNZXRob2RfU2VsZjpQeU9iamVjdCo6OjA6Ci1QeU1ldGhvZF9TZWxmOlB5T2JqZWN0KjppbTowOgotCi1QeU1vZHVsZV9HZXREaWN0OlB5T2JqZWN0Kjo6MDoKLVB5TW9kdWxlX0dldERpY3Q6OlB5T2JqZWN0KiBtb2R1bGU6MDoKLQotUHlNb2R1bGVfR2V0RmlsZW5hbWU6Y2hhcio6OjoKLVB5TW9kdWxlX0dldEZpbGVuYW1lOlB5T2JqZWN0Kjptb2R1bGU6MDoKLQotUHlNb2R1bGVfR2V0TmFtZTpjaGFyKjo6OgotUHlNb2R1bGVfR2V0TmFtZTpQeU9iamVjdCo6bW9kdWxlOjA6Ci0KLVB5TW9kdWxlX05ldzpQeU9iamVjdCo6OisxOgotUHlNb2R1bGVfTmV3OjpjaGFyKiBuYW1lOjoKLQotUHlOdW1iZXJfQWJzb2x1dGU6UHlPYmplY3QqOjorMToKLVB5TnVtYmVyX0Fic29sdXRlOlB5T2JqZWN0KjpvOjA6Ci0KLVB5TnVtYmVyX0FkZDpQeU9iamVjdCo6OisxOgotUHlOdW1iZXJfQWRkOlB5T2JqZWN0KjpvMTowOgotUHlOdW1iZXJfQWRkOlB5T2JqZWN0KjpvMjowOgotCi1QeU51bWJlcl9BbmQ6UHlPYmplY3QqOjorMToKLVB5TnVtYmVyX0FuZDpQeU9iamVjdCo6bzE6MDoKLVB5TnVtYmVyX0FuZDpQeU9iamVjdCo6bzI6MDoKLQotUHlOdW1iZXJfQ2hlY2s6UHlPYmplY3QqOm86MDoKLVB5TnVtYmVyX0NoZWNrOmludDo6OgotCi1QeU51bWJlcl9EaXZpZGU6UHlPYmplY3QqOjorMToKLVB5TnVtYmVyX0RpdmlkZTpQeU9iamVjdCo6bzE6MDoKLVB5TnVtYmVyX0RpdmlkZTpQeU9iamVjdCo6bzI6MDoKLQotUHlOdW1iZXJfRGl2bW9kOlB5T2JqZWN0Kjo6KzE6Ci1QeU51bWJlcl9EaXZtb2Q6UHlPYmplY3QqOm8xOjA6Ci1QeU51bWJlcl9EaXZtb2Q6UHlPYmplY3QqOm8yOjA6Ci0KLVB5TnVtYmVyX0Zsb2F0OlB5T2JqZWN0Kjo6KzE6Ci1QeU51bWJlcl9GbG9hdDpQeU9iamVjdCo6bzowOgotCi1QeU51bWJlcl9GbG9vckRpdmlkZTpQeU9iamVjdCo6OisxOgotUHlOdW1iZXJfRmxvb3JEaXZpZGU6UHlPYmplY3QqOnY6MDoKLVB5TnVtYmVyX0Zsb29yRGl2aWRlOlB5T2JqZWN0Kjp3OjA6Ci0KLVB5TnVtYmVyX0luUGxhY2VBZGQ6UHlPYmplY3QqOjorMToKLVB5TnVtYmVyX0luUGxhY2VBZGQ6UHlPYmplY3QqOnY6MDoKLVB5TnVtYmVyX0luUGxhY2VBZGQ6UHlPYmplY3QqOnc6MDoKLQotUHlOdW1iZXJfSW5QbGFjZUFuZDpQeU9iamVjdCo6OisxOgotUHlOdW1iZXJfSW5QbGFjZUFuZDpQeU9iamVjdCo6djowOgotUHlOdW1iZXJfSW5QbGFjZUFuZDpQeU9iamVjdCo6dzowOgotCi1QeU51bWJlcl9JblBsYWNlRGl2aWRlOlB5T2JqZWN0Kjo6KzE6Ci1QeU51bWJlcl9JblBsYWNlRGl2aWRlOlB5T2JqZWN0Kjp2OjA6Ci1QeU51bWJlcl9JblBsYWNlRGl2aWRlOlB5T2JqZWN0Kjp3OjA6Ci0KLVB5TnVtYmVyX0luUGxhY2VGbG9vckRpdmlkZTpQeU9iamVjdCo6OisxOgotUHlOdW1iZXJfSW5QbGFjZUZsb29yRGl2aWRlOlB5T2JqZWN0Kjp2OjA6Ci1QeU51bWJlcl9JblBsYWNlRmxvb3JEaXZpZGU6UHlPYmplY3QqOnc6MDoKLQotUHlOdW1iZXJfSW5QbGFjZUxzaGlmdDpQeU9iamVjdCo6OisxOgotUHlOdW1iZXJfSW5QbGFjZUxzaGlmdDpQeU9iamVjdCo6djowOgotUHlOdW1iZXJfSW5QbGFjZUxzaGlmdDpQeU9iamVjdCo6dzowOgotCi1QeU51bWJlcl9JblBsYWNlTXVsdGlwbHk6UHlPYmplY3QqOjorMToKLVB5TnVtYmVyX0luUGxhY2VNdWx0aXBseTpQeU9iamVjdCo6djowOgotUHlOdW1iZXJfSW5QbGFjZU11bHRpcGx5OlB5T2JqZWN0Kjp3OjA6Ci0KLVB5TnVtYmVyX0luUGxhY2VPcjpQeU9iamVjdCo6OisxOgotUHlOdW1iZXJfSW5QbGFjZU9yOlB5T2JqZWN0Kjp2OjA6Ci1QeU51bWJlcl9JblBsYWNlT3I6UHlPYmplY3QqOnc6MDoKLQotUHlOdW1iZXJfSW5QbGFjZVBvd2VyOlB5T2JqZWN0Kjo6KzE6Ci1QeU51bWJlcl9JblBsYWNlUG93ZXI6UHlPYmplY3QqOnY6MDoKLVB5TnVtYmVyX0luUGxhY2VQb3dlcjpQeU9iamVjdCo6dzowOgotUHlOdW1iZXJfSW5QbGFjZVBvd2VyOlB5T2JqZWN0Kjp6OjA6Ci0KLVB5TnVtYmVyX0luUGxhY2VSZW1haW5kZXI6UHlPYmplY3QqOjorMToKLVB5TnVtYmVyX0luUGxhY2VSZW1haW5kZXI6UHlPYmplY3QqOnY6MDoKLVB5TnVtYmVyX0luUGxhY2VSZW1haW5kZXI6UHlPYmplY3QqOnc6MDoKLQotUHlOdW1iZXJfSW5QbGFjZVJzaGlmdDpQeU9iamVjdCo6OisxOgotUHlOdW1iZXJfSW5QbGFjZVJzaGlmdDpQeU9iamVjdCo6djowOgotUHlOdW1iZXJfSW5QbGFjZVJzaGlmdDpQeU9iamVjdCo6dzowOgotCi1QeU51bWJlcl9JblBsYWNlU3VidHJhY3Q6UHlPYmplY3QqOjorMToKLVB5TnVtYmVyX0luUGxhY2VTdWJ0cmFjdDpQeU9iamVjdCo6djowOgotUHlOdW1iZXJfSW5QbGFjZVN1YnRyYWN0OlB5T2JqZWN0Kjp3OjA6Ci0KLVB5TnVtYmVyX0luUGxhY2VUcnVlRGl2aWRlOlB5T2JqZWN0Kjo6KzE6Ci1QeU51bWJlcl9JblBsYWNlVHJ1ZURpdmlkZTpQeU9iamVjdCo6djowOgotUHlOdW1iZXJfSW5QbGFjZVRydWVEaXZpZGU6UHlPYmplY3QqOnc6MDoKLQotUHlOdW1iZXJfSW5QbGFjZVhvcjpQeU9iamVjdCo6OisxOgotUHlOdW1iZXJfSW5QbGFjZVhvcjpQeU9iamVjdCo6djowOgotUHlOdW1iZXJfSW5QbGFjZVhvcjpQeU9iamVjdCo6dzowOgotCi1QeU51bWJlcl9JbnQ6UHlPYmplY3QqOjorMToKLVB5TnVtYmVyX0ludDpQeU9iamVjdCo6bzowOgotCi1QeU51bWJlcl9JbnZlcnQ6UHlPYmplY3QqOjorMToKLVB5TnVtYmVyX0ludmVydDpQeU9iamVjdCo6bzowOgotCi1QeU51bWJlcl9Mb25nOlB5T2JqZWN0Kjo6KzE6Ci1QeU51bWJlcl9Mb25nOlB5T2JqZWN0KjpvOjA6Ci0KLVB5TnVtYmVyX0xzaGlmdDpQeU9iamVjdCo6OisxOgotUHlOdW1iZXJfTHNoaWZ0OlB5T2JqZWN0KjpvMTowOgotUHlOdW1iZXJfTHNoaWZ0OlB5T2JqZWN0KjpvMjowOgotCi1QeU51bWJlcl9NdWx0aXBseTpQeU9iamVjdCo6OisxOgotUHlOdW1iZXJfTXVsdGlwbHk6UHlPYmplY3QqOm8xOjA6Ci1QeU51bWJlcl9NdWx0aXBseTpQeU9iamVjdCo6bzI6MDoKLQotUHlOdW1iZXJfTmVnYXRpdmU6UHlPYmplY3QqOjorMToKLVB5TnVtYmVyX05lZ2F0aXZlOlB5T2JqZWN0KjpvOjA6Ci0KLVB5TnVtYmVyX09yOlB5T2JqZWN0Kjo6KzE6Ci1QeU51bWJlcl9PcjpQeU9iamVjdCo6bzE6MDoKLVB5TnVtYmVyX09yOlB5T2JqZWN0KjpvMjowOgotCi1QeU51bWJlcl9Qb3NpdGl2ZTpQeU9iamVjdCo6OisxOgotUHlOdW1iZXJfUG9zaXRpdmU6UHlPYmplY3QqOm86MDoKLQotUHlOdW1iZXJfUG93ZXI6UHlPYmplY3QqOjorMToKLVB5TnVtYmVyX1Bvd2VyOlB5T2JqZWN0KjpvMTowOgotUHlOdW1iZXJfUG93ZXI6UHlPYmplY3QqOm8yOjA6Ci1QeU51bWJlcl9Qb3dlcjpQeU9iamVjdCo6bzM6MDoKLQotUHlOdW1iZXJfUmVtYWluZGVyOlB5T2JqZWN0Kjo6KzE6Ci1QeU51bWJlcl9SZW1haW5kZXI6UHlPYmplY3QqOm8xOjA6Ci1QeU51bWJlcl9SZW1haW5kZXI6UHlPYmplY3QqOm8yOjA6Ci0KLVB5TnVtYmVyX1JzaGlmdDpQeU9iamVjdCo6OisxOgotUHlOdW1iZXJfUnNoaWZ0OlB5T2JqZWN0KjpvMTowOgotUHlOdW1iZXJfUnNoaWZ0OlB5T2JqZWN0KjpvMjowOgotCi1QeU51bWJlcl9TdWJ0cmFjdDpQeU9iamVjdCo6OisxOgotUHlOdW1iZXJfU3VidHJhY3Q6UHlPYmplY3QqOm8xOjA6Ci1QeU51bWJlcl9TdWJ0cmFjdDpQeU9iamVjdCo6bzI6MDoKLQotUHlOdW1iZXJfVHJ1ZURpdmlkZTpQeU9iamVjdCo6OisxOgotUHlOdW1iZXJfVHJ1ZURpdmlkZTpQeU9iamVjdCo6djowOgotUHlOdW1iZXJfVHJ1ZURpdmlkZTpQeU9iamVjdCo6dzowOgotCi1QeU51bWJlcl9Yb3I6UHlPYmplY3QqOjorMToKLVB5TnVtYmVyX1hvcjpQeU9iamVjdCo6bzE6MDoKLVB5TnVtYmVyX1hvcjpQeU9iamVjdCo6bzI6MDoKLQotUHlPU19HZXRMYXN0TW9kaWZpY2F0aW9uVGltZTpsb25nOjo6Ci1QeU9TX0dldExhc3RNb2RpZmljYXRpb25UaW1lOmNoYXIqOmZpbGVuYW1lOjoKLQotUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvcjppbnQ6OjogCi1QeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yOlB5T2JqZWN0KjpvOjA6Ci0KLVB5T2JqZWN0X0NhbGw6UHlPYmplY3QqOjorMToKLVB5T2JqZWN0X0NhbGw6UHlPYmplY3QqOmNhbGxhYmxlX29iamVjdDowOgotUHlPYmplY3RfQ2FsbDpQeU9iamVjdCo6YXJnczowOgotUHlPYmplY3RfQ2FsbDpQeU9iamVjdCo6a3c6MDoKLQotUHlPYmplY3RfQ2FsbEZ1bmN0aW9uOlB5T2JqZWN0Kjo6KzE6Ci1QeU9iamVjdF9DYWxsRnVuY3Rpb246UHlPYmplY3QqOmNhbGxhYmxlX29iamVjdDowOgotUHlPYmplY3RfQ2FsbEZ1bmN0aW9uOmNoYXIqOmZvcm1hdDo6Ci1QeU9iamVjdF9DYWxsRnVuY3Rpb246Oi4uLjo6Ci0KLVB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3M6UHlPYmplY3QqOjorMToKLVB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3M6UHlPYmplY3QqOmNhbGxhYmxlOjA6Ci1QeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzOjouLi46OgotCi1QeU9iamVjdF9DYWxsTWV0aG9kOlB5T2JqZWN0Kjo6KzE6Ci1QeU9iamVjdF9DYWxsTWV0aG9kOlB5T2JqZWN0KjpvOjA6Ci1QeU9iamVjdF9DYWxsTWV0aG9kOmNoYXIqOm06OgotUHlPYmplY3RfQ2FsbE1ldGhvZDpjaGFyKjpmb3JtYXQ6OgotUHlPYmplY3RfQ2FsbE1ldGhvZDo6Li4uOjoKLQotUHlPYmplY3RfQ2FsbE1ldGhvZE9iakFyZ3M6UHlPYmplY3QqOjorMToKLVB5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzOlB5T2JqZWN0KjpvOjA6Ci1QeU9iamVjdF9DYWxsTWV0aG9kT2JqQXJnczpjaGFyKjpuYW1lOjoKLVB5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzOjouLi46OgotCi1QeU9iamVjdF9DYWxsT2JqZWN0OlB5T2JqZWN0Kjo6KzE6Ci1QeU9iamVjdF9DYWxsT2JqZWN0OlB5T2JqZWN0KjpjYWxsYWJsZV9vYmplY3Q6MDoKLVB5T2JqZWN0X0NhbGxPYmplY3Q6UHlPYmplY3QqOmFyZ3M6MDoKLQotUHlPYmplY3RfQ21wOmludDo6OgotUHlPYmplY3RfQ21wOlB5T2JqZWN0KjpvMTowOgotUHlPYmplY3RfQ21wOlB5T2JqZWN0KjpvMjowOgotUHlPYmplY3RfQ21wOmludCo6cmVzdWx0OjoKLQotUHlPYmplY3RfQ29tcGFyZTppbnQ6OjoKLVB5T2JqZWN0X0NvbXBhcmU6UHlPYmplY3QqOm8xOjA6Ci1QeU9iamVjdF9Db21wYXJlOlB5T2JqZWN0KjpvMjowOgotCi1QeU9iamVjdF9EZWxBdHRyOmludDo6OgotUHlPYmplY3RfRGVsQXR0cjpQeU9iamVjdCo6bzowOgotUHlPYmplY3RfRGVsQXR0cjpQeU9iamVjdCo6YXR0cl9uYW1lOjA6Ci0KLVB5T2JqZWN0X0RlbEF0dHJTdHJpbmc6aW50Ojo6Ci1QeU9iamVjdF9EZWxBdHRyU3RyaW5nOlB5T2JqZWN0KjpvOjA6Ci1QeU9iamVjdF9EZWxBdHRyU3RyaW5nOmNoYXIqOmF0dHJfbmFtZTo6Ci0KLVB5T2JqZWN0X0RlbEl0ZW06aW50Ojo6Ci1QeU9iamVjdF9EZWxJdGVtOlB5T2JqZWN0KjpvOjA6Ci1QeU9iamVjdF9EZWxJdGVtOlB5T2JqZWN0KjprZXk6MDoKLQotUHlPYmplY3RfRGlyOlB5T2JqZWN0Kjo6KzE6Ci1QeU9iamVjdF9EaXI6UHlPYmplY3QqOm86MDoKLQotUHlPYmplY3RfR2V0QXR0cjpQeU9iamVjdCo6OisxOgotUHlPYmplY3RfR2V0QXR0cjpQeU9iamVjdCo6bzowOgotUHlPYmplY3RfR2V0QXR0cjpQeU9iamVjdCo6YXR0cl9uYW1lOjA6Ci0KLVB5T2JqZWN0X0dldEF0dHJTdHJpbmc6UHlPYmplY3QqOjorMToKLVB5T2JqZWN0X0dldEF0dHJTdHJpbmc6UHlPYmplY3QqOm86MDoKLVB5T2JqZWN0X0dldEF0dHJTdHJpbmc6Y2hhcio6YXR0cl9uYW1lOjoKLQotUHlPYmplY3RfR2V0SXRlbTpQeU9iamVjdCo6OisxOgotUHlPYmplY3RfR2V0SXRlbTpQeU9iamVjdCo6bzowOgotUHlPYmplY3RfR2V0SXRlbTpQeU9iamVjdCo6a2V5OjA6Ci0KLVB5T2JqZWN0X0dldEl0ZXI6UHlPYmplY3QqOjorMToKLVB5T2JqZWN0X0dldEl0ZXI6UHlPYmplY3QqOm86MDoKLQotUHlPYmplY3RfSGFzQXR0cjppbnQ6OjoKLVB5T2JqZWN0X0hhc0F0dHI6UHlPYmplY3QqOm86MDoKLVB5T2JqZWN0X0hhc0F0dHI6UHlPYmplY3QqOmF0dHJfbmFtZTowOgotCi1QeU9iamVjdF9IYXNBdHRyU3RyaW5nOmludDo6OgotUHlPYmplY3RfSGFzQXR0clN0cmluZzpQeU9iamVjdCo6bzowOgotUHlPYmplY3RfSGFzQXR0clN0cmluZzpjaGFyKjphdHRyX25hbWU6MDoKLQotUHlPYmplY3RfSGFzaDppbnQ6OjoKLVB5T2JqZWN0X0hhc2g6UHlPYmplY3QqOm86MDoKLQotUHlPYmplY3RfSXNUcnVlOmludDo6OgotUHlPYmplY3RfSXNUcnVlOlB5T2JqZWN0KjpvOjA6Ci0KLVB5T2JqZWN0X0luaXQ6UHlPYmplY3QqOjowOgotUHlPYmplY3RfSW5pdDpQeU9iamVjdCo6b3A6MDoKLQotUHlPYmplY3RfSW5pdFZhcjpQeVZhck9iamVjdCo6OjA6Ci1QeU9iamVjdF9Jbml0VmFyOlB5VmFyT2JqZWN0KjpvcDowOgotCi1QeU9iamVjdF9MZW5ndGg6aW50Ojo6Ci1QeU9iamVjdF9MZW5ndGg6UHlPYmplY3QqOm86MDoKLQotUHlPYmplY3RfTkVXOlB5T2JqZWN0Kjo6KzE6Ci0KLVB5T2JqZWN0X05ldzpQeU9iamVjdCo6OisxOgotCi1QeU9iamVjdF9ORVdfVkFSOlB5T2JqZWN0Kjo6KzE6Ci0KLVB5T2JqZWN0X05ld1ZhcjpQeU9iamVjdCo6OisxOgotCi1QeU9iamVjdF9QcmludDppbnQ6OjoKLVB5T2JqZWN0X1ByaW50OlB5T2JqZWN0KjpvOjA6Ci1QeU9iamVjdF9QcmludDpGSUxFKjpmcDo6Ci1QeU9iamVjdF9QcmludDppbnQ6ZmxhZ3M6OgotCi1QeU9iamVjdF9SZXByOlB5T2JqZWN0Kjo6KzE6Ci1QeU9iamVjdF9SZXByOlB5T2JqZWN0KjpvOjA6Ci0KLVB5T2JqZWN0X1JpY2hDb21wYXJlOlB5T2JqZWN0Kjo6KzE6Ci1QeU9iamVjdF9SaWNoQ29tcGFyZTpQeU9iamVjdCo6bzE6MDoKLVB5T2JqZWN0X1JpY2hDb21wYXJlOlB5T2JqZWN0KjpvMjowOgotUHlPYmplY3RfUmljaENvbXBhcmU6aW50Om9waWQ6OgotCi1QeU9iamVjdF9SaWNoQ29tcGFyZUJvb2w6aW50Ojo6Ci1QeU9iamVjdF9SaWNoQ29tcGFyZUJvb2w6UHlPYmplY3QqOm8xOjA6Ci1QeU9iamVjdF9SaWNoQ29tcGFyZUJvb2w6UHlPYmplY3QqOm8yOjA6Ci1QeU9iamVjdF9SaWNoQ29tcGFyZUJvb2w6aW50Om9waWQ6OgotCi1QeU9iamVjdF9TZXRBdHRyOmludDo6OgotUHlPYmplY3RfU2V0QXR0cjpQeU9iamVjdCo6bzowOgotUHlPYmplY3RfU2V0QXR0cjpQeU9iamVjdCo6YXR0cl9uYW1lOjA6Ci1QeU9iamVjdF9TZXRBdHRyOlB5T2JqZWN0Kjp2OisxOgotCi1QeU9iamVjdF9TZXRBdHRyU3RyaW5nOmludDo6OgotUHlPYmplY3RfU2V0QXR0clN0cmluZzpQeU9iamVjdCo6bzowOgotUHlPYmplY3RfU2V0QXR0clN0cmluZzpjaGFyKjphdHRyX25hbWU6OgotUHlPYmplY3RfU2V0QXR0clN0cmluZzpQeU9iamVjdCo6djorMToKLQotUHlPYmplY3RfU2V0SXRlbTppbnQ6OjoKLVB5T2JqZWN0X1NldEl0ZW06UHlPYmplY3QqOm86MDoKLVB5T2JqZWN0X1NldEl0ZW06UHlPYmplY3QqOmtleTowOgotUHlPYmplY3RfU2V0SXRlbTpQeU9iamVjdCo6djorMToKLQotUHlPYmplY3RfU3RyOlB5T2JqZWN0Kjo6KzE6Ci1QeU9iamVjdF9TdHI6UHlPYmplY3QqOm86MDoKLQotUHlPYmplY3RfVHlwZTpQeU9iamVjdCo6OisxOgotUHlPYmplY3RfVHlwZTpQeU9iamVjdCo6bzowOgotCi1QeU9iamVjdF9Vbmljb2RlOlB5T2JqZWN0Kjo6KzE6Ci1QeU9iamVjdF9Vbmljb2RlOlB5T2JqZWN0KjpvOjA6Ci0KLVB5UGFyc2VyX1NpbXBsZVBhcnNlRmlsZTpzdHJ1Y3QgX25vZGUqOjo6Ci1QeVBhcnNlcl9TaW1wbGVQYXJzZUZpbGU6RklMRSo6ZnA6OgotUHlQYXJzZXJfU2ltcGxlUGFyc2VGaWxlOmNoYXIqOmZpbGVuYW1lOjoKLVB5UGFyc2VyX1NpbXBsZVBhcnNlRmlsZTppbnQ6c3RhcnQ6OgotCi1QeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZzpzdHJ1Y3QgX25vZGUqOjo6Ci1QeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZzpjaGFyKjpzdHI6OgotUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmc6aW50OnN0YXJ0OjoKLQotUHlSdW5fQW55RmlsZTppbnQ6OjoKLVB5UnVuX0FueUZpbGU6RklMRSo6ZnA6OgotUHlSdW5fQW55RmlsZTpjaGFyKjpmaWxlbmFtZTo6Ci0KLVB5UnVuX0ZpbGU6UHlPYmplY3QqOjorMTo/Pz8gLS0gc2FtZSBhcyBldmFsX2NvZGUyKCkKLVB5UnVuX0ZpbGU6RklMRSo6ZnA6OgotUHlSdW5fRmlsZTpjaGFyKjpmaWxlbmFtZTo6Ci1QeVJ1bl9GaWxlOmludDpzdGFydDo6Ci1QeVJ1bl9GaWxlOlB5T2JqZWN0KjpnbG9iYWxzOjA6Ci1QeVJ1bl9GaWxlOlB5T2JqZWN0Kjpsb2NhbHM6MDoKLQotUHlSdW5fRmlsZUV4OlB5T2JqZWN0Kjo6KzE6Pz8/IC0tIHNhbWUgYXMgZXZhbF9jb2RlMigpCi1QeVJ1bl9GaWxlRXg6RklMRSo6ZnA6OgotUHlSdW5fRmlsZUV4OmNoYXIqOmZpbGVuYW1lOjoKLVB5UnVuX0ZpbGVFeDppbnQ6c3RhcnQ6OgotUHlSdW5fRmlsZUV4OlB5T2JqZWN0KjpnbG9iYWxzOjA6Ci1QeVJ1bl9GaWxlRXg6UHlPYmplY3QqOmxvY2FsczowOgotUHlSdW5fRmlsZUV4OmludDpjbG9zZWl0OjoKLQotUHlSdW5fRmlsZUZsYWdzOlB5T2JqZWN0Kjo6KzE6Pz8/IC0tIHNhbWUgYXMgZXZhbF9jb2RlMigpCi1QeVJ1bl9GaWxlRmxhZ3M6RklMRSo6ZnA6OgotUHlSdW5fRmlsZUZsYWdzOmNoYXIqOmZpbGVuYW1lOjoKLVB5UnVuX0ZpbGVGbGFnczppbnQ6c3RhcnQ6OgotUHlSdW5fRmlsZUZsYWdzOlB5T2JqZWN0KjpnbG9iYWxzOjA6Ci1QeVJ1bl9GaWxlRmxhZ3M6UHlPYmplY3QqOmxvY2FsczowOgotUHlSdW5fRmlsZUZsYWdzOlB5Q29tcGlsZXJGbGFncyo6ZmxhZ3M6OgotCi1QeVJ1bl9GaWxlRXhGbGFnczpQeU9iamVjdCo6OisxOj8/PyAtLSBzYW1lIGFzIGV2YWxfY29kZTIoKQotUHlSdW5fRmlsZUV4RmxhZ3M6RklMRSo6ZnA6OgotUHlSdW5fRmlsZUV4RmxhZ3M6Y2hhcio6ZmlsZW5hbWU6OgotUHlSdW5fRmlsZUV4RmxhZ3M6aW50OnN0YXJ0OjoKLVB5UnVuX0ZpbGVFeEZsYWdzOlB5T2JqZWN0KjpnbG9iYWxzOjA6Ci1QeVJ1bl9GaWxlRXhGbGFnczpQeU9iamVjdCo6bG9jYWxzOjA6Ci1QeVJ1bl9GaWxlRXhGbGFnczppbnQ6Y2xvc2VpdDo6Ci1QeVJ1bl9GaWxlRXhGbGFnczpQeUNvbXBpbGVyRmxhZ3MqOmZsYWdzOjoKLQotUHlSdW5fSW50ZXJhY3RpdmVMb29wOmludDo6OgotUHlSdW5fSW50ZXJhY3RpdmVMb29wOkZJTEUqOmZwOjoKLVB5UnVuX0ludGVyYWN0aXZlTG9vcDpjaGFyKjpmaWxlbmFtZTo6Ci0KLVB5UnVuX0ludGVyYWN0aXZlT25lOmludDo6OgotUHlSdW5fSW50ZXJhY3RpdmVPbmU6RklMRSo6ZnA6OgotUHlSdW5fSW50ZXJhY3RpdmVPbmU6Y2hhcio6ZmlsZW5hbWU6OgotCi1QeVJ1bl9TaW1wbGVGaWxlOmludDo6OgotUHlSdW5fU2ltcGxlRmlsZTpGSUxFKjpmcDo6Ci1QeVJ1bl9TaW1wbGVGaWxlOmNoYXIqOmZpbGVuYW1lOjoKLQotUHlSdW5fU2ltcGxlU3RyaW5nOmludDo6OgotUHlSdW5fU2ltcGxlU3RyaW5nOmNoYXIqOmNvbW1hbmQ6OgotCi1QeVJ1bl9TdHJpbmc6UHlPYmplY3QqOjorMTo/Pz8gLS0gc2FtZSBhcyBldmFsX2NvZGUyKCkKLVB5UnVuX1N0cmluZzpjaGFyKjpzdHI6OgotUHlSdW5fU3RyaW5nOmludDpzdGFydDo6Ci1QeVJ1bl9TdHJpbmc6UHlPYmplY3QqOmdsb2JhbHM6MDoKLVB5UnVuX1N0cmluZzpQeU9iamVjdCo6bG9jYWxzOjA6Ci0KLVB5UnVuX1N0cmluZ0ZsYWdzOlB5T2JqZWN0Kjo6KzE6Pz8/IC0tIHNhbWUgYXMgZXZhbF9jb2RlMigpCi1QeVJ1bl9TdHJpbmdGbGFnczpjaGFyKjpzdHI6OgotUHlSdW5fU3RyaW5nRmxhZ3M6aW50OnN0YXJ0OjoKLVB5UnVuX1N0cmluZ0ZsYWdzOlB5T2JqZWN0KjpnbG9iYWxzOjA6Ci1QeVJ1bl9TdHJpbmdGbGFnczpQeU9iamVjdCo6bG9jYWxzOjA6Ci1QeVJ1bl9TdHJpbmdGbGFnczpQeUNvbXBpbGVyRmxhZ3MqOmZsYWdzOjoKLQotUHlTZXFJdGVyX05ldzpQeU9iamVjdCo6OisxOgotUHlTZXFJdGVyX05ldzpQeU9iamVjdCo6c2VxOjoKLQotUHlTZXF1ZW5jZV9DaGVjazppbnQ6OjoKLVB5U2VxdWVuY2VfQ2hlY2s6UHlPYmplY3QqOm86MDoKLQotUHlTZXF1ZW5jZV9Db25jYXQ6UHlPYmplY3QqOjorMToKLVB5U2VxdWVuY2VfQ29uY2F0OlB5T2JqZWN0KjpvMTowOgotUHlTZXF1ZW5jZV9Db25jYXQ6UHlPYmplY3QqOm8yOjA6Ci0KLVB5U2VxdWVuY2VfQ291bnQ6aW50Ojo6Ci1QeVNlcXVlbmNlX0NvdW50OlB5T2JqZWN0KjpvOjA6Ci1QeVNlcXVlbmNlX0NvdW50OlB5T2JqZWN0Kjp2YWx1ZTowOgotCi1QeVNlcXVlbmNlX0RlbEl0ZW06aW50Ojo6Ci1QeVNlcXVlbmNlX0RlbEl0ZW06UHlPYmplY3QqOm86MDoKLVB5U2VxdWVuY2VfRGVsSXRlbTppbnQ6aTo6Ci0KLVB5U2VxdWVuY2VfRGVsU2xpY2U6aW50Ojo6Ci1QeVNlcXVlbmNlX0RlbFNsaWNlOlB5T2JqZWN0KjpvOjA6Ci1QeVNlcXVlbmNlX0RlbFNsaWNlOmludDppMTo6Ci1QeVNlcXVlbmNlX0RlbFNsaWNlOmludDppMjo6Ci0KLVB5U2VxdWVuY2VfRmFzdDpQeU9iamVjdCo6OisxOgotUHlTZXF1ZW5jZV9GYXN0OlB5T2JqZWN0Kjp2OjA6Ci1QeVNlcXVlbmNlX0Zhc3Q6Y29uc3QgY2hhcio6bTo6Ci0KLVB5U2VxdWVuY2VfRmFzdF9HRVRfSVRFTTpQeU9iamVjdCo6OjA6Ci1QeVNlcXVlbmNlX0Zhc3RfR0VUX0lURU06UHlPYmplY3QqOm86MDoKLVB5U2VxdWVuY2VfRmFzdF9HRVRfSVRFTTppbnQ6aTo6Ci0KLVB5U2VxdWVuY2VfR2V0SXRlbTpQeU9iamVjdCo6OisxOgotUHlTZXF1ZW5jZV9HZXRJdGVtOlB5T2JqZWN0KjpvOjA6Ci1QeVNlcXVlbmNlX0dldEl0ZW06aW50Omk6OgotCi1QeVNlcXVlbmNlX0dldFNsaWNlOlB5T2JqZWN0Kjo6KzE6Ci1QeVNlcXVlbmNlX0dldFNsaWNlOlB5T2JqZWN0KjpvOjA6Ci1QeVNlcXVlbmNlX0dldFNsaWNlOmludDppMTo6Ci1QeVNlcXVlbmNlX0dldFNsaWNlOmludDppMjo6Ci0KLVB5U2VxdWVuY2VfSW46aW50Ojo6Ci1QeVNlcXVlbmNlX0luOlB5T2JqZWN0KjpvOjA6Ci1QeVNlcXVlbmNlX0luOlB5T2JqZWN0Kjp2YWx1ZTowOgotCi1QeVNlcXVlbmNlX0luZGV4OmludDo6OgotUHlTZXF1ZW5jZV9JbmRleDpQeU9iamVjdCo6bzowOgotUHlTZXF1ZW5jZV9JbmRleDpQeU9iamVjdCo6dmFsdWU6MDoKLQotUHlTZXF1ZW5jZV9JblBsYWNlQ29uY2F0OlB5T2JqZWN0Kjo6KzE6Ci1QeVNlcXVlbmNlX0luUGxhY2VDb25jYXQ6UHlPYmplY3QqOnM6MDoKLVB5U2VxdWVuY2VfSW5QbGFjZUNvbmNhdDpQeU9iamVjdCo6bzowOgotCi1QeVNlcXVlbmNlX0luUGxhY2VSZXBlYXQ6UHlPYmplY3QqOjorMToKLVB5U2VxdWVuY2VfSW5QbGFjZVJlcGVhdDpQeU9iamVjdCo6czowOgotUHlTZXF1ZW5jZV9JblBsYWNlUmVwZWF0OlB5T2JqZWN0KjpvOjA6Ci0KLVB5U2VxdWVuY2VfSVRFTTpQeU9iamVjdCo6OisxOgotUHlTZXF1ZW5jZV9JVEVNOlB5T2JqZWN0KjpvOjA6Ci1QeVNlcXVlbmNlX0lURU06aW50Omk6OgotCi1QeVNlcXVlbmNlX1JlcGVhdDpQeU9iamVjdCo6OisxOgotUHlTZXF1ZW5jZV9SZXBlYXQ6UHlPYmplY3QqOm86MDoKLVB5U2VxdWVuY2VfUmVwZWF0OmludDpjb3VudDo6Ci0KLVB5U2VxdWVuY2VfU2V0SXRlbTppbnQ6OjoKLVB5U2VxdWVuY2VfU2V0SXRlbTpQeU9iamVjdCo6bzowOgotUHlTZXF1ZW5jZV9TZXRJdGVtOmludDppOjoKLVB5U2VxdWVuY2VfU2V0SXRlbTpQeU9iamVjdCo6djorMToKLQotUHlTZXF1ZW5jZV9TZXRTbGljZTppbnQ6OjoKLVB5U2VxdWVuY2VfU2V0U2xpY2U6UHlPYmplY3QqOm86MDoKLVB5U2VxdWVuY2VfU2V0U2xpY2U6aW50OmkxOjoKLVB5U2VxdWVuY2VfU2V0U2xpY2U6aW50OmkyOjoKLVB5U2VxdWVuY2VfU2V0U2xpY2U6UHlPYmplY3QqOnY6KzE6Ci0KLVB5U2VxdWVuY2VfTGlzdDpQeU9iamVjdCo6OisxOgotUHlTZXF1ZW5jZV9MaXN0OlB5T2JqZWN0KjpvOjA6Ci0KLVB5U2VxdWVuY2VfVHVwbGU6UHlPYmplY3QqOjorMToKLVB5U2VxdWVuY2VfVHVwbGU6UHlPYmplY3QqOm86MDoKLQotUHlTZXRfQXBwZW5kOmludDo6OgotUHlTZXRfQXBwZW5kOlB5T2JqZWN0KjpzZXQ6MDoKLVB5U2V0X0FwcGVuZDpQeU9iamVjdCo6a2V5OisxOgotCi1QeVNldF9Db250YWluczppbnQ6OjoKLVB5U2V0X0NvbnRhaW5zOlB5T2JqZWN0KjphbnlzZXQ6MDoKLVB5U2V0X0NvbnRhaW5zOlB5T2JqZWN0KjprZXk6MDoKLQotUHlTZXRfRGlzY2FyZDppbnQ6OjoKLVB5U2V0X0Rpc2NhcmQ6UHlPYmplY3QqOnNldDowOgotUHlTZXRfRGlzY2FyZDpQeU9iamVjdCo6a2V5Oi0xOm5vIGVmZmVjdCBpZiBrZXkgbm90IGZvdW5kCi0KLVB5U2V0X05ldzpQeU9iamVjdCo6OisxOgotUHlTZXRfTmV3OlB5T2JqZWN0KjppdGVyYWJsZTowOgotCi1QeVNldF9Qb3A6UHlPYmplY3QqOjorMTpvciByZXR1cm5zIE5VTEwgYW5kIHJhaXNlcyBLZXlFcnJvciBpZiBzZXQgaXMgZW1wdHkKLVB5U2V0X1BvcDpQeU9iamVjdCo6c2V0OjA6Ci0KLVB5U2V0X1NpemU6aW50Ojo6Ci1QeVNldF9TaXplOlB5T2JqZWN0KjphbnlzZXQ6MDoKLQotUHlTbGljZV9DaGVjazppbnQ6OjoKLVB5U2xpY2VfQ2hlY2s6UHlPYmplY3QqOm9iOjA6Ci0KLVB5U2xpY2VfTmV3OlB5T2JqZWN0Kjo6KzE6Ci1QeVNsaWNlX05ldzpQeU9iamVjdCo6c3RhcnQ6MDoKLVB5U2xpY2VfTmV3OlB5T2JqZWN0KjpzdG9wOjA6Ci1QeVNsaWNlX05ldzpQeU9iamVjdCo6c3RlcDowOgotCi1QeVN0cmluZ19BU19TVFJJTkc6Y2hhcio6OjoKLVB5U3RyaW5nX0FTX1NUUklORzpQeU9iamVjdCo6c3RyaW5nOjA6Ci0KLVB5U3RyaW5nX0FzRGVjb2RlZE9iamVjdDpQeU9iamVjdCo6OisxOgotUHlTdHJpbmdfQXNEZWNvZGVkT2JqZWN0OlB5T2JqZWN0KjpzdHI6MDoKLVB5U3RyaW5nX0FzRGVjb2RlZE9iamVjdDpjb25zdCBjaGFyKjplbmNvZGluZzo6Ci1QeVN0cmluZ19Bc0RlY29kZWRPYmplY3Q6Y29uc3QgY2hhcio6ZXJyb3JzOjoKLQotUHlTdHJpbmdfQXNFbmNvZGVkT2JqZWN0OlB5T2JqZWN0Kjo6KzE6Ci1QeVN0cmluZ19Bc0VuY29kZWRPYmplY3Q6UHlPYmplY3QqOnN0cjowOgotUHlTdHJpbmdfQXNFbmNvZGVkT2JqZWN0OmNvbnN0IGNoYXIqOmVuY29kaW5nOjoKLVB5U3RyaW5nX0FzRW5jb2RlZE9iamVjdDpjb25zdCBjaGFyKjplcnJvcnM6OgotCi1QeVN0cmluZ19Bc1N0cmluZzpjaGFyKjo6OgotUHlTdHJpbmdfQXNTdHJpbmc6UHlPYmplY3QqOnN0cmluZzowOgotCi1QeVN0cmluZ19Bc1N0cmluZ0FuZFNpemU6aW50Ojo6Ci1QeVN0cmluZ19Bc1N0cmluZ0FuZFNpemU6UHlPYmplY3QqOm9iajowOgotUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplOmNoYXIqKjpidWZmZXI6OgotUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplOmludCo6bGVuZ3RoOjoKLQotUHlTdHJpbmdfQ2hlY2s6aW50Ojo6Ci1QeVN0cmluZ19DaGVjazpQeU9iamVjdCo6bzowOgotCi1QeVN0cmluZ19Db25jYXQ6dm9pZDo6OgotUHlTdHJpbmdfQ29uY2F0OlB5T2JqZWN0Kio6c3RyaW5nOjA6Pz8/IC0tIHJlcGxhY2VzIHcvIG5ldyBzdHJpbmcgb3IgTlVMTAotUHlTdHJpbmdfQ29uY2F0OlB5T2JqZWN0KjpuZXdwYXJ0OjA6Ci0KLVB5U3RyaW5nX0NvbmNhdEFuZERlbDp2b2lkOjo6Ci1QeVN0cmluZ19Db25jYXRBbmREZWw6UHlPYmplY3QqKjpzdHJpbmc6MDo/Pz8gLS0gcmVwbGFjZXMgdy8gbmV3IHN0cmluZyBvciBOVUxMCi1QeVN0cmluZ19Db25jYXRBbmREZWw6UHlPYmplY3QqOm5ld3BhcnQ6LTE6Ci0KLVB5U3RyaW5nX0Zvcm1hdDpQeU9iamVjdCo6OisxOgotUHlTdHJpbmdfRm9ybWF0OlB5T2JqZWN0Kjpmb3JtYXQ6MDoKLVB5U3RyaW5nX0Zvcm1hdDpQeU9iamVjdCo6YXJnczowOgotCi1QeVN0cmluZ19Gcm9tU3RyaW5nOlB5T2JqZWN0Kjo6KzE6Ci1QeVN0cmluZ19Gcm9tU3RyaW5nOmNvbnN0IGNoYXIqOnY6OgotCi1QeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZTpQeU9iamVjdCo6OisxOgotUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemU6Y29uc3QgY2hhcio6djo6Ci1QeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZTppbnQ6bGVuOjoKLQotUHlTdHJpbmdfRnJvbUZvcm1hdDpQeU9iamVjdCo6OisxOgotUHlTdHJpbmdfRnJvbUZvcm1hdDpjb25zdCBjaGFyKjpmb3JtYXQ6OgotUHlTdHJpbmdfRnJvbUZvcm1hdDo6Li4uOjoKLQotUHlTdHJpbmdfRnJvbUZvcm1hdFY6UHlPYmplY3QqOjorMToKLVB5U3RyaW5nX0Zyb21Gb3JtYXRWOmNvbnN0IGNoYXIqOmZvcm1hdDo6Ci1QeVN0cmluZ19Gcm9tRm9ybWF0Vjp2YV9saXN0OnZhcmdzOjoKLQotUHlTdHJpbmdfR0VUX1NJWkU6aW50Ojo6Ci1QeVN0cmluZ19HRVRfU0laRTpQeU9iamVjdCo6c3RyaW5nOjA6Ci0KLVB5U3RyaW5nX0ludGVybkZyb21TdHJpbmc6UHlPYmplY3QqOjorMToKLVB5U3RyaW5nX0ludGVybkZyb21TdHJpbmc6Y29uc3QgY2hhcio6djo6Ci0KLVB5U3RyaW5nX0ludGVybkluUGxhY2U6dm9pZDo6OgotUHlTdHJpbmdfSW50ZXJuSW5QbGFjZTpQeU9iamVjdCoqOnN0cmluZzorMTo/Pz8KLQotUHlTdHJpbmdfU2l6ZTppbnQ6OjoKLVB5U3RyaW5nX1NpemU6UHlPYmplY3QqOnN0cmluZzowOgotCi1QeVN0cmluZ19EZWNvZGU6UHlPYmplY3QqOjorMToKLVB5U3RyaW5nX0RlY29kZTpjb25zdCBjaGFyKjpzOjoKLVB5U3RyaW5nX0RlY29kZTppbnQ6c2l6ZTo6Ci1QeVN0cmluZ19EZWNvZGU6Y29uc3QgY2hhcio6ZW5jb2Rpbmc6OgotUHlTdHJpbmdfRGVjb2RlOmNvbnN0IGNoYXIqOmVycm9yczo6Ci0KLVB5U3RyaW5nX0VuY29kZTpQeU9iamVjdCo6OisxOgotUHlTdHJpbmdfRW5jb2RlOmNvbnN0IGNoYXIqOnM6OgotUHlTdHJpbmdfRW5jb2RlOmludDpzaXplOjoKLVB5U3RyaW5nX0VuY29kZTpjb25zdCBjaGFyKjplbmNvZGluZzo6Ci1QeVN0cmluZ19FbmNvZGU6Y29uc3QgY2hhcio6ZXJyb3JzOjoKLQotUHlTdHJpbmdfQXNFbmNvZGVkU3RyaW5nOlB5T2JqZWN0Kjo6KzE6Ci1QeVN0cmluZ19Bc0VuY29kZWRTdHJpbmc6UHlPYmplY3QqOnN0cjo6Ci1QeVN0cmluZ19Bc0VuY29kZWRTdHJpbmc6Y29uc3QgY2hhcio6ZW5jb2Rpbmc6OgotUHlTdHJpbmdfQXNFbmNvZGVkU3RyaW5nOmNvbnN0IGNoYXIqOmVycm9yczo6Ci0KLVB5U3lzX1NldEFyZ3Y6aW50Ojo6Ci1QeVN5c19TZXRBcmd2OmludDphcmdjOjoKLVB5U3lzX1NldEFyZ3Y6Y2hhcioqOmFyZ3Y6OgotCi1QeVRocmVhZFN0YXRlX0NsZWFyOnZvaWQ6OjoKLVB5VGhyZWFkU3RhdGVfQ2xlYXI6UHlUaHJlYWRTdGF0ZSo6dHN0YXRlOjoKLQotUHlUaHJlYWRTdGF0ZV9EZWxldGU6dm9pZDo6OgotUHlUaHJlYWRTdGF0ZV9EZWxldGU6UHlUaHJlYWRTdGF0ZSo6dHN0YXRlOjoKLQotUHlUaHJlYWRTdGF0ZV9HZXQ6UHlUaHJlYWRTdGF0ZSo6OjoKLQotUHlUaHJlYWRTdGF0ZV9HZXREaWN0OlB5T2JqZWN0Kjo6MDoKLQotUHlUaHJlYWRTdGF0ZV9OZXc6UHlUaHJlYWRTdGF0ZSo6OjoKLVB5VGhyZWFkU3RhdGVfTmV3OlB5SW50ZXJwcmV0ZXJTdGF0ZSo6aW50ZXJwOjoKLQotUHlUaHJlYWRTdGF0ZV9Td2FwOlB5VGhyZWFkU3RhdGUqOjo6Ci1QeVRocmVhZFN0YXRlX1N3YXA6UHlUaHJlYWRTdGF0ZSo6dHN0YXRlOjoKLQotUHlUaW1lX0Zyb21UaW1lOlB5T2JqZWN0Kjo6KzE6Ci1QeVRpbWVfRnJvbVRpbWU6aW50OmhvdXI6OgotUHlUaW1lX0Zyb21UaW1lOmludDptaW51dGU6OgotUHlUaW1lX0Zyb21UaW1lOmludDpzZWNvbmQ6OgotUHlUaW1lX0Zyb21UaW1lOmludDp1c2Vjb25kOjoKLQotUHlUdXBsZV9DaGVjazppbnQ6OjoKLVB5VHVwbGVfQ2hlY2s6UHlPYmplY3QqOnA6MDoKLQotUHlUdXBsZV9HRVRfSVRFTTpQeU9iamVjdCo6OjA6Ci1QeVR1cGxlX0dFVF9JVEVNOlB5VHVwbGVPYmplY3QqOnA6MDoKLVB5VHVwbGVfR0VUX0lURU06aW50OnBvczo6Ci0KLVB5VHVwbGVfR2V0SXRlbTpQeU9iamVjdCo6OjA6Ci1QeVR1cGxlX0dldEl0ZW06UHlUdXBsZU9iamVjdCo6cDowOgotUHlUdXBsZV9HZXRJdGVtOmludDpwb3M6OgotCi1QeVR1cGxlX0dldFNsaWNlOlB5T2JqZWN0Kjo6KzE6Ci1QeVR1cGxlX0dldFNsaWNlOlB5VHVwbGVPYmplY3QqOnA6MDoKLVB5VHVwbGVfR2V0U2xpY2U6aW50Omxvdzo6Ci1QeVR1cGxlX0dldFNsaWNlOmludDpoaWdoOjoKLQotUHlUdXBsZV9OZXc6UHlPYmplY3QqOjorMToKLVB5VHVwbGVfTmV3OmludDpsZW46OgotCi1QeVR1cGxlX1BhY2s6UHlPYmplY3QqOjorMToKLVB5VHVwbGVfUGFjazppbnQ6bGVuOjoKLVB5VHVwbGVfUGFjazpQeU9iamVjdCo6Li4uOjA6Ci0KLVB5VHVwbGVfU0VUX0lURU06dm9pZDo6OgotUHlUdXBsZV9TRVRfSVRFTTpQeVR1cGxlT2JqZWN0KjpwOjA6Ci1QeVR1cGxlX1NFVF9JVEVNOmludDpwb3M6OgotUHlUdXBsZV9TRVRfSVRFTTpQeU9iamVjdCo6bzowOgotCi1QeVR1cGxlX1NldEl0ZW06aW50Ojo6Ci1QeVR1cGxlX1NldEl0ZW06UHlUdXBsZU9iamVjdCo6cDowOgotUHlUdXBsZV9TZXRJdGVtOmludDpwb3M6OgotUHlUdXBsZV9TZXRJdGVtOlB5T2JqZWN0KjpvOjA6Ci0KLVB5VHVwbGVfU2l6ZTppbnQ6OjoKLVB5VHVwbGVfU2l6ZTpQeVR1cGxlT2JqZWN0KjpwOjA6Ci0KLVB5VHlwZV9HZW5lcmljQWxsb2M6UHlPYmplY3QqOjorMToKLVB5VHlwZV9HZW5lcmljQWxsb2M6UHlPYmplY3QqOnR5cGU6MDoKLVB5VHlwZV9HZW5lcmljQWxsb2M6aW50Om5pdGVtczowOgotCi1QeVR5cGVfR2VuZXJpY05ldzpQeU9iamVjdCo6OisxOgotUHlUeXBlX0dlbmVyaWNOZXc6UHlPYmplY3QqOnR5cGU6MDoKLVB5VHlwZV9HZW5lcmljTmV3OlB5T2JqZWN0KjphcmdzOjA6Ci1QeVR5cGVfR2VuZXJpY05ldzpQeU9iamVjdCo6a3dkczowOgotCi1QeVVuaWNvZGVfQ2hlY2s6aW50Ojo6Ci1QeVVuaWNvZGVfQ2hlY2s6UHlPYmplY3QqOm86MDoKLQotUHlVbmljb2RlX0dFVF9TSVpFOmludDo6OgotUHlVbmljb2RlX0dFVF9TSVpFOlB5T2JqZWN0KjpvOjA6Ci0KLVB5VW5pY29kZV9HRVRfREFUQV9TSVpFOmludDo6OgotUHlVbmljb2RlX0dFVF9EQVRBX1NJWkU6UHlPYmplY3QqOm86MDoKLQotUHlVbmljb2RlX0FTX1VOSUNPREU6UHlfVU5JQ09ERSo6OjoKLVB5VW5pY29kZV9BU19VTklDT0RFOlB5T2JqZWN0KjpvOjA6Ci0KLVB5VW5pY29kZV9BU19EQVRBOmNvbnN0IGNoYXIqOjo6Ci1QeVVuaWNvZGVfQVNfREFUQTpQeU9iamVjdCo6bzowOgotCi1QeV9VTklDT0RFX0lTU1BBQ0U6aW50Ojo6Ci1QeV9VTklDT0RFX0lTU1BBQ0U6UHlfVU5JQ09ERTpjaDo6Ci0KLVB5X1VOSUNPREVfSVNMT1dFUjppbnQ6OjoKLVB5X1VOSUNPREVfSVNMT1dFUjpQeV9VTklDT0RFOmNoOjoKLQotUHlfVU5JQ09ERV9JU1VQUEVSOmludDo6OgotUHlfVU5JQ09ERV9JU1VQUEVSOlB5X1VOSUNPREU6Y2g6OgotCi1QeV9VTklDT0RFX0lTVElUTEU6aW50Ojo6Ci1QeV9VTklDT0RFX0lTVElUTEU6UHlfVU5JQ09ERTpjaDo6Ci0KLVB5X1VOSUNPREVfSVNMSU5FQlJFQUs6aW50Ojo6Ci1QeV9VTklDT0RFX0lTTElORUJSRUFLOlB5X1VOSUNPREU6Y2g6OgotCi1QeV9VTklDT0RFX0lTREVDSU1BTDppbnQ6OjoKLVB5X1VOSUNPREVfSVNERUNJTUFMOlB5X1VOSUNPREU6Y2g6OgotCi1QeV9VTklDT0RFX0lTRElHSVQ6aW50Ojo6Ci1QeV9VTklDT0RFX0lTRElHSVQ6UHlfVU5JQ09ERTpjaDo6Ci0KLVB5X1VOSUNPREVfSVNOVU1FUklDOmludDo6OgotUHlfVU5JQ09ERV9JU05VTUVSSUM6UHlfVU5JQ09ERTpjaDo6Ci0KLVB5X1VOSUNPREVfVE9MT1dFUjpQeV9VTklDT0RFOjo6Ci1QeV9VTklDT0RFX1RPTE9XRVI6UHlfVU5JQ09ERTpjaDo6Ci0KLVB5X1VOSUNPREVfVE9VUFBFUjpQeV9VTklDT0RFOjo6Ci1QeV9VTklDT0RFX1RPVVBQRVI6UHlfVU5JQ09ERTpjaDo6Ci0KLVB5X1VOSUNPREVfVE9USVRMRTpQeV9VTklDT0RFOjo6Ci1QeV9VTklDT0RFX1RPVElUTEU6UHlfVU5JQ09ERTpjaDo6Ci0KLVB5X1VOSUNPREVfVE9ERUNJTUFMOmludDo6OgotUHlfVU5JQ09ERV9UT0RFQ0lNQUw6UHlfVU5JQ09ERTpjaDo6Ci0KLVB5X1VOSUNPREVfVE9ESUdJVDppbnQ6OjoKLVB5X1VOSUNPREVfVE9ESUdJVDpQeV9VTklDT0RFOmNoOjoKLQotUHlfVU5JQ09ERV9UT05VTUVSSUM6ZG91YmxlOjo6Ci1QeV9VTklDT0RFX1RPTlVNRVJJQzpQeV9VTklDT0RFOmNoOjoKLQotUHlVbmljb2RlX0Zyb21Vbmljb2RlOlB5T2JqZWN0Kjo6KzE6Ci1QeVVuaWNvZGVfRnJvbVVuaWNvZGU6Y29uc3QgUHlfVU5JQ09ERSo6dTo6Ci1QeVVuaWNvZGVfRnJvbVVuaWNvZGU6aW50OnNpemU6OgotCi1QeVVuaWNvZGVfQXNVbmljb2RlOlB5X1VOSUNPREUqOjo6Ci1QeVVuaWNvZGVfQXNVbmljb2RlOlB5T2JqZWN0IDoqdW5pY29kZTowOgotCi1QeVVuaWNvZGVfR2V0U2l6ZTppbnQ6OjoKLVB5VW5pY29kZV9HZXRTaXplOlB5T2JqZWN0IDoqdW5pY29kZTowOgotCi1QeVVuaWNvZGVfRnJvbU9iamVjdDpQeU9iamVjdCo6OisxOgotUHlVbmljb2RlX0Zyb21PYmplY3Q6UHlPYmplY3QqOipvYmo6MDoKLQotUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0OlB5T2JqZWN0Kjo6KzE6Ci1QeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3Q6UHlPYmplY3QqOipvYmo6MDoKLVB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdDpjb25zdCBjaGFyKjplbmNvZGluZzo6Ci1QeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3Q6Y29uc3QgY2hhcio6ZXJyb3JzOjoKLQotUHlVbmljb2RlX0Zyb21XaWRlQ2hhcjpQeU9iamVjdCo6OisxOgotUHlVbmljb2RlX0Zyb21XaWRlQ2hhcjpjb25zdCB3Y2hhcl90Kjp3OjoKLVB5VW5pY29kZV9Gcm9tV2lkZUNoYXI6aW50OnNpemU6OgotCi1QeVVuaWNvZGVfQXNXaWRlQ2hhcjppbnQ6OjoKLVB5VW5pY29kZV9Bc1dpZGVDaGFyOlB5T2JqZWN0KjoqdW5pY29kZTowOgotUHlVbmljb2RlX0FzV2lkZUNoYXI6d2NoYXJfdCo6dzo6Ci1QeVVuaWNvZGVfQXNXaWRlQ2hhcjppbnQ6c2l6ZTo6Ci0KLVB5VW5pY29kZV9EZWNvZGU6UHlPYmplY3QqOjorMToKLVB5VW5pY29kZV9EZWNvZGU6Y29uc3QgY2hhcio6czo6Ci1QeVVuaWNvZGVfRGVjb2RlOmludDpzaXplOjoKLVB5VW5pY29kZV9EZWNvZGU6Y29uc3QgY2hhcio6ZW5jb2Rpbmc6OgotUHlVbmljb2RlX0RlY29kZTpjb25zdCBjaGFyKjplcnJvcnM6OgotCi1QeVVuaWNvZGVfRGVjb2RlVVRGMTZTdGF0ZWZ1bDpQeU9iamVjdCo6OisxOgotUHlVbmljb2RlX0RlY29kZVVURjE2U3RhdGVmdWw6Y29uc3QgY2hhcio6czo6Ci1QeVVuaWNvZGVfRGVjb2RlVVRGMTZTdGF0ZWZ1bDppbnQ6c2l6ZTo6Ci1QeVVuaWNvZGVfRGVjb2RlVVRGMTZTdGF0ZWZ1bDpjb25zdCBjaGFyKjplcnJvcnM6OgotUHlVbmljb2RlX0RlY29kZVVURjE2U3RhdGVmdWw6aW50KjpieXRlb3JkZXI6OgotUHlVbmljb2RlX0RlY29kZVVURjE2U3RhdGVmdWw6aW50Kjpjb25zdW1lZDo6Ci0KLVB5VW5pY29kZV9EZWNvZGVVVEY4U3RhdGVmdWw6UHlPYmplY3QqOjorMToKLVB5VW5pY29kZV9EZWNvZGVVVEY4U3RhdGVmdWw6Y29uc3QgY2hhcio6czo6Ci1QeVVuaWNvZGVfRGVjb2RlVVRGOFN0YXRlZnVsOmludDpzaXplOjoKLVB5VW5pY29kZV9EZWNvZGVVVEY4U3RhdGVmdWw6Y29uc3QgY2hhcio6ZXJyb3JzOjoKLVB5VW5pY29kZV9EZWNvZGVVVEY4U3RhdGVmdWw6aW50Kjpjb25zdW1lZDo6Ci0KLVB5VW5pY29kZV9FbmNvZGU6UHlPYmplY3QqOjorMToKLVB5VW5pY29kZV9FbmNvZGU6Y29uc3QgUHlfVU5JQ09ERSo6czo6Ci1QeVVuaWNvZGVfRW5jb2RlOmludDpzaXplOjoKLVB5VW5pY29kZV9FbmNvZGU6Y29uc3QgY2hhcio6ZW5jb2Rpbmc6OgotUHlVbmljb2RlX0VuY29kZTpjb25zdCBjaGFyKjplcnJvcnM6OgotCi1QeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nOlB5T2JqZWN0Kjo6KzE6Ci1QeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nOlB5T2JqZWN0Kjp1bmljb2RlOjoKLVB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmc6Y29uc3QgY2hhcio6ZW5jb2Rpbmc6OgotUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZzpjb25zdCBjaGFyKjplcnJvcnM6OgotCi1QeVVuaWNvZGVfRGVjb2RlVVRGODpQeU9iamVjdCo6OisxOgotUHlVbmljb2RlX0RlY29kZVVURjg6Y29uc3QgY2hhcio6czo6Ci1QeVVuaWNvZGVfRGVjb2RlVVRGODppbnQ6c2l6ZTo6Ci1QeVVuaWNvZGVfRGVjb2RlVVRGODpjb25zdCBjaGFyKjplcnJvcnM6OgotCi1QeVVuaWNvZGVfRW5jb2RlVVRGODpQeU9iamVjdCo6OisxOgotUHlVbmljb2RlX0VuY29kZVVURjg6Y29uc3QgUHlfVU5JQ09ERSo6czo6Ci1QeVVuaWNvZGVfRW5jb2RlVVRGODppbnQ6c2l6ZTo6Ci1QeVVuaWNvZGVfRW5jb2RlVVRGODpjb25zdCBjaGFyKjplcnJvcnM6OgotCi1QeVVuaWNvZGVfQXNVVEY4U3RyaW5nOlB5T2JqZWN0Kjo6KzE6Ci1QeVVuaWNvZGVfQXNVVEY4U3RyaW5nOlB5T2JqZWN0Kjp1bmljb2RlOjoKLQotUHlVbmljb2RlX0RlY29kZVVURjE2OlB5T2JqZWN0Kjo6KzE6Ci1QeVVuaWNvZGVfRGVjb2RlVVRGMTY6Y29uc3QgY2hhcio6czo6Ci1QeVVuaWNvZGVfRGVjb2RlVVRGMTY6aW50OnNpemU6OgotUHlVbmljb2RlX0RlY29kZVVURjE2OmNvbnN0IGNoYXIqOmVycm9yczo6Ci1QeVVuaWNvZGVfRGVjb2RlVVRGMTY6aW50KjpieXRlb3JkZXI6OgotCi1QeVVuaWNvZGVfRW5jb2RlVVRGMTY6UHlPYmplY3QqOjorMToKLVB5VW5pY29kZV9FbmNvZGVVVEYxNjpjb25zdCBQeV9VTklDT0RFKjpzOjoKLVB5VW5pY29kZV9FbmNvZGVVVEYxNjppbnQ6c2l6ZTo6Ci1QeVVuaWNvZGVfRW5jb2RlVVRGMTY6Y29uc3QgY2hhcio6ZXJyb3JzOjoKLVB5VW5pY29kZV9FbmNvZGVVVEYxNjppbnQ6Ynl0ZW9yZGVyOjoKLQotUHlVbmljb2RlX0FzVVRGMTZTdHJpbmc6UHlPYmplY3QqOjorMToKLVB5VW5pY29kZV9Bc1VURjE2U3RyaW5nOlB5T2JqZWN0Kjp1bmljb2RlOjoKLQotUHlVbmljb2RlX0RlY29kZVVuaWNvZGVFc2NhcGU6UHlPYmplY3QqOjorMToKLVB5VW5pY29kZV9EZWNvZGVVbmljb2RlRXNjYXBlOmNvbnN0IGNoYXIqOnM6OgotUHlVbmljb2RlX0RlY29kZVVuaWNvZGVFc2NhcGU6aW50OnNpemU6OgotUHlVbmljb2RlX0RlY29kZVVuaWNvZGVFc2NhcGU6Y29uc3QgY2hhcio6ZXJyb3JzOjoKLQotUHlVbmljb2RlX0VuY29kZVVuaWNvZGVFc2NhcGU6UHlPYmplY3QqOjorMToKLVB5VW5pY29kZV9FbmNvZGVVbmljb2RlRXNjYXBlOmNvbnN0IFB5X1VOSUNPREUqOnM6OgotUHlVbmljb2RlX0VuY29kZVVuaWNvZGVFc2NhcGU6aW50OnNpemU6OgotUHlVbmljb2RlX0VuY29kZVVuaWNvZGVFc2NhcGU6Y29uc3QgY2hhcio6ZXJyb3JzOjoKLQotUHlVbmljb2RlX0FzVW5pY29kZUVzY2FwZVN0cmluZzpQeU9iamVjdCo6OisxOgotUHlVbmljb2RlX0FzVW5pY29kZUVzY2FwZVN0cmluZzpQeU9iamVjdCo6dW5pY29kZTo6Ci0KLVB5VW5pY29kZV9EZWNvZGVSYXdVbmljb2RlRXNjYXBlOlB5T2JqZWN0Kjo6KzE6Ci1QeVVuaWNvZGVfRGVjb2RlUmF3VW5pY29kZUVzY2FwZTpjb25zdCBjaGFyKjpzOjoKLVB5VW5pY29kZV9EZWNvZGVSYXdVbmljb2RlRXNjYXBlOmludDpzaXplOjoKLVB5VW5pY29kZV9EZWNvZGVSYXdVbmljb2RlRXNjYXBlOmNvbnN0IGNoYXIqOmVycm9yczo6Ci0KLVB5VW5pY29kZV9FbmNvZGVSYXdVbmljb2RlRXNjYXBlOlB5T2JqZWN0Kjo6KzE6Ci1QeVVuaWNvZGVfRW5jb2RlUmF3VW5pY29kZUVzY2FwZTpjb25zdCBQeV9VTklDT0RFKjpzOjoKLVB5VW5pY29kZV9FbmNvZGVSYXdVbmljb2RlRXNjYXBlOmludDpzaXplOjoKLVB5VW5pY29kZV9FbmNvZGVSYXdVbmljb2RlRXNjYXBlOmNvbnN0IGNoYXIqOmVycm9yczo6Ci0KLVB5VW5pY29kZV9Bc1Jhd1VuaWNvZGVFc2NhcGVTdHJpbmc6UHlPYmplY3QqOjorMToKLVB5VW5pY29kZV9Bc1Jhd1VuaWNvZGVFc2NhcGVTdHJpbmc6UHlPYmplY3QqOnVuaWNvZGU6OgotCi1QeVVuaWNvZGVfRGVjb2RlTGF0aW4xOlB5T2JqZWN0Kjo6KzE6Ci1QeVVuaWNvZGVfRGVjb2RlTGF0aW4xOmNvbnN0IGNoYXIqOnM6OgotUHlVbmljb2RlX0RlY29kZUxhdGluMTppbnQ6c2l6ZTo6Ci1QeVVuaWNvZGVfRGVjb2RlTGF0aW4xOmNvbnN0IGNoYXIqOmVycm9yczo6Ci0KLVB5VW5pY29kZV9FbmNvZGVMYXRpbjE6UHlPYmplY3QqOjorMToKLVB5VW5pY29kZV9FbmNvZGVMYXRpbjE6Y29uc3QgUHlfVU5JQ09ERSo6czo6Ci1QeVVuaWNvZGVfRW5jb2RlTGF0aW4xOmludDpzaXplOjoKLVB5VW5pY29kZV9FbmNvZGVMYXRpbjE6Y29uc3QgY2hhcio6ZXJyb3JzOjoKLQotUHlVbmljb2RlX0FzTGF0aW4xU3RyaW5nOlB5T2JqZWN0Kjo6KzE6Ci1QeVVuaWNvZGVfQXNMYXRpbjFTdHJpbmc6UHlPYmplY3QqOnVuaWNvZGU6OgotCi1QeVVuaWNvZGVfRGVjb2RlQVNDSUk6UHlPYmplY3QqOjorMToKLVB5VW5pY29kZV9EZWNvZGVBU0NJSTpjb25zdCBjaGFyKjpzOjoKLVB5VW5pY29kZV9EZWNvZGVBU0NJSTppbnQ6c2l6ZTo6Ci1QeVVuaWNvZGVfRGVjb2RlQVNDSUk6Y29uc3QgY2hhcio6ZXJyb3JzOjoKLQotUHlVbmljb2RlX0VuY29kZUFTQ0lJOlB5T2JqZWN0Kjo6KzE6Ci1QeVVuaWNvZGVfRW5jb2RlQVNDSUk6Y29uc3QgUHlfVU5JQ09ERSo6czo6Ci1QeVVuaWNvZGVfRW5jb2RlQVNDSUk6aW50OnNpemU6OgotUHlVbmljb2RlX0VuY29kZUFTQ0lJOmNvbnN0IGNoYXIqOmVycm9yczo6Ci0KLVB5VW5pY29kZV9Bc0FTQ0lJU3RyaW5nOlB5T2JqZWN0Kjo6KzE6Ci1QeVVuaWNvZGVfQXNBU0NJSVN0cmluZzpQeU9iamVjdCo6dW5pY29kZTo6Ci0KLVB5VW5pY29kZV9EZWNvZGVDaGFybWFwOlB5T2JqZWN0Kjo6KzE6Ci1QeVVuaWNvZGVfRGVjb2RlQ2hhcm1hcDpjb25zdCBjaGFyKjpzOjoKLVB5VW5pY29kZV9EZWNvZGVDaGFybWFwOmludDpzaXplOjoKLVB5VW5pY29kZV9EZWNvZGVDaGFybWFwOlB5T2JqZWN0KjptYXBwaW5nOjA6Ci1QeVVuaWNvZGVfRGVjb2RlQ2hhcm1hcDpjb25zdCBjaGFyKjplcnJvcnM6OgotCi1QeVVuaWNvZGVfRW5jb2RlQ2hhcm1hcDpQeU9iamVjdCo6OisxOgotUHlVbmljb2RlX0VuY29kZUNoYXJtYXA6Y29uc3QgUHlfVU5JQ09ERSo6czo6Ci1QeVVuaWNvZGVfRW5jb2RlQ2hhcm1hcDppbnQ6c2l6ZTo6Ci1QeVVuaWNvZGVfRW5jb2RlQ2hhcm1hcDpQeU9iamVjdCo6bWFwcGluZzowOgotUHlVbmljb2RlX0VuY29kZUNoYXJtYXA6Y29uc3QgY2hhcio6ZXJyb3JzOjoKLQotUHlVbmljb2RlX0FzQ2hhcm1hcFN0cmluZzpQeU9iamVjdCo6OisxOgotUHlVbmljb2RlX0FzQ2hhcm1hcFN0cmluZzpQeU9iamVjdCo6dW5pY29kZTowOgotUHlVbmljb2RlX0FzQ2hhcm1hcFN0cmluZzpQeU9iamVjdCo6bWFwcGluZzowOgotCi1QeVVuaWNvZGVfVHJhbnNsYXRlQ2hhcm1hcDpQeU9iamVjdCo6OisxOgotUHlVbmljb2RlX1RyYW5zbGF0ZUNoYXJtYXA6Y29uc3QgUHlfVU5JQ09ERSo6czo6Ci1QeVVuaWNvZGVfVHJhbnNsYXRlQ2hhcm1hcDppbnQ6c2l6ZTo6Ci1QeVVuaWNvZGVfVHJhbnNsYXRlQ2hhcm1hcDpQeU9iamVjdCo6dGFibGU6MDoKLVB5VW5pY29kZV9UcmFuc2xhdGVDaGFybWFwOmNvbnN0IGNoYXIqOmVycm9yczo6Ci0KLVB5VW5pY29kZV9EZWNvZGVNQkNTOlB5T2JqZWN0Kjo6KzE6Ci1QeVVuaWNvZGVfRGVjb2RlTUJDUzpjb25zdCBjaGFyKjpzOjoKLVB5VW5pY29kZV9EZWNvZGVNQkNTOmludDpzaXplOjoKLVB5VW5pY29kZV9EZWNvZGVNQkNTOmNvbnN0IGNoYXIqOmVycm9yczo6Ci0KLVB5VW5pY29kZV9FbmNvZGVNQkNTOlB5T2JqZWN0Kjo6KzE6Ci1QeVVuaWNvZGVfRW5jb2RlTUJDUzpjb25zdCBQeV9VTklDT0RFKjpzOjoKLVB5VW5pY29kZV9FbmNvZGVNQkNTOmludDpzaXplOjoKLVB5VW5pY29kZV9FbmNvZGVNQkNTOmNvbnN0IGNoYXIqOmVycm9yczo6Ci0KLVB5VW5pY29kZV9Bc01CQ1NTdHJpbmc6UHlPYmplY3QqOjorMToKLVB5VW5pY29kZV9Bc01CQ1NTdHJpbmc6UHlPYmplY3QqOnVuaWNvZGU6OgotCi1QeVVuaWNvZGVfQ29uY2F0OlB5T2JqZWN0Kjo6KzE6Ci1QeVVuaWNvZGVfQ29uY2F0OlB5T2JqZWN0KjpsZWZ0OjA6Ci1QeVVuaWNvZGVfQ29uY2F0OlB5T2JqZWN0KjpyaWdodDowOgotCi1QeVVuaWNvZGVfU3BsaXQ6UHlPYmplY3QqOjorMToKLVB5VW5pY29kZV9TcGxpdDpQeU9iamVjdCo6bGVmdDowOgotUHlVbmljb2RlX1NwbGl0OlB5T2JqZWN0KjpyaWdodDowOgotUHlVbmljb2RlX1NwbGl0OmludDptYXhzcGxpdDo6Ci0KLVB5VW5pY29kZV9TcGxpdGxpbmVzOlB5T2JqZWN0Kjo6KzE6Ci1QeVVuaWNvZGVfU3BsaXRsaW5lczpQeU9iamVjdCo6czowOgotUHlVbmljb2RlX1NwbGl0bGluZXM6aW50Om1heHNwbGl0OjoKLQotUHlVbmljb2RlX1RyYW5zbGF0ZTpQeU9iamVjdCo6OisxOgotUHlVbmljb2RlX1RyYW5zbGF0ZTpQeU9iamVjdCo6c3RyOjA6Ci1QeVVuaWNvZGVfVHJhbnNsYXRlOlB5T2JqZWN0Kjp0YWJsZTowOgotUHlVbmljb2RlX1RyYW5zbGF0ZTpjb25zdCBjaGFyKjplcnJvcnM6OgotCi1QeVVuaWNvZGVfSm9pbjpQeU9iamVjdCo6OisxOgotUHlVbmljb2RlX0pvaW46UHlPYmplY3QqOnNlcGFyYXRvcjowOgotUHlVbmljb2RlX0pvaW46UHlPYmplY3QqOnNlcTowOgotCi1QeVVuaWNvZGVfVGFpbG1hdGNoOlB5T2JqZWN0Kjo6KzE6Ci1QeVVuaWNvZGVfVGFpbG1hdGNoOlB5T2JqZWN0KjpzdHI6MDoKLVB5VW5pY29kZV9UYWlsbWF0Y2g6UHlPYmplY3QqOnN1YnN0cjowOgotUHlVbmljb2RlX1RhaWxtYXRjaDppbnQ6c3RhcnQ6OgotUHlVbmljb2RlX1RhaWxtYXRjaDppbnQ6ZW5kOjoKLVB5VW5pY29kZV9UYWlsbWF0Y2g6aW50OmRpcmVjdGlvbjo6Ci0KLVB5VW5pY29kZV9GaW5kOmludDo6OgotUHlVbmljb2RlX0ZpbmQ6UHlPYmplY3QqOnN0cjowOgotUHlVbmljb2RlX0ZpbmQ6UHlPYmplY3QqOnN1YnN0cjowOgotUHlVbmljb2RlX0ZpbmQ6aW50OnN0YXJ0OjoKLVB5VW5pY29kZV9GaW5kOmludDplbmQ6OgotUHlVbmljb2RlX0ZpbmQ6aW50OmRpcmVjdGlvbjo6Ci0KLVB5VW5pY29kZV9Db3VudDppbnQ6OjoKLVB5VW5pY29kZV9Db3VudDpQeU9iamVjdCo6c3RyOjA6Ci1QeVVuaWNvZGVfQ291bnQ6UHlPYmplY3QqOnN1YnN0cjowOgotUHlVbmljb2RlX0NvdW50OmludDpzdGFydDo6Ci1QeVVuaWNvZGVfQ291bnQ6aW50OmVuZDo6Ci0KLVB5VW5pY29kZV9SZXBsYWNlOlB5T2JqZWN0Kjo6KzE6Ci1QeVVuaWNvZGVfUmVwbGFjZTpQeU9iamVjdCo6c3RyOjA6Ci1QeVVuaWNvZGVfUmVwbGFjZTpQeU9iamVjdCo6c3Vic3RyOjA6Ci1QeVVuaWNvZGVfUmVwbGFjZTpQeU9iamVjdCo6cmVwbHN0cjowOgotUHlVbmljb2RlX1JlcGxhY2U6aW50Om1heGNvdW50OjoKLQotUHlVbmljb2RlX0NvbXBhcmU6aW50Ojo6Ci1QeVVuaWNvZGVfQ29tcGFyZTpQeU9iamVjdCo6bGVmdDowOgotUHlVbmljb2RlX0NvbXBhcmU6UHlPYmplY3QqOnJpZ2h0OjA6Ci0KLVB5VW5pY29kZV9Gb3JtYXQ6UHlPYmplY3QqOjorMToKLVB5VW5pY29kZV9Gb3JtYXQ6UHlPYmplY3QqOmZvcm1hdDowOgotUHlVbmljb2RlX0Zvcm1hdDpQeU9iamVjdCo6YXJnczowOgotCi1QeVVuaWNvZGVfQ29udGFpbnM6aW50Ojo6Ci1QeVVuaWNvZGVfQ29udGFpbnM6UHlPYmplY3QqOmNvbnRhaW5lcjowOgotUHlVbmljb2RlX0NvbnRhaW5zOlB5T2JqZWN0KjplbGVtZW50OjA6Ci0KLVB5V2Vha3JlZl9HRVRfT0JKRUNUOlB5T2JqZWN0Kjo6MDoKLVB5V2Vha3JlZl9HRVRfT0JKRUNUOlB5T2JqZWN0KjpyZWY6MDoKLQotUHlXZWFrcmVmX0dldE9iamVjdDpQeU9iamVjdCo6OjA6Ci1QeVdlYWtyZWZfR2V0T2JqZWN0OlB5T2JqZWN0KjpyZWY6MDoKLQotUHlXZWFrcmVmX05ld1Byb3h5OlB5T2JqZWN0Kjo6KzE6Ci1QeVdlYWtyZWZfTmV3UHJveHk6UHlPYmplY3QqOm9iOjA6Ci1QeVdlYWtyZWZfTmV3UHJveHk6UHlPYmplY3QqOmNhbGxiYWNrOjA6Ci0KLVB5V2Vha3JlZl9OZXdSZWY6UHlPYmplY3QqOjorMToKLVB5V2Vha3JlZl9OZXdSZWY6UHlPYmplY3QqOm9iOjA6Ci1QeVdlYWtyZWZfTmV3UmVmOlB5T2JqZWN0KjpjYWxsYmFjazowOgotCi1QeVdyYXBwZXJfTmV3OlB5T2JqZWN0Kjo6KzE6Ci1QeVdyYXBwZXJfTmV3OlB5T2JqZWN0KjpkOjA6Ci1QeVdyYXBwZXJfTmV3OlB5T2JqZWN0KjpzZWxmOjA6Ci0KLVB5X0F0RXhpdDppbnQ6OjoKLVB5X0F0RXhpdDp2b2lkICgqKSgpOmZ1bmM6OgotCi1QeV9CdWlsZFZhbHVlOlB5T2JqZWN0Kjo6KzE6Ci1QeV9CdWlsZFZhbHVlOmNoYXIqOmZvcm1hdDo6Ci0KLVB5X0NvbXBpbGVTdHJpbmc6UHlPYmplY3QqOjorMToKLVB5X0NvbXBpbGVTdHJpbmc6Y2hhcio6c3RyOjoKLVB5X0NvbXBpbGVTdHJpbmc6Y2hhcio6ZmlsZW5hbWU6OgotUHlfQ29tcGlsZVN0cmluZzppbnQ6c3RhcnQ6OgotCi1QeV9Db21waWxlU3RyaW5nRmxhZ3M6UHlPYmplY3QqOjorMToKLVB5X0NvbXBpbGVTdHJpbmdGbGFnczpjaGFyKjpzdHI6OgotUHlfQ29tcGlsZVN0cmluZ0ZsYWdzOmNoYXIqOmZpbGVuYW1lOjoKLVB5X0NvbXBpbGVTdHJpbmdGbGFnczppbnQ6c3RhcnQ6OgotUHlfQ29tcGlsZVN0cmluZ0ZsYWdzOlB5Q29tcGlsZXJGbGFncyo6ZmxhZ3M6OgotCi1QeV9ERUNSRUY6dm9pZDo6OgotUHlfREVDUkVGOlB5T2JqZWN0KjpvOi0xOgotCi1QeV9FbmRJbnRlcnByZXRlcjp2b2lkOjo6Ci1QeV9FbmRJbnRlcnByZXRlcjpQeVRocmVhZFN0YXRlKjp0c3RhdGU6OgotCi1QeV9FeGl0OnZvaWQ6OjoKLVB5X0V4aXQ6aW50OnN0YXR1czo6Ci0KLVB5X0ZhdGFsRXJyb3I6dm9pZDo6OgotUHlfRmF0YWxFcnJvcjpjaGFyKjptZXNzYWdlOjoKLQotUHlfRmRJc0ludGVyYWN0aXZlOmludDo6OgotUHlfRmRJc0ludGVyYWN0aXZlOkZJTEUqOmZwOjoKLVB5X0ZkSXNJbnRlcmFjdGl2ZTpjaGFyKjpmaWxlbmFtZTo6Ci0KLVB5X0ZpbmFsaXplOnZvaWQ6OjoKLQotUHlfRmluZE1ldGhvZDpQeU9iamVjdCo6OisxOgotUHlfRmluZE1ldGhvZDpQeU1ldGhvZERlZltdOm1ldGhvZHM6OgotUHlfRmluZE1ldGhvZDpQeU9iamVjdCo6c2VsZjorMToKLVB5X0ZpbmRNZXRob2Q6Y2hhcio6bmFtZTo6Ci0KLVB5X0dldEJ1aWxkSW5mb2NvbnN0OmNoYXIqOjo6Ci0KLVB5X0dldENvbXBpbGVyY29uc3Q6Y2hhcio6OjoKLQotUHlfR2V0Q29weXJpZ2h0Y29uc3Q6Y2hhcio6OjoKLQotUHlfR2V0RXhlY1ByZWZpeDpjaGFyKjo6OgotCi1QeV9HZXRQYXRoOmNoYXIqOjo6Ci0KLVB5X0dldFBsYXRmb3JtY29uc3Q6Y2hhcio6OjoKLQotUHlfR2V0UHJlZml4OmNoYXIqOjo6Ci0KLVB5X0dldFByb2dyYW1GdWxsUGF0aDpjaGFyKjo6OgotCi1QeV9HZXRQcm9ncmFtTmFtZTpjaGFyKjo6OgotCi1QeV9HZXRWZXJzaW9uY29uc3Q6Y2hhcio6OjoKLQotUHlfSU5DUkVGOnZvaWQ6OjoKLVB5X0lOQ1JFRjpQeU9iamVjdCo6bzorMToKLQotUHlfSW5pdGlhbGl6ZTp2b2lkOjo6Ci0KLVB5X0lzSW5pdGlhbGl6ZWQ6aW50Ojo6Ci0KLVB5X05ld0ludGVycHJldGVyOlB5VGhyZWFkU3RhdGUqOjo6Ci0KLVB5X1NldFByb2dyYW1OYW1lOnZvaWQ6OjoKLVB5X1NldFByb2dyYW1OYW1lOmNoYXIqOm5hbWU6OgotCi1QeV9YREVDUkVGOnZvaWQ6OjoKLVB5X1hERUNSRUY6UHlPYmplY3QqOm86LTE6aWYgbyBpcyBub3QgTlVMTAotCi1QeV9YSU5DUkVGOnZvaWQ6OjoKLVB5X1hJTkNSRUY6UHlPYmplY3QqOm86KzE6aWYgbyBpcyBub3QgTlVMTAotCi1fUHlJbXBvcnRfRmluZEV4dGVuc2lvbjpQeU9iamVjdCo6OjA6Pz8/IHNlZSBQeUltcG9ydF9BZGRNb2R1bGUKLV9QeUltcG9ydF9GaW5kRXh0ZW5zaW9uOmNoYXIqOjo6Ci1fUHlJbXBvcnRfRmluZEV4dGVuc2lvbjpjaGFyKjo6OgotCi1fUHlJbXBvcnRfRmluaTp2b2lkOjo6Ci0KLV9QeUltcG9ydF9GaXh1cEV4dGVuc2lvbjpQeU9iamVjdCo6Ojo/Pz8KLV9QeUltcG9ydF9GaXh1cEV4dGVuc2lvbjpjaGFyKjo6OgotX1B5SW1wb3J0X0ZpeHVwRXh0ZW5zaW9uOmNoYXIqOjo6Ci0KLV9QeUltcG9ydF9Jbml0OnZvaWQ6OjoKLQotX1B5T2JqZWN0X0RlbDp2b2lkOjo6Ci1fUHlPYmplY3RfRGVsOlB5T2JqZWN0KjpvcDowOgotCi1fUHlPYmplY3RfTmV3OlB5T2JqZWN0Kjo6KzE6Ci1fUHlPYmplY3RfTmV3OlB5VHlwZU9iamVjdCo6dHlwZTowOgotCi1fUHlPYmplY3RfTmV3VmFyOlB5T2JqZWN0Kjo6KzE6Ci1fUHlPYmplY3RfTmV3VmFyOlB5VHlwZU9iamVjdCo6dHlwZTowOgotX1B5T2JqZWN0X05ld1ZhcjppbnQ6c2l6ZTo6Ci0KLV9QeVN0cmluZ19SZXNpemU6aW50Ojo6Ci1fUHlTdHJpbmdfUmVzaXplOlB5T2JqZWN0Kio6c3RyaW5nOisxOgotX1B5U3RyaW5nX1Jlc2l6ZTppbnQ6bmV3c2l6ZTo6Ci0KLV9QeVR1cGxlX1Jlc2l6ZTppbnQ6OjoKLV9QeVR1cGxlX1Jlc2l6ZTpQeVR1cGxlT2JqZWN0Kio6cDorMToKLV9QeVR1cGxlX1Jlc2l6ZTppbnQ6bmV3OjoKLQotX1B5X2NfZGlmZjpQeV9jb21wbGV4Ojo6Ci1fUHlfY19kaWZmOlB5X2NvbXBsZXg6bGVmdDo6Ci1fUHlfY19kaWZmOlB5X2NvbXBsZXg6cmlnaHQ6OgotCi1fUHlfY19uZWc6UHlfY29tcGxleDo6OgotX1B5X2NfbmVnOlB5X2NvbXBsZXg6Y29tcGxleDo6Ci0KLV9QeV9jX3BvdzpQeV9jb21wbGV4Ojo6Ci1fUHlfY19wb3c6UHlfY29tcGxleDpudW06OgotX1B5X2NfcG93OlB5X2NvbXBsZXg6ZXhwOjoKLQotX1B5X2NfcHJvZDpQeV9jb21wbGV4Ojo6Ci1fUHlfY19wcm9kOlB5X2NvbXBsZXg6bGVmdDo6Ci1fUHlfY19wcm9kOlB5X2NvbXBsZXg6cmlnaHQ6OgotCi1fUHlfY19xdW90OlB5X2NvbXBsZXg6OjoKLV9QeV9jX3F1b3Q6UHlfY29tcGxleDpkaXZpZGVuZDo6Ci1fUHlfY19xdW90OlB5X2NvbXBsZXg6ZGl2aXNvcjo6Ci0KLV9QeV9jX3N1bTpQeV9jb21wbGV4Ojo6Ci1fUHlfY19zdW06UHlfY29tcGxleDpsZWZ0OjoKLV9QeV9jX3N1bTpQeV9jb21wbGV4OnJpZ2h0OjoKZGlmZiAtLWdpdCBhL0RvYy9hcGkvdXRpbGl0aWVzLnRleCBiL0RvYy9hcGkvdXRpbGl0aWVzLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM3YzA4Ny4uMDAwMDAwMAotLS0gYS9Eb2MvYXBpL3V0aWxpdGllcy50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQxICswLDAgQEAKLVxjaGFwdGVye1V0aWxpdGllcyBcbGFiZWx7dXRpbGl0aWVzfX0KLQotVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGNoYXB0ZXIgcGVyZm9ybSB2YXJpb3VzIHV0aWxpdHkgdGFza3MsIHJhbmdpbmcKLWZyb20gaGVscGluZyBDIGNvZGUgYmUgbW9yZSBwb3J0YWJsZSBhY3Jvc3MgcGxhdGZvcm1zLCB1c2luZyBQeXRob24KLW1vZHVsZXMgZnJvbSBDLCBhbmQgcGFyc2luZyBmdW5jdGlvbiBhcmd1bWVudHMgYW5kIGNvbnN0cnVjdGluZyBQeXRob24KLXZhbHVlcyBmcm9tIEMgdmFsdWVzLgotCi0KLVxzZWN0aW9ue09wZXJhdGluZyBTeXN0ZW0gVXRpbGl0aWVzIFxsYWJlbHtvc319Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlfRmRJc0ludGVyYWN0aXZlfXtGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWV9Ci0gIFJldHVybiB0cnVlIChub256ZXJvKSBpZiB0aGUgc3RhbmRhcmQgSS9PIGZpbGUgXHZhcntmcH0gd2l0aCBuYW1lCi0gIFx2YXJ7ZmlsZW5hbWV9IGlzIGRlZW1lZCBpbnRlcmFjdGl2ZS4gIFRoaXMgaXMgdGhlIGNhc2UgZm9yIGZpbGVzCi0gIGZvciB3aGljaCBcc2FtcHtpc2F0dHkoZmlsZW5vKFx2YXJ7ZnB9KSl9IGlzIHRydWUuICBJZiB0aGUgZ2xvYmFsCi0gIGZsYWcgXGNkYXRhe1B5X0ludGVyYWN0aXZlRmxhZ30gaXMgdHJ1ZSwgdGhpcyBmdW5jdGlvbiBhbHNvIHJldHVybnMKLSAgdHJ1ZSBpZiB0aGUgXHZhcntmaWxlbmFtZX0gcG9pbnRlciBpcyBcTlVMTHt9IG9yIGlmIHRoZSBuYW1lIGlzCi0gIGVxdWFsIHRvIG9uZSBvZiB0aGUgc3RyaW5ncyBcY29kZXsnPHN0ZGluPid9IG9yIFxjb2Rleyc/Pz8nfS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtsb25nfXtQeU9TX0dldExhc3RNb2RpZmljYXRpb25UaW1lfXtjaGFyICpmaWxlbmFtZX0KLSAgUmV0dXJuIHRoZSB0aW1lIG9mIGxhc3QgbW9kaWZpY2F0aW9uIG9mIHRoZSBmaWxlIFx2YXJ7ZmlsZW5hbWV9LgotICBUaGUgcmVzdWx0IGlzIGVuY29kZWQgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZSB0aW1lc3RhbXAgcmV0dXJuZWQgYnkKLSAgdGhlIHN0YW5kYXJkIEMgbGlicmFyeSBmdW5jdGlvbiBcY2Z1bmN0aW9ue3RpbWUoKX0uCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317dm9pZH17UHlPU19BZnRlckZvcmt9e30KLSAgRnVuY3Rpb24gdG8gdXBkYXRlIHNvbWUgaW50ZXJuYWwgc3RhdGUgYWZ0ZXIgYSBwcm9jZXNzIGZvcms7IHRoaXMKLSAgc2hvdWxkIGJlIGNhbGxlZCBpbiB0aGUgbmV3IHByb2Nlc3MgaWYgdGhlIFB5dGhvbiBpbnRlcnByZXRlciB3aWxsCi0gIGNvbnRpbnVlIHRvIGJlIHVzZWQuICBJZiBhIG5ldyBleGVjdXRhYmxlIGlzIGxvYWRlZCBpbnRvIHRoZSBuZXcKLSAgcHJvY2VzcywgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBuZWVkIHRvIGJlIGNhbGxlZC4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5T1NfQ2hlY2tTdGFja317fQotICBSZXR1cm4gdHJ1ZSB3aGVuIHRoZSBpbnRlcnByZXRlciBydW5zIG91dCBvZiBzdGFjayBzcGFjZS4gIFRoaXMgaXMgYQotICByZWxpYWJsZSBjaGVjaywgYnV0IGlzIG9ubHkgYXZhaWxhYmxlIHdoZW4gXGNvbnN0YW50e1VTRV9TVEFDS0NIRUNLfQotICBpcyBkZWZpbmVkIChjdXJyZW50bHkgb24gV2luZG93cyB1c2luZyB0aGUgTWljcm9zb2Z0IFZpc3VhbCBcQ3Bwe30KLSAgY29tcGlsZXIpLiAgXGNvbnN0YW50e1VTRV9TVEFDS0NIRUNLfSB3aWxsIGJlCi0gIGRlZmluZWQgYXV0b21hdGljYWxseTsgeW91IHNob3VsZCBuZXZlciBjaGFuZ2UgdGhlIGRlZmluaXRpb24gaW4KLSAgeW91ciBvd24gY29kZS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9TX3NpZ2hhbmRsZXJfdH17UHlPU19nZXRzaWd9e2ludCBpfQotICBSZXR1cm4gdGhlIGN1cnJlbnQgc2lnbmFsIGhhbmRsZXIgZm9yIHNpZ25hbCBcdmFye2l9LiAgVGhpcyBpcyBhCi0gIHRoaW4gd3JhcHBlciBhcm91bmQgZWl0aGVyIFxjZnVuY3Rpb257c2lnYWN0aW9uKCl9IG9yCi0gIFxjZnVuY3Rpb257c2lnbmFsKCl9LiAgRG8gbm90IGNhbGwgdGhvc2UgZnVuY3Rpb25zIGRpcmVjdGx5IQotICBcY3R5cGV7UHlPU19zaWdoYW5kbGVyX3R9IGlzIGEgdHlwZWRlZiBhbGlhcyBmb3IgXGN0eXBle3ZvaWQKLSAgKCopKGludCl9LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T1Nfc2lnaGFuZGxlcl90fXtQeU9TX3NldHNpZ317aW50IGksIFB5T1Nfc2lnaGFuZGxlcl90IGh9Ci0gIFNldCB0aGUgc2lnbmFsIGhhbmRsZXIgZm9yIHNpZ25hbCBcdmFye2l9IHRvIGJlIFx2YXJ7aH07IHJldHVybiB0aGUKLSAgb2xkIHNpZ25hbCBoYW5kbGVyLiAgVGhpcyBpcyBhIHRoaW4gd3JhcHBlciBhcm91bmQgZWl0aGVyCi0gIFxjZnVuY3Rpb257c2lnYWN0aW9uKCl9IG9yIFxjZnVuY3Rpb257c2lnbmFsKCl9LiAgRG8gbm90IGNhbGwgdGhvc2UKLSAgZnVuY3Rpb25zIGRpcmVjdGx5ISAgXGN0eXBle1B5T1Nfc2lnaGFuZGxlcl90fSBpcyBhIHR5cGVkZWYgYWxpYXMKLSAgZm9yIFxjdHlwZXt2b2lkICgqKShpbnQpfS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxzZWN0aW9ue1Byb2Nlc3MgQ29udHJvbCBcbGFiZWx7cHJvY2Vzc0NvbnRyb2x9fQotCi1cYmVnaW57Y2Z1bmNkZXNjfXt2b2lkfXtQeV9GYXRhbEVycm9yfXtjb25zdCBjaGFyICptZXNzYWdlfQotICBQcmludCBhIGZhdGFsIGVycm9yIG1lc3NhZ2UgYW5kIGtpbGwgdGhlIHByb2Nlc3MuICBObyBjbGVhbnVwIGlzCi0gIHBlcmZvcm1lZC4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGEgY29uZGl0aW9uIGlzCi0gIGRldGVjdGVkIHRoYXQgd291bGQgbWFrZSBpdCBkYW5nZXJvdXMgdG8gY29udGludWUgdXNpbmcgdGhlIFB5dGhvbgotICBpbnRlcnByZXRlcjsgZS5nLiwgd2hlbiB0aGUgb2JqZWN0IGFkbWluaXN0cmF0aW9uIGFwcGVhcnMgdG8gYmUKLSAgY29ycnVwdGVkLiAgT24gXFVOSVgsIHRoZSBzdGFuZGFyZCBDIGxpYnJhcnkgZnVuY3Rpb24KLSAgXGNmdW5jdGlvbnthYm9ydCgpfVx0dGluZGV4e2Fib3J0KCl9IGlzIGNhbGxlZCB3aGljaCB3aWxsIGF0dGVtcHQgdG8KLSAgcHJvZHVjZSBhIFxmaWxle2NvcmV9IGZpbGUuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317dm9pZH17UHlfRXhpdH17aW50IHN0YXR1c30KLSAgRXhpdCB0aGUgY3VycmVudCBwcm9jZXNzLiAgVGhpcyBjYWxscwotICBcY2Z1bmN0aW9ue1B5X0ZpbmFsaXplKCl9XHR0aW5kZXh7UHlfRmluYWxpemUoKX0gYW5kIHRoZW4gY2FsbHMgdGhlCi0gIHN0YW5kYXJkIEMgbGlicmFyeSBmdW5jdGlvbgotICBcY29kZXtleGl0KFx2YXJ7c3RhdHVzfSl9XHR0aW5kZXh7ZXhpdCgpfS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5X0F0RXhpdH17dm9pZCAoKmZ1bmMpICgpfQotICBSZWdpc3RlciBhIGNsZWFudXAgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJ5Ci0gIFxjZnVuY3Rpb257UHlfRmluYWxpemUoKX1cdHRpbmRleHtQeV9GaW5hbGl6ZSgpfS4gIFRoZSBjbGVhbnVwCi0gIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzIGFuZCBzaG91bGQgcmV0dXJuIG5vCi0gIHZhbHVlLiAgQXQgbW9zdCAzMiBcaW5kZXh7Y2xlYW51cCBmdW5jdGlvbnN9Y2xlYW51cCBmdW5jdGlvbnMgY2FuIGJlCi0gIHJlZ2lzdGVyZWQuICBXaGVuIHRoZSByZWdpc3RyYXRpb24gaXMgc3VjY2Vzc2Z1bCwKLSAgXGNmdW5jdGlvbntQeV9BdEV4aXQoKX0gcmV0dXJucyBcY29kZXswfTsgb24gZmFpbHVyZSwgaXQgcmV0dXJucwotICBcY29kZXstMX0uICBUaGUgY2xlYW51cCBmdW5jdGlvbiByZWdpc3RlcmVkIGxhc3QgaXMgY2FsbGVkIGZpcnN0LgotICBFYWNoIGNsZWFudXAgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYXQgbW9zdCBvbmNlLiAgU2luY2UgUHl0aG9uJ3MKLSAgaW50ZXJuYWwgZmluYWxpemF0aW9uIHdpbGwgaGF2ZSBjb21wbGV0ZWQgYmVmb3JlIHRoZSBjbGVhbnVwCi0gIGZ1bmN0aW9uLCBubyBQeXRob24gQVBJcyBzaG91bGQgYmUgY2FsbGVkIGJ5IFx2YXJ7ZnVuY30uCi1cZW5ke2NmdW5jZGVzY30KLQotCi1cc2VjdGlvbntJbXBvcnRpbmcgTW9kdWxlcyBcbGFiZWx7aW1wb3J0aW5nfX0KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeUltcG9ydF9JbXBvcnRNb2R1bGV9e2NvbnN0IGNoYXIgKm5hbWV9Ci0gIFRoaXMgaXMgYSBzaW1wbGlmaWVkIGludGVyZmFjZSB0bwotICBcY2Z1bmN0aW9ue1B5SW1wb3J0X0ltcG9ydE1vZHVsZUV4KCl9IGJlbG93LCBsZWF2aW5nIHRoZQotICBcdmFye2dsb2JhbHN9IGFuZCBcdmFye2xvY2Fsc30gYXJndW1lbnRzIHNldCB0byBcTlVMTC4gIFdoZW4gdGhlCi0gIFx2YXJ7bmFtZX0gYXJndW1lbnQgY29udGFpbnMgYSBkb3QgKHdoZW4gaXQgc3BlY2lmaWVzIGEgc3VibW9kdWxlIG9mCi0gIGEgcGFja2FnZSksIHRoZSBcdmFye2Zyb21saXN0fSBhcmd1bWVudCBpcyBzZXQgdG8gdGhlIGxpc3QKLSAgXGNvZGV7WycqJ119IHNvIHRoYXQgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbmFtZWQgbW9kdWxlIHJhdGhlcgotICB0aGFuIHRoZSB0b3AtbGV2ZWwgcGFja2FnZSBjb250YWluaW5nIGl0IGFzIHdvdWxkIG90aGVyd2lzZSBiZSB0aGUKLSAgY2FzZS4gIChVbmZvcnR1bmF0ZWx5LCB0aGlzIGhhcyBhbiBhZGRpdGlvbmFsIHNpZGUgZWZmZWN0IHdoZW4KLSAgXHZhcntuYW1lfSBpbiBmYWN0IHNwZWNpZmllcyBhIHN1YnBhY2thZ2UgaW5zdGVhZCBvZiBhIHN1Ym1vZHVsZToKLSAgdGhlIHN1Ym1vZHVsZXMgc3BlY2lmaWVkIGluIHRoZSBwYWNrYWdlJ3MgXGNvZGV7X19hbGxfX30gdmFyaWFibGUKLSAgYXJlIFxpbmRleHtwYWNrYWdlIHZhcmlhYmxlIVxjb2Rle19fYWxsX199fQotICBcd2l0aHN1Yml0ZW17KHBhY2thZ2UgdmFyaWFibGUpfXtcdHRpbmRleHtfX2FsbF9ffX1sb2FkZWQuKSAgUmV0dXJuCi0gIGEgbmV3IHJlZmVyZW5jZSB0byB0aGUgaW1wb3J0ZWQgbW9kdWxlLCBvciBcTlVMTHt9IHdpdGggYW4gZXhjZXB0aW9uCi0gIHNldCBvbiBmYWlsdXJlLiAgQmVmb3JlIFB5dGhvbiAyLjQsIHRoZSBtb2R1bGUgbWF5IHN0aWxsIGJlIGNyZWF0ZWQgaW4KLSAgdGhlIGZhaWx1cmUgY2FzZSAtLS0gZXhhbWluZSBcY29kZXtzeXMubW9kdWxlc30gdG8gZmluZCBvdXQuICBTdGFydGluZwotICB3aXRoIFB5dGhvbiAyLjQsIGEgZmFpbGluZyBpbXBvcnQgb2YgYSBtb2R1bGUgbm8gbG9uZ2VyIGxlYXZlcyB0aGUKLSAgbW9kdWxlIGluIFxjb2Rle3N5cy5tb2R1bGVzfS4KLSAgXHZlcnNpb25jaGFuZ2VkW2ZhaWxpbmcgaW1wb3J0cyByZW1vdmUgaW5jb21wbGV0ZSBtb2R1bGUgb2JqZWN0c117Mi40fQotICBcd2l0aHN1Yml0ZW17KGluIG1vZHVsZSBzeXMpfXtcdHRpbmRleHttb2R1bGVzfX0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5SW1wb3J0X0ltcG9ydE1vZHVsZUV4fXtjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqZ2xvYmFscywgUHlPYmplY3QgKmxvY2FscywgUHlPYmplY3QgKmZyb21saXN0fQotICBJbXBvcnQgYSBtb2R1bGUuICBUaGlzIGlzIGJlc3QgZGVzY3JpYmVkIGJ5IHJlZmVycmluZyB0byB0aGUKLSAgYnVpbHQtaW4gUHl0aG9uIGZ1bmN0aW9uCi0gIFxmdW5jdGlvbntfX2ltcG9ydF9fKCl9XGJpZnVuY2luZGV4e19faW1wb3J0X199LCBhcyB0aGUgc3RhbmRhcmQKLSAgXGZ1bmN0aW9ue19faW1wb3J0X18oKX0gZnVuY3Rpb24gY2FsbHMgdGhpcyBmdW5jdGlvbiBkaXJlY3RseS4KLQotICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgbmV3IHJlZmVyZW5jZSB0byB0aGUgaW1wb3J0ZWQgbW9kdWxlIG9yCi0gIHRvcC1sZXZlbCBwYWNrYWdlLCBvciBcTlVMTHt9IHdpdGggYW4gZXhjZXB0aW9uIHNldCBvbiBmYWlsdXJlIChiZWZvcmUKLSAgUHl0aG9uIDIuNCwgdGhlCi0gIG1vZHVsZSBtYXkgc3RpbGwgYmUgY3JlYXRlZCBpbiB0aGlzIGNhc2UpLiAgTGlrZSBmb3IKLSAgXGZ1bmN0aW9ue19faW1wb3J0X18oKX0sIHRoZSByZXR1cm4gdmFsdWUgd2hlbiBhIHN1Ym1vZHVsZSBvZiBhCi0gIHBhY2thZ2Ugd2FzIHJlcXVlc3RlZCBpcyBub3JtYWxseSB0aGUgdG9wLWxldmVsIHBhY2thZ2UsIHVubGVzcyBhCi0gIG5vbi1lbXB0eSBcdmFye2Zyb21saXN0fSB3YXMgZ2l2ZW4uCi0gIFx2ZXJzaW9uY2hhbmdlZFtmYWlsaW5nIGltcG9ydHMgcmVtb3ZlIGluY29tcGxldGUgbW9kdWxlIG9iamVjdHNdezIuNH0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5SW1wb3J0X0ltcG9ydH17UHlPYmplY3QgKm5hbWV9Ci0gIFRoaXMgaXMgYSBoaWdoZXItbGV2ZWwgaW50ZXJmYWNlIHRoYXQgY2FsbHMgdGhlIGN1cnJlbnQgYGBpbXBvcnQKLSAgaG9vayBmdW5jdGlvbicnLiAgSXQgaW52b2tlcyB0aGUgXGZ1bmN0aW9ue19faW1wb3J0X18oKX0gZnVuY3Rpb24KLSAgZnJvbSB0aGUgXGNvZGV7X19idWlsdGluc19ffSBvZiB0aGUgY3VycmVudCBnbG9iYWxzLiAgVGhpcyBtZWFucwotICB0aGF0IHRoZSBpbXBvcnQgaXMgZG9uZSB1c2luZyB3aGF0ZXZlciBpbXBvcnQgaG9va3MgYXJlIGluc3RhbGxlZCBpbgotICB0aGUgY3VycmVudCBlbnZpcm9ubWVudCwgZS5nLiBieSBcbW9kdWxle3JleGVjfVxyZWZzdG1vZGluZGV4e3JleGVjfQotICBvciBcbW9kdWxle2lob29rc31ccmVmc3Rtb2RpbmRleHtpaG9va3N9LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlJbXBvcnRfUmVsb2FkTW9kdWxlfXtQeU9iamVjdCAqbX0KLSAgUmVsb2FkIGEgbW9kdWxlLiAgUmV0dXJuIGEgbmV3IHJlZmVyZW5jZSB0byB0aGUgcmVsb2FkZWQgbW9kdWxlLCBvciBcTlVMTHt9Ci0gIHdpdGggYW4gZXhjZXB0aW9uIHNldCBvbiBmYWlsdXJlICh0aGUgbW9kdWxlIHN0aWxsIGV4aXN0cyBpbiB0aGlzCi0gIGNhc2UpLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlJbXBvcnRfQWRkTW9kdWxlfXtjb25zdCBjaGFyICpuYW1lfQotICBSZXR1cm4gdGhlIG1vZHVsZSBvYmplY3QgY29ycmVzcG9uZGluZyB0byBhIG1vZHVsZSBuYW1lLiAgVGhlCi0gIFx2YXJ7bmFtZX0gYXJndW1lbnQgbWF5IGJlIG9mIHRoZSBmb3JtIFxjb2Rle3BhY2thZ2UubW9kdWxlfS4KLSAgRmlyc3QgY2hlY2sgdGhlIG1vZHVsZXMgZGljdGlvbmFyeSBpZiB0aGVyZSdzIG9uZSB0aGVyZSwgYW5kIGlmIG5vdCwKLSAgY3JlYXRlIGEgbmV3IG9uZSBhbmQgaW5zZXJ0IGl0IGluIHRoZSBtb2R1bGVzIGRpY3Rpb25hcnkuCi0gIFJldHVybiBcTlVMTHt9IHdpdGggYW4gZXhjZXB0aW9uIHNldCBvbiBmYWlsdXJlLgotICBcbm90ZXtUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGxvYWQgb3IgaW1wb3J0IHRoZSBtb2R1bGU7IGlmIHRoZQotICBtb2R1bGUgd2Fzbid0IGFscmVhZHkgbG9hZGVkLCB5b3Ugd2lsbCBnZXQgYW4gZW1wdHkgbW9kdWxlIG9iamVjdC4KLSAgVXNlIFxjZnVuY3Rpb257UHlJbXBvcnRfSW1wb3J0TW9kdWxlKCl9IG9yIG9uZSBvZiBpdHMgdmFyaWFudHMgdG8KLSAgaW1wb3J0IGEgbW9kdWxlLiAgUGFja2FnZSBzdHJ1Y3R1cmVzIGltcGxpZWQgYnkgYSBkb3R0ZWQgbmFtZSBmb3IKLSAgXHZhcntuYW1lfSBhcmUgbm90IGNyZWF0ZWQgaWYgbm90IGFscmVhZHkgcHJlc2VudC59Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeUltcG9ydF9FeGVjQ29kZU1vZHVsZX17Y2hhciAqbmFtZSwgUHlPYmplY3QgKmNvfQotICBHaXZlbiBhIG1vZHVsZSBuYW1lIChwb3NzaWJseSBvZiB0aGUgZm9ybSBcY29kZXtwYWNrYWdlLm1vZHVsZX0pIGFuZAotICBhIGNvZGUgb2JqZWN0IHJlYWQgZnJvbSBhIFB5dGhvbiBieXRlY29kZSBmaWxlIG9yIG9idGFpbmVkIGZyb20gdGhlCi0gIGJ1aWx0LWluIGZ1bmN0aW9uIFxmdW5jdGlvbntjb21waWxlKCl9XGJpZnVuY2luZGV4e2NvbXBpbGV9LCBsb2FkCi0gIHRoZSBtb2R1bGUuICBSZXR1cm4gYSBuZXcgcmVmZXJlbmNlIHRvIHRoZSBtb2R1bGUgb2JqZWN0LCBvciBcTlVMTHt9Ci0gIHdpdGggYW4gZXhjZXB0aW9uIHNldCBpZiBhbiBlcnJvciBvY2N1cnJlZC4gIEJlZm9yZSBQeXRob24gMi40LCB0aGUgbW9kdWxlCi0gIGNvdWxkIHN0aWxsIGJlIGNyZWF0ZWQgaW4gZXJyb3IgY2FzZXMuICBTdGFydGluZyB3aXRoIFB5dGhvbiAyLjQsCi0gIFx2YXJ7bmFtZX0gaXMgcmVtb3ZlZCBmcm9tIFxjb2Rle3N5cy5tb2R1bGVzfSBpbiBlcnJvciBjYXNlcywgYW5kIGV2ZW4KLSAgaWYgXHZhcntuYW1lfSB3YXMgYWxyZWFkeSBpbiBcY29kZXtzeXMubW9kdWxlc30gb24gZW50cnkgdG8KLSAgXGNmdW5jdGlvbntQeUltcG9ydF9FeGVjQ29kZU1vZHVsZSgpfS4gIExlYXZpbmcgaW5jb21wbGV0ZWx5IGluaXRpYWxpemVkCi0gIG1vZHVsZXMgaW4gXGNvZGV7c3lzLm1vZHVsZXN9IGlzIGRhbmdlcm91cywgYXMgaW1wb3J0cyBvZiBzdWNoIG1vZHVsZXMKLSAgaGF2ZSBubyB3YXkgdG8ga25vdyB0aGF0IHRoZSBtb2R1bGUgb2JqZWN0IGlzIGFuIHVua25vd24gKGFuZCBwcm9iYWJseQotICBkYW1hZ2VkIHdpdGggcmVzcGVjdCB0byB0aGUgbW9kdWxlIGF1dGhvcidzIGludGVudHMpIHN0YXRlLgotCi0gIFRoaXMgZnVuY3Rpb24gd2lsbCByZWxvYWQgdGhlIG1vZHVsZSBpZiBpdCB3YXMgYWxyZWFkeSBpbXBvcnRlZC4gIFNlZQotICBcY2Z1bmN0aW9ue1B5SW1wb3J0X1JlbG9hZE1vZHVsZSgpfSBmb3IgdGhlIGludGVuZGVkIHdheSB0byByZWxvYWQgYQotICBtb2R1bGUuCi0KLSAgSWYgXHZhcntuYW1lfSBwb2ludHMgdG8gYSBkb3R0ZWQgbmFtZSBvZiB0aGUKLSAgZm9ybSBcY29kZXtwYWNrYWdlLm1vZHVsZX0sIGFueSBwYWNrYWdlIHN0cnVjdHVyZXMgbm90IGFscmVhZHkKLSAgY3JlYXRlZCB3aWxsIHN0aWxsIG5vdCBiZSBjcmVhdGVkLgotCi0gIFx2ZXJzaW9uY2hhbmdlZFtcdmFye25hbWV9IGlzIHJlbW92ZWQgZnJvbSBcY29kZXtzeXMubW9kdWxlc30gaW4gZXJyb3IgY2FzZXNdezIuNH0KLQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2xvbmd9e1B5SW1wb3J0X0dldE1hZ2ljTnVtYmVyfXt9Ci0gIFJldHVybiB0aGUgbWFnaWMgbnVtYmVyIGZvciBQeXRob24gYnl0ZWNvZGUgZmlsZXMKLSAgKGEuay5hLiBcZmlsZXsucHljfSBhbmQgXGZpbGV7LnB5b30gZmlsZXMpLiAgVGhlIG1hZ2ljIG51bWJlciBzaG91bGQKLSAgYmUgcHJlc2VudCBpbiB0aGUgZmlyc3QgZm91ciBieXRlcyBvZiB0aGUgYnl0ZWNvZGUgZmlsZSwgaW4KLSAgbGl0dGxlLWVuZGlhbiBieXRlIG9yZGVyLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlJbXBvcnRfR2V0TW9kdWxlRGljdH17fQotICBSZXR1cm4gdGhlIGRpY3Rpb25hcnkgdXNlZCBmb3IgdGhlIG1vZHVsZSBhZG1pbmlzdHJhdGlvbgotICAoYS5rLmEuXCBcY29kZXtzeXMubW9kdWxlc30pLiAgTm90ZSB0aGF0IHRoaXMgaXMgYSBwZXItaW50ZXJwcmV0ZXIKLSAgdmFyaWFibGUuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317dm9pZH17X1B5SW1wb3J0X0luaXR9e30KLSAgSW5pdGlhbGl6ZSB0aGUgaW1wb3J0IG1lY2hhbmlzbS4gIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXt2b2lkfXtQeUltcG9ydF9DbGVhbnVwfXt9Ci0gIEVtcHR5IHRoZSBtb2R1bGUgdGFibGUuICBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317dm9pZH17X1B5SW1wb3J0X0Zpbml9e30KLSAgRmluYWxpemUgdGhlIGltcG9ydCBtZWNoYW5pc20uICBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtfUHlJbXBvcnRfRmluZEV4dGVuc2lvbn17Y2hhciAqLCBjaGFyICp9Ci0gIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e19QeUltcG9ydF9GaXh1cEV4dGVuc2lvbn17Y2hhciAqLCBjaGFyICp9Ci0gIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5SW1wb3J0X0ltcG9ydEZyb3plbk1vZHVsZX17Y2hhciAqbmFtZX0KLSAgTG9hZCBhIGZyb3plbiBtb2R1bGUgbmFtZWQgXHZhcntuYW1lfS4gIFJldHVybiBcY29kZXsxfSBmb3Igc3VjY2VzcywKLSAgXGNvZGV7MH0gaWYgdGhlIG1vZHVsZSBpcyBub3QgZm91bmQsIGFuZCBcY29kZXstMX0gd2l0aCBhbiBleGNlcHRpb24KLSAgc2V0IGlmIHRoZSBpbml0aWFsaXphdGlvbiBmYWlsZWQuICBUbyBhY2Nlc3MgdGhlIGltcG9ydGVkIG1vZHVsZSBvbgotICBhIHN1Y2Nlc3NmdWwgbG9hZCwgdXNlIFxjZnVuY3Rpb257UHlJbXBvcnRfSW1wb3J0TW9kdWxlKCl9LiAgKE5vdGUKLSAgdGhlIG1pc25vbWVyIC0tLSB0aGlzIGZ1bmN0aW9uIHdvdWxkIHJlbG9hZCB0aGUgbW9kdWxlIGlmIGl0IHdhcwotICBhbHJlYWR5IGltcG9ydGVkLikKLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y3R5cGVkZXNjfVtfZnJvemVuXXtzdHJ1Y3QgX2Zyb3plbn0KLSAgVGhpcyBpcyB0aGUgc3RydWN0dXJlIHR5cGUgZGVmaW5pdGlvbiBmb3IgZnJvemVuIG1vZHVsZSBkZXNjcmlwdG9ycywKLSAgYXMgZ2VuZXJhdGVkIGJ5IHRoZSBccHJvZ3JhbXtmcmVlemV9XGluZGV4e2ZyZWV6ZSB1dGlsaXR5fSB1dGlsaXR5Ci0gIChzZWUgXGZpbGV7VG9vbHMvZnJlZXplL30gaW4gdGhlIFB5dGhvbiBzb3VyY2UgZGlzdHJpYnV0aW9uKS4gIEl0cwotICBkZWZpbml0aW9uLCBmb3VuZCBpbiBcZmlsZXtJbmNsdWRlL2ltcG9ydC5ofSwgaXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXN0cnVjdCBfZnJvemVuIHsKLSAgICBjaGFyICpuYW1lOwotICAgIHVuc2lnbmVkIGNoYXIgKmNvZGU7Ci0gICAgaW50IHNpemU7Ci19OwotXGVuZHt2ZXJiYXRpbX0KLVxlbmR7Y3R5cGVkZXNjfQotCi1cYmVnaW57Y3ZhcmRlc2N9e3N0cnVjdCBfZnJvemVuKn17UHlJbXBvcnRfRnJvemVuTW9kdWxlc30KLSAgVGhpcyBwb2ludGVyIGlzIGluaXRpYWxpemVkIHRvIHBvaW50IHRvIGFuIGFycmF5IG9mIFxjdHlwZXtzdHJ1Y3QKLSAgX2Zyb3plbn0gcmVjb3JkcywgdGVybWluYXRlZCBieSBvbmUgd2hvc2UgbWVtYmVycyBhcmUgYWxsIFxOVUxMe30gb3IKLSAgemVyby4gIFdoZW4gYSBmcm96ZW4gbW9kdWxlIGlzIGltcG9ydGVkLCBpdCBpcyBzZWFyY2hlZCBpbiB0aGlzCi0gIHRhYmxlLiAgVGhpcmQtcGFydHkgY29kZSBjb3VsZCBwbGF5IHRyaWNrcyB3aXRoIHRoaXMgdG8gcHJvdmlkZSBhCi0gIGR5bmFtaWNhbGx5IGNyZWF0ZWQgY29sbGVjdGlvbiBvZiBmcm96ZW4gbW9kdWxlcy4KLVxlbmR7Y3ZhcmRlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlJbXBvcnRfQXBwZW5kSW5pdHRhYn17Y2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmluaXRmdW5jKSh2b2lkKX0KLSAgQWRkIGEgc2luZ2xlIG1vZHVsZSB0byB0aGUgZXhpc3RpbmcgdGFibGUgb2YgYnVpbHQtaW4gbW9kdWxlcy4gIFRoaXMKLSAgaXMgYSBjb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZAotICBcY2Z1bmN0aW9ue1B5SW1wb3J0X0V4dGVuZEluaXR0YWIoKX0sIHJldHVybmluZyBcY29kZXstMX0gaWYgdGhlCi0gIHRhYmxlIGNvdWxkIG5vdCBiZSBleHRlbmRlZC4gIFRoZSBuZXcgbW9kdWxlIGNhbiBiZSBpbXBvcnRlZCBieSB0aGUKLSAgbmFtZSBcdmFye25hbWV9LCBhbmQgdXNlcyB0aGUgZnVuY3Rpb24gXHZhcntpbml0ZnVuY30gYXMgdGhlCi0gIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGNhbGxlZCBvbiB0aGUgZmlyc3QgYXR0ZW1wdGVkIGltcG9ydC4gIFRoaXMKLSAgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgXGNmdW5jdGlvbntQeV9Jbml0aWFsaXplKCl9LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjdHlwZWRlc2N9W19pbml0dGFiXXtzdHJ1Y3QgX2luaXR0YWJ9Ci0gIFN0cnVjdHVyZSBkZXNjcmliaW5nIGEgc2luZ2xlIGVudHJ5IGluIHRoZSBsaXN0IG9mIGJ1aWx0LWluCi0gIG1vZHVsZXMuICBFYWNoIG9mIHRoZXNlIHN0cnVjdHVyZXMgZ2l2ZXMgdGhlIG5hbWUgYW5kIGluaXRpYWxpemF0aW9uCi0gIGZ1bmN0aW9uIGZvciBhIG1vZHVsZSBidWlsdCBpbnRvIHRoZSBpbnRlcnByZXRlci4gIFByb2dyYW1zIHdoaWNoCi0gIGVtYmVkIFB5dGhvbiBtYXkgdXNlIGFuIGFycmF5IG9mIHRoZXNlIHN0cnVjdHVyZXMgaW4gY29uanVuY3Rpb24KLSAgd2l0aCBcY2Z1bmN0aW9ue1B5SW1wb3J0X0V4dGVuZEluaXR0YWIoKX0gdG8gcHJvdmlkZSBhZGRpdGlvbmFsCi0gIGJ1aWx0LWluIG1vZHVsZXMuICBUaGUgc3RydWN0dXJlIGlzIGRlZmluZWQgaW4KLSAgXGZpbGV7SW5jbHVkZS9pbXBvcnQuaH0gYXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXN0cnVjdCBfaW5pdHRhYiB7Ci0gICAgY2hhciAqbmFtZTsKLSAgICB2b2lkICgqaW5pdGZ1bmMpKHZvaWQpOwotfTsKLVxlbmR7dmVyYmF0aW19Ci1cZW5ke2N0eXBlZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeUltcG9ydF9FeHRlbmRJbml0dGFifXtzdHJ1Y3QgX2luaXR0YWIgKm5ld3RhYn0KLSAgQWRkIGEgY29sbGVjdGlvbiBvZiBtb2R1bGVzIHRvIHRoZSB0YWJsZSBvZiBidWlsdC1pbiBtb2R1bGVzLiAgVGhlCi0gIFx2YXJ7bmV3dGFifSBhcnJheSBtdXN0IGVuZCB3aXRoIGEgc2VudGluZWwgZW50cnkgd2hpY2ggY29udGFpbnMKLSAgXE5VTEx7fSBmb3IgdGhlIFxtZW1iZXJ7bmFtZX0gZmllbGQ7IGZhaWx1cmUgdG8gcHJvdmlkZSB0aGUgc2VudGluZWwKLSAgdmFsdWUgY2FuIHJlc3VsdCBpbiBhIG1lbW9yeSBmYXVsdC4gIFJldHVybnMgXGNvZGV7MH0gb24gc3VjY2VzcyBvcgotICBcY29kZXstMX0gaWYgaW5zdWZmaWNpZW50IG1lbW9yeSBjb3VsZCBiZSBhbGxvY2F0ZWQgdG8gZXh0ZW5kIHRoZQotICBpbnRlcm5hbCB0YWJsZS4gIEluIHRoZSBldmVudCBvZiBmYWlsdXJlLCBubyBtb2R1bGVzIGFyZSBhZGRlZCB0bwotICB0aGUgaW50ZXJuYWwgdGFibGUuICBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlCi0gIFxjZnVuY3Rpb257UHlfSW5pdGlhbGl6ZSgpfS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi0KLVxzZWN0aW9ue0RhdGEgbWFyc2hhbGxpbmcgc3VwcG9ydCBcbGFiZWx7bWFyc2hhbGxpbmctdXRpbHN9fQotCi1UaGVzZSByb3V0aW5lcyBhbGxvdyBDIGNvZGUgdG8gd29yayB3aXRoIHNlcmlhbGl6ZWQgb2JqZWN0cyB1c2luZyB0aGUKLXNhbWUgZGF0YSBmb3JtYXQgYXMgdGhlIFxtb2R1bGV7bWFyc2hhbH0gbW9kdWxlLiAgVGhlcmUgYXJlIGZ1bmN0aW9ucwotdG8gd3JpdGUgZGF0YSBpbnRvIHRoZSBzZXJpYWxpemF0aW9uIGZvcm1hdCwgYW5kIGFkZGl0aW9uYWwgZnVuY3Rpb25zCi10aGF0IGNhbiBiZSB1c2VkIHRvIHJlYWQgdGhlIGRhdGEgYmFjay4gIEZpbGVzIHVzZWQgdG8gc3RvcmUgbWFyc2hhbGxlZAotZGF0YSBtdXN0IGJlIG9wZW5lZCBpbiBiaW5hcnkgbW9kZS4KLQotTnVtZXJpYyB2YWx1ZXMgYXJlIHN0b3JlZCB3aXRoIHRoZSBsZWFzdCBzaWduaWZpY2FudCBieXRlIGZpcnN0LgotCi1UaGUgbW9kdWxlIHN1cHBvcnRzIHR3byB2ZXJzaW9ucyBvZiB0aGUgZGF0YSBmb3JtYXQ6IHZlcnNpb24gMCBpcyB0aGUKLWhpc3RvcmljYWwgdmVyc2lvbiwgdmVyc2lvbiAxIChuZXcgaW4gUHl0aG9uIDIuNCkgc2hhcmVzIGludGVybmVkCi1zdHJpbmdzIGluIHRoZSBmaWxlLCBhbmQgdXBvbiB1bm1hcnNoYWxsaW5nLiBcdmFye1B5X01BUlNIQUxfVkVSU0lPTn0KLWluZGljYXRlcyB0aGUgY3VycmVudCBmaWxlIGZvcm1hdCAoY3VycmVudGx5IDEpLgotCi1cYmVnaW57Y2Z1bmNkZXNjfXt2b2lkfXtQeU1hcnNoYWxfV3JpdGVMb25nVG9GaWxlfXtsb25nIHZhbHVlLCBGSUxFICpmaWxlLCBpbnQgdmVyc2lvbn0KLSAgTWFyc2hhbCBhIFxjdHlwZXtsb25nfSBpbnRlZ2VyLCBcdmFye3ZhbHVlfSwgdG8gXHZhcntmaWxlfS4gIFRoaXMKLSAgd2lsbCBvbmx5IHdyaXRlIHRoZSBsZWFzdC1zaWduaWZpY2FudCAzMiBiaXRzIG9mIFx2YXJ7dmFsdWV9OwotICByZWdhcmRsZXNzIG9mIHRoZSBzaXplIG9mIHRoZSBuYXRpdmUgXGN0eXBle2xvbmd9IHR5cGUuCi0KLSAgXHZlcnNpb25jaGFuZ2VkW1x2YXJ7dmVyc2lvbn0gaW5kaWNhdGVzIHRoZSBmaWxlIGZvcm1hdF17Mi40fQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e3ZvaWR9e1B5TWFyc2hhbF9Xcml0ZU9iamVjdFRvRmlsZX17UHlPYmplY3QgKnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFICpmaWxlLCBpbnQgdmVyc2lvbn0KLSAgTWFyc2hhbCBhIFB5dGhvbiBvYmplY3QsIFx2YXJ7dmFsdWV9LCB0byBcdmFye2ZpbGV9LgotCi0gIFx2ZXJzaW9uY2hhbmdlZFtcdmFye3ZlcnNpb259IGluZGljYXRlcyB0aGUgZmlsZSBmb3JtYXRdezIuNH0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5TWFyc2hhbF9Xcml0ZU9iamVjdFRvU3RyaW5nfXtQeU9iamVjdCAqdmFsdWUsIGludCB2ZXJzaW9ufQotICBSZXR1cm4gYSBzdHJpbmcgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG1hcnNoYWxsZWQgcmVwcmVzZW50YXRpb24gb2YKLSAgXHZhcnt2YWx1ZX0uCi0KLSAgXHZlcnNpb25jaGFuZ2VkW1x2YXJ7dmVyc2lvbn0gaW5kaWNhdGVzIHRoZSBmaWxlIGZvcm1hdF17Mi40fQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFsbG93IG1hcnNoYWxsZWQgdmFsdWVzIHRvIGJlIHJlYWQgYmFjayBpbi4KLQotWFhYIFdoYXQgYWJvdXQgZXJyb3IgZGV0ZWN0aW9uPyAgSXQgYXBwZWFycyB0aGF0IHJlYWRpbmcgcGFzdCB0aGUgZW5kCi1vZiB0aGUgZmlsZSB3aWxsIGFsd2F5cyByZXN1bHQgaW4gYSBuZWdhdGl2ZSBudW1lcmljIHZhbHVlICh3aGVyZQotdGhhdCdzIHJlbGV2YW50KSwgYnV0IGl0J3Mgbm90IGNsZWFyIHRoYXQgbmVnYXRpdmUgdmFsdWVzIHdvbid0IGJlCi1oYW5kbGVkIHByb3Blcmx5IHdoZW4gdGhlcmUncyBubyBlcnJvci4gIFdoYXQncyB0aGUgcmlnaHQgd2F5IHRvIHRlbGw/Ci1TaG91bGQgb25seSBub24tbmVnYXRpdmUgdmFsdWVzIGJlIHdyaXR0ZW4gdXNpbmcgdGhlc2Ugcm91dGluZXM/Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2xvbmd9e1B5TWFyc2hhbF9SZWFkTG9uZ0Zyb21GaWxlfXtGSUxFICpmaWxlfQotICBSZXR1cm4gYSBDIFxjdHlwZXtsb25nfSBmcm9tIHRoZSBkYXRhIHN0cmVhbSBpbiBhIFxjdHlwZXtGSUxFKn0KLSAgb3BlbmVkIGZvciByZWFkaW5nLiAgT25seSBhIDMyLWJpdCB2YWx1ZSBjYW4gYmUgcmVhZCBpbiB1c2luZwotICB0aGlzIGZ1bmN0aW9uLCByZWdhcmRsZXNzIG9mIHRoZSBuYXRpdmUgc2l6ZSBvZiBcY3R5cGV7bG9uZ30uCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeU1hcnNoYWxfUmVhZFNob3J0RnJvbUZpbGV9e0ZJTEUgKmZpbGV9Ci0gIFJldHVybiBhIEMgXGN0eXBle3Nob3J0fSBmcm9tIHRoZSBkYXRhIHN0cmVhbSBpbiBhIFxjdHlwZXtGSUxFKn0KLSAgb3BlbmVkIGZvciByZWFkaW5nLiAgT25seSBhIDE2LWJpdCB2YWx1ZSBjYW4gYmUgcmVhZCBpbiB1c2luZwotICB0aGlzIGZ1bmN0aW9uLCByZWdhcmRsZXNzIG9mIHRoZSBuYXRpdmUgc2l6ZSBvZiBcY3R5cGV7c2hvcnR9LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlNYXJzaGFsX1JlYWRPYmplY3RGcm9tRmlsZX17RklMRSAqZmlsZX0KLSAgUmV0dXJuIGEgUHl0aG9uIG9iamVjdCBmcm9tIHRoZSBkYXRhIHN0cmVhbSBpbiBhIFxjdHlwZXtGSUxFKn0KLSAgb3BlbmVkIGZvciByZWFkaW5nLiAgT24gZXJyb3IsIHNldHMgdGhlIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbgotICAoXGV4Y2VwdGlvbntFT0ZFcnJvcn0gb3IgXGV4Y2VwdGlvbntUeXBlRXJyb3J9KSBhbmQgcmV0dXJucyBcTlVMTC4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5TWFyc2hhbF9SZWFkTGFzdE9iamVjdEZyb21GaWxlfXtGSUxFICpmaWxlfQotICBSZXR1cm4gYSBQeXRob24gb2JqZWN0IGZyb20gdGhlIGRhdGEgc3RyZWFtIGluIGEgXGN0eXBle0ZJTEUqfQotICBvcGVuZWQgZm9yIHJlYWRpbmcuICBVbmxpa2UKLSAgXGNmdW5jdGlvbntQeU1hcnNoYWxfUmVhZE9iamVjdEZyb21GaWxlKCl9LCB0aGlzIGZ1bmN0aW9uIGFzc3VtZXMKLSAgdGhhdCBubyBmdXJ0aGVyIG9iamVjdHMgd2lsbCBiZSByZWFkIGZyb20gdGhlIGZpbGUsIGFsbG93aW5nIGl0IHRvCi0gIGFnZ3Jlc3NpdmVseSBsb2FkIGZpbGUgZGF0YSBpbnRvIG1lbW9yeSBzbyB0aGF0IHRoZSBkZS1zZXJpYWxpemF0aW9uCi0gIGNhbiBvcGVyYXRlIGZyb20gZGF0YSBpbiBtZW1vcnkgcmF0aGVyIHRoYW4gcmVhZGluZyBhIGJ5dGUgYXQgYSB0aW1lCi0gIGZyb20gdGhlIGZpbGUuICBPbmx5IHVzZSB0aGVzZSB2YXJpYW50IGlmIHlvdSBhcmUgY2VydGFpbiB0aGF0IHlvdQotICB3b24ndCBiZSByZWFkaW5nIGFueXRoaW5nIGVsc2UgZnJvbSB0aGUgZmlsZS4gIE9uIGVycm9yLCBzZXRzIHRoZQotICBhcHByb3ByaWF0ZSBleGNlcHRpb24gKFxleGNlcHRpb257RU9GRXJyb3J9IG9yCi0gIFxleGNlcHRpb257VHlwZUVycm9yfSkgYW5kIHJldHVybnMgXE5VTEwuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeU1hcnNoYWxfUmVhZE9iamVjdEZyb21TdHJpbmd9e2NoYXIgKnN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbn0KLSAgUmV0dXJuIGEgUHl0aG9uIG9iamVjdCBmcm9tIHRoZSBkYXRhIHN0cmVhbSBpbiBhIGNoYXJhY3RlciBidWZmZXIKLSAgY29udGFpbmluZyBcdmFye2xlbn0gYnl0ZXMgcG9pbnRlZCB0byBieSBcdmFye3N0cmluZ30uICBPbiBlcnJvciwKLSAgc2V0cyB0aGUgYXBwcm9wcmlhdGUgZXhjZXB0aW9uIChcZXhjZXB0aW9ue0VPRkVycm9yfSBvcgotICBcZXhjZXB0aW9ue1R5cGVFcnJvcn0pIGFuZCByZXR1cm5zIFxOVUxMLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLQotXHNlY3Rpb257UGFyc2luZyBhcmd1bWVudHMgYW5kIGJ1aWxkaW5nIHZhbHVlcwotICAgICAgICAgXGxhYmVse2FyZy1wYXJzaW5nfX0KLQotVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VmdWwgd2hlbiBjcmVhdGluZyB5b3VyIG93biBleHRlbnNpb25zIGZ1bmN0aW9ucwotYW5kIG1ldGhvZHMuICBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFuZCBleGFtcGxlcyBhcmUgYXZhaWxhYmxlIGluCi1cY2l0ZXRpdGxlWy4uL2V4dC9leHQuaHRtbF17RXh0ZW5kaW5nIGFuZCBFbWJlZGRpbmcgdGhlIFB5dGhvbgotSW50ZXJwcmV0ZXJ9LgotCi1UaGUgZmlyc3QgdGhyZWUgb2YgdGhlc2UgZnVuY3Rpb25zIGRlc2NyaWJlZCwKLVxjZnVuY3Rpb257UHlBcmdfUGFyc2VUdXBsZSgpfSwKLVxjZnVuY3Rpb257UHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKCl9LCBhbmQKLVxjZnVuY3Rpb257UHlBcmdfUGFyc2UoKX0sIGFsbCB1c2UgXGVtcGh7Zm9ybWF0IHN0cmluZ3N9IHdoaWNoIGFyZQotdXNlZCB0byB0ZWxsIHRoZSBmdW5jdGlvbiBhYm91dCB0aGUgZXhwZWN0ZWQgYXJndW1lbnRzLiAgVGhlIGZvcm1hdAotc3RyaW5ncyB1c2UgdGhlIHNhbWUgc3ludGF4IGZvciBlYWNoIG9mIHRoZXNlIGZ1bmN0aW9ucy4KLQotQSBmb3JtYXQgc3RyaW5nIGNvbnNpc3RzIG9mIHplcm8gb3IgbW9yZSBgYGZvcm1hdCB1bml0cy4nJyAgQSBmb3JtYXQKLXVuaXQgZGVzY3JpYmVzIG9uZSBQeXRob24gb2JqZWN0OyBpdCBpcyB1c3VhbGx5IGEgc2luZ2xlIGNoYXJhY3RlciBvcgotYSBwYXJlbnRoZXNpemVkIHNlcXVlbmNlIG9mIGZvcm1hdCB1bml0cy4gIFdpdGggYSBmZXcgZXhjZXB0aW9ucywgYQotZm9ybWF0IHVuaXQgdGhhdCBpcyBub3QgYSBwYXJlbnRoZXNpemVkIHNlcXVlbmNlIG5vcm1hbGx5IGNvcnJlc3BvbmRzCi10byBhIHNpbmdsZSBhZGRyZXNzIGFyZ3VtZW50IHRvIHRoZXNlIGZ1bmN0aW9ucy4gIEluIHRoZSBmb2xsb3dpbmcKLWRlc2NyaXB0aW9uLCB0aGUgcXVvdGVkIGZvcm0gaXMgdGhlIGZvcm1hdCB1bml0OyB0aGUgZW50cnkgaW4gKHJvdW5kKQotcGFyZW50aGVzZXMgaXMgdGhlIFB5dGhvbiBvYmplY3QgdHlwZSB0aGF0IG1hdGNoZXMgdGhlIGZvcm1hdCB1bml0OwotYW5kIHRoZSBlbnRyeSBpbiBbc3F1YXJlXSBicmFja2V0cyBpcyB0aGUgdHlwZSBvZiB0aGUgQyB2YXJpYWJsZShzKQotd2hvc2UgYWRkcmVzcyBzaG91bGQgYmUgcGFzc2VkLgotCi1cYmVnaW57ZGVzY3JpcHRpb259Ci0gIFxpdGVtW1xzYW1we3N9IChzdHJpbmcgb3IgVW5pY29kZSBvYmplY3QpIHtbY29uc3QgY2hhciAqXX1dCi0gIENvbnZlcnQgYSBQeXRob24gc3RyaW5nIG9yIFVuaWNvZGUgb2JqZWN0IHRvIGEgQyBwb2ludGVyIHRvIGEKLSAgY2hhcmFjdGVyIHN0cmluZy4gIFlvdSBtdXN0IG5vdCBwcm92aWRlIHN0b3JhZ2UgZm9yIHRoZSBzdHJpbmcKLSAgaXRzZWxmOyBhIHBvaW50ZXIgdG8gYW4gZXhpc3Rpbmcgc3RyaW5nIGlzIHN0b3JlZCBpbnRvIHRoZSBjaGFyYWN0ZXIKLSAgcG9pbnRlciB2YXJpYWJsZSB3aG9zZSBhZGRyZXNzIHlvdSBwYXNzLiAgVGhlIEMgc3RyaW5nIGlzCi0gIE5VTC10ZXJtaW5hdGVkLiAgVGhlIFB5dGhvbiBzdHJpbmcgbXVzdCBub3QgY29udGFpbiBlbWJlZGRlZCBOVUwKLSAgYnl0ZXM7IGlmIGl0IGRvZXMsIGEgXGV4Y2VwdGlvbntUeXBlRXJyb3J9IGV4Y2VwdGlvbiBpcyByYWlzZWQuCi0gIFVuaWNvZGUgb2JqZWN0cyBhcmUgY29udmVydGVkIHRvIEMgc3RyaW5ncyB1c2luZyB0aGUgZGVmYXVsdAotICBlbmNvZGluZy4gIElmIHRoaXMgY29udmVyc2lvbiBmYWlscywgYSBcZXhjZXB0aW9ue1VuaWNvZGVFcnJvcn0gaXMKLSAgcmFpc2VkLgotCi0gIFxpdGVtW1xzYW1we3NcI30gKHN0cmluZywgVW5pY29kZSBvciBhbnkgcmVhZCBidWZmZXIgY29tcGF0aWJsZSBvYmplY3QpCi0gIHtbY29uc3QgY2hhciAqLCBpbnRdfV0KLSAgVGhpcyB2YXJpYW50IG9uIFxzYW1we3N9IHN0b3JlcyBpbnRvIHR3byBDIHZhcmlhYmxlcywgdGhlIGZpcnN0IG9uZQotICBhIHBvaW50ZXIgdG8gYSBjaGFyYWN0ZXIgc3RyaW5nLCB0aGUgc2Vjb25kIG9uZSBpdHMgbGVuZ3RoLiAgSW4gdGhpcwotICBjYXNlIHRoZSBQeXRob24gc3RyaW5nIG1heSBjb250YWluIGVtYmVkZGVkIG51bGwgYnl0ZXMuICBVbmljb2RlCi0gIG9iamVjdHMgcGFzcyBiYWNrIGEgcG9pbnRlciB0byB0aGUgZGVmYXVsdCBlbmNvZGVkIHN0cmluZyB2ZXJzaW9uIG9mCi0gIHRoZSBvYmplY3QgaWYgc3VjaCBhIGNvbnZlcnNpb24gaXMgcG9zc2libGUuICBBbGwgb3RoZXIgcmVhZC1idWZmZXIKLSAgY29tcGF0aWJsZSBvYmplY3RzIHBhc3MgYmFjayBhIHJlZmVyZW5jZSB0byB0aGUgcmF3IGludGVybmFsIGRhdGEKLSAgcmVwcmVzZW50YXRpb24uCi0KLSAgXGl0ZW1bXHNhbXB7eX0gKGJ5dGVzIG9iamVjdCkKLSAge1tjb25zdCBjaGFyICpdfV0KLSAgVGhpcyB2YXJpYW50IG9uIFxzYW1we3N9IGNvbnZlcnQgYSBQeXRob24gYnl0ZXMgb2JqZWN0IHRvIGEgQyBwb2ludGVyIHRvIGEKLSAgY2hhcmFjdGVyIHN0cmluZy4gVGhlIGJ5dGVzIG9iamVjdCBtdXN0IG5vdCBjb250YWluIGVtYmVkZGVkIE5VTCBieXRlczsKLSAgaWYgaXQgZG9lcywgYSBcZXhjZXB0aW9ue1R5cGVFcnJvcn0gZXhjZXB0aW9uIGlzIHJhaXNlZC4KLQotICBcaXRlbVtcc2FtcHt5XCN9IChieXRlcyBvYmplY3QpCi0gIHtbY29uc3QgY2hhciAqLCBpbnRdfV0KLSAgVGhpcyB2YXJpYW50IG9uIFxzYW1we3NcI30gc3RvcmVzIGludG8gdHdvIEMgdmFyaWFibGVzLCB0aGUgZmlyc3Qgb25lCi0gIGEgcG9pbnRlciB0byBhIGNoYXJhY3RlciBzdHJpbmcsIHRoZSBzZWNvbmQgb25lIGl0cyBsZW5ndGguICBUaGlzIG9ubHkKLSAgYWNjZXB0cyBieXRlcyBvYmplY3RzLgotCi0gIFxpdGVtW1xzYW1we3p9IChzdHJpbmcgb3IgXGNvZGV7Tm9uZX0pIHtbY29uc3QgY2hhciAqXX1dCi0gIExpa2UgXHNhbXB7c30sIGJ1dCB0aGUgUHl0aG9uIG9iamVjdCBtYXkgYWxzbyBiZSBcY29kZXtOb25lfSwgaW4KLSAgd2hpY2ggY2FzZSB0aGUgQyBwb2ludGVyIGlzIHNldCB0byBcTlVMTC4KLQotICBcaXRlbVtcc2FtcHt6XCN9IChzdHJpbmcgb3IgXGNvZGV7Tm9uZX0gb3IgYW55IHJlYWQgYnVmZmVyCi0gIGNvbXBhdGlibGUgb2JqZWN0KSB7W2NvbnN0IGNoYXIgKiwgaW50XX1dCi0gIFRoaXMgaXMgdG8gXHNhbXB7c1wjfSBhcyBcc2FtcHt6fSBpcyB0byBcc2FtcHtzfS4KLQotICBcaXRlbVtcc2FtcHt1fSAoVW5pY29kZSBvYmplY3QpIHtbUHlfVU5JQ09ERSAqXX1dCi0gIENvbnZlcnQgYSBQeXRob24gVW5pY29kZSBvYmplY3QgdG8gYSBDIHBvaW50ZXIgdG8gYSBOVUwtdGVybWluYXRlZAotICBidWZmZXIgb2YgMTYtYml0IFVuaWNvZGUgKFVURi0xNikgZGF0YS4gIEFzIHdpdGggXHNhbXB7c30sIHRoZXJlIGlzCi0gIG5vIG5lZWQgdG8gcHJvdmlkZSBzdG9yYWdlIGZvciB0aGUgVW5pY29kZSBkYXRhIGJ1ZmZlcjsgYSBwb2ludGVyIHRvCi0gIHRoZSBleGlzdGluZyBVbmljb2RlIGRhdGEgaXMgc3RvcmVkIGludG8gdGhlIFxjdHlwZXtQeV9VTklDT0RFfQotICBwb2ludGVyIHZhcmlhYmxlIHdob3NlIGFkZHJlc3MgeW91IHBhc3MuCi0KLSAgXGl0ZW1bXHNhbXB7dVwjfSAoVW5pY29kZSBvYmplY3QpIHtbUHlfVU5JQ09ERSAqLCBpbnRdfV0KLSAgVGhpcyB2YXJpYW50IG9uIFxzYW1we3V9IHN0b3JlcyBpbnRvIHR3byBDIHZhcmlhYmxlcywgdGhlIGZpcnN0IG9uZQotICBhIHBvaW50ZXIgdG8gYSBVbmljb2RlIGRhdGEgYnVmZmVyLCB0aGUgc2Vjb25kIG9uZSBpdHMgbGVuZ3RoLgotICBOb24tVW5pY29kZSBvYmplY3RzIGFyZSBoYW5kbGVkIGJ5IGludGVycHJldGluZyB0aGVpciByZWFkLWJ1ZmZlcgotICBwb2ludGVyIGFzIHBvaW50ZXIgdG8gYSBcY3R5cGV7UHlfVU5JQ09ERX0gYXJyYXkuCi0KLSAgXGl0ZW1bXHNhbXB7ZXN9IChzdHJpbmcsIFVuaWNvZGUgb2JqZWN0IG9yIGNoYXJhY3RlciBidWZmZXIKLSAgY29tcGF0aWJsZSBvYmplY3QpIHtbY29uc3QgY2hhciAqZW5jb2RpbmcsIGNoYXIgKipidWZmZXJdfV0KLSAgVGhpcyB2YXJpYW50IG9uIFxzYW1we3N9IGlzIHVzZWQgZm9yIGVuY29kaW5nIFVuaWNvZGUgYW5kIG9iamVjdHMKLSAgY29udmVydGlibGUgdG8gVW5pY29kZSBpbnRvIGEgY2hhcmFjdGVyIGJ1ZmZlci4gSXQgb25seSB3b3JrcyBmb3IKLSAgZW5jb2RlZCBkYXRhIHdpdGhvdXQgZW1iZWRkZWQgTlVMIGJ5dGVzLgotCi0gIFRoaXMgZm9ybWF0IHJlcXVpcmVzIHR3byBhcmd1bWVudHMuICBUaGUgZmlyc3QgaXMgb25seSB1c2VkIGFzCi0gIGlucHV0LCBhbmQgbXVzdCBiZSBhIFxjdHlwZXtjb25zdCBjaGFyKn0gd2hpY2ggcG9pbnRzIHRvIHRoZSBuYW1lIG9mIGFuCi0gIGVuY29kaW5nIGFzIGEgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nLCBvciBcTlVMTCwgaW4gd2hpY2ggY2FzZSB0aGUKLSAgZGVmYXVsdCBlbmNvZGluZyBpcyB1c2VkLiAgQW4gZXhjZXB0aW9uIGlzIHJhaXNlZCBpZiB0aGUgbmFtZWQKLSAgZW5jb2RpbmcgaXMgbm90IGtub3duIHRvIFB5dGhvbi4gIFRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhCi0gIFxjdHlwZXtjaGFyKip9OyB0aGUgdmFsdWUgb2YgdGhlIHBvaW50ZXIgaXQgcmVmZXJlbmNlcyB3aWxsIGJlIHNldAotICB0byBhIGJ1ZmZlciB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgYXJndW1lbnQgdGV4dC4gIFRoZSB0ZXh0IHdpbGwKLSAgYmUgZW5jb2RlZCBpbiB0aGUgZW5jb2Rpbmcgc3BlY2lmaWVkIGJ5IHRoZSBmaXJzdCBhcmd1bWVudC4KLQotICBcY2Z1bmN0aW9ue1B5QXJnX1BhcnNlVHVwbGUoKX0gd2lsbCBhbGxvY2F0ZSBhIGJ1ZmZlciBvZiB0aGUgbmVlZGVkCi0gIHNpemUsIGNvcHkgdGhlIGVuY29kZWQgZGF0YSBpbnRvIHRoaXMgYnVmZmVyIGFuZCBhZGp1c3QKLSAgXHZhcnsqYnVmZmVyfSB0byByZWZlcmVuY2UgdGhlIG5ld2x5IGFsbG9jYXRlZCBzdG9yYWdlLiAgVGhlIGNhbGxlcgotICBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyBcY2Z1bmN0aW9ue1B5TWVtX0ZyZWUoKX0gdG8gZnJlZSB0aGUKLSAgYWxsb2NhdGVkIGJ1ZmZlciBhZnRlciB1c2UuCi0KLSAgXGl0ZW1bXHNhbXB7ZXR9IChzdHJpbmcsIFVuaWNvZGUgb2JqZWN0IG9yIGNoYXJhY3RlciBidWZmZXIKLSAgY29tcGF0aWJsZSBvYmplY3QpIHtbY29uc3QgY2hhciAqZW5jb2RpbmcsIGNoYXIgKipidWZmZXJdfV0KLSAgU2FtZSBhcyBcc2FtcHtlc30gZXhjZXB0IHRoYXQgOC1iaXQgc3RyaW5nIG9iamVjdHMgYXJlIHBhc3NlZAotICB0aHJvdWdoIHdpdGhvdXQgcmVjb2RpbmcgdGhlbS4gIEluc3RlYWQsIHRoZSBpbXBsZW1lbnRhdGlvbiBhc3N1bWVzCi0gIHRoYXQgdGhlIHN0cmluZyBvYmplY3QgdXNlcyB0aGUgZW5jb2RpbmcgcGFzc2VkIGluIGFzIHBhcmFtZXRlci4KLQotICBcaXRlbVtcc2FtcHtlc1wjfSAoc3RyaW5nLCBVbmljb2RlIG9iamVjdCBvciBjaGFyYWN0ZXIgYnVmZmVyIGNvbXBhdGlibGUKLSAgb2JqZWN0KSB7W2NvbnN0IGNoYXIgKmVuY29kaW5nLCBjaGFyICoqYnVmZmVyLCBpbnQgKmJ1ZmZlcl9sZW5ndGhdfV0KLSAgVGhpcyB2YXJpYW50IG9uIFxzYW1we3NcI30gaXMgdXNlZCBmb3IgZW5jb2RpbmcgVW5pY29kZSBhbmQgb2JqZWN0cwotICBjb252ZXJ0aWJsZSB0byBVbmljb2RlIGludG8gYSBjaGFyYWN0ZXIgYnVmZmVyLiAgVW5saWtlIHRoZQotICBcc2FtcHtlc30gZm9ybWF0LCB0aGlzIHZhcmlhbnQgYWxsb3dzIGlucHV0IGRhdGEgd2hpY2ggY29udGFpbnMgTlVMCi0gIGNoYXJhY3RlcnMuCi0KLSAgSXQgcmVxdWlyZXMgdGhyZWUgYXJndW1lbnRzLiAgVGhlIGZpcnN0IGlzIG9ubHkgdXNlZCBhcyBpbnB1dCwgYW5kCi0gIG11c3QgYmUgYSBcY3R5cGV7Y29uc3QgY2hhcip9IHdoaWNoIHBvaW50cyB0byB0aGUgbmFtZSBvZiBhbiBlbmNvZGluZyBhcyBhCi0gIE5VTC10ZXJtaW5hdGVkIHN0cmluZywgb3IgXE5VTEwsIGluIHdoaWNoIGNhc2UgdGhlIGRlZmF1bHQgZW5jb2RpbmcKLSAgaXMgdXNlZC4gIEFuIGV4Y2VwdGlvbiBpcyByYWlzZWQgaWYgdGhlIG5hbWVkIGVuY29kaW5nIGlzIG5vdCBrbm93bgotICB0byBQeXRob24uICBUaGUgc2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgYSBcY3R5cGV7Y2hhcioqfTsgdGhlIHZhbHVlCi0gIG9mIHRoZSBwb2ludGVyIGl0IHJlZmVyZW5jZXMgd2lsbCBiZSBzZXQgdG8gYSBidWZmZXIgd2l0aCB0aGUKLSAgY29udGVudHMgb2YgdGhlIGFyZ3VtZW50IHRleHQuICBUaGUgdGV4dCB3aWxsIGJlIGVuY29kZWQgaW4gdGhlCi0gIGVuY29kaW5nIHNwZWNpZmllZCBieSB0aGUgZmlyc3QgYXJndW1lbnQuICBUaGUgdGhpcmQgYXJndW1lbnQgbXVzdAotICBiZSBhIHBvaW50ZXIgdG8gYW4gaW50ZWdlcjsgdGhlIHJlZmVyZW5jZWQgaW50ZWdlciB3aWxsIGJlIHNldCB0bwotICB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBvdXRwdXQgYnVmZmVyLgotCi0gIFRoZXJlIGFyZSB0d28gbW9kZXMgb2Ygb3BlcmF0aW9uOgotCi0gIElmIFx2YXJ7KmJ1ZmZlcn0gcG9pbnRzIGEgXE5VTEx7fSBwb2ludGVyLCB0aGUgZnVuY3Rpb24gd2lsbAotICBhbGxvY2F0ZSBhIGJ1ZmZlciBvZiB0aGUgbmVlZGVkIHNpemUsIGNvcHkgdGhlIGVuY29kZWQgZGF0YSBpbnRvCi0gIHRoaXMgYnVmZmVyIGFuZCBzZXQgXHZhcnsqYnVmZmVyfSB0byByZWZlcmVuY2UgdGhlIG5ld2x5IGFsbG9jYXRlZAotICBzdG9yYWdlLiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZwotICBcY2Z1bmN0aW9ue1B5TWVtX0ZyZWUoKX0gdG8gZnJlZSB0aGUgYWxsb2NhdGVkIGJ1ZmZlciBhZnRlciB1c2FnZS4KLQotICBJZiBcdmFyeypidWZmZXJ9IHBvaW50cyB0byBhIG5vbi1cTlVMTHt9IHBvaW50ZXIgKGFuIGFscmVhZHkKLSAgYWxsb2NhdGVkIGJ1ZmZlciksIFxjZnVuY3Rpb257UHlBcmdfUGFyc2VUdXBsZSgpfSB3aWxsIHVzZSB0aGlzCi0gIGxvY2F0aW9uIGFzIHRoZSBidWZmZXIgYW5kIGludGVycHJldCB0aGUgaW5pdGlhbCB2YWx1ZSBvZgotICBcdmFyeypidWZmZXJfbGVuZ3RofSBhcyB0aGUgYnVmZmVyIHNpemUuICBJdCB3aWxsIHRoZW4gY29weSB0aGUKLSAgZW5jb2RlZCBkYXRhIGludG8gdGhlIGJ1ZmZlciBhbmQgTlVMLXRlcm1pbmF0ZSBpdC4gIElmIHRoZSBidWZmZXIKLSAgaXMgbm90IGxhcmdlIGVub3VnaCwgYSBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IHdpbGwgYmUgc2V0LgotCi0gIEluIGJvdGggY2FzZXMsIFx2YXJ7KmJ1ZmZlcl9sZW5ndGh9IGlzIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZQotICBlbmNvZGVkIGRhdGEgd2l0aG91dCB0aGUgdHJhaWxpbmcgTlVMIGJ5dGUuCi0KLSAgXGl0ZW1bXHNhbXB7ZXRcI30gKHN0cmluZywgVW5pY29kZSBvYmplY3Qgb3IgY2hhcmFjdGVyIGJ1ZmZlciBjb21wYXRpYmxlCi0gIG9iamVjdCkge1tjb25zdCBjaGFyICplbmNvZGluZywgY2hhciAqKmJ1ZmZlcl19XQotICBTYW1lIGFzIFxzYW1we2VzXCN9IGV4Y2VwdCB0aGF0IHN0cmluZyBvYmplY3RzIGFyZSBwYXNzZWQgdGhyb3VnaAotICB3aXRob3V0IHJlY29kaW5nIHRoZW0uIEluc3RlYWQsIHRoZSBpbXBsZW1lbnRhdGlvbiBhc3N1bWVzIHRoYXQgdGhlCi0gIHN0cmluZyBvYmplY3QgdXNlcyB0aGUgZW5jb2RpbmcgcGFzc2VkIGluIGFzIHBhcmFtZXRlci4KLQotICBcaXRlbVtcc2FtcHtifSAoaW50ZWdlcikge1tjaGFyXX1dCi0gIENvbnZlcnQgYSBQeXRob24gaW50ZWdlciB0byBhIHRpbnkgaW50LCBzdG9yZWQgaW4gYSBDIFxjdHlwZXtjaGFyfS4KLQotICBcaXRlbVtcc2FtcHtCfSAoaW50ZWdlcikge1t1bnNpZ25lZCBjaGFyXX1dCi0gIENvbnZlcnQgYSBQeXRob24gaW50ZWdlciB0byBhIHRpbnkgaW50IHdpdGhvdXQgb3ZlcmZsb3cgY2hlY2tpbmcsCi0gIHN0b3JlZCBpbiBhIEMgXGN0eXBle3Vuc2lnbmVkIGNoYXJ9LiBcdmVyc2lvbmFkZGVkezIuM30KLQotICBcaXRlbVtcc2FtcHtofSAoaW50ZWdlcikge1tzaG9ydCBpbnRdfV0KLSAgQ29udmVydCBhIFB5dGhvbiBpbnRlZ2VyIHRvIGEgQyBcY3R5cGV7c2hvcnQgaW50fS4KLQotICBcaXRlbVtcc2FtcHtIfSAoaW50ZWdlcikge1t1bnNpZ25lZCBzaG9ydCBpbnRdfV0KLSAgQ29udmVydCBhIFB5dGhvbiBpbnRlZ2VyIHRvIGEgQyBcY3R5cGV7dW5zaWduZWQgc2hvcnQgaW50fSwgd2l0aG91dAotICBvdmVyZmxvdyBjaGVja2luZy4gIFx2ZXJzaW9uYWRkZWR7Mi4zfQotCi0gIFxpdGVtW1xzYW1we2l9IChpbnRlZ2VyKSB7W2ludF19XQotICBDb252ZXJ0IGEgUHl0aG9uIGludGVnZXIgdG8gYSBwbGFpbiBDIFxjdHlwZXtpbnR9LgotCi0gIFxpdGVtW1xzYW1we0l9IChpbnRlZ2VyKSB7W3Vuc2lnbmVkIGludF19XQotICBDb252ZXJ0IGEgUHl0aG9uIGludGVnZXIgdG8gYSBDIFxjdHlwZXt1bnNpZ25lZCBpbnR9LCB3aXRob3V0Ci0gIG92ZXJmbG93IGNoZWNraW5nLiAgXHZlcnNpb25hZGRlZHsyLjN9Ci0KLSAgXGl0ZW1bXHNhbXB7bH0gKGludGVnZXIpIHtbbG9uZyBpbnRdfV0KLSAgQ29udmVydCBhIFB5dGhvbiBpbnRlZ2VyIHRvIGEgQyBcY3R5cGV7bG9uZyBpbnR9LgotCi0gIFxpdGVtW1xzYW1we2t9IChpbnRlZ2VyKSB7W3Vuc2lnbmVkIGxvbmddfV0KLSAgQ29udmVydCBhIFB5dGhvbiBpbnRlZ2VyIG9yIGxvbmcgaW50ZWdlciB0byBhIEMgXGN0eXBle3Vuc2lnbmVkIGxvbmd9IHdpdGhvdXQKLSAgb3ZlcmZsb3cgY2hlY2tpbmcuICBcdmVyc2lvbmFkZGVkezIuM30KLQotICBcaXRlbVtcc2FtcHtMfSAoaW50ZWdlcikge1tQWV9MT05HX0xPTkddfV0KLSAgQ29udmVydCBhIFB5dGhvbiBpbnRlZ2VyIHRvIGEgQyBcY3R5cGV7bG9uZyBsb25nfS4gIFRoaXMgZm9ybWF0IGlzCi0gIG9ubHkgYXZhaWxhYmxlIG9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgXGN0eXBle2xvbmcgbG9uZ30gKG9yCi0gIFxjdHlwZXtfaW50NjR9IG9uIFdpbmRvd3MpLgotCi0gIFxpdGVtW1xzYW1we0t9IChpbnRlZ2VyKSB7W3Vuc2lnbmVkIFBZX0xPTkdfTE9OR119XQotICBDb252ZXJ0IGEgUHl0aG9uIGludGVnZXIgb3IgbG9uZyBpbnRlZ2VyIHRvIGEgQyBcY3R5cGV7dW5zaWduZWQgbG9uZyBsb25nfQotICB3aXRob3V0IG92ZXJmbG93IGNoZWNraW5nLiAgVGhpcyBmb3JtYXQgaXMgb25seSBhdmFpbGFibGUgb24KLSAgcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCBcY3R5cGV7dW5zaWduZWQgbG9uZyBsb25nfSAob3IKLSAgXGN0eXBle3Vuc2lnbmVkIF9pbnQ2NH0gb24gV2luZG93cykuICBcdmVyc2lvbmFkZGVkezIuM30KLQotICBcaXRlbVtcc2FtcHtufSAoaW50ZWdlcikge1tQeV9zc2l6ZV90XX1dCi0gIENvbnZlcnQgYSBQeXRob24gaW50ZWdlciBvciBsb25nIGludGVnZXIgdG8gYSBDIFxjdHlwZXtQeV9zc2l6ZV90fS4KLSAgXHZlcnNpb25hZGRlZHsyLjV9Ci0KLSAgXGl0ZW1bXHNhbXB7Y30gKHN0cmluZyBvZiBsZW5ndGggMSkge1tjaGFyXX1dCi0gIENvbnZlcnQgYSBQeXRob24gY2hhcmFjdGVyLCByZXByZXNlbnRlZCBhcyBhIHN0cmluZyBvZiBsZW5ndGggMSwgdG8KLSAgYSBDIFxjdHlwZXtjaGFyfS4KLQotICBcaXRlbVtcc2FtcHtmfSAoZmxvYXQpIHtbZmxvYXRdfV0KLSAgQ29udmVydCBhIFB5dGhvbiBmbG9hdGluZyBwb2ludCBudW1iZXIgdG8gYSBDIFxjdHlwZXtmbG9hdH0uCi0KLSAgXGl0ZW1bXHNhbXB7ZH0gKGZsb2F0KSB7W2RvdWJsZV19XQotICBDb252ZXJ0IGEgUHl0aG9uIGZsb2F0aW5nIHBvaW50IG51bWJlciB0byBhIEMgXGN0eXBle2RvdWJsZX0uCi0KLSAgXGl0ZW1bXHNhbXB7RH0gKGNvbXBsZXgpIHtbUHlfY29tcGxleF19XQotICBDb252ZXJ0IGEgUHl0aG9uIGNvbXBsZXggbnVtYmVyIHRvIGEgQyBcY3R5cGV7UHlfY29tcGxleH0gc3RydWN0dXJlLgotCi0gIFxpdGVtW1xzYW1we099IChvYmplY3QpIHtbUHlPYmplY3QgKl19XQotICBTdG9yZSBhIFB5dGhvbiBvYmplY3QgKHdpdGhvdXQgYW55IGNvbnZlcnNpb24pIGluIGEgQyBvYmplY3QKLSAgcG9pbnRlci4gIFRoZSBDIHByb2dyYW0gdGh1cyByZWNlaXZlcyB0aGUgYWN0dWFsIG9iamVjdCB0aGF0IHdhcwotICBwYXNzZWQuICBUaGUgb2JqZWN0J3MgcmVmZXJlbmNlIGNvdW50IGlzIG5vdCBpbmNyZWFzZWQuICBUaGUgcG9pbnRlcgotICBzdG9yZWQgaXMgbm90IFxOVUxMLgotCi0gIFxpdGVtW1xzYW1we08hfSAob2JqZWN0KSB7W1x2YXJ7dHlwZW9iamVjdH0sIFB5T2JqZWN0ICpdfV0KLSAgU3RvcmUgYSBQeXRob24gb2JqZWN0IGluIGEgQyBvYmplY3QgcG9pbnRlci4gIFRoaXMgaXMgc2ltaWxhciB0bwotICBcc2FtcHtPfSwgYnV0IHRha2VzIHR3byBDIGFyZ3VtZW50czogdGhlIGZpcnN0IGlzIHRoZSBhZGRyZXNzIG9mIGEKLSAgUHl0aG9uIHR5cGUgb2JqZWN0LCB0aGUgc2Vjb25kIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBDIHZhcmlhYmxlIChvZgotICB0eXBlIFxjdHlwZXtQeU9iamVjdCp9KSBpbnRvIHdoaWNoIHRoZSBvYmplY3QgcG9pbnRlciBpcyBzdG9yZWQuICBJZgotICB0aGUgUHl0aG9uIG9iamVjdCBkb2VzIG5vdCBoYXZlIHRoZSByZXF1aXJlZCB0eXBlLAotICBcZXhjZXB0aW9ue1R5cGVFcnJvcn0gaXMgcmFpc2VkLgotCi0gIFxpdGVtW1xzYW1we09cJn0gKG9iamVjdCkge1tcdmFye2NvbnZlcnRlcn0sIFx2YXJ7YW55dGhpbmd9XX1dCi0gIENvbnZlcnQgYSBQeXRob24gb2JqZWN0IHRvIGEgQyB2YXJpYWJsZSB0aHJvdWdoIGEgXHZhcntjb252ZXJ0ZXJ9Ci0gIGZ1bmN0aW9uLiAgVGhpcyB0YWtlcyB0d28gYXJndW1lbnRzOiB0aGUgZmlyc3QgaXMgYSBmdW5jdGlvbiwgdGhlCi0gIHNlY29uZCBpcyB0aGUgYWRkcmVzcyBvZiBhIEMgdmFyaWFibGUgKG9mIGFyYml0cmFyeSB0eXBlKSwgY29udmVydGVkCi0gIHRvIFxjdHlwZXt2b2lkICp9LiAgVGhlIFx2YXJ7Y29udmVydGVyfSBmdW5jdGlvbiBpbiB0dXJuIGlzIGNhbGxlZAotICBhcyBmb2xsb3dzOgotCi0gIFx2YXJ7c3RhdHVzfVxjb2RleyA9IH1cdmFye2NvbnZlcnRlcn1cY29kZXsofVx2YXJ7b2JqZWN0fSwKLSAgXHZhcnthZGRyZXNzfVxjb2Rleyk7fQotCi0gIHdoZXJlIFx2YXJ7b2JqZWN0fSBpcyB0aGUgUHl0aG9uIG9iamVjdCB0byBiZSBjb252ZXJ0ZWQgYW5kCi0gIFx2YXJ7YWRkcmVzc30gaXMgdGhlIFxjdHlwZXt2b2lkKn0gYXJndW1lbnQgdGhhdCB3YXMgcGFzc2VkIHRvIHRoZQotICBcY2Z1bmN0aW9ue1B5QXJnX1BhcnNlKigpfSBmdW5jdGlvbi4gIFRoZSByZXR1cm5lZCBcdmFye3N0YXR1c30KLSAgc2hvdWxkIGJlIFxjb2RlezF9IGZvciBhIHN1Y2Nlc3NmdWwgY29udmVyc2lvbiBhbmQgXGNvZGV7MH0gaWYgdGhlCi0gIGNvbnZlcnNpb24gaGFzIGZhaWxlZC4gIFdoZW4gdGhlIGNvbnZlcnNpb24gZmFpbHMsIHRoZQotICBcdmFye2NvbnZlcnRlcn0gZnVuY3Rpb24gc2hvdWxkIHJhaXNlIGFuIGV4Y2VwdGlvbi4KLQotICBcaXRlbVtcc2FtcHtTfSAoc3RyaW5nKSB7W1B5U3RyaW5nT2JqZWN0ICpdfV0KLSAgTGlrZSBcc2FtcHtPfSBidXQgcmVxdWlyZXMgdGhhdCB0aGUgUHl0aG9uIG9iamVjdCBpcyBhIHN0cmluZwotICBvYmplY3QuICBSYWlzZXMgXGV4Y2VwdGlvbntUeXBlRXJyb3J9IGlmIHRoZSBvYmplY3QgaXMgbm90IGEgc3RyaW5nCi0gIG9iamVjdC4gIFRoZSBDIHZhcmlhYmxlIG1heSBhbHNvIGJlIGRlY2xhcmVkIGFzIFxjdHlwZXtQeU9iamVjdCp9LgotCi0gIFxpdGVtW1xzYW1we1V9IChVbmljb2RlIHN0cmluZykge1tQeVVuaWNvZGVPYmplY3QgKl19XQotICBMaWtlIFxzYW1we099IGJ1dCByZXF1aXJlcyB0aGF0IHRoZSBQeXRob24gb2JqZWN0IGlzIGEgVW5pY29kZQotICBvYmplY3QuICBSYWlzZXMgXGV4Y2VwdGlvbntUeXBlRXJyb3J9IGlmIHRoZSBvYmplY3QgaXMgbm90IGEgVW5pY29kZQotICBvYmplY3QuICBUaGUgQyB2YXJpYWJsZSBtYXkgYWxzbyBiZSBkZWNsYXJlZCBhcyBcY3R5cGV7UHlPYmplY3QqfS4KLQotICBcaXRlbVtcc2FtcHt0XCN9IChyZWFkLW9ubHkgY2hhcmFjdGVyIGJ1ZmZlcikge1tjaGFyICosIGludF19XQotICBMaWtlIFxzYW1we3NcI30sIGJ1dCBhY2NlcHRzIGFueSBvYmplY3Qgd2hpY2ggaW1wbGVtZW50cyB0aGUKLSAgcmVhZC1vbmx5IGJ1ZmZlciBpbnRlcmZhY2UuICBUaGUgXGN0eXBle2NoYXIqfSB2YXJpYWJsZSBpcyBzZXQgdG8KLSAgcG9pbnQgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGJ1ZmZlciwgYW5kIHRoZSBcY3R5cGV7aW50fSBpcyBzZXQgdG8KLSAgdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyLiAgT25seSBzaW5nbGUtc2VnbWVudCBidWZmZXIgb2JqZWN0cyBhcmUKLSAgYWNjZXB0ZWQ7IFxleGNlcHRpb257VHlwZUVycm9yfSBpcyByYWlzZWQgZm9yIGFsbCBvdGhlcnMuCi0KLSAgXGl0ZW1bXHNhbXB7d30gKHJlYWQtd3JpdGUgY2hhcmFjdGVyIGJ1ZmZlcikge1tjaGFyICpdfV0KLSAgU2ltaWxhciB0byBcc2FtcHtzfSwgYnV0IGFjY2VwdHMgYW55IG9iamVjdCB3aGljaCBpbXBsZW1lbnRzIHRoZQotICByZWFkLXdyaXRlIGJ1ZmZlciBpbnRlcmZhY2UuICBUaGUgY2FsbGVyIG11c3QgZGV0ZXJtaW5lIHRoZSBsZW5ndGgKLSAgb2YgdGhlIGJ1ZmZlciBieSBvdGhlciBtZWFucywgb3IgdXNlIFxzYW1we3dcI30gaW5zdGVhZC4gIE9ubHkKLSAgc2luZ2xlLXNlZ21lbnQgYnVmZmVyIG9iamVjdHMgYXJlIGFjY2VwdGVkOyBcZXhjZXB0aW9ue1R5cGVFcnJvcn0gaXMKLSAgcmFpc2VkIGZvciBhbGwgb3RoZXJzLgotCi0gIFxpdGVtW1xzYW1we3dcI30gKHJlYWQtd3JpdGUgY2hhcmFjdGVyIGJ1ZmZlcikge1tjaGFyICosIGludF19XQotICBMaWtlIFxzYW1we3NcI30sIGJ1dCBhY2NlcHRzIGFueSBvYmplY3Qgd2hpY2ggaW1wbGVtZW50cyB0aGUKLSAgcmVhZC13cml0ZSBidWZmZXIgaW50ZXJmYWNlLiAgVGhlIFxjdHlwZXtjaGFyICp9IHZhcmlhYmxlIGlzIHNldCB0bwotICBwb2ludCB0byB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgYnVmZmVyLCBhbmQgdGhlIFxjdHlwZXtpbnR9IGlzIHNldCB0bwotICB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIuICBPbmx5IHNpbmdsZS1zZWdtZW50IGJ1ZmZlciBvYmplY3RzIGFyZQotICBhY2NlcHRlZDsgXGV4Y2VwdGlvbntUeXBlRXJyb3J9IGlzIHJhaXNlZCBmb3IgYWxsIG90aGVycy4KLQotICBcaXRlbVtcc2FtcHsoXHZhcntpdGVtc30pfSAodHVwbGUpIHtbXHZhcnttYXRjaGluZy1pdGVtc31dfV0KLSAgVGhlIG9iamVjdCBtdXN0IGJlIGEgUHl0aG9uIHNlcXVlbmNlIHdob3NlIGxlbmd0aCBpcyB0aGUgbnVtYmVyIG9mCi0gIGZvcm1hdCB1bml0cyBpbiBcdmFye2l0ZW1zfS4gIFRoZSBDIGFyZ3VtZW50cyBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlCi0gIGluZGl2aWR1YWwgZm9ybWF0IHVuaXRzIGluIFx2YXJ7aXRlbXN9LiAgRm9ybWF0IHVuaXRzIGZvciBzZXF1ZW5jZXMKLSAgbWF5IGJlIG5lc3RlZC4KLQotICBcbm90ZXtQcmlvciB0byBQeXRob24gdmVyc2lvbiAxLjUuMiwgdGhpcyBmb3JtYXQgc3BlY2lmaWVyIG9ubHkKLSAgYWNjZXB0ZWQgYSB0dXBsZSBjb250YWluaW5nIHRoZSBpbmRpdmlkdWFsIHBhcmFtZXRlcnMsIG5vdCBhbgotICBhcmJpdHJhcnkgc2VxdWVuY2UuICBDb2RlIHdoaWNoIHByZXZpb3VzbHkgY2F1c2VkCi0gIFxleGNlcHRpb257VHlwZUVycm9yfSB0byBiZSByYWlzZWQgaGVyZSBtYXkgbm93IHByb2NlZWQgd2l0aG91dCBhbgotICBleGNlcHRpb24uICBUaGlzIGlzIG5vdCBleHBlY3RlZCB0byBiZSBhIHByb2JsZW0gZm9yIGV4aXN0aW5nIGNvZGUufQotXGVuZHtkZXNjcmlwdGlvbn0KLQotSXQgaXMgcG9zc2libGUgdG8gcGFzcyBQeXRob24gbG9uZyBpbnRlZ2VycyB3aGVyZSBpbnRlZ2VycyBhcmUKLXJlcXVlc3RlZDsgaG93ZXZlciBubyBwcm9wZXIgcmFuZ2UgY2hlY2tpbmcgaXMgZG9uZSAtLS0gdGhlIG1vc3QKLXNpZ25pZmljYW50IGJpdHMgYXJlIHNpbGVudGx5IHRydW5jYXRlZCB3aGVuIHRoZSByZWNlaXZpbmcgZmllbGQgaXMKLXRvbyBzbWFsbCB0byByZWNlaXZlIHRoZSB2YWx1ZSAoYWN0dWFsbHksIHRoZSBzZW1hbnRpY3MgYXJlIGluaGVyaXRlZAotZnJvbSBkb3duY2FzdHMgaW4gQyAtLS0geW91ciBtaWxlYWdlIG1heSB2YXJ5KS4KLQotQSBmZXcgb3RoZXIgY2hhcmFjdGVycyBoYXZlIGEgbWVhbmluZyBpbiBhIGZvcm1hdCBzdHJpbmcuICBUaGVzZSBtYXkKLW5vdCBvY2N1ciBpbnNpZGUgbmVzdGVkIHBhcmVudGhlc2VzLiAgVGhleSBhcmU6Ci0KLVxiZWdpbntkZXNjcmlwdGlvbn0KLSAgXGl0ZW1bXHNhbXB7fH1dCi0gIEluZGljYXRlcyB0aGF0IHRoZSByZW1haW5pbmcgYXJndW1lbnRzIGluIHRoZSBQeXRob24gYXJndW1lbnQgbGlzdAotICBhcmUgb3B0aW9uYWwuICBUaGUgQyB2YXJpYWJsZXMgY29ycmVzcG9uZGluZyB0byBvcHRpb25hbCBhcmd1bWVudHMKLSAgc2hvdWxkIGJlIGluaXRpYWxpemVkIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWUgLS0tIHdoZW4gYW4gb3B0aW9uYWwKLSAgYXJndW1lbnQgaXMgbm90IHNwZWNpZmllZCwgXGNmdW5jdGlvbntQeUFyZ19QYXJzZVR1cGxlKCl9IGRvZXMgbm90Ci0gIHRvdWNoIHRoZSBjb250ZW50cyBvZiB0aGUgY29ycmVzcG9uZGluZyBDIHZhcmlhYmxlKHMpLgotCi0gIFxpdGVtW1xzYW1wezp9XQotICBUaGUgbGlzdCBvZiBmb3JtYXQgdW5pdHMgZW5kcyBoZXJlOyB0aGUgc3RyaW5nIGFmdGVyIHRoZSBjb2xvbiBpcwotICB1c2VkIGFzIHRoZSBmdW5jdGlvbiBuYW1lIGluIGVycm9yIG1lc3NhZ2VzICh0aGUgYGBhc3NvY2lhdGVkCi0gIHZhbHVlJycgb2YgdGhlIGV4Y2VwdGlvbiB0aGF0IFxjZnVuY3Rpb257UHlBcmdfUGFyc2VUdXBsZSgpfQotICByYWlzZXMpLgotCi0gIFxpdGVtW1xzYW1wezt9XQotICBUaGUgbGlzdCBvZiBmb3JtYXQgdW5pdHMgZW5kcyBoZXJlOyB0aGUgc3RyaW5nIGFmdGVyIHRoZSBzZW1pY29sb24KLSAgaXMgdXNlZCBhcyB0aGUgZXJyb3IgbWVzc2FnZSBcZW1waHtpbnN0ZWFkfSBvZiB0aGUgZGVmYXVsdCBlcnJvcgotICBtZXNzYWdlLiAgQ2xlYXJseSwgXHNhbXB7On0gYW5kIFxzYW1wezt9IG11dHVhbGx5IGV4Y2x1ZGUgZWFjaAotICBvdGhlci4KLVxlbmR7ZGVzY3JpcHRpb259Ci0KLU5vdGUgdGhhdCBhbnkgUHl0aG9uIG9iamVjdCByZWZlcmVuY2VzIHdoaWNoIGFyZSBwcm92aWRlZCB0byB0aGUKLWNhbGxlciBhcmUgXGVtcGh7Ym9ycm93ZWR9IHJlZmVyZW5jZXM7IGRvIG5vdCBkZWNyZW1lbnQgdGhlaXIKLXJlZmVyZW5jZSBjb3VudCEKLQotQWRkaXRpb25hbCBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZXNlIGZ1bmN0aW9ucyBtdXN0IGJlIGFkZHJlc3NlcyBvZgotdmFyaWFibGVzIHdob3NlIHR5cGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgZm9ybWF0IHN0cmluZzsgdGhlc2UgYXJlCi11c2VkIHRvIHN0b3JlIHZhbHVlcyBmcm9tIHRoZSBpbnB1dCB0dXBsZS4gIFRoZXJlIGFyZSBhIGZldyBjYXNlcywgYXMKLWRlc2NyaWJlZCBpbiB0aGUgbGlzdCBvZiBmb3JtYXQgdW5pdHMgYWJvdmUsIHdoZXJlIHRoZXNlIHBhcmFtZXRlcnMKLWFyZSB1c2VkIGFzIGlucHV0IHZhbHVlczsgdGhleSBzaG91bGQgbWF0Y2ggd2hhdCBpcyBzcGVjaWZpZWQgZm9yIHRoZQotY29ycmVzcG9uZGluZyBmb3JtYXQgdW5pdCBpbiB0aGF0IGNhc2UuCi0KLUZvciB0aGUgY29udmVyc2lvbiB0byBzdWNjZWVkLCB0aGUgXHZhcnthcmd9IG9iamVjdCBtdXN0IG1hdGNoIHRoZQotZm9ybWF0IGFuZCB0aGUgZm9ybWF0IG11c3QgYmUgZXhoYXVzdGVkLiAgT24gc3VjY2VzcywgdGhlCi1cY2Z1bmN0aW9ue1B5QXJnX1BhcnNlKigpfSBmdW5jdGlvbnMgcmV0dXJuIHRydWUsIG90aGVyd2lzZSB0aGV5Ci1yZXR1cm4gZmFsc2UgYW5kIHJhaXNlIGFuIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbi4KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeUFyZ19QYXJzZVR1cGxlfXtQeU9iamVjdCAqYXJncywgY29uc3QgY2hhciAqZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbW9yZWFyZ3N9Ci0gIFBhcnNlIHRoZSBwYXJhbWV0ZXJzIG9mIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBvbmx5IHBvc2l0aW9uYWwKLSAgcGFyYW1ldGVycyBpbnRvIGxvY2FsIHZhcmlhYmxlcy4gIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzOyBvbgotICBmYWlsdXJlLCBpdCByZXR1cm5zIGZhbHNlIGFuZCByYWlzZXMgdGhlIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbi4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5QXJnX1ZhUGFyc2V9e1B5T2JqZWN0ICphcmdzLCBjb25zdCBjaGFyICpmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgdmFyZ3N9Ci0gIElkZW50aWNhbCB0byBcY2Z1bmN0aW9ue1B5QXJnX1BhcnNlVHVwbGUoKX0sIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYQotICB2YV9saXN0IHJhdGhlciB0aGFuIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc317UHlPYmplY3QgKmFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICprdywgY29uc3QgY2hhciAqZm9ybWF0LCBjaGFyICprZXl3b3Jkc1tdLAotICAgICAgICAgICAgICAgICAgICAgICBcbW9yZWFyZ3N9Ci0gIFBhcnNlIHRoZSBwYXJhbWV0ZXJzIG9mIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBib3RoIHBvc2l0aW9uYWwgYW5kCi0gIGtleXdvcmQgcGFyYW1ldGVycyBpbnRvIGxvY2FsIHZhcmlhYmxlcy4gIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzOwotICBvbiBmYWlsdXJlLCBpdCByZXR1cm5zIGZhbHNlIGFuZCByYWlzZXMgdGhlIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbi4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzfXtQeU9iamVjdCAqYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmt3LCBjb25zdCBjaGFyICpmb3JtYXQsIGNoYXIgKmtleXdvcmRzW10sCi0gICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgdmFyZ3N9Ci0gIElkZW50aWNhbCB0byBcY2Z1bmN0aW9ue1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcygpfSwgZXhjZXB0IHRoYXQgaXQKLSAgYWNjZXB0cyBhIHZhX2xpc3QgcmF0aGVyIHRoYW4gYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlBcmdfUGFyc2V9e1B5T2JqZWN0ICphcmdzLCBjb25zdCBjaGFyICpmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbW9yZWFyZ3N9Ci0gIEZ1bmN0aW9uIHVzZWQgdG8gZGVjb25zdHJ1Y3QgdGhlIGFyZ3VtZW50IGxpc3RzIG9mIGBgb2xkLXN0eWxlJycKLSAgZnVuY3Rpb25zIC0tLSB0aGVzZSBhcmUgZnVuY3Rpb25zIHdoaWNoIHVzZSB0aGUKLSAgXGNvbnN0YW50e01FVEhfT0xEQVJHU30gcGFyYW1ldGVyIHBhcnNpbmcgbWV0aG9kLiAgVGhpcyBpcyBub3QKLSAgcmVjb21tZW5kZWQgZm9yIHVzZSBpbiBwYXJhbWV0ZXIgcGFyc2luZyBpbiBuZXcgY29kZSwgYW5kIG1vc3QgY29kZQotICBpbiB0aGUgc3RhbmRhcmQgaW50ZXJwcmV0ZXIgaGFzIGJlZW4gbW9kaWZpZWQgdG8gbm8gbG9uZ2VyIHVzZSB0aGlzCi0gIGZvciB0aGF0IHB1cnBvc2UuICBJdCBkb2VzIHJlbWFpbiBhIGNvbnZlbmllbnQgd2F5IHRvIGRlY29tcG9zZQotICBvdGhlciB0dXBsZXMsIGhvd2V2ZXIsIGFuZCBtYXkgY29udGludWUgdG8gYmUgdXNlZCBmb3IgdGhhdAotICBwdXJwb3NlLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlBcmdfVW5wYWNrVHVwbGV9e1B5T2JqZWN0ICphcmdzLCBjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtaW4sIFB5X3NzaXplX3QgbWF4LCBcbW9yZWFyZ3N9Ci0gIEEgc2ltcGxlciBmb3JtIG9mIHBhcmFtZXRlciByZXRyaWV2YWwgd2hpY2ggZG9lcyBub3QgdXNlIGEgZm9ybWF0Ci0gIHN0cmluZyB0byBzcGVjaWZ5IHRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzLiAgRnVuY3Rpb25zIHdoaWNoIHVzZQotICB0aGlzIG1ldGhvZCB0byByZXRyaWV2ZSB0aGVpciBwYXJhbWV0ZXJzIHNob3VsZCBiZSBkZWNsYXJlZCBhcwotICBcY29uc3RhbnR7TUVUSF9WQVJBUkdTfSBpbiBmdW5jdGlvbiBvciBtZXRob2QgdGFibGVzLiAgVGhlIHR1cGxlCi0gIGNvbnRhaW5pbmcgdGhlIGFjdHVhbCBwYXJhbWV0ZXJzIHNob3VsZCBiZSBwYXNzZWQgYXMgXHZhcnthcmdzfTsgaXQKLSAgbXVzdCBhY3R1YWxseSBiZSBhIHR1cGxlLiAgVGhlIGxlbmd0aCBvZiB0aGUgdHVwbGUgbXVzdCBiZSBhdCBsZWFzdAotICBcdmFye21pbn0gYW5kIG5vIG1vcmUgdGhhbiBcdmFye21heH07IFx2YXJ7bWlufSBhbmQgXHZhcnttYXh9IG1heSBiZQotICBlcXVhbC4gIEFkZGl0aW9uYWwgYXJndW1lbnRzIG11c3QgYmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiwgZWFjaCBvZgotICB3aGljaCBzaG91bGQgYmUgYSBwb2ludGVyIHRvIGEgXGN0eXBle1B5T2JqZWN0Kn0gdmFyaWFibGU7IHRoZXNlCi0gIHdpbGwgYmUgZmlsbGVkIGluIHdpdGggdGhlIHZhbHVlcyBmcm9tIFx2YXJ7YXJnc307IHRoZXkgd2lsbCBjb250YWluCi0gIGJvcnJvd2VkIHJlZmVyZW5jZXMuICBUaGUgdmFyaWFibGVzIHdoaWNoIGNvcnJlc3BvbmQgdG8gb3B0aW9uYWwKLSAgcGFyYW1ldGVycyBub3QgZ2l2ZW4gYnkgXHZhcnthcmdzfSB3aWxsIG5vdCBiZSBmaWxsZWQgaW47IHRoZXNlCi0gIHNob3VsZCBiZSBpbml0aWFsaXplZCBieSB0aGUgY2FsbGVyLgotICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzIGFuZCBmYWxzZSBpZiBcdmFye2FyZ3N9IGlzIG5vdAotICBhIHR1cGxlIG9yIGNvbnRhaW5zIHRoZSB3cm9uZyBudW1iZXIgb2YgZWxlbWVudHM7IGFuIGV4Y2VwdGlvbiB3aWxsCi0gIGJlIHNldCBpZiB0aGVyZSB3YXMgYSBmYWlsdXJlLgotCi0gIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiB0aGUgdXNlIG9mIHRoaXMgZnVuY3Rpb24sIHRha2VuIGZyb20gdGhlCi0gIHNvdXJjZXMgZm9yIHRoZSBcbW9kdWxle193ZWFrcmVmfSBoZWxwZXIgbW9kdWxlIGZvciB3ZWFrIHJlZmVyZW5jZXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXN0YXRpYyBQeU9iamVjdCAqCi13ZWFrcmVmX3JlZihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCi17Ci0gICAgUHlPYmplY3QgKm9iamVjdDsKLSAgICBQeU9iamVjdCAqY2FsbGJhY2sgPSBOVUxMOwotICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwotCi0gICAgaWYgKFB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJyZWYiLCAxLCAyLCAmb2JqZWN0LCAmY2FsbGJhY2spKSB7Ci0gICAgICAgIHJlc3VsdCA9IFB5V2Vha3JlZl9OZXdSZWYob2JqZWN0LCBjYWxsYmFjayk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci1cZW5ke3ZlcmJhdGltfQotCi0gIFRoZSBjYWxsIHRvIFxjZnVuY3Rpb257UHlBcmdfVW5wYWNrVHVwbGUoKX0gaW4gdGhpcyBleGFtcGxlIGlzCi0gIGVudGlyZWx5IGVxdWl2YWxlbnQgdG8gdGhpcyBjYWxsIHRvIFxjZnVuY3Rpb257UHlBcmdfUGFyc2VUdXBsZSgpfToKLQotXGJlZ2lue3ZlcmJhdGltfQotUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPOnJlZiIsICZvYmplY3QsICZjYWxsYmFjaykKLVxlbmR7dmVyYmF0aW19Ci0KLSAgXHZlcnNpb25hZGRlZHsyLjJ9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeV9CdWlsZFZhbHVlfXtjb25zdCBjaGFyICpmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxtb3JlYXJnc30KLSAgQ3JlYXRlIGEgbmV3IHZhbHVlIGJhc2VkIG9uIGEgZm9ybWF0IHN0cmluZyBzaW1pbGFyIHRvIHRob3NlCi0gIGFjY2VwdGVkIGJ5IHRoZSBcY2Z1bmN0aW9ue1B5QXJnX1BhcnNlKigpfSBmYW1pbHkgb2YgZnVuY3Rpb25zIGFuZCBhCi0gIHNlcXVlbmNlIG9mIHZhbHVlcy4gIFJldHVybnMgdGhlIHZhbHVlIG9yIFxOVUxMe30gaW4gdGhlIGNhc2Ugb2YgYW4KLSAgZXJyb3I7IGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNlZCBpZiBcTlVMTHt9IGlzIHJldHVybmVkLgotCi0gIFxjZnVuY3Rpb257UHlfQnVpbGRWYWx1ZSgpfSBkb2VzIG5vdCBhbHdheXMgYnVpbGQgYSB0dXBsZS4gIEl0Ci0gIGJ1aWxkcyBhIHR1cGxlIG9ubHkgaWYgaXRzIGZvcm1hdCBzdHJpbmcgY29udGFpbnMgdHdvIG9yIG1vcmUgZm9ybWF0Ci0gIHVuaXRzLiAgSWYgdGhlIGZvcm1hdCBzdHJpbmcgaXMgZW1wdHksIGl0IHJldHVybnMgXGNvZGV7Tm9uZX07IGlmIGl0Ci0gIGNvbnRhaW5zIGV4YWN0bHkgb25lIGZvcm1hdCB1bml0LCBpdCByZXR1cm5zIHdoYXRldmVyIG9iamVjdCBpcwotICBkZXNjcmliZWQgYnkgdGhhdCBmb3JtYXQgdW5pdC4gIFRvIGZvcmNlIGl0IHRvIHJldHVybiBhIHR1cGxlIG9mCi0gIHNpemUgMCBvciBvbmUsIHBhcmVudGhlc2l6ZSB0aGUgZm9ybWF0IHN0cmluZy4KLQotICBXaGVuIG1lbW9yeSBidWZmZXJzIGFyZSBwYXNzZWQgYXMgcGFyYW1ldGVycyB0byBzdXBwbHkgZGF0YSB0byBidWlsZAotICBvYmplY3RzLCBhcyBmb3IgdGhlIFxzYW1we3N9IGFuZCBcc2FtcHtzXCN9IGZvcm1hdHMsIHRoZSByZXF1aXJlZAotICBkYXRhIGlzIGNvcGllZC4gIEJ1ZmZlcnMgcHJvdmlkZWQgYnkgdGhlIGNhbGxlciBhcmUgbmV2ZXIgcmVmZXJlbmNlZAotICBieSB0aGUgb2JqZWN0cyBjcmVhdGVkIGJ5IFxjZnVuY3Rpb257UHlfQnVpbGRWYWx1ZSgpfS4gIEluIG90aGVyCi0gIHdvcmRzLCBpZiB5b3VyIGNvZGUgaW52b2tlcyBcY2Z1bmN0aW9ue21hbGxvYygpfSBhbmQgcGFzc2VzIHRoZQotICBhbGxvY2F0ZWQgbWVtb3J5IHRvIFxjZnVuY3Rpb257UHlfQnVpbGRWYWx1ZSgpfSwgeW91ciBjb2RlIGlzCi0gIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIFxjZnVuY3Rpb257ZnJlZSgpfSBmb3IgdGhhdCBtZW1vcnkgb25jZQotICBcY2Z1bmN0aW9ue1B5X0J1aWxkVmFsdWUoKX0gcmV0dXJucy4KLQotICBJbiB0aGUgZm9sbG93aW5nIGRlc2NyaXB0aW9uLCB0aGUgcXVvdGVkIGZvcm0gaXMgdGhlIGZvcm1hdCB1bml0OwotICB0aGUgZW50cnkgaW4gKHJvdW5kKSBwYXJlbnRoZXNlcyBpcyB0aGUgUHl0aG9uIG9iamVjdCB0eXBlIHRoYXQgdGhlCi0gIGZvcm1hdCB1bml0IHdpbGwgcmV0dXJuOyBhbmQgdGhlIGVudHJ5IGluIFtzcXVhcmVdIGJyYWNrZXRzIGlzIHRoZQotICB0eXBlIG9mIHRoZSBDIHZhbHVlKHMpIHRvIGJlIHBhc3NlZC4KLQotICBUaGUgY2hhcmFjdGVycyBzcGFjZSwgdGFiLCBjb2xvbiBhbmQgY29tbWEgYXJlIGlnbm9yZWQgaW4gZm9ybWF0Ci0gIHN0cmluZ3MgKGJ1dCBub3Qgd2l0aGluIGZvcm1hdCB1bml0cyBzdWNoIGFzIFxzYW1we3NcI30pLiAgVGhpcyBjYW4KLSAgYmUgdXNlZCB0byBtYWtlIGxvbmcgZm9ybWF0IHN0cmluZ3MgYSB0YWQgbW9yZSByZWFkYWJsZS4KLQotICBcYmVnaW57ZGVzY3JpcHRpb259Ci0gICAgXGl0ZW1bXHNhbXB7c30gKHN0cmluZykge1tjaGFyICpdfV0KLSAgICBDb252ZXJ0IGEgbnVsbC10ZXJtaW5hdGVkIEMgc3RyaW5nIHRvIGEgUHl0aG9uIG9iamVjdC4gIElmIHRoZSBDCi0gICAgc3RyaW5nIHBvaW50ZXIgaXMgXE5VTEwsIFxjb2Rle05vbmV9IGlzIHVzZWQuCi0KLSAgICBcaXRlbVtcc2FtcHtzXCN9IChzdHJpbmcpIHtbY2hhciAqLCBpbnRdfV0KLSAgICBDb252ZXJ0IGEgQyBzdHJpbmcgYW5kIGl0cyBsZW5ndGggdG8gYSBQeXRob24gb2JqZWN0LiAgSWYgdGhlIEMKLSAgICBzdHJpbmcgcG9pbnRlciBpcyBcTlVMTCwgdGhlIGxlbmd0aCBpcyBpZ25vcmVkIGFuZCBcY29kZXtOb25lfSBpcwotICAgIHJldHVybmVkLgotCi0gICAgXGl0ZW1bXHNhbXB7en0gKHN0cmluZyBvciBcY29kZXtOb25lfSkge1tjaGFyICpdfV0KLSAgICBTYW1lIGFzIFxzYW1we3N9LgotCi0gICAgXGl0ZW1bXHNhbXB7elwjfSAoc3RyaW5nIG9yIFxjb2Rle05vbmV9KSB7W2NoYXIgKiwgaW50XX1dCi0gICAgU2FtZSBhcyBcc2FtcHtzXCN9LgotCi0gICAgXGl0ZW1bXHNhbXB7dX0gKFVuaWNvZGUgc3RyaW5nKSB7W1B5X1VOSUNPREUgKl19XQotICAgIENvbnZlcnQgYSBudWxsLXRlcm1pbmF0ZWQgYnVmZmVyIG9mIFVuaWNvZGUgKFVDUy0yIG9yIFVDUy00KQotICAgIGRhdGEgdG8gYSBQeXRob24gVW5pY29kZSBvYmplY3QuICBJZiB0aGUgVW5pY29kZSBidWZmZXIgcG9pbnRlcgotICAgIGlzIFxOVUxMLCBcY29kZXtOb25lfSBpcyByZXR1cm5lZC4KLQotICAgIFxpdGVtW1xzYW1we3VcI30gKFVuaWNvZGUgc3RyaW5nKSB7W1B5X1VOSUNPREUgKiwgaW50XX1dCi0gICAgQ29udmVydCBhIFVuaWNvZGUgKFVDUy0yIG9yIFVDUy00KSBkYXRhIGJ1ZmZlciBhbmQgaXRzIGxlbmd0aAotICAgIHRvIGEgUHl0aG9uIFVuaWNvZGUgb2JqZWN0LiAgIElmIHRoZSBVbmljb2RlIGJ1ZmZlciBwb2ludGVyCi0gICAgaXMgXE5VTEwsIHRoZSBsZW5ndGggaXMgaWdub3JlZCBhbmQgXGNvZGV7Tm9uZX0gaXMgcmV0dXJuZWQuCi0KLSAgICBcaXRlbVtcc2FtcHtVfSAoc3RyaW5nKSB7W2NoYXIgKl19XQotICAgIENvbnZlcnQgYSBudWxsLXRlcm1pbmF0ZWQgQyBzdHJpbmcgdG8gYSBQeXRob24gdW5pY29kZSBvYmplY3QuCi0gICAgSWYgdGhlIEMgc3RyaW5nIHBvaW50ZXIgaXMgXE5VTEwsIFxjb2Rle05vbmV9IGlzIHVzZWQuCi0KLSAgICBcaXRlbVtcc2FtcHtVXCN9IChzdHJpbmcpIHtbY2hhciAqLCBpbnRdfV0KLSAgICBDb252ZXJ0IGEgQyBzdHJpbmcgYW5kIGl0cyBsZW5ndGggdG8gYSBQeXRob24gdW5pY29kZSBvYmplY3QuCi0gICAgSWYgdGhlIEMgc3RyaW5nIHBvaW50ZXIgaXMgXE5VTEwsIHRoZSBsZW5ndGggaXMgaWdub3JlZCBhbmQgXGNvZGV7Tm9uZX0KLSAgICBpcyByZXR1cm5lZC4KLQotICAgIFxpdGVtW1xzYW1we2l9IChpbnRlZ2VyKSB7W2ludF19XQotICAgIENvbnZlcnQgYSBwbGFpbiBDIFxjdHlwZXtpbnR9IHRvIGEgUHl0aG9uIGludGVnZXIgb2JqZWN0LgotCi0gICAgXGl0ZW1bXHNhbXB7Yn0gKGludGVnZXIpIHtbY2hhcl19XQotICAgIENvbnZlcnQgYSBwbGFpbiBDIFxjdHlwZXtjaGFyfSB0byBhIFB5dGhvbiBpbnRlZ2VyIG9iamVjdC4KLQotICAgIFxpdGVtW1xzYW1we2h9IChpbnRlZ2VyKSB7W3Nob3J0IGludF19XQotICAgIENvbnZlcnQgYSBwbGFpbiBDIFxjdHlwZXtzaG9ydCBpbnR9IHRvIGEgUHl0aG9uIGludGVnZXIgb2JqZWN0LgotCi0gICAgXGl0ZW1bXHNhbXB7bH0gKGludGVnZXIpIHtbbG9uZyBpbnRdfV0KLSAgICBDb252ZXJ0IGEgQyBcY3R5cGV7bG9uZyBpbnR9IHRvIGEgUHl0aG9uIGludGVnZXIgb2JqZWN0LgotCi0gICAgXGl0ZW1bXHNhbXB7Qn0gKGludGVnZXIpIHtbdW5zaWduZWQgY2hhcl19XQotICAgIENvbnZlcnQgYSBDIFxjdHlwZXt1bnNpZ25lZCBjaGFyfSB0byBhIFB5dGhvbiBpbnRlZ2VyIG9iamVjdC4KLQotICAgIFxpdGVtW1xzYW1we0h9IChpbnRlZ2VyKSB7W3Vuc2lnbmVkIHNob3J0IGludF19XQotICAgIENvbnZlcnQgYSBDIFxjdHlwZXt1bnNpZ25lZCBzaG9ydCBpbnR9IHRvIGEgUHl0aG9uIGludGVnZXIgb2JqZWN0LgotCi0gICAgXGl0ZW1bXHNhbXB7SX0gKGludGVnZXIvbG9uZykge1t1bnNpZ25lZCBpbnRdfV0KLSAgICBDb252ZXJ0IGEgQyBcY3R5cGV7dW5zaWduZWQgaW50fSB0byBhIFB5dGhvbiBpbnRlZ2VyIG9iamVjdAotICAgIG9yIGEgUHl0aG9uIGxvbmcgaW50ZWdlciBvYmplY3QsIGlmIGl0IGlzIGxhcmdlciB0aGFuIFxjb2Rle3N5cy5tYXhpbnR9LgotCi0gICAgXGl0ZW1bXHNhbXB7a30gKGludGVnZXIvbG9uZykge1t1bnNpZ25lZCBsb25nXX1dCi0gICAgQ29udmVydCBhIEMgXGN0eXBle3Vuc2lnbmVkIGxvbmd9IHRvIGEgUHl0aG9uIGludGVnZXIgb2JqZWN0Ci0gICAgb3IgYSBQeXRob24gbG9uZyBpbnRlZ2VyIG9iamVjdCwgaWYgaXQgaXMgbGFyZ2VyIHRoYW4gXGNvZGV7c3lzLm1heGludH0uCi0KLSAgICBcaXRlbVtcc2FtcHtMfSAobG9uZykge1tQWV9MT05HX0xPTkddfV0KLSAgICBDb252ZXJ0IGEgQyBcY3R5cGV7bG9uZyBsb25nfSB0byBhIFB5dGhvbiBsb25nIGludGVnZXIgb2JqZWN0LiBPbmx5Ci0gICAgYXZhaWxhYmxlIG9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgXGN0eXBle2xvbmcgbG9uZ30uCi0KLSAgICBcaXRlbVtcc2FtcHtLfSAobG9uZykge1t1bnNpZ25lZCBQWV9MT05HX0xPTkddfV0KLSAgICBDb252ZXJ0IGEgQyBcY3R5cGV7dW5zaWduZWQgbG9uZyBsb25nfSB0byBhIFB5dGhvbiBsb25nIGludGVnZXIgb2JqZWN0LgotICAgIE9ubHkgYXZhaWxhYmxlIG9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgXGN0eXBle3Vuc2lnbmVkIGxvbmcgbG9uZ30uCi0KLSAgICBcaXRlbVtcc2FtcHtufSAoaW50KSB7W1B5X3NzaXplX3RdfV0KLSAgICBDb252ZXJ0IGEgQyBcY3R5cGV7UHlfc3NpemVfdH0gdG8gYSBQeXRob24gaW50ZWdlciBvciBsb25nIGludGVnZXIuCi0gICAgXHZlcnNpb25hZGRlZHsyLjV9Ci0KLSAgICBcaXRlbVtcc2FtcHtjfSAoc3RyaW5nIG9mIGxlbmd0aCAxKSB7W2NoYXJdfV0KLSAgICBDb252ZXJ0IGEgQyBcY3R5cGV7aW50fSByZXByZXNlbnRpbmcgYSBjaGFyYWN0ZXIgdG8gYSBQeXRob24KLSAgICBzdHJpbmcgb2YgbGVuZ3RoIDEuCi0KLSAgICBcaXRlbVtcc2FtcHtkfSAoZmxvYXQpIHtbZG91YmxlXX1dCi0gICAgQ29udmVydCBhIEMgXGN0eXBle2RvdWJsZX0gdG8gYSBQeXRob24gZmxvYXRpbmcgcG9pbnQgbnVtYmVyLgotCi0gICAgXGl0ZW1bXHNhbXB7Zn0gKGZsb2F0KSB7W2Zsb2F0XX1dCi0gICAgU2FtZSBhcyBcc2FtcHtkfS4KLQotICAgIFxpdGVtW1xzYW1we0R9IChjb21wbGV4KSB7W1B5X2NvbXBsZXggKl19XQotICAgIENvbnZlcnQgYSBDIFxjdHlwZXtQeV9jb21wbGV4fSBzdHJ1Y3R1cmUgdG8gYSBQeXRob24gY29tcGxleAotICAgIG51bWJlci4KLQotICAgIFxpdGVtW1xzYW1we099IChvYmplY3QpIHtbUHlPYmplY3QgKl19XQotICAgIFBhc3MgYSBQeXRob24gb2JqZWN0IHVudG91Y2hlZCAoZXhjZXB0IGZvciBpdHMgcmVmZXJlbmNlIGNvdW50LAotICAgIHdoaWNoIGlzIGluY3JlbWVudGVkIGJ5IG9uZSkuICBJZiB0aGUgb2JqZWN0IHBhc3NlZCBpbiBpcyBhCi0gICAgXE5VTEx7fSBwb2ludGVyLCBpdCBpcyBhc3N1bWVkIHRoYXQgdGhpcyB3YXMgY2F1c2VkIGJlY2F1c2UgdGhlCi0gICAgY2FsbCBwcm9kdWNpbmcgdGhlIGFyZ3VtZW50IGZvdW5kIGFuIGVycm9yIGFuZCBzZXQgYW4gZXhjZXB0aW9uLgotICAgIFRoZXJlZm9yZSwgXGNmdW5jdGlvbntQeV9CdWlsZFZhbHVlKCl9IHdpbGwgcmV0dXJuIFxOVUxMe30gYnV0Ci0gICAgd29uJ3QgcmFpc2UgYW4gZXhjZXB0aW9uLiAgSWYgbm8gZXhjZXB0aW9uIGhhcyBiZWVuIHJhaXNlZCB5ZXQsCi0gICAgXGV4Y2VwdGlvbntTeXN0ZW1FcnJvcn0gaXMgc2V0LgotCi0gICAgXGl0ZW1bXHNhbXB7U30gKG9iamVjdCkge1tQeU9iamVjdCAqXX1dCi0gICAgU2FtZSBhcyBcc2FtcHtPfS4KLQotICAgIFxpdGVtW1xzYW1we059IChvYmplY3QpIHtbUHlPYmplY3QgKl19XQotICAgIFNhbWUgYXMgXHNhbXB7T30sIGV4Y2VwdCBpdCBkb2Vzbid0IGluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50Ci0gICAgb24gdGhlIG9iamVjdC4gIFVzZWZ1bCB3aGVuIHRoZSBvYmplY3QgaXMgY3JlYXRlZCBieSBhIGNhbGwgdG8gYW4KLSAgICBvYmplY3QgY29uc3RydWN0b3IgaW4gdGhlIGFyZ3VtZW50IGxpc3QuCi0KLSAgICBcaXRlbVtcc2FtcHtPXCZ9IChvYmplY3QpIHtbXHZhcntjb252ZXJ0ZXJ9LCBcdmFye2FueXRoaW5nfV19XQotICAgIENvbnZlcnQgXHZhcnthbnl0aGluZ30gdG8gYSBQeXRob24gb2JqZWN0IHRocm91Z2ggYQotICAgIFx2YXJ7Y29udmVydGVyfSBmdW5jdGlvbi4gIFRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aAotICAgIFx2YXJ7YW55dGhpbmd9ICh3aGljaCBzaG91bGQgYmUgY29tcGF0aWJsZSB3aXRoIFxjdHlwZXt2b2lkICp9KSBhcwotICAgIGl0cyBhcmd1bWVudCBhbmQgc2hvdWxkIHJldHVybiBhIGBgbmV3JycgUHl0aG9uIG9iamVjdCwgb3IgXE5VTEx7fQotICAgIGlmIGFuIGVycm9yIG9jY3VycmVkLgotCi0gICAgXGl0ZW1bXHNhbXB7KFx2YXJ7aXRlbXN9KX0gKHR1cGxlKSB7W1x2YXJ7bWF0Y2hpbmctaXRlbXN9XX1dCi0gICAgQ29udmVydCBhIHNlcXVlbmNlIG9mIEMgdmFsdWVzIHRvIGEgUHl0aG9uIHR1cGxlIHdpdGggdGhlIHNhbWUKLSAgICBudW1iZXIgb2YgaXRlbXMuCi0KLSAgICBcaXRlbVtcc2FtcHtbXHZhcntpdGVtc31dfSAobGlzdCkge1tcdmFye21hdGNoaW5nLWl0ZW1zfV19XQotICAgIENvbnZlcnQgYSBzZXF1ZW5jZSBvZiBDIHZhbHVlcyB0byBhIFB5dGhvbiBsaXN0IHdpdGggdGhlIHNhbWUKLSAgICBudW1iZXIgb2YgaXRlbXMuCi0KLSAgICBcaXRlbVtcc2FtcHtce1x2YXJ7aXRlbXN9XH19IChkaWN0aW9uYXJ5KSB7W1x2YXJ7bWF0Y2hpbmctaXRlbXN9XX1dCi0gICAgQ29udmVydCBhIHNlcXVlbmNlIG9mIEMgdmFsdWVzIHRvIGEgUHl0aG9uIGRpY3Rpb25hcnkuICBFYWNoIHBhaXIKLSAgICBvZiBjb25zZWN1dGl2ZSBDIHZhbHVlcyBhZGRzIG9uZSBpdGVtIHRvIHRoZSBkaWN0aW9uYXJ5LCBzZXJ2aW5nCi0gICAgYXMga2V5IGFuZCB2YWx1ZSwgcmVzcGVjdGl2ZWx5LgotCi0gIFxlbmR7ZGVzY3JpcHRpb259Ci0KLSAgSWYgdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIGZvcm1hdCBzdHJpbmcsIHRoZQotICBcZXhjZXB0aW9ue1N5c3RlbUVycm9yfSBleGNlcHRpb24gaXMgc2V0IGFuZCBcTlVMTHt9IHJldHVybmVkLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxzZWN0aW9ue1N0cmluZyBjb252ZXJzaW9uIGFuZCBmb3JtYXR0aW5nIFxsYWJlbHtzdHJpbmctZm9ybWF0dGluZ319Ci0KLUZ1bmN0aW9ucyBmb3IgbnVtYmVyIGNvbnZlcnNpb24gYW5kIGZvcm1hdHRlZCBzdHJpbmcgb3V0cHV0LgotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5T1Nfc25wcmludGZ9e2NoYXIgKnN0ciwgc2l6ZV90IHNpemUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsIFxtb3JlYXJnc30KLU91dHB1dCBub3QgbW9yZSB0aGFuIFx2YXJ7c2l6ZX0gYnl0ZXMgdG8gXHZhcntzdHJ9IGFjY29yZGluZyB0byB0aGUgZm9ybWF0Ci1zdHJpbmcgXHZhcntmb3JtYXR9IGFuZCB0aGUgZXh0cmEgYXJndW1lbnRzLiBTZWUgdGhlIFxVTklYe30gbWFuCi1wYWdlIFxtYW5wYWdle3NucHJpbnRmfXsyfS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5T1NfdnNucHJpbnRmfXtjaGFyICpzdHIsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IHZhfQotT3V0cHV0IG5vdCBtb3JlIHRoYW4gXHZhcntzaXplfSBieXRlcyB0byBcdmFye3N0cn0gYWNjb3JkaW5nIHRvIHRoZSBmb3JtYXQKLXN0cmluZyBcdmFye2Zvcm1hdH0gYW5kIHRoZSB2YXJpYWJsZSBhcmd1bWVudCBsaXN0IFx2YXJ7dmF9LiBcVU5JWHt9Ci1tYW4gcGFnZSBcbWFucGFnZXt2c25wcmludGZ9ezJ9LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxjZnVuY3Rpb257UHlPU19zbnByaW50Zn0gYW5kIFxjZnVuY3Rpb257UHlPU192c25wcmludGZ9IHdyYXAgdGhlCi1TdGFuZGFyZCBDIGxpYnJhcnkgZnVuY3Rpb25zIFxjZnVuY3Rpb257c25wcmludGYoKX0gYW5kCi1cY2Z1bmN0aW9ue3ZzbnByaW50ZigpfS4gVGhlaXIgcHVycG9zZSBpcyB0byBndWFyYW50ZWUgY29uc2lzdGVudAotYmVoYXZpb3IgaW4gY29ybmVyIGNhc2VzLCB3aGljaCB0aGUgU3RhbmRhcmQgQyBmdW5jdGlvbnMgZG8gbm90LgotCi1UaGUgd3JhcHBlcnMgZW5zdXJlIHRoYXQgXHZhcntzdHJ9W1x2YXJ7c2l6ZX0tMV0gaXMgYWx3YXlzCi1cY2hhcmFjdGVye1x0ZXh0YmFja3NsYXNoMH0gdXBvbiByZXR1cm4uIFRoZXkgbmV2ZXIgd3JpdGUgbW9yZSB0aGFuCi1cdmFye3NpemV9IGJ5dGVzIChpbmNsdWRpbmcgdGhlIHRyYWlsaW5nIFxjaGFyYWN0ZXJ7XHRleHRiYWNrc2xhc2gwfSkKLWludG8gc3RyLiBCb3RoIGZ1bmN0aW9ucyByZXF1aXJlIHRoYXQgXGNvZGV7XHZhcntzdHJ9ICE9IE5VTEx9LAotXGNvZGV7XHZhcntzaXplfSA+IDB9IGFuZCBcY29kZXtcdmFye2Zvcm1hdH0gIT0gTlVMTH0uCi0KLUlmIHRoZSBwbGF0Zm9ybSBkb2Vzbid0IGhhdmUgXGNmdW5jdGlvbnt2c25wcmludGYoKX0gYW5kIHRoZSBidWZmZXIKLXNpemUgbmVlZGVkIHRvIGF2b2lkIHRydW5jYXRpb24gZXhjZWVkcyBcdmFye3NpemV9IGJ5IG1vcmUgdGhhbiA1MTIKLWJ5dGVzLCBQeXRob24gYWJvcnRzIHdpdGggYSBcdmFye1B5X0ZhdGFsRXJyb3J9LgotCi1UaGUgcmV0dXJuIHZhbHVlIChcdmFye3J2fSkgZm9yIHRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgYmUgaW50ZXJwcmV0ZWQKLWFzIGZvbGxvd3M6Ci0KLVxiZWdpbntpdGVtaXplfQotCi1caXRlbSBXaGVuIFxjb2RlezAgPD0gXHZhcntydn0gPCBcdmFye3NpemV9fSwgdGhlIG91dHB1dCBjb252ZXJzaW9uCi0gIHdhcyBzdWNjZXNzZnVsIGFuZCBcdmFye3J2fSBjaGFyYWN0ZXJzIHdlcmUgd3JpdHRlbiB0byBcdmFye3N0cn0KLSAgKGV4Y2x1ZGluZyB0aGUgdHJhaWxpbmcgXGNoYXJhY3RlcntcdGV4dGJhY2tzbGFzaDB9IGJ5dGUgYXQKLSAgXHZhcntzdHJ9W1x2YXJ7cnZ9XSkuCi0KLVxpdGVtIFdoZW4gXGNvZGV7XHZhcntydn0gPj0gXHZhcntzaXplfX0sIHRoZSBvdXRwdXQgY29udmVyc2lvbiB3YXMKLSAgdHJ1bmNhdGVkIGFuZCBhIGJ1ZmZlciB3aXRoIFxjb2Rle1x2YXJ7cnZ9ICsgMX0gYnl0ZXMgd291bGQgaGF2ZQotICBiZWVuIG5lZWRlZCB0byBzdWNjZWVkLiBcdmFye3N0cn1bXHZhcntzaXplfS0xXSBpcwotICBcY2hhcmFjdGVye1x0ZXh0YmFja3NsYXNoMH0gaW4gdGhpcyBjYXNlLgotCi1caXRlbSBXaGVuIFxjb2Rle1x2YXJ7cnZ9IDwgMH0sIGBgc29tZXRoaW5nIGJhZCBoYXBwZW5lZC4nJwotICBcdmFye3N0cn1bXHZhcntzaXplfS0xXSBpcyBcY2hhcmFjdGVye1x0ZXh0YmFja3NsYXNoMH0gaW4gdGhpcyBjYXNlCi0gIHRvbywgYnV0IHRoZSByZXN0IG9mIFx2YXJ7c3RyfSBpcyB1bmRlZmluZWQuIFRoZSBleGFjdCBjYXVzZSBvZiB0aGUKLSAgZXJyb3IgZGVwZW5kcyBvbiB0aGUgdW5kZXJseWluZyBwbGF0Zm9ybS4KLQotXGVuZHtpdGVtaXplfQotCi1UaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBwcm92aWRlIGxvY2FsZS1pbmRlcGVuZGVudCBzdHJpbmcgdG8gbnVtYmVyCi1jb252ZXJzaW9ucy4KLQotXGJlZ2lue2NmdW5jZGVzY317ZG91YmxlfXtQeU9TX2FzY2lpX3N0cnRvZH17Y29uc3QgY2hhciAqbnB0ciwgY2hhciAqKmVuZHB0cn0KLUNvbnZlcnQgYSBzdHJpbmcgdG8gYSBcY3R5cGV7ZG91YmxlfS4gVGhpcyBmdW5jdGlvbiBiZWhhdmVzIGxpa2UgdGhlCi1TdGFuZGFyZCBDIGZ1bmN0aW9uIFxjZnVuY3Rpb257c3RydG9kKCl9IGRvZXMgaW4gdGhlIEMgbG9jYWxlLiBJdCBkb2VzCi10aGlzIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGN1cnJlbnQgbG9jYWxlLCBzaW5jZSB0aGF0IHdvdWxkIG5vdCBiZQotdGhyZWFkLXNhZmUuCi0KLVxjZnVuY3Rpb257UHlPU19hc2NpaV9zdHJ0b2R9IHNob3VsZCB0eXBpY2FsbHkgYmUgdXNlZCBmb3IgcmVhZGluZwotY29uZmlndXJhdGlvbiBmaWxlcyBvciBvdGhlciBub24tdXNlciBpbnB1dCB0aGF0IHNob3VsZCBiZSBsb2NhbGUKLWluZGVwZW5kZW50LiBcdmVyc2lvbmFkZGVkezIuNH0KLQotU2VlIHRoZSBcVU5JWHt9IG1hbiBwYWdlIFxtYW5wYWdle3N0cnRvZH17Mn0gZm9yIGRldGFpbHMuCi0KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtjaGFyICp9e1B5T1NfYXNjaWlfZm9ybWF0ZH17Y2hhciAqYnVmZmVyLCBzaXplX3QgYnVmX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsIGRvdWJsZSBkfQotQ29udmVydCBhIFxjdHlwZXtkb3VibGV9IHRvIGEgc3RyaW5nIHVzaW5nIHRoZSBcY2hhcmFjdGVyey59IGFzIHRoZQotZGVjaW1hbCBzZXBhcmF0b3IuIFx2YXJ7Zm9ybWF0fSBpcyBhIFxjZnVuY3Rpb257cHJpbnRmKCl9LXN0eWxlIGZvcm1hdAotc3RyaW5nIHNwZWNpZnlpbmcgdGhlIG51bWJlciBmb3JtYXQuIEFsbG93ZWQgY29udmVyc2lvbiBjaGFyYWN0ZXJzIGFyZQotXGNoYXJhY3RlcntlfSwgXGNoYXJhY3RlcntFfSwgXGNoYXJhY3RlcntmfSwgXGNoYXJhY3RlcntGfSwKLVxjaGFyYWN0ZXJ7Z30gYW5kIFxjaGFyYWN0ZXJ7R30uCi0KLVRoZSByZXR1cm4gdmFsdWUgaXMgYSBwb2ludGVyIHRvIFx2YXJ7YnVmZmVyfSB3aXRoIHRoZSBjb252ZXJ0ZWQKLXN0cmluZyBvciBOVUxMIGlmIHRoZSBjb252ZXJzaW9uIGZhaWxlZC4gXHZlcnNpb25hZGRlZHsyLjR9Ci1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317ZG91YmxlfXtQeU9TX2FzY2lpX2F0b2Z9e2NvbnN0IGNoYXIgKm5wdHJ9Ci1Db252ZXJ0IGEgc3RyaW5nIHRvIGEgXGN0eXBle2RvdWJsZX0gaW4gYSBsb2NhbGUtaW5kZXBlbmRlbnQKLXdheS4gXHZlcnNpb25hZGRlZHsyLjR9Ci0KLVNlZSB0aGUgXFVOSVh7fSBtYW4gcGFnZSBcbWFucGFnZXthdG9mfXsyfSBmb3IgZGV0YWlscy4KLVxlbmR7Y2Z1bmNkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2FwaS92ZXJ5aGlnaC50ZXggYi9Eb2MvYXBpL3ZlcnloaWdoLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM3OWI0NC4uMDAwMDAwMAotLS0gYS9Eb2MvYXBpL3ZlcnloaWdoLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi1cY2hhcHRlcntUaGUgVmVyeSBIaWdoIExldmVsIExheWVyIFxsYWJlbHt2ZXJ5aGlnaH19Ci0KLQotVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGNoYXB0ZXIgd2lsbCBsZXQgeW91IGV4ZWN1dGUgUHl0aG9uIHNvdXJjZSBjb2RlCi1naXZlbiBpbiBhIGZpbGUgb3IgYSBidWZmZXIsIGJ1dCB0aGV5IHdpbGwgbm90IGxldCB5b3UgaW50ZXJhY3QgaW4gYQotbW9yZSBkZXRhaWxlZCB3YXkgd2l0aCB0aGUgaW50ZXJwcmV0ZXIuCi0KLVNldmVyYWwgb2YgdGhlc2UgZnVuY3Rpb25zIGFjY2VwdCBhIHN0YXJ0IHN5bWJvbCBmcm9tIHRoZSBncmFtbWFyIGFzIGEgCi1wYXJhbWV0ZXIuICBUaGUgYXZhaWxhYmxlIHN0YXJ0IHN5bWJvbHMgYXJlIFxjb25zdGFudHtQeV9ldmFsX2lucHV0fSwKLVxjb25zdGFudHtQeV9maWxlX2lucHV0fSwgYW5kIFxjb25zdGFudHtQeV9zaW5nbGVfaW5wdXR9LiAgVGhlc2UgYXJlCi1kZXNjcmliZWQgZm9sbG93aW5nIHRoZSBmdW5jdGlvbnMgd2hpY2ggYWNjZXB0IHRoZW0gYXMgcGFyYW1ldGVycy4KLQotTm90ZSBhbHNvIHRoYXQgc2V2ZXJhbCBvZiB0aGVzZSBmdW5jdGlvbnMgdGFrZSBcY3R5cGV7RklMRSp9Ci1wYXJhbWV0ZXJzLiAgT24gcGFydGljdWxhciBpc3N1ZSB3aGljaCBuZWVkcyB0byBiZSBoYW5kbGVkIGNhcmVmdWxseQotaXMgdGhhdCB0aGUgXGN0eXBle0ZJTEV9IHN0cnVjdHVyZSBmb3IgZGlmZmVyZW50IEMgbGlicmFyaWVzIGNhbiBiZQotZGlmZmVyZW50IGFuZCBpbmNvbXBhdGlibGUuICBVbmRlciBXaW5kb3dzIChhdCBsZWFzdCksIGl0IGlzIHBvc3NpYmxlCi1mb3IgZHluYW1pY2FsbHkgbGlua2VkIGV4dGVuc2lvbnMgdG8gYWN0dWFsbHkgdXNlIGRpZmZlcmVudCBsaWJyYXJpZXMsCi1zbyBjYXJlIHNob3VsZCBiZSB0YWtlbiB0aGF0IFxjdHlwZXtGSUxFKn0gcGFyYW1ldGVycyBhcmUgb25seSBwYXNzZWQKLXRvIHRoZXNlIGZ1bmN0aW9ucyBpZiBpdCBpcyBjZXJ0YWluIHRoYXQgdGhleSB3ZXJlIGNyZWF0ZWQgYnkgdGhlIHNhbWUKLWxpYnJhcnkgdGhhdCB0aGUgUHl0aG9uIHJ1bnRpbWUgaXMgdXNpbmcuCi0KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeV9NYWlufXtpbnQgYXJnYywgY2hhciAqKmFyZ3Z9Ci0gIFRoZSBtYWluIHByb2dyYW0gZm9yIHRoZSBzdGFuZGFyZCBpbnRlcnByZXRlci4gIFRoaXMgaXMgbWFkZQotICBhdmFpbGFibGUgZm9yIHByb2dyYW1zIHdoaWNoIGVtYmVkIFB5dGhvbi4gIFRoZSBcdmFye2FyZ2N9IGFuZAotICBcdmFye2FyZ3Z9IHBhcmFtZXRlcnMgc2hvdWxkIGJlIHByZXBhcmVkIGV4YWN0bHkgYXMgdGhvc2Ugd2hpY2ggYXJlCi0gIHBhc3NlZCB0byBhIEMgcHJvZ3JhbSdzIFxjZnVuY3Rpb257bWFpbigpfSBmdW5jdGlvbi4gIEl0IGlzCi0gIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhlIGFyZ3VtZW50IGxpc3QgbWF5IGJlIG1vZGlmaWVkIChidXQgdGhlCi0gIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmdzIHBvaW50ZWQgdG8gYnkgdGhlIGFyZ3VtZW50IGxpc3QgYXJlIG5vdCkuCi0gIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSB0aGUgaW50ZWdlciBwYXNzZWQgdG8gdGhlCi0gIFxmdW5jdGlvbntzeXMuZXhpdCgpfSBmdW5jdGlvbiwgXGNvZGV7MX0gaWYgdGhlIGludGVycHJldGVyIGV4aXRzCi0gIGR1ZSB0byBhbiBleGNlcHRpb24sIG9yIFxjb2RlezJ9IGlmIHRoZSBwYXJhbWV0ZXIgbGlzdCBkb2VzIG5vdAotICByZXByZXNlbnQgYSB2YWxpZCBQeXRob24gY29tbWFuZCBsaW5lLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlSdW5fQW55RmlsZX17RklMRSAqZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lfQotICBUaGlzIGlzIGEgc2ltcGxpZmllZCBpbnRlcmZhY2UgdG8gXGNmdW5jdGlvbntQeVJ1bl9BbnlGaWxlRXhGbGFncygpfQotICBiZWxvdywgbGVhdmluZyBcdmFye2Nsb3NlaXR9IHNldCB0byBcY29kZXswfSBhbmQgXHZhcntmbGFnc30gc2V0IHRvIFxOVUxMLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlSdW5fQW55RmlsZUZsYWdzfXtGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlDb21waWxlckZsYWdzICpmbGFnc30KLSAgVGhpcyBpcyBhIHNpbXBsaWZpZWQgaW50ZXJmYWNlIHRvIFxjZnVuY3Rpb257UHlSdW5fQW55RmlsZUV4RmxhZ3MoKX0KLSAgYmVsb3csIGxlYXZpbmcgdGhlIFx2YXJ7Y2xvc2VpdH0gYXJndW1lbnQgc2V0IHRvIFxjb2RlezB9LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlSdW5fQW55RmlsZUV4fXtGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsb3NlaXR9Ci0gIFRoaXMgaXMgYSBzaW1wbGlmaWVkIGludGVyZmFjZSB0byBcY2Z1bmN0aW9ue1B5UnVuX0FueUZpbGVFeEZsYWdzKCl9Ci0gIGJlbG93LCBsZWF2aW5nIHRoZSBcdmFye2ZsYWdzfSBhcmd1bWVudCBzZXQgdG8gXE5VTEwuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeVJ1bl9BbnlGaWxlRXhGbGFnc317RklMRSAqZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsb3NlaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzfQotICBJZiBcdmFye2ZwfSByZWZlcnMgdG8gYSBmaWxlIGFzc29jaWF0ZWQgd2l0aCBhbiBpbnRlcmFjdGl2ZSBkZXZpY2UKLSAgKGNvbnNvbGUgb3IgdGVybWluYWwgaW5wdXQgb3IgXFVOSVh7fSBwc2V1ZG8tdGVybWluYWwpLCByZXR1cm4gdGhlCi0gIHZhbHVlIG9mIFxjZnVuY3Rpb257UHlSdW5fSW50ZXJhY3RpdmVMb29wKCl9LCBvdGhlcndpc2UgcmV0dXJuIHRoZQotICByZXN1bHQgb2YgXGNmdW5jdGlvbntQeVJ1bl9TaW1wbGVGaWxlKCl9LiAgSWYgXHZhcntmaWxlbmFtZX0gaXMKLSAgXE5VTEwsIHRoaXMgZnVuY3Rpb24gdXNlcyBcY29kZXsiPz8/In0gYXMgdGhlIGZpbGVuYW1lLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlSdW5fU2ltcGxlU3RyaW5nfXtjb25zdCBjaGFyICpjb21tYW5kfQotICBUaGlzIGlzIGEgc2ltcGxpZmllZCBpbnRlcmZhY2UgdG8gXGNmdW5jdGlvbntQeVJ1bl9TaW1wbGVTdHJpbmdGbGFncygpfQotICBiZWxvdywgbGVhdmluZyB0aGUgXHZhcntQeUNvbXBpbGVyRmxhZ3MqfSBhcmd1bWVudCBzZXQgdG8gTlVMTC4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5UnVuX1NpbXBsZVN0cmluZ0ZsYWdzfXtjb25zdCBjaGFyICpjb21tYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlDb21waWxlckZsYWdzICpmbGFnc30KLSAgRXhlY3V0ZXMgdGhlIFB5dGhvbiBzb3VyY2UgY29kZSBmcm9tIFx2YXJ7Y29tbWFuZH0gaW4gdGhlCi0gIFxtb2R1bGV7X19tYWluX199IG1vZHVsZSBhY2NvcmRpbmcgdG8gdGhlIFx2YXJ7ZmxhZ3N9IGFyZ3VtZW50LgotICBJZiBcbW9kdWxle19fbWFpbl9ffSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LCBpdCBpcyBjcmVhdGVkLiAgUmV0dXJucwotICBcY29kZXswfSBvbiBzdWNjZXNzIG9yIFxjb2Rley0xfSBpZiBhbiBleGNlcHRpb24gd2FzIHJhaXNlZC4gIElmIHRoZXJlCi0gIHdhcyBhbiBlcnJvciwgdGhlcmUgaXMgbm8gd2F5IHRvIGdldCB0aGUgZXhjZXB0aW9uIGluZm9ybWF0aW9uLgotICBGb3IgdGhlIG1lYW5pbmcgb2YgXHZhcntmbGFnc30sIHNlZSBiZWxvdy4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5UnVuX1NpbXBsZUZpbGV9e0ZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZX0KLSAgVGhpcyBpcyBhIHNpbXBsaWZpZWQgaW50ZXJmYWNlIHRvIFxjZnVuY3Rpb257UHlSdW5fU2ltcGxlRmlsZUV4RmxhZ3MoKX0KLSAgYmVsb3csIGxlYXZpbmcgXHZhcntjbG9zZWl0fSBzZXQgdG8gXGNvZGV7MH0gYW5kIFx2YXJ7ZmxhZ3N9IHNldCB0bwotICBcTlVMTC4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5UnVuX1NpbXBsZUZpbGVGbGFnc317RklMRSAqZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3N9Ci0gIFRoaXMgaXMgYSBzaW1wbGlmaWVkIGludGVyZmFjZSB0byBcY2Z1bmN0aW9ue1B5UnVuX1NpbXBsZUZpbGVFeEZsYWdzKCl9Ci0gIGJlbG93LCBsZWF2aW5nIFx2YXJ7Y2xvc2VpdH0gc2V0IHRvIFxjb2RlezB9LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlSdW5fU2ltcGxlRmlsZUV4fXtGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsb3NlaXR9Ci0gIFRoaXMgaXMgYSBzaW1wbGlmaWVkIGludGVyZmFjZSB0byBcY2Z1bmN0aW9ue1B5UnVuX1NpbXBsZUZpbGVFeEZsYWdzKCl9Ci0gIGJlbG93LCBsZWF2aW5nIFx2YXJ7ZmxhZ3N9IHNldCB0byBcTlVMTC4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5UnVuX1NpbXBsZUZpbGVFeEZsYWdzfXtGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xvc2VpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3N9Ci0gIFNpbWlsYXIgdG8gXGNmdW5jdGlvbntQeVJ1bl9TaW1wbGVTdHJpbmdGbGFncygpfSwgYnV0IHRoZSBQeXRob24gc291cmNlCi0gIGNvZGUgaXMgcmVhZCBmcm9tIFx2YXJ7ZnB9IGluc3RlYWQgb2YgYW4gaW4tbWVtb3J5IHN0cmluZy4KLSAgXHZhcntmaWxlbmFtZX0gc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBmaWxlLiAgSWYgXHZhcntjbG9zZWl0fSBpcwotICB0cnVlLCB0aGUgZmlsZSBpcyBjbG9zZWQgYmVmb3JlIFB5UnVuX1NpbXBsZUZpbGVFeEZsYWdzIHJldHVybnMuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeVJ1bl9JbnRlcmFjdGl2ZU9uZX17RklMRSAqZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lfQotICBUaGlzIGlzIGEgc2ltcGxpZmllZCBpbnRlcmZhY2UgdG8gXGNmdW5jdGlvbntQeVJ1bl9JbnRlcmFjdGl2ZU9uZUZsYWdzKCl9Ci0gIGJlbG93LCBsZWF2aW5nIFx2YXJ7ZmxhZ3N9IHNldCB0byBcTlVMTC4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5UnVuX0ludGVyYWN0aXZlT25lRmxhZ3N9e0ZJTEUgKmZwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlDb21waWxlckZsYWdzICpmbGFnc30KLSAgUmVhZCBhbmQgZXhlY3V0ZSBhIHNpbmdsZSBzdGF0ZW1lbnQgZnJvbSBhIGZpbGUgYXNzb2NpYXRlZCB3aXRoIGFuCi0gIGludGVyYWN0aXZlIGRldmljZSBhY2NvcmRpbmcgdG8gdGhlIFx2YXJ7ZmxhZ3N9IGFyZ3VtZW50LiAgSWYKLSAgXHZhcntmaWxlbmFtZX0gaXMgXE5VTEwsIFxjb2RleyI/Pz8ifSBpcyB1c2VkIGluc3RlYWQuICBUaGUgdXNlciB3aWxsCi0gIGJlIHByb21wdGVkIHVzaW5nIFxjb2Rle3N5cy5wczF9IGFuZCBcY29kZXtzeXMucHMyfS4gIFJldHVybnMgXGNvZGV7MH0KLSAgd2hlbiB0aGUgaW5wdXQgd2FzIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSwgXGNvZGV7LTF9IGlmIHRoZXJlIHdhcyBhbgotICBleGNlcHRpb24sIG9yIGFuIGVycm9yIGNvZGUgZnJvbSB0aGUgXGZpbGV7ZXJyY29kZS5ofSBpbmNsdWRlIGZpbGUKLSAgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBQeXRob24gaWYgdGhlcmUgd2FzIGEgcGFyc2UgZXJyb3IuICAoTm90ZSB0aGF0Ci0gIFxmaWxle2VycmNvZGUuaH0gaXMgbm90IGluY2x1ZGVkIGJ5IFxmaWxle1B5dGhvbi5ofSwgc28gbXVzdCBiZSBpbmNsdWRlZAotICBzcGVjaWZpY2FsbHkgaWYgbmVlZGVkLikKLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5UnVuX0ludGVyYWN0aXZlTG9vcH17RklMRSAqZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lfQotICBUaGlzIGlzIGEgc2ltcGxpZmllZCBpbnRlcmZhY2UgdG8gXGNmdW5jdGlvbntQeVJ1bl9JbnRlcmFjdGl2ZUxvb3BGbGFncygpfQotICBiZWxvdywgbGVhdmluZyBcdmFye2ZsYWdzfSBzZXQgdG8gXE5VTEwuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeVJ1bl9JbnRlcmFjdGl2ZUxvb3BGbGFnc317RklMRSAqZnAsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzfQotICBSZWFkIGFuZCBleGVjdXRlIHN0YXRlbWVudHMgZnJvbSBhIGZpbGUgYXNzb2NpYXRlZCB3aXRoIGFuCi0gIGludGVyYWN0aXZlIGRldmljZSB1bnRpbCBcRU9Ge30gaXMgcmVhY2hlZC4gIElmIFx2YXJ7ZmlsZW5hbWV9IGlzCi0gIFxOVUxMLCBcY29kZXsiPz8/In0gaXMgdXNlZCBpbnN0ZWFkLiAgVGhlIHVzZXIgd2lsbCBiZSBwcm9tcHRlZAotICB1c2luZyBcY29kZXtzeXMucHMxfSBhbmQgXGNvZGV7c3lzLnBzMn0uICBSZXR1cm5zIFxjb2RlezB9IGF0IFxFT0YuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317c3RydWN0IF9ub2RlKn17UHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmd9e2NvbnN0IGNoYXIgKnN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnR9Ci0gIFRoaXMgaXMgYSBzaW1wbGlmaWVkIGludGVyZmFjZSB0bwotICBcY2Z1bmN0aW9ue1B5UGFyc2VyX1NpbXBsZVBhcnNlU3RyaW5nRmxhZ3NGaWxlbmFtZSgpfSBiZWxvdywgbGVhdmluZyAKLSAgXHZhcntmaWxlbmFtZX0gc2V0IHRvIFxOVUxMe30gYW5kIFx2YXJ7ZmxhZ3N9IHNldCB0byBcY29kZXswfS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtzdHJ1Y3QgX25vZGUqfXtQeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZ0ZsYWdzfXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0ciwgaW50IHN0YXJ0LCBpbnQgZmxhZ3N9Ci0gIFRoaXMgaXMgYSBzaW1wbGlmaWVkIGludGVyZmFjZSB0bwotICBcY2Z1bmN0aW9ue1B5UGFyc2VyX1NpbXBsZVBhcnNlU3RyaW5nRmxhZ3NGaWxlbmFtZSgpfSBiZWxvdywgbGVhdmluZyAKLSAgXHZhcntmaWxlbmFtZX0gc2V0IHRvIFxOVUxMLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e3N0cnVjdCBfbm9kZSp9e1B5UGFyc2VyX1NpbXBsZVBhcnNlU3RyaW5nRmxhZ3NGaWxlbmFtZX17Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LCBpbnQgZmxhZ3N9Ci0gIFBhcnNlIFB5dGhvbiBzb3VyY2UgY29kZSBmcm9tIFx2YXJ7c3RyfSB1c2luZyB0aGUgc3RhcnQgdG9rZW4KLSAgXHZhcntzdGFydH0gYWNjb3JkaW5nIHRvIHRoZSBcdmFye2ZsYWdzfSBhcmd1bWVudC4gIFRoZSByZXN1bHQgY2FuCi0gIGJlIHVzZWQgdG8gY3JlYXRlIGEgY29kZSBvYmplY3Qgd2hpY2ggY2FuIGJlIGV2YWx1YXRlZCBlZmZpY2llbnRseS4KLSAgVGhpcyBpcyB1c2VmdWwgaWYgYSBjb2RlIGZyYWdtZW50IG11c3QgYmUgZXZhbHVhdGVkIG1hbnkgdGltZXMuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317c3RydWN0IF9ub2RlKn17UHlQYXJzZXJfU2ltcGxlUGFyc2VGaWxlfXtGSUxFICpmcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgc3RhcnR9Ci0gIFRoaXMgaXMgYSBzaW1wbGlmaWVkIGludGVyZmFjZSB0byBcY2Z1bmN0aW9ue1B5UGFyc2VyX1NpbXBsZVBhcnNlRmlsZUZsYWdzKCl9Ci0gIGJlbG93LCBsZWF2aW5nIFx2YXJ7ZmxhZ3N9IHNldCB0byBcY29kZXswfQotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e3N0cnVjdCBfbm9kZSp9e1B5UGFyc2VyX1NpbXBsZVBhcnNlRmlsZUZsYWdzfXtGSUxFICpmcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgc3RhcnQsIGludCBmbGFnc30KLSAgU2ltaWxhciB0byBcY2Z1bmN0aW9ue1B5UGFyc2VyX1NpbXBsZVBhcnNlU3RyaW5nRmxhZ3NGaWxlbmFtZSgpfSwgYnV0Ci0gIHRoZSBQeXRob24gc291cmNlIGNvZGUgaXMgcmVhZCBmcm9tIFx2YXJ7ZnB9IGluc3RlYWQgb2YgYW4gaW4tbWVtb3J5Ci0gIHN0cmluZy4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5UnVuX1N0cmluZ317Y29uc3QgY2hhciAqc3RyLCBpbnQgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmdsb2JhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmxvY2Fsc30KLSAgVGhpcyBpcyBhIHNpbXBsaWZpZWQgaW50ZXJmYWNlIHRvIFxjZnVuY3Rpb257UHlSdW5fU3RyaW5nRmxhZ3MoKX0gYmVsb3csCi0gIGxlYXZpbmcgXHZhcntmbGFnc30gc2V0IHRvIFxOVUxMLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlSdW5fU3RyaW5nRmxhZ3N9e2NvbnN0IGNoYXIgKnN0ciwgaW50IHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmdsb2JhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbG9jYWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlDb21waWxlckZsYWdzICpmbGFnc30KLSAgRXhlY3V0ZSBQeXRob24gc291cmNlIGNvZGUgZnJvbSBcdmFye3N0cn0gaW4gdGhlIGNvbnRleHQgc3BlY2lmaWVkCi0gIGJ5IHRoZSBkaWN0aW9uYXJpZXMgXHZhcntnbG9iYWxzfSBhbmQgXHZhcntsb2NhbHN9IHdpdGggdGhlIGNvbXBpbGVyCi0gIGZsYWdzIHNwZWNpZmllZCBieSBcdmFye2ZsYWdzfS4gIFRoZSBwYXJhbWV0ZXIgXHZhcntzdGFydH0gc3BlY2lmaWVzCi0gIHRoZSBzdGFydCB0b2tlbiB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHBhcnNlIHRoZSBzb3VyY2UgY29kZS4KLQotICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgZXhlY3V0aW5nIHRoZSBjb2RlIGFzIGEgUHl0aG9uIG9iamVjdCwgb3IKLSAgXE5VTEx7fSBpZiBhbiBleGNlcHRpb24gd2FzIHJhaXNlZC4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5UnVuX0ZpbGV9e0ZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LCBQeU9iamVjdCAqZ2xvYmFscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmxvY2Fsc30KLSAgVGhpcyBpcyBhIHNpbXBsaWZpZWQgaW50ZXJmYWNlIHRvIFxjZnVuY3Rpb257UHlSdW5fRmlsZUV4RmxhZ3MoKX0gYmVsb3csCi0gIGxlYXZpbmcgXHZhcntjbG9zZWl0fSBzZXQgdG8gXGNvZGV7MH0gYW5kIFx2YXJ7ZmxhZ3N9IHNldCB0byBcTlVMTC4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5UnVuX0ZpbGVFeH17RklMRSAqZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIFB5T2JqZWN0ICpnbG9iYWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbG9jYWxzLCBpbnQgY2xvc2VpdH0KLSAgVGhpcyBpcyBhIHNpbXBsaWZpZWQgaW50ZXJmYWNlIHRvIFxjZnVuY3Rpb257UHlSdW5fRmlsZUV4RmxhZ3MoKX0gYmVsb3csCi0gIGxlYXZpbmcgXHZhcntmbGFnc30gc2V0IHRvIFxOVUxMLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlSdW5fRmlsZUZsYWdzfXtGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwgUHlPYmplY3QgKmdsb2JhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpsb2NhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3N9Ci0gIFRoaXMgaXMgYSBzaW1wbGlmaWVkIGludGVyZmFjZSB0byBcY2Z1bmN0aW9ue1B5UnVuX0ZpbGVFeEZsYWdzKCl9IGJlbG93LAotICBsZWF2aW5nIFx2YXJ7Y2xvc2VpdH0gc2V0IHRvIFxjb2RlezB9LgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlSdW5fRmlsZUV4RmxhZ3N9e0ZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwgUHlPYmplY3QgKmdsb2JhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbG9jYWxzLCBpbnQgY2xvc2VpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3N9Ci0gIFNpbWlsYXIgdG8gXGNmdW5jdGlvbntQeVJ1bl9TdHJpbmdGbGFncygpfSwgYnV0IHRoZSBQeXRob24gc291cmNlIGNvZGUgaXMKLSAgcmVhZCBmcm9tIFx2YXJ7ZnB9IGluc3RlYWQgb2YgYW4gaW4tbWVtb3J5IHN0cmluZy4KLSAgXHZhcntmaWxlbmFtZX0gc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgotICBJZiBcdmFye2Nsb3NlaXR9IGlzIHRydWUsIHRoZSBmaWxlIGlzIGNsb3NlZCBiZWZvcmUKLSAgXGNmdW5jdGlvbntQeVJ1bl9GaWxlRXhGbGFncygpfSByZXR1cm5zLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlfQ29tcGlsZVN0cmluZ317Y29uc3QgY2hhciAqc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0fQotICBUaGlzIGlzIGEgc2ltcGxpZmllZCBpbnRlcmZhY2UgdG8gXGNmdW5jdGlvbntQeV9Db21waWxlU3RyaW5nRmxhZ3MoKX0gYmVsb3csCi0gIGxlYXZpbmcgXHZhcntmbGFnc30gc2V0IHRvIFxOVUxMLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlfQ29tcGlsZVN0cmluZ0ZsYWdzfXtjb25zdCBjaGFyICpzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3N9Ci0gIFBhcnNlIGFuZCBjb21waWxlIHRoZSBQeXRob24gc291cmNlIGNvZGUgaW4gXHZhcntzdHJ9LCByZXR1cm5pbmcgdGhlCi0gIHJlc3VsdGluZyBjb2RlIG9iamVjdC4gIFRoZSBzdGFydCB0b2tlbiBpcyBnaXZlbiBieSBcdmFye3N0YXJ0fTsKLSAgdGhpcyBjYW4gYmUgdXNlZCB0byBjb25zdHJhaW4gdGhlIGNvZGUgd2hpY2ggY2FuIGJlIGNvbXBpbGVkIGFuZCBzaG91bGQKLSAgYmUgXGNvbnN0YW50e1B5X2V2YWxfaW5wdXR9LCBcY29uc3RhbnR7UHlfZmlsZV9pbnB1dH0sIG9yCi0gIFxjb25zdGFudHtQeV9zaW5nbGVfaW5wdXR9LiAgVGhlIGZpbGVuYW1lIHNwZWNpZmllZCBieQotICBcdmFye2ZpbGVuYW1lfSBpcyB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgY29kZSBvYmplY3QgYW5kIG1heSBhcHBlYXIKLSAgaW4gdHJhY2ViYWNrcyBvciBcZXhjZXB0aW9ue1N5bnRheEVycm9yfSBleGNlcHRpb24gbWVzc2FnZXMuICBUaGlzCi0gIHJldHVybnMgXE5VTEx7fSBpZiB0aGUgY29kZSBjYW5ub3QgYmUgcGFyc2VkIG9yIGNvbXBpbGVkLgotXGVuZHtjZnVuY2Rlc2N9Ci0KLVxiZWdpbntjdmFyZGVzY317aW50fXtQeV9ldmFsX2lucHV0fQotICBUaGUgc3RhcnQgc3ltYm9sIGZyb20gdGhlIFB5dGhvbiBncmFtbWFyIGZvciBpc29sYXRlZCBleHByZXNzaW9uczsKLSAgZm9yIHVzZSB3aXRoCi0gIFxjZnVuY3Rpb257UHlfQ29tcGlsZVN0cmluZygpfVx0dGluZGV4e1B5X0NvbXBpbGVTdHJpbmcoKX0uCi1cZW5ke2N2YXJkZXNjfQotCi1cYmVnaW57Y3ZhcmRlc2N9e2ludH17UHlfZmlsZV9pbnB1dH0KLSAgVGhlIHN0YXJ0IHN5bWJvbCBmcm9tIHRoZSBQeXRob24gZ3JhbW1hciBmb3Igc2VxdWVuY2VzIG9mIHN0YXRlbWVudHMKLSAgYXMgcmVhZCBmcm9tIGEgZmlsZSBvciBvdGhlciBzb3VyY2U7IGZvciB1c2Ugd2l0aAotICBcY2Z1bmN0aW9ue1B5X0NvbXBpbGVTdHJpbmcoKX1cdHRpbmRleHtQeV9Db21waWxlU3RyaW5nKCl9LiAgVGhpcyBpcwotICB0aGUgc3ltYm9sIHRvIHVzZSB3aGVuIGNvbXBpbGluZyBhcmJpdHJhcmlseSBsb25nIFB5dGhvbiBzb3VyY2UgY29kZS4KLVxlbmR7Y3ZhcmRlc2N9Ci0KLVxiZWdpbntjdmFyZGVzY317aW50fXtQeV9zaW5nbGVfaW5wdXR9Ci0gIFRoZSBzdGFydCBzeW1ib2wgZnJvbSB0aGUgUHl0aG9uIGdyYW1tYXIgZm9yIGEgc2luZ2xlIHN0YXRlbWVudDsgZm9yCi0gIHVzZSB3aXRoIFxjZnVuY3Rpb257UHlfQ29tcGlsZVN0cmluZygpfVx0dGluZGV4e1B5X0NvbXBpbGVTdHJpbmcoKX0uCi0gIFRoaXMgaXMgdGhlIHN5bWJvbCB1c2VkIGZvciB0aGUgaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIgbG9vcC4KLVxlbmR7Y3ZhcmRlc2N9Ci0KLVxiZWdpbntjdHlwZWRlc2N9W1B5Q29tcGlsZXJGbGFnc117c3RydWN0IFB5Q29tcGlsZXJGbGFnc30KLSAgVGhpcyBpcyB0aGUgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCBjb21waWxlciBmbGFncy4gIEluIGNhc2VzIHdoZXJlCi0gIGNvZGUgaXMgb25seSBiZWluZyBjb21waWxlZCwgaXQgaXMgcGFzc2VkIGFzIFxjb2Rle2ludCBmbGFnc30sIGFuZCBpbgotICBjYXNlcyB3aGVyZSBjb2RlIGlzIGJlaW5nIGV4ZWN1dGVkLCBpdCBpcyBwYXNzZWQgYXMKLSAgXGNvZGV7UHlDb21waWxlckZsYWdzICpmbGFnc30uICBJbiB0aGlzIGNhc2UsIFxjb2Rle2Zyb20gX19mdXR1cmVfXwotICBpbXBvcnR9IGNhbiBtb2RpZnkgXHZhcntmbGFnc30uCi0KLSAgV2hlbmV2ZXIgXGNvZGV7UHlDb21waWxlckZsYWdzICpmbGFnc30gaXMgXE5VTEwsIFxtZW1iZXJ7Y2ZfZmxhZ3N9Ci0gIGlzIHRyZWF0ZWQgYXMgZXF1YWwgdG8gXGNvZGV7MH0sIGFuZCBhbnkgbW9kaWZpY2F0aW9uIGR1ZSB0bwotICBcY29kZXtmcm9tIF9fZnV0dXJlX18gaW1wb3J0fSBpcyBkaXNjYXJkZWQuCi1cYmVnaW57dmVyYmF0aW19Ci1zdHJ1Y3QgUHlDb21waWxlckZsYWdzIHsKLSAgICBpbnQgY2ZfZmxhZ3M7Ci19Ci1cZW5ke3ZlcmJhdGltfQotXGVuZHtjdHlwZWRlc2N9Ci0KLVxiZWdpbntjdmFyZGVzY317aW50fXtDT19GVVRVUkVfRElWSVNJT059Ci0gIFRoaXMgYml0IGNhbiBiZSBzZXQgaW4gXHZhcntmbGFnc30gdG8gY2F1c2UgZGl2aXNpb24gb3BlcmF0b3IgXGNvZGV7L30KLSAgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgYGB0cnVlIGRpdmlzaW9uJycgYWNjb3JkaW5nIHRvIFxwZXB7MjM4fS4KLVxlbmR7Y3ZhcmRlc2N9CmRpZmYgLS1naXQgYS9Eb2MvY29tbW9udGV4L2JvaWxlcnBsYXRlLnRleCBiL0RvYy9jb21tb250ZXgvYm9pbGVycGxhdGUudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGM5ZjQ4Li4wMDAwMDAwCi0tLSBhL0RvYy9jb21tb250ZXgvYm9pbGVycGxhdGUudGV4CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1cYXV0aG9ye0d1aWRvIHZhbiBSb3NzdW1cXAotCUZyZWQgTC4gRHJha2UsIEpyLiwgZWRpdG9yfQotXGF1dGhvcmFkZHJlc3N7Ci0JXHN0cm9uZ3tQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbn1cXAotCUVtYWlsOiBcZW1haWx7ZG9jc0BweXRob24ub3JnfQotfQotCi1cZGF0ZXtcdG9kYXl9CQkJJSBYWFggdXBkYXRlIGJlZm9yZSBmaW5hbCByZWxlYXNlIQotXGlucHV0e3BhdGNobGV2ZWx9CQklIGluY2x1ZGUgUHl0aG9uIHZlcnNpb24gaW5mb3JtYXRpb24KZGlmZiAtLWdpdCBhL0RvYy9jb21tb250ZXgvY29weXJpZ2h0LnRleCBiL0RvYy9jb21tb250ZXgvY29weXJpZ2h0LnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U3MGQwYy4uMDAwMDAwMAotLS0gYS9Eb2MvY29tbW9udGV4L2NvcHlyaWdodC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1Db3B5cmlnaHQgXGNvcHlyaWdodHt9IDIwMDEtMjAwNyBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLUNvcHlyaWdodCBcY29weXJpZ2h0e30gMjAwMCBCZU9wZW4uY29tLgotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotQ29weXJpZ2h0IFxjb3B5cmlnaHR7fSAxOTk1LTIwMDAgQ29ycG9yYXRpb24gZm9yIE5hdGlvbmFsIFJlc2VhcmNoIEluaXRpYXRpdmVzLgotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotQ29weXJpZ2h0IFxjb3B5cmlnaHR7fSAxOTkxLTE5OTUgU3RpY2h0aW5nIE1hdGhlbWF0aXNjaCBDZW50cnVtLgotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotU2VlIHRoZSBlbmQgb2YgdGhpcyBkb2N1bWVudCBmb3IgY29tcGxldGUgbGljZW5zZSBhbmQgcGVybWlzc2lvbnMKLWluZm9ybWF0aW9uLgpkaWZmIC0tZ2l0IGEvRG9jL2NvbW1vbnRleC9saWNlbnNlLnRleCBiL0RvYy9jb21tb250ZXgvbGljZW5zZS50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNjQ4NWMuLjAwMDAwMDAKLS0tIGEvRG9jL2NvbW1vbnRleC9saWNlbnNlLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDY3NCArMCwwIEBACi1cc2VjdGlvbntIaXN0b3J5IG9mIHRoZSBzb2Z0d2FyZX0KLQotUHl0aG9uIHdhcyBjcmVhdGVkIGluIHRoZSBlYXJseSAxOTkwcyBieSBHdWlkbyB2YW4gUm9zc3VtIGF0IFN0aWNodGluZwotTWF0aGVtYXRpc2NoIENlbnRydW0gKENXSSwgc2VlIFx1cmx7aHR0cDovL3d3dy5jd2kubmwvfSkgaW4gdGhlIE5ldGhlcmxhbmRzCi1hcyBhIHN1Y2Nlc3NvciBvZiBhIGxhbmd1YWdlIGNhbGxlZCBBQkMuICBHdWlkbyByZW1haW5zIFB5dGhvbidzCi1wcmluY2lwYWwgYXV0aG9yLCBhbHRob3VnaCBpdCBpbmNsdWRlcyBtYW55IGNvbnRyaWJ1dGlvbnMgZnJvbSBvdGhlcnMuCi0KLUluIDE5OTUsIEd1aWRvIGNvbnRpbnVlZCBoaXMgd29yayBvbiBQeXRob24gYXQgdGhlIENvcnBvcmF0aW9uIGZvcgotTmF0aW9uYWwgUmVzZWFyY2ggSW5pdGlhdGl2ZXMgKENOUkksIHNlZSBcdXJse2h0dHA6Ly93d3cuY25yaS5yZXN0b24udmEudXMvfSkKLWluIFJlc3RvbiwgVmlyZ2luaWEgd2hlcmUgaGUgcmVsZWFzZWQgc2V2ZXJhbCB2ZXJzaW9ucyBvZiB0aGUKLXNvZnR3YXJlLgotCi1JbiBNYXkgMjAwMCwgR3VpZG8gYW5kIHRoZSBQeXRob24gY29yZSBkZXZlbG9wbWVudCB0ZWFtIG1vdmVkIHRvCi1CZU9wZW4uY29tIHRvIGZvcm0gdGhlIEJlT3BlbiBQeXRob25MYWJzIHRlYW0uICBJbiBPY3RvYmVyIG9mIHRoZSBzYW1lCi15ZWFyLCB0aGUgUHl0aG9uTGFicyB0ZWFtIG1vdmVkIHRvIERpZ2l0YWwgQ3JlYXRpb25zIChub3cgWm9wZQotQ29ycG9yYXRpb247IHNlZSBcdXJse2h0dHA6Ly93d3cuem9wZS5jb20vfSkuICBJbiAyMDAxLCB0aGUgUHl0aG9uCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uIChQU0YsIHNlZSBcdXJse2h0dHA6Ly93d3cucHl0aG9uLm9yZy9wc2YvfSkgd2FzCi1mb3JtZWQsIGEgbm9uLXByb2ZpdCBvcmdhbml6YXRpb24gY3JlYXRlZCBzcGVjaWZpY2FsbHkgdG8gb3duCi1QeXRob24tcmVsYXRlZCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuICBab3BlIENvcnBvcmF0aW9uIGlzIGEKLXNwb25zb3JpbmcgbWVtYmVyIG9mIHRoZSBQU0YuCi0KLUFsbCBQeXRob24gcmVsZWFzZXMgYXJlIE9wZW4gU291cmNlIChzZWUKLVx1cmx7aHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy99IGZvciB0aGUgT3BlbiBTb3VyY2UgRGVmaW5pdGlvbikuCi1IaXN0b3JpY2FsbHksIG1vc3QsIGJ1dCBub3QgYWxsLCBQeXRob24gcmVsZWFzZXMgaGF2ZSBhbHNvIGJlZW4KLUdQTC1jb21wYXRpYmxlOyB0aGUgdGFibGUgYmVsb3cgc3VtbWFyaXplcyB0aGUgdmFyaW91cyByZWxlYXNlcy4KLQotXGJlZ2lue3RhYmxldn17Y3xjfGN8Y3xjfXt0ZXh0cm19JQotICB7UmVsZWFzZX17RGVyaXZlZCBmcm9tfXtZZWFyfXtPd25lcn17R1BMIGNvbXBhdGlibGU/fQotICBcbGluZXZ7MC45LjAgdGhydSAxLjJ9e24vYX17MTk5MS0xOTk1fXtDV0l9e3llc30KLSAgXGxpbmV2ezEuMyB0aHJ1IDEuNS4yfXsxLjJ9ezE5OTUtMTk5OX17Q05SSX17eWVzfQotICBcbGluZXZ7MS42fXsxLjUuMn17MjAwMH17Q05SSX17bm99Ci0gIFxsaW5ldnsyLjB9ezEuNn17MjAwMH17QmVPcGVuLmNvbX17bm99Ci0gIFxsaW5ldnsxLjYuMX17MS42fXsyMDAxfXtDTlJJfXtub30KLSAgXGxpbmV2ezIuMX17Mi4wKzEuNi4xfXsyMDAxfXtQU0Z9e25vfQotICBcbGluZXZ7Mi4wLjF9ezIuMCsxLjYuMX17MjAwMX17UFNGfXt5ZXN9Ci0gIFxsaW5ldnsyLjEuMX17Mi4xKzIuMC4xfXsyMDAxfXtQU0Z9e3llc30KLSAgXGxpbmV2ezIuMn17Mi4xLjF9ezIwMDF9e1BTRn17eWVzfQotICBcbGluZXZ7Mi4xLjJ9ezIuMS4xfXsyMDAyfXtQU0Z9e3llc30KLSAgXGxpbmV2ezIuMS4zfXsyLjEuMn17MjAwMn17UFNGfXt5ZXN9Ci0gIFxsaW5ldnsyLjIuMX17Mi4yfXsyMDAyfXtQU0Z9e3llc30KLSAgXGxpbmV2ezIuMi4yfXsyLjIuMX17MjAwMn17UFNGfXt5ZXN9Ci0gIFxsaW5ldnsyLjIuM317Mi4yLjJ9ezIwMDItMjAwM317UFNGfXt5ZXN9Ci0gIFxsaW5ldnsyLjN9ezIuMi4yfXsyMDAyLTIwMDN9e1BTRn17eWVzfQotICBcbGluZXZ7Mi4zLjF9ezIuM317MjAwMi0yMDAzfXtQU0Z9e3llc30KLSAgXGxpbmV2ezIuMy4yfXsyLjMuMX17MjAwM317UFNGfXt5ZXN9Ci0gIFxsaW5ldnsyLjMuM317Mi4zLjJ9ezIwMDN9e1BTRn17eWVzfQotICBcbGluZXZ7Mi4zLjR9ezIuMy4zfXsyMDA0fXtQU0Z9e3llc30KLSAgXGxpbmV2ezIuMy41fXsyLjMuNH17MjAwNX17UFNGfXt5ZXN9Ci0gIFxsaW5ldnsyLjR9ezIuM317MjAwNH17UFNGfXt5ZXN9Ci0gIFxsaW5ldnsyLjQuMX17Mi40fXsyMDA1fXtQU0Z9e3llc30KLSAgXGxpbmV2ezIuNC4yfXsyLjQuMX17MjAwNX17UFNGfXt5ZXN9Ci0gIFxsaW5ldnsyLjQuM317Mi40LjJ9ezIwMDZ9e1BTRn17eWVzfQotICBcbGluZXZ7Mi40LjR9ezIuNC4zfXsyMDA2fXtQU0Z9e3llc30KLSAgXGxpbmV2ezIuNX17Mi40fXsyMDA2fXtQU0Z9e3llc30KLSAgXGxpbmV2ezIuNS4xfXsyLjV9ezIwMDd9e1BTRn17eWVzfQotXGVuZHt0YWJsZXZ9Ci0KLVxub3Rle0dQTC1jb21wYXRpYmxlIGRvZXNuJ3QgbWVhbiB0aGF0IHdlJ3JlIGRpc3RyaWJ1dGluZwotUHl0aG9uIHVuZGVyIHRoZSBHUEwuICBBbGwgUHl0aG9uIGxpY2Vuc2VzLCB1bmxpa2UgdGhlIEdQTCwgbGV0IHlvdQotZGlzdHJpYnV0ZSBhIG1vZGlmaWVkIHZlcnNpb24gd2l0aG91dCBtYWtpbmcgeW91ciBjaGFuZ2VzIG9wZW4gc291cmNlLgotVGhlIEdQTC1jb21wYXRpYmxlIGxpY2Vuc2VzIG1ha2UgaXQgcG9zc2libGUgdG8gY29tYmluZSBQeXRob24gd2l0aAotb3RoZXIgc29mdHdhcmUgdGhhdCBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMOyB0aGUgb3RoZXJzIGRvbid0Ln0KLQotVGhhbmtzIHRvIHRoZSBtYW55IG91dHNpZGUgdm9sdW50ZWVycyB3aG8gaGF2ZSB3b3JrZWQgdW5kZXIgR3VpZG8ncwotZGlyZWN0aW9uIHRvIG1ha2UgdGhlc2UgcmVsZWFzZXMgcG9zc2libGUuCi0KLQotXHNlY3Rpb257VGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGFjY2Vzc2luZyBvciBvdGhlcndpc2UgdXNpbmcgUHl0aG9ufQotCi1cY2VudGVybGluZXtcc3Ryb25ne1BTRiBMSUNFTlNFIEFHUkVFTUVOVCBGT1IgUFlUSE9OIFx2ZXJzaW9ufX0KLQotXGJlZ2lue2VudW1lcmF0ZX0KLVxpdGVtCi1UaGlzIExJQ0VOU0UgQUdSRUVNRU5UIGlzIGJldHdlZW4gdGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0oYGBQU0YnJyksIGFuZCB0aGUgSW5kaXZpZHVhbCBvciBPcmdhbml6YXRpb24gKGBgTGljZW5zZWUnJykgYWNjZXNzaW5nCi1hbmQgb3RoZXJ3aXNlIHVzaW5nIFB5dGhvbiBcdmVyc2lvbnt9IHNvZnR3YXJlIGluIHNvdXJjZSBvciBiaW5hcnkKLWZvcm0gYW5kIGl0cyBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24uCi0KLVxpdGVtCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UgQWdyZWVtZW50LCBQU0YKLWhlcmVieSBncmFudHMgTGljZW5zZWUgYSBub25leGNsdXNpdmUsIHJveWFsdHktZnJlZSwgd29ybGQtd2lkZQotbGljZW5zZSB0byByZXByb2R1Y2UsIGFuYWx5emUsIHRlc3QsIHBlcmZvcm0gYW5kL29yIGRpc3BsYXkgcHVibGljbHksCi1wcmVwYXJlIGRlcml2YXRpdmUgd29ya3MsIGRpc3RyaWJ1dGUsIGFuZCBvdGhlcndpc2UgdXNlIFB5dGhvbgotXHZlcnNpb257fSBhbG9uZSBvciBpbiBhbnkgZGVyaXZhdGl2ZSB2ZXJzaW9uLCBwcm92aWRlZCwgaG93ZXZlciwgdGhhdAotUFNGJ3MgTGljZW5zZSBBZ3JlZW1lbnQgYW5kIFBTRidzIG5vdGljZSBvZiBjb3B5cmlnaHQsIGkuZS4sCi1gYENvcHlyaWdodCBcY29weXJpZ2h0e30gMjAwMS0yMDA3IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBBbGwKLVJpZ2h0cyBSZXNlcnZlZCcnIGFyZSByZXRhaW5lZCBpbiBQeXRob24gXHZlcnNpb257fSBhbG9uZSBvciBpbiBhbnkKLWRlcml2YXRpdmUgdmVyc2lvbiBwcmVwYXJlZCBieSBMaWNlbnNlZS4KLQotXGl0ZW0KLUluIHRoZSBldmVudCBMaWNlbnNlZSBwcmVwYXJlcyBhIGRlcml2YXRpdmUgd29yayB0aGF0IGlzIGJhc2VkIG9uCi1vciBpbmNvcnBvcmF0ZXMgUHl0aG9uIFx2ZXJzaW9ue30gb3IgYW55IHBhcnQgdGhlcmVvZiwgYW5kIHdhbnRzIHRvCi1tYWtlIHRoZSBkZXJpdmF0aXZlIHdvcmsgYXZhaWxhYmxlIHRvIG90aGVycyBhcyBwcm92aWRlZCBoZXJlaW4sIHRoZW4KLUxpY2Vuc2VlIGhlcmVieSBhZ3JlZXMgdG8gaW5jbHVkZSBpbiBhbnkgc3VjaCB3b3JrIGEgYnJpZWYgc3VtbWFyeSBvZgotdGhlIGNoYW5nZXMgbWFkZSB0byBQeXRob24gXHZlcnNpb24uCi0KLVxpdGVtCi1QU0YgaXMgbWFraW5nIFB5dGhvbiBcdmVyc2lvbnt9IGF2YWlsYWJsZSB0byBMaWNlbnNlZSBvbiBhbiBgYEFTIElTJycKLWJhc2lzLiAgUFNGIE1BS0VTIE5PIFJFUFJFU0VOVEFUSU9OUyBPUiBXQVJSQU5USUVTLCBFWFBSRVNTIE9SCi1JTVBMSUVELiAgQlkgV0FZIE9GIEVYQU1QTEUsIEJVVCBOT1QgTElNSVRBVElPTiwgUFNGIE1BS0VTIE5PIEFORAotRElTQ0xBSU1TIEFOWSBSRVBSRVNFTlRBVElPTiBPUiBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUwotRk9SIEFOWSBQQVJUSUNVTEFSIFBVUlBPU0UgT1IgVEhBVCBUSEUgVVNFIE9GIFBZVEhPTiBcdmVyc2lvbnt9IFdJTEwKLU5PVCBJTkZSSU5HRSBBTlkgVEhJUkQgUEFSVFkgUklHSFRTLgotCi1caXRlbQotUFNGIFNIQUxMIE5PVCBCRSBMSUFCTEUgVE8gTElDRU5TRUUgT1IgQU5ZIE9USEVSIFVTRVJTIE9GIFBZVEhPTgotXHZlcnNpb257fSBGT1IgQU5ZIElOQ0lERU5UQUwsIFNQRUNJQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgotTE9TUyBBUyBBIFJFU1VMVCBPRiBNT0RJRllJTkcsIERJU1RSSUJVVElORywgT1IgT1RIRVJXSVNFIFVTSU5HIFBZVEhPTgotXHZlcnNpb24sIE9SIEFOWSBERVJJVkFUSVZFIFRIRVJFT0YsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLVBPU1NJQklMSVRZIFRIRVJFT0YuCi0KLVxpdGVtCi1UaGlzIExpY2Vuc2UgQWdyZWVtZW50IHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgdXBvbiBhIG1hdGVyaWFsCi1icmVhY2ggb2YgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zLgotCi1caXRlbQotTm90aGluZyBpbiB0aGlzIExpY2Vuc2UgQWdyZWVtZW50IHNoYWxsIGJlIGRlZW1lZCB0byBjcmVhdGUgYW55Ci1yZWxhdGlvbnNoaXAgb2YgYWdlbmN5LCBwYXJ0bmVyc2hpcCwgb3Igam9pbnQgdmVudHVyZSBiZXR3ZWVuIFBTRiBhbmQKLUxpY2Vuc2VlLiAgVGhpcyBMaWNlbnNlIEFncmVlbWVudCBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSBQU0YKLXRyYWRlbWFya3Mgb3IgdHJhZGUgbmFtZSBpbiBhIHRyYWRlbWFyayBzZW5zZSB0byBlbmRvcnNlIG9yIHByb21vdGUKLXByb2R1Y3RzIG9yIHNlcnZpY2VzIG9mIExpY2Vuc2VlLCBvciBhbnkgdGhpcmQgcGFydHkuCi0KLVxpdGVtCi1CeSBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIG90aGVyd2lzZSB1c2luZyBQeXRob24gXHZlcnNpb24sIExpY2Vuc2VlCi1hZ3JlZXMgdG8gYmUgYm91bmQgYnkgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZQotQWdyZWVtZW50LgotXGVuZHtlbnVtZXJhdGV9Ci0KLQotXGNlbnRlcmxpbmV7XHN0cm9uZ3tCRU9QRU4uQ09NIExJQ0VOU0UgQUdSRUVNRU5UIEZPUiBQWVRIT04gMi4wfX0KLQotXGNlbnRlcmxpbmV7XHN0cm9uZ3tCRU9QRU4gUFlUSE9OIE9QRU4gU09VUkNFIExJQ0VOU0UgQUdSRUVNRU5UIFZFUlNJT04gMX19Ci0KLVxiZWdpbntlbnVtZXJhdGV9Ci1caXRlbQotVGhpcyBMSUNFTlNFIEFHUkVFTUVOVCBpcyBiZXR3ZWVuIEJlT3Blbi5jb20gKGBgQmVPcGVuJycpLCBoYXZpbmcgYW4KLW9mZmljZSBhdCAxNjAgU2FyYXRvZ2EgQXZlbnVlLCBTYW50YSBDbGFyYSwgQ0EgOTUwNTEsIGFuZCB0aGUKLUluZGl2aWR1YWwgb3IgT3JnYW5pemF0aW9uIChgYExpY2Vuc2VlJycpIGFjY2Vzc2luZyBhbmQgb3RoZXJ3aXNlCi11c2luZyB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybSBhbmQgaXRzIGFzc29jaWF0ZWQKLWRvY3VtZW50YXRpb24gKGBgdGhlIFNvZnR3YXJlJycpLgotCi1caXRlbQotU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBCZU9wZW4gUHl0aG9uIExpY2Vuc2UKLUFncmVlbWVudCwgQmVPcGVuIGhlcmVieSBncmFudHMgTGljZW5zZWUgYSBub24tZXhjbHVzaXZlLAotcm95YWx0eS1mcmVlLCB3b3JsZC13aWRlIGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBhbmFseXplLCB0ZXN0LCBwZXJmb3JtCi1hbmQvb3IgZGlzcGxheSBwdWJsaWNseSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzLCBkaXN0cmlidXRlLCBhbmQKLW90aGVyd2lzZSB1c2UgdGhlIFNvZnR3YXJlIGFsb25lIG9yIGluIGFueSBkZXJpdmF0aXZlIHZlcnNpb24sCi1wcm92aWRlZCwgaG93ZXZlciwgdGhhdCB0aGUgQmVPcGVuIFB5dGhvbiBMaWNlbnNlIGlzIHJldGFpbmVkIGluIHRoZQotU29mdHdhcmUsIGFsb25lIG9yIGluIGFueSBkZXJpdmF0aXZlIHZlcnNpb24gcHJlcGFyZWQgYnkgTGljZW5zZWUuCi0KLVxpdGVtCi1CZU9wZW4gaXMgbWFraW5nIHRoZSBTb2Z0d2FyZSBhdmFpbGFibGUgdG8gTGljZW5zZWUgb24gYW4gYGBBUyBJUycnCi1iYXNpcy4gIEJFT1BFTiBNQUtFUyBOTyBSRVBSRVNFTlRBVElPTlMgT1IgV0FSUkFOVElFUywgRVhQUkVTUyBPUgotSU1QTElFRC4gIEJZIFdBWSBPRiBFWEFNUExFLCBCVVQgTk9UIExJTUlUQVRJT04sIEJFT1BFTiBNQUtFUyBOTyBBTkQKLURJU0NMQUlNUyBBTlkgUkVQUkVTRU5UQVRJT04gT1IgV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MKLUZPUiBBTlkgUEFSVElDVUxBUiBQVVJQT1NFIE9SIFRIQVQgVEhFIFVTRSBPRiBUSEUgU09GVFdBUkUgV0lMTCBOT1QKLUlORlJJTkdFIEFOWSBUSElSRCBQQVJUWSBSSUdIVFMuCi0KLVxpdGVtCi1CRU9QRU4gU0hBTEwgTk9UIEJFIExJQUJMRSBUTyBMSUNFTlNFRSBPUiBBTlkgT1RIRVIgVVNFUlMgT0YgVEhFCi1TT0ZUV0FSRSBGT1IgQU5ZIElOQ0lERU5UQUwsIFNQRUNJQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBMT1NTCi1BUyBBIFJFU1VMVCBPRiBVU0lORywgTU9ESUZZSU5HIE9SIERJU1RSSUJVVElORyBUSEUgU09GVFdBUkUsIE9SIEFOWQotREVSSVZBVElWRSBUSEVSRU9GLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIFRIRVJFT0YuCi0KLVxpdGVtCi1UaGlzIExpY2Vuc2UgQWdyZWVtZW50IHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgdXBvbiBhIG1hdGVyaWFsCi1icmVhY2ggb2YgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zLgotCi1caXRlbQotVGhpcyBMaWNlbnNlIEFncmVlbWVudCBzaGFsbCBiZSBnb3Zlcm5lZCBieSBhbmQgaW50ZXJwcmV0ZWQgaW4gYWxsCi1yZXNwZWN0cyBieSB0aGUgbGF3IG9mIHRoZSBTdGF0ZSBvZiBDYWxpZm9ybmlhLCBleGNsdWRpbmcgY29uZmxpY3Qgb2YKLWxhdyBwcm92aXNpb25zLiAgTm90aGluZyBpbiB0aGlzIExpY2Vuc2UgQWdyZWVtZW50IHNoYWxsIGJlIGRlZW1lZCB0bwotY3JlYXRlIGFueSByZWxhdGlvbnNoaXAgb2YgYWdlbmN5LCBwYXJ0bmVyc2hpcCwgb3Igam9pbnQgdmVudHVyZQotYmV0d2VlbiBCZU9wZW4gYW5kIExpY2Vuc2VlLiAgVGhpcyBMaWNlbnNlIEFncmVlbWVudCBkb2VzIG5vdCBncmFudAotcGVybWlzc2lvbiB0byB1c2UgQmVPcGVuIHRyYWRlbWFya3Mgb3IgdHJhZGUgbmFtZXMgaW4gYSB0cmFkZW1hcmsKLXNlbnNlIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBvciBzZXJ2aWNlcyBvZiBMaWNlbnNlZSwgb3IgYW55Ci10aGlyZCBwYXJ0eS4gIEFzIGFuIGV4Y2VwdGlvbiwgdGhlIGBgQmVPcGVuIFB5dGhvbicnIGxvZ29zIGF2YWlsYWJsZQotYXQgaHR0cDovL3d3dy5weXRob25sYWJzLmNvbS9sb2dvcy5odG1sIG1heSBiZSB1c2VkIGFjY29yZGluZyB0byB0aGUKLXBlcm1pc3Npb25zIGdyYW50ZWQgb24gdGhhdCB3ZWIgcGFnZS4KLQotXGl0ZW0KLUJ5IGNvcHlpbmcsIGluc3RhbGxpbmcgb3Igb3RoZXJ3aXNlIHVzaW5nIHRoZSBzb2Z0d2FyZSwgTGljZW5zZWUKLWFncmVlcyB0byBiZSBib3VuZCBieSB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlCi1BZ3JlZW1lbnQuCi1cZW5ke2VudW1lcmF0ZX0KLQotCi1cY2VudGVybGluZXtcc3Ryb25ne0NOUkkgTElDRU5TRSBBR1JFRU1FTlQgRk9SIFBZVEhPTiAxLjYuMX19Ci0KLVxiZWdpbntlbnVtZXJhdGV9Ci1caXRlbQotVGhpcyBMSUNFTlNFIEFHUkVFTUVOVCBpcyBiZXR3ZWVuIHRoZSBDb3Jwb3JhdGlvbiBmb3IgTmF0aW9uYWwKLVJlc2VhcmNoIEluaXRpYXRpdmVzLCBoYXZpbmcgYW4gb2ZmaWNlIGF0IDE4OTUgUHJlc3RvbiBXaGl0ZSBEcml2ZSwKLVJlc3RvbiwgVkEgMjAxOTEgKGBgQ05SSScnKSwgYW5kIHRoZSBJbmRpdmlkdWFsIG9yIE9yZ2FuaXphdGlvbgotKGBgTGljZW5zZWUnJykgYWNjZXNzaW5nIGFuZCBvdGhlcndpc2UgdXNpbmcgUHl0aG9uIDEuNi4xIHNvZnR3YXJlIGluCi1zb3VyY2Ugb3IgYmluYXJ5IGZvcm0gYW5kIGl0cyBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24uCi0KLVxpdGVtCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UgQWdyZWVtZW50LCBDTlJJCi1oZXJlYnkgZ3JhbnRzIExpY2Vuc2VlIGEgbm9uZXhjbHVzaXZlLCByb3lhbHR5LWZyZWUsIHdvcmxkLXdpZGUKLWxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBhbmFseXplLCB0ZXN0LCBwZXJmb3JtIGFuZC9vciBkaXNwbGF5IHB1YmxpY2x5LAotcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzLCBkaXN0cmlidXRlLCBhbmQgb3RoZXJ3aXNlIHVzZSBQeXRob24gMS42LjEKLWFsb25lIG9yIGluIGFueSBkZXJpdmF0aXZlIHZlcnNpb24sIHByb3ZpZGVkLCBob3dldmVyLCB0aGF0IENOUkkncwotTGljZW5zZSBBZ3JlZW1lbnQgYW5kIENOUkkncyBub3RpY2Ugb2YgY29weXJpZ2h0LCBpLmUuLCBgYENvcHlyaWdodAotXGNvcHlyaWdodHt9IDE5OTUtMjAwMSBDb3Jwb3JhdGlvbiBmb3IgTmF0aW9uYWwgUmVzZWFyY2ggSW5pdGlhdGl2ZXM7Ci1BbGwgUmlnaHRzIFJlc2VydmVkJycgYXJlIHJldGFpbmVkIGluIFB5dGhvbiAxLjYuMSBhbG9uZSBvciBpbiBhbnkKLWRlcml2YXRpdmUgdmVyc2lvbiBwcmVwYXJlZCBieSBMaWNlbnNlZS4gIEFsdGVybmF0ZWx5LCBpbiBsaWV1IG9mCi1DTlJJJ3MgTGljZW5zZSBBZ3JlZW1lbnQsIExpY2Vuc2VlIG1heSBzdWJzdGl0dXRlIHRoZSBmb2xsb3dpbmcgdGV4dAotKG9taXR0aW5nIHRoZSBxdW90ZXMpOiBgYFB5dGhvbiAxLjYuMSBpcyBtYWRlIGF2YWlsYWJsZSBzdWJqZWN0IHRvIHRoZQotdGVybXMgYW5kIGNvbmRpdGlvbnMgaW4gQ05SSSdzIExpY2Vuc2UgQWdyZWVtZW50LiAgVGhpcyBBZ3JlZW1lbnQKLXRvZ2V0aGVyIHdpdGggUHl0aG9uIDEuNi4xIG1heSBiZSBsb2NhdGVkIG9uIHRoZSBJbnRlcm5ldCB1c2luZyB0aGUKLWZvbGxvd2luZyB1bmlxdWUsIHBlcnNpc3RlbnQgaWRlbnRpZmllciAoa25vd24gYXMgYSBoYW5kbGUpOgotMTg5NS4yMi8xMDEzLiAgVGhpcyBBZ3JlZW1lbnQgbWF5IGFsc28gYmUgb2J0YWluZWQgZnJvbSBhIHByb3h5IHNlcnZlcgotb24gdGhlIEludGVybmV0IHVzaW5nIHRoZSBmb2xsb3dpbmcgVVJMOgotXHVybHtodHRwOi8vaGRsLmhhbmRsZS5uZXQvMTg5NS4yMi8xMDEzfS4nJwotCi1caXRlbQotSW4gdGhlIGV2ZW50IExpY2Vuc2VlIHByZXBhcmVzIGEgZGVyaXZhdGl2ZSB3b3JrIHRoYXQgaXMgYmFzZWQgb24KLW9yIGluY29ycG9yYXRlcyBQeXRob24gMS42LjEgb3IgYW55IHBhcnQgdGhlcmVvZiwgYW5kIHdhbnRzIHRvIG1ha2UKLXRoZSBkZXJpdmF0aXZlIHdvcmsgYXZhaWxhYmxlIHRvIG90aGVycyBhcyBwcm92aWRlZCBoZXJlaW4sIHRoZW4KLUxpY2Vuc2VlIGhlcmVieSBhZ3JlZXMgdG8gaW5jbHVkZSBpbiBhbnkgc3VjaCB3b3JrIGEgYnJpZWYgc3VtbWFyeSBvZgotdGhlIGNoYW5nZXMgbWFkZSB0byBQeXRob24gMS42LjEuCi0KLVxpdGVtCi1DTlJJIGlzIG1ha2luZyBQeXRob24gMS42LjEgYXZhaWxhYmxlIHRvIExpY2Vuc2VlIG9uIGFuIGBgQVMgSVMnJwotYmFzaXMuICBDTlJJIE1BS0VTIE5PIFJFUFJFU0VOVEFUSU9OUyBPUiBXQVJSQU5USUVTLCBFWFBSRVNTIE9SCi1JTVBMSUVELiAgQlkgV0FZIE9GIEVYQU1QTEUsIEJVVCBOT1QgTElNSVRBVElPTiwgQ05SSSBNQUtFUyBOTyBBTkQKLURJU0NMQUlNUyBBTlkgUkVQUkVTRU5UQVRJT04gT1IgV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MKLUZPUiBBTlkgUEFSVElDVUxBUiBQVVJQT1NFIE9SIFRIQVQgVEhFIFVTRSBPRiBQWVRIT04gMS42LjEgV0lMTCBOT1QKLUlORlJJTkdFIEFOWSBUSElSRCBQQVJUWSBSSUdIVFMuCi0KLVxpdGVtCi1DTlJJIFNIQUxMIE5PVCBCRSBMSUFCTEUgVE8gTElDRU5TRUUgT1IgQU5ZIE9USEVSIFVTRVJTIE9GIFBZVEhPTgotMS42LjEgRk9SIEFOWSBJTkNJREVOVEFMLCBTUEVDSUFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgTE9TUyBBUwotQSBSRVNVTFQgT0YgTU9ESUZZSU5HLCBESVNUUklCVVRJTkcsIE9SIE9USEVSV0lTRSBVU0lORyBQWVRIT04gMS42LjEsCi1PUiBBTlkgREVSSVZBVElWRSBUSEVSRU9GLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIFRIRVJFT0YuCi0KLVxpdGVtCi1UaGlzIExpY2Vuc2UgQWdyZWVtZW50IHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgdXBvbiBhIG1hdGVyaWFsCi1icmVhY2ggb2YgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zLgotCi1caXRlbQotVGhpcyBMaWNlbnNlIEFncmVlbWVudCBzaGFsbCBiZSBnb3Zlcm5lZCBieSB0aGUgZmVkZXJhbAotaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhdyBvZiB0aGUgVW5pdGVkIFN0YXRlcywgaW5jbHVkaW5nIHdpdGhvdXQKLWxpbWl0YXRpb24gdGhlIGZlZGVyYWwgY29weXJpZ2h0IGxhdywgYW5kLCB0byB0aGUgZXh0ZW50IHN1Y2gKLVUuUy4gZmVkZXJhbCBsYXcgZG9lcyBub3QgYXBwbHksIGJ5IHRoZSBsYXcgb2YgdGhlIENvbW1vbndlYWx0aCBvZgotVmlyZ2luaWEsIGV4Y2x1ZGluZyBWaXJnaW5pYSdzIGNvbmZsaWN0IG9mIGxhdyBwcm92aXNpb25zLgotTm90d2l0aHN0YW5kaW5nIHRoZSBmb3JlZ29pbmcsIHdpdGggcmVnYXJkIHRvIGRlcml2YXRpdmUgd29ya3MgYmFzZWQKLW9uIFB5dGhvbiAxLjYuMSB0aGF0IGluY29ycG9yYXRlIG5vbi1zZXBhcmFibGUgbWF0ZXJpYWwgdGhhdCB3YXMKLXByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLCB0aGUKLWxhdyBvZiB0aGUgQ29tbW9ud2VhbHRoIG9mIFZpcmdpbmlhIHNoYWxsIGdvdmVybiB0aGlzIExpY2Vuc2UKLUFncmVlbWVudCBvbmx5IGFzIHRvIGlzc3VlcyBhcmlzaW5nIHVuZGVyIG9yIHdpdGggcmVzcGVjdCB0bwotUGFyYWdyYXBocyA0LCA1LCBhbmQgNyBvZiB0aGlzIExpY2Vuc2UgQWdyZWVtZW50LiAgTm90aGluZyBpbiB0aGlzCi1MaWNlbnNlIEFncmVlbWVudCBzaGFsbCBiZSBkZWVtZWQgdG8gY3JlYXRlIGFueSByZWxhdGlvbnNoaXAgb2YKLWFnZW5jeSwgcGFydG5lcnNoaXAsIG9yIGpvaW50IHZlbnR1cmUgYmV0d2VlbiBDTlJJIGFuZCBMaWNlbnNlZS4gIFRoaXMKLUxpY2Vuc2UgQWdyZWVtZW50IGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIENOUkkgdHJhZGVtYXJrcyBvcgotdHJhZGUgbmFtZSBpbiBhIHRyYWRlbWFyayBzZW5zZSB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgb3IKLXNlcnZpY2VzIG9mIExpY2Vuc2VlLCBvciBhbnkgdGhpcmQgcGFydHkuCi0KLVxpdGVtCi1CeSBjbGlja2luZyBvbiB0aGUgYGBBQ0NFUFQnJyBidXR0b24gd2hlcmUgaW5kaWNhdGVkLCBvciBieSBjb3B5aW5nLAotaW5zdGFsbGluZyBvciBvdGhlcndpc2UgdXNpbmcgUHl0aG9uIDEuNi4xLCBMaWNlbnNlZSBhZ3JlZXMgdG8gYmUKLWJvdW5kIGJ5IHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UgQWdyZWVtZW50LgotXGVuZHtlbnVtZXJhdGV9Ci0KLVxjZW50ZXJsaW5le0FDQ0VQVH0KLQotCi0KLVxjZW50ZXJsaW5le1xzdHJvbmd7Q1dJIExJQ0VOU0UgQUdSRUVNRU5UIEZPUiBQWVRIT04gMC45LjAgVEhST1VHSCAxLjJ9fQotCi1Db3B5cmlnaHQgXGNvcHlyaWdodHt9IDE5OTEgLSAxOTk1LCBTdGljaHRpbmcgTWF0aGVtYXRpc2NoIENlbnRydW0KLUFtc3RlcmRhbSwgVGhlIE5ldGhlcmxhbmRzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi1kb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCi1wcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci1ib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLXN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgU3RpY2h0aW5nIE1hdGhlbWF0aXNjaAotQ2VudHJ1bSBvciBDV0kgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8KLWRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvcgotcGVybWlzc2lvbi4KLQotU1RJQ0hUSU5HIE1BVEhFTUFUSVNDSCBDRU5UUlVNIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgU1RJQ0hUSU5HIE1BVEhFTUFUSVNDSCBDRU5UUlVNIEJFIExJQUJMRQotRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLVdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQKLU9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0KLQotXHNlY3Rpb257TGljZW5zZXMgYW5kIEFja25vd2xlZGdlbWVudHMgZm9yIEluY29ycG9yYXRlZCBTb2Z0d2FyZX0KLQotVGhpcyBzZWN0aW9uIGlzIGFuIGluY29tcGxldGUsIGJ1dCBncm93aW5nIGxpc3Qgb2YgbGljZW5zZXMgYW5kCi1hY2tub3dsZWRnZW1lbnRzIGZvciB0aGlyZC1wYXJ0eSBzb2Z0d2FyZSBpbmNvcnBvcmF0ZWQgaW4gdGhlCi1QeXRob24gZGlzdHJpYnV0aW9uLgotCi0KLVxzdWJzZWN0aW9ue01lcnNlbm5lIFR3aXN0ZXJ9Ci0KLVRoZSBcbW9kdWxle19yYW5kb219IG1vZHVsZSBpbmNsdWRlcyBjb2RlIGJhc2VkIG9uIGEgZG93bmxvYWQgZnJvbQotXHVybHtodHRwOi8vd3d3Lm1hdGgua2Vpby5hYy5qcC9+bWF0dW1vdG8vTVQyMDAyL2VtdDE5OTM3YXIuaHRtbH0uCi1UaGUgZm9sbG93aW5nIGFyZSB0aGUgdmVyYmF0aW0gY29tbWVudHMgZnJvbSB0aGUgb3JpZ2luYWwgY29kZToKLQotXGJlZ2lue3ZlcmJhdGltfQotQSBDLXByb2dyYW0gZm9yIE1UMTk5MzcsIHdpdGggaW5pdGlhbGl6YXRpb24gaW1wcm92ZWQgMjAwMi8xLzI2LgotQ29kZWQgYnkgVGFrdWppIE5pc2hpbXVyYSBhbmQgTWFrb3RvIE1hdHN1bW90by4KLQotQmVmb3JlIHVzaW5nLCBpbml0aWFsaXplIHRoZSBzdGF0ZSBieSB1c2luZyBpbml0X2dlbnJhbmQoc2VlZCkKLW9yIGluaXRfYnlfYXJyYXkoaW5pdF9rZXksIGtleV9sZW5ndGgpLgotCi1Db3B5cmlnaHQgKEMpIDE5OTcgLSAyMDAyLCBNYWtvdG8gTWF0c3Vtb3RvIGFuZCBUYWt1amkgTmlzaGltdXJhLAotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLWFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbi4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLUxJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLUVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLVBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgotTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLQotQW55IGZlZWRiYWNrIGlzIHZlcnkgd2VsY29tZS4KLWh0dHA6Ly93d3cubWF0aC5rZWlvLmFjLmpwL21hdHVtb3RvL2VtdC5odG1sCi1lbWFpbDogbWF0dW1vdG9AbWF0aC5rZWlvLmFjLmpwCi1cZW5ke3ZlcmJhdGltfQotCi0KLQotXHN1YnNlY3Rpb257U29ja2V0c30KLQotVGhlIFxtb2R1bGV7c29ja2V0fSBtb2R1bGUgdXNlcyB0aGUgZnVuY3Rpb25zLCBcZnVuY3Rpb257Z2V0YWRkcmluZm99LAotYW5kIFxmdW5jdGlvbntnZXRuYW1laW5mb30sIHdoaWNoIGFyZSBjb2RlZCBpbiBzZXBhcmF0ZSBzb3VyY2UgZmlsZXMKLWZyb20gdGhlIFdJREUgUHJvamVjdCwgXHVybHtodHRwOi8vd3d3LndpZGUuYWQuanAvYWJvdXQvaW5kZXguaHRtbH0uCi0KLVxiZWdpbnt2ZXJiYXRpbX0gICAgICAKLUNvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgYW5kIDE5OTggV0lERSBQcm9qZWN0LgotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi1hcmUgbWV0OgotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLTIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKLSAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi1HQUlfQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi1JTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi1GT1IgR0FJX0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLURBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi1PUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLUhPV0VWRVIgQ0FVU0VEIEFORCBPTiBHQUlfQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gR0FJX0FOWSBXQVkKLU9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLVNVQ0ggREFNQUdFLgotXGVuZHt2ZXJiYXRpbX0KLQotCi0KLVxzdWJzZWN0aW9ue0Zsb2F0aW5nIHBvaW50IGV4Y2VwdGlvbiBjb250cm9sfQotCi1UaGUgc291cmNlIGZvciB0aGUgXG1vZHVsZXtmcGVjdGx9IG1vZHVsZSBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIG5vdGljZToKLQotXGJlZ2lue3ZlcmJhdGltfQotICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAotICAgIC8gICAgICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoYykgMTk5Ni4gICAgICAgICAgICAgICAgICAgICAgICAgICBcIAotICAgfCAgICAgICAgICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgICAgICAgICAgICAgICAgfAotICAgfCAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgfCAgIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yICAgfAotICAgfCAgIGFueSBwdXJwb3NlIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgZW4tICAgfAotICAgfCAgIHRpcmUgbm90aWNlIGlzIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb2YgYW55IHNvZnR3YXJlIHdoaWNoIGlzIG9yICAgfAotICAgfCAgIGluY2x1ZGVzICBhICBjb3B5ICBvciAgbW9kaWZpY2F0aW9uICBvZiAgdGhpcyBzb2Z0d2FyZSBhbmQgaW4gYWxsICAgfAotICAgfCAgIGNvcGllcyBvZiB0aGUgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uIGZvciBzdWNoIHNvZnR3YXJlLiAgICAgICAgICAgfAotICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgfCAgIFRoaXMgIHdvcmsgd2FzIHByb2R1Y2VkIGF0IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIExhd3JlbmNlICAgfAotICAgfCAgIExpdmVybW9yZSBOYXRpb25hbCBMYWJvcmF0b3J5IHVuZGVyICBjb250cmFjdCAgbm8uICBXLTc0MDUtRU5HLTQ4ICAgfAotICAgfCAgIGJldHdlZW4gIHRoZSAgVS5TLiAgRGVwYXJ0bWVudCAgb2YgIEVuZXJneSBhbmQgVGhlIFJlZ2VudHMgb2YgdGhlICAgfAotICAgfCAgIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIG9wZXJhdGlvbiBvZiBVQyBMTE5MLiAgICAgICAgICAgICAgfAotICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJU0NMQUlNRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgfCAgIFRoaXMgIHNvZnR3YXJlIHdhcyBwcmVwYXJlZCBhcyBhbiBhY2NvdW50IG9mIHdvcmsgc3BvbnNvcmVkIGJ5IGFuICAgfAotICAgfCAgIGFnZW5jeSBvZiB0aGUgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50LiBOZWl0aGVyIHRoZSBVbml0ZWQgU3RhdGVzICAgfAotICAgfCAgIEdvdmVybm1lbnQgIG5vciB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhIG5vciBhbnkgb2YgdGhlaXIgZW0tICAgfAotICAgfCAgIHBsb3llZXMsIG1ha2VzIGFueSB3YXJyYW50eSwgZXhwcmVzcyBvciBpbXBsaWVkLCBvciAgYXNzdW1lcyAgYW55ICAgfAotICAgfCAgIGxpYWJpbGl0eSAgb3IgIHJlc3BvbnNpYmlsaXR5ICBmb3IgdGhlIGFjY3VyYWN5LCBjb21wbGV0ZW5lc3MsIG9yICAgfAotICAgfCAgIHVzZWZ1bG5lc3Mgb2YgYW55IGluZm9ybWF0aW9uLCAgYXBwYXJhdHVzLCAgcHJvZHVjdCwgIG9yICBwcm9jZXNzICAgfAotICAgfCAgIGRpc2Nsb3NlZCwgICBvciAgcmVwcmVzZW50cyAgdGhhdCAgaXRzICB1c2UgIHdvdWxkICBub3QgIGluZnJpbmdlICAgfAotICAgfCAgIHByaXZhdGVseS1vd25lZCByaWdodHMuIFJlZmVyZW5jZSBoZXJlaW4gdG8gYW55IHNwZWNpZmljICBjb21tZXItICAgfAotICAgfCAgIGNpYWwgIHByb2R1Y3RzLCAgcHJvY2VzcywgIG9yICBzZXJ2aWNlICBieSB0cmFkZSBuYW1lLCB0cmFkZW1hcmssICAgfAotICAgfCAgIG1hbnVmYWN0dXJlciwgb3Igb3RoZXJ3aXNlLCBkb2VzIG5vdCAgbmVjZXNzYXJpbHkgIGNvbnN0aXR1dGUgIG9yICAgfAotICAgfCAgIGltcGx5ICBpdHMgZW5kb3JzZW1lbnQsIHJlY29tbWVuZGF0aW9uLCBvciBmYXZvcmluZyBieSB0aGUgVW5pdGVkICAgfAotICAgfCAgIFN0YXRlcyBHb3Zlcm5tZW50IG9yIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIFRoZSB2aWV3cyAgYW5kICAgfAotICAgfCAgIG9waW5pb25zICBvZiBhdXRob3JzIGV4cHJlc3NlZCBoZXJlaW4gZG8gbm90IG5lY2Vzc2FyaWx5IHN0YXRlIG9yICAgfAotICAgfCAgIHJlZmxlY3QgdGhvc2Ugb2YgdGhlIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBvciAgdGhlICBVbml2ZXJzaXR5ICAgfAotICAgfCAgIG9mICBDYWxpZm9ybmlhLCAgYW5kIHNoYWxsIG5vdCBiZSB1c2VkIGZvciBhZHZlcnRpc2luZyBvciBwcm9kdWN0ICAgfAotICAgIFwgIGVuZG9yc2VtZW50IHB1cnBvc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIAotICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVxlbmR7dmVyYmF0aW19Ci0KLQotCi1cc3Vic2VjdGlvbntNRDUgbWVzc2FnZSBkaWdlc3QgYWxnb3JpdGhtfQotCi1UaGUgc291cmNlIGNvZGUgZm9yIHRoZSBcbW9kdWxle21kNX0gbW9kdWxlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbm90aWNlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0gIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMiBBbGFkZGluIEVudGVycHJpc2VzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAotICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0KLSAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci0gICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi0gIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0KLSAgTC4gUGV0ZXIgRGV1dHNjaAotICBnaG9zdEBhbGFkZGluLmNvbQotCi0gIEluZGVwZW5kZW50IGltcGxlbWVudGF0aW9uIG9mIE1ENSAoUkZDIDEzMjEpLgotCi0gIFRoaXMgY29kZSBpbXBsZW1lbnRzIHRoZSBNRDUgQWxnb3JpdGhtIGRlZmluZWQgaW4gUkZDIDEzMjEsIHdob3NlCi0gIHRleHQgaXMgYXZhaWxhYmxlIGF0Ci0JaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTMyMS50eHQKLSAgVGhlIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHRoZSB0ZXh0IG9mIHRoZSBSRkMsIGluY2x1ZGluZyB0aGUgdGVzdCBzdWl0ZQotICAoc2VjdGlvbiBBLjUpIGJ1dCBleGNsdWRpbmcgdGhlIHJlc3Qgb2YgQXBwZW5kaXggQS4gIEl0IGRvZXMgbm90IGluY2x1ZGUKLSAgYW55IGNvZGUgb3IgZG9jdW1lbnRhdGlvbiB0aGF0IGlzIGlkZW50aWZpZWQgaW4gdGhlIFJGQyBhcyBiZWluZwotICBjb3B5cmlnaHRlZC4KLQotICBUaGUgb3JpZ2luYWwgYW5kIHByaW5jaXBhbCBhdXRob3Igb2YgbWQ1LmggaXMgTC4gUGV0ZXIgRGV1dHNjaAotICA8Z2hvc3RAYWxhZGRpbi5jb20+LiAgT3RoZXIgYXV0aG9ycyBhcmUgbm90ZWQgaW4gdGhlIGNoYW5nZSBoaXN0b3J5Ci0gIHRoYXQgZm9sbG93cyAoaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyKToKLQotICAyMDAyLTA0LTEzIGxwZCBSZW1vdmVkIHN1cHBvcnQgZm9yIG5vbi1BTlNJIGNvbXBpbGVyczsgcmVtb3ZlZAotCXJlZmVyZW5jZXMgdG8gR2hvc3RzY3JpcHQ7IGNsYXJpZmllZCBkZXJpdmF0aW9uIGZyb20gUkZDIDEzMjE7Ci0Jbm93IGhhbmRsZXMgYnl0ZSBvcmRlciBlaXRoZXIgc3RhdGljYWxseSBvciBkeW5hbWljYWxseS4KLSAgMTk5OS0xMS0wNCBscGQgRWRpdGVkIGNvbW1lbnRzIHNsaWdodGx5IGZvciBhdXRvbWF0aWMgVE9DIGV4dHJhY3Rpb24uCi0gIDE5OTktMTAtMTggbHBkIEZpeGVkIHR5cG8gaW4gaGVhZGVyIGNvbW1lbnQgKGFuc2kya25yIHJhdGhlciB0aGFuIG1kNSk7Ci0JYWRkZWQgY29uZGl0aW9uYWxpemF0aW9uIGZvciBDKysgY29tcGlsYXRpb24gZnJvbSBNYXJ0aW4KLQlQdXJzY2hrZSA8cHVyc2Noa2VAYm5sLmdvdj4uCi0gIDE5OTktMDUtMDMgbHBkIE9yaWdpbmFsIHZlcnNpb24uCi1cZW5ke3ZlcmJhdGltfQotCi0KLQotXHN1YnNlY3Rpb257QXN5bmNocm9ub3VzIHNvY2tldCBzZXJ2aWNlc30KLQotVGhlIFxtb2R1bGV7YXN5bmNoYXR9IGFuZCBcbW9kdWxle2FzeW5jb3JlfSBtb2R1bGVzIGNvbnRhaW4gdGhlCi1mb2xsb3dpbmcgbm90aWNlOgotCi1cYmVnaW57dmVyYmF0aW19ICAgICAgCi0gQ29weXJpZ2h0IDE5OTYgYnkgU2FtIFJ1c2hpbmcKLQotICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLQotIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kCi0gaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkKLSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwKLSBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbgotIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBTYW0KLSBSdXNoaW5nIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvCi0gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yCi0gcGVybWlzc2lvbi4KLQotIFNBTSBSVVNISU5HIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4KLSBOTyBFVkVOVCBTSEFMTCBTQU0gUlVTSElORyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MKLSBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi0gTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLVxlbmR7dmVyYmF0aW19Ci0KLQotXHN1YnNlY3Rpb257Q29va2llIG1hbmFnZW1lbnR9Ci0KLVRoZSBcbW9kdWxle0Nvb2tpZX0gbW9kdWxlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbm90aWNlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0gQ29weXJpZ2h0IDIwMDAgYnkgVGltb3RoeSBPJ01hbGxleSA8dGltb0BhbHVtLm1pdC5lZHU+Ci0KLSAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCi0KLSBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCi0gYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5Ci0gZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsCi0gY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24KLSBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YKLSBUaW1vdGh5IE8nTWFsbGV5ICBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkKLSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbgotIHByaW9yIHBlcm1pc3Npb24uCi0KLSBUaW1vdGh5IE8nTWFsbGV5IERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTCi0gU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBUaW1vdGh5IE8nTWFsbGV5IEJFIExJQUJMRSBGT1IKLSBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAotIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTCi0gQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi1cZW5ke3ZlcmJhdGltfSAgICAgIAotCi0KLQotXHN1YnNlY3Rpb257UHJvZmlsaW5nfQotCi1UaGUgXG1vZHVsZXtwcm9maWxlfSBhbmQgXG1vZHVsZXtwc3RhdHN9IG1vZHVsZXMgY29udGFpbgotdGhlIGZvbGxvd2luZyBub3RpY2U6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSBDb3B5cmlnaHQgMTk5NCwgYnkgSW5mb1NlZWsgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gV3JpdHRlbiBieSBKYW1lcyBSb3NraW5kCi0KLSBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIFB5dGhvbiBzb2Z0d2FyZQotIGFuZCBpdHMgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSAoc3ViamVjdCB0byB0aGUKLSByZXN0cmljdGlvbiBpbiB0aGUgZm9sbG93aW5nIHNlbnRlbmNlKSB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKLSBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kCi0gdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLSBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEluZm9TZWVrIG5vdCBiZSB1c2VkIGluCi0gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoaXMgcGVybWlzc2lvbiBpcwotIGV4cGxpY2l0bHkgcmVzdHJpY3RlZCB0byB0aGUgY29weWluZyBhbmQgbW9kaWZpY2F0aW9uIG9mIHRoZSBzb2Z0d2FyZQotIHRvIHJlbWFpbiBpbiBQeXRob24sIGNvbXBpbGVkIFB5dGhvbiwgb3Igb3RoZXIgbGFuZ3VhZ2VzIChzdWNoIGFzIEMpCi0gd2hlcmVpbiB0aGUgbW9kaWZpZWQgb3IgZGVyaXZlZCBjb2RlIGlzIGV4Y2x1c2l2ZWx5IGltcG9ydGVkIGludG8gYQotIFB5dGhvbiBtb2R1bGUuCi0KLSBJTkZPU0VFSyBDT1JQT1JBVElPTiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUwotIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgSU5GT1NFRUsgQ09SUE9SQVRJT04gQkUgTElBQkxFIEZPUiBBTlkKLSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUgotIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GCi0gQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi1cZW5ke3ZlcmJhdGltfQotCi0KLQotXHN1YnNlY3Rpb257RXhlY3V0aW9uIHRyYWNpbmd9Ci0KLVRoZSBcbW9kdWxle3RyYWNlfSBtb2R1bGUgY29udGFpbnMgdGhlIGZvbGxvd2luZyBub3RpY2U6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSBwb3J0aW9ucyBjb3B5cmlnaHQgMjAwMSwgQXV0b25vbW91cyBab25lcyBJbmR1c3RyaWVzLCBJbmMuLCBhbGwgcmlnaHRzLi4uCi0gZXJyLi4uICByZXNlcnZlZCBhbmQgb2ZmZXJlZCB0byB0aGUgcHVibGljIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSBQeXRob24gMi4yIGxpY2Vuc2UuCi0gQXV0aG9yOiBab29rbyBPJ1doaWVsYWNyb254Ci0gaHR0cDovL3pvb2tvLmNvbS8KLSBtYWlsdG86em9va29Aem9va28uY29tCi0KLSBDb3B5cmlnaHQgMjAwMCwgTW9qYW0gTWVkaWEsIEluYy4sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gQXV0aG9yOiBTa2lwIE1vbnRhbmFybwotCi0gQ29weXJpZ2h0IDE5OTksIEJpb3JlYXNvbiwgSW5jLiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KLSBBdXRob3I6IEFuZHJldyBEYWxrZQotCi0gQ29weXJpZ2h0IDE5OTUtMTk5NywgQXV0b21hdHJpeCwgSW5jLiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KLSBBdXRob3I6IFNraXAgTW9udGFuYXJvCi0KLSBDb3B5cmlnaHQgMTk5MS0xOTk1LCBTdGljaHRpbmcgTWF0aGVtYXRpc2NoIENlbnRydW0sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLQotIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgUHl0aG9uIHNvZnR3YXJlIGFuZAotIGl0cyBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIHdpdGhvdXQgZmVlIGlzIGhlcmVieQotIGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLAotIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgbmVpdGhlciBBdXRvbWF0cml4LAotIEJpb3JlYXNvbiBvciBNb2phbSBNZWRpYSBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvCi0gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCi1cZW5ke3ZlcmJhdGltfSAKLQotCi0KLVxzdWJzZWN0aW9ue1VVZW5jb2RlIGFuZCBVVWRlY29kZSBmdW5jdGlvbnN9Ci0KLVRoZSBcbW9kdWxle3V1fSBtb2R1bGUgY29udGFpbnMgdGhlIGZvbGxvd2luZyBub3RpY2U6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSBDb3B5cmlnaHQgMTk5NCBieSBMYW5jZSBFbGxpbmdob3VzZQotIENhdGhlZHJhbCBDaXR5LCBDYWxpZm9ybmlhIFJlcHVibGljLCBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuCi0gICAgICAgICAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCi0gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi0gZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLAotIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLSBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIExhbmNlIEVsbGluZ2hvdXNlCi0gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uCi0gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KLSBMQU5DRSBFTExJTkdIT1VTRSBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLSBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgTEFOQ0UgRUxMSU5HSE9VU0UgQ0VOVFJVTSBCRSBMSUFCTEUKLSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUCi0gT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLQotIE1vZGlmaWVkIGJ5IEphY2sgSmFuc2VuLCBDV0ksIEp1bHkgMTk5NToKLSAtIFVzZSBiaW5hc2NpaSBtb2R1bGUgdG8gZG8gdGhlIGFjdHVhbCBsaW5lLWJ5LWxpbmUgY29udmVyc2lvbgotICAgYmV0d2VlbiBhc2NpaSBhbmQgYmluYXJ5LiBUaGlzIHJlc3VsdHMgaW4gYSAxMDAwLWZvbGQgc3BlZWR1cC4gVGhlIEMKLSAgIHZlcnNpb24gaXMgc3RpbGwgNSB0aW1lcyBmYXN0ZXIsIHRob3VnaC4KLSAtIEFyZ3VtZW50cyBtb3JlIGNvbXBsaWFudCB3aXRoIHB5dGhvbiBzdGFuZGFyZAotXGVuZHt2ZXJiYXRpbX0KLQotCi0KLVxzdWJzZWN0aW9ue1hNTCBSZW1vdGUgUHJvY2VkdXJlIENhbGxzfQotCi1UaGUgXG1vZHVsZXt4bWxycGNsaWJ9IG1vZHVsZSBjb250YWlucyB0aGUgZm9sbG93aW5nIG5vdGljZToKLQotXGJlZ2lue3ZlcmJhdGltfQotICAgICBUaGUgWE1MLVJQQyBjbGllbnQgaW50ZXJmYWNlIGlzCi0KLSBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMiBieSBTZWNyZXQgTGFicyBBQgotIENvcHlyaWdodCAoYykgMTk5OS0yMDAyIGJ5IEZyZWRyaWsgTHVuZGgKLQotIEJ5IG9idGFpbmluZywgdXNpbmcsIGFuZC9vciBjb3B5aW5nIHRoaXMgc29mdHdhcmUgYW5kL29yIGl0cwotIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiwgeW91IGFncmVlIHRoYXQgeW91IGhhdmUgcmVhZCwgdW5kZXJzdG9vZCwKLSBhbmQgd2lsbCBjb21wbHkgd2l0aCB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zOgotCi0gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQKLSBpdHMgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMKLSBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXJzIGluCi0gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbgotIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZgotIFNlY3JldCBMYWJzIEFCIG9yIHRoZSBhdXRob3Igbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5Ci0gcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4KLSBwcmlvciBwZXJtaXNzaW9uLgotCi0gU0VDUkVUIExBQlMgQUIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJECi0gVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlQtCi0gQUJJTElUWSBBTkQgRklUTkVTUy4gIElOIE5PIEVWRU5UIFNIQUxMIFNFQ1JFVCBMQUJTIEFCIE9SIFRIRSBBVVRIT1IKLSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZCi0gREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCi0gV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMKLSBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFCi0gT0YgVEhJUyBTT0ZUV0FSRS4KLVxlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvY29tbW9udGV4L3JlcG9ydGluZ2J1Z3MudGV4IGIvRG9jL2NvbW1vbnRleC9yZXBvcnRpbmdidWdzLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhmMmViZi4uMDAwMDAwMAotLS0gYS9Eb2MvY29tbW9udGV4L3JlcG9ydGluZ2J1Z3MudGV4CisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotXGxhYmVse3JlcG9ydGluZy1idWdzfQotCi1QeXRob24gaXMgYSBtYXR1cmUgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2Ugd2hpY2ggaGFzIGVzdGFibGlzaGVkIGEKLXJlcHV0YXRpb24gZm9yIHN0YWJpbGl0eS4gIEluIG9yZGVyIHRvIG1haW50YWluIHRoaXMgcmVwdXRhdGlvbiwgdGhlCi1kZXZlbG9wZXJzIHdvdWxkIGxpa2UgdG8ga25vdyBvZiBhbnkgZGVmaWNpZW5jaWVzIHlvdSBmaW5kIGluIFB5dGhvbgotb3IgaXRzIGRvY3VtZW50YXRpb24uCi0KLUJlZm9yZSBzdWJtaXR0aW5nIGEgcmVwb3J0LCB5b3Ugd2lsbCBiZSByZXF1aXJlZCB0byBsb2cgaW50byBTb3VyY2VGb3JnZTsKLXRoaXMgd2lsbCBtYWtlIGl0IHBvc3NpYmxlIGZvciB0aGUgZGV2ZWxvcGVycyB0byBjb250YWN0IHlvdQotZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaWYgbmVlZGVkLiAgSXQgaXMgbm90IHBvc3NpYmxlIHRvIHN1Ym1pdCBhCi1idWcgcmVwb3J0IGFub255bW91c2x5LgotCi1BbGwgYnVnIHJlcG9ydHMgc2hvdWxkIGJlIHN1Ym1pdHRlZCB2aWEgdGhlIFB5dGhvbiBCdWcgVHJhY2tlciBvbgotU291cmNlRm9yZ2UgKFx1cmx7aHR0cDovL3NvdXJjZWZvcmdlLm5ldC9idWdzLz9ncm91cF9pZD01NDcwfSkuICBUaGUKLWJ1ZyB0cmFja2VyIG9mZmVycyBhIFdlYiBmb3JtIHdoaWNoIGFsbG93cyBwZXJ0aW5lbnQgaW5mb3JtYXRpb24gdG8gYmUKLWVudGVyZWQgYW5kIHN1Ym1pdHRlZCB0byB0aGUgZGV2ZWxvcGVycy4KLQotVGhlIGZpcnN0IHN0ZXAgaW4gZmlsaW5nIGEgcmVwb3J0IGlzIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBwcm9ibGVtCi1oYXMgYWxyZWFkeSBiZWVuIHJlcG9ydGVkLiAgVGhlIGFkdmFudGFnZSBpbiBkb2luZyBzbywgYXNpZGUgZnJvbQotc2F2aW5nIHRoZSBkZXZlbG9wZXJzIHRpbWUsIGlzIHRoYXQgeW91IGxlYXJuIHdoYXQgaGFzIGJlZW4gZG9uZSB0bwotZml4IGl0OyBpdCBtYXkgYmUgdGhhdCB0aGUgcHJvYmxlbSBoYXMgYWxyZWFkeSBiZWVuIGZpeGVkIGZvciB0aGUgbmV4dAotcmVsZWFzZSwgb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpcyBuZWVkZWQgKGluIHdoaWNoIGNhc2UgeW91IGFyZQotd2VsY29tZSB0byBwcm92aWRlIGl0IGlmIHlvdSBjYW4hKS4gIFRvIGRvIHRoaXMsIHNlYXJjaCB0aGUgYnVnCi1kYXRhYmFzZSB1c2luZyB0aGUgc2VhcmNoIGJveCBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBwYWdlLgotCi1JZiB0aGUgcHJvYmxlbSB5b3UncmUgcmVwb3J0aW5nIGlzIG5vdCBhbHJlYWR5IGluIHRoZSBidWcgdHJhY2tlciwgZ28KLWJhY2sgdG8gdGhlIFB5dGhvbiBCdWcgVHJhY2tlcgotKFx1cmx7aHR0cDovL3NvdXJjZWZvcmdlLm5ldC9idWdzLz9ncm91cF9pZD01NDcwfSkuICBTZWxlY3QgdGhlCi1gYFN1Ym1pdCBhIEJ1ZycnIGxpbmsgYXQgdGhlIHRvcCBvZiB0aGUgcGFnZSB0byBvcGVuIHRoZSBidWcgcmVwb3J0aW5nCi1mb3JtLgotCi1UaGUgc3VibWlzc2lvbiBmb3JtIGhhcyBhIG51bWJlciBvZiBmaWVsZHMuICBUaGUgb25seSBmaWVsZHMgdGhhdCBhcmUKLXJlcXVpcmVkIGFyZSB0aGUgYGBTdW1tYXJ5JycgYW5kIGBgRGV0YWlscycnIGZpZWxkcy4gIEZvciB0aGUgc3VtbWFyeSwKLWVudGVyIGEgXGVtcGh7dmVyeX0gc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW07IGxlc3MgdGhhbiB0ZW4KLXdvcmRzIGlzIGdvb2QuICBJbiB0aGUgRGV0YWlscyBmaWVsZCwgZGVzY3JpYmUgdGhlIHByb2JsZW0gaW4gZGV0YWlsLAotaW5jbHVkaW5nIHdoYXQgeW91IGV4cGVjdGVkIHRvIGhhcHBlbiBhbmQgd2hhdCBkaWQgaGFwcGVuLiAgQmUgc3VyZSB0bwotaW5jbHVkZSB0aGUgdmVyc2lvbiBvZiBQeXRob24geW91IHVzZWQsIHdoZXRoZXIgYW55IGV4dGVuc2lvbiBtb2R1bGVzCi13ZXJlIGludm9sdmVkLCBhbmQgd2hhdCBoYXJkd2FyZSBhbmQgc29mdHdhcmUgcGxhdGZvcm0geW91IHdlcmUgdXNpbmcKLShpbmNsdWRpbmcgdmVyc2lvbiBpbmZvcm1hdGlvbiBhcyBhcHByb3ByaWF0ZSkuCi0KLVRoZSBvbmx5IG90aGVyIGZpZWxkIHRoYXQgeW91IG1heSB3YW50IHRvIHNldCBpcyB0aGUgYGBDYXRlZ29yeScnCi1maWVsZCwgd2hpY2ggYWxsb3dzIHlvdSB0byBwbGFjZSB0aGUgYnVnIHJlcG9ydCBpbnRvIGEgYnJvYWQgY2F0ZWdvcnkKLShzdWNoIGFzIGBgRG9jdW1lbnRhdGlvbicnIG9yIGBgTGlicmFyeScnKS4KLQotRWFjaCBidWcgcmVwb3J0IHdpbGwgYmUgYXNzaWduZWQgdG8gYSBkZXZlbG9wZXIgd2hvIHdpbGwgZGV0ZXJtaW5lCi13aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gY29ycmVjdCB0aGUgcHJvYmxlbS4gIFlvdSB3aWxsCi1yZWNlaXZlIGFuIHVwZGF0ZSBlYWNoIHRpbWUgYWN0aW9uIGlzIHRha2VuIG9uIHRoZSBidWcuCi0KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWV0aXRsZVtodHRwOi8vd3d3LW1pY2UuY3MudWNsLmFjLnVrL211bHRpbWVkaWEvc29mdHdhcmUvZG9jdW1lbnRhdGlvbi9SZXBvcnRpbmdCdWdzLmh0bWxde0hvdwotICAgICAgICB0byBSZXBvcnQgQnVncyBFZmZlY3RpdmVseX17QXJ0aWNsZSB3aGljaCBnb2VzIGludG8gc29tZQotICAgICAgICBkZXRhaWwgYWJvdXQgaG93IHRvIGNyZWF0ZSBhIHVzZWZ1bCBidWcgcmVwb3J0LiAgVGhpcwotICAgICAgICBkZXNjcmliZXMgd2hhdCBraW5kIG9mIGluZm9ybWF0aW9uIGlzIHVzZWZ1bCBhbmQgd2h5IGl0IGlzCi0gICAgICAgIHVzZWZ1bC59Ci0KLSAgXHNlZXRpdGxlW2h0dHA6Ly93d3cubW96aWxsYS5vcmcvcXVhbGl0eS9idWctd3JpdGluZy1ndWlkZWxpbmVzLmh0bWxde0J1ZwotICAgICAgICBXcml0aW5nIEd1aWRlbGluZXN9e0luZm9ybWF0aW9uIGFib3V0IHdyaXRpbmcgYSBnb29kIGJ1ZwotICAgICAgICByZXBvcnQuICBTb21lIG9mIHRoaXMgaXMgc3BlY2lmaWMgdG8gdGhlIE1vemlsbGEgcHJvamVjdCwgYnV0Ci0gICAgICAgIGRlc2NyaWJlcyBnZW5lcmFsIGdvb2QgcHJhY3RpY2VzLn0KLVxlbmR7c2VlYWxzb30KZGlmZiAtLWdpdCBhL0RvYy9jb21tb250ZXgvdHlwZXN0cnVjdC5oIGIvRG9jL2NvbW1vbnRleC90eXBlc3RydWN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZmUzNzUuLjAwMDAwMDAKLS0tIGEvRG9jL2NvbW1vbnRleC90eXBlc3RydWN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi10eXBlZGVmIHN0cnVjdCBfdHlwZW9iamVjdCB7Ci0gICAgUHlPYmplY3RfVkFSX0hFQUQKLSAgICBjaGFyICp0cF9uYW1lOyAvKiBGb3IgcHJpbnRpbmcsIGluIGZvcm1hdCAiPG1vZHVsZT4uPG5hbWU+IiAqLwotICAgIGludCB0cF9iYXNpY3NpemUsIHRwX2l0ZW1zaXplOyAvKiBGb3IgYWxsb2NhdGlvbiAqLwotCi0gICAgLyogTWV0aG9kcyB0byBpbXBsZW1lbnQgc3RhbmRhcmQgb3BlcmF0aW9ucyAqLwotCi0gICAgZGVzdHJ1Y3RvciB0cF9kZWFsbG9jOwotICAgIHByaW50ZnVuYyB0cF9wcmludDsKLSAgICBnZXRhdHRyZnVuYyB0cF9nZXRhdHRyOwotICAgIHNldGF0dHJmdW5jIHRwX3NldGF0dHI7Ci0gICAgY21wZnVuYyB0cF9jb21wYXJlOwotICAgIHJlcHJmdW5jIHRwX3JlcHI7Ci0KLSAgICAvKiBNZXRob2Qgc3VpdGVzIGZvciBzdGFuZGFyZCBjbGFzc2VzICovCi0KLSAgICBQeU51bWJlck1ldGhvZHMgKnRwX2FzX251bWJlcjsKLSAgICBQeVNlcXVlbmNlTWV0aG9kcyAqdHBfYXNfc2VxdWVuY2U7Ci0gICAgUHlNYXBwaW5nTWV0aG9kcyAqdHBfYXNfbWFwcGluZzsKLQotICAgIC8qIE1vcmUgc3RhbmRhcmQgb3BlcmF0aW9ucyAoaGVyZSBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkpICovCi0KLSAgICBoYXNoZnVuYyB0cF9oYXNoOwotICAgIHRlcm5hcnlmdW5jIHRwX2NhbGw7Ci0gICAgcmVwcmZ1bmMgdHBfc3RyOwotICAgIGdldGF0dHJvZnVuYyB0cF9nZXRhdHRybzsKLSAgICBzZXRhdHRyb2Z1bmMgdHBfc2V0YXR0cm87Ci0KLSAgICAvKiBGdW5jdGlvbnMgdG8gYWNjZXNzIG9iamVjdCBhcyBpbnB1dC9vdXRwdXQgYnVmZmVyICovCi0gICAgUHlCdWZmZXJQcm9jcyAqdHBfYXNfYnVmZmVyOwotCi0gICAgLyogRmxhZ3MgdG8gZGVmaW5lIHByZXNlbmNlIG9mIG9wdGlvbmFsL2V4cGFuZGVkIGZlYXR1cmVzICovCi0gICAgbG9uZyB0cF9mbGFnczsKLQotICAgIGNoYXIgKnRwX2RvYzsgLyogRG9jdW1lbnRhdGlvbiBzdHJpbmcgKi8KLQotICAgIC8qIEFzc2lnbmVkIG1lYW5pbmcgaW4gcmVsZWFzZSAyLjAgKi8KLSAgICAvKiBjYWxsIGZ1bmN0aW9uIGZvciBhbGwgYWNjZXNzaWJsZSBvYmplY3RzICovCi0gICAgdHJhdmVyc2Vwcm9jIHRwX3RyYXZlcnNlOwotCi0gICAgLyogZGVsZXRlIHJlZmVyZW5jZXMgdG8gY29udGFpbmVkIG9iamVjdHMgKi8KLSAgICBpbnF1aXJ5IHRwX2NsZWFyOwotCi0gICAgLyogQXNzaWduZWQgbWVhbmluZyBpbiByZWxlYXNlIDIuMSAqLwotICAgIC8qIHJpY2ggY29tcGFyaXNvbnMgKi8KLSAgICByaWNoY21wZnVuYyB0cF9yaWNoY29tcGFyZTsKLQotICAgIC8qIHdlYWsgcmVmZXJlbmNlIGVuYWJsZXIgKi8KLSAgICBsb25nIHRwX3dlYWtsaXN0b2Zmc2V0OwotCi0gICAgLyogQWRkZWQgaW4gcmVsZWFzZSAyLjIgKi8KLSAgICAvKiBJdGVyYXRvcnMgKi8KLSAgICBnZXRpdGVyZnVuYyB0cF9pdGVyOwotICAgIGl0ZXJuZXh0ZnVuYyB0cF9pdGVybmV4dDsKLQotICAgIC8qIEF0dHJpYnV0ZSBkZXNjcmlwdG9yIGFuZCBzdWJjbGFzc2luZyBzdHVmZiAqLwotICAgIHN0cnVjdCBQeU1ldGhvZERlZiAqdHBfbWV0aG9kczsKLSAgICBzdHJ1Y3QgUHlNZW1iZXJEZWYgKnRwX21lbWJlcnM7Ci0gICAgc3RydWN0IFB5R2V0U2V0RGVmICp0cF9nZXRzZXQ7Ci0gICAgc3RydWN0IF90eXBlb2JqZWN0ICp0cF9iYXNlOwotICAgIFB5T2JqZWN0ICp0cF9kaWN0OwotICAgIGRlc2NyZ2V0ZnVuYyB0cF9kZXNjcl9nZXQ7Ci0gICAgZGVzY3JzZXRmdW5jIHRwX2Rlc2NyX3NldDsKLSAgICBsb25nIHRwX2RpY3RvZmZzZXQ7Ci0gICAgaW5pdHByb2MgdHBfaW5pdDsKLSAgICBhbGxvY2Z1bmMgdHBfYWxsb2M7Ci0gICAgbmV3ZnVuYyB0cF9uZXc7Ci0gICAgZnJlZWZ1bmMgdHBfZnJlZTsgLyogTG93LWxldmVsIGZyZWUtbWVtb3J5IHJvdXRpbmUgKi8KLSAgICBpbnF1aXJ5IHRwX2lzX2djOyAvKiBGb3IgUHlPYmplY3RfSVNfR0MgKi8KLSAgICBQeU9iamVjdCAqdHBfYmFzZXM7Ci0gICAgUHlPYmplY3QgKnRwX21ybzsgLyogbWV0aG9kIHJlc29sdXRpb24gb3JkZXIgKi8KLSAgICBQeU9iamVjdCAqdHBfY2FjaGU7Ci0gICAgUHlPYmplY3QgKnRwX3N1YmNsYXNzZXM7Ci0gICAgUHlPYmplY3QgKnRwX3dlYWtsaXN0OwotCi19IFB5VHlwZU9iamVjdDsKZGlmZiAtLWdpdCBhL0RvYy9kaXN0L2Rpc3QudGV4IGIvRG9jL2Rpc3QvZGlzdC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMzIyN2YuLjAwMDAwMDAKLS0tIGEvRG9jL2Rpc3QvZGlzdC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwzODExICswLDAgQEAKLVxkb2N1bWVudGNsYXNze21hbnVhbH0KLVx1c2VwYWNrYWdle2Rpc3R1dGlsc30KLQotJSAkSWQkCi0KLSUgVE9ETwotJSAgIERvY3VtZW50IGV4dGVuc2lvbi5yZWFkX3NldHVwX2ZpbGUKLSUgICBEb2N1bWVudCBidWlsZF9jbGliIGNvbW1hbmQKLSUKLQotXHRpdGxle0Rpc3RyaWJ1dGluZyBQeXRob24gTW9kdWxlc30KLQotXGlucHV0e2JvaWxlcnBsYXRlfQotCi1cYXV0aG9ye0dyZWcgV2FyZFxcCi0gICAgICAgIEFudGhvbnkgQmF4dGVyfQotXGF1dGhvcmFkZHJlc3N7Ci0JXHN0cm9uZ3tQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbn1cXAotCUVtYWlsOiBcZW1haWx7ZGlzdHV0aWxzLXNpZ0BweXRob24ub3JnfQotfQotCi1cbWFrZWluZGV4Ci1cbWFrZW1vZGluZGV4Ci0KLVxiZWdpbntkb2N1bWVudH0KLQotXG1ha2V0aXRsZQotCi1caW5wdXR7Y29weXJpZ2h0fQotCi1cYmVnaW57YWJzdHJhY3R9Ci0gIFxub2luZGVudAotICBUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgUHl0aG9uIERpc3RyaWJ1dGlvbiBVdGlsaXRpZXMKLSAgKGBgRGlzdHV0aWxzJycpIGZyb20gdGhlIG1vZHVsZSBkZXZlbG9wZXIncyBwb2ludCBvZiB2aWV3LCBkZXNjcmliaW5nCi0gIGhvdyB0byB1c2UgdGhlIERpc3R1dGlscyB0byBtYWtlIFB5dGhvbiBtb2R1bGVzIGFuZCBleHRlbnNpb25zIGVhc2lseQotICBhdmFpbGFibGUgdG8gYSB3aWRlciBhdWRpZW5jZSB3aXRoIHZlcnkgbGl0dGxlIG92ZXJoZWFkIGZvcgotICBidWlsZC9yZWxlYXNlL2luc3RhbGwgbWVjaGFuaWNzLgotXGVuZHthYnN0cmFjdH0KLQotJSBUaGUgdWdseSAiJWJlZ2lue2xhdGV4b25seX0iIHBzZXVkby1lbnZpcm9ubWVudCBzdXBwcmVzc2VzIHRoZSB0YWJsZQotJSBvZiBjb250ZW50cyBmb3IgSFRNTCBnZW5lcmF0aW9uLgotJQotJWJlZ2lue2xhdGV4b25seX0KLVx0YWJsZW9mY29udGVudHMKLSVlbmR7bGF0ZXhvbmx5fQotCi0KLVxjaGFwdGVye0FuIEludHJvZHVjdGlvbiB0byBEaXN0dXRpbHN9Ci1cbGFiZWx7aW50cm99Ci0KLVRoaXMgZG9jdW1lbnQgY292ZXJzIHVzaW5nIHRoZSBEaXN0dXRpbHMgdG8gZGlzdHJpYnV0ZSB5b3VyIFB5dGhvbgotbW9kdWxlcywgY29uY2VudHJhdGluZyBvbiB0aGUgcm9sZSBvZiBkZXZlbG9wZXIvZGlzdHJpYnV0b3I6IGlmCi15b3UncmUgbG9va2luZyBmb3IgaW5mb3JtYXRpb24gb24gaW5zdGFsbGluZyBQeXRob24gbW9kdWxlcywgeW91Ci1zaG91bGQgcmVmZXIgdG8gdGhlIFxjaXRldGl0bGVbLi4vaW5zdC9pbnN0Lmh0bWxde0luc3RhbGxpbmcgUHl0aG9uCi1Nb2R1bGVzfSBtYW51YWwuCi0KLQotXHNlY3Rpb257Q29uY2VwdHMgXCYgVGVybWlub2xvZ3l9Ci1cbGFiZWx7Y29uY2VwdHN9Ci0KLVVzaW5nIHRoZSBEaXN0dXRpbHMgaXMgcXVpdGUgc2ltcGxlLCBib3RoIGZvciBtb2R1bGUgZGV2ZWxvcGVycyBhbmQgZm9yCi11c2Vycy9hZG1pbmlzdHJhdG9ycyBpbnN0YWxsaW5nIHRoaXJkLXBhcnR5IG1vZHVsZXMuICBBcyBhIGRldmVsb3BlciwKLXlvdXIgcmVzcG9uc2liaWxpdGllcyAoYXBhcnQgZnJvbSB3cml0aW5nIHNvbGlkLCB3ZWxsLWRvY3VtZW50ZWQgYW5kCi13ZWxsLXRlc3RlZCBjb2RlLCBvZiBjb3Vyc2UhKSBhcmU6Ci1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtIHdyaXRlIGEgc2V0dXAgc2NyaXB0IChcZmlsZXtzZXR1cC5weX0gYnkgY29udmVudGlvbikKLVxpdGVtIChvcHRpb25hbCkgd3JpdGUgYSBzZXR1cCBjb25maWd1cmF0aW9uIGZpbGUKLVxpdGVtIGNyZWF0ZSBhIHNvdXJjZSBkaXN0cmlidXRpb24KLVxpdGVtIChvcHRpb25hbCkgY3JlYXRlIG9uZSBvciBtb3JlIGJ1aWx0IChiaW5hcnkpIGRpc3RyaWJ1dGlvbnMKLVxlbmR7aXRlbWl6ZX0KLUVhY2ggb2YgdGhlc2UgdGFza3MgaXMgY292ZXJlZCBpbiB0aGlzIGRvY3VtZW50LgotCi1Ob3QgYWxsIG1vZHVsZSBkZXZlbG9wZXJzIGhhdmUgYWNjZXNzIHRvIGEgbXVsdGl0dWRlIG9mIHBsYXRmb3Jtcywgc28KLWl0J3Mgbm90IGFsd2F5cyBmZWFzaWJsZSB0byBleHBlY3QgdGhlbSB0byBjcmVhdGUgYSBtdWx0aXR1ZGUgb2YgYnVpbHQKLWRpc3RyaWJ1dGlvbnMuICBJdCBpcyBob3BlZCB0aGF0IGEgY2xhc3Mgb2YgaW50ZXJtZWRpYXJpZXMsIGNhbGxlZAotXGVtcGh7cGFja2FnZXJzfSwgd2lsbCBhcmlzZSB0byBhZGRyZXNzIHRoaXMgbmVlZC4gIFBhY2thZ2VycyB3aWxsIHRha2UKLXNvdXJjZSBkaXN0cmlidXRpb25zIHJlbGVhc2VkIGJ5IG1vZHVsZSBkZXZlbG9wZXJzLCBidWlsZCB0aGVtIG9uIG9uZSBvcgotbW9yZSBwbGF0Zm9ybXMsIGFuZCByZWxlYXNlIHRoZSByZXN1bHRpbmcgYnVpbHQgZGlzdHJpYnV0aW9ucy4gIFRodXMsCi11c2VycyBvbiB0aGUgbW9zdCBwb3B1bGFyIHBsYXRmb3JtcyB3aWxsIGJlIGFibGUgdG8gaW5zdGFsbCBtb3N0IHBvcHVsYXIKLVB5dGhvbiBtb2R1bGUgZGlzdHJpYnV0aW9ucyBpbiB0aGUgbW9zdCBuYXR1cmFsIHdheSBmb3IgdGhlaXIgcGxhdGZvcm0sCi13aXRob3V0IGhhdmluZyB0byBydW4gYSBzaW5nbGUgc2V0dXAgc2NyaXB0IG9yIGNvbXBpbGUgYSBsaW5lIG9mIGNvZGUuCi0KLQotXHNlY3Rpb257QSBTaW1wbGUgRXhhbXBsZX0KLVxsYWJlbHtzaW1wbGUtZXhhbXBsZX0KLQotVGhlIHNldHVwIHNjcmlwdCBpcyB1c3VhbGx5IHF1aXRlIHNpbXBsZSwgYWx0aG91Z2ggc2luY2UgaXQncyB3cml0dGVuCi1pbiBQeXRob24sIHRoZXJlIGFyZSBubyBhcmJpdHJhcnkgbGltaXRzIHRvIHdoYXQgeW91IGNhbiBkbyB3aXRoIGl0LAotdGhvdWdoIHlvdSBzaG91bGQgYmUgY2FyZWZ1bCBhYm91dCBwdXR0aW5nIGFyYml0cmFyaWx5IGV4cGVuc2l2ZQotb3BlcmF0aW9ucyBpbiB5b3VyIHNldHVwIHNjcmlwdC4gVW5saWtlLCBzYXksIEF1dG9jb25mLXN0eWxlIGNvbmZpZ3VyZQotc2NyaXB0cywgdGhlIHNldHVwIHNjcmlwdCBtYXkgYmUgcnVuIG11bHRpcGxlIHRpbWVzIGluIHRoZSBjb3Vyc2Ugb2YKLWJ1aWxkaW5nIGFuZCBpbnN0YWxsaW5nIHlvdXIgbW9kdWxlIGRpc3RyaWJ1dGlvbi4gIAotCi1JZiBhbGwgeW91IHdhbnQgdG8gZG8gaXMgZGlzdHJpYnV0ZSBhIG1vZHVsZSBjYWxsZWQgXG1vZHVsZXtmb299LAotY29udGFpbmVkIGluIGEgZmlsZSBcZmlsZXtmb28ucHl9LCB0aGVuIHlvdXIgc2V0dXAgc2NyaXB0IGNhbiBiZSBhcwotc2ltcGxlIGFzIHRoaXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IHNldHVwCi1zZXR1cChuYW1lPSdmb28nLAotICAgICAgdmVyc2lvbj0nMS4wJywKLSAgICAgIHB5X21vZHVsZXM9Wydmb28nXSwKLSAgICAgICkKLVxlbmR7dmVyYmF0aW19Ci0KLVNvbWUgb2JzZXJ2YXRpb25zOgotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSBtb3N0IGluZm9ybWF0aW9uIHRoYXQgeW91IHN1cHBseSB0byB0aGUgRGlzdHV0aWxzIGlzIHN1cHBsaWVkIGFzCi0gIGtleXdvcmQgYXJndW1lbnRzIHRvIHRoZSBcZnVuY3Rpb257c2V0dXAoKX0gZnVuY3Rpb24KLVxpdGVtIHRob3NlIGtleXdvcmQgYXJndW1lbnRzIGZhbGwgaW50byB0d28gY2F0ZWdvcmllczogcGFja2FnZQotICBtZXRhZGF0YSAobmFtZSwgdmVyc2lvbiBudW1iZXIpIGFuZCBpbmZvcm1hdGlvbiBhYm91dCB3aGF0J3MgaW4gdGhlCi0gIHBhY2thZ2UgKGEgbGlzdCBvZiBwdXJlIFB5dGhvbiBtb2R1bGVzLCBpbiB0aGlzIGNhc2UpCi1caXRlbSBtb2R1bGVzIGFyZSBzcGVjaWZpZWQgYnkgbW9kdWxlIG5hbWUsIG5vdCBmaWxlbmFtZSAodGhlIHNhbWUgd2lsbAotICBob2xkIHRydWUgZm9yIHBhY2thZ2VzIGFuZCBleHRlbnNpb25zKQotXGl0ZW0gaXQncyByZWNvbW1lbmRlZCB0aGF0IHlvdSBzdXBwbHkgYSBsaXR0bGUgbW9yZSBtZXRhZGF0YSwgaW4KLSAgcGFydGljdWxhciB5b3VyIG5hbWUsIGVtYWlsIGFkZHJlc3MgYW5kIGEgVVJMIGZvciB0aGUgcHJvamVjdAotICAoc2VlIHNlY3Rpb25+XHJlZntzZXR1cC1zY3JpcHR9IGZvciBhbiBleGFtcGxlKQotXGVuZHtpdGVtaXplfQotCi1UbyBjcmVhdGUgYSBzb3VyY2UgZGlzdHJpYnV0aW9uIGZvciB0aGlzIG1vZHVsZSwgeW91IHdvdWxkIGNyZWF0ZSBhCi1zZXR1cCBzY3JpcHQsIFxmaWxle3NldHVwLnB5fSwgY29udGFpbmluZyB0aGUgYWJvdmUgY29kZSwgYW5kIHJ1bjoKLQotXGJlZ2lue3ZlcmJhdGltfQotcHl0aG9uIHNldHVwLnB5IHNkaXN0Ci1cZW5ke3ZlcmJhdGltfQotCi13aGljaCB3aWxsIGNyZWF0ZSBhbiBhcmNoaXZlIGZpbGUgKGUuZy4sIHRhcmJhbGwgb24gXFVOSVgsIFpJUCBmaWxlIG9uCi1XaW5kb3dzKSBjb250YWluaW5nIHlvdXIgc2V0dXAgc2NyaXB0IFxmaWxle3NldHVwLnB5fSwgYW5kIHlvdXIgbW9kdWxlCi1cZmlsZXtmb28ucHl9LiAgVGhlIGFyY2hpdmUgZmlsZSB3aWxsIGJlIG5hbWVkIFxmaWxle2Zvby0xLjAudGFyLmd6fSAob3IKLVxmaWxley56aXB9KSwgYW5kIHdpbGwgdW5wYWNrIGludG8gYSBkaXJlY3RvcnkgXGZpbGV7Zm9vLTEuMH0uCi0KLUlmIGFuIGVuZC11c2VyIHdpc2hlcyB0byBpbnN0YWxsIHlvdXIgXG1vZHVsZXtmb299IG1vZHVsZSwgYWxsIHNoZSBoYXMKLXRvIGRvIGlzIGRvd25sb2FkIFxmaWxle2Zvby0xLjAudGFyLmd6fSAob3IgXGZpbGV7LnppcH0pLCB1bnBhY2sgaXQsCi1hbmQtLS1mcm9tIHRoZSBcZmlsZXtmb28tMS4wfSBkaXJlY3RvcnktLS1ydW4KLQotXGJlZ2lue3ZlcmJhdGltfQotcHl0aG9uIHNldHVwLnB5IGluc3RhbGwKLVxlbmR7dmVyYmF0aW19Ci0KLXdoaWNoIHdpbGwgdWx0aW1hdGVseSBjb3B5IFxmaWxle2Zvby5weX0gdG8gdGhlIGFwcHJvcHJpYXRlIGRpcmVjdG9yeQotZm9yIHRoaXJkLXBhcnR5IG1vZHVsZXMgaW4gdGhlaXIgUHl0aG9uIGluc3RhbGxhdGlvbi4KLQotVGhpcyBzaW1wbGUgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgc29tZSBmdW5kYW1lbnRhbCBjb25jZXB0cyBvZiB0aGUKLURpc3R1dGlscy4gRmlyc3QsIGJvdGggZGV2ZWxvcGVycyBhbmQgaW5zdGFsbGVycyBoYXZlIHRoZSBzYW1lIGJhc2ljCi11c2VyIGludGVyZmFjZSwgaS5lLiB0aGUgc2V0dXAgc2NyaXB0LiAgVGhlIGRpZmZlcmVuY2UgaXMgd2hpY2gKLURpc3R1dGlscyBcZW1waHtjb21tYW5kc30gdGhleSB1c2U6IHRoZSBcY29tbWFuZHtzZGlzdH0gY29tbWFuZCBpcwotYWxtb3N0IGV4Y2x1c2l2ZWx5IGZvciBtb2R1bGUgZGV2ZWxvcGVycywgd2hpbGUgXGNvbW1hbmR7aW5zdGFsbH0gaXMKLW1vcmUgb2Z0ZW4gZm9yIGluc3RhbGxlcnMgKGFsdGhvdWdoIG1vc3QgZGV2ZWxvcGVycyB3aWxsIHdhbnQgdG8gaW5zdGFsbAotdGhlaXIgb3duIGNvZGUgb2NjYXNpb25hbGx5KS4KLQotSWYgeW91IHdhbnQgdG8gbWFrZSB0aGluZ3MgcmVhbGx5IGVhc3kgZm9yIHlvdXIgdXNlcnMsIHlvdSBjYW4gY3JlYXRlCi1vbmUgb3IgbW9yZSBidWlsdCBkaXN0cmlidXRpb25zIGZvciB0aGVtLiAgRm9yIGluc3RhbmNlLCBpZiB5b3UgYXJlCi1ydW5uaW5nIG9uIGEgV2luZG93cyBtYWNoaW5lLCBhbmQgd2FudCB0byBtYWtlIHRoaW5ncyBlYXN5IGZvciBvdGhlcgotV2luZG93cyB1c2VycywgeW91IGNhbiBjcmVhdGUgYW4gZXhlY3V0YWJsZSBpbnN0YWxsZXIgKHRoZSBtb3N0Ci1hcHByb3ByaWF0ZSB0eXBlIG9mIGJ1aWx0IGRpc3RyaWJ1dGlvbiBmb3IgdGhpcyBwbGF0Zm9ybSkgd2l0aCB0aGUKLVxjb21tYW5ke2JkaXN0XF93aW5pbnN0fSBjb21tYW5kLiAgRm9yIGV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXB5dGhvbiBzZXR1cC5weSBiZGlzdF93aW5pbnN0Ci1cZW5ke3ZlcmJhdGltfQotCi13aWxsIGNyZWF0ZSBhbiBleGVjdXRhYmxlIGluc3RhbGxlciwgXGZpbGV7Zm9vLTEuMC53aW4zMi5leGV9LCBpbiB0aGUKLWN1cnJlbnQgZGlyZWN0b3J5LgotCi1PdGhlciB1c2VmdWwgYnVpbHQgZGlzdHJpYnV0aW9uIGZvcm1hdHMgYXJlIFJQTSwgaW1wbGVtZW50ZWQgYnkgdGhlCi1cY29tbWFuZHtiZGlzdFxfcnBtfSBjb21tYW5kLCBTb2xhcmlzIFxwcm9ncmFte3BrZ3Rvb2x9Ci0oXGNvbW1hbmR7YmRpc3RcX3BrZ3Rvb2x9KSwgYW5kIEhQLVVYIFxwcm9ncmFte3N3aW5zdGFsbH0KLShcY29tbWFuZHtiZGlzdF9zZHV4fSkuICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb21tYW5kIHdpbGwKLWNyZWF0ZSBhbiBSUE0gZmlsZSBjYWxsZWQgXGZpbGV7Zm9vLTEuMC5ub2FyY2gucnBtfToKLQotXGJlZ2lue3ZlcmJhdGltfQotcHl0aG9uIHNldHVwLnB5IGJkaXN0X3JwbQotXGVuZHt2ZXJiYXRpbX0KLQotKFRoZSBcY29tbWFuZHtiZGlzdFxfcnBtfSBjb21tYW5kIHVzZXMgdGhlIFxjb21tYW5ke3JwbX0gZXhlY3V0YWJsZSwKLXRoZXJlZm9yZSB0aGlzIGhhcyB0byBiZSBydW4gb24gYW4gUlBNLWJhc2VkIHN5c3RlbSBzdWNoIGFzIFJlZCBIYXQKLUxpbnV4LCBTdVNFIExpbnV4LCBvciBNYW5kcmFrZSBMaW51eC4pCi0KLVlvdSBjYW4gZmluZCBvdXQgd2hhdCBkaXN0cmlidXRpb24gZm9ybWF0cyBhcmUgYXZhaWxhYmxlIGF0IGFueSB0aW1lIGJ5Ci1ydW5uaW5nCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLXB5dGhvbiBzZXR1cC5weSBiZGlzdCAtLWhlbHAtZm9ybWF0cwotXGVuZHt2ZXJiYXRpbX0KLQotCi1cc2VjdGlvbntHZW5lcmFsIFB5dGhvbiB0ZXJtaW5vbG9neX0KLVxsYWJlbHtweXRob24tdGVybXN9Ci0KLUlmIHlvdSdyZSByZWFkaW5nIHRoaXMgZG9jdW1lbnQsIHlvdSBwcm9iYWJseSBoYXZlIGEgZ29vZCBpZGVhIG9mIHdoYXQKLW1vZHVsZXMsIGV4dGVuc2lvbnMsIGFuZCBzbyBmb3J0aCBhcmUuICBOZXZlcnRoZWxlc3MsIGp1c3QgdG8gYmUgc3VyZQotdGhhdCBldmVyeW9uZSBpcyBvcGVyYXRpbmcgZnJvbSBhIGNvbW1vbiBzdGFydGluZyBwb2ludCwgd2Ugb2ZmZXIgdGhlCi1mb2xsb3dpbmcgZ2xvc3Nhcnkgb2YgY29tbW9uIFB5dGhvbiB0ZXJtczoKLVxiZWdpbntkZXNjcmlwdGlvbn0KLVxpdGVtW21vZHVsZV0gdGhlIGJhc2ljIHVuaXQgb2YgY29kZSByZXVzYWJpbGl0eSBpbiBQeXRob246IGEgYmxvY2sgb2YKLSAgY29kZSBpbXBvcnRlZCBieSBzb21lIG90aGVyIGNvZGUuICBUaHJlZSB0eXBlcyBvZiBtb2R1bGVzIGNvbmNlcm4gdXMKLSAgaGVyZTogcHVyZSBQeXRob24gbW9kdWxlcywgZXh0ZW5zaW9uIG1vZHVsZXMsIGFuZCBwYWNrYWdlcy4KLQotXGl0ZW1bcHVyZSBQeXRob24gbW9kdWxlXSBhIG1vZHVsZSB3cml0dGVuIGluIFB5dGhvbiBhbmQgY29udGFpbmVkIGluIGEKLSAgc2luZ2xlIFxmaWxley5weX0gZmlsZSAoYW5kIHBvc3NpYmx5IGFzc29jaWF0ZWQgXGZpbGV7LnB5Y30gYW5kL29yCi0gIFxmaWxley5weW99IGZpbGVzKS4gIFNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyBhIGBgcHVyZSBtb2R1bGUuJycKLQotXGl0ZW1bZXh0ZW5zaW9uIG1vZHVsZV0gYSBtb2R1bGUgd3JpdHRlbiBpbiB0aGUgbG93LWxldmVsIGxhbmd1YWdlIG9mCi0gIHRoZSBQeXRob24gaW1wbGVtZW50YXRpb246IEMvXENwcHt9IGZvciBQeXRob24sIEphdmEgZm9yIEp5dGhvbi4KLSAgVHlwaWNhbGx5IGNvbnRhaW5lZCBpbiBhIHNpbmdsZSBkeW5hbWljYWxseSBsb2FkYWJsZSBwcmUtY29tcGlsZWQKLSAgZmlsZSwgZS5nLiBhIHNoYXJlZCBvYmplY3QgKFxmaWxley5zb30pIGZpbGUgZm9yIFB5dGhvbiBleHRlbnNpb25zIG9uCi0gIFxVTklYLCBhIERMTCAoZ2l2ZW4gdGhlIFxmaWxley5weWR9IGV4dGVuc2lvbikgZm9yIFB5dGhvbiBleHRlbnNpb25zCi0gIG9uIFdpbmRvd3MsIG9yIGEgSmF2YSBjbGFzcyBmaWxlIGZvciBKeXRob24gZXh0ZW5zaW9ucy4gIChOb3RlIHRoYXQKLSAgY3VycmVudGx5LCB0aGUgRGlzdHV0aWxzIG9ubHkgaGFuZGxlcyBDL1xDcHB7fSBleHRlbnNpb25zIGZvciBQeXRob24uKQotCi1caXRlbVtwYWNrYWdlXSBhIG1vZHVsZSB0aGF0IGNvbnRhaW5zIG90aGVyIG1vZHVsZXM7IHR5cGljYWxseSBjb250YWluZWQKLSAgaW4gYSBkaXJlY3RvcnkgaW4gdGhlIGZpbGVzeXN0ZW0gYW5kIGRpc3Rpbmd1aXNoZWQgZnJvbSBvdGhlcgotICBkaXJlY3RvcmllcyBieSB0aGUgcHJlc2VuY2Ugb2YgYSBmaWxlIFxmaWxle1xfXF9pbml0XF9cXy5weX0uCi0KLVxpdGVtW3Jvb3QgcGFja2FnZV0gdGhlIHJvb3Qgb2YgdGhlIGhpZXJhcmNoeSBvZiBwYWNrYWdlcy4gIChUaGlzIGlzbid0Ci0gIHJlYWxseSBhIHBhY2thZ2UsIHNpbmNlIGl0IGRvZXNuJ3QgaGF2ZSBhbiBcZmlsZXtcX1xfaW5pdFxfXF8ucHl9Ci0gIGZpbGUuICBCdXQgd2UgaGF2ZSB0byBjYWxsIGl0IHNvbWV0aGluZy4pICBUaGUgdmFzdCBtYWpvcml0eSBvZiB0aGUKLSAgc3RhbmRhcmQgbGlicmFyeSBpcyBpbiB0aGUgcm9vdCBwYWNrYWdlLCBhcyBhcmUgbWFueSBzbWFsbCwgc3RhbmRhbG9uZQotICB0aGlyZC1wYXJ0eSBtb2R1bGVzIHRoYXQgZG9uJ3QgYmVsb25nIHRvIGEgbGFyZ2VyIG1vZHVsZSBjb2xsZWN0aW9uLgotICBVbmxpa2UgcmVndWxhciBwYWNrYWdlcywgbW9kdWxlcyBpbiB0aGUgcm9vdCBwYWNrYWdlIGNhbiBiZSBmb3VuZCBpbgotICBtYW55IGRpcmVjdG9yaWVzOiBpbiBmYWN0LCBldmVyeSBkaXJlY3RvcnkgbGlzdGVkIGluIFxjb2Rle3N5cy5wYXRofQotICBjb250cmlidXRlcyBtb2R1bGVzIHRvIHRoZSByb290IHBhY2thZ2UuCi1cZW5ke2Rlc2NyaXB0aW9ufQotCi0KLVxzZWN0aW9ue0Rpc3R1dGlscy1zcGVjaWZpYyB0ZXJtaW5vbG9neX0KLVxsYWJlbHtkaXN0dXRpbHMtdGVybX0KLQotVGhlIGZvbGxvd2luZyB0ZXJtcyBhcHBseSBtb3JlIHNwZWNpZmljYWxseSB0byB0aGUgZG9tYWluIG9mCi1kaXN0cmlidXRpbmcgUHl0aG9uIG1vZHVsZXMgdXNpbmcgdGhlIERpc3R1dGlsczoKLVxiZWdpbntkZXNjcmlwdGlvbn0KLVxpdGVtW21vZHVsZSBkaXN0cmlidXRpb25dIGEgY29sbGVjdGlvbiBvZiBQeXRob24gbW9kdWxlcyBkaXN0cmlidXRlZAotICB0b2dldGhlciBhcyBhIHNpbmdsZSBkb3dubG9hZGFibGUgcmVzb3VyY2UgYW5kIG1lYW50IHRvIGJlIGluc3RhbGxlZAotICBcZW1waHtlbiBtYXNzZX0uICBFeGFtcGxlcyBvZiBzb21lIHdlbGwta25vd24gbW9kdWxlIGRpc3RyaWJ1dGlvbnMgYXJlCi0gIE51bWVyaWMgUHl0aG9uLCBQeVhNTCwgUElMICh0aGUgUHl0aG9uIEltYWdpbmcgTGlicmFyeSksIG9yCi0gIG14QmFzZS4gIChUaGlzIHdvdWxkIGJlIGNhbGxlZCBhIFxlbXBoe3BhY2thZ2V9LCBleGNlcHQgdGhhdCB0ZXJtCi0gIGlzIGFscmVhZHkgdGFrZW4gaW4gdGhlIFB5dGhvbiBjb250ZXh0OiBhIHNpbmdsZSBtb2R1bGUgZGlzdHJpYnV0aW9uCi0gIG1heSBjb250YWluIHplcm8sIG9uZSwgb3IgbWFueSBQeXRob24gcGFja2FnZXMuKQotCi1caXRlbVtwdXJlIG1vZHVsZSBkaXN0cmlidXRpb25dIGEgbW9kdWxlIGRpc3RyaWJ1dGlvbiB0aGF0IGNvbnRhaW5zIG9ubHkKLSAgcHVyZSBQeXRob24gbW9kdWxlcyBhbmQgcGFja2FnZXMuICBTb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgYSBgYHB1cmUKLSAgZGlzdHJpYnV0aW9uLicnCi0KLVxpdGVtW25vbi1wdXJlIG1vZHVsZSBkaXN0cmlidXRpb25dIGEgbW9kdWxlIGRpc3RyaWJ1dGlvbiB0aGF0IGNvbnRhaW5zCi0gIGF0IGxlYXN0IG9uZSBleHRlbnNpb24gbW9kdWxlLiAgU29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIGEgYGBub24tcHVyZQotICBkaXN0cmlidXRpb24uJycKLQotXGl0ZW1bZGlzdHJpYnV0aW9uIHJvb3RdIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5IG9mIHlvdXIgc291cmNlIHRyZWUgKG9yIAotICBzb3VyY2UgZGlzdHJpYnV0aW9uKTsgdGhlIGRpcmVjdG9yeSB3aGVyZSBcZmlsZXtzZXR1cC5weX0gZXhpc3RzLiAgR2VuZXJhbGx5IAotICBcZmlsZXtzZXR1cC5weX0gd2lsbCBiZSBydW4gZnJvbSB0aGlzIGRpcmVjdG9yeS4KLVxlbmR7ZGVzY3JpcHRpb259Ci0KLQotXGNoYXB0ZXJ7V3JpdGluZyB0aGUgU2V0dXAgU2NyaXB0fQotXGxhYmVse3NldHVwLXNjcmlwdH0KLQotVGhlIHNldHVwIHNjcmlwdCBpcyB0aGUgY2VudHJlIG9mIGFsbCBhY3Rpdml0eSBpbiBidWlsZGluZywKLWRpc3RyaWJ1dGluZywgYW5kIGluc3RhbGxpbmcgbW9kdWxlcyB1c2luZyB0aGUgRGlzdHV0aWxzLiAgVGhlIG1haW4KLXB1cnBvc2Ugb2YgdGhlIHNldHVwIHNjcmlwdCBpcyB0byBkZXNjcmliZSB5b3VyIG1vZHVsZSBkaXN0cmlidXRpb24gdG8KLXRoZSBEaXN0dXRpbHMsIHNvIHRoYXQgdGhlIHZhcmlvdXMgY29tbWFuZHMgdGhhdCBvcGVyYXRlIG9uIHlvdXIgbW9kdWxlcwotZG8gdGhlIHJpZ2h0IHRoaW5nLiAgQXMgd2Ugc2F3IGluIHNlY3Rpb25+XHJlZntzaW1wbGUtZXhhbXBsZX0gYWJvdmUsCi10aGUgc2V0dXAgc2NyaXB0IGNvbnNpc3RzIG1haW5seSBvZiBhIGNhbGwgdG8gXGZ1bmN0aW9ue3NldHVwKCl9LCBhbmQKLW1vc3QgaW5mb3JtYXRpb24gc3VwcGxpZWQgdG8gdGhlIERpc3R1dGlscyBieSB0aGUgbW9kdWxlIGRldmVsb3BlciBpcwotc3VwcGxpZWQgYXMga2V5d29yZCBhcmd1bWVudHMgdG8gXGZ1bmN0aW9ue3NldHVwKCl9LgotCi1IZXJlJ3MgYSBzbGlnaHRseSBtb3JlIGludm9sdmVkIGV4YW1wbGUsIHdoaWNoIHdlJ2xsIGZvbGxvdyBmb3IgdGhlIG5leHQKLWNvdXBsZSBvZiBzZWN0aW9uczogdGhlIERpc3R1dGlscycgb3duIHNldHVwIHNjcmlwdC4gIChLZWVwIGluIG1pbmQgdGhhdAotYWx0aG91Z2ggdGhlIERpc3R1dGlscyBhcmUgaW5jbHVkZWQgd2l0aCBQeXRob24gMS42IGFuZCBsYXRlciwgdGhleSBhbHNvCi1oYXZlIGFuIGluZGVwZW5kZW50IGV4aXN0ZW5jZSBzbyB0aGF0IFB5dGhvbiAxLjUuMiB1c2VycyBjYW4gdXNlIHRoZW0gdG8KLWluc3RhbGwgb3RoZXIgbW9kdWxlIGRpc3RyaWJ1dGlvbnMuICBUaGUgRGlzdHV0aWxzJyBvd24gc2V0dXAgc2NyaXB0LAotc2hvd24gaGVyZSwgaXMgdXNlZCB0byBpbnN0YWxsIHRoZSBwYWNrYWdlIGludG8gUHl0aG9uIDEuNS4yLikKLQotXGJlZ2lue3ZlcmJhdGltfQotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0KLWZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IHNldHVwCi0KLXNldHVwKG5hbWU9J0Rpc3R1dGlscycsCi0gICAgICB2ZXJzaW9uPScxLjAnLAotICAgICAgZGVzY3JpcHRpb249J1B5dGhvbiBEaXN0cmlidXRpb24gVXRpbGl0aWVzJywKLSAgICAgIGF1dGhvcj0nR3JlZyBXYXJkJywKLSAgICAgIGF1dGhvcl9lbWFpbD0nZ3dhcmRAcHl0aG9uLm5ldCcsCi0gICAgICB1cmw9J2h0dHA6Ly93d3cucHl0aG9uLm9yZy9zaWdzL2Rpc3R1dGlscy1zaWcvJywKLSAgICAgIHBhY2thZ2VzPVsnZGlzdHV0aWxzJywgJ2Rpc3R1dGlscy5jb21tYW5kJ10sCi0gICAgICkKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZXJlIGFyZSBvbmx5IHR3byBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoaXMgYW5kIHRoZSB0cml2aWFsIG9uZS1maWxlCi1kaXN0cmlidXRpb24gcHJlc2VudGVkIGluIHNlY3Rpb25+XHJlZntzaW1wbGUtZXhhbXBsZX06IG1vcmUKLW1ldGFkYXRhLCBhbmQgdGhlIHNwZWNpZmljYXRpb24gb2YgcHVyZSBQeXRob24gbW9kdWxlcyBieSBwYWNrYWdlLAotcmF0aGVyIHRoYW4gYnkgbW9kdWxlLiAgVGhpcyBpcyBpbXBvcnRhbnQgc2luY2UgdGhlIERpc3R1dGlscyBjb25zaXN0IG9mCi1hIGNvdXBsZSBvZiBkb3plbiBtb2R1bGVzIHNwbGl0IGludG8gKHNvIGZhcikgdHdvIHBhY2thZ2VzOyBhbiBleHBsaWNpdAotbGlzdCBvZiBldmVyeSBtb2R1bGUgd291bGQgYmUgdGVkaW91cyB0byBnZW5lcmF0ZSBhbmQgZGlmZmljdWx0IHRvCi1tYWludGFpbi4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBhZGRpdGlvbmFsIG1ldGEtZGF0YSwgc2VlCi1zZWN0aW9uflxyZWZ7bWV0YS1kYXRhfS4KLQotTm90ZSB0aGF0IGFueSBwYXRobmFtZXMgKGZpbGVzIG9yIGRpcmVjdG9yaWVzKSBzdXBwbGllZCBpbiB0aGUgc2V0dXAKLXNjcmlwdCBzaG91bGQgYmUgd3JpdHRlbiB1c2luZyB0aGUgXFVOSVh7fSBjb252ZW50aW9uLCBpLmUuCi1zbGFzaC1zZXBhcmF0ZWQuICBUaGUgRGlzdHV0aWxzIHdpbGwgdGFrZSBjYXJlIG9mIGNvbnZlcnRpbmcgdGhpcwotcGxhdGZvcm0tbmV1dHJhbCByZXByZXNlbnRhdGlvbiBpbnRvIHdoYXRldmVyIGlzIGFwcHJvcHJpYXRlIG9uIHlvdXIKLWN1cnJlbnQgcGxhdGZvcm0gYmVmb3JlIGFjdHVhbGx5IHVzaW5nIHRoZSBwYXRobmFtZS4gIFRoaXMgbWFrZXMgeW91cgotc2V0dXAgc2NyaXB0IHBvcnRhYmxlIGFjcm9zcyBvcGVyYXRpbmcgc3lzdGVtcywgd2hpY2ggb2YgY291cnNlIGlzIG9uZQotb2YgdGhlIG1ham9yIGdvYWxzIG9mIHRoZSBEaXN0dXRpbHMuICBJbiB0aGlzIHNwaXJpdCwgYWxsIHBhdGhuYW1lcyBpbgotdGhpcyBkb2N1bWVudCBhcmUgc2xhc2gtc2VwYXJhdGVkLiAgKE1hYyBPUyA5IHByb2dyYW1tZXJzIHNob3VsZCBrZWVwIGluCi1taW5kIHRoYXQgdGhlIFxlbXBoe2Fic2VuY2V9IG9mIGEgbGVhZGluZyBzbGFzaCBpbmRpY2F0ZXMgYSByZWxhdGl2ZQotcGF0aCwgdGhlIG9wcG9zaXRlIG9mIHRoZSBNYWMgT1MgY29udmVudGlvbiB3aXRoIGNvbG9ucy4pCi0KLVRoaXMsIG9mIGNvdXJzZSwgb25seSBhcHBsaWVzIHRvIHBhdGhuYW1lcyBnaXZlbiB0byBEaXN0dXRpbHMKLWZ1bmN0aW9ucy4gIElmIHlvdSwgZm9yIGV4YW1wbGUsIHVzZSBzdGFuZGFyZCBQeXRob24gZnVuY3Rpb25zIHN1Y2ggYXMKLVxmdW5jdGlvbntnbG9iLmdsb2IoKX0gb3IgXGZ1bmN0aW9ue29zLmxpc3RkaXIoKX0gdG8gc3BlY2lmeSBmaWxlcywgeW91Ci1zaG91bGQgYmUgY2FyZWZ1bCB0byB3cml0ZSBwb3J0YWJsZSBjb2RlIGluc3RlYWQgb2YgaGFyZGNvZGluZyBwYXRoCi1zZXBhcmF0b3JzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgZ2xvYi5nbG9iKG9zLnBhdGguam9pbignbXlkaXInLCAnc3ViZGlyJywgJyouaHRtbCcpKQotICAgIG9zLmxpc3RkaXIob3MucGF0aC5qb2luKCdteWRpcicsICdzdWJkaXInKSkKLVxlbmR7dmVyYmF0aW19Ci0KLQotXHNlY3Rpb257TGlzdGluZyB3aG9sZSBwYWNrYWdlc30KLVxsYWJlbHtsaXN0aW5nLXBhY2thZ2VzfQotCi1UaGUgXG9wdGlvbntwYWNrYWdlc30gb3B0aW9uIHRlbGxzIHRoZSBEaXN0dXRpbHMgdG8gcHJvY2VzcyAoYnVpbGQsCi1kaXN0cmlidXRlLCBpbnN0YWxsLCBldGMuKSBhbGwgcHVyZSBQeXRob24gbW9kdWxlcyBmb3VuZCBpbiBlYWNoIHBhY2thZ2UKLW1lbnRpb25lZCBpbiB0aGUgXG9wdGlvbntwYWNrYWdlc30gbGlzdC4gIEluIG9yZGVyIHRvIGRvIHRoaXMsIG9mCi1jb3Vyc2UsIHRoZXJlIGhhcyB0byBiZSBhIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gcGFja2FnZSBuYW1lcyBhbmQKLWRpcmVjdG9yaWVzIGluIHRoZSBmaWxlc3lzdGVtLiAgVGhlIGRlZmF1bHQgY29ycmVzcG9uZGVuY2UgaXMgdGhlIG1vc3QKLW9idmlvdXMgb25lLCBpLmUuIHBhY2thZ2UgXG1vZHVsZXtkaXN0dXRpbHN9IGlzIGZvdW5kIGluIHRoZSBkaXJlY3RvcnkKLVxmaWxle2Rpc3R1dGlsc30gcmVsYXRpdmUgdG8gdGhlIGRpc3RyaWJ1dGlvbiByb290LiAgVGh1cywgd2hlbiB5b3Ugc2F5Ci1cY29kZXtwYWNrYWdlcyA9IFsnZm9vJ119IGluIHlvdXIgc2V0dXAgc2NyaXB0LCB5b3UgYXJlIHByb21pc2luZyB0aGF0Ci10aGUgRGlzdHV0aWxzIHdpbGwgZmluZCBhIGZpbGUgXGZpbGV7Zm9vL1xfXF9pbml0XF9cXy5weX0gKHdoaWNoIG1pZ2h0Ci1iZSBzcGVsbGVkIGRpZmZlcmVudGx5IG9uIHlvdXIgc3lzdGVtLCBidXQgeW91IGdldCB0aGUgaWRlYSkgcmVsYXRpdmUgdG8KLXRoZSBkaXJlY3Rvcnkgd2hlcmUgeW91ciBzZXR1cCBzY3JpcHQgbGl2ZXMuICBJZiB5b3UgYnJlYWsgdGhpcwotcHJvbWlzZSwgdGhlIERpc3R1dGlscyB3aWxsIGlzc3VlIGEgd2FybmluZyBidXQgc3RpbGwgcHJvY2VzcyB0aGUgYnJva2VuCi1wYWNrYWdlIGFueXdheXMuCi0KLUlmIHlvdSB1c2UgYSBkaWZmZXJlbnQgY29udmVudGlvbiB0byBsYXkgb3V0IHlvdXIgc291cmNlIGRpcmVjdG9yeSwKLXRoYXQncyBubyBwcm9ibGVtOiB5b3UganVzdCBoYXZlIHRvIHN1cHBseSB0aGUgXG9wdGlvbntwYWNrYWdlXF9kaXJ9Ci1vcHRpb24gdG8gdGVsbCB0aGUgRGlzdHV0aWxzIGFib3V0IHlvdXIgY29udmVudGlvbi4gIEZvciBleGFtcGxlLCBzYXkKLXlvdSBrZWVwIGFsbCBQeXRob24gc291cmNlIHVuZGVyIFxmaWxle2xpYn0sIHNvIHRoYXQgbW9kdWxlcyBpbiB0aGUKLWBgcm9vdCBwYWNrYWdlJycgKGkuZS4sIG5vdCBpbiBhbnkgcGFja2FnZSBhdCBhbGwpIGFyZSBpbgotXGZpbGV7bGlifSwgbW9kdWxlcyBpbiB0aGUgXG1vZHVsZXtmb299IHBhY2thZ2UgYXJlIGluIFxmaWxle2xpYi9mb299LAotYW5kIHNvIGZvcnRoLiAgVGhlbiB5b3Ugd291bGQgcHV0Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXBhY2thZ2VfZGlyID0geycnOiAnbGliJ30KLVxlbmR7dmVyYmF0aW19Ci0KLWluIHlvdXIgc2V0dXAgc2NyaXB0LiAgVGhlIGtleXMgdG8gdGhpcyBkaWN0aW9uYXJ5IGFyZSBwYWNrYWdlIG5hbWVzLAotYW5kIGFuIGVtcHR5IHBhY2thZ2UgbmFtZSBzdGFuZHMgZm9yIHRoZSByb290IHBhY2thZ2UuICBUaGUgdmFsdWVzIGFyZQotZGlyZWN0b3J5IG5hbWVzIHJlbGF0aXZlIHRvIHlvdXIgZGlzdHJpYnV0aW9uIHJvb3QuICBJbiB0aGlzIGNhc2UsIHdoZW4KLXlvdSBzYXkgXGNvZGV7cGFja2FnZXMgPSBbJ2ZvbyddfSwgeW91IGFyZSBwcm9taXNpbmcgdGhhdCB0aGUgZmlsZQotXGZpbGV7bGliL2Zvby9cX1xfaW5pdFxfXF8ucHl9IGV4aXN0cy4KLQotQW5vdGhlciBwb3NzaWJsZSBjb252ZW50aW9uIGlzIHRvIHB1dCB0aGUgXG1vZHVsZXtmb299IHBhY2thZ2UgcmlnaHQgaW4gCi1cZmlsZXtsaWJ9LCB0aGUgXG1vZHVsZXtmb28uYmFyfSBwYWNrYWdlIGluIFxmaWxle2xpYi9iYXJ9LCBldGMuICBUaGlzCi13b3VsZCBiZSB3cml0dGVuIGluIHRoZSBzZXR1cCBzY3JpcHQgYXMKLQotXGJlZ2lue3ZlcmJhdGltfQotcGFja2FnZV9kaXIgPSB7J2Zvbyc6ICdsaWInfQotXGVuZHt2ZXJiYXRpbX0KLQotQSBcY29kZXtcdmFye3BhY2thZ2V9OiBcdmFye2Rpcn19IGVudHJ5IGluIHRoZSBcb3B0aW9ue3BhY2thZ2VcX2Rpcn0KLWRpY3Rpb25hcnkgaW1wbGljaXRseSBhcHBsaWVzIHRvIGFsbCBwYWNrYWdlcyBiZWxvdyBcdmFye3BhY2thZ2V9LCBzbwotdGhlIFxtb2R1bGV7Zm9vLmJhcn0gY2FzZSBpcyBhdXRvbWF0aWNhbGx5IGhhbmRsZWQgaGVyZS4gIEluIHRoaXMKLWV4YW1wbGUsIGhhdmluZyBcY29kZXtwYWNrYWdlcyA9IFsnZm9vJywgJ2Zvby5iYXInXX0gdGVsbHMgdGhlIERpc3R1dGlscwotdG8gbG9vayBmb3IgXGZpbGV7bGliL1xfXF9pbml0XF9cXy5weX0gYW5kCi1cZmlsZXtsaWIvYmFyL1xfXF9pbml0XF9cXy5weX0uICAoS2VlcCBpbiBtaW5kIHRoYXQgYWx0aG91Z2gKLVxvcHRpb257cGFja2FnZVxfZGlyfSBhcHBsaWVzIHJlY3Vyc2l2ZWx5LCB5b3UgbXVzdCBleHBsaWNpdGx5IGxpc3QgYWxsCi1wYWNrYWdlcyBpbiBcb3B0aW9ue3BhY2thZ2VzfTogdGhlIERpc3R1dGlscyB3aWxsIFxlbXBoe25vdH0gcmVjdXJzaXZlbHkKLXNjYW4geW91ciBzb3VyY2UgdHJlZSBsb29raW5nIGZvciBhbnkgZGlyZWN0b3J5IHdpdGggYW4KLVxmaWxle1xfXF9pbml0XF9cXy5weX0gZmlsZS4pCi0KLQotXHNlY3Rpb257TGlzdGluZyBpbmRpdmlkdWFsIG1vZHVsZXN9Ci1cbGFiZWx7bGlzdGluZy1tb2R1bGVzfQotCi1Gb3IgYSBzbWFsbCBtb2R1bGUgZGlzdHJpYnV0aW9uLCB5b3UgbWlnaHQgcHJlZmVyIHRvIGxpc3QgYWxsIG1vZHVsZXMKLXJhdGhlciB0aGFuIGxpc3RpbmcgcGFja2FnZXMtLS1lc3BlY2lhbGx5IHRoZSBjYXNlIG9mIGEgc2luZ2xlIG1vZHVsZQotdGhhdCBnb2VzIGluIHRoZSBgYHJvb3QgcGFja2FnZScnIChpLmUuLCBubyBwYWNrYWdlIGF0IGFsbCkuICBUaGlzCi1zaW1wbGVzdCBjYXNlIHdhcyBzaG93biBpbiBzZWN0aW9uflxyZWZ7c2ltcGxlLWV4YW1wbGV9OyBoZXJlIGlzIGEKLXNsaWdodGx5IG1vcmUgaW52b2x2ZWQgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotcHlfbW9kdWxlcyA9IFsnbW9kMScsICdwa2cubW9kMiddCi1cZW5ke3ZlcmJhdGltfQotCi1UaGlzIGRlc2NyaWJlcyB0d28gbW9kdWxlcywgb25lIG9mIHRoZW0gaW4gdGhlIGBgcm9vdCcnIHBhY2thZ2UsIHRoZQotb3RoZXIgaW4gdGhlIFxtb2R1bGV7cGtnfSBwYWNrYWdlLiAgQWdhaW4sIHRoZSBkZWZhdWx0IHBhY2thZ2UvZGlyZWN0b3J5Ci1sYXlvdXQgaW1wbGllcyB0aGF0IHRoZXNlIHR3byBtb2R1bGVzIGNhbiBiZSBmb3VuZCBpbiBcZmlsZXttb2QxLnB5fSBhbmQKLVxmaWxle3BrZy9tb2QyLnB5fSwgYW5kIHRoYXQgXGZpbGV7cGtnL1xfXF9pbml0XF9cXy5weX0gZXhpc3RzIGFzIHdlbGwuCi1BbmQgYWdhaW4sIHlvdSBjYW4gb3ZlcnJpZGUgdGhlIHBhY2thZ2UvZGlyZWN0b3J5IGNvcnJlc3BvbmRlbmNlIHVzaW5nCi10aGUgXG9wdGlvbntwYWNrYWdlXF9kaXJ9IG9wdGlvbi4KLQotCi1cc2VjdGlvbntEZXNjcmliaW5nIGV4dGVuc2lvbiBtb2R1bGVzfQotXGxhYmVse2Rlc2NyaWJpbmctZXh0ZW5zaW9uc30KLQotJSBYWFggcmVhZCBvdmVyIHRoaXMgc2VjdGlvbgotSnVzdCBhcyB3cml0aW5nIFB5dGhvbiBleHRlbnNpb24gbW9kdWxlcyBpcyBhIGJpdCBtb3JlIGNvbXBsaWNhdGVkIHRoYW4KLXdyaXRpbmcgcHVyZSBQeXRob24gbW9kdWxlcywgZGVzY3JpYmluZyB0aGVtIHRvIHRoZSBEaXN0dXRpbHMgaXMgYSBiaXQKLW1vcmUgY29tcGxpY2F0ZWQuICBVbmxpa2UgcHVyZSBtb2R1bGVzLCBpdCdzIG5vdCBlbm91Z2gganVzdCB0byBsaXN0Ci1tb2R1bGVzIG9yIHBhY2thZ2VzIGFuZCBleHBlY3QgdGhlIERpc3R1dGlscyB0byBnbyBvdXQgYW5kIGZpbmQgdGhlCi1yaWdodCBmaWxlczsgeW91IGhhdmUgdG8gc3BlY2lmeSB0aGUgZXh0ZW5zaW9uIG5hbWUsIHNvdXJjZSBmaWxlKHMpLCBhbmQKLWFueSBjb21waWxlL2xpbmsgcmVxdWlyZW1lbnRzIChpbmNsdWRlIGRpcmVjdG9yaWVzLCBsaWJyYXJpZXMgdG8gbGluawotd2l0aCwgZXRjLikuCi0KLUFsbCBvZiB0aGlzIGlzIGRvbmUgdGhyb3VnaCBhbm90aGVyIGtleXdvcmQgYXJndW1lbnQgdG8KLVxmdW5jdGlvbntzZXR1cCgpfSwgdGhlIFxvcHRpb257ZXh0X21vZHVsZXN9IG9wdGlvbi4gIFxvcHRpb257ZXh0X21vZHVsZXN9Ci1pcyBqdXN0IGEgbGlzdCBvZiBcY2xhc3N7RXh0ZW5zaW9ufSBpbnN0YW5jZXMsIGVhY2ggb2Ygd2hpY2ggZGVzY3JpYmVzIGEKLXNpbmdsZSBleHRlbnNpb24gbW9kdWxlLiAgU3VwcG9zZSB5b3VyIGRpc3RyaWJ1dGlvbiBpbmNsdWRlcyBhIHNpbmdsZQotZXh0ZW5zaW9uLCBjYWxsZWQgXG1vZHVsZXtmb299IGFuZCBpbXBsZW1lbnRlZCBieSBcZmlsZXtmb28uY30uICBJZiBubwotYWRkaXRpb25hbCBpbnN0cnVjdGlvbnMgdG8gdGhlIGNvbXBpbGVyL2xpbmtlciBhcmUgbmVlZGVkLCBkZXNjcmliaW5nCi10aGlzIGV4dGVuc2lvbiBpcyBxdWl0ZSBzaW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLUV4dGVuc2lvbignZm9vJywgWydmb28uYyddKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIFxjbGFzc3tFeHRlbnNpb259IGNsYXNzIGNhbiBiZSBpbXBvcnRlZCBmcm9tCi1cbW9kdWxle2Rpc3R1dGlscy5jb3JlfSBhbG9uZyB3aXRoIFxmdW5jdGlvbntzZXR1cCgpfS4gIFRodXMsIHRoZSBzZXR1cAotc2NyaXB0IGZvciBhIG1vZHVsZSBkaXN0cmlidXRpb24gdGhhdCBjb250YWlucyBvbmx5IHRoaXMgb25lIGV4dGVuc2lvbgotYW5kIG5vdGhpbmcgZWxzZSBtaWdodCBiZToKLQotXGJlZ2lue3ZlcmJhdGltfQotZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAsIEV4dGVuc2lvbgotc2V0dXAobmFtZT0nZm9vJywKLSAgICAgIHZlcnNpb249JzEuMCcsCi0gICAgICBleHRfbW9kdWxlcz1bRXh0ZW5zaW9uKCdmb28nLCBbJ2Zvby5jJ10pXSwKLSAgICAgICkKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBcY2xhc3N7RXh0ZW5zaW9ufSBjbGFzcyAoYWN0dWFsbHksIHRoZSB1bmRlcmx5aW5nIGV4dGVuc2lvbi1idWlsZGluZwotbWFjaGluZXJ5IGltcGxlbWVudGVkIGJ5IHRoZSBcY29tbWFuZHtidWlsZFxfZXh0fSBjb21tYW5kKSBzdXBwb3J0cyBhCi1ncmVhdCBkZWFsIG9mIGZsZXhpYmlsaXR5IGluIGRlc2NyaWJpbmcgUHl0aG9uIGV4dGVuc2lvbnMsIHdoaWNoIGlzCi1leHBsYWluZWQgaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucy4gIAotCi0KLVxzdWJzZWN0aW9ue0V4dGVuc2lvbiBuYW1lcyBhbmQgcGFja2FnZXN9Ci0KLVRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgXGNsYXNze0V4dGVuc2lvbn0gY29uc3RydWN0b3IgaXMgYWx3YXlzIHRoZQotbmFtZSBvZiB0aGUgZXh0ZW5zaW9uLCBpbmNsdWRpbmcgYW55IHBhY2thZ2UgbmFtZXMuICBGb3IgZXhhbXBsZSwKLQotXGJlZ2lue3ZlcmJhdGltfQotRXh0ZW5zaW9uKCdmb28nLCBbJ3NyYy9mb28xLmMnLCAnc3JjL2ZvbzIuYyddKQotXGVuZHt2ZXJiYXRpbX0KLQotZGVzY3JpYmVzIGFuIGV4dGVuc2lvbiB0aGF0IGxpdmVzIGluIHRoZSByb290IHBhY2thZ2UsIHdoaWxlCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLUV4dGVuc2lvbigncGtnLmZvbycsIFsnc3JjL2ZvbzEuYycsICdzcmMvZm9vMi5jJ10pCi1cZW5ke3ZlcmJhdGltfQotCi1kZXNjcmliZXMgdGhlIHNhbWUgZXh0ZW5zaW9uIGluIHRoZSBcbW9kdWxle3BrZ30gcGFja2FnZS4gIFRoZSBzb3VyY2UKLWZpbGVzIGFuZCByZXN1bHRpbmcgb2JqZWN0IGNvZGUgYXJlIGlkZW50aWNhbCBpbiBib3RoIGNhc2VzOyB0aGUgb25seQotZGlmZmVyZW5jZSBpcyB3aGVyZSBpbiB0aGUgZmlsZXN5c3RlbSAoYW5kIHRoZXJlZm9yZSB3aGVyZSBpbiBQeXRob24ncwotbmFtZXNwYWNlIGhpZXJhcmNoeSkgdGhlIHJlc3VsdGluZyBleHRlbnNpb24gbGl2ZXMuCi0KLUlmIHlvdSBoYXZlIGEgbnVtYmVyIG9mIGV4dGVuc2lvbnMgYWxsIGluIHRoZSBzYW1lIHBhY2thZ2UgKG9yIGFsbCB1bmRlcgotdGhlIHNhbWUgYmFzZSBwYWNrYWdlKSwgdXNlIHRoZSBcb3B0aW9ue2V4dFxfcGFja2FnZX0ga2V5d29yZCBhcmd1bWVudAotdG8gXGZ1bmN0aW9ue3NldHVwKCl9LiAgRm9yIGV4YW1wbGUsCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLXNldHVwKC4uLgotICAgICAgZXh0X3BhY2thZ2U9J3BrZycsCi0gICAgICBleHRfbW9kdWxlcz1bRXh0ZW5zaW9uKCdmb28nLCBbJ2Zvby5jJ10pLAotICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbignc3VicGtnLmJhcicsIFsnYmFyLmMnXSldLAotICAgICApCi1cZW5ke3ZlcmJhdGltfQotCi13aWxsIGNvbXBpbGUgXGZpbGV7Zm9vLmN9IHRvIHRoZSBleHRlbnNpb24gXG1vZHVsZXtwa2cuZm9vfSwgYW5kCi1cZmlsZXtiYXIuY30gdG8gXG1vZHVsZXtwa2cuc3VicGtnLmJhcn0uCi0KLQotXHN1YnNlY3Rpb257RXh0ZW5zaW9uIHNvdXJjZSBmaWxlc30KLQotVGhlIHNlY29uZCBhcmd1bWVudCB0byB0aGUgXGNsYXNze0V4dGVuc2lvbn0gY29uc3RydWN0b3IgaXMgYSBsaXN0IG9mCi1zb3VyY2UgZmlsZXMuICBTaW5jZSB0aGUgRGlzdHV0aWxzIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgQywgXENwcCwgYW5kCi1PYmplY3RpdmUtQyBleHRlbnNpb25zLCB0aGVzZSBhcmUgbm9ybWFsbHkgQy9cQ3BwL09iamVjdGl2ZS1DIHNvdXJjZQotZmlsZXMuICAoQmUgc3VyZSB0byB1c2UgYXBwcm9wcmlhdGUgZXh0ZW5zaW9ucyB0byBkaXN0aW5ndWlzaCBcQ3BwXAotc291cmNlIGZpbGVzOiBcZmlsZXsuY2N9IGFuZCBcZmlsZXsuY3BwfSBzZWVtIHRvIGJlIHJlY29nbml6ZWQgYnkgYm90aAotXFVOSVh7fSBhbmQgV2luZG93cyBjb21waWxlcnMuKQotCi1Ib3dldmVyLCB5b3UgY2FuIGFsc28gaW5jbHVkZSBTV0lHIGludGVyZmFjZSAoXGZpbGV7Lml9KSBmaWxlcyBpbiB0aGUKLWxpc3Q7IHRoZSBcY29tbWFuZHtidWlsZFxfZXh0fSBjb21tYW5kIGtub3dzIGhvdyB0byBkZWFsIHdpdGggU1dJRwotZXh0ZW5zaW9uczogaXQgd2lsbCBydW4gU1dJRyBvbiB0aGUgaW50ZXJmYWNlIGZpbGUgYW5kIGNvbXBpbGUgdGhlCi1yZXN1bHRpbmcgQy9cQ3Bwe30gZmlsZSBpbnRvIHlvdXIgZXh0ZW5zaW9uLgotCi1cWFhYe1NXSUcgc3VwcG9ydCBpcyByb3VnaCBhcm91bmQgdGhlIGVkZ2VzIGFuZCBsYXJnZWx5IHVudGVzdGVkIX0KLQotVGhpcyB3YXJuaW5nIG5vdHdpdGhzdGFuZGluZywgb3B0aW9ucyB0byBTV0lHIGNhbiBiZSBjdXJyZW50bHkgcGFzc2VkCi1saWtlIHRoaXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXNldHVwKC4uLgotICAgICAgZXh0X21vZHVsZXM9W0V4dGVuc2lvbignX2ZvbycsIFsnZm9vLmknXSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aWdfb3B0cz1bJy1tb2Rlcm4nLCAnLUkuLi9pbmNsdWRlJ10pXSwKLSAgICAgIHB5X21vZHVsZXM9Wydmb28nXSwKLSAgICAgKQotXGVuZHt2ZXJiYXRpbX0KLQotT3Igb24gdGhlIGNvbW1hbmRsaW5lIGxpa2UgdGhpczoKLQotXGJlZ2lue3ZlcmJhdGltfQotPiBweXRob24gc2V0dXAucHkgYnVpbGRfZXh0IC0tc3dpZy1vcHRzPSItbW9kZXJuIC1JLi4vaW5jbHVkZSIKLVxlbmR7dmVyYmF0aW19Ci0KLU9uIHNvbWUgcGxhdGZvcm1zLCB5b3UgY2FuIGluY2x1ZGUgbm9uLXNvdXJjZSBmaWxlcyB0aGF0IGFyZSBwcm9jZXNzZWQKLWJ5IHRoZSBjb21waWxlciBhbmQgaW5jbHVkZWQgaW4geW91ciBleHRlbnNpb24uICBDdXJyZW50bHksIHRoaXMganVzdAotbWVhbnMgV2luZG93cyBtZXNzYWdlIHRleHQgKFxmaWxley5tY30pIGZpbGVzIGFuZCByZXNvdXJjZSBkZWZpbml0aW9uCi0oXGZpbGV7LnJjfSkgZmlsZXMgZm9yIFZpc3VhbCBcQ3BwLiBUaGVzZSB3aWxsIGJlIGNvbXBpbGVkIHRvIGJpbmFyeSByZXNvdXJjZQotKFxmaWxley5yZXN9KSBmaWxlcyBhbmQgbGlua2VkIGludG8gdGhlIGV4ZWN1dGFibGUuCi0KLQotXHN1YnNlY3Rpb257UHJlcHJvY2Vzc29yIG9wdGlvbnN9Ci0KLVRocmVlIG9wdGlvbmFsIGFyZ3VtZW50cyB0byBcY2xhc3N7RXh0ZW5zaW9ufSB3aWxsIGhlbHAgaWYgeW91IG5lZWQgdG8KLXNwZWNpZnkgaW5jbHVkZSBkaXJlY3RvcmllcyB0byBzZWFyY2ggb3IgcHJlcHJvY2Vzc29yIG1hY3JvcyB0bwotZGVmaW5lL3VuZGVmaW5lOiBcY29kZXtpbmNsdWRlXF9kaXJzfSwgXGNvZGV7ZGVmaW5lXF9tYWNyb3N9LCBhbmQKLVxjb2Rle3VuZGVmXF9tYWNyb3N9LgotCi1Gb3IgZXhhbXBsZSwgaWYgeW91ciBleHRlbnNpb24gcmVxdWlyZXMgaGVhZGVyIGZpbGVzIGluIHRoZQotXGZpbGV7aW5jbHVkZX0gZGlyZWN0b3J5IHVuZGVyIHlvdXIgZGlzdHJpYnV0aW9uIHJvb3QsIHVzZSB0aGUKLVxjb2Rle2luY2x1ZGVcX2RpcnN9IG9wdGlvbjoKLQotXGJlZ2lue3ZlcmJhdGltfQotRXh0ZW5zaW9uKCdmb28nLCBbJ2Zvby5jJ10sIGluY2x1ZGVfZGlycz1bJ2luY2x1ZGUnXSkKLVxlbmR7dmVyYmF0aW19Ci0KLVlvdSBjYW4gc3BlY2lmeSBhYnNvbHV0ZSBkaXJlY3RvcmllcyB0aGVyZTsgaWYgeW91IGtub3cgdGhhdCB5b3VyCi1leHRlbnNpb24gd2lsbCBvbmx5IGJlIGJ1aWx0IG9uIFxVTklYe30gc3lzdGVtcyB3aXRoIFgxMVI2IGluc3RhbGxlZCB0bwotXGZpbGV7L3Vzcn0sIHlvdSBjYW4gZ2V0IGF3YXkgd2l0aAotCi1cYmVnaW57dmVyYmF0aW19Ci1FeHRlbnNpb24oJ2ZvbycsIFsnZm9vLmMnXSwgaW5jbHVkZV9kaXJzPVsnL3Vzci9pbmNsdWRlL1gxMSddKQotXGVuZHt2ZXJiYXRpbX0KLQotWW91IHNob3VsZCBhdm9pZCB0aGlzIHNvcnQgb2Ygbm9uLXBvcnRhYmxlIHVzYWdlIGlmIHlvdSBwbGFuIHRvCi1kaXN0cmlidXRlIHlvdXIgY29kZTogaXQncyBwcm9iYWJseSBiZXR0ZXIgdG8gd3JpdGUgQyBjb2RlIGxpa2UKLVxiZWdpbnt2ZXJiYXRpbX0KLSNpbmNsdWRlIDxYMTEvWGxpYi5oPgotXGVuZHt2ZXJiYXRpbX0KLQotSWYgeW91IG5lZWQgdG8gaW5jbHVkZSBoZWFkZXIgZmlsZXMgZnJvbSBzb21lIG90aGVyIFB5dGhvbiBleHRlbnNpb24sCi15b3UgY2FuIHRha2UgYWR2YW50YWdlIG9mIHRoZSBmYWN0IHRoYXQgaGVhZGVyIGZpbGVzIGFyZSBpbnN0YWxsZWQgaW4gYQotY29uc2lzdGVudCB3YXkgYnkgdGhlIERpc3R1dGlscyBcY29tbWFuZHtpbnN0YWxsXF9oZWFkZXJ9IGNvbW1hbmQuICBGb3IKLWV4YW1wbGUsIHRoZSBOdW1lcmljYWwgUHl0aG9uIGhlYWRlciBmaWxlcyBhcmUgaW5zdGFsbGVkIChvbiBhIHN0YW5kYXJkCi1cVU5JWHt9IGluc3RhbGxhdGlvbikgdG8gXGZpbGV7L3Vzci9sb2NhbC9pbmNsdWRlL3B5dGhvbjEuNS9OdW1lcmljYWx9LgotKFRoZSBleGFjdCBsb2NhdGlvbiB3aWxsIGRpZmZlciBhY2NvcmRpbmcgdG8geW91ciBwbGF0Zm9ybSBhbmQgUHl0aG9uCi1pbnN0YWxsYXRpb24uKSAgU2luY2UgdGhlIFB5dGhvbiBpbmNsdWRlCi1kaXJlY3RvcnktLS1cZmlsZXsvdXNyL2xvY2FsL2luY2x1ZGUvcHl0aG9uMS41fSBpbiB0aGlzIGNhc2UtLS1pcyBhbHdheXMKLWluY2x1ZGVkIGluIHRoZSBzZWFyY2ggcGF0aCB3aGVuIGJ1aWxkaW5nIFB5dGhvbiBleHRlbnNpb25zLCB0aGUgYmVzdAotYXBwcm9hY2ggaXMgdG8gd3JpdGUgQyBjb2RlIGxpa2UKLVxiZWdpbnt2ZXJiYXRpbX0KLSNpbmNsdWRlIDxOdW1lcmljYWwvYXJyYXlvYmplY3QuaD4KLVxlbmR7dmVyYmF0aW19Ci1JZiB5b3UgbXVzdCBwdXQgdGhlIFxmaWxle051bWVyaWNhbH0gaW5jbHVkZSBkaXJlY3RvcnkgcmlnaHQgaW50byB5b3VyCi1oZWFkZXIgc2VhcmNoIHBhdGgsIHRob3VnaCwgeW91IGNhbiBmaW5kIHRoYXQgZGlyZWN0b3J5IHVzaW5nIHRoZQotRGlzdHV0aWxzIFxyZWZtb2R1bGV7ZGlzdHV0aWxzLnN5c2NvbmZpZ30gbW9kdWxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1mcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0IGdldF9weXRob25faW5jCi1pbmNkaXIgPSBvcy5wYXRoLmpvaW4oZ2V0X3B5dGhvbl9pbmMocGxhdF9zcGVjaWZpYz0xKSwgJ051bWVyaWNhbCcpCi1zZXR1cCguLi4sCi0gICAgICBFeHRlbnNpb24oLi4uLCBpbmNsdWRlX2RpcnM9W2luY2Rpcl0pLAotICAgICAgKQotXGVuZHt2ZXJiYXRpbX0KLQotRXZlbiB0aG91Z2ggdGhpcyBpcyBxdWl0ZSBwb3J0YWJsZS0tLWl0IHdpbGwgd29yayBvbiBhbnkgUHl0aG9uCi1pbnN0YWxsYXRpb24sIHJlZ2FyZGxlc3Mgb2YgcGxhdGZvcm0tLS1pdCdzIHByb2JhYmx5IGVhc2llciB0byBqdXN0Ci13cml0ZSB5b3VyIEMgY29kZSBpbiB0aGUgc2Vuc2libGUgd2F5LgotCi1Zb3UgY2FuIGRlZmluZSBhbmQgdW5kZWZpbmUgcHJlLXByb2Nlc3NvciBtYWNyb3Mgd2l0aCB0aGUKLVxjb2Rle2RlZmluZVxfbWFjcm9zfSBhbmQgXGNvZGV7dW5kZWZcX21hY3Jvc30gb3B0aW9ucy4KLVxjb2Rle2RlZmluZVxfbWFjcm9zfSB0YWtlcyBhIGxpc3Qgb2YgXGNvZGV7KG5hbWUsIHZhbHVlKX0gdHVwbGVzLCB3aGVyZQotXGNvZGV7bmFtZX0gaXMgdGhlIG5hbWUgb2YgdGhlIG1hY3JvIHRvIGRlZmluZSAoYSBzdHJpbmcpIGFuZAotXGNvZGV7dmFsdWV9IGlzIGl0cyB2YWx1ZTogZWl0aGVyIGEgc3RyaW5nIG9yIFxjb2Rle05vbmV9LiAgKERlZmluaW5nIGEKLW1hY3JvIFxjb2Rle0ZPT30gdG8gXGNvZGV7Tm9uZX0gaXMgdGhlIGVxdWl2YWxlbnQgb2YgYSBiYXJlCi1cY29kZXtcI2RlZmluZSBGT099IGluIHlvdXIgQyBzb3VyY2U6IHdpdGggbW9zdCBjb21waWxlcnMsIHRoaXMgc2V0cwotXGNvZGV7Rk9PfSB0byB0aGUgc3RyaW5nIFxjb2RlezF9LikgIFxjb2Rle3VuZGVmXF9tYWNyb3N9IGlzIGp1c3QKLWEgbGlzdCBvZiBtYWNyb3MgdG8gdW5kZWZpbmUuCi0KLUZvciBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1FeHRlbnNpb24oLi4uLAotICAgICAgICAgIGRlZmluZV9tYWNyb3M9WygnTkRFQlVHJywgJzEnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoJ0hBVkVfU1RSRlRJTUUnLCBOb25lKV0sCi0gICAgICAgICAgdW5kZWZfbWFjcm9zPVsnSEFWRV9GT08nLCAnSEFWRV9CQVInXSkKLVxlbmR7dmVyYmF0aW19Ci0KLWlzIHRoZSBlcXVpdmFsZW50IG9mIGhhdmluZyB0aGlzIGF0IHRoZSB0b3Agb2YgZXZlcnkgQyBzb3VyY2UgZmlsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotI2RlZmluZSBOREVCVUcgMQotI2RlZmluZSBIQVZFX1NUUkZUSU1FCi0jdW5kZWYgSEFWRV9GT08KLSN1bmRlZiBIQVZFX0JBUgotXGVuZHt2ZXJiYXRpbX0KLQotCi1cc3Vic2VjdGlvbntMaWJyYXJ5IG9wdGlvbnN9Ci0KLVlvdSBjYW4gYWxzbyBzcGVjaWZ5IHRoZSBsaWJyYXJpZXMgdG8gbGluayBhZ2FpbnN0IHdoZW4gYnVpbGRpbmcgeW91cgotZXh0ZW5zaW9uLCBhbmQgdGhlIGRpcmVjdG9yaWVzIHRvIHNlYXJjaCBmb3IgdGhvc2UgbGlicmFyaWVzLiAgVGhlCi1cY29kZXtsaWJyYXJpZXN9IG9wdGlvbiBpcyBhIGxpc3Qgb2YgbGlicmFyaWVzIHRvIGxpbmsgYWdhaW5zdCwKLVxjb2Rle2xpYnJhcnlcX2RpcnN9IGlzIGEgbGlzdCBvZiBkaXJlY3RvcmllcyB0byBzZWFyY2ggZm9yIGxpYnJhcmllcyBhdCAKLWxpbmstdGltZSwgYW5kIFxjb2Rle3J1bnRpbWVcX2xpYnJhcnlcX2RpcnN9IGlzIGEgbGlzdCBvZiBkaXJlY3RvcmllcyB0byAKLXNlYXJjaCBmb3Igc2hhcmVkIChkeW5hbWljYWxseSBsb2FkZWQpIGxpYnJhcmllcyBhdCBydW4tdGltZS4KLQotRm9yIGV4YW1wbGUsIGlmIHlvdSBuZWVkIHRvIGxpbmsgYWdhaW5zdCBsaWJyYXJpZXMga25vd24gdG8gYmUgaW4gdGhlCi1zdGFuZGFyZCBsaWJyYXJ5IHNlYXJjaCBwYXRoIG9uIHRhcmdldCBzeXN0ZW1zCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLUV4dGVuc2lvbiguLi4sCi0gICAgICAgICAgbGlicmFyaWVzPVsnZ2RibScsICdyZWFkbGluZSddKQotXGVuZHt2ZXJiYXRpbX0KLQotSWYgeW91IG5lZWQgdG8gbGluayB3aXRoIGxpYnJhcmllcyBpbiBhIG5vbi1zdGFuZGFyZCBsb2NhdGlvbiwgeW91J2xsCi1oYXZlIHRvIGluY2x1ZGUgdGhlIGxvY2F0aW9uIGluIFxjb2Rle2xpYnJhcnlcX2RpcnN9OgotCi1cYmVnaW57dmVyYmF0aW19Ci1FeHRlbnNpb24oLi4uLAotICAgICAgICAgIGxpYnJhcnlfZGlycz1bJy91c3IvWDExUjYvbGliJ10sCi0gICAgICAgICAgbGlicmFyaWVzPVsnWDExJywgJ1h0J10pCi1cZW5ke3ZlcmJhdGltfQotCi0oQWdhaW4sIHRoaXMgc29ydCBvZiBub24tcG9ydGFibGUgY29uc3RydWN0IHNob3VsZCBiZSBhdm9pZGVkIGlmIHlvdQotaW50ZW5kIHRvIGRpc3RyaWJ1dGUgeW91ciBjb2RlLikKLQotXFhYWHtTaG91bGQgbWVudGlvbiBjbGliIGxpYnJhcmllcyBoZXJlIG9yIHNvbWV3aGVyZSBlbHNlIX0KLQotXHN1YnNlY3Rpb257T3RoZXIgb3B0aW9uc30KLQotVGhlcmUgYXJlIHN0aWxsIHNvbWUgb3RoZXIgb3B0aW9ucyB3aGljaCBjYW4gYmUgdXNlZCB0byBoYW5kbGUgc3BlY2lhbAotY2FzZXMuCi0KLVRoZSBcb3B0aW9ue2V4dHJhXF9vYmplY3RzfSBvcHRpb24gaXMgYSBsaXN0IG9mIG9iamVjdCBmaWxlcyB0byBiZSBwYXNzZWQKLXRvIHRoZSBsaW5rZXIuIFRoZXNlIGZpbGVzIG11c3Qgbm90IGhhdmUgZXh0ZW5zaW9ucywgYXMgdGhlIGRlZmF1bHQKLWV4dGVuc2lvbiBmb3IgdGhlIGNvbXBpbGVyIGlzIHVzZWQuCi0KLVxvcHRpb257ZXh0cmFcX2NvbXBpbGVcX2FyZ3N9IGFuZCBcb3B0aW9ue2V4dHJhXF9saW5rXF9hcmdzfSBjYW4gYmUgdXNlZAotdG8gc3BlY2lmeSBhZGRpdGlvbmFsIGNvbW1hbmQgbGluZSBvcHRpb25zIGZvciB0aGUgcmVzcGVjdGl2ZSBjb21waWxlciBhbmQKLWxpbmtlciBjb21tYW5kIGxpbmVzLgotCi1cb3B0aW9ue2V4cG9ydFxfc3ltYm9sc30gaXMgb25seSB1c2VmdWwgb24gV2luZG93cy4gIEl0IGNhbiBjb250YWluIGEgbGlzdAotb2Ygc3ltYm9scyAoZnVuY3Rpb25zIG9yIHZhcmlhYmxlcykgdG8gYmUgZXhwb3J0ZWQuIFRoaXMgb3B0aW9uCi1pcyBub3QgbmVlZGVkIHdoZW4gYnVpbGRpbmcgY29tcGlsZWQgZXh0ZW5zaW9uczogRGlzdHV0aWxzIAotd2lsbCBhdXRvbWF0aWNhbGx5IGFkZCBcY29kZXtpbml0bW9kdWxlfQotdG8gdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scy4KLQotXHNlY3Rpb257UmVsYXRpb25zaGlwcyBiZXR3ZWVuIERpc3RyaWJ1dGlvbnMgYW5kIFBhY2thZ2VzfQotCi1BIGRpc3RyaWJ1dGlvbiBtYXkgcmVsYXRlIHRvIHBhY2thZ2VzIGluIHRocmVlIHNwZWNpZmljIHdheXM6Ci0KLVxiZWdpbntlbnVtZXJhdGV9Ci0gIFxpdGVtIEl0IGNhbiByZXF1aXJlIHBhY2thZ2VzIG9yIG1vZHVsZXMuCi0KLSAgXGl0ZW0gSXQgY2FuIHByb3ZpZGUgcGFja2FnZXMgb3IgbW9kdWxlcy4KLQotICBcaXRlbSBJdCBjYW4gb2Jzb2xldGUgcGFja2FnZXMgb3IgbW9kdWxlcy4KLVxlbmR7ZW51bWVyYXRlfQotCi1UaGVzZSByZWxhdGlvbnNoaXBzIGNhbiBiZSBzcGVjaWZpZWQgdXNpbmcga2V5d29yZCBhcmd1bWVudHMgdG8gdGhlCi1cZnVuY3Rpb257ZGlzdHV0aWxzLmNvcmUuc2V0dXAoKX0gZnVuY3Rpb24uCi0KLURlcGVuZGVuY2llcyBvbiBvdGhlciBQeXRob24gbW9kdWxlcyBhbmQgcGFja2FnZXMgY2FuIGJlIHNwZWNpZmllZCBieQotc3VwcGx5aW5nIHRoZSBcdmFye3JlcXVpcmVzfSBrZXl3b3JkIGFyZ3VtZW50IHRvIFxmdW5jdGlvbntzZXR1cCgpfS4KLVRoZSB2YWx1ZSBtdXN0IGJlIGEgbGlzdCBvZiBzdHJpbmdzLiAgRWFjaCBzdHJpbmcgc3BlY2lmaWVzIGEgcGFja2FnZQotdGhhdCBpcyByZXF1aXJlZCwgYW5kIG9wdGlvbmFsbHkgd2hhdCB2ZXJzaW9ucyBhcmUgc3VmZmljaWVudC4KLQotVG8gc3BlY2lmeSB0aGF0IGFueSB2ZXJzaW9uIG9mIGEgbW9kdWxlIG9yIHBhY2thZ2UgaXMgcmVxdWlyZWQsIHRoZQotc3RyaW5nIHNob3VsZCBjb25zaXN0IGVudGlyZWx5IG9mIHRoZSBtb2R1bGUgb3IgcGFja2FnZSBuYW1lLgotRXhhbXBsZXMgaW5jbHVkZSBcY29kZXsnbXltb2R1bGUnfSBhbmQgXGNvZGV7J3htbC5wYXJzZXJzLmV4cGF0J30uCi0KLUlmIHNwZWNpZmljIHZlcnNpb25zIGFyZSByZXF1aXJlZCwgYSBzZXF1ZW5jZSBvZiBxdWFsaWZpZXJzIGNhbiBiZQotc3VwcGxpZWQgaW4gcGFyZW50aGVzZXMuICBFYWNoIHF1YWxpZmllciBtYXkgY29uc2lzdCBvZiBhIGNvbXBhcmlzb24KLW9wZXJhdG9yIGFuZCBhIHZlcnNpb24gbnVtYmVyLiAgVGhlIGFjY2VwdGVkIGNvbXBhcmlzb24gb3BlcmF0b3JzIGFyZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPCAgICA+ICAgID09Ci08PSAgID49ICAgIT0KLVxlbmR7dmVyYmF0aW19Ci0KLVRoZXNlIGNhbiBiZSBjb21iaW5lZCBieSB1c2luZyBtdWx0aXBsZSBxdWFsaWZpZXJzIHNlcGFyYXRlZCBieSBjb21tYXMKLShhbmQgb3B0aW9uYWwgd2hpdGVzcGFjZSkuICBJbiB0aGlzIGNhc2UsIGFsbCBvZiB0aGUgcXVhbGlmaWVycyBtdXN0Ci1iZSBtYXRjaGVkOyBhIGxvZ2ljYWwgQU5EIGlzIHVzZWQgdG8gY29tYmluZSB0aGUgZXZhbHVhdGlvbnMuCi0KLUxldCdzIGxvb2sgYXQgYSBidW5jaCBvZiBleGFtcGxlczoKLQotXGJlZ2lue3RhYmxlaWl9e2x8bH17Y29kZX17UmVxdWlyZXMgRXhwcmVzc2lvbn17RXhwbGFuYXRpb259Ci0gIFxsaW5laWl7PT0xLjB9ICAgICAgICAgICAgICAge09ubHkgdmVyc2lvbiBcY29kZXsxLjB9IGlzIGNvbXBhdGlibGV9Ci0gIFxsaW5laWl7PjEuMCwgIT0xLjUuMSwgPDIuMH0ge0FueSB2ZXJzaW9uIGFmdGVyIFxjb2RlezEuMH0gYW5kIGJlZm9yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcY29kZXsyLjB9IGlzIGNvbXBhdGlibGUsIGV4Y2VwdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcY29kZXsxLjUuMX19Ci1cZW5ke3RhYmxlaWl9Ci0KLU5vdyB0aGF0IHdlIGNhbiBzcGVjaWZ5IGRlcGVuZGVuY2llcywgd2UgYWxzbyBuZWVkIHRvIGJlIGFibGUgdG8KLXNwZWNpZnkgd2hhdCB3ZSBwcm92aWRlIHRoYXQgb3RoZXIgZGlzdHJpYnV0aW9ucyBjYW4gcmVxdWlyZS4gIFRoaXMgaXMKLWRvbmUgdXNpbmcgdGhlIFx2YXJ7cHJvdmlkZXN9IGtleXdvcmQgYXJndW1lbnQgdG8gXGZ1bmN0aW9ue3NldHVwKCl9LgotVGhlIHZhbHVlIGZvciB0aGlzIGtleXdvcmQgaXMgYSBsaXN0IG9mIHN0cmluZ3MsIGVhY2ggb2Ygd2hpY2ggbmFtZXMgYQotUHl0aG9uIG1vZHVsZSBvciBwYWNrYWdlLCBhbmQgb3B0aW9uYWxseSBpZGVudGlmaWVzIHRoZSB2ZXJzaW9uLiAgSWYKLXRoZSB2ZXJzaW9uIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGlzIGFzc3VtZWQgdG8gbWF0Y2ggdGhhdCBvZiB0aGUKLWRpc3RyaWJ1dGlvbi4KLQotU29tZSBleGFtcGxlczoKLQotXGJlZ2lue3RhYmxlaWl9e2x8bH17Y29kZX17UHJvdmlkZXMgRXhwcmVzc2lvbn17RXhwbGFuYXRpb259Ci0gIFxsaW5laWl7bXlwa2d9ICAgICAge1Byb3ZpZGUgXGNvZGV7bXlwa2d9LCB1c2luZyB0aGUgZGlzdHJpYnV0aW9uIHZlcnNpb259Ci0gIFxsaW5laWl7bXlwa2cgKDEuMSl9IHtQcm92aWRlIFxjb2Rle215cGtnfSB2ZXJzaW9uIDEuMSwgcmVnYXJkbGVzcyBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uIHZlcnNpb259Ci1cZW5ke3RhYmxlaWl9Ci0KLUEgcGFja2FnZSBjYW4gZGVjbGFyZSB0aGF0IGl0IG9ic29sZXRlcyBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUKLVx2YXJ7b2Jzb2xldGVzfSBrZXl3b3JkIGFyZ3VtZW50LiAgVGhlIHZhbHVlIGZvciB0aGlzIGlzIHNpbWlsYXIgdG8KLXRoYXQgb2YgdGhlIFx2YXJ7cmVxdWlyZXN9IGtleXdvcmQ6IGEgbGlzdCBvZiBzdHJpbmdzIGdpdmluZyBtb2R1bGUgb3IKLXBhY2thZ2Ugc3BlY2lmaWVycy4gIEVhY2ggc3BlY2lmaWVyIGNvbnNpc3RzIG9mIGEgbW9kdWxlIG9yIHBhY2thZ2UKLW5hbWUgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSB2ZXJzaW9uIHF1YWxpZmllcnMuICBWZXJzaW9uCi1xdWFsaWZpZXJzIGFyZSBnaXZlbiBpbiBwYXJlbnRoZXNlcyBhZnRlciB0aGUgbW9kdWxlIG9yIHBhY2thZ2UgbmFtZS4KLQotVGhlIHZlcnNpb25zIGlkZW50aWZpZWQgYnkgdGhlIHF1YWxpZmllcnMgYXJlIHRob3NlIHRoYXQgYXJlIG9ic29sZXRlZAotYnkgdGhlIGRpc3RyaWJ1dGlvbiBiZWluZyBkZXNjcmliZWQuICBJZiBubyBxdWFsaWZpZXJzIGFyZSBnaXZlbiwgYWxsCi12ZXJzaW9ucyBvZiB0aGUgbmFtZWQgbW9kdWxlIG9yIHBhY2thZ2UgYXJlIHVuZGVyc3Rvb2QgdG8gYmUKLW9ic29sZXRlZC4KLQotCi1cc2VjdGlvbntJbnN0YWxsaW5nIFNjcmlwdHN9Ci0KLVNvIGZhciB3ZSBoYXZlIGJlZW4gZGVhbGluZyB3aXRoIHB1cmUgYW5kIG5vbi1wdXJlIFB5dGhvbiBtb2R1bGVzLAotd2hpY2ggYXJlIHVzdWFsbHkgbm90IHJ1biBieSB0aGVtc2VsdmVzIGJ1dCBpbXBvcnRlZCBieSBzY3JpcHRzLgotCi1TY3JpcHRzIGFyZSBmaWxlcyBjb250YWluaW5nIFB5dGhvbiBzb3VyY2UgY29kZSwgaW50ZW5kZWQgdG8gYmUKLXN0YXJ0ZWQgZnJvbSB0aGUgY29tbWFuZCBsaW5lLiAgU2NyaXB0cyBkb24ndCByZXF1aXJlIERpc3R1dGlscyB0byBkbwotYW55dGhpbmcgdmVyeSBjb21wbGljYXRlZC4gIFRoZSBvbmx5IGNsZXZlciBmZWF0dXJlIGlzIHRoYXQgaWYgdGhlCi1maXJzdCBsaW5lIG9mIHRoZSBzY3JpcHQgc3RhcnRzIHdpdGggXGNvZGV7XCMhfSBhbmQgY29udGFpbnMgdGhlIHdvcmQKLWBgcHl0aG9uJycsIHRoZSBEaXN0dXRpbHMgd2lsbCBhZGp1c3QgdGhlIGZpcnN0IGxpbmUgdG8gcmVmZXIgdG8gdGhlCi1jdXJyZW50IGludGVycHJldGVyIGxvY2F0aW9uLiBCeSBkZWZhdWx0LCBpdCBpcyByZXBsYWNlZCB3aXRoIHRoZQotY3VycmVudCBpbnRlcnByZXRlciBsb2NhdGlvbi4gIFRoZSBcbG9uZ3Byb2dyYW1vcHR7ZXhlY3V0YWJsZX0gKG9yCi1ccHJvZ3JhbW9wdHstZX0pIG9wdGlvbiB3aWxsIGFsbG93IHRoZSBpbnRlcnByZXRlciBwYXRoIHRvIGJlCi1leHBsaWNpdGx5IG92ZXJyaWRkZW4uCi0KLVRoZSBcb3B0aW9ue3NjcmlwdHN9IG9wdGlvbiBzaW1wbHkgaXMgYSBsaXN0IG9mIGZpbGVzIHRvIGJlIGhhbmRsZWQKLWluIHRoaXMgd2F5LiAgRnJvbSB0aGUgUHlYTUwgc2V0dXAgc2NyaXB0OgotCi1cYmVnaW57dmVyYmF0aW19Ci1zZXR1cCguLi4gCi0gICAgICBzY3JpcHRzPVsnc2NyaXB0cy94bWxwcm9jX3BhcnNlJywgJ3NjcmlwdHMveG1scHJvY192YWwnXQotICAgICAgKQotXGVuZHt2ZXJiYXRpbX0KLQotCi1cc2VjdGlvbntJbnN0YWxsaW5nIFBhY2thZ2UgRGF0YX0KLQotT2Z0ZW4sIGFkZGl0aW9uYWwgZmlsZXMgbmVlZCB0byBiZSBpbnN0YWxsZWQgaW50byBhIHBhY2thZ2UuICBUaGVzZQotZmlsZXMgYXJlIG9mdGVuIGRhdGEgdGhhdCdzIGNsb3NlbHkgcmVsYXRlZCB0byB0aGUgcGFja2FnZSdzCi1pbXBsZW1lbnRhdGlvbiwgb3IgdGV4dCBmaWxlcyBjb250YWluaW5nIGRvY3VtZW50YXRpb24gdGhhdCBtaWdodCBiZQotb2YgaW50ZXJlc3QgdG8gcHJvZ3JhbW1lcnMgdXNpbmcgdGhlIHBhY2thZ2UuICBUaGVzZSBmaWxlcyBhcmUgY2FsbGVkCi1cZGZue3BhY2thZ2UgZGF0YX0uCi0KLVBhY2thZ2UgZGF0YSBjYW4gYmUgYWRkZWQgdG8gcGFja2FnZXMgdXNpbmcgdGhlIFxjb2Rle3BhY2thZ2VfZGF0YX0KLWtleXdvcmQgYXJndW1lbnQgdG8gdGhlIFxmdW5jdGlvbntzZXR1cCgpfSBmdW5jdGlvbi4gIFRoZSB2YWx1ZSBtdXN0Ci1iZSBhIG1hcHBpbmcgZnJvbSBwYWNrYWdlIG5hbWUgdG8gYSBsaXN0IG9mIHJlbGF0aXZlIHBhdGggbmFtZXMgdGhhdAotc2hvdWxkIGJlIGNvcGllZCBpbnRvIHRoZSBwYWNrYWdlLiAgVGhlIHBhdGhzIGFyZSBpbnRlcnByZXRlZCBhcwotcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBwYWNrYWdlIChpbmZvcm1hdGlvbiBmcm9tIHRoZQotXGNvZGV7cGFja2FnZV9kaXJ9IG1hcHBpbmcgaXMgdXNlZCBpZiBhcHByb3ByaWF0ZSk7IHRoYXQgaXMsIHRoZSBmaWxlcwotYXJlIGV4cGVjdGVkIHRvIGJlIHBhcnQgb2YgdGhlIHBhY2thZ2UgaW4gdGhlIHNvdXJjZSBkaXJlY3Rvcmllcy4KLVRoZXkgbWF5IGNvbnRhaW4gZ2xvYiBwYXR0ZXJucyBhcyB3ZWxsLgotCi1UaGUgcGF0aCBuYW1lcyBtYXkgY29udGFpbiBkaXJlY3RvcnkgcG9ydGlvbnM7IGFueSBuZWNlc3NhcnkKLWRpcmVjdG9yaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgaW5zdGFsbGF0aW9uLgotCi1Gb3IgZXhhbXBsZSwgaWYgYSBwYWNrYWdlIHNob3VsZCBjb250YWluIGEgc3ViZGlyZWN0b3J5IHdpdGggc2V2ZXJhbAotZGF0YSBmaWxlcywgdGhlIGZpbGVzIGNhbiBiZSBhcnJhbmdlZCBsaWtlIHRoaXMgaW4gdGhlIHNvdXJjZSB0cmVlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1zZXR1cC5weQotc3JjLwotICAgIG15cGtnLwotICAgICAgICBfX2luaXRfXy5weQotICAgICAgICBtb2R1bGUucHkKLSAgICAgICAgZGF0YS8KLSAgICAgICAgICAgIHRhYmxlcy5kYXQKLSAgICAgICAgICAgIHNwb29ucy5kYXQKLSAgICAgICAgICAgIGZvcmtzLmRhdAotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGNvcnJlc3BvbmRpbmcgY2FsbCB0byBcZnVuY3Rpb257c2V0dXAoKX0gbWlnaHQgYmU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXNldHVwKC4uLiwKLSAgICAgIHBhY2thZ2VzPVsnbXlwa2cnXSwKLSAgICAgIHBhY2thZ2VfZGlyPXsnbXlwa2cnOiAnc3JjL215cGtnJ30sCi0gICAgICBwYWNrYWdlX2RhdGE9eydteXBrZyc6IFsnZGF0YS8qLmRhdCddfSwKLSAgICAgICkKLVxlbmR7dmVyYmF0aW19Ci0KLQotXHZlcnNpb25hZGRlZHsyLjR9Ci0KLQotXHNlY3Rpb257SW5zdGFsbGluZyBBZGRpdGlvbmFsIEZpbGVzfQotCi1UaGUgXG9wdGlvbntkYXRhXF9maWxlc30gb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYWRkaXRpb25hbAotZmlsZXMgbmVlZGVkIGJ5IHRoZSBtb2R1bGUgZGlzdHJpYnV0aW9uOiBjb25maWd1cmF0aW9uIGZpbGVzLCBtZXNzYWdlCi1jYXRhbG9ncywgZGF0YSBmaWxlcywgYW55dGhpbmcgd2hpY2ggZG9lc24ndCBmaXQgaW4gdGhlIHByZXZpb3VzCi1jYXRlZ29yaWVzLgotCi1cb3B0aW9ue2RhdGFcX2ZpbGVzfSBzcGVjaWZpZXMgYSBzZXF1ZW5jZSBvZiAoXHZhcntkaXJlY3Rvcnl9LAotXHZhcntmaWxlc30pIHBhaXJzIGluIHRoZSBmb2xsb3dpbmcgd2F5OgotCi1cYmVnaW57dmVyYmF0aW19Ci1zZXR1cCguLi4KLSAgICAgIGRhdGFfZmlsZXM9WygnYml0bWFwcycsIFsnYm0vYjEuZ2lmJywgJ2JtL2IyLmdpZiddKSwKLSAgICAgICAgICAgICAgICAgICgnY29uZmlnJywgWydjZmcvZGF0YS5jZmcnXSksCi0gICAgICAgICAgICAgICAgICAoJy9ldGMvaW5pdC5kJywgWydpbml0LXNjcmlwdCddKV0KLSAgICAgKQotXGVuZHt2ZXJiYXRpbX0KLQotTm90ZSB0aGF0IHlvdSBjYW4gc3BlY2lmeSB0aGUgZGlyZWN0b3J5IG5hbWVzIHdoZXJlIHRoZSBkYXRhIGZpbGVzCi13aWxsIGJlIGluc3RhbGxlZCwgYnV0IHlvdSBjYW5ub3QgcmVuYW1lIHRoZSBkYXRhIGZpbGVzIHRoZW1zZWx2ZXMuCi0KLUVhY2ggKFx2YXJ7ZGlyZWN0b3J5fSwgXHZhcntmaWxlc30pIHBhaXIgaW4gdGhlIHNlcXVlbmNlIHNwZWNpZmllcyB0aGUKLWluc3RhbGxhdGlvbiBkaXJlY3RvcnkgYW5kIHRoZSBmaWxlcyB0byBpbnN0YWxsIHRoZXJlLiAgSWYKLVx2YXJ7ZGlyZWN0b3J5fSBpcyBhIHJlbGF0aXZlIHBhdGgsIGl0IGlzIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHRoZQotaW5zdGFsbGF0aW9uIHByZWZpeCAoUHl0aG9uJ3MgXGNvZGV7c3lzLnByZWZpeH0gZm9yIHB1cmUtUHl0aG9uCi1wYWNrYWdlcywgXGNvZGV7c3lzLmV4ZWNfcHJlZml4fSBmb3IgcGFja2FnZXMgdGhhdCBjb250YWluIGV4dGVuc2lvbgotbW9kdWxlcykuICBFYWNoIGZpbGUgbmFtZSBpbiBcdmFye2ZpbGVzfSBpcyBpbnRlcnByZXRlZCByZWxhdGl2ZSB0bwotdGhlIFxmaWxle3NldHVwLnB5fSBzY3JpcHQgYXQgdGhlIHRvcCBvZiB0aGUgcGFja2FnZSBzb3VyY2UKLWRpc3RyaWJ1dGlvbi4gIE5vIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiBmcm9tIFx2YXJ7ZmlsZXN9IGlzIHVzZWQgdG8KLWRldGVybWluZSB0aGUgZmluYWwgbG9jYXRpb24gb2YgdGhlIGluc3RhbGxlZCBmaWxlOyBvbmx5IHRoZSBuYW1lIG9mCi10aGUgZmlsZSBpcyB1c2VkLgotCi1Zb3UgY2FuIHNwZWNpZnkgdGhlIFxvcHRpb257ZGF0YVxfZmlsZXN9IG9wdGlvbnMgYXMgYSBzaW1wbGUgc2VxdWVuY2UKLW9mIGZpbGVzIHdpdGhvdXQgc3BlY2lmeWluZyBhIHRhcmdldCBkaXJlY3RvcnksIGJ1dCB0aGlzIGlzIG5vdCByZWNvbW1lbmRlZCwKLWFuZCB0aGUgXGNvbW1hbmR7aW5zdGFsbH0gY29tbWFuZCB3aWxsIHByaW50IGEgd2FybmluZyBpbiB0aGlzIGNhc2UuCi1UbyBpbnN0YWxsIGRhdGEgZmlsZXMgZGlyZWN0bHkgaW4gdGhlIHRhcmdldCBkaXJlY3RvcnksIGFuIGVtcHR5Ci1zdHJpbmcgc2hvdWxkIGJlIGdpdmVuIGFzIHRoZSBkaXJlY3RvcnkuCi0KLVxzZWN0aW9ue0FkZGl0aW9uYWwgbWV0YS1kYXRhfQotXGxhYmVse21ldGEtZGF0YX0KLQotVGhlIHNldHVwIHNjcmlwdCBtYXkgaW5jbHVkZSBhZGRpdGlvbmFsIG1ldGEtZGF0YSBiZXlvbmQgdGhlIG5hbWUgYW5kCi12ZXJzaW9uLiBUaGlzIGluZm9ybWF0aW9uIGluY2x1ZGVzOgotCi1cYmVnaW57dGFibGVpdn17bHxsfGx8Y317Y29kZX0lCi0gIHtNZXRhLURhdGF9e0Rlc2NyaXB0aW9ufXtWYWx1ZX17Tm90ZXN9Ci0gIFxsaW5laXZ7bmFtZX17bmFtZSBvZiB0aGUgcGFja2FnZX0KLSAgICAgICAgIHtzaG9ydCBzdHJpbmd9eygxKX0KLSAgXGxpbmVpdnt2ZXJzaW9ufXt2ZXJzaW9uIG9mIHRoaXMgcmVsZWFzZX0KLSAgICAgICAgIHtzaG9ydCBzdHJpbmd9eygxKSgyKX0KLSAgXGxpbmVpdnthdXRob3J9e3BhY2thZ2UgYXV0aG9yJ3MgbmFtZX0KLSAgICAgICAgIHtzaG9ydCBzdHJpbmd9eygzKX0KLSAgXGxpbmVpdnthdXRob3JfZW1haWx9e2VtYWlsIGFkZHJlc3Mgb2YgdGhlIHBhY2thZ2UgYXV0aG9yfQotICAgICAgICAge2VtYWlsIGFkZHJlc3N9eygzKX0KLSAgXGxpbmVpdnttYWludGFpbmVyfXtwYWNrYWdlIG1haW50YWluZXIncyBuYW1lfQotICAgICAgICAge3Nob3J0IHN0cmluZ317KDMpfQotICBcbGluZWl2e21haW50YWluZXJfZW1haWx9e2VtYWlsIGFkZHJlc3Mgb2YgdGhlIHBhY2thZ2UgbWFpbnRhaW5lcn0KLSAgICAgICAgIHtlbWFpbCBhZGRyZXNzfXsoMyl9Ci0gIFxsaW5laXZ7dXJsfXtob21lIHBhZ2UgZm9yIHRoZSBwYWNrYWdlfQotICAgICAgICAge1VSTH17KDEpfQotICBcbGluZWl2e2Rlc2NyaXB0aW9ufXtzaG9ydCwgc3VtbWFyeSBkZXNjcmlwdGlvbiBvZiB0aGUgcGFja2FnZX0KLSAgICAgICAgIHtzaG9ydCBzdHJpbmd9e30KLSAgXGxpbmVpdntsb25nX2Rlc2NyaXB0aW9ufXtsb25nZXIgZGVzY3JpcHRpb24gb2YgdGhlIHBhY2thZ2V9Ci0gICAgICAgICB7bG9uZyBzdHJpbmd9e30KLSAgXGxpbmVpdntkb3dubG9hZF91cmx9e2xvY2F0aW9uIHdoZXJlIHRoZSBwYWNrYWdlIG1heSBiZSBkb3dubG9hZGVkfQotICAgICAgICAge1VSTH17KDQpfQotICBcbGluZWl2e2NsYXNzaWZpZXJzfXthIGxpc3Qgb2YgY2xhc3NpZmllcnN9Ci0gICAgICAgICB7bGlzdCBvZiBzdHJpbmdzfXsoNCl9Ci1cZW5ke3RhYmxlaXZ9Ci0KLVxub2luZGVudCBOb3RlczoKLVxiZWdpbntkZXNjcmlwdGlvbn0KLVxpdGVtWygxKV0gVGhlc2UgZmllbGRzIGFyZSByZXF1aXJlZC4KLVxpdGVtWygyKV0gSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB2ZXJzaW9ucyB0YWtlIHRoZSBmb3JtCi0gIFxlbXBoe21ham9yLm1pbm9yXG9wdGlvbmFsey5wYXRjaFxvcHRpb25hbHsuc3VifX19LgotXGl0ZW1bKDMpXSBFaXRoZXIgdGhlIGF1dGhvciBvciB0aGUgbWFpbnRhaW5lciBtdXN0IGJlIGlkZW50aWZpZWQuCi1caXRlbVsoNCldIFRoZXNlIGZpZWxkcyBzaG91bGQgbm90IGJlIHVzZWQgaWYgeW91ciBwYWNrYWdlIGlzIHRvIGJlCi0gIGNvbXBhdGlibGUgd2l0aCBQeXRob24gdmVyc2lvbnMgcHJpb3IgdG8gMi4yLjMgb3IgMi4zLiAgVGhlIGxpc3QgaXMKLSAgYXZhaWxhYmxlIGZyb20gdGhlIFx1bGlua3tQeVBJIHdlYnNpdGV9e2h0dHA6Ly93d3cucHl0aG9uLm9yZy9weXBpfS4KLQotXGl0ZW1bJ3Nob3J0IHN0cmluZyddIEEgc2luZ2xlIGxpbmUgb2YgdGV4dCwgbm90IG1vcmUgdGhhbiAyMDAgY2hhcmFjdGVycy4KLVxpdGVtWydsb25nIHN0cmluZyddIE11bHRpcGxlIGxpbmVzIG9mIHBsYWluIHRleHQgaW4gcmVTdHJ1Y3R1cmVkVGV4dAotICBmb3JtYXQgKHNlZSBcdXJse2h0dHA6Ly9kb2N1dGlscy5zZi5uZXQvfSkuCi1caXRlbVsnbGlzdCBvZiBzdHJpbmdzJ10gU2VlIGJlbG93LgotXGVuZHtkZXNjcmlwdGlvbn0KLQotTm9uZSBvZiB0aGUgc3RyaW5nIHZhbHVlcyBtYXkgYmUgVW5pY29kZS4KLQotRW5jb2RpbmcgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gaXMgYW4gYXJ0IGluIGl0c2VsZi4gUHl0aG9uIHBhY2thZ2VzCi1nZW5lcmFsbHkgYWRoZXJlIHRvIHRoZSB2ZXJzaW9uIGZvcm1hdAotXGVtcGh7bWFqb3IubWlub3Jcb3B0aW9uYWx7LnBhdGNofVxvcHRpb25hbHtzdWJ9fS4gVGhlIG1ham9yIG51bWJlciBpcwotMCBmb3IKLWluaXRpYWwsIGV4cGVyaW1lbnRhbCByZWxlYXNlcyBvZiBzb2Z0d2FyZS4gSXQgaXMgaW5jcmVtZW50ZWQgZm9yCi1yZWxlYXNlcyB0aGF0IHJlcHJlc2VudCBtYWpvciBtaWxlc3RvbmVzIGluIGEgcGFja2FnZS4gVGhlIG1pbm9yCi1udW1iZXIgaXMgaW5jcmVtZW50ZWQgd2hlbiBpbXBvcnRhbnQgbmV3IGZlYXR1cmVzIGFyZSBhZGRlZCB0byB0aGUKLXBhY2thZ2UuIFRoZSBwYXRjaCBudW1iZXIgaW5jcmVtZW50cyB3aGVuIGJ1Zy1maXggcmVsZWFzZXMgYXJlCi1tYWRlLiBBZGRpdGlvbmFsIHRyYWlsaW5nIHZlcnNpb24gaW5mb3JtYXRpb24gaXMgc29tZXRpbWVzIHVzZWQgdG8KLWluZGljYXRlIHN1Yi1yZWxlYXNlcy4gIFRoZXNlIGFyZSAiYTEsYTIsLi4uLGFOIiAoZm9yIGFscGhhIHJlbGVhc2VzLAotd2hlcmUgZnVuY3Rpb25hbGl0eSBhbmQgQVBJIG1heSBjaGFuZ2UpLCAiYjEsYjIsLi4uLGJOIiAoZm9yIGJldGEKLXJlbGVhc2VzLCB3aGljaCBvbmx5IGZpeCBidWdzKSBhbmQgInByMSxwcjIsLi4uLHByTiIgKGZvciBmaW5hbAotcHJlLXJlbGVhc2UgcmVsZWFzZSB0ZXN0aW5nKS4gU29tZSBleGFtcGxlczoKLQotXGJlZ2lue2Rlc2NyaXB0aW9ufQotXGl0ZW1bMC4xLjBdIHRoZSBmaXJzdCwgZXhwZXJpbWVudGFsIHJlbGVhc2Ugb2YgYSBwYWNrYWdlCi1caXRlbVsxLjAuMWEyXSB0aGUgc2Vjb25kIGFscGhhIHJlbGVhc2Ugb2YgdGhlIGZpcnN0IHBhdGNoIHZlcnNpb24gb2YgMS4wCi1cZW5ke2Rlc2NyaXB0aW9ufQotCi1cb3B0aW9ue2NsYXNzaWZpZXJzfSBhcmUgc3BlY2lmaWVkIGluIGEgcHl0aG9uIGxpc3Q6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXNldHVwKC4uLgotICAgICAgY2xhc3NpZmllcnM9WwotICAgICAgICAgICdEZXZlbG9wbWVudCBTdGF0dXMgOjogNCAtIEJldGEnLAotICAgICAgICAgICdFbnZpcm9ubWVudCA6OiBDb25zb2xlJywKLSAgICAgICAgICAnRW52aXJvbm1lbnQgOjogV2ViIEVudmlyb25tZW50JywKLSAgICAgICAgICAnSW50ZW5kZWQgQXVkaWVuY2UgOjogRW5kIFVzZXJzL0Rlc2t0b3AnLAotICAgICAgICAgICdJbnRlbmRlZCBBdWRpZW5jZSA6OiBEZXZlbG9wZXJzJywKLSAgICAgICAgICAnSW50ZW5kZWQgQXVkaWVuY2UgOjogU3lzdGVtIEFkbWluaXN0cmF0b3JzJywKLSAgICAgICAgICAnTGljZW5zZSA6OiBPU0kgQXBwcm92ZWQgOjogUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24gTGljZW5zZScsCi0gICAgICAgICAgJ09wZXJhdGluZyBTeXN0ZW0gOjogTWFjT1MgOjogTWFjT1MgWCcsCi0gICAgICAgICAgJ09wZXJhdGluZyBTeXN0ZW0gOjogTWljcm9zb2Z0IDo6IFdpbmRvd3MnLAotICAgICAgICAgICdPcGVyYXRpbmcgU3lzdGVtIDo6IFBPU0lYJywKLSAgICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uJywKLSAgICAgICAgICAnVG9waWMgOjogQ29tbXVuaWNhdGlvbnMgOjogRW1haWwnLAotICAgICAgICAgICdUb3BpYyA6OiBPZmZpY2UvQnVzaW5lc3MnLAotICAgICAgICAgICdUb3BpYyA6OiBTb2Z0d2FyZSBEZXZlbG9wbWVudCA6OiBCdWcgVHJhY2tpbmcnLAotICAgICAgICAgIF0sCi0gICAgICApCi1cZW5ke3ZlcmJhdGltfQotCi1JZiB5b3Ugd2lzaCB0byBpbmNsdWRlIGNsYXNzaWZpZXJzIGluIHlvdXIgXGZpbGV7c2V0dXAucHl9IGZpbGUgYW5kIGFsc28KLXdpc2ggdG8gcmVtYWluIGJhY2t3YXJkcy1jb21wYXRpYmxlIHdpdGggUHl0aG9uIHJlbGVhc2VzIHByaW9yIHRvIDIuMi4zLAotdGhlbiB5b3UgY2FuIGluY2x1ZGUgdGhlIGZvbGxvd2luZyBjb2RlIGZyYWdtZW50IGluIHlvdXIgXGZpbGV7c2V0dXAucHl9Ci1iZWZvcmUgdGhlIFxmdW5jdGlvbntzZXR1cCgpfSBjYWxsLgotCi1cYmVnaW57dmVyYmF0aW19Ci0jIHBhdGNoIGRpc3R1dGlscyBpZiBpdCBjYW4ndCBjb3BlIHdpdGggdGhlICJjbGFzc2lmaWVycyIgb3IKLSMgImRvd25sb2FkX3VybCIga2V5d29yZHMKLWZyb20gc3lzIGltcG9ydCB2ZXJzaW9uCi1pZiB2ZXJzaW9uIDwgJzIuMi4zJzoKLSAgICBmcm9tIGRpc3R1dGlscy5kaXN0IGltcG9ydCBEaXN0cmlidXRpb25NZXRhZGF0YQotICAgIERpc3RyaWJ1dGlvbk1ldGFkYXRhLmNsYXNzaWZpZXJzID0gTm9uZQotICAgIERpc3RyaWJ1dGlvbk1ldGFkYXRhLmRvd25sb2FkX3VybCA9IE5vbmUKLVxlbmR7dmVyYmF0aW19Ci0KLQotXHNlY3Rpb257RGVidWdnaW5nIHRoZSBzZXR1cCBzY3JpcHR9Ci0KLVNvbWV0aW1lcyB0aGluZ3MgZ28gd3JvbmcsIGFuZCB0aGUgc2V0dXAgc2NyaXB0IGRvZXNuJ3QgZG8gd2hhdCB0aGUKLWRldmVsb3BlciB3YW50cy4KLQotRGlzdHV0aWxzIGNhdGNoZXMgYW55IGV4Y2VwdGlvbnMgd2hlbiBydW5uaW5nIHRoZSBzZXR1cCBzY3JpcHQsIGFuZAotcHJpbnQgYSBzaW1wbGUgZXJyb3IgbWVzc2FnZSBiZWZvcmUgdGhlIHNjcmlwdCBpcyB0ZXJtaW5hdGVkLiAgVGhlCi1tb3RpdmF0aW9uIGZvciB0aGlzIGJlaGF2aW91ciBpcyB0byBub3QgY29uZnVzZSBhZG1pbmlzdHJhdG9ycyB3aG8KLWRvbid0IGtub3cgbXVjaCBhYm91dCBQeXRob24gYW5kIGFyZSB0cnlpbmcgdG8gaW5zdGFsbCBhIHBhY2thZ2UuICBJZgotdGhleSBnZXQgYSBiaWcgbG9uZyB0cmFjZWJhY2sgZnJvbSBkZWVwIGluc2lkZSB0aGUgZ3V0cyBvZiBEaXN0dXRpbHMsCi10aGV5IG1heSB0aGluayB0aGUgcGFja2FnZSBvciB0aGUgUHl0aG9uIGluc3RhbGxhdGlvbiBpcyBicm9rZW4KLWJlY2F1c2UgdGhleSBkb24ndCByZWFkIGFsbCB0aGUgd2F5IGRvd24gdG8gdGhlIGJvdHRvbSBhbmQgc2VlIHRoYXQKLWl0J3MgYSBwZXJtaXNzaW9uIHByb2JsZW0uCi0KLU9uIHRoZSBvdGhlciBoYW5kLCB0aGlzIGRvZXNuJ3QgaGVscCB0aGUgZGV2ZWxvcGVyIHRvIGZpbmQgdGhlIGNhdXNlCi1vZiB0aGUgZmFpbHVyZS4gRm9yIHRoaXMgcHVycG9zZSwgdGhlIERJU1RVVElMU19ERUJVRyBlbnZpcm9ubWVudAotdmFyaWFibGUgY2FuIGJlIHNldCB0byBhbnl0aGluZyBleGNlcHQgYW4gZW1wdHkgc3RyaW5nLCBhbmQgZGlzdHV0aWxzCi13aWxsIG5vdyBwcmludCBkZXRhaWxlZCBpbmZvcm1hdGlvbiB3aGF0IGl0IGlzIGRvaW5nLCBhbmQgcHJpbnRzIHRoZQotZnVsbCB0cmFjZWJhY2sgaW4gY2FzZSBhbiBleGNlcHRpb24gb2NjdXJzLgotCi1cY2hhcHRlcntXcml0aW5nIHRoZSBTZXR1cCBDb25maWd1cmF0aW9uIEZpbGV9Ci1cbGFiZWx7c2V0dXAtY29uZmlnfQotCi1PZnRlbiwgaXQncyBub3QgcG9zc2libGUgdG8gd3JpdGUgZG93biBldmVyeXRoaW5nIG5lZWRlZCB0byBidWlsZCBhCi1kaXN0cmlidXRpb24gXGVtcGh7YSBwcmlvcml9OiB5b3UgbWF5IG5lZWQgdG8gZ2V0IHNvbWUgaW5mb3JtYXRpb24gZnJvbQotdGhlIHVzZXIsIG9yIGZyb20gdGhlIHVzZXIncyBzeXN0ZW0sIGluIG9yZGVyIHRvIHByb2NlZWQuICBBcyBsb25nIGFzCi10aGF0IGluZm9ybWF0aW9uIGlzIGZhaXJseSBzaW1wbGUtLS1hIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gc2VhcmNoIGZvcgotQyBoZWFkZXIgZmlsZXMgb3IgbGlicmFyaWVzLCBmb3IgZXhhbXBsZS0tLXRoZW4gcHJvdmlkaW5nIGEKLWNvbmZpZ3VyYXRpb24gZmlsZSwgXGZpbGV7c2V0dXAuY2ZnfSwgZm9yIHVzZXJzIHRvIGVkaXQgaXMgYSBjaGVhcCBhbmQKLWVhc3kgd2F5IHRvIHNvbGljaXQgaXQuICBDb25maWd1cmF0aW9uIGZpbGVzIGFsc28gbGV0IHlvdSBwcm92aWRlCi1kZWZhdWx0IHZhbHVlcyBmb3IgYW55IGNvbW1hbmQgb3B0aW9uLCB3aGljaCB0aGUgaW5zdGFsbGVyIGNhbiB0aGVuCi1vdmVycmlkZSBlaXRoZXIgb24gdGhlIGNvbW1hbmQtbGluZSBvciBieSBlZGl0aW5nIHRoZSBjb25maWcgZmlsZS4KLQotJSAoSWYgeW91IGhhdmUgbW9yZSBhZHZhbmNlZCBuZWVkcywgc3VjaCBhcyBkZXRlcm1pbmluZyB3aGljaCBleHRlbnNpb25zCi0lIHRvIGJ1aWxkIGJhc2VkIG9uIHdoYXQgY2FwYWJpbGl0aWVzIGFyZSBwcmVzZW50IG9uIHRoZSB0YXJnZXQgc3lzdGVtLAotJSB0aGVuIHlvdSBuZWVkIHRoZSBEaXN0dXRpbHMgYGBhdXRvLWNvbmZpZ3VyYXRpb24nJyBmYWNpbGl0eS4gIFRoaXMKLSUgc3RhcnRlZCB0byBhcHBlYXIgaW4gRGlzdHV0aWxzIDAuOSBidXQsIGFzIG9mIHRoaXMgd3JpdGluZywgaXNuJ3QgbWF0dXJlIAotJSBvciBzdGFibGUgZW5vdWdoIHlldCBmb3IgcmVhbC13b3JsZCB1c2UuKQotCi1UaGUgc2V0dXAgY29uZmlndXJhdGlvbiBmaWxlIGlzIGEgdXNlZnVsIG1pZGRsZS1ncm91bmQgYmV0d2VlbiB0aGUgc2V0dXAKLXNjcmlwdC0tLXdoaWNoLCBpZGVhbGx5LCB3b3VsZCBiZSBvcGFxdWUgdG8gaW5zdGFsbGVyc1xmb290bm90ZXtUaGlzCi0gIGlkZWFsIHByb2JhYmx5IHdvbid0IGJlIGFjaGlldmVkIHVudGlsIGF1dG8tY29uZmlndXJhdGlvbiBpcyBmdWxseQotICBzdXBwb3J0ZWQgYnkgdGhlIERpc3R1dGlscy59LS0tYW5kIHRoZSBjb21tYW5kLWxpbmUgdG8gdGhlIHNldHVwCi1zY3JpcHQsIHdoaWNoIGlzIG91dHNpZGUgb2YgeW91ciBjb250cm9sIGFuZCBlbnRpcmVseSB1cCB0byB0aGUKLWluc3RhbGxlci4gIEluIGZhY3QsIFxmaWxle3NldHVwLmNmZ30gKGFuZCBhbnkgb3RoZXIgRGlzdHV0aWxzCi1jb25maWd1cmF0aW9uIGZpbGVzIHByZXNlbnQgb24gdGhlIHRhcmdldCBzeXN0ZW0pIGFyZSBwcm9jZXNzZWQgYWZ0ZXIKLXRoZSBjb250ZW50cyBvZiB0aGUgc2V0dXAgc2NyaXB0LCBidXQgYmVmb3JlIHRoZSBjb21tYW5kLWxpbmUuICBUaGlzIGhhcyAKLXNldmVyYWwgdXNlZnVsIGNvbnNlcXVlbmNlczoKLVxiZWdpbntpdGVtaXplfQotXGl0ZW0gaW5zdGFsbGVycyBjYW4gb3ZlcnJpZGUgc29tZSBvZiB3aGF0IHlvdSBwdXQgaW4gXGZpbGV7c2V0dXAucHl9IGJ5Ci0gIGVkaXRpbmcgXGZpbGV7c2V0dXAuY2ZnfQotXGl0ZW0geW91IGNhbiBwcm92aWRlIG5vbi1zdGFuZGFyZCBkZWZhdWx0cyBmb3Igb3B0aW9ucyB0aGF0IGFyZSBub3QKLSAgZWFzaWx5IHNldCBpbiBcZmlsZXtzZXR1cC5weX0KLVxpdGVtIGluc3RhbGxlcnMgY2FuIG92ZXJyaWRlIGFueXRoaW5nIGluIFxmaWxle3NldHVwLmNmZ30gdXNpbmcgdGhlCi0gIGNvbW1hbmQtbGluZSBvcHRpb25zIHRvIFxmaWxle3NldHVwLnB5fQotXGVuZHtpdGVtaXplfQotCi1UaGUgYmFzaWMgc3ludGF4IG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgc2ltcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1bY29tbWFuZF0KLW9wdGlvbj12YWx1ZQotLi4uCi1cZW5ke3ZlcmJhdGltfQotCi13aGVyZSBcdmFye2NvbW1hbmR9IGlzIG9uZSBvZiB0aGUgRGlzdHV0aWxzIGNvbW1hbmRzIChlLmcuCi1cY29tbWFuZHtidWlsZFxfcHl9LCBcY29tbWFuZHtpbnN0YWxsfSksIGFuZCBcdmFye29wdGlvbn0gaXMgb25lIG9mCi10aGUgb3B0aW9ucyB0aGF0IGNvbW1hbmQgc3VwcG9ydHMuICBBbnkgbnVtYmVyIG9mIG9wdGlvbnMgY2FuIGJlCi1zdXBwbGllZCBmb3IgZWFjaCBjb21tYW5kLCBhbmQgYW55IG51bWJlciBvZiBjb21tYW5kIHNlY3Rpb25zIGNhbiBiZQotaW5jbHVkZWQgaW4gdGhlIGZpbGUuICBCbGFuayBsaW5lcyBhcmUgaWdub3JlZCwgYXMgYXJlIGNvbW1lbnRzLCB3aGljaAotcnVuIGZyb20gYSBcY2hhcmFjdGVye1wjfSBjaGFyYWN0ZXIgdW50aWwgdGhlIGVuZCBvZiB0aGUgbGluZS4gIExvbmcKLW9wdGlvbiB2YWx1ZXMgY2FuIGJlIHNwbGl0IGFjcm9zcyBtdWx0aXBsZSBsaW5lcyBzaW1wbHkgYnkgaW5kZW50aW5nCi10aGUgY29udGludWF0aW9uIGxpbmVzLgotCi1Zb3UgY2FuIGZpbmQgb3V0IHRoZSBsaXN0IG9mIG9wdGlvbnMgc3VwcG9ydGVkIGJ5IGEgcGFydGljdWxhciBjb21tYW5kCi13aXRoIHRoZSB1bml2ZXJzYWwgXGxvbmdwcm9ncmFtb3B0e2hlbHB9IG9wdGlvbiwgZS5nLgotCi1cYmVnaW57dmVyYmF0aW19Ci0+IHB5dGhvbiBzZXR1cC5weSAtLWhlbHAgYnVpbGRfZXh0Ci1bLi4uXQotT3B0aW9ucyBmb3IgJ2J1aWxkX2V4dCcgY29tbWFuZDoKLSAgLS1idWlsZC1saWIgKC1iKSAgICAgZGlyZWN0b3J5IGZvciBjb21waWxlZCBleHRlbnNpb24gbW9kdWxlcwotICAtLWJ1aWxkLXRlbXAgKC10KSAgICBkaXJlY3RvcnkgZm9yIHRlbXBvcmFyeSBmaWxlcyAoYnVpbGQgYnktcHJvZHVjdHMpCi0gIC0taW5wbGFjZSAoLWkpICAgICAgIGlnbm9yZSBidWlsZC1saWIgYW5kIHB1dCBjb21waWxlZCBleHRlbnNpb25zIGludG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSBkaXJlY3RvcnkgYWxvbmdzaWRlIHlvdXIgcHVyZSBQeXRob24gbW9kdWxlcwotICAtLWluY2x1ZGUtZGlycyAoLUkpICBsaXN0IG9mIGRpcmVjdG9yaWVzIHRvIHNlYXJjaCBmb3IgaGVhZGVyIGZpbGVzCi0gIC0tZGVmaW5lICgtRCkgICAgICAgIEMgcHJlcHJvY2Vzc29yIG1hY3JvcyB0byBkZWZpbmUKLSAgLS11bmRlZiAoLVUpICAgICAgICAgQyBwcmVwcm9jZXNzb3IgbWFjcm9zIHRvIHVuZGVmaW5lCi0gIC0tc3dpZy1vcHRzICAgICAgICAgIGxpc3Qgb2YgU1dJRyBjb21tYW5kIGxpbmUgb3B0aW9ucyAgICAgICAgCi1bLi4uXQotXGVuZHt2ZXJiYXRpbX0KLQotTm90ZSB0aGF0IGFuIG9wdGlvbiBzcGVsbGVkIFxsb25ncHJvZ3JhbW9wdHtmb28tYmFyfSBvbiB0aGUgY29tbWFuZC1saW5lIAotaXMgc3BlbGxlZCBcb3B0aW9ue2Zvb1xfYmFyfSBpbiBjb25maWd1cmF0aW9uIGZpbGVzLgotCi1Gb3IgZXhhbXBsZSwgc2F5IHlvdSB3YW50IHlvdXIgZXh0ZW5zaW9ucyB0byBiZSBidWlsdAotYGBpbi1wbGFjZScnLS0tdGhhdCBpcywgeW91IGhhdmUgYW4gZXh0ZW5zaW9uIFxtb2R1bGV7cGtnLmV4dH0sIGFuZCB5b3UKLXdhbnQgdGhlIGNvbXBpbGVkIGV4dGVuc2lvbiBmaWxlIChcZmlsZXtleHQuc299IG9uIFxVTklYLCBzYXkpIHRvIGJlIHB1dAotaW4gdGhlIHNhbWUgc291cmNlIGRpcmVjdG9yeSBhcyB5b3VyIHB1cmUgUHl0aG9uIG1vZHVsZXMKLVxtb2R1bGV7cGtnLm1vZDF9IGFuZCBcbW9kdWxle3BrZy5tb2QyfS4gIFlvdSBjYW4gYWx3YXlzIHVzZSB0aGUKLVxsb25ncHJvZ3JhbW9wdHtpbnBsYWNlfSBvcHRpb24gb24gdGhlIGNvbW1hbmQtbGluZSB0byBlbnN1cmUgdGhpczoKLQotXGJlZ2lue3ZlcmJhdGltfQotcHl0aG9uIHNldHVwLnB5IGJ1aWxkX2V4dCAtLWlucGxhY2UKLVxlbmR7dmVyYmF0aW19Ci0KLUJ1dCB0aGlzIHJlcXVpcmVzIHRoYXQgeW91IGFsd2F5cyBzcGVjaWZ5IHRoZSBcY29tbWFuZHtidWlsZFxfZXh0fQotY29tbWFuZCBleHBsaWNpdGx5LCBhbmQgcmVtZW1iZXIgdG8gcHJvdmlkZSBcbG9uZ3Byb2dyYW1vcHR7aW5wbGFjZX0uCi1BbiBlYXNpZXIgd2F5IGlzIHRvIGBgc2V0IGFuZCBmb3JnZXQnJyB0aGlzIG9wdGlvbiwgYnkgZW5jb2RpbmcgaXQgaW4KLVxmaWxle3NldHVwLmNmZ30sIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoaXMgZGlzdHJpYnV0aW9uOgotCi1cYmVnaW57dmVyYmF0aW19Ci1bYnVpbGRfZXh0XQotaW5wbGFjZT0xCi1cZW5ke3ZlcmJhdGltfQotCi1UaGlzIHdpbGwgYWZmZWN0IGFsbCBidWlsZHMgb2YgdGhpcyBtb2R1bGUgZGlzdHJpYnV0aW9uLCB3aGV0aGVyIG9yIG5vdAoteW91IGV4cGxpY2l0bHkgc3BlY2lmeSBcY29tbWFuZHtidWlsZFxfZXh0fS4gIElmIHlvdSBpbmNsdWRlCi1cZmlsZXtzZXR1cC5jZmd9IGluIHlvdXIgc291cmNlIGRpc3RyaWJ1dGlvbiwgaXQgd2lsbCBhbHNvIGFmZmVjdAotZW5kLXVzZXIgYnVpbGRzLS0td2hpY2ggaXMgcHJvYmFibHkgYSBiYWQgaWRlYSBmb3IgdGhpcyBvcHRpb24sIHNpbmNlCi1hbHdheXMgYnVpbGRpbmcgZXh0ZW5zaW9ucyBpbi1wbGFjZSB3b3VsZCBicmVhayBpbnN0YWxsYXRpb24gb2YgdGhlCi1tb2R1bGUgZGlzdHJpYnV0aW9uLiAgSW4gY2VydGFpbiBwZWN1bGlhciBjYXNlcywgdGhvdWdoLCBtb2R1bGVzIGFyZQotYnVpbHQgcmlnaHQgaW4gdGhlaXIgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSwgc28gdGhpcyBpcyBjb25jZWl2YWJseSBhCi11c2VmdWwgYWJpbGl0eS4gIChEaXN0cmlidXRpbmcgZXh0ZW5zaW9ucyB0aGF0IGV4cGVjdCB0byBiZSBidWlsdCBpbgotdGhlaXIgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBpcyBhbG1vc3QgYWx3YXlzIGEgYmFkIGlkZWEsIHRob3VnaC4pCi0KLUFub3RoZXIgZXhhbXBsZTogY2VydGFpbiBjb21tYW5kcyB0YWtlIGEgbG90IG9mIG9wdGlvbnMgdGhhdCBkb24ndAotY2hhbmdlIGZyb20gcnVuIHRvIHJ1bjsgZm9yIGV4YW1wbGUsIFxjb21tYW5ke2JkaXN0XF9ycG19IG5lZWRzIHRvIGtub3cKLWV2ZXJ5dGhpbmcgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgYSBgYHNwZWMnJyBmaWxlIGZvciBjcmVhdGluZyBhbiBSUE0KLWRpc3RyaWJ1dGlvbi4gIFNvbWUgb2YgdGhpcyBpbmZvcm1hdGlvbiBjb21lcyBmcm9tIHRoZSBzZXR1cCBzY3JpcHQsIGFuZAotc29tZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRGlzdHV0aWxzIChzdWNoIGFzIHRoZSBsaXN0IG9mCi1maWxlcyBpbnN0YWxsZWQpLiAgQnV0IHNvbWUgb2YgaXQgaGFzIHRvIGJlIHN1cHBsaWVkIGFzIG9wdGlvbnMgdG8KLVxjb21tYW5ke2JkaXN0XF9ycG19LCB3aGljaCB3b3VsZCBiZSB2ZXJ5IHRlZGlvdXMgdG8gZG8gb24gdGhlCi1jb21tYW5kLWxpbmUgZm9yIGV2ZXJ5IHJ1bi4gIEhlbmNlLCBoZXJlIGlzIGEgc25pcHBldCBmcm9tIHRoZQotRGlzdHV0aWxzJyBvd24gXGZpbGV7c2V0dXAuY2ZnfToKLQotXGJlZ2lue3ZlcmJhdGltfQotW2JkaXN0X3JwbV0KLXJlbGVhc2UgPSAxCi1wYWNrYWdlciA9IEdyZWcgV2FyZCA8Z3dhcmRAcHl0aG9uLm5ldD4KLWRvY19maWxlcyA9IENIQU5HRVMudHh0Ci0gICAgICAgICAgICBSRUFETUUudHh0Ci0gICAgICAgICAgICBVU0FHRS50eHQKLSAgICAgICAgICAgIGRvYy8KLSAgICAgICAgICAgIGV4YW1wbGVzLwotXGVuZHt2ZXJiYXRpbX0KLQotTm90ZSB0aGF0IHRoZSBcb3B0aW9ue2RvY1xfZmlsZXN9IG9wdGlvbiBpcyBzaW1wbHkgYQotd2hpdGVzcGFjZS1zZXBhcmF0ZWQgc3RyaW5nIHNwbGl0IGFjcm9zcyBtdWx0aXBsZSBsaW5lcyBmb3IgcmVhZGFiaWxpdHkuCi0KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWV0aXRsZVsuLi9pbnN0L2NvbmZpZy1zeW50YXguaHRtbF17SW5zdGFsbGluZyBQeXRob24KLSAgICAgICAgICAgIE1vZHVsZXN9e01vcmUgaW5mb3JtYXRpb24gb24gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgaXMKLSAgICAgICAgICAgIGF2YWlsYWJsZSBpbiB0aGUgbWFudWFsIGZvciBzeXN0ZW0gYWRtaW5pc3RyYXRvcnMufQotXGVuZHtzZWVhbHNvfQotCi0KLVxjaGFwdGVye0NyZWF0aW5nIGEgU291cmNlIERpc3RyaWJ1dGlvbn0KLVxsYWJlbHtzb3VyY2UtZGlzdH0KLQotQXMgc2hvd24gaW4gc2VjdGlvbn5ccmVme3NpbXBsZS1leGFtcGxlfSwgeW91IHVzZSB0aGUKLVxjb21tYW5ke3NkaXN0fSBjb21tYW5kIHRvIGNyZWF0ZSBhIHNvdXJjZSBkaXN0cmlidXRpb24uICBJbiB0aGUKLXNpbXBsZXN0IGNhc2UsCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLXB5dGhvbiBzZXR1cC5weSBzZGlzdAotXGVuZHt2ZXJiYXRpbX0KLQotKGFzc3VtaW5nIHlvdSBoYXZlbid0IHNwZWNpZmllZCBhbnkgXGNvbW1hbmR7c2Rpc3R9IG9wdGlvbnMgaW4gdGhlIHNldHVwCi1zY3JpcHQgb3IgY29uZmlnIGZpbGUpLCBcY29tbWFuZHtzZGlzdH0gY3JlYXRlcyB0aGUgYXJjaGl2ZSBvZiB0aGUKLWRlZmF1bHQgZm9ybWF0IGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybS4gIFRoZSBkZWZhdWx0IGZvcm1hdCBpcyBhIGd6aXAnZWQKLXRhciBmaWxlIChcZmlsZXsudGFyLmd6fSkgb24gXFVOSVgsIGFuZCBaSVAgZmlsZSBvbiBXaW5kb3dzLgotCi1Zb3UgY2FuIHNwZWNpZnkgYXMgbWFueSBmb3JtYXRzIGFzIHlvdSBsaWtlIHVzaW5nIHRoZQotXGxvbmdwcm9ncmFtb3B0e2Zvcm1hdHN9IG9wdGlvbiwgZm9yIGV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXB5dGhvbiBzZXR1cC5weSBzZGlzdCAtLWZvcm1hdHM9Z3p0YXIsemlwCi1cZW5ke3ZlcmJhdGltfQotCi10byBjcmVhdGUgYSBnemlwcGVkIHRhcmJhbGwgYW5kIGEgemlwIGZpbGUuICBUaGUgYXZhaWxhYmxlIGZvcm1hdHMgYXJlOgotCi1cYmVnaW57dGFibGVpaWl9e2x8bHxjfXtjb2RlfSUKLSAge0Zvcm1hdH17RGVzY3JpcHRpb259e05vdGVzfQotICBcbGluZWlpaXt6aXB9e3ppcCBmaWxlIChcZmlsZXsuemlwfSl9eygxKSwoMyl9Ci0gIFxsaW5laWlpe2d6dGFyfXtnemlwJ2VkIHRhciBmaWxlIChcZmlsZXsudGFyLmd6fSl9eygyKSwoNCl9Ci0gIFxsaW5laWlpe2J6dGFyfXtiemlwMidlZCB0YXIgZmlsZSAoXGZpbGV7LnRhci5iejJ9KX17KDQpfQotICBcbGluZWlpaXt6dGFyfXtjb21wcmVzc2VkIHRhciBmaWxlIChcZmlsZXsudGFyLlp9KX17KDQpfQotICBcbGluZWlpaXt0YXJ9e3RhciBmaWxlIChcZmlsZXsudGFyfSl9eyg0KX0KLVxlbmR7dGFibGVpaWl9Ci0KLVxub2luZGVudCBOb3RlczoKLVxiZWdpbntkZXNjcmlwdGlvbn0KLVxpdGVtWygxKV0gZGVmYXVsdCBvbiBXaW5kb3dzCi1caXRlbVsoMildIGRlZmF1bHQgb24gXFVOSVgKLVxpdGVtWygzKV0gcmVxdWlyZXMgZWl0aGVyIGV4dGVybmFsIFxwcm9ncmFte3ppcH0gdXRpbGl0eSBvcgotICBcbW9kdWxle3ppcGZpbGV9IG1vZHVsZSAocGFydCBvZiB0aGUgc3RhbmRhcmQgUHl0aG9uIGxpYnJhcnkgc2luY2UKLSAgUHl0aG9ufjEuNikKLVxpdGVtWyg0KV0gcmVxdWlyZXMgZXh0ZXJuYWwgdXRpbGl0aWVzOiBccHJvZ3JhbXt0YXJ9IGFuZCBwb3NzaWJseSBvbmUKLSAgb2YgXHByb2dyYW17Z3ppcH0sIFxwcm9ncmFte2J6aXAyfSwgb3IgXHByb2dyYW17Y29tcHJlc3N9Ci1cZW5ke2Rlc2NyaXB0aW9ufQotCi0KLQotXHNlY3Rpb257U3BlY2lmeWluZyB0aGUgZmlsZXMgdG8gZGlzdHJpYnV0ZX0KLVxsYWJlbHttYW5pZmVzdH0KLQotSWYgeW91IGRvbid0IHN1cHBseSBhbiBleHBsaWNpdCBsaXN0IG9mIGZpbGVzIChvciBpbnN0cnVjdGlvbnMgb24gaG93IHRvCi1nZW5lcmF0ZSBvbmUpLCB0aGUgXGNvbW1hbmR7c2Rpc3R9IGNvbW1hbmQgcHV0cyBhIG1pbmltYWwgZGVmYXVsdCBzZXQKLWludG8gdGhlIHNvdXJjZSBkaXN0cmlidXRpb246Ci1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtIGFsbCBQeXRob24gc291cmNlIGZpbGVzIGltcGxpZWQgYnkgdGhlIFxvcHRpb257cHlcX21vZHVsZXN9IGFuZAotICBcb3B0aW9ue3BhY2thZ2VzfSBvcHRpb25zCi1caXRlbSBhbGwgQyBzb3VyY2UgZmlsZXMgbWVudGlvbmVkIGluIHRoZSBcb3B0aW9ue2V4dFxfbW9kdWxlc30gb3IKLSAgXG9wdGlvbntsaWJyYXJpZXN9IG9wdGlvbnMgKFxYWFh7Z2V0dGluZyBDIGxpYnJhcnkgc291cmNlcyBjdXJyZW50bHkKLSAgICBicm9rZW4tLS1ubyBcbWV0aG9ke2dldF9zb3VyY2VfZmlsZXMoKX0gbWV0aG9kIGluIFxmaWxle2J1aWxkX2NsaWIucHl9IX0pCi1caXRlbSBzY3JpcHRzIGlkZW50aWZpZWQgYnkgdGhlIFxvcHRpb257c2NyaXB0c30gb3B0aW9uCi1caXRlbSBhbnl0aGluZyB0aGF0IGxvb2tzIGxpa2UgYSB0ZXN0IHNjcmlwdDogXGZpbGV7dGVzdC90ZXN0Ki5weX0KLSAgKGN1cnJlbnRseSwgdGhlIERpc3R1dGlscyBkb24ndCBkbyBhbnl0aGluZyB3aXRoIHRlc3Qgc2NyaXB0cyBleGNlcHQKLSAgaW5jbHVkZSB0aGVtIGluIHNvdXJjZSBkaXN0cmlidXRpb25zLCBidXQgaW4gdGhlIGZ1dHVyZSB0aGVyZSB3aWxsIGJlCi0gIGEgc3RhbmRhcmQgZm9yIHRlc3RpbmcgUHl0aG9uIG1vZHVsZSBkaXN0cmlidXRpb25zKQotXGl0ZW0gXGZpbGV7UkVBRE1FLnR4dH0gKG9yIFxmaWxle1JFQURNRX0pLCBcZmlsZXtzZXR1cC5weX0gKG9yIHdoYXRldmVyIAotICB5b3UgY2FsbGVkIHlvdXIgc2V0dXAgc2NyaXB0KSwgYW5kIFxmaWxle3NldHVwLmNmZ30KLVxlbmR7aXRlbWl6ZX0KLQotU29tZXRpbWVzIHRoaXMgaXMgZW5vdWdoLCBidXQgdXN1YWxseSB5b3Ugd2lsbCB3YW50IHRvIHNwZWNpZnkKLWFkZGl0aW9uYWwgZmlsZXMgdG8gZGlzdHJpYnV0ZS4gIFRoZSB0eXBpY2FsIHdheSB0byBkbyB0aGlzIGlzIHRvIHdyaXRlCi1hIFxlbXBoe21hbmlmZXN0IHRlbXBsYXRlfSwgY2FsbGVkIFxmaWxle01BTklGRVNULmlufSBieSBkZWZhdWx0LiAgVGhlCi1tYW5pZmVzdCB0ZW1wbGF0ZSBpcyBqdXN0IGEgbGlzdCBvZiBpbnN0cnVjdGlvbnMgZm9yIGhvdyB0byBnZW5lcmF0ZQoteW91ciBtYW5pZmVzdCBmaWxlLCBcZmlsZXtNQU5JRkVTVH0sIHdoaWNoIGlzIHRoZSBleGFjdCBsaXN0IG9mIGZpbGVzIHRvCi1pbmNsdWRlIGluIHlvdXIgc291cmNlIGRpc3RyaWJ1dGlvbi4gIFRoZSBcY29tbWFuZHtzZGlzdH0gY29tbWFuZAotcHJvY2Vzc2VzIHRoaXMgdGVtcGxhdGUgYW5kIGdlbmVyYXRlcyBhIG1hbmlmZXN0IGJhc2VkIG9uIGl0cwotaW5zdHJ1Y3Rpb25zIGFuZCB3aGF0IGl0IGZpbmRzIGluIHRoZSBmaWxlc3lzdGVtLgotCi1JZiB5b3UgcHJlZmVyIHRvIHJvbGwgeW91ciBvd24gbWFuaWZlc3QgZmlsZSwgdGhlIGZvcm1hdCBpcyBzaW1wbGU6IG9uZQotZmlsZW5hbWUgcGVyIGxpbmUsIHJlZ3VsYXIgZmlsZXMgKG9yIHN5bWxpbmtzIHRvIHRoZW0pIG9ubHkuICBJZiB5b3UgZG8KLXN1cHBseSB5b3VyIG93biBcZmlsZXtNQU5JRkVTVH0sIHlvdSBtdXN0IHNwZWNpZnkgZXZlcnl0aGluZzogdGhlCi1kZWZhdWx0IHNldCBvZiBmaWxlcyBkZXNjcmliZWQgYWJvdmUgZG9lcyBub3QgYXBwbHkgaW4gdGhpcyBjYXNlLgotCi1UaGUgbWFuaWZlc3QgdGVtcGxhdGUgaGFzIG9uZSBjb21tYW5kIHBlciBsaW5lLCB3aGVyZSBlYWNoIGNvbW1hbmQKLXNwZWNpZmllcyBhIHNldCBvZiBmaWxlcyB0byBpbmNsdWRlIG9yIGV4Y2x1ZGUgZnJvbSB0aGUgc291cmNlCi1kaXN0cmlidXRpb24uICBGb3IgYW4gZXhhbXBsZSwgYWdhaW4gd2UgdHVybiB0byB0aGUgRGlzdHV0aWxzJyBvd24KLW1hbmlmZXN0IHRlbXBsYXRlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbmNsdWRlICoudHh0Ci1yZWN1cnNpdmUtaW5jbHVkZSBleGFtcGxlcyAqLnR4dCAqLnB5Ci1wcnVuZSBleGFtcGxlcy9zYW1wbGU/L2J1aWxkCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgbWVhbmluZ3Mgc2hvdWxkIGJlIGZhaXJseSBjbGVhcjogaW5jbHVkZSBhbGwgZmlsZXMgaW4gdGhlCi1kaXN0cmlidXRpb24gcm9vdCBtYXRjaGluZyBcZmlsZXsqLnR4dH0sIGFsbCBmaWxlcyBhbnl3aGVyZSB1bmRlciB0aGUKLVxmaWxle2V4YW1wbGVzfSBkaXJlY3RvcnkgbWF0Y2hpbmcgXGZpbGV7Ki50eHR9IG9yIFxmaWxleyoucHl9LCBhbmQKLWV4Y2x1ZGUgYWxsIGRpcmVjdG9yaWVzIG1hdGNoaW5nIFxmaWxle2V4YW1wbGVzL3NhbXBsZT8vYnVpbGR9LiAgQWxsIG9mCi10aGlzIGlzIGRvbmUgXGVtcGh7YWZ0ZXJ9IHRoZSBzdGFuZGFyZCBpbmNsdWRlIHNldCwgc28geW91IGNhbiBleGNsdWRlCi1maWxlcyBmcm9tIHRoZSBzdGFuZGFyZCBzZXQgd2l0aCBleHBsaWNpdCBpbnN0cnVjdGlvbnMgaW4gdGhlIG1hbmlmZXN0Ci10ZW1wbGF0ZS4gIChPciwgeW91IGNhbiB1c2UgdGhlIFxsb25ncHJvZ3JhbW9wdHtuby1kZWZhdWx0c30gb3B0aW9uIHRvCi1kaXNhYmxlIHRoZSBzdGFuZGFyZCBzZXQgZW50aXJlbHkuKSAgVGhlcmUgYXJlIHNldmVyYWwgb3RoZXIgY29tbWFuZHMKLWF2YWlsYWJsZSBpbiB0aGUgbWFuaWZlc3QgdGVtcGxhdGUgbWluaS1sYW5ndWFnZTsgc2VlCi1zZWN0aW9uflxyZWZ7c2Rpc3QtY21kfS4KLQotVGhlIG9yZGVyIG9mIGNvbW1hbmRzIGluIHRoZSBtYW5pZmVzdCB0ZW1wbGF0ZSBtYXR0ZXJzOiBpbml0aWFsbHksIHdlCi1oYXZlIHRoZSBsaXN0IG9mIGRlZmF1bHQgZmlsZXMgYXMgZGVzY3JpYmVkIGFib3ZlLCBhbmQgZWFjaCBjb21tYW5kIGluCi10aGUgdGVtcGxhdGUgYWRkcyB0byBvciByZW1vdmVzIGZyb20gdGhhdCBsaXN0IG9mIGZpbGVzLiAgT25jZSB3ZSBoYXZlCi1mdWxseSBwcm9jZXNzZWQgdGhlIG1hbmlmZXN0IHRlbXBsYXRlLCB3ZSByZW1vdmUgZmlsZXMgdGhhdCBzaG91bGQgbm90Ci1iZSBpbmNsdWRlZCBpbiB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbjoKLVxiZWdpbntpdGVtaXplfQotXGl0ZW0gYWxsIGZpbGVzIGluIHRoZSBEaXN0dXRpbHMgYGBidWlsZCcnIHRyZWUgKGRlZmF1bHQgXGZpbGV7YnVpbGQvfSkKLVxpdGVtIGFsbCBmaWxlcyBpbiBkaXJlY3RvcmllcyBuYW1lZCBcZmlsZXtSQ1N9LCBcZmlsZXtDVlN9IG9yIFxmaWxley5zdm59Ci1cZW5ke2l0ZW1pemV9Ci1Ob3cgd2UgaGF2ZSBvdXIgY29tcGxldGUgbGlzdCBvZiBmaWxlcywgd2hpY2ggaXMgd3JpdHRlbiB0byB0aGUgbWFuaWZlc3QKLWZvciBmdXR1cmUgcmVmZXJlbmNlLCBhbmQgdGhlbiB1c2VkIHRvIGJ1aWxkIHRoZSBzb3VyY2UgZGlzdHJpYnV0aW9uCi1hcmNoaXZlKHMpLgotCi1Zb3UgY2FuIGRpc2FibGUgdGhlIGRlZmF1bHQgc2V0IG9mIGluY2x1ZGVkIGZpbGVzIHdpdGggdGhlCi1cbG9uZ3Byb2dyYW1vcHR7bm8tZGVmYXVsdHN9IG9wdGlvbiwgYW5kIHlvdSBjYW4gZGlzYWJsZSB0aGUgc3RhbmRhcmQKLWV4Y2x1ZGUgc2V0IHdpdGggXGxvbmdwcm9ncmFtb3B0e25vLXBydW5lfS4KLQotRm9sbG93aW5nIHRoZSBEaXN0dXRpbHMnIG93biBtYW5pZmVzdCB0ZW1wbGF0ZSwgbGV0J3MgdHJhY2UgaG93IHRoZQotXGNvbW1hbmR7c2Rpc3R9IGNvbW1hbmQgYnVpbGRzIHRoZSBsaXN0IG9mIGZpbGVzIHRvIGluY2x1ZGUgaW4gdGhlCi1EaXN0dXRpbHMgc291cmNlIGRpc3RyaWJ1dGlvbjoKLVxiZWdpbntlbnVtZXJhdGV9Ci1caXRlbSBpbmNsdWRlIGFsbCBQeXRob24gc291cmNlIGZpbGVzIGluIHRoZSBcZmlsZXtkaXN0dXRpbHN9IGFuZAotICBcZmlsZXtkaXN0dXRpbHMvY29tbWFuZH0gc3ViZGlyZWN0b3JpZXMgKGJlY2F1c2UgcGFja2FnZXMKLSAgY29ycmVzcG9uZGluZyB0byB0aG9zZSB0d28gZGlyZWN0b3JpZXMgd2VyZSBtZW50aW9uZWQgaW4gdGhlCi0gIFxvcHRpb257cGFja2FnZXN9IG9wdGlvbiBpbiB0aGUgc2V0dXAgc2NyaXB0LS0tc2VlCi0gIHNlY3Rpb25+XHJlZntzZXR1cC1zY3JpcHR9KQotXGl0ZW0gaW5jbHVkZSBcZmlsZXtSRUFETUUudHh0fSwgXGZpbGV7c2V0dXAucHl9LCBhbmQgXGZpbGV7c2V0dXAuY2ZnfQotICAoc3RhbmRhcmQgZmlsZXMpCi1caXRlbSBpbmNsdWRlIFxmaWxle3Rlc3QvdGVzdCoucHl9IChzdGFuZGFyZCBmaWxlcykKLVxpdGVtIGluY2x1ZGUgXGZpbGV7Ki50eHR9IGluIHRoZSBkaXN0cmlidXRpb24gcm9vdCAodGhpcyB3aWxsIGZpbmQKLSAgXGZpbGV7UkVBRE1FLnR4dH0gYSBzZWNvbmQgdGltZSwgYnV0IHN1Y2ggcmVkdW5kYW5jaWVzIGFyZSB3ZWVkZWQgb3V0Ci0gIGxhdGVyKQotXGl0ZW0gaW5jbHVkZSBhbnl0aGluZyBtYXRjaGluZyBcZmlsZXsqLnR4dH0gb3IgXGZpbGV7Ki5weX0gaW4gdGhlCi0gIHN1Yi10cmVlIHVuZGVyIFxmaWxle2V4YW1wbGVzfSwKLVxpdGVtIGV4Y2x1ZGUgYWxsIGZpbGVzIGluIHRoZSBzdWItdHJlZXMgc3RhcnRpbmcgYXQgZGlyZWN0b3JpZXMKLSAgbWF0Y2hpbmcgXGZpbGV7ZXhhbXBsZXMvc2FtcGxlPy9idWlsZH0tLS10aGlzIG1heSBleGNsdWRlIGZpbGVzCi0gIGluY2x1ZGVkIGJ5IHRoZSBwcmV2aW91cyB0d28gc3RlcHMsIHNvIGl0J3MgaW1wb3J0YW50IHRoYXQgdGhlCi0gIFxjb2Rle3BydW5lfSBjb21tYW5kIGluIHRoZSBtYW5pZmVzdCB0ZW1wbGF0ZSBjb21lcyBhZnRlciB0aGUKLSAgXGNvZGV7cmVjdXJzaXZlLWluY2x1ZGV9IGNvbW1hbmQKLVxpdGVtIGV4Y2x1ZGUgdGhlIGVudGlyZSBcZmlsZXtidWlsZH0gdHJlZSwgYW5kIGFueSBcZmlsZXtSQ1N9LAotICBcZmlsZXtDVlN9IGFuZCBcZmlsZXsuc3ZufSBkaXJlY3RvcmllcwotXGVuZHtlbnVtZXJhdGV9Ci1KdXN0IGxpa2UgaW4gdGhlIHNldHVwIHNjcmlwdCwgZmlsZSBhbmQgZGlyZWN0b3J5IG5hbWVzIGluIHRoZSBtYW5pZmVzdAotdGVtcGxhdGUgc2hvdWxkIGFsd2F5cyBiZSBzbGFzaC1zZXBhcmF0ZWQ7IHRoZSBEaXN0dXRpbHMgd2lsbCB0YWtlIGNhcmUKLW9mIGNvbnZlcnRpbmcgdGhlbSB0byB0aGUgc3RhbmRhcmQgcmVwcmVzZW50YXRpb24gb24geW91ciBwbGF0Zm9ybS4KLVRoYXQgd2F5LCB0aGUgbWFuaWZlc3QgdGVtcGxhdGUgaXMgcG9ydGFibGUgYWNyb3NzIG9wZXJhdGluZyBzeXN0ZW1zLgotCi0KLVxzZWN0aW9ue01hbmlmZXN0LXJlbGF0ZWQgb3B0aW9uc30KLVxsYWJlbHttYW5pZmVzdC1vcHRpb25zfQotCi1UaGUgbm9ybWFsIGNvdXJzZSBvZiBvcGVyYXRpb25zIGZvciB0aGUgXGNvbW1hbmR7c2Rpc3R9IGNvbW1hbmQgaXMgYXMKLWZvbGxvd3M6Ci1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtIGlmIHRoZSBtYW5pZmVzdCBmaWxlLCBcZmlsZXtNQU5JRkVTVH0gZG9lc24ndCBleGlzdCwgcmVhZAotICBcZmlsZXtNQU5JRkVTVC5pbn0gYW5kIGNyZWF0ZSB0aGUgbWFuaWZlc3QKLVxpdGVtIGlmIG5laXRoZXIgXGZpbGV7TUFOSUZFU1R9IG5vciBcZmlsZXtNQU5JRkVTVC5pbn0gZXhpc3QsIGNyZWF0ZSBhCi0gIG1hbmlmZXN0IHdpdGgganVzdCB0aGUgZGVmYXVsdCBmaWxlIHNldAotXGl0ZW0gaWYgZWl0aGVyIFxmaWxle01BTklGRVNULmlufSBvciB0aGUgc2V0dXAgc2NyaXB0IChcZmlsZXtzZXR1cC5weX0pCi0gIGFyZSBtb3JlIHJlY2VudCB0aGFuIFxmaWxle01BTklGRVNUfSwgcmVjcmVhdGUgXGZpbGV7TUFOSUZFU1R9IGJ5Ci0gIHJlYWRpbmcgXGZpbGV7TUFOSUZFU1QuaW59Ci1caXRlbSB1c2UgdGhlIGxpc3Qgb2YgZmlsZXMgbm93IGluIFxmaWxle01BTklGRVNUfSAoZWl0aGVyIGp1c3QKLSAgZ2VuZXJhdGVkIG9yIHJlYWQgaW4pIHRvIGNyZWF0ZSB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbiBhcmNoaXZlKHMpCi1cZW5ke2l0ZW1pemV9Ci1UaGVyZSBhcmUgYSBjb3VwbGUgb2Ygb3B0aW9ucyB0aGF0IG1vZGlmeSB0aGlzIGJlaGF2aW91ci4gIEZpcnN0LCB1c2UKLXRoZSBcbG9uZ3Byb2dyYW1vcHR7bm8tZGVmYXVsdHN9IGFuZCBcbG9uZ3Byb2dyYW1vcHR7bm8tcHJ1bmV9IHRvCi1kaXNhYmxlIHRoZSBzdGFuZGFyZCBgYGluY2x1ZGUnJyBhbmQgYGBleGNsdWRlJycgc2V0cy4KLQotU2Vjb25kLCB5b3UgbWlnaHQgd2FudCB0byBmb3JjZSB0aGUgbWFuaWZlc3QgdG8gYmUgcmVnZW5lcmF0ZWQtLS1mb3IKLWV4YW1wbGUsIGlmIHlvdSBoYXZlIGFkZGVkIG9yIHJlbW92ZWQgZmlsZXMgb3IgZGlyZWN0b3JpZXMgdGhhdCBtYXRjaCBhbgotZXhpc3RpbmcgcGF0dGVybiBpbiB0aGUgbWFuaWZlc3QgdGVtcGxhdGUsIHlvdSBzaG91bGQgcmVnZW5lcmF0ZSB0aGUKLW1hbmlmZXN0OgotCi1cYmVnaW57dmVyYmF0aW19Ci1weXRob24gc2V0dXAucHkgc2Rpc3QgLS1mb3JjZS1tYW5pZmVzdAotXGVuZHt2ZXJiYXRpbX0KLQotT3IsIHlvdSBtaWdodCBqdXN0IHdhbnQgdG8gKHJlKWdlbmVyYXRlIHRoZSBtYW5pZmVzdCwgYnV0IG5vdCBjcmVhdGUgYQotc291cmNlIGRpc3RyaWJ1dGlvbjoKLQotXGJlZ2lue3ZlcmJhdGltfQotcHl0aG9uIHNldHVwLnB5IHNkaXN0IC0tbWFuaWZlc3Qtb25seQotXGVuZHt2ZXJiYXRpbX0KLQotXGxvbmdwcm9ncmFtb3B0e21hbmlmZXN0LW9ubHl9IGltcGxpZXMgXGxvbmdwcm9ncmFtb3B0e2ZvcmNlLW1hbmlmZXN0fS4KLVxwcm9ncmFtb3B0ey1vfSBpcyBhIHNob3J0Y3V0IGZvciBcbG9uZ3Byb2dyYW1vcHR7bWFuaWZlc3Qtb25seX0sIGFuZAotXHByb2dyYW1vcHR7LWZ9IGZvciBcbG9uZ3Byb2dyYW1vcHR7Zm9yY2UtbWFuaWZlc3R9LgotCi0KLVxjaGFwdGVye0NyZWF0aW5nIEJ1aWx0IERpc3RyaWJ1dGlvbnN9Ci1cbGFiZWx7YnVpbHQtZGlzdH0KLQotQSBgYGJ1aWx0IGRpc3RyaWJ1dGlvbicnIGlzIHdoYXQgeW91J3JlIHByb2JhYmx5IHVzZWQgdG8gdGhpbmtpbmcgb2YKLWVpdGhlciBhcyBhIGBgYmluYXJ5IHBhY2thZ2UnJyBvciBhbiBgYGluc3RhbGxlcicnIChkZXBlbmRpbmcgb24geW91cgotYmFja2dyb3VuZCkuICBJdCdzIG5vdCBuZWNlc3NhcmlseSBiaW5hcnksIHRob3VnaCwgYmVjYXVzZSBpdCBtaWdodAotY29udGFpbiBvbmx5IFB5dGhvbiBzb3VyY2UgY29kZSBhbmQvb3IgYnl0ZS1jb2RlOyBhbmQgd2UgZG9uJ3QgY2FsbCBpdCBhCi1wYWNrYWdlLCBiZWNhdXNlIHRoYXQgd29yZCBpcyBhbHJlYWR5IHNwb2tlbiBmb3IgaW4gUHl0aG9uLiAgKEFuZAotYGBpbnN0YWxsZXInJyBpcyBhIHRlcm0gc3BlY2lmaWMgdG8gdGhlIHdvcmxkIG9mIG1haW5zdHJlYW0gZGVza3RvcAotc3lzdGVtcy4pCi0KLUEgYnVpbHQgZGlzdHJpYnV0aW9uIGlzIGhvdyB5b3UgbWFrZSBsaWZlIGFzIGVhc3kgYXMgcG9zc2libGUgZm9yCi1pbnN0YWxsZXJzIG9mIHlvdXIgbW9kdWxlIGRpc3RyaWJ1dGlvbjogZm9yIHVzZXJzIG9mIFJQTS1iYXNlZCBMaW51eAotc3lzdGVtcywgaXQncyBhIGJpbmFyeSBSUE07IGZvciBXaW5kb3dzIHVzZXJzLCBpdCdzIGFuIGV4ZWN1dGFibGUKLWluc3RhbGxlcjsgZm9yIERlYmlhbi1iYXNlZCBMaW51eCB1c2VycywgaXQncyBhIERlYmlhbiBwYWNrYWdlOyBhbmQgc28KLWZvcnRoLiAgT2J2aW91c2x5LCBubyBvbmUgcGVyc29uIHdpbGwgYmUgYWJsZSB0byBjcmVhdGUgYnVpbHQKLWRpc3RyaWJ1dGlvbnMgZm9yIGV2ZXJ5IHBsYXRmb3JtIHVuZGVyIHRoZSBzdW4sIHNvIHRoZSBEaXN0dXRpbHMgYXJlCi1kZXNpZ25lZCB0byBlbmFibGUgbW9kdWxlIGRldmVsb3BlcnMgdG8gY29uY2VudHJhdGUgb24gdGhlaXIKLXNwZWNpYWx0eS0tLXdyaXRpbmcgY29kZSBhbmQgY3JlYXRpbmcgc291cmNlIGRpc3RyaWJ1dGlvbnMtLS13aGlsZSBhbgotaW50ZXJtZWRpYXJ5IHNwZWNpZXMgY2FsbGVkIFxlbXBoe3BhY2thZ2Vyc30gc3ByaW5ncyB1cCB0byB0dXJuIHNvdXJjZQotZGlzdHJpYnV0aW9ucyBpbnRvIGJ1aWx0IGRpc3RyaWJ1dGlvbnMgZm9yIGFzIG1hbnkgcGxhdGZvcm1zIGFzIHRoZXJlCi1hcmUgcGFja2FnZXJzLgotCi1PZiBjb3Vyc2UsIHRoZSBtb2R1bGUgZGV2ZWxvcGVyIGNvdWxkIGJlIGhpcyBvd24gcGFja2FnZXI7IG9yIHRoZQotcGFja2FnZXIgY291bGQgYmUgYSB2b2x1bnRlZXIgYGBvdXQgdGhlcmUnJyBzb21ld2hlcmUgd2hvIGhhcyBhY2Nlc3MgdG8KLWEgcGxhdGZvcm0gd2hpY2ggdGhlIG9yaWdpbmFsIGRldmVsb3BlciBkb2VzIG5vdDsgb3IgaXQgY291bGQgYmUKLXNvZnR3YXJlIHBlcmlvZGljYWxseSBncmFiYmluZyBuZXcgc291cmNlIGRpc3RyaWJ1dGlvbnMgYW5kIHR1cm5pbmcgdGhlbQotaW50byBidWlsdCBkaXN0cmlidXRpb25zIGZvciBhcyBtYW55IHBsYXRmb3JtcyBhcyB0aGUgc29mdHdhcmUgaGFzCi1hY2Nlc3MgdG8uICBSZWdhcmRsZXNzIG9mIHdobyB0aGV5IGFyZSwgYSBwYWNrYWdlciB1c2VzIHRoZQotc2V0dXAgc2NyaXB0IGFuZCB0aGUgXGNvbW1hbmR7YmRpc3R9IGNvbW1hbmQgZmFtaWx5IHRvIGdlbmVyYXRlIGJ1aWx0Ci1kaXN0cmlidXRpb25zLgotCi1BcyBhIHNpbXBsZSBleGFtcGxlLCBpZiBJIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQgaW4gdGhlIERpc3R1dGlscwotc291cmNlIHRyZWU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXB5dGhvbiBzZXR1cC5weSBiZGlzdAotXGVuZHt2ZXJiYXRpbX0KLQotdGhlbiB0aGUgRGlzdHV0aWxzIGJ1aWxkcyBteSBtb2R1bGUgZGlzdHJpYnV0aW9uICh0aGUgRGlzdHV0aWxzIGl0c2VsZgotaW4gdGhpcyBjYXNlKSwgZG9lcyBhIGBgZmFrZScnIGluc3RhbGxhdGlvbiAoYWxzbyBpbiB0aGUgXGZpbGV7YnVpbGR9Ci1kaXJlY3RvcnkpLCBhbmQgY3JlYXRlcyB0aGUgZGVmYXVsdCB0eXBlIG9mIGJ1aWx0IGRpc3RyaWJ1dGlvbiBmb3IgbXkKLXBsYXRmb3JtLiAgVGhlIGRlZmF1bHQgZm9ybWF0IGZvciBidWlsdCBkaXN0cmlidXRpb25zIGlzIGEgYGBkdW1iJycgdGFyCi1maWxlIG9uIFxVTklYLCBhbmQgYSBzaW1wbGUgZXhlY3V0YWJsZSBpbnN0YWxsZXIgb24gV2luZG93cy4gIChUaGF0IHRhcgotZmlsZSBpcyBjb25zaWRlcmVkIGBgZHVtYicnIGJlY2F1c2UgaXQgaGFzIHRvIGJlIHVucGFja2VkIGluIGEgc3BlY2lmaWMKLWxvY2F0aW9uIHRvIHdvcmsuKQotCi1UaHVzLCB0aGUgYWJvdmUgY29tbWFuZCBvbiBhIFxVTklYe30gc3lzdGVtIGNyZWF0ZXMKLVxmaWxle0Rpc3R1dGlscy0xLjAuXGZpbGV2YXJ7cGxhdH0udGFyLmd6fTsgdW5wYWNraW5nIHRoaXMgdGFyYmFsbAotZnJvbSB0aGUgcmlnaHQgcGxhY2UgaW5zdGFsbHMgdGhlIERpc3R1dGlscyBqdXN0IGFzIHRob3VnaCB5b3UgaGFkCi1kb3dubG9hZGVkIHRoZSBzb3VyY2UgZGlzdHJpYnV0aW9uIGFuZCBydW4gXGNvZGV7cHl0aG9uIHNldHVwLnB5Ci0gIGluc3RhbGx9LiAgKFRoZSBgYHJpZ2h0IHBsYWNlJycgaXMgZWl0aGVyIHRoZSByb290IG9mIHRoZSBmaWxlc3lzdGVtIG9yIAotUHl0aG9uJ3MgXGZpbGV2YXJ7cHJlZml4fSBkaXJlY3RvcnksIGRlcGVuZGluZyBvbiB0aGUgb3B0aW9ucyBnaXZlbiB0bwotdGhlIFxjb21tYW5ke2JkaXN0XF9kdW1ifSBjb21tYW5kOyB0aGUgZGVmYXVsdCBpcyB0byBtYWtlIGR1bWIKLWRpc3RyaWJ1dGlvbnMgcmVsYXRpdmUgdG8gXGZpbGV2YXJ7cHJlZml4fS4pICAKLQotT2J2aW91c2x5LCBmb3IgcHVyZSBQeXRob24gZGlzdHJpYnV0aW9ucywgdGhpcyBpc24ndCBhbnkgc2ltcGxlciB0aGFuCi1qdXN0IHJ1bm5pbmcgXGNvZGV7cHl0aG9uIHNldHVwLnB5IGluc3RhbGx9LS0tYnV0IGZvciBub24tcHVyZQotZGlzdHJpYnV0aW9ucywgd2hpY2ggaW5jbHVkZSBleHRlbnNpb25zIHRoYXQgd291bGQgbmVlZCB0byBiZQotY29tcGlsZWQsIGl0IGNhbiBtZWFuIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gc29tZW9uZSBiZWluZyBhYmxlIHRvIHVzZQoteW91ciBleHRlbnNpb25zIG9yIG5vdC4gIEFuZCBjcmVhdGluZyBgYHNtYXJ0JycgYnVpbHQgZGlzdHJpYnV0aW9ucywKLXN1Y2ggYXMgYW4gUlBNIHBhY2thZ2Ugb3IgYW4gZXhlY3V0YWJsZSBpbnN0YWxsZXIgZm9yIFdpbmRvd3MsIGlzIGZhcgotbW9yZSBjb252ZW5pZW50IGZvciB1c2VycyBldmVuIGlmIHlvdXIgZGlzdHJpYnV0aW9uIGRvZXNuJ3QgaW5jbHVkZQotYW55IGV4dGVuc2lvbnMuCi0KLVRoZSBcY29tbWFuZHtiZGlzdH0gY29tbWFuZCBoYXMgYSBcbG9uZ3Byb2dyYW1vcHR7Zm9ybWF0c30gb3B0aW9uLAotc2ltaWxhciB0byB0aGUgXGNvbW1hbmR7c2Rpc3R9IGNvbW1hbmQsIHdoaWNoIHlvdSBjYW4gdXNlIHRvIHNlbGVjdCB0aGUKLXR5cGVzIG9mIGJ1aWx0IGRpc3RyaWJ1dGlvbiB0byBnZW5lcmF0ZTogZm9yIGV4YW1wbGUsCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLXB5dGhvbiBzZXR1cC5weSBiZGlzdCAtLWZvcm1hdD16aXAKLVxlbmR7dmVyYmF0aW19Ci0KLXdvdWxkLCB3aGVuIHJ1biBvbiBhIFxVTklYe30gc3lzdGVtLCBjcmVhdGUKLVxmaWxle0Rpc3R1dGlscy0xLjAuXGZpbGV2YXJ7cGxhdH0uemlwfS0tLWFnYWluLCB0aGlzIGFyY2hpdmUgd291bGQgYmUKLXVucGFja2VkIGZyb20gdGhlIHJvb3QgZGlyZWN0b3J5IHRvIGluc3RhbGwgdGhlIERpc3R1dGlscy4KLQotVGhlIGF2YWlsYWJsZSBmb3JtYXRzIGZvciBidWlsdCBkaXN0cmlidXRpb25zIGFyZToKLQotXGJlZ2lue3RhYmxlaWlpfXtsfGx8Y317Y29kZX0lCi0gIHtGb3JtYXR9e0Rlc2NyaXB0aW9ufXtOb3Rlc30KLSAgXGxpbmVpaWl7Z3p0YXJ9e2d6aXBwZWQgdGFyIGZpbGUgKFxmaWxley50YXIuZ3p9KX17KDEpLCgzKX0KLSAgXGxpbmVpaWl7enRhcn17Y29tcHJlc3NlZCB0YXIgZmlsZSAoXGZpbGV7LnRhci5afSl9eygzKX0KLSAgXGxpbmVpaWl7dGFyfXt0YXIgZmlsZSAoXGZpbGV7LnRhcn0pfXsoMyl9Ci0gIFxsaW5laWlpe3ppcH17emlwIGZpbGUgKFxmaWxley56aXB9KX17KDQpfQotICBcbGluZWlpaXtycG19e1JQTX17KDUpfQotICBcbGluZWlpaXtwa2d0b29sfXtTb2xhcmlzIFxwcm9ncmFte3BrZ3Rvb2x9fXt9Ci0gIFxsaW5laWlpe3NkdXh9e0hQLVVYIFxwcm9ncmFte3N3aW5zdGFsbH19e30KLSAgXGxpbmVpaWl7cnBtfXtSUE19eyg1KX0KLSUgIFxsaW5laWlpe3NycG19e3NvdXJjZSBSUE19eyg1KSBcWFhYe3RvIGRvIX19Ci0gIFxsaW5laWlpe3dpbmluc3R9e3NlbGYtZXh0cmFjdGluZyBaSVAgZmlsZSBmb3IgV2luZG93c317KDIpLCg0KX0KLVxlbmR7dGFibGVpaWl9Ci0KLVxub2luZGVudCBOb3RlczoKLVxiZWdpbntkZXNjcmlwdGlvbn0KLVxpdGVtWygxKV0gZGVmYXVsdCBvbiBcVU5JWAotXGl0ZW1bKDIpXSBkZWZhdWx0IG9uIFdpbmRvd3MgXFhYWHt0by1kbyF9Ci1caXRlbVsoMyldIHJlcXVpcmVzIGV4dGVybmFsIHV0aWxpdGllczogXHByb2dyYW17dGFyfSBhbmQgcG9zc2libHkgb25lCi0gIG9mIFxwcm9ncmFte2d6aXB9LCBccHJvZ3JhbXtiemlwMn0sIG9yIFxwcm9ncmFte2NvbXByZXNzfQotXGl0ZW1bKDQpXSByZXF1aXJlcyBlaXRoZXIgZXh0ZXJuYWwgXHByb2dyYW17emlwfSB1dGlsaXR5IG9yCi0gIFxtb2R1bGV7emlwZmlsZX0gbW9kdWxlIChwYXJ0IG9mIHRoZSBzdGFuZGFyZCBQeXRob24gbGlicmFyeSBzaW5jZQotICBQeXRob25+MS42KQotXGl0ZW1bKDUpXSByZXF1aXJlcyBleHRlcm5hbCBccHJvZ3JhbXtycG19IHV0aWxpdHksIHZlcnNpb24gMy4wLjQgb3IKLSAgYmV0dGVyICh1c2UgXGNvZGV7cnBtIC0tdmVyc2lvbn0gdG8gZmluZCBvdXQgd2hpY2ggdmVyc2lvbiB5b3UgaGF2ZSkKLVxlbmR7ZGVzY3JpcHRpb259Ci0KLVlvdSBkb24ndCBoYXZlIHRvIHVzZSB0aGUgXGNvbW1hbmR7YmRpc3R9IGNvbW1hbmQgd2l0aCB0aGUKLVxsb25ncHJvZ3JhbW9wdHtmb3JtYXRzfSBvcHRpb247IHlvdSBjYW4gYWxzbyB1c2UgdGhlIGNvbW1hbmQgdGhhdAotZGlyZWN0bHkgaW1wbGVtZW50cyB0aGUgZm9ybWF0IHlvdSdyZSBpbnRlcmVzdGVkIGluLiAgU29tZSBvZiB0aGVzZQotXGNvbW1hbmR7YmRpc3R9IGBgc3ViLWNvbW1hbmRzJycgYWN0dWFsbHkgZ2VuZXJhdGUgc2V2ZXJhbCBzaW1pbGFyCi1mb3JtYXRzOyBmb3IgaW5zdGFuY2UsIHRoZSBcY29tbWFuZHtiZGlzdFxfZHVtYn0gY29tbWFuZCBnZW5lcmF0ZXMgYWxsCi10aGUgYGBkdW1iJycgYXJjaGl2ZSBmb3JtYXRzIChcY29kZXt0YXJ9LCBcY29kZXt6dGFyfSwgXGNvZGV7Z3p0YXJ9LCBhbmQKLVxjb2Rle3ppcH0pLCBhbmQgXGNvbW1hbmR7YmRpc3RcX3JwbX0gZ2VuZXJhdGVzIGJvdGggYmluYXJ5IGFuZCBzb3VyY2UKLVJQTXMuICBUaGUgXGNvbW1hbmR7YmRpc3R9IHN1Yi1jb21tYW5kcywgYW5kIHRoZSBmb3JtYXRzIGdlbmVyYXRlZCBieQotZWFjaCwgYXJlOgotCi1cYmVnaW57dGFibGVpaX17bHxsfXtjb21tYW5kfSUKLSAge0NvbW1hbmR9e0Zvcm1hdHN9Ci0gIFxsaW5laWl7YmRpc3RcX2R1bWJ9e3RhciwgenRhciwgZ3p0YXIsIHppcH0KLSAgXGxpbmVpaXtiZGlzdFxfcnBtfXtycG0sIHNycG19Ci0gIFxsaW5laWl7YmRpc3RcX3dpbmluc3R9e3dpbmluc3R9Ci1cZW5ke3RhYmxlaWl9Ci0KLVRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgZ2l2ZSBkZXRhaWxzIG9uIHRoZSBpbmRpdmlkdWFsIFxjb21tYW5ke2JkaXN0XF8qfQotY29tbWFuZHMuCi0KLQotXHNlY3Rpb257Q3JlYXRpbmcgZHVtYiBidWlsdCBkaXN0cmlidXRpb25zfQotXGxhYmVse2NyZWF0aW5nLWR1bWJ9Ci0KLVxYWFh7TmVlZCB0byBkb2N1bWVudCBhYnNvbHV0ZSB2cy4gcHJlZml4LXJlbGF0aXZlIHBhY2thZ2VzIGhlcmUsIGJ1dAotICBmaXJzdCBJIGhhdmUgdG8gaW1wbGVtZW50IGl0IX0KLQotCi1cc2VjdGlvbntDcmVhdGluZyBSUE0gcGFja2FnZXN9Ci1cbGFiZWx7Y3JlYXRpbmctcnBtc30KLQotVGhlIFJQTSBmb3JtYXQgaXMgdXNlZCBieSBtYW55IHBvcHVsYXIgTGludXggZGlzdHJpYnV0aW9ucywgaW5jbHVkaW5nCi1SZWQgSGF0LCBTdVNFLCBhbmQgTWFuZHJha2UuICBJZiBvbmUgb2YgdGhlc2UgKG9yIGFueSBvZiB0aGUgb3RoZXIKLVJQTS1iYXNlZCBMaW51eCBkaXN0cmlidXRpb25zKSBpcyB5b3VyIHVzdWFsIGVudmlyb25tZW50LCBjcmVhdGluZyBSUE0KLXBhY2thZ2VzIGZvciBvdGhlciB1c2VycyBvZiB0aGF0IHNhbWUgZGlzdHJpYnV0aW9uIGlzIHRyaXZpYWwuCi1EZXBlbmRpbmcgb24gdGhlIGNvbXBsZXhpdHkgb2YgeW91ciBtb2R1bGUgZGlzdHJpYnV0aW9uIGFuZCBkaWZmZXJlbmNlcwotYmV0d2VlbiBMaW51eCBkaXN0cmlidXRpb25zLCB5b3UgbWF5IGFsc28gYmUgYWJsZSB0byBjcmVhdGUgUlBNcyB0aGF0Ci13b3JrIG9uIGRpZmZlcmVudCBSUE0tYmFzZWQgZGlzdHJpYnV0aW9ucy4KLQotVGhlIHVzdWFsIHdheSB0byBjcmVhdGUgYW4gUlBNIG9mIHlvdXIgbW9kdWxlIGRpc3RyaWJ1dGlvbiBpcyB0byBydW4gdGhlIAotXGNvbW1hbmR7YmRpc3RcX3JwbX0gY29tbWFuZDoKLQotXGJlZ2lue3ZlcmJhdGltfQotcHl0aG9uIHNldHVwLnB5IGJkaXN0X3JwbQotXGVuZHt2ZXJiYXRpbX0KLQotb3IgdGhlIFxjb21tYW5ke2JkaXN0fSBjb21tYW5kIHdpdGggdGhlIFxsb25ncHJvZ3JhbW9wdHtmb3JtYXR9IG9wdGlvbjoKLQotXGJlZ2lue3ZlcmJhdGltfQotcHl0aG9uIHNldHVwLnB5IGJkaXN0IC0tZm9ybWF0cz1ycG0KLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBmb3JtZXIgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IFJQTS1zcGVjaWZpYyBvcHRpb25zOyB0aGUgbGF0dGVyIGFsbG93cyAKLXlvdSB0byBlYXNpbHkgc3BlY2lmeSBtdWx0aXBsZSBmb3JtYXRzIGluIG9uZSBydW4uICBJZiB5b3UgbmVlZCB0byBkbwotYm90aCwgeW91IGNhbiBleHBsaWNpdGx5IHNwZWNpZnkgbXVsdGlwbGUgXGNvbW1hbmR7YmRpc3RcXyp9IGNvbW1hbmRzCi1hbmQgdGhlaXIgb3B0aW9uczoKLQotXGJlZ2lue3ZlcmJhdGltfQotcHl0aG9uIHNldHVwLnB5IGJkaXN0X3JwbSAtLXBhY2thZ2VyPSJKb2huIERvZSA8amRvZUBleGFtcGxlLm9yZz4iIFwKLSAgICAgICAgICAgICAgICBiZGlzdF93aW5pbnN0IC0tdGFyZ2V0X3ZlcnNpb249IjIuMCIKLVxlbmR7dmVyYmF0aW19Ci0KLUNyZWF0aW5nIFJQTSBwYWNrYWdlcyBpcyBkcml2ZW4gYnkgYSBcZmlsZXsuc3BlY30gZmlsZSwgbXVjaCBhcyB1c2luZwotdGhlIERpc3R1dGlscyBpcyBkcml2ZW4gYnkgdGhlIHNldHVwIHNjcmlwdC4gIFRvIG1ha2UgeW91ciBsaWZlIGVhc2llciwKLXRoZSBcY29tbWFuZHtiZGlzdFxfcnBtfSBjb21tYW5kIG5vcm1hbGx5IGNyZWF0ZXMgYSBcZmlsZXsuc3BlY30gZmlsZQotYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIHlvdSBzdXBwbHkgaW4gdGhlIHNldHVwIHNjcmlwdCwgb24gdGhlIGNvbW1hbmQKLWxpbmUsIGFuZCBpbiBhbnkgRGlzdHV0aWxzIGNvbmZpZ3VyYXRpb24gZmlsZXMuICBWYXJpb3VzIG9wdGlvbnMgYW5kCi1zZWN0aW9ucyBpbiB0aGUgXGZpbGV7LnNwZWN9IGZpbGUgYXJlIGRlcml2ZWQgZnJvbSBvcHRpb25zIGluIHRoZSBzZXR1cAotc2NyaXB0IGFzIGZvbGxvd3M6Ci0KLVxiZWdpbnt0YWJsZWlpfXtsfGx9e3RleHRybX0lCi0gIHtSUE0gXGZpbGV7LnNwZWN9IGZpbGUgb3B0aW9uIG9yIHNlY3Rpb259e0Rpc3R1dGlscyBzZXR1cCBzY3JpcHQgb3B0aW9ufQotICBcbGluZWlpe05hbWV9e1xvcHRpb257bmFtZX19Ci0gIFxsaW5laWl7U3VtbWFyeSAoaW4gcHJlYW1ibGUpfXtcb3B0aW9ue2Rlc2NyaXB0aW9ufX0KLSAgXGxpbmVpaXtWZXJzaW9ufXtcb3B0aW9ue3ZlcnNpb259fQotICBcbGluZWlpe1ZlbmRvcn17XG9wdGlvbnthdXRob3J9IGFuZCBcb3B0aW9ue2F1dGhvclxfZW1haWx9LCBvciBcXCYKLSAgICAgICAgICAgICAgICAgIFxvcHRpb257bWFpbnRhaW5lcn0gYW5kIFxvcHRpb257bWFpbnRhaW5lclxfZW1haWx9fQotICBcbGluZWlpe0NvcHlyaWdodH17XG9wdGlvbntsaWNlbmNlfX0KLSAgXGxpbmVpaXtVcmx9e1xvcHRpb257dXJsfX0KLSAgXGxpbmVpaXtcJWRlc2NyaXB0aW9uIChzZWN0aW9uKX17XG9wdGlvbntsb25nXF9kZXNjcmlwdGlvbn19Ci1cZW5ke3RhYmxlaWl9Ci0KLUFkZGl0aW9uYWxseSwgdGhlcmUgYXJlIG1hbnkgb3B0aW9ucyBpbiBcZmlsZXsuc3BlY30gZmlsZXMgdGhhdCBkb24ndCBoYXZlCi1jb3JyZXNwb25kaW5nIG9wdGlvbnMgaW4gdGhlIHNldHVwIHNjcmlwdC4gIE1vc3Qgb2YgdGhlc2UgYXJlIGhhbmRsZWQKLXRocm91Z2ggb3B0aW9ucyB0byB0aGUgXGNvbW1hbmR7YmRpc3RcX3JwbX0gY29tbWFuZCBhcyBmb2xsb3dzOgotCi1cYmVnaW57dGFibGVpaWl9e2x8bHxsfXt0ZXh0cm19JQotICB7UlBNIFxmaWxley5zcGVjfSBmaWxlIG9wdGlvbiBvciBzZWN0aW9ufSUKLSAge1xjb21tYW5ke2JkaXN0XF9ycG19IG9wdGlvbn0lCi0gIHtkZWZhdWx0IHZhbHVlfQotICBcbGluZWlpaXtSZWxlYXNlfXtcb3B0aW9ue3JlbGVhc2V9fXtgYDEnJ30KLSAgXGxpbmVpaWl7R3JvdXB9e1xvcHRpb257Z3JvdXB9fXtgYERldmVsb3BtZW50L0xpYnJhcmllcycnfQotICBcbGluZWlpaXtWZW5kb3J9e1xvcHRpb257dmVuZG9yfX17KHNlZSBhYm92ZSl9Ci0gIFxsaW5laWlpe1BhY2thZ2VyfXtcb3B0aW9ue3BhY2thZ2VyfX17KG5vbmUpfQotICBcbGluZWlpaXtQcm92aWRlc317XG9wdGlvbntwcm92aWRlc319eyhub25lKX0KLSAgXGxpbmVpaWl7UmVxdWlyZXN9e1xvcHRpb257cmVxdWlyZXN9fXsobm9uZSl9Ci0gIFxsaW5laWlpe0NvbmZsaWN0c317XG9wdGlvbntjb25mbGljdHN9fXsobm9uZSl9Ci0gIFxsaW5laWlpe09ic29sZXRlc317XG9wdGlvbntvYnNvbGV0ZXN9fXsobm9uZSl9Ci0gIFxsaW5laWlpe0Rpc3RyaWJ1dGlvbn17XG9wdGlvbntkaXN0cmlidXRpb25cX25hbWV9fXsobm9uZSl9Ci0gIFxsaW5laWlpe0J1aWxkUmVxdWlyZXN9e1xvcHRpb257YnVpbGRcX3JlcXVpcmVzfX17KG5vbmUpfQotICBcbGluZWlpaXtJY29ufXtcb3B0aW9ue2ljb259fXsobm9uZSl9Ci1cZW5ke3RhYmxlaWlpfQotCi1PYnZpb3VzbHksIHN1cHBseWluZyBldmVuIGEgZmV3IG9mIHRoZXNlIG9wdGlvbnMgb24gdGhlIGNvbW1hbmQtbGluZQotd291bGQgYmUgdGVkaW91cyBhbmQgZXJyb3ItcHJvbmUsIHNvIGl0J3MgdXN1YWxseSBiZXN0IHRvIHB1dCB0aGVtIGluCi10aGUgc2V0dXAgY29uZmlndXJhdGlvbiBmaWxlLCBcZmlsZXtzZXR1cC5jZmd9LS0tc2VlCi1zZWN0aW9uflxyZWZ7c2V0dXAtY29uZmlnfS4gIElmIHlvdSBkaXN0cmlidXRlIG9yIHBhY2thZ2UgbWFueSBQeXRob24KLW1vZHVsZSBkaXN0cmlidXRpb25zLCB5b3UgbWlnaHQgd2FudCB0byBwdXQgb3B0aW9ucyB0aGF0IGFwcGx5IHRvIGFsbCBvZgotdGhlbSBpbiB5b3VyIHBlcnNvbmFsIERpc3R1dGlscyBjb25maWd1cmF0aW9uIGZpbGUKLShcZmlsZXtcdGV4dGFzY2lpdGlsZGUvLnB5ZGlzdHV0aWxzLmNmZ30pLgotCi1UaGVyZSBhcmUgdGhyZWUgc3RlcHMgdG8gYnVpbGRpbmcgYSBiaW5hcnkgUlBNIHBhY2thZ2UsIGFsbCBvZiB3aGljaCBhcmUgCi1oYW5kbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIERpc3R1dGlsczoKLQotXGJlZ2lue2VudW1lcmF0ZX0KLVxpdGVtIGNyZWF0ZSBhIFxmaWxley5zcGVjfSBmaWxlLCB3aGljaCBkZXNjcmliZXMgdGhlIHBhY2thZ2UgKGFuYWxvZ291cyAKLSAgdG8gdGhlIERpc3R1dGlscyBzZXR1cCBzY3JpcHQ7IGluIGZhY3QsIG11Y2ggb2YgdGhlIGluZm9ybWF0aW9uIGluIHRoZSAKLSAgc2V0dXAgc2NyaXB0IHdpbmRzIHVwIGluIHRoZSBcZmlsZXsuc3BlY30gZmlsZSkKLVxpdGVtIGNyZWF0ZSB0aGUgc291cmNlIFJQTQotXGl0ZW0gY3JlYXRlIHRoZSBgYGJpbmFyeScnIFJQTSAod2hpY2ggbWF5IG9yIG1heSBub3QgY29udGFpbiBiaW5hcnkKLSAgY29kZSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgeW91ciBtb2R1bGUgZGlzdHJpYnV0aW9uIGNvbnRhaW5zIFB5dGhvbgotICBleHRlbnNpb25zKQotXGVuZHtlbnVtZXJhdGV9Ci0KLU5vcm1hbGx5LCBSUE0gYnVuZGxlcyB0aGUgbGFzdCB0d28gc3RlcHMgdG9nZXRoZXI7IHdoZW4geW91IHVzZSB0aGUKLURpc3R1dGlscywgYWxsIHRocmVlIHN0ZXBzIGFyZSB0eXBpY2FsbHkgYnVuZGxlZCB0b2dldGhlci4KLQotSWYgeW91IHdpc2gsIHlvdSBjYW4gc2VwYXJhdGUgdGhlc2UgdGhyZWUgc3RlcHMuICBZb3UgY2FuIHVzZSB0aGUKLVxsb25ncHJvZ3JhbW9wdHtzcGVjLW9ubHl9IG9wdGlvbiB0byBtYWtlIFxjb21tYW5ke2JkaXN0X3JwbX0ganVzdAotY3JlYXRlIHRoZSBcZmlsZXsuc3BlY30gZmlsZSBhbmQgZXhpdDsgaW4gdGhpcyBjYXNlLCB0aGUgXGZpbGV7LnNwZWN9Ci1maWxlIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgYGBkaXN0cmlidXRpb24gZGlyZWN0b3J5JyctLS1ub3JtYWxseQotXGZpbGV7ZGlzdC99LCBidXQgY3VzdG9taXphYmxlIHdpdGggdGhlIFxsb25ncHJvZ3JhbW9wdHtkaXN0LWRpcn0KLW9wdGlvbi4gIChOb3JtYWxseSwgdGhlIFxmaWxley5zcGVjfSBmaWxlIHdpbmRzIHVwIGRlZXAgaW4gdGhlIGBgYnVpbGQKLXRyZWUsJycgaW4gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGNyZWF0ZWQgYnkgXGNvbW1hbmR7YmRpc3RfcnBtfS4pCi0KLSUgXFhYWHt0aGlzIGlzbid0IGltcGxlbWVudGVkIHlldC0tLWlzIGl0IG5lZWRlZD8hfQotJSBZb3UgY2FuIGFsc28gc3BlY2lmeSBhIGN1c3RvbSBcZmlsZXsuc3BlY30gZmlsZSB3aXRoIHRoZQotJSBcbG9uZ3Byb2dyYW1vcHR7c3BlYy1maWxlfSBvcHRpb247IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aAotJSBcbG9uZ3Byb2dyYW1vcHR7c3BlYy1vbmx5fSwgdGhpcyBnaXZlcyB5b3UgYW4gb3Bwb3J0dW5pdHkgdG8gY3VzdG9taXplCi0lIHRoZSBcZmlsZXsuc3BlY30gZmlsZSBtYW51YWxseToKLSUKLSUgXCBiZWdpbnt2ZXJiYXRpbX0KLSUgPiBweXRob24gc2V0dXAucHkgYmRpc3RfcnBtIC0tc3BlYy1vbmx5Ci0lICMgLi4uZWRpdCBkaXN0L0Zvb0Jhci0xLjAuc3BlYwotJSA+IHB5dGhvbiBzZXR1cC5weSBiZGlzdF9ycG0gLS1zcGVjLWZpbGU9ZGlzdC9Gb29CYXItMS4wLnNwZWMKLSUgXCBlbmR7dmVyYmF0aW19Ci0lCi0lIChBbHRob3VnaCBhIGJldHRlciB3YXkgdG8gZG8gdGhpcyBpcyBwcm9iYWJseSB0byBvdmVycmlkZSB0aGUgc3RhbmRhcmQKLSUgXGNvbW1hbmR7YmRpc3RcX3JwbX0gY29tbWFuZCB3aXRoIG9uZSB0aGF0IHdyaXRlcyB3aGF0ZXZlciBlbHNlIHlvdSB3YW50Ci0lIHRvIHRoZSBcZmlsZXsuc3BlY30gZmlsZS4pCi0KLQotXHNlY3Rpb257Q3JlYXRpbmcgV2luZG93cyBJbnN0YWxsZXJzfQotXGxhYmVse2NyZWF0aW5nLXdpbmluc3R9Ci0KLUV4ZWN1dGFibGUgaW5zdGFsbGVycyBhcmUgdGhlIG5hdHVyYWwgZm9ybWF0IGZvciBiaW5hcnkgZGlzdHJpYnV0aW9ucwotb24gV2luZG93cy4gIFRoZXkgZGlzcGxheSBhIG5pY2UgZ3JhcGhpY2FsIHVzZXIgaW50ZXJmYWNlLCBkaXNwbGF5Ci1zb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtb2R1bGUgZGlzdHJpYnV0aW9uIHRvIGJlIGluc3RhbGxlZCB0YWtlbgotZnJvbSB0aGUgbWV0YWRhdGEgaW4gdGhlIHNldHVwIHNjcmlwdCwgbGV0IHRoZSB1c2VyIHNlbGVjdCBhIGZldwotb3B0aW9ucywgYW5kIHN0YXJ0IG9yIGNhbmNlbCB0aGUgaW5zdGFsbGF0aW9uLgotCi1TaW5jZSB0aGUgbWV0YWRhdGEgaXMgdGFrZW4gZnJvbSB0aGUgc2V0dXAgc2NyaXB0LCBjcmVhdGluZyBXaW5kb3dzCi1pbnN0YWxsZXJzIGlzIHVzdWFsbHkgYXMgZWFzeSBhcyBydW5uaW5nOgotCi1cYmVnaW57dmVyYmF0aW19Ci1weXRob24gc2V0dXAucHkgYmRpc3Rfd2luaW5zdAotXGVuZHt2ZXJiYXRpbX0KLQotb3IgdGhlIFxjb21tYW5ke2JkaXN0fSBjb21tYW5kIHdpdGggdGhlIFxsb25ncHJvZ3JhbW9wdHtmb3JtYXRzfSBvcHRpb246Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXB5dGhvbiBzZXR1cC5weSBiZGlzdCAtLWZvcm1hdHM9d2luaW5zdAotXGVuZHt2ZXJiYXRpbX0KLQotSWYgeW91IGhhdmUgYSBwdXJlIG1vZHVsZSBkaXN0cmlidXRpb24gKG9ubHkgY29udGFpbmluZyBwdXJlIFB5dGhvbgotbW9kdWxlcyBhbmQgcGFja2FnZXMpLCB0aGUgcmVzdWx0aW5nIGluc3RhbGxlciB3aWxsIGJlIHZlcnNpb24KLWluZGVwZW5kZW50IGFuZCBoYXZlIGEgbmFtZSBsaWtlIFxmaWxle2Zvby0xLjAud2luMzIuZXhlfS4gIFRoZXNlCi1pbnN0YWxsZXJzIGNhbiBldmVuIGJlIGNyZWF0ZWQgb24gXFVOSVh7fSBvciBNYWMgT1MgcGxhdGZvcm1zLgotCi1JZiB5b3UgaGF2ZSBhIG5vbi1wdXJlIGRpc3RyaWJ1dGlvbiwgdGhlIGV4dGVuc2lvbnMgY2FuIG9ubHkgYmUKLWNyZWF0ZWQgb24gYSBXaW5kb3dzIHBsYXRmb3JtLCBhbmQgd2lsbCBiZSBQeXRob24gdmVyc2lvbiBkZXBlbmRlbnQuCi1UaGUgaW5zdGFsbGVyIGZpbGVuYW1lIHdpbGwgcmVmbGVjdCB0aGlzIGFuZCBub3cgaGFzIHRoZSBmb3JtCi1cZmlsZXtmb28tMS4wLndpbjMyLXB5Mi4wLmV4ZX0uICBZb3UgaGF2ZSB0byBjcmVhdGUgYSBzZXBhcmF0ZSBpbnN0YWxsZXIKLWZvciBldmVyeSBQeXRob24gdmVyc2lvbiB5b3Ugd2FudCB0byBzdXBwb3J0LgotCi1UaGUgaW5zdGFsbGVyIHdpbGwgdHJ5IHRvIGNvbXBpbGUgcHVyZSBtb2R1bGVzIGludG8gYnl0ZWNvZGUgYWZ0ZXIKLWluc3RhbGxhdGlvbiBvbiB0aGUgdGFyZ2V0IHN5c3RlbSBpbiBub3JtYWwgYW5kIG9wdGltaXppbmcgbW9kZS4gIElmCi15b3UgZG9uJ3Qgd2FudCB0aGlzIHRvIGhhcHBlbiBmb3Igc29tZSByZWFzb24sIHlvdSBjYW4gcnVuIHRoZQotXGNvbW1hbmR7YmRpc3Rfd2luaW5zdH0gY29tbWFuZCB3aXRoIHRoZQotXGxvbmdwcm9ncmFtb3B0e25vLXRhcmdldC1jb21waWxlfSBhbmQvb3IgdGhlCi1cbG9uZ3Byb2dyYW1vcHR7bm8tdGFyZ2V0LW9wdGltaXplfSBvcHRpb24uCi0KLUJ5IGRlZmF1bHQgdGhlIGluc3RhbGxlciB3aWxsIGRpc3BsYXkgdGhlIGNvb2wgYGBQeXRob24gUG93ZXJlZCcnIGxvZ28KLXdoZW4gaXQgaXMgcnVuLCBidXQgeW91IGNhbiBhbHNvIHN1cHBseSB5b3VyIG93biBiaXRtYXAgd2hpY2ggbXVzdCBiZQotYSBXaW5kb3dzIFxmaWxley5ibXB9IGZpbGUgd2l0aCB0aGUgXGxvbmdwcm9ncmFtb3B0e2JpdG1hcH0gb3B0aW9uLgotCi1UaGUgaW5zdGFsbGVyIHdpbGwgYWxzbyBkaXNwbGF5IGEgbGFyZ2UgdGl0bGUgb24gdGhlIGRlc2t0b3AKLWJhY2tncm91bmQgd2luZG93IHdoZW4gaXQgaXMgcnVuLCB3aGljaCBpcyBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBuYW1lCi1vZiB5b3VyIGRpc3RyaWJ1dGlvbiBhbmQgdGhlIHZlcnNpb24gbnVtYmVyLiAgVGhpcyBjYW4gYmUgY2hhbmdlZCB0bwotYW5vdGhlciB0ZXh0IGJ5IHVzaW5nIHRoZSBcbG9uZ3Byb2dyYW1vcHR7dGl0bGV9IG9wdGlvbi4KLQotVGhlIGluc3RhbGxlciBmaWxlIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgYGBkaXN0cmlidXRpb24gZGlyZWN0b3J5JycKLS0tLSBub3JtYWxseSBcZmlsZXtkaXN0L30sIGJ1dCBjdXN0b21pemFibGUgd2l0aCB0aGUKLVxsb25ncHJvZ3JhbW9wdHtkaXN0LWRpcn0gb3B0aW9uLgotCi1cc3Vic2VjdGlvbntUaGUgUG9zdGluc3RhbGxhdGlvbiBzY3JpcHR9Ci1cbGFiZWx7cG9zdGluc3RhbGxhdGlvbi1zY3JpcHR9Ci0KLVN0YXJ0aW5nIHdpdGggUHl0aG9uIDIuMywgYSBwb3N0aW5zdGFsbGF0aW9uIHNjcmlwdCBjYW4gYmUgc3BlY2lmaWVkCi13aGljaCB0aGUgXGxvbmdwcm9ncmFtb3B0e2luc3RhbGwtc2NyaXB0fSBvcHRpb24uICBUaGUgYmFzZW5hbWUgb2YgdGhlCi1zY3JpcHQgbXVzdCBiZSBzcGVjaWZpZWQsIGFuZCB0aGUgc2NyaXB0IGZpbGVuYW1lIG11c3QgYWxzbyBiZSBsaXN0ZWQKLWluIHRoZSBzY3JpcHRzIGFyZ3VtZW50IHRvIHRoZSBzZXR1cCBmdW5jdGlvbi4KLQotVGhpcyBzY3JpcHQgd2lsbCBiZSBydW4gYXQgaW5zdGFsbGF0aW9uIHRpbWUgb24gdGhlIHRhcmdldCBzeXN0ZW0KLWFmdGVyIGFsbCB0aGUgZmlsZXMgaGF2ZSBiZWVuIGNvcGllZCwgd2l0aCBcY29kZXthcmd2WzFdfSBzZXQgdG8KLVxwcm9ncmFtb3B0ey1pbnN0YWxsfSwgYW5kIGFnYWluIGF0IHVuaW5zdGFsbGF0aW9uIHRpbWUgYmVmb3JlIHRoZQotZmlsZXMgYXJlIHJlbW92ZWQgd2l0aCBcY29kZXthcmd2WzFdfSBzZXQgdG8gXHByb2dyYW1vcHR7LXJlbW92ZX0uCi0KLVRoZSBpbnN0YWxsYXRpb24gc2NyaXB0IHJ1bnMgZW1iZWRkZWQgaW4gdGhlIHdpbmRvd3MgaW5zdGFsbGVyLCBldmVyeQotb3V0cHV0IChcY29kZXtzeXMuc3Rkb3V0fSwgXGNvZGV7c3lzLnN0ZGVycn0pIGlzIHJlZGlyZWN0ZWQgaW50byBhCi1idWZmZXIgYW5kIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBHVUkgYWZ0ZXIgdGhlIHNjcmlwdCBoYXMgZmluaXNoZWQuCi0KLVNvbWUgZnVuY3Rpb25zIGVzcGVjaWFsbHkgdXNlZnVsIGluIHRoaXMgY29udGV4dCBhcmUgYXZhaWxhYmxlIGFzCi1hZGRpdGlvbmFsIGJ1aWx0LWluIGZ1bmN0aW9ucyBpbiB0aGUgaW5zdGFsbGF0aW9uIHNjcmlwdC4KLQotXGJlZ2lue2Z1bmNkZXNjfXtkaXJlY3RvcnlfY3JlYXRlZH17cGF0aH0KLVxmdW5jbGluZXtmaWxlX2NyZWF0ZWR9e3BhdGh9Ci0gIFRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgYmUgY2FsbGVkIHdoZW4gYSBkaXJlY3Rvcnkgb3IgZmlsZSBpcyBjcmVhdGVkCi0gIGJ5IHRoZSBwb3N0aW5zdGFsbCBzY3JpcHQgYXQgaW5zdGFsbGF0aW9uIHRpbWUuICBJdCB3aWxsIHJlZ2lzdGVyCi0gIFx2YXJ7cGF0aH0gd2l0aCB0aGUgdW5pbnN0YWxsZXIsIHNvIHRoYXQgaXQgd2lsbCBiZSByZW1vdmVkIHdoZW4gdGhlCi0gIGRpc3RyaWJ1dGlvbiBpcyB1bmluc3RhbGxlZC4gIFRvIGJlIHNhZmUsIGRpcmVjdG9yaWVzIGFyZSBvbmx5IHJlbW92ZWQKLSAgaWYgdGhleSBhcmUgZW1wdHkuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldF9zcGVjaWFsX2ZvbGRlcl9wYXRofXtjc2lkbF9zdHJpbmd9Ci0gIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgc3BlY2lhbCBmb2xkZXIgbG9jYXRpb25zIG9uCi0gIFdpbmRvd3MgbGlrZSB0aGUgU3RhcnQgTWVudSBvciB0aGUgRGVza3RvcC4gIEl0IHJldHVybnMgdGhlIGZ1bGwKLSAgcGF0aCB0byB0aGUgZm9sZGVyLiAgXHZhcntjc2lkbF9zdHJpbmd9IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcKLSAgc3RyaW5nczoKLQotXGJlZ2lue3ZlcmJhdGltfQotIkNTSURMX0FQUERBVEEiCi0KLSJDU0lETF9DT01NT05fU1RBUlRNRU5VIgotIkNTSURMX1NUQVJUTUVOVSIKLQotIkNTSURMX0NPTU1PTl9ERVNLVE9QRElSRUNUT1JZIgotIkNTSURMX0RFU0tUT1BESVJFQ1RPUlkiCi0KLSJDU0lETF9DT01NT05fU1RBUlRVUCIKLSJDU0lETF9TVEFSVFVQIgotCi0iQ1NJRExfQ09NTU9OX1BST0dSQU1TIgotIkNTSURMX1BST0dSQU1TIgotCi0iQ1NJRExfRk9OVFMiCi1cZW5ke3ZlcmJhdGltfQotCi0gIElmIHRoZSBmb2xkZXIgY2Fubm90IGJlIHJldHJpZXZlZCwgXGV4Y2VwdGlvbntPU0Vycm9yfSBpcyByYWlzZWQuCi0KLSAgV2hpY2ggZm9sZGVycyBhcmUgYXZhaWxhYmxlIGRlcGVuZHMgb24gdGhlIGV4YWN0IFdpbmRvd3MgdmVyc2lvbiwKLSAgYW5kIHByb2JhYmx5IGFsc28gdGhlIGNvbmZpZ3VyYXRpb24uICBGb3IgZGV0YWlscyByZWZlciB0bwotICBNaWNyb3NvZnQncyBkb2N1bWVudGF0aW9uIG9mIHRoZQotICBcY2Z1bmN0aW9ue1NIR2V0U3BlY2lhbEZvbGRlclBhdGgoKX0gZnVuY3Rpb24uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2NyZWF0ZV9zaG9ydGN1dH17dGFyZ2V0LCBkZXNjcmlwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZVxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZGlyXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29ucGF0aFxvcHRpb25hbHssIGljb25pbmRleH19fX19Ci0gIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIHNob3J0Y3V0LgotICBcdmFye3RhcmdldH0gaXMgdGhlIHBhdGggdG8gdGhlIHByb2dyYW0gdG8gYmUgc3RhcnRlZCBieSB0aGUgc2hvcnRjdXQuCi0gIFx2YXJ7ZGVzY3JpcHRpb259IGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgc2hvcnRjdXQuCi0gIFx2YXJ7ZmlsZW5hbWV9IGlzIHRoZSB0aXRsZSBvZiB0aGUgc2hvcnRjdXQgdGhhdCB0aGUgdXNlciB3aWxsIHNlZS4KLSAgXHZhcnthcmd1bWVudHN9IHNwZWNpZmllcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cywgaWYgYW55LgotICBcdmFye3dvcmtkaXJ9IGlzIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIHByb2dyYW0uCi0gIFx2YXJ7aWNvbnBhdGh9IGlzIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGljb24gZm9yIHRoZSBzaG9ydGN1dCwKLSAgYW5kIFx2YXJ7aWNvbmluZGV4fSBpcyB0aGUgaW5kZXggb2YgdGhlIGljb24gaW4gdGhlIGZpbGUKLSAgXHZhcntpY29ucGF0aH0uICBBZ2FpbiwgZm9yIGRldGFpbHMgY29uc3VsdCB0aGUgTWljcm9zb2Z0Ci0gIGRvY3VtZW50YXRpb24gZm9yIHRoZSBcY2xhc3N7SVNoZWxsTGlua30gaW50ZXJmYWNlLgotXGVuZHtmdW5jZGVzY30KLQotXGNoYXB0ZXJ7UmVnaXN0ZXJpbmcgd2l0aCB0aGUgUGFja2FnZSBJbmRleH0KLVxsYWJlbHtwYWNrYWdlLWluZGV4fQotCi1UaGUgUHl0aG9uIFBhY2thZ2UgSW5kZXggKFB5UEkpIGhvbGRzIG1ldGEtZGF0YSBkZXNjcmliaW5nIGRpc3RyaWJ1dGlvbnMKLXBhY2thZ2VkIHdpdGggZGlzdHV0aWxzLiBUaGUgZGlzdHV0aWxzIGNvbW1hbmQgXGNvbW1hbmR7cmVnaXN0ZXJ9IGlzCi11c2VkIHRvIHN1Ym1pdCB5b3VyIGRpc3RyaWJ1dGlvbidzIG1ldGEtZGF0YSB0byB0aGUgaW5kZXguIEl0IGlzIGludm9rZWQKLWFzIGZvbGxvd3M6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXB5dGhvbiBzZXR1cC5weSByZWdpc3RlcgotXGVuZHt2ZXJiYXRpbX0KLQotRGlzdHV0aWxzIHdpbGwgcmVzcG9uZCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvbXB0OgotCi1cYmVnaW57dmVyYmF0aW19Ci1ydW5uaW5nIHJlZ2lzdGVyCi1XZSBuZWVkIHRvIGtub3cgd2hvIHlvdSBhcmUsIHNvIHBsZWFzZSBjaG9vc2UgZWl0aGVyOgotIDEuIHVzZSB5b3VyIGV4aXN0aW5nIGxvZ2luLAotIDIuIHJlZ2lzdGVyIGFzIGEgbmV3IHVzZXIsCi0gMy4gaGF2ZSB0aGUgc2VydmVyIGdlbmVyYXRlIGEgbmV3IHBhc3N3b3JkIGZvciB5b3UgKGFuZCBlbWFpbCBpdCB0byB5b3UpLCBvcgotIDQuIHF1aXQKLVlvdXIgc2VsZWN0aW9uIFtkZWZhdWx0IDFdOgotXGVuZHt2ZXJiYXRpbX0KLQotXG5vaW5kZW50IE5vdGU6IGlmIHlvdXIgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGFyZSBzYXZlZCBsb2NhbGx5LCB5b3Ugd2lsbAotbm90IHNlZSB0aGlzIG1lbnUuCi0KLUlmIHlvdSBoYXZlIG5vdCByZWdpc3RlcmVkIHdpdGggUHlQSSwgdGhlbiB5b3Ugd2lsbCBuZWVkIHRvIGRvIHNvIG5vdy4gWW91Ci1zaG91bGQgY2hvb3NlIG9wdGlvbiAyLCBhbmQgZW50ZXIgeW91ciBkZXRhaWxzIGFzIHJlcXVpcmVkLiBTb29uIGFmdGVyCi1zdWJtaXR0aW5nIHlvdXIgZGV0YWlscywgeW91IHdpbGwgcmVjZWl2ZSBhbiBlbWFpbCB3aGljaCB3aWxsIGJlIHVzZWQgdG8KLWNvbmZpcm0geW91ciByZWdpc3RyYXRpb24uCi0KLU9uY2UgeW91IGFyZSByZWdpc3RlcmVkLCB5b3UgbWF5IGNob29zZSBvcHRpb24gMSBmcm9tIHRoZSBtZW51LiBZb3Ugd2lsbAotYmUgcHJvbXB0ZWQgZm9yIHlvdXIgUHlQSSB1c2VybmFtZSBhbmQgcGFzc3dvcmQsIGFuZCBcY29tbWFuZHtyZWdpc3Rlcn0KLXdpbGwgdGhlbiBzdWJtaXQgeW91ciBtZXRhLWRhdGEgdG8gdGhlIGluZGV4LgotCi1Zb3UgbWF5IHN1Ym1pdCBhbnkgbnVtYmVyIG9mIHZlcnNpb25zIG9mIHlvdXIgZGlzdHJpYnV0aW9uIHRvIHRoZSBpbmRleC4gSWYKLXlvdSBhbHRlciB0aGUgbWV0YS1kYXRhIGZvciBhIHBhcnRpY3VsYXIgdmVyc2lvbiwgeW91IG1heSBzdWJtaXQgaXQgYWdhaW4KLWFuZCB0aGUgaW5kZXggd2lsbCBiZSB1cGRhdGVkLgotCi1QeVBJIGhvbGRzIGEgcmVjb3JkIGZvciBlYWNoIChuYW1lLCB2ZXJzaW9uKSBjb21iaW5hdGlvbiBzdWJtaXR0ZWQuIFRoZQotZmlyc3QgdXNlciB0byBzdWJtaXQgaW5mb3JtYXRpb24gZm9yIGEgZ2l2ZW4gbmFtZSBpcyBkZXNpZ25hdGVkIHRoZSBPd25lcgotb2YgdGhhdCBuYW1lLiBUaGV5IG1heSBzdWJtaXQgY2hhbmdlcyB0aHJvdWdoIHRoZSBcY29tbWFuZHtyZWdpc3Rlcn0KLWNvbW1hbmQgb3IgdGhyb3VnaCB0aGUgd2ViIGludGVyZmFjZS4gVGhleSBtYXkgYWxzbyBkZXNpZ25hdGUgb3RoZXIgdXNlcnMKLWFzIE93bmVycyBvciBNYWludGFpbmVycy4gTWFpbnRhaW5lcnMgbWF5IGVkaXQgdGhlIHBhY2thZ2UgaW5mb3JtYXRpb24sIGJ1dAotbm90IGRlc2lnbmF0ZSBvdGhlciBPd25lcnMgb3IgTWFpbnRhaW5lcnMuCi0KLUJ5IGRlZmF1bHQgUHlQSSB3aWxsIGxpc3QgYWxsIHZlcnNpb25zIG9mIGEgZ2l2ZW4gcGFja2FnZS4gVG8gaGlkZSBjZXJ0YWluCi12ZXJzaW9ucywgdGhlIEhpZGRlbiBwcm9wZXJ0eSBzaG91bGQgYmUgc2V0IHRvIHllcy4gVGhpcyBtdXN0IGJlIGVkaXRlZAotdGhyb3VnaCB0aGUgd2ViIGludGVyZmFjZS4KLQotXHNlY3Rpb257VGhlIC5weXBpcmMgZmlsZX0KLVxsYWJlbHtweXBpcmN9Ci0KLVRoZSBmb3JtYXQgb2YgdGhlIFxmaWxley5weXBpcmN9IGZpbGUgaXMgZm9ybWF0ZWQgYXMgZm9sbG93czoKLQotXGJlZ2lue3ZlcmJhdGltfQotW3NlcnZlci1sb2dpbl0KLXJlcG9zaXRvcnk6IDxyZXBvc2l0b3J5LXVybD4KLXVzZXJuYW1lOiA8dXNlcm5hbWU+Ci1wYXNzd29yZDogPHBhc3N3b3JkPgotXGVuZHt2ZXJiYXRpbX0KLQotXHZhcntyZXBvc2l0b3J5fSBjYW4gYmUgb21taXR0ZWQgYW5kIGRlZmF1bHRzIHRvCi1cY29kZXtodHRwOi8vd3d3LnB5dGhvbi5vcmcvcHlwaX0uCi0KLVxjaGFwdGVye1VwbG9hZGluZyBQYWNrYWdlcyB0byB0aGUgUGFja2FnZSBJbmRleH0KLVxsYWJlbHtwYWNrYWdlLXVwbG9hZH0KLQotXHZlcnNpb25hZGRlZHsyLjV9Ci0KLVRoZSBQeXRob24gUGFja2FnZSBJbmRleCAoUHlQSSkgbm90IG9ubHkgc3RvcmVzIHRoZSBwYWNrYWdlIGluZm8sIGJ1dCBhbHNvIAotdGhlIHBhY2thZ2UgZGF0YSBpZiB0aGUgYXV0aG9yIG9mIHRoZSBwYWNrYWdlIHdpc2hlcyB0by4gVGhlIGRpc3R1dGlscwotY29tbWFuZCBcY29tbWFuZHt1cGxvYWR9IHB1c2hlcyB0aGUgZGlzdHJpYnV0aW9uIGZpbGVzIHRvIFB5UEkuCi0KLVRoZSBjb21tYW5kIGlzIGludm9rZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgYnVpbGRpbmcgb25lIG9yIG1vcmUgZGlzdHJpYnV0aW9uCi1maWxlcy4gIEZvciBleGFtcGxlLCB0aGUgY29tbWFuZAotCi1cYmVnaW57dmVyYmF0aW19Ci1weXRob24gc2V0dXAucHkgc2Rpc3QgYmRpc3Rfd2luaW5zdCB1cGxvYWQKLVxlbmR7dmVyYmF0aW19Ci0KLXdpbGwgY2F1c2UgdGhlIHNvdXJjZSBkaXN0cmlidXRpb24gYW5kIHRoZSBXaW5kb3dzIGluc3RhbGxlciB0byBiZQotdXBsb2FkZWQgdG8gUHlQSS4gIE5vdGUgdGhhdCB0aGVzZSB3aWxsIGJlIHVwbG9hZGVkIGV2ZW4gaWYgdGhleSBhcmUKLWJ1aWx0IHVzaW5nIGFuIGVhcmxpZXIgaW52b2NhdGlvbiBvZiBcZmlsZXtzZXR1cC5weX0sIGJ1dCB0aGF0IG9ubHkKLWRpc3RyaWJ1dGlvbnMgbmFtZWQgb24gdGhlIGNvbW1hbmQgbGluZSBmb3IgdGhlIGludm9jYXRpb24gaW5jbHVkaW5nCi10aGUgXGNvbW1hbmR7dXBsb2FkfSBjb21tYW5kIGFyZSB1cGxvYWRlZC4KLQotVGhlIFxjb21tYW5ke3VwbG9hZH0gY29tbWFuZCB1c2VzIHRoZSB1c2VybmFtZSwgcGFzc3dvcmQsIGFuZCByZXBvc2l0b3J5Ci1VUkwgZnJvbSB0aGUgXGZpbGV7XCRIT01FLy5weXBpcmN9IGZpbGUgKHNlZSBzZWN0aW9uflxyZWZ7cHlwaXJjfSBmb3IKLW1vcmUgb24gdGhpcyBmaWxlKS4KLQotWW91IGNhbiB1c2UgdGhlIFxsb25ncHJvZ3JhbW9wdHtzaWdufSBvcHRpb24gdG8gdGVsbCBcY29tbWFuZHt1cGxvYWR9IHRvCi1zaWduIGVhY2ggdXBsb2FkZWQgZmlsZSB1c2luZyBHUEcgKEdOVSBQcml2YWN5IEd1YXJkKS4gIFRoZSAKLVxwcm9ncmFte2dwZ30gcHJvZ3JhbSBtdXN0IGJlIGF2YWlsYWJsZSBmb3IgZXhlY3V0aW9uIG9uIHRoZSBzeXN0ZW0KLVxlbnZ2YXJ7UEFUSH0uICBZb3UgY2FuIGFsc28gc3BlY2lmeSB3aGljaCBrZXkgdG8gdXNlIGZvciBzaWduaW5nCi11c2luZyB0aGUgXGxvbmdwcm9ncmFtb3B0e2lkZW50aXR5PVx2YXJ7bmFtZX19IG9wdGlvbi4KLQotT3RoZXIgXGNvbW1hbmR7dXBsb2FkfSBvcHRpb25zIGluY2x1ZGUgCi1cbG9uZ3Byb2dyYW1vcHR7cmVwb3NpdG9yeT1cdmFye3VybH19ICh3aGljaCBsZXRzIHlvdSBvdmVycmlkZSB0aGUKLXJlcG9zaXRvcnkgc2V0dGluZyBmcm9tIFxmaWxle1wkSE9NRS8ucHlwaXJjfSksIGFuZAotXGxvbmdwcm9ncmFtb3B0e3Nob3ctcmVzcG9uc2V9ICh3aGljaCBkaXNwbGF5cyB0aGUgZnVsbCByZXNwb25zZSB0ZXh0Ci1mcm9tIHRoZSBQeVBJIHNlcnZlciBmb3IgaGVscCBpbiBkZWJ1Z2dpbmcgdXBsb2FkIHByb2JsZW1zKS4KLQotXGNoYXB0ZXJ7RXhhbXBsZXN9Ci1cbGFiZWx7ZXhhbXBsZXN9Ci0KLVRoaXMgY2hhcHRlciBwcm92aWRlcyBhIG51bWJlciBvZiBiYXNpYyBleGFtcGxlcyB0byBoZWxwIGdldCBzdGFydGVkCi13aXRoIGRpc3R1dGlscy4gIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdXNpbmcgZGlzdHV0aWxzIGNhbiBiZQotZm91bmQgaW4gdGhlIERpc3R1dGlscyBDb29rYm9vay4KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWVsaW5re2h0dHA6Ly93d3cucHl0aG9uLm9yZy9jZ2ktYmluL21vaW5tb2luL0Rpc3R1dGlsc0Nvb2tib29rfQotICAgICAgICAgIHtEaXN0dXRpbHMgQ29va2Jvb2t9Ci0gICAgICAgICAge0NvbGxlY3Rpb24gb2YgcmVjaXBlcyBzaG93aW5nIGhvdyB0byBhY2hpZXZlIG1vcmUgY29udHJvbAotICAgICAgICAgICBvdmVyIGRpc3R1dGlscy59Ci1cZW5ke3NlZWFsc299Ci0KLQotXHNlY3Rpb257UHVyZSBQeXRob24gZGlzdHJpYnV0aW9uIChieSBtb2R1bGUpfQotXGxhYmVse3B1cmUtbW9kfQotCi1JZiB5b3UncmUganVzdCBkaXN0cmlidXRpbmcgYSBjb3VwbGUgb2YgbW9kdWxlcywgZXNwZWNpYWxseSBpZiB0aGV5Ci1kb24ndCBsaXZlIGluIGEgcGFydGljdWxhciBwYWNrYWdlLCB5b3UgY2FuIHNwZWNpZnkgdGhlbSBpbmRpdmlkdWFsbHkKLXVzaW5nIHRoZSBcb3B0aW9ue3B5XF9tb2R1bGVzfSBvcHRpb24gaW4gdGhlIHNldHVwIHNjcmlwdC4KLQotSW4gdGhlIHNpbXBsZXN0IGNhc2UsIHlvdSdsbCBoYXZlIHR3byBmaWxlcyB0byB3b3JyeSBhYm91dDogYSBzZXR1cAotc2NyaXB0IGFuZCB0aGUgc2luZ2xlIG1vZHVsZSB5b3UncmUgZGlzdHJpYnV0aW5nLCBcZmlsZXtmb28ucHl9IGluIHRoaXMKLWV4YW1wbGU6Ci1cYmVnaW57dmVyYmF0aW19Ci08cm9vdD4vCi0gICAgICAgIHNldHVwLnB5Ci0gICAgICAgIGZvby5weQotXGVuZHt2ZXJiYXRpbX0KLShJbiBhbGwgZGlhZ3JhbXMgaW4gdGhpcyBzZWN0aW9uLCBcdmFye1x0ZXh0bGVzcyByb290XHRleHRncmVhdGVyfQotd2lsbCByZWZlciB0byB0aGUgZGlzdHJpYnV0aW9uIHJvb3QgZGlyZWN0b3J5LikgIEEgbWluaW1hbCBzZXR1cCBzY3JpcHQKLXRvIGRlc2NyaWJlIHRoaXMgc2l0dWF0aW9uIHdvdWxkIGJlOgotXGJlZ2lue3ZlcmJhdGltfQotZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAKLXNldHVwKG5hbWU9J2ZvbycsCi0gICAgICB2ZXJzaW9uPScxLjAnLAotICAgICAgcHlfbW9kdWxlcz1bJ2ZvbyddLAotICAgICAgKQotXGVuZHt2ZXJiYXRpbX0KLU5vdGUgdGhhdCB0aGUgbmFtZSBvZiB0aGUgZGlzdHJpYnV0aW9uIGlzIHNwZWNpZmllZCBpbmRlcGVuZGVudGx5IHdpdGgKLXRoZSBcb3B0aW9ue25hbWV9IG9wdGlvbiwgYW5kIHRoZXJlJ3Mgbm8gcnVsZSB0aGF0IHNheXMgaXQgaGFzIHRvIGJlIHRoZQotc2FtZSBhcyB0aGUgbmFtZSBvZiB0aGUgc29sZSBtb2R1bGUgaW4gdGhlIGRpc3RyaWJ1dGlvbiAoYWx0aG91Z2ggdGhhdCdzCi1wcm9iYWJseSBhIGdvb2QgY29udmVudGlvbiB0byBmb2xsb3cpLiAgSG93ZXZlciwgdGhlIGRpc3RyaWJ1dGlvbiBuYW1lCi1pcyB1c2VkIHRvIGdlbmVyYXRlIGZpbGVuYW1lcywgc28geW91IHNob3VsZCBzdGljayB0byBsZXR0ZXJzLCBkaWdpdHMsCi11bmRlcnNjb3JlcywgYW5kIGh5cGhlbnMuCi0KLVNpbmNlIFxvcHRpb257cHlcX21vZHVsZXN9IGlzIGEgbGlzdCwgeW91IGNhbiBvZiBjb3Vyc2Ugc3BlY2lmeSBtdWx0aXBsZSAKLW1vZHVsZXMsIGVnLiBpZiB5b3UncmUgZGlzdHJpYnV0aW5nIG1vZHVsZXMgXG1vZHVsZXtmb299IGFuZAotXG1vZHVsZXtiYXJ9LCB5b3VyIHNldHVwIG1pZ2h0IGxvb2sgbGlrZSB0aGlzOgotXGJlZ2lue3ZlcmJhdGltfQotPHJvb3Q+LwotICAgICAgICBzZXR1cC5weQotICAgICAgICBmb28ucHkKLSAgICAgICAgYmFyLnB5Ci1cZW5ke3ZlcmJhdGltfQotYW5kIHRoZSBzZXR1cCBzY3JpcHQgbWlnaHQgYmUKLVxiZWdpbnt2ZXJiYXRpbX0KLWZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IHNldHVwCi1zZXR1cChuYW1lPSdmb29iYXInLAotICAgICAgdmVyc2lvbj0nMS4wJywKLSAgICAgIHB5X21vZHVsZXM9Wydmb28nLCAnYmFyJ10sCi0gICAgICApCi1cZW5ke3ZlcmJhdGltfQotCi1Zb3UgY2FuIHB1dCBtb2R1bGUgc291cmNlIGZpbGVzIGludG8gYW5vdGhlciBkaXJlY3RvcnksIGJ1dCBpZiB5b3UgaGF2ZQotZW5vdWdoIG1vZHVsZXMgdG8gZG8gdGhhdCwgaXQncyBwcm9iYWJseSBlYXNpZXIgdG8gc3BlY2lmeSBtb2R1bGVzIGJ5Ci1wYWNrYWdlIHJhdGhlciB0aGFuIGxpc3RpbmcgdGhlbSBpbmRpdmlkdWFsbHkuCi0KLQotXHNlY3Rpb257UHVyZSBQeXRob24gZGlzdHJpYnV0aW9uIChieSBwYWNrYWdlKX0KLVxsYWJlbHtwdXJlLXBrZ30KLQotSWYgeW91IGhhdmUgbW9yZSB0aGFuIGEgY291cGxlIG9mIG1vZHVsZXMgdG8gZGlzdHJpYnV0ZSwgZXNwZWNpYWxseSBpZgotdGhleSBhcmUgaW4gbXVsdGlwbGUgcGFja2FnZXMsIGl0J3MgcHJvYmFibHkgZWFzaWVyIHRvIHNwZWNpZnkgd2hvbGUKLXBhY2thZ2VzIHJhdGhlciB0aGFuIGluZGl2aWR1YWwgbW9kdWxlcy4gIFRoaXMgd29ya3MgZXZlbiBpZiB5b3VyCi1tb2R1bGVzIGFyZSBub3QgaW4gYSBwYWNrYWdlOyB5b3UgY2FuIGp1c3QgdGVsbCB0aGUgRGlzdHV0aWxzIHRvIHByb2Nlc3MKLW1vZHVsZXMgZnJvbSB0aGUgcm9vdCBwYWNrYWdlLCBhbmQgdGhhdCB3b3JrcyB0aGUgc2FtZSBhcyBhbnkgb3RoZXIKLXBhY2thZ2UgKGV4Y2VwdCB0aGF0IHlvdSBkb24ndCBoYXZlIHRvIGhhdmUgYW4gXGZpbGV7XF9cX2luaXRcX1xfLnB5fQotZmlsZSkuCi0KLVRoZSBzZXR1cCBzY3JpcHQgZnJvbSB0aGUgbGFzdCBleGFtcGxlIGNvdWxkIGFsc28gYmUgd3JpdHRlbiBhcwotXGJlZ2lue3ZlcmJhdGltfQotZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAKLXNldHVwKG5hbWU9J2Zvb2JhcicsCi0gICAgICB2ZXJzaW9uPScxLjAnLAotICAgICAgcGFja2FnZXM9WycnXSwKLSAgICAgICkKLVxlbmR7dmVyYmF0aW19Ci0oVGhlIGVtcHR5IHN0cmluZyBzdGFuZHMgZm9yIHRoZSByb290IHBhY2thZ2UuKQotCi1JZiB0aG9zZSB0d28gZmlsZXMgYXJlIG1vdmVkIGludG8gYSBzdWJkaXJlY3RvcnksIGJ1dCByZW1haW4gaW4gdGhlIHJvb3QKLXBhY2thZ2UsIGUuZy46Ci1cYmVnaW57dmVyYmF0aW19Ci08cm9vdD4vCi0gICAgICAgIHNldHVwLnB5Ci0gICAgICAgIHNyYy8gICAgICBmb28ucHkKLSAgICAgICAgICAgICAgICAgIGJhci5weQotXGVuZHt2ZXJiYXRpbX0KLXRoZW4geW91IHdvdWxkIHN0aWxsIHNwZWNpZnkgdGhlIHJvb3QgcGFja2FnZSwgYnV0IHlvdSBoYXZlIHRvIHRlbGwgdGhlCi1EaXN0dXRpbHMgd2hlcmUgc291cmNlIGZpbGVzIGluIHRoZSByb290IHBhY2thZ2UgbGl2ZToKLVxiZWdpbnt2ZXJiYXRpbX0KLWZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IHNldHVwCi1zZXR1cChuYW1lPSdmb29iYXInLAotICAgICAgdmVyc2lvbj0nMS4wJywKLSAgICAgIHBhY2thZ2VfZGlyPXsnJzogJ3NyYyd9LAotICAgICAgcGFja2FnZXM9WycnXSwKLSAgICAgICkKLVxlbmR7dmVyYmF0aW19Ci0KLU1vcmUgdHlwaWNhbGx5LCB0aG91Z2gsIHlvdSB3aWxsIHdhbnQgdG8gZGlzdHJpYnV0ZSBtdWx0aXBsZSBtb2R1bGVzIGluCi10aGUgc2FtZSBwYWNrYWdlIChvciBpbiBzdWItcGFja2FnZXMpLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBcbW9kdWxle2Zvb30gCi1hbmQgXG1vZHVsZXtiYXJ9IG1vZHVsZXMgYmVsb25nIGluIHBhY2thZ2UgXG1vZHVsZXtmb29iYXJ9LCBvbmUgd2F5IHRvCi1sYXlvdXQgeW91ciBzb3VyY2UgdHJlZSBpcwotXGJlZ2lue3ZlcmJhdGltfQotPHJvb3Q+LwotICAgICAgICBzZXR1cC5weQotICAgICAgICBmb29iYXIvCi0gICAgICAgICAgICAgICAgIF9faW5pdF9fLnB5Ci0gICAgICAgICAgICAgICAgIGZvby5weQotICAgICAgICAgICAgICAgICBiYXIucHkKLVxlbmR7dmVyYmF0aW19Ci1UaGlzIGlzIGluIGZhY3QgdGhlIGRlZmF1bHQgbGF5b3V0IGV4cGVjdGVkIGJ5IHRoZSBEaXN0dXRpbHMsIGFuZCB0aGUKLW9uZSB0aGF0IHJlcXVpcmVzIHRoZSBsZWFzdCB3b3JrIHRvIGRlc2NyaWJlIGluIHlvdXIgc2V0dXAgc2NyaXB0OgotXGJlZ2lue3ZlcmJhdGltfQotZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAKLXNldHVwKG5hbWU9J2Zvb2JhcicsCi0gICAgICB2ZXJzaW9uPScxLjAnLAotICAgICAgcGFja2FnZXM9Wydmb29iYXInXSwKLSAgICAgICkKLVxlbmR7dmVyYmF0aW19Ci0KLUlmIHlvdSB3YW50IHRvIHB1dCBtb2R1bGVzIGluIGRpcmVjdG9yaWVzIG5vdCBuYW1lZCBmb3IgdGhlaXIgcGFja2FnZSwKLXRoZW4geW91IG5lZWQgdG8gdXNlIHRoZSBcb3B0aW9ue3BhY2thZ2VcX2Rpcn0gb3B0aW9uIGFnYWluLiAgRm9yCi1leGFtcGxlLCBpZiB0aGUgXGZpbGV7c3JjfSBkaXJlY3RvcnkgaG9sZHMgbW9kdWxlcyBpbiB0aGUKLVxtb2R1bGV7Zm9vYmFyfSBwYWNrYWdlOgotXGJlZ2lue3ZlcmJhdGltfQotPHJvb3Q+LwotICAgICAgICBzZXR1cC5weQotICAgICAgICBzcmMvCi0gICAgICAgICAgICAgICAgIF9faW5pdF9fLnB5Ci0gICAgICAgICAgICAgICAgIGZvby5weQotICAgICAgICAgICAgICAgICBiYXIucHkKLVxlbmR7dmVyYmF0aW19Ci1hbiBhcHByb3ByaWF0ZSBzZXR1cCBzY3JpcHQgd291bGQgYmUKLVxiZWdpbnt2ZXJiYXRpbX0KLWZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IHNldHVwCi1zZXR1cChuYW1lPSdmb29iYXInLAotICAgICAgdmVyc2lvbj0nMS4wJywKLSAgICAgIHBhY2thZ2VfZGlyPXsnZm9vYmFyJzogJ3NyYyd9LAotICAgICAgcGFja2FnZXM9Wydmb29iYXInXSwKLSAgICAgICkKLVxlbmR7dmVyYmF0aW19Ci0KLU9yLCB5b3UgbWlnaHQgcHV0IG1vZHVsZXMgZnJvbSB5b3VyIG1haW4gcGFja2FnZSByaWdodCBpbiB0aGUKLWRpc3RyaWJ1dGlvbiByb290OgotXGJlZ2lue3ZlcmJhdGltfQotPHJvb3Q+LwotICAgICAgICBzZXR1cC5weQotICAgICAgICBfX2luaXRfXy5weQotICAgICAgICBmb28ucHkKLSAgICAgICAgYmFyLnB5Ci1cZW5ke3ZlcmJhdGltfQotaW4gd2hpY2ggY2FzZSB5b3VyIHNldHVwIHNjcmlwdCB3b3VsZCBiZQotXGJlZ2lue3ZlcmJhdGltfQotZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAKLXNldHVwKG5hbWU9J2Zvb2JhcicsCi0gICAgICB2ZXJzaW9uPScxLjAnLAotICAgICAgcGFja2FnZV9kaXI9eydmb29iYXInOiAnJ30sCi0gICAgICBwYWNrYWdlcz1bJ2Zvb2JhciddLAotICAgICAgKQotXGVuZHt2ZXJiYXRpbX0KLShUaGUgZW1wdHkgc3RyaW5nIGFsc28gc3RhbmRzIGZvciB0aGUgY3VycmVudCBkaXJlY3RvcnkuKQotCi1JZiB5b3UgaGF2ZSBzdWItcGFja2FnZXMsIHRoZXkgbXVzdCBiZSBleHBsaWNpdGx5IGxpc3RlZCBpbgotXG9wdGlvbntwYWNrYWdlc30sIGJ1dCBhbnkgZW50cmllcyBpbiBcb3B0aW9ue3BhY2thZ2VcX2Rpcn0KLWF1dG9tYXRpY2FsbHkgZXh0ZW5kIHRvIHN1Yi1wYWNrYWdlcy4gIChJbiBvdGhlciB3b3JkcywgdGhlIERpc3R1dGlscwotZG9lcyBcZW1waHtub3R9IHNjYW4geW91ciBzb3VyY2UgdHJlZSwgdHJ5aW5nIHRvIGZpZ3VyZSBvdXQgd2hpY2gKLWRpcmVjdG9yaWVzIGNvcnJlc3BvbmQgdG8gUHl0aG9uIHBhY2thZ2VzIGJ5IGxvb2tpbmcgZm9yCi1cZmlsZXtcX1xfaW5pdFxfXF8ucHl9IGZpbGVzLikgIFRodXMsIGlmIHRoZSBkZWZhdWx0IGxheW91dCBncm93cyBhCi1zdWItcGFja2FnZToKLVxiZWdpbnt2ZXJiYXRpbX0KLTxyb290Pi8KLSAgICAgICAgc2V0dXAucHkKLSAgICAgICAgZm9vYmFyLwotICAgICAgICAgICAgICAgICBfX2luaXRfXy5weQotICAgICAgICAgICAgICAgICBmb28ucHkKLSAgICAgICAgICAgICAgICAgYmFyLnB5Ci0gICAgICAgICAgICAgICAgIHN1YmZvby8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faW5pdF9fLnB5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBibGFoLnB5Ci1cZW5ke3ZlcmJhdGltfQotdGhlbiB0aGUgY29ycmVzcG9uZGluZyBzZXR1cCBzY3JpcHQgd291bGQgYmUKLVxiZWdpbnt2ZXJiYXRpbX0KLWZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IHNldHVwCi1zZXR1cChuYW1lPSdmb29iYXInLAotICAgICAgdmVyc2lvbj0nMS4wJywKLSAgICAgIHBhY2thZ2VzPVsnZm9vYmFyJywgJ2Zvb2Jhci5zdWJmb28nXSwKLSAgICAgICkKLVxlbmR7dmVyYmF0aW19Ci0oQWdhaW4sIHRoZSBlbXB0eSBzdHJpbmcgaW4gXG9wdGlvbntwYWNrYWdlXF9kaXJ9IHN0YW5kcyBmb3IgdGhlIGN1cnJlbnQKLWRpcmVjdG9yeS4pCi0KLQotXHNlY3Rpb257U2luZ2xlIGV4dGVuc2lvbiBtb2R1bGV9Ci1cbGFiZWx7c2luZ2xlLWV4dH0KLQotRXh0ZW5zaW9uIG1vZHVsZXMgYXJlIHNwZWNpZmllZCB1c2luZyB0aGUgXG9wdGlvbntleHRcX21vZHVsZXN9IG9wdGlvbi4KLVxvcHRpb257cGFja2FnZVxfZGlyfSBoYXMgbm8gZWZmZWN0IG9uIHdoZXJlIGV4dGVuc2lvbiBzb3VyY2UgZmlsZXMgYXJlCi1mb3VuZDsgaXQgb25seSBhZmZlY3RzIHRoZSBzb3VyY2UgZm9yIHB1cmUgUHl0aG9uIG1vZHVsZXMuICBUaGUgc2ltcGxlc3QgCi1jYXNlLCBhIHNpbmdsZSBleHRlbnNpb24gbW9kdWxlIGluIGEgc2luZ2xlIEMgc291cmNlIGZpbGUsIGlzOgotXGJlZ2lue3ZlcmJhdGltfQotPHJvb3Q+LwotICAgICAgICBzZXR1cC5weQotICAgICAgICBmb28uYwotXGVuZHt2ZXJiYXRpbX0KLUlmIHRoZSBcbW9kdWxle2Zvb30gZXh0ZW5zaW9uIGJlbG9uZ3MgaW4gdGhlIHJvb3QgcGFja2FnZSwgdGhlIHNldHVwCi1zY3JpcHQgZm9yIHRoaXMgY291bGQgYmUKLVxiZWdpbnt2ZXJiYXRpbX0KLWZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IHNldHVwCi1mcm9tIGRpc3R1dGlscy5leHRlbnNpb24gaW1wb3J0IEV4dGVuc2lvbgotc2V0dXAobmFtZT0nZm9vYmFyJywKLSAgICAgIHZlcnNpb249JzEuMCcsCi0gICAgICBleHRfbW9kdWxlcz1bRXh0ZW5zaW9uKCdmb28nLCBbJ2Zvby5jJ10pXSwKLSAgICAgICkKLVxlbmR7dmVyYmF0aW19Ci0KLUlmIHRoZSBleHRlbnNpb24gYWN0dWFsbHkgYmVsb25ncyBpbiBhIHBhY2thZ2UsIHNheSBcbW9kdWxle2Zvb3BrZ30sCi10aGVuIAotCi1XaXRoIGV4YWN0bHkgdGhlIHNhbWUgc291cmNlIHRyZWUgbGF5b3V0LCB0aGlzIGV4dGVuc2lvbiBjYW4gYmUgcHV0IGluCi10aGUgXG1vZHVsZXtmb29wa2d9IHBhY2thZ2Ugc2ltcGx5IGJ5IGNoYW5naW5nIHRoZSBuYW1lIG9mIHRoZQotZXh0ZW5zaW9uOgotXGJlZ2lue3ZlcmJhdGltfQotZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAKLWZyb20gZGlzdHV0aWxzLmV4dGVuc2lvbiBpbXBvcnQgRXh0ZW5zaW9uCi1zZXR1cChuYW1lPSdmb29iYXInLAotICAgICAgdmVyc2lvbj0nMS4wJywKLSAgICAgIGV4dF9tb2R1bGVzPVtFeHRlbnNpb24oJ2Zvb3BrZy5mb28nLCBbJ2Zvby5jJ10pXSwKLSAgICAgICkKLVxlbmR7dmVyYmF0aW19Ci0KLQotJVxzZWN0aW9ue011bHRpcGxlIGV4dGVuc2lvbiBtb2R1bGVzfQotJVxsYWJlbHttdWx0aXBsZS1leHR9Ci0KLQotJVxzZWN0aW9ue1B1dHRpbmcgaXQgYWxsIHRvZ2V0aGVyfQotCi0KLVxjaGFwdGVye0V4dGVuZGluZyBEaXN0dXRpbHMgXGxhYmVse2V4dGVuZGluZ319Ci0KLURpc3R1dGlscyBjYW4gYmUgZXh0ZW5kZWQgaW4gdmFyaW91cyB3YXlzLiAgTW9zdCBleHRlbnNpb25zIHRha2UgdGhlCi1mb3JtIG9mIG5ldyBjb21tYW5kcyBvciByZXBsYWNlbWVudHMgZm9yIGV4aXN0aW5nIGNvbW1hbmRzLiAgTmV3Ci1jb21tYW5kcyBtYXkgYmUgd3JpdHRlbiB0byBzdXBwb3J0IG5ldyB0eXBlcyBvZiBwbGF0Zm9ybS1zcGVjaWZpYwotcGFja2FnaW5nLCBmb3IgZXhhbXBsZSwgd2hpbGUgcmVwbGFjZW1lbnRzIGZvciBleGlzdGluZyBjb21tYW5kcyBtYXkKLWJlIG1hZGUgdG8gbW9kaWZ5IGRldGFpbHMgb2YgaG93IHRoZSBjb21tYW5kIG9wZXJhdGVzIG9uIGEgcGFja2FnZS4KLQotTW9zdCBleHRlbnNpb25zIG9mIHRoZSBkaXN0dXRpbHMgYXJlIG1hZGUgd2l0aGluIFxmaWxle3NldHVwLnB5fQotc2NyaXB0cyB0aGF0IHdhbnQgdG8gbW9kaWZ5IGV4aXN0aW5nIGNvbW1hbmRzOyBtYW55IHNpbXBseSBhZGQgYSBmZXcKLWZpbGUgZXh0ZW5zaW9ucyB0aGF0IHNob3VsZCBiZSBjb3BpZWQgaW50byBwYWNrYWdlcyBpbiBhZGRpdGlvbiB0bwotXGZpbGV7LnB5fSBmaWxlcyBhcyBhIGNvbnZlbmllbmNlLgotCi1Nb3N0IGRpc3R1dGlscyBjb21tYW5kIGltcGxlbWVudGF0aW9ucyBhcmUgc3ViY2xhc3NlcyBvZiB0aGUKLVxjbGFzc3tDb21tYW5kfSBjbGFzcyBmcm9tIFxyZWZtb2R1bGV7ZGlzdHV0aWxzLmNtZH0uICBOZXcgY29tbWFuZHMKLW1heSBkaXJlY3RseSBpbmhlcml0IGZyb20gXGNsYXNze0NvbW1hbmR9LCB3aGlsZSByZXBsYWNlbWVudHMgb2Z0ZW4KLWRlcml2ZSBmcm9tIFxjbGFzc3tDb21tYW5kfSBpbmRpcmVjdGx5LCBkaXJlY3RseSBzdWJjbGFzc2luZyB0aGUKLWNvbW1hbmQgdGhleSBhcmUgcmVwbGFjaW5nLiAgQ29tbWFuZHMgYXJlIHJlcXVpcmVkIHRvIGRlcml2ZSBmcm9tCi1cY2xhc3N7Q29tbWFuZH0uCi0KLQotJVxzZWN0aW9ue0V4dGVuZGluZyBleGlzdGluZyBjb21tYW5kc30KLSVcbGFiZWx7ZXh0ZW5kLWV4aXN0aW5nfQotCi0KLSVcc2VjdGlvbntXcml0aW5nIG5ldyBjb21tYW5kc30KLSVcbGFiZWx7bmV3LWNvbW1hbmRzfQotCi0lXFhYWHtXb3VsZCBhbiB1bmluc3RhbGwgY29tbWFuZCBiZSBhIGdvb2QgZXhhbXBsZSBoZXJlP30KLQotXHNlY3Rpb257SW50ZWdyYXRpbmcgbmV3IGNvbW1hbmRzfQotCi1UaGVyZSBhcmUgZGlmZmVyZW50IHdheXMgdG8gaW50ZWdyYXRlIG5ldyBjb21tYW5kIGltcGxlbWVudGF0aW9ucyBpbnRvCi1kaXN0dXRpbHMuICBUaGUgbW9zdCBkaWZmaWN1bHQgaXMgdG8gbG9iYnkgZm9yIHRoZSBpbmNsdXNpb24gb2YgdGhlCi1uZXcgZmVhdHVyZXMgaW4gZGlzdHV0aWxzIGl0c2VsZiwgYW5kIHdhaXQgZm9yIChhbmQgcmVxdWlyZSkgYSB2ZXJzaW9uCi1vZiBQeXRob24gdGhhdCBwcm92aWRlcyB0aGF0IHN1cHBvcnQuICBUaGlzIGlzIHJlYWxseSBoYXJkIGZvciBtYW55Ci1yZWFzb25zLgotCi1UaGUgbW9zdCBjb21tb24sIGFuZCBwb3NzaWJseSB0aGUgbW9zdCByZWFzb25hYmxlIGZvciBtb3N0IG5lZWRzLCBpcwotdG8gaW5jbHVkZSB0aGUgbmV3IGltcGxlbWVudGF0aW9ucyB3aXRoIHlvdXIgXGZpbGV7c2V0dXAucHl9IHNjcmlwdCwKLWFuZCBjYXVzZSB0aGUgXGZ1bmN0aW9ue2Rpc3R1dGlscy5jb3JlLnNldHVwKCl9IGZ1bmN0aW9uIHVzZSB0aGVtOgotCi1cYmVnaW57dmVyYmF0aW19Ci1mcm9tIGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX3B5IGltcG9ydCBidWlsZF9weSBhcyBfYnVpbGRfcHkKLWZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IHNldHVwCi0KLWNsYXNzIGJ1aWxkX3B5KF9idWlsZF9weSk6Ci0gICAgIiIiU3BlY2lhbGl6ZWQgUHl0aG9uIHNvdXJjZSBidWlsZGVyLiIiIgotCi0gICAgIyBpbXBsZW1lbnQgd2hhdGV2ZXIgbmVlZHMgdG8gYmUgZGlmZmVyZW50Li4uCi0KLXNldHVwKGNtZGNsYXNzPXsnYnVpbGRfcHknOiBidWlsZF9weX0sCi0gICAgICAuLi4pCi1cZW5ke3ZlcmJhdGltfQotCi1UaGlzIGFwcHJvYWNoIGlzIG1vc3QgdmFsdWFibGUgaWYgdGhlIG5ldyBpbXBsZW1lbnRhdGlvbnMgbXVzdCBiZSB1c2VkCi10byB1c2UgYSBwYXJ0aWN1bGFyIHBhY2thZ2UsIGFzIGV2ZXJ5b25lIGludGVyZXN0ZWQgaW4gdGhlIHBhY2thZ2UKLXdpbGwgbmVlZCB0byBoYXZlIHRoZSBuZXcgY29tbWFuZCBpbXBsZW1lbnRhdGlvbi4KLQotQmVnaW5uaW5nIHdpdGggUHl0aG9uIDIuNCwgYSB0aGlyZCBvcHRpb24gaXMgYXZhaWxhYmxlLCBpbnRlbmRlZCB0bwotYWxsb3cgbmV3IGNvbW1hbmRzIHRvIGJlIGFkZGVkIHdoaWNoIGNhbiBzdXBwb3J0IGV4aXN0aW5nCi1cZmlsZXtzZXR1cC5weX0gc2NyaXB0cyB3aXRob3V0IHJlcXVpcmluZyBtb2RpZmljYXRpb25zIHRvIHRoZSBQeXRob24KLWluc3RhbGxhdGlvbi4gIFRoaXMgaXMgZXhwZWN0ZWQgdG8gYWxsb3cgdGhpcmQtcGFydHkgZXh0ZW5zaW9ucyB0bwotcHJvdmlkZSBzdXBwb3J0IGZvciBhZGRpdGlvbmFsIHBhY2thZ2luZyBzeXN0ZW1zLCBidXQgdGhlIGNvbW1hbmRzIGNhbgotYmUgdXNlZCBmb3IgYW55dGhpbmcgZGlzdHV0aWxzIGNvbW1hbmRzIGNhbiBiZSB1c2VkIGZvci4gIEEgbmV3Ci1jb25maWd1cmF0aW9uIG9wdGlvbiwgXG9wdGlvbntjb21tYW5kXF9wYWNrYWdlc30gKGNvbW1hbmQtbGluZSBvcHRpb24KLVxsb25ncHJvZ3JhbW9wdHtjb21tYW5kLXBhY2thZ2VzfSksIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYWRkaXRpb25hbAotcGFja2FnZXMgdG8gYmUgc2VhcmNoZWQgZm9yIG1vZHVsZXMgaW1wbGVtZW50aW5nIGNvbW1hbmRzLiAgTGlrZSBhbGwKLWRpc3R1dGlscyBvcHRpb25zLCB0aGlzIGNhbiBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSBvciBpbiBhCi1jb25maWd1cmF0aW9uIGZpbGUuICBUaGlzIG9wdGlvbiBjYW4gb25seSBiZSBzZXQgaW4gdGhlCi1cY29kZXtbZ2xvYmFsXX0gc2VjdGlvbiBvZiBhIGNvbmZpZ3VyYXRpb24gZmlsZSwgb3IgYmVmb3JlIGFueQotY29tbWFuZHMgb24gdGhlIGNvbW1hbmQgbGluZS4gIElmIHNldCBpbiBhIGNvbmZpZ3VyYXRpb24gZmlsZSwgaXQgY2FuCi1iZSBvdmVycmlkZGVuIGZyb20gdGhlIGNvbW1hbmQgbGluZTsgc2V0dGluZyBpdCB0byBhbiBlbXB0eSBzdHJpbmcgb24KLXRoZSBjb21tYW5kIGxpbmUgY2F1c2VzIHRoZSBkZWZhdWx0IHRvIGJlIHVzZWQuICBUaGlzIHNob3VsZCBuZXZlciBiZQotc2V0IGluIGEgY29uZmlndXJhdGlvbiBmaWxlIHByb3ZpZGVkIHdpdGggYSBwYWNrYWdlLgotCi1UaGlzIG5ldyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gYWRkIGFueSBudW1iZXIgb2YgcGFja2FnZXMgdG8gdGhlIGxpc3QKLW9mIHBhY2thZ2VzIHNlYXJjaGVkIGZvciBjb21tYW5kIGltcGxlbWVudGF0aW9uczsgbXVsdGlwbGUgcGFja2FnZQotbmFtZXMgc2hvdWxkIGJlIHNlcGFyYXRlZCBieSBjb21tYXMuICBXaGVuIG5vdCBzcGVjaWZpZWQsIHRoZSBzZWFyY2gKLWlzIG9ubHkgcGVyZm9ybWVkIGluIHRoZSBcbW9kdWxle2Rpc3R1dGlscy5jb21tYW5kfSBwYWNrYWdlLiAgV2hlbgotXGZpbGV7c2V0dXAucHl9IGlzIHJ1biB3aXRoIHRoZSBvcHRpb24KLVxsb25ncHJvZ3JhbW9wdHtjb21tYW5kLXBhY2thZ2VzfSBccHJvZ3JhbW9wdHtkaXN0Y21kcyxidWlsZGNtZHN9LAotaG93ZXZlciwgdGhlIHBhY2thZ2VzIFxtb2R1bGV7ZGlzdHV0aWxzLmNvbW1hbmR9LCBcbW9kdWxle2Rpc3RjbWRzfSwKLWFuZCBcbW9kdWxle2J1aWxkY21kc30gd2lsbCBiZSBzZWFyY2hlZCBpbiB0aGF0IG9yZGVyLiAgTmV3IGNvbW1hbmRzCi1hcmUgZXhwZWN0ZWQgdG8gYmUgaW1wbGVtZW50ZWQgaW4gbW9kdWxlcyBvZiB0aGUgc2FtZSBuYW1lIGFzIHRoZQotY29tbWFuZCBieSBjbGFzc2VzIHNoYXJpbmcgdGhlIHNhbWUgbmFtZS4gIEdpdmVuIHRoZSBleGFtcGxlIGNvbW1hbmQKLWxpbmUgb3B0aW9uIGFib3ZlLCB0aGUgY29tbWFuZCBcY29tbWFuZHtiZGlzdFxfb3BlbnBrZ30gY291bGQgYmUKLWltcGxlbWVudGVkIGJ5IHRoZSBjbGFzcyBcY2xhc3N7ZGlzdGNtZHMuYmRpc3Rfb3BlbnBrZy5iZGlzdF9vcGVucGtnfQotb3IgXGNsYXNze2J1aWxkY21kcy5iZGlzdF9vcGVucGtnLmJkaXN0X29wZW5wa2d9LgotCi1cc2VjdGlvbntBZGRpbmcgbmV3IGRpc3RyaWJ1dGlvbiB0eXBlc30KLQotQ29tbWFuZHMgdGhhdCBjcmVhdGUgZGlzdHJpYnV0aW9ucyAoZmlsZXMgaW4gdGhlIFxmaWxle2Rpc3QvfQotZGlyZWN0b3J5KSBuZWVkIHRvIGFkZCBcY29kZXsoXHZhcntjb21tYW5kfSwgXHZhcntmaWxlbmFtZX0pfSBwYWlycyB0bwotXGNvZGV7c2VsZi5kaXN0cmlidXRpb24uZGlzdF9maWxlc30gc28gdGhhdCBcY29tbWFuZHt1cGxvYWR9IGNhbgotdXBsb2FkIGl0IHRvIFB5UEkuICBUaGUgXHZhcntmaWxlbmFtZX0gaW4gdGhlIHBhaXIgY29udGFpbnMgbm8gcGF0aAotaW5mb3JtYXRpb24sIG9ubHkgdGhlIG5hbWUgb2YgdGhlIGZpbGUgaXRzZWxmLiAgSW4gZHJ5LXJ1biBtb2RlLCBwYWlycwotc2hvdWxkIHN0aWxsIGJlIGFkZGVkIHRvIHJlcHJlc2VudCB3aGF0IHdvdWxkIGhhdmUgYmVlbiBjcmVhdGVkLgotCi1cY2hhcHRlcntDb21tYW5kIFJlZmVyZW5jZX0KLVxsYWJlbHtyZWZlcmVuY2V9Ci0KLQotJVxzZWN0aW9ue0J1aWxkaW5nIG1vZHVsZXM6IHRoZSBccHJvdGVjdFxjb21tYW5ke2J1aWxkfSBjb21tYW5kIGZhbWlseX0KLSVcbGFiZWx7YnVpbGQtY21kc30KLQotJVxzdWJzdWJzZWN0aW9ue1xwcm90ZWN0XGNvbW1hbmR7YnVpbGR9fQotJVxsYWJlbHtidWlsZC1jbWR9Ci0KLSVcc3Vic3Vic2VjdGlvbntccHJvdGVjdFxjb21tYW5ke2J1aWxkXF9weX19Ci0lXGxhYmVse2J1aWxkLXB5LWNtZH0KLQotJVxzdWJzdWJzZWN0aW9ue1xwcm90ZWN0XGNvbW1hbmR7YnVpbGRcX2V4dH19Ci0lXGxhYmVse2J1aWxkLWV4dC1jbWR9Ci0KLSVcc3Vic3Vic2VjdGlvbntccHJvdGVjdFxjb21tYW5ke2J1aWxkXF9jbGlifX0KLSVcbGFiZWx7YnVpbGQtY2xpYi1jbWR9Ci0KLQotXHNlY3Rpb257SW5zdGFsbGluZyBtb2R1bGVzOiB0aGUgXHByb3RlY3RcY29tbWFuZHtpbnN0YWxsfSBjb21tYW5kIGZhbWlseX0KLVxsYWJlbHtpbnN0YWxsLWNtZH0KLQotVGhlIGluc3RhbGwgY29tbWFuZCBlbnN1cmVzIHRoYXQgdGhlIGJ1aWxkIGNvbW1hbmRzIGhhdmUgYmVlbiBydW4gYW5kIHRoZW4KLXJ1bnMgdGhlIHN1YmNvbW1hbmRzIFxjb21tYW5ke2luc3RhbGxcX2xpYn0sCi1cY29tbWFuZHtpbnN0YWxsXF9kYXRhfSBhbmQKLVxjb21tYW5ke2luc3RhbGxcX3NjcmlwdHN9LgotCi0lXHN1YnN1YnNlY3Rpb257XHByb3RlY3RcY29tbWFuZHtpbnN0YWxsXF9saWJ9fQotJVxsYWJlbHtpbnN0YWxsLWxpYi1jbWR9Ci0KLVxzdWJzZWN0aW9ue1xwcm90ZWN0XGNvbW1hbmR7aW5zdGFsbFxfZGF0YX19Ci1cbGFiZWx7aW5zdGFsbC1kYXRhLWNtZH0KLVRoaXMgY29tbWFuZCBpbnN0YWxscyBhbGwgZGF0YSBmaWxlcyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLVxzdWJzZWN0aW9ue1xwcm90ZWN0XGNvbW1hbmR7aW5zdGFsbFxfc2NyaXB0c319Ci1cbGFiZWx7aW5zdGFsbC1zY3JpcHRzLWNtZH0KLVRoaXMgY29tbWFuZCBpbnN0YWxscyBhbGwgKFB5dGhvbikgc2NyaXB0cyBpbiB0aGUgZGlzdHJpYnV0aW9uLgotCi0KLSVcc3Vic2VjdGlvbntDbGVhbmluZyB1cDogdGhlIFxwcm90ZWN0XGNvbW1hbmR7Y2xlYW59IGNvbW1hbmR9Ci0lXGxhYmVse2NsZWFuLWNtZH0KLQotCi1cc2VjdGlvbntDcmVhdGluZyBhIHNvdXJjZSBkaXN0cmlidXRpb246IHRoZQotICAgICAgICAgICAgXHByb3RlY3RcY29tbWFuZHtzZGlzdH0gY29tbWFuZH0KLVxsYWJlbHtzZGlzdC1jbWR9Ci0KLQotXFhYWHtmcmFnbWVudCBtb3ZlZCBkb3duIGZyb20gYWJvdmU6IG5lZWRzIGNvbnRleHQhfQotCi1UaGUgbWFuaWZlc3QgdGVtcGxhdGUgY29tbWFuZHMgYXJlOgotCi1cYmVnaW57dGFibGVpaX17bGx9e2NvbW1hbmR9e0NvbW1hbmR9e0Rlc2NyaXB0aW9ufQotICBcbGluZWlpe2luY2x1ZGUgXHZhcntwYXQxfSBcdmFye3BhdDJ9IC4uLiB9Ci0gICAge2luY2x1ZGUgYWxsIGZpbGVzIG1hdGNoaW5nIGFueSBvZiB0aGUgbGlzdGVkIHBhdHRlcm5zfQotICBcbGluZWlpe2V4Y2x1ZGUgXHZhcntwYXQxfSBcdmFye3BhdDJ9IC4uLiB9Ci0gICAge2V4Y2x1ZGUgYWxsIGZpbGVzIG1hdGNoaW5nIGFueSBvZiB0aGUgbGlzdGVkIHBhdHRlcm5zfQotICBcbGluZWlpe3JlY3Vyc2l2ZS1pbmNsdWRlIFx2YXJ7ZGlyfSBcdmFye3BhdDF9IFx2YXJ7cGF0Mn0gLi4uIH0KLSAgICB7aW5jbHVkZSBhbGwgZmlsZXMgdW5kZXIgXHZhcntkaXJ9IG1hdGNoaW5nIGFueSBvZiB0aGUgbGlzdGVkIHBhdHRlcm5zfQotICBcbGluZWlpe3JlY3Vyc2l2ZS1leGNsdWRlIFx2YXJ7ZGlyfSBcdmFye3BhdDF9IFx2YXJ7cGF0Mn0gLi4ufQotICAgIHtleGNsdWRlIGFsbCBmaWxlcyB1bmRlciBcdmFye2Rpcn0gbWF0Y2hpbmcgYW55IG9mIHRoZSBsaXN0ZWQgcGF0dGVybnN9Ci0gIFxsaW5laWl7Z2xvYmFsLWluY2x1ZGUgXHZhcntwYXQxfSBcdmFye3BhdDJ9IC4uLn0KLSAgICB7aW5jbHVkZSBhbGwgZmlsZXMgYW55d2hlcmUgaW4gdGhlIHNvdXJjZSB0cmVlIG1hdGNoaW5nXFwmCi0gICAgIGFueSBvZiB0aGUgbGlzdGVkIHBhdHRlcm5zfQotICBcbGluZWlpe2dsb2JhbC1leGNsdWRlIFx2YXJ7cGF0MX0gXHZhcntwYXQyfSAuLi59Ci0gICAge2V4Y2x1ZGUgYWxsIGZpbGVzIGFueXdoZXJlIGluIHRoZSBzb3VyY2UgdHJlZSBtYXRjaGluZ1xcJgotICAgICBhbnkgb2YgdGhlIGxpc3RlZCBwYXR0ZXJuc30KLSAgXGxpbmVpaXtwcnVuZSBcdmFye2Rpcn19e2V4Y2x1ZGUgYWxsIGZpbGVzIHVuZGVyIFx2YXJ7ZGlyfX0KLSAgXGxpbmVpaXtncmFmdCBcdmFye2Rpcn19e2luY2x1ZGUgYWxsIGZpbGVzIHVuZGVyIFx2YXJ7ZGlyfX0KLVxlbmR7dGFibGVpaX0KLQotVGhlIHBhdHRlcm5zIGhlcmUgYXJlIFxVTklYLXN0eWxlIGBgZ2xvYicnIHBhdHRlcm5zOiBcY29kZXsqfSBtYXRjaGVzIGFueQotc2VxdWVuY2Ugb2YgcmVndWxhciBmaWxlbmFtZSBjaGFyYWN0ZXJzLCBcY29kZXs/fSBtYXRjaGVzIGFueSBzaW5nbGUKLXJlZ3VsYXIgZmlsZW5hbWUgY2hhcmFjdGVyLCBhbmQgXGNvZGV7W1x2YXJ7cmFuZ2V9XX0gbWF0Y2hlcyBhbnkgb2YgdGhlCi1jaGFyYWN0ZXJzIGluIFx2YXJ7cmFuZ2V9IChlLmcuLCBcY29kZXthLXp9LCBcY29kZXthLXpBLVp9LAotXGNvZGV7YS1mMC05XF8ufSkuICBUaGUgZGVmaW5pdGlvbiBvZiBgYHJlZ3VsYXIgZmlsZW5hbWUgY2hhcmFjdGVyJycgaXMKLXBsYXRmb3JtLXNwZWNpZmljOiBvbiBcVU5JWHt9IGl0IGlzIGFueXRoaW5nIGV4Y2VwdCBzbGFzaDsgb24gV2luZG93cwotYW55dGhpbmcgZXhjZXB0IGJhY2tzbGFzaCBvciBjb2xvbjsgb24gTWFjIE9TIDkgYW55dGhpbmcgZXhjZXB0IGNvbG9uLgotCi1cWFhYe1dpbmRvd3Mgc3VwcG9ydCBub3QgdGhlcmUgeWV0fQotCi0KLSVcc2VjdGlvbntDcmVhdGluZyBhIGJ1aWx0IGRpc3RyaWJ1dGlvbjogdGhlCi0lICBccHJvdGVjdFxjb21tYW5ke2JkaXN0fSBjb21tYW5kIGZhbWlseX0KLSVcbGFiZWx7YmRpc3QtY21kc30KLQotCi0lXHN1YnNlY3Rpb257XHByb3RlY3RcY29tbWFuZHtiZGlzdH19Ci0KLSVcc3Vic2VjdGlvbntccHJvdGVjdFxjb21tYW5ke2JkaXN0XF9kdW1ifX0KLQotJVxzdWJzZWN0aW9ue1xwcm90ZWN0XGNvbW1hbmR7YmRpc3RcX3JwbX19Ci0KLSVcc3Vic2VjdGlvbntccHJvdGVjdFxjb21tYW5ke2JkaXN0XF93aW5pbnN0fX0KLQotCi1cY2hhcHRlcntBUEkgUmVmZXJlbmNlIFxsYWJlbHthcGktcmVmZXJlbmNlfX0KLQotXHNlY3Rpb257XG1vZHVsZXtkaXN0dXRpbHMuY29yZX0gLS0tIENvcmUgRGlzdHV0aWxzIGZ1bmN0aW9uYWxpdHl9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtkaXN0dXRpbHMuY29yZX0KLVxtb2R1bGVzeW5vcHNpc3tUaGUgY29yZSBEaXN0dXRpbHMgZnVuY3Rpb25hbGl0eX0KLQotVGhlIFxtb2R1bGV7ZGlzdHV0aWxzLmNvcmV9IG1vZHVsZSBpcyB0aGUgb25seSBtb2R1bGUgdGhhdCBuZWVkcyB0byBiZQotaW5zdGFsbGVkIHRvIHVzZSB0aGUgRGlzdHV0aWxzLiBJdCBwcm92aWRlcyB0aGUgXGZ1bmN0aW9ue3NldHVwKCl9ICh3aGljaAotaXMgY2FsbGVkIGZyb20gdGhlIHNldHVwIHNjcmlwdCkuIEluZGlyZWN0bHkgcHJvdmlkZXMgdGhlIAotXGNsYXNze2Rpc3R1dGlscy5kaXN0LkRpc3RyaWJ1dGlvbn0gYW5kIFxjbGFzc3tkaXN0dXRpbHMuY21kLkNvbW1hbmR9IGNsYXNzLgotCi1cYmVnaW57ZnVuY2Rlc2N9e3NldHVwfXthcmd1bWVudHN9Ci1UaGUgYmFzaWMgZG8tZXZlcnl0aGluZyBmdW5jdGlvbiB0aGF0IGRvZXMgbW9zdCBldmVyeXRoaW5nIHlvdSBjb3VsZCBldmVyCi1hc2sgZm9yIGZyb20gYSBEaXN0dXRpbHMgbWV0aG9kLiBTZWUgWFhYWFgKLQotVGhlIHNldHVwIGZ1bmN0aW9uIHRha2VzIGEgbGFyZ2UgbnVtYmVyIG9mIGFyZ3VtZW50cy4gVGhlc2UKLWFyZSBsYWlkIG91dCBpbiB0aGUgZm9sbG93aW5nIHRhYmxlLgotCi1cYmVnaW57dGFibGVpaWl9e2N8bHxsfXthcmd1bWVudCBuYW1lfXthcmd1bWVudCBuYW1lfXt2YWx1ZX17dHlwZX0KLVxsaW5laWlpe25hbWV9e1RoZSBuYW1lIG9mIHRoZSBwYWNrYWdlfXthIHN0cmluZ30KLVxsaW5laWlpe3ZlcnNpb259e1RoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgcGFja2FnZX17U2VlIFxyZWZtb2R1bGV7ZGlzdHV0aWxzLnZlcnNpb259fQotXGxpbmVpaWl7ZGVzY3JpcHRpb259e0Egc2luZ2xlIGxpbmUgZGVzY3JpYmluZyB0aGUgcGFja2FnZX17YSBzdHJpbmd9Ci1cbGluZWlpaXtsb25nX2Rlc2NyaXB0aW9ufXtMb25nZXIgZGVzY3JpcHRpb24gb2YgdGhlIHBhY2thZ2V9e2Egc3RyaW5nfQotXGxpbmVpaWl7YXV0aG9yfXtUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSBhdXRob3J9e2Egc3RyaW5nfQotXGxpbmVpaWl7YXV0aG9yX2VtYWlsfXtUaGUgZW1haWwgYWRkcmVzcyBvZiB0aGUgcGFja2FnZSBhdXRob3J9e2Egc3RyaW5nfQotXGxpbmVpaWl7bWFpbnRhaW5lcn17VGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgbWFpbnRhaW5lciwgaWYgZGlmZmVyZW50IGZyb20gdGhlIGF1dGhvcn17YSBzdHJpbmd9Ci1cbGluZWlpaXttYWludGFpbmVyX2VtYWlsfXtUaGUgZW1haWwgYWRkcmVzcyBvZiB0aGUgY3VycmVudCBtYWludGFpbmVyLCBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgYXV0aG9yfXt9Ci1cbGluZWlpaXt1cmx9e0EgVVJMIGZvciB0aGUgcGFja2FnZSAoaG9tZXBhZ2UpfXthIFVSTH0KLVxsaW5laWlpe2Rvd25sb2FkX3VybH17QSBVUkwgdG8gZG93bmxvYWQgdGhlIHBhY2thZ2V9e2EgVVJMfQotXGxpbmVpaWl7cGFja2FnZXN9e0EgbGlzdCBvZiBQeXRob24gcGFja2FnZXMgdGhhdCBkaXN0dXRpbHMgd2lsbCBtYW5pcHVsYXRlfXthIGxpc3Qgb2Ygc3RyaW5nc30KLVxsaW5laWlpe3B5X21vZHVsZXN9e0EgbGlzdCBvZiBQeXRob24gbW9kdWxlcyB0aGF0IGRpc3R1dGlscyB3aWxsIG1hbmlwdWxhdGV9e2EgbGlzdCBvZiBzdHJpbmdzfQotXGxpbmVpaWl7c2NyaXB0c317QSBsaXN0IG9mIHN0YW5kYWxvbmUgc2NyaXB0IGZpbGVzIHRvIGJlIGJ1aWx0IGFuZCBpbnN0YWxsZWR9e2EgbGlzdCBvZiBzdHJpbmdzfQotXGxpbmVpaWl7ZXh0X21vZHVsZXN9e0EgbGlzdCBvZiBQeXRob24gZXh0ZW5zaW9ucyB0byBiZSBidWlsdH17QSBsaXN0IG9mIAotaW5zdGFuY2VzIG9mIFxjbGFzc3tkaXN0dXRpbHMuY29yZS5FeHRlbnNpb259fQotXGxpbmVpaWl7Y2xhc3NpZmllcnN9e0EgbGlzdCBvZiBjYXRlZ29yaWVzIGZvciB0aGUgcGFja2FnZX17VGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGNhdGVnb3JpemF0aW9ucyBpcyBhdCBcdXJse2h0dHA6Ly9jaGVlc2VzaG9wLnB5dGhvbi5vcmcvcHlwaT86YWN0aW9uPWxpc3RfY2xhc3NpZmllcnN9Ln0KLVxsaW5laWlpe2Rpc3RjbGFzc317dGhlIFxjbGFzc3tEaXN0cmlidXRpb259IGNsYXNzIHRvIHVzZX17QSBzdWJjbGFzcyBvZiBcY2xhc3N7ZGlzdHV0aWxzLmNvcmUuRGlzdHJpYnV0aW9ufX0KLSUgV2hhdCBvbiBlYXJ0aCBpcyB0aGUgdXNlIGNhc2UgZm9yIHNjcmlwdF9uYW1lPwotXGxpbmVpaWl7c2NyaXB0X25hbWV9e1RoZSBuYW1lIG9mIHRoZSBzZXR1cC5weSBzY3JpcHQgLSBkZWZhdWx0cyB0byBcY29kZXtzeXMuYXJndlswXX19e2Egc3RyaW5nfQotXGxpbmVpaWl7c2NyaXB0X2FyZ3N9e0FyZ3VtZW50cyB0byBzdXBwbHkgdG8gdGhlIHNldHVwIHNjcmlwdH17YSBsaXN0IG9mIHN0cmluZ3N9Ci1cbGluZWlpaXtvcHRpb25zfXtkZWZhdWx0IG9wdGlvbnMgZm9yIHRoZSBzZXR1cCBzY3JpcHR9e2Egc3RyaW5nfQotXGxpbmVpaWl7bGljZW5zZX17VGhlIGxpY2Vuc2UgZm9yIHRoZSBwYWNrYWdlfXt9Ci1cbGluZWlpaXtrZXl3b3Jkc317RGVzY3JpcHRpdmUgbWV0YS1kYXRhLiBTZWUgXHBlcHszMTR9fXt9Ci1cbGluZWlpaXtwbGF0Zm9ybXN9e317fQotXGxpbmVpaWl7Y21kY2xhc3N9e0EgbWFwcGluZyBvZiBjb21tYW5kIG5hbWVzIHRvIFxjbGFzc3tDb21tYW5kfSBzdWJjbGFzc2VzfXthIGRpY3Rpb25hcnl9Ci1cZW5ke3RhYmxlaWlpfQotCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3J1bl9zZXR1cH17c2NyaXB0X25hbWVcb3B0aW9uYWx7LCBzY3JpcHRfYXJncz1cY29kZXtOb25lfSwgc3RvcF9hZnRlcj1cY29kZXsncnVuJ319fQotUnVuIGEgc2V0dXAgc2NyaXB0IGluIGEgc29tZXdoYXQgY29udHJvbGxlZCBlbnZpcm9ubWVudCwgYW5kIHJldHVybiAKLXRoZSBcY2xhc3N7ZGlzdHV0aWxzLmRpc3QuRGlzdHJpYnV0aW9ufSBpbnN0YW5jZSB0aGF0IGRyaXZlcyB0aGluZ3MuICAKLVRoaXMgaXMgdXNlZnVsIGlmIHlvdSBuZWVkIHRvIGZpbmQgb3V0IHRoZSBkaXN0cmlidXRpb24gbWV0YS1kYXRhIAotKHBhc3NlZCBhcyBrZXl3b3JkIGFyZ3MgZnJvbSBcdmFye3NjcmlwdH0gdG8gXGZ1bmN0aW9ue3NldHVwKCl9KSwgb3IgCi10aGUgY29udGVudHMgb2YgdGhlIGNvbmZpZyBmaWxlcyBvciBjb21tYW5kLWxpbmUuCi0KLVx2YXJ7c2NyaXB0X25hbWV9IGlzIGEgZmlsZSB0aGF0IHdpbGwgYmUgcmVhZCBhbmQgcnVuIHdpdGggXGZ1bmN0aW9ue2V4ZWMoKX0KLVxjb2Rle3N5cy5hcmd2WzBdfSB3aWxsIGJlIHJlcGxhY2VkIHdpdGggXHZhcntzY3JpcHR9IGZvciB0aGUgZHVyYXRpb24gb2YgdGhlCi1jYWxsLiAgXHZhcntzY3JpcHRfYXJnc30gaXMgYSBsaXN0IG9mIHN0cmluZ3M7IGlmIHN1cHBsaWVkLAotXGNvZGV7c3lzLmFyZ3ZbMTpdfSB3aWxsIGJlIHJlcGxhY2VkIGJ5IFx2YXJ7c2NyaXB0X2FyZ3N9IGZvciB0aGUgZHVyYXRpb24gCi1vZiB0aGUgY2FsbC4KLQotXHZhcntzdG9wX2FmdGVyfSB0ZWxscyBcZnVuY3Rpb257c2V0dXAoKX0gd2hlbiB0byBzdG9wIHByb2Nlc3Npbmc7IHBvc3NpYmxlIAotdmFsdWVzOgotCi1cYmVnaW57dGFibGVpaX17Y3xsfXt2YWx1ZX17dmFsdWV9e2Rlc2NyaXB0aW9ufQotXGxpbmVpaXtpbml0fXtTdG9wIGFmdGVyIHRoZSBcY2xhc3N7RGlzdHJpYnV0aW9ufSBpbnN0YW5jZSBoYXMgYmVlbiBjcmVhdGVkIAotYW5kIHBvcHVsYXRlZCB3aXRoIHRoZSBrZXl3b3JkIGFyZ3VtZW50cyB0byBcZnVuY3Rpb257c2V0dXAoKX19Ci1cbGluZWlpe2NvbmZpZ317U3RvcCBhZnRlciBjb25maWcgZmlsZXMgaGF2ZSBiZWVuIHBhcnNlZCAoYW5kIHRoZWlyIGRhdGEKLXN0b3JlZCBpbiB0aGUgXGNsYXNze0Rpc3RyaWJ1dGlvbn0gaW5zdGFuY2UpfQotXGxpbmVpaXtjb21tYW5kbGluZX17U3RvcCBhZnRlciB0aGUgY29tbWFuZC1saW5lIChcY29kZXtzeXMuYXJndlsxOl19IG9yIAotXHZhcntzY3JpcHRfYXJnc30pIGhhdmUgYmVlbiBwYXJzZWQgKGFuZCB0aGUgZGF0YSBzdG9yZWQgaW4gdGhlIAotXGNsYXNze0Rpc3RyaWJ1dGlvbn0gaW5zdGFuY2UuKX0KLVxsaW5laWl7cnVufXtTdG9wIGFmdGVyIGFsbCBjb21tYW5kcyBoYXZlIGJlZW4gcnVuICh0aGUgc2FtZSBhcyAKLWlmIFxmdW5jdGlvbntzZXR1cCgpfSBoYWQgYmVlbiBjYWxsZWQgaW4gdGhlIHVzdWFsIHdheSkuIFRoaXMgaXMgdGhlIGRlZmF1bHQgCi12YWx1ZS59Ci1cZW5ke3RhYmxlaWl9Ci1cZW5ke2Z1bmNkZXNjfQotCi1JbiBhZGRpdGlvbiwgdGhlIFxtb2R1bGV7ZGlzdHV0aWxzLmNvcmV9IG1vZHVsZSBleHBvc2VkIGEgbnVtYmVyIG9mIAotY2xhc3NlcyB0aGF0IGxpdmUgZWxzZXdoZXJlLgotCi1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtIFxjbGFzc3tFeHRlbnNpb259IGZyb20gXHJlZm1vZHVsZXtkaXN0dXRpbHMuZXh0ZW5zaW9ufQotXGl0ZW0gXGNsYXNze0NvbW1hbmR9IGZyb20gXHJlZm1vZHVsZXtkaXN0dXRpbHMuY21kfQotXGl0ZW0gXGNsYXNze0Rpc3RyaWJ1dGlvbn0gZnJvbSBccmVmbW9kdWxle2Rpc3R1dGlscy5kaXN0fQotXGVuZHtpdGVtaXplfQotCi1BIHNob3J0IGRlc2NyaXB0aW9uIG9mIGVhY2ggb2YgdGhlc2UgZm9sbG93cywgYnV0IHNlZSB0aGUgcmVsZXZhbnQKLW1vZHVsZSBmb3IgdGhlIGZ1bGwgcmVmZXJlbmNlLgotCi1cYmVnaW57Y2xhc3NkZXNjKn17RXh0ZW5zaW9ufQotCi1UaGUgRXh0ZW5zaW9uIGNsYXNzIGRlc2NyaWJlcyBhIHNpbmdsZSBDIG9yIFxDcHAgZXh0ZW5zaW9uIG1vZHVsZSBpbiBhCi1zZXR1cCBzY3JpcHQuIEl0IGFjY2VwdHMgdGhlIGZvbGxvd2luZyBrZXl3b3JkIGFyZ3VtZW50cyBpbiBpdHMKLWNvbnN0cnVjdG9yCi0KLVxiZWdpbnt0YWJsZWlpaX17Y3xsfGx9e2FyZ3VtZW50IG5hbWV9e2FyZ3VtZW50IG5hbWV9e3ZhbHVlfXt0eXBlfQotXGxpbmVpaWl7bmFtZX17dGhlIGZ1bGwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uLCBpbmNsdWRpbmcgYW55IHBhY2thZ2VzCi0tLS0gaWUuIFxlbXBoe25vdH0gYSBmaWxlbmFtZSBvciBwYXRobmFtZSwgYnV0IFB5dGhvbiBkb3R0ZWQgbmFtZX17c3RyaW5nfQotXGxpbmVpaWl7c291cmNlc317bGlzdCBvZiBzb3VyY2UgZmlsZW5hbWVzLCByZWxhdGl2ZSB0byB0aGUgZGlzdHJpYnV0aW9uCi1yb290ICh3aGVyZSB0aGUgc2V0dXAgc2NyaXB0IGxpdmVzKSwgaW4gXFVOSVh7fSBmb3JtIChzbGFzaC1zZXBhcmF0ZWQpIGZvcgotcG9ydGFiaWxpdHkuIFNvdXJjZSBmaWxlcyBtYXkgYmUgQywgXENwcCwgU1dJRyAoLmkpLCBwbGF0Zm9ybS1zcGVjaWZpYwotcmVzb3VyY2UgZmlsZXMsIG9yIHdoYXRldmVyIGVsc2UgaXMgcmVjb2duaXplZCBieSB0aGUgXGNvbW1hbmR7YnVpbGRfZXh0fQotY29tbWFuZCBhcyBzb3VyY2UgZm9yIGEgUHl0aG9uIGV4dGVuc2lvbi59e3N0cmluZ30KLVxsaW5laWlpe2luY2x1ZGVfZGlyc317bGlzdCBvZiBkaXJlY3RvcmllcyB0byBzZWFyY2ggZm9yIEMvXENwcHt9IGhlYWRlcgotZmlsZXMgKGluIFxVTklYe30gZm9ybSBmb3IgcG9ydGFiaWxpdHkpfXtzdHJpbmd9Ci1cbGluZWlpaXtkZWZpbmVfbWFjcm9zfXtsaXN0IG9mIG1hY3JvcyB0byBkZWZpbmU7IGVhY2ggbWFjcm8gaXMgZGVmaW5lZAotdXNpbmcgYSAyLXR1cGxlLCB3aGVyZSAndmFsdWUnIGlzIGVpdGhlciB0aGUgc3RyaW5nIHRvIGRlZmluZSBpdCB0byBvcgotXGNvZGV7Tm9uZX0gdG8gZGVmaW5lIGl0IHdpdGhvdXQgYSBwYXJ0aWN1bGFyIHZhbHVlIChlcXVpdmFsZW50IG9mCi1cY29kZXtcI2RlZmluZSBGT099IGluIHNvdXJjZSBvciBccHJvZ3JhbW9wdHstREZPT30gb24gXFVOSVh7fSBDCi1jb21waWxlciBjb21tYW5kIGxpbmUpIH17IChzdHJpbmcsc3RyaW5nKSAKLXR1cGxlIG9yIChuYW1lLFxjb2Rle05vbmV9KSB9Ci1cbGluZWlpaXt1bmRlZl9tYWNyb3N9e2xpc3Qgb2YgbWFjcm9zIHRvIHVuZGVmaW5lIGV4cGxpY2l0bHl9e3N0cmluZ30KLVxsaW5laWlpe2xpYnJhcnlfZGlyc317bGlzdCBvZiBkaXJlY3RvcmllcyB0byBzZWFyY2ggZm9yIEMvXENwcHt9IGxpYnJhcmllcwotYXQgbGluayB0aW1lIH17c3RyaW5nfQotXGxpbmVpaWl7bGlicmFyaWVzfXtsaXN0IG9mIGxpYnJhcnkgbmFtZXMgKG5vdCBmaWxlbmFtZXMgb3IgcGF0aHMpIHRvCi1saW5rIGFnYWluc3QgfXtzdHJpbmd9Ci1cbGluZWlpaXtydW50aW1lX2xpYnJhcnlfZGlyc317bGlzdCBvZiBkaXJlY3RvcmllcyB0byBzZWFyY2ggZm9yIEMvXENwcHt9Ci1saWJyYXJpZXMgYXQgcnVuIHRpbWUgKGZvciBzaGFyZWQgZXh0ZW5zaW9ucywgdGhpcyBpcyB3aGVuIHRoZSBleHRlbnNpb24KLWlzIGxvYWRlZCl9e3N0cmluZ30KLVxsaW5laWlpe2V4dHJhX29iamVjdHN9e2xpc3Qgb2YgZXh0cmEgZmlsZXMgdG8gbGluayB3aXRoIChlZy4gb2JqZWN0Ci1maWxlcyBub3QgaW1wbGllZCBieSAnc291cmNlcycsIHN0YXRpYyBsaWJyYXJ5IHRoYXQgbXVzdCBiZSBleHBsaWNpdGx5Ci1zcGVjaWZpZWQsIGJpbmFyeSByZXNvdXJjZSBmaWxlcywgZXRjLil9e3N0cmluZ30KLVxsaW5laWlpe2V4dHJhX2NvbXBpbGVfYXJnc317YW55IGV4dHJhIHBsYXRmb3JtLSBhbmQgY29tcGlsZXItc3BlY2lmaWMKLWluZm9ybWF0aW9uIHRvIHVzZSB3aGVuIGNvbXBpbGluZyB0aGUgc291cmNlIGZpbGVzIGluICdzb3VyY2VzJy4gRm9yCi1wbGF0Zm9ybXMgYW5kIGNvbXBpbGVycyB3aGVyZSBhIGNvbW1hbmQgbGluZSBtYWtlcyBzZW5zZSwgdGhpcyBpcwotdHlwaWNhbGx5IGEgbGlzdCBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzLCBidXQgZm9yIG90aGVyIHBsYXRmb3JtcyBpdAotY291bGQgYmUgYW55dGhpbmcufXtzdHJpbmd9Ci1cbGluZWlpaXtleHRyYV9saW5rX2FyZ3N9e2FueSBleHRyYSBwbGF0Zm9ybS0gYW5kIGNvbXBpbGVyLXNwZWNpZmljCi1pbmZvcm1hdGlvbiB0byB1c2Ugd2hlbiBsaW5raW5nIG9iamVjdCBmaWxlcyB0b2dldGhlciB0byBjcmVhdGUgdGhlCi1leHRlbnNpb24gKG9yIHRvIGNyZWF0ZSBhIG5ldyBzdGF0aWMgUHl0aG9uIGludGVycHJldGVyKS4gU2ltaWxhcgotaW50ZXJwcmV0YXRpb24gYXMgZm9yICdleHRyYV9jb21waWxlX2FyZ3MnLn17c3RyaW5nfQotXGxpbmVpaWl7ZXhwb3J0X3N5bWJvbHN9e2xpc3Qgb2Ygc3ltYm9scyB0byBiZSBleHBvcnRlZCBmcm9tIGEgc2hhcmVkCi1leHRlbnNpb24uIE5vdCB1c2VkIG9uIGFsbCBwbGF0Zm9ybXMsIGFuZCBub3QgZ2VuZXJhbGx5IG5lY2Vzc2FyeSBmb3IKLVB5dGhvbiBleHRlbnNpb25zLCB3aGljaCB0eXBpY2FsbHkgZXhwb3J0IGV4YWN0bHkgb25lIHN5bWJvbDogXGNvZGV7aW5pdH0gKwotZXh0ZW5zaW9uX25hbWUuIH17c3RyaW5nfQotXGxpbmVpaWl7ZGVwZW5kc317bGlzdCBvZiBmaWxlcyB0aGF0IHRoZSBleHRlbnNpb24gZGVwZW5kcyBvbiB9e3N0cmluZ30KLVxsaW5laWlpe2xhbmd1YWdlfXtleHRlbnNpb24gbGFuZ3VhZ2UgKGkuZS4gXGNvZGV7J2MnfSwgXGNvZGV7J2MrKyd9LCAKLVxjb2RleydvYmpjJ30pLiBXaWxsIGJlIGRldGVjdGVkIGZyb20gdGhlIHNvdXJjZSBleHRlbnNpb25zIGlmIG5vdCBwcm92aWRlZC4KLX17c3RyaW5nfQotXGVuZHt0YWJsZWlpaX0KLVxlbmR7Y2xhc3NkZXNjKn0KLQotXGJlZ2lue2NsYXNzZGVzYyp9e0Rpc3RyaWJ1dGlvbn0KLUEgXGNsYXNze0Rpc3RyaWJ1dGlvbn0gZGVzY3JpYmVzIGhvdyB0byBidWlsZCwgaW5zdGFsbCBhbmQgcGFja2FnZSB1cCBhCi1QeXRob24gc29mdHdhcmUgcGFja2FnZS4gCi0KLVNlZSB0aGUgXGZ1bmN0aW9ue3NldHVwKCl9IGZ1bmN0aW9uIGZvciBhIGxpc3Qgb2Yga2V5d29yZCBhcmd1bWVudHMgYWNjZXB0ZWQgCi1ieSB0aGUgRGlzdHJpYnV0aW9uIGNvbnN0cnVjdG9yLiBcZnVuY3Rpb257c2V0dXAoKX0gY3JlYXRlcyBhIERpc3RyaWJ1dGlvbgotaW5zdGFuY2UuCi1cZW5ke2NsYXNzZGVzYyp9Ci0KLVxiZWdpbntjbGFzc2Rlc2MqfXtDb21tYW5kfQotQSBcY2xhc3N7Q29tbWFuZH0gY2xhc3MgKG9yIHJhdGhlciwgYW4gaW5zdGFuY2Ugb2Ygb25lIG9mIGl0cyBzdWJjbGFzc2VzKQotaW1wbGVtZW50IGEgc2luZ2xlIGRpc3R1dGlscyBjb21tYW5kLgotXGVuZHtjbGFzc2Rlc2MqfQotCi0KLVxzZWN0aW9ue1xtb2R1bGV7ZGlzdHV0aWxzLmNjb21waWxlcn0gLS0tIENDb21waWxlciBiYXNlIGNsYXNzfQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2Rpc3R1dGlscy5jY29tcGlsZXJ9Ci1cbW9kdWxlc3lub3BzaXN7QWJzdHJhY3QgQ0NvbXBpbGVyIGNsYXNzfQotCi1UaGlzIG1vZHVsZSBwcm92aWRlcyB0aGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgdGhlIFxjbGFzc3tDQ29tcGlsZXJ9IAotY2xhc3Nlcy4gIEEgXGNsYXNze0NDb21waWxlcn0gaW5zdGFuY2UgY2FuIGJlIHVzZWQgZm9yIGFsbCB0aGUgY29tcGlsZSAKLWFuZCBsaW5rIHN0ZXBzIG5lZWRlZCB0byBidWlsZCBhIHNpbmdsZSBwcm9qZWN0LiBNZXRob2RzIGFyZSBwcm92aWRlZCB0byAKLXNldCBvcHRpb25zIGZvciB0aGUgY29tcGlsZXIgLS0tIG1hY3JvIGRlZmluaXRpb25zLCBpbmNsdWRlIGRpcmVjdG9yaWVzLCAKLWxpbmsgcGF0aCwgbGlicmFyaWVzIGFuZCB0aGUgbGlrZS4KLQotVGhpcyBtb2R1bGUgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMuCi0KLVxiZWdpbntmdW5jZGVzY317Z2VuX2xpYl9vcHRpb25zfXtjb21waWxlciwgbGlicmFyeV9kaXJzLCBydW50aW1lX2xpYnJhcnlfZGlycywgbGlicmFyaWVzfQotR2VuZXJhdGUgbGlua2VyIG9wdGlvbnMgZm9yIHNlYXJjaGluZyBsaWJyYXJ5IGRpcmVjdG9yaWVzIGFuZAotbGlua2luZyB3aXRoIHNwZWNpZmljIGxpYnJhcmllcy4gIFx2YXJ7bGlicmFyaWVzfSBhbmQgXHZhcntsaWJyYXJ5X2RpcnN9IGFyZSwKLXJlc3BlY3RpdmVseSwgbGlzdHMgb2YgbGlicmFyeSBuYW1lcyAobm90IGZpbGVuYW1lcyEpIGFuZCBzZWFyY2gKLWRpcmVjdG9yaWVzLiAgUmV0dXJucyBhIGxpc3Qgb2YgY29tbWFuZC1saW5lIG9wdGlvbnMgc3VpdGFibGUgZm9yIHVzZQotd2l0aCBzb21lIGNvbXBpbGVyIChkZXBlbmRpbmcgb24gdGhlIHR3byBmb3JtYXQgc3RyaW5ncyBwYXNzZWQgaW4pLgotXGVuZHtmdW5jZGVzY30KLSAgICAKLVxiZWdpbntmdW5jZGVzY317Z2VuX3ByZXByb2Nlc3Nfb3B0aW9uc317bWFjcm9zLCBpbmNsdWRlX2RpcnN9Ci1HZW5lcmF0ZSBDIHByZS1wcm9jZXNzb3Igb3B0aW9ucyAoXHByb2dyYW1vcHR7LUR9LCBccHJvZ3JhbW9wdHstVX0sCi1ccHJvZ3JhbW9wdHstSX0pIGFzIHVzZWQgYnkgYXQgbGVhc3QKLXR3byB0eXBlcyBvZiBjb21waWxlcnM6IHRoZSB0eXBpY2FsIFxVTklYe30gY29tcGlsZXIgYW5kIFZpc3VhbCBcQ3BwLgotXHZhcnttYWNyb3N9IGlzIHRoZSB1c3VhbCB0aGluZywgYSBsaXN0IG9mIDEtIG9yIDItdHVwbGVzLCB3aGVyZQotXGNvZGV7KFx2YXJ7bmFtZX0sKX0gbWVhbnMgdW5kZWZpbmUgKFxwcm9ncmFtb3B0ey1VfSkgbWFjcm8gXHZhcntuYW1lfSwKLWFuZCBcY29kZXsoXHZhcntuYW1lfSwgXHZhcnt2YWx1ZX0pfSBtZWFucyBkZWZpbmUgKFxwcm9ncmFtb3B0ey1EfSkKLW1hY3JvIFx2YXJ7bmFtZX0gdG8gXHZhcnt2YWx1ZX0uICBcdmFye2luY2x1ZGVfZGlyc30gaXMganVzdCBhIGxpc3Qgb2YKLWRpcmVjdG9yeSBuYW1lcyB0byBiZSBhZGRlZCB0byB0aGUgaGVhZGVyIGZpbGUgc2VhcmNoIHBhdGggKFxwcm9ncmFtb3B0ey1JfSkuCi1SZXR1cm5zIGEgbGlzdCBvZiBjb21tYW5kLWxpbmUgb3B0aW9ucyBzdWl0YWJsZSBmb3IgZWl0aGVyIFxVTklYe30gY29tcGlsZXJzCi1vciBWaXN1YWwgXENwcC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0X2RlZmF1bHRfY29tcGlsZXJ9e29zbmFtZSwgcGxhdGZvcm19Ci1EZXRlcm1pbmUgdGhlIGRlZmF1bHQgY29tcGlsZXIgdG8gdXNlIGZvciB0aGUgZ2l2ZW4gcGxhdGZvcm0uCi0gICAgCi1cdmFye29zbmFtZX0gc2hvdWxkIGJlIG9uZSBvZiB0aGUgc3RhbmRhcmQgUHl0aG9uIE9TIG5hbWVzIChpLmUuXCB0aGUKLW9uZXMgcmV0dXJuZWQgYnkgXGNvZGV7b3MubmFtZX0pIGFuZCBcdmFye3BsYXRmb3JtfSB0aGUgY29tbW9uIHZhbHVlCi1yZXR1cm5lZCBieSBcY29kZXtzeXMucGxhdGZvcm19IGZvciB0aGUgcGxhdGZvcm0gaW4gcXVlc3Rpb24uCi0gICAgCi1UaGUgZGVmYXVsdCB2YWx1ZXMgYXJlIFxjb2Rle29zLm5hbWV9IGFuZCBcY29kZXtzeXMucGxhdGZvcm19IGluIGNhc2UgdGhlCi1wYXJhbWV0ZXJzIGFyZSBub3QgZ2l2ZW4uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e25ld19jb21waWxlcn17cGxhdD1cY29kZXtOb25lfSwgY29tcGlsZXI9XGNvZGV7Tm9uZX0sIHZlcmJvc2U9XGNvZGV7MH0sIGRyeV9ydW49XGNvZGV7MH0sIGZvcmNlPVxjb2RlezB9fQotRmFjdG9yeSBmdW5jdGlvbiB0byBnZW5lcmF0ZSBhbiBpbnN0YW5jZSBvZiBzb21lIENDb21waWxlciBzdWJjbGFzcwotZm9yIHRoZSBzdXBwbGllZCBwbGF0Zm9ybS9jb21waWxlciBjb21iaW5hdGlvbi4gXHZhcntwbGF0fSBkZWZhdWx0cwotdG8gXGNvZGV7b3MubmFtZX0gKGVnLiBcY29kZXsncG9zaXgnfSwgXGNvZGV7J250J30pLCBhbmQgXHZhcntjb21waWxlcn0gCi1kZWZhdWx0cyB0byB0aGUgZGVmYXVsdCBjb21waWxlciBmb3IgdGhhdCBwbGF0Zm9ybS4gQ3VycmVudGx5IG9ubHkKLVxjb2Rleydwb3NpeCd9IGFuZCBcY29kZXsnbnQnfSBhcmUgc3VwcG9ydGVkLCBhbmQgdGhlIGRlZmF1bHQKLWNvbXBpbGVycyBhcmUgYGB0cmFkaXRpb25hbCBcVU5JWHt9IGludGVyZmFjZScnIChcY2xhc3N7VW5peENDb21waWxlcn0KLWNsYXNzKSBhbmQgVmlzdWFsIFxDcHAgKFxjbGFzc3tNU1ZDQ29tcGlsZXJ9IGNsYXNzKS4gIE5vdGUgdGhhdCBpdCdzCi1wZXJmZWN0bHkgcG9zc2libGUgdG8gYXNrIGZvciBhIFxVTklYe30gY29tcGlsZXIgb2JqZWN0IHVuZGVyIFdpbmRvd3MsCi1hbmQgYSBNaWNyb3NvZnQgY29tcGlsZXIgb2JqZWN0IHVuZGVyIFxVTklYLS0taWYgeW91IHN1cHBseSBhIHZhbHVlCi1mb3IgXHZhcntjb21waWxlcn0sIFx2YXJ7cGxhdH0gaXMgaWdub3JlZC4KLSUgSXMgdGhlIHBvc2l4L250IG9ubHkgdGhpbmcgc3RpbGwgdHJ1ZT8gTWFjIE9TIFggc2VlbXMgdG8gd29yaywgYW5kCi0lIHJldHVybnMgYSBVbml4Q0NvbXBpbGVyIGluc3RhbmNlLiBIb3cgdG8gZG9jdW1lbnQgdGhpcy4uLiBobW0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3Nob3dfY29tcGlsZXJzfXt9Ci1QcmludCBsaXN0IG9mIGF2YWlsYWJsZSBjb21waWxlcnMgKHVzZWQgYnkgdGhlCi1cbG9uZ3Byb2dyYW1vcHR7aGVscC1jb21waWxlcn0gb3B0aW9ucyB0byBcY29tbWFuZHtidWlsZH0sCi1cY29tbWFuZHtidWlsZF9leHR9LCBcY29tbWFuZHtidWlsZF9jbGlifSkuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtDQ29tcGlsZXJ9e1xvcHRpb25hbHt2ZXJib3NlPVxjb2RlezB9LCBkcnlfcnVuPVxjb2RlezB9LCBmb3JjZT1cY29kZXswfX19Ci0KLVRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIFxjbGFzc3tDQ29tcGlsZXJ9IGRlZmluZXMgdGhlIGludGVyZmFjZSB0aGF0IAotbXVzdCBiZSBpbXBsZW1lbnRlZCBieSByZWFsIGNvbXBpbGVyIGNsYXNzZXMuICBUaGUgY2xhc3MgYWxzbyBoYXMgCi1zb21lIHV0aWxpdHkgbWV0aG9kcyB1c2VkIGJ5IHNldmVyYWwgY29tcGlsZXIgY2xhc3Nlcy4KLQotVGhlIGJhc2ljIGlkZWEgYmVoaW5kIGEgY29tcGlsZXIgYWJzdHJhY3Rpb24gY2xhc3MgaXMgdGhhdCBlYWNoCi1pbnN0YW5jZSBjYW4gYmUgdXNlZCBmb3IgYWxsIHRoZSBjb21waWxlL2xpbmsgc3RlcHMgaW4gYnVpbGRpbmcgYQotc2luZ2xlIHByb2plY3QuICBUaHVzLCBhdHRyaWJ1dGVzIGNvbW1vbiB0byBhbGwgb2YgdGhvc2UgY29tcGlsZSBhbmQKLWxpbmsgc3RlcHMgLS0tIGluY2x1ZGUgZGlyZWN0b3JpZXMsIG1hY3JvcyB0byBkZWZpbmUsIGxpYnJhcmllcyB0byBsaW5rCi1hZ2FpbnN0LCBldGMuIC0tLSBhcmUgYXR0cmlidXRlcyBvZiB0aGUgY29tcGlsZXIgaW5zdGFuY2UuICBUbyBhbGxvdyBmb3IKLXZhcmlhYmlsaXR5IGluIGhvdyBpbmRpdmlkdWFsIGZpbGVzIGFyZSB0cmVhdGVkLCBtb3N0IG9mIHRob3NlCi1hdHRyaWJ1dGVzIG1heSBiZSB2YXJpZWQgb24gYSBwZXItY29tcGlsYXRpb24gb3IgcGVyLWxpbmsgYmFzaXMuCi0KLVRoZSBjb25zdHJ1Y3RvciBmb3IgZWFjaCBzdWJjbGFzcyBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBDb21waWxlcgotb2JqZWN0LiBGbGFncyBhcmUgXHZhcnt2ZXJib3NlfSAoc2hvdyB2ZXJib3NlIG91dHB1dCksIFx2YXJ7ZHJ5X3J1bn0KLShkb24ndCBhY3R1YWxseSBleGVjdXRlIHRoZSBzdGVwcykgYW5kIFx2YXJ7Zm9yY2V9IChyZWJ1aWxkCi1ldmVyeXRoaW5nLCByZWdhcmRsZXNzIG9mIGRlcGVuZGVuY2llcykuIEFsbCBvZiB0aGVzZSBmbGFncyBkZWZhdWx0IHRvCi1cY29kZXswfSAob2ZmKS4gTm90ZSB0aGF0IHlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGluc3RhbnRpYXRlCi1cY2xhc3N7Q0NvbXBpbGVyfSBvciBvbmUgb2YgaXRzIHN1YmNsYXNzZXMgZGlyZWN0bHkgLSB1c2UgdGhlCi1cZnVuY3Rpb257ZGlzdHV0aWxzLkNDb21waWxlci5uZXdfY29tcGlsZXIoKX0gZmFjdG9yeSBmdW5jdGlvbgotaW5zdGVhZC4KLQotVGhlIGZvbGxvd2luZyBtZXRob2RzIGFsbG93IHlvdSB0byBtYW51YWxseSBhbHRlciBjb21waWxlciBvcHRpb25zIGZvciAKLXRoZSBpbnN0YW5jZSBvZiB0aGUgQ29tcGlsZXIgY2xhc3MuCi0KLVxiZWdpbnttZXRob2RkZXNjfXthZGRfaW5jbHVkZV9kaXJ9e2Rpcn0KLUFkZCBcdmFye2Rpcn0gdG8gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdGhhdCB3aWxsIGJlIHNlYXJjaGVkIGZvcgotaGVhZGVyIGZpbGVzLiAgVGhlIGNvbXBpbGVyIGlzIGluc3RydWN0ZWQgdG8gc2VhcmNoIGRpcmVjdG9yaWVzIGluCi10aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgc3VwcGxpZWQgYnkgc3VjY2Vzc2l2ZSBjYWxscyB0bwotXG1ldGhvZHthZGRfaW5jbHVkZV9kaXIoKX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtzZXRfaW5jbHVkZV9kaXJzfXtkaXJzfQotU2V0IHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIHRoYXQgd2lsbCBiZSBzZWFyY2hlZCB0byBcdmFye2RpcnN9IChhCi1saXN0IG9mIHN0cmluZ3MpLiAgT3ZlcnJpZGVzIGFueSBwcmVjZWRpbmcgY2FsbHMgdG8KLVxtZXRob2R7YWRkX2luY2x1ZGVfZGlyKCl9OyBzdWJzZXF1ZW50IGNhbGxzIHRvCi1cbWV0aG9ke2FkZF9pbmNsdWRlX2RpcigpfSBhZGQgdG8gdGhlIGxpc3QgcGFzc2VkIHRvCi1cbWV0aG9ke3NldF9pbmNsdWRlX2RpcnMoKX0uICBUaGlzIGRvZXMgbm90IGFmZmVjdCBhbnkgbGlzdCBvZgotc3RhbmRhcmQgaW5jbHVkZSBkaXJlY3RvcmllcyB0aGF0IHRoZSBjb21waWxlciBtYXkgc2VhcmNoIGJ5IGRlZmF1bHQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXthZGRfbGlicmFyeX17bGlibmFtZX0KLQotQWRkIFx2YXJ7bGlibmFtZX0gdG8gdGhlIGxpc3Qgb2YgbGlicmFyaWVzIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbgotYWxsIGxpbmtzIGRyaXZlbiBieSB0aGlzIGNvbXBpbGVyIG9iamVjdC4gIE5vdGUgdGhhdCBcdmFye2xpYm5hbWV9Ci1zaG91bGQgKm5vdCogYmUgdGhlIG5hbWUgb2YgYSBmaWxlIGNvbnRhaW5pbmcgYSBsaWJyYXJ5LCBidXQgdGhlCi1uYW1lIG9mIHRoZSBsaWJyYXJ5IGl0c2VsZjogdGhlIGFjdHVhbCBmaWxlbmFtZSB3aWxsIGJlIGluZmVycmVkIGJ5Ci10aGUgbGlua2VyLCB0aGUgY29tcGlsZXIsIG9yIHRoZSBjb21waWxlciBjbGFzcyAoZGVwZW5kaW5nIG9uIHRoZQotcGxhdGZvcm0pLgotICAgIAotVGhlIGxpbmtlciB3aWxsIGJlIGluc3RydWN0ZWQgdG8gbGluayBhZ2FpbnN0IGxpYnJhcmllcyBpbiB0aGUKLW9yZGVyIHRoZXkgd2VyZSBzdXBwbGllZCB0byBcbWV0aG9ke2FkZF9saWJyYXJ5KCl9IGFuZC9vcgotXG1ldGhvZHtzZXRfbGlicmFyaWVzKCl9LiAgSXQgaXMgcGVyZmVjdGx5IHZhbGlkIHRvIGR1cGxpY2F0ZSBsaWJyYXJ5Ci1uYW1lczsgdGhlIGxpbmtlciB3aWxsIGJlIGluc3RydWN0ZWQgdG8gbGluayBhZ2FpbnN0IGxpYnJhcmllcyBhcwotbWFueSB0aW1lcyBhcyB0aGV5IGFyZSBtZW50aW9uZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtzZXRfbGlicmFyaWVzfXtsaWJuYW1lc30KLVNldCB0aGUgbGlzdCBvZiBsaWJyYXJpZXMgdG8gYmUgaW5jbHVkZWQgaW4gYWxsIGxpbmtzIGRyaXZlbiBieQotdGhpcyBjb21waWxlciBvYmplY3QgdG8gXHZhcntsaWJuYW1lc30gKGEgbGlzdCBvZiBzdHJpbmdzKS4gIFRoaXMgZG9lcwotbm90IGFmZmVjdCBhbnkgc3RhbmRhcmQgc3lzdGVtIGxpYnJhcmllcyB0aGF0IHRoZSBsaW5rZXIgbWF5Ci1pbmNsdWRlIGJ5IGRlZmF1bHQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXthZGRfbGlicmFyeV9kaXJ9e2Rpcn0KLUFkZCBcdmFye2Rpcn0gdG8gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdGhhdCB3aWxsIGJlIHNlYXJjaGVkIGZvcgotbGlicmFyaWVzIHNwZWNpZmllZCB0byBcbWV0aG9ke2FkZF9saWJyYXJ5KCl9IGFuZAotXG1ldGhvZHtzZXRfbGlicmFyaWVzKCl9LiAgVGhlIGxpbmtlciB3aWxsIGJlIGluc3RydWN0ZWQgdG8gc2VhcmNoIGZvcgotbGlicmFyaWVzIGluIHRoZSBvcmRlciB0aGV5IGFyZSBzdXBwbGllZCB0byBcbWV0aG9ke2FkZF9saWJyYXJ5X2RpcigpfQotYW5kL29yIFxtZXRob2R7c2V0X2xpYnJhcnlfZGlycygpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3NldF9saWJyYXJ5X2RpcnN9e2RpcnN9Ci1TZXQgdGhlIGxpc3Qgb2YgbGlicmFyeSBzZWFyY2ggZGlyZWN0b3JpZXMgdG8gXHZhcntkaXJzfSAoYSBsaXN0IG9mCi1zdHJpbmdzKS4gIFRoaXMgZG9lcyBub3QgYWZmZWN0IGFueSBzdGFuZGFyZCBsaWJyYXJ5IHNlYXJjaCBwYXRoCi10aGF0IHRoZSBsaW5rZXIgbWF5IHNlYXJjaCBieSBkZWZhdWx0LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317YWRkX3J1bnRpbWVfbGlicmFyeV9kaXJ9e2Rpcn0KLUFkZCBcdmFye2Rpcn0gdG8gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdGhhdCB3aWxsIGJlIHNlYXJjaGVkIGZvcgotc2hhcmVkIGxpYnJhcmllcyBhdCBydW50aW1lLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317c2V0X3J1bnRpbWVfbGlicmFyeV9kaXJzfXtkaXJzfQotU2V0IHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIHRvIHNlYXJjaCBmb3Igc2hhcmVkIGxpYnJhcmllcyBhdAotcnVudGltZSB0byBcdmFye2RpcnN9IChhIGxpc3Qgb2Ygc3RyaW5ncykuICBUaGlzIGRvZXMgbm90IGFmZmVjdCBhbnkKLXN0YW5kYXJkIHNlYXJjaCBwYXRoIHRoYXQgdGhlIHJ1bnRpbWUgbGlua2VyIG1heSBzZWFyY2ggYnkKLWRlZmF1bHQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtkZWZpbmVfbWFjcm99e25hbWVcb3B0aW9uYWx7LCB2YWx1ZT1cY29kZXtOb25lfX19Ci1EZWZpbmUgYSBwcmVwcm9jZXNzb3IgbWFjcm8gZm9yIGFsbCBjb21waWxhdGlvbnMgZHJpdmVuIGJ5IHRoaXMKLWNvbXBpbGVyIG9iamVjdC4gIFRoZSBvcHRpb25hbCBwYXJhbWV0ZXIgXHZhcnt2YWx1ZX0gc2hvdWxkIGJlIGEKLXN0cmluZzsgaWYgaXQgaXMgbm90IHN1cHBsaWVkLCB0aGVuIHRoZSBtYWNybyB3aWxsIGJlIGRlZmluZWQKLXdpdGhvdXQgYW4gZXhwbGljaXQgdmFsdWUgYW5kIHRoZSBleGFjdCBvdXRjb21lIGRlcGVuZHMgb24gdGhlCi1jb21waWxlciB1c2VkIChYWFggdHJ1ZT8gZG9lcyBBTlNJIHNheSBhbnl0aGluZyBhYm91dCB0aGlzPykKLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3VuZGVmaW5lX21hY3JvfXtuYW1lfQotVW5kZWZpbmUgYSBwcmVwcm9jZXNzb3IgbWFjcm8gZm9yIGFsbCBjb21waWxhdGlvbnMgZHJpdmVuIGJ5Ci10aGlzIGNvbXBpbGVyIG9iamVjdC4gIElmIHRoZSBzYW1lIG1hY3JvIGlzIGRlZmluZWQgYnkKLVxtZXRob2R7ZGVmaW5lX21hY3JvKCl9IGFuZCB1bmRlZmluZWQgYnkgXG1ldGhvZHt1bmRlZmluZV9tYWNybygpfSAKLXRoZSBsYXN0IGNhbGwgdGFrZXMgcHJlY2VkZW5jZSAoaW5jbHVkaW5nIG11bHRpcGxlIHJlZGVmaW5pdGlvbnMgb3IKLXVuZGVmaW5pdGlvbnMpLiAgSWYgdGhlIG1hY3JvIGlzIHJlZGVmaW5lZC91bmRlZmluZWQgb24gYQotcGVyLWNvbXBpbGF0aW9uIGJhc2lzIChpZS4gaW4gdGhlIGNhbGwgdG8gXG1ldGhvZHtjb21waWxlKCl9KSwgdGhlbiB0aGF0Ci10YWtlcyBwcmVjZWRlbmNlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317YWRkX2xpbmtfb2JqZWN0fXtvYmplY3R9Ci1BZGQgXHZhcntvYmplY3R9IHRvIHRoZSBsaXN0IG9mIG9iamVjdCBmaWxlcyAob3IgYW5hbG9ndWVzLCBzdWNoIGFzCi1leHBsaWNpdGx5IG5hbWVkIGxpYnJhcnkgZmlsZXMgb3IgdGhlIG91dHB1dCBvZiBgYHJlc291cmNlCi1jb21waWxlcnMnJykgdG8gYmUgaW5jbHVkZWQgaW4gZXZlcnkgbGluayBkcml2ZW4gYnkgdGhpcyBjb21waWxlcgotb2JqZWN0LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317c2V0X2xpbmtfb2JqZWN0c317b2JqZWN0c30KLVNldCB0aGUgbGlzdCBvZiBvYmplY3QgZmlsZXMgKG9yIGFuYWxvZ3VlcykgdG8gYmUgaW5jbHVkZWQgaW4KLWV2ZXJ5IGxpbmsgdG8gXHZhcntvYmplY3RzfS4gIFRoaXMgZG9lcyBub3QgYWZmZWN0IGFueSBzdGFuZGFyZCBvYmplY3QKLWZpbGVzIHRoYXQgdGhlIGxpbmtlciBtYXkgaW5jbHVkZSBieSBkZWZhdWx0IChzdWNoIGFzIHN5c3RlbQotbGlicmFyaWVzKS4KLVxlbmR7bWV0aG9kZGVzY30KLQotVGhlIGZvbGxvd2luZyBtZXRob2RzIGltcGxlbWVudCBtZXRob2RzIGZvciBhdXRvZGV0ZWN0aW9uIG9mIGNvbXBpbGVyIAotb3B0aW9ucywgcHJvdmlkaW5nIHNvbWUgZnVuY3Rpb25hbGl0eSBzaW1pbGFyIHRvIEdOVSBccHJvZ3JhbXthdXRvY29uZn0uCi0KLVxiZWdpbnttZXRob2RkZXNjfXtkZXRlY3RfbGFuZ3VhZ2V9e3NvdXJjZXN9Ci1EZXRlY3QgdGhlIGxhbmd1YWdlIG9mIGEgZ2l2ZW4gZmlsZSwgb3IgbGlzdCBvZiBmaWxlcy4gVXNlcyB0aGUgCi1pbnN0YW5jZSBhdHRyaWJ1dGVzIFxtZW1iZXJ7bGFuZ3VhZ2VfbWFwfSAoYSBkaWN0aW9uYXJ5KSwgYW5kIAotXG1lbWJlcntsYW5ndWFnZV9vcmRlcn0gKGEgbGlzdCkgdG8gZG8gdGhlIGpvYi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2ZpbmRfbGlicmFyeV9maWxlfXtkaXJzLCBsaWJcb3B0aW9uYWx7LCBkZWJ1Zz1cY29kZXswfX19Ci1TZWFyY2ggdGhlIHNwZWNpZmllZCBsaXN0IG9mIGRpcmVjdG9yaWVzIGZvciBhIHN0YXRpYyBvciBzaGFyZWQKLWxpYnJhcnkgZmlsZSBcdmFye2xpYn0gYW5kIHJldHVybiB0aGUgZnVsbCBwYXRoIHRvIHRoYXQgZmlsZS4gIElmCi1cdmFye2RlYnVnfSBpcyB0cnVlLCBsb29rIGZvciBhIGRlYnVnZ2luZyB2ZXJzaW9uIChpZiB0aGF0IG1ha2VzIHNlbnNlIG9uCi10aGUgY3VycmVudCBwbGF0Zm9ybSkuICBSZXR1cm4gXGNvZGV7Tm9uZX0gaWYgXHZhcntsaWJ9IHdhc24ndCBmb3VuZCBpbiBhbnkgb2YKLXRoZSBzcGVjaWZpZWQgZGlyZWN0b3JpZXMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtoYXNfZnVuY3Rpb259e2Z1bmNuYW1lIFxvcHRpb25hbHssIGluY2x1ZGVzPVxjb2Rle05vbmV9LCBpbmNsdWRlX2RpcnM9XGNvZGV7Tm9uZX0sIGxpYnJhcmllcz1cY29kZXtOb25lfSwgbGlicmFyeV9kaXJzPVxjb2Rle05vbmV9fX0KLVJldHVybiBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIFx2YXJ7ZnVuY25hbWV9IGlzIHN1cHBvcnRlZCBvbgotdGhlIGN1cnJlbnQgcGxhdGZvcm0uICBUaGUgb3B0aW9uYWwgYXJndW1lbnRzIGNhbiBiZSB1c2VkIHRvCi1hdWdtZW50IHRoZSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBieSBwcm92aWRpbmcgYWRkaXRpb25hbCBpbmNsdWRlCi1maWxlcyBhbmQgcGF0aHMgYW5kIGxpYnJhcmllcyBhbmQgcGF0aHMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtsaWJyYXJ5X2Rpcl9vcHRpb259e2Rpcn0KLVJldHVybiB0aGUgY29tcGlsZXIgb3B0aW9uIHRvIGFkZCBcdmFye2Rpcn0gdG8gdGhlIGxpc3Qgb2YKLWRpcmVjdG9yaWVzIHNlYXJjaGVkIGZvciBsaWJyYXJpZXMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtsaWJyYXJ5X29wdGlvbn17bGlifQotUmV0dXJuIHRoZSBjb21waWxlciBvcHRpb24gdG8gYWRkIFx2YXJ7ZGlyfSB0byB0aGUgbGlzdCBvZiBsaWJyYXJpZXMKLWxpbmtlZCBpbnRvIHRoZSBzaGFyZWQgbGlicmFyeSBvciBleGVjdXRhYmxlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317cnVudGltZV9saWJyYXJ5X2Rpcl9vcHRpb259e2Rpcn0KLVJldHVybiB0aGUgY29tcGlsZXIgb3B0aW9uIHRvIGFkZCBcdmFye2Rpcn0gdG8gdGhlIGxpc3Qgb2YKLWRpcmVjdG9yaWVzIHNlYXJjaGVkIGZvciBydW50aW1lIGxpYnJhcmllcy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3NldF9leGVjdXRhYmxlc317KiphcmdzfQotRGVmaW5lIHRoZSBleGVjdXRhYmxlcyAoYW5kIG9wdGlvbnMgZm9yIHRoZW0pIHRoYXQgd2lsbCBiZSBydW4KLXRvIHBlcmZvcm0gdGhlIHZhcmlvdXMgc3RhZ2VzIG9mIGNvbXBpbGF0aW9uLiAgVGhlIGV4YWN0IHNldCBvZgotZXhlY3V0YWJsZXMgdGhhdCBtYXkgYmUgc3BlY2lmaWVkIGhlcmUgZGVwZW5kcyBvbiB0aGUgY29tcGlsZXIKLWNsYXNzICh2aWEgdGhlICdleGVjdXRhYmxlcycgY2xhc3MgYXR0cmlidXRlKSwgYnV0IG1vc3Qgd2lsbCBoYXZlOgotCi1cYmVnaW57dGFibGVpaX17bHxsfXthdHRyaWJ1dGV9e2F0dHJpYnV0ZX17ZGVzY3JpcHRpb259Ci1cbGluZWlpe2NvbXBpbGVyfXt0aGUgQy9cQ3Bwe30gY29tcGlsZXJ9Ci1cbGluZWlpe2xpbmtlcl9zb317bGlua2VyIHVzZWQgdG8gY3JlYXRlIHNoYXJlZCBvYmplY3RzIGFuZCBsaWJyYXJpZXN9Ci1cbGluZWlpe2xpbmtlcl9leGV9e2xpbmtlciB1c2VkIHRvIGNyZWF0ZSBiaW5hcnkgZXhlY3V0YWJsZXN9Ci1cbGluZWlpe2FyY2hpdmVyfXtzdGF0aWMgbGlicmFyeSBjcmVhdG9yfQotXGVuZHt0YWJsZWlpfQotCi1PbiBwbGF0Zm9ybXMgd2l0aCBhIGNvbW1hbmQtbGluZSAoXFVOSVgsIERPUy9XaW5kb3dzKSwgZWFjaCBvZiB0aGVzZQotaXMgYSBzdHJpbmcgdGhhdCB3aWxsIGJlIHNwbGl0IGludG8gZXhlY3V0YWJsZSBuYW1lIGFuZCAob3B0aW9uYWwpCi1saXN0IG9mIGFyZ3VtZW50cy4gIChTcGxpdHRpbmcgdGhlIHN0cmluZyBpcyBkb25lIHNpbWlsYXJseSB0byBob3cKLVxVTklYe30gc2hlbGxzIG9wZXJhdGU6IHdvcmRzIGFyZSBkZWxpbWl0ZWQgYnkgc3BhY2VzLCBidXQgcXVvdGVzIGFuZAotYmFja3NsYXNoZXMgY2FuIG92ZXJyaWRlIHRoaXMuICBTZWUKLVxmdW5jdGlvbntkaXN0dXRpbHMudXRpbC5zcGxpdF9xdW90ZWQoKX0uKQotXGVuZHttZXRob2RkZXNjfQotCi1UaGUgZm9sbG93aW5nIG1ldGhvZHMgaW52b2tlIHN0YWdlcyBpbiB0aGUgYnVpbGQgcHJvY2Vzcy4KLQotXGJlZ2lue21ldGhvZGRlc2N9e2NvbXBpbGV9e3NvdXJjZXNcb3B0aW9uYWx7LCBvdXRwdXRfZGlyPVxjb2Rle05vbmV9LCBtYWNyb3M9XGNvZGV7Tm9uZX0sIGluY2x1ZGVfZGlycz1cY29kZXtOb25lfSwgZGVidWc9XGNvZGV7MH0sIGV4dHJhX3ByZWFyZ3M9XGNvZGV7Tm9uZX0sIGV4dHJhX3Bvc3RhcmdzPVxjb2Rle05vbmV9LCBkZXBlbmRzPVxjb2Rle05vbmV9fX0KLUNvbXBpbGUgb25lIG9yIG1vcmUgc291cmNlIGZpbGVzLiBHZW5lcmF0ZXMgb2JqZWN0IGZpbGVzIChlLmcuIAotdHJhbnNmb3JtcyBhIFxmaWxley5jfSBmaWxlIHRvIGEgXGZpbGV7Lm99IGZpbGUuKQotCi1cdmFye3NvdXJjZXN9IG11c3QgYmUgYSBsaXN0IG9mIGZpbGVuYW1lcywgbW9zdCBsaWtlbHkgQy9cQ3BwCi1maWxlcywgYnV0IGluIHJlYWxpdHkgYW55dGhpbmcgdGhhdCBjYW4gYmUgaGFuZGxlZCBieSBhCi1wYXJ0aWN1bGFyIGNvbXBpbGVyIGFuZCBjb21waWxlciBjbGFzcyAoZWcuIFxjbGFzc3tNU1ZDQ29tcGlsZXJ9IGNhbgotaGFuZGxlIHJlc291cmNlIGZpbGVzIGluIFx2YXJ7c291cmNlc30pLiAgUmV0dXJuIGEgbGlzdCBvZiBvYmplY3QKLWZpbGVuYW1lcywgb25lIHBlciBzb3VyY2UgZmlsZW5hbWUgaW4gXHZhcntzb3VyY2VzfS4gIERlcGVuZGluZyBvbgotdGhlIGltcGxlbWVudGF0aW9uLCBub3QgYWxsIHNvdXJjZSBmaWxlcyB3aWxsIG5lY2Vzc2FyaWx5IGJlCi1jb21waWxlZCwgYnV0IGFsbCBjb3JyZXNwb25kaW5nIG9iamVjdCBmaWxlbmFtZXMgd2lsbCBiZQotcmV0dXJuZWQuCi0KLUlmIFx2YXJ7b3V0cHV0X2Rpcn0gaXMgZ2l2ZW4sIG9iamVjdCBmaWxlcyB3aWxsIGJlIHB1dCB1bmRlciBpdCwgd2hpbGUKLXJldGFpbmluZyB0aGVpciBvcmlnaW5hbCBwYXRoIGNvbXBvbmVudC4gIFRoYXQgaXMsIFxmaWxle2Zvby9iYXIuY30KLW5vcm1hbGx5IGNvbXBpbGVzIHRvIFxmaWxle2Zvby9iYXIub30gKGZvciBhIFxVTklYe30gaW1wbGVtZW50YXRpb24pOyBpZgotXHZhcntvdXRwdXRfZGlyfSBpcyBcdmFye2J1aWxkfSwgdGhlbiBpdCB3b3VsZCBjb21waWxlIHRvCi1cZmlsZXtidWlsZC9mb28vYmFyLm99LgotCi1cdmFye21hY3Jvc30sIGlmIGdpdmVuLCBtdXN0IGJlIGEgbGlzdCBvZiBtYWNybyBkZWZpbml0aW9ucy4gIEEgbWFjcm8KLWRlZmluaXRpb24gaXMgZWl0aGVyIGEgXGNvZGV7KFx2YXJ7bmFtZX0sIFx2YXJ7dmFsdWV9KX0gMi10dXBsZSBvciBhCi1cY29kZXsoXHZhcntuYW1lfSwpfSAxLXR1cGxlLgotVGhlIGZvcm1lciBkZWZpbmVzIGEgbWFjcm87IGlmIHRoZSB2YWx1ZSBpcyBcY29kZXtOb25lfSwgdGhlIG1hY3JvIGlzCi1kZWZpbmVkIHdpdGhvdXQgYW4gZXhwbGljaXQgdmFsdWUuICBUaGUgMS10dXBsZSBjYXNlIHVuZGVmaW5lcyBhCi1tYWNyby4gIExhdGVyIGRlZmluaXRpb25zL3JlZGVmaW5pdGlvbnMvdW5kZWZpbml0aW9ucyB0YWtlCi1wcmVjZWRlbmNlLgotCi1cdmFye2luY2x1ZGVfZGlyc30sIGlmIGdpdmVuLCBtdXN0IGJlIGEgbGlzdCBvZiBzdHJpbmdzLCB0aGUKLWRpcmVjdG9yaWVzIHRvIGFkZCB0byB0aGUgZGVmYXVsdCBpbmNsdWRlIGZpbGUgc2VhcmNoIHBhdGggZm9yIHRoaXMKLWNvbXBpbGF0aW9uIG9ubHkuCi0KLVx2YXJ7ZGVidWd9IGlzIGEgYm9vbGVhbjsgaWYgdHJ1ZSwgdGhlIGNvbXBpbGVyIHdpbGwgYmUgaW5zdHJ1Y3RlZCB0bwotb3V0cHV0IGRlYnVnIHN5bWJvbHMgaW4gKG9yIGFsb25nc2lkZSkgdGhlIG9iamVjdCBmaWxlKHMpLgotCi1cdmFye2V4dHJhX3ByZWFyZ3N9IGFuZCBcdmFye2V4dHJhX3Bvc3RhcmdzfSBhcmUgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50LgotT24gcGxhdGZvcm1zIHRoYXQgaGF2ZSB0aGUgbm90aW9uIG9mIGEgY29tbWFuZC1saW5lIChlLmcuIFxVTklYLAotRE9TL1dpbmRvd3MpLCB0aGV5IGFyZSBtb3N0IGxpa2VseSBsaXN0cyBvZiBzdHJpbmdzOiBleHRyYQotY29tbWFuZC1saW5lIGFyZ3VtZW50cyB0byBwcmVwZW5kL2FwcGVuZCB0byB0aGUgY29tcGlsZXIgY29tbWFuZAotbGluZS4gIE9uIG90aGVyIHBsYXRmb3JtcywgY29uc3VsdCB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MKLWRvY3VtZW50YXRpb24uICBJbiBhbnkgZXZlbnQsIHRoZXkgYXJlIGludGVuZGVkIGFzIGFuIGVzY2FwZSBoYXRjaAotZm9yIHRob3NlIG9jY2FzaW9ucyB3aGVuIHRoZSBhYnN0cmFjdCBjb21waWxlciBmcmFtZXdvcmsgZG9lc24ndAotY3V0IHRoZSBtdXN0YXJkLgotCi1cdmFye2RlcGVuZHN9LCBpZiBnaXZlbiwgaXMgYSBsaXN0IG9mIGZpbGVuYW1lcyB0aGF0IGFsbCB0YXJnZXRzCi1kZXBlbmQgb24uICBJZiBhIHNvdXJjZSBmaWxlIGlzIG9sZGVyIHRoYW4gYW55IGZpbGUgaW4KLWRlcGVuZHMsIHRoZW4gdGhlIHNvdXJjZSBmaWxlIHdpbGwgYmUgcmVjb21waWxlZC4gIFRoaXMKLXN1cHBvcnRzIGRlcGVuZGVuY3kgdHJhY2tpbmcsIGJ1dCBvbmx5IGF0IGEgY29hcnNlCi1ncmFudWxhcml0eS4KLQotUmFpc2VzIFxleGNlcHRpb257Q29tcGlsZUVycm9yfSBvbiBmYWlsdXJlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Y3JlYXRlX3N0YXRpY19saWJ9e29iamVjdHMsIG91dHB1dF9saWJuYW1lXG9wdGlvbmFseywgb3V0cHV0X2Rpcj1cY29kZXtOb25lfSwgZGVidWc9XGNvZGV7MH0sIHRhcmdldF9sYW5nPVxjb2Rle05vbmV9fX0KLUxpbmsgYSBidW5jaCBvZiBzdHVmZiB0b2dldGhlciB0byBjcmVhdGUgYSBzdGF0aWMgbGlicmFyeSBmaWxlLgotVGhlIGBgYnVuY2ggb2Ygc3R1ZmYnJyBjb25zaXN0cyBvZiB0aGUgbGlzdCBvZiBvYmplY3QgZmlsZXMgc3VwcGxpZWQKLWFzIFx2YXJ7b2JqZWN0c30sIHRoZSBleHRyYSBvYmplY3QgZmlsZXMgc3VwcGxpZWQgdG8KLVxtZXRob2R7YWRkX2xpbmtfb2JqZWN0KCl9IGFuZC9vciBcbWV0aG9ke3NldF9saW5rX29iamVjdHMoKX0sIHRoZSBsaWJyYXJpZXMKLXN1cHBsaWVkIHRvIFxtZXRob2R7YWRkX2xpYnJhcnkoKX0gYW5kL29yIFxtZXRob2R7c2V0X2xpYnJhcmllcygpfSwgYW5kIHRoZQotbGlicmFyaWVzIHN1cHBsaWVkIGFzIFx2YXJ7bGlicmFyaWVzfSAoaWYgYW55KS4KLQotXHZhcntvdXRwdXRfbGlibmFtZX0gc2hvdWxkIGJlIGEgbGlicmFyeSBuYW1lLCBub3QgYSBmaWxlbmFtZTsgdGhlCi1maWxlbmFtZSB3aWxsIGJlIGluZmVycmVkIGZyb20gdGhlIGxpYnJhcnkgbmFtZS4gIFx2YXJ7b3V0cHV0X2Rpcn0gaXMKLXRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGxpYnJhcnkgZmlsZSB3aWxsIGJlIHB1dC4gWFhYIGRlZmF1bHRzIHRvIHdoYXQ/Ci0KLVx2YXJ7ZGVidWd9IGlzIGEgYm9vbGVhbjsgaWYgdHJ1ZSwgZGVidWdnaW5nIGluZm9ybWF0aW9uIHdpbGwgYmUKLWluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5IChub3RlIHRoYXQgb24gbW9zdCBwbGF0Zm9ybXMsIGl0IGlzIHRoZQotY29tcGlsZSBzdGVwIHdoZXJlIHRoaXMgbWF0dGVyczogdGhlIFx2YXJ7ZGVidWd9IGZsYWcgaXMgaW5jbHVkZWQgaGVyZQotanVzdCBmb3IgY29uc2lzdGVuY3kpLgotCi1cdmFye3RhcmdldF9sYW5nfSBpcyB0aGUgdGFyZ2V0IGxhbmd1YWdlIGZvciB3aGljaCB0aGUgZ2l2ZW4gb2JqZWN0cwotYXJlIGJlaW5nIGNvbXBpbGVkLiBUaGlzIGFsbG93cyBzcGVjaWZpYyBsaW5rYWdlIHRpbWUgdHJlYXRtZW50IG9mCi1jZXJ0YWluIGxhbmd1YWdlcy4KLQotUmFpc2VzIFxleGNlcHRpb257TGliRXJyb3J9IG9uIGZhaWx1cmUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtsaW5rfXt0YXJnZXRfZGVzYywgb2JqZWN0cywgb3V0cHV0X2ZpbGVuYW1lXG9wdGlvbmFseywgb3V0cHV0X2Rpcj1cY29kZXtOb25lfSwgbGlicmFyaWVzPVxjb2Rle05vbmV9LCBsaWJyYXJ5X2RpcnM9XGNvZGV7Tm9uZX0sIHJ1bnRpbWVfbGlicmFyeV9kaXJzPVxjb2Rle05vbmV9LCBleHBvcnRfc3ltYm9scz1cY29kZXtOb25lfSwgZGVidWc9XGNvZGV7MH0sIGV4dHJhX3ByZWFyZ3M9XGNvZGV7Tm9uZX0sIGV4dHJhX3Bvc3RhcmdzPVxjb2Rle05vbmV9LCBidWlsZF90ZW1wPVxjb2Rle05vbmV9LCB0YXJnZXRfbGFuZz1cY29kZXtOb25lfX19Ci1MaW5rIGEgYnVuY2ggb2Ygc3R1ZmYgdG9nZXRoZXIgdG8gY3JlYXRlIGFuIGV4ZWN1dGFibGUgb3IKLXNoYXJlZCBsaWJyYXJ5IGZpbGUuCi0KLVRoZSBgYGJ1bmNoIG9mIHN0dWZmJycgY29uc2lzdHMgb2YgdGhlIGxpc3Qgb2Ygb2JqZWN0IGZpbGVzIHN1cHBsaWVkCi1hcyBcdmFye29iamVjdHN9LiAgXHZhcntvdXRwdXRfZmlsZW5hbWV9IHNob3VsZCBiZSBhIGZpbGVuYW1lLiAgSWYKLVx2YXJ7b3V0cHV0X2Rpcn0gaXMgc3VwcGxpZWQsIFx2YXJ7b3V0cHV0X2ZpbGVuYW1lfSBpcyByZWxhdGl2ZSB0byBpdAotKGkuZS4gXHZhcntvdXRwdXRfZmlsZW5hbWV9IGNhbiBwcm92aWRlIGRpcmVjdG9yeSBjb21wb25lbnRzIGlmCi1uZWVkZWQpLgotCi1cdmFye2xpYnJhcmllc30gaXMgYSBsaXN0IG9mIGxpYnJhcmllcyB0byBsaW5rIGFnYWluc3QuICBUaGVzZSBhcmUKLWxpYnJhcnkgbmFtZXMsIG5vdCBmaWxlbmFtZXMsIHNpbmNlIHRoZXkncmUgdHJhbnNsYXRlZCBpbnRvCi1maWxlbmFtZXMgaW4gYSBwbGF0Zm9ybS1zcGVjaWZpYyB3YXkgKGVnLiBcdmFye2Zvb30gYmVjb21lcyBcZmlsZXtsaWJmb28uYX0KLW9uIFxVTklYe30gYW5kIFxmaWxle2Zvby5saWJ9IG9uIERPUy9XaW5kb3dzKS4gIEhvd2V2ZXIsIHRoZXkgY2FuIGluY2x1ZGUgYQotZGlyZWN0b3J5IGNvbXBvbmVudCwgd2hpY2ggbWVhbnMgdGhlIGxpbmtlciB3aWxsIGxvb2sgaW4gdGhhdAotc3BlY2lmaWMgZGlyZWN0b3J5IHJhdGhlciB0aGFuIHNlYXJjaGluZyBhbGwgdGhlIG5vcm1hbCBsb2NhdGlvbnMuCi0KLVx2YXJ7bGlicmFyeV9kaXJzfSwgaWYgc3VwcGxpZWQsIHNob3VsZCBiZSBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdG8KLXNlYXJjaCBmb3IgbGlicmFyaWVzIHRoYXQgd2VyZSBzcGVjaWZpZWQgYXMgYmFyZSBsaWJyYXJ5IG5hbWVzCi0oaWUuIG5vIGRpcmVjdG9yeSBjb21wb25lbnQpLiAgVGhlc2UgYXJlIG9uIHRvcCBvZiB0aGUgc3lzdGVtCi1kZWZhdWx0IGFuZCB0aG9zZSBzdXBwbGllZCB0byBcbWV0aG9ke2FkZF9saWJyYXJ5X2RpcigpfSBhbmQvb3IKLVxtZXRob2R7c2V0X2xpYnJhcnlfZGlycygpfS4gIFx2YXJ7cnVudGltZV9saWJyYXJ5X2RpcnN9IGlzIGEgbGlzdCBvZgotZGlyZWN0b3JpZXMgdGhhdCB3aWxsIGJlIGVtYmVkZGVkIGludG8gdGhlIHNoYXJlZCBsaWJyYXJ5IGFuZCB1c2VkCi10byBzZWFyY2ggZm9yIG90aGVyIHNoYXJlZCBsaWJyYXJpZXMgdGhhdCAqaXQqIGRlcGVuZHMgb24gYXQKLXJ1bi10aW1lLiAgKFRoaXMgbWF5IG9ubHkgYmUgcmVsZXZhbnQgb24gXFVOSVguKQotCi1cdmFye2V4cG9ydF9zeW1ib2xzfSBpcyBhIGxpc3Qgb2Ygc3ltYm9scyB0aGF0IHRoZSBzaGFyZWQgbGlicmFyeSB3aWxsCi1leHBvcnQuICAoVGhpcyBhcHBlYXJzIHRvIGJlIHJlbGV2YW50IG9ubHkgb24gV2luZG93cy4pCi0KLVx2YXJ7ZGVidWd9IGlzIGFzIGZvciBcbWV0aG9ke2NvbXBpbGUoKX0gYW5kIFxtZXRob2R7Y3JlYXRlX3N0YXRpY19saWIoKX0sIAotd2l0aCB0aGUgc2xpZ2h0IGRpc3RpbmN0aW9uIHRoYXQgaXQgYWN0dWFsbHkgbWF0dGVycyBvbiBtb3N0IHBsYXRmb3JtcyAoYXMKLW9wcG9zZWQgdG8gXG1ldGhvZHtjcmVhdGVfc3RhdGljX2xpYigpfSwgd2hpY2ggaW5jbHVkZXMgYSBcdmFye2RlYnVnfSBmbGFnCi1tb3N0bHkgZm9yIGZvcm0ncyBzYWtlKS4KLQotXHZhcntleHRyYV9wcmVhcmdzfSBhbmQgXHZhcntleHRyYV9wb3N0YXJnc30gYXJlIGFzIGZvciBcbWV0aG9ke2NvbXBpbGUoKX0gCi0oZXhjZXB0IG9mIGNvdXJzZSB0aGF0IHRoZXkgc3VwcGx5IGNvbW1hbmQtbGluZSBhcmd1bWVudHMgZm9yIHRoZQotcGFydGljdWxhciBsaW5rZXIgYmVpbmcgdXNlZCkuCi0KLVx2YXJ7dGFyZ2V0X2xhbmd9IGlzIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgZm9yIHdoaWNoIHRoZSBnaXZlbiBvYmplY3RzCi1hcmUgYmVpbmcgY29tcGlsZWQuIFRoaXMgYWxsb3dzIHNwZWNpZmljIGxpbmthZ2UgdGltZSB0cmVhdG1lbnQgb2YKLWNlcnRhaW4gbGFuZ3VhZ2VzLgotCi1SYWlzZXMgXGV4Y2VwdGlvbntMaW5rRXJyb3J9IG9uIGZhaWx1cmUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtsaW5rX2V4ZWN1dGFibGV9e29iamVjdHMsIG91dHB1dF9wcm9nbmFtZVxvcHRpb25hbHssIG91dHB1dF9kaXI9XGNvZGV7Tm9uZX0sIGxpYnJhcmllcz1cY29kZXtOb25lfSwgbGlicmFyeV9kaXJzPVxjb2Rle05vbmV9LCBydW50aW1lX2xpYnJhcnlfZGlycz1cY29kZXtOb25lfSwgZGVidWc9XGNvZGV7MH0sIGV4dHJhX3ByZWFyZ3M9XGNvZGV7Tm9uZX0sIGV4dHJhX3Bvc3RhcmdzPVxjb2Rle05vbmV9LCB0YXJnZXRfbGFuZz1cY29kZXtOb25lfX19Ci1MaW5rIGFuIGV4ZWN1dGFibGUuIAotXHZhcntvdXRwdXRfcHJvZ25hbWV9IGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGV4ZWN1dGFibGUsCi13aGlsZSBcdmFye29iamVjdHN9IGFyZSBhIGxpc3Qgb2Ygb2JqZWN0IGZpbGVuYW1lcyB0byBsaW5rIGluLiBPdGhlciBhcmd1bWVudHMgCi1hcmUgYXMgZm9yIHRoZSBcbWV0aG9ke2xpbmt9IG1ldGhvZC4gCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtsaW5rX3NoYXJlZF9saWJ9e29iamVjdHMsIG91dHB1dF9saWJuYW1lXG9wdGlvbmFseywgb3V0cHV0X2Rpcj1cY29kZXtOb25lfSwgbGlicmFyaWVzPVxjb2Rle05vbmV9LCBsaWJyYXJ5X2RpcnM9XGNvZGV7Tm9uZX0sIHJ1bnRpbWVfbGlicmFyeV9kaXJzPVxjb2Rle05vbmV9LCBleHBvcnRfc3ltYm9scz1cY29kZXtOb25lfSwgZGVidWc9XGNvZGV7MH0sIGV4dHJhX3ByZWFyZ3M9XGNvZGV7Tm9uZX0sIGV4dHJhX3Bvc3RhcmdzPVxjb2Rle05vbmV9LCBidWlsZF90ZW1wPVxjb2Rle05vbmV9LCB0YXJnZXRfbGFuZz1cY29kZXtOb25lfX19Ci1MaW5rIGEgc2hhcmVkIGxpYnJhcnkuIFx2YXJ7b3V0cHV0X2xpYm5hbWV9IGlzIHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgCi1saWJyYXJ5LCB3aGlsZSBcdmFye29iamVjdHN9IGlzIGEgbGlzdCBvZiBvYmplY3QgZmlsZW5hbWVzIHRvIGxpbmsgaW4uIAotT3RoZXIgYXJndW1lbnRzIGFyZSBhcyBmb3IgdGhlIFxtZXRob2R7bGlua30gbWV0aG9kLiAKLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2xpbmtfc2hhcmVkX29iamVjdH17b2JqZWN0cywgb3V0cHV0X2ZpbGVuYW1lXG9wdGlvbmFseywgb3V0cHV0X2Rpcj1cY29kZXtOb25lfSwgbGlicmFyaWVzPVxjb2Rle05vbmV9LCBsaWJyYXJ5X2RpcnM9XGNvZGV7Tm9uZX0sIHJ1bnRpbWVfbGlicmFyeV9kaXJzPVxjb2Rle05vbmV9LCBleHBvcnRfc3ltYm9scz1cY29kZXtOb25lfSwgZGVidWc9XGNvZGV7MH0sIGV4dHJhX3ByZWFyZ3M9XGNvZGV7Tm9uZX0sIGV4dHJhX3Bvc3RhcmdzPVxjb2Rle05vbmV9LCBidWlsZF90ZW1wPVxjb2Rle05vbmV9LCB0YXJnZXRfbGFuZz1cY29kZXtOb25lfX19Ci1MaW5rIGEgc2hhcmVkIG9iamVjdC4gXHZhcntvdXRwdXRfZmlsZW5hbWV9IGlzIHRoZSBuYW1lIG9mIHRoZSBzaGFyZWQgb2JqZWN0Ci10aGF0IHdpbGwgYmUgY3JlYXRlZCwgd2hpbGUgXHZhcntvYmplY3RzfSBpcyBhIGxpc3Qgb2Ygb2JqZWN0IGZpbGVuYW1lcyAKLXRvIGxpbmsgaW4uIE90aGVyIGFyZ3VtZW50cyBhcmUgYXMgZm9yIHRoZSBcbWV0aG9ke2xpbmt9IG1ldGhvZC4gCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtwcmVwcm9jZXNzfXtzb3VyY2Vcb3B0aW9uYWx7LCBvdXRwdXRfZmlsZT1cY29kZXtOb25lfSwgbWFjcm9zPVxjb2Rle05vbmV9LCBpbmNsdWRlX2RpcnM9XGNvZGV7Tm9uZX0sIGV4dHJhX3ByZWFyZ3M9XGNvZGV7Tm9uZX0sIGV4dHJhX3Bvc3RhcmdzPVxjb2Rle05vbmV9fX0KLVByZXByb2Nlc3MgYSBzaW5nbGUgQy9cQ3Bwe30gc291cmNlIGZpbGUsIG5hbWVkIGluIFx2YXJ7c291cmNlfS4KLU91dHB1dCB3aWxsIGJlIHdyaXR0ZW4gdG8gZmlsZSBuYW1lZCBcdmFye291dHB1dF9maWxlfSwgb3IgXHZhcntzdGRvdXR9IGlmCi1cdmFye291dHB1dF9maWxlfSBub3Qgc3VwcGxpZWQuICBcdmFye21hY3Jvc30gaXMgYSBsaXN0IG9mIG1hY3JvCi1kZWZpbml0aW9ucyBhcyBmb3IgXG1ldGhvZHtjb21waWxlKCl9LCB3aGljaCB3aWxsIGF1Z21lbnQgdGhlIG1hY3JvcyBzZXQKLXdpdGggXG1ldGhvZHtkZWZpbmVfbWFjcm8oKX0gYW5kIFxtZXRob2R7dW5kZWZpbmVfbWFjcm8oKX0uICAKLVx2YXJ7aW5jbHVkZV9kaXJzfSBpcyBhIGxpc3Qgb2YgZGlyZWN0b3J5IG5hbWVzIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgCi1kZWZhdWx0IGxpc3QsIGluIHRoZSBzYW1lIHdheSBhcyBcbWV0aG9ke2FkZF9pbmNsdWRlX2RpcigpfS4KLQotUmFpc2VzIFxleGNlcHRpb257UHJlcHJvY2Vzc0Vycm9yfSBvbiBmYWlsdXJlLgotXGVuZHttZXRob2RkZXNjfQotCi1UaGUgZm9sbG93aW5nIHV0aWxpdHkgbWV0aG9kcyBhcmUgZGVmaW5lZCBieSB0aGUgXGNsYXNze0NDb21waWxlcn0gY2xhc3MsCi1mb3IgdXNlIGJ5IHRoZSB2YXJpb3VzIGNvbmNyZXRlIHN1YmNsYXNzZXMuCi0KLVxiZWdpbnttZXRob2RkZXNjfXtleGVjdXRhYmxlX2ZpbGVuYW1lfXtiYXNlbmFtZVxvcHRpb25hbHssIHN0cmlwX2Rpcj1cY29kZXswfSwgb3V0cHV0X2Rpcj1cY29kZXsnJ319fQotUmV0dXJucyB0aGUgZmlsZW5hbWUgb2YgdGhlIGV4ZWN1dGFibGUgZm9yIHRoZSBnaXZlbiBcdmFye2Jhc2VuYW1lfS4gCi1UeXBpY2FsbHkgZm9yIG5vbi1XaW5kb3dzIHBsYXRmb3JtcyB0aGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBiYXNlbmFtZSwgCi13aGlsZSBXaW5kb3dzIHdpbGwgZ2V0IGEgXGZpbGV7LmV4ZX0gYWRkZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtsaWJyYXJ5X2ZpbGVuYW1lfXtsaWJuYW1lXG9wdGlvbmFseywgbGliX3R5cGU9XGNvZGV7J3N0YXRpYyd9LCBzdHJpcF9kaXI9XGNvZGV7MH0sIG91dHB1dF9kaXI9XGNvZGV7Jyd9fX0KLVJldHVybnMgdGhlIGZpbGVuYW1lIGZvciB0aGUgZ2l2ZW4gbGlicmFyeSBuYW1lIG9uIHRoZSBjdXJyZW50IHBsYXRmb3JtLgotT24gXFVOSVh7fSBhIGxpYnJhcnkgd2l0aCBcdmFye2xpYl90eXBlfSBvZiBcY29kZXsnc3RhdGljJ30gd2lsbCB0eXBpY2FsbHkgCi1iZSBvZiB0aGUgZm9ybSBcZmlsZXtsaWJsaWJuYW1lLmF9LCB3aGlsZSBhIFx2YXJ7bGliX3R5cGV9IG9mIFxjb2RleydkeW5hbWljJ30gCi13aWxsIGJlIG9mIHRoZSBmb3JtIFxmaWxle2xpYmxpYm5hbWUuc299LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317b2JqZWN0X2ZpbGVuYW1lc317c291cmNlX2ZpbGVuYW1lc1xvcHRpb25hbHssIHN0cmlwX2Rpcj1cY29kZXswfSwgb3V0cHV0X2Rpcj1cY29kZXsnJ319fQotUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IGZpbGVzIGZvciB0aGUgZ2l2ZW4gc291cmNlIGZpbGVzLiAKLVx2YXJ7c291cmNlX2ZpbGVuYW1lc30gc2hvdWxkIGJlIGEgbGlzdCBvZiBmaWxlbmFtZXMuIAotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317c2hhcmVkX29iamVjdF9maWxlbmFtZX17YmFzZW5hbWVcb3B0aW9uYWx7LCBzdHJpcF9kaXI9XGNvZGV7MH0sIG91dHB1dF9kaXI9XGNvZGV7Jyd9fX0KLVJldHVybnMgdGhlIG5hbWUgb2YgYSBzaGFyZWQgb2JqZWN0IGZpbGUgZm9yIHRoZSBnaXZlbiBmaWxlIG5hbWUgXHZhcntiYXNlbmFtZX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtleGVjdXRlfXtmdW5jLCBhcmdzXG9wdGlvbmFseywgbXNnPVxjb2Rle05vbmV9LCBsZXZlbD1cY29kZXsxfX19Ci1JbnZva2VzIFxmdW5jdGlvbntkaXN0dXRpbHMudXRpbC5leGVjdXRlKCl9IFRoaXMgbWV0aG9kIGludm9rZXMgYSAKLVB5dGhvbiBmdW5jdGlvbiBcdmFye2Z1bmN9IHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cyBcdmFye2FyZ3N9LCBhZnRlciAKLWxvZ2dpbmcgYW5kIHRha2luZyBpbnRvIGFjY291bnQgdGhlIFx2YXJ7ZHJ5X3J1bn0gZmxhZy4gWFhYIHNlZSBhbHNvLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317c3Bhd259e2NtZH0KLUludm9rZXMgXGZ1bmN0aW9ue2Rpc3R1dGlscy51dGlsLnNwYXduKCl9LiBUaGlzIGludm9rZXMgYW4gZXh0ZXJuYWwgCi1wcm9jZXNzIHRvIHJ1biB0aGUgZ2l2ZW4gY29tbWFuZC4gWFhYIHNlZSBhbHNvLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317bWtwYXRofXtuYW1lXG9wdGlvbmFseywgbW9kZT1cY29kZXs1MTF9fX0KLQotSW52b2tlcyBcZnVuY3Rpb257ZGlzdHV0aWxzLmRpcl91dGlsLm1rcGF0aCgpfS4gVGhpcyBjcmVhdGVzIGEgZGlyZWN0b3J5IAotYW5kIGFueSBtaXNzaW5nIGFuY2VzdG9yIGRpcmVjdG9yaWVzLiBYWFggc2VlIGFsc28uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXttb3ZlX2ZpbGV9e3NyYywgZHN0fQotSW52b2tlcyBcbWV0aG9ke2Rpc3R1dGlscy5maWxlX3V0aWwubW92ZV9maWxlKCl9LiBSZW5hbWVzIFx2YXJ7c3JjfSB0byAKLVx2YXJ7ZHN0fS4gIFhYWCBzZWUgYWxzby4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2Fubm91bmNlfXttc2dcb3B0aW9uYWx7LCBsZXZlbD1cY29kZXsxfX19Ci1Xcml0ZSBhIG1lc3NhZ2UgdXNpbmcgXGZ1bmN0aW9ue2Rpc3R1dGlscy5sb2cuZGVidWcoKX0uIFhYWCBzZWUgYWxzby4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3dhcm59e21zZ30KLVdyaXRlIGEgd2FybmluZyBtZXNzYWdlIFx2YXJ7bXNnfSB0byBzdGFuZGFyZCBlcnJvci4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2RlYnVnX3ByaW50fXttc2d9Ci1JZiB0aGUgXHZhcntkZWJ1Z30gZmxhZyBpcyBzZXQgb24gdGhpcyBcY2xhc3N7Q0NvbXBpbGVyfSBpbnN0YW5jZSwgcHJpbnQgCi1cdmFye21zZ30gdG8gc3RhbmRhcmQgb3V0cHV0LCBvdGhlcndpc2UgZG8gbm90aGluZy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGVuZHtjbGFzc2Rlc2N9Ci0KLSVcc3Vic2VjdGlvbntDb21waWxlci1zcGVjaWZpYyBtb2R1bGVzfQotJQotJVRoZSBmb2xsb3dpbmcgbW9kdWxlcyBpbXBsZW1lbnQgY29uY3JldGUgc3ViY2xhc3NlcyBvZiB0aGUgYWJzdHJhY3QgCi0lXGNsYXNze0NDb21waWxlcn0gY2xhc3MuIFRoZXkgc2hvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHksIGJ1dCBzaG91bGQKLSViZSBjcmVhdGVkIHVzaW5nIFxmdW5jdGlvbntkaXN0dXRpbHMuY2NvbXBpbGVyLm5ld19jb21waWxlcigpfSBmYWN0b3J5IAotJWZ1bmN0aW9uLgotCi1cc2VjdGlvbntcbW9kdWxle2Rpc3R1dGlscy51bml4Y2NvbXBpbGVyfSAtLS0gVW5peCBDIENvbXBpbGVyfQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2Rpc3R1dGlscy51bml4Y2NvbXBpbGVyfQotXG1vZHVsZXN5bm9wc2lze1VOSVggQyBDb21waWxlcn0KLQotVGhpcyBtb2R1bGUgcHJvdmlkZXMgdGhlIFxjbGFzc3tVbml4Q0NvbXBpbGVyfSBjbGFzcywgYSBzdWJjbGFzcyBvZiAKLVxjbGFzc3tDQ29tcGlsZXJ9IHRoYXQgaGFuZGxlcyB0aGUgdHlwaWNhbCBcVU5JWC1zdHlsZSBjb21tYW5kLWxpbmUgCi1DIGNvbXBpbGVyOgotCi1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtIG1hY3JvcyBkZWZpbmVkIHdpdGggXHByb2dyYW1vcHR7LURcdmFye25hbWV9XG9wdGlvbmFsez12YWx1ZX19Ci1caXRlbSBtYWNyb3MgdW5kZWZpbmVkIHdpdGggXHByb2dyYW1vcHR7LVVcdmFye25hbWV9fQotXGl0ZW0gaW5jbHVkZSBzZWFyY2ggZGlyZWN0b3JpZXMgc3BlY2lmaWVkIHdpdGgKLSAgICAgIFxwcm9ncmFtb3B0ey1JXHZhcntkaXJ9fQotXGl0ZW0gbGlicmFyaWVzIHNwZWNpZmllZCB3aXRoIFxwcm9ncmFtb3B0ey1sXHZhcntsaWJ9fQotXGl0ZW0gbGlicmFyeSBzZWFyY2ggZGlyZWN0b3JpZXMgc3BlY2lmaWVkIHdpdGggXHByb2dyYW1vcHR7LUxcdmFye2Rpcn19Ci1caXRlbSBjb21waWxlIGhhbmRsZWQgYnkgXHByb2dyYW17Y2N9IChvciBzaW1pbGFyKSBleGVjdXRhYmxlIHdpdGgKLSAgICAgIFxwcm9ncmFtb3B0ey1jfSBvcHRpb246IGNvbXBpbGVzIFxmaWxley5jfSB0byBcZmlsZXsub30KLVxpdGVtIGxpbmsgc3RhdGljIGxpYnJhcnkgaGFuZGxlZCBieSBccHJvZ3JhbXthcn0gY29tbWFuZCAocG9zc2libHkKLSAgICAgIHdpdGggXHByb2dyYW17cmFubGlifSkKLVxpdGVtIGxpbmsgc2hhcmVkIGxpYnJhcnkgaGFuZGxlZCBieSBccHJvZ3JhbXtjY30gXHByb2dyYW1vcHR7LXNoYXJlZH0KLVxlbmR7aXRlbWl6ZX0KLQotXHNlY3Rpb257XG1vZHVsZXtkaXN0dXRpbHMubXN2Y2NvbXBpbGVyfSAtLS0gTWljcm9zb2Z0IENvbXBpbGVyfQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2Rpc3R1dGlscy5tc3ZjY29tcGlsZXJ9Ci1cbW9kdWxlc3lub3BzaXN7TWljcm9zb2Z0IENvbXBpbGVyfQotCi1UaGlzIG1vZHVsZSBwcm92aWRlcyBcY2xhc3N7TVNWQ0NvbXBpbGVyfSwgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGFic3RyYWN0IAotXGNsYXNze0NDb21waWxlcn0gY2xhc3MgZm9yIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvLiBUeXBpY2FsbHksIGV4dGVuc2lvbgotbW9kdWxlcyBuZWVkIHRvIGJlIGNvbXBpbGVkIHdpdGggdGhlIHNhbWUgY29tcGlsZXIgdGhhdCB3YXMgdXNlZCB0byBjb21waWxlCi1QeXRob24uIEZvciBQeXRob24gMi4zIGFuZCBlYXJsaWVyLCB0aGUgY29tcGlsZXIgd2FzIFZpc3VhbCBTdHVkaW8gNi4gRm9yCi1QeXRob24gMi40IGFuZCAyLjUsIHRoZSBjb21waWxlciBpcyBWaXN1YWwgU3R1ZGlvIC5ORVQgMjAwMy4gVGhlIEFNRDY0Ci1hbmQgSXRhbml1bSBiaW5hcmllcyBhcmUgY3JlYXRlZCB1c2luZyB0aGUgUGxhdGZvcm0gU0RLLgotCi1cY2xhc3N7TVNWQ0NvbXBpbGVyfSB3aWxsIG5vcm1hbGx5IGNob29zZSB0aGUgcmlnaHQgY29tcGlsZXIsIGxpbmtlciBldGMuCi1vbiBpdHMgb3duLiBUbyBvdmVycmlkZSB0aGlzIGNob2ljZSwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcwotXHZhcntESVNUVVRJTFNcX1VTRVxfU0RLfSBhbmQgXHZhcntNU1Nka30gbXVzdCBiZSBib3RoIHNldC4gXHZhcntNU1Nka30KLWluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IGVudmlyb25tZW50IGhhcyBiZWVuIHNldHVwIGJ5IHRoZSBTREsncwotXGNvZGV7U2V0RW52LkNtZH0gc2NyaXB0LCBvciB0aGF0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaGFkIGJlZW4KLXJlZ2lzdGVyZWQgd2hlbiB0aGUgU0RLIHdhcyBpbnN0YWxsZWQ7IFx2YXJ7RElTVFVUSUxTXF9VU0VcX1NES30gaW5kaWNhdGVzCi10aGF0IHRoZSBkaXN0dXRpbHMgdXNlciBoYXMgbWFkZSBhbiBleHBsaWNpdCBjaG9pY2UgdG8gb3ZlcnJpZGUgdGhlCi1jb21waWxlciBzZWxlY3Rpb24gYnkgXGNsYXNze01TVkNDb21waWxlcn0uCi0KLVxzZWN0aW9ue1xtb2R1bGV7ZGlzdHV0aWxzLmJjcHBjb21waWxlcn0gLS0tIEJvcmxhbmQgQ29tcGlsZXJ9Ci1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZGlzdHV0aWxzLmJjcHBjb21waWxlcn0KLVRoaXMgbW9kdWxlIHByb3ZpZGVzIFxjbGFzc3tCb3JsYW5kQ0NvbXBpbGVyfSwgYW4gc3ViY2xhc3Mgb2YgdGhlIGFic3RyYWN0IFxjbGFzc3tDQ29tcGlsZXJ9IGNsYXNzIGZvciB0aGUgQm9ybGFuZCBcQ3Bwe30gY29tcGlsZXIuCi0KLVxzZWN0aW9ue1xtb2R1bGV7ZGlzdHV0aWxzLmN5Z3dpbmNvbXBpbGVyfSAtLS0gQ3lnd2luIENvbXBpbGVyfQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2Rpc3R1dGlscy5jeWd3aW5jY29tcGlsZXJ9Ci0KLVRoaXMgbW9kdWxlIHByb3ZpZGVzIHRoZSBcY2xhc3N7Q3lnd2luQ0NvbXBpbGVyfSBjbGFzcywgYSBzdWJjbGFzcyBvZiBcY2xhc3N7VW5peENDb21waWxlcn0gdGhhdAotaGFuZGxlcyB0aGUgQ3lnd2luIHBvcnQgb2YgdGhlIEdOVSBDIGNvbXBpbGVyIHRvIFdpbmRvd3MuICBJdCBhbHNvIGNvbnRhaW5zCi10aGUgTWluZ3czMkNDb21waWxlciBjbGFzcyB3aGljaCBoYW5kbGVzIHRoZSBtaW5ndzMyIHBvcnQgb2YgR0NDIChzYW1lIGFzCi1jeWd3aW4gaW4gbm8tY3lnd2luIG1vZGUpLgotCi1cc2VjdGlvbntcbW9kdWxle2Rpc3R1dGlscy5lbXhjY29tcGlsZXJ9IC0tLSBPUy8yIEVNWCBDb21waWxlcn0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtkaXN0dXRpbHMuZW14Y2NvbXBpbGVyfQotXG1vZHVsZXN5bm9wc2lze09TLzIgRU1YIENvbXBpbGVyIHN1cHBvcnR9Ci0KLVRoaXMgbW9kdWxlIHByb3ZpZGVzIHRoZSBFTVhDQ29tcGlsZXIgY2xhc3MsIGEgc3ViY2xhc3Mgb2YgXGNsYXNze1VuaXhDQ29tcGlsZXJ9IHRoYXQgaGFuZGxlcyB0aGUgRU1YIHBvcnQgb2YgdGhlIEdOVSBDIGNvbXBpbGVyIHRvIE9TLzIuCi0KLVxzZWN0aW9ue1xtb2R1bGV7ZGlzdHV0aWxzLm13ZXJrc2NvbXBpbGVyfSAtLS0gTWV0cm93ZXJrcyBDb2RlV2FycmlvciBzdXBwb3J0fQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2Rpc3R1dGlscy5td2Vya3Njb21waWxlcn0KLVxtb2R1bGVzeW5vcHNpc3tNZXRyb3dlcmtzIENvZGVXYXJyaW9yIHN1cHBvcnR9Ci0KLUNvbnRhaW5zIFxjbGFzc3tNV2Vya3NDb21waWxlcn0sIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBhYnN0cmFjdCAKLVxjbGFzc3tDQ29tcGlsZXJ9IGNsYXNzIGZvciBNZXRyb1dlcmtzIENvZGVXYXJyaW9yIG9uIHRoZSBwcmUtTWFjIE9TIFggTWFjaW50b3NoLgotTmVlZHMgd29yayB0byBzdXBwb3J0IENXIG9uIFdpbmRvd3Mgb3IgTWFjIE9TIFguCi0KLQotJVxzdWJzZWN0aW9ue1V0aWxpdHkgbW9kdWxlc30KLSUKLSVUaGUgZm9sbG93aW5nIG1vZHVsZXMgYWxsIHByb3ZpZGUgZ2VuZXJhbCB1dGlsaXR5IGZ1bmN0aW9ucy4gVGhleSBoYXZlbid0IAotJWFsbCBiZWVuIGRvY3VtZW50ZWQgeWV0LgotCi1cc2VjdGlvbntcbW9kdWxle2Rpc3R1dGlscy5hcmNoaXZlX3V0aWx9IC0tLSAKLQkJCUFyY2hpdmluZyB1dGlsaXRpZXN9Ci1cZGVjbGFyZW1vZHVsZVtkaXN0dXRpbHMuYXJjaGl2ZXV0aWxde3N0YW5kYXJkfXtkaXN0dXRpbHMuYXJjaGl2ZV91dGlsfQotXG1vZHVsZXN5bm9wc2lze1V0aWxpdHkgZnVuY3Rpb25zIGZvciBjcmVhdGluZyBhcmNoaXZlIGZpbGVzICh0YXJiYWxscywgemlwIGZpbGVzLCAuLi4pfQotCi1UaGlzIG1vZHVsZSBwcm92aWRlcyBhIGZldyBmdW5jdGlvbnMgZm9yIGNyZWF0aW5nIGFyY2hpdmUgZmlsZXMsIHN1Y2ggYXMgCi10YXJiYWxscyBvciB6aXBmaWxlcy4KLQotXGJlZ2lue2Z1bmNkZXNjfXttYWtlX2FyY2hpdmV9e2Jhc2VfbmFtZSwgZm9ybWF0XG9wdGlvbmFseywgcm9vdF9kaXI9XGNvZGV7Tm9uZX0sIGJhc2VfZGlyPVxjb2Rle05vbmV9LCB2ZXJib3NlPVxjb2RlezB9LCBkcnlfcnVuPVxjb2RlezB9fX0KLUNyZWF0ZSBhbiBhcmNoaXZlIGZpbGUgKGVnLiBcY29kZXt6aXB9IG9yIFxjb2Rle3Rhcn0pLiAgXHZhcntiYXNlX25hbWV9IAotaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gY3JlYXRlLCBtaW51cyBhbnkgZm9ybWF0LXNwZWNpZmljIGV4dGVuc2lvbjsgCi1cdmFye2Zvcm1hdH0gaXMgdGhlIGFyY2hpdmUgZm9ybWF0OiBvbmUgb2YgXGNvZGV7emlwfSwgXGNvZGV7dGFyfSwgCi1cY29kZXt6dGFyfSwgb3IgXGNvZGV7Z3p0YXJ9LgotXHZhcntyb290X2Rpcn0gaXMgYSBkaXJlY3RvcnkgdGhhdCB3aWxsIGJlIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUKLWFyY2hpdmU7IGllLiB3ZSB0eXBpY2FsbHkgXGNvZGV7Y2hkaXJ9IGludG8gXHZhcntyb290X2Rpcn0gYmVmb3JlIAotY3JlYXRpbmcgdGhlIGFyY2hpdmUuICBcdmFye2Jhc2VfZGlyfSBpcyB0aGUgZGlyZWN0b3J5IHdoZXJlIHdlIHN0YXJ0IAotYXJjaGl2aW5nIGZyb207IGllLiBcdmFye2Jhc2VfZGlyfSB3aWxsIGJlIHRoZSBjb21tb24gcHJlZml4IG9mIGFsbCBmaWxlcyBhbmQKLWRpcmVjdG9yaWVzIGluIHRoZSBhcmNoaXZlLiAgXHZhcntyb290X2Rpcn0gYW5kIFx2YXJ7YmFzZV9kaXJ9IGJvdGggZGVmYXVsdAotdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgYXJjaGl2ZSBmaWxlLgotCi1cd2FybmluZ3tUaGlzIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHN1cHBvcnQgYnoyIGZpbGVzfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXttYWtlX3RhcmJhbGx9e2Jhc2VfbmFtZSwgYmFzZV9kaXJcb3B0aW9uYWx7LCBjb21wcmVzcz1cY29kZXsnZ3ppcCd9LCB2ZXJib3NlPVxjb2RlezB9LCBkcnlfcnVuPVxjb2RlezB9fX0nQ3JlYXRlIGFuIChvcHRpb25hbCBjb21wcmVzc2VkKSBhcmNoaXZlIGFzIGEgdGFyIGZpbGUgZnJvbSBhbGwgZmlsZXMgaW4gYW5kIHVuZGVyIFx2YXJ7YmFzZV9kaXJ9LiBcdmFye2NvbXByZXNzfSBtdXN0IGJlIFxjb2RleydnemlwJ30gKHRoZSBkZWZhdWx0KSwgCi1cY29kZXsnY29tcHJlc3MnfSwgXGNvZGV7J2J6aXAyJ30sIG9yIFxjb2Rle05vbmV9LiAgQm90aCBccHJvZ3JhbXt0YXJ9Ci1hbmQgdGhlIGNvbXByZXNzaW9uIHV0aWxpdHkgbmFtZWQgYnkgXHZhcntjb21wcmVzc30gbXVzdCBiZSBvbiB0aGUgCi1kZWZhdWx0IHByb2dyYW0gc2VhcmNoIHBhdGgsIHNvIHRoaXMgaXMgcHJvYmFibHkgXFVOSVgtc3BlY2lmaWMuICBUaGUgCi1vdXRwdXQgdGFyIGZpbGUgd2lsbCBiZSBuYW1lZCBcZmlsZXtcdmFye2Jhc2VfZGlyfS50YXJ9LCBwb3NzaWJseSBwbHVzCi10aGUgYXBwcm9wcmlhdGUgY29tcHJlc3Npb24gZXh0ZW5zaW9uIChcZmlsZXsuZ3p9LCBcZmlsZXsuYnoyfSBvcgotXGZpbGV7Llp9KS4gIFJldHVybiB0aGUgb3V0cHV0IGZpbGVuYW1lLgotCi1cd2FybmluZ3tUaGlzIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIGNhbGxzIHRvIHRoZSBcbW9kdWxle3RhcmZpbGV9IG1vZHVsZS59Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e21ha2VfemlwZmlsZX17YmFzZV9uYW1lLCBiYXNlX2RpclxvcHRpb25hbHssIHZlcmJvc2U9XGNvZGV7MH0sIGRyeV9ydW49XGNvZGV7MH19fQotQ3JlYXRlIGEgemlwIGZpbGUgZnJvbSBhbGwgZmlsZXMgaW4gYW5kIHVuZGVyIFx2YXJ7YmFzZV9kaXJ9LiAgVGhlIG91dHB1dAotemlwIGZpbGUgd2lsbCBiZSBuYW1lZCBcdmFye2Jhc2VfZGlyfSArIFxmaWxley56aXB9LiAgVXNlcyBlaXRoZXIgdGhlIAotXG1vZHVsZXt6aXBmaWxlfSBQeXRob24gbW9kdWxlIChpZiBhdmFpbGFibGUpIG9yIHRoZSBJbmZvWklQIFxmaWxle3ppcH0gCi11dGlsaXR5IChpZiBpbnN0YWxsZWQgYW5kIGZvdW5kIG9uIHRoZSBkZWZhdWx0IHNlYXJjaCBwYXRoKS4gIElmIG5laXRoZXIgCi10b29sIGlzIGF2YWlsYWJsZSwgcmFpc2VzIFxleGNlcHRpb257RGlzdHV0aWxzRXhlY0Vycm9yfS4gIAotUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IHppcCBmaWxlLgotXGVuZHtmdW5jZGVzY30KLQotXHNlY3Rpb257XG1vZHVsZXtkaXN0dXRpbHMuZGVwX3V0aWx9IC0tLSBEZXBlbmRlbmN5IGNoZWNraW5nfQotXGRlY2xhcmVtb2R1bGVbZGlzdHV0aWxzLmRlcHV0aWxde3N0YW5kYXJkfXtkaXN0dXRpbHMuZGVwX3V0aWx9Ci1cbW9kdWxlc3lub3BzaXN7VXRpbGl0eSBmdW5jdGlvbnMgZm9yIHNpbXBsZSBkZXBlbmRlbmN5IGNoZWNraW5nfQotCi1UaGlzIG1vZHVsZSBwcm92aWRlcyBmdW5jdGlvbnMgZm9yIHBlcmZvcm1pbmcgc2ltcGxlLCB0aW1lc3RhbXAtYmFzZWQgCi1kZXBlbmRlbmN5IG9mIGZpbGVzIGFuZCBncm91cHMgb2YgZmlsZXM7IGFsc28sIGZ1bmN0aW9ucyBiYXNlZCBlbnRpcmVseSAKLW9uIHN1Y2ggdGltZXN0YW1wIGRlcGVuZGVuY3kgYW5hbHlzaXMuCi0KLVxiZWdpbntmdW5jZGVzY317bmV3ZXJ9e3NvdXJjZSwgdGFyZ2V0fQotUmV0dXJuIHRydWUgaWYgXHZhcntzb3VyY2V9IGV4aXN0cyBhbmQgaXMgbW9yZSByZWNlbnRseSBtb2RpZmllZCB0aGFuCi1cdmFye3RhcmdldH0sIG9yIGlmIFx2YXJ7c291cmNlfSBleGlzdHMgYW5kIFx2YXJ7dGFyZ2V0fSBkb2Vzbid0LgotUmV0dXJuIGZhbHNlIGlmIGJvdGggZXhpc3QgYW5kIFx2YXJ7dGFyZ2V0fSBpcyB0aGUgc2FtZSBhZ2Ugb3IgbmV3ZXIgCi10aGFuIFx2YXJ7c291cmNlfS4KLVJhaXNlIFxleGNlcHRpb257RGlzdHV0aWxzRmlsZUVycm9yfSBpZiBcdmFye3NvdXJjZX0gZG9lcyBub3QgZXhpc3QuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e25ld2VyX3BhaXJ3aXNlfXtzb3VyY2VzLCB0YXJnZXRzfQotV2FsayB0d28gZmlsZW5hbWUgbGlzdHMgaW4gcGFyYWxsZWwsIHRlc3RpbmcgaWYgZWFjaCBzb3VyY2UgaXMgbmV3ZXIKLXRoYW4gaXRzIGNvcnJlc3BvbmRpbmcgdGFyZ2V0LiAgUmV0dXJuIGEgcGFpciBvZiBsaXN0cyAoXHZhcntzb3VyY2VzfSwKLVx2YXJ7dGFyZ2V0c30pIHdoZXJlIHNvdXJjZSBpcyBuZXdlciB0aGFuIHRhcmdldCwgYWNjb3JkaW5nIHRvIHRoZSBzZW1hbnRpY3MKLW9mIFxmdW5jdGlvbntuZXdlcigpfQotJSUgZXF1aXZhbGVudCB0byBhIGxpc3Rjb21wLi4uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e25ld2VyX2dyb3VwfXtzb3VyY2VzLCB0YXJnZXRcb3B0aW9uYWx7LCBtaXNzaW5nPVxjb2RleydlcnJvcid9fX0KLVJldHVybiB0cnVlIGlmIFx2YXJ7dGFyZ2V0fSBpcyBvdXQtb2YtZGF0ZSB3aXRoIHJlc3BlY3QgdG8gYW55IGZpbGUKLWxpc3RlZCBpbiBcdmFye3NvdXJjZXN9ICBJbiBvdGhlciB3b3JkcywgaWYgXHZhcnt0YXJnZXR9IGV4aXN0cyBhbmQgaXMgbmV3ZXIKLXRoYW4gZXZlcnkgZmlsZSBpbiBcdmFye3NvdXJjZXN9LCByZXR1cm4gZmFsc2U7IG90aGVyd2lzZSByZXR1cm4gdHJ1ZS4KLVx2YXJ7bWlzc2luZ30gY29udHJvbHMgd2hhdCB3ZSBkbyB3aGVuIGEgc291cmNlIGZpbGUgaXMgbWlzc2luZzsgdGhlCi1kZWZhdWx0IChcY29kZXsnZXJyb3InfSkgaXMgdG8gYmxvdyB1cCB3aXRoIGFuIFxleGNlcHRpb257T1NFcnJvcn0gZnJvbSAKLWluc2lkZSBcZnVuY3Rpb257b3Muc3RhdCgpfTsKLWlmIGl0IGlzIFxjb2RleydpZ25vcmUnfSwgd2Ugc2lsZW50bHkgZHJvcCBhbnkgbWlzc2luZyBzb3VyY2UgZmlsZXM7IGlmIGl0IGlzCi1cY29kZXsnbmV3ZXInfSwgYW55IG1pc3Npbmcgc291cmNlIGZpbGVzIG1ha2UgdXMgYXNzdW1lIHRoYXQgXHZhcnt0YXJnZXR9IGlzCi1vdXQtb2YtZGF0ZSAodGhpcyBpcyBoYW5keSBpbiBgYGRyeS1ydW4nJyBtb2RlOiBpdCdsbCBtYWtlIHlvdSBwcmV0ZW5kIHRvCi1jYXJyeSBvdXQgY29tbWFuZHMgdGhhdCB3b3VsZG4ndCB3b3JrIGJlY2F1c2UgaW5wdXRzIGFyZSBtaXNzaW5nLCBidXQKLXRoYXQgZG9lc24ndCBtYXR0ZXIgYmVjYXVzZSB5b3UncmUgbm90IGFjdHVhbGx5IGdvaW5nIHRvIHJ1biB0aGUKLWNvbW1hbmRzKS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxzZWN0aW9ue1xtb2R1bGV7ZGlzdHV0aWxzLmRpcl91dGlsfSAtLS0gRGlyZWN0b3J5IHRyZWUgb3BlcmF0aW9uc30KLVxkZWNsYXJlbW9kdWxlW2Rpc3R1dGlscy5kaXJ1dGlsXXtzdGFuZGFyZH17ZGlzdHV0aWxzLmRpcl91dGlsfQotXG1vZHVsZXN5bm9wc2lze1V0aWxpdHkgZnVuY3Rpb25zIGZvciBvcGVyYXRpbmcgb24gZGlyZWN0b3JpZXMgYW5kIGRpcmVjdG9yeSB0cmVlc30KLQotVGhpcyBtb2R1bGUgcHJvdmlkZXMgZnVuY3Rpb25zIGZvciBvcGVyYXRpbmcgb24gZGlyZWN0b3JpZXMgYW5kIHRyZWVzCi1vZiBkaXJlY3Rvcmllcy4KLQotXGJlZ2lue2Z1bmNkZXNjfXtta3BhdGh9e25hbWVcb3B0aW9uYWx7LCBtb2RlPVxjb2RlezA3Nzd9LCB2ZXJib3NlPVxjb2RlezB9LCBkcnlfcnVuPVxjb2RlezB9fX0KLUNyZWF0ZSBhIGRpcmVjdG9yeSBhbmQgYW55IG1pc3NpbmcgYW5jZXN0b3IgZGlyZWN0b3JpZXMuICBJZiB0aGUKLWRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyAob3IgaWYgXHZhcntuYW1lfSBpcyB0aGUgZW1wdHkgc3RyaW5nLCB3aGljaAotbWVhbnMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCB3aGljaCBvZiBjb3Vyc2UgZXhpc3RzKSwgdGhlbiBkbwotbm90aGluZy4gIFJhaXNlIFxleGNlcHRpb257RGlzdHV0aWxzRmlsZUVycm9yfSBpZiB1bmFibGUgdG8gY3JlYXRlIHNvbWUKLWRpcmVjdG9yeSBhbG9uZyB0aGUgd2F5IChlZy4gc29tZSBzdWItcGF0aCBleGlzdHMsIGJ1dCBpcyBhIGZpbGUKLXJhdGhlciB0aGFuIGEgZGlyZWN0b3J5KS4gIElmIFx2YXJ7dmVyYm9zZX0gaXMgdHJ1ZSwgcHJpbnQgYSBvbmUtbGluZQotc3VtbWFyeSBvZiBlYWNoIG1rZGlyIHRvIHN0ZG91dC4gIFJldHVybiB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcwotYWN0dWFsbHkgY3JlYXRlZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y3JlYXRlX3RyZWV9e2Jhc2VfZGlyLCBmaWxlc1xvcHRpb25hbHssIG1vZGU9XGNvZGV7MDc3N30sIHZlcmJvc2U9XGNvZGV7MH0sIGRyeV9ydW49XGNvZGV7MH19fQotQ3JlYXRlIGFsbCB0aGUgZW1wdHkgZGlyZWN0b3JpZXMgdW5kZXIgXHZhcntiYXNlX2Rpcn0gbmVlZGVkIHRvCi1wdXQgXHZhcntmaWxlc30gdGhlcmUuICBcdmFye2Jhc2VfZGlyfSBpcyBqdXN0IHRoZSBhIG5hbWUgb2YgYSBkaXJlY3RvcnkKLXdoaWNoIGRvZXNuJ3QgbmVjZXNzYXJpbHkgZXhpc3QgeWV0OyBcdmFye2ZpbGVzfSBpcyBhIGxpc3Qgb2YgZmlsZW5hbWVzCi10byBiZSBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byBcdmFye2Jhc2VfZGlyfS4gIFx2YXJ7YmFzZV9kaXJ9ICsgdGhlCi1kaXJlY3RvcnkgcG9ydGlvbiBvZiBldmVyeSBmaWxlIGluIFx2YXJ7ZmlsZXN9IHdpbGwgYmUgY3JlYXRlZCBpZiBpdAotZG9lc24ndCBhbHJlYWR5IGV4aXN0LiAgXHZhcnttb2RlfSwgXHZhcnt2ZXJib3NlfSBhbmQgXHZhcntkcnlfcnVufSBmbGFncyAKLWFyZSBhcyBmb3IgXGZ1bmN0aW9ue21rcGF0aCgpfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y29weV90cmVlfXtzcmMsIGRzdFxvcHRpb25hbHtwcmVzZXJ2ZV9tb2RlPVxjb2RlezF9LCBwcmVzZXJ2ZV90aW1lcz1cY29kZXsxfSwgcHJlc2VydmVfc3ltbGlua3M9XGNvZGV7MH0sIHVwZGF0ZT1cY29kZXswfSwgdmVyYm9zZT1cY29kZXswfSwgZHJ5X3J1bj1cY29kZXswfX19Ci1Db3B5IGFuIGVudGlyZSBkaXJlY3RvcnkgdHJlZSBcdmFye3NyY30gdG8gYSBuZXcgbG9jYXRpb24gXHZhcntkc3R9LiAgQm90aAotXHZhcntzcmN9IGFuZCBcdmFye2RzdH0gbXVzdCBiZSBkaXJlY3RvcnkgbmFtZXMuICBJZiBcdmFye3NyY30gaXMgbm90IGEKLWRpcmVjdG9yeSwgcmFpc2UgXGV4Y2VwdGlvbntEaXN0dXRpbHNGaWxlRXJyb3J9LiAgSWYgXHZhcntkc3R9IGRvZXMgCi1ub3QgZXhpc3QsIGl0IGlzIGNyZWF0ZWQgd2l0aCBcZnVuY3Rpb257bWtwYXRoKCl9LiAgVGhlIGVuZCByZXN1bHQgb2YgdGhlIAotY29weSBpcyB0aGF0IGV2ZXJ5IGZpbGUgaW4gXHZhcntzcmN9IGlzIGNvcGllZCB0byBcdmFye2RzdH0sIGFuZCAKLWRpcmVjdG9yaWVzIHVuZGVyIFx2YXJ7c3JjfSBhcmUgcmVjdXJzaXZlbHkgY29waWVkIHRvIFx2YXJ7ZHN0fS4gIAotUmV0dXJuIHRoZSBsaXN0IG9mIGZpbGVzIHRoYXQgd2VyZSBjb3BpZWQgb3IgbWlnaHQgaGF2ZSBiZWVuIGNvcGllZCwKLXVzaW5nIHRoZWlyIG91dHB1dCBuYW1lLiBUaGUgcmV0dXJuIHZhbHVlIGlzIHVuYWZmZWN0ZWQgYnkgXHZhcnt1cGRhdGV9Ci1vciBcdmFye2RyeV9ydW59OiBpdCBpcyBzaW1wbHkgdGhlIGxpc3Qgb2YgYWxsIGZpbGVzIHVuZGVyIFx2YXJ7c3JjfSwKLXdpdGggdGhlIG5hbWVzIGNoYW5nZWQgdG8gYmUgdW5kZXIgXHZhcntkc3R9LgotCi1cdmFye3ByZXNlcnZlX21vZGV9IGFuZCBcdmFye3ByZXNlcnZlX3RpbWVzfSBhcmUgdGhlIHNhbWUgYXMgZm9yCi1cZnVuY3Rpb257Y29weV9maWxlfSBpbiBccmVmbW9kdWxlW2Rpc3R1dGlscy5maWxldXRpbF17ZGlzdHV0aWxzLmZpbGVfdXRpbH07Ci1ub3RlIHRoYXQgdGhleSBvbmx5IGFwcGx5IHRvIHJlZ3VsYXIgZmlsZXMsIG5vdCB0byBkaXJlY3Rvcmllcy4gIElmCi1cdmFye3ByZXNlcnZlX3N5bWxpbmtzfSBpcyB0cnVlLCBzeW1saW5rcyB3aWxsIGJlIGNvcGllZCBhcyBzeW1saW5rcwotKG9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgdGhlbSEpOyBvdGhlcndpc2UgKHRoZSBkZWZhdWx0KSwgdGhlCi1kZXN0aW5hdGlvbiBvZiB0aGUgc3ltbGluayB3aWxsIGJlIGNvcGllZC4gIFx2YXJ7dXBkYXRlfSBhbmQKLVx2YXJ7dmVyYm9zZX0gYXJlIHRoZSBzYW1lIGFzIGZvcgotXGZ1bmN0aW9ue2NvcHlfZmlsZSgpfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cmVtb3ZlX3RyZWV9e2RpcmVjdG9yeVxvcHRpb25hbHt2ZXJib3NlPVxjb2RlezB9LCBkcnlfcnVuPVxjb2RlezB9fX0KLVJlY3Vyc2l2ZWx5IHJlbW92ZSBcdmFye2RpcmVjdG9yeX0gYW5kIGFsbCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgdW5kZXJuZWF0aAotaXQuIEFueSBlcnJvcnMgYXJlIGlnbm9yZWQgKGFwYXJ0IGZyb20gYmVpbmcgcmVwb3J0ZWQgdG8gXGNvZGV7c3lzLnN0ZG91dH0gaWYKLVx2YXJ7dmVyYm9zZX0gaXMgdHJ1ZSkuCi1cZW5ke2Z1bmNkZXNjfQotCi1cWFhYe1NvbWUgb2YgdGhpcyBjb3VsZCBiZSByZXBsYWNlZCB3aXRoIHRoZSBzaHV0aWwgbW9kdWxlP30KLQotXHNlY3Rpb257XG1vZHVsZXtkaXN0dXRpbHMuZmlsZV91dGlsfSAtLS0gU2luZ2xlIGZpbGUgb3BlcmF0aW9uc30KLVxkZWNsYXJlbW9kdWxlW2Rpc3R1dGlscy5maWxldXRpbF17c3RhbmRhcmR9e2Rpc3R1dGlscy5maWxlX3V0aWx9Ci1cbW9kdWxlc3lub3BzaXN7VXRpbGl0eSBmdW5jdGlvbnMgZm9yIG9wZXJhdGluZyBvbiBzaW5nbGUgZmlsZXN9Ci0KLVRoaXMgbW9kdWxlIGNvbnRhaW5zIHNvbWUgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIG9wZXJhdGluZyBvbiBpbmRpdmlkdWFsIGZpbGVzLgotCi1cYmVnaW57ZnVuY2Rlc2N9e2NvcHlfZmlsZX17c3JjLCBkc3Rcb3B0aW9uYWx7cHJlc2VydmVfbW9kZT1cY29kZXsxfSwgcHJlc2VydmVfdGltZXM9XGNvZGV7MX0sIHVwZGF0ZT1cY29kZXswfSwgbGluaz1cY29kZXtOb25lfSwgdmVyYm9zZT1cY29kZXswfSwgZHJ5X3J1bj1cY29kZXswfX19Ci1Db3B5IGZpbGUgXHZhcntzcmN9IHRvIFx2YXJ7ZHN0fS4gSWYgXHZhcntkc3R9IGlzIGEgZGlyZWN0b3J5LCB0aGVuCi1cdmFye3NyY30gaXMgY29waWVkIHRoZXJlIHdpdGggdGhlIHNhbWUgbmFtZTsgb3RoZXJ3aXNlLCBpdCBtdXN0IGJlIGEKLWZpbGVuYW1lLiAoSWYgdGhlIGZpbGUgZXhpc3RzLCBpdCB3aWxsIGJlIHJ1dGhsZXNzbHkgY2xvYmJlcmVkLikgSWYKLVx2YXJ7cHJlc2VydmVfbW9kZX0gaXMgdHJ1ZSAodGhlIGRlZmF1bHQpLCB0aGUgZmlsZSdzIG1vZGUgKHR5cGUgYW5kCi1wZXJtaXNzaW9uIGJpdHMsIG9yIHdoYXRldmVyIGlzIGFuYWxvZ291cyBvbiB0aGUgY3VycmVudCBwbGF0Zm9ybSkgaXMKLWNvcGllZC4gSWYgXHZhcntwcmVzZXJ2ZV90aW1lc30gaXMgdHJ1ZSAodGhlIGRlZmF1bHQpLCB0aGUgbGFzdC1tb2RpZmllZAotYW5kIGxhc3QtYWNjZXNzIHRpbWVzIGFyZSBjb3BpZWQgYXMgd2VsbC4gSWYgXHZhcnt1cGRhdGV9IGlzIHRydWUsCi1cdmFye3NyY30gd2lsbCBvbmx5IGJlIGNvcGllZCBpZiBcdmFye2RzdH0gZG9lcyBub3QgZXhpc3QsIG9yIGlmCi1cdmFye2RzdH0gZG9lcyBleGlzdCBidXQgaXMgb2xkZXIgdGhhbiBcdmFye3NyY30uCi0KLVx2YXJ7bGlua30gYWxsb3dzIHlvdSB0byBtYWtlIGhhcmQgbGlua3MgKHVzaW5nIFxmdW5jdGlvbntvcy5saW5rfSkgb3IKLXN5bWJvbGljIGxpbmtzICh1c2luZyBcZnVuY3Rpb257b3Muc3ltbGlua30pIGluc3RlYWQgb2YgY29weWluZzogc2V0IGl0Ci10byBcY29kZXsnaGFyZCd9IG9yIFxjb2RleydzeW0nfTsgaWYgaXQgaXMgXGNvZGV7Tm9uZX0gKHRoZSBkZWZhdWx0KSwKLWZpbGVzIGFyZSBjb3BpZWQuIERvbid0IHNldCBcdmFye2xpbmt9IG9uIHN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0Ci1pdDogXGZ1bmN0aW9ue2NvcHlfZmlsZSgpfSBkb2Vzbid0IGNoZWNrIGlmIGhhcmQgb3Igc3ltYm9saWMgbGlua2luZyBpcwotYXZhaWxhYmxlLiAgSXQgdXNlcyBcZnVuY3Rpb257X2NvcHlfZmlsZV9jb250ZW50cygpfSB0byBjb3B5IGZpbGUgY29udGVudHMuCi0KLVJldHVybiBhIHR1cGxlIFxzYW1weyhkZXN0X25hbWUsIGNvcGllZCl9OiBcdmFye2Rlc3RfbmFtZX0gaXMgdGhlIGFjdHVhbCAKLW5hbWUgb2YgdGhlIG91dHB1dCBmaWxlLCBhbmQgXHZhcntjb3BpZWR9IGlzIHRydWUgaWYgdGhlIGZpbGUgd2FzIGNvcGllZCAKLShvciB3b3VsZCBoYXZlIGJlZW4gY29waWVkLCBpZiBcdmFye2RyeV9ydW59IHRydWUpLgotJSBYWFggaWYgdGhlIGRlc3RpbmF0aW9uIGZpbGUgYWxyZWFkeSBleGlzdHMsIHdlIGNsb2JiZXIgaXQgaWYKLSUgY29weWluZywgYnV0IGJsb3cgdXAgaWYgbGlua2luZy4gIEhtbW0uICBBbmQgSSBkb24ndCBrbm93IHdoYXQKLSUgbWFjb3N0b29scy5jb3B5ZmlsZSgpIGRvZXMuICBTaG91bGQgZGVmaW5pdGVseSBiZSBjb25zaXN0ZW50LCBhbmQKLSUgc2hvdWxkIHByb2JhYmx5IGJsb3cgdXAgaWYgZGVzdGluYXRpb24gZXhpc3RzIGFuZCB3ZSB3b3VsZCBiZQotJSBjaGFuZ2luZyBpdCAoaWUuIGl0J3Mgbm90IGFscmVhZHkgYSBoYXJkL3NvZnQgbGluayB0byBzcmMgT1IKLSUgKG5vdCB1cGRhdGUpIGFuZCAoc3JjIG5ld2VyIHRoYW4gZHN0KSkuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e21vdmVfZmlsZX17c3JjLCBkc3Rcb3B0aW9uYWx7dmVyYm9zZSwgZHJ5X3J1bn19Ci1Nb3ZlIGZpbGUgXHZhcntzcmN9IHRvIFx2YXJ7ZHN0fS4gSWYgXHZhcntkc3R9IGlzIGEgZGlyZWN0b3J5LCB0aGUgZmlsZSB3aWxsCi1iZSBtb3ZlZCBpbnRvIGl0IHdpdGggdGhlIHNhbWUgbmFtZTsgb3RoZXJ3aXNlLCBcdmFye3NyY30gaXMganVzdCByZW5hbWVkCi10byBcdmFye2RzdH0uICBSZXR1cm5zIHRoZSBuZXcgZnVsbCBuYW1lIG9mIHRoZSBmaWxlLgotXHdhcm5pbmd7SGFuZGxlcyBjcm9zcy1kZXZpY2UgbW92ZXMgb24gXFVOSVh7fSB1c2luZyBcZnVuY3Rpb257Y29weV9maWxlKCl9LiAgCi1XaGF0IGFib3V0IG90aGVyIHN5c3RlbXM/Pz99Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3dyaXRlX2ZpbGV9e2ZpbGVuYW1lLCBjb250ZW50c30KLUNyZWF0ZSBhIGZpbGUgY2FsbGVkIFx2YXJ7ZmlsZW5hbWV9IGFuZCB3cml0ZSBcdmFye2NvbnRlbnRzfSAoYQotc2VxdWVuY2Ugb2Ygc3RyaW5ncyB3aXRob3V0IGxpbmUgdGVybWluYXRvcnMpIHRvIGl0LgotXGVuZHtmdW5jZGVzY30KLQotXHNlY3Rpb257XG1vZHVsZXtkaXN0dXRpbHMudXRpbH0gLS0tIE1pc2NlbGxhbmVvdXMgb3RoZXIgdXRpbGl0eSBmdW5jdGlvbnN9Ci1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZGlzdHV0aWxzLnV0aWx9Ci1cbW9kdWxlc3lub3BzaXN7TWlzY2VsbGFuZW91cyBvdGhlciB1dGlsaXR5IGZ1bmN0aW9uc30KLQotVGhpcyBtb2R1bGUgY29udGFpbnMgb3RoZXIgYXNzb3J0ZWQgYml0cyBhbmQgcGllY2VzIHRoYXQgZG9uJ3QgZml0IGludG8gCi1hbnkgb3RoZXIgdXRpbGl0eSBtb2R1bGUuCi0KLVxiZWdpbntmdW5jZGVzY317Z2V0X3BsYXRmb3JtfXt9Ci1SZXR1cm4gYSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIHRoZSBjdXJyZW50IHBsYXRmb3JtLiAgVGhpcyBpcyB1c2VkCi1tYWlubHkgdG8gZGlzdGluZ3Vpc2ggcGxhdGZvcm0tc3BlY2lmaWMgYnVpbGQgZGlyZWN0b3JpZXMgYW5kCi1wbGF0Zm9ybS1zcGVjaWZpYyBidWlsdCBkaXN0cmlidXRpb25zLiAgVHlwaWNhbGx5IGluY2x1ZGVzIHRoZSBPUyBuYW1lCi1hbmQgdmVyc2lvbiBhbmQgdGhlIGFyY2hpdGVjdHVyZSAoYXMgc3VwcGxpZWQgYnkgJ29zLnVuYW1lKCknKSwKLWFsdGhvdWdoIHRoZSBleGFjdCBpbmZvcm1hdGlvbiBpbmNsdWRlZCBkZXBlbmRzIG9uIHRoZSBPUzsgZWcuIGZvciBJUklYCi10aGUgYXJjaGl0ZWN0dXJlIGlzbid0IHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgKElSSVggb25seSBydW5zIG9uIFNHSQotaGFyZHdhcmUpLCBidXQgZm9yIExpbnV4IHRoZSBrZXJuZWwgdmVyc2lvbiBpc24ndCBwYXJ0aWN1bGFybHkKLWltcG9ydGFudC4KLQotRXhhbXBsZXMgb2YgcmV0dXJuZWQgdmFsdWVzOgotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSBcY29kZXtsaW51eC1pNTg2fQotXGl0ZW0gXGNvZGV7bGludXgtYWxwaGF9Ci1caXRlbSBcY29kZXtzb2xhcmlzLTIuNi1zdW40dX0KLVxpdGVtIFxjb2Rle2lyaXgtNS4zfQotXGl0ZW0gXGNvZGV7aXJpeDY0LTYuMn0KLVxlbmR7aXRlbWl6ZX0KLQotRm9yIG5vbi1cUE9TSVh7fSBwbGF0Zm9ybXMsIGN1cnJlbnRseSBqdXN0IHJldHVybnMgXGNvZGV7c3lzLnBsYXRmb3JtfS4KLSUgWFhYIGlzbid0IHRoaXMgYWxzbyBwcm92aWRlZCBieSBzb21lIG90aGVyIG5vbi1kaXN0dXRpbHMgbW9kdWxlPwotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtjb252ZXJ0X3BhdGh9e3BhdGhuYW1lfQotUmV0dXJuICdwYXRobmFtZScgYXMgYSBuYW1lIHRoYXQgd2lsbCB3b3JrIG9uIHRoZSBuYXRpdmUgZmlsZXN5c3RlbSwKLWkuZS4gc3BsaXQgaXQgb24gJy8nIGFuZCBwdXQgaXQgYmFjayB0b2dldGhlciBhZ2FpbiB1c2luZyB0aGUgY3VycmVudAotZGlyZWN0b3J5IHNlcGFyYXRvci4gIE5lZWRlZCBiZWNhdXNlIGZpbGVuYW1lcyBpbiB0aGUgc2V0dXAgc2NyaXB0IGFyZQotYWx3YXlzIHN1cHBsaWVkIGluIFxVTklYe30gc3R5bGUsIGFuZCBoYXZlIHRvIGJlIGNvbnZlcnRlZCB0byB0aGUgbG9jYWwKLWNvbnZlbnRpb24gYmVmb3JlIHdlIGNhbiBhY3R1YWxseSB1c2UgdGhlbSBpbiB0aGUgZmlsZXN5c3RlbS4gIFJhaXNlcwotXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSBvbiBub24tXFVOSVgtaXNoIHN5c3RlbXMgaWYgXHZhcntwYXRobmFtZX0gZWl0aGVyIAotc3RhcnRzIG9yIGVuZHMgd2l0aCBhIHNsYXNoLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtjaGFuZ2Vfcm9vdH17bmV3X3Jvb3QsIHBhdGhuYW1lfQotUmV0dXJuIFx2YXJ7cGF0aG5hbWV9IHdpdGggXHZhcntuZXdfcm9vdH0gcHJlcGVuZGVkLiAgSWYgXHZhcntwYXRobmFtZX0gaXMKLXJlbGF0aXZlLCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gXHNhbXB7b3MucGF0aC5qb2luKG5ld19yb290LHBhdGhuYW1lKX0KLU90aGVyd2lzZSwgaXQgcmVxdWlyZXMgbWFraW5nIFx2YXJ7cGF0aG5hbWV9IHJlbGF0aXZlIGFuZCB0aGVuIGpvaW5pbmcgdGhlCi10d28sIHdoaWNoIGlzIHRyaWNreSBvbiBET1MvV2luZG93cy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y2hlY2tfZW52aXJvbn17fQotRW5zdXJlIHRoYXQgJ29zLmVudmlyb24nIGhhcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB3ZQotZ3VhcmFudGVlIHRoYXQgdXNlcnMgY2FuIHVzZSBpbiBjb25maWcgZmlsZXMsIGNvbW1hbmQtbGluZSBvcHRpb25zLAotZXRjLiAgQ3VycmVudGx5IHRoaXMgaW5jbHVkZXM6Ci1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtIFxlbnZ2YXJ7SE9NRX0gLSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkgKFxVTklYe30gb25seSkKLVxpdGVtIFxlbnZ2YXJ7UExBVH0gLSBkZXNjcmlwdGlvbiBvZiB0aGUgY3VycmVudCBwbGF0Zm9ybSwgaW5jbHVkaW5nCi0gICAgICBoYXJkd2FyZSBhbmQgT1MgKHNlZSBcZnVuY3Rpb257Z2V0X3BsYXRmb3JtKCl9KQotXGVuZHtpdGVtaXplfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzdWJzdF92YXJzfXtzLCBsb2NhbF92YXJzfQotUGVyZm9ybSBzaGVsbC9QZXJsLXN0eWxlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbiBvbiBcdmFye3N9LiAgRXZlcnkKLW9jY3VycmVuY2Ugb2YgXGNvZGV7XCR9IGZvbGxvd2VkIGJ5IGEgbmFtZSBpcyBjb25zaWRlcmVkIGEgdmFyaWFibGUsIGFuZAotdmFyaWFibGUgaXMgc3Vic3RpdHV0ZWQgYnkgdGhlIHZhbHVlIGZvdW5kIGluIHRoZSBcdmFye2xvY2FsX3ZhcnN9Ci1kaWN0aW9uYXJ5LCBvciBpbiBcY29kZXtvcy5lbnZpcm9ufSBpZiBpdCdzIG5vdCBpbiBcdmFye2xvY2FsX3ZhcnN9LgotXHZhcntvcy5lbnZpcm9ufSBpcyBmaXJzdCBjaGVja2VkL2F1Z21lbnRlZCB0byBndWFyYW50ZWUgdGhhdCBpdCBjb250YWlucwotY2VydGFpbiB2YWx1ZXM6IHNlZSBcZnVuY3Rpb257Y2hlY2tfZW52aXJvbigpfS4gIFJhaXNlIFxleGNlcHRpb257VmFsdWVFcnJvcn0gCi1mb3IgYW55IHZhcmlhYmxlcyBub3QgZm91bmQgaW4gZWl0aGVyIFx2YXJ7bG9jYWxfdmFyc30gb3IgXGNvZGV7b3MuZW52aXJvbn0uCi0KLU5vdGUgdGhhdCB0aGlzIGlzIG5vdCBhIGZ1bGx5LWZsZWRnZWQgc3RyaW5nIGludGVycG9sYXRpb24gZnVuY3Rpb24uIEEKLXZhbGlkIFxjb2Rle1wkdmFyaWFibGV9IGNhbiBjb25zaXN0IG9ubHkgb2YgdXBwZXIgYW5kIGxvd2VyIGNhc2UgbGV0dGVycywKLW51bWJlcnMgYW5kIGFuIHVuZGVyc2NvcmUuIE5vIFx7IFx9IG9yICggKSBzdHlsZSBxdW90aW5nIGlzIGF2YWlsYWJsZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z3Jva19lbnZpcm9ubWVudF9lcnJvcn17ZXhjXG9wdGlvbmFseywgcHJlZml4PVxzYW1weydlcnJvcjogJ319fQotR2VuZXJhdGUgYSB1c2VmdWwgZXJyb3IgbWVzc2FnZSBmcm9tIGFuIFxleGNlcHRpb257RW52aXJvbm1lbnRFcnJvcn0gCi0oXGV4Y2VwdGlvbntJT0Vycm9yfSBvciBcZXhjZXB0aW9ue09TRXJyb3J9KSBleGNlcHRpb24gb2JqZWN0LiAgCi1IYW5kbGVzIFB5dGhvbiAxLjUuMSBhbmQgbGF0ZXIgc3R5bGVzLCBhbmQgZG9lcyB3aGF0IGl0IGNhbiB0byBkZWFsIHdpdGggCi1leGNlcHRpb24gb2JqZWN0cyB0aGF0IGRvbid0IGhhdmUgYSBmaWxlbmFtZSAod2hpY2ggaGFwcGVucyB3aGVuIHRoZSBlcnJvciAKLWlzIGR1ZSB0byBhIHR3by1maWxlIG9wZXJhdGlvbiwgc3VjaCBhcyBcZnVuY3Rpb257cmVuYW1lKCl9IG9yIAotXGZ1bmN0aW9ue2xpbmsoKX0pLiAgUmV0dXJucyB0aGUgZXJyb3IgbWVzc2FnZSBhcyBhIHN0cmluZyBwcmVmaXhlZCAKLXdpdGggXHZhcntwcmVmaXh9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzcGxpdF9xdW90ZWR9e3N9Ci1TcGxpdCBhIHN0cmluZyB1cCBhY2NvcmRpbmcgdG8gXFVOSVh7fSBzaGVsbC1saWtlIHJ1bGVzIGZvciBxdW90ZXMgYW5kCi1iYWNrc2xhc2hlcy4gIEluIHNob3J0OiB3b3JkcyBhcmUgZGVsaW1pdGVkIGJ5IHNwYWNlcywgYXMgbG9uZyBhcyB0aG9zZQotc3BhY2VzIGFyZSBub3QgZXNjYXBlZCBieSBhIGJhY2tzbGFzaCwgb3IgaW5zaWRlIGEgcXVvdGVkIHN0cmluZy4KLVNpbmdsZSBhbmQgZG91YmxlIHF1b3RlcyBhcmUgZXF1aXZhbGVudCwgYW5kIHRoZSBxdW90ZSBjaGFyYWN0ZXJzIGNhbgotYmUgYmFja3NsYXNoLWVzY2FwZWQuICBUaGUgYmFja3NsYXNoIGlzIHN0cmlwcGVkIGZyb20gYW55IHR3by1jaGFyYWN0ZXIKLWVzY2FwZSBzZXF1ZW5jZSwgbGVhdmluZyBvbmx5IHRoZSBlc2NhcGVkIGNoYXJhY3Rlci4gIFRoZSBxdW90ZQotY2hhcmFjdGVycyBhcmUgc3RyaXBwZWQgZnJvbSBhbnkgcXVvdGVkIHN0cmluZy4gIFJldHVybnMgYSBsaXN0IG9mCi13b3Jkcy4KLSUgU2hvdWxkIHByb2JhYmx5IGJlIG1vdmVkIGludG8gdGhlIHN0YW5kYXJkIGxpYnJhcnkuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2V4ZWN1dGV9e2Z1bmMsIGFyZ3Ncb3B0aW9uYWx7LCBtc2c9XGNvZGV7Tm9uZX0sIHZlcmJvc2U9XGNvZGV7MH0sIGRyeV9ydW49XGNvZGV7MH19fQotUGVyZm9ybSBzb21lIGFjdGlvbiB0aGF0IGFmZmVjdHMgdGhlIG91dHNpZGUgd29ybGQgKGZvciBpbnN0YW5jZSwKLXdyaXRpbmcgdG8gdGhlIGZpbGVzeXN0ZW0pLiAgU3VjaCBhY3Rpb25zIGFyZSBzcGVjaWFsIGJlY2F1c2UgdGhleQotYXJlIGRpc2FibGVkIGJ5IHRoZSBcdmFye2RyeV9ydW59IGZsYWcuICBUaGlzIG1ldGhvZCB0YWtlcyAKLWNhcmUgb2YgYWxsIHRoYXQgYnVyZWF1Y3JhY3kgZm9yIHlvdTsgYWxsIHlvdSBoYXZlIHRvIGRvIGlzIHN1cHBseSB0aGUKLWZ1bmN0aW9uIHRvIGNhbGwgYW5kIGFuIGFyZ3VtZW50IHR1cGxlIGZvciBpdCAodG8gZW1ib2R5IHRoZQotYGBleHRlcm5hbCBhY3Rpb24nJyBiZWluZyBwZXJmb3JtZWQpLCBhbmQgYW4gb3B0aW9uYWwgbWVzc2FnZSB0bwotcHJpbnQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3N0cnRvYm9vbH17dmFsfQotQ29udmVydCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0cnV0aCB0byB0cnVlICgxKSBvciBmYWxzZSAoMCkuCi0KLVRydWUgdmFsdWVzIGFyZSBcY29kZXt5fSwgXGNvZGV7eWVzfSwgXGNvZGV7dH0sIFxjb2Rle3RydWV9LCBcY29kZXtvbn0gCi1hbmQgXGNvZGV7MX07IGZhbHNlIHZhbHVlcyBhcmUgXGNvZGV7bn0sIFxjb2Rle25vfSwgXGNvZGV7Zn0sIFxjb2Rle2ZhbHNlfSwgCi1cY29kZXtvZmZ9IGFuZCBcY29kZXswfS4gIFJhaXNlcyBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IGlmIFx2YXJ7dmFsfSAKLWlzIGFueXRoaW5nIGVsc2UuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2J5dGVfY29tcGlsZX17cHlfZmlsZXNcb3B0aW9uYWx7LAotICAgICAgICAgICAgICBvcHRpbWl6ZT1cY29kZXswfSwgZm9yY2U9XGNvZGV7MH0sCi0gICAgICAgICAgICAgIHByZWZpeD1cY29kZXtOb25lfSwgYmFzZV9kaXI9XGNvZGV7Tm9uZX0sCi0gICAgICAgICAgICAgIHZlcmJvc2U9XGNvZGV7MX0sIGRyeV9ydW49XGNvZGV7MH0sCi0gICAgICAgICAgICAgIGRpcmVjdD1cY29kZXtOb25lfX19Ci1CeXRlLWNvbXBpbGUgYSBjb2xsZWN0aW9uIG9mIFB5dGhvbiBzb3VyY2UgZmlsZXMgdG8gZWl0aGVyIFxmaWxley5weWN9Ci1vciBcZmlsZXsucHlvfSBmaWxlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuICBcdmFye3B5X2ZpbGVzfSBpcyBhIGxpc3Qgb2YgZmlsZXMKLXRvIGNvbXBpbGU7IGFueSBmaWxlcyB0aGF0IGRvbid0IGVuZCBpbiBcZmlsZXsucHl9IGFyZSBzaWxlbnRseSBza2lwcGVkLgotXHZhcntvcHRpbWl6ZX0gbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLVxiZWdpbntpdGVtaXplfQotXGl0ZW0gXGNvZGV7MH0gLSBkb24ndCBvcHRpbWl6ZSAoZ2VuZXJhdGUgXGZpbGV7LnB5Y30pCi1caXRlbSBcY29kZXsxfSAtIG5vcm1hbCBvcHRpbWl6YXRpb24gKGxpa2UgXHNhbXB7cHl0aG9uIC1PfSkKLVxpdGVtIFxjb2RlezJ9IC0gZXh0cmEgb3B0aW1pemF0aW9uIChsaWtlIFxzYW1we3B5dGhvbiAtT099KQotXGVuZHtpdGVtaXplfQotCi1JZiBcdmFye2ZvcmNlfSBpcyB0cnVlLCBhbGwgZmlsZXMgYXJlIHJlY29tcGlsZWQgcmVnYXJkbGVzcyBvZgotdGltZXN0YW1wcy4KLQotVGhlIHNvdXJjZSBmaWxlbmFtZSBlbmNvZGVkIGluIGVhY2ggYnl0ZWNvZGUgZmlsZSBkZWZhdWx0cyB0byB0aGUKLWZpbGVuYW1lcyBsaXN0ZWQgaW4gXHZhcntweV9maWxlc307IHlvdSBjYW4gbW9kaWZ5IHRoZXNlIHdpdGggXHZhcntwcmVmaXh9IGFuZAotXHZhcntiYXNlZGlyfS4gIFx2YXJ7cHJlZml4fSBpcyBhIHN0cmluZyB0aGF0IHdpbGwgYmUgc3RyaXBwZWQgb2ZmIG9mIGVhY2gKLXNvdXJjZSBmaWxlbmFtZSwgYW5kIFx2YXJ7YmFzZV9kaXJ9IGlzIGEgZGlyZWN0b3J5IG5hbWUgdGhhdCB3aWxsIGJlCi1wcmVwZW5kZWQgKGFmdGVyIFx2YXJ7cHJlZml4fSBpcyBzdHJpcHBlZCkuICBZb3UgY2FuIHN1cHBseSBlaXRoZXIgb3IgYm90aAotKG9yIG5laXRoZXIpIG9mIFx2YXJ7cHJlZml4fSBhbmQgXHZhcntiYXNlX2Rpcn0sIGFzIHlvdSB3aXNoLgotCi1JZiBcdmFye2RyeV9ydW59IGlzIHRydWUsIGRvZXNuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgdGhhdCB3b3VsZAotYWZmZWN0IHRoZSBmaWxlc3lzdGVtLgotCi1CeXRlLWNvbXBpbGF0aW9uIGlzIGVpdGhlciBkb25lIGRpcmVjdGx5IGluIHRoaXMgaW50ZXJwcmV0ZXIgcHJvY2Vzcwotd2l0aCB0aGUgc3RhbmRhcmQgXG1vZHVsZXtweV9jb21waWxlfSBtb2R1bGUsIG9yIGluZGlyZWN0bHkgYnkgd3JpdGluZyBhCi10ZW1wb3Jhcnkgc2NyaXB0IGFuZCBleGVjdXRpbmcgaXQuICBOb3JtYWxseSwgeW91IHNob3VsZCBsZXQKLVxmdW5jdGlvbntieXRlX2NvbXBpbGUoKX0gZmlndXJlIG91dCB0byB1c2UgZGlyZWN0IGNvbXBpbGF0aW9uIG9yIG5vdCAoc2VlCi10aGUgc291cmNlIGZvciBkZXRhaWxzKS4gIFRoZSBcdmFye2RpcmVjdH0gZmxhZyBpcyB1c2VkIGJ5IHRoZSBzY3JpcHQKLWdlbmVyYXRlZCBpbiBpbmRpcmVjdCBtb2RlOyB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcsIGxlYXZlCi1pdCBzZXQgdG8gXGNvZGV7Tm9uZX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3JmYzgyMl9lc2NhcGV9e2hlYWRlcn0KLVJldHVybiBhIHZlcnNpb24gb2YgXHZhcntoZWFkZXJ9IGVzY2FwZWQgZm9yIGluY2x1c2lvbiBpbiBhbgotXHJmY3s4MjJ9IGhlYWRlciwgYnkgZW5zdXJpbmcgdGhlcmUgYXJlIDggc3BhY2VzIHNwYWNlIGFmdGVyIGVhY2ggbmV3bGluZS4KLU5vdGUgdGhhdCBpdCBkb2VzIG5vIG90aGVyIG1vZGlmaWNhdGlvbiBvZiB0aGUgc3RyaW5nLgotJSB0aGlzIF9jYW5fIGJlIHJlcGxhY2VkCi1cZW5ke2Z1bmNkZXNjfQotCi0lXHN1YnNlY3Rpb257RGlzdHV0aWxzIG9iamVjdHN9Ci0KLVxzZWN0aW9ue1xtb2R1bGV7ZGlzdHV0aWxzLmRpc3R9IC0tLSBUaGUgRGlzdHJpYnV0aW9uIGNsYXNzfQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2Rpc3R1dGlscy5kaXN0fQotXG1vZHVsZXN5bm9wc2lze1Byb3ZpZGVzIHRoZSBEaXN0cmlidXRpb24gY2xhc3MsIHdoaWNoIHJlcHJlc2VudHMgdGhlCi0gICAgICAgICAgICAgICAgbW9kdWxlIGRpc3RyaWJ1dGlvbiBiZWluZyBidWlsdC9pbnN0YWxsZWQvZGlzdHJpYnV0ZWR9Ci0KLVRoaXMgbW9kdWxlIHByb3ZpZGVzIHRoZSBcY2xhc3N7RGlzdHJpYnV0aW9ufSBjbGFzcywgd2hpY2ggcmVwcmVzZW50cwotdGhlIG1vZHVsZSBkaXN0cmlidXRpb24gYmVpbmcgYnVpbHQvaW5zdGFsbGVkL2Rpc3RyaWJ1dGVkLgotCi0KLVxzZWN0aW9ue1xtb2R1bGV7ZGlzdHV0aWxzLmV4dGVuc2lvbn0gLS0tIFRoZSBFeHRlbnNpb24gY2xhc3N9Ci1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZGlzdHV0aWxzLmV4dGVuc2lvbn0KLVxtb2R1bGVzeW5vcHNpc3tQcm92aWRlcyB0aGUgRXh0ZW5zaW9uIGNsYXNzLCB1c2VkIHRvIGRlc2NyaWJlCi0gICAgICAgICAgICAgICAgQy9cQ3Bwe30gZXh0ZW5zaW9uIG1vZHVsZXMgaW4gc2V0dXAgc2NyaXB0c30KLQotVGhpcyBtb2R1bGUgcHJvdmlkZXMgdGhlIFxjbGFzc3tFeHRlbnNpb259IGNsYXNzLCB1c2VkIHRvIGRlc2NyaWJlCi1DL1xDcHB7fSBleHRlbnNpb24gbW9kdWxlcyBpbiBzZXR1cCBzY3JpcHRzLgotCi0lXHN1YnNlY3Rpb257VW5ncm91cGVkIG1vZHVsZXN9Ci0lVGhlIGZvbGxvd2luZyBoYXZlbid0IGJlZW4gbW92ZWQgaW50byBhIG1vcmUgYXBwcm9wcmlhdGUgc2VjdGlvbiB5ZXQuCi0KLVxzZWN0aW9ue1xtb2R1bGV7ZGlzdHV0aWxzLmRlYnVnfSAtLS0gRGlzdHV0aWxzIGRlYnVnIG1vZGV9Ci1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZGlzdHV0aWxzLmRlYnVnfQotXG1vZHVsZXN5bm9wc2lze1Byb3ZpZGVzIHRoZSBkZWJ1ZyBmbGFnIGZvciBkaXN0dXRpbHN9Ci0KLVRoaXMgbW9kdWxlIHByb3ZpZGVzIHRoZSBERUJVRyBmbGFnLgotCi1cc2VjdGlvbntcbW9kdWxle2Rpc3R1dGlscy5lcnJvcnN9IC0tLSBEaXN0dXRpbHMgZXhjZXB0aW9uc30KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtkaXN0dXRpbHMuZXJyb3JzfQotXG1vZHVsZXN5bm9wc2lze1Byb3ZpZGVzIHN0YW5kYXJkIGRpc3R1dGlscyBleGNlcHRpb25zfQotCi1Qcm92aWRlcyBleGNlcHRpb25zIHVzZWQgYnkgdGhlIERpc3R1dGlscyBtb2R1bGVzLiAgTm90ZSB0aGF0IERpc3R1dGlscwotbW9kdWxlcyBtYXkgcmFpc2Ugc3RhbmRhcmQgZXhjZXB0aW9uczsgaW4gcGFydGljdWxhciwgU3lzdGVtRXhpdCBpcwotdXN1YWxseSByYWlzZWQgZm9yIGVycm9ycyB0aGF0IGFyZSBvYnZpb3VzbHkgdGhlIGVuZC11c2VyJ3MgZmF1bHQKLShlZy4gYmFkIGNvbW1hbmQtbGluZSBhcmd1bWVudHMpLgotCi1UaGlzIG1vZHVsZSBpcyBzYWZlIHRvIHVzZSBpbiBcc2FtcHtmcm9tIC4uLiBpbXBvcnQgKn0gbW9kZTsgaXQgb25seSBleHBvcnRzCi1zeW1ib2xzIHdob3NlIG5hbWVzIHN0YXJ0IHdpdGggXGNvZGV7RGlzdHV0aWxzfSBhbmQgZW5kIHdpdGggXGNvZGV7RXJyb3J9LgotCi1cc2VjdGlvbntcbW9kdWxle2Rpc3R1dGlscy5mYW5jeV9nZXRvcHR9Ci0gICAgICAgICAtLS0gV3JhcHBlciBhcm91bmQgdGhlIHN0YW5kYXJkIGdldG9wdCBtb2R1bGV9Ci1cZGVjbGFyZW1vZHVsZVtkaXN0dXRpbHMuZmFuY3lnZXRvcHRde3N0YW5kYXJkfXtkaXN0dXRpbHMuZmFuY3lfZ2V0b3B0fQotXG1vZHVsZXN5bm9wc2lze0FkZGl0aW9uYWwgXG1vZHVsZXtnZXRvcHR9IGZ1bmN0aW9uYWxpdHl9Ci0KLVRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgd3JhcHBlciBhcm91bmQgdGhlIHN0YW5kYXJkIFxtb2R1bGV7Z2V0b3B0fSAKLW1vZHVsZSB0aGF0IHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBmZWF0dXJlczoKLQotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSBzaG9ydCBhbmQgbG9uZyBvcHRpb25zIGFyZSB0aWVkIHRvZ2V0aGVyCi1caXRlbSBvcHRpb25zIGhhdmUgaGVscCBzdHJpbmdzLCBzbyBcZnVuY3Rpb257ZmFuY3lfZ2V0b3B0fSBjb3VsZCBwb3RlbnRpYWxseSAKLWNyZWF0ZSBhIGNvbXBsZXRlIHVzYWdlIHN1bW1hcnkKLVxpdGVtIG9wdGlvbnMgc2V0IGF0dHJpYnV0ZXMgb2YgYSBwYXNzZWQtaW4gb2JqZWN0Ci1caXRlbSBib29sZWFuIG9wdGlvbnMgY2FuIGhhdmUgYGBuZWdhdGl2ZSBhbGlhc2VzJycgLS0tIGVnLiBpZgotXGxvbmdwcm9ncmFtb3B0e3F1aWV0fSBpcyB0aGUgYGBuZWdhdGl2ZSBhbGlhcycnIG9mCi1cbG9uZ3Byb2dyYW1vcHR7dmVyYm9zZX0sIHRoZW4gXGxvbmdwcm9ncmFtb3B0e3F1aWV0fSBvbiB0aGUgY29tbWFuZAotbGluZSBzZXRzIFx2YXJ7dmVyYm9zZX0gdG8gZmFsc2UuCi0KLVxlbmR7aXRlbWl6ZX0KLQotXFhYWHtTaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBcbW9kdWxle29wdGlrfSAod2hpY2ggaXMgYWxzbyBub3cKLWtub3duIGFzIFxtb2R1bGV7b3B0cGFyc2V9IGluIFB5dGhvbiAyLjMgYW5kIGxhdGVyKS59Ci0KLVxiZWdpbntmdW5jZGVzY317ZmFuY3lfZ2V0b3B0fXtvcHRpb25zLCBuZWdhdGl2ZV9vcHQsIG9iamVjdCwgYXJnc30KLVdyYXBwZXIgZnVuY3Rpb24uIFx2YXJ7b3B0aW9uc30gaXMgYSBsaXN0IG9mCi1cc2FtcHsobG9uZ19vcHRpb24sIHNob3J0X29wdGlvbiwgaGVscF9zdHJpbmcpfSAzLXR1cGxlcyBhcyBkZXNjcmliZWQgaW4gdGhlCi1jb25zdHJ1Y3RvciBmb3IgXGNsYXNze0ZhbmN5R2V0b3B0fS4gXHZhcntuZWdhdGl2ZV9vcHR9IHNob3VsZCBiZSBhIGRpY3Rpb25hcnkKLW1hcHBpbmcgb3B0aW9uIG5hbWVzIHRvIG9wdGlvbiBuYW1lcywgYm90aCB0aGUga2V5IGFuZCB2YWx1ZSBzaG91bGQgYmUgaW4gdGhlCi1cdmFye29wdGlvbnN9IGxpc3QuIFx2YXJ7b2JqZWN0fSBpcyBhbiBvYmplY3Qgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHN0b3JlCi12YWx1ZXMgKHNlZSB0aGUgXG1ldGhvZHtnZXRvcHQoKX0gbWV0aG9kIG9mIHRoZSBcY2xhc3N7RmFuY3lHZXRvcHR9IGNsYXNzKS4KLVx2YXJ7YXJnc30gaXMgdGhlIGFyZ3VtZW50IGxpc3QuIFdpbGwgdXNlIFxjb2Rle3N5cy5hcmd2WzE6XX0gaWYgeW91IAotcGFzcyBcY29kZXtOb25lfSBhcyBcdmFye2FyZ3N9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt3cmFwX3RleHR9e3RleHQsIHdpZHRofQotV3JhcHMgXHZhcnt0ZXh0fSB0byBsZXNzIHRoYW4gXHZhcnt3aWR0aH0gd2lkZS4KLQotXHdhcm5pbmd7U2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggXG1vZHVsZXt0ZXh0d3JhcH0gKHdoaWNoIGlzIGF2YWlsYWJsZSAKLWluIFB5dGhvbiAyLjMgYW5kIGxhdGVyKS59Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtGYW5jeUdldG9wdH17XG9wdGlvbmFse29wdGlvbl90YWJsZT1cY29kZXtOb25lfX19Ci1UaGUgb3B0aW9uX3RhYmxlIGlzIGEgbGlzdCBvZiAzLXR1cGxlczogXHNhbXB7KGxvbmdfb3B0aW9uLAotc2hvcnRfb3B0aW9uLCBoZWxwX3N0cmluZyl9Ci0KLUlmIGFuIG9wdGlvbiB0YWtlcyBhbiBhcmd1bWVudCwgaXRzIFx2YXJ7bG9uZ19vcHRpb259IHNob3VsZCBoYXZlIFxjb2Rleyc9J30KLWFwcGVuZGVkOyBcdmFye3Nob3J0X29wdGlvbn0gc2hvdWxkIGp1c3QgYmUgYSBzaW5nbGUgY2hhcmFjdGVyLCBubyBcY29kZXsnOid9Ci1pbiBhbnkgY2FzZS4gXHZhcntzaG9ydF9vcHRpb259IHNob3VsZCBiZSBcY29kZXtOb25lfSBpZiBhIFx2YXJ7bG9uZ19vcHRpb259IAotZG9lc24ndCBoYXZlIGEgY29ycmVzcG9uZGluZyBcdmFye3Nob3J0X29wdGlvbn0uIEFsbCBvcHRpb24gdHVwbGVzIG11c3QgaGF2ZQotbG9uZyBvcHRpb25zLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVRoZSBcY2xhc3N7RmFuY3lHZXRvcHR9IGNsYXNzIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLQotXGJlZ2lue21ldGhvZGRlc2N9e2dldG9wdH17XG9wdGlvbmFse2FyZ3M9XGNvZGV7Tm9uZX0sIG9iamVjdD1cY29kZXtOb25lfX19Ci1QYXJzZSBjb21tYW5kLWxpbmUgb3B0aW9ucyBpbiBhcmdzLiBTdG9yZSBhcyBhdHRyaWJ1dGVzIG9uIFx2YXJ7b2JqZWN0fS4KLQotSWYgXHZhcnthcmdzfSBpcyBcY29kZXtOb25lfSBvciBub3Qgc3VwcGxpZWQsIHVzZXMgXGNvZGV7c3lzLmFyZ3ZbMTpdfS4gIElmCi1cdmFye29iamVjdH0gaXMgXGNvZGV7Tm9uZX0gb3Igbm90IHN1cHBsaWVkLCBjcmVhdGVzIGEgbmV3IFxjbGFzc3tPcHRpb25EdW1teX0KLWluc3RhbmNlLCBzdG9yZXMgb3B0aW9uIHZhbHVlcyB0aGVyZSwgYW5kIHJldHVybnMgYSB0dXBsZSBcc2FtcHsoYXJncywKLW9iamVjdCl9LiAgSWYgXHZhcntvYmplY3R9IGlzIHN1cHBsaWVkLCBpdCBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQKLVxmdW5jdGlvbntnZXRvcHQoKX0ganVzdCByZXR1cm5zIFx2YXJ7YXJnc307IGluIGJvdGggY2FzZXMsIHRoZSByZXR1cm5lZAotXHZhcnthcmdzfSBpcyBhIG1vZGlmaWVkIGNvcHkgb2YgdGhlIHBhc3NlZC1pbiBcdmFye2FyZ3N9IGxpc3QsIHdoaWNoCi1pcyBsZWZ0IHVudG91Y2hlZC4KLSUgYW5kIGFyZ3MgcmV0dXJuZWQgYXJlPwotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Z2V0X29wdGlvbl9vcmRlcn17fQotUmV0dXJucyB0aGUgbGlzdCBvZiBcc2FtcHsob3B0aW9uLCB2YWx1ZSl9IHR1cGxlcyBwcm9jZXNzZWQgYnkgdGhlCi1wcmV2aW91cyBydW4gb2YgXG1ldGhvZHtnZXRvcHQoKX0gIFJhaXNlcyBcZXhjZXB0aW9ue1J1bnRpbWVFcnJvcn0gaWYKLVxtZXRob2R7Z2V0b3B0KCl9IGhhc24ndCBiZWVuIGNhbGxlZCB5ZXQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtnZW5lcmF0ZV9oZWxwfXtcb3B0aW9uYWx7aGVhZGVyPVxjb2Rle05vbmV9fX0KLUdlbmVyYXRlIGhlbHAgdGV4dCAoYSBsaXN0IG9mIHN0cmluZ3MsIG9uZSBwZXIgc3VnZ2VzdGVkIGxpbmUgb2YKLW91dHB1dCkgZnJvbSB0aGUgb3B0aW9uIHRhYmxlIGZvciB0aGlzIFxjbGFzc3tGYW5jeUdldG9wdH0gb2JqZWN0LgotCi1JZiBzdXBwbGllZCwgcHJpbnRzIHRoZSBzdXBwbGllZCBcdmFye2hlYWRlcn0gYXQgdGhlIHRvcCBvZiB0aGUgaGVscC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXHNlY3Rpb257XG1vZHVsZXtkaXN0dXRpbHMuZmlsZWxpc3R9IC0tLSBUaGUgRmlsZUxpc3QgY2xhc3N9Ci1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZGlzdHV0aWxzLmZpbGVsaXN0fQotXG1vZHVsZXN5bm9wc2lze1RoZSBcY2xhc3N7RmlsZUxpc3R9IGNsYXNzLCB1c2VkIGZvciBwb2tpbmcgYWJvdXQgdGhlCi0gICAgICAgICAgICAgICAgZmlsZSBzeXN0ZW0gYW5kIGJ1aWxkaW5nIGxpc3RzIG9mIGZpbGVzLn0KLQotVGhpcyBtb2R1bGUgcHJvdmlkZXMgdGhlIFxjbGFzc3tGaWxlTGlzdH0gY2xhc3MsIHVzZWQgZm9yIHBva2luZyBhYm91dAotdGhlIGZpbGVzeXN0ZW0gYW5kIGJ1aWxkaW5nIGxpc3RzIG9mIGZpbGVzLgotCi0KLVxzZWN0aW9ue1xtb2R1bGV7ZGlzdHV0aWxzLmxvZ30gLS0tIFNpbXBsZSBQRVAgMjgyLXN0eWxlIGxvZ2dpbmd9Ci1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZGlzdHV0aWxzLmxvZ30KLVxtb2R1bGVzeW5vcHNpc3tBIHNpbXBsZSBsb2dnaW5nIG1lY2hhbmlzbSwgXHBlcHsyODJ9LXN0eWxlfQotCi1cd2FybmluZ3tTaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBzdGFuZGFyZCBcbW9kdWxle2xvZ2dpbmd9IG1vZHVsZS59Ci0KLSVcc3Vic3Vic2VjdGlvbntcbW9kdWxle30gLS0tIH0KLSVcZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZGlzdHV0aWxzLm1hZ2ljfQotJVxtb2R1bGVzeW5vcHNpc3sgfQotCi0KLVxzZWN0aW9ue1xtb2R1bGV7ZGlzdHV0aWxzLnNwYXdufSAtLS0gU3Bhd24gYSBzdWItcHJvY2Vzc30KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtkaXN0dXRpbHMuc3Bhd259Ci1cbW9kdWxlc3lub3BzaXN7UHJvdmlkZXMgdGhlIHNwYXduKCkgZnVuY3Rpb259Ci0KLVRoaXMgbW9kdWxlIHByb3ZpZGVzIHRoZSBcZnVuY3Rpb257c3Bhd24oKX0gZnVuY3Rpb24sIGEgZnJvbnQtZW5kIHRvIAotdmFyaW91cyBwbGF0Zm9ybS1zcGVjaWZpYyBmdW5jdGlvbnMgZm9yIGxhdW5jaGluZyBhbm90aGVyIHByb2dyYW0gaW4gYSAKLXN1Yi1wcm9jZXNzLgotQWxzbyBwcm92aWRlcyBcZnVuY3Rpb257ZmluZF9leGVjdXRhYmxlKCl9IHRvIHNlYXJjaCB0aGUgcGF0aCBmb3IgYSBnaXZlbgotZXhlY3V0YWJsZSBuYW1lLgotCi0KLVxpbnB1dHtzeXNjb25maWd9Ci0KLQotXHNlY3Rpb257XG1vZHVsZXtkaXN0dXRpbHMudGV4dF9maWxlfSAtLS0gVGhlIFRleHRGaWxlIGNsYXNzfQotXGRlY2xhcmVtb2R1bGVbZGlzdHV0aWxzLnRleHRmaWxlXXtzdGFuZGFyZH17ZGlzdHV0aWxzLnRleHRfZmlsZX0KLVxtb2R1bGVzeW5vcHNpc3twcm92aWRlcyB0aGUgVGV4dEZpbGUgY2xhc3MsIGEgc2ltcGxlIGludGVyZmFjZSB0byB0ZXh0IGZpbGVzfQotCi1UaGlzIG1vZHVsZSBwcm92aWRlcyB0aGUgXGNsYXNze1RleHRGaWxlfSBjbGFzcywgd2hpY2ggZ2l2ZXMgYW4gaW50ZXJmYWNlIAotdG8gdGV4dCBmaWxlcyB0aGF0IChvcHRpb25hbGx5KSB0YWtlcyBjYXJlIG9mIHN0cmlwcGluZyBjb21tZW50cywgaWdub3JpbmcgCi1ibGFuayBsaW5lcywgYW5kIGpvaW5pbmcgbGluZXMgd2l0aCBiYWNrc2xhc2hlcy4KLQotXGJlZ2lue2NsYXNzZGVzY317VGV4dEZpbGV9e1xvcHRpb25hbHtmaWxlbmFtZT1cY29kZXtOb25lfSwgZmlsZT1cY29kZXtOb25lfSwgKipvcHRpb25zfX0KLVRoaXMgY2xhc3MgcHJvdmlkZXMgYSBmaWxlLWxpa2Ugb2JqZWN0IHRoYXQgdGFrZXMgY2FyZSBvZiBhbGwgCi10aGUgdGhpbmdzIHlvdSBjb21tb25seSB3YW50IHRvIGRvIHdoZW4gcHJvY2Vzc2luZyBhIHRleHQgZmlsZSAKLXRoYXQgaGFzIHNvbWUgbGluZS1ieS1saW5lIHN5bnRheDogc3RyaXAgY29tbWVudHMgKGFzIGxvbmcgYXMgXGNvZGV7XCN9IAotaXMgeW91ciBjb21tZW50IGNoYXJhY3RlciksIHNraXAgYmxhbmsgbGluZXMsIGpvaW4gYWRqYWNlbnQgbGluZXMgYnkKLWVzY2FwaW5nIHRoZSBuZXdsaW5lIChpZS4gYmFja3NsYXNoIGF0IGVuZCBvZiBsaW5lKSwgc3RyaXAKLWxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIHdoaXRlc3BhY2UuICBBbGwgb2YgdGhlc2UgYXJlIG9wdGlvbmFsCi1hbmQgaW5kZXBlbmRlbnRseSBjb250cm9sbGFibGUuCi0KLVRoZSBjbGFzcyBwcm92aWRlcyBhIFxtZXRob2R7d2FybigpfSBtZXRob2Qgc28geW91IGNhbiBnZW5lcmF0ZSAKLXdhcm5pbmcgbWVzc2FnZXMgdGhhdCByZXBvcnQgcGh5c2ljYWwgbGluZSBudW1iZXIsIGV2ZW4gaWYgdGhlIAotbG9naWNhbCBsaW5lIGluIHF1ZXN0aW9uIHNwYW5zIG11bHRpcGxlIHBoeXNpY2FsIGxpbmVzLiAgQWxzbyAKLXByb3ZpZGVzIFxtZXRob2R7dW5yZWFkbGluZSgpfSBmb3IgaW1wbGVtZW50aW5nIGxpbmUtYXQtYS10aW1lIGxvb2thaGVhZC4KLQotXGNsYXNze1RleHRGaWxlfSBpbnN0YW5jZXMgYXJlIGNyZWF0ZSB3aXRoIGVpdGhlciBcdmFye2ZpbGVuYW1lfSwgXHZhcntmaWxlfSwKLW9yIGJvdGguIFxleGNlcHRpb257UnVudGltZUVycm9yfSBpcyByYWlzZWQgaWYgYm90aCBhcmUgXGNvZGV7Tm9uZX0uCi1cdmFye2ZpbGVuYW1lfSBzaG91bGQgYmUgYSBzdHJpbmcsIGFuZCBcdmFye2ZpbGV9IGEgZmlsZSBvYmplY3QgKG9yCi1zb21ldGhpbmcgdGhhdCBwcm92aWRlcyBcbWV0aG9ke3JlYWRsaW5lKCl9IGFuZCBcbWV0aG9ke2Nsb3NlKCl9IAotbWV0aG9kcykuICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSBzdXBwbHkgYXQgbGVhc3QgXHZhcntmaWxlbmFtZX0sIAotc28gdGhhdCBcY2xhc3N7VGV4dEZpbGV9IGNhbiBpbmNsdWRlIGl0IGluIHdhcm5pbmcgbWVzc2FnZXMuICBJZiAKLVx2YXJ7ZmlsZX0gaXMgbm90IHN1cHBsaWVkLCBcY2xhc3N7VGV4dEZpbGV9IGNyZWF0ZXMgaXRzIG93biB1c2luZyB0aGUgCi1cZnVuY3Rpb257b3BlbigpfSBidWlsdC1pbiBmdW5jdGlvbi4KLQotVGhlIG9wdGlvbnMgYXJlIGFsbCBib29sZWFuLCBhbmQgYWZmZWN0IHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkKLVxtZXRob2R7cmVhZGxpbmUoKX0KLQotXGJlZ2lue3RhYmxlaWlpfXtjfGx8bH17b3B0aW9uIG5hbWV9e29wdGlvbiBuYW1lfXtkZXNjcmlwdGlvbn17ZGVmYXVsdH0KLVxsaW5laWlpe3N0cmlwX2NvbW1lbnRzfXsKLXN0cmlwIGZyb20gXGNoYXJhY3RlcntcI30gdG8gZW5kLW9mLWxpbmUsIGFzIHdlbGwgYXMgYW55IHdoaXRlc3BhY2UKLWxlYWRpbmcgdXAgdG8gdGhlIFxjaGFyYWN0ZXJ7XCN9LS0tdW5sZXNzIGl0IGlzIGVzY2FwZWQgYnkgYSBiYWNrc2xhc2h9Ci17dHJ1ZX0KLVxsaW5laWlpe2xzdHJpcF93c317Ci1zdHJpcCBsZWFkaW5nIHdoaXRlc3BhY2UgZnJvbSBlYWNoIGxpbmUgYmVmb3JlIHJldHVybmluZyBpdH0KLXtmYWxzZX0KLVxsaW5laWlpe3JzdHJpcF93c317Ci1zdHJpcCB0cmFpbGluZyB3aGl0ZXNwYWNlIChpbmNsdWRpbmcgbGluZSB0ZXJtaW5hdG9yISkgZnJvbQotZWFjaCBsaW5lIGJlZm9yZSByZXR1cm5pbmcgaXQufQote3RydWV9Ci1cbGluZWlpaXtza2lwX2JsYW5rc317Ci1za2lwIGxpbmVzIHRoYXQgYXJlIGVtcHR5ICphZnRlciogc3RyaXBwaW5nIGNvbW1lbnRzIGFuZAotd2hpdGVzcGFjZS4gIChJZiBib3RoIGxzdHJpcF93cyBhbmQgcnN0cmlwX3dzIGFyZSBmYWxzZSwKLXRoZW4gc29tZSBsaW5lcyBtYXkgY29uc2lzdCBvZiBzb2xlbHkgd2hpdGVzcGFjZTogdGhlc2Ugd2lsbAotKm5vdCogYmUgc2tpcHBlZCwgZXZlbiBpZiBcdmFye3NraXBfYmxhbmtzfSBpcyB0cnVlLil9Ci17dHJ1ZX0KLVxsaW5laWlpe2pvaW5fbGluZXN9ewotaWYgYSBiYWNrc2xhc2ggaXMgdGhlIGxhc3Qgbm9uLW5ld2xpbmUgY2hhcmFjdGVyIG9uIGEgbGluZQotYWZ0ZXIgc3RyaXBwaW5nIGNvbW1lbnRzIGFuZCB3aGl0ZXNwYWNlLCBqb2luIHRoZSBmb2xsb3dpbmcgbGluZQotdG8gaXQgdG8gZm9ybSBvbmUgbG9naWNhbCBsaW5lOyBpZiBOIGNvbnNlY3V0aXZlIGxpbmVzIGVuZAotd2l0aCBhIGJhY2tzbGFzaCwgdGhlbiBOKzEgcGh5c2ljYWwgbGluZXMgd2lsbCBiZSBqb2luZWQgdG8KLWZvcm0gb25lIGxvZ2ljYWwgbGluZS59Ci17ZmFsc2V9Ci1cbGluZWlpaXtjb2xsYXBzZV9qb2lufXsKLXN0cmlwIGxlYWRpbmcgd2hpdGVzcGFjZSBmcm9tIGxpbmVzIHRoYXQgYXJlIGpvaW5lZCB0byB0aGVpcgotcHJlZGVjZXNzb3I7IG9ubHkgbWF0dGVycyBpZiBcc2FtcHsoam9pbl9saW5lcyBhbmQgbm90IGxzdHJpcF93cyl9fQote2ZhbHNlfQotXGVuZHt0YWJsZWlpaX0KLQotTm90ZSB0aGF0IHNpbmNlIFx2YXJ7cnN0cmlwX3dzfSBjYW4gc3RyaXAgdGhlIHRyYWlsaW5nIG5ld2xpbmUsIHRoZQotc2VtYW50aWNzIG9mIFxtZXRob2R7cmVhZGxpbmUoKX0gbXVzdCBkaWZmZXIgZnJvbSB0aG9zZSBvZiB0aGUgYnVpbHRpbiBmaWxlCi1vYmplY3QncyBcbWV0aG9ke3JlYWRsaW5lKCl9IG1ldGhvZCEgIEluIHBhcnRpY3VsYXIsIFxtZXRob2R7cmVhZGxpbmUoKX0gCi1yZXR1cm5zIFxjb2Rle05vbmV9IGZvciBlbmQtb2YtZmlsZTogYW4gZW1wdHkgc3RyaW5nIG1pZ2h0IGp1c3QgYmUgYSAKLWJsYW5rIGxpbmUgKG9yIGFuIGFsbC13aGl0ZXNwYWNlIGxpbmUpLCBpZiBcdmFye3JzdHJpcF93c30gaXMgdHJ1ZSAKLWJ1dCBcdmFye3NraXBfYmxhbmtzfSBpcyBub3QuCi0KLVxiZWdpbnttZXRob2RkZXNjfXtvcGVufXtmaWxlbmFtZX0KLU9wZW4gYSBuZXcgZmlsZSBcdmFye2ZpbGVuYW1lfS4gVGhpcyBvdmVycmlkZXMgYW55IFx2YXJ7ZmlsZX0gb3IgCi1cdmFye2ZpbGVuYW1lfSBjb25zdHJ1Y3RvciBhcmd1bWVudHMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtjbG9zZX17fQotQ2xvc2UgdGhlIGN1cnJlbnQgZmlsZSBhbmQgZm9yZ2V0IGV2ZXJ5dGhpbmcgd2Uga25vdyBhYm91dCBpdCAoaW5jbHVkaW5nCi10aGUgZmlsZW5hbWUgYW5kIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyKS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3dhcm59e21zZ1xvcHRpb25hbHssbGluZT1cY29kZXtOb25lfX19Ci1QcmludCAodG8gc3RkZXJyKSBhIHdhcm5pbmcgbWVzc2FnZSB0aWVkIHRvIHRoZSBjdXJyZW50IGxvZ2ljYWwKLWxpbmUgaW4gdGhlIGN1cnJlbnQgZmlsZS4gIElmIHRoZSBjdXJyZW50IGxvZ2ljYWwgbGluZSBpbiB0aGUKLWZpbGUgc3BhbnMgbXVsdGlwbGUgcGh5c2ljYWwgbGluZXMsIHRoZSB3YXJuaW5nIHJlZmVycyB0byB0aGUKLXdob2xlIHJhbmdlLCBzdWNoIGFzIFxzYW1weyJsaW5lcyAzLTUifS4gIElmIFx2YXJ7bGluZX0gaXMgc3VwcGxpZWQsIAotaXQgb3ZlcnJpZGVzIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyOyBpdCBtYXkgYmUgYSBsaXN0IG9yIHR1cGxlIAotdG8gaW5kaWNhdGUgYSByYW5nZSBvZiBwaHlzaWNhbCBsaW5lcywgb3IgYW4gaW50ZWdlciBmb3IgYSAKLXNpbmdsZSBwaHlzaWNhbCBsaW5lLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317cmVhZGxpbmV9e30KLVJlYWQgYW5kIHJldHVybiBhIHNpbmdsZSBsb2dpY2FsIGxpbmUgZnJvbSB0aGUgY3VycmVudCBmaWxlIChvcgotZnJvbSBhbiBpbnRlcm5hbCBidWZmZXIgaWYgbGluZXMgaGF2ZSBwcmV2aW91c2x5IGJlZW4gYGB1bnJlYWQnJwotd2l0aCBcbWV0aG9ke3VucmVhZGxpbmUoKX0pLiAgSWYgdGhlIFx2YXJ7am9pbl9saW5lc30gb3B0aW9uIAotaXMgdHJ1ZSwgdGhpcyBtYXkgaW52b2x2ZSByZWFkaW5nIG11bHRpcGxlIHBoeXNpY2FsIGxpbmVzIAotY29uY2F0ZW5hdGVkIGludG8gYSBzaW5nbGUgc3RyaW5nLiAgVXBkYXRlcyB0aGUgY3VycmVudCBsaW5lIG51bWJlciwgCi1zbyBjYWxsaW5nIFxtZXRob2R7d2FybigpfSBhZnRlciBcbWV0aG9ke3JlYWRsaW5lKCl9IGVtaXRzIGEgd2FybmluZyAKLWFib3V0IHRoZSBwaHlzaWNhbCBsaW5lKHMpIGp1c3QgcmVhZC4gIFJldHVybnMgXGNvZGV7Tm9uZX0gb24gZW5kLW9mLWZpbGUsIAotc2luY2UgdGhlIGVtcHR5IHN0cmluZyBjYW4gb2NjdXIgaWYgXHZhcntyc3RyaXBfd3N9IGlzIHRydWUgYnV0IAotXHZhcntzdHJpcF9ibGFua3N9IGlzIG5vdC4KLVxlbmR7bWV0aG9kZGVzY30KLVxiZWdpbnttZXRob2RkZXNjfXtyZWFkbGluZXN9e30KLVJlYWQgYW5kIHJldHVybiB0aGUgbGlzdCBvZiBhbGwgbG9naWNhbCBsaW5lcyByZW1haW5pbmcgaW4gdGhlIGN1cnJlbnQgZmlsZS4KLVRoaXMgdXBkYXRlcyB0aGUgY3VycmVudCBsaW5lIG51bWJlciB0byB0aGUgbGFzdCBsaW5lIG9mIHRoZSBmaWxlLgotXGVuZHttZXRob2RkZXNjfQotXGJlZ2lue21ldGhvZGRlc2N9e3VucmVhZGxpbmV9e2xpbmV9Ci1QdXNoIFx2YXJ7bGluZX0gKGEgc3RyaW5nKSBvbnRvIGFuIGludGVybmFsIGJ1ZmZlciB0aGF0IHdpbGwgYmUKLWNoZWNrZWQgYnkgZnV0dXJlIFxtZXRob2R7cmVhZGxpbmUoKX0gY2FsbHMuICBIYW5keSBmb3IgaW1wbGVtZW50aW5nCi1hIHBhcnNlciB3aXRoIGxpbmUtYXQtYS10aW1lIGxvb2thaGVhZC4gTm90ZSB0aGF0IGxpbmVzIHRoYXQgYXJlIGBgdW5yZWFkJycKLXdpdGggXG1ldGhvZHt1bnJlYWRsaW5lfSBhcmUgbm90IHN1YnNlcXVlbnRseSByZS1jbGVhbnNlZCAod2hpdGVzcGFjZSAKLXN0cmlwcGVkLCBvciB3aGF0ZXZlcikgd2hlbiByZWFkIHdpdGggXG1ldGhvZHtyZWFkbGluZX0uIElmIG11bHRpcGxlCi1jYWxscyBhcmUgbWFkZSB0byBcbWV0aG9ke3VucmVhZGxpbmV9IGJlZm9yZSBhIGNhbGwgdG8gXG1ldGhvZHtyZWFkbGluZX0sCi10aGUgbGluZXMgd2lsbCBiZSByZXR1cm5lZCBtb3N0IGluIG1vc3QgcmVjZW50IGZpcnN0IG9yZGVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cZW5ke2NsYXNzZGVzY30KLQotCi1cc2VjdGlvbntcbW9kdWxle2Rpc3R1dGlscy52ZXJzaW9ufSAtLS0gVmVyc2lvbiBudW1iZXIgY2xhc3Nlc30KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtkaXN0dXRpbHMudmVyc2lvbn0KLVxtb2R1bGVzeW5vcHNpc3tpbXBsZW1lbnRzIGNsYXNzZXMgdGhhdCByZXByZXNlbnQgbW9kdWxlIHZlcnNpb24gbnVtYmVycy4gfQotCi0lIHRvZG8KLQotJVxzZWN0aW9ue0Rpc3R1dGlscyBDb21tYW5kc30KLSUKLSVUaGlzIHBhcnQgb2YgRGlzdHV0aWxzIGltcGxlbWVudHMgdGhlIHZhcmlvdXMgRGlzdHV0aWxzIGNvbW1hbmRzLCBzdWNoCi0lYXMgXGNvZGV7YnVpbGR9LCBcY29kZXtpbnN0YWxsfSBcJmMuIEVhY2ggY29tbWFuZCBpcyBpbXBsZW1lbnRlZCBhcyBhCi0lc2VwYXJhdGUgbW9kdWxlLCB3aXRoIHRoZSBjb21tYW5kIG5hbWUgYXMgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZS4KLQotXHNlY3Rpb257XG1vZHVsZXtkaXN0dXRpbHMuY21kfSAtLS0gQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgRGlzdHV0aWxzIGNvbW1hbmRzfQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2Rpc3R1dGlscy5jbWR9Ci1cbW9kdWxlc3lub3BzaXN7VGhpcyBtb2R1bGUgcHJvdmlkZXMgdGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgQ29tbWFuZC4gVGhpcwotY2xhc3MgaXMgc3ViY2xhc3NlZCBieSB0aGUgbW9kdWxlcyBpbiB0aGUgXHJlZm1vZHVsZXtkaXN0dXRpbHMuY29tbWFuZH0gCi1zdWJwYWNrYWdlLiB9Ci0KLVRoaXMgbW9kdWxlIHN1cHBsaWVzIHRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIFxjbGFzc3tDb21tYW5kfS4gCi0KLVxiZWdpbntjbGFzc2Rlc2N9e0NvbW1hbmR9e2Rpc3R9Ci1BYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBkZWZpbmluZyBjb21tYW5kIGNsYXNzZXMsIHRoZSBgYHdvcmtlciBiZWVzJycKLW9mIHRoZSBEaXN0dXRpbHMuICBBIHVzZWZ1bCBhbmFsb2d5IGZvciBjb21tYW5kIGNsYXNzZXMgaXMgdG8gdGhpbmsgb2YKLXRoZW0gYXMgc3Vicm91dGluZXMgd2l0aCBsb2NhbCB2YXJpYWJsZXMgY2FsbGVkIFx2YXJ7b3B0aW9uc30uICBUaGUKLW9wdGlvbnMgYXJlIGRlY2xhcmVkIGluIFxtZXRob2R7aW5pdGlhbGl6ZV9vcHRpb25zKCl9IGFuZCBkZWZpbmVkCi0oZ2l2ZW4gdGhlaXIgZmluYWwgdmFsdWVzKSBpbiBcbWV0aG9ke2ZpbmFsaXplX29wdGlvbnMoKX0sIGJvdGggb2YKLXdoaWNoIG11c3QgYmUgZGVmaW5lZCBieSBldmVyeSBjb21tYW5kIGNsYXNzLiAgVGhlIGRpc3RpbmN0aW9uIGJldHdlZW4KLXRoZSB0d28gaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugb3B0aW9uIHZhbHVlcyBtaWdodCBjb21lIGZyb20gdGhlIG91dHNpZGUKLXdvcmxkIChjb21tYW5kIGxpbmUsIGNvbmZpZyBmaWxlLCAuLi4pLCBhbmQgYW55IG9wdGlvbnMgZGVwZW5kZW50IG9uCi1vdGhlciBvcHRpb25zIG11c3QgYmUgY29tcHV0ZWQgYWZ0ZXIgdGhlc2Ugb3V0c2lkZSBpbmZsdWVuY2VzIGhhdmUKLWJlZW4gcHJvY2Vzc2VkIC0tLSBoZW5jZSBcbWV0aG9ke2ZpbmFsaXplX29wdGlvbnMoKX0uICBUaGUgYm9keSBvZiB0aGUKLXN1YnJvdXRpbmUsIHdoZXJlIGl0IGRvZXMgYWxsIGl0cyB3b3JrIGJhc2VkIG9uIHRoZSB2YWx1ZXMgb2YgaXRzCi1vcHRpb25zLCBpcyB0aGUgXG1ldGhvZHtydW4oKX0gbWV0aG9kLCB3aGljaCBtdXN0IGFsc28gYmUgaW1wbGVtZW50ZWQKLWJ5IGV2ZXJ5IGNvbW1hbmQgY2xhc3MuCi0KLVRoZSBjbGFzcyBjb25zdHJ1Y3RvciB0YWtlcyBhIHNpbmdsZSBhcmd1bWVudCBcdmFye2Rpc3R9LCBhIAotXGNsYXNze0Rpc3RyaWJ1dGlvbn0gaW5zdGFuY2UuIAotXGVuZHtjbGFzc2Rlc2N9Ci0KLQotXHNlY3Rpb257XG1vZHVsZXtkaXN0dXRpbHMuY29tbWFuZH0gLS0tIEluZGl2aWR1YWwgRGlzdHV0aWxzIGNvbW1hbmRzfQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2Rpc3R1dGlscy5jb21tYW5kfQotXG1vZHVsZXN5bm9wc2lze1RoaXMgc3VicGFja2FnZSBjb250YWlucyBvbmUgbW9kdWxlIGZvciBlYWNoIHN0YW5kYXJkIERpc3R1dGlscyBjb21tYW5kLn0KLQotJVxzdWJzdWJzZWN0aW9ue0luZGl2aWR1YWwgRGlzdHV0aWxzIGNvbW1hbmRzfQotCi0lIHRvZG8KLQotXHNlY3Rpb257XG1vZHVsZXtkaXN0dXRpbHMuY29tbWFuZC5iZGlzdH0gLS0tIEJ1aWxkIGEgYmluYXJ5IGluc3RhbGxlcn0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtkaXN0dXRpbHMuY29tbWFuZC5iZGlzdH0KLVxtb2R1bGVzeW5vcHNpc3tCdWlsZCBhIGJpbmFyeSBpbnN0YWxsZXIgZm9yIGEgcGFja2FnZX0KLQotJSB0b2RvCi0KLVxzZWN0aW9ue1xtb2R1bGV7ZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3RfcGFja2FnZXJ9IC0tLSBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBwYWNrYWdlcnN9Ci1cZGVjbGFyZW1vZHVsZVtkaXN0dXRpbHMuY29tbWFuZC5iZGlzdHBhY2thZ2VyXXtzdGFuZGFyZH17ZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3RfcGFja2FnZXJ9Ci1cbW9kdWxlc3lub3BzaXN7QWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgcGFja2FnZXJzfQotCi0lIHRvZG8KLQotXHNlY3Rpb257XG1vZHVsZXtkaXN0dXRpbHMuY29tbWFuZC5iZGlzdF9kdW1ifSAtLS0gQnVpbGQgYSBgYGR1bWInJyBpbnN0YWxsZXJ9Ci1cZGVjbGFyZW1vZHVsZVtkaXN0dXRpbHMuY29tbWFuZC5iZGlzdGR1bWJde3N0YW5kYXJkfXtkaXN0dXRpbHMuY29tbWFuZC5iZGlzdF9kdW1ifQotXG1vZHVsZXN5bm9wc2lze0J1aWxkIGEgYGBkdW1iJycgaW5zdGFsbGVyIC0gYSBzaW1wbGUgYXJjaGl2ZSBvZiBmaWxlc30KLQotJSB0b2RvCi0KLVxzZWN0aW9ue1xtb2R1bGV7ZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3RfbXNpfSAtLS0gQnVpbGQgYSBNaWNyb3NvZnQgSW5zdGFsbGVyIGJpbmFyeSBwYWNrYWdlfQotXGRlY2xhcmVtb2R1bGVbZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3Rtc2lde3N0YW5kYXJkfXtkaXN0dXRpbHMuY29tbWFuZC5iZGlzdF9tc2l9Ci1cbW9kdWxlc3lub3BzaXN7QnVpbGQgYSBiaW5hcnkgZGlzdHJpYnV0aW9uIGFzIGEgV2luZG93cyBNU0kgZmlsZX0KLQotJSB0b2RvCi0KLVxzZWN0aW9ue1xtb2R1bGV7ZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3RfcnBtfSAtLS0gQnVpbGQgYSBiaW5hcnkgZGlzdHJpYnV0aW9uIGFzIGEgUmVkaGF0IFJQTSBhbmQgU1JQTX0KLVxkZWNsYXJlbW9kdWxlW2Rpc3R1dGlscy5jb21tYW5kLmJkaXN0cnBtXXtzdGFuZGFyZH17ZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3RfcnBtfQotXG1vZHVsZXN5bm9wc2lze0J1aWxkIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbiBhcyBhIFJlZGhhdCBSUE0gYW5kIFNSUE19Ci0KLSUgdG9kbwotCi1cc2VjdGlvbntcbW9kdWxle2Rpc3R1dGlscy5jb21tYW5kLmJkaXN0X3dpbmluc3R9IC0tLSBCdWlsZCBhIFdpbmRvd3MgaW5zdGFsbGVyfQotXGRlY2xhcmVtb2R1bGVbZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3R3aW5pbnN0XXtzdGFuZGFyZH17ZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3Rfd2luaW5zdH0KLVxtb2R1bGVzeW5vcHNpc3tCdWlsZCBhIFdpbmRvd3MgaW5zdGFsbGVyfQotCi0lIHRvZG8KLQotXHNlY3Rpb257XG1vZHVsZXtkaXN0dXRpbHMuY29tbWFuZC5zZGlzdH0gLS0tIEJ1aWxkIGEgc291cmNlIGRpc3RyaWJ1dGlvbn0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtkaXN0dXRpbHMuY29tbWFuZC5zZGlzdH0KLVxtb2R1bGVzeW5vcHNpc3tCdWlsZCBhIHNvdXJjZSBkaXN0cmlidXRpb259Ci0KLSUgdG9kbwotCi1cc2VjdGlvbntcbW9kdWxle2Rpc3R1dGlscy5jb21tYW5kLmJ1aWxkfSAtLS0gQnVpbGQgYWxsIGZpbGVzIG9mIGEgcGFja2FnZX0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtkaXN0dXRpbHMuY29tbWFuZC5idWlsZH0KLVxtb2R1bGVzeW5vcHNpc3tCdWlsZCBhbGwgZmlsZXMgb2YgYSBwYWNrYWdlfQotCi0lIHRvZG8KLQotXHNlY3Rpb257XG1vZHVsZXtkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9jbGlifSAtLS0gQnVpbGQgYW55IEMgbGlicmFyaWVzIGluIGEgcGFja2FnZX0KLVxkZWNsYXJlbW9kdWxlW2Rpc3R1dGlscy5jb21tYW5kLmJ1aWxkY2xpYl17c3RhbmRhcmR9e2Rpc3R1dGlscy5jb21tYW5kLmJ1aWxkX2NsaWJ9Ci1cbW9kdWxlc3lub3BzaXN7QnVpbGQgYW55IEMgbGlicmFyaWVzIGluIGEgcGFja2FnZX0KLQotJSB0b2RvCi0KLVxzZWN0aW9ue1xtb2R1bGV7ZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfZXh0fSAtLS0gQnVpbGQgYW55IGV4dGVuc2lvbnMgaW4gYSBwYWNrYWdlfQotXGRlY2xhcmVtb2R1bGVbZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRleHRde3N0YW5kYXJkfXtkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9leHR9Ci1cbW9kdWxlc3lub3BzaXN7QnVpbGQgYW55IGV4dGVuc2lvbnMgaW4gYSBwYWNrYWdlfQotCi0lIHRvZG8KLQotXHNlY3Rpb257XG1vZHVsZXtkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9weX0gLS0tIEJ1aWxkIHRoZSAucHkvLnB5YyBmaWxlcyBvZiBhIHBhY2thZ2V9Ci1cZGVjbGFyZW1vZHVsZVtkaXN0dXRpbHMuY29tbWFuZC5idWlsZHB5XXtzdGFuZGFyZH17ZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfcHl9Ci1cbW9kdWxlc3lub3BzaXN7QnVpbGQgdGhlIC5weS8ucHljIGZpbGVzIG9mIGEgcGFja2FnZX0KLQotJSB0b2RvCi0KLVxzZWN0aW9ue1xtb2R1bGV7ZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfc2NyaXB0c30gLS0tIEJ1aWxkIHRoZSBzY3JpcHRzIG9mIGEgcGFja2FnZX0KLVxkZWNsYXJlbW9kdWxlW2Rpc3R1dGlscy5jb21tYW5kLmJ1aWxkc2NyaXB0c117c3RhbmRhcmR9e2Rpc3R1dGlscy5jb21tYW5kLmJ1aWxkX3NjcmlwdHN9Ci1cbW9kdWxlc3lub3BzaXN7QnVpbGQgdGhlIHNjcmlwdHMgb2YgYSBwYWNrYWdlfQotCi0lIHRvZG8KLQotXHNlY3Rpb257XG1vZHVsZXtkaXN0dXRpbHMuY29tbWFuZC5jbGVhbn0gLS0tIENsZWFuIGEgcGFja2FnZSBidWlsZCBhcmVhfQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2Rpc3R1dGlscy5jb21tYW5kLmNsZWFufQotXG1vZHVsZXN5bm9wc2lze0NsZWFuIGEgcGFja2FnZSBidWlsZCBhcmVhfQotCi0lIHRvZG8KLQotXHNlY3Rpb257XG1vZHVsZXtkaXN0dXRpbHMuY29tbWFuZC5jb25maWd9IC0tLSBQZXJmb3JtIHBhY2thZ2UgY29uZmlndXJhdGlvbn0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtkaXN0dXRpbHMuY29tbWFuZC5jb25maWd9Ci1cbW9kdWxlc3lub3BzaXN7UGVyZm9ybSBwYWNrYWdlIGNvbmZpZ3VyYXRpb259Ci0KLSUgdG9kbwotCi1cc2VjdGlvbntcbW9kdWxle2Rpc3R1dGlscy5jb21tYW5kLmluc3RhbGx9IC0tLSBJbnN0YWxsIGEgcGFja2FnZX0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsfQotXG1vZHVsZXN5bm9wc2lze0luc3RhbGwgYSBwYWNrYWdlfQotCi0lIHRvZG8KLQotXHNlY3Rpb257XG1vZHVsZXtkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsX2RhdGF9Ci0gICAgICAgICAgICAgICAtLS0gSW5zdGFsbCBkYXRhIGZpbGVzIGZyb20gYSBwYWNrYWdlfQotXGRlY2xhcmVtb2R1bGVbZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbGRhdGFde3N0YW5kYXJkfXtkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsX2RhdGF9Ci1cbW9kdWxlc3lub3BzaXN7SW5zdGFsbCBkYXRhIGZpbGVzIGZyb20gYSBwYWNrYWdlfQotCi0lIHRvZG8KLQotXHNlY3Rpb257XG1vZHVsZXtkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsX2hlYWRlcnN9Ci0gICAgICAgICAgICAgICAtLS0gSW5zdGFsbCBDL1xDcHB7fSBoZWFkZXIgZmlsZXMgZnJvbSBhIHBhY2thZ2V9Ci1cZGVjbGFyZW1vZHVsZVtkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsaGVhZGVyc117c3RhbmRhcmR9e2Rpc3R1dGlscy5jb21tYW5kLmluc3RhbGxfaGVhZGVyc30KLVxtb2R1bGVzeW5vcHNpc3tJbnN0YWxsIEMvXENwcHt9IGhlYWRlciBmaWxlcyBmcm9tIGEgcGFja2FnZX0KLQotJSB0b2RvCi0KLVxzZWN0aW9ue1xtb2R1bGV7ZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbF9saWJ9Ci0gICAgICAgICAgICAgICAtLS0gSW5zdGFsbCBsaWJyYXJ5IGZpbGVzIGZyb20gYSBwYWNrYWdlfQotXGRlY2xhcmVtb2R1bGVbZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbGxpYl17c3RhbmRhcmR9e2Rpc3R1dGlscy5jb21tYW5kLmluc3RhbGxfbGlifQotXG1vZHVsZXN5bm9wc2lze0luc3RhbGwgbGlicmFyeSBmaWxlcyBmcm9tIGEgcGFja2FnZX0KLQotJSB0b2RvCi0KLVxzZWN0aW9ue1xtb2R1bGV7ZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbF9zY3JpcHRzfQotICAgICAgICAgICAgICAgLS0tIEluc3RhbGwgc2NyaXB0IGZpbGVzIGZyb20gYSBwYWNrYWdlfQotXGRlY2xhcmVtb2R1bGVbZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbHNjcmlwdHNde3N0YW5kYXJkfXtkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsX3NjcmlwdHN9Ci1cbW9kdWxlc3lub3BzaXN7SW5zdGFsbCBzY3JpcHQgZmlsZXMgZnJvbSBhIHBhY2thZ2V9Ci0KLSUgdG9kbwotCi1cc2VjdGlvbntcbW9kdWxle2Rpc3R1dGlscy5jb21tYW5kLnJlZ2lzdGVyfQotICAgICAgICAgICAgICAgLS0tIFJlZ2lzdGVyIGEgbW9kdWxlIHdpdGggdGhlIFB5dGhvbiBQYWNrYWdlIEluZGV4fQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2Rpc3R1dGlscy5jb21tYW5kLnJlZ2lzdGVyfQotXG1vZHVsZXN5bm9wc2lze1JlZ2lzdGVyIGEgbW9kdWxlIHdpdGggdGhlIFB5dGhvbiBQYWNrYWdlIEluZGV4fQotCi1UaGUgXGNvZGV7cmVnaXN0ZXJ9IGNvbW1hbmQgcmVnaXN0ZXJzIHRoZSBwYWNrYWdlIHdpdGggdGhlIFB5dGhvbiBQYWNrYWdlIAotSW5kZXguICBUaGlzIGlzIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBpbiBccGVwezMwMX0uCi0lIHRvZG8KLQotXHNlY3Rpb257Q3JlYXRpbmcgYSBuZXcgRGlzdHV0aWxzIGNvbW1hbmR9Ci0KLVRoaXMgc2VjdGlvbiBvdXRsaW5lcyB0aGUgc3RlcHMgdG8gY3JlYXRlIGEgbmV3IERpc3R1dGlscyBjb21tYW5kLgotCi1BIG5ldyBjb21tYW5kIGxpdmVzIGluIGEgbW9kdWxlIGluIHRoZSBcbW9kdWxle2Rpc3R1dGlscy5jb21tYW5kfQotcGFja2FnZS4gVGhlcmUgaXMgYSBzYW1wbGUgdGVtcGxhdGUgaW4gdGhhdCBkaXJlY3RvcnkgY2FsbGVkIAotXGZpbGV7Y29tbWFuZF90ZW1wbGF0ZX0uIENvcHkgdGhpcyBmaWxlIHRvIGEgbmV3IG1vZHVsZSB3aXRoIHRoZQotc2FtZSBuYW1lIGFzIHRoZSBuZXcgY29tbWFuZCB5b3UncmUgaW1wbGVtZW50aW5nLiBUaGlzIG1vZHVsZSBzaG91bGQKLWltcGxlbWVudCBhIGNsYXNzIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgbW9kdWxlIChhbmQgdGhlIGNvbW1hbmQpLgotU28sIGZvciBpbnN0YW5jZSwgdG8gY3JlYXRlIHRoZSBjb21tYW5kIFxjb2Rle3BlZWxfYmFuYW5hfSAoc28gdGhhdCB1c2VycwotY2FuIHJ1biBcc2FtcHtzZXR1cC5weSBwZWVsX2JhbmFuYX0pLCB5b3UnZCBjb3B5IFxmaWxle2NvbW1hbmRfdGVtcGxhdGV9IAotdG8gXGZpbGV7ZGlzdHV0aWxzL2NvbW1hbmQvcGVlbF9iYW5hbmEucHl9LCB0aGVuIGVkaXQgaXQgc28gdGhhdCBpdCdzCi1pbXBsZW1lbnRpbmcgdGhlIGNsYXNzIFxjbGFzc3twZWVsX2JhbmFuYX0sIGEgc3ViY2xhc3Mgb2YgCi1cY2xhc3N7ZGlzdHV0aWxzLmNtZC5Db21tYW5kfS4KLQotU3ViY2xhc3NlcyBvZiBcY2xhc3N7Q29tbWFuZH0gbXVzdCBkZWZpbmUgdGhlIGZvbGxvd2luZyBtZXRob2RzLgotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29tbWFuZF17aW5pdGlhbGl6ZV9vcHRpb25zKCl9Ci1TZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCB0aGUgb3B0aW9ucyB0aGF0IHRoaXMgY29tbWFuZAotc3VwcG9ydHMuICBOb3RlIHRoYXQgdGhlc2UgZGVmYXVsdHMgbWF5IGJlIG92ZXJyaWRkZW4gYnkgb3RoZXIKLWNvbW1hbmRzLCBieSB0aGUgc2V0dXAgc2NyaXB0LCBieSBjb25maWcgZmlsZXMsIG9yIGJ5IHRoZQotY29tbWFuZC1saW5lLiAgVGh1cywgdGhpcyBpcyBub3QgdGhlIHBsYWNlIHRvIGNvZGUgZGVwZW5kZW5jaWVzCi1iZXR3ZWVuIG9wdGlvbnM7IGdlbmVyYWxseSwgXG1ldGhvZHtpbml0aWFsaXplX29wdGlvbnMoKX0gaW1wbGVtZW50YXRpb25zCi1hcmUganVzdCBhIGJ1bmNoIG9mIFxzYW1we3NlbGYuZm9vID0gTm9uZX0gYXNzaWdubWVudHMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb21tYW5kXXtmaW5hbGl6ZV9vcHRpb25zfXt9Ci1TZXQgZmluYWwgdmFsdWVzIGZvciBhbGwgdGhlIG9wdGlvbnMgdGhhdCB0aGlzIGNvbW1hbmQgc3VwcG9ydHMuCi1UaGlzIGlzIGFsd2F5cyBjYWxsZWQgYXMgbGF0ZSBhcyBwb3NzaWJsZSwgaWUuICBhZnRlciBhbnkgb3B0aW9uCi1hc3NpZ25tZW50cyBmcm9tIHRoZSBjb21tYW5kLWxpbmUgb3IgZnJvbSBvdGhlciBjb21tYW5kcyBoYXZlIGJlZW4KLWRvbmUuICBUaHVzLCB0aGlzIGlzIHRoZSBwbGFjZSB0byB0byBjb2RlIG9wdGlvbiBkZXBlbmRlbmNpZXM6IGlmCi1cdmFye2Zvb30gZGVwZW5kcyBvbiBcdmFye2Jhcn0sIHRoZW4gaXQgaXMgc2FmZSB0byBzZXQgXHZhcntmb299IGZyb20gCi1cdmFye2Jhcn0gYXMgbG9uZyBhcyBcdmFye2Zvb30gc3RpbGwgaGFzIHRoZSBzYW1lIHZhbHVlIGl0IHdhcyBhc3NpZ25lZCBpbgotXG1ldGhvZHtpbml0aWFsaXplX29wdGlvbnMoKX0uCi1cZW5ke21ldGhvZGRlc2N9Ci1cYmVnaW57bWV0aG9kZGVzY31bQ29tbWFuZF17cnVufXt9Ci1BIGNvbW1hbmQncyByYWlzb24gZCdldHJlOiBjYXJyeSBvdXQgdGhlIGFjdGlvbiBpdCBleGlzdHMgdG8KLXBlcmZvcm0sIGNvbnRyb2xsZWQgYnkgdGhlIG9wdGlvbnMgaW5pdGlhbGl6ZWQgaW4KLVxtZXRob2R7aW5pdGlhbGl6ZV9vcHRpb25zKCl9LCBjdXN0b21pemVkIGJ5IG90aGVyIGNvbW1hbmRzLCB0aGUgc2V0dXAKLXNjcmlwdCwgdGhlIGNvbW1hbmQtbGluZSwgYW5kIGNvbmZpZyBmaWxlcywgYW5kIGZpbmFsaXplZCBpbgotXG1ldGhvZHtmaW5hbGl6ZV9vcHRpb25zKCl9LiAgQWxsIHRlcm1pbmFsIG91dHB1dCBhbmQgZmlsZXN5c3RlbQotaW50ZXJhY3Rpb24gc2hvdWxkIGJlIGRvbmUgYnkgXG1ldGhvZHtydW4oKX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVx2YXJ7c3ViX2NvbW1hbmRzfSBmb3JtYWxpemVzIHRoZSBub3Rpb24gb2YgYSBgYGZhbWlseScnIG9mIGNvbW1hbmRzLAotZWcuIFxjb2Rle2luc3RhbGx9IGFzIHRoZSBwYXJlbnQgd2l0aCBzdWItY29tbWFuZHMgXGNvZGV7aW5zdGFsbF9saWJ9LAotXGNvZGV7aW5zdGFsbF9oZWFkZXJzfSwgZXRjLiAgVGhlIHBhcmVudCBvZiBhIGZhbWlseSBvZiBjb21tYW5kcwotZGVmaW5lcyBcdmFye3N1Yl9jb21tYW5kc30gYXMgYSBjbGFzcyBhdHRyaWJ1dGU7IGl0J3MgYSBsaXN0IG9mCi0yLXR1cGxlcyBcc2FtcHsoY29tbWFuZF9uYW1lLCBwcmVkaWNhdGUpfSwgd2l0aCBcdmFye2NvbW1hbmRfbmFtZX0gYSBzdHJpbmcKLWFuZCBcdmFye3ByZWRpY2F0ZX0gYW4gdW5ib3VuZCBtZXRob2QsIGEgc3RyaW5nIG9yIE5vbmUuCi1cdmFye3ByZWRpY2F0ZX0gaXMgYSBtZXRob2Qgb2YgdGhlIHBhcmVudCBjb21tYW5kIHRoYXQKLWRldGVybWluZXMgd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyBjb21tYW5kIGlzIGFwcGxpY2FibGUgaW4gdGhlCi1jdXJyZW50IHNpdHVhdGlvbi4gIChFZy4gd2UgXGNvZGV7aW5zdGFsbF9oZWFkZXJzfSBpcyBvbmx5IGFwcGxpY2FibGUgaWYKLXdlIGhhdmUgYW55IEMgaGVhZGVyIGZpbGVzIHRvIGluc3RhbGwuKSAgSWYgXHZhcntwcmVkaWNhdGV9IGlzIE5vbmUsCi10aGF0IGNvbW1hbmQgaXMgYWx3YXlzIGFwcGxpY2FibGUuCi0KLVx2YXJ7c3ViX2NvbW1hbmRzfSBpcyB1c3VhbGx5IGRlZmluZWQgYXQgdGhlICplbmQqIG9mIGEgY2xhc3MsIGJlY2F1c2UKLXByZWRpY2F0ZXMgY2FuIGJlIHVuYm91bmQgbWV0aG9kcywgc28gdGhleSBtdXN0IGFscmVhZHkgaGF2ZSBiZWVuCi1kZWZpbmVkLiAgVGhlIGNhbm9uaWNhbCBleGFtcGxlIGlzIHRoZSBcY29tbWFuZHtpbnN0YWxsfSBjb21tYW5kLgotCi0lCi0lICBUaGUgdWdseSAiJWJlZ2lue2xhdGV4b25seX0iIHBzZXVkby1lbnZpcm9ubWVudHMgYXJlIHJlYWxseSBqdXN0IHRvCi0lICBrZWVwIExhVGVYMkhUTUwgcXVpZXQgZHVyaW5nIHRoZSBccmVuZXdjb21tYW5ke30gbWFjcm9zOyB0aGV5J3JlCi0lICBub3QgcmVhbGx5IHZhbHVhYmxlLgotJQotCi0lYmVnaW57bGF0ZXhvbmx5fQotXHJlbmV3Y29tbWFuZHtcaW5kZXhuYW1lfXtNb2R1bGUgSW5kZXh9Ci0lZW5ke2xhdGV4b25seX0KLVxpbnB1dHttb2RkaXN0LmluZH0gICAgICAgICAgICAgJSBNb2R1bGUgSW5kZXgKLQotJWJlZ2lue2xhdGV4b25seX0KLVxyZW5ld2NvbW1hbmR7XGluZGV4bmFtZX17SW5kZXh9Ci0lZW5ke2xhdGV4b25seX0KLVxpbnB1dHtkaXN0LmluZH0gICAgICAgICAgICAgICAgJSBJbmRleAotCi1cZW5ke2RvY3VtZW50fQpkaWZmIC0tZ2l0IGEvRG9jL2Rpc3Qvc3lzY29uZmlnLnRleCBiL0RvYy9kaXN0L3N5c2NvbmZpZy50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMjhlNTUuLjAwMDAwMDAKLS0tIGEvRG9jL2Rpc3Qvc3lzY29uZmlnLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle2Rpc3R1dGlscy5zeXNjb25maWd9IC0tLQotICAgICAgICAgU3lzdGVtIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb259Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtkaXN0dXRpbHMuc3lzY29uZmlnfQotXG1vZHVsZXN5bm9wc2lze0xvdy1sZXZlbCBhY2Nlc3MgdG8gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBvZiB0aGUKLSAgICAgICAgICAgICAgICBQeXRob24gaW50ZXJwcmV0ZXIufQotXG1vZHVsZWF1dGhvcntGcmVkIEwuIERyYWtlLCBKci59e2ZkcmFrZUBhY20ub3JnfQotXG1vZHVsZWF1dGhvcntHcmVnIFdhcmR9e2d3YXJkQHB5dGhvbi5uZXR9Ci1cc2VjdGlvbmF1dGhvcntGcmVkIEwuIERyYWtlLCBKci59e2ZkcmFrZUBhY20ub3JnfQotCi0KLVRoZSBcbW9kdWxle2Rpc3R1dGlscy5zeXNjb25maWd9IG1vZHVsZSBwcm92aWRlcyBhY2Nlc3MgdG8gUHl0aG9uJ3MKLWxvdy1sZXZlbCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLiAgVGhlIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24KLXZhcmlhYmxlcyBhdmFpbGFibGUgZGVwZW5kIGhlYXZpbHkgb24gdGhlIHBsYXRmb3JtIGFuZCBjb25maWd1cmF0aW9uLgotVGhlIHNwZWNpZmljIHZhcmlhYmxlcyBkZXBlbmQgb24gdGhlIGJ1aWxkIHByb2Nlc3MgZm9yIHRoZSBzcGVjaWZpYwotdmVyc2lvbiBvZiBQeXRob24gYmVpbmcgcnVuOyB0aGUgdmFyaWFibGVzIGFyZSB0aG9zZSBmb3VuZCBpbiB0aGUKLVxmaWxle01ha2VmaWxlfSBhbmQgY29uZmlndXJhdGlvbiBoZWFkZXIgdGhhdCBhcmUgaW5zdGFsbGVkIHdpdGgKLVB5dGhvbiBvbiBcVU5JWHt9IHN5c3RlbXMuICBUaGUgY29uZmlndXJhdGlvbiBoZWFkZXIgaXMgY2FsbGVkCi1cZmlsZXtweWNvbmZpZy5ofSBmb3IgUHl0aG9uIHZlcnNpb25zIHN0YXJ0aW5nIHdpdGggMi4yLCBhbmQKLVxmaWxle2NvbmZpZy5ofSBmb3IgZWFybGllciB2ZXJzaW9ucyBvZiBQeXRob24uCi0KLVNvbWUgYWRkaXRpb25hbCBmdW5jdGlvbnMgYXJlIHByb3ZpZGVkIHdoaWNoIHBlcmZvcm0gc29tZSB1c2VmdWwKLW1hbmlwdWxhdGlvbnMgZm9yIG90aGVyIHBhcnRzIG9mIHRoZSBcbW9kdWxle2Rpc3R1dGlsc30gcGFja2FnZS4KLQotCi1cYmVnaW57ZGF0YWRlc2N9e1BSRUZJWH0KLSAgVGhlIHJlc3VsdCBvZiBcY29kZXtvcy5wYXRoLm5vcm1wYXRoKHN5cy5wcmVmaXgpfS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317RVhFQ19QUkVGSVh9Ci0gIFRoZSByZXN1bHQgb2YgXGNvZGV7b3MucGF0aC5ub3JtcGF0aChzeXMuZXhlY19wcmVmaXgpfS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0X2NvbmZpZ192YXJ9e25hbWV9Ci0gIFJldHVybiB0aGUgdmFsdWUgb2YgYSBzaW5nbGUgdmFyaWFibGUuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KLSAgXGNvZGV7Z2V0X2NvbmZpZ192YXJzKCkuZ2V0KFx2YXJ7bmFtZX0pfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0X2NvbmZpZ192YXJzfXtcbW9yZWFyZ3N9Ci0gIFJldHVybiBhIHNldCBvZiB2YXJpYWJsZSBkZWZpbml0aW9ucy4gIElmIHRoZXJlIGFyZSBubyBhcmd1bWVudHMsCi0gIHRoaXMgcmV0dXJucyBhIGRpY3Rpb25hcnkgbWFwcGluZyBuYW1lcyBvZiBjb25maWd1cmF0aW9uIHZhcmlhYmxlcwotICB0byB2YWx1ZXMuICBJZiBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLCB0aGV5IHNob3VsZCBiZSBzdHJpbmdzLCBhbmQKLSAgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIGEgc2VxdWVuY2UgZ2l2aW5nIHRoZSBhc3NvY2lhdGVkIHZhbHVlcy4KLSAgSWYgYSBnaXZlbiBuYW1lIGRvZXMgbm90IGhhdmUgYSBjb3JyZXNwb25kaW5nIHZhbHVlLCBcY29kZXtOb25lfQotICB3aWxsIGJlIGluY2x1ZGVkIGZvciB0aGF0IHZhcmlhYmxlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRfY29uZmlnX2hfZmlsZW5hbWV9e30KLSAgUmV0dXJuIHRoZSBmdWxsIHBhdGggbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBoZWFkZXIuICBGb3IgXFVOSVgsCi0gIHRoaXMgd2lsbCBiZSB0aGUgaGVhZGVyIGdlbmVyYXRlZCBieSB0aGUgXHByb2dyYW17Y29uZmlndXJlfSBzY3JpcHQ7Ci0gIGZvciBvdGhlciBwbGF0Zm9ybXMgdGhlIGhlYWRlciB3aWxsIGhhdmUgYmVlbiBzdXBwbGllZCBkaXJlY3RseSBieQotICB0aGUgUHl0aG9uIHNvdXJjZSBkaXN0cmlidXRpb24uICBUaGUgZmlsZSBpcyBhIHBsYXRmb3JtLXNwZWNpZmljCi0gIHRleHQgZmlsZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0X21ha2VmaWxlX2ZpbGVuYW1lfXt9Ci0gIFJldHVybiB0aGUgZnVsbCBwYXRoIG5hbWUgb2YgdGhlIFxmaWxle01ha2VmaWxlfSB1c2VkIHRvIGJ1aWxkCi0gIFB5dGhvbi4gIEZvciBcVU5JWCwgdGhpcyB3aWxsIGJlIGEgZmlsZSBnZW5lcmF0ZWQgYnkgdGhlCi0gIFxwcm9ncmFte2NvbmZpZ3VyZX0gc2NyaXB0OyB0aGUgbWVhbmluZyBmb3Igb3RoZXIgcGxhdGZvcm1zIHdpbGwKLSAgdmFyeS4gIFRoZSBmaWxlIGlzIGEgcGxhdGZvcm0tc3BlY2lmaWMgdGV4dCBmaWxlLCBpZiBpdCBleGlzdHMuCi0gIFRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VmdWwgb24gXFBPU0lYe30gcGxhdGZvcm1zLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRfcHl0aG9uX2luY317XG9wdGlvbmFse3BsYXRfc3BlY2lmaWNcb3B0aW9uYWx7LCBwcmVmaXh9fX0KLSAgUmV0dXJuIHRoZSBkaXJlY3RvcnkgZm9yIGVpdGhlciB0aGUgZ2VuZXJhbCBvciBwbGF0Zm9ybS1kZXBlbmRlbnQgQwotICBpbmNsdWRlIGZpbGVzLiAgSWYgXHZhcntwbGF0X3NwZWNpZmljfSBpcyB0cnVlLCB0aGUKLSAgcGxhdGZvcm0tZGVwZW5kZW50IGluY2x1ZGUgZGlyZWN0b3J5IGlzIHJldHVybmVkOyBpZiBmYWxzZSBvcgotICBvbWl0dGVkLCB0aGUgcGxhdGZvcm0taW5kZXBlbmRlbnQgZGlyZWN0b3J5IGlzIHJldHVybmVkLiAgSWYKLSAgXHZhcntwcmVmaXh9IGlzIGdpdmVuLCBpdCBpcyB1c2VkIGFzIGVpdGhlciB0aGUgcHJlZml4IGluc3RlYWQgb2YKLSAgXGNvbnN0YW50e1BSRUZJWH0sIG9yIGFzIHRoZSBleGVjLXByZWZpeCBpbnN0ZWFkIG9mCi0gIFxjb25zdGFudHtFWEVDX1BSRUZJWH0gaWYgXHZhcntwbGF0X3NwZWNpZmljfSBpcyB0cnVlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRfcHl0aG9uX2xpYn17XG9wdGlvbmFse3BsYXRfc3BlY2lmaWNcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmRfbGliXG9wdGlvbmFseywgcHJlZml4fX19fQotICBSZXR1cm4gdGhlIGRpcmVjdG9yeSBmb3IgZWl0aGVyIHRoZSBnZW5lcmFsIG9yIHBsYXRmb3JtLWRlcGVuZGVudAotICBsaWJyYXJ5IGluc3RhbGxhdGlvbi4gIElmIFx2YXJ7cGxhdF9zcGVjaWZpY30gaXMgdHJ1ZSwgdGhlCi0gIHBsYXRmb3JtLWRlcGVuZGVudCBpbmNsdWRlIGRpcmVjdG9yeSBpcyByZXR1cm5lZDsgaWYgZmFsc2Ugb3IKLSAgb21pdHRlZCwgdGhlIHBsYXRmb3JtLWluZGVwZW5kZW50IGRpcmVjdG9yeSBpcyByZXR1cm5lZC4gIElmCi0gIFx2YXJ7cHJlZml4fSBpcyBnaXZlbiwgaXQgaXMgdXNlZCBhcyBlaXRoZXIgdGhlIHByZWZpeCBpbnN0ZWFkIG9mCi0gIFxjb25zdGFudHtQUkVGSVh9LCBvciBhcyB0aGUgZXhlYy1wcmVmaXggaW5zdGVhZCBvZgotICBcY29uc3RhbnR7RVhFQ19QUkVGSVh9IGlmIFx2YXJ7cGxhdF9zcGVjaWZpY30gaXMgdHJ1ZS4gIElmCi0gIFx2YXJ7c3RhbmRhcmRfbGlifSBpcyB0cnVlLCB0aGUgZGlyZWN0b3J5IGZvciB0aGUgc3RhbmRhcmQgbGlicmFyeQotICBpcyByZXR1cm5lZCByYXRoZXIgdGhhbiB0aGUgZGlyZWN0b3J5IGZvciB0aGUgaW5zdGFsbGF0aW9uIG9mCi0gIHRoaXJkLXBhcnR5IGV4dGVuc2lvbnMuCi1cZW5ke2Z1bmNkZXNjfQotCi0KLVRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaXMgb25seSBpbnRlbmRlZCBmb3IgdXNlIHdpdGhpbiB0aGUKLVxtb2R1bGV7ZGlzdHV0aWxzfSBwYWNrYWdlLgotCi1cYmVnaW57ZnVuY2Rlc2N9e2N1c3RvbWl6ZV9jb21waWxlcn17Y29tcGlsZXJ9Ci0gIERvIGFueSBwbGF0Zm9ybS1zcGVjaWZpYyBjdXN0b21pemF0aW9uIG9mIGEKLSAgXGNsYXNze2Rpc3R1dGlscy5jY29tcGlsZXIuQ0NvbXBpbGVyfSBpbnN0YW5jZS4KLQotICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgbmVlZGVkIG9uIFxVTklYe30gYXQgdGhpcyB0aW1lLCBidXQgc2hvdWxkIGJlCi0gIGNhbGxlZCBjb25zaXN0ZW50bHkgdG8gc3VwcG9ydCBmb3J3YXJkLWNvbXBhdGliaWxpdHkuICBJdCBpbnNlcnRzCi0gIHRoZSBpbmZvcm1hdGlvbiB0aGF0IHZhcmllcyBhY3Jvc3MgXFVOSVh7fSBmbGF2b3JzIGFuZCBpcyBzdG9yZWQgaW4KLSAgUHl0aG9uJ3MgXGZpbGV7TWFrZWZpbGV9LiAgVGhpcyBpbmZvcm1hdGlvbiBpbmNsdWRlcyB0aGUgc2VsZWN0ZWQKLSAgY29tcGlsZXIsIGNvbXBpbGVyIGFuZCBsaW5rZXIgb3B0aW9ucywgYW5kIHRoZSBleHRlbnNpb24gdXNlZCBieSB0aGUKLSAgbGlua2VyIGZvciBzaGFyZWQgb2JqZWN0cy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotVGhpcyBmdW5jdGlvbiBpcyBldmVuIG1vcmUgc3BlY2lhbC1wdXJwb3NlLCBhbmQgc2hvdWxkIG9ubHkgYmUgdXNlZAotZnJvbSBQeXRob24ncyBvd24gYnVpbGQgcHJvY2VkdXJlcy4KLQotXGJlZ2lue2Z1bmNkZXNjfXtzZXRfcHl0aG9uX2J1aWxkfXt9Ci0gIEluZm9ybSB0aGUgXG1vZHVsZXtkaXN0dXRpbHMuc3lzY29uZmlnfSBtb2R1bGUgdGhhdCBpdCBpcyBiZWluZyB1c2VkCi0gIGFzIHBhcnQgb2YgdGhlIGJ1aWxkIHByb2Nlc3MgZm9yIFB5dGhvbi4gIFRoaXMgY2hhbmdlcyBhIGxvdCBvZgotICByZWxhdGl2ZSBsb2NhdGlvbnMgZm9yIGZpbGVzLCBhbGxvd2luZyB0aGVtIHRvIGJlIGxvY2F0ZWQgaW4gdGhlCi0gIGJ1aWxkIGFyZWEgcmF0aGVyIHRoYW4gaW4gYW4gaW5zdGFsbGVkIFB5dGhvbi4KLVxlbmR7ZnVuY2Rlc2N9CmRpZmYgLS1naXQgYS9Eb2MvZG9jL2RvYy50ZXggYi9Eb2MvZG9jL2RvYy50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMGYyNzkuLjAwMDAwMDAKLS0tIGEvRG9jL2RvYy9kb2MudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMjEyOSArMCwwIEBACi1cZG9jdW1lbnRjbGFzc3tob3d0b30KLVx1c2VwYWNrYWdle2x0eG1hcmt1cH0KLQotXHRpdGxle0RvY3VtZW50aW5nIFB5dGhvbn0KLQotXG1ha2VpbmRleAotCi1caW5wdXR7Ym9pbGVycGxhdGV9Ci0KLSUgTm93IG92ZXJyaWRlIHRoZSBzdHVmZiB0aGF0IGluY2x1ZGVzIGF1dGhvciBpbmZvcm1hdGlvbjsKLSUgR3VpZG8gZGlkICpub3QqIHdyaXRlIHRoaXMgb25lIQotCi1cYXV0aG9ye0ZyZWQgTC4gRHJha2UsIEpyLn0KLVxhdXRob3JhZGRyZXNzewotICAgICAgICBQeXRob25MYWJzIFxcCi0gICAgICAgIEVtYWlsOiBcZW1haWx7ZmRyYWtlQGFjbS5vcmd9Ci19Ci0KLQotXGJlZ2lue2RvY3VtZW50fQotCi1cbWFrZXRpdGxlCi0KLVxiZWdpbnthYnN0cmFjdH0KLVxub2luZGVudAotVGhlIFB5dGhvbiBsYW5ndWFnZSBoYXMgYSBzdWJzdGFudGlhbCBib2R5IG9mCi1kb2N1bWVudGF0aW9uLCBtdWNoIG9mIGl0IGNvbnRyaWJ1dGVkIGJ5IHZhcmlvdXMgYXV0aG9ycy4gIFRoZSBtYXJrdXAKLXVzZWQgZm9yIHRoZSBQeXRob24gZG9jdW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBcTGFUZVh7fSBhbmQgcmVxdWlyZXMgYQotc2lnbmlmaWNhbnQgc2V0IG9mIG1hY3JvcyB3cml0dGVuIHNwZWNpZmljYWxseSBmb3IgZG9jdW1lbnRpbmcgUHl0aG9uLgotVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIG1hY3JvcyBpbnRyb2R1Y2VkIHRvIHN1cHBvcnQgUHl0aG9uCi1kb2N1bWVudGF0aW9uIGFuZCBob3cgdGhleSBzaG91bGQgYmUgdXNlZCB0byBzdXBwb3J0IGEgd2lkZSByYW5nZSBvZgotb3V0cHV0IGZvcm1hdHMuCi0KLVRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBkb2N1bWVudCBjbGFzc2VzIGFuZCBzcGVjaWFsIG1hcmt1cCB1c2VkCi1pbiB0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24uICBBdXRob3JzIG1heSB1c2UgdGhpcyBndWlkZSwgaW4KLWNvbmp1bmN0aW9uIHdpdGggdGhlIHRlbXBsYXRlIGZpbGVzIHByb3ZpZGVkIHdpdGggdGhlCi1kaXN0cmlidXRpb24sIHRvIGNyZWF0ZSBvciBtYWludGFpbiB3aG9sZSBkb2N1bWVudHMgb3Igc2VjdGlvbnMuCi0KLUlmIHlvdSdyZSBpbnRlcmVzdGVkIGluIGNvbnRyaWJ1dGluZyB0byBQeXRob24ncyBkb2N1bWVudGF0aW9uLAotdGhlcmUncyBubyBuZWVkIHRvIGxlYXJuIFxMYVRlWHt9IGlmIHlvdSdyZSBub3Qgc28gaW5jbGluZWQ7IHBsYWluCi10ZXh0IGNvbnRyaWJ1dGlvbnMgYXJlIG1vcmUgdGhhbiB3ZWxjb21lIGFzIHdlbGwuCi1cZW5ke2Fic3RyYWN0fQotCi1cdGFibGVvZmNvbnRlbnRzCi0KLQotXHNlY3Rpb257SW50cm9kdWN0aW9uIFxsYWJlbHtpbnRyb319Ci0KLSAgUHl0aG9uJ3MgZG9jdW1lbnRhdGlvbiBoYXMgbG9uZyBiZWVuIGNvbnNpZGVyZWQgdG8gYmUgZ29vZCBmb3IgYQotICBmcmVlIHByb2dyYW1taW5nIGxhbmd1YWdlLiAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHJlYXNvbnMgZm9yIHRoaXMsCi0gIHRoZSBtb3N0IGltcG9ydGFudCBiZWluZyB0aGUgZWFybHkgY29tbWl0bWVudCBvZiBQeXRob24ncyBjcmVhdG9yLAotICBHdWlkbyB2YW4gUm9zc3VtLCB0byBwcm92aWRpbmcgZG9jdW1lbnRhdGlvbiBvbiB0aGUgbGFuZ3VhZ2UgYW5kIGl0cwotICBsaWJyYXJpZXMsIGFuZCB0aGUgY29udGludWluZyBpbnZvbHZlbWVudCBvZiB0aGUgdXNlciBjb21tdW5pdHkgaW4KLSAgcHJvdmlkaW5nIGFzc2lzdGFuY2UgZm9yIGNyZWF0aW5nIGFuZCBtYWludGFpbmluZyBkb2N1bWVudGF0aW9uLgotCi0gIFRoZSBpbnZvbHZlbWVudCBvZiB0aGUgY29tbXVuaXR5IHRha2VzIG1hbnkgZm9ybXMsIGZyb20gYXV0aG9yaW5nIHRvCi0gIGJ1ZyByZXBvcnRzIHRvIGp1c3QgcGxhaW4gY29tcGxhaW5pbmcgd2hlbiB0aGUgZG9jdW1lbnRhdGlvbiBjb3VsZAotICBiZSBtb3JlIGNvbXBsZXRlIG9yIGVhc2llciB0byB1c2UuICBBbGwgb2YgdGhlc2UgZm9ybXMgb2YgaW5wdXQgZnJvbQotICB0aGUgY29tbXVuaXR5IGhhdmUgcHJvdmVkIHVzZWZ1bCBkdXJpbmcgdGhlIHRpbWUgSSd2ZSBiZWVuIGludm9sdmVkCi0gIGluIG1haW50YWluaW5nIHRoZSBkb2N1bWVudGF0aW9uLgotCi0gIFRoaXMgZG9jdW1lbnQgaXMgYWltZWQgYXQgYXV0aG9ycyBhbmQgcG90ZW50aWFsIGF1dGhvcnMgb2YKLSAgZG9jdW1lbnRhdGlvbiBmb3IgUHl0aG9uLiAgTW9yZSBzcGVjaWZpY2FsbHksIGl0IGlzIGZvciBwZW9wbGUKLSAgY29udHJpYnV0aW5nIHRvIHRoZSBzdGFuZGFyZCBkb2N1bWVudGF0aW9uIGFuZCBkZXZlbG9waW5nIGFkZGl0aW9uYWwKLSAgZG9jdW1lbnRzIHVzaW5nIHRoZSBzYW1lIHRvb2xzIGFzIHRoZSBzdGFuZGFyZCBkb2N1bWVudHMuICBUaGlzCi0gIGd1aWRlIHdpbGwgYmUgbGVzcyB1c2VmdWwgZm9yIGF1dGhvcnMgdXNpbmcgdGhlIFB5dGhvbiBkb2N1bWVudGF0aW9uCi0gIHRvb2xzIGZvciB0b3BpY3Mgb3RoZXIgdGhhbiBQeXRob24sIGFuZCBsZXNzIHVzZWZ1bCBzdGlsbCBmb3IKLSAgYXV0aG9ycyBub3QgdXNpbmcgdGhlIHRvb2xzIGF0IGFsbC4KLQotICBUaGUgbWF0ZXJpYWwgaW4gdGhpcyBndWlkZSBpcyBpbnRlbmRlZCB0byBhc3Npc3QgYXV0aG9ycyB1c2luZyB0aGUKLSAgUHl0aG9uIGRvY3VtZW50YXRpb24gdG9vbHMuICBJdCBpbmNsdWRlcyBpbmZvcm1hdGlvbiBvbiB0aGUgc291cmNlCi0gIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc3RhbmRhcmQgZG9jdW1lbnRhdGlvbiwgYSBkaXNjdXNzaW9uIG9mIHRoZQotICBkb2N1bWVudCB0eXBlcywgcmVmZXJlbmNlIG1hdGVyaWFsIG9uIHRoZSBtYXJrdXAgZGVmaW5lZCBpbiB0aGUKLSAgZG9jdW1lbnQgY2xhc3NlcywgYSBsaXN0IG9mIHRoZSBleHRlcm5hbCB0b29scyBuZWVkZWQgZm9yIHByb2Nlc3NpbmcKLSAgZG9jdW1lbnRzLCBhbmQgcmVmZXJlbmNlIG1hdGVyaWFsIG9uIHRoZSB0b29scyBwcm92aWRlZCB3aXRoIHRoZQotICBkb2N1bWVudGF0aW9uIHJlc291cmNlcy4gIEF0IHRoZSBlbmQsIHRoZXJlIGlzIGFsc28gYSBzZWN0aW9uCi0gIGRpc2N1c3NpbmcgZnV0dXJlIGRpcmVjdGlvbnMgZm9yIHRoZSBQeXRob24gZG9jdW1lbnRhdGlvbiBhbmQgd2hlcmUKLSAgdG8gdHVybiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotICBJZiB5b3VyIGludGVyZXN0IGlzIGluIGNvbnRyaWJ1dGluZyB0byB0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24sIGJ1dAotICB5b3UgZG9uJ3QgaGF2ZSB0aGUgdGltZSBvciBpbmNsaW5hdGlvbiB0byBsZWFybiBcTGFUZVh7fSBhbmQgdGhlCi0gIG1hcmt1cCBzdHJ1Y3R1cmVzIGRvY3VtZW50ZWQgaGVyZSwgdGhlcmUncyBhIHdlbGNvbWluZyBwbGFjZSBmb3IgeW91Ci0gIGFtb25nIHRoZSBQeXRob24gY29udHJpYnV0b3JzIGFzIHdlbGwuICBBbnkgdGltZSB5b3UgZmVlbCB0aGF0IHlvdQotICBjYW4gY2xhcmlmeSBleGlzdGluZyBkb2N1bWVudGF0aW9uIG9yIHByb3ZpZGUgZG9jdW1lbnRhdGlvbiB0aGF0J3MKLSAgbWlzc2luZywgdGhlIGV4aXN0aW5nIGRvY3VtZW50YXRpb24gdGVhbSB3aWxsIGdsYWRseSB3b3JrIHdpdGggeW91Ci0gIHRvIGludGVncmF0ZSB5b3VyIHRleHQsIGRlYWxpbmcgd2l0aCB0aGUgbWFya3VwIGZvciB5b3UuICBQbGVhc2UKLSAgZG9uJ3QgbGV0IHRoZSBtYXRlcmlhbCBpbiB0aGlzIGRvY3VtZW50IHN0YW5kIGJldHdlZW4gdGhlCi0gIGRvY3VtZW50YXRpb24gYW5kIHlvdXIgZGVzaXJlIHRvIGhlbHAgb3V0IQotCi1cc2VjdGlvbntEaXJlY3RvcnkgU3RydWN0dXJlIFxsYWJlbHtkaXJlY3Rvcmllc319Ci0KLSAgVGhlIHNvdXJjZSBkaXN0cmlidXRpb24gZm9yIHRoZSBzdGFuZGFyZCBQeXRob24gZG9jdW1lbnRhdGlvbgotICBjb250YWlucyBhIGxhcmdlIG51bWJlciBvZiBkaXJlY3Rvcmllcy4gIFdoaWxlIHRoaXJkLXBhcnR5IGRvY3VtZW50cwotICBkbyBub3QgbmVlZCB0byBiZSBwbGFjZWQgaW50byB0aGlzIHN0cnVjdHVyZSBvciBuZWVkIHRvIGJlIHBsYWNlZAotICB3aXRoaW4gYSBzaW1pbGFyIHN0cnVjdHVyZSwgaXQgY2FuIGJlIGhlbHBmdWwgdG8ga25vdyB3aGVyZSB0byBsb29rCi0gIGZvciBleGFtcGxlcyBhbmQgdG9vbHMgd2hlbiBkZXZlbG9waW5nIG5ldyBkb2N1bWVudHMgdXNpbmcgdGhlCi0gIFB5dGhvbiBkb2N1bWVudGF0aW9uIHRvb2xzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGlzIGRpcmVjdG9yeQotICBzdHJ1Y3R1cmUuCi0KLSAgVGhlIGRvY3VtZW50YXRpb24gc291cmNlcyBhcmUgdXN1YWxseSBwbGFjZWQgd2l0aGluIHRoZSBQeXRob24KLSAgc291cmNlIGRpc3RyaWJ1dGlvbiBhcyB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeSBcZmlsZXtEb2MvfSwgYnV0Ci0gIGFyZSBub3QgZGVwZW5kZW50IG9uIHRoZSBQeXRob24gc291cmNlIGRpc3RyaWJ1dGlvbiBpbiBhbnkgd2F5LgotCi0gIFRoZSBcZmlsZXtEb2MvfSBkaXJlY3RvcnkgY29udGFpbnMgYSBmZXcgZmlsZXMgYW5kIHNldmVyYWwKLSAgc3ViZGlyZWN0b3JpZXMuICBUaGUgZmlsZXMgYXJlIG1vc3RseSBzZWxmLWV4cGxhbmF0b3J5LCBpbmNsdWRpbmcgYQotICBcZmlsZXtSRUFETUV9IGFuZCBhIFxmaWxle01ha2VmaWxlfS4gIFRoZSBkaXJlY3RvcmllcyBmYWxsIGludG8KLSAgdGhyZWUgY2F0ZWdvcmllczoKLQotICBcYmVnaW57ZGVmaW5pdGlvbnN9Ci0gICAgXHRlcm17RG9jdW1lbnQgU291cmNlc30KLSAgICAgICAgVGhlIFxMYVRlWHt9IHNvdXJjZXMgZm9yIGVhY2ggZG9jdW1lbnQgYXJlIHBsYWNlZCBpbiBhCi0gICAgICAgIHNlcGFyYXRlIGRpcmVjdG9yeS4gIFRoZXNlIGRpcmVjdG9yaWVzIGFyZSBnaXZlbiBzaG9ydAotICAgICAgICBuYW1lcyB3aGljaCB2YWd1ZWx5IGluZGljYXRlIHRoZSBkb2N1bWVudCBpbiBlYWNoOgotCi0gICAgICAgIFxiZWdpbnt0YWJsZWlpfXtwey43NWlufXxwezNpbn19e2ZpbGVucX17RGlyZWN0b3J5fXtEb2N1bWVudCBUaXRsZX0KLSAgICAgICAgICBcbGluZWlpe2FwaS99Ci0gICAgICAgICAgICB7XGNpdGV0aXRsZVsuLi9hcGkvYXBpLmh0bWxde1RoZSBQeXRob24vQyBBUEl9fQotICAgICAgICAgIFxsaW5laWl7ZGlzdC99Ci0gICAgICAgICAgICB7XGNpdGV0aXRsZVsuLi9kaXN0L2Rpc3QuaHRtbF17RGlzdHJpYnV0aW5nIFB5dGhvbiBNb2R1bGVzfX0KLSAgICAgICAgICBcbGluZWlpe2RvYy99Ci0gICAgICAgICAgICB7XGNpdGV0aXRsZVsuLi9kb2MvZG9jLmh0bWxde0RvY3VtZW50aW5nIFB5dGhvbn19Ci0gICAgICAgICAgXGxpbmVpaXtleHQvfQotICAgICAgICAgICAge1xjaXRldGl0bGVbLi4vZXh0L2V4dC5odG1sXQotICAgICAgICAgICAgICAgICAgICAgICB7RXh0ZW5kaW5nIGFuZCBFbWJlZGRpbmcgdGhlIFB5dGhvbiBJbnRlcnByZXRlcn19Ci0gICAgICAgICAgXGxpbmVpaXtpbnN0L30KLSAgICAgICAgICAgIHtcY2l0ZXRpdGxlWy4uL2luc3QvaW5zdC5odG1sXXtJbnN0YWxsaW5nIFB5dGhvbiBNb2R1bGVzfX0KLSAgICAgICAgICBcbGluZWlpe2xpYi99Ci0gICAgICAgICAgICB7XGNpdGV0aXRsZVsuLi9saWIvbGliLmh0bWxde1B5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZX19Ci0gICAgICAgICAgXGxpbmVpaXttYWMvfQotICAgICAgICAgICAge1xjaXRldGl0bGVbLi4vbWFjL21hYy5odG1sXXtNYWNpbnRvc2ggTW9kdWxlIFJlZmVyZW5jZX19Ci0gICAgICAgICAgXGxpbmVpaXtyZWYvfQotICAgICAgICAgICAge1xjaXRldGl0bGVbLi4vcmVmL3JlZi5odG1sXXtQeXRob24gUmVmZXJlbmNlIE1hbnVhbH19Ci0gICAgICAgICAgXGxpbmVpaXt0dXQvfQotICAgICAgICAgICAge1xjaXRldGl0bGVbLi4vdHV0L3R1dC5odG1sXXtQeXRob24gVHV0b3JpYWx9fQotICAgICAgICAgIFxsaW5laWl7d2hhdHNuZXcvfQotICAgICAgICAgICAge1xjaXRldGl0bGVbLi4vd2hhdHNuZXcvd2hhdHNuZXcyNC5odG1sXQotICAgICAgICAgICAgICAgICAgICAgICB7V2hhdCdzIE5ldyBpbiBQeXRob24gXHNob3J0dmVyc2lvbn19Ci0gICAgICAgIFxlbmR7dGFibGVpaX0KLQotICAgIFx0ZXJte0Zvcm1hdC1TcGVjaWZpYyBPdXRwdXR9Ci0gICAgICAgIE1vc3Qgb3V0cHV0IGZvcm1hdHMgaGF2ZSBhIGRpcmVjdG9yeSB3aGljaCBjb250YWlucyBhCi0gICAgICAgIFxmaWxle01ha2VmaWxlfSB3aGljaCBjb250cm9scyB0aGUgZ2VuZXJhdGlvbiBvZiB0aGF0IGZvcm1hdAotICAgICAgICBhbmQgcHJvdmlkZXMgc3RvcmFnZSBmb3IgdGhlIGZvcm1hdHRlZCBkb2N1bWVudHMuICBUaGUgb25seQotICAgICAgICB2YXJpYXRpb25zIHdpdGhpbiB0aGlzIGNhdGVnb3J5IGFyZSB0aGUgUG9ydGFibGUgRG9jdW1lbnQKLSAgICAgICAgRm9ybWF0IChQREYpIGFuZCBQb3N0U2NyaXB0IHZlcnNpb25zIGFyZSBwbGFjZWQgaW4gdGhlCi0gICAgICAgIGRpcmVjdG9yaWVzIFxmaWxle3BhcGVyLWE0L30gYW5kIFxmaWxle3BhcGVyLWxldHRlci99ICh0aGlzCi0gICAgICAgIGNhdXNlcyBhbGwgdGhlIHRlbXBvcmFyeSBmaWxlcyBjcmVhdGVkIGJ5IFxMYVRlWHt9IHRvIGJlIGtlcHQKLSAgICAgICAgaW4gdGhlIHNhbWUgcGxhY2UgZm9yIGVhY2ggcGFwZXIgc2l6ZSwgd2hlcmUgdGhleSBjYW4gYmUgbW9yZQotICAgICAgICBlYXNpbHkgaWdub3JlZCkuCi0KLSAgICAgICAgXGJlZ2lue3RhYmxlaWl9e3B7Ljc1aW59fHB7M2lufX17ZmlsZW5xfXtEaXJlY3Rvcnl9e091dHB1dCBGb3JtYXRzfQotICAgICAgICAgIFxsaW5laWl7aHRtbC99e0hUTUwgb3V0cHV0fQotICAgICAgICAgIFxsaW5laWl7aW5mby99e0dOVSBpbmZvIG91dHB1dH0KLSAgICAgICAgICBcbGluZWlpe2lzaWxvL317XHVsaW5re2lTaWxvfXtodHRwOi8vd3d3LmlzaWxvLmNvbS99Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50cyAoZm9yIFBhbG0gT1MgZGV2aWNlcyl9Ci0gICAgICAgICAgXGxpbmVpaXtwYXBlci1hNC99e1BERiBhbmQgUG9zdFNjcmlwdCwgQTQgcGFwZXJ9Ci0gICAgICAgICAgXGxpbmVpaXtwYXBlci1sZXR0ZXIvfXtQREYgYW5kIFBvc3RTY3JpcHQsIFVTLUxldHRlciBwYXBlcn0KLSAgICAgICAgXGVuZHt0YWJsZWlpfQotCi0gICAgXHRlcm17U3VwcGxlbWVudGFsIEZpbGVzfQotICAgICAgICBTb21lIGFkZGl0aW9uYWwgZGlyZWN0b3JpZXMgYXJlIHVzZWQgdG8gc3RvcmUgc3VwcGxlbWVudGFsCi0gICAgICAgIGZpbGVzIHVzZWQgZm9yIHRoZSB2YXJpb3VzIHByb2Nlc3Nlcy4gIERpcmVjdG9yaWVzIGFyZQotICAgICAgICBpbmNsdWRlZCBmb3IgdGhlIHNoYXJlZCBcTGFUZVh7fSBkb2N1bWVudCBjbGFzc2VzLCB0aGUKLSAgICAgICAgXExhVGVYMkhUTUwgc3VwcG9ydCwgdGVtcGxhdGUgZmlsZXMgZm9yIHZhcmlvdXMgZG9jdW1lbnQKLSAgICAgICAgY29tcG9uZW50cywgYW5kIHRoZSBzY3JpcHRzIHVzZWQgdG8gcGVyZm9ybSB2YXJpb3VzIHN0ZXBzIGluCi0gICAgICAgIHRoZSBmb3JtYXR0aW5nIHByb2Nlc3Nlcy4KLQotICAgICAgICBcYmVnaW57dGFibGVpaX17cHsuNzVpbn18cHszaW59fXtmaWxlbnF9e0RpcmVjdG9yeX17Q29udGVudHN9Ci0gICAgICAgICAgXGxpbmVpaXtjb21tb250ZXgvfXtEb2N1bWVudCBjb250ZW50IHNoYXJlZCBhbW9uZyBkb2N1bWVudHN9Ci0gICAgICAgICAgXGxpbmVpaXtwZXJsL30gICAgIHtTdXBwb3J0IGZvciBcTGFUZVgySFRNTCBwcm9jZXNzaW5nfQotICAgICAgICAgIFxsaW5laWl7dGVtcGxhdGVzL317RXhhbXBsZSBmaWxlcyBmb3Igc291cmNlIGRvY3VtZW50c30KLSAgICAgICAgICBcbGluZWlpe3RleGlucHV0cy99e1N0eWxlIGltcGxlbWVudGF0aW9uIGZvciBcTGFUZVh9Ci0gICAgICAgICAgXGxpbmVpaXt0b29scy99ICAgIHtDdXN0b20gcHJvY2Vzc2luZyBzY3JpcHRzfQotICAgICAgICBcZW5ke3RhYmxlaWl9Ci0KLSAgXGVuZHtkZWZpbml0aW9uc30KLQotCi1cc2VjdGlvbntTdHlsZSBHdWlkZSBcbGFiZWx7c3R5bGUtZ3VpZGV9fQotCi0gIFRoZSBQeXRob24gZG9jdW1lbnRhdGlvbiBzaG91bGQgZm9sbG93IHRoZSBcY2l0ZXRpdGxlCi0gIFtodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL1VzZXJFeHBlcmllbmNlL0NvbmNlcHR1YWwvQVBTdHlsZUd1aWRlL0FwcGxlU3R5bGVHdWlkZTIwMDMucGRmXQotICB7QXBwbGUgUHVibGljYXRpb25zIFN0eWxlIEd1aWRlfSB3aGVyZXZlciBwb3NzaWJsZS4gIFRoaXMgcGFydGljdWxhcgotICBzdHlsZSBndWlkZSB3YXMgc2VsZWN0ZWQgbW9zdGx5IGJlY2F1c2UgaXQgc2VlbXMgcmVhc29uYWJsZSBhbmQgaXMKLSAgZWFzeSB0byBnZXQgb25saW5lLgotCi0gIFRvcGljcyB3aGljaCBhcmUgbm90IGNvdmVyZWQgaW4gdGhlIEFwcGxlJ3Mgc3R5bGUgZ3VpZGUgd2lsbCBiZQotICBkaXNjdXNzZWQgaW4gdGhpcyBkb2N1bWVudCBpZiBuZWNlc3NhcnkuCi0KLSAgRm9vdG5vdGVzIGFyZSBnZW5lcmFsbHkgZGlzY291cmFnZWQgZHVlIHRvIHRoZSBwYWluIG9mIHVzaW5nCi0gIGZvb3Rub3RlcyBpbiB0aGUgSFRNTCBjb252ZXJzaW9uIG9mIGRvY3VtZW50cy4gIEZvb3Rub3RlcyBtYXkgYmUKLSAgdXNlZCB3aGVuIHRoZXkgYXJlIHRoZSBiZXN0IHdheSB0byBwcmVzZW50IHNwZWNpZmljIGluZm9ybWF0aW9uLgotICBXaGVuIGEgZm9vdG5vdGUgcmVmZXJlbmNlIGlzIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIHNlbnRlbmNlLCBpdAotICBzaG91bGQgZm9sbG93IHRoZSBzZW50ZW5jZS1lbmRpbmcgcHVuY3R1YXRpb24uICBUaGUgXExhVGVYe30gbWFya3VwCi0gIHNob3VsZCBhcHBlYXIgc29tZXRoaW5nIGxpa2UgdGhpczoKLQotXGJlZ2lue3ZlcmJhdGltfQotVGhpcyBzZW50ZW5jZSBoYXMgYSBmb290bm90ZSByZWZlcmVuY2UuJQotICBcZm9vdG5vdGV7VGhpcyBpcyB0aGUgZm9vdG5vdGUgdGV4dC59Ci1cZW5ke3ZlcmJhdGltfQotCi0gIEZvb3Rub3RlcyBtYXkgYXBwZWFyIGluIHRoZSBtaWRkbGUgb2Ygc2VudGVuY2VzIHdoZXJlIGFwcHJvcHJpYXRlLgotCi0gIE1hbnkgc3BlY2lhbCBuYW1lcyBhcmUgdXNlZCBpbiB0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24sIGluY2x1ZGluZwotICB0aGUgbmFtZXMgb2Ygb3BlcmF0aW5nIHN5c3RlbXMsIHByb2dyYW1taW5nIGxhbmd1YWdlcywgc3RhbmRhcmRzCi0gIGJvZGllcywgYW5kIHRoZSBsaWtlLiAgTWFueSBvZiB0aGVzZSB3ZXJlIGFzc2lnbmVkIFxMYVRlWHt9IG1hY3JvcwotICBhdCBzb21lIHBvaW50IGluIHRoZSBkaXN0YW50IHBhc3QsIGFuZCB0aGVzZSBtYWNyb3MgbGl2ZWQgb24gbG9uZwotICBwYXN0IHRoZWlyIHVzZWZ1bG5lc3MuICBJbiB0aGUgY3VycmVudCBtYXJrdXAsIG1vc3Qgb2YgdGhlc2UgZW50aXRpZXMKLSAgYXJlIG5vdCBhc3NpZ25lZCBhbnkgc3BlY2lhbCBtYXJrdXAsIGJ1dCB0aGUgcHJlZmVycmVkIHNwZWxsaW5ncyBhcmUKLSAgZ2l2ZW4gaGVyZSB0byBhaWQgYXV0aG9ycyBpbiBtYWludGFpbmluZyB0aGUgY29uc2lzdGVuY3kgb2YKLSAgcHJlc2VudGF0aW9uIGluIHRoZSBQeXRob24gZG9jdW1lbnRhdGlvbi4KLQotICBPdGhlciB0ZXJtcyBhbmQgd29yZHMgZGVzZXJ2ZSBzcGVjaWFsIG1lbnRpb24gYXMgd2VsbDsgdGhlc2UgY29udmVudGlvbnMKLSAgc2hvdWxkIGJlIHVzZWQgdG8gZW5zdXJlIGNvbnNpc3RlbmN5IHRocm91Z2hvdXQgdGhlIGRvY3VtZW50YXRpb246Ci0KLSAgXGJlZ2lue2Rlc2NyaXB0aW9ufQotICAgIFxpdGVtW0NQVV0KLSAgICBGb3IgYGBjZW50cmFsIHByb2Nlc3NpbmcgdW5pdC4nJyAgTWFueSBzdHlsZSBndWlkZXMgc2F5IHRoaXMKLSAgICBzaG91bGQgYmUgc3BlbGxlZCBvdXQgb24gdGhlIGZpcnN0IHVzZSAoYW5kIGlmIHlvdSBtdXN0IHVzZSBpdCwKLSAgICBkbyBzbyEpLiAgRm9yIHRoZSBQeXRob24gZG9jdW1lbnRhdGlvbiwgdGhpcyBhYmJyZXZpYXRpb24gc2hvdWxkCi0gICAgYmUgYXZvaWRlZCBzaW5jZSB0aGVyZSdzIG5vIHJlYXNvbmFibGUgd2F5IHRvIHByZWRpY3Qgd2hpY2ggb2NjdXJyZW5jZQotICAgIHdpbGwgYmUgdGhlIGZpcnN0IHNlZW4gYnkgdGhlIHJlYWRlci4gIEl0IGlzIGJldHRlciB0byB1c2UgdGhlCi0gICAgd29yZCBgYHByb2Nlc3NvcicnIGluc3RlYWQuCi0KLSAgICBcaXRlbVtcUE9TSVhdCi0gICAgICAgIFRoZSBuYW1lIGFzc2lnbmVkIHRvIGEgcGFydGljdWxhciBncm91cCBvZiBzdGFuZGFyZHMuICBUaGlzIGlzCi0gICAgICAgIGFsd2F5cyB1cHBlcmNhc2UuICBVc2UgdGhlIG1hY3JvIFxtYWNyb3tQT1NJWH0gdG8gcmVwcmVzZW50IHRoaXMKLSAgICAgICAgbmFtZS4KLQotICAgIFxpdGVtW1B5dGhvbl0KLSAgICAgICAgVGhlIG5hbWUgb2Ygb3VyIGZhdm9yaXRlIHByb2dyYW1taW5nIGxhbmd1YWdlIGlzIGFsd2F5cwotICAgICAgICBjYXBpdGFsaXplZC4KLQotICAgIFxpdGVtW1VuaWNvZGVdCi0gICAgICAgIFRoZSBuYW1lIG9mIGEgY2hhcmFjdGVyIHNldCBhbmQgbWF0Y2hpbmcgZW5jb2RpbmcuICBUaGlzIGlzCi0gICAgICAgIGFsd2F5cyB3cml0dGVuIGNhcGl0YWxpemVkLgotCi0gICAgXGl0ZW1bXFVOSVhdCi0gICAgICAgIFRoZSBuYW1lIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIGRldmVsb3BlZCBhdCBBVFwmVCBCZWxsIExhYnMKLSAgICAgICAgaW4gdGhlIGVhcmx5IDE5NzBzLiAgVXNlIHRoZSBtYWNybyBcbWFjcm97VU5JWH0gdG8gdXNlIHRoaXMKLSAgICAgICAgbmFtZS4KLSAgXGVuZHtkZXNjcmlwdGlvbn0KLQotCi1cc2VjdGlvbntcTGFUZVh7fSBQcmltZXIgXGxhYmVse2xhdGV4LXByaW1lcn19Ci0KLSAgVGhpcyBzZWN0aW9uIGlzIGEgYnJpZWYgaW50cm9kdWN0aW9uIHRvIFxMYVRlWHt9IGNvbmNlcHRzIGFuZAotICBzeW50YXgsIHRvIHByb3ZpZGUgYXV0aG9ycyBlbm91Z2ggaW5mb3JtYXRpb24gdG8gYXV0aG9yIGRvY3VtZW50cwotICBwcm9kdWN0aXZlbHkgd2l0aG91dCBoYXZpbmcgdG8gYmVjb21lIGBgXFRlWHt9bmljaWFucy4nJyAgVGhpcyBkb2VzCi0gIG5vdCB0ZWFjaCBldmVyeXRoaW5nIG5lZWRlZCB0byBrbm93IGFib3V0IHdyaXRpbmcgXExhVGVYe30gZm9yCi0gIFB5dGhvbiBkb2N1bWVudGF0aW9uOyBtYW55IG9mIHRoZSBzdGFuZGFyZCBgYGVudmlyb25tZW50cycnIGFyZSBub3QKLSAgZGVzY3JpYmVkIGhlcmUgKHRob3VnaCB5b3Ugd2lsbCBsZWFybiBob3cgdG8gbWFyayBzb21ldGhpbmcgYXMgYW4KLSAgZW52aXJvbm1lbnQpLgotCi0gIFBlcmhhcHMgdGhlIG1vc3QgaW1wb3J0YW50IGNvbmNlcHQgdG8ga2VlcCBpbiBtaW5kIHdoaWxlIG1hcmtpbmcgdXAKLSAgUHl0aG9uIGRvY3VtZW50YXRpb24gaXMgdGhhdCB3aGlsZSBcVGVYe30gaXMgdW5zdHJ1Y3R1cmVkLCBcTGFUZVh7fSB3YXMKLSAgZGVzaWduZWQgYXMgYSBsYXllciBvbiB0b3Agb2YgXFRlWHt9IHdoaWNoIHNwZWNpZmljYWxseSBzdXBwb3J0cwotICBzdHJ1Y3R1cmVkIG1hcmt1cC4gIFRoZSBQeXRob24tc3BlY2lmaWMgbWFya3VwIGlzIGludGVuZGVkIHRvIGV4dGVuZAotICB0aGUgc3RydWN0dXJlIHByb3ZpZGVkIGJ5IHN0YW5kYXJkIFxMYVRlWHt9IGRvY3VtZW50IGNsYXNzZXMgdG8KLSAgc3VwcG9ydCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIFB5dGhvbi4KLQotICBcTGFUZVh7fSBkb2N1bWVudHMgY29udGFpbiB0d28gcGFydHM6IHRoZSBwcmVhbWJsZSBhbmQgdGhlIGJvZHkuCi0gIFRoZSBwcmVhbWJsZSBpcyB1c2VkIHRvIHNwZWNpZnkgY2VydGFpbiBtZXRhZGF0YSBhYm91dCB0aGUgZG9jdW1lbnQKLSAgaXRzZWxmLCBzdWNoIGFzIHRoZSB0aXRsZSwgdGhlIGxpc3Qgb2YgYXV0aG9ycywgdGhlIGRhdGUsIGFuZCB0aGUKLSAgXGVtcGh7Y2xhc3N9IHRoZSBkb2N1bWVudCBiZWxvbmdzIHRvLiAgQWRkaXRpb25hbCBpbmZvcm1hdGlvbiB1c2VkCi0gIHRvIGNvbnRyb2wgaW5kZXggZ2VuZXJhdGlvbiBhbmQgdGhlIHVzZSBvZiBiaWJsaW9ncmFwaGljIGRhdGFiYXNlcwotICBjYW4gYWxzbyBiZSBwbGFjZWQgaW4gdGhlIHByZWFtYmxlLiAgRm9yIG1vc3QgYXV0aG9ycywgdGhlIHByZWFtYmxlCi0gIGNhbiBiZSBtb3N0IGVhc2lseSBjcmVhdGVkIGJ5IGNvcHlpbmcgaXQgZnJvbSBhbiBleGlzdGluZyBkb2N1bWVudAotICBhbmQgbW9kaWZ5aW5nIGEgZmV3IGtleSBwaWVjZXMgb2YgaW5mb3JtYXRpb24uCi0KLSAgVGhlIFxkZm57Y2xhc3N9IG9mIGEgZG9jdW1lbnQgaXMgdXNlZCB0byBwbGFjZSBhIGRvY3VtZW50IHdpdGhpbiBhCi0gIGJyb2FkIGNhdGVnb3J5IG9mIGRvY3VtZW50cyBhbmQgc2V0IHNvbWUgZnVuZGFtZW50YWwgZm9ybWF0dGluZwotICBwcm9wZXJ0aWVzLiAgRm9yIFB5dGhvbiBkb2N1bWVudGF0aW9uLCB0d28gY2xhc3NlcyBhcmUgdXNlZDogdGhlCi0gIFxjb2Rle21hbnVhbH0gY2xhc3MgYW5kIHRoZSBcY29kZXtob3d0b30gY2xhc3MuICBUaGVzZSBjbGFzc2VzIGFsc28KLSAgZGVmaW5lIHRoZSBhZGRpdGlvbmFsIG1hcmt1cCB1c2VkIHRvIGRvY3VtZW50IFB5dGhvbiBjb25jZXB0cyBhbmQKLSAgc3RydWN0dXJlcy4gIFNwZWNpZmljIGluZm9ybWF0aW9uIGFib3V0IHRoZXNlIGNsYXNzZXMgaXMgcHJvdmlkZWQgaW4KLSAgc2VjdGlvbiBccmVme2NsYXNzZXN9LCBgYERvY3VtZW50IENsYXNzZXMsJycgYmVsb3cuICBUaGUgZmlyc3QgdGhpbmcKLSAgaW4gdGhlIHByZWFtYmxlIGlzIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgZG9jdW1lbnQncyBjbGFzcy4KLQotICBBZnRlciB0aGUgY2xhc3MgZGVjbGFyYXRpb24sIGEgbnVtYmVyIG9mIFxlbXBoe21hY3Jvc30gYXJlIHVzZWQgdG8KLSAgcHJvdmlkZSBmdXJ0aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkb2N1bWVudCBhbmQgc2V0dXAgYW55Ci0gIGFkZGl0aW9uYWwgbWFya3VwIHRoYXQgaXMgbmVlZGVkLiAgTm8gb3V0cHV0IGlzIGdlbmVyYXRlZCBmcm9tIHRoZQotICBwcmVhbWJsZTsgaXQgaXMgYW4gZXJyb3IgdG8gaW5jbHVkZSBmcmVlIHRleHQgaW4gdGhlIHByZWFtYmxlCi0gIGJlY2F1c2UgaXQgd291bGQgY2F1c2Ugb3V0cHV0LgotCi0gIFRoZSBkb2N1bWVudCBib2R5IGZvbGxvd3MgdGhlIHByZWFtYmxlLiAgVGhpcyBjb250YWlucyBhbGwgdGhlCi0gIHByaW50ZWQgY29tcG9uZW50cyBvZiB0aGUgZG9jdW1lbnQgbWFya2VkIHVwIHN0cnVjdHVyYWxseS4gIEdlbmVyaWMKLSAgXExhVGVYe30gc3RydWN0dXJlcyBpbmNsdWRlIGhpZXJhcmNoaWNhbCBzZWN0aW9ucywgbnVtYmVyZWQgYW5kCi0gIGJ1bGxldGVkIGxpc3RzLCBhbmQgc3BlY2lhbCBzdHJ1Y3R1cmVzIGZvciB0aGUgZG9jdW1lbnQgYWJzdHJhY3QgYW5kCi0gIGluZGV4ZXMuCi0KLSAgXHN1YnNlY3Rpb257U3ludGF4IFxsYWJlbHtsYXRleC1zeW50YXh9fQotCi0gICAgVGhlcmUgYXJlIHNvbWUgdGhpbmdzIHRoYXQgYW4gYXV0aG9yIG9mIFB5dGhvbiBkb2N1bWVudGF0aW9uIG5lZWRzCi0gICAgdG8ga25vdyBhYm91dCBcTGFUZVh7fSBzeW50YXguCi0KLSAgICBBIFxkZm57Y29tbWVudH0gaXMgc3RhcnRlZCBieSB0aGUgYGBwZXJjZW50JycgY2hhcmFjdGVyCi0gICAgKFxjaGFyYWN0ZXJ7XCV9KSBhbmQgY29udGludWVzIHRocm91Z2ggdGhlIGVuZCBvZiB0aGUgbGluZQotICAgIFxlbXBoe2FuZCBhbGwgbGVhZGluZyB3aGl0ZXNwYWNlIG9uIHRoZSBmb2xsb3dpbmcgbGluZX0uICBUaGlzIGlzCi0gICAgYSBsaXR0bGUgZGlmZmVyZW50IGZyb20gYW55IHByb2dyYW1taW5nIGxhbmd1YWdlIEkga25vdyBvZiwgc28gYW4KLSAgICBleGFtcGxlIGlzIGluIG9yZGVyOgotCi1cYmVnaW57dmVyYmF0aW19Ci1UaGlzIGlzIHRleHQuJSBjb21tZW50Ci0gICAgVGhpcyBpcyBtb3JlIHRleHQuICAlIGFub3RoZXIgY29tbWVudAotU3RpbGwgbW9yZSB0ZXh0LgotXGVuZHt2ZXJiYXRpbX0KLQotICAgIFRoZSBmaXJzdCBub24tY29tbWVudCBjaGFyYWN0ZXIgZm9sbG93aW5nIHRoZSBmaXJzdCBjb21tZW50IGlzIHRoZQotICAgIGxldHRlciBcY2hhcmFjdGVye1R9IG9uIHRoZSBzZWNvbmQgbGluZTsgdGhlIGxlYWRpbmcgd2hpdGVzcGFjZSBvbgotICAgIHRoYXQgbGluZSBpcyBjb25zdW1lZCBhcyBwYXJ0IG9mIHRoZSBmaXJzdCBjb21tZW50LiAgVGhpcyBtZWFucwotICAgIHRoYXQgdGhlcmUgaXMgbm8gc3BhY2UgYmV0d2VlbiB0aGUgZmlyc3QgYW5kIHNlY29uZCBzZW50ZW5jZXMsIHNvCi0gICAgdGhlIHBlcmlvZCBhbmQgbGV0dGVyIFxjaGFyYWN0ZXJ7VH0gd2lsbCBiZSBkaXJlY3RseSBhZGphY2VudCBpbgotICAgIHRoZSB0eXBlc2V0IGRvY3VtZW50LgotCi0gICAgTm90ZSBhbHNvIHRoYXQgdGhvdWdoIHRoZSBmaXJzdCBub24tY29tbWVudCBjaGFyYWN0ZXIgYWZ0ZXIgdGhlCi0gICAgc2Vjb25kIGNvbW1lbnQgaXMgdGhlIGxldHRlciBcY2hhcmFjdGVye1N9LCB0aGVyZSBpcyB3aGl0ZXNwYWNlCi0gICAgcHJlY2VkaW5nIHRoZSBjb21tZW50LCBzbyB0aGUgdHdvIHNlbnRlbmNlcyBhcmUgc2VwYXJhdGVkIGFzCi0gICAgZXhwZWN0ZWQuCi0KLSAgICBBIFxkZm57Z3JvdXB9IGlzIGFuIGVuY2xvc3VyZSBmb3IgYSBjb2xsZWN0aW9uIG9mIHRleHQgYW5kCi0gICAgY29tbWFuZHMgd2hpY2ggZW5jbG9zZXMgdGhlIGZvcm1hdHRpbmcgY29udGV4dCBhbmQgY29uc3RyYWlucyB0aGUKLSAgICBzY29wZSBvZiBhbnkgY2hhbmdlcyB0byB0aGF0IGNvbnRleHQgbWFkZSBieSBjb21tYW5kcyB3aXRoaW4gdGhlCi0gICAgZ3JvdXAuICBHcm91cHMgY2FuIGJlIG5lc3RlZCBoaWVyYXJjaGljYWxseS4gIFRoZSBmb3JtYXR0aW5nCi0gICAgY29udGV4dCBpbmNsdWRlcyB0aGUgZm9udCBhbmQgdGhlIGRlZmluaXRpb24gb2YgYWRkaXRpb25hbCBtYWNyb3MKLSAgICAob3Igb3ZlcnJpZGVzIG9mIG1hY3JvcyBkZWZpbmVkIGluIG91dGVyIGdyb3VwcykuICBTeW50YWN0aWNhbGx5LAotICAgIGdyb3VwcyBhcmUgZW5jbG9zZWQgaW4gYnJhY2VzOgotCi1cYmVnaW57dmVyYmF0aW19Ci17dGV4dCBpbiBhIGdyb3VwfQotXGVuZHt2ZXJiYXRpbX0KLQotICAgIEFuIGFsdGVybmF0ZSBzeW50YXggZm9yIGEgZ3JvdXAgdXNpbmcgYnJhY2tldHMsIFxjb2Rle1suLi5dfSwgaXMKLSAgICB1c2VkIGJ5IG1hY3JvcyBhbmQgZW52aXJvbm1lbnQgY29uc3RydWN0b3JzIHdoaWNoIHRha2Ugb3B0aW9uYWwKLSAgICBwYXJhbWV0ZXJzOyBicmFja2V0cyBkbyBub3Qgbm9ybWFsbHkgaG9sZCBzeW50YWN0aWMgc2lnbmlmaWNhbmNlLgotICAgIEEgZGVnZW5lcmF0ZSBncm91cCwgY29udGFpbmluZyBvbmx5IG9uZSBhdG9taWMgYml0IG9mIGNvbnRlbnQsCi0gICAgZG9lcyBub3QgbmVlZCB0byBoYXZlIGFuIGV4cGxpY2l0IGdyb3VwLCB1bmxlc3MgaXQgaXMgcmVxdWlyZWQgdG8KLSAgICBhdm9pZCBhbWJpZ3VpdHkuICBTaW5jZSBQeXRob24gdGVuZHMgdG93YXJkIHRoZSBleHBsaWNpdCwgZ3JvdXBzCi0gICAgYXJlIGFsc28gbWFkZSBleHBsaWNpdCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBtYXJrdXAuCi0KLSAgICBHcm91cHMgYXJlIHVzZWQgb25seSBzcGFyaW5nbHkgaW4gdGhlIFB5dGhvbiBkb2N1bWVudGF0aW9uLCBleGNlcHQKLSAgICBmb3IgdGhlaXIgdXNlIGluIG1hcmtpbmcgcGFyYW1ldGVycyB0byBtYWNyb3MgYW5kIGVudmlyb25tZW50cy4KLQotICAgIEEgXGRmbnttYWNyb30gaXMgdXN1YWxseSBhIHNpbXBsZSBjb25zdHJ1Y3Qgd2hpY2ggaXMgaWRlbnRpZmllZCBieQotICAgIG5hbWUgYW5kIGNhbiB0YWtlIHNvbWUgbnVtYmVyIG9mIHBhcmFtZXRlcnMuICBJbiBub3JtYWwgXExhVGVYe30KLSAgICB1c2FnZSwgb25lIG9mIHRoZXNlIGNhbiBiZSBvcHRpb25hbC4gIFRoZSBtYXJrdXAgaXMgaW50cm9kdWNlZAotICAgIHVzaW5nIHRoZSBiYWNrc2xhc2ggY2hhcmFjdGVyIChcY2hhcmFjdGVye1xlfSksIGFuZCB0aGUgbmFtZSBpcwotICAgIGdpdmVuIGJ5IGFscGhhYmV0aWMgY2hhcmFjdGVycyAobm8gZGlnaXRzLCBoeXBoZW5zLCBvcgotICAgIHVuZGVyc2NvcmVzKS4gIFJlcXVpcmVkIHBhcmFtZXRlcnMgc2hvdWxkIGJlIG1hcmtlZCBhcyBhIGdyb3VwLAotICAgIGFuZCBvcHRpb25hbCBwYXJhbWV0ZXJzIHNob3VsZCBiZSBtYXJrZWQgdXNpbmcgdGhlIGFsdGVybmF0ZQotICAgIHN5bnRheCBmb3IgYSBncm91cC4KLQotICAgIEZvciBleGFtcGxlLCBhIG1hY3JvIHdoaWNoIHRha2VzIGEgc2luZ2xlIHBhcmFtZXRlcgotICAgIHdvdWxkIGFwcGVhciBsaWtlIHRoaXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLVxuYW1le3BhcmFtZXRlcn0KLVxlbmR7dmVyYmF0aW19Ci0KLSAgICBBIG1hY3JvIHdoaWNoIHRha2VzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciB3b3VsZCBiZSB0eXBlZCBsaWtlIHRoaXMKLSAgICB3aGVuIHRoZSBvcHRpb25hbCBwYXJhbWV0ZXIgaXMgZ2l2ZW46Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLVxuYW1lW29wdGlvbmFsXQotXGVuZHt2ZXJiYXRpbX0KLQotICAgIElmIGJvdGggb3B0aW9uYWwgYW5kIHJlcXVpcmVkIHBhcmFtZXRlcnMgYXJlIHRvIGJlIHJlcXVpcmVkLCBpdAotICAgIGxvb2tzIGxpa2UgdGhpczoKLQotXGJlZ2lue3ZlcmJhdGltfQotXG5hbWVbb3B0aW9uYWxde3JlcXVpcmVkfQotXGVuZHt2ZXJiYXRpbX0KLQotICAgIEEgbWFjcm8gbmFtZSBtYXkgYmUgZm9sbG93ZWQgYnkgYSBzcGFjZSBvciBuZXdsaW5lOyBhIHNwYWNlCi0gICAgYmV0d2VlbiB0aGUgbWFjcm8gbmFtZSBhbmQgYW55IHBhcmFtZXRlcnMgd2lsbCBiZSBjb25zdW1lZCwgYnV0Ci0gICAgdGhpcyB1c2FnZSBpcyBub3QgcHJhY3RpY2VkIGluIHRoZSBQeXRob24gZG9jdW1lbnRhdGlvbi4gIFN1Y2ggYQotICAgIHNwYWNlIGlzIHN0aWxsIGNvbnN1bWVkIGlmIHRoZXJlIGFyZSBubyBwYXJhbWV0ZXJzIHRvIHRoZSBtYWNybywKLSAgICBpbiB3aGljaCBjYXNlIGluc2VydGluZyBhbiBlbXB0eSBncm91cCAoXGNvZGV7XHtcfX0pIG9yIGV4cGxpY2l0Ci0gICAgd29yZCBzcGFjZSAoXHNhbXB7XGVcIH0pIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBtYWNybyBuYW1lIGhlbHBzIHRvCi0gICAgYXZvaWQgcnVubmluZyB0aGUgZXhwYW5zaW9uIG9mIHRoZSBtYWNybyBpbnRvIHRoZSBmb2xsb3dpbmcgdGV4dC4KLSAgICBNYWNyb3Mgd2hpY2ggdGFrZSBubyBwYXJhbWV0ZXJzIGJ1dCB3aGljaCBzaG91bGQgbm90IGJlIGZvbGxvd2VkCi0gICAgYnkgYSB3b3JkIHNwYWNlIGRvIG5vdCBuZWVkIHNwZWNpYWwgdHJlYXRtZW50IGlmIHRoZSBmb2xsb3dpbmcKLSAgICBjaGFyYWN0ZXIgaW4gdGhlIGRvY3VtZW50IHNvdXJjZSBpZiBub3QgYSBuYW1lIGNoYXJhY3RlciAoc3VjaCBhcwotICAgIHB1bmN0dWF0aW9uKS4KLQotICAgIEVhY2ggbGluZSBvZiB0aGlzIGV4YW1wbGUgc2hvd3MgYW4gYXBwcm9wcmlhdGUgd2F5IHRvIHdyaXRlIHRleHQKLSAgICB3aGljaCBpbmNsdWRlcyBhIG1hY3JvIHdoaWNoIHRha2VzIG5vIHBhcmFtZXRlcnM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLVRoaXMgXFVOSVh7fSBpcyBmb2xsb3dlZCBieSBhIHNwYWNlLgotVGhpcyBcVU5JWFwgaXMgYWxzbyBmb2xsb3dlZCBieSBhIHNwYWNlLgotXFVOSVgsIGZvbGxvd2VkIGJ5IGEgY29tbWEsIG5lZWRzIG5vIGFkZGl0aW9uYWwgbWFya3VwLgotXGVuZHt2ZXJiYXRpbX0KLQotICAgIEFuIFxkZm57ZW52aXJvbm1lbnR9IGlzIGEgbGFyZ2VyIGNvbnN0cnVjdCB0aGFuIGEgbWFjcm8sIGFuZCBjYW4KLSAgICBiZSB1c2VkIGZvciB0aGluZ3Mgd2l0aCBtb3JlIGNvbnRlbnQgdGhhbiB3b3VsZCBjb252ZW5pZW50bHkgZml0Ci0gICAgaW4gYSBtYWNybyBwYXJhbWV0ZXIuICBUaGV5IGFyZSBwcmltYXJpbHkgdXNlZCB3aGVuIGZvcm1hdHRpbmcKLSAgICBwYXJhbWV0ZXJzIG5lZWQgdG8gYmUgY2hhbmdlZCBiZWZvcmUgYW5kIGFmdGVyIGEgbGFyZ2UgY2h1bmsgb2YKLSAgICBjb250ZW50LCBidXQgdGhlIGNvbnRlbnQgaXRzZWxmIG5lZWRzIHRvIGJlIGhpZ2hseSBmbGV4aWJsZS4gIENvZGUKLSAgICBzYW1wbGVzIGFyZSBwcmVzZW50ZWQgdXNpbmcgYW4gZW52aXJvbm1lbnQsIGFuZCBkZXNjcmlwdGlvbnMgb2YKLSAgICBmdW5jdGlvbnMsIG1ldGhvZHMsIGFuZCBjbGFzc2VzIGFyZSBhbHNvIG1hcmtlZCB1c2luZyBlbnZpcm9ubWVudHMuCi0KLSAgICBTaW5jZSB0aGUgY29udGVudCBvZiBhbiBlbnZpcm9ubWVudCBpcyBmcmVlLWZvcm0gYW5kIGNhbiBjb25zaXN0Ci0gICAgb2Ygc2V2ZXJhbCBwYXJhZ3JhcGhzLCB0aGV5IGFyZSBhY3R1YWxseSBtYXJrZWQgdXNpbmcgYSBwYWlyIG9mCi0gICAgbWFjcm9zOiBcbWFjcm97YmVnaW59IGFuZCBcbWFjcm97ZW5kfS4gIFRoZXNlIG1hY3JvcyBib3RoIHRha2UgdGhlCi0gICAgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgYXMgYSBwYXJhbWV0ZXIuICBBbiBleGFtcGxlIGlzIHRoZQotICAgIGVudmlyb25tZW50IHVzZWQgdG8gbWFyayB0aGUgYWJzdHJhY3Qgb2YgYSBkb2N1bWVudDoKLQotXGJlZ2lue3ZlcmJhdGltfQotXGJlZ2lue2Fic3RyYWN0fQotICBUaGlzIGlzIHRoZSB0ZXh0IG9mIHRoZSBhYnN0cmFjdC4gIEl0IGNvbmNpc2VseSBleHBsYWlucyB3aGF0Ci0gIGluZm9ybWF0aW9uIGlzIGZvdW5kIGluIHRoZSBkb2N1bWVudC4KLQotICBJdCBjYW4gY29uc2lzdCBvZiBtdWx0aXBsZSBwYXJhZ3JhcGhzLgotXGVuZHthYnN0cmFjdH0KLVxlbmR7dmVyYmF0aW19Ci0KLSAgICBBbiBlbnZpcm9ubWVudCBjYW4gYWxzbyBoYXZlIHJlcXVpcmVkIGFuZCBvcHRpb25hbCBwYXJhbWV0ZXJzIG9mCi0gICAgaXRzIG93bi4gIFRoZXNlIGZvbGxvdyB0aGUgcGFyYW1ldGVyIG9mIHRoZSBcbWFjcm97YmVnaW59IG1hY3JvLgotICAgIFRoaXMgZXhhbXBsZSBzaG93cyBhbiBlbnZpcm9ubWVudCB3aGljaCB0YWtlcyBhIHNpbmdsZSByZXF1aXJlZAotICAgIHBhcmFtZXRlcjoKLQotXGJlZ2lue3ZlcmJhdGltfQotXGJlZ2lue2RhdGFkZXNjfXtjb250cm9sbmFtZXN9Ci0gIEEgMzMtZWxlbWVudCBzdHJpbmcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgXEFTQ0lJe30gbW5lbW9uaWNzIGZvcgotICB0aGUgdGhpcnR5LXR3byBcQVNDSUl7fSBjb250cm9sIGNoYXJhY3RlcnMgZnJvbSAwIChOVUwpIHRvIDB4MWYKLSAgKFVTKSwgaW4gb3JkZXIsIHBsdXMgdGhlIG1uZW1vbmljIFxzYW1we1NQfSBmb3IgdGhlIHNwYWNlIGNoYXJhY3Rlci4KLVxlbmR7ZGF0YWRlc2N9Ci1cZW5ke3ZlcmJhdGltfQotCi0gICAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIGxlc3MtdXNlZCBtYXJrcyBpbiBcTGFUZVh7fSB3aGljaCBhcmUgdXNlZAotICAgIHRvIGVudGVyIGNoYXJhY3RlcnMgd2hpY2ggYXJlIG5vdCBmb3VuZCBpbiBcQVNDSUl7fSBvciB3aGljaCBhCi0gICAgY29uc2lkZXJlZCBzcGVjaWFsLCBvciBcZW1waHthY3RpdmV9IGluIFxUZVh7fSBvciBcTGFUZVguICBHaXZlbgotICAgIHRoYXQgdGhlc2UgYXJlIG9mdGVuIHVzZWQgYWRqYWNlbnQgdG8gb3RoZXIgY2hhcmFjdGVycywgdGhlIG1hcmt1cAotICAgIHJlcXVpcmVkIHRvIHByb2R1Y2UgdGhlIHByb3BlciBjaGFyYWN0ZXIgbWF5IG5lZWQgdG8gYmUgZm9sbG93ZWQKLSAgICBieSBhIHNwYWNlIG9yIGFuIGVtcHR5IGdyb3VwLCBvciB0aGUgbWFya3VwIGNhbiBiZSBlbmNsb3NlZCBpbiBhCi0gICAgZ3JvdXAuICBTb21lIHdoaWNoIGFyZSBmb3VuZCBpbiBQeXRob24gZG9jdW1lbnRhdGlvbiBhcmU6Ci0KLVxiZWdpbnt0YWJsZWlpfXtjfGx9e3RleHRybX17Q2hhcmFjdGVyfXtNYXJrdXB9Ci0gIFxsaW5laWl7XHRleHRhc2NpaWNpcmN1bX17XGNvZGV7XGUgdGV4dGFzY2lpY2lyY3VtfX0KLSAgXGxpbmVpaXtcdGV4dGFzY2lpdGlsZGV9e1xjb2Rle1xlIHRleHRhc2NpaXRpbGRlfX0KLSAgXGxpbmVpaXtcdGV4dGdyZWF0ZXJ9e1xjb2Rle1xlIHRleHRncmVhdGVyfX0KLSAgXGxpbmVpaXtcdGV4dGxlc3N9e1xjb2Rle1xlIHRleHRsZXNzfX0KLSAgXGxpbmVpaXtcYyBjfXtcY29kZXtcZSBjIGN9fQotICBcbGluZWlpe1wib317XGNvZGV7XGUib319Ci0gIFxsaW5laWl7XG99e1xjb2Rle1xlIG99fQotXGVuZHt0YWJsZWlpfQotCi0KLSAgXHN1YnNlY3Rpb257SGllcmFyY2hpY2FsIFN0cnVjdHVyZSBcbGFiZWx7bGF0ZXgtc3RydWN0dXJlfX0KLQotICAgIFxMYVRlWHt9IGV4cGVjdHMgZG9jdW1lbnRzIHRvIGJlIGFycmFuZ2VkIGluIGEgY29udmVudGlvbmFsLAotICAgIGhpZXJhcmNoaWNhbCB3YXksIHdpdGggY2hhcHRlcnMsIHNlY3Rpb25zLCBzdWItc2VjdGlvbnMsCi0gICAgYXBwZW5kaXhlcywgYW5kIHRoZSBsaWtlLiAgVGhlc2UgYXJlIG1hcmtlZCB1c2luZyBtYWNyb3MgcmF0aGVyCi0gICAgdGhhbiBlbnZpcm9ubWVudHMsIHByb2JhYmx5IGJlY2F1c2UgdGhlIGVuZCBvZiBhIHNlY3Rpb24gY2FuIGJlCi0gICAgc2FmZWx5IGluZmVycmVkIHdoZW4gYSBzZWN0aW9uIG9mIGVxdWFsIG9yIGhpZ2hlciBsZXZlbCBzdGFydHMuCi0KLSAgICBUaGVyZSBhcmUgc2l4IGBgbGV2ZWxzJycgb2Ygc2VjdGlvbmluZyBpbiB0aGUgZG9jdW1lbnQgY2xhc3NlcwotICAgIHVzZWQgZm9yIFB5dGhvbiBkb2N1bWVudGF0aW9uLCBhbmQgdGhlIGRlZXBlc3QgdHdvCi0gICAgbGV2ZWxzXGZvb3Rub3Rle1RoZSBkZWVwZXN0IGxldmVscyBoYXZlIHRoZSBoaWdoZXN0IG51bWJlcnMgaW4gdGhlCi0gICAgICB0YWJsZS59IGFyZSBub3QgdXNlZC4gIFRoZSBsZXZlbHMgYXJlOgotCi0gICAgICBcYmVnaW57dGFibGVpaWl9e2N8bHxjfXt0ZXh0cm19e0xldmVsfXtNYWNybyBOYW1lfXtOb3Rlc30KLSAgICAgICAgXGxpbmVpaWl7MX17XG1hY3Jve2NoYXB0ZXJ9fXsoMSl9Ci0gICAgICAgIFxsaW5laWlpezJ9e1xtYWNyb3tzZWN0aW9ufX17fQotICAgICAgICBcbGluZWlpaXszfXtcbWFjcm97c3Vic2VjdGlvbn19e30KLSAgICAgICAgXGxpbmVpaWl7NH17XG1hY3Jve3N1YnN1YnNlY3Rpb259fXt9Ci0gICAgICAgIFxsaW5laWlpezV9e1xtYWNyb3twYXJhZ3JhcGh9fXsoMil9Ci0gICAgICAgIFxsaW5laWlpezZ9e1xtYWNyb3tzdWJwYXJhZ3JhcGh9fXt9Ci0gICAgICBcZW5ke3RhYmxlaWlpfQotCi0gICAgXG5vaW5kZW50Ci0gICAgTm90ZXM6Ci0KLSAgICBcYmVnaW57ZGVzY3JpcHRpb259Ci0gICAgICBcaXRlbVsoMSldCi0gICAgICBPbmx5IHVzZWQgZm9yIHRoZSBcY29kZXttYW51YWx9IGRvY3VtZW50cywgYXMgZGVzY3JpYmVkIGluCi0gICAgICBzZWN0aW9uIFxyZWZ7Y2xhc3Nlc30sIGBgRG9jdW1lbnQgQ2xhc3Nlcy4nJwotICAgICAgXGl0ZW1bKDIpXQotICAgICAgTm90IHRoZSBzYW1lIGFzIGEgcGFyYWdyYXBoIG9mIHRleHQ7IG5vYm9keSBzZWVtcyB0byB1c2UgdGhpcy4KLSAgICBcZW5ke2Rlc2NyaXB0aW9ufQotCi0KLSAgXHN1YnNlY3Rpb257Q29tbW9uIEVudmlyb25tZW50cyBcbGFiZWx7bGF0ZXgtZW52aXJvbm1lbnRzfX0KLQotICAgIFxMYVRlWHt9IHByb3ZpZGVzIGEgdmFyaWV0eSBvZiBlbnZpcm9ubWVudHMgZXZlbiB3aXRob3V0IHRoZQotICAgIGFkZGl0aW9uYWwgbWFya3VwIHByb3ZpZGVkIGJ5IHRoZSBQeXRob24tc3BlY2lmaWMgZG9jdW1lbnQgY2xhc3NlcwotICAgIGludHJvZHVjZWQgaW4gdGhlIG5leHQgc2VjdGlvbi4gIFRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnRzIGFyZQotICAgIHByb3ZpZGVkIGFzIHBhcnQgb2Ygc3RhbmRhcmQgXExhVGVYe30gYW5kIGFyZSBiZWluZyB1c2VkIGluIHRoZQotICAgIHN0YW5kYXJkIFB5dGhvbiBkb2N1bWVudGF0aW9uOyBkZXNjcmlwdGlvbnMgd2lsbCBiZSBhZGRlZCBoZXJlIGFzCi0gICAgdGltZSBhbGxvd3MuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLWFic3RyYWN0Ci1hbGx0dAotZGVzY3JpcHRpb24KLWRpc3BsYXltYXRoCi1kb2N1bWVudAotZW51bWVyYXRlCi1maWd1cmUKLWZsdXNobGVmdAotaXRlbWl6ZQotbGlzdAotbWF0aAotcXVvdGF0aW9uCi1xdW90ZQotc2xvcHB5cGFyCi12ZXJiYXRpbQotXGVuZHt2ZXJiYXRpbX0KLQotCi1cc2VjdGlvbntEb2N1bWVudCBDbGFzc2VzIFxsYWJlbHtjbGFzc2VzfX0KLQotICBUd28gXExhVGVYe30gZG9jdW1lbnQgY2xhc3NlcyBhcmUgZGVmaW5lZCBzcGVjaWZpY2FsbHkgZm9yIHVzZSB3aXRoCi0gIHRoZSBQeXRob24gZG9jdW1lbnRhdGlvbi4gIFRoZSBcY29kZXttYW51YWx9IGNsYXNzIGlzIGZvciBsYXJnZQotICBkb2N1bWVudHMgd2hpY2ggYXJlIHNlY3Rpb25lZCBpbnRvIGNoYXB0ZXJzLCBhbmQgdGhlIFxjb2Rle2hvd3RvfQotICBjbGFzcyBpcyBmb3Igc21hbGxlciBkb2N1bWVudHMuCi0KLSAgVGhlIFxjb2Rle21hbnVhbH0gZG9jdW1lbnRzIGFyZSBsYXJnZXIgYW5kIGFyZSB1c2VkIGZvciBtb3N0IG9mIHRoZQotICBzdGFuZGFyZCBkb2N1bWVudHMuICBUaGlzIGRvY3VtZW50IGNsYXNzIGlzIGJhc2VkIG9uIHRoZSBzdGFuZGFyZAotICBcTGFUZVh7fSBcY29kZXtyZXBvcnR9IGNsYXNzIGFuZCBpcyBmb3JtYXR0ZWQgdmVyeSBtdWNoIGxpa2UgYSBsb25nCi0gIHRlY2huaWNhbCByZXBvcnQuICBUaGUgXGNpdGV0aXRsZVsuLi9yZWYvcmVmLmh0bWxde1B5dGhvbiBSZWZlcmVuY2UKLSAgTWFudWFsfSBpcyBhIGdvb2QgZXhhbXBsZSBvZiBhIFxjb2Rle21hbnVhbH0gZG9jdW1lbnQsIGFuZCB0aGUKLSAgXGNpdGV0aXRsZVsuLi9saWIvbGliLmh0bWxde1B5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZX0gaXMgYSBsYXJnZQotICBleGFtcGxlLgotCi0gIFRoZSBcY29kZXtob3d0b30gZG9jdW1lbnRzIGFyZSBzaG9ydGVyLCBhbmQgZG9uJ3QgaGF2ZSB0aGUgbGFyZ2UKLSAgc3RydWN0dXJlIG9mIHRoZSBcY29kZXttYW51YWx9IGRvY3VtZW50cy4gIFRoaXMgY2xhc3MgaXMgYmFzZWQgb24KLSAgdGhlIHN0YW5kYXJkIFxMYVRlWHt9IFxjb2Rle2FydGljbGV9IGNsYXNzIGFuZCBpcyBmb3JtYXR0ZWQgc29tZXdoYXQKLSAgbGlrZSB0aGUgTGludXggRG9jdW1lbnRhdGlvbiBQcm9qZWN0J3MgYGBIT1dUTycnIHNlcmllcyBhcyBkb25lCi0gIG9yaWdpbmFsbHkgdXNpbmcgdGhlIExpbnV4RG9jIHNvZnR3YXJlLiAgVGhlIG9yaWdpbmFsIGludGVudCBmb3IgdGhlCi0gIGRvY3VtZW50IGNsYXNzIHdhcyB0aGF0IGl0IHNlcnZlIGEgc2ltaWxhciByb2xlIGFzIHRoZSBMRFAncyBIT1dUTwotICBzZXJpZXMsIGJ1dCB0aGUgYXBwbGljYWJpbGl0eSBvZiB0aGUgY2xhc3MgdHVybnMgb3V0IHRvIGJlIHNvbWV3aGF0Ci0gIGJyb2FkZXIuICBUaGlzIGNsYXNzIGlzIHVzZWQgZm9yIGBgaG93LXRvJycgZG9jdW1lbnRzICh0aGlzCi0gIGRvY3VtZW50IGlzIGFuIGV4YW1wbGUpIGFuZCBmb3Igc2hvcnRlciByZWZlcmVuY2UgbWFudWFscyBmb3Igc21hbGwsCi0gIGZhaXJseSBjb2hlc2l2ZSBtb2R1bGUgbGlicmFyaWVzLiAgRXhhbXBsZXMgb2YgdGhlIGxhdGVyIHVzZSBpbmNsdWRlCi1cY2l0ZXRpdGxlW2h0dHA6Ly9zdGFyc2hpcC5weXRob24ubmV0L2NyZXcvZmRyYWtlL21hbnVhbHMva3JiNXB5L2tyYjVweS5odG1sXXtVc2luZwotICBLZXJiZXJvcyBmcm9tIFB5dGhvbn0sIHdoaWNoIGNvbnRhaW5zIHJlZmVyZW5jZSBtYXRlcmlhbCBmb3IgYW4KLSAgZXh0ZW5zaW9uIHBhY2thZ2UuICBUaGVzZSBkb2N1bWVudHMgYXJlIHJvdWdobHkgZXF1aXZhbGVudCB0byBhCi0gIHNpbmdsZSBjaGFwdGVyIGZyb20gYSBsYXJnZXIgd29yay4KLQotCi1cc2VjdGlvbntTcGVjaWFsIE1hcmt1cCBDb25zdHJ1Y3RzIFxsYWJlbHtzcGVjaWFsLWNvbnN0cnVjdHN9fQotCi0gIFRoZSBQeXRob24gZG9jdW1lbnQgY2xhc3NlcyBkZWZpbmUgYSBsb3Qgb2YgbmV3IGVudmlyb25tZW50cyBhbmQKLSAgbWFjcm9zLiAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSByZWZlcmVuY2UgbWF0ZXJpYWwgZm9yIHRoZXNlCi0gIGZhY2lsaXRpZXMuICBEb2N1bWVudGF0aW9uIGZvciBgYHN0YW5kYXJkJycgXExhVGVYe30gY29uc3RydWN0cyBpcwotICBub3QgaW5jbHVkZWQgaGVyZSwgdGhvdWdoIHRoZXkgYXJlIHVzZWQgaW4gdGhlIFB5dGhvbiBkb2N1bWVudGF0aW9uLgotCi0gIFxzdWJzZWN0aW9ue01hcmt1cCBmb3IgdGhlIFByZWFtYmxlIFxsYWJlbHtwcmVhbWJsZS1pbmZvfX0KLQotICAgIFxiZWdpbnttYWNyb2Rlc2N9e3JlbGVhc2V9e1xwe3Zlcn19Ci0gICAgICBTZXQgdGhlIHZlcnNpb24gbnVtYmVyIGZvciB0aGUgc29mdHdhcmUgZGVzY3JpYmVkIGluIHRoZQotICAgICAgZG9jdW1lbnQuCi0gICAgXGVuZHttYWNyb2Rlc2N9Ci0KLSAgICBcYmVnaW57bWFjcm9kZXNjfXtzZXRzaG9ydHZlcnNpb259e1xwe3N2ZXJ9fQotICAgICAgU3BlY2lmeSB0aGUgYGBzaG9ydCcnIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBkb2N1bWVudGVkIHNvZnR3YXJlCi0gICAgICB0byBiZSBcdmFye3N2ZXJ9LgotICAgIFxlbmR7bWFjcm9kZXNjfQotCi0gIFxzdWJzZWN0aW9ue01ldGEtaW5mb3JtYXRpb24gTWFya3VwIFxsYWJlbHttZXRhLWluZm99fQotCi0gICAgXGJlZ2lue21hY3JvZGVzY317c2VjdGlvbmF1dGhvcn17XHB7YXV0aG9yfVxwe2VtYWlsfX0KLSAgICAgIElkZW50aWZpZXMgdGhlIGF1dGhvciBvZiB0aGUgY3VycmVudCBzZWN0aW9uLiAgXHZhcnthdXRob3J9Ci0gICAgICBzaG91bGQgYmUgdGhlIGF1dGhvcidzIG5hbWUgc3VjaCB0aGF0IGl0IGNhbiBiZSB1c2VkIGZvcgotICAgICAgcHJlc2VudGF0aW9uICh0aG91Z2ggaXQgaXNuJ3QpLCBhbmQgXHZhcntlbWFpbH0gc2hvdWxkIGJlIHRoZQotICAgICAgYXV0aG9yJ3MgZW1haWwgYWRkcmVzcy4gIFRoZSBkb21haW4gbmFtZSBwb3J0aW9uIG9mCi0gICAgICB0aGUgYWRkcmVzcyBzaG91bGQgYmUgbG93ZXIgY2FzZS4KLQotICAgICAgTm8gcHJlc2VudGF0aW9uIGlzIGdlbmVyYXRlZCBmcm9tIHRoaXMgbWFya3VwLCBidXQgaXQgaXMgdXNlZCB0bwotICAgICAgaGVscCBrZWVwIHRyYWNrIG9mIGNvbnRyaWJ1dGlvbnMuCi0gICAgXGVuZHttYWNyb2Rlc2N9Ci0KLSAgXHN1YnNlY3Rpb257SW5mb3JtYXRpb24gVW5pdHMgXGxhYmVse2luZm8tdW5pdHN9fQotCi0gICAgWFhYIEV4cGxhaW4gdGVybWlub2xvZ3ksIG9yIGNvbWUgdXAgd2l0aCBzb21ldGhpbmcgbW9yZSBgYGxheS4nJwotCi0gICAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIGVudmlyb25tZW50cyB1c2VkIHRvIGRlc2NyaWJlIHNwZWNpZmljCi0gICAgZmVhdHVyZXMgcHJvdmlkZWQgYnkgbW9kdWxlcy4gIEVhY2ggZW52aXJvbm1lbnQgcmVxdWlyZXMKLSAgICBwYXJhbWV0ZXJzIG5lZWRlZCB0byBwcm92aWRlIGJhc2ljIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgaXMgYmVpbmcKLSAgICBkZXNjcmliZWQsIGFuZCB0aGUgZW52aXJvbm1lbnQgY29udGVudCBzaG91bGQgYmUgdGhlIGRlc2NyaXB0aW9uLgotICAgIE1vc3Qgb2YgdGhlc2UgZW52aXJvbm1lbnRzIG1ha2UgZW50cmllcyBpbiB0aGUgZ2VuZXJhbCBpbmRleCAoaWYKLSAgICBvbmUgaXMgYmVpbmcgcHJvZHVjZWQgZm9yIHRoZSBkb2N1bWVudCk7IGlmIG5vIGluZGV4IGVudHJ5IGlzCi0gICAgZGVzaXJlZCwgbm9uLWluZGV4aW5nIHZhcmlhbnRzIGFyZSBhdmFpbGFibGUgZm9yIG1hbnkgb2YgdGhlc2UKLSAgICBlbnZpcm9ubWVudHMuICBUaGUgZW52aXJvbm1lbnRzIGhhdmUgbmFtZXMgb2YgdGhlIGZvcm0KLSAgICBcY29kZXtcdmFye2ZlYXR1cmV9ZGVzY30sIGFuZCB0aGUgbm9uLWluZGV4aW5nIHZhcmlhbnRzIGFyZSBuYW1lZAotICAgIFxjb2Rle1x2YXJ7ZmVhdHVyZX1kZXNjbml9LiAgVGhlIGF2YWlsYWJsZSB2YXJpYW50cyBhcmUgZXhwbGljaXRseQotICAgIGluY2x1ZGVkIGluIHRoZSBsaXN0IGJlbG93LgotCi0gICAgRm9yIGVhY2ggb2YgdGhlc2UgZW52aXJvbm1lbnRzLCB0aGUgZmlyc3QgcGFyYW1ldGVyLCBcdmFye25hbWV9LAotICAgIHByb3ZpZGVzIHRoZSBuYW1lIGJ5IHdoaWNoIHRoZSBmZWF0dXJlIGlzIGFjY2Vzc2VkLgotCi0gICAgRW52aXJvbm1lbnRzIHdoaWNoIGRlc2NyaWJlIGZlYXR1cmVzIG9mIG9iamVjdHMgd2l0aGluIGEgbW9kdWxlLAotICAgIHN1Y2ggYXMgb2JqZWN0IG1ldGhvZHMgb3IgZGF0YSBhdHRyaWJ1dGVzLCBhbGxvdyBhbiBvcHRpb25hbAotICAgIFx2YXJ7dHlwZSBuYW1lfSBwYXJhbWV0ZXIuICBXaGVuIHRoZSBmZWF0dXJlIGlzIGFuIGF0dHJpYnV0ZSBvZgotICAgIGNsYXNzIGluc3RhbmNlcywgXHZhcnt0eXBlIG5hbWV9IG9ubHkgbmVlZHMgdG8gYmUgZ2l2ZW4gaWYgdGhlCi0gICAgY2xhc3Mgd2FzIG5vdCB0aGUgbW9zdCByZWNlbnRseSBkZXNjcmliZWQgY2xhc3MgaW4gdGhlIG1vZHVsZTsgdGhlCi0gICAgXHZhcntuYW1lfSB2YWx1ZSBmcm9tIHRoZSBtb3N0IHJlY2VudCBcZW52e2NsYXNzZGVzY30gaXMgaW1wbGllZC4KLSAgICBGb3IgZmVhdHVyZXMgb2YgYnVpbHQtaW4gb3IgZXh0ZW5zaW9uIHR5cGVzLCB0aGUgXHZhcnt0eXBlIG5hbWV9Ci0gICAgdmFsdWUgc2hvdWxkIGFsd2F5cyBiZSBwcm92aWRlZC4gIEFub3RoZXIgc3BlY2lhbCBjYXNlIGluY2x1ZGVzCi0gICAgbWV0aG9kcyBhbmQgbWVtYmVycyBvZiBnZW5lcmFsIGBgcHJvdG9jb2xzLCcnIHN1Y2ggYXMgdGhlCi0gICAgZm9ybWF0dGVyIGFuZCB3cml0ZXIgcHJvdG9jb2xzIGRlc2NyaWJlZCBmb3IgdGhlCi0gICAgXG1vZHVsZXtmb3JtYXR0ZXJ9IG1vZHVsZTogdGhlc2UgbWF5IGJlIGRvY3VtZW50ZWQgd2l0aG91dCBhbnkKLSAgICBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLCBhbmQgd2lsbCBhbHdheXMgcmVxdWlyZSB0aGUKLSAgICBcdmFye3R5cGUgbmFtZX0gcGFyYW1ldGVyIHRvIGJlIHByb3ZpZGVkLgotCi0gICAgXGJlZ2lue2VudmRlc2N9e2NmdW5jZGVzY317XHB7dHlwZX1ccHtuYW1lfVxwe2FyZ3N9fQotICAgICAgRW52aXJvbm1lbnQgdXNlZCB0byBkZXNjcmliZWQgYSBDIGZ1bmN0aW9uLiAgVGhlIFx2YXJ7dHlwZX0KLSAgICAgIHNob3VsZCBiZSBzcGVjaWZpZWQgYXMgYSBca2V5d29yZHt0eXBlZGVmfSBuYW1lLCBcY29kZXtzdHJ1Y3QKLSAgICAgIFx2YXJ7dGFnfX0sIG9yIHRoZSBuYW1lIG9mIGEgcHJpbWl0aXZlIHR5cGUuICBJZiBpdCBpcyBhIHBvaW50ZXIKLSAgICAgIHR5cGUsIHRoZSB0cmFpbGluZyBhc3RlcmlzayBzaG91bGQgbm90IGJlIHByZWNlZGVkIGJ5IGEgc3BhY2UuCi0gICAgICBcdmFye25hbWV9IHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gKG9yIGZ1bmN0aW9uLWxpa2UKLSAgICAgIHByZS1wcm9jZXNzb3IgbWFjcm8pLCBhbmQgXHZhcnthcmdzfSBzaG91bGQgZ2l2ZSB0aGUgdHlwZXMgYW5kCi0gICAgICBuYW1lcyBvZiB0aGUgcGFyYW1ldGVycy4gIFRoZSBuYW1lcyBuZWVkIHRvIGJlIGdpdmVuIHNvIHRoZXkgbWF5Ci0gICAgICBiZSB1c2VkIGluIHRoZSBkZXNjcmlwdGlvbi4KLSAgICBcZW5ke2VudmRlc2N9Ci0KLSAgICBcYmVnaW57ZW52ZGVzY317Y21lbWJlcmRlc2N9e1xwe2NvbnRhaW5lcn1ccHt0eXBlfVxwe25hbWV9fQotICAgICAgRGVzY3JpcHRpb24gZm9yIGEgc3RydWN0dXJlIG1lbWJlci4gIFx2YXJ7Y29udGFpbmVyfSBzaG91bGQgYmUKLSAgICAgIHRoZSBca2V5d29yZHt0eXBlZGVmfSBuYW1lLCBpZiB0aGVyZSBpcyBvbmUsIG90aGVyd2lzZSBpZiBzaG91bGQKLSAgICAgIGJlIFxzYW1we3N0cnVjdCBcdmFye3RhZ319LiAgVGhlIHR5cGUgb2YgdGhlIG1lbWJlciBzaG91bGQgZ2l2ZW4KLSAgICAgIGFzIFx2YXJ7dHlwZX0sIGFuZCB0aGUgbmFtZSBzaG91bGQgYmUgZ2l2ZW4gYXMgXHZhcntuYW1lfS4gIFRoZQotICAgICAgdGV4dCBvZiB0aGUgZGVzY3JpcHRpb24gc2hvdWxkIGluY2x1ZGUgdGhlIHJhbmdlIG9mIHZhbHVlcwotICAgICAgYWxsb3dlZCwgaG93IHRoZSB2YWx1ZSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQsIGFuZCB3aGV0aGVyIHRoZQotICAgICAgdmFsdWUgY2FuIGJlIGNoYW5nZWQuICBSZWZlcmVuY2VzIHRvIHN0cnVjdHVyZSBtZW1iZXJzIGluIHRleHQKLSAgICAgIHNob3VsZCB1c2UgdGhlIFxtYWNyb3ttZW1iZXJ9IG1hY3JvLgotICAgIFxlbmR7ZW52ZGVzY30KLQotICAgIFxiZWdpbntlbnZkZXNjfXtjc2ltcGxlbWFjcm9kZXNjfXtccHtuYW1lfX0KLSAgICAgIERvY3VtZW50YXRpb24gZm9yIGEgYGBzaW1wbGUnJyBtYWNyby4gIFNpbXBsZSBtYWNyb3MgYXJlIG1hY3JvcwotICAgICAgd2hpY2ggYXJlIHVzZWQgZm9yIGNvZGUgZXhwYW5zaW9uLCBidXQgd2hpY2ggZG8gbm90IHRha2UKLSAgICAgIGFyZ3VtZW50cyBzbyBjYW5ub3QgYmUgZGVzY3JpYmVkIGFzIGZ1bmN0aW9ucy4gIFRoaXMgaXMgbm90IHRvCi0gICAgICBiZSB1c2VkIGZvciBzaW1wbGUgY29uc3RhbnQgZGVmaW5pdGlvbnMuICBFeGFtcGxlcyBvZiBpdHMgdXNlCi0gICAgICBpbiB0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24gaW5jbHVkZQotICAgICAgXGNzaW1wbGVtYWNyb3tQeU9iamVjdF9IRUFEfSBhbmQKLSAgICAgIFxjc2ltcGxlbWFjcm97UHlfQkVHSU5fQUxMT1dfVEhSRUFEU30uCi0gICAgXGVuZHtlbnZkZXNjfQotCi0gICAgXGJlZ2lue2VudmRlc2N9e2N0eXBlZGVzY317XG9we3RhZ31ccHtuYW1lfX0KLSAgICAgIEVudmlyb25tZW50IHVzZWQgdG8gZGVzY3JpYmVkIGEgQyB0eXBlLiAgVGhlIFx2YXJ7bmFtZX0KLSAgICAgIHBhcmFtZXRlciBzaG91bGQgYmUgdGhlIFxrZXl3b3Jke3R5cGVkZWZ9IG5hbWUuICBJZiB0aGUgdHlwZSBpcwotICAgICAgZGVmaW5lZCBhcyBhIFxrZXl3b3Jke3N0cnVjdH0gd2l0aG91dCBhIFxrZXl3b3Jke3R5cGVkZWZ9LAotICAgICAgXHZhcntuYW1lfSBzaG91bGQgaGF2ZSB0aGUgZm9ybSBcY29kZXtzdHJ1Y3QgXHZhcnt0YWd9fS4KLSAgICAgIFx2YXJ7bmFtZX0gd2lsbCBiZSBhZGRlZCB0byB0aGUgaW5kZXggdW5sZXNzIFx2YXJ7dGFnfSBpcwotICAgICAgcHJvdmlkZWQsIGluIHdoaWNoIGNhc2UgXHZhcnt0YWd9IHdpbGwgYmUgdXNlZCBpbnN0ZWFkLgotICAgICAgXHZhcnt0YWd9IHNob3VsZCBub3QgYmUgdXNlZCBmb3IgYSBca2V5d29yZHt0eXBlZGVmfSBuYW1lLgotICAgIFxlbmR7ZW52ZGVzY30KLQotICAgIFxiZWdpbntlbnZkZXNjfXtjdmFyZGVzY317XHB7dHlwZX1ccHtuYW1lfX0KLSAgICAgIERlc2NyaXB0aW9uIG9mIGEgZ2xvYmFsIEMgdmFyaWFibGUuICBcdmFye3R5cGV9IHNob3VsZCBiZSB0aGUKLSAgICAgIFxrZXl3b3Jke3R5cGVkZWZ9IG5hbWUsIFxjb2Rle3N0cnVjdCBcdmFye3RhZ319LCBvciB0aGUgbmFtZSBvZgotICAgICAgYSBwcmltaXRpdmUgdHlwZS4gIElmIHZhcmlhYmxlIGhhcyBhIHBvaW50ZXIgdHlwZSwgdGhlIHRyYWlsaW5nCi0gICAgICBhc3RlcmlzayBzaG91bGQgXGVtcGh7bm90fSBiZSBwcmVjZWRlZCBieSBhIHNwYWNlLgotICAgIFxlbmR7ZW52ZGVzY30KLQotICAgIFxiZWdpbntlbnZkZXNjfXtkYXRhZGVzY317XHB7bmFtZX19Ci0gICAgICBUaGlzIGVudmlyb25tZW50IGlzIHVzZWQgdG8gZG9jdW1lbnQgZ2xvYmFsIGRhdGEgaW4gYSBtb2R1bGUsCi0gICAgICBpbmNsdWRpbmcgYm90aCB2YXJpYWJsZXMgYW5kIHZhbHVlcyB1c2VkIGFzIGBgZGVmaW5lZAotICAgICAgY29uc3RhbnRzLicnICBDbGFzcyBhbmQgb2JqZWN0IGF0dHJpYnV0ZXMgYXJlIG5vdCBkb2N1bWVudGVkCi0gICAgICB1c2luZyB0aGlzIGVudmlyb25tZW50LgotICAgIFxlbmR7ZW52ZGVzY30KLSAgICBcYmVnaW57ZW52ZGVzY317ZGF0YWRlc2NuaX17XHB7bmFtZX19Ci0gICAgICBMaWtlIFxlbnZ7ZGF0YWRlc2N9LCBidXQgd2l0aG91dCBjcmVhdGluZyBhbnkgaW5kZXggZW50cmllcy4KLSAgICBcZW5ke2VudmRlc2N9Ci0KLSAgICBcYmVnaW57ZW52ZGVzY317ZXhjY2xhc3NkZXNjfXtccHtuYW1lfVxwe2NvbnN0cnVjdG9yIHBhcmFtZXRlcnN9fQotICAgICAgRGVzY3JpYmUgYW4gZXhjZXB0aW9uIGRlZmluZWQgYnkgYSBjbGFzcy4gIFx2YXJ7Y29uc3RydWN0b3IKLSAgICAgIHBhcmFtZXRlcnN9IHNob3VsZCBub3QgaW5jbHVkZSB0aGUgXHZhcntzZWxmfSBwYXJhbWV0ZXIgb3IKLSAgICAgIHRoZSBwYXJlbnRoZXNlcyB1c2VkIGluIHRoZSBjYWxsIHN5bnRheC4gIFRvIGRlc2NyaWJlIGFuCi0gICAgICBleGNlcHRpb24gY2xhc3Mgd2l0aG91dCBkZXNjcmliaW5nIHRoZSBwYXJhbWV0ZXJzIHRvIGl0cwotICAgICAgY29uc3RydWN0b3IsIHVzZSB0aGUgXGVudntleGNkZXNjfSBlbnZpcm9ubWVudC4KLSAgICBcZW5ke2VudmRlc2N9Ci0KLSAgICBcYmVnaW57ZW52ZGVzY317ZXhjZGVzY317XHB7bmFtZX19Ci0gICAgICBEZXNjcmliZSBhbiBleGNlcHRpb24uICBJbiB0aGUgY2FzZSBvZiBjbGFzcyBleGNlcHRpb25zLCB0aGUKLSAgICAgIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgYXJlIG5vdCBkZXNjcmliZWQ7IHVzZSBcZW52e2V4Y2NsYXNzZGVzY30KLSAgICAgIHRvIGRlc2NyaWJlIGFuIGV4Y2VwdGlvbiBjbGFzcyBhbmQgaXRzIGNvbnN0cnVjdG9yLgotICAgIFxlbmR7ZW52ZGVzY30KLQotICAgIFxiZWdpbntlbnZkZXNjfXtmdW5jZGVzY317XHB7bmFtZX1ccHtwYXJhbWV0ZXJzfX0KLSAgICAgIERlc2NyaWJlIGEgbW9kdWxlLWxldmVsIGZ1bmN0aW9uLiAgXHZhcntwYXJhbWV0ZXJzfSBzaG91bGQKLSAgICAgIG5vdCBpbmNsdWRlIHRoZSBwYXJlbnRoZXNlcyB1c2VkIGluIHRoZSBjYWxsIHN5bnRheC4gIE9iamVjdAotICAgICAgbWV0aG9kcyBhcmUgbm90IGRvY3VtZW50ZWQgdXNpbmcgdGhpcyBlbnZpcm9ubWVudC4gIEJvdW5kIG9iamVjdAotICAgICAgbWV0aG9kcyBwbGFjZWQgaW4gdGhlIG1vZHVsZSBuYW1lc3BhY2UgYXMgcGFydCBvZiB0aGUgcHVibGljCi0gICAgICBpbnRlcmZhY2Ugb2YgdGhlIG1vZHVsZSBhcmUgZG9jdW1lbnRlZCB1c2luZyB0aGlzLCBhcyB0aGV5IGFyZQotICAgICAgZXF1aXZhbGVudCB0byBub3JtYWwgZnVuY3Rpb25zIGZvciBtb3N0IHB1cnBvc2VzLgotCi0gICAgICBUaGUgZGVzY3JpcHRpb24gc2hvdWxkIGluY2x1ZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhcmFtZXRlcnMKLSAgICAgIHJlcXVpcmVkIGFuZCBob3cgdGhleSBhcmUgdXNlZCAoZXNwZWNpYWxseSB3aGV0aGVyIG11dGFibGUKLSAgICAgIG9iamVjdHMgcGFzc2VkIGFzIHBhcmFtZXRlcnMgYXJlIG1vZGlmaWVkKSwgc2lkZSBlZmZlY3RzLCBhbmQKLSAgICAgIHBvc3NpYmxlIGV4Y2VwdGlvbnMuICBBIHNtYWxsIGV4YW1wbGUgbWF5IGJlIHByb3ZpZGVkLgotICAgIFxlbmR7ZW52ZGVzY30KLSAgICBcYmVnaW57ZW52ZGVzY317ZnVuY2Rlc2NuaX17XHB7bmFtZX1ccHtwYXJhbWV0ZXJzfX0KLSAgICAgIExpa2UgXGVudntmdW5jZGVzY30sIGJ1dCB3aXRob3V0IGNyZWF0aW5nIGFueSBpbmRleCBlbnRyaWVzLgotICAgIFxlbmR7ZW52ZGVzY30KLQotICAgIFxiZWdpbntlbnZkZXNjfXtjbGFzc2Rlc2N9e1xwe25hbWV9XHB7Y29uc3RydWN0b3IgcGFyYW1ldGVyc319Ci0gICAgICBEZXNjcmliZSBhIGNsYXNzIGFuZCBpdHMgY29uc3RydWN0b3IuICBcdmFye2NvbnN0cnVjdG9yCi0gICAgICBwYXJhbWV0ZXJzfSBzaG91bGQgbm90IGluY2x1ZGUgdGhlIFx2YXJ7c2VsZn0gcGFyYW1ldGVyIG9yCi0gICAgICB0aGUgcGFyZW50aGVzZXMgdXNlZCBpbiB0aGUgY2FsbCBzeW50YXguCi0gICAgXGVuZHtlbnZkZXNjfQotCi0gICAgXGJlZ2lue2VudmRlc2N9e2NsYXNzZGVzYyp9e1xwe25hbWV9fQotICAgICAgRGVzY3JpYmUgYSBjbGFzcyB3aXRob3V0IGRlc2NyaWJpbmcgdGhlIGNvbnN0cnVjdG9yLiAgVGhpcyBjYW4KLSAgICAgIGJlIHVzZWQgdG8gZGVzY3JpYmUgY2xhc3NlcyB0aGF0IGFyZSBtZXJlbHkgY29udGFpbmVycyBmb3IKLSAgICAgIGF0dHJpYnV0ZXMgb3Igd2hpY2ggc2hvdWxkIG5ldmVyIGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkCi0gICAgICBieSB1c2VyIGNvZGUuCi0gICAgXGVuZHtlbnZkZXNjfQotCi0gICAgXGJlZ2lue2VudmRlc2N9e21lbWJlcmRlc2N9e1xvcHt0eXBlIG5hbWV9XHB7bmFtZX19Ci0gICAgICBEZXNjcmliZSBhbiBvYmplY3QgZGF0YSBhdHRyaWJ1dGUuICBUaGUgZGVzY3JpcHRpb24gc2hvdWxkCi0gICAgICBpbmNsdWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIG9mIHRoZSBkYXRhIHRvIGJlIGV4cGVjdGVkCi0gICAgICBhbmQgd2hldGhlciBpdCBtYXkgYmUgY2hhbmdlZCBkaXJlY3RseS4KLSAgICBcZW5ke2VudmRlc2N9Ci0gICAgXGJlZ2lue2VudmRlc2N9e21lbWJlcmRlc2NuaX17XG9we3R5cGUgbmFtZX1ccHtuYW1lfX0KLSAgICAgIExpa2UgXGVudnttZW1iZXJkZXNjfSwgYnV0IHdpdGhvdXQgY3JlYXRpbmcgYW55IGluZGV4IGVudHJpZXMuCi0gICAgXGVuZHtlbnZkZXNjfQotCi0gICAgXGJlZ2lue2VudmRlc2N9e21ldGhvZGRlc2N9e1xvcHt0eXBlIG5hbWV9XHB7bmFtZX1ccHtwYXJhbWV0ZXJzfX0KLSAgICAgIERlc2NyaWJlIGFuIG9iamVjdCBtZXRob2QuICBcdmFye3BhcmFtZXRlcnN9IHNob3VsZCBub3QgaW5jbHVkZQotICAgICAgdGhlIFx2YXJ7c2VsZn0gcGFyYW1ldGVyIG9yIHRoZSBwYXJlbnRoZXNlcyB1c2VkIGluIHRoZSBjYWxsCi0gICAgICBzeW50YXguICBUaGUgZGVzY3JpcHRpb24gc2hvdWxkIGluY2x1ZGUgc2ltaWxhciBpbmZvcm1hdGlvbiB0bwotICAgICAgdGhhdCBkZXNjcmliZWQgZm9yIFxlbnZ7ZnVuY2Rlc2N9LgotICAgIFxlbmR7ZW52ZGVzY30KLSAgICBcYmVnaW57ZW52ZGVzY317bWV0aG9kZGVzY25pfXtcb3B7dHlwZSBuYW1lfVxwe25hbWV9XHB7cGFyYW1ldGVyc319Ci0gICAgICBMaWtlIFxlbnZ7bWV0aG9kZGVzY30sIGJ1dCB3aXRob3V0IGNyZWF0aW5nIGFueSBpbmRleCBlbnRyaWVzLgotICAgIFxlbmR7ZW52ZGVzY30KLQotCi0gIFxzdWJzZWN0aW9ue1Nob3dpbmcgQ29kZSBFeGFtcGxlcyBcbGFiZWx7c2hvd2luZy1leGFtcGxlc319Ci0KLSAgICBFeGFtcGxlcyBvZiBQeXRob24gc291cmNlIGNvZGUgb3IgaW50ZXJhY3RpdmUgc2Vzc2lvbnMgYXJlCi0gICAgcmVwcmVzZW50ZWQgYXMgXGVudnt2ZXJiYXRpbX0gZW52aXJvbm1lbnRzLiAgVGhpcyBlbnZpcm9ubWVudAotICAgIGlzIGEgc3RhbmRhcmQgcGFydCBvZiBcTGFUZVh7fS4gIEl0IGlzIGltcG9ydGFudCB0byBvbmx5IHVzZQotICAgIHNwYWNlcyBmb3IgaW5kZW50YXRpb24gaW4gY29kZSBleGFtcGxlcyBzaW5jZSBcVGVYe30gZHJvcHMgdGFicwotICAgIGluc3RlYWQgb2YgY29udmVydGluZyB0aGVtIHRvIHNwYWNlcy4KLQotICAgIFJlcHJlc2VudGluZyBhbiBpbnRlcmFjdGl2ZSBzZXNzaW9uIHJlcXVpcmVzIGluY2x1ZGluZyB0aGUgcHJvbXB0cwotICAgIGFuZCBvdXRwdXQgYWxvbmcgd2l0aCB0aGUgUHl0aG9uIGNvZGUuICBObyBzcGVjaWFsIG1hcmt1cCBpcwotICAgIHJlcXVpcmVkIGZvciBpbnRlcmFjdGl2ZSBzZXNzaW9ucy4gIEFmdGVyIHRoZSBsYXN0IGxpbmUgb2YgaW5wdXQKLSAgICBvciBvdXRwdXQgcHJlc2VudGVkLCB0aGVyZSBzaG91bGQgbm90IGJlIGFuIGBgdW51c2VkJycgcHJpbWFyeQotICAgIHByb21wdDsgdGhpcyBpcyBhbiBleGFtcGxlIG9mIHdoYXQgXGVtcGh7bm90fSB0byBkbzoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IDEgKyAxCi0yCi0+Pj4KLVxlbmR7dmVyYmF0aW19Ci0KLSAgICBXaXRoaW4gdGhlIFxlbnZ7dmVyYmF0aW19IGVudmlyb25tZW50LCBjaGFyYWN0ZXJzIHNwZWNpYWwgdG8KLSAgICBcTGFUZVh7fSBkbyBub3QgbmVlZCB0byBiZSBzcGVjaWFsbHkgbWFya2VkIGluIGFueSB3YXkuICBUaGUgZW50aXJlCi0gICAgZXhhbXBsZSB3aWxsIGJlIHByZXNlbnRlZCBpbiBhIG1vbm9zcGFjZWQgZm9udDsgbm8gYXR0ZW1wdCBhdAotICAgIGBgcHJldHR5LXByaW50aW5nJycgaXMgbWFkZSwgYXMgdGhlIGVudmlyb25tZW50IG11c3Qgd29yayBmb3IKLSAgICBub24tUHl0aG9uIGNvZGUgYW5kIG5vbi1jb2RlIGRpc3BsYXlzLiAgVGhlcmUgc2hvdWxkIGJlIG5vIGJsYW5rCi0gICAgbGluZXMgYXQgdGhlIHRvcCBvciBib3R0b20gb2YgYW55IFxlbnZ7dmVyYmF0aW19IGRpc3BsYXkuCi0KLSAgICBMb25nZXIgZGlzcGxheXMgb2YgdmVyYmF0aW0gdGV4dCBtYXkgYmUgaW5jbHVkZWQgYnkgc3RvcmluZyB0aGUKLSAgICBleGFtcGxlIHRleHQgaW4gYW4gZXh0ZXJuYWwgZmlsZSBjb250YWluaW5nIG9ubHkgcGxhaW4gdGV4dC4gIFRoZQotICAgIGZpbGUgbWF5IGJlIGluY2x1ZGVkIHVzaW5nIHRoZSBzdGFuZGFyZCBcbWFjcm97dmVyYmF0aW1pbnB1dH0KLSAgICBtYWNybzsgdGhpcyBtYWNybyB0YWtlcyBhIHNpbmdsZSBhcmd1bWVudCBuYW1pbmcgdGhlIGZpbGUKLSAgICBjb250YWluaW5nIHRoZSB0ZXh0LiAgRm9yIGV4YW1wbGUsIHRvIGluY2x1ZGUgdGhlIFB5dGhvbiBzb3VyY2UKLSAgICBmaWxlIFxmaWxle2V4YW1wbGUucHl9LCB1c2U6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLVx2ZXJiYXRpbWlucHV0e2V4YW1wbGUucHl9Ci1cZW5ke3ZlcmJhdGltfQotCi0gICAgVXNlIG9mIFxtYWNyb3t2ZXJiYXRpbWlucHV0fSBhbGxvd3MgZWFzaWVyIHVzZSBvZiBzcGVjaWFsIGVkaXRpbmcKLSAgICBtb2RlcyBmb3IgdGhlIGluY2x1ZGVkIGZpbGUuICBUaGUgZmlsZSBzaG91bGQgYmUgcGxhY2VkIGluIHRoZQotICAgIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBcTGFUZVh7fSBmaWxlcyBmb3IgdGhlIGRvY3VtZW50LgotCi0gICAgVGhlIFB5dGhvbiBEb2N1bWVudGF0aW9uIFNwZWNpYWwgSW50ZXJlc3QgR3JvdXAgaGFzIGRpc2N1c3NlZCBhCi0gICAgbnVtYmVyIG9mIGFwcHJvYWNoZXMgdG8gY3JlYXRpbmcgcHJldHR5LXByaW50ZWQgY29kZSBkaXNwbGF5cyBhbmQKLSAgICBpbnRlcmFjdGl2ZSBzZXNzaW9uczsgc2VlIHRoZSBEb2MtU0lHIGFyZWEgb24gdGhlIFB5dGhvbiBXZWIgc2l0ZQotICAgIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgdG9waWMuCi0KLQotICBcc3Vic2VjdGlvbntJbmxpbmUgTWFya3VwIFxsYWJlbHtpbmxpbmUtbWFya3VwfX0KLQotICAgIFRoZSBtYWNyb3MgZGVzY3JpYmVkIGluIHRoaXMgc2VjdGlvbiBhcmUgdXNlZCB0byBtYXJrIGp1c3QgYWJvdXQKLSAgICBhbnl0aGluZyBpbnRlcmVzdGluZyBpbiB0aGUgZG9jdW1lbnQgdGV4dC4gIFRoZXkgbWF5IGJlIHVzZWQgaW4KLSAgICBoZWFkaW5ncyAodGhvdWdoIGFueXRoaW5nIGludm9sdmluZyBoeXBlcmxpbmtzIHNob3VsZCBiZSBhdm9pZGVkCi0gICAgdGhlcmUpIGFzIHdlbGwgYXMgaW4gdGhlIGJvZHkgdGV4dC4KLQotICAgIFxiZWdpbnttYWNyb2Rlc2N9e2JmY29kZX17XHB7dGV4dH19Ci0gICAgICBMaWtlIFxtYWNyb3tjb2RlfSwgYnV0IGFsc28gbWFrZXMgdGhlIGZvbnQgYm9sZC1mYWNlLgotICAgIFxlbmR7bWFjcm9kZXNjfQotCi0gICAgXGJlZ2lue21hY3JvZGVzY317Y2RhdGF9e1xwe25hbWV9fQotICAgICAgVGhlIG5hbWUgb2YgYSBDLWxhbmd1YWdlIHZhcmlhYmxlLgotICAgIFxlbmR7bWFjcm9kZXNjfQotCi0gICAgXGJlZ2lue21hY3JvZGVzY317Y2Z1bmN0aW9ufXtccHtuYW1lfX0KLSAgICAgIFRoZSBuYW1lIG9mIGEgQy1sYW5ndWFnZSBmdW5jdGlvbi4gIFx2YXJ7bmFtZX0gc2hvdWxkIGluY2x1ZGUgdGhlCi0gICAgICBmdW5jdGlvbiBuYW1lIGFuZCB0aGUgdHJhaWxpbmcgcGFyZW50aGVzZXMuCi0gICAgXGVuZHttYWNyb2Rlc2N9Ci0KLSAgICBcYmVnaW57bWFjcm9kZXNjfXtjaGFyYWN0ZXJ9e1xwe2NoYXJ9fQotICAgICAgQSBjaGFyYWN0ZXIgd2hlbiBkaXNjdXNzaW5nIHRoZSBjaGFyYWN0ZXIgcmF0aGVyIHRoYW4gYSBvbmUtYnl0ZQotICAgICAgc3RyaW5nIHZhbHVlLiAgVGhlIGNoYXJhY3RlciB3aWxsIGJlIHR5cGVzZXQgYXMgd2l0aCBcbWFjcm97c2FtcH0uCi0gICAgXGVuZHttYWNyb2Rlc2N9Ci0KLSAgICBcYmVnaW57bWFjcm9kZXNjfXtjaXRldGl0bGV9e1xvcHt1cmx9XHB7dGl0bGV9fQotICAgICAgQSB0aXRsZSBmb3IgYSByZWZlcmVuY2VkIHB1YmxpY2F0aW9uLiAgSWYgXHZhcnt1cmx9IGlzIHNwZWNpZmllZCwKLSAgICAgIHRoZSB0aXRsZSB3aWxsIGJlIG1hZGUgaW50byBhIGh5cGVybGluayB3aGVuIGZvcm1hdHRlZCBhcyBIVE1MLgotICAgIFxlbmR7bWFjcm9kZXNjfQotCi0gICAgXGJlZ2lue21hY3JvZGVzY317Y2xhc3N9e1xwe25hbWV9fQotICAgICAgQSBjbGFzcyBuYW1lOyBhIGRvdHRlZCBuYW1lIG1heSBiZSB1c2VkLgotICAgIFxlbmR7bWFjcm9kZXNjfQotCi0gICAgXGJlZ2lue21hY3JvZGVzY317Y29kZX17XHB7dGV4dH19Ci0gICAgICBBIHNob3J0IGNvZGUgZnJhZ21lbnQgb3IgbGl0ZXJhbCBjb25zdGFudCB2YWx1ZS4gIFR5cGljYWxseSwgaXQKLSAgICAgIHNob3VsZCBub3QgaW5jbHVkZSBhbnkgc3BhY2VzIHNpbmNlIG5vIHF1b3RhdGlvbiBtYXJrcyBhcmUKLSAgICAgIGFkZGVkLgotICAgIFxlbmR7bWFjcm9kZXNjfQotCi0gICAgXGJlZ2lue21hY3JvZGVzY317Y29uc3RhbnR9e1xwe25hbWV9fQotICAgICAgVGhlIG5hbWUgb2YgYSBgYGRlZmluZWQnJyBjb25zdGFudC4gIFRoaXMgbWF5IGJlIGEgQy1sYW5ndWFnZQotICAgICAgXGNvZGV7XCNkZWZpbmV9IG9yIGEgUHl0aG9uIHZhcmlhYmxlIHRoYXQgaXMgbm90IGludGVuZGVkIHRvIGJlCi0gICAgICBjaGFuZ2VkLgotICAgIFxlbmR7bWFjcm9kZXNjfQotCi0gICAgXGJlZ2lue21hY3JvZGVzY317Y3NpbXBsZW1hY3JvfXtccHtuYW1lfX0KLSAgICAgIFRoZSBuYW1lIG9mIGEgYGBzaW1wbGUnJyBtYWNyby4gIFNpbXBsZSBtYWNyb3MgYXJlIG1hY3JvcwotICAgICAgd2hpY2ggYXJlIHVzZWQgZm9yIGNvZGUgZXhwYW5zaW9uLCBidXQgd2hpY2ggZG8gbm90IHRha2UKLSAgICAgIGFyZ3VtZW50cyBzbyBjYW5ub3QgYmUgZGVzY3JpYmVkIGFzIGZ1bmN0aW9ucy4gIFRoaXMgaXMgbm90IHRvCi0gICAgICBiZSB1c2VkIGZvciBzaW1wbGUgY29uc3RhbnQgZGVmaW5pdGlvbnMuICBFeGFtcGxlcyBvZiBpdHMgdXNlCi0gICAgICBpbiB0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24gaW5jbHVkZQotICAgICAgXGNzaW1wbGVtYWNyb3tQeU9iamVjdF9IRUFEfSBhbmQKLSAgICAgIFxjc2ltcGxlbWFjcm97UHlfQkVHSU5fQUxMT1dfVEhSRUFEU30uCi0gICAgXGVuZHttYWNyb2Rlc2N9Ci0KLSAgICBcYmVnaW57bWFjcm9kZXNjfXtjdHlwZX17XHB7bmFtZX19Ci0gICAgICBUaGUgbmFtZSBvZiBhIEMgXGtleXdvcmR7dHlwZWRlZn0gb3Igc3RydWN0dXJlLiAgRm9yIHN0cnVjdHVyZXMKLSAgICAgIGRlZmluZWQgd2l0aG91dCBhIFxrZXl3b3Jke3R5cGVkZWZ9LCB1c2UgXGNvZGV7XGUgY3R5cGVce3N0cnVjdAotICAgICAgc3RydWN0X3RhZ1x9fSB0byBtYWtlIGl0IGNsZWFyIHRoYXQgdGhlIFxrZXl3b3Jke3N0cnVjdH0gaXMKLSAgICAgIHJlcXVpcmVkLgotICAgIFxlbmR7bWFjcm9kZXNjfQotCi0gICAgXGJlZ2lue21hY3JvZGVzY317ZGVwcmVjYXRlZH17XHB7dmVyc2lvbn1ccHt3aGF0IHRvIGRvfX0KLSAgICAgIERlY2xhcmUgd2hhdGV2ZXIgaXMgYmVpbmcgZGVzY3JpYmVkIGFzIGJlaW5nIGRlcHJlY2F0ZWQgc3RhcnRpbmcKLSAgICAgIHdpdGggcmVsZWFzZSBcdmFye3ZlcnNpb259LiAgVGhlIHRleHQgZ2l2ZW4gYXMgXHZhcnt3aGF0IHRvIGRvfQotICAgICAgc2hvdWxkIHJlY29tbWVuZCBzb21ldGhpbmcgdG8gdXNlIGluc3RlYWQuICBJdCBzaG91bGQgYmUKLSAgICAgIGNvbXBsZXRlIHNlbnRlbmNlcy4gIFRoZSBlbnRpcmUgZGVwcmVjYXRpb24gbm90aWNlIHdpbGwgYmUKLSAgICAgIHByZXNlbnRlZCBhcyBhIHNlcGFyYXRlIHBhcmFncmFwaDsgaXQgc2hvdWxkIGVpdGhlciBwcmVjZWRlIG9yCi0gICAgICBzdWNjZWVkIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGVwcmVjYXRlZCBmZWF0dXJlLgotICAgIFxlbmR7bWFjcm9kZXNjfQotCi0gICAgXGJlZ2lue21hY3JvZGVzY317ZGZufXtccHt0ZXJtfX0KLSAgICAgIE1hcmsgdGhlIGRlZmluaW5nIGluc3RhbmNlIG9mIFx2YXJ7dGVybX0gaW4gdGhlIHRleHQuICAoTm8gaW5kZXgKLSAgICAgIGVudHJpZXMgYXJlIGdlbmVyYXRlZC4pCi0gICAgXGVuZHttYWNyb2Rlc2N9Ci0KLSAgICBcYmVnaW57bWFjcm9kZXNjfXtlfXt9Ci0gICAgICBQcm9kdWNlcyBhIGJhY2tzbGFzaC4gIFRoaXMgaXMgY29udmVuaWVudCBpbiBcbWFjcm97Y29kZX0sCi0gICAgICBcbWFjcm97ZmlsZX0sIGFuZCBzaW1pbGFyIG1hY3JvcywgYW5kIHRoZSBcZW52e2FsbHR0fQotICAgICAgZW52aXJvbm1lbnQsIGFuZCBpcyBvbmx5IGRlZmluZWQgdGhlcmUuICBUbwotICAgICAgY3JlYXRlIGEgYmFja3NsYXNoIGluIG9yZGluYXJ5IHRleHQgKHN1Y2ggYXMgdGhlIGNvbnRlbnRzIG9mIHRoZQotICAgICAgXG1hY3Jve2NpdGV0aXRsZX0gbWFjcm8pLCB1c2UgdGhlIHN0YW5kYXJkIFxtYWNyb3t0ZXh0YmFja3NsYXNofQotICAgICAgbWFjcm8uCi0gICAgXGVuZHttYWNyb2Rlc2N9Ci0KLSAgICBcYmVnaW57bWFjcm9kZXNjfXtlbWFpbH17XHB7YWRkcmVzc319Ci0gICAgICBBbiBlbWFpbCBhZGRyZXNzLiAgTm90ZSB0aGF0IHRoaXMgaXMgXGVtcGh7bm90fSBoeXBlcmxpbmtlZCBpbgotICAgICAgYW55IG9mIHRoZSBwb3NzaWJsZSBvdXRwdXQgZm9ybWF0cy4gIFRoZSBkb21haW4gbmFtZSBwb3J0aW9uIG9mCi0gICAgICB0aGUgYWRkcmVzcyBzaG91bGQgYmUgbG93ZXIgY2FzZS4KLSAgICBcZW5ke21hY3JvZGVzY30KLQotICAgIFxiZWdpbnttYWNyb2Rlc2N9e2VtcGh9e1xwe3RleHR9fQotICAgICAgRW1waGFzaXplZCB0ZXh0OyB0aGlzIHdpbGwgYmUgcHJlc2VudGVkIGluIGFuIGl0YWxpYyBmb250LgotICAgIFxlbmR7bWFjcm9kZXNjfQotCi0gICAgXGJlZ2lue21hY3JvZGVzY317ZW52dmFyfXtccHtuYW1lfX0KLSAgICAgIEFuIGVudmlyb25tZW50IHZhcmlhYmxlLiAgSW5kZXggZW50cmllcyBhcmUgZ2VuZXJhdGVkLgotICAgIFxlbmR7bWFjcm9kZXNjfQotCi0gICAgXGJlZ2lue21hY3JvZGVzY317ZXhjZXB0aW9ufXtccHtuYW1lfX0KLSAgICAgIFRoZSBuYW1lIG9mIGFuIGV4Y2VwdGlvbi4gIEEgZG90dGVkIG5hbWUgbWF5IGJlIHVzZWQuCi0gICAgXGVuZHttYWNyb2Rlc2N9Ci0KLSAgICBcYmVnaW57bWFjcm9kZXNjfXtmaWxlfXtccHtmaWxlIG9yIGRpcn19Ci0gICAgICBUaGUgbmFtZSBvZiBhIGZpbGUgb3IgZGlyZWN0b3J5LiAgSW4gdGhlIFBERiBhbmQgUG9zdFNjcmlwdAotICAgICAgb3V0cHV0cywgc2luZ2xlIHF1b3RlcyBhbmQgYSBmb250IGNoYW5nZSBhcmUgdXNlZCB0byBpbmRpY2F0ZQotICAgICAgdGhlIGZpbGUgbmFtZSwgYnV0IG5vIHF1b3RlcyBhcmUgdXNlZCBpbiB0aGUgSFRNTCBvdXRwdXQuCi0gICAgICBcd2FybmluZ3tUaGUgXG1hY3Jve2ZpbGV9IG1hY3JvIGNhbm5vdCBiZSB1c2VkIGluIHRoZQotICAgICAgY29udGVudCBvZiBhIHNlY3Rpb24gdGl0bGUgZHVlIHRvIHByb2Nlc3NpbmcgbGltaXRhdGlvbnMufQotICAgIFxlbmR7bWFjcm9kZXNjfQotCi0gICAgXGJlZ2lue21hY3JvZGVzY317ZmlsZW5xfXtccHtmaWxlIG9yIGRpcn19Ci0gICAgICBMaWtlIFxtYWNyb3tmaWxlfSwgYnV0IHNpbmdsZSBxdW90ZXMgYXJlIG5ldmVyIHVzZWQuICBUaGlzIGNhbgotICAgICAgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRhYmxlcyBpZiBhIGNvbHVtbiB3aWxsIG9ubHkgY29udGFpbgotICAgICAgZmlsZSBvciBkaXJlY3RvcnkgbmFtZXMuCi0gICAgICBcd2FybmluZ3tUaGUgXG1hY3Jve2ZpbGVucX0gbWFjcm8gY2Fubm90IGJlIHVzZWQgaW4gdGhlCi0gICAgICBjb250ZW50IG9mIGEgc2VjdGlvbiB0aXRsZSBkdWUgdG8gcHJvY2Vzc2luZyBsaW1pdGF0aW9ucy59Ci0gICAgXGVuZHttYWNyb2Rlc2N9Ci0KLSAgICBcYmVnaW57bWFjcm9kZXNjfXtmdW5jdGlvbn17XHB7bmFtZX19Ci0gICAgICBUaGUgbmFtZSBvZiBhIFB5dGhvbiBmdW5jdGlvbjsgZG90dGVkIG5hbWVzIG1heSBiZSB1c2VkLgotICAgIFxlbmR7bWFjcm9kZXNjfQotCi0gICAgXGJlZ2lue21hY3JvZGVzY317aW5maW5pdHl9e30KLSAgICAgIFRoZSBzeW1ib2wgZm9yIG1hdGhlbWF0aWNhbCBpbmZpbml0eTogXGluZmluaXR5LiAgU29tZSBXZWIKLSAgICAgIGJyb3dzZXJzIGFyZSBub3QgYWJsZSB0byByZW5kZXIgdGhlIEhUTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcwotICAgICAgc3ltYm9sIHByb3Blcmx5LCBidXQgc3VwcG9ydCBpcyBncm93aW5nLgotICAgIFxlbmR7bWFjcm9kZXNjfQotCi0gICAgXGJlZ2lue21hY3JvZGVzY317a2JkfXtccHtrZXkgc2VxdWVuY2V9fQotICAgICAgTWFyayBhIHNlcXVlbmNlIG9mIGtleXN0cm9rZXMuICBXaGF0IGZvcm0gXHZhcntrZXkgc2VxdWVuY2V9Ci0gICAgICB0YWtlcyBtYXkgZGVwZW5kIG9uIHBsYXRmb3JtLSBvciBhcHBsaWNhdGlvbi1zcGVjaWZpYwotICAgICAgY29udmVudGlvbnMuICBXaGVuIHRoZXJlIGFyZSBubyByZWxldmFudCBjb252ZW50aW9ucywgdGhlIG5hbWVzCi0gICAgICBvZiBtb2RpZmllciBrZXlzIHNob3VsZCBiZSBzcGVsbGVkIG91dCwgdG8gaW1wcm92ZSBhY2Nlc3NpYmlsaXR5Ci0gICAgICBmb3IgbmV3IHVzZXJzIGFuZCBub24tbmF0aXZlIHNwZWFrZXJzLiAgRm9yIGV4YW1wbGUsIGFuCi0gICAgICBccHJvZ3JhbXt4ZW1hY3N9IGtleSBzZXF1ZW5jZSBtYXkgYmUgbWFya2VkIGxpa2UKLSAgICAgIFxjb2Rle1xlIGtiZFx7Qy14IEMtZlx9fSwgYnV0IHdpdGhvdXQgcmVmZXJlbmNlIHRvIGEgc3BlY2lmaWMKLSAgICAgIGFwcGxpY2F0aW9uIG9yIHBsYXRmb3JtLCB0aGUgc2FtZSBzZXF1ZW5jZSBzaG91bGQgYmUgbWFya2VkIGFzCi0gICAgICBcY29kZXtcZSBrYmRce0NvbnRyb2wteCBDb250cm9sLWZcfX0uCi0gICAgXGVuZHttYWNyb2Rlc2N9Ci0KLSAgICBcYmVnaW57bWFjcm9kZXNjfXtrZXl3b3JkfXtccHtuYW1lfX0KLSAgICAgIFRoZSBuYW1lIG9mIGEga2V5d29yZCBpbiBhIHByb2dyYW1taW5nIGxhbmd1YWdlLgotICAgIFxlbmR7bWFjcm9kZXNjfQotCi0gICAgXGJlZ2lue21hY3JvZGVzY317bWFpbGhlYWRlcn17XHB7bmFtZX19Ci0gICAgICBUaGUgbmFtZSBvZiBhbiBccmZjezgyMn0tc3R5bGUgbWFpbCBoZWFkZXIuICBUaGlzIG1hcmt1cCBkb2VzCi0gICAgICBub3QgaW1wbHkgdGhhdCB0aGUgaGVhZGVyIGlzIGJlaW5nIHVzZWQgaW4gYW4gZW1haWwgbWVzc2FnZSwgYnV0Ci0gICAgICBjYW4gYmUgdXNlZCB0byByZWZlciB0byBhbnkgaGVhZGVyIG9mIHRoZSBzYW1lIGBgc3R5bGUuJycgIFRoaXMKLSAgICAgIGlzIGFsc28gdXNlZCBmb3IgaGVhZGVycyBkZWZpbmVkIGJ5IHRoZSB2YXJpb3VzIE1JTUUKLSAgICAgIHNwZWNpZmljYXRpb25zLiAgVGhlIGhlYWRlciBuYW1lIHNob3VsZCBiZSBlbnRlcmVkIGluIHRoZSBzYW1lCi0gICAgICB3YXkgaXQgd291bGQgbm9ybWFsbHkgYmUgZm91bmQgaW4gcHJhY3RpY2UsIHdpdGggdGhlCi0gICAgICBjYW1lbC1jYXNpbmcgY29udmVudGlvbnMgYmVpbmcgcHJlZmVycmVkIHdoZXJlIHRoZXJlIGlzIG1vcmUKLSAgICAgIHRoYW4gb25lIGNvbW1vbiB1c2FnZS4gIFRoZSBjb2xvbiB3aGljaCBmb2xsb3dzIHRoZSBuYW1lIG9mIHRoZQotICAgICAgaGVhZGVyIHNob3VsZCBub3QgYmUgaW5jbHVkZWQuCi0gICAgICBGb3IgZXhhbXBsZTogXGNvZGV7XGUgbWFpbGhlYWRlclx7Q29udGVudC1UeXBlXH19LgotICAgIFxlbmR7bWFjcm9kZXNjfQotCi0gICAgXGJlZ2lue21hY3JvZGVzY317bWFrZXZhcn17XHB7bmFtZX19Ci0gICAgICBUaGUgbmFtZSBvZiBhIFxwcm9ncmFte21ha2V9IHZhcmlhYmxlLgotICAgIFxlbmR7bWFjcm9kZXNjfQotCi0gICAgXGJlZ2lue21hY3JvZGVzY317bWFucGFnZX17XHB7bmFtZX1ccHtzZWN0aW9ufX0KLSAgICAgIEEgcmVmZXJlbmNlIHRvIGEgXFVOSVh7fSBtYW51YWwgcGFnZS4KLSAgICBcZW5ke21hY3JvZGVzY30KLQotICAgIFxiZWdpbnttYWNyb2Rlc2N9e21lbWJlcn17XHB7bmFtZX19Ci0gICAgICBUaGUgbmFtZSBvZiBhIGRhdGEgYXR0cmlidXRlIG9mIGFuIG9iamVjdC4KLSAgICBcZW5ke21hY3JvZGVzY30KLQotICAgIFxiZWdpbnttYWNyb2Rlc2N9e21ldGhvZH17XHB7bmFtZX19Ci0gICAgICBUaGUgbmFtZSBvZiBhIG1ldGhvZCBvZiBhbiBvYmplY3QuICBcdmFye25hbWV9IHNob3VsZCBpbmNsdWRlIHRoZQotICAgICAgbWV0aG9kIG5hbWUgYW5kIHRoZSB0cmFpbGluZyBwYXJlbnRoZXNlcy4gIEEgZG90dGVkIG5hbWUgbWF5IGJlCi0gICAgICB1c2VkLgotICAgIFxlbmR7bWFjcm9kZXNjfQotCi0gICAgXGJlZ2lue21hY3JvZGVzY317bWltZXR5cGV9e1xwe25hbWV9fQotICAgICAgVGhlIG5hbWUgb2YgYSBNSU1FIHR5cGUsIG9yIGEgY29tcG9uZW50IG9mIGEgTUlNRSB0eXBlICh0aGUKLSAgICAgIG1ham9yIG9yIG1pbm9yIHBvcnRpb24sIHRha2VuIGFsb25lKS4KLSAgICBcZW5ke21hY3JvZGVzY30KLQotICAgIFxiZWdpbnttYWNyb2Rlc2N9e21vZHVsZX17XHB7bmFtZX19Ci0gICAgICAgVGhlIG5hbWUgb2YgYSBtb2R1bGU7IGEgZG90dGVkIG5hbWUgbWF5IGJlIHVzZWQuICBUaGlzIHNob3VsZAotICAgICAgIGFsc28gYmUgdXNlZCBmb3IgcGFja2FnZSBuYW1lcy4KLSAgICBcZW5ke21hY3JvZGVzY30KLQotICAgIFxiZWdpbnttYWNyb2Rlc2N9e25ld3Nncm91cH17XHB7bmFtZX19Ci0gICAgICBUaGUgbmFtZSBvZiBhIFVzZW5ldCBuZXdzZ3JvdXAuCi0gICAgXGVuZHttYWNyb2Rlc2N9Ci0KLSAgICBcYmVnaW57bWFjcm9kZXNjfXtub3RlfXtccHt0ZXh0fX0KLSAgICAgIEFuIGVzcGVjaWFsbHkgaW1wb3J0YW50IGJpdCBvZiBpbmZvcm1hdGlvbiBhYm91dCBhbiBBUEkgdGhhdCBhCi0gICAgICB1c2VyIHNob3VsZCBiZSBhd2FyZSBvZiB3aGVuIHVzaW5nIHdoYXRldmVyIGJpdCBvZiBBUEkgdGhlCi0gICAgICBub3RlIHBlcnRhaW5zIHRvLiAgVGhpcyBzaG91bGQgYmUgdGhlIGxhc3QgdGhpbmcgaW4gdGhlCi0gICAgICBwYXJhZ3JhcGggYXMgdGhlIGVuZCBvZiB0aGUgbm90ZSBpcyBub3QgdmlzdWFsbHkgbWFya2VkIGluCi0gICAgICBhbnkgd2F5LiAgVGhlIGNvbnRlbnQgb2YgXHZhcnt0ZXh0fSBzaG91bGQgYmUgd3JpdHRlbiBpbgotICAgICAgY29tcGxldGUgc2VudGVuY2VzIGFuZCBpbmNsdWRlIGFsbCBhcHByb3ByaWF0ZSBwdW5jdHVhdGlvbi4KLSAgICBcZW5ke21hY3JvZGVzY30KLQotICAgIFxiZWdpbnttYWNyb2Rlc2N9e3BlcH17XHB7bnVtYmVyfX0KLSAgICAgIEEgcmVmZXJlbmNlIHRvIGEgUHl0aG9uIEVuaGFuY2VtZW50IFByb3Bvc2FsLiAgVGhpcyBnZW5lcmF0ZXMKLSAgICAgIGFwcHJvcHJpYXRlIGluZGV4IGVudHJpZXMuICBUaGUgdGV4dCBcc2FtcHtQRVAgXHZhcntudW1iZXJ9fSBpcwotICAgICAgZ2VuZXJhdGVkOyBpbiB0aGUgSFRNTCBvdXRwdXQsIHRoaXMgdGV4dCBpcyBhIGh5cGVybGluayB0byBhbgotICAgICAgb25saW5lIGNvcHkgb2YgdGhlIHNwZWNpZmllZCBQRVAuCi0gICAgXGVuZHttYWNyb2Rlc2N9Ci0KLSAgICBcYmVnaW57bWFjcm9kZXNjfXtwbHVzbWludXN9e30KLSAgICAgIFRoZSBzeW1ib2wgZm9yIGluZGljYXRpbmcgYSB2YWx1ZSB0aGF0IG1heSB0YWtlIGEgcG9zaXRpdmUgb3IKLSAgICAgIG5lZ2F0aXZlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIG1hZ25pdHVkZSwgdHlwaWNhbGx5IHJlcHJlc2VudGVkCi0gICAgICBieSBhIHBsdXMgc2lnbiBwbGFjZWQgb3ZlciBhIG1pbnVzIHNpZ24uICBGb3IgZXhhbXBsZToKLSAgICAgIFxjb2Rle1xlIHBsdXNtaW51cyAzXCV7fX0uCi0gICAgXGVuZHttYWNyb2Rlc2N9Ci0KLSAgICBcYmVnaW57bWFjcm9kZXNjfXtwcm9ncmFtfXtccHtuYW1lfX0KLSAgICAgIFRoZSBuYW1lIG9mIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbS4gIFRoaXMgbWF5IGRpZmZlciBmcm9tIHRoZQotICAgICAgZmlsZSBuYW1lIGZvciB0aGUgZXhlY3V0YWJsZSBmb3Igc29tZSBwbGF0Zm9ybXMuICBJbiBwYXJ0aWN1bGFyLAotICAgICAgdGhlIFxmaWxley5leGV9IChvciBvdGhlcikgZXh0ZW5zaW9uIHNob3VsZCBiZSBvbWl0dGVkIGZvcgotICAgICAgV2luZG93cyBwcm9ncmFtcy4KLSAgICBcZW5ke21hY3JvZGVzY30KLQotICAgIFxiZWdpbnttYWNyb2Rlc2N9e3Byb2dyYW1vcHR9e1xwe29wdGlvbn19Ci0gICAgICBBIGNvbW1hbmQtbGluZSBvcHRpb24gdG8gYW4gZXhlY3V0YWJsZSBwcm9ncmFtLiAgVXNlIHRoaXMgb25seQotICAgICAgZm9yIGBgc2hvcnQnJyBvcHRpb25zLCBhbmQgaW5jbHVkZSB0aGUgbGVhZGluZyBoeXBoZW4uCi0gICAgXGVuZHttYWNyb2Rlc2N9Ci0KLSAgICBcYmVnaW57bWFjcm9kZXNjfXtsb25ncHJvZ3JhbW9wdH17XHB7b3B0aW9ufX0KLSAgICAgIEEgbG9uZyBjb21tYW5kLWxpbmUgb3B0aW9uIHRvIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbS4gIFRoaXMKLSAgICAgIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGxvbmcgb3B0aW9uIG5hbWVzIHdoaWNoIHdpbGwgYmUgcHJlZml4ZWQKLSAgICAgIGJ5IHR3byBoeXBoZW5zOyB0aGUgaHlwaGVucyBzaG91bGQgbm90IGJlIHByb3ZpZGVkIGFzIHBhcnQgb2YKLSAgICAgIFx2YXJ7b3B0aW9ufS4KLSAgICBcZW5ke21hY3JvZGVzY30KLQotICAgIFxiZWdpbnttYWNyb2Rlc2N9e3JlZm1vZHVsZX17XG9we2tleX1ccHtuYW1lfX0KLSAgICAgIExpa2UgXG1hY3Jve21vZHVsZX0sIGJ1dCBjcmVhdGUgYSBoeXBlcmxpbmsgdG8gdGhlIGRvY3VtZW50YXRpb24KLSAgICAgIGZvciB0aGUgbmFtZWQgbW9kdWxlLiAgTm90ZSB0aGF0IHRoZSBjb3JyZXNwb25kaW5nCi0gICAgICBcbWFjcm97ZGVjbGFyZW1vZHVsZX0gbXVzdCBiZSBpbiB0aGUgc2FtZSBkb2N1bWVudC4gIElmIHRoZQotICAgICAgXG1hY3Jve2RlY2xhcmVtb2R1bGV9IGRlZmluZXMgYSBtb2R1bGUga2V5IGRpZmZlcmVudCBmcm9tIHRoZQotICAgICAgbW9kdWxlIG5hbWUsIGl0IG11c3QgYWxzbyBiZSBwcm92aWRlZCBhcyBcdmFye2tleX0gdG8gdGhlCi0gICAgICBcbWFjcm97cmVmbW9kdWxlfSBtYWNyby4KLSAgICBcZW5ke21hY3JvZGVzY30KLQotICAgIFxiZWdpbnttYWNyb2Rlc2N9e3JlZ2V4cH17XHB7c3RyaW5nfX0KLSAgICAgIE1hcmsgYSByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAgXGVuZHttYWNyb2Rlc2N9Ci0KLSAgICBcYmVnaW57bWFjcm9kZXNjfXtyZmN9e1xwe251bWJlcn19Ci0gICAgICBBIHJlZmVyZW5jZSB0byBhbiBJbnRlcm5ldCBSZXF1ZXN0IGZvciBDb21tZW50cy4gIFRoaXMgZ2VuZXJhdGVzCi0gICAgICBhcHByb3ByaWF0ZSBpbmRleCBlbnRyaWVzLiAgVGhlIHRleHQgXHNhbXB7UkZDIFx2YXJ7bnVtYmVyfX0gaXMKLSAgICAgIGdlbmVyYXRlZDsgaW4gdGhlIEhUTUwgb3V0cHV0LCB0aGlzIHRleHQgaXMgYSBoeXBlcmxpbmsgdG8gYW4KLSAgICAgIG9ubGluZSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgUkZDLgotICAgIFxlbmR7bWFjcm9kZXNjfQotCi0gICAgXGJlZ2lue21hY3JvZGVzY317c2FtcH17XHB7dGV4dH19Ci0gICAgICBBIHNob3J0IGNvZGUgc2FtcGxlLCBidXQgcG9zc2libHkgbG9uZ2VyIHRoYW4gd291bGQgYmUgZ2l2ZW4KLSAgICAgIHVzaW5nIFxtYWNyb3tjb2RlfS4gIFNpbmNlIHF1b3RhdGlvbiBtYXJrcyBhcmUgYWRkZWQsIHNwYWNlcyBhcmUKLSAgICAgIGFjY2VwdGFibGUuCi0gICAgXGVuZHttYWNyb2Rlc2N9Ci0KLSAgICBcYmVnaW57bWFjcm9kZXNjfXtzaG9ydHZlcnNpb259e30KLSAgICAgIFRoZSBgYHNob3J0JycgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGRvY3VtZW50ZWQgc29mdHdhcmUsIGFzCi0gICAgICBzcGVjaWZpZWQgdXNpbmcgdGhlIFxtYWNyb3tzZXRzaG9ydHZlcnNpb259IG1hY3JvIGluIHRoZQotICAgICAgcHJlYW1ibGUuICBGb3IgUHl0aG9uLCB0aGUgc2hvcnQgdmVyc2lvbiBudW1iZXIgZm9yIGEgcmVsZWFzZSBpcwotICAgICAgdGhlIGZpcnN0IHRocmVlIGNoYXJhY3RlcnMgb2YgdGhlIFxjb2Rle3N5cy52ZXJzaW9ufSB2YWx1ZS4gIEZvcgotICAgICAgZXhhbXBsZSwgdmVyc2lvbnMgMi4wYjEgYW5kIDIuMC4xIGJvdGggaGF2ZSBhIHNob3J0IHZlcnNpb24gb2YKLSAgICAgIDIuMC4gIFRoaXMgbWF5IG5vdCBhcHBseSBmb3IgYWxsIHBhY2thZ2VzOyBpZgotICAgICAgXG1hY3Jve3NldHNob3J0dmVyc2lvbn0gaXMgbm90IHVzZWQsIHRoaXMgcHJvZHVjZXMgYW4gZW1wdHkKLSAgICAgIGV4cGFuc2lvbi4gIFNlZSBhbHNvIHRoZSBcbWFjcm97dmVyc2lvbn0gbWFjcm8uCi0gICAgXGVuZHttYWNyb2Rlc2N9Ci0KLSAgICBcYmVnaW57bWFjcm9kZXNjfXtzdHJvbmd9e1xwe3RleHR9fQotICAgICAgU3Ryb25nbHkgZW1waGFzaXplZCB0ZXh0OyB0aGlzIHdpbGwgYmUgcHJlc2VudGVkIHVzaW5nIGEgYm9sZAotICAgICAgZm9udC4KLSAgICBcZW5ke21hY3JvZGVzY30KLQotICAgIFxiZWdpbnttYWNyb2Rlc2N9e3VsaW5rfXtccHt0ZXh0fVxwe3VybH19Ci0gICAgICBBIGh5cGVydGV4dCBsaW5rIHdpdGggYSB0YXJnZXQgc3BlY2lmaWVkIGJ5IGEgVVJMLCBidXQgZm9yIHdoaWNoCi0gICAgICB0aGUgbGluayB0ZXh0IHNob3VsZCBub3QgYmUgdGhlIHRpdGxlIG9mIHRoZSByZXNvdXJjZS4gIEZvcgotICAgICAgcmVzb3VyY2VzIGJlaW5nIHJlZmVyZW5jZWQgYnkgbmFtZSwgdXNlIHRoZSBcbWFjcm97Y2l0ZXRpdGxlfQotICAgICAgbWFjcm8uICBOb3QgYWxsIGZvcm1hdHRlZCB2ZXJzaW9ucyBzdXBwb3J0IGFyYml0cmFyeSBoeXBlcnRleHQKLSAgICAgIGxpbmtzLiAgTm90ZSB0aGF0IG1hbnkgY2hhcmFjdGVycyBhcmUgc3BlY2lhbCB0byBcTGFUZVh7fSBhbmQKLSAgICAgIHRoaXMgbWFjcm8gZG9lcyBub3QgYWx3YXlzIGRvIHRoZSByaWdodCB0aGluZy4gIEluIHBhcnRpY3VsYXIsCi0gICAgICB0aGUgdGlsZGUgY2hhcmFjdGVyIChcY2hhcmFjdGVye1x+fSkgaXMgbWlzLWhhbmRsZWQ7IGVuY29kaW5nIGl0Ci0gICAgICBhcyBhIGhleC1zZXF1ZW5jZSBkb2VzIHdvcmssIHVzZSBcc2FtcHtcJTdlfSBpbiBwbGFjZSBvZiB0aGUKLSAgICAgIHRpbGRlIGNoYXJhY3Rlci4KLSAgICBcZW5ke21hY3JvZGVzY30KLQotICAgIFxiZWdpbnttYWNyb2Rlc2N9e3VybH17XHB7dXJsfX0KLSAgICAgIEEgVVJMIChvciBVUk4pLiAgVGhlIFVSTCB3aWxsIGJlIHByZXNlbnRlZCBhcyB0ZXh0LiAgSW4gdGhlIEhUTUwKLSAgICAgIGFuZCBQREYgZm9ybWF0dGVkIHZlcnNpb25zLCB0aGUgVVJMIHdpbGwgYWxzbyBiZSBhIGh5cGVybGluay4KLSAgICAgIFRoaXMgY2FuIGJlIHVzZWQgd2hlbiByZWZlcnJpbmcgdG8gZXh0ZXJuYWwgcmVzb3VyY2VzIHdpdGhvdXQKLSAgICAgIHNwZWNpZmljIHRpdGxlczsgcmVmZXJlbmNlcyB0byByZXNvdXJjZXMgd2hpY2ggaGF2ZSB0aXRsZXMKLSAgICAgIHNob3VsZCBiZSBtYXJrZWQgdXNpbmcgdGhlIFxtYWNyb3tjaXRldGl0bGV9IG1hY3JvLiAgU2VlIHRoZQotICAgICAgY29tbWVudHMgYWJvdXQgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUKLSAgICAgIFxtYWNyb3t1bGlua30gbWFjcm8gZm9yIHNwZWNpYWwgY29uc2lkZXJhdGlvbnMuCi0gICAgXGVuZHttYWNyb2Rlc2N9Ci0KLSAgICBcYmVnaW57bWFjcm9kZXNjfXt2YXJ9e1xwe25hbWV9fQotICAgICAgVGhlIG5hbWUgb2YgYSB2YXJpYWJsZSBvciBmb3JtYWwgcGFyYW1ldGVyIGluIHJ1bm5pbmcgdGV4dC4KLSAgICBcZW5ke21hY3JvZGVzY30KLQotICAgIFxiZWdpbnttYWNyb2Rlc2N9e3ZlcnNpb259e30KLSAgICAgIFRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZGVzY3JpYmVkIHNvZnR3YXJlLCBhcyBzcGVjaWZpZWQgdXNpbmcKLSAgICAgIFxtYWNyb3tyZWxlYXNlfSBpbiB0aGUgcHJlYW1ibGUuICBTZWUgYWxzbyB0aGUKLSAgICAgIFxtYWNyb3tzaG9ydHZlcnNpb259IG1hY3JvLgotICAgIFxlbmR7bWFjcm9kZXNjfQotCi0gICAgXGJlZ2lue21hY3JvZGVzY317d2FybmluZ317XHB7dGV4dH19Ci0gICAgICBBbiBpbXBvcnRhbnQgYml0IG9mIGluZm9ybWF0aW9uIGFib3V0IGFuIEFQSSB0aGF0IGEgdXNlciBzaG91bGQKLSAgICAgIGJlIHZlcnkgYXdhcmUgb2Ygd2hlbiB1c2luZyB3aGF0ZXZlciBiaXQgb2YgQVBJIHRoZSB3YXJuaW5nCi0gICAgICBwZXJ0YWlucyB0by4gIFRoaXMgc2hvdWxkIGJlIHRoZSBsYXN0IHRoaW5nIGluIHRoZSBwYXJhZ3JhcGggYXMKLSAgICAgIHRoZSBlbmQgb2YgdGhlIHdhcm5pbmcgaXMgbm90IHZpc3VhbGx5IG1hcmtlZCBpbiBhbnkgd2F5LiAgVGhlCi0gICAgICBjb250ZW50IG9mIFx2YXJ7dGV4dH0gc2hvdWxkIGJlIHdyaXR0ZW4gaW4gY29tcGxldGUgc2VudGVuY2VzCi0gICAgICBhbmQgaW5jbHVkZSBhbGwgYXBwcm9wcmlhdGUgcHVuY3R1YXRpb24uICBUaGlzIGRpZmZlcnMgZnJvbQotICAgICAgXG1hY3Jve25vdGV9IGluIHRoYXQgaXQgaXMgcmVjb21tZW5kZWQgb3ZlciBcbWFjcm97bm90ZX0gZm9yCi0gICAgICBpbmZvcm1hdGlvbiByZWdhcmRpbmcgc2VjdXJpdHkuCi0gICAgXGVuZHttYWNyb2Rlc2N9Ci0KLSAgICBUaGUgZm9sbG93aW5nIHR3byBtYWNyb3MgYXJlIHVzZWQgdG8gZGVzY3JpYmUgaW5mb3JtYXRpb24gdGhhdCdzCi0gICAgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgZnJvbSBvbmUgcmVsZWFzZSB0byBhbm90aGVyLiAgRm9yIGZlYXR1cmVzCi0gICAgd2hpY2ggYXJlIGRlc2NyaWJlZCBieSBhIHNpbmdsZSBwYXJhZ3JhcGgsIHRoZXNlIGFyZSB0eXBpY2FsbHkKLSAgICBhZGRlZCBhcyBzZXBhcmF0ZSBzb3VyY2UgbGluZXMgYXQgdGhlIGVuZCBvZiB0aGUgcGFyYWdyYXBoLiAgV2hlbgotICAgIGFkZGluZyB0aGVzZSB0byBmZWF0dXJlcyBkZXNjcmliZWQgYnkgbXVsdGlwbGUgcGFyYWdyYXBocywgdGhleQotICAgIGFyZSB1c3VhbGx5IGNvbGxlY3RlZCBpbiBhIHNpbmdsZSBzZXBhcmF0ZSBwYXJhZ3JhcGggYWZ0ZXIgdGhlCi0gICAgZGVzY3JpcHRpb24uICBXaGVuIGJvdGggXG1hY3Jve3ZlcnNpb25hZGRlZH0gYW5kCi0gICAgXG1hY3Jve3ZlcnNpb25jaGFuZ2VkfSBhcmUgdXNlZCwgXG1hY3Jve3ZlcnNpb25hZGRlZH0gc2hvdWxkIGNvbWUKLSAgICBmaXJzdDsgdGhlIHZlcnNpb25zIHNob3VsZCBiZSBsaXN0ZWQgaW4gY2hyb25vbG9naWNhbCBvcmRlci4gIEJvdGgKLSAgICBvZiB0aGVzZSBzaG91bGQgY29tZSBiZWZvcmUgYXZhaWxhYmlsaXR5IHN0YXRlbWVudHMuICBUaGUgbG9jYXRpb24KLSAgICBzaG91bGQgYmUgc2VsZWN0ZWQgc28gdGhlIGV4cGxhbmF0aW9uIG1ha2VzIHNlbnNlIGFuZCBtYXkgdmFyeSBhcwotICAgIG5lZWRlZC4KLQotICAgIFxiZWdpbnttYWNyb2Rlc2N9e3ZlcnNpb25hZGRlZH17XG9we2V4cGxhbmF0aW9ufVxwe3ZlcnNpb259fQotICAgICAgVGhlIHZlcnNpb24gb2YgUHl0aG9uIHdoaWNoIGFkZGVkIHRoZSBkZXNjcmliZWQgZmVhdHVyZSB0byB0aGUKLSAgICAgIGxpYnJhcnkgb3IgQyBBUEkuICBcdmFye2V4cGxhbmF0aW9ufSBzaG91bGQgYmUgYSBcZW1waHticmllZn0KLSAgICAgIGV4cGxhbmF0aW9uIG9mIHRoZSBjaGFuZ2UgY29uc2lzdGluZyBvZiBhIGNhcGl0YWxpemVkIHNlbnRlbmNlCi0gICAgICBmcmFnbWVudDsgYSBwZXJpb2Qgd2lsbCBiZSBhcHBlbmRlZCBieSB0aGUgZm9ybWF0dGluZyBwcm9jZXNzLgotICAgICAgV2hlbiB0aGlzIGFwcGxpZXMgdG8gYW4gZW50aXJlIG1vZHVsZSwgaXQgc2hvdWxkIGJlIHBsYWNlZCBhdAotICAgICAgdGhlIHRvcCBvZiB0aGUgbW9kdWxlIHNlY3Rpb24gYmVmb3JlIGFueSBwcm9zZS4KLSAgICBcZW5ke21hY3JvZGVzY30KLQotICAgIFxiZWdpbnttYWNyb2Rlc2N9e3ZlcnNpb25jaGFuZ2VkfXtcb3B7ZXhwbGFuYXRpb259XHB7dmVyc2lvbn19Ci0gICAgICBUaGUgdmVyc2lvbiBvZiBQeXRob24gaW4gd2hpY2ggdGhlIG5hbWVkIGZlYXR1cmUgd2FzIGNoYW5nZWQgaW4KLSAgICAgIHNvbWUgd2F5IChuZXcgcGFyYW1ldGVycywgY2hhbmdlZCBzaWRlIGVmZmVjdHMsIGV0Yy4pLgotICAgICAgXHZhcntleHBsYW5hdGlvbn0gc2hvdWxkIGJlIGEgXGVtcGh7YnJpZWZ9IGV4cGxhbmF0aW9uIG9mIHRoZQotICAgICAgY2hhbmdlIGNvbnNpc3Rpbmcgb2YgYSBjYXBpdGFsaXplZCBzZW50ZW5jZSBmcmFnbWVudDsgYQotICAgICAgcGVyaW9kIHdpbGwgYmUgYXBwZW5kZWQgYnkgdGhlIGZvcm1hdHRpbmcgcHJvY2Vzcy4gIFRoaXMgc2hvdWxkCi0gICAgICBub3QgZ2VuZXJhbGx5IGJlIGFwcGxpZWQgdG8gbW9kdWxlcy4KLSAgICBcZW5ke21hY3JvZGVzY30KLQotCi0gIFxzdWJzZWN0aW9ue01pc2NlbGxhbmVvdXMgVGV4dCBNYXJrdXAgXGxhYmVse21pc2MtdGV4dC1tYXJrdXB9fQotCi0gIEluIGFkZGl0aW9uIHRvIHRoZSBpbmxpbmUgbWFya3VwLCBzb21lIGFkZGl0aW9uYWwgYGBibG9jaycnIG1hcmt1cAotICBpcyBkZWZpbmVkIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGJyaW5nIGF0dGVudGlvbiB0byB2YXJpb3VzIGJpdHMgb2YKLSAgdGV4dC4gIFRoZSBtYXJrdXAgZGVzY3JpYmVkIGhlcmUgc2VydmVzIHRoaXMgcHVycG9zZSwgYW5kIGlzCi0gIGludGVuZGVkIHRvIGJlIHVzZWQgd2hlbiBtYXJraW5nIG9uZSBvciBtb3JlIHBhcmFncmFwaHMgb3Igb3RoZXIKLSAgYmxvY2sgY29uc3RydWN0cyAoc3VjaCBhcyBcZW52e3ZlcmJhdGltfSBlbnZpcm9ubWVudHMpLgotCi0gIFxiZWdpbntlbnZkZXNjfXtub3RpY2V9e1xvcHt0eXBlfX0KLSAgICBMYWJlbCBzb21lIHBhcmFncmFwaHMgYXMgYmVpbmcgd29ydGh5IG9mIGFkZGl0aW9uYWwgYXR0ZW50aW9uIGZyb20KLSAgICB0aGUgcmVhZGVyLiAgV2hhdCBzb3J0IG9mIGF0dGVudGlvbiBpcyB3YXJyYW50ZWQgY2FuIGJlIGluZGljYXRlZAotICAgIGJ5IHNwZWNpZnlpbmcgdGhlIFx2YXJ7dHlwZX0gb2YgdGhlIG5vdGljZS4gIFRoZSBvbmx5IHZhbHVlcwotICAgIGRlZmluZWQgZm9yIFx2YXJ7dHlwZX0gYXJlIFxjb2Rle25vdGV9IGFuZCBcY29kZXt3YXJuaW5nfTsgdGhlc2UKLSAgICBhcmUgZXF1aXZhbGVudCBpbiBpbnRlbnQgdG8gdGhlIGlubGluZSBtYXJrdXAgb2YgdGhlIHNhbWUgbmFtZS4KLSAgICBJZiBcdmFye3R5cGV9IGlzIG9taXR0ZWQsIFxjb2Rle25vdGV9IGlzIHVzZWQuICBBZGRpdGlvbmFsIHZhbHVlcwotICAgIG1heSBiZSBkZWZpbmVkIGluIHRoZSBmdXR1cmUuCi0gIFxlbmR7ZW52ZGVzY30KLQotCi0gIFxzdWJzZWN0aW9ue01vZHVsZS1zcGVjaWZpYyBNYXJrdXAgXGxhYmVse21vZHVsZS1tYXJrdXB9fQotCi0gIFRoZSBtYXJrdXAgZGVzY3JpYmVkIGluIHRoaXMgc2VjdGlvbiBpcyB1c2VkIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24KLSAgYWJvdXQgYSBtb2R1bGUgYmVpbmcgZG9jdW1lbnRlZC4gIEVhY2ggbW9kdWxlIHNob3VsZCBiZSBkb2N1bWVudGVkCi0gIGluIGl0cyBvd24gXG1hY3Jve3NlY3Rpb259LiAgQSB0eXBpY2FsIHVzZSBvZiB0aGlzIG1hcmt1cAotICBhcHBlYXJzIGF0IHRoZSB0b3Agb2YgdGhhdCBzZWN0aW9uIGFuZCBtaWdodCBsb29rIGxpa2UgdGhpczoKLQotXGJlZ2lue3ZlcmJhdGltfQotXHNlY3Rpb257XG1vZHVsZXtzcGFtfSAtLS0KLSAgICAgICAgIEFjY2VzcyB0byB0aGUgU1BBTSBmYWNpbGl0eX0KLQotXGRlY2xhcmVtb2R1bGV7ZXh0ZW5zaW9ufXtzcGFtfQotICBccGxhdGZvcm17VW5peH0KLVxtb2R1bGVzeW5vcHNpc3tBY2Nlc3MgdG8gdGhlIFNQQU0gZmFjaWxpdHkgb2YgXFVOSVgufQotXG1vZHVsZWF1dGhvcntKYW5lIERvZX17amFuZS5kb2VAZnJvYm5pdHoub3JnfQotXGVuZHt2ZXJiYXRpbX0KLQotICBQeXRob24gcGFja2FnZXNcaW5kZXh7cGFja2FnZXN9IC0tLSBjb2xsZWN0aW9ucyBvZiBtb2R1bGVzIHRoYXQgY2FuCi0gIGJlIGRlc2NyaWJlZCBhcyBhIHVuaXQgLS0tIGFyZSBkb2N1bWVudGVkIHVzaW5nIHRoZSBzYW1lIG1hcmt1cCBhcwotICBtb2R1bGVzLiAgVGhlIG5hbWUgZm9yIGEgbW9kdWxlIGluIGEgcGFja2FnZSBzaG91bGQgYmUgdHlwZWQgaW4KLSAgYGBmdWxseSBxdWFsaWZpZWQnJyBmb3JtIChpdCBzaG91bGQgaW5jbHVkZSB0aGUgcGFja2FnZSBuYW1lKS4KLSAgRm9yIGV4YW1wbGUsIGEgbW9kdWxlIGBgZm9vJycgaW4gcGFja2FnZSBgYGJhcicnIHNob3VsZCBiZSBtYXJrZWQgYXMKLSAgXGNvZGV7XGUgbW9kdWxlXHtiYXIuZm9vXH19LCBhbmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVmZXJlbmNlCi0gIHNlY3Rpb24gd291bGQgYXBwZWFyIGFzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1cc2VjdGlvbntcbW9kdWxle2Jhci5mb299IC0tLQotICAgICAgICAgTW9kdWxlIGZyb20gdGhlIFxtb2R1bGV7YmFyfSBwYWNrYWdlfQotCi1cZGVjbGFyZW1vZHVsZXtleHRlbnNpb259e2Jhci5mb299Ci1cbW9kdWxlc3lub3BzaXN7TmlmdHkgbW9kdWxlIGZyb20gdGhlIFxtb2R1bGV7YmFyfSBwYWNrYWdlLn0KLVxtb2R1bGVhdXRob3J7SmFuZSBEb2V9e2phbmUuZG9lQGZyb2JuaXR6Lm9yZ30KLVxlbmR7dmVyYmF0aW19Ci0KLSAgTm90ZSB0aGF0IHRoZSBuYW1lIG9mIGEgcGFja2FnZSBpcyBhbHNvIG1hcmtlZCB1c2luZwotICBcbWFjcm97bW9kdWxlfS4KLQotICBcYmVnaW57bWFjcm9kZXNjfXtkZWNsYXJlbW9kdWxlfXtcb3B7a2V5fVxwe3R5cGV9XHB7bmFtZX19Ci0gICAgUmVxdWlyZXMgdHdvIHBhcmFtZXRlcnM6IG1vZHVsZSB0eXBlIChcc2FtcHtzdGFuZGFyZH0sCi0gICAgXHNhbXB7YnVpbHRpbn0sIFxzYW1we2V4dGVuc2lvbn0sIG9yIFxzYW1we30pLCBhbmQgdGhlIG1vZHVsZQotICAgIG5hbWUuICBBbiBvcHRpb25hbCBwYXJhbWV0ZXIgc2hvdWxkIGJlIGdpdmVuIGFzIHRoZSBiYXNpcyBmb3IgdGhlCi0gICAgbW9kdWxlJ3MgYGBrZXknJyB1c2VkIGZvciBsaW5raW5nIHRvIG9yIHJlZmVyZW5jaW5nIHRoZSBzZWN0aW9uLgotICAgIFRoZSBgYGtleScnIHNob3VsZCBvbmx5IGJlIGdpdmVuIGlmIHRoZSBtb2R1bGUncyBuYW1lIGNvbnRhaW5zIGFueQotICAgIHVuZGVyc2NvcmVzLCBhbmQgc2hvdWxkIGJlIHRoZSBuYW1lIHdpdGggdGhlIHVuZGVyc2NvcmVzIHN0cmlwcGVkLgotICAgIE5vdGUgdGhhdCB0aGUgXHZhcnt0eXBlfSBwYXJhbWV0ZXIgbXVzdCBiZSBvbmUgb2YgdGhlIHZhbHVlcwotICAgIGxpc3RlZCBhYm92ZSBvciBhbiBlcnJvciB3aWxsIGJlIHByaW50ZWQuICBGb3IgbW9kdWxlcyB3aGljaCBhcmUKLSAgICBjb250YWluZWQgaW4gcGFja2FnZXMsIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBzaG91bGQgYmUgZ2l2ZW4gYXMKLSAgICBcdmFye25hbWV9IHBhcmFtZXRlci4gIFRoaXMgc2hvdWxkIGJlIHRoZSBmaXJzdCB0aGluZyBhZnRlciB0aGUKLSAgICBcbWFjcm97c2VjdGlvbn0gdXNlZCB0byBpbnRyb2R1Y2UgdGhlIG1vZHVsZS4KLSAgXGVuZHttYWNyb2Rlc2N9Ci0KLSAgXGJlZ2lue21hY3JvZGVzY317cGxhdGZvcm19e1xwe3NwZWNpZmllcn19Ci0gICAgU3BlY2lmaWVzIHRoZSBwb3J0YWJpbGl0eSBvZiB0aGUgbW9kdWxlLiAgXHZhcntzcGVjaWZpZXJ9IGlzIGEKLSAgICBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBrZXlzIHRoYXQgc3BlY2lmeSB3aGF0IHBsYXRmb3JtcyB0aGUKLSAgICBtb2R1bGUgaXMgYXZhaWxhYmxlIG9uLiAgVGhlIGtleXMgYXJlIHNob3J0IGlkZW50aWZpZXJzOwotICAgIGV4YW1wbGVzIHRoYXQgYXJlIGluIHVzZSBpbmNsdWRlIFxzYW1we0lSSVh9LCBcc2FtcHtNYWN9LAotICAgIFxzYW1we1dpbmRvd3N9LCBhbmQgXHNhbXB7VW5peH0uICBJdCBpcyBpbXBvcnRhbnQgdG8gdXNlIGEga2V5Ci0gICAgd2hpY2ggaGFzIGFscmVhZHkgYmVlbiB1c2VkIHdoZW4gYXBwbGljYWJsZS4gIFRoaXMgaXMgdXNlZCB0bwotICAgIHByb3ZpZGUgYW5ub3RhdGlvbnMgaW4gdGhlIE1vZHVsZSBJbmRleCBhbmQgdGhlIEhUTUwgYW5kIEdOVSBpbmZvCi0gICAgb3V0cHV0LgotICBcZW5ke21hY3JvZGVzY30KLQotICBcYmVnaW57bWFjcm9kZXNjfXttb2R1bGVzeW5vcHNpc317XHB7dGV4dH19Ci0gICAgVGhlIFx2YXJ7dGV4dH0gaXMgYSBzaG9ydCwgYGBvbmUgbGluZScnIGRlc2NyaXB0aW9uIG9mIHRoZQotICAgIG1vZHVsZSB0aGF0IGNhbiBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIGNoYXB0ZXIgaW50cm9kdWN0aW9uLgotICAgIFRoaXMgaXMgbXVzdCBiZSBwbGFjZWQgYWZ0ZXIgXG1hY3Jve2RlY2xhcmVtb2R1bGV9LgotICAgIFRoZSBzeW5vcHNpcyBpcyB1c2VkIGluIGJ1aWxkaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgdGFibGUKLSAgICBpbnNlcnRlZCBhcyB0aGUgXG1hY3Jve2xvY2FsbW9kdWxldGFibGV9LiAgTm8gdGV4dCBpcwotICAgIHByb2R1Y2VkIGF0IHRoZSBwb2ludCBvZiB0aGUgbWFya3VwLgotICBcZW5ke21hY3JvZGVzY30KLQotICBcYmVnaW57bWFjcm9kZXNjfXttb2R1bGVhdXRob3J9e1xwe25hbWV9XHB7ZW1haWx9fQotICAgIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBlbmNvZGUgaW5mb3JtYXRpb24gYWJvdXQgd2hvIGF1dGhvcmVkIGEKLSAgICBtb2R1bGUuICBUaGlzIGlzIGN1cnJlbnRseSBub3QgdXNlZCB0byBnZW5lcmF0ZSBvdXRwdXQsIGJ1dCBjYW4gYmUKLSAgICB1c2VkIHRvIGhlbHAgZGV0ZXJtaW5lIHRoZSBvcmlnaW4gb2YgdGhlIG1vZHVsZS4KLSAgXGVuZHttYWNyb2Rlc2N9Ci0KLQotICBcc3Vic2VjdGlvbntMaWJyYXJ5LWxldmVsIE1hcmt1cCBcbGFiZWx7bGlicmFyeS1tYXJrdXB9fQotCi0gICAgVGhpcyBtYXJrdXAgaXMgdXNlZCB3aGVuIGRlc2NyaWJpbmcgYSBzZWxlY3Rpb24gb2YgbW9kdWxlcy4gIEZvcgotICAgIGV4YW1wbGUsIHRoZSBcY2l0ZXRpdGxlWy4uL21hYy9tYWMuaHRtbF17TWFjaW50b3NoIExpYnJhcnkKLSAgICBNb2R1bGVzfSBkb2N1bWVudCB1c2VzIHRoaXMgdG8gaGVscCBwcm92aWRlIGFuIG92ZXJ2aWV3IG9mIHRoZQotICAgIG1vZHVsZXMgaW4gdGhlIGNvbGxlY3Rpb24sIGFuZCBtYW55IGNoYXB0ZXJzIGluIHRoZQotICAgIFxjaXRldGl0bGVbLi4vbGliL2xpYi5odG1sXXtQeXRob24gTGlicmFyeSBSZWZlcmVuY2V9IHVzZSBpdCBmb3IKLSAgICB0aGUgc2FtZSBwdXJwb3NlLgotCi0gIFxiZWdpbnttYWNyb2Rlc2N9e2xvY2FsbW9kdWxldGFibGV9e30KLSAgICBJZiBhIFxmaWxley5zeW59IGZpbGUgZXhpc3RzIGZvciB0aGUgY3VycmVudAotICAgIGNoYXB0ZXIgKG9yIGZvciB0aGUgZW50aXJlIGRvY3VtZW50IGluIFxjb2Rle2hvd3RvfSBkb2N1bWVudHMpLCBhCi0gICAgXGVudntzeW5vcHNpc3RhYmxlfSBpcyBjcmVhdGVkIHdpdGggdGhlIGNvbnRlbnRzIGxvYWRlZCBmcm9tIHRoZQotICAgIFxmaWxley5zeW59IGZpbGUuCi0gIFxlbmR7bWFjcm9kZXNjfQotCi0KLSAgXHN1YnNlY3Rpb257VGFibGUgTWFya3VwIFxsYWJlbHt0YWJsZS1tYXJrdXB9fQotCi0gICAgVGhlcmUgYXJlIHRocmVlIGdlbmVyYWwtcHVycG9zZSB0YWJsZSBlbnZpcm9ubWVudHMgZGVmaW5lZCB3aGljaAotICAgIHNob3VsZCBiZSB1c2VkIHdoZW5ldmVyIHBvc3NpYmxlLiAgVGhlc2UgZW52aXJvbm1lbnRzIGFyZSBkZWZpbmVkCi0gICAgdG8gcHJvdmlkZSB0YWJsZXMgb2Ygc3BlY2lmaWMgd2lkdGhzIGFuZCBzb21lIGNvbnZlbmllbmNlIGZvcgotICAgIGZvcm1hdHRpbmcuICBUaGVzZSBlbnZpcm9ubWVudHMgYXJlIG5vdCBtZWFudCB0byBiZSBnZW5lcmFsCi0gICAgcmVwbGFjZW1lbnRzIGZvciB0aGUgc3RhbmRhcmQgXExhVGVYe30gdGFibGUgZW52aXJvbm1lbnRzLCBidXQgY2FuCi0gICAgYmUgdXNlZCBmb3IgYW4gYWR2YW50YWdlIHdoZW4gdGhlIGRvY3VtZW50cyBhcmUgcHJvY2Vzc2VkIHVzaW5nCi0gICAgdGhlIHRvb2xzIGZvciBQeXRob24gZG9jdW1lbnRhdGlvbiBwcm9jZXNzaW5nLiAgSW4gcGFydGljdWxhciwgdGhlCi0gICAgZ2VuZXJhdGVkIEhUTUwgbG9va3MgZ29vZCEgIFRoZXJlIGlzIGFsc28gYW4gYWR2YW50YWdlIGZvciB0aGUKLSAgICBldmVudHVhbCBjb252ZXJzaW9uIG9mIHRoZSBkb2N1bWVudGF0aW9uIHRvIFhNTCAoc2VlIHNlY3Rpb24KLSAgICBccmVme2Z1dHVyZXN9LCBgYEZ1dHVyZSBEaXJlY3Rpb25zJycpLgotCi0gICAgRWFjaCBlbnZpcm9ubWVudCBpcyBuYW1lZCBcZW52e3RhYmxlXHZhcntjb2xzfX0sIHdoZXJlIFx2YXJ7Y29sc30KLSAgICBpcyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIHRhYmxlIHNwZWNpZmllZCBpbiBsb3dlci1jYXNlCi0gICAgUm9tYW4gbnVtZXJhbHMuICBXaXRoaW4gZWFjaCBvZiB0aGVzZSBlbnZpcm9ubWVudHMsIGFuIGFkZGl0aW9uYWwKLSAgICBtYWNybywgXG1hY3Jve2xpbmVcdmFye2NvbHN9fSwgaXMgZGVmaW5lZCwgd2hlcmUgXHZhcntjb2xzfQotICAgIG1hdGNoZXMgdGhlIFx2YXJ7Y29sc30gdmFsdWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgdGFibGUKLSAgICBlbnZpcm9ubWVudC4gIFRoZXNlIGFyZSBzdXBwb3J0ZWQgZm9yIFx2YXJ7Y29sc30gdmFsdWVzIG9mCi0gICAgXGNvZGV7aWl9LCBcY29kZXtpaWl9LCBhbmQgXGNvZGV7aXZ9LiAgVGhlc2UgZW52aXJvbm1lbnRzIGFyZSBhbGwKLSAgICBidWlsdCBvbiB0b3Agb2YgdGhlIFxlbnZ7dGFidWxhcn0gZW52aXJvbm1lbnQuICBWYXJpYW50cyBiYXNlZCBvbgotICAgIHRoZSBcZW52e2xvbmd0YWJsZX0gZW52aXJvbm1lbnQgYXJlIGFsc28gcHJvdmlkZWQuCi0KLSAgICBOb3RlIHRoYXQgYWxsIHRhYmxlcyBpbiB0aGUgc3RhbmRhcmQgUHl0aG9uIGRvY3VtZW50YXRpb24gdXNlCi0gICAgdmVydGljYWwgbGluZXMgYmV0d2VlbiBjb2x1bW5zLCBhbmQgdGhpcyBtdXN0IGJlIHNwZWNpZmllZCBpbiB0aGUKLSAgICBtYXJrdXAgZm9yIGVhY2ggdGFibGUuICBBIGdlbmVyYWwgYm9yZGVyIGFyb3VuZCB0aGUgb3V0c2lkZSBvZiB0aGUKLSAgICB0YWJsZSBpcyBub3QgdXNlZCwgYnV0IHdvdWxkIGJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUKLSAgICBwcm9jZXNzb3I7IHRoZSBkb2N1bWVudCBtYXJrdXAgc2hvdWxkIG5vdCBpbmNsdWRlIGFuIGV4dGVyaW9yCi0gICAgYm9yZGVyLgotCi0gICAgVGhlIFxlbnZ7bG9uZ3RhYmxlfS1iYXNlZCB2YXJpYW50cyBvZiB0aGUgdGFibGUgZW52aXJvbm1lbnRzIGFyZQotICAgIGZvcm1hdHRlZCB3aXRoIGV4dHJhIHNwYWNlIGJlZm9yZSBhbmQgYWZ0ZXIsIHNvIHNob3VsZCBvbmx5IGJlCi0gICAgdXNlZCBvbiB0YWJsZXMgd2hpY2ggYXJlIGxvbmcgZW5vdWdoIHRoYXQgc3BsaXR0aW5nIG92ZXIgbXVsdGlwbGUKLSAgICBwYWdlcyBpcyByZWFzb25hYmxlOyB0YWJsZXMgd2l0aCBmZXdlciB0aGFuIHR3ZW50eSByb3dzIHNob3VsZAotICAgIG5ldmVyIGJ5IG1hcmtlZCB1c2luZyB0aGUgbG9uZyBmbGF2b3JzIG9mIHRoZSB0YWJsZSBlbnZpcm9ubWVudHMuCi0gICAgVGhlIGhlYWRlciByb3cgaXMgcmVwZWF0ZWQgYWNyb3NzIHRoZSB0b3Agb2YgZWFjaCBwYXJ0IG9mIHRoZQotICAgIHRhYmxlLgotCi0gICAgXGJlZ2lue2VudmRlc2N9e3RhYmxlaWl9e1xwe2NvbHNwZWN9XHB7Y29sMWZvbnR9XHB7aGVhZGluZzF9XHB7aGVhZGluZzJ9fQotICAgICAgQ3JlYXRlIGEgdHdvLWNvbHVtbiB0YWJsZSB1c2luZyB0aGUgXExhVGVYe30gY29sdW1uIHNwZWNpZmllcgotICAgICAgXHZhcntjb2xzcGVjfS4gIFRoZSBjb2x1bW4gc3BlY2lmaWVyIHNob3VsZCBpbmRpY2F0ZSB2ZXJ0aWNhbAotICAgICAgYmFycyBiZXR3ZWVuIGNvbHVtbnMgYXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBzcGVjaWZpYyB0YWJsZSwgYnV0Ci0gICAgICBzaG91bGQgbm90IHNwZWNpZnkgdmVydGljYWwgYmFycyBvbiB0aGUgb3V0c2lkZSBvZiB0aGUgdGFibGUKLSAgICAgICh0aGF0IGlzIGNvbnNpZGVyZWQgYSBzdHlsZXNoZWV0IGlzc3VlKS4gIFRoZSBcdmFye2NvbDFmb250fQotICAgICAgcGFyYW1ldGVyIGlzIHVzZWQgYXMgYSBzdHlsaXN0aWMgdHJlYXRtZW50IG9mIHRoZSBmaXJzdCBjb2x1bW4KLSAgICAgIG9mIHRoZSB0YWJsZTogdGhlIGZpcnN0IGNvbHVtbiBpcyBwcmVzZW50ZWQgYXMKLSAgICAgIFxjb2Rle1xlXHZhcntjb2wxZm9udH1ce2NvbHVtbjFcfX0uICBUbyBhdm9pZCB0cmVhdGluZyB0aGUgZmlyc3QKLSAgICAgIGNvbHVtbiBzcGVjaWFsbHksIFx2YXJ7Y29sMWZvbnR9IG1heSBiZSBcc2FtcHt0ZXh0cm19LiAgVGhlCi0gICAgICBjb2x1bW4gaGVhZGluZ3MgYXJlIHRha2VuIGZyb20gdGhlIHZhbHVlcyBcdmFye2hlYWRpbmcxfSBhbmQKLSAgICAgIFx2YXJ7aGVhZGluZzJ9LgotICAgIFxlbmR7ZW52ZGVzY30KLQotICAgIFxiZWdpbntlbnZkZXNjfXtsb25ndGFibGVpaX17XHVuc3BlY2lmaWVkfQotICAgICAgTGlrZSBcZW52e3RhYmxlaWl9LCBidXQgcHJvZHVjZXMgYSB0YWJsZSB3aGljaCBtYXkgYmUgYnJva2VuCi0gICAgICBhY3Jvc3MgcGFnZSBib3VuZGFyaWVzLiAgVGhlIHBhcmFtZXRlcnMgYXJlIHRoZSBzYW1lIGFzIGZvcgotICAgICAgXGVudnt0YWJsZWlpfS4KLSAgICBcZW5ke2VudmRlc2N9Ci0KLSAgICBcYmVnaW57bWFjcm9kZXNjfXtsaW5laWl9e1xwe2NvbHVtbjF9XHB7Y29sdW1uMn19Ci0gICAgICBDcmVhdGUgYSBzaW5nbGUgdGFibGUgcm93IHdpdGhpbiBhIFxlbnZ7dGFibGVpaX0gb3IKLSAgICAgIFxlbnZ7bG9uZ3RhYmxlaWl9IGVudmlyb25tZW50LgotICAgICAgVGhlIHRleHQgZm9yIHRoZSBmaXJzdCBjb2x1bW4gd2lsbCBiZSBnZW5lcmF0ZWQgYnkgYXBwbHlpbmcgdGhlCi0gICAgICBtYWNybyBuYW1lZCBieSB0aGUgXHZhcntjb2wxZm9udH0gdmFsdWUgd2hlbiB0aGUgXGVudnt0YWJsZWlpfQotICAgICAgd2FzIG9wZW5lZC4KLSAgICBcZW5ke21hY3JvZGVzY30KLQotICAgIFxiZWdpbntlbnZkZXNjfXt0YWJsZWlpaX17XHB7Y29sc3BlY31ccHtjb2wxZm9udH1ccHtoZWFkaW5nMX1ccHtoZWFkaW5nMn1ccHtoZWFkaW5nM319Ci0gICAgICBMaWtlIHRoZSBcZW52e3RhYmxlaWl9IGVudmlyb25tZW50LCBidXQgd2l0aCBhIHRoaXJkIGNvbHVtbi4KLSAgICAgIFRoZSBoZWFkaW5nIGZvciB0aGUgdGhpcmQgY29sdW1uIGlzIGdpdmVuIGJ5IFx2YXJ7aGVhZGluZzN9LgotICAgIFxlbmR7ZW52ZGVzY30KLQotICAgIFxiZWdpbntlbnZkZXNjfXtsb25ndGFibGVpaWl9e1x1bnNwZWNpZmllZH0KLSAgICAgIExpa2UgXGVudnt0YWJsZWlpaX0sIGJ1dCBwcm9kdWNlcyBhIHRhYmxlIHdoaWNoIG1heSBiZSBicm9rZW4KLSAgICAgIGFjcm9zcyBwYWdlIGJvdW5kYXJpZXMuICBUaGUgcGFyYW1ldGVycyBhcmUgdGhlIHNhbWUgYXMgZm9yCi0gICAgICBcZW52e3RhYmxlaWlpfS4KLSAgICBcZW5ke2VudmRlc2N9Ci0KLSAgICBcYmVnaW57bWFjcm9kZXNjfXtsaW5laWlpfXtccHtjb2x1bW4xfVxwe2NvbHVtbjJ9XHB7Y29sdW1uM319Ci0gICAgICBMaWtlIHRoZSBcbWFjcm97bGluZWlpfSBtYWNybywgYnV0IHdpdGggYSB0aGlyZCBjb2x1bW4uICBUaGUKLSAgICAgIHRleHQgZm9yIHRoZSB0aGlyZCBjb2x1bW4gaXMgZ2l2ZW4gYnkgXHZhcntjb2x1bW4zfS4KLSAgICBcZW5ke21hY3JvZGVzY30KLQotICAgIFxiZWdpbntlbnZkZXNjfXt0YWJsZWl2fXtccHtjb2xzcGVjfVxwe2NvbDFmb250fVxwe2hlYWRpbmcxfVxwe2hlYWRpbmcyfVxwe2hlYWRpbmczfVxwe2hlYWRpbmc0fX0KLSAgICAgIExpa2UgdGhlIFxlbnZ7dGFibGVpaWl9IGVudmlyb25tZW50LCBidXQgd2l0aCBhIGZvdXJ0aCBjb2x1bW4uCi0gICAgICBUaGUgaGVhZGluZyBmb3IgdGhlIGZvdXJ0aCBjb2x1bW4gaXMgZ2l2ZW4gYnkgXHZhcntoZWFkaW5nNH0uCi0gICAgXGVuZHtlbnZkZXNjfQotCi0gICAgXGJlZ2lue2VudmRlc2N9e2xvbmd0YWJsZWl2fXtcdW5zcGVjaWZpZWR9Ci0gICAgICBMaWtlIFxlbnZ7dGFibGVpdn0sIGJ1dCBwcm9kdWNlcyBhIHRhYmxlIHdoaWNoIG1heSBiZSBicm9rZW4KLSAgICAgIGFjcm9zcyBwYWdlIGJvdW5kYXJpZXMuICBUaGUgcGFyYW1ldGVycyBhcmUgdGhlIHNhbWUgYXMgZm9yCi0gICAgICBcZW52e3RhYmxlaXZ9LgotICAgIFxlbmR7ZW52ZGVzY30KLQotICAgIFxiZWdpbnttYWNyb2Rlc2N9e2xpbmVpdn17XHB7Y29sdW1uMX1ccHtjb2x1bW4yfVxwe2NvbHVtbjN9XHB7Y29sdW1uNH19Ci0gICAgICBMaWtlIHRoZSBcbWFjcm97bGluZWlpaX0gbWFjcm8sIGJ1dCB3aXRoIGEgZm91cnRoIGNvbHVtbi4gIFRoZQotICAgICAgdGV4dCBmb3IgdGhlIGZvdXJ0aCBjb2x1bW4gaXMgZ2l2ZW4gYnkgXHZhcntjb2x1bW40fS4KLSAgICBcZW5ke21hY3JvZGVzY30KLQotICAgIFxiZWdpbntlbnZkZXNjfXt0YWJsZXZ9e1xwe2NvbHNwZWN9XHB7Y29sMWZvbnR9XHB7aGVhZGluZzF9XHB7aGVhZGluZzJ9XHB7aGVhZGluZzN9XHB7aGVhZGluZzR9XHB7aGVhZGluZzV9fQotICAgICAgTGlrZSB0aGUgXGVudnt0YWJsZWl2fSBlbnZpcm9ubWVudCwgYnV0IHdpdGggYSBmaWZ0aCBjb2x1bW4uCi0gICAgICBUaGUgaGVhZGluZyBmb3IgdGhlIGZpZnRoIGNvbHVtbiBpcyBnaXZlbiBieSBcdmFye2hlYWRpbmc1fS4KLSAgICBcZW5ke2VudmRlc2N9Ci0KLSAgICBcYmVnaW57ZW52ZGVzY317bG9uZ3RhYmxldn17XHVuc3BlY2lmaWVkfQotICAgICAgTGlrZSBcZW52e3RhYmxldn0sIGJ1dCBwcm9kdWNlcyBhIHRhYmxlIHdoaWNoIG1heSBiZSBicm9rZW4KLSAgICAgIGFjcm9zcyBwYWdlIGJvdW5kYXJpZXMuICBUaGUgcGFyYW1ldGVycyBhcmUgdGhlIHNhbWUgYXMgZm9yCi0gICAgICBcZW52e3RhYmxldn0uCi0gICAgXGVuZHtlbnZkZXNjfQotCi0gICAgXGJlZ2lue21hY3JvZGVzY317bGluZXZ9e1xwe2NvbHVtbjF9XHB7Y29sdW1uMn1ccHtjb2x1bW4zfVxwe2NvbHVtbjR9XHB7Y29sdW1uNX19Ci0gICAgICBMaWtlIHRoZSBcbWFjcm97bGluZWl2fSBtYWNybywgYnV0IHdpdGggYSBmaWZ0aCBjb2x1bW4uICBUaGUKLSAgICAgIHRleHQgZm9yIHRoZSBmaWZ0aCBjb2x1bW4gaXMgZ2l2ZW4gYnkgXHZhcntjb2x1bW41fS4KLSAgICBcZW5ke21hY3JvZGVzY30KLQotCi0gICAgQW4gYWRkaXRpb25hbCB0YWJsZS1saWtlIGVudmlyb25tZW50IGlzIFxlbnZ7c3lub3BzaXN0YWJsZX0uICBUaGUKLSAgICB0YWJsZSBnZW5lcmF0ZWQgYnkgdGhpcyBlbnZpcm9ubWVudCBjb250YWlucyB0d28gY29sdW1ucywgYW5kIGVhY2gKLSAgICByb3cgaXMgZGVmaW5lZCBieSBhbiBhbHRlcm5hdGUgZGVmaW5pdGlvbiBvZgotICAgIFxtYWNyb3ttb2R1bGVzeW5vcHNpc30uICBUaGlzIGVudmlyb25tZW50IGlzIG5vdCBub3JtYWxseSB1c2VkIGJ5Ci0gICAgYXV0aG9ycywgYnV0IGlzIGNyZWF0ZWQgYnkgdGhlIFxtYWNyb3tsb2NhbG1vZHVsZXRhYmxlfSBtYWNyby4KLQotICAgIEhlcmUgaXMgYSBzbWFsbCBleGFtcGxlIG9mIGEgdGFibGUgZ2l2ZW4gaW4gdGhlIGRvY3VtZW50YXRpb24gZm9yCi0gICAgdGhlIFxtb2R1bGV7d2FybmluZ3N9IG1vZHVsZTsgbWFya3VwIGluc2lkZSB0aGUgdGFibGUgY2VsbHMgaXMKLSAgICBtaW5pbWFsIHNvIHRoZSBtYXJrdXAgZm9yIHRoZSB0YWJsZSBpdHNlbGYgaXMgcmVhZGlseSBkaXNjZXJuYWJsZS4KLSAgICBIZXJlIGlzIHRoZSBtYXJrdXAgZm9yIHRoZSB0YWJsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotXGJlZ2lue3RhYmxlaWl9e2x8bH17ZXhjZXB0aW9ufXtDbGFzc317RGVzY3JpcHRpb259Ci0gIFxsaW5laWl7V2FybmluZ30KLSAgICAgICAgIHtUaGlzIGlzIHRoZSBiYXNlIGNsYXNzIG9mIGFsbCB3YXJuaW5nIGNhdGVnb3J5IGNsYXNzZXMuICBJdAotICAgICAgICAgIGlzIGEgc3ViY2xhc3Mgb2YgXGV4Y2VwdGlvbntFeGNlcHRpb259Ln0KLSAgXGxpbmVpaXtVc2VyV2FybmluZ30KLSAgICAgICAgIHtUaGUgZGVmYXVsdCBjYXRlZ29yeSBmb3IgXGZ1bmN0aW9ue3dhcm4oKX0ufQotICBcbGluZWlpe0RlcHJlY2F0aW9uV2FybmluZ30KLSAgICAgICAgIHtCYXNlIGNhdGVnb3J5IGZvciB3YXJuaW5ncyBhYm91dCBkZXByZWNhdGVkIGZlYXR1cmVzLn0KLSAgXGxpbmVpaXtTeW50YXhXYXJuaW5nfQotICAgICAgICAge0Jhc2UgY2F0ZWdvcnkgZm9yIHdhcm5pbmdzIGFib3V0IGR1YmlvdXMgc3ludGFjdGljCi0gICAgICAgICAgZmVhdHVyZXMufQotICBcbGluZWlpe1J1bnRpbWVXYXJuaW5nfQotICAgICAgICAge0Jhc2UgY2F0ZWdvcnkgZm9yIHdhcm5pbmdzIGFib3V0IGR1YmlvdXMgcnVudGltZSBmZWF0dXJlcy59Ci0gIFxsaW5laWl7RnV0dXJlV2FybmluZ30KLSAgICAgICAgIHtCYXNlIGNhdGVnb3J5IGZvciB3YXJuaW5ncyBhYm91dCBjb25zdHJ1Y3RzIHRoYXQgd2lsbCBjaGFuZ2UKLSAgICAgICAgIHNlbWFudGljYWxseSBpbiB0aGUgZnV0dXJlLn0KLVxlbmR7dGFibGVpaX0KLVxlbmR7dmVyYmF0aW19Ci0KLSAgICBIZXJlIGlzIHRoZSByZXN1bHRpbmcgdGFibGU6Ci0KLVxiZWdpbnt0YWJsZWlpfXtsfGx9e2V4Y2VwdGlvbn17Q2xhc3N9e0Rlc2NyaXB0aW9ufQotICBcbGluZWlpe1dhcm5pbmd9Ci0gICAgICAgICB7VGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBvZiBhbGwgd2FybmluZyBjYXRlZ29yeSBjbGFzc2VzLiAgSXQKLSAgICAgICAgICBpcyBhIHN1YmNsYXNzIG9mIFxleGNlcHRpb257RXhjZXB0aW9ufS59Ci0gIFxsaW5laWl7VXNlcldhcm5pbmd9Ci0gICAgICAgICB7VGhlIGRlZmF1bHQgY2F0ZWdvcnkgZm9yIFxmdW5jdGlvbnt3YXJuKCl9Ln0KLSAgXGxpbmVpaXtEZXByZWNhdGlvbldhcm5pbmd9Ci0gICAgICAgICB7QmFzZSBjYXRlZ29yeSBmb3Igd2FybmluZ3MgYWJvdXQgZGVwcmVjYXRlZCBmZWF0dXJlcy59Ci0gIFxsaW5laWl7U3ludGF4V2FybmluZ30KLSAgICAgICAgIHtCYXNlIGNhdGVnb3J5IGZvciB3YXJuaW5ncyBhYm91dCBkdWJpb3VzIHN5bnRhY3RpYwotICAgICAgICAgIGZlYXR1cmVzLn0KLSAgXGxpbmVpaXtSdW50aW1lV2FybmluZ30KLSAgICAgICAgIHtCYXNlIGNhdGVnb3J5IGZvciB3YXJuaW5ncyBhYm91dCBkdWJpb3VzIHJ1bnRpbWUgZmVhdHVyZXMufQotXGVuZHt0YWJsZWlpfQotCi0gICAgTm90ZSB0aGF0IHRoZSBjbGFzcyBuYW1lcyBhcmUgaW1wbGljaXRseSBtYXJrZWQgdXNpbmcgdGhlCi0gICAgXG1hY3Jve2V4Y2VwdGlvbn0gbWFjcm8sIHNpbmNlIHRoYXQgaXMgZ2l2ZW4gYXMgdGhlIFx2YXJ7Y29sMWZvbnR9Ci0gICAgdmFsdWUgZm9yIHRoZSBcZW52e3RhYmxlaWl9IGVudmlyb25tZW50LiAgVG8gY3JlYXRlIGEgdGFibGUgdXNpbmcKLSAgICBkaWZmZXJlbnQgbWFya3VwIGZvciB0aGUgZmlyc3QgY29sdW1uLCB1c2UgXGNvZGV7dGV4dHJtfSBmb3IgdGhlCi0gICAgXHZhcntjb2wxZm9udH0gdmFsdWUgYW5kIG1hcmsgZWFjaCBlbnRyeSBpbmRpdmlkdWFsbHkuCi0KLSAgICBUbyBhZGQgYSBob3Jpem9udGFsIGxpbmUgYmV0d2VlbiB2ZXJ0aWNhbCBzZWN0aW9ucyBvZiBhIHRhYmxlLCB1c2UKLSAgICB0aGUgc3RhbmRhcmQgXG1hY3Jve2hsaW5lfSBtYWNybyBiZXR3ZWVuIHRoZSByb3dzIHdoaWNoIHNob3VsZCBiZQotICAgIHNlcGFyYXRlZDoKLQotXGJlZ2lue3ZlcmJhdGltfQotXGJlZ2lue3RhYmxlaWl9e2x8bH17Y29uc3RhbnR9e0xhbmd1YWdlfXtBdWRpZW5jZX0KLSAgXGxpbmVpaXtBUEx9e01hc29jaGlzdHMufQotICBcbGluZWlpe0JBU0lDfXtGaXJzdC10aW1lIHByb2dyYW1tZXJzIG9uIFBDIGhhcmR3YXJlLn0KLSAgXGxpbmVpaXtDfXtcVU5JWHt9IFwmXCBMaW51eCBrZXJuZWwgZGV2ZWxvcGVycy59Ci0gICAgXGhsaW5lCi0gIFxsaW5laWl7UHl0aG9ufXtFdmVyeW9uZSF9Ci1cZW5ke3RhYmxlaWl9Ci1cZW5ke3ZlcmJhdGltfQotCi0gICAgTm90ZSB0aGF0IG5vdCBhbGwgcHJlc2VudGF0aW9uIGZvcm1hdHMgYXJlIGNhcGFibGUgb2YgZGlzcGxheWluZyBhCi0gICAgaG9yaXpvbnRhbCBydWxlIGluIHRoaXMgcG9zaXRpb24uICBUaGlzIGlzIGhvdyB0aGUgdGFibGUgbG9va3MgaW4KLSAgICB0aGUgZm9ybWF0IHlvdSdyZSByZWFkaW5nIG5vdzoKLQotXGJlZ2lue3RhYmxlaWl9e2x8bH17Y29uc3RhbnR9e0xhbmd1YWdlfXtBdWRpZW5jZX0KLSAgXGxpbmVpaXtBUEx9e01hc29jaGlzdHMufQotICBcbGluZWlpe0N9e1xVTklYe30gXCZcIExpbnV4IGtlcm5lbCBkZXZlbG9wZXJzLn0KLSAgXGxpbmVpaXtKYXZhU2NyaXB0fXtXZWIgZGV2ZWxvcGVycy59Ci0gICAgXGhsaW5lCi0gIFxsaW5laWl7UHl0aG9ufXtFdmVyeW9uZSF9Ci1cZW5ke3RhYmxlaWl9Ci0KLQotICBcc3Vic2VjdGlvbntSZWZlcmVuY2UgTGlzdCBNYXJrdXAgXGxhYmVse3JlZmVyZW5jZXN9fQotCi0gICAgTWFueSBzZWN0aW9ucyBpbmNsdWRlIGEgbGlzdCBvZiByZWZlcmVuY2VzIHRvIG1vZHVsZSBkb2N1bWVudGF0aW9uCi0gICAgb3IgZXh0ZXJuYWwgZG9jdW1lbnRzLiAgVGhlc2UgbGlzdHMgYXJlIGNyZWF0ZWQgdXNpbmcgdGhlCi0gICAgXGVudntzZWVhbHNvfSBvciBcZW52e3NlZWFsc28qfSBlbnZpcm9ubWVudHMuICBUaGVzZSBlbnZpcm9ubWVudHMKLSAgICBkZWZpbmUgc29tZSBhZGRpdGlvbmFsIG1hY3JvcyB0byBzdXBwb3J0IGNyZWF0aW5nIHJlZmVyZW5jZQotICAgIGVudHJpZXMgaW4gYSByZWFzb25hYmxlIG1hbm5lci4KLQotICAgIFRoZSBcZW52e3NlZWFsc299IGVudmlyb25tZW50IGlzIHR5cGljYWxseSBwbGFjZWQgaW4gYSBzZWN0aW9uCi0gICAganVzdCBiZWZvcmUgYW55IHN1Yi1zZWN0aW9ucy4gIFRoaXMgaXMgZG9uZSB0byBlbnN1cmUgdGhhdAotICAgIHJlZmVyZW5jZSBsaW5rcyByZWxhdGVkIHRvIHRoZSBzZWN0aW9uIGFyZSBub3QgaGlkZGVuIGluIGEKLSAgICBzdWJzZWN0aW9uIGluIHRoZSBoeXBlcnRleHQgcmVuZGl0aW9ucyBvZiB0aGUgZG9jdW1lbnRhdGlvbi4gIEZvcgotICAgIHRoZSBIVE1MIG91dHB1dCwgaXQgaXMgc2hvd24gYXMgYSBgYHNpZGUgYmFyLCcnIGJveGVkIG9mZiBmcm9tIHRoZQotICAgIG1haW4gZmxvdyBvZiB0aGUgdGV4dC4gIFRoZSBcZW52e3NlZWFsc28qfSBlbnZpcm9ubWVudCBpcwotICAgIGRpZmZlcmVudCBpbiB0aGF0IGl0IHNob3VsZCBiZSB1c2VkIHdoZW4gYSBsaXN0IG9mIHJlZmVyZW5jZXMgaXMKLSAgICBiZWluZyBwcmVzZW50ZWQgYXMgcGFydCBvZiB0aGUgcHJpbWFyeSBjb250ZW50OyBpdCBpcyBub3QKLSAgICBzcGVjaWFsbHkgc2V0IG9mZiBmcm9tIHRoZSB0ZXh0LgotCi0gICAgXGJlZ2lue2VudmRlc2N9e3NlZWFsc299e30KLSAgICAgIFRoaXMgZW52aXJvbm1lbnQgY3JlYXRlcyBhIGBgU2VlIGFsc286JycgaGVhZGluZyBhbmQgZGVmaW5lcyB0aGUKLSAgICAgIG1hcmt1cCB1c2VkIHRvIGRlc2NyaWJlIGluZGl2aWR1YWwgcmVmZXJlbmNlcy4KLSAgICBcZW5ke2VudmRlc2N9Ci0KLSAgICBcYmVnaW57ZW52ZGVzY317c2VlYWxzbyp9e30KLSAgICAgIFRoaXMgZW52aXJvbm1lbnQgaXMgdXNlZCB0byBjcmVhdGUgYSBsaXN0IG9mIHJlZmVyZW5jZXMgd2hpY2gKLSAgICAgIGZvcm0gcGFydCBvZiB0aGUgbWFpbiBjb250ZW50LiAgSXQgaXMgbm90IGdpdmVuIGEgc3BlY2lhbAotICAgICAgaGVhZGVyIGFuZCBpcyBub3Qgc2V0IG9mZiBmcm9tIHRoZSBtYWluIGZsb3cgb2YgdGhlIHRleHQuICBJdAotICAgICAgcHJvdmlkZXMgdGhlIHNhbWUgYWRkaXRpb25hbCBtYXJrdXAgdXNlZCB0byBkZXNjcmliZSBpbmRpdmlkdWFsCi0gICAgICByZWZlcmVuY2VzLgotICAgIFxlbmR7ZW52ZGVzY30KLQotICAgIEZvciBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBcdmFye3doeX0gc2hvdWxkIGJlIG9uZSBvciBtb3JlCi0gICAgY29tcGxldGUgc2VudGVuY2VzLCBzdGFydGluZyB3aXRoIGEgY2FwaXRhbCBsZXR0ZXIgKHVubGVzcyBpdAotICAgIHN0YXJ0cyB3aXRoIGFuIGlkZW50aWZpZXIsIHdoaWNoIHNob3VsZCBub3QgYmUgbW9kaWZpZWQpLCBhbmQKLSAgICBlbmRpbmcgd2l0aCB0aGUgYXBwcm9wcmlhdGUgcHVuY3R1YXRpb24uCi0KLSAgICBUaGVzZSBtYWNyb3MgYXJlIG9ubHkgZGVmaW5lZCB3aXRoaW4gdGhlIGNvbnRlbnQgb2YgdGhlCi0gICAgXGVudntzZWVhbHNvfSBhbmQgXGVudntzZWVhbHNvKn0gZW52aXJvbm1lbnRzLgotCi0gICAgXGJlZ2lue21hY3JvZGVzY317c2VlbGlua317XHB7dXJsfVxwe2xpbmt0ZXh0fVxwe3doeX19Ci0gICAgICBSZWZlcmVuY2VzIHRvIHNwZWNpZmljIG9uLWxpbmUgcmVzb3VyY2VzIHNob3VsZCBiZSBnaXZlbiB1c2luZwotICAgICAgdGhlIFxtYWNyb3tzZWVsaW5rfSBtYWNybyBpZiB0aGV5IGRvbid0IGhhdmUgYSBtZWFuaW5nZnVsIHRpdGxlCi0gICAgICBidXQgdGhlcmUgaXMgc29tZSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB3aGF0J3MgYXQgdGhlIGVuZCBvZiB0aGUKLSAgICAgIGxpbmsuICBPbmxpbmUgZG9jdW1lbnRzIHdoaWNoIGhhdmUgaWRlbnRpZmlhYmxlIHRpdGxlcyBzaG91bGQgYmUKLSAgICAgIHJlZmVyZW5jZWQgdXNpbmcgdGhlIFxtYWNyb3tzZWV0aXRsZX0gbWFjcm8sIHVzaW5nIHRoZSBvcHRpb25hbAotICAgICAgcGFyYW1ldGVyIHRvIHRoYXQgbWFjcm8gdG8gcHJvdmlkZSB0aGUgVVJMLgotICAgIFxlbmR7bWFjcm9kZXNjfQotCi0gICAgXGJlZ2lue21hY3JvZGVzY317c2VlbW9kdWxlfXtcb3B7a2V5fVxwe25hbWV9XHB7d2h5fX0KLSAgICAgIFJlZmVyIHRvIGFub3RoZXIgbW9kdWxlLiAgXHZhcnt3aHl9IHNob3VsZCBiZSBhIGJyaWVmCi0gICAgICBleHBsYW5hdGlvbiBvZiB3aHkgdGhlIHJlZmVyZW5jZSBtYXkgYmUgaW50ZXJlc3RpbmcuICBUaGUgbW9kdWxlCi0gICAgICBuYW1lIGlzIGdpdmVuIGluIFx2YXJ7bmFtZX0sIHdpdGggdGhlIGxpbmsga2V5IGdpdmVuIGluCi0gICAgICBcdmFye2tleX0gaWYgbmVjZXNzYXJ5LiAgSW4gdGhlIEhUTUwgYW5kIFBERiBjb252ZXJzaW9ucywgdGhlCi0gICAgICBtb2R1bGUgbmFtZSB3aWxsIGJlIGEgaHlwZXJsaW5rIHRvIHRoZSByZWZlcnJlZC10byBtb2R1bGUuCi0gICAgICBcbm90ZXtUaGUgbW9kdWxlIG11c3QgYmUgZG9jdW1lbnRlZCBpbiB0aGUgc2FtZQotICAgICAgZG9jdW1lbnQgKHRoZSBjb3JyZXNwb25kaW5nIFxtYWNyb3tkZWNsYXJlbW9kdWxlfSBpcyByZXF1aXJlZCkufQotICAgIFxlbmR7bWFjcm9kZXNjfQotCi0gICAgXGJlZ2lue21hY3JvZGVzY317c2VlcGVwfXtccHtudW1iZXJ9XHB7dGl0bGV9XHB7d2h5fX0KLSAgICAgIFJlZmVyIHRvIGFuIFB5dGhvbiBFbmhhbmNlbWVudCBQcm9wb3NhbCAoUEVQKS4gIFx2YXJ7bnVtYmVyfQotICAgICAgc2hvdWxkIGJlIHRoZSBvZmZpY2lhbCBudW1iZXIgYXNzaWduZWQgYnkgdGhlIFBFUCBFZGl0b3IsCi0gICAgICBcdmFye3RpdGxlfSBzaG91bGQgYmUgdGhlIGh1bWFuLXJlYWRhYmxlIHRpdGxlIG9mIHRoZSBQRVAgYXMKLSAgICAgIGZvdW5kIGluIHRoZSBvZmZpY2lhbCBjb3B5IG9mIHRoZSBkb2N1bWVudCwgYW5kIFx2YXJ7d2h5fSBzaG91bGQKLSAgICAgIGV4cGxhaW4gd2hhdCdzIGludGVyZXN0aW5nIGFib3V0IHRoZSBQRVAuICBUaGlzIHNob3VsZCBiZSB1c2VkCi0gICAgICB0byByZWZlciB0aGUgcmVhZGVyIHRvIFBFUHMgd2hpY2ggc3BlY2lmeSBpbnRlcmZhY2VzIG9yIGxhbmd1YWdlCi0gICAgICBmZWF0dXJlcyByZWxldmFudCB0byB0aGUgbWF0ZXJpYWwgaW4gdGhlIGFubm90YXRlZCBzZWN0aW9uIG9mIHRoZQotICAgICAgZG9jdW1lbnRhdGlvbi4KLSAgICBcZW5ke21hY3JvZGVzY30KLQotICAgIFxiZWdpbnttYWNyb2Rlc2N9e3NlZXJmY317XHB7bnVtYmVyfVxwe3RpdGxlfVxwe3doeX19Ci0gICAgICBSZWZlciB0byBhbiBJRVRGIFJlcXVlc3QgZm9yIENvbW1lbnRzIChSRkMpLiAgT3RoZXJ3aXNlIHZlcnkKLSAgICAgIHNpbWlsYXIgdG8gXG1hY3Jve3NlZXBlcH0uICBUaGlzIHNob3VsZCBiZSB1c2VkCi0gICAgICB0byByZWZlciB0aGUgcmVhZGVyIHRvIFBFUHMgd2hpY2ggc3BlY2lmeSBwcm90b2NvbHMgb3IgZGF0YQotICAgICAgZm9ybWF0cyByZWxldmFudCB0byB0aGUgbWF0ZXJpYWwgaW4gdGhlIGFubm90YXRlZCBzZWN0aW9uIG9mIHRoZQotICAgICAgZG9jdW1lbnRhdGlvbi4KLSAgICBcZW5ke21hY3JvZGVzY30KLQotICAgIFxiZWdpbnttYWNyb2Rlc2N9e3NlZXRleHR9e1xwe3RleHR9fQotICAgICAgQWRkIGFyYml0cmFyeSB0ZXh0IFx2YXJ7dGV4dH0gdG8gdGhlIGBgU2VlIGFsc286JycgbGlzdC4gIFRoaXMKLSAgICAgIGNhbiBiZSB1c2VkIHRvIHJlZmVyIHRvIG9mZi1saW5lIG1hdGVyaWFscyBvciBvbi1saW5lIG1hdGVyaWFscwotICAgICAgdXNpbmcgdGhlIFxtYWNyb3t1cmx9IG1hY3JvLiAgVGhpcyBzaG91bGQgY29uc2lzdCBvZiBvbmUgb3IgbW9yZQotICAgICAgY29tcGxldGUgc2VudGVuY2VzLgotICAgIFxlbmR7bWFjcm9kZXNjfQotCi0gICAgXGJlZ2lue21hY3JvZGVzY317c2VldGl0bGV9e1xvcHt1cmx9XHB7dGl0bGV9XHB7d2h5fX0KLSAgICAgIEFkZCBhIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCBkb2N1bWVudCBuYW1lZCBcdmFye3RpdGxlfS4gIElmCi0gICAgICBcdmFye3VybH0gaXMgZ2l2ZW4sIHRoZSB0aXRsZSBpcyBtYWRlIGEgaHlwZXJsaW5rIGluIHRoZSBIVE1MCi0gICAgICB2ZXJzaW9uIG9mIHRoZSBkb2N1bWVudGF0aW9uLCBhbmQgZGlzcGxheWVkIGJlbG93IHRoZSB0aXRsZSBpbgotICAgICAgdGhlIHR5cGVzZXQgdmVyc2lvbnMgb2YgdGhlIGRvY3VtZW50YXRpb24uCi0gICAgXGVuZHttYWNyb2Rlc2N9Ci0KLSAgICBcYmVnaW57bWFjcm9kZXNjfXtzZWV1cmx9e1xwe3VybH1ccHt3aHl9fQotICAgICAgUmVmZXJlbmNlcyB0byBzcGVjaWZpYyBvbi1saW5lIHJlc291cmNlcyBzaG91bGQgYmUgZ2l2ZW4gdXNpbmcKLSAgICAgIHRoZSBcbWFjcm97c2VldXJsfSBtYWNybyBpZiB0aGV5IGRvbid0IGhhdmUgYSBtZWFuaW5nZnVsIHRpdGxlLgotICAgICAgT25saW5lIGRvY3VtZW50cyB3aGljaCBoYXZlIGlkZW50aWZpYWJsZSB0aXRsZXMgc2hvdWxkIGJlCi0gICAgICByZWZlcmVuY2VkIHVzaW5nIHRoZSBcbWFjcm97c2VldGl0bGV9IG1hY3JvLCB1c2luZyB0aGUgb3B0aW9uYWwKLSAgICAgIHBhcmFtZXRlciB0byB0aGF0IG1hY3JvIHRvIHByb3ZpZGUgdGhlIFVSTC4KLSAgICBcZW5ke21hY3JvZGVzY30KLQotCi0gIFxzdWJzZWN0aW9ue0luZGV4LWdlbmVyYXRpbmcgTWFya3VwIFxsYWJlbHtpbmRleGluZ319Ci0KLSAgICBFZmZlY3RpdmUgaW5kZXggZ2VuZXJhdGlvbiBmb3IgdGVjaG5pY2FsIGRvY3VtZW50cyBjYW4gYmUgdmVyeQotICAgIGRpZmZpY3VsdCwgZXNwZWNpYWxseSBmb3Igc29tZW9uZSBmYW1pbGlhciB3aXRoIHRoZSB0b3BpYyBidXQgbm90Ci0gICAgdGhlIGNyZWF0aW9uIG9mIGluZGV4ZXMuICBNdWNoIG9mIHRoZSBkaWZmaWN1bHR5IGFyaXNlcyBpbiB0aGUKLSAgICBhcmVhIG9mIHRlcm1pbm9sb2d5OiBpbmNsdWRpbmcgdGhlIHRlcm1zIGFuIGV4cGVydCB3b3VsZCB1c2UgZm9yIGEKLSAgICBjb25jZXB0IGlzIG5vdCBzdWZmaWNpZW50LiAgQ29taW5nIHVwIHdpdGggdGhlIHRlcm1zIHRoYXQgYSBub3ZpY2UKLSAgICB3b3VsZCBsb29rIHVwIGlzIGZhaXJseSBkaWZmaWN1bHQgZm9yIGFuIGF1dGhvciB3aG8sIHR5cGljYWxseSwgaXMKLSAgICBhbiBleHBlcnQgaW4gdGhlIGFyZWEgc2hlIGlzIHdyaXRpbmcgb24uCi0KLSAgICBUaGUgdHJ1bHkgZGlmZmljdWx0IGFzcGVjdHMgb2YgaW5kZXggZ2VuZXJhdGlvbiBhcmUgbm90IGFyZWFzIHdpdGgKLSAgICB3aGljaCB0aGUgZG9jdW1lbnRhdGlvbiB0b29scyBjYW4gaGVscC4gIEhvd2V2ZXIsIGVhc2UKLSAgICBvZiBwcm9kdWNpbmcgdGhlIGluZGV4IG9uY2UgY29udGVudCBkZWNpc2lvbnMgYXJlIG1hZGUgaXMgd2l0aGluCi0gICAgdGhlIHNjb3BlIG9mIHRoZSB0b29scy4gIE1hcmt1cCBpcyBwcm92aWRlZCB3aGljaCB0aGUgcHJvY2Vzc2luZwotICAgIHNvZnR3YXJlIGlzIGFibGUgdG8gdXNlIHRvIGdlbmVyYXRlIGEgdmFyaWV0eSBvZiBraW5kcyBvZiBpbmRleAotICAgIGVudHJ5IHdpdGggbWluaW1hbCBlZmZvcnQuICBBZGRpdGlvbmFsbHksIG1hbnkgb2YgdGhlIGVudmlyb25tZW50cwotICAgIGRlc2NyaWJlZCBpbiBzZWN0aW9uIFxyZWZ7aW5mby11bml0c30sIGBgSW5mb3JtYXRpb24gVW5pdHMsJycgd2lsbAotICAgIGdlbmVyYXRlIGFwcHJvcHJpYXRlIGVudHJpZXMgaW50byB0aGUgZ2VuZXJhbCBhbmQgbW9kdWxlIGluZGV4ZXMuCi0KLSAgICBUaGUgZm9sbG93aW5nIG1hY3JvIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGdlbmVyYXRpb24gb2YgaW5kZXgKLSAgICBkYXRhLCBhbmQgc2hvdWxkIGJlIHVzZWQgaW4gdGhlIGRvY3VtZW50IHByZWFtYmxlOgotCi0gICAgXGJlZ2lue21hY3JvZGVzY317bWFrZW1vZGluZGV4fXt9Ci0gICAgICBUaGlzIHNob3VsZCBiZSB1c2VkIGluIHRoZSBkb2N1bWVudCBwcmVhbWJsZSBpZiBhIGBgTW9kdWxlCi0gICAgICBJbmRleCcnIGlzIGRlc2lyZWQgZm9yIGEgZG9jdW1lbnQgY29udGFpbmluZyByZWZlcmVuY2UgbWF0ZXJpYWwKLSAgICAgIG9uIG1hbnkgbW9kdWxlcy4gIFRoaXMgY2F1c2VzIGEgZGF0YSBmaWxlCi0gICAgICBcY29kZXtsaWJcdmFye2pvYm5hbWV9LmlkeH0gdG8gYmUgY3JlYXRlZCBmcm9tIHRoZQotICAgICAgXG1hY3Jve2RlY2xhcmVtb2R1bGV9IG1hY3Jvcy4gIFRoaXMgZmlsZSBjYW4gYmUgcHJvY2Vzc2VkIGJ5IHRoZQotICAgICAgXHByb2dyYW17bWFrZWluZGV4fSBwcm9ncmFtIHRvIGdlbmVyYXRlIGEgZmlsZSB3aGljaCBjYW4gYmUKLSAgICAgIFxtYWNyb3tpbnB1dH0gaW50byB0aGUgZG9jdW1lbnQgYXQgdGhlIGRlc2lyZWQgbG9jYXRpb24gb2YgdGhlCi0gICAgICBtb2R1bGUgaW5kZXguCi0gICAgXGVuZHttYWNyb2Rlc2N9Ci0KLSAgICBUaGVyZSBhcmUgYSBudW1iZXIgb2YgbWFjcm9zIHRoYXQgYXJlIHVzZWZ1bCBmb3IgYWRkaW5nIGluZGV4Ci0gICAgZW50cmllcyBmb3IgcGFydGljdWxhciBjb25jZXB0cywgbWFueSBvZiB3aGljaCBhcmUgc3BlY2lmaWMgdG8KLSAgICBwcm9ncmFtbWluZyBsYW5ndWFnZXMgb3IgZXZlbiBQeXRob24uCi0KLSAgICBcYmVnaW57bWFjcm9kZXNjfXtiaWZ1bmNpbmRleH17XHB7bmFtZX19Ci0gICAgICBBZGQgYW4gaW5kZXggZW50cnkgcmVmZXJyaW5nIHRvIGEgYnVpbHQtaW4gZnVuY3Rpb24gbmFtZWQKLSAgICAgIFx2YXJ7bmFtZX07IHBhcmVudGhlc2VzIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgYWZ0ZXIKLSAgICAgIFx2YXJ7bmFtZX0uCi0gICAgXGVuZHttYWNyb2Rlc2N9Ci0KLSAgICBcYmVnaW57bWFjcm9kZXNjfXtleGluZGV4fXtccHtleGNlcHRpb259fQotICAgICAgQWRkIGEgcmVmZXJlbmNlIHRvIGFuIGV4Y2VwdGlvbiBuYW1lZCBcdmFye2V4Y2VwdGlvbn0uICBUaGUKLSAgICAgIGV4Y2VwdGlvbiBzaG91bGQgYmUgY2xhc3MtYmFzZWQuCi0gICAgXGVuZHttYWNyb2Rlc2N9Ci0KLSAgICBcYmVnaW57bWFjcm9kZXNjfXtrd2luZGV4fXtccHtrZXl3b3JkfX0KLSAgICAgIEFkZCBhIHJlZmVyZW5jZSB0byBhIGxhbmd1YWdlIGtleXdvcmQgKG5vdCBhIGtleXdvcmQgcGFyYW1ldGVyCi0gICAgICBpbiBhIGZ1bmN0aW9uIG9yIG1ldGhvZCBjYWxsKS4KLSAgICBcZW5ke21hY3JvZGVzY30KLQotICAgIFxiZWdpbnttYWNyb2Rlc2N9e29iaW5kZXh9e1xwe29iamVjdCB0eXBlfX0KLSAgICAgIEFkZCBhbiBpbmRleCBlbnRyeSBmb3IgYSBidWlsdC1pbiBvYmplY3QgdHlwZS4KLSAgICBcZW5ke21hY3JvZGVzY30KLQotICAgIFxiZWdpbnttYWNyb2Rlc2N9e29waW5kZXh9e1xwe29wZXJhdG9yfX0KLSAgICAgIEFkZCBhIHJlZmVyZW5jZSB0byBhbiBvcGVyYXRvciwgc3VjaCBhcyBcc2FtcHsrfS4KLSAgICBcZW5ke21hY3JvZGVzY30KLQotICAgIFxiZWdpbnttYWNyb2Rlc2N9e3JlZm1vZGluZGV4fXtcb3B7a2V5fVxwe21vZHVsZX19Ci0gICAgICBBZGQgYW4gaW5kZXggZW50cnkgZm9yIG1vZHVsZSBcdmFye21vZHVsZX07IGlmIFx2YXJ7bW9kdWxlfQotICAgICAgY29udGFpbnMgYW4gdW5kZXJzY29yZSwgdGhlIG9wdGlvbmFsIHBhcmFtZXRlciBcdmFye2tleX0gc2hvdWxkCi0gICAgICBiZSBwcm92aWRlZCBhcyB0aGUgc2FtZSBzdHJpbmcgd2l0aCB1bmRlcnNjb3JlcyByZW1vdmVkLiAgQW4KLSAgICAgIGluZGV4IGVudHJ5IGBgXHZhcnttb2R1bGV9IChtb2R1bGUpJycgd2lsbCBiZSBnZW5lcmF0ZWQuICBUaGlzCi0gICAgICBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggbm9uLXN0YW5kYXJkIG1vZHVsZXMgaW1wbGVtZW50ZWQgaW4KLSAgICAgIFB5dGhvbi4KLSAgICBcZW5ke21hY3JvZGVzY30KLQotICAgIFxiZWdpbnttYWNyb2Rlc2N9e3JlZmV4bW9kaW5kZXh9e1xvcHtrZXl9XHB7bW9kdWxlfX0KLSAgICAgIEFzIGZvciBcbWFjcm97cmVmbW9kaW5kZXh9LCBidXQgdGhlIGluZGV4IGVudHJ5IHdpbGwgYmUKLSAgICAgIGBgXHZhcnttb2R1bGV9IChleHRlbnNpb24gbW9kdWxlKS4nJyAgVGhpcyBpcyBpbnRlbmRlZCBmb3IgdXNlCi0gICAgICB3aXRoIG5vbi1zdGFuZGFyZCBtb2R1bGVzIG5vdCBpbXBsZW1lbnRlZCBpbiBQeXRob24uCi0gICAgXGVuZHttYWNyb2Rlc2N9Ci0KLSAgICBcYmVnaW57bWFjcm9kZXNjfXtyZWZiaW1vZGluZGV4fXtcb3B7a2V5fVxwe21vZHVsZX19Ci0gICAgICBBcyBmb3IgXG1hY3Jve3JlZm1vZGluZGV4fSwgYnV0IHRoZSBpbmRleCBlbnRyeSB3aWxsIGJlCi0gICAgICBgYFx2YXJ7bW9kdWxlfSAoYnVpbHQtaW4gbW9kdWxlKS4nJyAgVGhpcyBpcyBpbnRlbmRlZCBmb3IgdXNlCi0gICAgICB3aXRoIHN0YW5kYXJkIG1vZHVsZXMgbm90IGltcGxlbWVudGVkIGluIFB5dGhvbi4KLSAgICBcZW5ke21hY3JvZGVzY30KLQotICAgIFxiZWdpbnttYWNyb2Rlc2N9e3JlZnN0bW9kaW5kZXh9e1xvcHtrZXl9XHB7bW9kdWxlfX0KLSAgICAgIEFzIGZvciBcbWFjcm97cmVmbW9kaW5kZXh9LCBidXQgdGhlIGluZGV4IGVudHJ5IHdpbGwgYmUKLSAgICAgIGBgXHZhcnttb2R1bGV9IChzdGFuZGFyZCBtb2R1bGUpLicnICBUaGlzIGlzIGludGVuZGVkIGZvciB1c2UKLSAgICAgIHdpdGggc3RhbmRhcmQgbW9kdWxlcyBpbXBsZW1lbnRlZCBpbiBQeXRob24uCi0gICAgXGVuZHttYWNyb2Rlc2N9Ci0KLSAgICBcYmVnaW57bWFjcm9kZXNjfXtzdGluZGV4fXtccHtzdGF0ZW1lbnR9fQotICAgICAgQWRkIGFuIGluZGV4IGVudHJ5IGZvciBhIHN0YXRlbWVudCB0eXBlLCBzdWNoIGFzIFxrZXl3b3Jke3ByaW50fQotICAgICAgb3IgXGtleXdvcmR7dHJ5fS9ca2V5d29yZHtmaW5hbGx5fS4KLQotICAgICAgWFhYIE5lZWQgYmV0dGVyIGV4YW1wbGVzIG9mIGRpZmZlcmVuY2UgZnJvbSBcbWFjcm97a3dpbmRleH0uCi0gICAgXGVuZHttYWNyb2Rlc2N9Ci0KLQotICAgIEFkZGl0aW9uYWwgbWFjcm9zIGFyZSBwcm92aWRlZCB3aGljaCBhcmUgdXNlZnVsIGZvciBjb252ZW5pZW50bHkKLSAgICBjcmVhdGluZyBnZW5lcmFsIGluZGV4IGVudHJpZXMgd2hpY2ggc2hvdWxkIGFwcGVhciBhdCBtYW55IHBsYWNlcwotICAgIGluIHRoZSBpbmRleCBieSByb3RhdGluZyBhIGxpc3Qgb2Ygd29yZHMuICBUaGVzZSBhcmUgc2ltcGxlIG1hY3JvcwotICAgIHRoYXQgc2ltcGx5IHVzZSBcbWFjcm97aW5kZXh9IHRvIGJ1aWxkIHNvbWUgbnVtYmVyIG9mIGluZGV4Ci0gICAgZW50cmllcy4gIEluZGV4IGVudHJpZXMgYnVpbGQgdXNpbmcgdGhlc2UgbWFjcm9zIGNvbnRhaW4gYm90aAotICAgIHByaW1hcnkgYW5kIHNlY29uZGFyeSB0ZXh0LgotCi0gICAgXGJlZ2lue21hY3JvZGVzY317aW5kZXhpaX17XHB7d29yZDF9XHB7d29yZDJ9fQotICAgICAgQnVpbGQgdHdvIGluZGV4IGVudHJpZXMuICBUaGlzIGlzIGV4YWN0bHkgZXF1aXZhbGVudCB0byB1c2luZwotICAgICAgXGNvZGV7XGUgaW5kZXhce1x2YXJ7d29yZDF9IVx2YXJ7d29yZDJ9XH19IGFuZAotICAgICAgXGNvZGV7XGUgaW5kZXhce1x2YXJ7d29yZDJ9IVx2YXJ7d29yZDF9XH19LgotICAgIFxlbmR7bWFjcm9kZXNjfQotCi0gICAgXGJlZ2lue21hY3JvZGVzY317aW5kZXhpaWl9e1xwe3dvcmQxfVxwe3dvcmQyfVxwe3dvcmQzfX0KLSAgICAgIEJ1aWxkIHRocmVlIGluZGV4IGVudHJpZXMuICBUaGlzIGlzIGV4YWN0bHkgZXF1aXZhbGVudCB0byB1c2luZwotICAgICAgXGNvZGV7XGUgaW5kZXhce1x2YXJ7d29yZDF9IVx2YXJ7d29yZDJ9IFx2YXJ7d29yZDN9XH19LAotICAgICAgXGNvZGV7XGUgaW5kZXhce1x2YXJ7d29yZDJ9IVx2YXJ7d29yZDN9LCBcdmFye3dvcmQxfVx9fSwgYW5kCi0gICAgICBcY29kZXtcZSBpbmRleFx7XHZhcnt3b3JkM30hXHZhcnt3b3JkMX0gXHZhcnt3b3JkMn1cfX0uCi0gICAgXGVuZHttYWNyb2Rlc2N9Ci0KLSAgICBcYmVnaW57bWFjcm9kZXNjfXtpbmRleGl2fXtccHt3b3JkMX1ccHt3b3JkMn1ccHt3b3JkM31ccHt3b3JkNH19Ci0gICAgICBCdWlsZCBmb3VyIGluZGV4IGVudHJpZXMuICBUaGlzIGlzIGV4YWN0bHkgZXF1aXZhbGVudCB0byB1c2luZwotICAgICAgXGNvZGV7XGUgaW5kZXhce1x2YXJ7d29yZDF9IVx2YXJ7d29yZDJ9IFx2YXJ7d29yZDN9IFx2YXJ7d29yZDR9XH19LAotICAgICAgXGNvZGV7XGUgaW5kZXhce1x2YXJ7d29yZDJ9IVx2YXJ7d29yZDN9IFx2YXJ7d29yZDR9LCBcdmFye3dvcmQxfVx9fSwKLSAgICAgIFxjb2Rle1xlIGluZGV4XHtcdmFye3dvcmQzfSFcdmFye3dvcmQ0fSwgXHZhcnt3b3JkMX0gXHZhcnt3b3JkMn1cfX0sCi0gICAgICBhbmQKLSAgICAgIFxjb2Rle1xlIGluZGV4XHtcdmFye3dvcmQ0fSFcdmFye3dvcmQxfSBcdmFye3dvcmQyfSBcdmFye3dvcmQzfVx9fS4KLSAgICBcZW5ke21hY3JvZGVzY30KLQotICBcc3Vic2VjdGlvbntHcmFtbWFyIFByb2R1Y3Rpb24gRGlzcGxheXMgXGxhYmVse2dyYW1tYXItZGlzcGxheXN9fQotCi0gICAgU3BlY2lhbCBtYXJrdXAgaXMgYXZhaWxhYmxlIGZvciBkaXNwbGF5aW5nIHRoZSBwcm9kdWN0aW9ucyBvZiBhCi0gICAgZm9ybWFsIGdyYW1tYXIuICBUaGUgbWFya3VwIGlzIHNpbXBsZSBhbmQgZG9lcyBub3QgYXR0ZW1wdCB0bwotICAgIG1vZGVsIGFsbCBhc3BlY3RzIG9mIEJORiAob3IgYW55IGRlcml2ZWQgZm9ybXMpLCBidXQgcHJvdmlkZXMKLSAgICBlbm91Z2ggdG8gYWxsb3cgY29udGV4dC1mcmVlIGdyYW1tYXJzIHRvIGJlIGRpc3BsYXllZCBpbiBhIHdheQotICAgIHRoYXQgY2F1c2VzIHVzZXMgb2YgYSBzeW1ib2wgdG8gYmUgcmVuZGVyZWQgYXMgaHlwZXJsaW5rcyB0byB0aGUKLSAgICBkZWZpbml0aW9uIG9mIHRoZSBzeW1ib2wuICBUaGVyZSBpcyBvbmUgZW52aXJvbm1lbnQgYW5kIGEgcGFpciBvZgotICAgIG1hY3JvczoKLQotICAgIFxiZWdpbntlbnZkZXNjfXtwcm9kdWN0aW9ubGlzdH17XG9we2xhbmd1YWdlfX0KLSAgICAgIFRoaXMgZW52aXJvbm1lbnQgaXMgdXNlZCB0byBlbmNsb3NlIGEgZ3JvdXAgb2YgcHJvZHVjdGlvbnMuICBUaGUKLSAgICAgIHR3byBtYWNyb3MgYXJlIG9ubHkgZGVmaW5lZCB3aXRoaW4gdGhpcyBlbnZpcm9ubWVudC4gIElmIGEKLSAgICAgIGRvY3VtZW50IGRlc2NyaWJlcyBtb3JlIHRoYW4gb25lIGxhbmd1YWdlLCB0aGUgb3B0aW9uYWwgcGFyYW1ldGVyCi0gICAgICBcdmFye2xhbmd1YWdlfSBzaG91bGQgYmUgdXNlZCB0byBkaXN0aW5ndWlzaCBwcm9kdWN0aW9ucyBiZXR3ZWVuCi0gICAgICBsYW5ndWFnZXMuICBUaGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciBzaG91bGQgYmUgYSBzaG9ydCBuYW1lCi0gICAgICB0aGF0IGNhbiBiZSB1c2VkIGFzIHBhcnQgb2YgYSBmaWxlbmFtZTsgY29sb25zIG9yIG90aGVyCi0gICAgICBjaGFyYWN0ZXJzIHRoYXQgY2FuJ3QgYmUgdXNlZCBpbiBmaWxlbmFtZSBhY3Jvc3MgcGxhdGZvcm1zCi0gICAgICBzaG91bGQgYmUgaW5jbHVkZWQuCi0gICAgXGVuZHtlbnZkZXNjfQotCi0gICAgXGJlZ2lue21hY3JvZGVzY317cHJvZHVjdGlvbn17XHB7bmFtZX1ccHtkZWZpbml0aW9ufX0KLSAgICAgIEEgcHJvZHVjdGlvbiBydWxlIGluIHRoZSBncmFtbWFyLiAgVGhlIHJ1bGUgZGVmaW5lcyB0aGUgc3ltYm9sCi0gICAgICBcdmFye25hbWV9IHRvIGJlIFx2YXJ7ZGVmaW5pdGlvbn0uICBcdmFye25hbWV9IHNob3VsZCBub3QKLSAgICAgIGNvbnRhaW4gYW55IG1hcmt1cCwgYW5kIHRoZSB1c2Ugb2YgaHlwaGVucyBpbiBhIGRvY3VtZW50IHdoaWNoCi0gICAgICBzdXBwb3J0cyBtb3JlIHRoYW4gb25lIGdyYW1tYXIgaXMgdW5kZWZpbmVkLiAgXHZhcntkZWZpbml0aW9ufQotICAgICAgbWF5IGNvbnRhaW4gXG1hY3Jve3Rva2VufSBtYWNyb3MgYW5kIGFueSBhZGRpdGlvbmFsIGNvbnRlbnQKLSAgICAgIG5lZWRlZCB0byBkZXNjcmliZSB0aGUgZ3JhbW1hdGljYWwgbW9kZWwgb2YgXHZhcntzeW1ib2x9LiAgT25seQotICAgICAgb25lIFxtYWNyb3twcm9kdWN0aW9ufSBtYXkgYmUgdXNlZCB0byBkZWZpbmUgYSBzeW1ib2wgLS0tCi0gICAgICBtdWx0aXBsZSBkZWZpbml0aW9ucyBhcmUgbm90IGFsbG93ZWQuCi0gICAgXGVuZHttYWNyb2Rlc2N9Ci0KLSAgICBcYmVnaW57bWFjcm9kZXNjfXt0b2tlbn17XHB7bmFtZX19Ci0gICAgICBUaGUgbmFtZSBvZiBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgXG1hY3Jve3Byb2R1Y3Rpb259IG1hY3JvLCB1c2VkCi0gICAgICBpbiB0aGUgXHZhcntkZWZpbml0aW9ufSBvZiBhIHN5bWJvbC4gIFdoZXJlIHBvc3NpYmxlLCB0aGlzIHdpbGwKLSAgICAgIGJlIHJlbmRlcmVkIGFzIGEgaHlwZXJsaW5rIHRvIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBzeW1ib2wKLSAgICAgIFx2YXJ7bmFtZX0uCi0gICAgXGVuZHttYWNyb2Rlc2N9Ci0KLSAgICBOb3RlIHRoYXQgdGhlIGVudGlyZSBncmFtbWFyIGRvZXMgbm90IG5lZWQgdG8gYmUgZGVmaW5lZCBpbiBhCi0gICAgc2luZ2xlIFxlbnZ7cHJvZHVjdGlvbmxpc3R9IGVudmlyb25tZW50OyBhbnkgbnVtYmVyIG9mCi0gICAgZ3JvdXBpbmdzIG1heSBiZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBncmFtbWFyLiAgRXZlcnkgdXNlIG9mIHRoZQotICAgIFxtYWNyb3t0b2tlbn0gbXVzdCBjb3JyZXNwb25kIHRvIGEgXG1hY3Jve3Byb2R1Y3Rpb259LgotCi0gICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIHRha2VuIGZyb20gdGhlCi0gICAgXGNpdGV0aXRsZVsuLi9yZWYvaWRlbnRpZmllcnMuaHRtbF17UHl0aG9uIFJlZmVyZW5jZSBNYW51YWx9OgotCi1cYmVnaW57dmVyYmF0aW19Ci1cYmVnaW57cHJvZHVjdGlvbmxpc3R9Ci0gIFxwcm9kdWN0aW9ue2lkZW50aWZpZXJ9Ci0gICAgICAgICAgICAgeyhcdG9rZW57bGV0dGVyfXwiXyIpIChcdG9rZW57bGV0dGVyfSB8IFx0b2tlbntkaWdpdH0gfCAiXyIpKn0KLSAgXHByb2R1Y3Rpb257bGV0dGVyfQotICAgICAgICAgICAgIHtcdG9rZW57bG93ZXJjYXNlfSB8IFx0b2tlbnt1cHBlcmNhc2V9fQotICBccHJvZHVjdGlvbntsb3dlcmNhc2V9Ci0gICAgICAgICAgICAgeyJhIi4uLiJ6In0KLSAgXHByb2R1Y3Rpb257dXBwZXJjYXNlfQotICAgICAgICAgICAgIHsiQSIuLi4iWiJ9Ci0gIFxwcm9kdWN0aW9ue2RpZ2l0fQotICAgICAgICAgICAgIHsiMCIuLi4iOSJ9Ci1cZW5ke3Byb2R1Y3Rpb25saXN0fQotXGVuZHt2ZXJiYXRpbX0KLQotCi1cc3Vic2VjdGlvbntHcmFwaGljYWwgSW50ZXJmYWNlIENvbXBvbmVudHMgXGxhYmVse2d1aS1tYXJrdXB9fQotCi0gIFRoZSBjb21wb25lbnRzIG9mIGdyYXBoaWNhbCBpbnRlcmZhY2VzIHdpbGwgYmUgYXNzaWduZWQgbWFya3VwLCBidXQKLSAgbW9zdCBvZiB0aGUgc3BlY2lmaWNzIGhhdmUgbm90IGJlZW4gZGV0ZXJtaW5lZC4KLQotICBcYmVnaW57bWFjcm9kZXNjfXtndWlsYWJlbH17XHB7bGFiZWx9fQotICAgIExhYmVscyBwcmVzZW50ZWQgYXMgcGFydCBvZiBhbiBpbnRlcmFjdGl2ZSB1c2VyIGludGVyZmFjZSBzaG91bGQKLSAgICBiZSBtYXJrZWQgdXNpbmcgXG1hY3Jve2d1aWxhYmVsfS4gIFRoaXMgaW5jbHVkZXMgbGFiZWxzIGZyb20KLSAgICB0ZXh0LWJhc2VkIGludGVyZmFjZXMgc3VjaCBhcyB0aG9zZSBjcmVhdGVkIHVzaW5nIFxjb2Rle2N1cnNlc30gb3IKLSAgICBvdGhlciB0ZXh0LWJhc2VkIGxpYnJhcmllcy4gIEFueSBsYWJlbCB1c2VkIGluIHRoZSBpbnRlcmZhY2UKLSAgICBzaG91bGQgYmUgbWFya2VkIHdpdGggdGhpcyBtYWNybywgaW5jbHVkaW5nIGJ1dHRvbiBsYWJlbHMsIHdpbmRvdwotICAgIHRpdGxlcywgZmllbGQgbmFtZXMsIG1lbnUgYW5kIG1lbnUgc2VsZWN0aW9uIG5hbWVzLCBhbmQgZXZlbgotICAgIHZhbHVlcyBpbiBzZWxlY3Rpb24gbGlzdHMuCi0gIFxlbmR7bWFjcm9kZXNjfQotCi0gIFxiZWdpbnttYWNyb2Rlc2N9e21lbnVzZWxlY3Rpb259e1xwe21lbnVwYXRofX0KLSAgICBNZW51IHNlbGVjdGlvbnMgc2hvdWxkIGJlIG1hcmtlZCB1c2luZyBhIGNvbWJpbmF0aW9uIG9mCi0gICAgXG1hY3Jve21lbnVzZWxlY3Rpb259IGFuZCBcbWFjcm97c3VifS4gIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBtYXJrCi0gICAgYSBjb21wbGV0ZSBzZXF1ZW5jZSBvZiBtZW51IHNlbGVjdGlvbnMsIGluY2x1ZGluZyBzZWxlY3RpbmcKLSAgICBzdWJtZW51cyBhbmQgY2hvb3NpbmcgYSBzcGVjaWZpYyBvcGVyYXRpb24sIG9yIGFueSBzdWJzZXF1ZW5jZSBvZgotICAgIHN1Y2ggYSBzZXF1ZW5jZS4gIFRoZSBuYW1lcyBvZiBpbmRpdmlkdWFsIHNlbGVjdGlvbnMgc2hvdWxkIGJlCi0gICAgc2VwYXJhdGVkIGJ5IG9jY3VycmVuY2VzIG9mIFxtYWNyb3tzdWJ9LgotCi0gICAgRm9yIGV4YW1wbGUsIHRvIG1hcmsgdGhlIHNlbGVjdGlvbiBgYFxtZW51c2VsZWN0aW9ue1N0YXJ0IFxzdWIKLSAgICBQcm9ncmFtc30nJywgdXNlIHRoaXMgbWFya3VwOgotCi1cYmVnaW57dmVyYmF0aW19Ci1cbWVudXNlbGVjdGlvbntTdGFydCBcc3ViIFByb2dyYW1zfQotXGVuZHt2ZXJiYXRpbX0KLQotICAgIFdoZW4gaW5jbHVkaW5nIGEgc2VsZWN0aW9uIHRoYXQgaW5jbHVkZXMgc29tZSB0cmFpbGluZyBpbmRpY2F0b3IsCi0gICAgc3VjaCBhcyB0aGUgZWxsaXBzaXMgc29tZSBvcGVyYXRpbmcgc3lzdGVtcyB1c2UgdG8gaW5kaWNhdGUgdGhhdAotICAgIHRoZSBjb21tYW5kIG9wZW5zIGEgZGlhbG9nLCB0aGUgaW5kaWNhdG9yIHNob3VsZCBiZSBvbWl0dGVkIGZyb20KLSAgICB0aGUgc2VsZWN0aW9uIG5hbWUuCi0KLSAgICBJbmRpdmlkdWFsIHNlbGVjdGlvbiBuYW1lcyB3aXRoaW4gdGhlIFxtYWNyb3ttZW51c2VsZWN0aW9ufSBzaG91bGQKLSAgICBub3QgYmUgbWFya2VkIHVzaW5nIFxtYWNyb3tndWlsYWJlbH0gc2luY2UgdGhhdCdzIGltcGxpZWQgYnkgdXNpbmcKLSAgICBcbWFjcm97bWVudXNlbGVjdGlvbn0uCi0gIFxlbmR7bWFjcm9kZXNjfQotCi0gIFxiZWdpbnttYWNyb2Rlc2N9e3N1Yn17fQotICAgIFNlcGFyYXRvciBmb3IgbWVudSBzZWxlY3Rpb25zIHRoYXQgaW5jbHVkZSBtdWx0aXBsZSBsZXZlbHMuICBUaGlzCi0gICAgbWFjcm8gaXMgb25seSBkZWZpbmVkIHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGUKLSAgICBcbWFjcm97bWVudXNlbGVjdGlvbn0gbWFjcm8uCi0gIFxlbmR7bWFjcm9kZXNjfQotCi0KLVxzZWN0aW9ue1Byb2Nlc3NpbmcgVG9vbHMgXGxhYmVse3Rvb2xzfX0KLQotICBcc3Vic2VjdGlvbntFeHRlcm5hbCBUb29scyBcbGFiZWx7dG9vbHMtZXh0ZXJuYWx9fQotCi0gICAgTWFueSB0b29scyBhcmUgbmVlZGVkIHRvIGJlIGFibGUgdG8gcHJvY2VzcyB0aGUgUHl0aG9uCi0gICAgZG9jdW1lbnRhdGlvbiBpZiBhbGwgc3VwcG9ydGVkIGZvcm1hdHMgYXJlIHJlcXVpcmVkLiAgVGhpcwotICAgIHNlY3Rpb24gbGlzdHMgdGhlIHRvb2xzIHVzZWQgYW5kIHdoZW4gZWFjaCBpcyByZXF1aXJlZC4gIENvbnN1bHQKLSAgICB0aGUgXGZpbGV7RG9jL1JFQURNRX0gZmlsZSB0byBzZWUgaWYgdGhlcmUgYXJlIHNwZWNpZmljIHZlcnNpb24KLSAgICByZXF1aXJlbWVudHMgZm9yIGFueSBvZiB0aGVzZS4KLQotICAgIFxiZWdpbntkZXNjcmlwdGlvbn0KLSAgICAgIFxpdGVtW1xwcm9ncmFte2R2aXBzfV0KLSAgICAgICAgVGhpcyBwcm9ncmFtIGlzIGEgdHlwaWNhbCBwYXJ0IG9mIFxUZVh7fSBpbnN0YWxsYXRpb25zLiAgSXQgaXMKLSAgICAgICAgdXNlZCB0byBnZW5lcmF0ZSBQb3N0U2NyaXB0IGZyb20gdGhlIGBgZGV2aWNlIGluZGVwZW5kZW50JycKLSAgICAgICAgXGZpbGV7LmR2aX0gZmlsZXMuICBJdCBpcyBuZWVkZWQgZm9yIHRoZSBjb252ZXJzaW9uIHRvCi0gICAgICAgIFBvc3RTY3JpcHQuCi0KLSAgICAgIFxpdGVtW1xwcm9ncmFte2VtYWNzfV0KLSAgICAgICAgRW1hY3MgaXMgdGhlIGtpdGNoZW4gc2luayBvZiBwcm9ncmFtbWVycycgZWRpdG9ycywgYW5kIGEgZGFtbgotICAgICAgICBmaW5lIGtpdGNoZW4gc2luayBpdCBpcy4gIEl0IGFsc28gY29tZXMgd2l0aCBzb21lIG9mIHRoZQotICAgICAgICBwcm9jZXNzaW5nIG5lZWRlZCB0byBzdXBwb3J0IHRoZSBwcm9wZXIgbWVudSBzdHJ1Y3R1cmVzIGZvcgotICAgICAgICBUZXhpbmZvIGRvY3VtZW50cyB3aGVuIGFuIGluZm8gY29udmVyc2lvbiBpcyBkZXNpcmVkLiAgVGhpcyBpcwotICAgICAgICBuZWVkZWQgZm9yIHRoZSBpbmZvIGNvbnZlcnNpb24uICBVc2luZyBccHJvZ3JhbXt4ZW1hY3N9Ci0gICAgICAgIGluc3RlYWQgb2YgRlNGIFxwcm9ncmFte2VtYWNzfSBtYXkgbGVhZCB0byBpbnN0YWJpbGl0eSBpbiB0aGUKLSAgICAgICAgY29udmVyc2lvbiwgYnV0IHRoYXQncyBiZWNhdXNlIG5vYm9keSBzZWVtcyB0byBtYWludGFpbiB0aGUKLSAgICAgICAgRW1hY3MgVGV4aW5mbyBjb2RlIGluIGEgcG9ydGFibGUgbWFubmVyLgotCi0gICAgICBcaXRlbVtccHJvZ3JhbXtsYXRleH1dCi0gICAgICAgIFxMYVRlWHt9IGlzIGEgbGFyZ2UgYW5kIGV4dGVuc2libGUgbWFjcm8gcGFja2FnZSBieSBMZXNsaWUKLSAgICAgICAgTGFtcG9ydCwgYmFzZWQgb24gXFRlWCwgYSB3b3JsZC1jbGFzcyB0eXBlc2V0dGVyIGJ5IERvbmFsZAotICAgICAgICBLbnV0aC4gIEl0IGlzIHVzZWQgZm9yIHRoZSBjb252ZXJzaW9uIHRvIFBvc3RTY3JpcHQsIGFuZCBpcwotICAgICAgICBuZWVkZWQgZm9yIHRoZSBIVE1MIGNvbnZlcnNpb24gYXMgd2VsbCAoXExhVGVYMkhUTUwgcmVxdWlyZXMKLSAgICAgICAgb25lIG9mIHRoZSBpbnRlcm1lZGlhdGUgZmlsZXMgaXQgY3JlYXRlcykuCi0KLSAgICAgIFxpdGVtW1xwcm9ncmFte2xhdGV4Mmh0bWx9XQotICAgICAgICBQcm9iYWJseSB0aGUgbG9uZ2VzdCBQZXJsIHNjcmlwdCBhbnlvbmUgZXZlciBhdHRlbXB0ZWQgdG8KLSAgICAgICAgbWFpbnRhaW4uICBUaGlzIGNvbnZlcnRzIFxMYVRlWHt9IGRvY3VtZW50cyB0byBIVE1MIGRvY3VtZW50cywKLSAgICAgICAgYW5kIGRvZXMgYSBwcmV0dHkgcmVhc29uYWJsZSBqb2IuICBJdCBpcyByZXF1aXJlZCBmb3IgdGhlCi0gICAgICAgIGNvbnZlcnNpb25zIHRvIEhUTUwgYW5kIEdOVSBpbmZvLgotCi0gICAgICBcaXRlbVtccHJvZ3JhbXtseW54fV0KLSAgICAgICAgVGhpcyBpcyBhIHRleHQtbW9kZSBXZWIgYnJvd3NlciB3aGljaCBpbmNsdWRlcyBhbgotICAgICAgICBIVE1MLXRvLXBsYWluIHRleHQgY29udmVyc2lvbi4gIFRoaXMgaXMgdXNlZCB0byBjb252ZXJ0Ci0gICAgICAgIFxjb2Rle2hvd3RvfSBkb2N1bWVudHMgdG8gdGV4dC4KLQotICAgICAgXGl0ZW1bXHByb2dyYW17bWFrZX1dCi0gICAgICAgIEp1c3QgYWJvdXQgYW55IHZlcnNpb24gc2hvdWxkIHdvcmsgZm9yIHRoZSBzdGFuZGFyZCBkb2N1bWVudHMsCi0gICAgICAgIGJ1dCBHTlUgXHByb2dyYW17bWFrZX0gaXMgcmVxdWlyZWQgZm9yIHRoZSBleHBlcmltZW50YWwKLSAgICAgICAgcHJvY2Vzc2VzIGluIFxmaWxle0RvYy90b29scy9zZ21sY29udi99LCBhdCBsZWFzdCB3aGlsZQotICAgICAgICB0aGV5J3JlIGV4cGVyaW1lbnRhbC4gIFRoaXMgaXMgbm90IHJlcXVpcmVkIGZvciBydW5uaW5nIHRoZQotICAgICAgICBccHJvZ3JhbXtta2hvd3RvfSBzY3JpcHQuCi0KLSAgICAgIFxpdGVtW1xwcm9ncmFte21ha2VpbmRleH1dCi0gICAgICAgIFRoaXMgaXMgYSBzdGFuZGFyZCBwcm9ncmFtIGZvciBjb252ZXJ0aW5nIFxMYVRlWHt9IGluZGV4IGRhdGEKLSAgICAgICAgdG8gYSBmb3JtYXR0ZWQgaW5kZXg7IGl0IHNob3VsZCBiZSBpbmNsdWRlZCB3aXRoIGFsbCBcTGFUZVh7fQotICAgICAgICBpbnN0YWxsYXRpb25zLiAgSXQgaXMgbmVlZGVkIGZvciB0aGUgUERGIGFuZCBQb3N0U2NyaXB0Ci0gICAgICAgIGNvbnZlcnNpb25zLgotCi0gICAgICBcaXRlbVtccHJvZ3JhbXttYWtlaW5mb31dCi0gICAgICAgIEdOVSBccHJvZ3JhbXttYWtlaW5mb30gaXMgdXNlZCB0byBjb252ZXJ0IFRleGluZm8gZG9jdW1lbnRzIHRvCi0gICAgICAgIEdOVSBpbmZvIGZpbGVzLiAgU2luY2UgVGV4aW5mbyBpcyB1c2VkIGFzIGFuIGludGVybWVkaWF0ZQotICAgICAgICBmb3JtYXQgaW4gdGhlIGluZm8gY29udmVyc2lvbiwgdGhpcyBwcm9ncmFtIGlzIG5lZWRlZCBpbiB0aGF0Ci0gICAgICAgIGNvbnZlcnNpb24uCi0KLSAgICAgIFxpdGVtW1xwcm9ncmFte3BkZmxhdGV4fV0KLSAgICAgICAgcGRmXFRlWHt9IGlzIGEgcmVsYXRpdmVseSBuZXcgdmFyaWFudCBvZiBcVGVYLCBhbmQgaXMgdXNlZCB0bwotICAgICAgICBnZW5lcmF0ZSB0aGUgUERGIHZlcnNpb24gb2YgdGhlIG1hbnVhbHMuICBJdCBpcyB0eXBpY2FsbHkKLSAgICAgICAgaW5zdGFsbGVkIGFzIHBhcnQgb2YgbW9zdCBvZiB0aGUgbGFyZ2UgXFRlWHt9IGRpc3RyaWJ1dGlvbnMuCi0gICAgICAgIFxwcm9ncmFte3BkZmxhdGV4fSBpcyBwZGZcVGVYe30gdXNpbmcgdGhlIFxMYVRlWHt9IGZvcm1hdC4KLQotICAgICAgXGl0ZW1bXHByb2dyYW17cGVybH1dCi0gICAgICAgIFBlcmwgaXMgcmVxdWlyZWQgZm9yIFxMYVRlWDJIVE1Me30gYW5kIG9uZSBvZiB0aGUgc2NyaXB0cyB1c2VkCi0gICAgICAgIHRvIHBvc3QtcHJvY2VzcyBcTGFUZVgySFRNTCBvdXRwdXQsIGFzIHdlbGwgYXMgdGhlCi0gICAgICAgIEhUTUwtdG8tVGV4aW5mbyBjb252ZXJzaW9uLiAgVGhpcyBpcyByZXF1aXJlZCBmb3IKLSAgICAgICAgdGhlIEhUTUwgYW5kIEdOVSBpbmZvIGNvbnZlcnNpb25zLgotCi0gICAgICBcaXRlbVtccHJvZ3JhbXtweXRob259XQotICAgICAgICBQeXRob24gaXMgdXNlZCBmb3IgbWFueSBvZiB0aGUgc2NyaXB0cyBpbiB0aGUKLSAgICAgICAgXGZpbGV7RG9jL3Rvb2xzL30gZGlyZWN0b3J5OyBpdCBpcyByZXF1aXJlZCBmb3IgYWxsCi0gICAgICAgIGNvbnZlcnNpb25zLiAgVGhpcyBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtIGlmIHlvdSdyZSBpbnRlcmVzdGVkCi0gICAgICAgIGluIHdyaXRpbmcgZG9jdW1lbnRhdGlvbiBmb3IgUHl0aG9uIQotICAgIFxlbmR7ZGVzY3JpcHRpb259Ci0KLQotICBcc3Vic2VjdGlvbntJbnRlcm5hbCBUb29scyBcbGFiZWx7dG9vbHMtaW50ZXJuYWx9fQotCi0gICAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgdmFyaW91cyBzY3JpcHRzIHRoYXQgYXJlIHVzZWQgdG8KLSAgICBpbXBsZW1lbnQgdmFyaW91cyBzdGFnZXMgb2YgZG9jdW1lbnQgcHJvY2Vzc2luZyBvciB0byBvcmNoZXN0cmF0ZQotICAgIGVudGlyZSBidWlsZCBzZXF1ZW5jZXMuICBNb3N0IG9mIHRoZXNlIHRvb2xzIGFyZSBvbmx5IHVzZWZ1bAotICAgIGluIHRoZSBjb250ZXh0IG9mIGJ1aWxkaW5nIHRoZSBzdGFuZGFyZCBkb2N1bWVudGF0aW9uLCBidXQgc29tZQotICAgIGFyZSBtb3JlIGdlbmVyYWwuCi0KLSAgICBcYmVnaW57ZGVzY3JpcHRpb259Ci0gICAgICBcaXRlbVtccHJvZ3JhbXtta2hvd3RvfV0KLSAgICAgICAgVGhpcyBpcyB0aGUgcHJpbWFyeSBzY3JpcHQgdXNlZCB0byBmb3JtYXQgdGhpcmQtcGFydHkKLSAgICAgICAgZG9jdW1lbnRzLiAgSXQgY29udGFpbnMgYWxsIHRoZSBsb2dpYyBuZWVkZWQgdG8gYGBnZXQgaXQKLSAgICAgICAgcmlnaHQuJycgIFRoZSBwcm9wZXIgd2F5IHRvIHVzZSB0aGlzIHNjcmlwdCBpcyB0byBtYWtlIGEKLSAgICAgICAgc3ltYm9saWMgbGluayB0byBpdCBvciBydW4gaXQgaW4gcGxhY2U7IHRoZSBhY3R1YWwgc2NyaXB0IGZpbGUKLSAgICAgICAgbXVzdCBiZSBzdG9yZWQgYXMgcGFydCBvZiB0aGUgZG9jdW1lbnRhdGlvbiBzb3VyY2UgdHJlZSwKLSAgICAgICAgdGhvdWdoIGl0IG1heSBiZSB1c2VkIHRvIGZvcm1hdCBkb2N1bWVudHMgb3V0c2lkZSB0aGUgdHJlZS4KLSAgICAgICAgVXNlIFxwcm9ncmFte21raG93dG99IFxsb25ncHJvZ3JhbW9wdHtoZWxwfSBmb3IgYSBsaXN0IG9mCi0gICAgICAgIGNvbW1hbmQgbGluZSBvcHRpb25zLgotCi0gICAgICAgIFxwcm9ncmFte21raG93dG99IGNhbiBiZSB1c2VkIGZvciBib3RoIFxjb2Rle2hvd3RvfSBhbmQKLSAgICAgICAgXGNvZGV7bWFudWFsfSBjbGFzcyBkb2N1bWVudHMuICBJdCBpcyB1c3VhbGx5IGEgZ29vZCBpZGVhIHRvCi0gICAgICAgIGFsd2F5cyB1c2UgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgdG9vbCByYXRoZXIgdGhhbiBhCi0gICAgICAgIHZlcnNpb24gZnJvbSBhbiBvbGRlciBzb3VyY2UgcmVsZWFzZSBvZiBQeXRob24uICBJdCBjYW4gYmUKLSAgICAgICAgdXNlZCB0byBnZW5lcmF0ZSBEVkksIEhUTUwsIFBERiwgUG9zdFNjcmlwdCwgYW5kIHBsYWluIHRleHQKLSAgICAgICAgZG9jdW1lbnRzLiAgVGhlIEdOVSBpbmZvIGFuZCBpU2lsbyBmb3JtYXRzIHdpbGwgYmUgc3VwcG9ydGVkCi0gICAgICAgIGJ5IHRoaXMgc2NyaXB0IGluIHNvbWUgZnV0dXJlIHZlcnNpb24uCi0KLSAgICAgICAgVXNlIHRoZSBcbG9uZ3Byb2dyYW1vcHR7aGVscH0gb3B0aW9uIG9uIHRoaXMgc2NyaXB0J3MgY29tbWFuZAotICAgICAgICBsaW5lIHRvIGdldCBhIHN1bW1hcnkgb2Ygb3B0aW9ucyBmb3IgdGhpcyBzY3JpcHQuCi0KLSAgICAgICAgWFhYICBOZWVkIG1vcmUgaGVyZS4KLSAgICBcZW5ke2Rlc2NyaXB0aW9ufQotCi0KLSAgXHN1YnNlY3Rpb257V29ya2luZyBvbiBDeWd3aW4gXGxhYmVse2N5Z3dpbn19Ci0KLSAgICBJbnN0YWxsaW5nIHRoZSByZXF1aXJlZCB0b29scyB1bmRlciBDeWd3aW4gdW5kZXIgQ3lnd2luIGNhbiBiZSBhCi0gICAgbGl0dGxlIHRlZGlvdXMuICBNb3N0IG9mIHRoZSByZXF1aXJlZCBwYWNrYWdlcyBjYW4gYmUgaW5zdGFsbGVkCi0gICAgdXNpbmcgQ3lnd2luJ3MgZ3JhcGhpY2FsIGluc3RhbGxlciwgd2hpbGUgbmV0cGJtIGFuZCBcTGFUZVgySFRNTAotICAgIG11c3QgYmUgaW5zdGFsbGVkIGZyb20gc291cmNlLiAKLQotICAgIFN0YXJ0IHdpdGggYSByZWFzb25hYmx5IG1vZGVybiB2ZXJzaW9uIG9mIEN5Z3dpbi4gIElmIHlvdSBoYXZlbid0Ci0gICAgdXBncmFkZWQgZm9yIGEgZmV3IHllYXJzLCBub3cgd291bGQgYmUgYSBnb29kIHRpbWUuCi0KLSAgICBVc2luZyB0aGUgQ3lnd2luIGluc3RhbGxlciwgbWFrZSBzdXJlIHlvdXIgQ3lnd2luIGluc3RhbGxhdGlvbgotICAgIGluY2x1ZGVzIFBlcmwsIFB5dGhvbiwgYW5kIHRoZSBcVGVYe30gcGFja2FnZXMuICBQZXJsIGFuZCBQeXRob24KLSAgICBhcmUgbG9jYXRlZCB1bmRlciB0aGUgXG1lbnVzZWxlY3Rpb257SW50ZXJwcmV0ZXJzfSBoZWFkaW5nLiAgVGhlCi0gICAgXFRlWHt9IHBhY2thZ2VzIGFyZSBsb2NhdGVkIHVuZGVyIHRoZSBcbWVudXNlbGVjdGlvbntUZXh0fQotICAgIGhlYWRpbmcsIGFuZCBhcmUgbmFtZWQgXGNvZGV7dGV0ZXgtKn0uICBUbyBlbnN1cmUgdGhhdCBhbGwKLSAgICByZXF1aXJlZCBwYWNrYWdlcyBhcmUgYXZhaWxhYmxlLCBpbnN0YWxsIGV2ZXJ5IFxjb2Rle3RldGV4fQotICAgIHBhY2thZ2UsIGV4Y2VwdCBcY29kZXt0ZXRleC14MTF9LiAgKFRoZXJlIG1heSBiZSBhIG1vcmUgbWluaW1hbAotICAgIHNldCwgYnV0IEkndmUgbm90IHNwZW50IHRpbWUgdHJ5aW5nIHRvIG1pbmltaXplIHRoZSBpbnN0YWxsYXRpb24uKSAKLQotICAgIFRoZSBuZXRwYm0gcGFja2FnZSBpcyB1c2VkIGJ5IFxMYVRlWDJIVE1MLCBhbmQgXGVtcGh7bXVzdH0gYmUKLSAgICBpbnN0YWxsZWQgYmVmb3JlIFxMYVRlWDJIVE1MIGNhbiBiZSBzdWNjZXNzZnVsbHkgaW5zdGFsbGVkLCBldmVuCi0gICAgdGhvdWdoIGl0cyBmZWF0dXJlcyB3aWxsIG5vdCBiZSB1c2VkIGZvciBtb3N0IFB5dGhvbgotICAgIGRvY3VtZW50YXRpb24uICBSZWZlcmVuY2VzIHRvIGRvd25sb2FkIGxvY2F0aW9ucyBhcmUgbG9jYXRlZCBpbgotICAgIHRoZSBcdWxpbmt7bmV0cGJtIFJFQURNRX17aHR0cDovL25ldHBibS5zb3VyY2Vmb3JnZS5uZXQvUkVBRE1FfS4KLSAgICBJbnN0YWxsIGZyb20gdGhlIGxhdGVzdCBzdGFibGUgc291cmNlIGRpc3RyaWJ1dGlvbiBhY2NvcmRpbmcgdG8KLSAgICB0aGUgaW5zdHJ1Y3Rpb25zLiAgKE5vdGUgdGhhdCBiaW5hcnkgcGFja2FnZXMgb2YgbmV0cGJtIGFyZQotICAgIHNvbWV0aW1lcyBhdmFpbGFibGUsIGJ1dCB0aGVzZSBtYXkgbm90IHdvcmsgY29ycmVjdGx5IHdpdGgKLSAgICBcTGFUZVgySFRNTC4pCi0KLSAgICBcTGFUZVgySFRNTCBjYW4gYmUgaW5zdGFsbGVkIGZyb20gdGhlIHNvdXJjZSBhcmNoaXZlLCBidXQgb25seQotICAgIGFmdGVyIG11bmdpbmcgb25lIG9mIHRoZSBmaWxlcyBpbiB0aGUgZGlzdHJpYnV0aW9uLiAgRG93bmxvYWQgdGhlCi0gICAgc291cmNlIGFyY2hpdmUgZnJvbSB0aGUgXExhVGVYMkhUTUwgd2Vic2l0ZQotICAgIFx1cmx7aHR0cDovL3d3dy5sYXRleDJodG1sLm9yZy99IChvciBvbmUgb2YgdGhlIG1hbnkgYWx0ZXJuYXRlCi0gICAgc2l0ZXMpIGFuZCB1bnBhY2sgaXQgdG8gYSBidWlsZCBkaXJlY3RvcnkuIEluIHRoZSB0b3AgbGV2ZWwgb2YKLSAgICB0aGlzIGJ1aWxkIGRpcmVjdG9yeSB0aGVyZSB3aWxsIGJlIGEgZmlsZSBuYW1lZCBcZmlsZXtMMmhvcy5wbX0uCi0gICAgT3BlbiBcZmlsZXtMMmhvcy5wbX0gaW4gYW4gZWRpdG9yLCBhbmQgbmVhciB0aGUgYm90dG9tIG9mIHRoZSBmaWxlCi0gICAgcmVwbGFjZSB0aGUgdGV4dCBcY29kZXtcJFx0ZXh0YXNjaWljaXJjdW17fU99IHdpdGggdGhlIHRleHQKLSAgICBcY29kZXsndW5peCd9LiAgUHJvY2VlZCB1c2luZyB0aGlzIGNvbW1hbmQgdG8gYnVpbGQgYW5kIGluc3RhbGwKLSAgICB0aGUgc29mdHdhcmU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSUgLi9jb25maWd1cmUgJiYgbWFrZSBpbnN0YWxsCi1cZW5ke3ZlcmJhdGltfQotCi0gICAgWW91IHNob3VsZCBub3cgYmUgYWJsZSB0byBidWlsZCBhdCBsZWFzdCB0aGUgRFZJLCBIVE1MLCBQREYsIGFuZAotICAgIFBvc3RTY3JpcHQgdmVyc2lvbnMgb2YgdGhlIGZvcm1hdHRlZCBkb2N1bWVudGF0aW9uLgotCi0KLVxzZWN0aW9ue0luY2x1ZGluZyBHcmFwaGljcyBcbGFiZWx7Z3JhcGhpY3N9fQotCi0gIFRoZSBzdGFuZGFyZCBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggUHl0aG9uIG1ha2VzIG5vIHVzZSBvZgotICBkaWFncmFtcyBvciBpbWFnZXM7IHRoaXMgaXMgaW50ZW50aW9uYWwuICBUaGUgb3V0c2lkZSB0b29scyB1c2VkIHRvCi0gIGZvcm1hdCB0aGUgZG9jdW1lbnRhdGlvbiBoYXZlIG5vdCBhbHdheXMgYmVlbiBzdWl0ZWQgdG8gd29ya2luZyB3aXRoCi0gIGdyYXBoaWNzLiAgQXMgdGhlIHRvb2xzIGhhdmUgZXZvbHZlZCBhbmQgYmVlbiBpbXByb3ZlZCBieSB0aGVpcgotICBtYWludGFpbmVycywgc3VwcG9ydCBmb3IgZ3JhcGhpY3MgaGFzIGltcHJvdmVkLgotCi0gIFRoZSBpbnRlcm5hbCB0b29scywgc3RhcnRpbmcgd2l0aCB0aGUgXHByb2dyYW17bWtob3d0b30gc2NyaXB0LCBkbwotICBub3QgcHJvdmlkZSBhbnkgZGlyZWN0IHN1cHBvcnQgZm9yIGdyYXBoaWNzLiAgSG93ZXZlciwKLSAgXHByb2dyYW17bWtob3d0b30gd2lsbCBub3QgaW50ZXJmZXJlIHdpdGggZ3JhcGhpY3Mgc3VwcG9ydCBpbiB0aGUKLSAgZXh0ZXJuYWwgdG9vbHMuCi0KLSAgRXhwZXJpZW5jZSB1c2luZyBncmFwaGljcyB0b2dldGhlciB3aXRoIHRoZXNlIHRvb2xzIGFuZCB0aGUKLSAgXGNvZGV7aG93dG99IGFuZCBcY29kZXttYW51YWx9IGRvY3VtZW50IGNsYXNzZXMgaXMgbm90IGV4dGVuc2l2ZSwKLSAgYnV0IGhhcyBiZWVuIGtub3duIHRvIHdvcmsuICBUaGUgYmFzaWMgYXBwcm9hY2ggaXMgdGhpczoKLQotICBcYmVnaW57ZW51bWVyYXRlfQotICAgIFxpdGVtIENyZWF0ZSB0aGUgaW1hZ2Ugb3IgZ3JhcGhpYyB1c2luZyB5b3VyIGZhdm9yaXRlCi0gICAgICAgICAgYXBwbGljYXRpb24uCi0KLSAgICBcaXRlbSBDb252ZXJ0IHRoZSBpbWFnZSB0byBhIGZvcm1hdCBzdXBwb3J0ZWQgYnkgdGhlIGNvbnZlcnNpb24gdG8KLSAgICAgICAgICB5b3VyIGRlc2lyZWQgb3V0cHV0IGZvcm1hdC4gIElmIHlvdSB3YW50IHRvIGdlbmVyYXRlIEhUTUwgb3IKLSAgICAgICAgICBQb3N0U2NyaXB0LCB5b3UgY2FuIGNvbnZlcnQgdGhlIGltYWdlIG9yIGdyYXBoaWMgdG8KLSAgICAgICAgICBlbmNhcHN1bGF0ZWQgUG9zdFNjcmlwdCAoYSBcZmlsZXsuZXBzfSBmaWxlKTsgXExhVGVYMkhUTUwKLSAgICAgICAgICBjYW4gY29udmVydCB0aGF0IHRvIGEgXGZpbGV7LmdpZn0gZmlsZTsgaXQgbWF5IGJlIHBvc3NpYmxlCi0gICAgICAgICAgdG8gcHJvdmlkZSBhIFxmaWxley5naWZ9IGZpbGUgZGlyZWN0bHkuICBJZiB5b3Ugd2FudCB0bwotICAgICAgICAgIGdlbmVyYXRlIFBERiwgeW91IG5lZWQgdG8gcHJvdmlkZSBhbiBgYGVuY2Fwc3VsYXRlZCcnIFBERgotICAgICAgICAgIGZpbGUuICBUaGlzIGNhbiBiZSBnZW5lcmF0ZWQgZnJvbSBlbmNhcHN1bGF0ZWQgUG9zdFNjcmlwdAotICAgICAgICAgIHVzaW5nIHRoZSBccHJvZ3JhbXtlcHN0b3BkZn0gdG9vbCBwcm92aWRlZCB3aXRoIHRoZSB0ZVxUZVh7fQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiBvbiBMaW51eCBhbmQgXFVOSVguCi0KLSAgICBcaXRlbSBJbiB5b3VyIGRvY3VtZW50LCBhZGQgdGhpcyBsaW5lIHRvIGBgaW1wb3J0JycgdGhlIGdlbmVyYWwKLSAgICAgICAgICBncmFwaGljcyBzdXBwb3J0IHBhY2thZ2UgXGNvZGV7Z3JhcGhpY3h9OgotCi1cYmVnaW57dmVyYmF0aW19Ci1cdXNlcGFja2FnZXtncmFwaGljeH0KLVxlbmR7dmVyYmF0aW19Ci0KLSAgICBcaXRlbSBXaGVyZSB5b3Ugd2FudCB0byBpbmNsdWRlIHlvdXIgZ3JhcGhpYyBvciBpbWFnZSwgaW5jbHVkZQotICAgICAgICAgIG1hcmt1cCBzaW1pbGFyIHRvIHRoaXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLVxiZWdpbntmaWd1cmV9Ci0gIFxjZW50ZXJpbmcKLSAgXGluY2x1ZGVncmFwaGljc1t3aWR0aD01aW5de215aW1hZ2V9Ci0gIFxjYXB0aW9ue0Rlc2NyaXB0aW9uIG9mIG15IGltYWdlfQotXGVuZHtmaWd1cmV9Ci1cZW5ke3ZlcmJhdGltfQotCi0gICAgICAgICAgSW4gcGFydGljdWxhciwgbm90ZSBmb3IgdGhlIFxtYWNyb3tpbmNsdWRlZ3JhcGhpY3N9IG1hY3JvCi0gICAgICAgICAgdGhhdCBubyBmaWxlIGV4dGVuc2lvbiBpcyBwcm92aWRlZC4gIElmIHlvdSdyZSBvbmx5Ci0gICAgICAgICAgaW50ZXJlc3RlZCBpbiBvbmUgdGFyZ2V0IGZvcm1hdCwgeW91IGNhbiBpbmNsdWRlIHRoZQotICAgICAgICAgIGV4dGVuc2lvbiBvZiB0aGUgYXBwcm9wcmlhdGUgaW5wdXQgZmlsZSwgYnV0IHRvIGFsbG93Ci0gICAgICAgICAgc3VwcG9ydCBmb3IgbXVsdGlwbGUgZm9ybWF0cywgb21pdHRpbmcgdGhlIGV4dGVuc2lvbiBtYWtlcwotICAgICAgICAgIGxpZmUgZWFzaWVyLgotCi0gICAgXGl0ZW0gUnVuIFxwcm9ncmFte21raG93dG99IG5vcm1hbGx5LgotICBcZW5ke2VudW1lcmF0ZX0KLQotICBJZiB5b3UncmUgd29ya2luZyBvbiBzeXN0ZW1zIHdoaWNoIHN1cHBvcnQgc29tZSBzb3J0IG9mCi0gIFxwcm9ncmFte21ha2V9IGZhY2lsaXR5LCB5b3UgY2FuIHVzZSB0aGF0IHRvIGVuc3VyZSB0aGUgaW50ZXJtZWRpYXRlCi0gIGdyYXBoaWMgZm9ybWF0cyBhcmUga2VwdCB1cCB0byBkYXRlLiAgVGhpcyBleGFtcGxlIHNob3dzIGEKLSAgXGZpbGV7TWFrZWZpbGV9IHVzZWQgdG8gZm9ybWF0IGEgZG9jdW1lbnQgY29udGFpbmluZyBhIGRpYWdyYW0KLSAgY3JlYXRlZCB1c2luZyB0aGUgXHByb2dyYW17ZGlhfSBhcHBsaWNhdGlvbjoKLQotXGJlZ2lue3ZlcmJhdGltfQotZGVmYXVsdDogcGRmCi1hbGw6ICAgICBodG1sIHBkZiBwcwotCi1odG1sOiAgIG15ZG9jL215ZG9jLmh0bWwKLXBkZjogICAgbXlkb2MucGRmCi1wczogICAgIG15ZG9jLnBzCi0KLW15ZG9jL215ZG9jLmh0bWw6ICBteWRvYy50ZXggbXlncmFwaGljLmVwcwotICAgICAgICBta2hvd3RvIC0taHRtbCAkPAotCi1teWRvYy5wZGY6ICBteWRvYy50ZXggbXlncmFwaGljLnBkZgotICAgICAgICBta2hvd3RvIC0tcGRmICQ8Ci0KLW15ZG9jLnBzOiAgIG15ZG9jLnRleCBteWdyYXBoaWMuZXBzCi0gICAgICAgIG1raG93dG8gLS1wb3N0c2NyaXB0ICQ8Ci0KLS5TVUZGSVhFUzogLmRpYSAuZXBzIC5wZGYKLQotLmRpYS5lcHM6Ci0gICAgICAgIGRpYSAtLW5vc3BsYXNoIC0tZXhwb3J0ICRAICQ8Ci0KLS5lcHMucGRmOgotICAgICAgICBlcHN0b3BkZiAkPAotXGVuZHt2ZXJiYXRpbX0gJSAkIDwtLSBib3cgdG8gZm9udC1sb2NrCi0KLQotXHNlY3Rpb257RnV0dXJlIERpcmVjdGlvbnMgXGxhYmVse2Z1dHVyZXN9fQotCi0gIFRoZSBoaXN0b3J5IG9mIHRoZSBQeXRob24gZG9jdW1lbnRhdGlvbiBpcyBmdWxsIG9mIGNoYW5nZXMsIG1vc3Qgb2YKLSAgd2hpY2ggaGF2ZSBiZWVuIGZhaXJseSBzbWFsbCBhbmQgZXZvbHV0aW9uYXJ5LiAgVGhlcmUgaGFzIGJlZW4gYQotICBncmVhdCBkZWFsIG9mIGRpc2N1c3Npb24gYWJvdXQgbWFraW5nIGxhcmdlIGNoYW5nZXMgaW4gdGhlIG1hcmt1cAotICBsYW5ndWFnZXMgYW5kIHRvb2xzIHVzZWQgdG8gcHJvY2VzcyB0aGUgZG9jdW1lbnRhdGlvbi4gIFRoaXMgc2VjdGlvbgotICBkZWFscyB3aXRoIHRoZSBuYXR1cmUgb2YgdGhlIGNoYW5nZXMgYW5kIHdoYXQgYXBwZWFycyB0byBiZSB0aGUgbW9zdAotICBsaWtlbHkgcGF0aCBvZiBmdXR1cmUgZGV2ZWxvcG1lbnQuCi0KLSAgXHN1YnNlY3Rpb257U3RydWN0dXJlZCBEb2N1bWVudGF0aW9uIFxsYWJlbHtzdHJ1Y3R1cmVkfX0KLQotICAgIE1vc3Qgb2YgdGhlIHNtYWxsIGNoYW5nZXMgdG8gdGhlIFxMYVRlWHt9IG1hcmt1cCBoYXZlIGJlZW4gbWFkZQotICAgIHdpdGggYW4gZXllIHRvIGRpdm9yY2luZyB0aGUgbWFya3VwIGZyb20gdGhlIHByZXNlbnRhdGlvbiwgbWFraW5nCi0gICAgYm90aCBhIGJpdCBtb3JlIG1haW50YWluYWJsZS4gIE92ZXIgdGhlIGNvdXJzZSBvZiAxOTk4LCBhIGxhcmdlCi0gICAgbnVtYmVyIG9mIGNoYW5nZXMgd2VyZSBtYWRlIHdpdGggZXhhY3RseSB0aGlzIGluIG1pbmQ7IHByZXZpb3VzbHksCi0gICAgY2hhbmdlcyBoYWQgYmVlbiBtYWRlIGJ1dCBpbiBhIGxlc3Mgc3lzdGVtYXRpYyBtYW5uZXIgYW5kIHdpdGgKLSAgICBtb3JlIGNvbmNlcm4gZm9yIG5vdCBuZWVkaW5nIHRvIHVwZGF0ZSB0aGUgZXhpc3RpbmcgY29udGVudC4gIFRoZQotICAgIHJlc3VsdCBoYXMgYmVlbiBhIGhpZ2hseSBzdHJ1Y3R1cmVkIGFuZCBzZW1hbnRpY2FsbHkgbG9hZGVkIG1hcmt1cAotICAgIGxhbmd1YWdlIGltcGxlbWVudGVkIGluIFxMYVRlWC4gIFdpdGggYWxtb3N0IG5vIGJhc2ljIFxUZVh7fSBvcgotICAgIFxMYVRlWHt9IG1hcmt1cCBpbiB1c2UsIGhvd2V2ZXIsIHRoZSBtYXJrdXAgc3ludGF4IGlzIGFib3V0IHRoZQotICAgIG9ubHkgZXZpZGVuY2Ugb2YgXExhVGVYe30gaW4gdGhlIGFjdHVhbCBkb2N1bWVudCBzb3VyY2VzLgotCi0gICAgT25lIHNpZGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCB3aGlsZSB3ZSd2ZSBiZWVuIGFibGUgdG8gdXNlCi0gICAgc3RhbmRhcmQgYGBlbmdpbmVzJycgZm9yIG1hbmlwdWxhdGluZyB0aGUgZG9jdW1lbnRzLCBzdWNoIGFzCi0gICAgXExhVGVYe30gYW5kIFxMYVRlWDJIVE1MLCBtb3N0IG9mIHRoZSBhY3R1YWwgdHJhbnNmb3JtYXRpb25zIGhhdmUKLSAgICBiZWVuIGNyZWF0ZWQgc3BlY2lmaWNhbGx5IGZvciBQeXRob24uICBUaGUgXExhVGVYe30gZG9jdW1lbnQKLSAgICBjbGFzc2VzIGFuZCBcTGFUZVgySFRNTCBzdXBwb3J0IGFyZSBib3RoIGNvbXBsZXRlIGltcGxlbWVudGF0aW9ucwotICAgIG9mIHRoZSBzcGVjaWZpYyBtYXJrdXAgZGVzaWduZWQgZm9yIHRoZXNlIGRvY3VtZW50cy4KLQotICAgIENvbWJpbmluZyBoaWdobHkgY3VzdG9taXplZCBtYXJrdXAgd2l0aCB0aGUgc29tZXdoYXQgZXNvdGVyaWMKLSAgICBzeXN0ZW1zIHVzZWQgdG8gcHJvY2VzcyB0aGUgZG9jdW1lbnRzIGxlYWRzIHVzIHRvIGFzayBzb21lCi0gICAgcXVlc3Rpb25zOiAgQ2FuIHdlIGRvIHRoaXMgbW9yZSBlYXNpbHk/ICBhbmQsIENhbiB3ZSBkbyB0aGlzCi0gICAgYmV0dGVyPyAgQWZ0ZXIgYSBncmVhdCBkZWFsIG9mIGRpc2N1c3Npb24gd2l0aCB0aGUgY29tbXVuaXR5LCB3ZQotICAgIGhhdmUgZGV0ZXJtaW5lZCB0aGF0IGFjdGl2ZWx5IHB1cnN1aW5nIG1vZGVybiBzdHJ1Y3R1cmVkCi0gICAgZG9jdW1lbnRhdGlvbiBzeXN0ZW1zIGlzIHdvcnRoIHNvbWUgaW52ZXN0bWVudCBvZiB0aW1lLgotCi0gICAgVGhlcmUgYXBwZWFyIHRvIGJlIHR3byByZWFsIGNvbnRlbmRlcnMgaW4gdGhpcyBhcmVuYTogdGhlIFN0YW5kYXJkCi0gICAgR2VuZXJhbCBNYXJrdXAgTGFuZ3VhZ2UgKFNHTUwpLCBhbmQgdGhlIEV4dGVuc2libGUgTWFya3VwIExhbmd1YWdlCi0gICAgKFhNTCkuICBCb3RoIG9mIHRoZXNlIHN0YW5kYXJkcyBoYXZlIGFkdmFudGFnZXMgYW5kIGRpc2FkdmFudGFnZXMsCi0gICAgYW5kIG1hbnkgYWR2YW50YWdlcyBhcmUgc2hhcmVkLgotCi0gICAgU0dNTCBvZmZlcnMgYWR2YW50YWdlcyB3aGljaCBtYXkgYXBwZWFsIG1vc3QgdG8gYXV0aG9ycywKLSAgICBlc3BlY2lhbGx5IHRob3NlIHVzaW5nIG9yZGluYXJ5IHRleHQgZWRpdG9ycy4gIFRoZXJlIGFyZSBhbHNvCi0gICAgYWRkaXRpb25hbCBhYmlsaXRpZXMgdG8gZGVmaW5lIGNvbnRlbnQgbW9kZWxzLiAgQSBudW1iZXIgb2YKLSAgICBoaWdoLXF1YWxpdHkgdG9vbHMgd2l0aCBkZW1vbnN0cmF0ZWQgbWF0dXJpdHkgYXJlIGF2YWlsYWJsZSwgYnV0Ci0gICAgbW9zdCBhcmUgbm90IGZyZWU7IGZvciB0aG9zZSB3aGljaCBhcmUsIHBvcnRhYmlsaXR5IGlzc3VlcyByZW1haW4KLSAgICBhIHByb2JsZW0uCi0KLSAgICBUaGUgYWR2YW50YWdlcyBvZiBYTUwgaW5jbHVkZSB0aGUgYXZhaWxhYmlsaXR5IG9mIGEgbGFyZ2UgbnVtYmVyCi0gICAgb2YgZXZvbHZpbmcgdG9vbHMuICBVbmZvcnR1bmF0ZWx5LCBtYW55IG9mIHRoZSBhc3NvY2lhdGVkCi0gICAgc3RhbmRhcmRzIGFyZSBzdGlsbCBldm9sdmluZywgYW5kIHRoZSB0b29scyB3aWxsIGhhdmUgdG8gZm9sbG93Ci0gICAgYWxvbmcuICBUaGlzIG1lYW5zIHRoYXQgZGV2ZWxvcGluZyBhIHJvYnVzdCB0b29sIHNldCB0aGF0IHVzZXMKLSAgICBtb3JlIHRoYW4gdGhlIGJhc2ljIFhNTCAxLjAgcmVjb21tZW5kYXRpb24gaXMgbm90IHBvc3NpYmxlIGluIHRoZQotICAgIHNob3J0IHRlcm0uICBUaGUgcHJvbWlzZWQgYXZhaWxhYmlsaXR5IG9mIGEgd2lkZSB2YXJpZXR5IG9mCi0gICAgaGlnaC1xdWFsaXR5IHRvb2xzIHdoaWNoIHN1cHBvcnQgc29tZSBvZiB0aGUgbW9zdCBpbXBvcnRhbnQKLSAgICByZWxhdGVkIHN0YW5kYXJkcyBpcyBub3QgaW1tZWRpYXRlLiAgTWFueSB0b29scyBhcmUgbGlrZWx5IHRvIGJlCi0gICAgZnJlZSwgYW5kIHRoZSBwb3J0YWJpbGl0eSBpc3N1ZXMgb2YgdGhvc2Ugd2hpY2ggYXJlLCBhcmUgbm90Ci0gICAgZXhwZWN0ZWQgdG8gYmUgc2lnbmlmaWNhbnQuCi0KLSAgICBJdCB0dXJucyBvdXQgdGhhdCBjb252ZXJ0aW5nIHRvIGFuIFhNTCBvciBTR01MIHN5c3RlbSBob2xkcwotICAgIHByb21pc2UgZm9yIHRyYW5zbGF0b3JzIGFzIHdlbGw7IGhvdyBtdWNoIGNhbiBiZSBkb25lIHRvIGVhc2UgdGhlCi0gICAgYnVyZGVuIG9uIHRyYW5zbGF0b3JzIHJlbWFpbnMgdG8gYmUgc2VlbiwgYW5kIG1heSBoYXZlIHNvbWUgaW1wYWN0Ci0gICAgb24gdGhlIHNjaGVtYSBhbmQgc3BlY2lmaWMgdGVjaG5vbG9naWVzIHVzZWQuCi0KLSAgICBYWFggRXZlbnR1YWwgbWlncmF0aW9uIHRvIFhNTC4KLQotICAgIFRoZSBkb2N1bWVudGF0aW9uIHdpbGwgYmUgbW92ZWQgdG8gWE1MIGluIHRoZSBmdXR1cmUsIGFuZCB0b29scwotICAgIGFyZSBiZWluZyB3cml0dGVuIHdoaWNoIHdpbGwgY29udmVydCB0aGUgZG9jdW1lbnRhdGlvbiBmcm9tIHRoZQotICAgIGN1cnJlbnQgZm9ybWF0IHRvIHNvbWV0aGluZyBjbG9zZSB0byBhIGZpbmlzaGVkIHZlcnNpb24sIHRvIHRoZQotICAgIGV4dGVudCB0aGF0IHRoZSBkZXNpcmVkIGluZm9ybWF0aW9uIGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUKLSAgICBkb2N1bWVudGF0aW9uLiAgU29tZSBYU0xUIHN0eWxlc2hlZXRzIGhhdmUgYmVlbiBzdGFydGVkIGZvcgotICAgIHByZXNlbnRpbmcgYSBwcmVsaW1pbmFyeSBYTUwgdmVyc2lvbiBhcyBIVE1MLCBidXQgdGhlIHJlc3VsdHMgYXJlCi0gICAgZmFpcmx5IHJvdWdoLgotCi0gICAgVGhlIHRpbWVmcmFtZSBmb3IgdGhlIGNvbnZlcnNpb24gaXMgbm90IGNsZWFyIHNpbmNlIHRoZXJlIGRvZXNuJ3QKLSAgICBzZWVtIHRvIGJlIG11Y2ggdGltZSBhdmFpbGFibGUgdG8gd29yayBvbiB0aGlzLCBidXQgdGhlIGFwcGFyZW50Ci0gICAgYmVuZWZpdHMgYXJlIGdyb3dpbmcgbW9yZSBzdWJzdGFudGlhbCBhdCBhIG1vZGVyYXRlbHkgcmFwaWQgcGFjZS4KLQotCi0gIFxzdWJzZWN0aW9ue0Rpc2N1c3Npb24gRm9ydW1zIFxsYWJlbHtkaXNjdXNzaW9ufX0KLQotICAgIERpc2N1c3Npb24gb2YgdGhlIGZ1dHVyZSBvZiB0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24gYW5kIHJlbGF0ZWQKLSAgICB0b3BpY3MgdGFrZXMgcGxhY2UgaW4gdGhlIERvY3VtZW50YXRpb24gU3BlY2lhbCBJbnRlcmVzdCBHcm91cCwgb3IKLSAgICBgYERvYy1TSUcuJycgIEluZm9ybWF0aW9uIG9uIHRoZSBncm91cCwgaW5jbHVkaW5nIG1haWxpbmcgbGlzdAotICAgIGFyY2hpdmVzIGFuZCBzdWJzY3JpcHRpb24gaW5mb3JtYXRpb24sIGlzIGF2YWlsYWJsZSBhdAotICAgIFx1cmx7aHR0cDovL3d3dy5weXRob24ub3JnL3NpZ3MvZG9jLXNpZy99LiAgVGhlIFNJRyBpcyBvcGVuIHRvIGFsbAotICAgIGludGVyZXN0ZWQgcGFydGllcy4KLQotICAgIENvbW1lbnRzIGFuZCBidWcgcmVwb3J0cyBvbiB0aGUgc3RhbmRhcmQgZG9jdW1lbnRzIHNob3VsZCBiZSBzZW50Ci0gICAgdG8gXGVtYWlse2RvY3NAcHl0aG9uLm9yZ30uICBUaGlzIG1heSBpbmNsdWRlIGNvbW1lbnRzCi0gICAgYWJvdXQgZm9ybWF0dGluZywgY29udGVudCwgZ3JhbW1hdGljYWwgYW5kIHNwZWxsaW5nIGVycm9ycywgb3IKLSAgICB0aGlzIGRvY3VtZW50LiAgWW91IGNhbiBhbHNvIHNlbmQgY29tbWVudHMgb24gdGhpcyBkb2N1bWVudAotICAgIGRpcmVjdGx5IHRvIHRoZSBhdXRob3IgYXQgXGVtYWlse2ZkcmFrZUBhY20ub3JnfS4KLQotXGlucHV0e2RvYy5pbmR9Ci0KLVxlbmR7ZG9jdW1lbnR9CmRpZmYgLS1naXQgYS9Eb2MvZXh0L2J1aWxkaW5nLnRleCBiL0RvYy9leHQvYnVpbGRpbmcudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjM4NGMxLi4wMDAwMDAwCi0tLSBhL0RvYy9leHQvYnVpbGRpbmcudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLVxjaGFwdGVye0J1aWxkaW5nIEMgYW5kIFxDcHB7fSBFeHRlbnNpb25zIHdpdGggZGlzdHV0aWxzCi0gICAgIFxsYWJlbHtidWlsZGluZ319Ci0KLVxzZWN0aW9uYXV0aG9ye01hcnRpbiB2LiBMXCJvd2lzfXttYXJ0aW5Adi5sb2V3aXMuZGV9Ci0KLVN0YXJ0aW5nIGluIFB5dGhvbiAxLjQsIFB5dGhvbiBwcm92aWRlcywgb24gXFVOSVh7fSwgYSBzcGVjaWFsIG1ha2UKLWZpbGUgZm9yIGJ1aWxkaW5nIG1ha2UgZmlsZXMgZm9yIGJ1aWxkaW5nIGR5bmFtaWNhbGx5LWxpbmtlZAotZXh0ZW5zaW9ucyBhbmQgY3VzdG9tIGludGVycHJldGVycy4gIFN0YXJ0aW5nIHdpdGggUHl0aG9uIDIuMCwgdGhpcwotbWVjaGFuaXNtIChrbm93biBhcyByZWxhdGVkIHRvIE1ha2VmaWxlLnByZS5pbiwgYW5kIFNldHVwIGZpbGVzKSBpcyBubwotbG9uZ2VyIHN1cHBvcnRlZC4gQnVpbGRpbmcgY3VzdG9tIGludGVycHJldGVycyB3YXMgcmFyZWx5IHVzZWQsIGFuZAotZXh0ZW5zaW9uIG1vZHVsZXMgY2FuIGJlIGJ1aWx0IHVzaW5nIGRpc3R1dGlscy4KLQotQnVpbGRpbmcgYW4gZXh0ZW5zaW9uIG1vZHVsZSB1c2luZyBkaXN0dXRpbHMgcmVxdWlyZXMgdGhhdCBkaXN0dXRpbHMKLWlzIGluc3RhbGxlZCBvbiB0aGUgYnVpbGQgbWFjaGluZSwgd2hpY2ggaXMgaW5jbHVkZWQgaW4gUHl0aG9uIDIueCBhbmQKLWF2YWlsYWJsZSBzZXBhcmF0ZWx5IGZvciBQeXRob24gMS41LiBTaW5jZSBkaXN0dXRpbHMgYWxzbyBzdXBwb3J0cwotY3JlYXRpb24gb2YgYmluYXJ5IHBhY2thZ2VzLCB1c2VycyBkb24ndCBuZWNlc3NhcmlseSBuZWVkIGEgY29tcGlsZXIKLWFuZCBkaXN0dXRpbHMgdG8gaW5zdGFsbCB0aGUgZXh0ZW5zaW9uLgotCi1BIGRpc3R1dGlscyBwYWNrYWdlIGNvbnRhaW5zIGEgZHJpdmVyIHNjcmlwdCwgXGZpbGV7c2V0dXAucHl9LiBUaGlzIGlzCi1hIHBsYWluIFB5dGhvbiBmaWxlLCB3aGljaCwgaW4gdGhlIG1vc3Qgc2ltcGxlIGNhc2UsIGNvdWxkIGxvb2sgbGlrZQotdGhpczoKLQotXGJlZ2lue3ZlcmJhdGltfQotZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAsIEV4dGVuc2lvbgotCi1tb2R1bGUxID0gRXh0ZW5zaW9uKCdkZW1vJywKLSAgICAgICAgICAgICAgICAgICAgc291cmNlcyA9IFsnZGVtby5jJ10pCi0KLXNldHVwIChuYW1lID0gJ1BhY2thZ2VOYW1lJywKLSAgICAgICB2ZXJzaW9uID0gJzEuMCcsCi0gICAgICAgZGVzY3JpcHRpb24gPSAnVGhpcyBpcyBhIGRlbW8gcGFja2FnZScsCi0gICAgICAgZXh0X21vZHVsZXMgPSBbbW9kdWxlMV0pCi0KLVxlbmR7dmVyYmF0aW19Ci0KLVdpdGggdGhpcyBcZmlsZXtzZXR1cC5weX0sIGFuZCBhIGZpbGUgXGZpbGV7ZGVtby5jfSwgcnVubmluZwotCi1cYmVnaW57dmVyYmF0aW19Ci1weXRob24gc2V0dXAucHkgYnVpbGQgCi1cZW5ke3ZlcmJhdGltfQotCi13aWxsIGNvbXBpbGUgXGZpbGV7ZGVtby5jfSwgYW5kIHByb2R1Y2UgYW4gZXh0ZW5zaW9uIG1vZHVsZSBuYW1lZAotXHNhbXB7ZGVtb30gaW4gdGhlIFxmaWxle2J1aWxkfSBkaXJlY3RvcnkuIERlcGVuZGluZyBvbiB0aGUgc3lzdGVtLAotdGhlIG1vZHVsZSBmaWxlIHdpbGwgZW5kIHVwIGluIGEgc3ViZGlyZWN0b3J5IFxmaWxle2J1aWxkL2xpYi5zeXN0ZW19LAotYW5kIG1heSBoYXZlIGEgbmFtZSBsaWtlIFxmaWxle2RlbW8uc299IG9yIFxmaWxle2RlbW8ucHlkfS4KLQotSW4gdGhlIFxmaWxle3NldHVwLnB5fSwgYWxsIGV4ZWN1dGlvbiBpcyBwZXJmb3JtZWQgYnkgY2FsbGluZyB0aGUKLVxzYW1we3NldHVwfSBmdW5jdGlvbi4gVGhpcyB0YWtlcyBhIHZhcmlhYmxlIG51bWJlciBvZiBrZXl3b3JkIAotYXJndW1lbnRzLCBvZiB3aGljaCB0aGUgZXhhbXBsZSBhYm92ZSB1c2VzIG9ubHkgYQotc3Vic2V0LiBTcGVjaWZpY2FsbHksIHRoZSBleGFtcGxlIHNwZWNpZmllcyBtZXRhLWluZm9ybWF0aW9uIHRvIGJ1aWxkCi1wYWNrYWdlcywgYW5kIGl0IHNwZWNpZmllcyB0aGUgY29udGVudHMgb2YgdGhlIHBhY2thZ2UuICBOb3JtYWxseSwgYQotcGFja2FnZSB3aWxsIGNvbnRhaW4gb2YgYWRkaXRpb24gbW9kdWxlcywgbGlrZSBQeXRob24gc291cmNlIG1vZHVsZXMsCi1kb2N1bWVudGF0aW9uLCBzdWJwYWNrYWdlcywgZXRjLiBQbGVhc2UgcmVmZXIgdG8gdGhlIGRpc3R1dGlscwotZG9jdW1lbnRhdGlvbiBpbiBcY2l0ZXRpdGxlWy4uL2Rpc3QvZGlzdC5odG1sXXtEaXN0cmlidXRpbmcgUHl0aG9uCi1Nb2R1bGVzfSB0byBsZWFybiBtb3JlIGFib3V0IHRoZSBmZWF0dXJlcyBvZiBkaXN0dXRpbHM7IHRoaXMgc2VjdGlvbgotZXhwbGFpbnMgYnVpbGRpbmcgZXh0ZW5zaW9uIG1vZHVsZXMgb25seS4KLQotSXQgaXMgY29tbW9uIHRvIHByZS1jb21wdXRlIGFyZ3VtZW50cyB0byBcZnVuY3Rpb257c2V0dXB9LCB0byBiZXR0ZXIKLXN0cnVjdHVyZSB0aGUgZHJpdmVyIHNjcmlwdC4gSW4gdGhlIGV4YW1wbGUgYWJvdmUsCi10aGVcc2FtcHtleHRfbW9kdWxlc30gYXJndW1lbnQgdG8gXGZ1bmN0aW9ue3NldHVwfSBpcyBhIGxpc3Qgb2YKLWV4dGVuc2lvbiBtb2R1bGVzLCBlYWNoIG9mIHdoaWNoIGlzIGFuIGluc3RhbmNlIG9mIHRoZQotXGNsYXNze0V4dGVuc2lvbn0uIEluIHRoZSBleGFtcGxlLCB0aGUgaW5zdGFuY2UgZGVmaW5lcyBhbiBleHRlbnNpb24KLW5hbWVkIFxzYW1we2RlbW99IHdoaWNoIGlzIGJ1aWxkIGJ5IGNvbXBpbGluZyBhIHNpbmdsZSBzb3VyY2UgZmlsZSwKLVxmaWxle2RlbW8uY30uCi0KLUluIG1hbnkgY2FzZXMsIGJ1aWxkaW5nIGFuIGV4dGVuc2lvbiBpcyBtb3JlIGNvbXBsZXgsIHNpbmNlIGFkZGl0aW9uYWwKLXByZXByb2Nlc3NvciBkZWZpbmVzIGFuZCBsaWJyYXJpZXMgbWF5IGJlIG5lZWRlZC4gVGhpcyBpcyBkZW1vbnN0cmF0ZWQKLWluIHRoZSBleGFtcGxlIGJlbG93LgotCi1cYmVnaW57dmVyYmF0aW19Ci1mcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBzZXR1cCwgRXh0ZW5zaW9uCi0KLW1vZHVsZTEgPSBFeHRlbnNpb24oJ2RlbW8nLAotICAgICAgICAgICAgICAgICAgICBkZWZpbmVfbWFjcm9zID0gWygnTUFKT1JfVkVSU0lPTicsICcxJyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdNSU5PUl9WRVJTSU9OJywgJzAnKV0sCi0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfZGlycyA9IFsnL3Vzci9sb2NhbC9pbmNsdWRlJ10sCi0gICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcyA9IFsndGNsODMnXSwKLSAgICAgICAgICAgICAgICAgICAgbGlicmFyeV9kaXJzID0gWycvdXNyL2xvY2FsL2xpYiddLAotICAgICAgICAgICAgICAgICAgICBzb3VyY2VzID0gWydkZW1vLmMnXSkKLQotc2V0dXAgKG5hbWUgPSAnUGFja2FnZU5hbWUnLAotICAgICAgIHZlcnNpb24gPSAnMS4wJywKLSAgICAgICBkZXNjcmlwdGlvbiA9ICdUaGlzIGlzIGEgZGVtbyBwYWNrYWdlJywKLSAgICAgICBhdXRob3IgPSAnTWFydGluIHYuIExvZXdpcycsCi0gICAgICAgYXV0aG9yX2VtYWlsID0gJ21hcnRpbkB2LmxvZXdpcy5kZScsCi0gICAgICAgdXJsID0gJ2h0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvY3VycmVudC9leHQvYnVpbGRpbmcuaHRtbCcsCi0gICAgICAgbG9uZ19kZXNjcmlwdGlvbiA9ICcnJwotVGhpcyBpcyByZWFsbHkganVzdCBhIGRlbW8gcGFja2FnZS4KLScnJywKLSAgICAgICBleHRfbW9kdWxlcyA9IFttb2R1bGUxXSkKLQotXGVuZHt2ZXJiYXRpbX0KLQotSW4gdGhpcyBleGFtcGxlLCBcZnVuY3Rpb257c2V0dXB9IGlzIGNhbGxlZCB3aXRoIGFkZGl0aW9uYWwKLW1ldGEtaW5mb3JtYXRpb24sIHdoaWNoIGlzIHJlY29tbWVuZGVkIHdoZW4gZGlzdHJpYnV0aW9uIHBhY2thZ2VzIGhhdmUKLXRvIGJlIGJ1aWx0LiBGb3IgdGhlIGV4dGVuc2lvbiBpdHNlbGYsIGl0IHNwZWNpZmllcyBwcmVwcm9jZXNzb3IKLWRlZmluZXMsIGluY2x1ZGUgZGlyZWN0b3JpZXMsIGxpYnJhcnkgZGlyZWN0b3JpZXMsIGFuZCBsaWJyYXJpZXMuCi1EZXBlbmRpbmcgb24gdGhlIGNvbXBpbGVyLCBkaXN0dXRpbHMgcGFzc2VzIHRoaXMgaW5mb3JtYXRpb24gaW4KLWRpZmZlcmVudCB3YXlzIHRvIHRoZSBjb21waWxlci4gRm9yIGV4YW1wbGUsIG9uIFxVTklYe30sIHRoaXMgbWF5Ci1yZXN1bHQgaW4gdGhlIGNvbXBpbGF0aW9uIGNvbW1hbmRzCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLWdjYyAtRE5ERUJVRyAtZyAtTzMgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtZlBJQyAtRE1BSk9SX1ZFUlNJT049MSAtRE1JTk9SX1ZFUlNJT049MCAtSS91c3IvbG9jYWwvaW5jbHVkZSAtSS91c3IvbG9jYWwvaW5jbHVkZS9weXRob24yLjIgLWMgZGVtby5jIC1vIGJ1aWxkL3RlbXAubGludXgtaTY4Ni0yLjIvZGVtby5vCi0KLWdjYyAtc2hhcmVkIGJ1aWxkL3RlbXAubGludXgtaTY4Ni0yLjIvZGVtby5vIC1ML3Vzci9sb2NhbC9saWIgLWx0Y2w4MyAtbyBidWlsZC9saWIubGludXgtaTY4Ni0yLjIvZGVtby5zbwotXGVuZHt2ZXJiYXRpbX0KLQotVGhlc2UgbGluZXMgYXJlIGZvciBkZW1vbnN0cmF0aW9uIHB1cnBvc2VzIG9ubHk7IGRpc3R1dGlscyB1c2Vycwotc2hvdWxkIHRydXN0IHRoYXQgZGlzdHV0aWxzIGdldHMgdGhlIGludm9jYXRpb25zIHJpZ2h0LgotCi1cc2VjdGlvbntEaXN0cmlidXRpbmcgeW91ciBleHRlbnNpb24gbW9kdWxlcwotICAgICBcbGFiZWx7ZGlzdHJpYnV0aW5nfX0KLQotV2hlbiBhbiBleHRlbnNpb24gaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGJ1aWxkLCB0aGVyZSBhcmUgdGhyZWUgd2F5cyB0bwotdXNlIGl0LgotCi1FbmQtdXNlcnMgd2lsbCB0eXBpY2FsbHkgd2FudCB0byBpbnN0YWxsIHRoZSBtb2R1bGUsIHRoZXkgZG8gc28gYnkKLXJ1bm5pbmcKLQotXGJlZ2lue3ZlcmJhdGltfQotcHl0aG9uIHNldHVwLnB5IGluc3RhbGwKLVxlbmR7dmVyYmF0aW19Ci0KLU1vZHVsZSBtYWludGFpbmVycyBzaG91bGQgcHJvZHVjZSBzb3VyY2UgcGFja2FnZXM7IHRvIGRvIHNvLCB0aGV5IHJ1bgotCi1cYmVnaW57dmVyYmF0aW19Ci1weXRob24gc2V0dXAucHkgc2Rpc3QKLVxlbmR7dmVyYmF0aW19Ci0KLUluIHNvbWUgY2FzZXMsIGFkZGl0aW9uYWwgZmlsZXMgbmVlZCB0byBiZSBpbmNsdWRlZCBpbiBhIHNvdXJjZQotZGlzdHJpYnV0aW9uOyB0aGlzIGlzIGRvbmUgdGhyb3VnaCBhIFxmaWxle01BTklGRVNULmlufSBmaWxlOyBzZWUgdGhlCi1kaXN0dXRpbHMgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy4KLQotSWYgdGhlIHNvdXJjZSBkaXN0cmlidXRpb24gaGFzIGJlZW4gYnVpbGQgc3VjY2Vzc2Z1bGx5LCBtYWludGFpbmVycwotY2FuIGFsc28gY3JlYXRlIGJpbmFyeSBkaXN0cmlidXRpb25zLiBEZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtLCBvbmUKLW9mIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMgY2FuIGJlIHVzZWQgdG8gZG8gc28uCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLXB5dGhvbiBzZXR1cC5weSBiZGlzdF93aW5pbnN0Ci1weXRob24gc2V0dXAucHkgYmRpc3RfcnBtCi1weXRob24gc2V0dXAucHkgYmRpc3RfZHVtYgotXGVuZHt2ZXJiYXRpbX0KLQpkaWZmIC0tZ2l0IGEvRG9jL2V4dC9lbWJlZGRpbmcudGV4IGIvRG9jL2V4dC9lbWJlZGRpbmcudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGVjNWNhLi4wMDAwMDAwCi0tLSBhL0RvYy9leHQvZW1iZWRkaW5nLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi1cY2hhcHRlcntFbWJlZGRpbmcgUHl0aG9uIGluIEFub3RoZXIgQXBwbGljYXRpb24KLSAgICAgXGxhYmVse2VtYmVkZGluZ319Ci0KLVRoZSBwcmV2aW91cyBjaGFwdGVycyBkaXNjdXNzZWQgaG93IHRvIGV4dGVuZCBQeXRob24sIHRoYXQgaXMsIGhvdyB0bwotZXh0ZW5kIHRoZSBmdW5jdGlvbmFsaXR5IG9mIFB5dGhvbiBieSBhdHRhY2hpbmcgYSBsaWJyYXJ5IG9mIEMKLWZ1bmN0aW9ucyB0byBpdC4gIEl0IGlzIGFsc28gcG9zc2libGUgdG8gZG8gaXQgdGhlIG90aGVyIHdheSBhcm91bmQ6Ci1lbnJpY2ggeW91ciBDL1xDcHB7fSBhcHBsaWNhdGlvbiBieSBlbWJlZGRpbmcgUHl0aG9uIGluIGl0LiAgRW1iZWRkaW5nCi1wcm92aWRlcyB5b3VyIGFwcGxpY2F0aW9uIHdpdGggdGhlIGFiaWxpdHkgdG8gaW1wbGVtZW50IHNvbWUgb2YgdGhlCi1mdW5jdGlvbmFsaXR5IG9mIHlvdXIgYXBwbGljYXRpb24gaW4gUHl0aG9uIHJhdGhlciB0aGFuIEMgb3IgXENwcC4KLVRoaXMgY2FuIGJlIHVzZWQgZm9yIG1hbnkgcHVycG9zZXM7IG9uZSBleGFtcGxlIHdvdWxkIGJlIHRvIGFsbG93Ci11c2VycyB0byB0YWlsb3IgdGhlIGFwcGxpY2F0aW9uIHRvIHRoZWlyIG5lZWRzIGJ5IHdyaXRpbmcgc29tZSBzY3JpcHRzCi1pbiBQeXRob24uICBZb3UgY2FuIGFsc28gdXNlIGl0IHlvdXJzZWxmIGlmIHNvbWUgb2YgdGhlIGZ1bmN0aW9uYWxpdHkKLWNhbiBiZSB3cml0dGVuIGluIFB5dGhvbiBtb3JlIGVhc2lseS4KLQotRW1iZWRkaW5nIFB5dGhvbiBpcyBzaW1pbGFyIHRvIGV4dGVuZGluZyBpdCwgYnV0IG5vdCBxdWl0ZS4gIFRoZQotZGlmZmVyZW5jZSBpcyB0aGF0IHdoZW4geW91IGV4dGVuZCBQeXRob24sIHRoZSBtYWluIHByb2dyYW0gb2YgdGhlCi1hcHBsaWNhdGlvbiBpcyBzdGlsbCB0aGUgUHl0aG9uIGludGVycHJldGVyLCB3aGlsZSBpZiB5b3UgZW1iZWQKLVB5dGhvbiwgdGhlIG1haW4gcHJvZ3JhbSBtYXkgaGF2ZSBub3RoaW5nIHRvIGRvIHdpdGggUHl0aG9uIC0tLQotaW5zdGVhZCwgc29tZSBwYXJ0cyBvZiB0aGUgYXBwbGljYXRpb24gb2NjYXNpb25hbGx5IGNhbGwgdGhlIFB5dGhvbgotaW50ZXJwcmV0ZXIgdG8gcnVuIHNvbWUgUHl0aG9uIGNvZGUuCi0KLVNvIGlmIHlvdSBhcmUgZW1iZWRkaW5nIFB5dGhvbiwgeW91IGFyZSBwcm92aWRpbmcgeW91ciBvd24gbWFpbgotcHJvZ3JhbS4gIE9uZSBvZiB0aGUgdGhpbmdzIHRoaXMgbWFpbiBwcm9ncmFtIGhhcyB0byBkbyBpcyBpbml0aWFsaXplCi10aGUgUHl0aG9uIGludGVycHJldGVyLiAgQXQgdGhlIHZlcnkgbGVhc3QsIHlvdSBoYXZlIHRvIGNhbGwgdGhlCi1mdW5jdGlvbiBcY2Z1bmN0aW9ue1B5X0luaXRpYWxpemUoKX0gKG9uIE1hYyBPUywgY2FsbAotXGNmdW5jdGlvbntQeU1hY19Jbml0aWFsaXplKCl9IGluc3RlYWQpLiAgVGhlcmUgYXJlIG9wdGlvbmFsIGNhbGxzIHRvCi1wYXNzIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gUHl0aG9uLiAgVGhlbiBsYXRlciB5b3UgY2FuIGNhbGwgdGhlCi1pbnRlcnByZXRlciBmcm9tIGFueSBwYXJ0IG9mIHRoZSBhcHBsaWNhdGlvbi4KLQotVGhlcmUgYXJlIHNldmVyYWwgZGlmZmVyZW50IHdheXMgdG8gY2FsbCB0aGUgaW50ZXJwcmV0ZXI6IHlvdSBjYW4gcGFzcwotYSBzdHJpbmcgY29udGFpbmluZyBQeXRob24gc3RhdGVtZW50cyB0bwotXGNmdW5jdGlvbntQeVJ1bl9TaW1wbGVTdHJpbmcoKX0sIG9yIHlvdSBjYW4gcGFzcyBhIHN0ZGlvIGZpbGUgcG9pbnRlcgotYW5kIGEgZmlsZSBuYW1lIChmb3IgaWRlbnRpZmljYXRpb24gaW4gZXJyb3IgbWVzc2FnZXMgb25seSkgdG8KLVxjZnVuY3Rpb257UHlSdW5fU2ltcGxlRmlsZSgpfS4gIFlvdSBjYW4gYWxzbyBjYWxsIHRoZSBsb3dlci1sZXZlbAotb3BlcmF0aW9ucyBkZXNjcmliZWQgaW4gdGhlIHByZXZpb3VzIGNoYXB0ZXJzIHRvIGNvbnN0cnVjdCBhbmQgdXNlCi1QeXRob24gb2JqZWN0cy4KLQotQSBzaW1wbGUgZGVtbyBvZiBlbWJlZGRpbmcgUHl0aG9uIGNhbiBiZSBmb3VuZCBpbiB0aGUgZGlyZWN0b3J5Ci1cZmlsZXtEZW1vL2VtYmVkL30gb2YgdGhlIHNvdXJjZSBkaXN0cmlidXRpb24uCi0KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWV0aXRsZVsuLi9hcGkvYXBpLmh0bWxde1B5dGhvbi9DIEFQSSBSZWZlcmVuY2UgTWFudWFsfXtUaGUKLSAgICAgICAgICAgIGRldGFpbHMgb2YgUHl0aG9uJ3MgQyBpbnRlcmZhY2UgYXJlIGdpdmVuIGluIHRoaXMgbWFudWFsLgotICAgICAgICAgICAgQSBncmVhdCBkZWFsIG9mIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaGVyZS59Ci1cZW5ke3NlZWFsc299Ci0KLQotXHNlY3Rpb257VmVyeSBIaWdoIExldmVsIEVtYmVkZGluZwotICAgICAgICAgXGxhYmVse2hpZ2gtbGV2ZWwtZW1iZWRkaW5nfX0KLQotVGhlIHNpbXBsZXN0IGZvcm0gb2YgZW1iZWRkaW5nIFB5dGhvbiBpcyB0aGUgdXNlIG9mIHRoZSB2ZXJ5Ci1oaWdoIGxldmVsIGludGVyZmFjZS4gVGhpcyBpbnRlcmZhY2UgaXMgaW50ZW5kZWQgdG8gZXhlY3V0ZSBhCi1QeXRob24gc2NyaXB0IHdpdGhvdXQgbmVlZGluZyB0byBpbnRlcmFjdCB3aXRoIHRoZSBhcHBsaWNhdGlvbgotZGlyZWN0bHkuIFRoaXMgY2FuIGZvciBleGFtcGxlIGJlIHVzZWQgdG8gcGVyZm9ybSBzb21lIG9wZXJhdGlvbgotb24gYSBmaWxlLgotCi1cYmVnaW57dmVyYmF0aW19Ci0jaW5jbHVkZSA8UHl0aG9uLmg+Ci0KLWludAotbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICBQeV9Jbml0aWFsaXplKCk7Ci0gIFB5UnVuX1NpbXBsZVN0cmluZygiZnJvbSB0aW1lIGltcG9ydCB0aW1lLGN0aW1lXG4iCi0gICAgICAgICAgICAgICAgICAgICAicHJpbnQgJ1RvZGF5IGlzJyxjdGltZSh0aW1lKCkpXG4iKTsKLSAgUHlfRmluYWxpemUoKTsKLSAgcmV0dXJuIDA7Ci19Ci1cZW5ke3ZlcmJhdGltfQotCi1UaGUgYWJvdmUgY29kZSBmaXJzdCBpbml0aWFsaXplcyB0aGUgUHl0aG9uIGludGVycHJldGVyIHdpdGgKLVxjZnVuY3Rpb257UHlfSW5pdGlhbGl6ZSgpfSwgZm9sbG93ZWQgYnkgdGhlIGV4ZWN1dGlvbiBvZiBhIGhhcmQtY29kZWQKLVB5dGhvbiBzY3JpcHQgdGhhdCBwcmludCB0aGUgZGF0ZSBhbmQgdGltZS4gIEFmdGVyd2FyZHMsIHRoZQotXGNmdW5jdGlvbntQeV9GaW5hbGl6ZSgpfSBjYWxsIHNodXRzIHRoZSBpbnRlcnByZXRlciBkb3duLCBmb2xsb3dlZCBieQotdGhlIGVuZCBvZiB0aGUgcHJvZ3JhbS4gIEluIGEgcmVhbCBwcm9ncmFtLCB5b3UgbWF5IHdhbnQgdG8gZ2V0IHRoZQotUHl0aG9uIHNjcmlwdCBmcm9tIGFub3RoZXIgc291cmNlLCBwZXJoYXBzIGEgdGV4dC1lZGl0b3Igcm91dGluZSwgYQotZmlsZSwgb3IgYSBkYXRhYmFzZS4gIEdldHRpbmcgdGhlIFB5dGhvbiBjb2RlIGZyb20gYSBmaWxlIGNhbiBiZXR0ZXIKLWJlIGRvbmUgYnkgdXNpbmcgdGhlIFxjZnVuY3Rpb257UHlSdW5fU2ltcGxlRmlsZSgpfSBmdW5jdGlvbiwgd2hpY2gKLXNhdmVzIHlvdSB0aGUgdHJvdWJsZSBvZiBhbGxvY2F0aW5nIG1lbW9yeSBzcGFjZSBhbmQgbG9hZGluZyB0aGUgZmlsZQotY29udGVudHMuCi0KLQotXHNlY3Rpb257QmV5b25kIFZlcnkgSGlnaCBMZXZlbCBFbWJlZGRpbmc6IEFuIG92ZXJ2aWV3Ci0gICAgICAgICBcbGFiZWx7bG93ZXItbGV2ZWwtZW1iZWRkaW5nfX0KLQotVGhlIGhpZ2ggbGV2ZWwgaW50ZXJmYWNlIGdpdmVzIHlvdSB0aGUgYWJpbGl0eSB0byBleGVjdXRlCi1hcmJpdHJhcnkgcGllY2VzIG9mIFB5dGhvbiBjb2RlIGZyb20geW91ciBhcHBsaWNhdGlvbiwgYnV0Ci1leGNoYW5naW5nIGRhdGEgdmFsdWVzIGlzIHF1aXRlIGN1bWJlcnNvbWUgdG8gc2F5IHRoZSBsZWFzdC4gSWYKLXlvdSB3YW50IHRoYXQsIHlvdSBzaG91bGQgdXNlIGxvd2VyIGxldmVsIGNhbGxzLiBBdCB0aGUgY29zdCBvZgotaGF2aW5nIHRvIHdyaXRlIG1vcmUgQyBjb2RlLCB5b3UgY2FuIGFjaGlldmUgYWxtb3N0IGFueXRoaW5nLgotCi1JdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBleHRlbmRpbmcgUHl0aG9uIGFuZCBlbWJlZGRpbmcgUHl0aG9uCi1pcyBxdWl0ZSB0aGUgc2FtZSBhY3Rpdml0eSwgZGVzcGl0ZSB0aGUgZGlmZmVyZW50IGludGVudC4gTW9zdAotdG9waWNzIGRpc2N1c3NlZCBpbiB0aGUgcHJldmlvdXMgY2hhcHRlcnMgYXJlIHN0aWxsIHZhbGlkLiBUbwotc2hvdyB0aGlzLCBjb25zaWRlciB3aGF0IHRoZSBleHRlbnNpb24gY29kZSBmcm9tIFB5dGhvbiB0byBDCi1yZWFsbHkgZG9lczoKLQotXGJlZ2lue2VudW1lcmF0ZX0KLSAgICBcaXRlbSBDb252ZXJ0IGRhdGEgdmFsdWVzIGZyb20gUHl0aG9uIHRvIEMsCi0gICAgXGl0ZW0gUGVyZm9ybSBhIGZ1bmN0aW9uIGNhbGwgdG8gYSBDIHJvdXRpbmUgdXNpbmcgdGhlCi0gICAgICAgIGNvbnZlcnRlZCB2YWx1ZXMsIGFuZAotICAgIFxpdGVtIENvbnZlcnQgdGhlIGRhdGEgdmFsdWVzIGZyb20gdGhlIGNhbGwgZnJvbSBDIHRvIFB5dGhvbi4KLVxlbmR7ZW51bWVyYXRlfQotCi1XaGVuIGVtYmVkZGluZyBQeXRob24sIHRoZSBpbnRlcmZhY2UgY29kZSBkb2VzOgotCi1cYmVnaW57ZW51bWVyYXRlfQotICAgIFxpdGVtIENvbnZlcnQgZGF0YSB2YWx1ZXMgZnJvbSBDIHRvIFB5dGhvbiwKLSAgICBcaXRlbSBQZXJmb3JtIGEgZnVuY3Rpb24gY2FsbCB0byBhIFB5dGhvbiBpbnRlcmZhY2Ugcm91dGluZQotICAgICAgICB1c2luZyB0aGUgY29udmVydGVkIHZhbHVlcywgYW5kCi0gICAgXGl0ZW0gQ29udmVydCB0aGUgZGF0YSB2YWx1ZXMgZnJvbSB0aGUgY2FsbCBmcm9tIFB5dGhvbiB0byBDLgotXGVuZHtlbnVtZXJhdGV9Ci0KLUFzIHlvdSBjYW4gc2VlLCB0aGUgZGF0YSBjb252ZXJzaW9uIHN0ZXBzIGFyZSBzaW1wbHkgc3dhcHBlZCB0bwotYWNjb21tb2RhdGUgdGhlIGRpZmZlcmVudCBkaXJlY3Rpb24gb2YgdGhlIGNyb3NzLWxhbmd1YWdlIHRyYW5zZmVyLgotVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGUgcm91dGluZSB0aGF0IHlvdSBjYWxsIGJldHdlZW4gYm90aAotZGF0YSBjb252ZXJzaW9ucy4gV2hlbiBleHRlbmRpbmcsIHlvdSBjYWxsIGEgQyByb3V0aW5lLCB3aGVuCi1lbWJlZGRpbmcsIHlvdSBjYWxsIGEgUHl0aG9uIHJvdXRpbmUuCi0KLVRoaXMgY2hhcHRlciB3aWxsIG5vdCBkaXNjdXNzIGhvdyB0byBjb252ZXJ0IGRhdGEgZnJvbSBQeXRob24KLXRvIEMgYW5kIHZpY2UgdmVyc2EuICBBbHNvLCBwcm9wZXIgdXNlIG9mIHJlZmVyZW5jZXMgYW5kIGRlYWxpbmcKLXdpdGggZXJyb3JzIGlzIGFzc3VtZWQgdG8gYmUgdW5kZXJzdG9vZC4gIFNpbmNlIHRoZXNlIGFzcGVjdHMgZG8gbm90Ci1kaWZmZXIgZnJvbSBleHRlbmRpbmcgdGhlIGludGVycHJldGVyLCB5b3UgY2FuIHJlZmVyIHRvIGVhcmxpZXIKLWNoYXB0ZXJzIGZvciB0aGUgcmVxdWlyZWQgaW5mb3JtYXRpb24uCi0KLQotXHNlY3Rpb257UHVyZSBFbWJlZGRpbmcKLSAgICAgICAgIFxsYWJlbHtwdXJlLWVtYmVkZGluZ319Ci0KLVRoZSBmaXJzdCBwcm9ncmFtIGFpbXMgdG8gZXhlY3V0ZSBhIGZ1bmN0aW9uIGluIGEgUHl0aG9uCi1zY3JpcHQuIExpa2UgaW4gdGhlIHNlY3Rpb24gYWJvdXQgdGhlIHZlcnkgaGlnaCBsZXZlbCBpbnRlcmZhY2UsCi10aGUgUHl0aG9uIGludGVycHJldGVyIGRvZXMgbm90IGRpcmVjdGx5IGludGVyYWN0IHdpdGggdGhlCi1hcHBsaWNhdGlvbiAoYnV0IHRoYXQgd2lsbCBjaGFuZ2UgaW4gdGhlIG5leHQgc2VjdGlvbikuCi0KLVRoZSBjb2RlIHRvIHJ1biBhIGZ1bmN0aW9uIGRlZmluZWQgaW4gYSBQeXRob24gc2NyaXB0IGlzOgotCi1cdmVyYmF0aW1pbnB1dHtydW4tZnVuYy5jfQotCi1UaGlzIGNvZGUgbG9hZHMgYSBQeXRob24gc2NyaXB0IHVzaW5nIFxjb2Rle2FyZ3ZbMV19LCBhbmQgY2FsbHMgdGhlCi1mdW5jdGlvbiBuYW1lZCBpbiBcY29kZXthcmd2WzJdfS4gIEl0cyBpbnRlZ2VyIGFyZ3VtZW50cyBhcmUgdGhlIG90aGVyCi12YWx1ZXMgb2YgdGhlIFxjb2Rle2FyZ3Z9IGFycmF5LiAgSWYgeW91IGNvbXBpbGUgYW5kIGxpbmsgdGhpcwotcHJvZ3JhbSAobGV0J3MgY2FsbCB0aGUgZmluaXNoZWQgZXhlY3V0YWJsZSBccHJvZ3JhbXtjYWxsfSksIGFuZCB1c2UKLWl0IHRvIGV4ZWN1dGUgYSBQeXRob24gc2NyaXB0LCBzdWNoIGFzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1kZWYgbXVsdGlwbHkoYSxiKToKLSAgICBwcmludCAiV2lsbCBjb21wdXRlIiwgYSwgInRpbWVzIiwgYgotICAgIGMgPSAwCi0gICAgZm9yIGkgaW4gcmFuZ2UoMCwgYSk6Ci0gICAgICAgIGMgPSBjICsgYgotICAgIHJldHVybiBjCi1cZW5ke3ZlcmJhdGltfQotCi10aGVuIHRoZSByZXN1bHQgc2hvdWxkIGJlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0kIGNhbGwgbXVsdGlwbHkgbXVsdGlwbHkgMyAyCi1XaWxsIGNvbXB1dGUgMyB0aW1lcyAyCi1SZXN1bHQgb2YgY2FsbDogNgotXGVuZHt2ZXJiYXRpbX0gJSAkCi0KLUFsdGhvdWdoIHRoZSBwcm9ncmFtIGlzIHF1aXRlIGxhcmdlIGZvciBpdHMgZnVuY3Rpb25hbGl0eSwgbW9zdCBvZiB0aGUKLWNvZGUgaXMgZm9yIGRhdGEgY29udmVyc2lvbiBiZXR3ZWVuIFB5dGhvbiBhbmQgQywgYW5kIGZvciBlcnJvcgotcmVwb3J0aW5nLiAgVGhlIGludGVyZXN0aW5nIHBhcnQgd2l0aCByZXNwZWN0IHRvIGVtYmVkZGluZyBQeXRob24KLXN0YXJ0cyB3aXRoCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICBQeV9Jbml0aWFsaXplKCk7Ci0gICAgcE5hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGFyZ3ZbMV0pOwotICAgIC8qIEVycm9yIGNoZWNraW5nIG9mIHBOYW1lIGxlZnQgb3V0ICovCi0gICAgcE1vZHVsZSA9IFB5SW1wb3J0X0ltcG9ydChwTmFtZSk7Ci1cZW5ke3ZlcmJhdGltfQotCi1BZnRlciBpbml0aWFsaXppbmcgdGhlIGludGVycHJldGVyLCB0aGUgc2NyaXB0IGlzIGxvYWRlZCB1c2luZwotXGNmdW5jdGlvbntQeUltcG9ydF9JbXBvcnQoKX0uICBUaGlzIHJvdXRpbmUgbmVlZHMgYSBQeXRob24gc3RyaW5nCi1hcyBpdHMgYXJndW1lbnQsIHdoaWNoIGlzIGNvbnN0cnVjdGVkIHVzaW5nIHRoZQotXGNmdW5jdGlvbntQeVN0cmluZ19Gcm9tU3RyaW5nKCl9IGRhdGEgY29udmVyc2lvbiByb3V0aW5lLgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgcEZ1bmMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHBNb2R1bGUsIGFyZ3ZbMl0pOwotICAgIC8qIHBGdW5jIGlzIGEgbmV3IHJlZmVyZW5jZSAqLwotCi0gICAgaWYgKHBGdW5jICYmIFB5Q2FsbGFibGVfQ2hlY2socEZ1bmMpKSB7Ci0gICAgICAgIC4uLgotICAgIH0KLSAgICBQeV9YREVDUkVGKHBGdW5jKTsKLVxlbmR7dmVyYmF0aW19Ci0KLU9uY2UgdGhlIHNjcmlwdCBpcyBsb2FkZWQsIHRoZSBuYW1lIHdlJ3JlIGxvb2tpbmcgZm9yIGlzIHJldHJpZXZlZAotdXNpbmcgXGNmdW5jdGlvbntQeU9iamVjdF9HZXRBdHRyU3RyaW5nKCl9LiAgSWYgdGhlIG5hbWUgZXhpc3RzLCBhbmQKLXRoZSBvYmplY3QgcmV0dXJuZWQgaXMgY2FsbGFibGUsIHlvdSBjYW4gc2FmZWx5IGFzc3VtZSB0aGF0IGl0IGlzIGEKLWZ1bmN0aW9uLiAgVGhlIHByb2dyYW0gdGhlbiBwcm9jZWVkcyBieSBjb25zdHJ1Y3RpbmcgYSB0dXBsZSBvZgotYXJndW1lbnRzIGFzIG5vcm1hbC4gIFRoZSBjYWxsIHRvIHRoZSBQeXRob24gZnVuY3Rpb24gaXMgdGhlbiBtYWRlCi13aXRoOgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgcFZhbHVlID0gUHlPYmplY3RfQ2FsbE9iamVjdChwRnVuYywgcEFyZ3MpOwotXGVuZHt2ZXJiYXRpbX0KLQotVXBvbiByZXR1cm4gb2YgdGhlIGZ1bmN0aW9uLCBcY29kZXtwVmFsdWV9IGlzIGVpdGhlciBcTlVMTHt9IG9yIGl0Ci1jb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbi4gIEJlIHN1cmUgdG8KLXJlbGVhc2UgdGhlIHJlZmVyZW5jZSBhZnRlciBleGFtaW5pbmcgdGhlIHZhbHVlLgotCi0KLVxzZWN0aW9ue0V4dGVuZGluZyBFbWJlZGRlZCBQeXRob24KLSAgICAgICAgIFxsYWJlbHtleHRlbmRpbmctd2l0aC1lbWJlZGRpbmd9fQotCi1VbnRpbCBub3csIHRoZSBlbWJlZGRlZCBQeXRob24gaW50ZXJwcmV0ZXIgaGFkIG5vIGFjY2VzcyB0bwotZnVuY3Rpb25hbGl0eSBmcm9tIHRoZSBhcHBsaWNhdGlvbiBpdHNlbGYuICBUaGUgUHl0aG9uIEFQSSBhbGxvd3MgdGhpcwotYnkgZXh0ZW5kaW5nIHRoZSBlbWJlZGRlZCBpbnRlcnByZXRlci4gIFRoYXQgaXMsIHRoZSBlbWJlZGRlZAotaW50ZXJwcmV0ZXIgZ2V0cyBleHRlbmRlZCB3aXRoIHJvdXRpbmVzIHByb3ZpZGVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KLVdoaWxlIGl0IHNvdW5kcyBjb21wbGV4LCBpdCBpcyBub3Qgc28gYmFkLiAgU2ltcGx5IGZvcmdldCBmb3IgYSB3aGlsZQotdGhhdCB0aGUgYXBwbGljYXRpb24gc3RhcnRzIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIuICBJbnN0ZWFkLCBjb25zaWRlcgotdGhlIGFwcGxpY2F0aW9uIHRvIGJlIGEgc2V0IG9mIHN1YnJvdXRpbmVzLCBhbmQgd3JpdGUgc29tZSBnbHVlIGNvZGUKLXRoYXQgZ2l2ZXMgUHl0aG9uIGFjY2VzcyB0byB0aG9zZSByb3V0aW5lcywganVzdCBsaWtlIHlvdSB3b3VsZCB3cml0ZQotYSBub3JtYWwgUHl0aG9uIGV4dGVuc2lvbi4gIEZvciBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1zdGF0aWMgaW50IG51bWFyZ3M9MDsKLQotLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIG9mIHRoZSBhcHBsaWNhdGlvbiBjb21tYW5kIGxpbmUgKi8KLXN0YXRpYyBQeU9iamVjdCoKLWVtYl9udW1hcmdzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKLXsKLSAgICBpZighUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOm51bWFyZ3MiKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBudW1hcmdzKTsKLX0KLQotc3RhdGljIFB5TWV0aG9kRGVmIEVtYk1ldGhvZHNbXSA9IHsKLSAgICB7Im51bWFyZ3MiLCBlbWJfbnVtYXJncywgTUVUSF9WQVJBUkdTLAotICAgICAiUmV0dXJuIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHJlY2VpdmVkIGJ5IHRoZSBwcm9jZXNzLiJ9LAotICAgIHtOVUxMLCBOVUxMLCAwLCBOVUxMfQotfTsKLVxlbmR7dmVyYmF0aW19Ci0KLUluc2VydCB0aGUgYWJvdmUgY29kZSBqdXN0IGFib3ZlIHRoZSBcY2Z1bmN0aW9ue21haW4oKX0gZnVuY3Rpb24uCi1BbHNvLCBpbnNlcnQgdGhlIGZvbGxvd2luZyB0d28gc3RhdGVtZW50cyBkaXJlY3RseSBhZnRlcgotXGNmdW5jdGlvbntQeV9Jbml0aWFsaXplKCl9OgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgbnVtYXJncyA9IGFyZ2M7Ci0gICAgUHlfSW5pdE1vZHVsZSgiZW1iIiwgRW1iTWV0aG9kcyk7Ci1cZW5ke3ZlcmJhdGltfQotCi1UaGVzZSB0d28gbGluZXMgaW5pdGlhbGl6ZSB0aGUgXGNvZGV7bnVtYXJnc30gdmFyaWFibGUsIGFuZCBtYWtlIHRoZQotXGZ1bmN0aW9ue2VtYi5udW1hcmdzKCl9IGZ1bmN0aW9uIGFjY2Vzc2libGUgdG8gdGhlIGVtYmVkZGVkIFB5dGhvbgotaW50ZXJwcmV0ZXIuICBXaXRoIHRoZXNlIGV4dGVuc2lvbnMsIHRoZSBQeXRob24gc2NyaXB0IGNhbiBkbyB0aGluZ3MKLWxpa2UKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IGVtYgotcHJpbnQgIk51bWJlciBvZiBhcmd1bWVudHMiLCBlbWIubnVtYXJncygpCi1cZW5ke3ZlcmJhdGltfQotCi1JbiBhIHJlYWwgYXBwbGljYXRpb24sIHRoZSBtZXRob2RzIHdpbGwgZXhwb3NlIGFuIEFQSSBvZiB0aGUKLWFwcGxpY2F0aW9uIHRvIFB5dGhvbi4KLQotCi0lXHNlY3Rpb257Rm9yIHRoZSBmdXR1cmV9Ci0lCi0lWW91IGRvbid0IGhhcHBlbiB0byBoYXZlIGEgbmljZSBsaWJyYXJ5IHRvIGdldCB0ZXh0dWFsCi0lZXF1aXZhbGVudHMgb2YgbnVtZXJpYyB2YWx1ZXMgZG8geW91IDotKSA/Ci0lQ2FsbGJhY2tzIGhlcmUgPyAoSSBtYXkgYmUgdXNpbmcgaW5mb3JtYXRpb24gZnJvbSB0aGF0IHNlY3Rpb24KLSU/ISkKLSV0aHJlYWRzCi0lY29kZSBleGFtcGxlcyBkbyBub3QgcmVhbGx5IGJlaGF2ZSB3ZWxsIGlmIGVycm9ycyBoYXBwZW4KLSUgKHdoYXQgdG8gd2F0Y2ggb3V0IGZvcikKLQotCi1cc2VjdGlvbntFbWJlZGRpbmcgUHl0aG9uIGluIFxDcHAKLSAgICAgXGxhYmVse2VtYmVkZGluZ0luQ3BsdXNwbHVzfX0KLQotSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBlbWJlZCBQeXRob24gaW4gYSBcQ3Bwe30gcHJvZ3JhbTsgcHJlY2lzZWx5IGhvdyB0aGlzCi1pcyBkb25lIHdpbGwgZGVwZW5kIG9uIHRoZSBkZXRhaWxzIG9mIHRoZSBcQ3Bwe30gc3lzdGVtIHVzZWQ7IGluIGdlbmVyYWwgeW91Ci13aWxsIG5lZWQgdG8gd3JpdGUgdGhlIG1haW4gcHJvZ3JhbSBpbiBcQ3BwLCBhbmQgdXNlIHRoZSBcQ3Bwe30gY29tcGlsZXIKLXRvIGNvbXBpbGUgYW5kIGxpbmsgeW91ciBwcm9ncmFtLiAgVGhlcmUgaXMgbm8gbmVlZCB0byByZWNvbXBpbGUgUHl0aG9uCi1pdHNlbGYgdXNpbmcgXENwcC4KLQotCi1cc2VjdGlvbntMaW5raW5nIFJlcXVpcmVtZW50cwotICAgICAgICAgXGxhYmVse2xpbmstcmVxc319Ci0KLVdoaWxlIHRoZSBccHJvZ3JhbXtjb25maWd1cmV9IHNjcmlwdCBzaGlwcGVkIHdpdGggdGhlIFB5dGhvbiBzb3VyY2VzCi13aWxsIGNvcnJlY3RseSBidWlsZCBQeXRob24gdG8gZXhwb3J0IHRoZSBzeW1ib2xzIG5lZWRlZCBieQotZHluYW1pY2FsbHkgbGlua2VkIGV4dGVuc2lvbnMsIHRoaXMgaXMgbm90IGF1dG9tYXRpY2FsbHkgaW5oZXJpdGVkIGJ5Ci1hcHBsaWNhdGlvbnMgd2hpY2ggZW1iZWQgdGhlIFB5dGhvbiBsaWJyYXJ5IHN0YXRpY2FsbHksIGF0IGxlYXN0IG9uCi1cVU5JWC4gIFRoaXMgaXMgYW4gaXNzdWUgd2hlbiB0aGUgYXBwbGljYXRpb24gaXMgbGlua2VkIHRvIHRoZSBzdGF0aWMKLXJ1bnRpbWUgbGlicmFyeSAoXGZpbGV7bGlicHl0aG9uLmF9KSBhbmQgbmVlZHMgdG8gbG9hZCBkeW5hbWljCi1leHRlbnNpb25zIChpbXBsZW1lbnRlZCBhcyBcZmlsZXsuc299IGZpbGVzKS4KLQotVGhlIHByb2JsZW0gaXMgdGhhdCBzb21lIGVudHJ5IHBvaW50cyBhcmUgZGVmaW5lZCBieSB0aGUgUHl0aG9uCi1ydW50aW1lIHNvbGVseSBmb3IgZXh0ZW5zaW9uIG1vZHVsZXMgdG8gdXNlLiAgSWYgdGhlIGVtYmVkZGluZwotYXBwbGljYXRpb24gZG9lcyBub3QgdXNlIGFueSBvZiB0aGVzZSBlbnRyeSBwb2ludHMsIHNvbWUgbGlua2VycyB3aWxsCi1ub3QgaW5jbHVkZSB0aG9zZSBlbnRyaWVzIGluIHRoZSBzeW1ib2wgdGFibGUgb2YgdGhlIGZpbmlzaGVkCi1leGVjdXRhYmxlLiAgU29tZSBhZGRpdGlvbmFsIG9wdGlvbnMgYXJlIG5lZWRlZCB0byBpbmZvcm0gdGhlIGxpbmtlcgotbm90IHRvIHJlbW92ZSB0aGVzZSBzeW1ib2xzLgotCi1EZXRlcm1pbmluZyB0aGUgcmlnaHQgb3B0aW9ucyB0byB1c2UgZm9yIGFueSBnaXZlbiBwbGF0Zm9ybSBjYW4gYmUKLXF1aXRlIGRpZmZpY3VsdCwgYnV0IGZvcnR1bmF0ZWx5IHRoZSBQeXRob24gY29uZmlndXJhdGlvbiBhbHJlYWR5IGhhcwotdGhvc2UgdmFsdWVzLiAgVG8gcmV0cmlldmUgdGhlbSBmcm9tIGFuIGluc3RhbGxlZCBQeXRob24gaW50ZXJwcmV0ZXIsCi1zdGFydCBhbiBpbnRlcmFjdGl2ZSBpbnRlcnByZXRlciBhbmQgaGF2ZSBhIHNob3J0IHNlc3Npb24gbGlrZSB0aGlzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gaW1wb3J0IGRpc3R1dGlscy5zeXNjb25maWcKLT4+PiBkaXN0dXRpbHMuc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdMSU5LRk9SU0hBUkVEJykKLSctWGxpbmtlciAtZXhwb3J0LWR5bmFtaWMnCi1cZW5ke3ZlcmJhdGltfQotXHJlZnN0bW9kaW5kZXh7ZGlzdHV0aWxzLnN5c2NvbmZpZ30KLQotVGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcgcHJlc2VudGVkIHdpbGwgYmUgdGhlIG9wdGlvbnMgdGhhdCBzaG91bGQKLWJlIHVzZWQuICBJZiB0aGUgc3RyaW5nIGlzIGVtcHR5LCB0aGVyZSdzIG5vIG5lZWQgdG8gYWRkIGFueQotYWRkaXRpb25hbCBvcHRpb25zLiAgVGhlIFxjb25zdGFudHtMSU5LRk9SU0hBUkVEfSBkZWZpbml0aW9uCi1jb3JyZXNwb25kcyB0byB0aGUgdmFyaWFibGUgb2YgdGhlIHNhbWUgbmFtZSBpbiBQeXRob24ncyB0b3AtbGV2ZWwKLVxmaWxle01ha2VmaWxlfS4KZGlmZiAtLWdpdCBhL0RvYy9leHQvZXh0LnRleCBiL0RvYy9leHQvZXh0LnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQxMzBkMS4uMDAwMDAwMAotLS0gYS9Eb2MvZXh0L2V4dC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi1cZG9jdW1lbnRjbGFzc3ttYW51YWx9Ci0KLSUgWFhYIFBNIGV4cGxhaW4gaG93IHRvIGFkZCBuZXcgdHlwZXMgdG8gUHl0aG9uCi0KLVx0aXRsZXtFeHRlbmRpbmcgYW5kIEVtYmVkZGluZyB0aGUgUHl0aG9uIEludGVycHJldGVyfQotCi1caW5wdXR7Ym9pbGVycGxhdGV9Ci0KLSUgVGVsbCBcaW5kZXggdG8gYWN0dWFsbHkgd3JpdGUgdGhlIC5pZHggZmlsZQotXG1ha2VpbmRleAotCi1cYmVnaW57ZG9jdW1lbnR9Ci0KLVxtYWtldGl0bGUKLQotXGlmaHRtbAotXGNoYXB0ZXIqe0Zyb250IE1hdHRlclxsYWJlbHtmcm9udH19Ci1cZmkKLQotXGlucHV0e2NvcHlyaWdodH0KLQotCi1cYmVnaW57YWJzdHJhY3R9Ci0KLVxub2luZGVudAotUHl0aG9uIGlzIGFuIGludGVycHJldGVkLCBvYmplY3Qtb3JpZW50ZWQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuICBUaGlzCi1kb2N1bWVudCBkZXNjcmliZXMgaG93IHRvIHdyaXRlIG1vZHVsZXMgaW4gQyBvciBcQ3Bwe30gdG8gZXh0ZW5kIHRoZQotUHl0aG9uIGludGVycHJldGVyIHdpdGggbmV3IG1vZHVsZXMuICBUaG9zZSBtb2R1bGVzIGNhbiBkZWZpbmUgbmV3Ci1mdW5jdGlvbnMgYnV0IGFsc28gbmV3IG9iamVjdCB0eXBlcyBhbmQgdGhlaXIgbWV0aG9kcy4gIFRoZSBkb2N1bWVudAotYWxzbyBkZXNjcmliZXMgaG93IHRvIGVtYmVkIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgaW4gYW5vdGhlcgotYXBwbGljYXRpb24sIGZvciB1c2UgYXMgYW4gZXh0ZW5zaW9uIGxhbmd1YWdlLiAgRmluYWxseSwgaXQgc2hvd3MgaG93Ci10byBjb21waWxlIGFuZCBsaW5rIGV4dGVuc2lvbiBtb2R1bGVzIHNvIHRoYXQgdGhleSBjYW4gYmUgbG9hZGVkCi1keW5hbWljYWxseSAoYXQgcnVuIHRpbWUpIGludG8gdGhlIGludGVycHJldGVyLCBpZiB0aGUgdW5kZXJseWluZwotb3BlcmF0aW5nIHN5c3RlbSBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuCi0KLVRoaXMgZG9jdW1lbnQgYXNzdW1lcyBiYXNpYyBrbm93bGVkZ2UgYWJvdXQgUHl0aG9uLiAgRm9yIGFuIGluZm9ybWFsCi1pbnRyb2R1Y3Rpb24gdG8gdGhlIGxhbmd1YWdlLCBzZWUgdGhlCi1cY2l0ZXRpdGxlWy4uL3R1dC90dXQuaHRtbF17UHl0aG9uIFR1dG9yaWFsfS4gIFRoZQotXGNpdGV0aXRsZVsuLi9yZWYvcmVmLmh0bWxde1B5dGhvbiBSZWZlcmVuY2UgTWFudWFsfSBnaXZlcyBhIG1vcmUKLWZvcm1hbCBkZWZpbml0aW9uIG9mIHRoZSBsYW5ndWFnZS4gIFRoZQotXGNpdGV0aXRsZVsuLi9saWIvbGliLmh0bWxde1B5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZX0gZG9jdW1lbnRzIHRoZQotZXhpc3Rpbmcgb2JqZWN0IHR5cGVzLCBmdW5jdGlvbnMgYW5kIG1vZHVsZXMgKGJvdGggYnVpbHQtaW4gYW5kCi13cml0dGVuIGluIFB5dGhvbikgdGhhdCBnaXZlIHRoZSBsYW5ndWFnZSBpdHMgd2lkZSBhcHBsaWNhdGlvbiByYW5nZS4KLQotRm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIHdob2xlIFB5dGhvbi9DIEFQSSwgc2VlIHRoZSBzZXBhcmF0ZQotXGNpdGV0aXRsZVsuLi9hcGkvYXBpLmh0bWxde1B5dGhvbi9DIEFQSSBSZWZlcmVuY2UgTWFudWFsfS4KLQotXGVuZHthYnN0cmFjdH0KLQotXHRhYmxlb2Zjb250ZW50cwotCi0KLVxpbnB1dHtleHRlbmRpbmd9Ci1caW5wdXR7bmV3dHlwZXN9Ci1caW5wdXR7YnVpbGRpbmd9Ci1caW5wdXR7d2luZG93c30KLVxpbnB1dHtlbWJlZGRpbmd9Ci0KLQotXGFwcGVuZGl4Ci1cY2hhcHRlcntSZXBvcnRpbmcgQnVnc30KLVxpbnB1dHtyZXBvcnRpbmdidWdzfQotCi1cY2hhcHRlcntIaXN0b3J5IGFuZCBMaWNlbnNlfQotXGlucHV0e2xpY2Vuc2V9Ci0KLVxlbmR7ZG9jdW1lbnR9CmRpZmYgLS1naXQgYS9Eb2MvZXh0L2V4dGVuZGluZy50ZXggYi9Eb2MvZXh0L2V4dGVuZGluZy50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3OTZlOWUuLjAwMDAwMDAKLS0tIGEvRG9jL2V4dC9leHRlbmRpbmcudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTM4NiArMCwwIEBACi1cY2hhcHRlcntFeHRlbmRpbmcgUHl0aG9uIHdpdGggXEN7fSBvciBcQ3Bwe30gXGxhYmVse2ludHJvfX0KLQotCi1JdCBpcyBxdWl0ZSBlYXN5IHRvIGFkZCBuZXcgYnVpbHQtaW4gbW9kdWxlcyB0byBQeXRob24sIGlmIHlvdSBrbm93Ci1ob3cgdG8gcHJvZ3JhbSBpbiBDLiAgU3VjaCBcZGZue2V4dGVuc2lvbiBtb2R1bGVzfSBjYW4gZG8gdHdvIHRoaW5ncwotdGhhdCBjYW4ndCBiZSBkb25lIGRpcmVjdGx5IGluIFB5dGhvbjogdGhleSBjYW4gaW1wbGVtZW50IG5ldyBidWlsdC1pbgotb2JqZWN0IHR5cGVzLCBhbmQgdGhleSBjYW4gY2FsbCBDIGxpYnJhcnkgZnVuY3Rpb25zIGFuZCBzeXN0ZW0gY2FsbHMuCi0KLVRvIHN1cHBvcnQgZXh0ZW5zaW9ucywgdGhlIFB5dGhvbiBBUEkgKEFwcGxpY2F0aW9uIFByb2dyYW1tZXJzCi1JbnRlcmZhY2UpIGRlZmluZXMgYSBzZXQgb2YgZnVuY3Rpb25zLCBtYWNyb3MgYW5kIHZhcmlhYmxlcyB0aGF0Ci1wcm92aWRlIGFjY2VzcyB0byBtb3N0IGFzcGVjdHMgb2YgdGhlIFB5dGhvbiBydW4tdGltZSBzeXN0ZW0uICBUaGUKLVB5dGhvbiBBUEkgaXMgaW5jb3Jwb3JhdGVkIGluIGEgQyBzb3VyY2UgZmlsZSBieSBpbmNsdWRpbmcgdGhlIGhlYWRlcgotXGNvZGV7IlB5dGhvbi5oIn0uCi0KLVRoZSBjb21waWxhdGlvbiBvZiBhbiBleHRlbnNpb24gbW9kdWxlIGRlcGVuZHMgb24gaXRzIGludGVuZGVkIHVzZSBhcwotd2VsbCBhcyBvbiB5b3VyIHN5c3RlbSBzZXR1cDsgZGV0YWlscyBhcmUgZ2l2ZW4gaW4gbGF0ZXIgY2hhcHRlcnMuCi0KLQotXHNlY3Rpb257QSBTaW1wbGUgRXhhbXBsZQotICAgICAgICAgXGxhYmVse3NpbXBsZUV4YW1wbGV9fQotCi1MZXQncyBjcmVhdGUgYW4gZXh0ZW5zaW9uIG1vZHVsZSBjYWxsZWQgXHNhbXB7c3BhbX0gKHRoZSBmYXZvcml0ZSBmb29kCi1vZiBNb250eSBQeXRob24gZmFucy4uLikgYW5kIGxldCdzIHNheSB3ZSB3YW50IHRvIGNyZWF0ZSBhIFB5dGhvbgotaW50ZXJmYWNlIHRvIHRoZSBDIGxpYnJhcnkgZnVuY3Rpb24gXGNmdW5jdGlvbntzeXN0ZW0oKX0uXGZvb3Rub3Rle0FuCi1pbnRlcmZhY2UgZm9yIHRoaXMgZnVuY3Rpb24gYWxyZWFkeSBleGlzdHMgaW4gdGhlIHN0YW5kYXJkIG1vZHVsZQotXG1vZHVsZXtvc30gLS0tIGl0IHdhcyBjaG9zZW4gYXMgYSBzaW1wbGUgYW5kIHN0cmFpZ2h0Zm9yd2FyZCBleGFtcGxlLn0KLVRoaXMgZnVuY3Rpb24gdGFrZXMgYSBudWxsLXRlcm1pbmF0ZWQgY2hhcmFjdGVyIHN0cmluZyBhcyBhcmd1bWVudCBhbmQKLXJldHVybnMgYW4gaW50ZWdlci4gIFdlIHdhbnQgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsYWJsZSBmcm9tIFB5dGhvbgotYXMgZm9sbG93czoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGltcG9ydCBzcGFtCi0+Pj4gc3RhdHVzID0gc3BhbS5zeXN0ZW0oImxzIC1sIikKLVxlbmR7dmVyYmF0aW19Ci0KLUJlZ2luIGJ5IGNyZWF0aW5nIGEgZmlsZSBcZmlsZXtzcGFtbW9kdWxlLmN9LiAgKEhpc3RvcmljYWxseSwgaWYgYQotbW9kdWxlIGlzIGNhbGxlZCBcc2FtcHtzcGFtfSwgdGhlIEMgZmlsZSBjb250YWluaW5nIGl0cyBpbXBsZW1lbnRhdGlvbgotaXMgY2FsbGVkIFxmaWxle3NwYW1tb2R1bGUuY307IGlmIHRoZSBtb2R1bGUgbmFtZSBpcyB2ZXJ5IGxvbmcsIGxpa2UKLVxzYW1we3NwYW1taWZ5fSwgdGhlIG1vZHVsZSBuYW1lIGNhbiBiZSBqdXN0IFxmaWxle3NwYW1taWZ5LmN9LikKLQotVGhlIGZpcnN0IGxpbmUgb2Ygb3VyIGZpbGUgY2FuIGJlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0jaW5jbHVkZSA8UHl0aG9uLmg+Ci1cZW5ke3ZlcmJhdGltfQotCi13aGljaCBwdWxscyBpbiB0aGUgUHl0aG9uIEFQSSAoeW91IGNhbiBhZGQgYSBjb21tZW50IGRlc2NyaWJpbmcgdGhlCi1wdXJwb3NlIG9mIHRoZSBtb2R1bGUgYW5kIGEgY29weXJpZ2h0IG5vdGljZSBpZiB5b3UgbGlrZSkuCi0KLVxiZWdpbntub3RpY2V9W3dhcm5pbmddCi0gIFNpbmNlIFB5dGhvbiBtYXkgZGVmaW5lIHNvbWUgcHJlLXByb2Nlc3NvciBkZWZpbml0aW9ucyB3aGljaCBhZmZlY3QKLSAgdGhlIHN0YW5kYXJkIGhlYWRlcnMgb24gc29tZSBzeXN0ZW1zLCB5b3UgXGVtcGh7bXVzdH0gaW5jbHVkZQotICBcZmlsZXtQeXRob24uaH0gYmVmb3JlIGFueSBzdGFuZGFyZCBoZWFkZXJzIGFyZSBpbmNsdWRlZC4KLVxlbmR7bm90aWNlfQotCi1BbGwgdXNlci12aXNpYmxlIHN5bWJvbHMgZGVmaW5lZCBieSBcZmlsZXtQeXRob24uaH0gaGF2ZSBhIHByZWZpeCBvZgotXHNhbXB7UHl9IG9yIFxzYW1we1BZfSwgZXhjZXB0IHRob3NlIGRlZmluZWQgaW4gc3RhbmRhcmQgaGVhZGVyIGZpbGVzLgotRm9yIGNvbnZlbmllbmNlLCBhbmQgc2luY2UgdGhleSBhcmUgdXNlZCBleHRlbnNpdmVseSBieSB0aGUgUHl0aG9uCi1pbnRlcnByZXRlciwgXGNvZGV7IlB5dGhvbi5oIn0gaW5jbHVkZXMgYSBmZXcgc3RhbmRhcmQgaGVhZGVyIGZpbGVzOgotXGNvZGV7PHN0ZGlvLmg+fSwgXGNvZGV7PHN0cmluZy5oPn0sIFxjb2RlezxlcnJuby5oPn0sIGFuZAotXGNvZGV7PHN0ZGxpYi5oPn0uICBJZiB0aGUgbGF0dGVyIGhlYWRlciBmaWxlIGRvZXMgbm90IGV4aXN0IG9uIHlvdXIKLXN5c3RlbSwgaXQgZGVjbGFyZXMgdGhlIGZ1bmN0aW9ucyBcY2Z1bmN0aW9ue21hbGxvYygpfSwKLVxjZnVuY3Rpb257ZnJlZSgpfSBhbmQgXGNmdW5jdGlvbntyZWFsbG9jKCl9IGRpcmVjdGx5LgotCi1UaGUgbmV4dCB0aGluZyB3ZSBhZGQgdG8gb3VyIG1vZHVsZSBmaWxlIGlzIHRoZSBDIGZ1bmN0aW9uIHRoYXQgd2lsbAotYmUgY2FsbGVkIHdoZW4gdGhlIFB5dGhvbiBleHByZXNzaW9uIFxzYW1we3NwYW0uc3lzdGVtKFx2YXJ7c3RyaW5nfSl9Ci1pcyBldmFsdWF0ZWQgKHdlJ2xsIHNlZSBzaG9ydGx5IGhvdyBpdCBlbmRzIHVwIGJlaW5nIGNhbGxlZCk6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXN0YXRpYyBQeU9iamVjdCAqCi1zcGFtX3N5c3RlbShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCi17Ci0gICAgY29uc3QgY2hhciAqY29tbWFuZDsKLSAgICBpbnQgc3RzOwotCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJmNvbW1hbmQpKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBzdHMgPSBzeXN0ZW0oY29tbWFuZCk7Ci0gICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdHMpOwotfQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlcmUgaXMgYSBzdHJhaWdodGZvcndhcmQgdHJhbnNsYXRpb24gZnJvbSB0aGUgYXJndW1lbnQgbGlzdCBpbgotUHl0aG9uIChmb3IgZXhhbXBsZSwgdGhlIHNpbmdsZSBleHByZXNzaW9uIFxjb2RleyJscyAtbCJ9KSB0byB0aGUKLWFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIEMgZnVuY3Rpb24uICBUaGUgQyBmdW5jdGlvbiBhbHdheXMgaGFzIHR3bwotYXJndW1lbnRzLCBjb252ZW50aW9uYWxseSBuYW1lZCBcdmFye3NlbGZ9IGFuZCBcdmFye2FyZ3N9LgotCi1UaGUgXHZhcntzZWxmfSBhcmd1bWVudCBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgQyBmdW5jdGlvbiBpbXBsZW1lbnRzIGEKLWJ1aWx0LWluIG1ldGhvZCwgbm90IGEgZnVuY3Rpb24uIEluIHRoZSBleGFtcGxlLCBcdmFye3NlbGZ9IHdpbGwKLWFsd2F5cyBiZSBhIFxOVUxMe30gcG9pbnRlciwgc2luY2Ugd2UgYXJlIGRlZmluaW5nIGEgZnVuY3Rpb24sIG5vdCBhCi1tZXRob2QuICAoVGhpcyBpcyBkb25lIHNvIHRoYXQgdGhlIGludGVycHJldGVyIGRvZXNuJ3QgaGF2ZSB0bwotdW5kZXJzdGFuZCB0d28gZGlmZmVyZW50IHR5cGVzIG9mIEMgZnVuY3Rpb25zLikKLQotVGhlIFx2YXJ7YXJnc30gYXJndW1lbnQgd2lsbCBiZSBhIHBvaW50ZXIgdG8gYSBQeXRob24gdHVwbGUgb2JqZWN0Ci1jb250YWluaW5nIHRoZSBhcmd1bWVudHMuICBFYWNoIGl0ZW0gb2YgdGhlIHR1cGxlIGNvcnJlc3BvbmRzIHRvIGFuCi1hcmd1bWVudCBpbiB0aGUgY2FsbCdzIGFyZ3VtZW50IGxpc3QuICBUaGUgYXJndW1lbnRzIGFyZSBQeXRob24KLW9iamVjdHMgLS0tIGluIG9yZGVyIHRvIGRvIGFueXRoaW5nIHdpdGggdGhlbSBpbiBvdXIgQyBmdW5jdGlvbiB3ZSBoYXZlCi10byBjb252ZXJ0IHRoZW0gdG8gQyB2YWx1ZXMuICBUaGUgZnVuY3Rpb24gXGNmdW5jdGlvbntQeUFyZ19QYXJzZVR1cGxlKCl9Ci1pbiB0aGUgUHl0aG9uIEFQSSBjaGVja3MgdGhlIGFyZ3VtZW50IHR5cGVzIGFuZCBjb252ZXJ0cyB0aGVtIHRvIEMKLXZhbHVlcy4gIEl0IHVzZXMgYSB0ZW1wbGF0ZSBzdHJpbmcgdG8gZGV0ZXJtaW5lIHRoZSByZXF1aXJlZCB0eXBlcyBvZgotdGhlIGFyZ3VtZW50cyBhcyB3ZWxsIGFzIHRoZSB0eXBlcyBvZiB0aGUgQyB2YXJpYWJsZXMgaW50byB3aGljaCB0bwotc3RvcmUgdGhlIGNvbnZlcnRlZCB2YWx1ZXMuICBNb3JlIGFib3V0IHRoaXMgbGF0ZXIuCi0KLVxjZnVuY3Rpb257UHlBcmdfUGFyc2VUdXBsZSgpfSByZXR1cm5zIHRydWUgKG5vbnplcm8pIGlmIGFsbCBhcmd1bWVudHMgaGF2ZQotdGhlIHJpZ2h0IHR5cGUgYW5kIGl0cyBjb21wb25lbnRzIGhhdmUgYmVlbiBzdG9yZWQgaW4gdGhlIHZhcmlhYmxlcwotd2hvc2UgYWRkcmVzc2VzIGFyZSBwYXNzZWQuICBJdCByZXR1cm5zIGZhbHNlICh6ZXJvKSBpZiBhbiBpbnZhbGlkCi1hcmd1bWVudCBsaXN0IHdhcyBwYXNzZWQuICBJbiB0aGUgbGF0dGVyIGNhc2UgaXQgYWxzbyByYWlzZXMgYW4KLWFwcHJvcHJpYXRlIGV4Y2VwdGlvbiBzbyB0aGUgY2FsbGluZyBmdW5jdGlvbiBjYW4gcmV0dXJuCi1cTlVMTHt9IGltbWVkaWF0ZWx5IChhcyB3ZSBzYXcgaW4gdGhlIGV4YW1wbGUpLgotCi0KLVxzZWN0aW9ue0ludGVybWV6em86IEVycm9ycyBhbmQgRXhjZXB0aW9ucwotICAgICAgICAgXGxhYmVse2Vycm9yc319Ci0KLUFuIGltcG9ydGFudCBjb252ZW50aW9uIHRocm91Z2hvdXQgdGhlIFB5dGhvbiBpbnRlcnByZXRlciBpcyB0aGUKLWZvbGxvd2luZzogd2hlbiBhIGZ1bmN0aW9uIGZhaWxzLCBpdCBzaG91bGQgc2V0IGFuIGV4Y2VwdGlvbiBjb25kaXRpb24KLWFuZCByZXR1cm4gYW4gZXJyb3IgdmFsdWUgKHVzdWFsbHkgYSBcTlVMTHt9IHBvaW50ZXIpLiAgRXhjZXB0aW9ucwotYXJlIHN0b3JlZCBpbiBhIHN0YXRpYyBnbG9iYWwgdmFyaWFibGUgaW5zaWRlIHRoZSBpbnRlcnByZXRlcjsgaWYgdGhpcwotdmFyaWFibGUgaXMgXE5VTEx7fSBubyBleGNlcHRpb24gaGFzIG9jY3VycmVkLiAgQSBzZWNvbmQgZ2xvYmFsCi12YXJpYWJsZSBzdG9yZXMgdGhlIGBgYXNzb2NpYXRlZCB2YWx1ZScnIG9mIHRoZSBleGNlcHRpb24gKHRoZSBzZWNvbmQKLWFyZ3VtZW50IHRvIFxrZXl3b3Jke3JhaXNlfSkuICBBIHRoaXJkIHZhcmlhYmxlIGNvbnRhaW5zIHRoZSBzdGFjawotdHJhY2ViYWNrIGluIGNhc2UgdGhlIGVycm9yIG9yaWdpbmF0ZWQgaW4gUHl0aG9uIGNvZGUuICBUaGVzZSB0aHJlZQotdmFyaWFibGVzIGFyZSB0aGUgQyBlcXVpdmFsZW50cyBvZiB0aGUgcmVzdWx0IGluIFB5dGhvbiBvZiAKLVxtZXRob2R7c3lzLmV4Y19pbmZvKCl9IChzZWUgdGhlIHNlY3Rpb24gb24gbW9kdWxlIFxtb2R1bGV7c3lzfSBpbiB0aGUKLVxjaXRldGl0bGVbLi4vbGliL2xpYi5odG1sXXtQeXRob24gTGlicmFyeSBSZWZlcmVuY2V9KS4gIEl0IGlzCi1pbXBvcnRhbnQgdG8ga25vdyBhYm91dCB0aGVtIHRvIHVuZGVyc3RhbmQgaG93IGVycm9ycyBhcmUgcGFzc2VkCi1hcm91bmQuCi0KLVRoZSBQeXRob24gQVBJIGRlZmluZXMgYSBudW1iZXIgb2YgZnVuY3Rpb25zIHRvIHNldCB2YXJpb3VzIHR5cGVzIG9mCi1leGNlcHRpb25zLgotCi1UaGUgbW9zdCBjb21tb24gb25lIGlzIFxjZnVuY3Rpb257UHlFcnJfU2V0U3RyaW5nKCl9LiAgSXRzIGFyZ3VtZW50cwotYXJlIGFuIGV4Y2VwdGlvbiBvYmplY3QgYW5kIGEgQyBzdHJpbmcuICBUaGUgZXhjZXB0aW9uIG9iamVjdCBpcwotdXN1YWxseSBhIHByZWRlZmluZWQgb2JqZWN0IGxpa2UgXGNkYXRhe1B5RXhjX1plcm9EaXZpc2lvbkVycm9yfS4gIFRoZQotQyBzdHJpbmcgaW5kaWNhdGVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IgYW5kIGlzIGNvbnZlcnRlZCB0byBhCi1QeXRob24gc3RyaW5nIG9iamVjdCBhbmQgc3RvcmVkIGFzIHRoZSBgYGFzc29jaWF0ZWQgdmFsdWUnJyBvZiB0aGUKLWV4Y2VwdGlvbi4KLQotQW5vdGhlciB1c2VmdWwgZnVuY3Rpb24gaXMgXGNmdW5jdGlvbntQeUVycl9TZXRGcm9tRXJybm8oKX0sIHdoaWNoIG9ubHkKLXRha2VzIGFuIGV4Y2VwdGlvbiBhcmd1bWVudCBhbmQgY29uc3RydWN0cyB0aGUgYXNzb2NpYXRlZCB2YWx1ZSBieQotaW5zcGVjdGlvbiBvZiB0aGUgZ2xvYmFsIHZhcmlhYmxlIFxjZGF0YXtlcnJub30uICBUaGUgbW9zdAotZ2VuZXJhbCBmdW5jdGlvbiBpcyBcY2Z1bmN0aW9ue1B5RXJyX1NldE9iamVjdCgpfSwgd2hpY2ggdGFrZXMgdHdvIG9iamVjdAotYXJndW1lbnRzLCB0aGUgZXhjZXB0aW9uIGFuZCBpdHMgYXNzb2NpYXRlZCB2YWx1ZS4gIFlvdSBkb24ndCBuZWVkIHRvCi1cY2Z1bmN0aW9ue1B5X0lOQ1JFRigpfSB0aGUgb2JqZWN0cyBwYXNzZWQgdG8gYW55IG9mIHRoZXNlIGZ1bmN0aW9ucy4KLQotWW91IGNhbiB0ZXN0IG5vbi1kZXN0cnVjdGl2ZWx5IHdoZXRoZXIgYW4gZXhjZXB0aW9uIGhhcyBiZWVuIHNldCB3aXRoCi1cY2Z1bmN0aW9ue1B5RXJyX09jY3VycmVkKCl9LiAgVGhpcyByZXR1cm5zIHRoZSBjdXJyZW50IGV4Y2VwdGlvbiBvYmplY3QsCi1vciBcTlVMTHt9IGlmIG5vIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuICBZb3Ugbm9ybWFsbHkgZG9uJ3QgbmVlZAotdG8gY2FsbCBcY2Z1bmN0aW9ue1B5RXJyX09jY3VycmVkKCl9IHRvIHNlZSB3aGV0aGVyIGFuIGVycm9yIG9jY3VycmVkIGluIGEKLWZ1bmN0aW9uIGNhbGwsIHNpbmNlIHlvdSBzaG91bGQgYmUgYWJsZSB0byB0ZWxsIGZyb20gdGhlIHJldHVybiB2YWx1ZS4KLQotV2hlbiBhIGZ1bmN0aW9uIFx2YXJ7Zn0gdGhhdCBjYWxscyBhbm90aGVyIGZ1bmN0aW9uIFx2YXJ7Z30gZGV0ZWN0cwotdGhhdCB0aGUgbGF0dGVyIGZhaWxzLCBcdmFye2Z9IHNob3VsZCBpdHNlbGYgcmV0dXJuIGFuIGVycm9yIHZhbHVlCi0odXN1YWxseSBcTlVMTHt9IG9yIFxjb2Rley0xfSkuICBJdCBzaG91bGQgXGVtcGh7bm90fSBjYWxsIG9uZSBvZiB0aGUKLVxjZnVuY3Rpb257UHlFcnJfKigpfSBmdW5jdGlvbnMgLS0tIG9uZSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBieSBcdmFye2d9LgotXHZhcntmfSdzIGNhbGxlciBpcyB0aGVuIHN1cHBvc2VkIHRvIGFsc28gcmV0dXJuIGFuIGVycm9yIGluZGljYXRpb24KLXRvIFxlbXBoe2l0c30gY2FsbGVyLCBhZ2FpbiBcZW1waHt3aXRob3V0fSBjYWxsaW5nIFxjZnVuY3Rpb257UHlFcnJfKigpfSwKLWFuZCBzbyBvbiAtLS0gdGhlIG1vc3QgZGV0YWlsZWQgY2F1c2Ugb2YgdGhlIGVycm9yIHdhcyBhbHJlYWR5Ci1yZXBvcnRlZCBieSB0aGUgZnVuY3Rpb24gdGhhdCBmaXJzdCBkZXRlY3RlZCBpdC4gIE9uY2UgdGhlIGVycm9yCi1yZWFjaGVzIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIncyBtYWluIGxvb3AsIHRoaXMgYWJvcnRzIHRoZSBjdXJyZW50bHkKLWV4ZWN1dGluZyBQeXRob24gY29kZSBhbmQgdHJpZXMgdG8gZmluZCBhbiBleGNlcHRpb24gaGFuZGxlciBzcGVjaWZpZWQKLWJ5IHRoZSBQeXRob24gcHJvZ3JhbW1lci4KLQotKFRoZXJlIGFyZSBzaXR1YXRpb25zIHdoZXJlIGEgbW9kdWxlIGNhbiBhY3R1YWxseSBnaXZlIGEgbW9yZSBkZXRhaWxlZAotZXJyb3IgbWVzc2FnZSBieSBjYWxsaW5nIGFub3RoZXIgXGNmdW5jdGlvbntQeUVycl8qKCl9IGZ1bmN0aW9uLCBhbmQgaW4KLXN1Y2ggY2FzZXMgaXQgaXMgZmluZSB0byBkbyBzby4gIEFzIGEgZ2VuZXJhbCBydWxlLCBob3dldmVyLCB0aGlzIGlzCi1ub3QgbmVjZXNzYXJ5LCBhbmQgY2FuIGNhdXNlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IKLXRvIGJlIGxvc3Q6IG1vc3Qgb3BlcmF0aW9ucyBjYW4gZmFpbCBmb3IgYSB2YXJpZXR5IG9mIHJlYXNvbnMuKQotCi1UbyBpZ25vcmUgYW4gZXhjZXB0aW9uIHNldCBieSBhIGZ1bmN0aW9uIGNhbGwgdGhhdCBmYWlsZWQsIHRoZSBleGNlcHRpb24KLWNvbmRpdGlvbiBtdXN0IGJlIGNsZWFyZWQgZXhwbGljaXRseSBieSBjYWxsaW5nIFxjZnVuY3Rpb257UHlFcnJfQ2xlYXIoKX0uIAotVGhlIG9ubHkgdGltZSBDIGNvZGUgc2hvdWxkIGNhbGwgXGNmdW5jdGlvbntQeUVycl9DbGVhcigpfSBpcyBpZiBpdCBkb2Vzbid0Ci13YW50IHRvIHBhc3MgdGhlIGVycm9yIG9uIHRvIHRoZSBpbnRlcnByZXRlciBidXQgd2FudHMgdG8gaGFuZGxlIGl0Ci1jb21wbGV0ZWx5IGJ5IGl0c2VsZiAocG9zc2libHkgYnkgdHJ5aW5nIHNvbWV0aGluZyBlbHNlLCBvciBwcmV0ZW5kaW5nCi1ub3RoaW5nIHdlbnQgd3JvbmcpLgotCi1FdmVyeSBmYWlsaW5nIFxjZnVuY3Rpb257bWFsbG9jKCl9IGNhbGwgbXVzdCBiZSB0dXJuZWQgaW50byBhbgotZXhjZXB0aW9uIC0tLSB0aGUgZGlyZWN0IGNhbGxlciBvZiBcY2Z1bmN0aW9ue21hbGxvYygpfSAob3IKLVxjZnVuY3Rpb257cmVhbGxvYygpfSkgbXVzdCBjYWxsIFxjZnVuY3Rpb257UHlFcnJfTm9NZW1vcnkoKX0gYW5kCi1yZXR1cm4gYSBmYWlsdXJlIGluZGljYXRvciBpdHNlbGYuICBBbGwgdGhlIG9iamVjdC1jcmVhdGluZyBmdW5jdGlvbnMKLShmb3IgZXhhbXBsZSwgXGNmdW5jdGlvbntQeUludF9Gcm9tTG9uZygpfSkgYWxyZWFkeSBkbyB0aGlzLCBzbyB0aGlzCi1ub3RlIGlzIG9ubHkgcmVsZXZhbnQgdG8gdGhvc2Ugd2hvIGNhbGwgXGNmdW5jdGlvbnttYWxsb2MoKX0gZGlyZWN0bHkuCi0KLUFsc28gbm90ZSB0aGF0LCB3aXRoIHRoZSBpbXBvcnRhbnQgZXhjZXB0aW9uIG9mCi1cY2Z1bmN0aW9ue1B5QXJnX1BhcnNlVHVwbGUoKX0gYW5kIGZyaWVuZHMsIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBhbgotaW50ZWdlciBzdGF0dXMgdXN1YWxseSByZXR1cm4gYSBwb3NpdGl2ZSB2YWx1ZSBvciB6ZXJvIGZvciBzdWNjZXNzIGFuZAotXGNvZGV7LTF9IGZvciBmYWlsdXJlLCBsaWtlIFxVTklYe30gc3lzdGVtIGNhbGxzLgotCi1GaW5hbGx5LCBiZSBjYXJlZnVsIHRvIGNsZWFuIHVwIGdhcmJhZ2UgKGJ5IG1ha2luZwotXGNmdW5jdGlvbntQeV9YREVDUkVGKCl9IG9yIFxjZnVuY3Rpb257UHlfREVDUkVGKCl9IGNhbGxzIGZvciBvYmplY3RzCi15b3UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQpIHdoZW4geW91IHJldHVybiBhbiBlcnJvciBpbmRpY2F0b3IhCi0KLVRoZSBjaG9pY2Ugb2Ygd2hpY2ggZXhjZXB0aW9uIHRvIHJhaXNlIGlzIGVudGlyZWx5IHlvdXJzLiAgVGhlcmUgYXJlCi1wcmVkZWNsYXJlZCBDIG9iamVjdHMgY29ycmVzcG9uZGluZyB0byBhbGwgYnVpbHQtaW4gUHl0aG9uIGV4Y2VwdGlvbnMsCi1zdWNoIGFzIFxjZGF0YXtQeUV4Y19aZXJvRGl2aXNpb25FcnJvcn0sIHdoaWNoIHlvdSBjYW4gdXNlIGRpcmVjdGx5LgotT2YgY291cnNlLCB5b3Ugc2hvdWxkIGNob29zZSBleGNlcHRpb25zIHdpc2VseSAtLS0gZG9uJ3QgdXNlCi1cY2RhdGF7UHlFeGNfVHlwZUVycm9yfSB0byBtZWFuIHRoYXQgYSBmaWxlIGNvdWxkbid0IGJlIG9wZW5lZCAodGhhdAotc2hvdWxkIHByb2JhYmx5IGJlIFxjZGF0YXtQeUV4Y19JT0Vycm9yfSkuICBJZiBzb21ldGhpbmcncyB3cm9uZyB3aXRoCi10aGUgYXJndW1lbnQgbGlzdCwgdGhlIFxjZnVuY3Rpb257UHlBcmdfUGFyc2VUdXBsZSgpfSBmdW5jdGlvbiB1c3VhbGx5Ci1yYWlzZXMgXGNkYXRhe1B5RXhjX1R5cGVFcnJvcn0uICBJZiB5b3UgaGF2ZSBhbiBhcmd1bWVudCB3aG9zZSB2YWx1ZQotbXVzdCBiZSBpbiBhIHBhcnRpY3VsYXIgcmFuZ2Ugb3IgbXVzdCBzYXRpc2Z5IG90aGVyIGNvbmRpdGlvbnMsCi1cY2RhdGF7UHlFeGNfVmFsdWVFcnJvcn0gaXMgYXBwcm9wcmlhdGUuCi0KLVlvdSBjYW4gYWxzbyBkZWZpbmUgYSBuZXcgZXhjZXB0aW9uIHRoYXQgaXMgdW5pcXVlIHRvIHlvdXIgbW9kdWxlLgotRm9yIHRoaXMsIHlvdSB1c3VhbGx5IGRlY2xhcmUgYSBzdGF0aWMgb2JqZWN0IHZhcmlhYmxlIGF0IHRoZQotYmVnaW5uaW5nIG9mIHlvdXIgZmlsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotc3RhdGljIFB5T2JqZWN0ICpTcGFtRXJyb3I7Ci1cZW5ke3ZlcmJhdGltfQotCi1hbmQgaW5pdGlhbGl6ZSBpdCBpbiB5b3VyIG1vZHVsZSdzIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCi0oXGNmdW5jdGlvbntpbml0c3BhbSgpfSkgd2l0aCBhbiBleGNlcHRpb24gb2JqZWN0IChsZWF2aW5nIG91dAotdGhlIGVycm9yIGNoZWNraW5nIGZvciBub3cpOgotCi1cYmVnaW57dmVyYmF0aW19Ci1QeU1PRElOSVRfRlVOQwotaW5pdHNwYW0odm9pZCkKLXsKLSAgICBQeU9iamVjdCAqbTsKLQotICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJzcGFtIiwgU3BhbU1ldGhvZHMpOwotICAgIGlmIChtID09IE5VTEwpCi0gICAgICAgIHJldHVybjsKLQotICAgIFNwYW1FcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigic3BhbS5lcnJvciIsIE5VTEwsIE5VTEwpOwotICAgIFB5X0lOQ1JFRihTcGFtRXJyb3IpOwotICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiZXJyb3IiLCBTcGFtRXJyb3IpOwotfQotXGVuZHt2ZXJiYXRpbX0KLQotTm90ZSB0aGF0IHRoZSBQeXRob24gbmFtZSBmb3IgdGhlIGV4Y2VwdGlvbiBvYmplY3QgaXMKLVxleGNlcHRpb257c3BhbS5lcnJvcn0uICBUaGUgXGNmdW5jdGlvbntQeUVycl9OZXdFeGNlcHRpb24oKX0gZnVuY3Rpb24KLW1heSBjcmVhdGUgYSBjbGFzcyB3aXRoIHRoZSBiYXNlIGNsYXNzIGJlaW5nIFxleGNlcHRpb257RXhjZXB0aW9ufQotKHVubGVzcyBhbm90aGVyIGNsYXNzIGlzIHBhc3NlZCBpbiBpbnN0ZWFkIG9mIFxOVUxMKSwgZGVzY3JpYmVkIGluIHRoZQotXGNpdGV0aXRsZVsuLi9saWIvbGliLmh0bWxde1B5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZX0gdW5kZXIgYGBCdWlsdC1pbgotRXhjZXB0aW9ucy4nJwotCi1Ob3RlIGFsc28gdGhhdCB0aGUgXGNkYXRhe1NwYW1FcnJvcn0gdmFyaWFibGUgcmV0YWlucyBhIHJlZmVyZW5jZSB0bwotdGhlIG5ld2x5IGNyZWF0ZWQgZXhjZXB0aW9uIGNsYXNzOyB0aGlzIGlzIGludGVudGlvbmFsISAgU2luY2UgdGhlCi1leGNlcHRpb24gY291bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBtb2R1bGUgYnkgZXh0ZXJuYWwgY29kZSwgYW4gb3duZWQKLXJlZmVyZW5jZSB0byB0aGUgY2xhc3MgaXMgbmVlZGVkIHRvIGVuc3VyZSB0aGF0IGl0IHdpbGwgbm90IGJlCi1kaXNjYXJkZWQsIGNhdXNpbmcgXGNkYXRhe1NwYW1FcnJvcn0gdG8gYmVjb21lIGEgZGFuZ2xpbmcgcG9pbnRlci4KLVNob3VsZCBpdCBiZWNvbWUgYSBkYW5nbGluZyBwb2ludGVyLCBDIGNvZGUgd2hpY2ggcmFpc2VzIHRoZSBleGNlcHRpb24KLWNvdWxkIGNhdXNlIGEgY29yZSBkdW1wIG9yIG90aGVyIHVuaW50ZW5kZWQgc2lkZSBlZmZlY3RzLgotCi1XZSBkaXNjdXNzIHRoZSB1c2Ugb2YgUHlNT0RJTklUX0ZVTkMgYXMgYSBmdW5jdGlvbiByZXR1cm4gdHlwZSBsYXRlciBpbiB0aGlzCi1zYW1wbGUuCi0KLVxzZWN0aW9ue0JhY2sgdG8gdGhlIEV4YW1wbGUKLSAgICAgICAgIFxsYWJlbHtiYWNrVG9FeGFtcGxlfX0KLQotR29pbmcgYmFjayB0byBvdXIgZXhhbXBsZSBmdW5jdGlvbiwgeW91IHNob3VsZCBub3cgYmUgYWJsZSB0bwotdW5kZXJzdGFuZCB0aGlzIHN0YXRlbWVudDoKLQotXGJlZ2lue3ZlcmJhdGltfQotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZjb21tYW5kKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci1cZW5ke3ZlcmJhdGltfQotCi1JdCByZXR1cm5zIFxOVUxMe30gKHRoZSBlcnJvciBpbmRpY2F0b3IgZm9yIGZ1bmN0aW9ucyByZXR1cm5pbmcKLW9iamVjdCBwb2ludGVycykgaWYgYW4gZXJyb3IgaXMgZGV0ZWN0ZWQgaW4gdGhlIGFyZ3VtZW50IGxpc3QsIHJlbHlpbmcKLW9uIHRoZSBleGNlcHRpb24gc2V0IGJ5IFxjZnVuY3Rpb257UHlBcmdfUGFyc2VUdXBsZSgpfS4gIE90aGVyd2lzZSB0aGUKLXN0cmluZyB2YWx1ZSBvZiB0aGUgYXJndW1lbnQgaGFzIGJlZW4gY29waWVkIHRvIHRoZSBsb2NhbCB2YXJpYWJsZQotXGNkYXRhe2NvbW1hbmR9LiAgVGhpcyBpcyBhIHBvaW50ZXIgYXNzaWdubWVudCBhbmQgeW91IGFyZSBub3Qgc3VwcG9zZWQKLXRvIG1vZGlmeSB0aGUgc3RyaW5nIHRvIHdoaWNoIGl0IHBvaW50cyAoc28gaW4gU3RhbmRhcmQgQywgdGhlIHZhcmlhYmxlCi1cY2RhdGF7Y29tbWFuZH0gc2hvdWxkIHByb3Blcmx5IGJlIGRlY2xhcmVkIGFzIFxzYW1we2NvbnN0IGNoYXIKLSpjb21tYW5kfSkuCi0KLVRoZSBuZXh0IHN0YXRlbWVudCBpcyBhIGNhbGwgdG8gdGhlIFxVTklYe30gZnVuY3Rpb24KLVxjZnVuY3Rpb257c3lzdGVtKCl9LCBwYXNzaW5nIGl0IHRoZSBzdHJpbmcgd2UganVzdCBnb3QgZnJvbQotXGNmdW5jdGlvbntQeUFyZ19QYXJzZVR1cGxlKCl9OgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgc3RzID0gc3lzdGVtKGNvbW1hbmQpOwotXGVuZHt2ZXJiYXRpbX0KLQotT3VyIFxmdW5jdGlvbntzcGFtLnN5c3RlbSgpfSBmdW5jdGlvbiBtdXN0IHJldHVybiB0aGUgdmFsdWUgb2YKLVxjZGF0YXtzdHN9IGFzIGEgUHl0aG9uIG9iamVjdC4gIFRoaXMgaXMgZG9uZSB1c2luZyB0aGUgZnVuY3Rpb24KLVxjZnVuY3Rpb257UHlfQnVpbGRWYWx1ZSgpfSwgd2hpY2ggaXMgc29tZXRoaW5nIGxpa2UgdGhlIGludmVyc2Ugb2YKLVxjZnVuY3Rpb257UHlBcmdfUGFyc2VUdXBsZSgpfTogaXQgdGFrZXMgYSBmb3JtYXQgc3RyaW5nIGFuZCBhbgotYXJiaXRyYXJ5IG51bWJlciBvZiBDIHZhbHVlcywgYW5kIHJldHVybnMgYSBuZXcgUHl0aG9uIG9iamVjdC4KLU1vcmUgaW5mbyBvbiBcY2Z1bmN0aW9ue1B5X0J1aWxkVmFsdWUoKX0gaXMgZ2l2ZW4gbGF0ZXIuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0cyk7Ci1cZW5ke3ZlcmJhdGltfQotCi1JbiB0aGlzIGNhc2UsIGl0IHdpbGwgcmV0dXJuIGFuIGludGVnZXIgb2JqZWN0LiAgKFllcywgZXZlbiBpbnRlZ2VycwotYXJlIG9iamVjdHMgb24gdGhlIGhlYXAgaW4gUHl0aG9uISkKLQotSWYgeW91IGhhdmUgYSBDIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBubyB1c2VmdWwgYXJndW1lbnQgKGEgZnVuY3Rpb24KLXJldHVybmluZyBcY3R5cGV7dm9pZH0pLCB0aGUgY29ycmVzcG9uZGluZyBQeXRob24gZnVuY3Rpb24gbXVzdCByZXR1cm4KLVxjb2Rle05vbmV9LiAgIFlvdSBuZWVkIHRoaXMgaWRpb20gdG8gZG8gc28gKHdoaWNoIGlzIGltcGxlbWVudGVkIGJ5IHRoZQotXGNzaW1wbGVtYWNyb3tQeV9SRVRVUk5fTk9ORX0gbWFjcm8pOgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgIHJldHVybiBQeV9Ob25lOwotXGVuZHt2ZXJiYXRpbX0KLQotXGNkYXRhe1B5X05vbmV9IGlzIHRoZSBDIG5hbWUgZm9yIHRoZSBzcGVjaWFsIFB5dGhvbiBvYmplY3QKLVxjb2Rle05vbmV9LiAgSXQgaXMgYSBnZW51aW5lIFB5dGhvbiBvYmplY3QgcmF0aGVyIHRoYW4gYSBcTlVMTHt9Ci1wb2ludGVyLCB3aGljaCBtZWFucyBgYGVycm9yJycgaW4gbW9zdCBjb250ZXh0cywgYXMgd2UgaGF2ZSBzZWVuLgotCi0KLVxzZWN0aW9ue1RoZSBNb2R1bGUncyBNZXRob2QgVGFibGUgYW5kIEluaXRpYWxpemF0aW9uIEZ1bmN0aW9uCi0gICAgICAgICBcbGFiZWx7bWV0aG9kVGFibGV9fQotCi1JIHByb21pc2VkIHRvIHNob3cgaG93IFxjZnVuY3Rpb257c3BhbV9zeXN0ZW0oKX0gaXMgY2FsbGVkIGZyb20gUHl0aG9uCi1wcm9ncmFtcy4gIEZpcnN0LCB3ZSBuZWVkIHRvIGxpc3QgaXRzIG5hbWUgYW5kIGFkZHJlc3MgaW4gYSBgYG1ldGhvZAotdGFibGUnJzoKLQotXGJlZ2lue3ZlcmJhdGltfQotc3RhdGljIFB5TWV0aG9kRGVmIFNwYW1NZXRob2RzW10gPSB7Ci0gICAgLi4uCi0gICAgeyJzeXN0ZW0iLCAgc3BhbV9zeXN0ZW0sIE1FVEhfVkFSQVJHUywKLSAgICAgIkV4ZWN1dGUgYSBzaGVsbCBjb21tYW5kLiJ9LAotICAgIC4uLgotICAgIHtOVUxMLCBOVUxMLCAwLCBOVUxMfSAgICAgICAgLyogU2VudGluZWwgKi8KLX07Ci1cZW5ke3ZlcmJhdGltfQotCi1Ob3RlIHRoZSB0aGlyZCBlbnRyeSAoXHNhbXB7TUVUSF9WQVJBUkdTfSkuICBUaGlzIGlzIGEgZmxhZyB0ZWxsaW5nCi10aGUgaW50ZXJwcmV0ZXIgdGhlIGNhbGxpbmcgY29udmVudGlvbiB0byBiZSB1c2VkIGZvciB0aGUgQwotZnVuY3Rpb24uICBJdCBzaG91bGQgbm9ybWFsbHkgYWx3YXlzIGJlIFxzYW1we01FVEhfVkFSQVJHU30gb3IKLVxzYW1we01FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFN9OyBhIHZhbHVlIG9mIFxjb2RlezB9IG1lYW5zIHRoYXQgYW4KLW9ic29sZXRlIHZhcmlhbnQgb2YgXGNmdW5jdGlvbntQeUFyZ19QYXJzZVR1cGxlKCl9IGlzIHVzZWQuCi0KLVdoZW4gdXNpbmcgb25seSBcc2FtcHtNRVRIX1ZBUkFSR1N9LCB0aGUgZnVuY3Rpb24gc2hvdWxkIGV4cGVjdAotdGhlIFB5dGhvbi1sZXZlbCBwYXJhbWV0ZXJzIHRvIGJlIHBhc3NlZCBpbiBhcyBhIHR1cGxlIGFjY2VwdGFibGUgZm9yCi1wYXJzaW5nIHZpYSBcY2Z1bmN0aW9ue1B5QXJnX1BhcnNlVHVwbGUoKX07IG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcwotZnVuY3Rpb24gaXMgcHJvdmlkZWQgYmVsb3cuCi0KLVRoZSBcY29uc3RhbnR7TUVUSF9LRVlXT1JEU30gYml0IG1heSBiZSBzZXQgaW4gdGhlIHRoaXJkIGZpZWxkIGlmCi1rZXl3b3JkIGFyZ3VtZW50cyBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbi4gIEluIHRoaXMgY2FzZSwgdGhlCi1DIGZ1bmN0aW9uIHNob3VsZCBhY2NlcHQgYSB0aGlyZCBcc2FtcHtQeU9iamVjdCAqfSBwYXJhbWV0ZXIgd2hpY2gKLXdpbGwgYmUgYSBkaWN0aW9uYXJ5IG9mIGtleXdvcmRzLiAgVXNlCi1cY2Z1bmN0aW9ue1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcygpfSB0byBwYXJzZSB0aGUgYXJndW1lbnRzIHRvCi1zdWNoIGEgZnVuY3Rpb24uCi0KLVRoZSBtZXRob2QgdGFibGUgbXVzdCBiZSBwYXNzZWQgdG8gdGhlIGludGVycHJldGVyIGluIHRoZSBtb2R1bGUncwotaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uICBUaGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gbXVzdCBiZSBuYW1lZAotXGNmdW5jdGlvbntpbml0XHZhcntuYW1lfSgpfSwgd2hlcmUgXHZhcntuYW1lfSBpcyB0aGUgbmFtZSBvZiB0aGUKLW1vZHVsZSwgYW5kIHNob3VsZCBiZSB0aGUgb25seSBub24tXGtleXdvcmR7c3RhdGljfSBpdGVtIGRlZmluZWQgaW4KLXRoZSBtb2R1bGUgZmlsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotUHlNT0RJTklUX0ZVTkMKLWluaXRzcGFtKHZvaWQpCi17Ci0gICAgKHZvaWQpIFB5X0luaXRNb2R1bGUoInNwYW0iLCBTcGFtTWV0aG9kcyk7Ci19Ci1cZW5ke3ZlcmJhdGltfQotCi1Ob3RlIHRoYXQgUHlNT0RJTklUX0ZVTkMgZGVjbGFyZXMgdGhlIGZ1bmN0aW9uIGFzIFxjb2Rle3ZvaWR9IHJldHVybiB0eXBlLCAKLWRlY2xhcmVzIGFueSBzcGVjaWFsIGxpbmthZ2UgZGVjbGFyYXRpb25zIHJlcXVpcmVkIGJ5IHRoZSBwbGF0Zm9ybSwgYW5kIGZvciAKLVxDcHB7fSBkZWNsYXJlcyB0aGUgZnVuY3Rpb24gYXMgXGNvZGV7ZXh0ZXJuICJDIn0uCi0KLVdoZW4gdGhlIFB5dGhvbiBwcm9ncmFtIGltcG9ydHMgbW9kdWxlIFxtb2R1bGV7c3BhbX0gZm9yIHRoZSBmaXJzdAotdGltZSwgXGNmdW5jdGlvbntpbml0c3BhbSgpfSBpcyBjYWxsZWQuIChTZWUgYmVsb3cgZm9yIGNvbW1lbnRzIGFib3V0Ci1lbWJlZGRpbmcgUHl0aG9uLikgIEl0IGNhbGxzCi1cY2Z1bmN0aW9ue1B5X0luaXRNb2R1bGUoKX0sIHdoaWNoIGNyZWF0ZXMgYSBgYG1vZHVsZSBvYmplY3QnJyAod2hpY2gKLWlzIGluc2VydGVkIGluIHRoZSBkaWN0aW9uYXJ5IFxjb2Rle3N5cy5tb2R1bGVzfSB1bmRlciB0aGUga2V5Ci1cY29kZXsic3BhbSJ9KSwgYW5kIGluc2VydHMgYnVpbHQtaW4gZnVuY3Rpb24gb2JqZWN0cyBpbnRvIHRoZSBuZXdseQotY3JlYXRlZCBtb2R1bGUgYmFzZWQgdXBvbiB0aGUgdGFibGUgKGFuIGFycmF5IG9mIFxjdHlwZXtQeU1ldGhvZERlZn0KLXN0cnVjdHVyZXMpIHRoYXQgd2FzIHBhc3NlZCBhcyBpdHMgc2Vjb25kIGFyZ3VtZW50LgotXGNmdW5jdGlvbntQeV9Jbml0TW9kdWxlKCl9IHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBtb2R1bGUgb2JqZWN0Ci10aGF0IGl0IGNyZWF0ZXMgKHdoaWNoIGlzIHVudXNlZCBoZXJlKS4gIEl0IG1heSBhYm9ydCB3aXRoIGEgZmF0YWwgZXJyb3IKLWZvciBjZXJ0YWluIGVycm9ycywgb3IgcmV0dXJuIFxOVUxMe30gaWYgdGhlIG1vZHVsZSBjb3VsZCBub3QgYmUKLWluaXRpYWxpemVkIHNhdGlzZmFjdG9yaWx5LgotCi1XaGVuIGVtYmVkZGluZyBQeXRob24sIHRoZSBcY2Z1bmN0aW9ue2luaXRzcGFtKCl9IGZ1bmN0aW9uIGlzIG5vdAotY2FsbGVkIGF1dG9tYXRpY2FsbHkgdW5sZXNzIHRoZXJlJ3MgYW4gZW50cnkgaW4gdGhlCi1cY2RhdGF7X1B5SW1wb3J0X0luaXR0YWJ9IHRhYmxlLiAgVGhlIGVhc2llc3Qgd2F5IHRvIGhhbmRsZSB0aGlzIGlzIHRvIAotc3RhdGljYWxseSBpbml0aWFsaXplIHlvdXIgc3RhdGljYWxseS1saW5rZWQgbW9kdWxlcyBieSBkaXJlY3RseQotY2FsbGluZyBcY2Z1bmN0aW9ue2luaXRzcGFtKCl9IGFmdGVyIHRoZSBjYWxsIHRvCi1cY2Z1bmN0aW9ue1B5X0luaXRpYWxpemUoKX06Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWludAotbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICAgIC8qIFBhc3MgYXJndlswXSB0byB0aGUgUHl0aG9uIGludGVycHJldGVyICovCi0gICAgUHlfU2V0UHJvZ3JhbU5hbWUoYXJndlswXSk7Ci0KLSAgICAvKiBJbml0aWFsaXplIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIuICBSZXF1aXJlZC4gKi8KLSAgICBQeV9Jbml0aWFsaXplKCk7Ci0KLSAgICAvKiBBZGQgYSBzdGF0aWMgbW9kdWxlICovCi0gICAgaW5pdHNwYW0oKTsKLVxlbmR7dmVyYmF0aW19Ci0KLUFuIGV4YW1wbGUgbWF5IGJlIGZvdW5kIGluIHRoZSBmaWxlIFxmaWxle0RlbW8vZW1iZWQvZGVtby5jfSBpbiB0aGUKLVB5dGhvbiBzb3VyY2UgZGlzdHJpYnV0aW9uLgotCi1cbm90ZXtSZW1vdmluZyBlbnRyaWVzIGZyb20gXGNvZGV7c3lzLm1vZHVsZXN9IG9yIGltcG9ydGluZwotY29tcGlsZWQgbW9kdWxlcyBpbnRvIG11bHRpcGxlIGludGVycHJldGVycyB3aXRoaW4gYSBwcm9jZXNzIChvcgotZm9sbG93aW5nIGEgXGNmdW5jdGlvbntmb3JrKCl9IHdpdGhvdXQgYW4gaW50ZXJ2ZW5pbmcKLVxjZnVuY3Rpb257ZXhlYygpfSkgY2FuIGNyZWF0ZSBwcm9ibGVtcyBmb3Igc29tZSBleHRlbnNpb24gbW9kdWxlcy4KLUV4dGVuc2lvbiBtb2R1bGUgYXV0aG9ycyBzaG91bGQgZXhlcmNpc2UgY2F1dGlvbiB3aGVuIGluaXRpYWxpemluZwotaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzLn0KLQotQSBtb3JlIHN1YnN0YW50aWFsIGV4YW1wbGUgbW9kdWxlIGlzIGluY2x1ZGVkIGluIHRoZSBQeXRob24gc291cmNlCi1kaXN0cmlidXRpb24gYXMgXGZpbGV7TW9kdWxlcy94eG1vZHVsZS5jfS4gIFRoaXMgZmlsZSBtYXkgYmUgdXNlZCBhcyBhIAotdGVtcGxhdGUgb3Igc2ltcGx5IHJlYWQgYXMgYW4gZXhhbXBsZS4gIFRoZSBccHJvZ3JhbXttb2R1bGF0b3IucHl9Ci1zY3JpcHQgaW5jbHVkZWQgaW4gdGhlIHNvdXJjZSBkaXN0cmlidXRpb24gb3IgV2luZG93cyBpbnN0YWxsIHByb3ZpZGVzIAotYSBzaW1wbGUgZ3JhcGhpY2FsIHVzZXIgaW50ZXJmYWNlIGZvciBkZWNsYXJpbmcgdGhlIGZ1bmN0aW9ucyBhbmQKLW9iamVjdHMgd2hpY2ggYSBtb2R1bGUgc2hvdWxkIGltcGxlbWVudCwgYW5kIGNhbiBnZW5lcmF0ZSBhIHRlbXBsYXRlCi13aGljaCBjYW4gYmUgZmlsbGVkIGluLiAgVGhlIHNjcmlwdCBsaXZlcyBpbiB0aGUKLVxmaWxle1Rvb2xzL21vZHVsYXRvci99IGRpcmVjdG9yeTsgc2VlIHRoZSBcZmlsZXtSRUFETUV9IGZpbGUgdGhlcmUKLWZvciBtb3JlIGluZm9ybWF0aW9uLgotCi0KLVxzZWN0aW9ue0NvbXBpbGF0aW9uIGFuZCBMaW5rYWdlCi0gICAgICAgICBcbGFiZWx7Y29tcGlsYXRpb259fQotCi1UaGVyZSBhcmUgdHdvIG1vcmUgdGhpbmdzIHRvIGRvIGJlZm9yZSB5b3UgY2FuIHVzZSB5b3VyIG5ldyBleHRlbnNpb246Ci1jb21waWxpbmcgYW5kIGxpbmtpbmcgaXQgd2l0aCB0aGUgUHl0aG9uIHN5c3RlbS4gIElmIHlvdSB1c2UgZHluYW1pYwotbG9hZGluZywgdGhlIGRldGFpbHMgbWF5IGRlcGVuZCBvbiB0aGUgc3R5bGUgb2YgZHluYW1pYyBsb2FkaW5nIHlvdXIKLXN5c3RlbSB1c2VzOyBzZWUgdGhlIGNoYXB0ZXJzIGFib3V0IGJ1aWxkaW5nIGV4dGVuc2lvbiBtb2R1bGVzCi0oY2hhcHRlciBccmVme2J1aWxkaW5nfSkgYW5kIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdGhhdCBwZXJ0YWlucyBvbmx5Ci10byBidWlsZGluZyBvbiBXaW5kb3dzIChjaGFwdGVyIFxyZWZ7YnVpbGRpbmctb24td2luZG93c30pIGZvciBtb3JlCi1pbmZvcm1hdGlvbiBhYm91dCB0aGlzLgotCi1JZiB5b3UgY2FuJ3QgdXNlIGR5bmFtaWMgbG9hZGluZywgb3IgaWYgeW91IHdhbnQgdG8gbWFrZSB5b3VyIG1vZHVsZSBhCi1wZXJtYW5lbnQgcGFydCBvZiB0aGUgUHl0aG9uIGludGVycHJldGVyLCB5b3Ugd2lsbCBoYXZlIHRvIGNoYW5nZSB0aGUKLWNvbmZpZ3VyYXRpb24gc2V0dXAgYW5kIHJlYnVpbGQgdGhlIGludGVycHJldGVyLiAgTHVja2lseSwgdGhpcyBpcwotdmVyeSBzaW1wbGUgb24gXFVOSVg6IGp1c3QgcGxhY2UgeW91ciBmaWxlIChcZmlsZXtzcGFtbW9kdWxlLmN9IGZvcgotZXhhbXBsZSkgaW4gdGhlIFxmaWxle01vZHVsZXMvfSBkaXJlY3Rvcnkgb2YgYW4gdW5wYWNrZWQgc291cmNlCi1kaXN0cmlidXRpb24sIGFkZCBhIGxpbmUgdG8gdGhlIGZpbGUgXGZpbGV7TW9kdWxlcy9TZXR1cC5sb2NhbH0KLWRlc2NyaWJpbmcgeW91ciBmaWxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1zcGFtIHNwYW1tb2R1bGUubwotXGVuZHt2ZXJiYXRpbX0KLQotYW5kIHJlYnVpbGQgdGhlIGludGVycHJldGVyIGJ5IHJ1bm5pbmcgXHByb2dyYW17bWFrZX0gaW4gdGhlIHRvcGxldmVsCi1kaXJlY3RvcnkuICBZb3UgY2FuIGFsc28gcnVuIFxwcm9ncmFte21ha2V9IGluIHRoZSBcZmlsZXtNb2R1bGVzL30KLXN1YmRpcmVjdG9yeSwgYnV0IHRoZW4geW91IG11c3QgZmlyc3QgcmVidWlsZCBcZmlsZXtNYWtlZmlsZX0KLXRoZXJlIGJ5IHJ1bm5pbmcgYFxwcm9ncmFte21ha2V9IE1ha2VmaWxlJy4gIChUaGlzIGlzIG5lY2Vzc2FyeSBlYWNoCi10aW1lIHlvdSBjaGFuZ2UgdGhlIFxmaWxle1NldHVwfSBmaWxlLikKLQotSWYgeW91ciBtb2R1bGUgcmVxdWlyZXMgYWRkaXRpb25hbCBsaWJyYXJpZXMgdG8gbGluayB3aXRoLCB0aGVzZSBjYW4KLWJlIGxpc3RlZCBvbiB0aGUgbGluZSBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGFzIHdlbGwsIGZvciBpbnN0YW5jZToKLQotXGJlZ2lue3ZlcmJhdGltfQotc3BhbSBzcGFtbW9kdWxlLm8gLWxYMTEKLVxlbmR7dmVyYmF0aW19Ci0KLVxzZWN0aW9ue0NhbGxpbmcgUHl0aG9uIEZ1bmN0aW9ucyBmcm9tIEMKLSAgICAgICAgIFxsYWJlbHtjYWxsaW5nUHl0aG9ufX0KLQotU28gZmFyIHdlIGhhdmUgY29uY2VudHJhdGVkIG9uIG1ha2luZyBDIGZ1bmN0aW9ucyBjYWxsYWJsZSBmcm9tCi1QeXRob24uICBUaGUgcmV2ZXJzZSBpcyBhbHNvIHVzZWZ1bDogY2FsbGluZyBQeXRob24gZnVuY3Rpb25zIGZyb20gQy4KLVRoaXMgaXMgZXNwZWNpYWxseSB0aGUgY2FzZSBmb3IgbGlicmFyaWVzIHRoYXQgc3VwcG9ydCBzby1jYWxsZWQKLWBgY2FsbGJhY2snJyBmdW5jdGlvbnMuICBJZiBhIEMgaW50ZXJmYWNlIG1ha2VzIHVzZSBvZiBjYWxsYmFja3MsIHRoZQotZXF1aXZhbGVudCBQeXRob24gb2Z0ZW4gbmVlZHMgdG8gcHJvdmlkZSBhIGNhbGxiYWNrIG1lY2hhbmlzbSB0byB0aGUKLVB5dGhvbiBwcm9ncmFtbWVyOyB0aGUgaW1wbGVtZW50YXRpb24gd2lsbCByZXF1aXJlIGNhbGxpbmcgdGhlIFB5dGhvbgotY2FsbGJhY2sgZnVuY3Rpb25zIGZyb20gYSBDIGNhbGxiYWNrLiAgT3RoZXIgdXNlcyBhcmUgYWxzbyBpbWFnaW5hYmxlLgotCi1Gb3J0dW5hdGVseSwgdGhlIFB5dGhvbiBpbnRlcnByZXRlciBpcyBlYXNpbHkgY2FsbGVkIHJlY3Vyc2l2ZWx5LCBhbmQKLXRoZXJlIGlzIGEgc3RhbmRhcmQgaW50ZXJmYWNlIHRvIGNhbGwgYSBQeXRob24gZnVuY3Rpb24uICAoSSB3b24ndAotZHdlbGwgb24gaG93IHRvIGNhbGwgdGhlIFB5dGhvbiBwYXJzZXIgd2l0aCBhIHBhcnRpY3VsYXIgc3RyaW5nIGFzCi1pbnB1dCAtLS0gaWYgeW91J3JlIGludGVyZXN0ZWQsIGhhdmUgYSBsb29rIGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBvZgotdGhlIFxwcm9ncmFtb3B0ey1jfSBjb21tYW5kIGxpbmUgb3B0aW9uIGluIFxmaWxle1B5dGhvbi9weXRob25tYWluLmN9Ci1mcm9tIHRoZSBQeXRob24gc291cmNlIGNvZGUuKQotCi1DYWxsaW5nIGEgUHl0aG9uIGZ1bmN0aW9uIGlzIGVhc3kuICBGaXJzdCwgdGhlIFB5dGhvbiBwcm9ncmFtIG11c3QKLXNvbWVob3cgcGFzcyB5b3UgdGhlIFB5dGhvbiBmdW5jdGlvbiBvYmplY3QuICBZb3Ugc2hvdWxkIHByb3ZpZGUgYQotZnVuY3Rpb24gKG9yIHNvbWUgb3RoZXIgaW50ZXJmYWNlKSB0byBkbyB0aGlzLiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzCi1jYWxsZWQsIHNhdmUgYSBwb2ludGVyIHRvIHRoZSBQeXRob24gZnVuY3Rpb24gb2JqZWN0IChiZSBjYXJlZnVsIHRvCi1cY2Z1bmN0aW9ue1B5X0lOQ1JFRigpfSBpdCEpIGluIGEgZ2xvYmFsIHZhcmlhYmxlIC0tLSBvciB3aGVyZXZlciB5b3UKLXNlZSBmaXQuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIG1pZ2h0IGJlIHBhcnQgb2YgYSBtb2R1bGUKLWRlZmluaXRpb246Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXN0YXRpYyBQeU9iamVjdCAqbXlfY2FsbGJhY2sgPSBOVUxMOwotCi1zdGF0aWMgUHlPYmplY3QgKgotbXlfc2V0X2NhbGxiYWNrKFB5T2JqZWN0ICpkdW1teSwgUHlPYmplY3QgKmFyZ3MpCi17Ci0gICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7Ci0gICAgUHlPYmplY3QgKnRlbXA7Ci0KLSAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpzZXRfY2FsbGJhY2siLCAmdGVtcCkpIHsKLSAgICAgICAgaWYgKCFQeUNhbGxhYmxlX0NoZWNrKHRlbXApKSB7Ci0gICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAicGFyYW1ldGVyIG11c3QgYmUgY2FsbGFibGUiKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIFB5X1hJTkNSRUYodGVtcCk7ICAgICAgICAgLyogQWRkIGEgcmVmZXJlbmNlIHRvIG5ldyBjYWxsYmFjayAqLwotICAgICAgICBQeV9YREVDUkVGKG15X2NhbGxiYWNrKTsgIC8qIERpc3Bvc2Ugb2YgcHJldmlvdXMgY2FsbGJhY2sgKi8KLSAgICAgICAgbXlfY2FsbGJhY2sgPSB0ZW1wOyAgICAgICAvKiBSZW1lbWJlciBuZXcgY2FsbGJhY2sgKi8KLSAgICAgICAgLyogQm9pbGVycGxhdGUgdG8gcmV0dXJuICJOb25lIiAqLwotICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgIHJlc3VsdCA9IFB5X05vbmU7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci1cZW5ke3ZlcmJhdGltfQotCi1UaGlzIGZ1bmN0aW9uIG11c3QgYmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBpbnRlcnByZXRlciB1c2luZyB0aGUKLVxjb25zdGFudHtNRVRIX1ZBUkFSR1N9IGZsYWc7IHRoaXMgaXMgZGVzY3JpYmVkIGluIHNlY3Rpb24KLVxyZWZ7bWV0aG9kVGFibGV9LCBgYFRoZSBNb2R1bGUncyBNZXRob2QgVGFibGUgYW5kIEluaXRpYWxpemF0aW9uCi1GdW5jdGlvbi4nJyAgVGhlIFxjZnVuY3Rpb257UHlBcmdfUGFyc2VUdXBsZSgpfSBmdW5jdGlvbiBhbmQgaXRzCi1hcmd1bWVudHMgYXJlIGRvY3VtZW50ZWQgaW4gc2VjdGlvbn5ccmVme3BhcnNlVHVwbGV9LCBgYEV4dHJhY3RpbmcKLVBhcmFtZXRlcnMgaW4gRXh0ZW5zaW9uIEZ1bmN0aW9ucy4nJwotCi1UaGUgbWFjcm9zIFxjZnVuY3Rpb257UHlfWElOQ1JFRigpfSBhbmQgXGNmdW5jdGlvbntQeV9YREVDUkVGKCl9Ci1pbmNyZW1lbnQvZGVjcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgb2YgYW4gb2JqZWN0IGFuZCBhcmUgc2FmZSBpbgotdGhlIHByZXNlbmNlIG9mIFxOVUxMe30gcG9pbnRlcnMgKGJ1dCBub3RlIHRoYXQgXHZhcnt0ZW1wfSB3aWxsIG5vdCBiZSAKLVxOVUxMe30gaW4gdGhpcyBjb250ZXh0KS4gIE1vcmUgaW5mbyBvbiB0aGVtIGluCi1zZWN0aW9uflxyZWZ7cmVmY291bnRzfSwgYGBSZWZlcmVuY2UgQ291bnRzLicnCi0KLUxhdGVyLCB3aGVuIGl0IGlzIHRpbWUgdG8gY2FsbCB0aGUgZnVuY3Rpb24sIHlvdSBjYWxsIHRoZSBDIGZ1bmN0aW9uCi1cY2Z1bmN0aW9ue1B5RXZhbF9DYWxsT2JqZWN0KCl9Llx0dGluZGV4e1B5RXZhbF9DYWxsT2JqZWN0KCl9ICBUaGlzCi1mdW5jdGlvbiBoYXMgdHdvIGFyZ3VtZW50cywgYm90aCBwb2ludGVycyB0byBhcmJpdHJhcnkgUHl0aG9uIG9iamVjdHM6Ci10aGUgUHl0aG9uIGZ1bmN0aW9uLCBhbmQgdGhlIGFyZ3VtZW50IGxpc3QuICBUaGUgYXJndW1lbnQgbGlzdCBtdXN0Ci1hbHdheXMgYmUgYSB0dXBsZSBvYmplY3QsIHdob3NlIGxlbmd0aCBpcyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4gIFRvCi1jYWxsIHRoZSBQeXRob24gZnVuY3Rpb24gd2l0aCBubyBhcmd1bWVudHMsIHBhc3MgYW4gZW1wdHkgdHVwbGU7IHRvCi1jYWxsIGl0IHdpdGggb25lIGFyZ3VtZW50LCBwYXNzIGEgc2luZ2xldG9uIHR1cGxlLgotXGNmdW5jdGlvbntQeV9CdWlsZFZhbHVlKCl9IHJldHVybnMgYSB0dXBsZSB3aGVuIGl0cyBmb3JtYXQgc3RyaW5nCi1jb25zaXN0cyBvZiB6ZXJvIG9yIG1vcmUgZm9ybWF0IGNvZGVzIGJldHdlZW4gcGFyZW50aGVzZXMuICBGb3IKLWV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICBpbnQgYXJnOwotICAgIFB5T2JqZWN0ICphcmdsaXN0OwotICAgIFB5T2JqZWN0ICpyZXN1bHQ7Ci0gICAgLi4uCi0gICAgYXJnID0gMTIzOwotICAgIC4uLgotICAgIC8qIFRpbWUgdG8gY2FsbCB0aGUgY2FsbGJhY2sgKi8KLSAgICBhcmdsaXN0ID0gUHlfQnVpbGRWYWx1ZSgiKGkpIiwgYXJnKTsKLSAgICByZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdChteV9jYWxsYmFjaywgYXJnbGlzdCk7Ci0gICAgUHlfREVDUkVGKGFyZ2xpc3QpOwotXGVuZHt2ZXJiYXRpbX0KLQotXGNmdW5jdGlvbntQeUV2YWxfQ2FsbE9iamVjdCgpfSByZXR1cm5zIGEgUHl0aG9uIG9iamVjdCBwb2ludGVyOiB0aGlzIGlzCi10aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBQeXRob24gZnVuY3Rpb24uICBcY2Z1bmN0aW9ue1B5RXZhbF9DYWxsT2JqZWN0KCl9IGlzCi1gYHJlZmVyZW5jZS1jb3VudC1uZXV0cmFsJycgd2l0aCByZXNwZWN0IHRvIGl0cyBhcmd1bWVudHMuICBJbiB0aGUKLWV4YW1wbGUgYSBuZXcgdHVwbGUgd2FzIGNyZWF0ZWQgdG8gc2VydmUgYXMgdGhlIGFyZ3VtZW50IGxpc3QsIHdoaWNoCi1pcyBcY2Z1bmN0aW9ue1B5X0RFQ1JFRigpfS1lZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgY2FsbC4KLQotVGhlIHJldHVybiB2YWx1ZSBvZiBcY2Z1bmN0aW9ue1B5RXZhbF9DYWxsT2JqZWN0KCl9IGlzIGBgbmV3Jyc6IGVpdGhlciBpdAotaXMgYSBicmFuZCBuZXcgb2JqZWN0LCBvciBpdCBpcyBhbiBleGlzdGluZyBvYmplY3Qgd2hvc2UgcmVmZXJlbmNlCi1jb3VudCBoYXMgYmVlbiBpbmNyZW1lbnRlZC4gIFNvLCB1bmxlc3MgeW91IHdhbnQgdG8gc2F2ZSBpdCBpbiBhCi1nbG9iYWwgdmFyaWFibGUsIHlvdSBzaG91bGQgc29tZWhvdyBcY2Z1bmN0aW9ue1B5X0RFQ1JFRigpfSB0aGUgcmVzdWx0LAotZXZlbiAoZXNwZWNpYWxseSEpIGlmIHlvdSBhcmUgbm90IGludGVyZXN0ZWQgaW4gaXRzIHZhbHVlLgotCi1CZWZvcmUgeW91IGRvIHRoaXMsIGhvd2V2ZXIsIGl0IGlzIGltcG9ydGFudCB0byBjaGVjayB0aGF0IHRoZSByZXR1cm4KLXZhbHVlIGlzbid0IFxOVUxMLiAgSWYgaXQgaXMsIHRoZSBQeXRob24gZnVuY3Rpb24gdGVybWluYXRlZCBieQotcmFpc2luZyBhbiBleGNlcHRpb24uICBJZiB0aGUgQyBjb2RlIHRoYXQgY2FsbGVkCi1cY2Z1bmN0aW9ue1B5RXZhbF9DYWxsT2JqZWN0KCl9IGlzIGNhbGxlZCBmcm9tIFB5dGhvbiwgaXQgc2hvdWxkIG5vdwotcmV0dXJuIGFuIGVycm9yIGluZGljYXRpb24gdG8gaXRzIFB5dGhvbiBjYWxsZXIsIHNvIHRoZSBpbnRlcnByZXRlcgotY2FuIHByaW50IGEgc3RhY2sgdHJhY2UsIG9yIHRoZSBjYWxsaW5nIFB5dGhvbiBjb2RlIGNhbiBoYW5kbGUgdGhlCi1leGNlcHRpb24uICBJZiB0aGlzIGlzIG5vdCBwb3NzaWJsZSBvciBkZXNpcmFibGUsIHRoZSBleGNlcHRpb24gc2hvdWxkCi1iZSBjbGVhcmVkIGJ5IGNhbGxpbmcgXGNmdW5jdGlvbntQeUVycl9DbGVhcigpfS4gIEZvciBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgaWYgKHJlc3VsdCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsgLyogUGFzcyBlcnJvciBiYWNrICovCi0gICAgLi4udXNlIHJlc3VsdC4uLgotICAgIFB5X0RFQ1JFRihyZXN1bHQpOyAKLVxlbmR7dmVyYmF0aW19Ci0KLURlcGVuZGluZyBvbiB0aGUgZGVzaXJlZCBpbnRlcmZhY2UgdG8gdGhlIFB5dGhvbiBjYWxsYmFjayBmdW5jdGlvbiwKLXlvdSBtYXkgYWxzbyBoYXZlIHRvIHByb3ZpZGUgYW4gYXJndW1lbnQgbGlzdCB0bwotXGNmdW5jdGlvbntQeUV2YWxfQ2FsbE9iamVjdCgpfS4gIEluIHNvbWUgY2FzZXMgdGhlIGFyZ3VtZW50IGxpc3QgaXMKLWFsc28gcHJvdmlkZWQgYnkgdGhlIFB5dGhvbiBwcm9ncmFtLCB0aHJvdWdoIHRoZSBzYW1lIGludGVyZmFjZSB0aGF0Ci1zcGVjaWZpZWQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLiAgSXQgY2FuIHRoZW4gYmUgc2F2ZWQgYW5kIHVzZWQgaW4gdGhlCi1zYW1lIG1hbm5lciBhcyB0aGUgZnVuY3Rpb24gb2JqZWN0LiAgSW4gb3RoZXIgY2FzZXMsIHlvdSBtYXkgaGF2ZSB0bwotY29uc3RydWN0IGEgbmV3IHR1cGxlIHRvIHBhc3MgYXMgdGhlIGFyZ3VtZW50IGxpc3QuICBUaGUgc2ltcGxlc3Qgd2F5Ci10byBkbyB0aGlzIGlzIHRvIGNhbGwgXGNmdW5jdGlvbntQeV9CdWlsZFZhbHVlKCl9LiAgRm9yIGV4YW1wbGUsIGlmCi15b3Ugd2FudCB0byBwYXNzIGFuIGludGVncmFsIGV2ZW50IGNvZGUsIHlvdSBtaWdodCB1c2UgdGhlIGZvbGxvd2luZwotY29kZToKLQotXGJlZ2lue3ZlcmJhdGltfQotICAgIFB5T2JqZWN0ICphcmdsaXN0OwotICAgIC4uLgotICAgIGFyZ2xpc3QgPSBQeV9CdWlsZFZhbHVlKCIobCkiLCBldmVudGNvZGUpOwotICAgIHJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KG15X2NhbGxiYWNrLCBhcmdsaXN0KTsKLSAgICBQeV9ERUNSRUYoYXJnbGlzdCk7Ci0gICAgaWYgKHJlc3VsdCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsgLyogUGFzcyBlcnJvciBiYWNrICovCi0gICAgLyogSGVyZSBtYXliZSB1c2UgdGhlIHJlc3VsdCAqLwotICAgIFB5X0RFQ1JFRihyZXN1bHQpOwotXGVuZHt2ZXJiYXRpbX0KLQotTm90ZSB0aGUgcGxhY2VtZW50IG9mIFxzYW1we1B5X0RFQ1JFRihhcmdsaXN0KX0gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlCi1jYWxsLCBiZWZvcmUgdGhlIGVycm9yIGNoZWNrISAgQWxzbyBub3RlIHRoYXQgc3RyaWN0bHkgc3Bva2VuIHRoaXMKLWNvZGUgaXMgbm90IGNvbXBsZXRlOiBcY2Z1bmN0aW9ue1B5X0J1aWxkVmFsdWUoKX0gbWF5IHJ1biBvdXQgb2YKLW1lbW9yeSwgYW5kIHRoaXMgc2hvdWxkIGJlIGNoZWNrZWQuCi0KLQotXHNlY3Rpb257RXh0cmFjdGluZyBQYXJhbWV0ZXJzIGluIEV4dGVuc2lvbiBGdW5jdGlvbnMKLSAgICAgICAgIFxsYWJlbHtwYXJzZVR1cGxlfX0KLQotXHR0aW5kZXh7UHlBcmdfUGFyc2VUdXBsZSgpfQotCi1UaGUgXGNmdW5jdGlvbntQeUFyZ19QYXJzZVR1cGxlKCl9IGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGFzIGZvbGxvd3M6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWludCBQeUFyZ19QYXJzZVR1cGxlKFB5T2JqZWN0ICphcmcsIGNoYXIgKmZvcm1hdCwgLi4uKTsKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBcdmFye2FyZ30gYXJndW1lbnQgbXVzdCBiZSBhIHR1cGxlIG9iamVjdCBjb250YWluaW5nIGFuIGFyZ3VtZW50Ci1saXN0IHBhc3NlZCBmcm9tIFB5dGhvbiB0byBhIEMgZnVuY3Rpb24uICBUaGUgXHZhcntmb3JtYXR9IGFyZ3VtZW50Ci1tdXN0IGJlIGEgZm9ybWF0IHN0cmluZywgd2hvc2Ugc3ludGF4IGlzIGV4cGxhaW5lZCBpbgotYGBcdWxpbmt7UGFyc2luZyBhcmd1bWVudHMgYW5kIGJ1aWxkaW5nCi12YWx1ZXN9ey4uL2FwaS9hcmctcGFyc2luZy5odG1sfScnIGluIHRoZQotXGNpdGV0aXRsZVsuLi9hcGkvYXBpLmh0bWxde1B5dGhvbi9DIEFQSSBSZWZlcmVuY2UgTWFudWFsfS4gIFRoZQotcmVtYWluaW5nIGFyZ3VtZW50cyBtdXN0IGJlIGFkZHJlc3NlcyBvZiB2YXJpYWJsZXMgd2hvc2UgdHlwZSBpcwotZGV0ZXJtaW5lZCBieSB0aGUgZm9ybWF0IHN0cmluZy4KLQotTm90ZSB0aGF0IHdoaWxlIFxjZnVuY3Rpb257UHlBcmdfUGFyc2VUdXBsZSgpfSBjaGVja3MgdGhhdCB0aGUgUHl0aG9uCi1hcmd1bWVudHMgaGF2ZSB0aGUgcmVxdWlyZWQgdHlwZXMsIGl0IGNhbm5vdCBjaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlCi1hZGRyZXNzZXMgb2YgQyB2YXJpYWJsZXMgcGFzc2VkIHRvIHRoZSBjYWxsOiBpZiB5b3UgbWFrZSBtaXN0YWtlcwotdGhlcmUsIHlvdXIgY29kZSB3aWxsIHByb2JhYmx5IGNyYXNoIG9yIGF0IGxlYXN0IG92ZXJ3cml0ZSByYW5kb20gYml0cwotaW4gbWVtb3J5LiAgU28gYmUgY2FyZWZ1bCEKLQotTm90ZSB0aGF0IGFueSBQeXRob24gb2JqZWN0IHJlZmVyZW5jZXMgd2hpY2ggYXJlIHByb3ZpZGVkIHRvIHRoZQotY2FsbGVyIGFyZSBcZW1waHtib3Jyb3dlZH0gcmVmZXJlbmNlczsgZG8gbm90IGRlY3JlbWVudCB0aGVpcgotcmVmZXJlbmNlIGNvdW50IQotCi1Tb21lIGV4YW1wbGUgY2FsbHM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICBpbnQgb2s7Ci0gICAgaW50IGksIGo7Ci0gICAgbG9uZyBrLCBsOwotICAgIGNvbnN0IGNoYXIgKnM7Ci0gICAgaW50IHNpemU7Ci0KLSAgICBvayA9IFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIpOyAvKiBObyBhcmd1bWVudHMgKi8KLSAgICAgICAgLyogUHl0aG9uIGNhbGw6IGYoKSAqLwotXGVuZHt2ZXJiYXRpbX0KLQotXGJlZ2lue3ZlcmJhdGltfQotICAgIG9rID0gUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZzKTsgLyogQSBzdHJpbmcgKi8KLSAgICAgICAgLyogUG9zc2libGUgUHl0aG9uIGNhbGw6IGYoJ3dob29wcyEnKSAqLwotXGVuZHt2ZXJiYXRpbX0KLQotXGJlZ2lue3ZlcmJhdGltfQotICAgIG9rID0gUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGxzIiwgJmssICZsLCAmcyk7IC8qIFR3byBsb25ncyBhbmQgYSBzdHJpbmcgKi8KLSAgICAgICAgLyogUG9zc2libGUgUHl0aG9uIGNhbGw6IGYoMSwgMiwgJ3RocmVlJykgKi8KLVxlbmR7dmVyYmF0aW19Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICBvayA9IFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIihpaSlzIyIsICZpLCAmaiwgJnMsICZzaXplKTsKLSAgICAgICAgLyogQSBwYWlyIG9mIGludHMgYW5kIGEgc3RyaW5nLCB3aG9zZSBzaXplIGlzIGFsc28gcmV0dXJuZWQgKi8KLSAgICAgICAgLyogUG9zc2libGUgUHl0aG9uIGNhbGw6IGYoKDEsIDIpLCAndGhyZWUnKSAqLwotXGVuZHt2ZXJiYXRpbX0KLQotXGJlZ2lue3ZlcmJhdGltfQotICAgIHsKLSAgICAgICAgY29uc3QgY2hhciAqZmlsZTsKLSAgICAgICAgY29uc3QgY2hhciAqbW9kZSA9ICJyIjsKLSAgICAgICAgaW50IGJ1ZnNpemUgPSAwOwotICAgICAgICBvayA9IFB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8c2kiLCAmZmlsZSwgJm1vZGUsICZidWZzaXplKTsKLSAgICAgICAgLyogQSBzdHJpbmcsIGFuZCBvcHRpb25hbGx5IGFub3RoZXIgc3RyaW5nIGFuZCBhbiBpbnRlZ2VyICovCi0gICAgICAgIC8qIFBvc3NpYmxlIFB5dGhvbiBjYWxsczoKLSAgICAgICAgICAgZignc3BhbScpCi0gICAgICAgICAgIGYoJ3NwYW0nLCAndycpCi0gICAgICAgICAgIGYoJ3NwYW0nLCAnd2InLCAxMDAwMDApICovCi0gICAgfQotXGVuZHt2ZXJiYXRpbX0KLQotXGJlZ2lue3ZlcmJhdGltfQotICAgIHsKLSAgICAgICAgaW50IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgaCwgdjsKLSAgICAgICAgb2sgPSBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIoKGlpKShpaSkpKGlpKSIsCi0gICAgICAgICAgICAgICAgICZsZWZ0LCAmdG9wLCAmcmlnaHQsICZib3R0b20sICZoLCAmdik7Ci0gICAgICAgIC8qIEEgcmVjdGFuZ2xlIGFuZCBhIHBvaW50ICovCi0gICAgICAgIC8qIFBvc3NpYmxlIFB5dGhvbiBjYWxsOgotICAgICAgICAgICBmKCgoMCwgMCksICg0MDAsIDMwMCkpLCAoMTAsIDEwKSkgKi8KLSAgICB9Ci1cZW5ke3ZlcmJhdGltfQotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgewotICAgICAgICBQeV9jb21wbGV4IGM7Ci0gICAgICAgIG9rID0gUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiRDpteWZ1bmN0aW9uIiwgJmMpOwotICAgICAgICAvKiBhIGNvbXBsZXgsIGFsc28gcHJvdmlkaW5nIGEgZnVuY3Rpb24gbmFtZSBmb3IgZXJyb3JzICovCi0gICAgICAgIC8qIFBvc3NpYmxlIFB5dGhvbiBjYWxsOiBteWZ1bmN0aW9uKDErMmopICovCi0gICAgfQotXGVuZHt2ZXJiYXRpbX0KLQotCi1cc2VjdGlvbntLZXl3b3JkIFBhcmFtZXRlcnMgZm9yIEV4dGVuc2lvbiBGdW5jdGlvbnMKLSAgICAgICAgIFxsYWJlbHtwYXJzZVR1cGxlQW5kS2V5d29yZHN9fQotCi1cdHRpbmRleHtQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoKX0KLQotVGhlIFxjZnVuY3Rpb257UHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKCl9IGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGFzCi1mb2xsb3dzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbnQgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKFB5T2JqZWN0ICphcmcsIFB5T2JqZWN0ICprd2RpY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmZvcm1hdCwgY2hhciAqa3dsaXN0W10sIC4uLik7Ci1cZW5ke3ZlcmJhdGltfQotCi1UaGUgXHZhcnthcmd9IGFuZCBcdmFye2Zvcm1hdH0gcGFyYW1ldGVycyBhcmUgaWRlbnRpY2FsIHRvIHRob3NlIG9mIHRoZQotXGNmdW5jdGlvbntQeUFyZ19QYXJzZVR1cGxlKCl9IGZ1bmN0aW9uLiAgVGhlIFx2YXJ7a3dkaWN0fSBwYXJhbWV0ZXIKLWlzIHRoZSBkaWN0aW9uYXJ5IG9mIGtleXdvcmRzIHJlY2VpdmVkIGFzIHRoZSB0aGlyZCBwYXJhbWV0ZXIgZnJvbSB0aGUKLVB5dGhvbiBydW50aW1lLiAgVGhlIFx2YXJ7a3dsaXN0fSBwYXJhbWV0ZXIgaXMgYSBcTlVMTC10ZXJtaW5hdGVkCi1saXN0IG9mIHN0cmluZ3Mgd2hpY2ggaWRlbnRpZnkgdGhlIHBhcmFtZXRlcnM7IHRoZSBuYW1lcyBhcmUgbWF0Y2hlZAotd2l0aCB0aGUgdHlwZSBpbmZvcm1hdGlvbiBmcm9tIFx2YXJ7Zm9ybWF0fSBmcm9tIGxlZnQgdG8gcmlnaHQuICBPbgotc3VjY2VzcywgXGNmdW5jdGlvbntQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoKX0gcmV0dXJucyB0cnVlLAotb3RoZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UgYW5kIHJhaXNlcyBhbiBhcHByb3ByaWF0ZSBleGNlcHRpb24uCi0KLVxub3Rle05lc3RlZCB0dXBsZXMgY2Fubm90IGJlIHBhcnNlZCB3aGVuIHVzaW5nIGtleXdvcmQKLWFyZ3VtZW50cyEgIEtleXdvcmQgcGFyYW1ldGVycyBwYXNzZWQgaW4gd2hpY2ggYXJlIG5vdCBwcmVzZW50IGluIHRoZQotXHZhcntrd2xpc3R9IHdpbGwgY2F1c2UgXGV4Y2VwdGlvbntUeXBlRXJyb3J9IHRvIGJlIHJhaXNlZC59Ci0KLUhlcmUgaXMgYW4gZXhhbXBsZSBtb2R1bGUgd2hpY2ggdXNlcyBrZXl3b3JkcywgYmFzZWQgb24gYW4gZXhhbXBsZSBieQotR2VvZmYgUGhpbGJyaWNrIChcZW1haWx7cGhpbGJyaWNrQGhrcy5jb219KTolCi1caW5kZXh7UGhpbGJyaWNrLCBHZW9mZn0KLQotXGJlZ2lue3ZlcmJhdGltfQotI2luY2x1ZGUgIlB5dGhvbi5oIgotCi1zdGF0aWMgUHlPYmplY3QgKgota2V5d2RhcmdfcGFycm90KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmtleXdkcykKLXsgIAotICAgIGludCB2b2x0YWdlOwotICAgIGNoYXIgKnN0YXRlID0gImEgc3RpZmYiOwotICAgIGNoYXIgKmFjdGlvbiA9ICJ2b29tIjsKLSAgICBjaGFyICp0eXBlID0gIk5vcndlZ2lhbiBCbHVlIjsKLQotICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsidm9sdGFnZSIsICJzdGF0ZSIsICJhY3Rpb24iLCAidHlwZSIsIE5VTEx9OwotCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga2V5d2RzLCAiaXxzc3MiLCBrd2xpc3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2b2x0YWdlLCAmc3RhdGUsICZhY3Rpb24sICZ0eXBlKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7IAotICAKLSAgICBwcmludGYoIi0tIFRoaXMgcGFycm90IHdvdWxkbid0ICVzIGlmIHlvdSBwdXQgJWkgVm9sdHMgdGhyb3VnaCBpdC5cbiIsIAotICAgICAgICAgICBhY3Rpb24sIHZvbHRhZ2UpOwotICAgIHByaW50ZigiLS0gTG92ZWx5IHBsdW1hZ2UsIHRoZSAlcyAtLSBJdCdzICVzIVxuIiwgdHlwZSwgc3RhdGUpOwotCi0gICAgUHlfSU5DUkVGKFB5X05vbmUpOwotCi0gICAgcmV0dXJuIFB5X05vbmU7Ci19Ci0KLXN0YXRpYyBQeU1ldGhvZERlZiBrZXl3ZGFyZ19tZXRob2RzW10gPSB7Ci0gICAgLyogVGhlIGNhc3Qgb2YgdGhlIGZ1bmN0aW9uIGlzIG5lY2Vzc2FyeSBzaW5jZSBQeUNGdW5jdGlvbiB2YWx1ZXMKLSAgICAgKiBvbmx5IHRha2UgdHdvIFB5T2JqZWN0KiBwYXJhbWV0ZXJzLCBhbmQga2V5d2RhcmdfcGFycm90KCkgdGFrZXMKLSAgICAgKiB0aHJlZS4KLSAgICAgKi8KLSAgICB7InBhcnJvdCIsIChQeUNGdW5jdGlvbilrZXl3ZGFyZ19wYXJyb3QsIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCi0gICAgICJQcmludCBhIGxvdmVseSBza2l0IHRvIHN0YW5kYXJkIG91dHB1dC4ifSwKLSAgICB7TlVMTCwgTlVMTCwgMCwgTlVMTH0gICAvKiBzZW50aW5lbCAqLwotfTsKLVxlbmR7dmVyYmF0aW19Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXZvaWQKLWluaXRrZXl3ZGFyZyh2b2lkKQotewotICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KLSAgUHlfSW5pdE1vZHVsZSgia2V5d2RhcmciLCBrZXl3ZGFyZ19tZXRob2RzKTsKLX0KLVxlbmR7dmVyYmF0aW19Ci0KLQotXHNlY3Rpb257QnVpbGRpbmcgQXJiaXRyYXJ5IFZhbHVlcwotICAgICAgICAgXGxhYmVse2J1aWxkVmFsdWV9fQotCi1UaGlzIGZ1bmN0aW9uIGlzIHRoZSBjb3VudGVycGFydCB0byBcY2Z1bmN0aW9ue1B5QXJnX1BhcnNlVHVwbGUoKX0uICBJdCBpcwotZGVjbGFyZWQgYXMgZm9sbG93czoKLQotXGJlZ2lue3ZlcmJhdGltfQotUHlPYmplY3QgKlB5X0J1aWxkVmFsdWUoY2hhciAqZm9ybWF0LCAuLi4pOwotXGVuZHt2ZXJiYXRpbX0KLQotSXQgcmVjb2duaXplcyBhIHNldCBvZiBmb3JtYXQgdW5pdHMgc2ltaWxhciB0byB0aGUgb25lcyByZWNvZ25pemVkIGJ5Ci1cY2Z1bmN0aW9ue1B5QXJnX1BhcnNlVHVwbGUoKX0sIGJ1dCB0aGUgYXJndW1lbnRzICh3aGljaCBhcmUgaW5wdXQgdG8gdGhlCi1mdW5jdGlvbiwgbm90IG91dHB1dCkgbXVzdCBub3QgYmUgcG9pbnRlcnMsIGp1c3QgdmFsdWVzLiAgSXQgcmV0dXJucyBhCi1uZXcgUHl0aG9uIG9iamVjdCwgc3VpdGFibGUgZm9yIHJldHVybmluZyBmcm9tIGEgQyBmdW5jdGlvbiBjYWxsZWQKLWZyb20gUHl0aG9uLgotCi1PbmUgZGlmZmVyZW5jZSB3aXRoIFxjZnVuY3Rpb257UHlBcmdfUGFyc2VUdXBsZSgpfTogd2hpbGUgdGhlIGxhdHRlcgotcmVxdWlyZXMgaXRzIGZpcnN0IGFyZ3VtZW50IHRvIGJlIGEgdHVwbGUgKHNpbmNlIFB5dGhvbiBhcmd1bWVudCBsaXN0cwotYXJlIGFsd2F5cyByZXByZXNlbnRlZCBhcyB0dXBsZXMgaW50ZXJuYWxseSksCi1cY2Z1bmN0aW9ue1B5X0J1aWxkVmFsdWUoKX0gZG9lcyBub3QgYWx3YXlzIGJ1aWxkIGEgdHVwbGUuICBJdCBidWlsZHMKLWEgdHVwbGUgb25seSBpZiBpdHMgZm9ybWF0IHN0cmluZyBjb250YWlucyB0d28gb3IgbW9yZSBmb3JtYXQgdW5pdHMuCi1JZiB0aGUgZm9ybWF0IHN0cmluZyBpcyBlbXB0eSwgaXQgcmV0dXJucyBcY29kZXtOb25lfTsgaWYgaXQgY29udGFpbnMKLWV4YWN0bHkgb25lIGZvcm1hdCB1bml0LCBpdCByZXR1cm5zIHdoYXRldmVyIG9iamVjdCBpcyBkZXNjcmliZWQgYnkKLXRoYXQgZm9ybWF0IHVuaXQuICBUbyBmb3JjZSBpdCB0byByZXR1cm4gYSB0dXBsZSBvZiBzaXplIDAgb3Igb25lLAotcGFyZW50aGVzaXplIHRoZSBmb3JtYXQgc3RyaW5nLgotCi1FeGFtcGxlcyAodG8gdGhlIGxlZnQgdGhlIGNhbGwsIHRvIHRoZSByaWdodCB0aGUgcmVzdWx0aW5nIFB5dGhvbiB2YWx1ZSk6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICBQeV9CdWlsZFZhbHVlKCIiKSAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUKLSAgICBQeV9CdWlsZFZhbHVlKCJpIiwgMTIzKSAgICAgICAgICAgICAgICAgIDEyMwotICAgIFB5X0J1aWxkVmFsdWUoImlpaSIsIDEyMywgNDU2LCA3ODkpICAgICAgKDEyMywgNDU2LCA3ODkpCi0gICAgUHlfQnVpbGRWYWx1ZSgicyIsICJoZWxsbyIpICAgICAgICAgICAgICAnaGVsbG8nCi0gICAgUHlfQnVpbGRWYWx1ZSgieSIsICJoZWxsbyIpICAgICAgICAgICAgICBiJ2hlbGxvJwotICAgIFB5X0J1aWxkVmFsdWUoInNzIiwgImhlbGxvIiwgIndvcmxkIikgICAgKCdoZWxsbycsICd3b3JsZCcpCi0gICAgUHlfQnVpbGRWYWx1ZSgicyMiLCAiaGVsbG8iLCA0KSAgICAgICAgICAnaGVsbCcKLSAgICBQeV9CdWlsZFZhbHVlKCJ5IyIsICJoZWxsbyIsIDQpICAgICAgICAgIGInaGVsbCcKLSAgICBQeV9CdWlsZFZhbHVlKCIoKSIpICAgICAgICAgICAgICAgICAgICAgICgpCi0gICAgUHlfQnVpbGRWYWx1ZSgiKGkpIiwgMTIzKSAgICAgICAgICAgICAgICAoMTIzLCkKLSAgICBQeV9CdWlsZFZhbHVlKCIoaWkpIiwgMTIzLCA0NTYpICAgICAgICAgICgxMjMsIDQ1NikKLSAgICBQeV9CdWlsZFZhbHVlKCIoaSxpKSIsIDEyMywgNDU2KSAgICAgICAgICgxMjMsIDQ1NikKLSAgICBQeV9CdWlsZFZhbHVlKCJbaSxpXSIsIDEyMywgNDU2KSAgICAgICAgIFsxMjMsIDQ1Nl0KLSAgICBQeV9CdWlsZFZhbHVlKCJ7czppLHM6aX0iLAotICAgICAgICAgICAgICAgICAgImFiYyIsIDEyMywgImRlZiIsIDQ1NikgICAgeydhYmMnOiAxMjMsICdkZWYnOiA0NTZ9Ci0gICAgUHlfQnVpbGRWYWx1ZSgiKChpaSkoaWkpKSAoaWkpIiwKLSAgICAgICAgICAgICAgICAgIDEsIDIsIDMsIDQsIDUsIDYpICAgICAgICAgICgoKDEsIDIpLCAoMywgNCkpLCAoNSwgNikpCi1cZW5ke3ZlcmJhdGltfQotCi0KLVxzZWN0aW9ue1JlZmVyZW5jZSBDb3VudHMKLSAgICAgICAgIFxsYWJlbHtyZWZjb3VudHN9fQotCi1JbiBsYW5ndWFnZXMgbGlrZSBDIG9yIFxDcHAsIHRoZSBwcm9ncmFtbWVyIGlzIHJlc3BvbnNpYmxlIGZvcgotZHluYW1pYyBhbGxvY2F0aW9uIGFuZCBkZWFsbG9jYXRpb24gb2YgbWVtb3J5IG9uIHRoZSBoZWFwLiAgSW4gQywKLXRoaXMgaXMgZG9uZSB1c2luZyB0aGUgZnVuY3Rpb25zIFxjZnVuY3Rpb257bWFsbG9jKCl9IGFuZAotXGNmdW5jdGlvbntmcmVlKCl9LiAgSW4gXENwcCwgdGhlIG9wZXJhdG9ycyBca2V5d29yZHtuZXd9IGFuZAotXGtleXdvcmR7ZGVsZXRlfSBhcmUgdXNlZCB3aXRoIGVzc2VudGlhbGx5IHRoZSBzYW1lIG1lYW5pbmcgYW5kCi13ZSdsbCByZXN0cmljdCB0aGUgZm9sbG93aW5nIGRpc2N1c3Npb24gdG8gdGhlIEMgY2FzZS4KLQotRXZlcnkgYmxvY2sgb2YgbWVtb3J5IGFsbG9jYXRlZCB3aXRoIFxjZnVuY3Rpb257bWFsbG9jKCl9IHNob3VsZAotZXZlbnR1YWxseSBiZSByZXR1cm5lZCB0byB0aGUgcG9vbCBvZiBhdmFpbGFibGUgbWVtb3J5IGJ5IGV4YWN0bHkgb25lCi1jYWxsIHRvIFxjZnVuY3Rpb257ZnJlZSgpfS4gIEl0IGlzIGltcG9ydGFudCB0byBjYWxsCi1cY2Z1bmN0aW9ue2ZyZWUoKX0gYXQgdGhlIHJpZ2h0IHRpbWUuICBJZiBhIGJsb2NrJ3MgYWRkcmVzcyBpcwotZm9yZ290dGVuIGJ1dCBcY2Z1bmN0aW9ue2ZyZWUoKX0gaXMgbm90IGNhbGxlZCBmb3IgaXQsIHRoZSBtZW1vcnkgaXQKLW9jY3VwaWVzIGNhbm5vdCBiZSByZXVzZWQgdW50aWwgdGhlIHByb2dyYW0gdGVybWluYXRlcy4gIFRoaXMgaXMKLWNhbGxlZCBhIFxkZm57bWVtb3J5IGxlYWt9LiAgT24gdGhlIG90aGVyIGhhbmQsIGlmIGEgcHJvZ3JhbSBjYWxscwotXGNmdW5jdGlvbntmcmVlKCl9IGZvciBhIGJsb2NrIGFuZCB0aGVuIGNvbnRpbnVlcyB0byB1c2UgdGhlIGJsb2NrLCBpdAotY3JlYXRlcyBhIGNvbmZsaWN0IHdpdGggcmUtdXNlIG9mIHRoZSBibG9jayB0aHJvdWdoIGFub3RoZXIKLVxjZnVuY3Rpb257bWFsbG9jKCl9IGNhbGwuICBUaGlzIGlzIGNhbGxlZCBcZGZue3VzaW5nIGZyZWVkIG1lbW9yeX0uCi1JdCBoYXMgdGhlIHNhbWUgYmFkIGNvbnNlcXVlbmNlcyBhcyByZWZlcmVuY2luZyB1bmluaXRpYWxpemVkIGRhdGEgLS0tCi1jb3JlIGR1bXBzLCB3cm9uZyByZXN1bHRzLCBteXN0ZXJpb3VzIGNyYXNoZXMuCi0KLUNvbW1vbiBjYXVzZXMgb2YgbWVtb3J5IGxlYWtzIGFyZSB1bnVzdWFsIHBhdGhzIHRocm91Z2ggdGhlIGNvZGUuICBGb3IKLWluc3RhbmNlLCBhIGZ1bmN0aW9uIG1heSBhbGxvY2F0ZSBhIGJsb2NrIG9mIG1lbW9yeSwgZG8gc29tZQotY2FsY3VsYXRpb24sIGFuZCB0aGVuIGZyZWUgdGhlIGJsb2NrIGFnYWluLiAgTm93IGEgY2hhbmdlIGluIHRoZQotcmVxdWlyZW1lbnRzIGZvciB0aGUgZnVuY3Rpb24gbWF5IGFkZCBhIHRlc3QgdG8gdGhlIGNhbGN1bGF0aW9uIHRoYXQKLWRldGVjdHMgYW4gZXJyb3IgY29uZGl0aW9uIGFuZCBjYW4gcmV0dXJuIHByZW1hdHVyZWx5IGZyb20gdGhlCi1mdW5jdGlvbi4gIEl0J3MgZWFzeSB0byBmb3JnZXQgdG8gZnJlZSB0aGUgYWxsb2NhdGVkIG1lbW9yeSBibG9jayB3aGVuCi10YWtpbmcgdGhpcyBwcmVtYXR1cmUgZXhpdCwgZXNwZWNpYWxseSB3aGVuIGl0IGlzIGFkZGVkIGxhdGVyIHRvIHRoZQotY29kZS4gIFN1Y2ggbGVha3MsIG9uY2UgaW50cm9kdWNlZCwgb2Z0ZW4gZ28gdW5kZXRlY3RlZCBmb3IgYSBsb25nCi10aW1lOiB0aGUgZXJyb3IgZXhpdCBpcyB0YWtlbiBvbmx5IGluIGEgc21hbGwgZnJhY3Rpb24gb2YgYWxsIGNhbGxzLAotYW5kIG1vc3QgbW9kZXJuIG1hY2hpbmVzIGhhdmUgcGxlbnR5IG9mIHZpcnR1YWwgbWVtb3J5LCBzbyB0aGUgbGVhawotb25seSBiZWNvbWVzIGFwcGFyZW50IGluIGEgbG9uZy1ydW5uaW5nIHByb2Nlc3MgdGhhdCB1c2VzIHRoZSBsZWFraW5nCi1mdW5jdGlvbiBmcmVxdWVudGx5LiAgVGhlcmVmb3JlLCBpdCdzIGltcG9ydGFudCB0byBwcmV2ZW50IGxlYWtzIGZyb20KLWhhcHBlbmluZyBieSBoYXZpbmcgYSBjb2RpbmcgY29udmVudGlvbiBvciBzdHJhdGVneSB0aGF0IG1pbmltaXplcwotdGhpcyBraW5kIG9mIGVycm9ycy4KLQotU2luY2UgUHl0aG9uIG1ha2VzIGhlYXZ5IHVzZSBvZiBcY2Z1bmN0aW9ue21hbGxvYygpfSBhbmQKLVxjZnVuY3Rpb257ZnJlZSgpfSwgaXQgbmVlZHMgYSBzdHJhdGVneSB0byBhdm9pZCBtZW1vcnkgbGVha3MgYXMgd2VsbAotYXMgdGhlIHVzZSBvZiBmcmVlZCBtZW1vcnkuICBUaGUgY2hvc2VuIG1ldGhvZCBpcyBjYWxsZWQKLVxkZm57cmVmZXJlbmNlIGNvdW50aW5nfS4gIFRoZSBwcmluY2lwbGUgaXMgc2ltcGxlOiBldmVyeSBvYmplY3QKLWNvbnRhaW5zIGEgY291bnRlciwgd2hpY2ggaXMgaW5jcmVtZW50ZWQgd2hlbiBhIHJlZmVyZW5jZSB0byB0aGUKLW9iamVjdCBpcyBzdG9yZWQgc29tZXdoZXJlLCBhbmQgd2hpY2ggaXMgZGVjcmVtZW50ZWQgd2hlbiBhIHJlZmVyZW5jZQotdG8gaXQgaXMgZGVsZXRlZC4gIFdoZW4gdGhlIGNvdW50ZXIgcmVhY2hlcyB6ZXJvLCB0aGUgbGFzdCByZWZlcmVuY2UKLXRvIHRoZSBvYmplY3QgaGFzIGJlZW4gZGVsZXRlZCBhbmQgdGhlIG9iamVjdCBpcyBmcmVlZC4KLQotQW4gYWx0ZXJuYXRpdmUgc3RyYXRlZ3kgaXMgY2FsbGVkIFxkZm57YXV0b21hdGljIGdhcmJhZ2UgY29sbGVjdGlvbn0uCi0oU29tZXRpbWVzLCByZWZlcmVuY2UgY291bnRpbmcgaXMgYWxzbyByZWZlcnJlZCB0byBhcyBhIGdhcmJhZ2UKLWNvbGxlY3Rpb24gc3RyYXRlZ3ksIGhlbmNlIG15IHVzZSBvZiBgYGF1dG9tYXRpYycnIHRvIGRpc3Rpbmd1aXNoIHRoZQotdHdvLikgIFRoZSBiaWcgYWR2YW50YWdlIG9mIGF1dG9tYXRpYyBnYXJiYWdlIGNvbGxlY3Rpb24gaXMgdGhhdCB0aGUKLXVzZXIgZG9lc24ndCBuZWVkIHRvIGNhbGwgXGNmdW5jdGlvbntmcmVlKCl9IGV4cGxpY2l0bHkuICAoQW5vdGhlciBjbGFpbWVkCi1hZHZhbnRhZ2UgaXMgYW4gaW1wcm92ZW1lbnQgaW4gc3BlZWQgb3IgbWVtb3J5IHVzYWdlIC0tLSB0aGlzIGlzIG5vCi1oYXJkIGZhY3QgaG93ZXZlci4pICBUaGUgZGlzYWR2YW50YWdlIGlzIHRoYXQgZm9yIEMsIHRoZXJlIGlzIG5vCi10cnVseSBwb3J0YWJsZSBhdXRvbWF0aWMgZ2FyYmFnZSBjb2xsZWN0b3IsIHdoaWxlIHJlZmVyZW5jZSBjb3VudGluZwotY2FuIGJlIGltcGxlbWVudGVkIHBvcnRhYmx5IChhcyBsb25nIGFzIHRoZSBmdW5jdGlvbnMgXGNmdW5jdGlvbnttYWxsb2MoKX0KLWFuZCBcY2Z1bmN0aW9ue2ZyZWUoKX0gYXJlIGF2YWlsYWJsZSAtLS0gd2hpY2ggdGhlIEMgU3RhbmRhcmQgZ3VhcmFudGVlcykuCi1NYXliZSBzb21lIGRheSBhIHN1ZmZpY2llbnRseSBwb3J0YWJsZSBhdXRvbWF0aWMgZ2FyYmFnZSBjb2xsZWN0b3IKLXdpbGwgYmUgYXZhaWxhYmxlIGZvciBDLiAgVW50aWwgdGhlbiwgd2UnbGwgaGF2ZSB0byBsaXZlIHdpdGgKLXJlZmVyZW5jZSBjb3VudHMuCi0KLVdoaWxlIFB5dGhvbiB1c2VzIHRoZSB0cmFkaXRpb25hbCByZWZlcmVuY2UgY291bnRpbmcgaW1wbGVtZW50YXRpb24sCi1pdCBhbHNvIG9mZmVycyBhIGN5Y2xlIGRldGVjdG9yIHRoYXQgd29ya3MgdG8gZGV0ZWN0IHJlZmVyZW5jZQotY3ljbGVzLiAgVGhpcyBhbGxvd3MgYXBwbGljYXRpb25zIHRvIG5vdCB3b3JyeSBhYm91dCBjcmVhdGluZyBkaXJlY3QKLW9yIGluZGlyZWN0IGNpcmN1bGFyIHJlZmVyZW5jZXM7IHRoZXNlIGFyZSB0aGUgd2Vha25lc3Mgb2YgZ2FyYmFnZQotY29sbGVjdGlvbiBpbXBsZW1lbnRlZCB1c2luZyBvbmx5IHJlZmVyZW5jZSBjb3VudGluZy4gIFJlZmVyZW5jZQotY3ljbGVzIGNvbnNpc3Qgb2Ygb2JqZWN0cyB3aGljaCBjb250YWluIChwb3NzaWJseSBpbmRpcmVjdCkgcmVmZXJlbmNlcwotdG8gdGhlbXNlbHZlcywgc28gdGhhdCBlYWNoIG9iamVjdCBpbiB0aGUgY3ljbGUgaGFzIGEgcmVmZXJlbmNlIGNvdW50Ci13aGljaCBpcyBub24temVyby4gIFR5cGljYWwgcmVmZXJlbmNlIGNvdW50aW5nIGltcGxlbWVudGF0aW9ucyBhcmUgbm90Ci1hYmxlIHRvIHJlY2xhaW0gdGhlIG1lbW9yeSBiZWxvbmdpbmcgdG8gYW55IG9iamVjdHMgaW4gYSByZWZlcmVuY2UKLWN5Y2xlLCBvciByZWZlcmVuY2VkIGZyb20gdGhlIG9iamVjdHMgaW4gdGhlIGN5Y2xlLCBldmVuIHRob3VnaCB0aGVyZQotYXJlIG5vIGZ1cnRoZXIgcmVmZXJlbmNlcyB0byB0aGUgY3ljbGUgaXRzZWxmLgotCi1UaGUgY3ljbGUgZGV0ZWN0b3IgaXMgYWJsZSB0byBkZXRlY3QgZ2FyYmFnZSBjeWNsZXMgYW5kIGNhbiByZWNsYWltCi10aGVtIHNvIGxvbmcgYXMgdGhlcmUgYXJlIG5vIGZpbmFsaXplcnMgaW1wbGVtZW50ZWQgaW4gUHl0aG9uCi0oXG1ldGhvZHtfX2RlbF9fKCl9IG1ldGhvZHMpLiAgV2hlbiB0aGVyZSBhcmUgc3VjaCBmaW5hbGl6ZXJzLCB0aGUKLWRldGVjdG9yIGV4cG9zZXMgdGhlIGN5Y2xlcyB0aHJvdWdoIHRoZSBcdWxpbmt7XG1vZHVsZXtnY30KLW1vZHVsZX17Li4vbGliL21vZHVsZS1nYy5odG1sfSAoc3BlY2lmaWNhbGx5LCB0aGUgXGNvZGV7Z2FyYmFnZX0KLXZhcmlhYmxlIGluIHRoYXQgbW9kdWxlKS4gIFRoZSBcbW9kdWxle2djfSBtb2R1bGUgYWxzbyBleHBvc2VzIGEgd2F5Ci10byBydW4gdGhlIGRldGVjdG9yICh0aGUgXGZ1bmN0aW9ue2NvbGxlY3QoKX0gZnVuY3Rpb24pLCBhcyB3ZWxsIGFzCi1jb25maWd1cmF0aW9uIGludGVyZmFjZXMgYW5kIHRoZSBhYmlsaXR5IHRvIGRpc2FibGUgdGhlIGRldGVjdG9yIGF0Ci1ydW50aW1lLiAgVGhlIGN5Y2xlIGRldGVjdG9yIGlzIGNvbnNpZGVyZWQgYW4gb3B0aW9uYWwgY29tcG9uZW50OwotdGhvdWdoIGl0IGlzIGluY2x1ZGVkIGJ5IGRlZmF1bHQsIGl0IGNhbiBiZSBkaXNhYmxlZCBhdCBidWlsZCB0aW1lCi11c2luZyB0aGUgXGxvbmdwcm9ncmFtb3B0e3dpdGhvdXQtY3ljbGUtZ2N9IG9wdGlvbiB0byB0aGUKLVxwcm9ncmFte2NvbmZpZ3VyZX0gc2NyaXB0IG9uIFxVTklYe30gcGxhdGZvcm1zIChpbmNsdWRpbmcgTWFjIE9TIFgpCi1vciBieSByZW1vdmluZyB0aGUgZGVmaW5pdGlvbiBvZiBcY29kZXtXSVRIX0NZQ0xFX0dDfSBpbiB0aGUKLVxmaWxle3B5Y29uZmlnLmh9IGhlYWRlciBvbiBvdGhlciBwbGF0Zm9ybXMuICBJZiB0aGUgY3ljbGUgZGV0ZWN0b3IgaXMKLWRpc2FibGVkIGluIHRoaXMgd2F5LCB0aGUgXG1vZHVsZXtnY30gbW9kdWxlIHdpbGwgbm90IGJlIGF2YWlsYWJsZS4KLQotCi1cc3Vic2VjdGlvbntSZWZlcmVuY2UgQ291bnRpbmcgaW4gUHl0aG9uCi0gICAgICAgICAgICBcbGFiZWx7cmVmY291bnRzSW5QeXRob259fQotCi1UaGVyZSBhcmUgdHdvIG1hY3JvcywgXGNvZGV7UHlfSU5DUkVGKHgpfSBhbmQgXGNvZGV7UHlfREVDUkVGKHgpfSwKLXdoaWNoIGhhbmRsZSB0aGUgaW5jcmVtZW50aW5nIGFuZCBkZWNyZW1lbnRpbmcgb2YgdGhlIHJlZmVyZW5jZSBjb3VudC4KLVxjZnVuY3Rpb257UHlfREVDUkVGKCl9IGFsc28gZnJlZXMgdGhlIG9iamVjdCB3aGVuIHRoZSBjb3VudCByZWFjaGVzIHplcm8uCi1Gb3IgZmxleGliaWxpdHksIGl0IGRvZXNuJ3QgY2FsbCBcY2Z1bmN0aW9ue2ZyZWUoKX0gZGlyZWN0bHkgLS0tIHJhdGhlciwgaXQKLW1ha2VzIGEgY2FsbCB0aHJvdWdoIGEgZnVuY3Rpb24gcG9pbnRlciBpbiB0aGUgb2JqZWN0J3MgXGRmbnt0eXBlCi1vYmplY3R9LiAgRm9yIHRoaXMgcHVycG9zZSAoYW5kIG90aGVycyksIGV2ZXJ5IG9iamVjdCBhbHNvIGNvbnRhaW5zIGEKLXBvaW50ZXIgdG8gaXRzIHR5cGUgb2JqZWN0LgotCi1UaGUgYmlnIHF1ZXN0aW9uIG5vdyByZW1haW5zOiB3aGVuIHRvIHVzZSBcY29kZXtQeV9JTkNSRUYoeCl9IGFuZAotXGNvZGV7UHlfREVDUkVGKHgpfT8gIExldCdzIGZpcnN0IGludHJvZHVjZSBzb21lIHRlcm1zLiAgTm9ib2R5Ci1gYG93bnMnJyBhbiBvYmplY3Q7IGhvd2V2ZXIsIHlvdSBjYW4gXGRmbntvd24gYSByZWZlcmVuY2V9IHRvIGFuCi1vYmplY3QuICBBbiBvYmplY3QncyByZWZlcmVuY2UgY291bnQgaXMgbm93IGRlZmluZWQgYXMgdGhlIG51bWJlciBvZgotb3duZWQgcmVmZXJlbmNlcyB0byBpdC4gIFRoZSBvd25lciBvZiBhIHJlZmVyZW5jZSBpcyByZXNwb25zaWJsZSBmb3IKLWNhbGxpbmcgXGNmdW5jdGlvbntQeV9ERUNSRUYoKX0gd2hlbiB0aGUgcmVmZXJlbmNlIGlzIG5vIGxvbmdlcgotbmVlZGVkLiAgT3duZXJzaGlwIG9mIGEgcmVmZXJlbmNlIGNhbiBiZSB0cmFuc2ZlcnJlZC4gIFRoZXJlIGFyZSB0aHJlZQotd2F5cyB0byBkaXNwb3NlIG9mIGFuIG93bmVkIHJlZmVyZW5jZTogcGFzcyBpdCBvbiwgc3RvcmUgaXQsIG9yIGNhbGwKLVxjZnVuY3Rpb257UHlfREVDUkVGKCl9LiAgRm9yZ2V0dGluZyB0byBkaXNwb3NlIG9mIGFuIG93bmVkIHJlZmVyZW5jZQotY3JlYXRlcyBhIG1lbW9yeSBsZWFrLgotCi1JdCBpcyBhbHNvIHBvc3NpYmxlIHRvIFxkZm57Ym9ycm93fVxmb290bm90ZXtUaGUgbWV0YXBob3Igb2YKLWBgYm9ycm93aW5nJycgYSByZWZlcmVuY2UgaXMgbm90IGNvbXBsZXRlbHkgY29ycmVjdDogdGhlIG93bmVyIHN0aWxsCi1oYXMgYSBjb3B5IG9mIHRoZSByZWZlcmVuY2UufSBhIHJlZmVyZW5jZSB0byBhbiBvYmplY3QuICBUaGUgYm9ycm93ZXIKLW9mIGEgcmVmZXJlbmNlIHNob3VsZCBub3QgY2FsbCBcY2Z1bmN0aW9ue1B5X0RFQ1JFRigpfS4gIFRoZSBib3Jyb3dlciBtdXN0Ci1ub3QgaG9sZCBvbiB0byB0aGUgb2JqZWN0IGxvbmdlciB0aGFuIHRoZSBvd25lciBmcm9tIHdoaWNoIGl0IHdhcwotYm9ycm93ZWQuICBVc2luZyBhIGJvcnJvd2VkIHJlZmVyZW5jZSBhZnRlciB0aGUgb3duZXIgaGFzIGRpc3Bvc2VkIG9mCi1pdCByaXNrcyB1c2luZyBmcmVlZCBtZW1vcnkgYW5kIHNob3VsZCBiZSBhdm9pZGVkCi1jb21wbGV0ZWx5Llxmb290bm90ZXtDaGVja2luZyB0aGF0IHRoZSByZWZlcmVuY2UgY291bnQgaXMgYXQgbGVhc3QgMQotXHN0cm9uZ3tkb2VzIG5vdCB3b3JrfSAtLS0gdGhlIHJlZmVyZW5jZSBjb3VudCBpdHNlbGYgY291bGQgYmUgaW4KLWZyZWVkIG1lbW9yeSBhbmQgbWF5IHRodXMgYmUgcmV1c2VkIGZvciBhbm90aGVyIG9iamVjdCF9Ci0KLVRoZSBhZHZhbnRhZ2Ugb2YgYm9ycm93aW5nIG92ZXIgb3duaW5nIGEgcmVmZXJlbmNlIGlzIHRoYXQgeW91IGRvbid0Ci1uZWVkIHRvIHRha2UgY2FyZSBvZiBkaXNwb3Npbmcgb2YgdGhlIHJlZmVyZW5jZSBvbiBhbGwgcG9zc2libGUgcGF0aHMKLXRocm91Z2ggdGhlIGNvZGUgLS0tIGluIG90aGVyIHdvcmRzLCB3aXRoIGEgYm9ycm93ZWQgcmVmZXJlbmNlIHlvdQotZG9uJ3QgcnVuIHRoZSByaXNrIG9mIGxlYWtpbmcgd2hlbiBhIHByZW1hdHVyZSBleGl0IGlzIHRha2VuLiAgVGhlCi1kaXNhZHZhbnRhZ2Ugb2YgYm9ycm93aW5nIG92ZXIgbGVha2luZyBpcyB0aGF0IHRoZXJlIGFyZSBzb21lIHN1YnRsZQotc2l0dWF0aW9ucyB3aGVyZSBpbiBzZWVtaW5nbHkgY29ycmVjdCBjb2RlIGEgYm9ycm93ZWQgcmVmZXJlbmNlIGNhbiBiZQotdXNlZCBhZnRlciB0aGUgb3duZXIgZnJvbSB3aGljaCBpdCB3YXMgYm9ycm93ZWQgaGFzIGluIGZhY3QgZGlzcG9zZWQKLW9mIGl0LgotCi1BIGJvcnJvd2VkIHJlZmVyZW5jZSBjYW4gYmUgY2hhbmdlZCBpbnRvIGFuIG93bmVkIHJlZmVyZW5jZSBieSBjYWxsaW5nCi1cY2Z1bmN0aW9ue1B5X0lOQ1JFRigpfS4gIFRoaXMgZG9lcyBub3QgYWZmZWN0IHRoZSBzdGF0dXMgb2YgdGhlIG93bmVyIGZyb20KLXdoaWNoIHRoZSByZWZlcmVuY2Ugd2FzIGJvcnJvd2VkIC0tLSBpdCBjcmVhdGVzIGEgbmV3IG93bmVkIHJlZmVyZW5jZSwKLWFuZCBnaXZlcyBmdWxsIG93bmVyIHJlc3BvbnNpYmlsaXRpZXMgKHRoZSBuZXcgb3duZXIgbXVzdAotZGlzcG9zZSBvZiB0aGUgcmVmZXJlbmNlIHByb3Blcmx5LCBhcyB3ZWxsIGFzIHRoZSBwcmV2aW91cyBvd25lcikuCi0KLQotXHN1YnNlY3Rpb257T3duZXJzaGlwIFJ1bGVzCi0gICAgICAgICAgICBcbGFiZWx7b3duZXJzaGlwUnVsZXN9fQotCi1XaGVuZXZlciBhbiBvYmplY3QgcmVmZXJlbmNlIGlzIHBhc3NlZCBpbnRvIG9yIG91dCBvZiBhIGZ1bmN0aW9uLCBpdAotaXMgcGFydCBvZiB0aGUgZnVuY3Rpb24ncyBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbiB3aGV0aGVyIG93bmVyc2hpcCBpcwotdHJhbnNmZXJyZWQgd2l0aCB0aGUgcmVmZXJlbmNlIG9yIG5vdC4KLQotTW9zdCBmdW5jdGlvbnMgdGhhdCByZXR1cm4gYSByZWZlcmVuY2UgdG8gYW4gb2JqZWN0IHBhc3Mgb24gb3duZXJzaGlwCi13aXRoIHRoZSByZWZlcmVuY2UuICBJbiBwYXJ0aWN1bGFyLCBhbGwgZnVuY3Rpb25zIHdob3NlIGZ1bmN0aW9uIGl0IGlzCi10byBjcmVhdGUgYSBuZXcgb2JqZWN0LCBzdWNoIGFzIFxjZnVuY3Rpb257UHlJbnRfRnJvbUxvbmcoKX0gYW5kCi1cY2Z1bmN0aW9ue1B5X0J1aWxkVmFsdWUoKX0sIHBhc3Mgb3duZXJzaGlwIHRvIHRoZSByZWNlaXZlci4gIEV2ZW4gaWYKLXRoZSBvYmplY3QgaXMgbm90IGFjdHVhbGx5IG5ldywgeW91IHN0aWxsIHJlY2VpdmUgb3duZXJzaGlwIG9mIGEgbmV3Ci1yZWZlcmVuY2UgdG8gdGhhdCBvYmplY3QuICBGb3IgaW5zdGFuY2UsIFxjZnVuY3Rpb257UHlJbnRfRnJvbUxvbmcoKX0KLW1haW50YWlucyBhIGNhY2hlIG9mIHBvcHVsYXIgdmFsdWVzIGFuZCBjYW4gcmV0dXJuIGEgcmVmZXJlbmNlIHRvIGEKLWNhY2hlZCBpdGVtLgotCi1NYW55IGZ1bmN0aW9ucyB0aGF0IGV4dHJhY3Qgb2JqZWN0cyBmcm9tIG90aGVyIG9iamVjdHMgYWxzbyB0cmFuc2Zlcgotb3duZXJzaGlwIHdpdGggdGhlIHJlZmVyZW5jZSwgZm9yIGluc3RhbmNlCi1cY2Z1bmN0aW9ue1B5T2JqZWN0X0dldEF0dHJTdHJpbmcoKX0uICBUaGUgcGljdHVyZSBpcyBsZXNzIGNsZWFyLCBoZXJlLAotaG93ZXZlciwgc2luY2UgYSBmZXcgY29tbW9uIHJvdXRpbmVzIGFyZSBleGNlcHRpb25zOgotXGNmdW5jdGlvbntQeVR1cGxlX0dldEl0ZW0oKX0sIFxjZnVuY3Rpb257UHlMaXN0X0dldEl0ZW0oKX0sCi1cY2Z1bmN0aW9ue1B5RGljdF9HZXRJdGVtKCl9LCBhbmQgXGNmdW5jdGlvbntQeURpY3RfR2V0SXRlbVN0cmluZygpfQotYWxsIHJldHVybiByZWZlcmVuY2VzIHRoYXQgeW91IGJvcnJvdyBmcm9tIHRoZSB0dXBsZSwgbGlzdCBvcgotZGljdGlvbmFyeS4KLQotVGhlIGZ1bmN0aW9uIFxjZnVuY3Rpb257UHlJbXBvcnRfQWRkTW9kdWxlKCl9IGFsc28gcmV0dXJucyBhIGJvcnJvd2VkCi1yZWZlcmVuY2UsIGV2ZW4gdGhvdWdoIGl0IG1heSBhY3R1YWxseSBjcmVhdGUgdGhlIG9iamVjdCBpdCByZXR1cm5zOgotdGhpcyBpcyBwb3NzaWJsZSBiZWNhdXNlIGFuIG93bmVkIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IGlzIHN0b3JlZCBpbgotXGNvZGV7c3lzLm1vZHVsZXN9LgotCi1XaGVuIHlvdSBwYXNzIGFuIG9iamVjdCByZWZlcmVuY2UgaW50byBhbm90aGVyIGZ1bmN0aW9uLCBpbiBnZW5lcmFsLAotdGhlIGZ1bmN0aW9uIGJvcnJvd3MgdGhlIHJlZmVyZW5jZSBmcm9tIHlvdSAtLS0gaWYgaXQgbmVlZHMgdG8gc3RvcmUKLWl0LCBpdCB3aWxsIHVzZSBcY2Z1bmN0aW9ue1B5X0lOQ1JFRigpfSB0byBiZWNvbWUgYW4gaW5kZXBlbmRlbnQKLW93bmVyLiAgVGhlcmUgYXJlIGV4YWN0bHkgdHdvIGltcG9ydGFudCBleGNlcHRpb25zIHRvIHRoaXMgcnVsZToKLVxjZnVuY3Rpb257UHlUdXBsZV9TZXRJdGVtKCl9IGFuZCBcY2Z1bmN0aW9ue1B5TGlzdF9TZXRJdGVtKCl9LiAgVGhlc2UKLWZ1bmN0aW9ucyB0YWtlIG92ZXIgb3duZXJzaGlwIG9mIHRoZSBpdGVtIHBhc3NlZCB0byB0aGVtIC0tLSBldmVuIGlmCi10aGV5IGZhaWwhICAoTm90ZSB0aGF0IFxjZnVuY3Rpb257UHlEaWN0X1NldEl0ZW0oKX0gYW5kIGZyaWVuZHMgZG9uJ3QKLXRha2Ugb3ZlciBvd25lcnNoaXAgLS0tIHRoZXkgYXJlIGBgbm9ybWFsLicnKQotCi1XaGVuIGEgQyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBQeXRob24sIGl0IGJvcnJvd3MgcmVmZXJlbmNlcyB0byBpdHMKLWFyZ3VtZW50cyBmcm9tIHRoZSBjYWxsZXIuICBUaGUgY2FsbGVyIG93bnMgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCwKLXNvIHRoZSBib3Jyb3dlZCByZWZlcmVuY2UncyBsaWZldGltZSBpcyBndWFyYW50ZWVkIHVudGlsIHRoZSBmdW5jdGlvbgotcmV0dXJucy4gIE9ubHkgd2hlbiBzdWNoIGEgYm9ycm93ZWQgcmVmZXJlbmNlIG11c3QgYmUgc3RvcmVkIG9yIHBhc3NlZAotb24sIGl0IG11c3QgYmUgdHVybmVkIGludG8gYW4gb3duZWQgcmVmZXJlbmNlIGJ5IGNhbGxpbmcKLVxjZnVuY3Rpb257UHlfSU5DUkVGKCl9LgotCi1UaGUgb2JqZWN0IHJlZmVyZW5jZSByZXR1cm5lZCBmcm9tIGEgQyBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBmcm9tCi1QeXRob24gbXVzdCBiZSBhbiBvd25lZCByZWZlcmVuY2UgLS0tIG93bmVyc2hpcCBpcyB0cmFuc2ZlcnJlZCBmcm9tCi10aGUgZnVuY3Rpb24gdG8gaXRzIGNhbGxlci4KLQotCi1cc3Vic2VjdGlvbntUaGluIEljZQotICAgICAgICAgICAgXGxhYmVse3RoaW5JY2V9fQotCi1UaGVyZSBhcmUgYSBmZXcgc2l0dWF0aW9ucyB3aGVyZSBzZWVtaW5nbHkgaGFybWxlc3MgdXNlIG9mIGEgYm9ycm93ZWQKLXJlZmVyZW5jZSBjYW4gbGVhZCB0byBwcm9ibGVtcy4gIFRoZXNlIGFsbCBoYXZlIHRvIGRvIHdpdGggaW1wbGljaXQKLWludm9jYXRpb25zIG9mIHRoZSBpbnRlcnByZXRlciwgd2hpY2ggY2FuIGNhdXNlIHRoZSBvd25lciBvZiBhCi1yZWZlcmVuY2UgdG8gZGlzcG9zZSBvZiBpdC4KLQotVGhlIGZpcnN0IGFuZCBtb3N0IGltcG9ydGFudCBjYXNlIHRvIGtub3cgYWJvdXQgaXMgdXNpbmcKLVxjZnVuY3Rpb257UHlfREVDUkVGKCl9IG9uIGFuIHVucmVsYXRlZCBvYmplY3Qgd2hpbGUgYm9ycm93aW5nIGEKLXJlZmVyZW5jZSB0byBhIGxpc3QgaXRlbS4gIEZvciBpbnN0YW5jZToKLQotXGJlZ2lue3ZlcmJhdGltfQotdm9pZAotYnVnKFB5T2JqZWN0ICpsaXN0KQotewotICAgIFB5T2JqZWN0ICppdGVtID0gUHlMaXN0X0dldEl0ZW0obGlzdCwgMCk7Ci0KLSAgICBQeUxpc3RfU2V0SXRlbShsaXN0LCAxLCBQeUludF9Gcm9tTG9uZygwTCkpOwotICAgIFB5T2JqZWN0X1ByaW50KGl0ZW0sIHN0ZG91dCwgMCk7IC8qIEJVRyEgKi8KLX0KLVxlbmR7dmVyYmF0aW19Ci0KLVRoaXMgZnVuY3Rpb24gZmlyc3QgYm9ycm93cyBhIHJlZmVyZW5jZSB0byBcY29kZXtsaXN0WzBdfSwgdGhlbgotcmVwbGFjZXMgXGNvZGV7bGlzdFsxXX0gd2l0aCB0aGUgdmFsdWUgXGNvZGV7MH0sIGFuZCBmaW5hbGx5IHByaW50cwotdGhlIGJvcnJvd2VkIHJlZmVyZW5jZS4gIExvb2tzIGhhcm1sZXNzLCByaWdodD8gIEJ1dCBpdCdzIG5vdCEKLQotTGV0J3MgZm9sbG93IHRoZSBjb250cm9sIGZsb3cgaW50byBcY2Z1bmN0aW9ue1B5TGlzdF9TZXRJdGVtKCl9LiAgVGhlIGxpc3QKLW93bnMgcmVmZXJlbmNlcyB0byBhbGwgaXRzIGl0ZW1zLCBzbyB3aGVuIGl0ZW0gMSBpcyByZXBsYWNlZCwgaXQgaGFzCi10byBkaXNwb3NlIG9mIHRoZSBvcmlnaW5hbCBpdGVtIDEuICBOb3cgbGV0J3Mgc3VwcG9zZSB0aGUgb3JpZ2luYWwKLWl0ZW0gMSB3YXMgYW4gaW5zdGFuY2Ugb2YgYSB1c2VyLWRlZmluZWQgY2xhc3MsIGFuZCBsZXQncyBmdXJ0aGVyCi1zdXBwb3NlIHRoYXQgdGhlIGNsYXNzIGRlZmluZWQgYSBcbWV0aG9ke19fZGVsX18oKX0gbWV0aG9kLiAgSWYgdGhpcwotY2xhc3MgaW5zdGFuY2UgaGFzIGEgcmVmZXJlbmNlIGNvdW50IG9mIDEsIGRpc3Bvc2luZyBvZiBpdCB3aWxsIGNhbGwKLWl0cyBcbWV0aG9ke19fZGVsX18oKX0gbWV0aG9kLgotCi1TaW5jZSBpdCBpcyB3cml0dGVuIGluIFB5dGhvbiwgdGhlIFxtZXRob2R7X19kZWxfXygpfSBtZXRob2QgY2FuIGV4ZWN1dGUKLWFyYml0cmFyeSBQeXRob24gY29kZS4gIENvdWxkIGl0IHBlcmhhcHMgZG8gc29tZXRoaW5nIHRvIGludmFsaWRhdGUKLXRoZSByZWZlcmVuY2UgdG8gXGNvZGV7aXRlbX0gaW4gXGNmdW5jdGlvbntidWcoKX0/ICBZb3UgYmV0ISAgQXNzdW1pbmcKLXRoYXQgdGhlIGxpc3QgcGFzc2VkIGludG8gXGNmdW5jdGlvbntidWcoKX0gaXMgYWNjZXNzaWJsZSB0byB0aGUKLVxtZXRob2R7X19kZWxfXygpfSBtZXRob2QsIGl0IGNvdWxkIGV4ZWN1dGUgYSBzdGF0ZW1lbnQgdG8gdGhlIGVmZmVjdCBvZgotXHNhbXB7ZGVsIGxpc3RbMF19LCBhbmQgYXNzdW1pbmcgdGhpcyB3YXMgdGhlIGxhc3QgcmVmZXJlbmNlIHRvIHRoYXQKLW9iamVjdCwgaXQgd291bGQgZnJlZSB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCBpdCwgdGhlcmVieQotaW52YWxpZGF0aW5nIFxjb2Rle2l0ZW19LgotCi1UaGUgc29sdXRpb24sIG9uY2UgeW91IGtub3cgdGhlIHNvdXJjZSBvZiB0aGUgcHJvYmxlbSwgaXMgZWFzeToKLXRlbXBvcmFyaWx5IGluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50LiAgVGhlIGNvcnJlY3QgdmVyc2lvbiBvZiB0aGUKLWZ1bmN0aW9uIHJlYWRzOgotCi1cYmVnaW57dmVyYmF0aW19Ci12b2lkCi1ub19idWcoUHlPYmplY3QgKmxpc3QpCi17Ci0gICAgUHlPYmplY3QgKml0ZW0gPSBQeUxpc3RfR2V0SXRlbShsaXN0LCAwKTsKLQotICAgIFB5X0lOQ1JFRihpdGVtKTsKLSAgICBQeUxpc3RfU2V0SXRlbShsaXN0LCAxLCBQeUludF9Gcm9tTG9uZygwTCkpOwotICAgIFB5T2JqZWN0X1ByaW50KGl0ZW0sIHN0ZG91dCwgMCk7Ci0gICAgUHlfREVDUkVGKGl0ZW0pOwotfQotXGVuZHt2ZXJiYXRpbX0KLQotVGhpcyBpcyBhIHRydWUgc3RvcnkuICBBbiBvbGRlciB2ZXJzaW9uIG9mIFB5dGhvbiBjb250YWluZWQgdmFyaWFudHMKLW9mIHRoaXMgYnVnIGFuZCBzb21lb25lIHNwZW50IGEgY29uc2lkZXJhYmxlIGFtb3VudCBvZiB0aW1lIGluIGEgQwotZGVidWdnZXIgdG8gZmlndXJlIG91dCB3aHkgaGlzIFxtZXRob2R7X19kZWxfXygpfSBtZXRob2RzIHdvdWxkIGZhaWwuLi4KLQotVGhlIHNlY29uZCBjYXNlIG9mIHByb2JsZW1zIHdpdGggYSBib3Jyb3dlZCByZWZlcmVuY2UgaXMgYSB2YXJpYW50Ci1pbnZvbHZpbmcgdGhyZWFkcy4gIE5vcm1hbGx5LCBtdWx0aXBsZSB0aHJlYWRzIGluIHRoZSBQeXRob24KLWludGVycHJldGVyIGNhbid0IGdldCBpbiBlYWNoIG90aGVyJ3Mgd2F5LCBiZWNhdXNlIHRoZXJlIGlzIGEgZ2xvYmFsCi1sb2NrIHByb3RlY3RpbmcgUHl0aG9uJ3MgZW50aXJlIG9iamVjdCBzcGFjZS4gIEhvd2V2ZXIsIGl0IGlzIHBvc3NpYmxlCi10byB0ZW1wb3JhcmlseSByZWxlYXNlIHRoaXMgbG9jayB1c2luZyB0aGUgbWFjcm8KLVxjc2ltcGxlbWFjcm97UHlfQkVHSU5fQUxMT1dfVEhSRUFEU30sIGFuZCB0byByZS1hY3F1aXJlIGl0IHVzaW5nCi1cY3NpbXBsZW1hY3Jve1B5X0VORF9BTExPV19USFJFQURTfS4gIFRoaXMgaXMgY29tbW9uIGFyb3VuZCBibG9ja2luZwotSS9PIGNhbGxzLCB0byBsZXQgb3RoZXIgdGhyZWFkcyB1c2UgdGhlIHByb2Nlc3NvciB3aGlsZSB3YWl0aW5nIGZvcgotdGhlIEkvTyB0byBjb21wbGV0ZS4gIE9idmlvdXNseSwgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiBoYXMgdGhlIHNhbWUKLXByb2JsZW0gYXMgdGhlIHByZXZpb3VzIG9uZToKLQotXGJlZ2lue3ZlcmJhdGltfQotdm9pZAotYnVnKFB5T2JqZWN0ICpsaXN0KQotewotICAgIFB5T2JqZWN0ICppdGVtID0gUHlMaXN0X0dldEl0ZW0obGlzdCwgMCk7Ci0gICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotICAgIC4uLnNvbWUgYmxvY2tpbmcgSS9PIGNhbGwuLi4KLSAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwotICAgIFB5T2JqZWN0X1ByaW50KGl0ZW0sIHN0ZG91dCwgMCk7IC8qIEJVRyEgKi8KLX0KLVxlbmR7dmVyYmF0aW19Ci0KLQotXHN1YnNlY3Rpb257TlVMTCBQb2ludGVycwotICAgICAgICAgICAgXGxhYmVse251bGxQb2ludGVyc319Ci0KLUluIGdlbmVyYWwsIGZ1bmN0aW9ucyB0aGF0IHRha2Ugb2JqZWN0IHJlZmVyZW5jZXMgYXMgYXJndW1lbnRzIGRvIG5vdAotZXhwZWN0IHlvdSB0byBwYXNzIHRoZW0gXE5VTEx7fSBwb2ludGVycywgYW5kIHdpbGwgZHVtcCBjb3JlIChvcgotY2F1c2UgbGF0ZXIgY29yZSBkdW1wcykgaWYgeW91IGRvIHNvLiAgRnVuY3Rpb25zIHRoYXQgcmV0dXJuIG9iamVjdAotcmVmZXJlbmNlcyBnZW5lcmFsbHkgcmV0dXJuIFxOVUxMe30gb25seSB0byBpbmRpY2F0ZSB0aGF0IGFuCi1leGNlcHRpb24gb2NjdXJyZWQuICBUaGUgcmVhc29uIGZvciBub3QgdGVzdGluZyBmb3IgXE5VTEx7fQotYXJndW1lbnRzIGlzIHRoYXQgZnVuY3Rpb25zIG9mdGVuIHBhc3MgdGhlIG9iamVjdHMgdGhleSByZWNlaXZlIG9uIHRvCi1vdGhlciBmdW5jdGlvbiAtLS0gaWYgZWFjaCBmdW5jdGlvbiB3ZXJlIHRvIHRlc3QgZm9yIFxOVUxMLAotdGhlcmUgd291bGQgYmUgYSBsb3Qgb2YgcmVkdW5kYW50IHRlc3RzIGFuZCB0aGUgY29kZSB3b3VsZCBydW4gbW9yZQotc2xvd2x5LgotCi1JdCBpcyBiZXR0ZXIgdG8gdGVzdCBmb3IgXE5VTEx7fSBvbmx5IGF0IHRoZSBgYHNvdXJjZTonJyB3aGVuIGEKLXBvaW50ZXIgdGhhdCBtYXkgYmUgXE5VTEx7fSBpcyByZWNlaXZlZCwgZm9yIGV4YW1wbGUsIGZyb20KLVxjZnVuY3Rpb257bWFsbG9jKCl9IG9yIGZyb20gYSBmdW5jdGlvbiB0aGF0IG1heSByYWlzZSBhbiBleGNlcHRpb24uCi0KLVRoZSBtYWNyb3MgXGNmdW5jdGlvbntQeV9JTkNSRUYoKX0gYW5kIFxjZnVuY3Rpb257UHlfREVDUkVGKCl9Ci1kbyBub3QgY2hlY2sgZm9yIFxOVUxMe30gcG9pbnRlcnMgLS0tIGhvd2V2ZXIsIHRoZWlyIHZhcmlhbnRzCi1cY2Z1bmN0aW9ue1B5X1hJTkNSRUYoKX0gYW5kIFxjZnVuY3Rpb257UHlfWERFQ1JFRigpfSBkby4KLQotVGhlIG1hY3JvcyBmb3IgY2hlY2tpbmcgZm9yIGEgcGFydGljdWxhciBvYmplY3QgdHlwZQotKFxjb2Rle1B5XHZhcnt0eXBlfV9DaGVjaygpfSkgZG9uJ3QgY2hlY2sgZm9yIFxOVUxMe30gcG9pbnRlcnMgLS0tCi1hZ2FpbiwgdGhlcmUgaXMgbXVjaCBjb2RlIHRoYXQgY2FsbHMgc2V2ZXJhbCBvZiB0aGVzZSBpbiBhIHJvdyB0byB0ZXN0Ci1hbiBvYmplY3QgYWdhaW5zdCB2YXJpb3VzIGRpZmZlcmVudCBleHBlY3RlZCB0eXBlcywgYW5kIHRoaXMgd291bGQKLWdlbmVyYXRlIHJlZHVuZGFudCB0ZXN0cy4gIFRoZXJlIGFyZSBubyB2YXJpYW50cyB3aXRoIFxOVUxMe30KLWNoZWNraW5nLgotCi1UaGUgQyBmdW5jdGlvbiBjYWxsaW5nIG1lY2hhbmlzbSBndWFyYW50ZWVzIHRoYXQgdGhlIGFyZ3VtZW50IGxpc3QKLXBhc3NlZCB0byBDIGZ1bmN0aW9ucyAoXGNvZGV7YXJnc30gaW4gdGhlIGV4YW1wbGVzKSBpcyBuZXZlcgotXE5VTEx7fSAtLS0gaW4gZmFjdCBpdCBndWFyYW50ZWVzIHRoYXQgaXQgaXMgYWx3YXlzIGEgdHVwbGUuXGZvb3Rub3RlewotVGhlc2UgZ3VhcmFudGVlcyBkb24ndCBob2xkIHdoZW4geW91IHVzZSB0aGUgYGBvbGQnJyBzdHlsZQotY2FsbGluZyBjb252ZW50aW9uIC0tLSB0aGlzIGlzIHN0aWxsIGZvdW5kIGluIG11Y2ggZXhpc3RpbmcgY29kZS59Ci0KLUl0IGlzIGEgc2V2ZXJlIGVycm9yIHRvIGV2ZXIgbGV0IGEgXE5VTEx7fSBwb2ludGVyIGBgZXNjYXBlJycgdG8KLXRoZSBQeXRob24gdXNlci4KLQotJSBGcmFuayBTdGFqYW5vOgotJSBBIHBlZGFnb2dpY2FsbHkgYnVnZ3kgZXhhbXBsZSwgYWxvbmcgdGhlIGxpbmVzIG9mIHRoZSBwcmV2aW91cyBsaXN0aW5nLCAKLSUgd291bGQgYmUgaGVscGZ1bCBoZXJlIC0tIHNob3dpbmcgaW4gbW9yZSBjb25jcmV0ZSB0ZXJtcyB3aGF0IHNvcnQgb2YgCi0lIGFjdGlvbnMgY291bGQgY2F1c2UgdGhlIHByb2JsZW0uIEkgY2FuJ3QgdmVyeSB3ZWxsIGltYWdpbmUgaXQgZnJvbSB0aGUgCi0lIGRlc2NyaXB0aW9uLgotCi0KLVxzZWN0aW9ue1dyaXRpbmcgRXh0ZW5zaW9ucyBpbiBcQ3BwCi0gICAgICAgICBcbGFiZWx7Y3BsdXNwbHVzfX0KLQotSXQgaXMgcG9zc2libGUgdG8gd3JpdGUgZXh0ZW5zaW9uIG1vZHVsZXMgaW4gXENwcC4gIFNvbWUgcmVzdHJpY3Rpb25zCi1hcHBseS4gIElmIHRoZSBtYWluIHByb2dyYW0gKHRoZSBQeXRob24gaW50ZXJwcmV0ZXIpIGlzIGNvbXBpbGVkIGFuZAotbGlua2VkIGJ5IHRoZSBDIGNvbXBpbGVyLCBnbG9iYWwgb3Igc3RhdGljIG9iamVjdHMgd2l0aCBjb25zdHJ1Y3RvcnMKLWNhbm5vdCBiZSB1c2VkLiAgVGhpcyBpcyBub3QgYSBwcm9ibGVtIGlmIHRoZSBtYWluIHByb2dyYW0gaXMgbGlua2VkCi1ieSB0aGUgXENwcHt9IGNvbXBpbGVyLiAgRnVuY3Rpb25zIHRoYXQgd2lsbCBiZSBjYWxsZWQgYnkgdGhlCi1QeXRob24gaW50ZXJwcmV0ZXIgKGluIHBhcnRpY3VsYXIsIG1vZHVsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMpCi1oYXZlIHRvIGJlIGRlY2xhcmVkIHVzaW5nIFxjb2Rle2V4dGVybiAiQyJ9LgotSXQgaXMgdW5uZWNlc3NhcnkgdG8gZW5jbG9zZSB0aGUgUHl0aG9uIGhlYWRlciBmaWxlcyBpbgotXGNvZGV7ZXh0ZXJuICJDIiBcey4uLlx9fSAtLS0gdGhleSB1c2UgdGhpcyBmb3JtIGFscmVhZHkgaWYgdGhlIHN5bWJvbAotXHNhbXB7X19jcGx1c3BsdXN9IGlzIGRlZmluZWQgKGFsbCByZWNlbnQgXENwcHt9IGNvbXBpbGVycyBkZWZpbmUgdGhpcwotc3ltYm9sKS4KLQotCi1cc2VjdGlvbntQcm92aWRpbmcgYSBDIEFQSSBmb3IgYW4gRXh0ZW5zaW9uIE1vZHVsZQotICAgICAgICAgXGxhYmVse3VzaW5nLWNvYmplY3RzfX0KLVxzZWN0aW9uYXV0aG9ye0tvbnJhZCBIaW5zZW59e2hpbnNlbkBjbnJzLW9ybGVhbnMuZnJ9Ci0KLU1hbnkgZXh0ZW5zaW9uIG1vZHVsZXMganVzdCBwcm92aWRlIG5ldyBmdW5jdGlvbnMgYW5kIHR5cGVzIHRvIGJlCi11c2VkIGZyb20gUHl0aG9uLCBidXQgc29tZXRpbWVzIHRoZSBjb2RlIGluIGFuIGV4dGVuc2lvbiBtb2R1bGUgY2FuCi1iZSB1c2VmdWwgZm9yIG90aGVyIGV4dGVuc2lvbiBtb2R1bGVzLiBGb3IgZXhhbXBsZSwgYW4gZXh0ZW5zaW9uCi1tb2R1bGUgY291bGQgaW1wbGVtZW50IGEgdHlwZSBgYGNvbGxlY3Rpb24nJyB3aGljaCB3b3JrcyBsaWtlIGxpc3RzCi13aXRob3V0IG9yZGVyLiBKdXN0IGxpa2UgdGhlIHN0YW5kYXJkIFB5dGhvbiBsaXN0IHR5cGUgaGFzIGEgQyBBUEkKLXdoaWNoIHBlcm1pdHMgZXh0ZW5zaW9uIG1vZHVsZXMgdG8gY3JlYXRlIGFuZCBtYW5pcHVsYXRlIGxpc3RzLCB0aGlzCi1uZXcgY29sbGVjdGlvbiB0eXBlIHNob3VsZCBoYXZlIGEgc2V0IG9mIEMgZnVuY3Rpb25zIGZvciBkaXJlY3QKLW1hbmlwdWxhdGlvbiBmcm9tIG90aGVyIGV4dGVuc2lvbiBtb2R1bGVzLgotCi1BdCBmaXJzdCBzaWdodCB0aGlzIHNlZW1zIGVhc3k6IGp1c3Qgd3JpdGUgdGhlIGZ1bmN0aW9ucyAod2l0aG91dAotZGVjbGFyaW5nIHRoZW0gXGtleXdvcmR7c3RhdGljfSwgb2YgY291cnNlKSwgcHJvdmlkZSBhbiBhcHByb3ByaWF0ZQotaGVhZGVyIGZpbGUsIGFuZCBkb2N1bWVudCB0aGUgQyBBUEkuIEFuZCBpbiBmYWN0IHRoaXMgd291bGQgd29yayBpZgotYWxsIGV4dGVuc2lvbiBtb2R1bGVzIHdlcmUgYWx3YXlzIGxpbmtlZCBzdGF0aWNhbGx5IHdpdGggdGhlIFB5dGhvbgotaW50ZXJwcmV0ZXIuIFdoZW4gbW9kdWxlcyBhcmUgdXNlZCBhcyBzaGFyZWQgbGlicmFyaWVzLCBob3dldmVyLCB0aGUKLXN5bWJvbHMgZGVmaW5lZCBpbiBvbmUgbW9kdWxlIG1heSBub3QgYmUgdmlzaWJsZSB0byBhbm90aGVyIG1vZHVsZS4KLVRoZSBkZXRhaWxzIG9mIHZpc2liaWxpdHkgZGVwZW5kIG9uIHRoZSBvcGVyYXRpbmcgc3lzdGVtOyBzb21lIHN5c3RlbXMKLXVzZSBvbmUgZ2xvYmFsIG5hbWVzcGFjZSBmb3IgdGhlIFB5dGhvbiBpbnRlcnByZXRlciBhbmQgYWxsIGV4dGVuc2lvbgotbW9kdWxlcyAoV2luZG93cywgZm9yIGV4YW1wbGUpLCB3aGVyZWFzIG90aGVycyByZXF1aXJlIGFuIGV4cGxpY2l0Ci1saXN0IG9mIGltcG9ydGVkIHN5bWJvbHMgYXQgbW9kdWxlIGxpbmsgdGltZSAoQUlYIGlzIG9uZSBleGFtcGxlKSwgb3IKLW9mZmVyIGEgY2hvaWNlIG9mIGRpZmZlcmVudCBzdHJhdGVnaWVzIChtb3N0IFVuaWNlcykuIEFuZCBldmVuIGlmCi1zeW1ib2xzIGFyZSBnbG9iYWxseSB2aXNpYmxlLCB0aGUgbW9kdWxlIHdob3NlIGZ1bmN0aW9ucyBvbmUgd2lzaGVzIHRvCi1jYWxsIG1pZ2h0IG5vdCBoYXZlIGJlZW4gbG9hZGVkIHlldCEKLQotUG9ydGFiaWxpdHkgdGhlcmVmb3JlIHJlcXVpcmVzIG5vdCB0byBtYWtlIGFueSBhc3N1bXB0aW9ucyBhYm91dAotc3ltYm9sIHZpc2liaWxpdHkuIFRoaXMgbWVhbnMgdGhhdCBhbGwgc3ltYm9scyBpbiBleHRlbnNpb24gbW9kdWxlcwotc2hvdWxkIGJlIGRlY2xhcmVkIFxrZXl3b3Jke3N0YXRpY30sIGV4Y2VwdCBmb3IgdGhlIG1vZHVsZSdzCi1pbml0aWFsaXphdGlvbiBmdW5jdGlvbiwgaW4gb3JkZXIgdG8gYXZvaWQgbmFtZSBjbGFzaGVzIHdpdGggb3RoZXIKLWV4dGVuc2lvbiBtb2R1bGVzIChhcyBkaXNjdXNzZWQgaW4gc2VjdGlvbn5ccmVme21ldGhvZFRhYmxlfSkuIEFuZCBpdAotbWVhbnMgdGhhdCBzeW1ib2xzIHRoYXQgXGVtcGh7c2hvdWxkfSBiZSBhY2Nlc3NpYmxlIGZyb20gb3RoZXIKLWV4dGVuc2lvbiBtb2R1bGVzIG11c3QgYmUgZXhwb3J0ZWQgaW4gYSBkaWZmZXJlbnQgd2F5LgotCi1QeXRob24gcHJvdmlkZXMgYSBzcGVjaWFsIG1lY2hhbmlzbSB0byBwYXNzIEMtbGV2ZWwgaW5mb3JtYXRpb24KLShwb2ludGVycykgZnJvbSBvbmUgZXh0ZW5zaW9uIG1vZHVsZSB0byBhbm90aGVyIG9uZTogQ09iamVjdHMuCi1BIENPYmplY3QgaXMgYSBQeXRob24gZGF0YSB0eXBlIHdoaWNoIHN0b3JlcyBhIHBvaW50ZXIgKFxjdHlwZXt2b2lkCi0qfSkuICBDT2JqZWN0cyBjYW4gb25seSBiZSBjcmVhdGVkIGFuZCBhY2Nlc3NlZCB2aWEgdGhlaXIgQyBBUEksIGJ1dAotdGhleSBjYW4gYmUgcGFzc2VkIGFyb3VuZCBsaWtlIGFueSBvdGhlciBQeXRob24gb2JqZWN0LiBJbiBwYXJ0aWN1bGFyLCAKLXRoZXkgY2FuIGJlIGFzc2lnbmVkIHRvIGEgbmFtZSBpbiBhbiBleHRlbnNpb24gbW9kdWxlJ3MgbmFtZXNwYWNlLgotT3RoZXIgZXh0ZW5zaW9uIG1vZHVsZXMgY2FuIHRoZW4gaW1wb3J0IHRoaXMgbW9kdWxlLCByZXRyaWV2ZSB0aGUKLXZhbHVlIG9mIHRoaXMgbmFtZSwgYW5kIHRoZW4gcmV0cmlldmUgdGhlIHBvaW50ZXIgZnJvbSB0aGUgQ09iamVjdC4KLQotVGhlcmUgYXJlIG1hbnkgd2F5cyBpbiB3aGljaCBDT2JqZWN0cyBjYW4gYmUgdXNlZCB0byBleHBvcnQgdGhlIEMgQVBJCi1vZiBhbiBleHRlbnNpb24gbW9kdWxlLiBFYWNoIG5hbWUgY291bGQgZ2V0IGl0cyBvd24gQ09iamVjdCwgb3IgYWxsIEMKLUFQSSBwb2ludGVycyBjb3VsZCBiZSBzdG9yZWQgaW4gYW4gYXJyYXkgd2hvc2UgYWRkcmVzcyBpcyBwdWJsaXNoZWQgaW4KLWEgQ09iamVjdC4gQW5kIHRoZSB2YXJpb3VzIHRhc2tzIG9mIHN0b3JpbmcgYW5kIHJldHJpZXZpbmcgdGhlIHBvaW50ZXJzCi1jYW4gYmUgZGlzdHJpYnV0ZWQgaW4gZGlmZmVyZW50IHdheXMgYmV0d2VlbiB0aGUgbW9kdWxlIHByb3ZpZGluZyB0aGUKLWNvZGUgYW5kIHRoZSBjbGllbnQgbW9kdWxlcy4KLQotVGhlIGZvbGxvd2luZyBleGFtcGxlIGRlbW9uc3RyYXRlcyBhbiBhcHByb2FjaCB0aGF0IHB1dHMgbW9zdCBvZiB0aGUKLWJ1cmRlbiBvbiB0aGUgd3JpdGVyIG9mIHRoZSBleHBvcnRpbmcgbW9kdWxlLCB3aGljaCBpcyBhcHByb3ByaWF0ZQotZm9yIGNvbW1vbmx5IHVzZWQgbGlicmFyeSBtb2R1bGVzLiBJdCBzdG9yZXMgYWxsIEMgQVBJIHBvaW50ZXJzCi0oanVzdCBvbmUgaW4gdGhlIGV4YW1wbGUhKSBpbiBhbiBhcnJheSBvZiBcY3R5cGV7dm9pZH0gcG9pbnRlcnMgd2hpY2gKLWJlY29tZXMgdGhlIHZhbHVlIG9mIGEgQ09iamVjdC4gVGhlIGhlYWRlciBmaWxlIGNvcnJlc3BvbmRpbmcgdG8KLXRoZSBtb2R1bGUgcHJvdmlkZXMgYSBtYWNybyB0aGF0IHRha2VzIGNhcmUgb2YgaW1wb3J0aW5nIHRoZSBtb2R1bGUKLWFuZCByZXRyaWV2aW5nIGl0cyBDIEFQSSBwb2ludGVyczsgY2xpZW50IG1vZHVsZXMgb25seSBoYXZlIHRvIGNhbGwKLXRoaXMgbWFjcm8gYmVmb3JlIGFjY2Vzc2luZyB0aGUgQyBBUEkuCi0KLVRoZSBleHBvcnRpbmcgbW9kdWxlIGlzIGEgbW9kaWZpY2F0aW9uIG9mIHRoZSBcbW9kdWxle3NwYW19IG1vZHVsZSBmcm9tCi1zZWN0aW9uflxyZWZ7c2ltcGxlRXhhbXBsZX0uIFRoZSBmdW5jdGlvbiBcZnVuY3Rpb257c3BhbS5zeXN0ZW0oKX0KLWRvZXMgbm90IGNhbGwgdGhlIEMgbGlicmFyeSBmdW5jdGlvbiBcY2Z1bmN0aW9ue3N5c3RlbSgpfSBkaXJlY3RseSwKLWJ1dCBhIGZ1bmN0aW9uIFxjZnVuY3Rpb257UHlTcGFtX1N5c3RlbSgpfSwgd2hpY2ggd291bGQgb2YgY291cnNlIGRvCi1zb21ldGhpbmcgbW9yZSBjb21wbGljYXRlZCBpbiByZWFsaXR5IChzdWNoIGFzIGFkZGluZyBgYHNwYW0nJyB0bwotZXZlcnkgY29tbWFuZCkuIFRoaXMgZnVuY3Rpb24gXGNmdW5jdGlvbntQeVNwYW1fU3lzdGVtKCl9IGlzIGFsc28KLWV4cG9ydGVkIHRvIG90aGVyIGV4dGVuc2lvbiBtb2R1bGVzLgotCi1UaGUgZnVuY3Rpb24gXGNmdW5jdGlvbntQeVNwYW1fU3lzdGVtKCl9IGlzIGEgcGxhaW4gQyBmdW5jdGlvbiwKLWRlY2xhcmVkIFxrZXl3b3Jke3N0YXRpY30gbGlrZSBldmVyeXRoaW5nIGVsc2U6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXN0YXRpYyBpbnQKLVB5U3BhbV9TeXN0ZW0oY29uc3QgY2hhciAqY29tbWFuZCkKLXsKLSAgICByZXR1cm4gc3lzdGVtKGNvbW1hbmQpOwotfQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGZ1bmN0aW9uIFxjZnVuY3Rpb257c3BhbV9zeXN0ZW0oKX0gaXMgbW9kaWZpZWQgaW4gYSB0cml2aWFsIHdheToKLQotXGJlZ2lue3ZlcmJhdGltfQotc3RhdGljIFB5T2JqZWN0ICoKLXNwYW1fc3lzdGVtKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKLXsKLSAgICBjb25zdCBjaGFyICpjb21tYW5kOwotICAgIGludCBzdHM7Ci0KLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMiLCAmY29tbWFuZCkpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHN0cyA9IFB5U3BhbV9TeXN0ZW0oY29tbWFuZCk7Ci0gICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdHMpOwotfQotXGVuZHt2ZXJiYXRpbX0KLQotSW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgbW9kdWxlLCByaWdodCBhZnRlciB0aGUgbGluZQotCi1cYmVnaW57dmVyYmF0aW19Ci0jaW5jbHVkZSAiUHl0aG9uLmgiCi1cZW5ke3ZlcmJhdGltfQotCi10d28gbW9yZSBsaW5lcyBtdXN0IGJlIGFkZGVkOgotCi1cYmVnaW57dmVyYmF0aW19Ci0jZGVmaW5lIFNQQU1fTU9EVUxFCi0jaW5jbHVkZSAic3BhbW1vZHVsZS5oIgotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIFxjb2Rle1wjZGVmaW5lfSBpcyB1c2VkIHRvIHRlbGwgdGhlIGhlYWRlciBmaWxlIHRoYXQgaXQgaXMgYmVpbmcKLWluY2x1ZGVkIGluIHRoZSBleHBvcnRpbmcgbW9kdWxlLCBub3QgYSBjbGllbnQgbW9kdWxlLiBGaW5hbGx5LAotdGhlIG1vZHVsZSdzIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIG11c3QgdGFrZSBjYXJlIG9mIGluaXRpYWxpemluZwotdGhlIEMgQVBJIHBvaW50ZXIgYXJyYXk6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLVB5TU9ESU5JVF9GVU5DCi1pbml0c3BhbSh2b2lkKQotewotICAgIFB5T2JqZWN0ICptOwotICAgIHN0YXRpYyB2b2lkICpQeVNwYW1fQVBJW1B5U3BhbV9BUElfcG9pbnRlcnNdOwotICAgIFB5T2JqZWN0ICpjX2FwaV9vYmplY3Q7Ci0KLSAgICBtID0gUHlfSW5pdE1vZHVsZSgic3BhbSIsIFNwYW1NZXRob2RzKTsKLSAgICBpZiAobSA9PSBOVUxMKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvKiBJbml0aWFsaXplIHRoZSBDIEFQSSBwb2ludGVyIGFycmF5ICovCi0gICAgUHlTcGFtX0FQSVtQeVNwYW1fU3lzdGVtX05VTV0gPSAodm9pZCAqKVB5U3BhbV9TeXN0ZW07Ci0KLSAgICAvKiBDcmVhdGUgYSBDT2JqZWN0IGNvbnRhaW5pbmcgdGhlIEFQSSBwb2ludGVyIGFycmF5J3MgYWRkcmVzcyAqLwotICAgIGNfYXBpX29iamVjdCA9IFB5Q09iamVjdF9Gcm9tVm9pZFB0cigodm9pZCAqKVB5U3BhbV9BUEksIE5VTEwpOwotCi0gICAgaWYgKGNfYXBpX29iamVjdCAhPSBOVUxMKQotICAgICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9DX0FQSSIsIGNfYXBpX29iamVjdCk7Ci19Ci1cZW5ke3ZlcmJhdGltfQotCi1Ob3RlIHRoYXQgXGNvZGV7UHlTcGFtX0FQSX0gaXMgZGVjbGFyZWQgXGtleXdvcmR7c3RhdGljfTsgb3RoZXJ3aXNlCi10aGUgcG9pbnRlciBhcnJheSB3b3VsZCBkaXNhcHBlYXIgd2hlbiBcZnVuY3Rpb257aW5pdHNwYW0oKX0gdGVybWluYXRlcyEKLQotVGhlIGJ1bGsgb2YgdGhlIHdvcmsgaXMgaW4gdGhlIGhlYWRlciBmaWxlIFxmaWxle3NwYW1tb2R1bGUuaH0sCi13aGljaCBsb29rcyBsaWtlIHRoaXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSNpZm5kZWYgUHlfU1BBTU1PRFVMRV9ICi0jZGVmaW5lIFB5X1NQQU1NT0RVTEVfSAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKiBIZWFkZXIgZmlsZSBmb3Igc3BhbW1vZHVsZSAqLwotCi0vKiBDIEFQSSBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgUHlTcGFtX1N5c3RlbV9OVU0gMAotI2RlZmluZSBQeVNwYW1fU3lzdGVtX1JFVFVSTiBpbnQKLSNkZWZpbmUgUHlTcGFtX1N5c3RlbV9QUk9UTyAoY29uc3QgY2hhciAqY29tbWFuZCkKLQotLyogVG90YWwgbnVtYmVyIG9mIEMgQVBJIHBvaW50ZXJzICovCi0jZGVmaW5lIFB5U3BhbV9BUElfcG9pbnRlcnMgMQotCi0KLSNpZmRlZiBTUEFNX01PRFVMRQotLyogVGhpcyBzZWN0aW9uIGlzIHVzZWQgd2hlbiBjb21waWxpbmcgc3BhbW1vZHVsZS5jICovCi0KLXN0YXRpYyBQeVNwYW1fU3lzdGVtX1JFVFVSTiBQeVNwYW1fU3lzdGVtIFB5U3BhbV9TeXN0ZW1fUFJPVE87Ci0KLSNlbHNlCi0vKiBUaGlzIHNlY3Rpb24gaXMgdXNlZCBpbiBtb2R1bGVzIHRoYXQgdXNlIHNwYW1tb2R1bGUncyBBUEkgKi8KLQotc3RhdGljIHZvaWQgKipQeVNwYW1fQVBJOwotCi0jZGVmaW5lIFB5U3BhbV9TeXN0ZW0gXAotICgqKFB5U3BhbV9TeXN0ZW1fUkVUVVJOICgqKVB5U3BhbV9TeXN0ZW1fUFJPVE8pIFB5U3BhbV9BUElbUHlTcGFtX1N5c3RlbV9OVU1dKQotCi0vKiBSZXR1cm4gLTEgYW5kIHNldCBleGNlcHRpb24gb24gZXJyb3IsIDAgb24gc3VjY2Vzcy4gKi8KLXN0YXRpYyBpbnQKLWltcG9ydF9zcGFtKHZvaWQpCi17Ci0gICAgUHlPYmplY3QgKm1vZHVsZSA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgic3BhbSIpOwotCi0gICAgaWYgKG1vZHVsZSAhPSBOVUxMKSB7Ci0gICAgICAgIFB5T2JqZWN0ICpjX2FwaV9vYmplY3QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG1vZHVsZSwgIl9DX0FQSSIpOwotICAgICAgICBpZiAoY19hcGlfb2JqZWN0ID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGlmIChQeUNPYmplY3RfQ2hlY2soY19hcGlfb2JqZWN0KSkKLSAgICAgICAgICAgIFB5U3BhbV9BUEkgPSAodm9pZCAqKilQeUNPYmplY3RfQXNWb2lkUHRyKGNfYXBpX29iamVjdCk7Ci0gICAgICAgIFB5X0RFQ1JFRihjX2FwaV9vYmplY3QpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotI2VuZGlmCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiAhZGVmaW5lZChQeV9TUEFNTU9EVUxFX0gpICovCi1cZW5ke3ZlcmJhdGltfQotCi1BbGwgdGhhdCBhIGNsaWVudCBtb2R1bGUgbXVzdCBkbyBpbiBvcmRlciB0byBoYXZlIGFjY2VzcyB0byB0aGUKLWZ1bmN0aW9uIFxjZnVuY3Rpb257UHlTcGFtX1N5c3RlbSgpfSBpcyB0byBjYWxsIHRoZSBmdW5jdGlvbiAob3IKLXJhdGhlciBtYWNybykgXGNmdW5jdGlvbntpbXBvcnRfc3BhbSgpfSBpbiBpdHMgaW5pdGlhbGl6YXRpb24KLWZ1bmN0aW9uOgotCi1cYmVnaW57dmVyYmF0aW19Ci1QeU1PRElOSVRfRlVOQwotaW5pdGNsaWVudCh2b2lkKQotewotICAgIFB5T2JqZWN0ICptOwotCi0gICAgbSA9IFB5X0luaXRNb2R1bGUoImNsaWVudCIsIENsaWVudE1ldGhvZHMpOwotICAgIGlmIChtID09IE5VTEwpCi0gICAgICAgIHJldHVybjsKLSAgICBpZiAoaW1wb3J0X3NwYW0oKSA8IDApCi0gICAgICAgIHJldHVybjsKLSAgICAvKiBhZGRpdGlvbmFsIGluaXRpYWxpemF0aW9uIGNhbiBoYXBwZW4gaGVyZSAqLwotfQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIG1haW4gZGlzYWR2YW50YWdlIG9mIHRoaXMgYXBwcm9hY2ggaXMgdGhhdCB0aGUgZmlsZQotXGZpbGV7c3BhbW1vZHVsZS5ofSBpcyByYXRoZXIgY29tcGxpY2F0ZWQuIEhvd2V2ZXIsIHRoZQotYmFzaWMgc3RydWN0dXJlIGlzIHRoZSBzYW1lIGZvciBlYWNoIGZ1bmN0aW9uIHRoYXQgaXMKLWV4cG9ydGVkLCBzbyBpdCBoYXMgdG8gYmUgbGVhcm5lZCBvbmx5IG9uY2UuCi0KLUZpbmFsbHkgaXQgc2hvdWxkIGJlIG1lbnRpb25lZCB0aGF0IENPYmplY3RzIG9mZmVyIGFkZGl0aW9uYWwKLWZ1bmN0aW9uYWxpdHksIHdoaWNoIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQKLWRlYWxsb2NhdGlvbiBvZiB0aGUgcG9pbnRlciBzdG9yZWQgaW4gYSBDT2JqZWN0LiBUaGUgZGV0YWlscwotYXJlIGRlc2NyaWJlZCBpbiB0aGUgXGNpdGV0aXRsZVsuLi9hcGkvYXBpLmh0bWxde1B5dGhvbi9DIEFQSQotUmVmZXJlbmNlIE1hbnVhbH0gaW4gdGhlIHNlY3Rpb24KLWBgXHVsaW5re0NPYmplY3RzfXsuLi9hcGkvY09iamVjdHMuaHRtbH0nJyBhbmQgaW4gdGhlIGltcGxlbWVudGF0aW9uCi1vZiBDT2JqZWN0cyAoZmlsZXMgXGZpbGV7SW5jbHVkZS9jb2JqZWN0Lmh9IGFuZAotXGZpbGV7T2JqZWN0cy9jb2JqZWN0LmN9IGluIHRoZSBQeXRob24gc291cmNlIGNvZGUgZGlzdHJpYnV0aW9uKS4KZGlmZiAtLWdpdCBhL0RvYy9leHQvbmV3dHlwZXMudGV4IGIvRG9jL2V4dC9uZXd0eXBlcy50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZWQ1NGQuLjAwMDAwMDAKLS0tIGEvRG9jL2V4dC9uZXd0eXBlcy50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzU4ICswLDAgQEAKLVxjaGFwdGVye0RlZmluaW5nIE5ldyBUeXBlcwotICAgICAgICBcbGFiZWx7ZGVmaW5pbmctbmV3LXR5cGVzfX0KLVxzZWN0aW9uYXV0aG9ye01pY2hhZWwgSHVkc29ufXttd2hAcHl0aG9uLm5ldH0KLVxzZWN0aW9uYXV0aG9ye0RhdmUgS3VobG1hbn17ZGt1aGxtYW5AcmV4eC5jb219Ci1cc2VjdGlvbmF1dGhvcntKaW0gRnVsdG9ufXtqaW1Aem9wZS5jb219Ci0KLUFzIG1lbnRpb25lZCBpbiB0aGUgbGFzdCBjaGFwdGVyLCBQeXRob24gYWxsb3dzIHRoZSB3cml0ZXIgb2YgYW4KLWV4dGVuc2lvbiBtb2R1bGUgdG8gZGVmaW5lIG5ldyB0eXBlcyB0aGF0IGNhbiBiZSBtYW5pcHVsYXRlZCBmcm9tCi1QeXRob24gY29kZSwgbXVjaCBsaWtlIHN0cmluZ3MgYW5kIGxpc3RzIGluIGNvcmUgUHl0aG9uLgotCi1UaGlzIGlzIG5vdCBoYXJkOyB0aGUgY29kZSBmb3IgYWxsIGV4dGVuc2lvbiB0eXBlcyBmb2xsb3dzIGEgcGF0dGVybiwKLWJ1dCB0aGVyZSBhcmUgc29tZSBkZXRhaWxzIHRoYXQgeW91IG5lZWQgdG8gdW5kZXJzdGFuZCBiZWZvcmUgeW91IGNhbgotZ2V0IHN0YXJ0ZWQuCi0KLVxiZWdpbntub3RpY2V9Ci1UaGUgd2F5IG5ldyB0eXBlcyBhcmUgZGVmaW5lZCBjaGFuZ2VkIGRyYW1hdGljYWxseSAoYW5kIGZvciB0aGUKLWJldHRlcikgaW4gUHl0aG9uIDIuMi4gIFRoaXMgZG9jdW1lbnQgZG9jdW1lbnRzIGhvdyB0byBkZWZpbmUgbmV3Ci10eXBlcyBmb3IgUHl0aG9uIDIuMiBhbmQgbGF0ZXIuICBJZiB5b3UgbmVlZCB0byBzdXBwb3J0IG9sZGVyCi12ZXJzaW9ucyBvZiBQeXRob24sIHlvdSB3aWxsIG5lZWQgdG8gcmVmZXIgdG8KLVx1bGlua3tvbGRlciB2ZXJzaW9ucyBvZiB0aGlzIGRvY3VtZW50YXRpb259Ci0gICAgICB7aHR0cDovL3d3dy5weXRob24ub3JnL2RvYy92ZXJzaW9ucy99LgotXGVuZHtub3RpY2V9Ci0KLVxzZWN0aW9ue1RoZSBCYXNpY3MKLSAgICBcbGFiZWx7ZG50LWJhc2ljc319Ci0KLVRoZSBQeXRob24gcnVudGltZSBzZWVzIGFsbCBQeXRob24gb2JqZWN0cyBhcyB2YXJpYWJsZXMgb2YgdHlwZQotXGN0eXBle1B5T2JqZWN0Kn0uICBBIFxjdHlwZXtQeU9iamVjdH0gaXMgbm90IGEgdmVyeSBtYWduaWZpY2VudAotb2JqZWN0IC0gaXQganVzdCBjb250YWlucyB0aGUgcmVmY291bnQgYW5kIGEgcG9pbnRlciB0byB0aGUgb2JqZWN0J3MKLWBgdHlwZSBvYmplY3QnJy4gIFRoaXMgaXMgd2hlcmUgdGhlIGFjdGlvbiBpczsgdGhlIHR5cGUgb2JqZWN0Ci1kZXRlcm1pbmVzIHdoaWNoIChDKSBmdW5jdGlvbnMgZ2V0IGNhbGxlZCB3aGVuLCBmb3IgaW5zdGFuY2UsIGFuCi1hdHRyaWJ1dGUgZ2V0cyBsb29rZWQgdXAgb24gYW4gb2JqZWN0IG9yIGl0IGlzIG11bHRpcGxpZWQgYnkgYW5vdGhlcgotb2JqZWN0LiAgVGhlc2UgQyBmdW5jdGlvbnMgYXJlIGNhbGxlZCBgYHR5cGUgbWV0aG9kcycnIHRvIGRpc3Rpbmd1aXNoCi10aGVtIGZyb20gdGhpbmdzIGxpa2UgXGNvZGV7W10uYXBwZW5kfSAod2hpY2ggd2UgY2FsbCBgYG9iamVjdAotbWV0aG9kcycnKS4KLQotU28sIGlmIHlvdSB3YW50IHRvIGRlZmluZSBhIG5ldyBvYmplY3QgdHlwZSwgeW91IG5lZWQgdG8gY3JlYXRlIGEgbmV3Ci10eXBlIG9iamVjdC4KLQotVGhpcyBzb3J0IG9mIHRoaW5nIGNhbiBvbmx5IGJlIGV4cGxhaW5lZCBieSBleGFtcGxlLCBzbyBoZXJlJ3MgYQotbWluaW1hbCwgYnV0IGNvbXBsZXRlLCBtb2R1bGUgdGhhdCBkZWZpbmVzIGEgbmV3IHR5cGU6Ci0KLVx2ZXJiYXRpbWlucHV0e25vZGR5LmN9Ci0KLU5vdyB0aGF0J3MgcXVpdGUgYSBiaXQgdG8gdGFrZSBpbiBhdCBvbmNlLCBidXQgaG9wZWZ1bGx5IGJpdHMgd2lsbAotc2VlbSBmYW1pbGlhciBmcm9tIHRoZSBsYXN0IGNoYXB0ZXIuCi0KLVRoZSBmaXJzdCBiaXQgdGhhdCB3aWxsIGJlIG5ldyBpczoKLQotXGJlZ2lue3ZlcmJhdGltfQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFB5T2JqZWN0X0hFQUQKLX0gbm9kZHlfTm9kZHlPYmplY3Q7Ci1cZW5ke3ZlcmJhdGltfQotCi1UaGlzIGlzIHdoYXQgYSBOb2RkeSBvYmplY3Qgd2lsbCBjb250YWluLS0taW4gdGhpcyBjYXNlLCBub3RoaW5nIG1vcmUKLXRoYW4gZXZlcnkgUHl0aG9uIG9iamVjdCBjb250YWlucywgbmFtZWx5IGEgcmVmY291bnQgYW5kIGEgcG9pbnRlciB0byBhIHR5cGUKLW9iamVjdC4gIFRoZXNlIGFyZSB0aGUgZmllbGRzIHRoZSBcY29kZXtQeU9iamVjdF9IRUFEfSBtYWNybyBicmluZ3MKLWluLiAgVGhlIHJlYXNvbiBmb3IgdGhlIG1hY3JvIGlzIHRvIHN0YW5kYXJkaXplIHRoZSBsYXlvdXQgYW5kIHRvCi1lbmFibGUgc3BlY2lhbCBkZWJ1Z2dpbmcgZmllbGRzIGluIGRlYnVnIGJ1aWxkcy4gIE5vdGUgdGhhdCB0aGVyZSBpcwotbm8gc2VtaWNvbG9uIGFmdGVyIHRoZSBcY29kZXtQeU9iamVjdF9IRUFEfSBtYWNybzsgb25lIGlzIGluY2x1ZGVkIGluCi10aGUgbWFjcm8gZGVmaW5pdGlvbi4gIEJlIHdhcnkgb2YgYWRkaW5nIG9uZSBieSBhY2NpZGVudDsgaXQncyBlYXN5IHRvCi1kbyBmcm9tIGhhYml0LCBhbmQgeW91ciBjb21waWxlciBtaWdodCBub3QgY29tcGxhaW4sIGJ1dCBzb21lb25lCi1lbHNlJ3MgcHJvYmFibHkgd2lsbCEgIChPbiBXaW5kb3dzLCBNU1ZDIGlzIGtub3duIHRvIGNhbGwgdGhpcyBhbgotZXJyb3IgYW5kIHJlZnVzZSB0byBjb21waWxlIHRoZSBjb2RlLikKLQotRm9yIGNvbnRyYXN0LCBsZXQncyB0YWtlIGEgbG9vayBhdCB0aGUgY29ycmVzcG9uZGluZyBkZWZpbml0aW9uIGZvcgotc3RhbmRhcmQgUHl0aG9uIGludGVnZXJzOgotCi1cYmVnaW57dmVyYmF0aW19Ci10eXBlZGVmIHN0cnVjdCB7Ci0gICAgUHlPYmplY3RfSEVBRAotICAgIGxvbmcgb2JfaXZhbDsKLX0gUHlJbnRPYmplY3Q7Ci1cZW5ke3ZlcmJhdGltfQotCi1Nb3Zpbmcgb24sIHdlIGNvbWUgdG8gdGhlIGNydW5jaCAtLS0gdGhlIHR5cGUgb2JqZWN0LgotCi1cYmVnaW57dmVyYmF0aW19Ci1zdGF0aWMgUHlUeXBlT2JqZWN0IG5vZGR5X05vZGR5VHlwZSA9IHsKLSAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLwotICAgICJub2RkeS5Ob2RkeSIsICAgICAgICAgICAgIC8qdHBfbmFtZSovCi0gICAgc2l6ZW9mKG5vZGR5X05vZGR5T2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVhbGxvYyovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2ggKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHJvKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCi0gICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgLyp0cF9mbGFncyovCi0gICAgIk5vZGR5IG9iamVjdHMiLCAgICAgICAgICAgLyogdHBfZG9jICovCi19OwotXGVuZHt2ZXJiYXRpbX0KLQotTm93IGlmIHlvdSBnbyBhbmQgbG9vayB1cCB0aGUgZGVmaW5pdGlvbiBvZiBcY3R5cGV7UHlUeXBlT2JqZWN0fSBpbgotXGZpbGV7b2JqZWN0Lmh9IHlvdSdsbCBzZWUgdGhhdCBpdCBoYXMgbWFueSBtb3JlIGZpZWxkcyB0aGF0IHRoZQotZGVmaW5pdGlvbiBhYm92ZS4gIFRoZSByZW1haW5pbmcgZmllbGRzIHdpbGwgYmUgZmlsbGVkIHdpdGggemVyb3MgYnkKLXRoZSBDIGNvbXBpbGVyLCBhbmQgaXQncyBjb21tb24gcHJhY3RpY2UgdG8gbm90IHNwZWNpZnkgdGhlbQotZXhwbGljaXRseSB1bmxlc3MgeW91IG5lZWQgdGhlbS4KLQotVGhpcyBpcyBzbyBpbXBvcnRhbnQgdGhhdCB3ZSdyZSBnb2luZyB0byBwaWNrIHRoZSB0b3Agb2YgaXQgYXBhcnQgc3RpbGwKLWZ1cnRoZXI6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLVxlbmR7dmVyYmF0aW19Ci0KLVRoaXMgbGluZSBpcyBhIGJpdCBvZiBhIHdhcnQ7IHdoYXQgd2UnZCBsaWtlIHRvIHdyaXRlIGlzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKLVxlbmR7dmVyYmF0aW19Ci0KLWFzIHRoZSB0eXBlIG9mIGEgdHlwZSBvYmplY3QgaXMgYGB0eXBlJycsIGJ1dCB0aGlzIGlzbid0IHN0cmljdGx5Ci1jb25mb3JtaW5nIEMgYW5kIHNvbWUgY29tcGlsZXJzIGNvbXBsYWluLiAgRm9ydHVuYXRlbHksIHRoaXMgbWVtYmVyCi13aWxsIGJlIGZpbGxlZCBpbiBmb3IgdXMgYnkgXGNmdW5jdGlvbntQeVR5cGVfUmVhZHkoKX0uCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2Jfc2l6ZSAqLwotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIFxtZW1iZXJ7b2Jfc2l6ZX0gZmllbGQgb2YgdGhlIGhlYWRlciBpcyBub3QgdXNlZDsgaXRzIHByZXNlbmNlIGluCi10aGUgdHlwZSBzdHJ1Y3R1cmUgaXMgYSBoaXN0b3JpY2FsIGFydGlmYWN0IHRoYXQgaXMgbWFpbnRhaW5lZCBmb3IKLWJpbmFyeSBjb21wYXRpYmlsaXR5IHdpdGggZXh0ZW5zaW9uIG1vZHVsZXMgY29tcGlsZWQgZm9yIG9sZGVyCi12ZXJzaW9ucyBvZiBQeXRob24uICBBbHdheXMgc2V0IHRoaXMgZmllbGQgdG8gemVyby4KLQotXGJlZ2lue3ZlcmJhdGltfQotICAgICJub2RkeS5Ob2RkeSIsICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgbmFtZSBvZiBvdXIgdHlwZS4gIFRoaXMgd2lsbCBhcHBlYXIgaW4gdGhlIGRlZmF1bHQgdGV4dHVhbAotcmVwcmVzZW50YXRpb24gb2Ygb3VyIG9iamVjdHMgYW5kIGluIHNvbWUgZXJyb3IgbWVzc2FnZXMsIGZvciBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gIiIgKyBub2RkeS5uZXdfbm9kZHkoKQotVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/Ci1UeXBlRXJyb3I6IGNhbm5vdCBhZGQgdHlwZSAibm9kZHkuTm9kZHkiIHRvIHN0cmluZwotXGVuZHt2ZXJiYXRpbX0KLQotTm90ZSB0aGF0IHRoZSBuYW1lIGlzIGEgZG90dGVkIG5hbWUgdGhhdCBpbmNsdWRlcyBib3RoIHRoZSBtb2R1bGUgbmFtZQotYW5kIHRoZSBuYW1lIG9mIHRoZSB0eXBlIHdpdGhpbiB0aGUgbW9kdWxlLiBUaGUgbW9kdWxlIGluIHRoaXMgY2FzZSBpcwotXG1vZHVsZXtub2RkeX0gYW5kIHRoZSB0eXBlIGlzIFxjbGFzc3tOb2RkeX0sIHNvIHdlIHNldCB0aGUgdHlwZSBuYW1lCi10byBcY2xhc3N7bm9kZHkuTm9kZHl9LgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgc2l6ZW9mKG5vZGR5X05vZGR5T2JqZWN0KSwgIC8qIHRwX2Jhc2ljc2l6ZSAqLwotXGVuZHt2ZXJiYXRpbX0KLQotVGhpcyBpcyBzbyB0aGF0IFB5dGhvbiBrbm93cyBob3cgbXVjaCBtZW1vcnkgdG8gYWxsb2NhdGUgd2hlbiB5b3UgY2FsbAotXGNmdW5jdGlvbntQeU9iamVjdF9OZXcoKX0uCi0KLVxub3Rle0lmIHlvdSB3YW50IHlvdXIgdHlwZSB0byBiZSBzdWJjbGFzc2FibGUgZnJvbSBQeXRob24sIGFuZCB5b3VyCi10eXBlIGhhcyB0aGUgc2FtZSBcbWVtYmVye3RwX2Jhc2ljc2l6ZX0gYXMgaXRzIGJhc2UgdHlwZSwgeW91IG1heQotaGF2ZSBwcm9ibGVtcyB3aXRoIG11bHRpcGxlIGluaGVyaXRhbmNlLiAgQSBQeXRob24gc3ViY2xhc3Mgb2YgeW91cgotdHlwZSB3aWxsIGhhdmUgdG8gbGlzdCB5b3VyIHR5cGUgZmlyc3QgaW4gaXRzIFxtZW1iZXJ7X19iYXNlc19ffSwgb3IKLWVsc2UgaXQgd2lsbCBub3QgYmUgYWJsZSB0byBjYWxsIHlvdXIgdHlwZSdzIFxtZXRob2R7X19uZXdfX30gbWV0aG9kCi13aXRob3V0IGdldHRpbmcgYW4gZXJyb3IuICBZb3UgY2FuIGF2b2lkIHRoaXMgcHJvYmxlbSBieSBlbnN1cmluZwotdGhhdCB5b3VyIHR5cGUgaGFzIGEgbGFyZ2VyIHZhbHVlIGZvciBcbWVtYmVye3RwX2Jhc2ljc2l6ZX0gdGhhbgotaXRzIGJhc2UgdHlwZSBkb2VzLiAgTW9zdCBvZiB0aGUgdGltZSwgdGhpcyB3aWxsIGJlIHRydWUgYW55d2F5LAotYmVjYXVzZSBlaXRoZXIgeW91ciBiYXNlIHR5cGUgd2lsbCBiZSBcY2xhc3N7b2JqZWN0fSwgb3IgZWxzZSB5b3Ugd2lsbAotYmUgYWRkaW5nIGRhdGEgbWVtYmVycyB0byB5b3VyIGJhc2UgdHlwZSwgYW5kIHRoZXJlZm9yZSBpbmNyZWFzaW5nIGl0cwotc2l6ZS59Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KLVxlbmR7dmVyYmF0aW19Ci0KLVRoaXMgaGFzIHRvIGRvIHdpdGggdmFyaWFibGUgbGVuZ3RoIG9iamVjdHMgbGlrZSBsaXN0cyBhbmQgc3RyaW5ncy4KLUlnbm9yZSB0aGlzIGZvciBub3cuCi0KLVNraXBwaW5nIGEgbnVtYmVyIG9mIHR5cGUgbWV0aG9kcyB0aGF0IHdlIGRvbid0IHByb3ZpZGUsIHdlIHNldCB0aGUKLWNsYXNzIGZsYWdzIHRvIFxjb25zdGFudHtQeV9UUEZMQUdTX0RFRkFVTFR9LgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgLyp0cF9mbGFncyovCi1cZW5ke3ZlcmJhdGltfQotCi1BbGwgdHlwZXMgc2hvdWxkIGluY2x1ZGUgdGhpcyBjb25zdGFudCBpbiB0aGVpciBmbGFncy4gIEl0IGVuYWJsZXMgYWxsCi1vZiB0aGUgbWVtYmVycyBkZWZpbmVkIGJ5IHRoZSBjdXJyZW50IHZlcnNpb24gb2YgUHl0aG9uLgotCi1XZSBwcm92aWRlIGEgZG9jIHN0cmluZyBmb3IgdGhlIHR5cGUgaW4gXG1lbWJlcnt0cF9kb2N9LgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgIk5vZGR5IG9iamVjdHMiLCAgICAgICAgICAgLyogdHBfZG9jICovCi1cZW5ke3ZlcmJhdGltfQotCi1Ob3cgd2UgZ2V0IGludG8gdGhlIHR5cGUgbWV0aG9kcywgdGhlIHRoaW5ncyB0aGF0IG1ha2UgeW91ciBvYmplY3RzCi1kaWZmZXJlbnQgZnJvbSB0aGUgb3RoZXJzLiAgV2UgYXJlbid0IGdvaW5nIHRvIGltcGxlbWVudCBhbnkgb2YgdGhlc2UKLWluIHRoaXMgdmVyc2lvbiBvZiB0aGUgbW9kdWxlLiAgV2UnbGwgZXhwYW5kIHRoaXMgZXhhbXBsZSBsYXRlciB0bwotaGF2ZSBtb3JlIGludGVyZXN0aW5nIGJlaGF2aW9yLgotCi1Gb3Igbm93LCBhbGwgd2Ugd2FudCB0byBiZSBhYmxlIHRvIGRvIGlzIHRvIGNyZWF0ZSBuZXcgXGNsYXNze05vZGR5fQotb2JqZWN0cy4gVG8gZW5hYmxlIG9iamVjdCBjcmVhdGlvbiwgd2UgaGF2ZSB0byBwcm92aWRlIGEKLVxtZW1iZXJ7dHBfbmV3fSBpbXBsZW1lbnRhdGlvbi4gSW4gdGhpcyBjYXNlLCB3ZSBjYW4ganVzdCB1c2UgdGhlCi1kZWZhdWx0IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBBUEkgZnVuY3Rpb24KLVxjZnVuY3Rpb257UHlUeXBlX0dlbmVyaWNOZXcoKX0uICBXZSdkIGxpa2UgdG8ganVzdCBhc3NpZ24gdGhpcyB0byB0aGUKLVxtZW1iZXJ7dHBfbmV3fSBzbG90LCBidXQgd2UgY2FuJ3QsIGZvciBwb3J0YWJpbGl0eSBzYWtlLCBPbiBzb21lCi1wbGF0Zm9ybXMgb3IgY29tcGlsZXJzLCB3ZSBjYW4ndCBzdGF0aWNhbGx5IGluaXRpYWxpemUgYSBzdHJ1Y3R1cmUKLW1lbWJlciB3aXRoIGEgZnVuY3Rpb24gZGVmaW5lZCBpbiBhbm90aGVyIEMgbW9kdWxlLCBzbywgaW5zdGVhZCwgd2UnbGwKLWFzc2lnbiB0aGUgXG1lbWJlcnt0cF9uZXd9IHNsb3QgaW4gdGhlIG1vZHVsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgotanVzdCBiZWZvcmUgY2FsbGluZyBcY2Z1bmN0aW9ue1B5VHlwZV9SZWFkeSgpfToKLQotXGJlZ2lue3ZlcmJhdGltfQotICAgIG5vZGR5X05vZGR5VHlwZS50cF9uZXcgPSBQeVR5cGVfR2VuZXJpY05ldzsKLSAgICBpZiAoUHlUeXBlX1JlYWR5KCZub2RkeV9Ob2RkeVR5cGUpIDwgMCkKLSAgICAgICAgcmV0dXJuOwotXGVuZHt2ZXJiYXRpbX0KLQotQWxsIHRoZSBvdGhlciB0eXBlIG1ldGhvZHMgYXJlIFxOVUxMLCBzbyB3ZSdsbCBnbyBvdmVyIHRoZW0gbGF0ZXIKLS0tLSB0aGF0J3MgZm9yIGEgbGF0ZXIgc2VjdGlvbiEKLQotRXZlcnl0aGluZyBlbHNlIGluIHRoZSBmaWxlIHNob3VsZCBiZSBmYW1pbGlhciwgZXhjZXB0IGZvciBzb21lIGNvZGUKLWluIFxjZnVuY3Rpb257aW5pdG5vZGR5KCl9OgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgaWYgKFB5VHlwZV9SZWFkeSgmbm9kZHlfTm9kZHlUeXBlKSA8IDApCi0gICAgICAgIHJldHVybjsKLVxlbmR7dmVyYmF0aW19Ci0KLVRoaXMgaW5pdGlhbGl6ZXMgdGhlIFxjbGFzc3tOb2RkeX0gdHlwZSwgZmlsaW5nIGluIGEgbnVtYmVyIG9mCi1tZW1iZXJzLCBpbmNsdWRpbmcgXG1lbWJlcntvYl90eXBlfSB0aGF0IHdlIGluaXRpYWxseSBzZXQgdG8gXE5VTEwuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIk5vZGR5IiwgKFB5T2JqZWN0ICopJm5vZGR5X05vZGR5VHlwZSk7Ci1cZW5ke3ZlcmJhdGltfQotCi1UaGlzIGFkZHMgdGhlIHR5cGUgdG8gdGhlIG1vZHVsZSBkaWN0aW9uYXJ5LiAgVGhpcyBhbGxvd3MgdXMgdG8gY3JlYXRlCi1cY2xhc3N7Tm9kZHl9IGluc3RhbmNlcyBieSBjYWxsaW5nIHRoZSBcY2xhc3N7Tm9kZHl9IGNsYXNzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gaW1wb3J0IG5vZGR5Ci0+Pj4gbXlub2RkeSA9IG5vZGR5Lk5vZGR5KCkKLVxlbmR7dmVyYmF0aW19Ci0KLVRoYXQncyBpdCEgIEFsbCB0aGF0IHJlbWFpbnMgaXMgdG8gYnVpbGQgaXQ7IHB1dCB0aGUgYWJvdmUgY29kZSBpbiBhCi1maWxlIGNhbGxlZCBcZmlsZXtub2RkeS5jfSBhbmQKLQotXGJlZ2lue3ZlcmJhdGltfQotZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAsIEV4dGVuc2lvbgotc2V0dXAobmFtZT0ibm9kZHkiLCB2ZXJzaW9uPSIxLjAiLAotICAgICAgZXh0X21vZHVsZXM9W0V4dGVuc2lvbigibm9kZHkiLCBbIm5vZGR5LmMiXSldKQotXGVuZHt2ZXJiYXRpbX0KLQotaW4gYSBmaWxlIGNhbGxlZCBcZmlsZXtzZXR1cC5weX07IHRoZW4gdHlwaW5nCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLSQgcHl0aG9uIHNldHVwLnB5IGJ1aWxkCi1cZW5ke3ZlcmJhdGltfSAlJCA8LS0gYm93IHRvIGZvbnQtbG9jayAgOy0oCi0KLWF0IGEgc2hlbGwgc2hvdWxkIHByb2R1Y2UgYSBmaWxlIFxmaWxle25vZGR5LnNvfSBpbiBhIHN1YmRpcmVjdG9yeTsKLW1vdmUgdG8gdGhhdCBkaXJlY3RvcnkgYW5kIGZpcmUgdXAgUHl0aG9uIC0tLSB5b3Ugc2hvdWxkIGJlIGFibGUgdG8KLVxjb2Rle2ltcG9ydCBub2RkeX0gYW5kIHBsYXkgYXJvdW5kIHdpdGggTm9kZHkgb2JqZWN0cy4KLQotVGhhdCB3YXNuJ3Qgc28gaGFyZCwgd2FzIGl0PwotCi1PZiBjb3Vyc2UsIHRoZSBjdXJyZW50IE5vZGR5IHR5cGUgaXMgcHJldHR5IHVuaW50ZXJlc3RpbmcuIEl0IGhhcyBubwotZGF0YSBhbmQgZG9lc24ndCBkbyBhbnl0aGluZy4gSXQgY2FuJ3QgZXZlbiBiZSBzdWJjbGFzc2VkLgotCi1cc3Vic2VjdGlvbntBZGRpbmcgZGF0YSBhbmQgbWV0aG9kcyB0byB0aGUgQmFzaWMgZXhhbXBsZX0KLQotTGV0J3MgZXhwZW5kIHRoZSBiYXNpYyBleGFtcGxlIHRvIGFkZCBzb21lIGRhdGEgYW5kIG1ldGhvZHMuICBMZXQncwotYWxzbyBtYWtlIHRoZSB0eXBlIHVzYWJsZSBhcyBhIGJhc2UgY2xhc3MuIFdlJ2xsIGNyZWF0ZQotYSBuZXcgbW9kdWxlLCBcbW9kdWxle25vZGR5Mn0gdGhhdCBhZGRzIHRoZXNlIGNhcGFiaWxpdGllczoKLQotXHZlcmJhdGltaW5wdXR7bm9kZHkyLmN9Ci0KLVRoaXMgdmVyc2lvbiBvZiB0aGUgbW9kdWxlIGhhcyBhIG51bWJlciBvZiBjaGFuZ2VzLgotCi1XZSd2ZSBhZGRlZCBhbiBleHRyYSBpbmNsdWRlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0jaW5jbHVkZSAic3RydWN0bWVtYmVyLmgiCi1cZW5ke3ZlcmJhdGltfQotCi1UaGlzIGluY2x1ZGUgcHJvdmlkZXMgZGVjbGFyYXRpb25zIHRoYXQgd2UgdXNlIHRvIGhhbmRsZSBhdHRyaWJ1dGVzLAotYXMgZGVzY3JpYmVkIGEgYml0IGxhdGVyLgotCi1UaGUgbmFtZSBvZiB0aGUgXGNsYXNze05vZGR5fSBvYmplY3Qgc3RydWN0dXJlIGhhcyBiZWVuIHNob3J0ZW5lZCB0bwotXGNsYXNze05vZGR5fS4gIFRoZSB0eXBlIG9iamVjdCBuYW1lIGhhcyBiZWVuIHNob3J0ZW5lZCB0bwotXGNsYXNze05vZGR5VHlwZX0uCi0KLVRoZSAgXGNsYXNze05vZGR5fSB0eXBlIG5vdyBoYXMgdGhyZWUgZGF0YSBhdHRyaWJ1dGVzLCBcdmFye2ZpcnN0fSwKLVx2YXJ7bGFzdH0sIGFuZCBcdmFye251bWJlcn0uICBUaGUgXHZhcntmaXJzdH0gYW5kIFx2YXJ7bGFzdH0KLXZhcmlhYmxlcyBhcmUgUHl0aG9uIHN0cmluZ3MgY29udGFpbmluZyBmaXJzdCBhbmQgbGFzdCBuYW1lcy4gVGhlCi1cdmFye251bWJlcn0gYXR0cmlidXRlIGlzIGFuIGludGVnZXIuCi0KLVRoZSBvYmplY3Qgc3RydWN0dXJlIGlzIHVwZGF0ZWQgYWNjb3JkaW5nbHk6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBQeU9iamVjdF9IRUFECi0gICAgUHlPYmplY3QgKmZpcnN0OwotICAgIFB5T2JqZWN0ICpsYXN0OwotICAgIGludCBudW1iZXI7Ci19IE5vZGR5OwotXGVuZHt2ZXJiYXRpbX0KLQotQmVjYXVzZSB3ZSBub3cgaGF2ZSBkYXRhIHRvIG1hbmFnZSwgd2UgaGF2ZSB0byBiZSBtb3JlIGNhcmVmdWwgYWJvdXQKLW9iamVjdCBhbGxvY2F0aW9uIGFuZCBkZWFsbG9jYXRpb24uICBBdCBhIG1pbmltdW0sIHdlIG5lZWQgYQotZGVhbGxvY2F0aW9uIG1ldGhvZDoKLQotXGJlZ2lue3ZlcmJhdGltfQotc3RhdGljIHZvaWQKLU5vZGR5X2RlYWxsb2MoTm9kZHkqIHNlbGYpCi17Ci0gICAgUHlfWERFQ1JFRihzZWxmLT5maXJzdCk7Ci0gICAgUHlfWERFQ1JFRihzZWxmLT5sYXN0KTsKLSAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Ci19Ci1cZW5ke3ZlcmJhdGltfQotCi13aGljaCBpcyBhc3NpZ25lZCB0byB0aGUgXG1lbWJlcnt0cF9kZWFsbG9jfSBtZW1iZXI6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICAoZGVzdHJ1Y3RvcilOb2RkeV9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotXGVuZHt2ZXJiYXRpbX0KLQotVGhpcyBtZXRob2QgZGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50cyBvZiB0aGUgdHdvIFB5dGhvbgotYXR0cmlidXRlcy4gV2UgdXNlIFxjZnVuY3Rpb257UHlfWERFQ1JFRigpfSBoZXJlIGJlY2F1c2UgdGhlCi1cbWVtYmVye2ZpcnN0fSBhbmQgXG1lbWJlcntsYXN0fSBtZW1iZXJzIGNvdWxkIGJlIFxOVUxMLiAgSXQgdGhlbgotY2FsbHMgdGhlIFxtZW1iZXJ7dHBfZnJlZX0gbWVtYmVyIG9mIHRoZSBvYmplY3QncyB0eXBlIHRvIGZyZWUgdGhlCi1vYmplY3QncyBtZW1vcnkuICBOb3RlIHRoYXQgdGhlIG9iamVjdCdzIHR5cGUgbWlnaHQgbm90IGJlCi1cY2xhc3N7Tm9kZHlUeXBlfSwgYmVjYXVzZSB0aGUgb2JqZWN0IG1heSBiZSBhbiBpbnN0YW5jZSBvZiBhCi1zdWJjbGFzcy4KLQotV2Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZmlyc3QgYW5kIGxhc3QgbmFtZXMgYXJlIGluaXRpYWxpemVkIHRvCi1lbXB0eSBzdHJpbmdzLCBzbyB3ZSBwcm92aWRlIGEgbmV3IG1ldGhvZDoKLQotXGJlZ2lue3ZlcmJhdGltfQotc3RhdGljIFB5T2JqZWN0ICoKLU5vZGR5X25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKLXsKLSAgICBOb2RkeSAqc2VsZjsKLQotICAgIHNlbGYgPSAoTm9kZHkgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLSAgICBpZiAoc2VsZiAhPSBOVUxMKSB7Ci0gICAgICAgIHNlbGYtPmZpcnN0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7Ci0gICAgICAgIGlmIChzZWxmLT5maXJzdCA9PSBOVUxMKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgIH0KLQotICAgICAgICBzZWxmLT5sYXN0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7Ci0gICAgICAgIGlmIChzZWxmLT5sYXN0ID09IE5VTEwpCi0gICAgICAgICAgewotICAgICAgICAgICAgUHlfREVDUkVGKHNlbGYpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgfQotCi0gICAgICAgIHNlbGYtPm51bWJlciA9IDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7Ci19Ci1cZW5ke3ZlcmJhdGltfQotCi1hbmQgaW5zdGFsbCBpdCBpbiB0aGUgXG1lbWJlcnt0cF9uZXd9IG1lbWJlcjoKLQotXGJlZ2lue3ZlcmJhdGltfQotICAgIE5vZGR5X25ldywgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIG5ldyBtZW1iZXIgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIChhcyBvcHBvc2VkIHRvCi1pbml0aWFsaXppbmcpIG9iamVjdHMgb2YgdGhlIHR5cGUuICBJdCBpcyBleHBvc2VkIGluIFB5dGhvbiBhcyB0aGUKLVxtZXRob2R7X19uZXdfXygpfSBtZXRob2QuICBTZWUgdGhlIHBhcGVyIHRpdGxlZCBgYFVuaWZ5aW5nIHR5cGVzIGFuZAotY2xhc3NlcyBpbiBQeXRob24nJyBmb3IgYSBkZXRhaWxlZCBkaXNjdXNzaW9uIG9mIHRoZSBcbWV0aG9ke19fbmV3X18oKX0KLW1ldGhvZC4gIE9uZSByZWFzb24gdG8gaW1wbGVtZW50IGEgbmV3IG1ldGhvZCBpcyB0byBhc3N1cmUgdGhlIGluaXRpYWwKLXZhbHVlcyBvZiBpbnN0YW5jZSB2YXJpYWJsZXMuICBJbiB0aGlzIGNhc2UsIHdlIHVzZSB0aGUgbmV3IG1ldGhvZCB0bwotbWFrZSBzdXJlIHRoYXQgdGhlIGluaXRpYWwgdmFsdWVzIG9mIHRoZSBtZW1iZXJzIFxtZW1iZXJ7Zmlyc3R9IGFuZAotXG1lbWJlcntsYXN0fSBhcmUgbm90IFxOVUxMLiBJZiB3ZSBkaWRuJ3QgY2FyZSB3aGV0aGVyIHRoZSBpbml0aWFsCi12YWx1ZXMgd2VyZSBcTlVMTCwgd2UgY291bGQgaGF2ZSB1c2VkIFxjZnVuY3Rpb257UHlUeXBlX0dlbmVyaWNOZXcoKX0gYXMKLW91ciBuZXcgbWV0aG9kLCBhcyB3ZSBkaWQgYmVmb3JlLiAgXGNmdW5jdGlvbntQeVR5cGVfR2VuZXJpY05ldygpfQotaW5pdGlhbGl6ZXMgYWxsIG9mIHRoZSBpbnN0YW5jZSB2YXJpYWJsZSBtZW1iZXJzIHRvIFxOVUxMLgotCi1UaGUgbmV3IG1ldGhvZCBpcyBhIHN0YXRpYyBtZXRob2QgdGhhdCBpcyBwYXNzZWQgdGhlIHR5cGUgYmVpbmcKLWluc3RhbnRpYXRlZCBhbmQgYW55IGFyZ3VtZW50cyBwYXNzZWQgd2hlbiB0aGUgdHlwZSB3YXMgY2FsbGVkLAotYW5kIHRoYXQgcmV0dXJucyB0aGUgbmV3IG9iamVjdCBjcmVhdGVkLiBOZXcgbWV0aG9kcyBhbHdheXMgYWNjZXB0Ci1wb3NpdGlvbmFsIGFuZCBrZXl3b3JkIGFyZ3VtZW50cywgYnV0IHRoZXkgb2Z0ZW4gaWdub3JlIHRoZSBhcmd1bWVudHMsCi1sZWF2aW5nIHRoZSBhcmd1bWVudCBoYW5kbGluZyB0byBpbml0aWFsaXplciBtZXRob2RzLiBOb3RlIHRoYXQgaWYgdGhlCi10eXBlIHN1cHBvcnRzIHN1YmNsYXNzaW5nLCB0aGUgdHlwZSBwYXNzZWQgbWF5IG5vdCBiZSB0aGUgdHlwZSBiZWluZwotZGVmaW5lZC4gIFRoZSBuZXcgbWV0aG9kIGNhbGxzIHRoZSB0cF9hbGxvYyBzbG90IHRvIGFsbG9jYXRlIG1lbW9yeS4KLVdlIGRvbid0IGZpbGwgdGhlIFxtZW1iZXJ7dHBfYWxsb2N9IHNsb3Qgb3Vyc2VsdmVzLiBSYXRoZXIKLVxjZnVuY3Rpb257UHlUeXBlX1JlYWR5KCl9IGZpbGxzIGl0IGZvciB1cyBieSBpbmhlcml0aW5nIGl0IGZyb20gb3VyCi1iYXNlIGNsYXNzLCB3aGljaCBpcyBcY2xhc3N7b2JqZWN0fSBieSBkZWZhdWx0LiAgTW9zdCB0eXBlcyB1c2UgdGhlCi1kZWZhdWx0IGFsbG9jYXRpb24uCi0KLVxub3Rle0lmIHlvdSBhcmUgY3JlYXRpbmcgYSBjby1vcGVyYXRpdmUgXG1lbWJlcnt0cF9uZXd9IChvbmUgdGhhdAotY2FsbHMgYSBiYXNlIHR5cGUncyBcbWVtYmVye3RwX25ld30gb3IgXG1ldGhvZHtfX25ld19ffSksIHlvdQotbXVzdCBcZW1waHtub3R9IHRyeSB0byBkZXRlcm1pbmUgd2hhdCBtZXRob2QgdG8gY2FsbCB1c2luZwotbWV0aG9kIHJlc29sdXRpb24gb3JkZXIgYXQgcnVudGltZS4gIEFsd2F5cyBzdGF0aWNhbGx5IGRldGVybWluZQotd2hhdCB0eXBlIHlvdSBhcmUgZ29pbmcgdG8gY2FsbCwgYW5kIGNhbGwgaXRzIFxtZW1iZXJ7dHBfbmV3fQotZGlyZWN0bHksIG9yIHZpYSBcY29kZXt0eXBlLT50cF9iYXNlLT50cF9uZXd9LiAgSWYgeW91IGRvCi1ub3QgZG8gdGhpcywgUHl0aG9uIHN1YmNsYXNzZXMgb2YgeW91ciB0eXBlIHRoYXQgYWxzbyBpbmhlcml0Ci1mcm9tIG90aGVyIFB5dGhvbi1kZWZpbmVkIGNsYXNzZXMgbWF5IG5vdCB3b3JrIGNvcnJlY3RseS4KLShTcGVjaWZpY2FsbHksIHlvdSBtYXkgbm90IGJlIGFibGUgdG8gY3JlYXRlIGluc3RhbmNlcyBvZgotc3VjaCBzdWJjbGFzc2VzIHdpdGhvdXQgZ2V0dGluZyBhIFxleGNlcHRpb257VHlwZUVycm9yfS4pfQotCi1XZSBwcm92aWRlIGFuIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uOgotCi1cYmVnaW57dmVyYmF0aW19Ci1zdGF0aWMgaW50Ci1Ob2RkeV9pbml0KE5vZGR5ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCi17Ci0gICAgUHlPYmplY3QgKmZpcnN0PU5VTEwsICpsYXN0PU5VTEwsICp0bXA7Ci0KLSAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImZpcnN0IiwgImxhc3QiLCAibnVtYmVyIiwgTlVMTH07Ci0KLSAgICBpZiAoISBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInxPT2kiLCBrd2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaXJzdCwgJmxhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5udW1iZXIpKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgdG1wID0gc2VsZi0+Zmlyc3Q7Ci0gICAgICAgIFB5X0lOQ1JFRihmaXJzdCk7Ci0gICAgICAgIHNlbGYtPmZpcnN0ID0gZmlyc3Q7Ci0gICAgICAgIFB5X1hERUNSRUYodG1wKTsKLSAgICB9Ci0KLSAgICBpZiAobGFzdCkgewotICAgICAgICB0bXAgPSBzZWxmLT5sYXN0OwotICAgICAgICBQeV9JTkNSRUYobGFzdCk7Ci0gICAgICAgIHNlbGYtPmxhc3QgPSBsYXN0OwotICAgICAgICBQeV9YREVDUkVGKHRtcCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci1cZW5ke3ZlcmJhdGltfQotCi1ieSBmaWxsaW5nIHRoZSBcbWVtYmVye3RwX2luaXR9IHNsb3QuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICAoaW5pdHByb2MpTm9kZHlfaW5pdCwgICAgICAgICAvKiB0cF9pbml0ICovCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgXG1lbWJlcnt0cF9pbml0fSBzbG90IGlzIGV4cG9zZWQgaW4gUHl0aG9uIGFzIHRoZQotXG1ldGhvZHtfX2luaXRfXygpfSBtZXRob2QuIEl0IGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBhbiBvYmplY3QgYWZ0ZXIKLWl0J3MgY3JlYXRlZC4gVW5saWtlIHRoZSBuZXcgbWV0aG9kLCB3ZSBjYW4ndCBndWFyYW50ZWUgdGhhdCB0aGUKLWluaXRpYWxpemVyIGlzIGNhbGxlZC4gIFRoZSBpbml0aWFsaXplciBpc24ndCBjYWxsZWQgd2hlbiB1bnBpY2tsaW5nCi1vYmplY3RzIGFuZCBpdCBjYW4gYmUgb3ZlcnJpZGRlbi4gIE91ciBpbml0aWFsaXplciBhY2NlcHRzIGFyZ3VtZW50cwotdG8gcHJvdmlkZSBpbml0aWFsIHZhbHVlcyBmb3Igb3VyIGluc3RhbmNlLiBJbml0aWFsaXplcnMgYWx3YXlzIGFjY2VwdAotcG9zaXRpb25hbCBhbmQga2V5d29yZCBhcmd1bWVudHMuCi0KLUluaXRpYWxpemVycyBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAgQW55b25lIGNhbiBjYWxsIHRoZQotXG1ldGhvZHtfX2luaXRfXygpfSBtZXRob2Qgb24gb3VyIG9iamVjdHMuICBGb3IgdGhpcyByZWFzb24sIHdlIGhhdmUKLXRvIGJlIGV4dHJhIGNhcmVmdWwgd2hlbiBhc3NpZ25pbmcgdGhlIG5ldyB2YWx1ZXMuICBXZSBtaWdodCBiZQotdGVtcHRlZCwgZm9yIGV4YW1wbGUgdG8gYXNzaWduIHRoZSBcbWVtYmVye2ZpcnN0fSBtZW1iZXIgbGlrZSB0aGlzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIFB5X1hERUNSRUYoc2VsZi0+Zmlyc3QpOwotICAgICAgICBQeV9JTkNSRUYoZmlyc3QpOwotICAgICAgICBzZWxmLT5maXJzdCA9IGZpcnN0OwotICAgIH0KLVxlbmR7dmVyYmF0aW19Ci0KLUJ1dCB0aGlzIHdvdWxkIGJlIHJpc2t5LiAgT3VyIHR5cGUgZG9lc24ndCByZXN0cmljdCB0aGUgdHlwZSBvZiB0aGUKLVxtZW1iZXJ7Zmlyc3R9IG1lbWJlciwgc28gaXQgY291bGQgYmUgYW55IGtpbmQgb2Ygb2JqZWN0LiAgSXQgY291bGQKLWhhdmUgYSBkZXN0cnVjdG9yIHRoYXQgY2F1c2VzIGNvZGUgdG8gYmUgZXhlY3V0ZWQgdGhhdCB0cmllcyB0bwotYWNjZXNzIHRoZSBcbWVtYmVye2ZpcnN0fSBtZW1iZXIuICBUbyBiZSBwYXJhbm9pZCBhbmQgcHJvdGVjdAotb3Vyc2VsdmVzIGFnYWluc3QgdGhpcyBwb3NzaWJpbGl0eSwgd2UgYWxtb3N0IGFsd2F5cyByZWFzc2lnbiBtZW1iZXJzCi1iZWZvcmUgZGVjcmVtZW50aW5nIHRoZWlyIHJlZmVyZW5jZSBjb3VudHMuICBXaGVuIGRvbid0IHdlIGhhdmUgdG8gZG8KLXRoaXM/Ci1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtIHdoZW4gd2UgYWJzb2x1dGVseSBrbm93IHRoYXQgdGhlIHJlZmVyZW5jZSBjb3VudCBpcyBncmVhdGVyIHRoYW4KLSAgMQotXGl0ZW0gd2hlbiB3ZSBrbm93IHRoYXQgZGVhbGxvY2F0aW9uIG9mIHRoZSBvYmplY3RcZm9vdG5vdGV7VGhpcyBpcwotICB0cnVlIHdoZW4gd2Uga25vdyB0aGF0IHRoZSBvYmplY3QgaXMgYSBiYXNpYyB0eXBlLCBsaWtlIGEgc3RyaW5nIG9yCi0gIGEgZmxvYXQufSB3aWxsIG5vdCBjYXVzZSBhbnkKLSAgY2FsbHMgYmFjayBpbnRvIG91ciB0eXBlJ3MgY29kZQotXGl0ZW0gd2hlbiBkZWNyZW1lbnRpbmcgYSByZWZlcmVuY2UgY291bnQgaW4gYSBcbWVtYmVye3RwX2RlYWxsb2N9Ci0gIGhhbmRsZXIgd2hlbiBnYXJiYWdlLWNvbGxlY3Rpb25zIGlzIG5vdCBzdXBwb3J0ZWRcZm9vdG5vdGV7V2UgcmVsaWVkCi0gIG9uIHRoaXMgaW4gdGhlIFxtZW1iZXJ7dHBfZGVhbGxvY30gaGFuZGxlciBpbiB0aGlzIGV4YW1wbGUsIGJlY2F1c2UKLSAgb3VyIHR5cGUgZG9lc24ndCBzdXBwb3J0IGdhcmJhZ2UgY29sbGVjdGlvbi4gRXZlbiBpZiBhIHR5cGUgc3VwcG9ydHMKLSAgZ2FyYmFnZSBjb2xsZWN0aW9uLCB0aGVyZSBhcmUgY2FsbHMgdGhhdCBjYW4gYmUgbWFkZSB0byBgYHVudHJhY2snJwotICB0aGUgb2JqZWN0IGZyb20gZ2FyYmFnZSBjb2xsZWN0aW9uLCBob3dldmVyLCB0aGVzZSBjYWxscyBhcmUKLSAgYWR2YW5jZWQgYW5kIG5vdCBjb3ZlcmVkIGhlcmUufQotXGVuZHtpdGVtaXplfQotCi0KLVdlIHdhbnQgdG8gd2FudCB0byBleHBvc2Ugb3VyIGluc3RhbmNlIHZhcmlhYmxlcyBhcyBhdHRyaWJ1dGVzLiBUaGVyZQotYXJlIGEgbnVtYmVyIG9mIHdheXMgdG8gZG8gdGhhdC4gVGhlIHNpbXBsZXN0IHdheSBpcyB0byBkZWZpbmUgbWVtYmVyCi1kZWZpbml0aW9uczoKLQotXGJlZ2lue3ZlcmJhdGltfQotc3RhdGljIFB5TWVtYmVyRGVmIE5vZGR5X21lbWJlcnNbXSA9IHsKLSAgICB7ImZpcnN0IiwgVF9PQkpFQ1RfRVgsIG9mZnNldG9mKE5vZGR5LCBmaXJzdCksIDAsCi0gICAgICJmaXJzdCBuYW1lIn0sCi0gICAgeyJsYXN0IiwgVF9PQkpFQ1RfRVgsIG9mZnNldG9mKE5vZGR5LCBsYXN0KSwgMCwKLSAgICAgImxhc3QgbmFtZSJ9LAotICAgIHsibnVtYmVyIiwgVF9JTlQsIG9mZnNldG9mKE5vZGR5LCBudW1iZXIpLCAwLAotICAgICAibm9kZHkgbnVtYmVyIn0sCi0gICAge05VTEx9ICAvKiBTZW50aW5lbCAqLwotfTsKLVxlbmR7dmVyYmF0aW19Ci0KLWFuZCBwdXQgdGhlIGRlZmluaXRpb25zIGluIHRoZSBcbWVtYmVye3RwX21lbWJlcnN9IHNsb3Q6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICBOb2RkeV9tZW1iZXJzLCAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCi1cZW5ke3ZlcmJhdGltfQotCi1FYWNoIG1lbWJlciBkZWZpbml0aW9uIGhhcyBhIG1lbWJlciBuYW1lLCB0eXBlLCBvZmZzZXQsIGFjY2VzcyBmbGFncwotYW5kIGRvY3VtZW50YXRpb24gc3RyaW5nLiBTZWUgdGhlIGBgR2VuZXJpYyBBdHRyaWJ1dGUgTWFuYWdlbWVudCcnCi1zZWN0aW9uIGJlbG93IGZvciBkZXRhaWxzLgotCi1BIGRpc2FkdmFudGFnZSBvZiB0aGlzIGFwcHJvYWNoIGlzIHRoYXQgaXQgZG9lc24ndCBwcm92aWRlIGEgd2F5IHRvCi1yZXN0cmljdCB0aGUgdHlwZXMgb2Ygb2JqZWN0cyB0aGF0IGNhbiBiZSBhc3NpZ25lZCB0byB0aGUgUHl0aG9uCi1hdHRyaWJ1dGVzLiAgV2UgZXhwZWN0IHRoZSBmaXJzdCBhbmQgbGFzdCBuYW1lcyB0byBiZSBzdHJpbmdzLCBidXQgYW55Ci1QeXRob24gb2JqZWN0cyBjYW4gYmUgYXNzaWduZWQuICBGdXJ0aGVyLCB0aGUgYXR0cmlidXRlcyBjYW4gYmUKLWRlbGV0ZWQsIHNldHRpbmcgdGhlIEMgcG9pbnRlcnMgdG8gXE5VTEwuICBFdmVuIHRob3VnaCB3ZSBjYW4gbWFrZQotc3VyZSB0aGUgbWVtYmVycyBhcmUgaW5pdGlhbGl6ZWQgdG8gbm9uLVxOVUxMe30gdmFsdWVzLCB0aGUgbWVtYmVycyBjYW4KLWJlIHNldCB0byBcTlVMTHt9IGlmIHRoZSBhdHRyaWJ1dGVzIGFyZSBkZWxldGVkLgotCi1XZSBkZWZpbmUgYSBzaW5nbGUgbWV0aG9kLCBcbWV0aG9ke25hbWV9LCB0aGF0IG91dHB1dHMgdGhlIG9iamVjdHMKLW5hbWUgYXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIGZpcnN0IGFuZCBsYXN0IG5hbWVzLgotCi1cYmVnaW57dmVyYmF0aW19Ci1zdGF0aWMgUHlPYmplY3QgKgotTm9kZHlfbmFtZShOb2RkeSogc2VsZikKLXsKLSAgICBzdGF0aWMgUHlPYmplY3QgKmZvcm1hdCA9IE5VTEw7Ci0gICAgUHlPYmplY3QgKmFyZ3MsICpyZXN1bHQ7Ci0KLSAgICBpZiAoZm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgZm9ybWF0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiJXMgJXMiKTsKLSAgICAgICAgaWYgKGZvcm1hdCA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKHNlbGYtPmZpcnN0ID09IE5VTEwpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCAiZmlyc3QiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKHNlbGYtPmxhc3QgPT0gTlVMTCkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsICJsYXN0Iik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCJPTyIsIHNlbGYtPmZpcnN0LCBzZWxmLT5sYXN0KTsKLSAgICBpZiAoYXJncyA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zvcm1hdChmb3JtYXQsIGFyZ3MpOwotICAgIFB5X0RFQ1JFRihhcmdzKTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci1cZW5ke3ZlcmJhdGltfQotCi1UaGUgbWV0aG9kIGlzIGltcGxlbWVudGVkIGFzIGEgQyBmdW5jdGlvbiB0aGF0IHRha2VzIGEgXGNsYXNze05vZGR5fSAob3IKLVxjbGFzc3tOb2RkeX0gc3ViY2xhc3MpIGluc3RhbmNlIGFzIHRoZSBmaXJzdCBhcmd1bWVudC4gIE1ldGhvZHMKLWFsd2F5cyB0YWtlIGFuIGluc3RhbmNlIGFzIHRoZSBmaXJzdCBhcmd1bWVudC4gTWV0aG9kcyBvZnRlbiB0YWtlCi1wb3NpdGlvbmFsIGFuZCBrZXl3b3JkIGFyZ3VtZW50cyBhcyB3ZWxsLCBidXQgaW4gdGhpcyBjYXNlZCB3ZSBkb24ndAotdGFrZSBhbnkgYW5kIGRvbid0IG5lZWQgdG8gYWNjZXB0IGEgcG9zaXRpb25hbCBhcmd1bWVudCB0dXBsZSBvcgota2V5d29yZCBhcmd1bWVudCBkaWN0aW9uYXJ5LiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24KLW1ldGhvZDoKLQotXGJlZ2lue3ZlcmJhdGltfQotICAgIGRlZiBuYW1lKHNlbGYpOgotICAgICAgIHJldHVybiAiJXMgJXMiICUgKHNlbGYuZmlyc3QsIHNlbGYubGFzdCkKLVxlbmR7dmVyYmF0aW19Ci0KLU5vdGUgdGhhdCB3ZSBoYXZlIHRvIGNoZWNrIGZvciB0aGUgcG9zc2liaWxpdHkgdGhhdCBvdXIgXG1lbWJlcntmaXJzdH0KLWFuZCBcbWVtYmVye2xhc3R9IG1lbWJlcnMgYXJlIFxOVUxMLiAgVGhpcyBpcyBiZWNhdXNlIHRoZXkgY2FuIGJlCi1kZWxldGVkLCBpbiB3aGljaCBjYXNlIHRoZXkgYXJlIHNldCB0byBcTlVMTC4gIEl0IHdvdWxkIGJlIGJldHRlciB0bwotcHJldmVudCBkZWxldGlvbiBvZiB0aGVzZSBhdHRyaWJ1dGVzIGFuZCB0byByZXN0cmljdCB0aGUgYXR0cmlidXRlCi12YWx1ZXMgdG8gYmUgc3RyaW5ncy4gIFdlJ2xsIHNlZSBob3cgdG8gZG8gdGhhdCBpbiB0aGUgbmV4dCBzZWN0aW9uLgotCi1Ob3cgdGhhdCB3ZSd2ZSBkZWZpbmVkIHRoZSBtZXRob2QsIHdlIG5lZWQgdG8gY3JlYXRlIGFuIGFycmF5IG9mCi1tZXRob2QgZGVmaW5pdGlvbnM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXN0YXRpYyBQeU1ldGhvZERlZiBOb2RkeV9tZXRob2RzW10gPSB7Ci0gICAgeyJuYW1lIiwgKFB5Q0Z1bmN0aW9uKU5vZGR5X25hbWUsIE1FVEhfTk9BUkdTLAotICAgICAiUmV0dXJuIHRoZSBuYW1lLCBjb21iaW5pbmcgdGhlIGZpcnN0IGFuZCBsYXN0IG5hbWUiCi0gICAgfSwKLSAgICB7TlVMTH0gIC8qIFNlbnRpbmVsICovCi19OwotXGVuZHt2ZXJiYXRpbX0KLQotYW5kIGFzc2lnbiB0aGVtIHRvIHRoZSBcbWVtYmVye3RwX21ldGhvZHN9IHNsb3Q6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICBOb2RkeV9tZXRob2RzLCAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCi1cZW5ke3ZlcmJhdGltfQotCi1Ob3RlIHRoYXQgd2UgdXNlZCB0aGUgXGNvbnN0YW50e01FVEhfTk9BUkdTfSBmbGFnIHRvIGluZGljYXRlIHRoYXQgdGhlCi1tZXRob2QgaXMgcGFzc2VkIG5vIGFyZ3VtZW50cy4KLQotRmluYWxseSwgd2UnbGwgbWFrZSBvdXIgdHlwZSB1c2FibGUgYXMgYSBiYXNlIGNsYXNzLiAgV2UndmUgd3JpdHRlbgotb3VyIG1ldGhvZHMgY2FyZWZ1bGx5IHNvIGZhciBzbyB0aGF0IHRoZXkgZG9uJ3QgbWFrZSBhbnkgYXNzdW1wdGlvbnMKLWFib3V0IHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgYmVpbmcgY3JlYXRlZCBvciB1c2VkLCBzbyBhbGwgd2UgbmVlZCB0bwotZG8gaXMgdG8gYWRkIHRoZSBcY29uc3RhbnR7UHlfVFBGTEFHU19CQVNFVFlQRX0gdG8gb3VyIGNsYXNzIGZsYWcKLWRlZmluaXRpb246Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKnRwX2ZsYWdzKi8KLVxlbmR7dmVyYmF0aW19Ci0KLVdlIHJlbmFtZSBcY2Z1bmN0aW9ue2luaXRub2RkeSgpfSB0byBcY2Z1bmN0aW9ue2luaXRub2RkeTIoKX0KLWFuZCB1cGRhdGUgdGhlIG1vZHVsZSBuYW1lIHBhc3NlZCB0byBcY2Z1bmN0aW9ue1B5X0luaXRNb2R1bGUzKCl9LgotCi1GaW5hbGx5LCB3ZSB1cGRhdGUgb3VyIFxmaWxle3NldHVwLnB5fSBmaWxlIHRvIGJ1aWxkIHRoZSBuZXcgbW9kdWxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1mcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBzZXR1cCwgRXh0ZW5zaW9uCi1zZXR1cChuYW1lPSJub2RkeSIsIHZlcnNpb249IjEuMCIsCi0gICAgICBleHRfbW9kdWxlcz1bCi0gICAgICAgICBFeHRlbnNpb24oIm5vZGR5IiwgWyJub2RkeS5jIl0pLAotICAgICAgICAgRXh0ZW5zaW9uKCJub2RkeTIiLCBbIm5vZGR5Mi5jIl0pLAotICAgICAgICAgXSkKLVxlbmR7dmVyYmF0aW19Ci0KLVxzdWJzZWN0aW9ue1Byb3ZpZGluZyBmaW5lciBjb250cm9sIG92ZXIgZGF0YSBhdHRyaWJ1dGVzfQotCi1JbiB0aGlzIHNlY3Rpb24sIHdlJ2xsIHByb3ZpZGUgZmluZXIgY29udHJvbCBvdmVyIGhvdyB0aGUKLVxtZW1iZXJ7Zmlyc3R9IGFuZCBcbWVtYmVye2xhc3R9IGF0dHJpYnV0ZXMgYXJlIHNldCBpbiB0aGUKLVxjbGFzc3tOb2RkeX0gZXhhbXBsZS4gSW4gdGhlIHByZXZpb3VzIHZlcnNpb24gb2Ygb3VyIG1vZHVsZSwgdGhlCi1pbnN0YW5jZSB2YXJpYWJsZXMgXG1lbWJlcntmaXJzdH0gYW5kIFxtZW1iZXJ7bGFzdH0gY291bGQgYmUgc2V0IHRvCi1ub24tc3RyaW5nIHZhbHVlcyBvciBldmVuIGRlbGV0ZWQuIFdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlc2UKLWF0dHJpYnV0ZXMgYWx3YXlzIGNvbnRhaW4gc3RyaW5ncy4KLQotXHZlcmJhdGltaW5wdXR7bm9kZHkzLmN9Ci0KLVRvIHByb3ZpZGUgZ3JlYXRlciBjb250cm9sLCBvdmVyIHRoZSBcbWVtYmVye2ZpcnN0fSBhbmQgXG1lbWJlcntsYXN0fQotYXR0cmlidXRlcywgd2UnbGwgdXNlIGN1c3RvbSBnZXR0ZXIgYW5kIHNldHRlciBmdW5jdGlvbnMuICBIZXJlIGFyZQotdGhlIGZ1bmN0aW9ucyBmb3IgZ2V0dGluZyBhbmQgc2V0dGluZyB0aGUgXG1lbWJlcntmaXJzdH0gYXR0cmlidXRlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1Ob2RkeV9nZXRmaXJzdChOb2RkeSAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKLXsKLSAgICBQeV9JTkNSRUYoc2VsZi0+Zmlyc3QpOwotICAgIHJldHVybiBzZWxmLT5maXJzdDsKLX0KLQotc3RhdGljIGludAotTm9kZHlfc2V0Zmlyc3QoTm9kZHkgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSwgdm9pZCAqY2xvc3VyZSkKLXsKLSAgaWYgKHZhbHVlID09IE5VTEwpIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQ2Fubm90IGRlbGV0ZSB0aGUgZmlyc3QgYXR0cmlidXRlIik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgaWYgKCEgUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgIlRoZSBmaXJzdCBhdHRyaWJ1dGUgdmFsdWUgbXVzdCBiZSBhIHN0cmluZyIpOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIFB5X0RFQ1JFRihzZWxmLT5maXJzdCk7Ci0gIFB5X0lOQ1JFRih2YWx1ZSk7Ci0gIHNlbGYtPmZpcnN0ID0gdmFsdWU7Ci0KLSAgcmV0dXJuIDA7Ci19Ci1cZW5ke3ZlcmJhdGltfQotCi1UaGUgZ2V0dGVyIGZ1bmN0aW9uIGlzIHBhc3NlZCBhIFxjbGFzc3tOb2RkeX0gb2JqZWN0IGFuZCBhCi1gYGNsb3N1cmUnJywgd2hpY2ggaXMgdm9pZCBwb2ludGVyLiBJbiB0aGlzIGNhc2UsIHRoZSBjbG9zdXJlIGlzCi1pZ25vcmVkLiAoVGhlIGNsb3N1cmUgc3VwcG9ydHMgYW4gYWR2YW5jZWQgdXNhZ2UgaW4gd2hpY2ggZGVmaW5pdGlvbgotZGF0YSBpcyBwYXNzZWQgdG8gdGhlIGdldHRlciBhbmQgc2V0dGVyLiBUaGlzIGNvdWxkLCBmb3IgZXhhbXBsZSwgYmUKLXVzZWQgdG8gYWxsb3cgYSBzaW5nbGUgc2V0IG9mIGdldHRlciBhbmQgc2V0dGVyIGZ1bmN0aW9ucyB0aGF0IGRlY2lkZQotdGhlIGF0dHJpYnV0ZSB0byBnZXQgb3Igc2V0IGJhc2VkIG9uIGRhdGEgaW4gdGhlIGNsb3N1cmUuKQotCi1UaGUgc2V0dGVyIGZ1bmN0aW9uIGlzIHBhc3NlZCB0aGUgXGNsYXNze05vZGR5fSBvYmplY3QsIHRoZSBuZXcgdmFsdWUsCi1hbmQgdGhlIGNsb3N1cmUuIFRoZSBuZXcgdmFsdWUgbWF5IGJlIFxOVUxMLCBpbiB3aGljaCBjYXNlIHRoZQotYXR0cmlidXRlIGlzIGJlaW5nIGRlbGV0ZWQuICBJbiBvdXIgc2V0dGVyLCB3ZSByYWlzZSBhbiBlcnJvciBpZiB0aGUKLWF0dHJpYnV0ZSBpcyBkZWxldGVkIG9yIGlmIHRoZSBhdHRyaWJ1dGUgdmFsdWUgaXMgbm90IGEgc3RyaW5nLgotCi1XZSBjcmVhdGUgYW4gYXJyYXkgb2YgXGN0eXBle1B5R2V0U2V0RGVmfSBzdHJ1Y3R1cmVzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1zdGF0aWMgUHlHZXRTZXREZWYgTm9kZHlfZ2V0c2V0ZXJzW10gPSB7Ci0gICAgeyJmaXJzdCIsCi0gICAgIChnZXR0ZXIpTm9kZHlfZ2V0Zmlyc3QsIChzZXR0ZXIpTm9kZHlfc2V0Zmlyc3QsCi0gICAgICJmaXJzdCBuYW1lIiwKLSAgICAgTlVMTH0sCi0gICAgeyJsYXN0IiwKLSAgICAgKGdldHRlcilOb2RkeV9nZXRsYXN0LCAoc2V0dGVyKU5vZGR5X3NldGxhc3QsCi0gICAgICJsYXN0IG5hbWUiLAotICAgICBOVUxMfSwKLSAgICB7TlVMTH0gIC8qIFNlbnRpbmVsICovCi19OwotXGVuZHt2ZXJiYXRpbX0KLQotYW5kIHJlZ2lzdGVyIGl0IGluIHRoZSBcbWVtYmVye3RwX2dldHNldH0gc2xvdDoKLQotXGJlZ2lue3ZlcmJhdGltfQotICAgIE5vZGR5X2dldHNldGVycywgICAgICAgICAgIC8qIHRwX2dldHNldCAqLwotXGVuZHt2ZXJiYXRpbX0KLQotdG8gcmVnaXN0ZXIgb3V0IGF0dHJpYnV0ZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzLgotCi1UaGUgbGFzdCBpdGVtIGluIGEgXGN0eXBle1B5R2V0U2V0RGVmfSBzdHJ1Y3R1cmUgaXMgdGhlIGNsb3N1cmUKLW1lbnRpb25lZCBhYm92ZS4gSW4gdGhpcyBjYXNlLCB3ZSBhcmVuJ3QgdXNpbmcgdGhlIGNsb3N1cmUsIHNvIHdlIGp1c3QKLXBhc3MgXE5VTEwuCi0KLVdlIGFsc28gcmVtb3ZlIHRoZSBtZW1iZXIgZGVmaW5pdGlvbnMgZm9yIHRoZXNlIGF0dHJpYnV0ZXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXN0YXRpYyBQeU1lbWJlckRlZiBOb2RkeV9tZW1iZXJzW10gPSB7Ci0gICAgeyJudW1iZXIiLCBUX0lOVCwgb2Zmc2V0b2YoTm9kZHksIG51bWJlciksIDAsCi0gICAgICJub2RkeSBudW1iZXIifSwKLSAgICB7TlVMTH0gIC8qIFNlbnRpbmVsICovCi19OwotXGVuZHt2ZXJiYXRpbX0KLQotV2UgYWxzbyBuZWVkIHRvIHVwZGF0ZSB0aGUgXG1lbWJlcnt0cF9pbml0fSBoYW5kbGVyIHRvIG9ubHkgYWxsb3cKLXN0cmluZ3NcZm9vdG5vdGV7V2Ugbm93IGtub3cgdGhhdCB0aGUgZmlyc3QgYW5kIGxhc3QgbWVtYmVycyBhcmUgc3RyaW5ncywKLXNvIHBlcmhhcHMgd2UgY291bGQgYmUgbGVzcyBjYXJlZnVsIGFib3V0IGRlY3JlbWVudGluZyB0aGVpcgotcmVmZXJlbmNlIGNvdW50cywgaG93ZXZlciwgd2UgYWNjZXB0IGluc3RhbmNlcyBvZiBzdHJpbmcgc3ViY2xhc3Nlcy4KLUV2ZW4gdGhvdWdoIGRlYWxsb2NhdGluZyBub3JtYWwgc3RyaW5ncyB3b24ndCBjYWxsIGJhY2sgaW50byBvdXIKLW9iamVjdHMsIHdlIGNhbid0IGd1YXJhbnRlZSB0aGF0IGRlYWxsb2NhdGluZyBhbiBpbnN0YW5jZSBvZiBhIHN0cmluZwotc3ViY2xhc3Mgd29uJ3QuIGNhbGwgYmFjayBpbnRvIG91dCBvYmplY3RzLn0gdG8gYmUgcGFzc2VkOgotCi1cYmVnaW57dmVyYmF0aW19Ci1zdGF0aWMgaW50Ci1Ob2RkeV9pbml0KE5vZGR5ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCi17Ci0gICAgUHlPYmplY3QgKmZpcnN0PU5VTEwsICpsYXN0PU5VTEwsICp0bXA7Ci0KLSAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImZpcnN0IiwgImxhc3QiLCAibnVtYmVyIiwgTlVMTH07Ci0KLSAgICBpZiAoISBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInxTU2kiLCBrd2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaXJzdCwgJmxhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5udW1iZXIpKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgdG1wID0gc2VsZi0+Zmlyc3Q7Ci0gICAgICAgIFB5X0lOQ1JFRihmaXJzdCk7Ci0gICAgICAgIHNlbGYtPmZpcnN0ID0gZmlyc3Q7Ci0gICAgICAgIFB5X0RFQ1JFRih0bXApOwotICAgIH0KLQotICAgIGlmIChsYXN0KSB7Ci0gICAgICAgIHRtcCA9IHNlbGYtPmxhc3Q7Ci0gICAgICAgIFB5X0lOQ1JFRihsYXN0KTsKLSAgICAgICAgc2VsZi0+bGFzdCA9IGxhc3Q7Ci0gICAgICAgIFB5X0RFQ1JFRih0bXApOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotXGVuZHt2ZXJiYXRpbX0KLQotV2l0aCB0aGVzZSBjaGFuZ2VzLCB3ZSBjYW4gYXNzdXJlIHRoYXQgdGhlIFxtZW1iZXJ7Zmlyc3R9IGFuZAotXG1lbWJlcntsYXN0fSBtZW1iZXJzIGFyZSBuZXZlciBcTlVMTHt9IHNvIHdlIGNhbiByZW1vdmUgY2hlY2tzIGZvciBcTlVMTHt9Ci12YWx1ZXMgaW4gYWxtb3N0IGFsbCBjYXNlcy4gVGhpcyBtZWFucyB0aGF0IG1vc3Qgb2YgdGhlCi1cY2Z1bmN0aW9ue1B5X1hERUNSRUYoKX0gY2FsbHMgY2FuIGJlIGNvbnZlcnRlZCB0byBcY2Z1bmN0aW9ue1B5X0RFQ1JFRigpfQotY2FsbHMuIFRoZSBvbmx5IHBsYWNlIHdlIGNhbid0IGNoYW5nZSB0aGVzZSBjYWxscyBpcyBpbiB0aGUKLWRlYWxsb2NhdG9yLCB3aGVyZSB0aGVyZSBpcyB0aGUgcG9zc2liaWxpdHkgdGhhdCB0aGUgaW5pdGlhbGl6YXRpb24gb2YKLXRoZXNlIG1lbWJlcnMgZmFpbGVkIGluIHRoZSBjb25zdHJ1Y3Rvci4KLQotV2UgYWxzbyByZW5hbWUgdGhlIG1vZHVsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBhbmQgbW9kdWxlIG5hbWUgaW4KLXRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiwgYXMgd2UgZGlkIGJlZm9yZSwgYW5kIHdlIGFkZCBhbiBleHRyYQotZGVmaW5pdGlvbiB0byB0aGUgXGZpbGV7c2V0dXAucHl9IGZpbGUuCi0KLVxzdWJzZWN0aW9ue1N1cHBvcnRpbmcgY3ljbGljIGdhcmJhZ2UgY29sbGVjdGlvbn0KLQotUHl0aG9uIGhhcyBhIGN5Y2xpYy1nYXJiYWdlIGNvbGxlY3RvciB0aGF0IGNhbiBpZGVudGlmeSB1bm5lZWRlZAotb2JqZWN0cyBldmVuIHdoZW4gdGhlaXIgcmVmZXJlbmNlIGNvdW50cyBhcmUgbm90IHplcm8uIFRoaXMgY2FuIGhhcHBlbgotd2hlbiBvYmplY3RzIGFyZSBpbnZvbHZlZCBpbiBjeWNsZXMuICBGb3IgZXhhbXBsZSwgY29uc2lkZXI6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBsID0gW10KLT4+PiBsLmFwcGVuZChsKQotPj4+IGRlbCBsCi1cZW5ke3ZlcmJhdGltfQotCi1JbiB0aGlzIGV4YW1wbGUsIHdlIGNyZWF0ZSBhIGxpc3QgdGhhdCBjb250YWlucyBpdHNlbGYuIFdoZW4gd2UgZGVsZXRlCi1pdCwgaXQgc3RpbGwgaGFzIGEgcmVmZXJlbmNlIGZyb20gaXRzZWxmLiBJdHMgcmVmZXJlbmNlIGNvdW50IGRvZXNuJ3QKLWRyb3AgdG8gemVyby4gIEZvcnR1bmF0ZWx5LCBQeXRob24ncyBjeWNsaWMtZ2FyYmFnZSBjb2xsZWN0b3Igd2lsbAotZXZlbnR1YWxseSBmaWd1cmUgb3V0IHRoYXQgdGhlIGxpc3QgaXMgZ2FyYmFnZSBhbmQgZnJlZSBpdC4KLQotSW4gdGhlIHNlY29uZCB2ZXJzaW9uIG9mIHRoZSBcY2xhc3N7Tm9kZHl9IGV4YW1wbGUsIHdlIGFsbG93ZWQgYW55Ci1raW5kIG9mIG9iamVjdCB0byBiZSBzdG9yZWQgaW4gdGhlIFxtZW1iZXJ7Zmlyc3R9IG9yIFxtZW1iZXJ7bGFzdH0KLWF0dHJpYnV0ZXMuXGZvb3Rub3Rle0V2ZW4gaW4gdGhlIHRoaXJkIHZlcnNpb24sIHdlIGFyZW4ndCBndWFyYW50ZWVkIHRvCi1hdm9pZCBjeWNsZXMuICBJbnN0YW5jZXMgb2Ygc3RyaW5nIHN1YmNsYXNzZXMgYXJlIGFsbG93ZWQgYW5kIHN0cmluZwotc3ViY2xhc3NlcyBjb3VsZCBhbGxvdyBjeWNsZXMgZXZlbiBpZiBub3JtYWwgc3RyaW5ncyBkb24ndC59IFRoaXMKLW1lYW5zIHRoYXQgXGNsYXNze05vZGR5fSBvYmplY3RzIGNhbiBwYXJ0aWNpcGF0ZSBpbiBjeWNsZXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgbm9kZHkyCi0+Pj4gbiA9IG5vZGR5Mi5Ob2RkeSgpCi0+Pj4gbCA9IFtuXQotPj4+IG4uZmlyc3QgPSBsCi1cZW5ke3ZlcmJhdGltfQotCi1UaGlzIGlzIHByZXR0eSBzaWxseSwgYnV0IGl0IGdpdmVzIHVzIGFuIGV4Y3VzZSB0byBhZGQgc3VwcG9ydCBmb3IgdGhlCi1jeWNsaWMtZ2FyYmFnZSBjb2xsZWN0b3IgdG8gdGhlIFxjbGFzc3tOb2RkeX0gZXhhbXBsZS4gIFRvIHN1cHBvcnQKLWN5Y2xpYyBnYXJiYWdlIGNvbGxlY3Rpb24sIHR5cGVzIG5lZWQgdG8gZmlsbCB0d28gc2xvdHMgYW5kIHNldCBhCi1jbGFzcyBmbGFnIHRoYXQgZW5hYmxlcyB0aGVzZSBzbG90czoKLQotXHZlcmJhdGltaW5wdXR7bm9kZHk0LmN9Ci0KLVRoZSB0cmF2ZXJzYWwgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byBzdWJvYmplY3RzIHRoYXQKLWNvdWxkIHBhcnRpY2lwYXRlIGluIGN5Y2xlczoKLQotXGJlZ2lue3ZlcmJhdGltfQotc3RhdGljIGludAotTm9kZHlfdHJhdmVyc2UoTm9kZHkgKnNlbGYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQotewotICAgIGludCB2cmV0OwotCi0gICAgaWYgKHNlbGYtPmZpcnN0KSB7Ci0gICAgICAgIHZyZXQgPSB2aXNpdChzZWxmLT5maXJzdCwgYXJnKTsKLSAgICAgICAgaWYgKHZyZXQgIT0gMCkKLSAgICAgICAgICAgIHJldHVybiB2cmV0OwotICAgIH0KLSAgICBpZiAoc2VsZi0+bGFzdCkgewotICAgICAgICB2cmV0ID0gdmlzaXQoc2VsZi0+bGFzdCwgYXJnKTsKLSAgICAgICAgaWYgKHZyZXQgIT0gMCkKLSAgICAgICAgICAgIHJldHVybiB2cmV0OwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotXGVuZHt2ZXJiYXRpbX0KLQotRm9yIGVhY2ggc3Vib2JqZWN0IHRoYXQgY2FuIHBhcnRpY2lwYXRlIGluIGN5Y2xlcywgd2UgbmVlZCB0byBjYWxsIHRoZQotXGNmdW5jdGlvbnt2aXNpdCgpfSBmdW5jdGlvbiwgd2hpY2ggaXMgcGFzc2VkIHRvIHRoZSB0cmF2ZXJzYWwgbWV0aG9kLgotVGhlIFxjZnVuY3Rpb257dmlzaXQoKX0gZnVuY3Rpb24gdGFrZXMgYXMgYXJndW1lbnRzIHRoZSBzdWJvYmplY3QgYW5kCi10aGUgZXh0cmEgYXJndW1lbnQgXHZhcnthcmd9IHBhc3NlZCB0byB0aGUgdHJhdmVyc2FsIG1ldGhvZC4gIEl0Ci1yZXR1cm5zIGFuIGludGVnZXIgdmFsdWUgdGhhdCBtdXN0IGJlIHJldHVybmVkIGlmIGl0IGlzIG5vbi16ZXJvLgotCi0KLVB5dGhvbiAyLjQgYW5kIGhpZ2hlciBwcm92aWRlIGEgXGNmdW5jdGlvbntQeV9WSVNJVCgpfSBtYWNybyB0aGF0IGF1dG9tYXRlcwotY2FsbGluZyB2aXNpdCBmdW5jdGlvbnMuICBXaXRoIFxjZnVuY3Rpb257UHlfVklTSVQoKX0sCi1cY2Z1bmN0aW9ue05vZGR5X3RyYXZlcnNlKCl9IGNhbiBiZSBzaW1wbGlmaWVkOgotCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLXN0YXRpYyBpbnQKLU5vZGR5X3RyYXZlcnNlKE5vZGR5ICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKLXsKLSAgICBQeV9WSVNJVChzZWxmLT5maXJzdCk7Ci0gICAgUHlfVklTSVQoc2VsZi0+bGFzdCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci1cZW5ke3ZlcmJhdGltfQotCi1cbm90ZXtOb3RlIHRoYXQgdGhlIFxtZW1iZXJ7dHBfdHJhdmVyc2V9IGltcGxlbWVudGF0aW9uIG11c3QgbmFtZSBpdHMKLSAgICBhcmd1bWVudHMgZXhhY3RseSBcdmFye3Zpc2l0fSBhbmQgXHZhcnthcmd9IGluIG9yZGVyIHRvIHVzZQotICAgIFxjZnVuY3Rpb257UHlfVklTSVQoKX0uICBUaGlzIGlzIHRvIGVuY291cmFnZSB1bmlmb3JtaXR5Ci0gICAgYWNyb3NzIHRoZXNlIGJvcmluZyBpbXBsZW1lbnRhdGlvbnMufQotCi1XZSBhbHNvIG5lZWQgdG8gcHJvdmlkZSBhIG1ldGhvZCBmb3IgY2xlYXJpbmcgYW55IHN1Ym9iamVjdHMgdGhhdCBjYW4KLXBhcnRpY2lwYXRlIGluIGN5Y2xlcy4gIFdlIGltcGxlbWVudCB0aGUgbWV0aG9kIGFuZCByZWltcGxlbWVudCB0aGUKLWRlYWxsb2NhdG9yIHRvIHVzZSBpdDoKLQotXGJlZ2lue3ZlcmJhdGltfQotc3RhdGljIGludAotTm9kZHlfY2xlYXIoTm9kZHkgKnNlbGYpCi17Ci0gICAgUHlPYmplY3QgKnRtcDsKLQotICAgIHRtcCA9IHNlbGYtPmZpcnN0OwotICAgIHNlbGYtPmZpcnN0ID0gTlVMTDsKLSAgICBQeV9YREVDUkVGKHRtcCk7Ci0KLSAgICB0bXAgPSBzZWxmLT5sYXN0OwotICAgIHNlbGYtPmxhc3QgPSBOVUxMOwotICAgIFB5X1hERUNSRUYodG1wKTsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotTm9kZHlfZGVhbGxvYyhOb2RkeSogc2VsZikKLXsKLSAgICBOb2RkeV9jbGVhcihzZWxmKTsKLSAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Ci19Ci1cZW5ke3ZlcmJhdGltfQotCi1Ob3RpY2UgdGhlIHVzZSBvZiBhIHRlbXBvcmFyeSB2YXJpYWJsZSBpbiBcY2Z1bmN0aW9ue05vZGR5X2NsZWFyKCl9LgotV2UgdXNlIHRoZSB0ZW1wb3JhcnkgdmFyaWFibGUgc28gdGhhdCB3ZSBjYW4gc2V0IGVhY2ggbWVtYmVyIHRvIFxOVUxMe30KLWJlZm9yZSBkZWNyZW1lbnRpbmcgaXRzIHJlZmVyZW5jZSBjb3VudC4gIFdlIGRvIHRoaXMgYmVjYXVzZSwgYXMgd2FzCi1kaXNjdXNzZWQgZWFybGllciwgaWYgdGhlIHJlZmVyZW5jZSBjb3VudCBkcm9wcyB0byB6ZXJvLCB3ZSBtaWdodAotY2F1c2UgY29kZSB0byBydW4gdGhhdCBjYWxscyBiYWNrIGludG8gdGhlIG9iamVjdC4gIEluIGFkZGl0aW9uLAotYmVjYXVzZSB3ZSBub3cgc3VwcG9ydCBnYXJiYWdlIGNvbGxlY3Rpb24sIHdlIGFsc28gaGF2ZSB0byB3b3JyeSBhYm91dAotY29kZSBiZWluZyBydW4gdGhhdCB0cmlnZ2VycyBnYXJiYWdlIGNvbGxlY3Rpb24uICBJZiBnYXJiYWdlCi1jb2xsZWN0aW9uIGlzIHJ1biwgb3VyIFxtZW1iZXJ7dHBfdHJhdmVyc2V9IGhhbmRsZXIgY291bGQgZ2V0IGNhbGxlZC4KLVdlIGNhbid0IHRha2UgYSBjaGFuY2Ugb2YgaGF2aW5nIFxjZnVuY3Rpb257Tm9kZHlfdHJhdmVyc2UoKX0gY2FsbGVkCi13aGVuIGEgbWVtYmVyJ3MgcmVmZXJlbmNlIGNvdW50IGhhcyBkcm9wcGVkIHRvIHplcm8gYW5kIGl0cyB2YWx1ZQotaGFzbid0IGJlZW4gc2V0IHRvIFxOVUxMLgotCi1QeXRob24gMi40IGFuZCBoaWdoZXIgcHJvdmlkZSBhIFxjZnVuY3Rpb257UHlfQ0xFQVIoKX0gdGhhdCBhdXRvbWF0ZXMKLXRoZSBjYXJlZnVsIGRlY3JlbWVudGluZyBvZiByZWZlcmVuY2UgY291bnRzLiAgV2l0aAotXGNmdW5jdGlvbntQeV9DTEVBUigpfSwgdGhlIFxjZnVuY3Rpb257Tm9kZHlfY2xlYXIoKX0gZnVuY3Rpb24gY2FuIGJlCi1zaW1wbGlmaWVkOgotCi1cYmVnaW57dmVyYmF0aW19Ci1zdGF0aWMgaW50Ci1Ob2RkeV9jbGVhcihOb2RkeSAqc2VsZikKLXsKLSAgICBQeV9DTEVBUihzZWxmLT5maXJzdCk7Ci0gICAgUHlfQ0xFQVIoc2VsZi0+bGFzdCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci1cZW5ke3ZlcmJhdGltfQotCi1GaW5hbGx5LCB3ZSBhZGQgdGhlIFxjb25zdGFudHtQeV9UUEZMQUdTX0hBVkVfR0N9IGZsYWcgdG8gdGhlIGNsYXNzCi1mbGFnczoKLQotXGJlZ2lue3ZlcmJhdGltfQotICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfR0MsIC8qdHBfZmxhZ3MqLwotXGVuZHt2ZXJiYXRpbX0KLQotVGhhdCdzIHByZXR0eSBtdWNoIGl0LiAgSWYgd2UgaGFkIHdyaXR0ZW4gY3VzdG9tIFxtZW1iZXJ7dHBfYWxsb2N9IG9yCi1cbWVtYmVye3RwX2ZyZWV9IHNsb3RzLCB3ZSdkIG5lZWQgdG8gbW9kaWZ5IHRoZW0gZm9yIGN5Y2xpYy1nYXJiYWdlCi1jb2xsZWN0aW9uLiBNb3N0IGV4dGVuc2lvbnMgd2lsbCB1c2UgdGhlIHZlcnNpb25zIGF1dG9tYXRpY2FsbHkKLXByb3ZpZGVkLgotCi1cc3Vic2VjdGlvbntTdWJjbGFzc2luZyBvdGhlciB0eXBlc30KLQotSXQgaXMgcG9zc2libGUgdG8gY3JlYXRlIG5ldyBleHRlbnNpb24gdHlwZXMgdGhhdCBhcmUgZGVyaXZlZCBmcm9tIGV4aXN0aW5nCi10eXBlcy4gSXQgaXMgZWFzaWVzdCB0byBpbmhlcml0IGZyb20gdGhlIGJ1aWx0IGluIHR5cGVzLCBzaW5jZSBhbiBleHRlbnNpb24KLWNhbiBlYXNpbHkgdXNlIHRoZSBcY2xhc3N7UHlUeXBlT2JqZWN0fSBpdCBuZWVkcy4gSXQgY2FuIGJlIGRpZmZpY3VsdCB0bwotc2hhcmUgdGhlc2UgXGNsYXNze1B5VHlwZU9iamVjdH0gc3RydWN0dXJlcyBiZXR3ZWVuIGV4dGVuc2lvbiBtb2R1bGVzLgotCi1JbiB0aGlzIGV4YW1wbGUgd2Ugd2lsbCBjcmVhdGUgYSBcY2xhc3N7U2hvZGR5fSB0eXBlIHRoYXQgaW5oZXJpdHMgZnJvbQotdGhlIGJ1aWx0aW4gXGNsYXNze2xpc3R9IHR5cGUuIFRoZSBuZXcgdHlwZSB3aWxsIGJlIGNvbXBsZXRlbHkgY29tcGF0aWJsZQotd2l0aCByZWd1bGFyIGxpc3RzLCBidXQgd2lsbCBoYXZlIGFuIGFkZGl0aW9uYWwgXG1ldGhvZHtpbmNyZW1lbnQoKX0gbWV0aG9kCi10aGF0IGluY3JlYXNlcyBhbiBpbnRlcm5hbCBjb3VudGVyLgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gaW1wb3J0IHNob2RkeQotPj4+IHMgPSBzaG9kZHkuU2hvZGR5KHJhbmdlKDMpKQotPj4+IHMuZXh0ZW5kKHMpCi0+Pj4gcHJpbnQgbGVuKHMpCi02Ci0+Pj4gcHJpbnQgcy5pbmNyZW1lbnQoKQotMQotPj4+IHByaW50IHMuaW5jcmVtZW50KCkKLTIKLVxlbmR7dmVyYmF0aW19Ci0KLVx2ZXJiYXRpbWlucHV0e3Nob2RkeS5jfQotCi1BcyB5b3UgY2FuIHNlZSwgdGhlIHNvdXJjZSBjb2RlIGNsb3NlbHkgcmVzZW1ibGVzIHRoZSBcY2xhc3N7Tm9kZHl9IGV4YW1wbGVzIGluIHByZXZpb3VzCi1zZWN0aW9ucy4gV2Ugd2lsbCBicmVhayBkb3duIHRoZSBtYWluIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlbS4KLQotXGJlZ2lue3ZlcmJhdGltfQotdHlwZWRlZiBzdHJ1Y3QgewotCVB5TGlzdE9iamVjdCBsaXN0OwotCWludCBzdGF0ZTsKLX0gU2hvZGR5OwotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIHByaW1hcnkgZGlmZmVyZW5jZSBmb3IgZGVyaXZlZCB0eXBlIG9iamVjdHMgaXMgdGhhdCB0aGUgYmFzZSB0eXBlJ3MKLW9iamVjdCBzdHJ1Y3R1cmUgbXVzdCBiZSB0aGUgZmlyc3QgdmFsdWUuIFRoZSBiYXNlIHR5cGUgd2lsbCBhbHJlYWR5Ci1pbmNsdWRlIHRoZSBcY2Z1bmN0aW9ue1B5T2JqZWN0X0hFQUR9IGF0IHRoZSBiZWdpbm5pbmcgb2YgaXRzIHN0cnVjdHVyZS4KLQotV2hlbiBhIFB5dGhvbiBvYmplY3QgaXMgYSBcY2xhc3N7U2hvZGR5fSBpbnN0YW5jZSwgaXRzIFx2YXJ7UHlPYmplY3QqfSBwb2ludGVyCi1jYW4gYmUgc2FmZWx5IGNhc3QgdG8gYm90aCBcdmFye1B5TGlzdE9iamVjdCp9IGFuZCBcdmFye1Nob2RkeSp9LgotCi1cYmVnaW57dmVyYmF0aW19Ci1zdGF0aWMgaW50Ci1TaG9kZHlfaW5pdChTaG9kZHkgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKLXsKLQlpZiAoUHlMaXN0X1R5cGUudHBfaW5pdCgoUHlPYmplY3QgKilzZWxmLCBhcmdzLCBrd2RzKSA8IDApCi0JCXJldHVybiAtMTsKLQlzZWxmLT5zdGF0ZSA9IDA7Ci0JcmV0dXJuIDA7Ci19Ci1cZW5ke3ZlcmJhdGltfQotCi1JbiB0aGUgXG1lbWJlcntfX2luaXRfX30gbWV0aG9kIGZvciBvdXIgdHlwZSwgd2UgY2FuIHNlZSBob3cgdG8gY2FsbCB0aHJvdWdoCi10byB0aGUgXG1lbWJlcntfX2luaXRfX30gbWV0aG9kIG9mIHRoZSBiYXNlIHR5cGUuCi0KLVRoaXMgcGF0dGVybiBpcyBpbXBvcnRhbnQgd2hlbiB3cml0aW5nIGEgdHlwZSB3aXRoIGN1c3RvbSBcbWVtYmVye25ld30gYW5kCi1cbWVtYmVye2RlYWxsb2N9IG1ldGhvZHMuIFRoZSBcbWVtYmVye25ld30gbWV0aG9kIHNob3VsZCBub3QgYWN0dWFsbHkgY3JlYXRlIHRoZQotbWVtb3J5IGZvciB0aGUgb2JqZWN0IHdpdGggXG1lbWJlcnt0cF9hbGxvY30sIHRoYXQgd2lsbCBiZSBoYW5kbGVkIGJ5Ci10aGUgYmFzZSBjbGFzcyB3aGVuIGNhbGxpbmcgaXRzIFxtZW1iZXJ7dHBfbmV3fS4KLQotV2hlbiBmaWxsaW5nIG91dCB0aGUgXGNmdW5jdGlvbntQeVR5cGVPYmplY3R9IGZvciB0aGUgXGNsYXNze1Nob2RkeX0gdHlwZSwKLXlvdSBzZWUgYSBzbG90IGZvciBcY2Z1bmN0aW9ue3RwX2Jhc2V9LiBEdWUgdG8gY3Jvc3MgcGxhdGZvcm0gY29tcGlsZXIKLWlzc3VlcywgeW91IGNhbid0IGZpbGwgdGhhdCBmaWVsZCBkaXJlY3RseSB3aXRoIHRoZSBcY2Z1bmN0aW9ue1B5TGlzdF9UeXBlfTsKLWl0IGNhbiBiZSBkb25lIGxhdGVyIGluIHRoZSBtb2R1bGUncyBcY2Z1bmN0aW9ue2luaXR9IGZ1bmN0aW9uLgotCi1cYmVnaW57dmVyYmF0aW19Ci1QeU1PRElOSVRfRlVOQwotaW5pdHNob2RkeSh2b2lkKQotewotCVB5T2JqZWN0ICptOwotCi0JU2hvZGR5VHlwZS50cF9iYXNlID0gJlB5TGlzdF9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJlNob2RkeVR5cGUpIDwgMCkKLQkJcmV0dXJuOwotCi0JbSA9IFB5X0luaXRNb2R1bGUzKCJzaG9kZHkiLCBOVUxMLCAiU2hvZGR5IG1vZHVsZSIpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKLQotCVB5X0lOQ1JFRigmU2hvZGR5VHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTaG9kZHkiLCAoUHlPYmplY3QgKikgJlNob2RkeVR5cGUpOwotfQotXGVuZHt2ZXJiYXRpbX0KLQotQmVmb3JlIGNhbGxpbmcgXGNmdW5jdGlvbntQeVR5cGVfUmVhZHl9LCB0aGUgdHlwZSBzdHJ1Y3R1cmUgbXVzdCBoYXZlIHRoZQotXG1lbWJlcnt0cF9iYXNlfSBzbG90IGZpbGxlZCBpbi4gV2hlbiB3ZSBhcmUgZGVyaXZpbmcgYSBuZXcgdHlwZSwgaXQgaXMKLW5vdCBuZWNlc3NhcnkgdG8gZmlsbCBvdXQgdGhlIFxtZW1iZXJ7dHBfYWxsb2N9IHNsb3Qgd2l0aAotXGNmdW5jdGlvbntQeVR5cGVfR2VuZXJpY05ld30gLS0gdGhlIGFsbG9jYXRlIGZ1bmN0aW9uIGZyb20gdGhlIGJhc2UgdHlwZQotd2lsbCBiZSBpbmhlcml0ZWQuCi0KLUFmdGVyIHRoYXQsIGNhbGxpbmcgXGNmdW5jdGlvbntQeVR5cGVfUmVhZHl9IGFuZCBhZGRpbmcgdGhlIHR5cGUgb2JqZWN0Ci10byB0aGUgbW9kdWxlIGlzIHRoZSBzYW1lIGFzIHdpdGggdGhlIGJhc2ljIFxjbGFzc3tOb2RkeX0gZXhhbXBsZXMuCi0KLQotXHNlY3Rpb257VHlwZSBNZXRob2RzCi0gICAgICAgICBcbGFiZWx7ZG50LXR5cGUtbWV0aG9kc319Ci0KLVRoaXMgc2VjdGlvbiBhaW1zIHRvIGdpdmUgYSBxdWljayBmbHktYnkgb24gdGhlIHZhcmlvdXMgdHlwZSBtZXRob2RzCi15b3UgY2FuIGltcGxlbWVudCBhbmQgd2hhdCB0aGV5IGRvLgotCi1IZXJlIGlzIHRoZSBkZWZpbml0aW9uIG9mIFxjdHlwZXtQeVR5cGVPYmplY3R9LCB3aXRoIHNvbWUgZmllbGRzIG9ubHkKLXVzZWQgaW4gZGVidWcgYnVpbGRzIG9taXR0ZWQ6Ci0KLVx2ZXJiYXRpbWlucHV0e3R5cGVzdHJ1Y3QuaH0KLQotTm93IHRoYXQncyBhIFxlbXBoe2xvdH0gb2YgbWV0aG9kcy4gIERvbid0IHdvcnJ5IHRvbyBtdWNoIHRob3VnaCAtIGlmCi15b3UgaGF2ZSBhIHR5cGUgeW91IHdhbnQgdG8gZGVmaW5lLCB0aGUgY2hhbmNlcyBhcmUgdmVyeSBnb29kIHRoYXQgeW91Ci13aWxsIG9ubHkgaW1wbGVtZW50IGEgaGFuZGZ1bCBvZiB0aGVzZS4KLQotQXMgeW91IHByb2JhYmx5IGV4cGVjdCBieSBub3csIHdlJ3JlIGdvaW5nIHRvIGdvIG92ZXIgdGhpcyBhbmQgZ2l2ZQotbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmFyaW91cyBoYW5kbGVycy4gIFdlIHdvbid0IGdvIGluIHRoZSBvcmRlcgotdGhleSBhcmUgZGVmaW5lZCBpbiB0aGUgc3RydWN0dXJlLCBiZWNhdXNlIHRoZXJlIGlzIGEgbG90IG9mCi1oaXN0b3JpY2FsIGJhZ2dhZ2UgdGhhdCBpbXBhY3RzIHRoZSBvcmRlcmluZyBvZiB0aGUgZmllbGRzOyBiZSBzdXJlCi15b3VyIHR5cGUgaW5pdGlhbGl6YXRpb24ga2VlcHMgdGhlIGZpZWxkcyBpbiB0aGUgcmlnaHQgb3JkZXIhICBJdCdzCi1vZnRlbiBlYXNpZXN0IHRvIGZpbmQgYW4gZXhhbXBsZSB0aGF0IGluY2x1ZGVzIGFsbCB0aGUgZmllbGRzIHlvdSBuZWVkCi0oZXZlbiBpZiB0aGV5J3JlIGluaXRpYWxpemVkIHRvIFxjb2RlezB9KSBhbmQgdGhlbiBjaGFuZ2UgdGhlIHZhbHVlcwotdG8gc3VpdCB5b3VyIG5ldyB0eXBlLgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgY2hhciAqdHBfbmFtZTsgLyogRm9yIHByaW50aW5nICovCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgbmFtZSBvZiB0aGUgdHlwZSAtIGFzIG1lbnRpb25lZCBpbiB0aGUgbGFzdCBzZWN0aW9uLCB0aGlzIHdpbGwKLWFwcGVhciBpbiB2YXJpb3VzIHBsYWNlcywgYWxtb3N0IGVudGlyZWx5IGZvciBkaWFnbm9zdGljIHB1cnBvc2VzLgotVHJ5IHRvIGNob29zZSBzb21ldGhpbmcgdGhhdCB3aWxsIGJlIGhlbHBmdWwgaW4gc3VjaCBhIHNpdHVhdGlvbiEKLQotXGJlZ2lue3ZlcmJhdGltfQotICAgIGludCB0cF9iYXNpY3NpemUsIHRwX2l0ZW1zaXplOyAvKiBGb3IgYWxsb2NhdGlvbiAqLwotXGVuZHt2ZXJiYXRpbX0KLQotVGhlc2UgZmllbGRzIHRlbGwgdGhlIHJ1bnRpbWUgaG93IG11Y2ggbWVtb3J5IHRvIGFsbG9jYXRlIHdoZW4gbmV3Ci1vYmplY3RzIG9mIHRoaXMgdHlwZSBhcmUgY3JlYXRlZC4gIFB5dGhvbiBoYXMgc29tZSBidWlsdC1pbiBzdXBwb3J0Ci1mb3IgdmFyaWFibGUgbGVuZ3RoIHN0cnVjdHVyZXMgKHRoaW5rOiBzdHJpbmdzLCBsaXN0cykgd2hpY2ggaXMgd2hlcmUKLXRoZSBcbWVtYmVye3RwX2l0ZW1zaXplfSBmaWVsZCBjb21lcyBpbi4gIFRoaXMgd2lsbCBiZSBkZWFsdCB3aXRoCi1sYXRlci4KLQotXGJlZ2lue3ZlcmJhdGltfQotICAgIGNoYXIgKnRwX2RvYzsKLVxlbmR7dmVyYmF0aW19Ci0KLUhlcmUgeW91IGNhbiBwdXQgYSBzdHJpbmcgKG9yIGl0cyBhZGRyZXNzKSB0aGF0IHlvdSB3YW50IHJldHVybmVkIHdoZW4KLXRoZSBQeXRob24gc2NyaXB0IHJlZmVyZW5jZXMgXGNvZGV7b2JqLl9fZG9jX199IHRvIHJldHJpZXZlIHRoZQotZG9jIHN0cmluZy4KLQotTm93IHdlIGNvbWUgdG8gdGhlIGJhc2ljIHR5cGUgbWV0aG9kcy0tLXRoZSBvbmVzIG1vc3QgZXh0ZW5zaW9uIHR5cGVzCi13aWxsIGltcGxlbWVudC4KLQotCi1cc3Vic2VjdGlvbntGaW5hbGl6YXRpb24gYW5kIERlLWFsbG9jYXRpb259Ci0KLVxpbmRleHtvYmplY3QhZGVhbGxvY2F0aW9ufQotXGluZGV4e2RlYWxsb2NhdGlvbiwgb2JqZWN0fQotXGluZGV4e29iamVjdCFmaW5hbGl6YXRpb259Ci1caW5kZXh7ZmluYWxpemF0aW9uLCBvZiBvYmplY3RzfQotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgZGVzdHJ1Y3RvciB0cF9kZWFsbG9jOwotXGVuZHt2ZXJiYXRpbX0KLQotVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBpbnN0YW5jZSBvZgoteW91ciB0eXBlIGlzIHJlZHVjZWQgdG8gemVybyBhbmQgdGhlIFB5dGhvbiBpbnRlcnByZXRlciB3YW50cyB0bwotcmVjbGFpbSBpdC4gIElmIHlvdXIgdHlwZSBoYXMgbWVtb3J5IHRvIGZyZWUgb3Igb3RoZXIgY2xlYW4tdXAgdG8KLXBlcmZvcm0sIHB1dCBpdCBoZXJlLiAgVGhlIG9iamVjdCBpdHNlbGYgbmVlZHMgdG8gYmUgZnJlZWQgaGVyZSBhcwotd2VsbC4gIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiB0aGlzIGZ1bmN0aW9uOgotCi1cYmVnaW57dmVyYmF0aW19Ci1zdGF0aWMgdm9pZAotbmV3ZGF0YXR5cGVfZGVhbGxvYyhuZXdkYXRhdHlwZW9iamVjdCAqIG9iaikKLXsKLSAgICBmcmVlKG9iai0+b2JqX1VuZGVybHlpbmdEYXRhdHlwZVB0cik7Ci0gICAgb2JqLT5vYl90eXBlLT50cF9mcmVlKG9iaik7Ci19Ci1cZW5ke3ZlcmJhdGltfQotCi1PbmUgaW1wb3J0YW50IHJlcXVpcmVtZW50IG9mIHRoZSBkZWFsbG9jYXRvciBmdW5jdGlvbiBpcyB0aGF0IGl0Ci1sZWF2ZXMgYW55IHBlbmRpbmcgZXhjZXB0aW9ucyBhbG9uZS4gIFRoaXMgaXMgaW1wb3J0YW50IHNpbmNlCi1kZWFsbG9jYXRvcnMgYXJlIGZyZXF1ZW50bHkgY2FsbGVkIGFzIHRoZSBpbnRlcnByZXRlciB1bndpbmRzIHRoZQotUHl0aG9uIHN0YWNrOyB3aGVuIHRoZSBzdGFjayBpcyB1bndvdW5kIGR1ZSB0byBhbiBleGNlcHRpb24gKHJhdGhlcgotdGhhbiBub3JtYWwgcmV0dXJucyksIG5vdGhpbmcgaXMgZG9uZSB0byBwcm90ZWN0IHRoZSBkZWFsbG9jYXRvcnMgZnJvbQotc2VlaW5nIHRoYXQgYW4gZXhjZXB0aW9uIGhhcyBhbHJlYWR5IGJlZW4gc2V0LiAgQW55IGFjdGlvbnMgd2hpY2ggYQotZGVhbGxvY2F0b3IgcGVyZm9ybXMgd2hpY2ggbWF5IGNhdXNlIGFkZGl0aW9uYWwgUHl0aG9uIGNvZGUgdG8gYmUKLWV4ZWN1dGVkIG1heSBkZXRlY3QgdGhhdCBhbiBleGNlcHRpb24gaGFzIGJlZW4gc2V0LiAgVGhpcyBjYW4gbGVhZCB0bwotbWlzbGVhZGluZyBlcnJvcnMgZnJvbSB0aGUgaW50ZXJwcmV0ZXIuICBUaGUgcHJvcGVyIHdheSB0byBwcm90ZWN0Ci1hZ2FpbnN0IHRoaXMgaXMgdG8gc2F2ZSBhIHBlbmRpbmcgZXhjZXB0aW9uIGJlZm9yZSBwZXJmb3JtaW5nIHRoZQotdW5zYWZlIGFjdGlvbiwgYW5kIHJlc3RvcmluZyBpdCB3aGVuIGRvbmUuICBUaGlzIGNhbiBiZSBkb25lIHVzaW5nIHRoZQotXGNmdW5jdGlvbntQeUVycl9GZXRjaCgpfVx0dGluZGV4e1B5RXJyX0ZldGNoKCl9IGFuZAotXGNmdW5jdGlvbntQeUVycl9SZXN0b3JlKCl9XHR0aW5kZXh7UHlFcnJfUmVzdG9yZSgpfSBmdW5jdGlvbnM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXN0YXRpYyB2b2lkCi1teV9kZWFsbG9jKFB5T2JqZWN0ICpvYmopCi17Ci0gICAgTXlPYmplY3QgKnNlbGYgPSAoTXlPYmplY3QgKikgb2JqOwotICAgIFB5T2JqZWN0ICpjYnJlc3VsdDsKLQotICAgIGlmIChzZWxmLT5teV9jYWxsYmFjayAhPSBOVUxMKSB7Ci0gICAgICAgIFB5T2JqZWN0ICplcnJfdHlwZSwgKmVycl92YWx1ZSwgKmVycl90cmFjZWJhY2s7Ci0gICAgICAgIGludCBoYXZlX2Vycm9yID0gUHlFcnJfT2NjdXJyZWQoKSA/IDEgOiAwOwotCi0gICAgICAgIGlmIChoYXZlX2Vycm9yKQotICAgICAgICAgICAgUHlFcnJfRmV0Y2goJmVycl90eXBlLCAmZXJyX3ZhbHVlLCAmZXJyX3RyYWNlYmFjayk7Ci0KLSAgICAgICAgY2JyZXN1bHQgPSBQeU9iamVjdF9DYWxsT2JqZWN0KHNlbGYtPm15X2NhbGxiYWNrLCBOVUxMKTsKLSAgICAgICAgaWYgKGNicmVzdWx0ID09IE5VTEwpCi0gICAgICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUoc2VsZi0+bXlfY2FsbGJhY2spOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBQeV9ERUNSRUYoY2JyZXN1bHQpOwotCi0gICAgICAgIGlmIChoYXZlX2Vycm9yKQotICAgICAgICAgICAgUHlFcnJfUmVzdG9yZShlcnJfdHlwZSwgZXJyX3ZhbHVlLCBlcnJfdHJhY2ViYWNrKTsKLQotICAgICAgICBQeV9ERUNSRUYoc2VsZi0+bXlfY2FsbGJhY2spOwotICAgIH0KLSAgICBvYmotPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsKLX0KLVxlbmR7dmVyYmF0aW19Ci0KLQotXHN1YnNlY3Rpb257T2JqZWN0IFByZXNlbnRhdGlvbn0KLQotSW4gUHl0aG9uLCB0aGVyZSBhcmUgdHdvIHdheXMgdG8gZ2VuZXJhdGUgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uCi1vZiBhbiBvYmplY3Q6IHRoZSBcZnVuY3Rpb257cmVwcigpfVxiaWZ1bmNpbmRleHtyZXByfSBmdW5jdGlvbiwgYW5kCi10aGUgXGZ1bmN0aW9ue3N0cigpfVxiaWZ1bmNpbmRleHtzdHJ9IGZ1bmN0aW9uLiAgKFRoZQotXGtleXdvcmR7cHJpbnR9IGZ1bmN0aW9uIGp1c3QgY2FsbHMgXGZ1bmN0aW9ue3N0cigpfS4pCi0KLVRoZXNlIGhhbmRsZXJzIGFyZSBib3RoIG9wdGlvbmFsLgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgcmVwcmZ1bmMgdHBfcmVwcjsKLSAgICByZXByZnVuYyB0cF9zdHI7Ci1cZW5ke3ZlcmJhdGltfQotCi1UaGUgXG1lbWJlcnt0cF9yZXByfSBoYW5kbGVyIHNob3VsZCByZXR1cm4gYSBzdHJpbmcgb2JqZWN0IGNvbnRhaW5pbmcKLWEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGluc3RhbmNlIGZvciB3aGljaCBpdCBpcyBjYWxsZWQuICBIZXJlIGlzIGEKLXNpbXBsZSBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1zdGF0aWMgUHlPYmplY3QgKgotbmV3ZGF0YXR5cGVfcmVwcihuZXdkYXRhdHlwZW9iamVjdCAqIG9iaikKLXsKLSAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiUmVwci1pZmllZF9uZXdkYXRhdHlwZXt7c2l6ZTpcJWR9fSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqLT5vYmpfVW5kZXJseWluZ0RhdGF0eXBlUHRyLT5zaXplKTsKLX0KLVxlbmR7dmVyYmF0aW19Ci0KLUlmIG5vIFxtZW1iZXJ7dHBfcmVwcn0gaGFuZGxlciBpcyBzcGVjaWZpZWQsIHRoZSBpbnRlcnByZXRlciB3aWxsCi1zdXBwbHkgYSByZXByZXNlbnRhdGlvbiB0aGF0IHVzZXMgdGhlIHR5cGUncyBcbWVtYmVye3RwX25hbWV9IGFuZCBhCi11bmlxdWVseS1pZGVudGlmeWluZyB2YWx1ZSBmb3IgdGhlIG9iamVjdC4KLQotVGhlIFxtZW1iZXJ7dHBfc3RyfSBoYW5kbGVyIGlzIHRvIFxmdW5jdGlvbntzdHIoKX0gd2hhdCB0aGUKLVxtZW1iZXJ7dHBfcmVwcn0gaGFuZGxlciBkZXNjcmliZWQgYWJvdmUgaXMgdG8gXGZ1bmN0aW9ue3JlcHIoKX07IHRoYXQKLWlzLCBpdCBpcyBjYWxsZWQgd2hlbiBQeXRob24gY29kZSBjYWxscyBcZnVuY3Rpb257c3RyKCl9IG9uIGFuCi1pbnN0YW5jZSBvZiB5b3VyIG9iamVjdC4gIEl0cyBpbXBsZW1lbnRhdGlvbiBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhlCi1cbWVtYmVye3RwX3JlcHJ9IGZ1bmN0aW9uLCBidXQgdGhlIHJlc3VsdGluZyBzdHJpbmcgaXMgaW50ZW5kZWQgZm9yCi1odW1hbiBjb25zdW1wdGlvbi4gIElmIFxtZW1iZXJ7dHBfc3RyfSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUKLVxtZW1iZXJ7dHBfcmVwcn0gaGFuZGxlciBpcyB1c2VkIGluc3RlYWQuCi0KLUhlcmUgaXMgYSBzaW1wbGUgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotc3RhdGljIFB5T2JqZWN0ICoKLW5ld2RhdGF0eXBlX3N0cihuZXdkYXRhdHlwZW9iamVjdCAqIG9iaikKLXsKLSAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiU3RyaW5naWZpZWRfbmV3ZGF0YXR5cGV7e3NpemU6XCVkfX0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iai0+b2JqX1VuZGVybHlpbmdEYXRhdHlwZVB0ci0+c2l6ZSk7Ci19Ci1cZW5ke3ZlcmJhdGltfQotCi1UaGUgcHJpbnQgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgUHl0aG9uIG5lZWRzIHRvICJwcmludCIgYW4KLWluc3RhbmNlIG9mIHRoZSB0eXBlLiAgRm9yIGV4YW1wbGUsIGlmICdub2RlJyBpcyBhbiBpbnN0YW5jZSBvZiB0eXBlCi1UcmVlTm9kZSwgdGhlbiB0aGUgcHJpbnQgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gUHl0aG9uIGNvZGUgY2FsbHM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXByaW50IG5vZGUKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZXJlIGlzIGEgZmxhZ3MgYXJndW1lbnQgYW5kIG9uZSBmbGFnLCBcY29uc3RhbnR7UHlfUFJJTlRfUkFXfSwgYW5kCi1pdCBzdWdnZXN0cyB0aGF0IHlvdSBwcmludCB3aXRob3V0IHN0cmluZyBxdW90ZXMgYW5kIHBvc3NpYmx5IHdpdGhvdXQKLWludGVycHJldGluZyBlc2NhcGUgc2VxdWVuY2VzLgotCi1UaGUgcHJpbnQgZnVuY3Rpb24gcmVjZWl2ZXMgYSBmaWxlIG9iamVjdCBhcyBhbiBhcmd1bWVudC4gWW91IHdpbGwKLWxpa2VseSB3YW50IHRvIHdyaXRlIHRvIHRoYXQgZmlsZSBvYmplY3QuCi0KLUhlcmUgaXMgYSBzYW1wbGUgcHJpbnQgZnVuY3Rpb246Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXN0YXRpYyBpbnQKLW5ld2RhdGF0eXBlX3ByaW50KG5ld2RhdGF0eXBlb2JqZWN0ICpvYmosIEZJTEUgKmZwLCBpbnQgZmxhZ3MpCi17Ci0gICAgaWYgKGZsYWdzICYgUHlfUFJJTlRfUkFXKSB7Ci0gICAgICAgIGZwcmludGYoZnAsICI8e25ld2RhdGF0eXBlIG9iamVjdC0tc2l6ZTogJWR9PiIsCi0gICAgICAgICAgICAgICAgb2JqLT5vYmpfVW5kZXJseWluZ0RhdGF0eXBlUHRyLT5zaXplKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGZwcmludGYoZnAsICJcIjx7bmV3ZGF0YXR5cGUgb2JqZWN0LS1zaXplOiAlZH0+XCIiLAotICAgICAgICAgICAgICAgIG9iai0+b2JqX1VuZGVybHlpbmdEYXRhdHlwZVB0ci0+c2l6ZSk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotXGVuZHt2ZXJiYXRpbX0KLQotCi1cc3Vic2VjdGlvbntBdHRyaWJ1dGUgTWFuYWdlbWVudH0KLQotRm9yIGV2ZXJ5IG9iamVjdCB3aGljaCBjYW4gc3VwcG9ydCBhdHRyaWJ1dGVzLCB0aGUgY29ycmVzcG9uZGluZyB0eXBlCi1tdXN0IHByb3ZpZGUgdGhlIGZ1bmN0aW9ucyB0aGF0IGNvbnRyb2wgaG93IHRoZSBhdHRyaWJ1dGVzIGFyZQotcmVzb2x2ZWQuICBUaGVyZSBuZWVkcyB0byBiZSBhIGZ1bmN0aW9uIHdoaWNoIGNhbiByZXRyaWV2ZSBhdHRyaWJ1dGVzCi0oaWYgYW55IGFyZSBkZWZpbmVkKSwgYW5kIGFub3RoZXIgdG8gc2V0IGF0dHJpYnV0ZXMgKGlmIHNldHRpbmcKLWF0dHJpYnV0ZXMgaXMgYWxsb3dlZCkuICBSZW1vdmluZyBhbiBhdHRyaWJ1dGUgaXMgYSBzcGVjaWFsIGNhc2UsIGZvcgotd2hpY2ggdGhlIG5ldyB2YWx1ZSBwYXNzZWQgdG8gdGhlIGhhbmRsZXIgaXMgXE5VTEwuCi0KLVB5dGhvbiBzdXBwb3J0cyB0d28gcGFpcnMgb2YgYXR0cmlidXRlIGhhbmRsZXJzOyBhIHR5cGUgdGhhdCBzdXBwb3J0cwotYXR0cmlidXRlcyBvbmx5IG5lZWRzIHRvIGltcGxlbWVudCB0aGUgZnVuY3Rpb25zIGZvciBvbmUgcGFpci4gIFRoZQotZGlmZmVyZW5jZSBpcyB0aGF0IG9uZSBwYWlyIHRha2VzIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgYXMgYQotXGN0eXBle2NoYXIqfSwgd2hpbGUgdGhlIG90aGVyIGFjY2VwdHMgYSBcY3R5cGV7UHlPYmplY3QqfS4gIEVhY2ggdHlwZQotY2FuIHVzZSB3aGljaGV2ZXIgcGFpciBtYWtlcyBtb3JlIHNlbnNlIGZvciB0aGUgaW1wbGVtZW50YXRpb24ncwotY29udmVuaWVuY2UuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICBnZXRhdHRyZnVuYyAgdHBfZ2V0YXR0cjsgICAgICAgIC8qIGNoYXIgKiB2ZXJzaW9uICovCi0gICAgc2V0YXR0cmZ1bmMgIHRwX3NldGF0dHI7Ci0gICAgLyogLi4uICovCi0gICAgZ2V0YXR0cm9mdW5jIHRwX2dldGF0dHJvZnVuYzsgICAvKiBQeU9iamVjdCAqIHZlcnNpb24gKi8KLSAgICBzZXRhdHRyb2Z1bmMgdHBfc2V0YXR0cm9mdW5jOwotXGVuZHt2ZXJiYXRpbX0KLQotSWYgYWNjZXNzaW5nIGF0dHJpYnV0ZXMgb2YgYW4gb2JqZWN0IGlzIGFsd2F5cyBhIHNpbXBsZSBvcGVyYXRpb24KLSh0aGlzIHdpbGwgYmUgZXhwbGFpbmVkIHNob3J0bHkpLCB0aGVyZSBhcmUgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbnMKLXdoaWNoIGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgdGhlIFxjdHlwZXtQeU9iamVjdCp9IHZlcnNpb24gb2YgdGhlCi1hdHRyaWJ1dGUgbWFuYWdlbWVudCBmdW5jdGlvbnMuICBUaGUgYWN0dWFsIG5lZWQgZm9yIHR5cGUtc3BlY2lmaWMKLWF0dHJpYnV0ZSBoYW5kbGVycyBhbG1vc3QgY29tcGxldGVseSBkaXNhcHBlYXJlZCBzdGFydGluZyB3aXRoIFB5dGhvbgotMi4yLCB0aG91Z2ggdGhlcmUgYXJlIG1hbnkgZXhhbXBsZXMgd2hpY2ggaGF2ZSBub3QgYmVlbiB1cGRhdGVkIHRvIHVzZQotc29tZSBvZiB0aGUgbmV3IGdlbmVyaWMgbWVjaGFuaXNtIHRoYXQgaXMgYXZhaWxhYmxlLgotCi0KLVxzdWJzdWJzZWN0aW9ue0dlbmVyaWMgQXR0cmlidXRlIE1hbmFnZW1lbnR9Ci0KLVx2ZXJzaW9uYWRkZWR7Mi4yfQotCi1Nb3N0IGV4dGVuc2lvbiB0eXBlcyBvbmx5IHVzZSBcZW1waHtzaW1wbGV9IGF0dHJpYnV0ZXMuICBTbywgd2hhdAotbWFrZXMgdGhlIGF0dHJpYnV0ZXMgc2ltcGxlPyAgVGhlcmUgYXJlIG9ubHkgYSBjb3VwbGUgb2YgY29uZGl0aW9ucwotdGhhdCBtdXN0IGJlIG1ldDoKLQotXGJlZ2lue2VudW1lcmF0ZX0KLSAgXGl0ZW0gICBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlcyBtdXN0IGJlIGtub3duIHdoZW4KLSAgICAgICAgICBcY2Z1bmN0aW9ue1B5VHlwZV9SZWFkeSgpfSBpcyBjYWxsZWQuCi0KLSAgXGl0ZW0gICBObyBzcGVjaWFsIHByb2Nlc3NpbmcgaXMgbmVlZGVkIHRvIHJlY29yZCB0aGF0IGFuIGF0dHJpYnV0ZQotICAgICAgICAgIHdhcyBsb29rZWQgdXAgb3Igc2V0LCBub3IgZG8gYWN0aW9ucyBuZWVkIHRvIGJlIHRha2VuIGJhc2VkCi0gICAgICAgICAgb24gdGhlIHZhbHVlLgotXGVuZHtlbnVtZXJhdGV9Ci0KLU5vdGUgdGhhdCB0aGlzIGxpc3QgZG9lcyBub3QgcGxhY2UgYW55IHJlc3RyaWN0aW9ucyBvbiB0aGUgdmFsdWVzIG9mCi10aGUgYXR0cmlidXRlcywgd2hlbiB0aGUgdmFsdWVzIGFyZSBjb21wdXRlZCwgb3IgaG93IHJlbGV2YW50IGRhdGEgaXMKLXN0b3JlZC4KLQotV2hlbiBcY2Z1bmN0aW9ue1B5VHlwZV9SZWFkeSgpfSBpcyBjYWxsZWQsIGl0IHVzZXMgdGhyZWUgdGFibGVzCi1yZWZlcmVuY2VkIGJ5IHRoZSB0eXBlIG9iamVjdCB0byBjcmVhdGUgXGVtcGh7ZGVzY3JpcHRvcnN9IHdoaWNoIGFyZQotcGxhY2VkIGluIHRoZSBkaWN0aW9uYXJ5IG9mIHRoZSB0eXBlIG9iamVjdC4gIEVhY2ggZGVzY3JpcHRvciBjb250cm9scwotYWNjZXNzIHRvIG9uZSBhdHRyaWJ1dGUgb2YgdGhlIGluc3RhbmNlIG9iamVjdC4gIEVhY2ggb2YgdGhlIHRhYmxlcyBpcwotb3B0aW9uYWw7IGlmIGFsbCB0aHJlZSBhcmUgXE5VTEwsIGluc3RhbmNlcyBvZiB0aGUgdHlwZSB3aWxsIG9ubHkgaGF2ZQotYXR0cmlidXRlcyB0aGF0IGFyZSBpbmhlcml0ZWQgZnJvbSB0aGVpciBiYXNlIHR5cGUsIGFuZCBzaG91bGQgbGVhdmUKLXRoZSBcbWVtYmVye3RwX2dldGF0dHJvfSBhbmQgXG1lbWJlcnt0cF9zZXRhdHRyb30gZmllbGRzIFxOVUxMe30gYXMKLXdlbGwsIGFsbG93aW5nIHRoZSBiYXNlIHR5cGUgdG8gaGFuZGxlIGF0dHJpYnV0ZXMuCi0KLVRoZSB0YWJsZXMgYXJlIGRlY2xhcmVkIGFzIHRocmVlIGZpZWxkcyBvZiB0aGUgdHlwZSBvYmplY3Q6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICBzdHJ1Y3QgUHlNZXRob2REZWYgKnRwX21ldGhvZHM7Ci0gICAgc3RydWN0IFB5TWVtYmVyRGVmICp0cF9tZW1iZXJzOwotICAgIHN0cnVjdCBQeUdldFNldERlZiAqdHBfZ2V0c2V0OwotXGVuZHt2ZXJiYXRpbX0KLQotSWYgXG1lbWJlcnt0cF9tZXRob2RzfSBpcyBub3QgXE5VTEwsIGl0IG11c3QgcmVmZXIgdG8gYW4gYXJyYXkgb2YKLVxjdHlwZXtQeU1ldGhvZERlZn0gc3RydWN0dXJlcy4gIEVhY2ggZW50cnkgaW4gdGhlIHRhYmxlIGlzIGFuCi1pbnN0YW5jZSBvZiB0aGlzIHN0cnVjdHVyZToKLQotXGJlZ2lue3ZlcmJhdGltfQotdHlwZWRlZiBzdHJ1Y3QgUHlNZXRob2REZWYgewotICAgIGNoYXIgICAgICAgICptbF9uYW1lOyAgICAgICAvKiBtZXRob2QgbmFtZSAqLwotICAgIFB5Q0Z1bmN0aW9uICBtbF9tZXRoOyAgICAgICAvKiBpbXBsZW1lbnRhdGlvbiBmdW5jdGlvbiAqLwotICAgIGludAkgICAgICAgICBtbF9mbGFnczsgICAgICAvKiBmbGFncyAqLwotICAgIGNoYXIgICAgICAgICptbF9kb2M7ICAgICAgICAvKiBkb2NzdHJpbmcgKi8KLX0gUHlNZXRob2REZWY7Ci1cZW5ke3ZlcmJhdGltfQotCi1PbmUgZW50cnkgc2hvdWxkIGJlIGRlZmluZWQgZm9yIGVhY2ggbWV0aG9kIHByb3ZpZGVkIGJ5IHRoZSB0eXBlOyBubwotZW50cmllcyBhcmUgbmVlZGVkIGZvciBtZXRob2RzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSB0eXBlLiAgT25lCi1hZGRpdGlvbmFsIGVudHJ5IGlzIG5lZWRlZCBhdCB0aGUgZW5kOyBpdCBpcyBhIHNlbnRpbmVsIHRoYXQgbWFya3MgdGhlCi1lbmQgb2YgdGhlIGFycmF5LiAgVGhlIFxtZW1iZXJ7bWxfbmFtZX0gZmllbGQgb2YgdGhlIHNlbnRpbmVsIG11c3QgYmUKLVxOVUxMLgotCi1YWFggTmVlZCB0byByZWZlciB0byBzb21lIHVuaWZpZWQgZGlzY3Vzc2lvbiBvZiB0aGUgc3RydWN0dXJlIGZpZWxkcywKLXNoYXJlZCB3aXRoIHRoZSBuZXh0IHNlY3Rpb24uCi0KLVRoZSBzZWNvbmQgdGFibGUgaXMgdXNlZCB0byBkZWZpbmUgYXR0cmlidXRlcyB3aGljaCBtYXAgZGlyZWN0bHkgdG8KLWRhdGEgc3RvcmVkIGluIHRoZSBpbnN0YW5jZS4gIEEgdmFyaWV0eSBvZiBwcmltaXRpdmUgQyB0eXBlcyBhcmUKLXN1cHBvcnRlZCwgYW5kIGFjY2VzcyBtYXkgYmUgcmVhZC1vbmx5IG9yIHJlYWQtd3JpdGUuICBUaGUgc3RydWN0dXJlcwotaW4gdGhlIHRhYmxlIGFyZSBkZWZpbmVkIGFzOgotCi1cYmVnaW57dmVyYmF0aW19Ci10eXBlZGVmIHN0cnVjdCBQeU1lbWJlckRlZiB7Ci0gICAgY2hhciAqbmFtZTsKLSAgICBpbnQgICB0eXBlOwotICAgIGludCAgIG9mZnNldDsKLSAgICBpbnQgICBmbGFnczsKLSAgICBjaGFyICpkb2M7Ci19IFB5TWVtYmVyRGVmOwotXGVuZHt2ZXJiYXRpbX0KLQotRm9yIGVhY2ggZW50cnkgaW4gdGhlIHRhYmxlLCBhIGRlc2NyaXB0b3Igd2lsbCBiZSBjb25zdHJ1Y3RlZCBhbmQKLWFkZGVkIHRvIHRoZSB0eXBlIHdoaWNoIHdpbGwgYmUgYWJsZSB0byBleHRyYWN0IGEgdmFsdWUgZnJvbSB0aGUKLWluc3RhbmNlIHN0cnVjdHVyZS4gIFRoZSBcbWVtYmVye3R5cGV9IGZpZWxkIHNob3VsZCBjb250YWluIG9uZSBvZiB0aGUKLXR5cGUgY29kZXMgZGVmaW5lZCBpbiB0aGUgXGZpbGV7c3RydWN0bWVtYmVyLmh9IGhlYWRlcjsgdGhlIHZhbHVlIHdpbGwKLWJlIHVzZWQgdG8gZGV0ZXJtaW5lIGhvdyB0byBjb252ZXJ0IFB5dGhvbiB2YWx1ZXMgdG8gYW5kIGZyb20gQwotdmFsdWVzLiAgVGhlIFxtZW1iZXJ7ZmxhZ3N9IGZpZWxkIGlzIHVzZWQgdG8gc3RvcmUgZmxhZ3Mgd2hpY2ggY29udHJvbAotaG93IHRoZSBhdHRyaWJ1dGUgY2FuIGJlIGFjY2Vzc2VkLgotCi1YWFggTmVlZCB0byBtb3ZlIHNvbWUgb2YgdGhpcyB0byBhIHNoYXJlZCBzZWN0aW9uIQotCi1UaGUgZm9sbG93aW5nIGZsYWcgY29uc3RhbnRzIGFyZSBkZWZpbmVkIGluIFxmaWxle3N0cnVjdG1lbWJlci5ofTsKLXRoZXkgbWF5IGJlIGNvbWJpbmVkIHVzaW5nIGJpdHdpc2UtT1IuCi0KLVxiZWdpbnt0YWJsZWlpfXtsfGx9e2NvbnN0YW50fXtDb25zdGFudH17TWVhbmluZ30KLSAgXGxpbmVpaXtSRUFET05MWSBcdHRpbmRleHtSRUFET05MWX19Ci0gICAgICAgICB7TmV2ZXIgd3JpdGFibGUufQotICBcbGluZWlpe1JPIFx0dGluZGV4e1JPfX0KLSAgICAgICAgIHtTaG9ydGhhbmQgZm9yIFxjb25zdGFudHtSRUFET05MWX0ufQotICBcbGluZWlpe1JFQURfUkVTVFJJQ1RFRCBcdHRpbmRleHtSRUFEX1JFU1RSSUNURUR9fQotICAgICAgICAge05vdCByZWFkYWJsZSBpbiByZXN0cmljdGVkIG1vZGUufQotICBcbGluZWlpe1dSSVRFX1JFU1RSSUNURUQgXHR0aW5kZXh7V1JJVEVfUkVTVFJJQ1RFRH19Ci0gICAgICAgICB7Tm90IHdyaXRhYmxlIGluIHJlc3RyaWN0ZWQgbW9kZS59Ci0gIFxsaW5laWl7UkVTVFJJQ1RFRCBcdHRpbmRleHtSRVNUUklDVEVEfX0KLSAgICAgICAgIHtOb3QgcmVhZGFibGUgb3Igd3JpdGFibGUgaW4gcmVzdHJpY3RlZCBtb2RlLn0KLVxlbmR7dGFibGVpaX0KLQotQW4gaW50ZXJlc3RpbmcgYWR2YW50YWdlIG9mIHVzaW5nIHRoZSBcbWVtYmVye3RwX21lbWJlcnN9IHRhYmxlIHRvCi1idWlsZCBkZXNjcmlwdG9ycyB0aGF0IGFyZSB1c2VkIGF0IHJ1bnRpbWUgaXMgdGhhdCBhbnkgYXR0cmlidXRlCi1kZWZpbmVkIHRoaXMgd2F5IGNhbiBoYXZlIGFuIGFzc29jaWF0ZWQgZG9jIHN0cmluZyBzaW1wbHkgYnkgcHJvdmlkaW5nCi10aGUgdGV4dCBpbiB0aGUgdGFibGUuICBBbiBhcHBsaWNhdGlvbiBjYW4gdXNlIHRoZSBpbnRyb3NwZWN0aW9uIEFQSQotdG8gcmV0cmlldmUgdGhlIGRlc2NyaXB0b3IgZnJvbSB0aGUgY2xhc3Mgb2JqZWN0LCBhbmQgZ2V0IHRoZQotZG9jIHN0cmluZyB1c2luZyBpdHMgXG1lbWJlcntfX2RvY19ffSBhdHRyaWJ1dGUuCi0KLUFzIHdpdGggdGhlIFxtZW1iZXJ7dHBfbWV0aG9kc30gdGFibGUsIGEgc2VudGluZWwgZW50cnkgd2l0aCBhCi1cbWVtYmVye25hbWV9IHZhbHVlIG9mIFxOVUxMe30gaXMgcmVxdWlyZWQuCi0KLQotJSBYWFggRGVzY3JpcHRvcnMgbmVlZCB0byBiZSBleHBsYWluZWQgaW4gbW9yZSBkZXRhaWwgc29tZXdoZXJlLCBidXQKLSUgbm90IGhlcmUuCi0lCi0lIERlc2NyaXB0b3Igb2JqZWN0cyBoYXZlIHR3byBoYW5kbGVyIGZ1bmN0aW9ucyB3aGljaCBjb3JyZXNwb25kIHRvCi0lIHRoZSBcbWVtYmVye3RwX2dldGF0dHJvfSBhbmQgXG1lbWJlcnt0cF9zZXRhdHRyb30gaGFuZGxlcnMuICBUaGUKLSUgXG1ldGhvZHtfX2dldF9fKCl9IGhhbmRsZXIgaXMgYSBmdW5jdGlvbiB3aGljaCBpcyBwYXNzZWQgdGhlCi0lIGRlc2NyaXB0b3IsIGluc3RhbmNlLCBhbmQgdHlwZSBvYmplY3RzLCBhbmQgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlCi0lIGF0dHJpYnV0ZSwgb3IgaXQgcmV0dXJucyBcTlVMTHt9IGFuZCBzZXRzIGFuIGV4Y2VwdGlvbi4gIFRoZQotJSBcbWV0aG9ke19fc2V0X18oKX0gaGFuZGxlciBpcyBwYXNzZWQgdGhlIGRlc2NyaXB0b3IsIGluc3RhbmNlLCB0eXBlLAotJSBhbmQgbmV3IHZhbHVlOwotCi0KLVxzdWJzdWJzZWN0aW9ue1R5cGUtc3BlY2lmaWMgQXR0cmlidXRlIE1hbmFnZW1lbnR9Ci0KLUZvciBzaW1wbGljaXR5LCBvbmx5IHRoZSBcY3R5cGV7Y2hhcip9IHZlcnNpb24gd2lsbCBiZSBkZW1vbnN0cmF0ZWQKLWhlcmU7IHRoZSB0eXBlIG9mIHRoZSBuYW1lIHBhcmFtZXRlciBpcyB0aGUgb25seSBkaWZmZXJlbmNlIGJldHdlZW4KLXRoZSBcY3R5cGV7Y2hhcip9IGFuZCBcY3R5cGV7UHlPYmplY3QqfSBmbGF2b3JzIG9mIHRoZSBpbnRlcmZhY2UuCi1UaGlzIGV4YW1wbGUgZWZmZWN0aXZlbHkgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyB0aGUgZ2VuZXJpYyBleGFtcGxlCi1hYm92ZSwgYnV0IGRvZXMgbm90IHVzZSB0aGUgZ2VuZXJpYyBzdXBwb3J0IGFkZGVkIGluIFB5dGhvbiAyLjIuICBUaGUKLXZhbHVlIGluIHNob3dpbmcgdGhpcyBpcyB0d28tZm9sZDogaXQgZGVtb25zdHJhdGVzIGhvdyBiYXNpYyBhdHRyaWJ1dGUKLW1hbmFnZW1lbnQgY2FuIGJlIGRvbmUgaW4gYSB3YXkgdGhhdCBpcyBwb3J0YWJsZSB0byBvbGRlciB2ZXJzaW9ucyBvZgotUHl0aG9uLCBhbmQgZXhwbGFpbnMgaG93IHRoZSBoYW5kbGVyIGZ1bmN0aW9ucyBhcmUgY2FsbGVkLCBzbyB0aGF0IGlmCi15b3UgZG8gbmVlZCB0byBleHRlbmQgdGhlaXIgZnVuY3Rpb25hbGl0eSwgeW91J2xsIHVuZGVyc3RhbmQgd2hhdAotbmVlZHMgdG8gYmUgZG9uZS4KLQotVGhlIFxtZW1iZXJ7dHBfZ2V0YXR0cn0gaGFuZGxlciBpcyBjYWxsZWQgd2hlbiB0aGUgb2JqZWN0IHJlcXVpcmVzIGFuCi1hdHRyaWJ1dGUgbG9vay11cC4gIEl0IGlzIGNhbGxlZCBpbiB0aGUgc2FtZSBzaXR1YXRpb25zIHdoZXJlIHRoZQotXG1ldGhvZHtfX2dldGF0dHJfXygpfSBtZXRob2Qgb2YgYSBjbGFzcyB3b3VsZCBiZSBjYWxsZWQuCi0KLUEgbGlrZWx5IHdheSB0byBoYW5kbGUgdGhpcyBpcyAoMSkgdG8gaW1wbGVtZW50IGEgc2V0IG9mIGZ1bmN0aW9ucwotKHN1Y2ggYXMgXGNmdW5jdGlvbntuZXdkYXRhdHlwZV9nZXRTaXplKCl9IGFuZAotXGNmdW5jdGlvbntuZXdkYXRhdHlwZV9zZXRTaXplKCl9IGluIHRoZSBleGFtcGxlIGJlbG93KSwgKDIpIHByb3ZpZGUgYQotbWV0aG9kIHRhYmxlIGxpc3RpbmcgdGhlc2UgZnVuY3Rpb25zLCBhbmQgKDMpIHByb3ZpZGUgYSBnZXRhdHRyCi1mdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHJlc3VsdCBvZiBhIGxvb2t1cCBpbiB0aGF0IHRhYmxlLiAgVGhlCi1tZXRob2QgdGFibGUgdXNlcyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgdGhlIFxtZW1iZXJ7dHBfbWV0aG9kc30gZmllbGQKLW9mIHRoZSB0eXBlIG9iamVjdC4KLQotSGVyZSBpcyBhbiBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1zdGF0aWMgUHlNZXRob2REZWYgbmV3ZGF0YXR5cGVfbWV0aG9kc1tdID0gewotICAgIHsiZ2V0U2l6ZSIsIChQeUNGdW5jdGlvbiluZXdkYXRhdHlwZV9nZXRTaXplLCBNRVRIX1ZBUkFSR1MsCi0gICAgICJSZXR1cm4gdGhlIGN1cnJlbnQgc2l6ZS4ifSwKLSAgICB7InNldFNpemUiLCAoUHlDRnVuY3Rpb24pbmV3ZGF0YXR5cGVfc2V0U2l6ZSwgTUVUSF9WQVJBUkdTLAotICAgICAiU2V0IHRoZSBzaXplLiJ9LAotICAgIHtOVUxMLCBOVUxMLCAwLCBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KLX07Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1uZXdkYXRhdHlwZV9nZXRhdHRyKG5ld2RhdGF0eXBlb2JqZWN0ICpvYmosIGNoYXIgKm5hbWUpCi17Ci0gICAgcmV0dXJuIFB5X0ZpbmRNZXRob2QobmV3ZGF0YXR5cGVfbWV0aG9kcywgKFB5T2JqZWN0ICopb2JqLCBuYW1lKTsKLX0KLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBcbWVtYmVye3RwX3NldGF0dHJ9IGhhbmRsZXIgaXMgY2FsbGVkIHdoZW4gdGhlCi1cbWV0aG9ke19fc2V0YXR0cl9fKCl9IG9yIFxtZXRob2R7X19kZWxhdHRyX18oKX0gbWV0aG9kIG9mIGEgY2xhc3MKLWluc3RhbmNlIHdvdWxkIGJlIGNhbGxlZC4gIFdoZW4gYW4gYXR0cmlidXRlIHNob3VsZCBiZSBkZWxldGVkLCB0aGUKLXRoaXJkIHBhcmFtZXRlciB3aWxsIGJlIFxOVUxMLiAgSGVyZSBpcyBhbiBleGFtcGxlIHRoYXQgc2ltcGx5IHJhaXNlcwotYW4gZXhjZXB0aW9uOyBpZiB0aGlzIHdlcmUgcmVhbGx5IGFsbCB5b3Ugd2FudGVkLCB0aGUKLVxtZW1iZXJ7dHBfc2V0YXR0cn0gaGFuZGxlciBzaG91bGQgYmUgc2V0IHRvIFxOVUxMLgotCi1cYmVnaW57dmVyYmF0aW19Ci1zdGF0aWMgaW50Ci1uZXdkYXRhdHlwZV9zZXRhdHRyKG5ld2RhdGF0eXBlb2JqZWN0ICpvYmosIGNoYXIgKm5hbWUsIFB5T2JqZWN0ICp2KQotewotICAgICh2b2lkKVB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsICJSZWFkLW9ubHkgYXR0cmlidXRlOiBcJXMiLCBuYW1lKTsKLSAgICByZXR1cm4gLTE7Ci19Ci1cZW5ke3ZlcmJhdGltfQotCi0KLVxzdWJzZWN0aW9ue09iamVjdCBDb21wYXJpc29ufQotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgY21wZnVuYyB0cF9jb21wYXJlOwotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIFxtZW1iZXJ7dHBfY29tcGFyZX0gaGFuZGxlciBpcyBjYWxsZWQgd2hlbiBjb21wYXJpc29ucyBhcmUgbmVlZGVkCi1hbmQgdGhlIG9iamVjdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIHNwZWNpZmljIHJpY2ggY29tcGFyaXNvbiBtZXRob2QKLXdoaWNoIG1hdGNoZXMgdGhlIHJlcXVlc3RlZCBjb21wYXJpc29uLiAgKEl0IGlzIGFsd2F5cyB1c2VkIGlmIGRlZmluZWQKLWFuZCB0aGUgXGNmdW5jdGlvbntQeU9iamVjdF9Db21wYXJlKCl9IG9yIFxjZnVuY3Rpb257UHlPYmplY3RfQ21wKCl9Ci1mdW5jdGlvbnMgYXJlIHVzZWQsIG9yIGlmIFxmdW5jdGlvbntjbXAoKX0gaXMgdXNlZCBmcm9tIFB5dGhvbi4pCi1JdCBpcyBhbmFsb2dvdXMgdG8gdGhlIFxtZXRob2R7X19jbXBfXygpfSBtZXRob2QuICBUaGlzIGZ1bmN0aW9uCi1zaG91bGQgcmV0dXJuIFxjb2Rley0xfSBpZiBcdmFye29iajF9IGlzIGxlc3MgdGhhbgotXHZhcntvYmoyfSwgXGNvZGV7MH0gaWYgdGhleSBhcmUgZXF1YWwsIGFuZCBcY29kZXsxfSBpZgotXHZhcntvYmoxfSBpcyBncmVhdGVyIHRoYW4KLVx2YXJ7b2JqMn0uCi0oSXQgd2FzIHByZXZpb3VzbHkgYWxsb3dlZCB0byByZXR1cm4gYXJiaXRyYXJ5IG5lZ2F0aXZlIG9yIHBvc2l0aXZlCi1pbnRlZ2VycyBmb3IgbGVzcyB0aGFuIGFuZCBncmVhdGVyIHRoYW4sIHJlc3BlY3RpdmVseTsgYXMgb2YgUHl0aG9uCi0yLjIsIHRoaXMgaXMgbm8gbG9uZ2VyIGFsbG93ZWQuICBJbiB0aGUgZnV0dXJlLCBvdGhlciByZXR1cm4gdmFsdWVzCi1tYXkgYmUgYXNzaWduZWQgYSBkaWZmZXJlbnQgbWVhbmluZy4pCi0KLUEgXG1lbWJlcnt0cF9jb21wYXJlfSBoYW5kbGVyIG1heSByYWlzZSBhbiBleGNlcHRpb24uICBJbiB0aGlzIGNhc2UgaXQKLXNob3VsZCByZXR1cm4gYSBuZWdhdGl2ZSB2YWx1ZS4gIFRoZSBjYWxsZXIgaGFzIHRvIHRlc3QgZm9yIHRoZQotZXhjZXB0aW9uIHVzaW5nIFxjZnVuY3Rpb257UHlFcnJfT2NjdXJyZWQoKX0uCi0KLQotSGVyZSBpcyBhIHNhbXBsZSBpbXBsZW1lbnRhdGlvbjoKLQotXGJlZ2lue3ZlcmJhdGltfQotc3RhdGljIGludAotbmV3ZGF0YXR5cGVfY29tcGFyZShuZXdkYXRhdHlwZW9iamVjdCAqIG9iajEsIG5ld2RhdGF0eXBlb2JqZWN0ICogb2JqMikKLXsKLSAgICBsb25nIHJlc3VsdDsKLQotICAgIGlmIChvYmoxLT5vYmpfVW5kZXJseWluZ0RhdGF0eXBlUHRyLT5zaXplIDwKLSAgICAgICAgb2JqMi0+b2JqX1VuZGVybHlpbmdEYXRhdHlwZVB0ci0+c2l6ZSkgewotICAgICAgICByZXN1bHQgPSAtMTsKLSAgICB9Ci0gICAgZWxzZSBpZiAob2JqMS0+b2JqX1VuZGVybHlpbmdEYXRhdHlwZVB0ci0+c2l6ZSA+Ci0gICAgICAgICAgICAgb2JqMi0+b2JqX1VuZGVybHlpbmdEYXRhdHlwZVB0ci0+c2l6ZSkgewotICAgICAgICByZXN1bHQgPSAxOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgcmVzdWx0ID0gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLVxlbmR7dmVyYmF0aW19Ci0KLQotXHN1YnNlY3Rpb257QWJzdHJhY3QgUHJvdG9jb2wgU3VwcG9ydH0KLQotUHl0aG9uIHN1cHBvcnRzIGEgdmFyaWV0eSBvZiBcZW1waHthYnN0cmFjdH0gYHByb3RvY29sczsnIHRoZSBzcGVjaWZpYwotaW50ZXJmYWNlcyBwcm92aWRlZCB0byB1c2UgdGhlc2UgaW50ZXJmYWNlcyBhcmUgZG9jdW1lbnRlZCBpbiB0aGUKLVxjaXRldGl0bGVbLi4vYXBpL2FwaS5odG1sXXtQeXRob24vQyBBUEkgUmVmZXJlbmNlIE1hbnVhbH0gaW4gdGhlCi1jaGFwdGVyIGBgXHVsaW5re0Fic3RyYWN0IE9iamVjdHMgTGF5ZXJ9ey4uL2FwaS9hYnN0cmFjdC5odG1sfS4nJwotCi1BIG51bWJlciBvZiB0aGVzZSBhYnN0cmFjdCBpbnRlcmZhY2VzIHdlcmUgZGVmaW5lZCBlYXJseSBpbiB0aGUKLWRldmVsb3BtZW50IG9mIHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24uICBJbiBwYXJ0aWN1bGFyLCB0aGUgbnVtYmVyLAotbWFwcGluZywgYW5kIHNlcXVlbmNlIHByb3RvY29scyBoYXZlIGJlZW4gcGFydCBvZiBQeXRob24gc2luY2UgdGhlCi1iZWdpbm5pbmcuICBPdGhlciBwcm90b2NvbHMgaGF2ZSBiZWVuIGFkZGVkIG92ZXIgdGltZS4gIEZvciBwcm90b2NvbHMKLXdoaWNoIGRlcGVuZCBvbiBzZXZlcmFsIGhhbmRsZXIgcm91dGluZXMgZnJvbSB0aGUgdHlwZSBpbXBsZW1lbnRhdGlvbiwKLXRoZSBvbGRlciBwcm90b2NvbHMgaGF2ZSBiZWVuIGRlZmluZWQgYXMgb3B0aW9uYWwgYmxvY2tzIG9mIGhhbmRsZXJzCi1yZWZlcmVuY2VkIGJ5IHRoZSB0eXBlIG9iamVjdC4gIEZvciBuZXdlciBwcm90b2NvbHMgdGhlcmUgYXJlCi1hZGRpdGlvbmFsIHNsb3RzIGluIHRoZSBtYWluIHR5cGUgb2JqZWN0LCB3aXRoIGEgZmxhZyBiaXQgYmVpbmcgc2V0IHRvCi1pbmRpY2F0ZSB0aGF0IHRoZSBzbG90cyBhcmUgcHJlc2VudCBhbmQgc2hvdWxkIGJlIGNoZWNrZWQgYnkgdGhlCi1pbnRlcnByZXRlci4gIChUaGUgZmxhZyBiaXQgZG9lcyBub3QgaW5kaWNhdGUgdGhhdCB0aGUgc2xvdCB2YWx1ZXMgYXJlCi1ub24tXE5VTEwuIFRoZSBmbGFnIG1heSBiZSBzZXQgdG8gaW5kaWNhdGUgdGhlIHByZXNlbmNlIG9mIGEgc2xvdCwKLWJ1dCBhIHNsb3QgbWF5IHN0aWxsIGJlIHVuZmlsbGVkLikKLQotXGJlZ2lue3ZlcmJhdGltfQotICAgIFB5TnVtYmVyTWV0aG9kcyAgIHRwX2FzX251bWJlcjsKLSAgICBQeVNlcXVlbmNlTWV0aG9kcyB0cF9hc19zZXF1ZW5jZTsKLSAgICBQeU1hcHBpbmdNZXRob2RzICB0cF9hc19tYXBwaW5nOwotXGVuZHt2ZXJiYXRpbX0KLQotSWYgeW91IHdpc2ggeW91ciBvYmplY3QgdG8gYmUgYWJsZSB0byBhY3QgbGlrZSBhIG51bWJlciwgYSBzZXF1ZW5jZSwKLW9yIGEgbWFwcGluZyBvYmplY3QsIHRoZW4geW91IHBsYWNlIHRoZSBhZGRyZXNzIG9mIGEgc3RydWN0dXJlIHRoYXQKLWltcGxlbWVudHMgdGhlIEMgdHlwZSBcY3R5cGV7UHlOdW1iZXJNZXRob2RzfSwKLVxjdHlwZXtQeVNlcXVlbmNlTWV0aG9kc30sIG9yIFxjdHlwZXtQeU1hcHBpbmdNZXRob2RzfSwgcmVzcGVjdGl2ZWx5LgotSXQgaXMgdXAgdG8geW91IHRvIGZpbGwgaW4gdGhpcyBzdHJ1Y3R1cmUgd2l0aCBhcHByb3ByaWF0ZSB2YWx1ZXMuIFlvdQotY2FuIGZpbmQgZXhhbXBsZXMgb2YgdGhlIHVzZSBvZiBlYWNoIG9mIHRoZXNlIGluIHRoZSBcZmlsZXtPYmplY3RzfQotZGlyZWN0b3J5IG9mIHRoZSBQeXRob24gc291cmNlIGRpc3RyaWJ1dGlvbi4KLQotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgaGFzaGZ1bmMgdHBfaGFzaDsKLVxlbmR7dmVyYmF0aW19Ci0KLVRoaXMgZnVuY3Rpb24sIGlmIHlvdSBjaG9vc2UgdG8gcHJvdmlkZSBpdCwgc2hvdWxkIHJldHVybiBhIGhhc2gKLW51bWJlciBmb3IgYW4gaW5zdGFuY2Ugb2YgeW91ciBkYXRhIHR5cGUuIEhlcmUgaXMgYSBtb2RlcmF0ZWx5Ci1wb2ludGxlc3MgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotc3RhdGljIGxvbmcKLW5ld2RhdGF0eXBlX2hhc2gobmV3ZGF0YXR5cGVvYmplY3QgKm9iaikKLXsKLSAgICBsb25nIHJlc3VsdDsKLSAgICByZXN1bHQgPSBvYmotPm9ial9VbmRlcmx5aW5nRGF0YXR5cGVQdHItPnNpemU7Ci0gICAgcmVzdWx0ID0gcmVzdWx0ICogMzsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotXGVuZHt2ZXJiYXRpbX0KLQotXGJlZ2lue3ZlcmJhdGltfQotICAgIHRlcm5hcnlmdW5jIHRwX2NhbGw7Ci1cZW5ke3ZlcmJhdGltfQotCi1UaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGFuIGluc3RhbmNlIG9mIHlvdXIgZGF0YSB0eXBlIGlzICJjYWxsZWQiLAotZm9yIGV4YW1wbGUsIGlmIFxjb2Rle29iajF9IGlzIGFuIGluc3RhbmNlIG9mIHlvdXIgZGF0YSB0eXBlIGFuZCB0aGUgUHl0aG9uCi1zY3JpcHQgY29udGFpbnMgXGNvZGV7b2JqMSgnaGVsbG8nKX0sIHRoZSBcbWVtYmVye3RwX2NhbGx9IGhhbmRsZXIgaXMKLWludm9rZWQuCi0KLVRoaXMgZnVuY3Rpb24gdGFrZXMgdGhyZWUgYXJndW1lbnRzOgotCi1cYmVnaW57ZW51bWVyYXRlfQotICBcaXRlbQotICAgIFx2YXJ7YXJnMX0gaXMgdGhlIGluc3RhbmNlIG9mIHRoZSBkYXRhIHR5cGUgd2hpY2ggaXMgdGhlIHN1YmplY3Qgb2YKLSAgICB0aGUgY2FsbC4gSWYgdGhlIGNhbGwgaXMgXGNvZGV7b2JqMSgnaGVsbG8nKX0sIHRoZW4gXHZhcnthcmcxfSBpcwotICAgIFxjb2Rle29iajF9LgotCi0gIFxpdGVtCi0gICAgXHZhcnthcmcyfSBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIGFyZ3VtZW50cyB0byB0aGUgY2FsbC4gIFlvdQotICAgIGNhbiB1c2UgXGNmdW5jdGlvbntQeUFyZ19QYXJzZVR1cGxlKCl9IHRvIGV4dHJhY3QgdGhlIGFyZ3VtZW50cy4KLQotICBcaXRlbQotICAgIFx2YXJ7YXJnM30gaXMgYSBkaWN0aW9uYXJ5IG9mIGtleXdvcmQgYXJndW1lbnRzIHRoYXQgd2VyZSBwYXNzZWQuCi0gICAgSWYgdGhpcyBpcyBub24tXE5VTEx7fSBhbmQgeW91IHN1cHBvcnQga2V5d29yZCBhcmd1bWVudHMsIHVzZQotICAgIFxjZnVuY3Rpb257UHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKCl9IHRvIGV4dHJhY3QgdGhlCi0gICAgYXJndW1lbnRzLiAgSWYgeW91IGRvIG5vdCB3YW50IHRvIHN1cHBvcnQga2V5d29yZCBhcmd1bWVudHMgYW5kCi0gICAgdGhpcyBpcyBub24tXE5VTEwsIHJhaXNlIGEgXGV4Y2VwdGlvbntUeXBlRXJyb3J9IHdpdGggYSBtZXNzYWdlCi0gICAgc2F5aW5nIHRoYXQga2V5d29yZCBhcmd1bWVudHMgYXJlIG5vdCBzdXBwb3J0ZWQuCi1cZW5ke2VudW1lcmF0ZX0KLQotSGVyZSBpcyBhIGRlc3VsdG9yeSBleGFtcGxlIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY2FsbCBmdW5jdGlvbi4KLQotXGJlZ2lue3ZlcmJhdGltfQotLyogSW1wbGVtZW50IHRoZSBjYWxsIGZ1bmN0aW9uLgotICogICAgb2JqMSBpcyB0aGUgaW5zdGFuY2UgcmVjZWl2aW5nIHRoZSBjYWxsLgotICogICAgb2JqMiBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIGFyZ3VtZW50cyB0byB0aGUgY2FsbCwgaW4gdGhpcwotICogICAgICAgICBjYXNlIDMgc3RyaW5ncy4KLSAqLwotc3RhdGljIFB5T2JqZWN0ICoKLW5ld2RhdGF0eXBlX2NhbGwobmV3ZGF0YXR5cGVvYmplY3QgKm9iaiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICpvdGhlcikKLXsKLSAgICBQeU9iamVjdCAqcmVzdWx0OwotICAgIGNoYXIgKmFyZzE7Ci0gICAgY2hhciAqYXJnMjsKLSAgICBjaGFyICphcmczOwotCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzc3M6Y2FsbCIsICZhcmcxLCAmYXJnMiwgJmFyZzMpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KAotICAgICAgICAiUmV0dXJuaW5nIC0tIHZhbHVlOiBbXCVkXSBhcmcxOiBbXCVzXSBhcmcyOiBbXCVzXSBhcmczOiBbXCVzXVxuIiwKLSAgICAgICAgb2JqLT5vYmpfVW5kZXJseWluZ0RhdGF0eXBlUHRyLT5zaXplLAotICAgICAgICBhcmcxLCBhcmcyLCBhcmczKTsKLSAgICBwcmludGYoIlwlcyIsIFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotXGVuZHt2ZXJiYXRpbX0KLQotWFhYIHNvbWUgZmllbGRzIG5lZWQgdG8gYmUgYWRkZWQgaGVyZS4uLgotCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICAvKiBBZGRlZCBpbiByZWxlYXNlIDIuMiAqLwotICAgIC8qIEl0ZXJhdG9ycyAqLwotICAgIGdldGl0ZXJmdW5jIHRwX2l0ZXI7Ci0gICAgaXRlcm5leHRmdW5jIHRwX2l0ZXJuZXh0OwotXGVuZHt2ZXJiYXRpbX0KLQotVGhlc2UgZnVuY3Rpb25zIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIGl0ZXJhdG9yIHByb3RvY29sLiAgQW55IG9iamVjdAotd2hpY2ggd2lzaGVzIHRvIHN1cHBvcnQgaXRlcmF0aW9uIG92ZXIgaXRzIGNvbnRlbnRzICh3aGljaCBtYXkgYmUKLWdlbmVyYXRlZCBkdXJpbmcgaXRlcmF0aW9uKSBtdXN0IGltcGxlbWVudCB0aGUgXGNvZGV7dHBfaXRlcn0KLWhhbmRsZXIuICBPYmplY3RzIHdoaWNoIGFyZSByZXR1cm5lZCBieSBhIFxjb2Rle3RwX2l0ZXJ9IGhhbmRsZXIgbXVzdAotaW1wbGVtZW50IGJvdGggdGhlIFxjb2Rle3RwX2l0ZXJ9IGFuZCBcY29kZXt0cF9pdGVybmV4dH0gaGFuZGxlcnMuCi1Cb3RoIGhhbmRsZXJzIHRha2UgZXhhY3RseSBvbmUgcGFyYW1ldGVyLCB0aGUgaW5zdGFuY2UgZm9yIHdoaWNoIHRoZXkKLWFyZSBiZWluZyBjYWxsZWQsIGFuZCByZXR1cm4gYSBuZXcgcmVmZXJlbmNlLiAgSW4gdGhlIGNhc2Ugb2YgYW4KLWVycm9yLCB0aGV5IHNob3VsZCBzZXQgYW4gZXhjZXB0aW9uIGFuZCByZXR1cm4gXE5VTEwuCi0KLUZvciBhbiBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyBhbiBpdGVyYWJsZSBjb2xsZWN0aW9uLCB0aGUKLVxjb2Rle3RwX2l0ZXJ9IGhhbmRsZXIgbXVzdCByZXR1cm4gYW4gaXRlcmF0b3Igb2JqZWN0LiAgVGhlIGl0ZXJhdG9yCi1vYmplY3QgaXMgcmVzcG9uc2libGUgZm9yIG1haW50YWluaW5nIHRoZSBzdGF0ZSBvZiB0aGUgaXRlcmF0aW9uLiAgRm9yCi1jb2xsZWN0aW9ucyB3aGljaCBjYW4gc3VwcG9ydCBtdWx0aXBsZSBpdGVyYXRvcnMgd2hpY2ggZG8gbm90Ci1pbnRlcmZlcmUgd2l0aCBlYWNoIG90aGVyIChhcyBsaXN0cyBhbmQgdHVwbGVzIGRvKSwgYSBuZXcgaXRlcmF0b3IKLXNob3VsZCBiZSBjcmVhdGVkIGFuZCByZXR1cm5lZC4gIE9iamVjdHMgd2hpY2ggY2FuIG9ubHkgYmUgaXRlcmF0ZWQKLW92ZXIgb25jZSAodXN1YWxseSBkdWUgdG8gc2lkZSBlZmZlY3RzIG9mIGl0ZXJhdGlvbikgc2hvdWxkIGltcGxlbWVudAotdGhpcyBoYW5kbGVyIGJ5IHJldHVybmluZyBhIG5ldyByZWZlcmVuY2UgdG8gdGhlbXNlbHZlcywgYW5kIHNob3VsZAotYWxzbyBpbXBsZW1lbnQgdGhlIFxjb2Rle3RwX2l0ZXJuZXh0fSBoYW5kbGVyLiAgRmlsZSBvYmplY3RzIGFyZSBhbgotZXhhbXBsZSBvZiBzdWNoIGFuIGl0ZXJhdG9yLgotCi1JdGVyYXRvciBvYmplY3RzIHNob3VsZCBpbXBsZW1lbnQgYm90aCBoYW5kbGVycy4gIFRoZSBcY29kZXt0cF9pdGVyfQotaGFuZGxlciBzaG91bGQgcmV0dXJuIGEgbmV3IHJlZmVyZW5jZSB0byB0aGUgaXRlcmF0b3IgKHRoaXMgaXMgdGhlCi1zYW1lIGFzIHRoZSBcY29kZXt0cF9pdGVyfSBoYW5kbGVyIGZvciBvYmplY3RzIHdoaWNoIGNhbiBvbmx5IGJlCi1pdGVyYXRlZCBvdmVyIGRlc3RydWN0aXZlbHkpLiAgVGhlIFxjb2Rle3RwX2l0ZXJuZXh0fSBoYW5kbGVyIHNob3VsZAotcmV0dXJuIGEgbmV3IHJlZmVyZW5jZSB0byB0aGUgbmV4dCBvYmplY3QgaW4gdGhlIGl0ZXJhdGlvbiBpZiB0aGVyZSBpcwotb25lLiAgSWYgdGhlIGl0ZXJhdGlvbiBoYXMgcmVhY2hlZCB0aGUgZW5kLCBpdCBtYXkgcmV0dXJuIFxOVUxMe30KLXdpdGhvdXQgc2V0dGluZyBhbiBleGNlcHRpb24gb3IgaXQgbWF5IHNldCBcZXhjZXB0aW9ue1N0b3BJdGVyYXRpb259OwotYXZvaWRpbmcgdGhlIGV4Y2VwdGlvbiBjYW4geWllbGQgc2xpZ2h0bHkgYmV0dGVyIHBlcmZvcm1hbmNlLiAgSWYgYW4KLWFjdHVhbCBlcnJvciBvY2N1cnMsIGl0IHNob3VsZCBzZXQgYW4gZXhjZXB0aW9uIGFuZCByZXR1cm4gXE5VTEwuCi0KLQotXHN1YnNlY3Rpb257V2VhayBSZWZlcmVuY2UgU3VwcG9ydFxsYWJlbHt3ZWFrcmVmLXN1cHBvcnR9fQotCi1PbmUgb2YgdGhlIGdvYWxzIG9mIFB5dGhvbidzIHdlYWstcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGlzIHRvIGFsbG93Ci1hbnkgdHlwZSB0byBwYXJ0aWNpcGF0ZSBpbiB0aGUgd2VhayByZWZlcmVuY2UgbWVjaGFuaXNtIHdpdGhvdXQKLWluY3VycmluZyB0aGUgb3ZlcmhlYWQgb24gdGhvc2Ugb2JqZWN0cyB3aGljaCBkbyBub3QgYmVuZWZpdCBieSB3ZWFrCi1yZWZlcmVuY2luZyAoc3VjaCBhcyBudW1iZXJzKS4KLQotRm9yIGFuIG9iamVjdCB0byBiZSB3ZWFrbHkgcmVmZXJlbmNhYmxlLCB0aGUgZXh0ZW5zaW9uIG11c3QgaW5jbHVkZSBhCi1cY3R5cGV7UHlPYmplY3QqfSBmaWVsZCBpbiB0aGUgaW5zdGFuY2Ugc3RydWN0dXJlIGZvciB0aGUgdXNlIG9mIHRoZQotd2VhayByZWZlcmVuY2UgbWVjaGFuaXNtOyBpdCBtdXN0IGJlIGluaXRpYWxpemVkIHRvIFxOVUxMe30gYnkgdGhlCi1vYmplY3QncyBjb25zdHJ1Y3Rvci4gIEl0IG11c3QgYWxzbyBzZXQgdGhlIFxtZW1iZXJ7dHBfd2Vha2xpc3RvZmZzZXR9Ci1maWVsZCBvZiB0aGUgY29ycmVzcG9uZGluZyB0eXBlIG9iamVjdCB0byB0aGUgb2Zmc2V0IG9mIHRoZSBmaWVsZC4KLUZvciBleGFtcGxlLCB0aGUgaW5zdGFuY2UgdHlwZSBpcyBkZWZpbmVkIHdpdGggdGhlIGZvbGxvd2luZwotc3RydWN0dXJlOgotCi1cYmVnaW57dmVyYmF0aW19Ci10eXBlZGVmIHN0cnVjdCB7Ci0gICAgUHlPYmplY3RfSEVBRAotICAgIFB5Q2xhc3NPYmplY3QgKmluX2NsYXNzOyAgICAgICAvKiBUaGUgY2xhc3Mgb2JqZWN0ICovCi0gICAgUHlPYmplY3QgICAgICAqaW5fZGljdDsgICAgICAgIC8qIEEgZGljdGlvbmFyeSAqLwotICAgIFB5T2JqZWN0ICAgICAgKmluX3dlYWtyZWZsaXN0OyAvKiBMaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyAqLwotfSBQeUluc3RhbmNlT2JqZWN0OwotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIHN0YXRpY2FsbHktZGVjbGFyZWQgdHlwZSBvYmplY3QgZm9yIGluc3RhbmNlcyBpcyBkZWZpbmVkIHRoaXMgd2F5OgotCi1cYmVnaW57dmVyYmF0aW19Ci1QeVR5cGVPYmplY3QgUHlJbnN0YW5jZV9UeXBlID0gewotICAgIFB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCi0gICAgMCwKLSAgICAibW9kdWxlLmluc3RhbmNlIiwKLQotICAgIC8qIExvdHMgb2Ygc3R1ZmYgb21pdHRlZCBmb3IgYnJldml0eS4uLiAqLwotCi0gICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCi0gICAgb2Zmc2V0b2YoUHlJbnN0YW5jZU9iamVjdCwgaW5fd2Vha3JlZmxpc3QpLCAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotfTsKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSB0eXBlIGNvbnN0cnVjdG9yIGlzIHJlc3BvbnNpYmxlIGZvciBpbml0aWFsaXppbmcgdGhlIHdlYWsgcmVmZXJlbmNlCi1saXN0IHRvIFxOVUxMOgotCi1cYmVnaW57dmVyYmF0aW19Ci1zdGF0aWMgUHlPYmplY3QgKgotaW5zdGFuY2VfbmV3KCkgewotICAgIC8qIE90aGVyIGluaXRpYWxpemF0aW9uIHN0dWZmIG9taXR0ZWQgZm9yIGJyZXZpdHkgKi8KLQotICAgIHNlbGYtPmluX3dlYWtyZWZsaXN0ID0gTlVMTDsKLQotICAgIHJldHVybiAoUHlPYmplY3QgKikgc2VsZjsKLX0KLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBvbmx5IGZ1cnRoZXIgYWRkaXRpb24gaXMgdGhhdCB0aGUgZGVzdHJ1Y3RvciBuZWVkcyB0byBjYWxsIHRoZQotd2VhayByZWZlcmVuY2UgbWFuYWdlciB0byBjbGVhciBhbnkgd2VhayByZWZlcmVuY2VzLiAgVGhpcyBzaG91bGQgYmUKLWRvbmUgYmVmb3JlIGFueSBvdGhlciBwYXJ0cyBvZiB0aGUgZGVzdHJ1Y3Rpb24gaGF2ZSBvY2N1cnJlZCwgYnV0IGlzCi1vbmx5IHJlcXVpcmVkIGlmIHRoZSB3ZWFrIHJlZmVyZW5jZSBsaXN0IGlzIG5vbi1cTlVMTDoKLQotXGJlZ2lue3ZlcmJhdGltfQotc3RhdGljIHZvaWQKLWluc3RhbmNlX2RlYWxsb2MoUHlJbnN0YW5jZU9iamVjdCAqaW5zdCkKLXsKLSAgICAvKiBBbGxvY2F0ZSB0ZW1wb3JhcmllcyBpZiBuZWVkZWQsIGJ1dCBkbyBub3QgYmVnaW4KLSAgICAgICBkZXN0cnVjdGlvbiBqdXN0IHlldC4KLSAgICAgKi8KLQotICAgIGlmIChpbnN0LT5pbl93ZWFrcmVmbGlzdCAhPSBOVUxMKQotICAgICAgICBQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKSBpbnN0KTsKLQotICAgIC8qIFByb2NlZWQgd2l0aCBvYmplY3QgZGVzdHJ1Y3Rpb24gbm9ybWFsbHkuICovCi19Ci1cZW5ke3ZlcmJhdGltfQotCi0KLVxzdWJzZWN0aW9ue01vcmUgU3VnZ2VzdGlvbnN9Ci0KLVJlbWVtYmVyIHRoYXQgeW91IGNhbiBvbWl0IG1vc3Qgb2YgdGhlc2UgZnVuY3Rpb25zLCBpbiB3aGljaCBjYXNlIHlvdQotcHJvdmlkZSBcY29kZXswfSBhcyBhIHZhbHVlLiAgVGhlcmUgYXJlIHR5cGUgZGVmaW5pdGlvbnMgZm9yIGVhY2ggb2YKLXRoZSBmdW5jdGlvbnMgeW91IG11c3QgcHJvdmlkZS4gIFRoZXkgYXJlIGluIFxmaWxle29iamVjdC5ofSBpbiB0aGUKLVB5dGhvbiBpbmNsdWRlIGRpcmVjdG9yeSB0aGF0IGNvbWVzIHdpdGggdGhlIHNvdXJjZSBkaXN0cmlidXRpb24gb2YKLVB5dGhvbi4KLQotSW4gb3JkZXIgdG8gbGVhcm4gaG93IHRvIGltcGxlbWVudCBhbnkgc3BlY2lmaWMgbWV0aG9kIGZvciB5b3VyIG5ldwotZGF0YSB0eXBlLCBkbyB0aGUgZm9sbG93aW5nOiBEb3dubG9hZCBhbmQgdW5wYWNrIHRoZSBQeXRob24gc291cmNlCi1kaXN0cmlidXRpb24uICBHbyB0aGUgXGZpbGV7T2JqZWN0c30gZGlyZWN0b3J5LCB0aGVuIHNlYXJjaCB0aGUKLUMgc291cmNlIGZpbGVzIGZvciBcY29kZXt0cF99IHBsdXMgdGhlIGZ1bmN0aW9uIHlvdSB3YW50IChmb3IKLWV4YW1wbGUsIFxjb2Rle3RwX2NvbXBhcmV9KS4gIFlvdSB3aWxsIGZpbmQKLWV4YW1wbGVzIG9mIHRoZSBmdW5jdGlvbiB5b3Ugd2FudCB0byBpbXBsZW1lbnQuCi0KLVdoZW4geW91IG5lZWQgdG8gdmVyaWZ5IHRoYXQgYW4gb2JqZWN0IGlzIGFuIGluc3RhbmNlIG9mIHRoZSB0eXBlCi15b3UgYXJlIGltcGxlbWVudGluZywgdXNlIHRoZSBcY2Z1bmN0aW9ue1B5T2JqZWN0X1R5cGVDaGVja30gZnVuY3Rpb24uCi1BIHNhbXBsZSBvZiBpdHMgdXNlIG1pZ2h0IGJlIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmc6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICBpZiAoISBQeU9iamVjdF9UeXBlQ2hlY2soc29tZV9vYmplY3QsICZNeVR5cGUpKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhcmcgIzEgbm90IGEgbXl0aGluZyIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci1cZW5ke3ZlcmJhdGltfQpkaWZmIC0tZ2l0IGEvRG9jL2V4dC9ub2RkeS5jIGIvRG9jL2V4dC9ub2RkeS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzJkNjY5Li4wMDAwMDAwCi0tLSBhL0RvYy9leHQvbm9kZHkuYworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLSNpbmNsdWRlIDxQeXRob24uaD4KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFB5T2JqZWN0X0hFQUQKLSAgICAvKiBUeXBlLXNwZWNpZmljIGZpZWxkcyBnbyBoZXJlLiAqLwotfSBub2RkeV9Ob2RkeU9iamVjdDsKLQotc3RhdGljIFB5VHlwZU9iamVjdCBub2RkeV9Ob2RkeVR5cGUgPSB7Ci0gICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KLSAgICAibm9kZHkuTm9kZHkiLCAgICAgICAgICAgICAvKnRwX25hbWUqLwotICAgIHNpemVvZihub2RkeV9Ob2RkeU9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RlYWxsb2MqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLwotICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgIC8qdHBfZmxhZ3MqLwotICAgICJOb2RkeSBvYmplY3RzIiwgICAgICAgICAgIC8qIHRwX2RvYyAqLwotfTsKLQotc3RhdGljIFB5TWV0aG9kRGVmIG5vZGR5X21ldGhvZHNbXSA9IHsKLSAgICB7TlVMTH0gIC8qIFNlbnRpbmVsICovCi19OwotCi0jaWZuZGVmIFB5TU9ESU5JVF9GVU5DCS8qIGRlY2xhcmF0aW9ucyBmb3IgRExMIGltcG9ydC9leHBvcnQgKi8KLSNkZWZpbmUgUHlNT0RJTklUX0ZVTkMgdm9pZAotI2VuZGlmCi1QeU1PRElOSVRfRlVOQwotaW5pdG5vZGR5KHZvaWQpIAotewotICAgIFB5T2JqZWN0KiBtOwotCi0gICAgbm9kZHlfTm9kZHlUeXBlLnRwX25ldyA9IFB5VHlwZV9HZW5lcmljTmV3OwotICAgIGlmIChQeVR5cGVfUmVhZHkoJm5vZGR5X05vZGR5VHlwZSkgPCAwKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtID0gUHlfSW5pdE1vZHVsZTMoIm5vZGR5Iiwgbm9kZHlfbWV0aG9kcywKLSAgICAgICAgICAgICAgICAgICAgICAgIkV4YW1wbGUgbW9kdWxlIHRoYXQgY3JlYXRlcyBhbiBleHRlbnNpb24gdHlwZS4iKTsKLQotICAgIFB5X0lOQ1JFRigmbm9kZHlfTm9kZHlUeXBlKTsKLSAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIk5vZGR5IiwgKFB5T2JqZWN0ICopJm5vZGR5X05vZGR5VHlwZSk7Ci19CmRpZmYgLS1naXQgYS9Eb2MvZXh0L25vZGR5Mi5jIGIvRG9jL2V4dC9ub2RkeTIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNhZjk4NS4uMDAwMDAwMAotLS0gYS9Eb2MvZXh0L25vZGR5Mi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLSNpbmNsdWRlIDxQeXRob24uaD4KLSNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFB5T2JqZWN0X0hFQUQKLSAgICBQeU9iamVjdCAqZmlyc3Q7IC8qIGZpcnN0IG5hbWUgKi8KLSAgICBQeU9iamVjdCAqbGFzdDsgIC8qIGxhc3QgbmFtZSAqLwotICAgIGludCBudW1iZXI7Ci19IE5vZGR5OwotCi1zdGF0aWMgdm9pZAotTm9kZHlfZGVhbGxvYyhOb2RkeSogc2VsZikKLXsKLSAgICBQeV9YREVDUkVGKHNlbGYtPmZpcnN0KTsKLSAgICBQeV9YREVDUkVGKHNlbGYtPmxhc3QpOwotICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLU5vZGR5X25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKLXsKLSAgICBOb2RkeSAqc2VsZjsKLQotICAgIHNlbGYgPSAoTm9kZHkgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLSAgICBpZiAoc2VsZiAhPSBOVUxMKSB7Ci0gICAgICAgIHNlbGYtPmZpcnN0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7Ci0gICAgICAgIGlmIChzZWxmLT5maXJzdCA9PSBOVUxMKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHNlbGYtPmxhc3QgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKLSAgICAgICAgaWYgKHNlbGYtPmxhc3QgPT0gTlVMTCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgc2VsZi0+bnVtYmVyID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKLX0KLQotc3RhdGljIGludAotTm9kZHlfaW5pdChOb2RkeSAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQotewotICAgIFB5T2JqZWN0ICpmaXJzdD1OVUxMLCAqbGFzdD1OVUxMLCAqdG1wOwotCi0gICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJmaXJzdCIsICJsYXN0IiwgIm51bWJlciIsIE5VTEx9OwotCi0gICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8T09pIiwga3dsaXN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpcnN0LCAmbGFzdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5udW1iZXIpKQotICAgICAgICByZXR1cm4gLTE7IAotCi0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIHRtcCA9IHNlbGYtPmZpcnN0OwotICAgICAgICBQeV9JTkNSRUYoZmlyc3QpOwotICAgICAgICBzZWxmLT5maXJzdCA9IGZpcnN0OwotICAgICAgICBQeV9YREVDUkVGKHRtcCk7Ci0gICAgfQotCi0gICAgaWYgKGxhc3QpIHsKLSAgICAgICAgdG1wID0gc2VsZi0+bGFzdDsKLSAgICAgICAgUHlfSU5DUkVGKGxhc3QpOwotICAgICAgICBzZWxmLT5sYXN0ID0gbGFzdDsKLSAgICAgICAgUHlfWERFQ1JFRih0bXApOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyBQeU1lbWJlckRlZiBOb2RkeV9tZW1iZXJzW10gPSB7Ci0gICAgeyJmaXJzdCIsIFRfT0JKRUNUX0VYLCBvZmZzZXRvZihOb2RkeSwgZmlyc3QpLCAwLAotICAgICAiZmlyc3QgbmFtZSJ9LAotICAgIHsibGFzdCIsIFRfT0JKRUNUX0VYLCBvZmZzZXRvZihOb2RkeSwgbGFzdCksIDAsCi0gICAgICJsYXN0IG5hbWUifSwKLSAgICB7Im51bWJlciIsIFRfSU5ULCBvZmZzZXRvZihOb2RkeSwgbnVtYmVyKSwgMCwKLSAgICAgIm5vZGR5IG51bWJlciJ9LAotICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KLX07Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1Ob2RkeV9uYW1lKE5vZGR5KiBzZWxmKQotewotICAgIHN0YXRpYyBQeU9iamVjdCAqZm9ybWF0ID0gTlVMTDsKLSAgICBQeU9iamVjdCAqYXJncywgKnJlc3VsdDsKLQotICAgIGlmIChmb3JtYXQgPT0gTlVMTCkgewotICAgICAgICBmb3JtYXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIlcyAlcyIpOwotICAgICAgICBpZiAoZm9ybWF0ID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoc2VsZi0+Zmlyc3QgPT0gTlVMTCkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsICJmaXJzdCIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoc2VsZi0+bGFzdCA9PSBOVUxMKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgImxhc3QiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgYXJncyA9IFB5X0J1aWxkVmFsdWUoIk9PIiwgc2VsZi0+Zmlyc3QsIHNlbGYtPmxhc3QpOwotICAgIGlmIChhcmdzID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgcmVzdWx0ID0gUHlTdHJpbmdfRm9ybWF0KGZvcm1hdCwgYXJncyk7Ci0gICAgUHlfREVDUkVGKGFyZ3MpOwotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBQeU1ldGhvZERlZiBOb2RkeV9tZXRob2RzW10gPSB7Ci0gICAgeyJuYW1lIiwgKFB5Q0Z1bmN0aW9uKU5vZGR5X25hbWUsIE1FVEhfTk9BUkdTLAotICAgICAiUmV0dXJuIHRoZSBuYW1lLCBjb21iaW5pbmcgdGhlIGZpcnN0IGFuZCBsYXN0IG5hbWUiCi0gICAgfSwKLSAgICB7TlVMTH0gIC8qIFNlbnRpbmVsICovCi19OwotCi1zdGF0aWMgUHlUeXBlT2JqZWN0IE5vZGR5VHlwZSA9IHsKLSAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLwotICAgICJub2RkeS5Ob2RkeSIsICAgICAgICAgICAgIC8qdHBfbmFtZSovCi0gICAgc2l6ZW9mKE5vZGR5KSwgICAgICAgICAgICAgLyp0cF9iYXNpY3NpemUqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLwotICAgIChkZXN0cnVjdG9yKU5vZGR5X2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2ggKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHJvKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCi0gICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyp0cF9mbGFncyovCi0gICAgIk5vZGR5IG9iamVjdHMiLCAgICAgICAgICAgLyogdHBfZG9jICovCi0gICAgMCwJCSAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCi0gICAgMCwJCSAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCi0gICAgMCwJCSAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCi0gICAgMCwJCSAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0gICAgMCwJCSAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KLSAgICAwLAkJICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KLSAgICBOb2RkeV9tZXRob2RzLCAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCi0gICAgTm9kZHlfbWVtYmVycywgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLwotICAgIChpbml0cHJvYylOb2RkeV9pbml0LCAgICAgIC8qIHRwX2luaXQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLwotICAgIE5vZGR5X25ldywgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwotfTsKLQotc3RhdGljIFB5TWV0aG9kRGVmIG1vZHVsZV9tZXRob2RzW10gPSB7Ci0gICAge05VTEx9ICAvKiBTZW50aW5lbCAqLwotfTsKLQotI2lmbmRlZiBQeU1PRElOSVRfRlVOQwkvKiBkZWNsYXJhdGlvbnMgZm9yIERMTCBpbXBvcnQvZXhwb3J0ICovCi0jZGVmaW5lIFB5TU9ESU5JVF9GVU5DIHZvaWQKLSNlbmRpZgotUHlNT0RJTklUX0ZVTkMKLWluaXRub2RkeTIodm9pZCkgCi17Ci0gICAgUHlPYmplY3QqIG07Ci0KLSAgICBpZiAoUHlUeXBlX1JlYWR5KCZOb2RkeVR5cGUpIDwgMCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbSA9IFB5X0luaXRNb2R1bGUzKCJub2RkeTIiLCBtb2R1bGVfbWV0aG9kcywKLSAgICAgICAgICAgICAgICAgICAgICAgIkV4YW1wbGUgbW9kdWxlIHRoYXQgY3JlYXRlcyBhbiBleHRlbnNpb24gdHlwZS4iKTsKLQotICAgIGlmIChtID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSAgICBQeV9JTkNSRUYoJk5vZGR5VHlwZSk7Ci0gICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJOb2RkeSIsIChQeU9iamVjdCAqKSZOb2RkeVR5cGUpOwotfQpkaWZmIC0tZ2l0IGEvRG9jL2V4dC9ub2RkeTMuYyBiL0RvYy9leHQvbm9kZHkzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMjYwYWQuLjAwMDAwMDAKLS0tIGEvRG9jL2V4dC9ub2RkeTMuYworKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0jaW5jbHVkZSA8UHl0aG9uLmg+Ci0jaW5jbHVkZSAic3RydWN0bWVtYmVyLmgiCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBQeU9iamVjdF9IRUFECi0gICAgUHlPYmplY3QgKmZpcnN0OwotICAgIFB5T2JqZWN0ICpsYXN0OwotICAgIGludCBudW1iZXI7Ci19IE5vZGR5OwotCi1zdGF0aWMgdm9pZAotTm9kZHlfZGVhbGxvYyhOb2RkeSogc2VsZikKLXsKLSAgICBQeV9YREVDUkVGKHNlbGYtPmZpcnN0KTsKLSAgICBQeV9YREVDUkVGKHNlbGYtPmxhc3QpOwotICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLU5vZGR5X25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKLXsKLSAgICBOb2RkeSAqc2VsZjsKLQotICAgIHNlbGYgPSAoTm9kZHkgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLSAgICBpZiAoc2VsZiAhPSBOVUxMKSB7Ci0gICAgICAgIHNlbGYtPmZpcnN0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7Ci0gICAgICAgIGlmIChzZWxmLT5maXJzdCA9PSBOVUxMKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHNlbGYtPmxhc3QgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKLSAgICAgICAgaWYgKHNlbGYtPmxhc3QgPT0gTlVMTCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgc2VsZi0+bnVtYmVyID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKLX0KLQotc3RhdGljIGludAotTm9kZHlfaW5pdChOb2RkeSAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQotewotICAgIFB5T2JqZWN0ICpmaXJzdD1OVUxMLCAqbGFzdD1OVUxMLCAqdG1wOwotCi0gICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJmaXJzdCIsICJsYXN0IiwgIm51bWJlciIsIE5VTEx9OwotCi0gICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8U1NpIiwga3dsaXN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpcnN0LCAmbGFzdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5udW1iZXIpKQotICAgICAgICByZXR1cm4gLTE7IAotCi0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIHRtcCA9IHNlbGYtPmZpcnN0OwotICAgICAgICBQeV9JTkNSRUYoZmlyc3QpOwotICAgICAgICBzZWxmLT5maXJzdCA9IGZpcnN0OwotICAgICAgICBQeV9ERUNSRUYodG1wKTsKLSAgICB9Ci0KLSAgICBpZiAobGFzdCkgewotICAgICAgICB0bXAgPSBzZWxmLT5sYXN0OwotICAgICAgICBQeV9JTkNSRUYobGFzdCk7Ci0gICAgICAgIHNlbGYtPmxhc3QgPSBsYXN0OwotICAgICAgICBQeV9ERUNSRUYodG1wKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIFB5TWVtYmVyRGVmIE5vZGR5X21lbWJlcnNbXSA9IHsKLSAgICB7Im51bWJlciIsIFRfSU5ULCBvZmZzZXRvZihOb2RkeSwgbnVtYmVyKSwgMCwKLSAgICAgIm5vZGR5IG51bWJlciJ9LAotICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KLX07Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1Ob2RkeV9nZXRmaXJzdChOb2RkeSAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKLXsKLSAgICBQeV9JTkNSRUYoc2VsZi0+Zmlyc3QpOwotICAgIHJldHVybiBzZWxmLT5maXJzdDsKLX0KLQotc3RhdGljIGludAotTm9kZHlfc2V0Zmlyc3QoTm9kZHkgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSwgdm9pZCAqY2xvc3VyZSkKLXsKLSAgaWYgKHZhbHVlID09IE5VTEwpIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQ2Fubm90IGRlbGV0ZSB0aGUgZmlyc3QgYXR0cmlidXRlIik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIAotICBpZiAoISBQeVN0cmluZ19DaGVjayh2YWx1ZSkpIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAKLSAgICAgICAgICAgICAgICAgICAgIlRoZSBmaXJzdCBhdHRyaWJ1dGUgdmFsdWUgbXVzdCBiZSBhIHN0cmluZyIpOwotICAgIHJldHVybiAtMTsKLSAgfQotICAgICAgCi0gIFB5X0RFQ1JFRihzZWxmLT5maXJzdCk7Ci0gIFB5X0lOQ1JFRih2YWx1ZSk7Ci0gIHNlbGYtPmZpcnN0ID0gdmFsdWU7ICAgIAotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotTm9kZHlfZ2V0bGFzdChOb2RkeSAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKLXsKLSAgICBQeV9JTkNSRUYoc2VsZi0+bGFzdCk7Ci0gICAgcmV0dXJuIHNlbGYtPmxhc3Q7Ci19Ci0KLXN0YXRpYyBpbnQKLU5vZGR5X3NldGxhc3QoTm9kZHkgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSwgdm9pZCAqY2xvc3VyZSkKLXsKLSAgaWYgKHZhbHVlID09IE5VTEwpIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQ2Fubm90IGRlbGV0ZSB0aGUgbGFzdCBhdHRyaWJ1dGUiKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgCi0gIGlmICghIFB5U3RyaW5nX0NoZWNrKHZhbHVlKSkgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIAotICAgICAgICAgICAgICAgICAgICAiVGhlIGxhc3QgYXR0cmlidXRlIHZhbHVlIG11c3QgYmUgYSBzdHJpbmciKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgICAgIAotICBQeV9ERUNSRUYoc2VsZi0+bGFzdCk7Ci0gIFB5X0lOQ1JFRih2YWx1ZSk7Ci0gIHNlbGYtPmxhc3QgPSB2YWx1ZTsgICAgCi0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBQeUdldFNldERlZiBOb2RkeV9nZXRzZXRlcnNbXSA9IHsKLSAgICB7ImZpcnN0IiwgCi0gICAgIChnZXR0ZXIpTm9kZHlfZ2V0Zmlyc3QsIChzZXR0ZXIpTm9kZHlfc2V0Zmlyc3QsCi0gICAgICJmaXJzdCBuYW1lIiwKLSAgICAgTlVMTH0sCi0gICAgeyJsYXN0IiwgCi0gICAgIChnZXR0ZXIpTm9kZHlfZ2V0bGFzdCwgKHNldHRlcilOb2RkeV9zZXRsYXN0LAotICAgICAibGFzdCBuYW1lIiwKLSAgICAgTlVMTH0sCi0gICAge05VTEx9ICAvKiBTZW50aW5lbCAqLwotfTsKLQotc3RhdGljIFB5T2JqZWN0ICoKLU5vZGR5X25hbWUoTm9kZHkqIHNlbGYpCi17Ci0gICAgc3RhdGljIFB5T2JqZWN0ICpmb3JtYXQgPSBOVUxMOwotICAgIFB5T2JqZWN0ICphcmdzLCAqcmVzdWx0OwotCi0gICAgaWYgKGZvcm1hdCA9PSBOVUxMKSB7Ci0gICAgICAgIGZvcm1hdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiVzICVzIik7Ci0gICAgICAgIGlmIChmb3JtYXQgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCJPTyIsIHNlbGYtPmZpcnN0LCBzZWxmLT5sYXN0KTsKLSAgICBpZiAoYXJncyA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zvcm1hdChmb3JtYXQsIGFyZ3MpOwotICAgIFB5X0RFQ1JFRihhcmdzKTsKLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgUHlNZXRob2REZWYgTm9kZHlfbWV0aG9kc1tdID0gewotICAgIHsibmFtZSIsIChQeUNGdW5jdGlvbilOb2RkeV9uYW1lLCBNRVRIX05PQVJHUywKLSAgICAgIlJldHVybiB0aGUgbmFtZSwgY29tYmluaW5nIHRoZSBmaXJzdCBhbmQgbGFzdCBuYW1lIgotICAgIH0sCi0gICAge05VTEx9ICAvKiBTZW50aW5lbCAqLwotfTsKLQotc3RhdGljIFB5VHlwZU9iamVjdCBOb2RkeVR5cGUgPSB7Ci0gICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KLSAgICAibm9kZHkuTm9kZHkiLCAgICAgICAgICAgICAvKnRwX25hbWUqLwotICAgIHNpemVvZihOb2RkeSksICAgICAgICAgICAgIC8qdHBfYmFzaWNzaXplKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KLSAgICAoZGVzdHJ1Y3RvcilOb2RkeV9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLwotICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qdHBfZmxhZ3MqLwotICAgICJOb2RkeSBvYmplY3RzIiwgICAgICAgICAgIC8qIHRwX2RvYyAqLwotICAgIDAsCQkgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwotICAgIDAsCQkgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLwotICAgIDAsCQkgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwotICAgIDAsCQkgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotICAgIDAsCQkgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCi0gICAgMCwJCSAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCi0gICAgTm9kZHlfbWV0aG9kcywgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwotICAgIE5vZGR5X21lbWJlcnMsICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KLSAgICBOb2RkeV9nZXRzZXRlcnMsICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KLSAgICAoaW5pdHByb2MpTm9kZHlfaW5pdCwgICAgICAvKiB0cF9pbml0ICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KLSAgICBOb2RkeV9uZXcsICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KLX07Ci0KLXN0YXRpYyBQeU1ldGhvZERlZiBtb2R1bGVfbWV0aG9kc1tdID0gewotICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KLX07Ci0KLSNpZm5kZWYgUHlNT0RJTklUX0ZVTkMJLyogZGVjbGFyYXRpb25zIGZvciBETEwgaW1wb3J0L2V4cG9ydCAqLwotI2RlZmluZSBQeU1PRElOSVRfRlVOQyB2b2lkCi0jZW5kaWYKLVB5TU9ESU5JVF9GVU5DCi1pbml0bm9kZHkzKHZvaWQpIAotewotICAgIFB5T2JqZWN0KiBtOwotCi0gICAgaWYgKFB5VHlwZV9SZWFkeSgmTm9kZHlUeXBlKSA8IDApCi0gICAgICAgIHJldHVybjsKLQotICAgIG0gPSBQeV9Jbml0TW9kdWxlMygibm9kZHkzIiwgbW9kdWxlX21ldGhvZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICJFeGFtcGxlIG1vZHVsZSB0aGF0IGNyZWF0ZXMgYW4gZXh0ZW5zaW9uIHR5cGUuIik7Ci0KLSAgICBpZiAobSA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0gICAgUHlfSU5DUkVGKCZOb2RkeVR5cGUpOwotICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiTm9kZHkiLCAoUHlPYmplY3QgKikmTm9kZHlUeXBlKTsKLX0KZGlmZiAtLWdpdCBhL0RvYy9leHQvbm9kZHk0LmMgYi9Eb2MvZXh0L25vZGR5NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzhlMDg2Li4wMDAwMDAwCi0tLSBhL0RvYy9leHQvbm9kZHk0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotI2luY2x1ZGUgPFB5dGhvbi5oPgotI2luY2x1ZGUgInN0cnVjdG1lbWJlci5oIgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgUHlPYmplY3RfSEVBRAotICAgIFB5T2JqZWN0ICpmaXJzdDsKLSAgICBQeU9iamVjdCAqbGFzdDsKLSAgICBpbnQgbnVtYmVyOwotfSBOb2RkeTsKLQotc3RhdGljIGludAotTm9kZHlfdHJhdmVyc2UoTm9kZHkgKnNlbGYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQotewotICAgIGludCB2cmV0OwotCi0gICAgaWYgKHNlbGYtPmZpcnN0KSB7Ci0gICAgICAgIHZyZXQgPSB2aXNpdChzZWxmLT5maXJzdCwgYXJnKTsKLSAgICAgICAgaWYgKHZyZXQgIT0gMCkKLSAgICAgICAgICAgIHJldHVybiB2cmV0OwotICAgIH0KLSAgICBpZiAoc2VsZi0+bGFzdCkgewotICAgICAgICB2cmV0ID0gdmlzaXQoc2VsZi0+bGFzdCwgYXJnKTsKLSAgICAgICAgaWYgKHZyZXQgIT0gMCkKLSAgICAgICAgICAgIHJldHVybiB2cmV0OwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IAotTm9kZHlfY2xlYXIoTm9kZHkgKnNlbGYpCi17Ci0gICAgUHlPYmplY3QgKnRtcDsKLQotICAgIHRtcCA9IHNlbGYtPmZpcnN0OwotICAgIHNlbGYtPmZpcnN0ID0gTlVMTDsKLSAgICBQeV9YREVDUkVGKHRtcCk7Ci0KLSAgICB0bXAgPSBzZWxmLT5sYXN0OwotICAgIHNlbGYtPmxhc3QgPSBOVUxMOwotICAgIFB5X1hERUNSRUYodG1wKTsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotTm9kZHlfZGVhbGxvYyhOb2RkeSogc2VsZikKLXsKLSAgICBOb2RkeV9jbGVhcihzZWxmKTsKLSAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1Ob2RkeV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCi17Ci0gICAgTm9kZHkgKnNlbGY7Ci0KLSAgICBzZWxmID0gKE5vZGR5ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0gICAgaWYgKHNlbGYgIT0gTlVMTCkgewotICAgICAgICBzZWxmLT5maXJzdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOwotICAgICAgICBpZiAoc2VsZi0+Zmlyc3QgPT0gTlVMTCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBzZWxmLT5sYXN0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7Ci0gICAgICAgIGlmIChzZWxmLT5sYXN0ID09IE5VTEwpCi0gICAgICAgICAgewotICAgICAgICAgICAgUHlfREVDUkVGKHNlbGYpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgfQotCi0gICAgICAgIHNlbGYtPm51bWJlciA9IDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7Ci19Ci0KLXN0YXRpYyBpbnQKLU5vZGR5X2luaXQoTm9kZHkgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKLXsKLSAgICBQeU9iamVjdCAqZmlyc3Q9TlVMTCwgKmxhc3Q9TlVMTCwgKnRtcDsKLQotICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZmlyc3QiLCAibGFzdCIsICJudW1iZXIiLCBOVUxMfTsKLQotICAgIGlmICghIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifE9PaSIsIGt3bGlzdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaXJzdCwgJmxhc3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZi0+bnVtYmVyKSkKLSAgICAgICAgcmV0dXJuIC0xOyAKLQotICAgIGlmIChmaXJzdCkgewotICAgICAgICB0bXAgPSBzZWxmLT5maXJzdDsKLSAgICAgICAgUHlfSU5DUkVGKGZpcnN0KTsKLSAgICAgICAgc2VsZi0+Zmlyc3QgPSBmaXJzdDsKLSAgICAgICAgUHlfWERFQ1JFRih0bXApOwotICAgIH0KLQotICAgIGlmIChsYXN0KSB7Ci0gICAgICAgIHRtcCA9IHNlbGYtPmxhc3Q7Ci0gICAgICAgIFB5X0lOQ1JFRihsYXN0KTsKLSAgICAgICAgc2VsZi0+bGFzdCA9IGxhc3Q7Ci0gICAgICAgIFB5X1hERUNSRUYodG1wKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgUHlNZW1iZXJEZWYgTm9kZHlfbWVtYmVyc1tdID0gewotICAgIHsiZmlyc3QiLCBUX09CSkVDVF9FWCwgb2Zmc2V0b2YoTm9kZHksIGZpcnN0KSwgMCwKLSAgICAgImZpcnN0IG5hbWUifSwKLSAgICB7Imxhc3QiLCBUX09CSkVDVF9FWCwgb2Zmc2V0b2YoTm9kZHksIGxhc3QpLCAwLAotICAgICAibGFzdCBuYW1lIn0sCi0gICAgeyJudW1iZXIiLCBUX0lOVCwgb2Zmc2V0b2YoTm9kZHksIG51bWJlciksIDAsCi0gICAgICJub2RkeSBudW1iZXIifSwKLSAgICB7TlVMTH0gIC8qIFNlbnRpbmVsICovCi19OwotCi1zdGF0aWMgUHlPYmplY3QgKgotTm9kZHlfbmFtZShOb2RkeSogc2VsZikKLXsKLSAgICBzdGF0aWMgUHlPYmplY3QgKmZvcm1hdCA9IE5VTEw7Ci0gICAgUHlPYmplY3QgKmFyZ3MsICpyZXN1bHQ7Ci0KLSAgICBpZiAoZm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgZm9ybWF0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiJXMgJXMiKTsKLSAgICAgICAgaWYgKGZvcm1hdCA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKHNlbGYtPmZpcnN0ID09IE5VTEwpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCAiZmlyc3QiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKHNlbGYtPmxhc3QgPT0gTlVMTCkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsICJsYXN0Iik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCJPTyIsIHNlbGYtPmZpcnN0LCBzZWxmLT5sYXN0KTsKLSAgICBpZiAoYXJncyA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zvcm1hdChmb3JtYXQsIGFyZ3MpOwotICAgIFB5X0RFQ1JFRihhcmdzKTsKLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgUHlNZXRob2REZWYgTm9kZHlfbWV0aG9kc1tdID0gewotICAgIHsibmFtZSIsIChQeUNGdW5jdGlvbilOb2RkeV9uYW1lLCBNRVRIX05PQVJHUywKLSAgICAgIlJldHVybiB0aGUgbmFtZSwgY29tYmluaW5nIHRoZSBmaXJzdCBhbmQgbGFzdCBuYW1lIgotICAgIH0sCi0gICAge05VTEx9ICAvKiBTZW50aW5lbCAqLwotfTsKLQotc3RhdGljIFB5VHlwZU9iamVjdCBOb2RkeVR5cGUgPSB7Ci0gICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KLSAgICAibm9kZHkuTm9kZHkiLCAgICAgICAgICAgICAvKnRwX25hbWUqLwotICAgIHNpemVvZihOb2RkeSksICAgICAgICAgICAgIC8qdHBfYmFzaWNzaXplKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KLSAgICAoZGVzdHJ1Y3RvcilOb2RkeV9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLwotICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfR0MsIC8qdHBfZmxhZ3MqLwotICAgICJOb2RkeSBvYmplY3RzIiwgICAgICAgICAgIC8qIHRwX2RvYyAqLwotICAgICh0cmF2ZXJzZXByb2MpTm9kZHlfdHJhdmVyc2UsICAgLyogdHBfdHJhdmVyc2UgKi8KLSAgICAoaW5xdWlyeSlOb2RkeV9jbGVhciwgICAgICAgICAgIC8qIHRwX2NsZWFyICovCi0gICAgMCwJCSAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCi0gICAgMCwJCSAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0gICAgMCwJCSAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KLSAgICAwLAkJICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KLSAgICBOb2RkeV9tZXRob2RzLCAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCi0gICAgTm9kZHlfbWVtYmVycywgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLwotICAgIChpbml0cHJvYylOb2RkeV9pbml0LCAgICAgIC8qIHRwX2luaXQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLwotICAgIE5vZGR5X25ldywgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwotfTsKLQotc3RhdGljIFB5TWV0aG9kRGVmIG1vZHVsZV9tZXRob2RzW10gPSB7Ci0gICAge05VTEx9ICAvKiBTZW50aW5lbCAqLwotfTsKLQotI2lmbmRlZiBQeU1PRElOSVRfRlVOQwkvKiBkZWNsYXJhdGlvbnMgZm9yIERMTCBpbXBvcnQvZXhwb3J0ICovCi0jZGVmaW5lIFB5TU9ESU5JVF9GVU5DIHZvaWQKLSNlbmRpZgotUHlNT0RJTklUX0ZVTkMKLWluaXRub2RkeTQodm9pZCkgCi17Ci0gICAgUHlPYmplY3QqIG07Ci0KLSAgICBpZiAoUHlUeXBlX1JlYWR5KCZOb2RkeVR5cGUpIDwgMCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbSA9IFB5X0luaXRNb2R1bGUzKCJub2RkeTQiLCBtb2R1bGVfbWV0aG9kcywKLSAgICAgICAgICAgICAgICAgICAgICAgIkV4YW1wbGUgbW9kdWxlIHRoYXQgY3JlYXRlcyBhbiBleHRlbnNpb24gdHlwZS4iKTsKLQotICAgIGlmIChtID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSAgICBQeV9JTkNSRUYoJk5vZGR5VHlwZSk7Ci0gICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJOb2RkeSIsIChQeU9iamVjdCAqKSZOb2RkeVR5cGUpOwotfQpkaWZmIC0tZ2l0IGEvRG9jL2V4dC9ydW4tZnVuYy5jIGIvRG9jL2V4dC9ydW4tZnVuYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTdkZjBkLi4wMDAwMDAwCi0tLSBhL0RvYy9leHQvcnVuLWZ1bmMuYworKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLSNpbmNsdWRlIDxQeXRob24uaD4KLQotaW50Ci1tYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gICAgUHlPYmplY3QgKnBOYW1lLCAqcE1vZHVsZSwgKnBEaWN0LCAqcEZ1bmM7Ci0gICAgUHlPYmplY3QgKnBBcmdzLCAqcFZhbHVlOwotICAgIGludCBpOwotCi0gICAgaWYgKGFyZ2MgPCAzKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCJVc2FnZTogY2FsbCBweXRob25maWxlIGZ1bmNuYW1lIFthcmdzXVxuIik7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIFB5X0luaXRpYWxpemUoKTsKLSAgICBwTmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoYXJndlsxXSk7Ci0gICAgLyogRXJyb3IgY2hlY2tpbmcgb2YgcE5hbWUgbGVmdCBvdXQgKi8KLQotICAgIHBNb2R1bGUgPSBQeUltcG9ydF9JbXBvcnQocE5hbWUpOwotICAgIFB5X0RFQ1JFRihwTmFtZSk7Ci0KLSAgICBpZiAocE1vZHVsZSAhPSBOVUxMKSB7Ci0gICAgICAgIHBGdW5jID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhwTW9kdWxlLCBhcmd2WzJdKTsKLSAgICAgICAgLyogcEZ1bmMgaXMgYSBuZXcgcmVmZXJlbmNlICovCi0KLSAgICAgICAgaWYgKHBGdW5jICYmIFB5Q2FsbGFibGVfQ2hlY2socEZ1bmMpKSB7Ci0gICAgICAgICAgICBwQXJncyA9IFB5VHVwbGVfTmV3KGFyZ2MgLSAzKTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjIC0gMzsgKytpKSB7Ci0gICAgICAgICAgICAgICAgcFZhbHVlID0gUHlJbnRfRnJvbUxvbmcoYXRvaShhcmd2W2kgKyAzXSkpOwotICAgICAgICAgICAgICAgIGlmICghcFZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihwQXJncyk7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihwTW9kdWxlKTsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW5ub3QgY29udmVydCBhcmd1bWVudFxuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBwVmFsdWUgcmVmZXJlbmNlIHN0b2xlbiBoZXJlOiAqLwotICAgICAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbShwQXJncywgaSwgcFZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBWYWx1ZSA9IFB5T2JqZWN0X0NhbGxPYmplY3QocEZ1bmMsIHBBcmdzKTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihwQXJncyk7Ci0gICAgICAgICAgICBpZiAocFZhbHVlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIlJlc3VsdCBvZiBjYWxsOiAlbGRcbiIsIFB5SW50X0FzTG9uZyhwVmFsdWUpKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYocFZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihwRnVuYyk7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHBNb2R1bGUpOwotICAgICAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIkNhbGwgZmFpbGVkXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBmaW5kIGZ1bmN0aW9uIFwiJXNcIlxuIiwgYXJndlsyXSk7Ci0gICAgICAgIH0KLSAgICAgICAgUHlfWERFQ1JFRihwRnVuYyk7Ci0gICAgICAgIFB5X0RFQ1JFRihwTW9kdWxlKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIFB5RXJyX1ByaW50KCk7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGxvYWQgXCIlc1wiXG4iLCBhcmd2WzFdKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIFB5X0ZpbmFsaXplKCk7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9Eb2MvZXh0L3NldHVwLnB5IGIvRG9jL2V4dC9zZXR1cC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg1M2QyMy4uMDAwMDAwMAotLS0gYS9Eb2MvZXh0L3NldHVwLnB5CisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1mcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBzZXR1cCwgRXh0ZW5zaW9uCi1zZXR1cChuYW1lPSJub2RkeSIsIHZlcnNpb249IjEuMCIsCi0gICAgICBleHRfbW9kdWxlcz1bCi0gICAgICAgICBFeHRlbnNpb24oIm5vZGR5IiwgWyJub2RkeS5jIl0pLAotICAgICAgICAgRXh0ZW5zaW9uKCJub2RkeTIiLCBbIm5vZGR5Mi5jIl0pLAotICAgICAgICAgRXh0ZW5zaW9uKCJub2RkeTMiLCBbIm5vZGR5My5jIl0pLAotICAgICAgICAgRXh0ZW5zaW9uKCJub2RkeTQiLCBbIm5vZGR5NC5jIl0pLAotICAgICAgICAgXSkKZGlmZiAtLWdpdCBhL0RvYy9leHQvc2hvZGR5LmMgYi9Eb2MvZXh0L3Nob2RkeS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2E0MTc3Li4wMDAwMDAwCi0tLSBhL0RvYy9leHQvc2hvZGR5LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0jaW5jbHVkZSA8UHl0aG9uLmg+Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBQeUxpc3RPYmplY3QgbGlzdDsKLSAgICBpbnQgc3RhdGU7Ci19IFNob2RkeTsKLQotCi1zdGF0aWMgUHlPYmplY3QgKgotU2hvZGR5X2luY3JlbWVudChTaG9kZHkgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpCi17Ci0gICAgc2VsZi0+c3RhdGUrKzsKLSAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoc2VsZi0+c3RhdGUpOwotfQotCi0KLXN0YXRpYyBQeU1ldGhvZERlZiBTaG9kZHlfbWV0aG9kc1tdID0gewotICAgIHsiaW5jcmVtZW50IiwgKFB5Q0Z1bmN0aW9uKVNob2RkeV9pbmNyZW1lbnQsIE1FVEhfTk9BUkdTLAotICAgICBQeURvY19TVFIoImluY3JlbWVudCBzdGF0ZSBjb3VudGVyIil9LAotICAgIHtOVUxMLAlOVUxMfSwKLX07Ci0KLXN0YXRpYyBpbnQKLVNob2RkeV9pbml0KFNob2RkeSAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQotewotICAgIGlmIChQeUxpc3RfVHlwZS50cF9pbml0KChQeU9iamVjdCAqKXNlbGYsIGFyZ3MsIGt3ZHMpIDwgMCkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIHNlbGYtPnN0YXRlID0gMDsKLSAgICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgUHlUeXBlT2JqZWN0IFNob2RkeVR5cGUgPSB7Ci0gICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iX3NpemUgKi8KLSAgICAic2hvZGR5LlNob2RkeSIsICAgICAgICAgLyogdHBfbmFtZSAqLwotICAgIHNpemVvZihTaG9kZHkpLCAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCi0gICAgUHlfVFBGTEFHU19ERUZBVUxUIHwKLSAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgLyogdHBfZmxhZ3MgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KLSAgICBTaG9kZHlfbWV0aG9kcywgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCi0gICAgKGluaXRwcm9jKVNob2RkeV9pbml0LCAgIC8qIHRwX2luaXQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCi19OwotCi1QeU1PRElOSVRfRlVOQwotaW5pdHNob2RkeSh2b2lkKQotewotICAgIFB5T2JqZWN0ICptOwotCi0gICAgU2hvZGR5VHlwZS50cF9iYXNlID0gJlB5TGlzdF9UeXBlOwotICAgIGlmIChQeVR5cGVfUmVhZHkoJlNob2RkeVR5cGUpIDwgMCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbSA9IFB5X0luaXRNb2R1bGUzKCJzaG9kZHkiLCBOVUxMLCAiU2hvZGR5IG1vZHVsZSIpOwotICAgIGlmIChtID09IE5VTEwpCi0gICAgICAgIHJldHVybjsKLQotICAgIFB5X0lOQ1JFRigmU2hvZGR5VHlwZSk7Ci0gICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTaG9kZHkiLCAoUHlPYmplY3QgKikgJlNob2RkeVR5cGUpOwotfQpkaWZmIC0tZ2l0IGEvRG9jL2V4dC90ZXN0LnB5IGIvRG9jL2V4dC90ZXN0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWJmNDZhLi4wMDAwMDAwCi0tLSBhL0RvYy9leHQvdGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0iIiJUZXN0IG1vZHVsZSBmb3IgdGhlIG5vZGR5IGV4YW1wbGVzCi0KLU5vZGR5IDE6Ci0KLT4+PiBpbXBvcnQgbm9kZHkKLT4+PiBuMSA9IG5vZGR5Lk5vZGR5KCkKLT4+PiBuMiA9IG5vZGR5Lk5vZGR5KCkKLT4+PiBkZWwgbjEKLT4+PiBkZWwgbjIKLQotCi1Ob2RkeSAyCi0KLT4+PiBpbXBvcnQgbm9kZHkyCi0+Pj4gbjEgPSBub2RkeTIuTm9kZHkoJ2ppbScsICdmdWx0b24nLCA0MikKLT4+PiBuMS5maXJzdAotJ2ppbScKLT4+PiBuMS5sYXN0Ci0nZnVsdG9uJwotPj4+IG4xLm51bWJlcgotNDIKLT4+PiBuMS5uYW1lKCkKLSdqaW0gZnVsdG9uJwotPj4+IG4xLmZpcnN0ID0gJ3dpbGwnCi0+Pj4gbjEubmFtZSgpCi0nd2lsbCBmdWx0b24nCi0+Pj4gbjEubGFzdCA9ICd0ZWxsJwotPj4+IG4xLm5hbWUoKQotJ3dpbGwgdGVsbCcKLT4+PiBkZWwgbjEuZmlyc3QKLT4+PiBuMS5uYW1lKCkKLVRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLS4uLgotQXR0cmlidXRlRXJyb3I6IGZpcnN0Ci0+Pj4gbjEuZmlyc3QKLVRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLS4uLgotQXR0cmlidXRlRXJyb3I6IGZpcnN0Ci0+Pj4gbjEuZmlyc3QgPSAnZHJldycKLT4+PiBuMS5maXJzdAotJ2RyZXcnCi0+Pj4gZGVsIG4xLm51bWJlcgotVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotLi4uCi1UeXBlRXJyb3I6IGNhbid0IGRlbGV0ZSBudW1lcmljL2NoYXIgYXR0cmlidXRlCi0+Pj4gbjEubnVtYmVyPTIKLT4+PiBuMS5udW1iZXIKLTIKLT4+PiBuMS5maXJzdCA9IDQyCi0+Pj4gbjEubmFtZSgpCi0nNDIgdGVsbCcKLT4+PiBuMiA9IG5vZGR5Mi5Ob2RkeSgpCi0+Pj4gbjIubmFtZSgpCi0nICcKLT4+PiBuMi5maXJzdAotJycKLT4+PiBuMi5sYXN0Ci0nJwotPj4+IGRlbCBuMi5maXJzdAotPj4+IG4yLmZpcnN0Ci1UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0uLi4KLUF0dHJpYnV0ZUVycm9yOiBmaXJzdAotPj4+IG4yLmZpcnN0Ci1UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0uLi4KLUF0dHJpYnV0ZUVycm9yOiBmaXJzdAotPj4+IG4yLm5hbWUoKQotVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/Ci1BdHRyaWJ1dGVFcnJvcjogZmlyc3QKLT4+PiBuMi5udW1iZXIKLTAKLT4+PiBuMyA9IG5vZGR5Mi5Ob2RkeSgnamltJywgJ2Z1bHRvbicsICd3YWFhJykKLVRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLSAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwotVHlwZUVycm9yOiBhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkCi0+Pj4gZGVsIG4xCi0+Pj4gZGVsIG4yCi0KLQotTm9kZHkgMwotCi0+Pj4gaW1wb3J0IG5vZGR5MwotPj4+IG4xID0gbm9kZHkzLk5vZGR5KCdqaW0nLCAnZnVsdG9uJywgNDIpCi0+Pj4gbjEgPSBub2RkeTMuTm9kZHkoJ2ppbScsICdmdWx0b24nLCA0MikKLT4+PiBuMS5uYW1lKCkKLSdqaW0gZnVsdG9uJwotPj4+IGRlbCBuMS5maXJzdAotVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/Ci1UeXBlRXJyb3I6IENhbm5vdCBkZWxldGUgdGhlIGZpcnN0IGF0dHJpYnV0ZQotPj4+IG4xLmZpcnN0ID0gNDIKLVRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLSAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwotVHlwZUVycm9yOiBUaGUgZmlyc3QgYXR0cmlidXRlIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcKLT4+PiBuMS5maXJzdCA9ICd3aWxsJwotPj4+IG4xLm5hbWUoKQotJ3dpbGwgZnVsdG9uJwotPj4+IG4yID0gbm9kZHkzLk5vZGR5KCkKLT4+PiBuMiA9IG5vZGR5My5Ob2RkeSgpCi0+Pj4gbjIgPSBub2RkeTMuTm9kZHkoKQotPj4+IG4zID0gbm9kZHkzLk5vZGR5KCdqaW0nLCAnZnVsdG9uJywgJ3dhYWEnKQotVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/Ci1UeXBlRXJyb3I6IGFuIGludGVnZXIgaXMgcmVxdWlyZWQKLT4+PiBkZWwgbjEKLT4+PiBkZWwgbjIKLQotTm9kZHkgNAotCi0+Pj4gaW1wb3J0IG5vZGR5NAotPj4+IG4xID0gbm9kZHk0Lk5vZGR5KCdqaW0nLCAnZnVsdG9uJywgNDIpCi0+Pj4gbjEuZmlyc3QKLSdqaW0nCi0+Pj4gbjEubGFzdAotJ2Z1bHRvbicKLT4+PiBuMS5udW1iZXIKLTQyCi0+Pj4gbjEubmFtZSgpCi0namltIGZ1bHRvbicKLT4+PiBuMS5maXJzdCA9ICd3aWxsJwotPj4+IG4xLm5hbWUoKQotJ3dpbGwgZnVsdG9uJwotPj4+IG4xLmxhc3QgPSAndGVsbCcKLT4+PiBuMS5uYW1lKCkKLSd3aWxsIHRlbGwnCi0+Pj4gZGVsIG4xLmZpcnN0Ci0+Pj4gbjEubmFtZSgpCi1UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0uLi4KLUF0dHJpYnV0ZUVycm9yOiBmaXJzdAotPj4+IG4xLmZpcnN0Ci1UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0uLi4KLUF0dHJpYnV0ZUVycm9yOiBmaXJzdAotPj4+IG4xLmZpcnN0ID0gJ2RyZXcnCi0+Pj4gbjEuZmlyc3QKLSdkcmV3JwotPj4+IGRlbCBuMS5udW1iZXIKLVRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLS4uLgotVHlwZUVycm9yOiBjYW4ndCBkZWxldGUgbnVtZXJpYy9jaGFyIGF0dHJpYnV0ZQotPj4+IG4xLm51bWJlcj0yCi0+Pj4gbjEubnVtYmVyCi0yCi0+Pj4gbjEuZmlyc3QgPSA0MgotPj4+IG4xLm5hbWUoKQotJzQyIHRlbGwnCi0+Pj4gbjIgPSBub2RkeTQuTm9kZHkoKQotPj4+IG4yID0gbm9kZHk0Lk5vZGR5KCkKLT4+PiBuMiA9IG5vZGR5NC5Ob2RkeSgpCi0+Pj4gbjIgPSBub2RkeTQuTm9kZHkoKQotPj4+IG4yLm5hbWUoKQotJyAnCi0+Pj4gbjIuZmlyc3QKLScnCi0+Pj4gbjIubGFzdAotJycKLT4+PiBkZWwgbjIuZmlyc3QKLT4+PiBuMi5maXJzdAotVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotLi4uCi1BdHRyaWJ1dGVFcnJvcjogZmlyc3QKLT4+PiBuMi5maXJzdAotVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotLi4uCi1BdHRyaWJ1dGVFcnJvcjogZmlyc3QKLT4+PiBuMi5uYW1lKCkKLVRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLSAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwotQXR0cmlidXRlRXJyb3I6IGZpcnN0Ci0+Pj4gbjIubnVtYmVyCi0wCi0+Pj4gbjMgPSBub2RkeTQuTm9kZHkoJ2ppbScsICdmdWx0b24nLCAnd2FhYScpCi1UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KLVR5cGVFcnJvcjogYW4gaW50ZWdlciBpcyByZXF1aXJlZAotCi0KLVRlc3QgY3ljbGljIGdjKD8pCi0KLT4+PiBpbXBvcnQgZ2MKLT4+PiBnYy5kaXNhYmxlKCkKLQotPj4+IHggPSBbXQotPj4+IGwgPSBbeF0KLT4+PiBuMi5maXJzdCA9IGwKLT4+PiBuMi5maXJzdAotW1tdXQotPj4+IGwuYXBwZW5kKG4yKQotPj4+IGRlbCBsCi0+Pj4gZGVsIG4xCi0+Pj4gZGVsIG4yCi0+Pj4gc3lzLmdldHJlZmNvdW50KHgpCi0zCi0+Pj4gaWdub3JlID0gZ2MuY29sbGVjdCgpCi0+Pj4gc3lzLmdldHJlZmNvdW50KHgpCi0yCi0KLT4+PiBnYy5lbmFibGUoKQotIiIiCi0KLWltcG9ydCBvcwotaW1wb3J0IHN5cwotZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgZ2V0X3BsYXRmb3JtCi1QTEFUX1NQRUMgPSAiJXMtJXMiICUgKGdldF9wbGF0Zm9ybSgpLCBzeXMudmVyc2lvblswOjNdKQotc3JjID0gb3MucGF0aC5qb2luKCJidWlsZCIsICJsaWIuJXMiICUgUExBVF9TUEVDKQotc3lzLnBhdGguYXBwZW5kKHNyYykKLQotaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgICBpbXBvcnQgZG9jdGVzdCwgX19tYWluX18KLSAgICBkb2N0ZXN0LnRlc3Rtb2QoX19tYWluX18pCmRpZmYgLS1naXQgYS9Eb2MvZXh0L3dpbmRvd3MudGV4IGIvRG9jL2V4dC93aW5kb3dzLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlkZTU0OC4uMDAwMDAwMAotLS0gYS9Eb2MvZXh0L3dpbmRvd3MudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMzIwICswLDAgQEAKLVxjaGFwdGVye0J1aWxkaW5nIEMgYW5kIFxDcHB7fSBFeHRlbnNpb25zIG9uIFdpbmRvd3MlCi0gICAgIFxsYWJlbHtidWlsZGluZy1vbi13aW5kb3dzfX0KLQotCi1UaGlzIGNoYXB0ZXIgYnJpZWZseSBleHBsYWlucyBob3cgdG8gY3JlYXRlIGEgV2luZG93cyBleHRlbnNpb24gbW9kdWxlCi1mb3IgUHl0aG9uIHVzaW5nIE1pY3Jvc29mdCBWaXN1YWwgXENwcCwgYW5kIGZvbGxvd3Mgd2l0aCBtb3JlCi1kZXRhaWxlZCBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIG9uIGhvdyBpdCB3b3Jrcy4gIFRoZSBleHBsYW5hdG9yeQotbWF0ZXJpYWwgaXMgdXNlZnVsIGZvciBib3RoIHRoZSBXaW5kb3dzIHByb2dyYW1tZXIgbGVhcm5pbmcgdG8gYnVpbGQKLVB5dGhvbiBleHRlbnNpb25zIGFuZCB0aGUgXFVOSVh7fSBwcm9ncmFtbWVyIGludGVyZXN0ZWQgaW4gcHJvZHVjaW5nCi1zb2Z0d2FyZSB3aGljaCBjYW4gYmUgc3VjY2Vzc2Z1bGx5IGJ1aWx0IG9uIGJvdGggXFVOSVh7fSBhbmQgV2luZG93cy4KLQotTW9kdWxlIGF1dGhvcnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIHRoZSBkaXN0dXRpbHMgYXBwcm9hY2ggZm9yCi1idWlsZGluZyBleHRlbnNpb24gbW9kdWxlcywgaW5zdGVhZCBvZiB0aGUgb25lIGRlc2NyaWJlZCBpbiB0aGlzCi1zZWN0aW9uLiBZb3Ugd2lsbCBzdGlsbCBuZWVkIHRoZSBDIGNvbXBpbGVyIHRoYXQgd2FzIHVzZWQgdG8gYnVpbGQKLVB5dGhvbjsgdHlwaWNhbGx5IE1pY3Jvc29mdCBWaXN1YWwgXENwcC4KLQotXGJlZ2lue25vdGljZX0KLSAgVGhpcyBjaGFwdGVyIG1lbnRpb25zIGEgbnVtYmVyIG9mIGZpbGVuYW1lcyB0aGF0IGluY2x1ZGUgYW4gZW5jb2RlZAotICBQeXRob24gdmVyc2lvbiBudW1iZXIuICBUaGVzZSBmaWxlbmFtZXMgYXJlIHJlcHJlc2VudGVkIHdpdGggdGhlCi0gIHZlcnNpb24gbnVtYmVyIHNob3duIGFzIFxzYW1we1hZfTsgaW4gcHJhY3RpdmUsIFxjaGFyYWN0ZXJ7WH0gd2lsbAotICBiZSB0aGUgbWFqb3IgdmVyc2lvbiBudW1iZXIgYW5kIFxjaGFyYWN0ZXJ7WX0gd2lsbCBiZSB0aGUgbWlub3IKLSAgdmVyc2lvbiBudW1iZXIgb2YgdGhlIFB5dGhvbiByZWxlYXNlIHlvdSdyZSB3b3JraW5nIHdpdGguICBGb3IKLSAgZXhhbXBsZSwgaWYgeW91IGFyZSB1c2luZyBQeXRob24gMi4yLjEsIFxzYW1we1hZfSB3aWxsIGFjdHVhbGx5IGJlCi0gIFxzYW1wezIyfS4KLVxlbmR7bm90aWNlfQotCi0KLVxzZWN0aW9ue0EgQ29va2Jvb2sgQXBwcm9hY2ggXGxhYmVse3dpbi1jb29rYm9va319Ci0KLVRoZXJlIGFyZSB0d28gYXBwcm9hY2hlcyB0byBidWlsZGluZyBleHRlbnNpb24gbW9kdWxlcyBvbiBXaW5kb3dzLAotanVzdCBhcyB0aGVyZSBhcmUgb24gXFVOSVg6IHVzZSB0aGUKLVx1bGlua3tcbW9kdWxle2Rpc3R1dGlsc319ey4uL2xpYi9tb2R1bGUtZGlzdHV0aWxzLmh0bWx9IHBhY2thZ2UgdG8KLWNvbnRyb2wgdGhlIGJ1aWxkIHByb2Nlc3MsIG9yIGRvIHRoaW5ncyBtYW51YWxseS4gIFRoZSBkaXN0dXRpbHMKLWFwcHJvYWNoIHdvcmtzIHdlbGwgZm9yIG1vc3QgZXh0ZW5zaW9uczsgZG9jdW1lbnRhdGlvbiBvbiB1c2luZwotXHVsaW5re1xtb2R1bGV7ZGlzdHV0aWxzfX17Li4vbGliL21vZHVsZS1kaXN0dXRpbHMuaHRtbH0gdG8gYnVpbGQgYW5kCi1wYWNrYWdlIGV4dGVuc2lvbiBtb2R1bGVzIGlzIGF2YWlsYWJsZSBpbgotXGNpdGV0aXRsZVsuLi9kaXN0L2Rpc3QuaHRtbF17RGlzdHJpYnV0aW5nIFB5dGhvbiBNb2R1bGVzfS4gIFRoaXMKLXNlY3Rpb24gZGVzY3JpYmVzIHRoZSBtYW51YWwgYXBwcm9hY2ggdG8gYnVpbGRpbmcgUHl0aG9uIGV4dGVuc2lvbnMKLXdyaXR0ZW4gaW4gQyBvciBcQ3BwLgotCi1UbyBidWlsZCBleHRlbnNpb25zIHVzaW5nIHRoZXNlIGluc3RydWN0aW9ucywgeW91IG5lZWQgdG8gaGF2ZSBhIGNvcHkKLW9mIHRoZSBQeXRob24gc291cmNlcyBvZiB0aGUgc2FtZSB2ZXJzaW9uIGFzIHlvdXIgaW5zdGFsbGVkIFB5dGhvbi4KLVlvdSB3aWxsIG5lZWQgTWljcm9zb2Z0IFZpc3VhbCBcQ3Bwe30gYGBEZXZlbG9wZXIgU3R1ZGlvJyc7IHByb2plY3QKLWZpbGVzIGFyZSBzdXBwbGllZCBmb3IgVlxDcHB7fSB2ZXJzaW9uIDcuMSwgYnV0IHlvdSBjYW4gdXNlIG9sZGVyCi12ZXJzaW9ucyBvZiBWXENwcC4gIE5vdGljZSB0aGF0IHlvdSBzaG91bGQgdXNlIHRoZSBzYW1lIHZlcnNpb24gb2YKLVZcQ3BwIHRoYXQgd2FzIHVzZWQgdG8gYnVpbGQgUHl0aG9uIGl0c2VsZi4gVGhlIGV4YW1wbGUgZmlsZXMKLWRlc2NyaWJlZCBoZXJlIGFyZSBkaXN0cmlidXRlZCB3aXRoIHRoZSBQeXRob24gc291cmNlcyBpbiB0aGUKLVxmaWxle1BDXHRleHRiYWNrc2xhc2ggZXhhbXBsZV9udFx0ZXh0YmFja3NsYXNofSBkaXJlY3RvcnkuCi0KLVxiZWdpbntlbnVtZXJhdGV9Ci0gIFxpdGVtCi0gIFxzdHJvbmd7Q29weSB0aGUgZXhhbXBsZSBmaWxlc31cXAotICAgIFRoZSBcZmlsZXtleGFtcGxlX250fSBkaXJlY3RvcnkgaXMgYSBzdWJkaXJlY3Rvcnkgb2YgdGhlIFxmaWxle1BDfQotICAgIGRpcmVjdG9yeSwgaW4gb3JkZXIgdG8ga2VlcCBhbGwgdGhlIFBDLXNwZWNpZmljIGZpbGVzIHVuZGVyIHRoZQotICAgIHNhbWUgZGlyZWN0b3J5IGluIHRoZSBzb3VyY2UgZGlzdHJpYnV0aW9uLiAgSG93ZXZlciwgdGhlCi0gICAgXGZpbGV7ZXhhbXBsZV9udH0gZGlyZWN0b3J5IGNhbid0IGFjdHVhbGx5IGJlIHVzZWQgZnJvbSB0aGlzCi0gICAgbG9jYXRpb24uICBZb3UgZmlyc3QgbmVlZCB0byBjb3B5IG9yIG1vdmUgaXQgdXAgb25lIGxldmVsLCBzbyB0aGF0Ci0gICAgXGZpbGV7ZXhhbXBsZV9udH0gaXMgYSBzaWJsaW5nIG9mIHRoZSBcZmlsZXtQQ30gYW5kIFxmaWxle0luY2x1ZGV9Ci0gICAgZGlyZWN0b3JpZXMuICBEbyBhbGwgeW91ciB3b3JrIGZyb20gd2l0aGluIHRoaXMgbmV3IGxvY2F0aW9uLgotCi0gIFxpdGVtCi0gIFxzdHJvbmd7T3BlbiB0aGUgcHJvamVjdH1cXAotICAgIEZyb20gVlxDcHAsIHVzZSB0aGUgXG1lbnVzZWxlY3Rpb257RmlsZSBcc3ViIE9wZW4gU29sdXRpb259Ci0gICAgZGlhbG9nIChub3QgXG1lbnVzZWxlY3Rpb257RmlsZSBcc3ViIE9wZW59ISkuICBOYXZpZ2F0ZSB0byBhbmQKLSAgICBzZWxlY3QgdGhlIGZpbGUgXGZpbGV7ZXhhbXBsZS5zbG59LCBpbiB0aGUgXGVtcGh7Y29weX0gb2YgdGhlCi0gICAgXGZpbGV7ZXhhbXBsZV9udH0gZGlyZWN0b3J5IHlvdSBtYWRlIGFib3ZlLiAgQ2xpY2sgT3Blbi4KLQotICBcaXRlbQotICBcc3Ryb25ne0J1aWxkIHRoZSBleGFtcGxlIERMTH1cXAotICAgIEluIG9yZGVyIHRvIGNoZWNrIHRoYXQgZXZlcnl0aGluZyBpcyBzZXQgdXAgcmlnaHQsIHRyeSBidWlsZGluZzoKLQotICAgIFxiZWdpbntlbnVtZXJhdGV9Ci0gICAgICBcaXRlbQotICAgICAgICBTZWxlY3QgYSBjb25maWd1cmF0aW9uLiAgVGhpcyBzdGVwIGlzIG9wdGlvbmFsLiAgQ2hvb3NlCi0gICAgICAgIFxtZW51c2VsZWN0aW9ue0J1aWxkIFxzdWIgQ29uZmlndXJhdGlvbiBNYW5hZ2VyIFxzdWIgQWN0aXZlIAotICAgICAgICBTb2x1dGlvbiBDb25maWd1cmF0aW9ufSBhbmQgc2VsZWN0IGVpdGhlciBcZ3VpbGFiZWx7UmVsZWFzZX0gCi0gICAgICAgIG9yXGd1aWxhYmVse0RlYnVnfS4gIElmIHlvdSBza2lwIHRoaXMgc3RlcCwKLSAgICAgICAgVlxDcHB7fSB3aWxsIHVzZSB0aGUgRGVidWcgY29uZmlndXJhdGlvbiBieSBkZWZhdWx0LgotCi0gICAgICBcaXRlbQotICAgICAgICBCdWlsZCB0aGUgRExMLiAgQ2hvb3NlIFxtZW51c2VsZWN0aW9ue0J1aWxkIFxzdWIgQnVpbGQKLSAgICAgICAgU29sdXRpb259LiAgVGhpcyBjcmVhdGVzIGFsbCBpbnRlcm1lZGlhdGUgYW5kIHJlc3VsdCBmaWxlcyBpbgotICAgICAgICBhIHN1YmRpcmVjdG9yeSBjYWxsZWQgZWl0aGVyIFxmaWxle0RlYnVnfSBvciBcZmlsZXtSZWxlYXNlfSwKLSAgICAgICAgZGVwZW5kaW5nIG9uIHdoaWNoIGNvbmZpZ3VyYXRpb24geW91IHNlbGVjdGVkIGluIHRoZSBwcmVjZWRpbmcKLSAgICAgICAgc3RlcC4KLSAgICBcZW5ke2VudW1lcmF0ZX0KLQotICBcaXRlbQotICBcc3Ryb25ne1Rlc3RpbmcgdGhlIGRlYnVnLW1vZGUgRExMfVxcCi0gICAgT25jZSB0aGUgRGVidWcgYnVpbGQgaGFzIHN1Y2NlZWRlZCwgYnJpbmcgdXAgYSBET1MgYm94LCBhbmQgY2hhbmdlCi0gICAgdG8gdGhlIFxmaWxle2V4YW1wbGVfbnRcdGV4dGJhY2tzbGFzaCBEZWJ1Z30gZGlyZWN0b3J5LiAgWW91Ci0gICAgc2hvdWxkIG5vdyBiZSBhYmxlIHRvIHJlcGVhdCB0aGUgZm9sbG93aW5nIHNlc3Npb24gKFxjb2Rle0M+fSBpcwotICAgIHRoZSBET1MgcHJvbXB0LCBcY29kZXs+Pj59IGlzIHRoZSBQeXRob24gcHJvbXB0OyBub3RlIHRoYXQKLSAgICBidWlsZCBpbmZvcm1hdGlvbiBhbmQgdmFyaW91cyBkZWJ1ZyBvdXRwdXQgZnJvbSBQeXRob24gbWF5IG5vdAotICAgIG1hdGNoIHRoaXMgc2NyZWVuIGR1bXAgZXhhY3RseSk6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLUM+Li5cLi5cUENidWlsZFxweXRob25fZAotQWRkaW5nIHBhcnNlciBhY2NlbGVyYXRvcnMgLi4uCi1Eb25lLgotUHl0aG9uIDIuMiAoIzI4LCBEZWMgMTkgMjAwMSwgMjM6MjY6MzcpIFtNU0MgMzIgYml0IChJbnRlbCldIG9uIHdpbjMyCi1UeXBlICJjb3B5cmlnaHQiLCAiY3JlZGl0cyIgb3IgImxpY2Vuc2UiIGZvciBtb3JlIGluZm9ybWF0aW9uLgotPj4+IGltcG9ydCBleGFtcGxlCi1bNDg5NyByZWZzXQotPj4+IGV4YW1wbGUuZm9vKCkKLUhlbGxvLCB3b3JsZAotWzQ5MDMgcmVmc10KLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotICAgIENvbmdyYXR1bGF0aW9ucyEgIFlvdSd2ZSBzdWNjZXNzZnVsbHkgYnVpbHQgeW91ciBmaXJzdCBQeXRob24KLSAgICBleHRlbnNpb24gbW9kdWxlLgotCi0gIFxpdGVtCi0gIFxzdHJvbmd7Q3JlYXRpbmcgeW91ciBvd24gcHJvamVjdH1cXAotICAgIENob29zZSBhIG5hbWUgYW5kIGNyZWF0ZSBhIGRpcmVjdG9yeSBmb3IgaXQuICBDb3B5IHlvdXIgQyBzb3VyY2VzCi0gICAgaW50byBpdC4gIE5vdGUgdGhhdCB0aGUgbW9kdWxlIHNvdXJjZSBmaWxlIG5hbWUgZG9lcyBub3QKLSAgICBuZWNlc3NhcmlseSBoYXZlIHRvIG1hdGNoIHRoZSBtb2R1bGUgbmFtZSwgYnV0IHRoZSBuYW1lIG9mIHRoZQotICAgIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIHNob3VsZCBtYXRjaCB0aGUgbW9kdWxlIG5hbWUgLS0tIHlvdSBjYW4KLSAgICBvbmx5IGltcG9ydCBhIG1vZHVsZSBcbW9kdWxle3NwYW19IGlmIGl0cyBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgotICAgIGlzIGNhbGxlZCBcY2Z1bmN0aW9ue2luaXRzcGFtKCl9LCBhbmQgaXQgc2hvdWxkIGNhbGwKLSAgICBcY2Z1bmN0aW9ue1B5X0luaXRNb2R1bGUoKX0gd2l0aCB0aGUgc3RyaW5nIFxjb2RleyJzcGFtIn0gYXMgaXRzCi0gICAgZmlyc3QgYXJndW1lbnQgKHVzZSB0aGUgbWluaW1hbCBcZmlsZXtleGFtcGxlLmN9IGluIHRoaXMgZGlyZWN0b3J5Ci0gICAgYXMgYSBndWlkZSkuICBCeSBjb252ZW50aW9uLCBpdCBsaXZlcyBpbiBhIGZpbGUgY2FsbGVkCi0gICAgXGZpbGV7c3BhbS5jfSBvciBcZmlsZXtzcGFtbW9kdWxlLmN9LiAgVGhlIG91dHB1dCBmaWxlIHNob3VsZCBiZQotICAgIGNhbGxlZCBcZmlsZXtzcGFtLmRsbH0gb3IgXGZpbGV7c3BhbS5weWR9ICh0aGUgbGF0dGVyIGlzIHN1cHBvcnRlZAotICAgIHRvIGF2b2lkIGNvbmZ1c2lvbiB3aXRoIGEgc3lzdGVtIGxpYnJhcnkgXGZpbGV7c3BhbS5kbGx9IHRvIHdoaWNoCi0gICAgeW91ciBtb2R1bGUgY291bGQgYmUgYSBQeXRob24gaW50ZXJmYWNlKSBpbiBSZWxlYXNlIG1vZGUsIG9yCi0gICAgXGZpbGV7c3BhbV9kLmRsbH0gb3IgXGZpbGV7c3BhbV9kLnB5ZH0gaW4gRGVidWcgbW9kZS4KLQotICAgIE5vdyB5b3VyIG9wdGlvbnMgYXJlOgotCi0gICAgXGJlZ2lue2VudW1lcmF0ZX0KLSAgICAgIFxpdGVtICBDb3B5IFxmaWxle2V4YW1wbGUuc2xufSBhbmQgXGZpbGV7ZXhhbXBsZS52Y3Byb2p9LCByZW5hbWUKLSAgICAgICAgICAgICB0aGVtIHRvIFxmaWxle3NwYW0uKn0sIGFuZCBlZGl0IHRoZW0gYnkgaGFuZCwgb3IKLSAgICAgIFxpdGVtICBDcmVhdGUgYSBicmFuZCBuZXcgcHJvamVjdDsgaW5zdHJ1Y3Rpb25zIGFyZSBiZWxvdy4KLSAgICBcZW5ke2VudW1lcmF0ZX0KLQotICAgIEluIGVpdGhlciBjYXNlLCBjb3B5IFxmaWxle2V4YW1wbGVfbnRcdGV4dGJhY2tzbGFzaCBleGFtcGxlLmRlZn0KLSAgICB0byBcZmlsZXtzcGFtXHRleHRiYWNrc2xhc2ggc3BhbS5kZWZ9LCBhbmQgZWRpdCB0aGUgbmV3Ci0gICAgXGZpbGV7c3BhbS5kZWZ9IHNvIGl0cyBzZWNvbmQgbGluZSBjb250YWlucyB0aGUgc3RyaW5nCi0gICAgYFxjb2Rle2luaXRzcGFtfScuICBJZiB5b3UgY3JlYXRlZCBhIG5ldyBwcm9qZWN0IHlvdXJzZWxmLCBhZGQgdGhlCi0gICAgZmlsZSBcZmlsZXtzcGFtLmRlZn0gdG8gdGhlIHByb2plY3Qgbm93LiAgKFRoaXMgaXMgYW4gYW5ub3lpbmcKLSAgICBsaXR0bGUgZmlsZSB3aXRoIG9ubHkgdHdvIGxpbmVzLiAgQW4gYWx0ZXJuYXRpdmUgYXBwcm9hY2ggaXMgdG8KLSAgICBmb3JnZXQgYWJvdXQgdGhlIFxmaWxley5kZWZ9IGZpbGUsIGFuZCBhZGQgdGhlIG9wdGlvbgotICAgIFxwcm9ncmFtb3B0ey9leHBvcnQ6aW5pdHNwYW19IHNvbWV3aGVyZSB0byB0aGUgTGluayBzZXR0aW5ncywgYnkKLSAgICBtYW51YWxseSBlZGl0aW5nIHRoZSBzZXR0aW5nIGluIFByb2plY3QgUHJvcGVydGllcyBkaWFsb2cpLgotCi0gIFxpdGVtCi0gIFxzdHJvbmd7Q3JlYXRpbmcgYSBicmFuZCBuZXcgcHJvamVjdH1cXAotICAgIFVzZSB0aGUgXG1lbnVzZWxlY3Rpb257RmlsZSBcc3ViIE5ldyBcc3ViIFByb2plY3R9IGRpYWxvZyB0bwotICAgIGNyZWF0ZSBhIG5ldyBQcm9qZWN0IFdvcmtzcGFjZS4gIFNlbGVjdCBcZ3VpbGFiZWx7VmlzdWFsIEMrKwotICAgIFByb2plY3RzL1dpbjMyLyBXaW4zMiBQcm9qZWN0fSwgZW50ZXIgdGhlIG5hbWUgKFxzYW1we3NwYW19KSwgYW5kCi0gICAgbWFrZSBzdXJlIHRoZSBMb2NhdGlvbiBpcyBzZXQgdG8gcGFyZW50IG9mIHRoZSBcZmlsZXtzcGFtfQotICAgIGRpcmVjdG9yeSB5b3UgaGF2ZSBjcmVhdGVkICh3aGljaCBzaG91bGQgYmUgYSBkaXJlY3Qgc3ViZGlyZWN0b3J5Ci0gICAgb2YgdGhlIFB5dGhvbiBidWlsZCB0cmVlLCBhIHNpYmxpbmcgb2YgXGZpbGV7SW5jbHVkZX0gYW5kCi0gICAgXGZpbGV7UEN9KS4gIFNlbGVjdCBXaW4zMiBhcyB0aGUgcGxhdGZvcm0gKGluIG15IHZlcnNpb24sIHRoaXMgaXMKLSAgICB0aGUgb25seSBjaG9pY2UpLiAgTWFrZSBzdXJlIHRoZSBDcmVhdGUgbmV3IHdvcmtzcGFjZSByYWRpbyBidXR0b24KLSAgICBpcyBzZWxlY3RlZC4gIENsaWNrIE9LLgotCi0gICAgWW91IHNob3VsZCBub3cgY3JlYXRlIHRoZSBmaWxlIFxmaWxle3NwYW0uZGVmfSBhcyBpbnN0cnVjdGVkIGluCi0gICAgdGhlIHByZXZpb3VzIHNlY3Rpb24uIEFkZCB0aGUgc291cmNlIGZpbGVzIHRvIHRoZSBwcm9qZWN0LCB1c2luZwotICAgIFxtZW51c2VsZWN0aW9ue1Byb2plY3QgXHN1YiBBZGQgRXhpc3RpbmcgSXRlbX0uIFNldCB0aGUgcGF0dGVybiB0bwotICAgIFxjb2RleyouKn0gYW5kIHNlbGVjdCBib3RoIFxmaWxle3NwYW0uY30gYW5kIFxmaWxle3NwYW0uZGVmfSBhbmQKLSAgICBjbGljayBPSy4gIChJbnNlcnRpbmcgdGhlbSBvbmUgYnkgb25lIGlzIGZpbmUgdG9vLikKLQotICAgIE5vdyBvcGVuIHRoZSBcbWVudXNlbGVjdGlvbntQcm9qZWN0IFxzdWIgc3BhbSBwcm9wZXJ0aWVzfSBkaWFsb2cuCi0gICAgWW91IG9ubHkgbmVlZCB0byBjaGFuZ2UgYSBmZXcgc2V0dGluZ3MuICBNYWtlIHN1cmUgXGd1aWxhYmVse0FsbAotICAgIENvbmZpZ3VyYXRpb25zfSBpcyBzZWxlY3RlZCBmcm9tIHRoZSBcZ3VpbGFiZWx7U2V0dGluZ3MgZm9yOn0KLSAgICBkcm9wZG93biBsaXN0LiAgU2VsZWN0IHRoZSBDL1xDcHB7fSB0YWIuICBDaG9vc2UgdGhlIEdlbmVyYWwKLSAgICBjYXRlZ29yeSBpbiB0aGUgcG9wdXAgbWVudSBhdCB0aGUgdG9wLiAgVHlwZSB0aGUgZm9sbG93aW5nIHRleHQgaW4KLSAgICB0aGUgZW50cnkgYm94IGxhYmVsZWQgXGd1aWxhYmVse0FkZGl0aW9uYWwgSW5jbHVkZSBEaXJlY3Rvcmllc306Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLS4uXEluY2x1ZGUsLi5cUEMKLVxlbmR7dmVyYmF0aW19Ci0KLSAgICBUaGVuLCBjaG9vc2UgdGhlIEdlbmVyYWwgY2F0ZWdvcnkgaW4gdGhlIExpbmtlciB0YWIsIGFuZCBlbnRlcgotCi1cYmVnaW57dmVyYmF0aW19Ci0uLlxQQ2J1aWxkCi1cZW5ke3ZlcmJhdGltfQotCi0gICAgaW4gdGhlIHRleHQgYm94IGxhYmVsbGVkIFxndWlsYWJlbHtBZGRpdGlvbmFsIGxpYnJhcnkgRGlyZWN0b3JpZXN9LgotCi0gICAgTm93IHlvdSBuZWVkIHRvIGFkZCBzb21lIG1vZGUtc3BlY2lmaWMgc2V0dGluZ3M6Ci0KLSAgICBTZWxlY3QgXGd1aWxhYmVse1JlbGVhc2V9IGluIHRoZSBcZ3VpbGFiZWx7Q29uZmlndXJhdGlvbn0KLSAgICBkcm9wZG93biBsaXN0LiAgQ2hvb3NlIHRoZSBcZ3VpbGFiZWx7TGlua30gdGFiLCBjaG9vc2UgdGhlCi0gICAgXGd1aWxhYmVse0lucHV0fSBjYXRlZ29yeSwgYW5kIGFwcGVuZCBcY29kZXtweXRob25YWS5saWJ9IHRvIHRoZQotICAgIGxpc3QgaW4gdGhlIFxndWlsYWJlbHtBZGRpdGlvbmFsIERlcGVuZGVuY2llc30gYm94LgotCi0gICAgU2VsZWN0IFxndWlsYWJlbHtEZWJ1Z30gaW4gdGhlIFxndWlsYWJlbHtDb25maWd1cmF0aW9ufSBkcm9wZG93bgotICAgIGxpc3QsIGFuZCBhcHBlbmQgXGNvZGV7cHl0aG9uWFlfZC5saWJ9IHRvIHRoZSBsaXN0IGluIHRoZQotICAgIFxndWlsYWJlbHtBZGRpdGlvbmFsIERlcGVuZGVuY2llc30gYm94LiAgVGhlbiBjbGljayB0aGUgQy9cQ3Bwe30KLSAgICB0YWIsIHNlbGVjdCBcZ3VpbGFiZWx7Q29kZSBHZW5lcmF0aW9ufSwgYW5kIHNlbGVjdAotICAgIFxndWlsYWJlbHtNdWx0aS10aHJlYWRlZCBEZWJ1ZyBETEx9IGZyb20gdGhlIFxndWlsYWJlbHtSdW50aW1lCi0gICAgbGlicmFyeX0gZHJvcGRvd24gbGlzdC4KLQotICAgIFNlbGVjdCBcZ3VpbGFiZWx7UmVsZWFzZX0gYWdhaW4gZnJvbSB0aGUgXGd1aWxhYmVse0NvbmZpZ3VyYXRpb259Ci0gICAgZHJvcGRvd24gbGlzdC4gIFNlbGVjdCBcZ3VpbGFiZWx7TXVsdGktdGhyZWFkZWQgRExMfSBmcm9tIHRoZQotICAgIFxndWlsYWJlbHtSdW50aW1lIGxpYnJhcnl9IGRyb3Bkb3duIGxpc3QuCi1cZW5ke2VudW1lcmF0ZX0KLQotCi1JZiB5b3VyIG1vZHVsZSBjcmVhdGVzIGEgbmV3IHR5cGUsIHlvdSBtYXkgaGF2ZSB0cm91YmxlIHdpdGggdGhpcyBsaW5lOgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKLVxlbmR7dmVyYmF0aW19Ci0KLUNoYW5nZSBpdCB0bzoKLQotXGJlZ2lue3ZlcmJhdGltfQotICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotXGVuZHt2ZXJiYXRpbX0KLQotYW5kIGFkZCB0aGUgZm9sbG93aW5nIHRvIHRoZSBtb2R1bGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb246Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICBNeU9iamVjdF9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci1cZW5ke3ZlcmJhdGltfQotCi1SZWZlciB0byBzZWN0aW9ufjMgb2YgdGhlCi1cY2l0ZXRpdGxlW2h0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvRkFRLmh0bWxde1B5dGhvbiBGQVF9IGZvciBkZXRhaWxzCi1vbiB3aHkgeW91IG11c3QgZG8gdGhpcy4KLQotCi1cc2VjdGlvbntEaWZmZXJlbmNlcyBCZXR3ZWVuIFxVTklYe30gYW5kIFdpbmRvd3MKLSAgICAgXGxhYmVse2R5bmFtaWMtbGlua2luZ319Ci1cc2VjdGlvbmF1dGhvcntDaHJpcyBQaG9lbml4fXtjcGhvZW5peEBiZXN0LmNvbX0KLQotCi1cVU5JWHt9IGFuZCBXaW5kb3dzIHVzZSBjb21wbGV0ZWx5IGRpZmZlcmVudCBwYXJhZGlnbXMgZm9yIHJ1bi10aW1lCi1sb2FkaW5nIG9mIGNvZGUuICBCZWZvcmUgeW91IHRyeSB0byBidWlsZCBhIG1vZHVsZSB0aGF0IGNhbiBiZQotZHluYW1pY2FsbHkgbG9hZGVkLCBiZSBhd2FyZSBvZiBob3cgeW91ciBzeXN0ZW0gd29ya3MuCi0KLUluIFxVTklYLCBhIHNoYXJlZCBvYmplY3QgKFxmaWxley5zb30pIGZpbGUgY29udGFpbnMgY29kZSB0byBiZSB1c2VkIGJ5IHRoZQotcHJvZ3JhbSwgYW5kIGFsc28gdGhlIG5hbWVzIG9mIGZ1bmN0aW9ucyBhbmQgZGF0YSB0aGF0IGl0IGV4cGVjdHMgdG8KLWZpbmQgaW4gdGhlIHByb2dyYW0uICBXaGVuIHRoZSBmaWxlIGlzIGpvaW5lZCB0byB0aGUgcHJvZ3JhbSwgYWxsCi1yZWZlcmVuY2VzIHRvIHRob3NlIGZ1bmN0aW9ucyBhbmQgZGF0YSBpbiB0aGUgZmlsZSdzIGNvZGUgYXJlIGNoYW5nZWQKLXRvIHBvaW50IHRvIHRoZSBhY3R1YWwgbG9jYXRpb25zIGluIHRoZSBwcm9ncmFtIHdoZXJlIHRoZSBmdW5jdGlvbnMKLWFuZCBkYXRhIGFyZSBwbGFjZWQgaW4gbWVtb3J5LiAgVGhpcyBpcyBiYXNpY2FsbHkgYSBsaW5rIG9wZXJhdGlvbi4KLQotSW4gV2luZG93cywgYSBkeW5hbWljLWxpbmsgbGlicmFyeSAoXGZpbGV7LmRsbH0pIGZpbGUgaGFzIG5vIGRhbmdsaW5nCi1yZWZlcmVuY2VzLiAgSW5zdGVhZCwgYW4gYWNjZXNzIHRvIGZ1bmN0aW9ucyBvciBkYXRhIGdvZXMgdGhyb3VnaCBhCi1sb29rdXAgdGFibGUuICBTbyB0aGUgRExMIGNvZGUgZG9lcyBub3QgaGF2ZSB0byBiZSBmaXhlZCB1cCBhdCBydW50aW1lCi10byByZWZlciB0byB0aGUgcHJvZ3JhbSdzIG1lbW9yeTsgaW5zdGVhZCwgdGhlIGNvZGUgYWxyZWFkeSB1c2VzIHRoZQotRExMJ3MgbG9va3VwIHRhYmxlLCBhbmQgdGhlIGxvb2t1cCB0YWJsZSBpcyBtb2RpZmllZCBhdCBydW50aW1lIHRvCi1wb2ludCB0byB0aGUgZnVuY3Rpb25zIGFuZCBkYXRhLgotCi1JbiBcVU5JWCwgdGhlcmUgaXMgb25seSBvbmUgdHlwZSBvZiBsaWJyYXJ5IGZpbGUgKFxmaWxley5hfSkgd2hpY2gKLWNvbnRhaW5zIGNvZGUgZnJvbSBzZXZlcmFsIG9iamVjdCBmaWxlcyAoXGZpbGV7Lm99KS4gIER1cmluZyB0aGUgbGluawotc3RlcCB0byBjcmVhdGUgYSBzaGFyZWQgb2JqZWN0IGZpbGUgKFxmaWxley5zb30pLCB0aGUgbGlua2VyIG1heSBmaW5kCi10aGF0IGl0IGRvZXNuJ3Qga25vdyB3aGVyZSBhbiBpZGVudGlmaWVyIGlzIGRlZmluZWQuICBUaGUgbGlua2VyIHdpbGwKLWxvb2sgZm9yIGl0IGluIHRoZSBvYmplY3QgZmlsZXMgaW4gdGhlIGxpYnJhcmllczsgaWYgaXQgZmluZHMgaXQsIGl0Ci13aWxsIGluY2x1ZGUgYWxsIHRoZSBjb2RlIGZyb20gdGhhdCBvYmplY3QgZmlsZS4KLQotSW4gV2luZG93cywgdGhlcmUgYXJlIHR3byB0eXBlcyBvZiBsaWJyYXJ5LCBhIHN0YXRpYyBsaWJyYXJ5IGFuZCBhbgotaW1wb3J0IGxpYnJhcnkgKGJvdGggY2FsbGVkIFxmaWxley5saWJ9KS4gIEEgc3RhdGljIGxpYnJhcnkgaXMgbGlrZSBhCi1cVU5JWHt9IFxmaWxley5hfSBmaWxlOyBpdCBjb250YWlucyBjb2RlIHRvIGJlIGluY2x1ZGVkIGFzIG5lY2Vzc2FyeS4KLUFuIGltcG9ydCBsaWJyYXJ5IGlzIGJhc2ljYWxseSB1c2VkIG9ubHkgdG8gcmVhc3N1cmUgdGhlIGxpbmtlciB0aGF0IGEKLWNlcnRhaW4gaWRlbnRpZmllciBpcyBsZWdhbCwgYW5kIHdpbGwgYmUgcHJlc2VudCBpbiB0aGUgcHJvZ3JhbSB3aGVuCi10aGUgRExMIGlzIGxvYWRlZC4gIFNvIHRoZSBsaW5rZXIgdXNlcyB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUKLWltcG9ydCBsaWJyYXJ5IHRvIGJ1aWxkIHRoZSBsb29rdXAgdGFibGUgZm9yIHVzaW5nIGlkZW50aWZpZXJzIHRoYXQKLWFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIERMTC4gIFdoZW4gYW4gYXBwbGljYXRpb24gb3IgYSBETEwgaXMgbGlua2VkLAotYW4gaW1wb3J0IGxpYnJhcnkgbWF5IGJlIGdlbmVyYXRlZCwgd2hpY2ggd2lsbCBuZWVkIHRvIGJlIHVzZWQgZm9yIGFsbAotZnV0dXJlIERMTHMgdGhhdCBkZXBlbmQgb24gdGhlIHN5bWJvbHMgaW4gdGhlIGFwcGxpY2F0aW9uIG9yIERMTC4KLQotU3VwcG9zZSB5b3UgYXJlIGJ1aWxkaW5nIHR3byBkeW5hbWljLWxvYWQgbW9kdWxlcywgQiBhbmQgQywgd2hpY2ggc2hvdWxkCi1zaGFyZSBhbm90aGVyIGJsb2NrIG9mIGNvZGUgQS4gIE9uIFxVTklYLCB5b3Ugd291bGQgXGVtcGh7bm90fSBwYXNzCi1cZmlsZXtBLmF9IHRvIHRoZSBsaW5rZXIgZm9yIFxmaWxle0Iuc299IGFuZCBcZmlsZXtDLnNvfTsgdGhhdCB3b3VsZAotY2F1c2UgaXQgdG8gYmUgaW5jbHVkZWQgdHdpY2UsIHNvIHRoYXQgQiBhbmQgQyB3b3VsZCBlYWNoIGhhdmUgdGhlaXIKLW93biBjb3B5LiAgSW4gV2luZG93cywgYnVpbGRpbmcgXGZpbGV7QS5kbGx9IHdpbGwgYWxzbyBidWlsZAotXGZpbGV7QS5saWJ9LiAgWW91IFxlbXBoe2RvfSBwYXNzIFxmaWxle0EubGlifSB0byB0aGUgbGlua2VyIGZvciBCIGFuZAotQy4gIFxmaWxle0EubGlifSBkb2VzIG5vdCBjb250YWluIGNvZGU7IGl0IGp1c3QgY29udGFpbnMgaW5mb3JtYXRpb24KLXdoaWNoIHdpbGwgYmUgdXNlZCBhdCBydW50aW1lIHRvIGFjY2VzcyBBJ3MgY29kZS4gIAotCi1JbiBXaW5kb3dzLCB1c2luZyBhbiBpbXBvcnQgbGlicmFyeSBpcyBzb3J0IG9mIGxpa2UgdXNpbmcgXHNhbXB7aW1wb3J0Ci1zcGFtfTsgaXQgZ2l2ZXMgeW91IGFjY2VzcyB0byBzcGFtJ3MgbmFtZXMsIGJ1dCBkb2VzIG5vdCBjcmVhdGUgYQotc2VwYXJhdGUgY29weS4gIE9uIFxVTklYLCBsaW5raW5nIHdpdGggYSBsaWJyYXJ5IGlzIG1vcmUgbGlrZQotXHNhbXB7ZnJvbSBzcGFtIGltcG9ydCAqfTsgaXQgZG9lcyBjcmVhdGUgYSBzZXBhcmF0ZSBjb3B5LgotCi0KLVxzZWN0aW9ue1VzaW5nIERMTHMgaW4gUHJhY3RpY2UgXGxhYmVse3dpbi1kbGxzfX0KLVxzZWN0aW9uYXV0aG9ye0NocmlzIFBob2VuaXh9e2NwaG9lbml4QGJlc3QuY29tfQotCi1XaW5kb3dzIFB5dGhvbiBpcyBidWlsdCBpbiBNaWNyb3NvZnQgVmlzdWFsIFxDcHA7IHVzaW5nIG90aGVyCi1jb21waWxlcnMgbWF5IG9yIG1heSBub3Qgd29yayAodGhvdWdoIEJvcmxhbmQgc2VlbXMgdG8pLiAgVGhlIHJlc3Qgb2YKLXRoaXMgc2VjdGlvbiBpcyBNU1ZcQ3Bwe30gc3BlY2lmaWMuCi0KLVdoZW4gY3JlYXRpbmcgRExMcyBpbiBXaW5kb3dzLCB5b3UgbXVzdCBwYXNzIFxmaWxle3B5dGhvblhZLmxpYn0gdG8KLXRoZSBsaW5rZXIuICBUbyBidWlsZCB0d28gRExMcywgc3BhbSBhbmQgbmkgKHdoaWNoIHVzZXMgQyBmdW5jdGlvbnMKLWZvdW5kIGluIHNwYW0pLCB5b3UgY291bGQgdXNlIHRoZXNlIGNvbW1hbmRzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1jbCAvTEQgL0kvcHl0aG9uL2luY2x1ZGUgc3BhbS5jIC4uL2xpYnMvcHl0aG9uWFkubGliCi1jbCAvTEQgL0kvcHl0aG9uL2luY2x1ZGUgbmkuYyBzcGFtLmxpYiAuLi9saWJzL3B5dGhvblhZLmxpYgotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGZpcnN0IGNvbW1hbmQgY3JlYXRlZCB0aHJlZSBmaWxlczogXGZpbGV7c3BhbS5vYmp9LAotXGZpbGV7c3BhbS5kbGx9IGFuZCBcZmlsZXtzcGFtLmxpYn0uICBcZmlsZXtTcGFtLmRsbH0gZG9lcyBub3QgY29udGFpbgotYW55IFB5dGhvbiBmdW5jdGlvbnMgKHN1Y2ggYXMgXGNmdW5jdGlvbntQeUFyZ19QYXJzZVR1cGxlKCl9KSwgYnV0IGl0Ci1kb2VzIGtub3cgaG93IHRvIGZpbmQgdGhlIFB5dGhvbiBjb2RlIHRoYW5rcyB0byBcZmlsZXtweXRob25YWS5saWJ9LgotCi1UaGUgc2Vjb25kIGNvbW1hbmQgY3JlYXRlZCBcZmlsZXtuaS5kbGx9IChhbmQgXGZpbGV7Lm9ian0gYW5kCi1cZmlsZXsubGlifSksIHdoaWNoIGtub3dzIGhvdyB0byBmaW5kIHRoZSBuZWNlc3NhcnkgZnVuY3Rpb25zIGZyb20KLXNwYW0sIGFuZCBhbHNvIGZyb20gdGhlIFB5dGhvbiBleGVjdXRhYmxlLgotCi1Ob3QgZXZlcnkgaWRlbnRpZmllciBpcyBleHBvcnRlZCB0byB0aGUgbG9va3VwIHRhYmxlLiAgSWYgeW91IHdhbnQgYW55Ci1vdGhlciBtb2R1bGVzIChpbmNsdWRpbmcgUHl0aG9uKSB0byBiZSBhYmxlIHRvIHNlZSB5b3VyIGlkZW50aWZpZXJzLAoteW91IGhhdmUgdG8gc2F5IFxzYW1we19kZWNsc3BlYyhkbGxleHBvcnQpfSwgYXMgaW4gXHNhbXB7dm9pZAotX2RlY2xzcGVjKGRsbGV4cG9ydCkgaW5pdHNwYW0odm9pZCl9IG9yIFxzYW1we1B5T2JqZWN0Ci1fZGVjbHNwZWMoZGxsZXhwb3J0KSAqTmlHZXRTcGFtRGF0YSh2b2lkKX0uCi0KLURldmVsb3BlciBTdHVkaW8gd2lsbCB0aHJvdyBpbiBhIGxvdCBvZiBpbXBvcnQgbGlicmFyaWVzIHRoYXQgeW91IGRvCi1ub3QgcmVhbGx5IG5lZWQsIGFkZGluZyBhYm91dCAxMDBLIHRvIHlvdXIgZXhlY3V0YWJsZS4gIFRvIGdldCByaWQgb2YKLXRoZW0sIHVzZSB0aGUgUHJvamVjdCBTZXR0aW5ncyBkaWFsb2csIExpbmsgdGFiLCB0byBzcGVjaWZ5Ci1cZW1waHtpZ25vcmUgZGVmYXVsdCBsaWJyYXJpZXN9LiAgQWRkIHRoZSBjb3JyZWN0Ci1cZmlsZXttc3ZjcnRcdmFye3h4fS5saWJ9IHRvIHRoZSBsaXN0IG9mIGxpYnJhcmllcy4KZGlmZiAtLWdpdCBhL0RvYy9ob3d0by9NYWtlZmlsZSBiL0RvYy9ob3d0by9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgxMTBhMi4uMDAwMDAwMAotLS0gYS9Eb2MvaG93dG8vTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0jIE1ha2VmaWxlIGZvciB0aGUgSE9XVE8gZGlyZWN0b3J5Ci0jIExhVGVYIEhPV1RPcyBjYW4gYmUgdHVybmVkIGludG8gSFRNTCwgUERGLCBQUywgRFZJIG9yIHBsYWluIHRleHQgb3V0cHV0LgotIyByZVNUIEhPV1RPcyBjYW4gb25seSBiZSB0dXJuZWQgaW50byBIVE1MLgotCi0jIFZhcmlhYmxlcyB0byBjaGFuZ2UKLQotIyBQYXBlciBzaXplIGZvciBub24tSFRNTCBmb3JtYXRzIChsZXR0ZXIgb3IgYTQpCi1QQVBFUj1sZXR0ZXIKLQotIyBBcmd1bWVudHMgdG8gcnN0Mmh0bWwucHksIGFuZCBsb2NhdGlvbiBvZiB0aGUgc2NyaXB0Ci1SU1RBUkdTID0gLS1pbnB1dC1lbmNvZGluZz11dGYtOAotUlNUMkhUTUwgPSByc3QyaHRtbC5weQotCi0jIExpc3Qgb2YgSE9XVE9zIHRoYXQgYXJlbid0IHRvIGJlIHByb2Nlc3NlZC4gIFRoaXMgc2hvdWxkIGNvbnRhaW4gdGhlCi0jIGJhc2UgbmFtZSBvZiB0aGUgSE9XVE8gd2l0aG91dCBhbnkgZXh0ZW5zaW9uIChlLmcuICdhZHZvY2FjeScsCi0jICd1bmljb2RlJykuCi1SRU1PVkVfSE9XVE9TID0KLQotTUtIT1dUTz0uLi90b29scy9ta2hvd3RvCi1XRUJESVI9LgotUEFQRVJESVI9Li4vcGFwZXItJChQQVBFUikKLUhUTUxESVI9Li4vaHRtbAotCi0jIERldGVybWluZSBsaXN0IG9mIGZpbGVzIHRvIGJlIGJ1aWx0Ci1URVhfU09VUkNFUyA9ICQod2lsZGNhcmQgKi50ZXgpCi1SU1RfU09VUkNFUyA9ICQod2lsZGNhcmQgKi5yc3QpCi1URVhfTkFNRVMgPSAkKGZpbHRlci1vdXQgJChSRU1PVkVfSE9XVE9TKSwkKHBhdHN1YnN0ICUudGV4LCUsJChURVhfU09VUkNFUykpKQotCi1QQVBFUl9QQVRIUz0kKGFkZHByZWZpeCAkKFBBUEVSRElSKS8sJChURVhfTkFNRVMpKQotRFZJICA9JChhZGRzdWZmaXggLmR2aSwkKFBBUEVSX1BBVEhTKSkKLVBERiAgPSQoYWRkc3VmZml4IC5wZGYsJChQQVBFUl9QQVRIUykpCi1QUyAgID0kKGFkZHN1ZmZpeCAucHMsJChQQVBFUl9QQVRIUykpCi0KLUFMTF9IT1dUT19OQU1FUyA9ICQoVEVYX05BTUVTKSAkKHBhdHN1YnN0ICUucnN0LCUsJChSU1RfU09VUkNFUykpCi1IT1dUT19OQU1FUyA9ICQoZmlsdGVyLW91dCAkKFJFTU9WRV9IT1dUT1MpLCQoQUxMX0hPV1RPX05BTUVTKSkKLUhUTUwgPSAkKGFkZHByZWZpeCAkKEhUTUxESVIpLywkKEhPV1RPX05BTUVTKSkKLQotIyBSdWxlcyBmb3IgYnVpbGRpbmcgdmFyaW91cyBmb3JtYXRzCi0KLSMgcmVTVCB0byBIVE1MCi0kKEhUTUxESVIpLyU6ICUucnN0Ci0JaWYgWyAhIC1kICRAIF0gOyB0aGVuIG1rZGlyICRAIDsgZmkKLQkkKFJTVDJIVE1MKSAkKFJTVEFSR1MpICQ8ID4kQC9pbmRleC5odG1sCi0KLSMgTGFUZVggdG8gdmFyaW91cyBvdXRwdXQgZm9ybWF0cwotJChQQVBFUkRJUikvJS5kdmkgOiAlLnRleAotCSQoTUtIT1dUTykgLS1kdmkgJDwKLQltdiAkKi5kdmkgJEAKLQotJChQQVBFUkRJUikvJS5wZGYgOiAlLnRleAotCSQoTUtIT1dUTykgLS1wZGYgJDwKLQltdiAkKi5wZGYgJEAKLQotJChQQVBFUkRJUikvJS5wcyA6ICUudGV4Ci0JJChNS0hPV1RPKSAtLXBzICQ8Ci0JbXYgJCoucHMgJEAKLQotJChIVE1MRElSKS8lIDogJS50ZXgKLQkkKE1LSE9XVE8pIC0taHRtbCAtLWljb25zZXJ2ZXI9Ii4iIC0tZGlyICRAICQ8Ci0KLSMgUnVsZSB0aGF0IGlzbid0IGFjdHVhbGx5IHVzZWQgLS0gd2Ugbm8gbG9uZ2VyIHN1cHBvcnQgdGhlICd0eHQnIHRhcmdldC4KLSQoUEFQRVJESVIpLyUudHh0IDogJS50ZXgKLQkkKE1LSE9XVE8pIC0tdGV4dCAkPAotCW12ICRAIHR4dAotCi1kZWZhdWx0OgotCUBlY2hvICInYWxsJyAgICAtLSBidWlsZCBhbGwgZmlsZXMiCi0JQGVjaG8gIidkdmknLCAncGRmJywgJ3BzJywgJ2h0bWwnIC0tIGJ1aWxkIG9uZSBmb3JtYXQiCi0KLWFsbDogZHZpIHBkZiBwcyBodG1sCi0KLS5QSE9OWSA6IGR2aSBwZGYgcHMgaHRtbAotZHZpOiAgJChEVkkpCi1wZGY6ICAkKFBERikKLXBzOiAgICQoUFMpCi1odG1sOiAkKEhUTUwpCi0KLWNsZWFuOgotCXJtIC1mICp+ICoubG9nICouaW5kICoubDJoICouYXV4ICoudG9jICouaG93ICouYmttCi0Jcm0gLWYgKi5kdmkgKi5wZGYgKi5wcwotCi1jbG9iYmVyOgotCXJtIC1yZiAkKEhUTUwpCi0Jcm0gLXJmICQoRFZJKSAkKFBERikgJChQUykKZGlmZiAtLWdpdCBhL0RvYy9ob3d0by9UT0RPIGIvRG9jL2hvd3RvL1RPRE8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMjk4MjguLjAwMDAwMDAKLS0tIGEvRG9jL2hvd3RvL1RPRE8KKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0KLVNob3J0LXRlcm0gdGFza3M6Ci0gIFF1aWNrIHJldmlzaW9uIHBhc3MgdG8gbWFrZSBIT1dUT3MgbWF0Y2ggdGhlIGN1cnJlbnQgc3RhdGUgb2YgUHl0aG9uCi1kb2FuZGRvbnQgcmVnZXggc29ja2V0cwotCi1NZWRpdW0tdGVybSB0YXNrczoKLSBSZXZpc2l0IHRoZSByZWdleCBob3d0by4gIAotCSogQWRkIGV4ZXJjaXNlcyB3aXRoIGFuc3dlcnMgZm9yIGVhY2ggc2VjdGlvbgotCSogTW9yZSBleGFtcGxlcz8KLQotTG9uZy10ZXJtIHRhc2tzOgotIEludGVncmF0ZSB3aXRoIG90aGVyIFB5dGhvbiBkb2NzPwotCmRpZmYgLS1naXQgYS9Eb2MvaG93dG8vYWR2b2NhY3kudGV4IGIvRG9jL2hvd3RvL2Fkdm9jYWN5LnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA3NGIzZi4uMDAwMDAwMAotLS0gYS9Eb2MvaG93dG8vYWR2b2NhY3kudGV4CisrKyAvZGV2L251bGwKQEAgLTEsNDExICswLDAgQEAKLQotXGRvY3VtZW50Y2xhc3N7aG93dG99Ci0KLVx0aXRsZXtQeXRob24gQWR2b2NhY3kgSE9XVE99Ci0KLVxyZWxlYXNlezAuMDN9Ci0KLVxhdXRob3J7QS5NLiBLdWNobGluZ30KLVxhdXRob3JhZGRyZXNze1xlbWFpbHthbWtAYW1rLmNhfX0KLQotXGJlZ2lue2RvY3VtZW50fQotXG1ha2V0aXRsZQotCi1cYmVnaW57YWJzdHJhY3R9Ci1cbm9pbmRlbnQKLUl0J3MgdXN1YWxseSBkaWZmaWN1bHQgdG8gZ2V0IHlvdXIgbWFuYWdlbWVudCB0byBhY2NlcHQgb3BlbiBzb3VyY2UKLXNvZnR3YXJlLCBhbmQgUHl0aG9uIGlzIG5vIGV4Y2VwdGlvbiB0byB0aGlzIHJ1bGUuICBUaGlzIGRvY3VtZW50Ci1kaXNjdXNzZXMgcmVhc29ucyB0byB1c2UgUHl0aG9uLCBzdHJhdGVnaWVzIGZvciB3aW5uaW5nIGFjY2VwdGFuY2UsCi1mYWN0cyBhbmQgYXJndW1lbnRzIHlvdSBjYW4gdXNlLCBhbmQgY2FzZXMgd2hlcmUgeW91IFxlbXBoe3Nob3VsZG4ndH0KLXRyeSB0byB1c2UgUHl0aG9uLgotCi1UaGlzIGRvY3VtZW50IGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBQeXRob24gSE9XVE8gcGFnZSBhdAotXHVybHtodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jL2hvd3RvfS4KLQotXGVuZHthYnN0cmFjdH0KLQotXHRhYmxlb2Zjb250ZW50cwotCi1cc2VjdGlvbntSZWFzb25zIHRvIFVzZSBQeXRob259Ci0KLVRoZXJlIGFyZSBzZXZlcmFsIHJlYXNvbnMgdG8gaW5jb3Jwb3JhdGUgYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgaW50bwoteW91ciBkZXZlbG9wbWVudCBwcm9jZXNzLCBhbmQgdGhpcyBzZWN0aW9uIHdpbGwgZGlzY3VzcyB0aGVtLCBhbmQgd2h5Ci1QeXRob24gaGFzIHNvbWUgcHJvcGVydGllcyB0aGF0IG1ha2UgaXQgYSBwYXJ0aWN1bGFybHkgZ29vZCBjaG9pY2UuCi0KLSBcc3Vic2VjdGlvbntQcm9ncmFtbWFiaWxpdHl9Ci0KLVByb2dyYW1zIGFyZSBvZnRlbiBvcmdhbml6ZWQgaW4gYSBtb2R1bGFyIGZhc2hpb24uICBMb3dlci1sZXZlbAotb3BlcmF0aW9ucyBhcmUgZ3JvdXBlZCB0b2dldGhlciwgYW5kIGNhbGxlZCBieSBoaWdoZXItbGV2ZWwgZnVuY3Rpb25zLAotd2hpY2ggbWF5IGluIHR1cm4gYmUgdXNlZCBhcyBiYXNpYyBvcGVyYXRpb25zIGJ5IHN0aWxsIGZ1cnRoZXIgdXBwZXIKLWxldmVscy4gIAotCi1Gb3IgZXhhbXBsZSwgdGhlIGxvd2VzdCBsZXZlbCBtaWdodCBkZWZpbmUgYSB2ZXJ5IGxvdy1sZXZlbAotc2V0IG9mIGZ1bmN0aW9ucyBmb3IgYWNjZXNzaW5nIGEgaGFzaCB0YWJsZS4gIFRoZSBuZXh0IGxldmVsIG1pZ2h0IHVzZQotaGFzaCB0YWJsZXMgdG8gc3RvcmUgdGhlIGhlYWRlcnMgb2YgYSBtYWlsIG1lc3NhZ2UsIG1hcHBpbmcgYSBoZWFkZXIKLW5hbWUgbGlrZSBcc2FtcHtEYXRlfSB0byBhIHZhbHVlIHN1Y2ggYXMgXHNhbXB7VHVlLCAxMyBNYXkgMTk5NwotMjA6MDA6NTQgLTA0MDB9LiAgQSB5ZXQgaGlnaGVyIGxldmVsIG1heSBvcGVyYXRlIG9uIG1lc3NhZ2Ugb2JqZWN0cywKLXdpdGhvdXQga25vd2luZyBvciBjYXJpbmcgdGhhdCBtZXNzYWdlIGhlYWRlcnMgYXJlIHN0b3JlZCBpbiBhIGhhc2gKLXRhYmxlLCBhbmQgc28gZm9ydGguICAKLQotT2Z0ZW4sIHRoZSBsb3dlc3QgbGV2ZWxzIGRvIHZlcnkgc2ltcGxlIHRoaW5nczsgdGhleSBpbXBsZW1lbnQgYSBkYXRhCi1zdHJ1Y3R1cmUgc3VjaCBhcyBhIGJpbmFyeSB0cmVlIG9yIGhhc2ggdGFibGUsIG9yIHRoZXkgcGVyZm9ybSBzb21lCi1zaW1wbGUgY29tcHV0YXRpb24sIHN1Y2ggYXMgY29udmVydGluZyBhIGRhdGUgc3RyaW5nIHRvIGEgbnVtYmVyLiAgVGhlCi1oaWdoZXIgbGV2ZWxzIHRoZW4gY29udGFpbiBsb2dpYyBjb25uZWN0aW5nIHRoZXNlIHByaW1pdGl2ZQotb3BlcmF0aW9ucy4gIFVzaW5nIHRoZSBhcHByb2FjaCwgdGhlIHByaW1pdGl2ZXMgY2FuIGJlIHNlZW4gYXMgYmFzaWMKLWJ1aWxkaW5nIGJsb2NrcyB3aGljaCBhcmUgdGhlbiBnbHVlZCB0b2dldGhlciB0byBwcm9kdWNlIHRoZSBjb21wbGV0ZQotcHJvZHVjdC4gIAotCi1XaHkgaXMgdGhpcyBkZXNpZ24gYXBwcm9hY2ggcmVsZXZhbnQgdG8gUHl0aG9uPyAgQmVjYXVzZSBQeXRob24gaXMKLXdlbGwgc3VpdGVkIHRvIGZ1bmN0aW9uaW5nIGFzIHN1Y2ggYSBnbHVlIGxhbmd1YWdlLiAgQSBjb21tb24gYXBwcm9hY2gKLWlzIHRvIHdyaXRlIGEgUHl0aG9uIG1vZHVsZSB0aGF0IGltcGxlbWVudHMgdGhlIGxvd2VyIGxldmVsCi1vcGVyYXRpb25zOyBmb3IgdGhlIHNha2Ugb2Ygc3BlZWQsIHRoZSBpbXBsZW1lbnRhdGlvbiBtaWdodCBiZSBpbiBDLAotSmF2YSwgb3IgZXZlbiBGb3J0cmFuLiAgT25jZSB0aGUgcHJpbWl0aXZlcyBhcmUgYXZhaWxhYmxlIHRvIFB5dGhvbgotcHJvZ3JhbXMsIHRoZSBsb2dpYyB1bmRlcmx5aW5nIGhpZ2hlciBsZXZlbCBvcGVyYXRpb25zIGlzIHdyaXR0ZW4gaW4KLXRoZSBmb3JtIG9mIFB5dGhvbiBjb2RlLiAgVGhlIGhpZ2gtbGV2ZWwgbG9naWMgaXMgdGhlbiBtb3JlCi11bmRlcnN0YW5kYWJsZSwgYW5kIGVhc2llciB0byBtb2RpZnkuCi0KLUpvaG4gT3VzdGVyaG91dCB3cm90ZSBhIHBhcGVyIHRoYXQgZXhwbGFpbnMgdGhpcyBpZGVhIGF0IGdyZWF0ZXIKLWxlbmd0aCwgZW50aXRsZWQgYGBTY3JpcHRpbmc6IEhpZ2hlciBMZXZlbCBQcm9ncmFtbWluZyBmb3IgdGhlIDIxc3QKLUNlbnR1cnknJy4gIEkgcmVjb21tZW5kIHRoYXQgeW91IHJlYWQgdGhpcyBwYXBlcjsgc2VlIHRoZSByZWZlcmVuY2VzCi1mb3IgdGhlIFVSTC4gIE91c3RlcmhvdXQgaXMgdGhlIGludmVudG9yIG9mIHRoZSBUY2wgbGFuZ3VhZ2UsIGFuZAotdGhlcmVmb3JlIGFyZ3VlcyB0aGF0IFRjbCBzaG91bGQgYmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlOyBoZSBvbmx5Ci1icmllZmx5IHJlZmVycyB0byBvdGhlciBsYW5ndWFnZXMgc3VjaCBhcyBQeXRob24sIFBlcmwsIGFuZAotTGlzcC9TY2hlbWUsIGJ1dCBpbiByZWFsaXR5LCBPdXN0ZXJob3V0J3MgYXJndW1lbnQgYXBwbGllcyB0bwotc2NyaXB0aW5nIGxhbmd1YWdlcyBpbiBnZW5lcmFsLCBzaW5jZSB5b3UgY291bGQgZXF1YWxseSB3cml0ZQotZXh0ZW5zaW9ucyBmb3IgYW55IG9mIHRoZSBsYW5ndWFnZXMgbWVudGlvbmVkIGFib3ZlLgotCi0gXHN1YnNlY3Rpb257UHJvdG90eXBpbmd9Ci0KLUluIFxlbXBoe1RoZSBNeXRoaWNhbCBNYW4tTW9udGh9LCBGcmVkcmljayBCcm9va3Mgc3VnZ2VzdHMgdGhlCi1mb2xsb3dpbmcgcnVsZSB3aGVuIHBsYW5uaW5nIHNvZnR3YXJlIHByb2plY3RzOiBgYFBsYW4gdG8gdGhyb3cgb25lCi1hd2F5OyB5b3Ugd2lsbCBhbnl3YXkuJycgIEJyb29rcyBpcyBzYXlpbmcgdGhhdCB0aGUgZmlyc3QgYXR0ZW1wdCBhdCBhCi1zb2Z0d2FyZSBkZXNpZ24gb2Z0ZW4gdHVybnMgb3V0IHRvIGJlIHdyb25nOyB1bmxlc3MgdGhlIHByb2JsZW0gaXMKLXZlcnkgc2ltcGxlIG9yIHlvdSdyZSBhbiBleHRyZW1lbHkgZ29vZCBkZXNpZ25lciwgeW91J2xsIGZpbmQgdGhhdCBuZXcKLXJlcXVpcmVtZW50cyBhbmQgZmVhdHVyZXMgYmVjb21lIGFwcGFyZW50IG9uY2UgZGV2ZWxvcG1lbnQgaGFzCi1hY3R1YWxseSBzdGFydGVkLiAgSWYgdGhlc2UgbmV3IHJlcXVpcmVtZW50cyBjYW4ndCBiZSBjbGVhbmx5Ci1pbmNvcnBvcmF0ZWQgaW50byB0aGUgcHJvZ3JhbSdzIHN0cnVjdHVyZSwgeW91J3JlIHByZXNlbnRlZCB3aXRoIHR3bwotdW5wbGVhc2FudCBjaG9pY2VzOiBoYW1tZXIgdGhlIG5ldyBmZWF0dXJlcyBpbnRvIHRoZSBwcm9ncmFtIHNvbWVob3csCi1vciBzY3JhcCBldmVyeXRoaW5nIGFuZCB3cml0ZSBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBwcm9ncmFtLCB0YWtpbmcgdGhlCi1uZXcgZmVhdHVyZXMgaW50byBhY2NvdW50IGZyb20gdGhlIGJlZ2lubmluZy4KLQotUHl0aG9uIHByb3ZpZGVzIHlvdSB3aXRoIGEgZ29vZCBlbnZpcm9ubWVudCBmb3IgcXVpY2tseSBkZXZlbG9waW5nIGFuCi1pbml0aWFsIHByb3RvdHlwZS4gIFRoYXQgbGV0cyB5b3UgZ2V0IHRoZSBvdmVyYWxsIHByb2dyYW0gc3RydWN0dXJlCi1hbmQgbG9naWMgcmlnaHQsIGFuZCB5b3UgY2FuIGZpbmUtdHVuZSBzbWFsbCBkZXRhaWxzIGluIHRoZSBmYXN0Ci1kZXZlbG9wbWVudCBjeWNsZSB0aGF0IFB5dGhvbiBwcm92aWRlcy4gIE9uY2UgeW91J3JlIHNhdGlzZmllZCB3aXRoCi10aGUgR1VJIGludGVyZmFjZSBvciBwcm9ncmFtIG91dHB1dCwgeW91IGNhbiB0cmFuc2xhdGUgdGhlIFB5dGhvbiBjb2RlCi1pbnRvIEMrKywgRm9ydHJhbiwgSmF2YSwgb3Igc29tZSBvdGhlciBjb21waWxlZCBsYW5ndWFnZS4KLQotUHJvdG90eXBpbmcgbWVhbnMgeW91IGhhdmUgdG8gYmUgY2FyZWZ1bCBub3QgdG8gdXNlIHRvbyBtYW55IFB5dGhvbgotZmVhdHVyZXMgdGhhdCBhcmUgaGFyZCB0byBpbXBsZW1lbnQgaW4geW91ciBvdGhlciBsYW5ndWFnZS4gIFVzaW5nCi1cY29kZXtldmFsKCl9LCBvciByZWd1bGFyIGV4cHJlc3Npb25zLCBvciB0aGUgXG1vZHVsZXtwaWNrbGV9IG1vZHVsZSwKLW1lYW5zIHRoYXQgeW91J3JlIGdvaW5nIHRvIG5lZWQgQyBvciBKYXZhIGxpYnJhcmllcyBmb3IgZm9ybXVsYQotZXZhbHVhdGlvbiwgcmVndWxhciBleHByZXNzaW9ucywgYW5kIHNlcmlhbGl6YXRpb24sIGZvciBleGFtcGxlLiAgQnV0Ci1pdCdzIG5vdCBoYXJkIHRvIGF2b2lkIHN1Y2ggdHJpY2t5IGNvZGUsIGFuZCBpbiB0aGUgZW5kIHRoZQotdHJhbnNsYXRpb24gdXN1YWxseSBpc24ndCB2ZXJ5IGRpZmZpY3VsdC4gIFRoZSByZXN1bHRpbmcgY29kZSBjYW4gYmUKLXJhcGlkbHkgZGVidWdnZWQsIGJlY2F1c2UgYW55IHNlcmlvdXMgbG9naWNhbCBlcnJvcnMgd2lsbCBoYXZlIGJlZW4KLXJlbW92ZWQgZnJvbSB0aGUgcHJvdG90eXBlLCBsZWF2aW5nIG9ubHkgbW9yZSBtaW5vciBzbGlwLXVwcyBpbiB0aGUKLXRyYW5zbGF0aW9uIHRvIHRyYWNrIGRvd24uICAKLQotVGhpcyBzdHJhdGVneSBidWlsZHMgb24gdGhlIGVhcmxpZXIgZGlzY3Vzc2lvbiBvZiBwcm9ncmFtbWFiaWxpdHkuCi1Vc2luZyBQeXRob24gYXMgZ2x1ZSB0byBjb25uZWN0IGxvd2VyLWxldmVsIGNvbXBvbmVudHMgaGFzIG9idmlvdXMKLXJlbGV2YW5jZSBmb3IgY29uc3RydWN0aW5nIHByb3RvdHlwZSBzeXN0ZW1zLiAgSW4gdGhpcyB3YXkgUHl0aG9uIGNhbgotaGVscCB5b3Ugd2l0aCBkZXZlbG9wbWVudCwgZXZlbiBpZiBlbmQgdXNlcnMgbmV2ZXIgY29tZSBpbiBjb250YWN0Ci13aXRoIFB5dGhvbiBjb2RlIGF0IGFsbC4gIElmIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgUHl0aG9uIHZlcnNpb24gaXMKLWFkZXF1YXRlIGFuZCBjb3Jwb3JhdGUgcG9saXRpY3MgYWxsb3cgaXQsIHlvdSBtYXkgbm90IG5lZWQgdG8gZG8gYQotdHJhbnNsYXRpb24gaW50byBDIG9yIEphdmEsIGJ1dCBpdCBjYW4gc3RpbGwgYmUgZmFzdGVyIHRvIGRldmVsb3AgYQotcHJvdG90eXBlIGFuZCB0aGVuIHRyYW5zbGF0ZSBpdCwgaW5zdGVhZCBvZiBhdHRlbXB0aW5nIHRvIHByb2R1Y2UgdGhlCi1maW5hbCB2ZXJzaW9uIGltbWVkaWF0ZWx5LgotCi1PbmUgZXhhbXBsZSBvZiB0aGlzIGRldmVsb3BtZW50IHN0cmF0ZWd5IGlzIE1pY3Jvc29mdCBNZXJjaGFudCBTZXJ2ZXIuCi1WZXJzaW9uIDEuMCB3YXMgd3JpdHRlbiBpbiBwdXJlIFB5dGhvbiwgYnkgYSBjb21wYW55IHRoYXQgc3Vic2VxdWVudGx5Ci13YXMgcHVyY2hhc2VkIGJ5IE1pY3Jvc29mdC4gIFZlcnNpb24gMi4wIGJlZ2FuIHRvIHRyYW5zbGF0ZSB0aGUgY29kZQotaW50byBcQ3BwLCBzaGlwcGluZyB3aXRoIHNvbWUgXENwcCBjb2RlIGFuZCBzb21lIFB5dGhvbiBjb2RlLiAgVmVyc2lvbgotMy4wIGRpZG4ndCBjb250YWluIGFueSBQeXRob24gYXQgYWxsOyBhbGwgdGhlIGNvZGUgaGFkIGJlZW4gdHJhbnNsYXRlZAotaW50byBcQ3BwLiAgRXZlbiB0aG91Z2ggdGhlIHByb2R1Y3QgZG9lc24ndCBjb250YWluIGEgUHl0aG9uCi1pbnRlcnByZXRlciwgdGhlIFB5dGhvbiBsYW5ndWFnZSBoYXMgc3RpbGwgc2VydmVkIGEgdXNlZnVsIHB1cnBvc2UgYnkKLXNwZWVkaW5nIHVwIGRldmVsb3BtZW50LiAgCi0KLVRoaXMgaXMgYSB2ZXJ5IGNvbW1vbiB1c2UgZm9yIFB5dGhvbi4gIFBhc3QgY29uZmVyZW5jZSBwYXBlcnMgaGF2ZQotYWxzbyBkZXNjcmliZWQgdGhpcyBhcHByb2FjaCBmb3IgZGV2ZWxvcGluZyBoaWdoLWxldmVsIG51bWVyaWNhbAotYWxnb3JpdGhtczsgc2VlIERhdmlkIE0uIEJlYXpsZXkgYW5kIFBldGVyIFMuIExvbWRhaGwncyBwYXBlcgotYGBGZWVkaW5nIGEgTGFyZ2Utc2NhbGUgUGh5c2ljcyBBcHBsaWNhdGlvbiB0byBQeXRob24nJyBpbiB0aGUKLXJlZmVyZW5jZXMgZm9yIGEgZ29vZCBleGFtcGxlLiAgSWYgYW4gYWxnb3JpdGhtJ3MgYmFzaWMgb3BlcmF0aW9ucyBhcmUKLXRoaW5ncyBsaWtlICJUYWtlIHRoZSBpbnZlcnNlIG9mIHRoaXMgNDAwMHg0MDAwIG1hdHJpeCIsIGFuZCBhcmUKLWltcGxlbWVudGVkIGluIHNvbWUgbG93ZXItbGV2ZWwgbGFuZ3VhZ2UsIHRoZW4gUHl0aG9uIGhhcyBhbG1vc3Qgbm8KLWFkZGl0aW9uYWwgcGVyZm9ybWFuY2UgY29zdDsgdGhlIGV4dHJhIHRpbWUgcmVxdWlyZWQgZm9yIFB5dGhvbiB0bwotZXZhbHVhdGUgYW4gZXhwcmVzc2lvbiBsaWtlIFxjb2Rle20uaW52ZXJ0KCl9IGlzIGR3YXJmZWQgYnkgdGhlIGNvc3QKLW9mIHRoZSBhY3R1YWwgY29tcHV0YXRpb24uICBJdCdzIHBhcnRpY3VsYXJseSBnb29kIGZvciBhcHBsaWNhdGlvbnMKLXdoZXJlIHNlZW1pbmdseSBlbmRsZXNzIHR3ZWFraW5nIGlzIHJlcXVpcmVkIHRvIGdldCB0aGluZ3MgcmlnaHQuIEdVSQotaW50ZXJmYWNlcyBhbmQgV2ViIHNpdGVzIGFyZSBwcmltZSBleGFtcGxlcy4KLQotVGhlIFB5dGhvbiBjb2RlIGlzIGFsc28gc2hvcnRlciBhbmQgZmFzdGVyIHRvIHdyaXRlIChvbmNlIHlvdSdyZQotZmFtaWxpYXIgd2l0aCBQeXRob24pLCBzbyBpdCdzIGVhc2llciB0byB0aHJvdyBpdCBhd2F5IGlmIHlvdSBkZWNpZGUKLXlvdXIgYXBwcm9hY2ggd2FzIHdyb25nOyBpZiB5b3UnZCBzcGVudCB0d28gd2Vla3Mgd29ya2luZyBvbiBpdAotaW5zdGVhZCBvZiBqdXN0IHR3byBob3VycywgeW91IG1pZ2h0IHdhc3RlIHRpbWUgdHJ5aW5nIHRvIHBhdGNoIHVwCi13aGF0IHlvdSd2ZSBnb3Qgb3V0IG9mIGEgbmF0dXJhbCByZWx1Y3RhbmNlIHRvIGFkbWl0IHRoYXQgdGhvc2UgdHdvCi13ZWVrcyB3ZXJlIHdhc3RlZC4gIFRydXRoZnVsbHksIHRob3NlIHR3byB3ZWVrcyBoYXZlbid0IGJlZW4gd2FzdGVkLAotc2luY2UgeW91J3ZlIGxlYXJudCBzb21ldGhpbmcgYWJvdXQgdGhlIHByb2JsZW0gYW5kIHRoZSB0ZWNobm9sb2d5Ci15b3UncmUgdXNpbmcgdG8gc29sdmUgaXQsIGJ1dCBpdCdzIGh1bWFuIG5hdHVyZSB0byB2aWV3IHRoaXMgYXMgYQotZmFpbHVyZSBvZiBzb21lIHNvcnQuCi0KLSBcc3Vic2VjdGlvbntTaW1wbGljaXR5IGFuZCBFYXNlIG9mIFVuZGVyc3RhbmRpbmd9Ci0KLVB5dGhvbiBpcyBkZWZpbml0ZWx5IFxlbXBoe25vdH0gYSB0b3kgbGFuZ3VhZ2UgdGhhdCdzIG9ubHkgdXNhYmxlIGZvcgotc21hbGwgdGFza3MuICBUaGUgbGFuZ3VhZ2UgZmVhdHVyZXMgYXJlIGdlbmVyYWwgYW5kIHBvd2VyZnVsIGVub3VnaCB0bwotZW5hYmxlIGl0IHRvIGJlIHVzZWQgZm9yIG1hbnkgZGlmZmVyZW50IHB1cnBvc2VzLiAgSXQncyB1c2VmdWwgYXQgdGhlCi1zbWFsbCBlbmQsIGZvciAxMC0gb3IgMjAtbGluZSBzY3JpcHRzLCBidXQgaXQgYWxzbyBzY2FsZXMgdXAgdG8gbGFyZ2VyCi1zeXN0ZW1zIHRoYXQgY29udGFpbiB0aG91c2FuZHMgb2YgbGluZXMgb2YgY29kZS4KLQotSG93ZXZlciwgdGhpcyBleHByZXNzaXZlbmVzcyBkb2Vzbid0IGNvbWUgYXQgdGhlIGNvc3Qgb2YgYW4gb2JzY3VyZSBvcgotdHJpY2t5IHN5bnRheC4gIFdoaWxlIFB5dGhvbiBoYXMgc29tZSBkYXJrIGNvcm5lcnMgdGhhdCBjYW4gbGVhZCB0bwotb2JzY3VyZSBjb2RlLCB0aGVyZSBhcmUgcmVsYXRpdmVseSBmZXcgc3VjaCBjb3JuZXJzLCBhbmQgcHJvcGVyIGRlc2lnbgotY2FuIGlzb2xhdGUgdGhlaXIgdXNlIHRvIG9ubHkgYSBmZXcgY2xhc3NlcyBvciBtb2R1bGVzLiAgSXQncwotY2VydGFpbmx5IHBvc3NpYmxlIHRvIHdyaXRlIGNvbmZ1c2luZyBjb2RlIGJ5IHVzaW5nIHRvbyBtYW55IGZlYXR1cmVzCi13aXRoIHRvbyBsaXR0bGUgY29uY2VybiBmb3IgY2xhcml0eSwgYnV0IG1vc3QgUHl0aG9uIGNvZGUgY2FuIGxvb2sgYQotbG90IGxpa2UgYSBzbGlnaHRseS1mb3JtYWxpemVkIHZlcnNpb24gb2YgaHVtYW4tdW5kZXJzdGFuZGFibGUKLXBzZXVkb2NvZGUuCi0KLUluIFxlbXBoe1RoZSBOZXcgSGFja2VyJ3MgRGljdGlvbmFyeX0sIEVyaWMgUy4gUmF5bW9uZCBnaXZlcyB0aGUgZm9sbG93aW5nCi1kZWZpbml0aW9uIGZvciAiY29tcGFjdCI6Ci0KLVxiZWdpbntxdW90YXRpb259Ci0JQ29tcGFjdCBcZW1waHthZGoufSAgT2YgYSBkZXNpZ24sIGRlc2NyaWJlcyB0aGUgdmFsdWFibGUgcHJvcGVydHkKLQl0aGF0IGl0IGNhbiBhbGwgYmUgYXBwcmVoZW5kZWQgYXQgb25jZSBpbiBvbmUncyBoZWFkLiBUaGlzCi0JZ2VuZXJhbGx5IG1lYW5zIHRoZSB0aGluZyBjcmVhdGVkIGZyb20gdGhlIGRlc2lnbiBjYW4gYmUgdXNlZAotCXdpdGggZ3JlYXRlciBmYWNpbGl0eSBhbmQgZmV3ZXIgZXJyb3JzIHRoYW4gYW4gZXF1aXZhbGVudCB0b29sCi0JdGhhdCBpcyBub3QgY29tcGFjdC4gQ29tcGFjdG5lc3MgZG9lcyBub3QgaW1wbHkgdHJpdmlhbGl0eSBvcgotCWxhY2sgb2YgcG93ZXI7IGZvciBleGFtcGxlLCBDIGlzIGNvbXBhY3QgYW5kIEZPUlRSQU4gaXMgbm90LAotCWJ1dCBDIGlzIG1vcmUgcG93ZXJmdWwgdGhhbiBGT1JUUkFOLiBEZXNpZ25zIGJlY29tZQotCW5vbi1jb21wYWN0IHRocm91Z2ggYWNjcmV0aW5nIGZlYXR1cmVzIGFuZCBjcnVmdCB0aGF0IGRvbid0Ci0JbWVyZ2UgY2xlYW5seSBpbnRvIHRoZSBvdmVyYWxsIGRlc2lnbiBzY2hlbWUgKHRodXMsIHNvbWUgZmFucwotCW9mIENsYXNzaWMgQyBtYWludGFpbiB0aGF0IEFOU0kgQyBpcyBubyBsb25nZXIgY29tcGFjdCkuCi1cZW5ke3F1b3RhdGlvbn0KLQotKEZyb20gXHVybHtodHRwOi8vd3d3LmNhdGIub3JnL35lc3IvamFyZ29uL2h0bWwvQy9jb21wYWN0Lmh0bWx9KQotCi1JbiB0aGlzIHNlbnNlIG9mIHRoZSB3b3JkLCBQeXRob24gaXMgcXVpdGUgY29tcGFjdCwgYmVjYXVzZSB0aGUKLWxhbmd1YWdlIGhhcyBqdXN0IGEgZmV3IGlkZWFzLCB3aGljaCBhcmUgdXNlZCBpbiBsb3RzIG9mIHBsYWNlcy4gIFRha2UKLW5hbWVzcGFjZXMsIGZvciBleGFtcGxlLiAgSW1wb3J0IGEgbW9kdWxlIHdpdGggXGNvZGV7aW1wb3J0IG1hdGh9LCBhbmQKLXlvdSBjcmVhdGUgYSBuZXcgbmFtZXNwYWNlIGNhbGxlZCBcc2FtcHttYXRofS4gIENsYXNzZXMgYXJlIGFsc28KLW5hbWVzcGFjZXMgdGhhdCBzaGFyZSBtYW55IG9mIHRoZSBwcm9wZXJ0aWVzIG9mIG1vZHVsZXMsIGFuZCBoYXZlIGEKLWZldyBvZiB0aGVpciBvd247IGZvciBleGFtcGxlLCB5b3UgY2FuIGNyZWF0ZSBpbnN0YW5jZXMgb2YgYSBjbGFzcy4KLUluc3RhbmNlcz8gIFRoZXkncmUgeWV0IGFub3RoZXIgbmFtZXNwYWNlLiAgTmFtZXNwYWNlcyBhcmUgY3VycmVudGx5Ci1pbXBsZW1lbnRlZCBhcyBQeXRob24gZGljdGlvbmFyaWVzLCBzbyB0aGV5IGhhdmUgdGhlIHNhbWUgbWV0aG9kcyBhcwotdGhlIHN0YW5kYXJkIGRpY3Rpb25hcnkgZGF0YSB0eXBlOiAua2V5cygpIHJldHVybnMgYWxsIHRoZSBrZXlzLCBhbmQKLXNvIGZvcnRoLgotCi1UaGlzIHNpbXBsaWNpdHkgYXJpc2VzIGZyb20gUHl0aG9uJ3MgZGV2ZWxvcG1lbnQgaGlzdG9yeS4gIFRoZQotbGFuZ3VhZ2Ugc3ludGF4IGRlcml2ZXMgZnJvbSBkaWZmZXJlbnQgc291cmNlczsgQUJDLCBhIHJlbGF0aXZlbHkKLW9ic2N1cmUgdGVhY2hpbmcgbGFuZ3VhZ2UsIGlzIG9uZSBwcmltYXJ5IGluZmx1ZW5jZSwgYW5kIE1vZHVsYS0zIGlzCi1hbm90aGVyLiAgKEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IEFCQyBhbmQgTW9kdWxhLTMsIGNvbnN1bHQgdGhlaXIKLXJlc3BlY3RpdmUgV2ViIHNpdGVzIGF0IFx1cmx7aHR0cDovL3d3dy5jd2kubmwvfnN0ZXZlbi9hYmMvfSBhbmQKLVx1cmx7aHR0cDovL3d3dy5tMy5vcmd9LikgIE90aGVyIGZlYXR1cmVzIGhhdmUgY29tZSBmcm9tIEMsIEljb24sCi1BbGdvbC02OCwgYW5kIGV2ZW4gUGVybC4gIFB5dGhvbiBoYXNuJ3QgcmVhbGx5IGlubm92YXRlZCB2ZXJ5IG11Y2gsCi1idXQgaW5zdGVhZCBoYXMgdHJpZWQgdG8ga2VlcCB0aGUgbGFuZ3VhZ2Ugc21hbGwgYW5kIGVhc3kgdG8gbGVhcm4sCi1idWlsZGluZyBvbiBpZGVhcyB0aGF0IGhhdmUgYmVlbiB0cmllZCBpbiBvdGhlciBsYW5ndWFnZXMgYW5kIGZvdW5kCi11c2VmdWwuCi0KLVNpbXBsaWNpdHkgaXMgYSB2aXJ0dWUgdGhhdCBzaG91bGQgbm90IGJlIHVuZGVyZXN0aW1hdGVkLiAgSXQgbGV0cyB5b3UKLWxlYXJuIHRoZSBsYW5ndWFnZSBtb3JlIHF1aWNrbHksIGFuZCB0aGVuIHJhcGlkbHkgd3JpdGUgY29kZSwgY29kZQotdGhhdCBvZnRlbiB3b3JrcyB0aGUgZmlyc3QgdGltZSB5b3UgcnVuIGl0LgotCi0gXHN1YnNlY3Rpb257SmF2YSBJbnRlZ3JhdGlvbn0KLQotSWYgeW91J3JlIHdvcmtpbmcgd2l0aCBKYXZhLCBKeXRob24KLShcdXJse2h0dHA6Ly93d3cuanl0aG9uLm9yZy99KSBpcyBkZWZpbml0ZWx5IHdvcnRoIHlvdXIKLWF0dGVudGlvbi4gIEp5dGhvbiBpcyBhIHJlLWltcGxlbWVudGF0aW9uIG9mIFB5dGhvbiBpbiBKYXZhIHRoYXQKLWNvbXBpbGVzIFB5dGhvbiBjb2RlIGludG8gSmF2YSBieXRlY29kZXMuICBUaGUgcmVzdWx0aW5nIGVudmlyb25tZW50Ci1oYXMgdmVyeSB0aWdodCwgYWxtb3N0IHNlYW1sZXNzLCBpbnRlZ3JhdGlvbiB3aXRoIEphdmEuICBJdCdzIHRyaXZpYWwKLXRvIGFjY2VzcyBKYXZhIGNsYXNzZXMgZnJvbSBQeXRob24sIGFuZCB5b3UgY2FuIHdyaXRlIFB5dGhvbiBjbGFzc2VzCi10aGF0IHN1YmNsYXNzIEphdmEgY2xhc3Nlcy4gIEp5dGhvbiBjYW4gYmUgdXNlZCBmb3IgcHJvdG90eXBpbmcgSmF2YQotYXBwbGljYXRpb25zIGluIG11Y2ggdGhlIHNhbWUgd2F5IENQeXRob24gaXMgdXNlZCwgYW5kIGl0IGNhbiBhbHNvIGJlCi11c2VkIGZvciB0ZXN0IHN1aXRlcyBmb3IgSmF2YSBjb2RlLCBvciBlbWJlZGRlZCBpbiBhIEphdmEgYXBwbGljYXRpb24KLXRvIGFkZCBzY3JpcHRpbmcgY2FwYWJpbGl0aWVzLiAgCi0KLVxzZWN0aW9ue0FyZ3VtZW50cyBhbmQgUmVidXR0YWxzfQotCi1MZXQncyBzYXkgdGhhdCB5b3UndmUgZGVjaWRlZCB1cG9uIFB5dGhvbiBhcyB0aGUgYmVzdCBjaG9pY2UgZm9yIHlvdXIKLWFwcGxpY2F0aW9uLiAgSG93IGNhbiB5b3UgY29udmluY2UgeW91ciBtYW5hZ2VtZW50LCBvciB5b3VyIGZlbGxvdwotZGV2ZWxvcGVycywgdG8gdXNlIFB5dGhvbj8gIFRoaXMgc2VjdGlvbiBsaXN0cyBzb21lIGNvbW1vbiBhcmd1bWVudHMKLWFnYWluc3QgdXNpbmcgUHl0aG9uLCBhbmQgcHJvdmlkZXMgc29tZSBwb3NzaWJsZSByZWJ1dHRhbHMuCi0KLVxlbXBoe1B5dGhvbiBpcyBmcmVlbHkgYXZhaWxhYmxlIHNvZnR3YXJlIHRoYXQgZG9lc24ndCBjb3N0IGFueXRoaW5nLgotSG93IGdvb2QgY2FuIGl0IGJlP30KLQotVmVyeSBnb29kLCBpbmRlZWQuICBUaGVzZSBkYXlzIExpbnV4IGFuZCBBcGFjaGUsIHR3byBvdGhlciBwaWVjZXMgb2YKLW9wZW4gc291cmNlIHNvZnR3YXJlLCBhcmUgYmVjb21pbmcgbW9yZSByZXNwZWN0ZWQgYXMgYWx0ZXJuYXRpdmVzIHRvCi1jb21tZXJjaWFsIHNvZnR3YXJlLCBidXQgUHl0aG9uIGhhc24ndCBoYWQgYWxsIHRoZSBwdWJsaWNpdHkuCi0KLVB5dGhvbiBoYXMgYmVlbiBhcm91bmQgZm9yIHNldmVyYWwgeWVhcnMsIHdpdGggbWFueSB1c2VycyBhbmQKLWRldmVsb3BlcnMuICBBY2NvcmRpbmdseSwgdGhlIGludGVycHJldGVyIGhhcyBiZWVuIHVzZWQgYnkgbWFueQotcGVvcGxlLCBhbmQgaGFzIGdvdHRlbiBtb3N0IG9mIHRoZSBidWdzIHNoYWtlbiBvdXQgb2YgaXQuICBXaGlsZSBidWdzCi1hcmUgc3RpbGwgZGlzY292ZXJlZCBhdCBpbnRlcnZhbHMsIHRoZXkncmUgdXN1YWxseSBlaXRoZXIgcXVpdGUKLW9ic2N1cmUgKHRoZXknZCBoYXZlIHRvIGJlLCBmb3Igbm8gb25lIHRvIGhhdmUgcnVuIGludG8gdGhlbSBiZWZvcmUpCi1vciB0aGV5IGludm9sdmUgaW50ZXJmYWNlcyB0byBleHRlcm5hbCBsaWJyYXJpZXMuICBUaGUgaW50ZXJuYWxzIG9mCi10aGUgbGFuZ3VhZ2UgaXRzZWxmIGFyZSBxdWl0ZSBzdGFibGUuCi0KLUhhdmluZyB0aGUgc291cmNlIGNvZGUgc2hvdWxkIGJlIHZpZXdlZCBhcyBtYWtpbmcgdGhlIHNvZnR3YXJlCi1hdmFpbGFibGUgZm9yIHBlZXIgcmV2aWV3OyBwZW9wbGUgY2FuIGV4YW1pbmUgdGhlIGNvZGUsIHN1Z2dlc3QgKGFuZAotaW1wbGVtZW50KSBpbXByb3ZlbWVudHMsIGFuZCB0cmFjayBkb3duIGJ1Z3MuICBUbyBmaW5kIG91dCBtb3JlIGFib3V0Ci10aGUgaWRlYSBvZiBvcGVuIHNvdXJjZSBjb2RlLCBhbG9uZyB3aXRoIGFyZ3VtZW50cyBhbmQgY2FzZSBzdHVkaWVzCi1zdXBwb3J0aW5nIGl0LCBnbyB0byBcdXJse2h0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmd9LgotCi1cZW1waHtXaG8ncyBnb2luZyB0byBzdXBwb3J0IGl0P30KLQotUHl0aG9uIGhhcyBhIHNpemFibGUgY29tbXVuaXR5IG9mIGRldmVsb3BlcnMsIGFuZCB0aGUgbnVtYmVyIGlzIHN0aWxsCi1ncm93aW5nLiAgVGhlIEludGVybmV0IGNvbW11bml0eSBzdXJyb3VuZGluZyB0aGUgbGFuZ3VhZ2UgaXMgYW4gYWN0aXZlCi1vbmUsIGFuZCBpcyB3b3J0aCBiZWluZyBjb25zaWRlcmVkIGFub3RoZXIgb25lIG9mIFB5dGhvbidzIGFkdmFudGFnZXMuCi1Nb3N0IHF1ZXN0aW9ucyBwb3N0ZWQgdG8gdGhlIGNvbXAubGFuZy5weXRob24gbmV3c2dyb3VwIGFyZSBxdWlja2x5Ci1hbnN3ZXJlZCBieSBzb21lb25lLgotCi1TaG91bGQgeW91IG5lZWQgdG8gZGlnIGludG8gdGhlIHNvdXJjZSBjb2RlLCB5b3UnbGwgZmluZCBpdCdzIGNsZWFyCi1hbmQgd2VsbC1vcmdhbml6ZWQsIHNvIGl0J3Mgbm90IHZlcnkgZGlmZmljdWx0IHRvIHdyaXRlIGV4dGVuc2lvbnMgYW5kCi10cmFjayBkb3duIGJ1Z3MgeW91cnNlbGYuICBJZiB5b3UnZCBwcmVmZXIgdG8gcGF5IGZvciBzdXBwb3J0LCB0aGVyZQotYXJlIGNvbXBhbmllcyBhbmQgaW5kaXZpZHVhbHMgd2hvIG9mZmVyIGNvbW1lcmNpYWwgc3VwcG9ydCBmb3IgUHl0aG9uLgotCi1cZW1waHtXaG8gdXNlcyBQeXRob24gZm9yIHNlcmlvdXMgd29yaz99Ci0KLUxvdHMgb2YgcGVvcGxlOyBvbmUgaW50ZXJlc3RpbmcgdGhpbmcgYWJvdXQgUHl0aG9uIGlzIHRoZSBzdXJwcmlzaW5nCi1kaXZlcnNpdHkgb2YgYXBwbGljYXRpb25zIHRoYXQgaXQncyBiZWVuIHVzZWQgZm9yLiAgUGVvcGxlIGFyZSB1c2luZwotUHl0aG9uIHRvOgotCi1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtIFJ1biBXZWIgc2l0ZXMKLVxpdGVtIFdyaXRlIEdVSSBpbnRlcmZhY2VzCi1caXRlbSBDb250cm9sCi1udW1iZXItY3J1bmNoaW5nIGNvZGUgb24gc3VwZXJjb21wdXRlcnMKLVxpdGVtIE1ha2UgYSBjb21tZXJjaWFsIGFwcGxpY2F0aW9uIHNjcmlwdGFibGUgYnkgZW1iZWRkaW5nIHRoZSBQeXRob24KLWludGVycHJldGVyIGluc2lkZSBpdAotXGl0ZW0gUHJvY2VzcyBsYXJnZSBYTUwgZGF0YSBzZXRzCi1caXRlbSBCdWlsZCB0ZXN0IHN1aXRlcyBmb3IgQyBvciBKYXZhIGNvZGUKLVxlbmR7aXRlbWl6ZX0KLQotV2hhdGV2ZXIgeW91ciBhcHBsaWNhdGlvbiBkb21haW4gaXMsIHRoZXJlJ3MgcHJvYmFibHkgc29tZW9uZSB3aG8ncwotdXNlZCBQeXRob24gZm9yIHNvbWV0aGluZyBzaW1pbGFyLiAgWWV0LCBkZXNwaXRlIGJlaW5nIHVzZWFibGUgZm9yCi1zdWNoIGhpZ2gtZW5kIGFwcGxpY2F0aW9ucywgUHl0aG9uJ3Mgc3RpbGwgc2ltcGxlIGVub3VnaCB0byB1c2UgZm9yCi1saXR0bGUgam9icy4KLQotU2VlIFx1cmx7aHR0cDovL3dpa2kucHl0aG9uLm9yZy9tb2luL09yZ2FuaXphdGlvbnNVc2luZ1B5dGhvbn0gZm9yIGEgbGlzdCBvZiBzb21lIG9mIHRoZSAKLW9yZ2FuaXphdGlvbnMgdGhhdCB1c2UgUHl0aG9uLgotCi1cZW1waHtXaGF0IGFyZSB0aGUgcmVzdHJpY3Rpb25zIG9uIFB5dGhvbidzIHVzZT99Ci0KLVRoZXkncmUgcHJhY3RpY2FsbHkgbm9uZXhpc3RlbnQuICBDb25zdWx0IHRoZSBcZmlsZXtNaXNjL0NPUFlSSUdIVH0KLWZpbGUgaW4gdGhlIHNvdXJjZSBkaXN0cmlidXRpb24sIG9yCi1cdXJse2h0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvQ29weXJpZ2h0Lmh0bWx9IGZvciB0aGUgZnVsbCBsYW5ndWFnZSwKLWJ1dCBpdCBib2lscyBkb3duIHRvIHRocmVlIGNvbmRpdGlvbnMuCi0KLVxiZWdpbntpdGVtaXplfQotCi1caXRlbSBZb3UgaGF2ZSB0byBsZWF2ZSB0aGUgY29weXJpZ2h0IG5vdGljZSBvbiB0aGUgc29mdHdhcmU7IGlmIHlvdQotZG9uJ3QgaW5jbHVkZSB0aGUgc291cmNlIGNvZGUgaW4gYSBwcm9kdWN0LCB5b3UgaGF2ZSB0byBwdXQgdGhlCi1jb3B5cmlnaHQgbm90aWNlIGluIHRoZSBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICAKLQotXGl0ZW0gRG9uJ3QgY2xhaW0gdGhhdCB0aGUgaW5zdGl0dXRpb25zIHRoYXQgaGF2ZSBkZXZlbG9wZWQgUHl0aG9uCi1lbmRvcnNlIHlvdXIgcHJvZHVjdCBpbiBhbnkgd2F5LgotCi1caXRlbSBJZiBzb21ldGhpbmcgZ29lcyB3cm9uZywgeW91IGNhbid0IHN1ZSBmb3IgZGFtYWdlcy4gIFByYWN0aWNhbGx5Ci1hbGwgc29mdHdhcmUgbGljZW5jZXMgY29udGFpbiB0aGlzIGNvbmRpdGlvbi4KLQotXGVuZHtpdGVtaXplfQotCi1Ob3RpY2UgdGhhdCB5b3UgZG9uJ3QgaGF2ZSB0byBwcm92aWRlIHNvdXJjZSBjb2RlIGZvciBhbnl0aGluZyB0aGF0Ci1jb250YWlucyBQeXRob24gb3IgaXMgYnVpbHQgd2l0aCBpdC4gIEFsc28sIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgYW5kCi1hY2NvbXBhbnlpbmcgZG9jdW1lbnRhdGlvbiBjYW4gYmUgbW9kaWZpZWQgYW5kIHJlZGlzdHJpYnV0ZWQgaW4gYW55Ci13YXkgeW91IGxpa2UsIGFuZCB5b3UgZG9uJ3QgaGF2ZSB0byBwYXkgYW55b25lIGFueSBsaWNlbnNpbmcgZmVlcyBhdAotYWxsLgotCi1cZW1waHtXaHkgc2hvdWxkIHdlIHVzZSBhbiBvYnNjdXJlIGxhbmd1YWdlIGxpa2UgUHl0aG9uIGluc3RlYWQgb2YKLXdlbGwta25vd24gbGFuZ3VhZ2UgWD99Ci0KLUkgaG9wZSB0aGlzIEhPV1RPLCBhbmQgdGhlIGRvY3VtZW50cyBsaXN0ZWQgaW4gdGhlIGZpbmFsIHNlY3Rpb24sIHdpbGwKLWhlbHAgY29udmluY2UgeW91IHRoYXQgUHl0aG9uIGlzbid0IG9ic2N1cmUsIGFuZCBoYXMgYSBoZWFsdGhpbHkKLWdyb3dpbmcgdXNlciBiYXNlLiAgT25lIHdvcmQgb2YgYWR2aWNlOiBhbHdheXMgcHJlc2VudCBQeXRob24ncwotcG9zaXRpdmUgYWR2YW50YWdlcywgaW5zdGVhZCBvZiBjb25jZW50cmF0aW5nIG9uIGxhbmd1YWdlIFgncwotZmFpbGluZ3MuICBQZW9wbGUgd2FudCB0byBrbm93IHdoeSBhIHNvbHV0aW9uIGlzIGdvb2QsIHJhdGhlciB0aGFuIHdoeQotYWxsIHRoZSBvdGhlciBzb2x1dGlvbnMgYXJlIGJhZC4gIFNvIGluc3RlYWQgb2YgYXR0YWNraW5nIGEgY29tcGV0aW5nCi1zb2x1dGlvbiBvbiB2YXJpb3VzIGdyb3VuZHMsIHNpbXBseSBzaG93IGhvdyBQeXRob24ncyB2aXJ0dWVzIGNhbgotaGVscC4KLQotCi1cc2VjdGlvbntVc2VmdWwgUmVzb3VyY2VzfQotCi1cYmVnaW57ZGVmaW5pdGlvbnN9Ci0KLQotXHRlcm17XHVybHtodHRwOi8vd3d3LnB5dGhvbm9sb2d5LmNvbS9zdWNjZXNzfX0KLQotVGhlIFB5dGhvbiBTdWNjZXNzIFN0b3JpZXMgYXJlIGEgY29sbGVjdGlvbiBvZiBzdG9yaWVzIGZyb20gc3VjY2Vzc2Z1bAotdXNlcnMgb2YgUHl0aG9uLCB3aXRoIHRoZSBlbXBoYXNpcyBvbiBidXNpbmVzcyBhbmQgY29ycG9yYXRlIHVzZXJzLgotIAotJVx0ZXJte1x1cmx7aHR0cDovL3d3dy5mc2Jhc3NvY2lhdGVzLmNvbS9ib29rcy9weXRob25jaHB0MS5odG19fQotCi0lVGhlIGZpcnN0IGNoYXB0ZXIgb2YgXGVtcGh7SW50ZXJuZXQgUHJvZ3JhbW1pbmcgd2l0aCBQeXRob259IGFsc28KLSVleGFtaW5lcyBzb21lIG9mIHRoZSByZWFzb25zIGZvciB1c2luZyBQeXRob24uICBUaGUgYm9vayBpcyB3ZWxsIHdvcnRoCi0lYnV5aW5nLCBidXQgdGhlIHB1Ymxpc2hlcnMgaGF2ZSBtYWRlIHRoZSBmaXJzdCBjaGFwdGVyIGF2YWlsYWJsZSBvbgotJXRoZSBXZWIuCi0KLVx0ZXJte1x1cmx7aHR0cDovL2hvbWUucGFjYmVsbC5uZXQvb3VzdGVyL3NjcmlwdGluZy5odG1sfX0KLSAKLUpvaG4gT3VzdGVyaG91dCdzIHdoaXRlIHBhcGVyIG9uIHNjcmlwdGluZyBpcyBhIGdvb2QgYXJndW1lbnQgZm9yIHRoZQotdXRpbGl0eSBvZiBzY3JpcHRpbmcgbGFuZ3VhZ2VzLCB0aG91Z2ggbmF0dXJhbGx5IGVub3VnaCwgaGUgZW1waGFzaXplcwotVGNsLCB0aGUgbGFuZ3VhZ2UgaGUgZGV2ZWxvcGVkLiAgTW9zdCBvZiB0aGUgYXJndW1lbnRzIHdvdWxkIGFwcGx5IHRvCi1hbnkgc2NyaXB0aW5nIGxhbmd1YWdlLgotCi1cdGVybXtcdXJse2h0dHA6Ly93d3cucHl0aG9uLm9yZy93b3Jrc2hvcHMvMTk5Ny0xMC9wcm9jZWVkaW5ncy9iZWF6bGV5Lmh0bWx9fQotCi1UaGUgYXV0aG9ycywgRGF2aWQgTS4gQmVhemxleSBhbmQgUGV0ZXIgUy4gTG9tZGFobCwgCi1kZXNjcmliZSB0aGVpciB1c2Ugb2YgUHl0aG9uIGF0IExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeS4KLUl0J3MgYW5vdGhlciBnb29kIGV4YW1wbGUgb2YgaG93IFB5dGhvbiBjYW4gaGVscCBnZXQgcmVhbCB3b3JrIGRvbmUuCi1UaGlzIHF1b3RhdGlvbiBmcm9tIHRoZSBwYXBlciBoYXMgYmVlbiBlY2hvZWQgYnkgbWFueSBwZW9wbGU6Ci0KLVxiZWdpbntxdW90YXRpb259Ci0gICAgICAgT3JpZ2luYWxseSBkZXZlbG9wZWQgYXMgYSBsYXJnZSBtb25vbGl0aGljIGFwcGxpY2F0aW9uIGZvcgotICAgICAgIG1hc3NpdmVseSBwYXJhbGxlbCBwcm9jZXNzaW5nIHN5c3RlbXMsIHdlIGhhdmUgdXNlZCBQeXRob24gdG8KLSAgICAgICB0cmFuc2Zvcm0gb3VyIGFwcGxpY2F0aW9uIGludG8gYSBmbGV4aWJsZSwgaGlnaGx5IG1vZHVsYXIsIGFuZAotICAgICAgIGV4dHJlbWVseSBwb3dlcmZ1bCBzeXN0ZW0gZm9yIHBlcmZvcm1pbmcgc2ltdWxhdGlvbiwgZGF0YQotICAgICAgIGFuYWx5c2lzLCBhbmQgdmlzdWFsaXphdGlvbi4gSW4gYWRkaXRpb24sIHdlIGRlc2NyaWJlIGhvdyBQeXRob24KLSAgICAgICBoYXMgc29sdmVkIGEgbnVtYmVyIG9mIGltcG9ydGFudCBwcm9ibGVtcyByZWxhdGVkIHRvIHRoZQotICAgICAgIGRldmVsb3BtZW50LCBkZWJ1Z2dpbmcsIGRlcGxveW1lbnQsIGFuZCBtYWludGVuYW5jZSBvZiBzY2llbnRpZmljCi0gICAgICAgc29mdHdhcmUuCi1cZW5ke3F1b3RhdGlvbn0KLQotXHRlcm17XHVybHtodHRwOi8vcHl0aG9uam91cm5hbC5jb2duaXpvci5jb20vcHlqMS9FdmVyaXR0LUZlaXRfaW50ZXJ2aWV3OTgtVjEuaHRtbH19Ci0gCi1UaGlzIGludGVydmlldyB3aXRoIEFuZHkgRmVpdCwgZGlzY3Vzc2luZyBJbmZvc2VlaydzIHVzZSBvZiBQeXRob24sIGNhbiBiZQotdXNlZCB0byBzaG93IHRoYXQgY2hvb3NpbmcgUHl0aG9uIGRpZG4ndCBpbnRyb2R1Y2UgYW55IGRpZmZpY3VsdGllcwotaW50byBhIGNvbXBhbnkncyBkZXZlbG9wbWVudCBwcm9jZXNzLCBhbmQgcHJvdmlkZWQgc29tZSBzdWJzdGFudGlhbCBiZW5lZml0cy4KLQotJVx0ZXJte1x1cmx7aHR0cDovL3d3dy5weXRob24ub3JnL3BzYS9Db21tZXJjaWFsLmh0bWx9fSAKLQotJVJvYmluIEZyaWVkcmljaCB3cm90ZSB0aGlzIGRvY3VtZW50IG9uIGhvdyB0byBzdXBwb3J0IFB5dGhvbidzIHVzZSBpbgotJWNvbW1lcmNpYWwgcHJvamVjdHMuCi0KLVx0ZXJte1x1cmx7aHR0cDovL3d3dy5weXRob24ub3JnL3dvcmtzaG9wcy8xOTk3LTEwL3Byb2NlZWRpbmdzL3N0ZWluLnBzfX0KLQotRm9yIHRoZSA2dGggUHl0aG9uIGNvbmZlcmVuY2UsIEdyZWcgU3RlaW4gcHJlc2VudGVkIGEgcGFwZXIgdGhhdAotdHJhY2VkIFB5dGhvbidzIGFkb3B0aW9uIGFuZCB1c2FnZSBhdCBhIHN0YXJ0dXAgY2FsbGVkIGVTaG9wLCBhbmQKLWxhdGVyIGF0IE1pY3Jvc29mdC4KLQotXHRlcm17XHVybHtodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnfX0gCi0KLU1hbmFnZW1lbnQgbWF5IGJlIGRvdWJ0ZnVsIG9mIHRoZSByZWxpYWJpbGl0eSBhbmQgdXNlZnVsbmVzcyBvZgotc29mdHdhcmUgdGhhdCB3YXNuJ3Qgd3JpdHRlbiBjb21tZXJjaWFsbHkuICBUaGlzIHNpdGUgcHJlc2VudHMKLWFyZ3VtZW50cyB0aGF0IHNob3cgaG93IG9wZW4gc291cmNlIHNvZnR3YXJlIGNhbiBoYXZlIGNvbnNpZGVyYWJsZQotYWR2YW50YWdlcyBvdmVyIGNsb3NlZC1zb3VyY2Ugc29mdHdhcmUuCi0KLVx0ZXJte1x1cmx7aHR0cDovL3N1bnNpdGUudW5jLmVkdS9MRFAvSE9XVE8vbWluaS9BZHZvY2FjeS5odG1sfX0KLQotVGhlIExpbnV4IEFkdm9jYWN5IG1pbmktSE9XVE8gd2FzIHRoZSBpbnNwaXJhdGlvbiBmb3IgdGhpcyBkb2N1bWVudCwKLWFuZCBpcyBhbHNvIHdlbGwgd29ydGggcmVhZGluZyBmb3IgZ2VuZXJhbCBzdWdnZXN0aW9ucyBvbiB3aW5uaW5nCi1hY2NlcHRhbmNlIGZvciBhIG5ldyB0ZWNobm9sb2d5LCBzdWNoIGFzIExpbnV4IG9yIFB5dGhvbi4gIEluIGdlbmVyYWwsCi15b3Ugd29uJ3QgbWFrZSBtdWNoIHByb2dyZXNzIGJ5IHNpbXBseSBhdHRhY2tpbmcgZXhpc3Rpbmcgc3lzdGVtcyBhbmQKLWNvbXBsYWluaW5nIGFib3V0IHRoZWlyIGluYWRlcXVhY2llczsgdGhpcyBvZnRlbiBlbmRzIHVwIGxvb2tpbmcgbGlrZQotdW5mb2N1c2VkIHdoaW5pbmcuICBJdCdzIG11Y2ggYmV0dGVyIHRvIHBvaW50IG91dCBzb21lIG9mIHRoZSBtYW55Ci1hcmVhcyB3aGVyZSBQeXRob24gaXMgYW4gaW1wcm92ZW1lbnQgb3ZlciBvdGhlciBzeXN0ZW1zLiAgCi0KLVxlbmR7ZGVmaW5pdGlvbnN9Ci0KLVxlbmR7ZG9jdW1lbnR9Ci0KLQpkaWZmIC0tZ2l0IGEvRG9jL2hvd3RvL2N1cnNlcy50ZXggYi9Eb2MvaG93dG8vY3Vyc2VzLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U0Y2FkYS4uMDAwMDAwMAotLS0gYS9Eb2MvaG93dG8vY3Vyc2VzLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDQ4NiArMCwwIEBACi1cZG9jdW1lbnRjbGFzc3tob3d0b30KLQotXHRpdGxle0N1cnNlcyBQcm9ncmFtbWluZyB3aXRoIFB5dGhvbn0KLQotXHJlbGVhc2V7Mi4wMn0KLQotXGF1dGhvcntBLk0uIEt1Y2hsaW5nLCBFcmljIFMuIFJheW1vbmR9Ci1cYXV0aG9yYWRkcmVzc3tcZW1haWx7YW1rQGFtay5jYX0sIFxlbWFpbHtlc3JAdGh5cnN1cy5jb219fQotCi1cYmVnaW57ZG9jdW1lbnR9Ci1cbWFrZXRpdGxlCi0KLVxiZWdpbnthYnN0cmFjdH0KLVxub2luZGVudAotVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgaG93IHRvIHdyaXRlIHRleHQtbW9kZSBwcm9ncmFtcyB3aXRoIFB5dGhvbiAyLngsCi11c2luZyB0aGUgXG1vZHVsZXtjdXJzZXN9IGV4dGVuc2lvbiBtb2R1bGUgdG8gY29udHJvbCB0aGUgZGlzcGxheS4gICAKLQotVGhpcyBkb2N1bWVudCBpcyBhdmFpbGFibGUgZnJvbSB0aGUgUHl0aG9uIEhPV1RPIHBhZ2UgYXQKLVx1cmx7aHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9ob3d0b30uCi1cZW5ke2Fic3RyYWN0fQotCi1cdGFibGVvZmNvbnRlbnRzCi0KLVxzZWN0aW9ue1doYXQgaXMgY3Vyc2VzP30KLQotVGhlIGN1cnNlcyBsaWJyYXJ5IHN1cHBsaWVzIGEgdGVybWluYWwtaW5kZXBlbmRlbnQgc2NyZWVuLXBhaW50aW5nIGFuZAota2V5Ym9hcmQtaGFuZGxpbmcgZmFjaWxpdHkgZm9yIHRleHQtYmFzZWQgdGVybWluYWxzOyBzdWNoIHRlcm1pbmFscwotaW5jbHVkZSBWVDEwMHMsIHRoZSBMaW51eCBjb25zb2xlLCBhbmQgdGhlIHNpbXVsYXRlZCB0ZXJtaW5hbCBwcm92aWRlZAotYnkgWDExIHByb2dyYW1zIHN1Y2ggYXMgeHRlcm0gYW5kIHJ4dnQuICBEaXNwbGF5IHRlcm1pbmFscyBzdXBwb3J0Ci12YXJpb3VzIGNvbnRyb2wgY29kZXMgdG8gcGVyZm9ybSBjb21tb24gb3BlcmF0aW9ucyBzdWNoIGFzIG1vdmluZyB0aGUKLWN1cnNvciwgc2Nyb2xsaW5nIHRoZSBzY3JlZW4sIGFuZCBlcmFzaW5nIGFyZWFzLiAgRGlmZmVyZW50IHRlcm1pbmFscwotdXNlIHdpZGVseSBkaWZmZXJpbmcgY29kZXMsIGFuZCBvZnRlbiBoYXZlIHRoZWlyIG93biBtaW5vciBxdWlya3MuCi0KLUluIGEgd29ybGQgb2YgWCBkaXNwbGF5cywgb25lIG1pZ2h0IGFzayBgYHdoeSBib3RoZXInJz8gIEl0J3MgdHJ1ZQotdGhhdCBjaGFyYWN0ZXItY2VsbCBkaXNwbGF5IHRlcm1pbmFscyBhcmUgYW4gb2Jzb2xldGUgdGVjaG5vbG9neSwgYnV0Ci10aGVyZSBhcmUgbmljaGVzIGluIHdoaWNoIGJlaW5nIGFibGUgdG8gZG8gZmFuY3kgdGhpbmdzIHdpdGggdGhlbSBhcmUKLXN0aWxsIHZhbHVhYmxlLiAgT25lIGlzIG9uIHNtYWxsLWZvb3RwcmludCBvciBlbWJlZGRlZCBVbml4ZXMgdGhhdCAKLWRvbid0IGNhcnJ5IGFuIFggc2VydmVyLiAgQW5vdGhlciBpcyBmb3IgdG9vbHMgbGlrZSBPUyBpbnN0YWxsZXJzCi1hbmQga2VybmVsIGNvbmZpZ3VyYXRvcnMgdGhhdCBtYXkgaGF2ZSB0byBydW4gYmVmb3JlIFggaXMgYXZhaWxhYmxlLgotCi1UaGUgY3Vyc2VzIGxpYnJhcnkgaGlkZXMgYWxsIHRoZSBkZXRhaWxzIG9mIGRpZmZlcmVudCB0ZXJtaW5hbHMsIGFuZAotcHJvdmlkZXMgdGhlIHByb2dyYW1tZXIgd2l0aCBhbiBhYnN0cmFjdGlvbiBvZiBhIGRpc3BsYXksIGNvbnRhaW5pbmcKLW11bHRpcGxlIG5vbi1vdmVybGFwcGluZyB3aW5kb3dzLiAgVGhlIGNvbnRlbnRzIG9mIGEgd2luZG93IGNhbiBiZQotY2hhbmdlZCBpbiB2YXJpb3VzIHdheXMtLWFkZGluZyB0ZXh0LCBlcmFzaW5nIGl0LCBjaGFuZ2luZyBpdHMKLWFwcGVhcmFuY2UtLWFuZCB0aGUgY3Vyc2VzIGxpYnJhcnkgd2lsbCBhdXRvbWFnaWNhbGx5IGZpZ3VyZSBvdXQgd2hhdAotY29udHJvbCBjb2RlcyBuZWVkIHRvIGJlIHNlbnQgdG8gdGhlIHRlcm1pbmFsIHRvIHByb2R1Y2UgdGhlIHJpZ2h0Ci1vdXRwdXQuCi0KLVRoZSBjdXJzZXMgbGlicmFyeSB3YXMgb3JpZ2luYWxseSB3cml0dGVuIGZvciBCU0QgVW5peDsgdGhlIGxhdGVyIFN5c3RlbSBWCi12ZXJzaW9ucyBvZiBVbml4IGZyb20gQVRcJlQgYWRkZWQgbWFueSBlbmhhbmNlbWVudHMgYW5kIG5ldyBmdW5jdGlvbnMuCi1CU0QgY3Vyc2VzIGlzIG5vIGxvbmdlciBtYWludGFpbmVkLCBoYXZpbmcgYmVlbiByZXBsYWNlZCBieSBuY3Vyc2VzLAotd2hpY2ggaXMgYW4gb3Blbi1zb3VyY2UgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFUXCZUIGludGVyZmFjZS4gIElmIHlvdSdyZQotdXNpbmcgYW4gb3Blbi1zb3VyY2UgVW5peCBzdWNoIGFzIExpbnV4IG9yIEZyZWVCU0QsIHlvdXIgc3lzdGVtIGFsbW9zdAotY2VydGFpbmx5IHVzZXMgbmN1cnNlcy4gIFNpbmNlIG1vc3QgY3VycmVudCBjb21tZXJjaWFsIFVuaXggdmVyc2lvbnMKLWFyZSBiYXNlZCBvbiBTeXN0ZW0gViBjb2RlLCBhbGwgdGhlIGZ1bmN0aW9ucyBkZXNjcmliZWQgaGVyZSB3aWxsCi1wcm9iYWJseSBiZSBhdmFpbGFibGUuICBUaGUgb2xkZXIgdmVyc2lvbnMgb2YgY3Vyc2VzIGNhcnJpZWQgYnkgc29tZQotcHJvcHJpZXRhcnkgVW5peGVzIG1heSBub3Qgc3VwcG9ydCBldmVyeXRoaW5nLCB0aG91Z2guCi0KLU5vIG9uZSBoYXMgbWFkZSBhIFdpbmRvd3MgcG9ydCBvZiB0aGUgY3Vyc2VzIG1vZHVsZS4gIE9uIGEgV2luZG93cwotcGxhdGZvcm0sIHRyeSB0aGUgQ29uc29sZSBtb2R1bGUgd3JpdHRlbiBieSBGcmVkcmlrIEx1bmRoLiAgVGhlCi1Db25zb2xlIG1vZHVsZSBwcm92aWRlcyBjdXJzb3ItYWRkcmVzc2FibGUgdGV4dCBvdXRwdXQsIHBsdXMgZnVsbAotc3VwcG9ydCBmb3IgbW91c2UgYW5kIGtleWJvYXJkIGlucHV0LCBhbmQgaXMgYXZhaWxhYmxlIGZyb20KLVx1cmx7aHR0cDovL2VmZmJvdC5vcmcvZWZmbGliL2NvbnNvbGV9LgotCi1cc3Vic2VjdGlvbntUaGUgUHl0aG9uIGN1cnNlcyBtb2R1bGV9Ci0KLVRoeSBQeXRob24gbW9kdWxlIGlzIGEgZmFpcmx5IHNpbXBsZSB3cmFwcGVyIG92ZXIgdGhlIEMgZnVuY3Rpb25zCi1wcm92aWRlZCBieSBjdXJzZXM7IGlmIHlvdSdyZSBhbHJlYWR5IGZhbWlsaWFyIHdpdGggY3Vyc2VzIHByb2dyYW1taW5nCi1pbiBDLCBpdCdzIHJlYWxseSBlYXN5IHRvIHRyYW5zZmVyIHRoYXQga25vd2xlZGdlIHRvIFB5dGhvbi4gIFRoZQotYmlnZ2VzdCBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlIFB5dGhvbiBpbnRlcmZhY2UgbWFrZXMgdGhpbmdzIHNpbXBsZXIsCi1ieSBtZXJnaW5nIGRpZmZlcmVudCBDIGZ1bmN0aW9ucyBzdWNoIGFzIFxmdW5jdGlvbnthZGRzdHJ9LAotXGZ1bmN0aW9ue212YWRkc3RyfSwgXGZ1bmN0aW9ue212d2FkZHN0cn0sIGludG8gYSBzaW5nbGUKLVxtZXRob2R7YWRkc3RyKCl9IG1ldGhvZC4gIFlvdSdsbCBzZWUgdGhpcyBjb3ZlcmVkIGluIG1vcmUgZGV0YWlsCi1sYXRlci4KLQotVGhpcyBIT1dUTyBpcyBzaW1wbHkgYW4gaW50cm9kdWN0aW9uIHRvIHdyaXRpbmcgdGV4dC1tb2RlIHByb2dyYW1zCi13aXRoIGN1cnNlcyBhbmQgUHl0aG9uLiBJdCBkb2Vzbid0IGF0dGVtcHQgdG8gYmUgYSBjb21wbGV0ZSBndWlkZSB0bwotdGhlIGN1cnNlcyBBUEk7IGZvciB0aGF0LCBzZWUgdGhlIFB5dGhvbiBsaWJyYXJ5IGd1aWRlJ3Mgc2VjdGlvbiBvbgotbmN1cnNlcywgYW5kIHRoZSBDIG1hbnVhbCBwYWdlcyBmb3IgbmN1cnNlcy4gIEl0IHdpbGwsIGhvd2V2ZXIsIGdpdmUKLXlvdSB0aGUgYmFzaWMgaWRlYXMuCi0KLVxzZWN0aW9ue1N0YXJ0aW5nIGFuZCBlbmRpbmcgYSBjdXJzZXMgYXBwbGljYXRpb259Ci0KLUJlZm9yZSBkb2luZyBhbnl0aGluZywgY3Vyc2VzIG11c3QgYmUgaW5pdGlhbGl6ZWQuICBUaGlzIGlzIGRvbmUgYnkKLWNhbGxpbmcgdGhlIFxmdW5jdGlvbntpbml0c2NyKCl9IGZ1bmN0aW9uLCB3aGljaCB3aWxsIGRldGVybWluZSB0aGUKLXRlcm1pbmFsIHR5cGUsIHNlbmQgYW55IHJlcXVpcmVkIHNldHVwIGNvZGVzIHRvIHRoZSB0ZXJtaW5hbCwgYW5kCi1jcmVhdGUgdmFyaW91cyBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMuICBJZiBzdWNjZXNzZnVsLAotXGZ1bmN0aW9ue2luaXRzY3IoKX0gcmV0dXJucyBhIHdpbmRvdyBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBlbnRpcmUKLXNjcmVlbjsgdGhpcyBpcyB1c3VhbGx5IGNhbGxlZCBcY29kZXtzdGRzY3J9LCBhZnRlciB0aGUgbmFtZSBvZiB0aGUKLWNvcnJlc3BvbmRpbmcgQwotdmFyaWFibGUuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCBjdXJzZXMKLXN0ZHNjciA9IGN1cnNlcy5pbml0c2NyKCkKLVxlbmR7dmVyYmF0aW19Ci0KLVVzdWFsbHkgY3Vyc2VzIGFwcGxpY2F0aW9ucyB0dXJuIG9mZiBhdXRvbWF0aWMgZWNob2luZyBvZiBrZXlzIHRvIHRoZQotc2NyZWVuLCBpbiBvcmRlciB0byBiZSBhYmxlIHRvIHJlYWQga2V5cyBhbmQgb25seSBkaXNwbGF5IHRoZW0gdW5kZXIKLWNlcnRhaW4gY2lyY3Vtc3RhbmNlcy4gIFRoaXMgcmVxdWlyZXMgY2FsbGluZyB0aGUgXGZ1bmN0aW9ue25vZWNobygpfQotZnVuY3Rpb24uCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLWN1cnNlcy5ub2VjaG8oKQotXGVuZHt2ZXJiYXRpbX0KLQotQXBwbGljYXRpb25zIHdpbGwgYWxzbyBjb21tb25seSBuZWVkIHRvIHJlYWN0IHRvIGtleXMgaW5zdGFudGx5LAotd2l0aG91dCByZXF1aXJpbmcgdGhlIEVudGVyIGtleSB0byBiZSBwcmVzc2VkOyB0aGlzIGlzIGNhbGxlZCBjYnJlYWsKLW1vZGUsIGFzIG9wcG9zZWQgdG8gdGhlIHVzdWFsIGJ1ZmZlcmVkIGlucHV0IG1vZGUuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLWN1cnNlcy5jYnJlYWsoKQotXGVuZHt2ZXJiYXRpbX0KLQotVGVybWluYWxzIHVzdWFsbHkgcmV0dXJuIHNwZWNpYWwga2V5cywgc3VjaCBhcyB0aGUgY3Vyc29yIGtleXMgb3IKLW5hdmlnYXRpb24ga2V5cyBzdWNoIGFzIFBhZ2UgVXAgYW5kIEhvbWUsIGFzIGEgbXVsdGlieXRlIGVzY2FwZQotc2VxdWVuY2UuICBXaGlsZSB5b3UgY291bGQgd3JpdGUgeW91ciBhcHBsaWNhdGlvbiB0byBleHBlY3Qgc3VjaAotc2VxdWVuY2VzIGFuZCBwcm9jZXNzIHRoZW0gYWNjb3JkaW5nbHksIGN1cnNlcyBjYW4gZG8gaXQgZm9yIHlvdSwKLXJldHVybmluZyBhIHNwZWNpYWwgdmFsdWUgc3VjaCBhcyBcY29uc3RhbnR7Y3Vyc2VzLktFWV9MRUZUfS4gIFRvIGdldAotY3Vyc2VzIHRvIGRvIHRoZSBqb2IsIHlvdSdsbCBoYXZlIHRvIGVuYWJsZSBrZXlwYWQgbW9kZS4KLQotXGJlZ2lue3ZlcmJhdGltfQotc3Rkc2NyLmtleXBhZCgxKQotXGVuZHt2ZXJiYXRpbX0KLQotVGVybWluYXRpbmcgYSBjdXJzZXMgYXBwbGljYXRpb24gaXMgbXVjaCBlYXNpZXIgdGhhbiBzdGFydGluZyBvbmUuCi1Zb3UnbGwgbmVlZCB0byBjYWxsIAotCi1cYmVnaW57dmVyYmF0aW19Ci1jdXJzZXMubm9jYnJlYWsoKTsgc3Rkc2NyLmtleXBhZCgwKTsgY3Vyc2VzLmVjaG8oKQotXGVuZHt2ZXJiYXRpbX0KLQotdG8gcmV2ZXJzZSB0aGUgY3Vyc2VzLWZyaWVuZGx5IHRlcm1pbmFsIHNldHRpbmdzLiBUaGVuIGNhbGwgdGhlCi1cZnVuY3Rpb257ZW5kd2luKCl9IGZ1bmN0aW9uIHRvIHJlc3RvcmUgdGhlIHRlcm1pbmFsIHRvIGl0cyBvcmlnaW5hbAotb3BlcmF0aW5nIG1vZGUuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLWN1cnNlcy5lbmR3aW4oKQotXGVuZHt2ZXJiYXRpbX0KLQotQSBjb21tb24gcHJvYmxlbSB3aGVuIGRlYnVnZ2luZyBhIGN1cnNlcyBhcHBsaWNhdGlvbiBpcyB0byBnZXQgeW91cgotdGVybWluYWwgbWVzc2VkIHVwIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGRpZXMgd2l0aG91dCByZXN0b3JpbmcgdGhlCi10ZXJtaW5hbCB0byBpdHMgcHJldmlvdXMgc3RhdGUuICBJbiBQeXRob24gdGhpcyBjb21tb25seSBoYXBwZW5zIHdoZW4KLXlvdXIgY29kZSBpcyBidWdneSBhbmQgcmFpc2VzIGFuIHVuY2F1Z2h0IGV4Y2VwdGlvbi4gIEtleXMgYXJlIG5vCi1sb25nZXIgYmUgZWNob2VkIHRvIHRoZSBzY3JlZW4gd2hlbiB5b3UgdHlwZSB0aGVtLCBmb3IgZXhhbXBsZSwgd2hpY2gKLW1ha2VzIHVzaW5nIHRoZSBzaGVsbCBkaWZmaWN1bHQuCi0KLUluIFB5dGhvbiB5b3UgY2FuIGF2b2lkIHRoZXNlIGNvbXBsaWNhdGlvbnMgYW5kIG1ha2UgZGVidWdnaW5nIG11Y2gKLWVhc2llciBieSBpbXBvcnRpbmcgdGhlIG1vZHVsZSBcbW9kdWxle2N1cnNlcy53cmFwcGVyfS4gIEl0IHN1cHBsaWVzIGEKLVxmdW5jdGlvbnt3cmFwcGVyKCl9IGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBjYWxsYWJsZS4gIEl0IGRvZXMgdGhlCi1pbml0aWFsaXphdGlvbnMgZGVzY3JpYmVkIGFib3ZlLCBhbmQgYWxzbyBpbml0aWFsaXplcyBjb2xvcnMgaWYgY29sb3IKLXN1cHBvcnQgaXMgcHJlc2VudC4gIEl0IHRoZW4gcnVucyB5b3VyIHByb3ZpZGVkIGNhbGxhYmxlIGFuZCBmaW5hbGx5Ci1kZWluaXRpYWxpemVzIGFwcHJvcHJpYXRlbHkuICBUaGUgY2FsbGFibGUgaXMgY2FsbGVkIGluc2lkZSBhIHRyeS1jYXRjaAotY2xhdXNlIHdoaWNoIGNhdGNoZXMgZXhjZXB0aW9ucywgcGVyZm9ybXMgY3Vyc2VzIGRlaW5pdGlhbGl6YXRpb24sIGFuZAotdGhlbiBwYXNzZXMgdGhlIGV4Y2VwdGlvbiB1cHdhcmRzLiAgVGh1cywgeW91ciB0ZXJtaW5hbCB3b24ndCBiZSBsZWZ0Ci1pbiBhIGZ1bm55IHN0YXRlIG9uIGV4Y2VwdGlvbi4KLQotXHNlY3Rpb257V2luZG93cyBhbmQgUGFkc30KLQotV2luZG93cyBhcmUgdGhlIGJhc2ljIGFic3RyYWN0aW9uIGluIGN1cnNlcy4gIEEgd2luZG93IG9iamVjdAotcmVwcmVzZW50cyBhIHJlY3Rhbmd1bGFyIGFyZWEgb2YgdGhlIHNjcmVlbiwgYW5kIHN1cHBvcnRzIHZhcmlvdXMKLW1ldGhvZHMgdG8gZGlzcGxheSB0ZXh0LCBlcmFzZSBpdCwgYWxsb3cgdGhlIHVzZXIgdG8gaW5wdXQgc3RyaW5ncywKLWFuZCBzbyBmb3J0aC4KLQotVGhlIFxjb2Rle3N0ZHNjcn0gb2JqZWN0IHJldHVybmVkIGJ5IHRoZSBcZnVuY3Rpb257aW5pdHNjcigpfSBmdW5jdGlvbgotaXMgYSB3aW5kb3cgb2JqZWN0IHRoYXQgY292ZXJzIHRoZSBlbnRpcmUgc2NyZWVuLiAgTWFueSBwcm9ncmFtcyBtYXkKLW5lZWQgb25seSB0aGlzIHNpbmdsZSB3aW5kb3csIGJ1dCB5b3UgbWlnaHQgd2lzaCB0byBkaXZpZGUgdGhlIHNjcmVlbgotaW50byBzbWFsbGVyIHdpbmRvd3MsIGluIG9yZGVyIHRvIHJlZHJhdyBvciBjbGVhciB0aGVtIHNlcGFyYXRlbHkuCi1UaGUgXGZ1bmN0aW9ue25ld3dpbigpfSBmdW5jdGlvbiBjcmVhdGVzIGEgbmV3IHdpbmRvdyBvZiBhIGdpdmVuIHNpemUsCi1yZXR1cm5pbmcgdGhlIG5ldyB3aW5kb3cgb2JqZWN0LgotCi1cYmVnaW57dmVyYmF0aW19Ci1iZWdpbl94ID0gMjAgOyBiZWdpbl95ID0gNwotaGVpZ2h0ID0gNSA7IHdpZHRoID0gNDAKLXdpbiA9IGN1cnNlcy5uZXd3aW4oaGVpZ2h0LCB3aWR0aCwgYmVnaW5feSwgYmVnaW5feCkKLVxlbmR7dmVyYmF0aW19Ci0KLUEgd29yZCBhYm91dCB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gdXNlZCBpbiBjdXJzZXM6IGNvb3JkaW5hdGVzIGFyZQotYWx3YXlzIHBhc3NlZCBpbiB0aGUgb3JkZXIgXGVtcGh7eSx4fSwgYW5kIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgYQotd2luZG93IGlzIGNvb3JkaW5hdGUgKDAsMCkuICBUaGlzIGJyZWFrcyBhIGNvbW1vbiBjb252ZW50aW9uIGZvcgotaGFuZGxpbmcgY29vcmRpbmF0ZXMsIHdoZXJlIHRoZSBcZW1waHt4fSBjb29yZGluYXRlIHVzdWFsbHkgY29tZXMKLWZpcnN0LiAgVGhpcyBpcyBhbiB1bmZvcnR1bmF0ZSBkaWZmZXJlbmNlIGZyb20gbW9zdCBvdGhlciBjb21wdXRlcgotYXBwbGljYXRpb25zLCBidXQgaXQncyBiZWVuIHBhcnQgb2YgY3Vyc2VzIHNpbmNlIGl0IHdhcyBmaXJzdCB3cml0dGVuLAotYW5kIGl0J3MgdG9vIGxhdGUgdG8gY2hhbmdlIHRoaW5ncyBub3cuCi0KLVdoZW4geW91IGNhbGwgYSBtZXRob2QgdG8gZGlzcGxheSBvciBlcmFzZSB0ZXh0LCB0aGUgZWZmZWN0IGRvZXNuJ3QKLWltbWVkaWF0ZWx5IHNob3cgdXAgb24gdGhlIGRpc3BsYXkuICBUaGlzIGlzIGJlY2F1c2UgY3Vyc2VzIHdhcwotb3JpZ2luYWxseSB3cml0dGVuIHdpdGggc2xvdyAzMDAtYmF1ZCB0ZXJtaW5hbCBjb25uZWN0aW9ucyBpbiBtaW5kOwotd2l0aCB0aGVzZSB0ZXJtaW5hbHMsIG1pbmltaXppbmcgdGhlIHRpbWUgcmVxdWlyZWQgdG8gcmVkcmF3IHRoZQotc2NyZWVuIGlzIHZlcnkgaW1wb3J0YW50LiAgVGhpcyBsZXRzIGN1cnNlcyBhY2N1bXVsYXRlIGNoYW5nZXMgdG8gdGhlCi1zY3JlZW4sIGFuZCBkaXNwbGF5IHRoZW0gaW4gdGhlIG1vc3QgZWZmaWNpZW50IG1hbm5lci4gIEZvciBleGFtcGxlLAotaWYgeW91ciBwcm9ncmFtIGRpc3BsYXlzIHNvbWUgY2hhcmFjdGVycyBpbiBhIHdpbmRvdywgYW5kIHRoZW4gY2xlYXJzCi10aGUgd2luZG93LCB0aGVyZSdzIG5vIG5lZWQgdG8gc2VuZCB0aGUgb3JpZ2luYWwgY2hhcmFjdGVycyBiZWNhdXNlCi10aGV5J2QgbmV2ZXIgYmUgdmlzaWJsZS4gIAotCi1BY2NvcmRpbmdseSwgY3Vyc2VzIHJlcXVpcmVzIHRoYXQgeW91IGV4cGxpY2l0bHkgdGVsbCBpdCB0byByZWRyYXcKLXdpbmRvd3MsIHVzaW5nIHRoZSBcZnVuY3Rpb257cmVmcmVzaCgpfSBtZXRob2Qgb2Ygd2luZG93IG9iamVjdHMuICBJbgotcHJhY3RpY2UsIHRoaXMgZG9lc24ndCByZWFsbHkgY29tcGxpY2F0ZSBwcm9ncmFtbWluZyB3aXRoIGN1cnNlcyBtdWNoLgotTW9zdCBwcm9ncmFtcyBnbyBpbnRvIGEgZmx1cnJ5IG9mIGFjdGl2aXR5LCBhbmQgdGhlbiBwYXVzZSB3YWl0aW5nIGZvcgotYSBrZXlwcmVzcyBvciBzb21lIG90aGVyIGFjdGlvbiBvbiB0aGUgcGFydCBvZiB0aGUgdXNlci4gIEFsbCB5b3UgaGF2ZQotdG8gZG8gaXMgdG8gYmUgc3VyZSB0aGF0IHRoZSBzY3JlZW4gaGFzIGJlZW4gcmVkcmF3biBiZWZvcmUgcGF1c2luZyB0bwotd2FpdCBmb3IgdXNlciBpbnB1dCwgYnkgc2ltcGx5IGNhbGxpbmcgXGNvZGV7c3Rkc2NyLnJlZnJlc2goKX0gb3IgdGhlCi1cZnVuY3Rpb257cmVmcmVzaCgpfSBtZXRob2Qgb2Ygc29tZSBvdGhlciByZWxldmFudCB3aW5kb3cuCi0KLUEgcGFkIGlzIGEgc3BlY2lhbCBjYXNlIG9mIGEgd2luZG93OyBpdCBjYW4gYmUgbGFyZ2VyIHRoYW4gdGhlIGFjdHVhbAotZGlzcGxheSBzY3JlZW4sIGFuZCBvbmx5IGEgcG9ydGlvbiBvZiBpdCBkaXNwbGF5ZWQgYXQgYSB0aW1lLgotQ3JlYXRpbmcgYSBwYWQgc2ltcGx5IHJlcXVpcmVzIHRoZSBwYWQncyBoZWlnaHQgYW5kIHdpZHRoLCB3aGlsZQotcmVmcmVzaGluZyBhIHBhZCByZXF1aXJlcyBnaXZpbmcgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBvbi1zY3JlZW4KLWFyZWEgd2hlcmUgYSBzdWJzZWN0aW9uIG9mIHRoZSBwYWQgd2lsbCBiZSBkaXNwbGF5ZWQuICAKLQotXGJlZ2lue3ZlcmJhdGltfQotcGFkID0gY3Vyc2VzLm5ld3BhZCgxMDAsIDEwMCkKLSMgIFRoZXNlIGxvb3BzIGZpbGwgdGhlIHBhZCB3aXRoIGxldHRlcnM7IHRoaXMgaXMKLSMgZXhwbGFpbmVkIGluIHRoZSBuZXh0IHNlY3Rpb24KLWZvciB5IGluIHJhbmdlKDAsIDEwMCk6Ci0gICAgZm9yIHggaW4gcmFuZ2UoMCwgMTAwKToKLSAgICAgICAgdHJ5OiBwYWQuYWRkY2goeSx4LCBvcmQoJ2EnKSArICh4KngreSp5KSAlIDI2ICkKLSAgICAgICAgZXhjZXB0IGN1cnNlcy5lcnJvcjogcGFzcwotCi0jICBEaXNwbGF5cyBhIHNlY3Rpb24gb2YgdGhlIHBhZCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBzY3JlZW4KLXBhZC5yZWZyZXNoKCAwLDAsIDUsNSwgMjAsNzUpCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgXGZ1bmN0aW9ue3JlZnJlc2goKX0gY2FsbCBkaXNwbGF5cyBhIHNlY3Rpb24gb2YgdGhlIHBhZCBpbiB0aGUKLXJlY3RhbmdsZSBleHRlbmRpbmcgZnJvbSBjb29yZGluYXRlICg1LDUpIHRvIGNvb3JkaW5hdGUgKDIwLDc1KSBvbiB0aGUKLXNjcmVlbjsgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBkaXNwbGF5ZWQgc2VjdGlvbiBpcyBjb29yZGluYXRlCi0oMCwwKSBvbiB0aGUgcGFkLiAgQmV5b25kIHRoYXQgZGlmZmVyZW5jZSwgcGFkcyBhcmUgZXhhY3RseSBsaWtlCi1vcmRpbmFyeSB3aW5kb3dzIGFuZCBzdXBwb3J0IHRoZSBzYW1lIG1ldGhvZHMuCi0KLUlmIHlvdSBoYXZlIG11bHRpcGxlIHdpbmRvd3MgYW5kIHBhZHMgb24gc2NyZWVuIHRoZXJlIGlzIGEgbW9yZQotZWZmaWNpZW50IHdheSB0byBnbywgd2hpY2ggd2lsbCBwcmV2ZW50IGFubm95aW5nIHNjcmVlbiBmbGlja2VyIGF0Ci1yZWZyZXNoIHRpbWUuICBVc2UgdGhlIFxtZXRob2R7bm91dHJlZnJlc2goKX0gbWV0aG9kCi1vZiBlYWNoIHdpbmRvdyB0byB1cGRhdGUgdGhlIGRhdGEgc3RydWN0dXJlCi1yZXByZXNlbnRpbmcgdGhlIGRlc2lyZWQgc3RhdGUgb2YgdGhlIHNjcmVlbjsgdGhlbiBjaGFuZ2UgdGhlIHBoeXNpY2FsCi1zY3JlZW4gdG8gbWF0Y2ggdGhlIGRlc2lyZWQgc3RhdGUgaW4gb25lIGdvIHdpdGggdGhlIGZ1bmN0aW9uCi1cZnVuY3Rpb257ZG91cGRhdGUoKX0uICBUaGUgbm9ybWFsIFxtZXRob2R7cmVmcmVzaCgpfSBtZXRob2QgY2FsbHMKLVxmdW5jdGlvbntkb3VwZGF0ZSgpfSBhcyBpdHMgbGFzdCBhY3QuCi0KLVxzZWN0aW9ue0Rpc3BsYXlpbmcgVGV4dH0KLQote31Gcm9tIGEgQyBwcm9ncmFtbWVyJ3MgcG9pbnQgb2YgdmlldywgY3Vyc2VzIG1heSBzb21ldGltZXMgbG9vayBsaWtlCi1hIHR3aXN0eSBtYXplIG9mIGZ1bmN0aW9ucywgYWxsIHN1YnRseSBkaWZmZXJlbnQuICBGb3IgZXhhbXBsZSwKLVxmdW5jdGlvbnthZGRzdHIoKX0gZGlzcGxheXMgYSBzdHJpbmcgYXQgdGhlIGN1cnJlbnQgY3Vyc29yIGxvY2F0aW9uCi1pbiB0aGUgXGNvZGV7c3Rkc2NyfSB3aW5kb3csIHdoaWxlIFxmdW5jdGlvbnttdmFkZHN0cigpfSBtb3ZlcyB0byBhCi1naXZlbiB5LHggY29vcmRpbmF0ZSBmaXJzdCBiZWZvcmUgZGlzcGxheWluZyB0aGUgc3RyaW5nLgotXGZ1bmN0aW9ue3dhZGRzdHIoKX0gaXMganVzdCBsaWtlIFxmdW5jdGlvbnthZGRzdHIoKX0sIGJ1dCBhbGxvd3MKLXNwZWNpZnlpbmcgYSB3aW5kb3cgdG8gdXNlLCBpbnN0ZWFkIG9mIHVzaW5nIFxjb2Rle3N0ZHNjcn0gYnkgZGVmYXVsdC4KLVxmdW5jdGlvbnttdndhZGRzdHIoKX0gZm9sbG93cyBzaW1pbGFybHkuCi0KLUZvcnR1bmF0ZWx5IHRoZSBQeXRob24gaW50ZXJmYWNlIGhpZGVzIGFsbCB0aGVzZSBkZXRhaWxzOwotXGNvZGV7c3Rkc2NyfSBpcyBhIHdpbmRvdyBvYmplY3QgbGlrZSBhbnkgb3RoZXIsIGFuZCBtZXRob2RzIGxpa2UKLVxmdW5jdGlvbnthZGRzdHIoKX0gYWNjZXB0IG11bHRpcGxlIGFyZ3VtZW50IGZvcm1zLiAgVXN1YWxseSB0aGVyZSBhcmUKLWZvdXIgZGlmZmVyZW50IGZvcm1zLgotCi1cYmVnaW57dGFibGVpaX17fGN8bHx9e3RleHRybX17Rm9ybX17RGVzY3JpcHRpb259Ci1cbGluZWlpe1x2YXJ7c3RyfSBvciBcdmFye2NofX17RGlzcGxheSB0aGUgc3RyaW5nIFx2YXJ7c3RyfSBvcgotY2hhcmFjdGVyIFx2YXJ7Y2h9IGF0IHRoZSBjdXJyZW50IHBvc2l0aW9ufQotXGxpbmVpaXtcdmFye3N0cn0gb3IgXHZhcntjaH0sIFx2YXJ7YXR0cn19e0Rpc3BsYXkgdGhlIHN0cmluZyBcdmFye3N0cn0gb3IKLWNoYXJhY3RlciBcdmFye2NofSwgdXNpbmcgYXR0cmlidXRlIFx2YXJ7YXR0cn0gYXQgdGhlIGN1cnJlbnQgcG9zaXRpb259Ci1cbGluZWlpe1x2YXJ7eX0sIFx2YXJ7eH0sIFx2YXJ7c3RyfSBvciBcdmFye2NofX0KLXtNb3ZlIHRvIHBvc2l0aW9uIFx2YXJ7eSx4fSB3aXRoaW4gdGhlIHdpbmRvdywgYW5kIGRpc3BsYXkgXHZhcntzdHJ9Ci1vciBcdmFye2NofX0KLVxsaW5laWl7XHZhcnt5fSwgXHZhcnt4fSwgXHZhcntzdHJ9IG9yIFx2YXJ7Y2h9LCBcdmFye2F0dHJ9fQote01vdmUgdG8gcG9zaXRpb24gXHZhcnt5LHh9IHdpdGhpbiB0aGUgd2luZG93LCBhbmQgZGlzcGxheSBcdmFye3N0cn0KLW9yIFx2YXJ7Y2h9LCB1c2luZyBhdHRyaWJ1dGUgXHZhcnthdHRyfX0KLVxlbmR7dGFibGVpaX0KLQotQXR0cmlidXRlcyBhbGxvdyBkaXNwbGF5aW5nIHRleHQgaW4gaGlnaGxpZ2h0ZWQgZm9ybXMsIHN1Y2ggYXMgaW4KLWJvbGRmYWNlLCB1bmRlcmxpbmUsIHJldmVyc2UgY29kZSwgb3IgaW4gY29sb3IuICBUaGV5J2xsIGJlIGV4cGxhaW5lZAotaW4gbW9yZSBkZXRhaWwgaW4gdGhlIG5leHQgc3Vic2VjdGlvbi4KLQotVGhlIFxmdW5jdGlvbnthZGRzdHIoKX0gZnVuY3Rpb24gdGFrZXMgYSBQeXRob24gc3RyaW5nIGFzIHRoZSB2YWx1ZSB0bwotYmUgZGlzcGxheWVkLCB3aGlsZSB0aGUgXGZ1bmN0aW9ue2FkZGNoKCl9IGZ1bmN0aW9ucyB0YWtlIGEgY2hhcmFjdGVyLAotd2hpY2ggY2FuIGJlIGVpdGhlciBhIFB5dGhvbiBzdHJpbmcgb2YgbGVuZ3RoIDEgb3IgYW4gaW50ZWdlci4gIElmCi1pdCdzIGEgc3RyaW5nLCB5b3UncmUgbGltaXRlZCB0byBkaXNwbGF5aW5nIGNoYXJhY3RlcnMgYmV0d2VlbiAwIGFuZAotMjU1LiAgU1ZyNCBjdXJzZXMgcHJvdmlkZXMgY29uc3RhbnRzIGZvciBleHRlbnNpb24gY2hhcmFjdGVyczsgdGhlc2UKLWNvbnN0YW50cyBhcmUgaW50ZWdlcnMgZ3JlYXRlciB0aGFuIDI1NS4gIEZvciBleGFtcGxlLAotXGNvbnN0YW50e0FDU19QTE1JTlVTfSBpcyBhICsvLSBzeW1ib2wsIGFuZCBcY29uc3RhbnR7QUNTX1VMQ09STkVSfSBpcwotdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIGEgYm94IChoYW5keSBmb3IgZHJhd2luZyBib3JkZXJzKS4KLQotV2luZG93cyByZW1lbWJlciB3aGVyZSB0aGUgY3Vyc29yIHdhcyBsZWZ0IGFmdGVyIHRoZSBsYXN0IG9wZXJhdGlvbiwKLXNvIGlmIHlvdSBsZWF2ZSBvdXQgdGhlIFx2YXJ7eSx4fSBjb29yZGluYXRlcywgdGhlIHN0cmluZyBvciBjaGFyYWN0ZXIKLXdpbGwgYmUgZGlzcGxheWVkIHdoZXJldmVyIHRoZSBsYXN0IG9wZXJhdGlvbiBsZWZ0IG9mZi4gIFlvdSBjYW4gYWxzbwotbW92ZSB0aGUgY3Vyc29yIHdpdGggdGhlIFxmdW5jdGlvbnttb3ZlKFx2YXJ7eSx4fSl9IG1ldGhvZC4gIEJlY2F1c2UKLXNvbWUgdGVybWluYWxzIGFsd2F5cyBkaXNwbGF5IGEgZmxhc2hpbmcgY3Vyc29yLCB5b3UgbWF5IHdhbnQgdG8KLWVuc3VyZSB0aGF0IHRoZSBjdXJzb3IgaXMgcG9zaXRpb25lZCBpbiBzb21lIGxvY2F0aW9uIHdoZXJlIGl0IHdvbid0Ci1iZSBkaXN0cmFjdGluZzsgaXQgY2FuIGJlIGNvbmZ1c2luZyB0byBoYXZlIHRoZSBjdXJzb3IgYmxpbmtpbmcgYXQKLXNvbWUgYXBwYXJlbnRseSByYW5kb20gbG9jYXRpb24uICAKLQotSWYgeW91ciBhcHBsaWNhdGlvbiBkb2Vzbid0IG5lZWQgYSBibGlua2luZyBjdXJzb3IgYXQgYWxsLCB5b3UgY2FuCi1jYWxsIFxmdW5jdGlvbntjdXJzX3NldCgwKX0gdG8gbWFrZSBpdCBpbnZpc2libGUuICBFcXVpdmFsZW50bHksIGFuZAotZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBjdXJzZXMgdmVyc2lvbnMsIHRoZXJlJ3MgYQotXGZ1bmN0aW9ue2xlYXZlb2soXHZhcntib29sfSl9IGZ1bmN0aW9uLiAgV2hlbiBcdmFye2Jvb2x9IGlzIHRydWUsIHRoZQotY3Vyc2VzIGxpYnJhcnkgd2lsbCBhdHRlbXB0IHRvIHN1cHByZXNzIHRoZSBmbGFzaGluZyBjdXJzb3IsIGFuZCB5b3UKLXdvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgbGVhdmluZyBpdCBpbiBvZGQgbG9jYXRpb25zLgotCi1cc3Vic2VjdGlvbntBdHRyaWJ1dGVzIGFuZCBDb2xvcn0KLQotQ2hhcmFjdGVycyBjYW4gYmUgZGlzcGxheWVkIGluIGRpZmZlcmVudCB3YXlzLiAgU3RhdHVzIGxpbmVzIGluIGEKLXRleHQtYmFzZWQgYXBwbGljYXRpb24gYXJlIGNvbW1vbmx5IHNob3duIGluIHJldmVyc2UgdmlkZW87IGEgdGV4dAotdmlld2VyIG1heSBuZWVkIHRvIGhpZ2hsaWdodCBjZXJ0YWluIHdvcmRzLiAgY3Vyc2VzIHN1cHBvcnRzIHRoaXMgYnkKLWFsbG93aW5nIHlvdSB0byBzcGVjaWZ5IGFuIGF0dHJpYnV0ZSBmb3IgZWFjaCBjZWxsIG9uIHRoZSBzY3JlZW4uCi0KLUFuIGF0dHJpYnV0ZSBpcyBhIGludGVnZXIsIGVhY2ggYml0IHJlcHJlc2VudGluZyBhIGRpZmZlcmVudAotYXR0cmlidXRlLiAgWW91IGNhbiB0cnkgdG8gZGlzcGxheSB0ZXh0IHdpdGggbXVsdGlwbGUgYXR0cmlidXRlIGJpdHMKLXNldCwgYnV0IGN1cnNlcyBkb2Vzbid0IGd1YXJhbnRlZSB0aGF0IGFsbCB0aGUgcG9zc2libGUgY29tYmluYXRpb25zCi1hcmUgYXZhaWxhYmxlLCBvciB0aGF0IHRoZXkncmUgYWxsIHZpc3VhbGx5IGRpc3RpbmN0LiAgVGhhdCBkZXBlbmRzIG9uCi10aGUgYWJpbGl0eSBvZiB0aGUgdGVybWluYWwgYmVpbmcgdXNlZCwgc28gaXQncyBzYWZlc3QgdG8gc3RpY2sgdG8gdGhlCi1tb3N0IGNvbW1vbmx5IGF2YWlsYWJsZSBhdHRyaWJ1dGVzLCBsaXN0ZWQgaGVyZS4KLQotXGJlZ2lue3RhYmxlaWl9e3xjfGx8fXtjb25zdGFudH17QXR0cmlidXRlfXtEZXNjcmlwdGlvbn0KLVxsaW5laWl7QV9CTElOS317QmxpbmtpbmcgdGV4dH0KLVxsaW5laWl7QV9CT0xEfXtFeHRyYSBicmlnaHQgb3IgYm9sZCB0ZXh0fQotXGxpbmVpaXtBX0RJTX17SGFsZiBicmlnaHQgdGV4dH0KLVxsaW5laWl7QV9SRVZFUlNFfXtSZXZlcnNlLXZpZGVvIHRleHR9Ci1cbGluZWlpe0FfU1RBTkRPVVR9e1RoZSBiZXN0IGhpZ2hsaWdodGluZyBtb2RlIGF2YWlsYWJsZX0KLVxsaW5laWl7QV9VTkRFUkxJTkV9e1VuZGVybGluZWQgdGV4dH0KLVxlbmR7dGFibGVpaX0KLQotU28sIHRvIGRpc3BsYXkgYSByZXZlcnNlLXZpZGVvIHN0YXR1cyBsaW5lIG9uIHRoZSB0b3AgbGluZSBvZiB0aGUKLXNjcmVlbiwKLXlvdSBjb3VsZCBjb2RlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1zdGRzY3IuYWRkc3RyKDAsIDAsICJDdXJyZW50IG1vZGU6IFR5cGluZyBtb2RlIiwKLQkgICAgICBjdXJzZXMuQV9SRVZFUlNFKQotc3Rkc2NyLnJlZnJlc2goKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGN1cnNlcyBsaWJyYXJ5IGFsc28gc3VwcG9ydHMgY29sb3Igb24gdGhvc2UgdGVybWluYWxzIHRoYXQKLXByb3ZpZGUgaXQsIFRoZSBtb3N0IGNvbW1vbiBzdWNoIHRlcm1pbmFsIGlzIHByb2JhYmx5IHRoZSBMaW51eAotY29uc29sZSwgZm9sbG93ZWQgYnkgY29sb3IgeHRlcm1zLgotCi1UbyB1c2UgY29sb3IsIHlvdSBtdXN0IGNhbGwgdGhlIFxmdW5jdGlvbntzdGFydF9jb2xvcigpfSBmdW5jdGlvbiBzb29uCi1hZnRlciBjYWxsaW5nIFxmdW5jdGlvbntpbml0c2NyKCl9LCB0byBpbml0aWFsaXplIHRoZSBkZWZhdWx0IGNvbG9yCi1zZXQgKHRoZSBcZnVuY3Rpb257Y3Vyc2VzLndyYXBwZXIud3JhcHBlcigpfSBmdW5jdGlvbiBkb2VzIHRoaXMKLWF1dG9tYXRpY2FsbHkpLiAgT25jZSB0aGF0J3MgZG9uZSwgdGhlIFxmdW5jdGlvbntoYXNfY29sb3JzKCl9Ci1mdW5jdGlvbiByZXR1cm5zIFRSVUUgaWYgdGhlIHRlcm1pbmFsIGluIHVzZSBjYW4gYWN0dWFsbHkgZGlzcGxheQotY29sb3IuICAoTm90ZTogY3Vyc2VzIHVzZXMgdGhlIEFtZXJpY2FuIHNwZWxsaW5nICdjb2xvcicsIGluc3RlYWQgb2YKLXRoZSBDYW5hZGlhbi9Ccml0aXNoIHNwZWxsaW5nICdjb2xvdXInLiAgSWYgeW91J3JlIHVzZWQgdG8gdGhlIEJyaXRpc2gKLXNwZWxsaW5nLCB5b3UnbGwgaGF2ZSB0byByZXNpZ24geW91cnNlbGYgdG8gbWlzc3BlbGxpbmcgaXQgZm9yIHRoZQotc2FrZSBvZiB0aGVzZSBmdW5jdGlvbnMuKQotCi1UaGUgY3Vyc2VzIGxpYnJhcnkgbWFpbnRhaW5zIGEgZmluaXRlIG51bWJlciBvZiBjb2xvciBwYWlycywKLWNvbnRhaW5pbmcgYSBmb3JlZ3JvdW5kIChvciB0ZXh0KSBjb2xvciBhbmQgYSBiYWNrZ3JvdW5kIGNvbG9yLiAgWW91Ci1jYW4gZ2V0IHRoZSBhdHRyaWJ1dGUgdmFsdWUgY29ycmVzcG9uZGluZyB0byBhIGNvbG9yIHBhaXIgd2l0aCB0aGUKLVxmdW5jdGlvbntjb2xvcl9wYWlyKCl9IGZ1bmN0aW9uOyB0aGlzIGNhbiBiZSBiaXR3aXNlLU9SJ2VkIHdpdGggb3RoZXIKLWF0dHJpYnV0ZXMgc3VjaCBhcyBcY29uc3RhbnR7QV9SRVZFUlNFfSwgYnV0IGFnYWluLCBzdWNoIGNvbWJpbmF0aW9ucwotYXJlIG5vdCBndWFyYW50ZWVkIHRvIHdvcmsgb24gYWxsIHRlcm1pbmFscy4KLQotQW4gZXhhbXBsZSwgd2hpY2ggZGlzcGxheXMgYSBsaW5lIG9mIHRleHQgdXNpbmcgY29sb3IgcGFpciAxOgotCi1cYmVnaW57dmVyYmF0aW19Ci1zdGRzY3IuYWRkc3RyKCAiUHJldHR5IHRleHQiLCBjdXJzZXMuY29sb3JfcGFpcigxKSApCi1zdGRzY3IucmVmcmVzaCgpCi1cZW5ke3ZlcmJhdGltfQotCi1BcyBJIHNhaWQgYmVmb3JlLCBhIGNvbG9yIHBhaXIgY29uc2lzdHMgb2YgYSBmb3JlZ3JvdW5kIGFuZAotYmFja2dyb3VuZCBjb2xvci4gIFxmdW5jdGlvbntzdGFydF9jb2xvcigpfSBpbml0aWFsaXplcyA4IGJhc2ljCi1jb2xvcnMgd2hlbiBpdCBhY3RpdmF0ZXMgY29sb3IgbW9kZS4gIFRoZXkgYXJlOiAwOmJsYWNrLCAxOnJlZCwKLTI6Z3JlZW4sIDM6eWVsbG93LCA0OmJsdWUsIDU6bWFnZW50YSwgNjpjeWFuLCBhbmQgNzp3aGl0ZS4gIFRoZSBjdXJzZXMKLW1vZHVsZSBkZWZpbmVzIG5hbWVkIGNvbnN0YW50cyBmb3IgZWFjaCBvZiB0aGVzZSBjb2xvcnM6Ci1cY29uc3RhbnR7Y3Vyc2VzLkNPTE9SX0JMQUNLfSwgXGNvbnN0YW50e2N1cnNlcy5DT0xPUl9SRUR9LCBhbmQgc28KLWZvcnRoLgotCi1UaGUgXGZ1bmN0aW9ue2luaXRfcGFpcihcdmFye24sIGYsIGJ9KX0gZnVuY3Rpb24gY2hhbmdlcyB0aGUKLWRlZmluaXRpb24gb2YgY29sb3IgcGFpciBcdmFye259LCB0byBmb3JlZ3JvdW5kIGNvbG9yIHtmfSBhbmQKLWJhY2tncm91bmQgY29sb3Ige2J9LiAgQ29sb3IgcGFpciAwIGlzIGhhcmQtd2lyZWQgdG8gd2hpdGUgb24gYmxhY2ssCi1hbmQgY2Fubm90IGJlIGNoYW5nZWQuICAKLQotTGV0J3MgcHV0IGFsbCB0aGlzIHRvZ2V0aGVyLiBUbyBjaGFuZ2UgY29sb3IgMSB0byByZWQKLXRleHQgb24gYSB3aGl0ZSBiYWNrZ3JvdW5kLCB5b3Ugd291bGQgY2FsbDoKLQotXGJlZ2lue3ZlcmJhdGltfQotY3Vyc2VzLmluaXRfcGFpcigxLCBjdXJzZXMuQ09MT1JfUkVELCBjdXJzZXMuQ09MT1JfV0hJVEUpCi1cZW5ke3ZlcmJhdGltfQotCi1XaGVuIHlvdSBjaGFuZ2UgYSBjb2xvciBwYWlyLCBhbnkgdGV4dCBhbHJlYWR5IGRpc3BsYXllZCB1c2luZyB0aGF0Ci1jb2xvciBwYWlyIHdpbGwgY2hhbmdlIHRvIHRoZSBuZXcgY29sb3JzLiAgWW91IGNhbiBhbHNvIGRpc3BsYXkgbmV3Ci10ZXh0IGluIHRoaXMgY29sb3Igd2l0aDoKLQotXGJlZ2lue3ZlcmJhdGltfQotc3Rkc2NyLmFkZHN0cigwLDAsICJSRUQgQUxFUlQhIiwgY3Vyc2VzLmNvbG9yX3BhaXIoMSkgKQotXGVuZHt2ZXJiYXRpbX0KLQotVmVyeSBmYW5jeSB0ZXJtaW5hbHMgY2FuIGNoYW5nZSB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIGFjdHVhbCBjb2xvcnMKLXRvIGEgZ2l2ZW4gUkdCIHZhbHVlLiAgVGhpcyBsZXRzIHlvdSBjaGFuZ2UgY29sb3IgMSwgd2hpY2ggaXMgdXN1YWxseQotcmVkLCB0byBwdXJwbGUgb3IgYmx1ZSBvciBhbnkgb3RoZXIgY29sb3IgeW91IGxpa2UuICBVbmZvcnR1bmF0ZWx5LAotdGhlIExpbnV4IGNvbnNvbGUgZG9lc24ndCBzdXBwb3J0IHRoaXMsIHNvIEknbSB1bmFibGUgdG8gdHJ5IGl0IG91dCwKLWFuZCBjYW4ndCBwcm92aWRlIGFueSBleGFtcGxlcy4gIFlvdSBjYW4gY2hlY2sgaWYgeW91ciB0ZXJtaW5hbCBjYW4gZG8KLXRoaXMgYnkgY2FsbGluZyBcZnVuY3Rpb257Y2FuX2NoYW5nZV9jb2xvcigpfSwgd2hpY2ggcmV0dXJucyBUUlVFIGlmCi10aGUgY2FwYWJpbGl0eSBpcyB0aGVyZS4gIElmIHlvdSdyZSBsdWNreSBlbm91Z2ggdG8gaGF2ZSBzdWNoIGEKLXRhbGVudGVkIHRlcm1pbmFsLCBjb25zdWx0IHlvdXIgc3lzdGVtJ3MgbWFuIHBhZ2VzIGZvciBtb3JlCi1pbmZvcm1hdGlvbi4KLQotXHNlY3Rpb257VXNlciBJbnB1dH0KLQotVGhlIGN1cnNlcyBsaWJyYXJ5IGl0c2VsZiBvZmZlcnMgb25seSB2ZXJ5IHNpbXBsZSBpbnB1dCBtZWNoYW5pc21zLgotUHl0aG9uJ3Mgc3VwcG9ydCBhZGRzIGEgdGV4dC1pbnB1dCB3aWRnZXQgdGhhdCBtYWtlcyB1cCBzb21lIG9mIHRoZQotbGFjay4KLQotVGhlIG1vc3QgY29tbW9uIHdheSB0byBnZXQgaW5wdXQgdG8gYSB3aW5kb3cgaXMgdG8gdXNlIGl0cwotXG1ldGhvZHtnZXRjaCgpfSBtZXRob2QuICBcbWV0aG9ke2dldGNoKCl9IHBhdXNlcyBhbmQgd2FpdHMgZm9yIHRoZQotdXNlciB0byBoaXQgYSBrZXksIGRpc3BsYXlpbmcgaXQgaWYgXGZ1bmN0aW9ue2VjaG8oKX0gaGFzIGJlZW4gY2FsbGVkCi1lYXJsaWVyLiAgWW91IGNhbiBvcHRpb25hbGx5IHNwZWNpZnkgYSBjb29yZGluYXRlIHRvIHdoaWNoIHRoZSBjdXJzb3IKLXNob3VsZCBiZSBtb3ZlZCBiZWZvcmUgcGF1c2luZy4KLQotSXQncyBwb3NzaWJsZSB0byBjaGFuZ2UgdGhpcyBiZWhhdmlvciB3aXRoIHRoZSBtZXRob2QKLVxtZXRob2R7bm9kZWxheSgpfS4gQWZ0ZXIgXG1ldGhvZHtub2RlbGF5KDEpfSwgXG1ldGhvZHtnZXRjaCgpfSBmb3IKLXRoZSB3aW5kb3cgYmVjb21lcyBub24tYmxvY2tpbmcgYW5kIHJldHVybnMgXGNvZGV7Y3Vyc2VzLkVSUn0gKGEgdmFsdWUKLW9mIC0xKSB3aGVuIG5vIGlucHV0IGlzIHJlYWR5LiAgVGhlcmUncyBhbHNvIGEgXGZ1bmN0aW9ue2hhbGZkZWxheSgpfQotZnVuY3Rpb24sIHdoaWNoIGNhbiBiZSB1c2VkIHRvIChpbiBlZmZlY3QpIHNldCBhIHRpbWVyIG9uIGVhY2gKLVxtZXRob2R7Z2V0Y2goKX07IGlmIG5vIGlucHV0IGJlY29tZXMgYXZhaWxhYmxlIHdpdGhpbiB0aGUgbnVtYmVyIG9mCi1taWxsaXNlY29uZHMgc3BlY2lmaWVkIGFzIHRoZSBhcmd1bWVudCB0byBcZnVuY3Rpb257aGFsZmRlbGF5KCl9LAotY3Vyc2VzIHJhaXNlcyBhbiBleGNlcHRpb24uCi0KLVRoZSBcbWV0aG9ke2dldGNoKCl9IG1ldGhvZCByZXR1cm5zIGFuIGludGVnZXI7IGlmIGl0J3MgYmV0d2VlbiAwIGFuZAotMjU1LCBpdCByZXByZXNlbnRzIHRoZSBBU0NJSSBjb2RlIG9mIHRoZSBrZXkgcHJlc3NlZC4gIFZhbHVlcyBncmVhdGVyCi10aGFuIDI1NSBhcmUgc3BlY2lhbCBrZXlzIHN1Y2ggYXMgUGFnZSBVcCwgSG9tZSwgb3IgdGhlIGN1cnNvciBrZXlzLgotWW91IGNhbiBjb21wYXJlIHRoZSB2YWx1ZSByZXR1cm5lZCB0byBjb25zdGFudHMgc3VjaCBhcwotXGNvbnN0YW50e2N1cnNlcy5LRVlfUFBBR0V9LCBcY29uc3RhbnR7Y3Vyc2VzLktFWV9IT01FfSwgb3IKLVxjb25zdGFudHtjdXJzZXMuS0VZX0xFRlR9LiAgVXN1YWxseSB0aGUgbWFpbiBsb29wIG9mIHlvdXIgcHJvZ3JhbQotd2lsbCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXdoaWxlIDE6Ci0gICAgYyA9IHN0ZHNjci5nZXRjaCgpCi0gICAgaWYgYyA9PSBvcmQoJ3AnKTogUHJpbnREb2N1bWVudCgpCi0gICAgZWxpZiBjID09IG9yZCgncScpOiBicmVhayAgIyBFeGl0IHRoZSB3aGlsZSgpCi0gICAgZWxpZiBjID09IGN1cnNlcy5LRVlfSE9NRTogeCA9IHkgPSAwCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgXG1vZHVsZXtjdXJzZXMuYXNjaWl9IG1vZHVsZSBzdXBwbGllcyBBU0NJSSBjbGFzcyBtZW1iZXJzaGlwCi1mdW5jdGlvbnMgdGhhdCB0YWtlIGVpdGhlciBpbnRlZ2VyIG9yIDEtY2hhcmFjdGVyLXN0cmluZwotYXJndW1lbnRzOyB0aGVzZSBtYXkgYmUgdXNlZnVsIGluIHdyaXRpbmcgbW9yZSByZWFkYWJsZSB0ZXN0cyBmb3IKLXlvdXIgY29tbWFuZCBpbnRlcnByZXRlcnMuICBJdCBhbHNvIHN1cHBsaWVzIGNvbnZlcnNpb24gZnVuY3Rpb25zIAotdGhhdCB0YWtlIGVpdGhlciBpbnRlZ2VyIG9yIDEtY2hhcmFjdGVyLXN0cmluZyBhcmd1bWVudHMgYW5kIHJldHVybgotdGhlIHNhbWUgdHlwZS4gIEZvciBleGFtcGxlLCBcZnVuY3Rpb257Y3Vyc2VzLmFzY2lpLmN0cmwoKX0gcmV0dXJucwotdGhlIGNvbnRyb2wgY2hhcmFjdGVyIGNvcnJlc3BvbmRpbmcgdG8gaXRzIGFyZ3VtZW50LgotCi1UaGVyZSdzIGFsc28gYSBtZXRob2QgdG8gcmV0cmlldmUgYW4gZW50aXJlIHN0cmluZywKLVxjb25zdGFudHtnZXRzdHIoKX0uICBJdCBpc24ndCB1c2VkIHZlcnkgb2Z0ZW4sIGJlY2F1c2UgaXRzCi1mdW5jdGlvbmFsaXR5IGlzIHF1aXRlIGxpbWl0ZWQ7IHRoZSBvbmx5IGVkaXRpbmcga2V5cyBhdmFpbGFibGUgYXJlCi10aGUgYmFja3NwYWNlIGtleSBhbmQgdGhlIEVudGVyIGtleSwgd2hpY2ggdGVybWluYXRlcyB0aGUgc3RyaW5nLiAgSXQKLWNhbiBvcHRpb25hbGx5IGJlIGxpbWl0ZWQgdG8gYSBmaXhlZCBudW1iZXIgb2YgY2hhcmFjdGVycy4KLQotXGJlZ2lue3ZlcmJhdGltfQotY3Vyc2VzLmVjaG8oKSAgICAgICAgICAgICMgRW5hYmxlIGVjaG9pbmcgb2YgY2hhcmFjdGVycwotCi0jIEdldCBhIDE1LWNoYXJhY3RlciBzdHJpbmcsIHdpdGggdGhlIGN1cnNvciBvbiB0aGUgdG9wIGxpbmUgCi1zID0gc3Rkc2NyLmdldHN0cigwLDAsIDE1KSAgCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgUHl0aG9uIFxtb2R1bGV7Y3Vyc2VzLnRleHRwYWR9IG1vZHVsZSBzdXBwbGllcyBzb21ldGhpbmcgYmV0dGVyLgotV2l0aCBpdCwgeW91IGNhbiB0dXJuIGEgd2luZG93IGludG8gYSB0ZXh0IGJveCB0aGF0IHN1cHBvcnRzIGFuCi1FbWFjcy1saWtlIHNldCBvZiBrZXliaW5kaW5ncy4gIFZhcmlvdXMgbWV0aG9kcyBvZiBcY2xhc3N7VGV4dGJveH0KLWNsYXNzIHN1cHBvcnQgZWRpdGluZyB3aXRoIGlucHV0IHZhbGlkYXRpb24gYW5kIGdhdGhlcmluZyB0aGUgZWRpdAotcmVzdWx0cyBlaXRoZXIgd2l0aCBvciB3aXRob3V0IHRyYWlsaW5nIHNwYWNlcy4gICBTZWUgdGhlIGxpYnJhcnkKLWRvY3VtZW50YXRpb24gb24gXG1vZHVsZXtjdXJzZXMudGV4dHBhZH0gZm9yIHRoZSBkZXRhaWxzLgotCi1cc2VjdGlvbntGb3IgTW9yZSBJbmZvcm1hdGlvbn0KLQotVGhpcyBIT1dUTyBkaWRuJ3QgY292ZXIgc29tZSBhZHZhbmNlZCB0b3BpY3MsIHN1Y2ggYXMgc2NyZWVuLXNjcmFwaW5nCi1vciBjYXB0dXJpbmcgbW91c2UgZXZlbnRzIGZyb20gYW4geHRlcm0gaW5zdGFuY2UuICBCdXQgdGhlIFB5dGhvbgotbGlicmFyeSBwYWdlIGZvciB0aGUgY3Vyc2VzIG1vZHVsZXMgaXMgbm93IHByZXR0eSBjb21wbGV0ZS4gIFlvdQotc2hvdWxkIGJyb3dzZSBpdCBuZXh0LgotCi1JZiB5b3UncmUgaW4gZG91YnQgYWJvdXQgdGhlIGRldGFpbGVkIGJlaGF2aW9yIG9mIGFueSBvZiB0aGUgbmN1cnNlcwotZW50cnkgcG9pbnRzLCBjb25zdWx0IHRoZSBtYW51YWwgcGFnZXMgZm9yIHlvdXIgY3Vyc2VzIGltcGxlbWVudGF0aW9uLAotd2hldGhlciBpdCdzIG5jdXJzZXMgb3IgYSBwcm9wcmlldGFyeSBVbml4IHZlbmRvcidzLiAgVGhlIG1hbnVhbCBwYWdlcwotd2lsbCBkb2N1bWVudCBhbnkgcXVpcmtzLCBhbmQgcHJvdmlkZSBjb21wbGV0ZSBsaXN0cyBvZiBhbGwgdGhlCi1mdW5jdGlvbnMsIGF0dHJpYnV0ZXMsIGFuZCBcY29uc3RhbnR7QUNTXyp9IGNoYXJhY3RlcnMgYXZhaWxhYmxlIHRvCi15b3UuCi0KLUJlY2F1c2UgdGhlIGN1cnNlcyBBUEkgaXMgc28gbGFyZ2UsIHNvbWUgZnVuY3Rpb25zIGFyZW4ndCBzdXBwb3J0ZWQgaW4KLXRoZSBQeXRob24gaW50ZXJmYWNlLCBub3QgYmVjYXVzZSB0aGV5J3JlIGRpZmZpY3VsdCB0byBpbXBsZW1lbnQsIGJ1dAotYmVjYXVzZSBubyBvbmUgaGFzIG5lZWRlZCB0aGVtIHlldC4gIEZlZWwgZnJlZSB0byBhZGQgdGhlbSBhbmQgdGhlbgotc3VibWl0IGEgcGF0Y2guICBBbHNvLCB3ZSBkb24ndCB5ZXQgaGF2ZSBzdXBwb3J0IGZvciB0aGUgbWVudXMgb3IKLXBhbmVscyBsaWJyYXJpZXMgYXNzb2NpYXRlZCB3aXRoIG5jdXJzZXM7IGZlZWwgZnJlZSB0byBhZGQgdGhhdC4KLQotSWYgeW91IHdyaXRlIGFuIGludGVyZXN0aW5nIGxpdHRsZSBwcm9ncmFtLCBmZWVsIGZyZWUgdG8gY29udHJpYnV0ZSBpdAotYXMgYW5vdGhlciBkZW1vLiAgV2UgY2FuIGFsd2F5cyB1c2UgbW9yZSBvZiB0aGVtIQotCi1UaGUgbmN1cnNlcyBGQVE6IFx1cmx7aHR0cDovL2RpY2tleS5oaXMuY29tL25jdXJzZXMvbmN1cnNlcy5mYXEuaHRtbH0KLQotXGVuZHtkb2N1bWVudH0KZGlmZiAtLWdpdCBhL0RvYy9ob3d0by9kb2FuZGRvbnQudGV4IGIvRG9jL2hvd3RvL2RvYW5kZG9udC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NGYwNjkuLjAwMDAwMDAKLS0tIGEvRG9jL2hvd3RvL2RvYW5kZG9udC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIgKzAsMCBAQAotXGRvY3VtZW50Y2xhc3N7aG93dG99Ci0KLVx0aXRsZXtJZGlvbXMgYW5kIEFudGktSWRpb21zIGluIFB5dGhvbn0KLQotXHJlbGVhc2V7MC4wMH0KLQotXGF1dGhvcntNb3NoZSBaYWRrYX0KLVxhdXRob3JhZGRyZXNze2hvd3RvQHphZGthLnNpdGUuY28uaWx9Ci0KLVxiZWdpbntkb2N1bWVudH0KLVxtYWtldGl0bGUKLQotVGhpcyBkb2N1bWVudCBpcyBwbGFjZWQgaW4gdGhlIHB1YmxpYyBkb21hbi4KLQotXGJlZ2lue2Fic3RyYWN0fQotXG5vaW5kZW50Ci1UaGlzIGRvY3VtZW50IGNhbiBiZSBjb25zaWRlcmVkIGEgY29tcGFuaW9uIHRvIHRoZSB0dXRvcmlhbC4gSXQKLXNob3dzIGhvdyB0byB1c2UgUHl0aG9uLCBhbmQgZXZlbiBtb3JlIGltcG9ydGFudGx5LCBob3cge1xlbSBub3R9Ci10byB1c2UgUHl0aG9uLiAKLVxlbmR7YWJzdHJhY3R9Ci0KLVx0YWJsZW9mY29udGVudHMKLQotXHNlY3Rpb257TGFuZ3VhZ2UgQ29uc3RydWN0cyBZb3UgU2hvdWxkIE5vdCBVc2V9Ci0KLVdoaWxlIFB5dGhvbiBoYXMgcmVsYXRpdmVseSBmZXcgZ290Y2hhcyBjb21wYXJlZCB0byBvdGhlciBsYW5ndWFnZXMsIGl0Ci1zdGlsbCBoYXMgc29tZSBjb25zdHJ1Y3RzIHdoaWNoIGFyZSBvbmx5IHVzZWZ1bCBpbiBjb3JuZXIgY2FzZXMsIG9yIGFyZQotcGxhaW4gZGFuZ2Vyb3VzLiAKLQotXHN1YnNlY3Rpb257ZnJvbSBtb2R1bGUgaW1wb3J0ICp9Ci0KLVxzdWJzdWJzZWN0aW9ue0luc2lkZSBGdW5jdGlvbiBEZWZpbml0aW9uc30KLQotXGNvZGV7ZnJvbSBtb2R1bGUgaW1wb3J0ICp9IGlzIHtcZW0gaW52YWxpZH0gaW5zaWRlIGZ1bmN0aW9uIGRlZmluaXRpb25zLgotV2hpbGUgbWFueSB2ZXJzaW9ucyBvZiBQeXRob24gZG8gbm90IGNoZWNrIGZvciB0aGUgaW52YWxpZGl0eSwgaXQgZG9lcyBub3QKLW1ha2UgaXQgbW9yZSB2YWxpZCwgbm8gbW9yZSB0aGVuIGhhdmluZyBhIHNtYXJ0IGxhd3llciBtYWtlcyBhIG1hbiBpbm5vY2VudC4KLURvIG5vdCB1c2UgaXQgbGlrZSB0aGF0IGV2ZXIuIEV2ZW4gaW4gdmVyc2lvbnMgd2hlcmUgaXQgd2FzIGFjY2VwdGVkLCBpdCBtYWRlCi10aGUgZnVuY3Rpb24gZXhlY3V0aW9uIHNsb3dlciwgYmVjYXVzZSB0aGUgY29tcGlsZXIgY291bGQgbm90IGJlIGNlcnRhaW4KLXdoaWNoIG5hbWVzIGFyZSBsb2NhbCBhbmQgd2hpY2ggYXJlIGdsb2JhbC4gSW4gUHl0aG9uIDIuMSB0aGlzIGNvbnN0cnVjdAotY2F1c2VzIHdhcm5pbmdzLCBhbmQgc29tZXRpbWVzIGV2ZW4gZXJyb3JzLgotCi1cc3Vic3Vic2VjdGlvbntBdCBNb2R1bGUgTGV2ZWx9Ci0KLVdoaWxlIGl0IGlzIHZhbGlkIHRvIHVzZSBcY29kZXtmcm9tIG1vZHVsZSBpbXBvcnQgKn0gYXQgbW9kdWxlIGxldmVsIGl0Ci1pcyB1c3VhbGx5IGEgYmFkIGlkZWEuIEZvciBvbmUsIHRoaXMgbG9zZXMgYW4gaW1wb3J0YW50IHByb3BlcnR5IFB5dGhvbgotb3RoZXJ3aXNlIGhhcyAtLS0geW91IGNhbiBrbm93IHdoZXJlIGVhY2ggdG9wbGV2ZWwgbmFtZSBpcyBkZWZpbmVkIGJ5Ci1hIHNpbXBsZSAic2VhcmNoIiBmdW5jdGlvbiBpbiB5b3VyIGZhdm91cml0ZSBlZGl0b3IuIFlvdSBhbHNvIG9wZW4geW91cnNlbGYKLXRvIHRyb3VibGUgaW4gdGhlIGZ1dHVyZSwgaWYgc29tZSBtb2R1bGUgZ3Jvd3MgYWRkaXRpb25hbCBmdW5jdGlvbnMgb3IKLWNsYXNzZXMuIAotCi1PbmUgb2YgdGhlIG1vc3QgYXdmdWwgcXVlc3Rpb24gYXNrZWQgb24gdGhlIG5ld3Nncm91cCBpcyB3aHkgdGhpcyBjb2RlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1mID0gb3Blbigid3d3IikKLWYucmVhZCgpCi1cZW5ke3ZlcmJhdGltfQotCi1kb2VzIG5vdCB3b3JrLiBPZiBjb3Vyc2UsIGl0IHdvcmtzIGp1c3QgZmluZSAoYXNzdW1pbmcgeW91IGhhdmUgYSBmaWxlCi1jYWxsZWQgInd3dyIuKSBCdXQgaXQgZG9lcyBub3Qgd29yayBpZiBzb21ld2hlcmUgaW4gdGhlIG1vZHVsZSwgdGhlCi1zdGF0ZW1lbnQgXGNvZGV7ZnJvbSBvcyBpbXBvcnQgKn0gaXMgcHJlc2VudC4gVGhlIFxtb2R1bGV7b3N9IG1vZHVsZQotaGFzIGEgZnVuY3Rpb24gY2FsbGVkIFxmdW5jdGlvbntvcGVuKCl9IHdoaWNoIHJldHVybnMgYW4gaW50ZWdlci4gV2hpbGUKLWl0IGlzIHZlcnkgdXNlZnVsLCBzaGFkb3dpbmcgYnVpbHRpbnMgaXMgb25lIG9mIGl0cyBsZWFzdCB1c2VmdWwgcHJvcGVydGllcy4KLQotUmVtZW1iZXIsIHlvdSBjYW4gbmV2ZXIga25vdyBmb3Igc3VyZSB3aGF0IG5hbWVzIGEgbW9kdWxlIGV4cG9ydHMsIHNvIGVpdGhlcgotdGFrZSB3aGF0IHlvdSBuZWVkIC0tLSBcY29kZXtmcm9tIG1vZHVsZSBpbXBvcnQgbmFtZTEsIG5hbWUyfSwgb3Iga2VlcCB0aGVtIGluCi10aGUgbW9kdWxlIGFuZCBhY2Nlc3Mgb24gYSBwZXItbmVlZCBiYXNpcyAtLS0gCi1cY29kZXtpbXBvcnQgbW9kdWxlO3ByaW50IG1vZHVsZS5uYW1lfS4KLQotXHN1YnN1YnNlY3Rpb257V2hlbiBJdCBJcyBKdXN0IEZpbmV9Ci0KLVRoZXJlIGFyZSBzaXR1YXRpb25zIGluIHdoaWNoIFxjb2Rle2Zyb20gbW9kdWxlIGltcG9ydCAqfSBpcyBqdXN0IGZpbmU6Ci0KLVxiZWdpbntpdGVtaXplfQotCi1caXRlbSBUaGUgaW50ZXJhY3RpdmUgcHJvbXB0LiBGb3IgZXhhbXBsZSwgXGNvZGV7ZnJvbSBtYXRoIGltcG9ydCAqfSBtYWtlcwotICAgICAgUHl0aG9uIGFuIGFtYXppbmcgc2NpZW50aWZpYyBjYWxjdWxhdG9yLgotCi1caXRlbSBXaGVuIGV4dGVuZGluZyBhIG1vZHVsZSBpbiBDIHdpdGggYSBtb2R1bGUgaW4gUHl0aG9uLgotCi1caXRlbSBXaGVuIHRoZSBtb2R1bGUgYWR2ZXJ0aXNlcyBpdHNlbGYgYXMgXGNvZGV7ZnJvbSBpbXBvcnQgKn0gc2FmZS4KLQotXGVuZHtpdGVtaXplfQotCi1cc3Vic2VjdGlvbntVbmFkb3JuZWQgXGZ1bmN0aW9ue2V4ZWN9IGFuZCBmcmllbmRzfQotCi1UaGUgd29yZCBgYHVuYWRvcm5lZCcnIHJlZmVycyB0byB0aGUgdXNlIHdpdGhvdXQgYW4gZXhwbGljaXQgZGljdGlvbmFyeSwKLWluIHdoaWNoIGNhc2UgdGhvc2UgY29uc3RydWN0cyBldmFsdWF0ZSBjb2RlIGluIHRoZSB7XGVtIGN1cnJlbnR9IGVudmlyb25tZW50LgotVGhpcyBpcyBkYW5nZXJvdXMgZm9yIHRoZSBzYW1lIHJlYXNvbnMgXGNvZGV7ZnJvbSBpbXBvcnQgKn0gaXMgZGFuZ2Vyb3VzIC0tLQotaXQgbWlnaHQgc3RlcCBvdmVyIHZhcmlhYmxlcyB5b3UgYXJlIGNvdW50aW5nIG9uIGFuZCBtZXNzIHVwIHRoaW5ncyBmb3IKLXRoZSByZXN0IG9mIHlvdXIgY29kZS4gU2ltcGx5IGRvIG5vdCBkbyB0aGF0LgotCi1CYWQgZXhhbXBsZXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBmb3IgbmFtZSBpbiBzeXMuYXJndlsxOl06Ci0+Pj4gICAgIGV4ZWMoIiVzPTEiICUgbmFtZSkKLT4+PiBkZWYgZnVuYyhzLCAqKmt3KToKLT4+PiAgICAgZm9yIHZhciwgdmFsIGluIGt3Lml0ZW1zKCk6Ci0+Pj4gICAgICAgICBleGVjKCJzLiVzPXZhbCIgJSB2YXIpICAjIGludmFsaWQhCi0+Pj4gZXhlYyhvcGVuKCJoYW5kbGVyLnB5IikucmVhZCgpKQotPj4+IGhhbmRsZSgpCi1cZW5ke3ZlcmJhdGltfQotCi1Hb29kIGV4YW1wbGVzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZCA9IHt9Ci0+Pj4gZm9yIG5hbWUgaW4gc3lzLmFyZ3ZbMTpdOgotPj4+ICAgICBkW25hbWVdID0gMQotPj4+IGRlZiBmdW5jKHMsICoqa3cpOgotPj4+ICAgICBmb3IgdmFyLCB2YWwgaW4ga3cuaXRlbXMoKToKLT4+PiAgICAgICAgIHNldGF0dHIocywgdmFyLCB2YWwpCi0+Pj4gZD17fQotPj4+IGV4ZWMob3BlbigiaGFuZGxlci5weSIpLnJlYWQoKSwgZCwgZCkKLT4+PiBoYW5kbGUgPSBkWydoYW5kbGUnXQotPj4+IGhhbmRsZSgpCi1cZW5ke3ZlcmJhdGltfQotCi1cc3Vic2VjdGlvbntmcm9tIG1vZHVsZSBpbXBvcnQgbmFtZTEsIG5hbWUyfQotCi1UaGlzIGlzIGEgYGBkb24ndCcnIHdoaWNoIGlzIG11Y2ggd2Vha2VyIHRoZW4gdGhlIHByZXZpb3VzIGBgZG9uJ3QnJ3MKLWJ1dCBpcyBzdGlsbCBzb21ldGhpbmcgeW91IHNob3VsZCBub3QgZG8gaWYgeW91IGRvbid0IGhhdmUgZ29vZCByZWFzb25zCi10byBkbyB0aGF0LiBUaGUgcmVhc29uIGl0IGlzIHVzdWFsbHkgYmFkIGlkZWEgaXMgYmVjYXVzZSB5b3Ugc3VkZGVubHkKLWhhdmUgYW4gb2JqZWN0IHdoaWNoIGxpdmVzIGluIHR3byBzZXBlcmF0ZSBuYW1lc3BhY2VzLiBXaGVuIHRoZSBiaW5kaW5nCi1pbiBvbmUgbmFtZXNwYWNlIGNoYW5nZXMsIHRoZSBiaW5kaW5nIGluIHRoZSBvdGhlciB3aWxsIG5vdCwgc28gdGhlcmUKLXdpbGwgYmUgYSBkaXNjcmVwYW5jeSBiZXR3ZWVuIHRoZW0uIFRoaXMgaGFwcGVucyB3aGVuLCBmb3IgZXhhbXBsZSwKLW9uZSBtb2R1bGUgaXMgcmVsb2FkZWQsIG9yIGNoYW5nZXMgdGhlIGRlZmluaXRpb24gb2YgYSBmdW5jdGlvbiBhdCBydW50aW1lLiAKLQotQmFkIGV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSMgZm9vLnB5Ci1hID0gMQotCi0jIGJhci5weQotZnJvbSBmb28gaW1wb3J0IGEKLWlmIHNvbWV0aGluZygpOgotICAgIGEgPSAyICMgZGFuZ2VyOiBmb28uYSAhPSBhIAotXGVuZHt2ZXJiYXRpbX0KLQotR29vZCBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0jIGZvby5weQotYSA9IDEKLQotIyBiYXIucHkKLWltcG9ydCBmb28KLWlmIHNvbWV0aGluZygpOgotICAgIGZvby5hID0gMgotXGVuZHt2ZXJiYXRpbX0KLQotXHN1YnNlY3Rpb257ZXhjZXB0On0KLQotUHl0aG9uIGhhcyB0aGUgXGNvZGV7ZXhjZXB0On0gY2xhdXNlLCB3aGljaCBjYXRjaGVzIGFsbCBleGNlcHRpb25zLgotU2luY2Uge1xlbSBldmVyeX0gZXJyb3IgaW4gUHl0aG9uIHJhaXNlcyBhbiBleGNlcHRpb24sIHRoaXMgbWFrZXMgbWFueQotcHJvZ3JhbW1pbmcgZXJyb3JzIGxvb2sgbGlrZSBydW50aW1lIHByb2JsZW1zLCBhbmQgaGluZGVycwotdGhlIGRlYnVnZ2luZyBwcm9jZXNzLgotCi1UaGUgZm9sbG93aW5nIGNvZGUgc2hvd3MgYSBncmVhdCBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci10cnk6Ci0gICAgZm9vID0gb3BuZSgiZmlsZSIpICMgbWlzc3BlbGxlZCAib3BlbiIKLWV4Y2VwdDoKLSAgICBzeXMuZXhpdCgiY291bGQgbm90IG9wZW4gZmlsZSEiKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIHNlY29uZCBsaW5lIHRyaWdnZXJzIGEgXGV4Y2VwdGlvbntOYW1lRXJyb3J9IHdoaWNoIGlzIGNhdWdodCBieSB0aGUKLWV4Y2VwdCBjbGF1c2UuIFRoZSBwcm9ncmFtIHdpbGwgZXhpdCwgYW5kIHlvdSB3aWxsIGhhdmUgbm8gaWRlYSB0aGF0Ci10aGlzIGhhcyBub3RoaW5nIHRvIGRvIHdpdGggdGhlIHJlYWRhYmlsaXR5IG9mIFxjb2RleyJmaWxlIn0uCi0KLVRoZSBleGFtcGxlIGFib3ZlIGlzIGJldHRlciB3cml0dGVuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLXRyeToKLSAgICBmb28gPSBvcG5lKCJmaWxlIikgIyB3aWxsIGJlIGNoYW5nZWQgdG8gIm9wZW4iIGFzIHNvb24gYXMgd2UgcnVuIGl0Ci1leGNlcHQgSU9FcnJvcjoKLSAgICBzeXMuZXhpdCgiY291bGQgbm90IG9wZW4gZmlsZSIpCi1cZW5ke3ZlcmJhdGltfQotCi1UaGVyZSBhcmUgc29tZSBzaXR1YXRpb25zIGluIHdoaWNoIHRoZSBcY29kZXtleGNlcHQ6fSBjbGF1c2UgaXMgdXNlZnVsOgotZm9yIGV4YW1wbGUsIGluIGEgZnJhbWV3b3JrIHdoZW4gcnVubmluZyBjYWxsYmFja3MsIGl0IGlzIGdvb2Qgbm90IHRvCi1sZXQgYW55IGNhbGxiYWNrIGRpc3R1cmIgdGhlIGZyYW1ld29yay4KLQotXHNlY3Rpb257RXhjZXB0aW9uc30KLQotRXhjZXB0aW9ucyBhcmUgYSB1c2VmdWwgZmVhdHVyZSBvZiBQeXRob24uIFlvdSBzaG91bGQgbGVhcm4gdG8gcmFpc2UKLXRoZW0gd2hlbmV2ZXIgc29tZXRoaW5nIHVuZXhwZWN0ZWQgb2NjdXJzLCBhbmQgY2F0Y2ggdGhlbSBvbmx5IHdoZXJlCi15b3UgY2FuIGRvIHNvbWV0aGluZyBhYm91dCB0aGVtLgotCi1UaGUgZm9sbG93aW5nIGlzIGEgdmVyeSBwb3B1bGFyIGFudGktaWRpb20KLQotXGJlZ2lue3ZlcmJhdGltfQotZGVmIGdldF9zdGF0dXMoZmlsZSk6Ci0gICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGZpbGUpOgotICAgICAgICBwcmludCAiZmlsZSBub3QgZm91bmQiCi0gICAgICAgIHN5cy5leGl0KDEpCi0gICAgcmV0dXJuIG9wZW4oZmlsZSkucmVhZGxpbmUoKQotXGVuZHt2ZXJiYXRpbX0KLQotQ29uc2lkZXIgdGhlIGNhc2UgdGhlIGZpbGUgZ2V0cyBkZWxldGVkIGJldHdlZW4gdGhlIHRpbWUgdGhlIGNhbGwgdG8gCi1cZnVuY3Rpb257b3MucGF0aC5leGlzdHN9IGlzIG1hZGUgYW5kIHRoZSB0aW1lIFxmdW5jdGlvbntvcGVufSBpcyBjYWxsZWQuCi1UaGF0IG1lYW5zIHRoZSBsYXN0IGxpbmUgd2lsbCB0aHJvdyBhbiBcZXhjZXB0aW9ue0lPRXJyb3J9LiBUaGUgc2FtZSB3b3VsZAotaGFwcGVuIGlmIFx2YXJ7ZmlsZX0gZXhpc3RzIGJ1dCBoYXMgbm8gcmVhZCBwZXJtaXNzaW9uLiBTaW5jZSB0ZXN0aW5nIHRoaXMKLW9uIGEgbm9ybWFsIG1hY2hpbmUgb24gZXhpc3RpbmcgYW5kIG5vbi1leGlzdGluZyBmaWxlcyBtYWtlIGl0IHNlZW0gYnVnbGVzcywKLXRoYXQgbWVhbnMgaW4gdGVzdGluZyB0aGUgcmVzdWx0cyB3aWxsIHNlZW0gZmluZSwgYW5kIHRoZSBjb2RlIHdpbGwgZ2V0Ci1zaGlwcGVkLiBUaGVuIGFuIHVuaGFuZGxlZCBcZXhjZXB0aW9ue0lPRXJyb3J9IGVzY2FwZXMgdG8gdGhlIHVzZXIsIHdobwotaGFzIHRvIHdhdGNoIHRoZSB1Z2x5IHRyYWNlYmFjay4KLQotSGVyZSBpcyBhIGJldHRlciB3YXkgdG8gZG8gaXQuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLWRlZiBnZXRfc3RhdHVzKGZpbGUpOgotICAgIHRyeToKLSAgICAgICAgcmV0dXJuIG9wZW4oZmlsZSkucmVhZGxpbmUoKQotICAgIGV4Y2VwdCAoSU9FcnJvciwgT1NFcnJvcik6Ci0gICAgICAgIHByaW50ICJmaWxlIG5vdCBmb3VuZCIKLSAgICAgICAgc3lzLmV4aXQoMSkKLVxlbmR7dmVyYmF0aW19Ci0KLUluIHRoaXMgdmVyc2lvbiwgKmVpdGhlciogdGhlIGZpbGUgZ2V0cyBvcGVuZWQgYW5kIHRoZSBsaW5lIGlzIHJlYWQKLShzbyBpdCB3b3JrcyBldmVuIG9uIGZsYWt5IE5GUyBvciBTTUIgY29ubmVjdGlvbnMpLCBvciB0aGUgbWVzc2FnZQotaXMgcHJpbnRlZCBhbmQgdGhlIGFwcGxpY2F0aW9uIGFib3J0ZWQuCi0KLVN0aWxsLCBcZnVuY3Rpb257Z2V0X3N0YXR1c30gbWFrZXMgdG9vIG1hbnkgYXNzdW1wdGlvbnMgLS0tIHRoYXQgaXQKLXdpbGwgb25seSBiZSB1c2VkIGluIGEgc2hvcnQgcnVubmluZyBzY3JpcHQsIGFuZCBub3QsIHNheSwgaW4gYSBsb25nCi1ydW5uaW5nIHNlcnZlci4gU3VyZSwgdGhlIGNhbGxlciBjb3VsZCBkbyBzb21ldGhpbmcgbGlrZQotCi1cYmVnaW57dmVyYmF0aW19Ci10cnk6Ci0gICAgc3RhdHVzID0gZ2V0X3N0YXR1cyhsb2cpCi1leGNlcHQgU3lzdGVtRXhpdDoKLSAgICBzdGF0dXMgPSBOb25lCi1cZW5ke3ZlcmJhdGltfQotCi1TbywgdHJ5IHRvIG1ha2UgYXMgZmV3IFxjb2Rle2V4Y2VwdH0gY2xhdXNlcyBpbiB5b3VyIGNvZGUgLS0tIHRob3NlIHdpbGwKLXVzdWFsbHkgYmUgYSBjYXRjaC1hbGwgaW4gdGhlIFxmdW5jdGlvbnttYWlufSwgb3IgaW5zaWRlIGNhbGxzIHdoaWNoCi1zaG91bGQgYWx3YXlzIHN1Y2NlZWQuCi0KLVNvLCB0aGUgYmVzdCB2ZXJzaW9uIGlzIHByb2JhYmx5Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWRlZiBnZXRfc3RhdHVzKGZpbGUpOgotICAgIHJldHVybiBvcGVuKGZpbGUpLnJlYWRsaW5lKCkKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBjYWxsZXIgY2FuIGRlYWwgd2l0aCB0aGUgZXhjZXB0aW9uIGlmIGl0IHdhbnRzIChmb3IgZXhhbXBsZSwgaWYgaXQgCi10cmllcyBzZXZlcmFsIGZpbGVzIGluIGEgbG9vcCksIG9yIGp1c3QgbGV0IHRoZSBleGNlcHRpb24gZmlsdGVyIHVwd2FyZHMKLXRvIHtcZW0gaXRzfSBjYWxsZXIuCi0KLVRoZSBsYXN0IHZlcnNpb24gaXMgbm90IHZlcnkgZ29vZCBlaXRoZXIgLS0tIGR1ZSB0byBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLAotdGhlIGZpbGUgd291bGQgbm90IGJlIGNsb3NlZCB3aGVuIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQgdW50aWwgdGhlIGhhbmRsZXIKLWZpbmlzaGVzLCBhbmQgcGVyaGFwcyBub3QgYXQgYWxsIGluIG5vbi1DIGltcGxlbWVudGF0aW9ucyAoZS5nLiwgSnl0aG9uKS4KLQotXGJlZ2lue3ZlcmJhdGltfQotZGVmIGdldF9zdGF0dXMoZmlsZSk6Ci0gICAgZnAgPSBvcGVuKGZpbGUpCi0gICAgdHJ5OgotICAgICAgICByZXR1cm4gZnAucmVhZGxpbmUoKQotICAgIGZpbmFsbHk6Ci0gICAgICAgIGZwLmNsb3NlKCkKLVxlbmR7dmVyYmF0aW19Ci0KLVxzZWN0aW9ue1VzaW5nIHRoZSBCYXR0ZXJpZXN9Ci0KLUV2ZXJ5IHNvIG9mdGVuLCBwZW9wbGUgc2VlbSB0byBiZSB3cml0aW5nIHN0dWZmIGluIHRoZSBQeXRob24gbGlicmFyeQotYWdhaW4sIHVzdWFsbHkgcG9vcmx5LiBXaGlsZSB0aGUgb2NjYXNpb25hbCBtb2R1bGUgaGFzIGEgcG9vciBpbnRlcmZhY2UsCi1pdCBpcyB1c3VhbGx5IG11Y2ggYmV0dGVyIHRvIHVzZSB0aGUgcmljaCBzdGFuZGFyZCBsaWJyYXJ5IGFuZCBkYXRhCi10eXBlcyB0aGF0IGNvbWUgd2l0aCBQeXRob24gdGhlbiBpbnZlbnRpbmcgeW91ciBvd24uCi0KLUEgdXNlZnVsIG1vZHVsZSB2ZXJ5IGZldyBwZW9wbGUga25vdyBhYm91dCBpcyBcbW9kdWxle29zLnBhdGh9LiBJdCAKLWFsd2F5cyBoYXMgdGhlIGNvcnJlY3QgcGF0aCBhcml0aG1ldGljIGZvciB5b3VyIG9wZXJhdGluZyBzeXN0ZW0sIGFuZAotd2lsbCB1c3VhbGx5IGJlIG11Y2ggYmV0dGVyIHRoZW4gd2hhdGV2ZXIgeW91IGNvbWUgdXAgd2l0aCB5b3Vyc2VsZi4KLQotQ29tcGFyZToKLQotXGJlZ2lue3ZlcmJhdGltfQotIyB1Z2ghCi1yZXR1cm4gZGlyKyIvIitmaWxlCi0jIGJldHRlcgotcmV0dXJuIG9zLnBhdGguam9pbihkaXIsIGZpbGUpCi1cZW5ke3ZlcmJhdGltfQotCi1Nb3JlIHVzZWZ1bCBmdW5jdGlvbnMgaW4gXG1vZHVsZXtvcy5wYXRofTogXGZ1bmN0aW9ue2Jhc2VuYW1lfSwgCi1cZnVuY3Rpb257ZGlybmFtZX0gYW5kIFxmdW5jdGlvbntzcGxpdGV4dH0uCi0KLVRoZXJlIGFyZSBhbHNvIG1hbnkgdXNlZnVsIGJ1aWx0aW4gZnVuY3Rpb25zIHBlb3BsZSBzZWVtIG5vdCB0byBiZQotYXdhcmUgb2YgZm9yIHNvbWUgcmVhc29uOiBcZnVuY3Rpb257bWluKCl9IGFuZCBcZnVuY3Rpb257bWF4KCl9IGNhbgotZmluZCB0aGUgbWluaW11bS9tYXhpbXVtIG9mIGFueSBzZXF1ZW5jZSB3aXRoIGNvbXBhcmFibGUgc2VtYW50aWNzLAotZm9yIGV4YW1wbGUsIHlldCBtYW55IHBlb3BsZSB3cml0ZSB0aGVpciBvd24KLVxmdW5jdGlvbnttYXgoKX0vXGZ1bmN0aW9ue21pbigpfS4KLQotT24gdGhlIHNhbWUgbm90ZSwgbm90ZSB0aGF0IFxmdW5jdGlvbntmbG9hdCgpfSwgXGZ1bmN0aW9ue2ludCgpfSBhbmQKLVxmdW5jdGlvbntsb25nKCl9IGFsbCBhY2NlcHQgYXJndW1lbnRzIG9mIHR5cGUgc3RyaW5nLCBhbmQgc28gYXJlCi1zdWl0ZWQgdG8gcGFyc2luZyAtLS0gYXNzdW1pbmcgeW91IGFyZSByZWFkeSB0byBkZWFsIHdpdGggdGhlCi1cZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IHRoZXkgcmFpc2UuCi0KLVxzZWN0aW9ue1VzaW5nIEJhY2tzbGFzaCB0byBDb250aW51ZSBTdGF0ZW1lbnRzfQotCi1TaW5jZSBQeXRob24gdHJlYXRzIGEgbmV3bGluZSBhcyBhIHN0YXRlbWVudCB0ZXJtaW5hdG9yLAotYW5kIHNpbmNlIHN0YXRlbWVudHMgYXJlIG9mdGVuIG1vcmUgdGhlbiBpcyBjb21mb3J0YWJsZSB0byBwdXQKLWluIG9uZSBsaW5lLCBtYW55IHBlb3BsZSBkbzoKLQotXGJlZ2lue3ZlcmJhdGltfQotaWYgZm9vLmJhcigpWydmaXJzdCddWzBdID09IGJhei5xdXV4KDEsIDIpWzU6OV0gYW5kIFwKLSAgIGNhbGN1bGF0ZV9udW1iZXIoMTAsIDIwKSAhPSBmb3JidWxhdGUoNTAwLCAzNjApOgotICAgICAgcGFzcwotXGVuZHt2ZXJiYXRpbX0KLQotWW91IHNob3VsZCByZWFsaXplIHRoYXQgdGhpcyBpcyBkYW5nZXJvdXM6IGEgc3RyYXkgc3BhY2UgYWZ0ZXIgdGhlCi1cY29kZXtcXH0gd291bGQgbWFrZSB0aGlzIGxpbmUgd3JvbmcsIGFuZCBzdHJheSBzcGFjZXMgYXJlIG5vdG9yaW91c2x5Ci1oYXJkIHRvIHNlZSBpbiBlZGl0b3JzLiBJbiB0aGlzIGNhc2UsIGF0IGxlYXN0IGl0IHdvdWxkIGJlIGEgc3ludGF4Ci1lcnJvciwgYnV0IGlmIHRoZSBjb2RlIHdhczoKLQotXGJlZ2lue3ZlcmJhdGltfQotdmFsdWUgPSBmb28uYmFyKClbJ2ZpcnN0J11bMF0qYmF6LnF1dXgoMSwgMilbNTo5XSBcCi0gICAgICAgICsgY2FsY3VsYXRlX251bWJlcigxMCwgMjApKmZvcmJ1bGF0ZSg1MDAsIDM2MCkKLVxlbmR7dmVyYmF0aW19Ci0KLXRoZW4gaXQgd291bGQganVzdCBiZSBzdWJ0bHkgd3JvbmcuCi0KLUl0IGlzIHVzdWFsbHkgbXVjaCBiZXR0ZXIgdG8gdXNlIHRoZSBpbXBsaWNpdCBjb250aW51YXRpb24gaW5zaWRlIHBhcmVudGhlc2lzOgotCi1UaGlzIHZlcnNpb24gaXMgYnVsbGV0cHJvb2Y6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXZhbHVlID0gKGZvby5iYXIoKVsnZmlyc3QnXVswXSpiYXoucXV1eCgxLCAyKVs1OjldIAotICAgICAgICArIGNhbGN1bGF0ZV9udW1iZXIoMTAsIDIwKSpmb3JidWxhdGUoNTAwLCAzNjApKQotXGVuZHt2ZXJiYXRpbX0KLQotXGVuZHtkb2N1bWVudH0KZGlmZiAtLWdpdCBhL0RvYy9ob3d0by9mdW5jdGlvbmFsLnJzdCBiL0RvYy9ob3d0by9mdW5jdGlvbmFsLnJzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE1NTMzOS4uMDAwMDAwMAotLS0gYS9Eb2MvaG93dG8vZnVuY3Rpb25hbC5yc3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNDc0ICswLDAgQEAKLUZ1bmN0aW9uYWwgUHJvZ3JhbW1pbmcgSE9XVE8KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSoqVmVyc2lvbiAwLjMwKioKLQotKFRoaXMgaXMgYSBmaXJzdCBkcmFmdC4gIFBsZWFzZSBzZW5kIGNvbW1lbnRzL2Vycm9yCi1yZXBvcnRzL3N1Z2dlc3Rpb25zIHRvIGFta0BhbWsuY2EuICBUaGlzIFVSTCBpcyBwcm9iYWJseSBub3QgZ29pbmcgdG8KLWJlIHRoZSBmaW5hbCBsb2NhdGlvbiBvZiB0aGUgZG9jdW1lbnQsIHNvIGJlIGNhcmVmdWwgYWJvdXQgbGlua2luZyB0bwotaXQgLS0geW91IG1heSB3YW50IHRvIGFkZCBhIGRpc2NsYWltZXIuKQotCi1JbiB0aGlzIGRvY3VtZW50LCB3ZSdsbCB0YWtlIGEgdG91ciBvZiBQeXRob24ncyBmZWF0dXJlcyBzdWl0YWJsZSBmb3IKLWltcGxlbWVudGluZyBwcm9ncmFtcyBpbiBhIGZ1bmN0aW9uYWwgc3R5bGUuICBBZnRlciBhbiBpbnRyb2R1Y3Rpb24gdG8KLXRoZSBjb25jZXB0cyBvZiBmdW5jdGlvbmFsIHByb2dyYW1taW5nLCB3ZSdsbCBsb29rIGF0IGxhbmd1YWdlCi1mZWF0dXJlcyBzdWNoIGFzIGl0ZXJhdG9ycyBhbmQgZ2VuZXJhdG9ycyBhbmQgcmVsZXZhbnQgbGlicmFyeSBtb2R1bGVzCi1zdWNoIGFzIGBgaXRlcnRvb2xzYGAgYW5kIGBgZnVuY3Rvb2xzYGAuCi0KLQotLi4gY29udGVudHM6OgotCi1JbnRyb2R1Y3Rpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhpcyBzZWN0aW9uIGV4cGxhaW5zIHRoZSBiYXNpYyBjb25jZXB0IG9mIGZ1bmN0aW9uYWwgcHJvZ3JhbW1pbmc7IGlmCi15b3UncmUganVzdCBpbnRlcmVzdGVkIGluIGxlYXJuaW5nIGFib3V0IFB5dGhvbiBsYW5ndWFnZSBmZWF0dXJlcywKLXNraXAgdG8gdGhlIG5leHQgc2VjdGlvbi4KLQotUHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIHN1cHBvcnQgZGVjb21wb3NpbmcgcHJvYmxlbXMgaW4gc2V2ZXJhbCBkaWZmZXJlbnQgCi13YXlzOgotCi0qIE1vc3QgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIGFyZSAqKnByb2NlZHVyYWwqKjogCi0gIHByb2dyYW1zIGFyZSBsaXN0cyBvZiBpbnN0cnVjdGlvbnMgdGhhdCB0ZWxsIHRoZSBjb21wdXRlciB3aGF0IHRvCi0gIGRvIHdpdGggdGhlIHByb2dyYW0ncyBpbnB1dC4KLSAgQywgUGFzY2FsLCBhbmQgZXZlbiBVbml4IHNoZWxscyBhcmUgcHJvY2VkdXJhbCBsYW5ndWFnZXMuCi0KLSogSW4gKipkZWNsYXJhdGl2ZSoqIGxhbmd1YWdlcywgeW91IHdyaXRlIGEgc3BlY2lmaWNhdGlvbiB0aGF0IGRlc2NyaWJlcyAKLSAgdGhlIHByb2JsZW0gdG8gYmUgc29sdmVkLCBhbmQgdGhlIGxhbmd1YWdlIGltcGxlbWVudGF0aW9uIGZpZ3VyZXMgb3V0IAotICBob3cgdG8gcGVyZm9ybSB0aGUgY29tcHV0YXRpb24gZWZmaWNpZW50bHkuICBTUUwgaXMgdGhlIGRlY2xhcmF0aXZlIAotICBsYW5ndWFnZSB5b3UncmUgbW9zdCBsaWtlbHkgdG8gYmUgZmFtaWxpYXIgd2l0aDsgYSBTUUwgcXVlcnkgZGVzY3JpYmVzCi0gIHRoZSBkYXRhIHNldCB5b3Ugd2FudCB0byByZXRyaWV2ZSwgYW5kIHRoZSBTUUwgZW5naW5lIGRlY2lkZXMgd2hldGhlciB0byAKLSAgc2NhbiB0YWJsZXMgb3IgdXNlIGluZGV4ZXMsIHdoaWNoIHN1YmNsYXVzZXMgc2hvdWxkIGJlIHBlcmZvcm1lZCBmaXJzdCwKLSAgZXRjLgotCi0qICoqT2JqZWN0LW9yaWVudGVkKiogcHJvZ3JhbXMgbWFuaXB1bGF0ZSAgY29sbGVjdGlvbnMgb2Ygb2JqZWN0cy4KLSAgT2JqZWN0cyBoYXZlIGludGVybmFsIHN0YXRlIGFuZCBzdXBwb3J0IG1ldGhvZHMgdGhhdCBxdWVyeSBvciBtb2RpZnkKLSAgdGhpcyBpbnRlcm5hbCBzdGF0ZSBpbiBzb21lIHdheS4gU21hbGx0YWxrIGFuZCBKYXZhIGFyZQotICBvYmplY3Qtb3JpZW50ZWQgbGFuZ3VhZ2VzLiAgQysrIGFuZCBQeXRob24gYXJlIGxhbmd1YWdlcyB0aGF0Ci0gIHN1cHBvcnQgb2JqZWN0LW9yaWVudGVkIHByb2dyYW1taW5nLCBidXQgZG9uJ3QgZm9yY2UgdGhlIHVzZSAKLSAgb2Ygb2JqZWN0LW9yaWVudGVkIGZlYXR1cmVzLgotCi0qICoqRnVuY3Rpb25hbCoqIHByb2dyYW1taW5nIGRlY29tcG9zZXMgYSBwcm9ibGVtIGludG8gYSBzZXQgb2YgZnVuY3Rpb25zLgotICBJZGVhbGx5LCBmdW5jdGlvbnMgb25seSB0YWtlIGlucHV0cyBhbmQgcHJvZHVjZSBvdXRwdXRzLCBhbmQgZG9uJ3QgaGF2ZSBhbnkgCi0gIGludGVybmFsIHN0YXRlIHRoYXQgYWZmZWN0cyB0aGUgb3V0cHV0IHByb2R1Y2VkIGZvciBhIGdpdmVuIGlucHV0LgotICBXZWxsLWtub3duIGZ1bmN0aW9uYWwgbGFuZ3VhZ2VzIGluY2x1ZGUgdGhlIE1MIGZhbWlseSAoU3RhbmRhcmQgTUwsCi0gIE9DYW1sLCBhbmQgb3RoZXIgdmFyaWFudHMpIGFuZCBIYXNrZWxsLgotCi1UaGUgZGVzaWduZXJzIG9mIHNvbWUgY29tcHV0ZXIgbGFuZ3VhZ2VzIGhhdmUgY2hvc2VuIG9uZSBhcHByb2FjaCB0byAKLXByb2dyYW1taW5nIHRoYXQncyBlbXBoYXNpemVkLiAgVGhpcyBvZnRlbiBtYWtlcyBpdCBkaWZmaWN1bHQgdG8KLXdyaXRlIHByb2dyYW1zIHRoYXQgdXNlIGEgZGlmZmVyZW50IGFwcHJvYWNoLiAgT3RoZXIgbGFuZ3VhZ2VzIGFyZQotbXVsdGktcGFyYWRpZ20gbGFuZ3VhZ2VzIHRoYXQgc3VwcG9ydCBzZXZlcmFsIGRpZmZlcmVudCBhcHByb2FjaGVzLiAgTGlzcCwKLUMrKywgYW5kIFB5dGhvbiBhcmUgbXVsdGktcGFyYWRpZ207IHlvdSBjYW4gd3JpdGUgcHJvZ3JhbXMgb3IKLWxpYnJhcmllcyB0aGF0IGFyZSBsYXJnZWx5IHByb2NlZHVyYWwsIG9iamVjdC1vcmllbnRlZCwgb3IgZnVuY3Rpb25hbAotaW4gYWxsIG9mIHRoZXNlIGxhbmd1YWdlcy4gIEluIGEgbGFyZ2UgcHJvZ3JhbSwgZGlmZmVyZW50IHNlY3Rpb25zCi1taWdodCBiZSB3cml0dGVuIHVzaW5nIGRpZmZlcmVudCBhcHByb2FjaGVzOyB0aGUgR1VJIG1pZ2h0IGJlIG9iamVjdC1vcmllbnRlZAotd2hpbGUgdGhlIHByb2Nlc3NpbmcgbG9naWMgaXMgcHJvY2VkdXJhbCBvciBmdW5jdGlvbmFsLCBmb3IgZXhhbXBsZS4KLQotSW4gYSBmdW5jdGlvbmFsIHByb2dyYW0sIGlucHV0IGZsb3dzIHRocm91Z2ggYSBzZXQgb2YgZnVuY3Rpb25zLiBFYWNoCi1mdW5jdGlvbiBvcGVyYXRlcyBvbiBpdHMgaW5wdXQgYW5kIHByb2R1Y2VzIHNvbWUgb3V0cHV0LiAgRnVuY3Rpb25hbAotc3R5bGUgZnJvd25zIHVwb24gZnVuY3Rpb25zIHdpdGggc2lkZSBlZmZlY3RzIHRoYXQgbW9kaWZ5IGludGVybmFsCi1zdGF0ZSBvciBtYWtlIG90aGVyIGNoYW5nZXMgdGhhdCBhcmVuJ3QgdmlzaWJsZSBpbiB0aGUgZnVuY3Rpb24ncwotcmV0dXJuIHZhbHVlLiAgRnVuY3Rpb25zIHRoYXQgaGF2ZSBubyBzaWRlIGVmZmVjdHMgYXQgYWxsIGFyZSAKLWNhbGxlZCAqKnB1cmVseSBmdW5jdGlvbmFsKiouCi1Bdm9pZGluZyBzaWRlIGVmZmVjdHMgbWVhbnMgbm90IHVzaW5nIGRhdGEgc3RydWN0dXJlcwotdGhhdCBnZXQgdXBkYXRlZCBhcyBhIHByb2dyYW0gcnVuczsgZXZlcnkgZnVuY3Rpb24ncyBvdXRwdXQgCi1tdXN0IG9ubHkgZGVwZW5kIG9uIGl0cyBpbnB1dC4KLQotU29tZSBsYW5ndWFnZXMgYXJlIHZlcnkgc3RyaWN0IGFib3V0IHB1cml0eSBhbmQgZG9uJ3QgZXZlbiBoYXZlCi1hc3NpZ25tZW50IHN0YXRlbWVudHMgc3VjaCBhcyBgYGE9M2BgIG9yIGBgYyA9IGEgKyBiYGAsIGJ1dCBpdCdzCi1kaWZmaWN1bHQgdG8gYXZvaWQgYWxsIHNpZGUgZWZmZWN0cy4gIFByaW50aW5nIHRvIHRoZSBzY3JlZW4gb3IKLXdyaXRpbmcgdG8gYSBkaXNrIGZpbGUgYXJlIHNpZGUgZWZmZWN0cywgZm9yIGV4YW1wbGUuICBGb3IgZXhhbXBsZSwgaW4KLVB5dGhvbiBhIGBgcHJpbnRgYCBzdGF0ZW1lbnQgb3IgYSBgYHRpbWUuc2xlZXAoMSlgYCBib3RoIHJldHVybiBubwotdXNlZnVsIHZhbHVlOyB0aGV5J3JlIG9ubHkgY2FsbGVkIGZvciB0aGVpciBzaWRlIGVmZmVjdHMgb2Ygc2VuZGluZwotc29tZSB0ZXh0IHRvIHRoZSBzY3JlZW4gb3IgcGF1c2luZyBleGVjdXRpb24gZm9yIGEgc2Vjb25kLgotCi1QeXRob24gcHJvZ3JhbXMgd3JpdHRlbiBpbiBmdW5jdGlvbmFsIHN0eWxlIHVzdWFsbHkgd29uJ3QgZ28gdG8gdGhlCi1leHRyZW1lIG9mIGF2b2lkaW5nIGFsbCBJL08gb3IgYWxsIGFzc2lnbm1lbnRzOyBpbnN0ZWFkLCB0aGV5J2xsCi1wcm92aWRlIGEgZnVuY3Rpb25hbC1hcHBlYXJpbmcgaW50ZXJmYWNlIGJ1dCB3aWxsIHVzZSBub24tZnVuY3Rpb25hbAotZmVhdHVyZXMgaW50ZXJuYWxseS4gIEZvciBleGFtcGxlLCB0aGUgaW1wbGVtZW50YXRpb24gb2YgYSBmdW5jdGlvbgotd2lsbCBzdGlsbCB1c2UgYXNzaWdubWVudHMgdG8gbG9jYWwgdmFyaWFibGVzLCBidXQgd29uJ3QgbW9kaWZ5IGdsb2JhbAotdmFyaWFibGVzIG9yIGhhdmUgb3RoZXIgc2lkZSBlZmZlY3RzLgotCi1GdW5jdGlvbmFsIHByb2dyYW1taW5nIGNhbiBiZSBjb25zaWRlcmVkIHRoZSBvcHBvc2l0ZSBvZgotb2JqZWN0LW9yaWVudGVkIHByb2dyYW1taW5nLiAgT2JqZWN0cyBhcmUgbGl0dGxlIGNhcHN1bGVzIGNvbnRhaW5pbmcKLXNvbWUgaW50ZXJuYWwgc3RhdGUgYWxvbmcgd2l0aCBhIGNvbGxlY3Rpb24gb2YgbWV0aG9kIGNhbGxzIHRoYXQgbGV0Ci15b3UgbW9kaWZ5IHRoaXMgc3RhdGUsIGFuZCBwcm9ncmFtcyBjb25zaXN0IG9mIG1ha2luZyB0aGUgcmlnaHQgc2V0IG9mCi1zdGF0ZSBjaGFuZ2VzLiAgRnVuY3Rpb25hbCBwcm9ncmFtbWluZyB3YW50cyB0byBhdm9pZCBzdGF0ZSBjaGFuZ2VzIGFzCi1tdWNoIGFzIHBvc3NpYmxlIGFuZCB3b3JrcyB3aXRoIGRhdGEgZmxvd2luZyBiZXR3ZWVuIGZ1bmN0aW9ucy4gIEluCi1QeXRob24geW91IG1pZ2h0IGNvbWJpbmUgdGhlIHR3byBhcHByb2FjaGVzIGJ5IHdyaXRpbmcgZnVuY3Rpb25zIHRoYXQKLXRha2UgYW5kIHJldHVybiBpbnN0YW5jZXMgcmVwcmVzZW50aW5nIG9iamVjdHMgaW4geW91ciBhcHBsaWNhdGlvbgotKGUtbWFpbCBtZXNzYWdlcywgdHJhbnNhY3Rpb25zLCBldGMuKS4KLQotRnVuY3Rpb25hbCBkZXNpZ24gbWF5IHNlZW0gbGlrZSBhbiBvZGQgY29uc3RyYWludCB0byB3b3JrIHVuZGVyLiAgV2h5Ci1zaG91bGQgeW91IGF2b2lkIG9iamVjdHMgYW5kIHNpZGUgZWZmZWN0cz8gIFRoZXJlIGFyZSB0aGVvcmV0aWNhbCBhbmQKLXByYWN0aWNhbCBhZHZhbnRhZ2VzIHRvIHRoZSBmdW5jdGlvbmFsIHN0eWxlOgotCi0qIEZvcm1hbCBwcm92YWJpbGl0eS4KLSogTW9kdWxhcml0eS4KLSogQ29tcG9zYWJpbGl0eS4KLSogRWFzZSBvZiBkZWJ1Z2dpbmcgYW5kIHRlc3RpbmcuCi0KLUZvcm1hbCBwcm92YWJpbGl0eQotJycnJycnJycnJycnJycnJycnJycnJwotCi1BIHRoZW9yZXRpY2FsIGJlbmVmaXQgaXMgdGhhdCBpdCdzIGVhc2llciB0byBjb25zdHJ1Y3QgYSBtYXRoZW1hdGljYWwgcHJvb2YKLXRoYXQgYSBmdW5jdGlvbmFsIHByb2dyYW0gaXMgY29ycmVjdC4KLQotRm9yIGEgbG9uZyB0aW1lIHJlc2VhcmNoZXJzIGhhdmUgYmVlbiBpbnRlcmVzdGVkIGluIGZpbmRpbmcgd2F5cyB0bwotbWF0aGVtYXRpY2FsbHkgcHJvdmUgcHJvZ3JhbXMgY29ycmVjdC4gIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGVzdGluZwotYSBwcm9ncmFtIG9uIG51bWVyb3VzIGlucHV0cyBhbmQgY29uY2x1ZGluZyB0aGF0IGl0cyBvdXRwdXQgaXMgdXN1YWxseQotY29ycmVjdCwgb3IgcmVhZGluZyBhIHByb2dyYW0ncyBzb3VyY2UgY29kZSBhbmQgY29uY2x1ZGluZyB0aGF0IHRoZQotY29kZSBsb29rcyByaWdodDsgdGhlIGdvYWwgaXMgaW5zdGVhZCBhIHJpZ29yb3VzIHByb29mIHRoYXQgYSBwcm9ncmFtCi1wcm9kdWNlcyB0aGUgcmlnaHQgcmVzdWx0IGZvciBhbGwgcG9zc2libGUgaW5wdXRzLgotCi1UaGUgdGVjaG5pcXVlIHVzZWQgdG8gcHJvdmUgcHJvZ3JhbXMgY29ycmVjdCBpcyB0byB3cml0ZSBkb3duIAotKippbnZhcmlhbnRzKiosIHByb3BlcnRpZXMgb2YgdGhlIGlucHV0IGRhdGEgYW5kIG9mIHRoZSBwcm9ncmFtJ3MgCi12YXJpYWJsZXMgdGhhdCBhcmUgYWx3YXlzIHRydWUuICBGb3IgZWFjaCBsaW5lIG9mIGNvZGUsIHlvdSB0aGVuIHNob3cgCi10aGF0IGlmIGludmFyaWFudHMgWCBhbmQgWSBhcmUgdHJ1ZSAqKmJlZm9yZSoqIHRoZSBsaW5lIGlzIGV4ZWN1dGVkLCAKLXRoZSBzbGlnaHRseSBkaWZmZXJlbnQgaW52YXJpYW50cyBYJyBhbmQgWScgYXJlIHRydWUgKiphZnRlcioqCi10aGUgbGluZSBpcyBleGVjdXRlZC4gIFRoaXMgY29udGludWVzIHVudGlsIHlvdSByZWFjaCB0aGUgZW5kIG9mIHRoZQotcHJvZ3JhbSwgYXQgd2hpY2ggcG9pbnQgdGhlIGludmFyaWFudHMgc2hvdWxkIG1hdGNoIHRoZSBkZXNpcmVkIAotY29uZGl0aW9ucyBvbiB0aGUgcHJvZ3JhbSdzIG91dHB1dC4KLQotRnVuY3Rpb25hbCBwcm9ncmFtbWluZydzIGF2b2lkYW5jZSBvZiBhc3NpZ25tZW50cyBhcm9zZSBiZWNhdXNlIAotYXNzaWdubWVudHMgYXJlIGRpZmZpY3VsdCB0byBoYW5kbGUgd2l0aCB0aGlzIHRlY2huaXF1ZTsgCi1hc3NpZ25tZW50cyBjYW4gYnJlYWsgaW52YXJpYW50cyB0aGF0IHdlcmUgdHJ1ZSBiZWZvcmUgdGhlIGFzc2lnbm1lbnQKLXdpdGhvdXQgcHJvZHVjaW5nIGFueSBuZXcgaW52YXJpYW50cyB0aGF0IGNhbiBiZSBwcm9wYWdhdGVkIG9ud2FyZC4KLQotVW5mb3J0dW5hdGVseSwgcHJvdmluZyBwcm9ncmFtcyBjb3JyZWN0IGlzIGxhcmdlbHkgaW1wcmFjdGljYWwgYW5kIG5vdAotcmVsZXZhbnQgdG8gUHl0aG9uIHNvZnR3YXJlLiBFdmVuIHRyaXZpYWwgcHJvZ3JhbXMgcmVxdWlyZSBwcm9vZnMgdGhhdAotYXJlIHNldmVyYWwgcGFnZXMgbG9uZzsgdGhlIHByb29mIG9mIGNvcnJlY3RuZXNzIGZvciBhIG1vZGVyYXRlbHkKLWNvbXBsaWNhdGVkIHByb2dyYW0gd291bGQgYmUgZW5vcm1vdXMsIGFuZCBmZXcgb3Igbm9uZSBvZiB0aGUgcHJvZ3JhbXMKLXlvdSB1c2UgZGFpbHkgKHRoZSBQeXRob24gaW50ZXJwcmV0ZXIsIHlvdXIgWE1MIHBhcnNlciwgeW91ciB3ZWIKLWJyb3dzZXIpIGNvdWxkIGJlIHByb3ZlbiBjb3JyZWN0LiAgRXZlbiBpZiB5b3Ugd3JvdGUgZG93biBvciBnZW5lcmF0ZWQKLWEgcHJvb2YsIHRoZXJlIHdvdWxkIHRoZW4gYmUgdGhlIHF1ZXN0aW9uIG9mIHZlcmlmeWluZyB0aGUgcHJvb2Y7Ci1tYXliZSB0aGVyZSdzIGFuIGVycm9yIGluIGl0LCBhbmQgeW91IHdyb25nbHkgYmVsaWV2ZSB5b3UndmUgcHJvdmVkCi10aGUgcHJvZ3JhbSBjb3JyZWN0LgotCi1Nb2R1bGFyaXR5Ci0nJycnJycnJycnJycnJycnJycnJycnCi0KLUEgbW9yZSBwcmFjdGljYWwgYmVuZWZpdCBvZiBmdW5jdGlvbmFsIHByb2dyYW1taW5nIGlzIHRoYXQgaXQgZm9yY2VzCi15b3UgdG8gYnJlYWsgYXBhcnQgeW91ciBwcm9ibGVtIGludG8gc21hbGwgcGllY2VzLiAgUHJvZ3JhbXMgYXJlIG1vcmUKLW1vZHVsYXIgYXMgYSByZXN1bHQuICBJdCdzIGVhc2llciB0byBzcGVjaWZ5IGFuZCB3cml0ZSBhIHNtYWxsCi1mdW5jdGlvbiB0aGF0IGRvZXMgb25lIHRoaW5nIHRoYW4gYSBsYXJnZSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEKLWNvbXBsaWNhdGVkIHRyYW5zZm9ybWF0aW9uLiAgU21hbGwgZnVuY3Rpb25zIGFyZSBhbHNvIGVhc2llciB0byByZWFkCi1hbmQgdG8gY2hlY2sgZm9yIGVycm9ycy4KLQotCi1FYXNlIG9mIGRlYnVnZ2luZyBhbmQgdGVzdGluZyAKLScnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycKLQotVGVzdGluZyBhbmQgZGVidWdnaW5nIGEgZnVuY3Rpb25hbC1zdHlsZSBwcm9ncmFtIGlzIGVhc2llci4KLQotRGVidWdnaW5nIGlzIHNpbXBsaWZpZWQgYmVjYXVzZSBmdW5jdGlvbnMgYXJlIGdlbmVyYWxseSBzbWFsbCBhbmQKLWNsZWFybHkgc3BlY2lmaWVkLiAgV2hlbiBhIHByb2dyYW0gZG9lc24ndCB3b3JrLCBlYWNoIGZ1bmN0aW9uIGlzIGFuCi1pbnRlcmZhY2UgcG9pbnQgd2hlcmUgeW91IGNhbiBjaGVjayB0aGF0IHRoZSBkYXRhIGFyZSBjb3JyZWN0LiAgWW91Ci1jYW4gbG9vayBhdCB0aGUgaW50ZXJtZWRpYXRlIGlucHV0cyBhbmQgb3V0cHV0cyB0byBxdWlja2x5IGlzb2xhdGUgdGhlCi1mdW5jdGlvbiB0aGF0J3MgcmVzcG9uc2libGUgZm9yIGEgYnVnLgotCi1UZXN0aW5nIGlzIGVhc2llciBiZWNhdXNlIGVhY2ggZnVuY3Rpb24gaXMgYSBwb3RlbnRpYWwgc3ViamVjdCBmb3IgYQotdW5pdCB0ZXN0LiAgRnVuY3Rpb25zIGRvbid0IGRlcGVuZCBvbiBzeXN0ZW0gc3RhdGUgdGhhdCBuZWVkcyB0byBiZQotcmVwbGljYXRlZCBiZWZvcmUgcnVubmluZyBhIHRlc3Q7IGluc3RlYWQgeW91IG9ubHkgaGF2ZSB0byBzeW50aGVzaXplCi10aGUgcmlnaHQgaW5wdXQgYW5kIHRoZW4gY2hlY2sgdGhhdCB0aGUgb3V0cHV0IG1hdGNoZXMgZXhwZWN0YXRpb25zLgotCi0KLQotQ29tcG9zYWJpbGl0eQotJycnJycnJycnJycnJycnJycnJycnJwotCi1BcyB5b3Ugd29yayBvbiBhIGZ1bmN0aW9uYWwtc3R5bGUgcHJvZ3JhbSwgeW91J2xsIHdyaXRlIGEgbnVtYmVyIG9mCi1mdW5jdGlvbnMgd2l0aCB2YXJ5aW5nIGlucHV0cyBhbmQgb3V0cHV0cy4gIFNvbWUgb2YgdGhlc2UgZnVuY3Rpb25zCi13aWxsIGJlIHVuYXZvaWRhYmx5IHNwZWNpYWxpemVkIHRvIGEgcGFydGljdWxhciBhcHBsaWNhdGlvbiwgYnV0Ci1vdGhlcnMgd2lsbCBiZSB1c2VmdWwgaW4gYSB3aWRlIHZhcmlldHkgb2YgcHJvZ3JhbXMuICBGb3IgZXhhbXBsZSwgYQotZnVuY3Rpb24gdGhhdCB0YWtlcyBhIGRpcmVjdG9yeSBwYXRoIGFuZCByZXR1cm5zIGFsbCB0aGUgWE1MIGZpbGVzIGluCi10aGUgZGlyZWN0b3J5LCBvciBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBmaWxlbmFtZSBhbmQgcmV0dXJucyBpdHMKLWNvbnRlbnRzLCBjYW4gYmUgYXBwbGllZCB0byBtYW55IGRpZmZlcmVudCBzaXR1YXRpb25zLgotCi1PdmVyIHRpbWUgeW91J2xsIGZvcm0gYSBwZXJzb25hbCBsaWJyYXJ5IG9mIHV0aWxpdGllcy4gIE9mdGVuIHlvdSdsbAotYXNzZW1ibGUgbmV3IHByb2dyYW1zIGJ5IGFycmFuZ2luZyBleGlzdGluZyBmdW5jdGlvbnMgaW4gYSBuZXcKLWNvbmZpZ3VyYXRpb24gYW5kIHdyaXRpbmcgYSBmZXcgZnVuY3Rpb25zIHNwZWNpYWxpemVkIGZvciB0aGUgY3VycmVudAotdGFzay4KLQotCi0KLUl0ZXJhdG9ycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSSdsbCBzdGFydCBieSBsb29raW5nIGF0IGEgUHl0aG9uIGxhbmd1YWdlIGZlYXR1cmUgdGhhdCdzIGFuIGltcG9ydGFudAotZm91bmRhdGlvbiBmb3Igd3JpdGluZyBmdW5jdGlvbmFsLXN0eWxlIHByb2dyYW1zOiBpdGVyYXRvcnMuCi0KLUFuIGl0ZXJhdG9yIGlzIGFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBzdHJlYW0gb2YgZGF0YTsgdGhpcyBvYmplY3QKLXJldHVybnMgdGhlIGRhdGEgb25lIGVsZW1lbnQgYXQgYSB0aW1lLiAgQSBQeXRob24gaXRlcmF0b3IgbXVzdAotc3VwcG9ydCBhIG1ldGhvZCBjYWxsZWQgYGBfX25leHRfXygpYGAgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMgYW5kIGFsd2F5cwotcmV0dXJucyB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBzdHJlYW0uICBJZiB0aGVyZSBhcmUgbm8gbW9yZSBlbGVtZW50cwotaW4gdGhlIHN0cmVhbSwgYGBfX25leHRfXygpYGAgbXVzdCByYWlzZSB0aGUgYGBTdG9wSXRlcmF0aW9uYGAgZXhjZXB0aW9uLgotSXRlcmF0b3JzIGRvbid0IGhhdmUgdG8gYmUgZmluaXRlLCB0aG91Z2g7IGl0J3MgcGVyZmVjdGx5IHJlYXNvbmFibGUKLXRvIHdyaXRlIGFuIGl0ZXJhdG9yIHRoYXQgcHJvZHVjZXMgYW4gaW5maW5pdGUgc3RyZWFtIG9mIGRhdGEuCi1UaGUgYnVpbHQtaW4gYGBuZXh0KClgYCBmdW5jdGlvbiBpcyBub3JtYWxseSB1c2VkIHRvIGNhbGwgdGhlIGl0ZXJhdG9yJ3MKLWBgX19uZXh0X18oKWBgIG1ldGhvZC4KLQotVGhlIGJ1aWx0LWluIGBgaXRlcigpYGAgZnVuY3Rpb24gdGFrZXMgYW4gYXJiaXRyYXJ5IG9iamVjdCBhbmQgdHJpZXMKLXRvIHJldHVybiBhbiBpdGVyYXRvciB0aGF0IHdpbGwgcmV0dXJuIHRoZSBvYmplY3QncyBjb250ZW50cyBvcgotZWxlbWVudHMsIHJhaXNpbmcgYGBUeXBlRXJyb3JgYCBpZiB0aGUgb2JqZWN0IGRvZXNuJ3Qgc3VwcG9ydAotaXRlcmF0aW9uLiAgU2V2ZXJhbCBvZiBQeXRob24ncyBidWlsdC1pbiBkYXRhIHR5cGVzIHN1cHBvcnQgaXRlcmF0aW9uLAotdGhlIG1vc3QgY29tbW9uIGJlaW5nIGxpc3RzIGFuZCBkaWN0aW9uYXJpZXMuICBBbiBvYmplY3QgaXMgY2FsbGVkIAotYW4gKippdGVyYWJsZSoqIG9iamVjdCBpZiB5b3UgY2FuIGdldCBhbiBpdGVyYXRvciBmb3IgaXQuCi0KLVlvdSBjYW4gZXhwZXJpbWVudCB3aXRoIHRoZSBpdGVyYXRpb24gaW50ZXJmYWNlIG1hbnVhbGx5OjoKLQotICAgID4+PiBMID0gWzEsMiwzXQotICAgID4+PiBpdCA9IGl0ZXIoTCkKLSAgICA+Pj4gcHJpbnQgaXQKLSAgICA8aXRlcmF0b3Igb2JqZWN0IGF0IDB4ODExNjg3MD4KLSAgICA+Pj4gbmV4dChpdCkKLSAgICAxCi0gICAgPj4+IG5leHQoaXQpCi0gICAgMgotICAgID4+PiBuZXh0KGl0KQotICAgIDMKLSAgICA+Pj4gbmV4dChpdCkKLSAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/Ci0gICAgU3RvcEl0ZXJhdGlvbgotICAgID4+PiAgICAgIAotCi1QeXRob24gZXhwZWN0cyBpdGVyYWJsZSBvYmplY3RzIGluIHNldmVyYWwgZGlmZmVyZW50IGNvbnRleHRzLCB0aGUgCi1tb3N0IGltcG9ydGFudCBiZWluZyB0aGUgYGBmb3JgYCBzdGF0ZW1lbnQuICBJbiB0aGUgc3RhdGVtZW50IGBgZm9yIFggaW4gWWBgLAotWSBtdXN0IGJlIGFuIGl0ZXJhdG9yIG9yIHNvbWUgb2JqZWN0IGZvciB3aGljaCBgYGl0ZXIoKWBgIGNhbiBjcmVhdGUgCi1hbiBpdGVyYXRvci4gIFRoZXNlIHR3byBzdGF0ZW1lbnRzIGFyZSBlcXVpdmFsZW50OjoKLQotICAgICAgICBmb3IgaSBpbiBpdGVyKG9iaik6Ci0gICAgICAgICAgICBwcmludCBpCi0KLSAgICAgICAgZm9yIGkgaW4gb2JqOgotICAgICAgICAgICAgcHJpbnQgaQotCi1JdGVyYXRvcnMgY2FuIGJlIG1hdGVyaWFsaXplZCBhcyBsaXN0cyBvciB0dXBsZXMgYnkgdXNpbmcgdGhlCi1gYGxpc3QoKWBgIG9yIGBgdHVwbGUoKWBgIGNvbnN0cnVjdG9yIGZ1bmN0aW9uczo6Ci0KLSAgICA+Pj4gTCA9IFsxLDIsM10KLSAgICA+Pj4gaXRlcmF0b3IgPSBpdGVyKEwpCi0gICAgPj4+IHQgPSB0dXBsZShpdGVyYXRvcikKLSAgICA+Pj4gdAotICAgICgxLCAyLCAzKQotCi1TZXF1ZW5jZSB1bnBhY2tpbmcgYWxzbyBzdXBwb3J0cyBpdGVyYXRvcnM6IGlmIHlvdSBrbm93IGFuIGl0ZXJhdG9yIAotd2lsbCByZXR1cm4gTiBlbGVtZW50cywgeW91IGNhbiB1bnBhY2sgdGhlbSBpbnRvIGFuIE4tdHVwbGU6OgotCi0gICAgPj4+IEwgPSBbMSwyLDNdCi0gICAgPj4+IGl0ZXJhdG9yID0gaXRlcihMKQotICAgID4+PiBhLGIsYyA9IGl0ZXJhdG9yCi0gICAgPj4+IGEsYixjCi0gICAgKDEsIDIsIDMpCi0KLUJ1aWx0LWluIGZ1bmN0aW9ucyBzdWNoIGFzIGBgbWF4KClgYCBhbmQgYGBtaW4oKWBgIGNhbiB0YWtlIGEgc2luZ2xlCi1pdGVyYXRvciBhcmd1bWVudCBhbmQgd2lsbCByZXR1cm4gdGhlIGxhcmdlc3Qgb3Igc21hbGxlc3QgZWxlbWVudC4KLVRoZSBgYCJpbiJgYCBhbmQgYGAibm90IGluImBgIG9wZXJhdG9ycyBhbHNvIHN1cHBvcnQgaXRlcmF0b3JzOiBgYFggaW4KLWl0ZXJhdG9yYGAgaXMgdHJ1ZSBpZiBYIGlzIGZvdW5kIGluIHRoZSBzdHJlYW0gcmV0dXJuZWQgYnkgdGhlCi1pdGVyYXRvci4gIFlvdSdsbCBydW4gaW50byBvYnZpb3VzIHByb2JsZW1zIGlmIHRoZSBpdGVyYXRvciBpcwotaW5maW5pdGU7IGBgbWF4KClgYCwgYGBtaW4oKWBgLCBhbmQgYGAibm90IGluImBgIHdpbGwgbmV2ZXIgcmV0dXJuLCBhbmQKLWlmIHRoZSBlbGVtZW50IFggbmV2ZXIgYXBwZWFycyBpbiB0aGUgc3RyZWFtLCB0aGUgYGAiaW4iYGAgb3BlcmF0b3IKLXdvbid0IHJldHVybiBlaXRoZXIuCi0KLU5vdGUgdGhhdCB5b3UgY2FuIG9ubHkgZ28gZm9yd2FyZCBpbiBhbiBpdGVyYXRvcjsgdGhlcmUncyBubyB3YXkgdG8KLWdldCB0aGUgcHJldmlvdXMgZWxlbWVudCwgcmVzZXQgdGhlIGl0ZXJhdG9yLCBvciBtYWtlIGEgY29weSBvZiBpdC4KLUl0ZXJhdG9yIG9iamVjdHMgY2FuIG9wdGlvbmFsbHkgcHJvdmlkZSB0aGVzZSBhZGRpdGlvbmFsIGNhcGFiaWxpdGllcywKLWJ1dCB0aGUgaXRlcmF0b3IgcHJvdG9jb2wgb25seSBzcGVjaWZpZXMgdGhlIGBgX19uZXh0X18oKWBgIG1ldGhvZC4KLUZ1bmN0aW9ucyBtYXkgdGhlcmVmb3JlIGNvbnN1bWUgYWxsIG9mIHRoZSBpdGVyYXRvcidzIG91dHB1dCwgYW5kIGlmCi15b3UgbmVlZCB0byBkbyBzb21ldGhpbmcgZGlmZmVyZW50IHdpdGggdGhlIHNhbWUgc3RyZWFtLCB5b3UnbGwgaGF2ZQotdG8gY3JlYXRlIGEgbmV3IGl0ZXJhdG9yLgotCi0KLQotRGF0YSBUeXBlcyBUaGF0IFN1cHBvcnQgSXRlcmF0b3JzCi0nJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJwotCi1XZSd2ZSBhbHJlYWR5IHNlZW4gaG93IGxpc3RzIGFuZCB0dXBsZXMgc3VwcG9ydCBpdGVyYXRvcnMuICBJbiBmYWN0LAotYW55IFB5dGhvbiBzZXF1ZW5jZSB0eXBlLCBzdWNoIGFzIHN0cmluZ3MsIHdpbGwgYXV0b21hdGljYWxseSBzdXBwb3J0Ci1jcmVhdGlvbiBvZiBhbiBpdGVyYXRvci4KLQotQ2FsbGluZyBgYGl0ZXIoKWBgIG9uIGEgZGljdGlvbmFyeSByZXR1cm5zIGFuIGl0ZXJhdG9yIHRoYXQgd2lsbCBsb29wCi1vdmVyIHRoZSBkaWN0aW9uYXJ5J3Mga2V5czo6Ci0KLSAgICA+Pj4gbSA9IHsnSmFuJzogMSwgJ0ZlYic6IDIsICdNYXInOiAzLCAnQXByJzogNCwgJ01heSc6IDUsICdKdW4nOiA2LAotICAgIC4uLiAgICAgICdKdWwnOiA3LCAnQXVnJzogOCwgJ1NlcCc6IDksICdPY3QnOiAxMCwgJ05vdic6IDExLCAnRGVjJzogMTJ9Ci0gICAgPj4+IGZvciBrZXkgaW4gbToKLSAgICAuLi4gICAgIHByaW50IGtleSwgbVtrZXldCi0gICAgTWFyIDMKLSAgICBGZWIgMgotICAgIEF1ZyA4Ci0gICAgU2VwIDkKLSAgICBNYXkgNQotICAgIEp1biA2Ci0gICAgSnVsIDcKLSAgICBKYW4gMQotICAgIEFwciA0Ci0gICAgTm92IDExCi0gICAgRGVjIDEyCi0gICAgT2N0IDEwCi0KLU5vdGUgdGhhdCB0aGUgb3JkZXIgaXMgZXNzZW50aWFsbHkgcmFuZG9tLCBiZWNhdXNlIGl0J3MgYmFzZWQgb24gdGhlCi1oYXNoIG9yZGVyaW5nIG9mIHRoZSBvYmplY3RzIGluIHRoZSBkaWN0aW9uYXJ5LgotCi1BcHBseWluZyBgYGl0ZXIoKWBgIHRvIGEgZGljdGlvbmFyeSBhbHdheXMgbG9vcHMgb3ZlciB0aGUga2V5cywgYnV0Ci1kaWN0aW9uYXJpZXMgaGF2ZSBtZXRob2RzIHRoYXQgcmV0dXJuIG90aGVyIGl0ZXJhdG9ycy4gIElmIHlvdSB3YW50IHRvCi1pdGVyYXRlIG92ZXIga2V5cywgdmFsdWVzLCBvciBrZXkvdmFsdWUgcGFpcnMsIHlvdSBjYW4gZXhwbGljaXRseSBjYWxsCi10aGUgYGBpdGVya2V5cygpYGAsIGBgaXRlcnZhbHVlcygpYGAsIG9yIGBgaXRlcml0ZW1zKClgYCBtZXRob2RzIHRvCi1nZXQgYW4gYXBwcm9wcmlhdGUgaXRlcmF0b3IuCi0KLVRoZSBgYGRpY3QoKWBgIGNvbnN0cnVjdG9yIGNhbiBhY2NlcHQgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIGEKLWZpbml0ZSBzdHJlYW0gb2YgYGAoa2V5LCB2YWx1ZSlgYCB0dXBsZXM6OgotCi0gICAgPj4+IEwgPSBbKCdJdGFseScsICdSb21lJyksICgnRnJhbmNlJywgJ1BhcmlzJyksICgnVVMnLCAnV2FzaGluZ3RvbiBEQycpXQotICAgID4+PiBkaWN0KGl0ZXIoTCkpCi0gICAgeydJdGFseSc6ICdSb21lJywgJ1VTJzogJ1dhc2hpbmd0b24gREMnLCAnRnJhbmNlJzogJ1BhcmlzJ30KLQotRmlsZXMgYWxzbyBzdXBwb3J0IGl0ZXJhdGlvbiBieSBjYWxsaW5nIHRoZSBgYHJlYWRsaW5lKClgYAotbWV0aG9kIHVudGlsIHRoZXJlIGFyZSBubyBtb3JlIGxpbmVzIGluIHRoZSBmaWxlLiAgVGhpcyBtZWFucyB5b3UgY2FuCi1yZWFkIGVhY2ggbGluZSBvZiBhIGZpbGUgbGlrZSB0aGlzOjoKLQotICAgIGZvciBsaW5lIGluIGZpbGU6Ci0gICAgICAgICMgZG8gc29tZXRoaW5nIGZvciBlYWNoIGxpbmUKLSAgICAgICAgLi4uCi0KLVNldHMgY2FuIHRha2UgdGhlaXIgY29udGVudHMgZnJvbSBhbiBpdGVyYWJsZSBhbmQgbGV0IHlvdSBpdGVyYXRlIG92ZXIKLXRoZSBzZXQncyBlbGVtZW50czo6Ci0KLSAgICBTID0gc2V0KCgyLCAzLCA1LCA3LCAxMSwgMTMpKQotICAgIGZvciBpIGluIFM6Ci0gICAgICAgIHByaW50IGkKLQotCi0KLUdlbmVyYXRvciBleHByZXNzaW9ucyBhbmQgbGlzdCBjb21wcmVoZW5zaW9ucwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Ud28gY29tbW9uIG9wZXJhdGlvbnMgb24gYW4gaXRlcmF0b3IncyBvdXRwdXQgYXJlIDEpIHBlcmZvcm1pbmcgc29tZQotb3BlcmF0aW9uIGZvciBldmVyeSBlbGVtZW50LCAyKSBzZWxlY3RpbmcgYSBzdWJzZXQgb2YgZWxlbWVudHMgdGhhdAotbWVldCBzb21lIGNvbmRpdGlvbi4gIEZvciBleGFtcGxlLCBnaXZlbiBhIGxpc3Qgb2Ygc3RyaW5ncywgeW91IG1pZ2h0Ci13YW50IHRvIHN0cmlwIG9mZiB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20gZWFjaCBsaW5lIG9yIGV4dHJhY3QgYWxsCi10aGUgc3RyaW5ncyBjb250YWluaW5nIGEgZ2l2ZW4gc3Vic3RyaW5nLgotCi1MaXN0IGNvbXByZWhlbnNpb25zIGFuZCBnZW5lcmF0b3IgZXhwcmVzc2lvbnMgKHNob3J0IGZvcm06ICJsaXN0Y29tcHMiCi1hbmQgImdlbmV4cHMiKSBhcmUgYSBjb25jaXNlIG5vdGF0aW9uIGZvciBzdWNoIG9wZXJhdGlvbnMsIGJvcnJvd2VkCi1mcm9tIHRoZSBmdW5jdGlvbmFsIHByb2dyYW1taW5nIGxhbmd1YWdlIEhhc2tlbGwKLShodHRwOi8vd3d3Lmhhc2tlbGwub3JnKS4gIFlvdSBjYW4gc3RyaXAgYWxsIHRoZSB3aGl0ZXNwYWNlIGZyb20gYQotc3RyZWFtIG9mIHN0cmluZ3Mgd2l0aCB0aGUgZm9sbG93aW5nIGNvZGU6OgotCi0gICAgICAgIGxpbmVfbGlzdCA9IFsnICBsaW5lIDFcbicsICdsaW5lIDIgIFxuJywgLi4uXQotCi0gICAgICAgICMgR2VuZXJhdG9yIGV4cHJlc3Npb24gLS0gcmV0dXJucyBpdGVyYXRvcgotICAgICAgICBzdHJpcHBlZF9pdGVyID0gKGxpbmUuc3RyaXAoKSBmb3IgbGluZSBpbiBsaW5lX2xpc3QpCi0KLSAgICAgICAgIyBMaXN0IGNvbXByZWhlbnNpb24gLS0gcmV0dXJucyBsaXN0Ci0gICAgICAgIHN0cmlwcGVkX2xpc3QgPSBbbGluZS5zdHJpcCgpIGZvciBsaW5lIGluIGxpbmVfbGlzdF0KLQotWW91IGNhbiBzZWxlY3Qgb25seSBjZXJ0YWluIGVsZW1lbnRzIGJ5IGFkZGluZyBhbiBgYCJpZiJgYCBjb25kaXRpb246OgotCi0gICAgICAgIHN0cmlwcGVkX2xpc3QgPSBbbGluZS5zdHJpcCgpIGZvciBsaW5lIGluIGxpbmVfbGlzdAotICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxpbmUgIT0gIiJdCi0KLVdpdGggYSBsaXN0IGNvbXByZWhlbnNpb24sIHlvdSBnZXQgYmFjayBhIFB5dGhvbiBsaXN0OwotYGBzdHJpcHBlZF9saXN0YGAgaXMgYSBsaXN0IGNvbnRhaW5pbmcgdGhlIHJlc3VsdGluZyBsaW5lcywgbm90IGFuCi1pdGVyYXRvci4gIEdlbmVyYXRvciBleHByZXNzaW9ucyByZXR1cm4gYW4gaXRlcmF0b3IgdGhhdCBjb21wdXRlcyB0aGUKLXZhbHVlcyBhcyBuZWNlc3NhcnksIG5vdCBuZWVkaW5nIHRvIG1hdGVyaWFsaXplIGFsbCB0aGUgdmFsdWVzIGF0Ci1vbmNlLiAgVGhpcyBtZWFucyB0aGF0IGxpc3QgY29tcHJlaGVuc2lvbnMgYXJlbid0IHVzZWZ1bCBpZiB5b3UncmUKLXdvcmtpbmcgd2l0aCBpdGVyYXRvcnMgdGhhdCByZXR1cm4gYW4gaW5maW5pdGUgc3RyZWFtIG9yIGEgdmVyeSBsYXJnZQotYW1vdW50IG9mIGRhdGEuICBHZW5lcmF0b3IgZXhwcmVzc2lvbnMgYXJlIHByZWZlcmFibGUgaW4gdGhlc2UKLXNpdHVhdGlvbnMuCi0KLUdlbmVyYXRvciBleHByZXNzaW9ucyBhcmUgc3Vycm91bmRlZCBieSBwYXJlbnRoZXNlcyAoIigpIikgYW5kIGxpc3QKLWNvbXByZWhlbnNpb25zIGFyZSBzdXJyb3VuZGVkIGJ5IHNxdWFyZSBicmFja2V0cyAoIltdIikuICBHZW5lcmF0b3IKLWV4cHJlc3Npb25zIGhhdmUgdGhlIGZvcm06OgotCi0gICAgKCBleHByZXNzaW9uIGZvciBleHByIGluIHNlcXVlbmNlMSAKLSAgICAgICAgICAgICAgICAgaWYgY29uZGl0aW9uMQotICAgICAgICAgICAgICAgICBmb3IgZXhwcjIgaW4gc2VxdWVuY2UyCi0gICAgICAgICAgICAgICAgIGlmIGNvbmRpdGlvbjIKLSAgICAgICAgICAgICAgICAgZm9yIGV4cHIzIGluIHNlcXVlbmNlMyAuLi4KLSAgICAgICAgICAgICAgICAgaWYgY29uZGl0aW9uMwotICAgICAgICAgICAgICAgICBmb3IgZXhwck4gaW4gc2VxdWVuY2VOCi0gICAgICAgICAgICAgICAgIGlmIGNvbmRpdGlvbk4gKQotCi1BZ2FpbiwgZm9yIGEgbGlzdCBjb21wcmVoZW5zaW9uIG9ubHkgdGhlIG91dHNpZGUgYnJhY2tldHMgYXJlCi1kaWZmZXJlbnQgKHNxdWFyZSBicmFja2V0cyBpbnN0ZWFkIG9mIHBhcmVudGhlc2VzKS4KLQotVGhlIGVsZW1lbnRzIG9mIHRoZSBnZW5lcmF0ZWQgb3V0cHV0IHdpbGwgYmUgdGhlIHN1Y2Nlc3NpdmUgdmFsdWVzIG9mCi1gYGV4cHJlc3Npb25gYC4gIFRoZSBgYGlmYGAgY2xhdXNlcyBhcmUgYWxsIG9wdGlvbmFsOyBpZiBwcmVzZW50LAotYGBleHByZXNzaW9uYGAgaXMgb25seSBldmFsdWF0ZWQgYW5kIGFkZGVkIHRvIHRoZSByZXN1bHQgd2hlbgotYGBjb25kaXRpb25gYCBpcyB0cnVlLgotCi1HZW5lcmF0b3IgZXhwcmVzc2lvbnMgYWx3YXlzIGhhdmUgdG8gYmUgd3JpdHRlbiBpbnNpZGUgcGFyZW50aGVzZXMsCi1idXQgdGhlIHBhcmVudGhlc2VzIHNpZ25hbGxpbmcgYSBmdW5jdGlvbiBjYWxsIGFsc28gY291bnQuICBJZiB5b3UKLXdhbnQgdG8gY3JlYXRlIGFuIGl0ZXJhdG9yIHRoYXQgd2lsbCBiZSBpbW1lZGlhdGVseSBwYXNzZWQgdG8gYQotZnVuY3Rpb24geW91IGNhbiB3cml0ZTo6Ci0KLSAgICAgICAgb2JqX3RvdGFsID0gc3VtKG9iai5jb3VudCBmb3Igb2JqIGluIGxpc3RfYWxsX29iamVjdHMoKSkKLQotVGhlIGBgZm9yLi4uaW5gYCBjbGF1c2VzIGNvbnRhaW4gdGhlIHNlcXVlbmNlcyB0byBiZSBpdGVyYXRlZCBvdmVyLgotVGhlIHNlcXVlbmNlcyBkbyBub3QgaGF2ZSB0byBiZSB0aGUgc2FtZSBsZW5ndGgsIGJlY2F1c2UgdGhleSBhcmUKLWl0ZXJhdGVkIG92ZXIgZnJvbSBsZWZ0IHRvIHJpZ2h0LCAqKm5vdCoqIGluIHBhcmFsbGVsLiAgRm9yIGVhY2gKLWVsZW1lbnQgaW4gYGBzZXF1ZW5jZTFgYCwgYGBzZXF1ZW5jZTJgYCBpcyBsb29wZWQgb3ZlciBmcm9tIHRoZQotYmVnaW5uaW5nLiAgYGBzZXF1ZW5jZTNgYCAgaXMgdGhlbiBsb29wZWQgb3ZlciBmb3IgZWFjaCAKLXJlc3VsdGluZyBwYWlyIG9mIGVsZW1lbnRzIGZyb20gYGBzZXF1ZW5jZTFgYCBhbmQgYGBzZXF1ZW5jZTJgYC4KLQotVG8gcHV0IGl0IGFub3RoZXIgd2F5LCBhIGxpc3QgY29tcHJlaGVuc2lvbiBvciBnZW5lcmF0b3IgZXhwcmVzc2lvbiBpcwotZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nIFB5dGhvbiBjb2RlOjoKLQotICAgIGZvciBleHByMSBpbiBzZXF1ZW5jZTE6Ci0gICAgICAgIGlmIG5vdCAoY29uZGl0aW9uMSk6Ci0gICAgICAgICAgICBjb250aW51ZSAgICMgU2tpcCB0aGlzIGVsZW1lbnQKLSAgICAgICAgZm9yIGV4cHIyIGluIHNlcXVlbmNlMjoKLSAgICAgICAgICAgIGlmIG5vdCAoY29uZGl0aW9uMik6Ci0gICAgICAgICAgICAgICAgY29udGludWUgICAgIyBTa2lwIHRoaXMgZWxlbWVudAotICAgICAgICAgICAgLi4uCi0gICAgICAgICAgICBmb3IgZXhwck4gaW4gc2VxdWVuY2VOOgotICAgICAgICAgICAgICAgICBpZiBub3QgKGNvbmRpdGlvbk4pOgotICAgICAgICAgICAgICAgICAgICAgY29udGludWUgICAjIFNraXAgdGhpcyBlbGVtZW50Ci0KLSAgICAgICAgICAgICAgICAgIyBPdXRwdXQgdGhlIHZhbHVlIG9mIAotICAgICAgICAgICAgICAgICAjIHRoZSBleHByZXNzaW9uLgotCi1UaGlzIG1lYW5zIHRoYXQgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgYGBmb3IuLi5pbmBgIGNsYXVzZXMgYnV0IG5vCi1gYGlmYGAgY2xhdXNlcywgdGhlIGxlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIG91dHB1dCB3aWxsIGJlIGVxdWFsIHRvCi10aGUgcHJvZHVjdCBvZiB0aGUgbGVuZ3RocyBvZiBhbGwgdGhlIHNlcXVlbmNlcy4gIElmIHlvdSBoYXZlIHR3bwotbGlzdHMgb2YgbGVuZ3RoIDMsIHRoZSBvdXRwdXQgbGlzdCBpcyA5IGVsZW1lbnRzIGxvbmc6OgotCi0gICAgc2VxMSA9ICdhYmMnCi0gICAgc2VxMiA9ICgxLDIsMykKLSAgICA+Pj4gWyAoeCx5KSBmb3IgeCBpbiBzZXExIGZvciB5IGluIHNlcTJdCi0gICAgWygnYScsIDEpLCAoJ2EnLCAyKSwgKCdhJywgMyksIAotICAgICAoJ2InLCAxKSwgKCdiJywgMiksICgnYicsIDMpLCAKLSAgICAgKCdjJywgMSksICgnYycsIDIpLCAoJ2MnLCAzKV0KLQotVG8gYXZvaWQgaW50cm9kdWNpbmcgYW4gYW1iaWd1aXR5IGludG8gUHl0aG9uJ3MgZ3JhbW1hciwgaWYKLWBgZXhwcmVzc2lvbmBgIGlzIGNyZWF0aW5nIGEgdHVwbGUsIGl0IG11c3QgYmUgc3Vycm91bmRlZCB3aXRoCi1wYXJlbnRoZXNlcy4gIFRoZSBmaXJzdCBsaXN0IGNvbXByZWhlbnNpb24gYmVsb3cgaXMgYSBzeW50YXggZXJyb3IsCi13aGlsZSB0aGUgc2Vjb25kIG9uZSBpcyBjb3JyZWN0OjoKLQotICAgICMgU3ludGF4IGVycm9yCi0gICAgWyB4LHkgZm9yIHggaW4gc2VxMSBmb3IgeSBpbiBzZXEyXQotICAgICMgQ29ycmVjdAotICAgIFsgKHgseSkgZm9yIHggaW4gc2VxMSBmb3IgeSBpbiBzZXEyXQotCi0KLUdlbmVyYXRvcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUdlbmVyYXRvcnMgYXJlIGEgc3BlY2lhbCBjbGFzcyBvZiBmdW5jdGlvbnMgdGhhdCBzaW1wbGlmeSB0aGUgdGFzayBvZgotd3JpdGluZyBpdGVyYXRvcnMuICBSZWd1bGFyIGZ1bmN0aW9ucyBjb21wdXRlIGEgdmFsdWUgYW5kIHJldHVybiBpdCwKLWJ1dCBnZW5lcmF0b3JzIHJldHVybiBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgYSBzdHJlYW0gb2YgdmFsdWVzLgotCi1Zb3UncmUgZG91YnRsZXNzIGZhbWlsaWFyIHdpdGggaG93IHJlZ3VsYXIgZnVuY3Rpb24gY2FsbHMgd29yayBpbgotUHl0aG9uIG9yIEMuICBXaGVuIHlvdSBjYWxsIGEgZnVuY3Rpb24sIGl0IGdldHMgYSBwcml2YXRlIG5hbWVzcGFjZQotd2hlcmUgaXRzIGxvY2FsIHZhcmlhYmxlcyBhcmUgY3JlYXRlZC4gIFdoZW4gdGhlIGZ1bmN0aW9uIHJlYWNoZXMgYQotYGByZXR1cm5gYCBzdGF0ZW1lbnQsIHRoZSBsb2NhbCB2YXJpYWJsZXMgYXJlIGRlc3Ryb3llZCBhbmQgdGhlCi12YWx1ZSBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLiAgQSBsYXRlciBjYWxsIHRvIHRoZSBzYW1lIGZ1bmN0aW9uCi1jcmVhdGVzIGEgbmV3IHByaXZhdGUgbmFtZXNwYWNlIGFuZCBhIGZyZXNoIHNldCBvZiBsb2NhbAotdmFyaWFibGVzLiBCdXQsIHdoYXQgaWYgdGhlIGxvY2FsIHZhcmlhYmxlcyB3ZXJlbid0IHRocm93biBhd2F5IG9uCi1leGl0aW5nIGEgZnVuY3Rpb24/ICBXaGF0IGlmIHlvdSBjb3VsZCBsYXRlciByZXN1bWUgdGhlIGZ1bmN0aW9uIHdoZXJlCi1pdCBsZWZ0IG9mZj8gIFRoaXMgaXMgd2hhdCBnZW5lcmF0b3JzIHByb3ZpZGU7IHRoZXkgY2FuIGJlIHRob3VnaHQgb2YKLWFzIHJlc3VtYWJsZSBmdW5jdGlvbnMuCi0KLUhlcmUncyB0aGUgc2ltcGxlc3QgZXhhbXBsZSBvZiBhIGdlbmVyYXRvciBmdW5jdGlvbjo6Ci0KLSAgICBkZWYgZ2VuZXJhdGVfaW50cyhOKToKLSAgICAgICAgZm9yIGkgaW4gcmFuZ2UoTik6Ci0gICAgICAgICAgICB5aWVsZCBpCi0KLUFueSBmdW5jdGlvbiBjb250YWluaW5nIGEgYGB5aWVsZGBgIGtleXdvcmQgaXMgYSBnZW5lcmF0b3IgZnVuY3Rpb247Ci10aGlzIGlzIGRldGVjdGVkIGJ5IFB5dGhvbidzIGJ5dGVjb2RlIGNvbXBpbGVyIHdoaWNoIGNvbXBpbGVzIHRoZQotZnVuY3Rpb24gc3BlY2lhbGx5IGFzIGEgcmVzdWx0LgotCi1XaGVuIHlvdSBjYWxsIGEgZ2VuZXJhdG9yIGZ1bmN0aW9uLCBpdCBkb2Vzbid0IHJldHVybiBhIHNpbmdsZSB2YWx1ZTsKLWluc3RlYWQgaXQgcmV0dXJucyBhIGdlbmVyYXRvciBvYmplY3QgdGhhdCBzdXBwb3J0cyB0aGUgaXRlcmF0b3IKLXByb3RvY29sLiAgT24gZXhlY3V0aW5nIHRoZSBgYHlpZWxkYGAgZXhwcmVzc2lvbiwgdGhlIGdlbmVyYXRvcgotb3V0cHV0cyB0aGUgdmFsdWUgb2YgYGBpYGAsIHNpbWlsYXIgdG8gYSBgYHJldHVybmBgCi1zdGF0ZW1lbnQuICBUaGUgYmlnIGRpZmZlcmVuY2UgYmV0d2VlbiBgYHlpZWxkYGAgYW5kIGEKLWBgcmV0dXJuYGAgc3RhdGVtZW50IGlzIHRoYXQgb24gcmVhY2hpbmcgYSBgYHlpZWxkYGAgdGhlCi1nZW5lcmF0b3IncyBzdGF0ZSBvZiBleGVjdXRpb24gaXMgc3VzcGVuZGVkIGFuZCBsb2NhbCB2YXJpYWJsZXMgYXJlCi1wcmVzZXJ2ZWQuICBPbiB0aGUgbmV4dCBjYWxsIGBgbmV4dChnZW5lcmF0b3IpYGAsCi10aGUgZnVuY3Rpb24gd2lsbCByZXN1bWUgZXhlY3V0aW5nLiAgCi0KLUhlcmUncyBhIHNhbXBsZSB1c2FnZSBvZiB0aGUgYGBnZW5lcmF0ZV9pbnRzKClgYCBnZW5lcmF0b3I6OgotCi0gICAgPj4+IGdlbiA9IGdlbmVyYXRlX2ludHMoMykKLSAgICA+Pj4gZ2VuCi0gICAgPGdlbmVyYXRvciBvYmplY3QgYXQgMHg4MTE3ZjkwPgotICAgID4+PiBuZXh0KGdlbikKLSAgICAwCi0gICAgPj4+IG5leHQoZ2VuKQotICAgIDEKLSAgICA+Pj4gbmV4dChnZW4pCi0gICAgMgotICAgID4+PiBuZXh0KGdlbikKLSAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gICAgICBGaWxlICJzdGRpbiIsIGxpbmUgMSwgaW4gPwotICAgICAgRmlsZSAic3RkaW4iLCBsaW5lIDIsIGluIGdlbmVyYXRlX2ludHMKLSAgICBTdG9wSXRlcmF0aW9uCi0KLVlvdSBjb3VsZCBlcXVhbGx5IHdyaXRlIGBgZm9yIGkgaW4gZ2VuZXJhdGVfaW50cyg1KWBgLCBvcgotYGBhLGIsYyA9IGdlbmVyYXRlX2ludHMoMylgYC4KLQotSW5zaWRlIGEgZ2VuZXJhdG9yIGZ1bmN0aW9uLCB0aGUgYGByZXR1cm5gYCBzdGF0ZW1lbnQgY2FuIG9ubHkgYmUgdXNlZAotd2l0aG91dCBhIHZhbHVlLCBhbmQgc2lnbmFscyB0aGUgZW5kIG9mIHRoZSBwcm9jZXNzaW9uIG9mIHZhbHVlczsKLWFmdGVyIGV4ZWN1dGluZyBhIGBgcmV0dXJuYGAgdGhlIGdlbmVyYXRvciBjYW5ub3QgcmV0dXJuIGFueSBmdXJ0aGVyCi12YWx1ZXMuICBgYHJldHVybmBgIHdpdGggYSB2YWx1ZSwgc3VjaCBhcyBgYHJldHVybiA1YGAsIGlzIGEgc3ludGF4Ci1lcnJvciBpbnNpZGUgYSBnZW5lcmF0b3IgZnVuY3Rpb24uICBUaGUgZW5kIG9mIHRoZSBnZW5lcmF0b3IncyByZXN1bHRzCi1jYW4gYWxzbyBiZSBpbmRpY2F0ZWQgYnkgcmFpc2luZyBgYFN0b3BJdGVyYXRpb25gYCBtYW51YWxseSwgb3IgYnkKLWp1c3QgbGV0dGluZyB0aGUgZmxvdyBvZiBleGVjdXRpb24gZmFsbCBvZmYgdGhlIGJvdHRvbSBvZiB0aGUKLWZ1bmN0aW9uLgotCi1Zb3UgY291bGQgYWNoaWV2ZSB0aGUgZWZmZWN0IG9mIGdlbmVyYXRvcnMgbWFudWFsbHkgYnkgd3JpdGluZyB5b3VyCi1vd24gY2xhc3MgYW5kIHN0b3JpbmcgYWxsIHRoZSBsb2NhbCB2YXJpYWJsZXMgb2YgdGhlIGdlbmVyYXRvciBhcwotaW5zdGFuY2UgdmFyaWFibGVzLiAgRm9yIGV4YW1wbGUsIHJldHVybmluZyBhIGxpc3Qgb2YgaW50ZWdlcnMgY291bGQKLWJlIGRvbmUgYnkgc2V0dGluZyBgYHNlbGYuY291bnRgYCB0byAwLCBhbmQgaGF2aW5nIHRoZQotYGBfX25leHRfXygpYGAgbWV0aG9kIGluY3JlbWVudCBgYHNlbGYuY291bnRgYCBhbmQgcmV0dXJuIGl0LgotSG93ZXZlciwgZm9yIGEgbW9kZXJhdGVseSBjb21wbGljYXRlZCBnZW5lcmF0b3IsIHdyaXRpbmcgYQotY29ycmVzcG9uZGluZyBjbGFzcyBjYW4gYmUgbXVjaCBtZXNzaWVyLgotCi1UaGUgdGVzdCBzdWl0ZSBpbmNsdWRlZCB3aXRoIFB5dGhvbidzIGxpYnJhcnksIGBgdGVzdF9nZW5lcmF0b3JzLnB5YGAsCi1jb250YWlucyBhIG51bWJlciBvZiBtb3JlIGludGVyZXN0aW5nIGV4YW1wbGVzLiAgSGVyZSdzIG9uZSBnZW5lcmF0b3IKLXRoYXQgaW1wbGVtZW50cyBhbiBpbi1vcmRlciB0cmF2ZXJzYWwgb2YgYSB0cmVlIHVzaW5nIGdlbmVyYXRvcnMKLXJlY3Vyc2l2ZWx5LgotCi06OgotCi0gICAgIyBBIHJlY3Vyc2l2ZSBnZW5lcmF0b3IgdGhhdCBnZW5lcmF0ZXMgVHJlZSBsZWF2ZXMgaW4gaW4tb3JkZXIuCi0gICAgZGVmIGlub3JkZXIodCk6Ci0gICAgICAgIGlmIHQ6Ci0gICAgICAgICAgICBmb3IgeCBpbiBpbm9yZGVyKHQubGVmdCk6Ci0gICAgICAgICAgICAgICAgeWllbGQgeAotCi0gICAgICAgICAgICB5aWVsZCB0LmxhYmVsCi0KLSAgICAgICAgICAgIGZvciB4IGluIGlub3JkZXIodC5yaWdodCk6Ci0gICAgICAgICAgICAgICAgeWllbGQgeAotCi1Ud28gb3RoZXIgZXhhbXBsZXMgaW4gYGB0ZXN0X2dlbmVyYXRvcnMucHlgYCBwcm9kdWNlCi1zb2x1dGlvbnMgZm9yIHRoZSBOLVF1ZWVucyBwcm9ibGVtIChwbGFjaW5nIE4gcXVlZW5zIG9uIGFuIE54TgotY2hlc3MgYm9hcmQgc28gdGhhdCBubyBxdWVlbiB0aHJlYXRlbnMgYW5vdGhlcikgYW5kIHRoZSBLbmlnaHQncyBUb3VyCi0oZmluZGluZyBhIHJvdXRlIHRoYXQgdGFrZXMgYSBrbmlnaHQgdG8gZXZlcnkgc3F1YXJlIG9mIGFuIE54TiBjaGVzc2JvYXJkCi13aXRob3V0IHZpc2l0aW5nIGFueSBzcXVhcmUgdHdpY2UpLgotCi0KLQotUGFzc2luZyB2YWx1ZXMgaW50byBhIGdlbmVyYXRvcgotJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJwotCi1JbiBQeXRob24gMi40IGFuZCBlYXJsaWVyLCBnZW5lcmF0b3JzIG9ubHkgcHJvZHVjZWQgb3V0cHV0LiAgT25jZSBhCi1nZW5lcmF0b3IncyBjb2RlIHdhcyBpbnZva2VkIHRvIGNyZWF0ZSBhbiBpdGVyYXRvciwgdGhlcmUgd2FzIG5vIHdheSB0bwotcGFzcyBhbnkgbmV3IGluZm9ybWF0aW9uIGludG8gdGhlIGZ1bmN0aW9uIHdoZW4gaXRzIGV4ZWN1dGlvbiBpcwotcmVzdW1lZC4gIFlvdSBjb3VsZCBoYWNrIHRvZ2V0aGVyIHRoaXMgYWJpbGl0eSBieSBtYWtpbmcgdGhlCi1nZW5lcmF0b3IgbG9vayBhdCBhIGdsb2JhbCB2YXJpYWJsZSBvciBieSBwYXNzaW5nIGluIHNvbWUgbXV0YWJsZSBvYmplY3QKLXRoYXQgY2FsbGVycyB0aGVuIG1vZGlmeSwgYnV0IHRoZXNlIGFwcHJvYWNoZXMgYXJlIG1lc3N5LgotCi1JbiBQeXRob24gMi41IHRoZXJlJ3MgYSBzaW1wbGUgd2F5IHRvIHBhc3MgdmFsdWVzIGludG8gYSBnZW5lcmF0b3IuCi1gYHlpZWxkYGAgYmVjYW1lIGFuIGV4cHJlc3Npb24sIHJldHVybmluZyBhIHZhbHVlIHRoYXQgY2FuIGJlIGFzc2lnbmVkCi10byBhIHZhcmlhYmxlIG9yIG90aGVyd2lzZSBvcGVyYXRlZCBvbjo6Ci0KLSAgICB2YWwgPSAoeWllbGQgaSkKLQotSSByZWNvbW1lbmQgdGhhdCB5b3UgKiphbHdheXMqKiBwdXQgcGFyZW50aGVzZXMgYXJvdW5kIGEgYGB5aWVsZGBgCi1leHByZXNzaW9uIHdoZW4geW91J3JlIGRvaW5nIHNvbWV0aGluZyB3aXRoIHRoZSByZXR1cm5lZCB2YWx1ZSwgYXMgaW4KLXRoZSBhYm92ZSBleGFtcGxlLiAgVGhlIHBhcmVudGhlc2VzIGFyZW4ndCBhbHdheXMgbmVjZXNzYXJ5LCBidXQgaXQncwotZWFzaWVyIHRvIGFsd2F5cyBhZGQgdGhlbSBpbnN0ZWFkIG9mIGhhdmluZyB0byByZW1lbWJlciB3aGVuIHRoZXkncmUKLW5lZWRlZC4KLQotKFBFUCAzNDIgZXhwbGFpbnMgdGhlIGV4YWN0IHJ1bGVzLCB3aGljaCBhcmUgdGhhdCBhCi1gYHlpZWxkYGAtZXhwcmVzc2lvbiBtdXN0IGFsd2F5cyBiZSBwYXJlbnRoZXNpemVkIGV4Y2VwdCB3aGVuIGl0Ci1vY2N1cnMgYXQgdGhlIHRvcC1sZXZlbCBleHByZXNzaW9uIG9uIHRoZSByaWdodC1oYW5kIHNpZGUgb2YgYW4KLWFzc2lnbm1lbnQuICBUaGlzIG1lYW5zIHlvdSBjYW4gd3JpdGUgYGB2YWwgPSB5aWVsZCBpYGAgYnV0IGhhdmUgdG8KLXVzZSBwYXJlbnRoZXNlcyB3aGVuIHRoZXJlJ3MgYW4gb3BlcmF0aW9uLCBhcyBpbiBgYHZhbCA9ICh5aWVsZCBpKQotKyAxMmBgLikKLQotVmFsdWVzIGFyZSBzZW50IGludG8gYSBnZW5lcmF0b3IgYnkgY2FsbGluZyBpdHMKLWBgc2VuZCh2YWx1ZSlgYCBtZXRob2QuICBUaGlzIG1ldGhvZCByZXN1bWVzIHRoZSAKLWdlbmVyYXRvcidzIGNvZGUgYW5kIHRoZSBgYHlpZWxkYGAgZXhwcmVzc2lvbiByZXR1cm5zIHRoZSBzcGVjaWZpZWQKLXZhbHVlLiAgSWYgdGhlIHJlZ3VsYXIgYGBfX25leHRfXygpYGAgbWV0aG9kIGlzIGNhbGxlZCwgdGhlCi1gYHlpZWxkYGAgcmV0dXJucyBgYE5vbmVgYC4KLQotSGVyZSdzIGEgc2ltcGxlIGNvdW50ZXIgdGhhdCBpbmNyZW1lbnRzIGJ5IDEgYW5kIGFsbG93cyBjaGFuZ2luZyB0aGUKLXZhbHVlIG9mIHRoZSBpbnRlcm5hbCBjb3VudGVyLgotCi06OgotCi0gICAgZGVmIGNvdW50ZXIgKG1heGltdW0pOgotICAgICAgICBpID0gMAotICAgICAgICB3aGlsZSBpIDwgbWF4aW11bToKLSAgICAgICAgICAgIHZhbCA9ICh5aWVsZCBpKQotICAgICAgICAgICAgIyBJZiB2YWx1ZSBwcm92aWRlZCwgY2hhbmdlIGNvdW50ZXIKLSAgICAgICAgICAgIGlmIHZhbCBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICBpID0gdmFsCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGkgKz0gMQotCi1BbmQgaGVyZSdzIGFuIGV4YW1wbGUgb2YgY2hhbmdpbmcgdGhlIGNvdW50ZXI6Ci0KLSAgICA+Pj4gaXQgPSBjb3VudGVyKDEwKQotICAgID4+PiBwcmludCBuZXh0KGl0KQotICAgIDAKLSAgICA+Pj4gcHJpbnQgbmV4dChpdCkKLSAgICAxCi0gICAgPj4+IHByaW50IGl0LnNlbmQoOCkKLSAgICA4Ci0gICAgPj4+IHByaW50IG5leHQoaXQpCi0gICAgOQotICAgID4+PiBwcmludCBuZXh0KGl0KQotICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLSAgICAgIEZpbGUgYGB0LnB5JycsIGxpbmUgMTUsIGluID8KLSAgICAgICAgcHJpbnQgbmV4dChpdCkKLSAgICBTdG9wSXRlcmF0aW9uCi0KLUJlY2F1c2UgYGB5aWVsZGBgIHdpbGwgb2Z0ZW4gYmUgcmV0dXJuaW5nIGBgTm9uZWBgLCB5b3UKLXNob3VsZCBhbHdheXMgY2hlY2sgZm9yIHRoaXMgY2FzZS4gIERvbid0IGp1c3QgdXNlIGl0cyB2YWx1ZSBpbgotZXhwcmVzc2lvbnMgdW5sZXNzIHlvdSdyZSBzdXJlIHRoYXQgdGhlIGBgc2VuZCgpYGAgbWV0aG9kCi13aWxsIGJlIHRoZSBvbmx5IG1ldGhvZCB1c2VkIHJlc3VtZSB5b3VyIGdlbmVyYXRvciBmdW5jdGlvbi4KLQotSW4gYWRkaXRpb24gdG8gYGBzZW5kKClgYCwgdGhlcmUgYXJlIHR3byBvdGhlciBuZXcgbWV0aG9kcyBvbgotZ2VuZXJhdG9yczoKLQotKiBgYHRocm93KHR5cGUsIHZhbHVlPU5vbmUsIHRyYWNlYmFjaz1Ob25lKWBgIGlzIHVzZWQgdG8gcmFpc2UgYW4gZXhjZXB0aW9uIGluc2lkZSB0aGUKLSAgZ2VuZXJhdG9yOyB0aGUgZXhjZXB0aW9uIGlzIHJhaXNlZCBieSB0aGUgYGB5aWVsZGBgIGV4cHJlc3Npb24KLSAgd2hlcmUgdGhlIGdlbmVyYXRvcidzIGV4ZWN1dGlvbiBpcyBwYXVzZWQuCi0KLSogYGBjbG9zZSgpYGAgcmFpc2VzIGEgYGBHZW5lcmF0b3JFeGl0YGAKLSAgZXhjZXB0aW9uIGluc2lkZSB0aGUgZ2VuZXJhdG9yIHRvIHRlcm1pbmF0ZSB0aGUgaXRlcmF0aW9uLiAgCi0gIE9uIHJlY2VpdmluZyB0aGlzCi0gIGV4Y2VwdGlvbiwgdGhlIGdlbmVyYXRvcidzIGNvZGUgbXVzdCBlaXRoZXIgcmFpc2UKLSAgYGBHZW5lcmF0b3JFeGl0YGAgb3IgYGBTdG9wSXRlcmF0aW9uYGA7IGNhdGNoaW5nIHRoZSAKLSAgZXhjZXB0aW9uIGFuZCBkb2luZyBhbnl0aGluZyBlbHNlIGlzIGlsbGVnYWwgYW5kIHdpbGwgdHJpZ2dlcgotICBhIGBgUnVudGltZUVycm9yYGAuICBgYGNsb3NlKClgYCB3aWxsIGFsc28gYmUgY2FsbGVkIGJ5IAotICBQeXRob24ncyBnYXJiYWdlIGNvbGxlY3RvciB3aGVuIHRoZSBnZW5lcmF0b3IgaXMgZ2FyYmFnZS1jb2xsZWN0ZWQuCi0KLSAgSWYgeW91IG5lZWQgdG8gcnVuIGNsZWFudXAgY29kZSB3aGVuIGEgYGBHZW5lcmF0b3JFeGl0YGAgb2NjdXJzLAotICBJIHN1Z2dlc3QgdXNpbmcgYSBgYHRyeTogLi4uIGZpbmFsbHk6YGAgc3VpdGUgaW5zdGVhZCBvZiAKLSAgY2F0Y2hpbmcgYGBHZW5lcmF0b3JFeGl0YGAuCi0KLVRoZSBjdW11bGF0aXZlIGVmZmVjdCBvZiB0aGVzZSBjaGFuZ2VzIGlzIHRvIHR1cm4gZ2VuZXJhdG9ycyBmcm9tCi1vbmUtd2F5IHByb2R1Y2VycyBvZiBpbmZvcm1hdGlvbiBpbnRvIGJvdGggcHJvZHVjZXJzIGFuZCBjb25zdW1lcnMuCi0KLUdlbmVyYXRvcnMgYWxzbyBiZWNvbWUgKipjb3JvdXRpbmVzKiosIGEgbW9yZSBnZW5lcmFsaXplZCBmb3JtIG9mCi1zdWJyb3V0aW5lcy4gIFN1YnJvdXRpbmVzIGFyZSBlbnRlcmVkIGF0IG9uZSBwb2ludCBhbmQgZXhpdGVkIGF0Ci1hbm90aGVyIHBvaW50ICh0aGUgdG9wIG9mIHRoZSBmdW5jdGlvbiwgYW5kIGEgYGByZXR1cm5gYAotc3RhdGVtZW50KSwgYnV0IGNvcm91dGluZXMgY2FuIGJlIGVudGVyZWQsIGV4aXRlZCwgYW5kIHJlc3VtZWQgYXQKLW1hbnkgZGlmZmVyZW50IHBvaW50cyAodGhlIGBgeWllbGRgYCBzdGF0ZW1lbnRzKS4gIAotCi0KLUJ1aWx0LWluIGZ1bmN0aW9ucwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1MZXQncyBsb29rIGluIG1vcmUgZGV0YWlsIGF0IGJ1aWx0LWluIGZ1bmN0aW9ucyBvZnRlbiB1c2VkIHdpdGggaXRlcmF0b3JzLgotCi1Ud28gUHl0aG9uJ3MgYnVpbHQtaW4gZnVuY3Rpb25zLCBgYG1hcCgpYGAgYW5kIGBgZmlsdGVyKClgYCwgYXJlCi1zb21ld2hhdCBvYnNvbGV0ZTsgdGhleSBkdXBsaWNhdGUgdGhlIGZlYXR1cmVzIG9mIGxpc3QgY29tcHJlaGVuc2lvbnMKLWJ1dCByZXR1cm4gYWN0dWFsIGxpc3RzIGluc3RlYWQgb2YgaXRlcmF0b3JzLiAgCi0KLWBgbWFwKGYsIGl0ZXJBLCBpdGVyQiwgLi4uKWBgIHJldHVybnMgYSBsaXN0IGNvbnRhaW5pbmcgYGBmKGl0ZXJBWzBdLAotaXRlckJbMF0pLCBmKGl0ZXJBWzFdLCBpdGVyQlsxXSksIGYoaXRlckFbMl0sIGl0ZXJCWzJdKSwgLi4uYGAuICAKLQotOjoKLQotICAgIGRlZiB1cHBlcihzKToKLSAgICAgICAgcmV0dXJuIHMudXBwZXIoKQotICAgIG1hcCh1cHBlciwgWydzZW50ZW5jZScsICdmcmFnbWVudCddKSA9PgotICAgICAgWydTRU5URU5DRScsICdGUkFHTUVOVCddCi0KLSAgICBbdXBwZXIocykgZm9yIHMgaW4gWydzZW50ZW5jZScsICdmcmFnbWVudCddXSA9PgotICAgICAgWydTRU5URU5DRScsICdGUkFHTUVOVCddCi0KLUFzIHNob3duIGFib3ZlLCB5b3UgY2FuIGFjaGlldmUgdGhlIHNhbWUgZWZmZWN0IHdpdGggYSBsaXN0Ci1jb21wcmVoZW5zaW9uLiAgVGhlIGBgaXRlcnRvb2xzLmltYXAoKWBgIGZ1bmN0aW9uIGRvZXMgdGhlIHNhbWUgdGhpbmcKLWJ1dCBjYW4gaGFuZGxlIGluZmluaXRlIGl0ZXJhdG9yczsgaXQnbGwgYmUgZGlzY3Vzc2VkIGxhdGVyLCBpbiB0aGUgc2VjdGlvbiBvbiAKLXRoZSBgYGl0ZXJ0b29sc2BgIG1vZHVsZS4KLQotYGBmaWx0ZXIocHJlZGljYXRlLCBpdGVyKWBgIHJldHVybnMgYSBsaXN0IAotdGhhdCBjb250YWlucyBhbGwgdGhlIHNlcXVlbmNlIGVsZW1lbnRzIHRoYXQgbWVldCBhIGNlcnRhaW4gY29uZGl0aW9uLAotYW5kIGlzIHNpbWlsYXJseSBkdXBsaWNhdGVkIGJ5IGxpc3QgY29tcHJlaGVuc2lvbnMuCi1BICoqcHJlZGljYXRlKiogaXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHRydXRoIHZhbHVlIG9mCi1zb21lIGNvbmRpdGlvbjsgZm9yIHVzZSB3aXRoIGBgZmlsdGVyKClgYCwgdGhlIHByZWRpY2F0ZSBtdXN0IHRha2UgYSAKLXNpbmdsZSB2YWx1ZS4gIAotCi06OgotCi0gICAgZGVmIGlzX2V2ZW4oeCk6Ci0gICAgICAgIHJldHVybiAoeCAlIDIpID09IDAKLQotICAgIGZpbHRlcihpc19ldmVuLCByYW5nZSgxMCkpID0+Ci0gICAgICBbMCwgMiwgNCwgNiwgOF0KLQotVGhpcyBjYW4gYWxzbyBiZSB3cml0dGVuIGFzIGEgbGlzdCBjb21wcmVoZW5zaW9uOjoKLQotICAgID4+PiBbeCBmb3IgeCBpbiByYW5nZSgxMCkgaWYgaXNfZXZlbih4KV0KLSAgICBbMCwgMiwgNCwgNiwgOF0KLQotYGBmaWx0ZXIoKWBgIGFsc28gaGFzIGEgY291bnRlcnBhcnQgaW4gdGhlIGBgaXRlcnRvb2xzYGAgbW9kdWxlLAotYGBpdGVydG9vbHMuaWZpbHRlcigpYGAsIHRoYXQgcmV0dXJucyBhbiBpdGVyYXRvciBhbmQgCi1jYW4gdGhlcmVmb3JlIGhhbmRsZSBpbmZpbml0ZSBzZXF1ZW5jZXMganVzdCBhcyBgYGl0ZXJ0b29scy5pbWFwKClgYCBjYW4uCi0KLWBgcmVkdWNlKGZ1bmMsIGl0ZXIsIFtpbml0aWFsX3ZhbHVlXSlgYCBkb2Vzbid0IGhhdmUgYSBjb3VudGVycGFydCBpbgotdGhlIGBgaXRlcnRvb2xzYGAgbW9kdWxlIGJlY2F1c2UgaXQgY3VtdWxhdGl2ZWx5IHBlcmZvcm1zIGFuIG9wZXJhdGlvbgotb24gYWxsIHRoZSBpdGVyYWJsZSdzIGVsZW1lbnRzIGFuZCB0aGVyZWZvcmUgY2FuJ3QgYmUgYXBwbGllZCB0bwotaW5maW5pdGUgaXRlcmFibGVzLiAgYGBmdW5jYGAgbXVzdCBiZSBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgdHdvIGVsZW1lbnRzCi1hbmQgcmV0dXJucyBhIHNpbmdsZSB2YWx1ZS4gIGBgcmVkdWNlKClgYCB0YWtlcyB0aGUgZmlyc3QgdHdvIGVsZW1lbnRzCi1BIGFuZCBCIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvciBhbmQgY2FsY3VsYXRlcyBgYGZ1bmMoQSwgQilgYC4gIEl0Ci10aGVuIHJlcXVlc3RzIHRoZSB0aGlyZCBlbGVtZW50LCBDLCBjYWxjdWxhdGVzIGBgZnVuYyhmdW5jKEEsIEIpLAotQylgYCwgY29tYmluZXMgdGhpcyByZXN1bHQgd2l0aCB0aGUgZm91cnRoIGVsZW1lbnQgcmV0dXJuZWQsIGFuZAotY29udGludWVzIHVudGlsIHRoZSBpdGVyYWJsZSBpcyBleGhhdXN0ZWQuICBJZiB0aGUgaXRlcmFibGUgcmV0dXJucyBubwotdmFsdWVzIGF0IGFsbCwgYSBgYFR5cGVFcnJvcmBgIGV4Y2VwdGlvbiBpcyByYWlzZWQuICBJZiB0aGUgaW5pdGlhbAotdmFsdWUgaXMgc3VwcGxpZWQsIGl0J3MgdXNlZCBhcyBhIHN0YXJ0aW5nIHBvaW50IGFuZAotYGBmdW5jKGluaXRpYWxfdmFsdWUsIEEpYGAgaXMgdGhlIGZpcnN0IGNhbGN1bGF0aW9uLgotCi06OgotCi0gICAgaW1wb3J0IG9wZXJhdG9yCi0gICAgcmVkdWNlKG9wZXJhdG9yLmNvbmNhdCwgWydBJywgJ0JCJywgJ0MnXSkgPT4KLSAgICAgICdBQkJDJwotICAgIHJlZHVjZShvcGVyYXRvci5jb25jYXQsIFtdKSA9PgotICAgICAgVHlwZUVycm9yOiByZWR1Y2UoKSBvZiBlbXB0eSBzZXF1ZW5jZSB3aXRoIG5vIGluaXRpYWwgdmFsdWUKLSAgICByZWR1Y2Uob3BlcmF0b3IubXVsLCBbMSwyLDNdLCAxKSA9PgotICAgICAgNgotICAgIHJlZHVjZShvcGVyYXRvci5tdWwsIFtdLCAxKSA9PgotICAgICAgMQotCi1JZiB5b3UgdXNlIGBgb3BlcmF0b3IuYWRkYGAgd2l0aCBgYHJlZHVjZSgpYGAsIHlvdSdsbCBhZGQgdXAgYWxsIHRoZSAKLWVsZW1lbnRzIG9mIHRoZSBpdGVyYWJsZS4gIFRoaXMgY2FzZSBpcyBzbyBjb21tb24gdGhhdCB0aGVyZSdzIGEgc3BlY2lhbAotYnVpbHQtaW4gY2FsbGVkIGBgc3VtKClgYCB0byBjb21wdXRlIGl0OjoKLQotICAgIHJlZHVjZShvcGVyYXRvci5hZGQsIFsxLDIsMyw0XSwgMCkgPT4KLSAgICAgIDEwCi0gICAgc3VtKFsxLDIsMyw0XSkgPT4KLSAgICAgIDEwCi0gICAgc3VtKFtdKSA9PgotICAgICAgMAotCi1Gb3IgbWFueSB1c2VzIG9mIGBgcmVkdWNlKClgYCwgdGhvdWdoLCBpdCBjYW4gYmUgY2xlYXJlciB0byBqdXN0IHdyaXRlCi10aGUgb2J2aW91cyBgYGZvcmBgIGxvb3A6OgotCi0gICAgIyBJbnN0ZWFkIG9mOgotICAgIHByb2R1Y3QgPSByZWR1Y2Uob3BlcmF0b3IubXVsLCBbMSwyLDNdLCAxKQotCi0gICAgIyBZb3UgY2FuIHdyaXRlOgotICAgIHByb2R1Y3QgPSAxCi0gICAgZm9yIGkgaW4gWzEsMiwzXToKLSAgICAgICAgcHJvZHVjdCAqPSBpCi0KLQotYGBlbnVtZXJhdGUoaXRlcilgYCBjb3VudHMgb2ZmIHRoZSBlbGVtZW50cyBpbiB0aGUgaXRlcmFibGUsIHJldHVybmluZwotMi10dXBsZXMgY29udGFpbmluZyB0aGUgY291bnQgYW5kIGVhY2ggZWxlbWVudC4KLQotOjoKLQotICAgIGVudW1lcmF0ZShbJ3N1YmplY3QnLCAndmVyYicsICdvYmplY3QnXSkgPT4KLSAgICAgICgwLCAnc3ViamVjdCcpLCAoMSwgJ3ZlcmInKSwgKDIsICdvYmplY3QnKQotCi1gYGVudW1lcmF0ZSgpYGAgaXMgb2Z0ZW4gdXNlZCB3aGVuIGxvb3BpbmcgdGhyb3VnaCBhIGxpc3QgCi1hbmQgcmVjb3JkaW5nIHRoZSBpbmRleGVzIGF0IHdoaWNoIGNlcnRhaW4gY29uZGl0aW9ucyBhcmUgbWV0OjoKLQotICAgIGYgPSBvcGVuKCdkYXRhLnR4dCcsICdyJykKLSAgICBmb3IgaSwgbGluZSBpbiBlbnVtZXJhdGUoZik6Ci0gICAgICAgIGlmIGxpbmUuc3RyaXAoKSA9PSAnJzoKLSAgICAgICAgICAgIHByaW50ICdCbGFuayBsaW5lIGF0IGxpbmUgIyVpJyAlIGkKLQotYGBzb3J0ZWQoaXRlcmFibGUsIFtjbXA9Tm9uZV0sIFtrZXk9Tm9uZV0sIFtyZXZlcnNlPUZhbHNlKWBgIAotY29sbGVjdHMgYWxsIHRoZSBlbGVtZW50cyBvZiB0aGUgaXRlcmFibGUgaW50byBhIGxpc3QsIHNvcnRzIAotdGhlIGxpc3QsIGFuZCByZXR1cm5zIHRoZSBzb3J0ZWQgcmVzdWx0LiAgVGhlIGBgY21wYGAsIGBga2V5YGAsIAotYW5kIGBgcmV2ZXJzZWBgIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRocm91Z2ggdG8gdGhlIAotY29uc3RydWN0ZWQgbGlzdCdzIGBgLnNvcnQoKWBgIG1ldGhvZC4KLQotOjoKLQotICAgIGltcG9ydCByYW5kb20KLSAgICAjIEdlbmVyYXRlIDggcmFuZG9tIG51bWJlcnMgYmV0d2VlbiBbMCwgMTAwMDApCi0gICAgcmFuZF9saXN0ID0gcmFuZG9tLnNhbXBsZShyYW5nZSgxMDAwMCksIDgpCi0gICAgcmFuZF9saXN0ID0+Ci0gICAgICBbNzY5LCA3OTUzLCA5ODI4LCA2NDMxLCA4NDQyLCA5ODc4LCA2MjEzLCAyMjA3XQotICAgIHNvcnRlZChyYW5kX2xpc3QpID0+Ci0gICAgICBbNzY5LCAyMjA3LCA2MjEzLCA2NDMxLCA3OTUzLCA4NDQyLCA5ODI4LCA5ODc4XQotICAgIHNvcnRlZChyYW5kX2xpc3QsIHJldmVyc2U9VHJ1ZSkgPT4KLSAgICAgIFs5ODc4LCA5ODI4LCA4NDQyLCA3OTUzLCA2NDMxLCA2MjEzLCAyMjA3LCA3NjldCi0KLShGb3IgYSBtb3JlIGRldGFpbGVkIGRpc2N1c3Npb24gb2Ygc29ydGluZywgc2VlIHRoZSBTb3J0aW5nIG1pbmktSE9XVE8KLWluIHRoZSBQeXRob24gd2lraSBhdCBodHRwOi8vd2lraS5weXRob24ub3JnL21vaW4vSG93VG8vU29ydGluZy4pCi0KLVRoZSBgYGFueShpdGVyKWBgIGFuZCBgYGFsbChpdGVyKWBgIGJ1aWx0LWlucyBsb29rIGF0IAotdGhlIHRydXRoIHZhbHVlcyBvZiBhbiBpdGVyYWJsZSdzIGNvbnRlbnRzLiAgYGBhbnkoKWBgIHJldHVybnMgCi1UcnVlIGlmIGFueSBlbGVtZW50IGluIHRoZSBpdGVyYWJsZSBpcyBhIHRydWUgdmFsdWUsIGFuZCBgYGFsbCgpYGAgCi1yZXR1cm5zIFRydWUgaWYgYWxsIG9mIHRoZSBlbGVtZW50cyBhcmUgdHJ1ZSB2YWx1ZXM6OgotCi0gICAgYW55KFswLDEsMF0pID0+Ci0gICAgICBUcnVlCi0gICAgYW55KFswLDAsMF0pID0+Ci0gICAgICBGYWxzZQotICAgIGFueShbMSwxLDFdKSA9PgotICAgICAgVHJ1ZQotICAgIGFsbChbMCwxLDBdKSA9PgotICAgICAgRmFsc2UKLSAgICBhbGwoWzAsMCwwXSkgPT4gCi0gICAgICBGYWxzZQotICAgIGFsbChbMSwxLDFdKSA9PgotICAgICAgVHJ1ZQotCi0KLVNtYWxsIGZ1bmN0aW9ucyBhbmQgdGhlIGxhbWJkYSBzdGF0ZW1lbnQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotV2hlbiB3cml0aW5nIGZ1bmN0aW9uYWwtc3R5bGUgcHJvZ3JhbXMsIHlvdSdsbCBvZnRlbiBuZWVkIGxpdHRsZQotZnVuY3Rpb25zIHRoYXQgYWN0IGFzIHByZWRpY2F0ZXMgb3IgdGhhdCBjb21iaW5lIGVsZW1lbnRzIGluIHNvbWUgd2F5LgotCi1JZiB0aGVyZSdzIGEgUHl0aG9uIGJ1aWx0LWluIG9yIGEgbW9kdWxlIGZ1bmN0aW9uIHRoYXQncyBzdWl0YWJsZSwgeW91Ci1kb24ndCBuZWVkIHRvIGRlZmluZSBhIG5ldyBmdW5jdGlvbiBhdCBhbGw6OgotCi0gICAgICAgIHN0cmlwcGVkX2xpbmVzID0gW2xpbmUuc3RyaXAoKSBmb3IgbGluZSBpbiBsaW5lc10KLSAgICAgICAgZXhpc3RpbmdfZmlsZXMgPSBmaWx0ZXIob3MucGF0aC5leGlzdHMsIGZpbGVfbGlzdCkKLQotSWYgdGhlIGZ1bmN0aW9uIHlvdSBuZWVkIGRvZXNuJ3QgZXhpc3QsIHlvdSBuZWVkIHRvIHdyaXRlIGl0LiAgT25lIHdheQotdG8gd3JpdGUgc21hbGwgZnVuY3Rpb25zIGlzIHRvIHVzZSB0aGUgYGBsYW1iZGFgYCBzdGF0ZW1lbnQuICBgYGxhbWJkYWBgCi10YWtlcyBhIG51bWJlciBvZiBwYXJhbWV0ZXJzIGFuZCBhbiBleHByZXNzaW9uIGNvbWJpbmluZyB0aGVzZSBwYXJhbWV0ZXJzLAotYW5kIGNyZWF0ZXMgYSBzbWFsbCBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uOjoKLQotICAgICAgICBsb3dlcmNhc2UgPSBsYW1iZGEgeDogeC5sb3dlcigpCi0KLSAgICAgICAgcHJpbnRfYXNzaWduID0gbGFtYmRhIG5hbWUsIHZhbHVlOiBuYW1lICsgJz0nICsgc3RyKHZhbHVlKQotCi0gICAgICAgIGFkZGVyID0gbGFtYmRhIHgsIHk6IHgreQotCi1BbiBhbHRlcm5hdGl2ZSBpcyB0byBqdXN0IHVzZSB0aGUgYGBkZWZgYCBzdGF0ZW1lbnQgYW5kIGRlZmluZSBhCi1mdW5jdGlvbiBpbiB0aGUgdXN1YWwgd2F5OjoKLQotICAgICAgICBkZWYgbG93ZXJjYXNlKHgpOgotICAgICAgICAgICAgcmV0dXJuIHgubG93ZXIoKQotCi0gICAgICAgIGRlZiBwcmludF9hc3NpZ24obmFtZSwgdmFsdWUpOgotICAgICAgICAgICAgcmV0dXJuIG5hbWUgKyAnPScgKyBzdHIodmFsdWUpCi0KLSAgICAgICAgZGVmIGFkZGVyKHgseSk6Ci0gICAgICAgICAgICByZXR1cm4geCArIHkKLQotV2hpY2ggYWx0ZXJuYXRpdmUgaXMgcHJlZmVyYWJsZT8gIFRoYXQncyBhIHN0eWxlIHF1ZXN0aW9uOyBteSB1c3VhbAotY291cnNlIGlzIHRvIGF2b2lkIHVzaW5nIGBgbGFtYmRhYGAuCi0KLU9uZSByZWFzb24gZm9yIG15IHByZWZlcmVuY2UgaXMgdGhhdCBgYGxhbWJkYWBgIGlzIHF1aXRlIGxpbWl0ZWQgaW4KLXRoZSBmdW5jdGlvbnMgaXQgY2FuIGRlZmluZS4gIFRoZSByZXN1bHQgaGFzIHRvIGJlIGNvbXB1dGFibGUgYXMgYQotc2luZ2xlIGV4cHJlc3Npb24sIHdoaWNoIG1lYW5zIHlvdSBjYW4ndCBoYXZlIG11bHRpd2F5Ci1gYGlmLi4uIGVsaWYuLi4gZWxzZWBgIGNvbXBhcmlzb25zIG9yIGBgdHJ5Li4uIGV4Y2VwdGBgIHN0YXRlbWVudHMuCi1JZiB5b3UgdHJ5IHRvIGRvIHRvbyBtdWNoIGluIGEgYGBsYW1iZGFgYCBzdGF0ZW1lbnQsIHlvdSdsbCBlbmQgdXAKLXdpdGggYW4gb3Zlcmx5IGNvbXBsaWNhdGVkIGV4cHJlc3Npb24gdGhhdCdzIGhhcmQgdG8gcmVhZC4gIFF1aWNrLAotd2hhdCdzIHRoZSBmb2xsb3dpbmcgY29kZSBkb2luZz8KLQotOjoKLQotICAgIHRvdGFsID0gcmVkdWNlKGxhbWJkYSBhLCBiOiAoMCwgYVsxXSArIGJbMV0pLCBpdGVtcylbMV0KLQotWW91IGNhbiBmaWd1cmUgaXQgb3V0LCBidXQgaXQgdGFrZXMgdGltZSB0byBkaXNlbnRhbmdsZSB0aGUgZXhwcmVzc2lvbgotdG8gZmlndXJlIG91dCB3aGF0J3MgZ29pbmcgb24uICBVc2luZyBhIHNob3J0IG5lc3RlZAotYGBkZWZgYCBzdGF0ZW1lbnRzIG1ha2VzIHRoaW5ncyBhIGxpdHRsZSBiaXQgYmV0dGVyOjoKLQotICAgIGRlZiBjb21iaW5lIChhLCBiKToKLSAgICAgICAgcmV0dXJuIDAsIGFbMV0gKyBiWzFdCi0KLSAgICB0b3RhbCA9IHJlZHVjZShjb21iaW5lLCBpdGVtcylbMV0KLQotQnV0IGl0IHdvdWxkIGJlIGJlc3Qgb2YgYWxsIGlmIEkgaGFkIHNpbXBseSB1c2VkIGEgYGBmb3JgYCBsb29wOjoKLQotICAgICB0b3RhbCA9IDAKLSAgICAgZm9yIGEsIGIgaW4gaXRlbXM6Ci0gICAgICAgICB0b3RhbCArPSBiCi0KLU9yIHRoZSBgYHN1bSgpYGAgYnVpbHQtaW4gYW5kIGEgZ2VuZXJhdG9yIGV4cHJlc3Npb246OgotCi0gICAgIHRvdGFsID0gc3VtKGIgZm9yIGEsYiBpbiBpdGVtcykKLQotTWFueSB1c2VzIG9mIGBgcmVkdWNlKClgYCBhcmUgY2xlYXJlciB3aGVuIHdyaXR0ZW4gYXMgYGBmb3JgYCBsb29wcy4KLQotRnJlZHJpayBMdW5kaCBvbmNlIHN1Z2dlc3RlZCB0aGUgZm9sbG93aW5nIHNldCBvZiBydWxlcyBmb3IgcmVmYWN0b3JpbmcgCi11c2VzIG9mIGBgbGFtYmRhYGA6Ci0KLTEpIFdyaXRlIGEgbGFtYmRhIGZ1bmN0aW9uLgotMikgV3JpdGUgYSBjb21tZW50IGV4cGxhaW5pbmcgd2hhdCB0aGUgaGVjayB0aGF0IGxhbWJkYSBkb2VzLgotMykgU3R1ZHkgdGhlIGNvbW1lbnQgZm9yIGEgd2hpbGUsIGFuZCB0aGluayBvZiBhIG5hbWUgdGhhdCBjYXB0dXJlcwotICAgdGhlIGVzc2VuY2Ugb2YgdGhlIGNvbW1lbnQuCi00KSBDb252ZXJ0IHRoZSBsYW1iZGEgdG8gYSBkZWYgc3RhdGVtZW50LCB1c2luZyB0aGF0IG5hbWUuCi01KSBSZW1vdmUgdGhlIGNvbW1lbnQuCi0KLUkgcmVhbGx5IGxpa2UgdGhlc2UgcnVsZXMsIGJ1dCB5b3UncmUgZnJlZSB0byBkaXNhZ3JlZSB0aGF0IHRoaXMgCi1sYW1iZGEtZnJlZSBzdHlsZSBpcyBiZXR0ZXIuCi0KLQotVGhlIGl0ZXJ0b29scyBtb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBgYGl0ZXJ0b29sc2BgIG1vZHVsZSBjb250YWlucyBhIG51bWJlciBvZiBjb21tb25seS11c2VkIGl0ZXJhdG9ycwotYXMgd2VsbCBhcyBmdW5jdGlvbnMgZm9yIGNvbWJpbmluZyBzZXZlcmFsIGl0ZXJhdG9ycy4gIFRoaXMgc2VjdGlvbgotd2lsbCBpbnRyb2R1Y2UgdGhlIG1vZHVsZSdzIGNvbnRlbnRzIGJ5IHNob3dpbmcgc21hbGwgZXhhbXBsZXMuCi0KLVRoZSBtb2R1bGUncyBmdW5jdGlvbnMgZmFsbCBpbnRvIGEgZmV3IGJyb2FkIGNsYXNzZXM6Ci0KLSogRnVuY3Rpb25zIHRoYXQgY3JlYXRlIGEgbmV3IGl0ZXJhdG9yIGJhc2VkIG9uIGFuIGV4aXN0aW5nIGl0ZXJhdG9yLgotKiBGdW5jdGlvbnMgZm9yIHRyZWF0aW5nIGFuIGl0ZXJhdG9yJ3MgZWxlbWVudHMgYXMgZnVuY3Rpb24gYXJndW1lbnRzLgotKiBGdW5jdGlvbnMgZm9yIHNlbGVjdGluZyBwb3J0aW9ucyBvZiBhbiBpdGVyYXRvcidzIG91dHB1dC4KLSogQSBmdW5jdGlvbiBmb3IgZ3JvdXBpbmcgYW4gaXRlcmF0b3IncyBvdXRwdXQuCi0KLUNyZWF0aW5nIG5ldyBpdGVyYXRvcnMKLScnJycnJycnJycnJycnJycnJycnJycKLQotYGBpdGVydG9vbHMuY291bnQobilgYCByZXR1cm5zIGFuIGluZmluaXRlIHN0cmVhbSBvZgotaW50ZWdlcnMsIGluY3JlYXNpbmcgYnkgMSBlYWNoIHRpbWUuICBZb3UgY2FuIG9wdGlvbmFsbHkgc3VwcGx5IHRoZQotc3RhcnRpbmcgbnVtYmVyLCB3aGljaCBkZWZhdWx0cyB0byAwOjoKLQotICAgICAgICBpdGVydG9vbHMuY291bnQoKSA9PgotICAgICAgICAgIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIC4uLgotICAgICAgICBpdGVydG9vbHMuY291bnQoMTApID0+Ci0gICAgICAgICAgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIC4uLgotCi1gYGl0ZXJ0b29scy5jeWNsZShpdGVyKWBgIHNhdmVzIGEgY29weSBvZiB0aGUgY29udGVudHMgb2YgYSBwcm92aWRlZAotaXRlcmFibGUgYW5kIHJldHVybnMgYSBuZXcgaXRlcmF0b3IgdGhhdCByZXR1cm5zIGl0cyBlbGVtZW50cyBmcm9tCi1maXJzdCB0byBsYXN0LiAgVGhlIG5ldyBpdGVyYXRvciB3aWxsIHJlcGVhdCB0aGVzZSBlbGVtZW50cyBpbmZpbml0ZWx5LgotCi06OgotCi0gICAgICAgIGl0ZXJ0b29scy5jeWNsZShbMSwyLDMsNCw1XSkgPT4KLSAgICAgICAgICAxLCAyLCAzLCA0LCA1LCAxLCAyLCAzLCA0LCA1LCAuLi4KLQotYGBpdGVydG9vbHMucmVwZWF0KGVsZW0sIFtuXSlgYCByZXR1cm5zIHRoZSBwcm92aWRlZCBlbGVtZW50IGBgbmBgCi10aW1lcywgb3IgcmV0dXJucyB0aGUgZWxlbWVudCBlbmRsZXNzbHkgaWYgYGBuYGAgaXMgbm90IHByb3ZpZGVkLgotCi06OgotCi0gICAgaXRlcnRvb2xzLnJlcGVhdCgnYWJjJykgPT4KLSAgICAgIGFiYywgYWJjLCBhYmMsIGFiYywgYWJjLCBhYmMsIGFiYywgYWJjLCBhYmMsIGFiYywgLi4uCi0gICAgaXRlcnRvb2xzLnJlcGVhdCgnYWJjJywgNSkgPT4KLSAgICAgIGFiYywgYWJjLCBhYmMsIGFiYywgYWJjCi0KLWBgaXRlcnRvb2xzLmNoYWluKGl0ZXJBLCBpdGVyQiwgLi4uKWBgIHRha2VzIGFuIGFyYml0cmFyeSBudW1iZXIgb2YKLWl0ZXJhYmxlcyBhcyBpbnB1dCwgYW5kIHJldHVybnMgYWxsIHRoZSBlbGVtZW50cyBvZiB0aGUgZmlyc3QKLWl0ZXJhdG9yLCB0aGVuIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhlIHNlY29uZCwgYW5kIHNvIG9uLCB1bnRpbCBhbGwgb2YKLXRoZSBpdGVyYWJsZXMgaGF2ZSBiZWVuIGV4aGF1c3RlZC4KLQotOjoKLQotICAgIGl0ZXJ0b29scy5jaGFpbihbJ2EnLCAnYicsICdjJ10sICgxLCAyLCAzKSkgPT4KLSAgICAgIGEsIGIsIGMsIDEsIDIsIDMKLQotYGBpdGVydG9vbHMuaXppcChpdGVyQSwgaXRlckIsIC4uLilgYCB0YWtlcyBvbmUgZWxlbWVudCBmcm9tIGVhY2ggaXRlcmFibGUKLWFuZCByZXR1cm5zIHRoZW0gaW4gYSB0dXBsZTo6Ci0KLSAgICBpdGVydG9vbHMuaXppcChbJ2EnLCAnYicsICdjJ10sICgxLCAyLCAzKSkgPT4KLSAgICAgICgnYScsIDEpLCAoJ2InLCAyKSwgKCdjJywgMykKLQotSXQncyBzaW1pbGlhciB0byB0aGUgYnVpbHQtaW4gYGB6aXAoKWBgIGZ1bmN0aW9uLCBidXQgZG9lc24ndAotY29uc3RydWN0IGFuIGluLW1lbW9yeSBsaXN0IGFuZCBleGhhdXN0IGFsbCB0aGUgaW5wdXQgaXRlcmF0b3JzIGJlZm9yZQotcmV0dXJuaW5nOyBpbnN0ZWFkIHR1cGxlcyBhcmUgY29uc3RydWN0ZWQgYW5kIHJldHVybmVkIG9ubHkgaWYgdGhleSdyZQotcmVxdWVzdGVkLiAgKFRoZSB0ZWNobmljYWwgdGVybSBmb3IgdGhpcyBiZWhhdmlvdXIgaXMgCi1gbGF6eSBldmFsdWF0aW9uIDxodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xhenlfZXZhbHVhdGlvbj5gX18uKQotCi1UaGlzIGl0ZXJhdG9yIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCBpdGVyYWJsZXMgdGhhdCBhcmUgYWxsIG9mCi10aGUgc2FtZSBsZW5ndGguICBJZiB0aGUgaXRlcmFibGVzIGFyZSBvZiBkaWZmZXJlbnQgbGVuZ3RocywgdGhlCi1yZXN1bHRpbmcgc3RyZWFtIHdpbGwgYmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzaG9ydGVzdCBpdGVyYWJsZS4KLQotOjoKLQotICAgIGl0ZXJ0b29scy5pemlwKFsnYScsICdiJ10sICgxLCAyLCAzKSkgPT4KLSAgICAgICgnYScsIDEpLCAoJ2InLCAyKQotCi1Zb3Ugc2hvdWxkIGF2b2lkIGRvaW5nIHRoaXMsIHRob3VnaCwgYmVjYXVzZSBhbiBlbGVtZW50IG1heSBiZSB0YWtlbgotZnJvbSB0aGUgbG9uZ2VyIGl0ZXJhdG9ycyBhbmQgZGlzY2FyZGVkLiAgVGhpcyBtZWFucyB5b3UgY2FuJ3QgZ28gb24KLXRvIHVzZSB0aGUgaXRlcmF0b3JzIGZ1cnRoZXIgYmVjYXVzZSB5b3UgcmlzayBza2lwcGluZyBhIGRpc2NhcmRlZAotZWxlbWVudC4KLQotYGBpdGVydG9vbHMuaXNsaWNlKGl0ZXIsIFtzdGFydF0sIHN0b3AsIFtzdGVwXSlgYCByZXR1cm5zIGEgc3RyZWFtCi10aGF0J3MgYSBzbGljZSBvZiB0aGUgaXRlcmF0b3IuICBXaXRoIGEgc2luZ2xlIGBgc3RvcGBgIGFyZ3VtZW50LCAKLWl0IHdpbGwgcmV0dXJuIHRoZSBmaXJzdCBgYHN0b3BgYAotZWxlbWVudHMuICBJZiB5b3Ugc3VwcGx5IGEgc3RhcnRpbmcgaW5kZXgsIHlvdSdsbCBnZXQgYGBzdG9wLXN0YXJ0YGAKLWVsZW1lbnRzLCBhbmQgaWYgeW91IHN1cHBseSBhIHZhbHVlIGZvciBgYHN0ZXBgYCwgZWxlbWVudHMgd2lsbCBiZQotc2tpcHBlZCBhY2NvcmRpbmdseS4gIFVubGlrZSBQeXRob24ncyBzdHJpbmcgYW5kIGxpc3Qgc2xpY2luZywgeW91Ci1jYW4ndCB1c2UgbmVnYXRpdmUgdmFsdWVzIGZvciBgYHN0YXJ0YGAsIGBgc3RvcGBgLCBvciBgYHN0ZXBgYC4KLQotOjoKLQotICAgIGl0ZXJ0b29scy5pc2xpY2UocmFuZ2UoMTApLCA4KSA9PgotICAgICAgMCwgMSwgMiwgMywgNCwgNSwgNiwgNwotICAgIGl0ZXJ0b29scy5pc2xpY2UocmFuZ2UoMTApLCAyLCA4KSA9PgotICAgICAgMiwgMywgNCwgNSwgNiwgNwotICAgIGl0ZXJ0b29scy5pc2xpY2UocmFuZ2UoMTApLCAyLCA4LCAyKSA9PgotICAgICAgMiwgNCwgNgotCi1gYGl0ZXJ0b29scy50ZWUoaXRlciwgW25dKWBgIHJlcGxpY2F0ZXMgYW4gaXRlcmF0b3I7IGl0IHJldHVybnMgYGBuYGAKLWluZGVwZW5kZW50IGl0ZXJhdG9ycyB0aGF0IHdpbGwgYWxsIHJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIHNvdXJjZQotaXRlcmF0b3IuICBJZiB5b3UgZG9uJ3Qgc3VwcGx5IGEgdmFsdWUgZm9yIGBgbmBgLCB0aGUgZGVmYXVsdCBpcyAyLgotUmVwbGljYXRpbmcgaXRlcmF0b3JzIHJlcXVpcmVzIHNhdmluZyBzb21lIG9mIHRoZSBjb250ZW50cyBvZiB0aGUgc291cmNlCi1pdGVyYXRvciwgc28gdGhpcyBjYW4gY29uc3VtZSBzaWduaWZpY2FudCBtZW1vcnkgaWYgdGhlIGl0ZXJhdG9yIGlzIGxhcmdlCi1hbmQgb25lIG9mIHRoZSBuZXcgaXRlcmF0b3JzIGlzIGNvbnN1bWVkIG1vcmUgdGhhbiB0aGUgb3RoZXJzLgotCi06OgotCi0gICAgICAgIGl0ZXJ0b29scy50ZWUoIGl0ZXJ0b29scy5jb3VudCgpICkgPT4KLSAgICAgICAgICAgaXRlckEsIGl0ZXJCCi0KLSAgICAgICAgd2hlcmUgaXRlckEgLT4KLSAgICAgICAgICAgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgLi4uCi0KLSAgICAgICAgYW5kICAgaXRlckIgLT4KLSAgICAgICAgICAgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgLi4uCi0KLQotQ2FsbGluZyBmdW5jdGlvbnMgb24gZWxlbWVudHMKLScnJycnJycnJycnJycnJycnJycnJycnJycnJycnCi0KLVR3byBmdW5jdGlvbnMgYXJlIHVzZWQgZm9yIGNhbGxpbmcgb3RoZXIgZnVuY3Rpb25zIG9uIHRoZSBjb250ZW50cyBvZiBhbgotaXRlcmFibGUuCi0KLWBgaXRlcnRvb2xzLmltYXAoZiwgaXRlckEsIGl0ZXJCLCAuLi4pYGAgcmV0dXJucyAKLWEgc3RyZWFtIGNvbnRhaW5pbmcgYGBmKGl0ZXJBWzBdLCBpdGVyQlswXSksIGYoaXRlckFbMV0sIGl0ZXJCWzFdKSwKLWYoaXRlckFbMl0sIGl0ZXJCWzJdKSwgLi4uYGA6OgotCi0gICAgaXRlcnRvb2xzLmltYXAob3BlcmF0b3IuYWRkLCBbNSwgNiwgNV0sIFsxLCAyLCAzXSkgPT4KLSAgICAgIDYsIDgsIDgKLQotVGhlIGBgb3BlcmF0b3JgYCBtb2R1bGUgY29udGFpbnMgYSBzZXQgb2YgZnVuY3Rpb25zIAotY29ycmVzcG9uZGluZyB0byBQeXRob24ncyBvcGVyYXRvcnMuICBTb21lIGV4YW1wbGVzIGFyZSAKLWBgb3BlcmF0b3IuYWRkKGEsIGIpYGAgKGFkZHMgdHdvIHZhbHVlcyksIAotYGBvcGVyYXRvci5uZShhLCBiKWBgIChzYW1lIGFzIGBgYSE9YmBgKSwKLWFuZCAKLWBgb3BlcmF0b3IuYXR0cmdldHRlcignaWQnKWBgIChyZXR1cm5zIGEgY2FsbGFibGUgdGhhdAotZmV0Y2hlcyB0aGUgYGAiaWQiYGAgYXR0cmlidXRlKS4KLQotYGBpdGVydG9vbHMuc3Rhcm1hcChmdW5jLCBpdGVyKWBgIGFzc3VtZXMgdGhhdCB0aGUgaXRlcmFibGUgd2lsbCAKLXJldHVybiBhIHN0cmVhbSBvZiB0dXBsZXMsIGFuZCBjYWxscyBgYGYoKWBgIHVzaW5nIHRoZXNlIHR1cGxlcyBhcyB0aGUgCi1hcmd1bWVudHM6OgotCi0gICAgaXRlcnRvb2xzLnN0YXJtYXAob3MucGF0aC5qb2luLCAKLSAgICAgICAgICAgICAgICAgICAgICBbKCcvdXNyJywgJ2JpbicsICdqYXZhJyksICgnL2JpbicsICdweXRob24nKSwKLSAgICAgICAgICAgICAgICAgICAgICAgKCcvdXNyJywgJ2JpbicsICdwZXJsJyksKCcvdXNyJywgJ2JpbicsICdydWJ5JyldKQotICAgID0+Ci0gICAgICAvdXNyL2Jpbi9qYXZhLCAvYmluL3B5dGhvbiwgL3Vzci9iaW4vcGVybCwgL3Vzci9iaW4vcnVieQotCi0KLVNlbGVjdGluZyBlbGVtZW50cwotJycnJycnJycnJycnJycnJycnCi0KLUFub3RoZXIgZ3JvdXAgb2YgZnVuY3Rpb25zIGNob29zZXMgYSBzdWJzZXQgb2YgYW4gaXRlcmF0b3IncyBlbGVtZW50cwotYmFzZWQgb24gYSBwcmVkaWNhdGUuCi0KLWBgaXRlcnRvb2xzLmlmaWx0ZXIocHJlZGljYXRlLCBpdGVyKWBgIHJldHVybnMgYWxsIHRoZSBlbGVtZW50cyBmb3IKLXdoaWNoIHRoZSBwcmVkaWNhdGUgcmV0dXJucyB0cnVlOjoKLQotICAgIGRlZiBpc19ldmVuKHgpOgotICAgICAgICByZXR1cm4gKHggJSAyKSA9PSAwCi0KLSAgICBpdGVydG9vbHMuaWZpbHRlcihpc19ldmVuLCBpdGVydG9vbHMuY291bnQoKSkgPT4KLSAgICAgIDAsIDIsIDQsIDYsIDgsIDEwLCAxMiwgMTQsIC4uLgotCi1gYGl0ZXJ0b29scy5pZmlsdGVyZmFsc2UocHJlZGljYXRlLCBpdGVyKWBgIGlzIHRoZSBvcHBvc2l0ZSwgCi1yZXR1cm5pbmcgYWxsIGVsZW1lbnRzIGZvciB3aGljaCB0aGUgcHJlZGljYXRlIHJldHVybnMgZmFsc2U6OgotCi0gICAgaXRlcnRvb2xzLmlmaWx0ZXJmYWxzZShpc19ldmVuLCBpdGVydG9vbHMuY291bnQoKSkgPT4KLSAgICAgIDEsIDMsIDUsIDcsIDksIDExLCAxMywgMTUsIC4uLgotCi1gYGl0ZXJ0b29scy50YWtld2hpbGUocHJlZGljYXRlLCBpdGVyKWBgIHJldHVybnMgZWxlbWVudHMgZm9yIGFzIGxvbmcKLWFzIHRoZSBwcmVkaWNhdGUgcmV0dXJucyB0cnVlLiAgT25jZSB0aGUgcHJlZGljYXRlIHJldHVybnMgZmFsc2UsIAotdGhlIGl0ZXJhdG9yIHdpbGwgc2lnbmFsIHRoZSBlbmQgb2YgaXRzIHJlc3VsdHMuCi0KLTo6Ci0KLSAgICBkZWYgbGVzc190aGFuXzEwKHgpOgotICAgICAgICByZXR1cm4gKHggPCAxMCkKLQotICAgIGl0ZXJ0b29scy50YWtld2hpbGUobGVzc190aGFuXzEwLCBpdGVydG9vbHMuY291bnQoKSkgPT4KLSAgICAgIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkKLQotICAgIGl0ZXJ0b29scy50YWtld2hpbGUoaXNfZXZlbiwgaXRlcnRvb2xzLmNvdW50KCkpID0+Ci0gICAgICAwCi0KLWBgaXRlcnRvb2xzLmRyb3B3aGlsZShwcmVkaWNhdGUsIGl0ZXIpYGAgZGlzY2FyZHMgZWxlbWVudHMgd2hpbGUgdGhlCi1wcmVkaWNhdGUgcmV0dXJucyB0cnVlLCBhbmQgdGhlbiByZXR1cm5zIHRoZSByZXN0IG9mIHRoZSBpdGVyYWJsZSdzCi1yZXN1bHRzLgotCi06OgotCi0gICAgaXRlcnRvb2xzLmRyb3B3aGlsZShsZXNzX3RoYW5fMTAsIGl0ZXJ0b29scy5jb3VudCgpKSA9PgotICAgICAgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIC4uLgotCi0gICAgaXRlcnRvb2xzLmRyb3B3aGlsZShpc19ldmVuLCBpdGVydG9vbHMuY291bnQoKSkgPT4KLSAgICAgIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAuLi4KLQotCi1Hcm91cGluZyBlbGVtZW50cwotJycnJycnJycnJycnJycnJycKLQotVGhlIGxhc3QgZnVuY3Rpb24gSSdsbCBkaXNjdXNzLCBgYGl0ZXJ0b29scy5ncm91cGJ5KGl0ZXIsCi1rZXlfZnVuYz1Ob25lKWBgLCBpcyB0aGUgbW9zdCBjb21wbGljYXRlZC4gIGBga2V5X2Z1bmMoZWxlbSlgYCBpcyBhCi1mdW5jdGlvbiB0aGF0IGNhbiBjb21wdXRlIGEga2V5IHZhbHVlIGZvciBlYWNoIGVsZW1lbnQgcmV0dXJuZWQgYnkgdGhlCi1pdGVyYWJsZS4gIElmIHlvdSBkb24ndCBzdXBwbHkgYSBrZXkgZnVuY3Rpb24sIHRoZSBrZXkgaXMgc2ltcGx5IGVhY2gKLWVsZW1lbnQgaXRzZWxmLgotCi1gYGdyb3VwYnkoKWBgIGNvbGxlY3RzIGFsbCB0aGUgY29uc2VjdXRpdmUgZWxlbWVudHMgZnJvbSB0aGUKLXVuZGVybHlpbmcgaXRlcmFibGUgdGhhdCBoYXZlIHRoZSBzYW1lIGtleSB2YWx1ZSwgYW5kIHJldHVybnMgYSBzdHJlYW0KLW9mIDItdHVwbGVzIGNvbnRhaW5pbmcgYSBrZXkgdmFsdWUgYW5kIGFuIGl0ZXJhdG9yIGZvciB0aGUgZWxlbWVudHMKLXdpdGggdGhhdCBrZXkuICAKLQotOjoKLQotICAgIGNpdHlfbGlzdCA9IFsoJ0RlY2F0dXInLCAnQUwnKSwgKCdIdW50c3ZpbGxlJywgJ0FMJyksICgnU2VsbWEnLCAnQUwnKSwgCi0gICAgICAgICAgICAgICAgICgnQW5jaG9yYWdlJywgJ0FLJyksICgnTm9tZScsICdBSycpLAotICAgICAgICAgICAgICAgICAoJ0ZsYWdzdGFmZicsICdBWicpLCAoJ1Bob2VuaXgnLCAnQVonKSwgKCdUdWNzb24nLCAnQVonKSwgCi0gICAgICAgICAgICAgICAgIC4uLgotICAgICAgICAgICAgICAgIF0KLQotICAgIGRlZiBnZXRfc3RhdGUgKChjaXR5LCBzdGF0ZSkpOgotICAgICAgICByZXR1cm4gc3RhdGUKLQotICAgIGl0ZXJ0b29scy5ncm91cGJ5KGNpdHlfbGlzdCwgZ2V0X3N0YXRlKSA9PgotICAgICAgKCdBTCcsIGl0ZXJhdG9yLTEpLAotICAgICAgKCdBSycsIGl0ZXJhdG9yLTIpLAotICAgICAgKCdBWicsIGl0ZXJhdG9yLTMpLCAuLi4KLQotICAgIHdoZXJlCi0gICAgaXRlcmF0b3ItMSA9PgotICAgICAgKCdEZWNhdHVyJywgJ0FMJyksICgnSHVudHN2aWxsZScsICdBTCcpLCAoJ1NlbG1hJywgJ0FMJykKLSAgICBpdGVyYXRvci0yID0+IAotICAgICAgKCdBbmNob3JhZ2UnLCAnQUsnKSwgKCdOb21lJywgJ0FLJykKLSAgICBpdGVyYXRvci0zID0+Ci0gICAgICAoJ0ZsYWdzdGFmZicsICdBWicpLCAoJ1Bob2VuaXgnLCAnQVonKSwgKCdUdWNzb24nLCAnQVonKQotCi1gYGdyb3VwYnkoKWBgIGFzc3VtZXMgdGhhdCB0aGUgdW5kZXJseWluZyBpdGVyYWJsZSdzIGNvbnRlbnRzIHdpbGwKLWFscmVhZHkgYmUgc29ydGVkIGJhc2VkIG9uIHRoZSBrZXkuICBOb3RlIHRoYXQgdGhlIHJldHVybmVkIGl0ZXJhdG9ycwotYWxzbyB1c2UgdGhlIHVuZGVybHlpbmcgaXRlcmFibGUsIHNvIHlvdSBoYXZlIHRvIGNvbnN1bWUgdGhlIHJlc3VsdHMKLW9mIGl0ZXJhdG9yLTEgYmVmb3JlIHJlcXVlc3RpbmcgaXRlcmF0b3ItMiBhbmQgaXRzIGNvcnJlc3BvbmRpbmcga2V5LgotCi0KLVRoZSBmdW5jdG9vbHMgbW9kdWxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBgYGZ1bmN0b29sc2BgIG1vZHVsZSBpbiBQeXRob24gMi41IGNvbnRhaW5zIHNvbWUgaGlnaGVyLW9yZGVyCi1mdW5jdGlvbnMuICBBICoqaGlnaGVyLW9yZGVyIGZ1bmN0aW9uKiogdGFrZXMgb25lIG9yIG1vcmUgZnVuY3Rpb25zIGFzCi1pbnB1dCBhbmQgcmV0dXJucyBhIG5ldyBmdW5jdGlvbi4gIFRoZSBtb3N0IHVzZWZ1bCB0b29sIGluIHRoaXMgbW9kdWxlCi1pcyB0aGUgYGBwYXJ0aWFsKClgYCBmdW5jdGlvbi4KLQotRm9yIHByb2dyYW1zIHdyaXR0ZW4gaW4gYSBmdW5jdGlvbmFsIHN0eWxlLCB5b3UnbGwgc29tZXRpbWVzIHdhbnQgdG8KLWNvbnN0cnVjdCB2YXJpYW50cyBvZiBleGlzdGluZyBmdW5jdGlvbnMgdGhhdCBoYXZlIHNvbWUgb2YgdGhlCi1wYXJhbWV0ZXJzIGZpbGxlZCBpbi4gIENvbnNpZGVyIGEgUHl0aG9uIGZ1bmN0aW9uIGBgZihhLCBiLCBjKWBgOyB5b3UKLW1heSB3aXNoIHRvIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBgYGcoYiwgYylgYCB0aGF0J3MgZXF1aXZhbGVudCB0bwotYGBmKDEsIGIsIGMpYGA7IHlvdSdyZSBmaWxsaW5nIGluIGEgdmFsdWUgZm9yIG9uZSBvZiBgYGYoKWBgJ3MgcGFyYW1ldGVycy4gIAotVGhpcyBpcyBjYWxsZWQgInBhcnRpYWwgZnVuY3Rpb24gYXBwbGljYXRpb24iLgotCi1UaGUgY29uc3RydWN0b3IgZm9yIGBgcGFydGlhbGBgIHRha2VzIHRoZSBhcmd1bWVudHMgYGAoZnVuY3Rpb24sIGFyZzEsCi1hcmcyLCAuLi4ga3dhcmcxPXZhbHVlMSwga3dhcmcyPXZhbHVlMilgYC4gIFRoZSByZXN1bHRpbmcgb2JqZWN0IGlzCi1jYWxsYWJsZSwgc28geW91IGNhbiBqdXN0IGNhbGwgaXQgdG8gaW52b2tlIGBgZnVuY3Rpb25gYCB3aXRoIHRoZQotZmlsbGVkLWluIGFyZ3VtZW50cy4KLQotSGVyZSdzIGEgc21hbGwgYnV0IHJlYWxpc3RpYyBleGFtcGxlOjoKLQotICAgIGltcG9ydCBmdW5jdG9vbHMKLQotICAgIGRlZiBsb2cgKG1lc3NhZ2UsIHN1YnN5c3RlbSk6Ci0gICAgICAgICJXcml0ZSB0aGUgY29udGVudHMgb2YgJ21lc3NhZ2UnIHRvIHRoZSBzcGVjaWZpZWQgc3Vic3lzdGVtLiIKLSAgICAgICAgcHJpbnQgJyVzOiAlcycgJSAoc3Vic3lzdGVtLCBtZXNzYWdlKQotICAgICAgICAuLi4KLQotICAgIHNlcnZlcl9sb2cgPSBmdW5jdG9vbHMucGFydGlhbChsb2csIHN1YnN5c3RlbT0nc2VydmVyJykKLSAgICBzZXJ2ZXJfbG9nKCdVbmFibGUgdG8gb3BlbiBzb2NrZXQnKQotCi0KLVRoZSBvcGVyYXRvciBtb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIGBgb3BlcmF0b3JgYCBtb2R1bGUgd2FzIG1lbnRpb25lZCBlYXJsaWVyLiAgSXQgY29udGFpbnMgYSBzZXQgb2YKLWZ1bmN0aW9ucyBjb3JyZXNwb25kaW5nIHRvIFB5dGhvbidzIG9wZXJhdG9ycy4gIFRoZXNlIGZ1bmN0aW9ucyAKLWFyZSBvZnRlbiB1c2VmdWwgaW4gZnVuY3Rpb25hbC1zdHlsZSBjb2RlIGJlY2F1c2UgdGhleSBzYXZlIHlvdSAKLWZyb20gd3JpdGluZyB0cml2aWFsIGZ1bmN0aW9ucyB0aGF0IHBlcmZvcm0gYSBzaW5nbGUgb3BlcmF0aW9uLgotCi1Tb21lIG9mIHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBtb2R1bGUgYXJlOgotCi0qIE1hdGggb3BlcmF0aW9uczogYGBhZGQoKWBgLCBgYHN1YigpYGAsIGBgbXVsKClgYCwgYGBkaXYoKWBgLCBgYGZsb29yZGl2KClgYCwKLSAgYGBhYnMoKWBgLCAuLi4KLSogTG9naWNhbCBvcGVyYXRpb25zOiBgYG5vdF8oKWBgLCBgYHRydXRoKClgYC4KLSogQml0d2lzZSBvcGVyYXRpb25zOiBgYGFuZF8oKWBgLCBgYG9yXygpYGAsIGBgaW52ZXJ0KClgYC4KLSogQ29tcGFyaXNvbnM6IGBgZXEoKWBgLCBgYG5lKClgYCwgYGBsdCgpYGAsIGBgbGUoKWBgLCBgYGd0KClgYCwgYW5kIGBgZ2UoKWBgLgotKiBPYmplY3QgaWRlbnRpdHk6IGBgaXNfKClgYCwgYGBpc19ub3QoKWBgLgotCi1Db25zdWx0IGB0aGUgb3BlcmF0b3IgbW9kdWxlJ3MgZG9jdW1lbnRhdGlvbiA8aHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWIvbW9kdWxlLW9wZXJhdG9yLmh0bWw+YF9fIGZvciBhIGNvbXBsZXRlCi1saXN0LgotCi0KLQotVGhlIGZ1bmN0aW9uYWwgbW9kdWxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ29sbGluIFdpbnRlcidzIGBmdW5jdGlvbmFsIG1vZHVsZSA8aHR0cDovL29ha3dpbnRlci5jb20vY29kZS9mdW5jdGlvbmFsLz5gX18gCi1wcm92aWRlcyBhIG51bWJlciBvZiBtb3JlCi1hZHZhbmNlZCB0b29scyBmb3IgZnVuY3Rpb25hbCBwcm9ncmFtbWluZy4gSXQgYWxzbyByZWltcGxlbWVudHMKLXNldmVyYWwgUHl0aG9uIGJ1aWx0LWlucywgdHJ5aW5nIHRvIG1ha2UgdGhlbSBtb3JlIGludHVpdGl2ZSB0byB0aG9zZQotdXNlZCB0byBmdW5jdGlvbmFsIHByb2dyYW1taW5nIGluIG90aGVyIGxhbmd1YWdlcy4KLQotVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGFuIGludHJvZHVjdGlvbiB0byBzb21lIG9mIHRoZSBtb3N0IGltcG9ydGFudAotZnVuY3Rpb25zIGluIGBgZnVuY3Rpb25hbGBgOyBmdWxsIGRvY3VtZW50YXRpb24gY2FuIGJlIGZvdW5kIGF0IGB0aGUKLXByb2plY3QncyB3ZWJzaXRlIDxodHRwOi8vb2Frd2ludGVyLmNvbS9jb2RlL2Z1bmN0aW9uYWwvZG9jdW1lbnRhdGlvbi8+YF9fLgotCi1gYGNvbXBvc2Uob3V0ZXIsIGlubmVyLCB1bnBhY2s9RmFsc2UpYGAKLQotVGhlIGBgY29tcG9zZSgpYGAgZnVuY3Rpb24gaW1wbGVtZW50cyBmdW5jdGlvbiBjb21wb3NpdGlvbi4KLUluIG90aGVyIHdvcmRzLCBpdCByZXR1cm5zIGEgd3JhcHBlciBhcm91bmQgdGhlIGBgb3V0ZXJgYCBhbmQgYGBpbm5lcmBgIGNhbGxhYmxlcywgc3VjaAotdGhhdCB0aGUgcmV0dXJuIHZhbHVlIGZyb20gYGBpbm5lcmBgIGlzIGZlZCBkaXJlY3RseSB0byBgYG91dGVyYGAuICBUaGF0IGlzLAotCi06OgotCi0gICAgICAgID4+PiBkZWYgYWRkKGEsIGIpOgotICAgICAgICAuLi4gICAgIHJldHVybiBhICsgYgotICAgICAgICAuLi4KLSAgICAgICAgPj4+IGRlZiBkb3VibGUoYSk6Ci0gICAgICAgIC4uLiAgICAgcmV0dXJuIDIgKiBhCi0gICAgICAgIC4uLgotICAgICAgICA+Pj4gY29tcG9zZShkb3VibGUsIGFkZCkoNSwgNikKLSAgICAgICAgMjIKLQotaXMgZXF1aXZhbGVudCB0bwotCi06OgotCi0gICAgICAgID4+PiBkb3VibGUoYWRkKDUsIDYpKQotICAgICAgICAyMgotICAgICAgICAgICAgICAgICAgICAKLVRoZSBgYHVucGFja2BgIGtleXdvcmQgaXMgcHJvdmlkZWQgdG8gd29yayBhcm91bmQgdGhlIGZhY3QgdGhhdCBQeXRob24gZnVuY3Rpb25zIGFyZSBub3QgYWx3YXlzCi1gZnVsbHkgY3VycmllZCA8aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DdXJyeWluZz5gX18uCi1CeSBkZWZhdWx0LCBpdCBpcyBleHBlY3RlZCB0aGF0IHRoZSBgYGlubmVyYGAgZnVuY3Rpb24gd2lsbCByZXR1cm4gYSBzaW5nbGUgb2JqZWN0IGFuZCB0aGF0IHRoZSBgYG91dGVyYGAKLWZ1bmN0aW9uIHdpbGwgdGFrZSBhIHNpbmdsZSBhcmd1bWVudC4gU2V0dGluZyB0aGUgYGB1bnBhY2tgYCBhcmd1bWVudCBjYXVzZXMgYGBjb21wb3NlYGAgdG8gZXhwZWN0IGEKLXR1cGxlIGZyb20gYGBpbm5lcmBgIHdoaWNoIHdpbGwgYmUgZXhwYW5kZWQgYmVmb3JlIGJlaW5nIHBhc3NlZCB0byBgYG91dGVyYGAuIFB1dCBzaW1wbHksCi0KLTo6Ci0KLSAgICAgICAgY29tcG9zZShmLCBnKSg1LCA2KQotICAgICAgICAgICAgICAgICAgICAKLWlzIGVxdWl2YWxlbnQgdG86OgotCi0gICAgICAgIGYoZyg1LCA2KSkKLSAgICAgICAgICAgICAgICAgICAgCi13aGlsZQotCi06OgotCi0gICAgICAgIGNvbXBvc2UoZiwgZywgdW5wYWNrPVRydWUpKDUsIDYpCi0gICAgICAgICAgICAgICAgICAgIAotaXMgZXF1aXZhbGVudCB0bzo6Ci0KLSAgICAgICAgZigqZyg1LCA2KSkKLQotRXZlbiB0aG91Z2ggYGBjb21wb3NlKClgYCBvbmx5IGFjY2VwdHMgdHdvIGZ1bmN0aW9ucywgaXQncyB0cml2aWFsIHRvCi1idWlsZCB1cCBhIHZlcnNpb24gdGhhdCB3aWxsIGNvbXBvc2UgYW55IG51bWJlciBvZiBmdW5jdGlvbnMuIFdlJ2xsCi11c2UgYGByZWR1Y2UoKWBgLCBgYGNvbXBvc2UoKWBgIGFuZCBgYHBhcnRpYWwoKWBgICh0aGUgbGFzdCBvZiB3aGljaAotaXMgcHJvdmlkZWQgYnkgYm90aCBgYGZ1bmN0aW9uYWxgYCBhbmQgYGBmdW5jdG9vbHNgYCkuCi0KLTo6Ci0KLSAgICAgICAgZnJvbSBmdW5jdGlvbmFsIGltcG9ydCBjb21wb3NlLCBwYXJ0aWFsCi0gICAgICAgIAotICAgICAgICBtdWx0aV9jb21wb3NlID0gcGFydGlhbChyZWR1Y2UsIGNvbXBvc2UpCi0gICAgICAgIAotICAgIAotV2UgY2FuIGFsc28gdXNlIGBgbWFwKClgYCwgYGBjb21wb3NlKClgYCBhbmQgYGBwYXJ0aWFsKClgYCB0byBjcmFmdCBhCi12ZXJzaW9uIG9mIGBgIiIuam9pbiguLi4pYGAgdGhhdCBjb252ZXJ0cyBpdHMgYXJndW1lbnRzIHRvIHN0cmluZzo6Ci0KLSAgICAgICAgZnJvbSBmdW5jdGlvbmFsIGltcG9ydCBjb21wb3NlLCBwYXJ0aWFsCi0gICAgICAgIAotICAgICAgICBqb2luID0gY29tcG9zZSgiIi5qb2luLCBwYXJ0aWFsKG1hcCwgc3RyKSkKLQotCi1gYGZsaXAoZnVuYylgYAotICAgICAgICAgICAgICAgICAgICAKLWBgZmxpcCgpYGAgd3JhcHMgdGhlIGNhbGxhYmxlIGluIGBgZnVuY2BgIGFuZCAgCi1jYXVzZXMgaXQgdG8gcmVjZWl2ZSBpdHMgbm9uLWtleXdvcmQgYXJndW1lbnRzIGluIHJldmVyc2Ugb3JkZXIuCi0KLTo6Ci0KLSAgICAgICAgPj4+IGRlZiB0cmlwbGUoYSwgYiwgYyk6Ci0gICAgICAgIC4uLiAgICAgcmV0dXJuIChhLCBiLCBjKQotICAgICAgICAuLi4KLSAgICAgICAgPj4+IHRyaXBsZSg1LCA2LCA3KQotICAgICAgICAoNSwgNiwgNykKLSAgICAgICAgPj4+Ci0gICAgICAgID4+PiBmbGlwcGVkX3RyaXBsZSA9IGZsaXAodHJpcGxlKQotICAgICAgICA+Pj4gZmxpcHBlZF90cmlwbGUoNSwgNiwgNykKLSAgICAgICAgKDcsIDYsIDUpCi0KLWBgZm9sZGwoZnVuYywgc3RhcnQsIGl0ZXJhYmxlKWBgCi0gICAgICAgICAgICAgICAgICAgIAotYGBmb2xkbCgpYGAgdGFrZXMgYSBiaW5hcnkgZnVuY3Rpb24sIGEgc3RhcnRpbmcgdmFsdWUgKHVzdWFsbHkgc29tZSBraW5kIG9mICd6ZXJvJyksIGFuZCBhbiBpdGVyYWJsZS4KLVRoZSBmdW5jdGlvbiBpcyBhcHBsaWVkIHRvIHRoZSBzdGFydGluZyB2YWx1ZSBhbmQgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGxpc3QsIHRoZW4gdGhlIHJlc3VsdCBvZgotdGhhdCBhbmQgdGhlIHNlY29uZCBlbGVtZW50IG9mIHRoZSBsaXN0LCB0aGVuIHRoZSByZXN1bHQgb2YgdGhhdCBhbmQgdGhlIHRoaXJkIGVsZW1lbnQgb2YgdGhlIGxpc3QsCi1hbmQgc28gb24uCi0KLVRoaXMgbWVhbnMgdGhhdCBhIGNhbGwgc3VjaCBhczo6Ci0KLSAgICAgICAgZm9sZGwoZiwgMCwgWzEsIDIsIDNdKQotCi1pcyBlcXVpdmFsZW50IHRvOjoKLQotICAgICAgICBmKGYoZigwLCAxKSwgMiksIDMpCi0KLSAgICAKLWBgZm9sZGwoKWBgIGlzIHJvdWdobHkgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nIHJlY3Vyc2l2ZSBmdW5jdGlvbjo6Ci0KLSAgICAgICAgZGVmIGZvbGRsKGZ1bmMsIHN0YXJ0LCBzZXEpOgotICAgICAgICAgICAgaWYgbGVuKHNlcSkgPT0gMDoKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnQKLQotICAgICAgICAgICAgcmV0dXJuIGZvbGRsKGZ1bmMsIGZ1bmMoc3RhcnQsIHNlcVswXSksIHNlcVsxOl0pCi0KLVNwZWFraW5nIG9mIGVxdWl2YWxlbmNlLCB0aGUgYWJvdmUgYGBmb2xkbGBgIGNhbGwgY2FuIGJlIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiB0aGUgYnVpbHQtaW4gYGByZWR1Y2VgYCBsaWtlCi1zbzo6Ci0KLSAgICAgICAgcmVkdWNlKGYsIFsxLCAyLCAzXSwgMCkKLQotCi1XZSBjYW4gdXNlIGBgZm9sZGwoKWBgLCBgYG9wZXJhdG9yLmNvbmNhdCgpYGAgYW5kIGBgcGFydGlhbCgpYGAgdG8KLXdyaXRlIGEgY2xlYW5lciwgbW9yZSBhZXN0aGV0aWNhbGx5LXBsZWFzaW5nIHZlcnNpb24gb2YgUHl0aG9uJ3MKLWBgIiIuam9pbiguLi4pYGAgaWRpb206OgotCi0gICAgICAgIGZyb20gZnVuY3Rpb25hbCBpbXBvcnQgZm9sZGwsIHBhcnRpYWwKLSAgICAgICAgZnJvbSBvcGVyYXRvciBpbXBvcnQgY29uY2F0Ci0gICAgICAgIAotICAgICAgICBqb2luID0gcGFydGlhbChmb2xkbCwgY29uY2F0LCAiIikKLQotCi1SZXZpc2lvbiBIaXN0b3J5IGFuZCBBY2tub3dsZWRnZW1lbnRzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIGF1dGhvciB3b3VsZCBsaWtlIHRvIHRoYW5rIHRoZSBmb2xsb3dpbmcgcGVvcGxlIGZvciBvZmZlcmluZwotc3VnZ2VzdGlvbnMsIGNvcnJlY3Rpb25zIGFuZCBhc3Npc3RhbmNlIHdpdGggdmFyaW91cyBkcmFmdHMgb2YgdGhpcwotYXJ0aWNsZTogSWFuIEJpY2tpbmcsIE5pY2sgQ29naGxhbiwgTmljayBFZmZvcmQsIFJheW1vbmQgSGV0dGluZ2VyLAotSmltIEpld2V0dCwgTWlrZSBLcmVsbCwgTGVhbmRybyBMYW1laXJvLCBKdXNzaSBTYWxtZWxhLCAKLUNvbGxpbiBXaW50ZXIsIEJsYWtlIFdpbnRvbi4KLQotVmVyc2lvbiAwLjE6IHBvc3RlZCBKdW5lIDMwIDIwMDYuCi0KLVZlcnNpb24gMC4xMTogcG9zdGVkIEp1bHkgMSAyMDA2LiAgVHlwbyBmaXhlcy4KLQotVmVyc2lvbiAwLjI6IHBvc3RlZCBKdWx5IDEwIDIwMDYuICBNZXJnZWQgZ2VuZXhwIGFuZCBsaXN0Y29tcAotc2VjdGlvbnMgaW50byBvbmUuICBUeXBvIGZpeGVzLgotCi1WZXJzaW9uIDAuMjE6IEFkZGVkIG1vcmUgcmVmZXJlbmNlcyBzdWdnZXN0ZWQgb24gdGhlIHR1dG9yIG1haWxpbmcgbGlzdC4KLQotVmVyc2lvbiAwLjMwOiBBZGRzIGEgc2VjdGlvbiBvbiB0aGUgYGBmdW5jdGlvbmFsYGAgbW9kdWxlIHdyaXR0ZW4gYnkKLUNvbGxpbiBXaW50ZXI7IGFkZHMgc2hvcnQgc2VjdGlvbiBvbiB0aGUgb3BlcmF0b3IgbW9kdWxlOyBhIGZldyBvdGhlcgotZWRpdHMuCi0KLQotUmVmZXJlbmNlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotR2VuZXJhbAotJycnJycnJycnJycnJycnCi0KLSoqU3RydWN0dXJlIGFuZCBJbnRlcnByZXRhdGlvbiBvZiBDb21wdXRlciBQcm9ncmFtcyoqLCBieSAKLUhhcm9sZCBBYmVsc29uIGFuZCBHZXJhbGQgSmF5IFN1c3NtYW4gd2l0aCBKdWxpZSBTdXNzbWFuLgotRnVsbCB0ZXh0IGF0IGh0dHA6Ly9taXRwcmVzcy5taXQuZWR1L3NpY3AvLgotSW4gdGhpcyBjbGFzc2ljIHRleHRib29rIG9mIGNvbXB1dGVyIHNjaWVuY2UsICBjaGFwdGVycyAyIGFuZCAzIGRpc2N1c3MgdGhlCi11c2Ugb2Ygc2VxdWVuY2VzIGFuZCBzdHJlYW1zIHRvIG9yZ2FuaXplIHRoZSBkYXRhIGZsb3cgaW5zaWRlIGEKLXByb2dyYW0uICBUaGUgYm9vayB1c2VzIFNjaGVtZSBmb3IgaXRzIGV4YW1wbGVzLCBidXQgbWFueSBvZiB0aGUKLWRlc2lnbiBhcHByb2FjaGVzIGRlc2NyaWJlZCBpbiB0aGVzZSBjaGFwdGVycyBhcmUgYXBwbGljYWJsZSB0bwotZnVuY3Rpb25hbC1zdHlsZSBQeXRob24gY29kZS4KLQotaHR0cDovL3d3dy5kZWZtYWNyby5vcmcvcmFtYmxpbmdzL2ZwLmh0bWw6IEEgZ2VuZXJhbCAKLWludHJvZHVjdGlvbiB0byBmdW5jdGlvbmFsIHByb2dyYW1taW5nIHRoYXQgdXNlcyBKYXZhIGV4YW1wbGVzCi1hbmQgaGFzIGEgbGVuZ3RoeSBoaXN0b3JpY2FsIGludHJvZHVjdGlvbi4KLQotaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9GdW5jdGlvbmFsX3Byb2dyYW1taW5nOgotR2VuZXJhbCBXaWtpcGVkaWEgZW50cnkgZGVzY3JpYmluZyBmdW5jdGlvbmFsIHByb2dyYW1taW5nLgotCi1odHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Nvcm91dGluZToKLUVudHJ5IGZvciBjb3JvdXRpbmVzLgotCi1odHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0N1cnJ5aW5nOgotRW50cnkgZm9yIHRoZSBjb25jZXB0IG9mIGN1cnJ5aW5nLgotCi1QeXRob24tc3BlY2lmaWMKLScnJycnJycnJycnJycnJycnJycnJycnJycnJwotCi1odHRwOi8vZ25vc2lzLmN4L1RQaVAvOgotVGhlIGZpcnN0IGNoYXB0ZXIgb2YgRGF2aWQgTWVydHoncyBib29rIDp0aXRsZS1yZWZlcmVuY2U6YFRleHQgUHJvY2Vzc2luZyBpbiBQeXRob25gIAotZGlzY3Vzc2VzIGZ1bmN0aW9uYWwgcHJvZ3JhbW1pbmcgZm9yIHRleHQgcHJvY2Vzc2luZywgaW4gdGhlIHNlY3Rpb24gdGl0bGVkCi0iVXRpbGl6aW5nIEhpZ2hlci1PcmRlciBGdW5jdGlvbnMgaW4gVGV4dCBQcm9jZXNzaW5nIi4KLQotTWVydHogYWxzbyB3cm90ZSBhIDMtcGFydCBzZXJpZXMgb2YgYXJ0aWNsZXMgb24gZnVuY3Rpb25hbCBwcm9ncmFtbWluZwotZm9yIElCTSdzIERldmVsb3BlcldvcmtzIHNpdGU7IHNlZSAKLWBwYXJ0IDEgPGh0dHA6Ly93d3ctMTI4LmlibS5jb20vZGV2ZWxvcGVyd29ya3MvbGlicmFyeS9sLXByb2cuaHRtbD5gX18sCi1gcGFydCAyIDxodHRwOi8vd3d3LTEyOC5pYm0uY29tL2RldmVsb3BlcndvcmtzL2xpYnJhcnkvbC1wcm9nMi5odG1sPmBfXywgYW5kCi1gcGFydCAzIDxodHRwOi8vd3d3LTEyOC5pYm0uY29tL2RldmVsb3BlcndvcmtzL2xpbnV4L2xpYnJhcnkvbC1wcm9nMy5odG1sPmBfXywKLQotCi1QeXRob24gZG9jdW1lbnRhdGlvbgotJycnJycnJycnJycnJycnJycnJycnJycnJycnCi0KLWh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvbGliL21vZHVsZS1pdGVydG9vbHMuaHRtbDoKLURvY3VtZW50YXRpb24gZm9yIHRoZSBgYGl0ZXJ0b29sc2BgIG1vZHVsZS4KLQotaHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWIvbW9kdWxlLW9wZXJhdG9yLmh0bWw6Ci1Eb2N1bWVudGF0aW9uIGZvciB0aGUgYGBvcGVyYXRvcmBgIG1vZHVsZS4KLQotaHR0cDovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wMjg5LzoKLVBFUCAyODk6ICJHZW5lcmF0b3IgRXhwcmVzc2lvbnMiCi0KLWh0dHA6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDM0Mi8KLVBFUCAzNDI6ICJDb3JvdXRpbmVzIHZpYSBFbmhhbmNlZCBHZW5lcmF0b3JzIiBkZXNjcmliZXMgdGhlIG5ldyBnZW5lcmF0b3IKLWZlYXR1cmVzIGluIFB5dGhvbiAyLjUuCi0KLS4uIGNvbW1lbnQKLQotICAgIFRvcGljcyB0byBwbGFjZQotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBYWFggb3Mud2FsaygpCi0KLSAgICBYWFggTmVlZCBhIGxhcmdlIGV4YW1wbGUuCi0KLSAgICBCdXQgd2lsbCBhbiBleGFtcGxlIGFkZCBtdWNoPyAgSSdsbCBwb3N0IGEgZmlyc3QgZHJhZnQgYW5kIHNlZQotICAgIHdoYXQgdGhlIGNvbW1lbnRzIHNheS4KLQotLi4gY29tbWVudAotCi0gICAgT3JpZ2luYWwgb3V0bGluZToKLSAgICBJbnRyb2R1Y3Rpb24KLSAgICAgICAgICAgIElkZWEgb2YgRlAKLSAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbXMgYnVpbHQgb3V0IG9mIGZ1bmN0aW9ucwotICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbnMgYXJlIHN0cmljdGx5IGlucHV0LW91dHB1dCwgbm8gaW50ZXJuYWwgc3RhdGUKLSAgICAgICAgICAgIE9wcG9zZWQgdG8gT08gcHJvZ3JhbW1pbmcsIHdoZXJlIG9iamVjdHMgaGF2ZSBzdGF0ZQotCi0gICAgICAgICAgICBXaHkgRlA/Ci0gICAgICAgICAgICAgICAgICAgIEZvcm1hbCBwcm92YWJpbGl0eQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2lnbm1lbnQgaXMgZGlmZmljdWx0IHRvIHJlYXNvbiBhYm91dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdCB2ZXJ5IHJlbGV2YW50IHRvIFB5dGhvbgotICAgICAgICAgICAgICAgICAgICBNb2R1bGFyaXR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGwgZnVuY3Rpb25zIHRoYXQgZG8gb25lIHRoaW5nCi0gICAgICAgICAgICAgICAgICAgIERlYnVnZ2FiaWxpdHk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRWFzeSB0byB0ZXN0IGR1ZSB0byBsYWNrIG9mIHN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRWFzeSB0byB2ZXJpZnkgb3V0cHV0IGZyb20gaW50ZXJtZWRpYXRlIHN0ZXBzCi0gICAgICAgICAgICAgICAgICAgIENvbXBvc2FiaWxpdHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBZb3UgYXNzZW1ibGUgYSB0b29sYm94IG9mIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSBtaXhlZAotCi0gICAgVGFja2xpbmcgYSBwcm9ibGVtCi0gICAgICAgICAgICBOZWVkIGEgc2lnbmlmaWNhbnQgZXhhbXBsZQotCi0gICAgSXRlcmF0b3JzCi0gICAgR2VuZXJhdG9ycwotICAgIFRoZSBpdGVydG9vbHMgbW9kdWxlCi0gICAgTGlzdCBjb21wcmVoZW5zaW9ucwotICAgIFNtYWxsIGZ1bmN0aW9ucyBhbmQgdGhlIGxhbWJkYSBzdGF0ZW1lbnQKLSAgICBCdWlsdC1pbiBmdW5jdGlvbnMKLSAgICAgICAgICAgIG1hcAotICAgICAgICAgICAgZmlsdGVyCi0gICAgICAgICAgICByZWR1Y2UKLQotLi4gY29tbWVudAotCi0gICAgSGFuZHkgbGl0dGxlIGZ1bmN0aW9uIGZvciBwcmludGluZyBwYXJ0IG9mIGFuIGl0ZXJhdG9yIC0tIHVzZWQKLSAgICB3aGlsZSB3cml0aW5nIHRoaXMgZG9jdW1lbnQuCi0KLSAgICBpbXBvcnQgaXRlcnRvb2xzCi0gICAgZGVmIHByaW50X2l0ZXIoaXQpOgotICAgICAgICAgc2xpY2UgPSBpdGVydG9vbHMuaXNsaWNlKGl0LCAxMCkKLSAgICAgICAgIGZvciBlbGVtIGluIHNsaWNlWzotMV06Ci0gICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZShzdHIoZWxlbSkpCi0gICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgnLCAnKQotICAgICAgICBwcmludCBlbGVtWy0xXQotCi0KZGlmZiAtLWdpdCBhL0RvYy9ob3d0by9yZWdleC50ZXggYi9Eb2MvaG93dG8vcmVnZXgudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTExYmU2Li4wMDAwMDAwCi0tLSBhL0RvYy9ob3d0by9yZWdleC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDc2ICswLDAgQEAKLVxkb2N1bWVudGNsYXNze2hvd3RvfQotCi0lIFRPRE86Ci0lIERvY3VtZW50IGxvb2tiZWhpbmQgYXNzZXJ0aW9ucwotJSBCZXR0ZXIgd2F5IG9mIGRpc3BsYXlpbmcgYSBSRSwgYSBzdHJpbmcsIGFuZCB3aGF0IGl0IG1hdGNoZXMKLSUgTWVudGlvbiBvcHRpb25hbCBhcmd1bWVudCB0byBtYXRjaC5ncm91cHMoKQotJSBVbmljb2RlIChhdCBsZWFzdCBhIHJlZmVyZW5jZSkKLQotXHRpdGxle1JlZ3VsYXIgRXhwcmVzc2lvbiBIT1dUT30KLQotXHJlbGVhc2V7MC4wNX0KLQotXGF1dGhvcntBLk0uIEt1Y2hsaW5nfQotXGF1dGhvcmFkZHJlc3N7XGVtYWlse2Fta0BhbWsuY2F9fQotCi1cYmVnaW57ZG9jdW1lbnR9Ci1cbWFrZXRpdGxlCi0KLVxiZWdpbnthYnN0cmFjdH0KLVxub2luZGVudAotVGhpcyBkb2N1bWVudCBpcyBhbiBpbnRyb2R1Y3RvcnkgdHV0b3JpYWwgdG8gdXNpbmcgcmVndWxhciBleHByZXNzaW9ucwotaW4gUHl0aG9uIHdpdGggdGhlIFxtb2R1bGV7cmV9IG1vZHVsZS4gIEl0IHByb3ZpZGVzIGEgZ2VudGxlcgotaW50cm9kdWN0aW9uIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcgc2VjdGlvbiBpbiB0aGUgTGlicmFyeSBSZWZlcmVuY2UuCi0KLVRoaXMgZG9jdW1lbnQgaXMgYXZhaWxhYmxlIGZyb20gCi1cdXJse2h0dHA6Ly93d3cuYW1rLmNhL3B5dGhvbi9ob3d0b30uCi0KLVxlbmR7YWJzdHJhY3R9Ci0KLVx0YWJsZW9mY29udGVudHMKLQotXHNlY3Rpb257SW50cm9kdWN0aW9ufQotCi1UaGUgXG1vZHVsZXtyZX0gbW9kdWxlIHdhcyBhZGRlZCBpbiBQeXRob24gMS41LCBhbmQgcHJvdmlkZXMKLVBlcmwtc3R5bGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm5zLiAgRWFybGllciB2ZXJzaW9ucyBvZiBQeXRob24KLWNhbWUgd2l0aCB0aGUgXG1vZHVsZXtyZWdleH0gbW9kdWxlLCB3aGljaCBwcm92aWRlZCBFbWFjcy1zdHlsZQotcGF0dGVybnMuICBUaGUgXG1vZHVsZXtyZWdleH0gbW9kdWxlIHdhcyByZW1vdmVkIGNvbXBsZXRlbHkgaW4gUHl0aG9uIDIuNS4KLQotUmVndWxhciBleHByZXNzaW9ucyAoY2FsbGVkIFJFcywgb3IgcmVnZXhlcywgb3IgcmVnZXggcGF0dGVybnMpIGFyZQotZXNzZW50aWFsbHkgYSB0aW55LCBoaWdobHkgc3BlY2lhbGl6ZWQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgZW1iZWRkZWQKLWluc2lkZSBQeXRob24gYW5kIG1hZGUgYXZhaWxhYmxlIHRocm91Z2ggdGhlIFxtb2R1bGV7cmV9IG1vZHVsZS4KLVVzaW5nIHRoaXMgbGl0dGxlIGxhbmd1YWdlLCB5b3Ugc3BlY2lmeSB0aGUgcnVsZXMgZm9yIHRoZSBzZXQgb2YKLXBvc3NpYmxlIHN0cmluZ3MgdGhhdCB5b3Ugd2FudCB0byBtYXRjaDsgdGhpcyBzZXQgbWlnaHQgY29udGFpbgotRW5nbGlzaCBzZW50ZW5jZXMsIG9yIGUtbWFpbCBhZGRyZXNzZXMsIG9yIFRlWCBjb21tYW5kcywgb3IgYW55dGhpbmcKLXlvdSBsaWtlLiAgWW91IGNhbiB0aGVuIGFzayBxdWVzdGlvbnMgc3VjaCBhcyBgYERvZXMgdGhpcyBzdHJpbmcgbWF0Y2gKLXRoZSBwYXR0ZXJuPycnLCBvciBgYElzIHRoZXJlIGEgbWF0Y2ggZm9yIHRoZSBwYXR0ZXJuIGFueXdoZXJlIGluIHRoaXMKLXN0cmluZz8nJy4gIFlvdSBjYW4gYWxzbyB1c2UgUkVzIHRvIG1vZGlmeSBhIHN0cmluZyBvciB0byBzcGxpdCBpdAotYXBhcnQgaW4gdmFyaW91cyB3YXlzLgotCi1SZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybnMgYXJlIGNvbXBpbGVkIGludG8gYSBzZXJpZXMgb2YgYnl0ZWNvZGVzCi13aGljaCBhcmUgdGhlbiBleGVjdXRlZCBieSBhIG1hdGNoaW5nIGVuZ2luZSB3cml0dGVuIGluIEMuICBGb3IKLWFkdmFuY2VkIHVzZSwgaXQgbWF5IGJlIG5lY2Vzc2FyeSB0byBwYXkgY2FyZWZ1bCBhdHRlbnRpb24gdG8gaG93IHRoZQotZW5naW5lIHdpbGwgZXhlY3V0ZSBhIGdpdmVuIFJFLCBhbmQgd3JpdGUgdGhlIFJFIGluIGEgY2VydGFpbiB3YXkgaW4KLW9yZGVyIHRvIHByb2R1Y2UgYnl0ZWNvZGUgdGhhdCBydW5zIGZhc3Rlci4gIE9wdGltaXphdGlvbiBpc24ndAotY292ZXJlZCBpbiB0aGlzIGRvY3VtZW50LCBiZWNhdXNlIGl0IHJlcXVpcmVzIHRoYXQgeW91IGhhdmUgYSBnb29kCi11bmRlcnN0YW5kaW5nIG9mIHRoZSBtYXRjaGluZyBlbmdpbmUncyBpbnRlcm5hbHMuCi0KLVRoZSByZWd1bGFyIGV4cHJlc3Npb24gbGFuZ3VhZ2UgaXMgcmVsYXRpdmVseSBzbWFsbCBhbmQgcmVzdHJpY3RlZCwgc28KLW5vdCBhbGwgcG9zc2libGUgc3RyaW5nIHByb2Nlc3NpbmcgdGFza3MgY2FuIGJlIGRvbmUgdXNpbmcgcmVndWxhcgotZXhwcmVzc2lvbnMuICBUaGVyZSBhcmUgYWxzbyB0YXNrcyB0aGF0IFxlbXBoe2Nhbn0gYmUgZG9uZSB3aXRoCi1yZWd1bGFyIGV4cHJlc3Npb25zLCBidXQgdGhlIGV4cHJlc3Npb25zIHR1cm4gb3V0IHRvIGJlIHZlcnkKLWNvbXBsaWNhdGVkLiAgSW4gdGhlc2UgY2FzZXMsIHlvdSBtYXkgYmUgYmV0dGVyIG9mZiB3cml0aW5nIFB5dGhvbgotY29kZSB0byBkbyB0aGUgcHJvY2Vzc2luZzsgd2hpbGUgUHl0aG9uIGNvZGUgd2lsbCBiZSBzbG93ZXIgdGhhbiBhbgotZWxhYm9yYXRlIHJlZ3VsYXIgZXhwcmVzc2lvbiwgaXQgd2lsbCBhbHNvIHByb2JhYmx5IGJlIG1vcmUgdW5kZXJzdGFuZGFibGUuCi0KLVxzZWN0aW9ue1NpbXBsZSBQYXR0ZXJuc30KLQotV2UnbGwgc3RhcnQgYnkgbGVhcm5pbmcgYWJvdXQgdGhlIHNpbXBsZXN0IHBvc3NpYmxlIHJlZ3VsYXIKLWV4cHJlc3Npb25zLiAgU2luY2UgcmVndWxhciBleHByZXNzaW9ucyBhcmUgdXNlZCB0byBvcGVyYXRlIG9uCi1zdHJpbmdzLCB3ZSdsbCBiZWdpbiB3aXRoIHRoZSBtb3N0IGNvbW1vbiB0YXNrOiBtYXRjaGluZyBjaGFyYWN0ZXJzLgotCi1Gb3IgYSBkZXRhaWxlZCBleHBsYW5hdGlvbiBvZiB0aGUgY29tcHV0ZXIgc2NpZW5jZSB1bmRlcmx5aW5nIHJlZ3VsYXIKLWV4cHJlc3Npb25zIChkZXRlcm1pbmlzdGljIGFuZCBub24tZGV0ZXJtaW5pc3RpYyBmaW5pdGUgYXV0b21hdGEpLCB5b3UKLWNhbiByZWZlciB0byBhbG1vc3QgYW55IHRleHRib29rIG9uIHdyaXRpbmcgY29tcGlsZXJzLgotCi1cc3Vic2VjdGlvbntNYXRjaGluZyBDaGFyYWN0ZXJzfQotCi1Nb3N0IGxldHRlcnMgYW5kIGNoYXJhY3RlcnMgd2lsbCBzaW1wbHkgbWF0Y2ggdGhlbXNlbHZlcy4gIEZvcgotZXhhbXBsZSwgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBccmVnZXhwe3Rlc3R9IHdpbGwgbWF0Y2ggdGhlIHN0cmluZwotXHNhbXB7dGVzdH0gZXhhY3RseS4gIChZb3UgY2FuIGVuYWJsZSBhIGNhc2UtaW5zZW5zaXRpdmUgbW9kZSB0aGF0Ci13b3VsZCBsZXQgdGhpcyBSRSBtYXRjaCBcc2FtcHtUZXN0fSBvciBcc2FtcHtURVNUfSBhcyB3ZWxsOyBtb3JlCi1hYm91dCB0aGlzIGxhdGVyLikgIAotCi1UaGVyZSBhcmUgZXhjZXB0aW9ucyB0byB0aGlzIHJ1bGU7IHNvbWUgY2hhcmFjdGVycyBhcmUgc3BlY2lhbAotXGRmbnttZXRhY2hhcmFjdGVyc30sIGFuZCBkb24ndCBtYXRjaCB0aGVtc2VsdmVzLiAgSW5zdGVhZCwgdGhleQotc2lnbmFsIHRoYXQgc29tZSBvdXQtb2YtdGhlLW9yZGluYXJ5IHRoaW5nIHNob3VsZCBiZSBtYXRjaGVkLCBvciB0aGV5Ci1hZmZlY3Qgb3RoZXIgcG9ydGlvbnMgb2YgdGhlIFJFIGJ5IHJlcGVhdGluZyB0aGVtIG9yIGNoYW5naW5nIHRoZWlyCi1tZWFuaW5nLiAgTXVjaCBvZiB0aGlzIGRvY3VtZW50IGlzIGRldm90ZWQgdG8gZGlzY3Vzc2luZyB2YXJpb3VzCi1tZXRhY2hhcmFjdGVycyBhbmQgd2hhdCB0aGV5IGRvLgotCi1IZXJlJ3MgYSBjb21wbGV0ZSBsaXN0IG9mIHRoZSBtZXRhY2hhcmFjdGVyczsgdGhlaXIgbWVhbmluZ3Mgd2lsbCBiZQotZGlzY3Vzc2VkIGluIHRoZSByZXN0IG9mIHRoaXMgSE9XVE8uCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLS4gXiAkICogKyA/IHsgWyBdIFwgfCAoICkKLVxlbmR7dmVyYmF0aW19Ci0lICQKLQotVGhlIGZpcnN0IG1ldGFjaGFyYWN0ZXJzIHdlJ2xsIGxvb2sgYXQgYXJlIFxzYW1we1t9IGFuZCBcc2FtcHtdfS4KLVRoZXkncmUgdXNlZCBmb3Igc3BlY2lmeWluZyBhIGNoYXJhY3RlciBjbGFzcywgd2hpY2ggaXMgYSBzZXQgb2YKLWNoYXJhY3RlcnMgdGhhdCB5b3Ugd2lzaCB0byBtYXRjaC4gIENoYXJhY3RlcnMgY2FuIGJlIGxpc3RlZAotaW5kaXZpZHVhbGx5LCBvciBhIHJhbmdlIG9mIGNoYXJhY3RlcnMgY2FuIGJlIGluZGljYXRlZCBieSBnaXZpbmcgdHdvCi1jaGFyYWN0ZXJzIGFuZCBzZXBhcmF0aW5nIHRoZW0gYnkgYSBcY2hhcmFjdGVyey19LiAgRm9yIGV4YW1wbGUsCi1ccmVnZXhwe1thYmNdfSB3aWxsIG1hdGNoIGFueSBvZiB0aGUgY2hhcmFjdGVycyBcc2FtcHthfSwgXHNhbXB7Yn0sIG9yCi1cc2FtcHtjfTsgdGhpcyBpcyB0aGUgc2FtZSBhcwotXHJlZ2V4cHtbYS1jXX0sIHdoaWNoIHVzZXMgYSByYW5nZSB0byBleHByZXNzIHRoZSBzYW1lIHNldCBvZgotY2hhcmFjdGVycy4gIElmIHlvdSB3YW50ZWQgdG8gbWF0Y2ggb25seSBsb3dlcmNhc2UgbGV0dGVycywgeW91cgotUkUgd291bGQgYmUgXHJlZ2V4cHtbYS16XX0uCi0KLU1ldGFjaGFyYWN0ZXJzIGFyZSBub3QgYWN0aXZlIGluc2lkZSBjbGFzc2VzLiAgRm9yIGV4YW1wbGUsCi1ccmVnZXhwe1tha21cJF19IHdpbGwgbWF0Y2ggYW55IG9mIHRoZSBjaGFyYWN0ZXJzIFxjaGFyYWN0ZXJ7YX0sCi1cY2hhcmFjdGVye2t9LCBcY2hhcmFjdGVye219LCBvciBcY2hhcmFjdGVye1wkfTsgXGNoYXJhY3RlcntcJH0gaXMKLXVzdWFsbHkgYSBtZXRhY2hhcmFjdGVyLCBidXQgaW5zaWRlIGEgY2hhcmFjdGVyIGNsYXNzIGl0J3Mgc3RyaXBwZWQgb2YKLWl0cyBzcGVjaWFsIG5hdHVyZS4KLQotWW91IGNhbiBtYXRjaCB0aGUgY2hhcmFjdGVycyBub3QgbGlzdGVkIHdpdGhpbiB0aGUgY2xhc3MgYnkKLVxkZm57Y29tcGxlbWVudGluZ30gdGhlIHNldC4gIFRoaXMgaXMgaW5kaWNhdGVkIGJ5IGluY2x1ZGluZyBhCi1cY2hhcmFjdGVye1xefSBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBjbGFzczsgXGNoYXJhY3RlcntcXn0KLW91dHNpZGUgYSBjaGFyYWN0ZXIgY2xhc3Mgd2lsbCBzaW1wbHkgbWF0Y2ggdGhlCi1cY2hhcmFjdGVye1xefSBjaGFyYWN0ZXIuICBGb3IgZXhhbXBsZSwgXHZlcmJ8W141XXwgd2lsbCBtYXRjaCBhbnkKLWNoYXJhY3RlciBleGNlcHQgXGNoYXJhY3Rlcns1fS4KLQotUGVyaGFwcyB0aGUgbW9zdCBpbXBvcnRhbnQgbWV0YWNoYXJhY3RlciBpcyB0aGUgYmFja3NsYXNoLCBcc2FtcHtcZX0uICAKLUFzIGluIFB5dGhvbiBzdHJpbmcgbGl0ZXJhbHMsIHRoZSBiYWNrc2xhc2ggY2FuIGJlIGZvbGxvd2VkIGJ5IHZhcmlvdXMKLWNoYXJhY3RlcnMgdG8gc2lnbmFsIHZhcmlvdXMgc3BlY2lhbCBzZXF1ZW5jZXMuICBJdCdzIGFsc28gdXNlZCB0byBlc2NhcGUKLWFsbCB0aGUgbWV0YWNoYXJhY3RlcnMgc28geW91IGNhbiBzdGlsbCBtYXRjaCB0aGVtIGluIHBhdHRlcm5zOyBmb3IKLWV4YW1wbGUsIGlmIHlvdSBuZWVkIHRvIG1hdGNoIGEgXHNhbXB7W30gb3IgCi1cc2FtcHtcZX0sIHlvdSBjYW4gcHJlY2VkZSB0aGVtIHdpdGggYSBiYWNrc2xhc2ggdG8gcmVtb3ZlIHRoZWlyCi1zcGVjaWFsIG1lYW5pbmc6IFxyZWdleHB7XGVbfSBvciBccmVnZXhwe1xlXGV9LgotCi1Tb21lIG9mIHRoZSBzcGVjaWFsIHNlcXVlbmNlcyBiZWdpbm5pbmcgd2l0aCBcY2hhcmFjdGVye1xlfSByZXByZXNlbnQKLXByZWRlZmluZWQgc2V0cyBvZiBjaGFyYWN0ZXJzIHRoYXQgYXJlIG9mdGVuIHVzZWZ1bCwgc3VjaCBhcyB0aGUgc2V0Ci1vZiBkaWdpdHMsIHRoZSBzZXQgb2YgbGV0dGVycywgb3IgdGhlIHNldCBvZiBhbnl0aGluZyB0aGF0IGlzbid0Ci13aGl0ZXNwYWNlLiAgVGhlIGZvbGxvd2luZyBwcmVkZWZpbmVkIHNwZWNpYWwgc2VxdWVuY2VzIGFyZSBhdmFpbGFibGU6Ci0KLVxiZWdpbntpdGVtaXplfQotXGl0ZW1bXGNvZGV7XGUgZH1dTWF0Y2hlcyBhbnkgZGVjaW1hbCBkaWdpdDsgdGhpcyBpcwotZXF1aXZhbGVudCB0byB0aGUgY2xhc3MgXHJlZ2V4cHtbMC05XX0uCi0KLVxpdGVtW1xjb2Rle1xlIER9XU1hdGNoZXMgYW55IG5vbi1kaWdpdCBjaGFyYWN0ZXI7IHRoaXMgaXMKLWVxdWl2YWxlbnQgdG8gdGhlIGNsYXNzIFx2ZXJifFteMC05XXwuCi0KLVxpdGVtW1xjb2Rle1xlIHN9XU1hdGNoZXMgYW55IHdoaXRlc3BhY2UgY2hhcmFjdGVyOyB0aGlzIGlzCi1lcXVpdmFsZW50IHRvIHRoZSBjbGFzcyBccmVnZXhwe1sgXGUgdFxlIG5cZSByXGUgZlxlIHZdfS4KLQotXGl0ZW1bXGNvZGV7XGUgU31dTWF0Y2hlcyBhbnkgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyOyB0aGlzIGlzCi1lcXVpdmFsZW50IHRvIHRoZSBjbGFzcyBcdmVyYnxbXiBcdFxuXHJcZlx2XXwuCi0KLVxpdGVtW1xjb2Rle1xlIHd9XU1hdGNoZXMgYW55IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXI7IHRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgY2xhc3MKLVxyZWdleHB7W2EtekEtWjAtOV9dfS4gIAotCi1caXRlbVtcY29kZXtcZSBXfV1NYXRjaGVzIGFueSBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcjsgdGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBjbGFzcwotXHZlcmJ8W15hLXpBLVowLTlfXXwuICAgCi1cZW5ke2l0ZW1pemV9Ci0KLVRoZXNlIHNlcXVlbmNlcyBjYW4gYmUgaW5jbHVkZWQgaW5zaWRlIGEgY2hhcmFjdGVyIGNsYXNzLiAgRm9yCi1leGFtcGxlLCBccmVnZXhwe1tcZSBzLC5dfSBpcyBhIGNoYXJhY3RlciBjbGFzcyB0aGF0IHdpbGwgbWF0Y2ggYW55Ci13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgb3IgXGNoYXJhY3RlcnssfSBvciBcY2hhcmFjdGVyey59LgotCi1UaGUgZmluYWwgbWV0YWNoYXJhY3RlciBpbiB0aGlzIHNlY3Rpb24gaXMgXHJlZ2V4cHsufS4gIEl0IG1hdGNoZXMKLWFueXRoaW5nIGV4Y2VwdCBhIG5ld2xpbmUgY2hhcmFjdGVyLCBhbmQgdGhlcmUncyBhbiBhbHRlcm5hdGUgbW9kZQotKFxjb2Rle3JlLkRPVEFMTH0pIHdoZXJlIGl0IHdpbGwgbWF0Y2ggZXZlbiBhIG5ld2xpbmUuICBcY2hhcmFjdGVyey59Ci1pcyBvZnRlbiB1c2VkIHdoZXJlIHlvdSB3YW50IHRvIG1hdGNoIGBgYW55IGNoYXJhY3RlcicnLiAgCi0KLVxzdWJzZWN0aW9ue1JlcGVhdGluZyBUaGluZ3N9Ci0KLUJlaW5nIGFibGUgdG8gbWF0Y2ggdmFyeWluZyBzZXRzIG9mIGNoYXJhY3RlcnMgaXMgdGhlIGZpcnN0IHRoaW5nCi1yZWd1bGFyIGV4cHJlc3Npb25zIGNhbiBkbyB0aGF0IGlzbid0IGFscmVhZHkgcG9zc2libGUgd2l0aCB0aGUKLW1ldGhvZHMgYXZhaWxhYmxlIG9uIHN0cmluZ3MuICBIb3dldmVyLCBpZiB0aGF0IHdhcyB0aGUgb25seQotYWRkaXRpb25hbCBjYXBhYmlsaXR5IG9mIHJlZ2V4ZXMsIHRoZXkgd291bGRuJ3QgYmUgbXVjaCBvZiBhbiBhZHZhbmNlLgotQW5vdGhlciBjYXBhYmlsaXR5IGlzIHRoYXQgeW91IGNhbiBzcGVjaWZ5IHRoYXQgcG9ydGlvbnMgb2YgdGhlIFJFCi1tdXN0IGJlIHJlcGVhdGVkIGEgY2VydGFpbiBudW1iZXIgb2YgdGltZXMuCi0KLVRoZSBmaXJzdCBtZXRhY2hhcmFjdGVyIGZvciByZXBlYXRpbmcgdGhpbmdzIHRoYXQgd2UnbGwgbG9vayBhdCBpcwotXHJlZ2V4cHsqfS4gIFxyZWdleHB7Kn0gZG9lc24ndCBtYXRjaCB0aGUgbGl0ZXJhbCBjaGFyYWN0ZXIgXHNhbXB7Kn07Ci1pbnN0ZWFkLCBpdCBzcGVjaWZpZXMgdGhhdCB0aGUgcHJldmlvdXMgY2hhcmFjdGVyIGNhbiBiZSBtYXRjaGVkIHplcm8KLW9yIG1vcmUgdGltZXMsIGluc3RlYWQgb2YgZXhhY3RseSBvbmNlLgotCi1Gb3IgZXhhbXBsZSwgXHJlZ2V4cHtjYSp0fSB3aWxsIG1hdGNoIFxzYW1we2N0fSAoMCBcc2FtcHthfQotY2hhcmFjdGVycyksIFxzYW1we2NhdH0gKDEgXHNhbXB7YX0pLCBcc2FtcHtjYWFhdH0gKDMgXHNhbXB7YX0KLWNoYXJhY3RlcnMpLCBhbmQgc28gZm9ydGguICBUaGUgUkUgZW5naW5lIGhhcyB2YXJpb3VzIGludGVybmFsCi1saW1pdGF0aW9ucyBzdGVtbWluZyBmcm9tIHRoZSBzaXplIG9mIEMncyBcY29kZXtpbnR9IHR5cGUgdGhhdCB3aWxsCi1wcmV2ZW50IGl0IGZyb20gbWF0Y2hpbmcgb3ZlciAyIGJpbGxpb24gXHNhbXB7YX0gY2hhcmFjdGVyczsgeW91Ci1wcm9iYWJseSBkb24ndCBoYXZlIGVub3VnaCBtZW1vcnkgdG8gY29uc3RydWN0IGEgc3RyaW5nIHRoYXQgbGFyZ2UsIHNvCi15b3Ugc2hvdWxkbid0IHJ1biBpbnRvIHRoYXQgbGltaXQuCi0KLVJlcGV0aXRpb25zIHN1Y2ggYXMgXHJlZ2V4cHsqfSBhcmUgXGRmbntncmVlZHl9OyB3aGVuIHJlcGVhdGluZyBhIFJFLAotdGhlIG1hdGNoaW5nIGVuZ2luZSB3aWxsIHRyeSB0byByZXBlYXQgaXQgYXMgbWFueSB0aW1lcyBhcyBwb3NzaWJsZS4KLUlmIGxhdGVyIHBvcnRpb25zIG9mIHRoZSBwYXR0ZXJuIGRvbid0IG1hdGNoLCB0aGUgbWF0Y2hpbmcgZW5naW5lIHdpbGwKLXRoZW4gYmFjayB1cCBhbmQgdHJ5IGFnYWluIHdpdGggZmV3IHJlcGV0aXRpb25zLgotCi1BIHN0ZXAtYnktc3RlcCBleGFtcGxlIHdpbGwgbWFrZSB0aGlzIG1vcmUgb2J2aW91cy4gIExldCdzIGNvbnNpZGVyCi10aGUgZXhwcmVzc2lvbiBccmVnZXhwe2FbYmNkXSpifS4gIFRoaXMgbWF0Y2hlcyB0aGUgbGV0dGVyCi1cY2hhcmFjdGVye2F9LCB6ZXJvIG9yIG1vcmUgbGV0dGVycyBmcm9tIHRoZSBjbGFzcyBcY29kZXtbYmNkXX0sIGFuZAotZmluYWxseSBlbmRzIHdpdGggYSBcY2hhcmFjdGVye2J9LiAgTm93IGltYWdpbmUgbWF0Y2hpbmcgdGhpcyBSRQotYWdhaW5zdCB0aGUgc3RyaW5nIFxzYW1we2FiY2JkfS4gIAotCi1cYmVnaW57dGFibGVpaWl9e2N8bHxsfXt9e1N0ZXB9e01hdGNoZWR9e0V4cGxhbmF0aW9ufQotXGxpbmVpaWl7MX17XGNvZGV7YX19e1RoZSBccmVnZXhwe2F9IGluIHRoZSBSRSBtYXRjaGVzLn0KLVxsaW5laWlpezJ9e1xjb2Rle2FiY2JkfX17VGhlIGVuZ2luZSBtYXRjaGVzIFxyZWdleHB7W2JjZF0qfSwgZ29pbmcgYXMgZmFyIGFzCi1pdCBjYW4sIHdoaWNoIGlzIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZy59Ci1cbGluZWlpaXszfXtcZW1waHtGYWlsdXJlfX17VGhlIGVuZ2luZSB0cmllcyB0byBtYXRjaCBccmVnZXhwe2J9LCBidXQgdGhlCi1jdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZywgc28gaXQgZmFpbHMufQotXGxpbmVpaWl7NH17XGNvZGV7YWJjYn19e0JhY2sgdXAsIHNvIHRoYXQgIFxyZWdleHB7W2JjZF0qfSBtYXRjaGVzCi1vbmUgbGVzcyBjaGFyYWN0ZXIufQotXGxpbmVpaWl7NX17XGVtcGh7RmFpbHVyZX19e1RyeSBccmVnZXhwe2J9IGFnYWluLCBidXQgdGhlCi1jdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBsYXN0IGNoYXJhY3Rlciwgd2hpY2ggaXMgYSBcY2hhcmFjdGVye2R9Ln0KLVxsaW5laWlpezZ9e1xjb2Rle2FiY319e0JhY2sgdXAgYWdhaW4sIHNvIHRoYXQgIFxyZWdleHB7W2JjZF0qfSBpcwotb25seSBtYXRjaGluZyBcc2FtcHtiY30ufQotXGxpbmVpaWl7Nn17XGNvZGV7YWJjYn19e1RyeSBccmVnZXhwe2J9IGFnYWluLiAgVGhpcyB0aW1lIAotYnV0IHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgXGNoYXJhY3RlcntifSwgc28gaXQgc3VjY2VlZHMufQotXGVuZHt0YWJsZWlpaX0KLQotVGhlIGVuZCBvZiB0aGUgUkUgaGFzIG5vdyBiZWVuIHJlYWNoZWQsIGFuZCBpdCBoYXMgbWF0Y2hlZAotXHNhbXB7YWJjYn0uICBUaGlzIGRlbW9uc3RyYXRlcyBob3cgdGhlIG1hdGNoaW5nIGVuZ2luZSBnb2VzIGFzIGZhciBhcwotaXQgY2FuIGF0IGZpcnN0LCBhbmQgaWYgbm8gbWF0Y2ggaXMgZm91bmQgaXQgd2lsbCB0aGVuIHByb2dyZXNzaXZlbHkKLWJhY2sgdXAgYW5kIHJldHJ5IHRoZSByZXN0IG9mIHRoZSBSRSBhZ2FpbiBhbmQgYWdhaW4uICBJdCB3aWxsIGJhY2sgdXAKLXVudGlsIGl0IGhhcyB0cmllZCB6ZXJvIG1hdGNoZXMgZm9yIFxyZWdleHB7W2JjZF0qfSwgYW5kIGlmIHRoYXQKLXN1YnNlcXVlbnRseSBmYWlscywgdGhlIGVuZ2luZSB3aWxsIGNvbmNsdWRlIHRoYXQgdGhlIHN0cmluZyBkb2Vzbid0Ci1tYXRjaCB0aGUgUkUgYXQgYWxsLgotCi1Bbm90aGVyIHJlcGVhdGluZyBtZXRhY2hhcmFjdGVyIGlzIFxyZWdleHB7K30sIHdoaWNoIG1hdGNoZXMgb25lIG9yCi1tb3JlIHRpbWVzLiAgUGF5IGNhcmVmdWwgYXR0ZW50aW9uIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KLVxyZWdleHB7Kn0gYW5kIFxyZWdleHB7K307IFxyZWdleHB7Kn0gbWF0Y2hlcyBcZW1waHt6ZXJvfSBvciBtb3JlCi10aW1lcywgc28gd2hhdGV2ZXIncyBiZWluZyByZXBlYXRlZCBtYXkgbm90IGJlIHByZXNlbnQgYXQgYWxsLCB3aGlsZQotXHJlZ2V4cHsrfSByZXF1aXJlcyBhdCBsZWFzdCBcZW1waHtvbmV9IG9jY3VycmVuY2UuICBUbyB1c2UgYSBzaW1pbGFyCi1leGFtcGxlLCBccmVnZXhwe2NhK3R9IHdpbGwgbWF0Y2ggXHNhbXB7Y2F0fSAoMSBcc2FtcHthfSksCi1cc2FtcHtjYWFhdH0gKDMgXHNhbXB7YX0ncyksIGJ1dCB3b24ndCBtYXRjaCBcc2FtcHtjdH0uCi0KLVRoZXJlIGFyZSB0d28gbW9yZSByZXBlYXRpbmcgcXVhbGlmaWVycy4gIFRoZSBxdWVzdGlvbiBtYXJrIGNoYXJhY3RlciwKLVxyZWdleHB7P30sIG1hdGNoZXMgZWl0aGVyIG9uY2Ugb3IgemVybyB0aW1lczsgeW91IGNhbiB0aGluayBvZiBpdCBhcwotbWFya2luZyBzb21ldGhpbmcgYXMgYmVpbmcgb3B0aW9uYWwuICBGb3IgZXhhbXBsZSwgXHJlZ2V4cHtob21lLT9icmV3fQotbWF0Y2hlcyBlaXRoZXIgXHNhbXB7aG9tZWJyZXd9IG9yIFxzYW1we2hvbWUtYnJld30uICAKLQotVGhlIG1vc3QgY29tcGxpY2F0ZWQgcmVwZWF0ZWQgcXVhbGlmaWVyIGlzCi1ccmVnZXhwe1x7XHZhcnttfSxcdmFye259XH19LCB3aGVyZSBcdmFye219IGFuZCBcdmFye259IGFyZSBkZWNpbWFsCi1pbnRlZ2Vycy4gIFRoaXMgcXVhbGlmaWVyIG1lYW5zIHRoZXJlIG11c3QgYmUgYXQgbGVhc3QgXHZhcnttfQotcmVwZXRpdGlvbnMsIGFuZCBhdCBtb3N0IFx2YXJ7bn0uICBGb3IgZXhhbXBsZSwgXHJlZ2V4cHthL1x7MSwzXH1ifQotd2lsbCBtYXRjaCBcc2FtcHthL2J9LCBcc2FtcHthLy9ifSwgYW5kIFxzYW1we2EvLy9ifS4gIEl0IHdvbid0IG1hdGNoCi1cc2FtcHthYn0sIHdoaWNoIGhhcyBubyBzbGFzaGVzLCBvciBcc2FtcHthLy8vL2J9LCB3aGljaCBoYXMgZm91ci4KLQotWW91IGNhbiBvbWl0IGVpdGhlciBcdmFye219IG9yIFx2YXJ7bn07IGluIHRoYXQgY2FzZSwgYSByZWFzb25hYmxlCi12YWx1ZSBpcyBhc3N1bWVkIGZvciB0aGUgbWlzc2luZyB2YWx1ZS4gIE9taXR0aW5nIFx2YXJ7bX0gaXMKLWludGVycHJldGVkIGFzIGEgbG93ZXIgbGltaXQgb2YgMCwgd2hpbGUgb21pdHRpbmcgXHZhcntufSByZXN1bHRzIGluCi1hbiB1cHBlciBib3VuZCBvZiBpbmZpbml0eSAtLS0gYWN0dWFsbHksIHRoZSB1cHBlciBib3VuZCBpcyB0aGUKLTItYmlsbGlvbiBsaW1pdCBtZW50aW9uZWQgZWFybGllciwgYnV0IHRoYXQgbWlnaHQgYXMgd2VsbCBiZSBpbmZpbml0eS4KLQotUmVhZGVycyBvZiBhIHJlZHVjdGlvbmlzdCBiZW50IG1heSBub3RpY2UgdGhhdCB0aGUgdGhyZWUgb3RoZXIgcXVhbGlmaWVycwotY2FuIGFsbCBiZSBleHByZXNzZWQgdXNpbmcgdGhpcyBub3RhdGlvbi4gIFxyZWdleHB7XHswLFx9fSBpcyB0aGUgc2FtZQotYXMgXHJlZ2V4cHsqfSwgXHJlZ2V4cHtcezEsXH19IGlzIGVxdWl2YWxlbnQgdG8gXHJlZ2V4cHsrfSwgYW5kCi1ccmVnZXhwe1x7MCwxXH19IGlzIHRoZSBzYW1lIGFzIFxyZWdleHB7P30uICBJdCdzIGJldHRlciB0byB1c2UKLVxyZWdleHB7Kn0sIFxyZWdleHB7K30sIG9yIFxyZWdleHB7P30gd2hlbiB5b3UgY2FuLCBzaW1wbHkgYmVjYXVzZQotdGhleSdyZSBzaG9ydGVyIGFuZCBlYXNpZXIgdG8gcmVhZC4KLQotXHNlY3Rpb257VXNpbmcgUmVndWxhciBFeHByZXNzaW9uc30KLQotTm93IHRoYXQgd2UndmUgbG9va2VkIGF0IHNvbWUgc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIGhvdyBkbyB3ZQotYWN0dWFsbHkgdXNlIHRoZW0gaW4gUHl0aG9uPyAgVGhlIFxtb2R1bGV7cmV9IG1vZHVsZSBwcm92aWRlcyBhbgotaW50ZXJmYWNlIHRvIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZW5naW5lLCBhbGxvd2luZyB5b3UgdG8gY29tcGlsZQotUkVzIGludG8gb2JqZWN0cyBhbmQgdGhlbiBwZXJmb3JtIG1hdGNoZXMgd2l0aCB0aGVtLgotCi1cc3Vic2VjdGlvbntDb21waWxpbmcgUmVndWxhciBFeHByZXNzaW9uc30KLQotUmVndWxhciBleHByZXNzaW9ucyBhcmUgY29tcGlsZWQgaW50byBcY2xhc3N7UmVnZXhPYmplY3R9IGluc3RhbmNlcywKLXdoaWNoIGhhdmUgbWV0aG9kcyBmb3IgdmFyaW91cyBvcGVyYXRpb25zIHN1Y2ggYXMgc2VhcmNoaW5nIGZvcgotcGF0dGVybiBtYXRjaGVzIG9yIHBlcmZvcm1pbmcgc3RyaW5nIHN1YnN0aXR1dGlvbnMuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgcmUKLT4+PiBwID0gcmUuY29tcGlsZSgnYWIqJykKLT4+PiBwcmludCBwCi08cmUuUmVnZXhPYmplY3QgaW5zdGFuY2UgYXQgODBiNDE1MD4KLVxlbmR7dmVyYmF0aW19Ci0KLVxmdW5jdGlvbntyZS5jb21waWxlKCl9IGFsc28gYWNjZXB0cyBhbiBvcHRpb25hbCBcdmFye2ZsYWdzfQotYXJndW1lbnQsIHVzZWQgdG8gZW5hYmxlIHZhcmlvdXMgc3BlY2lhbCBmZWF0dXJlcyBhbmQgc3ludGF4Ci12YXJpYXRpb25zLiAgV2UnbGwgZ28gb3ZlciB0aGUgYXZhaWxhYmxlIHNldHRpbmdzIGxhdGVyLCBidXQgZm9yIG5vdyBhCi1zaW5nbGUgZXhhbXBsZSB3aWxsIGRvOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gcCA9IHJlLmNvbXBpbGUoJ2FiKicsIHJlLklHTk9SRUNBU0UpCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgUkUgaXMgcGFzc2VkIHRvIFxmdW5jdGlvbntyZS5jb21waWxlKCl9IGFzIGEgc3RyaW5nLiAgUkVzIGFyZQotaGFuZGxlZCBhcyBzdHJpbmdzIGJlY2F1c2UgcmVndWxhciBleHByZXNzaW9ucyBhcmVuJ3QgcGFydCBvZiB0aGUgY29yZQotUHl0aG9uIGxhbmd1YWdlLCBhbmQgbm8gc3BlY2lhbCBzeW50YXggd2FzIGNyZWF0ZWQgZm9yIGV4cHJlc3NpbmcKLXRoZW0uICAoVGhlcmUgYXJlIGFwcGxpY2F0aW9ucyB0aGF0IGRvbid0IG5lZWQgUkVzIGF0IGFsbCwgc28gdGhlcmUncwotbm8gbmVlZCB0byBibG9hdCB0aGUgbGFuZ3VhZ2Ugc3BlY2lmaWNhdGlvbiBieSBpbmNsdWRpbmcgdGhlbS4pCi1JbnN0ZWFkLCB0aGUgXG1vZHVsZXtyZX0gbW9kdWxlIGlzIHNpbXBseSBhIEMgZXh0ZW5zaW9uIG1vZHVsZQotaW5jbHVkZWQgd2l0aCBQeXRob24sIGp1c3QgbGlrZSB0aGUgXG1vZHVsZXtzb2NrZXR9IG9yIFxtb2R1bGV7emxpYn0KLW1vZHVsZXMuCi0KLVB1dHRpbmcgUkVzIGluIHN0cmluZ3Mga2VlcHMgdGhlIFB5dGhvbiBsYW5ndWFnZSBzaW1wbGVyLCBidXQgaGFzIG9uZQotZGlzYWR2YW50YWdlIHdoaWNoIGlzIHRoZSB0b3BpYyBvZiB0aGUgbmV4dCBzZWN0aW9uLgotCi1cc3Vic2VjdGlvbntUaGUgQmFja3NsYXNoIFBsYWd1ZX0KLQotQXMgc3RhdGVkIGVhcmxpZXIsIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdXNlIHRoZSBiYWNrc2xhc2gKLWNoYXJhY3RlciAoXGNoYXJhY3RlcntcZX0pIHRvIGluZGljYXRlIHNwZWNpYWwgZm9ybXMgb3IgdG8gYWxsb3cKLXNwZWNpYWwgY2hhcmFjdGVycyB0byBiZSB1c2VkIHdpdGhvdXQgaW52b2tpbmcgdGhlaXIgc3BlY2lhbCBtZWFuaW5nLgotVGhpcyBjb25mbGljdHMgd2l0aCBQeXRob24ncyB1c2FnZSBvZiB0aGUgc2FtZSBjaGFyYWN0ZXIgZm9yIHRoZSBzYW1lCi1wdXJwb3NlIGluIHN0cmluZyBsaXRlcmFscy4KLQotTGV0J3Mgc2F5IHlvdSB3YW50IHRvIHdyaXRlIGEgUkUgdGhhdCBtYXRjaGVzIHRoZSBzdHJpbmcKLVxzYW1we3tcZX1zZWN0aW9ufSwgd2hpY2ggbWlnaHQgYmUgZm91bmQgaW4gYSBcTGFUZVhcIGZpbGUuICBUbyBmaWd1cmUKLW91dCB3aGF0IHRvIHdyaXRlIGluIHRoZSBwcm9ncmFtIGNvZGUsIHN0YXJ0IHdpdGggdGhlIGRlc2lyZWQgc3RyaW5nCi10byBiZSBtYXRjaGVkLiAgTmV4dCwgeW91IG11c3QgZXNjYXBlIGFueSBiYWNrc2xhc2hlcyBhbmQgb3RoZXIKLW1ldGFjaGFyYWN0ZXJzIGJ5IHByZWNlZGluZyB0aGVtIHdpdGggYSBiYWNrc2xhc2gsIHJlc3VsdGluZyBpbiB0aGUKLXN0cmluZyBcc2FtcHtcZVxlIHNlY3Rpb259LiAgVGhlIHJlc3VsdGluZyBzdHJpbmcgdGhhdCBtdXN0IGJlIHBhc3NlZAotdG8gXGZ1bmN0aW9ue3JlLmNvbXBpbGUoKX0gbXVzdCBiZSBcdmVyYnxcXHNlY3Rpb258LiAgSG93ZXZlciwgdG8KLWV4cHJlc3MgdGhpcyBhcyBhIFB5dGhvbiBzdHJpbmcgbGl0ZXJhbCwgYm90aCBiYWNrc2xhc2hlcyBtdXN0IGJlCi1lc2NhcGVkIFxlbXBoe2FnYWlufS4KLQotXGJlZ2lue3RhYmxlaWl9e2N8bH17Y29kZX17Q2hhcmFjdGVyc317U3RhZ2V9Ci0gIFxsaW5laWl7XGUgc2VjdGlvbn17VGV4dCBzdHJpbmcgdG8gYmUgbWF0Y2hlZH0KLSAgXGxpbmVpaXtcZVxlIHNlY3Rpb259e0VzY2FwZWQgYmFja3NsYXNoIGZvciBcZnVuY3Rpb257cmUuY29tcGlsZX19Ci0gIFxsaW5laWl7IlxlXGVcZVxlIHNlY3Rpb24ifXtFc2NhcGVkIGJhY2tzbGFzaGVzIGZvciBhIHN0cmluZyBsaXRlcmFsfQotXGVuZHt0YWJsZWlpfQotCi1JbiBzaG9ydCwgdG8gbWF0Y2ggYSBsaXRlcmFsIGJhY2tzbGFzaCwgb25lIGhhcyB0byB3cml0ZQotXGNvZGV7J1xlXGVcZVxlJ30gYXMgdGhlIFJFIHN0cmluZywgYmVjYXVzZSB0aGUgcmVndWxhciBleHByZXNzaW9uCi1tdXN0IGJlIFxzYW1we1xlXGV9LCBhbmQgZWFjaCBiYWNrc2xhc2ggbXVzdCBiZSBleHByZXNzZWQgYXMKLVxzYW1we1xlXGV9IGluc2lkZSBhIHJlZ3VsYXIgUHl0aG9uIHN0cmluZyBsaXRlcmFsLiAgSW4gUkVzIHRoYXQKLWZlYXR1cmUgYmFja3NsYXNoZXMgcmVwZWF0ZWRseSwgdGhpcyBsZWFkcyB0byBsb3RzIG9mIHJlcGVhdGVkCi1iYWNrc2xhc2hlcyBhbmQgbWFrZXMgdGhlIHJlc3VsdGluZyBzdHJpbmdzIGRpZmZpY3VsdCB0byB1bmRlcnN0YW5kLgotCi1UaGUgc29sdXRpb24gaXMgdG8gdXNlIFB5dGhvbidzIHJhdyBzdHJpbmcgbm90YXRpb24gZm9yIHJlZ3VsYXIKLWV4cHJlc3Npb25zOyBiYWNrc2xhc2hlcyBhcmUgbm90IGhhbmRsZWQgaW4gYW55IHNwZWNpYWwgd2F5IGluCi1hIHN0cmluZyBsaXRlcmFsIHByZWZpeGVkIHdpdGggXGNoYXJhY3RlcntyfSwgc28gXGNvZGV7ciJcZSBuIn0gaXMgYQotdHdvLWNoYXJhY3RlciBzdHJpbmcgY29udGFpbmluZyBcY2hhcmFjdGVye1xlfSBhbmQgXGNoYXJhY3RlcntufSwKLXdoaWxlIFxjb2RleyJcZSBuIn0gaXMgYSBvbmUtY2hhcmFjdGVyIHN0cmluZyBjb250YWluaW5nIGEgbmV3bGluZS4KLVJlZ3VsYXIgZXhwcmVzc2lvbnMgd2lsbCBvZnRlbiBiZSB3cml0dGVuIGluIFB5dGhvbgotY29kZSB1c2luZyB0aGlzIHJhdyBzdHJpbmcgbm90YXRpb24uICAKLQotXGJlZ2lue3RhYmxlaWl9e2N8Y317Y29kZX17UmVndWxhciBTdHJpbmd9e1JhdyBzdHJpbmd9Ci0gIFxsaW5laWl7ImFiKiJ9e1xjb2Rle3IiYWIqIn19Ci0gIFxsaW5laWl7IlxlXGVcZVxlIHNlY3Rpb24ifXtcY29kZXtyIlxlXGUgc2VjdGlvbiJ9fQotICBcbGluZWlpeyJcZVxlIHcrXGVcZSBzK1xlXGUgMSJ9e1xjb2Rle3IiXGUgdytcZSBzK1xlIDEifX0KLVxlbmR7dGFibGVpaX0KLQotXHN1YnNlY3Rpb257UGVyZm9ybWluZyBNYXRjaGVzfQotCi1PbmNlIHlvdSBoYXZlIGFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBjb21waWxlZCByZWd1bGFyIGV4cHJlc3Npb24sCi13aGF0IGRvIHlvdSBkbyB3aXRoIGl0PyAgXGNsYXNze1JlZ2V4T2JqZWN0fSBpbnN0YW5jZXMgaGF2ZSBzZXZlcmFsCi1tZXRob2RzIGFuZCBhdHRyaWJ1dGVzLiAgT25seSB0aGUgbW9zdCBzaWduaWZpY2FudCBvbmVzIHdpbGwgYmUKLWNvdmVyZWQgaGVyZTsgY29uc3VsdCBcdWxpbmt7dGhlIExpYnJhcnkKLVJlZmVyZW5jZX17aHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9saWIvbW9kdWxlLXJlLmh0bWx9IGZvciBhCi1jb21wbGV0ZSBsaXN0aW5nLgotCi1cYmVnaW57dGFibGVpaX17Y3xsfXtjb2RlfXtNZXRob2QvQXR0cmlidXRlfXtQdXJwb3NlfQotICBcbGluZWlpe21hdGNoKCl9e0RldGVybWluZSBpZiB0aGUgUkUgbWF0Y2hlcyBhdCB0aGUgYmVnaW5uaW5nIG9mCi0gIHRoZSBzdHJpbmcufQotICBcbGluZWlpe3NlYXJjaCgpfXtTY2FuIHRocm91Z2ggYSBzdHJpbmcsIGxvb2tpbmcgZm9yIGFueSBsb2NhdGlvbgotICB3aGVyZSB0aGlzIFJFIG1hdGNoZXMufQotICBcbGluZWlpe2ZpbmRhbGwoKX17RmluZCBhbGwgc3Vic3RyaW5ncyB3aGVyZSB0aGUgUkUgbWF0Y2hlcywKLWFuZCByZXR1cm5zIHRoZW0gYXMgYSBsaXN0Ln0KLSAgXGxpbmVpaXtmaW5kaXRlcigpfXtGaW5kIGFsbCBzdWJzdHJpbmdzIHdoZXJlIHRoZSBSRSBtYXRjaGVzLAotYW5kIHJldHVybnMgdGhlbSBhcyBhbiBpdGVyYXRvci59Ci1cZW5ke3RhYmxlaWl9Ci0KLVxtZXRob2R7bWF0Y2goKX0gYW5kIFxtZXRob2R7c2VhcmNoKCl9IHJldHVybiBcY29kZXtOb25lfSBpZiBubyBtYXRjaAotY2FuIGJlIGZvdW5kLiAgSWYgdGhleSdyZSBzdWNjZXNzZnVsLCBhIFxjb2Rle01hdGNoT2JqZWN0fSBpbnN0YW5jZSBpcwotcmV0dXJuZWQsIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1hdGNoOiB3aGVyZSBpdCBzdGFydHMgYW5kCi1lbmRzLCB0aGUgc3Vic3RyaW5nIGl0IG1hdGNoZWQsIGFuZCBtb3JlLgotCi1Zb3UgY2FuIGxlYXJuIGFib3V0IHRoaXMgYnkgaW50ZXJhY3RpdmVseSBleHBlcmltZW50aW5nIHdpdGggdGhlCi1cbW9kdWxle3JlfSBtb2R1bGUuICBJZiB5b3UgaGF2ZSBUa2ludGVyIGF2YWlsYWJsZSwgeW91IG1heSBhbHNvIHdhbnQKLXRvIGxvb2sgYXQgXGZpbGV7VG9vbHMvc2NyaXB0cy9yZWRlbW8ucHl9LCBhIGRlbW9uc3RyYXRpb24gcHJvZ3JhbQotaW5jbHVkZWQgd2l0aCB0aGUgUHl0aG9uIGRpc3RyaWJ1dGlvbi4gIEl0IGFsbG93cyB5b3UgdG8gZW50ZXIgUkVzIGFuZAotc3RyaW5ncywgYW5kIGRpc3BsYXlzIHdoZXRoZXIgdGhlIFJFIG1hdGNoZXMgb3IgZmFpbHMuCi1cZmlsZXtyZWRlbW8ucHl9IGNhbiBiZSBxdWl0ZSB1c2VmdWwgd2hlbiB0cnlpbmcgdG8gZGVidWcgYQotY29tcGxpY2F0ZWQgUkUuICBQaGlsIFNjaHdhcnR6J3MKLVx1bGlua3tLb2Rvc317aHR0cDovL3d3dy5waGlsLXNjaHdhcnR6LmNvbS9rb2Rvcy5zcHl9IGlzIGFsc28gYW4gaW50ZXJhY3RpdmUKLXRvb2wgZm9yIGRldmVsb3BpbmcgYW5kIHRlc3RpbmcgUkUgcGF0dGVybnMuICAKLQotVGhpcyBIT1dUTyB1c2VzIHRoZSBzdGFuZGFyZCBQeXRob24gaW50ZXJwcmV0ZXIgZm9yIGl0cyBleGFtcGxlcy4KLUZpcnN0LCBydW4gdGhlIFB5dGhvbiBpbnRlcnByZXRlciwgaW1wb3J0IHRoZSBcbW9kdWxle3JlfSBtb2R1bGUsIGFuZAotY29tcGlsZSBhIFJFOgotCi1cYmVnaW57dmVyYmF0aW19Ci1QeXRob24gMi4yLjIgKCMxLCBGZWIgMTAgMjAwMywgMTI6NTc6MDEpCi0+Pj4gaW1wb3J0IHJlCi0+Pj4gcCA9IHJlLmNvbXBpbGUoJ1thLXpdKycpCi0+Pj4gcAotPF9zcmUuU1JFX1BhdHRlcm4gb2JqZWN0IGF0IDgwYzNjMjg+Ci1cZW5ke3ZlcmJhdGltfQotCi1Ob3csIHlvdSBjYW4gdHJ5IG1hdGNoaW5nIHZhcmlvdXMgc3RyaW5ncyBhZ2FpbnN0IHRoZSBSRQotXHJlZ2V4cHtbYS16XSt9LiAgQW4gZW1wdHkgc3RyaW5nIHNob3VsZG4ndCBtYXRjaCBhdCBhbGwsIHNpbmNlCi1ccmVnZXhweyt9IG1lYW5zICdvbmUgb3IgbW9yZSByZXBldGl0aW9ucycuICBcbWV0aG9ke21hdGNoKCl9IHNob3VsZAotcmV0dXJuIFxjb2Rle05vbmV9IGluIHRoaXMgY2FzZSwgd2hpY2ggd2lsbCBjYXVzZSB0aGUgaW50ZXJwcmV0ZXIgdG8KLXByaW50IG5vIG91dHB1dC4gIFlvdSBjYW4gZXhwbGljaXRseSBwcmludCB0aGUgcmVzdWx0IG9mCi1cbWV0aG9ke21hdGNoKCl9IHRvIG1ha2UgdGhpcyBjbGVhci4KLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHAubWF0Y2goIiIpCi0+Pj4gcHJpbnQgcC5tYXRjaCgiIikKLU5vbmUKLVxlbmR7dmVyYmF0aW19Ci0KLU5vdywgbGV0J3MgdHJ5IGl0IG9uIGEgc3RyaW5nIHRoYXQgaXQgc2hvdWxkIG1hdGNoLCBzdWNoIGFzCi1cc2FtcHt0ZW1wb30uICBJbiB0aGlzIGNhc2UsIFxtZXRob2R7bWF0Y2goKX0gd2lsbCByZXR1cm4gYQotXGNsYXNze01hdGNoT2JqZWN0fSwgc28geW91IHNob3VsZCBzdG9yZSB0aGUgcmVzdWx0IGluIGEgdmFyaWFibGUgZm9yCi1sYXRlciB1c2UuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBtID0gcC5tYXRjaCgndGVtcG8nKQotPj4+IHByaW50IG0KLTxfc3JlLlNSRV9NYXRjaCBvYmplY3QgYXQgODBjNGY2OD4KLVxlbmR7dmVyYmF0aW19Ci0KLU5vdyB5b3UgY2FuIHF1ZXJ5IHRoZSBcY2xhc3N7TWF0Y2hPYmplY3R9IGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLW1hdGNoaW5nIHN0cmluZy4gICBcY2xhc3N7TWF0Y2hPYmplY3R9IGluc3RhbmNlcyBhbHNvIGhhdmUgc2V2ZXJhbAotbWV0aG9kcyBhbmQgYXR0cmlidXRlczsgdGhlIG1vc3QgaW1wb3J0YW50IG9uZXMgYXJlOgotCi1cYmVnaW57dGFibGVpaX17Y3xsfXtjb2RlfXtNZXRob2QvQXR0cmlidXRlfXtQdXJwb3NlfQotICBcbGluZWlpe2dyb3VwKCl9e1JldHVybiB0aGUgc3RyaW5nIG1hdGNoZWQgYnkgdGhlIFJFfQotICBcbGluZWlpe3N0YXJ0KCl9e1JldHVybiB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIG1hdGNofQotICBcbGluZWlpe2VuZCgpfXtSZXR1cm4gdGhlIGVuZGluZyBwb3NpdGlvbiBvZiB0aGUgbWF0Y2h9Ci0gIFxsaW5laWl7c3BhbigpfXtSZXR1cm4gYSB0dXBsZSBjb250YWluaW5nIHRoZSAoc3RhcnQsIGVuZCkgcG9zaXRpb25zIAotICAgICAgICAgICAgICAgICAgb2YgdGhlIG1hdGNofQotXGVuZHt0YWJsZWlpfQotCi1UcnlpbmcgdGhlc2UgbWV0aG9kcyB3aWxsIHNvb24gY2xhcmlmeSB0aGVpciBtZWFuaW5nOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gbS5ncm91cCgpCi0ndGVtcG8nCi0+Pj4gbS5zdGFydCgpLCBtLmVuZCgpCi0oMCwgNSkKLT4+PiBtLnNwYW4oKQotKDAsIDUpCi1cZW5ke3ZlcmJhdGltfQotCi1cbWV0aG9ke2dyb3VwKCl9IHJldHVybnMgdGhlIHN1YnN0cmluZyB0aGF0IHdhcyBtYXRjaGVkIGJ5IHRoZQotUkUuICBcbWV0aG9ke3N0YXJ0KCl9IGFuZCBcbWV0aG9ke2VuZCgpfSByZXR1cm4gdGhlIHN0YXJ0aW5nIGFuZAotZW5kaW5nIGluZGV4IG9mIHRoZSBtYXRjaC4gXG1ldGhvZHtzcGFuKCl9IHJldHVybnMgYm90aCBzdGFydCBhbmQgZW5kCi1pbmRleGVzIGluIGEgc2luZ2xlIHR1cGxlLiAgU2luY2UgdGhlIFxtZXRob2R7bWF0Y2h9IG1ldGhvZCBvbmx5Ci1jaGVja3MgaWYgdGhlIFJFIG1hdGNoZXMgYXQgdGhlIHN0YXJ0IG9mIGEgc3RyaW5nLAotXG1ldGhvZHtzdGFydCgpfSB3aWxsIGFsd2F5cyBiZSB6ZXJvLiAgSG93ZXZlciwgdGhlIFxtZXRob2R7c2VhcmNofQotbWV0aG9kIG9mIFxjbGFzc3tSZWdleE9iamVjdH0gaW5zdGFuY2VzIHNjYW5zIHRocm91Z2ggdGhlIHN0cmluZywgc28gCi10aGUgbWF0Y2ggbWF5IG5vdCBzdGFydCBhdCB6ZXJvIGluIHRoYXQgY2FzZS4KLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHByaW50IHAubWF0Y2goJzo6OiBtZXNzYWdlJykKLU5vbmUKLT4+PiBtID0gcC5zZWFyY2goJzo6OiBtZXNzYWdlJykgOyBwcmludCBtCi08cmUuTWF0Y2hPYmplY3QgaW5zdGFuY2UgYXQgODBjOTY1MD4KLT4+PiBtLmdyb3VwKCkKLSdtZXNzYWdlJwotPj4+IG0uc3BhbigpCi0oNCwgMTEpCi1cZW5ke3ZlcmJhdGltfQotCi1JbiBhY3R1YWwgcHJvZ3JhbXMsIHRoZSBtb3N0IGNvbW1vbiBzdHlsZSBpcyB0byBzdG9yZSB0aGUKLVxjbGFzc3tNYXRjaE9iamVjdH0gaW4gYSB2YXJpYWJsZSwgYW5kIHRoZW4gY2hlY2sgaWYgaXQgd2FzCi1cY29kZXtOb25lfS4gIFRoaXMgdXN1YWxseSBsb29rcyBsaWtlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1wID0gcmUuY29tcGlsZSggLi4uICkKLW0gPSBwLm1hdGNoKCAnc3RyaW5nIGdvZXMgaGVyZScgKQotaWYgbToKLSAgICBwcmludCAnTWF0Y2ggZm91bmQ6ICcsIG0uZ3JvdXAoKQotZWxzZToKLSAgICBwcmludCAnTm8gbWF0Y2gnCi1cZW5ke3ZlcmJhdGltfQotCi1Ud28gXGNsYXNze1JlZ2V4T2JqZWN0fSBtZXRob2RzIHJldHVybiBhbGwgb2YgdGhlIG1hdGNoZXMgZm9yIGEgcGF0dGVybi4KLVxtZXRob2R7ZmluZGFsbCgpfSByZXR1cm5zIGEgbGlzdCBvZiBtYXRjaGluZyBzdHJpbmdzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gcCA9IHJlLmNvbXBpbGUoJ1xkKycpCi0+Pj4gcC5maW5kYWxsKCcxMiBkcnVtbWVycyBkcnVtbWluZywgMTEgcGlwZXJzIHBpcGluZywgMTAgbG9yZHMgYS1sZWFwaW5nJykKLVsnMTInLCAnMTEnLCAnMTAnXQotXGVuZHt2ZXJiYXRpbX0KLQotXG1ldGhvZHtmaW5kYWxsKCl9IGhhcyB0byBjcmVhdGUgdGhlIGVudGlyZSBsaXN0IGJlZm9yZSBpdCBjYW4gYmUKLXJldHVybmVkIGFzIHRoZSByZXN1bHQuICBUaGUgXG1ldGhvZHtmaW5kaXRlcigpfSBtZXRob2QgcmV0dXJucyBhCi1zZXF1ZW5jZSBvZiBcY2xhc3N7TWF0Y2hPYmplY3R9IGluc3RhbmNlcyBhcyBhbgotaXRlcmF0b3IuXGZvb3Rub3Rle0ludHJvZHVjZWQgaW4gUHl0aG9uIDIuMi4yLn0KLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGl0ZXJhdG9yID0gcC5maW5kaXRlcignMTIgZHJ1bW1lcnMgZHJ1bW1pbmcsIDExIC4uLiAxMCAuLi4nKQotPj4+IGl0ZXJhdG9yCi08Y2FsbGFibGUtaXRlcmF0b3Igb2JqZWN0IGF0IDB4NDAxODMzYWM+Ci0+Pj4gZm9yIG1hdGNoIGluIGl0ZXJhdG9yOgotLi4uICAgICBwcmludCBtYXRjaC5zcGFuKCkKLS4uLgotKDAsIDIpCi0oMjIsIDI0KQotKDI5LCAzMSkKLVxlbmR7dmVyYmF0aW19Ci0KLQotXHN1YnNlY3Rpb257TW9kdWxlLUxldmVsIEZ1bmN0aW9uc30KLQotWW91IGRvbid0IGhhdmUgdG8gY3JlYXRlIGEgXGNsYXNze1JlZ2V4T2JqZWN0fSBhbmQgY2FsbCBpdHMgbWV0aG9kczsKLXRoZSBcbW9kdWxle3JlfSBtb2R1bGUgYWxzbyBwcm92aWRlcyB0b3AtbGV2ZWwgZnVuY3Rpb25zIGNhbGxlZAotXGZ1bmN0aW9ue21hdGNoKCl9LCBcZnVuY3Rpb257c2VhcmNoKCl9LCBcZnVuY3Rpb257ZmluZGFsbCgpfSwKLVxmdW5jdGlvbntzdWIoKX0sIGFuZCBzbyBmb3J0aC4gIFRoZXNlIGZ1bmN0aW9ucyB0YWtlIHRoZSBzYW1lCi1hcmd1bWVudHMgYXMgdGhlIGNvcnJlc3BvbmRpbmcgXGNsYXNze1JlZ2V4T2JqZWN0fSBtZXRob2QsIHdpdGggdGhlIFJFCi1zdHJpbmcgYWRkZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LCBhbmQgc3RpbGwgcmV0dXJuIGVpdGhlcgotXGNvZGV7Tm9uZX0gb3IgYSBcY2xhc3N7TWF0Y2hPYmplY3R9IGluc3RhbmNlLgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gcHJpbnQgcmUubWF0Y2gocidGcm9tXHMrJywgJ0Zyb21hZ2UgYW1rJykKLU5vbmUKLT4+PiByZS5tYXRjaChyJ0Zyb21ccysnLCAnRnJvbSBhbWsgVGh1IE1heSAxNCAxOToxMjoxMCAxOTk4JykKLTxyZS5NYXRjaE9iamVjdCBpbnN0YW5jZSBhdCA4MGM1OTc4PgotXGVuZHt2ZXJiYXRpbX0KLQotVW5kZXIgdGhlIGhvb2QsIHRoZXNlIGZ1bmN0aW9ucyBzaW1wbHkgcHJvZHVjZSBhIFxjbGFzc3tSZWdleE9iamVjdH0KLWZvciB5b3UgYW5kIGNhbGwgdGhlIGFwcHJvcHJpYXRlIG1ldGhvZCBvbiBpdC4gIFRoZXkgYWxzbyBzdG9yZSB0aGUKLWNvbXBpbGVkIG9iamVjdCBpbiBhIGNhY2hlLCBzbyBmdXR1cmUgY2FsbHMgdXNpbmcgdGhlIHNhbWUKLVJFIGFyZSBmYXN0ZXIuICAKLQotU2hvdWxkIHlvdSB1c2UgdGhlc2UgbW9kdWxlLWxldmVsIGZ1bmN0aW9ucywgb3Igc2hvdWxkIHlvdSBnZXQgdGhlCi1cY2xhc3N7UmVnZXhPYmplY3R9IGFuZCBjYWxsIGl0cyBtZXRob2RzIHlvdXJzZWxmPyAgVGhhdCBjaG9pY2UKLWRlcGVuZHMgb24gaG93IGZyZXF1ZW50bHkgdGhlIFJFIHdpbGwgYmUgdXNlZCwgYW5kIG9uIHlvdXIgcGVyc29uYWwKLWNvZGluZyBzdHlsZS4gIElmIHRoZSBSRSBpcyBiZWluZyB1c2VkIGF0IG9ubHkgb25lIHBvaW50IGluIHRoZSBjb2RlLAotdGhlbiB0aGUgbW9kdWxlIGZ1bmN0aW9ucyBhcmUgcHJvYmFibHkgbW9yZSBjb252ZW5pZW50LiAgSWYgYSBwcm9ncmFtCi1jb250YWlucyBhIGxvdCBvZiByZWd1bGFyIGV4cHJlc3Npb25zLCBvciByZS11c2VzIHRoZSBzYW1lIG9uZXMgaW4KLXNldmVyYWwgbG9jYXRpb25zLCB0aGVuIGl0IG1pZ2h0IGJlIHdvcnRod2hpbGUgdG8gY29sbGVjdCBhbGwgdGhlCi1kZWZpbml0aW9ucyBpbiBvbmUgcGxhY2UsIGluIGEgc2VjdGlvbiBvZiBjb2RlIHRoYXQgY29tcGlsZXMgYWxsIHRoZQotUkVzIGFoZWFkIG9mIHRpbWUuICBUbyB0YWtlIGFuIGV4YW1wbGUgZnJvbSB0aGUgc3RhbmRhcmQgbGlicmFyeToKLQotXGJlZ2lue3ZlcmJhdGltfQotcmVmID0gcmUuY29tcGlsZSggLi4uICkKLWVudGl0eXJlZiA9IHJlLmNvbXBpbGUoIC4uLiApCi1jaGFycmVmID0gcmUuY29tcGlsZSggLi4uICkKLXN0YXJ0dGFnb3BlbiA9IHJlLmNvbXBpbGUoIC4uLiApCi1cZW5ke3ZlcmJhdGltfQotCi1JIGdlbmVyYWxseSBwcmVmZXIgdG8gd29yayB3aXRoIHRoZSBjb21waWxlZCBvYmplY3QsIGV2ZW4gZm9yCi1vbmUtdGltZSB1c2VzLCBidXQgZmV3IHBlb3BsZSB3aWxsIGJlIGFzIG11Y2ggb2YgYSBwdXJpc3QgYWJvdXQgdGhpcwotYXMgSSBhbS4KLQotXHN1YnNlY3Rpb257Q29tcGlsYXRpb24gRmxhZ3N9Ci0KLUNvbXBpbGF0aW9uIGZsYWdzIGxldCB5b3UgbW9kaWZ5IHNvbWUgYXNwZWN0cyBvZiBob3cgcmVndWxhcgotZXhwcmVzc2lvbnMgd29yay4gIEZsYWdzIGFyZSBhdmFpbGFibGUgaW4gdGhlIFxtb2R1bGV7cmV9IG1vZHVsZSB1bmRlcgotdHdvIG5hbWVzLCBhIGxvbmcgbmFtZSBzdWNoIGFzIFxjb25zdGFudHtJR05PUkVDQVNFfSBhbmQgYSBzaG9ydCwKLW9uZS1sZXR0ZXIgZm9ybSBzdWNoIGFzIFxjb25zdGFudHtJfS4gIChJZiB5b3UncmUgZmFtaWxpYXIgd2l0aCBQZXJsJ3MKLXBhdHRlcm4gbW9kaWZpZXJzLCB0aGUgb25lLWxldHRlciBmb3JtcyB1c2UgdGhlIHNhbWUgbGV0dGVyczsgdGhlCi1zaG9ydCBmb3JtIG9mIFxjb25zdGFudHtyZS5WRVJCT1NFfSBpcyBcY29uc3RhbnR7cmUuWH0sIGZvciBleGFtcGxlLikKLU11bHRpcGxlIGZsYWdzIGNhbiBiZSBzcGVjaWZpZWQgYnkgYml0d2lzZSBPUi1pbmcgdGhlbTsgXGNvZGV7cmUuSSB8Ci1yZS5NfSBzZXRzIGJvdGggdGhlIFxjb25zdGFudHtJfSBhbmQgXGNvbnN0YW50e019IGZsYWdzLCBmb3IgZXhhbXBsZS4KLQotSGVyZSdzIGEgdGFibGUgb2YgdGhlIGF2YWlsYWJsZSBmbGFncywgZm9sbG93ZWQgYnkKLWEgbW9yZSBkZXRhaWxlZCBleHBsYW5hdGlvbiBvZiBlYWNoIG9uZS4KLQotXGJlZ2lue3RhYmxlaWl9e2N8bH17fXtGbGFnfXtNZWFuaW5nfQotICBcbGluZWlpe1xjb25zdGFudHtET1RBTEx9LCBcY29uc3RhbnR7U319e01ha2UgXHJlZ2V4cHsufSBtYXRjaCBhbnkKLSAgY2hhcmFjdGVyLCBpbmNsdWRpbmcgbmV3bGluZXN9Ci0gIFxsaW5laWl7XGNvbnN0YW50e0lHTk9SRUNBU0V9LCBcY29uc3RhbnR7SX19e0RvIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hlc30KLSAgXGxpbmVpaXtcY29uc3RhbnR7TE9DQUxFfSwgXGNvbnN0YW50e0x9fXtEbyBhIGxvY2FsZS1hd2FyZSBtYXRjaH0KLSAgXGxpbmVpaXtcY29uc3RhbnR7TVVMVElMSU5FfSwgXGNvbnN0YW50e019fXtNdWx0aS1saW5lIG1hdGNoaW5nLAotICBhZmZlY3RpbmcgXHJlZ2V4cHtcXn0gYW5kIFxyZWdleHB7XCR9fQotICBcbGluZWlpe1xjb25zdGFudHtWRVJCT1NFfSwgXGNvbnN0YW50e1h9fXtFbmFibGUgdmVyYm9zZSBSRXMsCi0gIHdoaWNoIGNhbiBiZSBvcmdhbml6ZWQgbW9yZSBjbGVhbmx5IGFuZCB1bmRlcnN0YW5kYWJseS59Ci1cZW5ke3RhYmxlaWl9Ci0KLVxiZWdpbntkYXRhZGVzY317SX0KLVxkYXRhbGluZXtJR05PUkVDQVNFfQotUGVyZm9ybSBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nOyBjaGFyYWN0ZXIgY2xhc3MgYW5kIGxpdGVyYWwgc3RyaW5ncwotd2lsbCBtYXRjaAotbGV0dGVycyBieSBpZ25vcmluZyBjYXNlLiAgRm9yIGV4YW1wbGUsIFxyZWdleHB7W0EtWl19IHdpbGwgbWF0Y2gKLWxvd2VyY2FzZSBsZXR0ZXJzLCB0b28sIGFuZCBccmVnZXhwe1NwYW19IHdpbGwgbWF0Y2ggXHNhbXB7U3BhbX0sCi1cc2FtcHtzcGFtfSwgb3IgXHNhbXB7c3BBTX0uCi1UaGlzIGxvd2VyY2FzaW5nIGRvZXNuJ3QgdGFrZSB0aGUgY3VycmVudCBsb2NhbGUgaW50byBhY2NvdW50OyBpdCB3aWxsCi1pZiB5b3UgYWxzbyBzZXQgdGhlIFxjb25zdGFudHtMT0NBTEV9IGZsYWcuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e0x9Ci1cZGF0YWxpbmV7TE9DQUxFfQotTWFrZSBccmVnZXhwe1xlIHd9LCBccmVnZXhwe1xlIFd9LCBccmVnZXhwe1xlIGJ9LAotYW5kIFxyZWdleHB7XGUgQn0sIGRlcGVuZGVudCBvbiB0aGUgY3VycmVudCBsb2NhbGUuICAKLQotTG9jYWxlcyBhcmUgYSBmZWF0dXJlIG9mIHRoZSBDIGxpYnJhcnkgaW50ZW5kZWQgdG8gaGVscCBpbiB3cml0aW5nCi1wcm9ncmFtcyB0aGF0IHRha2UgYWNjb3VudCBvZiBsYW5ndWFnZSBkaWZmZXJlbmNlcy4gIEZvciBleGFtcGxlLCBpZgoteW91J3JlIHByb2Nlc3NpbmcgRnJlbmNoIHRleHQsIHlvdSdkIHdhbnQgdG8gYmUgYWJsZSB0byB3cml0ZQotXHJlZ2V4cHtcZSB3K30gdG8gbWF0Y2ggd29yZHMsIGJ1dCBccmVnZXhwe1xlIHd9IG9ubHkgbWF0Y2hlcyB0aGUKLWNoYXJhY3RlciBjbGFzcyBccmVnZXhwe1tBLVphLXpdfTsgaXQgd29uJ3QgbWF0Y2ggXGNoYXJhY3RlcntcJ2V9IG9yCi1cY2hhcmFjdGVye1xjIGN9LiAgSWYgeW91ciBzeXN0ZW0gaXMgY29uZmlndXJlZCBwcm9wZXJseSBhbmQgYSBGcmVuY2gKLWxvY2FsZSBpcyBzZWxlY3RlZCwgY2VydGFpbiBDIGZ1bmN0aW9ucyB3aWxsIHRlbGwgdGhlIHByb2dyYW0gdGhhdAotXGNoYXJhY3RlcntcJ2V9IHNob3VsZCBhbHNvIGJlIGNvbnNpZGVyZWQgYSBsZXR0ZXIuICBTZXR0aW5nIHRoZQotXGNvbnN0YW50e0xPQ0FMRX0gZmxhZyB3aGVuIGNvbXBpbGluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aWxsIGNhdXNlIHRoZQotcmVzdWx0aW5nIGNvbXBpbGVkIG9iamVjdCB0byB1c2UgdGhlc2UgQyBmdW5jdGlvbnMgZm9yIFxyZWdleHB7XGUgd307Ci10aGlzIGlzIHNsb3dlciwgYnV0IGFsc28gZW5hYmxlcyBccmVnZXhwe1xlIHcrfSB0byBtYXRjaCBGcmVuY2ggd29yZHMgYXMKLXlvdSdkIGV4cGVjdC4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317TX0KLVxkYXRhbGluZXtNVUxUSUxJTkV9Ci0oXHJlZ2V4cHtcXn0gYW5kIFxyZWdleHB7XCR9IGhhdmVuJ3QgYmVlbiBleHBsYWluZWQgeWV0OyAKLXRoZXknbGwgYmUgaW50cm9kdWNlZCBpbiBzZWN0aW9uflxyZWZ7bW9yZS1tZXRhY2hhcmFjdGVyc30uKQotCi1Vc3VhbGx5IFxyZWdleHB7XF59IG1hdGNoZXMgb25seSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcsIGFuZAotXHJlZ2V4cHtcJH0gbWF0Y2hlcyBvbmx5IGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZyBhbmQgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZQotbmV3bGluZSAoaWYgYW55KSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuIFdoZW4gdGhpcyBmbGFnIGlzCi1zcGVjaWZpZWQsIFxyZWdleHB7XF59IG1hdGNoZXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nIGFuZCBhdAotdGhlIGJlZ2lubmluZyBvZiBlYWNoIGxpbmUgd2l0aGluIHRoZSBzdHJpbmcsIGltbWVkaWF0ZWx5IGZvbGxvd2luZwotZWFjaCBuZXdsaW5lLiAgU2ltaWxhcmx5LCB0aGUgXHJlZ2V4cHtcJH0gbWV0YWNoYXJhY3RlciBtYXRjaGVzIGVpdGhlciBhdAotdGhlIGVuZCBvZiB0aGUgc3RyaW5nIGFuZCBhdCB0aGUgZW5kIG9mIGVhY2ggbGluZSAoaW1tZWRpYXRlbHkKLXByZWNlZGluZyBlYWNoIG5ld2xpbmUpLgotCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1N9Ci1cZGF0YWxpbmV7RE9UQUxMfQotTWFrZXMgdGhlIFxjaGFyYWN0ZXJ7Ln0gc3BlY2lhbCBjaGFyYWN0ZXIgbWF0Y2ggYW55IGNoYXJhY3RlciBhdCBhbGwsCi1pbmNsdWRpbmcgYSBuZXdsaW5lOyB3aXRob3V0IHRoaXMgZmxhZywgXGNoYXJhY3RlcnsufSB3aWxsIG1hdGNoCi1hbnl0aGluZyBcZW1waHtleGNlcHR9IGEgbmV3bGluZS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317WH0KLVxkYXRhbGluZXtWRVJCT1NFfSBUaGlzIGZsYWcgYWxsb3dzIHlvdSB0byB3cml0ZSByZWd1bGFyIGV4cHJlc3Npb25zCi10aGF0IGFyZSBtb3JlIHJlYWRhYmxlIGJ5IGdyYW50aW5nIHlvdSBtb3JlIGZsZXhpYmlsaXR5IGluIGhvdyB5b3UgY2FuCi1mb3JtYXQgdGhlbS4gIFdoZW4gdGhpcyBmbGFnIGhhcyBiZWVuIHNwZWNpZmllZCwgd2hpdGVzcGFjZSB3aXRoaW4gdGhlCi1SRSBzdHJpbmcgaXMgaWdub3JlZCwgZXhjZXB0IHdoZW4gdGhlIHdoaXRlc3BhY2UgaXMgaW4gYSBjaGFyYWN0ZXIKLWNsYXNzIG9yIHByZWNlZGVkIGJ5IGFuIHVuZXNjYXBlZCBiYWNrc2xhc2g7IHRoaXMgbGV0cyB5b3Ugb3JnYW5pemUKLWFuZCBpbmRlbnQgdGhlIFJFIG1vcmUgY2xlYXJseS4gIFRoaXMgZmxhZyBhbHNvIGxldHMgeW91IHB1dCBjb21tZW50cwotd2l0aGluIGEgUkUgdGhhdCB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIGVuZ2luZTsgY29tbWVudHMgYXJlIG1hcmtlZCBieQotYSBcY2hhcmFjdGVye1wjfSB0aGF0J3MgbmVpdGhlciBpbiBhIGNoYXJhY3RlciBjbGFzcyBvciBwcmVjZWRlZCBieSBhbgotdW5lc2NhcGVkIGJhY2tzbGFzaC4KLQotRm9yIGV4YW1wbGUsIGhlcmUncyBhIFJFIHRoYXQgdXNlcyBcY29uc3RhbnR7cmUuVkVSQk9TRX07IHNlZSBob3cKLW11Y2ggZWFzaWVyIGl0IGlzIHRvIHJlYWQ/Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWNoYXJyZWYgPSByZS5jb21waWxlKHIiIiIKLSAmWyNdCQkgICAgICMgU3RhcnQgb2YgYSBudW1lcmljIGVudGl0eSByZWZlcmVuY2UKLSAoCi0gICAgIDBbMC03XSsgICAgICAgICAjIE9jdGFsIGZvcm0KLSAgIHwgWzAtOV0rICAgICAgICAgICMgRGVjaW1hbCBmb3JtCi0gICB8IHhbMC05YS1mQS1GXSsgICAjIEhleGFkZWNpbWFsIGZvcm0KLSApCi0gOyAgICAgICAgICAgICAgICAgICAjIFRyYWlsaW5nIHNlbWljb2xvbgotIiIiLCByZS5WRVJCT1NFKQotXGVuZHt2ZXJiYXRpbX0KLQotV2l0aG91dCB0aGUgdmVyYm9zZSBzZXR0aW5nLCB0aGUgUkUgd291bGQgbG9vayBsaWtlIHRoaXM6Ci1cYmVnaW57dmVyYmF0aW19Ci1jaGFycmVmID0gcmUuY29tcGlsZSgiJiMoMFswLTddKyIKLSAgICAgICAgICAgICAgICAgICAgICJ8WzAtOV0rIgotICAgICAgICAgICAgICAgICAgICAgInx4WzAtOWEtZkEtRl0rKTsiKQotXGVuZHt2ZXJiYXRpbX0KLQotSW4gdGhlIGFib3ZlIGV4YW1wbGUsIFB5dGhvbidzIGF1dG9tYXRpYyBjb25jYXRlbmF0aW9uIG9mIHN0cmluZwotbGl0ZXJhbHMgaGFzIGJlZW4gdXNlZCB0byBicmVhayB1cCB0aGUgUkUgaW50byBzbWFsbGVyIHBpZWNlcywgYnV0Ci1pdCdzIHN0aWxsIG1vcmUgZGlmZmljdWx0IHRvIHVuZGVyc3RhbmQgdGhhbiB0aGUgdmVyc2lvbiB1c2luZwotXGNvbnN0YW50e3JlLlZFUkJPU0V9LgotCi1cZW5ke2RhdGFkZXNjfQotCi1cc2VjdGlvbntNb3JlIFBhdHRlcm4gUG93ZXJ9Ci0KLVNvIGZhciB3ZSd2ZSBvbmx5IGNvdmVyZWQgYSBwYXJ0IG9mIHRoZSBmZWF0dXJlcyBvZiByZWd1bGFyCi1leHByZXNzaW9ucy4gIEluIHRoaXMgc2VjdGlvbiwgd2UnbGwgY292ZXIgc29tZSBuZXcgbWV0YWNoYXJhY3RlcnMsCi1hbmQgaG93IHRvIHVzZSBncm91cHMgdG8gcmV0cmlldmUgcG9ydGlvbnMgb2YgdGhlIHRleHQgdGhhdCB3YXMgbWF0Y2hlZC4KLQotXHN1YnNlY3Rpb257TW9yZSBNZXRhY2hhcmFjdGVyc1xsYWJlbHttb3JlLW1ldGFjaGFyYWN0ZXJzfX0KLQotVGhlcmUgYXJlIHNvbWUgbWV0YWNoYXJhY3RlcnMgdGhhdCB3ZSBoYXZlbid0IGNvdmVyZWQgeWV0LiAgTW9zdCBvZgotdGhlbSB3aWxsIGJlIGNvdmVyZWQgaW4gdGhpcyBzZWN0aW9uLgotCi1Tb21lIG9mIHRoZSByZW1haW5pbmcgbWV0YWNoYXJhY3RlcnMgdG8gYmUgZGlzY3Vzc2VkIGFyZQotXGRmbnt6ZXJvLXdpZHRoIGFzc2VydGlvbnN9LiAgVGhleSBkb24ndCBjYXVzZSB0aGUgZW5naW5lIHRvIGFkdmFuY2UKLXRocm91Z2ggdGhlIHN0cmluZzsgaW5zdGVhZCwgdGhleSBjb25zdW1lIG5vIGNoYXJhY3RlcnMgYXQgYWxsLAotYW5kIHNpbXBseSBzdWNjZWVkIG9yIGZhaWwuICBGb3IgZXhhbXBsZSwgXHJlZ2V4cHtcZSBifSBpcyBhbgotYXNzZXJ0aW9uIHRoYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgbG9jYXRlZCBhdCBhIHdvcmQgYm91bmRhcnk7IHRoZQotcG9zaXRpb24gaXNuJ3QgY2hhbmdlZCBieSB0aGUgXHJlZ2V4cHtcZSBifSBhdCBhbGwuICBUaGlzIG1lYW5zIHRoYXQKLXplcm8td2lkdGggYXNzZXJ0aW9ucyBzaG91bGQgbmV2ZXIgYmUgcmVwZWF0ZWQsIGJlY2F1c2UgaWYgdGhleSBtYXRjaAotb25jZSBhdCBhIGdpdmVuIGxvY2F0aW9uLCB0aGV5IGNhbiBvYnZpb3VzbHkgYmUgbWF0Y2hlZCBhbiBpbmZpbml0ZQotbnVtYmVyIG9mIHRpbWVzLgotCi1cYmVnaW57bGlzdH17fXt9Ci0KLVxpdGVtW1xyZWdleHB7fH1dIAotQWx0ZXJuYXRpb24sIG9yIHRoZSBgYG9yJycgb3BlcmF0b3IuICAKLUlmIEEgYW5kIEIgYXJlIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIAotXHJlZ2V4cHtBfEJ9IHdpbGwgbWF0Y2ggYW55IHN0cmluZyB0aGF0IG1hdGNoZXMgZWl0aGVyIFxzYW1we0F9IG9yIFxzYW1we0J9LgotXHJlZ2V4cHt8fSBoYXMgdmVyeSBsb3cgcHJlY2VkZW5jZSBpbiBvcmRlciB0byBtYWtlIGl0IHdvcmsgcmVhc29uYWJseSB3aGVuCi15b3UncmUgYWx0ZXJuYXRpbmcgbXVsdGktY2hhcmFjdGVyIHN0cmluZ3MuCi1ccmVnZXhwe0Nyb3d8U2Vydm99IHdpbGwgbWF0Y2ggZWl0aGVyIFxzYW1we0Nyb3d9IG9yIFxzYW1we1NlcnZvfSwgbm90Ci1cc2FtcHtDcm99LCBhIFxjaGFyYWN0ZXJ7d30gb3IgYW4gXGNoYXJhY3RlcntTfSwgYW5kIFxzYW1we2Vydm99LgotCi1UbyBtYXRjaCBhIGxpdGVyYWwgXGNoYXJhY3Rlcnt8fSwKLXVzZSBccmVnZXhwe1xlfH0sIG9yIGVuY2xvc2UgaXQgaW5zaWRlIGEgY2hhcmFjdGVyIGNsYXNzLCBhcyBpbiBccmVnZXhwe1t8XX0uCi0KLVxpdGVtW1xyZWdleHB7XF59XSBNYXRjaGVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgbGluZXMuICBVbmxlc3MgdGhlCi1cY29uc3RhbnR7TVVMVElMSU5FfSBmbGFnIGhhcyBiZWVuIHNldCwgdGhpcyB3aWxsIG9ubHkgbWF0Y2ggYXQgdGhlCi1iZWdpbm5pbmcgb2YgdGhlIHN0cmluZy4gIEluIFxjb25zdGFudHtNVUxUSUxJTkV9IG1vZGUsIHRoaXMgYWxzbwotbWF0Y2hlcyBpbW1lZGlhdGVseSBhZnRlciBlYWNoIG5ld2xpbmUgd2l0aGluIHRoZSBzdHJpbmcuICAKLQotRm9yIGV4YW1wbGUsIGlmIHlvdSB3aXNoIHRvIG1hdGNoIHRoZSB3b3JkIFxzYW1we0Zyb219IG9ubHkgYXQgdGhlCi1iZWdpbm5pbmcgb2YgYSBsaW5lLCB0aGUgUkUgdG8gdXNlIGlzIFx2ZXJifF5Gcm9tfC4KLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHByaW50IHJlLnNlYXJjaCgnXkZyb20nLCAnRnJvbSBIZXJlIHRvIEV0ZXJuaXR5JykKLTxyZS5NYXRjaE9iamVjdCBpbnN0YW5jZSBhdCA4MGMxNTIwPgotPj4+IHByaW50IHJlLnNlYXJjaCgnXkZyb20nLCAnUmVjaXRpbmcgRnJvbSBNZW1vcnknKQotTm9uZQotXGVuZHt2ZXJiYXRpbX0KLQotJVRvIG1hdGNoIGEgbGl0ZXJhbCBcY2hhcmFjdGVye1xefSwgdXNlIFxyZWdleHB7XGVcXn0gb3IgZW5jbG9zZSBpdAotJWluc2lkZSBhIGNoYXJhY3RlciBjbGFzcywgYXMgaW4gXHJlZ2V4cHtbe1xlfVxeXX0uCi0KLVxpdGVtW1xyZWdleHB7XCR9XSBNYXRjaGVzIGF0IHRoZSBlbmQgb2YgYSBsaW5lLCB3aGljaCBpcyBkZWZpbmVkIGFzCi1laXRoZXIgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLCBvciBhbnkgbG9jYXRpb24gZm9sbG93ZWQgYnkgYSBuZXdsaW5lCi1jaGFyYWN0ZXIuICAgIAotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gcHJpbnQgcmUuc2VhcmNoKCd9JCcsICd7YmxvY2t9JykKLTxyZS5NYXRjaE9iamVjdCBpbnN0YW5jZSBhdCA4MGFkZmE4PgotPj4+IHByaW50IHJlLnNlYXJjaCgnfSQnLCAne2Jsb2NrfSAnKQotTm9uZQotPj4+IHByaW50IHJlLnNlYXJjaCgnfSQnLCAne2Jsb2NrfVxuJykKLTxyZS5NYXRjaE9iamVjdCBpbnN0YW5jZSBhdCA4MGFkZmE4PgotXGVuZHt2ZXJiYXRpbX0KLSUgJAotCi1UbyBtYXRjaCBhIGxpdGVyYWwgXGNoYXJhY3RlcntcJH0sIHVzZSBccmVnZXhwe1xlXCR9IG9yIGVuY2xvc2UgaXQKLWluc2lkZSBhIGNoYXJhY3RlciBjbGFzcywgYXMgaW4gIFxyZWdleHB7W1wkXX0uCi0KLVxpdGVtW1xyZWdleHB7XGUgQX1dIE1hdGNoZXMgb25seSBhdCB0aGUgc3RhcnQgb2YgdGhlIHN0cmluZy4gIFdoZW4KLW5vdCBpbiBcY29uc3RhbnR7TVVMVElMSU5FfSBtb2RlLCBccmVnZXhwe1xlIEF9IGFuZCBccmVnZXhwe1xefSBhcmUKLWVmZmVjdGl2ZWx5IHRoZSBzYW1lLiAgSW4gXGNvbnN0YW50e01VTFRJTElORX0gbW9kZSwgdGhleSdyZQotZGlmZmVyZW50OiBccmVnZXhwe1xlIEF9IHN0aWxsIG1hdGNoZXMgb25seSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotc3RyaW5nLCBidXQgXHJlZ2V4cHtcXn0gbWF5IG1hdGNoIGF0IGFueSBsb2NhdGlvbiBpbnNpZGUgdGhlIHN0cmluZwotdGhhdCBmb2xsb3dzIGEgbmV3bGluZSBjaGFyYWN0ZXIuCi0KLVxpdGVtW1xyZWdleHB7XGUgWn1dIE1hdGNoZXMgb25seSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuICAKLQotXGl0ZW1bXHJlZ2V4cHtcZSBifV0gV29yZCBib3VuZGFyeS4gIAotVGhpcyBpcyBhIHplcm8td2lkdGggYXNzZXJ0aW9uIHRoYXQgbWF0Y2hlcyBvbmx5IGF0IHRoZQotYmVnaW5uaW5nIG9yIGVuZCBvZiBhIHdvcmQuICBBIHdvcmQgaXMgZGVmaW5lZCBhcyBhIHNlcXVlbmNlIG9mCi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycywgc28gdGhlIGVuZCBvZiBhIHdvcmQgaXMgaW5kaWNhdGVkIGJ5Ci13aGl0ZXNwYWNlIG9yIGEgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXIuICAKLQotVGhlIGZvbGxvd2luZyBleGFtcGxlIG1hdGNoZXMgXHNhbXB7Y2xhc3N9IG9ubHkgd2hlbiBpdCdzIGEgY29tcGxldGUKLXdvcmQ7IGl0IHdvbid0IG1hdGNoIHdoZW4gaXQncyBjb250YWluZWQgaW5zaWRlIGFub3RoZXIgd29yZC4KLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHAgPSByZS5jb21waWxlKHInXGJjbGFzc1xiJykKLT4+PiBwcmludCBwLnNlYXJjaCgnbm8gY2xhc3MgYXQgYWxsJykKLTxyZS5NYXRjaE9iamVjdCBpbnN0YW5jZSBhdCA4MGM4ZjI4PgotPj4+IHByaW50IHAuc2VhcmNoKCd0aGUgZGVjbGFzc2lmaWVkIGFsZ29yaXRobScpCi1Ob25lCi0+Pj4gcHJpbnQgcC5zZWFyY2goJ29uZSBzdWJjbGFzcyBpcycpCi1Ob25lCi1cZW5ke3ZlcmJhdGltfQotCi1UaGVyZSBhcmUgdHdvIHN1YnRsZXRpZXMgeW91IHNob3VsZCByZW1lbWJlciB3aGVuIHVzaW5nIHRoaXMgc3BlY2lhbAotc2VxdWVuY2UuICBGaXJzdCwgdGhpcyBpcyB0aGUgd29yc3QgY29sbGlzaW9uIGJldHdlZW4gUHl0aG9uJ3Mgc3RyaW5nCi1saXRlcmFscyBhbmQgcmVndWxhciBleHByZXNzaW9uIHNlcXVlbmNlcy4gIEluIFB5dGhvbidzIHN0cmluZwotbGl0ZXJhbHMsIFxzYW1we1xlIGJ9IGlzIHRoZSBiYWNrc3BhY2UgY2hhcmFjdGVyLCBBU0NJSSB2YWx1ZSA4LiAgSWYKLXlvdSdyZSBub3QgdXNpbmcgcmF3IHN0cmluZ3MsIHRoZW4gUHl0aG9uIHdpbGwgY29udmVydCB0aGUgXHNhbXB7XGUgYn0gdG8KLWEgYmFja3NwYWNlLCBhbmQgeW91ciBSRSB3b24ndCBtYXRjaCBhcyB5b3UgZXhwZWN0IGl0IHRvLiAgVGhlCi1mb2xsb3dpbmcgZXhhbXBsZSBsb29rcyB0aGUgc2FtZSBhcyBvdXIgcHJldmlvdXMgUkUsIGJ1dCBvbWl0cwotdGhlIFxjaGFyYWN0ZXJ7cn0gaW4gZnJvbnQgb2YgdGhlIFJFIHN0cmluZy4KLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHAgPSByZS5jb21waWxlKCdcYmNsYXNzXGInKQotPj4+IHByaW50IHAuc2VhcmNoKCdubyBjbGFzcyBhdCBhbGwnKQotTm9uZQotPj4+IHByaW50IHAuc2VhcmNoKCdcYicgKyAnY2xhc3MnICsgJ1xiJykgIAotPHJlLk1hdGNoT2JqZWN0IGluc3RhbmNlIGF0IDgwYzNlZTA+Ci1cZW5ke3ZlcmJhdGltfQotCi1TZWNvbmQsIGluc2lkZSBhIGNoYXJhY3RlciBjbGFzcywgd2hlcmUgdGhlcmUncyBubyB1c2UgZm9yIHRoaXMKLWFzc2VydGlvbiwgXHJlZ2V4cHtcZSBifSByZXByZXNlbnRzIHRoZSBiYWNrc3BhY2UgY2hhcmFjdGVyLCBmb3IKLWNvbXBhdGliaWxpdHkgd2l0aCBQeXRob24ncyBzdHJpbmcgbGl0ZXJhbHMuCi0KLVxpdGVtW1xyZWdleHB7XGUgQn1dIEFub3RoZXIgemVyby13aWR0aCBhc3NlcnRpb24sIHRoaXMgaXMgdGhlCi1vcHBvc2l0ZSBvZiBccmVnZXhwe1xlIGJ9LCBvbmx5IG1hdGNoaW5nIHdoZW4gdGhlIGN1cnJlbnQKLXBvc2l0aW9uIGlzIG5vdCBhdCBhIHdvcmQgYm91bmRhcnkuCi0KLVxlbmR7bGlzdH0KLQotXHN1YnNlY3Rpb257R3JvdXBpbmd9Ci0KLUZyZXF1ZW50bHkgeW91IG5lZWQgdG8gb2J0YWluIG1vcmUgaW5mb3JtYXRpb24gdGhhbiBqdXN0IHdoZXRoZXIgdGhlCi1SRSBtYXRjaGVkIG9yIG5vdC4gIFJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIG9mdGVuIHVzZWQgdG8gZGlzc2VjdAotc3RyaW5ncyBieSB3cml0aW5nIGEgUkUgZGl2aWRlZCBpbnRvIHNldmVyYWwgc3ViZ3JvdXBzIHdoaWNoCi1tYXRjaCBkaWZmZXJlbnQgY29tcG9uZW50cyBvZiBpbnRlcmVzdC4gIEZvciBleGFtcGxlLCBhbiBSRkMtODIyCi1oZWFkZXIgbGluZSBpcyBkaXZpZGVkIGludG8gYSBoZWFkZXIgbmFtZSBhbmQgYSB2YWx1ZSwgc2VwYXJhdGVkIGJ5IGEKLVxjaGFyYWN0ZXJ7On0sIGxpa2UgdGhpczoKLQotXGJlZ2lue3ZlcmJhdGltfQotRnJvbTogYXV0aG9yQGV4YW1wbGUuY29tCi1Vc2VyLUFnZW50OiBUaHVuZGVyYmlyZCAxLjUuMC45IChYMTEvMjAwNjEyMjcpCi1NSU1FLVZlcnNpb246IDEuMAotVG86IGVkaXRvckBleGFtcGxlLmNvbQotXGVuZHt2ZXJiYXRpbX0KLQotVGhpcyBjYW4gYmUgaGFuZGxlZCBieSB3cml0aW5nIGEgcmVndWxhciBleHByZXNzaW9uCi13aGljaCBtYXRjaGVzIGFuIGVudGlyZSBoZWFkZXIgbGluZSwgYW5kIGhhcyBvbmUgZ3JvdXAgd2hpY2ggbWF0Y2hlcyB0aGUKLWhlYWRlciBuYW1lLCBhbmQgYW5vdGhlciBncm91cCB3aGljaCBtYXRjaGVzIHRoZSBoZWFkZXIncyB2YWx1ZS4KLQotR3JvdXBzIGFyZSBtYXJrZWQgYnkgdGhlIFxjaGFyYWN0ZXJ7KH0sIFxjaGFyYWN0ZXJ7KX0gbWV0YWNoYXJhY3RlcnMuCi1cY2hhcmFjdGVyeyh9IGFuZCBcY2hhcmFjdGVyeyl9IGhhdmUgbXVjaCB0aGUgc2FtZSBtZWFuaW5nIGFzIHRoZXkgZG8KLWluIG1hdGhlbWF0aWNhbCBleHByZXNzaW9uczsgdGhleSBncm91cCB0b2dldGhlciB0aGUgZXhwcmVzc2lvbnMKLWNvbnRhaW5lZCBpbnNpZGUgdGhlbSwgYW5kIHlvdSBjYW4gcmVwZWF0IHRoZSBjb250ZW50cyBvZiBhCi1ncm91cCB3aXRoIGEgcmVwZWF0aW5nIHF1YWxpZmllciwgc3VjaCBhcyBccmVnZXhweyp9LCBccmVnZXhweyt9LAotXHJlZ2V4cHs/fSwgb3IgXHJlZ2V4cHtce1x2YXJ7bX0sXHZhcntufVx9fS4gIEZvciBleGFtcGxlLAotXHJlZ2V4cHsoYWIpKn0gd2lsbCBtYXRjaCB6ZXJvIG9yIG1vcmUgcmVwZXRpdGlvbnMgb2YgXHNhbXB7YWJ9LgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gcCA9IHJlLmNvbXBpbGUoJyhhYikqJykKLT4+PiBwcmludCBwLm1hdGNoKCdhYmFiYWJhYmFiJykuc3BhbigpCi0oMCwgMTApCi1cZW5ke3ZlcmJhdGltfQotCi1Hcm91cHMgaW5kaWNhdGVkIHdpdGggXGNoYXJhY3RlcnsofSwgXGNoYXJhY3RlcnspfSBhbHNvIGNhcHR1cmUgdGhlCi1zdGFydGluZyBhbmQgZW5kaW5nIGluZGV4IG9mIHRoZSB0ZXh0IHRoYXQgdGhleSBtYXRjaDsgdGhpcyBjYW4gYmUKLXJldHJpZXZlZCBieSBwYXNzaW5nIGFuIGFyZ3VtZW50IHRvIFxtZXRob2R7Z3JvdXAoKX0sCi1cbWV0aG9ke3N0YXJ0KCl9LCBcbWV0aG9ke2VuZCgpfSwgYW5kIFxtZXRob2R7c3BhbigpfS4gIEdyb3VwcyBhcmUKLW51bWJlcmVkIHN0YXJ0aW5nIHdpdGggMC4gIEdyb3VwIDAgaXMgYWx3YXlzIHByZXNlbnQ7IGl0J3MgdGhlIHdob2xlCi1SRSwgc28gXGNsYXNze01hdGNoT2JqZWN0fSBtZXRob2RzIGFsbCBoYXZlIGdyb3VwIDAgYXMgdGhlaXIgZGVmYXVsdAotYXJndW1lbnQuICBMYXRlciB3ZSdsbCBzZWUgaG93IHRvIGV4cHJlc3MgZ3JvdXBzIHRoYXQgZG9uJ3QgY2FwdHVyZQotdGhlIHNwYW4gb2YgdGV4dCB0aGF0IHRoZXkgbWF0Y2guCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBwID0gcmUuY29tcGlsZSgnKGEpYicpCi0+Pj4gbSA9IHAubWF0Y2goJ2FiJykKLT4+PiBtLmdyb3VwKCkKLSdhYicKLT4+PiBtLmdyb3VwKDApCi0nYWInCi1cZW5ke3ZlcmJhdGltfQotCi1TdWJncm91cHMgYXJlIG51bWJlcmVkIGZyb20gbGVmdCB0byByaWdodCwgZnJvbSAxIHVwd2FyZC4gIEdyb3VwcyBjYW4KLWJlIG5lc3RlZDsgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIsIGp1c3QgY291bnQgdGhlIG9wZW5pbmcgcGFyZW50aGVzaXMKLWNoYXJhY3RlcnMsIGdvaW5nIGZyb20gbGVmdCB0byByaWdodC4KLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHAgPSByZS5jb21waWxlKCcoYShiKWMpZCcpCi0+Pj4gbSA9IHAubWF0Y2goJ2FiY2QnKQotPj4+IG0uZ3JvdXAoMCkKLSdhYmNkJwotPj4+IG0uZ3JvdXAoMSkKLSdhYmMnCi0+Pj4gbS5ncm91cCgyKQotJ2InCi1cZW5ke3ZlcmJhdGltfQotCi1cbWV0aG9ke2dyb3VwKCl9IGNhbiBiZSBwYXNzZWQgbXVsdGlwbGUgZ3JvdXAgbnVtYmVycyBhdCBhIHRpbWUsIGluCi13aGljaCBjYXNlIGl0IHdpbGwgcmV0dXJuIGEgdHVwbGUgY29udGFpbmluZyB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMKLWZvciB0aG9zZSBncm91cHMuCi0KLVxiZWdpbnt2ZXJiYXRpbX0gIAotPj4+IG0uZ3JvdXAoMiwxLDIpCi0oJ2InLCAnYWJjJywgJ2InKQotXGVuZHt2ZXJiYXRpbX0gIAotCi1UaGUgXG1ldGhvZHtncm91cHMoKX0gbWV0aG9kIHJldHVybnMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBzdHJpbmdzCi1mb3IgYWxsIHRoZSBzdWJncm91cHMsIGZyb20gMSB1cCB0byBob3dldmVyIG1hbnkgdGhlcmUgYXJlLgotCi1cYmVnaW57dmVyYmF0aW19ICAKLT4+PiBtLmdyb3VwcygpCi0oJ2FiYycsICdiJykKLVxlbmR7dmVyYmF0aW19ICAKLQotQmFja3JlZmVyZW5jZXMgaW4gYSBwYXR0ZXJuIGFsbG93IHlvdSB0byBzcGVjaWZ5IHRoYXQgdGhlIGNvbnRlbnRzIG9mCi1hbiBlYXJsaWVyIGNhcHR1cmluZyBncm91cCBtdXN0IGFsc28gYmUgZm91bmQgYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24KLWluIHRoZSBzdHJpbmcuICBGb3IgZXhhbXBsZSwgXHJlZ2V4cHtcZSAxfSB3aWxsIHN1Y2NlZWQgaWYgdGhlIGV4YWN0Ci1jb250ZW50cyBvZiBncm91cCAxIGNhbiBiZSBmb3VuZCBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiwgYW5kIGZhaWxzCi1vdGhlcndpc2UuICBSZW1lbWJlciB0aGF0IFB5dGhvbidzIHN0cmluZyBsaXRlcmFscyBhbHNvIHVzZSBhCi1iYWNrc2xhc2ggZm9sbG93ZWQgYnkgbnVtYmVycyB0byBhbGxvdyBpbmNsdWRpbmcgYXJiaXRyYXJ5IGNoYXJhY3RlcnMKLWluIGEgc3RyaW5nLCBzbyBiZSBzdXJlIHRvIHVzZSBhIHJhdyBzdHJpbmcgd2hlbiBpbmNvcnBvcmF0aW5nCi1iYWNrcmVmZXJlbmNlcyBpbiBhIFJFLgotCi1Gb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBSRSBkZXRlY3RzIGRvdWJsZWQgd29yZHMgaW4gYSBzdHJpbmcuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBwID0gcmUuY29tcGlsZShyJyhcYlx3KylccytcMScpCi0+Pj4gcC5zZWFyY2goJ1BhcmlzIGluIHRoZSB0aGUgc3ByaW5nJykuZ3JvdXAoKQotJ3RoZSB0aGUnCi1cZW5ke3ZlcmJhdGltfQotCi1CYWNrcmVmZXJlbmNlcyBsaWtlIHRoaXMgYXJlbid0IG9mdGVuIHVzZWZ1bCBmb3IganVzdCBzZWFyY2hpbmcKLXRocm91Z2ggYSBzdHJpbmcgLS0tIHRoZXJlIGFyZSBmZXcgdGV4dCBmb3JtYXRzIHdoaWNoIHJlcGVhdCBkYXRhIGluCi10aGlzIHdheSAtLS0gYnV0IHlvdSdsbCBzb29uIGZpbmQgb3V0IHRoYXQgdGhleSdyZSBcZW1waHt2ZXJ5fSB1c2VmdWwKLXdoZW4gcGVyZm9ybWluZyBzdHJpbmcgc3Vic3RpdHV0aW9ucy4KLQotXHN1YnNlY3Rpb257Tm9uLWNhcHR1cmluZyBhbmQgTmFtZWQgR3JvdXBzfQotCi1FbGFib3JhdGUgUkVzIG1heSB1c2UgbWFueSBncm91cHMsIGJvdGggdG8gY2FwdHVyZSBzdWJzdHJpbmdzIG9mCi1pbnRlcmVzdCwgYW5kIHRvIGdyb3VwIGFuZCBzdHJ1Y3R1cmUgdGhlIFJFIGl0c2VsZi4gIEluIGNvbXBsZXggUkVzLAotaXQgYmVjb21lcyBkaWZmaWN1bHQgdG8ga2VlcCB0cmFjayBvZiB0aGUgZ3JvdXAgbnVtYmVycy4gIFRoZXJlIGFyZQotdHdvIGZlYXR1cmVzIHdoaWNoIGhlbHAgd2l0aCB0aGlzIHByb2JsZW0uICBCb3RoIG9mIHRoZW0gdXNlIGEgY29tbW9uCi1zeW50YXggZm9yIHJlZ3VsYXIgZXhwcmVzc2lvbiBleHRlbnNpb25zLCBzbyB3ZSdsbCBsb29rIGF0IHRoYXQgZmlyc3QuCi0KLVBlcmwgNSBhZGRlZCBzZXZlcmFsIGFkZGl0aW9uYWwgZmVhdHVyZXMgdG8gc3RhbmRhcmQgcmVndWxhcgotZXhwcmVzc2lvbnMsIGFuZCB0aGUgUHl0aG9uIFxtb2R1bGV7cmV9IG1vZHVsZSBzdXBwb3J0cyBtb3N0IG9mIHRoZW0uICAKLUl0IHdvdWxkIGhhdmUgYmVlbiBkaWZmaWN1bHQgdG8gY2hvb3NlIG5ldwotc2luZ2xlLWtleXN0cm9rZSBtZXRhY2hhcmFjdGVycyBvciBuZXcgc3BlY2lhbCBzZXF1ZW5jZXMgYmVnaW5uaW5nCi13aXRoIFxzYW1we1xlfSB0byByZXByZXNlbnQgdGhlIG5ldyBmZWF0dXJlcyB3aXRob3V0IG1ha2luZyBQZXJsJ3MKLXJlZ3VsYXIgZXhwcmVzc2lvbnMgY29uZnVzaW5nbHkgZGlmZmVyZW50IGZyb20gc3RhbmRhcmQgUkVzLiAgSWYgeW91Ci1jaG9zZSBcc2FtcHtcJn0gYXMgYSBuZXcgbWV0YWNoYXJhY3RlciwgZm9yIGV4YW1wbGUsIG9sZCBleHByZXNzaW9ucwotd291bGQgYmUgYXNzdW1pbmcgdGhhdAotXHNhbXB7XCZ9IHdhcyBhIHJlZ3VsYXIgY2hhcmFjdGVyIGFuZCB3b3VsZG4ndCBoYXZlIGVzY2FwZWQgaXQgYnkKLXdyaXRpbmcgXHJlZ2V4cHtcZSBcJn0gb3IgXHJlZ2V4cHtbXCZdfS4gIAotCi1UaGUgc29sdXRpb24gY2hvc2VuIGJ5IHRoZSBQZXJsIGRldmVsb3BlcnMgd2FzIHRvIHVzZSBccmVnZXhweyg/Li4uKX0KLWFzIHRoZSBleHRlbnNpb24gc3ludGF4LiAgXHNhbXB7P30gaW1tZWRpYXRlbHkgYWZ0ZXIgYSBwYXJlbnRoZXNpcyB3YXMKLWEgc3ludGF4IGVycm9yIGJlY2F1c2UgdGhlIFxzYW1wez99IHdvdWxkIGhhdmUgbm90aGluZyB0byByZXBlYXQsIHNvCi10aGlzIGRpZG4ndCBpbnRyb2R1Y2UgYW55IGNvbXBhdGliaWxpdHkgcHJvYmxlbXMuICBUaGUgY2hhcmFjdGVycwotaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIFxzYW1wez99ICBpbmRpY2F0ZSB3aGF0IGV4dGVuc2lvbiBpcyBiZWluZyB1c2VkLAotc28gXHJlZ2V4cHsoPz1mb28pfSBpcyBvbmUgdGhpbmcgKGEgcG9zaXRpdmUgbG9va2FoZWFkIGFzc2VydGlvbikgYW5kCi1ccmVnZXhweyg/OmZvbyl9IGlzIHNvbWV0aGluZyBlbHNlIChhIG5vbi1jYXB0dXJpbmcgZ3JvdXAgY29udGFpbmluZwotdGhlIHN1YmV4cHJlc3Npb24gXHJlZ2V4cHtmb299KS4KLQotUHl0aG9uIGFkZHMgYW4gZXh0ZW5zaW9uIHN5bnRheCB0byBQZXJsJ3MgZXh0ZW5zaW9uIHN5bnRheC4gIElmIHRoZQotZmlyc3QgY2hhcmFjdGVyIGFmdGVyIHRoZSBxdWVzdGlvbiBtYXJrIGlzIGEgXHNhbXB7UH0sIHlvdSBrbm93IHRoYXQKLWl0J3MgYW4gZXh0ZW5zaW9uIHRoYXQncyBzcGVjaWZpYyB0byBQeXRob24uICBDdXJyZW50bHkgdGhlcmUgYXJlIHR3bwotc3VjaCBleHRlbnNpb25zOiBccmVnZXhweyg/UDxcdmFye25hbWV9Pi4uLil9IGRlZmluZXMgYSBuYW1lZCBncm91cCwKLWFuZCBccmVnZXhweyg/UD1cdmFye25hbWV9KX0gaXMgYSBiYWNrcmVmZXJlbmNlIHRvIGEgbmFtZWQgZ3JvdXAuICBJZgotZnV0dXJlIHZlcnNpb25zIG9mIFBlcmwgNSBhZGQgc2ltaWxhciBmZWF0dXJlcyB1c2luZyBhIGRpZmZlcmVudAotc3ludGF4LCB0aGUgXG1vZHVsZXtyZX0gbW9kdWxlIHdpbGwgYmUgY2hhbmdlZCB0byBzdXBwb3J0IHRoZSBuZXcKLXN5bnRheCwgd2hpbGUgcHJlc2VydmluZyB0aGUgUHl0aG9uLXNwZWNpZmljIHN5bnRheCBmb3IKLWNvbXBhdGliaWxpdHkncyBzYWtlLgotCi1Ob3cgdGhhdCB3ZSd2ZSBsb29rZWQgYXQgdGhlIGdlbmVyYWwgZXh0ZW5zaW9uIHN5bnRheCwgd2UgY2FuIHJldHVybgotdG8gdGhlIGZlYXR1cmVzIHRoYXQgc2ltcGxpZnkgd29ya2luZyB3aXRoIGdyb3VwcyBpbiBjb21wbGV4IFJFcy4KLVNpbmNlIGdyb3VwcyBhcmUgbnVtYmVyZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0IGFuZCBhIGNvbXBsZXggZXhwcmVzc2lvbgotbWF5IHVzZSBtYW55IGdyb3VwcywgaXQgY2FuIGJlY29tZSBkaWZmaWN1bHQgdG8ga2VlcCB0cmFjayBvZiB0aGUKLWNvcnJlY3QgbnVtYmVyaW5nLiAgTW9kaWZ5aW5nIHN1Y2ggYSBjb21wbGV4IFJFIGlzIGFubm95aW5nLCB0b286Ci1pbnNlcnQgYSBuZXcgZ3JvdXAgbmVhciB0aGUgYmVnaW5uaW5nIGFuZCB5b3UgY2hhbmdlIHRoZSBudW1iZXJzIG9mCi1ldmVyeXRoaW5nIHRoYXQgZm9sbG93cyBpdC4KLQotU29tZXRpbWVzIHlvdSdsbCB3YW50IHRvIHVzZSBhIGdyb3VwIHRvIGNvbGxlY3QgYSBwYXJ0IG9mIGEgcmVndWxhcgotZXhwcmVzc2lvbiwgYnV0IGFyZW4ndCBpbnRlcmVzdGVkIGluIHJldHJpZXZpbmcgdGhlIGdyb3VwJ3MgY29udGVudHMuCi1Zb3UgY2FuIG1ha2UgdGhpcyBmYWN0IGV4cGxpY2l0IGJ5IHVzaW5nIGEgbm9uLWNhcHR1cmluZyBncm91cDoKLVxyZWdleHB7KD86Li4uKX0sIHdoZXJlIHlvdSBjYW4gcmVwbGFjZSB0aGUgXHJlZ2V4cHsuLi59Ci13aXRoIGFueSBvdGhlciByZWd1bGFyIGV4cHJlc3Npb24uCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBtID0gcmUubWF0Y2goIihbYWJjXSkrIiwgImFiYyIpCi0+Pj4gbS5ncm91cHMoKQotKCdjJywpCi0+Pj4gbSA9IHJlLm1hdGNoKCIoPzpbYWJjXSkrIiwgImFiYyIpCi0+Pj4gbS5ncm91cHMoKQotKCkKLVxlbmR7dmVyYmF0aW19Ci0KLUV4Y2VwdCBmb3IgdGhlIGZhY3QgdGhhdCB5b3UgY2FuJ3QgcmV0cmlldmUgdGhlIGNvbnRlbnRzIG9mIHdoYXQgdGhlCi1ncm91cCBtYXRjaGVkLCBhIG5vbi1jYXB0dXJpbmcgZ3JvdXAgYmVoYXZlcyBleGFjdGx5IHRoZSBzYW1lIGFzIGEKLWNhcHR1cmluZyBncm91cDsgeW91IGNhbiBwdXQgYW55dGhpbmcgaW5zaWRlIGl0LCByZXBlYXQgaXQgd2l0aCBhCi1yZXBldGl0aW9uIG1ldGFjaGFyYWN0ZXIgc3VjaCBhcyBcc2FtcHsqfSwgYW5kIG5lc3QgaXQgd2l0aGluIG90aGVyCi1ncm91cHMgKGNhcHR1cmluZyBvciBub24tY2FwdHVyaW5nKS4gIFxyZWdleHB7KD86Li4uKX0gaXMgcGFydGljdWxhcmx5Ci11c2VmdWwgd2hlbiBtb2RpZnlpbmcgYW4gZXhpc3RpbmcgcGF0dGVybiwgc2luY2UgeW91IGNhbiBhZGQgbmV3IGdyb3Vwcwotd2l0aG91dCBjaGFuZ2luZyBob3cgYWxsIHRoZSBvdGhlciBncm91cHMgYXJlIG51bWJlcmVkLiAgSXQgc2hvdWxkIGJlCi1tZW50aW9uZWQgdGhhdCB0aGVyZSdzIG5vIHBlcmZvcm1hbmNlIGRpZmZlcmVuY2UgaW4gc2VhcmNoaW5nIGJldHdlZW4KLWNhcHR1cmluZyBhbmQgbm9uLWNhcHR1cmluZyBncm91cHM7IG5laXRoZXIgZm9ybSBpcyBhbnkgZmFzdGVyIHRoYW4KLXRoZSBvdGhlci4KLQotQSBtb3JlIHNpZ25pZmljYW50IGZlYXR1cmUgaXMgbmFtZWQgZ3JvdXBzOiBpbnN0ZWFkIG9mCi1yZWZlcnJpbmcgdG8gdGhlbSBieSBudW1iZXJzLCBncm91cHMgY2FuIGJlIHJlZmVyZW5jZWQgYnkgYSBuYW1lLgotCi1UaGUgc3ludGF4IGZvciBhIG5hbWVkIGdyb3VwIGlzIG9uZSBvZiB0aGUgUHl0aG9uLXNwZWNpZmljIGV4dGVuc2lvbnM6Ci1ccmVnZXhweyg/UDxcdmFye25hbWV9Pi4uLil9LiAgXHZhcntuYW1lfSBpcywgb2J2aW91c2x5LCB0aGUgbmFtZSBvZgotdGhlIGdyb3VwLiAgTmFtZWQgZ3JvdXBzIGFsc28gYmVoYXZlIGV4YWN0bHkgbGlrZSBjYXB0dXJpbmcgZ3JvdXBzLAotYW5kIGFkZGl0aW9uYWxseSBhc3NvY2lhdGUgYSBuYW1lIHdpdGggYSBncm91cC4gIFRoZQotXGNsYXNze01hdGNoT2JqZWN0fSBtZXRob2RzIHRoYXQgZGVhbCB3aXRoIGNhcHR1cmluZyBncm91cHMgYWxsIGFjY2VwdAotZWl0aGVyIGludGVnZXJzIHRoYXQgcmVmZXIgdG8gdGhlIGdyb3VwIGJ5IG51bWJlciBvciBzdHJpbmdzIHRoYXQKLWNvbnRhaW4gdGhlIGRlc2lyZWQgZ3JvdXAncyBuYW1lLiAgTmFtZWQgZ3JvdXBzIGFyZSBzdGlsbCBnaXZlbgotbnVtYmVycywgc28geW91IGNhbiByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBhIGdyb3VwIGluIHR3byB3YXlzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gcCA9IHJlLmNvbXBpbGUocicoP1A8d29yZD5cYlx3K1xiKScpCi0+Pj4gbSA9IHAuc2VhcmNoKCAnKCgoKCBMb3RzIG9mIHB1bmN0dWF0aW9uICkpKScgKQotPj4+IG0uZ3JvdXAoJ3dvcmQnKQotJ0xvdHMnCi0+Pj4gbS5ncm91cCgxKQotJ0xvdHMnCi1cZW5ke3ZlcmJhdGltfQotCi1OYW1lZCBncm91cHMgYXJlIGhhbmR5IGJlY2F1c2UgdGhleSBsZXQgeW91IHVzZSBlYXNpbHktcmVtZW1iZXJlZAotbmFtZXMsIGluc3RlYWQgb2YgaGF2aW5nIHRvIHJlbWVtYmVyIG51bWJlcnMuICBIZXJlJ3MgYW4gZXhhbXBsZSBSRQotZnJvbSB0aGUgXG1vZHVsZXtpbWFwbGlifSBtb2R1bGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLUludGVybmFsRGF0ZSA9IHJlLmNvbXBpbGUocidJTlRFUk5BTERBVEUgIicKLSAgICAgICAgcicoP1A8ZGF5PlsgMTIzXVswLTldKS0oP1A8bW9uPltBLVpdW2Etel1bYS16XSktJwotCXInKD9QPHllYXI+WzAtOV1bMC05XVswLTldWzAtOV0pJwotICAgICAgICByJyAoP1A8aG91cj5bMC05XVswLTldKTooP1A8bWluPlswLTldWzAtOV0pOig/UDxzZWM+WzAtOV1bMC05XSknCi0gICAgICAgIHInICg/UDx6b25lbj5bLStdKSg/UDx6b25laD5bMC05XVswLTldKSg/UDx6b25lbT5bMC05XVswLTldKScKLSAgICAgICAgciciJykKLVxlbmR7dmVyYmF0aW19Ci0KLUl0J3Mgb2J2aW91c2x5IG11Y2ggZWFzaWVyIHRvIHJldHJpZXZlIFxjb2Rle20uZ3JvdXAoJ3pvbmVtJyl9LAotaW5zdGVhZCBvZiBoYXZpbmcgdG8gcmVtZW1iZXIgdG8gcmV0cmlldmUgZ3JvdXAgOS4KLQotVGhlIHN5bnRheCBmb3IgYmFja3JlZmVyZW5jZXMgaW4gYW4gZXhwcmVzc2lvbiBzdWNoIGFzCi1ccmVnZXhweyguLi4pXGUgMX0gcmVmZXJzIHRvIHRoZSBudW1iZXIgb2YgdGhlIGdyb3VwLiAgVGhlcmUncwotbmF0dXJhbGx5IGEgdmFyaWFudCB0aGF0IHVzZXMgdGhlIGdyb3VwIG5hbWUgaW5zdGVhZCBvZiB0aGUgbnVtYmVyLgotVGhpcyBpcyBhbm90aGVyIFB5dGhvbiBleHRlbnNpb246IFxyZWdleHB7KD9QPVx2YXJ7bmFtZX0pfSBpbmRpY2F0ZXMKLXRoYXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBncm91cCBjYWxsZWQgXHZhcntuYW1lfSBzaG91bGQgYWdhaW4gYmUgbWF0Y2hlZAotYXQgdGhlIGN1cnJlbnQgcG9pbnQuICBUaGUgcmVndWxhciBleHByZXNzaW9uIGZvciBmaW5kaW5nIGRvdWJsZWQKLXdvcmRzLCBccmVnZXhweyhcZSBiXGUgdyspXGUgcytcZSAxfSBjYW4gYWxzbyBiZSB3cml0dGVuIGFzCi1ccmVnZXhweyg/UDx3b3JkPlxlIGJcZSB3KylcZSBzKyg/UD13b3JkKX06Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBwID0gcmUuY29tcGlsZShyJyg/UDx3b3JkPlxiXHcrKVxzKyg/UD13b3JkKScpCi0+Pj4gcC5zZWFyY2goJ1BhcmlzIGluIHRoZSB0aGUgc3ByaW5nJykuZ3JvdXAoKQotJ3RoZSB0aGUnCi1cZW5ke3ZlcmJhdGltfQotCi1cc3Vic2VjdGlvbntMb29rYWhlYWQgQXNzZXJ0aW9uc30KLQotQW5vdGhlciB6ZXJvLXdpZHRoIGFzc2VydGlvbiBpcyB0aGUgbG9va2FoZWFkIGFzc2VydGlvbi4gIExvb2thaGVhZAotYXNzZXJ0aW9ucyBhcmUgYXZhaWxhYmxlIGluIGJvdGggcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIGZvcm0sIGFuZCAKLWxvb2sgbGlrZSB0aGlzOgotCi1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtW1xyZWdleHB7KD89Li4uKX1dIFBvc2l0aXZlIGxvb2thaGVhZCBhc3NlcnRpb24uICBUaGlzIHN1Y2NlZWRzCi1pZiB0aGUgY29udGFpbmVkIHJlZ3VsYXIgZXhwcmVzc2lvbiwgcmVwcmVzZW50ZWQgaGVyZSBieSBcY29kZXsuLi59LAotc3VjY2Vzc2Z1bGx5IG1hdGNoZXMgYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24sIGFuZCBmYWlscyBvdGhlcndpc2UuCi1CdXQsIG9uY2UgdGhlIGNvbnRhaW5lZCBleHByZXNzaW9uIGhhcyBiZWVuIHRyaWVkLCB0aGUgbWF0Y2hpbmcgZW5naW5lCi1kb2Vzbid0IGFkdmFuY2UgYXQgYWxsOyB0aGUgcmVzdCBvZiB0aGUgcGF0dGVybiBpcyB0cmllZCByaWdodCB3aGVyZQotdGhlIGFzc2VydGlvbiBzdGFydGVkLgotCi1caXRlbVtccmVnZXhweyg/IS4uLil9XSBOZWdhdGl2ZSBsb29rYWhlYWQgYXNzZXJ0aW9uLiAgVGhpcyBpcyB0aGUKLW9wcG9zaXRlIG9mIHRoZSBwb3NpdGl2ZSBhc3NlcnRpb247IGl0IHN1Y2NlZWRzIGlmIHRoZSBjb250YWluZWQgZXhwcmVzc2lvbgotXGVtcGh7ZG9lc24ndH0gbWF0Y2ggYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIHN0cmluZy4KLVxlbmR7aXRlbWl6ZX0KLQotVG8gbWFrZSB0aGlzIGNvbmNyZXRlLCBsZXQncyBsb29rIGF0IGEgY2FzZSB3aGVyZSBhIGxvb2thaGVhZCBpcwotdXNlZnVsLiAgQ29uc2lkZXIgYSBzaW1wbGUgcGF0dGVybiB0byBtYXRjaCBhIGZpbGVuYW1lIGFuZCBzcGxpdCBpdAotYXBhcnQgaW50byBhIGJhc2UgbmFtZSBhbmQgYW4gZXh0ZW5zaW9uLCBzZXBhcmF0ZWQgYnkgYSBcc2FtcHsufS4gIEZvcgotZXhhbXBsZSwgaW4gXHNhbXB7bmV3cy5yY30sIFxzYW1we25ld3N9IGlzIHRoZSBiYXNlIG5hbWUsIGFuZAotXHNhbXB7cmN9IGlzIHRoZSBmaWxlbmFtZSdzIGV4dGVuc2lvbi4KLQotVGhlIHBhdHRlcm4gdG8gbWF0Y2ggdGhpcyBpcyBxdWl0ZSBzaW1wbGU6IAotCi1ccmVnZXhwey4qWy5dLipcJH0KLQotTm90aWNlIHRoYXQgdGhlIFxzYW1wey59IG5lZWRzIHRvIGJlIHRyZWF0ZWQgc3BlY2lhbGx5IGJlY2F1c2UgaXQncyBhCi1tZXRhY2hhcmFjdGVyOyBJJ3ZlIHB1dCBpdCBpbnNpZGUgYSBjaGFyYWN0ZXIgY2xhc3MuICBBbHNvIG5vdGljZSB0aGUKLXRyYWlsaW5nIFxyZWdleHB7XCR9OyB0aGlzIGlzIGFkZGVkIHRvIGVuc3VyZSB0aGF0IGFsbCB0aGUgcmVzdCBvZiB0aGUKLXN0cmluZyBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSBleHRlbnNpb24uICBUaGlzIHJlZ3VsYXIgZXhwcmVzc2lvbgotbWF0Y2hlcyBcc2FtcHtmb28uYmFyfSBhbmQgXHNhbXB7YXV0b2V4ZWMuYmF0fSBhbmQgXHNhbXB7c2VuZG1haWwuY2Z9IGFuZAotXHNhbXB7cHJpbnRlcnMuY29uZn0uCi0KLU5vdywgY29uc2lkZXIgY29tcGxpY2F0aW5nIHRoZSBwcm9ibGVtIGEgYml0OyB3aGF0IGlmIHlvdSB3YW50IHRvCi1tYXRjaCBmaWxlbmFtZXMgd2hlcmUgdGhlIGV4dGVuc2lvbiBpcyBub3QgXHNhbXB7YmF0fT8KLVNvbWUgaW5jb3JyZWN0IGF0dGVtcHRzOgotCi1cdmVyYnwuKlsuXVteYl0uKiR8Ci0lICQKLQotVGhlIGZpcnN0IGF0dGVtcHQgYWJvdmUgdHJpZXMgdG8gZXhjbHVkZSBcc2FtcHtiYXR9IGJ5IHJlcXVpcmluZyB0aGF0Ci10aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBleHRlbnNpb24gaXMgbm90IGEgXHNhbXB7Yn0uICBUaGlzIGlzCi13cm9uZywgYmVjYXVzZSB0aGUgcGF0dGVybiBhbHNvIGRvZXNuJ3QgbWF0Y2ggXHNhbXB7Zm9vLmJhcn0uCi0KLSUgTWVzc2VzIHVwIHRoZSBIVE1MIHdpdGhvdXQgdGhlIGN1cmx5IGJyYWNlcyBhcm91bmQgXF4KLVxyZWdleHB7LipbLl0oW3tcXn1iXS4ufC5be1xefWFdLnwuLlt7XF59dF0pXCR9Ci0KLVRoZSBleHByZXNzaW9uIGdldHMgbWVzc2llciB3aGVuIHlvdSB0cnkgdG8gcGF0Y2ggdXAgdGhlIGZpcnN0Ci1zb2x1dGlvbiBieSByZXF1aXJpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgdG8gbWF0Y2g6IHRoZSBmaXJzdAotY2hhcmFjdGVyIG9mIHRoZSBleHRlbnNpb24gaXNuJ3QgXHNhbXB7Yn07IHRoZSBzZWNvbmQgY2hhcmFjdGVyIGlzbid0Ci1cc2FtcHthfTsgb3IgdGhlIHRoaXJkIGNoYXJhY3RlciBpc24ndCBcc2FtcHt0fS4gIFRoaXMgYWNjZXB0cwotXHNhbXB7Zm9vLmJhcn0gYW5kIHJlamVjdHMgXHNhbXB7YXV0b2V4ZWMuYmF0fSwgYnV0IGl0IHJlcXVpcmVzIGEKLXRocmVlLWxldHRlciBleHRlbnNpb24gYW5kIHdvbid0IGFjY2VwdCBhIGZpbGVuYW1lIHdpdGggYSB0d28tbGV0dGVyCi1leHRlbnNpb24gc3VjaCBhcyBcc2FtcHtzZW5kbWFpbC5jZn0uICBXZSdsbCBjb21wbGljYXRlIHRoZSBwYXR0ZXJuCi1hZ2FpbiBpbiBhbiBlZmZvcnQgdG8gZml4IGl0LgotCi1ccmVnZXhwey4qWy5dKFt7XF59Yl0uPy4/fC5be1xefWFdPy4/fC4uP1t7XF59dF0/KVwkfQotCi1JbiB0aGUgdGhpcmQgYXR0ZW1wdCwgdGhlIHNlY29uZCBhbmQgdGhpcmQgbGV0dGVycyBhcmUgYWxsIG1hZGUKLW9wdGlvbmFsIGluIG9yZGVyIHRvIGFsbG93IG1hdGNoaW5nIGV4dGVuc2lvbnMgc2hvcnRlciB0aGFuIHRocmVlCi1jaGFyYWN0ZXJzLCBzdWNoIGFzIFxzYW1we3NlbmRtYWlsLmNmfS4KLQotVGhlIHBhdHRlcm4ncyBnZXR0aW5nIHJlYWxseSBjb21wbGljYXRlZCBub3csIHdoaWNoIG1ha2VzIGl0IGhhcmQgdG8KLXJlYWQgYW5kIHVuZGVyc3RhbmQuICBXb3JzZSwgaWYgdGhlIHByb2JsZW0gY2hhbmdlcyBhbmQgeW91IHdhbnQgdG8KLWV4Y2x1ZGUgYm90aCBcc2FtcHtiYXR9IGFuZCBcc2FtcHtleGV9IGFzIGV4dGVuc2lvbnMsIHRoZSBwYXR0ZXJuCi13b3VsZCBnZXQgZXZlbiBtb3JlIGNvbXBsaWNhdGVkIGFuZCBjb25mdXNpbmcuCi0KLUEgbmVnYXRpdmUgbG9va2FoZWFkIGN1dHMgdGhyb3VnaCBhbGwgdGhpcyBjb25mdXNpb246Ci0KLVxyZWdleHB7LipbLl0oPyFiYXRcJCkuKlwkfQotJSAkCi0KLVRoZSBuZWdhdGl2ZSBsb29rYWhlYWQgbWVhbnM6IGlmIHRoZSBleHByZXNzaW9uIFxyZWdleHB7YmF0fSBkb2Vzbid0IG1hdGNoIGF0Ci10aGlzIHBvaW50LCB0cnkgdGhlIHJlc3Qgb2YgdGhlIHBhdHRlcm47IGlmIFxyZWdleHB7YmF0XCR9IGRvZXMgbWF0Y2gsCi10aGUgd2hvbGUgcGF0dGVybiB3aWxsIGZhaWwuICBUaGUgdHJhaWxpbmcgXHJlZ2V4cHtcJH0gaXMgcmVxdWlyZWQgdG8KLWVuc3VyZSB0aGF0IHNvbWV0aGluZyBsaWtlIFxzYW1we3NhbXBsZS5iYXRjaH0sIHdoZXJlIHRoZSBleHRlbnNpb24KLW9ubHkgc3RhcnRzIHdpdGggXHNhbXB7YmF0fSwgd2lsbCBiZSBhbGxvd2VkLgotCi1FeGNsdWRpbmcgYW5vdGhlciBmaWxlbmFtZSBleHRlbnNpb24gaXMgbm93IGVhc3k7IHNpbXBseSBhZGQgaXQgYXMgYW4KLWFsdGVybmF0aXZlIGluc2lkZSB0aGUgYXNzZXJ0aW9uLiAgVGhlIGZvbGxvd2luZyBwYXR0ZXJuIGV4Y2x1ZGVzCi1maWxlbmFtZXMgdGhhdCBlbmQgaW4gZWl0aGVyIFxzYW1we2JhdH0gb3IgXHNhbXB7ZXhlfToKLQotXHJlZ2V4cHsuKlsuXSg/IWJhdFwkfGV4ZVwkKS4qXCR9Ci0lICQKLQotCi1cc2VjdGlvbntNb2RpZnlpbmcgU3RyaW5nc30KLQotVXAgdG8gdGhpcyBwb2ludCwgd2UndmUgc2ltcGx5IHBlcmZvcm1lZCBzZWFyY2hlcyBhZ2FpbnN0IGEgc3RhdGljCi1zdHJpbmcuICBSZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBhbHNvIGNvbW1vbmx5IHVzZWQgdG8gbW9kaWZ5IHN0cmluZ3MKLWluIHZhcmlvdXMgd2F5cywgdXNpbmcgdGhlIGZvbGxvd2luZyBcY2xhc3N7UmVnZXhPYmplY3R9IG1ldGhvZHM6Ci0KLVxiZWdpbnt0YWJsZWlpfXtjfGx9e2NvZGV9e01ldGhvZC9BdHRyaWJ1dGV9e1B1cnBvc2V9Ci0gIFxsaW5laWl7c3BsaXQoKX17U3BsaXQgdGhlIHN0cmluZyBpbnRvIGEgbGlzdCwgc3BsaXR0aW5nIGl0IHdoZXJldmVyIHRoZSBSRSBtYXRjaGVzfQotICBcbGluZWlpe3N1YigpfXtGaW5kIGFsbCBzdWJzdHJpbmdzIHdoZXJlIHRoZSBSRSBtYXRjaGVzLCBhbmQgcmVwbGFjZSB0aGVtIHdpdGggYSBkaWZmZXJlbnQgc3RyaW5nfQotICBcbGluZWlpe3N1Ym4oKX17RG9lcyB0aGUgc2FtZSB0aGluZyBhcyBcbWV0aG9ke3N1YigpfSwgCi0gICBidXQgcmV0dXJucyB0aGUgbmV3IHN0cmluZyBhbmQgdGhlIG51bWJlciBvZiByZXBsYWNlbWVudHN9Ci1cZW5ke3RhYmxlaWl9Ci0KLQotXHN1YnNlY3Rpb257U3BsaXR0aW5nIFN0cmluZ3N9Ci0KLVRoZSBcbWV0aG9ke3NwbGl0KCl9IG1ldGhvZCBvZiBhIFxjbGFzc3tSZWdleE9iamVjdH0gc3BsaXRzIGEgc3RyaW5nCi1hcGFydCB3aGVyZXZlciB0aGUgUkUgbWF0Y2hlcywgcmV0dXJuaW5nIGEgbGlzdCBvZiB0aGUgcGllY2VzLgotSXQncyBzaW1pbGFyIHRvIHRoZSBcbWV0aG9ke3NwbGl0KCl9IG1ldGhvZCBvZiBzdHJpbmdzIGJ1dAotcHJvdmlkZXMgbXVjaCBtb3JlCi1nZW5lcmFsaXR5IGluIHRoZSBkZWxpbWl0ZXJzIHRoYXQgeW91IGNhbiBzcGxpdCBieTsKLVxtZXRob2R7c3BsaXQoKX0gb25seSBzdXBwb3J0cyBzcGxpdHRpbmcgYnkgd2hpdGVzcGFjZSBvciBieQotYSBmaXhlZCBzdHJpbmcuICBBcyB5b3UnZCBleHBlY3QsIHRoZXJlJ3MgYSBtb2R1bGUtbGV2ZWwKLVxmdW5jdGlvbntyZS5zcGxpdCgpfSBmdW5jdGlvbiwgdG9vLgotCi1cYmVnaW57bWV0aG9kZGVzY317c3BsaXR9e3N0cmluZyBcb3B0aW9uYWx7LCBtYXhzcGxpdFxjb2RleyA9IDB9fX0KLSAgU3BsaXQgXHZhcntzdHJpbmd9IGJ5IHRoZSBtYXRjaGVzIG9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uICBJZgotICBjYXB0dXJpbmcgcGFyZW50aGVzZXMgYXJlIHVzZWQgaW4gdGhlIFJFLCB0aGVuIHRoZWlyIGNvbnRlbnRzIHdpbGwKLSAgYWxzbyBiZSByZXR1cm5lZCBhcyBwYXJ0IG9mIHRoZSByZXN1bHRpbmcgbGlzdC4gIElmIFx2YXJ7bWF4c3BsaXR9Ci0gIGlzIG5vbnplcm8sIGF0IG1vc3QgXHZhcnttYXhzcGxpdH0gc3BsaXRzIGFyZSBwZXJmb3JtZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVlvdSBjYW4gbGltaXQgdGhlIG51bWJlciBvZiBzcGxpdHMgbWFkZSwgYnkgcGFzc2luZyBhIHZhbHVlIGZvcgotXHZhcnttYXhzcGxpdH0uICBXaGVuIFx2YXJ7bWF4c3BsaXR9IGlzIG5vbnplcm8sIGF0IG1vc3QKLVx2YXJ7bWF4c3BsaXR9IHNwbGl0cyB3aWxsIGJlIG1hZGUsIGFuZCB0aGUgcmVtYWluZGVyIG9mIHRoZSBzdHJpbmcgaXMKLXJldHVybmVkIGFzIHRoZSBmaW5hbCBlbGVtZW50IG9mIHRoZSBsaXN0LiAgSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLAotdGhlIGRlbGltaXRlciBpcyBhbnkgc2VxdWVuY2Ugb2Ygbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gcCA9IHJlLmNvbXBpbGUocidcVysnKQotPj4+IHAuc3BsaXQoJ1RoaXMgaXMgYSB0ZXN0LCBzaG9ydCBhbmQgc3dlZXQsIG9mIHNwbGl0KCkuJykKLVsnVGhpcycsICdpcycsICdhJywgJ3Rlc3QnLCAnc2hvcnQnLCAnYW5kJywgJ3N3ZWV0JywgJ29mJywgJ3NwbGl0JywgJyddCi0+Pj4gcC5zcGxpdCgnVGhpcyBpcyBhIHRlc3QsIHNob3J0IGFuZCBzd2VldCwgb2Ygc3BsaXQoKS4nLCAzKQotWydUaGlzJywgJ2lzJywgJ2EnLCAndGVzdCwgc2hvcnQgYW5kIHN3ZWV0LCBvZiBzcGxpdCgpLiddCi1cZW5ke3ZlcmJhdGltfQotCi1Tb21ldGltZXMgeW91J3JlIG5vdCBvbmx5IGludGVyZXN0ZWQgaW4gd2hhdCB0aGUgdGV4dCBiZXR3ZWVuCi1kZWxpbWl0ZXJzIGlzLCBidXQgYWxzbyBuZWVkIHRvIGtub3cgd2hhdCB0aGUgZGVsaW1pdGVyIHdhcy4gIElmCi1jYXB0dXJpbmcgcGFyZW50aGVzZXMgYXJlIHVzZWQgaW4gdGhlIFJFLCB0aGVuIHRoZWlyIHZhbHVlcyBhcmUgYWxzbwotcmV0dXJuZWQgYXMgcGFydCBvZiB0aGUgbGlzdC4gIENvbXBhcmUgdGhlIGZvbGxvd2luZyBjYWxsczoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHAgPSByZS5jb21waWxlKHInXFcrJykKLT4+PiBwMiA9IHJlLmNvbXBpbGUocicoXFcrKScpCi0+Pj4gcC5zcGxpdCgnVGhpcy4uLiBpcyBhIHRlc3QuJykKLVsnVGhpcycsICdpcycsICdhJywgJ3Rlc3QnLCAnJ10KLT4+PiBwMi5zcGxpdCgnVGhpcy4uLiBpcyBhIHRlc3QuJykKLVsnVGhpcycsICcuLi4gJywgJ2lzJywgJyAnLCAnYScsICcgJywgJ3Rlc3QnLCAnLicsICcnXQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIG1vZHVsZS1sZXZlbCBmdW5jdGlvbiBcZnVuY3Rpb257cmUuc3BsaXQoKX0gYWRkcyB0aGUgUkUgdG8gYmUKLXVzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LCBidXQgaXMgb3RoZXJ3aXNlIHRoZSBzYW1lLiAgCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiByZS5zcGxpdCgnW1xXXSsnLCAnV29yZHMsIHdvcmRzLCB3b3Jkcy4nKQotWydXb3JkcycsICd3b3JkcycsICd3b3JkcycsICcnXQotPj4+IHJlLnNwbGl0KCcoW1xXXSspJywgJ1dvcmRzLCB3b3Jkcywgd29yZHMuJykKLVsnV29yZHMnLCAnLCAnLCAnd29yZHMnLCAnLCAnLCAnd29yZHMnLCAnLicsICcnXQotPj4+IHJlLnNwbGl0KCdbXFddKycsICdXb3Jkcywgd29yZHMsIHdvcmRzLicsIDEpCi1bJ1dvcmRzJywgJ3dvcmRzLCB3b3Jkcy4nXQotXGVuZHt2ZXJiYXRpbX0KLQotXHN1YnNlY3Rpb257U2VhcmNoIGFuZCBSZXBsYWNlfQotCi1Bbm90aGVyIGNvbW1vbiB0YXNrIGlzIHRvIGZpbmQgYWxsIHRoZSBtYXRjaGVzIGZvciBhIHBhdHRlcm4sIGFuZAotcmVwbGFjZSB0aGVtIHdpdGggYSBkaWZmZXJlbnQgc3RyaW5nLiAgVGhlIFxtZXRob2R7c3ViKCl9IG1ldGhvZCB0YWtlcwotYSByZXBsYWNlbWVudCB2YWx1ZSwgd2hpY2ggY2FuIGJlIGVpdGhlciBhIHN0cmluZyBvciBhIGZ1bmN0aW9uLCBhbmQKLXRoZSBzdHJpbmcgdG8gYmUgcHJvY2Vzc2VkLgotCi1cYmVnaW57bWV0aG9kZGVzY317c3VifXtyZXBsYWNlbWVudCwgc3RyaW5nXG9wdGlvbmFseywgY291bnRcY29kZXsgPSAwfX19Ci1SZXR1cm5zIHRoZSBzdHJpbmcgb2J0YWluZWQgYnkgcmVwbGFjaW5nIHRoZSBsZWZ0bW9zdCBub24tb3ZlcmxhcHBpbmcKLW9jY3VycmVuY2VzIG9mIHRoZSBSRSBpbiBcdmFye3N0cmluZ30gYnkgdGhlIHJlcGxhY2VtZW50Ci1cdmFye3JlcGxhY2VtZW50fS4gIElmIHRoZSBwYXR0ZXJuIGlzbid0IGZvdW5kLCBcdmFye3N0cmluZ30gaXMgcmV0dXJuZWQKLXVuY2hhbmdlZC4gIAotCi1UaGUgb3B0aW9uYWwgYXJndW1lbnQgXHZhcntjb3VudH0gaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHBhdHRlcm4KLW9jY3VycmVuY2VzIHRvIGJlIHJlcGxhY2VkOyBcdmFye2NvdW50fSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlCi1pbnRlZ2VyLiAgVGhlIGRlZmF1bHQgdmFsdWUgb2YgMCBtZWFucyB0byByZXBsYWNlIGFsbCBvY2N1cnJlbmNlcy4KLVxlbmR7bWV0aG9kZGVzY30KLQotSGVyZSdzIGEgc2ltcGxlIGV4YW1wbGUgb2YgdXNpbmcgdGhlIFxtZXRob2R7c3ViKCl9IG1ldGhvZC4gIEl0Ci1yZXBsYWNlcyBjb2xvdXIgbmFtZXMgd2l0aCB0aGUgd29yZCBcc2FtcHtjb2xvdXJ9OgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gcCA9IHJlLmNvbXBpbGUoICcoYmx1ZXx3aGl0ZXxyZWQpJykKLT4+PiBwLnN1YiggJ2NvbG91cicsICdibHVlIHNvY2tzIGFuZCByZWQgc2hvZXMnKQotJ2NvbG91ciBzb2NrcyBhbmQgY29sb3VyIHNob2VzJwotPj4+IHAuc3ViKCAnY29sb3VyJywgJ2JsdWUgc29ja3MgYW5kIHJlZCBzaG9lcycsIGNvdW50PTEpCi0nY29sb3VyIHNvY2tzIGFuZCByZWQgc2hvZXMnCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgXG1ldGhvZHtzdWJuKCl9IG1ldGhvZCBkb2VzIHRoZSBzYW1lIHdvcmssIGJ1dCByZXR1cm5zIGEgMi10dXBsZQotY29udGFpbmluZyB0aGUgbmV3IHN0cmluZyB2YWx1ZSBhbmQgdGhlIG51bWJlciBvZiByZXBsYWNlbWVudHMgCi10aGF0IHdlcmUgcGVyZm9ybWVkOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gcCA9IHJlLmNvbXBpbGUoICcoYmx1ZXx3aGl0ZXxyZWQpJykKLT4+PiBwLnN1Ym4oICdjb2xvdXInLCAnYmx1ZSBzb2NrcyBhbmQgcmVkIHNob2VzJykKLSgnY29sb3VyIHNvY2tzIGFuZCBjb2xvdXIgc2hvZXMnLCAyKQotPj4+IHAuc3VibiggJ2NvbG91cicsICdubyBjb2xvdXJzIGF0IGFsbCcpCi0oJ25vIGNvbG91cnMgYXQgYWxsJywgMCkKLVxlbmR7dmVyYmF0aW19Ci0KLUVtcHR5IG1hdGNoZXMgYXJlIHJlcGxhY2VkIG9ubHkgd2hlbiB0aGV5J3JlIG5vdAotYWRqYWNlbnQgdG8gYSBwcmV2aW91cyBtYXRjaC4gIAotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gcCA9IHJlLmNvbXBpbGUoJ3gqJykKLT4+PiBwLnN1YignLScsICdhYnhkJykKLSctYS1iLWQtJwotXGVuZHt2ZXJiYXRpbX0KLQotSWYgXHZhcntyZXBsYWNlbWVudH0gaXMgYSBzdHJpbmcsIGFueSBiYWNrc2xhc2ggZXNjYXBlcyBpbiBpdCBhcmUKLXByb2Nlc3NlZC4gIFRoYXQgaXMsIFxzYW1we1xlIG59IGlzIGNvbnZlcnRlZCB0byBhIHNpbmdsZSBuZXdsaW5lCi1jaGFyYWN0ZXIsIFxzYW1we1xlIHJ9IGlzIGNvbnZlcnRlZCB0byBhIGNhcnJpYWdlIHJldHVybiwgYW5kIHNvIGZvcnRoLgotVW5rbm93biBlc2NhcGVzIHN1Y2ggYXMgXHNhbXB7XGUgan0gYXJlIGxlZnQgYWxvbmUuICBCYWNrcmVmZXJlbmNlcywKLXN1Y2ggYXMgXHNhbXB7XGUgNn0sIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBzdWJzdHJpbmcgbWF0Y2hlZCBieSB0aGUKLWNvcnJlc3BvbmRpbmcgZ3JvdXAgaW4gdGhlIFJFLiAgVGhpcyBsZXRzIHlvdSBpbmNvcnBvcmF0ZQotcG9ydGlvbnMgb2YgdGhlIG9yaWdpbmFsIHRleHQgaW4gdGhlIHJlc3VsdGluZwotcmVwbGFjZW1lbnQgc3RyaW5nLgotCi1UaGlzIGV4YW1wbGUgbWF0Y2hlcyB0aGUgd29yZCBcc2FtcHtzZWN0aW9ufSBmb2xsb3dlZCBieSBhIHN0cmluZwotZW5jbG9zZWQgaW4gXHNhbXB7XHt9LCBcc2FtcHtcfX0sIGFuZCBjaGFuZ2VzIFxzYW1we3NlY3Rpb259IHRvCi1cc2FtcHtzdWJzZWN0aW9ufToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHAgPSByZS5jb21waWxlKCdzZWN0aW9ueyAoIFtefV0qICkgfScsIHJlLlZFUkJPU0UpCi0+Pj4gcC5zdWIocidzdWJzZWN0aW9ue1wxfScsJ3NlY3Rpb257Rmlyc3R9IHNlY3Rpb257c2Vjb25kfScpCi0nc3Vic2VjdGlvbntGaXJzdH0gc3Vic2VjdGlvbntzZWNvbmR9JwotXGVuZHt2ZXJiYXRpbX0KLQotVGhlcmUncyBhbHNvIGEgc3ludGF4IGZvciByZWZlcnJpbmcgdG8gbmFtZWQgZ3JvdXBzIGFzIGRlZmluZWQgYnkgdGhlCi1ccmVnZXhweyg/UDxuYW1lPi4uLil9IHN5bnRheC4gIFxzYW1we1xlIGc8bmFtZT59IHdpbGwgdXNlIHRoZQotc3Vic3RyaW5nIG1hdGNoZWQgYnkgdGhlIGdyb3VwIG5hbWVkIFxzYW1we25hbWV9LCBhbmQgCi1cc2FtcHtcZSBnPFx2YXJ7bnVtYmVyfT59IAotdXNlcyB0aGUgY29ycmVzcG9uZGluZyBncm91cCBudW1iZXIuICAKLVxzYW1we1xlIGc8Mj59IGlzIHRoZXJlZm9yZSBlcXVpdmFsZW50IHRvIFxzYW1we1xlIDJ9LCAKLWJ1dCBpc24ndCBhbWJpZ3VvdXMgaW4gYQotcmVwbGFjZW1lbnQgc3RyaW5nIHN1Y2ggYXMgXHNhbXB7XGUgZzwyPjB9LiAgKFxzYW1we1xlIDIwfSB3b3VsZCBiZQotaW50ZXJwcmV0ZWQgYXMgYSByZWZlcmVuY2UgdG8gZ3JvdXAgMjAsIG5vdCBhIHJlZmVyZW5jZSB0byBncm91cCAyCi1mb2xsb3dlZCBieSB0aGUgbGl0ZXJhbCBjaGFyYWN0ZXIgXGNoYXJhY3RlcnswfS4pICBUaGUgZm9sbG93aW5nCi1zdWJzdGl0dXRpb25zIGFyZSBhbGwgZXF1aXZhbGVudCwgYnV0IHVzZSBhbGwgdGhyZWUgdmFyaWF0aW9ucyBvZiB0aGUKLXJlcGxhY2VtZW50IHN0cmluZy4KLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHAgPSByZS5jb21waWxlKCdzZWN0aW9ueyAoP1A8bmFtZT4gW159XSogKSB9JywgcmUuVkVSQk9TRSkKLT4+PiBwLnN1YihyJ3N1YnNlY3Rpb257XDF9Jywnc2VjdGlvbntGaXJzdH0nKQotJ3N1YnNlY3Rpb257Rmlyc3R9JwotPj4+IHAuc3ViKHInc3Vic2VjdGlvbntcZzwxPn0nLCdzZWN0aW9ue0ZpcnN0fScpCi0nc3Vic2VjdGlvbntGaXJzdH0nCi0+Pj4gcC5zdWIocidzdWJzZWN0aW9ue1xnPG5hbWU+fScsJ3NlY3Rpb257Rmlyc3R9JykKLSdzdWJzZWN0aW9ue0ZpcnN0fScKLVxlbmR7dmVyYmF0aW19Ci0KLVx2YXJ7cmVwbGFjZW1lbnR9IGNhbiBhbHNvIGJlIGEgZnVuY3Rpb24sIHdoaWNoIGdpdmVzIHlvdSBldmVuIG1vcmUKLWNvbnRyb2wuICBJZiBcdmFye3JlcGxhY2VtZW50fSBpcyBhIGZ1bmN0aW9uLCB0aGUgZnVuY3Rpb24gaXMKLWNhbGxlZCBmb3IgZXZlcnkgbm9uLW92ZXJsYXBwaW5nIG9jY3VycmVuY2Ugb2YgXHZhcntwYXR0ZXJufS4gIE9uIGVhY2gKLWNhbGwsIHRoZSBmdW5jdGlvbiBpcyAKLXBhc3NlZCBhIFxjbGFzc3tNYXRjaE9iamVjdH0gYXJndW1lbnQgZm9yIHRoZSBtYXRjaAotYW5kIGNhbiB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBjb21wdXRlIHRoZSBkZXNpcmVkIHJlcGxhY2VtZW50IHN0cmluZyBhbmQgcmV0dXJuIGl0LgotCi1JbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIHRoZSByZXBsYWNlbWVudCBmdW5jdGlvbiB0cmFuc2xhdGVzIAotZGVjaW1hbHMgaW50byBoZXhhZGVjaW1hbDoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGRlZiBoZXhyZXBsKCBtYXRjaCApOgotLi4uICAgICAiUmV0dXJuIHRoZSBoZXggc3RyaW5nIGZvciBhIGRlY2ltYWwgbnVtYmVyIgotLi4uICAgICB2YWx1ZSA9IGludCggbWF0Y2guZ3JvdXAoKSApCi0uLi4gICAgIHJldHVybiBoZXgodmFsdWUpCi0uLi4KLT4+PiBwID0gcmUuY29tcGlsZShyJ1xkKycpCi0+Pj4gcC5zdWIoaGV4cmVwbCwgJ0NhbGwgNjU0OTAgZm9yIHByaW50aW5nLCA0OTE1MiBmb3IgdXNlciBjb2RlLicpCi0nQ2FsbCAweGZmZDIgZm9yIHByaW50aW5nLCAweGMwMDAgZm9yIHVzZXIgY29kZS4nCi1cZW5ke3ZlcmJhdGltfQotCi1XaGVuIHVzaW5nIHRoZSBtb2R1bGUtbGV2ZWwgXGZ1bmN0aW9ue3JlLnN1YigpfSBmdW5jdGlvbiwgdGhlIHBhdHRlcm4KLWlzIHBhc3NlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQuICBUaGUgcGF0dGVybiBtYXkgYmUgYSBzdHJpbmcgb3IgYQotXGNsYXNze1JlZ2V4T2JqZWN0fTsgaWYgeW91IG5lZWQgdG8gc3BlY2lmeSByZWd1bGFyIGV4cHJlc3Npb24gZmxhZ3MsCi15b3UgbXVzdCBlaXRoZXIgdXNlIGEgXGNsYXNze1JlZ2V4T2JqZWN0fSBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyLCBvciB1c2UKLWVtYmVkZGVkIG1vZGlmaWVycyBpbiB0aGUgcGF0dGVybiwgZS5nLiAgXGNvZGV7c3ViKCIoP2kpYisiLCAieCIsICJiYmJiCi1CQkJCIil9IHJldHVybnMgXGNvZGV7J3ggeCd9LgotCi1cc2VjdGlvbntDb21tb24gUHJvYmxlbXN9Ci0KLVJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIGEgcG93ZXJmdWwgdG9vbCBmb3Igc29tZSBhcHBsaWNhdGlvbnMsIGJ1dCBpbgotc29tZSB3YXlzIHRoZWlyIGJlaGF2aW91ciBpc24ndCBpbnR1aXRpdmUgYW5kIGF0IHRpbWVzIHRoZXkgZG9uJ3QKLWJlaGF2ZSB0aGUgd2F5IHlvdSBtYXkgZXhwZWN0IHRoZW0gdG8uICBUaGlzIHNlY3Rpb24gd2lsbCBwb2ludCBvdXQKLXNvbWUgb2YgdGhlIG1vc3QgY29tbW9uIHBpdGZhbGxzLgotCi1cc3Vic2VjdGlvbntVc2UgU3RyaW5nIE1ldGhvZHN9Ci0KLVNvbWV0aW1lcyB1c2luZyB0aGUgXG1vZHVsZXtyZX0gbW9kdWxlIGlzIGEgbWlzdGFrZS4gIElmIHlvdSdyZQotbWF0Y2hpbmcgYSBmaXhlZCBzdHJpbmcsIG9yIGEgc2luZ2xlIGNoYXJhY3RlciBjbGFzcywgYW5kIHlvdSdyZSBub3QKLXVzaW5nIGFueSBcbW9kdWxle3JlfSBmZWF0dXJlcyBzdWNoIGFzIHRoZSBcY29uc3RhbnR7SUdOT1JFQ0FTRX0gZmxhZywKLXRoZW4gdGhlIGZ1bGwgcG93ZXIgb2YgcmVndWxhciBleHByZXNzaW9ucyBtYXkgbm90IGJlIHJlcXVpcmVkLgotU3RyaW5ncyBoYXZlIHNldmVyYWwgbWV0aG9kcyBmb3IgcGVyZm9ybWluZyBvcGVyYXRpb25zIHdpdGggZml4ZWQKLXN0cmluZ3MgYW5kIHRoZXkncmUgdXN1YWxseSBtdWNoIGZhc3RlciwgYmVjYXVzZSB0aGUgaW1wbGVtZW50YXRpb24gaXMKLWEgc2luZ2xlIHNtYWxsIEMgbG9vcCB0aGF0J3MgYmVlbiBvcHRpbWl6ZWQgZm9yIHRoZSBwdXJwb3NlLCBpbnN0ZWFkCi1vZiB0aGUgbGFyZ2UsIG1vcmUgZ2VuZXJhbGl6ZWQgcmVndWxhciBleHByZXNzaW9uIGVuZ2luZS4KLQotT25lIGV4YW1wbGUgbWlnaHQgYmUgcmVwbGFjaW5nIGEgc2luZ2xlIGZpeGVkIHN0cmluZyB3aXRoIGFub3RoZXIKLW9uZTsgZm9yIGV4YW1wbGUsIHlvdSBtaWdodCByZXBsYWNlIFxzYW1we3dvcmR9Ci13aXRoIFxzYW1we2RlZWR9LiAgXGNvZGV7cmUuc3ViKCl9IHNlZW1zIGxpa2UgdGhlIGZ1bmN0aW9uIHRvIHVzZSBmb3IKLXRoaXMsIGJ1dCBjb25zaWRlciB0aGUgXG1ldGhvZHtyZXBsYWNlKCl9IG1ldGhvZC4gIE5vdGUgdGhhdCAKLVxmdW5jdGlvbntyZXBsYWNlKCl9IHdpbGwgYWxzbyByZXBsYWNlIFxzYW1we3dvcmR9IGluc2lkZQotd29yZHMsIHR1cm5pbmcgXHNhbXB7c3dvcmRmaXNofSBpbnRvIFxzYW1we3NkZWVkZmlzaH0sIGJ1dCB0aGUgCi1uYXtcIlxpfXZlIFJFIFxyZWdleHB7d29yZH0gd291bGQgaGF2ZSBkb25lIHRoYXQsIHRvby4gIChUbyBhdm9pZCBwZXJmb3JtaW5nCi10aGUgc3Vic3RpdHV0aW9uIG9uIHBhcnRzIG9mIHdvcmRzLCB0aGUgcGF0dGVybiB3b3VsZCBoYXZlIHRvIGJlCi1ccmVnZXhwe1xlIGJ3b3JkXGUgYn0sIGluIG9yZGVyIHRvIHJlcXVpcmUgdGhhdCBcc2FtcHt3b3JkfSBoYXZlIGEKLXdvcmQgYm91bmRhcnkgb24gZWl0aGVyIHNpZGUuICBUaGlzIHRha2VzIHRoZSBqb2IgYmV5b25kIAotXG1ldGhvZHtyZXBsYWNlfSdzIGFiaWxpdGllcy4pCi0KLUFub3RoZXIgY29tbW9uIHRhc2sgaXMgZGVsZXRpbmcgZXZlcnkgb2NjdXJyZW5jZSBvZiBhIHNpbmdsZSBjaGFyYWN0ZXIKLWZyb20gYSBzdHJpbmcgb3IgcmVwbGFjaW5nIGl0IHdpdGggYW5vdGhlciBzaW5nbGUgY2hhcmFjdGVyLiAgWW91Ci1taWdodCBkbyB0aGlzIHdpdGggc29tZXRoaW5nIGxpa2UgXGNvZGV7cmUuc3ViKCdcZSBuJywgJyAnLCBTKX0sIGJ1dAotXG1ldGhvZHt0cmFuc2xhdGUoKX0gaXMgY2FwYWJsZSBvZiBkb2luZyBib3RoIHRhc2tzCi1hbmQgd2lsbCBiZSBmYXN0ZXIgdGhhbiBhbnkgcmVndWxhciBleHByZXNzaW9uIG9wZXJhdGlvbiBjYW4gYmUuCi0KLUluIHNob3J0LCBiZWZvcmUgdHVybmluZyB0byB0aGUgXG1vZHVsZXtyZX0gbW9kdWxlLCBjb25zaWRlciB3aGV0aGVyCi15b3VyIHByb2JsZW0gY2FuIGJlIHNvbHZlZCB3aXRoIGEgZmFzdGVyIGFuZCBzaW1wbGVyIHN0cmluZyBtZXRob2QuCi0KLVxzdWJzZWN0aW9ue21hdGNoKCkgdmVyc3VzIHNlYXJjaCgpfQotCi1UaGUgXGZ1bmN0aW9ue21hdGNoKCl9IGZ1bmN0aW9uIG9ubHkgY2hlY2tzIGlmIHRoZSBSRSBtYXRjaGVzIGF0Ci10aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcgd2hpbGUgXGZ1bmN0aW9ue3NlYXJjaCgpfSB3aWxsIHNjYW4KLWZvcndhcmQgdGhyb3VnaCB0aGUgc3RyaW5nIGZvciBhIG1hdGNoLgotSXQncyBpbXBvcnRhbnQgdG8ga2VlcCB0aGlzIGRpc3RpbmN0aW9uIGluIG1pbmQuICBSZW1lbWJlciwgCi1cZnVuY3Rpb257bWF0Y2goKX0gd2lsbCBvbmx5IHJlcG9ydCBhIHN1Y2Nlc3NmdWwgbWF0Y2ggd2hpY2gKLXdpbGwgc3RhcnQgYXQgMDsgaWYgdGhlIG1hdGNoIHdvdWxkbid0IHN0YXJ0IGF0IHplcm8sIAotXGZ1bmN0aW9ue21hdGNoKCl9IHdpbGwgXGVtcGh7bm90fSByZXBvcnQgaXQuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBwcmludCByZS5tYXRjaCgnc3VwZXInLCAnc3VwZXJzdGl0aW9uJykuc3BhbigpICAKLSgwLCA1KQotPj4+IHByaW50IHJlLm1hdGNoKCdzdXBlcicsICdpbnN1cGVyYWJsZScpICAgIAotTm9uZQotXGVuZHt2ZXJiYXRpbX0KLQotT24gdGhlIG90aGVyIGhhbmQsIFxmdW5jdGlvbntzZWFyY2goKX0gd2lsbCBzY2FuIGZvcndhcmQgdGhyb3VnaCB0aGUKLXN0cmluZywgcmVwb3J0aW5nIHRoZSBmaXJzdCBtYXRjaCBpdCBmaW5kcy4KLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHByaW50IHJlLnNlYXJjaCgnc3VwZXInLCAnc3VwZXJzdGl0aW9uJykuc3BhbigpCi0oMCwgNSkKLT4+PiBwcmludCByZS5zZWFyY2goJ3N1cGVyJywgJ2luc3VwZXJhYmxlJykuc3BhbigpCi0oMiwgNykKLVxlbmR7dmVyYmF0aW19Ci0KLVNvbWV0aW1lcyB5b3UnbGwgYmUgdGVtcHRlZCB0byBrZWVwIHVzaW5nIFxmdW5jdGlvbntyZS5tYXRjaCgpfSwgYW5kCi1qdXN0IGFkZCBccmVnZXhwey4qfSB0byB0aGUgZnJvbnQgb2YgeW91ciBSRS4gIFJlc2lzdCB0aGlzIHRlbXB0YXRpb24KLWFuZCB1c2UgXGZ1bmN0aW9ue3JlLnNlYXJjaCgpfSBpbnN0ZWFkLiAgVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbgotY29tcGlsZXIgZG9lcyBzb21lIGFuYWx5c2lzIG9mIFJFcyBpbiBvcmRlciB0byBzcGVlZCB1cCB0aGUgcHJvY2VzcyBvZgotbG9va2luZyBmb3IgYSBtYXRjaC4gIE9uZSBzdWNoIGFuYWx5c2lzIGZpZ3VyZXMgb3V0IHdoYXQgdGhlIGZpcnN0Ci1jaGFyYWN0ZXIgb2YgYSBtYXRjaCBtdXN0IGJlOyBmb3IgZXhhbXBsZSwgYSBwYXR0ZXJuIHN0YXJ0aW5nIHdpdGgKLVxyZWdleHB7Q3Jvd30gbXVzdCBtYXRjaCBzdGFydGluZyB3aXRoIGEgXGNoYXJhY3RlcntDfS4gIFRoZSBhbmFseXNpcwotbGV0cyB0aGUgZW5naW5lIHF1aWNrbHkgc2NhbiB0aHJvdWdoIHRoZSBzdHJpbmcgbG9va2luZyBmb3IgdGhlCi1zdGFydGluZyBjaGFyYWN0ZXIsIG9ubHkgdHJ5aW5nIHRoZSBmdWxsIG1hdGNoIGlmIGEgXGNoYXJhY3RlcntDfSBpcyBmb3VuZC4KLQotQWRkaW5nIFxyZWdleHB7Lip9IGRlZmVhdHMgdGhpcyBvcHRpbWl6YXRpb24sIHJlcXVpcmluZyBzY2FubmluZyB0bwotdGhlIGVuZCBvZiB0aGUgc3RyaW5nIGFuZCB0aGVuIGJhY2t0cmFja2luZyB0byBmaW5kIGEgbWF0Y2ggZm9yIHRoZQotcmVzdCBvZiB0aGUgUkUuICBVc2UgXGZ1bmN0aW9ue3JlLnNlYXJjaCgpfSBpbnN0ZWFkLgotCi1cc3Vic2VjdGlvbntHcmVlZHkgdmVyc3VzIE5vbi1HcmVlZHl9Ci0KLVdoZW4gcmVwZWF0aW5nIGEgcmVndWxhciBleHByZXNzaW9uLCBhcyBpbiBccmVnZXhwe2EqfSwgdGhlIHJlc3VsdGluZwotYWN0aW9uIGlzIHRvIGNvbnN1bWUgYXMgbXVjaCBvZiB0aGUgcGF0dGVybiBhcyBwb3NzaWJsZS4gIFRoaXMKLWZhY3Qgb2Z0ZW4gYml0ZXMgeW91IHdoZW4geW91J3JlIHRyeWluZyB0byBtYXRjaCBhIHBhaXIgb2YKLWJhbGFuY2VkIGRlbGltaXRlcnMsIHN1Y2ggYXMgdGhlIGFuZ2xlIGJyYWNrZXRzIHN1cnJvdW5kaW5nIGFuIEhUTUwKLXRhZy4gIFRoZSBuYXtcIlxpfXZlIHBhdHRlcm4gZm9yIG1hdGNoaW5nIGEgc2luZ2xlIEhUTUwgdGFnIGRvZXNuJ3QKLXdvcmsgYmVjYXVzZSBvZiB0aGUgZ3JlZWR5IG5hdHVyZSBvZiBccmVnZXhwey4qfS4KLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHMgPSAnPGh0bWw+PGhlYWQ+PHRpdGxlPlRpdGxlPC90aXRsZT4nCi0+Pj4gbGVuKHMpCi0zMgotPj4+IHByaW50IHJlLm1hdGNoKCc8Lio+Jywgcykuc3BhbigpCi0oMCwgMzIpCi0+Pj4gcHJpbnQgcmUubWF0Y2goJzwuKj4nLCBzKS5ncm91cCgpCi08aHRtbD48aGVhZD48dGl0bGU+VGl0bGU8L3RpdGxlPgotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIFJFIG1hdGNoZXMgdGhlIFxjaGFyYWN0ZXJ7PH0gaW4gXHNhbXB7PGh0bWw+fSwgYW5kIHRoZQotXHJlZ2V4cHsuKn0gY29uc3VtZXMgdGhlIHJlc3Qgb2YgdGhlIHN0cmluZy4gIFRoZXJlJ3Mgc3RpbGwgbW9yZSBsZWZ0Ci1pbiB0aGUgUkUsIHRob3VnaCwgYW5kIHRoZSBccmVnZXhwez59IGNhbid0IG1hdGNoIGF0IHRoZSBlbmQgb2YKLXRoZSBzdHJpbmcsIHNvIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZW5naW5lIGhhcyB0byBiYWNrdHJhY2sKLWNoYXJhY3RlciBieSBjaGFyYWN0ZXIgdW50aWwgaXQgZmluZHMgYSBtYXRjaCBmb3IgdGhlIFxyZWdleHB7Pn0uICAKLVRoZSBmaW5hbCBtYXRjaCBleHRlbmRzIGZyb20gdGhlIFxjaGFyYWN0ZXJ7PH0gaW4gXHNhbXB7PGh0bWw+fQotdG8gdGhlIFxjaGFyYWN0ZXJ7Pn0gaW4gXHNhbXB7PC90aXRsZT59LCB3aGljaCBpc24ndCB3aGF0IHlvdSB3YW50LgotCi1JbiB0aGlzIGNhc2UsIHRoZSBzb2x1dGlvbiBpcyB0byB1c2UgdGhlIG5vbi1ncmVlZHkgcXVhbGlmaWVycwotXHJlZ2V4cHsqP30sIFxyZWdleHB7Kz99LCBccmVnZXhwez8/fSwgb3IKLVxyZWdleHB7XHtcdmFye219LFx2YXJ7bn1cfT99LCB3aGljaCBtYXRjaCBhcyBcZW1waHtsaXR0bGV9IHRleHQgYXMKLXBvc3NpYmxlLiAgSW4gdGhlIGFib3ZlIGV4YW1wbGUsIHRoZSBcY2hhcmFjdGVyez59IGlzIHRyaWVkCi1pbW1lZGlhdGVseSBhZnRlciB0aGUgZmlyc3QgXGNoYXJhY3Rlcns8fSBtYXRjaGVzLCBhbmQgd2hlbiBpdCBmYWlscywKLXRoZSBlbmdpbmUgYWR2YW5jZXMgYSBjaGFyYWN0ZXIgYXQgYSB0aW1lLCByZXRyeWluZyB0aGUgXGNoYXJhY3Rlcns+fQotYXQgZXZlcnkgc3RlcC4gIFRoaXMgcHJvZHVjZXMganVzdCB0aGUgcmlnaHQgcmVzdWx0OgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gcHJpbnQgcmUubWF0Y2goJzwuKj8+JywgcykuZ3JvdXAoKQotPGh0bWw+Ci1cZW5ke3ZlcmJhdGltfQotCi0oTm90ZSB0aGF0IHBhcnNpbmcgSFRNTCBvciBYTUwgd2l0aCByZWd1bGFyIGV4cHJlc3Npb25zIGlzIHBhaW5mdWwuCi1RdWljay1hbmQtZGlydHkgcGF0dGVybnMgd2lsbCBoYW5kbGUgY29tbW9uIGNhc2VzLCBidXQgSFRNTCBhbmQgWE1MCi1oYXZlIHNwZWNpYWwgY2FzZXMgdGhhdCB3aWxsIGJyZWFrIHRoZSBvYnZpb3VzIHJlZ3VsYXIgZXhwcmVzc2lvbjsgYnkKLXRoZSB0aW1lIHlvdSd2ZSB3cml0dGVuIGEgcmVndWxhciBleHByZXNzaW9uIHRoYXQgaGFuZGxlcyBhbGwgb2YgdGhlCi1wb3NzaWJsZSBjYXNlcywgdGhlIHBhdHRlcm5zIHdpbGwgYmUgXGVtcGh7dmVyeX0gY29tcGxpY2F0ZWQuICBVc2UgYW4KLUhUTUwgb3IgWE1MIHBhcnNlciBtb2R1bGUgZm9yIHN1Y2ggdGFza3MuKQotCi1cc3Vic2VjdGlvbntOb3QgVXNpbmcgcmUuVkVSQk9TRX0KLQotQnkgbm93IHlvdSd2ZSBwcm9iYWJseSBub3RpY2VkIHRoYXQgcmVndWxhciBleHByZXNzaW9ucyBhcmUgYSB2ZXJ5Ci1jb21wYWN0IG5vdGF0aW9uLCBidXQgdGhleSdyZSBub3QgdGVycmlibHkgcmVhZGFibGUuICBSRXMgb2YKLW1vZGVyYXRlIGNvbXBsZXhpdHkgY2FuIGJlY29tZSBsZW5ndGh5IGNvbGxlY3Rpb25zIG9mIGJhY2tzbGFzaGVzLAotcGFyZW50aGVzZXMsIGFuZCBtZXRhY2hhcmFjdGVycywgbWFraW5nIHRoZW0gZGlmZmljdWx0IHRvIHJlYWQgYW5kCi11bmRlcnN0YW5kLiAgCi0KLUZvciBzdWNoIFJFcywgc3BlY2lmeWluZyB0aGUgXGNvZGV7cmUuVkVSQk9TRX0gZmxhZyB3aGVuCi1jb21waWxpbmcgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBjYW4gYmUgaGVscGZ1bCwgYmVjYXVzZSBpdCBhbGxvd3MKLXlvdSB0byBmb3JtYXQgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBtb3JlIGNsZWFybHkuCi0KLVRoZSBcY29kZXtyZS5WRVJCT1NFfSBmbGFnIGhhcyBzZXZlcmFsIGVmZmVjdHMuICBXaGl0ZXNwYWNlIGluIHRoZQotcmVndWxhciBleHByZXNzaW9uIHRoYXQgXGVtcGh7aXNuJ3R9IGluc2lkZSBhIGNoYXJhY3RlciBjbGFzcyBpcwotaWdub3JlZC4gIFRoaXMgbWVhbnMgdGhhdCBhbiBleHByZXNzaW9uIHN1Y2ggYXMgXHJlZ2V4cHtkb2cgfCBjYXR9IGlzCi1lcXVpdmFsZW50IHRvIHRoZSBsZXNzIHJlYWRhYmxlIFxyZWdleHB7ZG9nfGNhdH0sIGJ1dCBccmVnZXhwe1thIGJdfQotd2lsbCBzdGlsbCBtYXRjaCB0aGUgY2hhcmFjdGVycyBcY2hhcmFjdGVye2F9LCBcY2hhcmFjdGVye2J9LCBvciBhCi1zcGFjZS4gIEluIGFkZGl0aW9uLCB5b3UgY2FuIGFsc28gcHV0IGNvbW1lbnRzIGluc2lkZSBhIFJFOyBjb21tZW50cwotZXh0ZW5kIGZyb20gYSBcc2FtcHtcI30gY2hhcmFjdGVyIHRvIHRoZSBuZXh0IG5ld2xpbmUuICBXaGVuIHVzZWQgd2l0aAotdHJpcGxlLXF1b3RlZCBzdHJpbmdzLCB0aGlzIGVuYWJsZXMgUkVzIHRvIGJlIGZvcm1hdHRlZCBtb3JlIG5lYXRseToKLQotXGJlZ2lue3ZlcmJhdGltfQotcGF0ID0gcmUuY29tcGlsZShyIiIiCi0gXHMqICAgICAgICAgICAgICAgICAjIFNraXAgbGVhZGluZyB3aGl0ZXNwYWNlCi0gKD9QPGhlYWRlcj5bXjpdKykgICAjIEhlYWRlciBuYW1lCi0gXHMqIDogICAgICAgICAgICAgICAjIFdoaXRlc3BhY2UsIGFuZCBhIGNvbG9uCi0gKD9QPHZhbHVlPi4qPykgICAgICAjIFRoZSBoZWFkZXIncyB2YWx1ZSAtLSAqPyB1c2VkIHRvCi0gICAgICAgICAgICAgICAgICAgICAjIGxvc2UgdGhlIGZvbGxvd2luZyB0cmFpbGluZyB3aGl0ZXNwYWNlCi0gXHMqJCAgICAgICAgICAgICAgICAjIFRyYWlsaW5nIHdoaXRlc3BhY2UgdG8gZW5kLW9mLWxpbmUKLSIiIiwgcmUuVkVSQk9TRSkKLVxlbmR7dmVyYmF0aW19Ci0lICQKLQotVGhpcyBpcyBmYXIgbW9yZSByZWFkYWJsZSB0aGFuOgotCi1cYmVnaW57dmVyYmF0aW19Ci1wYXQgPSByZS5jb21waWxlKHIiXHMqKD9QPGhlYWRlcj5bXjpdKylccyo6KD9QPHZhbHVlPi4qPylccyokIikKLVxlbmR7dmVyYmF0aW19Ci0lICQKLQotXHNlY3Rpb257RmVlZGJhY2t9Ci0KLVJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIGEgY29tcGxpY2F0ZWQgdG9waWMuICBEaWQgdGhpcyBkb2N1bWVudCBoZWxwCi15b3UgdW5kZXJzdGFuZCB0aGVtPyAgV2VyZSB0aGVyZSBwYXJ0cyB0aGF0IHdlcmUgdW5jbGVhciwgb3IgUHJvYmxlbXMKLXlvdSBlbmNvdW50ZXJlZCB0aGF0IHdlcmVuJ3QgY292ZXJlZCBoZXJlPyAgSWYgc28sIHBsZWFzZSBzZW5kCi1zdWdnZXN0aW9ucyBmb3IgaW1wcm92ZW1lbnRzIHRvIHRoZSBhdXRob3IuCi0KLVRoZSBtb3N0IGNvbXBsZXRlIGJvb2sgb24gcmVndWxhciBleHByZXNzaW9ucyBpcyBhbG1vc3QgY2VydGFpbmx5Ci1KZWZmcmV5IEZyaWVkbCdzIFxjaXRldGl0bGV7TWFzdGVyaW5nIFJlZ3VsYXIgRXhwcmVzc2lvbnN9LCBwdWJsaXNoZWQKLWJ5IE8nUmVpbGx5LiAgVW5mb3J0dW5hdGVseSwgaXQgZXhjbHVzaXZlbHkgY29uY2VudHJhdGVzIG9uIFBlcmwgYW5kCi1KYXZhJ3MgZmxhdm91cnMgb2YgcmVndWxhciBleHByZXNzaW9ucywgYW5kIGRvZXNuJ3QgY29udGFpbiBhbnkgUHl0aG9uCi1tYXRlcmlhbCBhdCBhbGwsIHNvIGl0IHdvbid0IGJlIHVzZWZ1bCBhcyBhIHJlZmVyZW5jZSBmb3IgcHJvZ3JhbW1pbmcKLWluIFB5dGhvbi4gIChUaGUgZmlyc3QgZWRpdGlvbiBjb3ZlcmVkIFB5dGhvbidzIG5vdy1yZW1vdmVkCi1cbW9kdWxle3JlZ2V4fSBtb2R1bGUsIHdoaWNoIHdvbid0IGhlbHAgeW91IG11Y2guKSAgQ29uc2lkZXIgY2hlY2tpbmcKLWl0IG91dCBmcm9tIHlvdXIgbGlicmFyeS4KLQotXGVuZHtkb2N1bWVudH0KLQpkaWZmIC0tZ2l0IGEvRG9jL2hvd3RvL3NvY2tldHMudGV4IGIvRG9jL2hvd3RvL3NvY2tldHMudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2VjYmI5Li4wMDAwMDAwCi0tLSBhL0RvYy9ob3d0by9zb2NrZXRzLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDQ2NSArMCwwIEBACi1cZG9jdW1lbnRjbGFzc3tob3d0b30KLQotXHRpdGxle1NvY2tldCBQcm9ncmFtbWluZyBIT1dUT30KLQotXHJlbGVhc2V7MC4wMH0KLQotXGF1dGhvcntHb3Jkb24gTWNNaWxsYW59Ci1cYXV0aG9yYWRkcmVzc3tcZW1haWx7Z21jbUBoeXBlcm5ldC5jb219fQotCi1cYmVnaW57ZG9jdW1lbnR9Ci1cbWFrZXRpdGxlCi0KLVxiZWdpbnthYnN0cmFjdH0KLVxub2luZGVudAotU29ja2V0cyBhcmUgdXNlZCBuZWFybHkgZXZlcnl3aGVyZSwgYnV0IGFyZSBvbmUgb2YgdGhlIG1vc3Qgc2V2ZXJlbHkKLW1pc3VuZGVyc3Rvb2QgdGVjaG5vbG9naWVzIGFyb3VuZC4gVGhpcyBpcyBhIDEwLDAwMCBmb290IG92ZXJ2aWV3IG9mCi1zb2NrZXRzLiBJdCdzIG5vdCByZWFsbHkgYSB0dXRvcmlhbCAtIHlvdSdsbCBzdGlsbCBoYXZlIHdvcmsgdG8gZG8gaW4KLWdldHRpbmcgdGhpbmdzIG9wZXJhdGlvbmFsLiBJdCBkb2Vzbid0IGNvdmVyIHRoZSBmaW5lIHBvaW50cyAoYW5kIHRoZXJlCi1hcmUgYSBsb3Qgb2YgdGhlbSksIGJ1dCBJIGhvcGUgaXQgd2lsbCBnaXZlIHlvdSBlbm91Z2ggYmFja2dyb3VuZCB0bwotYmVnaW4gdXNpbmcgdGhlbSBkZWNlbnRseS4KLQotVGhpcyBkb2N1bWVudCBpcyBhdmFpbGFibGUgZnJvbSB0aGUgUHl0aG9uIEhPV1RPIHBhZ2UgYXQKLVx1cmx7aHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9ob3d0b30uCi0KLVxlbmR7YWJzdHJhY3R9Ci0KLVx0YWJsZW9mY29udGVudHMKLQotXHNlY3Rpb257U29ja2V0c30KLQotU29ja2V0cyBhcmUgdXNlZCBuZWFybHkgZXZlcnl3aGVyZSwgYnV0IGFyZSBvbmUgb2YgdGhlIG1vc3Qgc2V2ZXJlbHkKLW1pc3VuZGVyc3Rvb2QgdGVjaG5vbG9naWVzIGFyb3VuZC4gVGhpcyBpcyBhIDEwLDAwMCBmb290IG92ZXJ2aWV3IG9mCi1zb2NrZXRzLiBJdCdzIG5vdCByZWFsbHkgYSB0dXRvcmlhbCAtIHlvdSdsbCBzdGlsbCBoYXZlIHdvcmsgdG8gZG8gaW4KLWdldHRpbmcgdGhpbmdzIHdvcmtpbmcuIEl0IGRvZXNuJ3QgY292ZXIgdGhlIGZpbmUgcG9pbnRzIChhbmQgdGhlcmUKLWFyZSBhIGxvdCBvZiB0aGVtKSwgYnV0IEkgaG9wZSBpdCB3aWxsIGdpdmUgeW91IGVub3VnaCBiYWNrZ3JvdW5kIHRvCi1iZWdpbiB1c2luZyB0aGVtIGRlY2VudGx5LgotCi1JJ20gb25seSBnb2luZyB0byB0YWxrIGFib3V0IElORVQgc29ja2V0cywgYnV0IHRoZXkgYWNjb3VudCBmb3IgYXQKLWxlYXN0IDk5XCUgb2YgdGhlIHNvY2tldHMgaW4gdXNlLiBBbmQgSSdsbCBvbmx5IHRhbGsgYWJvdXQgU1RSRUFNCi1zb2NrZXRzIC0gdW5sZXNzIHlvdSByZWFsbHkga25vdyB3aGF0IHlvdSdyZSBkb2luZyAoaW4gd2hpY2ggY2FzZSB0aGlzCi1IT1dUTyBpc24ndCBmb3IgeW91ISksIHlvdSdsbCBnZXQgYmV0dGVyIGJlaGF2aW9yIGFuZCBwZXJmb3JtYW5jZSBmcm9tCi1hIFNUUkVBTSBzb2NrZXQgdGhhbiBhbnl0aGluZyBlbHNlLiBJIHdpbGwgdHJ5IHRvIGNsZWFyIHVwIHRoZSBteXN0ZXJ5Ci1vZiB3aGF0IGEgc29ja2V0IGlzLCBhcyB3ZWxsIGFzIHNvbWUgaGludHMgb24gaG93IHRvIHdvcmsgd2l0aAotYmxvY2tpbmcgYW5kIG5vbi1ibG9ja2luZyBzb2NrZXRzLiBCdXQgSSdsbCBzdGFydCBieSB0YWxraW5nIGFib3V0Ci1ibG9ja2luZyBzb2NrZXRzLiBZb3UnbGwgbmVlZCB0byBrbm93IGhvdyB0aGV5IHdvcmsgYmVmb3JlIGRlYWxpbmcKLXdpdGggbm9uLWJsb2NraW5nIHNvY2tldHMuCi0KLVBhcnQgb2YgdGhlIHRyb3VibGUgd2l0aCB1bmRlcnN0YW5kaW5nIHRoZXNlIHRoaW5ncyBpcyB0aGF0ICJzb2NrZXQiCi1jYW4gbWVhbiBhIG51bWJlciBvZiBzdWJ0bHkgZGlmZmVyZW50IHRoaW5ncywgZGVwZW5kaW5nIG9uIGNvbnRleHQuIFNvCi1maXJzdCwgbGV0J3MgbWFrZSBhIGRpc3RpbmN0aW9uIGJldHdlZW4gYSAiY2xpZW50IiBzb2NrZXQgLSBhbgotZW5kcG9pbnQgb2YgYSBjb252ZXJzYXRpb24sIGFuZCBhICJzZXJ2ZXIiIHNvY2tldCwgd2hpY2ggaXMgbW9yZSBsaWtlCi1hIHN3aXRjaGJvYXJkIG9wZXJhdG9yLiBUaGUgY2xpZW50IGFwcGxpY2F0aW9uICh5b3VyIGJyb3dzZXIsIGZvcgotZXhhbXBsZSkgdXNlcyAiY2xpZW50IiBzb2NrZXRzIGV4Y2x1c2l2ZWx5OyB0aGUgd2ViIHNlcnZlciBpdCdzCi10YWxraW5nIHRvIHVzZXMgYm90aCAic2VydmVyIiBzb2NrZXRzIGFuZCAiY2xpZW50IiBzb2NrZXRzLgotCi0KLVxzdWJzZWN0aW9ue0hpc3Rvcnl9Ci0KLU9mIHRoZSB2YXJpb3VzIGZvcm1zIG9mIElQQyAoXGVtcGh7SW50ZXIgUHJvY2VzcyBDb21tdW5pY2F0aW9ufSksCi1zb2NrZXRzIGFyZSBieSBmYXIgdGhlIG1vc3QgcG9wdWxhci4gIE9uIGFueSBnaXZlbiBwbGF0Zm9ybSwgdGhlcmUgYXJlCi1saWtlbHkgdG8gYmUgb3RoZXIgZm9ybXMgb2YgSVBDIHRoYXQgYXJlIGZhc3RlciwgYnV0IGZvcgotY3Jvc3MtcGxhdGZvcm0gY29tbXVuaWNhdGlvbiwgc29ja2V0cyBhcmUgYWJvdXQgdGhlIG9ubHkgZ2FtZSBpbiB0b3duLgotCi1UaGV5IHdlcmUgaW52ZW50ZWQgaW4gQmVya2VsZXkgYXMgcGFydCBvZiB0aGUgQlNEIGZsYXZvciBvZiBVbml4LiBUaGV5Ci1zcHJlYWQgbGlrZSB3aWxkZmlyZSB3aXRoIHRoZSBJbnRlcm5ldC4gV2l0aCBnb29kIHJlYXNvbiAtLS0gdGhlCi1jb21iaW5hdGlvbiBvZiBzb2NrZXRzIHdpdGggSU5FVCBtYWtlcyB0YWxraW5nIHRvIGFyYml0cmFyeSBtYWNoaW5lcwotYXJvdW5kIHRoZSB3b3JsZCB1bmJlbGlldmFibHkgZWFzeSAoYXQgbGVhc3QgY29tcGFyZWQgdG8gb3RoZXIKLXNjaGVtZXMpLiAgCi0KLVxzZWN0aW9ue0NyZWF0aW5nIGEgU29ja2V0fQotCi1Sb3VnaGx5IHNwZWFraW5nLCB3aGVuIHlvdSBjbGlja2VkIG9uIHRoZSBsaW5rIHRoYXQgYnJvdWdodCB5b3UgdG8KLXRoaXMgcGFnZSwgeW91ciBicm93c2VyIGRpZCBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nOgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgI2NyZWF0ZSBhbiBJTkVULCBTVFJFQU1pbmcgc29ja2V0Ci0gICAgcyA9IHNvY2tldC5zb2NrZXQoCi0gICAgICAgIHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCi0gICAgI25vdyBjb25uZWN0IHRvIHRoZSB3ZWIgc2VydmVyIG9uIHBvcnQgODAgCi0gICAgIyAtIHRoZSBub3JtYWwgaHR0cCBwb3J0Ci0gICAgcy5jb25uZWN0KCgid3d3Lm1jbWlsbGFuLWluYy5jb20iLCA4MCkpCi1cZW5ke3ZlcmJhdGltfQotCi1XaGVuIHRoZSBcY29kZXtjb25uZWN0fSBjb21wbGV0ZXMsIHRoZSBzb2NrZXQgXGNvZGV7c30gY2FuCi1ub3cgYmUgdXNlZCB0byBzZW5kIGluIGEgcmVxdWVzdCBmb3IgdGhlIHRleHQgb2YgdGhpcyBwYWdlLiBUaGUgc2FtZQotc29ja2V0IHdpbGwgcmVhZCB0aGUgcmVwbHksIGFuZCB0aGVuIGJlIGRlc3Ryb3llZC4gVGhhdCdzIHJpZ2h0IC0KLWRlc3Ryb3llZC4gQ2xpZW50IHNvY2tldHMgYXJlIG5vcm1hbGx5IG9ubHkgdXNlZCBmb3Igb25lIGV4Y2hhbmdlIChvcgotYSBzbWFsbCBzZXQgb2Ygc2VxdWVudGlhbCBleGNoYW5nZXMpLgotCi1XaGF0IGhhcHBlbnMgaW4gdGhlIHdlYiBzZXJ2ZXIgaXMgYSBiaXQgbW9yZSBjb21wbGV4LiBGaXJzdCwgdGhlIHdlYgotc2VydmVyIGNyZWF0ZXMgYSAic2VydmVyIHNvY2tldCIuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICAjY3JlYXRlIGFuIElORVQsIFNUUkVBTWluZyBzb2NrZXQKLSAgICBzZXJ2ZXJzb2NrZXQgPSBzb2NrZXQuc29ja2V0KAotICAgICAgICBzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQotICAgICNiaW5kIHRoZSBzb2NrZXQgdG8gYSBwdWJsaWMgaG9zdCwgCi0gICAgIyBhbmQgYSB3ZWxsLWtub3duIHBvcnQKLSAgICBzZXJ2ZXJzb2NrZXQuYmluZCgoc29ja2V0LmdldGhvc3RuYW1lKCksIDgwKSkKLSAgICAjYmVjb21lIGEgc2VydmVyIHNvY2tldAotICAgIHNlcnZlcnNvY2tldC5saXN0ZW4oNSkKLVxlbmR7dmVyYmF0aW19Ci0KLUEgY291cGxlIHRoaW5ncyB0byBub3RpY2U6IHdlIHVzZWQgXGNvZGV7c29ja2V0LmdldGhvc3RuYW1lKCl9Ci1zbyB0aGF0IHRoZSBzb2NrZXQgd291bGQgYmUgdmlzaWJsZSB0byB0aGUgb3V0c2lkZSB3b3JsZC4gSWYgd2UgaGFkCi11c2VkIFxjb2Rle3MuYmluZCgoJycsIDgwKSl9IG9yIFxjb2Rle3MuYmluZCgoJ2xvY2FsaG9zdCcsCi04MCkpfSBvciBcY29kZXtzLmJpbmQoKCcxMjcuMC4wLjEnLCA4MCkpfSB3ZSB3b3VsZCBzdGlsbAotaGF2ZSBhICJzZXJ2ZXIiIHNvY2tldCwgYnV0IG9uZSB0aGF0IHdhcyBvbmx5IHZpc2libGUgd2l0aGluIHRoZSBzYW1lCi1tYWNoaW5lLgotCi1BIHNlY29uZCB0aGluZyB0byBub3RlOiBsb3cgbnVtYmVyIHBvcnRzIGFyZSB1c3VhbGx5IHJlc2VydmVkIGZvcgotIndlbGwga25vd24iIHNlcnZpY2VzIChIVFRQLCBTTk1QIGV0YykuIElmIHlvdSdyZSBwbGF5aW5nIGFyb3VuZCwgdXNlCi1hIG5pY2UgaGlnaCBudW1iZXIgKDQgZGlnaXRzKS4KLQotRmluYWxseSwgdGhlIGFyZ3VtZW50IHRvIFxjb2Rle2xpc3Rlbn0gdGVsbHMgdGhlIHNvY2tldCBsaWJyYXJ5IHRoYXQKLXdlIHdhbnQgaXQgdG8gcXVldWUgdXAgYXMgbWFueSBhcyA1IGNvbm5lY3QgcmVxdWVzdHMgKHRoZSBub3JtYWwgbWF4KQotYmVmb3JlIHJlZnVzaW5nIG91dHNpZGUgY29ubmVjdGlvbnMuIElmIHRoZSByZXN0IG9mIHRoZSBjb2RlIGlzCi13cml0dGVuIHByb3Blcmx5LCB0aGF0IHNob3VsZCBiZSBwbGVudHkuCi0KLU9LLCBub3cgd2UgaGF2ZSBhICJzZXJ2ZXIiIHNvY2tldCwgbGlzdGVuaW5nIG9uIHBvcnQgODAuIE5vdyB3ZSBlbnRlcgotdGhlIG1haW5sb29wIG9mIHRoZSB3ZWIgc2VydmVyOgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgd2hpbGUgMToKLSAgICAgICAgI2FjY2VwdCBjb25uZWN0aW9ucyBmcm9tIG91dHNpZGUKLSAgICAgICAgKGNsaWVudHNvY2tldCwgYWRkcmVzcykgPSBzZXJ2ZXJzb2NrZXQuYWNjZXB0KCkKLSAgICAgICAgI25vdyBkbyBzb21ldGhpbmcgd2l0aCB0aGUgY2xpZW50c29ja2V0Ci0gICAgICAgICNpbiB0aGlzIGNhc2UsIHdlJ2xsIHByZXRlbmQgdGhpcyBpcyBhIHRocmVhZGVkIHNlcnZlcgotICAgICAgICBjdCA9IGNsaWVudF90aHJlYWQoY2xpZW50c29ja2V0KQotICAgICAgICBjdC5ydW4oKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlcmUncyBhY3R1YWxseSAzIGdlbmVyYWwgd2F5cyBpbiB3aGljaCB0aGlzIGxvb3AgY291bGQgd29yayAtCi1kaXNwYXRjaGluZyBhIHRocmVhZCB0byBoYW5kbGUgXGNvZGV7Y2xpZW50c29ja2V0fSwgY3JlYXRlIGEgbmV3Ci1wcm9jZXNzIHRvIGhhbmRsZSBcY29kZXtjbGllbnRzb2NrZXR9LCBvciByZXN0cnVjdHVyZSB0aGlzIGFwcAotdG8gdXNlIG5vbi1ibG9ja2luZyBzb2NrZXRzLCBhbmQgbXVsaXRwbGV4IGJldHdlZW4gb3VyICJzZXJ2ZXIiIHNvY2tldAotYW5kIGFueSBhY3RpdmUgXGNvZGV7Y2xpZW50c29ja2V0fXMgdXNpbmcKLVxjb2Rle3NlbGVjdH0uIE1vcmUgYWJvdXQgdGhhdCBsYXRlci4gVGhlIGltcG9ydGFudCB0aGluZyB0bwotdW5kZXJzdGFuZCBub3cgaXMgdGhpczogdGhpcyBpcyBcZW1waHthbGx9IGEgInNlcnZlciIgc29ja2V0Ci1kb2VzLiBJdCBkb2Vzbid0IHNlbmQgYW55IGRhdGEuIEl0IGRvZXNuJ3QgcmVjZWl2ZSBhbnkgZGF0YS4gSXQganVzdAotcHJvZHVjZXMgImNsaWVudCIgc29ja2V0cy4gRWFjaCBcY29kZXtjbGllbnRzb2NrZXR9IGlzIGNyZWF0ZWQKLWluIHJlc3BvbnNlIHRvIHNvbWUgXGVtcGh7b3RoZXJ9ICJjbGllbnQiIHNvY2tldCBkb2luZyBhCi1cY29kZXtjb25uZWN0KCl9IHRvIHRoZSBob3N0IGFuZCBwb3J0IHdlJ3JlIGJvdW5kIHRvLiBBcyBzb29uIGFzCi13ZSd2ZSBjcmVhdGVkIHRoYXQgXGNvZGV7Y2xpZW50c29ja2V0fSwgd2UgZ28gYmFjayB0byBsaXN0ZW5pbmcKLWZvciBtb3JlIGNvbm5lY3Rpb25zLiBUaGUgdHdvICJjbGllbnRzIiBhcmUgZnJlZSB0byBjaGF0IGl0IHVwIC0gdGhleQotYXJlIHVzaW5nIHNvbWUgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHBvcnQgd2hpY2ggd2lsbCBiZSByZWN5Y2xlZCB3aGVuCi10aGUgY29udmVyc2F0aW9uIGVuZHMuCi0KLVxzdWJzZWN0aW9ue0lQQ30gSWYgeW91IG5lZWQgZmFzdCBJUEMgYmV0d2VlbiB0d28gcHJvY2Vzc2VzCi1vbiBvbmUgbWFjaGluZSwgeW91IHNob3VsZCBsb29rIGludG8gd2hhdGV2ZXIgZm9ybSBvZiBzaGFyZWQgbWVtb3J5Ci10aGUgcGxhdGZvcm0gb2ZmZXJzLiBBIHNpbXBsZSBwcm90b2NvbCBiYXNlZCBhcm91bmQgc2hhcmVkIG1lbW9yeSBhbmQKLWxvY2tzIG9yIHNlbWFwaG9yZXMgaXMgYnkgZmFyIHRoZSBmYXN0ZXN0IHRlY2huaXF1ZS4KLQotSWYgeW91IGRvIGRlY2lkZSB0byB1c2Ugc29ja2V0cywgYmluZCB0aGUgInNlcnZlciIgc29ja2V0IHRvCi1cY29kZXsnbG9jYWxob3N0J30uIE9uIG1vc3QgcGxhdGZvcm1zLCB0aGlzIHdpbGwgdGFrZSBhIHNob3J0Y3V0Ci1hcm91bmQgYSBjb3VwbGUgb2YgbGF5ZXJzIG9mIG5ldHdvcmsgY29kZSBhbmQgYmUgcXVpdGUgYSBiaXQgZmFzdGVyLgotCi0KLVxzZWN0aW9ue1VzaW5nIGEgU29ja2V0fQotCi1UaGUgZmlyc3QgdGhpbmcgdG8gbm90ZSwgaXMgdGhhdCB0aGUgd2ViIGJyb3dzZXIncyAiY2xpZW50IiBzb2NrZXQgYW5kCi10aGUgd2ViIHNlcnZlcidzICJjbGllbnQiIHNvY2tldCBhcmUgaWRlbnRpY2FsIGJlYXN0cy4gVGhhdCBpcywgdGhpcwotaXMgYSAicGVlciB0byBwZWVyIiBjb252ZXJzYXRpb24uIE9yIHRvIHB1dCBpdCBhbm90aGVyIHdheSwgXGVtcGh7YXMgdGhlCi1kZXNpZ25lciwgeW91IHdpbGwgaGF2ZSB0byBkZWNpZGUgd2hhdCB0aGUgcnVsZXMgb2YgZXRpcXVldHRlIGFyZSBmb3IKLWEgY29udmVyc2F0aW9ufS4gTm9ybWFsbHksIHRoZSBcY29kZXtjb25uZWN0fWluZyBzb2NrZXQKLXN0YXJ0cyB0aGUgY29udmVyc2F0aW9uLCBieSBzZW5kaW5nIGluIGEgcmVxdWVzdCwgb3IgcGVyaGFwcyBhCi1zaWdub24uIEJ1dCB0aGF0J3MgYSBkZXNpZ24gZGVjaXNpb24gLSBpdCdzIG5vdCBhIHJ1bGUgb2Ygc29ja2V0cy4KLQotTm93IHRoZXJlIGFyZSB0d28gc2V0cyBvZiB2ZXJicyB0byB1c2UgZm9yIGNvbW11bmljYXRpb24uIFlvdSBjYW4gdXNlCi1cY29kZXtzZW5kfSBhbmQgXGNvZGV7cmVjdn0sIG9yIHlvdSBjYW4gdHJhbnNmb3JtIHlvdXIKLWNsaWVudCBzb2NrZXQgaW50byBhIGZpbGUtbGlrZSBiZWFzdCBhbmQgdXNlIFxjb2Rle3JlYWR9IGFuZAotXGNvZGV7d3JpdGV9LiBUaGUgbGF0dGVyIGlzIHRoZSB3YXkgSmF2YSBwcmVzZW50cyB0aGVpcgotc29ja2V0cy4gSSdtIG5vdCBnb2luZyB0byB0YWxrIGFib3V0IGl0IGhlcmUsIGV4Y2VwdCB0byB3YXJuIHlvdSB0aGF0Ci15b3UgbmVlZCB0byB1c2UgXGNvZGV7Zmx1c2h9IG9uIHNvY2tldHMuIFRoZXNlIGFyZSBidWZmZXJlZAotImZpbGVzIiwgYW5kIGEgY29tbW9uIG1pc3Rha2UgaXMgdG8gXGNvZGV7d3JpdGV9IHNvbWV0aGluZywgYW5kCi10aGVuIFxjb2Rle3JlYWR9IGZvciBhIHJlcGx5LiBXaXRob3V0IGEgXGNvZGV7Zmx1c2h9IGluCi10aGVyZSwgeW91IG1heSB3YWl0IGZvcmV2ZXIgZm9yIHRoZSByZXBseSwgYmVjYXVzZSB0aGUgcmVxdWVzdCBtYXkKLXN0aWxsIGJlIGluIHlvdXIgb3V0cHV0IGJ1ZmZlci4KLQotTm93IHdlIGNvbWUgdGhlIG1ham9yIHN0dW1ibGluZyBibG9jayBvZiBzb2NrZXRzIC0gXGNvZGV7c2VuZH0KLWFuZCBcY29kZXtyZWN2fSBvcGVyYXRlIG9uIHRoZSBuZXR3b3JrIGJ1ZmZlcnMuIFRoZXkgZG8gbm90Ci1uZWNlc3NhcmlseSBoYW5kbGUgYWxsIHRoZSBieXRlcyB5b3UgaGFuZCB0aGVtIChvciBleHBlY3QgZnJvbSB0aGVtKSwKLWJlY2F1c2UgdGhlaXIgbWFqb3IgZm9jdXMgaXMgaGFuZGxpbmcgdGhlIG5ldHdvcmsgYnVmZmVycy4gSW4gZ2VuZXJhbCwKLXRoZXkgcmV0dXJuIHdoZW4gdGhlIGFzc29jaWF0ZWQgbmV0d29yayBidWZmZXJzIGhhdmUgYmVlbiBmaWxsZWQKLShcY29kZXtzZW5kfSkgb3IgZW1wdGllZCAoXGNvZGV7cmVjdn0pLiBUaGV5IHRoZW4gdGVsbCB5b3UKLWhvdyBtYW55IGJ5dGVzIHRoZXkgaGFuZGxlZC4gSXQgaXMgXGVtcGh7eW91cn0gcmVzcG9uc2liaWxpdHkgdG8gY2FsbAotdGhlbSBhZ2FpbiB1bnRpbCB5b3VyIG1lc3NhZ2UgaGFzIGJlZW4gY29tcGxldGVseSBkZWFsdCB3aXRoLgotCi1XaGVuIGEgXGNvZGV7cmVjdn0gcmV0dXJucyAwIGJ5dGVzLCBpdCBtZWFucyB0aGUgb3RoZXIgc2lkZSBoYXMKLWNsb3NlZCAob3IgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgY2xvc2luZykgdGhlIGNvbm5lY3Rpb24uICBZb3Ugd2lsbCBub3QKLXJlY2VpdmUgYW55IG1vcmUgZGF0YSBvbiB0aGlzIGNvbm5lY3Rpb24uIEV2ZXIuICBZb3UgbWF5IGJlIGFibGUgdG8KLXNlbmQgZGF0YSBzdWNjZXNzZnVsbHk7IEknbGwgdGFsayBhYm91dCB0aGF0IHNvbWUgb24gdGhlIG5leHQgcGFnZS4KLQotQSBwcm90b2NvbCBsaWtlIEhUVFAgdXNlcyBhIHNvY2tldCBmb3Igb25seSBvbmUgdHJhbnNmZXIuIFRoZSBjbGllbnQKLXNlbmRzIGEgcmVxdWVzdCwgdGhlIHJlYWRzIGEgcmVwbHkuICBUaGF0J3MgaXQuIFRoZSBzb2NrZXQgaXMKLWRpc2NhcmRlZC4gVGhpcyBtZWFucyB0aGF0IGEgY2xpZW50IGNhbiBkZXRlY3QgdGhlIGVuZCBvZiB0aGUgcmVwbHkgYnkKLXJlY2VpdmluZyAwIGJ5dGVzLgotCi1CdXQgaWYgeW91IHBsYW4gdG8gcmV1c2UgeW91ciBzb2NrZXQgZm9yIGZ1cnRoZXIgdHJhbnNmZXJzLCB5b3UgbmVlZAotdG8gcmVhbGl6ZSB0aGF0IFxlbXBoe3RoZXJlIGlzIG5vICJFT1QiIChFbmQgb2YgVHJhbnNmZXIpIG9uIGEKLXNvY2tldC59IEkgcmVwZWF0OiBpZiBhIHNvY2tldCBcY29kZXtzZW5kfSBvcgotXGNvZGV7cmVjdn0gcmV0dXJucyBhZnRlciBoYW5kbGluZyAwIGJ5dGVzLCB0aGUgY29ubmVjdGlvbiBoYXMKLWJlZW4gYnJva2VuLiAgSWYgdGhlIGNvbm5lY3Rpb24gaGFzIFxlbXBoe25vdH0gYmVlbiBicm9rZW4sIHlvdSBtYXkKLXdhaXQgb24gYSBcY29kZXtyZWN2fSBmb3JldmVyLCBiZWNhdXNlIHRoZSBzb2NrZXQgd2lsbAotXGVtcGh7bm90fSB0ZWxsIHlvdSB0aGF0IHRoZXJlJ3Mgbm90aGluZyBtb3JlIHRvIHJlYWQgKGZvciBub3cpLiAgTm93Ci1pZiB5b3UgdGhpbmsgYWJvdXQgdGhhdCBhIGJpdCwgeW91J2xsIGNvbWUgdG8gcmVhbGl6ZSBhIGZ1bmRhbWVudGFsCi10cnV0aCBvZiBzb2NrZXRzOiBcZW1waHttZXNzYWdlcyBtdXN0IGVpdGhlciBiZSBmaXhlZCBsZW5ndGh9ICh5dWNrKSwKLVxlbXBoe29yIGJlIGRlbGltaXRlZH0gKHNocnVnKSwgXGVtcGh7b3IgaW5kaWNhdGUgaG93IGxvbmcgdGhleSBhcmV9Ci0obXVjaCBiZXR0ZXIpLCBcZW1waHtvciBlbmQgYnkgc2h1dHRpbmcgZG93biB0aGUgY29ubmVjdGlvbn0uIFRoZQotY2hvaWNlIGlzIGVudGlyZWx5IHlvdXJzLCAoYnV0IHNvbWUgd2F5cyBhcmUgcmlnaHRlciB0aGFuIG90aGVycykuCi0KLUFzc3VtaW5nIHlvdSBkb24ndCB3YW50IHRvIGVuZCB0aGUgY29ubmVjdGlvbiwgdGhlIHNpbXBsZXN0IHNvbHV0aW9uCi1pcyBhIGZpeGVkIGxlbmd0aCBtZXNzYWdlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1jbGFzcyBteXNvY2tldDoKLSAgICAnJydkZW1vbnN0cmF0aW9uIGNsYXNzIG9ubHkgCi0gICAgICAtIGNvZGVkIGZvciBjbGFyaXR5LCBub3QgZWZmaWNpZW5jeQotICAgICcnJwotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvY2s9Tm9uZSk6Ci0JaWYgc29jayBpcyBOb25lOgotCSAgICBzZWxmLnNvY2sgPSBzb2NrZXQuc29ja2V0KAotCQlzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQotCWVsc2U6Ci0JICAgIHNlbGYuc29jayA9IHNvY2sKLQotICAgIGRlZiBjb25uZWN0KHNlbGYsIGhvc3QsIHBvcnQpOgotCXNlbGYuc29jay5jb25uZWN0KChob3N0LCBwb3J0KSkKLQotICAgIGRlZiBteXNlbmQoc2VsZiwgbXNnKToKLQl0b3RhbHNlbnQgPSAwCi0Jd2hpbGUgdG90YWxzZW50IDwgTVNHTEVOOgotCSAgICBzZW50ID0gc2VsZi5zb2NrLnNlbmQobXNnW3RvdGFsc2VudDpdKQotCSAgICBpZiBzZW50ID09IDA6Ci0JCXJhaXNlIFJ1bnRpbWVFcnJvciwgXFwKLQkJICAgICJzb2NrZXQgY29ubmVjdGlvbiBicm9rZW4iCi0JICAgIHRvdGFsc2VudCA9IHRvdGFsc2VudCArIHNlbnQKLQotICAgIGRlZiBteXJlY2VpdmUoc2VsZik6Ci0JbXNnID0gJycKLQl3aGlsZSBsZW4obXNnKSA8IE1TR0xFTjoKLQkgICAgY2h1bmsgPSBzZWxmLnNvY2sucmVjdihNU0dMRU4tbGVuKG1zZykpCi0JICAgIGlmIGNodW5rID09ICcnOgotCQlyYWlzZSBSdW50aW1lRXJyb3IsIFxcCi0JCSAgICAic29ja2V0IGNvbm5lY3Rpb24gYnJva2VuIgotCSAgICBtc2cgPSBtc2cgKyBjaHVuawotCXJldHVybiBtc2cKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBzZW5kaW5nIGNvZGUgaGVyZSBpcyB1c2FibGUgZm9yIGFsbW9zdCBhbnkgbWVzc2FnaW5nIHNjaGVtZSAtIGluCi1QeXRob24geW91IHNlbmQgc3RyaW5ncywgYW5kIHlvdSBjYW4gdXNlIFxjb2Rle2xlbigpfSB0bwotZGV0ZXJtaW5lIGl0cyBsZW5ndGggKGV2ZW4gaWYgaXQgaGFzIGVtYmVkZGVkIFxjb2Rle1xlIDB9Ci1jaGFyYWN0ZXJzKS4gSXQncyBtb3N0bHkgdGhlIHJlY2VpdmluZyBjb2RlIHRoYXQgZ2V0cyBtb3JlCi1jb21wbGV4LiAoQW5kIGluIEMsIGl0J3Mgbm90IG11Y2ggd29yc2UsIGV4Y2VwdCB5b3UgY2FuJ3QgdXNlCi1cY29kZXtzdHJsZW59IGlmIHRoZSBtZXNzYWdlIGhhcyBlbWJlZGRlZCBcY29kZXtcZSAwfXMuKQotCi1UaGUgZWFzaWVzdCBlbmhhbmNlbWVudCBpcyB0byBtYWtlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIG1lc3NhZ2UKLWFuIGluZGljYXRvciBvZiBtZXNzYWdlIHR5cGUsIGFuZCBoYXZlIHRoZSB0eXBlIGRldGVybWluZSB0aGUKLWxlbmd0aC4gTm93IHlvdSBoYXZlIHR3byBcY29kZXtyZWN2fXMgLSB0aGUgZmlyc3QgdG8gZ2V0IChhdAotbGVhc3QpIHRoYXQgZmlyc3QgY2hhcmFjdGVyIHNvIHlvdSBjYW4gbG9vayB1cCB0aGUgbGVuZ3RoLCBhbmQgdGhlCi1zZWNvbmQgaW4gYSBsb29wIHRvIGdldCB0aGUgcmVzdC4gSWYgeW91IGRlY2lkZSB0byBnbyB0aGUgZGVsaW1pdGVkCi1yb3V0ZSwgeW91J2xsIGJlIHJlY2VpdmluZyBpbiBzb21lIGFyYml0cmFyeSBjaHVuayBzaXplLCAoNDA5NiBvciA4MTkyCi1pcyBmcmVxdWVudGx5IGEgZ29vZCBtYXRjaCBmb3IgbmV0d29yayBidWZmZXIgc2l6ZXMpLCBhbmQgc2Nhbm5pbmcKLXdoYXQgeW91J3ZlIHJlY2VpdmVkIGZvciBhIGRlbGltaXRlci4KLQotT25lIGNvbXBsaWNhdGlvbiB0byBiZSBhd2FyZSBvZjogaWYgeW91ciBjb252ZXJzYXRpb25hbCBwcm90b2NvbAotYWxsb3dzIG11bHRpcGxlIG1lc3NhZ2VzIHRvIGJlIHNlbnQgYmFjayB0byBiYWNrICh3aXRob3V0IHNvbWUga2luZCBvZgotcmVwbHkpLCBhbmQgeW91IHBhc3MgXGNvZGV7cmVjdn0gYW4gYXJiaXRyYXJ5IGNodW5rIHNpemUsIHlvdQotbWF5IGVuZCB1cCByZWFkaW5nIHRoZSBzdGFydCBvZiBhIGZvbGxvd2luZyBtZXNzYWdlLiBZb3UnbGwgbmVlZCB0bwotcHV0IHRoYXQgYXNpZGUgYW5kIGhvbGQgb250byBpdCwgdW50aWwgaXQncyBuZWVkZWQuCi0KLVByZWZpeGluZyB0aGUgbWVzc2FnZSB3aXRoIGl0J3MgbGVuZ3RoIChzYXksIGFzIDUgbnVtZXJpYyBjaGFyYWN0ZXJzKQotZ2V0cyBtb3JlIGNvbXBsZXgsIGJlY2F1c2UgKGJlbGlldmUgaXQgb3Igbm90KSwgeW91IG1heSBub3QgZ2V0IGFsbCA1Ci1jaGFyYWN0ZXJzIGluIG9uZSBcY29kZXtyZWN2fS4gSW4gcGxheWluZyBhcm91bmQsIHlvdSdsbCBnZXQKLWF3YXkgd2l0aCBpdDsgYnV0IGluIGhpZ2ggbmV0d29yayBsb2FkcywgeW91ciBjb2RlIHdpbGwgdmVyeSBxdWlja2x5Ci1icmVhayB1bmxlc3MgeW91IHVzZSB0d28gXGNvZGV7cmVjdn0gbG9vcHMgLSB0aGUgZmlyc3QgdG8KLWRldGVybWluZSB0aGUgbGVuZ3RoLCB0aGUgc2Vjb25kIHRvIGdldCB0aGUgZGF0YSBwYXJ0IG9mIHRoZQotbWVzc2FnZS4gTmFzdHkuIFRoaXMgaXMgYWxzbyB3aGVuIHlvdSdsbCBkaXNjb3ZlciB0aGF0Ci1cY29kZXtzZW5kfSBkb2VzIG5vdCBhbHdheXMgbWFuYWdlIHRvIGdldCByaWQgb2YgZXZlcnl0aGluZyBpbgotb25lIHBhc3MuIEFuZCBkZXNwaXRlIGhhdmluZyByZWFkIHRoaXMsIHlvdSB3aWxsIGV2ZW50dWFsbHkgZ2V0IGJpdCBieQotaXQhCi0KLUluIHRoZSBpbnRlcmVzdHMgb2Ygc3BhY2UsIGJ1aWxkaW5nIHlvdXIgY2hhcmFjdGVyLCAoYW5kIHByZXNlcnZpbmcgbXkKLWNvbXBldGl0aXZlIHBvc2l0aW9uKSwgdGhlc2UgZW5oYW5jZW1lbnRzIGFyZSBsZWZ0IGFzIGFuIGV4ZXJjaXNlIGZvcgotdGhlIHJlYWRlci4gTGV0cyBtb3ZlIG9uIHRvIGNsZWFuaW5nIHVwLgotCi1cc3Vic2VjdGlvbntCaW5hcnkgRGF0YX0KLQotSXQgaXMgcGVyZmVjdGx5IHBvc3NpYmxlIHRvIHNlbmQgYmluYXJ5IGRhdGEgb3ZlciBhIHNvY2tldC4gVGhlIG1ham9yCi1wcm9ibGVtIGlzIHRoYXQgbm90IGFsbCBtYWNoaW5lcyB1c2UgdGhlIHNhbWUgZm9ybWF0cyBmb3IgYmluYXJ5Ci1kYXRhLiBGb3IgZXhhbXBsZSwgYSBNb3Rvcm9sYSBjaGlwIHdpbGwgcmVwcmVzZW50IGEgMTYgYml0IGludGVnZXIKLXdpdGggdGhlIHZhbHVlIDEgYXMgdGhlIHR3byBoZXggYnl0ZXMgMDAgMDEuIEludGVsIGFuZCBERUMsIGhvd2V2ZXIsCi1hcmUgYnl0ZS1yZXZlcnNlZCAtIHRoYXQgc2FtZSAxIGlzIDAxIDAwLiBTb2NrZXQgbGlicmFyaWVzIGhhdmUgY2FsbHMKLWZvciBjb252ZXJ0aW5nIDE2IGFuZCAzMiBiaXQgaW50ZWdlcnMgLSBcY29kZXtudG9obCwgaHRvbmwsIG50b2hzLAotaHRvbnN9IHdoZXJlICJuIiBtZWFucyBcZW1waHtuZXR3b3JrfSBhbmQgImgiIG1lYW5zIFxlbXBoe2hvc3R9LAotInMiIG1lYW5zIFxlbXBoe3Nob3J0fSBhbmQgImwiIG1lYW5zIFxlbXBoe2xvbmd9LiBXaGVyZSBuZXR3b3JrIG9yZGVyCi1pcyBob3N0IG9yZGVyLCB0aGVzZSBkbyBub3RoaW5nLCBidXQgd2hlcmUgdGhlIG1hY2hpbmUgaXMKLWJ5dGUtcmV2ZXJzZWQsIHRoZXNlIHN3YXAgdGhlIGJ5dGVzIGFyb3VuZCBhcHByb3ByaWF0ZWx5LgotCi1JbiB0aGVzZSBkYXlzIG9mIDMyIGJpdCBtYWNoaW5lcywgdGhlIGFzY2lpIHJlcHJlc2VudGF0aW9uIG9mIGJpbmFyeQotZGF0YSBpcyBmcmVxdWVudGx5IHNtYWxsZXIgdGhhbiB0aGUgYmluYXJ5IHJlcHJlc2VudGF0aW9uLiBUaGF0J3MKLWJlY2F1c2UgYSBzdXJwcmlzaW5nIGFtb3VudCBvZiB0aGUgdGltZSwgYWxsIHRob3NlIGxvbmdzIGhhdmUgdGhlCi12YWx1ZSAwLCBvciBtYXliZSAxLiBUaGUgc3RyaW5nICIwIiB3b3VsZCBiZSB0d28gYnl0ZXMsIHdoaWxlIGJpbmFyeQotaXMgZm91ci4gT2YgY291cnNlLCB0aGlzIGRvZXNuJ3QgZml0IHdlbGwgd2l0aCBmaXhlZC1sZW5ndGgKLW1lc3NhZ2VzLiBEZWNpc2lvbnMsIGRlY2lzaW9ucy4KLQotXHNlY3Rpb257RGlzY29ubmVjdGluZ30KLQotU3RyaWN0bHkgc3BlYWtpbmcsIHlvdSdyZSBzdXBwb3NlZCB0byB1c2UgXGNvZGV7c2h1dGRvd259IG9uIGEKLXNvY2tldCBiZWZvcmUgeW91IFxjb2Rle2Nsb3NlfSBpdC4gIFRoZSBcY29kZXtzaHV0ZG93bn0gaXMKLWFuIGFkdmlzb3J5IHRvIHRoZSBzb2NrZXQgYXQgdGhlIG90aGVyIGVuZC4gIERlcGVuZGluZyBvbiB0aGUgYXJndW1lbnQKLXlvdSBwYXNzIGl0LCBpdCBjYW4gbWVhbiAiSSdtIG5vdCBnb2luZyB0byBzZW5kIGFueW1vcmUsIGJ1dCBJJ2xsCi1zdGlsbCBsaXN0ZW4iLCBvciAiSSdtIG5vdCBsaXN0ZW5pbmcsIGdvb2QgcmlkZGFuY2UhIi4gIE1vc3Qgc29ja2V0Ci1saWJyYXJpZXMsIGhvd2V2ZXIsIGFyZSBzbyB1c2VkIHRvIHByb2dyYW1tZXJzIG5lZ2xlY3RpbmcgdG8gdXNlIHRoaXMKLXBpZWNlIG9mIGV0aXF1ZXR0ZSB0aGF0IG5vcm1hbGx5IGEgXGNvZGV7Y2xvc2V9IGlzIHRoZSBzYW1lIGFzCi1cY29kZXtzaHV0ZG93bigpOyBjbG9zZSgpfS4gIFNvIGluIG1vc3Qgc2l0dWF0aW9ucywgYW4gZXhwbGljaXQKLVxjb2Rle3NodXRkb3dufSBpcyBub3QgbmVlZGVkLgotCi1PbmUgd2F5IHRvIHVzZSBcY29kZXtzaHV0ZG93bn0gZWZmZWN0aXZlbHkgaXMgaW4gYW4gSFRUUC1saWtlCi1leGNoYW5nZS4gVGhlIGNsaWVudCBzZW5kcyBhIHJlcXVlc3QgYW5kIHRoZW4gZG9lcyBhCi1cY29kZXtzaHV0ZG93bigxKX0uIFRoaXMgdGVsbHMgdGhlIHNlcnZlciAiVGhpcyBjbGllbnQgaXMgZG9uZQotc2VuZGluZywgYnV0IGNhbiBzdGlsbCByZWNlaXZlLiIgIFRoZSBzZXJ2ZXIgY2FuIGRldGVjdCAiRU9GIiBieSBhCi1yZWNlaXZlIG9mIDAgYnl0ZXMuIEl0IGNhbiBhc3N1bWUgaXQgaGFzIHRoZSBjb21wbGV0ZSByZXF1ZXN0LiAgVGhlCi1zZXJ2ZXIgc2VuZHMgYSByZXBseS4gSWYgdGhlIFxjb2Rle3NlbmR9IGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkKLXRoZW4sIGluZGVlZCwgdGhlIGNsaWVudCB3YXMgc3RpbGwgcmVjZWl2aW5nLgotCi1QeXRob24gdGFrZXMgdGhlIGF1dG9tYXRpYyBzaHV0ZG93biBhIHN0ZXAgZnVydGhlciwgYW5kIHNheXMgdGhhdCB3aGVuIGEgc29ja2V0IGlzIGdhcmJhZ2UgY29sbGVjdGVkLCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgZG8gYSBcY29kZXtjbG9zZX0gaWYgaXQncyBuZWVkZWQuIEJ1dCByZWx5aW5nIG9uIHRoaXMgaXMgYSB2ZXJ5IGJhZCBoYWJpdC4gSWYgeW91ciBzb2NrZXQganVzdCBkaXNhcHBlYXJzIHdpdGhvdXQgZG9pbmcgYSBcY29kZXtjbG9zZX0sIHRoZSBzb2NrZXQgYXQgdGhlIG90aGVyIGVuZCBtYXkgaGFuZyBpbmRlZmluaXRlbHksIHRoaW5raW5nIHlvdSdyZSBqdXN0IGJlaW5nIHNsb3cuIFxlbXBoe1BsZWFzZX0gXGNvZGV7Y2xvc2V9IHlvdXIgc29ja2V0cyB3aGVuIHlvdSdyZSBkb25lLgotCi0KLVxzdWJzZWN0aW9ue1doZW4gU29ja2V0cyBEaWV9Ci0KLVByb2JhYmx5IHRoZSB3b3JzdCB0aGluZyBhYm91dCB1c2luZyBibG9ja2luZyBzb2NrZXRzIGlzIHdoYXQgaGFwcGVucwotd2hlbiB0aGUgb3RoZXIgc2lkZSBjb21lcyBkb3duIGhhcmQgKHdpdGhvdXQgZG9pbmcgYQotXGNvZGV7Y2xvc2V9KS4gWW91ciBzb2NrZXQgaXMgbGlrZWx5IHRvIGhhbmcuIFNPQ0tTVFJFQU0gaXMgYQotcmVsaWFibGUgcHJvdG9jb2wsIGFuZCBpdCB3aWxsIHdhaXQgYSBsb25nLCBsb25nIHRpbWUgYmVmb3JlIGdpdmluZyB1cAotb24gYSBjb25uZWN0aW9uLiBJZiB5b3UncmUgdXNpbmcgdGhyZWFkcywgdGhlIGVudGlyZSB0aHJlYWQgaXMKLWVzc2VudGlhbGx5IGRlYWQuIFRoZXJlJ3Mgbm90IG11Y2ggeW91IGNhbiBkbyBhYm91dCBpdC4gQXMgbG9uZyBhcyB5b3UKLWFyZW4ndCBkb2luZyBzb21ldGhpbmcgZHVtYiwgbGlrZSBob2xkaW5nIGEgbG9jayB3aGlsZSBkb2luZyBhCi1ibG9ja2luZyByZWFkLCB0aGUgdGhyZWFkIGlzbid0IHJlYWxseSBjb25zdW1pbmcgbXVjaCBpbiB0aGUgd2F5IG9mCi1yZXNvdXJjZXMuIERvIFxlbXBoe25vdH0gdHJ5IHRvIGtpbGwgdGhlIHRocmVhZCAtIHBhcnQgb2YgdGhlIHJlYXNvbgotdGhhdCB0aHJlYWRzIGFyZSBtb3JlIGVmZmljaWVudCB0aGFuIHByb2Nlc3NlcyBpcyB0aGF0IHRoZXkgYXZvaWQgdGhlCi1vdmVyaGVhZCBhc3NvY2lhdGVkIHdpdGggdGhlIGF1dG9tYXRpYyByZWN5Y2xpbmcgb2YgcmVzb3VyY2VzLiBJbgotb3RoZXIgd29yZHMsIGlmIHlvdSBkbyBtYW5hZ2UgdG8ga2lsbCB0aGUgdGhyZWFkLCB5b3VyIHdob2xlIHByb2Nlc3MKLWlzIGxpa2VseSB0byBiZSBzY3Jld2VkIHVwLiAgCi0KLVxzZWN0aW9ue05vbi1ibG9ja2luZyBTb2NrZXRzfQotCi1JZiB5b3UndmUgdW5kZXJzdG9vZCB0aGUgcHJlY2VlZGluZywgeW91IGFscmVhZHkga25vdyBtb3N0IG9mIHdoYXQgeW91Ci1uZWVkIHRvIGtub3cgYWJvdXQgdGhlIG1lY2hhbmljcyBvZiB1c2luZyBzb2NrZXRzLiBZb3UnbGwgc3RpbGwgdXNlCi10aGUgc2FtZSBjYWxscywgaW4gbXVjaCB0aGUgc2FtZSB3YXlzLiBJdCdzIGp1c3QgdGhhdCwgaWYgeW91IGRvIGl0Ci1yaWdodCwgeW91ciBhcHAgd2lsbCBiZSBhbG1vc3QgaW5zaWRlLW91dC4KLQotSW4gUHl0aG9uLCB5b3UgdXNlIFxjb2Rle3NvY2tldC5zZXRibG9ja2luZygwKX0gdG8gbWFrZSBpdAotbm9uLWJsb2NraW5nLiBJbiBDLCBpdCdzIG1vcmUgY29tcGxleCwgKGZvciBvbmUgdGhpbmcsIHlvdSdsbCBuZWVkIHRvCi1jaG9vc2UgYmV0d2VlbiB0aGUgQlNEIGZsYXZvciBcY29kZXtPX05PTkJMT0NLfSBhbmQgdGhlIGFsbW9zdAotaW5kaXN0aW5ndWlzaGFibGUgUG9zaXggZmxhdm9yIFxjb2Rle09fTkRFTEFZfSwgd2hpY2ggaXMKLWNvbXBsZXRlbHkgZGlmZmVyZW50IGZyb20gXGNvZGV7VENQX05PREVMQVl9KSwgYnV0IGl0J3MgdGhlCi1leGFjdCBzYW1lIGlkZWEuIFlvdSBkbyB0aGlzIGFmdGVyIGNyZWF0aW5nIHRoZSBzb2NrZXQsIGJ1dCBiZWZvcmUKLXVzaW5nIGl0LiAoQWN0dWFsbHksIGlmIHlvdSdyZSBudXRzLCB5b3UgY2FuIHN3aXRjaCBiYWNrIGFuZCBmb3J0aC4pCi0KLVRoZSBtYWpvciBtZWNoYW5pY2FsIGRpZmZlcmVuY2UgaXMgdGhhdCBcY29kZXtzZW5kfSwKLVxjb2Rle3JlY3Z9LCBcY29kZXtjb25uZWN0fSBhbmQgXGNvZGV7YWNjZXB0fSBjYW4KLXJldHVybiB3aXRob3V0IGhhdmluZyBkb25lIGFueXRoaW5nLiBZb3UgaGF2ZSAob2YgY291cnNlKSBhIG51bWJlciBvZgotY2hvaWNlcy4gWW91IGNhbiBjaGVjayByZXR1cm4gY29kZSBhbmQgZXJyb3IgY29kZXMgYW5kIGdlbmVyYWxseSBkcml2ZQoteW91cnNlbGYgY3JhenkuIElmIHlvdSBkb24ndCBiZWxpZXZlIG1lLCB0cnkgaXQgc29tZXRpbWUuIFlvdXIgYXBwCi13aWxsIGdyb3cgbGFyZ2UsIGJ1Z2d5IGFuZCBzdWNrIENQVS4gU28gbGV0J3Mgc2tpcCB0aGUgYnJhaW4tZGVhZAotc29sdXRpb25zIGFuZCBkbyBpdCByaWdodC4KLQotVXNlIFxjb2Rle3NlbGVjdH0uCi0KLUluIEMsIGNvZGluZyBcY29kZXtzZWxlY3R9IGlzIGZhaXJseSBjb21wbGV4LiBJbiBQeXRob24sIGl0J3MgYQotcGllY2Ugb2YgY2FrZSwgYnV0IGl0J3MgY2xvc2UgZW5vdWdoIHRvIHRoZSBDIHZlcnNpb24gdGhhdCBpZiB5b3UKLXVuZGVyc3RhbmQgXGNvZGV7c2VsZWN0fSBpbiBQeXRob24sIHlvdSdsbCBoYXZlIGxpdHRsZSB0cm91YmxlCi13aXRoIGl0IGluIEMuCi0KLVxiZWdpbnt2ZXJiYXRpbX0gICAgcmVhZHlfdG9fcmVhZCwgcmVhZHlfdG9fd3JpdGUsIGluX2Vycm9yID0gXFwKLSAgICAgICAgICAgICAgICAgICBzZWxlY3Quc2VsZWN0KAotICAgICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbF9yZWFkZXJzLCAKLSAgICAgICAgICAgICAgICAgICAgICBwb3RlbnRpYWxfd3JpdGVycywgCi0gICAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsX2VycnMsIAotICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQpCi1cZW5ke3ZlcmJhdGltfQotCi1Zb3UgcGFzcyBcY29kZXtzZWxlY3R9IHRocmVlIGxpc3RzOiB0aGUgZmlyc3QgY29udGFpbnMgYWxsCi1zb2NrZXRzIHRoYXQgeW91IG1pZ2h0IHdhbnQgdG8gdHJ5IHJlYWRpbmc7IHRoZSBzZWNvbmQgYWxsIHRoZSBzb2NrZXRzCi15b3UgbWlnaHQgd2FudCB0byB0cnkgd3JpdGluZyB0bywgYW5kIHRoZSBsYXN0IChub3JtYWxseSBsZWZ0IGVtcHR5KQotdGhvc2UgdGhhdCB5b3Ugd2FudCB0byBjaGVjayBmb3IgZXJyb3JzLiAgWW91IHNob3VsZCBub3RlIHRoYXQgYQotc29ja2V0IGNhbiBnbyBpbnRvIG1vcmUgdGhhbiBvbmUgbGlzdC4gVGhlIFxjb2Rle3NlbGVjdH0gY2FsbCBpcwotYmxvY2tpbmcsIGJ1dCB5b3UgY2FuIGdpdmUgaXQgYSB0aW1lb3V0LiBUaGlzIGlzIGdlbmVyYWxseSBhIHNlbnNpYmxlCi10aGluZyB0byBkbyAtIGdpdmUgaXQgYSBuaWNlIGxvbmcgdGltZW91dCAoc2F5IGEgbWludXRlKSB1bmxlc3MgeW91Ci1oYXZlIGdvb2QgcmVhc29uIHRvIGRvIG90aGVyd2lzZS4KLQotSW4gcmV0dXJuLCB5b3Ugd2lsbCBnZXQgdGhyZWUgbGlzdHMuIFRoZXkgaGF2ZSB0aGUgc29ja2V0cyB0aGF0IGFyZQotYWN0dWFsbHkgcmVhZGFibGUsIHdyaXRhYmxlIGFuZCBpbiBlcnJvci4gRWFjaCBvZiB0aGVzZSBsaXN0cyBpcyBhCi1zdWJzZXQgKHBvc3NiaWx5IGVtcHR5KSBvZiB0aGUgY29ycmVzcG9uZGluZyBsaXN0IHlvdSBwYXNzZWQgaW4uIEFuZAotaWYgeW91IHB1dCBhIHNvY2tldCBpbiBtb3JlIHRoYW4gb25lIGlucHV0IGxpc3QsIGl0IHdpbGwgb25seSBiZSAoYXQKLW1vc3QpIGluIG9uZSBvdXRwdXQgbGlzdC4KLQotSWYgYSBzb2NrZXQgaXMgaW4gdGhlIG91dHB1dCByZWFkYWJsZSBsaXN0LCB5b3UgY2FuIGJlCi1hcy1jbG9zZS10by1jZXJ0YWluLWFzLXdlLWV2ZXItZ2V0LWluLXRoaXMtYnVzaW5lc3MgdGhhdCBhCi1cY29kZXtyZWN2fSBvbiB0aGF0IHNvY2tldCB3aWxsIHJldHVybiBcZW1waHtzb21ldGhpbmd9LiBTYW1lCi1pZGVhIGZvciB0aGUgd3JpdGFibGUgbGlzdC4gWW91J2xsIGJlIGFibGUgdG8gc2VuZAotXGVtcGh7c29tZXRoaW5nfS4gTWF5YmUgbm90IGFsbCB5b3Ugd2FudCB0bywgYnV0IFxlbXBoe3NvbWV0aGluZ30gaXMKLWJldHRlciB0aGFuIG5vdGhpbmcuIChBY3R1YWxseSwgYW55IHJlYXNvbmFibHkgaGVhbHRoeSBzb2NrZXQgd2lsbAotcmV0dXJuIGFzIHdyaXRhYmxlIC0gaXQganVzdCBtZWFucyBvdXRib3VuZCBuZXR3b3JrIGJ1ZmZlciBzcGFjZSBpcwotYXZhaWxhYmxlLikKLQotSWYgeW91IGhhdmUgYSAic2VydmVyIiBzb2NrZXQsIHB1dCBpdCBpbiB0aGUgcG90ZW50aWFsX3JlYWRlcnMKLWxpc3QuIElmIGl0IGNvbWVzIG91dCBpbiB0aGUgcmVhZGFibGUgbGlzdCwgeW91ciBcY29kZXthY2NlcHR9Ci13aWxsIChhbG1vc3QgY2VydGFpbmx5KSB3b3JrLiBJZiB5b3UgaGF2ZSBjcmVhdGVkIGEgbmV3IHNvY2tldCB0bwotXGNvZGV7Y29ubmVjdH0gdG8gc29tZW9uZSBlbHNlLCBwdXQgaXQgaW4gdGhlIHB0b2VudGlhbF93cml0ZXJzCi1saXN0LiBJZiBpdCBzaG93cyB1cCBpbiB0aGUgd3JpdGFibGUgbGlzdCwgeW91IGhhdmUgYSBkZWNlbnQgY2hhbmNlCi10aGF0IGl0IGhhcyBjb25uZWN0ZWQuCi0KLU9uZSB2ZXJ5IG5hc3R5IHByb2JsZW0gd2l0aCBcY29kZXtzZWxlY3R9OiBpZiBzb21ld2hlcmUgaW4gdGhvc2UKLWlucHV0IGxpc3RzIG9mIHNvY2tldHMgaXMgb25lIHdoaWNoIGhhcyBkaWVkIGEgbmFzdHkgZGVhdGgsIHRoZQotXGNvZGV7c2VsZWN0fSB3aWxsIGZhaWwuIFlvdSB0aGVuIG5lZWQgdG8gbG9vcCB0aHJvdWdoIGV2ZXJ5Ci1zaW5nbGUgZGFtbiBzb2NrZXQgaW4gYWxsIHRob3NlIGxpc3RzIGFuZCBkbyBhCi1cY29kZXtzZWxlY3QoW3NvY2tdLFtdLFtdLDApfSB1bnRpbCB5b3UgZmluZCB0aGUgYmFkIG9uZS4gVGhhdAotdGltZW91dCBvZiAwIG1lYW5zIGl0IHdvbid0IHRha2UgbG9uZywgYnV0IGl0J3MgdWdseS4KLQotQWN0dWFsbHksIFxjb2Rle3NlbGVjdH0gY2FuIGJlIGhhbmR5IGV2ZW4gd2l0aCBibG9ja2luZyBzb2NrZXRzLgotSXQncyBvbmUgd2F5IG9mIGRldGVybWluaW5nIHdoZXRoZXIgeW91IHdpbGwgYmxvY2sgLSB0aGUgc29ja2V0Ci1yZXR1cm5zIGFzIHJlYWRhYmxlIHdoZW4gdGhlcmUncyBzb21ldGhpbmcgaW4gdGhlIGJ1ZmZlcnMuICBIb3dldmVyLAotdGhpcyBzdGlsbCBkb2Vzbid0IGhlbHAgd2l0aCB0aGUgcHJvYmxlbSBvZiBkZXRlcm1pbmluZyB3aGV0aGVyIHRoZQotb3RoZXIgZW5kIGlzIGRvbmUsIG9yIGp1c3QgYnVzeSB3aXRoIHNvbWV0aGluZyBlbHNlLgotCi1cdGV4dGJme1BvcnRhYmlsaXR5IGFsZXJ0fTogT24gVW5peCwgXGNvZGV7c2VsZWN0fSB3b3JrcyBib3RoIHdpdGgKLXRoZSBzb2NrZXRzIGFuZCBmaWxlcy4gRG9uJ3QgdHJ5IHRoaXMgb24gV2luZG93cy4gT24gV2luZG93cywKLVxjb2Rle3NlbGVjdH0gd29ya3Mgd2l0aCBzb2NrZXRzIG9ubHkuIEFsc28gbm90ZSB0aGF0IGluIEMsIG1hbnkKLW9mIHRoZSBtb3JlIGFkdmFuY2VkIHNvY2tldCBvcHRpb25zIGFyZSBkb25lIGRpZmZlcmVudGx5IG9uCi1XaW5kb3dzLiBJbiBmYWN0LCBvbiBXaW5kb3dzIEkgdXN1YWxseSB1c2UgdGhyZWFkcyAod2hpY2ggd29yayB2ZXJ5LAotdmVyeSB3ZWxsKSB3aXRoIG15IHNvY2tldHMuIEZhY2UgaXQsIGlmIHlvdSB3YW50IGFueSBraW5kIG9mCi1wZXJmb3JtYW5jZSwgeW91ciBjb2RlIHdpbGwgbG9vayB2ZXJ5IGRpZmZlcmVudCBvbiBXaW5kb3dzIHRoYW4gb24KLVVuaXguIChJIGhhdmVuJ3QgdGhlIGZvZ2dpZXN0IGhvdyB5b3UgZG8gdGhpcyBzdHVmZiBvbiBhIE1hYy4pCi0KLVxzdWJzZWN0aW9ue1BlcmZvcm1hbmNlfQotCi1UaGVyZSdzIG5vIHF1ZXN0aW9uIHRoYXQgdGhlIGZhc3Rlc3Qgc29ja2V0cyBjb2RlIHVzZXMgbm9uLWJsb2NraW5nCi1zb2NrZXRzIGFuZCBzZWxlY3QgdG8gbXVsdGlwbGV4IHRoZW0uIFlvdSBjYW4gcHV0IHRvZ2V0aGVyIHNvbWV0aGluZwotdGhhdCB3aWxsIHNhdHVyYXRlIGEgTEFOIGNvbm5lY3Rpb24gd2l0aG91dCBwdXR0aW5nIGFueSBzdHJhaW4gb24gdGhlCi1DUFUuIFRoZSB0cm91YmxlIGlzIHRoYXQgYW4gYXBwIHdyaXR0ZW4gdGhpcyB3YXkgY2FuJ3QgZG8gbXVjaCBvZgotYW55dGhpbmcgZWxzZSAtIGl0IG5lZWRzIHRvIGJlIHJlYWR5IHRvIHNodWZmbGUgYnl0ZXMgYXJvdW5kIGF0IGFsbAotdGltZXMuCi0KLUFzc3VtaW5nIHRoYXQgeW91ciBhcHAgaXMgYWN0dWFsbHkgc3VwcG9zZWQgdG8gZG8gc29tZXRoaW5nIG1vcmUgdGhhbgotdGhhdCwgdGhyZWFkaW5nIGlzIHRoZSBvcHRpbWFsIHNvbHV0aW9uLCAoYW5kIHVzaW5nIG5vbi1ibG9ja2luZwotc29ja2V0cyB3aWxsIGJlIGZhc3RlciB0aGFuIHVzaW5nIGJsb2NraW5nIHNvY2tldHMpLiBVbmZvcnR1bmF0ZWx5LAotdGhyZWFkaW5nIHN1cHBvcnQgaW4gVW5peGVzIHZhcmllcyBib3RoIGluIEFQSSBhbmQgcXVhbGl0eS4gU28gdGhlCi1ub3JtYWwgVW5peCBzb2x1dGlvbiBpcyB0byBmb3JrIGEgc3VicHJvY2VzcyB0byBkZWFsIHdpdGggZWFjaAotY29ubmVjdGlvbi4gVGhlIG92ZXJoZWFkIGZvciB0aGlzIGlzIHNpZ25pZmljYW50IChhbmQgZG9uJ3QgZG8gdGhpcyBvbgotV2luZG93cyAtIHRoZSBvdmVyaGVhZCBvZiBwcm9jZXNzIGNyZWF0aW9uIGlzIGVub3Jtb3VzIHRoZXJlKS4gSXQgYWxzbwotbWVhbnMgdGhhdCB1bmxlc3MgZWFjaCBzdWJwcm9jZXNzIGlzIGNvbXBsZXRlbHkgaW5kZXBlbmRlbnQsIHlvdSdsbAotbmVlZCB0byB1c2UgYW5vdGhlciBmb3JtIG9mIElQQywgc2F5IGEgcGlwZSwgb3Igc2hhcmVkIG1lbW9yeSBhbmQKLXNlbWFwaG9yZXMsIHRvIGNvbW11bmljYXRlIGJldHdlZW4gdGhlIHBhcmVudCBhbmQgY2hpbGQgcHJvY2Vzc2VzLgotCi1GaW5hbGx5LCByZW1lbWJlciB0aGF0IGV2ZW4gdGhvdWdoIGJsb2NraW5nIHNvY2tldHMgYXJlIHNvbWV3aGF0Ci1zbG93ZXIgdGhhbiBub24tYmxvY2tpbmcsIGluIG1hbnkgY2FzZXMgdGhleSBhcmUgdGhlICJyaWdodCIKLXNvbHV0aW9uLiBBZnRlciBhbGwsIGlmIHlvdXIgYXBwIGlzIGRyaXZlbiBieSB0aGUgZGF0YSBpdCByZWNlaXZlcwotb3ZlciBhIHNvY2tldCwgdGhlcmUncyBub3QgbXVjaCBzZW5zZSBpbiBjb21wbGljYXRpbmcgdGhlIGxvZ2ljIGp1c3QKLXNvIHlvdXIgYXBwIGNhbiB3YWl0IG9uIFxjb2Rle3NlbGVjdH0gaW5zdGVhZCBvZgotXGNvZGV7cmVjdn0uCi0KLVxlbmR7ZG9jdW1lbnR9CmRpZmYgLS1naXQgYS9Eb2MvaG93dG8vdW5pY29kZS5yc3QgYi9Eb2MvaG93dG8vdW5pY29kZS5yc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZmUyY2IuLjAwMDAwMDAKLS0tIGEvRG9jL2hvd3RvL3VuaWNvZGUucnN0CisrKyAvZGV2L251bGwKQEAgLTEsNzY2ICswLDAgQEAKLVVuaWNvZGUgSE9XVE8KLT09PT09PT09PT09PT09PT0KLQotKipWZXJzaW9uIDEuMDIqKgotCi1UaGlzIEhPV1RPIGRpc2N1c3NlcyBQeXRob24ncyBzdXBwb3J0IGZvciBVbmljb2RlLCBhbmQgZXhwbGFpbnMgdmFyaW91cyAKLXByb2JsZW1zIHRoYXQgcGVvcGxlIGNvbW1vbmx5IGVuY291bnRlciB3aGVuIHRyeWluZyB0byB3b3JrIHdpdGggVW5pY29kZS4KLQotSW50cm9kdWN0aW9uIHRvIFVuaWNvZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IaXN0b3J5IG9mIENoYXJhY3RlciBDb2RlcwotJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnCi0KLUluIDE5NjgsIHRoZSBBbWVyaWNhbiBTdGFuZGFyZCBDb2RlIGZvciBJbmZvcm1hdGlvbiBJbnRlcmNoYW5nZSwKLWJldHRlciBrbm93biBieSBpdHMgYWNyb255bSBBU0NJSSwgd2FzIHN0YW5kYXJkaXplZC4gIEFTQ0lJIGRlZmluZWQKLW51bWVyaWMgY29kZXMgZm9yIHZhcmlvdXMgY2hhcmFjdGVycywgd2l0aCB0aGUgbnVtZXJpYyB2YWx1ZXMgcnVubmluZyBmcm9tIDAgdG8KLTEyNy4gIEZvciBleGFtcGxlLCB0aGUgbG93ZXJjYXNlIGxldHRlciAnYScgaXMgYXNzaWduZWQgOTcgYXMgaXRzIGNvZGUKLXZhbHVlLgotCi1BU0NJSSB3YXMgYW4gQW1lcmljYW4tZGV2ZWxvcGVkIHN0YW5kYXJkLCBzbyBpdCBvbmx5IGRlZmluZWQKLXVuYWNjZW50ZWQgY2hhcmFjdGVycy4gIFRoZXJlIHdhcyBhbiAnZScsIGJ1dCBubyAnw6knIG9yICfDjScuICBUaGlzCi1tZWFudCB0aGF0IGxhbmd1YWdlcyB3aGljaCByZXF1aXJlZCBhY2NlbnRlZCBjaGFyYWN0ZXJzIGNvdWxkbid0IGJlCi1mYWl0aGZ1bGx5IHJlcHJlc2VudGVkIGluIEFTQ0lJLiAgKEFjdHVhbGx5IHRoZSBtaXNzaW5nIGFjY2VudHMgbWF0dGVyCi1mb3IgRW5nbGlzaCwgdG9vLCB3aGljaCBjb250YWlucyB3b3JkcyBzdWNoIGFzICduYcOvdmUnIGFuZCAnY2Fmw6knLCBhbmQgc29tZQotcHVibGljYXRpb25zIGhhdmUgaG91c2Ugc3R5bGVzIHdoaWNoIHJlcXVpcmUgc3BlbGxpbmdzIHN1Y2ggYXMKLSdjb8O2cGVyYXRlJy4pCi0KLUZvciBhIHdoaWxlIHBlb3BsZSBqdXN0IHdyb3RlIHByb2dyYW1zIHRoYXQgZGlkbid0IGRpc3BsYXkgYWNjZW50cy4gIEkKLXJlbWVtYmVyIGxvb2tpbmcgYXQgQXBwbGUgXVsgQkFTSUMgcHJvZ3JhbXMsIHB1Ymxpc2hlZCBpbiBGcmVuY2gtbGFuZ3VhZ2UKLXB1YmxpY2F0aW9ucyBpbiB0aGUgbWlkLTE5ODBzLCB0aGF0IGhhZCBsaW5lcyBsaWtlIHRoZXNlOjoKLQotCVBSSU5UICJGSUNIRVIgRVNUIENPTVBMRVRFLiIKLQlQUklOVCAiQ0FSQUNURVJFIE5PTiBBQ0NFUFRFLiIKLQotVGhvc2UgbWVzc2FnZXMgc2hvdWxkIGNvbnRhaW4gYWNjZW50cywgYW5kIHRoZXkganVzdCBsb29rIHdyb25nIHRvCi1zb21lb25lIHdobyBjYW4gcmVhZCBGcmVuY2guICAKLQotSW4gdGhlIDE5ODBzLCBhbG1vc3QgYWxsIHBlcnNvbmFsIGNvbXB1dGVycyB3ZXJlIDgtYml0LCBtZWFuaW5nIHRoYXQKLWJ5dGVzIGNvdWxkIGhvbGQgdmFsdWVzIHJhbmdpbmcgZnJvbSAwIHRvIDI1NS4gIEFTQ0lJIGNvZGVzIG9ubHkgd2VudAotdXAgdG8gMTI3LCBzbyBzb21lIG1hY2hpbmVzIGFzc2lnbmVkIHZhbHVlcyBiZXR3ZWVuIDEyOCBhbmQgMjU1IHRvCi1hY2NlbnRlZCBjaGFyYWN0ZXJzLiAgRGlmZmVyZW50IG1hY2hpbmVzIGhhZCBkaWZmZXJlbnQgY29kZXMsIGhvd2V2ZXIsCi13aGljaCBsZWQgdG8gcHJvYmxlbXMgZXhjaGFuZ2luZyBmaWxlcy4gIEV2ZW50dWFsbHkgdmFyaW91cyBjb21tb25seQotdXNlZCBzZXRzIG9mIHZhbHVlcyBmb3IgdGhlIDEyOC0yNTUgcmFuZ2UgZW1lcmdlZC4gIFNvbWUgd2VyZSB0cnVlCi1zdGFuZGFyZHMsIGRlZmluZWQgYnkgdGhlIEludGVybmF0aW9uYWwgU3RhbmRhcmRzIE9yZ2FuaXphdGlvbiwgYW5kCi1zb21lIHdlcmUgKipkZSBmYWN0byoqIGNvbnZlbnRpb25zIHRoYXQgd2VyZSBpbnZlbnRlZCBieSBvbmUgY29tcGFueQotb3IgYW5vdGhlciBhbmQgbWFuYWdlZCB0byBjYXRjaCBvbi4KLQotMjU1IGNoYXJhY3RlcnMgYXJlbid0IHZlcnkgbWFueS4gIEZvciBleGFtcGxlLCB5b3UgY2FuJ3QgZml0Ci1ib3RoIHRoZSBhY2NlbnRlZCBjaGFyYWN0ZXJzIHVzZWQgaW4gV2VzdGVybiBFdXJvcGUgYW5kIHRoZSBDeXJpbGxpYwotYWxwaGFiZXQgdXNlZCBmb3IgUnVzc2lhbiBpbnRvIHRoZSAxMjgtMjU1IHJhbmdlIGJlY2F1c2UgdGhlcmUgYXJlIG1vcmUgdGhhbgotMTI3IHN1Y2ggY2hhcmFjdGVycy4KLQotWW91IGNvdWxkIHdyaXRlIGZpbGVzIHVzaW5nIGRpZmZlcmVudCBjb2RlcyAoYWxsIHlvdXIgUnVzc2lhbgotZmlsZXMgaW4gYSBjb2Rpbmcgc3lzdGVtIGNhbGxlZCBLT0k4LCBhbGwgeW91ciBGcmVuY2ggZmlsZXMgaW4gCi1hIGRpZmZlcmVudCBjb2Rpbmcgc3lzdGVtIGNhbGxlZCBMYXRpbjEpLCBidXQgd2hhdCBpZiB5b3Ugd2FudGVkCi10byB3cml0ZSBhIEZyZW5jaCBkb2N1bWVudCB0aGF0IHF1b3RlcyBzb21lIFJ1c3NpYW4gdGV4dD8gIEluIHRoZQotMTk4MHMgcGVvcGxlIGJlZ2FuIHRvIHdhbnQgdG8gc29sdmUgdGhpcyBwcm9ibGVtLCBhbmQgdGhlIFVuaWNvZGUKLXN0YW5kYXJkaXphdGlvbiBlZmZvcnQgYmVnYW4uCi0KLVVuaWNvZGUgc3RhcnRlZCBvdXQgdXNpbmcgMTYtYml0IGNoYXJhY3RlcnMgaW5zdGVhZCBvZiA4LWJpdCBjaGFyYWN0ZXJzLiAgMTYKLWJpdHMgbWVhbnMgeW91IGhhdmUgMl4xNiA9IDY1LDUzNiBkaXN0aW5jdCB2YWx1ZXMgYXZhaWxhYmxlLCBtYWtpbmcgaXQKLXBvc3NpYmxlIHRvIHJlcHJlc2VudCBtYW55IGRpZmZlcmVudCBjaGFyYWN0ZXJzIGZyb20gbWFueSBkaWZmZXJlbnQKLWFscGhhYmV0czsgYW4gaW5pdGlhbCBnb2FsIHdhcyB0byBoYXZlIFVuaWNvZGUgY29udGFpbiB0aGUgYWxwaGFiZXRzIGZvcgotZXZlcnkgc2luZ2xlIGh1bWFuIGxhbmd1YWdlLiAgSXQgdHVybnMgb3V0IHRoYXQgZXZlbiAxNiBiaXRzIGlzbid0IGVub3VnaCB0bwotbWVldCB0aGF0IGdvYWwsIGFuZCB0aGUgbW9kZXJuIFVuaWNvZGUgc3BlY2lmaWNhdGlvbiB1c2VzIGEgd2lkZXIgcmFuZ2Ugb2YKLWNvZGVzLCAwLTEsMTE0LDExMSAoMHgxMGZmZmYgaW4gYmFzZS0xNikuCi0KLVRoZXJlJ3MgYSByZWxhdGVkIElTTyBzdGFuZGFyZCwgSVNPIDEwNjQ2LiAgVW5pY29kZSBhbmQgSVNPIDEwNjQ2IHdlcmUKLW9yaWdpbmFsbHkgc2VwYXJhdGUgZWZmb3J0cywgYnV0IHRoZSBzcGVjaWZpY2F0aW9ucyB3ZXJlIG1lcmdlZCB3aXRoCi10aGUgMS4xIHJldmlzaW9uIG9mIFVuaWNvZGUuICAKLQotKFRoaXMgZGlzY3Vzc2lvbiBvZiBVbmljb2RlJ3MgaGlzdG9yeSBpcyBoaWdobHkgc2ltcGxpZmllZC4gIEkgZG9uJ3QKLXRoaW5rIHRoZSBhdmVyYWdlIFB5dGhvbiBwcm9ncmFtbWVyIG5lZWRzIHRvIHdvcnJ5IGFib3V0IHRoZQotaGlzdG9yaWNhbCBkZXRhaWxzOyBjb25zdWx0IHRoZSBVbmljb2RlIGNvbnNvcnRpdW0gc2l0ZSBsaXN0ZWQgaW4gdGhlCi1SZWZlcmVuY2VzIGZvciBtb3JlIGluZm9ybWF0aW9uLikKLQotCi1EZWZpbml0aW9ucwotJycnJycnJycnJycnJycnJycnJycnJycnCi0KLUEgKipjaGFyYWN0ZXIqKiBpcyB0aGUgc21hbGxlc3QgcG9zc2libGUgY29tcG9uZW50IG9mIGEgdGV4dC4gICdBJywKLSdCJywgJ0MnLCBldGMuLCBhcmUgYWxsIGRpZmZlcmVudCBjaGFyYWN0ZXJzLiAgU28gYXJlICfDiCcgYW5kCi0nw40nLiAgQ2hhcmFjdGVycyBhcmUgYWJzdHJhY3Rpb25zLCBhbmQgdmFyeSBkZXBlbmRpbmcgb24gdGhlCi1sYW5ndWFnZSBvciBjb250ZXh0IHlvdSdyZSB0YWxraW5nIGFib3V0LiAgRm9yIGV4YW1wbGUsIHRoZSBzeW1ib2wgZm9yCi1vaG1zICjihKYpIGlzIHVzdWFsbHkgZHJhd24gbXVjaCBsaWtlIHRoZSBjYXBpdGFsIGxldHRlcgotb21lZ2EgKM6pKSBpbiB0aGUgR3JlZWsgYWxwaGFiZXQgKHRoZXkgbWF5IGV2ZW4gYmUgdGhlIHNhbWUgaW4KLXNvbWUgZm9udHMpLCBidXQgdGhlc2UgYXJlIHR3byBkaWZmZXJlbnQgY2hhcmFjdGVycyB0aGF0IGhhdmUKLWRpZmZlcmVudCBtZWFuaW5ncy4KLQotVGhlIFVuaWNvZGUgc3RhbmRhcmQgZGVzY3JpYmVzIGhvdyBjaGFyYWN0ZXJzIGFyZSByZXByZXNlbnRlZCBieQotKipjb2RlIHBvaW50cyoqLiAgQSBjb2RlIHBvaW50IGlzIGFuIGludGVnZXIgdmFsdWUsIHVzdWFsbHkgZGVub3RlZCBpbgotYmFzZSAxNi4gIEluIHRoZSBzdGFuZGFyZCwgYSBjb2RlIHBvaW50IGlzIHdyaXR0ZW4gdXNpbmcgdGhlIG5vdGF0aW9uCi1VKzEyY2EgdG8gbWVhbiB0aGUgY2hhcmFjdGVyIHdpdGggdmFsdWUgMHgxMmNhICg0ODEwIGRlY2ltYWwpLiAgVGhlCi1Vbmljb2RlIHN0YW5kYXJkIGNvbnRhaW5zIGEgbG90IG9mIHRhYmxlcyBsaXN0aW5nIGNoYXJhY3RlcnMgYW5kIHRoZWlyCi1jb3JyZXNwb25kaW5nIGNvZGUgcG9pbnRzOjoKLQotCTAwNjEgICAgJ2EnOyBMQVRJTiBTTUFMTCBMRVRURVIgQQotCTAwNjIgICAgJ2InOyBMQVRJTiBTTUFMTCBMRVRURVIgQgotCTAwNjMgICAgJ2MnOyBMQVRJTiBTTUFMTCBMRVRURVIgQwotICAgICAgICAuLi4KLQkwMDdCCSd7JzsgTEVGVCBDVVJMWSBCUkFDS0VUCi0KLVN0cmljdGx5LCB0aGVzZSBkZWZpbml0aW9ucyBpbXBseSB0aGF0IGl0J3MgbWVhbmluZ2xlc3MgdG8gc2F5ICd0aGlzIGlzCi1jaGFyYWN0ZXIgVSsxMmNhJy4gIFUrMTJjYSBpcyBhIGNvZGUgcG9pbnQsIHdoaWNoIHJlcHJlc2VudHMgc29tZSBwYXJ0aWN1bGFyCi1jaGFyYWN0ZXI7IGluIHRoaXMgY2FzZSwgaXQgcmVwcmVzZW50cyB0aGUgY2hhcmFjdGVyICdFVEhJT1BJQyBTWUxMQUJMRSBXSScuCi1JbiBpbmZvcm1hbCBjb250ZXh0cywgdGhpcyBkaXN0aW5jdGlvbiBiZXR3ZWVuIGNvZGUgcG9pbnRzIGFuZCBjaGFyYWN0ZXJzIHdpbGwKLXNvbWV0aW1lcyBiZSBmb3Jnb3R0ZW4uCi0KLUEgY2hhcmFjdGVyIGlzIHJlcHJlc2VudGVkIG9uIGEgc2NyZWVuIG9yIG9uIHBhcGVyIGJ5IGEgc2V0IG9mIGdyYXBoaWNhbAotZWxlbWVudHMgdGhhdCdzIGNhbGxlZCBhICoqZ2x5cGgqKi4gIFRoZSBnbHlwaCBmb3IgYW4gdXBwZXJjYXNlIEEsIGZvcgotZXhhbXBsZSwgaXMgdHdvIGRpYWdvbmFsIHN0cm9rZXMgYW5kIGEgaG9yaXpvbnRhbCBzdHJva2UsIHRob3VnaCB0aGUgZXhhY3QKLWRldGFpbHMgd2lsbCBkZXBlbmQgb24gdGhlIGZvbnQgYmVpbmcgdXNlZC4gIE1vc3QgUHl0aG9uIGNvZGUgZG9lc24ndCBuZWVkCi10byB3b3JyeSBhYm91dCBnbHlwaHM7IGZpZ3VyaW5nIG91dCB0aGUgY29ycmVjdCBnbHlwaCB0byBkaXNwbGF5IGlzCi1nZW5lcmFsbHkgdGhlIGpvYiBvZiBhIEdVSSB0b29sa2l0IG9yIGEgdGVybWluYWwncyBmb250IHJlbmRlcmVyLgotCi0KLUVuY29kaW5ncwotJycnJycnJycnCi0KLVRvIHN1bW1hcml6ZSB0aGUgcHJldmlvdXMgc2VjdGlvbjogCi1hIFVuaWNvZGUgc3RyaW5nIGlzIGEgc2VxdWVuY2Ugb2YgY29kZSBwb2ludHMsIHdoaWNoIGFyZQotbnVtYmVycyBmcm9tIDAgdG8gMHgxMGZmZmYuICBUaGlzIHNlcXVlbmNlIG5lZWRzIHRvIGJlIHJlcHJlc2VudGVkIGFzCi1hIHNldCBvZiBieXRlcyAobWVhbmluZywgdmFsdWVzIGZyb20gMC0yNTUpIGluIG1lbW9yeS4gIFRoZSBydWxlcyBmb3IKLXRyYW5zbGF0aW5nIGEgVW5pY29kZSBzdHJpbmcgaW50byBhIHNlcXVlbmNlIG9mIGJ5dGVzIGFyZSBjYWxsZWQgYW4gCi0qKmVuY29kaW5nKiouCi0KLVRoZSBmaXJzdCBlbmNvZGluZyB5b3UgbWlnaHQgdGhpbmsgb2YgaXMgYW4gYXJyYXkgb2YgMzItYml0IGludGVnZXJzLiAgCi1JbiB0aGlzIHJlcHJlc2VudGF0aW9uLCB0aGUgc3RyaW5nICJQeXRob24iIHdvdWxkIGxvb2sgbGlrZSB0aGlzOjoKLQotICAgICAgIFAgICAgICAgICAgIHkgICAgICAgICAgIHQgICAgICAgICAgIGggICAgICAgICAgIG8gICAgICAgICAgIG4KLSAgICAweDUwIDAwIDAwIDAwIDc5IDAwIDAwIDAwIDc0IDAwIDAwIDAwIDY4IDAwIDAwIDAwIDZmIDAwIDAwIDAwIDZlIDAwIDAwIDAwIAotICAgICAgIDAgIDEgIDIgIDMgIDQgIDUgIDYgIDcgIDggIDkgMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcgMTggMTkgMjAgMjEgMjIgMjMgCi0KLVRoaXMgcmVwcmVzZW50YXRpb24gaXMgc3RyYWlnaHRmb3J3YXJkIGJ1dCB1c2luZwotaXQgcHJlc2VudHMgYSBudW1iZXIgb2YgcHJvYmxlbXMuCi0KLTEuIEl0J3Mgbm90IHBvcnRhYmxlOyBkaWZmZXJlbnQgcHJvY2Vzc29ycyBvcmRlciB0aGUgYnl0ZXMgCi0gICBkaWZmZXJlbnRseS4gCi0KLTIuIEl0J3MgdmVyeSB3YXN0ZWZ1bCBvZiBzcGFjZS4gIEluIG1vc3QgdGV4dHMsIHRoZSBtYWpvcml0eSBvZiB0aGUgY29kZSAKLSAgIHBvaW50cyBhcmUgbGVzcyB0aGFuIDEyNywgb3IgbGVzcyB0aGFuIDI1NSwgc28gYSBsb3Qgb2Ygc3BhY2UgaXMgb2NjdXBpZWQKLSAgIGJ5IHplcm8gYnl0ZXMuICBUaGUgYWJvdmUgc3RyaW5nIHRha2VzIDI0IGJ5dGVzIGNvbXBhcmVkIHRvIHRoZSA2Ci0gICBieXRlcyBuZWVkZWQgZm9yIGFuIEFTQ0lJIHJlcHJlc2VudGF0aW9uLiAgSW5jcmVhc2VkIFJBTSB1c2FnZSBkb2Vzbid0Ci0gICBtYXR0ZXIgdG9vIG11Y2ggKGRlc2t0b3AgY29tcHV0ZXJzIGhhdmUgbWVnYWJ5dGVzIG9mIFJBTSwgYW5kIHN0cmluZ3MKLSAgIGFyZW4ndCB1c3VhbGx5IHRoYXQgbGFyZ2UpLCBidXQgZXhwYW5kaW5nIG91ciB1c2FnZSBvZiBkaXNrIGFuZAotICAgbmV0d29yayBiYW5kd2lkdGggYnkgYSBmYWN0b3Igb2YgNCBpcyBpbnRvbGVyYWJsZS4KLQotMy4gSXQncyBub3QgY29tcGF0aWJsZSB3aXRoIGV4aXN0aW5nIEMgZnVuY3Rpb25zIHN1Y2ggYXMgYGBzdHJsZW4oKWBgLAotICAgc28gYSBuZXcgZmFtaWx5IG9mIHdpZGUgc3RyaW5nIGZ1bmN0aW9ucyB3b3VsZCBuZWVkIHRvIGJlIHVzZWQuCi0KLTQuIE1hbnkgSW50ZXJuZXQgc3RhbmRhcmRzIGFyZSBkZWZpbmVkIGluIHRlcm1zIG9mIHRleHR1YWwgZGF0YSwgYW5kIAotICAgY2FuJ3QgaGFuZGxlIGNvbnRlbnQgd2l0aCBlbWJlZGRlZCB6ZXJvIGJ5dGVzLgotCi1HZW5lcmFsbHkgcGVvcGxlIGRvbid0IHVzZSB0aGlzIGVuY29kaW5nLCBpbnN0ZWFkIGNob29zaW5nIG90aGVyIGVuY29kaW5ncwotdGhhdCBhcmUgbW9yZSBlZmZpY2llbnQgYW5kIGNvbnZlbmllbnQuCi0KLUVuY29kaW5ncyBkb24ndCBoYXZlIHRvIGhhbmRsZSBldmVyeSBwb3NzaWJsZSBVbmljb2RlIGNoYXJhY3RlciwgYW5kCi1tb3N0IGVuY29kaW5ncyBkb24ndC4gIEZvciBleGFtcGxlLCBQeXRob24ncyBkZWZhdWx0IGVuY29kaW5nIGlzIHRoZQotJ2FzY2lpJyBlbmNvZGluZy4gIFRoZSBydWxlcyBmb3IgY29udmVydGluZyBhIFVuaWNvZGUgc3RyaW5nIGludG8gdGhlCi1BU0NJSSBlbmNvZGluZyBhcmUgc2ltcGxlOyBmb3IgZWFjaCBjb2RlIHBvaW50OgotCi0xLiBJZiB0aGUgY29kZSBwb2ludCBpcyA8MTI4LCBlYWNoIGJ5dGUgaXMgdGhlIHNhbWUgYXMgdGhlIHZhbHVlIG9mIHRoZSAKLSAgIGNvZGUgcG9pbnQuCi0KLTIuIElmIHRoZSBjb2RlIHBvaW50IGlzIDEyOCBvciBncmVhdGVyLCB0aGUgVW5pY29kZSBzdHJpbmcgY2FuJ3QgCi0gICBiZSByZXByZXNlbnRlZCBpbiB0aGlzIGVuY29kaW5nLiAgKFB5dGhvbiByYWlzZXMgIGEgCi0gICBgYFVuaWNvZGVFbmNvZGVFcnJvcmBgIGV4Y2VwdGlvbiBpbiB0aGlzIGNhc2UuKQotCi1MYXRpbi0xLCBhbHNvIGtub3duIGFzIElTTy04ODU5LTEsIGlzIGEgc2ltaWxhciBlbmNvZGluZy4gIFVuaWNvZGUKLWNvZGUgcG9pbnRzIDAtMjU1IGFyZSBpZGVudGljYWwgdG8gdGhlIExhdGluLTEgdmFsdWVzLCBzbyBjb252ZXJ0aW5nCi10byB0aGlzIGVuY29kaW5nIHNpbXBseSByZXF1aXJlcyBjb252ZXJ0aW5nIGNvZGUgcG9pbnRzIHRvIGJ5dGUKLXZhbHVlczsgaWYgYSBjb2RlIHBvaW50IGxhcmdlciB0aGFuIDI1NSBpcyBlbmNvdW50ZXJlZCwgdGhlIHN0cmluZwotY2FuJ3QgYmUgZW5jb2RlZCBpbnRvIExhdGluLTEuCi0KLUVuY29kaW5ncyBkb24ndCBoYXZlIHRvIGJlIHNpbXBsZSBvbmUtdG8tb25lIG1hcHBpbmdzIGxpa2UgTGF0aW4tMS4KLUNvbnNpZGVyIElCTSdzIEVCQ0RJQywgd2hpY2ggd2FzIHVzZWQgb24gSUJNIG1haW5mcmFtZXMuICBMZXR0ZXIKLXZhbHVlcyB3ZXJlbid0IGluIG9uZSBibG9jazogJ2EnIHRocm91Z2ggJ2knIGhhZCB2YWx1ZXMgZnJvbSAxMjkgdG8KLTEzNywgYnV0ICdqJyB0aHJvdWdoICdyJyB3ZXJlIDE0NSB0aHJvdWdoIDE1My4gIElmIHlvdSB3YW50ZWQgdG8gdXNlCi1FQkNESUMgYXMgYW4gZW5jb2RpbmcsIHlvdSdkIHByb2JhYmx5IHVzZSBzb21lIHNvcnQgb2YgbG9va3VwIHRhYmxlIHRvCi1wZXJmb3JtIHRoZSBjb252ZXJzaW9uLCBidXQgdGhpcyBpcyBsYXJnZWx5IGFuIGludGVybmFsIGRldGFpbC4KLQotVVRGLTggaXMgb25lIG9mIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgZW5jb2RpbmdzLiAgVVRGIHN0YW5kcyBmb3IKLSJVbmljb2RlIFRyYW5zZm9ybWF0aW9uIEZvcm1hdCIsIGFuZCB0aGUgJzgnIG1lYW5zIHRoYXQgOC1iaXQgbnVtYmVycwotYXJlIHVzZWQgaW4gdGhlIGVuY29kaW5nLiAgKFRoZXJlJ3MgYWxzbyBhIFVURi0xNiBlbmNvZGluZywgYnV0IGl0J3MKLWxlc3MgZnJlcXVlbnRseSB1c2VkIHRoYW4gVVRGLTguKSAgVVRGLTggdXNlcyB0aGUgZm9sbG93aW5nIHJ1bGVzOgotCi0xLiBJZiB0aGUgY29kZSBwb2ludCBpcyA8MTI4LCBpdCdzIHJlcHJlc2VudGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIGJ5dGUgdmFsdWUuCi0yLiBJZiB0aGUgY29kZSBwb2ludCBpcyBiZXR3ZWVuIDEyOCBhbmQgMHg3ZmYsIGl0J3MgdHVybmVkIGludG8gdHdvIGJ5dGUgdmFsdWVzCi0gICBiZXR3ZWVuIDEyOCBhbmQgMjU1LgotMy4gQ29kZSBwb2ludHMgPjB4N2ZmIGFyZSB0dXJuZWQgaW50byB0aHJlZS0gb3IgZm91ci1ieXRlIHNlcXVlbmNlcywgd2hlcmUKLSAgIGVhY2ggYnl0ZSBvZiB0aGUgc2VxdWVuY2UgaXMgYmV0d2VlbiAxMjggYW5kIDI1NS4KLSAgICAKLVVURi04IGhhcyBzZXZlcmFsIGNvbnZlbmllbnQgcHJvcGVydGllczoKLQotMS4gSXQgY2FuIGhhbmRsZSBhbnkgVW5pY29kZSBjb2RlIHBvaW50LgotMi4gQSBVbmljb2RlIHN0cmluZyBpcyB0dXJuZWQgaW50byBhIHN0cmluZyBvZiBieXRlcyBjb250YWluaW5nIG5vIGVtYmVkZGVkIHplcm8gYnl0ZXMuICBUaGlzIGF2b2lkcyBieXRlLW9yZGVyaW5nIGlzc3VlcywgYW5kIG1lYW5zIFVURi04IHN0cmluZ3MgY2FuIGJlIHByb2Nlc3NlZCBieSBDIGZ1bmN0aW9ucyBzdWNoIGFzIGBgc3RyY3B5KClgYCBhbmQgc2VudCB0aHJvdWdoIHByb3RvY29scyB0aGF0IGNhbid0IGhhbmRsZSB6ZXJvIGJ5dGVzLgotMy4gQSBzdHJpbmcgb2YgQVNDSUkgdGV4dCBpcyBhbHNvIHZhbGlkIFVURi04IHRleHQuIAotNC4gVVRGLTggaXMgZmFpcmx5IGNvbXBhY3Q7IHRoZSBtYWpvcml0eSBvZiBjb2RlIHBvaW50cyBhcmUgdHVybmVkIGludG8gdHdvIGJ5dGVzLCBhbmQgdmFsdWVzIGxlc3MgdGhhbiAxMjggb2NjdXB5IG9ubHkgYSBzaW5nbGUgYnl0ZS4KLTUuIElmIGJ5dGVzIGFyZSBjb3JydXB0ZWQgb3IgbG9zdCwgaXQncyBwb3NzaWJsZSB0byBkZXRlcm1pbmUgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IFVURi04LWVuY29kZWQgY29kZSBwb2ludCBhbmQgcmVzeW5jaHJvbml6ZS4gIEl0J3MgYWxzbyB1bmxpa2VseSB0aGF0IHJhbmRvbSA4LWJpdCBkYXRhIHdpbGwgbG9vayBsaWtlIHZhbGlkIFVURi04LgotCi0KLQotUmVmZXJlbmNlcwotJycnJycnJycnJycnJycKLQotVGhlIFVuaWNvZGUgQ29uc29ydGl1bSBzaXRlIGF0IDxodHRwOi8vd3d3LnVuaWNvZGUub3JnPiBoYXMgY2hhcmFjdGVyCi1jaGFydHMsIGEgZ2xvc3NhcnksIGFuZCBQREYgdmVyc2lvbnMgb2YgdGhlIFVuaWNvZGUgc3BlY2lmaWNhdGlvbi4gIEJlCi1wcmVwYXJlZCBmb3Igc29tZSBkaWZmaWN1bHQgcmVhZGluZy4KLTxodHRwOi8vd3d3LnVuaWNvZGUub3JnL2hpc3RvcnkvPiBpcyBhIGNocm9ub2xvZ3kgb2YgdGhlIG9yaWdpbiBhbmQKLWRldmVsb3BtZW50IG9mIFVuaWNvZGUuCi0KLVRvIGhlbHAgdW5kZXJzdGFuZCB0aGUgc3RhbmRhcmQsIEp1a2thIEtvcnBlbGEgaGFzIHdyaXR0ZW4gYW4KLWludHJvZHVjdG9yeSBndWlkZSB0byByZWFkaW5nIHRoZSBVbmljb2RlIGNoYXJhY3RlciB0YWJsZXMsIAotYXZhaWxhYmxlIGF0IDxodHRwOi8vd3d3LmNzLnR1dC5maS9+amtvcnBlbGEvdW5pY29kZS9ndWlkZS5odG1sPi4KLQotUm9tYW4gQ3p5Ym9ycmEgd3JvdGUgYW5vdGhlciBleHBsYW5hdGlvbiBvZiBVbmljb2RlJ3MgYmFzaWMgcHJpbmNpcGxlczsgCi1pdCdzIGF0IDxodHRwOi8vY3p5Ym9ycmEuY29tL3VuaWNvZGUvY2hhcmFjdGVycy5odG1sPi4KLUN6eWJvcnJhIGhhcyB3cml0dGVuIGEgbnVtYmVyIG9mIG90aGVyIFVuaWNvZGUtcmVsYXRlZCBkb2N1bWVudGF0aW9uLCAKLWF2YWlsYWJsZSBmcm9tIDxodHRwOi8vd3d3LmN5emJvcnJhLmNvbT4uCi0KLVR3byBvdGhlciBnb29kIGludHJvZHVjdG9yeSBhcnRpY2xlcyB3ZXJlIHdyaXR0ZW4gYnkgSm9lbCBTcG9sc2t5Ci08aHR0cDovL3d3dy5qb2Vsb25zb2Z0d2FyZS5jb20vYXJ0aWNsZXMvVW5pY29kZS5odG1sPiBhbmQgSmFzb24KLU9yZW5kb3JmZiA8aHR0cDovL3d3dy5qb3JlbmRvcmZmLmNvbS9hcnRpY2xlcy91bmljb2RlLz4uICBJZiB0aGlzCi1pbnRyb2R1Y3Rpb24gZGlkbid0IG1ha2UgdGhpbmdzIGNsZWFyIHRvIHlvdSwgeW91IHNob3VsZCB0cnkgcmVhZGluZwotb25lIG9mIHRoZXNlIGFsdGVybmF0ZSBhcnRpY2xlcyBiZWZvcmUgY29udGludWluZy4KLQotV2lraXBlZGlhIGVudHJpZXMgYXJlIG9mdGVuIGhlbHBmdWw7IHNlZSB0aGUgZW50cmllcyBmb3IgImNoYXJhY3RlcgotZW5jb2RpbmciIDxodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NoYXJhY3Rlcl9lbmNvZGluZz4gYW5kIFVURi04Ci08aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtOD4sIGZvciBleGFtcGxlLgotCi0KLVB5dGhvbidzIFVuaWNvZGUgU3VwcG9ydAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU5vdyB0aGF0IHlvdSd2ZSBsZWFybmVkIHRoZSBydWRpbWVudHMgb2YgVW5pY29kZSwgd2UgY2FuIGxvb2sgYXQKLVB5dGhvbidzIFVuaWNvZGUgZmVhdHVyZXMuCi0KLQotVGhlIFVuaWNvZGUgVHlwZQotJycnJycnJycnJycnJycnJycnJwotCi1Vbmljb2RlIHN0cmluZ3MgYXJlIGV4cHJlc3NlZCBhcyBpbnN0YW5jZXMgb2YgdGhlIGBgdW5pY29kZWBgIHR5cGUsCi1vbmUgb2YgUHl0aG9uJ3MgcmVwZXJ0b2lyZSBvZiBidWlsdC1pbiB0eXBlcy4gIEl0IGRlcml2ZXMgZnJvbSBhbgotYWJzdHJhY3QgdHlwZSBjYWxsZWQgYGBiYXNlc3RyaW5nYGAsIHdoaWNoIGlzIGFsc28gYW4gYW5jZXN0b3Igb2YgdGhlCi1gYHN0cmBgIHR5cGU7IHlvdSBjYW4gdGhlcmVmb3JlIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSBzdHJpbmcgdHlwZSB3aXRoCi1gYGlzaW5zdGFuY2UodmFsdWUsIGJhc2VzdHJpbmcpYGAuICBVbmRlciB0aGUgaG9vZCwgUHl0aG9uIHJlcHJlc2VudHMKLVVuaWNvZGUgc3RyaW5ncyBhcyBlaXRoZXIgMTYtIG9yIDMyLWJpdCBpbnRlZ2VycywgZGVwZW5kaW5nIG9uIGhvdyB0aGUKLVB5dGhvbiBpbnRlcnByZXRlciB3YXMgY29tcGlsZWQuCi0KLVRoZSBgYHVuaWNvZGUoKWBgIGNvbnN0cnVjdG9yIGhhcyB0aGUgc2lnbmF0dXJlIGBgdW5pY29kZShzdHJpbmdbLCBlbmNvZGluZywgZXJyb3JzXSlgYC4KLUFsbCBvZiBpdHMgYXJndW1lbnRzIHNob3VsZCBiZSA4LWJpdCBzdHJpbmdzLiAgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIGNvbnZlcnRlZCAKLXRvIFVuaWNvZGUgdXNpbmcgdGhlIHNwZWNpZmllZCBlbmNvZGluZzsgaWYgeW91IGxlYXZlIG9mZiB0aGUgYGBlbmNvZGluZ2BgIGFyZ3VtZW50LCAKLXRoZSBBU0NJSSBlbmNvZGluZyBpcyB1c2VkIGZvciB0aGUgY29udmVyc2lvbiwgc28gY2hhcmFjdGVycyBncmVhdGVyIHRoYW4gMTI3IHdpbGwgCi1iZSB0cmVhdGVkIGFzIGVycm9yczo6Ci0KLSAgICA+Pj4gdW5pY29kZSgnYWJjZGVmJykKLSAgICB1J2FiY2RlZicKLSAgICA+Pj4gcyA9IHVuaWNvZGUoJ2FiY2RlZicpCi0gICAgPj4+IHR5cGUocykKLSAgICA8dHlwZSAndW5pY29kZSc+Ci0gICAgPj4+IHVuaWNvZGUoJ2FiY2RlZicgKyBjaHIoMjU1KSkKLSAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/Ci0gICAgVW5pY29kZURlY29kZUVycm9yOiAnYXNjaWknIGNvZGVjIGNhbid0IGRlY29kZSBieXRlIDB4ZmYgaW4gcG9zaXRpb24gNjogCi0gICAgICAgICAgICAgICAgICAgICAgICBvcmRpbmFsIG5vdCBpbiByYW5nZSgxMjgpCi0KLVRoZSBgYGVycm9yc2BgIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgcmVzcG9uc2Ugd2hlbiB0aGUgaW5wdXQgc3RyaW5nIGNhbid0IGJlIGNvbnZlcnRlZCBhY2NvcmRpbmcgdG8gdGhlIGVuY29kaW5nJ3MgcnVsZXMuICBMZWdhbCB2YWx1ZXMgZm9yIHRoaXMgYXJndW1lbnQgCi1hcmUgJ3N0cmljdCcgKHJhaXNlIGEgYGBVbmljb2RlRGVjb2RlRXJyb3JgYCBleGNlcHRpb24pLCAKLSdyZXBsYWNlJyAoYWRkIFUrRkZGRCwgJ1JFUExBQ0VNRU5UIENIQVJBQ1RFUicpLCAKLW9yICdpZ25vcmUnIChqdXN0IGxlYXZlIHRoZSBjaGFyYWN0ZXIgb3V0IG9mIHRoZSBVbmljb2RlIHJlc3VsdCkuICAKLVRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgc2hvdyB0aGUgZGlmZmVyZW5jZXM6OgotCi0gICAgPj4+IHVuaWNvZGUoJ1x4ODBhYmMnLCBlcnJvcnM9J3N0cmljdCcpCi0gICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwotICAgIFVuaWNvZGVEZWNvZGVFcnJvcjogJ2FzY2lpJyBjb2RlYyBjYW4ndCBkZWNvZGUgYnl0ZSAweDgwIGluIHBvc2l0aW9uIDA6IAotICAgICAgICAgICAgICAgICAgICAgICAgb3JkaW5hbCBub3QgaW4gcmFuZ2UoMTI4KQotICAgID4+PiB1bmljb2RlKCdceDgwYWJjJywgZXJyb3JzPSdyZXBsYWNlJykKLSAgICB1J1x1ZmZmZGFiYycKLSAgICA+Pj4gdW5pY29kZSgnXHg4MGFiYycsIGVycm9ycz0naWdub3JlJykKLSAgICB1J2FiYycKLQotRW5jb2RpbmdzIGFyZSBzcGVjaWZpZWQgYXMgc3RyaW5ncyBjb250YWluaW5nIHRoZSBlbmNvZGluZydzIG5hbWUuCi1QeXRob24gMi40IGNvbWVzIHdpdGggcm91Z2hseSAxMDAgZGlmZmVyZW50IGVuY29kaW5nczsgc2VlIHRoZSBQeXRob24KLUxpYnJhcnkgUmVmZXJlbmNlIGF0Ci08aHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWIvc3RhbmRhcmQtZW5jb2RpbmdzLmh0bWw+IGZvciBhIGxpc3QuICBTb21lCi1lbmNvZGluZ3MgaGF2ZSBtdWx0aXBsZSBuYW1lczsgZm9yIGV4YW1wbGUsICdsYXRpbi0xJywgJ2lzb184ODU5XzEnCi1hbmQgJzg4NTknIGFyZSBhbGwgc3lub255bXMgZm9yIHRoZSBzYW1lIGVuY29kaW5nLgotCi1PbmUtY2hhcmFjdGVyIFVuaWNvZGUgc3RyaW5ncyBjYW4gYWxzbyBiZSBjcmVhdGVkIHdpdGggdGhlCi1gYHVuaWNocigpYGAgYnVpbHQtaW4gZnVuY3Rpb24sIHdoaWNoIHRha2VzIGludGVnZXJzIGFuZCByZXR1cm5zIGEKLVVuaWNvZGUgc3RyaW5nIG9mIGxlbmd0aCAxIHRoYXQgY29udGFpbnMgdGhlIGNvcnJlc3BvbmRpbmcgY29kZSBwb2ludC4KLVRoZSByZXZlcnNlIG9wZXJhdGlvbiBpcyB0aGUgYnVpbHQtaW4gYG9yZCgpYCBmdW5jdGlvbiB0aGF0IHRha2VzIGEKLW9uZS1jaGFyYWN0ZXIgVW5pY29kZSBzdHJpbmcgYW5kIHJldHVybnMgdGhlIGNvZGUgcG9pbnQgdmFsdWU6OgotCi0gICAgPj4+IHVuaWNocig0MDk2MCkKLSAgICB1J1x1YTAwMCcKLSAgICA+Pj4gb3JkKHUnXHVhMDAwJykKLSAgICA0MDk2MAotCi1JbnN0YW5jZXMgb2YgdGhlIGBgdW5pY29kZWBgIHR5cGUgaGF2ZSBtYW55IG9mIHRoZSBzYW1lIG1ldGhvZHMgYXMgCi10aGUgOC1iaXQgc3RyaW5nIHR5cGUgZm9yIG9wZXJhdGlvbnMgc3VjaCBhcyBzZWFyY2hpbmcgYW5kIGZvcm1hdHRpbmc6OgotCi0gICAgPj4+IHMgPSB1J1dhcyBldmVyIGZlYXRoZXIgc28gbGlnaHRseSBibG93biB0byBhbmQgZnJvIGFzIHRoaXMgbXVsdGl0dWRlPycKLSAgICA+Pj4gcy5jb3VudCgnZScpCi0gICAgNQotICAgID4+PiBzLmZpbmQoJ2ZlYXRoZXInKQotICAgIDkKLSAgICA+Pj4gcy5maW5kKCdiaXJkJykKLSAgICAtMQotICAgID4+PiBzLnJlcGxhY2UoJ2ZlYXRoZXInLCAnc2FuZCcpCi0gICAgdSdXYXMgZXZlciBzYW5kIHNvIGxpZ2h0bHkgYmxvd24gdG8gYW5kIGZybyBhcyB0aGlzIG11bHRpdHVkZT8nCi0gICAgPj4+IHMudXBwZXIoKQotICAgIHUnV0FTIEVWRVIgRkVBVEhFUiBTTyBMSUdIVExZIEJMT1dOIFRPIEFORCBGUk8gQVMgVEhJUyBNVUxUSVRVREU/JwotCi1Ob3RlIHRoYXQgdGhlIGFyZ3VtZW50cyB0byB0aGVzZSBtZXRob2RzIGNhbiBiZSBVbmljb2RlIHN0cmluZ3Mgb3IgOC1iaXQgc3RyaW5ncy4gIAotOC1iaXQgc3RyaW5ncyB3aWxsIGJlIGNvbnZlcnRlZCB0byBVbmljb2RlIGJlZm9yZSBjYXJyeWluZyBvdXQgdGhlIG9wZXJhdGlvbjsKLVB5dGhvbidzIGRlZmF1bHQgQVNDSUkgZW5jb2Rpbmcgd2lsbCBiZSB1c2VkLCBzbyBjaGFyYWN0ZXJzIGdyZWF0ZXIgdGhhbiAxMjcgd2lsbCBjYXVzZSBhbiBleGNlcHRpb246OgotCi0gICAgPj4+IHMuZmluZCgnV2FzXHg5ZicpCi0gICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwotICAgIFVuaWNvZGVEZWNvZGVFcnJvcjogJ2FzY2lpJyBjb2RlYyBjYW4ndCBkZWNvZGUgYnl0ZSAweDlmIGluIHBvc2l0aW9uIDM6IG9yZGluYWwgbm90IGluIHJhbmdlKDEyOCkKLSAgICA+Pj4gcy5maW5kKHUnV2FzXHg5ZicpCi0gICAgLTEKLQotTXVjaCBQeXRob24gY29kZSB0aGF0IG9wZXJhdGVzIG9uIHN0cmluZ3Mgd2lsbCB0aGVyZWZvcmUgd29yayB3aXRoCi1Vbmljb2RlIHN0cmluZ3Mgd2l0aG91dCByZXF1aXJpbmcgYW55IGNoYW5nZXMgdG8gdGhlIGNvZGUuICAoSW5wdXQgYW5kCi1vdXRwdXQgY29kZSBuZWVkcyBtb3JlIHVwZGF0aW5nIGZvciBVbmljb2RlOyBtb3JlIG9uIHRoaXMgbGF0ZXIuKQotCi1Bbm90aGVyIGltcG9ydGFudCBtZXRob2QgaXMgYGAuZW5jb2RlKFtlbmNvZGluZ10sIFtlcnJvcnM9J3N0cmljdCddKWBgLCAKLXdoaWNoIHJldHVybnMgYW4gOC1iaXQgc3RyaW5nIHZlcnNpb24gb2YgdGhlCi1Vbmljb2RlIHN0cmluZywgZW5jb2RlZCBpbiB0aGUgcmVxdWVzdGVkIGVuY29kaW5nLiAgVGhlIGBgZXJyb3JzYGAKLXBhcmFtZXRlciBpcyB0aGUgc2FtZSBhcyB0aGUgcGFyYW1ldGVyIG9mIHRoZSBgYHVuaWNvZGUoKWBgCi1jb25zdHJ1Y3Rvciwgd2l0aCBvbmUgYWRkaXRpb25hbCBwb3NzaWJpbGl0eTsgYXMgd2VsbCBhcyAnc3RyaWN0JywKLSdpZ25vcmUnLCBhbmQgJ3JlcGxhY2UnLCB5b3UgY2FuIGFsc28gcGFzcyAneG1sY2hhcnJlZnJlcGxhY2UnIHdoaWNoCi11c2VzIFhNTCdzIGNoYXJhY3RlciByZWZlcmVuY2VzLiAgVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIHRoZQotZGlmZmVyZW50IHJlc3VsdHM6OgotCi0gICAgPj4+IHUgPSB1bmljaHIoNDA5NjApICsgdSdhYmNkJyArIHVuaWNocigxOTcyKQotICAgID4+PiB1LmVuY29kZSgndXRmLTgnKQotICAgICdceGVhXHg4MFx4ODBhYmNkXHhkZVx4YjQnCi0gICAgPj4+IHUuZW5jb2RlKCdhc2NpaScpCi0gICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwotICAgIFVuaWNvZGVFbmNvZGVFcnJvcjogJ2FzY2lpJyBjb2RlYyBjYW4ndCBlbmNvZGUgY2hhcmFjdGVyICdcdWEwMDAnIGluIHBvc2l0aW9uIDA6IG9yZGluYWwgbm90IGluIHJhbmdlKDEyOCkKLSAgICA+Pj4gdS5lbmNvZGUoJ2FzY2lpJywgJ2lnbm9yZScpCi0gICAgJ2FiY2QnCi0gICAgPj4+IHUuZW5jb2RlKCdhc2NpaScsICdyZXBsYWNlJykKLSAgICAnP2FiY2Q/JwotICAgID4+PiB1LmVuY29kZSgnYXNjaWknLCAneG1sY2hhcnJlZnJlcGxhY2UnKQotICAgICcmIzQwOTYwO2FiY2QmIzE5NzI7JwotCi1QeXRob24ncyA4LWJpdCBzdHJpbmdzIGhhdmUgYSBgYC5kZWNvZGUoW2VuY29kaW5nXSwgW2Vycm9yc10pYGAgbWV0aG9kIAotdGhhdCBpbnRlcnByZXRzIHRoZSBzdHJpbmcgdXNpbmcgdGhlIGdpdmVuIGVuY29kaW5nOjoKLQotICAgID4+PiB1ID0gdW5pY2hyKDQwOTYwKSArIHUnYWJjZCcgKyB1bmljaHIoMTk3MikgICAjIEFzc2VtYmxlIGEgc3RyaW5nCi0gICAgPj4+IHV0ZjhfdmVyc2lvbiA9IHUuZW5jb2RlKCd1dGYtOCcpICAgICAgICAgICAgICMgRW5jb2RlIGFzIFVURi04Ci0gICAgPj4+IHR5cGUodXRmOF92ZXJzaW9uKSwgdXRmOF92ZXJzaW9uCi0gICAgKDx0eXBlICdzdHInPiwgJ1x4ZWFceDgwXHg4MGFiY2RceGRlXHhiNCcpCi0gICAgPj4+IHUyID0gdXRmOF92ZXJzaW9uLmRlY29kZSgndXRmLTgnKSAgICAgICAgICAgICMgRGVjb2RlIHVzaW5nIFVURi04Ci0gICAgPj4+IHUgPT0gdTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIHR3byBzdHJpbmdzIG1hdGNoCi0gICAgVHJ1ZQotIAotVGhlIGxvdy1sZXZlbCByb3V0aW5lcyBmb3IgcmVnaXN0ZXJpbmcgYW5kIGFjY2Vzc2luZyB0aGUgYXZhaWxhYmxlCi1lbmNvZGluZ3MgYXJlIGZvdW5kIGluIHRoZSBgYGNvZGVjc2BgIG1vZHVsZS4gIEhvd2V2ZXIsIHRoZSBlbmNvZGluZwotYW5kIGRlY29kaW5nIGZ1bmN0aW9ucyByZXR1cm5lZCBieSB0aGlzIG1vZHVsZSBhcmUgdXN1YWxseSBtb3JlCi1sb3ctbGV2ZWwgdGhhbiBpcyBjb21mb3J0YWJsZSwgc28gSSdtIG5vdCBnb2luZyB0byBkZXNjcmliZSB0aGUKLWBgY29kZWNzYGAgbW9kdWxlIGhlcmUuICBJZiB5b3UgbmVlZCB0byBpbXBsZW1lbnQgYSBjb21wbGV0ZWx5IG5ldwotZW5jb2RpbmcsIHlvdSdsbCBuZWVkIHRvIGxlYXJuIGFib3V0IHRoZSBgYGNvZGVjc2BgIG1vZHVsZSBpbnRlcmZhY2VzLAotYnV0IGltcGxlbWVudGluZyBlbmNvZGluZ3MgaXMgYSBzcGVjaWFsaXplZCB0YXNrIHRoYXQgYWxzbyB3b24ndCBiZQotY292ZXJlZCBoZXJlLiAgQ29uc3VsdCB0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24gdG8gbGVhcm4gbW9yZSBhYm91dAotdGhpcyBtb2R1bGUuCi0KLVRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgcGFydCBvZiB0aGUgYGBjb2RlY3NgYCBtb2R1bGUgaXMgdGhlIAotYGBjb2RlY3Mub3BlbigpYGAgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSBkaXNjdXNzZWQgaW4gdGhlIHNlY3Rpb24KLW9uIGlucHV0IGFuZCBvdXRwdXQuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotVW5pY29kZSBMaXRlcmFscyBpbiBQeXRob24gU291cmNlIENvZGUKLScnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJwotCi1JbiBQeXRob24gc291cmNlIGNvZGUsIFVuaWNvZGUgbGl0ZXJhbHMgYXJlIHdyaXR0ZW4gYXMgc3RyaW5ncwotcHJlZml4ZWQgd2l0aCB0aGUgJ3UnIG9yICdVJyBjaGFyYWN0ZXI6IGBgdSdhYmNkZWZnaGlqaydgYC4gIFNwZWNpZmljCi1jb2RlIHBvaW50cyBjYW4gYmUgd3JpdHRlbiB1c2luZyB0aGUgYGBcdWBgIGVzY2FwZSBzZXF1ZW5jZSwgd2hpY2ggaXMKLWZvbGxvd2VkIGJ5IGZvdXIgaGV4IGRpZ2l0cyBnaXZpbmcgdGhlIGNvZGUgcG9pbnQuICBUaGUgYGBcVWBgIGVzY2FwZQotc2VxdWVuY2UgaXMgc2ltaWxhciwgYnV0IGV4cGVjdHMgOCBoZXggZGlnaXRzLCBub3QgNC4gIAotCi1Vbmljb2RlIGxpdGVyYWxzIGNhbiBhbHNvIHVzZSB0aGUgc2FtZSBlc2NhcGUgc2VxdWVuY2VzIGFzIDgtYml0Ci1zdHJpbmdzLCBpbmNsdWRpbmcgYGBceGBgLCBidXQgYGBceGBgIG9ubHkgdGFrZXMgdHdvIGhleCBkaWdpdHMgc28gaXQKLWNhbid0IGV4cHJlc3MgYW4gYXJiaXRyYXJ5IGNvZGUgcG9pbnQuICBPY3RhbCBlc2NhcGVzIGNhbiBnbyB1cCB0bwotVSswMWZmLCB3aGljaCBpcyBvY3RhbCA3NzcuCi0KLTo6Ci0KLSAgICA+Pj4gcyA9IHUiYVx4YWNcdTEyMzRcdTIwYWNcVTAwMDA4MDAwIgotICAgICAgICAgICAgICAgXl5eXiB0d28tZGlnaXQgaGV4IGVzY2FwZQotICAgICAgICAgICAgICAgICAgIF5eXl5eXiBmb3VyLWRpZ2l0IFVuaWNvZGUgZXNjYXBlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl4gZWlnaHQtZGlnaXQgVW5pY29kZSBlc2NhcGUKLSAgICA+Pj4gZm9yIGMgaW4gczogIHByaW50IG9yZChjKSwKLSAgICAuLi4gCi0gICAgOTcgMTcyIDQ2NjAgODM2NCAzMjc2OAotCi1Vc2luZyBlc2NhcGUgc2VxdWVuY2VzIGZvciBjb2RlIHBvaW50cyBncmVhdGVyIHRoYW4gMTI3IGlzIGZpbmUgaW4KLXNtYWxsIGRvc2VzLCBidXQgYmVjb21lcyBhbiBhbm5veWFuY2UgaWYgeW91J3JlIHVzaW5nIG1hbnkgYWNjZW50ZWQKLWNoYXJhY3RlcnMsIGFzIHlvdSB3b3VsZCBpbiBhIHByb2dyYW0gd2l0aCBtZXNzYWdlcyBpbiBGcmVuY2ggb3Igc29tZQotb3RoZXIgYWNjZW50LXVzaW5nIGxhbmd1YWdlLiAgWW91IGNhbiBhbHNvIGFzc2VtYmxlIHN0cmluZ3MgdXNpbmcgdGhlCi1gYHVuaWNocigpYGAgYnVpbHQtaW4gZnVuY3Rpb24sIGJ1dCB0aGlzIGlzIGV2ZW4gbW9yZSB0ZWRpb3VzLgotCi1JZGVhbGx5LCB5b3UnZCB3YW50IHRvIGJlIGFibGUgdG8gd3JpdGUgbGl0ZXJhbHMgaW4geW91ciBsYW5ndWFnZSdzCi1uYXR1cmFsIGVuY29kaW5nLiAgWW91IGNvdWxkIHRoZW4gZWRpdCBQeXRob24gc291cmNlIGNvZGUgd2l0aCB5b3VyCi1mYXZvcml0ZSBlZGl0b3Igd2hpY2ggd291bGQgZGlzcGxheSB0aGUgYWNjZW50ZWQgY2hhcmFjdGVycyBuYXR1cmFsbHksCi1hbmQgaGF2ZSB0aGUgcmlnaHQgY2hhcmFjdGVycyB1c2VkIGF0IHJ1bnRpbWUuCi0KLVB5dGhvbiBzdXBwb3J0cyB3cml0aW5nIFVuaWNvZGUgbGl0ZXJhbHMgaW4gYW55IGVuY29kaW5nLCBidXQgeW91IGhhdmUKLXRvIGRlY2xhcmUgdGhlIGVuY29kaW5nIGJlaW5nIHVzZWQuICBUaGlzIGlzIGRvbmUgYnkgaW5jbHVkaW5nIGEKLXNwZWNpYWwgY29tbWVudCBhcyBlaXRoZXIgdGhlIGZpcnN0IG9yIHNlY29uZCBsaW5lIG9mIHRoZSBzb3VyY2UKLWZpbGU6OgotCi0gICAgIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0gICAgIyAtKi0gY29kaW5nOiBsYXRpbi0xIC0qLQotICAgIAotICAgIHUgPSB1J2FiY2TDqScKLSAgICBwcmludCBvcmQodVstMV0pCi0gICAgCi1UaGUgc3ludGF4IGlzIGluc3BpcmVkIGJ5IEVtYWNzJ3Mgbm90YXRpb24gZm9yIHNwZWNpZnlpbmcgdmFyaWFibGVzIGxvY2FsIHRvIGEgZmlsZS4KLUVtYWNzIHN1cHBvcnRzIG1hbnkgZGlmZmVyZW50IHZhcmlhYmxlcywgYnV0IFB5dGhvbiBvbmx5IHN1cHBvcnRzICdjb2RpbmcnLiAgCi1UaGUgYGAtKi1gYCBzeW1ib2xzIGluZGljYXRlIHRoYXQgdGhlIGNvbW1lbnQgaXMgc3BlY2lhbDsgd2l0aGluIHRoZW0sCi15b3UgbXVzdCBzdXBwbHkgdGhlIG5hbWUgYGBjb2RpbmdgYCBhbmQgdGhlIG5hbWUgb2YgeW91ciBjaG9zZW4gZW5jb2RpbmcsIAotc2VwYXJhdGVkIGJ5IGBgJzonYGAuICAKLQotSWYgeW91IGRvbid0IGluY2x1ZGUgc3VjaCBhIGNvbW1lbnQsIHRoZSBkZWZhdWx0IGVuY29kaW5nIHVzZWQgd2lsbCBiZQotQVNDSUkuICBWZXJzaW9ucyBvZiBQeXRob24gYmVmb3JlIDIuNCB3ZXJlIEV1cm8tY2VudHJpYyBhbmQgYXNzdW1lZAotTGF0aW4tMSBhcyBhIGRlZmF1bHQgZW5jb2RpbmcgZm9yIHN0cmluZyBsaXRlcmFsczsgaW4gUHl0aG9uIDIuNCwKLWNoYXJhY3RlcnMgZ3JlYXRlciB0aGFuIDEyNyBzdGlsbCB3b3JrIGJ1dCByZXN1bHQgaW4gYSB3YXJuaW5nLiAgRm9yCi1leGFtcGxlLCB0aGUgZm9sbG93aW5nIHByb2dyYW0gaGFzIG5vIGVuY29kaW5nIGRlY2xhcmF0aW9uOjoKLQotICAgICMhL3Vzci9iaW4vZW52IHB5dGhvbgotICAgIHUgPSB1J2FiY2TDqScKLSAgICBwcmludCBvcmQodVstMV0pCi0KLVdoZW4geW91IHJ1biBpdCB3aXRoIFB5dGhvbiAyLjQsIGl0IHdpbGwgb3V0cHV0IHRoZSBmb2xsb3dpbmcgd2FybmluZzo6Ci0KLSAgICBhbWs6fiQgcHl0aG9uIHAyNjMucHkKLSAgICBzeXM6MTogRGVwcmVjYXRpb25XYXJuaW5nOiBOb24tQVNDSUkgY2hhcmFjdGVyICdceGU5JyAKLSAgICAgICAgIGluIGZpbGUgcDI2My5weSBvbiBsaW5lIDIsIGJ1dCBubyBlbmNvZGluZyBkZWNsYXJlZDsgCi0gICAgICAgICBzZWUgaHR0cDovL3d3dy5weXRob24ub3JnL3BlcHMvcGVwLTAyNjMuaHRtbCBmb3IgZGV0YWlscwotICAKLQotVW5pY29kZSBQcm9wZXJ0aWVzCi0nJycnJycnJycnJycnJycnJycnCi0KLVRoZSBVbmljb2RlIHNwZWNpZmljYXRpb24gaW5jbHVkZXMgYSBkYXRhYmFzZSBvZiBpbmZvcm1hdGlvbiBhYm91dAotY29kZSBwb2ludHMuICBGb3IgZWFjaCBjb2RlIHBvaW50IHRoYXQncyBkZWZpbmVkLCB0aGUgaW5mb3JtYXRpb24KLWluY2x1ZGVzIHRoZSBjaGFyYWN0ZXIncyBuYW1lLCBpdHMgY2F0ZWdvcnksIHRoZSBudW1lcmljIHZhbHVlIGlmCi1hcHBsaWNhYmxlIChVbmljb2RlIGhhcyBjaGFyYWN0ZXJzIHJlcHJlc2VudGluZyB0aGUgUm9tYW4gbnVtZXJhbHMgYW5kCi1mcmFjdGlvbnMgc3VjaCBhcyBvbmUtdGhpcmQgYW5kIGZvdXItZmlmdGhzKS4gIFRoZXJlIGFyZSBhbHNvCi1wcm9wZXJ0aWVzIHJlbGF0ZWQgdG8gdGhlIGNvZGUgcG9pbnQncyB1c2UgaW4gYmlkaXJlY3Rpb25hbCB0ZXh0IGFuZAotb3RoZXIgZGlzcGxheS1yZWxhdGVkIHByb3BlcnRpZXMuCi0KLVRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBkaXNwbGF5cyBzb21lIGluZm9ybWF0aW9uIGFib3V0IHNldmVyYWwKLWNoYXJhY3RlcnMsIGFuZCBwcmludHMgdGhlIG51bWVyaWMgdmFsdWUgb2Ygb25lIHBhcnRpY3VsYXIgY2hhcmFjdGVyOjoKLQotICAgIGltcG9ydCB1bmljb2RlZGF0YQotICAgIAotICAgIHUgPSB1bmljaHIoMjMzKSArIHVuaWNocigweDBiZjIpICsgdW5pY2hyKDM5NzIpICsgdW5pY2hyKDYwMDApICsgdW5pY2hyKDEzMjMxKQotICAgIAotICAgIGZvciBpLCBjIGluIGVudW1lcmF0ZSh1KToKLSAgICAgICAgcHJpbnQgaSwgJyUwNHgnICUgb3JkKGMpLCB1bmljb2RlZGF0YS5jYXRlZ29yeShjKSwKLSAgICAgICAgcHJpbnQgdW5pY29kZWRhdGEubmFtZShjKQotICAgIAotICAgICMgR2V0IG51bWVyaWMgdmFsdWUgb2Ygc2Vjb25kIGNoYXJhY3RlcgotICAgIHByaW50IHVuaWNvZGVkYXRhLm51bWVyaWModVsxXSkKLQotV2hlbiBydW4sIHRoaXMgcHJpbnRzOjoKLQotICAgIDAgMDBlOSBMbCBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCi0gICAgMSAwYmYyIE5vIFRBTUlMIE5VTUJFUiBPTkUgVEhPVVNBTkQKLSAgICAyIDBmODQgTW4gVElCRVRBTiBNQVJLIEhBTEFOVEEKLSAgICAzIDE3NzAgTG8gVEFHQkFOV0EgTEVUVEVSIFNBCi0gICAgNCAzM2FmIFNvIFNRVUFSRSBSQUQgT1ZFUiBTIFNRVUFSRUQKLSAgICAxMDAwLjAKLQotVGhlIGNhdGVnb3J5IGNvZGVzIGFyZSBhYmJyZXZpYXRpb25zIGRlc2NyaWJpbmcgdGhlIG5hdHVyZSBvZiB0aGUKLWNoYXJhY3Rlci4gIFRoZXNlIGFyZSBncm91cGVkIGludG8gY2F0ZWdvcmllcyBzdWNoIGFzICJMZXR0ZXIiLAotIk51bWJlciIsICJQdW5jdHVhdGlvbiIsIG9yICJTeW1ib2wiLCB3aGljaCBpbiB0dXJuIGFyZSBicm9rZW4gdXAgaW50bwotc3ViY2F0ZWdvcmllcy4gIFRvIHRha2UgdGhlIGNvZGVzIGZyb20gdGhlIGFib3ZlIG91dHB1dCwgYGAnTGwnYGAKLW1lYW5zICdMZXR0ZXIsIGxvd2VyY2FzZScsIGBgJ05vJ2BgIG1lYW5zICJOdW1iZXIsIG90aGVyIiwgYGAnTW4nYGAgaXMKLSJNYXJrLCBub25zcGFjaW5nIiwgYW5kIGBgJ1NvJ2BgIGlzICJTeW1ib2wsIG90aGVyIi4gIFNlZQotPGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljL1VOSURBVEEvVUNELmh0bWwjR2VuZXJhbF9DYXRlZ29yeV9WYWx1ZXM+Ci1mb3IgYSBsaXN0IG9mIGNhdGVnb3J5IGNvZGVzLgotCi1SZWZlcmVuY2VzCi0nJycnJycnJycnJycnJwotCi1UaGUgVW5pY29kZSBhbmQgOC1iaXQgc3RyaW5nIHR5cGVzIGFyZSBkZXNjcmliZWQgaW4gdGhlIFB5dGhvbiBsaWJyYXJ5Ci1yZWZlcmVuY2UgYXQgPGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvbGliL3R5cGVzc2VxLmh0bWw+LgotCi1UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGBgdW5pY29kZWRhdGFgYCBtb2R1bGUgaXMgYXQgCi08aHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWIvbW9kdWxlLXVuaWNvZGVkYXRhLmh0bWw+LgotCi1UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGBgY29kZWNzYGAgbW9kdWxlIGlzIGF0Ci08aHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWIvbW9kdWxlLWNvZGVjcy5odG1sPi4KLQotTWFyYy1BbmRyw6kgTGVtYnVyZyBnYXZlIGEgcHJlc2VudGF0aW9uIGF0IEV1cm9QeXRob24gMjAwMgotdGl0bGVkICJQeXRob24gYW5kIFVuaWNvZGUiLiAgQSBQREYgdmVyc2lvbiBvZiBoaXMgc2xpZGVzCi1pcyBhdmFpbGFibGUgYXQgPGh0dHA6Ly93d3cuZWdlbml4LmNvbS9maWxlcy9weXRob24vVW5pY29kZS1FUEMyMDAyLVRhbGsucGRmPiwKLWFuZCBpcyBhbiBleGNlbGxlbnQgb3ZlcnZpZXcgb2YgdGhlIGRlc2lnbiBvZiBQeXRob24ncyBVbmljb2RlIGZlYXR1cmVzLgotCi0KLVJlYWRpbmcgYW5kIFdyaXRpbmcgVW5pY29kZSBEYXRhCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU9uY2UgeW91J3ZlIHdyaXR0ZW4gc29tZSBjb2RlIHRoYXQgd29ya3Mgd2l0aCBVbmljb2RlIGRhdGEsIHRoZSBuZXh0Ci1wcm9ibGVtIGlzIGlucHV0L291dHB1dC4gIEhvdyBkbyB5b3UgZ2V0IFVuaWNvZGUgc3RyaW5ncyBpbnRvIHlvdXIKLXByb2dyYW0sIGFuZCBob3cgZG8geW91IGNvbnZlcnQgVW5pY29kZSBpbnRvIGEgZm9ybSBzdWl0YWJsZSBmb3IKLXN0b3JhZ2Ugb3IgdHJhbnNtaXNzaW9uPyAgCi0KLUl0J3MgcG9zc2libGUgdGhhdCB5b3UgbWF5IG5vdCBuZWVkIHRvIGRvIGFueXRoaW5nIGRlcGVuZGluZyBvbiB5b3VyCi1pbnB1dCBzb3VyY2VzIGFuZCBvdXRwdXQgZGVzdGluYXRpb25zOyB5b3Ugc2hvdWxkIGNoZWNrIHdoZXRoZXIgdGhlCi1saWJyYXJpZXMgdXNlZCBpbiB5b3VyIGFwcGxpY2F0aW9uIHN1cHBvcnQgVW5pY29kZSBuYXRpdmVseS4gIFhNTAotcGFyc2VycyBvZnRlbiByZXR1cm4gVW5pY29kZSBkYXRhLCBmb3IgZXhhbXBsZS4gIE1hbnkgcmVsYXRpb25hbAotZGF0YWJhc2VzIGFsc28gc3VwcG9ydCBVbmljb2RlLXZhbHVlZCBjb2x1bW5zIGFuZCBjYW4gcmV0dXJuIFVuaWNvZGUKLXZhbHVlcyBmcm9tIGFuIFNRTCBxdWVyeS4KLQotVW5pY29kZSBkYXRhIGlzIHVzdWFsbHkgY29udmVydGVkIHRvIGEgcGFydGljdWxhciBlbmNvZGluZyBiZWZvcmUgaXQKLWdldHMgd3JpdHRlbiB0byBkaXNrIG9yIHNlbnQgb3ZlciBhIHNvY2tldC4gIEl0J3MgcG9zc2libGUgdG8gZG8gYWxsCi10aGUgd29yayB5b3Vyc2VsZjogb3BlbiBhIGZpbGUsIHJlYWQgYW4gOC1iaXQgc3RyaW5nIGZyb20gaXQsIGFuZAotY29udmVydCB0aGUgc3RyaW5nIHdpdGggYGB1bmljb2RlKHN0ciwgZW5jb2RpbmcpYGAuICBIb3dldmVyLCB0aGUKLW1hbnVhbCBhcHByb2FjaCBpcyBub3QgcmVjb21tZW5kZWQuCi0KLU9uZSBwcm9ibGVtIGlzIHRoZSBtdWx0aS1ieXRlIG5hdHVyZSBvZiBlbmNvZGluZ3M7IG9uZSBVbmljb2RlCi1jaGFyYWN0ZXIgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IHNldmVyYWwgYnl0ZXMuICBJZiB5b3Ugd2FudCB0byByZWFkCi10aGUgZmlsZSBpbiBhcmJpdHJhcnktc2l6ZWQgY2h1bmtzIChzYXksIDFLIG9yIDRLKSwgeW91IG5lZWQgdG8gd3JpdGUKLWVycm9yLWhhbmRsaW5nIGNvZGUgdG8gY2F0Y2ggdGhlIGNhc2Ugd2hlcmUgb25seSBwYXJ0IG9mIHRoZSBieXRlcwotZW5jb2RpbmcgYSBzaW5nbGUgVW5pY29kZSBjaGFyYWN0ZXIgYXJlIHJlYWQgYXQgdGhlIGVuZCBvZiBhIGNodW5rLgotT25lIHNvbHV0aW9uIHdvdWxkIGJlIHRvIHJlYWQgdGhlIGVudGlyZSBmaWxlIGludG8gbWVtb3J5IGFuZCB0aGVuCi1wZXJmb3JtIHRoZSBkZWNvZGluZywgYnV0IHRoYXQgcHJldmVudHMgeW91IGZyb20gd29ya2luZyB3aXRoIGZpbGVzCi10aGF0IGFyZSBleHRyZW1lbHkgbGFyZ2U7IGlmIHlvdSBuZWVkIHRvIHJlYWQgYSAyR2IgZmlsZSwgeW91IG5lZWQgMkdiCi1vZiBSQU0uICAoTW9yZSwgcmVhbGx5LCBzaW5jZSBmb3IgYXQgbGVhc3QgYSBtb21lbnQgeW91J2QgbmVlZCB0byBoYXZlIAotYm90aCB0aGUgZW5jb2RlZCBzdHJpbmcgYW5kIGl0cyBVbmljb2RlIHZlcnNpb24gaW4gbWVtb3J5LikKLQotVGhlIHNvbHV0aW9uIHdvdWxkIGJlIHRvIHVzZSB0aGUgbG93LWxldmVsIGRlY29kaW5nIGludGVyZmFjZSB0byBjYXRjaAotdGhlIGNhc2Ugb2YgcGFydGlhbCBjb2Rpbmcgc2VxdWVuY2VzLiAgIFRoZSB3b3JrIG9mIGltcGxlbWVudGluZyB0aGlzCi1oYXMgYWxyZWFkeSBiZWVuIGRvbmUgZm9yIHlvdTogdGhlIGBgY29kZWNzYGAgbW9kdWxlIGluY2x1ZGVzIGEKLXZlcnNpb24gb2YgdGhlIGBgb3BlbigpYGAgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgZmlsZS1saWtlIG9iamVjdAotdGhhdCBhc3N1bWVzIHRoZSBmaWxlJ3MgY29udGVudHMgYXJlIGluIGEgc3BlY2lmaWVkIGVuY29kaW5nIGFuZAotYWNjZXB0cyBVbmljb2RlIHBhcmFtZXRlcnMgZm9yIG1ldGhvZHMgc3VjaCBhcyBgYC5yZWFkKClgYCBhbmQKLWBgLndyaXRlKClgYC4KLQotVGhlIGZ1bmN0aW9uJ3MgcGFyYW1ldGVycyBhcmUgCi1gYG9wZW4oZmlsZW5hbWUsIG1vZGU9J3JiJywgZW5jb2Rpbmc9Tm9uZSwgZXJyb3JzPSdzdHJpY3QnLCBidWZmZXJpbmc9MSlgYC4gIGBgbW9kZWBgIGNhbiBiZQotYGAncidgYCwgYGAndydgYCwgb3IgYGAnYSdgYCwganVzdCBsaWtlIHRoZSBjb3JyZXNwb25kaW5nIHBhcmFtZXRlciB0byB0aGUKLXJlZ3VsYXIgYnVpbHQtaW4gYGBvcGVuKClgYCBmdW5jdGlvbjsgYWRkIGEgYGAnKydgYCB0byAKLXVwZGF0ZSB0aGUgZmlsZS4gIGBgYnVmZmVyaW5nYGAgaXMgc2ltaWxhcmx5Ci1wYXJhbGxlbCB0byB0aGUgc3RhbmRhcmQgZnVuY3Rpb24ncyBwYXJhbWV0ZXIuICAKLWBgZW5jb2RpbmdgYCBpcyBhIHN0cmluZyBnaXZpbmcgCi10aGUgZW5jb2RpbmcgdG8gdXNlOyBpZiBpdCdzIGxlZnQgYXMgYGBOb25lYGAsIGEgcmVndWxhciBQeXRob24gZmlsZQotb2JqZWN0IHRoYXQgYWNjZXB0cyA4LWJpdCBzdHJpbmdzIGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlLCBhIHdyYXBwZXIKLW9iamVjdCBpcyByZXR1cm5lZCwgYW5kIGRhdGEgd3JpdHRlbiB0byBvciByZWFkIGZyb20gdGhlIHdyYXBwZXIKLW9iamVjdCB3aWxsIGJlIGNvbnZlcnRlZCBhcyBuZWVkZWQuICBgYGVycm9yc2BgIHNwZWNpZmllcyB0aGUgYWN0aW9uCi1mb3IgZW5jb2RpbmcgZXJyb3JzIGFuZCBjYW4gYmUgb25lIG9mIHRoZSB1c3VhbCB2YWx1ZXMgb2YgJ3N0cmljdCcsCi0naWdub3JlJywgYW5kICdyZXBsYWNlJy4KLQotUmVhZGluZyBVbmljb2RlIGZyb20gYSBmaWxlIGlzIHRoZXJlZm9yZSBzaW1wbGU6OgotCi0gICAgaW1wb3J0IGNvZGVjcwotICAgIGYgPSBjb2RlY3Mub3BlbigndW5pY29kZS5yc3QnLCBlbmNvZGluZz0ndXRmLTgnKQotICAgIGZvciBsaW5lIGluIGY6Ci0gICAgICAgIHByaW50IHJlcHIobGluZSkKLQotSXQncyBhbHNvIHBvc3NpYmxlIHRvIG9wZW4gZmlsZXMgaW4gdXBkYXRlIG1vZGUsIAotYWxsb3dpbmcgYm90aCByZWFkaW5nIGFuZCB3cml0aW5nOjoKLQotICAgIGYgPSBjb2RlY3Mub3BlbigndGVzdCcsIGVuY29kaW5nPSd1dGYtOCcsIG1vZGU9J3crJykKLSAgICBmLndyaXRlKHUnXHU0NTAwIGJsYWggYmxhaCBibGFoXG4nKQotICAgIGYuc2VlaygwKQotICAgIHByaW50IHJlcHIoZi5yZWFkbGluZSgpWzoxXSkKLSAgICBmLmNsb3NlKCkKLQotVW5pY29kZSBjaGFyYWN0ZXIgVStGRUZGIGlzIHVzZWQgYXMgYSBieXRlLW9yZGVyIG1hcmsgKEJPTSksIAotYW5kIGlzIG9mdGVuIHdyaXR0ZW4gYXMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBhIGZpbGUgaW4gb3JkZXIKLXRvIGFzc2lzdCB3aXRoIGF1dG9kZXRlY3Rpb24gb2YgdGhlIGZpbGUncyBieXRlIG9yZGVyaW5nLgotU29tZSBlbmNvZGluZ3MsIHN1Y2ggYXMgVVRGLTE2LCBleHBlY3QgYSBCT00gdG8gYmUgcHJlc2VudCBhdCAKLXRoZSBzdGFydCBvZiBhIGZpbGU7IHdoZW4gc3VjaCBhbiBlbmNvZGluZyBpcyB1c2VkLAotdGhlIEJPTSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgd3JpdHRlbiBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyIAotYW5kIHdpbGwgYmUgc2lsZW50bHkgZHJvcHBlZCB3aGVuIHRoZSBmaWxlIGlzIHJlYWQuICBUaGVyZSBhcmUgCi12YXJpYW50cyBvZiB0aGVzZSBlbmNvZGluZ3MsIHN1Y2ggYXMgJ3V0Zi0xNi1sZScgYW5kICd1dGYtMTYtYmUnCi1mb3IgbGl0dGxlLWVuZGlhbiBhbmQgYmlnLWVuZGlhbiBlbmNvZGluZ3MsIHRoYXQgc3BlY2lmeSAKLW9uZSBwYXJ0aWN1bGFyIGJ5dGUgb3JkZXJpbmcgYW5kIGRvbid0Ci1za2lwIHRoZSBCT00uCi0KLQotVW5pY29kZSBmaWxlbmFtZXMKLScnJycnJycnJycnJycnJycnJycnJycnJycKLQotTW9zdCBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbXMgaW4gY29tbW9uIHVzZSB0b2RheSBzdXBwb3J0IGZpbGVuYW1lcwotdGhhdCBjb250YWluIGFyYml0cmFyeSBVbmljb2RlIGNoYXJhY3RlcnMuICBVc3VhbGx5IHRoaXMgaXMKLWltcGxlbWVudGVkIGJ5IGNvbnZlcnRpbmcgdGhlIFVuaWNvZGUgc3RyaW5nIGludG8gc29tZSBlbmNvZGluZyB0aGF0Ci12YXJpZXMgZGVwZW5kaW5nIG9uIHRoZSBzeXN0ZW0uICBGb3IgZXhhbXBsZSwgTWFjT1MgWCB1c2VzIFVURi04IHdoaWxlCi1XaW5kb3dzIHVzZXMgYSBjb25maWd1cmFibGUgZW5jb2Rpbmc7IG9uIFdpbmRvd3MsIFB5dGhvbiB1c2VzIHRoZSBuYW1lCi0ibWJjcyIgdG8gcmVmZXIgdG8gd2hhdGV2ZXIgdGhlIGN1cnJlbnRseSBjb25maWd1cmVkIGVuY29kaW5nIGlzLiAgT24KLVVuaXggc3lzdGVtcywgdGhlcmUgd2lsbCBvbmx5IGJlIGEgZmlsZXN5c3RlbSBlbmNvZGluZyBpZiB5b3UndmUgc2V0Ci10aGUgYGBMQU5HYGAgb3IgYGBMQ19DVFlQRWBgIGVudmlyb25tZW50IHZhcmlhYmxlczsgaWYgeW91IGhhdmVuJ3QsCi10aGUgZGVmYXVsdCBlbmNvZGluZyBpcyBBU0NJSS4KLQotVGhlIGBgc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpYGAgZnVuY3Rpb24gcmV0dXJucyB0aGUgZW5jb2RpbmcgdG8KLXVzZSBvbiB5b3VyIGN1cnJlbnQgc3lzdGVtLCBpbiBjYXNlIHlvdSB3YW50IHRvIGRvIHRoZSBlbmNvZGluZwotbWFudWFsbHksIGJ1dCB0aGVyZSdzIG5vdCBtdWNoIHJlYXNvbiB0byBib3RoZXIuICBXaGVuIG9wZW5pbmcgYSBmaWxlCi1mb3IgcmVhZGluZyBvciB3cml0aW5nLCB5b3UgY2FuIHVzdWFsbHkganVzdCBwcm92aWRlIHRoZSBVbmljb2RlCi1zdHJpbmcgYXMgdGhlIGZpbGVuYW1lLCBhbmQgaXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byB0aGUKLXJpZ2h0IGVuY29kaW5nIGZvciB5b3U6OgotCi0gICAgZmlsZW5hbWUgPSB1J2ZpbGVuYW1lXHU0NTAwYWJjJwotICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAndycpCi0gICAgZi53cml0ZSgnYmxhaFxuJykKLSAgICBmLmNsb3NlKCkKLQotRnVuY3Rpb25zIGluIHRoZSBgYG9zYGAgbW9kdWxlIHN1Y2ggYXMgYGBvcy5zdGF0KClgYCB3aWxsIGFsc28gYWNjZXB0Ci1Vbmljb2RlIGZpbGVuYW1lcy4KLQotYGBvcy5saXN0ZGlyKClgYCwgd2hpY2ggcmV0dXJucyBmaWxlbmFtZXMsIHJhaXNlcyBhbiBpc3N1ZTogc2hvdWxkIGl0Ci1yZXR1cm4gdGhlIFVuaWNvZGUgdmVyc2lvbiBvZiBmaWxlbmFtZXMsIG9yIHNob3VsZCBpdCByZXR1cm4gOC1iaXQKLXN0cmluZ3MgY29udGFpbmluZyB0aGUgZW5jb2RlZCB2ZXJzaW9ucz8gIGBgb3MubGlzdGRpcigpYGAgd2lsbCBkbwotYm90aCwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgeW91IHByb3ZpZGVkIHRoZSBkaXJlY3RvcnkgcGF0aCBhcyBhbiA4LWJpdAotc3RyaW5nIG9yIGEgVW5pY29kZSBzdHJpbmcuICBJZiB5b3UgcGFzcyBhIFVuaWNvZGUgc3RyaW5nIGFzIHRoZSBwYXRoLAotZmlsZW5hbWVzIHdpbGwgYmUgZGVjb2RlZCB1c2luZyB0aGUgZmlsZXN5c3RlbSdzIGVuY29kaW5nIGFuZCBhIGxpc3QKLW9mIFVuaWNvZGUgc3RyaW5ncyB3aWxsIGJlIHJldHVybmVkLCB3aGlsZSBwYXNzaW5nIGFuIDgtYml0IHBhdGggd2lsbAotcmV0dXJuIHRoZSA4LWJpdCB2ZXJzaW9ucyBvZiB0aGUgZmlsZW5hbWVzLiAgRm9yIGV4YW1wbGUsIGFzc3VtaW5nIHRoZQotZGVmYXVsdCBmaWxlc3lzdGVtIGVuY29kaW5nIGlzIFVURi04LCBydW5uaW5nIHRoZSBmb2xsb3dpbmcgcHJvZ3JhbTo6Ci0KLQlmbiA9IHUnZmlsZW5hbWVcdTQ1MDBhYmMnCi0JZiA9IG9wZW4oZm4sICd3JykKLQlmLmNsb3NlKCkKLQotCWltcG9ydCBvcwotCXByaW50IG9zLmxpc3RkaXIoJy4nKQotCXByaW50IG9zLmxpc3RkaXIodScuJykKLQotd2lsbCBwcm9kdWNlIHRoZSBmb2xsb3dpbmcgb3V0cHV0OjoKLQotCWFtazp+JCBweXRob24gdC5weQotCVsnLnN2bicsICdmaWxlbmFtZVx4ZTRceDk0XHg4MGFiYycsIC4uLl0KLQlbdScuc3ZuJywgdSdmaWxlbmFtZVx1NDUwMGFiYycsIC4uLl0KLQotVGhlIGZpcnN0IGxpc3QgY29udGFpbnMgVVRGLTgtZW5jb2RlZCBmaWxlbmFtZXMsIGFuZCB0aGUgc2Vjb25kIGxpc3QKLWNvbnRhaW5zIHRoZSBVbmljb2RlIHZlcnNpb25zLgotCi0KLQkKLVRpcHMgZm9yIFdyaXRpbmcgVW5pY29kZS1hd2FyZSBQcm9ncmFtcwotJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycKLQotVGhpcyBzZWN0aW9uIHByb3ZpZGVzIHNvbWUgc3VnZ2VzdGlvbnMgb24gd3JpdGluZyBzb2Z0d2FyZSB0aGF0IAotZGVhbHMgd2l0aCBVbmljb2RlLgotCi1UaGUgbW9zdCBpbXBvcnRhbnQgdGlwIGlzOiAKLQotICAgIFNvZnR3YXJlIHNob3VsZCBvbmx5IHdvcmsgd2l0aCBVbmljb2RlIHN0cmluZ3MgaW50ZXJuYWxseSwgCi0gICAgY29udmVydGluZyB0byBhIHBhcnRpY3VsYXIgZW5jb2Rpbmcgb24gb3V0cHV0LiAgCi0KLUlmIHlvdSBhdHRlbXB0IHRvIHdyaXRlIHByb2Nlc3NpbmcgZnVuY3Rpb25zIHRoYXQgYWNjZXB0IGJvdGggCi1Vbmljb2RlIGFuZCA4LWJpdCBzdHJpbmdzLCB5b3Ugd2lsbCBmaW5kIHlvdXIgcHJvZ3JhbSB2dWxuZXJhYmxlIHRvIAotYnVncyB3aGVyZXZlciB5b3UgY29tYmluZSB0aGUgdHdvIGRpZmZlcmVudCBraW5kcyBvZiBzdHJpbmdzLiAgUHl0aG9uJ3MgCi1kZWZhdWx0IGVuY29kaW5nIGlzIEFTQ0lJLCBzbyB3aGVuZXZlciBhIGNoYXJhY3RlciB3aXRoIGFuIEFTQ0lJIHZhbHVlID4xMjcKLWlzIGluIHRoZSBpbnB1dCBkYXRhLCB5b3UnbGwgZ2V0IGEgYGBVbmljb2RlRGVjb2RlRXJyb3JgYAotYmVjYXVzZSB0aGF0IGNoYXJhY3RlciBjYW4ndCBiZSBoYW5kbGVkIGJ5IHRoZSBBU0NJSSBlbmNvZGluZy4gIAotCi1JdCdzIGVhc3kgdG8gbWlzcyBzdWNoIHByb2JsZW1zIGlmIHlvdSBvbmx5IHRlc3QgeW91ciBzb2Z0d2FyZSAKLXdpdGggZGF0YSB0aGF0IGRvZXNuJ3QgY29udGFpbiBhbnkgCi1hY2NlbnRzOyBldmVyeXRoaW5nIHdpbGwgc2VlbSB0byB3b3JrLCBidXQgdGhlcmUncyBhY3R1YWxseSBhIGJ1ZyBpbiB5b3VyCi1wcm9ncmFtIHdhaXRpbmcgZm9yIHRoZSBmaXJzdCB1c2VyIHdobyBhdHRlbXB0cyB0byB1c2UgY2hhcmFjdGVycyA+MTI3LgotQSBzZWNvbmQgdGlwLCB0aGVyZWZvcmUsIGlzOgotCi0gICAgSW5jbHVkZSBjaGFyYWN0ZXJzID4xMjcgYW5kLCBldmVuIGJldHRlciwgY2hhcmFjdGVycyA+MjU1IGluIHlvdXIKLSAgICB0ZXN0IGRhdGEuCi0KLVdoZW4gdXNpbmcgZGF0YSBjb21pbmcgZnJvbSBhIHdlYiBicm93c2VyIG9yIHNvbWUgb3RoZXIgdW50cnVzdGVkIHNvdXJjZSwKLWEgY29tbW9uIHRlY2huaXF1ZSBpcyB0byBjaGVjayBmb3IgaWxsZWdhbCBjaGFyYWN0ZXJzIGluIGEgc3RyaW5nCi1iZWZvcmUgdXNpbmcgdGhlIHN0cmluZyBpbiBhIGdlbmVyYXRlZCBjb21tYW5kIGxpbmUgb3Igc3RvcmluZyBpdCBpbiBhIAotZGF0YWJhc2UuICBJZiB5b3UncmUgZG9pbmcgdGhpcywgYmUgY2FyZWZ1bCB0byBjaGVjayAKLXRoZSBzdHJpbmcgb25jZSBpdCdzIGluIHRoZSBmb3JtIHRoYXQgd2lsbCBiZSB1c2VkIG9yIHN0b3JlZDsgaXQncyAKLXBvc3NpYmxlIGZvciBlbmNvZGluZ3MgdG8gYmUgdXNlZCB0byBkaXNndWlzZSBjaGFyYWN0ZXJzLiAgVGhpcyBpcyBlc3BlY2lhbGx5Ci10cnVlIGlmIHRoZSBpbnB1dCBkYXRhIGFsc28gc3BlY2lmaWVzIHRoZSBlbmNvZGluZzsgCi1tYW55IGVuY29kaW5ncyBsZWF2ZSB0aGUgY29tbW9ubHkgY2hlY2tlZC1mb3IgY2hhcmFjdGVycyBhbG9uZSwgCi1idXQgUHl0aG9uIGluY2x1ZGVzIHNvbWUgZW5jb2RpbmdzIHN1Y2ggYXMgYGAnYmFzZTY0J2BgCi10aGF0IG1vZGlmeSBldmVyeSBzaW5nbGUgY2hhcmFjdGVyLgotCi1Gb3IgZXhhbXBsZSwgbGV0J3Mgc2F5IHlvdSBoYXZlIGEgY29udGVudCBtYW5hZ2VtZW50IHN5c3RlbSB0aGF0IHRha2VzIGEgCi1Vbmljb2RlIGZpbGVuYW1lLCBhbmQgeW91IHdhbnQgdG8gZGlzYWxsb3cgcGF0aHMgd2l0aCBhICcvJyBjaGFyYWN0ZXIuCi1Zb3UgbWlnaHQgd3JpdGUgdGhpcyBjb2RlOjoKLQotICAgIGRlZiByZWFkX2ZpbGUgKGZpbGVuYW1lLCBlbmNvZGluZyk6Ci0gICAgICAgIGlmICcvJyBpbiBmaWxlbmFtZToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIicvJyBub3QgYWxsb3dlZCBpbiBmaWxlbmFtZXMiKQotICAgICAgICB1bmljb2RlX25hbWUgPSBmaWxlbmFtZS5kZWNvZGUoZW5jb2RpbmcpCi0gICAgICAgIGYgPSBvcGVuKHVuaWNvZGVfbmFtZSwgJ3InKQotICAgICAgICAjIC4uLiByZXR1cm4gY29udGVudHMgb2YgZmlsZSAuLi4KLSAgICAgICAgCi1Ib3dldmVyLCBpZiBhbiBhdHRhY2tlciBjb3VsZCBzcGVjaWZ5IHRoZSBgYCdiYXNlNjQnYGAgZW5jb2RpbmcsCi10aGV5IGNvdWxkIHBhc3MgYGAnTDJWMFl5OXdZWE56ZDJRPSdgYCwgd2hpY2ggaXMgdGhlIGJhc2UtNjQKLWVuY29kZWQgZm9ybSBvZiB0aGUgc3RyaW5nIGBgJy9ldGMvcGFzc3dkJ2BgLCB0byByZWFkIGEgCi1zeXN0ZW0gZmlsZS4gICBUaGUgYWJvdmUgY29kZSBsb29rcyBmb3IgYGAnLydgYCBjaGFyYWN0ZXJzIAotaW4gdGhlIGVuY29kZWQgZm9ybSBhbmQgbWlzc2VzIHRoZSBkYW5nZXJvdXMgY2hhcmFjdGVyIAotaW4gdGhlIHJlc3VsdGluZyBkZWNvZGVkIGZvcm0uCi0KLVJlZmVyZW5jZXMKLScnJycnJycnJycnJycnCi0KLVRoZSBQREYgc2xpZGVzIGZvciBNYXJjLUFuZHLDqSBMZW1idXJnJ3MgcHJlc2VudGF0aW9uICJXcml0aW5nCi1Vbmljb2RlLWF3YXJlIEFwcGxpY2F0aW9ucyBpbiBQeXRob24iIGFyZSBhdmFpbGFibGUgYXQKLTxodHRwOi8vd3d3LmVnZW5peC5jb20vZmlsZXMvcHl0aG9uL0xTTTIwMDUtRGV2ZWxvcGluZy1Vbmljb2RlLWF3YXJlLWFwcGxpY2F0aW9ucy1pbi1QeXRob24ucGRmPgotYW5kIGRpc2N1c3MgcXVlc3Rpb25zIG9mIGNoYXJhY3RlciBlbmNvZGluZ3MgYXMgd2VsbCBhcyBob3cgdG8KLWludGVybmF0aW9uYWxpemUgYW5kIGxvY2FsaXplIGFuIGFwcGxpY2F0aW9uLgotCi0KLVJldmlzaW9uIEhpc3RvcnkgYW5kIEFja25vd2xlZGdlbWVudHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGFua3MgdG8gdGhlIGZvbGxvd2luZyBwZW9wbGUgd2hvIGhhdmUgbm90ZWQgZXJyb3JzIG9yIG9mZmVyZWQKLXN1Z2dlc3Rpb25zIG9uIHRoaXMgYXJ0aWNsZTogTmljaG9sYXMgQmFzdGluLCAKLU1hcml1cyBHZWRtaW5hcywgS2VudCBKb2huc29uLCBLZW4gS3J1Z2xlciwKLU1hcmMtQW5kcsOpIExlbWJ1cmcsIE1hcnRpbiB2b24gTMO2d2lzLCBDaGFkIFdoaXRhY3JlLgotCi1WZXJzaW9uIDEuMDogcG9zdGVkIEF1Z3VzdCA1IDIwMDUuCi0KLVZlcnNpb24gMS4wMTogcG9zdGVkIEF1Z3VzdCA3IDIwMDUuICBDb3JyZWN0cyBmYWN0dWFsIGFuZCBtYXJrdXAKLWVycm9yczsgYWRkcyBzZXZlcmFsIGxpbmtzLgotCi1WZXJzaW9uIDEuMDI6IHBvc3RlZCBBdWd1c3QgMTYgMjAwNS4gIENvcnJlY3RzIGZhY3R1YWwgZXJyb3JzLgotCi0KLS4uIGNvbW1lbnQgQWRkaXRpb25hbCB0b3BpYzogYnVpbGRpbmcgUHl0aG9uIHcvIFVDUzIgb3IgVUNTNCBzdXBwb3J0Ci0uLiBjb21tZW50IERlc2NyaWJlIG9ic2N1cmUgLVUgc3dpdGNoIHNvbWV3aGVyZT8KLS4uIGNvbW1lbnQgRGVzY3JpYmUgdXNlIG9mIGNvZGVjcy5TdHJlYW1SZWNvZGVyIGFuZCBTdHJlYW1SZWFkZXJXcml0ZXIKLQotLi4gY29tbWVudCAKLSAgIE9yaWdpbmFsIG91dGxpbmU6Ci0KLSAgIC0gWyBdIFVuaWNvZGUgaW50cm9kdWN0aW9uCi0gICAgICAgLSBbIF0gQVNDSUkKLSAgICAgICAtIFsgXSBUZXJtcwotCSAgIC0gWyBdIENoYXJhY3RlcgotCSAgIC0gWyBdIENvZGUgcG9pbnQKLQkgLSBbIF0gRW5jb2RpbmdzCi0JICAgIC0gWyBdIENvbW1vbiBlbmNvZGluZ3M6IEFTQ0lJLCBMYXRpbi0xLCBVVEYtOAotICAgICAgIC0gWyBdIFVuaWNvZGUgUHl0aG9uIHR5cGUKLQkgICAtIFsgXSBXcml0aW5nIHVuaWNvZGUgbGl0ZXJhbHMKLQkgICAgICAgLSBbIF0gT2JzY3VyaXR5OiAtVSBzd2l0Y2gKLQkgICAtIFsgXSBCdWlsdC1pbnMKLQkgICAgICAgLSBbIF0gdW5pY2hyKCkKLQkgICAgICAgLSBbIF0gb3JkKCkKLQkgICAgICAgLSBbIF0gdW5pY29kZSgpIGNvbnN0cnVjdG9yCi0JICAgLSBbIF0gVW5pY29kZSB0eXBlCi0JICAgICAgIC0gWyBdIGVuY29kZSgpLCBkZWNvZGUoKSBtZXRob2RzCi0gICAgICAgLSBbIF0gVW5pY29kZWRhdGEgbW9kdWxlIGZvciBjaGFyYWN0ZXIgcHJvcGVydGllcwotICAgICAgIC0gWyBdIEkvTwotCSAgIC0gWyBdIFJlYWRpbmcvd3JpdGluZyBVbmljb2RlIGRhdGEgaW50byBmaWxlcwotCSAgICAgICAtIFsgXSBCeXRlLW9yZGVyIG1hcmtzCi0JICAgLSBbIF0gVW5pY29kZSBmaWxlbmFtZXMKLSAgICAgICAtIFsgXSBXcml0aW5nIFVuaWNvZGUgcHJvZ3JhbXMKLQkgICAtIFsgXSBEbyBldmVyeXRoaW5nIGluIFVuaWNvZGUKLQkgICAtIFsgXSBEZWNsYXJpbmcgc291cmNlIGNvZGUgZW5jb2RpbmdzIChQRVAgMjYzKQotICAgICAgIC0gWyBdIE90aGVyIGlzc3VlcwotCSAgIC0gWyBdIEJ1aWxkaW5nIFB5dGhvbiAoVUNTMiwgVUNTNCkKZGlmZiAtLWdpdCBhL0RvYy9ob3d0by91cmxsaWIyLnJzdCBiL0RvYy9ob3d0by91cmxsaWIyLnJzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhmNGEyYi4uMDAwMDAwMAotLS0gYS9Eb2MvaG93dG8vdXJsbGliMi5yc3QKKysrIC9kZXYvbnVsbApAQCAtMSw2MDMgKzAsMCBAQAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIEhPV1RPIEZldGNoIEludGVybmV0IFJlc291cmNlcyBVc2luZyB1cmxsaWIyCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIEZldGNoaW5nIFVSTHMgV2l0aCBQeXRob24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0uLiBub3RlOjoKLQotICAgIFRoZXJlIGlzIGFuIEZyZW5jaCB0cmFuc2xhdGlvbiBvZiBhbiBlYXJsaWVyIHJldmlzaW9uIG9mIHRoaXMKLSAgICBIT1dUTywgYXZhaWxhYmxlIGF0IGB1cmxsaWIyIC0gTGUgTWFudWVsIG1hbnF1YW50Ci0gICAgPGh0dHA6Ly93d3cudm9pZHNwYWNlL3B5dGhvbi9hcnRpY2xlcy91cmxsaWIyX2ZyYW5jYWlzLnNodG1sPmBfLgotCi0uLiBjb250ZW50czo6IHVybGxpYjIgVHV0b3JpYWwKLSAKLQotSW50cm9kdWN0aW9uCi09PT09PT09PT09PT0KLQotLi4gc2lkZWJhcjo6IFJlbGF0ZWQgQXJ0aWNsZXMKLQotICAgIFlvdSBtYXkgYWxzbyBmaW5kIHVzZWZ1bCB0aGUgZm9sbG93aW5nIGFydGljbGUgb24gZmV0Y2hpbmcgd2ViCi0gICAgcmVzb3VyY2VzIHdpdGggUHl0aG9uIDoKLSAgICAKLSAgICAqIGBCYXNpYyBBdXRoZW50aWNhdGlvbiA8aHR0cDovL3d3dy52b2lkc3BhY2Uub3JnLnVrL3B5dGhvbi9hcnRpY2xlcy9hdXRoZW50aWNhdGlvbi5zaHRtbD5gXwotICAgIAotICAgICAgICBBIHR1dG9yaWFsIG9uICpCYXNpYyBBdXRoZW50aWNhdGlvbiosIHdpdGggZXhhbXBsZXMgaW4gUHl0aG9uLgotICAgIAotICAgIFRoaXMgSE9XVE8gaXMgd3JpdHRlbiBieSBgTWljaGFlbCBGb29yZAotICAgIDxodHRwOi8vd3d3LnZvaWRzcGFjZS5vcmcudWsvcHl0aG9uL2luZGV4LnNodG1sPmBfLgotCi0qKnVybGxpYjIqKiBpcyBhIGBQeXRob24gPGh0dHA6Ly93d3cucHl0aG9uLm9yZz5gXyBtb2R1bGUgZm9yIGZldGNoaW5nIFVSTHMKLShVbmlmb3JtIFJlc291cmNlIExvY2F0b3JzKS4gSXQgb2ZmZXJzIGEgdmVyeSBzaW1wbGUgaW50ZXJmYWNlLCBpbiB0aGUgZm9ybSBvZgotdGhlICp1cmxvcGVuKiBmdW5jdGlvbi4gVGhpcyBpcyBjYXBhYmxlIG9mIGZldGNoaW5nIFVSTHMgdXNpbmcgYSB2YXJpZXR5Ci1vZiBkaWZmZXJlbnQgcHJvdG9jb2xzLiBJdCBhbHNvIG9mZmVycyBhIHNsaWdodGx5IG1vcmUgY29tcGxleAotaW50ZXJmYWNlIGZvciBoYW5kbGluZyBjb21tb24gc2l0dWF0aW9ucyAtIGxpa2UgYmFzaWMgYXV0aGVudGljYXRpb24sCi1jb29raWVzLCBwcm94aWVzIGFuZCBzbyBvbi4gVGhlc2UgYXJlIHByb3ZpZGVkIGJ5IG9iamVjdHMgY2FsbGVkCi1oYW5kbGVycyBhbmQgb3BlbmVycy4KLQotdXJsbGliMiBzdXBwb3J0cyBmZXRjaGluZyBVUkxzIGZvciBtYW55ICJVUkwgc2NoZW1lcyIgKGlkZW50aWZpZWQgYnkgdGhlIHN0cmluZwotYmVmb3JlIHRoZSAiOiIgaW4gVVJMIC0gZm9yIGV4YW1wbGUgImZ0cCIgaXMgdGhlIFVSTCBzY2hlbWUgb2YKLSJmdHA6Ly9weXRob24ub3JnLyIpIHVzaW5nIHRoZWlyIGFzc29jaWF0ZWQgbmV0d29yayBwcm90b2NvbHMgKGUuZy4gRlRQLCBIVFRQKS4KLVRoaXMgdHV0b3JpYWwgZm9jdXNlcyBvbiB0aGUgbW9zdCBjb21tb24gY2FzZSwgSFRUUC4KLQotRm9yIHN0cmFpZ2h0Zm9yd2FyZCBzaXR1YXRpb25zICp1cmxvcGVuKiBpcyB2ZXJ5IGVhc3kgdG8gdXNlLiBCdXQgYXMKLXNvb24gYXMgeW91IGVuY291bnRlciBlcnJvcnMgb3Igbm9uLXRyaXZpYWwgY2FzZXMgd2hlbiBvcGVuaW5nIEhUVFAKLVVSTHMsIHlvdSB3aWxsIG5lZWQgc29tZSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBIeXBlclRleHQgVHJhbnNmZXIKLVByb3RvY29sLiBUaGUgbW9zdCBjb21wcmVoZW5zaXZlIGFuZCBhdXRob3JpdGF0aXZlIHJlZmVyZW5jZSB0byBIVFRQCi1pcyA6UkZDOmAyNjE2YC4gVGhpcyBpcyBhIHRlY2huaWNhbCBkb2N1bWVudCBhbmQgbm90IGludGVuZGVkIHRvIGJlCi1lYXN5IHRvIHJlYWQuIFRoaXMgSE9XVE8gYWltcyB0byBpbGx1c3RyYXRlIHVzaW5nICp1cmxsaWIyKiwgd2l0aAotZW5vdWdoIGRldGFpbCBhYm91dCBIVFRQIHRvIGhlbHAgeW91IHRocm91Z2guIEl0IGlzIG5vdCBpbnRlbmRlZCB0bwotcmVwbGFjZSB0aGUgYHVybGxpYjIgZG9jcyA8aHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWIvbW9kdWxlLXVybGxpYjIuaHRtbD5gXyAsCi1idXQgaXMgc3VwcGxlbWVudGFyeSB0byB0aGVtLgotCi0KLUZldGNoaW5nIFVSTHMKLT09PT09PT09PT09PT0KLQotVGhlIHNpbXBsZXN0IHdheSB0byB1c2UgdXJsbGliMiBpcyBhcyBmb2xsb3dzIDogOjoKLQotICAgIGltcG9ydCB1cmxsaWIyCi0gICAgcmVzcG9uc2UgPSB1cmxsaWIyLnVybG9wZW4oJ2h0dHA6Ly9weXRob24ub3JnLycpCi0gICAgaHRtbCA9IHJlc3BvbnNlLnJlYWQoKQotCi1NYW55IHVzZXMgb2YgdXJsbGliMiB3aWxsIGJlIHRoYXQgc2ltcGxlIChub3RlIHRoYXQgaW5zdGVhZCBvZiBhbgotJ2h0dHA6JyBVUkwgd2UgY291bGQgaGF2ZSB1c2VkIGFuIFVSTCBzdGFydGluZyB3aXRoICdmdHA6JywgJ2ZpbGU6JywKLWV0Yy4pLiAgSG93ZXZlciwgaXQncyB0aGUgcHVycG9zZSBvZiB0aGlzIHR1dG9yaWFsIHRvIGV4cGxhaW4gdGhlIG1vcmUKLWNvbXBsaWNhdGVkIGNhc2VzLCBjb25jZW50cmF0aW5nIG9uIEhUVFAuCi0KLUhUVFAgaXMgYmFzZWQgb24gcmVxdWVzdHMgYW5kIHJlc3BvbnNlcyAtIHRoZSBjbGllbnQgbWFrZXMgcmVxdWVzdHMKLWFuZCBzZXJ2ZXJzIHNlbmQgcmVzcG9uc2VzLiB1cmxsaWIyIG1pcnJvcnMgdGhpcyB3aXRoIGEgYGBSZXF1ZXN0YGAKLW9iamVjdCB3aGljaCByZXByZXNlbnRzIHRoZSBIVFRQIHJlcXVlc3QgeW91IGFyZSBtYWtpbmcuIEluIGl0cwotc2ltcGxlc3QgZm9ybSB5b3UgY3JlYXRlIGEgUmVxdWVzdCBvYmplY3QgdGhhdCBzcGVjaWZpZXMgdGhlIFVSTCB5b3UKLXdhbnQgdG8gZmV0Y2guIENhbGxpbmcgYGB1cmxvcGVuYGAgd2l0aCB0aGlzIFJlcXVlc3Qgb2JqZWN0IHJldHVybnMgYQotcmVzcG9uc2Ugb2JqZWN0IGZvciB0aGUgVVJMIHJlcXVlc3RlZC4gVGhpcyByZXNwb25zZSBpcyBhIGZpbGUtbGlrZQotb2JqZWN0LCB3aGljaCBtZWFucyB5b3UgY2FuIGZvciBleGFtcGxlIGNhbGwgLnJlYWQoKSBvbiB0aGUgcmVzcG9uc2UgOgotOjoKLQotICAgIGltcG9ydCB1cmxsaWIyCi0KLSAgICByZXEgPSB1cmxsaWIyLlJlcXVlc3QoJ2h0dHA6Ly93d3cudm9pZHNwYWNlLm9yZy51aycpCi0gICAgcmVzcG9uc2UgPSB1cmxsaWIyLnVybG9wZW4ocmVxKQotICAgIHRoZV9wYWdlID0gcmVzcG9uc2UucmVhZCgpCi0KLU5vdGUgdGhhdCB1cmxsaWIyIG1ha2VzIHVzZSBvZiB0aGUgc2FtZSBSZXF1ZXN0IGludGVyZmFjZSB0byBoYW5kbGUKLWFsbCBVUkwgc2NoZW1lcy4gIEZvciBleGFtcGxlLCB5b3UgY2FuIG1ha2UgYW4gRlRQIHJlcXVlc3QgbGlrZSBzbzogOjoKLQotICAgIHJlcSA9IHVybGxpYjIuUmVxdWVzdCgnZnRwOi8vZXhhbXBsZS5jb20vJykKLQotSW4gdGhlIGNhc2Ugb2YgSFRUUCwgdGhlcmUgYXJlIHR3byBleHRyYSB0aGluZ3MgdGhhdCBSZXF1ZXN0IG9iamVjdHMKLWFsbG93IHlvdSB0byBkbzogRmlyc3QsIHlvdSBjYW4gcGFzcyBkYXRhIHRvIGJlIHNlbnQgdG8gdGhlIHNlcnZlci4KLVNlY29uZCwgeW91IGNhbiBwYXNzIGV4dHJhIGluZm9ybWF0aW9uICgibWV0YWRhdGEiKSAqYWJvdXQqIHRoZSBkYXRhCi1vciB0aGUgYWJvdXQgcmVxdWVzdCBpdHNlbGYsIHRvIHRoZSBzZXJ2ZXIgLSB0aGlzIGluZm9ybWF0aW9uIGlzIHNlbnQKLWFzIEhUVFAgImhlYWRlcnMiLiAgTGV0J3MgbG9vayBhdCBlYWNoIG9mIHRoZXNlIGluIHR1cm4uCi0KLURhdGEKLS0tLS0KLQotU29tZXRpbWVzIHlvdSB3YW50IHRvIHNlbmQgZGF0YSB0byBhIFVSTCAob2Z0ZW4gdGhlIFVSTCB3aWxsIHJlZmVyIHRvCi1hIENHSSAoQ29tbW9uIEdhdGV3YXkgSW50ZXJmYWNlKSBzY3JpcHQgWyNdXyBvciBvdGhlciB3ZWIKLWFwcGxpY2F0aW9uKS4gV2l0aCBIVFRQLCB0aGlzIGlzIG9mdGVuIGRvbmUgdXNpbmcgd2hhdCdzIGtub3duIGFzIGEKLSoqUE9TVCoqIHJlcXVlc3QuIFRoaXMgaXMgb2Z0ZW4gd2hhdCB5b3VyIGJyb3dzZXIgZG9lcyB3aGVuIHlvdSBzdWJtaXQKLWEgSFRNTCBmb3JtIHRoYXQgeW91IGZpbGxlZCBpbiBvbiB0aGUgd2ViLiBOb3QgYWxsIFBPU1RzIGhhdmUgdG8gY29tZQotZnJvbSBmb3JtczogeW91IGNhbiB1c2UgYSBQT1NUIHRvIHRyYW5zbWl0IGFyYml0cmFyeSBkYXRhIHRvIHlvdXIgb3duCi1hcHBsaWNhdGlvbi4gSW4gdGhlIGNvbW1vbiBjYXNlIG9mIEhUTUwgZm9ybXMsIHRoZSBkYXRhIG5lZWRzIHRvIGJlCi1lbmNvZGVkIGluIGEgc3RhbmRhcmQgd2F5LCBhbmQgdGhlbiBwYXNzZWQgdG8gdGhlIFJlcXVlc3Qgb2JqZWN0IGFzCi10aGUgYGBkYXRhYGAgYXJndW1lbnQuIFRoZSBlbmNvZGluZyBpcyBkb25lIHVzaW5nIGEgZnVuY3Rpb24gZnJvbSB0aGUKLWBgdXJsbGliYGAgbGlicmFyeSAqbm90KiBmcm9tIGBgdXJsbGliMmBgLiA6OgotCi0gICAgaW1wb3J0IHVybGxpYgotICAgIGltcG9ydCB1cmxsaWIyICAKLQotICAgIHVybCA9ICdodHRwOi8vd3d3LnNvbWVzZXJ2ZXIuY29tL2NnaS1iaW4vcmVnaXN0ZXIuY2dpJwotICAgIHZhbHVlcyA9IHsnbmFtZScgOiAnTWljaGFlbCBGb29yZCcsCi0gICAgICAgICAgICAgICdsb2NhdGlvbicgOiAnTm9ydGhhbXB0b24nLAotICAgICAgICAgICAgICAnbGFuZ3VhZ2UnIDogJ1B5dGhvbicgfQotCi0gICAgZGF0YSA9IHVybGxpYi51cmxlbmNvZGUodmFsdWVzKQotICAgIHJlcSA9IHVybGxpYjIuUmVxdWVzdCh1cmwsIGRhdGEpCi0gICAgcmVzcG9uc2UgPSB1cmxsaWIyLnVybG9wZW4ocmVxKQotICAgIHRoZV9wYWdlID0gcmVzcG9uc2UucmVhZCgpCi0KLU5vdGUgdGhhdCBvdGhlciBlbmNvZGluZ3MgYXJlIHNvbWV0aW1lcyByZXF1aXJlZCAoZS5nLiBmb3IgZmlsZSB1cGxvYWQKLWZyb20gSFRNTCBmb3JtcyAtIHNlZQotYEhUTUwgU3BlY2lmaWNhdGlvbiwgRm9ybSBTdWJtaXNzaW9uIDxodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL2ludGVyYWN0L2Zvcm1zLmh0bWwjaC0xNy4xMz5gXwotZm9yIG1vcmUgZGV0YWlscykuCi0KLUlmIHlvdSBkbyBub3QgcGFzcyB0aGUgYGBkYXRhYGAgYXJndW1lbnQsIHVybGxpYjIgdXNlcyBhICoqR0VUKioKLXJlcXVlc3QuIE9uZSB3YXkgaW4gd2hpY2ggR0VUIGFuZCBQT1NUIHJlcXVlc3RzIGRpZmZlciBpcyB0aGF0IFBPU1QKLXJlcXVlc3RzIG9mdGVuIGhhdmUgInNpZGUtZWZmZWN0cyI6IHRoZXkgY2hhbmdlIHRoZSBzdGF0ZSBvZiB0aGUKLXN5c3RlbSBpbiBzb21lIHdheSAoZm9yIGV4YW1wbGUgYnkgcGxhY2luZyBhbiBvcmRlciB3aXRoIHRoZSB3ZWJzaXRlCi1mb3IgYSBodW5kcmVkd2VpZ2h0IG9mIHRpbm5lZCBzcGFtIHRvIGJlIGRlbGl2ZXJlZCB0byB5b3VyIGRvb3IpLgotVGhvdWdoIHRoZSBIVFRQIHN0YW5kYXJkIG1ha2VzIGl0IGNsZWFyIHRoYXQgUE9TVHMgYXJlIGludGVuZGVkIHRvCi0qYWx3YXlzKiBjYXVzZSBzaWRlLWVmZmVjdHMsIGFuZCBHRVQgcmVxdWVzdHMgKm5ldmVyKiB0byBjYXVzZQotc2lkZS1lZmZlY3RzLCBub3RoaW5nIHByZXZlbnRzIGEgR0VUIHJlcXVlc3QgZnJvbSBoYXZpbmcgc2lkZS1lZmZlY3RzLAotbm9yIGEgUE9TVCByZXF1ZXN0cyBmcm9tIGhhdmluZyBubyBzaWRlLWVmZmVjdHMuIERhdGEgY2FuIGFsc28gYmUKLXBhc3NlZCBpbiBhbiBIVFRQIEdFVCByZXF1ZXN0IGJ5IGVuY29kaW5nIGl0IGluIHRoZSBVUkwgaXRzZWxmLgotCi1UaGlzIGlzIGRvbmUgYXMgZm9sbG93czo6Ci0KLSAgICA+Pj4gaW1wb3J0IHVybGxpYjIKLSAgICA+Pj4gaW1wb3J0IHVybGxpYgotICAgID4+PiBkYXRhID0ge30KLSAgICA+Pj4gZGF0YVsnbmFtZSddID0gJ1NvbWVib2R5IEhlcmUnCi0gICAgPj4+IGRhdGFbJ2xvY2F0aW9uJ10gPSAnTm9ydGhhbXB0b24nCi0gICAgPj4+IGRhdGFbJ2xhbmd1YWdlJ10gPSAnUHl0aG9uJwotICAgID4+PiB1cmxfdmFsdWVzID0gdXJsbGliLnVybGVuY29kZShkYXRhKQotICAgID4+PiBwcmludCB1cmxfdmFsdWVzCi0gICAgbmFtZT1Tb21lYm9keStIZXJlJmxhbmd1YWdlPVB5dGhvbiZsb2NhdGlvbj1Ob3J0aGFtcHRvbgotICAgID4+PiB1cmwgPSAnaHR0cDovL3d3dy5leGFtcGxlLmNvbS9leGFtcGxlLmNnaScKLSAgICA+Pj4gZnVsbF91cmwgPSB1cmwgKyAnPycgKyB1cmxfdmFsdWVzCi0gICAgPj4+IGRhdGEgPSB1cmxsaWIyLm9wZW4oZnVsbF91cmwpCi0KLU5vdGljZSB0aGF0IHRoZSBmdWxsIFVSTCBpcyBjcmVhdGVkIGJ5IGFkZGluZyBhIGBgP2BgIHRvIHRoZSBVUkwsIGZvbGxvd2VkIGJ5Ci10aGUgZW5jb2RlZCB2YWx1ZXMuCi0KLUhlYWRlcnMKLS0tLS0tLS0KLQotV2UnbGwgZGlzY3VzcyBoZXJlIG9uZSBwYXJ0aWN1bGFyIEhUVFAgaGVhZGVyLCB0byBpbGx1c3RyYXRlIGhvdyB0bwotYWRkIGhlYWRlcnMgdG8geW91ciBIVFRQIHJlcXVlc3QuCi0KLVNvbWUgd2Vic2l0ZXMgWyNdXyBkaXNsaWtlIGJlaW5nIGJyb3dzZWQgYnkgcHJvZ3JhbXMsIG9yIHNlbmQKLWRpZmZlcmVudCB2ZXJzaW9ucyB0byBkaWZmZXJlbnQgYnJvd3NlcnMgWyNdXyAuIEJ5IGRlZmF1bHQgdXJsbGliMgotaWRlbnRpZmllcyBpdHNlbGYgYXMgYGBQeXRob24tdXJsbGliL3gueWBgICh3aGVyZSBgYHhgYCBhbmQgYGB5YGAgYXJlCi10aGUgbWFqb3IgYW5kIG1pbm9yIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUHl0aG9uIHJlbGVhc2UsCi1lLmcuIGBgUHl0aG9uLXVybGxpYi8yLjVgYCksIHdoaWNoIG1heSBjb25mdXNlIHRoZSBzaXRlLCBvciBqdXN0IHBsYWluCi1ub3Qgd29yay4gVGhlIHdheSBhIGJyb3dzZXIgaWRlbnRpZmllcyBpdHNlbGYgaXMgdGhyb3VnaCB0aGUKLWBgVXNlci1BZ2VudGBgIGhlYWRlciBbI11fLiBXaGVuIHlvdSBjcmVhdGUgYSBSZXF1ZXN0IG9iamVjdCB5b3UgY2FuCi1wYXNzIGEgZGljdGlvbmFyeSBvZiBoZWFkZXJzIGluLiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgbWFrZXMgdGhlIHNhbWUKLXJlcXVlc3QgYXMgYWJvdmUsIGJ1dCBpZGVudGlmaWVzIGl0c2VsZiBhcyBhIHZlcnNpb24gb2YgSW50ZXJuZXQKLUV4cGxvcmVyIFsjXV8uIDo6Ci0KLSAgICBpbXBvcnQgdXJsbGliCi0gICAgaW1wb3J0IHVybGxpYjIgIAotICAgIAotICAgIHVybCA9ICdodHRwOi8vd3d3LnNvbWVzZXJ2ZXIuY29tL2NnaS1iaW4vcmVnaXN0ZXIuY2dpJwotICAgIHVzZXJfYWdlbnQgPSAnTW96aWxsYS80LjAgKGNvbXBhdGlibGU7IE1TSUUgNS41OyBXaW5kb3dzIE5UKScgCi0gICAgdmFsdWVzID0geyduYW1lJyA6ICdNaWNoYWVsIEZvb3JkJywKLSAgICAgICAgICAgICAgJ2xvY2F0aW9uJyA6ICdOb3J0aGFtcHRvbicsCi0gICAgICAgICAgICAgICdsYW5ndWFnZScgOiAnUHl0aG9uJyB9Ci0gICAgaGVhZGVycyA9IHsgJ1VzZXItQWdlbnQnIDogdXNlcl9hZ2VudCB9Ci0gICAgCi0gICAgZGF0YSA9IHVybGxpYi51cmxlbmNvZGUodmFsdWVzKQotICAgIHJlcSA9IHVybGxpYjIuUmVxdWVzdCh1cmwsIGRhdGEsIGhlYWRlcnMpCi0gICAgcmVzcG9uc2UgPSB1cmxsaWIyLnVybG9wZW4ocmVxKQotICAgIHRoZV9wYWdlID0gcmVzcG9uc2UucmVhZCgpCi0KLVRoZSByZXNwb25zZSBhbHNvIGhhcyB0d28gdXNlZnVsIG1ldGhvZHMuIFNlZSB0aGUgc2VjdGlvbiBvbiBgaW5mbyBhbmQKLWdldHVybGBfIHdoaWNoIGNvbWVzIGFmdGVyIHdlIGhhdmUgYSBsb29rIGF0IHdoYXQgaGFwcGVucyB3aGVuIHRoaW5ncwotZ28gd3JvbmcuCi0KLQotSGFuZGxpbmcgRXhjZXB0aW9ucwotPT09PT09PT09PT09PT09PT09PQotCi0qdXJsb3BlbiogcmFpc2VzIGBgVVJMRXJyb3JgYCB3aGVuIGl0IGNhbm5vdCBoYW5kbGUgYSByZXNwb25zZSAodGhvdWdoCi1hcyB1c3VhbCB3aXRoIFB5dGhvbiBBUElzLCBidWlsdGluIGV4Y2VwdGlvbnMgc3VjaCBhcyBWYWx1ZUVycm9yLAotVHlwZUVycm9yIGV0Yy4gbWF5IGFsc28gYmUgcmFpc2VkKS4KLQotYGBIVFRQRXJyb3JgYCBpcyB0aGUgc3ViY2xhc3Mgb2YgYGBVUkxFcnJvcmBgIHJhaXNlZCBpbiB0aGUgc3BlY2lmaWMKLWNhc2Ugb2YgSFRUUCBVUkxzLgotCi1VUkxFcnJvcgotLS0tLS0tLS0KLQotT2Z0ZW4sIFVSTEVycm9yIGlzIHJhaXNlZCBiZWNhdXNlIHRoZXJlIGlzIG5vIG5ldHdvcmsgY29ubmVjdGlvbiAobm8KLXJvdXRlIHRvIHRoZSBzcGVjaWZpZWQgc2VydmVyKSwgb3IgdGhlIHNwZWNpZmllZCBzZXJ2ZXIgZG9lc24ndCBleGlzdC4KLUluIHRoaXMgY2FzZSwgdGhlIGV4Y2VwdGlvbiByYWlzZWQgd2lsbCBoYXZlIGEgJ3JlYXNvbicgYXR0cmlidXRlLAotd2hpY2ggaXMgYSB0dXBsZSBjb250YWluaW5nIGFuIGVycm9yIGNvZGUgYW5kIGEgdGV4dCBlcnJvciBtZXNzYWdlLgotCi1lLmcuIDo6Ci0KLSAgICA+Pj4gcmVxID0gdXJsbGliMi5SZXF1ZXN0KCdodHRwOi8vd3d3LnByZXRlbmRfc2VydmVyLm9yZycpCi0gICAgPj4+IHRyeTogdXJsbGliMi51cmxvcGVuKHJlcSkKLSAgICA+Pj4gZXhjZXB0IFVSTEVycm9yIGFzIGU6Ci0gICAgPj4+ICAgIHByaW50IGUucmVhc29uCi0gICAgPj4+Ci0gICAgKDQsICdnZXRhZGRyaW5mbyBmYWlsZWQnKQotCi0KLUhUVFBFcnJvcgotLS0tLS0tLS0tCi0KLUV2ZXJ5IEhUVFAgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyIGNvbnRhaW5zIGEgbnVtZXJpYyAic3RhdHVzCi1jb2RlIi4gU29tZXRpbWVzIHRoZSBzdGF0dXMgY29kZSBpbmRpY2F0ZXMgdGhhdCB0aGUgc2VydmVyIGlzIHVuYWJsZQotdG8gZnVsZmlsIHRoZSByZXF1ZXN0LiBUaGUgZGVmYXVsdCBoYW5kbGVycyB3aWxsIGhhbmRsZSBzb21lIG9mIHRoZXNlCi1yZXNwb25zZXMgZm9yIHlvdSAoZm9yIGV4YW1wbGUsIGlmIHRoZSByZXNwb25zZSBpcyBhICJyZWRpcmVjdGlvbiIKLXRoYXQgcmVxdWVzdHMgdGhlIGNsaWVudCBmZXRjaCB0aGUgZG9jdW1lbnQgZnJvbSBhIGRpZmZlcmVudCBVUkwsCi11cmxsaWIyIHdpbGwgaGFuZGxlIHRoYXQgZm9yIHlvdSkuIEZvciB0aG9zZSBpdCBjYW4ndCBoYW5kbGUsIHVybG9wZW4KLXdpbGwgcmFpc2UgYW4gYGBIVFRQRXJyb3JgYC4gVHlwaWNhbCBlcnJvcnMgaW5jbHVkZSAnNDA0JyAocGFnZSBub3QKLWZvdW5kKSwgJzQwMycgKHJlcXVlc3QgZm9yYmlkZGVuKSwgYW5kICc0MDEnIChhdXRoZW50aWNhdGlvbgotcmVxdWlyZWQpLgotCi1TZWUgc2VjdGlvbiAxMCBvZiBSRkMgMjYxNiBmb3IgYSByZWZlcmVuY2Ugb24gYWxsIHRoZSBIVFRQIGVycm9yCi1jb2Rlcy4KLQotVGhlIGBgSFRUUEVycm9yYGAgaW5zdGFuY2UgcmFpc2VkIHdpbGwgaGF2ZSBhbiBpbnRlZ2VyICdjb2RlJwotYXR0cmlidXRlLCB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgZXJyb3Igc2VudCBieSB0aGUgc2VydmVyLgotCi1FcnJvciBDb2Rlcwotfn5+fn5+fn5+fn4KLQotQmVjYXVzZSB0aGUgZGVmYXVsdCBoYW5kbGVycyBoYW5kbGUgcmVkaXJlY3RzIChjb2RlcyBpbiB0aGUgMzAwCi1yYW5nZSksIGFuZCBjb2RlcyBpbiB0aGUgMTAwLTI5OSByYW5nZSBpbmRpY2F0ZSBzdWNjZXNzLCB5b3Ugd2lsbAotdXN1YWxseSBvbmx5IHNlZSBlcnJvciBjb2RlcyBpbiB0aGUgNDAwLTU5OSByYW5nZS4KLQotYGBCYXNlSFRUUFNlcnZlci5CYXNlSFRUUFJlcXVlc3RIYW5kbGVyLnJlc3BvbnNlc2BgIGlzIGEgdXNlZnVsCi1kaWN0aW9uYXJ5IG9mIHJlc3BvbnNlIGNvZGVzIGluIHRoYXQgc2hvd3MgYWxsIHRoZSByZXNwb25zZSBjb2RlcyB1c2VkCi1ieSBSRkMgMjYxNi4gVGhlIGRpY3Rpb25hcnkgaXMgcmVwcm9kdWNlZCBoZXJlIGZvciBjb252ZW5pZW5jZSA6OgotCi0gICAgIyBUYWJsZSBtYXBwaW5nIHJlc3BvbnNlIGNvZGVzIHRvIG1lc3NhZ2VzOyBlbnRyaWVzIGhhdmUgdGhlCi0gICAgIyBmb3JtIHtjb2RlOiAoc2hvcnRtZXNzYWdlLCBsb25nbWVzc2FnZSl9LgotICAgIHJlc3BvbnNlcyA9IHsKLSAgICAgICAgMTAwOiAoJ0NvbnRpbnVlJywgJ1JlcXVlc3QgcmVjZWl2ZWQsIHBsZWFzZSBjb250aW51ZScpLAotICAgICAgICAxMDE6ICgnU3dpdGNoaW5nIFByb3RvY29scycsCi0gICAgICAgICAgICAgICdTd2l0Y2hpbmcgdG8gbmV3IHByb3RvY29sOyBvYmV5IFVwZ3JhZGUgaGVhZGVyJyksCi0KLSAgICAgICAgMjAwOiAoJ09LJywgJ1JlcXVlc3QgZnVsZmlsbGVkLCBkb2N1bWVudCBmb2xsb3dzJyksCi0gICAgICAgIDIwMTogKCdDcmVhdGVkJywgJ0RvY3VtZW50IGNyZWF0ZWQsIFVSTCBmb2xsb3dzJyksCi0gICAgICAgIDIwMjogKCdBY2NlcHRlZCcsCi0gICAgICAgICAgICAgICdSZXF1ZXN0IGFjY2VwdGVkLCBwcm9jZXNzaW5nIGNvbnRpbnVlcyBvZmYtbGluZScpLAotICAgICAgICAyMDM6ICgnTm9uLUF1dGhvcml0YXRpdmUgSW5mb3JtYXRpb24nLCAnUmVxdWVzdCBmdWxmaWxsZWQgZnJvbSBjYWNoZScpLAotICAgICAgICAyMDQ6ICgnTm8gQ29udGVudCcsICdSZXF1ZXN0IGZ1bGZpbGxlZCwgbm90aGluZyBmb2xsb3dzJyksCi0gICAgICAgIDIwNTogKCdSZXNldCBDb250ZW50JywgJ0NsZWFyIGlucHV0IGZvcm0gZm9yIGZ1cnRoZXIgaW5wdXQuJyksCi0gICAgICAgIDIwNjogKCdQYXJ0aWFsIENvbnRlbnQnLCAnUGFydGlhbCBjb250ZW50IGZvbGxvd3MuJyksCi0KLSAgICAgICAgMzAwOiAoJ011bHRpcGxlIENob2ljZXMnLAotICAgICAgICAgICAgICAnT2JqZWN0IGhhcyBzZXZlcmFsIHJlc291cmNlcyAtLSBzZWUgVVJJIGxpc3QnKSwKLSAgICAgICAgMzAxOiAoJ01vdmVkIFBlcm1hbmVudGx5JywgJ09iamVjdCBtb3ZlZCBwZXJtYW5lbnRseSAtLSBzZWUgVVJJIGxpc3QnKSwKLSAgICAgICAgMzAyOiAoJ0ZvdW5kJywgJ09iamVjdCBtb3ZlZCB0ZW1wb3JhcmlseSAtLSBzZWUgVVJJIGxpc3QnKSwKLSAgICAgICAgMzAzOiAoJ1NlZSBPdGhlcicsICdPYmplY3QgbW92ZWQgLS0gc2VlIE1ldGhvZCBhbmQgVVJMIGxpc3QnKSwKLSAgICAgICAgMzA0OiAoJ05vdCBNb2RpZmllZCcsCi0gICAgICAgICAgICAgICdEb2N1bWVudCBoYXMgbm90IGNoYW5nZWQgc2luY2UgZ2l2ZW4gdGltZScpLAotICAgICAgICAzMDU6ICgnVXNlIFByb3h5JywKLSAgICAgICAgICAgICAgJ1lvdSBtdXN0IHVzZSBwcm94eSBzcGVjaWZpZWQgaW4gTG9jYXRpb24gdG8gYWNjZXNzIHRoaXMgJwotICAgICAgICAgICAgICAncmVzb3VyY2UuJyksCi0gICAgICAgIDMwNzogKCdUZW1wb3JhcnkgUmVkaXJlY3QnLAotICAgICAgICAgICAgICAnT2JqZWN0IG1vdmVkIHRlbXBvcmFyaWx5IC0tIHNlZSBVUkkgbGlzdCcpLAotCi0gICAgICAgIDQwMDogKCdCYWQgUmVxdWVzdCcsCi0gICAgICAgICAgICAgICdCYWQgcmVxdWVzdCBzeW50YXggb3IgdW5zdXBwb3J0ZWQgbWV0aG9kJyksCi0gICAgICAgIDQwMTogKCdVbmF1dGhvcml6ZWQnLAotICAgICAgICAgICAgICAnTm8gcGVybWlzc2lvbiAtLSBzZWUgYXV0aG9yaXphdGlvbiBzY2hlbWVzJyksCi0gICAgICAgIDQwMjogKCdQYXltZW50IFJlcXVpcmVkJywKLSAgICAgICAgICAgICAgJ05vIHBheW1lbnQgLS0gc2VlIGNoYXJnaW5nIHNjaGVtZXMnKSwKLSAgICAgICAgNDAzOiAoJ0ZvcmJpZGRlbicsCi0gICAgICAgICAgICAgICdSZXF1ZXN0IGZvcmJpZGRlbiAtLSBhdXRob3JpemF0aW9uIHdpbGwgbm90IGhlbHAnKSwKLSAgICAgICAgNDA0OiAoJ05vdCBGb3VuZCcsICdOb3RoaW5nIG1hdGNoZXMgdGhlIGdpdmVuIFVSSScpLAotICAgICAgICA0MDU6ICgnTWV0aG9kIE5vdCBBbGxvd2VkJywKLSAgICAgICAgICAgICAgJ1NwZWNpZmllZCBtZXRob2QgaXMgaW52YWxpZCBmb3IgdGhpcyBzZXJ2ZXIuJyksCi0gICAgICAgIDQwNjogKCdOb3QgQWNjZXB0YWJsZScsICdVUkkgbm90IGF2YWlsYWJsZSBpbiBwcmVmZXJyZWQgZm9ybWF0LicpLAotICAgICAgICA0MDc6ICgnUHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWQnLCAnWW91IG11c3QgYXV0aGVudGljYXRlIHdpdGggJwotICAgICAgICAgICAgICAndGhpcyBwcm94eSBiZWZvcmUgcHJvY2VlZGluZy4nKSwKLSAgICAgICAgNDA4OiAoJ1JlcXVlc3QgVGltZW91dCcsICdSZXF1ZXN0IHRpbWVkIG91dDsgdHJ5IGFnYWluIGxhdGVyLicpLAotICAgICAgICA0MDk6ICgnQ29uZmxpY3QnLCAnUmVxdWVzdCBjb25mbGljdC4nKSwKLSAgICAgICAgNDEwOiAoJ0dvbmUnLAotICAgICAgICAgICAgICAnVVJJIG5vIGxvbmdlciBleGlzdHMgYW5kIGhhcyBiZWVuIHBlcm1hbmVudGx5IHJlbW92ZWQuJyksCi0gICAgICAgIDQxMTogKCdMZW5ndGggUmVxdWlyZWQnLCAnQ2xpZW50IG11c3Qgc3BlY2lmeSBDb250ZW50LUxlbmd0aC4nKSwKLSAgICAgICAgNDEyOiAoJ1ByZWNvbmRpdGlvbiBGYWlsZWQnLCAnUHJlY29uZGl0aW9uIGluIGhlYWRlcnMgaXMgZmFsc2UuJyksCi0gICAgICAgIDQxMzogKCdSZXF1ZXN0IEVudGl0eSBUb28gTGFyZ2UnLCAnRW50aXR5IGlzIHRvbyBsYXJnZS4nKSwKLSAgICAgICAgNDE0OiAoJ1JlcXVlc3QtVVJJIFRvbyBMb25nJywgJ1VSSSBpcyB0b28gbG9uZy4nKSwKLSAgICAgICAgNDE1OiAoJ1Vuc3VwcG9ydGVkIE1lZGlhIFR5cGUnLCAnRW50aXR5IGJvZHkgaW4gdW5zdXBwb3J0ZWQgZm9ybWF0LicpLAotICAgICAgICA0MTY6ICgnUmVxdWVzdGVkIFJhbmdlIE5vdCBTYXRpc2ZpYWJsZScsCi0gICAgICAgICAgICAgICdDYW5ub3Qgc2F0aXNmeSByZXF1ZXN0IHJhbmdlLicpLAotICAgICAgICA0MTc6ICgnRXhwZWN0YXRpb24gRmFpbGVkJywKLSAgICAgICAgICAgICAgJ0V4cGVjdCBjb25kaXRpb24gY291bGQgbm90IGJlIHNhdGlzZmllZC4nKSwKLQotICAgICAgICA1MDA6ICgnSW50ZXJuYWwgU2VydmVyIEVycm9yJywgJ1NlcnZlciBnb3QgaXRzZWxmIGluIHRyb3VibGUnKSwKLSAgICAgICAgNTAxOiAoJ05vdCBJbXBsZW1lbnRlZCcsCi0gICAgICAgICAgICAgICdTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIG9wZXJhdGlvbicpLAotICAgICAgICA1MDI6ICgnQmFkIEdhdGV3YXknLCAnSW52YWxpZCByZXNwb25zZXMgZnJvbSBhbm90aGVyIHNlcnZlci9wcm94eS4nKSwKLSAgICAgICAgNTAzOiAoJ1NlcnZpY2UgVW5hdmFpbGFibGUnLAotICAgICAgICAgICAgICAnVGhlIHNlcnZlciBjYW5ub3QgcHJvY2VzcyB0aGUgcmVxdWVzdCBkdWUgdG8gYSBoaWdoIGxvYWQnKSwKLSAgICAgICAgNTA0OiAoJ0dhdGV3YXkgVGltZW91dCcsCi0gICAgICAgICAgICAgICdUaGUgZ2F0ZXdheSBzZXJ2ZXIgZGlkIG5vdCByZWNlaXZlIGEgdGltZWx5IHJlc3BvbnNlJyksCi0gICAgICAgIDUwNTogKCdIVFRQIFZlcnNpb24gTm90IFN1cHBvcnRlZCcsICdDYW5ub3QgZnVsZmlsbCByZXF1ZXN0LicpLAotICAgICAgICB9Ci0KLVdoZW4gYW4gZXJyb3IgaXMgcmFpc2VkIHRoZSBzZXJ2ZXIgcmVzcG9uZHMgYnkgcmV0dXJuaW5nIGFuIEhUVFAgZXJyb3IKLWNvZGUgKmFuZCogYW4gZXJyb3IgcGFnZS4gWW91IGNhbiB1c2UgdGhlIGBgSFRUUEVycm9yYGAgaW5zdGFuY2UgYXMgYQotcmVzcG9uc2Ugb24gdGhlIHBhZ2UgcmV0dXJuZWQuIFRoaXMgbWVhbnMgdGhhdCBhcyB3ZWxsIGFzIHRoZSBjb2RlCi1hdHRyaWJ1dGUsIGl0IGFsc28gaGFzIHJlYWQsIGdldHVybCwgYW5kIGluZm8sIG1ldGhvZHMuIDo6Ci0KLSAgICA+Pj4gcmVxID0gdXJsbGliMi5SZXF1ZXN0KCdodHRwOi8vd3d3LnB5dGhvbi5vcmcvZmlzaC5odG1sJykKLSAgICA+Pj4gdHJ5OiAKLSAgICA+Pj4gICAgIHVybGxpYjIudXJsb3BlbihyZXEpCi0gICAgPj4+IGV4Y2VwdCBVUkxFcnJvciBhcyBlOgotICAgID4+PiAgICAgcHJpbnQgZS5jb2RlCi0gICAgPj4+ICAgICBwcmludCBlLnJlYWQoKQotICAgID4+PiAKLSAgICA0MDQKLSAgICA8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAKLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci0gICAgPD94bWwtc3R5bGVzaGVldCBocmVmPSIuL2Nzcy9odDJodG1sLmNzcyIgCi0gICAgICAgIHR5cGU9InRleHQvY3NzIj8+Ci0gICAgPGh0bWw+PGhlYWQ+PHRpdGxlPkVycm9yIDQwNDogRmlsZSBOb3QgRm91bmQ8L3RpdGxlPiAKLSAgICAuLi4uLi4gZXRjLi4uCi0KLVdyYXBwaW5nIGl0IFVwCi0tLS0tLS0tLS0tLS0tLQotCi1TbyBpZiB5b3Ugd2FudCB0byBiZSBwcmVwYXJlZCBmb3IgYGBIVFRQRXJyb3JgYCAqb3IqIGBgVVJMRXJyb3JgYAotdGhlcmUgYXJlIHR3byBiYXNpYyBhcHByb2FjaGVzLiBJIHByZWZlciB0aGUgc2Vjb25kIGFwcHJvYWNoLgotCi1OdW1iZXIgMQotfn5+fn5+fn4KLQotOjoKLQotCi0gICAgZnJvbSB1cmxsaWIyIGltcG9ydCBSZXF1ZXN0LCB1cmxvcGVuLCBVUkxFcnJvciwgSFRUUEVycm9yCi0gICAgcmVxID0gUmVxdWVzdChzb21ldXJsKQotICAgIHRyeToKLSAgICAgICAgcmVzcG9uc2UgPSB1cmxvcGVuKHJlcSkKLSAgICBleGNlcHQgSFRUUEVycm9yIGFzIGU6Ci0gICAgICAgIHByaW50ICdUaGUgc2VydmVyIGNvdWxkblwndCBmdWxmaWxsIHRoZSByZXF1ZXN0LicKLSAgICAgICAgcHJpbnQgJ0Vycm9yIGNvZGU6ICcsIGUuY29kZQotICAgIGV4Y2VwdCBVUkxFcnJvciBhcyBlOgotICAgICAgICBwcmludCAnV2UgZmFpbGVkIHRvIHJlYWNoIGEgc2VydmVyLicKLSAgICAgICAgcHJpbnQgJ1JlYXNvbjogJywgZS5yZWFzb24KLSAgICBlbHNlOgotICAgICAgICAjIGV2ZXJ5dGhpbmcgaXMgZmluZQotCi0KLS4uIG5vdGU6OgotCi0gICAgVGhlIGBgZXhjZXB0IEhUVFBFcnJvcmBgICptdXN0KiBjb21lIGZpcnN0LCBvdGhlcndpc2UgYGBleGNlcHQgVVJMRXJyb3JgYAotICAgIHdpbGwgKmFsc28qIGNhdGNoIGFuIGBgSFRUUEVycm9yYGAuCi0KLU51bWJlciAyCi1+fn5+fn5+fgotCi06OgotCi0gICAgZnJvbSB1cmxsaWIyIGltcG9ydCBSZXF1ZXN0LCB1cmxvcGVuLCBVUkxFcnJvcgotICAgIHJlcSA9IFJlcXVlc3Qoc29tZXVybCkKLSAgICB0cnk6Ci0gICAgICAgIHJlc3BvbnNlID0gdXJsb3BlbihyZXEpCi0gICAgZXhjZXB0IFVSTEVycm9yIGFzIGU6Ci0gICAgICAgIGlmIGhhc2F0dHIoZSwgJ3JlYXNvbicpOgotICAgICAgICAgICAgcHJpbnQgJ1dlIGZhaWxlZCB0byByZWFjaCBhIHNlcnZlci4nCi0gICAgICAgICAgICBwcmludCAnUmVhc29uOiAnLCBlLnJlYXNvbgotICAgICAgICBlbGlmIGhhc2F0dHIoZSwgJ2NvZGUnKToKLSAgICAgICAgICAgIHByaW50ICdUaGUgc2VydmVyIGNvdWxkblwndCBmdWxmaWxsIHRoZSByZXF1ZXN0LicKLSAgICAgICAgICAgIHByaW50ICdFcnJvciBjb2RlOiAnLCBlLmNvZGUKLSAgICBlbHNlOgotICAgICAgICAjIGV2ZXJ5dGhpbmcgaXMgZmluZQotICAgICAgICAKLQotaW5mbyBhbmQgZ2V0dXJsCi09PT09PT09PT09PT09PT0KLQotVGhlIHJlc3BvbnNlIHJldHVybmVkIGJ5IHVybG9wZW4gKG9yIHRoZSBgYEhUVFBFcnJvcmBgIGluc3RhbmNlKSBoYXMKLXR3byB1c2VmdWwgbWV0aG9kcyBgYGluZm9gYCBhbmQgYGBnZXR1cmxgYC4KLQotKipnZXR1cmwqKiAtIHRoaXMgcmV0dXJucyB0aGUgcmVhbCBVUkwgb2YgdGhlIHBhZ2UgZmV0Y2hlZC4gVGhpcyBpcwotdXNlZnVsIGJlY2F1c2UgYGB1cmxvcGVuYGAgKG9yIHRoZSBvcGVuZXIgb2JqZWN0IHVzZWQpIG1heSBoYXZlCi1mb2xsb3dlZCBhIHJlZGlyZWN0LiBUaGUgVVJMIG9mIHRoZSBwYWdlIGZldGNoZWQgbWF5IG5vdCBiZSB0aGUgc2FtZQotYXMgdGhlIFVSTCByZXF1ZXN0ZWQuCi0KLSoqaW5mbyoqIC0gdGhpcyByZXR1cm5zIGEgZGljdGlvbmFyeS1saWtlIG9iamVjdCB0aGF0IGRlc2NyaWJlcyB0aGUKLXBhZ2UgZmV0Y2hlZCwgcGFydGljdWxhcmx5IHRoZSBoZWFkZXJzIHNlbnQgYnkgdGhlIHNlcnZlci4gSXQgaXMKLWN1cnJlbnRseSBhbiBgYGh0dHBsaWIuSFRUUE1lc3NhZ2VgYCBpbnN0YW5jZS4KLQotVHlwaWNhbCBoZWFkZXJzIGluY2x1ZGUgJ0NvbnRlbnQtbGVuZ3RoJywgJ0NvbnRlbnQtdHlwZScsIGFuZCBzbwotb24uIFNlZSB0aGUKLWBRdWljayBSZWZlcmVuY2UgdG8gSFRUUCBIZWFkZXJzIDxodHRwOi8vd3d3LmNzLnR1dC5maS9+amtvcnBlbGEvaHR0cC5odG1sPmBfCi1mb3IgYSB1c2VmdWwgbGlzdGluZyBvZiBIVFRQIGhlYWRlcnMgd2l0aCBicmllZiBleHBsYW5hdGlvbnMgb2YgdGhlaXIgbWVhbmluZwotYW5kIHVzZS4KLQotCi1PcGVuZXJzIGFuZCBIYW5kbGVycwotPT09PT09PT09PT09PT09PT09PT0KLQotV2hlbiB5b3UgZmV0Y2ggYSBVUkwgeW91IHVzZSBhbiBvcGVuZXIgKGFuIGluc3RhbmNlIG9mIHRoZSBwZXJoYXBzCi1jb25mdXNpbmdseS1uYW1lZCBgYHVybGxpYjIuT3BlbmVyRGlyZWN0b3JgYCkuIE5vcm1hbGx5IHdlIGhhdmUgYmVlbiB1c2luZwotdGhlIGRlZmF1bHQgb3BlbmVyIC0gdmlhIGBgdXJsb3BlbmBgIC0gYnV0IHlvdSBjYW4gY3JlYXRlIGN1c3RvbQotb3BlbmVycy4gT3BlbmVycyB1c2UgaGFuZGxlcnMuIEFsbCB0aGUgImhlYXZ5IGxpZnRpbmciIGlzIGRvbmUgYnkgdGhlCi1oYW5kbGVycy4gRWFjaCBoYW5kbGVyIGtub3dzIGhvdyB0byBvcGVuIFVSTHMgZm9yIGEgcGFydGljdWxhciBVUkwKLXNjaGVtZSAoaHR0cCwgZnRwLCBldGMuKSwgb3IgaG93IHRvIGhhbmRsZSBhbiBhc3BlY3Qgb2YgVVJMIG9wZW5pbmcsCi1mb3IgZXhhbXBsZSBIVFRQIHJlZGlyZWN0aW9ucyBvciBIVFRQIGNvb2tpZXMuCi0KLVlvdSB3aWxsIHdhbnQgdG8gY3JlYXRlIG9wZW5lcnMgaWYgeW91IHdhbnQgdG8gZmV0Y2ggVVJMcyB3aXRoCi1zcGVjaWZpYyBoYW5kbGVycyBpbnN0YWxsZWQsIGZvciBleGFtcGxlIHRvIGdldCBhbiBvcGVuZXIgdGhhdCBoYW5kbGVzCi1jb29raWVzLCBvciB0byBnZXQgYW4gb3BlbmVyIHRoYXQgZG9lcyBub3QgaGFuZGxlIHJlZGlyZWN0aW9ucy4KLQotVG8gY3JlYXRlIGFuIG9wZW5lciwgaW5zdGFudGlhdGUgYW4gT3BlbmVyRGlyZWN0b3IsIGFuZCB0aGVuIGNhbGwKLS5hZGRfaGFuZGxlcihzb21lX2hhbmRsZXJfaW5zdGFuY2UpIHJlcGVhdGVkbHkuCi0KLUFsdGVybmF0aXZlbHksIHlvdSBjYW4gdXNlIGBgYnVpbGRfb3BlbmVyYGAsIHdoaWNoIGlzIGEgY29udmVuaWVuY2UKLWZ1bmN0aW9uIGZvciBjcmVhdGluZyBvcGVuZXIgb2JqZWN0cyB3aXRoIGEgc2luZ2xlIGZ1bmN0aW9uIGNhbGwuCi1gYGJ1aWxkX29wZW5lcmBgIGFkZHMgc2V2ZXJhbCBoYW5kbGVycyBieSBkZWZhdWx0LCBidXQgcHJvdmlkZXMgYQotcXVpY2sgd2F5IHRvIGFkZCBtb3JlIGFuZC9vciBvdmVycmlkZSB0aGUgZGVmYXVsdCBoYW5kbGVycy4KLQotT3RoZXIgc29ydHMgb2YgaGFuZGxlcnMgeW91IG1pZ2h0IHdhbnQgdG8gY2FuIGhhbmRsZSBwcm94aWVzLAotYXV0aGVudGljYXRpb24sIGFuZCBvdGhlciBjb21tb24gYnV0IHNsaWdodGx5IHNwZWNpYWxpc2VkCi1zaXR1YXRpb25zLgotCi1gYGluc3RhbGxfb3BlbmVyYGAgY2FuIGJlIHVzZWQgdG8gbWFrZSBhbiBgYG9wZW5lcmBgIG9iamVjdCB0aGUKLShnbG9iYWwpIGRlZmF1bHQgb3BlbmVyLiBUaGlzIG1lYW5zIHRoYXQgY2FsbHMgdG8gYGB1cmxvcGVuYGAgd2lsbCB1c2UKLXRoZSBvcGVuZXIgeW91IGhhdmUgaW5zdGFsbGVkLgotCi1PcGVuZXIgb2JqZWN0cyBoYXZlIGFuIGBgb3BlbmBgIG1ldGhvZCwgd2hpY2ggY2FuIGJlIGNhbGxlZCBkaXJlY3RseQotdG8gZmV0Y2ggdXJscyBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlIGBgdXJsb3BlbmBgIGZ1bmN0aW9uOiB0aGVyZSdzIG5vCi1uZWVkIHRvIGNhbGwgYGBpbnN0YWxsX29wZW5lcmBgLCBleGNlcHQgYXMgYSBjb252ZW5pZW5jZS4KLQotCi1CYXNpYyBBdXRoZW50aWNhdGlvbgotPT09PT09PT09PT09PT09PT09PT0KLQotVG8gaWxsdXN0cmF0ZSBjcmVhdGluZyBhbmQgaW5zdGFsbGluZyBhIGhhbmRsZXIgd2Ugd2lsbCB1c2UgdGhlCi1gYEhUVFBCYXNpY0F1dGhIYW5kbGVyYGAuIEZvciBhIG1vcmUgZGV0YWlsZWQgZGlzY3Vzc2lvbiBvZiB0aGlzCi1zdWJqZWN0IC0gaW5jbHVkaW5nIGFuIGV4cGxhbmF0aW9uIG9mIGhvdyBCYXNpYyBBdXRoZW50aWNhdGlvbiB3b3JrcyAtCi1zZWUgdGhlIGBCYXNpYyBBdXRoZW50aWNhdGlvbiBUdXRvcmlhbCAgPGh0dHA6Ly93d3cudm9pZHNwYWNlLm9yZy51ay9weXRob24vYXJ0aWNsZXMvYXV0aGVudGljYXRpb24uc2h0bWw+YF8uCi0KLVdoZW4gYXV0aGVudGljYXRpb24gaXMgcmVxdWlyZWQsIHRoZSBzZXJ2ZXIgc2VuZHMgYSBoZWFkZXIgKGFzIHdlbGwgYXMKLXRoZSA0MDEgZXJyb3IgY29kZSkgcmVxdWVzdGluZyBhdXRoZW50aWNhdGlvbi4gIFRoaXMgc3BlY2lmaWVzIHRoZQotYXV0aGVudGljYXRpb24gc2NoZW1lIGFuZCBhICdyZWFsbScuIFRoZSBoZWFkZXIgbG9va3MgbGlrZSA6Ci1gYFd3dy1hdXRoZW50aWNhdGU6IFNDSEVNRSByZWFsbT0iUkVBTE0iYGAuCi0KLWUuZy4gOjogCi0KLSAgICBXd3ctYXV0aGVudGljYXRlOiBCYXNpYyByZWFsbT0iY1BhbmVsIFVzZXJzIgotCi0KLVRoZSBjbGllbnQgc2hvdWxkIHRoZW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbmFtZSBhbmQKLXBhc3N3b3JkIGZvciB0aGUgcmVhbG0gaW5jbHVkZWQgYXMgYSBoZWFkZXIgaW4gdGhlIHJlcXVlc3QuIFRoaXMgaXMKLSdiYXNpYyBhdXRoZW50aWNhdGlvbicuIEluIG9yZGVyIHRvIHNpbXBsaWZ5IHRoaXMgcHJvY2VzcyB3ZSBjYW4KLWNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBgYEhUVFBCYXNpY0F1dGhIYW5kbGVyYGAgYW5kIGFuIG9wZW5lciB0byB1c2UKLXRoaXMgaGFuZGxlci4KLQotVGhlIGBgSFRUUEJhc2ljQXV0aEhhbmRsZXJgYCB1c2VzIGFuIG9iamVjdCBjYWxsZWQgYSBwYXNzd29yZCBtYW5hZ2VyCi10byBoYW5kbGUgdGhlIG1hcHBpbmcgb2YgVVJMcyBhbmQgcmVhbG1zIHRvIHBhc3N3b3JkcyBhbmQKLXVzZXJuYW1lcy4gSWYgeW91IGtub3cgd2hhdCB0aGUgcmVhbG0gaXMgKGZyb20gdGhlIGF1dGhlbnRpY2F0aW9uCi1oZWFkZXIgc2VudCBieSB0aGUgc2VydmVyKSwgdGhlbiB5b3UgY2FuIHVzZSBhCi1gYEhUVFBQYXNzd29yZE1ncmBgLiBGcmVxdWVudGx5IG9uZSBkb2Vzbid0IGNhcmUgd2hhdCB0aGUgcmVhbG0gaXMuIEluCi10aGF0IGNhc2UsIGl0IGlzIGNvbnZlbmllbnQgdG8gdXNlCi1gYEhUVFBQYXNzd29yZE1ncldpdGhEZWZhdWx0UmVhbG1gYC4gVGhpcyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgYQotZGVmYXVsdCB1c2VybmFtZSBhbmQgcGFzc3dvcmQgZm9yIGEgVVJMLiBUaGlzIHdpbGwgYmUgc3VwcGxpZWQgaW4gdGhlCi1hYnNlbmNlIG9mIHlvdSBwcm92aWRpbmcgYW4gYWx0ZXJuYXRpdmUgY29tYmluYXRpb24gZm9yIGEgc3BlY2lmaWMKLXJlYWxtLiBXZSBpbmRpY2F0ZSB0aGlzIGJ5IHByb3ZpZGluZyBgYE5vbmVgYCBhcyB0aGUgcmVhbG0gYXJndW1lbnQgdG8KLXRoZSBgYGFkZF9wYXNzd29yZGBgIG1ldGhvZC4KLQotVGhlIHRvcC1sZXZlbCBVUkwgaXMgdGhlIGZpcnN0IFVSTCB0aGF0IHJlcXVpcmVzIGF1dGhlbnRpY2F0aW9uLiBVUkxzCi0iZGVlcGVyIiB0aGFuIHRoZSBVUkwgeW91IHBhc3MgdG8gLmFkZF9wYXNzd29yZCgpIHdpbGwgYWxzbyBtYXRjaC4gOjoKLQotICAgICMgY3JlYXRlIGEgcGFzc3dvcmQgbWFuYWdlcgotICAgIHBhc3N3b3JkX21nciA9IHVybGxpYjIuSFRUUFBhc3N3b3JkTWdyV2l0aERlZmF1bHRSZWFsbSgpICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAjIEFkZCB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLgotICAgICMgSWYgd2Uga25ldyB0aGUgcmVhbG0sIHdlIGNvdWxkIHVzZSBpdCBpbnN0ZWFkIG9mIGBgTm9uZWBgLgotICAgIHRvcF9sZXZlbF91cmwgPSAiaHR0cDovL2V4YW1wbGUuY29tL2Zvby8iCi0gICAgcGFzc3dvcmRfbWdyLmFkZF9wYXNzd29yZChOb25lLCB0b3BfbGV2ZWxfdXJsLCB1c2VybmFtZSwgcGFzc3dvcmQpCi0KLSAgICBoYW5kbGVyID0gdXJsbGliMi5IVFRQQmFzaWNBdXRoSGFuZGxlcihwYXNzd29yZF9tZ3IpICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIyBjcmVhdGUgIm9wZW5lciIgKE9wZW5lckRpcmVjdG9yIGluc3RhbmNlKQotICAgIG9wZW5lciA9IHVybGxpYjIuYnVpbGRfb3BlbmVyKGhhbmRsZXIpICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICMgdXNlIHRoZSBvcGVuZXIgdG8gZmV0Y2ggYSBVUkwKLSAgICBvcGVuZXIub3BlbihhX3VybCkgICAgICAKLQotICAgICMgSW5zdGFsbCB0aGUgb3BlbmVyLgotICAgICMgTm93IGFsbCBjYWxscyB0byB1cmxsaWIyLnVybG9wZW4gdXNlIG91ciBvcGVuZXIuCi0gICAgdXJsbGliMi5pbnN0YWxsX29wZW5lcihvcGVuZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0uLiBub3RlOjoKLQotICAgIEluIHRoZSBhYm92ZSBleGFtcGxlIHdlIG9ubHkgc3VwcGxpZWQgb3VyIGBgSEhUUEJhc2ljQXV0aEhhbmRsZXJgYAotICAgIHRvIGBgYnVpbGRfb3BlbmVyYGAuIEJ5IGRlZmF1bHQgb3BlbmVycyBoYXZlIHRoZSBoYW5kbGVycyBmb3IKLSAgICBub3JtYWwgc2l0dWF0aW9ucyAtIGBgUHJveHlIYW5kbGVyYGAsIGBgVW5rbm93bkhhbmRsZXJgYCwKLSAgICBgYEhUVFBIYW5kbGVyYGAsIGBgSFRUUERlZmF1bHRFcnJvckhhbmRsZXJgYCwKLSAgICBgYEhUVFBSZWRpcmVjdEhhbmRsZXJgYCwgYGBGVFBIYW5kbGVyYGAsIGBgRmlsZUhhbmRsZXJgYCwKLSAgICBgYEhUVFBFcnJvclByb2Nlc3NvcmBgLgotCi10b3BfbGV2ZWxfdXJsIGlzIGluIGZhY3QgKmVpdGhlciogYSBmdWxsIFVSTCAoaW5jbHVkaW5nIHRoZSAnaHR0cDonCi1zY2hlbWUgY29tcG9uZW50IGFuZCB0aGUgaG9zdG5hbWUgYW5kIG9wdGlvbmFsbHkgdGhlIHBvcnQgbnVtYmVyKQotZS5nLiAiaHR0cDovL2V4YW1wbGUuY29tLyIgKm9yKiBhbiAiYXV0aG9yaXR5IiAoaS5lLiB0aGUgaG9zdG5hbWUsCi1vcHRpb25hbGx5IGluY2x1ZGluZyB0aGUgcG9ydCBudW1iZXIpIGUuZy4gImV4YW1wbGUuY29tIiBvcgotImV4YW1wbGUuY29tOjgwODAiICh0aGUgbGF0dGVyIGV4YW1wbGUgaW5jbHVkZXMgYSBwb3J0IG51bWJlcikuICBUaGUKLWF1dGhvcml0eSwgaWYgcHJlc2VudCwgbXVzdCBOT1QgY29udGFpbiB0aGUgInVzZXJpbmZvIiBjb21wb25lbnQgLSBmb3IKLWV4YW1wbGUgImpvZUBwYXNzd29yZDpleGFtcGxlLmNvbSIgaXMgbm90IGNvcnJlY3QuCi0KLQotUHJveGllcwotPT09PT09PQotCi0qKnVybGxpYjIqKiB3aWxsIGF1dG8tZGV0ZWN0IHlvdXIgcHJveHkgc2V0dGluZ3MgYW5kIHVzZSB0aG9zZS4gVGhpcwotaXMgdGhyb3VnaCB0aGUgYGBQcm94eUhhbmRsZXJgYCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBub3JtYWwgaGFuZGxlcgotY2hhaW4uIE5vcm1hbGx5IHRoYXQncyBhIGdvb2QgdGhpbmcsIGJ1dCB0aGVyZSBhcmUgb2NjYXNpb25zIHdoZW4gaXQKLW1heSBub3QgYmUgaGVscGZ1bCBbI11fLiBPbmUgd2F5IHRvIGRvIHRoaXMgaXMgdG8gc2V0dXAgb3VyIG93bgotYGBQcm94eUhhbmRsZXJgYCwgd2l0aCBubyBwcm94aWVzIGRlZmluZWQuIFRoaXMgaXMgZG9uZSB1c2luZyBzaW1pbGFyCi1zdGVwcyB0byBzZXR0aW5nIHVwIGEgYEJhc2ljIEF1dGhlbnRpY2F0aW9uYF8gaGFuZGxlciA6IDo6Ci0KLSAgICA+Pj4gcHJveHlfc3VwcG9ydCA9IHVybGxpYjIuUHJveHlIYW5kbGVyKHt9KQotICAgID4+PiBvcGVuZXIgPSB1cmxsaWIyLmJ1aWxkX29wZW5lcihwcm94eV9zdXBwb3J0KQotICAgID4+PiB1cmxsaWIyLmluc3RhbGxfb3BlbmVyKG9wZW5lcikKLQotLi4gbm90ZTo6Ci0KLSAgICBDdXJyZW50bHkgYGB1cmxsaWIyYGAgKmRvZXMgbm90KiBzdXBwb3J0IGZldGNoaW5nIG9mIGBgaHR0cHNgYAotICAgIGxvY2F0aW9ucyB0aHJvdWdoIGEgcHJveHkuICBIb3dldmVyLCB0aGlzIGNhbiBiZSBlbmFibGVkIGJ5IGV4dGVuZGluZwotICAgIHVybGxpYjIgYXMgc2hvd24gaW4gdGhlIHJlY2lwZSBbI11fLgotCi0KLVNvY2tldHMgYW5kIExheWVycwotPT09PT09PT09PT09PT09PT09Ci0KLVRoZSBQeXRob24gc3VwcG9ydCBmb3IgZmV0Y2hpbmcgcmVzb3VyY2VzIGZyb20gdGhlIHdlYiBpcwotbGF5ZXJlZC4gdXJsbGliMiB1c2VzIHRoZSBodHRwbGliIGxpYnJhcnksIHdoaWNoIGluIHR1cm4gdXNlcyB0aGUKLXNvY2tldCBsaWJyYXJ5LgotCi1BcyBvZiBQeXRob24gMi4zIHlvdSBjYW4gc3BlY2lmeSBob3cgbG9uZyBhIHNvY2tldCBzaG91bGQgd2FpdCBmb3IgYQotcmVzcG9uc2UgYmVmb3JlIHRpbWluZyBvdXQuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpbiBhcHBsaWNhdGlvbnMgd2hpY2gKLWhhdmUgdG8gZmV0Y2ggd2ViIHBhZ2VzLiBCeSBkZWZhdWx0IHRoZSBzb2NrZXQgbW9kdWxlIGhhcyAqbm8gdGltZW91dCoKLWFuZCBjYW4gaGFuZy4gQ3VycmVudGx5LCB0aGUgc29ja2V0IHRpbWVvdXQgaXMgbm90IGV4cG9zZWQgYXQgdGhlCi1odHRwbGliIG9yIHVybGxpYjIgbGV2ZWxzLiAgSG93ZXZlciwgeW91IGNhbiBzZXQgdGhlIGRlZmF1bHQgdGltZW91dAotZ2xvYmFsbHkgZm9yIGFsbCBzb2NrZXRzIHVzaW5nIDogOjoKLQotICAgIGltcG9ydCBzb2NrZXQKLSAgICBpbXBvcnQgdXJsbGliMgotCi0gICAgIyB0aW1lb3V0IGluIHNlY29uZHMKLSAgICB0aW1lb3V0ID0gMTAKLSAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQodGltZW91dCkgCi0KLSAgICAjIHRoaXMgY2FsbCB0byB1cmxsaWIyLnVybG9wZW4gbm93IHVzZXMgdGhlIGRlZmF1bHQgdGltZW91dAotICAgICMgd2UgaGF2ZSBzZXQgaW4gdGhlIHNvY2tldCBtb2R1bGUKLSAgICByZXEgPSB1cmxsaWIyLlJlcXVlc3QoJ2h0dHA6Ly93d3cudm9pZHNwYWNlLm9yZy51aycpCi0gICAgcmVzcG9uc2UgPSB1cmxsaWIyLnVybG9wZW4ocmVxKQotCi0KLS0tLS0tLS0KLQotCi1Gb290bm90ZXMKLT09PT09PT09PQotCi1UaGlzIGRvY3VtZW50IHdhcyByZXZpZXdlZCBhbmQgcmV2aXNlZCBieSBKb2huIExlZS4KLQotLi4gWyNdIEZvciBhbiBpbnRyb2R1Y3Rpb24gdG8gdGhlIENHSSBwcm90b2NvbCBzZWUKLSAgICAgICBgV3JpdGluZyBXZWIgQXBwbGljYXRpb25zIGluIFB5dGhvbiA8aHR0cDovL3d3dy5weXppbmUuY29tL0lzc3VlMDA4L1NlY3Rpb25fQXJ0aWNsZXMvYXJ0aWNsZV9DR0lPbmUuaHRtbD5gXy4gCi0uLiBbI10gTGlrZSBHb29nbGUgZm9yIGV4YW1wbGUuIFRoZSAqcHJvcGVyKiB3YXkgdG8gdXNlIGdvb2dsZSBmcm9tIGEgcHJvZ3JhbQotICAgICAgIGlzIHRvIHVzZSBgUHlHb29nbGUgPGh0dHA6Ly9weWdvb2dsZS5zb3VyY2Vmb3JnZS5uZXQ+YF8gb2YgY291cnNlLiBTZWUKLSAgICAgICBgVm9pZHNwYWNlIEdvb2dsZSA8aHR0cDovL3d3dy52b2lkc3BhY2Uub3JnLnVrL3B5dGhvbi9yZWNpcGVib29rLnNodG1sI2dvb2dsZT5gXwotICAgICAgIGZvciBzb21lIGV4YW1wbGVzIG9mIHVzaW5nIHRoZSBHb29nbGUgQVBJLgotLi4gWyNdIEJyb3dzZXIgc25pZmZpbmcgaXMgYSB2ZXJ5IGJhZCBwcmFjdGlzZSBmb3Igd2Vic2l0ZSBkZXNpZ24gLSBidWlsZGluZwotICAgICAgIHNpdGVzIHVzaW5nIHdlYiBzdGFuZGFyZHMgaXMgbXVjaCBtb3JlIHNlbnNpYmxlLiBVbmZvcnR1bmF0ZWx5IGEgbG90IG9mCi0gICAgICAgc2l0ZXMgc3RpbGwgc2VuZCBkaWZmZXJlbnQgdmVyc2lvbnMgdG8gZGlmZmVyZW50IGJyb3dzZXJzLgotLi4gWyNdIFRoZSB1c2VyIGFnZW50IGZvciBNU0lFIDYgaXMKLSAgICAgICAqJ01vemlsbGEvNC4wIChjb21wYXRpYmxlOyBNU0lFIDYuMDsgV2luZG93cyBOVCA1LjE7IFNWMTsgLk5FVCBDTFIgMS4xLjQzMjIpJyoKLS4uIFsjXSBGb3IgZGV0YWlscyBvZiBtb3JlIEhUVFAgcmVxdWVzdCBoZWFkZXJzLCBzZWUKLSAgICAgICBgUXVpY2sgUmVmZXJlbmNlIHRvIEhUVFAgSGVhZGVyc2BfLgotLi4gWyNdIEluIG15IGNhc2UgSSBoYXZlIHRvIHVzZSBhIHByb3h5IHRvIGFjY2VzcyB0aGUgaW50ZXJuZXQgYXQgd29yay4gSWYgeW91Ci0gICAgICAgYXR0ZW1wdCB0byBmZXRjaCAqbG9jYWxob3N0KiBVUkxzIHRocm91Z2ggdGhpcyBwcm94eSBpdCBibG9ja3MgdGhlbS4gSUUKLSAgICAgICBpcyBzZXQgdG8gdXNlIHRoZSBwcm94eSwgd2hpY2ggdXJsbGliMiBwaWNrcyB1cCBvbi4gSW4gb3JkZXIgdG8gdGVzdAotICAgICAgIHNjcmlwdHMgd2l0aCBhIGxvY2FsaG9zdCBzZXJ2ZXIsIEkgaGF2ZSB0byBwcmV2ZW50IHVybGxpYjIgZnJvbSB1c2luZwotICAgICAgIHRoZSBwcm94eS4KLS4uIFsjXSB1cmxsaWIyIG9wZW5lciBmb3IgU1NMIHByb3h5IChDT05ORUNUIG1ldGhvZCk6IGBBU1BOIENvb2tib29rIFJlY2lwZSAKLSAgICAgICA8aHR0cDovL2FzcG4uYWN0aXZlc3RhdGUuY29tL0FTUE4vQ29va2Jvb2svUHl0aG9uL1JlY2lwZS80NTYxOTU+YF8uCi0gCmRpZmYgLS1naXQgYS9Eb2MvaHRtbC9hYm91dC5kYXQgYi9Eb2MvaHRtbC9hYm91dC5kYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZjhiNTUuLjAwMDAwMDAKLS0tIGEvRG9jL2h0bWwvYWJvdXQuZGF0CisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPHA+IFRoaXMgZG9jdW1lbnQgd2FzIGdlbmVyYXRlZCB1c2luZyB0aGUgPGEKLSAgICBocmVmPSJodHRwOi8vc2FmdHNhY2suZnMudW5pLWJheXJldXRoLmRlLztTUE10aWxkZTtsYXRleDJodC8iPgotICAgIDxzdHJvbmc+TGFUZVg8L3N0cm9uZz4yPHR0PkhUTUw8L3R0PjwvYT4gdHJhbnNsYXRvci4KLTwvcD4KLQotPHA+IDxhCi0gICAgaHJlZj0iaHR0cDovL3NhZnRzYWNrLmZzLnVuaS1iYXlyZXV0aC5kZS87U1BNdGlsZGU7bGF0ZXgyaHQvIj4KLSAgICA8c3Ryb25nPkxhVGVYPC9zdHJvbmc+Mjx0dD5IVE1MPC90dD48L2E+IGlzIENvcHlyaWdodCAmY29weTsKLSAgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgPGEKLSAgICBocmVmPSJodHRwOi8vY2JsLmxlZWRzLmFjLnVrL25pa29zL3BlcnNvbmFsLmh0bWwiPk5pa29zCi0gICAgRHJha29zPC9hPiwgQ29tcHV0ZXIgQmFzZWQgTGVhcm5pbmcgVW5pdCwgVW5pdmVyc2l0eSBvZgotICBMZWVkcywgYW5kIENvcHlyaWdodCAmY29weTsgMTk5NywgMTk5OCwgPGEKLSAgICBocmVmPSJodHRwOi8vd3d3Lm1hdGhzLm1xLmVkdS5hdS87U1BNdGlsZGU7cm9zcy8iPlJvc3MKLSAgICBNb29yZTwvYT4sIE1hdGhlbWF0aWNzIERlcGFydG1lbnQsIE1hY3F1YXJpZSBVbml2ZXJzaXR5LAotICBTeWRuZXkuCi08L3A+Ci0KLTxwPiBUaGUgYXBwbGljYXRpb24gb2YgPGEKLSAgICBocmVmPSJodHRwOi8vc2FmdHNhY2suZnMudW5pLWJheXJldXRoLmRlLztTUE10aWxkZTtsYXRleDJodC8iPgotICAgIDxzdHJvbmc+TGFUZVg8L3N0cm9uZz4yPHR0PkhUTUw8L3R0PjwvYT4gdG8gdGhlIFB5dGhvbgotICBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIGhlYXZpbHkgdGFpbG9yZWQgYnkgRnJlZCBMLiBEcmFrZSwKLSAgSnIuICBPcmlnaW5hbCBuYXZpZ2F0aW9uIGljb25zIHdlcmUgY29udHJpYnV0ZWQgYnkgQ2hyaXN0b3BoZXIKLSAgUGV0cmlsbGkuCi08L3A+CmRpZmYgLS1naXQgYS9Eb2MvaHRtbC9hYm91dC5odG1sIGIvRG9jL2h0bWwvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IxNWE2NS4uMDAwMDAwMAotLS0gYS9Eb2MvaHRtbC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotICA8aGVhZD4KLSAgICA8dGl0bGU+QWJvdXQgdGhlIFB5dGhvbiBEb2N1bWVudGF0aW9uPC90aXRsZT4KLSAgICA8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgIGNvbnRlbnQ9Ik92ZXJ2aWV3IGluZm9ybWF0aW9uIGFib3V0IHRoZSBQeXRob24gZG9jdW1lbnRhdGlvbiI+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICAgPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0iaW5kZXguaHRtbCIgdGl0bGU9IlB5dGhvbiBEb2N1bWVudGF0aW9uIEluZGV4Ij4KLSAgICA8bGluayByZWw9ImluZGV4IiBocmVmPSJtb2RpbmRleC5odG1sIiB0aXRsZT0iR2xvYmFsIE1vZHVsZSBJbmRleCI+Ci0gICAgPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iaW5kZXguaHRtbCIgdGl0bGU9IlB5dGhvbiBEb2N1bWVudGF0aW9uIEluZGV4Ij4KLSAgICA8bGluayByZWw9InVwIiBocmVmPSJpbmRleC5odG1sIiB0aXRsZT0iUHl0aG9uIERvY3VtZW50YXRpb24gSW5kZXgiPgotICAgIDxsaW5rIHJlbD0iU0hPUlRDVVQgSUNPTiIgaHJlZj0iaWNvbnMvcHlmYXYucG5nIiB0eXBlPSJpbWFnZS9wbmciPgotICAgIDxsaW5rIHJlbD0iU1RZTEVTSEVFVCIgaHJlZj0ibGliL2xpYi5jc3MiPgotICA8L2hlYWQ+Ci0gIDxib2R5PgotICAgIDxkaXYgY2xhc3M9Im5hdmlnYXRpb24iPgotICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjIiPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZD48aW1nIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIiBhbHQ9IiIKLSAgICAgICAgICAgICAgICBzcmM9Imljb25zL2JsYW5rLnBuZyI+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48YSBocmVmPSJpbmRleC5odG1sIgotICAgICAgICAgICAgICAgIHRpdGxlPSJQeXRob24gRG9jdW1lbnRhdGlvbiBJbmRleCI+PGltZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiCi0gICAgICAgICAgICAgICAgICBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiIGFsdD0idXAiCi0gICAgICAgICAgICAgICAgICBzcmM9Imljb25zL3VwLnBuZyI+PC9hPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGltZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCIgYWx0PSIiCi0gICAgICAgICAgICAgICAgc3JjPSJpY29ucy9ibGFuay5wbmciPjwvdGQ+Ci0gICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiPkFib3V0IHRoZSBQeXRob24gRG9jdW1lbnRhdGlvbjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGltZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCIgYWx0PSIiCi0gICAgICAgICAgICAgICAgc3JjPSJpY29ucy9ibGFuay5wbmciPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGltZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCIgYWx0PSIiCi0gICAgICAgICAgICAgICAgc3JjPSJpY29ucy9ibGFuay5wbmciPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGltZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCIgYWx0PSIiCi0gICAgICAgICAgICAgICAgc3JjPSJpY29ucy9ibGFuay5wbmciPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci0gICAgICA8YiBjbGFzcz0ibmF2bGFiZWwiPlVwOjwvYj4KLSAgICAgIDxzcGFuIGNsYXNzPSJzZWN0cmVmIj4KLSAgICAgICAgPGEgaHJlZj0iaW5kZXguaHRtbCIgdGl0bGU9IlB5dGhvbiBEb2N1bWVudGF0aW9uIEluZGV4Ij4KLSAgICAgICAgICBQeXRob24gRG9jdW1lbnRhdGlvbiBJbmRleDwvQT48L3NwYW4+Ci0gICAgICA8YnI+Ci0gICAgPC9kaXY+Ci0gICAgPGhyPgotCi0gICAgPGgyPkFib3V0IHRoZSBQeXRob24gRG9jdW1lbnRhdGlvbjwvaDI+Ci0KLSAgICA8cD5UaGUgUHl0aG9uIGRvY3VtZW50YXRpb24gd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBHdWlkbyB2YW4KLSAgICAgIFJvc3N1bSwgYnV0IGhhcyBpbmNyZWFzaW5nbHkgYmVjb21lIGEgY29tbXVuaXR5IGVmZm9ydCBvdmVyIHRoZQotICAgICAgcGFzdCBzZXZlcmFsIHllYXJzLiAgVGhpcyBncm93aW5nIGNvbGxlY3Rpb24gb2YgZG9jdW1lbnRzIGlzCi0gICAgICBhdmFpbGFibGUgaW4gc2V2ZXJhbCBmb3JtYXRzLCBpbmNsdWRpbmcgdHlwZXNldCB2ZXJzaW9ucyBpbiBQREYKLSAgICAgIGFuZCBQb3N0U2NyaXB0IGZvciBwcmludGluZywgZnJvbSB0aGUgPGEKLSAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5weXRob24ub3JnLyI+UHl0aG9uIFdlYiBzaXRlPC9hPi4KLQotICAgIDxwPkEgPGEgaHJlZj0iYWNrcy5odG1sIj5saXN0IG9mIGNvbnRyaWJ1dG9yczwvYT4gaXMgYXZhaWxhYmxlLgotCi0gICAgPGgyPkNvbW1lbnRzIGFuZCBRdWVzdGlvbnM8L2gyPgotCi0gICAgPHA+IEdlbmVyYWwgY29tbWVudHMgYW5kIHF1ZXN0aW9ucyByZWdhcmRpbmcgdGhpcyBkb2N1bWVudCBzaG91bGQKLSAgICAgIGJlIHNlbnQgYnkgZW1haWwgdG8gPGEgaHJlZj0ibWFpbHRvOmRvY3NAcHl0aG9uLm9yZyIKLSAgICAgICAgPmRvY3NAcHl0aG9uLm9yZzwvYT4uICBJZiB5b3UgZmluZCBzcGVjaWZpYyBlcnJvcnMgaW4KLSAgICAgIHRoaXMgZG9jdW1lbnQsIHBsZWFzZSByZXBvcnQgdGhlIGJ1ZyBhdCB0aGUgPGEKLSAgICAgICAgaHJlZj0iaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9idWdzLz9ncm91cF9pZD01NDcwIj5QeXRob24gQnVnCi0gICAgICAgIFRyYWNrZXI8L2E+IGF0IDxhIGhyZWY9Imh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvIj5Tb3VyY2VGb3JnZTwvYT4uCi0gICAgICBJZiB5b3UgYXJlIGFibGUgdG8gcHJvdmlkZSBzdWdnZXN0ZWQgdGV4dCwgZWl0aGVyIHRvIHJlcGxhY2UKLSAgICAgIGV4aXN0aW5nIGluY29ycmVjdCBvciB1bmNsZWFyIG1hdGVyaWFsLCBvciBhZGRpdGlvbmFsIHRleHQgdG8KLSAgICAgIHN1cHBsZW1lbnQgd2hhdCdzIGFscmVhZHkgYXZhaWxhYmxlLCB3ZSdkIGFwcHJlY2lhdGUgdGhlCi0gICAgICBjb250cmlidXRpb24uICBUaGVyZSdzIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgdGV4dCBtYXJrdXA7IG91cgotICAgICAgZG9jdW1lbnRhdGlvbiB0ZWFtIHdpbGwgZ2xhZGx5IHRha2UgY2FyZSBvZiB0aGF0LgotICAgIDwvcD4KLQotICAgIDxwPiBRdWVzdGlvbnMgcmVnYXJkaW5nIGhvdyB0byB1c2UgdGhlIGluZm9ybWF0aW9uIGluIHRoaXMKLSAgICAgIGRvY3VtZW50IHNob3VsZCBiZSBzZW50IHRvIHRoZSBQeXRob24gbmV3cyBncm91cCwgPGEKLSAgICAgICAgaHJlZj0ibmV3czpjb21wLmxhbmcucHl0aG9uIj5jb21wLmxhbmcucHl0aG9uPC9hPiwgb3IgdGhlIDxhCi0gICAgICAgIGhyZWY9Imh0dHA6Ly93d3cucHl0aG9uLm9yZy9tYWlsbWFuL2xpc3RpbmZvL3B5dGhvbi1saXN0IgotICAgICAgICA+UHl0aG9uIG1haWxpbmcgbGlzdDwvYT4gKHdoaWNoIGlzIGdhdGVkIHRvIHRoZSBuZXdzZ3JvdXAgYW5kCi0gICAgICBjYXJyaWVzIHRoZSBzYW1lIGNvbnRlbnQpLgotICAgIDwvcD4KLQotICAgIDxwPiBGb3IgYW55IG9mIHRoZXNlIGNoYW5uZWxzLCBwbGVhc2UgYmUgc3VyZSBub3QgdG8gc2VuZCBIVE1MIGVtYWlsLgotICAgICAgVGhhbmtzLgotICAgIDwvcD4KLQotICAgIDxocj4KLSAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvRG9jL2h0bWwvaWNvbnMvYmxhbmsuZ2lmIGIvRG9jL2h0bWwvaWNvbnMvYmxhbmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTMxZjRlLi4wMDAwMDAwCi0tLSBhL0RvYy9odG1sL2ljb25zL2JsYW5rLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0RvYy9odG1sL2ljb25zL2JsYW5rLnBuZyBiL0RvYy9odG1sL2ljb25zL2JsYW5rLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFmNTYzOS4uMDAwMDAwMAotLS0gYS9Eb2MvaHRtbC9pY29ucy9ibGFuay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9Eb2MvaHRtbC9pY29ucy9jb250ZW50cy5naWYgYi9Eb2MvaHRtbC9pY29ucy9jb250ZW50cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMjk5YzQuLjAwMDAwMDAKLS0tIGEvRG9jL2h0bWwvaWNvbnMvY29udGVudHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvRG9jL2h0bWwvaWNvbnMvY29udGVudHMucG5nIGIvRG9jL2h0bWwvaWNvbnMvY29udGVudHMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDI5YmUwLi4wMDAwMDAwCi0tLSBhL0RvYy9odG1sL2ljb25zL2NvbnRlbnRzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0RvYy9odG1sL2ljb25zL2luZGV4LmdpZiBiL0RvYy9odG1sL2ljb25zL2luZGV4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJlZWNmYi4uMDAwMDAwMAotLS0gYS9Eb2MvaHRtbC9pY29ucy9pbmRleC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9Eb2MvaHRtbC9pY29ucy9pbmRleC5wbmcgYi9Eb2MvaHRtbC9pY29ucy9pbmRleC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkOTE4YWYuLjAwMDAwMDAKLS0tIGEvRG9jL2h0bWwvaWNvbnMvaW5kZXgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvRG9jL2h0bWwvaWNvbnMvbW9kdWxlcy5naWYgYi9Eb2MvaHRtbC9pY29ucy9tb2R1bGVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU4NjBiNi4uMDAwMDAwMAotLS0gYS9Eb2MvaHRtbC9pY29ucy9tb2R1bGVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0RvYy9odG1sL2ljb25zL21vZHVsZXMucG5nIGIvRG9jL2h0bWwvaWNvbnMvbW9kdWxlcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYThiNzUuLjAwMDAwMDAKLS0tIGEvRG9jL2h0bWwvaWNvbnMvbW9kdWxlcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9Eb2MvaHRtbC9pY29ucy9uZXh0LmdpZiBiL0RvYy9odG1sL2ljb25zL25leHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGNhZmY4Li4wMDAwMDAwCi0tLSBhL0RvYy9odG1sL2ljb25zL25leHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvRG9jL2h0bWwvaWNvbnMvbmV4dC5wbmcgYi9Eb2MvaHRtbC9pY29ucy9uZXh0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZlNWU1MS4uMDAwMDAwMAotLS0gYS9Eb2MvaHRtbC9pY29ucy9uZXh0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0RvYy9odG1sL2ljb25zL3ByZXZpb3VzLmdpZiBiL0RvYy9odG1sL2ljb25zL3ByZXZpb3VzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUxZGExNi4uMDAwMDAwMAotLS0gYS9Eb2MvaHRtbC9pY29ucy9wcmV2aW91cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9Eb2MvaHRtbC9pY29ucy9wcmV2aW91cy5wbmcgYi9Eb2MvaHRtbC9pY29ucy9wcmV2aW91cy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5N2RlZjQuLjAwMDAwMDAKLS0tIGEvRG9jL2h0bWwvaWNvbnMvcHJldmlvdXMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvRG9jL2h0bWwvaWNvbnMvcHlmYXYuZ2lmIGIvRG9jL2h0bWwvaWNvbnMvcHlmYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODI3MWVkLi4wMDAwMDAwCi0tLSBhL0RvYy9odG1sL2ljb25zL3B5ZmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0RvYy9odG1sL2ljb25zL3B5ZmF2LnBuZyBiL0RvYy9odG1sL2ljb25zL3B5ZmF2LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJkODY2OS4uMDAwMDAwMAotLS0gYS9Eb2MvaHRtbC9pY29ucy9weWZhdi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9Eb2MvaHRtbC9pY29ucy91cC5naWYgYi9Eb2MvaHRtbC9pY29ucy91cC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZDNlMTMuLjAwMDAwMDAKLS0tIGEvRG9jL2h0bWwvaWNvbnMvdXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvRG9jL2h0bWwvaWNvbnMvdXAucG5nIGIvRG9jL2h0bWwvaWNvbnMvdXAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTBlMDI4Li4wMDAwMDAwCi0tLSBhL0RvYy9odG1sL2ljb25zL3VwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0RvYy9odG1sL2luZGV4Lmh0bWwuaW4gYi9Eb2MvaHRtbC9pbmRleC5odG1sLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTJmMWQ1Li4wMDAwMDAwCi0tLSBhL0RvYy9odG1sL2luZGV4Lmh0bWwuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotPGh0bWw+Ci0gIDxoZWFkPgotICAgIDx0aXRsZT5QeXRob24gQFJFTEVBU0VAIERvY3VtZW50YXRpb24gLSBAREFURUA8L3RpdGxlPgotICAgIDxtZXRhIG5hbWU9ImFlc29wIiBjb250ZW50PSJsaW5rcyI+Ci0gICAgPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgY29udGVudD0iVG9wLWxldmVsIGluZGV4IHRvIHRoZSBzdGFuZGFyZCBkb2N1bWVudGF0aW9uIGZvcgotICAgICAgICAgICAgICAgICAgIFB5dGhvbiBAUkVMRUFTRUAuIj4KLSAgICA8bGluayByZWw9IlNIT1JUQ1VUIElDT04iIGhyZWY9Imljb25zL3B5ZmF2LnBuZyIgdHlwZT0iaW1hZ2UvcG5nIj4KLSAgICA8bGluayByZWw9IlNUWUxFU0hFRVQiIGhyZWY9ImxpYi9saWIuY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+Ci0gICAgPGxpbmsgcmVsPSJhdXRob3IiIGhyZWY9ImFja3MuaHRtbCIgdGl0bGU9IkFja25vd2xlZGdlbWVudHMiPgotICAgIDxsaW5rIHJlbD0iaGVscCIgaHJlZj0iYWJvdXQuaHRtbCIgdGl0bGU9IkFib3V0IHRoZSBQeXRob24gRG9jdW1lbnRhdGlvbiI+Ci0gICAgPGxpbmsgcmVsPSJpbmRleCIgaHJlZj0ibW9kaW5kZXguaHRtbCIgdGl0bGU9Ikdsb2JhbCBNb2R1bGUgSW5kZXgiPgotICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci0gICAgICBhLnRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtc2l6ZTogMTEwJTsgfQotICAgICAgdWwgeyBtYXJnaW4tbGVmdDogMWVtOyBwYWRkaW5nOiAwcHQ7IGJvcmRlcjogMHB0OyB9Ci0gICAgICB1bCBsaSB7IG1hcmdpbi10b3A6IDAuMmVtOyB9Ci0gICAgICB0ZC5sZWZ0LWNvbHVtbiB7IHBhZGRpbmctcmlnaHQ6IDFlbTsgfQotICAgICAgdGQucmlnaHQtY29sdW1uIHsgcGFkZGluZy1sZWZ0OiAxZW07IH0KLSAgICA8L3N0eWxlPgotICA8L2hlYWQ+Ci0gIDxib2R5PgotCTxkaXYgY2xhc3M9Im5hdmlnYXRpb24iPgotCTx0YWJsZSBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIyIj4KLQk8dHI+Ci0JICA8dGQ+PGltZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCIgYWx0PSIiCi0JICAgICAgc3JjPSJpY29ucy9ibGFuay5wbmciPjwvdGQ+Ci0JICA8dGQ+PGltZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCIgYWx0PSIiCi0JICAgICAgc3JjPSJpY29ucy9ibGFuay5wbmciPjwvdGQ+Ci0JICA8dGQ+PGltZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCIgYWx0PSIiCi0JICAgICAgc3JjPSJpY29ucy9ibGFuay5wbmciPjwvdGQ+Ci0JICA8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiPgotCSAgICA8YiBjbGFzcz0idGl0bGUiPlB5dGhvbiBEb2N1bWVudGF0aW9uPC9iPjwvdGQ+Ci0JICA8dGQ+PGltZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCIgYWx0PSIiCi0JICAgICAgc3JjPSJpY29ucy9ibGFuay5wbmciPjwvdGQ+Ci0JICA8dGQ+PGEgaHJlZj0ibW9kaW5kZXguaHRtbCI+PGltZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiCi0JCWFsaWduPSJib3R0b20iIGJvcmRlcj0iMCIgYWx0PSJNb2R1bGUgSW5kZXgiCi0JCXNyYz0iaWNvbnMvbW9kdWxlcy5wbmciPjwvYT48L3RkPgotCSAgPHRkPjxpbWcgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiIGFsdD0iIgotCSAgICAgIHNyYz0iaWNvbnMvYmxhbmsucG5nIj48L0E+PC90ZD4KLQk8L3RyPgotCTwvdGFibGU+Ci0gICAgICAgIDxocj4KLQk8L2Rpdj4KLSAgICA8ZGl2IGFsaWduPSJjZW50ZXIiIGNsYXNzPSJ0aXRsZXBhZ2UiPgotICAgICAgPGgxPlB5dGhvbiBEb2N1bWVudGF0aW9uPC9oMT4KLQotICAgICAgPHA+Ci0JPHN0cm9uZz5SZWxlYXNlIEBSRUxFQVNFQDwvc3Ryb25nPgotCTxicj4KLQk8c3Ryb25nPkBEQVRFQDwvc3Ryb25nPgotICAgICAgPC9wPgotICAgIDwvZGl2PgotCi0gICAgPHRhYmxlIGFsaWduPSJjZW50ZXIiPgotICAgICAgPHRib2R5PgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIGNsYXNzPSJsZWZ0LWNvbHVtbiI+Ci0JICA8dWw+Ci0JICAgIDxsaT4gPGEgaHJlZj0idHV0L3R1dC5odG1sIiBjbGFzcz0idGl0bGUiPlR1dG9yaWFsPC9hPgotCSAgICAgIDxicj4oc3RhcnQgaGVyZSkKLQkgIDwvdWw+Ci0JICA8L3RkPgotCSAgPHRkIGNsYXNzPSJyaWdodC1jb2x1bW4iPgotCSAgPHVsPgotICAgICAgICAgICAgPGxpPiA8YSBocmVmPSJ3aGF0c25ldy9AV0hBVFNORVdALmh0bWwiIGNsYXNzPSJ0aXRsZSIKLSAgICAgICAgICAgICAgICA+V2hhdCdzIE5ldyBpbiBQeXRob248L2E+Ci0gICAgICAgICAgICAgIDxicj4oY2hhbmdlcyBzaW5jZSB0aGUgbGFzdCBtYWpvciByZWxlYXNlKQotCSAgPC91bD4KLQkgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJiYXNlbGluZSIgY2xhc3M9ImxlZnQtY29sdW1uIj4KLSAgICAgICAgICAmbmJzcDsKLQkgIDx1bD4KLQkgICAgPGxpPiA8YSBocmVmPSJtb2RpbmRleC5odG1sIiBjbGFzcz0idGl0bGUiPkdsb2JhbCBNb2R1bGUgSW5kZXg8L2E+Ci0JICAgICAgPGJyPihmb3IgcXVpY2sgYWNjZXNzIHRvIGFsbCBkb2N1bWVudGF0aW9uKQotCi0JICAgIDxsaT4gPGEgaHJlZj0ibGliL2xpYi5odG1sIiBjbGFzcz0idGl0bGUiPkxpYnJhcnkgUmVmZXJlbmNlPC9hPgotCSAgICAgIDxicj4oa2VlcCB0aGlzIHVuZGVyIHlvdXIgcGlsbG93KQotCi0JICAgIDxsaT4gPGEgaHJlZj0ibWFjL21hYy5odG1sIiBjbGFzcz0idGl0bGUiPk1hY2ludG9zaCBNb2R1bGUKLQkJUmVmZXJlbmNlPC9hPgotCSAgICAgIDxicj4odGhpcyB0b28sIGlmIHlvdSB1c2UgYSBNYWNpbnRvc2gpCi0KLQkgICAgPGxpPiA8YSBocmVmPSJpbnN0L2luc3QuaHRtbCIgY2xhc3M9InRpdGxlIj5JbnN0YWxsaW5nCi0JCVB5dGhvbiBNb2R1bGVzPC9hPgotCSAgICAgIDxicj4oZm9yIGFkbWluaXN0cmF0b3JzKQotCi0JICAgIDxsaT4gPGEgaHJlZj0iZGlzdC9kaXN0Lmh0bWwiIGNsYXNzPSJ0aXRsZSI+RGlzdHJpYnV0aW5nCi0JCVB5dGhvbiBNb2R1bGVzPC9hPgotCSAgICAgIDxicj4oZm9yIGRldmVsb3BlcnMgYW5kIHBhY2thZ2VycykKLQkgIDwvdWw+Ci0JICA8L3RkPgotCSAgPHRkIHZhbGlnbj0iYmFzZWxpbmUiIGNsYXNzPSJyaWdodC1jb2x1bW4iPgotICAgICAgICAgICZuYnNwOwotCSAgPHVsPgotCSAgICA8bGk+IDxhIGhyZWY9InJlZi9yZWYuaHRtbCIgY2xhc3M9InRpdGxlIj5MYW5ndWFnZSBSZWZlcmVuY2U8L2E+Ci0JICAgICAgPGJyPihmb3IgbGFuZ3VhZ2UgbGF3eWVycykKLQotCSAgICA8bGk+IDxhIGhyZWY9ImV4dC9leHQuaHRtbCIgY2xhc3M9InRpdGxlIj5FeHRlbmRpbmcgYW5kCi0JCUVtYmVkZGluZzwvYT4KLQkgICAgICA8YnI+KHR1dG9yaWFsIGZvciBDL0MrKyBwcm9ncmFtbWVycykKLQotCSAgICA8bGk+IDxhIGhyZWY9ImFwaS9hcGkuaHRtbCIgY2xhc3M9InRpdGxlIj5QeXRob24vQyBBUEk8L2E+Ci0JICAgICAgPGJyPihyZWZlcmVuY2UgZm9yIEMvQysrIHByb2dyYW1tZXJzKQotCi0JICAgIDxsaT4gPGEgaHJlZj0iZG9jL2RvYy5odG1sIiBjbGFzcz0idGl0bGUiPkRvY3VtZW50aW5nIFB5dGhvbjwvYT4KLQkgICAgICA8YnI+KGluZm9ybWF0aW9uIGZvciBkb2N1bWVudGF0aW9uIGF1dGhvcnMpCi0JICA8L3VsPgotCSAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249ImJhc2VsaW5lIiBjbGFzcz0ibGVmdC1jb2x1bW4iPgotICAgICAgICAgICZuYnNwOwotICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgIDxsaT4gPGEgaHJlZj0iaHR0cDovL3d3dy5weXRob24ub3JnL2RvYy8iIGNsYXNzPSJ0aXRsZSIKLSAgICAgICAgICAgICAgICA+RG9jdW1lbnRhdGlvbiBDZW50cmFsPC9hPgotICAgICAgICAgICAgICA8YnI+KGZvciBldmVyeW9uZSkKLSAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0iYmFzZWxpbmUiIGNsYXNzPSJyaWdodC1jb2x1bW4iPgotICAgICAgICAgICZuYnNwOwotICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgIDxsaT4gPGEgaHJlZj0iaHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9ob3d0by8iIGNsYXNzPSJ0aXRsZSIKLSAgICAgICAgICAgICAgICA+UHl0aG9uIEhvdy1UbyBHdWlkZXM8L2E+Ci0gICAgICAgICAgICAgIDxicj4oc3BlY2lhbCB0b3BpY3MpCi0gICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC90Ym9keT4KLSAgICA8L3RhYmxlPgotICAgIDxwPgotCi0gICAgPGFkZHJlc3M+Ci0gICAgICA8aHI+Ci0gICAgICBTZWUgPGk+PGEgaHJlZj0iYWJvdXQuaHRtbCI+QWJvdXQgdGhlIFB5dGhvbiBEb2N1bWVudGF0aW9uPC9hPjwvaT4KLSAgICAgIGZvciBpbmZvcm1hdGlvbiBvbiBzdWdnZXN0aW5nIGNoYW5nZXMuCi0gICAgPC9hZGRyZXNzPgotICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9Eb2MvaHRtbC9zdGRhYm91dC5kYXQgYi9Eb2MvaHRtbC9zdGRhYm91dC5kYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MDkzNTQuLjAwMDAwMDAKLS0tIGEvRG9jL2h0bWwvc3RkYWJvdXQuZGF0CisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPHA+IFRoaXMgZG9jdW1lbnQgd2FzIGdlbmVyYXRlZCB1c2luZyB0aGUgPGEKLSAgICBocmVmPSJodHRwOi8vc2FmdHNhY2suZnMudW5pLWJheXJldXRoLmRlLztTUE10aWxkZTtsYXRleDJodC8iPgotICAgIDxzdHJvbmc+TGFUZVg8L3N0cm9uZz4yPHR0PkhUTUw8L3R0PjwvYT4gdHJhbnNsYXRvci4KLTwvcD4KLQotPHA+IDxhCi0gICAgaHJlZj0iaHR0cDovL3NhZnRzYWNrLmZzLnVuaS1iYXlyZXV0aC5kZS87U1BNdGlsZGU7bGF0ZXgyaHQvIj4KLSAgICA8c3Ryb25nPkxhVGVYPC9zdHJvbmc+Mjx0dD5IVE1MPC90dD48L2E+IGlzIENvcHlyaWdodCAmY29weTsKLSAgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgPGEKLSAgICBocmVmPSJodHRwOi8vY2JsLmxlZWRzLmFjLnVrL25pa29zL3BlcnNvbmFsLmh0bWwiPk5pa29zCi0gICAgRHJha29zPC9hPiwgQ29tcHV0ZXIgQmFzZWQgTGVhcm5pbmcgVW5pdCwgVW5pdmVyc2l0eSBvZgotICBMZWVkcywgYW5kIENvcHlyaWdodCAmY29weTsgMTk5NywgMTk5OCwgPGEKLSAgICBocmVmPSJodHRwOi8vd3d3Lm1hdGhzLm1xLmVkdS5hdS87U1BNdGlsZGU7cm9zcy8iPlJvc3MKLSAgICBNb29yZTwvYT4sIE1hdGhlbWF0aWNzIERlcGFydG1lbnQsIE1hY3F1YXJpZSBVbml2ZXJzaXR5LAotICBTeWRuZXkuCi08L3A+Ci0KLTxwPiBUaGUgYXBwbGljYXRpb24gb2YgPGEKLSAgICBocmVmPSJodHRwOi8vc2FmdHNhY2suZnMudW5pLWJheXJldXRoLmRlLztTUE10aWxkZTtsYXRleDJodC8iPgotICAgIDxzdHJvbmc+TGFUZVg8L3N0cm9uZz4yPHR0PkhUTUw8L3R0PjwvYT4gdG8gdGhlIFB5dGhvbgotICBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIGhlYXZpbHkgdGFpbG9yZWQgYnkgRnJlZCBMLiBEcmFrZSwKLSAgSnIuICBPcmlnaW5hbCBuYXZpZ2F0aW9uIGljb25zIHdlcmUgY29udHJpYnV0ZWQgYnkgQ2hyaXN0b3BoZXIKLSAgUGV0cmlsbGkuCi08L3A+Ci0KLTxocj4KLQotPGgyPkNvbW1lbnRzIGFuZCBRdWVzdGlvbnM8L2gyPgotCi08cD4gR2VuZXJhbCBjb21tZW50cyBhbmQgcXVlc3Rpb25zIHJlZ2FyZGluZyB0aGlzIGRvY3VtZW50IHNob3VsZAotICBiZSBzZW50IGJ5IGVtYWlsIHRvIDxhIGhyZWY9Im1haWx0bzpkb2NzQHB5dGhvbi5vcmciCi0gICAgPmRvY3NAcHl0aG9uLm9yZzwvYT4uICBJZiB5b3UgZmluZCBzcGVjaWZpYyBlcnJvcnMgaW4KLSAgdGhpcyBkb2N1bWVudCwgZWl0aGVyIGluIHRoZSBjb250ZW50IG9yIHRoZSBwcmVzZW50YXRpb24sIHBsZWFzZQotICByZXBvcnQgdGhlIGJ1ZyBhdCB0aGUgPGEKLSAgICBocmVmPSJodHRwOi8vc291cmNlZm9yZ2UubmV0L2J1Z3MvP2dyb3VwX2lkPTU0NzAiPlB5dGhvbiBCdWcKLSAgICBUcmFja2VyPC9hPiBhdCA8YSBocmVmPSJodHRwOi8vc291cmNlZm9yZ2UubmV0LyI+U291cmNlRm9yZ2U8L2E+LgotICBJZiB5b3UgYXJlIGFibGUgdG8gcHJvdmlkZSBzdWdnZXN0ZWQgdGV4dCwgZWl0aGVyIHRvIHJlcGxhY2UKLSAgZXhpc3RpbmcgaW5jb3JyZWN0IG9yIHVuY2xlYXIgbWF0ZXJpYWwsIG9yIGFkZGl0aW9uYWwgdGV4dCB0bwotICBzdXBwbGVtZW50IHdoYXQncyBhbHJlYWR5IGF2YWlsYWJsZSwgd2UnZCBhcHByZWNpYXRlIHRoZQotICBjb250cmlidXRpb24uICBUaGVyZSdzIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgdGV4dCBtYXJrdXA7IG91cgotICBkb2N1bWVudGF0aW9uIHRlYW0gd2lsbCBnbGFkbHkgdGFrZSBjYXJlIG9mIHRoYXQuCi08L3A+Ci0KLTxwPiBRdWVzdGlvbnMgcmVnYXJkaW5nIGhvdyB0byB1c2UgdGhlIGluZm9ybWF0aW9uIGluIHRoaXMKLSAgZG9jdW1lbnQgc2hvdWxkIGJlIHNlbnQgdG8gdGhlIFB5dGhvbiBuZXdzIGdyb3VwLCA8YQotICAgIGhyZWY9Im5ld3M6Y29tcC5sYW5nLnB5dGhvbiI+Y29tcC5sYW5nLnB5dGhvbjwvYT4sIG9yIHRoZSA8YQotICAgIGhyZWY9Imh0dHA6Ly93d3cucHl0aG9uLm9yZy9tYWlsbWFuL2xpc3RpbmZvL3B5dGhvbi1saXN0IgotICAgID5QeXRob24gbWFpbGluZyBsaXN0PC9hPiAod2hpY2ggaXMgZ2F0ZWQgdG8gdGhlIG5ld3Nncm91cCBhbmQKLSAgY2FycmllcyB0aGUgc2FtZSBjb250ZW50KS4KLTwvcD4KLQotPHA+IEZvciBhbnkgb2YgdGhlc2UgY2hhbm5lbHMsIHBsZWFzZSBiZSBzdXJlIG5vdCB0byBzZW5kIEhUTUwgZW1haWwuCi0gIFRoYW5rcy4KLTwvcD4KZGlmZiAtLWdpdCBhL0RvYy9odG1sL3N0eWxlLmNzcyBiL0RvYy9odG1sL3N0eWxlLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBhMjA4Ni4uMDAwMDAwMAotLS0gYS9Eb2MvaHRtbC9zdHlsZS5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyoKLSAqIFRoZSBmaXJzdCBwYXJ0IG9mIHRoaXMgaXMgdGhlIHN0YW5kYXJkIENTUyBnZW5lcmF0ZWQgYnkgTGFUZVgySFRNTCwKLSAqIHdpdGggdGhlICJlbXB0eSIgZGVjbGFyYXRpb25zIHJlbW92ZWQuCi0gKi8KLQotLyogQ2VudHVyeSBTY2hvb2xib29rIGZvbnQgaXMgdmVyeSBzaW1pbGFyIHRvIENvbXB1dGVyIE1vZGVybiBNYXRoOiBjbW1pICovCi0ubWF0aCAgICAgICAgICAgICAgICAgICB7IGZvbnQtZmFtaWx5OiAiQ2VudHVyeSBTY2hvb2xib29rIiwgc2VyaWY7IH0KLS5tYXRoIGkgICAgICAgICAgICAgICAgIHsgZm9udC1mYW1pbHk6ICJDZW50dXJ5IFNjaG9vbGJvb2siLCBzZXJpZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmJvbGRtYXRoICAgICAgICAgICAgICAgeyBmb250LWZhbWlseTogIkNlbnR1cnkgU2Nob29sYm9vayIsIHNlcmlmOwotICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXdlaWdodDogYm9sZCB9Ci0KLS8qCi0gKiBJbXBsZW1lbnQgYm90aCBmaXhlZC1zaXplIGFuZCByZWxhdGl2ZSBzaXplcy4KLSAqCi0gKiBJIHRoaW5rIHRoZXNlIGNhbiBiZSBzYWZlbHkgcmVtb3ZlZCwgYXMgaXQgZG9lc24ndCBhcHBlYXIgdGhhdAotICogTGFUZVgySFRNTCBldmVyIGdlbmVyYXRlcyB0aGVzZSwgZXZlbiB0aG91Z2ggdGhlc2UgYXJlIGNhcnJpZWQKLSAqIG92ZXIgZnJvbSB0aGUgTGFUZVgySFRNTCBzdHlsZXNoZWV0LgotICovCi1zbWFsbC54dGlueSAgICAgICAgICAgICB7IGZvbnQtc2l6ZSA6IHh4LXNtYWxsOyB9Ci1zbWFsbC50aW55ICAgICAgICAgICAgICB7IGZvbnQtc2l6ZSA6IHgtc21hbGw7IH0KLXNtYWxsLnNjcmlwdHNpemUgICAgICAgIHsgZm9udC1zaXplIDogc21hbGxlcjsgfQotc21hbGwuZm9vdG5vdGVzaXplICAgICAgeyBmb250LXNpemUgOiBzbWFsbDsgfQotYmlnLnhsYXJnZSAgICAgICAgICAgICAgeyBmb250LXNpemUgOiBsYXJnZTsgfQotYmlnLnh4bGFyZ2UgICAgICAgICAgICAgeyBmb250LXNpemUgOiB4LWxhcmdlOyB9Ci1iaWcuaHVnZSAgICAgICAgICAgICAgICB7IGZvbnQtc2l6ZSA6IGxhcmdlcjsgfQotYmlnLnhodWdlICAgICAgICAgICAgICAgeyBmb250LXNpemUgOiB4eC1sYXJnZTsgfQotCi0vKgotICogRG9jdW1lbnQtc3BlY2lmaWMgc3R5bGVzIGNvbWUgbmV4dDsKLSAqIHRoZXNlIGFyZSBhZGRlZCBmb3IgdGhlIFB5dGhvbiBkb2N1bWVudGF0aW9uLgotICoKLSAqIE5vdGUgdGhhdCB0aGUgc2l6ZSBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIEgqIGVsZW1lbnRzIGFyZSBiZWNhdXNlCi0gKiBOZXRzY2FwZSBvbiBTb2xhcmlzIG90aGVyd2lzZSBkb2Vzbid0IGdldCBpdCByaWdodDsgdGhleSBhbGwgZW5kIHVwCi0gKiB0aGUgbm9ybWFsIHRleHQgc2l6ZS4KLSAqLwotCi1ib2R5ICAgICAgICAgICAgICAgICAgICB7IGNvbG9yOiAjMDAwMDAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOyB9Ci0KLWE6bGluazphY3RpdmUgICAgICAgICAgIHsgY29sb3I6ICNmZjAwMDA7IH0KLWE6bGluazpob3ZlciAgICAgICAgICAgIHsgYmFja2dyb3VuZC1jb2xvcjogI2JiZWVmZjsgfQotYTp2aXNpdGVkOmhvdmVyICAgICAgICAgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjYmJlZWZmOyB9Ci1hOnZpc2l0ZWQgICAgICAgICAgICAgICB7IGNvbG9yOiAjNTUxYThiOyB9Ci1hOmxpbmsgICAgICAgICAgICAgICAgICB7IGNvbG9yOiAjMDAwMGJiOyB9Ci0KLWgxLCBoMiwgaDMsIGg0LCBoNSwgaDYgIHsgZm9udC1mYW1pbHk6IGF2YW50Z2FyZGUsIHNhbnMtc2VyaWY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci1oMSAgICAgICAgICAgICAgICAgICAgICB7IGZvbnQtc2l6ZTogMTgwJTsgfQotaDIgICAgICAgICAgICAgICAgICAgICAgeyBmb250LXNpemU6IDE1MCU7IH0KLWgzLCBoNCAgICAgICAgICAgICAgICAgIHsgZm9udC1zaXplOiAxMjAlOyB9Ci0KLS8qIFRoZXNlIGFyZSBzZWN0aW9uIHRpdGxlcyB1c2VkIGluIG5hdmlnYXRpb24gbGlua3MsIHNvIG1ha2Ugc3VyZSB3ZQotICogbWF0Y2ggdGhlIHNlY3Rpb24gaGVhZGVyIGZvbnQgaGVyZSwgZXZlbiBpdCBub3QgdGhlIHdlaWdodC4KLSAqLwotLnNlY3RyZWYgICAgICAgICAgICAgICAgeyBmb250LWZhbWlseTogYXZhbnRnYXJkZSwgc2Fucy1zZXJpZjsgfQotLyogQW5kIHRoZSBsYWJlbCBiZWZvcmUgdGhlIHRpdGxlcyBpbiBuYXZpZ2F0aW9uOiAqLwotLm5hdmxhYmVsICAgICAgICAgICAgICAgeyBmb250LXNpemU6IDg1JTsgfQotCi0KLS8qIExhVGVYMkhUTUwgaW5zaXN0cyBvbiBpbnNlcnRpbmcgPGJyPiBlbGVtZW50cyBpbnRvIGhlYWRlcnMgd2hpY2gKLSAqIGFyZSBtYXJrZWQgd2l0aCBcbGFiZWwuICBUaGlzIGxpdHRsZSBiaXQgb2YgQ1NTIG1hZ2ljIGVuc3VyZXMgdGhhdAotICogdGhlc2UgZWxlbWVudHMgZG9uJ3QgY2F1c2Ugc3B1cmlvdXMgd2hpdGVzcGFjZSB0byBiZSBhZGRlZC4KLSAqLwotaDE+YnIsIGgyPmJyLCBoMz5iciwKLWg0PmJyLCBoNT5iciwgaDY+YnIgICAgIHsgZGlzcGxheTogbm9uZTsgfQotCi1jb2RlLCB0dCAgICAgICAgICAgICAgICB7IGZvbnQtZmFtaWx5OiAibHVjaWRhIHR5cGV3cml0ZXIiLCBsdWNpZGF0eXBld3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9ub3NwYWNlOyB9Ci12YXIgICAgICAgICAgICAgICAgICAgICB7IGZvbnQtZmFtaWx5OiB0aW1lcywgc2VyaWY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsgfQotCi0uVW5peCAgICAgICAgICAgICAgICAgICB7IGZvbnQtdmFyaWFudDogc21hbGwtY2FwczsgfQotCi0udHlwZWxhYmVsICAgICAgICAgICAgICB7IGZvbnQtZmFtaWx5OiBsdWNpZGEsIHNhbnMtc2VyaWY7IH0KLQotLm5hdmlnYXRpb24gdGQgICAgICAgICAgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjOTljY2ZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1mYW1pbHk6IGF2YW50Z2FyZGUsIHNhbnMtc2VyaWY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTEwJTsgfQotCi1kaXYud2FybmluZyAgICAgICAgICAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZhZjA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogdGhpbiBzb2xpZCBibGFjazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogMWVtOwotICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4tbGVmdDogMmVtOwotICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDJlbTsgfQotCi1kaXYud2FybmluZyAubGFiZWwgICAgICB7IGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOwotICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDExMCU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbi1yaWdodDogMC41ZW07IH0KLQotZGl2Lm5vdGUgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmYWYwOwotICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IHRoaW4gc29saWQgYmxhY2s7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDFlbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDJlbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OiAyZW07IH0KLQotZGl2Lm5vdGUgLmxhYmVsICAgICAgICAgeyBtYXJnaW4tcmlnaHQ6IDAuNWVtOwotICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsgfQotCi0udmVyc2lvbm5vdGUxICAgICAgICAgICB7IGRpc3BsYXk6IG5vbmU7IH0KLS52ZXJzaW9ubm90ZTIgICAgICAgICAgIHsgZGlzcGxheTogbm9uZTsgfQotCi1hZGRyZXNzICAgICAgICAgICAgICAgICB7IGZvbnQtc2l6ZTogODAlOyB9Ci0ucmVsZWFzZS1pbmZvICAgICAgICAgICB7IGZvbnQtc3R5bGU6IGl0YWxpYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOiA4MCU7IH0KLQotLnRpdGxlZ3JhcGhpYyAgICAgICAgICAgeyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyB9Ci0KLS52ZXJiYXRpbSBwcmUgICAgICAgICAgIHsgY29sb3I6ICMwMDAwOGI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiAibHVjaWRhIHR5cGV3cml0ZXIiLCBsdWNpZGF0eXBld3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9ub3NwYWNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDkwJTsgfQotLnZlcmJhdGltICAgICAgICAgICAgICAgeyBtYXJnaW4tbGVmdDogMmVtOyB9Ci0udmVyYmF0aW0gLmZvb3RlciAgICAgICB7IHBhZGRpbmc6IDAuMDVpbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOiA4NSU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICM5OWNjZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbi1yaWdodDogMC41aW47IH0KLQotLmdyYW1tYXIgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjOTljY2ZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDAuNWluOwotICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAwLjA1aW47IH0KLS5ncmFtbWFyLWZvb3RlciAgICAgICAgIHsgcGFkZGluZzogMC4wNWluOwotICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDg1JTsgfQotLmdyYW1tYXJ0b2tlbiAgICAgICAgICAgeyBmb250LWZhbWlseTogImx1Y2lkYSB0eXBld3JpdGVyIiwgbHVjaWRhdHlwZXdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbm9zcGFjZTsgfQotCi0ucHJvZHVjdGlvbnMgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtY29sb3I6ICNiYmVlZmY7IH0KLS5wcm9kdWN0aW9ucyBhOmFjdGl2ZSAgICAgICAgIHsgY29sb3I6ICNmZjAwMDA7IH0KLS5wcm9kdWN0aW9ucyBhOmxpbms6aG92ZXIgICAgIHsgYmFja2dyb3VuZC1jb2xvcjogIzk5Y2NmZjsgfQotLnByb2R1Y3Rpb25zIGE6dmlzaXRlZDpob3ZlciAgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjOTljY2ZmOyB9Ci0ucHJvZHVjdGlvbnMgYTp2aXNpdGVkICAgICAgICB7IGNvbG9yOiAjNTUxYThiOyB9Ci0ucHJvZHVjdGlvbnMgYTpsaW5rICAgICAgICAgICB7IGNvbG9yOiAjMDAwMGJiOyB9Ci0ucHJvZHVjdGlvbnMgdGFibGUgICAgICAgICAgICB7IHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHktY2VsbHM6IHNob3c7IH0KLS5wcm9kdWN0aW9ucyA+IHRhYmxlIHRkLAotLnByb2R1Y3Rpb25zID4gdGFibGUgdGggICAgICAgeyBwYWRkaW5nOiAycHg7IH0KLS5wcm9kdWN0aW9ucyA+IHRhYmxlIHRkOmZpcnN0LWNoaWxkLAotLnByb2R1Y3Rpb25zID4gdGFibGUgdGQ6bGFzdC1jaGlsZCB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiAibHVjaWRhIHR5cGV3cml0ZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHVjaWRhdHlwZXdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbm9zcGFjZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotLyogc2FtZSBhcyB0aGUgc2Vjb25kIHNlbGVjdG9yIGFib3ZlLCBidXQgZXhwcmVzc2VkIGRpZmZlcmVudGx5IGZvciBPcGVyYSAqLwotLnByb2R1Y3Rpb25zID4gdGFibGUgdGQ6Zmlyc3QtY2hpbGQgKyB0ZCArIHRkIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1mYW1pbHk6ICJsdWNpZGEgdHlwZXdyaXRlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdWNpZGF0eXBld3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9ub3NwYWNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLS5wcm9kdWN0aW9ucyA+IHRhYmxlIHRkOmZpcnN0LWNoaWxkICsgdGQgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDFlbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZy1yaWdodDogMWVtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0ucHJvZHVjdGlvbnMgPiB0YWJsZSB0ciAgICAgICB7IHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsgfQotCi0uZW1haWwgICAgICAgICAgICAgICAgICB7IGZvbnQtZmFtaWx5OiBhdmFudGdhcmRlLCBzYW5zLXNlcmlmOyB9Ci0ubWFpbGhlYWRlciAgICAgICAgICAgICB7IGZvbnQtZmFtaWx5OiBhdmFudGdhcmRlLCBzYW5zLXNlcmlmOyB9Ci0ubWltZXR5cGUgICAgICAgICAgICAgICB7IGZvbnQtZmFtaWx5OiBhdmFudGdhcmRlLCBzYW5zLXNlcmlmOyB9Ci0ubmV3c2dyb3VwICAgICAgICAgICAgICB7IGZvbnQtZmFtaWx5OiBhdmFudGdhcmRlLCBzYW5zLXNlcmlmOyB9Ci0udXJsICAgICAgICAgICAgICAgICAgICB7IGZvbnQtZmFtaWx5OiBhdmFudGdhcmRlLCBzYW5zLXNlcmlmOyB9Ci0uZmlsZSAgICAgICAgICAgICAgICAgICB7IGZvbnQtZmFtaWx5OiBhdmFudGdhcmRlLCBzYW5zLXNlcmlmOyB9Ci0uZ3VpbGFiZWwgICAgICAgICAgICAgICB7IGZvbnQtZmFtaWx5OiBhdmFudGdhcmRlLCBzYW5zLXNlcmlmOyB9Ci0KLS5yZWFsdGFibGUgICAgICAgICAgICAgIHsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiBibGFjazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXN0eWxlOiBzb2xpZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXdpZHRoOiAwcHggMHB4IDJweCAwcHg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5LWNlbGxzOiBzaG93OwotICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4tbGVmdDogYXV0bzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OiBhdXRvOwotICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDAuNGVtOwotICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiAwLjRlbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotLnJlYWx0YWJsZSB0Ym9keSAgICAgICAgeyB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7IH0KLS5yZWFsdGFibGUgdGZvb3QgICAgICAgIHsgZGlzcGxheTogdGFibGUtZm9vdGVyLWdyb3VwOyB9Ci0ucmVhbHRhYmxlIHRoZWFkICAgICAgICB7IGJhY2tncm91bmQtY29sb3I6ICM5OWNjZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci13aWR0aDogMHB4IDBweCAycHggMXB4OwotICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiB0YWJsZS1oZWFkZXItZ3JvdXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBhdmFudGdhcmRlLCBzYW5zLXNlcmlmOwotICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0ucmVhbHRhYmxlIHRoZWFkIDpmaXJzdC1jaGlsZCB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci13aWR0aDogMHB4IDBweCAycHggMHB4OwotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0ucmVhbHRhYmxlIHRoZWFkIHRoICAgICB7IGJvcmRlci13aWR0aDogMHB4IDBweCAycHggMXB4IH0KLS5yZWFsdGFibGUgdGQsCi0ucmVhbHRhYmxlIHRoICAgICAgICAgICB7IGJvcmRlci1jb2xvcjogYmxhY2s7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1zdHlsZTogc29saWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci13aWR0aDogMHB4IDBweCAxcHggMXB4OwotICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDAuNGVtOwotICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiAwLjRlbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotLnJlYWx0YWJsZSB0ZDpmaXJzdC1jaGlsZCwKLS5yZWFsdGFibGUgdGg6Zmlyc3QtY2hpbGQgewotICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItbGVmdC13aWR0aDogMHB4OwotICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLS5jZW50ZXIgICAgICAgICAgICAgICAgIHsgdGV4dC1hbGlnbjogY2VudGVyOyB9Ci0ubGVmdCAgICAgICAgICAgICAgICAgICB7IHRleHQtYWxpZ246IGxlZnQ7IH0KLS5yaWdodCAgICAgICAgICAgICAgICAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IH0KLQotLnJlZmNvdW50LWluZm8gICAgICAgICAgeyBmb250LXN0eWxlOiBpdGFsaWM7IH0KLS5yZWZjb3VudC1pbmZvIC52YWx1ZSAgIHsgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAjMDA2NjAwOyB9Ci0KLS8qCi0gKiBTb21lIGRlY29yYXRpb24gZm9yIHRoZSAiU2VlIGFsc286IiBibG9ja3MsIGluIHBhcnQgaW5zcGlyZWQgYnkgc29tZSBvZgotICogdGhlIHN0eWxpbmcgb24gTGFycyBNYXJpdXMgR2Fyc2hvbCdzIFhTQSBwYWdlcy4KLSAqIChUaGUgYmx1ZSBpbiB0aGUgbmF2aWdhdGlvbiBiYXJzIGlzICM5OUNDRkYuKQotICovCi0uc2VlYWxzbyAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZhZjA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogdGhpbiBzb2xpZCBibGFjazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogMHB0IDFlbSA0cHQgMWVtOyB9Ci0KLS5zZWVhbHNvID4gLmhlYWRpbmcgICAgIHsgZm9udC1zaXplOiAxMTAlOwotICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDsgfQotCi0vKgotICogQ2xhc3MgJ2F2YWlsYWJpbGl0eScgaXMgdXNlZCBmb3IgbW9kdWxlIGF2YWlsYWJpbGl0eSBzdGF0ZW1lbnRzIGF0Ci0gKiB0aGUgdG9wIG9mIG1vZHVsZXMuCi0gKi8KLS5hdmFpbGFiaWxpdHkgLnBsYXRmb3JtIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLQotCi0vKgotICogQWRkaXRpb25hbCBzdHlsZXMgZm9yIHRoZSBkaXN0dXRpbHMgcGFja2FnZS4KLSAqLwotLmR1LWNvbW1hbmQgICAgICAgICAgICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyB9Ci0uZHUtb3B0aW9uICAgICAgICAgICAgICB7IGZvbnQtZmFtaWx5OiBhdmFudGdhcmRlLCBzYW5zLXNlcmlmOyB9Ci0uZHUtZmlsZXZhciAgICAgICAgICAgICB7IGZvbnQtZmFtaWx5OiBhdmFudGdhcmRlLCBzYW5zLXNlcmlmOwotICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7IH0KLS5kdS14eHg6YmVmb3JlICAgICAgICAgIHsgY29udGVudDogIioqICI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0uZHUteHh4OmFmdGVyICAgICAgICAgICB7IGNvbnRlbnQ6ICIgKioiOwotICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDsgfQotCi0KLS8qCi0gKiBTb21lIHNwZWNpYWxpemF0aW9uIGZvciBwcmludGVkIG91dHB1dC4KLSAqLwotQG1lZGlhIHByaW50IHsKLSAgLm9ubGluZS1uYXZpZ2F0aW9uICAgIHsgZGlzcGxheTogbm9uZTsgfQotICB9CmRpZmYgLS1naXQgYS9Eb2MvaW5mby9NYWtlZmlsZSBiL0RvYy9pbmZvL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWEwMzdiLi4wMDAwMDAwCi0tLSBhL0RvYy9pbmZvL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotIyBHZW5lcmF0ZSB0aGUgUHl0aG9uICJpbmZvIiBkb2N1bWVudGF0aW9uLgotCi1UT1BESVI9Li4KLVRPT0xTRElSPSQoVE9QRElSKS90b29scwotSFRNTERJUj0kKFRPUERJUikvaHRtbAotCi0jIFRoZSBlbWFjcyBiaW5hcnkgdXNlZCB0byBidWlsZCB0aGUgaW5mbyBkb2NzLiBHTlUgRW1hY3MgMjEgaXMgcmVxdWlyZWQuCi1FTUFDUz1lbWFjcwotCi1NS0lORk89JChUT09MU0RJUikvbWtpbmZvCi1TQ1JJUFRTPSQoVE9PTFNESVIpL2NoZWNrYXJncy5wbSAkKFRPT0xTRElSKS9ta2luZm8gJChUT09MU0RJUikvcHkydGV4aS5lbAotCi0jIHNldCBWRVJTSU9OIHRvIGNvZGUgdGhlIFZFUlNJT04gbnVtYmVyIGludG8gdGhlIGluZm8gZmlsZSBuYW1lCi0jIGFsbG93aW5nIGluc3RhbGxhdGlvbiBvZiBtb3JlIHRoYW4gb25lIHNldCBvZiBweXRob24gaW5mbyBkb2NzCi0jIGludG8gdGhlIHNhbWUgZGlyZWN0b3J5Ci1WRVJTSU9OPQotCi1hbGw6CWNoZWNrLWVtYWNzLXZlcnNpb24gXAotCWFwaSBkaXN0IGV4dCBtYWMgcmVmIHR1dCB3aGF0c25ldyBcCi0JbGliCi0jCWRvYyBpbnN0Ci0KLWFwaToJcHl0aG9uJChWRVJTSU9OKS1hcGkuaW5mbwotZGlzdDoJcHl0aG9uJChWRVJTSU9OKS1kaXN0LmluZm8KLWRvYzoJcHl0aG9uJChWRVJTSU9OKS1kb2MuaW5mbwotZXh0OglweXRob24kKFZFUlNJT04pLWV4dC5pbmZvCi1pbnN0OglweXRob24kKFZFUlNJT04pLWluc3QuaW5mbwotbGliOglweXRob24kKFZFUlNJT04pLWxpYi5pbmZvCi1tYWM6CXB5dGhvbiQoVkVSU0lPTiktbWFjLmluZm8KLXJlZjoJcHl0aG9uJChWRVJTSU9OKS1yZWYuaW5mbwotdHV0OglweXRob24kKFZFUlNJT04pLXR1dC5pbmZvCi13aGF0c25ldzoJJChXSEFUU05FVykKLSQoV0hBVFNORVcpOglweXRob24kKFZFUlNJT04pLSQoV0hBVFNORVcpLmluZm8KLQotY2hlY2stZW1hY3MtdmVyc2lvbjoKLQlAdj0iYCQoRU1BQ1MpIC0tdmVyc2lvbiAyPiYxIHwgZWdyZXAgJ14oR05VIHxYKUVtYWNzIFsxMl0qJ2AiOyBcCi0JaWYgYGVjaG8gIiQkdiIgfCBncmVwICdeR05VIEVtYWNzIDJbMTJdJyA+L2Rldi9udWxsIDI+JjFgOyB0aGVuIFwKLQkgIGVjaG8gIlVzaW5nICQoRU1BQ1MpIHRvIGJ1aWxkIHRoZSBpbmZvIGRvY3MiOyBcCi0JZWxzZSBcCi0JICBlY2hvICJHTlUgRW1hY3MgMjEgb3IgMjIgaXMgcmVxdWlyZWQgdG8gYnVpbGQgdGhlIGluZm8gZG9jcyI7IFwKLQkgIGVjaG8gIkZvdW5kICQkdiI7IFwKLQkgIGZhbHNlOyBcCi0JZmkKLQotcHl0aG9uJChWRVJTSU9OKS1hcGkuaW5mbzoJLi4vYXBpL2FwaS50ZXggJChTQ1JJUFRTKQotCUVNQUNTPSQoRU1BQ1MpICQoTUtJTkZPKSAkPCAkKi50ZXhpICRACi0KLXB5dGhvbiQoVkVSU0lPTiktZXh0LmluZm86CS4uL2V4dC9leHQudGV4ICQoU0NSSVBUUykKLQlFTUFDUz0kKEVNQUNTKSAkKE1LSU5GTykgJDwgJCoudGV4aSAkQAotCi1weXRob24kKFZFUlNJT04pLWxpYi5pbmZvOgkuLi9saWIvbGliLnRleCAkKFNDUklQVFMpCi0JRU1BQ1M9JChFTUFDUykgJChNS0lORk8pICQ8ICQqLnRleGkgJEAKLQotcHl0aG9uJChWRVJTSU9OKS1tYWMuaW5mbzoJLi4vbWFjL21hYy50ZXggJChTQ1JJUFRTKQotCUVNQUNTPSQoRU1BQ1MpICQoTUtJTkZPKSAkPCAkKi50ZXhpICRACi0KLXB5dGhvbiQoVkVSU0lPTiktcmVmLmluZm86CS4uL3JlZi9yZWYudGV4ICQoU0NSSVBUUykKLQlFTUFDUz0kKEVNQUNTKSAkKE1LSU5GTykgJDwgJCoudGV4aSAkQAotCi1weXRob24kKFZFUlNJT04pLXR1dC5pbmZvOgkuLi90dXQvdHV0LnRleCAkKFNDUklQVFMpCi0JRU1BQ1M9JChFTUFDUykgJChNS0lORk8pICQ8ICQqLnRleGkgJEAKLQotIyBOb3QgYnVpbHQgYnkgZGVmYXVsdDsgdGhlIGNvbnZlcnNpb24gZG9lc24ndCBoYW5kbGUgXHAgYW5kIFxvcAotcHl0aG9uJChWRVJTSU9OKS1kb2MuaW5mbzoJLi4vZG9jL2RvYy50ZXggJChTQ1JJUFRTKQotCUVNQUNTPSQoRU1BQ1MpICQoTUtJTkZPKSAkPCAkKi50ZXhpICRACi0KLXB5dGhvbiQoVkVSU0lPTiktZGlzdC5pbmZvOgkuLi9kaXN0L2Rpc3QudGV4ICQoU0NSSVBUUykKLQlFTUFDUz0kKEVNQUNTKSAkKE1LSU5GTykgJDwgJCoudGV4aSAkQAotCi0jIE5vdCBidWlsdCBieSBkZWZhdWx0OyB0aGUgY29udmVyc2lvbiBjaG9rZXMgb24gXGluc3RhbGxzY2hlbWUKLXB5dGhvbiQoVkVSU0lPTiktaW5zdC5pbmZvOgkuLi9pbnN0L2luc3QudGV4ICQoU0NSSVBUUykKLQlFTUFDUz0kKEVNQUNTKSAkKE1LSU5GTykgJDwgJCoudGV4aSAkQAotCi0jICJ3aGF0c25ldzIwIiBkb2Vzbid0IGN1cnJlbnRseSB3b3JrCi1weXRob24kKFZFUlNJT04pLSQoV0hBVFNORVcpLmluZm86ICAuLi93aGF0c25ldy8kKFdIQVRTTkVXKS50ZXggJChTQ1JJUFRTKQotCUVNQUNTPSQoRU1BQ1MpICQoTUtJTkZPKSAkPCAkKi50ZXhpICRACi0KLWNsZWFuOgotCXJtIC1mICoudGV4aX4gKi50ZXhpCi0KLWNsb2JiZXI6IGNsZWFuCi0Jcm0gLWYgKi50ZXhpIHB5dGhvbiotKi5pbmZvIHB5dGhvbiotKi5pbmZvLVswLTldKgpkaWZmIC0tZ2l0IGEvRG9jL2luZm8vUkVBRE1FIGIvRG9jL2luZm8vUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2VlMmJlLi4wMDAwMDAwCi0tLSBhL0RvYy9pbmZvL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLVRoaXMgYXJjaGl2ZSBjb250YWlucyB0aGUgc3RhbmRhcmQgUHl0aG9uIGRvY3VtZW50YXRpb24gaW4gR05VIGluZm8KLWZvcm1hdC4gIEZpdmUgbWFudWFscyBhcmUgaW5jbHVkZWQ6Ci0KLSAgICBweXRob24tcmVmLmluZm8qCVB5dGhvbiBSZWZlcmVuY2UgTWFudWFsCi0gICAgcHl0aG9uLW1hYy5pbmZvKglQeXRob24gTWFjaW50b3NoIE1vZHVsZXMKLSAgICBweXRob24tbGliLmluZm8qCVB5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZQotICAgIHB5dGhvbi1leHQuaW5mbyoJRXh0ZW5kaW5nIGFuZCBFbWJlZGRpbmcgdGhlIFB5dGhvbiBJbnRlcnByZXRlcgotICAgIHB5dGhvbi1hcGkuaW5mbyoJUHl0aG9uL0MgQVBJIFJlZmVyZW5jZQotICAgIHB5dGhvbi10dXQuaW5mbyoJUHl0aG9uIFR1dG9yaWFsCi0KLVRoZSBmaWxlIHB5dGhvbi5kaXIgaXMgYSBmcmFnbWVudCBvZiBhICJkaXIiIGZpbGUgdGhhdCBjYW4gYmUgdXNlZCB0bwotaW5jb3Jwb3JhdGUgdGhlc2UgZG9jdW1lbnRzIGludG8gYW4gZXhpc3RpbmcgR05VIGluZm8gaW5zdGFsbGF0aW9uOgotaW5zZXJ0IHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgaW50byB0aGUgImRpciIgb3IgImxvY2FsZGlyIiBmaWxlIGF0Ci1hbiBhcHByb3ByaWF0ZSBwb2ludCBhbmQgY29weSB0aGUgcHl0aG9uLSouaW5mbyogZmlsZXMgdG8gdGhlIHNhbWUKLWRpcmVjdG9yeS4KLQotVGhhbmtzIGdvIHRvIE1pbGFuIFphbWF6YWwgPHBkbUB6YW1hemFsLm9yZz4gZm9yIHByb3ZpZGluZyB0aGlzCi1jb252ZXJzaW9uIHRvIHRoZSBpbmZvIGZvcm1hdC4KLQotUXVlc3Rpb25zIGFuZCBjb21tZW50cyBvbiB0aGVzZSBkb2N1bWVudHMgc2hvdWxkIGJlIGRpcmVjdGVkIHRvCi1kb2NzQHB5dGhvbi5vcmcuCmRpZmYgLS1naXQgYS9Eb2MvaW5mby9weXRob24uZGlyIGIvRG9jL2luZm8vcHl0aG9uLmRpcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIxNWRlYy4uMDAwMDAwMAotLS0gYS9Eb2MvaW5mby9weXRob24uZGlyCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotCi1QeXRob24gU3RhbmRhcmQgRG9jdW1lbnRhdGlvbgotCi0qIFdoYXQncyBOZXc6IChweXRob24td2hhdHNuZXcyNSkuICAgICAgV2hhdCdzIE5ldyBpbiBQeXRob24gMi41PwotKiBQeXRob24gTGlicmFyeTogKHB5dGhvbi1saWIpLiAgICAgICAgIFB5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZQotKiBQeXRob24gTWFjIE1vZHVsZXM6IChweXRob24tbWFjKS4gICAgIFB5dGhvbiBNYWNpbnRvc2ggTW9kdWxlcwotKiBQeXRob24gUmVmZXJlbmNlOiAocHl0aG9uLXJlZikuICAgICAgIFB5dGhvbiBSZWZlcmVuY2UgTWFudWFsCi0qIFB5dGhvbiBBUEk6IChweXRob24tYXBpKS4gICAgICAgICAgICAgUHl0aG9uL0MgQVBJIFJlZmVyZW5jZSBNYW51YWwKLSogUHl0aG9uIEV4dGVuZGluZzogKHB5dGhvbi1leHQpLiAgICAgICBFeHRlbmRpbmcgJiBFbWJlZGRpbmcgUHl0aG9uCi0qIFB5dGhvbiBUdXRvcmlhbDogKHB5dGhvbi10dXQpLiAgICAgICAgUHl0aG9uIFR1dG9yaWFsCi0qIERpc3RyaWJ1dGluZyBNb2R1bGVzOiAocHl0aG9uLWRpc3QpLiAgRGlzdHJpYnV0aW5nIFB5dGhvbiBNb2R1bGVzCmRpZmYgLS1naXQgYS9Eb2MvaW5zdC9pbnN0LnRleCBiL0RvYy9pbnN0L2luc3QudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGM2ODZlLi4wMDAwMDAwCi0tLSBhL0RvYy9pbnN0L2luc3QudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTExMiArMCwwIEBACi1cZG9jdW1lbnRjbGFzc3tob3d0b30KLVx1c2VwYWNrYWdle2Rpc3R1dGlsc30KLQotJSBUT0RPOgotJSAgIEZpbGwgaW4gWFhYIGNvbW1lbnRzCi0KLVx0aXRsZXtJbnN0YWxsaW5nIFB5dGhvbiBNb2R1bGVzfQotCi0lIFRoZSBhdWRpZW5jZSBmb3IgdGhpcyBkb2N1bWVudCBpbmNsdWRlcyBwZW9wbGUgd2hvIGRvbid0IGtub3cgYW55dGhpbmcgCi0lIGFib3V0IFB5dGhvbiBhbmQgYXJlbid0IGFib3V0IHRvIGxlYXJuIHRoZSBsYW5ndWFnZSBqdXN0IGluIG9yZGVyIHRvCi0lIGluc3RhbGwgYW5kIG1haW50YWluIGl0IGZvciB0aGVpciB1c2VycywgaS5lLiBzeXN0ZW0gYWRtaW5pc3RyYXRvcnMuCi0lIFRodXMsIEkgaGF2ZSB0byBiZSBzdXJlIHRvIGV4cGxhaW4gdGhlIGJhc2ljcyBhdCBzb21lIHBvaW50OgotJSBzeXMucGF0aCBhbmQgUFlUSE9OUEFUSCBhdCBsZWFzdC4gIFNob3VsZCBwcm9iYWJseSBnaXZlIHBvaW50ZXJzIHRvCi0lIG90aGVyIGRvY3Mgb24gImltcG9ydCBzaXRlIiwgUFlUSE9OU1RBUlRVUCwgUFlUSE9OSE9NRSwgZXRjLgotJSAKLSUgRmluYWxseSwgaXQgbWlnaHQgYmUgdXNlZnVsIHRvIGluY2x1ZGUgYWxsIHRoZSBtYXRlcmlhbCBmcm9tIG15ICJDYXJlCi0lIGFuZCBGZWVkaW5nIG9mIGEgUHl0aG9uIEluc3RhbGxhdGlvbiIgdGFsayBpbiBoZXJlIHNvbWV3aGVyZS4gIFlvdyEKLQotXGlucHV0e2JvaWxlcnBsYXRlfQotCi1cYXV0aG9ye0dyZWcgV2FyZH0KLVxhdXRob3JhZGRyZXNzewotCVxzdHJvbmd7UHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb259XFwKLQlFbWFpbDogXGVtYWlse2Rpc3R1dGlscy1zaWdAcHl0aG9uLm9yZ30KLX0KLQotXG1ha2VpbmRleAotCi1cYmVnaW57ZG9jdW1lbnR9Ci0KLVxtYWtldGl0bGUKLQotXGJlZ2lue2Fic3RyYWN0fQotICBcbm9pbmRlbnQKLSAgVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIFB5dGhvbiBEaXN0cmlidXRpb24gVXRpbGl0aWVzCi0gIChgYERpc3R1dGlscycnKSBmcm9tIHRoZSBlbmQtdXNlcidzIHBvaW50LW9mLXZpZXcsIGRlc2NyaWJpbmcgaG93IHRvCi0gIGV4dGVuZCB0aGUgY2FwYWJpbGl0aWVzIG9mIGEgc3RhbmRhcmQgUHl0aG9uIGluc3RhbGxhdGlvbiBieSBidWlsZGluZwotICBhbmQgaW5zdGFsbGluZyB0aGlyZC1wYXJ0eSBQeXRob24gbW9kdWxlcyBhbmQgZXh0ZW5zaW9ucy4KLVxlbmR7YWJzdHJhY3R9Ci0KLSVcYmVnaW57YWJzdHJhY3R9Ci0lXG5vaW5kZW50Ci0lQWJzdHJhY3QgdGhpcyEKLSVcZW5ke2Fic3RyYWN0fQotCi0KLSUgVGhlIHVnbHkgIiViZWdpbntsYXRleG9ubHl9IiBwc2V1ZG8tZW52aXJvbm1lbnQgc3VwcHJlc3NlcyB0aGUgdGFibGUKLSUgb2YgY29udGVudHMgZm9yIEhUTUwgZ2VuZXJhdGlvbi4KLSUKLSViZWdpbntsYXRleG9ubHl9Ci1cdGFibGVvZmNvbnRlbnRzCi0lZW5ke2xhdGV4b25seX0KLQotCi1cc2VjdGlvbntJbnRyb2R1Y3Rpb259Ci1cbGFiZWx7aW50cm99Ci0KLUFsdGhvdWdoIFB5dGhvbidzIGV4dGVuc2l2ZSBzdGFuZGFyZCBsaWJyYXJ5IGNvdmVycyBtYW55IHByb2dyYW1taW5nCi1uZWVkcywgdGhlcmUgb2Z0ZW4gY29tZXMgYSB0aW1lIHdoZW4geW91IG5lZWQgdG8gYWRkIHNvbWUgbmV3Ci1mdW5jdGlvbmFsaXR5IHRvIHlvdXIgUHl0aG9uIGluc3RhbGxhdGlvbiBpbiB0aGUgZm9ybSBvZiB0aGlyZC1wYXJ0eQotbW9kdWxlcy4gIFRoaXMgbWlnaHQgYmUgbmVjZXNzYXJ5IHRvIHN1cHBvcnQgeW91ciBvd24gcHJvZ3JhbW1pbmcsIG9yIHRvCi1zdXBwb3J0IGFuIGFwcGxpY2F0aW9uIHRoYXQgeW91IHdhbnQgdG8gdXNlIGFuZCB0aGF0IGhhcHBlbnMgdG8gYmUKLXdyaXR0ZW4gaW4gUHl0aG9uLgotCi1JbiB0aGUgcGFzdCwgdGhlcmUgaGFzIGJlZW4gbGl0dGxlIHN1cHBvcnQgZm9yIGFkZGluZyB0aGlyZC1wYXJ0eQotbW9kdWxlcyB0byBhbiBleGlzdGluZyBQeXRob24gaW5zdGFsbGF0aW9uLiAgV2l0aCB0aGUgaW50cm9kdWN0aW9uIG9mCi10aGUgUHl0aG9uIERpc3RyaWJ1dGlvbiBVdGlsaXRpZXMgKERpc3R1dGlscyBmb3Igc2hvcnQpIGluIFB5dGhvbiAyLjAsCi10aGlzIGNoYW5nZWQuCi0KLVRoaXMgZG9jdW1lbnQgaXMgYWltZWQgcHJpbWFyaWx5IGF0IHRoZSBwZW9wbGUgd2hvIG5lZWQgdG8gaW5zdGFsbAotdGhpcmQtcGFydHkgUHl0aG9uIG1vZHVsZXM6IGVuZC11c2VycyBhbmQgc3lzdGVtIGFkbWluaXN0cmF0b3JzIHdobyBqdXN0Ci1uZWVkIHRvIGdldCBzb21lIFB5dGhvbiBhcHBsaWNhdGlvbiBydW5uaW5nLCBhbmQgZXhpc3RpbmcgUHl0aG9uCi1wcm9ncmFtbWVycyB3aG8gd2FudCB0byBhZGQgc29tZSBuZXcgZ29vZGllcyB0byB0aGVpciB0b29sYm94LiAgWW91Ci1kb24ndCBuZWVkIHRvIGtub3cgUHl0aG9uIHRvIHJlYWQgdGhpcyBkb2N1bWVudDsgdGhlcmUgd2lsbCBiZSBzb21lCi1icmllZiBmb3JheXMgaW50byB1c2luZyBQeXRob24ncyBpbnRlcmFjdGl2ZSBtb2RlIHRvIGV4cGxvcmUgeW91cgotaW5zdGFsbGF0aW9uLCBidXQgdGhhdCdzIGl0LiAgSWYgeW91J3JlIGxvb2tpbmcgZm9yIGluZm9ybWF0aW9uIG9uIGhvdwotdG8gZGlzdHJpYnV0ZSB5b3VyIG93biBQeXRob24gbW9kdWxlcyBzbyB0aGF0IG90aGVycyBtYXkgdXNlIHRoZW0sIHNlZQotdGhlIFxjaXRldGl0bGVbLi4vZGlzdC9kaXN0Lmh0bWxde0Rpc3RyaWJ1dGluZyBQeXRob24gTW9kdWxlc30gbWFudWFsLgotCi0KLVxzdWJzZWN0aW9ue0Jlc3QgY2FzZTogdHJpdmlhbCBpbnN0YWxsYXRpb259Ci1cbGFiZWx7dHJpdmlhbC1pbnN0YWxsfQotCi1JbiB0aGUgYmVzdCBjYXNlLCBzb21lb25lIHdpbGwgaGF2ZSBwcmVwYXJlZCBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUKLW1vZHVsZSBkaXN0cmlidXRpb24geW91IHdhbnQgdG8gaW5zdGFsbCB0aGF0IGlzIHRhcmdldGVkIHNwZWNpZmljYWxseSBhdAoteW91ciBwbGF0Zm9ybSBhbmQgaXMgaW5zdGFsbGVkIGp1c3QgbGlrZSBhbnkgb3RoZXIgc29mdHdhcmUgb24geW91cgotcGxhdGZvcm0uICBGb3IgZXhhbXBsZSwgdGhlIG1vZHVsZSBkZXZlbG9wZXIgbWlnaHQgbWFrZSBhbiBleGVjdXRhYmxlCi1pbnN0YWxsZXIgYXZhaWxhYmxlIGZvciBXaW5kb3dzIHVzZXJzLCBhbiBSUE0gcGFja2FnZSBmb3IgdXNlcnMgb2YKLVJQTS1iYXNlZCBMaW51eCBzeXN0ZW1zIChSZWQgSGF0LCBTdVNFLCBNYW5kcmFrZSwgYW5kIG1hbnkgb3RoZXJzKSwgYQotRGViaWFuIHBhY2thZ2UgZm9yIHVzZXJzIG9mIERlYmlhbi1iYXNlZCBMaW51eCBzeXN0ZW1zLCBhbmQgc28gZm9ydGguCi0KLUluIHRoYXQgY2FzZSwgeW91IHdvdWxkIGRvd25sb2FkIHRoZSBpbnN0YWxsZXIgYXBwcm9wcmlhdGUgdG8geW91cgotcGxhdGZvcm0gYW5kIGRvIHRoZSBvYnZpb3VzIHRoaW5nIHdpdGggaXQ6IHJ1biBpdCBpZiBpdCdzIGFuIGV4ZWN1dGFibGUKLWluc3RhbGxlciwgXGNvZGV7cnBtIC0taW5zdGFsbH0gaXQgaWYgaXQncyBhbiBSUE0sIGV0Yy4gIFlvdSBkb24ndCBuZWVkCi10byBydW4gUHl0aG9uIG9yIGEgc2V0dXAgc2NyaXB0LCB5b3UgZG9uJ3QgbmVlZCB0byBjb21waWxlCi1hbnl0aGluZy0tLXlvdSBtaWdodCBub3QgZXZlbiBuZWVkIHRvIHJlYWQgYW55IGluc3RydWN0aW9ucyAoYWx0aG91Z2gKLWl0J3MgYWx3YXlzIGEgZ29vZCBpZGVhIHRvIGRvIHNvIGFueXdheXMpLgotCi1PZiBjb3Vyc2UsIHRoaW5ncyB3aWxsIG5vdCBhbHdheXMgYmUgdGhhdCBlYXN5LiAgWW91IG1pZ2h0IGJlIGludGVyZXN0ZWQKLWluIGEgbW9kdWxlIGRpc3RyaWJ1dGlvbiB0aGF0IGRvZXNuJ3QgaGF2ZSBhbiBlYXN5LXRvLXVzZSBpbnN0YWxsZXIgZm9yCi15b3VyIHBsYXRmb3JtLiAgSW4gdGhhdCBjYXNlLCB5b3UnbGwgaGF2ZSB0byBzdGFydCB3aXRoIHRoZSBzb3VyY2UKLWRpc3RyaWJ1dGlvbiByZWxlYXNlZCBieSB0aGUgbW9kdWxlJ3MgYXV0aG9yL21haW50YWluZXIuICBJbnN0YWxsaW5nCi1mcm9tIGEgc291cmNlIGRpc3RyaWJ1dGlvbiBpcyBub3QgdG9vIGhhcmQsIGFzIGxvbmcgYXMgdGhlIG1vZHVsZXMgYXJlCi1wYWNrYWdlZCBpbiB0aGUgc3RhbmRhcmQgd2F5LiAgVGhlIGJ1bGsgb2YgdGhpcyBkb2N1bWVudCBpcyBhYm91dAotYnVpbGRpbmcgYW5kIGluc3RhbGxpbmcgbW9kdWxlcyBmcm9tIHN0YW5kYXJkIHNvdXJjZSBkaXN0cmlidXRpb25zLgotCi0KLVxzdWJzZWN0aW9ue1RoZSBuZXcgc3RhbmRhcmQ6IERpc3R1dGlsc30KLVxsYWJlbHtuZXctc3RhbmRhcmR9Ci0KLUlmIHlvdSBkb3dubG9hZCBhIG1vZHVsZSBzb3VyY2UgZGlzdHJpYnV0aW9uLCB5b3UgY2FuIHRlbGwgcHJldHR5Ci1xdWlja2x5IGlmIGl0IHdhcyBwYWNrYWdlZCBhbmQgZGlzdHJpYnV0ZWQgaW4gdGhlIHN0YW5kYXJkIHdheSwgaS5lLgotdXNpbmcgdGhlIERpc3R1dGlscy4gIEZpcnN0LCB0aGUgZGlzdHJpYnV0aW9uJ3MgbmFtZSBhbmQgdmVyc2lvbiBudW1iZXIKLXdpbGwgYmUgZmVhdHVyZWQgcHJvbWluZW50bHkgaW4gdGhlIG5hbWUgb2YgdGhlIGRvd25sb2FkZWQgYXJjaGl2ZSwgZS5nLgotXGZpbGV7Zm9vLTEuMC50YXIuZ3p9IG9yIFxmaWxle3dpZGdldC0wLjkuNy56aXB9LiAgTmV4dCwgdGhlIGFyY2hpdmUKLXdpbGwgdW5wYWNrIGludG8gYSBzaW1pbGFybHktbmFtZWQgZGlyZWN0b3J5OiBcZmlsZXtmb28tMS4wfSBvcgotXGZpbGV7d2lkZ2V0LTAuOS43fS4gIEFkZGl0aW9uYWxseSwgdGhlIGRpc3RyaWJ1dGlvbiB3aWxsIGNvbnRhaW4gYQotc2V0dXAgc2NyaXB0IFxmaWxle3NldHVwLnB5fSwgYW5kIGEgZmlsZSBuYW1lZCBcZmlsZXtSRUFETUUudHh0fSBvciBwb3NzaWJseQotanVzdCBcZmlsZXtSRUFETUV9LCB3aGljaCBzaG91bGQgZXhwbGFpbiB0aGF0IGJ1aWxkaW5nIGFuZCBpbnN0YWxsaW5nIHRoZQotbW9kdWxlIGRpc3RyaWJ1dGlvbiBpcyBhIHNpbXBsZSBtYXR0ZXIgb2YgcnVubmluZwotCi1cYmVnaW57dmVyYmF0aW19Ci1weXRob24gc2V0dXAucHkgaW5zdGFsbAotXGVuZHt2ZXJiYXRpbX0KLQotSWYgYWxsIHRoZXNlIHRoaW5ncyBhcmUgdHJ1ZSwgdGhlbiB5b3UgYWxyZWFkeSBrbm93IGhvdyB0byBidWlsZCBhbmQKLWluc3RhbGwgdGhlIG1vZHVsZXMgeW91J3ZlIGp1c3QgZG93bmxvYWRlZDogIFJ1biB0aGUgY29tbWFuZCBhYm92ZS4KLVVubGVzcyB5b3UgbmVlZCB0byBpbnN0YWxsIHRoaW5ncyBpbiBhIG5vbi1zdGFuZGFyZCB3YXkgb3IgY3VzdG9taXplIHRoZQotYnVpbGQgcHJvY2VzcywgeW91IGRvbid0IHJlYWxseSBuZWVkIHRoaXMgbWFudWFsLiAgT3IgcmF0aGVyLCB0aGUgYWJvdmUKLWNvbW1hbmQgaXMgZXZlcnl0aGluZyB5b3UgbmVlZCB0byBnZXQgb3V0IG9mIHRoaXMgbWFudWFsLgotCi0KLVxzZWN0aW9ue1N0YW5kYXJkIEJ1aWxkIGFuZCBJbnN0YWxsfQotXGxhYmVse3N0YW5kYXJkLWluc3RhbGx9Ci0KLUFzIGRlc2NyaWJlZCBpbiBzZWN0aW9uflxyZWZ7bmV3LXN0YW5kYXJkfSwgYnVpbGRpbmcgYW5kIGluc3RhbGxpbmcKLWEgbW9kdWxlIGRpc3RyaWJ1dGlvbiB1c2luZyB0aGUgRGlzdHV0aWxzIGlzIHVzdWFsbHkgb25lIHNpbXBsZSBjb21tYW5kOgotCi1cYmVnaW57dmVyYmF0aW19Ci1weXRob24gc2V0dXAucHkgaW5zdGFsbAotXGVuZHt2ZXJiYXRpbX0KLQotT24gXFVOSVgsIHlvdSdkIHJ1biB0aGlzIGNvbW1hbmQgZnJvbSBhIHNoZWxsIHByb21wdDsgb24gV2luZG93cywgeW91Ci1oYXZlIHRvIG9wZW4gYSBjb21tYW5kIHByb21wdCB3aW5kb3cgKGBgRE9TIGJveCcnKSBhbmQgZG8gaXQgdGhlcmU7IG9uCi1NYWMgT1MgWCwgeW91IG9wZW4gYSBcY29tbWFuZHtUZXJtaW5hbH0gd2luZG93IHRvIGdldCBhIHNoZWxsIHByb21wdC4KLQotCi1cc3Vic2VjdGlvbntQbGF0Zm9ybSB2YXJpYXRpb25zfQotXGxhYmVse3BsYXRmb3JtLXZhcmlhdGlvbnN9Ci0KLVlvdSBzaG91bGQgYWx3YXlzIHJ1biB0aGUgc2V0dXAgY29tbWFuZCBmcm9tIHRoZSBkaXN0cmlidXRpb24gcm9vdAotZGlyZWN0b3J5LCBpLmUuIHRoZSB0b3AtbGV2ZWwgc3ViZGlyZWN0b3J5IHRoYXQgdGhlIG1vZHVsZSBzb3VyY2UKLWRpc3RyaWJ1dGlvbiB1bnBhY2tzIGludG8uICBGb3IgZXhhbXBsZSwgaWYgeW91J3ZlIGp1c3QgZG93bmxvYWRlZCBhCi1tb2R1bGUgc291cmNlIGRpc3RyaWJ1dGlvbiBcZmlsZXtmb28tMS4wLnRhci5nen0gb250byBhCi1cVU5JWHt9IHN5c3RlbSwgdGhlIG5vcm1hbCB0aGluZyB0byBkbyBpczoKLQotXGJlZ2lue3ZlcmJhdGltfQotZ3VuemlwIC1jIGZvby0xLjAudGFyLmd6IHwgdGFyIHhmIC0gICAgIyB1bnBhY2tzIGludG8gZGlyZWN0b3J5IGZvby0xLjAKLWNkIGZvby0xLjAKLXB5dGhvbiBzZXR1cC5weSBpbnN0YWxsCi1cZW5ke3ZlcmJhdGltfQotCi1PbiBXaW5kb3dzLCB5b3UnZCBwcm9iYWJseSBkb3dubG9hZCBcZmlsZXtmb28tMS4wLnppcH0uICBJZiB5b3UKLWRvd25sb2FkZWQgdGhlIGFyY2hpdmUgZmlsZSB0byBcZmlsZXtDOlx0ZXh0YmFja3NsYXNoe31UZW1wfSwgdGhlbiBpdAotd291bGQgdW5wYWNrIGludG8gXGZpbGV7QzpcdGV4dGJhY2tzbGFzaHt9VGVtcFx0ZXh0YmFja3NsYXNoe31mb28tMS4wfTsKLXlvdSBjYW4gdXNlIGVpdGhlciBhIGFyY2hpdmUgbWFuaXB1bGF0b3Igd2l0aCBhIGdyYXBoaWNhbCB1c2VyIGludGVyZmFjZQotKHN1Y2ggYXMgV2luWmlwKSBvciBhIGNvbW1hbmQtbGluZSB0b29sIChzdWNoIGFzIFxwcm9ncmFte3VuemlwfSBvcgotXHByb2dyYW17cGt1bnppcH0pIHRvIHVucGFjayB0aGUgYXJjaGl2ZS4gIFRoZW4sIG9wZW4gYSBjb21tYW5kIHByb21wdAotd2luZG93IChgYERPUyBib3gnJyksIGFuZCBydW46Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWNkIGM6XFRlbXBcZm9vLTEuMAotcHl0aG9uIHNldHVwLnB5IGluc3RhbGwKLVxlbmR7dmVyYmF0aW19Ci0KLVxzdWJzZWN0aW9ue1NwbGl0dGluZyB0aGUgam9iIHVwfQotXGxhYmVse3NwbGl0dGluZy11cH0KLQotUnVubmluZyBcY29kZXtzZXR1cC5weSBpbnN0YWxsfSBidWlsZHMgYW5kIGluc3RhbGxzIGFsbCBtb2R1bGVzIGluIG9uZQotcnVuLiAgSWYgeW91IHByZWZlciB0byB3b3JrIGluY3JlbWVudGFsbHktLS1lc3BlY2lhbGx5IHVzZWZ1bCBpZiB5b3UKLXdhbnQgdG8gY3VzdG9taXplIHRoZSBidWlsZCBwcm9jZXNzLCBvciBpZiB0aGluZ3MgYXJlIGdvaW5nIHdyb25nLS0teW91Ci1jYW4gdXNlIHRoZSBzZXR1cCBzY3JpcHQgdG8gZG8gb25lIHRoaW5nIGF0IGEgdGltZS4gIFRoaXMgaXMKLXBhcnRpY3VsYXJseSBoZWxwZnVsIHdoZW4gdGhlIGJ1aWxkIGFuZCBpbnN0YWxsIHdpbGwgYmUgZG9uZSBieQotZGlmZmVyZW50IHVzZXJzLS0tZm9yIGV4YW1wbGUsIHlvdSBtaWdodCB3YW50IHRvIGJ1aWxkIGEgbW9kdWxlIGRpc3RyaWJ1dGlvbgotYW5kIGhhbmQgaXQgb2ZmIHRvIGEgc3lzdGVtIGFkbWluaXN0cmF0b3IgZm9yIGluc3RhbGxhdGlvbiAob3IgZG8gaXQKLXlvdXJzZWxmLCB3aXRoIHN1cGVyLXVzZXIgcHJpdmlsZWdlcykuCi0KLUZvciBleGFtcGxlLCB5b3UgY2FuIGJ1aWxkIGV2ZXJ5dGhpbmcgaW4gb25lIHN0ZXAsIGFuZCB0aGVuIGluc3RhbGwKLWV2ZXJ5dGhpbmcgaW4gYSBzZWNvbmQgc3RlcCwgYnkgaW52b2tpbmcgdGhlIHNldHVwIHNjcmlwdCB0d2ljZToKLQotXGJlZ2lue3ZlcmJhdGltfQotcHl0aG9uIHNldHVwLnB5IGJ1aWxkCi1weXRob24gc2V0dXAucHkgaW5zdGFsbAotXGVuZHt2ZXJiYXRpbX0KLQotSWYgeW91IGRvIHRoaXMsIHlvdSB3aWxsIG5vdGljZSB0aGF0IHJ1bm5pbmcgdGhlIFxjb21tYW5ke2luc3RhbGx9Ci1jb21tYW5kIGZpcnN0IHJ1bnMgdGhlIFxjb21tYW5ke2J1aWxkfSBjb21tYW5kLCB3aGljaC0tLWluIHRoaXMKLWNhc2UtLS1xdWlja2x5IG5vdGljZXMgdGhhdCBpdCBoYXMgbm90aGluZyB0byBkbywgc2luY2UgZXZlcnl0aGluZyBpbgotdGhlIFxmaWxle2J1aWxkfSBkaXJlY3RvcnkgaXMgdXAtdG8tZGF0ZS4KLQotWW91IG1heSBub3QgbmVlZCB0aGlzIGFiaWxpdHkgdG8gYnJlYWsgdGhpbmdzIGRvd24gb2Z0ZW4gaWYgYWxsIHlvdSBkbwotaXMgaW5zdGFsbCBtb2R1bGVzIGRvd25sb2FkZWQgb2ZmIHRoZSAnbmV0LCBidXQgaXQncyB2ZXJ5IGhhbmR5IGZvciBtb3JlCi1hZHZhbmNlZCB0YXNrcy4gIElmIHlvdSBnZXQgaW50byBkaXN0cmlidXRpbmcgeW91ciBvd24gUHl0aG9uIG1vZHVsZXMKLWFuZCBleHRlbnNpb25zLCB5b3UnbGwgcnVuIGxvdHMgb2YgaW5kaXZpZHVhbCBEaXN0dXRpbHMgY29tbWFuZHMgb24KLXRoZWlyIG93bi4KLQotCi1cc3Vic2VjdGlvbntIb3cgYnVpbGRpbmcgd29ya3N9Ci1cbGFiZWx7aG93LWJ1aWxkLXdvcmtzfQotCi1BcyBpbXBsaWVkIGFib3ZlLCB0aGUgXGNvbW1hbmR7YnVpbGR9IGNvbW1hbmQgaXMgcmVzcG9uc2libGUgZm9yIHB1dHRpbmcKLXRoZSBmaWxlcyB0byBpbnN0YWxsIGludG8gYSBcZW1waHtidWlsZCBkaXJlY3Rvcnl9LiAgQnkgZGVmYXVsdCwgdGhpcyBpcwotXGZpbGV7YnVpbGR9IHVuZGVyIHRoZSBkaXN0cmlidXRpb24gcm9vdDsgaWYgeW91J3JlIGV4Y2Vzc2l2ZWx5Ci1jb25jZXJuZWQgd2l0aCBzcGVlZCwgb3Igd2FudCB0byBrZWVwIHRoZSBzb3VyY2UgdHJlZSBwcmlzdGluZSwgeW91IGNhbgotY2hhbmdlIHRoZSBidWlsZCBkaXJlY3Rvcnkgd2l0aCB0aGUgXGxvbmdwcm9ncmFtb3B0e2J1aWxkLWJhc2V9IG9wdGlvbi4KLUZvciBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1weXRob24gc2V0dXAucHkgYnVpbGQgLS1idWlsZC1iYXNlPS90bXAvcHlidWlsZC9mb28tMS4wCi1cZW5ke3ZlcmJhdGltfQotCi0oT3IgeW91IGNvdWxkIGRvIHRoaXMgcGVybWFuZW50bHkgd2l0aCBhIGRpcmVjdGl2ZSBpbiB5b3VyIHN5c3RlbSBvcgotcGVyc29uYWwgRGlzdHV0aWxzIGNvbmZpZ3VyYXRpb24gZmlsZTsgc2VlCi1zZWN0aW9uflxyZWZ7Y29uZmlnLWZpbGVzfS4pICBOb3JtYWxseSwgdGhpcyBpc24ndCBuZWNlc3NhcnkuCi0KLVRoZSBkZWZhdWx0IGxheW91dCBmb3IgdGhlIGJ1aWxkIHRyZWUgaXMgYXMgZm9sbG93czoKLQotXGJlZ2lue3ZlcmJhdGltfQotLS0tIGJ1aWxkLyAtLS0gbGliLwotb3IKLS0tLSBidWlsZC8gLS0tIGxpYi48cGxhdD4vCi0gICAgICAgICAgICAgICB0ZW1wLjxwbGF0Pi8KLVxlbmR7dmVyYmF0aW19Ci0KLXdoZXJlIFxjb2RlezxwbGF0Pn0gZXhwYW5kcyB0byBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBjdXJyZW50Ci1PUy9oYXJkd2FyZSBwbGF0Zm9ybSBhbmQgUHl0aG9uIHZlcnNpb24uICBUaGUgZmlyc3QgZm9ybSwgd2l0aCBqdXN0IGEKLVxmaWxle2xpYn0gZGlyZWN0b3J5LCBpcyB1c2VkIGZvciBgYHB1cmUgbW9kdWxlIGRpc3RyaWJ1dGlvbnMnJy0tLXRoYXQKLWlzLCBtb2R1bGUgZGlzdHJpYnV0aW9ucyB0aGF0IGluY2x1ZGUgb25seSBwdXJlIFB5dGhvbiBtb2R1bGVzLiAgSWYgYQotbW9kdWxlIGRpc3RyaWJ1dGlvbiBjb250YWlucyBhbnkgZXh0ZW5zaW9ucyAobW9kdWxlcyB3cml0dGVuIGluIEMvXENwcCksCi10aGVuIHRoZSBzZWNvbmQgZm9ybSwgd2l0aCB0d28gXGNvZGV7PHBsYXQ+fSBkaXJlY3RvcmllcywgaXMgdXNlZC4gIEluCi10aGF0IGNhc2UsIHRoZSBcZmlsZXt0ZW1wLlxmaWxldmFye3BsYXR9fSBkaXJlY3RvcnkgaG9sZHMgdGVtcG9yYXJ5Ci1maWxlcyBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGUvbGluayBwcm9jZXNzIHRoYXQgZG9uJ3QgYWN0dWFsbHkgZ2V0Ci1pbnN0YWxsZWQuICBJbiBlaXRoZXIgY2FzZSwgdGhlIFxmaWxle2xpYn0gKG9yCi1cZmlsZXtsaWIuXGZpbGV2YXJ7cGxhdH19KSBkaXJlY3RvcnkgY29udGFpbnMgYWxsIFB5dGhvbiBtb2R1bGVzIChwdXJlCi1QeXRob24gYW5kIGV4dGVuc2lvbnMpIHRoYXQgd2lsbCBiZSBpbnN0YWxsZWQuCi0KLUluIHRoZSBmdXR1cmUsIG1vcmUgZGlyZWN0b3JpZXMgd2lsbCBiZSBhZGRlZCB0byBoYW5kbGUgUHl0aG9uIHNjcmlwdHMsCi1kb2N1bWVudGF0aW9uLCBiaW5hcnkgZXhlY3V0YWJsZXMsIGFuZCB3aGF0ZXZlciBlbHNlIGlzIG5lZWRlZCB0byBoYW5kbGUKLXRoZSBqb2Igb2YgaW5zdGFsbGluZyBQeXRob24gbW9kdWxlcyBhbmQgYXBwbGljYXRpb25zLgotCi0KLVxzdWJzZWN0aW9ue0hvdyBpbnN0YWxsYXRpb24gd29ya3N9Ci1cbGFiZWx7aG93LWluc3RhbGwtd29ya3N9Ci0KLUFmdGVyIHRoZSBcY29tbWFuZHtidWlsZH0gY29tbWFuZCBydW5zICh3aGV0aGVyIHlvdSBydW4gaXQgZXhwbGljaXRseSwKLW9yIHRoZSBcY29tbWFuZHtpbnN0YWxsfSBjb21tYW5kIGRvZXMgaXQgZm9yIHlvdSksIHRoZSB3b3JrIG9mIHRoZQotXGNvbW1hbmR7aW5zdGFsbH0gY29tbWFuZCBpcyByZWxhdGl2ZWx5IHNpbXBsZTogYWxsIGl0IGhhcyB0byBkbyBpcyBjb3B5Ci1ldmVyeXRoaW5nIHVuZGVyIFxmaWxle2J1aWxkL2xpYn0gKG9yIFxmaWxle2J1aWxkL2xpYi5cZmlsZXZhcntwbGF0fX0pCi10byB5b3VyIGNob3NlbiBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgotCi1JZiB5b3UgZG9uJ3QgY2hvb3NlIGFuIGluc3RhbGxhdGlvbiBkaXJlY3RvcnktLS1pLmUuLCBpZiB5b3UganVzdCBydW4KLVxjb2Rle3NldHVwLnB5IGluc3RhbGx9LS0tdGhlbiB0aGUgXGNvbW1hbmR7aW5zdGFsbH0gY29tbWFuZCBpbnN0YWxscyB0bwotdGhlIHN0YW5kYXJkIGxvY2F0aW9uIGZvciB0aGlyZC1wYXJ0eSBQeXRob24gbW9kdWxlcy4gIFRoaXMgbG9jYXRpb24KLXZhcmllcyBieSBwbGF0Zm9ybSBhbmQgYnkgaG93IHlvdSBidWlsdC9pbnN0YWxsZWQgUHl0aG9uIGl0c2VsZi4gIE9uCi1cVU5JWHt9IChhbmQgTWFjIE9TIFgsIHdoaWNoIGlzIGFsc28gXFVOSVgtYmFzZWQpLAotaXQgYWxzbyBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIG1vZHVsZSBkaXN0cmlidXRpb24KLWJlaW5nIGluc3RhbGxlZCBpcyBwdXJlIFB5dGhvbiBvciBjb250YWlucyBleHRlbnNpb25zIChgYG5vbi1wdXJlJycpOgotXGJlZ2lue3RhYmxlaXZ9e2x8bHxsfGN9e3RleHRybX0lCi0gIHtQbGF0Zm9ybX17U3RhbmRhcmQgaW5zdGFsbGF0aW9uIGxvY2F0aW9ufXtEZWZhdWx0IHZhbHVlfXtOb3Rlc30KLSAgXGxpbmVpdntcVU5JWHt9IChwdXJlKX0KLSAgICAgICAgICB7XGZpbGVucXtcZmlsZXZhcntwcmVmaXh9L2xpYi9weXRob25cc2hvcnR2ZXJzaW9uL3NpdGUtcGFja2FnZXN9fQotICAgICAgICAgIHtcZmlsZW5xey91c3IvbG9jYWwvbGliL3B5dGhvblxzaG9ydHZlcnNpb24vc2l0ZS1wYWNrYWdlc319Ci0gICAgICAgICAgeygxKX0KLSAgXGxpbmVpdntcVU5JWHt9IChub24tcHVyZSl9Ci0gICAgICAgICAge1xmaWxlbnF7XGZpbGV2YXJ7ZXhlYy1wcmVmaXh9L2xpYi9weXRob25cc2hvcnR2ZXJzaW9uL3NpdGUtcGFja2FnZXN9fQotICAgICAgICAgIHtcZmlsZW5xey91c3IvbG9jYWwvbGliL3B5dGhvblxzaG9ydHZlcnNpb24vc2l0ZS1wYWNrYWdlc319Ci0gICAgICAgICAgeygxKX0KLSAgXGxpbmVpdntXaW5kb3dzfQotICAgICAgICAgIHtcZmlsZW5xe1xmaWxldmFye3ByZWZpeH19fQotICAgICAgICAgIHtcZmlsZW5xe0M6XHRleHRiYWNrc2xhc2h7fVB5dGhvbn19Ci0gICAgICAgICAgeygyKX0KLVxlbmR7dGFibGVpdn0KLQotXG5vaW5kZW50IE5vdGVzOgotXGJlZ2lue2Rlc2NyaXB0aW9ufQotXGl0ZW1bKDEpXSBNb3N0IExpbnV4IGRpc3RyaWJ1dGlvbnMgaW5jbHVkZSBQeXRob24gYXMgYSBzdGFuZGFyZCBwYXJ0IG9mCi0gIHRoZSBzeXN0ZW0sIHNvIFxmaWxldmFye3ByZWZpeH0gYW5kIFxmaWxldmFye2V4ZWMtcHJlZml4fSBhcmUgdXN1YWxseQotICBib3RoIFxmaWxley91c3J9IG9uIExpbnV4LiAgSWYgeW91IGJ1aWxkIFB5dGhvbiB5b3Vyc2VsZiBvbiBMaW51eCAob3IKLSAgYW55IFxVTklYLWxpa2Ugc3lzdGVtKSwgdGhlIGRlZmF1bHQgXGZpbGV2YXJ7cHJlZml4fSBhbmQKLSAgXGZpbGV2YXJ7ZXhlYy1wcmVmaXh9IGFyZSBcZmlsZXsvdXNyL2xvY2FsfS4KLVxpdGVtWygyKV0gVGhlIGRlZmF1bHQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvbiBXaW5kb3dzIHdhcwotICBcZmlsZXtDOlx0ZXh0YmFja3NsYXNoe31Qcm9ncmFtIEZpbGVzXHRleHRiYWNrc2xhc2h7fVB5dGhvbn0gdW5kZXIKLSAgUHl0aG9uIDEuNmExLCAxLjUuMiwgYW5kIGVhcmxpZXIuCi1cZW5ke2Rlc2NyaXB0aW9ufQotCi1cZmlsZXZhcntwcmVmaXh9IGFuZCBcZmlsZXZhcntleGVjLXByZWZpeH0gc3RhbmQgZm9yIHRoZSBkaXJlY3RvcmllcwotdGhhdCBQeXRob24gaXMgaW5zdGFsbGVkIHRvLCBhbmQgd2hlcmUgaXQgZmluZHMgaXRzIGxpYnJhcmllcyBhdAotcnVuLXRpbWUuICBUaGV5IGFyZSBhbHdheXMgdGhlIHNhbWUgdW5kZXIgV2luZG93cywgYW5kIHZlcnkKLW9mdGVuIHRoZSBzYW1lIHVuZGVyIFxVTklYe30gYW5kIE1hYyBPUyBYLiAgWW91IGNhbiBmaW5kIG91dCB3aGF0IHlvdXIgUHl0aG9uCi1pbnN0YWxsYXRpb24gdXNlcyBmb3IgXGZpbGV2YXJ7cHJlZml4fSBhbmQgXGZpbGV2YXJ7ZXhlYy1wcmVmaXh9IGJ5Ci1ydW5uaW5nIFB5dGhvbiBpbiBpbnRlcmFjdGl2ZSBtb2RlIGFuZCB0eXBpbmcgYSBmZXcgc2ltcGxlIGNvbW1hbmRzLgotVW5kZXIgXFVOSVgsIGp1c3QgdHlwZSBcY29kZXtweXRob259IGF0IHRoZSBzaGVsbCBwcm9tcHQuICBVbmRlcgotV2luZG93cywgY2hvb3NlIFxtZW51c2VsZWN0aW9ue1N0YXJ0IFxzdWIgUHJvZ3JhbXMgXHN1YiBQeXRob24KLVxzaG9ydHZlcnNpb24gXHN1YiBQeXRob24gKGNvbW1hbmQgbGluZSl9LiAgCi1PbmNlIHRoZSBpbnRlcnByZXRlciBpcyBzdGFydGVkLCB5b3UgdHlwZSBQeXRob24gY29kZSBhdCB0aGUKLXByb21wdC4gIEZvciBleGFtcGxlLCBvbiBteSBMaW51eCBzeXN0ZW0sIEkgdHlwZSB0aGUgdGhyZWUgUHl0aG9uCi1zdGF0ZW1lbnRzIHNob3duIGJlbG93LCBhbmQgZ2V0IHRoZSBvdXRwdXQgYXMgc2hvd24sIHRvIGZpbmQgb3V0IG15Ci1cZmlsZXZhcntwcmVmaXh9IGFuZCBcZmlsZXZhcntleGVjLXByZWZpeH06Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLVB5dGhvbiAyLjQgKCMyNiwgQXVnICA3IDIwMDQsIDE3OjE5OjAyKSAKLVR5cGUgImhlbHAiLCAiY29weXJpZ2h0IiwgImNyZWRpdHMiIG9yICJsaWNlbnNlIiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLT4+PiBpbXBvcnQgc3lzCi0+Pj4gc3lzLnByZWZpeAotJy91c3InCi0+Pj4gc3lzLmV4ZWNfcHJlZml4Ci0nL3VzcicKLVxlbmR7dmVyYmF0aW19Ci0KLUlmIHlvdSBkb24ndCB3YW50IHRvIGluc3RhbGwgbW9kdWxlcyB0byB0aGUgc3RhbmRhcmQgbG9jYXRpb24sIG9yIGlmIHlvdQotZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIHdyaXRlIHRoZXJlLCB0aGVuIHlvdSBuZWVkIHRvIHJlYWQgYWJvdXQKLWFsdGVybmF0ZSBpbnN0YWxsYXRpb25zIGluIHNlY3Rpb25+XHJlZnthbHQtaW5zdGFsbH0uICBJZiB5b3Ugd2FudCB0bwotY3VzdG9taXplIHlvdXIgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzIG1vcmUgaGVhdmlseSwgc2VlCi1zZWN0aW9uflxyZWZ7Y3VzdG9tLWluc3RhbGx9IG9uIGN1c3RvbSBpbnN0YWxsYXRpb25zLgotCi0KLSUgVGhpcyByYXRoZXIgbmFzdHkgbWFjcm8gaXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgdGFibGVzIHRoYXQgZGVzY3JpYmUKLSUgZWFjaCBpbnN0YWxsYXRpb24gc2NoZW1lLiAgSXQncyBuYXN0eSBiZWNhdXNlIGl0IHRha2VzIHR3byBhcmd1bWVudHMKLSUgZm9yIGVhY2ggInNsb3QiIGluIGFuIGluc3RhbGxhdGlvbiBzY2hlbWUsIHRoZXJlIHdpbGwgc29vbiBiZSBtb3JlCi0lIHRoYW4gZml2ZSBvZiB0aGVzZSBzbG90cywgYW5kIFRlWCBoYXMgYSBsaW1pdCBvZiAxMCBhcmd1bWVudHMgdG8gYQotJSBtYWNyby4gIFVoLW9oLgotCi1cbmV3Y29tbWFuZHtcaW5zdGFsbHNjaGVtZX1bOF0KLSAge1xiZWdpbnt0YWJsZWlpaX17bHxsfGx9e3RleHRybX0KLSAgICAgICAgICB7VHlwZSBvZiBmaWxlfQotICAgICAgICAgIHtJbnN0YWxsYXRpb24gRGlyZWN0b3J5fQotICAgICAgICAgIHtPdmVycmlkZSBvcHRpb259Ci0gICAgIFxsaW5laWlpe3B1cmUgbW9kdWxlIGRpc3RyaWJ1dGlvbn0KLSAgICAgICAgICAgICB7XGZpbGV2YXJ7IzF9XGZpbGVucXsjMn19Ci0gICAgICAgICAgICAge1xsb25ncHJvZ3JhbW9wdHtpbnN0YWxsLXB1cmVsaWJ9fQotICAgICBcbGluZWlpaXtub24tcHVyZSBtb2R1bGUgZGlzdHJpYnV0aW9ufQotICAgICAgICAgICAgIHtcZmlsZXZhcnsjM31cZmlsZW5xeyM0fX0KLSAgICAgICAgICAgICB7XGxvbmdwcm9ncmFtb3B0e2luc3RhbGwtcGxhdGxpYn19Ci0gICAgIFxsaW5laWlpe3NjcmlwdHN9Ci0gICAgICAgICAgICAge1xmaWxldmFyeyM1fVxmaWxlbnF7IzZ9fQotICAgICAgICAgICAgIHtcbG9uZ3Byb2dyYW1vcHR7aW5zdGFsbC1zY3JpcHRzfX0KLSAgICAgXGxpbmVpaWl7ZGF0YX0KLSAgICAgICAgICAgICB7XGZpbGV2YXJ7Izd9XGZpbGVucXsjOH19Ci0gICAgICAgICAgICAge1xsb25ncHJvZ3JhbW9wdHtpbnN0YWxsLWRhdGF9fQotICAgXGVuZHt0YWJsZWlpaX19Ci0KLQotXHNlY3Rpb257QWx0ZXJuYXRlIEluc3RhbGxhdGlvbn0KLVxsYWJlbHthbHQtaW5zdGFsbH0KLQotT2Z0ZW4sIGl0IGlzIG5lY2Vzc2FyeSBvciBkZXNpcmFibGUgdG8gaW5zdGFsbCBtb2R1bGVzIHRvIGEgbG9jYXRpb24KLW90aGVyIHRoYW4gdGhlIHN0YW5kYXJkIGxvY2F0aW9uIGZvciB0aGlyZC1wYXJ0eSBQeXRob24gbW9kdWxlcy4gIEZvcgotZXhhbXBsZSwgb24gYSBcVU5JWHt9IHN5c3RlbSB5b3UgbWlnaHQgbm90IGhhdmUgcGVybWlzc2lvbiB0byB3cml0ZSB0byB0aGUKLXN0YW5kYXJkIHRoaXJkLXBhcnR5IG1vZHVsZSBkaXJlY3RvcnkuICBPciB5b3UgbWlnaHQgd2lzaCB0byB0cnkgb3V0IGEKLW1vZHVsZSBiZWZvcmUgbWFraW5nIGl0IGEgc3RhbmRhcmQgcGFydCBvZiB5b3VyIGxvY2FsIFB5dGhvbgotaW5zdGFsbGF0aW9uLiAgVGhpcyBpcyBlc3BlY2lhbGx5IHRydWUgd2hlbiB1cGdyYWRpbmcgYSBkaXN0cmlidXRpb24KLWFscmVhZHkgcHJlc2VudDogeW91IHdhbnQgdG8gbWFrZSBzdXJlIHlvdXIgZXhpc3RpbmcgYmFzZSBvZiBzY3JpcHRzCi1zdGlsbCB3b3JrcyB3aXRoIHRoZSBuZXcgdmVyc2lvbiBiZWZvcmUgYWN0dWFsbHkgdXBncmFkaW5nLgotCi1UaGUgRGlzdHV0aWxzIFxjb21tYW5ke2luc3RhbGx9IGNvbW1hbmQgaXMgZGVzaWduZWQgdG8gbWFrZSBpbnN0YWxsaW5nCi1tb2R1bGUgZGlzdHJpYnV0aW9ucyB0byBhbiBhbHRlcm5hdGUgbG9jYXRpb24gc2ltcGxlIGFuZCBwYWlubGVzcy4gIFRoZQotYmFzaWMgaWRlYSBpcyB0aGF0IHlvdSBzdXBwbHkgYSBiYXNlIGRpcmVjdG9yeSBmb3IgdGhlIGluc3RhbGxhdGlvbiwgYW5kCi10aGUgXGNvbW1hbmR7aW5zdGFsbH0gY29tbWFuZCBwaWNrcyBhIHNldCBvZiBkaXJlY3RvcmllcyAoY2FsbGVkIGFuCi1cZW1waHtpbnN0YWxsYXRpb24gc2NoZW1lfSkgdW5kZXIgdGhpcyBiYXNlIGRpcmVjdG9yeSBpbiB3aGljaCB0bwotaW5zdGFsbCBmaWxlcy4gIFRoZSBkZXRhaWxzIGRpZmZlciBhY3Jvc3MgcGxhdGZvcm1zLCBzbyByZWFkIHdoaWNoZXZlcgotb2YgdGhlIGZvbGxvd2luZyBzZWN0aW9ucyBhcHBsaWVzIHRvIHlvdS4KLQotCi1cc3Vic2VjdGlvbntBbHRlcm5hdGUgaW5zdGFsbGF0aW9uOiB0aGUgaG9tZSBzY2hlbWV9Ci1cbGFiZWx7YWx0LWluc3RhbGwtcHJlZml4fQotCi1UaGUgaWRlYSBiZWhpbmQgdGhlIGBgaG9tZSBzY2hlbWUnJyBpcyB0aGF0IHlvdSBidWlsZCBhbmQgbWFpbnRhaW4gYQotcGVyc29uYWwgc3Rhc2ggb2YgUHl0aG9uIG1vZHVsZXMuICBUaGlzIHNjaGVtZSdzIG5hbWUgaXMgZGVyaXZlZCBmcm9tCi10aGUgaWRlYSBvZiBhIGBgaG9tZScnIGRpcmVjdG9yeSBvbiBcVU5JWCwgc2luY2UgaXQncyBub3QgdW51c3VhbCBmb3IKLWEgXFVOSVh7fSB1c2VyIHRvIG1ha2UgdGhlaXIgaG9tZSBkaXJlY3RvcnkgaGF2ZSBhIGxheW91dCBzaW1pbGFyIHRvCi1cZmlsZXsvdXNyL30gb3IgXGZpbGV7L3Vzci9sb2NhbC99LiAgVGhpcyBzY2hlbWUgY2FuIGJlIHVzZWQgYnkKLWFueW9uZSwgcmVnYXJkbGVzcyBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0aGVpciBpbnN0YWxsaW5nIGZvci4KLQotSW5zdGFsbGluZyBhIG5ldyBtb2R1bGUgZGlzdHJpYnV0aW9uIGlzIGFzIHNpbXBsZSBhcwotCi1cYmVnaW57dmVyYmF0aW19Ci1weXRob24gc2V0dXAucHkgaW5zdGFsbCAtLWhvbWU9PGRpcj4KLVxlbmR7dmVyYmF0aW19Ci0KLXdoZXJlIHlvdSBjYW4gc3VwcGx5IGFueSBkaXJlY3RvcnkgeW91IGxpa2UgZm9yIHRoZQotXGxvbmdwcm9ncmFtb3B0e2hvbWV9IG9wdGlvbi4gIE9uIFxVTklYLCBsYXp5IHR5cGlzdHMgY2FuIGp1c3QgdHlwZSBhCi10aWxkZSAoXGNvZGV7XHRleHRhc2NpaXRpbGRlfSk7IHRoZSBcY29tbWFuZHtpbnN0YWxsfSBjb21tYW5kIHdpbGwKLWV4cGFuZCB0aGlzIHRvIHlvdXIgaG9tZSBkaXJlY3Rvcnk6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXB5dGhvbiBzZXR1cC5weSBpbnN0YWxsIC0taG9tZT1+Ci1cZW5ke3ZlcmJhdGltfQotCi1UaGUgXGxvbmdwcm9ncmFtb3B0e2hvbWV9IG9wdGlvbiBkZWZpbmVzIHRoZSBpbnN0YWxsYXRpb24gYmFzZQotZGlyZWN0b3J5LiAgRmlsZXMgYXJlIGluc3RhbGxlZCB0byB0aGUgZm9sbG93aW5nIGRpcmVjdG9yaWVzIHVuZGVyIHRoZQotaW5zdGFsbGF0aW9uIGJhc2UgYXMgZm9sbG93czoKLVxpbnN0YWxsc2NoZW1le2hvbWV9ey9saWIvcHl0aG9ufQotICAgICAgICAgICAgICB7aG9tZX17L2xpYi9weXRob259Ci0gICAgICAgICAgICAgIHtob21lfXsvYmlufQotICAgICAgICAgICAgICB7aG9tZX17L3NoYXJlfQotCi0KLVx2ZXJzaW9uY2hhbmdlZFtUaGUgXGxvbmdwcm9ncmFtb3B0e2hvbWV9IG9wdGlvbiB1c2VkIHRvIGJlIHN1cHBvcnRlZAotICAgICAgICAgICAgICAgIG9ubHkgb24gXFVOSVhdezIuNH0KLQotCi1cc3Vic2VjdGlvbntBbHRlcm5hdGUgaW5zdGFsbGF0aW9uOiBcVU5JWHt9ICh0aGUgcHJlZml4IHNjaGVtZSl9Ci1cbGFiZWx7YWx0LWluc3RhbGwtaG9tZX0KLQotVGhlIGBgcHJlZml4IHNjaGVtZScnIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIHVzZSBvbmUgUHl0aG9uCi1pbnN0YWxsYXRpb24gdG8gcGVyZm9ybSB0aGUgYnVpbGQvaW5zdGFsbCAoaS5lLiwgdG8gcnVuIHRoZSBzZXR1cAotc2NyaXB0KSwgYnV0IGluc3RhbGwgbW9kdWxlcyBpbnRvIHRoZSB0aGlyZC1wYXJ0eSBtb2R1bGUgZGlyZWN0b3J5IG9mIGEKLWRpZmZlcmVudCBQeXRob24gaW5zdGFsbGF0aW9uIChvciBzb21ldGhpbmcgdGhhdCBsb29rcyBsaWtlIGEgZGlmZmVyZW50Ci1QeXRob24gaW5zdGFsbGF0aW9uKS4gIElmIHRoaXMgc291bmRzIGEgdHJpZmxlIHVudXN1YWwsIGl0IGlzLS0tdGhhdCdzCi13aHkgdGhlIGBgaG9tZSBzY2hlbWUnJyBjb21lcyBmaXJzdC4gIEhvd2V2ZXIsIHRoZXJlIGFyZSBhdCBsZWFzdCB0d28KLWtub3duIGNhc2VzIHdoZXJlIHRoZSBwcmVmaXggc2NoZW1lIHdpbGwgYmUgdXNlZnVsLgotCi1GaXJzdCwgY29uc2lkZXIgdGhhdCBtYW55IExpbnV4IGRpc3RyaWJ1dGlvbnMgcHV0IFB5dGhvbiBpbiBcZmlsZXsvdXNyfSwKLXJhdGhlciB0aGFuIHRoZSBtb3JlIHRyYWRpdGlvbmFsIFxmaWxley91c3IvbG9jYWx9LiAgVGhpcyBpcyBlbnRpcmVseQotYXBwcm9wcmlhdGUsIHNpbmNlIGluIHRob3NlIGNhc2VzIFB5dGhvbiBpcyBwYXJ0IG9mIGBgdGhlIHN5c3RlbScnCi1yYXRoZXIgdGhhbiBhIGxvY2FsIGFkZC1vbi4gIEhvd2V2ZXIsIGlmIHlvdSBhcmUgaW5zdGFsbGluZyBQeXRob24KLW1vZHVsZXMgZnJvbSBzb3VyY2UsIHlvdSBwcm9iYWJseSB3YW50IHRoZW0gdG8gZ28gaW4KLVxmaWxley91c3IvbG9jYWwvbGliL3B5dGhvbjIuXGZpbGV2YXJ7WH19IHJhdGhlciB0aGFuCi1cZmlsZXsvdXNyL2xpYi9weXRob24yLlxmaWxldmFye1h9fS4gIFRoaXMgY2FuIGJlIGRvbmUgd2l0aAotCi1cYmVnaW57dmVyYmF0aW19Ci0vdXNyL2Jpbi9weXRob24gc2V0dXAucHkgaW5zdGFsbCAtLXByZWZpeD0vdXNyL2xvY2FsCi1cZW5ke3ZlcmJhdGltfQotCi1Bbm90aGVyIHBvc3NpYmlsaXR5IGlzIGEgbmV0d29yayBmaWxlc3lzdGVtIHdoZXJlIHRoZSBuYW1lIHVzZWQgdG8gd3JpdGUKLXRvIGEgcmVtb3RlIGRpcmVjdG9yeSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgbmFtZSB1c2VkIHRvIHJlYWQgaXQ6IGZvcgotZXhhbXBsZSwgdGhlIFB5dGhvbiBpbnRlcnByZXRlciBhY2Nlc3NlZCBhcyBcZmlsZXsvdXNyL2xvY2FsL2Jpbi9weXRob259Ci1taWdodCBzZWFyY2ggZm9yIG1vZHVsZXMgaW4gXGZpbGV7L3Vzci9sb2NhbC9saWIvcHl0aG9uMi5cZmlsZXZhcntYfX0sCi1idXQgdGhvc2UgbW9kdWxlcyB3b3VsZCBoYXZlIHRvIGJlIGluc3RhbGxlZCB0bywgc2F5LAotXGZpbGV7L21udC9cZmlsZXZhcntAc2VydmVyfS9leHBvcnQvbGliL3B5dGhvbjIuXGZpbGV2YXJ7WH19LiAgVGhpcwotY291bGQgYmUgZG9uZSB3aXRoCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLS91c3IvbG9jYWwvYmluL3B5dGhvbiBzZXR1cC5weSBpbnN0YWxsIC0tcHJlZml4PS9tbnQvQHNlcnZlci9leHBvcnQKLVxlbmR7dmVyYmF0aW19Ci0KLUluIGVpdGhlciBjYXNlLCB0aGUgXGxvbmdwcm9ncmFtb3B0e3ByZWZpeH0gb3B0aW9uIGRlZmluZXMgdGhlCi1pbnN0YWxsYXRpb24gYmFzZSwgYW5kIHRoZSBcbG9uZ3Byb2dyYW1vcHR7ZXhlYy1wcmVmaXh9IG9wdGlvbiBkZWZpbmVzCi10aGUgcGxhdGZvcm0tc3BlY2lmaWMgaW5zdGFsbGF0aW9uIGJhc2UsIHdoaWNoIGlzIHVzZWQgZm9yCi1wbGF0Zm9ybS1zcGVjaWZpYyBmaWxlcy4gIChDdXJyZW50bHksIHRoaXMganVzdCBtZWFucyBub24tcHVyZSBtb2R1bGUKLWRpc3RyaWJ1dGlvbnMsIGJ1dCBjb3VsZCBiZSBleHBhbmRlZCB0byBDIGxpYnJhcmllcywgYmluYXJ5IGV4ZWN1dGFibGVzLAotZXRjLikgIElmIFxsb25ncHJvZ3JhbW9wdHtleGVjLXByZWZpeH0gaXMgbm90IHN1cHBsaWVkLCBpdCBkZWZhdWx0cyB0bwotXGxvbmdwcm9ncmFtb3B0e3ByZWZpeH0uICBGaWxlcyBhcmUgaW5zdGFsbGVkIGFzIGZvbGxvd3M6Ci0KLVxpbnN0YWxsc2NoZW1le3ByZWZpeH17L2xpYi9weXRob24yLlxmaWxldmFye1h9L3NpdGUtcGFja2FnZXN9Ci0gICAgICAgICAgICAgIHtleGVjLXByZWZpeH17L2xpYi9weXRob24yLlxmaWxldmFye1h9L3NpdGUtcGFja2FnZXN9Ci0gICAgICAgICAgICAgIHtwcmVmaXh9ey9iaW59Ci0gICAgICAgICAgICAgIHtwcmVmaXh9ey9zaGFyZX0KLQotVGhlcmUgaXMgbm8gcmVxdWlyZW1lbnQgdGhhdCBcbG9uZ3Byb2dyYW1vcHR7cHJlZml4fSBvcgotXGxvbmdwcm9ncmFtb3B0e2V4ZWMtcHJlZml4fSBhY3R1YWxseSBwb2ludCB0byBhbiBhbHRlcm5hdGUgUHl0aG9uCi1pbnN0YWxsYXRpb247IGlmIHRoZSBkaXJlY3RvcmllcyBsaXN0ZWQgYWJvdmUgZG8gbm90IGFscmVhZHkgZXhpc3QsIHRoZXkKLWFyZSBjcmVhdGVkIGF0IGluc3RhbGxhdGlvbiB0aW1lLgotCi1JbmNpZGVudGFsbHksIHRoZSByZWFsIHJlYXNvbiB0aGUgcHJlZml4IHNjaGVtZSBpcyBpbXBvcnRhbnQgaXMgc2ltcGx5Ci10aGF0IGEgc3RhbmRhcmQgXFVOSVh7fSBpbnN0YWxsYXRpb24gdXNlcyB0aGUgcHJlZml4IHNjaGVtZSwgYnV0IHdpdGgKLVxsb25ncHJvZ3JhbW9wdHtwcmVmaXh9IGFuZCBcbG9uZ3Byb2dyYW1vcHR7ZXhlYy1wcmVmaXh9IHN1cHBsaWVkIGJ5Ci1QeXRob24gaXRzZWxmIGFzIFxjb2Rle3N5cy5wcmVmaXh9IGFuZCBcY29kZXtzeXMuZXhlY1xfcHJlZml4fS4gIFRodXMsCi15b3UgbWlnaHQgdGhpbmsgeW91J2xsIG5ldmVyIHVzZSB0aGUgcHJlZml4IHNjaGVtZSwgYnV0IGV2ZXJ5IHRpbWUgeW91Ci1ydW4gXGNvZGV7cHl0aG9uIHNldHVwLnB5IGluc3RhbGx9IHdpdGhvdXQgYW55IG90aGVyIG9wdGlvbnMsIHlvdSdyZQotdXNpbmcgaXQuCi0KLU5vdGUgdGhhdCBpbnN0YWxsaW5nIGV4dGVuc2lvbnMgdG8gYW4gYWx0ZXJuYXRlIFB5dGhvbiBpbnN0YWxsYXRpb24gaGFzCi1ubyBlZmZlY3Qgb24gaG93IHRob3NlIGV4dGVuc2lvbnMgYXJlIGJ1aWx0OiBpbiBwYXJ0aWN1bGFyLCB0aGUgUHl0aG9uCi1oZWFkZXIgZmlsZXMgKFxmaWxle1B5dGhvbi5ofSBhbmQgZnJpZW5kcykgaW5zdGFsbGVkIHdpdGggdGhlIFB5dGhvbgotaW50ZXJwcmV0ZXIgdXNlZCB0byBydW4gdGhlIHNldHVwIHNjcmlwdCB3aWxsIGJlIHVzZWQgaW4gY29tcGlsaW5nCi1leHRlbnNpb25zLiAgSXQgaXMgeW91ciByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCB0aGUgaW50ZXJwcmV0ZXIKLXVzZWQgdG8gcnVuIGV4dGVuc2lvbnMgaW5zdGFsbGVkIGluIHRoaXMgd2F5IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUKLWludGVycHJldGVyIHVzZWQgdG8gYnVpbGQgdGhlbS4gIFRoZSBiZXN0IHdheSB0byBkbyB0aGlzIGlzIHRvIGVuc3VyZQotdGhhdCB0aGUgdHdvIGludGVycHJldGVycyBhcmUgdGhlIHNhbWUgdmVyc2lvbiBvZiBQeXRob24gKHBvc3NpYmx5Ci1kaWZmZXJlbnQgYnVpbGRzLCBvciBwb3NzaWJseSBjb3BpZXMgb2YgdGhlIHNhbWUgYnVpbGQpLiAgKE9mIGNvdXJzZSwgaWYKLXlvdXIgXGxvbmdwcm9ncmFtb3B0e3ByZWZpeH0gYW5kIFxsb25ncHJvZ3JhbW9wdHtleGVjLXByZWZpeH0gZG9uJ3QgZXZlbgotcG9pbnQgdG8gYW4gYWx0ZXJuYXRlIFB5dGhvbiBpbnN0YWxsYXRpb24sIHRoaXMgaXMgaW1tYXRlcmlhbC4pCi0KLQotXHN1YnNlY3Rpb257QWx0ZXJuYXRlIGluc3RhbGxhdGlvbjogV2luZG93cyAodGhlIHByZWZpeCBzY2hlbWUpfQotXGxhYmVse2FsdC1pbnN0YWxsLXdpbmRvd3N9Ci0KLVdpbmRvd3MgaGFzIG5vIGNvbmNlcHQgb2YgYSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnksIGFuZCBzaW5jZSB0aGUKLXN0YW5kYXJkIFB5dGhvbiBpbnN0YWxsYXRpb24gdW5kZXIgV2luZG93cyBpcyBzaW1wbGVyIHRoYW4gdW5kZXIKLVxVTklYLCB0aGUgXGxvbmdwcm9ncmFtb3B0e3ByZWZpeH0gb3B0aW9uIGhhcyB0cmFkaXRpb25hbGx5IGJlZW4gdXNlZAotdG8gaW5zdGFsbCBhZGRpdGlvbmFsIHBhY2thZ2VzIGluIHNlcGFyYXRlIGxvY2F0aW9ucyBvbiBXaW5kb3dzLgotCi1cYmVnaW57dmVyYmF0aW19Ci1weXRob24gc2V0dXAucHkgaW5zdGFsbCAtLXByZWZpeD0iXFRlbXBcUHl0aG9uIgotXGVuZHt2ZXJiYXRpbX0KLQotdG8gaW5zdGFsbCBtb2R1bGVzIHRvIHRoZQotXGZpbGV7XHRleHRiYWNrc2xhc2h7fVRlbXBcdGV4dGJhY2tzbGFzaHt9UHl0aG9ufSBkaXJlY3Rvcnkgb24gdGhlCi1jdXJyZW50IGRyaXZlLgotCi1UaGUgaW5zdGFsbGF0aW9uIGJhc2UgaXMgZGVmaW5lZCBieSB0aGUgXGxvbmdwcm9ncmFtb3B0e3ByZWZpeH0gb3B0aW9uOwotdGhlIFxsb25ncHJvZ3JhbW9wdHtleGVjLXByZWZpeH0gb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgdW5kZXIgV2luZG93cy4KLUZpbGVzIGFyZSBpbnN0YWxsZWQgYXMgZm9sbG93czoKLVxpbnN0YWxsc2NoZW1le3ByZWZpeH17fQotICAgICAgICAgICAgICB7cHJlZml4fXt9Ci0gICAgICAgICAgICAgIHtwcmVmaXh9e1x0ZXh0YmFja3NsYXNoe31TY3JpcHRzfQotICAgICAgICAgICAgICB7cHJlZml4fXtcdGV4dGJhY2tzbGFzaHt9RGF0YX0KLQotCi0KLVxzZWN0aW9ue0N1c3RvbSBJbnN0YWxsYXRpb259Ci1cbGFiZWx7Y3VzdG9tLWluc3RhbGx9Ci0KLVNvbWV0aW1lcywgdGhlIGFsdGVybmF0ZSBpbnN0YWxsYXRpb24gc2NoZW1lcyBkZXNjcmliZWQgaW4KLXNlY3Rpb25+XHJlZnthbHQtaW5zdGFsbH0ganVzdCBkb24ndCBkbyB3aGF0IHlvdSB3YW50LiAgWW91IG1pZ2h0Ci13YW50IHRvIHR3ZWFrIGp1c3Qgb25lIG9yIHR3byBkaXJlY3RvcmllcyB3aGlsZSBrZWVwaW5nIGV2ZXJ5dGhpbmcgdW5kZXIKLXRoZSBzYW1lIGJhc2UgZGlyZWN0b3J5LCBvciB5b3UgbWlnaHQgd2FudCB0byBjb21wbGV0ZWx5IHJlZGVmaW5lIHRoZQotaW5zdGFsbGF0aW9uIHNjaGVtZS4gIEluIGVpdGhlciBjYXNlLCB5b3UncmUgY3JlYXRpbmcgYSBcZW1waHtjdXN0b20KLWluc3RhbGxhdGlvbiBzY2hlbWV9LgotCi1Zb3UgcHJvYmFibHkgbm90aWNlZCB0aGUgY29sdW1uIG9mIGBgb3ZlcnJpZGUgb3B0aW9ucycnIGluIHRoZSB0YWJsZXMKLWRlc2NyaWJpbmcgdGhlIGFsdGVybmF0ZSBpbnN0YWxsYXRpb24gc2NoZW1lcyBhYm92ZS4gIFRob3NlIG9wdGlvbnMgYXJlCi1ob3cgeW91IGRlZmluZSBhIGN1c3RvbSBpbnN0YWxsYXRpb24gc2NoZW1lLiAgVGhlc2Ugb3ZlcnJpZGUgb3B0aW9ucyBjYW4KLWJlIHJlbGF0aXZlLCBhYnNvbHV0ZSwgb3IgZXhwbGljaXRseSBkZWZpbmVkIGluIHRlcm1zIG9mIG9uZSBvZiB0aGUKLWluc3RhbGxhdGlvbiBiYXNlIGRpcmVjdG9yaWVzLiAgKFRoZXJlIGFyZSB0d28gaW5zdGFsbGF0aW9uIGJhc2UKLWRpcmVjdG9yaWVzLCBhbmQgdGhleSBhcmUgbm9ybWFsbHkgdGhlIHNhbWUtLS10aGV5IG9ubHkgZGlmZmVyIHdoZW4geW91Ci11c2UgdGhlIFxVTklYe30gYGBwcmVmaXggc2NoZW1lJycgYW5kIHN1cHBseSBkaWZmZXJlbnQKLVxsb25ncHJvZ3JhbW9wdHtwcmVmaXh9IGFuZCBcbG9uZ3Byb2dyYW1vcHR7ZXhlYy1wcmVmaXh9IG9wdGlvbnMuKQotCi1Gb3IgZXhhbXBsZSwgc2F5IHlvdSdyZSBpbnN0YWxsaW5nIGEgbW9kdWxlIGRpc3RyaWJ1dGlvbiB0byB5b3VyIGhvbWUKLWRpcmVjdG9yeSB1bmRlciBcVU5JWC0tLWJ1dCB5b3Ugd2FudCBzY3JpcHRzIHRvIGdvIGluCi1cZmlsZXtcdGV4dGFzY2lpdGlsZGUvc2NyaXB0c30gcmF0aGVyIHRoYW4gXGZpbGV7XHRleHRhc2NpaXRpbGRlL2Jpbn0uCi1BcyB5b3UgbWlnaHQgZXhwZWN0LCB5b3UgY2FuIG92ZXJyaWRlIHRoaXMgZGlyZWN0b3J5IHdpdGggdGhlCi1cbG9uZ3Byb2dyYW1vcHR7aW5zdGFsbC1zY3JpcHRzfSBvcHRpb247IGluIHRoaXMgY2FzZSwgaXQgbWFrZXMgbW9zdAotc2Vuc2UgdG8gc3VwcGx5IGEgcmVsYXRpdmUgcGF0aCwgd2hpY2ggd2lsbCBiZSBpbnRlcnByZXRlZCByZWxhdGl2ZSB0bwotdGhlIGluc3RhbGxhdGlvbiBiYXNlIGRpcmVjdG9yeSAoeW91ciBob21lIGRpcmVjdG9yeSwgaW4gdGhpcyBjYXNlKToKLQotXGJlZ2lue3ZlcmJhdGltfQotcHl0aG9uIHNldHVwLnB5IGluc3RhbGwgLS1ob21lPX4gLS1pbnN0YWxsLXNjcmlwdHM9c2NyaXB0cwotXGVuZHt2ZXJiYXRpbX0KLQotQW5vdGhlciBcVU5JWHt9IGV4YW1wbGU6IHN1cHBvc2UgeW91ciBQeXRob24gaW5zdGFsbGF0aW9uIHdhcyBidWlsdCBhbmQKLWluc3RhbGxlZCB3aXRoIGEgcHJlZml4IG9mIFxmaWxley91c3IvbG9jYWwvcHl0aG9ufSwgc28gdW5kZXIgYSBzdGFuZGFyZCAKLWluc3RhbGxhdGlvbiBzY3JpcHRzIHdpbGwgd2luZCB1cCBpbiBcZmlsZXsvdXNyL2xvY2FsL3B5dGhvbi9iaW59LiAgSWYKLXlvdSB3YW50IHRoZW0gaW4gXGZpbGV7L3Vzci9sb2NhbC9iaW59IGluc3RlYWQsIHlvdSB3b3VsZCBzdXBwbHkgdGhpcwotYWJzb2x1dGUgZGlyZWN0b3J5IGZvciB0aGUgXGxvbmdwcm9ncmFtb3B0e2luc3RhbGwtc2NyaXB0c30gb3B0aW9uOgotCi1cYmVnaW57dmVyYmF0aW19Ci1weXRob24gc2V0dXAucHkgaW5zdGFsbCAtLWluc3RhbGwtc2NyaXB0cz0vdXNyL2xvY2FsL2JpbgotXGVuZHt2ZXJiYXRpbX0KLQotKFRoaXMgcGVyZm9ybXMgYW4gaW5zdGFsbGF0aW9uIHVzaW5nIHRoZSBgYHByZWZpeCBzY2hlbWUsJycgd2hlcmUgdGhlCi1wcmVmaXggaXMgd2hhdGV2ZXIgeW91ciBQeXRob24gaW50ZXJwcmV0ZXIgd2FzIGluc3RhbGxlZCB3aXRoLS0tCi1cZmlsZXsvdXNyL2xvY2FsL3B5dGhvbn0gaW4gdGhpcyBjYXNlLikKLQotSWYgeW91IG1haW50YWluIFB5dGhvbiBvbiBXaW5kb3dzLCB5b3UgbWlnaHQgd2FudCB0aGlyZC1wYXJ0eSBtb2R1bGVzIHRvCi1saXZlIGluIGEgc3ViZGlyZWN0b3J5IG9mIFxmaWxldmFye3ByZWZpeH0sIHJhdGhlciB0aGFuIHJpZ2h0IGluCi1cZmlsZXZhcntwcmVmaXh9IGl0c2VsZi4gIFRoaXMgaXMgYWxtb3N0IGFzIGVhc3kgYXMgY3VzdG9taXppbmcgdGhlCi1zY3JpcHQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS0tLXlvdSBqdXN0IGhhdmUgdG8gcmVtZW1iZXIgdGhhdCB0aGVyZSBhcmUKLXR3byB0eXBlcyBvZiBtb2R1bGVzIHRvIHdvcnJ5IGFib3V0LCBwdXJlIG1vZHVsZXMgYW5kIG5vbi1wdXJlIG1vZHVsZXMKLShpLmUuLCBtb2R1bGVzIGZyb20gYSBub24tcHVyZSBkaXN0cmlidXRpb24pLiAgRm9yIGV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXB5dGhvbiBzZXR1cC5weSBpbnN0YWxsIC0taW5zdGFsbC1wdXJlbGliPVNpdGUgLS1pbnN0YWxsLXBsYXRsaWI9U2l0ZQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIHNwZWNpZmllZCBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMgYXJlIHJlbGF0aXZlIHRvCi1cZmlsZXZhcntwcmVmaXh9LiAgT2YgY291cnNlLCB5b3UgYWxzbyBoYXZlIHRvIGVuc3VyZSB0aGF0IHRoZXNlCi1kaXJlY3RvcmllcyBhcmUgaW4gUHl0aG9uJ3MgbW9kdWxlIHNlYXJjaCBwYXRoLCBzdWNoIGFzIGJ5IHB1dHRpbmcgYQotXGZpbGV7LnB0aH0gZmlsZSBpbiBcZmlsZXZhcntwcmVmaXh9LiAgU2VlIHNlY3Rpb25+XHJlZntzZWFyY2gtcGF0aH0KLXRvIGZpbmQgb3V0IGhvdyB0byBtb2RpZnkgUHl0aG9uJ3Mgc2VhcmNoIHBhdGguCi0KLUlmIHlvdSB3YW50IHRvIGRlZmluZSBhbiBlbnRpcmUgaW5zdGFsbGF0aW9uIHNjaGVtZSwgeW91IGp1c3QgaGF2ZSB0bwotc3VwcGx5IGFsbCBvZiB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvcHRpb25zLiAgVGhlIHJlY29tbWVuZGVkIHdheQotdG8gZG8gdGhpcyBpcyB0byBzdXBwbHkgcmVsYXRpdmUgcGF0aHM7IGZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0bwotbWFpbnRhaW4gYWxsIFB5dGhvbiBtb2R1bGUtcmVsYXRlZCBmaWxlcyB1bmRlciBcZmlsZXtweXRob259IGluIHlvdXIKLWhvbWUgZGlyZWN0b3J5LCBhbmQgeW91IHdhbnQgYSBzZXBhcmF0ZSBkaXJlY3RvcnkgZm9yIGVhY2ggcGxhdGZvcm0gdGhhdAoteW91IHVzZSB5b3VyIGhvbWUgZGlyZWN0b3J5IGZyb20sIHlvdSBtaWdodCBkZWZpbmUgdGhlIGZvbGxvd2luZwotaW5zdGFsbGF0aW9uIHNjaGVtZToKLQotXGJlZ2lue3ZlcmJhdGltfQotcHl0aG9uIHNldHVwLnB5IGluc3RhbGwgLS1ob21lPX4gXAotICAgICAgICAgICAgICAgICAgICAgICAgLS1pbnN0YWxsLXB1cmVsaWI9cHl0aG9uL2xpYiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAtLWluc3RhbGwtcGxhdGxpYj1weXRob24vbGliLiRQTEFUIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIC0taW5zdGFsbC1zY3JpcHRzPXB5dGhvbi9zY3JpcHRzCi0gICAgICAgICAgICAgICAgICAgICAgICAtLWluc3RhbGwtZGF0YT1weXRob24vZGF0YQotXGVuZHt2ZXJiYXRpbX0KLSUgJCAlIC0tIGJvdyB0byBmb250LWxvY2sKLQotb3IsIGVxdWl2YWxlbnRseSwKLQotXGJlZ2lue3ZlcmJhdGltfQotcHl0aG9uIHNldHVwLnB5IGluc3RhbGwgLS1ob21lPX4vcHl0aG9uIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIC0taW5zdGFsbC1wdXJlbGliPWxpYiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAtLWluc3RhbGwtcGxhdGxpYj0nbGliLiRQTEFUJyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAtLWluc3RhbGwtc2NyaXB0cz1zY3JpcHRzCi0gICAgICAgICAgICAgICAgICAgICAgICAtLWluc3RhbGwtZGF0YT1kYXRhCi1cZW5ke3ZlcmJhdGltfQotJSAkICUgLS0gYm93IHRvIGZvbnQtbG9jawotCi1cY29kZXtcJFBMQVR9IGlzIG5vdCAobmVjZXNzYXJpbHkpIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLS0taXQgd2lsbCBiZQotZXhwYW5kZWQgYnkgdGhlIERpc3R1dGlscyBhcyBpdCBwYXJzZXMgeW91ciBjb21tYW5kIGxpbmUgb3B0aW9ucywganVzdAotYXMgaXQgZG9lcyB3aGVuIHBhcnNpbmcgeW91ciBjb25maWd1cmF0aW9uIGZpbGUocykuCi0KLU9idmlvdXNseSwgc3BlY2lmeWluZyB0aGUgZW50aXJlIGluc3RhbGxhdGlvbiBzY2hlbWUgZXZlcnkgdGltZSB5b3UKLWluc3RhbGwgYSBuZXcgbW9kdWxlIGRpc3RyaWJ1dGlvbiB3b3VsZCBiZSB2ZXJ5IHRlZGlvdXMuICBUaHVzLCB5b3UgY2FuCi1wdXQgdGhlc2Ugb3B0aW9ucyBpbnRvIHlvdXIgRGlzdHV0aWxzIGNvbmZpZyBmaWxlIChzZWUKLXNlY3Rpb25+XHJlZntjb25maWctZmlsZXN9KToKLQotXGJlZ2lue3ZlcmJhdGltfQotW2luc3RhbGxdCi1pbnN0YWxsLWJhc2U9JEhPTUUKLWluc3RhbGwtcHVyZWxpYj1weXRob24vbGliCi1pbnN0YWxsLXBsYXRsaWI9cHl0aG9uL2xpYi4kUExBVAotaW5zdGFsbC1zY3JpcHRzPXB5dGhvbi9zY3JpcHRzCi1pbnN0YWxsLWRhdGE9cHl0aG9uL2RhdGEKLVxlbmR7dmVyYmF0aW19Ci0KLW9yLCBlcXVpdmFsZW50bHksCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLVtpbnN0YWxsXQotaW5zdGFsbC1iYXNlPSRIT01FL3B5dGhvbgotaW5zdGFsbC1wdXJlbGliPWxpYgotaW5zdGFsbC1wbGF0bGliPWxpYi4kUExBVAotaW5zdGFsbC1zY3JpcHRzPXNjcmlwdHMKLWluc3RhbGwtZGF0YT1kYXRhCi1cZW5ke3ZlcmJhdGltfQotCi1Ob3RlIHRoYXQgdGhlc2UgdHdvIGFyZSBcZW1waHtub3R9IGVxdWl2YWxlbnQgaWYgeW91IHN1cHBseSBhIGRpZmZlcmVudAotaW5zdGFsbGF0aW9uIGJhc2UgZGlyZWN0b3J5IHdoZW4geW91IHJ1biB0aGUgc2V0dXAgc2NyaXB0LiAgRm9yIGV4YW1wbGUsCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLXB5dGhvbiBzZXR1cC5weSBpbnN0YWxsIC0taW5zdGFsbC1iYXNlPS90bXAKLVxlbmR7dmVyYmF0aW19Ci0KLXdvdWxkIGluc3RhbGwgcHVyZSBtb2R1bGVzIHRvIFxmaWxldmFyey90bXAvcHl0aG9uL2xpYn0gaW4gdGhlIGZpcnN0Ci1jYXNlLCBhbmQgdG8gXGZpbGV2YXJ7L3RtcC9saWJ9IGluIHRoZSBzZWNvbmQgY2FzZS4gIChGb3IgdGhlIHNlY29uZAotY2FzZSwgeW91IHByb2JhYmx5IHdhbnQgdG8gc3VwcGx5IGFuIGluc3RhbGxhdGlvbiBiYXNlIG9mCi1cZmlsZXsvdG1wL3B5dGhvbn0uKQotCi1Zb3UgcHJvYmFibHkgbm90aWNlZCB0aGUgdXNlIG9mIFxjb2Rle1wkSE9NRX0gYW5kIFxjb2Rle1wkUExBVH0gaW4gdGhlCi1zYW1wbGUgY29uZmlndXJhdGlvbiBmaWxlIGlucHV0LiAgVGhlc2UgYXJlIERpc3R1dGlscyBjb25maWd1cmF0aW9uCi12YXJpYWJsZXMsIHdoaWNoIGJlYXIgYSBzdHJvbmcgcmVzZW1ibGFuY2UgdG8gZW52aXJvbm1lbnQgdmFyaWFibGVzLgotSW4gZmFjdCwgeW91IGNhbiB1c2UgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluIGNvbmZpZyBmaWxlcyBvbgotcGxhdGZvcm1zIHRoYXQgaGF2ZSBzdWNoIGEgbm90aW9uIGJ1dCB0aGUgRGlzdHV0aWxzIGFkZGl0aW9uYWxseQotZGVmaW5lIGEgZmV3IGV4dHJhIHZhcmlhYmxlcyB0aGF0IG1heSBub3QgYmUgaW4geW91ciBlbnZpcm9ubWVudCwgc3VjaAotYXMgXGNvZGV7XCRQTEFUfS4gIChBbmQgb2YgY291cnNlLCBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3QgaGF2ZQotZW52aXJvbm1lbnQgdmFyaWFibGVzLCBzdWNoIGFzIE1hYyBPUyA5LCB0aGUgY29uZmlndXJhdGlvbgotdmFyaWFibGVzIHN1cHBsaWVkIGJ5IHRoZSBEaXN0dXRpbHMgYXJlIHRoZSBvbmx5IG9uZXMgeW91IGNhbiB1c2UuKQotU2VlIHNlY3Rpb25+XHJlZntjb25maWctZmlsZXN9IGZvciBkZXRhaWxzLgotCi0lIFhYWCBuZWVkIHNvbWUgV2luZG93cyBleGFtcGxlcy0tLXdoZW4gd291bGQgY3VzdG9tCi0lIGluc3RhbGxhdGlvbiBzY2hlbWVzIGJlIG5lZWRlZCBvbiB0aG9zZSBwbGF0Zm9ybXM/Ci0KLQotJSBYWFggSSdtIG5vdCBzdXJlIHdoZXJlIHRoaXMgc2VjdGlvbiBzaG91bGQgZ28uCi1cc3Vic2VjdGlvbntNb2RpZnlpbmcgUHl0aG9uJ3MgU2VhcmNoIFBhdGh9Ci1cbGFiZWx7c2VhcmNoLXBhdGh9Ci0KLVdoZW4gdGhlIFB5dGhvbiBpbnRlcnByZXRlciBleGVjdXRlcyBhbiBca2V5d29yZHtpbXBvcnR9IHN0YXRlbWVudCwgaXQKLXNlYXJjaGVzIGZvciBib3RoIFB5dGhvbiBjb2RlIGFuZCBleHRlbnNpb24gbW9kdWxlcyBhbG9uZyBhIHNlYXJjaAotcGF0aC4gIEEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHBhdGggaXMgY29uZmlndXJlZCBpbnRvIHRoZSBQeXRob24KLWJpbmFyeSB3aGVuIHRoZSBpbnRlcnByZXRlciBpcyBidWlsdC4gIFlvdSBjYW4gZGV0ZXJtaW5lIHRoZSBwYXRoIGJ5Ci1pbXBvcnRpbmcgdGhlIFxtb2R1bGV7c3lzfSBtb2R1bGUgYW5kIHByaW50aW5nIHRoZSB2YWx1ZSBvZgotXGNvZGV7c3lzLnBhdGh9LiAgCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLSQgcHl0aG9uCi1QeXRob24gMi4yICgjMTEsIE9jdCAgMyAyMDAyLCAxMzozMToyNykKLVtHQ0MgMi45NiAyMDAwMDczMSAoUmVkIEhhdCBMaW51eCA3LjMgMi45Ni0xMTIpXSBvbiBsaW51eDIKLVR5cGUgYGBoZWxwJycsIGBgY29weXJpZ2h0JycsIGBgY3JlZGl0cycnIG9yIGBgbGljZW5zZScnIGZvciBtb3JlIGluZm9ybWF0aW9uLgotPj4+IGltcG9ydCBzeXMKLT4+PiBzeXMucGF0aAotWycnLCAnL3Vzci9sb2NhbC9saWIvcHl0aG9uMi4zJywgJy91c3IvbG9jYWwvbGliL3B5dGhvbjIuMy9wbGF0LWxpbnV4MicsIAotICcvdXNyL2xvY2FsL2xpYi9weXRob24yLjMvbGliLXRrJywgJy91c3IvbG9jYWwvbGliL3B5dGhvbjIuMy9saWItZHlubG9hZCcsIAotICcvdXNyL2xvY2FsL2xpYi9weXRob24yLjMvc2l0ZS1wYWNrYWdlcyddCi0+Pj4KLVxlbmR7dmVyYmF0aW19ICUgJCA8LS0gYm93IHRvIGZvbnQtbG9jawotCi1UaGUgbnVsbCBzdHJpbmcgaW4gXGNvZGV7c3lzLnBhdGh9IHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgd29ya2luZwotZGlyZWN0b3J5LiAgIAotCi1UaGUgZXhwZWN0ZWQgY29udmVudGlvbiBmb3IgbG9jYWxseSBpbnN0YWxsZWQgcGFja2FnZXMgaXMgdG8gcHV0IHRoZW0KLWluIHRoZSBcZmlsZXsuLi4vc2l0ZS1wYWNrYWdlcy99IGRpcmVjdG9yeSwgYnV0IHlvdSBtYXkgd2FudCB0bwotaW5zdGFsbCBQeXRob24gbW9kdWxlcyBpbnRvIHNvbWUgYXJiaXRyYXJ5IGRpcmVjdG9yeS4gIEZvciBleGFtcGxlLAoteW91ciBzaXRlIG1heSBoYXZlIGEgY29udmVudGlvbiBvZiBrZWVwaW5nIGFsbCBzb2Z0d2FyZSByZWxhdGVkIHRvIHRoZQotd2ViIHNlcnZlciB1bmRlciBcZmlsZXsvd3d3fS4gIEFkZC1vbiBQeXRob24gbW9kdWxlcyBtaWdodCB0aGVuIGJlbG9uZwotaW4gXGZpbGV7L3d3dy9weXRob259LCBhbmQgaW4gb3JkZXIgdG8gaW1wb3J0IHRoZW0sIHRoaXMgZGlyZWN0b3J5Ci1tdXN0IGJlIGFkZGVkIHRvIFxjb2Rle3N5cy5wYXRofS4gIFRoZXJlIGFyZSBzZXZlcmFsIGRpZmZlcmVudCB3YXlzIHRvCi1hZGQgdGhlIGRpcmVjdG9yeS4KLQotVGhlIG1vc3QgY29udmVuaWVudCB3YXkgaXMgdG8gYWRkIGEgcGF0aCBjb25maWd1cmF0aW9uIGZpbGUgdG8gYQotZGlyZWN0b3J5IHRoYXQncyBhbHJlYWR5IG9uIFB5dGhvbidzIHBhdGgsIHVzdWFsbHkgdG8gdGhlCi1cZmlsZXsuLi4vc2l0ZS1wYWNrYWdlcy99IGRpcmVjdG9yeS4gIFBhdGggY29uZmlndXJhdGlvbiBmaWxlcyBoYXZlIGFuCi1leHRlbnNpb24gb2YgXGZpbGV7LnB0aH0sIGFuZCBlYWNoIGxpbmUgbXVzdCBjb250YWluIGEgc2luZ2xlIHBhdGgKLXRoYXQgd2lsbCBiZSBhcHBlbmRlZCB0byBcY29kZXtzeXMucGF0aH0uICAoQmVjYXVzZSB0aGUgbmV3IHBhdGhzIGFyZQotYXBwZW5kZWQgdG8gXGNvZGV7c3lzLnBhdGh9LCBtb2R1bGVzIGluIHRoZSBhZGRlZCBkaXJlY3RvcmllcyB3aWxsIG5vdAotb3ZlcnJpZGUgc3RhbmRhcmQgbW9kdWxlcy4gIFRoaXMgbWVhbnMgeW91IGNhbid0IHVzZSB0aGlzIG1lY2hhbmlzbQotZm9yIGluc3RhbGxpbmcgZml4ZWQgdmVyc2lvbnMgb2Ygc3RhbmRhcmQgbW9kdWxlcy4pCi0KLVBhdGhzIGNhbiBiZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSwgaW4gd2hpY2ggY2FzZSB0aGV5J3JlIHJlbGF0aXZlIHRvCi10aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIFxmaWxley5wdGh9IGZpbGUuICBBbnkgZGlyZWN0b3JpZXMgYWRkZWQKLXRvIHRoZSBzZWFyY2ggcGF0aCB3aWxsIGJlIHNjYW5uZWQgaW4gdHVybiBmb3IgXGZpbGV7LnB0aH0gZmlsZXMuICBTZWUKLVxjaXRldGl0bGVbaHR0cDovL3d3dy5weXRob24ub3JnL2Rldi9kb2MvZGV2ZWwvbGliL21vZHVsZS1zaXRlLmh0bWxdCi17c2l0ZSBtb2R1bGUgZG9jdW1lbnRhdGlvbn0gZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLUEgc2xpZ2h0bHkgbGVzcyBjb252ZW5pZW50IHdheSBpcyB0byBlZGl0IHRoZSBcZmlsZXtzaXRlLnB5fSBmaWxlIGluCi1QeXRob24ncyBzdGFuZGFyZCBsaWJyYXJ5LCBhbmQgbW9kaWZ5IFxjb2Rle3N5cy5wYXRofS4gIFxmaWxle3NpdGUucHl9Ci1pcyBhdXRvbWF0aWNhbGx5IGltcG9ydGVkIHdoZW4gdGhlIFB5dGhvbiBpbnRlcnByZXRlciBpcyBleGVjdXRlZCwKLXVubGVzcyB0aGUgXHByb2dyYW1vcHR7LVN9IHN3aXRjaCBpcyBzdXBwbGllZCB0byBzdXBwcmVzcyB0aGlzCi1iZWhhdmlvdXIuICBTbyB5b3UgY291bGQgc2ltcGx5IGVkaXQgXGZpbGV7c2l0ZS5weX0gYW5kIGFkZCB0d28gbGluZXMgdG8gaXQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCBzeXMKLXN5cy5wYXRoLmFwcGVuZCgnL3d3dy9weXRob24vJykKLVxlbmR7dmVyYmF0aW19Ci0KLUhvd2V2ZXIsIGlmIHlvdSByZWluc3RhbGwgdGhlIHNhbWUgbWFqb3IgdmVyc2lvbiBvZiBQeXRob24gKHBlcmhhcHMKLXdoZW4gdXBncmFkaW5nIGZyb20gMi4yIHRvIDIuMi4yLCBmb3IgZXhhbXBsZSkgXGZpbGV7c2l0ZS5weX0gd2lsbCBiZQotb3ZlcndyaXR0ZW4gYnkgdGhlIHN0b2NrIHZlcnNpb24uICBZb3UnZCBoYXZlIHRvIHJlbWVtYmVyIHRoYXQgaXQgd2FzCi1tb2RpZmllZCBhbmQgc2F2ZSBhIGNvcHkgYmVmb3JlIGRvaW5nIHRoZSBpbnN0YWxsYXRpb24uCi0KLVRoZXJlIGFyZSB0d28gZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgY2FuIG1vZGlmeSBcY29kZXtzeXMucGF0aH0uCi1cZW52dmFye1BZVEhPTkhPTUV9IHNldHMgYW4gYWx0ZXJuYXRlIHZhbHVlIGZvciB0aGUgcHJlZml4IG9mIHRoZQotUHl0aG9uIGluc3RhbGxhdGlvbi4gIEZvciBleGFtcGxlLCBpZiBcZW52dmFye1BZVEhPTkhPTUV9IGlzIHNldCB0bwotXHNhbXB7L3d3dy9weXRob259LCB0aGUgc2VhcmNoIHBhdGggd2lsbCBiZSBzZXQgdG8gXGNvZGV7WycnLAotJy93d3cvcHl0aG9uL2xpYi9weXRob25cc2hvcnR2ZXJzaW9uLycsCi0nL3d3dy9weXRob24vbGliL3B5dGhvblxzaG9ydHZlcnNpb24vcGxhdC1saW51eDInLCAuLi5dfS4gIAotCi1UaGUgXGVudnZhcntQWVRIT05QQVRIfSB2YXJpYWJsZSBjYW4gYmUgc2V0IHRvIGEgbGlzdCBvZiBwYXRocyB0aGF0Ci13aWxsIGJlIGFkZGVkIHRvIHRoZSBiZWdpbm5pbmcgb2YgXGNvZGV7c3lzLnBhdGh9LiAgRm9yIGV4YW1wbGUsIGlmCi1cZW52dmFye1BZVEhPTlBBVEh9IGlzIHNldCB0byBcc2FtcHsvd3d3L3B5dGhvbjovb3B0L3B5fSwgdGhlIHNlYXJjaAotcGF0aCB3aWxsIGJlZ2luIHdpdGggXGNvZGV7Wycvd3d3L3B5dGhvbicsICcvb3B0L3B5J119LiAgKE5vdGUgdGhhdAotZGlyZWN0b3JpZXMgbXVzdCBleGlzdCBpbiBvcmRlciB0byBiZSBhZGRlZCB0byBcY29kZXtzeXMucGF0aH07IHRoZQotXG1vZHVsZXtzaXRlfSBtb2R1bGUgcmVtb3ZlcyBwYXRocyB0aGF0IGRvbid0IGV4aXN0LikKLQotRmluYWxseSwgXGNvZGV7c3lzLnBhdGh9IGlzIGp1c3QgYSByZWd1bGFyIFB5dGhvbiBsaXN0LCBzbyBhbnkgUHl0aG9uCi1hcHBsaWNhdGlvbiBjYW4gbW9kaWZ5IGl0IGJ5IGFkZGluZyBvciByZW1vdmluZyBlbnRyaWVzLgotCi0KLVxzZWN0aW9ue0Rpc3R1dGlscyBDb25maWd1cmF0aW9uIEZpbGVzfQotXGxhYmVse2NvbmZpZy1maWxlc30KLQotQXMgbWVudGlvbmVkIGFib3ZlLCB5b3UgY2FuIHVzZSBEaXN0dXRpbHMgY29uZmlndXJhdGlvbiBmaWxlcyB0byByZWNvcmQKLXBlcnNvbmFsIG9yIHNpdGUgcHJlZmVyZW5jZXMgZm9yIGFueSBEaXN0dXRpbHMgb3B0aW9ucy4gIFRoYXQgaXMsIGFueQotb3B0aW9uIHRvIGFueSBjb21tYW5kIGNhbiBiZSBzdG9yZWQgaW4gb25lIG9mIHR3byBvciB0aHJlZSAoZGVwZW5kaW5nIG9uCi15b3VyIHBsYXRmb3JtKSBjb25maWd1cmF0aW9uIGZpbGVzLCB3aGljaCB3aWxsIGJlIGNvbnN1bHRlZCBiZWZvcmUgdGhlCi1jb21tYW5kLWxpbmUgaXMgcGFyc2VkLiAgVGhpcyBtZWFucyB0aGF0IGNvbmZpZ3VyYXRpb24gZmlsZXMgd2lsbAotb3ZlcnJpZGUgZGVmYXVsdCB2YWx1ZXMsIGFuZCB0aGUgY29tbWFuZC1saW5lIHdpbGwgaW4gdHVybiBvdmVycmlkZQotY29uZmlndXJhdGlvbiBmaWxlcy4gIEZ1cnRoZXJtb3JlLCBpZiBtdWx0aXBsZSBjb25maWd1cmF0aW9uIGZpbGVzCi1hcHBseSwgdmFsdWVzIGZyb20gYGBlYXJsaWVyJycgZmlsZXMgYXJlIG92ZXJyaWRkZW4gYnkgYGBsYXRlcicnIGZpbGVzLgotCi0KLVxzdWJzZWN0aW9ue0xvY2F0aW9uIGFuZCBuYW1lcyBvZiBjb25maWcgZmlsZXN9Ci1cbGFiZWx7Y29uZmlnLWZpbGVuYW1lc30KLQotVGhlIG5hbWVzIGFuZCBsb2NhdGlvbnMgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgdmFyeSBzbGlnaHRseSBhY3Jvc3MKLXBsYXRmb3Jtcy4gIE9uIFxVTklYe30gYW5kIE1hYyBPUyBYLCB0aGUgdGhyZWUgY29uZmlndXJhdGlvbiBmaWxlcyAoaW4KLXRoZSBvcmRlciB0aGV5IGFyZSBwcm9jZXNzZWQpIGFyZToKLVxiZWdpbnt0YWJsZWlpaX17bHxsfGN9e3RleHRybX0KLSAge1R5cGUgb2YgZmlsZX17TG9jYXRpb24gYW5kIGZpbGVuYW1lfXtOb3Rlc30KLSAgXGxpbmVpaWl7c3lzdGVtfXtcZmlsZW5xe1xmaWxldmFye3ByZWZpeH0vbGliL3B5dGhvblxmaWxldmFye3Zlcn0vZGlzdHV0aWxzL2Rpc3R1dGlscy5jZmd9fXsoMSl9Ci0gIFxsaW5laWlpe3BlcnNvbmFsfXtcZmlsZW5xe1wkSE9NRS8ucHlkaXN0dXRpbHMuY2ZnfX17KDIpfQotICBcbGluZWlpaXtsb2NhbH17XGZpbGVucXtzZXR1cC5jZmd9fXsoMyl9Ci1cZW5ke3RhYmxlaWlpfQotCi1BbmQgb24gV2luZG93cywgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgYXJlOgotXGJlZ2lue3RhYmxlaWlpfXtsfGx8Y317dGV4dHJtfQotICB7VHlwZSBvZiBmaWxlfXtMb2NhdGlvbiBhbmQgZmlsZW5hbWV9e05vdGVzfQotICBcbGluZWlpaXtzeXN0ZW19e1xmaWxlbnF7XGZpbGV2YXJ7cHJlZml4fVx0ZXh0YmFja3NsYXNoe31MaWJcdGV4dGJhY2tzbGFzaHt9ZGlzdHV0aWxzXHRleHRiYWNrc2xhc2h7fWRpc3R1dGlscy5jZmd9fXsoNCl9Ci0gIFxsaW5laWlpe3BlcnNvbmFsfXtcZmlsZW5xe1wlSE9NRVwlXHRleHRiYWNrc2xhc2h7fXB5ZGlzdHV0aWxzLmNmZ319eyg1KX0KLSAgXGxpbmVpaWl7bG9jYWx9e1xmaWxlbnF7c2V0dXAuY2ZnfX17KDMpfQotXGVuZHt0YWJsZWlpaX0KLQotXG5vaW5kZW50IE5vdGVzOgotXGJlZ2lue2Rlc2NyaXB0aW9ufQotXGl0ZW1bKDEpXSBTdHJpY3RseSBzcGVha2luZywgdGhlIHN5c3RlbS13aWRlIGNvbmZpZ3VyYXRpb24gZmlsZSBsaXZlcwotICBpbiB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBEaXN0dXRpbHMgYXJlIGluc3RhbGxlZDsgdW5kZXIgUHl0aG9uIDEuNgotICBhbmQgbGF0ZXIgb24gXFVOSVgsIHRoaXMgaXMgYXMgc2hvd24uIEZvciBQeXRob24gMS41LjIsIHRoZSBEaXN0dXRpbHMKLSAgd2lsbCBub3JtYWxseSBiZSBpbnN0YWxsZWQgdG8KLSAgXGZpbGV7XGZpbGV2YXJ7cHJlZml4fS9saWIvcHl0aG9uMS41L3NpdGUtcGFja2FnZXMvZGlzdHV0aWxzfSwKLSAgc28gdGhlIHN5c3RlbSBjb25maWd1cmF0aW9uIGZpbGUgc2hvdWxkIGJlIHB1dCB0aGVyZSB1bmRlciBQeXRob24KLSAgMS41LjIuCi1caXRlbVsoMildIE9uIFxVTklYLCBpZiB0aGUgXGVudnZhcntIT01FfSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QKLSAgZGVmaW5lZCwgdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeSB3aWxsIGJlIGRldGVybWluZWQgd2l0aCB0aGUKLSAgXGZ1bmN0aW9ue2dldHB3dWlkKCl9IGZ1bmN0aW9uIGZyb20gdGhlIHN0YW5kYXJkCi0gIFx1bGlua3tcbW9kdWxle3B3ZH19ey4uL2xpYi9tb2R1bGUtcHdkLmh0bWx9IG1vZHVsZS4KLVxpdGVtWygzKV0gSS5lLiwgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5ICh1c3VhbGx5IHRoZSBsb2NhdGlvbiBvZiB0aGUKLSAgc2V0dXAgc2NyaXB0KS4KLVxpdGVtWyg0KV0gKFNlZSBhbHNvIG5vdGUgKDEpLikgIFVuZGVyIFB5dGhvbiAxLjYgYW5kIGxhdGVyLCBQeXRob24ncwotICBkZWZhdWx0IGBgaW5zdGFsbGF0aW9uIHByZWZpeCcnIGlzIFxmaWxle0M6XHRleHRiYWNrc2xhc2h7fVB5dGhvbn0sIHNvCi0gIHRoZSBzeXN0ZW0gY29uZmlndXJhdGlvbiBmaWxlIGlzIG5vcm1hbGx5Ci0gIFxmaWxle0M6XHRleHRiYWNrc2xhc2h7fVB5dGhvblx0ZXh0YmFja3NsYXNoe31MaWJcdGV4dGJhY2tzbGFzaHt9ZGlzdHV0aWxzXHRleHRiYWNrc2xhc2h7fWRpc3R1dGlscy5jZmd9LgotICBVbmRlciBQeXRob24gMS41LjIsIHRoZSBkZWZhdWx0IHByZWZpeCB3YXMKLSAgXGZpbGV7QzpcdGV4dGJhY2tzbGFzaHt9UHJvZ3JhbX5GaWxlc1x0ZXh0YmFja3NsYXNoe31QeXRob259LCBhbmQgdGhlCi0gIERpc3R1dGlscyB3ZXJlIG5vdCBwYXJ0IG9mIHRoZSBzdGFuZGFyZCBsaWJyYXJ5LS0tc28gdGhlIHN5c3RlbQotICBjb25maWd1cmF0aW9uIGZpbGUgd291bGQgYmUKLSAgXGZpbGV7QzpcdGV4dGJhY2tzbGFzaHt9UHJvZ3JhbX5GaWxlc1x0ZXh0YmFja3NsYXNoe31QeXRob25cdGV4dGJhY2tzbGFzaHt9ZGlzdHV0aWxzXHRleHRiYWNrc2xhc2h7fWRpc3R1dGlscy5jZmd9Ci0gIGluIGEgc3RhbmRhcmQgUHl0aG9uIDEuNS4yIGluc3RhbGxhdGlvbiB1bmRlciBXaW5kb3dzLgotXGl0ZW1bKDUpXSBPbiBXaW5kb3dzLCBpZiB0aGUgXGVudnZhcntIT01FfSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QKLSAgZGVmaW5lZCwgbm8gcGVyc29uYWwgY29uZmlndXJhdGlvbiBmaWxlIHdpbGwgYmUgZm91bmQgb3IgdXNlZC4gIChJbgotICBvdGhlciB3b3JkcywgdGhlIERpc3R1dGlscyBtYWtlIG5vIGF0dGVtcHQgdG8gZ3Vlc3MgeW91ciBob21lCi0gIGRpcmVjdG9yeSBvbiBXaW5kb3dzLikKLVxlbmR7ZGVzY3JpcHRpb259Ci0KLQotXHN1YnNlY3Rpb257U3ludGF4IG9mIGNvbmZpZyBmaWxlc30KLVxsYWJlbHtjb25maWctc3ludGF4fQotCi1UaGUgRGlzdHV0aWxzIGNvbmZpZ3VyYXRpb24gZmlsZXMgYWxsIGhhdmUgdGhlIHNhbWUgc3ludGF4LiAgVGhlIGNvbmZpZwotZmlsZXMgYXJlIGdyb3VwZWQgaW50byBzZWN0aW9ucy4gIFRoZXJlIGlzIG9uZSBzZWN0aW9uIGZvciBlYWNoIERpc3R1dGlscwotY29tbWFuZCwgcGx1cyBhIFxjb2Rle2dsb2JhbH0gc2VjdGlvbiBmb3IgZ2xvYmFsIG9wdGlvbnMgdGhhdCBhZmZlY3QKLWV2ZXJ5IGNvbW1hbmQuICBFYWNoIHNlY3Rpb24gY29uc2lzdHMgb2Ygb25lIG9wdGlvbiBwZXIgbGluZSwgc3BlY2lmaWVkCi1hcyBcY29kZXtvcHRpb249dmFsdWV9LgotCi1Gb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBpcyBhIGNvbXBsZXRlIGNvbmZpZyBmaWxlIHRoYXQganVzdCBmb3JjZXMKLWFsbCBjb21tYW5kcyB0byBydW4gcXVpZXRseSBieSBkZWZhdWx0OgotCi1cYmVnaW57dmVyYmF0aW19Ci1bZ2xvYmFsXQotdmVyYm9zZT0wCi1cZW5ke3ZlcmJhdGltfQotCi1JZiB0aGlzIGlzIGluc3RhbGxlZCBhcyB0aGUgc3lzdGVtIGNvbmZpZyBmaWxlLCBpdCB3aWxsIGFmZmVjdCBhbGwKLXByb2Nlc3Npbmcgb2YgYW55IFB5dGhvbiBtb2R1bGUgZGlzdHJpYnV0aW9uIGJ5IGFueSB1c2VyIG9uIHRoZSBjdXJyZW50Ci1zeXN0ZW0uICBJZiBpdCBpcyBpbnN0YWxsZWQgYXMgeW91ciBwZXJzb25hbCBjb25maWcgZmlsZSAob24gc3lzdGVtcwotdGhhdCBzdXBwb3J0IHRoZW0pLCBpdCB3aWxsIGFmZmVjdCBvbmx5IG1vZHVsZSBkaXN0cmlidXRpb25zIHByb2Nlc3NlZAotYnkgeW91LiAgQW5kIGlmIGl0IGlzIHVzZWQgYXMgdGhlIFxmaWxle3NldHVwLmNmZ30gZm9yIGEgcGFydGljdWxhcgotbW9kdWxlIGRpc3RyaWJ1dGlvbiwgaXQgYWZmZWN0cyBvbmx5IHRoYXQgZGlzdHJpYnV0aW9uLgotCi1Zb3UgY291bGQgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYGBidWlsZCBiYXNlJycgZGlyZWN0b3J5IGFuZCBtYWtlIHRoZQotXGNvbW1hbmR7YnVpbGQqfSBjb21tYW5kcyBhbHdheXMgZm9yY2libHkgcmVidWlsZCBhbGwgZmlsZXMgd2l0aCB0aGUKLWZvbGxvd2luZzoKLQotXGJlZ2lue3ZlcmJhdGltfQotW2J1aWxkXQotYnVpbGQtYmFzZT1ibGliCi1mb3JjZT0xCi1cZW5ke3ZlcmJhdGltfQotCi13aGljaCBjb3JyZXNwb25kcyB0byB0aGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cwotCi1cYmVnaW57dmVyYmF0aW19Ci1weXRob24gc2V0dXAucHkgYnVpbGQgLS1idWlsZC1iYXNlPWJsaWIgLS1mb3JjZQotXGVuZHt2ZXJiYXRpbX0KLQotZXhjZXB0IHRoYXQgaW5jbHVkaW5nIHRoZSBcY29tbWFuZHtidWlsZH0gY29tbWFuZCBvbiB0aGUgY29tbWFuZC1saW5lCi1tZWFucyB0aGF0IGNvbW1hbmQgd2lsbCBiZSBydW4uICBJbmNsdWRpbmcgYSBwYXJ0aWN1bGFyIGNvbW1hbmQgaW4KLWNvbmZpZyBmaWxlcyBoYXMgbm8gc3VjaCBpbXBsaWNhdGlvbjsgaXQgb25seSBtZWFucyB0aGF0IGlmIHRoZSBjb21tYW5kCi1pcyBydW4sIHRoZSBvcHRpb25zIGluIHRoZSBjb25maWcgZmlsZSB3aWxsIGFwcGx5LiAgKE9yIGlmIG90aGVyCi1jb21tYW5kcyB0aGF0IGRlcml2ZSB2YWx1ZXMgZnJvbSBpdCBhcmUgcnVuLCB0aGV5IHdpbGwgdXNlIHRoZSB2YWx1ZXMgaW4KLXRoZSBjb25maWcgZmlsZS4pCi0KLVlvdSBjYW4gZmluZCBvdXQgdGhlIGNvbXBsZXRlIGxpc3Qgb2Ygb3B0aW9ucyBmb3IgYW55IGNvbW1hbmQgdXNpbmcgdGhlCi1cbG9uZ3Byb2dyYW1vcHR7aGVscH0gb3B0aW9uLCBlLmcuOgotCi1cYmVnaW57dmVyYmF0aW19Ci1weXRob24gc2V0dXAucHkgYnVpbGQgLS1oZWxwCi1cZW5ke3ZlcmJhdGltfQotCi1hbmQgeW91IGNhbiBmaW5kIG91dCB0aGUgY29tcGxldGUgbGlzdCBvZiBnbG9iYWwgb3B0aW9ucyBieSB1c2luZwotXGxvbmdwcm9ncmFtb3B0e2hlbHB9IHdpdGhvdXQgYSBjb21tYW5kOgotCi1cYmVnaW57dmVyYmF0aW19Ci1weXRob24gc2V0dXAucHkgLS1oZWxwCi1cZW5ke3ZlcmJhdGltfQotCi1TZWUgYWxzbyB0aGUgYGBSZWZlcmVuY2UnJyBzZWN0aW9uIG9mIHRoZSBgYERpc3RyaWJ1dGluZyBQeXRob24KLU1vZHVsZXMnJyBtYW51YWwuCi0KLVxzZWN0aW9ue0J1aWxkaW5nIEV4dGVuc2lvbnM6IFRpcHMgYW5kIFRyaWNrc30KLVxsYWJlbHtidWlsZGluZy1leHR9Ci0KLVdoZW5ldmVyIHBvc3NpYmxlLCB0aGUgRGlzdHV0aWxzIHRyeSB0byB1c2UgdGhlIGNvbmZpZ3VyYXRpb24KLWluZm9ybWF0aW9uIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgdXNlZCB0byBydW4gdGhlCi1cZmlsZXtzZXR1cC5weX0gc2NyaXB0LiAgRm9yIGV4YW1wbGUsIHRoZSBzYW1lIGNvbXBpbGVyIGFuZCBsaW5rZXIKLWZsYWdzIHVzZWQgdG8gY29tcGlsZSBQeXRob24gd2lsbCBhbHNvIGJlIHVzZWQgZm9yIGNvbXBpbGluZwotZXh0ZW5zaW9ucy4gIFVzdWFsbHkgdGhpcyB3aWxsIHdvcmsgd2VsbCwgYnV0IGluIGNvbXBsaWNhdGVkCi1zaXR1YXRpb25zIHRoaXMgbWlnaHQgYmUgaW5hcHByb3ByaWF0ZS4gIFRoaXMgc2VjdGlvbiBkaXNjdXNzZXMgaG93IHRvCi1vdmVycmlkZSB0aGUgdXN1YWwgRGlzdHV0aWxzIGJlaGF2aW91ci4KLQotXHN1YnNlY3Rpb257VHdlYWtpbmcgY29tcGlsZXIvbGlua2VyIGZsYWdzfQotXGxhYmVse3R3ZWFrLWZsYWdzfQotCi1Db21waWxpbmcgYSBQeXRob24gZXh0ZW5zaW9uIHdyaXR0ZW4gaW4gQyBvciBcQ3Bwe30gd2lsbCBzb21ldGltZXMKLXJlcXVpcmUgc3BlY2lmeWluZyBjdXN0b20gZmxhZ3MgZm9yIHRoZSBjb21waWxlciBhbmQgbGlua2VyIGluIG9yZGVyCi10byB1c2UgYSBwYXJ0aWN1bGFyIGxpYnJhcnkgb3IgcHJvZHVjZSBhIHNwZWNpYWwga2luZCBvZiBvYmplY3QgY29kZS4KLVRoaXMgaXMgZXNwZWNpYWxseSB0cnVlIGlmIHRoZSBleHRlbnNpb24gaGFzbid0IGJlZW4gdGVzdGVkIG9uIHlvdXIgCi1wbGF0Zm9ybSwgb3IgaWYgeW91J3JlIHRyeWluZyB0byBjcm9zcy1jb21waWxlIFB5dGhvbi4KLQotSW4gdGhlIG1vc3QgZ2VuZXJhbCBjYXNlLCB0aGUgZXh0ZW5zaW9uIGF1dGhvciBtaWdodCBoYXZlIGZvcmVzZWVuCi10aGF0IGNvbXBpbGluZyB0aGUgZXh0ZW5zaW9ucyB3b3VsZCBiZSBjb21wbGljYXRlZCwgYW5kIHByb3ZpZGVkIGEKLVxmaWxle1NldHVwfSBmaWxlIGZvciB5b3UgdG8gZWRpdC4gIFRoaXMgd2lsbCBsaWtlbHkgb25seSBiZSBkb25lIGlmCi10aGUgbW9kdWxlIGRpc3RyaWJ1dGlvbiBjb250YWlucyBtYW55IHNlcGFyYXRlIGV4dGVuc2lvbiBtb2R1bGVzLCBvcgotaWYgdGhleSBvZnRlbiByZXF1aXJlIGVsYWJvcmF0ZSBzZXRzIG9mIGNvbXBpbGVyIGZsYWdzIGluIG9yZGVyIHRvIHdvcmsuCi0KLUEgXGZpbGV7U2V0dXB9IGZpbGUsIGlmIHByZXNlbnQsIGlzIHBhcnNlZCBpbiBvcmRlciB0byBnZXQgYSBsaXN0IG9mCi1leHRlbnNpb25zIHRvIGJ1aWxkLiAgRWFjaCBsaW5lIGluIGEgXGZpbGV7U2V0dXB9IGRlc2NyaWJlcyBhIHNpbmdsZQotbW9kdWxlLiAgTGluZXMgaGF2ZSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKLQotXGJlZ2lue2FsbHR0fQotXHZhcnttb2R1bGV9IC4uLiBbXHZhcntzb3VyY2VmaWxlfSAuLi5dIFtcdmFye2NwcGFyZ30gLi4uXSBbXHZhcntsaWJyYXJ5fSAuLi5dCi1cZW5ke2FsbHR0fQotCi1MZXQncyBleGFtaW5lIGVhY2ggb2YgdGhlIGZpZWxkcyBpbiB0dXJuLgotCi1cYmVnaW57aXRlbWl6ZX0KLQotXGl0ZW0gXHZhcnttb2R1bGV9IGlzIHRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb24gbW9kdWxlIHRvIGJlIGJ1aWx0LAotICAgICAgYW5kIHNob3VsZCBiZSBhIHZhbGlkIFB5dGhvbiBpZGVudGlmaWVyLiAgWW91IGNhbid0IGp1c3QgY2hhbmdlCi0gICAgICB0aGlzIGluIG9yZGVyIHRvIHJlbmFtZSBhIG1vZHVsZSAoZWRpdHMgdG8gdGhlIHNvdXJjZSBjb2RlIHdvdWxkCi0gICAgICBhbHNvIGJlIG5lZWRlZCksIHNvIHRoaXMgc2hvdWxkIGJlIGxlZnQgYWxvbmUuCi0KLVxpdGVtIFx2YXJ7c291cmNlZmlsZX0gaXMgYW55dGhpbmcgdGhhdCdzIGxpa2VseSB0byBiZSBhIHNvdXJjZSBjb2RlCi0gICAgICBmaWxlLCBhdCBsZWFzdCBqdWRnaW5nIGJ5IHRoZSBmaWxlbmFtZS4gIEZpbGVuYW1lcyBlbmRpbmcgaW4KLSAgICAgIFxmaWxley5jfSBhcmUgYXNzdW1lZCB0byBiZSB3cml0dGVuIGluIEMsIGZpbGVuYW1lcyBlbmRpbmcgaW4KLSAgICAgIFxmaWxley5DfSwgXGZpbGV7LmNjfSwgYW5kIFxmaWxley5jKyt9IGFyZSBhc3N1bWVkIHRvIGJlCi0gICAgICBcQ3BwLCBhbmQgZmlsZW5hbWVzIGVuZGluZyBpbiBcZmlsZXsubX0gb3IgXGZpbGV7Lm1tfSBhcmUKLSAgICAgIGFzc3VtZWQgdG8gYmUgaW4gT2JqZWN0aXZlIEMuCi0KLVxpdGVtIFx2YXJ7Y3BwYXJnfSBpcyBhbiBhcmd1bWVudCBmb3IgdGhlIEMgcHJlcHJvY2Vzc29yLCAKLSAgICAgIGFuZCBpcyBhbnl0aGluZyBzdGFydGluZyB3aXRoIFxwcm9ncmFtb3B0ey1JfSwgXHByb2dyYW1vcHR7LUR9LAotICAgICAgXHByb2dyYW1vcHR7LVV9IG9yIFxwcm9ncmFtb3B0ey1DfS4KLQotXGl0ZW0gXHZhcntsaWJyYXJ5fSBpcyBhbnl0aGluZyBlbmRpbmcgaW4gXGZpbGV7LmF9IG9yIGJlZ2lubmluZyB3aXRoCi0gICAgICBccHJvZ3JhbW9wdHstbH0gb3IgXHByb2dyYW1vcHR7LUx9LgotXGVuZHtpdGVtaXplfQotCi1JZiBhIHBhcnRpY3VsYXIgcGxhdGZvcm0gcmVxdWlyZXMgYSBzcGVjaWFsIGxpYnJhcnkgb24geW91ciBwbGF0Zm9ybSwKLXlvdSBjYW4gYWRkIGl0IGJ5IGVkaXRpbmcgdGhlIFxmaWxle1NldHVwfSBmaWxlIGFuZCBydW5uaW5nCi1cY29kZXtweXRob24gc2V0dXAucHkgYnVpbGR9LiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBtb2R1bGUgZGVmaW5lZCBieSB0aGUgbGluZQotCi1cYmVnaW57dmVyYmF0aW19Ci1mb28gZm9vbW9kdWxlLmMKLVxlbmR7dmVyYmF0aW19Ci0KLW11c3QgYmUgbGlua2VkIHdpdGggdGhlIG1hdGggbGlicmFyeSBcZmlsZXtsaWJtLmF9IG9uIHlvdXIgcGxhdGZvcm0sCi1zaW1wbHkgYWRkIFxwcm9ncmFtb3B0ey1sbX0gdG8gdGhlIGxpbmU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWZvbyBmb29tb2R1bGUuYyAtbG0KLVxlbmR7dmVyYmF0aW19Ci0KLUFyYml0cmFyeSBzd2l0Y2hlcyBpbnRlbmRlZCBmb3IgdGhlIGNvbXBpbGVyIG9yIHRoZSBsaW5rZXIgY2FuIGJlCi1zdXBwbGllZCB3aXRoIHRoZSBccHJvZ3JhbW9wdHstWGNvbXBpbGVyfSBcdmFye2FyZ30gYW5kCi1ccHJvZ3JhbW9wdHstWGxpbmtlcn0gXHZhcnthcmd9IG9wdGlvbnM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWZvbyBmb29tb2R1bGUuYyAtWGNvbXBpbGVyIC1vMzIgLVhsaW5rZXIgLXNoYXJlZCAtbG0KLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBuZXh0IG9wdGlvbiBhZnRlciBccHJvZ3JhbW9wdHstWGNvbXBpbGVyfSBhbmQKLVxwcm9ncmFtb3B0ey1YbGlua2VyfSB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBwcm9wZXIgY29tbWFuZCBsaW5lLCBzbwotaW4gdGhlIGFib3ZlIGV4YW1wbGUgdGhlIGNvbXBpbGVyIHdpbGwgYmUgcGFzc2VkIHRoZSBccHJvZ3JhbW9wdHstbzMyfQotb3B0aW9uLCBhbmQgdGhlIGxpbmtlciB3aWxsIGJlIHBhc3NlZCBccHJvZ3JhbW9wdHstc2hhcmVkfS4gIElmIGEKLWNvbXBpbGVyIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCwgeW91J2xsIGhhdmUgdG8gc3VwcGx5IG11bHRpcGxlCi1ccHJvZ3JhbW9wdHstWGNvbXBpbGVyfSBvcHRpb25zOyBmb3IgZXhhbXBsZSwgdG8gcGFzcyBcY29kZXsteCBjKyt9IHRoZQotXGZpbGV7U2V0dXB9IGZpbGUgd291bGQgaGF2ZSB0byBjb250YWluCi1cY29kZXstWGNvbXBpbGVyIC14IC1YY29tcGlsZXIgYysrfS4KLQotQ29tcGlsZXIgZmxhZ3MgY2FuIGFsc28gYmUgc3VwcGxpZWQgdGhyb3VnaCBzZXR0aW5nIHRoZQotXGVudnZhcntDRkxBR1N9IGVudmlyb25tZW50IHZhcmlhYmxlLiAgSWYgc2V0LCB0aGUgY29udGVudHMgb2YKLVxlbnZ2YXJ7Q0ZMQUdTfSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBjb21waWxlciBmbGFncyBzcGVjaWZpZWQgaW4gdGhlIAotXGZpbGV7U2V0dXB9IGZpbGUuCi0KLQotXHN1YnNlY3Rpb257VXNpbmcgbm9uLU1pY3Jvc29mdCBjb21waWxlcnMgb24gV2luZG93cyBcbGFiZWx7bm9uLW1zLWNvbXBpbGVyc319Ci1cc2VjdGlvbmF1dGhvcntSZW5lIExpZWJzY2hlcn17Ui5MaWVic2NoZXJAZ214LmRlfQotCi1cc3Vic3Vic2VjdGlvbntCb3JsYW5kIFxDcHB9Ci0KLVRoaXMgc3Vic2VjdGlvbiBkZXNjcmliZXMgdGhlIG5lY2Vzc2FyeSBzdGVwcyB0byB1c2UgRGlzdHV0aWxzIHdpdGggdGhlIAotQm9ybGFuZCBcQ3Bwe30gY29tcGlsZXIgdmVyc2lvbiA1LjUuCi0lU2hvdWxkIHdlIG1lbnRpb24gdGhhdCB1c2VycyBoYXZlIHRvIGNyZWF0ZSBjZmctZmlsZXMgZm9yIHRoZSBjb21waWxlcj8KLSVzZWUgYWxzbyBodHRwOi8vY29tbXVuaXR5LmJvcmxhbmQuY29tL2FydGljbGUvMCwxNDEwLDIxMjA1LDAwLmh0bWwgCi0KLUZpcnN0IHlvdSBoYXZlIHRvIGtub3cgdGhhdCBCb3JsYW5kJ3Mgb2JqZWN0IGZpbGUgZm9ybWF0IChPTUYpIGlzCi1kaWZmZXJlbnQgZnJvbSB0aGUgZm9ybWF0IHVzZWQgYnkgdGhlIFB5dGhvbiB2ZXJzaW9uIHlvdSBjYW4gZG93bmxvYWQKLWZyb20gdGhlIFB5dGhvbiBvciBBY3RpdmVTdGF0ZSBXZWIgc2l0ZS4gIChQeXRob24gaXMgYnVpbHQgd2l0aAotTWljcm9zb2Z0IFZpc3VhbCBcQ3BwLCB3aGljaCB1c2VzIENPRkYgYXMgdGhlIG9iamVjdCBmaWxlIGZvcm1hdC4pCi1Gb3IgdGhpcyByZWFzb24geW91IGhhdmUgdG8gY29udmVydCBQeXRob24ncyBsaWJyYXJ5Ci1cZmlsZXtweXRob24yNS5saWJ9IGludG8gdGhlIEJvcmxhbmQgZm9ybWF0LiAgWW91IGNhbiBkbyB0aGlzIGFzCi1mb2xsb3dzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1jb2ZmMm9tZiBweXRob24yNS5saWIgcHl0aG9uMjVfYmNwcC5saWIKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBcZmlsZXtjb2ZmMm9tZn0gcHJvZ3JhbSBjb21lcyB3aXRoIHRoZSBCb3JsYW5kIGNvbXBpbGVyLiAgVGhlIGZpbGUKLVxmaWxle3B5dGhvbjI1LmxpYn0gaXMgaW4gdGhlIFxmaWxle0xpYnN9IGRpcmVjdG9yeSBvZiB5b3VyIFB5dGhvbgotaW5zdGFsbGF0aW9uLiAgSWYgeW91ciBleHRlbnNpb24gdXNlcyBvdGhlciBsaWJyYXJpZXMgKHpsaWIsLi4uKSB5b3UKLWhhdmUgdG8gY29udmVydCB0aGVtIHRvby4KLQotVGhlIGNvbnZlcnRlZCBmaWxlcyBoYXZlIHRvIHJlc2lkZSBpbiB0aGUgc2FtZSBkaXJlY3RvcmllcyBhcyB0aGUKLW5vcm1hbCBsaWJyYXJpZXMuCi0KLUhvdyBkb2VzIERpc3R1dGlscyBtYW5hZ2UgdG8gdXNlIHRoZXNlIGxpYnJhcmllcyB3aXRoIHRoZWlyIGNoYW5nZWQKLW5hbWVzPyAgSWYgdGhlIGV4dGVuc2lvbiBuZWVkcyBhIGxpYnJhcnkgKGVnLiBcZmlsZXtmb299KSBEaXN0dXRpbHMKLWNoZWNrcyBmaXJzdCBpZiBpdCBmaW5kcyBhIGxpYnJhcnkgd2l0aCBzdWZmaXggXGZpbGV7X2JjcHB9Ci0oZWcuIFxmaWxle2Zvb19iY3BwLmxpYn0pIGFuZCB0aGVuIHVzZXMgdGhpcyBsaWJyYXJ5LiAgSW4gdGhlIGNhc2UgaXQKLWRvZXNuJ3QgZmluZCBzdWNoIGEgc3BlY2lhbCBsaWJyYXJ5IGl0IHVzZXMgdGhlIGRlZmF1bHQgbmFtZQotKFxmaWxle2Zvby5saWJ9LilcZm9vdG5vdGV7VGhpcyBhbHNvIG1lYW5zIHlvdSBjb3VsZCByZXBsYWNlIGFsbAotZXhpc3RpbmcgQ09GRi1saWJyYXJpZXMgd2l0aCBPTUYtbGlicmFyaWVzIG9mIHRoZSBzYW1lIG5hbWUufQotCi1UbyBsZXQgRGlzdHV0aWxzIGNvbXBpbGUgeW91ciBleHRlbnNpb24gd2l0aCBCb3JsYW5kIFxDcHB7fSB5b3Ugbm93IGhhdmUKLXRvIHR5cGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXB5dGhvbiBzZXR1cC5weSBidWlsZCAtLWNvbXBpbGVyPWJjcHAKLVxlbmR7dmVyYmF0aW19Ci0KLUlmIHlvdSB3YW50IHRvIHVzZSB0aGUgQm9ybGFuZCBcQ3Bwe30gY29tcGlsZXIgYXMgdGhlIGRlZmF1bHQsIHlvdQotY291bGQgc3BlY2lmeSB0aGlzIGluIHlvdXIgcGVyc29uYWwgb3Igc3lzdGVtLXdpZGUgY29uZmlndXJhdGlvbiBmaWxlCi1mb3IgRGlzdHV0aWxzIChzZWUgc2VjdGlvbn5ccmVme2NvbmZpZy1maWxlc30uKQotIAotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWV0aXRsZVtodHRwOi8vd3d3LmJvcmxhbmQuY29tL2JjcHBidWlsZGVyL2ZyZWVjb21waWxlci9dCi0gICAge1xDcHB7fUJ1aWxkZXIgQ29tcGlsZXJ9Ci0gICAge0luZm9ybWF0aW9uIGFib3V0IHRoZSBmcmVlIFxDcHB7fSBjb21waWxlciBmcm9tIEJvcmxhbmQsCi0gICAgIGluY2x1ZGluZyBsaW5rcyB0byB0aGUgZG93bmxvYWQgcGFnZXMufQotCi0gIFxzZWV0aXRsZVtodHRwOi8vd3d3LmN5YmVydXMuY2EvXH57fWdfd2lsbC9weUV4dGVuREwuc2h0bWxdCi0gICAge0NyZWF0aW5nIFB5dGhvbiBFeHRlbnNpb25zIFVzaW5nIEJvcmxhbmQncyBGcmVlIENvbXBpbGVyfQotICAgIHtEb2N1bWVudCBkZXNjcmliaW5nIGhvdyB0byB1c2UgQm9ybGFuZCdzIGZyZWUgY29tbWFuZC1saW5lIFxDcHAKLSAgICAgY29tcGlsZXIgdG8gYnVpbGQgUHl0aG9uLn0KLVxlbmR7c2VlYWxzb30KLQotCi1cc3Vic3Vic2VjdGlvbntHTlUgQyAvIEN5Z3dpbiAvIE1pbkdXfQotCi1UaGVzZSBpbnN0cnVjdGlvbnMgb25seSBhcHBseSBpZiB5b3UncmUgdXNpbmcgYSB2ZXJzaW9uIG9mIFB5dGhvbiBwcmlvciAKLXRvIDIuNC4xIHdpdGggYSBNaW5HVyBwcmlvciB0byAzLjAuMCAod2l0aCBiaW51dGlscy0yLjEzLjkwLTIwMDMwMTExLTEpLgotCi1UaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBuZWNlc3Nhcnkgc3RlcHMgdG8gdXNlIERpc3R1dGlscyB3aXRoIHRoZQotR05VIEMvXENwcHt9IGNvbXBpbGVycyBpbiB0aGVpciBDeWd3aW4gYW5kIE1pbkdXCi1kaXN0cmlidXRpb25zLlxmb290bm90ZXtDaGVjawotXHVybHtodHRwOi8vc291cmNlcy5yZWRoYXQuY29tL2N5Z3dpbi99IGFuZAotXHVybHtodHRwOi8vd3d3Lm1pbmd3Lm9yZy99IGZvciBtb3JlIGluZm9ybWF0aW9ufQotRm9yIGEgUHl0aG9uIGludGVycHJldGVyIHRoYXQgd2FzIGJ1aWx0IHdpdGggQ3lnd2luLCBldmVyeXRoaW5nIHNob3VsZAotd29yayB3aXRob3V0IGFueSBvZiB0aGVzZSBmb2xsb3dpbmcgc3RlcHMuCi0KLVRoZXNlIGNvbXBpbGVycyByZXF1aXJlIHNvbWUgc3BlY2lhbCBsaWJyYXJpZXMuCi1UaGlzIHRhc2sgaXMgbW9yZSBjb21wbGV4IHRoYW4gZm9yIEJvcmxhbmQncyBcQ3BwLCBiZWNhdXNlIHRoZXJlIGlzIG5vCi1wcm9ncmFtIHRvIGNvbnZlcnQgdGhlIGxpYnJhcnkuCi0lIEkgZG9uJ3QgdW5kZXJzdGFuZCB3aGF0IHRoZSBuZXh0IGxpbmUgbWVhbnMuIC0tYW1rCi0lIChpbmNsdXNpdmUgdGhlIHJlZmVyZW5jZXMgb24gZGF0YSBzdHJ1Y3R1cmVzLikKLSAKLUZpcnN0IHlvdSBoYXZlIHRvIGNyZWF0ZSBhIGxpc3Qgb2Ygc3ltYm9scyB3aGljaCB0aGUgUHl0aG9uIERMTCBleHBvcnRzLgotKFlvdSBjYW4gZmluZCBhIGdvb2QgcHJvZ3JhbSBmb3IgdGhpcyB0YXNrIGF0IAotXHVybHtodHRwOi8vc3RhcnNoaXAucHl0aG9uLm5ldC9jcmV3L2tlcm5yL21pbmd3MzIvTm90ZXMuaHRtbH0sIHNlZSBhdCAKLVBFeHBvcnRzIDAuNDJoIHRoZXJlLikKLQotXGJlZ2lue3ZlcmJhdGltfQotcGV4cG9ydHMgcHl0aG9uMjUuZGxsID5weXRob24yNS5kZWYKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBsb2NhdGlvbiBvZiBhbiBpbnN0YWxsZWQgXGZpbGV7cHl0aG9uMjUuZGxsfSB3aWxsIGRlcGVuZCBvbiB0aGUKLWluc3RhbGxhdGlvbiBvcHRpb25zIGFuZCB0aGUgdmVyc2lvbiBhbmQgbGFuZ3VhZ2Ugb2YgV2luZG93cy4gIEluIGEKLWBganVzdCBmb3IgbWUnJyBpbnN0YWxsYXRpb24sIGl0IHdpbGwgYXBwZWFyIGluIHRoZSByb290IG9mIHRoZQotaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4gIEluIGEgc2hhcmVkIGluc3RhbGxhdGlvbiwgaXQgd2lsbCBiZSBsb2NhdGVkCi1pbiB0aGUgc3lzdGVtIGRpcmVjdG9yeS4KLQotVGhlbiB5b3UgY2FuIGNyZWF0ZSBmcm9tIHRoZXNlIGluZm9ybWF0aW9uIGFuIGltcG9ydCBsaWJyYXJ5IGZvciBnY2MuCi0gCi1cYmVnaW57dmVyYmF0aW19Ci0vY3lnd2luL2Jpbi9kbGx0b29sIC0tZGxsbmFtZSBweXRob24yNS5kbGwgLS1kZWYgcHl0aG9uMjUuZGVmIC0tb3V0cHV0LWxpYiBsaWJweXRob24yNS5hCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgcmVzdWx0aW5nIGxpYnJhcnkgaGFzIHRvIGJlIHBsYWNlZCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgCi1cZmlsZXtweXRob24yNS5saWJ9LiAoU2hvdWxkIGJlIHRoZSBcZmlsZXtsaWJzfSBkaXJlY3RvcnkgdW5kZXIgeW91cgotUHl0aG9uIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuKQotCi1JZiB5b3VyIGV4dGVuc2lvbiB1c2VzIG90aGVyIGxpYnJhcmllcyAoemxpYiwuLi4pIHlvdSBtaWdodCAKLWhhdmUgdG8gY29udmVydCB0aGVtIHRvby4KLVRoZSBjb252ZXJ0ZWQgZmlsZXMgaGF2ZSB0byByZXNpZGUgaW4gdGhlIHNhbWUgZGlyZWN0b3JpZXMgYXMgdGhlIG5vcm1hbAotbGlicmFyaWVzIGRvLgotCi1UbyBsZXQgRGlzdHV0aWxzIGNvbXBpbGUgeW91ciBleHRlbnNpb24gd2l0aCBDeWd3aW4geW91IG5vdyBoYXZlIHRvIHR5cGUKLQotXGJlZ2lue3ZlcmJhdGltfQotcHl0aG9uIHNldHVwLnB5IGJ1aWxkIC0tY29tcGlsZXI9Y3lnd2luCi1cZW5ke3ZlcmJhdGltfQotCi1hbmQgZm9yIEN5Z3dpbiBpbiBuby1jeWd3aW4gbW9kZVxmb290bm90ZXtUaGVuIHlvdSBoYXZlIG5vCi1cUE9TSVh7fSBlbXVsYXRpb24gYXZhaWxhYmxlLCBidXQgeW91IGFsc28gZG9uJ3QgbmVlZAotXGZpbGV7Y3lnd2luMS5kbGx9Ln0gb3IgZm9yIE1pbkdXIHR5cGU6Ci0gCi1cYmVnaW57dmVyYmF0aW19Ci1weXRob24gc2V0dXAucHkgYnVpbGQgLS1jb21waWxlcj1taW5ndzMyCi1cZW5ke3ZlcmJhdGltfQotCi1JZiB5b3Ugd2FudCB0byB1c2UgYW55IG9mIHRoZXNlIG9wdGlvbnMvY29tcGlsZXJzIGFzIGRlZmF1bHQsIHlvdSBzaG91bGQKLWNvbnNpZGVyIHRvIHdyaXRlIGl0IGluIHlvdXIgcGVyc29uYWwgb3Igc3lzdGVtLXdpZGUgY29uZmlndXJhdGlvbiBmaWxlCi1mb3IgRGlzdHV0aWxzIChzZWUgc2VjdGlvbn5ccmVme2NvbmZpZy1maWxlc30uKQotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZXRpdGxlW2h0dHA6Ly93d3cuem9wZS5vcmcvTWVtYmVycy9hbHMvdGlwcy93aW4zMl9taW5nd19tb2R1bGVzXQotICAgIHtCdWlsZGluZyBQeXRob24gbW9kdWxlcyBvbiBNUyBXaW5kb3dzIHBsYXRmb3JtIHdpdGggTWluR1d9Ci0gICAge0luZm9ybWF0aW9uIGFib3V0IGJ1aWxkaW5nIHRoZSByZXF1aXJlZCBsaWJyYXJpZXMgZm9yIHRoZSBNaW5HVwotICAgICBlbnZpcm9ubWVudC59Ci0KLSAgXHNlZXVybHtodHRwOi8vcHlvcGVuZ2wuc291cmNlZm9yZ2UubmV0L2Z0cC93aW4zMi1zdHVmZi99Ci0gICAge0NvbnZlcnRlZCBpbXBvcnQgbGlicmFyaWVzIGluIEN5Z3dpbi9NaW5HVyBhbmQgQm9ybGFuZCBmb3JtYXQsCi0gICAgIGFuZCBhIHNjcmlwdCB0byBjcmVhdGUgdGhlIHJlZ2lzdHJ5IGVudHJpZXMgbmVlZGVkIGZvciBEaXN0dXRpbHMKLSAgICAgdG8gbG9jYXRlIHRoZSBidWlsdCBQeXRob24ufQotXGVuZHtzZWVhbHNvfQotCi0KLQotXGVuZHtkb2N1bWVudH0KZGlmZiAtLWdpdCBhL0RvYy9saWIvYXJjaGl2aW5nLnRleCBiL0RvYy9saWIvYXJjaGl2aW5nLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNmNWJmNy4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2FyY2hpdmluZy50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVxjaGFwdGVye0RhdGEgQ29tcHJlc3Npb24gYW5kIEFyY2hpdmluZ30KLVxsYWJlbHthcmNoaXZpbmd9Ci0KLVRoZSBtb2R1bGVzIGRlc2NyaWJlZCBpbiB0aGlzIGNoYXB0ZXIgc3VwcG9ydCBkYXRhIGNvbXByZXNzaW9uCi13aXRoIHRoZSB6bGliLCBnemlwLCBhbmQgYnppcDIgYWxnb3JpdGhtcywgYW5kIAotdGhlIGNyZWF0aW9uIG9mIFpJUC0gYW5kIHRhci1mb3JtYXQgYXJjaGl2ZXMuCi0KLVxsb2NhbG1vZHVsZXRhYmxlCmRpZmYgLS1naXQgYS9Eb2MvbGliL2FzdHRhYmxlLnRleCBiL0RvYy9saWIvYXN0dGFibGUudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjZiYmJiLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvYXN0dGFibGUudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLVxiZWdpbntsb25ndGFibGVpaWl9e2xsbH17Y2xhc3N9e05vZGUgdHlwZX17QXR0cmlidXRlfXtWYWx1ZX0KLQotXGxpbmVpaWl7QWRkfXtcbWVtYmVye2xlZnR9fXtsZWZ0IG9wZXJhbmR9Ci1cbGluZWlpaXt9e1xtZW1iZXJ7cmlnaHR9fXtyaWdodCBvcGVyYW5kfQotXGhsaW5lIAotCi1cbGluZWlpaXtBbmR9e1xtZW1iZXJ7bm9kZXN9fXtsaXN0IG9mIG9wZXJhbmRzfQotXGhsaW5lIAotCi1cbGluZWlpaXtBc3NBdHRyfXt9e1xlbXBoe2F0dHJpYnV0ZSBhcyB0YXJnZXQgb2YgYXNzaWdubWVudH19Ci1cbGluZWlpaXt9e1xtZW1iZXJ7ZXhwcn19e2V4cHJlc3Npb24gb24gdGhlIGxlZnQtaGFuZCBzaWRlIG9mIHRoZSBkb3R9Ci1cbGluZWlpaXt9e1xtZW1iZXJ7YXR0cm5hbWV9fXt0aGUgYXR0cmlidXRlIG5hbWUsIGEgc3RyaW5nfQotXGxpbmVpaWl7fXtcbWVtYmVye2ZsYWdzfX17WFhYfQotXGhsaW5lIAotCi1cbGluZWlpaXtBc3NMaXN0fXtcbWVtYmVye25vZGVzfX17bGlzdCBvZiBsaXN0IGVsZW1lbnRzIGJlaW5nIGFzc2lnbmVkIHRvfQotXGhsaW5lIAotCi1cbGluZWlpaXtBc3NOYW1lfXtcbWVtYmVye25hbWV9fXtuYW1lIGJlaW5nIGFzc2lnbmVkIHRvfQotXGxpbmVpaWl7fXtcbWVtYmVye2ZsYWdzfX17WFhYfQotXGhsaW5lIAotCi1cbGluZWlpaXtBc3NUdXBsZX17XG1lbWJlcntub2Rlc319e2xpc3Qgb2YgdHVwbGUgZWxlbWVudHMgYmVpbmcgYXNzaWduZWQgdG99Ci1caGxpbmUgCi0KLVxsaW5laWlpe0Fzc2VydH17XG1lbWJlcnt0ZXN0fX17dGhlIGV4cHJlc3Npb24gdG8gYmUgdGVzdGVkfQotXGxpbmVpaWl7fXtcbWVtYmVye2ZhaWx9fXt0aGUgdmFsdWUgb2YgdGhlIFxleGNlcHRpb257QXNzZXJ0aW9uRXJyb3J9fQotXGhsaW5lIAotCi1cbGluZWlpaXtBc3NpZ259e1xtZW1iZXJ7bm9kZXN9fXthIGxpc3Qgb2YgYXNzaWdubWVudCB0YXJnZXRzLCBvbmUgcGVyIGVxdWFsIHNpZ259Ci1cbGluZWlpaXt9e1xtZW1iZXJ7ZXhwcn19e3RoZSB2YWx1ZSBiZWluZyBhc3NpZ25lZH0KLVxobGluZSAKLQotXGxpbmVpaWl7QXVnQXNzaWdufXtcbWVtYmVye25vZGV9fXt9Ci1cbGluZWlpaXt9e1xtZW1iZXJ7b3B9fXt9Ci1cbGluZWlpaXt9e1xtZW1iZXJ7ZXhwcn19e30KLVxobGluZSAKLQotXGxpbmVpaWl7Qml0YW5kfXtcbWVtYmVye25vZGVzfX17fQotXGhsaW5lIAotCi1cbGluZWlpaXtCaXRvcn17XG1lbWJlcntub2Rlc319e30KLVxobGluZSAKLQotXGxpbmVpaWl7Qml0eG9yfXtcbWVtYmVye25vZGVzfX17fQotXGhsaW5lIAotCi1cbGluZWlpaXtCcmVha317fXt9Ci1caGxpbmUgCi0KLVxsaW5laWlpe0NhbGxGdW5jfXtcbWVtYmVye25vZGV9fXtleHByZXNzaW9uIGZvciB0aGUgY2FsbGVlfQotXGxpbmVpaWl7fXtcbWVtYmVye2FyZ3N9fXthIGxpc3Qgb2YgYXJndW1lbnRzfQotXGxpbmVpaWl7fXtcbWVtYmVye3N0YXJfYXJnc319e3RoZSBleHRlbmRlZCAqLWFyZyB2YWx1ZX0KLVxsaW5laWlpe317XG1lbWJlcntkc3Rhcl9hcmdzfX17dGhlIGV4dGVuZGVkICoqLWFyZyB2YWx1ZX0KLVxobGluZSAKLQotXGxpbmVpaWl7Q2xhc3N9e1xtZW1iZXJ7bmFtZX19e3RoZSBuYW1lIG9mIHRoZSBjbGFzcywgYSBzdHJpbmd9Ci1cbGluZWlpaXt9e1xtZW1iZXJ7YmFzZXN9fXthIGxpc3Qgb2YgYmFzZSBjbGFzc2VzfQotXGxpbmVpaWl7fXtcbWVtYmVye2RvY319e2RvYyBzdHJpbmcsIGEgc3RyaW5nIG9yIFxjb2Rle05vbmV9fQotXGxpbmVpaWl7fXtcbWVtYmVye2NvZGV9fXt0aGUgYm9keSBvZiB0aGUgY2xhc3Mgc3RhdGVtZW50fQotXGhsaW5lIAotCi1cbGluZWlpaXtDb21wYXJlfXtcbWVtYmVye2V4cHJ9fXt9Ci1cbGluZWlpaXt9e1xtZW1iZXJ7b3BzfX17fQotXGhsaW5lIAotCi1cbGluZWlpaXtDb25zdH17XG1lbWJlcnt2YWx1ZX19e30KLVxobGluZSAKLQotXGxpbmVpaWl7Q29udGludWV9e317fQotXGhsaW5lIAotCi1cbGluZWlpaXtEZWNvcmF0b3JzfXtcbWVtYmVye25vZGVzfX17TGlzdCBvZiBmdW5jdGlvbiBkZWNvcmF0b3IgZXhwcmVzc2lvbnN9Ci1caGxpbmUgCi0KLVxsaW5laWlpe0RpY3R9e1xtZW1iZXJ7aXRlbXN9fXt9Ci1caGxpbmUgCi0KLVxsaW5laWlpe0Rpc2NhcmR9e1xtZW1iZXJ7ZXhwcn19e30KLVxobGluZSAKLQotXGxpbmVpaWl7RGl2fXtcbWVtYmVye2xlZnR9fXt9Ci1cbGluZWlpaXt9e1xtZW1iZXJ7cmlnaHR9fXt9Ci1caGxpbmUgCi0KLVxsaW5laWlpe0VsbGlwc2lzfXt9e30KLVxobGluZSAKLQotXGxpbmVpaWl7RXhwcmVzc2lvbn17XG1lbWJlcntub2RlfX17fQotCi1cbGluZWlpaXtFeGVjfXtcbWVtYmVye2V4cHJ9fXt9Ci1cbGluZWlpaXt9e1xtZW1iZXJ7bG9jYWxzfX17fQotXGxpbmVpaWl7fXtcbWVtYmVye2dsb2JhbHN9fXt9Ci1caGxpbmUgCi0KLVxsaW5laWlpe0Zsb29yRGl2fXtcbWVtYmVye2xlZnR9fXt9Ci1cbGluZWlpaXt9e1xtZW1iZXJ7cmlnaHR9fXt9Ci1caGxpbmUgCi0KLVxsaW5laWlpe0Zvcn17XG1lbWJlcnthc3NpZ259fXt9Ci1cbGluZWlpaXt9e1xtZW1iZXJ7bGlzdH19e30KLVxsaW5laWlpe317XG1lbWJlcntib2R5fX17fQotXGxpbmVpaWl7fXtcbWVtYmVye2Vsc2VffX17fQotXGhsaW5lIAotCi1cbGluZWlpaXtGcm9tfXtcbWVtYmVye21vZG5hbWV9fXt9Ci1cbGluZWlpaXt9e1xtZW1iZXJ7bmFtZXN9fXt9Ci1caGxpbmUgCi0KLVxsaW5laWlpe0Z1bmN0aW9ufXtcbWVtYmVye2RlY29yYXRvcnN9fXtcY2xhc3N7RGVjb3JhdG9yc30gb3IgXGNvZGV7Tm9uZX19Ci1cbGluZWlpaXt9e1xtZW1iZXJ7bmFtZX19e25hbWUgdXNlZCBpbiBkZWYsIGEgc3RyaW5nfQotXGxpbmVpaWl7fXtcbWVtYmVye2FyZ25hbWVzfX17bGlzdCBvZiBhcmd1bWVudCBuYW1lcywgYXMgc3RyaW5nc30KLVxsaW5laWlpe317XG1lbWJlcntkZWZhdWx0c319e2xpc3Qgb2YgZGVmYXVsdCB2YWx1ZXN9Ci1cbGluZWlpaXt9e1xtZW1iZXJ7ZmxhZ3N9fXt4eHh9Ci1cbGluZWlpaXt9e1xtZW1iZXJ7ZG9jfX17ZG9jIHN0cmluZywgYSBzdHJpbmcgb3IgXGNvZGV7Tm9uZX19Ci1cbGluZWlpaXt9e1xtZW1iZXJ7Y29kZX19e3RoZSBib2R5IG9mIHRoZSBmdW5jdGlvbn0KLVxobGluZQotCi1cbGluZWlpaXtHZW5FeHByfXtcbWVtYmVye2NvZGV9fXt9Ci1caGxpbmUKLQotXGxpbmVpaWl7R2VuRXhwckZvcn17XG1lbWJlcnthc3NpZ259fXt9Ci1cbGluZWlpaXt9e1xtZW1iZXJ7aXRlcn19e30KLVxsaW5laWlpe317XG1lbWJlcntpZnN9fXt9Ci1caGxpbmUKLQotXGxpbmVpaWl7R2VuRXhwcklmfXtcbWVtYmVye3Rlc3R9fXt9Ci1caGxpbmUKLQotXGxpbmVpaWl7R2VuRXhwcklubmVyfXtcbWVtYmVye2V4cHJ9fXt9Ci1cbGluZWlpaXt9e1xtZW1iZXJ7cXVhbHN9fXt9Ci1caGxpbmUKLQotXGxpbmVpaWl7R2V0YXR0cn17XG1lbWJlcntleHByfX17fQotXGxpbmVpaWl7fXtcbWVtYmVye2F0dHJuYW1lfX17fQotXGhsaW5lIAotCi1cbGluZWlpaXtHbG9iYWx9e1xtZW1iZXJ7bmFtZXN9fXt9Ci1caGxpbmUgCi0KLVxsaW5laWlpe0lmfXtcbWVtYmVye3Rlc3RzfX17fQotXGxpbmVpaWl7fXtcbWVtYmVye2Vsc2VffX17fQotXGhsaW5lIAotCi1cbGluZWlpaXtJbXBvcnR9e1xtZW1iZXJ7bmFtZXN9fXt9Ci1caGxpbmUgCi0KLVxsaW5laWlpe0ludmVydH17XG1lbWJlcntleHByfX17fQotXGhsaW5lIAotCi1cbGluZWlpaXtLZXl3b3JkfXtcbWVtYmVye25hbWV9fXt9Ci1cbGluZWlpaXt9e1xtZW1iZXJ7ZXhwcn19e30KLVxobGluZSAKLQotXGxpbmVpaWl7TGFtYmRhfXtcbWVtYmVye2FyZ25hbWVzfX17fQotXGxpbmVpaWl7fXtcbWVtYmVye2RlZmF1bHRzfX17fQotXGxpbmVpaWl7fXtcbWVtYmVye2ZsYWdzfX17fQotXGxpbmVpaWl7fXtcbWVtYmVye2NvZGV9fXt9Ci1caGxpbmUgCi0KLVxsaW5laWlpe0xlZnRTaGlmdH17XG1lbWJlcntsZWZ0fX17fQotXGxpbmVpaWl7fXtcbWVtYmVye3JpZ2h0fX17fQotXGhsaW5lIAotCi1cbGluZWlpaXtMaXN0fXtcbWVtYmVye25vZGVzfX17fQotXGhsaW5lIAotCi1cbGluZWlpaXtMaXN0Q29tcH17XG1lbWJlcntleHByfX17fQotXGxpbmVpaWl7fXtcbWVtYmVye3F1YWxzfX17fQotXGhsaW5lIAotCi1cbGluZWlpaXtMaXN0Q29tcEZvcn17XG1lbWJlcnthc3NpZ259fXt9Ci1cbGluZWlpaXt9e1xtZW1iZXJ7bGlzdH19e30KLVxsaW5laWlpe317XG1lbWJlcntpZnN9fXt9Ci1caGxpbmUgCi0KLVxsaW5laWlpe0xpc3RDb21wSWZ9e1xtZW1iZXJ7dGVzdH19e30KLVxobGluZSAKLQotXGxpbmVpaWl7TW9kfXtcbWVtYmVye2xlZnR9fXt9Ci1cbGluZWlpaXt9e1xtZW1iZXJ7cmlnaHR9fXt9Ci1caGxpbmUgCi0KLVxsaW5laWlpe01vZHVsZX17XG1lbWJlcntkb2N9fXtkb2Mgc3RyaW5nLCBhIHN0cmluZyBvciBcY29kZXtOb25lfX0KLVxsaW5laWlpe317XG1lbWJlcntub2RlfX17Ym9keSBvZiB0aGUgbW9kdWxlLCBhIFxjbGFzc3tTdG10fX0KLVxobGluZSAKLQotXGxpbmVpaWl7TXVsfXtcbWVtYmVye2xlZnR9fXt9Ci1cbGluZWlpaXt9e1xtZW1iZXJ7cmlnaHR9fXt9Ci1caGxpbmUgCi0KLVxsaW5laWlpe05hbWV9e1xtZW1iZXJ7bmFtZX19e30KLVxobGluZSAKLQotXGxpbmVpaWl7Tm90fXtcbWVtYmVye2V4cHJ9fXt9Ci1caGxpbmUgCi0KLVxsaW5laWlpe09yfXtcbWVtYmVye25vZGVzfX17fQotXGhsaW5lIAotCi1cbGluZWlpaXtQYXNzfXt9e30KLVxobGluZSAKLQotXGxpbmVpaWl7UG93ZXJ9e1xtZW1iZXJ7bGVmdH19e30KLVxsaW5laWlpe317XG1lbWJlcntyaWdodH19e30KLVxobGluZSAKLQotXGxpbmVpaWl7UHJpbnR9e1xtZW1iZXJ7bm9kZXN9fXt9Ci1cbGluZWlpaXt9e1xtZW1iZXJ7ZGVzdH19e30KLVxobGluZSAKLQotXGxpbmVpaWl7UHJpbnRubH17XG1lbWJlcntub2Rlc319e30KLVxsaW5laWlpe317XG1lbWJlcntkZXN0fX17fQotXGhsaW5lIAotCi1cbGluZWlpaXtSYWlzZX17XG1lbWJlcntleHByMX19e30KLVxsaW5laWlpe317XG1lbWJlcntleHByMn19e30KLVxsaW5laWlpe317XG1lbWJlcntleHByM319e30KLVxobGluZSAKLQotXGxpbmVpaWl7UmV0dXJufXtcbWVtYmVye3ZhbHVlfX17fQotXGhsaW5lIAotCi1cbGluZWlpaXtSaWdodFNoaWZ0fXtcbWVtYmVye2xlZnR9fXt9Ci1cbGluZWlpaXt9e1xtZW1iZXJ7cmlnaHR9fXt9Ci1caGxpbmUgCi0KLVxsaW5laWlpe1NsaWNlfXtcbWVtYmVye2V4cHJ9fXt9Ci1cbGluZWlpaXt9e1xtZW1iZXJ7ZmxhZ3N9fXt9Ci1cbGluZWlpaXt9e1xtZW1iZXJ7bG93ZXJ9fXt9Ci1cbGluZWlpaXt9e1xtZW1iZXJ7dXBwZXJ9fXt9Ci1caGxpbmUgCi0KLVxsaW5laWlpe1NsaWNlb2JqfXtcbWVtYmVye25vZGVzfX17bGlzdCBvZiBzdGF0ZW1lbnRzfQotXGhsaW5lIAotCi1cbGluZWlpaXtTdG10fXtcbWVtYmVye25vZGVzfX17fQotXGhsaW5lIAotCi1cbGluZWlpaXtTdWJ9e1xtZW1iZXJ7bGVmdH19e30KLVxsaW5laWlpe317XG1lbWJlcntyaWdodH19e30KLVxobGluZSAKLQotXGxpbmVpaWl7U3Vic2NyaXB0fXtcbWVtYmVye2V4cHJ9fXt9Ci1cbGluZWlpaXt9e1xtZW1iZXJ7ZmxhZ3N9fXt9Ci1cbGluZWlpaXt9e1xtZW1iZXJ7c3Vic319e30KLVxobGluZSAKLQotXGxpbmVpaWl7VHJ5RXhjZXB0fXtcbWVtYmVye2JvZHl9fXt9Ci1cbGluZWlpaXt9e1xtZW1iZXJ7aGFuZGxlcnN9fXt9Ci1cbGluZWlpaXt9e1xtZW1iZXJ7ZWxzZV99fXt9Ci1caGxpbmUgCi0KLVxsaW5laWlpe1RyeUZpbmFsbHl9e1xtZW1iZXJ7Ym9keX19e30KLVxsaW5laWlpe317XG1lbWJlcntmaW5hbH19e30KLVxobGluZSAKLQotXGxpbmVpaWl7VHVwbGV9e1xtZW1iZXJ7bm9kZXN9fXt9Ci1caGxpbmUgCi0KLVxsaW5laWlpe1VuYXJ5QWRkfXtcbWVtYmVye2V4cHJ9fXt9Ci1caGxpbmUgCi0KLVxsaW5laWlpe1VuYXJ5U3VifXtcbWVtYmVye2V4cHJ9fXt9Ci1caGxpbmUgCi0KLVxsaW5laWlpe1doaWxlfXtcbWVtYmVye3Rlc3R9fXt9Ci1cbGluZWlpaXt9e1xtZW1iZXJ7Ym9keX19e30KLVxsaW5laWlpe317XG1lbWJlcntlbHNlX319e30KLVxobGluZSAKLQotXGxpbmVpaWl7V2l0aH17XG1lbWJlcntleHByfX17fQotXGxpbmVpaWl7fXtcbWVtYmVye3ZhcnN9fXt9Ci1cbGluZWlpaXt9e1xtZW1iZXJ7Ym9keX19e30KLVxobGluZSAKLQotXGxpbmVpaWl7WWllbGR9e1xtZW1iZXJ7dmFsdWV9fXt9Ci1caGxpbmUgCi0KLVxlbmR7bG9uZ3RhYmxlaWlpfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9jYXNlbGVzcy5weSBiL0RvYy9saWIvY2FzZWxlc3MucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhZTk0YmUuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9jYXNlbGVzcy5weQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLWZyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvbiwgT3B0aW9uUGFyc2VyLCBfbWF0Y2hfYWJicmV2Ci0KLSMgVGhpcyBjYXNlLWluc2Vuc2l0aXZlIG9wdGlvbiBwYXJzZXIgcmVsaWVzIG9uIGhhdmluZyBhCi0jIGNhc2UtaW5zZW5zaXRpdmUgZGljdGlvbmFyeSB0eXBlIGF2YWlsYWJsZS4gIEhlcmUncyBvbmUKLSMgZm9yIFB5dGhvbiAyLjIuICBOb3RlIHRoYXQgYSAqcmVhbCogY2FzZS1pbnNlbnNpdGl2ZQotIyBkaWN0aW9uYXJ5IHR5cGUgd291bGQgYWxzbyBoYXZlIHRvIGltcGxlbWVudCBfX25ld19fKCksCi0jIHVwZGF0ZSgpLCBhbmQgc2V0ZGVmYXVsdCgpIC0tIGJ1dCB0aGF0J3Mgbm90IHRoZSBwb2ludAotIyBvZiB0aGlzIGV4ZXJjaXNlLgotCi1jbGFzcyBjYXNlbGVzc19kaWN0IChkaWN0KToKLSAgICBkZWYgX19zZXRpdGVtX18gKHNlbGYsIGtleSwgdmFsdWUpOgotICAgICAgICBkaWN0Ll9fc2V0aXRlbV9fKHNlbGYsIGtleS5sb3dlcigpLCB2YWx1ZSkKLQotICAgIGRlZiBfX2dldGl0ZW1fXyAoc2VsZiwga2V5KToKLSAgICAgICAgcmV0dXJuIGRpY3QuX19nZXRpdGVtX18oc2VsZiwga2V5Lmxvd2VyKCkpCi0KLSAgICBkZWYgZ2V0IChzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSk6Ci0gICAgICAgIHJldHVybiBkaWN0LmdldChzZWxmLCBrZXkubG93ZXIoKSkKLQotICAgIGRlZiBoYXNfa2V5IChzZWxmLCBrZXkpOgotICAgICAgICByZXR1cm4gZGljdC5oYXNfa2V5KHNlbGYsIGtleS5sb3dlcigpKQotCi0KLWNsYXNzIENhc2VsZXNzT3B0aW9uUGFyc2VyIChPcHRpb25QYXJzZXIpOgotCi0gICAgZGVmIF9jcmVhdGVfb3B0aW9uX2xpc3QgKHNlbGYpOgotICAgICAgICBzZWxmLm9wdGlvbl9saXN0ID0gW10KLSAgICAgICAgc2VsZi5fc2hvcnRfb3B0ID0gY2FzZWxlc3NfZGljdCgpCi0gICAgICAgIHNlbGYuX2xvbmdfb3B0ID0gY2FzZWxlc3NfZGljdCgpCi0gICAgICAgIHNlbGYuX2xvbmdfb3B0cyA9IFtdCi0gICAgICAgIHNlbGYuZGVmYXVsdHMgPSB7fQotCi0gICAgZGVmIF9tYXRjaF9sb25nX29wdCAoc2VsZiwgb3B0KToKLSAgICAgICAgcmV0dXJuIF9tYXRjaF9hYmJyZXYob3B0Lmxvd2VyKCksIHNlbGYuX2xvbmdfb3B0LmtleXMoKSkKLQotCi1pZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIGZyb20gb3B0aWsuZXJyb3JzIGltcG9ydCBPcHRpb25Db25mbGljdEVycm9yCi0KLSAgICAjIHRlc3QgMTogbm8gb3B0aW9ucyB0byBzdGFydCB3aXRoCi0gICAgcGFyc2VyID0gQ2FzZWxlc3NPcHRpb25QYXJzZXIoKQotICAgIHRyeToKLSAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1IIiwgZGVzdD0iYmxhaCIpCi0gICAgZXhjZXB0IE9wdGlvbkNvbmZsaWN0RXJyb3I6Ci0gICAgICAgIHByaW50ICJvazogZ290IE9wdGlvbkNvbmZsaWN0RXJyb3IgZm9yIC1IIgotICAgIGVsc2U6Ci0gICAgICAgIHByaW50ICJub3Qgb2s6IG5vIGNvbmZsaWN0IGJldHdlZW4gLWggYW5kIC1IIgotCi0gICAgcGFyc2VyLmFkZF9vcHRpb24oIi1mIiwgIi0tZmlsZSIsIGRlc3Q9ImZpbGUiKQotICAgICNwcmludCByZXByKHBhcnNlci5nZXRfb3B0aW9uKCItZiIpKQotICAgICNwcmludCByZXByKHBhcnNlci5nZXRfb3B0aW9uKCItRiIpKQotICAgICNwcmludCByZXByKHBhcnNlci5nZXRfb3B0aW9uKCItLWZpbGUiKSkKLSAgICAjcHJpbnQgcmVwcihwYXJzZXIuZ2V0X29wdGlvbigiLS1mSWxFIikpCi0gICAgKG9wdGlvbnMsIGFyZ3MpID0gcGFyc2VyLnBhcnNlX2FyZ3MoWyItLUZpTGUiLCAiZm9vIl0pCi0gICAgYXNzZXJ0IG9wdGlvbnMuZmlsZSA9PSAiZm9vIiwgb3B0aW9ucy5maWxlCi0gICAgcHJpbnQgIm9rOiBjYXNlIGluc2Vuc2l0aXZlIGxvbmcgb3B0aW9ucyB3b3JrIgotCi0gICAgKG9wdGlvbnMsIGFyZ3MpID0gcGFyc2VyLnBhcnNlX2FyZ3MoWyItRiIsICJiYXIiXSkKLSAgICBhc3NlcnQgb3B0aW9ucy5maWxlID09ICJiYXIiLCBvcHRpb25zLmZpbGUKLSAgICBwcmludCAib2s6IGNhc2UgaW5zZW5zaXRpdmUgc2hvcnQgb3B0aW9ucyB3b3JrIgpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9jdXN0b21pbnRlcnAudGV4IGIvRG9jL2xpYi9jdXN0b21pbnRlcnAudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTViODg4Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvY3VzdG9taW50ZXJwLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLVxjaGFwdGVye0N1c3RvbSBQeXRob24gSW50ZXJwcmV0ZXJzfQotXGxhYmVse2N1c3RvbWludGVycH0KLQotVGhlIG1vZHVsZXMgZGVzY3JpYmVkIGluIHRoaXMgY2hhcHRlciBhbGxvdyB3cml0aW5nIGludGVyZmFjZXMgc2ltaWxhcgotdG8gUHl0aG9uJ3MgaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIuICBJZiB5b3Ugd2FudCBhIFB5dGhvbiBpbnRlcnByZXRlcgotdGhhdCBzdXBwb3J0cyBzb21lIHNwZWNpYWwgZmVhdHVyZSBpbiBhZGRpdGlvbiB0byB0aGUgUHl0aG9uIGxhbmd1YWdlLAoteW91IHNob3VsZCBsb29rIGF0IHRoZSBcbW9kdWxle2NvZGV9IG1vZHVsZS4gIChUaGUgXG1vZHVsZXtjb2Rlb3B9Ci1tb2R1bGUgaXMgbG93ZXItbGV2ZWwsIHVzZWQgdG8gc3VwcG9ydCBjb21waWxpbmcgYSBwb3NzaWJseS1pbmNvbXBsZXRlCi1jaHVuayBvZiBQeXRob24gY29kZS4pCi0KLVRoZSBmdWxsIGxpc3Qgb2YgbW9kdWxlcyBkZXNjcmliZWQgaW4gdGhpcyBjaGFwdGVyIGlzOgotCi1cbG9jYWxtb2R1bGV0YWJsZQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9kYXRhdHlwZXMudGV4IGIvRG9jL2xpYi9kYXRhdHlwZXMudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmUwM2M3Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvZGF0YXR5cGVzLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLVxjaGFwdGVye0RhdGEgVHlwZXN9Ci1cbGFiZWx7ZGF0YXR5cGVzfQotCi1UaGUgbW9kdWxlcyBkZXNjcmliZWQgaW4gdGhpcyBjaGFwdGVyIHByb3ZpZGUgYSB2YXJpZXR5IG9mIHNwZWNpYWxpemVkCi1kYXRhIHR5cGVzIHN1Y2ggYXMgZGF0ZXMgYW5kIHRpbWVzLCBmaXhlZC10eXBlIGFycmF5cywgaGVhcCBxdWV1ZXMsCi1zeW5jaHJvbml6ZWQgcXVldWVzLCBhbmQgc2V0cy4KLQotVGhlIGZvbGxvd2luZyBtb2R1bGVzIGFyZSBkb2N1bWVudGVkIGluIHRoaXMgY2hhcHRlcjoKLQotXGxvY2FsbW9kdWxldGFibGUKZGlmZiAtLWdpdCBhL0RvYy9saWIvZGV2ZWxvcG1lbnQudGV4IGIvRG9jL2xpYi9kZXZlbG9wbWVudC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNGZhZGMuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9kZXZlbG9wbWVudC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1cY2hhcHRlcntEZXZlbG9wbWVudCBUb29sc30KLVxsYWJlbHtkZXZlbG9wbWVudH0KLQotVGhlIG1vZHVsZXMgZGVzY3JpYmVkIGluIHRoaXMgY2hhcHRlciBoZWxwIHlvdSB3cml0ZSBzb2Z0d2FyZS4gIEZvcgotZXhhbXBsZSwgdGhlIFxtb2R1bGV7cHlkb2N9IG1vZHVsZSB0YWtlcyBhIG1vZHVsZSBhbmQgZ2VuZXJhdGVzCi1kb2N1bWVudGF0aW9uIGJhc2VkIG9uIHRoZSBtb2R1bGUncyBjb250ZW50cy4gIFRoZSBcbW9kdWxle2RvY3Rlc3R9Ci1hbmQgXG1vZHVsZXt1bml0dGVzdH0gbW9kdWxlcyBjb250YWlucyBmcmFtZXdvcmtzIGZvciB3cml0aW5nIHVuaXQgdGVzdHMKLXRoYXQgYXV0b21hdGljYWxseSBleGVyY2lzZSBjb2RlIGFuZCB2ZXJpZnkgdGhhdCB0aGUgZXhwZWN0ZWQgb3V0cHV0IAotaXMgcHJvZHVjZWQuCi0KLVRoZSBsaXN0IG9mIG1vZHVsZXMgZGVzY3JpYmVkIGluIHRoaXMgY2hhcHRlciBpczoKLQotXGxvY2FsbW9kdWxldGFibGUKZGlmZiAtLWdpdCBhL0RvYy9saWIvZGlzdHV0aWxzLnRleCBiL0RvYy9saWIvZGlzdHV0aWxzLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RlOWRkZS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2Rpc3R1dGlscy50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle2Rpc3R1dGlsc30gLS0tCi0gICAgICAgICBCdWlsZGluZyBhbmQgaW5zdGFsbGluZyBQeXRob24gbW9kdWxlc30KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2Rpc3R1dGlsc30KLVxtb2R1bGVzeW5vcHNpc3tTdXBwb3J0IGZvciBidWlsZGluZyBhbmQgaW5zdGFsbGluZyBQeXRob24gbW9kdWxlcwotICAgICAgICAgICAgICAgIGludG8gYW4gZXhpc3RpbmcgUHl0aG9uIGluc3RhbGxhdGlvbi59Ci1cc2VjdGlvbmF1dGhvcntGcmVkIEwuIERyYWtlLCBKci59e2ZkcmFrZUBhY20ub3JnfQotCi0KLVRoZSBcbW9kdWxle2Rpc3R1dGlsc30gcGFja2FnZSBwcm92aWRlcyBzdXBwb3J0IGZvciBidWlsZGluZyBhbmQKLWluc3RhbGxpbmcgYWRkaXRpb25hbCBtb2R1bGVzIGludG8gYSBQeXRob24gaW5zdGFsbGF0aW9uLiAgVGhlIG5ldwotbW9kdWxlcyBtYXkgYmUgZWl0aGVyIDEwMFwle30tcHVyZSBQeXRob24sIG9yIG1heSBiZSBleHRlbnNpb24gbW9kdWxlcwotd3JpdHRlbiBpbiBDLCBvciBtYXkgYmUgY29sbGVjdGlvbnMgb2YgUHl0aG9uIHBhY2thZ2VzIHdoaWNoIGluY2x1ZGUKLW1vZHVsZXMgY29kZWQgaW4gYm90aCBQeXRob24gYW5kIEMuCi0KLVRoaXMgcGFja2FnZSBpcyBkaXNjdXNzZWQgaW4gdHdvIHNlcGFyYXRlIGRvY3VtZW50cyB3aGljaCBhcmUgaW5jbHVkZWQKLWluIHRoZSBQeXRob24gZG9jdW1lbnRhdGlvbiBwYWNrYWdlLiAgVG8gbGVhcm4gYWJvdXQgZGlzdHJpYnV0aW5nIG5ldwotbW9kdWxlcyB1c2luZyB0aGUgXG1vZHVsZXtkaXN0dXRpbHN9IGZhY2lsaXRpZXMsIHJlYWQKLVxjaXRldGl0bGVbLi4vZGlzdC9kaXN0Lmh0bWxde0Rpc3RyaWJ1dGluZyBQeXRob24gTW9kdWxlc307IHRoaXMKLWluY2x1ZGVzIGRvY3VtZW50YXRpb24gbmVlZGVkIHRvIGV4dGVuZCBkaXN0dXRpbHMuICBUbyBsZWFybgotYWJvdXQgaW5zdGFsbGluZyBQeXRob24gbW9kdWxlcywgd2hldGhlciBvciBub3QgdGhlIGF1dGhvciBtYWRlIHVzZSBvZgotdGhlIFxtb2R1bGV7ZGlzdHV0aWxzfSBwYWNrYWdlLCByZWFkCi1cY2l0ZXRpdGxlWy4uL2luc3QvaW5zdC5odG1sXXtJbnN0YWxsaW5nIFB5dGhvbiBNb2R1bGVzfS4KLQotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZXRpdGxlWy4uL2Rpc3QvZGlzdC5odG1sXXtEaXN0cmlidXRpbmcgUHl0aG9uIE1vZHVsZXN9e1RoZSBtYW51YWwKLSAgICAgICAgICAgIGZvciBkZXZlbG9wZXJzIGFuZCBwYWNrYWdlcnMgb2YgUHl0aG9uIG1vZHVsZXMuICBUaGlzCi0gICAgICAgICAgICBkZXNjcmliZXMgaG93IHRvIHByZXBhcmUgXG1vZHVsZXtkaXN0dXRpbHN9LWJhc2VkIHBhY2thZ2VzCi0gICAgICAgICAgICBzbyB0aGF0IHRoZXkgbWF5IGJlIGVhc2lseSBpbnN0YWxsZWQgaW50byBhbiBleGlzdGluZwotICAgICAgICAgICAgUHl0aG9uIGluc3RhbGxhdGlvbi59Ci0KLSAgXHNlZXRpdGxlWy4uL2luc3QvaW5zdC5odG1sXXtJbnN0YWxsaW5nIFB5dGhvbiBNb2R1bGVzfXtBbgotICAgICAgICAgICAgYGBhZG1pbmlzdHJhdG9ycycnIG1hbnVhbCB3aGljaCBpbmNsdWRlcyBpbmZvcm1hdGlvbiBvbgotICAgICAgICAgICAgaW5zdGFsbGluZyBtb2R1bGVzIGludG8gYW4gZXhpc3RpbmcgUHl0aG9uIGluc3RhbGxhdGlvbi4KLSAgICAgICAgICAgIFlvdSBkbyBub3QgbmVlZCB0byBiZSBhIFB5dGhvbiBwcm9ncmFtbWVyIHRvIHJlYWQgdGhpcwotICAgICAgICAgICAgbWFudWFsLn0KLVxlbmR7c2VlYWxzb30KZGlmZiAtLWdpdCBhL0RvYy9saWIvZW1haWwtZGlyLnB5IGIvRG9jL2xpYi9lbWFpbC1kaXIucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNGY1N2QuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9lbWFpbC1kaXIucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0KLSIiIlNlbmQgdGhlIGNvbnRlbnRzIG9mIGEgZGlyZWN0b3J5IGFzIGEgTUlNRSBtZXNzYWdlLiIiIgotCi1pbXBvcnQgb3MKLWltcG9ydCBzeXMKLWltcG9ydCBzbXRwbGliCi0jIEZvciBndWVzc2luZyBNSU1FIHR5cGUgYmFzZWQgb24gZmlsZSBuYW1lIGV4dGVuc2lvbgotaW1wb3J0IG1pbWV0eXBlcwotCi1mcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXIKLQotZnJvbSBlbWFpbCBpbXBvcnQgZW5jb2RlcnMKLWZyb20gZW1haWwubWVzc2FnZSBpbXBvcnQgTWVzc2FnZQotZnJvbSBlbWFpbC5taW1lLmF1ZGlvIGltcG9ydCBNSU1FQXVkaW8KLWZyb20gZW1haWwubWltZS5iYXNlIGltcG9ydCBNSU1FQmFzZQotZnJvbSBlbWFpbC5taW1lLmltYWdlIGltcG9ydCBNSU1FSW1hZ2UKLWZyb20gZW1haWwubWltZS5tdWx0aXBhcnQgaW1wb3J0IE1JTUVNdWx0aXBhcnQKLWZyb20gZW1haWwubWltZS50ZXh0IGltcG9ydCBNSU1FVGV4dAotCi1DT01NQVNQQUNFID0gJywgJwotCi0KLWRlZiBtYWluKCk6Ci0gICAgcGFyc2VyID0gT3B0aW9uUGFyc2VyKHVzYWdlPSIiIlwKLVNlbmQgdGhlIGNvbnRlbnRzIG9mIGEgZGlyZWN0b3J5IGFzIGEgTUlNRSBtZXNzYWdlLgotCi1Vc2FnZTogJXByb2cgW29wdGlvbnNdCi0KLVVubGVzcyB0aGUgLW8gb3B0aW9uIGlzIGdpdmVuLCB0aGUgZW1haWwgaXMgc2VudCBieSBmb3J3YXJkaW5nIHRvIHlvdXIgbG9jYWwKLVNNVFAgc2VydmVyLCB3aGljaCB0aGVuIGRvZXMgdGhlIG5vcm1hbCBkZWxpdmVyeSBwcm9jZXNzLiAgWW91ciBsb2NhbCBtYWNoaW5lCi1tdXN0IGJlIHJ1bm5pbmcgYW4gU01UUCBzZXJ2ZXIuCi0iIiIpCi0gICAgcGFyc2VyLmFkZF9vcHRpb24oJy1kJywgJy0tZGlyZWN0b3J5JywKLSAgICAgICAgICAgICAgICAgICAgICB0eXBlPSdzdHJpbmcnLCBhY3Rpb249J3N0b3JlJywKLSAgICAgICAgICAgICAgICAgICAgICBoZWxwPSIiIk1haWwgdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSB1c2UgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgT25seSB0aGUgcmVndWxhcgotICAgICAgICAgICAgICAgICAgICAgIGZpbGVzIGluIHRoZSBkaXJlY3RvcnkgYXJlIHNlbnQsIGFuZCB3ZSBkb24ndCByZWN1cnNlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgc3ViZGlyZWN0b3JpZXMuIiIiKQotICAgIHBhcnNlci5hZGRfb3B0aW9uKCctbycsICctLW91dHB1dCcsCi0gICAgICAgICAgICAgICAgICAgICAgdHlwZT0nc3RyaW5nJywgYWN0aW9uPSdzdG9yZScsIG1ldGF2YXI9J0ZJTEUnLAotICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IiIiUHJpbnQgdGhlIGNvbXBvc2VkIG1lc3NhZ2UgdG8gRklMRSBpbnN0ZWFkIG9mCi0gICAgICAgICAgICAgICAgICAgICAgc2VuZGluZyB0aGUgbWVzc2FnZSB0byB0aGUgU01UUCBzZXJ2ZXIuIiIiKQotICAgIHBhcnNlci5hZGRfb3B0aW9uKCctcycsICctLXNlbmRlcicsCi0gICAgICAgICAgICAgICAgICAgICAgdHlwZT0nc3RyaW5nJywgYWN0aW9uPSdzdG9yZScsIG1ldGF2YXI9J1NFTkRFUicsCi0gICAgICAgICAgICAgICAgICAgICAgaGVscD0nVGhlIHZhbHVlIG9mIHRoZSBGcm9tOiBoZWFkZXIgKHJlcXVpcmVkKScpCi0gICAgcGFyc2VyLmFkZF9vcHRpb24oJy1yJywgJy0tcmVjaXBpZW50JywKLSAgICAgICAgICAgICAgICAgICAgICB0eXBlPSdzdHJpbmcnLCBhY3Rpb249J2FwcGVuZCcsIG1ldGF2YXI9J1JFQ0lQSUVOVCcsCi0gICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1bXSwgZGVzdD0ncmVjaXBpZW50cycsCi0gICAgICAgICAgICAgICAgICAgICAgaGVscD0nQSBUbzogaGVhZGVyIHZhbHVlIChhdCBsZWFzdCBvbmUgcmVxdWlyZWQpJykKLSAgICBvcHRzLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQotICAgIGlmIG5vdCBvcHRzLnNlbmRlciBvciBub3Qgb3B0cy5yZWNpcGllbnRzOgotICAgICAgICBwYXJzZXIucHJpbnRfaGVscCgpCi0gICAgICAgIHN5cy5leGl0KDEpCi0gICAgZGlyZWN0b3J5ID0gb3B0cy5kaXJlY3RvcnkKLSAgICBpZiBub3QgZGlyZWN0b3J5OgotICAgICAgICBkaXJlY3RvcnkgPSAnLicKLSAgICAjIENyZWF0ZSB0aGUgZW5jbG9zaW5nIChvdXRlcikgbWVzc2FnZQotICAgIG91dGVyID0gTUlNRU11bHRpcGFydCgpCi0gICAgb3V0ZXJbJ1N1YmplY3QnXSA9ICdDb250ZW50cyBvZiBkaXJlY3RvcnkgJXMnICUgb3MucGF0aC5hYnNwYXRoKGRpcmVjdG9yeSkKLSAgICBvdXRlclsnVG8nXSA9IENPTU1BU1BBQ0Uuam9pbihvcHRzLnJlY2lwaWVudHMpCi0gICAgb3V0ZXJbJ0Zyb20nXSA9IG9wdHMuc2VuZGVyCi0gICAgb3V0ZXIucHJlYW1ibGUgPSAnWW91IHdpbGwgbm90IHNlZSB0aGlzIGluIGEgTUlNRS1hd2FyZSBtYWlsIHJlYWRlci5cbicKLQotICAgIGZvciBmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKGRpcmVjdG9yeSk6Ci0gICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oZGlyZWN0b3J5LCBmaWxlbmFtZSkKLSAgICAgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKHBhdGgpOgotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgIyBHdWVzcyB0aGUgY29udGVudCB0eXBlIGJhc2VkIG9uIHRoZSBmaWxlJ3MgZXh0ZW5zaW9uLiAgRW5jb2RpbmcKLSAgICAgICAgIyB3aWxsIGJlIGlnbm9yZWQsIGFsdGhvdWdoIHdlIHNob3VsZCBjaGVjayBmb3Igc2ltcGxlIHRoaW5ncyBsaWtlCi0gICAgICAgICMgZ3ppcCdkIG9yIGNvbXByZXNzZWQgZmlsZXMuCi0gICAgICAgIGN0eXBlLCBlbmNvZGluZyA9IG1pbWV0eXBlcy5ndWVzc190eXBlKHBhdGgpCi0gICAgICAgIGlmIGN0eXBlIGlzIE5vbmUgb3IgZW5jb2RpbmcgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAjIE5vIGd1ZXNzIGNvdWxkIGJlIG1hZGUsIG9yIHRoZSBmaWxlIGlzIGVuY29kZWQgKGNvbXByZXNzZWQpLCBzbwotICAgICAgICAgICAgIyB1c2UgYSBnZW5lcmljIGJhZy1vZi1iaXRzIHR5cGUuCi0gICAgICAgICAgICBjdHlwZSA9ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nCi0gICAgICAgIG1haW50eXBlLCBzdWJ0eXBlID0gY3R5cGUuc3BsaXQoJy8nLCAxKQotICAgICAgICBpZiBtYWludHlwZSA9PSAndGV4dCc6Ci0gICAgICAgICAgICBmcCA9IG9wZW4ocGF0aCkKLSAgICAgICAgICAgICMgTm90ZTogd2Ugc2hvdWxkIGhhbmRsZSBjYWxjdWxhdGluZyB0aGUgY2hhcnNldAotICAgICAgICAgICAgbXNnID0gTUlNRVRleHQoZnAucmVhZCgpLCBfc3VidHlwZT1zdWJ0eXBlKQotICAgICAgICAgICAgZnAuY2xvc2UoKQotICAgICAgICBlbGlmIG1haW50eXBlID09ICdpbWFnZSc6Ci0gICAgICAgICAgICBmcCA9IG9wZW4ocGF0aCwgJ3JiJykKLSAgICAgICAgICAgIG1zZyA9IE1JTUVJbWFnZShmcC5yZWFkKCksIF9zdWJ0eXBlPXN1YnR5cGUpCi0gICAgICAgICAgICBmcC5jbG9zZSgpCi0gICAgICAgIGVsaWYgbWFpbnR5cGUgPT0gJ2F1ZGlvJzoKLSAgICAgICAgICAgIGZwID0gb3BlbihwYXRoLCAncmInKQotICAgICAgICAgICAgbXNnID0gTUlNRUF1ZGlvKGZwLnJlYWQoKSwgX3N1YnR5cGU9c3VidHlwZSkKLSAgICAgICAgICAgIGZwLmNsb3NlKCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGZwID0gb3BlbihwYXRoLCAncmInKQotICAgICAgICAgICAgbXNnID0gTUlNRUJhc2UobWFpbnR5cGUsIHN1YnR5cGUpCi0gICAgICAgICAgICBtc2cuc2V0X3BheWxvYWQoZnAucmVhZCgpKQotICAgICAgICAgICAgZnAuY2xvc2UoKQotICAgICAgICAgICAgIyBFbmNvZGUgdGhlIHBheWxvYWQgdXNpbmcgQmFzZTY0Ci0gICAgICAgICAgICBlbmNvZGVycy5lbmNvZGVfYmFzZTY0KG1zZykKLSAgICAgICAgIyBTZXQgdGhlIGZpbGVuYW1lIHBhcmFtZXRlcgotICAgICAgICBtc2cuYWRkX2hlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbicsICdhdHRhY2htZW50JywgZmlsZW5hbWU9ZmlsZW5hbWUpCi0gICAgICAgIG91dGVyLmF0dGFjaChtc2cpCi0gICAgIyBOb3cgc2VuZCBvciBzdG9yZSB0aGUgbWVzc2FnZQotICAgIGNvbXBvc2VkID0gb3V0ZXIuYXNfc3RyaW5nKCkKLSAgICBpZiBvcHRzLm91dHB1dDoKLSAgICAgICAgZnAgPSBvcGVuKG9wdHMub3V0cHV0LCAndycpCi0gICAgICAgIGZwLndyaXRlKGNvbXBvc2VkKQotICAgICAgICBmcC5jbG9zZSgpCi0gICAgZWxzZToKLSAgICAgICAgcyA9IHNtdHBsaWIuU01UUCgpCi0gICAgICAgIHMuY29ubmVjdCgpCi0gICAgICAgIHMuc2VuZG1haWwob3B0cy5zZW5kZXIsIG9wdHMucmVjaXBpZW50cywgY29tcG9zZWQpCi0gICAgICAgIHMuY2xvc2UoKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgbWFpbigpCmRpZmYgLS1naXQgYS9Eb2MvbGliL2VtYWlsLW1pbWUucHkgYi9Eb2MvbGliL2VtYWlsLW1pbWUucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwOTcyNTMuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9lbWFpbC1taW1lLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotIyBJbXBvcnQgc210cGxpYiBmb3IgdGhlIGFjdHVhbCBzZW5kaW5nIGZ1bmN0aW9uCi1pbXBvcnQgc210cGxpYgotCi0jIEhlcmUgYXJlIHRoZSBlbWFpbCBwYWNrYWdlIG1vZHVsZXMgd2UnbGwgbmVlZAotZnJvbSBlbWFpbC5taW1lLmltYWdlIGltcG9ydCBNSU1FSW1hZ2UKLWZyb20gZW1haWwubWltZS5tdWx0aXBhcnQgaW1wb3J0IE1JTUVNdWx0aXBhcnQKLQotQ09NTUFTUEFDRSA9ICcsICcKLQotIyBDcmVhdGUgdGhlIGNvbnRhaW5lciAob3V0ZXIpIGVtYWlsIG1lc3NhZ2UuCi1tc2cgPSBNSU1FTXVsdGlwYXJ0KCkKLW1zZ1snU3ViamVjdCddID0gJ091ciBmYW1pbHkgcmV1bmlvbicKLSMgbWUgPT0gdGhlIHNlbmRlcidzIGVtYWlsIGFkZHJlc3MKLSMgZmFtaWx5ID0gdGhlIGxpc3Qgb2YgYWxsIHJlY2lwaWVudHMnIGVtYWlsIGFkZHJlc3NlcwotbXNnWydGcm9tJ10gPSBtZQotbXNnWydUbyddID0gQ09NTUFTUEFDRS5qb2luKGZhbWlseSkKLW1zZy5wcmVhbWJsZSA9ICdPdXIgZmFtaWx5IHJldW5pb24nCi0KLSMgQXNzdW1lIHdlIGtub3cgdGhhdCB0aGUgaW1hZ2UgZmlsZXMgYXJlIGFsbCBpbiBQTkcgZm9ybWF0Ci1mb3IgZmlsZSBpbiBwbmdmaWxlczoKLSAgICAjIE9wZW4gdGhlIGZpbGVzIGluIGJpbmFyeSBtb2RlLiAgTGV0IHRoZSBNSU1FSW1hZ2UgY2xhc3MgYXV0b21hdGljYWxseQotICAgICMgZ3Vlc3MgdGhlIHNwZWNpZmljIGltYWdlIHR5cGUuCi0gICAgZnAgPSBvcGVuKGZpbGUsICdyYicpCi0gICAgaW1nID0gTUlNRUltYWdlKGZwLnJlYWQoKSkKLSAgICBmcC5jbG9zZSgpCi0gICAgbXNnLmF0dGFjaChpbWcpCi0KLSMgU2VuZCB0aGUgZW1haWwgdmlhIG91ciBvd24gU01UUCBzZXJ2ZXIuCi1zID0gc210cGxpYi5TTVRQKCkKLXMuY29ubmVjdCgpCi1zLnNlbmRtYWlsKG1lLCBmYW1pbHksIG1zZy5hc19zdHJpbmcoKSkKLXMuY2xvc2UoKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9lbWFpbC1zaW1wbGUucHkgYi9Eb2MvbGliL2VtYWlsLXNpbXBsZS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQxNTJhNC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2VtYWlsLXNpbXBsZS5weQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMgSW1wb3J0IHNtdHBsaWIgZm9yIHRoZSBhY3R1YWwgc2VuZGluZyBmdW5jdGlvbgotaW1wb3J0IHNtdHBsaWIKLQotIyBJbXBvcnQgdGhlIGVtYWlsIG1vZHVsZXMgd2UnbGwgbmVlZAotZnJvbSBlbWFpbC5taW1lLnRleHQgaW1wb3J0IE1JTUVUZXh0Ci0KLSMgT3BlbiBhIHBsYWluIHRleHQgZmlsZSBmb3IgcmVhZGluZy4gIEZvciB0aGlzIGV4YW1wbGUsIGFzc3VtZSB0aGF0Ci0jIHRoZSB0ZXh0IGZpbGUgY29udGFpbnMgb25seSBBU0NJSSBjaGFyYWN0ZXJzLgotZnAgPSBvcGVuKHRleHRmaWxlLCAncmInKQotIyBDcmVhdGUgYSB0ZXh0L3BsYWluIG1lc3NhZ2UKLW1zZyA9IE1JTUVUZXh0KGZwLnJlYWQoKSkKLWZwLmNsb3NlKCkKLQotIyBtZSA9PSB0aGUgc2VuZGVyJ3MgZW1haWwgYWRkcmVzcwotIyB5b3UgPT0gdGhlIHJlY2lwaWVudCdzIGVtYWlsIGFkZHJlc3MKLW1zZ1snU3ViamVjdCddID0gJ1RoZSBjb250ZW50cyBvZiAlcycgJSB0ZXh0ZmlsZQotbXNnWydGcm9tJ10gPSBtZQotbXNnWydUbyddID0geW91Ci0KLSMgU2VuZCB0aGUgbWVzc2FnZSB2aWEgb3VyIG93biBTTVRQIHNlcnZlciwgYnV0IGRvbid0IGluY2x1ZGUgdGhlCi0jIGVudmVsb3BlIGhlYWRlci4KLXMgPSBzbXRwbGliLlNNVFAoKQotcy5jb25uZWN0KCkKLXMuc2VuZG1haWwobWUsIFt5b3VdLCBtc2cuYXNfc3RyaW5nKCkpCi1zLmNsb3NlKCkKZGlmZiAtLWdpdCBhL0RvYy9saWIvZW1haWwtdW5wYWNrLnB5IGIvRG9jL2xpYi9lbWFpbC11bnBhY2sucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1OTZiOTguLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9lbWFpbC11bnBhY2sucHkKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLQotIiIiVW5wYWNrIGEgTUlNRSBtZXNzYWdlIGludG8gYSBkaXJlY3Rvcnkgb2YgZmlsZXMuIiIiCi0KLWltcG9ydCBvcwotaW1wb3J0IHN5cwotaW1wb3J0IGVtYWlsCi1pbXBvcnQgZXJybm8KLWltcG9ydCBtaW1ldHlwZXMKLQotZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uUGFyc2VyCi0KLQotZGVmIG1haW4oKToKLSAgICBwYXJzZXIgPSBPcHRpb25QYXJzZXIodXNhZ2U9IiIiXAotVW5wYWNrIGEgTUlNRSBtZXNzYWdlIGludG8gYSBkaXJlY3Rvcnkgb2YgZmlsZXMuCi0KLVVzYWdlOiAlcHJvZyBbb3B0aW9uc10gbXNnZmlsZQotIiIiKQotICAgIHBhcnNlci5hZGRfb3B0aW9uKCctZCcsICctLWRpcmVjdG9yeScsCi0gICAgICAgICAgICAgICAgICAgICAgdHlwZT0nc3RyaW5nJywgYWN0aW9uPSdzdG9yZScsCi0gICAgICAgICAgICAgICAgICAgICAgaGVscD0iIiJVbnBhY2sgdGhlIE1JTUUgbWVzc2FnZSBpbnRvIHRoZSBuYW1lZAotICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSwgd2hpY2ggd2lsbCBiZSBjcmVhdGVkIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeQotICAgICAgICAgICAgICAgICAgICAgIGV4aXN0LiIiIikKLSAgICBvcHRzLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQotICAgIGlmIG5vdCBvcHRzLmRpcmVjdG9yeToKLSAgICAgICAgcGFyc2VyLnByaW50X2hlbHAoKQotICAgICAgICBzeXMuZXhpdCgxKQotCi0gICAgdHJ5OgotICAgICAgICBtc2dmaWxlID0gYXJnc1swXQotICAgIGV4Y2VwdCBJbmRleEVycm9yOgotICAgICAgICBwYXJzZXIucHJpbnRfaGVscCgpCi0gICAgICAgIHN5cy5leGl0KDEpCi0KLSAgICB0cnk6Ci0gICAgICAgIG9zLm1rZGlyKG9wdHMuZGlyZWN0b3J5KQotICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6Ci0gICAgICAgICMgSWdub3JlIGRpcmVjdG9yeSBleGlzdHMgZXJyb3IKLSAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FRVhJU1Q6Ci0gICAgICAgICAgICByYWlzZQotCi0gICAgZnAgPSBvcGVuKG1zZ2ZpbGUpCi0gICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX2ZpbGUoZnApCi0gICAgZnAuY2xvc2UoKQotCi0gICAgY291bnRlciA9IDEKLSAgICBmb3IgcGFydCBpbiBtc2cud2FsaygpOgotICAgICAgICAjIG11bHRpcGFydC8qIGFyZSBqdXN0IGNvbnRhaW5lcnMKLSAgICAgICAgaWYgcGFydC5nZXRfY29udGVudF9tYWludHlwZSgpID09ICdtdWx0aXBhcnQnOgotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgIyBBcHBsaWNhdGlvbnMgc2hvdWxkIHJlYWxseSBzYW5pdGl6ZSB0aGUgZ2l2ZW4gZmlsZW5hbWUgc28gdGhhdCBhbgotICAgICAgICAjIGVtYWlsIG1lc3NhZ2UgY2FuJ3QgYmUgdXNlZCB0byBvdmVyd3JpdGUgaW1wb3J0YW50IGZpbGVzCi0gICAgICAgIGZpbGVuYW1lID0gcGFydC5nZXRfZmlsZW5hbWUoKQotICAgICAgICBpZiBub3QgZmlsZW5hbWU6Ci0gICAgICAgICAgICBleHQgPSBtaW1ldHlwZXMuZ3Vlc3NfZXh0ZW5zaW9uKHBhcnQuZ2V0X3R5cGUoKSkKLSAgICAgICAgICAgIGlmIG5vdCBleHQ6Ci0gICAgICAgICAgICAgICAgIyBVc2UgYSBnZW5lcmljIGJhZy1vZi1iaXRzIGV4dGVuc2lvbgotICAgICAgICAgICAgICAgIGV4dCA9ICcuYmluJwotICAgICAgICAgICAgZmlsZW5hbWUgPSAncGFydC0lMDNkJXMnICUgKGNvdW50ZXIsIGV4dCkKLSAgICAgICAgY291bnRlciArPSAxCi0gICAgICAgIGZwID0gb3Blbihvcy5wYXRoLmpvaW4ob3B0cy5kaXJlY3RvcnksIGZpbGVuYW1lKSwgJ3diJykKLSAgICAgICAgZnAud3JpdGUocGFydC5nZXRfcGF5bG9hZChkZWNvZGU9VHJ1ZSkpCi0gICAgICAgIGZwLmNsb3NlKCkKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9lbWFpbC50ZXggYi9Eb2MvbGliL2VtYWlsLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RlM2RmMy4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2VtYWlsLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDQwMiArMCwwIEBACi0lIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0lIEF1dGhvcjogYmFycnlAcHl0aG9uLm9yZyAoQmFycnkgV2Fyc2F3KQotCi1cc2VjdGlvbntcbW9kdWxle2VtYWlsfSAtLS0KLQkgQW4gZW1haWwgYW5kIE1JTUUgaGFuZGxpbmcgcGFja2FnZX0KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2VtYWlsfQotXG1vZHVsZXN5bm9wc2lze1BhY2thZ2Ugc3VwcG9ydGluZyB0aGUgcGFyc2luZywgbWFuaXB1bGF0aW5nLCBhbmQKLSAgICBnZW5lcmF0aW5nIGVtYWlsIG1lc3NhZ2VzLCBpbmNsdWRpbmcgTUlNRSBkb2N1bWVudHMufQotXG1vZHVsZWF1dGhvcntCYXJyeSBBLiBXYXJzYXd9e2JhcnJ5QHB5dGhvbi5vcmd9Ci1cc2VjdGlvbmF1dGhvcntCYXJyeSBBLiBXYXJzYXd9e2JhcnJ5QHB5dGhvbi5vcmd9Ci0KLVx2ZXJzaW9uYWRkZWR7Mi4yfQotCi1UaGUgXG1vZHVsZXtlbWFpbH0gcGFja2FnZSBpcyBhIGxpYnJhcnkgZm9yIG1hbmFnaW5nIGVtYWlsIG1lc3NhZ2VzLAotaW5jbHVkaW5nIE1JTUUgYW5kIG90aGVyIFxyZmN7MjgyMn0tYmFzZWQgbWVzc2FnZSBkb2N1bWVudHMuICBJdAotc3Vic3VtZXMgbW9zdCBvZiB0aGUgZnVuY3Rpb25hbGl0eSBpbiBzZXZlcmFsIG9sZGVyIHN0YW5kYXJkIG1vZHVsZXMKLXN1Y2ggYXMgXHJlZm1vZHVsZXtyZmM4MjJ9LCBccmVmbW9kdWxle21pbWV0b29sc30sCi1ccmVmbW9kdWxle211bHRpZmlsZX0sIGFuZCBvdGhlciBub24tc3RhbmRhcmQgcGFja2FnZXMgc3VjaCBhcwotXG1vZHVsZXttaW1lY250bH0uICBJdCBpcyBzcGVjaWZpY2FsbHkgXGVtcGh7bm90fSBkZXNpZ25lZCB0byBkbyBhbnkKLXNlbmRpbmcgb2YgZW1haWwgbWVzc2FnZXMgdG8gU01UUCAoXHJmY3syODIxfSksIE5OVFAsIG9yIG90aGVyIHNlcnZlcnM7IHRob3NlCi1hcmUgZnVuY3Rpb25zIG9mIG1vZHVsZXMgc3VjaCBhcyBccmVmbW9kdWxle3NtdHBsaWJ9IGFuZCBccmVmbW9kdWxle25udHBsaWJ9LgotVGhlIFxtb2R1bGV7ZW1haWx9IHBhY2thZ2UgYXR0ZW1wdHMgdG8gYmUgYXMgUkZDLWNvbXBsaWFudCBhcyBwb3NzaWJsZSwKLXN1cHBvcnRpbmcgaW4gYWRkaXRpb24gdG8gXHJmY3syODIyfSwgc3VjaCBNSU1FLXJlbGF0ZWQgUkZDcyBhcwotXHJmY3syMDQ1fSwgXHJmY3syMDQ2fSwgXHJmY3syMDQ3fSwgYW5kIFxyZmN7MjIzMX0uCi0KLVRoZSBwcmltYXJ5IGRpc3Rpbmd1aXNoaW5nIGZlYXR1cmUgb2YgdGhlIFxtb2R1bGV7ZW1haWx9IHBhY2thZ2UgaXMKLXRoYXQgaXQgc3BsaXRzIHRoZSBwYXJzaW5nIGFuZCBnZW5lcmF0aW5nIG9mIGVtYWlsIG1lc3NhZ2VzIGZyb20gdGhlCi1pbnRlcm5hbCBcZW1waHtvYmplY3QgbW9kZWx9IHJlcHJlc2VudGF0aW9uIG9mIGVtYWlsLiAgQXBwbGljYXRpb25zCi11c2luZyB0aGUgXG1vZHVsZXtlbWFpbH0gcGFja2FnZSBkZWFsIHByaW1hcmlseSB3aXRoIG9iamVjdHM7IHlvdSBjYW4KLWFkZCBzdWItb2JqZWN0cyB0byBtZXNzYWdlcywgcmVtb3ZlIHN1Yi1vYmplY3RzIGZyb20gbWVzc2FnZXMsCi1jb21wbGV0ZWx5IHJlLWFycmFuZ2UgdGhlIGNvbnRlbnRzLCBldGMuICBUaGVyZSBpcyBhIHNlcGFyYXRlIHBhcnNlcgotYW5kIGEgc2VwYXJhdGUgZ2VuZXJhdG9yIHdoaWNoIGhhbmRsZXMgdGhlIHRyYW5zZm9ybWF0aW9uIGZyb20gZmxhdAotdGV4dCB0byB0aGUgb2JqZWN0IG1vZGVsLCBhbmQgdGhlbiBiYWNrIHRvIGZsYXQgdGV4dCBhZ2Fpbi4gIFRoZXJlCi1hcmUgYWxzbyBoYW5keSBzdWJjbGFzc2VzIGZvciBzb21lIGNvbW1vbiBNSU1FIG9iamVjdCB0eXBlcywgYW5kIGEgZmV3Ci1taXNjZWxsYW5lb3VzIHV0aWxpdGllcyB0aGF0IGhlbHAgd2l0aCBzdWNoIGNvbW1vbiB0YXNrcyBhcyBleHRyYWN0aW5nCi1hbmQgcGFyc2luZyBtZXNzYWdlIGZpZWxkIHZhbHVlcywgY3JlYXRpbmcgUkZDLWNvbXBsaWFudCBkYXRlcywgZXRjLgotCi1UaGUgZm9sbG93aW5nIHNlY3Rpb25zIGRlc2NyaWJlIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZQotXG1vZHVsZXtlbWFpbH0gcGFja2FnZS4gIFRoZSBvcmRlcmluZyBmb2xsb3dzIGEgcHJvZ3Jlc3Npb24gdGhhdAotc2hvdWxkIGJlIGNvbW1vbiBpbiBhcHBsaWNhdGlvbnM6IGFuIGVtYWlsIG1lc3NhZ2UgaXMgcmVhZCBhcyBmbGF0Ci10ZXh0IGZyb20gYSBmaWxlIG9yIG90aGVyIHNvdXJjZSwgdGhlIHRleHQgaXMgcGFyc2VkIHRvIHByb2R1Y2UgdGhlCi1vYmplY3Qgc3RydWN0dXJlIG9mIHRoZSBlbWFpbCBtZXNzYWdlLCB0aGlzIHN0cnVjdHVyZSBpcyBtYW5pcHVsYXRlZCwKLWFuZCBmaW5hbGx5LCB0aGUgb2JqZWN0IHRyZWUgaXMgcmVuZGVyZWQgYmFjayBpbnRvIGZsYXQgdGV4dC4KLQotSXQgaXMgcGVyZmVjdGx5IGZlYXNpYmxlIHRvIGNyZWF0ZSB0aGUgb2JqZWN0IHN0cnVjdHVyZSBvdXQgb2Ygd2hvbGUKLWNsb3RoIC0tLSBpLmUuIGNvbXBsZXRlbHkgZnJvbSBzY3JhdGNoLiAgRnJvbSB0aGVyZSwgYSBzaW1pbGFyCi1wcm9ncmVzc2lvbiBjYW4gYmUgdGFrZW4gYXMgYWJvdmUuCi0KLUFsc28gaW5jbHVkZWQgYXJlIGRldGFpbGVkIHNwZWNpZmljYXRpb25zIG9mIGFsbCB0aGUgY2xhc3NlcyBhbmQKLW1vZHVsZXMgdGhhdCB0aGUgXG1vZHVsZXtlbWFpbH0gcGFja2FnZSBwcm92aWRlcywgdGhlIGV4Y2VwdGlvbgotY2xhc3NlcyB5b3UgbWlnaHQgZW5jb3VudGVyIHdoaWxlIHVzaW5nIHRoZSBcbW9kdWxle2VtYWlsfSBwYWNrYWdlLAotc29tZSBhdXhpbGlhcnkgdXRpbGl0aWVzLCBhbmQgYSBmZXcgZXhhbXBsZXMuICBGb3IgdXNlcnMgb2YgdGhlIG9sZGVyCi1cbW9kdWxle21pbWVsaWJ9IHBhY2thZ2UsIG9yIHByZXZpb3VzIHZlcnNpb25zIG9mIHRoZSBcbW9kdWxle2VtYWlsfQotcGFja2FnZSwgYSBzZWN0aW9uIG9uIGRpZmZlcmVuY2VzIGFuZCBwb3J0aW5nIGlzIHByb3ZpZGVkLgotCi1cYmVnaW57c2VlYWxzb30KLSAgICBcc2VlbW9kdWxle3NtdHBsaWJ9e1NNVFAgcHJvdG9jb2wgY2xpZW50fQotICAgIFxzZWVtb2R1bGV7bm50cGxpYn17Tk5UUCBwcm90b2NvbCBjbGllbnR9Ci1cZW5ke3NlZWFsc299Ci0KLVxzdWJzZWN0aW9ue1JlcHJlc2VudGluZyBhbiBlbWFpbCBtZXNzYWdlfQotXGlucHV0e2VtYWlsbWVzc2FnZX0KLQotXHN1YnNlY3Rpb257UGFyc2luZyBlbWFpbCBtZXNzYWdlc30KLVxpbnB1dHtlbWFpbHBhcnNlcn0KLQotXHN1YnNlY3Rpb257R2VuZXJhdGluZyBNSU1FIGRvY3VtZW50c30KLVxpbnB1dHtlbWFpbGdlbmVyYXRvcn0KLQotXHN1YnNlY3Rpb257Q3JlYXRpbmcgZW1haWwgYW5kIE1JTUUgb2JqZWN0cyBmcm9tIHNjcmF0Y2h9Ci1caW5wdXR7ZW1haWxtaW1lYmFzZX0KLQotXHN1YnNlY3Rpb257SW50ZXJuYXRpb25hbGl6ZWQgaGVhZGVyc30KLVxpbnB1dHtlbWFpbGhlYWRlcnN9Ci0KLVxzdWJzZWN0aW9ue1JlcHJlc2VudGluZyBjaGFyYWN0ZXIgc2V0c30KLVxpbnB1dHtlbWFpbGNoYXJzZXRzfQotCi1cc3Vic2VjdGlvbntFbmNvZGVyc30KLVxpbnB1dHtlbWFpbGVuY29kZXJzfQotCi1cc3Vic2VjdGlvbntFeGNlcHRpb24gYW5kIERlZmVjdCBjbGFzc2VzfQotXGlucHV0e2VtYWlsZXhjfQotCi1cc3Vic2VjdGlvbntNaXNjZWxsYW5lb3VzIHV0aWxpdGllc30KLVxpbnB1dHtlbWFpbHV0aWx9Ci0KLVxzdWJzZWN0aW9ue0l0ZXJhdG9yc30KLVxpbnB1dHtlbWFpbGl0ZXJ9Ci0KLVxzdWJzZWN0aW9ue1BhY2thZ2UgSGlzdG9yeVxsYWJlbHtlbWFpbC1wa2ctaGlzdG9yeX19Ci0KLVRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSByZWxlYXNlIGhpc3Rvcnkgb2YgdGhlIGVtYWlsIHBhY2thZ2UsIGNvcnJlc3BvbmRpbmcKLXRvIHRoZSB2ZXJzaW9uIG9mIFB5dGhvbiB0aGF0IHRoZSBwYWNrYWdlIHdhcyByZWxlYXNlZCB3aXRoLiAgRm9yIHB1cnBvc2VzIG9mCi10aGlzIGRvY3VtZW50LCB3aGVuIHlvdSBzZWUgYSBub3RlIGFib3V0IGNoYW5nZSBvciBhZGRlZCB2ZXJzaW9ucywgdGhlc2UgcmVmZXIKLXRvIHRoZSBQeXRob24gdmVyc2lvbiB0aGUgY2hhbmdlIHdhcyBtYWRlIGluLCBcZW1waHtub3R9IHRoZSBlbWFpbCBwYWNrYWdlCi12ZXJzaW9uLiAgVGhpcyB0YWJsZSBhbHNvIGRlc2NyaWJlcyB0aGUgUHl0aG9uIGNvbXBhdGliaWxpdHkgb2YgZWFjaCB2ZXJzaW9uCi1vZiB0aGUgcGFja2FnZS4KLQotXGJlZ2lue3RhYmxlaWlpfXtsfGx8bH17Y29uc3RhbnR9e2VtYWlsIHZlcnNpb259e2Rpc3RyaWJ1dGVkIHdpdGh9e2NvbXBhdGlibGUgd2l0aH0KLVxsaW5laWlpezEueH17UHl0aG9uIDIuMi4wIHRvIFB5dGhvbiAyLjIuMX17XGVtcGh7bm8gbG9uZ2VyIHN1cHBvcnRlZH19Ci1cbGluZWlpaXsyLjV9e1B5dGhvbiAyLjIuMisgYW5kIFB5dGhvbiAyLjN9e1B5dGhvbiAyLjEgdG8gMi41fQotXGxpbmVpaWl7My4wfXtQeXRob24gMi40fXtQeXRob24gMi4zIHRvIDIuNX0KLVxsaW5laWlpezQuMH17UHl0aG9uIDIuNX17UHl0aG9uIDIuMyB0byAyLjV9Ci1cZW5ke3RhYmxlaWlpfQotCi1IZXJlIGFyZSB0aGUgbWFqb3IgZGlmZmVyZW5jZXMgYmV0d2VlbiBcbW9kdWxle2VtYWlsfSB2ZXJzaW9uIDQgYW5kIHZlcnNpb24gMzoKLQotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSBBbGwgbW9kdWxlcyBoYXZlIGJlZW4gcmVuYW1lZCBhY2NvcmRpbmcgdG8gXHBlcHs4fSBzdGFuZGFyZHMuICBGb3IKLSAgICAgIGV4YW1wbGUsIHRoZSB2ZXJzaW9uIDMgbW9kdWxlIFxtb2R1bGV7ZW1haWwuTWVzc2FnZX0gd2FzIHJlbmFtZWQgdG8KLSAgICAgIFxtb2R1bGV7ZW1haWwubWVzc2FnZX0gaW4gdmVyc2lvbiA0LgotCi1caXRlbSBBIG5ldyBzdWJwYWNrYWdlIFxtb2R1bGV7ZW1haWwubWltZX0gd2FzIGFkZGVkIGFuZCBhbGwgdGhlIHZlcnNpb24gMwotICAgICAgXG1vZHVsZXtlbWFpbC5NSU1FKn0gbW9kdWxlcyB3ZXJlIHJlbmFtZWQgYW5kIHNpdHVhdGVkIGludG8gdGhlCi0gICAgICBcbW9kdWxle2VtYWlsLm1pbWV9IHN1YnBhY2thZ2UuICBGb3IgZXhhbXBsZSwgdGhlIHZlcnNpb24gMyBtb2R1bGUKLSAgICAgIFxtb2R1bGV7ZW1haWwuTUlNRVRleHR9IHdhcyByZW5hbWVkIHRvIFxtb2R1bGV7ZW1haWwubWltZS50ZXh0fS4KLQotICAgICAgXGVtcGh7Tm90ZSB0aGF0IHRoZSB2ZXJzaW9uIDMgbmFtZXMgd2lsbCBjb250aW51ZSB0byB3b3JrIHVudGlsIFB5dGhvbgotICAgICAgMi42fS4KLQotXGl0ZW0gVGhlIFxtb2R1bGV7ZW1haWwubWltZS5hcHBsaWNhdGlvbn0gbW9kdWxlIHdhcyBhZGRlZCwgd2hpY2ggY29udGFpbnMgdGhlCi0gICAgICBcY2xhc3N7TUlNRUFwcGxpY2F0aW9ufSBjbGFzcy4KLQotXGl0ZW0gTWV0aG9kcyB0aGF0IHdlcmUgZGVwcmVjYXRlZCBpbiB2ZXJzaW9uIDMgaGF2ZSBiZWVuIHJlbW92ZWQuICBUaGVzZQotICAgICAgaW5jbHVkZSBcbWV0aG9ke0dlbmVyYXRvci5fX2NhbGxfXygpfSwgXG1ldGhvZHtNZXNzYWdlLmdldF90eXBlKCl9LAotICAgICAgXG1ldGhvZHtNZXNzYWdlLmdldF9tYWluX3R5cGUoKX0sIFxtZXRob2R7TWVzc2FnZS5nZXRfc3VidHlwZSgpfS4KLQotXGl0ZW0gRml4ZXMgaGF2ZSBiZWVuIGFkZGVkIGZvciBccmZjezIyMzF9IHN1cHBvcnQgd2hpY2ggY2FuIGNoYW5nZSBzb21lIG9mCi0gICAgICB0aGUgcmV0dXJuIHR5cGVzIGZvciBcZnVuY3Rpb257TWVzc2FnZS5nZXRfcGFyYW0oKX0gYW5kIGZyaWVuZHMuICBVbmRlcgotICAgICAgc29tZSBjaXJjdW1zdGFuY2VzLCB2YWx1ZXMgd2hpY2ggdXNlZCB0byByZXR1cm4gYSAzLXR1cGxlIG5vdyByZXR1cm4KLSAgICAgIHNpbXBsZSBzdHJpbmdzIChzcGVjaWZpY2FsbHksIGlmIGFsbCBleHRlbmRlZCBwYXJhbWV0ZXIgc2VnbWVudHMgd2VyZQotICAgICAgdW5lbmNvZGVkLCB0aGVyZSBpcyBubyBsYW5ndWFnZSBhbmQgY2hhcnNldCBkZXNpZ25hdGlvbiBleHBlY3RlZCwgc28gdGhlCi0gICAgICByZXR1cm4gdHlwZSBpcyBub3cgYSBzaW1wbGUgc3RyaW5nKS4gIEFsc28sIFwlLWRlY29kaW5nIHVzZWQgdG8gYmUgZG9uZQotICAgICAgZm9yIGJvdGggZW5jb2RlZCBhbmQgdW5lbmNvZGVkIHNlZ21lbnRzOyB0aGlzIGRlY29kaW5nIGlzIG5vdyBkb25lIG9ubHkKLSAgICAgIGZvciBlbmNvZGVkIHNlZ21lbnRzLgotXGVuZHtpdGVtaXplfQotCi1IZXJlIGFyZSB0aGUgbWFqb3IgZGlmZmVyZW5jZXMgYmV0d2VlbiBcbW9kdWxle2VtYWlsfSB2ZXJzaW9uIDMgYW5kIHZlcnNpb24gMjoKLQotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSBUaGUgXGNsYXNze0ZlZWRQYXJzZXJ9IGNsYXNzIHdhcyBpbnRyb2R1Y2VkLCBhbmQgdGhlIFxjbGFzc3tQYXJzZXJ9Ci0gICAgICBjbGFzcyB3YXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgdGhlIFxjbGFzc3tGZWVkUGFyc2VyfS4gIEFsbCBwYXJzaW5nCi0gICAgICB0aGVyZWZvcmUgaXMgbm9uLXN0cmljdCwgYW5kIHBhcnNpbmcgd2lsbCBtYWtlIGEgYmVzdCBlZmZvcnQgbmV2ZXIgdG8KLSAgICAgIHJhaXNlIGFuIGV4Y2VwdGlvbi4gIFByb2JsZW1zIGZvdW5kIHdoaWxlIHBhcnNpbmcgbWVzc2FnZXMgYXJlIHN0b3JlZCBpbgotICAgICAgdGhlIG1lc3NhZ2UncyBcdmFye2RlZmVjdH0gYXR0cmlidXRlLgotCi1caXRlbSBBbGwgYXNwZWN0cyBvZiB0aGUgQVBJIHdoaWNoIHJhaXNlZCBcZXhjZXB0aW9ue0RlcHJlY2F0aW9uV2FybmluZ31zIGluCi0gICAgICB2ZXJzaW9uIDIgaGF2ZSBiZWVuIHJlbW92ZWQuICBUaGVzZSBpbmNsdWRlIHRoZSBcdmFye19lbmNvZGVyfSBhcmd1bWVudAotICAgICAgdG8gdGhlIFxjbGFzc3tNSU1FVGV4dH0gY29uc3RydWN0b3IsIHRoZSBcbWV0aG9ke01lc3NhZ2UuYWRkX3BheWxvYWQoKX0KLSAgICAgIG1ldGhvZCwgdGhlIFxmdW5jdGlvbntVdGlscy5kdW1wX2FkZHJlc3NfcGFpcigpfSBmdW5jdGlvbiwgYW5kIHRoZQotICAgICAgZnVuY3Rpb25zIFxmdW5jdGlvbntVdGlscy5kZWNvZGUoKX0gYW5kIFxmdW5jdGlvbntVdGlscy5lbmNvZGUoKX0uCi0KLVxpdGVtIE5ldyBcZXhjZXB0aW9ue0RlcHJlY2F0aW9uV2FybmluZ31zIGhhdmUgYmVlbiBhZGRlZCB0bzoKLSAgICAgIFxtZXRob2R7R2VuZXJhdG9yLl9fY2FsbF9fKCl9LCBcbWV0aG9ke01lc3NhZ2UuZ2V0X3R5cGUoKX0sCi0gICAgICBcbWV0aG9ke01lc3NhZ2UuZ2V0X21haW5fdHlwZSgpfSwgXG1ldGhvZHtNZXNzYWdlLmdldF9zdWJ0eXBlKCl9LCBhbmQKLSAgICAgIHRoZSBcdmFye3N0cmljdH0gYXJndW1lbnQgdG8gdGhlIFxjbGFzc3tQYXJzZXJ9IGNsYXNzLiAgVGhlc2UgYXJlCi0gICAgICBleHBlY3RlZCB0byBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy4KLQotXGl0ZW0gU3VwcG9ydCBmb3IgUHl0aG9ucyBlYXJsaWVyIHRoYW4gMi4zIGhhcyBiZWVuIHJlbW92ZWQuCi1cZW5ke2l0ZW1pemV9Ci0KLUhlcmUgYXJlIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIFxtb2R1bGV7ZW1haWx9IHZlcnNpb24gMiBhbmQgdmVyc2lvbiAxOgotCi1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtIFRoZSBcbW9kdWxle2VtYWlsLkhlYWRlcn0gYW5kIFxtb2R1bGV7ZW1haWwuQ2hhcnNldH0gbW9kdWxlcwotICAgICAgaGF2ZSBiZWVuIGFkZGVkLgotCi1caXRlbSBUaGUgcGlja2xlIGZvcm1hdCBmb3IgXGNsYXNze01lc3NhZ2V9IGluc3RhbmNlcyBoYXMgY2hhbmdlZC4KLSAgICAgIFNpbmNlIHRoaXMgd2FzIG5ldmVyIChhbmQgc3RpbGwgaXNuJ3QpIGZvcm1hbGx5IGRlZmluZWQsIHRoaXMKLSAgICAgIGlzbid0IGNvbnNpZGVyZWQgYSBiYWNrd2FyZCBpbmNvbXBhdGliaWxpdHkuICBIb3dldmVyIGlmIHlvdXIKLSAgICAgIGFwcGxpY2F0aW9uIHBpY2tsZXMgYW5kIHVucGlja2xlcyBcY2xhc3N7TWVzc2FnZX0gaW5zdGFuY2VzLCBiZQotICAgICAgYXdhcmUgdGhhdCBpbiBcbW9kdWxle2VtYWlsfSB2ZXJzaW9uIDIsIFxjbGFzc3tNZXNzYWdlfQotICAgICAgaW5zdGFuY2VzIG5vdyBoYXZlIHByaXZhdGUgdmFyaWFibGVzIFx2YXJ7X2NoYXJzZXR9IGFuZAotICAgICAgXHZhcntfZGVmYXVsdF90eXBlfS4KLQotXGl0ZW0gU2V2ZXJhbCBtZXRob2RzIGluIHRoZSBcY2xhc3N7TWVzc2FnZX0gY2xhc3MgaGF2ZSBiZWVuCi0gICAgICBkZXByZWNhdGVkLCBvciB0aGVpciBzaWduYXR1cmVzIGNoYW5nZWQuICBBbHNvLCBtYW55IG5ldyBtZXRob2RzCi0gICAgICBoYXZlIGJlZW4gYWRkZWQuICBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBcY2xhc3N7TWVzc2FnZX0KLSAgICAgIGNsYXNzIGZvciBkZXRhaWxzLiAgVGhlIGNoYW5nZXMgc2hvdWxkIGJlIGNvbXBsZXRlbHkgYmFja3dhcmQKLSAgICAgIGNvbXBhdGlibGUuCi0KLVxpdGVtIFRoZSBvYmplY3Qgc3RydWN0dXJlIGhhcyBjaGFuZ2VkIGluIHRoZSBmYWNlIG9mCi0gICAgICBcbWltZXR5cGV7bWVzc2FnZS9yZmM4MjJ9IGNvbnRlbnQgdHlwZXMuICBJbiBcbW9kdWxle2VtYWlsfQotICAgICAgdmVyc2lvbiAxLCBzdWNoIGEgdHlwZSB3b3VsZCBiZSByZXByZXNlbnRlZCBieSBhIHNjYWxhciBwYXlsb2FkLAotICAgICAgaS5lLiB0aGUgY29udGFpbmVyIG1lc3NhZ2UncyBcbWV0aG9ke2lzX211bHRpcGFydCgpfSByZXR1cm5lZAotICAgICAgZmFsc2UsIFxtZXRob2R7Z2V0X3BheWxvYWQoKX0gd2FzIG5vdCBhIGxpc3Qgb2JqZWN0LCBidXQgYSBzaW5nbGUKLSAgICAgIFxjbGFzc3tNZXNzYWdlfSBpbnN0YW5jZS4KLQotICAgICAgVGhpcyBzdHJ1Y3R1cmUgd2FzIGluY29uc2lzdGVudCB3aXRoIHRoZSByZXN0IG9mIHRoZSBwYWNrYWdlLCBzbwotICAgICAgdGhlIG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgXG1pbWV0eXBle21lc3NhZ2UvcmZjODIyfSBjb250ZW50Ci0gICAgICB0eXBlcyB3YXMgY2hhbmdlZC4gIEluIFxtb2R1bGV7ZW1haWx9IHZlcnNpb24gMiwgdGhlIGNvbnRhaW5lcgotICAgICAgXGVtcGh7ZG9lc30gcmV0dXJuIFxjb2Rle1RydWV9IGZyb20gXG1ldGhvZHtpc19tdWx0aXBhcnQoKX0sIGFuZAotICAgICAgXG1ldGhvZHtnZXRfcGF5bG9hZCgpfSByZXR1cm5zIGEgbGlzdCBjb250YWluaW5nIGEgc2luZ2xlCi0gICAgICBcY2xhc3N7TWVzc2FnZX0gaXRlbS4KLQotICAgICAgTm90ZSB0aGF0IHRoaXMgaXMgb25lIHBsYWNlIHRoYXQgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBjb3VsZAotICAgICAgbm90IGJlIGNvbXBsZXRlbHkgbWFpbnRhaW5lZC4gIEhvd2V2ZXIsIGlmIHlvdSdyZSBhbHJlYWR5Ci0gICAgICB0ZXN0aW5nIHRoZSByZXR1cm4gdHlwZSBvZiBcbWV0aG9ke2dldF9wYXlsb2FkKCl9LCB5b3Ugc2hvdWxkIGJlCi0gICAgICBmaW5lLiAgWW91IGp1c3QgbmVlZCB0byBtYWtlIHN1cmUgeW91ciBjb2RlIGRvZXNuJ3QgZG8gYQotICAgICAgXG1ldGhvZHtzZXRfcGF5bG9hZCgpfSB3aXRoIGEgXGNsYXNze01lc3NhZ2V9IGluc3RhbmNlIG9uIGEKLSAgICAgIGNvbnRhaW5lciB3aXRoIGEgY29udGVudCB0eXBlIG9mIFxtaW1ldHlwZXttZXNzYWdlL3JmYzgyMn0uCi0KLVxpdGVtIFRoZSBcY2xhc3N7UGFyc2VyfSBjb25zdHJ1Y3RvcidzIFx2YXJ7c3RyaWN0fSBhcmd1bWVudCB3YXMKLSAgICAgIGFkZGVkLCBhbmQgaXRzIFxtZXRob2R7cGFyc2UoKX0gYW5kIFxtZXRob2R7cGFyc2VzdHIoKX0gbWV0aG9kcwotICAgICAgZ3JldyBhIFx2YXJ7aGVhZGVyc29ubHl9IGFyZ3VtZW50LiAgVGhlIFx2YXJ7c3RyaWN0fSBmbGFnIHdhcwotICAgICAgYWxzbyBhZGRlZCB0byBmdW5jdGlvbnMgXGZ1bmN0aW9ue2VtYWlsLm1lc3NhZ2VfZnJvbV9maWxlKCl9Ci0gICAgICBhbmQgXGZ1bmN0aW9ue2VtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoKX0uCi0KLVxpdGVtIFxtZXRob2R7R2VuZXJhdG9yLl9fY2FsbF9fKCl9IGlzIGRlcHJlY2F0ZWQ7IHVzZQotICAgICAgXG1ldGhvZHtHZW5lcmF0b3IuZmxhdHRlbigpfSBpbnN0ZWFkLiAgVGhlIFxjbGFzc3tHZW5lcmF0b3J9Ci0gICAgICBjbGFzcyBoYXMgYWxzbyBncm93biB0aGUgXG1ldGhvZHtjbG9uZSgpfSBtZXRob2QuCi0KLVxpdGVtIFRoZSBcY2xhc3N7RGVjb2RlZEdlbmVyYXRvcn0gY2xhc3MgaW4gdGhlCi0gICAgICBcbW9kdWxle2VtYWlsLkdlbmVyYXRvcn0gbW9kdWxlIHdhcyBhZGRlZC4KLQotXGl0ZW0gVGhlIGludGVybWVkaWF0ZSBiYXNlIGNsYXNzZXMgXGNsYXNze01JTUVOb25NdWx0aXBhcnR9IGFuZAotICAgICAgXGNsYXNze01JTUVNdWx0aXBhcnR9IGhhdmUgYmVlbiBhZGRlZCwgYW5kIGludGVycG9zZWQgaW4gdGhlCi0gICAgICBjbGFzcyBoaWVyYXJjaHkgZm9yIG1vc3Qgb2YgdGhlIG90aGVyIE1JTUUtcmVsYXRlZCBkZXJpdmVkCi0gICAgICBjbGFzc2VzLgotCi1caXRlbSBUaGUgXHZhcntfZW5jb2Rlcn0gYXJndW1lbnQgdG8gdGhlIFxjbGFzc3tNSU1FVGV4dH0gY29uc3RydWN0b3IKLSAgICAgIGhhcyBiZWVuIGRlcHJlY2F0ZWQuICBFbmNvZGluZyAgbm93IGhhcHBlbnMgaW1wbGljaXRseSBiYXNlZAotICAgICAgb24gdGhlIFx2YXJ7X2NoYXJzZXR9IGFyZ3VtZW50LgotCi1caXRlbSBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBpbiB0aGUgXG1vZHVsZXtlbWFpbC5VdGlsc30gbW9kdWxlIGhhdmUKLSAgICAgIGJlZW4gZGVwcmVjYXRlZDogXGZ1bmN0aW9ue2R1bXBfYWRkcmVzc19wYWlycygpfSwKLSAgICAgIFxmdW5jdGlvbntkZWNvZGUoKX0sIGFuZCBcZnVuY3Rpb257ZW5jb2RlKCl9LiAgVGhlIGZvbGxvd2luZwotICAgICAgZnVuY3Rpb25zIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgbW9kdWxlOgotICAgICAgXGZ1bmN0aW9ue21ha2VfbXNnaWQoKX0sIFxmdW5jdGlvbntkZWNvZGVfcmZjMjIzMSgpfSwKLSAgICAgIFxmdW5jdGlvbntlbmNvZGVfcmZjMjIzMSgpfSwgYW5kIFxmdW5jdGlvbntkZWNvZGVfcGFyYW1zKCl9LgotCi1caXRlbSBUaGUgbm9uLXB1YmxpYyBmdW5jdGlvbiBcZnVuY3Rpb257ZW1haWwuSXRlcmF0b3JzLl9zdHJ1Y3R1cmUoKX0KLSAgICAgIHdhcyBhZGRlZC4KLVxlbmR7aXRlbWl6ZX0KLQotXHN1YnNlY3Rpb257RGlmZmVyZW5jZXMgZnJvbSBcbW9kdWxle21pbWVsaWJ9fQotCi1UaGUgXG1vZHVsZXtlbWFpbH0gcGFja2FnZSB3YXMgb3JpZ2luYWxseSBwcm90b3R5cGVkIGFzIGEgc2VwYXJhdGUKLWxpYnJhcnkgY2FsbGVkCi1cdWxpbmt7XHRleHR0dHttaW1lbGlifX17aHR0cDovL21pbWVsaWIuc2YubmV0L30uCi1DaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHNvIHRoYXQKLW1ldGhvZCBuYW1lcyBhcmUgbW9yZSBjb25zaXN0ZW50LCBhbmQgc29tZSBtZXRob2RzIG9yIG1vZHVsZXMgaGF2ZQotZWl0aGVyIGJlZW4gYWRkZWQgb3IgcmVtb3ZlZC4gIFRoZSBzZW1hbnRpY3Mgb2Ygc29tZSBvZiB0aGUgbWV0aG9kcwotaGF2ZSBhbHNvIGNoYW5nZWQuICBGb3IgdGhlIG1vc3QgcGFydCwgYW55IGZ1bmN0aW9uYWxpdHkgYXZhaWxhYmxlIGluCi1cbW9kdWxle21pbWVsaWJ9IGlzIHN0aWxsIGF2YWlsYWJsZSBpbiB0aGUgXHJlZm1vZHVsZXtlbWFpbH0gcGFja2FnZSwKLWFsYmVpdCBvZnRlbiBpbiBhIGRpZmZlcmVudCB3YXkuICBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IGJldHdlZW4KLXRoZSBcbW9kdWxle21pbWVsaWJ9IHBhY2thZ2UgYW5kIHRoZSBcbW9kdWxle2VtYWlsfSBwYWNrYWdlIHdhcyBub3QgYQotcHJpb3JpdHkuCi0KLUhlcmUgaXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUKLVxtb2R1bGV7bWltZWxpYn0gYW5kIHRoZSBccmVmbW9kdWxle2VtYWlsfSBwYWNrYWdlcywgYWxvbmcgd2l0aCBoaW50cyBvbgotaG93IHRvIHBvcnQgeW91ciBhcHBsaWNhdGlvbnMuCi0KLU9mIGNvdXJzZSwgdGhlIG1vc3QgdmlzaWJsZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBwYWNrYWdlcyBpcwotdGhhdCB0aGUgcGFja2FnZSBuYW1lIGhhcyBiZWVuIGNoYW5nZWQgdG8gXHJlZm1vZHVsZXtlbWFpbH0uICBJbgotYWRkaXRpb24sIHRoZSB0b3AtbGV2ZWwgcGFja2FnZSBoYXMgdGhlIGZvbGxvd2luZyBkaWZmZXJlbmNlczoKLQotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSBcZnVuY3Rpb257bWVzc2FnZUZyb21TdHJpbmcoKX0gaGFzIGJlZW4gcmVuYW1lZCB0bwotICAgICAgXGZ1bmN0aW9ue21lc3NhZ2VfZnJvbV9zdHJpbmcoKX0uCi0KLVxpdGVtIFxmdW5jdGlvbnttZXNzYWdlRnJvbUZpbGUoKX0gaGFzIGJlZW4gcmVuYW1lZCB0bwotICAgICAgXGZ1bmN0aW9ue21lc3NhZ2VfZnJvbV9maWxlKCl9LgotCi1cZW5ke2l0ZW1pemV9Ci0KLVRoZSBcY2xhc3N7TWVzc2FnZX0gY2xhc3MgaGFzIHRoZSBmb2xsb3dpbmcgZGlmZmVyZW5jZXM6Ci0KLVxiZWdpbntpdGVtaXplfQotXGl0ZW0gVGhlIG1ldGhvZCBcbWV0aG9ke2FzU3RyaW5nKCl9IHdhcyByZW5hbWVkIHRvIFxtZXRob2R7YXNfc3RyaW5nKCl9LgotCi1caXRlbSBUaGUgbWV0aG9kIFxtZXRob2R7aXNtdWx0aXBhcnQoKX0gd2FzIHJlbmFtZWQgdG8KLSAgICAgIFxtZXRob2R7aXNfbXVsdGlwYXJ0KCl9LgotCi1caXRlbSBUaGUgXG1ldGhvZHtnZXRfcGF5bG9hZCgpfSBtZXRob2QgaGFzIGdyb3duIGEgXHZhcntkZWNvZGV9Ci0gICAgICBvcHRpb25hbCBhcmd1bWVudC4KLQotXGl0ZW0gVGhlIG1ldGhvZCBcbWV0aG9ke2dldGFsbCgpfSB3YXMgcmVuYW1lZCB0byBcbWV0aG9ke2dldF9hbGwoKX0uCi0KLVxpdGVtIFRoZSBtZXRob2QgXG1ldGhvZHthZGRoZWFkZXIoKX0gd2FzIHJlbmFtZWQgdG8gXG1ldGhvZHthZGRfaGVhZGVyKCl9LgotCi1caXRlbSBUaGUgbWV0aG9kIFxtZXRob2R7Z2V0dHlwZSgpfSB3YXMgcmVuYW1lZCB0byBcbWV0aG9ke2dldF90eXBlKCl9LgotCi1caXRlbSBUaGUgbWV0aG9kIFxtZXRob2R7Z2V0bWFpbnR5cGUoKX0gd2FzIHJlbmFtZWQgdG8KLSAgICAgIFxtZXRob2R7Z2V0X21haW5fdHlwZSgpfS4KLQotXGl0ZW0gVGhlIG1ldGhvZCBcbWV0aG9ke2dldHN1YnR5cGUoKX0gd2FzIHJlbmFtZWQgdG8KLSAgICAgIFxtZXRob2R7Z2V0X3N1YnR5cGUoKX0uCi0KLVxpdGVtIFRoZSBtZXRob2QgXG1ldGhvZHtnZXRwYXJhbXMoKX0gd2FzIHJlbmFtZWQgdG8KLSAgICAgIFxtZXRob2R7Z2V0X3BhcmFtcygpfS4KLSAgICAgIEFsc28sIHdoZXJlYXMgXG1ldGhvZHtnZXRwYXJhbXMoKX0gcmV0dXJuZWQgYSBsaXN0IG9mIHN0cmluZ3MsCi0gICAgICBcbWV0aG9ke2dldF9wYXJhbXMoKX0gcmV0dXJucyBhIGxpc3Qgb2YgMi10dXBsZXMsIGVmZmVjdGl2ZWx5Ci0gICAgICB0aGUga2V5L3ZhbHVlIHBhaXJzIG9mIHRoZSBwYXJhbWV0ZXJzLCBzcGxpdCBvbiB0aGUgXGNoYXJhY3Rlcns9fQotICAgICAgc2lnbi4KLQotXGl0ZW0gVGhlIG1ldGhvZCBcbWV0aG9ke2dldHBhcmFtKCl9IHdhcyByZW5hbWVkIHRvIFxtZXRob2R7Z2V0X3BhcmFtKCl9LgotCi1caXRlbSBUaGUgbWV0aG9kIFxtZXRob2R7Z2V0Y2hhcnNldHMoKX0gd2FzIHJlbmFtZWQgdG8KLSAgICAgIFxtZXRob2R7Z2V0X2NoYXJzZXRzKCl9LgotCi1caXRlbSBUaGUgbWV0aG9kIFxtZXRob2R7Z2V0ZmlsZW5hbWUoKX0gd2FzIHJlbmFtZWQgdG8KLSAgICAgIFxtZXRob2R7Z2V0X2ZpbGVuYW1lKCl9LgotCi1caXRlbSBUaGUgbWV0aG9kIFxtZXRob2R7Z2V0Ym91bmRhcnkoKX0gd2FzIHJlbmFtZWQgdG8KLSAgICAgIFxtZXRob2R7Z2V0X2JvdW5kYXJ5KCl9LgotCi1caXRlbSBUaGUgbWV0aG9kIFxtZXRob2R7c2V0Ym91bmRhcnkoKX0gd2FzIHJlbmFtZWQgdG8KLSAgICAgIFxtZXRob2R7c2V0X2JvdW5kYXJ5KCl9LgotCi1caXRlbSBUaGUgbWV0aG9kIFxtZXRob2R7Z2V0ZGVjb2RlZHBheWxvYWQoKX0gd2FzIHJlbW92ZWQuICBUbyBnZXQKLSAgICAgIHNpbWlsYXIgZnVuY3Rpb25hbGl0eSwgcGFzcyB0aGUgdmFsdWUgMSB0byB0aGUgXHZhcntkZWNvZGV9IGZsYWcKLSAgICAgIG9mIHRoZSB7Z2V0X3BheWxvYWQoKX0gbWV0aG9kLgotCi1caXRlbSBUaGUgbWV0aG9kIFxtZXRob2R7Z2V0cGF5bG9hZGFzdGV4dCgpfSB3YXMgcmVtb3ZlZC4gIFNpbWlsYXIKLSAgICAgIGZ1bmN0aW9uYWxpdHkKLSAgICAgIGlzIHN1cHBvcnRlZCBieSB0aGUgXGNsYXNze0RlY29kZWRHZW5lcmF0b3J9IGNsYXNzIGluIHRoZQotICAgICAgXHJlZm1vZHVsZXtlbWFpbC5nZW5lcmF0b3J9IG1vZHVsZS4KLQotXGl0ZW0gVGhlIG1ldGhvZCBcbWV0aG9ke2dldGJvZHlhc3RleHQoKX0gd2FzIHJlbW92ZWQuICBZb3UgY2FuIGdldAotICAgICAgc2ltaWxhciBmdW5jdGlvbmFsaXR5IGJ5IGNyZWF0aW5nIGFuIGl0ZXJhdG9yIHdpdGgKLSAgICAgIFxmdW5jdGlvbnt0eXBlZF9zdWJwYXJ0X2l0ZXJhdG9yKCl9IGluIHRoZQotICAgICAgXHJlZm1vZHVsZXtlbWFpbC5pdGVyYXRvcnN9IG1vZHVsZS4KLVxlbmR7aXRlbWl6ZX0KLQotVGhlIFxjbGFzc3tQYXJzZXJ9IGNsYXNzIGhhcyBubyBkaWZmZXJlbmNlcyBpbiBpdHMgcHVibGljIGludGVyZmFjZS4KLUl0IGRvZXMgaGF2ZSBzb21lIGFkZGl0aW9uYWwgc21hcnRzIHRvIHJlY29nbml6ZQotXG1pbWV0eXBle21lc3NhZ2UvZGVsaXZlcnktc3RhdHVzfSB0eXBlIG1lc3NhZ2VzLCB3aGljaCBpdCByZXByZXNlbnRzIGFzCi1hIFxjbGFzc3tNZXNzYWdlfSBpbnN0YW5jZSBjb250YWluaW5nIHNlcGFyYXRlIFxjbGFzc3tNZXNzYWdlfQotc3VicGFydHMgZm9yIGVhY2ggaGVhZGVyIGJsb2NrIGluIHRoZSBkZWxpdmVyeSBzdGF0dXMKLW5vdGlmaWNhdGlvblxmb290bm90ZXtEZWxpdmVyeSBTdGF0dXMgTm90aWZpY2F0aW9ucyAoRFNOKSBhcmUgZGVmaW5lZAotaW4gXHJmY3sxODk0fS59LgotCi1UaGUgXGNsYXNze0dlbmVyYXRvcn0gY2xhc3MgaGFzIG5vIGRpZmZlcmVuY2VzIGluIGl0cyBwdWJsaWMKLWludGVyZmFjZS4gIFRoZXJlIGlzIGEgbmV3IGNsYXNzIGluIHRoZSBccmVmbW9kdWxle2VtYWlsLmdlbmVyYXRvcn0KLW1vZHVsZSB0aG91Z2gsIGNhbGxlZCBcY2xhc3N7RGVjb2RlZEdlbmVyYXRvcn0gd2hpY2ggcHJvdmlkZXMgbW9zdCBvZgotdGhlIGZ1bmN0aW9uYWxpdHkgcHJldmlvdXNseSBhdmFpbGFibGUgaW4gdGhlCi1cbWV0aG9ke01lc3NhZ2UuZ2V0cGF5bG9hZGFzdGV4dCgpfSBtZXRob2QuCi0KLVRoZSBmb2xsb3dpbmcgbW9kdWxlcyBhbmQgY2xhc3NlcyBoYXZlIGJlZW4gY2hhbmdlZDoKLQotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSBUaGUgXGNsYXNze01JTUVCYXNlfSBjbGFzcyBjb25zdHJ1Y3RvciBhcmd1bWVudHMgXHZhcntfbWFqb3J9Ci0gICAgICBhbmQgXHZhcntfbWlub3J9IGhhdmUgY2hhbmdlZCB0byBcdmFye19tYWludHlwZX0gYW5kCi0gICAgICBcdmFye19zdWJ0eXBlfSByZXNwZWN0aXZlbHkuCi0KLVxpdGVtIFRoZSBcY29kZXtJbWFnZX0gY2xhc3MvbW9kdWxlIGhhcyBiZWVuIHJlbmFtZWQgdG8KLSAgICAgIFxjb2Rle01JTUVJbWFnZX0uICBUaGUgXHZhcntfbWlub3J9IGFyZ3VtZW50IGhhcyBiZWVuIHJlbmFtZWQgdG8KLSAgICAgIFx2YXJ7X3N1YnR5cGV9LgotCi1caXRlbSBUaGUgXGNvZGV7VGV4dH0gY2xhc3MvbW9kdWxlIGhhcyBiZWVuIHJlbmFtZWQgdG8KLSAgICAgIFxjb2Rle01JTUVUZXh0fS4gIFRoZSBcdmFye19taW5vcn0gYXJndW1lbnQgaGFzIGJlZW4gcmVuYW1lZCB0bwotICAgICAgXHZhcntfc3VidHlwZX0uCi0KLVxpdGVtIFRoZSBcY29kZXtNZXNzYWdlUkZDODIyfSBjbGFzcy9tb2R1bGUgaGFzIGJlZW4gcmVuYW1lZCB0bwotICAgICAgXGNvZGV7TUlNRU1lc3NhZ2V9LiAgTm90ZSB0aGF0IGFuIGVhcmxpZXIgdmVyc2lvbiBvZgotICAgICAgXG1vZHVsZXttaW1lbGlifSBjYWxsZWQgdGhpcyBjbGFzcy9tb2R1bGUgXGNvZGV7UkZDODIyfSwgYnV0Ci0gICAgICB0aGF0IGNsYXNoZWQgd2l0aCB0aGUgUHl0aG9uIHN0YW5kYXJkIGxpYnJhcnkgbW9kdWxlCi0gICAgICBccmVmbW9kdWxle3JmYzgyMn0gb24gc29tZSBjYXNlLWluc2Vuc2l0aXZlIGZpbGUgc3lzdGVtcy4KLQotICAgICAgQWxzbywgdGhlIFxjbGFzc3tNSU1FTWVzc2FnZX0gY2xhc3Mgbm93IHJlcHJlc2VudHMgYW55IGtpbmQgb2YKLSAgICAgIE1JTUUgbWVzc2FnZSB3aXRoIG1haW4gdHlwZSBcbWltZXR5cGV7bWVzc2FnZX0uICBJdCB0YWtlcyBhbgotICAgICAgb3B0aW9uYWwgYXJndW1lbnQgXHZhcntfc3VidHlwZX0gd2hpY2ggaXMgdXNlZCB0byBzZXQgdGhlIE1JTUUKLSAgICAgIHN1YnR5cGUuICBcdmFye19zdWJ0eXBlfSBkZWZhdWx0cyB0byBcbWltZXR5cGV7cmZjODIyfS4KLVxlbmR7aXRlbWl6ZX0KLQotXG1vZHVsZXttaW1lbGlifSBwcm92aWRlZCBzb21lIHV0aWxpdHkgZnVuY3Rpb25zIGluIGl0cwotXG1vZHVsZXthZGRyZXNzfSBhbmQgXG1vZHVsZXtkYXRlfSBtb2R1bGVzLiAgQWxsIG9mIHRoZXNlIGZ1bmN0aW9ucwotaGF2ZSBiZWVuIG1vdmVkIHRvIHRoZSBccmVmbW9kdWxle2VtYWlsLnV0aWxzfSBtb2R1bGUuCi0KLVRoZSBcY29kZXtNc2dSZWFkZXJ9IGNsYXNzL21vZHVsZSBoYXMgYmVlbiByZW1vdmVkLiAgSXRzIGZ1bmN0aW9uYWxpdHkKLWlzIG1vc3QgY2xvc2VseSBzdXBwb3J0ZWQgaW4gdGhlIFxmdW5jdGlvbntib2R5X2xpbmVfaXRlcmF0b3IoKX0KLWZ1bmN0aW9uIGluIHRoZSBccmVmbW9kdWxle2VtYWlsLml0ZXJhdG9yc30gbW9kdWxlLgotCi1cc3Vic2VjdGlvbntFeGFtcGxlc30KLQotSGVyZSBhcmUgYSBmZXcgZXhhbXBsZXMgb2YgaG93IHRvIHVzZSB0aGUgXG1vZHVsZXtlbWFpbH0gcGFja2FnZSB0bwotcmVhZCwgd3JpdGUsIGFuZCBzZW5kIHNpbXBsZSBlbWFpbCBtZXNzYWdlcywgYXMgd2VsbCBhcyBtb3JlIGNvbXBsZXgKLU1JTUUgbWVzc2FnZXMuCi0KLUZpcnN0LCBsZXQncyBzZWUgaG93IHRvIGNyZWF0ZSBhbmQgc2VuZCBhIHNpbXBsZSB0ZXh0IG1lc3NhZ2U6Ci0KLVx2ZXJiYXRpbWlucHV0e2VtYWlsLXNpbXBsZS5weX0KLQotSGVyZSdzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHNlbmQgYSBNSU1FIG1lc3NhZ2UgY29udGFpbmluZyBhIGJ1bmNoIG9mCi1mYW1pbHkgcGljdHVyZXMgdGhhdCBtYXkgYmUgcmVzaWRpbmcgaW4gYSBkaXJlY3Rvcnk6Ci0KLVx2ZXJiYXRpbWlucHV0e2VtYWlsLW1pbWUucHl9Ci0KLUhlcmUncyBhbiBleGFtcGxlIG9mIGhvdyB0byBzZW5kIHRoZSBlbnRpcmUgY29udGVudHMgb2YgYSBkaXJlY3RvcnkgYXMKLWFuIGVtYWlsIG1lc3NhZ2U6Ci1cZm9vdG5vdGV7VGhhbmtzIHRvIE1hdHRoZXcgRGl4b24gQ293bGVzIGZvciB0aGUgb3JpZ2luYWwgaW5zcGlyYXRpb24KLSAgICAgICAgICBhbmQgZXhhbXBsZXMufQotCi1cdmVyYmF0aW1pbnB1dHtlbWFpbC1kaXIucHl9Ci0KLUFuZCBmaW5hbGx5LCBoZXJlJ3MgYW4gZXhhbXBsZSBvZiBob3cgdG8gdW5wYWNrIGEgTUlNRSBtZXNzYWdlIGxpa2UKLXRoZSBvbmUgYWJvdmUsIGludG8gYSBkaXJlY3Rvcnkgb2YgZmlsZXM6Ci0KLVx2ZXJiYXRpbWlucHV0e2VtYWlsLXVucGFjay5weX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvZW1haWxjaGFyc2V0cy50ZXggYi9Eb2MvbGliL2VtYWlsY2hhcnNldHMudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGJlNjhhLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvZW1haWxjaGFyc2V0cy50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2VtYWlsLmNoYXJzZXR9Ci1cbW9kdWxlc3lub3BzaXN7Q2hhcmFjdGVyIFNldHN9Ci0KLVRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgY2xhc3MgXGNsYXNze0NoYXJzZXR9IGZvciByZXByZXNlbnRpbmcKLWNoYXJhY3RlciBzZXRzIGFuZCBjaGFyYWN0ZXIgc2V0IGNvbnZlcnNpb25zIGluIGVtYWlsIG1lc3NhZ2VzLCBhcwotd2VsbCBhcyBhIGNoYXJhY3RlciBzZXQgcmVnaXN0cnkgYW5kIHNldmVyYWwgY29udmVuaWVuY2UgbWV0aG9kcyBmb3IKLW1hbmlwdWxhdGluZyB0aGlzIHJlZ2lzdHJ5LiAgSW5zdGFuY2VzIG9mIFxjbGFzc3tDaGFyc2V0fSBhcmUgdXNlZCBpbgotc2V2ZXJhbCBvdGhlciBtb2R1bGVzIHdpdGhpbiB0aGUgXG1vZHVsZXtlbWFpbH0gcGFja2FnZS4KLQotSW1wb3J0IHRoaXMgY2xhc3MgZnJvbSB0aGUgXG1vZHVsZXtlbWFpbC5jaGFyc2V0fSBtb2R1bGUuCi0KLVx2ZXJzaW9uYWRkZWR7Mi4yLjJ9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0NoYXJzZXR9e1xvcHRpb25hbHtpbnB1dF9jaGFyc2V0fX0KLU1hcCBjaGFyYWN0ZXIgc2V0cyB0byB0aGVpciBlbWFpbCBwcm9wZXJ0aWVzLgotCi1UaGlzIGNsYXNzIHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXF1aXJlbWVudHMgaW1wb3NlZCBvbgotZW1haWwgZm9yIGEgc3BlY2lmaWMgY2hhcmFjdGVyIHNldC4gIEl0IGFsc28gcHJvdmlkZXMgY29udmVuaWVuY2UKLXJvdXRpbmVzIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gY2hhcmFjdGVyIHNldHMsIGdpdmVuIHRoZSBhdmFpbGFiaWxpdHkKLW9mIHRoZSBhcHBsaWNhYmxlIGNvZGVjcy4gIEdpdmVuIGEgY2hhcmFjdGVyIHNldCwgaXQgd2lsbCBkbyBpdHMgYmVzdAotdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gdXNlIHRoYXQgY2hhcmFjdGVyIHNldCBpbiBhbiBlbWFpbAotbWVzc2FnZSBpbiBhbiBSRkMtY29tcGxpYW50IHdheS4KLQotQ2VydGFpbiBjaGFyYWN0ZXIgc2V0cyBtdXN0IGJlIGVuY29kZWQgd2l0aCBxdW90ZWQtcHJpbnRhYmxlIG9yIGJhc2U2NAotd2hlbiB1c2VkIGluIGVtYWlsIGhlYWRlcnMgb3IgYm9kaWVzLiAgQ2VydGFpbiBjaGFyYWN0ZXIgc2V0cyBtdXN0IGJlCi1jb252ZXJ0ZWQgb3V0cmlnaHQsIGFuZCBhcmUgbm90IGFsbG93ZWQgaW4gZW1haWwuCi0KLU9wdGlvbmFsIFx2YXJ7aW5wdXRfY2hhcnNldH0gaXMgYXMgZGVzY3JpYmVkIGJlbG93OyBpdCBpcyBhbHdheXMKLWNvZXJjZWQgdG8gbG93ZXIgY2FzZS4gIEFmdGVyIGJlaW5nIGFsaWFzIG5vcm1hbGl6ZWQgaXQgaXMgYWxzbyB1c2VkCi1hcyBhIGxvb2t1cCBpbnRvIHRoZSByZWdpc3RyeSBvZiBjaGFyYWN0ZXIgc2V0cyB0byBmaW5kIG91dCB0aGUgaGVhZGVyCi1lbmNvZGluZywgYm9keSBlbmNvZGluZywgYW5kIG91dHB1dCBjb252ZXJzaW9uIGNvZGVjIHRvIGJlIHVzZWQgZm9yCi10aGUgY2hhcmFjdGVyIHNldC4gIEZvciBleGFtcGxlLCBpZgotXHZhcntpbnB1dF9jaGFyc2V0fSBpcyBcY29kZXtpc28tODg1OS0xfSwgdGhlbiBoZWFkZXJzIGFuZCBib2RpZXMgd2lsbAotYmUgZW5jb2RlZCB1c2luZyBxdW90ZWQtcHJpbnRhYmxlIGFuZCBubyBvdXRwdXQgY29udmVyc2lvbiBjb2RlYyBpcwotbmVjZXNzYXJ5LiAgSWYgXHZhcntpbnB1dF9jaGFyc2V0fSBpcyBcY29kZXtldWMtanB9LCB0aGVuIGhlYWRlcnMgd2lsbAotYmUgZW5jb2RlZCB3aXRoIGJhc2U2NCwgYm9kaWVzIHdpbGwgbm90IGJlIGVuY29kZWQsIGJ1dCBvdXRwdXQgdGV4dAotd2lsbCBiZSBjb252ZXJ0ZWQgZnJvbSB0aGUgXGNvZGV7ZXVjLWpwfSBjaGFyYWN0ZXIgc2V0IHRvIHRoZQotXGNvZGV7aXNvLTIwMjItanB9IGNoYXJhY3RlciBzZXQuCi1cZW5ke2NsYXNzZGVzY30KLQotXGNsYXNze0NoYXJzZXR9IGluc3RhbmNlcyBoYXZlIHRoZSBmb2xsb3dpbmcgZGF0YSBhdHRyaWJ1dGVzOgotCi1cYmVnaW57ZGF0YWRlc2N9e2lucHV0X2NoYXJzZXR9Ci1UaGUgaW5pdGlhbCBjaGFyYWN0ZXIgc2V0IHNwZWNpZmllZC4gIENvbW1vbiBhbGlhc2VzIGFyZSBjb252ZXJ0ZWQgdG8KLXRoZWlyIFxlbXBoe29mZmljaWFsfSBlbWFpbCBuYW1lcyAoZS5nLiBcY29kZXtsYXRpbl8xfSBpcyBjb252ZXJ0ZWQgdG8KLVxjb2Rle2lzby04ODU5LTF9KS4gIERlZmF1bHRzIHRvIDctYml0IFxjb2Rle3VzLWFzY2lpfS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317aGVhZGVyX2VuY29kaW5nfQotSWYgdGhlIGNoYXJhY3RlciBzZXQgbXVzdCBiZSBlbmNvZGVkIGJlZm9yZSBpdCBjYW4gYmUgdXNlZCBpbiBhbgotZW1haWwgaGVhZGVyLCB0aGlzIGF0dHJpYnV0ZSB3aWxsIGJlIHNldCB0byBcY29kZXtDaGFyc2V0LlFQfSAoZm9yCi1xdW90ZWQtcHJpbnRhYmxlKSwgXGNvZGV7Q2hhcnNldC5CQVNFNjR9IChmb3IgYmFzZTY0IGVuY29kaW5nKSwgb3IKLVxjb2Rle0NoYXJzZXQuU0hPUlRFU1R9IGZvciB0aGUgc2hvcnRlc3Qgb2YgUVAgb3IgQkFTRTY0IGVuY29kaW5nLgotT3RoZXJ3aXNlLCBpdCB3aWxsIGJlIFxjb2Rle05vbmV9LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtib2R5X2VuY29kaW5nfQotU2FtZSBhcyBcdmFye2hlYWRlcl9lbmNvZGluZ30sIGJ1dCBkZXNjcmliZXMgdGhlIGVuY29kaW5nIGZvciB0aGUKLW1haWwgbWVzc2FnZSdzIGJvZHksIHdoaWNoIGluZGVlZCBtYXkgYmUgZGlmZmVyZW50IHRoYW4gdGhlIGhlYWRlcgotZW5jb2RpbmcuICBcY29kZXtDaGFyc2V0LlNIT1JURVNUfSBpcyBub3QgYWxsb3dlZCBmb3IKLVx2YXJ7Ym9keV9lbmNvZGluZ30uCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e291dHB1dF9jaGFyc2V0fQotU29tZSBjaGFyYWN0ZXIgc2V0cyBtdXN0IGJlIGNvbnZlcnRlZCBiZWZvcmUgdGhleSBjYW4gYmUgdXNlZCBpbgotZW1haWwgaGVhZGVycyBvciBib2RpZXMuICBJZiB0aGUgXHZhcntpbnB1dF9jaGFyc2V0fSBpcyBvbmUgb2YKLXRoZW0sIHRoaXMgYXR0cmlidXRlIHdpbGwgY29udGFpbiB0aGUgbmFtZSBvZiB0aGUgY2hhcmFjdGVyIHNldAotb3V0cHV0IHdpbGwgYmUgY29udmVydGVkIHRvLiAgT3RoZXJ3aXNlLCBpdCB3aWxsIGJlIFxjb2Rle05vbmV9LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtpbnB1dF9jb2RlY30KLVRoZSBuYW1lIG9mIHRoZSBQeXRob24gY29kZWMgdXNlZCB0byBjb252ZXJ0IHRoZSBcdmFye2lucHV0X2NoYXJzZXR9IHRvCi1Vbmljb2RlLiAgSWYgbm8gY29udmVyc2lvbiBjb2RlYyBpcyBuZWNlc3NhcnksIHRoaXMgYXR0cmlidXRlIHdpbGwgYmUKLVxjb2Rle05vbmV9LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtvdXRwdXRfY29kZWN9Ci1UaGUgbmFtZSBvZiB0aGUgUHl0aG9uIGNvZGVjIHVzZWQgdG8gY29udmVydCBVbmljb2RlIHRvIHRoZQotXHZhcntvdXRwdXRfY2hhcnNldH0uICBJZiBubyBjb252ZXJzaW9uIGNvZGVjIGlzIG5lY2Vzc2FyeSwgdGhpcwotYXR0cmlidXRlIHdpbGwgaGF2ZSB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgXHZhcntpbnB1dF9jb2RlY30uCi1cZW5ke2RhdGFkZXNjfQotCi1cY2xhc3N7Q2hhcnNldH0gaW5zdGFuY2VzIGFsc28gaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDaGFyc2V0XXtnZXRfYm9keV9lbmNvZGluZ317fQotUmV0dXJuIHRoZSBjb250ZW50IHRyYW5zZmVyIGVuY29kaW5nIHVzZWQgZm9yIGJvZHkgZW5jb2RpbmcuCi0KLVRoaXMgaXMgZWl0aGVyIHRoZSBzdHJpbmcgXHNhbXB7cXVvdGVkLXByaW50YWJsZX0gb3IgXHNhbXB7YmFzZTY0fQotZGVwZW5kaW5nIG9uIHRoZSBlbmNvZGluZyB1c2VkLCBvciBpdCBpcyBhIGZ1bmN0aW9uLCBpbiB3aGljaCBjYXNlIHlvdQotc2hvdWxkIGNhbGwgdGhlIGZ1bmN0aW9uIHdpdGggYSBzaW5nbGUgYXJndW1lbnQsIHRoZSBNZXNzYWdlIG9iamVjdAotYmVpbmcgZW5jb2RlZC4gIFRoZSBmdW5jdGlvbiBzaG91bGQgdGhlbiBzZXQgdGhlCi1cbWFpbGhlYWRlcntDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nfSBoZWFkZXIgaXRzZWxmIHRvIHdoYXRldmVyIGlzCi1hcHByb3ByaWF0ZS4KLQotUmV0dXJucyB0aGUgc3RyaW5nIFxzYW1we3F1b3RlZC1wcmludGFibGV9IGlmCi1cdmFye2JvZHlfZW5jb2Rpbmd9IGlzIFxjb2Rle1FQfSwgcmV0dXJucyB0aGUgc3RyaW5nCi1cc2FtcHtiYXNlNjR9IGlmIFx2YXJ7Ym9keV9lbmNvZGluZ30gaXMgXGNvZGV7QkFTRTY0fSwgYW5kIHJldHVybnMgdGhlCi1zdHJpbmcgXHNhbXB7N2JpdH0gb3RoZXJ3aXNlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Y29udmVydH17c30KLUNvbnZlcnQgdGhlIHN0cmluZyBcdmFye3N9IGZyb20gdGhlIFx2YXJ7aW5wdXRfY29kZWN9IHRvIHRoZQotXHZhcntvdXRwdXRfY29kZWN9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317dG9fc3BsaXR0YWJsZX17c30KLUNvbnZlcnQgYSBwb3NzaWJseSBtdWx0aWJ5dGUgc3RyaW5nIHRvIGEgc2FmZWx5IHNwbGl0dGFibGUgZm9ybWF0LgotXHZhcntzfSBpcyB0aGUgc3RyaW5nIHRvIHNwbGl0LgotCi1Vc2VzIHRoZSBcdmFye2lucHV0X2NvZGVjfSB0byB0cnkgYW5kIGNvbnZlcnQgdGhlIHN0cmluZyB0byBVbmljb2RlLAotc28gaXQgY2FuIGJlIHNhZmVseSBzcGxpdCBvbiBjaGFyYWN0ZXIgYm91bmRhcmllcyAoZXZlbiBmb3IgbXVsdGlieXRlCi1jaGFyYWN0ZXJzKS4KLQotUmV0dXJucyB0aGUgc3RyaW5nIGFzLWlzIGlmIGl0IGlzbid0IGtub3duIGhvdyB0byBjb252ZXJ0IFx2YXJ7c30gdG8KLVVuaWNvZGUgd2l0aCB0aGUgXHZhcntpbnB1dF9jaGFyc2V0fS4KLQotQ2hhcmFjdGVycyB0aGF0IGNvdWxkIG5vdCBiZSBjb252ZXJ0ZWQgdG8gVW5pY29kZSB3aWxsIGJlIHJlcGxhY2VkCi13aXRoIHRoZSBVbmljb2RlIHJlcGxhY2VtZW50IGNoYXJhY3RlciBcY2hhcmFjdGVye1UrRkZGRH0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtmcm9tX3NwbGl0dGFibGV9e3VzdHJcb3B0aW9uYWx7LCB0b19vdXRwdXR9fQotQ29udmVydCBhIHNwbGl0dGFibGUgc3RyaW5nIGJhY2sgaW50byBhbiBlbmNvZGVkIHN0cmluZy4gIFx2YXJ7dXN0cn0KLWlzIGEgVW5pY29kZSBzdHJpbmcgdG8gYGB1bnNwbGl0JycuCi0KLVRoaXMgbWV0aG9kIHVzZXMgdGhlIHByb3BlciBjb2RlYyB0byB0cnkgYW5kIGNvbnZlcnQgdGhlIHN0cmluZyBmcm9tCi1Vbmljb2RlIGJhY2sgaW50byBhbiBlbmNvZGVkIGZvcm1hdC4gIFJldHVybiB0aGUgc3RyaW5nIGFzLWlzIGlmIGl0IGlzCi1ub3QgVW5pY29kZSwgb3IgaWYgaXQgY291bGQgbm90IGJlIGNvbnZlcnRlZCBmcm9tIFVuaWNvZGUuCi0KLUNoYXJhY3RlcnMgdGhhdCBjb3VsZCBub3QgYmUgY29udmVydGVkIGZyb20gVW5pY29kZSB3aWxsIGJlIHJlcGxhY2VkCi13aXRoIGFuIGFwcHJvcHJpYXRlIGNoYXJhY3RlciAodXN1YWxseSBcY2hhcmFjdGVyez99KS4KLQotSWYgXHZhcnt0b19vdXRwdXR9IGlzIFxjb2Rle1RydWV9ICh0aGUgZGVmYXVsdCksIHVzZXMKLVx2YXJ7b3V0cHV0X2NvZGVjfSB0byBjb252ZXJ0IHRvIGFuIAotZW5jb2RlZCBmb3JtYXQuICBJZiBcdmFye3RvX291dHB1dH0gaXMgXGNvZGV7RmFsc2V9LCBpdCB1c2VzCi1cdmFye2lucHV0X2NvZGVjfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2dldF9vdXRwdXRfY2hhcnNldH17fQotUmV0dXJuIHRoZSBvdXRwdXQgY2hhcmFjdGVyIHNldC4KLQotVGhpcyBpcyB0aGUgXHZhcntvdXRwdXRfY2hhcnNldH0gYXR0cmlidXRlIGlmIHRoYXQgaXMgbm90IFxjb2Rle05vbmV9LAotb3RoZXJ3aXNlIGl0IGlzIFx2YXJ7aW5wdXRfY2hhcnNldH0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtlbmNvZGVkX2hlYWRlcl9sZW59e30KLVJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBlbmNvZGVkIGhlYWRlciBzdHJpbmcsIHByb3Blcmx5IGNhbGN1bGF0aW5nCi1mb3IgcXVvdGVkLXByaW50YWJsZSBvciBiYXNlNjQgZW5jb2RpbmcuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtoZWFkZXJfZW5jb2RlfXtzXG9wdGlvbmFseywgY29udmVydH19Ci1IZWFkZXItZW5jb2RlIHRoZSBzdHJpbmcgXHZhcntzfS4KLQotSWYgXHZhcntjb252ZXJ0fSBpcyBcY29kZXtUcnVlfSwgdGhlIHN0cmluZyB3aWxsIGJlIGNvbnZlcnRlZCBmcm9tIHRoZQotaW5wdXQgY2hhcnNldCB0byB0aGUgb3V0cHV0IGNoYXJzZXQgYXV0b21hdGljYWxseS4gIFRoaXMgaXMgbm90IHVzZWZ1bAotZm9yIG11bHRpYnl0ZSBjaGFyYWN0ZXIgc2V0cywgd2hpY2ggaGF2ZSBsaW5lIGxlbmd0aCBpc3N1ZXMgKG11bHRpYnl0ZQotY2hhcmFjdGVycyBtdXN0IGJlIHNwbGl0IG9uIGEgY2hhcmFjdGVyLCBub3QgYSBieXRlIGJvdW5kYXJ5KTsgdXNlIHRoZQotaGlnaGVyLWxldmVsIFxjbGFzc3tIZWFkZXJ9IGNsYXNzIHRvIGRlYWwgd2l0aCB0aGVzZSBpc3N1ZXMgKHNlZQotXHJlZm1vZHVsZXtlbWFpbC5oZWFkZXJ9KS4gIFx2YXJ7Y29udmVydH0gZGVmYXVsdHMgdG8gXGNvZGV7RmFsc2V9LgotCi1UaGUgdHlwZSBvZiBlbmNvZGluZyAoYmFzZTY0IG9yIHF1b3RlZC1wcmludGFibGUpIHdpbGwgYmUgYmFzZWQgb24KLXRoZSBcdmFye2hlYWRlcl9lbmNvZGluZ30gYXR0cmlidXRlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Ym9keV9lbmNvZGV9e3Ncb3B0aW9uYWx7LCBjb252ZXJ0fX0KLUJvZHktZW5jb2RlIHRoZSBzdHJpbmcgXHZhcntzfS4KLQotSWYgXHZhcntjb252ZXJ0fSBpcyBcY29kZXtUcnVlfSAodGhlIGRlZmF1bHQpLCB0aGUgc3RyaW5nIHdpbGwgYmUKLWNvbnZlcnRlZCBmcm9tIHRoZSBpbnB1dCBjaGFyc2V0IHRvIG91dHB1dCBjaGFyc2V0IGF1dG9tYXRpY2FsbHkuCi1Vbmxpa2UgXG1ldGhvZHtoZWFkZXJfZW5jb2RlKCl9LCB0aGVyZSBhcmUgbm8gaXNzdWVzIHdpdGggYnl0ZQotYm91bmRhcmllcyBhbmQgbXVsdGlieXRlIGNoYXJzZXRzIGluIGVtYWlsIGJvZGllcywgc28gdGhpcyBpcyB1c3VhbGx5Ci1wcmV0dHkgc2FmZS4KLQotVGhlIHR5cGUgb2YgZW5jb2RpbmcgKGJhc2U2NCBvciBxdW90ZWQtcHJpbnRhYmxlKSB3aWxsIGJlIGJhc2VkIG9uCi10aGUgXHZhcntib2R5X2VuY29kaW5nfSBhdHRyaWJ1dGUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVRoZSBcY2xhc3N7Q2hhcnNldH0gY2xhc3MgYWxzbyBwcm92aWRlcyBhIG51bWJlciBvZiBtZXRob2RzIHRvIHN1cHBvcnQKLXN0YW5kYXJkIG9wZXJhdGlvbnMgYW5kIGJ1aWx0LWluIGZ1bmN0aW9ucy4KLQotXGJlZ2lue21ldGhvZGRlc2N9W0NoYXJzZXRde19fc3RyX199e30KLVJldHVybnMgXHZhcntpbnB1dF9jaGFyc2V0fSBhcyBhIHN0cmluZyBjb2VyY2VkIHRvIGxvd2VyIGNhc2UuCi1cbWV0aG9ke19fcmVwcl9fKCl9IGlzIGFuIGFsaWFzIGZvciBcbWV0aG9ke19fc3RyX18oKX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDaGFyc2V0XXtfX2VxX199e290aGVyfQotVGhpcyBtZXRob2QgYWxsb3dzIHlvdSB0byBjb21wYXJlIHR3byBcY2xhc3N7Q2hhcnNldH0gaW5zdGFuY2VzIGZvciBlcXVhbGl0eS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0hlYWRlcl17X19uZV9ffXtvdGhlcn0KLVRoaXMgbWV0aG9kIGFsbG93cyB5b3UgdG8gY29tcGFyZSB0d28gXGNsYXNze0NoYXJzZXR9IGluc3RhbmNlcyBmb3IgaW5lcXVhbGl0eS4KLVxlbmR7bWV0aG9kZGVzY30KLQotVGhlIFxtb2R1bGV7ZW1haWwuY2hhcnNldH0gbW9kdWxlIGFsc28gcHJvdmlkZXMgdGhlIGZvbGxvd2luZwotZnVuY3Rpb25zIGZvciBhZGRpbmcgbmV3IGVudHJpZXMgdG8gdGhlIGdsb2JhbCBjaGFyYWN0ZXIgc2V0LCBhbGlhcywKLWFuZCBjb2RlYyByZWdpc3RyaWVzOgotCi1cYmVnaW57ZnVuY2Rlc2N9e2FkZF9jaGFyc2V0fXtjaGFyc2V0XG9wdGlvbmFseywgaGVhZGVyX2VuY1xvcHRpb25hbHssCi0gICAgYm9keV9lbmNcb3B0aW9uYWx7LCBvdXRwdXRfY2hhcnNldH19fX0KLUFkZCBjaGFyYWN0ZXIgcHJvcGVydGllcyB0byB0aGUgZ2xvYmFsIHJlZ2lzdHJ5LgotCi1cdmFye2NoYXJzZXR9IGlzIHRoZSBpbnB1dCBjaGFyYWN0ZXIgc2V0LCBhbmQgbXVzdCBiZSB0aGUgY2Fub25pY2FsCi1uYW1lIG9mIGEgY2hhcmFjdGVyIHNldC4KLQotT3B0aW9uYWwgXHZhcntoZWFkZXJfZW5jfSBhbmQgXHZhcntib2R5X2VuY30gaXMgZWl0aGVyCi1cY29kZXtDaGFyc2V0LlFQfSBmb3IgcXVvdGVkLXByaW50YWJsZSwgXGNvZGV7Q2hhcnNldC5CQVNFNjR9IGZvcgotYmFzZTY0IGVuY29kaW5nLCBcY29kZXtDaGFyc2V0LlNIT1JURVNUfSBmb3IgdGhlIHNob3J0ZXN0IG9mCi1xdW90ZWQtcHJpbnRhYmxlIG9yIGJhc2U2NCBlbmNvZGluZywgb3IgXGNvZGV7Tm9uZX0gZm9yIG5vIGVuY29kaW5nLgotXGNvZGV7U0hPUlRFU1R9IGlzIG9ubHkgdmFsaWQgZm9yIFx2YXJ7aGVhZGVyX2VuY30uIFRoZSBkZWZhdWx0IGlzCi1cY29kZXtOb25lfSBmb3Igbm8gZW5jb2RpbmcuCi0KLU9wdGlvbmFsIFx2YXJ7b3V0cHV0X2NoYXJzZXR9IGlzIHRoZSBjaGFyYWN0ZXIgc2V0IHRoYXQgdGhlIG91dHB1dAotc2hvdWxkIGJlIGluLiAgQ29udmVyc2lvbnMgd2lsbCBwcm9jZWVkIGZyb20gaW5wdXQgY2hhcnNldCwgdG8KLVVuaWNvZGUsIHRvIHRoZSBvdXRwdXQgY2hhcnNldCB3aGVuIHRoZSBtZXRob2QKLVxtZXRob2R7Q2hhcnNldC5jb252ZXJ0KCl9IGlzIGNhbGxlZC4gIFRoZSBkZWZhdWx0IGlzIHRvIG91dHB1dCBpbiB0aGUKLXNhbWUgY2hhcmFjdGVyIHNldCBhcyB0aGUgaW5wdXQuCi0KLUJvdGggXHZhcntpbnB1dF9jaGFyc2V0fSBhbmQgXHZhcntvdXRwdXRfY2hhcnNldH0gbXVzdCBoYXZlIFVuaWNvZGUKLWNvZGVjIGVudHJpZXMgaW4gdGhlIG1vZHVsZSdzIGNoYXJhY3RlciBzZXQtdG8tY29kZWMgbWFwcGluZzsgdXNlCi1cZnVuY3Rpb257YWRkX2NvZGVjKCl9IHRvIGFkZCBjb2RlY3MgdGhlIG1vZHVsZSBkb2VzCi1ub3Qga25vdyBhYm91dC4gIFNlZSB0aGUgXHJlZm1vZHVsZXtjb2RlY3N9IG1vZHVsZSdzIGRvY3VtZW50YXRpb24gZm9yCi1tb3JlIGluZm9ybWF0aW9uLgotCi1UaGUgZ2xvYmFsIGNoYXJhY3RlciBzZXQgcmVnaXN0cnkgaXMga2VwdCBpbiB0aGUgbW9kdWxlIGdsb2JhbAotZGljdGlvbmFyeSBcY29kZXtDSEFSU0VUU30uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2FkZF9hbGlhc317YWxpYXMsIGNhbm9uaWNhbH0KLUFkZCBhIGNoYXJhY3RlciBzZXQgYWxpYXMuICBcdmFye2FsaWFzfSBpcyB0aGUgYWxpYXMgbmFtZSwKLWUuZy4gXGNvZGV7bGF0aW4tMX0uICBcdmFye2Nhbm9uaWNhbH0gaXMgdGhlIGNoYXJhY3RlciBzZXQncyBjYW5vbmljYWwKLW5hbWUsIGUuZy4gXGNvZGV7aXNvLTg4NTktMX0uCi0KLVRoZSBnbG9iYWwgY2hhcnNldCBhbGlhcyByZWdpc3RyeSBpcyBrZXB0IGluIHRoZSBtb2R1bGUgZ2xvYmFsCi1kaWN0aW9uYXJ5IFxjb2Rle0FMSUFTRVN9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXthZGRfY29kZWN9e2NoYXJzZXQsIGNvZGVjbmFtZX0KLUFkZCBhIGNvZGVjIHRoYXQgbWFwIGNoYXJhY3RlcnMgaW4gdGhlIGdpdmVuIGNoYXJhY3RlciBzZXQgdG8gYW5kIGZyb20KLVVuaWNvZGUuCi0KLVx2YXJ7Y2hhcnNldH0gaXMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIGEgY2hhcmFjdGVyIHNldC4KLVx2YXJ7Y29kZWNuYW1lfSBpcyB0aGUgbmFtZSBvZiBhIFB5dGhvbiBjb2RlYywgYXMgYXBwcm9wcmlhdGUgZm9yIHRoZQotc2Vjb25kIGFyZ3VtZW50IHRvIHRoZSBcZnVuY3Rpb257dW5pY29kZSgpfSBidWlsdC1pbiwgb3IgdG8gdGhlCi1cbWV0aG9ke2VuY29kZSgpfSBtZXRob2Qgb2YgYSBVbmljb2RlIHN0cmluZy4KLVxlbmR7ZnVuY2Rlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2VtYWlsZW5jb2RlcnMudGV4IGIvRG9jL2xpYi9lbWFpbGVuY29kZXJzLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QwNWMyYS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2VtYWlsZW5jb2RlcnMudGV4CisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2VtYWlsLmVuY29kZXJzfQotXG1vZHVsZXN5bm9wc2lze0VuY29kZXJzIGZvciBlbWFpbCBtZXNzYWdlIHBheWxvYWRzLn0KLQotV2hlbiBjcmVhdGluZyBcY2xhc3N7TWVzc2FnZX0gb2JqZWN0cyBmcm9tIHNjcmF0Y2gsIHlvdSBvZnRlbiBuZWVkIHRvCi1lbmNvZGUgdGhlIHBheWxvYWRzIGZvciB0cmFuc3BvcnQgdGhyb3VnaCBjb21wbGlhbnQgbWFpbCBzZXJ2ZXJzLgotVGhpcyBpcyBlc3BlY2lhbGx5IHRydWUgZm9yIFxtaW1ldHlwZXtpbWFnZS8qfSBhbmQgXG1pbWV0eXBle3RleHQvKn0KLXR5cGUgbWVzc2FnZXMgY29udGFpbmluZyBiaW5hcnkgZGF0YS4KLQotVGhlIFxtb2R1bGV7ZW1haWx9IHBhY2thZ2UgcHJvdmlkZXMgc29tZSBjb252ZW5pZW50IGVuY29kaW5ncyBpbiBpdHMKLVxtb2R1bGV7ZW5jb2RlcnN9IG1vZHVsZS4gIFRoZXNlIGVuY29kZXJzIGFyZSBhY3R1YWxseSB1c2VkIGJ5IHRoZQotXGNsYXNze01JTUVBdWRpb30gYW5kIFxjbGFzc3tNSU1FSW1hZ2V9IGNsYXNzIGNvbnN0cnVjdG9ycyB0byBwcm92aWRlIGRlZmF1bHQKLWVuY29kaW5ncy4gIEFsbCBlbmNvZGVyIGZ1bmN0aW9ucyB0YWtlIGV4YWN0bHkgb25lIGFyZ3VtZW50LCB0aGUgbWVzc2FnZQotb2JqZWN0IHRvIGVuY29kZS4gIFRoZXkgdXN1YWxseSBleHRyYWN0IHRoZSBwYXlsb2FkLCBlbmNvZGUgaXQsIGFuZCByZXNldCB0aGUKLXBheWxvYWQgdG8gdGhpcyBuZXdseSBlbmNvZGVkIHZhbHVlLiAgVGhleSBzaG91bGQgYWxzbyBzZXQgdGhlCi1cbWFpbGhlYWRlcntDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nfSBoZWFkZXIgYXMgYXBwcm9wcmlhdGUuCi0KLUhlcmUgYXJlIHRoZSBlbmNvZGluZyBmdW5jdGlvbnMgcHJvdmlkZWQ6Ci0KLVxiZWdpbntmdW5jZGVzY317ZW5jb2RlX3F1b3ByaX17bXNnfQotRW5jb2RlcyB0aGUgcGF5bG9hZCBpbnRvIHF1b3RlZC1wcmludGFibGUgZm9ybSBhbmQgc2V0cyB0aGUKLVxtYWlsaGVhZGVye0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmd9IGhlYWRlciB0bwotXGNvZGV7cXVvdGVkLXByaW50YWJsZX1cZm9vdG5vdGV7Tm90ZSB0aGF0IGVuY29kaW5nIHdpdGgKLVxtZXRob2R7ZW5jb2RlX3F1b3ByaSgpfSBhbHNvIGVuY29kZXMgYWxsIHRhYnMgYW5kIHNwYWNlIGNoYXJhY3RlcnMgaW4KLXRoZSBkYXRhLn0uCi1UaGlzIGlzIGEgZ29vZCBlbmNvZGluZyB0byB1c2Ugd2hlbiBtb3N0IG9mIHlvdXIgcGF5bG9hZCBpcyBub3JtYWwKLXByaW50YWJsZSBkYXRhLCBidXQgY29udGFpbnMgYSBmZXcgdW5wcmludGFibGUgY2hhcmFjdGVycy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZW5jb2RlX2Jhc2U2NH17bXNnfQotRW5jb2RlcyB0aGUgcGF5bG9hZCBpbnRvIGJhc2U2NCBmb3JtIGFuZCBzZXRzIHRoZQotXG1haWxoZWFkZXJ7Q29udGVudC1UcmFuc2Zlci1FbmNvZGluZ30gaGVhZGVyIHRvCi1cY29kZXtiYXNlNjR9LiAgVGhpcyBpcyBhIGdvb2QgZW5jb2RpbmcgdG8gdXNlIHdoZW4gbW9zdCBvZiB5b3VyIHBheWxvYWQKLWlzIHVucHJpbnRhYmxlIGRhdGEgc2luY2UgaXQgaXMgYSBtb3JlIGNvbXBhY3QgZm9ybSB0aGFuCi1xdW90ZWQtcHJpbnRhYmxlLiAgVGhlIGRyYXdiYWNrIG9mIGJhc2U2NCBlbmNvZGluZyBpcyB0aGF0IGl0Ci1yZW5kZXJzIHRoZSB0ZXh0IG5vbi1odW1hbiByZWFkYWJsZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZW5jb2RlXzdvcjhiaXR9e21zZ30KLVRoaXMgZG9lc24ndCBhY3R1YWxseSBtb2RpZnkgdGhlIG1lc3NhZ2UncyBwYXlsb2FkLCBidXQgaXQgZG9lcyBzZXQKLXRoZSBcbWFpbGhlYWRlcntDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nfSBoZWFkZXIgdG8gZWl0aGVyIFxjb2RlezdiaXR9IG9yCi1cY29kZXs4Yml0fSBhcyBhcHByb3ByaWF0ZSwgYmFzZWQgb24gdGhlIHBheWxvYWQgZGF0YS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZW5jb2RlX25vb3B9e21zZ30KLVRoaXMgZG9lcyBub3RoaW5nOyBpdCBkb2Vzbid0IGV2ZW4gc2V0IHRoZQotXG1haWxoZWFkZXJ7Q29udGVudC1UcmFuc2Zlci1FbmNvZGluZ30gaGVhZGVyLgotXGVuZHtmdW5jZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIvZW1haWxleGMudGV4IGIvRG9jL2xpYi9lbWFpbGV4Yy50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZWYxZDUuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9lbWFpbGV4Yy50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZW1haWwuZXJyb3JzfQotXG1vZHVsZXN5bm9wc2lze1RoZSBleGNlcHRpb24gY2xhc3NlcyB1c2VkIGJ5IHRoZSBlbWFpbCBwYWNrYWdlLn0KLQotVGhlIGZvbGxvd2luZyBleGNlcHRpb24gY2xhc3NlcyBhcmUgZGVmaW5lZCBpbiB0aGUKLVxtb2R1bGV7ZW1haWwuZXJyb3JzfSBtb2R1bGU6Ci0KLVxiZWdpbntleGNjbGFzc2Rlc2N9e01lc3NhZ2VFcnJvcn17fQotVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgYWxsIGV4Y2VwdGlvbnMgdGhhdCB0aGUgXG1vZHVsZXtlbWFpbH0KLXBhY2thZ2UgY2FuIHJhaXNlLiAgSXQgaXMgZGVyaXZlZCBmcm9tIHRoZSBzdGFuZGFyZAotXGV4Y2VwdGlvbntFeGNlcHRpb259IGNsYXNzIGFuZCBkZWZpbmVzIG5vIGFkZGl0aW9uYWwgbWV0aG9kcy4KLVxlbmR7ZXhjY2xhc3NkZXNjfQotCi1cYmVnaW57ZXhjY2xhc3NkZXNjfXtNZXNzYWdlUGFyc2VFcnJvcn17fQotVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIFxjbGFzc3tQYXJzZXJ9Ci1jbGFzcy4gIEl0IGlzIGRlcml2ZWQgZnJvbSBcZXhjZXB0aW9ue01lc3NhZ2VFcnJvcn0uCi1cZW5ke2V4Y2NsYXNzZGVzY30KLQotXGJlZ2lue2V4Y2NsYXNzZGVzY317SGVhZGVyUGFyc2VFcnJvcn17fQotUmFpc2VkIHVuZGVyIHNvbWUgZXJyb3IgY29uZGl0aW9ucyB3aGVuIHBhcnNpbmcgdGhlIFxyZmN7MjgyMn0gaGVhZGVycyBvZgotYSBtZXNzYWdlLCB0aGlzIGNsYXNzIGlzIGRlcml2ZWQgZnJvbSBcZXhjZXB0aW9ue01lc3NhZ2VQYXJzZUVycm9yfS4KLUl0IGNhbiBiZSByYWlzZWQgZnJvbSB0aGUgXG1ldGhvZHtQYXJzZXIucGFyc2UoKX0gb3IKLVxtZXRob2R7UGFyc2VyLnBhcnNlc3RyKCl9IG1ldGhvZHMuCi0KLVNpdHVhdGlvbnMgd2hlcmUgaXQgY2FuIGJlIHJhaXNlZCBpbmNsdWRlIGZpbmRpbmcgYW4gZW52ZWxvcGUKLWhlYWRlciBhZnRlciB0aGUgZmlyc3QgXHJmY3syODIyfSBoZWFkZXIgb2YgdGhlIG1lc3NhZ2UsIGZpbmRpbmcgYQotY29udGludWF0aW9uIGxpbmUgYmVmb3JlIHRoZSBmaXJzdCBccmZjezI4MjJ9IGhlYWRlciBpcyBmb3VuZCwgb3IgZmluZGluZwotYSBsaW5lIGluIHRoZSBoZWFkZXJzIHdoaWNoIGlzIG5laXRoZXIgYSBoZWFkZXIgb3IgYSBjb250aW51YXRpb24KLWxpbmUuCi1cZW5ke2V4Y2NsYXNzZGVzY30KLQotXGJlZ2lue2V4Y2NsYXNzZGVzY317Qm91bmRhcnlFcnJvcn17fQotUmFpc2VkIHVuZGVyIHNvbWUgZXJyb3IgY29uZGl0aW9ucyB3aGVuIHBhcnNpbmcgdGhlIFxyZmN7MjgyMn0gaGVhZGVycyBvZgotYSBtZXNzYWdlLCB0aGlzIGNsYXNzIGlzIGRlcml2ZWQgZnJvbSBcZXhjZXB0aW9ue01lc3NhZ2VQYXJzZUVycm9yfS4KLUl0IGNhbiBiZSByYWlzZWQgZnJvbSB0aGUgXG1ldGhvZHtQYXJzZXIucGFyc2UoKX0gb3IKLVxtZXRob2R7UGFyc2VyLnBhcnNlc3RyKCl9IG1ldGhvZHMuCi0KLVNpdHVhdGlvbnMgd2hlcmUgaXQgY2FuIGJlIHJhaXNlZCBpbmNsdWRlIG5vdCBiZWluZyBhYmxlIHRvIGZpbmQgdGhlCi1zdGFydGluZyBvciB0ZXJtaW5hdGluZyBib3VuZGFyeSBpbiBhIFxtaW1ldHlwZXttdWx0aXBhcnQvKn0gbWVzc2FnZQotd2hlbiBzdHJpY3QgcGFyc2luZyBpcyB1c2VkLgotXGVuZHtleGNjbGFzc2Rlc2N9Ci0KLVxiZWdpbntleGNjbGFzc2Rlc2N9e011bHRpcGFydENvbnZlcnNpb25FcnJvcn17fQotUmFpc2VkIHdoZW4gYSBwYXlsb2FkIGlzIGFkZGVkIHRvIGEgXGNsYXNze01lc3NhZ2V9IG9iamVjdCB1c2luZwotXG1ldGhvZHthZGRfcGF5bG9hZCgpfSwgYnV0IHRoZSBwYXlsb2FkIGlzIGFscmVhZHkgYSBzY2FsYXIgYW5kIHRoZQotbWVzc2FnZSdzIFxtYWlsaGVhZGVye0NvbnRlbnQtVHlwZX0gbWFpbiB0eXBlIGlzIG5vdCBlaXRoZXIKLVxtaW1ldHlwZXttdWx0aXBhcnR9IG9yIG1pc3NpbmcuICBcZXhjZXB0aW9ue011bHRpcGFydENvbnZlcnNpb25FcnJvcn0KLW11bHRpcGx5IGluaGVyaXRzIGZyb20gXGV4Y2VwdGlvbntNZXNzYWdlRXJyb3J9IGFuZCB0aGUgYnVpbHQtaW4KLVxleGNlcHRpb257VHlwZUVycm9yfS4KLQotU2luY2UgXG1ldGhvZHtNZXNzYWdlLmFkZF9wYXlsb2FkKCl9IGlzIGRlcHJlY2F0ZWQsIHRoaXMgZXhjZXB0aW9uIGlzCi1yYXJlbHkgcmFpc2VkIGluIHByYWN0aWNlLiAgSG93ZXZlciB0aGUgZXhjZXB0aW9uIG1heSBhbHNvIGJlIHJhaXNlZAotaWYgdGhlIFxtZXRob2R7YXR0YWNoKCl9IG1ldGhvZCBpcyBjYWxsZWQgb24gYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcwotZGVyaXZlZCBmcm9tIFxjbGFzc3tNSU1FTm9uTXVsdGlwYXJ0fSAoZS5nLiBcY2xhc3N7TUlNRUltYWdlfSkuCi1cZW5ke2V4Y2NsYXNzZGVzY30KLQotSGVyZSdzIHRoZSBsaXN0IG9mIHRoZSBkZWZlY3RzIHRoYXQgdGhlIFxjbGFzc3tGZWVkUGFyc2VyfSBjYW4gZmluZCB3aGlsZQotcGFyc2luZyBtZXNzYWdlcy4gIE5vdGUgdGhhdCB0aGUgZGVmZWN0cyBhcmUgYWRkZWQgdG8gdGhlIG1lc3NhZ2Ugd2hlcmUgdGhlCi1wcm9ibGVtIHdhcyBmb3VuZCwgc28gZm9yIGV4YW1wbGUsIGlmIGEgbWVzc2FnZSBuZXN0ZWQgaW5zaWRlIGEKLVxtaW1ldHlwZXttdWx0aXBhcnQvYWx0ZXJuYXRpdmV9IGhhZCBhIG1hbGZvcm1lZCBoZWFkZXIsIHRoYXQgbmVzdGVkIG1lc3NhZ2UKLW9iamVjdCB3b3VsZCBoYXZlIGEgZGVmZWN0LCBidXQgdGhlIGNvbnRhaW5pbmcgbWVzc2FnZXMgd291bGQgbm90LgotCi1BbGwgZGVmZWN0IGNsYXNzZXMgYXJlIHN1YmNsYXNzZWQgZnJvbSBcY2xhc3N7ZW1haWwuZXJyb3JzLk1lc3NhZ2VEZWZlY3R9LCBidXQKLXRoaXMgY2xhc3MgaXMgXGVtcGh7bm90fSBhbiBleGNlcHRpb24hCi0KLVx2ZXJzaW9uYWRkZWRbQWxsIHRoZSBkZWZlY3QgY2xhc3NlcyB3ZXJlIGFkZGVkXXsyLjR9Ci0KLVxiZWdpbntpdGVtaXplfQotXGl0ZW0gXGNsYXNze05vQm91bmRhcnlJbk11bHRpcGFydERlZmVjdH0gLS0gQSBtZXNzYWdlIGNsYWltZWQgdG8gYmUgYQotICAgICAgbXVsdGlwYXJ0LCBidXQgaGFkIG5vIFxtaW1ldHlwZXtib3VuZGFyeX0gcGFyYW1ldGVyLgotCi1caXRlbSBcY2xhc3N7U3RhcnRCb3VuZGFyeU5vdEZvdW5kRGVmZWN0fSAtLSBUaGUgc3RhcnQgYm91bmRhcnkgY2xhaW1lZCBpbiB0aGUKLSAgICAgIFxtYWlsaGVhZGVye0NvbnRlbnQtVHlwZX0gaGVhZGVyIHdhcyBuZXZlciBmb3VuZC4KLQotXGl0ZW0gXGNsYXNze0ZpcnN0SGVhZGVyTGluZUlzQ29udGludWF0aW9uRGVmZWN0fSAtLSBUaGUgbWVzc2FnZSBoYWQgYQotICAgICAgY29udGludWF0aW9uIGxpbmUgYXMgaXRzIGZpcnN0IGhlYWRlciBsaW5lLgotCi1caXRlbSBcY2xhc3N7TWlzcGxhY2VkRW52ZWxvcGVIZWFkZXJEZWZlY3R9IC0gQSBgYFVuaXggRnJvbScnIGhlYWRlciB3YXMgZm91bmQKLSAgICAgIGluIHRoZSBtaWRkbGUgb2YgYSBoZWFkZXIgYmxvY2suCi0KLVxpdGVtIFxjbGFzc3tNYWxmb3JtZWRIZWFkZXJEZWZlY3R9IC0tIEEgaGVhZGVyIHdhcyBmb3VuZCB0aGF0IHdhcyBtaXNzaW5nIGEKLSAgICAgIGNvbG9uLCBvciB3YXMgb3RoZXJ3aXNlIG1hbGZvcm1lZC4KLQotXGl0ZW0gXGNsYXNze011bHRpcGFydEludmFyaWFudFZpb2xhdGlvbkRlZmVjdH0gLS0gQSBtZXNzYWdlIGNsYWltZWQgdG8gYmUgYQotICAgICAgXG1pbWV0eXBle211bHRpcGFydH0sIGJ1dCBubyBzdWJwYXJ0cyB3ZXJlIGZvdW5kLiAgTm90ZSB0aGF0IHdoZW4gYQotICAgICAgbWVzc2FnZSBoYXMgdGhpcyBkZWZlY3QsIGl0cyBcbWV0aG9ke2lzX211bHRpcGFydCgpfSBtZXRob2QgbWF5IHJldHVybgotICAgICAgZmFsc2UgZXZlbiB0aG91Z2ggaXRzIGNvbnRlbnQgdHlwZSBjbGFpbXMgdG8gYmUgXG1pbWV0eXBle211bHRpcGFydH0uCi1cZW5ke2l0ZW1pemV9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2VtYWlsZ2VuZXJhdG9yLnRleCBiL0RvYy9saWIvZW1haWxnZW5lcmF0b3IudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWIwYTUzLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvZW1haWxnZW5lcmF0b3IudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtlbWFpbC5nZW5lcmF0b3J9Ci1cbW9kdWxlc3lub3BzaXN7R2VuZXJhdGUgZmxhdCB0ZXh0IGVtYWlsIG1lc3NhZ2VzIGZyb20gYSBtZXNzYWdlIHN0cnVjdHVyZS59Ci0KLU9uZSBvZiB0aGUgbW9zdCBjb21tb24gdGFza3MgaXMgdG8gZ2VuZXJhdGUgdGhlIGZsYXQgdGV4dCBvZiB0aGUgZW1haWwKLW1lc3NhZ2UgcmVwcmVzZW50ZWQgYnkgYSBtZXNzYWdlIG9iamVjdCBzdHJ1Y3R1cmUuICBZb3Ugd2lsbCBuZWVkIHRvIGRvCi10aGlzIGlmIHlvdSB3YW50IHRvIHNlbmQgeW91ciBtZXNzYWdlIHZpYSB0aGUgXHJlZm1vZHVsZXtzbXRwbGlifQotbW9kdWxlIG9yIHRoZSBccmVmbW9kdWxle25udHBsaWJ9IG1vZHVsZSwgb3IgcHJpbnQgdGhlIG1lc3NhZ2Ugb24gdGhlCi1jb25zb2xlLiAgVGFraW5nIGEgbWVzc2FnZSBvYmplY3Qgc3RydWN0dXJlIGFuZCBwcm9kdWNpbmcgYSBmbGF0IHRleHQKLWRvY3VtZW50IGlzIHRoZSBqb2Igb2YgdGhlIFxjbGFzc3tHZW5lcmF0b3J9IGNsYXNzLgotCi1BZ2FpbiwgYXMgd2l0aCB0aGUgXHJlZm1vZHVsZXtlbWFpbC5wYXJzZXJ9IG1vZHVsZSwgeW91IGFyZW4ndCBsaW1pdGVkCi10byB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgYnVuZGxlZCBnZW5lcmF0b3I7IHlvdSBjb3VsZCB3cml0ZSBvbmUKLWZyb20gc2NyYXRjaCB5b3Vyc2VsZi4gIEhvd2V2ZXIgdGhlIGJ1bmRsZWQgZ2VuZXJhdG9yIGtub3dzIGhvdyB0bwotZ2VuZXJhdGUgbW9zdCBlbWFpbCBpbiBhIHN0YW5kYXJkcy1jb21wbGlhbnQgd2F5LCBzaG91bGQgaGFuZGxlIE1JTUUKLWFuZCBub24tTUlNRSBlbWFpbCBtZXNzYWdlcyBqdXN0IGZpbmUsIGFuZCBpcyBkZXNpZ25lZCBzbyB0aGF0IHRoZQotdHJhbnNmb3JtYXRpb24gZnJvbSBmbGF0IHRleHQsIHRvIGEgbWVzc2FnZSBzdHJ1Y3R1cmUgdmlhIHRoZQotXGNsYXNze1BhcnNlcn0gY2xhc3MsIGFuZCBiYWNrIHRvIGZsYXQgdGV4dCwgaXMgaWRlbXBvdGVudCAodGhlIGlucHV0Ci1pcyBpZGVudGljYWwgdG8gdGhlIG91dHB1dCkuCi0KLUhlcmUgYXJlIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGUgXGNsYXNze0dlbmVyYXRvcn0gY2xhc3MsIGltcG9ydGVkIGZyb20gdGhlCi1cbW9kdWxle2VtYWlsLmdlbmVyYXRvcn0gbW9kdWxlOgotCi1cYmVnaW57Y2xhc3NkZXNjfXtHZW5lcmF0b3J9e291dGZwXG9wdGlvbmFseywgbWFuZ2xlX2Zyb21fXG9wdGlvbmFseywKLSAgICBtYXhoZWFkZXJsZW59fX0KLVRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIFxjbGFzc3tHZW5lcmF0b3J9IGNsYXNzIHRha2VzIGEgZmlsZS1saWtlCi1vYmplY3QgY2FsbGVkIFx2YXJ7b3V0ZnB9IGZvciBhbiBhcmd1bWVudC4gIFx2YXJ7b3V0ZnB9IG11c3Qgc3VwcG9ydAotdGhlIFxtZXRob2R7d3JpdGUoKX0gbWV0aG9kIGFuZCBiZSB1c2FibGUgYXMgdGhlIG91dHB1dCBmaWxlIGluIGEKLVB5dGhvbiBleHRlbmRlZCBwcmludCBzdGF0ZW1lbnQuCi0KLU9wdGlvbmFsIFx2YXJ7bWFuZ2xlX2Zyb21ffSBpcyBhIGZsYWcgdGhhdCwgd2hlbiBcY29kZXtUcnVlfSwgcHV0cyBhCi1cc2FtcHs+fSBjaGFyYWN0ZXIgaW4gZnJvbnQgb2YgYW55IGxpbmUgaW4gdGhlIGJvZHkgdGhhdCBzdGFydHMgZXhhY3RseSBhcwotXHNhbXB7RnJvbSB9LCBpLmUuIFxjb2Rle0Zyb219IGZvbGxvd2VkIGJ5IGEgc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKLWxpbmUuICBUaGlzIGlzIHRoZSBvbmx5IGd1YXJhbnRlZWQgcG9ydGFibGUgd2F5IHRvIGF2b2lkIGhhdmluZyBzdWNoCi1saW5lcyBiZSBtaXN0YWtlbiBmb3IgYSBcVU5JWHt9IG1haWxib3ggZm9ybWF0IGVudmVsb3BlIGhlYWRlciBzZXBhcmF0b3IgKHNlZQotXHVsaW5re1dIWSBUSEUgQ09OVEVOVC1MRU5HVEggRk9STUFUIElTIEJBRH0KLXtodHRwOi8vd3d3Lmp3ei5vcmcvZG9jL2NvbnRlbnQtbGVuZ3RoLmh0bWx9Ci1mb3IgZGV0YWlscykuICBcdmFye21hbmdsZV9mcm9tX30gZGVmYXVsdHMgdG8gXGNvZGV7VHJ1ZX0sIGJ1dCB5b3UKLW1pZ2h0IHdhbnQgdG8gc2V0IHRoaXMgdG8gXGNvZGV7RmFsc2V9IGlmIHlvdSBhcmUgbm90IHdyaXRpbmcgXFVOSVh7fQotbWFpbGJveCBmb3JtYXQgZmlsZXMuCi0KLU9wdGlvbmFsIFx2YXJ7bWF4aGVhZGVybGVufSBzcGVjaWZpZXMgdGhlIGxvbmdlc3QgbGVuZ3RoIGZvciBhCi1ub24tY29udGludWVkIGhlYWRlci4gIFdoZW4gYSBoZWFkZXIgbGluZSBpcyBsb25nZXIgdGhhbgotXHZhcnttYXhoZWFkZXJsZW59IChpbiBjaGFyYWN0ZXJzLCB3aXRoIHRhYnMgZXhwYW5kZWQgdG8gOCBzcGFjZXMpLAotdGhlIGhlYWRlciB3aWxsIGJlIHNwbGl0IGFzIGRlZmluZWQgaW4gdGhlIFxtb2R1bGV7ZW1haWwuaGVhZGVyLkhlYWRlcn0KLWNsYXNzLiAgU2V0IHRvIHplcm8gdG8gZGlzYWJsZSBoZWFkZXIgd3JhcHBpbmcuICBUaGUgZGVmYXVsdCBpcyA3OCwgYXMKLXJlY29tbWVuZGVkIChidXQgbm90IHJlcXVpcmVkKSBieSBccmZjezI4MjJ9LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVRoZSBvdGhlciBwdWJsaWMgXGNsYXNze0dlbmVyYXRvcn0gbWV0aG9kcyBhcmU6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtHZW5lcmF0b3Jde2ZsYXR0ZW59e21zZ1xvcHRpb25hbHssIHVuaXhmcm9tfX0KLVByaW50IHRoZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXNzYWdlIG9iamVjdCBzdHJ1Y3R1cmUgcm9vdGVkIGF0Ci1cdmFye21zZ30gdG8gdGhlIG91dHB1dCBmaWxlIHNwZWNpZmllZCB3aGVuIHRoZSBcY2xhc3N7R2VuZXJhdG9yfQotaW5zdGFuY2Ugd2FzIGNyZWF0ZWQuICBTdWJwYXJ0cyBhcmUgdmlzaXRlZCBkZXB0aC1maXJzdCBhbmQgdGhlCi1yZXN1bHRpbmcgdGV4dCB3aWxsIGJlIHByb3Blcmx5IE1JTUUgZW5jb2RlZC4KLQotT3B0aW9uYWwgXHZhcnt1bml4ZnJvbX0gaXMgYSBmbGFnIHRoYXQgZm9yY2VzIHRoZSBwcmludGluZyBvZiB0aGUKLWVudmVsb3BlIGhlYWRlciBkZWxpbWl0ZXIgYmVmb3JlIHRoZSBmaXJzdCBccmZjezI4MjJ9IGhlYWRlciBvZiB0aGUKLXJvb3QgbWVzc2FnZSBvYmplY3QuICBJZiB0aGUgcm9vdCBvYmplY3QgaGFzIG5vIGVudmVsb3BlIGhlYWRlciwgYQotc3RhbmRhcmQgb25lIGlzIGNyYWZ0ZWQuICBCeSBkZWZhdWx0LCB0aGlzIGlzIHNldCB0byBcY29kZXtGYWxzZX0gdG8KLWluaGliaXQgdGhlIHByaW50aW5nIG9mIHRoZSBlbnZlbG9wZSBkZWxpbWl0ZXIuCi0KLU5vdGUgdGhhdCBmb3Igc3VicGFydHMsIG5vIGVudmVsb3BlIGhlYWRlciBpcyBldmVyIHByaW50ZWQuCi0KLVx2ZXJzaW9uYWRkZWR7Mi4yLjJ9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtHZW5lcmF0b3Jde2Nsb25lfXtmcH0KLVJldHVybiBhbiBpbmRlcGVuZGVudCBjbG9uZSBvZiB0aGlzIFxjbGFzc3tHZW5lcmF0b3J9IGluc3RhbmNlIHdpdGgKLXRoZSBleGFjdCBzYW1lIG9wdGlvbnMuCi0KLVx2ZXJzaW9uYWRkZWR7Mi4yLjJ9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtHZW5lcmF0b3Jde3dyaXRlfXtzfQotV3JpdGUgdGhlIHN0cmluZyBcdmFye3N9IHRvIHRoZSB1bmRlcmx5aW5nIGZpbGUgb2JqZWN0LAotaS5lLiBcdmFye291dGZwfSBwYXNzZWQgdG8gXGNsYXNze0dlbmVyYXRvcn0ncyBjb25zdHJ1Y3Rvci4gIFRoaXMKLXByb3ZpZGVzIGp1c3QgZW5vdWdoIGZpbGUtbGlrZSBBUEkgZm9yIFxjbGFzc3tHZW5lcmF0b3J9IGluc3RhbmNlcyB0bwotYmUgdXNlZCBpbiBleHRlbmRlZCBwcmludCBzdGF0ZW1lbnRzLgotXGVuZHttZXRob2RkZXNjfQotCi1BcyBhIGNvbnZlbmllbmNlLCBzZWUgdGhlIG1ldGhvZHMgXG1ldGhvZHtNZXNzYWdlLmFzX3N0cmluZygpfSBhbmQKLVxjb2Rle3N0cihhTWVzc2FnZSl9LCBhLmsuYS4gXG1ldGhvZHtNZXNzYWdlLl9fc3RyX18oKX0sIHdoaWNoCi1zaW1wbGlmeSB0aGUgZ2VuZXJhdGlvbiBvZiBhIGZvcm1hdHRlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYQotbWVzc2FnZSBvYmplY3QuICBGb3IgbW9yZSBkZXRhaWwsIHNlZSBccmVmbW9kdWxle2VtYWlsLm1lc3NhZ2V9LgotCi1UaGUgXG1vZHVsZXtlbWFpbC5nZW5lcmF0b3J9IG1vZHVsZSBhbHNvIHByb3ZpZGVzIGEgZGVyaXZlZCBjbGFzcywKLWNhbGxlZCBcY2xhc3N7RGVjb2RlZEdlbmVyYXRvcn0gd2hpY2ggaXMgbGlrZSB0aGUgXGNsYXNze0dlbmVyYXRvcn0KLWJhc2UgY2xhc3MsIGV4Y2VwdCB0aGF0IG5vbi1cbWltZXR5cGV7dGV4dH0gcGFydHMgYXJlIHN1YnN0aXR1dGVkIHdpdGgKLWEgZm9ybWF0IHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBhcnQuCi0KLVxiZWdpbntjbGFzc2Rlc2N9e0RlY29kZWRHZW5lcmF0b3J9e291dGZwXG9wdGlvbmFseywgbWFuZ2xlX2Zyb21fXG9wdGlvbmFseywKLSAgICBtYXhoZWFkZXJsZW5cb3B0aW9uYWx7LCBmbXR9fX19Ci0KLVRoaXMgY2xhc3MsIGRlcml2ZWQgZnJvbSBcY2xhc3N7R2VuZXJhdG9yfSB3YWxrcyB0aHJvdWdoIGFsbCB0aGUKLXN1YnBhcnRzIG9mIGEgbWVzc2FnZS4gIElmIHRoZSBzdWJwYXJ0IGlzIG9mIG1haW4gdHlwZQotXG1pbWV0eXBle3RleHR9LCB0aGVuIGl0IHByaW50cyB0aGUgZGVjb2RlZCBwYXlsb2FkIG9mIHRoZSBzdWJwYXJ0LgotT3B0aW9uYWwgXHZhcntfbWFuZ2xlX2Zyb21ffSBhbmQgXHZhcnttYXhoZWFkZXJsZW59IGFyZSBhcyB3aXRoIHRoZQotXGNsYXNze0dlbmVyYXRvcn0gYmFzZSBjbGFzcy4KLQotSWYgdGhlIHN1YnBhcnQgaXMgbm90IG9mIG1haW4gdHlwZSBcbWltZXR5cGV7dGV4dH0sIG9wdGlvbmFsIFx2YXJ7Zm10fQotaXMgYSBmb3JtYXQgc3RyaW5nIHRoYXQgaXMgdXNlZCBpbnN0ZWFkIG9mIHRoZSBtZXNzYWdlIHBheWxvYWQuCi1cdmFye2ZtdH0gaXMgZXhwYW5kZWQgd2l0aCB0aGUgZm9sbG93aW5nIGtleXdvcmRzLCBcc2FtcHtcJShrZXl3b3JkKXN9Ci1mb3JtYXQ6Ci0KLVxiZWdpbntpdGVtaXplfQotXGl0ZW0gXGNvZGV7dHlwZX0gLS0gRnVsbCBNSU1FIHR5cGUgb2YgdGhlIG5vbi1cbWltZXR5cGV7dGV4dH0gcGFydAotCi1caXRlbSBcY29kZXttYWludHlwZX0gLS0gTWFpbiBNSU1FIHR5cGUgb2YgdGhlIG5vbi1cbWltZXR5cGV7dGV4dH0gcGFydAotCi1caXRlbSBcY29kZXtzdWJ0eXBlfSAtLSBTdWItTUlNRSB0eXBlIG9mIHRoZSBub24tXG1pbWV0eXBle3RleHR9IHBhcnQKLQotXGl0ZW0gXGNvZGV7ZmlsZW5hbWV9IC0tIEZpbGVuYW1lIG9mIHRoZSBub24tXG1pbWV0eXBle3RleHR9IHBhcnQKLQotXGl0ZW0gXGNvZGV7ZGVzY3JpcHRpb259IC0tIERlc2NyaXB0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUKLSAgICAgIG5vbi1cbWltZXR5cGV7dGV4dH0gcGFydAotCi1caXRlbSBcY29kZXtlbmNvZGluZ30gLS0gQ29udGVudCB0cmFuc2ZlciBlbmNvZGluZyBvZiB0aGUKLSAgICAgIG5vbi1cbWltZXR5cGV7dGV4dH0gcGFydAotCi1cZW5ke2l0ZW1pemV9Ci0KLVRoZSBkZWZhdWx0IHZhbHVlIGZvciBcdmFye2ZtdH0gaXMgXGNvZGV7Tm9uZX0sIG1lYW5pbmcKLQotXGJlZ2lue3ZlcmJhdGltfQotW05vbi10ZXh0ICglKHR5cGUpcykgcGFydCBvZiBtZXNzYWdlIG9taXR0ZWQsIGZpbGVuYW1lICUoZmlsZW5hbWUpc10KLVxlbmR7dmVyYmF0aW19Ci0KLVx2ZXJzaW9uYWRkZWR7Mi4yLjJ9Ci1cZW5ke2NsYXNzZGVzY30KLQotXHZlcnNpb25jaGFuZ2VkW1RoZSBwcmV2aW91c2x5IGRlcHJlY2F0ZWQgbWV0aG9kIFxtZXRob2R7X19jYWxsX18oKX0gd2FzCi1yZW1vdmVkXXsyLjV9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2VtYWlsaGVhZGVycy50ZXggYi9Eb2MvbGliL2VtYWlsaGVhZGVycy50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNGQwOGMuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9lbWFpbGhlYWRlcnMudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtlbWFpbC5oZWFkZXJ9Ci1cbW9kdWxlc3lub3BzaXN7UmVwcmVzZW50aW5nIG5vbi1BU0NJSSBoZWFkZXJzfQotCi1ccmZjezI4MjJ9IGlzIHRoZSBiYXNlIHN0YW5kYXJkIHRoYXQgZGVzY3JpYmVzIHRoZSBmb3JtYXQgb2YgZW1haWwKLW1lc3NhZ2VzLiAgSXQgZGVyaXZlcyBmcm9tIHRoZSBvbGRlciBccmZjezgyMn0gc3RhbmRhcmQgd2hpY2ggY2FtZQotaW50byB3aWRlc3ByZWFkIHVzZSBhdCBhIHRpbWUgd2hlbiBtb3N0IGVtYWlsIHdhcyBjb21wb3NlZCBvZiBcQVNDSUl7fQotY2hhcmFjdGVycyBvbmx5LiAgXHJmY3syODIyfSBpcyBhIHNwZWNpZmljYXRpb24gd3JpdHRlbiBhc3N1bWluZyBlbWFpbAotY29udGFpbnMgb25seSA3LWJpdCBcQVNDSUl7fSBjaGFyYWN0ZXJzLgotCi1PZiBjb3Vyc2UsIGFzIGVtYWlsIGhhcyBiZWVuIGRlcGxveWVkIHdvcmxkd2lkZSwgaXQgaGFzIGJlY29tZQotaW50ZXJuYXRpb25hbGl6ZWQsIHN1Y2ggdGhhdCBsYW5ndWFnZSBzcGVjaWZpYyBjaGFyYWN0ZXIgc2V0cyBjYW4gbm93Ci1iZSB1c2VkIGluIGVtYWlsIG1lc3NhZ2VzLiAgVGhlIGJhc2Ugc3RhbmRhcmQgc3RpbGwgcmVxdWlyZXMgZW1haWwKLW1lc3NhZ2VzIHRvIGJlIHRyYW5zZmVycmVkIHVzaW5nIG9ubHkgNy1iaXQgXEFTQ0lJe30gY2hhcmFjdGVycywgc28gYQotc2xldyBvZiBSRkNzIGhhdmUgYmVlbiB3cml0dGVuIGRlc2NyaWJpbmcgaG93IHRvIGVuY29kZSBlbWFpbAotY29udGFpbmluZyBub24tXEFTQ0lJe30gY2hhcmFjdGVycyBpbnRvIFxyZmN7MjgyMn0tY29tcGxpYW50IGZvcm1hdC4KLVRoZXNlIFJGQ3MgaW5jbHVkZSBccmZjezIwNDV9LCBccmZjezIwNDZ9LCBccmZjezIwNDd9LCBhbmQgXHJmY3syMjMxfS4KLVRoZSBcbW9kdWxle2VtYWlsfSBwYWNrYWdlIHN1cHBvcnRzIHRoZXNlIHN0YW5kYXJkcyBpbiBpdHMKLVxtb2R1bGV7ZW1haWwuaGVhZGVyfSBhbmQgXG1vZHVsZXtlbWFpbC5jaGFyc2V0fSBtb2R1bGVzLgotCi1JZiB5b3Ugd2FudCB0byBpbmNsdWRlIG5vbi1cQVNDSUl7fSBjaGFyYWN0ZXJzIGluIHlvdXIgZW1haWwgaGVhZGVycywKLXNheSBpbiB0aGUgXG1haWxoZWFkZXJ7U3ViamVjdH0gb3IgXG1haWxoZWFkZXJ7VG99IGZpZWxkcywgeW91IHNob3VsZAotdXNlIHRoZSBcY2xhc3N7SGVhZGVyfSBjbGFzcyBhbmQgYXNzaWduIHRoZSBmaWVsZCBpbiB0aGUKLVxjbGFzc3tNZXNzYWdlfSBvYmplY3QgdG8gYW4gaW5zdGFuY2Ugb2YgXGNsYXNze0hlYWRlcn0gaW5zdGVhZCBvZgotdXNpbmcgYSBzdHJpbmcgZm9yIHRoZSBoZWFkZXIgdmFsdWUuICBJbXBvcnQgdGhlIFxjbGFzc3tIZWFkZXJ9IGNsYXNzIGZyb20gdGhlCi1cbW9kdWxle2VtYWlsLmhlYWRlcn0gbW9kdWxlLiAgRm9yIGV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBmcm9tIGVtYWlsLm1lc3NhZ2UgaW1wb3J0IE1lc3NhZ2UKLT4+PiBmcm9tIGVtYWlsLmhlYWRlciBpbXBvcnQgSGVhZGVyCi0+Pj4gbXNnID0gTWVzc2FnZSgpCi0+Pj4gaCA9IEhlYWRlcigncFx4ZjZzdGFsJywgJ2lzby04ODU5LTEnKQotPj4+IG1zZ1snU3ViamVjdCddID0gaAotPj4+IHByaW50IG1zZy5hc19zdHJpbmcoKQotU3ViamVjdDogPT9pc28tODg1OS0xP3E/cD1GNnN0YWw/PQotCi0KLVxlbmR7dmVyYmF0aW19Ci0KLU5vdGljZSBoZXJlIGhvdyB3ZSB3YW50ZWQgdGhlIFxtYWlsaGVhZGVye1N1YmplY3R9IGZpZWxkIHRvIGNvbnRhaW4gYQotbm9uLVxBU0NJSXt9IGNoYXJhY3Rlcj8gIFdlIGRpZCB0aGlzIGJ5IGNyZWF0aW5nIGEgXGNsYXNze0hlYWRlcn0KLWluc3RhbmNlIGFuZCBwYXNzaW5nIGluIHRoZSBjaGFyYWN0ZXIgc2V0IHRoYXQgdGhlIGJ5dGUgc3RyaW5nIHdhcwotZW5jb2RlZCBpbi4gIFdoZW4gdGhlIHN1YnNlcXVlbnQgXGNsYXNze01lc3NhZ2V9IGluc3RhbmNlIHdhcwotZmxhdHRlbmVkLCB0aGUgXG1haWxoZWFkZXJ7U3ViamVjdH0gZmllbGQgd2FzIHByb3Blcmx5IFxyZmN7MjA0N30KLWVuY29kZWQuICBNSU1FLWF3YXJlIG1haWwgcmVhZGVycyB3b3VsZCBzaG93IHRoaXMgaGVhZGVyIHVzaW5nIHRoZQotZW1iZWRkZWQgSVNPLTg4NTktMSBjaGFyYWN0ZXIuCi0KLVx2ZXJzaW9uYWRkZWR7Mi4yLjJ9Ci0KLUhlcmUgaXMgdGhlIFxjbGFzc3tIZWFkZXJ9IGNsYXNzIGRlc2NyaXB0aW9uOgotCi1cYmVnaW57Y2xhc3NkZXNjfXtIZWFkZXJ9e1xvcHRpb25hbHtzXG9wdGlvbmFseywgY2hhcnNldFxvcHRpb25hbHssCi0gICAgbWF4bGluZWxlblxvcHRpb25hbHssIGhlYWRlcl9uYW1lXG9wdGlvbmFseywgY29udGludWF0aW9uX3dzXG9wdGlvbmFseywKLSAgICBlcnJvcnN9fX19fX19Ci1DcmVhdGUgYSBNSU1FLWNvbXBsaWFudCBoZWFkZXIgdGhhdCBjYW4gY29udGFpbiBzdHJpbmdzIGluIGRpZmZlcmVudAotY2hhcmFjdGVyIHNldHMuCi0KLU9wdGlvbmFsIFx2YXJ7c30gaXMgdGhlIGluaXRpYWwgaGVhZGVyIHZhbHVlLiAgSWYgXGNvZGV7Tm9uZX0gKHRoZQotZGVmYXVsdCksIHRoZSBpbml0aWFsIGhlYWRlciB2YWx1ZSBpcyBub3Qgc2V0LiAgWW91IGNhbiBsYXRlciBhcHBlbmQKLXRvIHRoZSBoZWFkZXIgd2l0aCBcbWV0aG9ke2FwcGVuZCgpfSBtZXRob2QgY2FsbHMuICBcdmFye3N9IG1heSBiZSBhCi1ieXRlIHN0cmluZyBvciBhIFVuaWNvZGUgc3RyaW5nLCBidXQgc2VlIHRoZSBcbWV0aG9ke2FwcGVuZCgpfQotZG9jdW1lbnRhdGlvbiBmb3Igc2VtYW50aWNzLgotCi1PcHRpb25hbCBcdmFye2NoYXJzZXR9IHNlcnZlcyB0d28gcHVycG9zZXM6IGl0IGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzCi10aGUgXHZhcntjaGFyc2V0fSBhcmd1bWVudCB0byB0aGUgXG1ldGhvZHthcHBlbmQoKX0gbWV0aG9kLiAgSXQgYWxzbwotc2V0cyB0aGUgZGVmYXVsdCBjaGFyYWN0ZXIgc2V0IGZvciBhbGwgc3Vic2VxdWVudCBcbWV0aG9ke2FwcGVuZCgpfQotY2FsbHMgdGhhdCBvbWl0IHRoZSBcdmFye2NoYXJzZXR9IGFyZ3VtZW50LiAgSWYgXHZhcntjaGFyc2V0fSBpcyBub3QKLXByb3ZpZGVkIGluIHRoZSBjb25zdHJ1Y3RvciAodGhlIGRlZmF1bHQpLCB0aGUgXGNvZGV7dXMtYXNjaWl9Ci1jaGFyYWN0ZXIgc2V0IGlzIHVzZWQgYm90aCBhcyBcdmFye3N9J3MgaW5pdGlhbCBjaGFyc2V0IGFuZCBhcyB0aGUKLWRlZmF1bHQgZm9yIHN1YnNlcXVlbnQgXG1ldGhvZHthcHBlbmQoKX0gY2FsbHMuCi0KLVRoZSBtYXhpbXVtIGxpbmUgbGVuZ3RoIGNhbiBiZSBzcGVjaWZpZWQgZXhwbGljaXQgdmlhCi1cdmFye21heGxpbmVsZW59LiAgRm9yIHNwbGl0dGluZyB0aGUgZmlyc3QgbGluZSB0byBhIHNob3J0ZXIgdmFsdWUgKHRvCi1hY2NvdW50IGZvciB0aGUgZmllbGQgaGVhZGVyIHdoaWNoIGlzbid0IGluY2x1ZGVkIGluIFx2YXJ7c30sCi1lLmcuIFxtYWlsaGVhZGVye1N1YmplY3R9KSBwYXNzIGluIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBpbgotXHZhcntoZWFkZXJfbmFtZX0uICBUaGUgZGVmYXVsdCBcdmFye21heGxpbmVsZW59IGlzIDc2LCBhbmQgdGhlCi1kZWZhdWx0IHZhbHVlIGZvciBcdmFye2hlYWRlcl9uYW1lfSBpcyBcY29kZXtOb25lfSwgbWVhbmluZyBpdCBpcyBub3QKLXRha2VuIGludG8gYWNjb3VudCBmb3IgdGhlIGZpcnN0IGxpbmUgb2YgYSBsb25nLCBzcGxpdCBoZWFkZXIuCi0KLU9wdGlvbmFsIFx2YXJ7Y29udGludWF0aW9uX3dzfSBtdXN0IGJlIFxyZmN7MjgyMn0tY29tcGxpYW50IGZvbGRpbmcKLXdoaXRlc3BhY2UsIGFuZCBpcyB1c3VhbGx5IGVpdGhlciBhIHNwYWNlIG9yIGEgaGFyZCB0YWIgY2hhcmFjdGVyLgotVGhpcyBjaGFyYWN0ZXIgd2lsbCBiZSBwcmVwZW5kZWQgdG8gY29udGludWF0aW9uIGxpbmVzLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLU9wdGlvbmFsIFx2YXJ7ZXJyb3JzfSBpcyBwYXNzZWQgc3RyYWlnaHQgdGhyb3VnaCB0byB0aGUKLVxtZXRob2R7YXBwZW5kKCl9IG1ldGhvZC4KLQotXGJlZ2lue21ldGhvZGRlc2N9W0hlYWRlcl17YXBwZW5kfXtzXG9wdGlvbmFseywgY2hhcnNldFxvcHRpb25hbHssIGVycm9yc319fQotQXBwZW5kIHRoZSBzdHJpbmcgXHZhcntzfSB0byB0aGUgTUlNRSBoZWFkZXIuCi0KLU9wdGlvbmFsIFx2YXJ7Y2hhcnNldH0sIGlmIGdpdmVuLCBzaG91bGQgYmUgYSBcY2xhc3N7Q2hhcnNldH0gaW5zdGFuY2UKLShzZWUgXHJlZm1vZHVsZXtlbWFpbC5jaGFyc2V0fSkgb3IgdGhlIG5hbWUgb2YgYSBjaGFyYWN0ZXIgc2V0LCB3aGljaAotd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBcY2xhc3N7Q2hhcnNldH0gaW5zdGFuY2UuICBBIHZhbHVlIG9mCi1cY29kZXtOb25lfSAodGhlIGRlZmF1bHQpIG1lYW5zIHRoYXQgdGhlIFx2YXJ7Y2hhcnNldH0gZ2l2ZW4gaW4gdGhlCi1jb25zdHJ1Y3RvciBpcyB1c2VkLgotCi1cdmFye3N9IG1heSBiZSBhIGJ5dGUgc3RyaW5nIG9yIGEgVW5pY29kZSBzdHJpbmcuICBJZiBpdCBpcyBhIGJ5dGUKLXN0cmluZyAoaS5lLiBcY29kZXtpc2luc3RhbmNlKHMsIHN0cil9IGlzIHRydWUpLCB0aGVuCi1cdmFye2NoYXJzZXR9IGlzIHRoZSBlbmNvZGluZyBvZiB0aGF0IGJ5dGUgc3RyaW5nLCBhbmQgYQotXGV4Y2VwdGlvbntVbmljb2RlRXJyb3J9IHdpbGwgYmUgcmFpc2VkIGlmIHRoZSBzdHJpbmcgY2Fubm90IGJlCi1kZWNvZGVkIHdpdGggdGhhdCBjaGFyYWN0ZXIgc2V0LgotCi1JZiBcdmFye3N9IGlzIGEgVW5pY29kZSBzdHJpbmcsIHRoZW4gXHZhcntjaGFyc2V0fSBpcyBhIGhpbnQKLXNwZWNpZnlpbmcgdGhlIGNoYXJhY3RlciBzZXQgb2YgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZy4gIEluIHRoaXMKLWNhc2UsIHdoZW4gcHJvZHVjaW5nIGFuIFxyZmN7MjgyMn0tY29tcGxpYW50IGhlYWRlciB1c2luZyBccmZjezIwNDd9Ci1ydWxlcywgdGhlIFVuaWNvZGUgc3RyaW5nIHdpbGwgYmUgZW5jb2RlZCB1c2luZyB0aGUgZm9sbG93aW5nIGNoYXJzZXRzCi1pbiBvcmRlcjogXGNvZGV7dXMtYXNjaWl9LCB0aGUgXHZhcntjaGFyc2V0fSBoaW50LCBcY29kZXt1dGYtOH0uICBUaGUKLWZpcnN0IGNoYXJhY3RlciBzZXQgdG8gbm90IHByb3Zva2UgYSBcZXhjZXB0aW9ue1VuaWNvZGVFcnJvcn0gaXMgdXNlZC4KLQotT3B0aW9uYWwgXHZhcntlcnJvcnN9IGlzIHBhc3NlZCB0aHJvdWdoIHRvIGFueSBcZnVuY3Rpb257dW5pY29kZSgpfSBvcgotXGZ1bmN0aW9ue3VzdHIuZW5jb2RlKCl9IGNhbGwsIGFuZCBkZWZhdWx0cyB0byBgYHN0cmljdCcnLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSGVhZGVyXXtlbmNvZGV9e1xvcHRpb25hbHtzcGxpdGNoYXJzfX0KLUVuY29kZSBhIG1lc3NhZ2UgaGVhZGVyIGludG8gYW4gUkZDLWNvbXBsaWFudCBmb3JtYXQsIHBvc3NpYmx5Ci13cmFwcGluZyBsb25nIGxpbmVzIGFuZCBlbmNhcHN1bGF0aW5nIG5vbi1cQVNDSUl7fSBwYXJ0cyBpbiBiYXNlNjQgb3IKLXF1b3RlZC1wcmludGFibGUgZW5jb2RpbmdzLiAgT3B0aW9uYWwgXHZhcntzcGxpdGNoYXJzfSBpcyBhIHN0cmluZwotY29udGFpbmluZyBjaGFyYWN0ZXJzIHRvIHNwbGl0IGxvbmcgQVNDSUkgbGluZXMgb24sIGluIHJvdWdoIHN1cHBvcnQKLW9mIFxyZmN7MjgyMn0ncyBcZW1waHtoaWdoZXN0IGxldmVsIHN5bnRhY3RpYyBicmVha3N9LiAgVGhpcyBkb2Vzbid0Ci1hZmZlY3QgXHJmY3syMDQ3fSBlbmNvZGVkIGxpbmVzLgotXGVuZHttZXRob2RkZXNjfQotCi1UaGUgXGNsYXNze0hlYWRlcn0gY2xhc3MgYWxzbyBwcm92aWRlcyBhIG51bWJlciBvZiBtZXRob2RzIHRvIHN1cHBvcnQKLXN0YW5kYXJkIG9wZXJhdG9ycyBhbmQgYnVpbHQtaW4gZnVuY3Rpb25zLgotCi1cYmVnaW57bWV0aG9kZGVzY31bSGVhZGVyXXtfX3N0cl9ffXt9Ci1BIHN5bm9ueW0gZm9yIFxtZXRob2R7SGVhZGVyLmVuY29kZSgpfS4gIFVzZWZ1bCBmb3IKLVxjb2Rle3N0cihhSGVhZGVyKX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtIZWFkZXJde19fdW5pY29kZV9ffXt9Ci1BIGhlbHBlciBmb3IgdGhlIGJ1aWx0LWluIFxmdW5jdGlvbnt1bmljb2RlKCl9IGZ1bmN0aW9uLiAgUmV0dXJucyB0aGUKLWhlYWRlciBhcyBhIFVuaWNvZGUgc3RyaW5nLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSGVhZGVyXXtfX2VxX199e290aGVyfQotVGhpcyBtZXRob2QgYWxsb3dzIHlvdSB0byBjb21wYXJlIHR3byBcY2xhc3N7SGVhZGVyfSBpbnN0YW5jZXMgZm9yIGVxdWFsaXR5LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSGVhZGVyXXtfX25lX199e290aGVyfQotVGhpcyBtZXRob2QgYWxsb3dzIHlvdSB0byBjb21wYXJlIHR3byBcY2xhc3N7SGVhZGVyfSBpbnN0YW5jZXMgZm9yIGluZXF1YWxpdHkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVRoZSBcbW9kdWxle2VtYWlsLmhlYWRlcn0gbW9kdWxlIGFsc28gcHJvdmlkZXMgdGhlIGZvbGxvd2luZwotY29udmVuaWVudCBmdW5jdGlvbnMuCi0KLVxiZWdpbntmdW5jZGVzY317ZGVjb2RlX2hlYWRlcn17aGVhZGVyfQotRGVjb2RlIGEgbWVzc2FnZSBoZWFkZXIgdmFsdWUgd2l0aG91dCBjb252ZXJ0aW5nIHRoZSBjaGFyYWN0ZXIgc2V0LgotVGhlIGhlYWRlciB2YWx1ZSBpcyBpbiBcdmFye2hlYWRlcn0uCi0KLVRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGxpc3Qgb2YgXGNvZGV7KGRlY29kZWRfc3RyaW5nLCBjaGFyc2V0KX0gcGFpcnMKLWNvbnRhaW5pbmcgZWFjaCBvZiB0aGUgZGVjb2RlZCBwYXJ0cyBvZiB0aGUgaGVhZGVyLiAgXHZhcntjaGFyc2V0fSBpcwotXGNvZGV7Tm9uZX0gZm9yIG5vbi1lbmNvZGVkIHBhcnRzIG9mIHRoZSBoZWFkZXIsIG90aGVyd2lzZSBhIGxvd2VyCi1jYXNlIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBjaGFyYWN0ZXIgc2V0IHNwZWNpZmllZCBpbiB0aGUKLWVuY29kZWQgc3RyaW5nLgotCi1IZXJlJ3MgYW4gZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGZyb20gZW1haWwuaGVhZGVyIGltcG9ydCBkZWNvZGVfaGVhZGVyCi0+Pj4gZGVjb2RlX2hlYWRlcignPT9pc28tODg1OS0xP3E/cD1GNnN0YWw/PScpCi1bKCdwXHhmNnN0YWwnLCAnaXNvLTg4NTktMScpXQotXGVuZHt2ZXJiYXRpbX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bWFrZV9oZWFkZXJ9e2RlY29kZWRfc2VxXG9wdGlvbmFseywgbWF4bGluZWxlblxvcHRpb25hbHssCi0gICAgaGVhZGVyX25hbWVcb3B0aW9uYWx7LCBjb250aW51YXRpb25fd3N9fX19Ci1DcmVhdGUgYSBcY2xhc3N7SGVhZGVyfSBpbnN0YW5jZSBmcm9tIGEgc2VxdWVuY2Ugb2YgcGFpcnMgYXMgcmV0dXJuZWQKLWJ5IFxmdW5jdGlvbntkZWNvZGVfaGVhZGVyKCl9LgotCi1cZnVuY3Rpb257ZGVjb2RlX2hlYWRlcigpfSB0YWtlcyBhIGhlYWRlciB2YWx1ZSBzdHJpbmcgYW5kIHJldHVybnMgYQotc2VxdWVuY2Ugb2YgcGFpcnMgb2YgdGhlIGZvcm1hdCBcY29kZXsoZGVjb2RlZF9zdHJpbmcsIGNoYXJzZXQpfSB3aGVyZQotXHZhcntjaGFyc2V0fSBpcyB0aGUgbmFtZSBvZiB0aGUgY2hhcmFjdGVyIHNldC4KLQotVGhpcyBmdW5jdGlvbiB0YWtlcyBvbmUgb2YgdGhvc2Ugc2VxdWVuY2Ugb2YgcGFpcnMgYW5kIHJldHVybnMgYQotXGNsYXNze0hlYWRlcn0gaW5zdGFuY2UuICBPcHRpb25hbCBcdmFye21heGxpbmVsZW59LAotXHZhcntoZWFkZXJfbmFtZX0sIGFuZCBcdmFye2NvbnRpbnVhdGlvbl93c30gYXJlIGFzIGluIHRoZQotXGNsYXNze0hlYWRlcn0gY29uc3RydWN0b3IuCi1cZW5ke2Z1bmNkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9lbWFpbGl0ZXIudGV4IGIvRG9jL2xpYi9lbWFpbGl0ZXIudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjhlZjZmLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvZW1haWxpdGVyLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtlbWFpbC5pdGVyYXRvcnN9Ci1cbW9kdWxlc3lub3BzaXN7SXRlcmF0ZSBvdmVyIGEgIG1lc3NhZ2Ugb2JqZWN0IHRyZWUufQotCi1JdGVyYXRpbmcgb3ZlciBhIG1lc3NhZ2Ugb2JqZWN0IHRyZWUgaXMgZmFpcmx5IGVhc3kgd2l0aCB0aGUKLVxtZXRob2R7TWVzc2FnZS53YWxrKCl9IG1ldGhvZC4gIFRoZSBcbW9kdWxle2VtYWlsLml0ZXJhdG9yc30gbW9kdWxlCi1wcm92aWRlcyBzb21lIHVzZWZ1bCBoaWdoZXIgbGV2ZWwgaXRlcmF0aW9ucyBvdmVyIG1lc3NhZ2Ugb2JqZWN0Ci10cmVlcy4KLQotXGJlZ2lue2Z1bmNkZXNjfXtib2R5X2xpbmVfaXRlcmF0b3J9e21zZ1xvcHRpb25hbHssIGRlY29kZX19Ci1UaGlzIGl0ZXJhdGVzIG92ZXIgYWxsIHRoZSBwYXlsb2FkcyBpbiBhbGwgdGhlIHN1YnBhcnRzIG9mIFx2YXJ7bXNnfSwKLXJldHVybmluZyB0aGUgc3RyaW5nIHBheWxvYWRzIGxpbmUtYnktbGluZS4gIEl0IHNraXBzIG92ZXIgYWxsIHRoZQotc3VicGFydCBoZWFkZXJzLCBhbmQgaXQgc2tpcHMgb3ZlciBhbnkgc3VicGFydCB3aXRoIGEgcGF5bG9hZCB0aGF0Ci1pc24ndCBhIFB5dGhvbiBzdHJpbmcuICBUaGlzIGlzIHNvbWV3aGF0IGVxdWl2YWxlbnQgdG8gcmVhZGluZyB0aGUKLWZsYXQgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWVzc2FnZSBmcm9tIGEgZmlsZSB1c2luZwotXG1ldGhvZHtyZWFkbGluZSgpfSwgc2tpcHBpbmcgb3ZlciBhbGwgdGhlIGludGVydmVuaW5nIGhlYWRlcnMuCi0KLU9wdGlvbmFsIFx2YXJ7ZGVjb2RlfSBpcyBwYXNzZWQgdGhyb3VnaCB0byBcbWV0aG9ke01lc3NhZ2UuZ2V0X3BheWxvYWQoKX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3R5cGVkX3N1YnBhcnRfaXRlcmF0b3J9e21zZ1xvcHRpb25hbHssCi0gICAgbWFpbnR5cGVcb3B0aW9uYWx7LCBzdWJ0eXBlfX19Ci1UaGlzIGl0ZXJhdGVzIG92ZXIgYWxsIHRoZSBzdWJwYXJ0cyBvZiBcdmFye21zZ30sIHJldHVybmluZyBvbmx5IHRob3NlCi1zdWJwYXJ0cyB0aGF0IG1hdGNoIHRoZSBNSU1FIHR5cGUgc3BlY2lmaWVkIGJ5IFx2YXJ7bWFpbnR5cGV9IGFuZAotXHZhcntzdWJ0eXBlfS4KLQotTm90ZSB0aGF0IFx2YXJ7c3VidHlwZX0gaXMgb3B0aW9uYWw7IGlmIG9taXR0ZWQsIHRoZW4gc3VicGFydCBNSU1FCi10eXBlIG1hdGNoaW5nIGlzIGRvbmUgb25seSB3aXRoIHRoZSBtYWluIHR5cGUuICBcdmFye21haW50eXBlfSBpcwotb3B0aW9uYWwgdG9vOyBpdCBkZWZhdWx0cyB0byBcbWltZXR5cGV7dGV4dH0uCi0KLVRodXMsIGJ5IGRlZmF1bHQgXGZ1bmN0aW9ue3R5cGVkX3N1YnBhcnRfaXRlcmF0b3IoKX0gcmV0dXJucyBlYWNoCi1zdWJwYXJ0IHRoYXQgaGFzIGEgTUlNRSB0eXBlIG9mIFxtaW1ldHlwZXt0ZXh0Lyp9LgotXGVuZHtmdW5jZGVzY30KLQotVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBoYXMgYmVlbiBhZGRlZCBhcyBhIHVzZWZ1bCBkZWJ1Z2dpbmcgdG9vbC4gIEl0Ci1zaG91bGQgXGVtcGh7bm90fSBiZSBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHN1cHBvcnRlZCBwdWJsaWMgaW50ZXJmYWNlCi1mb3IgdGhlIHBhY2thZ2UuCi0KLVxiZWdpbntmdW5jZGVzY317X3N0cnVjdHVyZX17bXNnXG9wdGlvbmFseywgZnBcb3B0aW9uYWx7LCBsZXZlbH19fQotUHJpbnRzIGFuIGluZGVudGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb250ZW50IHR5cGVzIG9mIHRoZQotbWVzc2FnZSBvYmplY3Qgc3RydWN0dXJlLiAgRm9yIGV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fZmlsZShzb21lZmlsZSkKLT4+PiBfc3RydWN0dXJlKG1zZykKLW11bHRpcGFydC9taXhlZAotICAgIHRleHQvcGxhaW4KLSAgICB0ZXh0L3BsYWluCi0gICAgbXVsdGlwYXJ0L2RpZ2VzdAotICAgICAgICBtZXNzYWdlL3JmYzgyMgotICAgICAgICAgICAgdGV4dC9wbGFpbgotICAgICAgICBtZXNzYWdlL3JmYzgyMgotICAgICAgICAgICAgdGV4dC9wbGFpbgotICAgICAgICBtZXNzYWdlL3JmYzgyMgotICAgICAgICAgICAgdGV4dC9wbGFpbgotICAgICAgICBtZXNzYWdlL3JmYzgyMgotICAgICAgICAgICAgdGV4dC9wbGFpbgotICAgICAgICBtZXNzYWdlL3JmYzgyMgotICAgICAgICAgICAgdGV4dC9wbGFpbgotICAgIHRleHQvcGxhaW4KLVxlbmR7dmVyYmF0aW19Ci0KLU9wdGlvbmFsIFx2YXJ7ZnB9IGlzIGEgZmlsZS1saWtlIG9iamVjdCB0byBwcmludCB0aGUgb3V0cHV0IHRvLiAgSXQKLW11c3QgYmUgc3VpdGFibGUgZm9yIFB5dGhvbidzIGV4dGVuZGVkIHByaW50IHN0YXRlbWVudC4gIFx2YXJ7bGV2ZWx9Ci1pcyB1c2VkIGludGVybmFsbHkuCi1cZW5ke2Z1bmNkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9lbWFpbG1lc3NhZ2UudGV4IGIvRG9jL2xpYi9lbWFpbG1lc3NhZ2UudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmQ3ZGQ4Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvZW1haWxtZXNzYWdlLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDU2MSArMCwwIEBACi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZW1haWwubWVzc2FnZX0KLVxtb2R1bGVzeW5vcHNpc3tUaGUgYmFzZSBjbGFzcyByZXByZXNlbnRpbmcgZW1haWwgbWVzc2FnZXMufQotCi1UaGUgY2VudHJhbCBjbGFzcyBpbiB0aGUgXG1vZHVsZXtlbWFpbH0gcGFja2FnZSBpcyB0aGUKLVxjbGFzc3tNZXNzYWdlfSBjbGFzcywgaW1wb3J0ZWQgZnJvbSB0aGUgXG1vZHVsZXtlbWFpbC5tZXNzYWdlfSBtb2R1bGUuICBJdCBpcwotdGhlIGJhc2UgY2xhc3MgZm9yIHRoZSBcbW9kdWxle2VtYWlsfSBvYmplY3QgbW9kZWwuICBcY2xhc3N7TWVzc2FnZX0gcHJvdmlkZXMKLXRoZSBjb3JlIGZ1bmN0aW9uYWxpdHkgZm9yIHNldHRpbmcgYW5kIHF1ZXJ5aW5nIGhlYWRlciBmaWVsZHMsIGFuZCBmb3IKLWFjY2Vzc2luZyBtZXNzYWdlIGJvZGllcy4KLQotQ29uY2VwdHVhbGx5LCBhIFxjbGFzc3tNZXNzYWdlfSBvYmplY3QgY29uc2lzdHMgb2YgXGVtcGh7aGVhZGVyc30gYW5kCi1cZW1waHtwYXlsb2Fkc30uICBIZWFkZXJzIGFyZSBccmZjezI4MjJ9IHN0eWxlIGZpZWxkIG5hbWVzIGFuZAotdmFsdWVzIHdoZXJlIHRoZSBmaWVsZCBuYW1lIGFuZCB2YWx1ZSBhcmUgc2VwYXJhdGVkIGJ5IGEgY29sb24uICBUaGUKLWNvbG9uIGlzIG5vdCBwYXJ0IG9mIGVpdGhlciB0aGUgZmllbGQgbmFtZSBvciB0aGUgZmllbGQgdmFsdWUuCi0KLUhlYWRlcnMgYXJlIHN0b3JlZCBhbmQgcmV0dXJuZWQgaW4gY2FzZS1wcmVzZXJ2aW5nIGZvcm0gYnV0IGFyZQotbWF0Y2hlZCBjYXNlLWluc2Vuc2l0aXZlbHkuICBUaGVyZSBtYXkgYWxzbyBiZSBhIHNpbmdsZSBlbnZlbG9wZQotaGVhZGVyLCBhbHNvIGtub3duIGFzIHRoZSBcZW1waHtVbml4LUZyb219IGhlYWRlciBvciB0aGUKLVxjb2Rle0Zyb21ffSBoZWFkZXIuICBUaGUgcGF5bG9hZCBpcyBlaXRoZXIgYSBzdHJpbmcgaW4gdGhlIGNhc2Ugb2YKLXNpbXBsZSBtZXNzYWdlIG9iamVjdHMgb3IgYSBsaXN0IG9mIFxjbGFzc3tNZXNzYWdlfSBvYmplY3RzIGZvcgotTUlNRSBjb250YWluZXIgZG9jdW1lbnRzIChlLmcuIFxtaW1ldHlwZXttdWx0aXBhcnQvKn0gYW5kCi1cbWltZXR5cGV7bWVzc2FnZS9yZmM4MjJ9KS4KLQotXGNsYXNze01lc3NhZ2V9IG9iamVjdHMgcHJvdmlkZSBhIG1hcHBpbmcgc3R5bGUgaW50ZXJmYWNlIGZvcgotYWNjZXNzaW5nIHRoZSBtZXNzYWdlIGhlYWRlcnMsIGFuZCBhbiBleHBsaWNpdCBpbnRlcmZhY2UgZm9yIGFjY2Vzc2luZwotYm90aCB0aGUgaGVhZGVycyBhbmQgdGhlIHBheWxvYWQuICBJdCBwcm92aWRlcyBjb252ZW5pZW5jZSBtZXRob2RzIGZvcgotZ2VuZXJhdGluZyBhIGZsYXQgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWVzc2FnZSBvYmplY3QgdHJlZSwgZm9yCi1hY2Nlc3NpbmcgY29tbW9ubHkgdXNlZCBoZWFkZXIgcGFyYW1ldGVycywgYW5kIGZvciByZWN1cnNpdmVseSB3YWxraW5nCi1vdmVyIHRoZSBvYmplY3QgdHJlZS4KLQotSGVyZSBhcmUgdGhlIG1ldGhvZHMgb2YgdGhlIFxjbGFzc3tNZXNzYWdlfSBjbGFzczoKLQotXGJlZ2lue2NsYXNzZGVzY317TWVzc2FnZX17fQotVGhlIGNvbnN0cnVjdG9yIHRha2VzIG5vIGFyZ3VtZW50cy4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTWVzc2FnZV17YXNfc3RyaW5nfXtcb3B0aW9uYWx7dW5peGZyb219fQotUmV0dXJuIHRoZSBlbnRpcmUgbWVzc2FnZSBmbGF0dGVuIGFzIGEgc3RyaW5nLiAgV2hlbiBvcHRpb25hbAotXHZhcnt1bml4ZnJvbX0gaXMgXGNvZGV7VHJ1ZX0sIHRoZSBlbnZlbG9wZSBoZWFkZXIgaXMgaW5jbHVkZWQgaW4gdGhlCi1yZXR1cm5lZCBzdHJpbmcuICBcdmFye3VuaXhmcm9tfSBkZWZhdWx0cyB0byBcY29kZXtGYWxzZX0uCi0KLU5vdGUgdGhhdCB0aGlzIG1ldGhvZCBpcyBwcm92aWRlZCBhcyBhIGNvbnZlbmllbmNlIGFuZCBtYXkgbm90IGFsd2F5cyBmb3JtYXQKLXRoZSBtZXNzYWdlIHRoZSB3YXkgeW91IHdhbnQuICBGb3IgZXhhbXBsZSwgYnkgZGVmYXVsdCBpdCBtYW5nbGVzIGxpbmVzIHRoYXQKLWJlZ2luIHdpdGggXGNvZGV7RnJvbSB9LiAgRm9yIG1vcmUgZmxleGliaWxpdHksIGluc3RhbnRpYXRlIGEKLVxjbGFzc3tHZW5lcmF0b3J9IGluc3RhbmNlIGFuZCB1c2UgaXRzCi1cbWV0aG9ke2ZsYXR0ZW4oKX0gbWV0aG9kIGRpcmVjdGx5LiAgRm9yIGV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwotZnJvbSBlbWFpbC5nZW5lcmF0b3IgaW1wb3J0IEdlbmVyYXRvcgotZnAgPSBTdHJpbmdJTygpCi1nID0gR2VuZXJhdG9yKGZwLCBtYW5nbGVfZnJvbV89RmFsc2UsIG1heGhlYWRlcmxlbj02MCkKLWcuZmxhdHRlbihtc2cpCi10ZXh0ID0gZnAuZ2V0dmFsdWUoKQotXGVuZHt2ZXJiYXRpbX0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W01lc3NhZ2Vde19fc3RyX199e30KLUVxdWl2YWxlbnQgdG8gXG1ldGhvZHthc19zdHJpbmcodW5peGZyb209VHJ1ZSl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTWVzc2FnZV17aXNfbXVsdGlwYXJ0fXt9Ci1SZXR1cm4gXGNvZGV7VHJ1ZX0gaWYgdGhlIG1lc3NhZ2UncyBwYXlsb2FkIGlzIGEgbGlzdCBvZgotc3ViLVxjbGFzc3tNZXNzYWdlfSBvYmplY3RzLCBvdGhlcndpc2UgcmV0dXJuIFxjb2Rle0ZhbHNlfS4gIFdoZW4KLVxtZXRob2R7aXNfbXVsdGlwYXJ0KCl9IHJldHVybnMgRmFsc2UsIHRoZSBwYXlsb2FkIHNob3VsZCBiZSBhIHN0cmluZwotb2JqZWN0LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTWVzc2FnZV17c2V0X3VuaXhmcm9tfXt1bml4ZnJvbX0KLVNldCB0aGUgbWVzc2FnZSdzIGVudmVsb3BlIGhlYWRlciB0byBcdmFye3VuaXhmcm9tfSwgd2hpY2ggc2hvdWxkIGJlIGEgc3RyaW5nLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTWVzc2FnZV17Z2V0X3VuaXhmcm9tfXt9Ci1SZXR1cm4gdGhlIG1lc3NhZ2UncyBlbnZlbG9wZSBoZWFkZXIuICBEZWZhdWx0cyB0byBcY29kZXtOb25lfSBpZiB0aGUKLWVudmVsb3BlIGhlYWRlciB3YXMgbmV2ZXIgc2V0LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTWVzc2FnZV17YXR0YWNofXtwYXlsb2FkfQotQWRkIHRoZSBnaXZlbiBcdmFye3BheWxvYWR9IHRvIHRoZSBjdXJyZW50IHBheWxvYWQsIHdoaWNoIG11c3QgYmUKLVxjb2Rle05vbmV9IG9yIGEgbGlzdCBvZiBcY2xhc3N7TWVzc2FnZX0gb2JqZWN0cyBiZWZvcmUgdGhlIGNhbGwuCi1BZnRlciB0aGUgY2FsbCwgdGhlIHBheWxvYWQgd2lsbCBhbHdheXMgYmUgYSBsaXN0IG9mIFxjbGFzc3tNZXNzYWdlfQotb2JqZWN0cy4gIElmIHlvdSB3YW50IHRvIHNldCB0aGUgcGF5bG9hZCB0byBhIHNjYWxhciBvYmplY3QgKGUuZy4gYQotc3RyaW5nKSwgdXNlIFxtZXRob2R7c2V0X3BheWxvYWQoKX0gaW5zdGVhZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W01lc3NhZ2Vde2dldF9wYXlsb2FkfXtcb3B0aW9uYWx7aVxvcHRpb25hbHssIGRlY29kZX19fQotUmV0dXJuIGEgcmVmZXJlbmNlIHRoZSBjdXJyZW50IHBheWxvYWQsIHdoaWNoIHdpbGwgYmUgYSBsaXN0IG9mCi1cY2xhc3N7TWVzc2FnZX0gb2JqZWN0cyB3aGVuIFxtZXRob2R7aXNfbXVsdGlwYXJ0KCl9IGlzIFxjb2Rle1RydWV9LCBvciBhCi1zdHJpbmcgd2hlbiBcbWV0aG9ke2lzX211bHRpcGFydCgpfSBpcyBcY29kZXtGYWxzZX0uICBJZiB0aGUKLXBheWxvYWQgaXMgYSBsaXN0IGFuZCB5b3UgbXV0YXRlIHRoZSBsaXN0IG9iamVjdCwgeW91IG1vZGlmeSB0aGUKLW1lc3NhZ2UncyBwYXlsb2FkIGluIHBsYWNlLgotCi1XaXRoIG9wdGlvbmFsIGFyZ3VtZW50IFx2YXJ7aX0sIFxtZXRob2R7Z2V0X3BheWxvYWQoKX0gd2lsbCByZXR1cm4gdGhlCi1cdmFye2l9LXRoIGVsZW1lbnQgb2YgdGhlIHBheWxvYWQsIGNvdW50aW5nIGZyb20gemVybywgaWYKLVxtZXRob2R7aXNfbXVsdGlwYXJ0KCl9IGlzIFxjb2Rle1RydWV9LiAgQW4gXGV4Y2VwdGlvbntJbmRleEVycm9yfQotd2lsbCBiZSByYWlzZWQgaWYgXHZhcntpfSBpcyBsZXNzIHRoYW4gMCBvciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8KLXRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHBheWxvYWQuICBJZiB0aGUgcGF5bG9hZCBpcyBhIHN0cmluZwotKGkuZS4gXG1ldGhvZHtpc19tdWx0aXBhcnQoKX0gaXMgXGNvZGV7RmFsc2V9KSBhbmQgXHZhcntpfSBpcyBnaXZlbiwgYQotXGV4Y2VwdGlvbntUeXBlRXJyb3J9IGlzIHJhaXNlZC4KLQotT3B0aW9uYWwgXHZhcntkZWNvZGV9IGlzIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHBheWxvYWQgc2hvdWxkIGJlCi1kZWNvZGVkIG9yIG5vdCwgYWNjb3JkaW5nIHRvIHRoZSBcbWFpbGhlYWRlcntDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nfSBoZWFkZXIuCi1XaGVuIFxjb2Rle1RydWV9IGFuZCB0aGUgbWVzc2FnZSBpcyBub3QgYSBtdWx0aXBhcnQsIHRoZSBwYXlsb2FkIHdpbGwgYmUKLWRlY29kZWQgaWYgdGhpcyBoZWFkZXIncyB2YWx1ZSBpcyBcc2FtcHtxdW90ZWQtcHJpbnRhYmxlfSBvcgotXHNhbXB7YmFzZTY0fS4gIElmIHNvbWUgb3RoZXIgZW5jb2RpbmcgaXMgdXNlZCwgb3IKLVxtYWlsaGVhZGVye0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmd9IGhlYWRlciBpcwotbWlzc2luZywgb3IgaWYgdGhlIHBheWxvYWQgaGFzIGJvZ3VzIGJhc2U2NCBkYXRhLCB0aGUgcGF5bG9hZCBpcwotcmV0dXJuZWQgYXMtaXMgKHVuZGVjb2RlZCkuICBJZiB0aGUgbWVzc2FnZSBpcyBhIG11bHRpcGFydCBhbmQgdGhlCi1cdmFye2RlY29kZX0gZmxhZyBpcyBcY29kZXtUcnVlfSwgdGhlbiBcY29kZXtOb25lfSBpcyByZXR1cm5lZC4gIFRoZQotZGVmYXVsdCBmb3IgXHZhcntkZWNvZGV9IGlzIFxjb2Rle0ZhbHNlfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W01lc3NhZ2Vde3NldF9wYXlsb2FkfXtwYXlsb2FkXG9wdGlvbmFseywgY2hhcnNldH19Ci1TZXQgdGhlIGVudGlyZSBtZXNzYWdlIG9iamVjdCdzIHBheWxvYWQgdG8gXHZhcntwYXlsb2FkfS4gIEl0IGlzIHRoZQotY2xpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoZSBwYXlsb2FkIGludmFyaWFudHMuICBPcHRpb25hbAotXHZhcntjaGFyc2V0fSBzZXRzIHRoZSBtZXNzYWdlJ3MgZGVmYXVsdCBjaGFyYWN0ZXIgc2V0OyBzZWUKLVxtZXRob2R7c2V0X2NoYXJzZXQoKX0gZm9yIGRldGFpbHMuCi0KLVx2ZXJzaW9uY2hhbmdlZFtcdmFye2NoYXJzZXR9IGFyZ3VtZW50IGFkZGVkXXsyLjIuMn0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W01lc3NhZ2Vde3NldF9jaGFyc2V0fXtjaGFyc2V0fQotU2V0IHRoZSBjaGFyYWN0ZXIgc2V0IG9mIHRoZSBwYXlsb2FkIHRvIFx2YXJ7Y2hhcnNldH0sIHdoaWNoIGNhbgotZWl0aGVyIGJlIGEgXGNsYXNze0NoYXJzZXR9IGluc3RhbmNlIChzZWUgXHJlZm1vZHVsZXtlbWFpbC5jaGFyc2V0fSksIGEKLXN0cmluZyBuYW1pbmcgYSBjaGFyYWN0ZXIgc2V0LAotb3IgXGNvZGV7Tm9uZX0uICBJZiBpdCBpcyBhIHN0cmluZywgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYQotXGNsYXNze0NoYXJzZXR9IGluc3RhbmNlLiAgSWYgXHZhcntjaGFyc2V0fSBpcyBcY29kZXtOb25lfSwgdGhlCi1cY29kZXtjaGFyc2V0fSBwYXJhbWV0ZXIgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlCi1cbWFpbGhlYWRlcntDb250ZW50LVR5cGV9IGhlYWRlci4gQW55dGhpbmcgZWxzZSB3aWxsIGdlbmVyYXRlIGEKLVxleGNlcHRpb257VHlwZUVycm9yfS4KLQotVGhlIG1lc3NhZ2Ugd2lsbCBiZSBhc3N1bWVkIHRvIGJlIG9mIHR5cGUgXG1pbWV0eXBle3RleHQvKn0gZW5jb2RlZCB3aXRoCi1cdmFye2NoYXJzZXQuaW5wdXRfY2hhcnNldH0uICBJdCB3aWxsIGJlIGNvbnZlcnRlZCB0bwotXHZhcntjaGFyc2V0Lm91dHB1dF9jaGFyc2V0fQotYW5kIGVuY29kZWQgcHJvcGVybHksIGlmIG5lZWRlZCwgd2hlbiBnZW5lcmF0aW5nIHRoZSBwbGFpbiB0ZXh0Ci1yZXByZXNlbnRhdGlvbiBvZiB0aGUgbWVzc2FnZS4gIE1JTUUgaGVhZGVycwotKFxtYWlsaGVhZGVye01JTUUtVmVyc2lvbn0sIFxtYWlsaGVhZGVye0NvbnRlbnQtVHlwZX0sCi1cbWFpbGhlYWRlcntDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nfSkgd2lsbCBiZSBhZGRlZCBhcyBuZWVkZWQuCi0KLVx2ZXJzaW9uYWRkZWR7Mi4yLjJ9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtNZXNzYWdlXXtnZXRfY2hhcnNldH17fQotUmV0dXJuIHRoZSBcY2xhc3N7Q2hhcnNldH0gaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXNzYWdlJ3MgcGF5bG9hZC4KLVx2ZXJzaW9uYWRkZWR7Mi4yLjJ9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVRoZSBmb2xsb3dpbmcgbWV0aG9kcyBpbXBsZW1lbnQgYSBtYXBwaW5nLWxpa2UgaW50ZXJmYWNlIGZvciBhY2Nlc3NpbmcKLXRoZSBtZXNzYWdlJ3MgXHJmY3syODIyfSBoZWFkZXJzLiAgTm90ZSB0aGF0IHRoZXJlIGFyZSBzb21lCi1zZW1hbnRpYyBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZXNlIG1ldGhvZHMgYW5kIGEgbm9ybWFsIG1hcHBpbmcKLShpLmUuIGRpY3Rpb25hcnkpIGludGVyZmFjZS4gIEZvciBleGFtcGxlLCBpbiBhIGRpY3Rpb25hcnkgdGhlcmUgYXJlCi1ubyBkdXBsaWNhdGUga2V5cywgYnV0IGhlcmUgdGhlcmUgbWF5IGJlIGR1cGxpY2F0ZSBtZXNzYWdlIGhlYWRlcnMuICBBbHNvLAotaW4gZGljdGlvbmFyaWVzIHRoZXJlIGlzIG5vIGd1YXJhbnRlZWQgb3JkZXIgdG8gdGhlIGtleXMgcmV0dXJuZWQgYnkKLVxtZXRob2R7a2V5cygpfSwgYnV0IGluIGEgXGNsYXNze01lc3NhZ2V9IG9iamVjdCwgaGVhZGVycyBhcmUgYWx3YXlzCi1yZXR1cm5lZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXJlZCBpbiB0aGUgb3JpZ2luYWwgbWVzc2FnZSwgb3Igd2VyZQotYWRkZWQgdG8gdGhlIG1lc3NhZ2UgbGF0ZXIuICBBbnkgaGVhZGVyIGRlbGV0ZWQgYW5kIHRoZW4gcmUtYWRkZWQgYXJlCi1hbHdheXMgYXBwZW5kZWQgdG8gdGhlIGVuZCBvZiB0aGUgaGVhZGVyIGxpc3QuCi0KLVRoZXNlIHNlbWFudGljIGRpZmZlcmVuY2VzIGFyZSBpbnRlbnRpb25hbCBhbmQgYXJlIGJpYXNlZCB0b3dhcmQKLW1heGltYWwgY29udmVuaWVuY2UuCi0KLU5vdGUgdGhhdCBpbiBhbGwgY2FzZXMsIGFueSBlbnZlbG9wZSBoZWFkZXIgcHJlc2VudCBpbiB0aGUgbWVzc2FnZSBpcwotbm90IGluY2x1ZGVkIGluIHRoZSBtYXBwaW5nIGludGVyZmFjZS4KLQotXGJlZ2lue21ldGhvZGRlc2N9W01lc3NhZ2Vde19fbGVuX199e30KLVJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGhlYWRlcnMsIGluY2x1ZGluZyBkdXBsaWNhdGVzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTWVzc2FnZV17X19jb250YWluc19ffXtuYW1lfQotUmV0dXJuIHRydWUgaWYgdGhlIG1lc3NhZ2Ugb2JqZWN0IGhhcyBhIGZpZWxkIG5hbWVkIFx2YXJ7bmFtZX0uCi1NYXRjaGluZyBpcyBkb25lIGNhc2UtaW5zZW5zaXRpdmVseSBhbmQgXHZhcntuYW1lfSBzaG91bGQgbm90IGluY2x1ZGUgdGhlCi10cmFpbGluZyBjb2xvbi4gIFVzZWQgZm9yIHRoZSBcY29kZXtpbn0gb3BlcmF0b3IsCi1lLmcuOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pZiAnbWVzc2FnZS1pZCcgaW4gbXlNZXNzYWdlOgotICAgIHByaW50ICdNZXNzYWdlLUlEOicsIG15TWVzc2FnZVsnbWVzc2FnZS1pZCddCi1cZW5ke3ZlcmJhdGltfQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTWVzc2FnZV17X19nZXRpdGVtX199e25hbWV9Ci1SZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBuYW1lZCBoZWFkZXIgZmllbGQuICBcdmFye25hbWV9IHNob3VsZCBub3QKLWluY2x1ZGUgdGhlIGNvbG9uIGZpZWxkIHNlcGFyYXRvci4gIElmIHRoZSBoZWFkZXIgaXMgbWlzc2luZywKLVxjb2Rle05vbmV9IGlzIHJldHVybmVkOyBhIFxleGNlcHRpb257S2V5RXJyb3J9IGlzIG5ldmVyIHJhaXNlZC4KLQotTm90ZSB0aGF0IGlmIHRoZSBuYW1lZCBmaWVsZCBhcHBlYXJzIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBtZXNzYWdlJ3MKLWhlYWRlcnMsIGV4YWN0bHkgd2hpY2ggb2YgdGhvc2UgZmllbGQgdmFsdWVzIHdpbGwgYmUgcmV0dXJuZWQgaXMKLXVuZGVmaW5lZC4gIFVzZSB0aGUgXG1ldGhvZHtnZXRfYWxsKCl9IG1ldGhvZCB0byBnZXQgdGhlIHZhbHVlcyBvZiBhbGwKLXRoZSBleHRhbnQgbmFtZWQgaGVhZGVycy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W01lc3NhZ2Vde19fc2V0aXRlbV9ffXtuYW1lLCB2YWx9Ci1BZGQgYSBoZWFkZXIgdG8gdGhlIG1lc3NhZ2Ugd2l0aCBmaWVsZCBuYW1lIFx2YXJ7bmFtZX0gYW5kIHZhbHVlCi1cdmFye3ZhbH0uICBUaGUgZmllbGQgaXMgYXBwZW5kZWQgdG8gdGhlIGVuZCBvZiB0aGUgbWVzc2FnZSdzIGV4aXN0aW5nCi1maWVsZHMuCi0KLU5vdGUgdGhhdCB0aGlzIGRvZXMgXGVtcGh7bm90fSBvdmVyd3JpdGUgb3IgZGVsZXRlIGFueSBleGlzdGluZyBoZWFkZXIKLXdpdGggdGhlIHNhbWUgbmFtZS4gIElmIHlvdSB3YW50IHRvIGVuc3VyZSB0aGF0IHRoZSBuZXcgaGVhZGVyIGlzIHRoZQotb25seSBvbmUgcHJlc2VudCBpbiB0aGUgbWVzc2FnZSB3aXRoIGZpZWxkIG5hbWUKLVx2YXJ7bmFtZX0sIGRlbGV0ZSB0aGUgZmllbGQgZmlyc3QsIGUuZy46Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWRlbCBtc2dbJ3N1YmplY3QnXQotbXNnWydzdWJqZWN0J10gPSAnUHl0aG9uIHJvb2x6IScKLVxlbmR7dmVyYmF0aW19Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtNZXNzYWdlXXtfX2RlbGl0ZW1fX317bmFtZX0KLURlbGV0ZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIGZpZWxkIHdpdGggbmFtZSBcdmFye25hbWV9IGZyb20gdGhlCi1tZXNzYWdlJ3MgaGVhZGVycy4gIE5vIGV4Y2VwdGlvbiBpcyByYWlzZWQgaWYgdGhlIG5hbWVkIGZpZWxkIGlzbid0Ci1wcmVzZW50IGluIHRoZSBoZWFkZXJzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTWVzc2FnZV17aGFzX2tleX17bmFtZX0KLVJldHVybiB0cnVlIGlmIHRoZSBtZXNzYWdlIGNvbnRhaW5zIGEgaGVhZGVyIGZpZWxkIG5hbWVkIFx2YXJ7bmFtZX0sCi1vdGhlcndpc2UgcmV0dXJuIGZhbHNlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTWVzc2FnZV17a2V5c317fQotUmV0dXJuIGEgbGlzdCBvZiBhbGwgdGhlIG1lc3NhZ2UncyBoZWFkZXIgZmllbGQgbmFtZXMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtNZXNzYWdlXXt2YWx1ZXN9e30KLVJldHVybiBhIGxpc3Qgb2YgYWxsIHRoZSBtZXNzYWdlJ3MgZmllbGQgdmFsdWVzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTWVzc2FnZV17aXRlbXN9e30KLVJldHVybiBhIGxpc3Qgb2YgMi10dXBsZXMgY29udGFpbmluZyBhbGwgdGhlIG1lc3NhZ2UncyBmaWVsZCBoZWFkZXJzCi1hbmQgdmFsdWVzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTWVzc2FnZV17Z2V0fXtuYW1lXG9wdGlvbmFseywgZmFpbG9ian19Ci1SZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBuYW1lZCBoZWFkZXIgZmllbGQuICBUaGlzIGlzIGlkZW50aWNhbCB0bwotXG1ldGhvZHtfX2dldGl0ZW1fXygpfSBleGNlcHQgdGhhdCBvcHRpb25hbCBcdmFye2ZhaWxvYmp9IGlzIHJldHVybmVkCi1pZiB0aGUgbmFtZWQgaGVhZGVyIGlzIG1pc3NpbmcgKGRlZmF1bHRzIHRvIFxjb2Rle05vbmV9KS4KLVxlbmR7bWV0aG9kZGVzY30KLQotSGVyZSBhcmUgc29tZSBhZGRpdGlvbmFsIHVzZWZ1bCBtZXRob2RzOgotCi1cYmVnaW57bWV0aG9kZGVzY31bTWVzc2FnZV17Z2V0X2FsbH17bmFtZVxvcHRpb25hbHssIGZhaWxvYmp9fQotUmV0dXJuIGEgbGlzdCBvZiBhbGwgdGhlIHZhbHVlcyBmb3IgdGhlIGZpZWxkIG5hbWVkIFx2YXJ7bmFtZX0uCi1JZiB0aGVyZSBhcmUgbm8gc3VjaCBuYW1lZCBoZWFkZXJzIGluIHRoZSBtZXNzYWdlLCBcdmFye2ZhaWxvYmp9IGlzCi1yZXR1cm5lZCAoZGVmYXVsdHMgdG8gXGNvZGV7Tm9uZX0pLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTWVzc2FnZV17YWRkX2hlYWRlcn17X25hbWUsIF92YWx1ZSwgKipfcGFyYW1zfQotRXh0ZW5kZWQgaGVhZGVyIHNldHRpbmcuICBUaGlzIG1ldGhvZCBpcyBzaW1pbGFyIHRvCi1cbWV0aG9ke19fc2V0aXRlbV9fKCl9IGV4Y2VwdCB0aGF0IGFkZGl0aW9uYWwgaGVhZGVyIHBhcmFtZXRlcnMgY2FuIGJlCi1wcm92aWRlZCBhcyBrZXl3b3JkIGFyZ3VtZW50cy4gIFx2YXJ7X25hbWV9IGlzIHRoZSBoZWFkZXIgZmllbGQgdG8gYWRkCi1hbmQgXHZhcntfdmFsdWV9IGlzIHRoZSBcZW1waHtwcmltYXJ5fSB2YWx1ZSBmb3IgdGhlIGhlYWRlci4KLQotRm9yIGVhY2ggaXRlbSBpbiB0aGUga2V5d29yZCBhcmd1bWVudCBkaWN0aW9uYXJ5IFx2YXJ7X3BhcmFtc30sIHRoZQota2V5IGlzIHRha2VuIGFzIHRoZSBwYXJhbWV0ZXIgbmFtZSwgd2l0aCB1bmRlcnNjb3JlcyBjb252ZXJ0ZWQgdG8KLWRhc2hlcyAoc2luY2UgZGFzaGVzIGFyZSBpbGxlZ2FsIGluIFB5dGhvbiBpZGVudGlmaWVycykuICBOb3JtYWxseSwKLXRoZSBwYXJhbWV0ZXIgd2lsbCBiZSBhZGRlZCBhcyBcY29kZXtrZXk9InZhbHVlIn0gdW5sZXNzIHRoZSB2YWx1ZSBpcwotXGNvZGV7Tm9uZX0sIGluIHdoaWNoIGNhc2Ugb25seSB0aGUga2V5IHdpbGwgYmUgYWRkZWQuCi0KLUhlcmUncyBhbiBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1tc2cuYWRkX2hlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbicsICdhdHRhY2htZW50JywgZmlsZW5hbWU9J2J1ZC5naWYnKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhpcyB3aWxsIGFkZCBhIGhlYWRlciB0aGF0IGxvb2tzIGxpa2UKLQotXGJlZ2lue3ZlcmJhdGltfQotQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9ImJ1ZC5naWYiCi1cZW5ke3ZlcmJhdGltfQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTWVzc2FnZV17cmVwbGFjZV9oZWFkZXJ9e19uYW1lLCBfdmFsdWV9Ci1SZXBsYWNlIGEgaGVhZGVyLiAgUmVwbGFjZSB0aGUgZmlyc3QgaGVhZGVyIGZvdW5kIGluIHRoZSBtZXNzYWdlIHRoYXQKLW1hdGNoZXMgXHZhcntfbmFtZX0sIHJldGFpbmluZyBoZWFkZXIgb3JkZXIgYW5kIGZpZWxkIG5hbWUgY2FzZS4gIElmCi1ubyBtYXRjaGluZyBoZWFkZXIgd2FzIGZvdW5kLCBhIFxleGNlcHRpb257S2V5RXJyb3J9IGlzIHJhaXNlZC4KLQotXHZlcnNpb25hZGRlZHsyLjIuMn0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W01lc3NhZ2Vde2dldF9jb250ZW50X3R5cGV9e30KLVJldHVybiB0aGUgbWVzc2FnZSdzIGNvbnRlbnQgdHlwZS4gIFRoZSByZXR1cm5lZCBzdHJpbmcgaXMgY29lcmNlZCB0bwotbG93ZXIgY2FzZSBvZiB0aGUgZm9ybSBcbWltZXR5cGV7bWFpbnR5cGUvc3VidHlwZX0uICBJZiB0aGVyZSB3YXMgbm8KLVxtYWlsaGVhZGVye0NvbnRlbnQtVHlwZX0gaGVhZGVyIGluIHRoZSBtZXNzYWdlIHRoZSBkZWZhdWx0IHR5cGUgYXMKLWdpdmVuIGJ5IFxtZXRob2R7Z2V0X2RlZmF1bHRfdHlwZSgpfSB3aWxsIGJlIHJldHVybmVkLiAgU2luY2UKLWFjY29yZGluZyB0byBccmZjezIwNDV9LCBtZXNzYWdlcyBhbHdheXMgaGF2ZSBhIGRlZmF1bHQgdHlwZSwKLVxtZXRob2R7Z2V0X2NvbnRlbnRfdHlwZSgpfSB3aWxsIGFsd2F5cyByZXR1cm4gYSB2YWx1ZS4KLQotXHJmY3syMDQ1fSBkZWZpbmVzIGEgbWVzc2FnZSdzIGRlZmF1bHQgdHlwZSB0byBiZQotXG1pbWV0eXBle3RleHQvcGxhaW59IHVubGVzcyBpdCBhcHBlYXJzIGluc2lkZSBhCi1cbWltZXR5cGV7bXVsdGlwYXJ0L2RpZ2VzdH0gY29udGFpbmVyLCBpbiB3aGljaCBjYXNlIGl0IHdvdWxkIGJlCi1cbWltZXR5cGV7bWVzc2FnZS9yZmM4MjJ9LiAgSWYgdGhlIFxtYWlsaGVhZGVye0NvbnRlbnQtVHlwZX0gaGVhZGVyCi1oYXMgYW4gaW52YWxpZCB0eXBlIHNwZWNpZmljYXRpb24sIFxyZmN7MjA0NX0gbWFuZGF0ZXMgdGhhdCB0aGUKLWRlZmF1bHQgdHlwZSBiZSBcbWltZXR5cGV7dGV4dC9wbGFpbn0uCi0KLVx2ZXJzaW9uYWRkZWR7Mi4yLjJ9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtNZXNzYWdlXXtnZXRfY29udGVudF9tYWludHlwZX17fQotUmV0dXJuIHRoZSBtZXNzYWdlJ3MgbWFpbiBjb250ZW50IHR5cGUuICBUaGlzIGlzIHRoZQotXG1pbWV0eXBle21haW50eXBlfSBwYXJ0IG9mIHRoZSBzdHJpbmcgcmV0dXJuZWQgYnkKLVxtZXRob2R7Z2V0X2NvbnRlbnRfdHlwZSgpfS4KLQotXHZlcnNpb25hZGRlZHsyLjIuMn0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W01lc3NhZ2Vde2dldF9jb250ZW50X3N1YnR5cGV9e30KLVJldHVybiB0aGUgbWVzc2FnZSdzIHN1Yi1jb250ZW50IHR5cGUuICBUaGlzIGlzIHRoZSBcbWltZXR5cGV7c3VidHlwZX0KLXBhcnQgb2YgdGhlIHN0cmluZyByZXR1cm5lZCBieSBcbWV0aG9ke2dldF9jb250ZW50X3R5cGUoKX0uCi0KLVx2ZXJzaW9uYWRkZWR7Mi4yLjJ9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtNZXNzYWdlXXtnZXRfZGVmYXVsdF90eXBlfXt9Ci1SZXR1cm4gdGhlIGRlZmF1bHQgY29udGVudCB0eXBlLiAgTW9zdCBtZXNzYWdlcyBoYXZlIGEgZGVmYXVsdCBjb250ZW50Ci10eXBlIG9mIFxtaW1ldHlwZXt0ZXh0L3BsYWlufSwgZXhjZXB0IGZvciBtZXNzYWdlcyB0aGF0IGFyZSBzdWJwYXJ0cwotb2YgXG1pbWV0eXBle211bHRpcGFydC9kaWdlc3R9IGNvbnRhaW5lcnMuICBTdWNoIHN1YnBhcnRzIGhhdmUgYQotZGVmYXVsdCBjb250ZW50IHR5cGUgb2YgXG1pbWV0eXBle21lc3NhZ2UvcmZjODIyfS4KLQotXHZlcnNpb25hZGRlZHsyLjIuMn0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W01lc3NhZ2Vde3NldF9kZWZhdWx0X3R5cGV9e2N0eXBlfQotU2V0IHRoZSBkZWZhdWx0IGNvbnRlbnQgdHlwZS4gIFx2YXJ7Y3R5cGV9IHNob3VsZCBlaXRoZXIgYmUKLVxtaW1ldHlwZXt0ZXh0L3BsYWlufSBvciBcbWltZXR5cGV7bWVzc2FnZS9yZmM4MjJ9LCBhbHRob3VnaCB0aGlzIGlzCi1ub3QgZW5mb3JjZWQuICBUaGUgZGVmYXVsdCBjb250ZW50IHR5cGUgaXMgbm90IHN0b3JlZCBpbiB0aGUKLVxtYWlsaGVhZGVye0NvbnRlbnQtVHlwZX0gaGVhZGVyLgotCi1cdmVyc2lvbmFkZGVkezIuMi4yfQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTWVzc2FnZV17Z2V0X3BhcmFtc317XG9wdGlvbmFse2ZhaWxvYmpcb3B0aW9uYWx7LAotICAgIGhlYWRlclxvcHRpb25hbHssIHVucXVvdGV9fX19Ci1SZXR1cm4gdGhlIG1lc3NhZ2UncyBcbWFpbGhlYWRlcntDb250ZW50LVR5cGV9IHBhcmFtZXRlcnMsIGFzIGEgbGlzdC4gIFRoZQotZWxlbWVudHMgb2YgdGhlIHJldHVybmVkIGxpc3QgYXJlIDItdHVwbGVzIG9mIGtleS92YWx1ZSBwYWlycywgYXMKLXNwbGl0IG9uIHRoZSBcY2hhcmFjdGVyez19IHNpZ24uICBUaGUgbGVmdCBoYW5kIHNpZGUgb2YgdGhlCi1cY2hhcmFjdGVyez19IGlzIHRoZSBrZXksIHdoaWxlIHRoZSByaWdodCBoYW5kIHNpZGUgaXMgdGhlIHZhbHVlLiAgSWYKLXRoZXJlIGlzIG5vIFxjaGFyYWN0ZXJ7PX0gc2lnbiBpbiB0aGUgcGFyYW1ldGVyIHRoZSB2YWx1ZSBpcyB0aGUgZW1wdHkKLXN0cmluZywgb3RoZXJ3aXNlIHRoZSB2YWx1ZSBpcyBhcyBkZXNjcmliZWQgaW4gXG1ldGhvZHtnZXRfcGFyYW0oKX0gYW5kIGlzCi11bnF1b3RlZCBpZiBvcHRpb25hbCBcdmFye3VucXVvdGV9IGlzIFxjb2Rle1RydWV9ICh0aGUgZGVmYXVsdCkuCi0KLU9wdGlvbmFsIFx2YXJ7ZmFpbG9ian0gaXMgdGhlIG9iamVjdCB0byByZXR1cm4gaWYgdGhlcmUgaXMgbm8KLVxtYWlsaGVhZGVye0NvbnRlbnQtVHlwZX0gaGVhZGVyLiAgT3B0aW9uYWwgXHZhcntoZWFkZXJ9IGlzIHRoZSBoZWFkZXIgdG8KLXNlYXJjaCBpbnN0ZWFkIG9mIFxtYWlsaGVhZGVye0NvbnRlbnQtVHlwZX0uCi0KLVx2ZXJzaW9uY2hhbmdlZFtcdmFye3VucXVvdGV9IGFyZ3VtZW50IGFkZGVkXXsyLjIuMn0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W01lc3NhZ2Vde2dldF9wYXJhbX17cGFyYW1cb3B0aW9uYWx7LAotICAgIGZhaWxvYmpcb3B0aW9uYWx7LCBoZWFkZXJcb3B0aW9uYWx7LCB1bnF1b3RlfX19fQotUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgXG1haWxoZWFkZXJ7Q29udGVudC1UeXBlfSBoZWFkZXIncyBwYXJhbWV0ZXIKLVx2YXJ7cGFyYW19IGFzIGEgc3RyaW5nLiAgSWYgdGhlIG1lc3NhZ2UgaGFzIG5vIFxtYWlsaGVhZGVye0NvbnRlbnQtVHlwZX0KLWhlYWRlciBvciBpZiB0aGVyZSBpcyBubyBzdWNoIHBhcmFtZXRlciwgdGhlbiBcdmFye2ZhaWxvYmp9IGlzCi1yZXR1cm5lZCAoZGVmYXVsdHMgdG8gXGNvZGV7Tm9uZX0pLgotCi1PcHRpb25hbCBcdmFye2hlYWRlcn0gaWYgZ2l2ZW4sIHNwZWNpZmllcyB0aGUgbWVzc2FnZSBoZWFkZXIgdG8gdXNlCi1pbnN0ZWFkIG9mIFxtYWlsaGVhZGVye0NvbnRlbnQtVHlwZX0uCi0KLVBhcmFtZXRlciBrZXlzIGFyZSBhbHdheXMgY29tcGFyZWQgY2FzZSBpbnNlbnNpdGl2ZWx5LiAgVGhlIHJldHVybgotdmFsdWUgY2FuIGVpdGhlciBiZSBhIHN0cmluZywgb3IgYSAzLXR1cGxlIGlmIHRoZSBwYXJhbWV0ZXIgd2FzCi1ccmZjezIyMzF9IGVuY29kZWQuICBXaGVuIGl0J3MgYSAzLXR1cGxlLCB0aGUgZWxlbWVudHMgb2YgdGhlIHZhbHVlIGFyZSBvZgotdGhlIGZvcm0gXGNvZGV7KENIQVJTRVQsIExBTkdVQUdFLCBWQUxVRSl9LiAgTm90ZSB0aGF0IGJvdGggXGNvZGV7Q0hBUlNFVH0gYW5kCi1cY29kZXtMQU5HVUFHRX0gY2FuIGJlIFxjb2Rle05vbmV9LCBpbiB3aGljaCBjYXNlIHlvdSBzaG91bGQgY29uc2lkZXIKLVxjb2Rle1ZBTFVFfSB0byBiZSBlbmNvZGVkIGluIHRoZSBcY29kZXt1cy1hc2NpaX0gY2hhcnNldC4gIFlvdSBjYW4KLXVzdWFsbHkgaWdub3JlIFxjb2Rle0xBTkdVQUdFfS4KLQotSWYgeW91ciBhcHBsaWNhdGlvbiBkb2Vzbid0IGNhcmUgd2hldGhlciB0aGUgcGFyYW1ldGVyIHdhcyBlbmNvZGVkIGFzIGluCi1ccmZjezIyMzF9LCB5b3UgY2FuIGNvbGxhcHNlIHRoZSBwYXJhbWV0ZXIgdmFsdWUgYnkgY2FsbGluZwotXGZ1bmN0aW9ue2VtYWlsLlV0aWxzLmNvbGxhcHNlX3JmYzIyMzFfdmFsdWUoKX0sIHBhc3NpbmcgaW4gdGhlIHJldHVybiB2YWx1ZQotZnJvbSBcbWV0aG9ke2dldF9wYXJhbSgpfS4gIFRoaXMgd2lsbCByZXR1cm4gYSBzdWl0YWJseSBkZWNvZGVkIFVuaWNvZGUgc3RyaW5nCi13aG4gdGhlIHZhbHVlIGlzIGEgdHVwbGUsIG9yIHRoZSBvcmlnaW5hbCBzdHJpbmcgdW5xdW90ZWQgaWYgaXQgaXNuJ3QuICBGb3IKLWV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXJhd3BhcmFtID0gbXNnLmdldF9wYXJhbSgnZm9vJykKLXBhcmFtID0gZW1haWwuVXRpbHMuY29sbGFwc2VfcmZjMjIzMV92YWx1ZShyYXdwYXJhbSkKLVxlbmR7dmVyYmF0aW19Ci0KLUluIGFueSBjYXNlLCB0aGUgcGFyYW1ldGVyIHZhbHVlIChlaXRoZXIgdGhlIHJldHVybmVkIHN0cmluZywgb3IgdGhlCi1cY29kZXtWQUxVRX0gaXRlbSBpbiB0aGUgMy10dXBsZSkgaXMgYWx3YXlzIHVucXVvdGVkLCB1bmxlc3MKLVx2YXJ7dW5xdW90ZX0gaXMgc2V0IHRvIFxjb2Rle0ZhbHNlfS4KLQotXHZlcnNpb25jaGFuZ2VkW1x2YXJ7dW5xdW90ZX0gYXJndW1lbnQgYWRkZWQsIGFuZCAzLXR1cGxlIHJldHVybiB2YWx1ZQotcG9zc2libGVdezIuMi4yfQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTWVzc2FnZV17c2V0X3BhcmFtfXtwYXJhbSwgdmFsdWVcb3B0aW9uYWx7LAotICAgIGhlYWRlclxvcHRpb25hbHssIHJlcXVvdGVcb3B0aW9uYWx7LCBjaGFyc2V0XG9wdGlvbmFseywgbGFuZ3VhZ2V9fX19fQotCi1TZXQgYSBwYXJhbWV0ZXIgaW4gdGhlIFxtYWlsaGVhZGVye0NvbnRlbnQtVHlwZX0gaGVhZGVyLiAgSWYgdGhlCi1wYXJhbWV0ZXIgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGhlYWRlciwgaXRzIHZhbHVlIHdpbGwgYmUgcmVwbGFjZWQKLXdpdGggXHZhcnt2YWx1ZX0uICBJZiB0aGUgXG1haWxoZWFkZXJ7Q29udGVudC1UeXBlfSBoZWFkZXIgYXMgbm90IHlldAotYmVlbiBkZWZpbmVkIGZvciB0aGlzIG1lc3NhZ2UsIGl0IHdpbGwgYmUgc2V0IHRvIFxtaW1ldHlwZXt0ZXh0L3BsYWlufQotYW5kIHRoZSBuZXcgcGFyYW1ldGVyIHZhbHVlIHdpbGwgYmUgYXBwZW5kZWQgYXMgcGVyIFxyZmN7MjA0NX0uCi0KLU9wdGlvbmFsIFx2YXJ7aGVhZGVyfSBzcGVjaWZpZXMgYW4gYWx0ZXJuYXRpdmUgaGVhZGVyIHRvCi1cbWFpbGhlYWRlcntDb250ZW50LVR5cGV9LCBhbmQgYWxsIHBhcmFtZXRlcnMgd2lsbCBiZSBxdW90ZWQgYXMKLW5lY2Vzc2FyeSB1bmxlc3Mgb3B0aW9uYWwgXHZhcntyZXF1b3RlfSBpcyBcY29kZXtGYWxzZX0gKHRoZSBkZWZhdWx0Ci1pcyBcY29kZXtUcnVlfSkuCi0KLUlmIG9wdGlvbmFsIFx2YXJ7Y2hhcnNldH0gaXMgc3BlY2lmaWVkLCB0aGUgcGFyYW1ldGVyIHdpbGwgYmUgZW5jb2RlZAotYWNjb3JkaW5nIHRvIFxyZmN7MjIzMX0uIE9wdGlvbmFsIFx2YXJ7bGFuZ3VhZ2V9IHNwZWNpZmllcyB0aGUgUkZDCi0yMjMxIGxhbmd1YWdlLCBkZWZhdWx0aW5nIHRvIHRoZSBlbXB0eSBzdHJpbmcuICBCb3RoIFx2YXJ7Y2hhcnNldH0gYW5kCi1cdmFye2xhbmd1YWdlfSBzaG91bGQgYmUgc3RyaW5ncy4KLQotXHZlcnNpb25hZGRlZHsyLjIuMn0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W01lc3NhZ2Vde2RlbF9wYXJhbX17cGFyYW1cb3B0aW9uYWx7LCBoZWFkZXJcb3B0aW9uYWx7LAotICAgIHJlcXVvdGV9fX0KLVJlbW92ZSB0aGUgZ2l2ZW4gcGFyYW1ldGVyIGNvbXBsZXRlbHkgZnJvbSB0aGUKLVxtYWlsaGVhZGVye0NvbnRlbnQtVHlwZX0gaGVhZGVyLiAgVGhlIGhlYWRlciB3aWxsIGJlIHJlLXdyaXR0ZW4gaW4KLXBsYWNlIHdpdGhvdXQgdGhlIHBhcmFtZXRlciBvciBpdHMgdmFsdWUuICBBbGwgdmFsdWVzIHdpbGwgYmUgcXVvdGVkCi1hcyBuZWNlc3NhcnkgdW5sZXNzIFx2YXJ7cmVxdW90ZX0gaXMgXGNvZGV7RmFsc2V9ICh0aGUgZGVmYXVsdCBpcwotXGNvZGV7VHJ1ZX0pLiAgT3B0aW9uYWwgXHZhcntoZWFkZXJ9IHNwZWNpZmllcyBhbiBhbHRlcm5hdGl2ZSB0bwotXG1haWxoZWFkZXJ7Q29udGVudC1UeXBlfS4KLQotXHZlcnNpb25hZGRlZHsyLjIuMn0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W01lc3NhZ2Vde3NldF90eXBlfXt0eXBlXG9wdGlvbmFseywgaGVhZGVyfVxvcHRpb25hbHssCi0gICAgcmVxdW90ZX19Ci1TZXQgdGhlIG1haW4gdHlwZSBhbmQgc3VidHlwZSBmb3IgdGhlIFxtYWlsaGVhZGVye0NvbnRlbnQtVHlwZX0KLWhlYWRlci4gXHZhcnt0eXBlfSBtdXN0IGJlIGEgc3RyaW5nIGluIHRoZSBmb3JtCi1cbWltZXR5cGV7bWFpbnR5cGUvc3VidHlwZX0sIG90aGVyd2lzZSBhIFxleGNlcHRpb257VmFsdWVFcnJvcn0gaXMKLXJhaXNlZC4KLQotVGhpcyBtZXRob2QgcmVwbGFjZXMgdGhlIFxtYWlsaGVhZGVye0NvbnRlbnQtVHlwZX0gaGVhZGVyLCBrZWVwaW5nIGFsbAotdGhlIHBhcmFtZXRlcnMgaW4gcGxhY2UuICBJZiBcdmFye3JlcXVvdGV9IGlzIFxjb2Rle0ZhbHNlfSwgdGhpcwotbGVhdmVzIHRoZSBleGlzdGluZyBoZWFkZXIncyBxdW90aW5nIGFzIGlzLCBvdGhlcndpc2UgdGhlIHBhcmFtZXRlcnMKLXdpbGwgYmUgcXVvdGVkICh0aGUgZGVmYXVsdCkuCi0KLUFuIGFsdGVybmF0aXZlIGhlYWRlciBjYW4gYmUgc3BlY2lmaWVkIGluIHRoZSBcdmFye2hlYWRlcn0gYXJndW1lbnQuCi1XaGVuIHRoZSBcbWFpbGhlYWRlcntDb250ZW50LVR5cGV9IGhlYWRlciBpcyBzZXQgYQotXG1haWxoZWFkZXJ7TUlNRS1WZXJzaW9ufSBoZWFkZXIgaXMgYWxzbyBhZGRlZC4KLQotXHZlcnNpb25hZGRlZHsyLjIuMn0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W01lc3NhZ2Vde2dldF9maWxlbmFtZX17XG9wdGlvbmFse2ZhaWxvYmp9fQotUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgXGNvZGV7ZmlsZW5hbWV9IHBhcmFtZXRlciBvZiB0aGUKLVxtYWlsaGVhZGVye0NvbnRlbnQtRGlzcG9zaXRpb259IGhlYWRlciBvZiB0aGUgbWVzc2FnZS4gIElmIHRoZSBoZWFkZXIgZG9lcwotbm90IGhhdmUgYSBcY29kZXtmaWxlbmFtZX0gcGFyYW1ldGVyLCB0aGlzIG1ldGhvZCBmYWxscyBiYWNrIHRvIGxvb2tpbmcgZm9yCi10aGUgXGNvZGV7bmFtZX0gcGFyYW1ldGVyLiAgSWYgbmVpdGhlciBpcyBmb3VuZCwgb3IgdGhlIGhlYWRlciBpcyBtaXNzaW5nLAotdGhlbiBcdmFye2ZhaWxvYmp9IGlzIHJldHVybmVkLiAgVGhlIHJldHVybmVkIHN0cmluZyB3aWxsIGFsd2F5cyBiZSB1bnF1b3RlZAotYXMgcGVyIFxtZXRob2R7VXRpbHMudW5xdW90ZSgpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W01lc3NhZ2Vde2dldF9ib3VuZGFyeX17XG9wdGlvbmFse2ZhaWxvYmp9fQotUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgXGNvZGV7Ym91bmRhcnl9IHBhcmFtZXRlciBvZiB0aGUKLVxtYWlsaGVhZGVye0NvbnRlbnQtVHlwZX0gaGVhZGVyIG9mIHRoZSBtZXNzYWdlLCBvciBcdmFye2ZhaWxvYmp9IGlmIGVpdGhlcgotdGhlIGhlYWRlciBpcyBtaXNzaW5nLCBvciBoYXMgbm8gXGNvZGV7Ym91bmRhcnl9IHBhcmFtZXRlci4gIFRoZQotcmV0dXJuZWQgc3RyaW5nIHdpbGwgYWx3YXlzIGJlIHVucXVvdGVkIGFzIHBlcgotXG1ldGhvZHtVdGlscy51bnF1b3RlKCl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTWVzc2FnZV17c2V0X2JvdW5kYXJ5fXtib3VuZGFyeX0KLVNldCB0aGUgXGNvZGV7Ym91bmRhcnl9IHBhcmFtZXRlciBvZiB0aGUgXG1haWxoZWFkZXJ7Q29udGVudC1UeXBlfQotaGVhZGVyIHRvIFx2YXJ7Ym91bmRhcnl9LiAgXG1ldGhvZHtzZXRfYm91bmRhcnkoKX0gd2lsbCBhbHdheXMgcXVvdGUKLVx2YXJ7Ym91bmRhcnl9IGlmIG5lY2Vzc2FyeS4gIEEgXGV4Y2VwdGlvbntIZWFkZXJQYXJzZUVycm9yfSBpcyByYWlzZWQKLWlmIHRoZSBtZXNzYWdlIG9iamVjdCBoYXMgbm8gXG1haWxoZWFkZXJ7Q29udGVudC1UeXBlfSBoZWFkZXIuCi0KLU5vdGUgdGhhdCB1c2luZyB0aGlzIG1ldGhvZCBpcyBzdWJ0bHkgZGlmZmVyZW50IHRoYW4gZGVsZXRpbmcgdGhlIG9sZAotXG1haWxoZWFkZXJ7Q29udGVudC1UeXBlfSBoZWFkZXIgYW5kIGFkZGluZyBhIG5ldyBvbmUgd2l0aCB0aGUgbmV3IGJvdW5kYXJ5Ci12aWEgXG1ldGhvZHthZGRfaGVhZGVyKCl9LCBiZWNhdXNlIFxtZXRob2R7c2V0X2JvdW5kYXJ5KCl9IHByZXNlcnZlcyB0aGUKLW9yZGVyIG9mIHRoZSBcbWFpbGhlYWRlcntDb250ZW50LVR5cGV9IGhlYWRlciBpbiB0aGUgbGlzdCBvZiBoZWFkZXJzLgotSG93ZXZlciwgaXQgZG9lcyBcZW1waHtub3R9IHByZXNlcnZlIGFueSBjb250aW51YXRpb24gbGluZXMgd2hpY2ggbWF5Ci1oYXZlIGJlZW4gcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgXG1haWxoZWFkZXJ7Q29udGVudC1UeXBlfSBoZWFkZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtNZXNzYWdlXXtnZXRfY29udGVudF9jaGFyc2V0fXtcb3B0aW9uYWx7ZmFpbG9ian19Ci1SZXR1cm4gdGhlIFxjb2Rle2NoYXJzZXR9IHBhcmFtZXRlciBvZiB0aGUgXG1haWxoZWFkZXJ7Q29udGVudC1UeXBlfQotaGVhZGVyLCBjb2VyY2VkIHRvIGxvd2VyIGNhc2UuICBJZiB0aGVyZSBpcyBubwotXG1haWxoZWFkZXJ7Q29udGVudC1UeXBlfSBoZWFkZXIsIG9yIGlmIHRoYXQgaGVhZGVyIGhhcyBubwotXGNvZGV7Y2hhcnNldH0gcGFyYW1ldGVyLCBcdmFye2ZhaWxvYmp9IGlzIHJldHVybmVkLgotCi1Ob3RlIHRoYXQgdGhpcyBtZXRob2QgZGlmZmVycyBmcm9tIFxtZXRob2R7Z2V0X2NoYXJzZXQoKX0gd2hpY2gKLXJldHVybnMgdGhlIFxjbGFzc3tDaGFyc2V0fSBpbnN0YW5jZSBmb3IgdGhlIGRlZmF1bHQgZW5jb2Rpbmcgb2YgdGhlCi1tZXNzYWdlIGJvZHkuCi0KLVx2ZXJzaW9uYWRkZWR7Mi4yLjJ9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtNZXNzYWdlXXtnZXRfY2hhcnNldHN9e1xvcHRpb25hbHtmYWlsb2JqfX0KLVJldHVybiBhIGxpc3QgY29udGFpbmluZyB0aGUgY2hhcmFjdGVyIHNldCBuYW1lcyBpbiB0aGUgbWVzc2FnZS4gIElmCi10aGUgbWVzc2FnZSBpcyBhIFxtaW1ldHlwZXttdWx0aXBhcnR9LCB0aGVuIHRoZSBsaXN0IHdpbGwgY29udGFpbiBvbmUKLWVsZW1lbnQgZm9yIGVhY2ggc3VicGFydCBpbiB0aGUgcGF5bG9hZCwgb3RoZXJ3aXNlLCBpdCB3aWxsIGJlIGEgbGlzdAotb2YgbGVuZ3RoIDEuCi0KLUVhY2ggaXRlbSBpbiB0aGUgbGlzdCB3aWxsIGJlIGEgc3RyaW5nIHdoaWNoIGlzIHRoZSB2YWx1ZSBvZiB0aGUKLVxjb2Rle2NoYXJzZXR9IHBhcmFtZXRlciBpbiB0aGUgXG1haWxoZWFkZXJ7Q29udGVudC1UeXBlfSBoZWFkZXIgZm9yIHRoZQotcmVwcmVzZW50ZWQgc3VicGFydC4gIEhvd2V2ZXIsIGlmIHRoZSBzdWJwYXJ0IGhhcyBubwotXG1haWxoZWFkZXJ7Q29udGVudC1UeXBlfSBoZWFkZXIsIG5vIFxjb2Rle2NoYXJzZXR9IHBhcmFtZXRlciwgb3IgaXMgbm90IG9mCi10aGUgXG1pbWV0eXBle3RleHR9IG1haW4gTUlNRSB0eXBlLCB0aGVuIHRoYXQgaXRlbSBpbiB0aGUgcmV0dXJuZWQgbGlzdAotd2lsbCBiZSBcdmFye2ZhaWxvYmp9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTWVzc2FnZV17d2Fsa317fQotVGhlIFxtZXRob2R7d2FsaygpfSBtZXRob2QgaXMgYW4gYWxsLXB1cnBvc2UgZ2VuZXJhdG9yIHdoaWNoIGNhbiBiZQotdXNlZCB0byBpdGVyYXRlIG92ZXIgYWxsIHRoZSBwYXJ0cyBhbmQgc3VicGFydHMgb2YgYSBtZXNzYWdlIG9iamVjdAotdHJlZSwgaW4gZGVwdGgtZmlyc3QgdHJhdmVyc2FsIG9yZGVyLiAgWW91IHdpbGwgdHlwaWNhbGx5IHVzZQotXG1ldGhvZHt3YWxrKCl9IGFzIHRoZSBpdGVyYXRvciBpbiBhIFxjb2Rle2Zvcn0gbG9vcDsgZWFjaAotaXRlcmF0aW9uIHJldHVybnMgdGhlIG5leHQgc3VicGFydC4KLQotSGVyZSdzIGFuIGV4YW1wbGUgdGhhdCBwcmludHMgdGhlIE1JTUUgdHlwZSBvZiBldmVyeSBwYXJ0IG9mIGEKLW11bHRpcGFydCBtZXNzYWdlIHN0cnVjdHVyZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGZvciBwYXJ0IGluIG1zZy53YWxrKCk6Ci0uLi4gICAgIHByaW50IHBhcnQuZ2V0X2NvbnRlbnRfdHlwZSgpCi1tdWx0aXBhcnQvcmVwb3J0Ci10ZXh0L3BsYWluCi1tZXNzYWdlL2RlbGl2ZXJ5LXN0YXR1cwotdGV4dC9wbGFpbgotdGV4dC9wbGFpbgotbWVzc2FnZS9yZmM4MjIKLVxlbmR7dmVyYmF0aW19Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVx2ZXJzaW9uY2hhbmdlZFtUaGUgcHJldmlvdXNseSBkZXByZWNhdGVkIG1ldGhvZHMgXG1ldGhvZHtnZXRfdHlwZSgpfSwKLVxtZXRob2R7Z2V0X21haW5fdHlwZSgpfSwgYW5kIFxtZXRob2R7Z2V0X3N1YnR5cGUoKX0gd2VyZSByZW1vdmVkXXsyLjV9Ci0KLVxjbGFzc3tNZXNzYWdlfSBvYmplY3RzIGNhbiBhbHNvIG9wdGlvbmFsbHkgY29udGFpbiB0d28gaW5zdGFuY2UKLWF0dHJpYnV0ZXMsIHdoaWNoIGNhbiBiZSB1c2VkIHdoZW4gZ2VuZXJhdGluZyB0aGUgcGxhaW4gdGV4dCBvZiBhIE1JTUUKLW1lc3NhZ2UuCi0KLVxiZWdpbntkYXRhZGVzY317cHJlYW1ibGV9Ci1UaGUgZm9ybWF0IG9mIGEgTUlNRSBkb2N1bWVudCBhbGxvd3MgZm9yIHNvbWUgdGV4dCBiZXR3ZWVuIHRoZSBibGFuawotbGluZSBmb2xsb3dpbmcgdGhlIGhlYWRlcnMsIGFuZCB0aGUgZmlyc3QgbXVsdGlwYXJ0IGJvdW5kYXJ5IHN0cmluZy4KLU5vcm1hbGx5LCB0aGlzIHRleHQgaXMgbmV2ZXIgdmlzaWJsZSBpbiBhIE1JTUUtYXdhcmUgbWFpbCByZWFkZXIKLWJlY2F1c2UgaXQgZmFsbHMgb3V0c2lkZSB0aGUgc3RhbmRhcmQgTUlNRSBhcm1vci4gIEhvd2V2ZXIsIHdoZW4KLXZpZXdpbmcgdGhlIHJhdyB0ZXh0IG9mIHRoZSBtZXNzYWdlLCBvciB3aGVuIHZpZXdpbmcgdGhlIG1lc3NhZ2UgaW4gYQotbm9uLU1JTUUgYXdhcmUgcmVhZGVyLCB0aGlzIHRleHQgY2FuIGJlY29tZSB2aXNpYmxlLgotCi1UaGUgXHZhcntwcmVhbWJsZX0gYXR0cmlidXRlIGNvbnRhaW5zIHRoaXMgbGVhZGluZyBleHRyYS1hcm1vciB0ZXh0Ci1mb3IgTUlNRSBkb2N1bWVudHMuICBXaGVuIHRoZSBcY2xhc3N7UGFyc2VyfSBkaXNjb3ZlcnMgc29tZSB0ZXh0IGFmdGVyCi10aGUgaGVhZGVycyBidXQgYmVmb3JlIHRoZSBmaXJzdCBib3VuZGFyeSBzdHJpbmcsIGl0IGFzc2lnbnMgdGhpcyB0ZXh0Ci10byB0aGUgbWVzc2FnZSdzIFx2YXJ7cHJlYW1ibGV9IGF0dHJpYnV0ZS4gIFdoZW4gdGhlIFxjbGFzc3tHZW5lcmF0b3J9Ci1pcyB3cml0aW5nIG91dCB0aGUgcGxhaW4gdGV4dCByZXByZXNlbnRhdGlvbiBvZiBhIE1JTUUgbWVzc2FnZSwgYW5kIGl0Ci1maW5kcyB0aGUgbWVzc2FnZSBoYXMgYSBcdmFye3ByZWFtYmxlfSBhdHRyaWJ1dGUsIGl0IHdpbGwgd3JpdGUgdGhpcwotdGV4dCBpbiB0aGUgYXJlYSBiZXR3ZWVuIHRoZSBoZWFkZXJzIGFuZCB0aGUgZmlyc3QgYm91bmRhcnkuICBTZWUKLVxyZWZtb2R1bGV7ZW1haWwucGFyc2VyfSBhbmQgXHJlZm1vZHVsZXtlbWFpbC5nZW5lcmF0b3J9IGZvciBkZXRhaWxzLgotCi1Ob3RlIHRoYXQgaWYgdGhlIG1lc3NhZ2Ugb2JqZWN0IGhhcyBubyBwcmVhbWJsZSwgdGhlCi1cdmFye3ByZWFtYmxlfSBhdHRyaWJ1dGUgd2lsbCBiZSBcY29kZXtOb25lfS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317ZXBpbG9ndWV9Ci1UaGUgXHZhcntlcGlsb2d1ZX0gYXR0cmlidXRlIGFjdHMgdGhlIHNhbWUgd2F5IGFzIHRoZSBcdmFye3ByZWFtYmxlfQotYXR0cmlidXRlLCBleGNlcHQgdGhhdCBpdCBjb250YWlucyB0ZXh0IHRoYXQgYXBwZWFycyBiZXR3ZWVuIHRoZSBsYXN0Ci1ib3VuZGFyeSBhbmQgdGhlIGVuZCBvZiB0aGUgbWVzc2FnZS4KLQotXHZlcnNpb25jaGFuZ2VkW1lvdSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIGVwaWxvZ3VlIHRvIHRoZSBlbXB0eSBzdHJpbmcgaW4KLW9yZGVyIGZvciB0aGUgXGNsYXNze0dlbmVyYXRvcn0gdG8gcHJpbnQgYSBuZXdsaW5lIGF0IHRoZSBlbmQgb2YgdGhlCi1maWxlXXsyLjV9Ci1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e2RlZmVjdHN9Ci1UaGUgXHZhcntkZWZlY3RzfSBhdHRyaWJ1dGUgY29udGFpbnMgYSBsaXN0IG9mIGFsbCB0aGUgcHJvYmxlbXMgZm91bmQgd2hlbgotcGFyc2luZyB0aGlzIG1lc3NhZ2UuICBTZWUgXHJlZm1vZHVsZXtlbWFpbC5lcnJvcnN9IGZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uCi1vZiB0aGUgcG9zc2libGUgcGFyc2luZyBkZWZlY3RzLgotCi1cdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7ZGF0YWRlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2VtYWlsbWltZWJhc2UudGV4IGIvRG9jL2xpYi9lbWFpbG1pbWViYXNlLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczNWJlMy4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2VtYWlsbWltZWJhc2UudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtlbWFpbC5taW1lfQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2VtYWlsLm1pbWUuYmFzZX0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtlbWFpbC5taW1lLm5vbm11bHRpcGFydH0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtlbWFpbC5taW1lLm11bHRpcGFydH0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtlbWFpbC5taW1lLmF1ZGlvfQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2VtYWlsLm1pbWUuaW1hZ2V9Ci1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZW1haWwubWltZS5tZXNzYWdlfQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2VtYWlsLm1pbWUudGV4dH0KLU9yZGluYXJpbHksIHlvdSBnZXQgYSBtZXNzYWdlIG9iamVjdCBzdHJ1Y3R1cmUgYnkgcGFzc2luZyBhIGZpbGUgb3IKLXNvbWUgdGV4dCB0byBhIHBhcnNlciwgd2hpY2ggcGFyc2VzIHRoZSB0ZXh0IGFuZCByZXR1cm5zIHRoZSByb290Ci1tZXNzYWdlIG9iamVjdC4gIEhvd2V2ZXIgeW91IGNhbiBhbHNvIGJ1aWxkIGEgY29tcGxldGUgbWVzc2FnZQotc3RydWN0dXJlIGZyb20gc2NyYXRjaCwgb3IgZXZlbiBpbmRpdmlkdWFsIFxjbGFzc3tNZXNzYWdlfSBvYmplY3RzIGJ5Ci1oYW5kLiAgSW4gZmFjdCwgeW91IGNhbiBhbHNvIHRha2UgYW4gZXhpc3Rpbmcgc3RydWN0dXJlIGFuZCBhZGQgbmV3Ci1cY2xhc3N7TWVzc2FnZX0gb2JqZWN0cywgbW92ZSB0aGVtIGFyb3VuZCwgZXRjLiAgVGhpcyBtYWtlcyBhIHZlcnkKLWNvbnZlbmllbnQgaW50ZXJmYWNlIGZvciBzbGljaW5nLWFuZC1kaWNpbmcgTUlNRSBtZXNzYWdlcy4KLQotWW91IGNhbiBjcmVhdGUgYSBuZXcgb2JqZWN0IHN0cnVjdHVyZSBieSBjcmVhdGluZyBcY2xhc3N7TWVzc2FnZX0gaW5zdGFuY2VzLAotYWRkaW5nIGF0dGFjaG1lbnRzIGFuZCBhbGwgdGhlIGFwcHJvcHJpYXRlIGhlYWRlcnMgbWFudWFsbHkuICBGb3IgTUlNRQotbWVzc2FnZXMgdGhvdWdoLCB0aGUgXG1vZHVsZXtlbWFpbH0gcGFja2FnZSBwcm92aWRlcyBzb21lIGNvbnZlbmllbnQKLXN1YmNsYXNzZXMgdG8gbWFrZSB0aGluZ3MgZWFzaWVyLgotCi1IZXJlIGFyZSB0aGUgY2xhc3NlczoKLQotXGJlZ2lue2NsYXNzZGVzY317TUlNRUJhc2V9e19tYWludHlwZSwgX3N1YnR5cGUsICoqX3BhcmFtc30KLU1vZHVsZTogXG1vZHVsZXtlbWFpbC5taW1lLmJhc2V9Ci0KLVRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGFsbCB0aGUgTUlNRS1zcGVjaWZpYyBzdWJjbGFzc2VzIG9mCi1cY2xhc3N7TWVzc2FnZX0uICBPcmRpbmFyaWx5IHlvdSB3b24ndCBjcmVhdGUgaW5zdGFuY2VzIHNwZWNpZmljYWxseQotb2YgXGNsYXNze01JTUVCYXNlfSwgYWx0aG91Z2ggeW91IGNvdWxkLiAgXGNsYXNze01JTUVCYXNlfSBpcyBwcm92aWRlZAotcHJpbWFyaWx5IGFzIGEgY29udmVuaWVudCBiYXNlIGNsYXNzIGZvciBtb3JlIHNwZWNpZmljIE1JTUUtYXdhcmUKLXN1YmNsYXNzZXMuCi0KLVx2YXJ7X21haW50eXBlfSBpcyB0aGUgXG1haWxoZWFkZXJ7Q29udGVudC1UeXBlfSBtYWpvciB0eXBlCi0oZS5nLiBcbWltZXR5cGV7dGV4dH0gb3IgXG1pbWV0eXBle2ltYWdlfSksIGFuZCBcdmFye19zdWJ0eXBlfSBpcyB0aGUKLVxtYWlsaGVhZGVye0NvbnRlbnQtVHlwZX0gbWlub3IgdHlwZSAKLShlLmcuIFxtaW1ldHlwZXtwbGFpbn0gb3IgXG1pbWV0eXBle2dpZn0pLiAgXHZhcntfcGFyYW1zfSBpcyBhIHBhcmFtZXRlcgota2V5L3ZhbHVlIGRpY3Rpb25hcnkgYW5kIGlzIHBhc3NlZCBkaXJlY3RseSB0bwotXG1ldGhvZHtNZXNzYWdlLmFkZF9oZWFkZXIoKX0uCi0KLVRoZSBcY2xhc3N7TUlNRUJhc2V9IGNsYXNzIGFsd2F5cyBhZGRzIGEgXG1haWxoZWFkZXJ7Q29udGVudC1UeXBlfSBoZWFkZXIKLShiYXNlZCBvbiBcdmFye19tYWludHlwZX0sIFx2YXJ7X3N1YnR5cGV9LCBhbmQgXHZhcntfcGFyYW1zfSksIGFuZCBhCi1cbWFpbGhlYWRlcntNSU1FLVZlcnNpb259IGhlYWRlciAoYWx3YXlzIHNldCB0byBcY29kZXsxLjB9KS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtNSU1FTm9uTXVsdGlwYXJ0fXt9Ci1Nb2R1bGU6IFxtb2R1bGV7ZW1haWwubWltZS5ub25tdWx0aXBhcnR9Ci0KLUEgc3ViY2xhc3Mgb2YgXGNsYXNze01JTUVCYXNlfSwgdGhpcyBpcyBhbiBpbnRlcm1lZGlhdGUgYmFzZSBjbGFzcyBmb3IKLU1JTUUgbWVzc2FnZXMgdGhhdCBhcmUgbm90IFxtaW1ldHlwZXttdWx0aXBhcnR9LiAgVGhlIHByaW1hcnkgcHVycG9zZQotb2YgdGhpcyBjbGFzcyBpcyB0byBwcmV2ZW50IHRoZSB1c2Ugb2YgdGhlIFxtZXRob2R7YXR0YWNoKCl9IG1ldGhvZCwKLXdoaWNoIG9ubHkgbWFrZXMgc2Vuc2UgZm9yIFxtaW1ldHlwZXttdWx0aXBhcnR9IG1lc3NhZ2VzLiAgSWYKLVxtZXRob2R7YXR0YWNoKCl9IGlzIGNhbGxlZCwgYSBcZXhjZXB0aW9ue011bHRpcGFydENvbnZlcnNpb25FcnJvcn0KLWV4Y2VwdGlvbiBpcyByYWlzZWQuCi0KLVx2ZXJzaW9uYWRkZWR7Mi4yLjJ9Ci1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317TUlNRU11bHRpcGFydH17XG9wdGlvbmFse3N1YnR5cGVcb3B0aW9uYWx7LAotICAgIGJvdW5kYXJ5XG9wdGlvbmFseywgX3N1YnBhcnRzXG9wdGlvbmFseywgX3BhcmFtc319fX19Ci1Nb2R1bGU6IFxtb2R1bGV7ZW1haWwubWltZS5tdWx0aXBhcnR9Ci0KLUEgc3ViY2xhc3Mgb2YgXGNsYXNze01JTUVCYXNlfSwgdGhpcyBpcyBhbiBpbnRlcm1lZGlhdGUgYmFzZSBjbGFzcyBmb3IKLU1JTUUgbWVzc2FnZXMgdGhhdCBhcmUgXG1pbWV0eXBle211bHRpcGFydH0uICBPcHRpb25hbCBcdmFye19zdWJ0eXBlfQotZGVmYXVsdHMgdG8gXG1pbWV0eXBle21peGVkfSwgYnV0IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHN1YnR5cGUKLW9mIHRoZSBtZXNzYWdlLiAgQSBcbWFpbGhlYWRlcntDb250ZW50LVR5cGV9IGhlYWRlciBvZgotXG1pbWV0eXBle211bHRpcGFydC99XHZhcntfc3VidHlwZX0gd2lsbCBiZSBhZGRlZCB0byB0aGUgbWVzc2FnZQotb2JqZWN0LiAgQSBcbWFpbGhlYWRlcntNSU1FLVZlcnNpb259IGhlYWRlciB3aWxsIGFsc28gYmUgYWRkZWQuCi0KLU9wdGlvbmFsIFx2YXJ7Ym91bmRhcnl9IGlzIHRoZSBtdWx0aXBhcnQgYm91bmRhcnkgc3RyaW5nLiAgV2hlbgotXGNvZGV7Tm9uZX0gKHRoZSBkZWZhdWx0KSwgdGhlIGJvdW5kYXJ5IGlzIGNhbGN1bGF0ZWQgd2hlbiBuZWVkZWQuCi0KLVx2YXJ7X3N1YnBhcnRzfSBpcyBhIHNlcXVlbmNlIG9mIGluaXRpYWwgc3VicGFydHMgZm9yIHRoZSBwYXlsb2FkLiAgSXQKLW11c3QgYmUgcG9zc2libGUgdG8gY29udmVydCB0aGlzIHNlcXVlbmNlIHRvIGEgbGlzdC4gIFlvdSBjYW4gYWx3YXlzCi1hdHRhY2ggbmV3IHN1YnBhcnRzIHRvIHRoZSBtZXNzYWdlIGJ5IHVzaW5nIHRoZQotXG1ldGhvZHtNZXNzYWdlLmF0dGFjaCgpfSBtZXRob2QuCi0KLUFkZGl0aW9uYWwgcGFyYW1ldGVycyBmb3IgdGhlIFxtYWlsaGVhZGVye0NvbnRlbnQtVHlwZX0gaGVhZGVyIGFyZQotdGFrZW4gZnJvbSB0aGUga2V5d29yZCBhcmd1bWVudHMsIG9yIHBhc3NlZCBpbnRvIHRoZSBcdmFye19wYXJhbXN9Ci1hcmd1bWVudCwgd2hpY2ggaXMgYSBrZXl3b3JkIGRpY3Rpb25hcnkuCi0KLVx2ZXJzaW9uYWRkZWR7Mi4yLjJ9Ci1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317TUlNRUFwcGxpY2F0aW9ufXtfZGF0YVxvcHRpb25hbHssIF9zdWJ0eXBlXG9wdGlvbmFseywKLSAgICBfZW5jb2RlclxvcHRpb25hbHssICoqX3BhcmFtc319fX0KLU1vZHVsZTogXG1vZHVsZXtlbWFpbC5taW1lLmFwcGxpY2F0aW9ufQotCi1BIHN1YmNsYXNzIG9mIFxjbGFzc3tNSU1FTm9uTXVsdGlwYXJ0fSwgdGhlIFxjbGFzc3tNSU1FQXBwbGljYXRpb259IGNsYXNzIGlzCi11c2VkIHRvIHJlcHJlc2VudCBNSU1FIG1lc3NhZ2Ugb2JqZWN0cyBvZiBtYWpvciB0eXBlIFxtaW1ldHlwZXthcHBsaWNhdGlvbn0uCi1cdmFye19kYXRhfSBpcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSByYXcgYnl0ZSBkYXRhLiAgT3B0aW9uYWwgXHZhcntfc3VidHlwZX0KLXNwZWNpZmllcyB0aGUgTUlNRSBzdWJ0eXBlIGFuZCBkZWZhdWx0cyB0byBcbWltZXR5cGV7b2N0ZXQtc3RyZWFtfS4gIAotCi1PcHRpb25hbCBcdmFye19lbmNvZGVyfSBpcyBhIGNhbGxhYmxlIChpLmUuIGZ1bmN0aW9uKSB3aGljaCB3aWxsCi1wZXJmb3JtIHRoZSBhY3R1YWwgZW5jb2Rpbmcgb2YgdGhlIGRhdGEgZm9yIHRyYW5zcG9ydC4gIFRoaXMKLWNhbGxhYmxlIHRha2VzIG9uZSBhcmd1bWVudCwgd2hpY2ggaXMgdGhlIFxjbGFzc3tNSU1FQXBwbGljYXRpb259IGluc3RhbmNlLgotSXQgc2hvdWxkIHVzZSBcbWV0aG9ke2dldF9wYXlsb2FkKCl9IGFuZCBcbWV0aG9ke3NldF9wYXlsb2FkKCl9IHRvCi1jaGFuZ2UgdGhlIHBheWxvYWQgdG8gZW5jb2RlZCBmb3JtLiAgSXQgc2hvdWxkIGFsc28gYWRkIGFueQotXG1haWxoZWFkZXJ7Q29udGVudC1UcmFuc2Zlci1FbmNvZGluZ30gb3Igb3RoZXIgaGVhZGVycyB0byB0aGUgbWVzc2FnZQotb2JqZWN0IGFzIG5lY2Vzc2FyeS4gIFRoZSBkZWZhdWx0IGVuY29kaW5nIGlzIGJhc2U2NC4gIFNlZSB0aGUKLVxyZWZtb2R1bGV7ZW1haWwuZW5jb2RlcnN9IG1vZHVsZSBmb3IgYSBsaXN0IG9mIHRoZSBidWlsdC1pbiBlbmNvZGVycy4KLQotXHZhcntfcGFyYW1zfSBhcmUgcGFzc2VkIHN0cmFpZ2h0IHRocm91Z2ggdG8gdGhlIGJhc2UgY2xhc3MgY29uc3RydWN0b3IuCi1cdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtNSU1FQXVkaW99e19hdWRpb2RhdGFcb3B0aW9uYWx7LCBfc3VidHlwZVxvcHRpb25hbHssCi0gICAgX2VuY29kZXJcb3B0aW9uYWx7LCAqKl9wYXJhbXN9fX19Ci1Nb2R1bGU6IFxtb2R1bGV7ZW1haWwubWltZS5hdWRpb30KLQotQSBzdWJjbGFzcyBvZiBcY2xhc3N7TUlNRU5vbk11bHRpcGFydH0sIHRoZSBcY2xhc3N7TUlNRUF1ZGlvfSBjbGFzcwotaXMgdXNlZCB0byBjcmVhdGUgTUlNRSBtZXNzYWdlIG9iamVjdHMgb2YgbWFqb3IgdHlwZSBcbWltZXR5cGV7YXVkaW99LgotXHZhcntfYXVkaW9kYXRhfSBpcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSByYXcgYXVkaW8gZGF0YS4gIElmIHRoaXMKLWRhdGEgY2FuIGJlIGRlY29kZWQgYnkgdGhlIHN0YW5kYXJkIFB5dGhvbiBtb2R1bGUgXHJlZm1vZHVsZXtzbmRoZHJ9LAotdGhlbiB0aGUgc3VidHlwZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgaW4gdGhlCi1cbWFpbGhlYWRlcntDb250ZW50LVR5cGV9IGhlYWRlci4gIE90aGVyd2lzZSB5b3UgY2FuIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUKLWF1ZGlvIHN1YnR5cGUgdmlhIHRoZSBcdmFye19zdWJ0eXBlfSBwYXJhbWV0ZXIuICBJZiB0aGUgbWlub3IgdHlwZSBjb3VsZAotbm90IGJlIGd1ZXNzZWQgYW5kIFx2YXJ7X3N1YnR5cGV9IHdhcyBub3QgZ2l2ZW4sIHRoZW4gXGV4Y2VwdGlvbntUeXBlRXJyb3J9Ci1pcyByYWlzZWQuCi0KLU9wdGlvbmFsIFx2YXJ7X2VuY29kZXJ9IGlzIGEgY2FsbGFibGUgKGkuZS4gZnVuY3Rpb24pIHdoaWNoIHdpbGwKLXBlcmZvcm0gdGhlIGFjdHVhbCBlbmNvZGluZyBvZiB0aGUgYXVkaW8gZGF0YSBmb3IgdHJhbnNwb3J0LiAgVGhpcwotY2FsbGFibGUgdGFrZXMgb25lIGFyZ3VtZW50LCB3aGljaCBpcyB0aGUgXGNsYXNze01JTUVBdWRpb30gaW5zdGFuY2UuCi1JdCBzaG91bGQgdXNlIFxtZXRob2R7Z2V0X3BheWxvYWQoKX0gYW5kIFxtZXRob2R7c2V0X3BheWxvYWQoKX0gdG8KLWNoYW5nZSB0aGUgcGF5bG9hZCB0byBlbmNvZGVkIGZvcm0uICBJdCBzaG91bGQgYWxzbyBhZGQgYW55Ci1cbWFpbGhlYWRlcntDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nfSBvciBvdGhlciBoZWFkZXJzIHRvIHRoZSBtZXNzYWdlCi1vYmplY3QgYXMgbmVjZXNzYXJ5LiAgVGhlIGRlZmF1bHQgZW5jb2RpbmcgaXMgYmFzZTY0LiAgU2VlIHRoZQotXHJlZm1vZHVsZXtlbWFpbC5lbmNvZGVyc30gbW9kdWxlIGZvciBhIGxpc3Qgb2YgdGhlIGJ1aWx0LWluIGVuY29kZXJzLgotCi1cdmFye19wYXJhbXN9IGFyZSBwYXNzZWQgc3RyYWlnaHQgdGhyb3VnaCB0byB0aGUgYmFzZSBjbGFzcyBjb25zdHJ1Y3Rvci4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtNSU1FSW1hZ2V9e19pbWFnZWRhdGFcb3B0aW9uYWx7LCBfc3VidHlwZVxvcHRpb25hbHssCi0gICAgX2VuY29kZXJcb3B0aW9uYWx7LCAqKl9wYXJhbXN9fX19Ci1Nb2R1bGU6IFxtb2R1bGV7ZW1haWwubWltZS5pbWFnZX0KLQotQSBzdWJjbGFzcyBvZiBcY2xhc3N7TUlNRU5vbk11bHRpcGFydH0sIHRoZSBcY2xhc3N7TUlNRUltYWdlfSBjbGFzcyBpcwotdXNlZCB0byBjcmVhdGUgTUlNRSBtZXNzYWdlIG9iamVjdHMgb2YgbWFqb3IgdHlwZSBcbWltZXR5cGV7aW1hZ2V9LgotXHZhcntfaW1hZ2VkYXRhfSBpcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSByYXcgaW1hZ2UgZGF0YS4gIElmIHRoaXMKLWRhdGEgY2FuIGJlIGRlY29kZWQgYnkgdGhlIHN0YW5kYXJkIFB5dGhvbiBtb2R1bGUgXHJlZm1vZHVsZXtpbWdoZHJ9LAotdGhlbiB0aGUgc3VidHlwZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgaW4gdGhlCi1cbWFpbGhlYWRlcntDb250ZW50LVR5cGV9IGhlYWRlci4gIE90aGVyd2lzZSB5b3UgY2FuIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUKLWltYWdlIHN1YnR5cGUgdmlhIHRoZSBcdmFye19zdWJ0eXBlfSBwYXJhbWV0ZXIuICBJZiB0aGUgbWlub3IgdHlwZSBjb3VsZAotbm90IGJlIGd1ZXNzZWQgYW5kIFx2YXJ7X3N1YnR5cGV9IHdhcyBub3QgZ2l2ZW4sIHRoZW4gXGV4Y2VwdGlvbntUeXBlRXJyb3J9Ci1pcyByYWlzZWQuCi0KLU9wdGlvbmFsIFx2YXJ7X2VuY29kZXJ9IGlzIGEgY2FsbGFibGUgKGkuZS4gZnVuY3Rpb24pIHdoaWNoIHdpbGwKLXBlcmZvcm0gdGhlIGFjdHVhbCBlbmNvZGluZyBvZiB0aGUgaW1hZ2UgZGF0YSBmb3IgdHJhbnNwb3J0LiAgVGhpcwotY2FsbGFibGUgdGFrZXMgb25lIGFyZ3VtZW50LCB3aGljaCBpcyB0aGUgXGNsYXNze01JTUVJbWFnZX0gaW5zdGFuY2UuCi1JdCBzaG91bGQgdXNlIFxtZXRob2R7Z2V0X3BheWxvYWQoKX0gYW5kIFxtZXRob2R7c2V0X3BheWxvYWQoKX0gdG8KLWNoYW5nZSB0aGUgcGF5bG9hZCB0byBlbmNvZGVkIGZvcm0uICBJdCBzaG91bGQgYWxzbyBhZGQgYW55Ci1cbWFpbGhlYWRlcntDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nfSBvciBvdGhlciBoZWFkZXJzIHRvIHRoZSBtZXNzYWdlCi1vYmplY3QgYXMgbmVjZXNzYXJ5LiAgVGhlIGRlZmF1bHQgZW5jb2RpbmcgaXMgYmFzZTY0LiAgU2VlIHRoZQotXHJlZm1vZHVsZXtlbWFpbC5lbmNvZGVyc30gbW9kdWxlIGZvciBhIGxpc3Qgb2YgdGhlIGJ1aWx0LWluIGVuY29kZXJzLgotCi1cdmFye19wYXJhbXN9IGFyZSBwYXNzZWQgc3RyYWlnaHQgdGhyb3VnaCB0byB0aGUgXGNsYXNze01JTUVCYXNlfQotY29uc3RydWN0b3IuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317TUlNRU1lc3NhZ2V9e19tc2dcb3B0aW9uYWx7LCBfc3VidHlwZX19Ci1Nb2R1bGU6IFxtb2R1bGV7ZW1haWwubWltZS5tZXNzYWdlfQotCi1BIHN1YmNsYXNzIG9mIFxjbGFzc3tNSU1FTm9uTXVsdGlwYXJ0fSwgdGhlIFxjbGFzc3tNSU1FTWVzc2FnZX0gY2xhc3MKLWlzIHVzZWQgdG8gY3JlYXRlIE1JTUUgb2JqZWN0cyBvZiBtYWluIHR5cGUgXG1pbWV0eXBle21lc3NhZ2V9LgotXHZhcntfbXNnfSBpcyB1c2VkIGFzIHRoZSBwYXlsb2FkLCBhbmQgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBjbGFzcwotXGNsYXNze01lc3NhZ2V9IChvciBhIHN1YmNsYXNzIHRoZXJlb2YpLCBvdGhlcndpc2UgYQotXGV4Y2VwdGlvbntUeXBlRXJyb3J9IGlzIHJhaXNlZC4KLQotT3B0aW9uYWwgXHZhcntfc3VidHlwZX0gc2V0cyB0aGUgc3VidHlwZSBvZiB0aGUgbWVzc2FnZTsgaXQgZGVmYXVsdHMKLXRvIFxtaW1ldHlwZXtyZmM4MjJ9LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e01JTUVUZXh0fXtfdGV4dFxvcHRpb25hbHssIF9zdWJ0eXBlXG9wdGlvbmFseywgX2NoYXJzZXR9fX0KLU1vZHVsZTogXG1vZHVsZXtlbWFpbC5taW1lLnRleHR9Ci0KLUEgc3ViY2xhc3Mgb2YgXGNsYXNze01JTUVOb25NdWx0aXBhcnR9LCB0aGUgXGNsYXNze01JTUVUZXh0fSBjbGFzcyBpcwotdXNlZCB0byBjcmVhdGUgTUlNRSBvYmplY3RzIG9mIG1ham9yIHR5cGUgXG1pbWV0eXBle3RleHR9LgotXHZhcntfdGV4dH0gaXMgdGhlIHN0cmluZyBmb3IgdGhlIHBheWxvYWQuICBcdmFye19zdWJ0eXBlfSBpcyB0aGUKLW1pbm9yIHR5cGUgYW5kIGRlZmF1bHRzIHRvIFxtaW1ldHlwZXtwbGFpbn0uICBcdmFye19jaGFyc2V0fSBpcyB0aGUKLWNoYXJhY3RlciBzZXQgb2YgdGhlIHRleHQgYW5kIGlzIHBhc3NlZCBhcyBhIHBhcmFtZXRlciB0byB0aGUKLVxjbGFzc3tNSU1FTm9uTXVsdGlwYXJ0fSBjb25zdHJ1Y3RvcjsgaXQgZGVmYXVsdHMgdG8gXGNvZGV7dXMtYXNjaWl9LiAgTm8KLWd1ZXNzaW5nIG9yIGVuY29kaW5nIGlzIHBlcmZvcm1lZCBvbiB0aGUgdGV4dCBkYXRhLgotCi1cdmVyc2lvbmNoYW5nZWRbVGhlIHByZXZpb3VzbHkgZGVwcmVjYXRlZCBcdmFye19lbmNvZGluZ30gYXJndW1lbnQgaGFzCi1iZWVuIHJlbW92ZWQuICBFbmNvZGluZyBoYXBwZW5zIGltcGxpY2l0bHkgYmFzZWQgb24gdGhlIFx2YXJ7X2NoYXJzZXR9Ci1hcmd1bWVudF17Mi40fQotXGVuZHtjbGFzc2Rlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2VtYWlscGFyc2VyLnRleCBiL0RvYy9saWIvZW1haWxwYXJzZXIudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDlmYTQwLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvZW1haWxwYXJzZXIudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtlbWFpbC5wYXJzZXJ9Ci1cbW9kdWxlc3lub3BzaXN7UGFyc2UgZmxhdCB0ZXh0IGVtYWlsIG1lc3NhZ2VzIHRvIHByb2R1Y2UgYSBtZXNzYWdlCi0JICAgICAgICBvYmplY3Qgc3RydWN0dXJlLn0KLQotTWVzc2FnZSBvYmplY3Qgc3RydWN0dXJlcyBjYW4gYmUgY3JlYXRlZCBpbiBvbmUgb2YgdHdvIHdheXM6IHRoZXkgY2FuIGJlCi1jcmVhdGVkIGZyb20gd2hvbGUgY2xvdGggYnkgaW5zdGFudGlhdGluZyBcY2xhc3N7TWVzc2FnZX0gb2JqZWN0cyBhbmQKLXN0cmluZ2luZyB0aGVtIHRvZ2V0aGVyIHZpYSBcbWV0aG9ke2F0dGFjaCgpfSBhbmQKLVxtZXRob2R7c2V0X3BheWxvYWQoKX0gY2FsbHMsIG9yIHRoZXkgY2FuIGJlIGNyZWF0ZWQgYnkgcGFyc2luZyBhIGZsYXQgdGV4dAotcmVwcmVzZW50YXRpb24gb2YgdGhlIGVtYWlsIG1lc3NhZ2UuCi0KLVRoZSBcbW9kdWxle2VtYWlsfSBwYWNrYWdlIHByb3ZpZGVzIGEgc3RhbmRhcmQgcGFyc2VyIHRoYXQgdW5kZXJzdGFuZHMKLW1vc3QgZW1haWwgZG9jdW1lbnQgc3RydWN0dXJlcywgaW5jbHVkaW5nIE1JTUUgZG9jdW1lbnRzLiAgWW91IGNhbgotcGFzcyB0aGUgcGFyc2VyIGEgc3RyaW5nIG9yIGEgZmlsZSBvYmplY3QsIGFuZCB0aGUgcGFyc2VyIHdpbGwgcmV0dXJuCi10byB5b3UgdGhlIHJvb3QgXGNsYXNze01lc3NhZ2V9IGluc3RhbmNlIG9mIHRoZSBvYmplY3Qgc3RydWN0dXJlLiAgRm9yCi1zaW1wbGUsIG5vbi1NSU1FIG1lc3NhZ2VzIHRoZSBwYXlsb2FkIG9mIHRoaXMgcm9vdCBvYmplY3Qgd2lsbCBsaWtlbHkKLWJlIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHRleHQgb2YgdGhlIG1lc3NhZ2UuICBGb3IgTUlNRQotbWVzc2FnZXMsIHRoZSByb290IG9iamVjdCB3aWxsIHJldHVybiBcY29kZXtUcnVlfSBmcm9tIGl0cwotXG1ldGhvZHtpc19tdWx0aXBhcnQoKX0gbWV0aG9kLCBhbmQgdGhlIHN1YnBhcnRzIGNhbiBiZSBhY2Nlc3NlZCB2aWEKLXRoZSBcbWV0aG9ke2dldF9wYXlsb2FkKCl9IGFuZCBcbWV0aG9ke3dhbGsoKX0gbWV0aG9kcy4KLQotVGhlcmUgYXJlIGFjdHVhbGx5IHR3byBwYXJzZXIgaW50ZXJmYWNlcyBhdmFpbGFibGUgZm9yIHVzZSwgdGhlIGNsYXNzaWMKLVxjbGFzc3tQYXJzZXJ9IEFQSSBhbmQgdGhlIGluY3JlbWVudGFsIFxjbGFzc3tGZWVkUGFyc2VyfSBBUEkuICBUaGUgY2xhc3NpYwotXGNsYXNze1BhcnNlcn0gQVBJIGlzIGZpbmUgaWYgeW91IGhhdmUgdGhlIGVudGlyZSB0ZXh0IG9mIHRoZSBtZXNzYWdlIGluCi1tZW1vcnkgYXMgYSBzdHJpbmcsIG9yIGlmIHRoZSBlbnRpcmUgbWVzc2FnZSBsaXZlcyBpbiBhIGZpbGUgb24gdGhlIGZpbGUKLXN5c3RlbS4gIFxjbGFzc3tGZWVkUGFyc2VyfSBpcyBtb3JlIGFwcHJvcHJpYXRlIGZvciB3aGVuIHlvdSdyZSByZWFkaW5nIHRoZQotbWVzc2FnZSBmcm9tIGEgc3RyZWFtIHdoaWNoIG1pZ2h0IGJsb2NrIHdhaXRpbmcgZm9yIG1vcmUgaW5wdXQgKGUuZy4gcmVhZGluZwotYW4gZW1haWwgbWVzc2FnZSBmcm9tIGEgc29ja2V0KS4gIFRoZSBcY2xhc3N7RmVlZFBhcnNlcn0gY2FuIGNvbnN1bWUgYW5kIHBhcnNlCi10aGUgbWVzc2FnZSBpbmNyZW1lbnRhbGx5LCBhbmQgb25seSByZXR1cm5zIHRoZSByb290IG9iamVjdCB3aGVuIHlvdSBjbG9zZSB0aGUKLXBhcnNlclxmb290bm90ZXtBcyBvZiBlbWFpbCBwYWNrYWdlIHZlcnNpb24gMy4wLCBpbnRyb2R1Y2VkIGluCi1QeXRob24gMi40LCB0aGUgY2xhc3NpYyBcY2xhc3N7UGFyc2VyfSB3YXMgcmUtaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgdGhlCi1cY2xhc3N7RmVlZFBhcnNlcn0sIHNvIHRoZSBzZW1hbnRpY3MgYW5kIHJlc3VsdHMgYXJlIGlkZW50aWNhbCBiZXR3ZWVuIHRoZSB0d28KLXBhcnNlcnMufS4KLQotTm90ZSB0aGF0IHRoZSBwYXJzZXIgY2FuIGJlIGV4dGVuZGVkIGluIGxpbWl0ZWQgd2F5cywgYW5kIG9mIGNvdXJzZQoteW91IGNhbiBpbXBsZW1lbnQgeW91ciBvd24gcGFyc2VyIGNvbXBsZXRlbHkgZnJvbSBzY3JhdGNoLiAgVGhlcmUgaXMKLW5vIG1hZ2ljYWwgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSBcbW9kdWxle2VtYWlsfSBwYWNrYWdlJ3MgYnVuZGxlZAotcGFyc2VyIGFuZCB0aGUgXGNsYXNze01lc3NhZ2V9IGNsYXNzLCBzbyB5b3VyIGN1c3RvbSBwYXJzZXIgY2FuIGNyZWF0ZQotbWVzc2FnZSBvYmplY3QgdHJlZXMgYW55IHdheSBpdCBmaW5kcyBuZWNlc3NhcnkuCi0KLVxzdWJzdWJzZWN0aW9ue0ZlZWRQYXJzZXIgQVBJfQotCi1cdmVyc2lvbmFkZGVkezIuNH0KLQotVGhlIFxjbGFzc3tGZWVkUGFyc2VyfSwgaW1wb3J0ZWQgZnJvbSB0aGUgXG1vZHVsZXtlbWFpbC5mZWVkcGFyc2VyfSBtb2R1bGUsCi1wcm92aWRlcyBhbiBBUEkgdGhhdCBpcyBjb25kdWNpdmUgdG8gaW5jcmVtZW50YWwgcGFyc2luZyBvZiBlbWFpbCBtZXNzYWdlcywKLXN1Y2ggYXMgd291bGQgYmUgbmVjZXNzYXJ5IHdoZW4gcmVhZGluZyB0aGUgdGV4dCBvZiBhbiBlbWFpbCBtZXNzYWdlIGZyb20gYQotc291cmNlIHRoYXQgY2FuIGJsb2NrIChlLmcuIGEgc29ja2V0KS4gIFRoZQotXGNsYXNze0ZlZWRQYXJzZXJ9IGNhbiBvZiBjb3Vyc2UgYmUgdXNlZCB0byBwYXJzZSBhbiBlbWFpbCBtZXNzYWdlIGZ1bGx5Ci1jb250YWluZWQgaW4gYSBzdHJpbmcgb3IgYSBmaWxlLCBidXQgdGhlIGNsYXNzaWMgXGNsYXNze1BhcnNlcn0gQVBJIG1heSBiZQotbW9yZSBjb252ZW5pZW50IGZvciBzdWNoIHVzZSBjYXNlcy4gIFRoZSBzZW1hbnRpY3MgYW5kIHJlc3VsdHMgb2YgdGhlIHR3bwotcGFyc2VyIEFQSXMgYXJlIGlkZW50aWNhbC4KLQotVGhlIFxjbGFzc3tGZWVkUGFyc2VyfSdzIEFQSSBpcyBzaW1wbGU7IHlvdSBjcmVhdGUgYW4gaW5zdGFuY2UsIGZlZWQgaXQgYQotYnVuY2ggb2YgdGV4dCB1bnRpbCB0aGVyZSdzIG5vIG1vcmUgdG8gZmVlZCBpdCwgdGhlbiBjbG9zZSB0aGUgcGFyc2VyIHRvCi1yZXRyaWV2ZSB0aGUgcm9vdCBtZXNzYWdlIG9iamVjdC4gIFRoZSBcY2xhc3N7RmVlZFBhcnNlcn0gaXMgZXh0cmVtZWx5Ci1hY2N1cmF0ZSB3aGVuIHBhcnNpbmcgc3RhbmRhcmRzLWNvbXBsaWFudCBtZXNzYWdlcywgYW5kIGl0IGRvZXMgYSB2ZXJ5IGdvb2QKLWpvYiBvZiBwYXJzaW5nIG5vbi1jb21wbGlhbnQgbWVzc2FnZXMsIHByb3ZpZGluZyBpbmZvcm1hdGlvbiBhYm91dCBob3cgYQotbWVzc2FnZSB3YXMgZGVlbWVkIGJyb2tlbi4gIEl0IHdpbGwgcG9wdWxhdGUgYSBtZXNzYWdlIG9iamVjdCdzIFx2YXJ7ZGVmZWN0c30KLWF0dHJpYnV0ZSB3aXRoIGEgbGlzdCBvZiBhbnkgcHJvYmxlbXMgaXQgZm91bmQgaW4gYSBtZXNzYWdlLiAgU2VlIHRoZQotXHJlZm1vZHVsZXtlbWFpbC5lcnJvcnN9IG1vZHVsZSBmb3IgdGhlIGxpc3Qgb2YgZGVmZWN0cyB0aGF0IGl0IGNhbiBmaW5kLgotCi1IZXJlIGlzIHRoZSBBUEkgZm9yIHRoZSBcY2xhc3N7RmVlZFBhcnNlcn06Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0ZlZWRQYXJzZXJ9e1xvcHRpb25hbHtfZmFjdG9yeX19Ci1DcmVhdGUgYSBcY2xhc3N7RmVlZFBhcnNlcn0gaW5zdGFuY2UuICBPcHRpb25hbCBcdmFye19mYWN0b3J5fSBpcyBhCi1uby1hcmd1bWVudCBjYWxsYWJsZSB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyIGEgbmV3IG1lc3NhZ2Ugb2JqZWN0IGlzCi1uZWVkZWQuICBJdCBkZWZhdWx0cyB0byB0aGUgXGNsYXNze2VtYWlsLm1lc3NhZ2UuTWVzc2FnZX0gY2xhc3MuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0ZlZWRQYXJzZXJde2ZlZWR9e2RhdGF9Ci1GZWVkIHRoZSBcY2xhc3N7RmVlZFBhcnNlcn0gc29tZSBtb3JlIGRhdGEuICBcdmFye2RhdGF9IHNob3VsZCBiZSBhCi1zdHJpbmcgY29udGFpbmluZyBvbmUgb3IgbW9yZSBsaW5lcy4gIFRoZSBsaW5lcyBjYW4gYmUgcGFydGlhbCBhbmQgdGhlCi1cY2xhc3N7RmVlZFBhcnNlcn0gd2lsbCBzdGl0Y2ggc3VjaCBwYXJ0aWFsIGxpbmVzIHRvZ2V0aGVyIHByb3Blcmx5LiAgVGhlCi1saW5lcyBpbiB0aGUgc3RyaW5nIGNhbiBoYXZlIGFueSBvZiB0aGUgY29tbW9uIHRocmVlIGxpbmUgZW5kaW5ncywgY2FycmlhZ2UKLXJldHVybiwgbmV3bGluZSwgb3IgY2FycmlhZ2UgcmV0dXJuIGFuZCBuZXdsaW5lICh0aGV5IGNhbiBldmVuIGJlIG1peGVkKS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0ZlZWRQYXJzZXJde2Nsb3NlfXt9Ci1DbG9zaW5nIGEgXGNsYXNze0ZlZWRQYXJzZXJ9IGNvbXBsZXRlcyB0aGUgcGFyc2luZyBvZiBhbGwgcHJldmlvdXNseSBmZWQgZGF0YSwKLWFuZCByZXR1cm5zIHRoZSByb290IG1lc3NhZ2Ugb2JqZWN0LiAgSXQgaXMgdW5kZWZpbmVkIHdoYXQgaGFwcGVucyBpZiB5b3UgZmVlZAotbW9yZSBkYXRhIHRvIGEgY2xvc2VkIFxjbGFzc3tGZWVkUGFyc2VyfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXHN1YnN1YnNlY3Rpb257UGFyc2VyIGNsYXNzIEFQSX0KLQotVGhlIFxjbGFzc3tQYXJzZXJ9IGNsYXNzLCBpbXBvcnRlZCBmcm9tIHRoZSBcbW9kdWxle2VtYWlsLnBhcnNlcn0gbW9kdWxlLAotcHJvdmlkZXMgYW4gQVBJIHRoYXQgY2FuIGJlIHVzZWQgdG8gcGFyc2UgYSBtZXNzYWdlIHdoZW4gdGhlIGNvbXBsZXRlIGNvbnRlbnRzCi1vZiB0aGUgbWVzc2FnZSBhcmUgYXZhaWxhYmxlIGluIGEgc3RyaW5nIG9yIGZpbGUuICBUaGUKLVxtb2R1bGV7ZW1haWwucGFyc2VyfSBtb2R1bGUgYWxzbyBwcm92aWRlcyBhIHNlY29uZCBjbGFzcywgY2FsbGVkCi1cY2xhc3N7SGVhZGVyUGFyc2VyfSB3aGljaCBjYW4gYmUgdXNlZCBpZiB5b3UncmUgb25seSBpbnRlcmVzdGVkIGluCi10aGUgaGVhZGVycyBvZiB0aGUgbWVzc2FnZS4gXGNsYXNze0hlYWRlclBhcnNlcn0gY2FuIGJlIG11Y2ggZmFzdGVyIGluCi10aGVzZSBzaXR1YXRpb25zLCBzaW5jZSBpdCBkb2VzIG5vdCBhdHRlbXB0IHRvIHBhcnNlIHRoZSBtZXNzYWdlIGJvZHksCi1pbnN0ZWFkIHNldHRpbmcgdGhlIHBheWxvYWQgdG8gdGhlIHJhdyBib2R5IGFzIGEgc3RyaW5nLgotXGNsYXNze0hlYWRlclBhcnNlcn0gaGFzIHRoZSBzYW1lIEFQSSBhcyB0aGUgXGNsYXNze1BhcnNlcn0gY2xhc3MuCi0KLVxiZWdpbntjbGFzc2Rlc2N9e1BhcnNlcn17XG9wdGlvbmFse19jbGFzc319Ci1UaGUgY29uc3RydWN0b3IgZm9yIHRoZSBcY2xhc3N7UGFyc2VyfSBjbGFzcyB0YWtlcyBhbiBvcHRpb25hbAotYXJndW1lbnQgXHZhcntfY2xhc3N9LiAgVGhpcyBtdXN0IGJlIGEgY2FsbGFibGUgZmFjdG9yeSAoc3VjaCBhcyBhCi1mdW5jdGlvbiBvciBhIGNsYXNzKSwgYW5kIGl0IGlzIHVzZWQgd2hlbmV2ZXIgYSBzdWItbWVzc2FnZSBvYmplY3QKLW5lZWRzIHRvIGJlIGNyZWF0ZWQuICBJdCBkZWZhdWx0cyB0byBcY2xhc3N7TWVzc2FnZX0gKHNlZQotXHJlZm1vZHVsZXtlbWFpbC5tZXNzYWdlfSkuICBUaGUgZmFjdG9yeSB3aWxsIGJlIGNhbGxlZCB3aXRob3V0Ci1hcmd1bWVudHMuCi0KLVRoZSBvcHRpb25hbCBcdmFye3N0cmljdH0gZmxhZyBpcyBpZ25vcmVkLiAgXGRlcHJlY2F0ZWR7Mi40fXtCZWNhdXNlIHRoZQotXGNsYXNze1BhcnNlcn0gY2xhc3MgaXMgYSBiYWNrd2FyZCBjb21wYXRpYmxlIEFQSSB3cmFwcGVyIGFyb3VuZCB0aGUKLW5ldy1pbi1QeXRob24gMi40IFxjbGFzc3tGZWVkUGFyc2VyfSwgXGVtcGh7YWxsfSBwYXJzaW5nIGlzIGVmZmVjdGl2ZWx5Ci1ub24tc3RyaWN0LiAgWW91IHNob3VsZCBzaW1wbHkgc3RvcCBwYXNzaW5nIGEgXHZhcntzdHJpY3R9IGZsYWcgdG8gdGhlCi1cY2xhc3N7UGFyc2VyfSBjb25zdHJ1Y3Rvci59Ci0KLVx2ZXJzaW9uY2hhbmdlZFtUaGUgXHZhcntzdHJpY3R9IGZsYWcgd2FzIGFkZGVkXXsyLjIuMn0KLVx2ZXJzaW9uY2hhbmdlZFtUaGUgXHZhcntzdHJpY3R9IGZsYWcgd2FzIGRlcHJlY2F0ZWRdezIuNH0KLVxlbmR7Y2xhc3NkZXNjfQotCi1UaGUgb3RoZXIgcHVibGljIFxjbGFzc3tQYXJzZXJ9IG1ldGhvZHMgYXJlOgotCi1cYmVnaW57bWV0aG9kZGVzY31bUGFyc2VyXXtwYXJzZX17ZnBcb3B0aW9uYWx7LCBoZWFkZXJzb25seX19Ci1SZWFkIGFsbCB0aGUgZGF0YSBmcm9tIHRoZSBmaWxlLWxpa2Ugb2JqZWN0IFx2YXJ7ZnB9LCBwYXJzZSB0aGUKLXJlc3VsdGluZyB0ZXh0LCBhbmQgcmV0dXJuIHRoZSByb290IG1lc3NhZ2Ugb2JqZWN0LiAgXHZhcntmcH0gbXVzdAotc3VwcG9ydCBib3RoIHRoZSBcbWV0aG9ke3JlYWRsaW5lKCl9IGFuZCB0aGUgXG1ldGhvZHtyZWFkKCl9IG1ldGhvZHMKLW9uIGZpbGUtbGlrZSBvYmplY3RzLgotCi1UaGUgdGV4dCBjb250YWluZWQgaW4gXHZhcntmcH0gbXVzdCBiZSBmb3JtYXR0ZWQgYXMgYSBibG9jayBvZiBccmZjezI4MjJ9Ci1zdHlsZSBoZWFkZXJzIGFuZCBoZWFkZXIgY29udGludWF0aW9uIGxpbmVzLCBvcHRpb25hbGx5IHByZWNlZGVkIGJ5IGEKLWVudmVsb3BlIGhlYWRlci4gIFRoZSBoZWFkZXIgYmxvY2sgaXMgdGVybWluYXRlZCBlaXRoZXIgYnkgdGhlCi1lbmQgb2YgdGhlIGRhdGEgb3IgYnkgYSBibGFuayBsaW5lLiAgRm9sbG93aW5nIHRoZSBoZWFkZXIgYmxvY2sgaXMgdGhlCi1ib2R5IG9mIHRoZSBtZXNzYWdlICh3aGljaCBtYXkgY29udGFpbiBNSU1FLWVuY29kZWQgc3VicGFydHMpLgotCi1PcHRpb25hbCBcdmFye2hlYWRlcnNvbmx5fSBpcyBhcyB3aXRoIHRoZSBcbWV0aG9ke3BhcnNlKCl9IG1ldGhvZC4KLQotXHZlcnNpb25jaGFuZ2VkW1RoZSBcdmFye2hlYWRlcnNvbmx5fSBmbGFnIHdhcyBhZGRlZF17Mi4yLjJ9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtQYXJzZXJde3BhcnNlc3RyfXt0ZXh0XG9wdGlvbmFseywgaGVhZGVyc29ubHl9fQotU2ltaWxhciB0byB0aGUgXG1ldGhvZHtwYXJzZSgpfSBtZXRob2QsIGV4Y2VwdCBpdCB0YWtlcyBhIHN0cmluZwotb2JqZWN0IGluc3RlYWQgb2YgYSBmaWxlLWxpa2Ugb2JqZWN0LiAgQ2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhIHN0cmluZwotaXMgZXhhY3RseSBlcXVpdmFsZW50IHRvIHdyYXBwaW5nIFx2YXJ7dGV4dH0gaW4gYSBcY2xhc3N7U3RyaW5nSU99Ci1pbnN0YW5jZSBmaXJzdCBhbmQgY2FsbGluZyBcbWV0aG9ke3BhcnNlKCl9LgotCi1PcHRpb25hbCBcdmFye2hlYWRlcnNvbmx5fSBpcyBhIGZsYWcgc3BlY2lmeWluZyB3aGV0aGVyIHRvIHN0b3AKLXBhcnNpbmcgYWZ0ZXIgcmVhZGluZyB0aGUgaGVhZGVycyBvciBub3QuICBUaGUgZGVmYXVsdCBpcyBcY29kZXtGYWxzZX0sCi1tZWFuaW5nIGl0IHBhcnNlcyB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBmaWxlLgotCi1cdmVyc2lvbmNoYW5nZWRbVGhlIFx2YXJ7aGVhZGVyc29ubHl9IGZsYWcgd2FzIGFkZGVkXXsyLjIuMn0KLVxlbmR7bWV0aG9kZGVzY30KLQotU2luY2UgY3JlYXRpbmcgYSBtZXNzYWdlIG9iamVjdCBzdHJ1Y3R1cmUgZnJvbSBhIHN0cmluZyBvciBhIGZpbGUKLW9iamVjdCBpcyBzdWNoIGEgY29tbW9uIHRhc2ssIHR3byBmdW5jdGlvbnMgYXJlIHByb3ZpZGVkIGFzIGEKLWNvbnZlbmllbmNlLiAgVGhleSBhcmUgYXZhaWxhYmxlIGluIHRoZSB0b3AtbGV2ZWwgXG1vZHVsZXtlbWFpbH0KLXBhY2thZ2UgbmFtZXNwYWNlLgotCi1cYmVnaW57ZnVuY2Rlc2N9e21lc3NhZ2VfZnJvbV9zdHJpbmd9e3Ncb3B0aW9uYWx7LCBfY2xhc3Ncb3B0aW9uYWx7LCBzdHJpY3R9fX0KLVJldHVybiBhIG1lc3NhZ2Ugb2JqZWN0IHN0cnVjdHVyZSBmcm9tIGEgc3RyaW5nLiAgVGhpcyBpcyBleGFjdGx5Ci1lcXVpdmFsZW50IHRvIFxjb2Rle1BhcnNlcigpLnBhcnNlc3RyKHMpfS4gIE9wdGlvbmFsIFx2YXJ7X2NsYXNzfSBhbmQKLVx2YXJ7c3RyaWN0fSBhcmUgaW50ZXJwcmV0ZWQgYXMgd2l0aCB0aGUgXGNsYXNze1BhcnNlcn0gY2xhc3MgY29uc3RydWN0b3IuCi0KLVx2ZXJzaW9uY2hhbmdlZFtUaGUgXHZhcntzdHJpY3R9IGZsYWcgd2FzIGFkZGVkXXsyLjIuMn0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bWVzc2FnZV9mcm9tX2ZpbGV9e2ZwXG9wdGlvbmFseywgX2NsYXNzXG9wdGlvbmFseywgc3RyaWN0fX19Ci1SZXR1cm4gYSBtZXNzYWdlIG9iamVjdCBzdHJ1Y3R1cmUgdHJlZSBmcm9tIGFuIG9wZW4gZmlsZSBvYmplY3QuICBUaGlzCi1pcyBleGFjdGx5IGVxdWl2YWxlbnQgdG8gXGNvZGV7UGFyc2VyKCkucGFyc2UoZnApfS4gIE9wdGlvbmFsCi1cdmFye19jbGFzc30gYW5kIFx2YXJ7c3RyaWN0fSBhcmUgaW50ZXJwcmV0ZWQgYXMgd2l0aCB0aGUKLVxjbGFzc3tQYXJzZXJ9IGNsYXNzIGNvbnN0cnVjdG9yLgotCi1cdmVyc2lvbmNoYW5nZWRbVGhlIFx2YXJ7c3RyaWN0fSBmbGFnIHdhcyBhZGRlZF17Mi4yLjJ9Ci1cZW5ke2Z1bmNkZXNjfQotCi1IZXJlJ3MgYW4gZXhhbXBsZSBvZiBob3cgeW91IG1pZ2h0IHVzZSB0aGlzIGF0IGFuIGludGVyYWN0aXZlIFB5dGhvbgotcHJvbXB0OgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gaW1wb3J0IGVtYWlsCi0+Pj4gbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhteVN0cmluZykKLVxlbmR7dmVyYmF0aW19Ci0KLVxzdWJzdWJzZWN0aW9ue0FkZGl0aW9uYWwgbm90ZXN9Ci0KLUhlcmUgYXJlIHNvbWUgbm90ZXMgb24gdGhlIHBhcnNpbmcgc2VtYW50aWNzOgotCi1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtIE1vc3Qgbm9uLVxtaW1ldHlwZXttdWx0aXBhcnR9IHR5cGUgbWVzc2FnZXMgYXJlIHBhcnNlZCBhcyBhIHNpbmdsZQotICAgICAgbWVzc2FnZSBvYmplY3Qgd2l0aCBhIHN0cmluZyBwYXlsb2FkLiAgVGhlc2Ugb2JqZWN0cyB3aWxsIHJldHVybgotICAgICAgXGNvZGV7RmFsc2V9IGZvciBcbWV0aG9ke2lzX211bHRpcGFydCgpfS4gIFRoZWlyCi0gICAgICBcbWV0aG9ke2dldF9wYXlsb2FkKCl9IG1ldGhvZCB3aWxsIHJldHVybiBhIHN0cmluZyBvYmplY3QuCi0KLVxpdGVtIEFsbCBcbWltZXR5cGV7bXVsdGlwYXJ0fSB0eXBlIG1lc3NhZ2VzIHdpbGwgYmUgcGFyc2VkIGFzIGEKLSAgICAgIGNvbnRhaW5lciBtZXNzYWdlIG9iamVjdCB3aXRoIGEgbGlzdCBvZiBzdWItbWVzc2FnZSBvYmplY3RzIGZvcgotICAgICAgdGhlaXIgcGF5bG9hZC4gIFRoZSBvdXRlciBjb250YWluZXIgbWVzc2FnZSB3aWxsIHJldHVybgotICAgICAgXGNvZGV7VHJ1ZX0gZm9yIFxtZXRob2R7aXNfbXVsdGlwYXJ0KCl9IGFuZCB0aGVpcgotICAgICAgXG1ldGhvZHtnZXRfcGF5bG9hZCgpfSBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGxpc3Qgb2YKLSAgICAgIFxjbGFzc3tNZXNzYWdlfSBzdWJwYXJ0cy4KLQotXGl0ZW0gTW9zdCBtZXNzYWdlcyB3aXRoIGEgY29udGVudCB0eXBlIG9mIFxtaW1ldHlwZXttZXNzYWdlLyp9Ci0gICAgICAoZS5nLiBcbWltZXR5cGV7bWVzc2FnZS9kZWxpdmVyeS1zdGF0dXN9IGFuZAotICAgICAgXG1pbWV0eXBle21lc3NhZ2UvcmZjODIyfSkgd2lsbCBhbHNvIGJlIHBhcnNlZCBhcyBjb250YWluZXIKLSAgICAgIG9iamVjdCBjb250YWluaW5nIGEgbGlzdCBwYXlsb2FkIG9mIGxlbmd0aCAxLiAgVGhlaXIKLSAgICAgIFxtZXRob2R7aXNfbXVsdGlwYXJ0KCl9IG1ldGhvZCB3aWxsIHJldHVybiBcY29kZXtUcnVlfS4gIFRoZQotICAgICAgc2luZ2xlIGVsZW1lbnQgaW4gdGhlIGxpc3QgcGF5bG9hZCB3aWxsIGJlIGEgc3ViLW1lc3NhZ2Ugb2JqZWN0LgotCi1caXRlbSBTb21lIG5vbi1zdGFuZGFyZHMgY29tcGxpYW50IG1lc3NhZ2VzIG1heSBub3QgYmUgaW50ZXJuYWxseSBjb25zaXN0ZW50Ci0gICAgICBhYm91dCB0aGVpciBcbWltZXR5cGV7bXVsdGlwYXJ0fS1lZG5lc3MuICBTdWNoIG1lc3NhZ2VzIG1heSBoYXZlIGEKLSAgICAgIFxtYWlsaGVhZGVye0NvbnRlbnQtVHlwZX0gaGVhZGVyIG9mIHR5cGUgXG1pbWV0eXBle211bHRpcGFydH0sIGJ1dCB0aGVpcgotICAgICAgXG1ldGhvZHtpc19tdWx0aXBhcnQoKX0gbWV0aG9kIG1heSByZXR1cm4gXGNvZGV7RmFsc2V9LiAgSWYgc3VjaAotICAgICAgbWVzc2FnZXMgd2VyZSBwYXJzZWQgd2l0aCB0aGUgXGNsYXNze0ZlZWRQYXJzZXJ9LCB0aGV5IHdpbGwgaGF2ZSBhbgotICAgICAgaW5zdGFuY2Ugb2YgdGhlIFxjbGFzc3tNdWx0aXBhcnRJbnZhcmlhbnRWaW9sYXRpb25EZWZlY3R9IGNsYXNzIGluIHRoZWlyCi0gICAgICBcdmFye2RlZmVjdHN9IGF0dHJpYnV0ZSBsaXN0LiAgU2VlIFxyZWZtb2R1bGV7ZW1haWwuZXJyb3JzfSBmb3IKLSAgICAgIGRldGFpbHMuCi1cZW5ke2l0ZW1pemV9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2VtYWlsdXRpbC50ZXggYi9Eb2MvbGliL2VtYWlsdXRpbC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZmUyZDQuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9lbWFpbHV0aWwudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtlbWFpbC51dGlsc30KLVxtb2R1bGVzeW5vcHNpc3tNaXNjZWxsYW5lb3VzIGVtYWlsIHBhY2thZ2UgdXRpbGl0aWVzLn0KLQotVGhlcmUgYXJlIHNldmVyYWwgdXNlZnVsIHV0aWxpdGllcyBwcm92aWRlZCBpbiB0aGUgXG1vZHVsZXtlbWFpbC51dGlsc30KLW1vZHVsZToKLQotXGJlZ2lue2Z1bmNkZXNjfXtxdW90ZX17c3RyfQotUmV0dXJuIGEgbmV3IHN0cmluZyB3aXRoIGJhY2tzbGFzaGVzIGluIFx2YXJ7c3RyfSByZXBsYWNlZCBieSB0d28KLWJhY2tzbGFzaGVzLCBhbmQgZG91YmxlIHF1b3RlcyByZXBsYWNlZCBieSBiYWNrc2xhc2gtZG91YmxlIHF1b3RlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt1bnF1b3RlfXtzdHJ9Ci1SZXR1cm4gYSBuZXcgc3RyaW5nIHdoaWNoIGlzIGFuIFxlbXBoe3VucXVvdGVkfSB2ZXJzaW9uIG9mIFx2YXJ7c3RyfS4KLUlmIFx2YXJ7c3RyfSBlbmRzIGFuZCBiZWdpbnMgd2l0aCBkb3VibGUgcXVvdGVzLCB0aGV5IGFyZSBzdHJpcHBlZAotb2ZmLiAgTGlrZXdpc2UgaWYgXHZhcntzdHJ9IGVuZHMgYW5kIGJlZ2lucyB3aXRoIGFuZ2xlIGJyYWNrZXRzLCB0aGV5Ci1hcmUgc3RyaXBwZWQgb2ZmLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtwYXJzZWFkZHJ9e2FkZHJlc3N9Ci1QYXJzZSBhZGRyZXNzIC0tIHdoaWNoIHNob3VsZCBiZSB0aGUgdmFsdWUgb2Ygc29tZSBhZGRyZXNzLWNvbnRhaW5pbmcKLWZpZWxkIHN1Y2ggYXMgXG1haWxoZWFkZXJ7VG99IG9yIFxtYWlsaGVhZGVye0NjfSAtLSBpbnRvIGl0cyBjb25zdGl0dWVudAotXGVtcGh7cmVhbG5hbWV9IGFuZCBcZW1waHtlbWFpbCBhZGRyZXNzfSBwYXJ0cy4gIFJldHVybnMgYSB0dXBsZSBvZiB0aGF0Ci1pbmZvcm1hdGlvbiwgdW5sZXNzIHRoZSBwYXJzZSBmYWlscywgaW4gd2hpY2ggY2FzZSBhIDItdHVwbGUgb2YKLVxjb2RleygnJywgJycpfSBpcyByZXR1cm5lZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Zm9ybWF0YWRkcn17cGFpcn0KLVRoZSBpbnZlcnNlIG9mIFxtZXRob2R7cGFyc2VhZGRyKCl9LCB0aGlzIHRha2VzIGEgMi10dXBsZSBvZiB0aGUgZm9ybQotXGNvZGV7KHJlYWxuYW1lLCBlbWFpbF9hZGRyZXNzKX0gYW5kIHJldHVybnMgdGhlIHN0cmluZyB2YWx1ZSBzdWl0YWJsZQotZm9yIGEgXG1haWxoZWFkZXJ7VG99IG9yIFxtYWlsaGVhZGVye0NjfSBoZWFkZXIuICBJZiB0aGUgZmlyc3QgZWxlbWVudCBvZgotXHZhcntwYWlyfSBpcyBmYWxzZSwgdGhlbiB0aGUgc2Vjb25kIGVsZW1lbnQgaXMgcmV0dXJuZWQgdW5tb2RpZmllZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0YWRkcmVzc2VzfXtmaWVsZHZhbHVlc30KLVRoaXMgbWV0aG9kIHJldHVybnMgYSBsaXN0IG9mIDItdHVwbGVzIG9mIHRoZSBmb3JtIHJldHVybmVkIGJ5Ci1cY29kZXtwYXJzZWFkZHIoKX0uICBcdmFye2ZpZWxkdmFsdWVzfSBpcyBhIHNlcXVlbmNlIG9mIGhlYWRlciBmaWVsZAotdmFsdWVzIGFzIG1pZ2h0IGJlIHJldHVybmVkIGJ5IFxtZXRob2R7TWVzc2FnZS5nZXRfYWxsKCl9LiAgSGVyZSdzIGEKLXNpbXBsZSBleGFtcGxlIHRoYXQgZ2V0cyBhbGwgdGhlIHJlY2lwaWVudHMgb2YgYSBtZXNzYWdlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1mcm9tIGVtYWlsLnV0aWxzIGltcG9ydCBnZXRhZGRyZXNzZXMKLQotdG9zID0gbXNnLmdldF9hbGwoJ3RvJywgW10pCi1jY3MgPSBtc2cuZ2V0X2FsbCgnY2MnLCBbXSkKLXJlc2VudF90b3MgPSBtc2cuZ2V0X2FsbCgncmVzZW50LXRvJywgW10pCi1yZXNlbnRfY2NzID0gbXNnLmdldF9hbGwoJ3Jlc2VudC1jYycsIFtdKQotYWxsX3JlY2lwaWVudHMgPSBnZXRhZGRyZXNzZXModG9zICsgY2NzICsgcmVzZW50X3RvcyArIHJlc2VudF9jY3MpCi1cZW5ke3ZlcmJhdGltfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtwYXJzZWRhdGV9e2RhdGV9Ci1BdHRlbXB0cyB0byBwYXJzZSBhIGRhdGUgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBpbiBccmZjezI4MjJ9LgotaG93ZXZlciwgc29tZSBtYWlsZXJzIGRvbid0IGZvbGxvdyB0aGF0IGZvcm1hdCBhcyBzcGVjaWZpZWQsIHNvCi1cZnVuY3Rpb257cGFyc2VkYXRlKCl9IHRyaWVzIHRvIGd1ZXNzIGNvcnJlY3RseSBpbiBzdWNoIGNhc2VzLiAKLVx2YXJ7ZGF0ZX0gaXMgYSBzdHJpbmcgY29udGFpbmluZyBhbiBccmZjezI4MjJ9IGRhdGUsIHN1Y2ggYXMgCi1cY29kZXsiTW9uLCAyMCBOb3YgMTk5NSAxOToxMjowOCAtMDUwMCJ9LiAgSWYgaXQgc3VjY2VlZHMgaW4gcGFyc2luZwotdGhlIGRhdGUsIFxmdW5jdGlvbntwYXJzZWRhdGUoKX0gcmV0dXJucyBhIDktdHVwbGUgdGhhdCBjYW4gYmUgcGFzc2VkCi1kaXJlY3RseSB0byBcZnVuY3Rpb257dGltZS5ta3RpbWUoKX07IG90aGVyd2lzZSBcY29kZXtOb25lfSB3aWxsIGJlCi1yZXR1cm5lZC4gIE5vdGUgdGhhdCBpbmRleGVzIDYsIDcsIGFuZCA4IG9mIHRoZSByZXN1bHQgdHVwbGUgYXJlIG5vdAotdXNhYmxlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtwYXJzZWRhdGVfdHp9e2RhdGV9Ci1QZXJmb3JtcyB0aGUgc2FtZSBmdW5jdGlvbiBhcyBcZnVuY3Rpb257cGFyc2VkYXRlKCl9LCBidXQgcmV0dXJucwotZWl0aGVyIFxjb2Rle05vbmV9IG9yIGEgMTAtdHVwbGU7IHRoZSBmaXJzdCA5IGVsZW1lbnRzIG1ha2UgdXAgYSB0dXBsZQotdGhhdCBjYW4gYmUgcGFzc2VkIGRpcmVjdGx5IHRvIFxmdW5jdGlvbnt0aW1lLm1rdGltZSgpfSwgYW5kIHRoZSB0ZW50aAotaXMgdGhlIG9mZnNldCBvZiB0aGUgZGF0ZSdzIHRpbWV6b25lIGZyb20gVVRDICh3aGljaCBpcyB0aGUgb2ZmaWNpYWwKLXRlcm0gZm9yIEdyZWVud2ljaCBNZWFuIFRpbWUpXGZvb3Rub3Rle05vdGUgdGhhdCB0aGUgc2lnbiBvZiB0aGUgdGltZXpvbmUKLW9mZnNldCBpcyB0aGUgb3Bwb3NpdGUgb2YgdGhlIHNpZ24gb2YgdGhlIFxjb2Rle3RpbWUudGltZXpvbmV9Ci12YXJpYWJsZSBmb3IgdGhlIHNhbWUgdGltZXpvbmU7IHRoZSBsYXR0ZXIgdmFyaWFibGUgZm9sbG93cyB0aGUKLVxQT1NJWHt9IHN0YW5kYXJkIHdoaWxlIHRoaXMgbW9kdWxlIGZvbGxvd3MgXHJmY3syODIyfS59LiAgSWYgdGhlIGlucHV0Ci1zdHJpbmcgaGFzIG5vIHRpbWV6b25lLCB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSB0dXBsZSByZXR1cm5lZCBpcwotXGNvZGV7Tm9uZX0uICBOb3RlIHRoYXQgaW5kZXhlcyA2LCA3LCBhbmQgOCBvZiB0aGUgcmVzdWx0IHR1cGxlIGFyZSBub3QKLXVzYWJsZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bWt0aW1lX3R6fXt0dXBsZX0KLVR1cm4gYSAxMC10dXBsZSBhcyByZXR1cm5lZCBieSBcZnVuY3Rpb257cGFyc2VkYXRlX3R6KCl9IGludG8gYSBVVEMKLXRpbWVzdGFtcC4gIEl0IHRoZSB0aW1lem9uZSBpdGVtIGluIHRoZSB0dXBsZSBpcyBcY29kZXtOb25lfSwgYXNzdW1lCi1sb2NhbCB0aW1lLiAgTWlub3IgZGVmaWNpZW5jeTogXGZ1bmN0aW9ue21rdGltZV90eigpfSBpbnRlcnByZXRzIHRoZQotZmlyc3QgOCBlbGVtZW50cyBvZiBcdmFye3R1cGxlfSBhcyBhIGxvY2FsIHRpbWUgYW5kIHRoZW4gY29tcGVuc2F0ZXMKLWZvciB0aGUgdGltZXpvbmUgZGlmZmVyZW5jZS4gIFRoaXMgbWF5IHlpZWxkIGEgc2xpZ2h0IGVycm9yIGFyb3VuZAotY2hhbmdlcyBpbiBkYXlsaWdodCBzYXZpbmdzIHRpbWUsIHRob3VnaCBub3Qgd29ydGggd29ycnlpbmcgYWJvdXQgZm9yCi1jb21tb24gdXNlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtmb3JtYXRkYXRlfXtcb3B0aW9uYWx7dGltZXZhbFxvcHRpb25hbHssIGxvY2FsdGltZX1cb3B0aW9uYWx7LCB1c2VnbXR9fX0KLVJldHVybnMgYSBkYXRlIHN0cmluZyBhcyBwZXIgXHJmY3syODIyfSwgZS5nLjoKLQotXGJlZ2lue3ZlcmJhdGltfQotRnJpLCAwOSBOb3YgMjAwMSAwMTowODo0NyAtMDAwMAotXGVuZHt2ZXJiYXRpbX0KLQotT3B0aW9uYWwgXHZhcnt0aW1ldmFsfSBpZiBnaXZlbiBpcyBhIGZsb2F0aW5nIHBvaW50IHRpbWUgdmFsdWUgYXMKLWFjY2VwdGVkIGJ5IFxmdW5jdGlvbnt0aW1lLmdtdGltZSgpfSBhbmQgXGZ1bmN0aW9ue3RpbWUubG9jYWx0aW1lKCl9LAotb3RoZXJ3aXNlIHRoZSBjdXJyZW50IHRpbWUgaXMgdXNlZC4KLQotT3B0aW9uYWwgXHZhcntsb2NhbHRpbWV9IGlzIGEgZmxhZyB0aGF0IHdoZW4gXGNvZGV7VHJ1ZX0sIGludGVycHJldHMKLVx2YXJ7dGltZXZhbH0sIGFuZCByZXR1cm5zIGEgZGF0ZSByZWxhdGl2ZSB0byB0aGUgbG9jYWwgdGltZXpvbmUKLWluc3RlYWQgb2YgVVRDLCBwcm9wZXJseSB0YWtpbmcgZGF5bGlnaHQgc2F2aW5ncyB0aW1lIGludG8gYWNjb3VudC4KLVRoZSBkZWZhdWx0IGlzIFxjb2Rle0ZhbHNlfSBtZWFuaW5nIFVUQyBpcyB1c2VkLgotCi1PcHRpb25hbCBcdmFye3VzZWdtdH0gaXMgYSBmbGFnIHRoYXQgd2hlbiBcY29kZXtUcnVlfSwgb3V0cHV0cyBhIAotZGF0ZSBzdHJpbmcgd2l0aCB0aGUgdGltZXpvbmUgYXMgYW4gYXNjaWkgc3RyaW5nIFxjb2Rle0dNVH0sIHJhdGhlcgotdGhhbiBhIG51bWVyaWMgXGNvZGV7LTAwMDB9LiBUaGlzIGlzIG5lZWRlZCBmb3Igc29tZSBwcm90b2NvbHMgKHN1Y2gKLWFzIEhUVFApLiBUaGlzIG9ubHkgYXBwbGllcyB3aGVuIFx2YXJ7bG9jYWx0aW1lfSBpcyBcY29kZXtGYWxzZX0uCi1cdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bWFrZV9tc2dpZH17XG9wdGlvbmFse2lkc3RyaW5nfX0KLVJldHVybnMgYSBzdHJpbmcgc3VpdGFibGUgZm9yIGFuIFxyZmN7MjgyMn0tY29tcGxpYW50Ci1cbWFpbGhlYWRlcntNZXNzYWdlLUlEfSBoZWFkZXIuICBPcHRpb25hbCBcdmFye2lkc3RyaW5nfSBpZiBnaXZlbiwgaXMKLWEgc3RyaW5nIHVzZWQgdG8gc3RyZW5ndGhlbiB0aGUgdW5pcXVlbmVzcyBvZiB0aGUgbWVzc2FnZSBpZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZGVjb2RlX3JmYzIyMzF9e3N9Ci1EZWNvZGUgdGhlIHN0cmluZyBcdmFye3N9IGFjY29yZGluZyB0byBccmZjezIyMzF9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtlbmNvZGVfcmZjMjIzMX17c1xvcHRpb25hbHssIGNoYXJzZXRcb3B0aW9uYWx7LCBsYW5ndWFnZX19fQotRW5jb2RlIHRoZSBzdHJpbmcgXHZhcntzfSBhY2NvcmRpbmcgdG8gXHJmY3syMjMxfS4gIE9wdGlvbmFsCi1cdmFye2NoYXJzZXR9IGFuZCBcdmFye2xhbmd1YWdlfSwgaWYgZ2l2ZW4gaXMgdGhlIGNoYXJhY3RlciBzZXQgbmFtZQotYW5kIGxhbmd1YWdlIG5hbWUgdG8gdXNlLiAgSWYgbmVpdGhlciBpcyBnaXZlbiwgXHZhcntzfSBpcyByZXR1cm5lZAotYXMtaXMuICBJZiBcdmFye2NoYXJzZXR9IGlzIGdpdmVuIGJ1dCBcdmFye2xhbmd1YWdlfSBpcyBub3QsIHRoZQotc3RyaW5nIGlzIGVuY29kZWQgdXNpbmcgdGhlIGVtcHR5IHN0cmluZyBmb3IgXHZhcntsYW5ndWFnZX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2NvbGxhcHNlX3JmYzIyMzFfdmFsdWV9e3ZhbHVlXG9wdGlvbmFseywgZXJyb3JzXG9wdGlvbmFseywKLSAgICBmYWxsYmFja19jaGFyc2V0fX19Ci1XaGVuIGEgaGVhZGVyIHBhcmFtZXRlciBpcyBlbmNvZGVkIGluIFxyZmN7MjIzMX0gZm9ybWF0LAotXG1ldGhvZHtNZXNzYWdlLmdldF9wYXJhbSgpfSBtYXkgcmV0dXJuIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBjaGFyYWN0ZXIKLXNldCwgbGFuZ3VhZ2UsIGFuZCB2YWx1ZS4gIFxmdW5jdGlvbntjb2xsYXBzZV9yZmMyMjMxX3ZhbHVlKCl9IHR1cm5zIHRoaXMgaW50bwotYSB1bmljb2RlIHN0cmluZy4gIE9wdGlvbmFsIFx2YXJ7ZXJyb3JzfSBpcyBwYXNzZWQgdG8gdGhlIFx2YXJ7ZXJyb3JzfQotYXJndW1lbnQgb2YgdGhlIGJ1aWx0LWluIFxmdW5jdGlvbnt1bmljb2RlKCl9IGZ1bmN0aW9uOyBpdCBkZWZhdWx0cyB0bwotXGNvZGV7cmVwbGFjZX0uICBPcHRpb25hbCBcdmFye2ZhbGxiYWNrX2NoYXJzZXR9IHNwZWNpZmllcyB0aGUgY2hhcmFjdGVyIHNldAotdG8gdXNlIGlmIHRoZSBvbmUgaW4gdGhlIFxyZmN7MjIzMX0gaGVhZGVyIGlzIG5vdCBrbm93biBieSBQeXRob247IGl0IGRlZmF1bHRzCi10byBcY29kZXt1cy1hc2NpaX0uCi0KLUZvciBjb252ZW5pZW5jZSwgaWYgdGhlIFx2YXJ7dmFsdWV9IHBhc3NlZCB0bwotXGZ1bmN0aW9ue2NvbGxhcHNlX3JmYzIyMzFfdmFsdWUoKX0gaXMgbm90IGEgdHVwbGUsIGl0IHNob3VsZCBiZSBhIHN0cmluZyBhbmQKLWl0IGlzIHJldHVybmVkIHVucXVvdGVkLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtkZWNvZGVfcGFyYW1zfXtwYXJhbXN9Ci1EZWNvZGUgcGFyYW1ldGVycyBsaXN0IGFjY29yZGluZyB0byBccmZjezIyMzF9LiAgXHZhcntwYXJhbXN9IGlzIGEKLXNlcXVlbmNlIG9mIDItdHVwbGVzIGNvbnRhaW5pbmcgZWxlbWVudHMgb2YgdGhlIGZvcm0KLVxjb2Rleyhjb250ZW50LXR5cGUsIHN0cmluZy12YWx1ZSl9LgotXGVuZHtmdW5jZGVzY30KLQotXHZlcnNpb25jaGFuZ2VkW1RoZSBcZnVuY3Rpb257ZHVtcF9hZGRyZXNzX3BhaXIoKX0gZnVuY3Rpb24gaGFzIGJlZW4gcmVtb3ZlZDsKLXVzZSBcZnVuY3Rpb257Zm9ybWF0YWRkcigpfSBpbnN0ZWFkXXsyLjR9Ci0KLVx2ZXJzaW9uY2hhbmdlZFtUaGUgXGZ1bmN0aW9ue2RlY29kZSgpfSBmdW5jdGlvbiBoYXMgYmVlbiByZW1vdmVkOyB1c2UgdGhlCi1cbWV0aG9ke0hlYWRlci5kZWNvZGVfaGVhZGVyKCl9IG1ldGhvZCBpbnN0ZWFkXXsyLjR9Ci0KLVx2ZXJzaW9uY2hhbmdlZFtUaGUgXGZ1bmN0aW9ue2VuY29kZSgpfSBmdW5jdGlvbiBoYXMgYmVlbiByZW1vdmVkOyB1c2UgdGhlCi1cbWV0aG9ke0hlYWRlci5lbmNvZGUoKX0gbWV0aG9kIGluc3RlYWRdezIuNH0KZGlmZiAtLWdpdCBhL0RvYy9saWIvZmlsZWZvcm1hdHMudGV4IGIvRG9jL2xpYi9maWxlZm9ybWF0cy50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmOWMxMTYuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9maWxlZm9ybWF0cy50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVxjaGFwdGVye0ZpbGUgRm9ybWF0c30KLVxsYWJlbHtmaWxlZm9ybWF0c30KLQotVGhlIG1vZHVsZXMgZGVzY3JpYmVkIGluIHRoaXMgY2hhcHRlciBwYXJzZSB2YXJpb3VzIG1pc2NlbGxhbmVvdXMgZmlsZQotZm9ybWF0cyB0aGF0IGFyZW4ndCBtYXJrdXAgbGFuZ3VhZ2VzIG9yIGFyZSByZWxhdGVkIHRvIGUtbWFpbC4KLQotXGxvY2FsbW9kdWxldGFibGUKZGlmZiAtLWdpdCBhL0RvYy9saWIvZmlsZXN5cy50ZXggYi9Eb2MvbGliL2ZpbGVzeXMudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzY4MmM4Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvZmlsZXN5cy50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1cY2hhcHRlcntGaWxlIGFuZCBEaXJlY3RvcnkgQWNjZXNzfQotXGxhYmVse2ZpbGVzeXN9Ci0KLVRoZSBtb2R1bGVzIGRlc2NyaWJlZCBpbiB0aGlzIGNoYXB0ZXIgZGVhbCB3aXRoIGRpc2sgZmlsZXMgYW5kCi1kaXJlY3Rvcmllcy4gIEZvciBleGFtcGxlLCB0aGVyZSBhcmUgbW9kdWxlcyBmb3IgcmVhZGluZyB0aGUKLXByb3BlcnRpZXMgb2YgZmlsZXMsIG1hbmlwdWxhdGluZyBwYXRocyBpbiBhIHBvcnRhYmxlIHdheSwgYW5kCi1jcmVhdGluZyB0ZW1wb3JhcnkgZmlsZXMuICBUaGUgZnVsbCBsaXN0IG9mIG1vZHVsZXMgaW4gdGhpcyBjaGFwdGVyIGlzOgotCi1cbG9jYWxtb2R1bGV0YWJsZQotCi0lIFhYWCBjYW4gdGhpcyBiZSBpbmNsdWRlZCBpbiB0aGUgc2VlYWxzbyBlbnZpcm9ubWVudD8gLS1hbWsKLUFsc28gc2VlIHNlY3Rpb24gXHJlZntibHRpbi1maWxlLW9iamVjdHN9IGZvciBhIGRlc2NyaXB0aW9uIAotb2YgUHl0aG9uJ3MgYnVpbHQtaW4gZmlsZSBvYmplY3RzLgotCi1cYmVnaW57c2VlYWxzb30KLSAgICBcc2VlbW9kdWxle29zfXtPcGVyYXRpbmcgc3lzdGVtIGludGVyZmFjZXMsIGluY2x1ZGluZyBmdW5jdGlvbnMgdG8KLSAgICB3b3JrIHdpdGggZmlsZXMgYXQgYSBsb3dlciBsZXZlbCB0aGFuIHRoZSBidWlsdC1pbiBmaWxlIG9iamVjdC59IAotXGVuZHtzZWVhbHNvfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9mcmFtZXdvcmtzLnRleCBiL0RvYy9saWIvZnJhbWV3b3Jrcy50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZTMwMGUuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9mcmFtZXdvcmtzLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLVxjaGFwdGVye1Byb2dyYW0gRnJhbWV3b3Jrc30KLVxsYWJlbHtmcmFtZXdvcmtzfQotCi1UaGUgbW9kdWxlcyBkZXNjcmliZWQgaW4gdGhpcyBjaGFwdGVyIGFyZSBmcmFtZXdvcmtzIHRoYXQgd2lsbCBsYXJnZWx5Ci1kaWN0YXRlIHRoZSBzdHJ1Y3R1cmUgb2YgeW91ciBwcm9ncmFtLiAgQ3VycmVudGx5IHRoZSBtb2R1bGVzIGRlc2NyaWJlZCAKLWhlcmUgYXJlIGFsbCBvcmllbnRlZCB0b3dhcmQgd3JpdGluZyBjb21tYW5kLWxpbmUgaW50ZXJmYWNlcy4KLQotVGhlIGZ1bGwgbGlzdCBvZiBtb2R1bGVzIGRlc2NyaWJlZCBpbiB0aGlzIGNoYXB0ZXIgaXM6Ci0KLVxsb2NhbG1vZHVsZXRhYmxlCmRpZmYgLS1naXQgYS9Eb2MvbGliL2kxOG4udGV4IGIvRG9jL2xpYi9pMThuLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk5YTYwYy4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2kxOG4udGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotXGNoYXB0ZXJ7SW50ZXJuYXRpb25hbGl6YXRpb259Ci1cbGFiZWx7aTE4bn0KLQotVGhlIG1vZHVsZXMgZGVzY3JpYmVkIGluIHRoaXMgY2hhcHRlciBoZWxwIHlvdSB3cml0ZQotc29mdHdhcmUgdGhhdCBpcyBpbmRlcGVuZGVudCBvZiBsYW5ndWFnZSBhbmQgbG9jYWxlCi1ieSBwcm92aWRpbmcgbWVjaGFuaXNtcyBmb3Igc2VsZWN0aW5nIGEgbGFuZ3VhZ2UgdG8gYmUgdXNlZCBpbiAKLXByb2dyYW0gbWVzc2FnZXMgb3IgYnkgdGFpbG9yaW5nIG91dHB1dCB0byBtYXRjaCBsb2NhbCBjb252ZW50aW9ucy4KLQotVGhlIGxpc3Qgb2YgbW9kdWxlcyBkZXNjcmliZWQgaW4gdGhpcyBjaGFwdGVyIGlzOgotCi1cbG9jYWxtb2R1bGV0YWJsZQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9pbnRlcm5ldC50ZXggYi9Eb2MvbGliL2ludGVybmV0LnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJhYzRiMy4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2ludGVybmV0LnRleAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLVxjaGFwdGVye0ludGVybmV0IFByb3RvY29scyBhbmQgU3VwcG9ydCBcbGFiZWx7aW50ZXJuZXR9fQotCi1caW5kZXh7V1dXfQotXGluZGV4e0ludGVybmV0fQotXGluZGV4e1dvcmxkIFdpZGUgV2VifQotCi1UaGUgbW9kdWxlcyBkZXNjcmliZWQgaW4gdGhpcyBjaGFwdGVyIGltcGxlbWVudCBJbnRlcm5ldCBwcm90b2NvbHMgYW5kIAotc3VwcG9ydCBmb3IgcmVsYXRlZCB0ZWNobm9sb2d5LiAgVGhleSBhcmUgYWxsIGltcGxlbWVudGVkIGluIFB5dGhvbi4KLU1vc3Qgb2YgdGhlc2UgbW9kdWxlcyByZXF1aXJlIHRoZSBwcmVzZW5jZSBvZiB0aGUgc3lzdGVtLWRlcGVuZGVudAotbW9kdWxlIFxyZWZtb2R1bGV7c29ja2V0fVxyZWZiaW1vZGluZGV4e3NvY2tldH0sIHdoaWNoIGlzIGN1cnJlbnRseQotc3VwcG9ydGVkIG9uIG1vc3QgcG9wdWxhciBwbGF0Zm9ybXMuICBIZXJlIGlzIGFuIG92ZXJ2aWV3OgotCi1cbG9jYWxtb2R1bGV0YWJsZQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9pcGMudGV4IGIvRG9jL2xpYi9pcGMudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDk1MDU2Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvaXBjLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLVxjaGFwdGVye0ludGVycHJvY2VzcyBDb21tdW5pY2F0aW9uIGFuZCBOZXR3b3JraW5nfQotXGxhYmVse2lwY30KLQotVGhlIG1vZHVsZXMgZGVzY3JpYmVkIGluIHRoaXMgY2hhcHRlciBwcm92aWRlIG1lY2hhbmlzbXMgZm9yIGRpZmZlcmVudAotcHJvY2Vzc2VzIHRvIGNvbW11bmljYXRlLgotCi1Tb21lIG1vZHVsZXMgb25seSB3b3JrIGZvciB0d28gcHJvY2Vzc2VzIHRoYXQgYXJlIG9uIHRoZSBzYW1lIG1hY2hpbmUsCi1lLmcuICBcbW9kdWxle3NpZ25hbH0gYW5kIFxtb2R1bGV7c3VicHJvY2Vzc30uICBPdGhlciBtb2R1bGVzIHN1cHBvcnQKLW5ldHdvcmtpbmcgcHJvdG9jb2xzIHRoYXQgdHdvIG9yIG1vcmUgcHJvY2Vzc2VzIGNhbiB1c2VkIHRvCi1jb21tdW5pY2F0ZSBhY3Jvc3MgbWFjaGluZXMuCi0KLVRoZSBsaXN0IG9mIG1vZHVsZXMgZGVzY3JpYmVkIGluIHRoaXMgY2hhcHRlciBpczoKLQotXGxvY2FsbW9kdWxldGFibGUKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGFuZ3VhZ2UudGV4IGIvRG9jL2xpYi9sYW5ndWFnZS50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZGIxMTMuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9sYW5ndWFnZS50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1cY2hhcHRlcntQeXRob24gTGFuZ3VhZ2UgU2VydmljZXMKLSAgICAgICAgIFxsYWJlbHtsYW5ndWFnZX19Ci0KLVB5dGhvbiBwcm92aWRlcyBhIG51bWJlciBvZiBtb2R1bGVzIHRvIGFzc2lzdCBpbiB3b3JraW5nIHdpdGggdGhlCi1QeXRob24gbGFuZ3VhZ2UuICBUaGVzZSBtb2R1bGVzIHN1cHBvcnQgdG9rZW5pemluZywgcGFyc2luZywgc3ludGF4Ci1hbmFseXNpcywgYnl0ZWNvZGUgZGlzYXNzZW1ibHksIGFuZCB2YXJpb3VzIG90aGVyIGZhY2lsaXRpZXMuCi0KLVRoZXNlIG1vZHVsZXMgaW5jbHVkZToKLQotXGxvY2FsbW9kdWxldGFibGUKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliLnRleCBiL0RvYy9saWIvbGliLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ1YWM1NS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYi50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw0NTIgKzAsMCBAQAotXGRvY3VtZW50Y2xhc3N7bWFudWFsfQotCi0lIE5PVEU6IHRoaXMgZmlsZSBjb250cm9scyB3aGljaCBjaGFwdGVycy9zZWN0aW9ucyBvZiB0aGUgbGlicmFyeQotJSBtYW51YWwgYXJlIGFjdHVhbGx5IHByaW50ZWQuICBJdCBpcyBlYXN5IHRvIGN1c3RvbWl6ZSB5b3VyIG1hbnVhbAotJSBieSBjb21tZW50aW5nIG91dCBzZWN0aW9ucyB0aGF0IHlvdSdyZSBub3QgaW50ZXJlc3RlZCBpbi4KLQotXHRpdGxle1B5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZX0KLQotXGlucHV0e2JvaWxlcnBsYXRlfQotCi1cbWFrZWluZGV4ICAgICAgICAgICAgICAgICAgICAgICUgdGVsbCBcaW5kZXggdG8gYWN0dWFsbHkgd3JpdGUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgLmlkeCBmaWxlCi1cbWFrZW1vZGluZGV4ICAgICAgICAgICAgICAgICAgICUgLi4uIGFuZCB0aGUgbW9kdWxlIGluZGV4IGFzIHdlbGwuCi0KLSAKLVxiZWdpbntkb2N1bWVudH0KLQotXG1ha2V0aXRsZQotCi1caWZodG1sCi1cY2hhcHRlcip7RnJvbnQgTWF0dGVyXGxhYmVse2Zyb250fX0KLVxmaQotCi1caW5wdXR7Y29weXJpZ2h0fQotCi1cYmVnaW57YWJzdHJhY3R9Ci0KLVxub2luZGVudAotUHl0aG9uIGlzIGFuIGV4dGVuc2libGUsIGludGVycHJldGVkLCBvYmplY3Qtb3JpZW50ZWQgcHJvZ3JhbW1pbmcKLWxhbmd1YWdlLiAgSXQgc3VwcG9ydHMgYSB3aWRlIHJhbmdlIG9mIGFwcGxpY2F0aW9ucywgZnJvbSBzaW1wbGUgdGV4dAotcHJvY2Vzc2luZyBzY3JpcHRzIHRvIGludGVyYWN0aXZlIFdlYiBicm93c2Vycy4KLQotV2hpbGUgdGhlIFxjaXRldGl0bGVbLi4vcmVmL3JlZi5odG1sXXtQeXRob24gUmVmZXJlbmNlIE1hbnVhbH0KLWRlc2NyaWJlcyB0aGUgZXhhY3Qgc3ludGF4IGFuZCBzZW1hbnRpY3Mgb2YgdGhlIGxhbmd1YWdlLCBpdCBkb2VzIG5vdAotZGVzY3JpYmUgdGhlIHN0YW5kYXJkIGxpYnJhcnkgdGhhdCBpcyBkaXN0cmlidXRlZCB3aXRoIHRoZSBsYW5ndWFnZSwKLWFuZCB3aGljaCBncmVhdGx5IGVuaGFuY2VzIGl0cyBpbW1lZGlhdGUgdXNhYmlsaXR5LiAgVGhpcyBsaWJyYXJ5Ci1jb250YWlucyBidWlsdC1pbiBtb2R1bGVzICh3cml0dGVuIGluIEMpIHRoYXQgcHJvdmlkZSBhY2Nlc3MgdG8gc3lzdGVtCi1mdW5jdGlvbmFsaXR5IHN1Y2ggYXMgZmlsZSBJL08gdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgaW5hY2Nlc3NpYmxlIHRvCi1QeXRob24gcHJvZ3JhbW1lcnMsIGFzIHdlbGwgYXMgbW9kdWxlcyB3cml0dGVuIGluIFB5dGhvbiB0aGF0IHByb3ZpZGUKLXN0YW5kYXJkaXplZCBzb2x1dGlvbnMgZm9yIG1hbnkgcHJvYmxlbXMgdGhhdCBvY2N1ciBpbiBldmVyeWRheQotcHJvZ3JhbW1pbmcuICBTb21lIG9mIHRoZXNlIG1vZHVsZXMgYXJlIGV4cGxpY2l0bHkgZGVzaWduZWQgdG8KLWVuY291cmFnZSBhbmQgZW5oYW5jZSB0aGUgcG9ydGFiaWxpdHkgb2YgUHl0aG9uIHByb2dyYW1zLgotCi1UaGlzIGxpYnJhcnkgcmVmZXJlbmNlIG1hbnVhbCBkb2N1bWVudHMgUHl0aG9uJ3Mgc3RhbmRhcmQgbGlicmFyeSwgYXMKLXdlbGwgYXMgbWFueSBvcHRpb25hbCBsaWJyYXJ5IG1vZHVsZXMgKHdoaWNoIG1heSBvciBtYXkgbm90IGJlCi1hdmFpbGFibGUsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSB1bmRlcmx5aW5nIHBsYXRmb3JtIHN1cHBvcnRzIHRoZW0KLWFuZCBvbiB0aGUgY29uZmlndXJhdGlvbiBjaG9pY2VzIG1hZGUgYXQgY29tcGlsZSB0aW1lKS4gIEl0IGFsc28KLWRvY3VtZW50cyB0aGUgc3RhbmRhcmQgdHlwZXMgb2YgdGhlIGxhbmd1YWdlIGFuZCBpdHMgYnVpbHQtaW4KLWZ1bmN0aW9ucyBhbmQgZXhjZXB0aW9ucywgbWFueSBvZiB3aGljaCBhcmUgbm90IG9yIGluY29tcGxldGVseQotZG9jdW1lbnRlZCBpbiB0aGUgUmVmZXJlbmNlIE1hbnVhbC4KLQotVGhpcyBtYW51YWwgYXNzdW1lcyBiYXNpYyBrbm93bGVkZ2UgYWJvdXQgdGhlIFB5dGhvbiBsYW5ndWFnZS4gIEZvciBhbgotaW5mb3JtYWwgaW50cm9kdWN0aW9uIHRvIFB5dGhvbiwgc2VlIHRoZQotXGNpdGV0aXRsZVsuLi90dXQvdHV0Lmh0bWxde1B5dGhvbiBUdXRvcmlhbH07IHRoZQotXGNpdGV0aXRsZVsuLi9yZWYvcmVmLmh0bWxde1B5dGhvbiBSZWZlcmVuY2UgTWFudWFsfSByZW1haW5zIHRoZQotaGlnaGVzdCBhdXRob3JpdHkgb24gc3ludGFjdGljIGFuZCBzZW1hbnRpYyBxdWVzdGlvbnMuICBGaW5hbGx5LCB0aGUKLW1hbnVhbCBlbnRpdGxlZCBcY2l0ZXRpdGxlWy4uL2V4dC9leHQuaHRtbF17RXh0ZW5kaW5nIGFuZCBFbWJlZGRpbmcKLXRoZSBQeXRob24gSW50ZXJwcmV0ZXJ9IGRlc2NyaWJlcyBob3cgdG8gYWRkIG5ldyBleHRlbnNpb25zIHRvIFB5dGhvbgotYW5kIGhvdyB0byBlbWJlZCBpdCBpbiBvdGhlciBhcHBsaWNhdGlvbnMuCi0KLVxlbmR7YWJzdHJhY3R9Ci0KLVx0YWJsZW9mY29udGVudHMKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIENoYXB0ZXIgdGl0bGU6Ci0KLVxpbnB1dHtsaWJpbnRyb30gICAgICAgICAgICAgICAgJSBJbnRyb2R1Y3Rpb24KLQotCi0lID09PT09PT09PT09PT0KLSUgQlVJTFQtSU5zCi0lID09PT09PT09PT09PT0KLQotXGlucHV0e2xpYm9ianN9ICAgICAgICAgICAgICAgICAlIEJ1aWx0LWluIEV4Y2VwdGlvbnMgYW5kIEZ1bmN0aW9ucwotXGlucHV0e2xpYmZ1bmNzfQotXGlucHV0e2xpYmV4Y3N9Ci1caW5wdXR7bGliY29uc3RzfQotCi1caW5wdXR7bGlic3RkdHlwZXN9ICAgICAgICAgICAgICUgQnVpbHQtaW4gdHlwZXMKLQotCi0lID09PT09PT09PT09PT0KLSUgQkFTSUMvR0VORVJBTC1QVVJQT1NFIE9CSkVDVFMKLSUgPT09PT09PT09PT09PQotCi0lIFN0cmluZ3MKLVxpbnB1dHtsaWJzdHJpbmdzfSAgICAgICAgICAgICAgJSBTdHJpbmcgU2VydmljZXMKLVxpbnB1dHtsaWJzdHJpbmd9Ci1caW5wdXR7bGlicmV9Ci1caW5wdXR7bGlic3RydWN0fSAgICUgWFhYIGFsc28vYmV0dGVyIGluIEZpbGUgRm9ybWF0cz8KLVxpbnB1dHtsaWJkaWZmbGlifQotXGlucHV0e2xpYnN0cmluZ2lvfQotXGlucHV0e2xpYnRleHR3cmFwfQotXGlucHV0e2xpYmNvZGVjc30KLVxpbnB1dHtsaWJ1bmljb2RlZGF0YX0KLVxpbnB1dHtsaWJzdHJpbmdwcmVwfQotXGlucHV0e2xpYmZwZm9ybWF0fQotCi0KLVxpbnB1dHtkYXRhdHlwZXN9CQklIERhdGEgdHlwZXMgYW5kIHN0cnVjdHVyZXMKLVxpbnB1dHtsaWJkYXRldGltZX0KLVxpbnB1dHtsaWJjYWxlbmRhcn0KLVxpbnB1dHtsaWJjb2xsZWN0aW9uc30KLVxpbnB1dHtsaWJoZWFwcX0KLVxpbnB1dHtsaWJiaXNlY3R9Ci1caW5wdXR7bGliYXJyYXl9Ci1caW5wdXR7bGlic2NoZWR9Ci1caW5wdXR7bGlibXV0ZXh9Ci1caW5wdXR7bGlicXVldWV9Ci1caW5wdXR7bGlid2Vha3JlZn0KLVxpbnB1dHtsaWJ1c2VyZGljdH0KLQotJSBHZW5lcmFsIG9iamVjdCBzZXJ2aWNlcwotJSBYWFggaW50cm8KLVxpbnB1dHtsaWJ0eXBlc30KLVxpbnB1dHtsaWJuZXd9Ci1caW5wdXR7bGliY29weX0KLVxpbnB1dHtsaWJwcHJpbnR9Ci1caW5wdXR7bGlicmVwcn0KLQotCi1caW5wdXR7bnVtZXJpY30JCQklIE51bWVyaWMvTWF0aGVtYXRpY2FsIG1vZHVsZXMKLVxpbnB1dHtsaWJtYXRofQotXGlucHV0e2xpYmNtYXRofQotXGlucHV0e2xpYmRlY2ltYWx9Ci1caW5wdXR7bGlicmFuZG9tfQotCi0lIEZ1bmN0aW9ucywgRnVuY3Rpb25hbCwgR2VuZXJhdG9ycyBhbmQgSXRlcmF0b3JzCi0lIFhYWCBpbnRybyBmdW5jdGlvbmFsCi1caW5wdXR7bGliaXRlcnRvb2xzfQotXGlucHV0e2xpYmZ1bmN0b29sc30KLVxpbnB1dHtsaWJvcGVyYXRvcn0gICAgICAgJSBmcm9tIHJ1bnRpbWUgLSBiZXR0ZXIgd2l0aCBpdGVydG9vbHMgYW5kIGZ1bmN0b29scwotCi0KLSUgPT09PT09PT09PT09PQotJSBEQVRBIEZPUk1BVFMKLSUgPT09PT09PT09PT09PQotCi0lIEJpZyBtb3ZlIC0gaW5jbHVkZSBhbGwgdGhlIG1hcmt1cCBhbmQgaW50ZXJuZXQgZm9ybWF0cyBoZXJlCi0KLSUgTUlNRSAmIGVtYWlsIHN0dWZmCi1caW5wdXR7bmV0ZGF0YX0gICAgICAgICAgICAgICAgICUgSW50ZXJuZXQgRGF0YSBIYW5kbGluZwotXGlucHV0e2VtYWlsfQotXGlucHV0e2xpYm1haWxjYXB9Ci1caW5wdXR7bGlibWFpbGJveH0KLVxpbnB1dHtsaWJtaGxpYn0KLVxpbnB1dHtsaWJtaW1ldG9vbHN9Ci1caW5wdXR7bGlibWltZXR5cGVzfQotXGlucHV0e2xpYm11bHRpZmlsZX0KLVxpbnB1dHtsaWJyZmM4MjJ9Ci0KLSUgZW5jb2Rpbmcgc3R1ZmYKLVxpbnB1dHtsaWJiYXNlNjR9Ci1caW5wdXR7bGliYmluaGV4fQotXGlucHV0e2xpYmJpbmFzY2lpfQotXGlucHV0e2xpYnF1b3ByaX0KLVxpbnB1dHtsaWJ1dX0KLQotXGlucHV0e21hcmt1cH0gICAgICAgICAgICAgICAgICAlIFN0cnVjdHVyZWQgTWFya3VwIFByb2Nlc3NpbmcgVG9vbHMKLVxpbnB1dHtsaWJodG1scGFyc2VyfQotXGlucHV0e2xpYnNnbWxsaWJ9Ci1caW5wdXR7bGliaHRtbGxpYn0KLVxpbnB1dHtsaWJweWV4cGF0fQotXGlucHV0e3htbGRvbX0KLVxpbnB1dHt4bWxkb21taW5pZG9tfQotXGlucHV0e3htbGRvbXB1bGxkb219Ci1caW5wdXR7eG1sc2F4fQotXGlucHV0e3htbHNheGhhbmRsZXJ9Ci1caW5wdXR7eG1sc2F4dXRpbHN9Ci1caW5wdXR7eG1sc2F4cmVhZGVyfQotXGlucHV0e2xpYmV0cmVlfQotCi1caW5wdXR7ZmlsZWZvcm1hdHN9CQklIE1pc2NlbGxhbmVvdXMgZmlsZSBmb3JtYXRzCi1caW5wdXR7bGliY3N2fQotXGlucHV0e2xpYmNmZ3BhcnNlcn0KLVxpbnB1dHtsaWJyb2JvdHBhcnNlcn0KLVxpbnB1dHtsaWJuZXRyY30KLVxpbnB1dHtsaWJ4ZHJsaWJ9Ci0KLVxpbnB1dHtsaWJjcnlwdG99ICAgICAgICAgICAgICAgJSBDcnlwdG9ncmFwaGljIFNlcnZpY2VzCi1caW5wdXR7bGliaGFzaGxpYn0KLVxpbnB1dHtsaWJobWFjfQotCi0lID09PT09PT09PT09PT0KLSUgRklMRSAmIERBVEFCQVNFIFNUT1JBR0UKLSUgPT09PT09PT09PT09PQotCi1caW5wdXR7ZmlsZXN5c30JCQklIEZpbGUvZGlyZWN0b3J5IHN1cHBvcnQKLVxpbnB1dHtsaWJwb3NpeHBhdGh9ICAgICAgICAgICAgJSBvcy5wYXRoCi1caW5wdXR7bGliZmlsZWlucHV0fQotXGlucHV0e2xpYnN0YXR9Ci1caW5wdXR7bGlic3RhdHZmc30KLVxpbnB1dHtsaWJmaWxlY21wfQotXGlucHV0e2xpYnRlbXBmaWxlfQotXGlucHV0e2xpYmdsb2J9Ci1caW5wdXR7bGliZm5tYXRjaH0KLVxpbnB1dHtsaWJsaW5lY2FjaGV9Ci1caW5wdXR7bGlic2h1dGlsfQotXGlucHV0e2xpYmRpcmNhY2hlfQotCi0KLVxpbnB1dHthcmNoaXZpbmd9CQklIERhdGEgY29tcHJlc3Npb24gYW5kIGFyY2hpdmluZwotXGlucHV0e2xpYnpsaWJ9Ci1caW5wdXR7bGliZ3ppcH0KLVxpbnB1dHtsaWJiejJ9Ci1caW5wdXR7bGliemlwZmlsZX0KLVxpbnB1dHtsaWJ0YXJmaWxlfQotCi0KLVxpbnB1dHtwZXJzaXN0ZW5jZX0JCSUgUGVyc2lzdGVudCBzdG9yYWdlCi1caW5wdXR7bGlicGlja2xlfQotXGlucHV0e2xpYmNvcHlyZWd9ICAgICAgICAgICAgICAlIHJlYWxseSBjb3B5X3JlZyAlIGZyb20gcnVudGltZS4uLgotXGlucHV0e2xpYnNoZWx2ZX0KLVxpbnB1dHtsaWJtYXJzaGFsfQotXGlucHV0e2xpYmFueWRibX0KLVxpbnB1dHtsaWJ3aGljaGRifQotXGlucHV0e2xpYmRibX0KLVxpbnB1dHtsaWJnZGJtfQotXGlucHV0e2xpYmRiaGFzaH0KLVxpbnB1dHtsaWJic2RkYn0KLVxpbnB1dHtsaWJkdW1iZGJtfQotXGlucHV0e2xpYnNxbGl0ZTN9Ci0KLQotJSA9PT09PT09PT09PT09Ci0lIE9TCi0lID09PT09PT09PT09PT0KLQotCi1caW5wdXR7bGliYWxsb3N9ICAgICAgICAgICAgICAgICUgR2VuZXJpYyBPcGVyYXRpbmcgU3lzdGVtIFNlcnZpY2VzCi1caW5wdXR7bGlib3N9Ci1caW5wdXR7bGlidGltZX0KLVxpbnB1dHtsaWJvcHRwYXJzZX0KLVxpbnB1dHtsaWJnZXRvcHR9Ci1caW5wdXR7bGlibG9nZ2luZ30KLVxpbnB1dHtsaWJnZXRwYXNzfQotXGlucHV0e2xpYmN1cnNlc30KLVxpbnB1dHtsaWJhc2NpaX0gICAgICAgICAgICAgICAgJSBjdXJzZXMuYXNjaWkKLVxpbnB1dHtsaWJjdXJzZXNwYW5lbH0KLVxpbnB1dHtsaWJwbGF0Zm9ybX0KLVxpbnB1dHtsaWJlcnJub30KLVxpbnB1dHtsaWJjdHlwZXN9Ci0KLVxpbnB1dHtsaWJzb21lb3N9ICAgICAgICAgICAgICAgJSBPcHRpb25hbCBPcGVyYXRpbmcgU3lzdGVtIFNlcnZpY2VzCi1caW5wdXR7bGlic2VsZWN0fQotXGlucHV0e2xpYnRocmVhZH0KLVxpbnB1dHtsaWJ0aHJlYWRpbmd9Ci1caW5wdXR7bGliZHVtbXl0aHJlYWR9Ci1caW5wdXR7bGliZHVtbXl0aHJlYWRpbmd9Ci1caW5wdXR7bGlibW1hcH0KLVxpbnB1dHtsaWJyZWFkbGluZX0KLVxpbnB1dHtsaWJybGNvbXBsZXRlcn0KLQotXGlucHV0e2xpYnVuaXh9ICAgICAgICAgICAgICAgICAlIFVOSVggU3BlY2lmaWMgU2VydmljZXMKLVxpbnB1dHtsaWJwb3NpeH0KLVxpbnB1dHtsaWJwd2R9Ci1caW5wdXR7bGlic3B3ZH0KLVxpbnB1dHtsaWJncnB9Ci1caW5wdXR7bGliY3J5cHR9Ci1caW5wdXR7bGliZGx9Ci1caW5wdXR7bGlidGVybWlvc30KLVxpbnB1dHtsaWJ0dHl9Ci1caW5wdXR7bGlicHR5fQotXGlucHV0e2xpYmZjbnRsfQotXGlucHV0e2xpYnBpcGVzfQotXGlucHV0e2xpYnJlc291cmNlfQotXGlucHV0e2xpYm5pc30KLVxpbnB1dHtsaWJzeXNsb2d9Ci1caW5wdXR7bGliY29tbWFuZHN9Ci0KLQotJSA9PT09PT09PT09PT09Ci0lIE5FVFdPUksgJiBDT01NVU5JQ0FUSU9OUwotJSA9PT09PT09PT09PT09Ci0KLVxpbnB1dHtpcGN9ICAgICAgICAgICAgICAgICAgICAgJSBJbnRlcnByb2Nlc3MgY29tbXVuaWNhdGlvbi9uZXR3b3JraW5nCi1caW5wdXR7bGlic3VicHJvY2Vzc30KLVxpbnB1dHtsaWJzb2NrZXR9Ci1caW5wdXR7bGlic2lnbmFsfQotXGlucHV0e2xpYmFzeW5jb3JlfQotXGlucHV0e2xpYmFzeW5jaGF0fQotCi1caW5wdXR7aW50ZXJuZXR9ICAgICAgICAgICAgICAgICUgSW50ZXJuZXQgUHJvdG9jb2xzCi1caW5wdXR7bGlid2ViYnJvd3Nlcn0KLVxpbnB1dHtsaWJjZ2l9Ci1caW5wdXR7bGliY2dpdGJ9Ci1caW5wdXR7bGlid3NnaXJlZn0KLVxpbnB1dHtsaWJ1cmxsaWJ9Ci1caW5wdXR7bGlidXJsbGliMn0KLVxpbnB1dHtsaWJodHRwbGlifQotXGlucHV0e2xpYmZ0cGxpYn0KLVxpbnB1dHtsaWJwb3BsaWJ9Ci1caW5wdXR7bGliaW1hcGxpYn0KLVxpbnB1dHtsaWJubnRwbGlifQotXGlucHV0e2xpYnNtdHBsaWJ9Ci1caW5wdXR7bGlic210cGR9Ci1caW5wdXR7bGlidGVsbmV0bGlifQotXGlucHV0e2xpYnV1aWR9Ci1caW5wdXR7bGlidXJscGFyc2V9Ci1caW5wdXR7bGlic29ja3N2cn0KLVxpbnB1dHtsaWJiYXNlaHR0cH0KLVxpbnB1dHtsaWJzaW1wbGVodHRwfQotXGlucHV0e2xpYmNnaWh0dHB9Ci1caW5wdXR7bGliY29va2llbGlifQotXGlucHV0e2xpYmNvb2tpZX0KLVxpbnB1dHtsaWJ4bWxycGNsaWJ9Ci1caW5wdXR7bGlic2ltcGxleG1scnBjfQotXGlucHV0e2xpYmRvY3htbHJwY30KLQotJSA9PT09PT09PT09PT09Ci0lIE1VTFRJTUVESUEKLSUgPT09PT09PT09PT09PQotCi1caW5wdXR7bGlibW19ICAgICAgICAgICAgICAgICAgICUgTXVsdGltZWRpYSBTZXJ2aWNlcwotXGlucHV0e2xpYmF1ZGlvb3B9Ci1caW5wdXR7bGliYWlmY30KLVxpbnB1dHtsaWJzdW5hdX0KLVxpbnB1dHtsaWJ3YXZlfQotXGlucHV0e2xpYmNodW5rfQotXGlucHV0e2xpYmNvbG9yc3lzfQotXGlucHV0e2xpYmltZ2hkcn0KLVxpbnB1dHtsaWJzbmRoZHJ9Ci1caW5wdXR7bGlib3NzYXVkaW9kZXZ9Ci0KLSUgVGtpbnRlciBpcyBhIGNoYXB0ZXIgaW4gaXRzIG93biByaWdodC4KLVxpbnB1dHt0a2ludGVyfQotCi0lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIEludGVybmF0aW9uYWxpemF0aW9uCi1caW5wdXR7aTE4bn0KLVxpbnB1dHtsaWJnZXR0ZXh0fQotXGlucHV0e2xpYmxvY2FsZX0KLQotJSA9PT09PT09PT09PT09Ci0lIFBST0dSQU0gRlJBTUVXT1JLUwotJSA9PT09PT09PT09PT09Ci1caW5wdXR7ZnJhbWV3b3Jrc30KLVxpbnB1dHtsaWJjbWR9Ci1caW5wdXR7bGlic2hsZXh9Ci0KLQotJSA9PT09PT09PT09PT09Ci0lIERFVkVMT1BNRU5UIFRPT0xTCi0lID09PT09PT09PT09PT0KLSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgU29mdHdhcmUgZGV2ZWxvcG1lbnQgc3VwcG9ydAotXGlucHV0e2RldmVsb3BtZW50fQotXGlucHV0e2xpYnB5ZG9jfQotXGlucHV0e2xpYmRvY3Rlc3R9Ci1caW5wdXR7bGlidW5pdHRlc3R9Ci1caW5wdXR7bGlidGVzdH0KLQotXGlucHV0e2xpYnBkYn0gICAgICAgICAgICAgICAgICAlIFRoZSBQeXRob24gRGVidWdnZXIKLQotXGlucHV0e2xpYnByb2ZpbGV9ICAgICAgICAgICAgICAlIFRoZSBQeXRob24gUHJvZmlsZXIKLVxpbnB1dHtsaWJob3RzaG90fSAgICAgICAgICAgICAgJSB1bm1haW50YWluZWQgQyBwcm9maWxlcgotXGlucHV0e2xpYnRpbWVpdH0KLVxpbnB1dHtsaWJ0cmFjZX0KLQotJSA9PT09PT09PT09PT09Ci0lIFBZVEhPTiBFTkdJTkUKLSUgPT09PT09PT09PT09PQotCi0lIFJ1bnRpbWUgc2VydmljZXMKLVxpbnB1dHtsaWJweXRob259ICAgICAgICAgICAgICAgJSBQeXRob24gUnVudGltZSBTZXJ2aWNlcwotXGlucHV0e2xpYnN5c30KLVxpbnB1dHtsaWJibHRpbn0gICAgICAgICAgICAgICAgJSByZWFsbHkgX19idWlsdGluX18KLVxpbnB1dHtsaWJtYWlufSAgICAgICAgICAgICAgICAgJSByZWFsbHkgX19tYWluX18KLVxpbnB1dHtsaWJ3YXJuaW5nc30KLVxpbnB1dHtsaWJjb250ZXh0bGlifQotXGlucHV0e2xpYmF0ZXhpdH0KLVxpbnB1dHtsaWJ0cmFjZWJhY2t9Ci1caW5wdXR7bGliZnV0dXJlfSAgICAgICAgICAgICAgICUgcmVhbGx5IF9fZnV0dXJlX18KLVxpbnB1dHtsaWJnY30KLVxpbnB1dHtsaWJpbnNwZWN0fQotXGlucHV0e2xpYnNpdGV9Ci1caW5wdXR7bGlidXNlcn0KLVxpbnB1dHtsaWJmcGVjdGx9Ci0KLQotXGlucHV0e2N1c3RvbWludGVycH0JCSUgQ3VzdG9tIGludGVycHJldGVyCi1caW5wdXR7bGliY29kZX0KLVxpbnB1dHtsaWJjb2Rlb3B9Ci0KLQotXGlucHV0e21vZHVsZXN9CQkJJSBJbXBvcnRpbmcgTW9kdWxlcwotXGlucHV0e2xpYmltcH0KLVxpbnB1dHtsaWJ6aXBpbXBvcnR9Ci1caW5wdXR7bGlicGtndXRpbH0KLVxpbnB1dHtsaWJtb2R1bGVmaW5kZXJ9Ci1caW5wdXR7bGlicnVucHl9Ci0KLQotJSA9PT09PT09PT09PT09Ci0lIFBZVEhPTiBMQU5HVUFHRSAmIENPTVBJTEVSCi0lID09PT09PT09PT09PT0KLQotXGlucHV0e2xhbmd1YWdlfSAgICAgICAgICAgICAgICAlIFB5dGhvbiBMYW5ndWFnZSBTZXJ2aWNlcwotXGlucHV0e2xpYnBhcnNlcn0KLVxpbnB1dHtsaWJzeW1ib2x9Ci1caW5wdXR7bGlidG9rZW59Ci1caW5wdXR7bGlia2V5d29yZH0KLVxpbnB1dHtsaWJ0b2tlbml6ZX0KLVxpbnB1dHtsaWJ0YWJuYW5ueX0KLVxpbnB1dHtsaWJweWNsYnJ9Ci1caW5wdXR7bGlicHljb21waWxlfSAgICAgICAgICAgICUgcmVhbGx5IHB5X2NvbXBpbGUKLVxpbnB1dHtsaWJjb21waWxlYWxsfQotXGlucHV0e2xpYmRpc30KLVxpbnB1dHtsaWJwaWNrbGV0b29sc30KLVxpbnB1dHtkaXN0dXRpbHN9Ci0KLVxpbnB1dHtsaWJhc3R9Ci0KLVxpbnB1dHtsaWJtaXNjfSAgICAgICAgICAgICAgICAgJSBNaXNjZWxsYW5lb3VzIFNlcnZpY2VzCi1caW5wdXR7bGliZm9ybWF0dGVyfQotCi0lID09PT09PT09PT09PT0KLSUgT1RIRVIgUExBVEZPUk0tU1BFQ0lGSUMgU1RVRkYKLSUgPT09PT09PT09PT09PQotCi1caW5wdXR7d2luZG93c30gICAgICAgICAgICAgICAgICUgTVMgV2luZG93cyBPTkxZCi1caW5wdXR7bGlibXNpbGlifQotXGlucHV0e2xpYm1zdmNydH0KLVxpbnB1dHtsaWJ3aW5yZWd9Ci1caW5wdXR7bGlid2luc291bmR9Ci0KLVxhcHBlbmRpeAotXGlucHV0e2xpYnVuZG9jfQotCi0lXGNoYXB0ZXJ7T2Jzb2xldGUgTW9kdWxlc30KLQotXGNoYXB0ZXJ7UmVwb3J0aW5nIEJ1Z3N9Ci1caW5wdXR7cmVwb3J0aW5nYnVnc30KLQotXGNoYXB0ZXJ7SGlzdG9yeSBhbmQgTGljZW5zZX0KLVxpbnB1dHtsaWNlbnNlfQotCi0lCi0lICBUaGUgdWdseSAiJWJlZ2lue2xhdGV4b25seX0iIHBzZXVkby1lbnZpcm9ubWVudHMgYXJlIHJlYWxseSBqdXN0IHRvCi0lICBrZWVwIExhVGVYMkhUTUwgcXVpZXQgZHVyaW5nIHRoZSBccmVuZXdjb21tYW5ke30gbWFjcm9zOyB0aGV5J3JlCi0lICBub3QgcmVhbGx5IHZhbHVhYmxlLgotJQotCi0lYmVnaW57bGF0ZXhvbmx5fQotXHJlbmV3Y29tbWFuZHtcaW5kZXhuYW1lfXtNb2R1bGUgSW5kZXh9Ci0lZW5ke2xhdGV4b25seX0KLVxpbnB1dHttb2RsaWIuaW5kfSAgICAgICAgICAgICAgJSBNb2R1bGUgSW5kZXgKLQotJWJlZ2lue2xhdGV4b25seX0KLVxyZW5ld2NvbW1hbmR7XGluZGV4bmFtZX17SW5kZXh9Ci0lZW5ke2xhdGV4b25seX0KLVxpbnB1dHtsaWIuaW5kfSAgICAgICAgICAgICAgICAgJSBJbmRleAotCi1cZW5ke2RvY3VtZW50fQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJhaWZjLnRleCBiL0RvYy9saWIvbGliYWlmYy50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YWJlODQuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJhaWZjLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle2FpZmN9IC0tLQotICAgICAgICAgUmVhZCBhbmQgd3JpdGUgQUlGRiBhbmQgQUlGQyBmaWxlc30KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2FpZmN9Ci1cbW9kdWxlc3lub3BzaXN7UmVhZCBhbmQgd3JpdGUgYXVkaW8gZmlsZXMgaW4gQUlGRiBvciBBSUZDIGZvcm1hdC59Ci0KLQotVGhpcyBtb2R1bGUgcHJvdmlkZXMgc3VwcG9ydCBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyBBSUZGIGFuZCBBSUZGLUMKLWZpbGVzLiAgQUlGRiBpcyBBdWRpbyBJbnRlcmNoYW5nZSBGaWxlIEZvcm1hdCwgYSBmb3JtYXQgZm9yIHN0b3JpbmcKLWRpZ2l0YWwgYXVkaW8gc2FtcGxlcyBpbiBhIGZpbGUuICBBSUZGLUMgaXMgYSBuZXdlciB2ZXJzaW9uIG9mIHRoZQotZm9ybWF0IHRoYXQgaW5jbHVkZXMgdGhlIGFiaWxpdHkgdG8gY29tcHJlc3MgdGhlIGF1ZGlvIGRhdGEuCi1caW5kZXh7QXVkaW8gSW50ZXJjaGFuZ2UgRmlsZSBGb3JtYXR9Ci1caW5kZXh7QUlGRn0KLVxpbmRleHtBSUZGLUN9Ci0KLVxzdHJvbmd7Q2F2ZWF0On0gIFNvbWUgb3BlcmF0aW9ucyBtYXkgb25seSB3b3JrIHVuZGVyIElSSVg7IHRoZXNlIHdpbGwKLXJhaXNlIFxleGNlcHRpb257SW1wb3J0RXJyb3J9IHdoZW4gYXR0ZW1wdGluZyB0byBpbXBvcnQgdGhlCi1cbW9kdWxle2NsfSBtb2R1bGUsIHdoaWNoIGlzIG9ubHkgYXZhaWxhYmxlIG9uIElSSVguCi0KLUF1ZGlvIGZpbGVzIGhhdmUgYSBudW1iZXIgb2YgcGFyYW1ldGVycyB0aGF0IGRlc2NyaWJlIHRoZSBhdWRpbyBkYXRhLgotVGhlIHNhbXBsaW5nIHJhdGUgb3IgZnJhbWUgcmF0ZSBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHBlciBzZWNvbmQgdGhlCi1zb3VuZCBpcyBzYW1wbGVkLiAgVGhlIG51bWJlciBvZiBjaGFubmVscyBpbmRpY2F0ZSBpZiB0aGUgYXVkaW8gaXMKLW1vbm8sIHN0ZXJlbywgb3IgcXVhZHJvLiAgRWFjaCBmcmFtZSBjb25zaXN0cyBvZiBvbmUgc2FtcGxlIHBlcgotY2hhbm5lbC4gIFRoZSBzYW1wbGUgc2l6ZSBpcyB0aGUgc2l6ZSBpbiBieXRlcyBvZiBlYWNoIHNhbXBsZS4gIFRodXMgYQotZnJhbWUgY29uc2lzdHMgb2YgXHZhcntuY2hhbm5lbHN9Klx2YXJ7c2FtcGxlc2l6ZX0gYnl0ZXMsIGFuZCBhCi1zZWNvbmQncyB3b3J0aCBvZiBhdWRpbyBjb25zaXN0cyBvZgotXHZhcntuY2hhbm5lbHN9Klx2YXJ7c2FtcGxlc2l6ZX0qXHZhcntmcmFtZXJhdGV9IGJ5dGVzLgotCi1Gb3IgZXhhbXBsZSwgQ0QgcXVhbGl0eSBhdWRpbyBoYXMgYSBzYW1wbGUgc2l6ZSBvZiB0d28gYnl0ZXMgKDE2Ci1iaXRzKSwgdXNlcyB0d28gY2hhbm5lbHMgKHN0ZXJlbykgYW5kIGhhcyBhIGZyYW1lIHJhdGUgb2YgNDQsMTAwCi1mcmFtZXMvc2Vjb25kLiAgVGhpcyBnaXZlcyBhIGZyYW1lIHNpemUgb2YgNCBieXRlcyAoMioyKSwgYW5kIGEKLXNlY29uZCdzIHdvcnRoIG9jY3VwaWVzIDIqMio0NDEwMCBieXRlcyAoMTc2LDQwMCBieXRlcykuCi0KLU1vZHVsZSBcbW9kdWxle2FpZmN9IGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbjoKLQotXGJlZ2lue2Z1bmNkZXNjfXtvcGVufXtmaWxlXG9wdGlvbmFseywgbW9kZX19Ci1PcGVuIGFuIEFJRkYgb3IgQUlGRi1DIGZpbGUgYW5kIHJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugd2l0aAotbWV0aG9kcyB0aGF0IGFyZSBkZXNjcmliZWQgYmVsb3cuICBUaGUgYXJndW1lbnQgXHZhcntmaWxlfSBpcyBlaXRoZXIgYQotc3RyaW5nIG5hbWluZyBhIGZpbGUgb3IgYSBmaWxlIG9iamVjdC4gIFx2YXJ7bW9kZX0gbXVzdCBiZSBcY29kZXsncid9Ci1vciBcY29kZXsncmInfSB3aGVuIHRoZSBmaWxlIG11c3QgYmUgb3BlbmVkIGZvciByZWFkaW5nLCBvciBcY29kZXsndyd9IAotb3IgXGNvZGV7J3diJ30gd2hlbiB0aGUgZmlsZSBtdXN0IGJlIG9wZW5lZCBmb3Igd3JpdGluZy4gIElmIG9taXR0ZWQsCi1cY29kZXtcdmFye2ZpbGV9Lm1vZGV9IGlzIHVzZWQgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgXGNvZGV7J3JiJ30gaXMKLXVzZWQuICBXaGVuIHVzZWQgZm9yIHdyaXRpbmcsIHRoZSBmaWxlIG9iamVjdCBzaG91bGQgYmUgc2Vla2FibGUsCi11bmxlc3MgeW91IGtub3cgYWhlYWQgb2YgdGltZSBob3cgbWFueSBzYW1wbGVzIHlvdSBhcmUgZ29pbmcgdG8gd3JpdGUKLWluIHRvdGFsIGFuZCB1c2UgXG1ldGhvZHt3cml0ZWZyYW1lc3JhdygpfSBhbmQgXG1ldGhvZHtzZXRuZnJhbWVzKCl9LgotXGVuZHtmdW5jZGVzY30KLQotT2JqZWN0cyByZXR1cm5lZCBieSBcZnVuY3Rpb257b3BlbigpfSB3aGVuIGEgZmlsZSBpcyBvcGVuZWQgZm9yCi1yZWFkaW5nIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotCi1cYmVnaW57bWV0aG9kZGVzY31bYWlmY117Z2V0bmNoYW5uZWxzfXt9Ci1SZXR1cm4gdGhlIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyAoMSBmb3IgbW9ubywgMiBmb3Igc3RlcmVvKS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2FpZmNde2dldHNhbXB3aWR0aH17fQotUmV0dXJuIHRoZSBzaXplIGluIGJ5dGVzIG9mIGluZGl2aWR1YWwgc2FtcGxlcy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2FpZmNde2dldGZyYW1lcmF0ZX17fQotUmV0dXJuIHRoZSBzYW1wbGluZyByYXRlIChudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHBlciBzZWNvbmQpLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bYWlmY117Z2V0bmZyYW1lc317fQotUmV0dXJuIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIGluIHRoZSBmaWxlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bYWlmY117Z2V0Y29tcHR5cGV9e30KLVJldHVybiBhIGZvdXItY2hhcmFjdGVyIHN0cmluZyBkZXNjcmliaW5nIHRoZSB0eXBlIG9mIGNvbXByZXNzaW9uIHVzZWQKLWluIHRoZSBhdWRpbyBmaWxlLiAgRm9yIEFJRkYgZmlsZXMsIHRoZSByZXR1cm5lZCB2YWx1ZSBpcwotXGNvZGV7J05PTkUnfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2FpZmNde2dldGNvbXBuYW1lfXt9Ci1SZXR1cm4gYSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgdHlwZSBvZiBjb21wcmVzc2lvbiB1c2VkIGluCi10aGUgYXVkaW8gZmlsZS4gIEZvciBBSUZGIGZpbGVzLCB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgXGNvZGV7J25vdAotY29tcHJlc3NlZCd9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bYWlmY117Z2V0cGFyYW1zfXt9Ci1SZXR1cm4gYSB0dXBsZSBjb25zaXN0aW5nIG9mIGFsbCBvZiB0aGUgYWJvdmUgdmFsdWVzIGluIHRoZSBhYm92ZQotb3JkZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVthaWZjXXtnZXRtYXJrZXJzfXt9Ci1SZXR1cm4gYSBsaXN0IG9mIG1hcmtlcnMgaW4gdGhlIGF1ZGlvIGZpbGUuICBBIG1hcmtlciBjb25zaXN0cyBvZiBhCi10dXBsZSBvZiB0aHJlZSBlbGVtZW50cy4gIFRoZSBmaXJzdCBpcyB0aGUgbWFyayBJRCAoYW4gaW50ZWdlciksIHRoZQotc2Vjb25kIGlzIHRoZSBtYXJrIHBvc2l0aW9uIGluIGZyYW1lcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRhdGEKLShhbiBpbnRlZ2VyKSwgdGhlIHRoaXJkIGlzIHRoZSBuYW1lIG9mIHRoZSBtYXJrIChhIHN0cmluZykuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVthaWZjXXtnZXRtYXJrfXtpZH0KLVJldHVybiB0aGUgdHVwbGUgYXMgZGVzY3JpYmVkIGluIFxtZXRob2R7Z2V0bWFya2VycygpfSBmb3IgdGhlIG1hcmsKLXdpdGggdGhlIGdpdmVuIFx2YXJ7aWR9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bYWlmY117cmVhZGZyYW1lc317bmZyYW1lc30KLVJlYWQgYW5kIHJldHVybiB0aGUgbmV4dCBcdmFye25mcmFtZXN9IGZyYW1lcyBmcm9tIHRoZSBhdWRpbyBmaWxlLiAgVGhlCi1yZXR1cm5lZCBkYXRhIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgZm9yIGVhY2ggZnJhbWUgdGhlIHVuY29tcHJlc3NlZAotc2FtcGxlcyBvZiBhbGwgY2hhbm5lbHMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVthaWZjXXtyZXdpbmR9e30KLVJld2luZCB0aGUgcmVhZCBwb2ludGVyLiAgVGhlIG5leHQgXG1ldGhvZHtyZWFkZnJhbWVzKCl9IHdpbGwgc3RhcnQgZnJvbQotdGhlIGJlZ2lubmluZy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2FpZmNde3NldHBvc317cG9zfQotU2VlayB0byB0aGUgc3BlY2lmaWVkIGZyYW1lIG51bWJlci4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2FpZmNde3RlbGx9e30KLVJldHVybiB0aGUgY3VycmVudCBmcmFtZSBudW1iZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVthaWZjXXtjbG9zZX17fQotQ2xvc2UgdGhlIEFJRkYgZmlsZS4gIEFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QsIHRoZSBvYmplY3QgY2FuIG5vCi1sb25nZXIgYmUgdXNlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotT2JqZWN0cyByZXR1cm5lZCBieSBcZnVuY3Rpb257b3BlbigpfSB3aGVuIGEgZmlsZSBpcyBvcGVuZWQgZm9yCi13cml0aW5nIGhhdmUgYWxsIHRoZSBhYm92ZSBtZXRob2RzLCBleGNlcHQgZm9yIFxtZXRob2R7cmVhZGZyYW1lcygpfSBhbmQKLVxtZXRob2R7c2V0cG9zKCl9LiAgSW4gYWRkaXRpb24gdGhlIGZvbGxvd2luZyBtZXRob2RzIGV4aXN0LiAgVGhlCi1cbWV0aG9ke2dldCooKX0gbWV0aG9kcyBjYW4gb25seSBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGNvcnJlc3BvbmRpbmcKLVxtZXRob2R7c2V0KigpfSBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQuICBCZWZvcmUgdGhlIGZpcnN0Ci1cbWV0aG9ke3dyaXRlZnJhbWVzKCl9IG9yIFxtZXRob2R7d3JpdGVmcmFtZXNyYXcoKX0sIGFsbCBwYXJhbWV0ZXJzCi1leGNlcHQgZm9yIHRoZSBudW1iZXIgb2YgZnJhbWVzIG11c3QgYmUgZmlsbGVkIGluLgotCi1cYmVnaW57bWV0aG9kZGVzY31bYWlmY117YWlmZn17fQotQ3JlYXRlIGFuIEFJRkYgZmlsZS4gIFRoZSBkZWZhdWx0IGlzIHRoYXQgYW4gQUlGRi1DIGZpbGUgaXMgY3JlYXRlZCwKLXVubGVzcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSBlbmRzIGluIFxjb2RleycuYWlmZid9IGluIHdoaWNoIGNhc2UgdGhlCi1kZWZhdWx0IGlzIGFuIEFJRkYgZmlsZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2FpZmNde2FpZmN9e30KLUNyZWF0ZSBhbiBBSUZGLUMgZmlsZS4gIFRoZSBkZWZhdWx0IGlzIHRoYXQgYW4gQUlGRi1DIGZpbGUgaXMgY3JlYXRlZCwKLXVubGVzcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSBlbmRzIGluIFxjb2RleycuYWlmZid9IGluIHdoaWNoIGNhc2UgdGhlCi1kZWZhdWx0IGlzIGFuIEFJRkYgZmlsZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2FpZmNde3NldG5jaGFubmVsc317bmNoYW5uZWxzfQotU3BlY2lmeSB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBhdWRpbyBmaWxlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bYWlmY117c2V0c2FtcHdpZHRofXt3aWR0aH0KLVNwZWNpZnkgdGhlIHNpemUgaW4gYnl0ZXMgb2YgYXVkaW8gc2FtcGxlcy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2FpZmNde3NldGZyYW1lcmF0ZX17cmF0ZX0KLVNwZWNpZnkgdGhlIHNhbXBsaW5nIGZyZXF1ZW5jeSBpbiBmcmFtZXMgcGVyIHNlY29uZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2FpZmNde3NldG5mcmFtZXN9e25mcmFtZXN9Ci1TcGVjaWZ5IHRoZSBudW1iZXIgb2YgZnJhbWVzIHRoYXQgYXJlIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGF1ZGlvIGZpbGUuCi1JZiB0aGlzIHBhcmFtZXRlciBpcyBub3Qgc2V0LCBvciBub3Qgc2V0IGNvcnJlY3RseSwgdGhlIGZpbGUgbmVlZHMgdG8KLXN1cHBvcnQgc2Vla2luZy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2FpZmNde3NldGNvbXB0eXBlfXt0eXBlLCBuYW1lfQotU3BlY2lmeSB0aGUgY29tcHJlc3Npb24gdHlwZS4gIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBhdWRpbyBkYXRhIHdpbGwKLW5vdCBiZSBjb21wcmVzc2VkLiAgSW4gQUlGRiBmaWxlcywgY29tcHJlc3Npb24gaXMgbm90IHBvc3NpYmxlLiAgVGhlCi1uYW1lIHBhcmFtZXRlciBzaG91bGQgYmUgYSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUKLWNvbXByZXNzaW9uIHR5cGUsIHRoZSB0eXBlIHBhcmFtZXRlciBzaG91bGQgYmUgYSBmb3VyLWNoYXJhY3Rlcgotc3RyaW5nLiAgQ3VycmVudGx5IHRoZSBmb2xsb3dpbmcgY29tcHJlc3Npb24gdHlwZXMgYXJlIHN1cHBvcnRlZDoKLU5PTkUsIFVMQVcsIEFMQVcsIEc3MjIuCi1caW5kZXh7dS1MQVd9Ci1caW5kZXh7QS1MQVd9Ci1caW5kZXh7Ry43MjJ9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVthaWZjXXtzZXRwYXJhbXN9e25jaGFubmVscywgc2FtcHdpZHRoLCBmcmFtZXJhdGUsIGNvbXB0eXBlLCBjb21wbmFtZX0KLVNldCBhbGwgdGhlIGFib3ZlIHBhcmFtZXRlcnMgYXQgb25jZS4gIFRoZSBhcmd1bWVudCBpcyBhIHR1cGxlCi1jb25zaXN0aW5nIG9mIHRoZSB2YXJpb3VzIHBhcmFtZXRlcnMuICBUaGlzIG1lYW5zIHRoYXQgaXQgaXMgcG9zc2libGUKLXRvIHVzZSB0aGUgcmVzdWx0IG9mIGEgXG1ldGhvZHtnZXRwYXJhbXMoKX0gY2FsbCBhcyBhcmd1bWVudCB0bwotXG1ldGhvZHtzZXRwYXJhbXMoKX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVthaWZjXXtzZXRtYXJrfXtpZCwgcG9zLCBuYW1lfQotQWRkIGEgbWFyayB3aXRoIHRoZSBnaXZlbiBpZCAobGFyZ2VyIHRoYW4gMCksIGFuZCB0aGUgZ2l2ZW4gbmFtZSBhdAotdGhlIGdpdmVuIHBvc2l0aW9uLiAgVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZSBiZWZvcmUKLVxtZXRob2R7Y2xvc2UoKX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVthaWZjXXt0ZWxsfXt9Ci1SZXR1cm4gdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24gaW4gdGhlIG91dHB1dCBmaWxlLiAgVXNlZnVsIGluCi1jb21iaW5hdGlvbiB3aXRoIFxtZXRob2R7c2V0bWFyaygpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2FpZmNde3dyaXRlZnJhbWVzfXtkYXRhfQotV3JpdGUgZGF0YSB0byB0aGUgb3V0cHV0IGZpbGUuICBUaGlzIG1ldGhvZCBjYW4gb25seSBiZSBjYWxsZWQgYWZ0ZXIKLXRoZSBhdWRpbyBmaWxlIHBhcmFtZXRlcnMgaGF2ZSBiZWVuIHNldC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2FpZmNde3dyaXRlZnJhbWVzcmF3fXtkYXRhfQotTGlrZSBcbWV0aG9ke3dyaXRlZnJhbWVzKCl9LCBleGNlcHQgdGhhdCB0aGUgaGVhZGVyIG9mIHRoZSBhdWRpbyBmaWxlCi1pcyBub3QgdXBkYXRlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2FpZmNde2Nsb3NlfXt9Ci1DbG9zZSB0aGUgQUlGRiBmaWxlLiAgVGhlIGhlYWRlciBvZiB0aGUgZmlsZSBpcyB1cGRhdGVkIHRvIHJlZmxlY3QgdGhlCi1hY3R1YWwgc2l6ZSBvZiB0aGUgYXVkaW8gZGF0YS4gQWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCwgdGhlIG9iamVjdAotY2FuIG5vIGxvbmdlciBiZSB1c2VkLgotXGVuZHttZXRob2RkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJhbGxvcy50ZXggYi9Eb2MvbGliL2xpYmFsbG9zLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQwNDZjOS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmFsbG9zLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotXGNoYXB0ZXJ7R2VuZXJpYyBPcGVyYXRpbmcgU3lzdGVtIFNlcnZpY2VzIFxsYWJlbHthbGxvc319Ci0KLVRoZSBtb2R1bGVzIGRlc2NyaWJlZCBpbiB0aGlzIGNoYXB0ZXIgcHJvdmlkZSBpbnRlcmZhY2VzIHRvIG9wZXJhdGluZwotc3lzdGVtIGZlYXR1cmVzIHRoYXQgYXJlIGF2YWlsYWJsZSBvbiAoYWxtb3N0KSBhbGwgb3BlcmF0aW5nIHN5c3RlbXMsCi1zdWNoIGFzIGZpbGVzIGFuZCBhIGNsb2NrLiAgVGhlIGludGVyZmFjZXMgYXJlIGdlbmVyYWxseSBtb2RlbGVkCi1hZnRlciB0aGUgXFVOSVh7fSBvciBDIGludGVyZmFjZXMsIGJ1dCB0aGV5IGFyZSBhdmFpbGFibGUgb24gbW9zdAotb3RoZXIgc3lzdGVtcyBhcyB3ZWxsLiAgSGVyZSdzIGFuIG92ZXJ2aWV3OgotCi1cbG9jYWxtb2R1bGV0YWJsZQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJhbnlkYm0udGV4IGIvRG9jL2xpYi9saWJhbnlkYm0udGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWRjNmVjLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGliYW55ZGJtLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7YW55ZGJtfSAtLS0KLSAgICAgICAgIEdlbmVyaWMgYWNjZXNzIHRvIERCTS1zdHlsZSBkYXRhYmFzZXN9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXthbnlkYm19Ci1cbW9kdWxlc3lub3BzaXN7R2VuZXJpYyBpbnRlcmZhY2UgdG8gREJNLXN0eWxlIGRhdGFiYXNlIG1vZHVsZXMufQotCi0KLVxtb2R1bGV7YW55ZGJtfSBpcyBhIGdlbmVyaWMgaW50ZXJmYWNlIHRvIHZhcmlhbnRzIG9mIHRoZSBEQk0KLWRhdGFiYXNlIC0tLSBccmVmbW9kdWxle2RiaGFzaH1ccmVmc3Rtb2RpbmRleHtkYmhhc2h9IChyZXF1aXJlcwotXHJlZm1vZHVsZXtic2RkYn1ccmVmYmltb2RpbmRleHtic2RkYn0pLAotXHJlZm1vZHVsZXtnZGJtfVxyZWZiaW1vZGluZGV4e2dkYm19LCBvcgotXHJlZm1vZHVsZXtkYm19XHJlZmJpbW9kaW5kZXh7ZGJtfS4gIElmIG5vbmUgb2YgdGhlc2UgbW9kdWxlcyBpcwotaW5zdGFsbGVkLCB0aGUgc2xvdy1idXQtc2ltcGxlIGltcGxlbWVudGF0aW9uIGluIG1vZHVsZQotXHJlZm1vZHVsZXtkdW1iZGJtfVxyZWZzdG1vZGluZGV4e2R1bWJkYm19IHdpbGwgYmUgdXNlZC4KLQotXGJlZ2lue2Z1bmNkZXNjfXtvcGVufXtmaWxlbmFtZVxvcHRpb25hbHssIGZsYWdcb3B0aW9uYWx7LCBtb2RlfX19Ci1PcGVuIHRoZSBkYXRhYmFzZSBmaWxlIFx2YXJ7ZmlsZW5hbWV9IGFuZCByZXR1cm4gYSBjb3JyZXNwb25kaW5nIG9iamVjdC4KLQotSWYgdGhlIGRhdGFiYXNlIGZpbGUgYWxyZWFkeSBleGlzdHMsIHRoZSBccmVmbW9kdWxle3doaWNoZGJ9IG1vZHVsZSBpcyAKLXVzZWQgdG8gZGV0ZXJtaW5lIGl0cyB0eXBlIGFuZCB0aGUgYXBwcm9wcmlhdGUgbW9kdWxlIGlzIHVzZWQ7IGlmIGl0Ci1kb2VzIG5vdCBleGlzdCwgdGhlIGZpcnN0IG1vZHVsZSBsaXN0ZWQgYWJvdmUgdGhhdCBjYW4gYmUgaW1wb3J0ZWQgaXMKLXVzZWQuCi0KLVRoZSBvcHRpb25hbCBcdmFye2ZsYWd9IGFyZ3VtZW50IGNhbiBiZQotXGNvZGV7J3InfSB0byBvcGVuIGFuIGV4aXN0aW5nIGRhdGFiYXNlIGZvciByZWFkaW5nIG9ubHksCi1cY29kZXsndyd9IHRvIG9wZW4gYW4gZXhpc3RpbmcgZGF0YWJhc2UgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcsCi1cY29kZXsnYyd9IHRvIGNyZWF0ZSB0aGUgZGF0YWJhc2UgaWYgaXQgZG9lc24ndCBleGlzdCwgb3IKLVxjb2RleyduJ30sIHdoaWNoIHdpbGwgYWx3YXlzIGNyZWF0ZSBhIG5ldyBlbXB0eSBkYXRhYmFzZS4gIElmIG5vdAotc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBcY29kZXsncid9LgotCi1UaGUgb3B0aW9uYWwgXHZhcnttb2RlfSBhcmd1bWVudCBpcyB0aGUgXFVOSVh7fSBtb2RlIG9mIHRoZSBmaWxlLCB1c2VkCi1vbmx5IHdoZW4gdGhlIGRhdGFiYXNlIGhhcyB0byBiZSBjcmVhdGVkLiAgSXQgZGVmYXVsdHMgdG8gb2N0YWwKLVxjb2RlezA2NjZ9IChhbmQgd2lsbCBiZSBtb2RpZmllZCBieSB0aGUgcHJldmFpbGluZyB1bWFzaykuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317ZXJyb3J9Ci1BIHR1cGxlIGNvbnRhaW5pbmcgdGhlIGV4Y2VwdGlvbnMgdGhhdCBjYW4gYmUgcmFpc2VkIGJ5IGVhY2ggb2YgdGhlCi1zdXBwb3J0ZWQgbW9kdWxlcywgd2l0aCBhIHVuaXF1ZSBleGNlcHRpb24gXGV4Y2VwdGlvbnthbnlkYm0uZXJyb3J9IGFzCi10aGUgZmlyc3QgaXRlbSAtLS0gdGhlIGxhdHRlciBpcyB1c2VkIHdoZW4gXGV4Y2VwdGlvbnthbnlkYm0uZXJyb3J9IGlzCi1yYWlzZWQuCi1cZW5ke2V4Y2Rlc2N9Ci0KLVRoZSBvYmplY3QgcmV0dXJuZWQgYnkgXGZ1bmN0aW9ue29wZW4oKX0gc3VwcG9ydHMgbW9zdCBvZiB0aGUgc2FtZQotZnVuY3Rpb25hbGl0eSBhcyBkaWN0aW9uYXJpZXM7IGtleXMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGNhbgotYmUgc3RvcmVkLCByZXRyaWV2ZWQsIGFuZCBkZWxldGVkLCBhbmQgdGhlIFxtZXRob2R7aGFzX2tleSgpfSBhbmQKLVxtZXRob2R7a2V5cygpfSBtZXRob2RzIGFyZSBhdmFpbGFibGUuICBLZXlzIGFuZCB2YWx1ZXMgbXVzdCBhbHdheXMgYmUKLXN0cmluZ3MuCi0KLVRoZSBmb2xsb3dpbmcgZXhhbXBsZSByZWNvcmRzIHNvbWUgaG9zdG5hbWVzIGFuZCBhIGNvcnJlc3BvbmRpbmcgdGl0bGUsIAotYW5kIHRoZW4gcHJpbnRzIG91dCB0aGUgY29udGVudHMgb2YgdGhlIGRhdGFiYXNlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgYW55ZGJtCi0KLSMgT3BlbiBkYXRhYmFzZSwgY3JlYXRpbmcgaXQgaWYgbmVjZXNzYXJ5LgotZGIgPSBhbnlkYm0ub3BlbignY2FjaGUnLCAnYycpCi0KLSMgUmVjb3JkIHNvbWUgdmFsdWVzCi1kYlsnd3d3LnB5dGhvbi5vcmcnXSA9ICdQeXRob24gV2Vic2l0ZScKLWRiWyd3d3cuY25uLmNvbSddID0gJ0NhYmxlIE5ld3MgTmV0d29yaycKLQotIyBMb29wIHRocm91Z2ggY29udGVudHMuICBPdGhlciBkaWN0aW9uYXJ5IG1ldGhvZHMKLSMgc3VjaCBhcyAua2V5cygpLCAudmFsdWVzKCkgYWxzbyB3b3JrLgotZm9yIGssIHYgaW4gZGIuaXRlcml0ZW1zKCk6Ci0gICAgcHJpbnQgaywgJ1x0JywgdgotCi0jIFN0b3JpbmcgYSBub24tc3RyaW5nIGtleSBvciB2YWx1ZSB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbiAobW9zdAotIyBsaWtlbHkgYSBUeXBlRXJyb3IpLgotZGJbJ3d3dy55YWhvby5jb20nXSA9IDQKLQotIyBDbG9zZSB3aGVuIGRvbmUuCi1kYi5jbG9zZSgpCi1cZW5ke3ZlcmJhdGltfQotCi0KLVxiZWdpbntzZWVhbHNvfQotICBcc2VlbW9kdWxle2RiaGFzaH17QlNEIFxjb2Rle2RifSBkYXRhYmFzZSBpbnRlcmZhY2UufQotICBcc2VlbW9kdWxle2RibX17U3RhbmRhcmQgXFVOSVh7fSBkYXRhYmFzZSBpbnRlcmZhY2UufQotICBcc2VlbW9kdWxle2R1bWJkYm19e1BvcnRhYmxlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBcY29kZXtkYm19IGludGVyZmFjZS59Ci0gIFxzZWVtb2R1bGV7Z2RibX17R05VIGRhdGFiYXNlIGludGVyZmFjZSwgYmFzZWQgb24gdGhlIFxjb2Rle2RibX0gaW50ZXJmYWNlLn0KLSAgXHNlZW1vZHVsZXtzaGVsdmV9e0dlbmVyYWwgb2JqZWN0IHBlcnNpc3RlbmNlIGJ1aWx0IG9uIHRvcCBvZiAKLSAgICAgICAgICAgICAgICAgICAgIHRoZSBQeXRob24gXGNvZGV7ZGJtfSBpbnRlcmZhY2UufQotICBcc2VlbW9kdWxle3doaWNoZGJ9e1V0aWxpdHkgbW9kdWxlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGFuCi0gICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcgZGF0YWJhc2UufQotXGVuZHtzZWVhbHNvfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJhcnJheS50ZXggYi9Eb2MvbGliL2xpYmFycmF5LnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFmNTg4OC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmFycmF5LnRleAorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle2FycmF5fSAtLS0KLSAgICAgICAgIEVmZmljaWVudCBhcnJheXMgb2YgbnVtZXJpYyB2YWx1ZXN9Ci0KLVxkZWNsYXJlbW9kdWxle2J1aWx0aW59e2FycmF5fQotXG1vZHVsZXN5bm9wc2lze0VmZmljaWVudCBhcnJheXMgb2YgdW5pZm9ybWx5IHR5cGVkIG51bWVyaWMgdmFsdWVzLn0KLQotCi1UaGlzIG1vZHVsZSBkZWZpbmVzIGFuIG9iamVjdCB0eXBlIHdoaWNoIGNhbiBlZmZpY2llbnRseSByZXByZXNlbnQKLWFuIGFycmF5IG9mIGJhc2ljIHZhbHVlczogY2hhcmFjdGVycywgaW50ZWdlcnMsIGZsb2F0aW5nIHBvaW50Ci1udW1iZXJzLiAgQXJyYXlzXGluZGV4e2FycmF5c30gYXJlIHNlcXVlbmNlIHR5cGVzIGFuZCBiZWhhdmUgdmVyeSBtdWNoCi1saWtlIGxpc3RzLCBleGNlcHQgdGhhdCB0aGUgdHlwZSBvZiBvYmplY3RzIHN0b3JlZCBpbiB0aGVtIGlzCi1jb25zdHJhaW5lZC4gIFRoZSB0eXBlIGlzIHNwZWNpZmllZCBhdCBvYmplY3QgY3JlYXRpb24gdGltZSBieSB1c2luZyBhCi1cZGZue3R5cGUgY29kZX0sIHdoaWNoIGlzIGEgc2luZ2xlIGNoYXJhY3Rlci4gIFRoZSBmb2xsb3dpbmcgdHlwZQotY29kZXMgYXJlIGRlZmluZWQ6Ci0KLVxiZWdpbnt0YWJsZWl2fXtjfGx8bHxjfXtjb2RlfXtUeXBlIGNvZGV9e0MgVHlwZX17UHl0aG9uIFR5cGV9e01pbmltdW0gc2l6ZSBpbiBieXRlc30KLSAgXGxpbmVpdnsnYyd9e2NoYXJ9ICAgICAgICAgIHtjaGFyYWN0ZXJ9ICAgICAgICB7MX0KLSAgXGxpbmVpdnsnYid9e3NpZ25lZCBjaGFyfSAgIHtpbnR9ICAgICAgICAgICAgICB7MX0KLSAgXGxpbmVpdnsnQid9e3Vuc2lnbmVkIGNoYXJ9IHtpbnR9ICAgICAgICAgICAgICB7MX0KLSAgXGxpbmVpdnsndSd9e1B5X1VOSUNPREV9ICAgIHtVbmljb2RlIGNoYXJhY3Rlcn17Mn0KLSAgXGxpbmVpdnsnaCd9e3NpZ25lZCBzaG9ydH0gIHtpbnR9ICAgICAgICAgICAgICB7Mn0KLSAgXGxpbmVpdnsnSCd9e3Vuc2lnbmVkIHNob3J0fXtpbnR9ICAgICAgICAgICAgICB7Mn0KLSAgXGxpbmVpdnsnaSd9e3NpZ25lZCBpbnR9ICAgIHtpbnR9ICAgICAgICAgICAgICB7Mn0KLSAgXGxpbmVpdnsnSSd9e3Vuc2lnbmVkIGludH0gIHtsb25nfSAgICAgICAgICAgICB7Mn0KLSAgXGxpbmVpdnsnbCd9e3NpZ25lZCBsb25nfSAgIHtpbnR9ICAgICAgICAgICAgICB7NH0KLSAgXGxpbmVpdnsnTCd9e3Vuc2lnbmVkIGxvbmd9IHtsb25nfSAgICAgICAgICAgICB7NH0KLSAgXGxpbmVpdnsnZid9e2Zsb2F0fSAgICAgICAgIHtmbG9hdH0gICAgICAgICAgICB7NH0KLSAgXGxpbmVpdnsnZCd9e2RvdWJsZX0gICAgICAgIHtmbG9hdH0gICAgICAgICAgICB7OH0KLVxlbmR7dGFibGVpdn0KLQotVGhlIGFjdHVhbCByZXByZXNlbnRhdGlvbiBvZiB2YWx1ZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgbWFjaGluZQotYXJjaGl0ZWN0dXJlIChzdHJpY3RseSBzcGVha2luZywgYnkgdGhlIEMgaW1wbGVtZW50YXRpb24pLiAgVGhlIGFjdHVhbAotc2l6ZSBjYW4gYmUgYWNjZXNzZWQgdGhyb3VnaCB0aGUgXG1lbWJlcntpdGVtc2l6ZX0gYXR0cmlidXRlLiAgVGhlIHZhbHVlcwotc3RvcmVkICBmb3IgXGNvZGV7J0wnfSBhbmQgXGNvZGV7J0knfSBpdGVtcyB3aWxsIGJlIHJlcHJlc2VudGVkIGFzCi1QeXRob24gbG9uZyBpbnRlZ2VycyB3aGVuIHJldHJpZXZlZCwgYmVjYXVzZSBQeXRob24ncyBwbGFpbiBpbnRlZ2VyCi10eXBlIGNhbm5vdCByZXByZXNlbnQgdGhlIGZ1bGwgcmFuZ2Ugb2YgQydzIHVuc2lnbmVkIChsb25nKSBpbnRlZ2Vycy4KLQotCi1UaGUgbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyB0eXBlOgotCi1cYmVnaW57ZnVuY2Rlc2N9e2FycmF5fXt0eXBlY29kZVxvcHRpb25hbHssIGluaXRpYWxpemVyfX0KLVJldHVybiBhIG5ldyBhcnJheSB3aG9zZSBpdGVtcyBhcmUgcmVzdHJpY3RlZCBieSBcdmFye3R5cGVjb2RlfSwKLWFuZCBpbml0aWFsaXplZCBmcm9tIHRoZSBvcHRpb25hbCBcdmFye2luaXRpYWxpemVyfSB2YWx1ZSwgd2hpY2gKLW11c3QgYmUgYSBsaXN0LCBzdHJpbmcsIG9yIGl0ZXJhYmxlIG92ZXIgZWxlbWVudHMgb2YgdGhlCi1hcHByb3ByaWF0ZSB0eXBlLgotXHZlcnNpb25jaGFuZ2VkW0Zvcm1lcmx5LCBvbmx5IGxpc3RzIG9yIHN0cmluZ3Mgd2VyZSBhY2NlcHRlZF17Mi40fQotSWYgZ2l2ZW4gYSBsaXN0IG9yIHN0cmluZywgdGhlIGluaXRpYWxpemVyIGlzIHBhc3NlZCB0byB0aGUKLW5ldyBhcnJheSdzIFxtZXRob2R7ZnJvbWxpc3QoKX0sIFxtZXRob2R7ZnJvbXN0cmluZygpfSwgb3IKLVxtZXRob2R7ZnJvbXVuaWNvZGUoKX0gbWV0aG9kIChzZWUgYmVsb3cpIHRvIGFkZCBpbml0aWFsIGl0ZW1zIHRvCi10aGUgYXJyYXkuICBPdGhlcndpc2UsIHRoZSBpdGVyYWJsZSBpbml0aWFsaXplciBpcyBwYXNzZWQgdG8gdGhlCi1cbWV0aG9ke2V4dGVuZCgpfSBtZXRob2QuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e0FycmF5VHlwZX0KLU9ic29sZXRlIGFsaWFzIGZvciBcZnVuY3Rpb257YXJyYXl9LgotXGVuZHtkYXRhZGVzY30KLQotCi1BcnJheSBvYmplY3RzIHN1cHBvcnQgdGhlIG9yZGluYXJ5IHNlcXVlbmNlIG9wZXJhdGlvbnMgb2YKLWluZGV4aW5nLCBzbGljaW5nLCBjb25jYXRlbmF0aW9uLCBhbmQgbXVsdGlwbGljYXRpb24uICBXaGVuIHVzaW5nCi1zbGljZSBhc3NpZ25tZW50LCB0aGUgYXNzaWduZWQgdmFsdWUgbXVzdCBiZSBhbiBhcnJheSBvYmplY3Qgd2l0aCB0aGUKLXNhbWUgdHlwZSBjb2RlOyBpbiBhbGwgb3RoZXIgY2FzZXMsIFxleGNlcHRpb257VHlwZUVycm9yfSBpcyByYWlzZWQuCi1BcnJheSBvYmplY3RzIGFsc28gaW1wbGVtZW50IHRoZSBidWZmZXIgaW50ZXJmYWNlLCBhbmQgbWF5IGJlIHVzZWQKLXdoZXJldmVyIGJ1ZmZlciBvYmplY3RzIGFyZSBzdXBwb3J0ZWQuCi0KLVRoZSBmb2xsb3dpbmcgZGF0YSBpdGVtcyBhbmQgbWV0aG9kcyBhcmUgYWxzbyBzdXBwb3J0ZWQ6Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVthcnJheV17dHlwZWNvZGV9Ci1UaGUgdHlwZWNvZGUgY2hhcmFjdGVyIHVzZWQgdG8gY3JlYXRlIHRoZSBhcnJheS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W2FycmF5XXtpdGVtc2l6ZX0KLVRoZSBsZW5ndGggaW4gYnl0ZXMgb2Ygb25lIGFycmF5IGl0ZW0gaW4gdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uLgotXGVuZHttZW1iZXJkZXNjfQotCi0KLVxiZWdpbnttZXRob2RkZXNjfVthcnJheV17YXBwZW5kfXt4fQotQXBwZW5kIGEgbmV3IGl0ZW0gd2l0aCB2YWx1ZSBcdmFye3h9IHRvIHRoZSBlbmQgb2YgdGhlIGFycmF5LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bYXJyYXlde2J1ZmZlcl9pbmZvfXt9Ci1SZXR1cm4gYSB0dXBsZSBcY29kZXsoXHZhcnthZGRyZXNzfSwgXHZhcntsZW5ndGh9KX0gZ2l2aW5nIHRoZSBjdXJyZW50Ci1tZW1vcnkgYWRkcmVzcyBhbmQgdGhlIGxlbmd0aCBpbiBlbGVtZW50cyBvZiB0aGUgYnVmZmVyIHVzZWQgdG8gaG9sZAotYXJyYXkncyBjb250ZW50cy4gIFRoZSBzaXplIG9mIHRoZSBtZW1vcnkgYnVmZmVyIGluIGJ5dGVzIGNhbiBiZQotY29tcHV0ZWQgYXMgXGNvZGV7XHZhcnthcnJheX0uYnVmZmVyX2luZm8oKVsxXSAqCi1cdmFye2FycmF5fS5pdGVtc2l6ZX0uICBUaGlzIGlzIG9jY2FzaW9uYWxseSB1c2VmdWwgd2hlbiB3b3JraW5nIHdpdGgKLWxvdy1sZXZlbCAoYW5kIGluaGVyZW50bHkgdW5zYWZlKSBJL08gaW50ZXJmYWNlcyB0aGF0IHJlcXVpcmUgbWVtb3J5Ci1hZGRyZXNzZXMsIHN1Y2ggYXMgY2VydGFpbiBcY2Z1bmN0aW9ue2lvY3RsKCl9IG9wZXJhdGlvbnMuICBUaGUKLXJldHVybmVkIG51bWJlcnMgYXJlIHZhbGlkIGFzIGxvbmcgYXMgdGhlIGFycmF5IGV4aXN0cyBhbmQgbm8KLWxlbmd0aC1jaGFuZ2luZyBvcGVyYXRpb25zIGFyZSBhcHBsaWVkIHRvIGl0LgotCi1cbm90ZXtXaGVuIHVzaW5nIGFycmF5IG9iamVjdHMgZnJvbSBjb2RlIHdyaXR0ZW4gaW4gQyBvcgotXENwcHt9ICh0aGUgb25seSB3YXkgdG8gZWZmZWN0aXZlbHkgbWFrZSB1c2Ugb2YgdGhpcyBpbmZvcm1hdGlvbiksIGl0Ci1tYWtlcyBtb3JlIHNlbnNlIHRvIHVzZSB0aGUgYnVmZmVyIGludGVyZmFjZSBzdXBwb3J0ZWQgYnkgYXJyYXkKLW9iamVjdHMuICBUaGlzIG1ldGhvZCBpcyBtYWludGFpbmVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGFuZAotc2hvdWxkIGJlIGF2b2lkZWQgaW4gbmV3IGNvZGUuICBUaGUgYnVmZmVyIGludGVyZmFjZSBpcyBkb2N1bWVudGVkIGluCi10aGUgXGNpdGV0aXRsZVsuLi9hcGkvbmV3VHlwZXMuaHRtbF17UHl0aG9uL0MgQVBJIFJlZmVyZW5jZSBNYW51YWx9Ln0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2FycmF5XXtieXRlc3dhcH17fQotYGBCeXRlc3dhcCcnIGFsbCBpdGVtcyBvZiB0aGUgYXJyYXkuICBUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGZvcgotdmFsdWVzIHdoaWNoIGFyZSAxLCAyLCA0LCBvciA4IGJ5dGVzIGluIHNpemU7IGZvciBvdGhlciB0eXBlcyBvZgotdmFsdWVzLCBcZXhjZXB0aW9ue1J1bnRpbWVFcnJvcn0gaXMgcmFpc2VkLiAgSXQgaXMgdXNlZnVsIHdoZW4gcmVhZGluZwotZGF0YSBmcm9tIGEgZmlsZSB3cml0dGVuIG9uIGEgbWFjaGluZSB3aXRoIGEgZGlmZmVyZW50IGJ5dGUgb3JkZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVthcnJheV17Y291bnR9e3h9Ci1SZXR1cm4gdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiBcdmFye3h9IGluIHRoZSBhcnJheS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2FycmF5XXtleHRlbmR9e2l0ZXJhYmxlfQotQXBwZW5kIGl0ZW1zIGZyb20gXHZhcntpdGVyYWJsZX0gdG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkuICBJZgotXHZhcntpdGVyYWJsZX0gaXMgYW5vdGhlciBhcnJheSwgaXQgbXVzdCBoYXZlIFxlbXBoe2V4YWN0bHl9IHRoZSBzYW1lCi10eXBlIGNvZGU7IGlmIG5vdCwgXGV4Y2VwdGlvbntUeXBlRXJyb3J9IHdpbGwgYmUgcmFpc2VkLiAgSWYKLVx2YXJ7aXRlcmFibGV9IGlzIG5vdCBhbiBhcnJheSwgaXQgbXVzdCBiZSBpdGVyYWJsZSBhbmQgaXRzCi1lbGVtZW50cyBtdXN0IGJlIHRoZSByaWdodCB0eXBlIHRvIGJlIGFwcGVuZGVkIHRvIHRoZSBhcnJheS4KLVx2ZXJzaW9uY2hhbmdlZFtGb3JtZXJseSwgdGhlIGFyZ3VtZW50IGNvdWxkIG9ubHkgYmUgYW5vdGhlciBhcnJheV17Mi40fQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bYXJyYXlde2Zyb21maWxlfXtmLCBufQotUmVhZCBcdmFye259IGl0ZW1zIChhcyBtYWNoaW5lIHZhbHVlcykgZnJvbSB0aGUgZmlsZSBvYmplY3QgXHZhcntmfQotYW5kIGFwcGVuZCB0aGVtIHRvIHRoZSBlbmQgb2YgdGhlIGFycmF5LiAgSWYgbGVzcyB0aGFuIFx2YXJ7bn0gaXRlbXMKLWFyZSBhdmFpbGFibGUsIFxleGNlcHRpb257RU9GRXJyb3J9IGlzIHJhaXNlZCwgYnV0IHRoZSBpdGVtcyB0aGF0IHdlcmUKLWF2YWlsYWJsZSBhcmUgc3RpbGwgaW5zZXJ0ZWQgaW50byB0aGUgYXJyYXkuICBcdmFye2Z9IG11c3QgYmUgYSByZWFsCi1idWlsdC1pbiBmaWxlIG9iamVjdDsgc29tZXRoaW5nIGVsc2Ugd2l0aCBhIFxtZXRob2R7cmVhZCgpfSBtZXRob2Qgd29uJ3QKLWRvLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bYXJyYXlde2Zyb21saXN0fXtsaXN0fQotQXBwZW5kIGl0ZW1zIGZyb20gdGhlIGxpc3QuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KLVxzYW1we2ZvciB4IGluIFx2YXJ7bGlzdH06XCBhLmFwcGVuZCh4KX0KLWV4Y2VwdCB0aGF0IGlmIHRoZXJlIGlzIGEgdHlwZSBlcnJvciwgdGhlIGFycmF5IGlzIHVuY2hhbmdlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2FycmF5XXtmcm9tc3RyaW5nfXtzfQotQXBwZW5kcyBpdGVtcyBmcm9tIHRoZSBzdHJpbmcsIGludGVycHJldGluZyB0aGUgc3RyaW5nIGFzIGFuCi1hcnJheSBvZiBtYWNoaW5lIHZhbHVlcyAoYXMgaWYgaXQgaGFkIGJlZW4gcmVhZCBmcm9tIGEKLWZpbGUgdXNpbmcgdGhlIFxtZXRob2R7ZnJvbWZpbGUoKX0gbWV0aG9kKS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2FycmF5XXtmcm9tdW5pY29kZX17c30KLUV4dGVuZHMgdGhpcyBhcnJheSB3aXRoIGRhdGEgZnJvbSB0aGUgZ2l2ZW4gdW5pY29kZSBzdHJpbmcuICBUaGUgYXJyYXkKLW11c3QgYmUgYSB0eXBlIFxjb2Rleyd1J30gYXJyYXk7IG90aGVyd2lzZSBhIFxleGNlcHRpb257VmFsdWVFcnJvcn0KLWlzIHJhaXNlZC4gIFVzZSBcc2FtcHthcnJheS5mcm9tc3RyaW5nKHVzdHIuZGVjb2RlKGVuYykpfSB0bwotYXBwZW5kIFVuaWNvZGUgZGF0YSB0byBhbiBhcnJheSBvZiBzb21lIG90aGVyIHR5cGUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVthcnJheV17aW5kZXh9e3h9Ci1SZXR1cm4gdGhlIHNtYWxsZXN0IFx2YXJ7aX0gc3VjaCB0aGF0IFx2YXJ7aX0gaXMgdGhlIGluZGV4IG9mCi10aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBcdmFye3h9IGluIHRoZSBhcnJheS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2FycmF5XXtpbnNlcnR9e2ksIHh9Ci1JbnNlcnQgYSBuZXcgaXRlbSB3aXRoIHZhbHVlIFx2YXJ7eH0gaW4gdGhlIGFycmF5IGJlZm9yZSBwb3NpdGlvbgotXHZhcntpfS4gTmVnYXRpdmUgdmFsdWVzIGFyZSB0cmVhdGVkIGFzIGJlaW5nIHJlbGF0aXZlIHRvIHRoZSBlbmQKLW9mIHRoZSBhcnJheS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2FycmF5XXtwb3B9e1xvcHRpb25hbHtpfX0KLVJlbW92ZXMgdGhlIGl0ZW0gd2l0aCB0aGUgaW5kZXggXHZhcntpfSBmcm9tIHRoZSBhcnJheSBhbmQgcmV0dXJucwotaXQuIFRoZSBvcHRpb25hbCBhcmd1bWVudCBkZWZhdWx0cyB0byBcY29kZXstMX0sIHNvIHRoYXQgYnkgZGVmYXVsdAotdGhlIGxhc3QgaXRlbSBpcyByZW1vdmVkIGFuZCByZXR1cm5lZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2FycmF5XXtyZWFkfXtmLCBufQotXGRlcHJlY2F0ZWQgezEuNS4xfQotICB7VXNlIHRoZSBcbWV0aG9ke2Zyb21maWxlKCl9IG1ldGhvZC59Ci1SZWFkIFx2YXJ7bn0gaXRlbXMgKGFzIG1hY2hpbmUgdmFsdWVzKSBmcm9tIHRoZSBmaWxlIG9iamVjdCBcdmFye2Z9Ci1hbmQgYXBwZW5kIHRoZW0gdG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkuICBJZiBsZXNzIHRoYW4gXHZhcntufSBpdGVtcwotYXJlIGF2YWlsYWJsZSwgXGV4Y2VwdGlvbntFT0ZFcnJvcn0gaXMgcmFpc2VkLCBidXQgdGhlIGl0ZW1zIHRoYXQgd2VyZQotYXZhaWxhYmxlIGFyZSBzdGlsbCBpbnNlcnRlZCBpbnRvIHRoZSBhcnJheS4gIFx2YXJ7Zn0gbXVzdCBiZSBhIHJlYWwKLWJ1aWx0LWluIGZpbGUgb2JqZWN0OyBzb21ldGhpbmcgZWxzZSB3aXRoIGEgXG1ldGhvZHtyZWFkKCl9IG1ldGhvZCB3b24ndAotZG8uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVthcnJheV17cmVtb3ZlfXt4fQotUmVtb3ZlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIFx2YXJ7eH0gZnJvbSB0aGUgYXJyYXkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVthcnJheV17cmV2ZXJzZX17fQotUmV2ZXJzZSB0aGUgb3JkZXIgb2YgdGhlIGl0ZW1zIGluIHRoZSBhcnJheS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2FycmF5XXt0b2ZpbGV9e2Z9Ci1Xcml0ZSBhbGwgaXRlbXMgKGFzIG1hY2hpbmUgdmFsdWVzKSB0byB0aGUgZmlsZSBvYmplY3QgXHZhcntmfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2FycmF5XXt0b2xpc3R9e30KLUNvbnZlcnQgdGhlIGFycmF5IHRvIGFuIG9yZGluYXJ5IGxpc3Qgd2l0aCB0aGUgc2FtZSBpdGVtcy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2FycmF5XXt0b3N0cmluZ317fQotQ29udmVydCB0aGUgYXJyYXkgdG8gYW4gYXJyYXkgb2YgbWFjaGluZSB2YWx1ZXMgYW5kIHJldHVybiB0aGUKLXN0cmluZyByZXByZXNlbnRhdGlvbiAodGhlIHNhbWUgc2VxdWVuY2Ugb2YgYnl0ZXMgdGhhdCB3b3VsZAotYmUgd3JpdHRlbiB0byBhIGZpbGUgYnkgdGhlIFxtZXRob2R7dG9maWxlKCl9IG1ldGhvZC4pCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVthcnJheV17dG91bmljb2RlfXt9Ci1Db252ZXJ0IHRoZSBhcnJheSB0byBhIHVuaWNvZGUgc3RyaW5nLiAgVGhlIGFycmF5IG11c3QgYmUKLWEgdHlwZSBcY29kZXsndSd9IGFycmF5OyBvdGhlcndpc2UgYSBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IGlzIHJhaXNlZC4KLVVzZSBcc2FtcHthcnJheS50b3N0cmluZygpLmRlY29kZShlbmMpfSB0byBvYnRhaW4gYSB1bmljb2RlIHN0cmluZwotZnJvbSBhbiBhcnJheSBvZiBzb21lIG90aGVyIHR5cGUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVthcnJheV17d3JpdGV9e2Z9Ci1cZGVwcmVjYXRlZCB7MS41LjF9Ci0gIHtVc2UgdGhlIFxtZXRob2R7dG9maWxlKCl9IG1ldGhvZC59Ci1Xcml0ZSBhbGwgaXRlbXMgKGFzIG1hY2hpbmUgdmFsdWVzKSB0byB0aGUgZmlsZSBvYmplY3QgXHZhcntmfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotV2hlbiBhbiBhcnJheSBvYmplY3QgaXMgcHJpbnRlZCBvciBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcsIGl0IGlzCi1yZXByZXNlbnRlZCBhcyBcY29kZXthcnJheShcdmFye3R5cGVjb2RlfSwgXHZhcntpbml0aWFsaXplcn0pfS4gIFRoZQotXHZhcntpbml0aWFsaXplcn0gaXMgb21pdHRlZCBpZiB0aGUgYXJyYXkgaXMgZW1wdHksIG90aGVyd2lzZSBpdCBpcyBhCi1zdHJpbmcgaWYgdGhlIFx2YXJ7dHlwZWNvZGV9IGlzIFxjb2RleydjJ30sIG90aGVyd2lzZSBpdCBpcyBhIGxpc3Qgb2YKLW51bWJlcnMuICBUaGUgc3RyaW5nIGlzIGd1YXJhbnRlZWQgdG8gYmUgYWJsZSB0byBiZSBjb252ZXJ0ZWQgYmFjayB0bwotYW4gYXJyYXkgd2l0aCB0aGUgc2FtZSB0eXBlIGFuZCB2YWx1ZSB1c2luZyByZXZlcnNlIHF1b3RlcwotKFxjb2Rle2BgfSksIHNvIGxvbmcgYXMgdGhlIFxmdW5jdGlvbnthcnJheSgpfSBmdW5jdGlvbiBoYXMgYmVlbgotaW1wb3J0ZWQgdXNpbmcgXGNvZGV7ZnJvbSBhcnJheSBpbXBvcnQgYXJyYXl9LiAgRXhhbXBsZXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWFycmF5KCdsJykKLWFycmF5KCdjJywgJ2hlbGxvIHdvcmxkJykKLWFycmF5KCd1JywgdSdoZWxsbyBcdGV4dGJhY2tzbGFzaCB1MjY0MScpCi1hcnJheSgnbCcsIFsxLCAyLCAzLCA0LCA1XSkKLWFycmF5KCdkJywgWzEuMCwgMi4wLCAzLjE0XSkKLVxlbmR7dmVyYmF0aW19Ci0KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWVtb2R1bGV7c3RydWN0fXtQYWNraW5nIGFuZCB1bnBhY2tpbmcgb2YgaGV0ZXJvZ2VuZW91cyBiaW5hcnkgZGF0YS59Ci0gIFxzZWVtb2R1bGV7eGRybGlifXtQYWNraW5nIGFuZCB1bnBhY2tpbmcgb2YgRXh0ZXJuYWwgRGF0YQotICAgICAgICAgICAgICAgICAgICAgUmVwcmVzZW50YXRpb24gKFhEUikgZGF0YSBhcyB1c2VkIGluIHNvbWUgcmVtb3RlCi0gICAgICAgICAgICAgICAgICAgICBwcm9jZWR1cmUgY2FsbCBzeXN0ZW1zLn0KLSAgXHNlZXRpdGxlW2h0dHA6Ly9udW1weS5zb3VyY2Vmb3JnZS5uZXQvbnVtZG9jL0hUTUwvbnVtZG9jLmh0bV17VGhlCi0gICAgICAgICAgIE51bWVyaWNhbCBQeXRob24gTWFudWFsfXtUaGUgTnVtZXJpYyBQeXRob24gZXh0ZW5zaW9uCi0gICAgICAgICAgIChOdW1QeSkgZGVmaW5lcyBhbm90aGVyIGFycmF5IHR5cGU7IHNlZQotICAgICAgICAgICBcdXJse2h0dHA6Ly9udW1weS5zb3VyY2Vmb3JnZS5uZXQvfSBmb3IgZnVydGhlciBpbmZvcm1hdGlvbgotICAgICAgICAgICBhYm91dCBOdW1lcmljYWwgUHl0aG9uLiAgKEEgUERGIHZlcnNpb24gb2YgdGhlIE51bVB5IG1hbnVhbAotICAgICAgICAgICBpcyBhdmFpbGFibGUgYXQKLSAgICAgICAgICAgXHVybHtodHRwOi8vbnVtcHkuc291cmNlZm9yZ2UubmV0L251bWRvYy9udW1kb2MucGRmfSkufQotXGVuZHtzZWVhbHNvfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJhc2NpaS50ZXggYi9Eb2MvbGliL2xpYmFzY2lpLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAzYmQ5NS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmFzY2lpLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle2N1cnNlcy5hc2NpaX0gLS0tCi0gICAgICAgICBVdGlsaXRpZXMgZm9yIEFTQ0lJIGNoYXJhY3RlcnN9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtjdXJzZXMuYXNjaWl9Ci1cbW9kdWxlc3lub3BzaXN7Q29uc3RhbnRzIGFuZCBzZXQtbWVtYmVyc2hpcCBmdW5jdGlvbnMgZm9yCi0gICAgICAgICAgICAgICAgXEFTQ0lJXCBjaGFyYWN0ZXJzLn0KLVxtb2R1bGVhdXRob3J7RXJpYyBTLiBSYXltb25kfXtlc3JAdGh5cnN1cy5jb219Ci1cc2VjdGlvbmF1dGhvcntFcmljIFMuIFJheW1vbmR9e2VzckB0aHlyc3VzLmNvbX0KLQotXHZlcnNpb25hZGRlZHsxLjZ9Ci0KLVRoZSBcbW9kdWxle2N1cnNlcy5hc2NpaX0gbW9kdWxlIHN1cHBsaWVzIG5hbWUgY29uc3RhbnRzIGZvcgotXEFTQ0lJe30gY2hhcmFjdGVycyBhbmQgZnVuY3Rpb25zIHRvIHRlc3QgbWVtYmVyc2hpcCBpbiB2YXJpb3VzCi1cQVNDSUl7fSBjaGFyYWN0ZXIgY2xhc3Nlcy4gIFRoZSBjb25zdGFudHMgc3VwcGxpZWQgYXJlIG5hbWVzIGZvcgotY29udHJvbCBjaGFyYWN0ZXJzIGFzIGZvbGxvd3M6Ci0KLVxiZWdpbnt0YWJsZWlpfXtsfGx9e2NvbnN0YW50fXtOYW1lfXtNZWFuaW5nfQotICBcbGluZWlpe05VTH17fQotICBcbGluZWlpe1NPSH17U3RhcnQgb2YgaGVhZGluZywgY29uc29sZSBpbnRlcnJ1cHR9Ci0gIFxsaW5laWl7U1RYfXtTdGFydCBvZiB0ZXh0fQotICBcbGluZWlpe0VUWH17RW5kIG9mIHRleHR9Ci0gIFxsaW5laWl7RU9UfXtFbmQgb2YgdHJhbnNtaXNzaW9ufQotICBcbGluZWlpe0VOUX17RW5xdWlyeSwgZ29lcyB3aXRoIFxjb25zdGFudHtBQ0t9IGZsb3cgY29udHJvbH0KLSAgXGxpbmVpaXtBQ0t9e0Fja25vd2xlZGdlbWVudH0KLSAgXGxpbmVpaXtCRUx9e0JlbGx9Ci0gIFxsaW5laWl7QlN9e0JhY2tzcGFjZX0KLSAgXGxpbmVpaXtUQUJ9e1RhYn0KLSAgXGxpbmVpaXtIVH17QWxpYXMgZm9yIFxjb25zdGFudHtUQUJ9OiBgYEhvcml6b250YWwgdGFiJyd9Ci0gIFxsaW5laWl7TEZ9e0xpbmUgZmVlZH0KLSAgXGxpbmVpaXtOTH17QWxpYXMgZm9yIFxjb25zdGFudHtMRn06IGBgTmV3IGxpbmUnJ30KLSAgXGxpbmVpaXtWVH17VmVydGljYWwgdGFifQotICBcbGluZWlpe0ZGfXtGb3JtIGZlZWR9Ci0gIFxsaW5laWl7Q1J9e0NhcnJpYWdlIHJldHVybn0KLSAgXGxpbmVpaXtTT317U2hpZnQtb3V0LCBiZWdpbiBhbHRlcm5hdGUgY2hhcmFjdGVyIHNldH0KLSAgXGxpbmVpaXtTSX17U2hpZnQtaW4sIHJlc3VtZSBkZWZhdWx0IGNoYXJhY3RlciBzZXR9Ci0gIFxsaW5laWl7RExFfXtEYXRhLWxpbmsgZXNjYXBlfQotICBcbGluZWlpe0RDMX17WE9OLCBmb3IgZmxvdyBjb250cm9sfQotICBcbGluZWlpe0RDMn17RGV2aWNlIGNvbnRyb2wgMiwgYmxvY2stbW9kZSBmbG93IGNvbnRyb2x9Ci0gIFxsaW5laWl7REMzfXtYT0ZGLCBmb3IgZmxvdyBjb250cm9sfQotICBcbGluZWlpe0RDNH17RGV2aWNlIGNvbnRyb2wgNH0KLSAgXGxpbmVpaXtOQUt9e05lZ2F0aXZlIGFja25vd2xlZGdlbWVudH0KLSAgXGxpbmVpaXtTWU59e1N5bmNocm9ub3VzIGlkbGV9Ci0gIFxsaW5laWl7RVRCfXtFbmQgdHJhbnNtaXNzaW9uIGJsb2NrfQotICBcbGluZWlpe0NBTn17Q2FuY2VsfQotICBcbGluZWlpe0VNfXtFbmQgb2YgbWVkaXVtfQotICBcbGluZWlpe1NVQn17U3Vic3RpdHV0ZX0KLSAgXGxpbmVpaXtFU0N9e0VzY2FwZX0KLSAgXGxpbmVpaXtGU317RmlsZSBzZXBhcmF0b3J9Ci0gIFxsaW5laWl7R1N9e0dyb3VwIHNlcGFyYXRvcn0KLSAgXGxpbmVpaXtSU317UmVjb3JkIHNlcGFyYXRvciwgYmxvY2stbW9kZSB0ZXJtaW5hdG9yfQotICBcbGluZWlpe1VTfXtVbml0IHNlcGFyYXRvcn0KLSAgXGxpbmVpaXtTUH17U3BhY2V9Ci0gIFxsaW5laWl7REVMfXtEZWxldGV9Ci1cZW5ke3RhYmxlaWl9Ci0KLU5vdGUgdGhhdCBtYW55IG9mIHRoZXNlIGhhdmUgbGl0dGxlIHByYWN0aWNhbCBzaWduaWZpY2FuY2UgaW4gbW9kZXJuCi11c2FnZS4gIFRoZSBtbmVtb25pY3MgZGVyaXZlIGZyb20gdGVsZXByaW50ZXIgY29udmVudGlvbnMgdGhhdCBwcmVkYXRlCi1kaWdpdGFsIGNvbXB1dGVycy4KLQotVGhlIG1vZHVsZSBzdXBwbGllcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucywgcGF0dGVybmVkIG9uIHRob3NlIGluIHRoZQotc3RhbmRhcmQgQyBsaWJyYXJ5OgotCi0KLVxiZWdpbntmdW5jZGVzY317aXNhbG51bX17Y30KLUNoZWNrcyBmb3IgYW4gXEFTQ0lJe30gYWxwaGFudW1lcmljIGNoYXJhY3RlcjsgaXQgaXMgZXF1aXZhbGVudCB0bwotXHNhbXB7aXNhbHBoYShcdmFye2N9KSBvciBpc2RpZ2l0KFx2YXJ7Y30pfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aXNhbHBoYX17Y30KLUNoZWNrcyBmb3IgYW4gXEFTQ0lJe30gYWxwaGFiZXRpYyBjaGFyYWN0ZXI7IGl0IGlzIGVxdWl2YWxlbnQgdG8KLVxzYW1we2lzdXBwZXIoXHZhcntjfSkgb3IgaXNsb3dlcihcdmFye2N9KX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2lzYXNjaWl9e2N9Ci1DaGVja3MgZm9yIGEgY2hhcmFjdGVyIHZhbHVlIHRoYXQgZml0cyBpbiB0aGUgNy1iaXQgXEFTQ0lJe30gc2V0LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpc2JsYW5rfXtjfQotQ2hlY2tzIGZvciBhbiBcQVNDSUl7fSB3aGl0ZXNwYWNlIGNoYXJhY3Rlci4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aXNjbnRybH17Y30KLUNoZWNrcyBmb3IgYW4gXEFTQ0lJe30gY29udHJvbCBjaGFyYWN0ZXIgKGluIHRoZSByYW5nZSAweDAwIHRvIDB4MWYpLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpc2RpZ2l0fXtjfQotQ2hlY2tzIGZvciBhbiBcQVNDSUl7fSBkZWNpbWFsIGRpZ2l0LCBcY2hhcmFjdGVyezB9IHRocm91Z2gKLVxjaGFyYWN0ZXJ7OX0uICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gXHNhbXB7XHZhcntjfSBpbiBzdHJpbmcuZGlnaXRzfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aXNncmFwaH17Y30KLUNoZWNrcyBmb3IgXEFTQ0lJe30gYW55IHByaW50YWJsZSBjaGFyYWN0ZXIgZXhjZXB0IHNwYWNlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpc2xvd2VyfXtjfQotQ2hlY2tzIGZvciBhbiBcQVNDSUl7fSBsb3dlci1jYXNlIGNoYXJhY3Rlci4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aXNwcmludH17Y30KLUNoZWNrcyBmb3IgYW55IFxBU0NJSXt9IHByaW50YWJsZSBjaGFyYWN0ZXIgaW5jbHVkaW5nIHNwYWNlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpc3B1bmN0fXtjfQotQ2hlY2tzIGZvciBhbnkgcHJpbnRhYmxlIFxBU0NJSXt9IGNoYXJhY3RlciB3aGljaCBpcyBub3QgYSBzcGFjZSBvciBhbgotYWxwaGFudW1lcmljIGNoYXJhY3Rlci4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aXNzcGFjZX17Y30KLUNoZWNrcyBmb3IgXEFTQ0lJe30gd2hpdGUtc3BhY2UgY2hhcmFjdGVyczsgc3BhY2UsIGxpbmUgZmVlZCwKLWNhcnJpYWdlIHJldHVybiwgZm9ybSBmZWVkLCBob3Jpem9udGFsIHRhYiwgdmVydGljYWwgdGFiLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpc3VwcGVyfXtjfQotQ2hlY2tzIGZvciBhbiBcQVNDSUl7fSB1cHBlcmNhc2UgbGV0dGVyLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpc3hkaWdpdH17Y30KLUNoZWNrcyBmb3IgYW4gXEFTQ0lJe30gaGV4YWRlY2ltYWwgZGlnaXQuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KLVxzYW1we1x2YXJ7Y30gaW4gc3RyaW5nLmhleGRpZ2l0c30uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2lzY3RybH17Y30KLUNoZWNrcyBmb3IgYW4gXEFTQ0lJe30gY29udHJvbCBjaGFyYWN0ZXIgKG9yZGluYWwgdmFsdWVzIDAgdG8gMzEpLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpc21ldGF9e2N9Ci1DaGVja3MgZm9yIGEgbm9uLVxBU0NJSXt9IGNoYXJhY3RlciAob3JkaW5hbCB2YWx1ZXMgMHg4MCBhbmQgYWJvdmUpLgotXGVuZHtmdW5jZGVzY30KLQotVGhlc2UgZnVuY3Rpb25zIGFjY2VwdCBlaXRoZXIgaW50ZWdlcnMgb3Igc3RyaW5nczsgd2hlbiB0aGUgYXJndW1lbnQKLWlzIGEgc3RyaW5nLCBpdCBpcyBmaXJzdCBjb252ZXJ0ZWQgdXNpbmcgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uCi1cZnVuY3Rpb257b3JkKCl9LgotCi1Ob3RlIHRoYXQgYWxsIHRoZXNlIGZ1bmN0aW9ucyBjaGVjayBvcmRpbmFsIGJpdCB2YWx1ZXMgZGVyaXZlZCBmcm9tIHRoZSAKLWZpcnN0IGNoYXJhY3RlciBvZiB0aGUgc3RyaW5nIHlvdSBwYXNzIGluOyB0aGV5IGRvIG5vdCBhY3R1YWxseSBrbm93Ci1hbnl0aGluZyBhYm91dCB0aGUgaG9zdCBtYWNoaW5lJ3MgY2hhcmFjdGVyIGVuY29kaW5nLiAgRm9yIGZ1bmN0aW9ucyAKLXRoYXQga25vdyBhYm91dCB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIChhbmQgaGFuZGxlCi1pbnRlcm5hdGlvbmFsaXphdGlvbiBwcm9wZXJseSkgc2VlIHRoZSBccmVmbW9kdWxle3N0cmluZ30gbW9kdWxlLgotCi1UaGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgdGFrZSBlaXRoZXIgYSBzaW5nbGUtY2hhcmFjdGVyIHN0cmluZyBvcgotaW50ZWdlciBieXRlIHZhbHVlOyB0aGV5IHJldHVybiBhIHZhbHVlIG9mIHRoZSBzYW1lIHR5cGUuCi0KLVxiZWdpbntmdW5jZGVzY317YXNjaWl9e2N9Ci1SZXR1cm4gdGhlIEFTQ0lJIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxvdyA3IGJpdHMgb2YgXHZhcntjfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y3RybH17Y30KLVJldHVybiB0aGUgY29udHJvbCBjaGFyYWN0ZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gY2hhcmFjdGVyCi0odGhlIGNoYXJhY3RlciBiaXQgdmFsdWUgaXMgYml0d2lzZS1hbmRlZCB3aXRoIDB4MWYpLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXthbHR9e2N9Ci1SZXR1cm4gdGhlIDgtYml0IGNoYXJhY3RlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBBU0NJSSBjaGFyYWN0ZXIKLSh0aGUgY2hhcmFjdGVyIGJpdCB2YWx1ZSBpcyBiaXR3aXNlLW9yZWQgd2l0aCAweDgwKS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gdGFrZXMgZWl0aGVyIGEgc2luZ2xlLWNoYXJhY3RlciBzdHJpbmcgb3IKLWludGVnZXIgdmFsdWU7IGl0IHJldHVybnMgYSBzdHJpbmcuCi0KLVxiZWdpbntmdW5jZGVzY317dW5jdHJsfXtjfQotUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBcQVNDSUl7fSBjaGFyYWN0ZXIgXHZhcntjfS4gIElmCi1cdmFye2N9IGlzIHByaW50YWJsZSwgdGhpcyBzdHJpbmcgaXMgdGhlIGNoYXJhY3RlciBpdHNlbGYuICBJZiB0aGUKLWNoYXJhY3RlciBpcyBhIGNvbnRyb2wgY2hhcmFjdGVyICgweDAwLTB4MWYpIHRoZSBzdHJpbmcgY29uc2lzdHMgb2YgYQotY2FyZXQgKFxjaGFyYWN0ZXJ7XF59KSBmb2xsb3dlZCBieSB0aGUgY29ycmVzcG9uZGluZyB1cHBlcmNhc2UgbGV0dGVyLgotSWYgdGhlIGNoYXJhY3RlciBpcyBhbiBcQVNDSUl7fSBkZWxldGUgKDB4N2YpIHRoZSBzdHJpbmcgaXMKLVxjb2RleydcXnt9Pyd9LiAgSWYgdGhlIGNoYXJhY3RlciBoYXMgaXRzIG1ldGEgYml0ICgweDgwKSBzZXQsIHRoZSBtZXRhCi1iaXQgaXMgc3RyaXBwZWQsIHRoZSBwcmVjZWRpbmcgcnVsZXMgYXBwbGllZCwgYW5kCi1cY2hhcmFjdGVyeyF9IHByZXBlbmRlZCB0byB0aGUgcmVzdWx0LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtjb250cm9sbmFtZXN9Ci1BIDMzLWVsZW1lbnQgc3RyaW5nIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIFxBU0NJSXt9IG1uZW1vbmljcyBmb3IgdGhlCi10aGlydHktdHdvIFxBU0NJSXt9IGNvbnRyb2wgY2hhcmFjdGVycyBmcm9tIDAgKE5VTCkgdG8gMHgxZiAoVVMpLCBpbgotb3JkZXIsIHBsdXMgdGhlIG1uZW1vbmljIFxzYW1we1NQfSBmb3IgdGhlIHNwYWNlIGNoYXJhY3Rlci4KLVxlbmR7ZGF0YWRlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmFzdC50ZXggYi9Eb2MvbGliL2xpYmFzdC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyOTU2YWUuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJhc3QudGV4CisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotJSBYWFggTGFiZWwgY2FuJ3QgYmUgX2FzdD8KLSUgWFhYIFdoZXJlIHNob3VsZCB0aGlzIHNlY3Rpb24vY2hhcHRlciBnbz8KLVxjaGFwdGVye0Fic3RyYWN0IFN5bnRheCBUcmVlc1xsYWJlbHthc3R9fQotCi1cc2VjdGlvbmF1dGhvcntNYXJ0aW4gdi4gTFwib3dpc317bWFydGluQHYubG9ld2lzLmRlfQotCi1cdmVyc2lvbmFkZGVkezIuNX0KLQotVGhlIFxjb2Rle19hc3R9IG1vZHVsZSBoZWxwcyBQeXRob24gYXBwbGljYXRpb25zIHRvIHByb2Nlc3MKLXRyZWVzIG9mIHRoZSBQeXRob24gYWJzdHJhY3Qgc3ludGF4IGdyYW1tYXIuIFRoZSBQeXRob24gY29tcGlsZXIKLWN1cnJlbnRseSBwcm92aWRlcyByZWFkLW9ubHkgYWNjZXNzIHRvIHN1Y2ggdHJlZXMsIG1lYW5pbmcgdGhhdAotYXBwbGljYXRpb25zIGNhbiBvbmx5IGNyZWF0ZSBhIHRyZWUgZm9yIGEgZ2l2ZW4gcGllY2Ugb2YgUHl0aG9uCi1zb3VyY2UgY29kZTsgZ2VuZXJhdGluZyBieXRlIGNvZGUgZnJvbSBhIChwb3RlbnRpYWxseSBtb2RpZmllZCkKLXRyZWUgaXMgbm90IHN1cHBvcnRlZC4gVGhlIGFic3RyYWN0IHN5bnRheCBpdHNlbGYgbWlnaHQgY2hhbmdlIHdpdGgKLWVhY2ggUHl0aG9uIHJlbGVhc2U7IHRoaXMgbW9kdWxlIGhlbHBzIHRvIGZpbmQgb3V0IHByb2dyYW1tYXRpY2FsbHkKLXdoYXQgdGhlIGN1cnJlbnQgZ3JhbW1hciBsb29rcyBsaWtlLgotCi1BbiBhYnN0cmFjdCBzeW50YXggdHJlZSBjYW4gYmUgZ2VuZXJhdGVkIGJ5IHBhc3NpbmcgXGNvZGV7X2FzdC5QeUNGX09OTFlfQVNUfQotYXMgYSBmbGFnIHRvIHRoZSBcZnVuY3Rpb257Y29tcGlsZX0gYnVpbHRpbiBmdW5jdGlvbi4gVGhlIHJlc3VsdCB3aWxsIGJlIGEgdHJlZQotb2Ygb2JqZWN0cyB3aG9zZSBjbGFzc2VzIGFsbCBpbmhlcml0IGZyb20gXGNvZGV7X2FzdC5BU1R9LgotCi1UaGUgYWN0dWFsIGNsYXNzZXMgYXJlIGRlcml2ZWQgZnJvbSB0aGUgXGNvZGV7UGFyc2VyL1B5dGhvbi5hc2RsfSBmaWxlLAotd2hpY2ggaXMgcmVwcm9kdWNlZCBiZWxvdy4gVGhlcmUgaXMgb25lIGNsYXNzIGRlZmluZWQgZm9yIGVhY2ggbGVmdC1oYW5kCi1zaWRlIHN5bWJvbCBpbiB0aGUgYWJzdHJhY3QgZ3JhbW1hciAoZm9yIGV4YW1wbGUsIFxjb2Rle19hc3Quc3RtdH0gb3IgXGNvZGV7X2FzdC5leHByfSkuCi1JbiBhZGRpdGlvbiwgdGhlcmUgaXMgb25lIGNsYXNzIGRlZmluZWQgZm9yIGVhY2ggY29uc3RydWN0b3Igb24gdGhlCi1yaWdodC1oYW5kIHNpZGU7IHRoZXNlIGNsYXNzZXMgaW5oZXJpdCBmcm9tIHRoZSBjbGFzc2VzIGZvciB0aGUgbGVmdC1oYW5kCi1zaWRlIHRyZWVzLiBGb3IgZXhhbXBsZSwgXGNvZGV7X2FzdC5CaW5PcH0gaW5oZXJpdHMgZnJvbSBcY29kZXtfYXN0LmV4cHJ9LgotRm9yIHByb2R1Y3Rpb24gcnVsZXMgd2l0aCBhbHRlcm5hdGl2ZXMgKGFrYSAic3VtcyIpLCB0aGUgbGVmdC1oYW5kIHNpZGUKLWNsYXNzIGlzIGFic3RyYWN0OiBvbmx5IGluc3RhbmNlcyBvZiBzcGVjaWZpYyBjb25zdHJ1Y3RvciBub2RlcyBhcmUgZXZlcgotY3JlYXRlZC4KLQotRWFjaCBjb25jcmV0ZSBjbGFzcyBoYXMgYW4gYXR0cmlidXRlIFxjb2Rle19maWVsZHN9IHdoaWNoIGdpdmVzIHRoZQotbmFtZXMgb2YgYWxsIGNoaWxkIG5vZGVzLgotCi1FYWNoIGluc3RhbmNlIG9mIGEgY29uY3JldGUgY2xhc3MgaGFzIG9uZSBhdHRyaWJ1dGUgZm9yIGVhY2ggY2hpbGQgbm9kZSwKLW9mIHRoZSB0eXBlIGFzIGRlZmluZWQgaW4gdGhlIGdyYW1tYXIuIEZvciBleGFtcGxlLCBcY29kZXtfYXN0LkJpbk9wfQotaW5zdGFuY2VzIGhhdmUgYW4gYXR0cmlidXRlIFxjb2Rle2xlZnR9IG9mIHR5cGUgXGNvZGV7X2FzdC5leHByfS4gIAotSW5zdGFuY2VzIG9mIFxjb2Rle19hc3QuZXhwcn0gYW5kIFxjb2Rle19hc3Quc3RtdH0gc3ViY2xhc3NlcyBhbHNvCi1oYXZlIGxpbmVubyBhbmQgY29sX29mZnNldCBhdHRyaWJ1dGVzLiAgVGhlIGxpbmVubyBpcyB0aGUgbGluZSBudW1iZXIKLW9mIHNvdXJjZSB0ZXh0ICgxIGluZGV4ZWQgc28gdGhlIGZpcnN0IGxpbmUgaXMgbGluZSAxKSBhbmQgdGhlCi1jb2xfb2Zmc2V0IGlzIHRoZSB1dGY4IGJ5dGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCB0b2tlbiB0aGF0IGdlbmVyYXRlZAotdGhlIG5vZGUuICBUaGUgdXRmOCBvZmZzZXQgaXMgcmVjb3JkZWQgYmVjYXVzZSB0aGUgcGFyc2VyIHVzZXMgdXRmOCAKLWludGVybmFsbHkuCi0KLUlmIHRoZXNlIGF0dHJpYnV0ZXMgYXJlIG1hcmtlZCBhcyBvcHRpb25hbCBpbiB0aGUgZ3JhbW1hciAodXNpbmcgYQotcXVlc3Rpb24gbWFyayksIHRoZSB2YWx1ZSBtaWdodCBiZSBcY29kZXtOb25lfS4gSWYgdGhlIGF0dHJpYnV0ZXMKLWNhbiBoYXZlIHplcm8tb3ItbW9yZSB2YWx1ZXMgKG1hcmtlZCB3aXRoIGFuIGFzdGVyaXNrKSwgdGhlCi12YWx1ZXMgYXJlIHJlcHJlc2VudGVkIGFzIFB5dGhvbiBsaXN0cy4KLQotXHNlY3Rpb257QWJzdHJhY3QgR3JhbW1hcn0KLQotVGhlIG1vZHVsZSBkZWZpbmVzIGEgc3RyaW5nIGNvbnN0YW50IFxjb2Rle19fdmVyc2lvbl9ffSB3aGljaAotaXMgdGhlIGRlY2ltYWwgc3VidmVyc2lvbiByZXZpc2lvbiBudW1iZXIgb2YgdGhlIGZpbGUgc2hvd24gYmVsb3cuCi0KLVRoZSBhYnN0cmFjdCBncmFtbWFyIGlzIGN1cnJlbnRseSBkZWZpbmVkIGFzIGZvbGxvd3M6Ci0KLVx2ZXJiYXRpbWlucHV0ey4uLy4uL1BhcnNlci9QeXRob24uYXNkbH0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliYXN5bmNoYXQudGV4IGIvRG9jL2xpYi9saWJhc3luY2hhdC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyM2JmZWQ3Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGliYXN5bmNoYXQudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7YXN5bmNoYXR9IC0tLQotICAgICAgICAgQXN5bmNocm9ub3VzIHNvY2tldCBjb21tYW5kL3Jlc3BvbnNlIGhhbmRsZXJ9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXthc3luY2hhdH0KLVxtb2R1bGVzeW5vcHNpc3tTdXBwb3J0IGZvciBhc3luY2hyb25vdXMgY29tbWFuZC9yZXNwb25zZSBwcm90b2NvbHMufQotXG1vZHVsZWF1dGhvcntTYW0gUnVzaGluZ317cnVzaGluZ0BuaWdodG1hcmUuY29tfQotXHNlY3Rpb25hdXRob3J7U3RldmUgSG9sZGVufXtzaG9sZGVuQGhvbGRlbndlYi5jb219Ci0KLVRoaXMgbW9kdWxlIGJ1aWxkcyBvbiB0aGUgXHJlZm1vZHVsZXthc3luY29yZX0gaW5mcmFzdHJ1Y3R1cmUsCi1zaW1wbGlmeWluZyBhc3luY2hyb25vdXMgY2xpZW50cyBhbmQgc2VydmVycyBhbmQgbWFraW5nIGl0IGVhc2llciB0bwotaGFuZGxlIHByb3RvY29scyB3aG9zZSBlbGVtZW50cyBhcmUgdGVybWluYXRlZCBieSBhcmJpdHJhcnkgc3RyaW5ncywgb3IKLWFyZSBvZiB2YXJpYWJsZSBsZW5ndGguIFxyZWZtb2R1bGV7YXN5bmNoYXR9IGRlZmluZXMgdGhlIGFic3RyYWN0IGNsYXNzCi1cY2xhc3N7YXN5bmNfY2hhdH0gdGhhdCB5b3Ugc3ViY2xhc3MsIHByb3ZpZGluZyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlCi1cbWV0aG9ke2NvbGxlY3RfaW5jb21pbmdfZGF0YSgpfSBhbmQgXG1ldGhvZHtmb3VuZF90ZXJtaW5hdG9yKCl9Ci1tZXRob2RzLiBJdCB1c2VzIHRoZSBzYW1lIGFzeW5jaHJvbm91cyBsb29wIGFzIFxyZWZtb2R1bGV7YXN5bmNvcmV9LCBhbmQKLXRoZSB0d28gdHlwZXMgb2YgY2hhbm5lbCwgXGNsYXNze2FzeW5jb3JlLmRpc3BhdGNoZXJ9IGFuZAotXGNsYXNze2FzeW5jaGF0LmFzeW5jX2NoYXR9LCBjYW4gZnJlZWx5IGJlIG1peGVkIGluIHRoZSBjaGFubmVsIG1hcC4KLVR5cGljYWxseSBhbiBcY2xhc3N7YXN5bmNvcmUuZGlzcGF0Y2hlcn0gc2VydmVyIGNoYW5uZWwgZ2VuZXJhdGVzIG5ldwotXGNsYXNze2FzeW5jaGF0LmFzeW5jX2NoYXR9IGNoYW5uZWwgb2JqZWN0cyBhcyBpdCByZWNlaXZlcyBpbmNvbWluZwotY29ubmVjdGlvbiByZXF1ZXN0cy4gCi0KLVxiZWdpbntjbGFzc2Rlc2N9e2FzeW5jX2NoYXR9e30KLSAgVGhpcyBjbGFzcyBpcyBhbiBhYnN0cmFjdCBzdWJjbGFzcyBvZiBcY2xhc3N7YXN5bmNvcmUuZGlzcGF0Y2hlcn0uIFRvIG1ha2UKLSAgcHJhY3RpY2FsIHVzZSBvZiB0aGUgY29kZSB5b3UgbXVzdCBzdWJjbGFzcyBcY2xhc3N7YXN5bmNfY2hhdH0sIHByb3ZpZGluZwotICBtZWFuaW5nZnVsIFxtZXRob2R7Y29sbGVjdF9pbmNvbWluZ19kYXRhKCl9IGFuZCBcbWV0aG9ke2ZvdW5kX3Rlcm1pbmF0b3IoKX0KLSAgbWV0aG9kcy4gVGhlIFxjbGFzc3thc3luY29yZS5kaXNwYXRjaGVyfSBtZXRob2RzIGNhbiBiZQotICB1c2VkLCBhbHRob3VnaCBub3QgYWxsIG1ha2Ugc2Vuc2UgaW4gYSBtZXNzYWdlL3Jlc3BvbnNlIGNvbnRleHQuICAKLQotICBMaWtlIFxjbGFzc3thc3luY29yZS5kaXNwYXRjaGVyfSwgXGNsYXNze2FzeW5jX2NoYXR9IGRlZmluZXMgYSBzZXQgb2YgZXZlbnRzCi0gIHRoYXQgYXJlIGdlbmVyYXRlZCBieSBhbiBhbmFseXNpcyBvZiBzb2NrZXQgY29uZGl0aW9ucyBhZnRlciBhCi0gIFxjZnVuY3Rpb257c2VsZWN0KCl9IGNhbGwuIE9uY2UgdGhlIHBvbGxpbmcgbG9vcCBoYXMgYmVlbiBzdGFydGVkIHRoZQotICBcY2xhc3N7YXN5bmNfY2hhdH0gb2JqZWN0J3MgbWV0aG9kcyBhcmUgY2FsbGVkIGJ5IHRoZSBldmVudC1wcm9jZXNzaW5nCi0gIGZyYW1ld29yayB3aXRoIG5vIGFjdGlvbiBvbiB0aGUgcGFydCBvZiB0aGUgcHJvZ3JhbW1lci4KLQotICBVbmxpa2UgXGNsYXNze2FzeW5jb3JlLmRpc3BhdGNoZXJ9LCBcY2xhc3N7YXN5bmNfY2hhdH0gYWxsb3dzIHlvdSB0byBkZWZpbmUKLSAgYSBmaXJzdC1pbi1maXJzdC1vdXQgcXVldWUgKGZpZm8pIG9mIFxlbXBoe3Byb2R1Y2Vyc30uIEEgcHJvZHVjZXIgbmVlZCBoYXZlCi0gIG9ubHkgb25lIG1ldGhvZCwgXG1ldGhvZHttb3JlKCl9LCB3aGljaCBzaG91bGQgcmV0dXJuIGRhdGEgdG8gYmUgdHJhbnNtaXR0ZWQKLSAgb24gdGhlIGNoYW5uZWwuIFRoZSBwcm9kdWNlciBpbmRpY2F0ZXMgZXhoYXVzdGlvbiAoXGVtcGh7aS5lLn0gdGhhdCBpdCBjb250YWlucwotICBubyBtb3JlIGRhdGEpIGJ5IGhhdmluZyBpdHMgXG1ldGhvZHttb3JlKCl9IG1ldGhvZCByZXR1cm4gdGhlIGVtcHR5IHN0cmluZy4gQXQKLSAgdGhpcyBwb2ludCB0aGUgXGNsYXNze2FzeW5jX2NoYXR9IG9iamVjdCByZW1vdmVzIHRoZSBwcm9kdWNlciBmcm9tIHRoZSBmaWZvCi0gIGFuZCBzdGFydHMgdXNpbmcgdGhlIG5leHQgcHJvZHVjZXIsIGlmIGFueS4gV2hlbiB0aGUgcHJvZHVjZXIgZmlmbyBpcyBlbXB0eQotICB0aGUgXG1ldGhvZHtoYW5kbGVfd3JpdGUoKX0gbWV0aG9kIGRvZXMgbm90aGluZy4gWW91IHVzZSB0aGUgY2hhbm5lbCBvYmplY3QncwotICBcbWV0aG9ke3NldF90ZXJtaW5hdG9yKCl9IG1ldGhvZCB0byBkZXNjcmliZSBob3cgdG8gcmVjb2duaXplIHRoZSBlbmQKLSAgb2YsIG9yIGFuIGltcG9ydGFudCBicmVha3BvaW50IGluLCBhbiBpbmNvbWluZyB0cmFuc21pc3Npb24gZnJvbSB0aGUKLSAgcmVtb3RlIGVuZHBvaW50LgotCi0gIFRvIGJ1aWxkIGEgZnVuY3Rpb25pbmcgXGNsYXNze2FzeW5jX2NoYXR9IHN1YmNsYXNzIHlvdXIgCi0gIGlucHV0IG1ldGhvZHMgXG1ldGhvZHtjb2xsZWN0X2luY29taW5nX2RhdGEoKX0gYW5kCi0gIFxtZXRob2R7Zm91bmRfdGVybWluYXRvcigpfSBtdXN0IGhhbmRsZSB0aGUgZGF0YSB0aGF0IHRoZSBjaGFubmVsIHJlY2VpdmVzCi0gIGFzeW5jaHJvbm91c2x5LiBUaGUgbWV0aG9kcyBhcmUgZGVzY3JpYmVkIGJlbG93LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtjbG9zZV93aGVuX2RvbmV9e30KLSAgUHVzaGVzIGEgXGNvZGV7Tm9uZX0gb24gdG8gdGhlIHByb2R1Y2VyIGZpZm8uIFdoZW4gdGhpcyBwcm9kdWNlciBpcwotICBwb3BwZWQgb2ZmIHRoZSBmaWZvIGl0IGNhdXNlcyB0aGUgY2hhbm5lbCB0byBiZSBjbG9zZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtjb2xsZWN0X2luY29taW5nX2RhdGF9e2RhdGF9Ci0gIENhbGxlZCB3aXRoIFx2YXJ7ZGF0YX0gaG9sZGluZyBhbiBhcmJpdHJhcnkgYW1vdW50IG9mIHJlY2VpdmVkIGRhdGEuCi0gIFRoZSBkZWZhdWx0IG1ldGhvZCwgd2hpY2ggbXVzdCBiZSBvdmVycmlkZGVuLCByYWlzZXMgYSBcZXhjZXB0aW9ue05vdEltcGxlbWVudGVkRXJyb3J9IGV4Y2VwdGlvbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2Rpc2NhcmRfYnVmZmVyc317fQotICBJbiBlbWVyZ2VuY2llcyB0aGlzIG1ldGhvZCB3aWxsIGRpc2NhcmQgYW55IGRhdGEgaGVsZCBpbiB0aGUgaW5wdXQgYW5kL29yCi0gIG91dHB1dCBidWZmZXJzIGFuZCB0aGUgcHJvZHVjZXIgZmlmby4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2ZvdW5kX3Rlcm1pbmF0b3J9e30KLSAgQ2FsbGVkIHdoZW4gdGhlIGluY29taW5nIGRhdGEgc3RyZWFtICBtYXRjaGVzIHRoZSB0ZXJtaW5hdGlvbiBjb25kaXRpb24KLSAgc2V0IGJ5IFxtZXRob2R7c2V0X3Rlcm1pbmF0b3J9LiBUaGUgZGVmYXVsdCBtZXRob2QsIHdoaWNoIG11c3QgYmUgb3ZlcnJpZGRlbiwKLSAgcmFpc2VzIGEgXGV4Y2VwdGlvbntOb3RJbXBsZW1lbnRlZEVycm9yfSBleGNlcHRpb24uIFRoZSBidWZmZXJlZCBpbnB1dCBkYXRhIHNob3VsZAotICBiZSBhdmFpbGFibGUgdmlhIGFuIGluc3RhbmNlIGF0dHJpYnV0ZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2dldF90ZXJtaW5hdG9yfXt9Ci0gIFJldHVybnMgdGhlIGN1cnJlbnQgdGVybWluYXRvciBmb3IgdGhlIGNoYW5uZWwuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtoYW5kbGVfY2xvc2V9e30KLSAgQ2FsbGVkIHdoZW4gdGhlIGNoYW5uZWwgaXMgY2xvc2VkLiBUaGUgZGVmYXVsdCBtZXRob2Qgc2lsZW50bHkgY2xvc2VzCi0gIHRoZSBjaGFubmVsJ3Mgc29ja2V0LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317aGFuZGxlX3JlYWR9e30KLSAgQ2FsbGVkIHdoZW4gYSByZWFkIGV2ZW50IGZpcmVzIG9uIHRoZSBjaGFubmVsJ3Mgc29ja2V0IGluIHRoZQotICBhc3luY2hyb25vdXMgbG9vcC4gVGhlIGRlZmF1bHQgbWV0aG9kIGNoZWNrcyBmb3IgdGhlIHRlcm1pbmF0aW9uCi0gIGNvbmRpdGlvbiBlc3RhYmxpc2hlZCBieSBcbWV0aG9ke3NldF90ZXJtaW5hdG9yKCl9LCB3aGljaCBjYW4gYmUgZWl0aGVyCi0gIHRoZSBhcHBlYXJhbmNlIG9mIGEgcGFydGljdWxhciBzdHJpbmcgaW4gdGhlIGlucHV0IHN0cmVhbSBvciB0aGUgcmVjZWlwdAotICBvZiBhIHBhcnRpY3VsYXIgbnVtYmVyIG9mIGNoYXJhY3RlcnMuIFdoZW4gdGhlIHRlcm1pbmF0b3IgaXMgZm91bmQsCi0gIFxtZXRob2R7aGFuZGxlX3JlYWR9IGNhbGxzIHRoZSBcbWV0aG9ke2ZvdW5kX3Rlcm1pbmF0b3IoKX0gbWV0aG9kIGFmdGVyCi0gIGNhbGxpbmcgXG1ldGhvZHtjb2xsZWN0X2luY29taW5nX2RhdGEoKX0gd2l0aCBhbnkgZGF0YSBwcmVjZWRpbmcgdGhlCi0gIHRlcm1pbmF0aW5nIGNvbmRpdGlvbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2hhbmRsZV93cml0ZX17fQotICBDYWxsZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gbWF5IHdyaXRlIGRhdGEgdG8gdGhlIGNoYW5uZWwuICAKLSAgVGhlIGRlZmF1bHQgbWV0aG9kIGNhbGxzIHRoZSBcbWV0aG9ke2luaXRpYXRlX3NlbmQoKX0gbWV0aG9kLCB3aGljaCBpbiB0dXJuCi0gIHdpbGwgY2FsbCBcbWV0aG9ke3JlZmlsbF9idWZmZXIoKX0gdG8gY29sbGVjdCBkYXRhIGZyb20gdGhlIHByb2R1Y2VyCi0gIGZpZm8gYXNzb2NpYXRlZCB3aXRoIHRoZSBjaGFubmVsLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317cHVzaH17ZGF0YX0KLSAgQ3JlYXRlcyBhIFxjbGFzc3tzaW1wbGVfcHJvZHVjZXJ9IG9iamVjdCAoXGVtcGh7c2VlIGJlbG93fSkgY29udGFpbmluZyB0aGUgZGF0YSBhbmQKLSAgcHVzaGVzIGl0IG9uIHRvIHRoZSBjaGFubmVsJ3MgXGNvZGV7cHJvZHVjZXJfZmlmb30gdG8gZW5zdXJlIGl0cwotICB0cmFuc21pc3Npb24uIFRoaXMgaXMgYWxsIHlvdSBuZWVkIHRvIGRvIHRvIGhhdmUgdGhlIGNoYW5uZWwgd3JpdGUKLSAgdGhlIGRhdGEgb3V0IHRvIHRoZSBuZXR3b3JrLCBhbHRob3VnaCBpdCBpcyBwb3NzaWJsZSB0byB1c2UgeW91cgotICBvd24gcHJvZHVjZXJzIGluIG1vcmUgY29tcGxleCBzY2hlbWVzIHRvIGltcGxlbWVudCBlbmNyeXB0aW9uIGFuZAotICBjaHVua2luZywgZm9yIGV4YW1wbGUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtwdXNoX3dpdGhfcHJvZHVjZXJ9e3Byb2R1Y2VyfQotICBUYWtlcyBhIHByb2R1Y2VyIG9iamVjdCBhbmQgYWRkcyBpdCB0byB0aGUgcHJvZHVjZXIgZmlmbyBhc3NvY2lhdGVkIHdpdGgKLSAgdGhlIGNoYW5uZWwuIFdoZW4gYWxsIGN1cnJlbnRseS1wdXNoZWQgcHJvZHVjZXJzIGhhdmUgYmVlbiBleGhhdXN0ZWQKLSAgdGhlIGNoYW5uZWwgd2lsbCBjb25zdW1lIHRoaXMgcHJvZHVjZXIncyBkYXRhIGJ5IGNhbGxpbmcgaXRzCi0gIFxtZXRob2R7bW9yZSgpfSBtZXRob2QgYW5kIHNlbmQgdGhlIGRhdGEgdG8gdGhlIHJlbW90ZSBlbmRwb2ludC4gCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtyZWFkYWJsZX17fQotICBTaG91bGQgcmV0dXJuIFxjb2Rle1RydWV9IGZvciB0aGUgY2hhbm5lbCB0byBiZSBpbmNsdWRlZCBpbiB0aGUgc2V0IG9mCi0gIGNoYW5uZWxzIHRlc3RlZCBieSB0aGUgXGNmdW5jdGlvbntzZWxlY3QoKX0gbG9vcCBmb3IgcmVhZGFiaWxpdHkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtyZWZpbGxfYnVmZmVyfXt9Ci0gIFJlZmlsbHMgdGhlIG91dHB1dCBidWZmZXIgYnkgY2FsbGluZyB0aGUgXG1ldGhvZHttb3JlKCl9IG1ldGhvZCBvZiB0aGUKLSAgcHJvZHVjZXIgYXQgdGhlIGhlYWQgb2YgdGhlIGZpZm8uIElmIGl0IGlzIGV4aGF1c3RlZCB0aGVuIHRoZQotICBwcm9kdWNlciBpcyBwb3BwZWQgb2ZmIHRoZSBmaWZvIGFuZCB0aGUgbmV4dCBwcm9kdWNlciBpcyBhY3RpdmF0ZWQuCi0gIElmIHRoZSBjdXJyZW50IHByb2R1Y2VyIGlzLCBvciBiZWNvbWVzLCBcY29kZXtOb25lfSB0aGVuIHRoZSBjaGFubmVsCi0gIGlzIGNsb3NlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3NldF90ZXJtaW5hdG9yfXt0ZXJtfQotICBTZXRzIHRoZSB0ZXJtaW5hdGluZyBjb25kaXRpb24gdG8gYmUgcmVjb2duaXNlZCBvbiB0aGUgY2hhbm5lbC4gXGNvZGV7dGVybX0KLSAgbWF5IGJlIGFueSBvZiB0aHJlZSB0eXBlcyBvZiB2YWx1ZSwgY29ycmVzcG9uZGluZyB0byB0aHJlZSBkaWZmZXJlbnQgd2F5cwotICB0byBoYW5kbGUgaW5jb21pbmcgcHJvdG9jb2wgZGF0YS4KLQotICBcYmVnaW57dGFibGVpaX17bHxsfXt9e3Rlcm19e0Rlc2NyaXB0aW9ufQotICAgIFxsaW5laWl7XGVtcGh7c3RyaW5nfX17V2lsbCBjYWxsIFxtZXRob2R7Zm91bmRfdGVybWluYXRvcigpfSB3aGVuIHRoZQotICAgICAgICAgICAgICAgIHN0cmluZyBpcyBmb3VuZCBpbiB0aGUgaW5wdXQgc3RyZWFtfQotICAgIFxsaW5laWl7XGVtcGh7aW50ZWdlcn19e1dpbGwgY2FsbCBcbWV0aG9ke2ZvdW5kX3Rlcm1pbmF0b3IoKX0gd2hlbiB0aGUKLSAgICAgICAgICAgICAgICBpbmRpY2F0ZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaGF2ZSBiZWVuIHJlY2VpdmVkfQotICAgIFxsaW5laWl7XGNvZGV7Tm9uZX19e1RoZSBjaGFubmVsIGNvbnRpbnVlcyB0byBjb2xsZWN0IGRhdGEgZm9yZXZlcn0KLSAgXGVuZHt0YWJsZWlpfQotCi0gIE5vdGUgdGhhdCBhbnkgZGF0YSBmb2xsb3dpbmcgdGhlIHRlcm1pbmF0b3Igd2lsbCBiZSBhdmFpbGFibGUgZm9yIHJlYWRpbmcgYnkKLSAgdGhlIGNoYW5uZWwgYWZ0ZXIgXG1ldGhvZHtmb3VuZF90ZXJtaW5hdG9yKCl9IGlzIGNhbGxlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3dyaXRhYmxlfXt9Ci0gIFNob3VsZCByZXR1cm4gXGNvZGV7VHJ1ZX0gYXMgbG9uZyBhcyBpdGVtcyByZW1haW4gb24gdGhlIHByb2R1Y2VyIGZpZm8sCi0gIG9yIHRoZSBjaGFubmVsIGlzIGNvbm5lY3RlZCBhbmQgdGhlIGNoYW5uZWwncyBvdXRwdXQgYnVmZmVyIGlzIG5vbi1lbXB0eS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXHN1YnNlY3Rpb257YXN5bmNoYXQgLSBBdXhpbGlhcnkgQ2xhc3NlcyBhbmQgRnVuY3Rpb25zfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtzaW1wbGVfcHJvZHVjZXJ9e2RhdGFcb3B0aW9uYWx7LCBidWZmZXJfc2l6ZT01MTJ9fQotICBBIFxjbGFzc3tzaW1wbGVfcHJvZHVjZXJ9IHRha2VzIGEgY2h1bmsgb2YgZGF0YSBhbmQgYW4gb3B0aW9uYWwgYnVmZmVyIHNpemUuCi0gIFJlcGVhdGVkIGNhbGxzIHRvIGl0cyBcbWV0aG9ke21vcmUoKX0gbWV0aG9kIHlpZWxkIHN1Y2Nlc3NpdmUgY2h1bmtzIG9mIHRoZQotICBkYXRhIG5vIGxhcmdlciB0aGFuIFx2YXJ7YnVmZmVyX3NpemV9LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXttb3JlfXt9Ci0gIFByb2R1Y2VzIHRoZSBuZXh0IGNodW5rIG9mIGluZm9ybWF0aW9uIGZyb20gdGhlIHByb2R1Y2VyLCBvciByZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e2ZpZm99e1xvcHRpb25hbHtsaXN0PU5vbmV9fQotICBFYWNoIGNoYW5uZWwgbWFpbnRhaW5zIGEgXGNsYXNze2ZpZm99IGhvbGRpbmcgZGF0YSB3aGljaCBoYXMgYmVlbiBwdXNoZWQgYnkgdGhlCi0gIGFwcGxpY2F0aW9uIGJ1dCBub3QgeWV0IHBvcHBlZCBmb3Igd3JpdGluZyB0byB0aGUgY2hhbm5lbC4KLSAgQSBcY2xhc3N7Zmlmb30gaXMgYSBsaXN0IHVzZWQgdG8gaG9sZCBkYXRhIGFuZC9vciBwcm9kdWNlcnMgdW50aWwgdGhleSBhcmUgcmVxdWlyZWQuCi0gIElmIHRoZSBcdmFye2xpc3R9IGFyZ3VtZW50IGlzIHByb3ZpZGVkIHRoZW4gaXQgc2hvdWxkIGNvbnRhaW4gcHJvZHVjZXJzIG9yCi0gIGRhdGEgaXRlbXMgdG8gYmUgd3JpdHRlbiB0byB0aGUgY2hhbm5lbC4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317aXNfZW1wdHl9e30KLSAgUmV0dXJucyBcY29kZXtUcnVlfSBpZmYgdGhlIGZpZm8gaXMgZW1wdHkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtmaXJzdH17fQotICBSZXR1cm5zIHRoZSBsZWFzdC1yZWNlbnRseSBcbWV0aG9ke3B1c2goKX1lZCBpdGVtIGZyb20gdGhlIGZpZm8uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtwdXNofXtkYXRhfQotICBBZGRzIHRoZSBnaXZlbiBkYXRhICh3aGljaCBtYXkgYmUgYSBzdHJpbmcgb3IgYSBwcm9kdWNlciBvYmplY3QpIHRvIHRoZQotICBwcm9kdWNlciBmaWZvLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317cG9wfXt9Ci0gIElmIHRoZSBmaWZvIGlzIG5vdCBlbXB0eSwgcmV0dXJucyBcY29kZXtUcnVlLCBmaXJzdCgpfSwgZGVsZXRpbmcgdGhlIHBvcHBlZAotICBpdGVtLiBSZXR1cm5zIFxjb2Rle0ZhbHNlLCBOb25lfSBmb3IgYW4gZW1wdHkgZmlmby4KLVxlbmR7bWV0aG9kZGVzY30KLQotVGhlIFxtb2R1bGV7YXN5bmNoYXR9IG1vZHVsZSBhbHNvIGRlZmluZXMgb25lIHV0aWxpdHkgZnVuY3Rpb24sIHdoaWNoIG1heSBiZQotb2YgdXNlIGluIG5ldHdvcmsgYW5kIHRleHR1YWwgYW5hbHlzaXMgb3BlcmF0aW9ucy4KLQotXGJlZ2lue2Z1bmNkZXNjfXtmaW5kX3ByZWZpeF9hdF9lbmR9e2hheXN0YWNrLCBuZWVkbGV9Ci0gIFJldHVybnMgXGNvZGV7VHJ1ZX0gaWYgc3RyaW5nIFx2YXJ7aGF5c3RhY2t9IGVuZHMgd2l0aCBhbnkgbm9uLWVtcHR5Ci0gIHByZWZpeCBvZiBzdHJpbmcgXHZhcntuZWVkbGV9LgotXGVuZHtmdW5jZGVzY30KLQotXHN1YnNlY3Rpb257YXN5bmNoYXQgRXhhbXBsZSBcbGFiZWx7YXN5bmNoYXQtZXhhbXBsZX19Ci0KLVRoZSBmb2xsb3dpbmcgcGFydGlhbCBleGFtcGxlIHNob3dzIGhvdyBIVFRQIHJlcXVlc3RzIGNhbiBiZSByZWFkIHdpdGgKLVxjbGFzc3thc3luY19jaGF0fS4gQSB3ZWIgc2VydmVyIG1pZ2h0IGNyZWF0ZSBhbiBcY2xhc3N7aHR0cF9yZXF1ZXN0X2hhbmRsZXJ9IG9iamVjdCBmb3IKLWVhY2ggaW5jb21pbmcgY2xpZW50IGNvbm5lY3Rpb24uIE5vdGljZSB0aGF0IGluaXRpYWxseSB0aGUKLWNoYW5uZWwgdGVybWluYXRvciBpcyBzZXQgdG8gbWF0Y2ggdGhlIGJsYW5rIGxpbmUgYXQgdGhlIGVuZCBvZiB0aGUgSFRUUAotaGVhZGVycywgYW5kIGEgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgaGVhZGVycyBhcmUgYmVpbmcgcmVhZC4KLQotT25jZSB0aGUgaGVhZGVycyBoYXZlIGJlZW4gcmVhZCwgaWYgdGhlIHJlcXVlc3QgaXMgb2YgdHlwZSBQT1NUCi0oaW5kaWNhdGluZyB0aGF0IGZ1cnRoZXIgZGF0YSBhcmUgcHJlc2VudCBpbiB0aGUgaW5wdXQgc3RyZWFtKSB0aGVuIHRoZQotXGNvZGV7Q29udGVudC1MZW5ndGg6fSBoZWFkZXIgaXMgdXNlZCB0byBzZXQgYSBudW1lcmljIHRlcm1pbmF0b3IgdG8KLXJlYWQgdGhlIHJpZ2h0IGFtb3VudCBvZiBkYXRhIGZyb20gdGhlIGNoYW5uZWwuCi0KLVRoZSBcbWV0aG9ke2hhbmRsZV9yZXF1ZXN0KCl9IG1ldGhvZCBpcyBjYWxsZWQgb25jZSBhbGwgcmVsZXZhbnQgaW5wdXQKLWhhcyBiZWVuIG1hcnNoYWxsZWQsIGFmdGVyIHNldHRpbmcgdGhlIGNoYW5uZWwgdGVybWluYXRvciB0byBcY29kZXtOb25lfQotdG8gZW5zdXJlIHRoYXQgYW55IGV4dHJhbmVvdXMgZGF0YSBzZW50IGJ5IHRoZSB3ZWIgY2xpZW50IGFyZSBpZ25vcmVkLgotCi1cYmVnaW57dmVyYmF0aW19Ci1jbGFzcyBodHRwX3JlcXVlc3RfaGFuZGxlcihhc3luY2hhdC5hc3luY19jaGF0KToKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25uLCBhZGRyLCBzZXNzaW9ucywgbG9nKToKLSAgICAgICAgYXN5bmNoYXQuYXN5bmNfY2hhdC5fX2luaXRfXyhzZWxmLCBjb25uPWNvbm4pCi0gICAgICAgIHNlbGYuYWRkciA9IGFkZHIKLSAgICAgICAgc2VsZi5zZXNzaW9ucyA9IHNlc3Npb25zCi0gICAgICAgIHNlbGYuaWJ1ZmZlciA9IFtdCi0gICAgICAgIHNlbGYub2J1ZmZlciA9ICIiCi0gICAgICAgIHNlbGYuc2V0X3Rlcm1pbmF0b3IoIlxyXG5cclxuIikKLSAgICAgICAgc2VsZi5yZWFkaW5nX2hlYWRlcnMgPSBUcnVlCi0gICAgICAgIHNlbGYuaGFuZGxpbmcgPSBGYWxzZQotICAgICAgICBzZWxmLmNnaV9kYXRhID0gTm9uZQotICAgICAgICBzZWxmLmxvZyA9IGxvZwotCi0gICAgZGVmIGNvbGxlY3RfaW5jb21pbmdfZGF0YShzZWxmLCBkYXRhKToKLSAgICAgICAgIiIiQnVmZmVyIHRoZSBkYXRhIiIiCi0gICAgICAgIHNlbGYuaWJ1ZmZlci5hcHBlbmQoZGF0YSkKLQotICAgIGRlZiBmb3VuZF90ZXJtaW5hdG9yKHNlbGYpOgotICAgICAgICBpZiBzZWxmLnJlYWRpbmdfaGVhZGVyczoKLSAgICAgICAgICAgIHNlbGYucmVhZGluZ19oZWFkZXJzID0gRmFsc2UKLSAgICAgICAgICAgIHNlbGYucGFyc2VfaGVhZGVycygiIi5qb2luKHNlbGYuaWJ1ZmZlcikpCi0gICAgICAgICAgICBzZWxmLmlidWZmZXIgPSBbXQotICAgICAgICAgICAgaWYgc2VsZi5vcC51cHBlcigpID09ICJQT1NUIjoKLSAgICAgICAgICAgICAgICBjbGVuID0gc2VsZi5oZWFkZXJzLmdldGhlYWRlcigiY29udGVudC1sZW5ndGgiKQotICAgICAgICAgICAgICAgIHNlbGYuc2V0X3Rlcm1pbmF0b3IoaW50KGNsZW4pKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLmhhbmRsaW5nID0gVHJ1ZQotICAgICAgICAgICAgICAgIHNlbGYuc2V0X3Rlcm1pbmF0b3IoTm9uZSkKLSAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9yZXF1ZXN0KCkKLSAgICAgICAgZWxpZiBub3Qgc2VsZi5oYW5kbGluZzoKLSAgICAgICAgICAgIHNlbGYuc2V0X3Rlcm1pbmF0b3IoTm9uZSkgIyBicm93c2VycyBzb21ldGltZXMgb3Zlci1zZW5kCi0gICAgICAgICAgICBzZWxmLmNnaV9kYXRhID0gcGFyc2Uoc2VsZi5oZWFkZXJzLCAiIi5qb2luKHNlbGYuaWJ1ZmZlcikpCi0gICAgICAgICAgICBzZWxmLmhhbmRsaW5nID0gVHJ1ZQotICAgICAgICAgICAgc2VsZi5pYnVmZmVyID0gW10KLSAgICAgICAgICAgIHNlbGYuaGFuZGxlX3JlcXVlc3QoKQotXGVuZHt2ZXJiYXRpbX0KLQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJhc3luY29yZS50ZXggYi9Eb2MvbGliL2xpYmFzeW5jb3JlLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1Mjg5Ni4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmFzeW5jb3JlLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle2FzeW5jb3JlfSAtLS0KLSAgICAgICAgIEFzeW5jaHJvbm91cyBzb2NrZXQgaGFuZGxlcn0KLQotXGRlY2xhcmVtb2R1bGV7YnVpbHRpbn17YXN5bmNvcmV9Ci1cbW9kdWxlc3lub3BzaXN7QSBiYXNlIGNsYXNzIGZvciBkZXZlbG9waW5nIGFzeW5jaHJvbm91cyBzb2NrZXQgCi0gICAgICAgICAgICAgICAgaGFuZGxpbmcgc2VydmljZXMufQotXG1vZHVsZWF1dGhvcntTYW0gUnVzaGluZ317cnVzaGluZ0BuaWdodG1hcmUuY29tfQotXHNlY3Rpb25hdXRob3J7Q2hyaXN0b3BoZXIgUGV0cmlsbGl9e3BldHJpbGxpQGFtYmVyLm9yZ30KLVxzZWN0aW9uYXV0aG9ye1N0ZXZlIEhvbGRlbn17c2hvbGRlbkBob2xkZW53ZWIuY29tfQotJSBIZWF2aWx5IGFkYXB0ZWQgZnJvbSBvcmlnaW5hbCBkb2N1bWVudGF0aW9uIGJ5IFNhbSBSdXNoaW5nLgotCi1UaGlzIG1vZHVsZSBwcm92aWRlcyB0aGUgYmFzaWMgaW5mcmFzdHJ1Y3R1cmUgZm9yIHdyaXRpbmcgYXN5bmNocm9ub3VzIAotc29ja2V0IHNlcnZpY2UgY2xpZW50cyBhbmQgc2VydmVycy4KLQotVGhlcmUgYXJlIG9ubHkgdHdvIHdheXMgdG8gaGF2ZSBhIHByb2dyYW0gb24gYSBzaW5nbGUgcHJvY2Vzc29yIGRvIAotYGBtb3JlIHRoYW4gb25lIHRoaW5nIGF0IGEgdGltZS4nJyBNdWx0aS10aHJlYWRlZCBwcm9ncmFtbWluZyBpcyB0aGUgCi1zaW1wbGVzdCBhbmQgbW9zdCBwb3B1bGFyIHdheSB0byBkbyBpdCwgYnV0IHRoZXJlIGlzIGFub3RoZXIgdmVyeSAKLWRpZmZlcmVudCB0ZWNobmlxdWUsIHRoYXQgbGV0cyB5b3UgaGF2ZSBuZWFybHkgYWxsIHRoZSBhZHZhbnRhZ2VzIG9mIAotbXVsdGktdGhyZWFkaW5nLCB3aXRob3V0IGFjdHVhbGx5IHVzaW5nIG11bHRpcGxlIHRocmVhZHMuICBJdCdzIHJlYWxseSAKLW9ubHkgcHJhY3RpY2FsIGlmIHlvdXIgcHJvZ3JhbSBpcyBsYXJnZWx5IEkvTyBib3VuZC4gIElmIHlvdXIgcHJvZ3JhbSAKLWlzIHByb2Nlc3NvciBib3VuZCwgdGhlbiBwcmUtZW1wdGl2ZSBzY2hlZHVsZWQgdGhyZWFkcyBhcmUgcHJvYmFibHkgd2hhdCAKLXlvdSByZWFsbHkgbmVlZC4gTmV0d29yayBzZXJ2ZXJzIGFyZSByYXJlbHkgcHJvY2Vzc29yIGJvdW5kLCBob3dldmVyLgotCi1JZiB5b3VyIG9wZXJhdGluZyBzeXN0ZW0gc3VwcG9ydHMgdGhlIFxjZnVuY3Rpb257c2VsZWN0KCl9IHN5c3RlbSBjYWxsIAotaW4gaXRzIEkvTyBsaWJyYXJ5IChhbmQgbmVhcmx5IGFsbCBkbyksIHRoZW4geW91IGNhbiB1c2UgaXQgdG8ganVnZ2xlIAotbXVsdGlwbGUgY29tbXVuaWNhdGlvbiBjaGFubmVscyBhdCBvbmNlOyBkb2luZyBvdGhlciB3b3JrIHdoaWxlIHlvdXIgCi1JL08gaXMgdGFraW5nIHBsYWNlIGluIHRoZSBgYGJhY2tncm91bmQuJycgIEFsdGhvdWdoIHRoaXMgc3RyYXRlZ3kgY2FuIAotc2VlbSBzdHJhbmdlIGFuZCBjb21wbGV4LCBlc3BlY2lhbGx5IGF0IGZpcnN0LCBpdCBpcyBpbiBtYW55IHdheXMgCi1lYXNpZXIgdG8gdW5kZXJzdGFuZCBhbmQgY29udHJvbCB0aGFuIG11bHRpLXRocmVhZGVkIHByb2dyYW1taW5nLiAgCi1UaGUgXG1vZHVsZXthc3luY29yZX0gbW9kdWxlIHNvbHZlcyBtYW55IG9mIHRoZSBkaWZmaWN1bHQgcHJvYmxlbXMgZm9yIAoteW91LCBtYWtpbmcgdGhlIHRhc2sgb2YgYnVpbGRpbmcgc29waGlzdGljYXRlZCBoaWdoLXBlcmZvcm1hbmNlIAotbmV0d29yayBzZXJ2ZXJzIGFuZCBjbGllbnRzIGEgc25hcC4gRm9yIGBgY29udmVyc2F0aW9uYWwnJyBhcHBsaWNhdGlvbnMKLWFuZCBwcm90b2NvbHMgdGhlIGNvbXBhbmlvbiAgXHJlZm1vZHVsZXthc3luY2hhdH0gbW9kdWxlIGlzIGludmFsdWFibGUuCi0KLVRoZSBiYXNpYyBpZGVhIGJlaGluZCBib3RoIG1vZHVsZXMgaXMgdG8gY3JlYXRlIG9uZSBvciBtb3JlIG5ldHdvcmsKLVxlbXBoe2NoYW5uZWxzfSwgaW5zdGFuY2VzIG9mIGNsYXNzIFxjbGFzc3thc3luY29yZS5kaXNwYXRjaGVyfSBhbmQKLVxjbGFzc3thc3luY2hhdC5hc3luY19jaGF0fS4gQ3JlYXRpbmcgdGhlIGNoYW5uZWxzIGFkZHMgdGhlbSB0byBhIGdsb2JhbAotbWFwLCB1c2VkIGJ5IHRoZSBcZnVuY3Rpb257bG9vcCgpfSBmdW5jdGlvbiBpZiB5b3UgZG8gbm90IHByb3ZpZGUgaXQKLXdpdGggeW91ciBvd24gXHZhcnttYXB9LgotCi1PbmNlIHRoZSBpbml0aWFsIGNoYW5uZWwocykgaXMoYXJlKSBjcmVhdGVkLCBjYWxsaW5nIHRoZSBcZnVuY3Rpb257bG9vcCgpfQotZnVuY3Rpb24gYWN0aXZhdGVzIGNoYW5uZWwgc2VydmljZSwgd2hpY2ggY29udGludWVzIHVudGlsIHRoZSBsYXN0Ci1jaGFubmVsIChpbmNsdWRpbmcgYW55IHRoYXQgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBtYXAgZHVyaW5nIGFzeW5jaHJvbm91cwotc2VydmljZSkgaXMgY2xvc2VkLgotCi1cYmVnaW57ZnVuY2Rlc2N9e2xvb3B9e1xvcHRpb25hbHt0aW1lb3V0XG9wdGlvbmFseywgdXNlX3BvbGxcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICBtYXBcb3B0aW9uYWx7LGNvdW50fX19fX0KLSAgRW50ZXIgYSBwb2xsaW5nIGxvb3AgdGhhdCB0ZXJtaW5hdGVzIGFmdGVyIGNvdW50IHBhc3NlcyBvciBhbGwgb3BlbgotICBjaGFubmVscyBoYXZlIGJlZW4gY2xvc2VkLiAgQWxsIGFyZ3VtZW50cyBhcmUgb3B0aW9uYWwuICBUaGUgXHZhcntjb3VudH0KLSAgcGFyYW1ldGVyIGRlZmF1bHRzIHRvIE5vbmUsIHJlc3VsdGluZyBpbiB0aGUgbG9vcCB0ZXJtaW5hdGluZyBvbmx5Ci0gIHdoZW4gYWxsIGNoYW5uZWxzIGhhdmUgYmVlbiBjbG9zZWQuICBUaGUgXHZhcnt0aW1lb3V0fSBhcmd1bWVudCBzZXRzIHRoZQotICB0aW1lb3V0IHBhcmFtZXRlciBmb3IgdGhlIGFwcHJvcHJpYXRlIFxmdW5jdGlvbntzZWxlY3QoKX0gb3IKLSAgXGZ1bmN0aW9ue3BvbGwoKX0gY2FsbCwgbWVhc3VyZWQgaW4gc2Vjb25kczsgdGhlIGRlZmF1bHQgaXMgMzAgc2Vjb25kcy4KLSAgVGhlIFx2YXJ7dXNlX3BvbGx9IHBhcmFtZXRlciwgaWYgdHJ1ZSwgaW5kaWNhdGVzIHRoYXQgXGZ1bmN0aW9ue3BvbGwoKX0KLSAgc2hvdWxkIGJlIHVzZWQgaW4gcHJlZmVyZW5jZSB0byBcZnVuY3Rpb257c2VsZWN0KCl9ICh0aGUgZGVmYXVsdCBpcwotICBcY29kZXtGYWxzZX0pLiAgCi0KLSAgVGhlIFx2YXJ7bWFwfSBwYXJhbWV0ZXIgaXMgYSBkaWN0aW9uYXJ5IHdob3NlIGl0ZW1zIGFyZQotICB0aGUgY2hhbm5lbHMgdG8gd2F0Y2guICBBcyBjaGFubmVscyBhcmUgY2xvc2VkIHRoZXkgYXJlIGRlbGV0ZWQgZnJvbSB0aGVpcgotICBtYXAuICBJZiBcdmFye21hcH0gaXMgb21pdHRlZCwgYSBnbG9iYWwgbWFwIGlzIHVzZWQuCi0gIENoYW5uZWxzIChpbnN0YW5jZXMgb2YgXGNsYXNze2FzeW5jb3JlLmRpc3BhdGNoZXJ9LCBcY2xhc3N7YXN5bmNoYXQuYXN5bmNfY2hhdH0KLSAgYW5kIHN1YmNsYXNzZXMgdGhlcmVvZikgY2FuIGZyZWVseSBiZSBtaXhlZCBpbiB0aGUgbWFwLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317ZGlzcGF0Y2hlcn17fQotICBUaGUgXGNsYXNze2Rpc3BhdGNoZXJ9IGNsYXNzIGlzIGEgdGhpbiB3cmFwcGVyIGFyb3VuZCBhIGxvdy1sZXZlbCBzb2NrZXQgb2JqZWN0LgotICBUbyBtYWtlIGl0IG1vcmUgdXNlZnVsLCBpdCBoYXMgYSBmZXcgbWV0aG9kcyBmb3IgZXZlbnQtaGFuZGxpbmcgIHdoaWNoIGFyZSBjYWxsZWQKLSAgZnJvbSB0aGUgYXN5bmNocm9ub3VzIGxvb3AuICAKLSAgT3RoZXJ3aXNlLCBpdCBjYW4gYmUgdHJlYXRlZCBhcyBhIG5vcm1hbCBub24tYmxvY2tpbmcgc29ja2V0IG9iamVjdC4KLQotICBUd28gY2xhc3MgYXR0cmlidXRlcyBjYW4gYmUgbW9kaWZpZWQsIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UsCi0gIG9yIHBvc3NpYmx5IGV2ZW4gdG8gY29uc2VydmUgbWVtb3J5LgotCi0gIFxiZWdpbntkYXRhZGVzY317YWNfaW5fYnVmZmVyX3NpemV9Ci0gIFRoZSBhc3luY2hyb25vdXMgaW5wdXQgYnVmZmVyIHNpemUgKGRlZmF1bHQgXGNvZGV7NDA5Nn0pLgotICBcZW5ke2RhdGFkZXNjfQotCi0gIFxiZWdpbntkYXRhZGVzY317YWNfb3V0X2J1ZmZlcl9zaXplfQotICBUaGUgYXN5bmNocm9ub3VzIG91dHB1dCBidWZmZXIgc2l6ZSAoZGVmYXVsdCBcY29kZXs0MDk2fSkuCi0gIFxlbmR7ZGF0YWRlc2N9Ci0KLSAgVGhlIGZpcmluZyBvZiBsb3ctbGV2ZWwgZXZlbnRzIGF0IGNlcnRhaW4gdGltZXMgb3IgaW4gY2VydGFpbiBjb25uZWN0aW9uCi0gIHN0YXRlcyB0ZWxscyB0aGUgYXN5bmNocm9ub3VzIGxvb3AgdGhhdCBjZXJ0YWluIGhpZ2hlci1sZXZlbCBldmVudHMgaGF2ZQotICB0YWtlbiBwbGFjZS4gRm9yIGV4YW1wbGUsIGlmIHdlIGhhdmUgYXNrZWQgZm9yIGEgc29ja2V0IHRvIGNvbm5lY3QgdG8KLSAgYW5vdGhlciBob3N0LCB3ZSBrbm93IHRoYXQgdGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4gbWFkZSB3aGVuIHRoZSBzb2NrZXQKLSAgYmVjb21lcyB3cml0YWJsZSBmb3IgdGhlIGZpcnN0IHRpbWUgKGF0IHRoaXMgcG9pbnQgeW91IGtub3cgdGhhdCB5b3UgbWF5Ci0gIHdyaXRlIHRvIGl0IHdpdGggdGhlIGV4cGVjdGF0aW9uIG9mIHN1Y2Nlc3MpLiBUaGUgaW1wbGllZCBoaWdoZXItbGV2ZWwKLSAgZXZlbnRzIGFyZToKLQotICBcYmVnaW57dGFibGVpaX17bHxsfXtjb2RlfXtFdmVudH17RGVzY3JpcHRpb259Ci0gICAgXGxpbmVpaXtoYW5kbGVfY29ubmVjdCgpfXtJbXBsaWVkIGJ5IHRoZSBmaXJzdCB3cml0ZSBldmVudH0KLSAgICBcbGluZWlpe2hhbmRsZV9jbG9zZSgpfXtJbXBsaWVkIGJ5IGEgcmVhZCBldmVudCB3aXRoIG5vIGRhdGEgYXZhaWxhYmxlfQotICAgIFxsaW5laWl7aGFuZGxlX2FjY2VwdCgpfXtJbXBsaWVkIGJ5IGEgcmVhZCBldmVudCBvbiBhIGxpc3RlbmluZyBzb2NrZXR9Ci0gIFxlbmR7dGFibGVpaX0KLQotICBEdXJpbmcgYXN5bmNocm9ub3VzIHByb2Nlc3NpbmcsIGVhY2ggbWFwcGVkIGNoYW5uZWwncyBcbWV0aG9ke3JlYWRhYmxlKCl9Ci0gIGFuZCBcbWV0aG9ke3dyaXRhYmxlKCl9IG1ldGhvZHMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGNoYW5uZWwncwotICBzb2NrZXQgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIGNoYW5uZWxzIFxjZnVuY3Rpb257c2VsZWN0KCl9ZWQgb3IKLSAgXGNmdW5jdGlvbntwb2xsKCl9ZWQgZm9yIHJlYWQgYW5kIHdyaXRlIGV2ZW50cy4KLQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVRodXMsIHRoZSBzZXQgb2YgY2hhbm5lbCBldmVudHMgaXMgbGFyZ2VyIHRoYW4gdGhlIGJhc2ljIHNvY2tldCBldmVudHMuCi1UaGUgZnVsbCBzZXQgb2YgbWV0aG9kcyB0aGF0IGNhbiBiZSBvdmVycmlkZGVuIGluIHlvdXIgc3ViY2xhc3MgZm9sbG93czoKLQotXGJlZ2lue21ldGhvZGRlc2N9e2hhbmRsZV9yZWFkfXt9Ci0gIENhbGxlZCB3aGVuIHRoZSBhc3luY2hyb25vdXMgbG9vcCBkZXRlY3RzIHRoYXQgYSBcbWV0aG9ke3JlYWQoKX0KLSAgY2FsbCBvbiB0aGUgY2hhbm5lbCdzIHNvY2tldCB3aWxsIHN1Y2NlZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtoYW5kbGVfd3JpdGV9e30KLSAgQ2FsbGVkIHdoZW4gdGhlIGFzeW5jaHJvbm91cyBsb29wIGRldGVjdHMgdGhhdCBhIHdyaXRhYmxlIHNvY2tldAotICBjYW4gYmUgd3JpdHRlbi4gIAotICBPZnRlbiB0aGlzIG1ldGhvZCB3aWxsIGltcGxlbWVudCB0aGUgbmVjZXNzYXJ5IGJ1ZmZlcmluZyBmb3IgCi0gIHBlcmZvcm1hbmNlLiAgRm9yIGV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWRlZiBoYW5kbGVfd3JpdGUoc2VsZik6Ci0gICAgc2VudCA9IHNlbGYuc2VuZChzZWxmLmJ1ZmZlcikKLSAgICBzZWxmLmJ1ZmZlciA9IHNlbGYuYnVmZmVyW3NlbnQ6XQotXGVuZHt2ZXJiYXRpbX0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2hhbmRsZV9leHB0fXt9Ci0gIENhbGxlZCB3aGVuIHRoZXJlIGlzIG91dCBvZiBiYW5kIChPT0IpIGRhdGEgZm9yIGEgc29ja2V0IAotICBjb25uZWN0aW9uLiAgVGhpcyB3aWxsIGFsbW9zdCBuZXZlciBoYXBwZW4sIGFzIE9PQiBpcyAKLSAgdGVudW91c2x5IHN1cHBvcnRlZCBhbmQgcmFyZWx5IHVzZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtoYW5kbGVfY29ubmVjdH17fQotICBDYWxsZWQgd2hlbiB0aGUgYWN0aXZlIG9wZW5lcidzIHNvY2tldCBhY3R1YWxseSBtYWtlcyBhIGNvbm5lY3Rpb24uCi0gIE1pZ2h0IHNlbmQgYSBgYHdlbGNvbWUnJyBiYW5uZXIsIG9yIGluaXRpYXRlIGEgcHJvdG9jb2wKLSAgbmVnb3RpYXRpb24gd2l0aCB0aGUgcmVtb3RlIGVuZHBvaW50LCBmb3IgZXhhbXBsZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2hhbmRsZV9jbG9zZX17fQotICBDYWxsZWQgd2hlbiB0aGUgc29ja2V0IGlzIGNsb3NlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2hhbmRsZV9lcnJvcn17fQotICBDYWxsZWQgd2hlbiBhbiBleGNlcHRpb24gaXMgcmFpc2VkIGFuZCBub3Qgb3RoZXJ3aXNlIGhhbmRsZWQuICBUaGUgZGVmYXVsdAotICB2ZXJzaW9uIHByaW50cyBhIGNvbmRlbnNlZCB0cmFjZWJhY2suCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtoYW5kbGVfYWNjZXB0fXt9Ci0gIENhbGxlZCBvbiBsaXN0ZW5pbmcgY2hhbm5lbHMgKHBhc3NpdmUgb3BlbmVycykgd2hlbiBhICAKLSAgY29ubmVjdGlvbiBjYW4gYmUgZXN0YWJsaXNoZWQgd2l0aCBhIG5ldyByZW1vdGUgZW5kcG9pbnQgdGhhdAotICBoYXMgaXNzdWVkIGEgXG1ldGhvZHtjb25uZWN0KCl9IGNhbGwgZm9yIHRoZSBsb2NhbCBlbmRwb2ludC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3JlYWRhYmxlfXt9Ci0gIENhbGxlZCBlYWNoIHRpbWUgYXJvdW5kIHRoZSBhc3luY2hyb25vdXMgbG9vcCB0byBkZXRlcm1pbmUgd2hldGhlciBhCi0gIGNoYW5uZWwncyBzb2NrZXQgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBsaXN0IG9uIHdoaWNoIHJlYWQgZXZlbnRzIGNhbgotICBvY2N1ci4gIFRoZSBkZWZhdWx0IG1ldGhvZCBzaW1wbHkgcmV0dXJucyBcY29kZXtUcnVlfSwgCi0gIGluZGljYXRpbmcgdGhhdCBieSBkZWZhdWx0LCBhbGwgY2hhbm5lbHMgd2lsbCBiZSBpbnRlcmVzdGVkIGluCi0gIHJlYWQgZXZlbnRzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317d3JpdGFibGV9e30KLSAgQ2FsbGVkIGVhY2ggdGltZSBhcm91bmQgdGhlIGFzeW5jaHJvbm91cyBsb29wIHRvIGRldGVybWluZSB3aGV0aGVyIGEKLSAgY2hhbm5lbCdzIHNvY2tldCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb24gd2hpY2ggd3JpdGUgZXZlbnRzIGNhbgotICBvY2N1ci4gIFRoZSBkZWZhdWx0IG1ldGhvZCBzaW1wbHkgcmV0dXJucyBcY29kZXtUcnVlfSwgCi0gIGluZGljYXRpbmcgdGhhdCBieSBkZWZhdWx0LCBhbGwgY2hhbm5lbHMgd2lsbCBiZSBpbnRlcmVzdGVkIGluCi0gIHdyaXRlIGV2ZW50cy4KLVxlbmR7bWV0aG9kZGVzY30KLQotSW4gYWRkaXRpb24sIGVhY2ggY2hhbm5lbCBkZWxlZ2F0ZXMgb3IgZXh0ZW5kcyBtYW55IG9mIHRoZSBzb2NrZXQgbWV0aG9kcy4KLU1vc3Qgb2YgdGhlc2UgYXJlIG5lYXJseSBpZGVudGljYWwgdG8gdGhlaXIgc29ja2V0IHBhcnRuZXJzLgotCi1cYmVnaW57bWV0aG9kZGVzY317Y3JlYXRlX3NvY2tldH17ZmFtaWx5LCB0eXBlfQotICBUaGlzIGlzIGlkZW50aWNhbCB0byB0aGUgY3JlYXRpb24gb2YgYSBub3JtYWwgc29ja2V0LCBhbmQgCi0gIHdpbGwgdXNlIHRoZSBzYW1lIG9wdGlvbnMgZm9yIGNyZWF0aW9uLiAgUmVmZXIgdG8gdGhlCi0gIFxyZWZtb2R1bGV7c29ja2V0fSBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiBjcmVhdGluZwotICBzb2NrZXRzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Y29ubmVjdH17YWRkcmVzc30KLSAgQXMgd2l0aCB0aGUgbm9ybWFsIHNvY2tldCBvYmplY3QsIFx2YXJ7YWRkcmVzc30gaXMgYSAKLSAgdHVwbGUgd2l0aCB0aGUgZmlyc3QgZWxlbWVudCB0aGUgaG9zdCB0byBjb25uZWN0IHRvLCBhbmQgdGhlIAotICBzZWNvbmQgdGhlIHBvcnQgbnVtYmVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317c2VuZH17ZGF0YX0KLSAgU2VuZCBcdmFye2RhdGF9IHRvIHRoZSByZW1vdGUgZW5kLXBvaW50IG9mIHRoZSBzb2NrZXQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtyZWN2fXtidWZmZXJfc2l6ZX0KLSAgUmVhZCBhdCBtb3N0IFx2YXJ7YnVmZmVyX3NpemV9IGJ5dGVzIGZyb20gdGhlIHNvY2tldCdzIHJlbW90ZSBlbmQtcG9pbnQuCi0gIEFuIGVtcHR5IHN0cmluZyBpbXBsaWVzIHRoYXQgdGhlIGNoYW5uZWwgaGFzIGJlZW4gY2xvc2VkIGZyb20gdGhlIG90aGVyCi0gIGVuZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2xpc3Rlbn17YmFja2xvZ30KLSAgTGlzdGVuIGZvciBjb25uZWN0aW9ucyBtYWRlIHRvIHRoZSBzb2NrZXQuICBUaGUgXHZhcntiYWNrbG9nfQotICBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHF1ZXVlZCBjb25uZWN0aW9ucwotICBhbmQgc2hvdWxkIGJlIGF0IGxlYXN0IDE7IHRoZSBtYXhpbXVtIHZhbHVlIGlzCi0gIHN5c3RlbS1kZXBlbmRlbnQgKHVzdWFsbHkgNSkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtiaW5kfXthZGRyZXNzfQotICBCaW5kIHRoZSBzb2NrZXQgdG8gXHZhcnthZGRyZXNzfS4gIFRoZSBzb2NrZXQgbXVzdCBub3QgYWxyZWFkeSBiZQotICBib3VuZC4gIChUaGUgZm9ybWF0IG9mIFx2YXJ7YWRkcmVzc30gZGVwZW5kcyBvbiB0aGUgYWRkcmVzcyBmYW1pbHkKLSAgLS0tIHNlZSBhYm92ZS4pICBUbyBtYXJrIHRoZSBzb2NrZXQgYXMgcmUtdXNhYmxlIChzZXR0aW5nIHRoZQotICBcY29uc3RhbnR7U09fUkVVU0VBRERSfSBvcHRpb24pLCBjYWxsIHRoZSBcY2xhc3N7ZGlzcGF0Y2hlcn0KLSAgb2JqZWN0J3MgXG1ldGhvZHtzZXRfcmV1c2VfYWRkcigpfSBtZXRob2QuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXthY2NlcHR9e30KLSAgQWNjZXB0IGEgY29ubmVjdGlvbi4gIFRoZSBzb2NrZXQgbXVzdCBiZSBib3VuZCB0byBhbiBhZGRyZXNzCi0gIGFuZCBsaXN0ZW5pbmcgZm9yIGNvbm5lY3Rpb25zLiAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIHBhaXIKLSAgXGNvZGV7KFx2YXJ7Y29ubn0sIFx2YXJ7YWRkcmVzc30pfSB3aGVyZSBcdmFye2Nvbm59IGlzIGEKLSAgXGVtcGh7bmV3fSBzb2NrZXQgb2JqZWN0IHVzYWJsZSB0byBzZW5kIGFuZCByZWNlaXZlIGRhdGEgb24KLSAgdGhlIGNvbm5lY3Rpb24sIGFuZCBcdmFye2FkZHJlc3N9IGlzIHRoZSBhZGRyZXNzIGJvdW5kIHRvIHRoZQotICBzb2NrZXQgb24gdGhlIG90aGVyIGVuZCBvZiB0aGUgY29ubmVjdGlvbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2Nsb3NlfXt9Ci0gIENsb3NlIHRoZSBzb2NrZXQuICBBbGwgZnV0dXJlIG9wZXJhdGlvbnMgb24gdGhlIHNvY2tldCBvYmplY3QKLSAgd2lsbCBmYWlsLiAgVGhlIHJlbW90ZSBlbmQtcG9pbnQgd2lsbCByZWNlaXZlIG5vIG1vcmUgZGF0YSAoYWZ0ZXIKLSAgcXVldWVkIGRhdGEgaXMgZmx1c2hlZCkuICBTb2NrZXRzIGFyZSBhdXRvbWF0aWNhbGx5IGNsb3NlZAotICB3aGVuIHRoZXkgYXJlIGdhcmJhZ2UtY29sbGVjdGVkLgotXGVuZHttZXRob2RkZXNjfQotCi0KLVxzdWJzZWN0aW9ue2FzeW5jb3JlIEV4YW1wbGUgYmFzaWMgSFRUUCBjbGllbnQgXGxhYmVse2FzeW5jb3JlLWV4YW1wbGV9fQotCi1IZXJlIGlzIGEgdmVyeSBiYXNpYyBIVFRQIGNsaWVudCB0aGF0IHVzZXMgdGhlIFxjbGFzc3tkaXNwYXRjaGVyfQotY2xhc3MgdG8gaW1wbGVtZW50IGl0cyBzb2NrZXQgaGFuZGxpbmc6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCBhc3luY29yZSwgc29ja2V0Ci0KLWNsYXNzIGh0dHBfY2xpZW50KGFzeW5jb3JlLmRpc3BhdGNoZXIpOgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3QsIHBhdGgpOgotICAgICAgICBhc3luY29yZS5kaXNwYXRjaGVyLl9faW5pdF9fKHNlbGYpCi0gICAgICAgIHNlbGYuY3JlYXRlX3NvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQotICAgICAgICBzZWxmLmNvbm5lY3QoIChob3N0LCA4MCkgKQotICAgICAgICBzZWxmLmJ1ZmZlciA9ICdHRVQgJXMgSFRUUC8xLjBcclxuXHJcbicgJSBwYXRoCi0KLSAgICBkZWYgaGFuZGxlX2Nvbm5lY3Qoc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIGRlZiBoYW5kbGVfY2xvc2Uoc2VsZik6Ci0gICAgICAgIHNlbGYuY2xvc2UoKQotCi0gICAgZGVmIGhhbmRsZV9yZWFkKHNlbGYpOgotICAgICAgICBwcmludCBzZWxmLnJlY3YoODE5MikKLQotICAgIGRlZiB3cml0YWJsZShzZWxmKToKLSAgICAgICAgcmV0dXJuIChsZW4oc2VsZi5idWZmZXIpID4gMCkKLQotICAgIGRlZiBoYW5kbGVfd3JpdGUoc2VsZik6Ci0gICAgICAgIHNlbnQgPSBzZWxmLnNlbmQoc2VsZi5idWZmZXIpCi0gICAgICAgIHNlbGYuYnVmZmVyID0gc2VsZi5idWZmZXJbc2VudDpdCi0KLWMgPSBodHRwX2NsaWVudCgnd3d3LnB5dGhvbi5vcmcnLCAnLycpCi0KLWFzeW5jb3JlLmxvb3AoKQotXGVuZHt2ZXJiYXRpbX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliYXRleGl0LnRleCBiL0RvYy9saWIvbGliYXRleGl0LnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRmMWQ0OS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmF0ZXhpdC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXthdGV4aXR9IC0tLQotICAgICAgICAgRXhpdCBoYW5kbGVyc30KLQotXGRlY2xhcmVtb2R1bGV7YnVpbHRpbn17YXRleGl0fQotXG1vZHVsZWF1dGhvcntTa2lwIE1vbnRhbmFyb317c2tpcEBtb2phbS5jb219Ci1cc2VjdGlvbmF1dGhvcntTa2lwIE1vbnRhbmFyb317c2tpcEBtb2phbS5jb219Ci1cbW9kdWxlc3lub3BzaXN7UmVnaXN0ZXIgYW5kIGV4ZWN1dGUgY2xlYW51cCBmdW5jdGlvbnMufQotCi1cdmVyc2lvbmFkZGVkezIuMH0KLQotCi1UaGUgXG1vZHVsZXthdGV4aXR9IG1vZHVsZSBkZWZpbmVzIGZ1bmN0aW9ucyB0byByZWdpc3RlciBhbmQKLXVucmVnaXN0ZXIgY2xlYW51cCBmdW5jdGlvbnMuICBGdW5jdGlvbnMgdGh1cyByZWdpc3RlcmVkIGFyZQotYXV0b21hdGljYWxseSBleGVjdXRlZCB1cG9uIG5vcm1hbCBpbnRlcnByZXRlciB0ZXJtaW5hdGlvbi4KLQotTm90ZTogdGhlIGZ1bmN0aW9ucyByZWdpc3RlcmVkIHZpYSB0aGlzIG1vZHVsZSBhcmUgbm90IGNhbGxlZCB3aGVuCi10aGUgcHJvZ3JhbSBpcyBraWxsZWQgYnkgYSBzaWduYWwsIHdoZW4gYSBQeXRob24gZmF0YWwgaW50ZXJuYWwKLWVycm9yIGlzIGRldGVjdGVkLCBvciB3aGVuIFxmdW5jdGlvbntvcy5fZXhpdCgpfSBpcyBjYWxsZWQuCi0KLVxiZWdpbntmdW5jZGVzY317cmVnaXN0ZXJ9e2Z1bmNcb3B0aW9uYWx7LCAqYXJnc1xvcHRpb25hbHssICoqa2FyZ3N9fX0KLVJlZ2lzdGVyIFx2YXJ7ZnVuY30gYXMgYSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBhdCB0ZXJtaW5hdGlvbi4gIEFueQotb3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgYXJlIHRvIGJlIHBhc3NlZCB0byBcdmFye2Z1bmN9IG11c3QgYmUgcGFzc2VkCi1hcyBhcmd1bWVudHMgdG8gXGZ1bmN0aW9ue3JlZ2lzdGVyKCl9LgotCi1BdCBub3JtYWwgcHJvZ3JhbSB0ZXJtaW5hdGlvbiAoZm9yIGluc3RhbmNlLCBpZgotXGZ1bmN0aW9ue3N5cy5leGl0KCl9IGlzIGNhbGxlZCBvciB0aGUgbWFpbiBtb2R1bGUncyBleGVjdXRpb24KLWNvbXBsZXRlcyksIGFsbCBmdW5jdGlvbnMgcmVnaXN0ZXJlZCBhcmUgY2FsbGVkIGluIGxhc3QgaW4sIGZpcnN0IG91dAotb3JkZXIuICBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IGxvd2VyIGxldmVsIG1vZHVsZXMgd2lsbCBub3JtYWxseSBiZQotaW1wb3J0ZWQgYmVmb3JlIGhpZ2hlciBsZXZlbCBtb2R1bGVzIGFuZCB0aHVzIG11c3QgYmUgY2xlYW5lZCB1cAotbGF0ZXIuCi0KLUlmIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQgZHVyaW5nIGV4ZWN1dGlvbiBvZiB0aGUgZXhpdCBoYW5kbGVycywgYQotdHJhY2ViYWNrIGlzIHByaW50ZWQgKHVubGVzcyBcZXhjZXB0aW9ue1N5c3RlbUV4aXR9IGlzIHJhaXNlZCkgYW5kIHRoZQotZXhjZXB0aW9uIGluZm9ybWF0aW9uIGlzIHNhdmVkLiAgQWZ0ZXIgYWxsIGV4aXQgaGFuZGxlcnMgaGF2ZSBoYWQgYQotY2hhbmNlIHRvIHJ1biB0aGUgbGFzdCBleGNlcHRpb24gdG8gYmUgcmFpc2VkIGlzIHJlLXJhaXNlZC4KLQotXHZlcnNpb25jaGFuZ2VkW1RoaXMgZnVuY3Rpb24gbm93IHJldHVybnMgXHZhcntmdW5jfSB3aGljaCBtYWtlcyBpdAotICAgICAgICAgICAgICAgIHBvc3NpYmxlIHRvIHVzZSBpdCBhcyBhIGRlY29yYXRvciB3aXRob3V0IGJpbmRpbmcgdGhlCi0gICAgICAgICAgICAgICAgb3JpZ2luYWwgbmFtZSB0byBcY29kZXtOb25lfV17Mi42fQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt1bnJlZ2lzdGVyfXtmdW5jfQotUmVtb3ZlIGEgZnVuY3Rpb24gXHZhcntmdW5jfSBmcm9tIHRoZSBsaXN0IG9mIGZ1bmN0aW9ucyB0byBiZSBydW4gYXQKLWludGVycHJldGVyLXNodXRkb3duLiAgQWZ0ZXIgY2FsbGluZyBcZnVuY3Rpb257dW5yZWdpc3RlcigpfSwKLVx2YXJ7ZnVuY30gaXMgZ3VhcmFudGVlZCBub3QgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGludGVycHJldGVyCi1zaHV0cyBkb3duLgotCi1cdmVyc2lvbmFkZGVkezMuMH0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWVtb2R1bGV7cmVhZGxpbmV9e1VzZWZ1bCBleGFtcGxlIG9mIFxtb2R1bGV7YXRleGl0fSB0byByZWFkIGFuZAotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZSBccmVmbW9kdWxle3JlYWRsaW5lfSBoaXN0b3J5IGZpbGVzLn0KLVxlbmR7c2VlYWxzb30KLQotCi1cc3Vic2VjdGlvbntcbW9kdWxle2F0ZXhpdH0gRXhhbXBsZSBcbGFiZWx7YXRleGl0LWV4YW1wbGV9fQotCi1UaGUgZm9sbG93aW5nIHNpbXBsZSBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgYSBtb2R1bGUgY2FuIGluaXRpYWxpemUKLWEgY291bnRlciBmcm9tIGEgZmlsZSB3aGVuIGl0IGlzIGltcG9ydGVkIGFuZCBzYXZlIHRoZSBjb3VudGVyJ3MKLXVwZGF0ZWQgdmFsdWUgYXV0b21hdGljYWxseSB3aGVuIHRoZSBwcm9ncmFtIHRlcm1pbmF0ZXMgd2l0aG91dAotcmVseWluZyBvbiB0aGUgYXBwbGljYXRpb24gbWFraW5nIGFuIGV4cGxpY2l0IGNhbGwgaW50byB0aGlzIG1vZHVsZSBhdAotdGVybWluYXRpb24uCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLXRyeToKLSAgICBfY291bnQgPSBpbnQob3BlbigiL3RtcC9jb3VudGVyIikucmVhZCgpKQotZXhjZXB0IElPRXJyb3I6Ci0gICAgX2NvdW50ID0gMAotCi1kZWYgaW5jcmNvdW50ZXIobik6Ci0gICAgZ2xvYmFsIF9jb3VudAotICAgIF9jb3VudCA9IF9jb3VudCArIG4KLQotZGVmIHNhdmVjb3VudGVyKCk6Ci0gICAgb3BlbigiL3RtcC9jb3VudGVyIiwgInciKS53cml0ZSgiJWQiICUgX2NvdW50KQotCi1pbXBvcnQgYXRleGl0Ci1hdGV4aXQucmVnaXN0ZXIoc2F2ZWNvdW50ZXIpCi1cZW5ke3ZlcmJhdGltfQotCi1Qb3NpdGlvbmFsIGFuZCBrZXl3b3JkIGFyZ3VtZW50cyBtYXkgYWxzbyBiZSBwYXNzZWQgdG8KLVxmdW5jdGlvbntyZWdpc3RlcigpfSB0byBiZSBwYXNzZWQgYWxvbmcgdG8gdGhlIHJlZ2lzdGVyZWQgZnVuY3Rpb24KLXdoZW4gaXQgaXMgY2FsbGVkOgotCi1cYmVnaW57dmVyYmF0aW19Ci1kZWYgZ29vZGJ5ZShuYW1lLCBhZGplY3RpdmUpOgotICAgIHByaW50ICdHb29kYnllLCAlcywgaXQgd2FzICVzIHRvIG1lZXQgeW91LicgJSAobmFtZSwgYWRqZWN0aXZlKQotCi1pbXBvcnQgYXRleGl0Ci1hdGV4aXQucmVnaXN0ZXIoZ29vZGJ5ZSwgJ0Rvbm55JywgJ25pY2UnKQotCi0jIG9yOgotYXRleGl0LnJlZ2lzdGVyKGdvb2RieWUsIGFkamVjdGl2ZT0nbmljZScsIG5hbWU9J0Rvbm55JykKLVxlbmR7dmVyYmF0aW19Ci0KLVVzYWdlIGFzIGEgZGVjb3JhdG9yOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgYXRleGl0Ci0KLUBhdGV4aXQucmVnaXN0ZXIKLWRlZiBnb29kYnllKCk6Ci0gICAgcHJpbnQgIllvdSBhcmUgbm93IGxlYXZpbmcgdGhlIFB5dGhvbiBzZWN0b3IuIgotXGVuZHt2ZXJiYXRpbX0KLQotVGhpcyBvYnZpb3VzbHkgb25seSB3b3JrcyB3aXRoIGZ1bmN0aW9ucyB0aGF0IGRvbid0IHRha2UgYXJndW1lbnRzLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJhdWRpb29wLnRleCBiL0RvYy9saWIvbGliYXVkaW9vcC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MjdlNzYuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJhdWRpb29wLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle2F1ZGlvb3B9IC0tLQotICAgICAgICAgTWFuaXB1bGF0ZSByYXcgYXVkaW8gZGF0YX0KLQotXGRlY2xhcmVtb2R1bGV7YnVpbHRpbn17YXVkaW9vcH0KLVxtb2R1bGVzeW5vcHNpc3tNYW5pcHVsYXRlIHJhdyBhdWRpbyBkYXRhLn0KLQotCi1UaGUgXG1vZHVsZXthdWRpb29wfSBtb2R1bGUgY29udGFpbnMgc29tZSB1c2VmdWwgb3BlcmF0aW9ucyBvbiBzb3VuZAotZnJhZ21lbnRzLiAgSXQgb3BlcmF0ZXMgb24gc291bmQgZnJhZ21lbnRzIGNvbnNpc3Rpbmcgb2Ygc2lnbmVkCi1pbnRlZ2VyIHNhbXBsZXMgOCwgMTYgb3IgMzIgYml0cyB3aWRlLCBzdG9yZWQgaW4gUHl0aG9uIHN0cmluZ3MuCi1BbGwgc2NhbGFyIGl0ZW1zIGFyZSBpbnRlZ2VycywgdW5sZXNzIHNwZWNpZmllZCBvdGhlcndpc2UuCi0KLSUgVGhpcyBwYXJhIGlzIG1vc3RseSBoZXJlIHRvIHByb3ZpZGUgYW4gZXhjdXNlIGZvciB0aGUgaW5kZXggZW50cmllcy4uLgotVGhpcyBtb2R1bGUgcHJvdmlkZXMgc3VwcG9ydCBmb3IgYS1MQVcsIHUtTEFXIGFuZCBJbnRlbC9EVkkgQURQQ00gZW5jb2RpbmdzLgotXGluZGV4e0ludGVsL0RWSSBBRFBDTX0KLVxpbmRleHtBRFBDTSwgSW50ZWwvRFZJfQotXGluZGV4e2EtTEFXfQotXGluZGV4e3UtTEFXfQotCi1BIGZldyBvZiB0aGUgbW9yZSBjb21wbGljYXRlZCBvcGVyYXRpb25zIG9ubHkgdGFrZSAxNi1iaXQgc2FtcGxlcywKLW90aGVyd2lzZSB0aGUgc2FtcGxlIHNpemUgKGluIGJ5dGVzKSBpcyBhbHdheXMgYSBwYXJhbWV0ZXIgb2YgdGhlCi1vcGVyYXRpb24uCi0KLVRoZSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zOgotCi1cYmVnaW57ZXhjZGVzY317ZXJyb3J9Ci1UaGlzIGV4Y2VwdGlvbiBpcyByYWlzZWQgb24gYWxsIGVycm9ycywgc3VjaCBhcyB1bmtub3duIG51bWJlciBvZiBieXRlcwotcGVyIHNhbXBsZSwgZXRjLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2FkZH17ZnJhZ21lbnQxLCBmcmFnbWVudDIsIHdpZHRofQotUmV0dXJuIGEgZnJhZ21lbnQgd2hpY2ggaXMgdGhlIGFkZGl0aW9uIG9mIHRoZSB0d28gc2FtcGxlcyBwYXNzZWQgYXMKLXBhcmFtZXRlcnMuICBcdmFye3dpZHRofSBpcyB0aGUgc2FtcGxlIHdpZHRoIGluIGJ5dGVzLCBlaXRoZXIKLVxjb2RlezF9LCBcY29kZXsyfSBvciBcY29kZXs0fS4gIEJvdGggZnJhZ21lbnRzIHNob3VsZCBoYXZlIHRoZSBzYW1lCi1sZW5ndGguCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2FkcGNtMmxpbn17YWRwY21mcmFnbWVudCwgd2lkdGgsIHN0YXRlfQotRGVjb2RlIGFuIEludGVsL0RWSSBBRFBDTSBjb2RlZCBmcmFnbWVudCB0byBhIGxpbmVhciBmcmFnbWVudC4gIFNlZQotdGhlIGRlc2NyaXB0aW9uIG9mIFxmdW5jdGlvbntsaW4yYWRwY20oKX0gZm9yIGRldGFpbHMgb24gQURQQ00gY29kaW5nLgotUmV0dXJuIGEgdHVwbGUgXGNvZGV7KFx2YXJ7c2FtcGxlfSwgXHZhcntuZXdzdGF0ZX0pfSB3aGVyZSB0aGUgc2FtcGxlCi1oYXMgdGhlIHdpZHRoIHNwZWNpZmllZCBpbiBcdmFye3dpZHRofS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317YWxhdzJsaW59e2ZyYWdtZW50LCB3aWR0aH0KLUNvbnZlcnQgc291bmQgZnJhZ21lbnRzIGluIGEtTEFXIGVuY29kaW5nIHRvIGxpbmVhcmx5IGVuY29kZWQgc291bmQKLWZyYWdtZW50cy4gIGEtTEFXIGVuY29kaW5nIGFsd2F5cyB1c2VzIDggYml0cyBzYW1wbGVzLCBzbyBcdmFye3dpZHRofQotcmVmZXJzIG9ubHkgdG8gdGhlIHNhbXBsZSB3aWR0aCBvZiB0aGUgb3V0cHV0IGZyYWdtZW50IGhlcmUuCi1cdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317YXZnfXtmcmFnbWVudCwgd2lkdGh9Ci1SZXR1cm4gdGhlIGF2ZXJhZ2Ugb3ZlciBhbGwgc2FtcGxlcyBpbiB0aGUgZnJhZ21lbnQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2F2Z3BwfXtmcmFnbWVudCwgd2lkdGh9Ci1SZXR1cm4gdGhlIGF2ZXJhZ2UgcGVhay1wZWFrIHZhbHVlIG92ZXIgYWxsIHNhbXBsZXMgaW4gdGhlIGZyYWdtZW50LgotTm8gZmlsdGVyaW5nIGlzIGRvbmUsIHNvIHRoZSB1c2VmdWxuZXNzIG9mIHRoaXMgcm91dGluZSBpcwotcXVlc3Rpb25hYmxlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtiaWFzfXtmcmFnbWVudCwgd2lkdGgsIGJpYXN9Ci1SZXR1cm4gYSBmcmFnbWVudCB0aGF0IGlzIHRoZSBvcmlnaW5hbCBmcmFnbWVudCB3aXRoIGEgYmlhcyBhZGRlZCB0bwotZWFjaCBzYW1wbGUuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2Nyb3NzfXtmcmFnbWVudCwgd2lkdGh9Ci1SZXR1cm4gdGhlIG51bWJlciBvZiB6ZXJvIGNyb3NzaW5ncyBpbiB0aGUgZnJhZ21lbnQgcGFzc2VkIGFzIGFuCi1hcmd1bWVudC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZmluZGZhY3Rvcn17ZnJhZ21lbnQsIHJlZmVyZW5jZX0KLVJldHVybiBhIGZhY3RvciBcdmFye0Z9IHN1Y2ggdGhhdAotXGNvZGV7cm1zKGFkZChcdmFye2ZyYWdtZW50fSwgbXVsKFx2YXJ7cmVmZXJlbmNlfSwgLVx2YXJ7Rn0pKSl9IGlzCi1taW5pbWFsLCBpLmUuLCByZXR1cm4gdGhlIGZhY3RvciB3aXRoIHdoaWNoIHlvdSBzaG91bGQgbXVsdGlwbHkKLVx2YXJ7cmVmZXJlbmNlfSB0byBtYWtlIGl0IG1hdGNoIGFzIHdlbGwgYXMgcG9zc2libGUgdG8KLVx2YXJ7ZnJhZ21lbnR9LiAgVGhlIGZyYWdtZW50cyBzaG91bGQgYm90aCBjb250YWluIDItYnl0ZSBzYW1wbGVzLgotCi1UaGUgdGltZSB0YWtlbiBieSB0aGlzIHJvdXRpbmUgaXMgcHJvcG9ydGlvbmFsIHRvCi1cY29kZXtsZW4oXHZhcntmcmFnbWVudH0pfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZmluZGZpdH17ZnJhZ21lbnQsIHJlZmVyZW5jZX0KLVRyeSB0byBtYXRjaCBcdmFye3JlZmVyZW5jZX0gYXMgd2VsbCBhcyBwb3NzaWJsZSB0byBhIHBvcnRpb24gb2YKLVx2YXJ7ZnJhZ21lbnR9ICh3aGljaCBzaG91bGQgYmUgdGhlIGxvbmdlciBmcmFnbWVudCkuICBUaGlzIGlzCi0oY29uY2VwdHVhbGx5KSBkb25lIGJ5IHRha2luZyBzbGljZXMgb3V0IG9mIFx2YXJ7ZnJhZ21lbnR9LCB1c2luZwotXGZ1bmN0aW9ue2ZpbmRmYWN0b3IoKX0gdG8gY29tcHV0ZSB0aGUgYmVzdCBtYXRjaCwgYW5kIG1pbmltaXppbmcgdGhlCi1yZXN1bHQuICBUaGUgZnJhZ21lbnRzIHNob3VsZCBib3RoIGNvbnRhaW4gMi1ieXRlIHNhbXBsZXMuICBSZXR1cm4gYQotdHVwbGUgXGNvZGV7KFx2YXJ7b2Zmc2V0fSwgXHZhcntmYWN0b3J9KX0gd2hlcmUgXHZhcntvZmZzZXR9IGlzIHRoZQotKGludGVnZXIpIG9mZnNldCBpbnRvIFx2YXJ7ZnJhZ21lbnR9IHdoZXJlIHRoZSBvcHRpbWFsIG1hdGNoIHN0YXJ0ZWQKLWFuZCBcdmFye2ZhY3Rvcn0gaXMgdGhlIChmbG9hdGluZy1wb2ludCkgZmFjdG9yIGFzIHBlcgotXGZ1bmN0aW9ue2ZpbmRmYWN0b3IoKX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2ZpbmRtYXh9e2ZyYWdtZW50LCBsZW5ndGh9Ci1TZWFyY2ggXHZhcntmcmFnbWVudH0gZm9yIGEgc2xpY2Ugb2YgbGVuZ3RoIFx2YXJ7bGVuZ3RofSBzYW1wbGVzIChub3QKLWJ5dGVzISlcIHdpdGggbWF4aW11bSBlbmVyZ3ksIGkuZS4sIHJldHVybiBcdmFye2l9IGZvciB3aGljaAotXGNvZGV7cm1zKGZyYWdtZW50W2kqMjooaStsZW5ndGgpKjJdKX0gaXMgbWF4aW1hbC4gIFRoZSBmcmFnbWVudHMKLXNob3VsZCBib3RoIGNvbnRhaW4gMi1ieXRlIHNhbXBsZXMuCi0KLVRoZSByb3V0aW5lIHRha2VzIHRpbWUgcHJvcG9ydGlvbmFsIHRvIFxjb2Rle2xlbihcdmFye2ZyYWdtZW50fSl9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRzYW1wbGV9e2ZyYWdtZW50LCB3aWR0aCwgaW5kZXh9Ci1SZXR1cm4gdGhlIHZhbHVlIG9mIHNhbXBsZSBcdmFye2luZGV4fSBmcm9tIHRoZSBmcmFnbWVudC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bGluMmFkcGNtfXtmcmFnbWVudCwgd2lkdGgsIHN0YXRlfQotQ29udmVydCBzYW1wbGVzIHRvIDQgYml0IEludGVsL0RWSSBBRFBDTSBlbmNvZGluZy4gIEFEUENNIGNvZGluZyBpcyBhbgotYWRhcHRpdmUgY29kaW5nIHNjaGVtZSwgd2hlcmVieSBlYWNoIDQgYml0IG51bWJlciBpcyB0aGUgZGlmZmVyZW5jZQotYmV0d2VlbiBvbmUgc2FtcGxlIGFuZCB0aGUgbmV4dCwgZGl2aWRlZCBieSBhICh2YXJ5aW5nKSBzdGVwLiAgVGhlCi1JbnRlbC9EVkkgQURQQ00gYWxnb3JpdGhtIGhhcyBiZWVuIHNlbGVjdGVkIGZvciB1c2UgYnkgdGhlIElNQSwgc28gaXQKLW1heSB3ZWxsIGJlY29tZSBhIHN0YW5kYXJkLgotCi1cdmFye3N0YXRlfSBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIHRoZSBjb2Rlci4gIFRoZSBjb2RlcgotcmV0dXJucyBhIHR1cGxlIFxjb2RleyhcdmFye2FkcGNtZnJhZ30sIFx2YXJ7bmV3c3RhdGV9KX0sIGFuZCB0aGUKLVx2YXJ7bmV3c3RhdGV9IHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlIG5leHQgY2FsbCBvZgotXGZ1bmN0aW9ue2xpbjJhZHBjbSgpfS4gIEluIHRoZSBpbml0aWFsIGNhbGwsIFxjb2Rle05vbmV9IGNhbiBiZQotcGFzc2VkIGFzIHRoZSBzdGF0ZS4gIFx2YXJ7YWRwY21mcmFnfSBpcyB0aGUgQURQQ00gY29kZWQgZnJhZ21lbnQKLXBhY2tlZCAyIDQtYml0IHZhbHVlcyBwZXIgYnl0ZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bGluMmFsYXd9e2ZyYWdtZW50LCB3aWR0aH0KLUNvbnZlcnQgc2FtcGxlcyBpbiB0aGUgYXVkaW8gZnJhZ21lbnQgdG8gYS1MQVcgZW5jb2RpbmcgYW5kIHJldHVybgotdGhpcyBhcyBhIFB5dGhvbiBzdHJpbmcuICBhLUxBVyBpcyBhbiBhdWRpbyBlbmNvZGluZyBmb3JtYXQgd2hlcmVieQoteW91IGdldCBhIGR5bmFtaWMgcmFuZ2Ugb2YgYWJvdXQgMTMgYml0cyB1c2luZyBvbmx5IDggYml0IHNhbXBsZXMuICBJdAotaXMgdXNlZCBieSB0aGUgU3VuIGF1ZGlvIGhhcmR3YXJlLCBhbW9uZyBvdGhlcnMuCi1cdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bGluMmxpbn17ZnJhZ21lbnQsIHdpZHRoLCBuZXd3aWR0aH0KLUNvbnZlcnQgc2FtcGxlcyBiZXR3ZWVuIDEtLCAyLSBhbmQgNC1ieXRlIGZvcm1hdHMuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2xpbjJ1bGF3fXtmcmFnbWVudCwgd2lkdGh9Ci1Db252ZXJ0IHNhbXBsZXMgaW4gdGhlIGF1ZGlvIGZyYWdtZW50IHRvIHUtTEFXIGVuY29kaW5nIGFuZCByZXR1cm4KLXRoaXMgYXMgYSBQeXRob24gc3RyaW5nLiAgdS1MQVcgaXMgYW4gYXVkaW8gZW5jb2RpbmcgZm9ybWF0IHdoZXJlYnkKLXlvdSBnZXQgYSBkeW5hbWljIHJhbmdlIG9mIGFib3V0IDE0IGJpdHMgdXNpbmcgb25seSA4IGJpdCBzYW1wbGVzLiAgSXQKLWlzIHVzZWQgYnkgdGhlIFN1biBhdWRpbyBoYXJkd2FyZSwgYW1vbmcgb3RoZXJzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXttaW5tYXh9e2ZyYWdtZW50LCB3aWR0aH0KLVJldHVybiBhIHR1cGxlIGNvbnNpc3Rpbmcgb2YgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIG9mIGFsbAotc2FtcGxlcyBpbiB0aGUgc291bmQgZnJhZ21lbnQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e21heH17ZnJhZ21lbnQsIHdpZHRofQotUmV0dXJuIHRoZSBtYXhpbXVtIG9mIHRoZSBcZW1waHthYnNvbHV0ZSB2YWx1ZX0gb2YgYWxsIHNhbXBsZXMgaW4gYQotZnJhZ21lbnQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e21heHBwfXtmcmFnbWVudCwgd2lkdGh9Ci1SZXR1cm4gdGhlIG1heGltdW0gcGVhay1wZWFrIHZhbHVlIGluIHRoZSBzb3VuZCBmcmFnbWVudC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bXVsfXtmcmFnbWVudCwgd2lkdGgsIGZhY3Rvcn0KLVJldHVybiBhIGZyYWdtZW50IHRoYXQgaGFzIGFsbCBzYW1wbGVzIGluIHRoZSBvcmlnaW5hbCBmcmFnbWVudAotbXVsdGlwbGllZCBieSB0aGUgZmxvYXRpbmctcG9pbnQgdmFsdWUgXHZhcntmYWN0b3J9LiAgT3ZlcmZsb3cgaXMKLXNpbGVudGx5IGlnbm9yZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3JhdGVjdn17ZnJhZ21lbnQsIHdpZHRoLCBuY2hhbm5lbHMsIGlucmF0ZSwgb3V0cmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVxvcHRpb25hbHssIHdlaWdodEFcb3B0aW9uYWx7LCB3ZWlnaHRCfX19Ci1Db252ZXJ0IHRoZSBmcmFtZSByYXRlIG9mIHRoZSBpbnB1dCBmcmFnbWVudC4KLQotXHZhcntzdGF0ZX0gaXMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiB0aGUgY29udmVydGVyLiAgVGhlCi1jb252ZXJ0ZXIgcmV0dXJucyBhIHR1cGxlIFxjb2RleyhcdmFye25ld2ZyYWdtZW50fSwgXHZhcntuZXdzdGF0ZX0pfSwKLWFuZCBcdmFye25ld3N0YXRlfSBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSBuZXh0IGNhbGwgb2YKLVxmdW5jdGlvbntyYXRlY3YoKX0uICBUaGUgaW5pdGlhbCBjYWxsIHNob3VsZCBwYXNzIFxjb2Rle05vbmV9Ci1hcyB0aGUgc3RhdGUuCi0KLVRoZSBcdmFye3dlaWdodEF9IGFuZCBcdmFye3dlaWdodEJ9IGFyZ3VtZW50cyBhcmUgcGFyYW1ldGVycyBmb3IgYQotc2ltcGxlIGRpZ2l0YWwgZmlsdGVyIGFuZCBkZWZhdWx0IHRvIFxjb2RlezF9IGFuZCBcY29kZXswfSByZXNwZWN0aXZlbHkuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3JldmVyc2V9e2ZyYWdtZW50LCB3aWR0aH0KLVJldmVyc2UgdGhlIHNhbXBsZXMgaW4gYSBmcmFnbWVudCBhbmQgcmV0dXJucyB0aGUgbW9kaWZpZWQgZnJhZ21lbnQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3Jtc317ZnJhZ21lbnQsIHdpZHRofQotUmV0dXJuIHRoZSByb290LW1lYW4tc3F1YXJlIG9mIHRoZSBmcmFnbWVudCwgaS5lLgotXGJlZ2lue2Rpc3BsYXltYXRofQotXGNhdGNvZGVgXz04Ci1cc3FydHtcZnJhY3tcc3Vte3tTX3tpfX1eezJ9fX17bn19Ci1cZW5ke2Rpc3BsYXltYXRofQotVGhpcyBpcyBhIG1lYXN1cmUgb2YgdGhlIHBvd2VyIGluIGFuIGF1ZGlvIHNpZ25hbC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dG9tb25vfXtmcmFnbWVudCwgd2lkdGgsIGxmYWN0b3IsIHJmYWN0b3J9IAotQ29udmVydCBhIHN0ZXJlbyBmcmFnbWVudCB0byBhIG1vbm8gZnJhZ21lbnQuICBUaGUgbGVmdCBjaGFubmVsIGlzCi1tdWx0aXBsaWVkIGJ5IFx2YXJ7bGZhY3Rvcn0gYW5kIHRoZSByaWdodCBjaGFubmVsIGJ5IFx2YXJ7cmZhY3Rvcn0KLWJlZm9yZSBhZGRpbmcgdGhlIHR3byBjaGFubmVscyB0byBnaXZlIGEgbW9ubyBzaWduYWwuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3Rvc3RlcmVvfXtmcmFnbWVudCwgd2lkdGgsIGxmYWN0b3IsIHJmYWN0b3J9Ci1HZW5lcmF0ZSBhIHN0ZXJlbyBmcmFnbWVudCBmcm9tIGEgbW9ubyBmcmFnbWVudC4gIEVhY2ggcGFpciBvZiBzYW1wbGVzCi1pbiB0aGUgc3RlcmVvIGZyYWdtZW50IGFyZSBjb21wdXRlZCBmcm9tIHRoZSBtb25vIHNhbXBsZSwgd2hlcmVieSBsZWZ0Ci1jaGFubmVsIHNhbXBsZXMgYXJlIG11bHRpcGxpZWQgYnkgXHZhcntsZmFjdG9yfSBhbmQgcmlnaHQgY2hhbm5lbAotc2FtcGxlcyBieSBcdmFye3JmYWN0b3J9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt1bGF3Mmxpbn17ZnJhZ21lbnQsIHdpZHRofQotQ29udmVydCBzb3VuZCBmcmFnbWVudHMgaW4gdS1MQVcgZW5jb2RpbmcgdG8gbGluZWFybHkgZW5jb2RlZCBzb3VuZAotZnJhZ21lbnRzLiAgdS1MQVcgZW5jb2RpbmcgYWx3YXlzIHVzZXMgOCBiaXRzIHNhbXBsZXMsIHNvIFx2YXJ7d2lkdGh9Ci1yZWZlcnMgb25seSB0byB0aGUgc2FtcGxlIHdpZHRoIG9mIHRoZSBvdXRwdXQgZnJhZ21lbnQgaGVyZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLU5vdGUgdGhhdCBvcGVyYXRpb25zIHN1Y2ggYXMgXGZ1bmN0aW9ue211bCgpfSBvciBcZnVuY3Rpb257bWF4KCl9IG1ha2UKLW5vIGRpc3RpbmN0aW9uIGJldHdlZW4gbW9ubyBhbmQgc3RlcmVvIGZyYWdtZW50cywgaS5lLlwgYWxsIHNhbXBsZXMKLWFyZSB0cmVhdGVkIGVxdWFsLiAgSWYgdGhpcyBpcyBhIHByb2JsZW0gdGhlIHN0ZXJlbyBmcmFnbWVudCBzaG91bGQgYmUKLXNwbGl0IGludG8gdHdvIG1vbm8gZnJhZ21lbnRzIGZpcnN0IGFuZCByZWNvbWJpbmVkIGxhdGVyLiAgSGVyZSBpcyBhbgotZXhhbXBsZSBvZiBob3cgdG8gZG8gdGhhdDoKLQotXGJlZ2lue3ZlcmJhdGltfQotZGVmIG11bF9zdGVyZW8oc2FtcGxlLCB3aWR0aCwgbGZhY3RvciwgcmZhY3Rvcik6Ci0gICAgbHNhbXBsZSA9IGF1ZGlvb3AudG9tb25vKHNhbXBsZSwgd2lkdGgsIDEsIDApCi0gICAgcnNhbXBsZSA9IGF1ZGlvb3AudG9tb25vKHNhbXBsZSwgd2lkdGgsIDAsIDEpCi0gICAgbHNhbXBsZSA9IGF1ZGlvb3AubXVsKHNhbXBsZSwgd2lkdGgsIGxmYWN0b3IpCi0gICAgcnNhbXBsZSA9IGF1ZGlvb3AubXVsKHNhbXBsZSwgd2lkdGgsIHJmYWN0b3IpCi0gICAgbHNhbXBsZSA9IGF1ZGlvb3AudG9zdGVyZW8obHNhbXBsZSwgd2lkdGgsIDEsIDApCi0gICAgcnNhbXBsZSA9IGF1ZGlvb3AudG9zdGVyZW8ocnNhbXBsZSwgd2lkdGgsIDAsIDEpCi0gICAgcmV0dXJuIGF1ZGlvb3AuYWRkKGxzYW1wbGUsIHJzYW1wbGUsIHdpZHRoKQotXGVuZHt2ZXJiYXRpbX0KLQotSWYgeW91IHVzZSB0aGUgQURQQ00gY29kZXIgdG8gYnVpbGQgbmV0d29yayBwYWNrZXRzIGFuZCB5b3Ugd2FudCB5b3VyCi1wcm90b2NvbCB0byBiZSBzdGF0ZWxlc3MgKGkuZS5cIHRvIGJlIGFibGUgdG8gdG9sZXJhdGUgcGFja2V0IGxvc3MpCi15b3Ugc2hvdWxkIG5vdCBvbmx5IHRyYW5zbWl0IHRoZSBkYXRhIGJ1dCBhbHNvIHRoZSBzdGF0ZS4gIE5vdGUgdGhhdAoteW91IHNob3VsZCBzZW5kIHRoZSBcdmFye2luaXRpYWx9IHN0YXRlICh0aGUgb25lIHlvdSBwYXNzZWQgdG8KLVxmdW5jdGlvbntsaW4yYWRwY20oKX0pIGFsb25nIHRvIHRoZSBkZWNvZGVyLCBub3QgdGhlIGZpbmFsIHN0YXRlIChhcwotcmV0dXJuZWQgYnkgdGhlIGNvZGVyKS4gIElmIHlvdSB3YW50IHRvIHVzZSBcZnVuY3Rpb257c3RydWN0LnN0cnVjdCgpfQotdG8gc3RvcmUgdGhlIHN0YXRlIGluIGJpbmFyeSB5b3UgY2FuIGNvZGUgdGhlIGZpcnN0IGVsZW1lbnQgKHRoZQotcHJlZGljdGVkIHZhbHVlKSBpbiAxNiBiaXRzIGFuZCB0aGUgc2Vjb25kICh0aGUgZGVsdGEgaW5kZXgpIGluIDguCi0KLVRoZSBBRFBDTSBjb2RlcnMgaGF2ZSBuZXZlciBiZWVuIHRyaWVkIGFnYWluc3Qgb3RoZXIgQURQQ00gY29kZXJzLAotb25seSBhZ2FpbnN0IHRoZW1zZWx2ZXMuICBJdCBjb3VsZCB3ZWxsIGJlIHRoYXQgSSBtaXNpbnRlcnByZXRlZCB0aGUKLXN0YW5kYXJkcyBpbiB3aGljaCBjYXNlIHRoZXkgd2lsbCBub3QgYmUgaW50ZXJvcGVyYWJsZSB3aXRoIHRoZQotcmVzcGVjdGl2ZSBzdGFuZGFyZHMuCi0KLVRoZSBcZnVuY3Rpb257ZmluZCooKX0gcm91dGluZXMgbWlnaHQgbG9vayBhIGJpdCBmdW5ueSBhdCBmaXJzdCBzaWdodC4KLVRoZXkgYXJlIHByaW1hcmlseSBtZWFudCB0byBkbyBlY2hvIGNhbmNlbGxhdGlvbi4gIEEgcmVhc29uYWJseQotZmFzdCB3YXkgdG8gZG8gdGhpcyBpcyB0byBwaWNrIHRoZSBtb3N0IGVuZXJnZXRpYyBwaWVjZSBvZiB0aGUgb3V0cHV0Ci1zYW1wbGUsIGxvY2F0ZSB0aGF0IGluIHRoZSBpbnB1dCBzYW1wbGUgYW5kIHN1YnRyYWN0IHRoZSB3aG9sZSBvdXRwdXQKLXNhbXBsZSBmcm9tIHRoZSBpbnB1dCBzYW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWRlZiBlY2hvY2FuY2VsKG91dHB1dGRhdGEsIGlucHV0ZGF0YSk6Ci0gICAgcG9zID0gYXVkaW9vcC5maW5kbWF4KG91dHB1dGRhdGEsIDgwMCkgICAgIyBvbmUgdGVudGggc2Vjb25kCi0gICAgb3V0X3Rlc3QgPSBvdXRwdXRkYXRhW3BvcyoyOl0KLSAgICBpbl90ZXN0ID0gaW5wdXRkYXRhW3BvcyoyOl0KLSAgICBpcG9zLCBmYWN0b3IgPSBhdWRpb29wLmZpbmRmaXQoaW5fdGVzdCwgb3V0X3Rlc3QpCi0gICAgIyBPcHRpb25hbCAoZm9yIGJldHRlciBjYW5jZWxsYXRpb24pOgotICAgICMgZmFjdG9yID0gYXVkaW9vcC5maW5kZmFjdG9yKGluX3Rlc3RbaXBvcyoyOmlwb3MqMitsZW4ob3V0X3Rlc3QpXSwgCi0gICAgIyAgICAgICAgICAgICAgb3V0X3Rlc3QpCi0gICAgcHJlZmlsbCA9ICdcMCcqKHBvcytpcG9zKSoyCi0gICAgcG9zdGZpbGwgPSAnXDAnKihsZW4oaW5wdXRkYXRhKS1sZW4ocHJlZmlsbCktbGVuKG91dHB1dGRhdGEpKQotICAgIG91dHB1dGRhdGEgPSBwcmVmaWxsICsgYXVkaW9vcC5tdWwob3V0cHV0ZGF0YSwyLC1mYWN0b3IpICsgcG9zdGZpbGwKLSAgICByZXR1cm4gYXVkaW9vcC5hZGQoaW5wdXRkYXRhLCBvdXRwdXRkYXRhLCAyKQotXGVuZHt2ZXJiYXRpbX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliYmFzZTY0LnRleCBiL0RvYy9saWIvbGliYmFzZTY0LnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNiNzRmMC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmJhc2U2NC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtiYXNlNjR9IC0tLQotCSBSRkMgMzU0ODogQmFzZTE2LCBCYXNlMzIsIEJhc2U2NCBEYXRhIEVuY29kaW5nc30KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2Jhc2U2NH0KLVxtb2R1bGVzeW5vcHNpc3tSRkMgMzU0ODogQmFzZTE2LCBCYXNlMzIsIEJhc2U2NCBEYXRhIEVuY29kaW5nc30KLQotCi1caW5kZXhpaXtiYXNlNjR9e2VuY29kaW5nfQotXGluZGV4e01JTUUhYmFzZTY0IGVuY29kaW5nfQotCi1UaGlzIG1vZHVsZSBwcm92aWRlcyBkYXRhIGVuY29kaW5nIGFuZCBkZWNvZGluZyBhcyBzcGVjaWZpZWQgaW4KLVxyZmN7MzU0OH0uICBUaGlzIHN0YW5kYXJkIGRlZmluZXMgdGhlIEJhc2UxNiwgQmFzZTMyLCBhbmQgQmFzZTY0Ci1hbGdvcml0aG1zIGZvciBlbmNvZGluZyBhbmQgZGVjb2RpbmcgYXJiaXRyYXJ5IGJpbmFyeSBzdHJpbmdzIGludG8KLXRleHQgc3RyaW5ncyB0aGF0IGNhbiBiZSBzYWZlbHkgc2VudCBieSBlbWFpbCwgdXNlZCBhcyBwYXJ0cyBvZiBVUkxzLAotb3IgaW5jbHVkZWQgYXMgcGFydCBvZiBhbiBIVFRQIFBPU1QgcmVxdWVzdC4gIFRoZSBlbmNvZGluZyBhbGdvcml0aG0gaXMKLW5vdCB0aGUgc2FtZSBhcyB0aGUgXHByb2dyYW17dXVlbmNvZGV9IHByb2dyYW0uCi0KLVRoZXJlIGFyZSB0d28gaW50ZXJmYWNlcyBwcm92aWRlZCBieSB0aGlzIG1vZHVsZS4gIFRoZSBtb2Rlcm4KLWludGVyZmFjZSBzdXBwb3J0cyBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc3RyaW5nIG9iamVjdHMgdXNpbmcgYWxsCi10aHJlZSBhbHBoYWJldHMuICBUaGUgbGVnYWN5IGludGVyZmFjZSBwcm92aWRlcyBmb3IgZW5jb2RpbmcgYW5kCi1kZWNvZGluZyB0byBhbmQgZnJvbSBmaWxlLWxpa2Ugb2JqZWN0cyBhcyB3ZWxsIGFzIHN0cmluZ3MsIGJ1dCBvbmx5Ci11c2luZyB0aGUgQmFzZTY0IHN0YW5kYXJkIGFscGhhYmV0LgotCi1UaGUgbW9kZXJuIGludGVyZmFjZSwgd2hpY2ggd2FzIGludHJvZHVjZWQgaW4gUHl0aG9uIDIuNCwgcHJvdmlkZXM6Ci0KLVxiZWdpbntmdW5jZGVzY317YjY0ZW5jb2RlfXtzXG9wdGlvbmFseywgYWx0Y2hhcnN9fQotRW5jb2RlIGEgc3RyaW5nIHVzZSBCYXNlNjQuCi0KLVx2YXJ7c30gaXMgdGhlIHN0cmluZyB0byBlbmNvZGUuICBPcHRpb25hbCBcdmFye2FsdGNoYXJzfSBtdXN0IGJlIGEKLXN0cmluZyBvZiBhdCBsZWFzdCBsZW5ndGggMiAoYWRkaXRpb25hbCBjaGFyYWN0ZXJzIGFyZSBpZ25vcmVkKSB3aGljaAotc3BlY2lmaWVzIGFuIGFsdGVybmF0aXZlIGFscGhhYmV0IGZvciB0aGUgXGNvZGV7K30gYW5kIFxjb2Rley99Ci1jaGFyYWN0ZXJzLiAgVGhpcyBhbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gZS5nLiBnZW5lcmF0ZSBVUkwgb3IKLWZpbGVzeXN0ZW0gc2FmZSBCYXNlNjQgc3RyaW5ncy4gIFRoZSBkZWZhdWx0IGlzIFxjb2Rle05vbmV9LCBmb3Igd2hpY2gKLXRoZSBzdGFuZGFyZCBCYXNlNjQgYWxwaGFiZXQgaXMgdXNlZC4KLQotVGhlIGVuY29kZWQgc3RyaW5nIGlzIHJldHVybmVkLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtiNjRkZWNvZGV9e3Ncb3B0aW9uYWx7LCBhbHRjaGFyc319Ci1EZWNvZGUgYSBCYXNlNjQgZW5jb2RlZCBzdHJpbmcuCi0KLVx2YXJ7c30gaXMgdGhlIHN0cmluZyB0byBkZWNvZGUuICBPcHRpb25hbCBcdmFye2FsdGNoYXJzfSBtdXN0IGJlIGEKLXN0cmluZyBvZiBhdCBsZWFzdCBsZW5ndGggMiAoYWRkaXRpb25hbCBjaGFyYWN0ZXJzIGFyZSBpZ25vcmVkKSB3aGljaAotc3BlY2lmaWVzIHRoZSBhbHRlcm5hdGl2ZSBhbHBoYWJldCB1c2VkIGluc3RlYWQgb2YgdGhlIFxjb2Rleyt9IGFuZAotXGNvZGV7L30gY2hhcmFjdGVycy4KLQotVGhlIGRlY29kZWQgc3RyaW5nIGlzIHJldHVybmVkLiAgQSBcZXhjZXB0aW9ue1R5cGVFcnJvcn0gaXMgcmFpc2VkIGlmCi1cdmFye3N9IHdlcmUgaW5jb3JyZWN0bHkgcGFkZGVkIG9yIGlmIHRoZXJlIGFyZSBub24tYWxwaGFiZXQKLWNoYXJhY3RlcnMgcHJlc2VudCBpbiB0aGUgc3RyaW5nLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzdGFuZGFyZF9iNjRlbmNvZGV9e3N9Ci1FbmNvZGUgc3RyaW5nIFx2YXJ7c30gdXNpbmcgdGhlIHN0YW5kYXJkIEJhc2U2NCBhbHBoYWJldC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c3RhbmRhcmRfYjY0ZGVjb2RlfXtzfQotRGVjb2RlIHN0cmluZyBcdmFye3N9IHVzaW5nIHRoZSBzdGFuZGFyZCBCYXNlNjQgYWxwaGFiZXQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3VybHNhZmVfYjY0ZW5jb2RlfXtzfQotRW5jb2RlIHN0cmluZyBcdmFye3N9IHVzaW5nIGEgVVJMLXNhZmUgYWxwaGFiZXQsIHdoaWNoIHN1YnN0aXR1dGVzCi1cY29kZXstfSBpbnN0ZWFkIG9mIFxjb2Rleyt9IGFuZCBcY29kZXtffSBpbnN0ZWFkIG9mIFxjb2Rley99IGluIHRoZQotc3RhbmRhcmQgQmFzZTY0IGFscGhhYmV0LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt1cmxzYWZlX2I2NGRlY29kZX17c30KLURlY29kZSBzdHJpbmcgXHZhcntzfSB1c2luZyBhIFVSTC1zYWZlIGFscGhhYmV0LCB3aGljaCBzdWJzdGl0dXRlcwotXGNvZGV7LX0gaW5zdGVhZCBvZiBcY29kZXsrfSBhbmQgXGNvZGV7X30gaW5zdGVhZCBvZiBcY29kZXsvfSBpbiB0aGUKLXN0YW5kYXJkIEJhc2U2NCBhbHBoYWJldC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317YjMyZW5jb2RlfXtzfQotRW5jb2RlIGEgc3RyaW5nIHVzaW5nIEJhc2UzMi4gIFx2YXJ7c30gaXMgdGhlIHN0cmluZyB0byBlbmNvZGUuICBUaGUKLWVuY29kZWQgc3RyaW5nIGlzIHJldHVybmVkLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtiMzJkZWNvZGV9e3Ncb3B0aW9uYWx7LCBjYXNlZm9sZFxvcHRpb25hbHssIG1hcDAxfX19Ci1EZWNvZGUgYSBCYXNlMzIgZW5jb2RlZCBzdHJpbmcuCi0KLVx2YXJ7c30gaXMgdGhlIHN0cmluZyB0byBkZWNvZGUuICBPcHRpb25hbCBcdmFye2Nhc2Vmb2xkfSBpcyBhIGZsYWcKLXNwZWNpZnlpbmcgd2hldGhlciBhIGxvd2VyY2FzZSBhbHBoYWJldCBpcyBhY2NlcHRhYmxlIGFzIGlucHV0LiAgRm9yCi1zZWN1cml0eSBwdXJwb3NlcywgdGhlIGRlZmF1bHQgaXMgXGNvZGV7RmFsc2V9LgotCi1ccmZjezM1NDh9IGFsbG93cyBmb3Igb3B0aW9uYWwgbWFwcGluZyBvZiB0aGUgZGlnaXQgMCAoemVybykgdG8gdGhlCi1sZXR0ZXIgTyAob2gpLCBhbmQgZm9yIG9wdGlvbmFsIG1hcHBpbmcgb2YgdGhlIGRpZ2l0IDEgKG9uZSkgdG8gZWl0aGVyCi10aGUgbGV0dGVyIEkgKGV5ZSkgb3IgbGV0dGVyIEwgKGVsKS4gIFRoZSBvcHRpb25hbCBhcmd1bWVudAotXHZhcnttYXAwMX0gd2hlbiBub3QgXGNvZGV7Tm9uZX0sIHNwZWNpZmllcyB3aGljaCBsZXR0ZXIgdGhlIGRpZ2l0IDEgc2hvdWxkCi1iZSBtYXBwZWQgdG8gKHdoZW4gXHZhcnttYXAwMX0gaXMgbm90IFxjb2Rle05vbmV9LCB0aGUgZGlnaXQgMCBpcyBhbHdheXMKLW1hcHBlZCB0byB0aGUgbGV0dGVyIE8pLiAgRm9yIHNlY3VyaXR5IHB1cnBvc2VzIHRoZSBkZWZhdWx0IGlzCi1cY29kZXtOb25lfSwgc28gdGhhdCAwIGFuZCAxIGFyZSBub3QgYWxsb3dlZCBpbiB0aGUgaW5wdXQuCi0KLVRoZSBkZWNvZGVkIHN0cmluZyBpcyByZXR1cm5lZC4gIEEgXGV4Y2VwdGlvbntUeXBlRXJyb3J9IGlzIHJhaXNlZCBpZgotXHZhcntzfSB3ZXJlIGluY29ycmVjdGx5IHBhZGRlZCBvciBpZiB0aGVyZSBhcmUgbm9uLWFscGhhYmV0IGNoYXJhY3RlcnMKLXByZXNlbnQgaW4gdGhlIHN0cmluZy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317YjE2ZW5jb2RlfXtzfQotRW5jb2RlIGEgc3RyaW5nIHVzaW5nIEJhc2UxNi4KLQotXHZhcntzfSBpcyB0aGUgc3RyaW5nIHRvIGVuY29kZS4gIFRoZSBlbmNvZGVkIHN0cmluZyBpcyByZXR1cm5lZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317YjE2ZGVjb2RlfXtzXG9wdGlvbmFseywgY2FzZWZvbGR9fQotRGVjb2RlIGEgQmFzZTE2IGVuY29kZWQgc3RyaW5nLgotCi1cdmFye3N9IGlzIHRoZSBzdHJpbmcgdG8gZGVjb2RlLiAgT3B0aW9uYWwgXHZhcntjYXNlZm9sZH0gaXMgYSBmbGFnCi1zcGVjaWZ5aW5nIHdoZXRoZXIgYSBsb3dlcmNhc2UgYWxwaGFiZXQgaXMgYWNjZXB0YWJsZSBhcyBpbnB1dC4gIEZvcgotc2VjdXJpdHkgcHVycG9zZXMsIHRoZSBkZWZhdWx0IGlzIFxjb2Rle0ZhbHNlfS4KLQotVGhlIGRlY29kZWQgc3RyaW5nIGlzIHJldHVybmVkLiAgQSBcZXhjZXB0aW9ue1R5cGVFcnJvcn0gaXMgcmFpc2VkIGlmCi1cdmFye3N9IHdlcmUgaW5jb3JyZWN0bHkgcGFkZGVkIG9yIGlmIHRoZXJlIGFyZSBub24tYWxwaGFiZXQKLWNoYXJhY3RlcnMgcHJlc2VudCBpbiB0aGUgc3RyaW5nLgotXGVuZHtmdW5jZGVzY30KLQotVGhlIGxlZ2FjeSBpbnRlcmZhY2U6Ci0KLVxiZWdpbntmdW5jZGVzY317ZGVjb2RlfXtpbnB1dCwgb3V0cHV0fQotRGVjb2RlIHRoZSBjb250ZW50cyBvZiB0aGUgXHZhcntpbnB1dH0gZmlsZSBhbmQgd3JpdGUgdGhlIHJlc3VsdGluZwotYmluYXJ5IGRhdGEgdG8gdGhlIFx2YXJ7b3V0cHV0fSBmaWxlLgotXHZhcntpbnB1dH0gYW5kIFx2YXJ7b3V0cHV0fSBtdXN0IGVpdGhlciBiZSBmaWxlIG9iamVjdHMgb3Igb2JqZWN0cyB0aGF0Ci1taW1pYyB0aGUgZmlsZSBvYmplY3QgaW50ZXJmYWNlLiBcdmFye2lucHV0fSB3aWxsIGJlIHJlYWQgdW50aWwKLVxjb2Rle1x2YXJ7aW5wdXR9LnJlYWQoKX0gcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2RlY29kZXN0cmluZ317c30KLURlY29kZSB0aGUgc3RyaW5nIFx2YXJ7c30sIHdoaWNoIG11c3QgY29udGFpbiBvbmUgb3IgbW9yZSBsaW5lcyBvZgotYmFzZTY0IGVuY29kZWQgZGF0YSwgYW5kIHJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSByZXN1bHRpbmcKLWJpbmFyeSBkYXRhLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtlbmNvZGV9e2lucHV0LCBvdXRwdXR9Ci1FbmNvZGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBcdmFye2lucHV0fSBmaWxlIGFuZCB3cml0ZSB0aGUgcmVzdWx0aW5nCi1iYXNlNjQgZW5jb2RlZCBkYXRhIHRvIHRoZSBcdmFye291dHB1dH0gZmlsZS4KLVx2YXJ7aW5wdXR9IGFuZCBcdmFye291dHB1dH0gbXVzdCBlaXRoZXIgYmUgZmlsZSBvYmplY3RzIG9yIG9iamVjdHMgdGhhdAotbWltaWMgdGhlIGZpbGUgb2JqZWN0IGludGVyZmFjZS4gXHZhcntpbnB1dH0gd2lsbCBiZSByZWFkIHVudGlsCi1cY29kZXtcdmFye2lucHV0fS5yZWFkKCl9IHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLiAgXGZ1bmN0aW9ue2VuY29kZSgpfQotcmV0dXJucyB0aGUgZW5jb2RlZCBkYXRhIHBsdXMgYSB0cmFpbGluZyBuZXdsaW5lIGNoYXJhY3RlcgotKFxjb2RleydcZSBuJ30pLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtlbmNvZGVzdHJpbmd9e3N9Ci1FbmNvZGUgdGhlIHN0cmluZyBcdmFye3N9LCB3aGljaCBjYW4gY29udGFpbiBhcmJpdHJhcnkgYmluYXJ5IGRhdGEsCi1hbmQgcmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgb25lIG9yIG1vcmUgbGluZXMgb2YKLWJhc2U2NC1lbmNvZGVkIGRhdGEuICBcZnVuY3Rpb257ZW5jb2Rlc3RyaW5nKCl9IHJldHVybnMgYQotc3RyaW5nIGNvbnRhaW5pbmcgb25lIG9yIG1vcmUgbGluZXMgb2YgYmFzZTY0LWVuY29kZWQgZGF0YQotYWx3YXlzIGluY2x1ZGluZyBhbiBleHRyYSB0cmFpbGluZyBuZXdsaW5lIChcY29kZXsnXGUgbid9KS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLUFuIGV4YW1wbGUgdXNhZ2Ugb2YgdGhlIG1vZHVsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGltcG9ydCBiYXNlNjQKLT4+PiBlbmNvZGVkID0gYmFzZTY0LmI2NGVuY29kZSgnZGF0YSB0byBiZSBlbmNvZGVkJykKLT4+PiBlbmNvZGVkCi0nWkdGMFlTQjBieUJpWlNCbGJtTnZaR1ZrJwotPj4+IGRhdGEgPSBiYXNlNjQuYjY0ZGVjb2RlKGVuY29kZWQpCi0+Pj4gZGF0YQotJ2RhdGEgdG8gYmUgZW5jb2RlZCcKLVxlbmR7dmVyYmF0aW19Ci0KLVxiZWdpbntzZWVhbHNvfQotICBcc2VlbW9kdWxle2JpbmFzY2lpfXtTdXBwb3J0IG1vZHVsZSBjb250YWluaW5nIFxBU0NJSS10by1iaW5hcnkKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kIGJpbmFyeS10by1cQVNDSUl7fSBjb252ZXJzaW9ucy59Ci0gIFxzZWVyZmN7MTUyMX17TUlNRSAoTXVsdGlwdXJwb3NlIEludGVybmV0IE1haWwgRXh0ZW5zaW9ucykgUGFydCBPbmU6Ci0gICAgICAgICAgTWVjaGFuaXNtcyBmb3IgU3BlY2lmeWluZyBhbmQgRGVzY3JpYmluZyB0aGUgRm9ybWF0IG9mCi0gICAgICAgICAgSW50ZXJuZXQgTWVzc2FnZSBCb2RpZXN9e1NlY3Rpb24gNS4yLCBgYEJhc2U2NAotICAgICAgICAgIENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcsJycgcHJvdmlkZXMgdGhlIGRlZmluaXRpb24gb2YgdGhlCi0gICAgICAgICAgYmFzZTY0IGVuY29kaW5nLn0KLVxlbmR7c2VlYWxzb30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliYmFzZWh0dHAudGV4IGIvRG9jL2xpYi9saWJiYXNlaHR0cC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YzA2OWYuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJiYXNlaHR0cC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtCYXNlSFRUUFNlcnZlcn0gLS0tCi0gICAgICAgICBCYXNpYyBIVFRQIHNlcnZlcn0KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e0Jhc2VIVFRQU2VydmVyfQotXG1vZHVsZXN5bm9wc2lze0Jhc2ljIEhUVFAgc2VydmVyIChiYXNlIGNsYXNzIGZvcgotICAgICAgICAgICAgICAgIFxjbGFzc3tTaW1wbGVIVFRQU2VydmVyfSBhbmQgXGNsYXNze0NHSUhUVFBTZXJ2ZXJ9KS59Ci0KLQotXGluZGV4aWl7V1dXfXtzZXJ2ZXJ9Ci1caW5kZXhpaXtIVFRQfXtwcm90b2NvbH0KLVxpbmRleHtVUkx9Ci1caW5kZXh7aHR0cGR9Ci0KLVRoaXMgbW9kdWxlIGRlZmluZXMgdHdvIGNsYXNzZXMgZm9yIGltcGxlbWVudGluZyBIVFRQIHNlcnZlcnMKLShXZWIgc2VydmVycykuIFVzdWFsbHksIHRoaXMgbW9kdWxlIGlzbid0IHVzZWQgZGlyZWN0bHksIGJ1dCBpcyB1c2VkCi1hcyBhIGJhc2lzIGZvciBidWlsZGluZyBmdW5jdGlvbmluZyBXZWIgc2VydmVycy4gU2VlIHRoZQotXHJlZm1vZHVsZXtTaW1wbGVIVFRQU2VydmVyfVxyZWZzdG1vZGluZGV4e1NpbXBsZUhUVFBTZXJ2ZXJ9IGFuZAotXHJlZm1vZHVsZXtDR0lIVFRQU2VydmVyfVxyZWZzdG1vZGluZGV4e0NHSUhUVFBTZXJ2ZXJ9IG1vZHVsZXMuCi0KLVRoZSBmaXJzdCBjbGFzcywgXGNsYXNze0hUVFBTZXJ2ZXJ9LCBpcyBhCi1cY2xhc3N7U29ja2V0U2VydmVyLlRDUFNlcnZlcn0gc3ViY2xhc3MuICBJdCBjcmVhdGVzIGFuZCBsaXN0ZW5zIGF0IHRoZQotSFRUUCBzb2NrZXQsIGRpc3BhdGNoaW5nIHRoZSByZXF1ZXN0cyB0byBhIGhhbmRsZXIuICBDb2RlIHRvIGNyZWF0ZSBhbmQKLXJ1biB0aGUgc2VydmVyIGxvb2tzIGxpa2UgdGhpczoKLQotXGJlZ2lue3ZlcmJhdGltfQotZGVmIHJ1bihzZXJ2ZXJfY2xhc3M9QmFzZUhUVFBTZXJ2ZXIuSFRUUFNlcnZlciwKLSAgICAgICAgaGFuZGxlcl9jbGFzcz1CYXNlSFRUUFNlcnZlci5CYXNlSFRUUFJlcXVlc3RIYW5kbGVyKToKLSAgICBzZXJ2ZXJfYWRkcmVzcyA9ICgnJywgODAwMCkKLSAgICBodHRwZCA9IHNlcnZlcl9jbGFzcyhzZXJ2ZXJfYWRkcmVzcywgaGFuZGxlcl9jbGFzcykKLSAgICBodHRwZC5zZXJ2ZV9mb3JldmVyKCkKLVxlbmR7dmVyYmF0aW19Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0hUVFBTZXJ2ZXJ9e3NlcnZlcl9hZGRyZXNzLCBSZXF1ZXN0SGFuZGxlckNsYXNzfQotVGhpcyBjbGFzcyBidWlsZHMgb24gdGhlIFxjbGFzc3tUQ1BTZXJ2ZXJ9IGNsYXNzIGJ5Ci1zdG9yaW5nIHRoZSBzZXJ2ZXIgYWRkcmVzcyBhcyBpbnN0YW5jZQotdmFyaWFibGVzIG5hbWVkIFxtZW1iZXJ7c2VydmVyX25hbWV9IGFuZCBcbWVtYmVye3NlcnZlcl9wb3J0fS4gVGhlCi1zZXJ2ZXIgaXMgYWNjZXNzaWJsZSBieSB0aGUgaGFuZGxlciwgdHlwaWNhbGx5IHRocm91Z2ggdGhlIGhhbmRsZXIncwotXG1lbWJlcntzZXJ2ZXJ9IGluc3RhbmNlIHZhcmlhYmxlLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0Jhc2VIVFRQUmVxdWVzdEhhbmRsZXJ9e3JlcXVlc3QsIGNsaWVudF9hZGRyZXNzLCBzZXJ2ZXJ9Ci1UaGlzIGNsYXNzIGlzIHVzZWQKLXRvIGhhbmRsZSB0aGUgSFRUUCByZXF1ZXN0cyB0aGF0IGFycml2ZSBhdCB0aGUgc2VydmVyLiBCeSBpdHNlbGYsCi1pdCBjYW5ub3QgcmVzcG9uZCB0byBhbnkgYWN0dWFsIEhUVFAgcmVxdWVzdHM7IGl0IG11c3QgYmUgc3ViY2xhc3NlZAotdG8gaGFuZGxlIGVhY2ggcmVxdWVzdCBtZXRob2QgKGUuZy4gR0VUIG9yIFBPU1QpLgotXGNsYXNze0Jhc2VIVFRQUmVxdWVzdEhhbmRsZXJ9IHByb3ZpZGVzIGEgbnVtYmVyIG9mIGNsYXNzIGFuZCBpbnN0YW5jZQotdmFyaWFibGVzLCBhbmQgbWV0aG9kcyBmb3IgdXNlIGJ5IHN1YmNsYXNzZXMuCi0KLVRoZSBoYW5kbGVyIHdpbGwgcGFyc2UgdGhlIHJlcXVlc3QgYW5kIHRoZSBoZWFkZXJzLCB0aGVuIGNhbGwgYQotbWV0aG9kIHNwZWNpZmljIHRvIHRoZSByZXF1ZXN0IHR5cGUuIFRoZSBtZXRob2QgbmFtZSBpcyBjb25zdHJ1Y3RlZAotZnJvbSB0aGUgcmVxdWVzdC4gRm9yIGV4YW1wbGUsIGZvciB0aGUgcmVxdWVzdCBtZXRob2QgXHNhbXB7U1BBTX0sIHRoZQotXG1ldGhvZHtkb19TUEFNKCl9IG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50cy4gQWxsIG9mCi10aGUgcmVsZXZhbnQgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIGluc3RhbmNlIHZhcmlhYmxlcyBvZiB0aGUKLWhhbmRsZXIuICBTdWJjbGFzc2VzIHNob3VsZCBub3QgbmVlZCB0byBvdmVycmlkZSBvciBleHRlbmQgdGhlCi1cbWV0aG9ke19faW5pdF9fKCl9IG1ldGhvZC4KLVxlbmR7Y2xhc3NkZXNjfQotCi0KLVxjbGFzc3tCYXNlSFRUUFJlcXVlc3RIYW5kbGVyfSBoYXMgdGhlIGZvbGxvd2luZyBpbnN0YW5jZSB2YXJpYWJsZXM6Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXtjbGllbnRfYWRkcmVzc30KLUNvbnRhaW5zIGEgdHVwbGUgb2YgdGhlIGZvcm0gXGNvZGV7KFx2YXJ7aG9zdH0sIFx2YXJ7cG9ydH0pfSByZWZlcnJpbmcKLXRvIHRoZSBjbGllbnQncyBhZGRyZXNzLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY317Y29tbWFuZH0KLUNvbnRhaW5zIHRoZSBjb21tYW5kIChyZXF1ZXN0IHR5cGUpLiBGb3IgZXhhbXBsZSwgXGNvZGV7J0dFVCd9LgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY317cGF0aH0KLUNvbnRhaW5zIHRoZSByZXF1ZXN0IHBhdGguCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXtyZXF1ZXN0X3ZlcnNpb259Ci1Db250YWlucyB0aGUgdmVyc2lvbiBzdHJpbmcgZnJvbSB0aGUgcmVxdWVzdC4gRm9yIGV4YW1wbGUsCi1cY29kZXsnSFRUUC8xLjAnfS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9e2hlYWRlcnN9Ci1Ib2xkcyBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3Mgc3BlY2lmaWVkIGJ5IHRoZSBcbWVtYmVye01lc3NhZ2VDbGFzc30KLWNsYXNzIHZhcmlhYmxlLiBUaGlzIGluc3RhbmNlIHBhcnNlcyBhbmQgbWFuYWdlcyB0aGUgaGVhZGVycyBpbgotdGhlIEhUVFAgcmVxdWVzdC4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9e3JmaWxlfQotQ29udGFpbnMgYW4gaW5wdXQgc3RyZWFtLCBwb3NpdGlvbmVkIGF0IHRoZSBzdGFydCBvZiB0aGUgb3B0aW9uYWwKLWlucHV0IGRhdGEuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXt3ZmlsZX0KLUNvbnRhaW5zIHRoZSBvdXRwdXQgc3RyZWFtIGZvciB3cml0aW5nIGEgcmVzcG9uc2UgYmFjayB0byB0aGUgY2xpZW50LgotUHJvcGVyIGFkaGVyZW5jZSB0byB0aGUgSFRUUCBwcm90b2NvbCBtdXN0IGJlIHVzZWQgd2hlbiB3cml0aW5nCi10byB0aGlzIHN0cmVhbS4KLVxlbmR7bWVtYmVyZGVzY30KLQotCi1cY2xhc3N7QmFzZUhUVFBSZXF1ZXN0SGFuZGxlcn0gaGFzIHRoZSBmb2xsb3dpbmcgY2xhc3MgdmFyaWFibGVzOgotCi1cYmVnaW57bWVtYmVyZGVzY317c2VydmVyX3ZlcnNpb259Ci1TcGVjaWZpZXMgdGhlIHNlcnZlciBzb2Z0d2FyZSB2ZXJzaW9uLiAgWW91IG1heSB3YW50IHRvIG92ZXJyaWRlCi10aGlzLgotVGhlIGZvcm1hdCBpcyBtdWx0aXBsZSB3aGl0ZXNwYWNlLXNlcGFyYXRlZCBzdHJpbmdzLAotd2hlcmUgZWFjaCBzdHJpbmcgaXMgb2YgdGhlIGZvcm0gbmFtZVsvdmVyc2lvbl0uCi1Gb3IgZXhhbXBsZSwgXGNvZGV7J0Jhc2VIVFRQLzAuMid9LgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY317c3lzX3ZlcnNpb259Ci1Db250YWlucyB0aGUgUHl0aG9uIHN5c3RlbSB2ZXJzaW9uLCBpbiBhIGZvcm0gdXNhYmxlIGJ5IHRoZQotXG1lbWJlcnt2ZXJzaW9uX3N0cmluZ30gbWV0aG9kIGFuZCB0aGUgXG1lbWJlcntzZXJ2ZXJfdmVyc2lvbn0gY2xhc3MKLXZhcmlhYmxlLiBGb3IgZXhhbXBsZSwgXGNvZGV7J1B5dGhvbi8xLjQnfS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9e2Vycm9yX21lc3NhZ2VfZm9ybWF0fQotU3BlY2lmaWVzIGEgZm9ybWF0IHN0cmluZyBmb3IgYnVpbGRpbmcgYW4gZXJyb3IgcmVzcG9uc2UgdG8gdGhlCi1jbGllbnQuIEl0IHVzZXMgcGFyZW50aGVzaXplZCwga2V5ZWQgZm9ybWF0IHNwZWNpZmllcnMsIHNvIHRoZQotZm9ybWF0IG9wZXJhbmQgbXVzdCBiZSBhIGRpY3Rpb25hcnkuIFRoZSBcdmFye2NvZGV9IGtleSBzaG91bGQKLWJlIGFuIGludGVnZXIsIHNwZWNpZnlpbmcgdGhlIG51bWVyaWMgSFRUUCBlcnJvciBjb2RlIHZhbHVlLgotXHZhcnttZXNzYWdlfSBzaG91bGQgYmUgYSBzdHJpbmcgY29udGFpbmluZyBhIChkZXRhaWxlZCkgZXJyb3IKLW1lc3NhZ2Ugb2Ygd2hhdCBvY2N1cnJlZCwgYW5kIFx2YXJ7ZXhwbGFpbn0gc2hvdWxkIGJlIGFuCi1leHBsYW5hdGlvbiBvZiB0aGUgZXJyb3IgY29kZSBudW1iZXIuIERlZmF1bHQgXHZhcnttZXNzYWdlfQotYW5kIFx2YXJ7ZXhwbGFpbn0gdmFsdWVzIGNhbiBmb3VuZCBpbiB0aGUgXHZhcntyZXNwb25zZXN9Ci1jbGFzcyB2YXJpYWJsZS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9e3Byb3RvY29sX3ZlcnNpb259Ci1UaGlzIHNwZWNpZmllcyB0aGUgSFRUUCBwcm90b2NvbCB2ZXJzaW9uIHVzZWQgaW4gcmVzcG9uc2VzLiAgSWYgc2V0Ci10byBcY29kZXsnSFRUUC8xLjEnfSwgdGhlIHNlcnZlciB3aWxsIHBlcm1pdCBIVFRQIHBlcnNpc3RlbnQKLWNvbm5lY3Rpb25zOyBob3dldmVyLCB5b3VyIHNlcnZlciBcZW1waHttdXN0fSB0aGVuIGluY2x1ZGUgYW4KLWFjY3VyYXRlIFxjb2Rle0NvbnRlbnQtTGVuZ3RofSBoZWFkZXIgKHVzaW5nIFxtZXRob2R7c2VuZF9oZWFkZXIoKX0pCi1pbiBhbGwgb2YgaXRzIHJlc3BvbnNlcyB0byBjbGllbnRzLiAgRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LAotdGhlIHNldHRpbmcgZGVmYXVsdHMgdG8gXGNvZGV7J0hUVFAvMS4wJ30uCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXtNZXNzYWdlQ2xhc3N9Ci1TcGVjaWZpZXMgYSBcY2xhc3N7cmZjODIyLk1lc3NhZ2V9LWxpa2UgY2xhc3MgdG8gcGFyc2UgSFRUUAotaGVhZGVycy4gVHlwaWNhbGx5LCB0aGlzIGlzIG5vdCBvdmVycmlkZGVuLCBhbmQgaXQgZGVmYXVsdHMgdG8KLVxjbGFzc3ttaW1ldG9vbHMuTWVzc2FnZX0uCi1cd2l0aHN1Yml0ZW17KGluIG1vZHVsZSBtaW1ldG9vbHMpfXtcdHRpbmRleHtNZXNzYWdlfX0KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9e3Jlc3BvbnNlc30KLVRoaXMgdmFyaWFibGUgY29udGFpbnMgYSBtYXBwaW5nIG9mIGVycm9yIGNvZGUgaW50ZWdlcnMgdG8gdHdvLWVsZW1lbnQKLXR1cGxlcyBjb250YWluaW5nIGEgc2hvcnQgYW5kIGxvbmcgbWVzc2FnZS4gRm9yIGV4YW1wbGUsCi1cY29kZXtce1x2YXJ7Y29kZX06IChcdmFye3Nob3J0bWVzc2FnZX0sIFx2YXJ7bG9uZ21lc3NhZ2V9KVx9fS4gVGhlCi1cdmFye3Nob3J0bWVzc2FnZX0gaXMgdXN1YWxseSB1c2VkIGFzIHRoZSBcdmFye21lc3NhZ2V9IGtleSBpbiBhbgotZXJyb3IgcmVzcG9uc2UsIGFuZCBcdmFye2xvbmdtZXNzYWdlfSBhcyB0aGUgXHZhcntleHBsYWlufSBrZXkKLShzZWUgdGhlIFxtZW1iZXJ7ZXJyb3JfbWVzc2FnZV9mb3JtYXR9IGNsYXNzIHZhcmlhYmxlKS4KLVxlbmR7bWVtYmVyZGVzY30KLQotCi1BIFxjbGFzc3tCYXNlSFRUUFJlcXVlc3RIYW5kbGVyfSBpbnN0YW5jZSBoYXMgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotCi1cYmVnaW57bWV0aG9kZGVzY317aGFuZGxlfXt9Ci1DYWxscyBcbWV0aG9ke2hhbmRsZV9vbmVfcmVxdWVzdCgpfSBvbmNlIChvciwgaWYgcGVyc2lzdGVudCBjb25uZWN0aW9ucwotYXJlIGVuYWJsZWQsIG11bHRpcGxlIHRpbWVzKSB0byBoYW5kbGUgaW5jb21pbmcgSFRUUCByZXF1ZXN0cy4KLVlvdSBzaG91bGQgbmV2ZXIgbmVlZCB0byBvdmVycmlkZSBpdDsgaW5zdGVhZCwgaW1wbGVtZW50IGFwcHJvcHJpYXRlCi1cbWV0aG9ke2RvXyooKX0gbWV0aG9kcy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2hhbmRsZV9vbmVfcmVxdWVzdH17fQotVGhpcyBtZXRob2Qgd2lsbCBwYXJzZSBhbmQgZGlzcGF0Y2gKLXRoZSByZXF1ZXN0IHRvIHRoZSBhcHByb3ByaWF0ZSBcbWV0aG9ke2RvXyooKX0gbWV0aG9kLiAgWW91IHNob3VsZAotbmV2ZXIgbmVlZCB0byBvdmVycmlkZSBpdC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3NlbmRfZXJyb3J9e2NvZGVcb3B0aW9uYWx7LCBtZXNzYWdlfX0KLVNlbmRzIGFuZCBsb2dzIGEgY29tcGxldGUgZXJyb3IgcmVwbHkgdG8gdGhlIGNsaWVudC4gVGhlIG51bWVyaWMKLVx2YXJ7Y29kZX0gc3BlY2lmaWVzIHRoZSBIVFRQIGVycm9yIGNvZGUsIHdpdGggXHZhcnttZXNzYWdlfSBhcwotb3B0aW9uYWwsIG1vcmUgc3BlY2lmaWMgdGV4dC4gQSBjb21wbGV0ZSBzZXQgb2YgaGVhZGVycyBpcyBzZW50LAotZm9sbG93ZWQgYnkgdGV4dCBjb21wb3NlZCB1c2luZyB0aGUgXG1lbWJlcntlcnJvcl9tZXNzYWdlX2Zvcm1hdH0KLWNsYXNzIHZhcmlhYmxlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317c2VuZF9yZXNwb25zZX17Y29kZVxvcHRpb25hbHssIG1lc3NhZ2V9fQotU2VuZHMgYSByZXNwb25zZSBoZWFkZXIgYW5kIGxvZ3MgdGhlIGFjY2VwdGVkIHJlcXVlc3QuIFRoZSBIVFRQCi1yZXNwb25zZSBsaW5lIGlzIHNlbnQsIGZvbGxvd2VkIGJ5IFxlbXBoe1NlcnZlcn0gYW5kIFxlbXBoe0RhdGV9Ci1oZWFkZXJzLiBUaGUgdmFsdWVzIGZvciB0aGVzZSB0d28gaGVhZGVycyBhcmUgcGlja2VkIHVwIGZyb20gdGhlCi1cbWV0aG9ke3ZlcnNpb25fc3RyaW5nKCl9IGFuZCBcbWV0aG9ke2RhdGVfdGltZV9zdHJpbmcoKX0gbWV0aG9kcywKLXJlc3BlY3RpdmVseS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3NlbmRfaGVhZGVyfXtrZXl3b3JkLCB2YWx1ZX0KLVdyaXRlcyBhIHNwZWNpZmljIEhUVFAgaGVhZGVyIHRvIHRoZSBvdXRwdXQgc3RyZWFtLiBcdmFye2tleXdvcmR9Ci1zaG91bGQgc3BlY2lmeSB0aGUgaGVhZGVyIGtleXdvcmQsIHdpdGggXHZhcnt2YWx1ZX0gc3BlY2lmeWluZwotaXRzIHZhbHVlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317ZW5kX2hlYWRlcnN9e30KLVNlbmRzIGEgYmxhbmsgbGluZSwgaW5kaWNhdGluZyB0aGUgZW5kIG9mIHRoZSBIVFRQIGhlYWRlcnMgaW4KLXRoZSByZXNwb25zZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2xvZ19yZXF1ZXN0fXtcb3B0aW9uYWx7Y29kZVxvcHRpb25hbHssIHNpemV9fX0KLUxvZ3MgYW4gYWNjZXB0ZWQgKHN1Y2Nlc3NmdWwpIHJlcXVlc3QuIFx2YXJ7Y29kZX0gc2hvdWxkIHNwZWNpZnkKLXRoZSBudW1lcmljIEhUVFAgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc3BvbnNlLiBJZiBhIHNpemUgb2YKLXRoZSByZXNwb25zZSBpcyBhdmFpbGFibGUsIHRoZW4gaXQgc2hvdWxkIGJlIHBhc3NlZCBhcyB0aGUKLVx2YXJ7c2l6ZX0gcGFyYW1ldGVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317bG9nX2Vycm9yfXsuLi59Ci1Mb2dzIGFuIGVycm9yIHdoZW4gYSByZXF1ZXN0IGNhbm5vdCBiZSBmdWxmaWxsZWQuIEJ5IGRlZmF1bHQsCi1pdCBwYXNzZXMgdGhlIG1lc3NhZ2UgdG8gXG1ldGhvZHtsb2dfbWVzc2FnZSgpfSwgc28gaXQgdGFrZXMgdGhlCi1zYW1lIGFyZ3VtZW50cyAoXHZhcntmb3JtYXR9IGFuZCBhZGRpdGlvbmFsIHZhbHVlcykuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtsb2dfbWVzc2FnZX17Zm9ybWF0LCAuLi59Ci1Mb2dzIGFuIGFyYml0cmFyeSBtZXNzYWdlIHRvIFxjb2Rle3N5cy5zdGRlcnJ9LiBUaGlzIGlzIHR5cGljYWxseQotb3ZlcnJpZGRlbiB0byBjcmVhdGUgY3VzdG9tIGVycm9yIGxvZ2dpbmcgbWVjaGFuaXNtcy4gVGhlCi1cdmFye2Zvcm1hdH0gYXJndW1lbnQgaXMgYSBzdGFuZGFyZCBwcmludGYtc3R5bGUgZm9ybWF0IHN0cmluZywKLXdoZXJlIHRoZSBhZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBcbWV0aG9ke2xvZ19tZXNzYWdlKCl9IGFyZSBhcHBsaWVkCi1hcyBpbnB1dHMgdG8gdGhlIGZvcm1hdHRpbmcuIFRoZSBjbGllbnQgYWRkcmVzcyBhbmQgY3VycmVudCBkYXRlCi1hbmQgdGltZSBhcmUgcHJlZml4ZWQgdG8gZXZlcnkgbWVzc2FnZSBsb2dnZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXt2ZXJzaW9uX3N0cmluZ317fQotUmV0dXJucyB0aGUgc2VydmVyIHNvZnR3YXJlJ3MgdmVyc2lvbiBzdHJpbmcuIFRoaXMgaXMgYSBjb21iaW5hdGlvbgotb2YgdGhlIFxtZW1iZXJ7c2VydmVyX3ZlcnNpb259IGFuZCBcbWVtYmVye3N5c192ZXJzaW9ufSBjbGFzcyB2YXJpYWJsZXMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtkYXRlX3RpbWVfc3RyaW5nfXtcb3B0aW9uYWx7dGltZXN0YW1wfX0KLVJldHVybnMgdGhlIGRhdGUgYW5kIHRpbWUgZ2l2ZW4gYnkgXHZhcnt0aW1lc3RhbXB9ICh3aGljaCBtdXN0IGJlIGluIHRoZQotZm9ybWF0IHJldHVybmVkIGJ5IFxmdW5jdGlvbnt0aW1lLnRpbWUoKX0pLCBmb3JtYXR0ZWQgZm9yIGEgbWVzc2FnZSBoZWFkZXIuCi1JZiBcdmFye3RpbWVzdGFtcH0gaXMgb21pdHRlZCwgaXQgdXNlcyB0aGUgY3VycmVudCBkYXRlIGFuZCB0aW1lLgotCi1UaGUgcmVzdWx0IGxvb2tzIGxpa2UgXGNvZGV7J1N1biwgMDYgTm92IDE5OTQgMDg6NDk6MzcgR01UJ30uCi1cdmVyc2lvbmFkZGVkW1RoZSBcdmFye3RpbWVzdGFtcH0gcGFyYW1ldGVyXXsyLjV9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtsb2dfZGF0ZV90aW1lX3N0cmluZ317fQotUmV0dXJucyB0aGUgY3VycmVudCBkYXRlIGFuZCB0aW1lLCBmb3JtYXR0ZWQgZm9yIGxvZ2dpbmcuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXthZGRyZXNzX3N0cmluZ317fQotUmV0dXJucyB0aGUgY2xpZW50IGFkZHJlc3MsIGZvcm1hdHRlZCBmb3IgbG9nZ2luZy4gQSBuYW1lIGxvb2t1cAotaXMgcGVyZm9ybWVkIG9uIHRoZSBjbGllbnQncyBJUCBhZGRyZXNzLgotXGVuZHttZXRob2RkZXNjfQotCi0KLVxiZWdpbntzZWVhbHNvfQotICBcc2VlbW9kdWxle0NHSUhUVFBTZXJ2ZXJ9e0V4dGVuZGVkIHJlcXVlc3QgaGFuZGxlciB0aGF0IHN1cHBvcnRzIENHSQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdHMufQotCi0gIFxzZWVtb2R1bGV7U2ltcGxlSFRUUFNlcnZlcn17QmFzaWMgcmVxdWVzdCBoYW5kbGVyIHRoYXQgbGltaXRzIHJlc3BvbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gZmlsZXMgYWN0dWFsbHkgdW5kZXIgdGhlIGRvY3VtZW50IHJvb3QufQotXGVuZHtzZWVhbHNvfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJiaW5hc2NpaS50ZXggYi9Eb2MvbGliL2xpYmJpbmFzY2lpLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRkMjljNi4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmJpbmFzY2lpLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle2JpbmFzY2lpfSAtLS0KLSAgICAgICAgIENvbnZlcnQgYmV0d2VlbiBiaW5hcnkgYW5kIFxBU0NJSX0KLQotXGRlY2xhcmVtb2R1bGV7YnVpbHRpbn17YmluYXNjaWl9Ci1cbW9kdWxlc3lub3BzaXN7VG9vbHMgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBiaW5hcnkgYW5kIHZhcmlvdXMKLSAgICAgICAgICAgICAgICBcQVNDSUktZW5jb2RlZCBiaW5hcnkgcmVwcmVzZW50YXRpb25zLn0KLQotCi1UaGUgXG1vZHVsZXtiaW5hc2NpaX0gbW9kdWxlIGNvbnRhaW5zIGEgbnVtYmVyIG9mIG1ldGhvZHMgdG8gY29udmVydAotYmV0d2VlbiBiaW5hcnkgYW5kIHZhcmlvdXMgXEFTQ0lJLWVuY29kZWQgYmluYXJ5Ci1yZXByZXNlbnRhdGlvbnMuIE5vcm1hbGx5LCB5b3Ugd2lsbCBub3QgdXNlIHRoZXNlIGZ1bmN0aW9ucyBkaXJlY3RseQotYnV0IHVzZSB3cmFwcGVyIG1vZHVsZXMgbGlrZSBccmVmbW9kdWxle3V1fVxyZWZzdG1vZGluZGV4e3V1fSwKLVxyZWZtb2R1bGV7YmFzZTY0fVxyZWZzdG1vZGluZGV4e2Jhc2U2NH0sIG9yCi1ccmVmbW9kdWxle2JpbmhleH1ccmVmc3Rtb2RpbmRleHtiaW5oZXh9IGluc3RlYWQuIFRoZSBcbW9kdWxle2JpbmFzY2lpfSBtb2R1bGUKLWNvbnRhaW5zIGxvdy1sZXZlbCBmdW5jdGlvbnMgd3JpdHRlbiBpbiBDIGZvciBncmVhdGVyIHNwZWVkCi10aGF0IGFyZSB1c2VkIGJ5IHRoZSBoaWdoZXItbGV2ZWwgbW9kdWxlcy4KLQotVGhlIFxtb2R1bGV7YmluYXNjaWl9IG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgotCi1cYmVnaW57ZnVuY2Rlc2N9e2EyYl91dX17c3RyaW5nfQotQ29udmVydCBhIHNpbmdsZSBsaW5lIG9mIHV1ZW5jb2RlZCBkYXRhIGJhY2sgdG8gYmluYXJ5IGFuZCByZXR1cm4gdGhlCi1iaW5hcnkgZGF0YS4gTGluZXMgbm9ybWFsbHkgY29udGFpbiA0NSAoYmluYXJ5KSBieXRlcywgZXhjZXB0IGZvciB0aGUKLWxhc3QgbGluZS4gTGluZSBkYXRhIG1heSBiZSBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtiMmFfdXV9e2RhdGF9Ci1Db252ZXJ0IGJpbmFyeSBkYXRhIHRvIGEgbGluZSBvZiBcQVNDSUl7fSBjaGFyYWN0ZXJzLCB0aGUgcmV0dXJuIHZhbHVlCi1pcyB0aGUgY29udmVydGVkIGxpbmUsIGluY2x1ZGluZyBhIG5ld2xpbmUgY2hhci4gVGhlIGxlbmd0aCBvZgotXHZhcntkYXRhfSBzaG91bGQgYmUgYXQgbW9zdCA0NS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317YTJiX2Jhc2U2NH17c3RyaW5nfQotQ29udmVydCBhIGJsb2NrIG9mIGJhc2U2NCBkYXRhIGJhY2sgdG8gYmluYXJ5IGFuZCByZXR1cm4gdGhlCi1iaW5hcnkgZGF0YS4gTW9yZSB0aGFuIG9uZSBsaW5lIG1heSBiZSBwYXNzZWQgYXQgYSB0aW1lLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtiMmFfYmFzZTY0fXtkYXRhfQotQ29udmVydCBiaW5hcnkgZGF0YSB0byBhIGxpbmUgb2YgXEFTQ0lJe30gY2hhcmFjdGVycyBpbiBiYXNlNjQgY29kaW5nLgotVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgY29udmVydGVkIGxpbmUsIGluY2x1ZGluZyBhIG5ld2xpbmUgY2hhci4KLVRoZSBsZW5ndGggb2YgXHZhcntkYXRhfSBzaG91bGQgYmUgYXQgbW9zdCA1NyB0byBhZGhlcmUgdG8gdGhlIGJhc2U2NAotc3RhbmRhcmQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2EyYl9xcH17c3RyaW5nXG9wdGlvbmFseywgaGVhZGVyfX0KLUNvbnZlcnQgYSBibG9jayBvZiBxdW90ZWQtcHJpbnRhYmxlIGRhdGEgYmFjayB0byBiaW5hcnkgYW5kIHJldHVybiB0aGUKLWJpbmFyeSBkYXRhLiBNb3JlIHRoYW4gb25lIGxpbmUgbWF5IGJlIHBhc3NlZCBhdCBhIHRpbWUuCi1JZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgXHZhcntoZWFkZXJ9IGlzIHByZXNlbnQgYW5kIHRydWUsIHVuZGVyc2NvcmVzCi13aWxsIGJlIGRlY29kZWQgYXMgc3BhY2VzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtiMmFfcXB9e2RhdGFcb3B0aW9uYWx7LCBxdW90ZXRhYnMsIGlzdGV4dCwgaGVhZGVyfX0KLUNvbnZlcnQgYmluYXJ5IGRhdGEgdG8gYSBsaW5lKHMpIG9mIFxBU0NJSXt9IGNoYXJhY3RlcnMgaW4KLXF1b3RlZC1wcmludGFibGUgZW5jb2RpbmcuICBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBjb252ZXJ0ZWQgbGluZShzKS4KLUlmIHRoZSBvcHRpb25hbCBhcmd1bWVudCBcdmFye3F1b3RldGFic30gaXMgcHJlc2VudCBhbmQgdHJ1ZSwgYWxsIHRhYnMKLWFuZCBzcGFjZXMgd2lsbCBiZSBlbmNvZGVkLiAgCi1JZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgXHZhcntpc3RleHR9IGlzIHByZXNlbnQgYW5kIHRydWUsCi1uZXdsaW5lcyBhcmUgbm90IGVuY29kZWQgYnV0IHRyYWlsaW5nIHdoaXRlc3BhY2Ugd2lsbCBiZSBlbmNvZGVkLgotSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IFx2YXJ7aGVhZGVyfSBpcwotcHJlc2VudCBhbmQgdHJ1ZSwgc3BhY2VzIHdpbGwgYmUgZW5jb2RlZCBhcyB1bmRlcnNjb3JlcyBwZXIgUkZDMTUyMi4KLUlmIHRoZSBvcHRpb25hbCBhcmd1bWVudCBcdmFye2hlYWRlcn0gaXMgcHJlc2VudCBhbmQgZmFsc2UsIG5ld2xpbmUKLWNoYXJhY3RlcnMgd2lsbCBiZSBlbmNvZGVkIGFzIHdlbGw7IG90aGVyd2lzZSBsaW5lZmVlZCBjb252ZXJzaW9uIG1pZ2h0Ci1jb3JydXB0IHRoZSBiaW5hcnkgZGF0YSBzdHJlYW0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2EyYl9ocXh9e3N0cmluZ30KLUNvbnZlcnQgYmluaGV4NCBmb3JtYXR0ZWQgXEFTQ0lJe30gZGF0YSB0byBiaW5hcnksIHdpdGhvdXQgZG9pbmcKLVJMRS1kZWNvbXByZXNzaW9uLiBUaGUgc3RyaW5nIHNob3VsZCBjb250YWluIGEgY29tcGxldGUgbnVtYmVyIG9mCi1iaW5hcnkgYnl0ZXMsIG9yIChpbiBjYXNlIG9mIHRoZSBsYXN0IHBvcnRpb24gb2YgdGhlIGJpbmhleDQgZGF0YSkKLWhhdmUgdGhlIHJlbWFpbmluZyBiaXRzIHplcm8uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3JsZWRlY29kZV9ocXh9e2RhdGF9Ci1QZXJmb3JtIFJMRS1kZWNvbXByZXNzaW9uIG9uIHRoZSBkYXRhLCBhcyBwZXIgdGhlIGJpbmhleDQKLXN0YW5kYXJkLiBUaGUgYWxnb3JpdGhtIHVzZXMgXGNvZGV7MHg5MH0gYWZ0ZXIgYSBieXRlIGFzIGEgcmVwZWF0Ci1pbmRpY2F0b3IsIGZvbGxvd2VkIGJ5IGEgY291bnQuIEEgY291bnQgb2YgXGNvZGV7MH0gc3BlY2lmaWVzIGEgYnl0ZQotdmFsdWUgb2YgXGNvZGV7MHg5MH0uIFRoZSByb3V0aW5lIHJldHVybnMgdGhlIGRlY29tcHJlc3NlZCBkYXRhLAotdW5sZXNzIGRhdGEgaW5wdXQgZGF0YSBlbmRzIGluIGFuIG9ycGhhbmVkIHJlcGVhdCBpbmRpY2F0b3IsIGluIHdoaWNoCi1jYXNlIHRoZSBcZXhjZXB0aW9ue0luY29tcGxldGV9IGV4Y2VwdGlvbiBpcyByYWlzZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3JsZWNvZGVfaHF4fXtkYXRhfQotUGVyZm9ybSBiaW5oZXg0IHN0eWxlIFJMRS1jb21wcmVzc2lvbiBvbiBcdmFye2RhdGF9IGFuZCByZXR1cm4gdGhlCi1yZXN1bHQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2IyYV9ocXh9e2RhdGF9Ci1QZXJmb3JtIGhleGJpbjQgYmluYXJ5LXRvLVxBU0NJSXt9IHRyYW5zbGF0aW9uIGFuZCByZXR1cm4gdGhlCi1yZXN1bHRpbmcgc3RyaW5nLiBUaGUgYXJndW1lbnQgc2hvdWxkIGFscmVhZHkgYmUgUkxFLWNvZGVkLCBhbmQgaGF2ZSBhCi1sZW5ndGggZGl2aXNpYmxlIGJ5IDMgKGV4Y2VwdCBwb3NzaWJseSB0aGUgbGFzdCBmcmFnbWVudCkuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2NyY19ocXh9e2RhdGEsIGNyY30KLUNvbXB1dGUgdGhlIGJpbmhleDQgY3JjIHZhbHVlIG9mIFx2YXJ7ZGF0YX0sIHN0YXJ0aW5nIHdpdGggYW4gaW5pdGlhbAotXHZhcntjcmN9IGFuZCByZXR1cm5pbmcgdGhlIHJlc3VsdC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y3JjMzJ9e2RhdGFcb3B0aW9uYWx7LCBjcmN9fQotQ29tcHV0ZSBDUkMtMzIsIHRoZSAzMi1iaXQgY2hlY2tzdW0gb2YgZGF0YSwgc3RhcnRpbmcgd2l0aCBhbiBpbml0aWFsCi1jcmMuICBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgWklQIGZpbGUgY2hlY2tzdW0uICBTaW5jZSB0aGUKLWFsZ29yaXRobSBpcyBkZXNpZ25lZCBmb3IgdXNlIGFzIGEgY2hlY2tzdW0gYWxnb3JpdGhtLCBpdCBpcyBub3QKLXN1aXRhYmxlIGZvciB1c2UgYXMgYSBnZW5lcmFsIGhhc2ggYWxnb3JpdGhtLiAgVXNlIGFzIGZvbGxvd3M6Ci1cYmVnaW57dmVyYmF0aW19Ci0gICAgcHJpbnQgYmluYXNjaWkuY3JjMzIoImhlbGxvIHdvcmxkIikKLSAgICAjIE9yLCBpbiB0d28gcGllY2VzOgotICAgIGNyYyA9IGJpbmFzY2lpLmNyYzMyKCJoZWxsbyIpCi0gICAgY3JjID0gYmluYXNjaWkuY3JjMzIoIiB3b3JsZCIsIGNyYykKLSAgICBwcmludCBjcmMKLVxlbmR7dmVyYmF0aW19Ci1cZW5ke2Z1bmNkZXNjfQotIAotXGJlZ2lue2Z1bmNkZXNjfXtiMmFfaGV4fXtkYXRhfQotXGZ1bmNsaW5le2hleGxpZnl9e2RhdGF9Ci1SZXR1cm4gdGhlIGhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBiaW5hcnkgXHZhcntkYXRhfS4gIEV2ZXJ5Ci1ieXRlIG9mIFx2YXJ7ZGF0YX0gaXMgY29udmVydGVkIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgMi1kaWdpdCBoZXgKLXJlcHJlc2VudGF0aW9uLiAgVGhlIHJlc3VsdGluZyBzdHJpbmcgaXMgdGhlcmVmb3JlIHR3aWNlIGFzIGxvbmcgYXMKLXRoZSBsZW5ndGggb2YgXHZhcntkYXRhfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317YTJiX2hleH17aGV4c3RyfQotXGZ1bmNsaW5le3VuaGV4bGlmeX17aGV4c3RyfQotUmV0dXJuIHRoZSBiaW5hcnkgZGF0YSByZXByZXNlbnRlZCBieSB0aGUgaGV4YWRlY2ltYWwgc3RyaW5nCi1cdmFye2hleHN0cn0uICBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBpbnZlcnNlIG9mIFxmdW5jdGlvbntiMmFfaGV4KCl9LgotXHZhcntoZXhzdHJ9IG11c3QgY29udGFpbiBhbiBldmVuIG51bWJlciBvZiBoZXhhZGVjaW1hbCBkaWdpdHMgKHdoaWNoCi1jYW4gYmUgdXBwZXIgb3IgbG93ZXIgY2FzZSksIG90aGVyd2lzZSBhIFxleGNlcHRpb257VHlwZUVycm9yfSBpcwotcmFpc2VkLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e0Vycm9yfQotRXhjZXB0aW9uIHJhaXNlZCBvbiBlcnJvcnMuIFRoZXNlIGFyZSB1c3VhbGx5IHByb2dyYW1taW5nIGVycm9ycy4KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e0luY29tcGxldGV9Ci1FeGNlcHRpb24gcmFpc2VkIG9uIGluY29tcGxldGUgZGF0YS4gVGhlc2UgYXJlIHVzdWFsbHkgbm90IHByb2dyYW1taW5nCi1lcnJvcnMsIGJ1dCBtYXkgYmUgaGFuZGxlZCBieSByZWFkaW5nIGEgbGl0dGxlIG1vcmUgZGF0YSBhbmQgdHJ5aW5nCi1hZ2Fpbi4KLVxlbmR7ZXhjZGVzY30KLQotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZW1vZHVsZXtiYXNlNjR9e1N1cHBvcnQgZm9yIGJhc2U2NCBlbmNvZGluZyB1c2VkIGluIE1JTUUgZW1haWwgbWVzc2FnZXMufQotCi0gIFxzZWVtb2R1bGV7YmluaGV4fXtTdXBwb3J0IGZvciB0aGUgYmluaGV4IGZvcm1hdCB1c2VkIG9uIHRoZSBNYWNpbnRvc2gufQotCi0gIFxzZWVtb2R1bGV7dXV9e1N1cHBvcnQgZm9yIFVVIGVuY29kaW5nIHVzZWQgb24gXFVOSVgufQotCi0gIFxzZWVtb2R1bGV7cXVvcHJpfXtTdXBwb3J0IGZvciBxdW90ZWQtcHJpbnRhYmxlIGVuY29kaW5nIHVzZWQgaW4gTUlNRSBlbWFpbCBtZXNzYWdlcy4gfQotXGVuZHtzZWVhbHNvfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJiaW5oZXgudGV4IGIvRG9jL2xpYi9saWJiaW5oZXgudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzBmMmI0Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGliYmluaGV4LnRleAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7YmluaGV4fSAtLS0KLSAgICAgICAgIEVuY29kZSBhbmQgZGVjb2RlIGJpbmhleDQgZmlsZXN9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtiaW5oZXh9Ci1cbW9kdWxlc3lub3BzaXN7RW5jb2RlIGFuZCBkZWNvZGUgZmlsZXMgaW4gYmluaGV4NCBmb3JtYXQufQotCi0KLVRoaXMgbW9kdWxlIGVuY29kZXMgYW5kIGRlY29kZXMgZmlsZXMgaW4gYmluaGV4NCBmb3JtYXQsIGEgZm9ybWF0Ci1hbGxvd2luZyByZXByZXNlbnRhdGlvbiBvZiBNYWNpbnRvc2ggZmlsZXMgaW4gXEFTQ0lJLiAgT24gdGhlIE1hY2ludG9zaCwKLWJvdGggZm9ya3Mgb2YgYSBmaWxlIGFuZCB0aGUgZmluZGVyIGluZm9ybWF0aW9uIGFyZSBlbmNvZGVkIChvcgotZGVjb2RlZCksIG9uIG90aGVyIHBsYXRmb3JtcyBvbmx5IHRoZSBkYXRhIGZvcmsgaXMgaGFuZGxlZC4KLQotVGhlIFxtb2R1bGV7YmluaGV4fSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKLQotXGJlZ2lue2Z1bmNkZXNjfXtiaW5oZXh9e2lucHV0LCBvdXRwdXR9Ci1Db252ZXJ0IGEgYmluYXJ5IGZpbGUgd2l0aCBmaWxlbmFtZSBcdmFye2lucHV0fSB0byBiaW5oZXggZmlsZQotXHZhcntvdXRwdXR9LiBUaGUgXHZhcntvdXRwdXR9IHBhcmFtZXRlciBjYW4gZWl0aGVyIGJlIGEgZmlsZW5hbWUgb3IgYQotZmlsZS1saWtlIG9iamVjdCAoYW55IG9iamVjdCBzdXBwb3J0aW5nIGEgXG1ldGhvZHt3cml0ZSgpfSBhbmQKLVxtZXRob2R7Y2xvc2UoKX0gbWV0aG9kKS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aGV4YmlufXtpbnB1dFxvcHRpb25hbHssIG91dHB1dH19Ci1EZWNvZGUgYSBiaW5oZXggZmlsZSBcdmFye2lucHV0fS4gXHZhcntpbnB1dH0gbWF5IGJlIGEgZmlsZW5hbWUgb3IgYQotZmlsZS1saWtlIG9iamVjdCBzdXBwb3J0aW5nIFxtZXRob2R7cmVhZCgpfSBhbmQgXG1ldGhvZHtjbG9zZSgpfSBtZXRob2RzLgotVGhlIHJlc3VsdGluZyBmaWxlIGlzIHdyaXR0ZW4gdG8gYSBmaWxlIG5hbWVkIFx2YXJ7b3V0cHV0fSwgdW5sZXNzIHRoZQotYXJndW1lbnQgaXMgb21pdHRlZCBpbiB3aGljaCBjYXNlIHRoZSBvdXRwdXQgZmlsZW5hbWUgaXMgcmVhZCBmcm9tIHRoZQotYmluaGV4IGZpbGUuCi1cZW5ke2Z1bmNkZXNjfQotCi1UaGUgZm9sbG93aW5nIGV4Y2VwdGlvbiBpcyBhbHNvIGRlZmluZWQ6Ci0KLVxiZWdpbntleGNkZXNjfXtFcnJvcn0KLUV4Y2VwdGlvbiByYWlzZWQgd2hlbiBzb21ldGhpbmcgY2FuJ3QgYmUgZW5jb2RlZCB1c2luZyB0aGUgYmluaGV4Ci1mb3JtYXQgKGZvciBleGFtcGxlLCBhIGZpbGVuYW1lIGlzIHRvbyBsb25nIHRvIGZpdCBpbiB0aGUgZmlsZW5hbWUKLWZpZWxkKSwgb3Igd2hlbiBpbnB1dCBpcyBub3QgcHJvcGVybHkgZW5jb2RlZCBiaW5oZXggZGF0YS4KLVxlbmR7ZXhjZGVzY30KLQotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZW1vZHVsZXtiaW5hc2NpaX17U3VwcG9ydCBtb2R1bGUgY29udGFpbmluZyBcQVNDSUktdG8tYmluYXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgIGFuZCBiaW5hcnktdG8tXEFTQ0lJe30gY29udmVyc2lvbnMufQotXGVuZHtzZWVhbHNvfQotCi0KLVxzdWJzZWN0aW9ue05vdGVzIFxsYWJlbHtiaW5oZXgtbm90ZXN9fQotCi1UaGVyZSBpcyBhbiBhbHRlcm5hdGl2ZSwgbW9yZSBwb3dlcmZ1bCBpbnRlcmZhY2UgdG8gdGhlIGNvZGVyIGFuZAotZGVjb2Rlciwgc2VlIHRoZSBzb3VyY2UgZm9yIGRldGFpbHMuCi0KLUlmIHlvdSBjb2RlIG9yIGRlY29kZSB0ZXh0ZmlsZXMgb24gbm9uLU1hY2ludG9zaCBwbGF0Zm9ybXMgdGhleSB3aWxsCi1zdGlsbCB1c2UgdGhlIE1hY2ludG9zaCBuZXdsaW5lIGNvbnZlbnRpb24gKGNhcnJpYWdlLXJldHVybiBhcyBlbmQgb2YKLWxpbmUpLgotCi1BcyBvZiB0aGlzIHdyaXRpbmcsIFxmdW5jdGlvbntoZXhiaW4oKX0gYXBwZWFycyB0byBub3Qgd29yayBpbiBhbGwKLWNhc2VzLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJiaXNlY3QudGV4IGIvRG9jL2xpYi9saWJiaXNlY3QudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTZlNWNmLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGliYmlzZWN0LnRleAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7YmlzZWN0fSAtLS0KLSAgICAgICAgIEFycmF5IGJpc2VjdGlvbiBhbGdvcml0aG19Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtiaXNlY3R9Ci1cbW9kdWxlc3lub3BzaXN7QXJyYXkgYmlzZWN0aW9uIGFsZ29yaXRobXMgZm9yIGJpbmFyeSBzZWFyY2hpbmcufQotXHNlY3Rpb25hdXRob3J7RnJlZCBMLiBEcmFrZSwgSnIufXtmZHJha2VAYWNtLm9yZ30KLSUgTGFUZVggcHJvZHVjZWQgYnkgRnJlZCBMLiBEcmFrZSwgSnIuIDxmZHJha2VAYWNtLm9yZz4sIHdpdGggYW4KLSUgZXhhbXBsZSBiYXNlZCBvbiB0aGUgUHlNb2R1bGVzIEZBUSBlbnRyeSBieSBBYXJvbiBXYXR0ZXJzCi0lIDxhcndAcHl0aG9ucHJvcy5jb20+LgotCi0KLVRoaXMgbW9kdWxlIHByb3ZpZGVzIHN1cHBvcnQgZm9yIG1haW50YWluaW5nIGEgbGlzdCBpbiBzb3J0ZWQgb3JkZXIKLXdpdGhvdXQgaGF2aW5nIHRvIHNvcnQgdGhlIGxpc3QgYWZ0ZXIgZWFjaCBpbnNlcnRpb24uICBGb3IgbG9uZyBsaXN0cwotb2YgaXRlbXMgd2l0aCBleHBlbnNpdmUgY29tcGFyaXNvbiBvcGVyYXRpb25zLCB0aGlzIGNhbiBiZSBhbgotaW1wcm92ZW1lbnQgb3ZlciB0aGUgbW9yZSBjb21tb24gYXBwcm9hY2guICBUaGUgbW9kdWxlIGlzIGNhbGxlZAotXG1vZHVsZXtiaXNlY3R9IGJlY2F1c2UgaXQgdXNlcyBhIGJhc2ljIGJpc2VjdGlvbiBhbGdvcml0aG0gdG8gZG8gaXRzCi13b3JrLiAgVGhlIHNvdXJjZSBjb2RlIG1heSBiZSBtb3N0IHVzZWZ1bCBhcyBhIHdvcmtpbmcgZXhhbXBsZSBvZiB0aGUKLWFsZ29yaXRobSAodGhlIGJvdW5kYXJ5IGNvbmRpdGlvbnMgYXJlIGFscmVhZHkgcmlnaHQhKS4KLQotVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHByb3ZpZGVkOgotCi1cYmVnaW57ZnVuY2Rlc2N9e2Jpc2VjdF9sZWZ0fXtsaXN0LCBpdGVtXG9wdGlvbmFseywgbG9cb3B0aW9uYWx7LCBoaX19fQotICBMb2NhdGUgdGhlIHByb3BlciBpbnNlcnRpb24gcG9pbnQgZm9yIFx2YXJ7aXRlbX0gaW4gXHZhcntsaXN0fSB0bwotICBtYWludGFpbiBzb3J0ZWQgb3JkZXIuICBUaGUgcGFyYW1ldGVycyBcdmFye2xvfSBhbmQgXHZhcntoaX0gbWF5IGJlCi0gIHVzZWQgdG8gc3BlY2lmeSBhIHN1YnNldCBvZiB0aGUgbGlzdCB3aGljaCBzaG91bGQgYmUgY29uc2lkZXJlZDsgYnkKLSAgZGVmYXVsdCB0aGUgZW50aXJlIGxpc3QgaXMgdXNlZC4gIElmIFx2YXJ7aXRlbX0gaXMgYWxyZWFkeSBwcmVzZW50Ci0gIGluIFx2YXJ7bGlzdH0sIHRoZSBpbnNlcnRpb24gcG9pbnQgd2lsbCBiZSBiZWZvcmUgKHRvIHRoZSBsZWZ0IG9mKQotICBhbnkgZXhpc3RpbmcgZW50cmllcy4gIFRoZSByZXR1cm4gdmFsdWUgaXMgc3VpdGFibGUgZm9yIHVzZSBhcyB0aGUKLSAgZmlyc3QgcGFyYW1ldGVyIHRvIFxjb2Rle1x2YXJ7bGlzdH0uaW5zZXJ0KCl9LiAgVGhpcyBhc3N1bWVzIHRoYXQKLSAgXHZhcntsaXN0fSBpcyBhbHJlYWR5IHNvcnRlZC4KLVx2ZXJzaW9uYWRkZWR7Mi4xfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtiaXNlY3RfcmlnaHR9e2xpc3QsIGl0ZW1cb3B0aW9uYWx7LCBsb1xvcHRpb25hbHssIGhpfX19Ci0gIFNpbWlsYXIgdG8gXGZ1bmN0aW9ue2Jpc2VjdF9sZWZ0KCl9LCBidXQgcmV0dXJucyBhbiBpbnNlcnRpb24gcG9pbnQKLSAgd2hpY2ggY29tZXMgYWZ0ZXIgKHRvIHRoZSByaWdodCBvZikgYW55IGV4aXN0aW5nIGVudHJpZXMgb2YKLSAgXHZhcntpdGVtfSBpbiBcdmFye2xpc3R9LgotXHZlcnNpb25hZGRlZHsyLjF9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2Jpc2VjdH17XHVuc3BlY2lmaWVkfQotICBBbGlhcyBmb3IgXGZ1bmN0aW9ue2Jpc2VjdF9yaWdodCgpfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aW5zb3J0X2xlZnR9e2xpc3QsIGl0ZW1cb3B0aW9uYWx7LCBsb1xvcHRpb25hbHssIGhpfX19Ci0gIEluc2VydCBcdmFye2l0ZW19IGluIFx2YXJ7bGlzdH0gaW4gc29ydGVkIG9yZGVyLiAgVGhpcyBpcyBlcXVpdmFsZW50Ci0gIHRvIFxjb2Rle1x2YXJ7bGlzdH0uaW5zZXJ0KGJpc2VjdC5iaXNlY3RfbGVmdChcdmFye2xpc3R9LCBcdmFye2l0ZW19LAotICBcdmFye2xvfSwgXHZhcntoaX0pLCBcdmFye2l0ZW19KX0uICBUaGlzIGFzc3VtZXMgdGhhdCBcdmFye2xpc3R9IGlzCi0gIGFscmVhZHkgc29ydGVkLgotXHZlcnNpb25hZGRlZHsyLjF9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2luc29ydF9yaWdodH17bGlzdCwgaXRlbVxvcHRpb25hbHssIGxvXG9wdGlvbmFseywgaGl9fX0KLSAgU2ltaWxhciB0byBcZnVuY3Rpb257aW5zb3J0X2xlZnQoKX0sIGJ1dCBpbnNlcnRpbmcgXHZhcntpdGVtfSBpbgotICBcdmFye2xpc3R9IGFmdGVyIGFueSBleGlzdGluZyBlbnRyaWVzIG9mIFx2YXJ7aXRlbX0uCi1cdmVyc2lvbmFkZGVkezIuMX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aW5zb3J0fXtcdW5zcGVjaWZpZWR9Ci0gIEFsaWFzIGZvciBcZnVuY3Rpb257aW5zb3J0X3JpZ2h0KCl9LgotXGVuZHtmdW5jZGVzY30KLQotCi1cc3Vic2VjdGlvbntFeGFtcGxlc30KLVxub2RlbmFtZXtiaXNlY3QtZXhhbXBsZX0KLQotVGhlIFxmdW5jdGlvbntiaXNlY3QoKX0gZnVuY3Rpb24gaXMgZ2VuZXJhbGx5IHVzZWZ1bCBmb3IgY2F0ZWdvcml6aW5nCi1udW1lcmljIGRhdGEuICBUaGlzIGV4YW1wbGUgdXNlcyBcZnVuY3Rpb257YmlzZWN0KCl9IHRvIGxvb2sgdXAgYQotbGV0dGVyIGdyYWRlIGZvciBhbiBleGFtIHRvdGFsIChzYXkpIGJhc2VkIG9uIGEgc2V0IG9mIG9yZGVyZWQgbnVtZXJpYwotYnJlYWtwb2ludHM6IDg1IGFuZCB1cCBpcyBhbiBgQScsIDc1Li44NCBpcyBhIGBCJywgZXRjLgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZ3JhZGVzID0gIkZFRENCQSIKLT4+PiBicmVha3BvaW50cyA9IFszMCwgNDQsIDY2LCA3NSwgODVdCi0+Pj4gZnJvbSBiaXNlY3QgaW1wb3J0IGJpc2VjdAotPj4+IGRlZiBncmFkZSh0b3RhbCk6Ci0uLi4gICAgICAgICAgIHJldHVybiBncmFkZXNbYmlzZWN0KGJyZWFrcG9pbnRzLCB0b3RhbCldCi0uLi4KLT4+PiBncmFkZSg2NikKLSdDJwotPj4+IG1hcChncmFkZSwgWzMzLCA5OSwgNzcsIDQ0LCAxMiwgODhdKQotWydFJywgJ0EnLCAnQicsICdEJywgJ0YnLCAnQSddCi0KLVxlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmJsdGluLnRleCBiL0RvYy9saWIvbGliYmx0aW4udGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmFiZTI1Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGliYmx0aW4udGV4CisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtfX2J1aWx0aW5fX30gLS0tCi0gICAgICAgICBCdWlsdC1pbiBvYmplY3RzfQotCi1cZGVjbGFyZW1vZHVsZVtidWlsdGluXXtidWlsdGlufXtfX2J1aWx0aW5fX30KLVxtb2R1bGVzeW5vcHNpc3tUaGUgbW9kdWxlIHRoYXQgcHJvdmlkZXMgdGhlIGJ1aWx0LWluIG5hbWVzcGFjZS59Ci0KLQotVGhpcyBtb2R1bGUgcHJvdmlkZXMgZGlyZWN0IGFjY2VzcyB0byBhbGwgYGJ1aWx0LWluJyBpZGVudGlmaWVycyBvZgotUHl0aG9uOyBmb3IgZXhhbXBsZSwgXGNvZGV7X19idWlsdGluX18ub3Blbn0gaXMgdGhlIGZ1bGwgbmFtZSBmb3IgdGhlCi1idWlsdC1pbiBmdW5jdGlvbiBcZnVuY3Rpb257b3BlbigpfS4gIFNlZSBjaGFwdGVyflxyZWZ7YnVpbHRpbn0sCi1gYEJ1aWx0LWluIE9iamVjdHMuJycKLQotVGhpcyBtb2R1bGUgaXMgbm90IG5vcm1hbGx5IGFjY2Vzc2VkIGV4cGxpY2l0bHkgYnkgbW9zdCBhcHBsaWNhdGlvbnMsCi1idXQgY2FuIGJlIHVzZWZ1bCBpbiBtb2R1bGVzIHRoYXQgcHJvdmlkZSBvYmplY3RzIHdpdGggdGhlIHNhbWUgbmFtZQotYXMgYSBidWlsdC1pbiB2YWx1ZSwgYnV0IGluIHdoaWNoIHRoZSBidWlsdC1pbiBvZiB0aGF0IG5hbWUgaXMgYWxzbwotbmVlZGVkLiAgRm9yIGV4YW1wbGUsIGluIGEgbW9kdWxlIHRoYXQgd2FudHMgdG8gaW1wbGVtZW50IGFuCi1cZnVuY3Rpb257b3BlbigpfSBmdW5jdGlvbiB0aGF0IHdyYXBzIHRoZSBidWlsdC1pbiBcZnVuY3Rpb257b3BlbigpfSwKLXRoaXMgbW9kdWxlIGNhbiBiZSB1c2VkIGRpcmVjdGx5OgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgX19idWlsdGluX18KLQotZGVmIG9wZW4ocGF0aCk6Ci0gICAgZiA9IF9fYnVpbHRpbl9fLm9wZW4ocGF0aCwgJ3InKQotICAgIHJldHVybiBVcHBlckNhc2VyKGYpCi0KLWNsYXNzIFVwcGVyQ2FzZXI6Ci0gICAgJycnV3JhcHBlciBhcm91bmQgYSBmaWxlIHRoYXQgY29udmVydHMgb3V0cHV0IHRvIHVwcGVyLWNhc2UuJycnCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgZik6Ci0gICAgICAgIHNlbGYuX2YgPSBmCi0KLSAgICBkZWYgcmVhZChzZWxmLCBjb3VudD0tMSk6Ci0gICAgICAgIHJldHVybiBzZWxmLl9mLnJlYWQoY291bnQpLnVwcGVyKCkKLQotICAgICMgLi4uCi1cZW5ke3ZlcmJhdGltfQotCi1BcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwsIG1vc3QgbW9kdWxlcyBoYXZlIHRoZSBuYW1lCi1cY29kZXtfX2J1aWx0aW5zX199IChub3RlIHRoZSBcY2hhcmFjdGVye3N9KSBtYWRlIGF2YWlsYWJsZSBhcyBwYXJ0IG9mCi10aGVpciBnbG9iYWxzLiAgVGhlIHZhbHVlIG9mIFxjb2Rle19fYnVpbHRpbnNfX30gaXMgbm9ybWFsbHkgZWl0aGVyCi10aGlzIG1vZHVsZSBvciB0aGUgdmFsdWUgb2YgdGhpcyBtb2R1bGVzJ3MgXG1lbWJlcntfX2RpY3RfX30KLWF0dHJpYnV0ZS4gIFNpbmNlIHRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLCBpdCBtYXkgbm90IGJlIHVzZWQKLWJ5IGFsdGVybmF0ZSBpbXBsZW1lbnRhdGlvbnMgb2YgUHl0aG9uLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJic2RkYi50ZXggYi9Eb2MvbGliL2xpYmJzZGRiLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYyMzMyNC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmJzZGRiLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle2JzZGRifSAtLS0KLSAgICAgICAgIEludGVyZmFjZSB0byBCZXJrZWxleSBEQiBsaWJyYXJ5fQotCi1cZGVjbGFyZW1vZHVsZXtleHRlbnNpb259e2JzZGRifQotXG1vZHVsZXN5bm9wc2lze0ludGVyZmFjZSB0byBCZXJrZWxleSBEQiBkYXRhYmFzZSBsaWJyYXJ5fQotXHNlY3Rpb25hdXRob3J7U2tpcCBNb250YW5hcm99e3NraXBAbW9qYW0uY29tfQotCi0KLVRoZSBcbW9kdWxle2JzZGRifSBtb2R1bGUgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIHRoZSBCZXJrZWxleSBEQgotbGlicmFyeS4gIFVzZXJzIGNhbiBjcmVhdGUgaGFzaCwgYnRyZWUgb3IgcmVjb3JkIGJhc2VkIGxpYnJhcnkgZmlsZXMKLXVzaW5nIHRoZSBhcHByb3ByaWF0ZSBvcGVuIGNhbGwuIEJzZGRiIG9iamVjdHMgYmVoYXZlIGdlbmVyYWxseSBsaWtlCi1kaWN0aW9uYXJpZXMuICBLZXlzIGFuZCB2YWx1ZXMgbXVzdCBiZSBzdHJpbmdzLCBob3dldmVyLCBzbyB0byB1c2UKLW90aGVyIG9iamVjdHMgYXMga2V5cyBvciB0byBzdG9yZSBvdGhlciBraW5kcyBvZiBvYmplY3RzIHRoZSB1c2VyIG11c3QKLXNlcmlhbGl6ZSB0aGVtIHNvbWVob3csIHR5cGljYWxseSB1c2luZyBcZnVuY3Rpb257bWFyc2hhbC5kdW1wcygpfSBvciAKLVxmdW5jdGlvbntwaWNrbGUuZHVtcHMoKX0uCi0KLVRoZSBcbW9kdWxle2JzZGRifSBtb2R1bGUgcmVxdWlyZXMgYSBCZXJrZWxleSBEQiBsaWJyYXJ5IHZlcnNpb24gZnJvbQotMy4zIHRocnUgNC41LgotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZXVybHtodHRwOi8vcHlic2RkYi5zb3VyY2Vmb3JnZS5uZXQvfQotICAgICAgICAge1RoZSB3ZWJzaXRlIHdpdGggZG9jdW1lbnRhdGlvbiBmb3IgdGhlIFxtb2R1bGV7YnNkZGIuZGJ9Ci0gICAgICAgICAgUHl0aG9uIEJlcmtlbGV5IERCIGludGVyZmFjZSB0aGF0IGNsb3NlbHkgbWlycm9ycyB0aGUgb2JqZWN0Ci0gICAgICAgICAgb3JpZW50ZWQgaW50ZXJmYWNlIHByb3ZpZGVkIGluIEJlcmtlbGV5IERCIDMgYW5kIDQufQotCi0gIFxzZWV1cmx7aHR0cDovL3d3dy5vcmFjbGUuY29tL2RhdGFiYXNlL2JlcmtlbGV5LWRiL30KLSAgICAgICAgIHtUaGUgQmVya2VsZXkgREIgbGlicmFyeS59Ci1cZW5ke3NlZWFsc299Ci0KLUEgbW9yZSBtb2Rlcm4gREIsIERCRW52IGFuZCBEQlNlcXVlbmNlIG9iamVjdCBpbnRlcmZhY2UgaXMgYXZhaWxhYmxlIGluIHRoZQotXG1vZHVsZXtic2RkYi5kYn0gbW9kdWxlIHdoaWNoIGNsb3NlbHkgbWF0Y2hlcyB0aGUgQmVya2VsZXkgREIgQyBBUEkKLWRvY3VtZW50ZWQgYXQgdGhlIGFib3ZlIFVSTHMuICBBZGRpdGlvbmFsIGZlYXR1cmVzIHByb3ZpZGVkIGJ5IHRoZQotXG1vZHVsZXtic2RkYi5kYn0gQVBJIGluY2x1ZGUgZmluZSB0dW5pbmcsIHRyYW5zYWN0aW9ucywgbG9nZ2luZywgYW5kCi1tdWx0aXByb2Nlc3MgY29uY3VycmVudCBkYXRhYmFzZSBhY2Nlc3MuCi0KLVRoZSBmb2xsb3dpbmcgaXMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgbGVnYWN5IFxtb2R1bGV7YnNkZGJ9IGludGVyZmFjZQotY29tcGF0aWJsZSB3aXRoIHRoZSBvbGQgUHl0aG9uIGJzZGRiIG1vZHVsZS4gIFN0YXJ0aW5nIGluIFB5dGhvbiAyLjUgdGhpcwotaW50ZXJmYWNlIHNob3VsZCBiZSBzYWZlIGZvciBtdWx0aXRocmVhZGVkIGFjY2Vzcy4gIFRoZSBcbW9kdWxle2JzZGRiLmRifQotQVBJIGlzIHJlY29tbWVuZGVkIGZvciB0aHJlYWRpbmcgdXNlcnMgYXMgaXQgcHJvdmlkZXMgYmV0dGVyIGNvbnRyb2wuCi0KLVRoZSBcbW9kdWxle2JzZGRifSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyB0aGF0IGNyZWF0ZQotb2JqZWN0cyB0aGF0IGFjY2VzcyB0aGUgYXBwcm9wcmlhdGUgdHlwZSBvZiBCZXJrZWxleSBEQiBmaWxlLiAgVGhlCi1maXJzdCB0d28gYXJndW1lbnRzIG9mIGVhY2ggZnVuY3Rpb24gYXJlIHRoZSBzYW1lLiAgRm9yIGVhc2Ugb2YKLXBvcnRhYmlsaXR5LCBvbmx5IHRoZSBmaXJzdCB0d28gYXJndW1lbnRzIHNob3VsZCBiZSB1c2VkIGluIG1vc3QKLWluc3RhbmNlcy4KLQotXGJlZ2lue2Z1bmNkZXNjfXtoYXNob3Blbn17ZmlsZW5hbWVcb3B0aW9uYWx7LCBmbGFnXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVcb3B0aW9uYWx7LCBwZ3NpemVcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZhY3RvclxvcHRpb25hbHssIG5lbGVtXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlc2l6ZVxvcHRpb25hbHssIGxvcmRlclxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBoZmxhZ3N9fX19fX19fX0KLU9wZW4gdGhlIGhhc2ggZm9ybWF0IGZpbGUgbmFtZWQgXHZhcntmaWxlbmFtZX0uICBGaWxlcyBuZXZlciBpbnRlbmRlZAotdG8gYmUgcHJlc2VydmVkIG9uIGRpc2sgbWF5IGJlIGNyZWF0ZWQgYnkgcGFzc2luZyBcY29kZXtOb25lfSBhcyB0aGUgCi1cdmFye2ZpbGVuYW1lfS4gIFRoZSBvcHRpb25hbAotXHZhcntmbGFnfSBpZGVudGlmaWVzIHRoZSBtb2RlIHVzZWQgdG8gb3BlbiB0aGUgZmlsZS4gIEl0IG1heSBiZQotXGNoYXJhY3RlcntyfSAocmVhZCBvbmx5KSwgXGNoYXJhY3Rlcnt3fSAocmVhZC13cml0ZSkgLAotXGNoYXJhY3RlcntjfSAocmVhZC13cml0ZSAtIGNyZWF0ZSBpZiBuZWNlc3Nhcnk7IHRoZSBkZWZhdWx0KSBvcgotXGNoYXJhY3RlcntufSAocmVhZC13cml0ZSAtIHRydW5jYXRlIHRvIHplcm8gbGVuZ3RoKS4gIFRoZSBvdGhlcgotYXJndW1lbnRzIGFyZSByYXJlbHkgdXNlZCBhbmQgYXJlIGp1c3QgcGFzc2VkIHRvIHRoZSBsb3ctbGV2ZWwKLVxjZnVuY3Rpb257ZGJvcGVuKCl9IGZ1bmN0aW9uLiAgQ29uc3VsdCB0aGUgQmVya2VsZXkgREIgZG9jdW1lbnRhdGlvbgotZm9yIHRoZWlyIHVzZSBhbmQgaW50ZXJwcmV0YXRpb24uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2J0b3Blbn17ZmlsZW5hbWVcb3B0aW9uYWx7LCBmbGFnXG9wdGlvbmFseywKLW1vZGVcb3B0aW9uYWx7LCBidGZsYWdzXG9wdGlvbmFseywgY2FjaGVzaXplXG9wdGlvbmFseywgbWF4a2V5cGFnZVxvcHRpb25hbHssCi1taW5rZXlwYWdlXG9wdGlvbmFseywgcGdzaXplXG9wdGlvbmFseywgbG9yZGVyfX19fX19fX19Ci0KLU9wZW4gdGhlIGJ0cmVlIGZvcm1hdCBmaWxlIG5hbWVkIFx2YXJ7ZmlsZW5hbWV9LiAgRmlsZXMgbmV2ZXIgaW50ZW5kZWQgCi10byBiZSBwcmVzZXJ2ZWQgb24gZGlzayBtYXkgYmUgY3JlYXRlZCBieSBwYXNzaW5nIFxjb2Rle05vbmV9IGFzIHRoZSAKLVx2YXJ7ZmlsZW5hbWV9LiAgVGhlIG9wdGlvbmFsCi1cdmFye2ZsYWd9IGlkZW50aWZpZXMgdGhlIG1vZGUgdXNlZCB0byBvcGVuIHRoZSBmaWxlLiAgSXQgbWF5IGJlCi1cY2hhcmFjdGVye3J9IChyZWFkIG9ubHkpLCBcY2hhcmFjdGVye3d9IChyZWFkLXdyaXRlKSwKLVxjaGFyYWN0ZXJ7Y30gKHJlYWQtd3JpdGUgLSBjcmVhdGUgaWYgbmVjZXNzYXJ5OyB0aGUgZGVmYXVsdCkgb3IKLVxjaGFyYWN0ZXJ7bn0gKHJlYWQtd3JpdGUgLSB0cnVuY2F0ZSB0byB6ZXJvIGxlbmd0aCkuICBUaGUgb3RoZXIKLWFyZ3VtZW50cyBhcmUgcmFyZWx5IHVzZWQgYW5kIGFyZSBqdXN0IHBhc3NlZCB0byB0aGUgbG93LWxldmVsIGRib3BlbgotZnVuY3Rpb24uICBDb25zdWx0IHRoZSBCZXJrZWxleSBEQiBkb2N1bWVudGF0aW9uIGZvciB0aGVpciB1c2UgYW5kCi1pbnRlcnByZXRhdGlvbi4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cm5vcGVufXtmaWxlbmFtZVxvcHRpb25hbHssIGZsYWdcb3B0aW9uYWx7LCBtb2RlXG9wdGlvbmFseywKLXJuZmxhZ3Ncb3B0aW9uYWx7LCBjYWNoZXNpemVcb3B0aW9uYWx7LCBwZ3NpemVcb3B0aW9uYWx7LCBsb3JkZXJcb3B0aW9uYWx7LAotcmxlblxvcHRpb25hbHssIGRlbGltXG9wdGlvbmFseywgc291cmNlXG9wdGlvbmFseywgcGFkfX19fX19fX19fX0KLQotT3BlbiBhIERCIHJlY29yZCBmb3JtYXQgZmlsZSBuYW1lZCBcdmFye2ZpbGVuYW1lfS4gIEZpbGVzIG5ldmVyIGludGVuZGVkIAotdG8gYmUgcHJlc2VydmVkIG9uIGRpc2sgbWF5IGJlIGNyZWF0ZWQgYnkgcGFzc2luZyBcY29kZXtOb25lfSBhcyB0aGUgCi1cdmFye2ZpbGVuYW1lfS4gIFRoZSBvcHRpb25hbAotXHZhcntmbGFnfSBpZGVudGlmaWVzIHRoZSBtb2RlIHVzZWQgdG8gb3BlbiB0aGUgZmlsZS4gIEl0IG1heSBiZQotXGNoYXJhY3RlcntyfSAocmVhZCBvbmx5KSwgXGNoYXJhY3Rlcnt3fSAocmVhZC13cml0ZSksCi1cY2hhcmFjdGVye2N9IChyZWFkLXdyaXRlIC0gY3JlYXRlIGlmIG5lY2Vzc2FyeTsgdGhlIGRlZmF1bHQpIG9yCi1cY2hhcmFjdGVye259IChyZWFkLXdyaXRlIC0gdHJ1bmNhdGUgdG8gemVybyBsZW5ndGgpLiAgVGhlIG90aGVyCi1hcmd1bWVudHMgYXJlIHJhcmVseSB1c2VkIGFuZCBhcmUganVzdCBwYXNzZWQgdG8gdGhlIGxvdy1sZXZlbCBkYm9wZW4KLWZ1bmN0aW9uLiAgQ29uc3VsdCB0aGUgQmVya2VsZXkgREIgZG9jdW1lbnRhdGlvbiBmb3IgdGhlaXIgdXNlIGFuZAotaW50ZXJwcmV0YXRpb24uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtTdHJpbmdLZXlzfXtkYn0KLSAgV3JhcHBlciBjbGFzcyBhcm91bmQgYSBEQiBvYmplY3QgdGhhdCBzdXBwb3J0cyBzdHJpbmcga2V5cwotICAocmF0aGVyIHRoYW4gYnl0ZXMpLiBBbGwga2V5cyBhcmUgZW5jb2RlZCBhcyBVVEYtOCwgdGhlbiBwYXNzZWQKLSAgdG8gdGhlIHVuZGVybHlpbmcgb2JqZWN0LiBcdmVyc2lvbmFkZGVkezMuMH0KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtTdHJpbmdWYWx1ZXN9e2RifQotICBXcmFwcGVyIGNsYXNzIGFyb3VuZCBhIERCIG9iamVjdCB0aGF0IHN1cHBvcnRzIHN0cmluZyB2YWx1ZXMKLSAgKHJhdGhlciB0aGFuIGJ5dGVzKS4gQWxsIHZhbHVlcyBhcmUgZW5jb2RlZCBhcyBVVEYtOCwgdGhlbiBwYXNzZWQKLSAgdG8gdGhlIHVuZGVybHlpbmcgb2JqZWN0LiBcdmVyc2lvbmFkZGVkezMuMH0KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZW1vZHVsZXtkYmhhc2h9e0RCTS1zdHlsZSBpbnRlcmZhY2UgdG8gdGhlIFxtb2R1bGV7YnNkZGJ9fQotXGVuZHtzZWVhbHNvfQotCi1cc3Vic2VjdGlvbntIYXNoLCBCVHJlZSBhbmQgUmVjb3JkIE9iamVjdHMgXGxhYmVse2JzZGRiLW9iamVjdHN9fQotCi1PbmNlIGluc3RhbnRpYXRlZCwgaGFzaCwgYnRyZWUgYW5kIHJlY29yZCBvYmplY3RzIHN1cHBvcnQKLXRoZSBzYW1lIG1ldGhvZHMgYXMgZGljdGlvbmFyaWVzLiAgSW4gYWRkaXRpb24sIHRoZXkgc3VwcG9ydAotdGhlIG1ldGhvZHMgbGlzdGVkIGJlbG93LgotXHZlcnNpb25jaGFuZ2VkW0FkZGVkIGRpY3Rpb25hcnkgbWV0aG9kc117Mi4zLjF9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtic2RkYm9iamVjdF17Y2xvc2V9e30KLUNsb3NlIHRoZSB1bmRlcmx5aW5nIGZpbGUuICBUaGUgb2JqZWN0IGNhbiBubyBsb25nZXIgYmUgYWNjZXNzZWQuICBTaW5jZQotdGhlcmUgaXMgbm8gb3BlbiBcbWV0aG9ke29wZW59IG1ldGhvZCBmb3IgdGhlc2Ugb2JqZWN0cywgdG8gb3BlbiB0aGUgZmlsZQotYWdhaW4gYSBuZXcgXG1vZHVsZXtic2RkYn0gbW9kdWxlIG9wZW4gZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtic2RkYm9iamVjdF17a2V5c317fQotUmV0dXJuIHRoZSBsaXN0IG9mIGtleXMgY29udGFpbmVkIGluIHRoZSBEQiBmaWxlLiAgVGhlIG9yZGVyIG9mIHRoZSBsaXN0IGlzCi11bnNwZWNpZmllZCBhbmQgc2hvdWxkIG5vdCBiZSByZWxpZWQgb24uICBJbiBwYXJ0aWN1bGFyLCB0aGUgb3JkZXIgb2YgdGhlCi1saXN0IHJldHVybmVkIGlzIGRpZmZlcmVudCBmb3IgZGlmZmVyZW50IGZpbGUgZm9ybWF0cy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2JzZGRib2JqZWN0XXtoYXNfa2V5fXtrZXl9Ci1SZXR1cm4gXGNvZGV7MX0gaWYgdGhlIERCIGZpbGUgY29udGFpbnMgdGhlIGFyZ3VtZW50IGFzIGEga2V5LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bYnNkZGJvYmplY3Rde3NldF9sb2NhdGlvbn17a2V5fQotU2V0IHRoZSBjdXJzb3IgdG8gdGhlIGl0ZW0gaW5kaWNhdGVkIGJ5IFx2YXJ7a2V5fSBhbmQgcmV0dXJuIGEgdHVwbGUKLWNvbnRhaW5pbmcgdGhlIGtleSBhbmQgaXRzIHZhbHVlLiAgRm9yIGJpbmFyeSB0cmVlIGRhdGFiYXNlcyAob3BlbmVkCi11c2luZyBcZnVuY3Rpb257YnRvcGVuKCl9KSwgaWYgXHZhcntrZXl9IGRvZXMgbm90IGFjdHVhbGx5IGV4aXN0IGluCi10aGUgZGF0YWJhc2UsIHRoZSBjdXJzb3Igd2lsbCBwb2ludCB0byB0aGUgbmV4dCBpdGVtIGluIHNvcnRlZCBvcmRlcgotYW5kIHJldHVybiB0aGF0IGtleSBhbmQgdmFsdWUuICBGb3Igb3RoZXIgZGF0YWJhc2VzLAotXGV4Y2VwdGlvbntLZXlFcnJvcn0gd2lsbCBiZSByYWlzZWQgaWYgXHZhcntrZXl9IGlzIG5vdCBmb3VuZCBpbiB0aGUKLWRhdGFiYXNlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bYnNkZGJvYmplY3Rde2ZpcnN0fXt9Ci1TZXQgdGhlIGN1cnNvciB0byB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgREIgZmlsZSBhbmQgcmV0dXJuIGl0LiAgVGhlIG9yZGVyIG9mIAota2V5cyBpbiB0aGUgZmlsZSBpcyB1bnNwZWNpZmllZCwgZXhjZXB0IGluIHRoZSBjYXNlIG9mIEItVHJlZSBkYXRhYmFzZXMuCi1UaGlzIG1ldGhvZCByYWlzZXMgXGV4Y2VwdGlvbntic2RkYi5lcnJvcn0gaWYgdGhlIGRhdGFiYXNlIGlzIGVtcHR5LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bYnNkZGJvYmplY3Rde25leHR9e30KLVNldCB0aGUgY3Vyc29yIHRvIHRoZSBuZXh0IGl0ZW0gaW4gdGhlIERCIGZpbGUgYW5kIHJldHVybiBpdC4gIFRoZSBvcmRlciBvZiAKLWtleXMgaW4gdGhlIGZpbGUgaXMgdW5zcGVjaWZpZWQsIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBCLVRyZWUgZGF0YWJhc2VzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bYnNkZGJvYmplY3Rde3ByZXZpb3VzfXt9Ci1TZXQgdGhlIGN1cnNvciB0byB0aGUgcHJldmlvdXMgaXRlbSBpbiB0aGUgREIgZmlsZSBhbmQgcmV0dXJuIGl0LiAgVGhlCi1vcmRlciBvZiBrZXlzIGluIHRoZSBmaWxlIGlzIHVuc3BlY2lmaWVkLCBleGNlcHQgaW4gdGhlIGNhc2Ugb2YgQi1UcmVlCi1kYXRhYmFzZXMuICBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgb24gaGFzaHRhYmxlIGRhdGFiYXNlcyAodGhvc2Ugb3BlbmVkCi13aXRoIFxmdW5jdGlvbntoYXNob3BlbigpfSkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtic2RkYm9iamVjdF17bGFzdH17fQotU2V0IHRoZSBjdXJzb3IgdG8gdGhlIGxhc3QgaXRlbSBpbiB0aGUgREIgZmlsZSBhbmQgcmV0dXJuIGl0LiAgVGhlCi1vcmRlciBvZiBrZXlzIGluIHRoZSBmaWxlIGlzIHVuc3BlY2lmaWVkLiAgVGhpcyBpcyBub3Qgc3VwcG9ydGVkIG9uCi1oYXNodGFibGUgZGF0YWJhc2VzICh0aG9zZSBvcGVuZWQgd2l0aCBcZnVuY3Rpb257aGFzaG9wZW4oKX0pLgotVGhpcyBtZXRob2QgcmFpc2VzIFxleGNlcHRpb257YnNkZGIuZXJyb3J9IGlmIHRoZSBkYXRhYmFzZSBpcyBlbXB0eS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2JzZGRib2JqZWN0XXtzeW5jfXt9Ci1TeW5jaHJvbml6ZSB0aGUgZGF0YWJhc2Ugb24gZGlzay4KLVxlbmR7bWV0aG9kZGVzY30KLQotRXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGltcG9ydCBic2RkYgotPj4+IGRiID0gYnNkZGIuYnRvcGVuKCcvdG1wL3NwYW0uZGInLCAnYycpCi0+Pj4gZm9yIGkgaW4gcmFuZ2UoMTApOiBkYlsnJWQnJWldID0gJyVkJyUgKGkqaSkKLS4uLiAKLT4+PiBkYlsnMyddCi0nOScKLT4+PiBkYi5rZXlzKCkKLVsnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOSddCi0+Pj4gZGIuZmlyc3QoKQotKCcwJywgJzAnKQotPj4+IGRiLm5leHQoKQotKCcxJywgJzEnKQotPj4+IGRiLmxhc3QoKQotKCc5JywgJzgxJykKLT4+PiBkYi5zZXRfbG9jYXRpb24oJzInKQotKCcyJywgJzQnKQotPj4+IGRiLnByZXZpb3VzKCkgCi0oJzEnLCAnMScpCi0+Pj4gZm9yIGssIHYgaW4gZGIuaXRlcml0ZW1zKCk6Ci0uLi4gICAgIHByaW50IGssIHYKLTAgMAotMSAxCi0yIDQKLTMgOQotNCAxNgotNSAyNQotNiAzNgotNyA0OQotOCA2NAotOSA4MQotPj4+ICc4JyBpbiBkYgotVHJ1ZQotPj4+IGRiLnN5bmMoKQotMAotXGVuZHt2ZXJiYXRpbX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliYnoyLnRleCBiL0RvYy9saWIvbGliYnoyLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZiYzBkMi4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmJ6Mi50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtiejJ9IC0tLQotICAgICAgICAgQ29tcHJlc3Npb24gY29tcGF0aWJsZSB3aXRoIFxwcm9ncmFte2J6aXAyfX0KLQotXGRlY2xhcmVtb2R1bGV7YnVpbHRpbn17YnoyfQotXG1vZHVsZXN5bm9wc2lze0ludGVyZmFjZSB0byBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgotICAgICAgICAgICAgICAgIHJvdXRpbmVzIGNvbXBhdGlibGUgd2l0aCBccHJvZ3JhbXtiemlwMn0ufQotXG1vZHVsZWF1dGhvcntHdXN0YXZvIE5pZW1leWVyfXtuaWVtZXllckBjb25lY3RpdmEuY29tfQotXHNlY3Rpb25hdXRob3J7R3VzdGF2byBOaWVtZXllcn17bmllbWV5ZXJAY29uZWN0aXZhLmNvbX0KLQotXHZlcnNpb25hZGRlZHsyLjN9Ci0KLVRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgY29tcHJlaGVuc2l2ZSBpbnRlcmZhY2UgZm9yIHRoZSBiejIgY29tcHJlc3Npb24gbGlicmFyeS4KLUl0IGltcGxlbWVudHMgYSBjb21wbGV0ZSBmaWxlIGludGVyZmFjZSwgb25lLXNob3QgKGRlKWNvbXByZXNzaW9uIGZ1bmN0aW9ucywKLWFuZCB0eXBlcyBmb3Igc2VxdWVudGlhbCAoZGUpY29tcHJlc3Npb24uCi0KLUhlcmUgaXMgYSByZXN1bWUgb2YgdGhlIGZlYXR1cmVzIG9mZmVyZWQgYnkgdGhlIGJ6MiBtb2R1bGU6Ci0KLVxiZWdpbntpdGVtaXplfQotXGl0ZW0gXGNsYXNze0JaMkZpbGV9IGNsYXNzIGltcGxlbWVudHMgYSBjb21wbGV0ZSBmaWxlIGludGVyZmFjZSwgaW5jbHVkaW5nCi0gICAgICBcbWV0aG9ke3JlYWRsaW5lKCl9LCBcbWV0aG9ke3JlYWRsaW5lcygpfSwKLSAgICAgIFxtZXRob2R7d3JpdGVsaW5lcygpfSwgXG1ldGhvZHtzZWVrKCl9LCBldGM7Ci1caXRlbSBcY2xhc3N7QloyRmlsZX0gY2xhc3MgaW1wbGVtZW50cyBlbXVsYXRlZCBcbWV0aG9ke3NlZWsoKX0gc3VwcG9ydDsKLVxpdGVtIFxjbGFzc3tCWjJGaWxlfSBjbGFzcyBpbXBsZW1lbnRzIHVuaXZlcnNhbCBuZXdsaW5lIHN1cHBvcnQ7Ci1caXRlbSBcY2xhc3N7QloyRmlsZX0gY2xhc3Mgb2ZmZXJzIGFuIG9wdGltaXplZCBsaW5lIGl0ZXJhdGlvbiB1c2luZwotICAgICAgdGhlIHJlYWRhaGVhZCBhbGdvcml0aG0gYm9ycm93ZWQgZnJvbSBmaWxlIG9iamVjdHM7Ci1caXRlbSBTZXF1ZW50aWFsIChkZSljb21wcmVzc2lvbiBzdXBwb3J0ZWQgYnkgXGNsYXNze0JaMkNvbXByZXNzb3J9IGFuZAotICAgICAgXGNsYXNze0JaMkRlY29tcHJlc3Nvcn0gY2xhc3NlczsKLVxpdGVtIE9uZS1zaG90IChkZSljb21wcmVzc2lvbiBzdXBwb3J0ZWQgYnkgXGZ1bmN0aW9ue2NvbXByZXNzKCl9IGFuZAotICAgICAgXGZ1bmN0aW9ue2RlY29tcHJlc3MoKX0gZnVuY3Rpb25zOwotXGl0ZW0gVGhyZWFkIHNhZmV0eSB1c2VzIGluZGl2aWR1YWwgbG9ja2luZyBtZWNoYW5pc207Ci1caXRlbSBDb21wbGV0ZSBpbmxpbmUgZG9jdW1lbnRhdGlvbjsKLVxlbmR7aXRlbWl6ZX0KLQotCi1cc3Vic2VjdGlvbnsoRGUpY29tcHJlc3Npb24gb2YgZmlsZXN9Ci0KLUhhbmRsaW5nIG9mIGNvbXByZXNzZWQgZmlsZXMgaXMgb2ZmZXJlZCBieSB0aGUgXGNsYXNze0JaMkZpbGV9IGNsYXNzLgotCi1cYmVnaW57Y2xhc3NkZXNjfXtCWjJGaWxlfXtmaWxlbmFtZVxvcHRpb25hbHssIG1vZGVcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyaW5nXG9wdGlvbmFseywgY29tcHJlc3NsZXZlbH19fX0KLU9wZW4gYSBiejIgZmlsZS4gTW9kZSBjYW4gYmUgZWl0aGVyIFxjb2RleydyJ30gb3IgXGNvZGV7J3cnfSwgZm9yIHJlYWRpbmcgCi0oZGVmYXVsdCkgb3Igd3JpdGluZy4gV2hlbiBvcGVuZWQgZm9yIHdyaXRpbmcsIHRoZSBmaWxlIHdpbGwgYmUgY3JlYXRlZCBpZgotaXQgZG9lc24ndCBleGlzdCwgYW5kIHRydW5jYXRlZCBvdGhlcndpc2UuIElmIFx2YXJ7YnVmZmVyaW5nfSBpcyBnaXZlbiwKLVxjb2RlezB9IG1lYW5zIHVuYnVmZmVyZWQsIGFuZCBsYXJnZXIgbnVtYmVycyBzcGVjaWZ5IHRoZSBidWZmZXIgc2l6ZTsKLXRoZSBkZWZhdWx0IGlzIFxjb2RlezB9LiBJZgotXHZhcntjb21wcmVzc2xldmVsfSBpcyBnaXZlbiwgaXQgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIFxjb2RlezF9IGFuZAotXGNvZGV7OX07IHRoZSBkZWZhdWx0IGlzIFxjb2Rlezl9LgotQWRkIGEgXGNoYXJhY3RlcntVfSB0byBtb2RlIHRvIG9wZW4gdGhlIGZpbGUgZm9yIGlucHV0IHdpdGggdW5pdmVyc2FsIG5ld2xpbmUKLXN1cHBvcnQuIEFueSBsaW5lIGVuZGluZyBpbiB0aGUgaW5wdXQgZmlsZSB3aWxsIGJlIHNlZW4gYXMgYQotXGNoYXJhY3RlcntcZSBufSBpbiBQeXRob24uICBBbHNvLCBhIGZpbGUgc28gb3BlbmVkIGdhaW5zIHRoZQotYXR0cmlidXRlIFxtZW1iZXJ7bmV3bGluZXN9OyB0aGUgdmFsdWUgZm9yIHRoaXMgYXR0cmlidXRlIGlzIG9uZSBvZgotXGNvZGV7Tm9uZX0gKG5vIG5ld2xpbmUgcmVhZCB5ZXQpLCBcY29kZXsnXGUgcid9LCBcY29kZXsnXGUgbid9LAotXGNvZGV7J1xlIHJcZSBuJ30gb3IgYSB0dXBsZSBjb250YWluaW5nIGFsbCB0aGUgbmV3bGluZSB0eXBlcwotc2Vlbi4gVW5pdmVyc2FsIG5ld2xpbmVzIGFyZSBhdmFpbGFibGUgb25seSB3aGVuIHJlYWRpbmcuCi1JbnN0YW5jZXMgc3VwcG9ydCBpdGVyYXRpb24gaW4gdGhlIHNhbWUgd2F5IGFzIG5vcm1hbCBcY2xhc3N7ZmlsZX0KLWluc3RhbmNlcy4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQloyRmlsZV17Y2xvc2V9e30KLUNsb3NlIHRoZSBmaWxlLiBTZXRzIGRhdGEgYXR0cmlidXRlIFxtZW1iZXJ7Y2xvc2VkfSB0byB0cnVlLiBBIGNsb3NlZCBmaWxlCi1jYW5ub3QgYmUgdXNlZCBmb3IgZnVydGhlciBJL08gb3BlcmF0aW9ucy4gXG1ldGhvZHtjbG9zZSgpfSBtYXkgYmUgY2FsbGVkCi1tb3JlIHRoYW4gb25jZSB3aXRob3V0IGVycm9yLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQloyRmlsZV17cmVhZH17XG9wdGlvbmFse3NpemV9fQotUmVhZCBhdCBtb3N0IFx2YXJ7c2l6ZX0gdW5jb21wcmVzc2VkIGJ5dGVzLCByZXR1cm5lZCBhcyBhIHN0cmluZy4gSWYgdGhlCi1cdmFye3NpemV9IGFyZ3VtZW50IGlzIG5lZ2F0aXZlIG9yIG9taXR0ZWQsIHJlYWQgdW50aWwgRU9GIGlzIHJlYWNoZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtCWjJGaWxlXXtyZWFkbGluZX17XG9wdGlvbmFse3NpemV9fQotUmV0dXJuIHRoZSBuZXh0IGxpbmUgZnJvbSB0aGUgZmlsZSwgYXMgYSBzdHJpbmcsIHJldGFpbmluZyBuZXdsaW5lLgotQSBub24tbmVnYXRpdmUgXHZhcntzaXplfSBhcmd1bWVudCBsaW1pdHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvCi1yZXR1cm4gKGFuIGluY29tcGxldGUgbGluZSBtYXkgYmUgcmV0dXJuZWQgdGhlbikuIFJldHVybiBhbiBlbXB0eQotc3RyaW5nIGF0IEVPRi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0JaMkZpbGVde3JlYWRsaW5lc317XG9wdGlvbmFse3NpemV9fQotUmV0dXJuIGEgbGlzdCBvZiBsaW5lcyByZWFkLiBUaGUgb3B0aW9uYWwgXHZhcntzaXplfSBhcmd1bWVudCwgaWYgZ2l2ZW4sCi1pcyBhbiBhcHByb3hpbWF0ZSBib3VuZCBvbiB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBsaW5lcyByZXR1cm5lZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0JaMkZpbGVde3NlZWt9e29mZnNldFxvcHRpb25hbHssIHdoZW5jZX19Ci1Nb3ZlIHRvIG5ldyBmaWxlIHBvc2l0aW9uLiBBcmd1bWVudCBcdmFye29mZnNldH0gaXMgYSBieXRlIGNvdW50LiBPcHRpb25hbAotYXJndW1lbnQgXHZhcnt3aGVuY2V9IGRlZmF1bHRzIHRvIFxjb2Rle29zLlNFRUtfU0VUfSBvciBcY29kZXswfSAob2Zmc2V0IGZyb20gc3RhcnQgb2YgZmlsZTsKLW9mZnNldCBzaG91bGQgYmUgXGNvZGV7Pj0gMH0pOyBvdGhlciB2YWx1ZXMgYXJlIFxjb2Rle29zLlNFRUtfQ1VSfSBvciBcY29kZXsxfSAobW92ZSByZWxhdGl2ZSB0bwotY3VycmVudCBwb3NpdGlvbjsgb2Zmc2V0IGNhbiBiZSBwb3NpdGl2ZSBvciBuZWdhdGl2ZSksIGFuZCBcY29kZXtvcy5TRUVLX0VORH0gb3IgXGNvZGV7Mn0gKG1vdmUgcmVsYXRpdmUgdG8gZW5kCi1vZiBmaWxlOyBvZmZzZXQgaXMgdXN1YWxseSBuZWdhdGl2ZSwgYWx0aG91Z2ggbWFueSBwbGF0Zm9ybXMgYWxsb3cgc2Vla2luZyBiZXlvbmQKLXRoZSBlbmQgb2YgYSBmaWxlKS4KLQotTm90ZSB0aGF0IHNlZWtpbmcgb2YgYnoyIGZpbGVzIGlzIGVtdWxhdGVkLCBhbmQgZGVwZW5kaW5nIG9uIHRoZSBwYXJhbWV0ZXJzCi10aGUgb3BlcmF0aW9uIG1heSBiZSBleHRyZW1lbHkgc2xvdy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0JaMkZpbGVde3RlbGx9e30KLVJldHVybiB0aGUgY3VycmVudCBmaWxlIHBvc2l0aW9uLCBhbiBpbnRlZ2VyIChtYXkgYmUgYSBsb25nIGludGVnZXIpLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQloyRmlsZV17d3JpdGV9e2RhdGF9Ci1Xcml0ZSBzdHJpbmcgXHZhcntkYXRhfSB0byBmaWxlLiBOb3RlIHRoYXQgZHVlIHRvIGJ1ZmZlcmluZywgXG1ldGhvZHtjbG9zZSgpfQotbWF5IGJlIG5lZWRlZCBiZWZvcmUgdGhlIGZpbGUgb24gZGlzayByZWZsZWN0cyB0aGUgZGF0YSB3cml0dGVuLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQloyRmlsZV17d3JpdGVsaW5lc317c2VxdWVuY2Vfb2Zfc3RyaW5nc30KLVdyaXRlIHRoZSBzZXF1ZW5jZSBvZiBzdHJpbmdzIHRvIHRoZSBmaWxlLiBOb3RlIHRoYXQgbmV3bGluZXMgYXJlIG5vdCBhZGRlZC4KLVRoZSBzZXF1ZW5jZSBjYW4gYmUgYW55IGl0ZXJhYmxlIG9iamVjdCBwcm9kdWNpbmcgc3RyaW5ncy4gVGhpcyBpcyBlcXVpdmFsZW50Ci10byBjYWxsaW5nIHdyaXRlKCkgZm9yIGVhY2ggc3RyaW5nLgotXGVuZHttZXRob2RkZXNjfQotCi0KLVxzdWJzZWN0aW9ue1NlcXVlbnRpYWwgKGRlKWNvbXByZXNzaW9ufQotCi1TZXF1ZW50aWFsIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIGlzIGRvbmUgdXNpbmcgdGhlIGNsYXNzZXMKLVxjbGFzc3tCWjJDb21wcmVzc29yfSBhbmQgXGNsYXNze0JaMkRlY29tcHJlc3Nvcn0uCi0KLVxiZWdpbntjbGFzc2Rlc2N9e0JaMkNvbXByZXNzb3J9e1xvcHRpb25hbHtjb21wcmVzc2xldmVsfX0KLUNyZWF0ZSBhIG5ldyBjb21wcmVzc29yIG9iamVjdC4gVGhpcyBvYmplY3QgbWF5IGJlIHVzZWQgdG8gY29tcHJlc3MKLWRhdGEgc2VxdWVudGlhbGx5LiBJZiB5b3Ugd2FudCB0byBjb21wcmVzcyBkYXRhIGluIG9uZSBzaG90LCB1c2UgdGhlCi1cZnVuY3Rpb257Y29tcHJlc3MoKX0gZnVuY3Rpb24gaW5zdGVhZC4gVGhlIFx2YXJ7Y29tcHJlc3NsZXZlbH0gcGFyYW1ldGVyLAotaWYgZ2l2ZW4sIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBcY29kZXsxfSBhbmQgXGNvZGV7OX07IHRoZSBkZWZhdWx0Ci1pcyBcY29kZXs5fS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQloyQ29tcHJlc3Nvcl17Y29tcHJlc3N9e2RhdGF9Ci1Qcm92aWRlIG1vcmUgZGF0YSB0byB0aGUgY29tcHJlc3NvciBvYmplY3QuIEl0IHdpbGwgcmV0dXJuIGNodW5rcyBvZiBjb21wcmVzc2VkCi1kYXRhIHdoZW5ldmVyIHBvc3NpYmxlLiBXaGVuIHlvdSd2ZSBmaW5pc2hlZCBwcm92aWRpbmcgZGF0YSB0byBjb21wcmVzcywgY2FsbAotdGhlIFxtZXRob2R7Zmx1c2goKX0gbWV0aG9kIHRvIGZpbmlzaCB0aGUgY29tcHJlc3Npb24gcHJvY2VzcywgYW5kIHJldHVybiB3aGF0Ci1pcyBsZWZ0IGluIGludGVybmFsIGJ1ZmZlcnMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtCWjJDb21wcmVzc29yXXtmbHVzaH17fQotRmluaXNoIHRoZSBjb21wcmVzc2lvbiBwcm9jZXNzIGFuZCByZXR1cm4gd2hhdCBpcyBsZWZ0IGluIGludGVybmFsIGJ1ZmZlcnMuIFlvdQotbXVzdCBub3QgdXNlIHRoZSBjb21wcmVzc29yIG9iamVjdCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtCWjJEZWNvbXByZXNzb3J9e30KLUNyZWF0ZSBhIG5ldyBkZWNvbXByZXNzb3Igb2JqZWN0LiBUaGlzIG9iamVjdCBtYXkgYmUgdXNlZCB0byBkZWNvbXByZXNzCi1kYXRhIHNlcXVlbnRpYWxseS4gSWYgeW91IHdhbnQgdG8gZGVjb21wcmVzcyBkYXRhIGluIG9uZSBzaG90LCB1c2UgdGhlCi1cZnVuY3Rpb257ZGVjb21wcmVzcygpfSBmdW5jdGlvbiBpbnN0ZWFkLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtCWjJEZWNvbXByZXNzb3Jde2RlY29tcHJlc3N9e2RhdGF9Ci1Qcm92aWRlIG1vcmUgZGF0YSB0byB0aGUgZGVjb21wcmVzc29yIG9iamVjdC4gSXQgd2lsbCByZXR1cm4gY2h1bmtzIG9mCi1kZWNvbXByZXNzZWQgZGF0YSB3aGVuZXZlciBwb3NzaWJsZS4gSWYgeW91IHRyeSB0byBkZWNvbXByZXNzIGRhdGEgYWZ0ZXIgdGhlCi1lbmQgb2Ygc3RyZWFtIGlzIGZvdW5kLCBcZXhjZXB0aW9ue0VPRkVycm9yfSB3aWxsIGJlIHJhaXNlZC4gSWYgYW55IGRhdGEgd2FzCi1mb3VuZCBhZnRlciB0aGUgZW5kIG9mIHN0cmVhbSwgaXQnbGwgYmUgaWdub3JlZCBhbmQgc2F2ZWQgaW4KLVxtZW1iZXJ7dW51c2VkXF9kYXRhfSBhdHRyaWJ1dGUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLQotXHN1YnNlY3Rpb257T25lLXNob3QgKGRlKWNvbXByZXNzaW9ufQotCi1PbmUtc2hvdCBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBpcyBwcm92aWRlZCB0aHJvdWdoIHRoZQotXGZ1bmN0aW9ue2NvbXByZXNzKCl9IGFuZCBcZnVuY3Rpb257ZGVjb21wcmVzcygpfSBmdW5jdGlvbnMuCi0KLVxiZWdpbntmdW5jZGVzY317Y29tcHJlc3N9e2RhdGFcb3B0aW9uYWx7LCBjb21wcmVzc2xldmVsfX0KLUNvbXByZXNzIFx2YXJ7ZGF0YX0gaW4gb25lIHNob3QuIElmIHlvdSB3YW50IHRvIGNvbXByZXNzIGRhdGEgc2VxdWVudGlhbGx5LAotdXNlIGFuIGluc3RhbmNlIG9mIFxjbGFzc3tCWjJDb21wcmVzc29yfSBpbnN0ZWFkLiBUaGUgXHZhcntjb21wcmVzc2xldmVsfQotcGFyYW1ldGVyLCBpZiBnaXZlbiwgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIFxjb2RlezF9IGFuZCBcY29kZXs5fTsKLXRoZSBkZWZhdWx0IGlzIFxjb2Rlezl9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtkZWNvbXByZXNzfXtkYXRhfQotRGVjb21wcmVzcyBcdmFye2RhdGF9IGluIG9uZSBzaG90LiBJZiB5b3Ugd2FudCB0byBkZWNvbXByZXNzIGRhdGEKLXNlcXVlbnRpYWxseSwgdXNlIGFuIGluc3RhbmNlIG9mIFxjbGFzc3tCWjJEZWNvbXByZXNzb3J9IGluc3RlYWQuCi1cZW5ke2Z1bmNkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJjYWxlbmRhci50ZXggYi9Eb2MvbGliL2xpYmNhbGVuZGFyLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNmZDJkYS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmNhbGVuZGFyLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle2NhbGVuZGFyfSAtLS0KLSAgICAgICAgIEdlbmVyYWwgY2FsZW5kYXItcmVsYXRlZCBmdW5jdGlvbnN9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtjYWxlbmRhcn0KLVxtb2R1bGVzeW5vcHNpc3tGdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCBjYWxlbmRhcnMsCi0gICAgICAgICAgICAgICAgaW5jbHVkaW5nIHNvbWUgZW11bGF0aW9uIG9mIHRoZSBcVU5JWFwgXHByb2dyYW17Y2FsfQotICAgICAgICAgICAgICAgIHByb2dyYW0ufQotXHNlY3Rpb25hdXRob3J7RHJldyBDc2lsbGFnfXtkcmV3X2NzaWxsYWdAZ2VvY2l0aWVzLmNvbX0KLQotVGhpcyBtb2R1bGUgYWxsb3dzIHlvdSB0byBvdXRwdXQgY2FsZW5kYXJzIGxpa2UgdGhlIFxVTklYe30KLVxwcm9ncmFte2NhbH0gcHJvZ3JhbSwgYW5kIHByb3ZpZGVzIGFkZGl0aW9uYWwgdXNlZnVsIGZ1bmN0aW9ucwotcmVsYXRlZCB0byB0aGUgY2FsZW5kYXIuIEJ5IGRlZmF1bHQsIHRoZXNlIGNhbGVuZGFycyBoYXZlIE1vbmRheSBhcwotdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlaywgYW5kIFN1bmRheSBhcyB0aGUgbGFzdCAodGhlIEV1cm9wZWFuCi1jb252ZW50aW9uKS4gVXNlIFxmdW5jdGlvbntzZXRmaXJzdHdlZWtkYXkoKX0gdG8gc2V0IHRoZSBmaXJzdCBkYXkgb2YgdGhlCi13ZWVrIHRvIFN1bmRheSAoNikgb3IgdG8gYW55IG90aGVyIHdlZWtkYXkuICBQYXJhbWV0ZXJzIHRoYXQgc3BlY2lmeQotZGF0ZXMgYXJlIGdpdmVuIGFzIGludGVnZXJzLgotCi1Nb3N0IG9mIHRoZXNlIGZ1bmN0aW9ucyBhbmQgY2xhc3NzZXMgcmVseSBvbiB0aGUgXG1vZHVsZXtkYXRldGltZX0KLW1vZHVsZSB3aGljaCB1c2VzIGFuIGlkZWFsaXplZCBjYWxlbmRhciwgdGhlIGN1cnJlbnQgR3JlZ29yaWFuCi1jYWxlbmRhciBpbmRlZmluaXRlbHkgZXh0ZW5kZWQgaW4gYm90aCBkaXJlY3Rpb25zLiAgVGhpcyBtYXRjaGVzCi10aGUgZGVmaW5pdGlvbiBvZiB0aGUgInByb2xlcHRpYyBHcmVnb3JpYW4iIGNhbGVuZGFyIGluIERlcnNob3dpdHoKLWFuZCBSZWluZ29sZCdzIGJvb2sgIkNhbGVuZHJpY2FsIENhbGN1bGF0aW9ucyIsIHdoZXJlIGl0J3MgdGhlCi1iYXNlIGNhbGVuZGFyIGZvciBhbGwgY29tcHV0YXRpb25zLgotCi1cYmVnaW57Y2xhc3NkZXNjfXtDYWxlbmRhcn17XG9wdGlvbmFse2ZpcnN0d2Vla2RheX19Ci1DcmVhdGVzIGEgXGNsYXNze0NhbGVuZGFyfSBvYmplY3QuIFx2YXJ7Zmlyc3R3ZWVrZGF5fSBpcyBhbiBpbnRlZ2VyCi1zcGVjaWZ5aW5nIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuIFxjb2RlezB9IGlzIE1vbmRheSAodGhlIGRlZmF1bHQpLAotXGNvZGV7Nn0gaXMgU3VuZGF5LgotCi1BIFxjbGFzc3tDYWxlbmRhcn0gb2JqZWN0IHByb3ZpZGVzIHNldmVyYWwgbWV0aG9kcyB0aGF0IGNhbgotYmUgdXNlZCBmb3IgcHJlcGFyaW5nIHRoZSBjYWxlbmRhciBkYXRhIGZvciBmb3JtYXR0aW5nLiBUaGlzCi1jbGFzcyBkb2Vzbid0IGRvIGFueSBmb3JtYXR0aW5nIGl0c2VsZi4gVGhpcyBpcyB0aGUgam9iIG9mCi1zdWJjbGFzc2VzLgotXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke2NsYXNzZGVzY30KLQotXGNsYXNze0NhbGVuZGFyfSBpbnN0YW5jZXMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtpdGVyd2Vla2RheXN9e3dlZWtkYXl9Ci1SZXR1cm4gYW4gaXRlcmF0b3IgZm9yIHRoZSB3ZWVrIGRheSBudW1iZXJzIHRoYXQgd2lsbCBiZSB1c2VkCi1mb3Igb25lIHdlZWsuIFRoZSBmaXJzdCBudW1iZXIgZnJvbSB0aGUgaXRlcmF0b3Igd2lsbCBiZSB0aGUKLXNhbWUgYXMgdGhlIG51bWJlciByZXR1cm5lZCBieSBcbWV0aG9ke2ZpcnN0d2Vla2RheSgpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2l0ZXJtb250aGRhdGVzfXt5ZWFyLCBtb250aH0KLVJldHVybiBhbiBpdGVyYXRvciBmb3IgdGhlIG1vbnRoIFx2YXJ7bW9udGh9ICgxLTEyKSBpbiB0aGUKLXllYXIgXHZhcnt5ZWFyfS4gVGhpcyBpdGVyYXRvciB3aWxsIHJldHVybiBhbGwgZGF5cyAoYXMKLVxjbGFzc3tkYXRldGltZS5kYXRlfSBvYmplY3RzKSBmb3IgdGhlIG1vbnRoIGFuZCBhbGwgZGF5cwotYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgbW9udGggb3IgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgbW9udGgKLXRoYXQgYXJlIHJlcXVpcmVkIHRvIGdldCBhIGNvbXBsZXRlIHdlZWsuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtpdGVybW9udGhkYXlzMn17eWVhciwgbW9udGh9Ci1SZXR1cm4gYW4gaXRlcmF0b3IgZm9yIHRoZSBtb250aCBcdmFye21vbnRofSBpbiB0aGUgeWVhcgotXHZhcnt5ZWFyfSBzaW1pbGFyIHRvIFxtZXRob2R7aXRlcm1vbnRoZGF0ZXMoKX0uIERheXMgcmV0dXJuZWQKLXdpbGwgYmUgdHVwbGVzIGNvbnNpc3Rpbmcgb2YgYSBkYXkgbnVtYmVyIGFuZCBhIHdlZWsgZGF5Ci1udW1iZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtpdGVybW9udGhkYXlzfXt5ZWFyLCBtb250aH0KLVJldHVybiBhbiBpdGVyYXRvciBmb3IgdGhlIG1vbnRoIFx2YXJ7bW9udGh9IGluIHRoZSB5ZWFyCi1cdmFye3llYXJ9IHNpbWlsYXIgdG8gXG1ldGhvZHtpdGVybW9udGhkYXRlcygpfS4gRGF5cyByZXR1cm5lZAotd2lsbCBzaW1wbHkgYmUgZGF5IG51bWJlcnMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXttb250aGRhdGVzY2FsZW5kYXJ9e3llYXIsIG1vbnRofQotUmV0dXJuIGEgbGlzdCBvZiB0aGUgd2Vla3MgaW4gdGhlIG1vbnRoIFx2YXJ7bW9udGh9IG9mCi10aGUgXHZhcnt5ZWFyfSBhcyBmdWxsIHdlZWtzLiBXZWVrcyBhcmUgbGlzdHMgb2Ygc2V2ZW4KLVxjbGFzc3tkYXRldGltZS5kYXRlfSBvYmplY3RzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317bW9udGhkYXlzMmNhbGVuZGFyfXt5ZWFyLCBtb250aH0KLVJldHVybiBhIGxpc3Qgb2YgdGhlIHdlZWtzIGluIHRoZSBtb250aCBcdmFye21vbnRofSBvZgotdGhlIFx2YXJ7eWVhcn0gYXMgZnVsbCB3ZWVrcy4gV2Vla3MgYXJlIGxpc3RzIG9mIHNldmVuCi10dXBsZXMgb2YgZGF5IG51bWJlcnMgYW5kIHdlZWtkYXkgbnVtYmVycy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e21vbnRoZGF5c2NhbGVuZGFyfXt5ZWFyLCBtb250aH0KLVJldHVybiBhIGxpc3Qgb2YgdGhlIHdlZWtzIGluIHRoZSBtb250aCBcdmFye21vbnRofSBvZgotdGhlIFx2YXJ7eWVhcn0gYXMgZnVsbCB3ZWVrcy4gV2Vla3MgYXJlIGxpc3RzIG9mIHNldmVuCi1kYXkgbnVtYmVycy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3llYXJkYXRlc2NhbGVuZGFyfXt5ZWFyLCBtb250aFxvcHRpb25hbHssIHdpZHRofX0KLVJldHVybiB0aGUgZGF0YSBmb3IgdGhlIHNwZWNpZmllZCB5ZWFyIHJlYWR5IGZvciBmb3JtYXR0aW5nLiBUaGUgcmV0dXJuCi12YWx1ZSBpcyBhIGxpc3Qgb2YgbW9udGggcm93cy4gRWFjaCBtb250aCByb3cgY29udGFpbnMgdXAgdG8gXHZhcnt3aWR0aH0KLW1vbnRocyAoZGVmYXVsdGluZyB0byAzKS4gRWFjaCBtb250aCBjb250YWlucyBiZXR3ZWVuIDQgYW5kIDYgd2Vla3MgYW5kCi1lYWNoIHdlZWsgY29udGFpbnMgMS0tNyBkYXlzLiBEYXlzIGFyZSBcY2xhc3N7ZGF0ZXRpbWUuZGF0ZX0gb2JqZWN0cy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3llYXJkYXlzMmNhbGVuZGFyfXt5ZWFyLCBtb250aFxvcHRpb25hbHssIHdpZHRofX0KLVJldHVybiB0aGUgZGF0YSBmb3IgdGhlIHNwZWNpZmllZCB5ZWFyIHJlYWR5IGZvciBmb3JtYXR0aW5nIChzaW1pbGFyIHRvCi1cbWV0aG9ke3llYXJkYXRlc2NhbGVuZGFyKCl9KS4gRW50cmllcyBpbiB0aGUgd2VlayBsaXN0cyBhcmUgdHVwbGVzIG9mCi1kYXkgbnVtYmVycyBhbmQgd2Vla2RheSBudW1iZXJzLiBEYXkgbnVtYmVycyBvdXRzaWRlIHRoaXMgbW9udGggYXJlIHplcm8uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXt5ZWFyZGF5c2NhbGVuZGFyfXt5ZWFyLCBtb250aFxvcHRpb25hbHssIHdpZHRofX0KLVJldHVybiB0aGUgZGF0YSBmb3IgdGhlIHNwZWNpZmllZCB5ZWFyIHJlYWR5IGZvciBmb3JtYXR0aW5nIChzaW1pbGFyIHRvCi1cbWV0aG9ke3llYXJkYXRlc2NhbGVuZGFyKCl9KS4gRW50cmllcyBpbiB0aGUgd2VlayBsaXN0cyBhcmUgZGF5IG51bWJlcnMuCi1EYXkgbnVtYmVycyBvdXRzaWRlIHRoaXMgbW9udGggYXJlIHplcm8uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLQotXGJlZ2lue2NsYXNzZGVzY317VGV4dENhbGVuZGFyfXtcb3B0aW9uYWx7Zmlyc3R3ZWVrZGF5fX0KLVRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgcGxhaW4gdGV4dCBjYWxlbmRhcnMuCi0KLVx2ZXJzaW9uYWRkZWR7Mi41fQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxjbGFzc3tUZXh0Q2FsZW5kYXJ9IGluc3RhbmNlcyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLQotXGJlZ2lue21ldGhvZGRlc2N9e2Zvcm1hdG1vbnRofXt0aGV5ZWFyLCB0aGVtb250aFxvcHRpb25hbHssIHdcb3B0aW9uYWx7LCBsfX19Ci1SZXR1cm4gYSBtb250aCdzIGNhbGVuZGFyIGluIGEgbXVsdGktbGluZSBzdHJpbmcuIElmIFx2YXJ7d30gaXMKLXByb3ZpZGVkLCBpdCBzcGVjaWZpZXMgdGhlIHdpZHRoIG9mIHRoZSBkYXRlIGNvbHVtbnMsIHdoaWNoIGFyZQotY2VudGVyZWQuIElmIFx2YXJ7bH0gaXMgZ2l2ZW4sIGl0IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGxpbmVzIHRoYXQKLWVhY2ggd2VlayB3aWxsIHVzZS4gRGVwZW5kcyBvbiB0aGUgZmlyc3Qgd2Vla2RheSBhcyBzZXQgYnkKLVxmdW5jdGlvbntzZXRmaXJzdHdlZWtkYXkoKX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtwcm1vbnRofXt0aGV5ZWFyLCB0aGVtb250aFxvcHRpb25hbHssIHdcb3B0aW9uYWx7LCBsfX19Ci1QcmludCBhIG1vbnRoJ3MgY2FsZW5kYXIgYXMgcmV0dXJuZWQgYnkgXG1ldGhvZHtmb3JtYXRtb250aCgpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2Zvcm1hdHllYXJ9e3RoZXllYXIsIHRoZW1vbnRoXG9wdGlvbmFseywgd1xvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbFxvcHRpb25hbHssIGNcb3B0aW9uYWx7LCBtfX19fX0KLVJldHVybiBhIFx2YXJ7bX0tY29sdW1uIGNhbGVuZGFyIGZvciBhbiBlbnRpcmUgeWVhciBhcyBhIG11bHRpLWxpbmUgc3RyaW5nLgotT3B0aW9uYWwgcGFyYW1ldGVycyBcdmFye3d9LCBcdmFye2x9LCBhbmQgXHZhcntjfSBhcmUgZm9yIGRhdGUgY29sdW1uCi13aWR0aCwgbGluZXMgcGVyIHdlZWssIGFuZCBudW1iZXIgb2Ygc3BhY2VzIGJldHdlZW4gbW9udGggY29sdW1ucywKLXJlc3BlY3RpdmVseS4gRGVwZW5kcyBvbiB0aGUgZmlyc3Qgd2Vla2RheSBhcyBzZXQgYnkKLVxtZXRob2R7c2V0Zmlyc3R3ZWVrZGF5KCl9LiAgVGhlIGVhcmxpZXN0IHllYXIgZm9yIHdoaWNoIGEgY2FsZW5kYXIgY2FuCi1iZSBnZW5lcmF0ZWQgaXMgcGxhdGZvcm0tZGVwZW5kZW50LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317cHJ5ZWFyfXt0aGV5ZWFyXG9wdGlvbmFseywgd1xvcHRpb25hbHssIGxcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY1xvcHRpb25hbHssIG19fX19fQotUHJpbnQgdGhlIGNhbGVuZGFyIGZvciBhbiBlbnRpcmUgeWVhciBhcyByZXR1cm5lZCBieSBcbWV0aG9ke2Zvcm1hdHllYXIoKX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLQotXGJlZ2lue2NsYXNzZGVzY317SFRNTENhbGVuZGFyfXtcb3B0aW9uYWx7Zmlyc3R3ZWVrZGF5fX0KLVRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgSFRNTCBjYWxlbmRhcnMuCi0KLVx2ZXJzaW9uYWRkZWR7Mi41fQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxjbGFzc3tIVE1MQ2FsZW5kYXJ9IGluc3RhbmNlcyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLQotXGJlZ2lue21ldGhvZGRlc2N9e2Zvcm1hdG1vbnRofXt0aGV5ZWFyLCB0aGVtb250aFxvcHRpb25hbHssIHdpdGh5ZWFyfX0KLVJldHVybiBhIG1vbnRoJ3MgY2FsZW5kYXIgYXMgYW4gSFRNTCB0YWJsZS4gSWYgXHZhcnt3aXRoeWVhcn0gaXMKLXRydWUgdGhlIHllYXIgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgaGVhZGVyLCBvdGhlcndpc2UganVzdCB0aGUKLW1vbnRoIG5hbWUgd2lsbCBiZSB1c2VkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Zm9ybWF0eWVhcn17dGhleWVhciwgdGhlbW9udGhcb3B0aW9uYWx7LCB3aWR0aH19Ci1SZXR1cm4gYSB5ZWFyJ3MgY2FsZW5kYXIgYXMgYW4gSFRNTCB0YWJsZS4gXHZhcnt3aWR0aH0gKGRlZmF1bHRpbmcgdG8gMykKLXNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIG1vbnRocyBwZXIgcm93LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Zm9ybWF0eWVhcnBhZ2V9e3RoZXllYXIsIHRoZW1vbnRoXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhcb3B0aW9uYWx7LCBjc3Ncb3B0aW9uYWx7LCBlbmNvZGluZ319fX0KLVJldHVybiBhIHllYXIncyBjYWxlbmRhciBhcyBhIGNvbXBsZXRlIEhUTUwgcGFnZS4gXHZhcnt3aWR0aH0KLShkZWZhdWx0aW5nIHRvIDMpIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIG1vbnRocyBwZXIgcm93LiBcdmFye2Nzc30KLWlzIHRoZSBuYW1lIGZvciB0aGUgY2FzY2FkaW5nIHN0eWxlIHNoZWV0IHRvIGJlIHVzZWQuIFxjb25zdGFudHtOb25lfQotY2FuIGJlIHBhc3NlZCBpZiBubyBzdHlsZSBzaGVldCBzaG91bGQgYmUgdXNlZC4gXHZhcntlbmNvZGluZ30KLXNwZWNpZmllcyB0aGUgZW5jb2RpbmcgdG8gYmUgdXNlZCBmb3IgdGhlIG91dHB1dCAoZGVmYXVsdGluZwotdG8gdGhlIHN5c3RlbSBkZWZhdWx0IGVuY29kaW5nKS4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cYmVnaW57Y2xhc3NkZXNjfXtMb2NhbGVUZXh0Q2FsZW5kYXJ9e1xvcHRpb25hbHtmaXJzdHdlZWtkYXlcb3B0aW9uYWx7LCBsb2NhbGV9fX0KLVRoaXMgc3ViY2xhc3Mgb2YgXGNsYXNze1RleHRDYWxlbmRhcn0gY2FuIGJlIHBhc3NlZCBhIGxvY2FsZSBuYW1lIGluIHRoZQotY29uc3RydWN0b3IgYW5kIHdpbGwgcmV0dXJuIG1vbnRoIGFuZCB3ZWVrZGF5IG5hbWVzIGluIHRoZSBzcGVjaWZpZWQgbG9jYWxlLgotSWYgdGhpcyBsb2NhbGUgaW5jbHVkZXMgYW4gZW5jb2RpbmcgYWxsIHN0cmluZ3MgY29udGFpbmluZyBtb250aCBhbmQgd2Vla2RheQotbmFtZXMgd2lsbCBiZSByZXR1cm5lZCBhcyB1bmljb2RlLgotXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke2NsYXNzZGVzY30KLQotCi1cYmVnaW57Y2xhc3NkZXNjfXtMb2NhbGVIVE1MQ2FsZW5kYXJ9e1xvcHRpb25hbHtmaXJzdHdlZWtkYXlcb3B0aW9uYWx7LCBsb2NhbGV9fX0KLVRoaXMgc3ViY2xhc3Mgb2YgXGNsYXNze0hUTUxDYWxlbmRhcn0gY2FuIGJlIHBhc3NlZCBhIGxvY2FsZSBuYW1lIGluIHRoZQotY29uc3RydWN0b3IgYW5kIHdpbGwgcmV0dXJuIG1vbnRoIGFuZCB3ZWVrZGF5IG5hbWVzIGluIHRoZSBzcGVjaWZpZWQgbG9jYWxlLgotSWYgdGhpcyBsb2NhbGUgaW5jbHVkZXMgYW4gZW5jb2RpbmcgYWxsIHN0cmluZ3MgY29udGFpbmluZyBtb250aCBhbmQgd2Vla2RheQotbmFtZXMgd2lsbCBiZSByZXR1cm5lZCBhcyB1bmljb2RlLgotXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke2NsYXNzZGVzY30KLQotCi1Gb3Igc2ltcGxlIHRleHQgY2FsZW5kYXJzIHRoaXMgbW9kdWxlIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zLgotCi1cYmVnaW57ZnVuY2Rlc2N9e3NldGZpcnN0d2Vla2RheX17d2Vla2RheX0KLVNldHMgdGhlIHdlZWtkYXkgKFxjb2RlezB9IGlzIE1vbmRheSwgXGNvZGV7Nn0gaXMgU3VuZGF5KSB0byBzdGFydAotZWFjaCB3ZWVrLiBUaGUgdmFsdWVzIFxjb25zdGFudHtNT05EQVl9LCBcY29uc3RhbnR7VFVFU0RBWX0sCi1cY29uc3RhbnR7V0VETkVTREFZfSwgXGNvbnN0YW50e1RIVVJTREFZfSwgXGNvbnN0YW50e0ZSSURBWX0sCi1cY29uc3RhbnR7U0FUVVJEQVl9LCBhbmQgXGNvbnN0YW50e1NVTkRBWX0gYXJlIHByb3ZpZGVkIGZvcgotY29udmVuaWVuY2UuIEZvciBleGFtcGxlLCB0byBzZXQgdGhlIGZpcnN0IHdlZWtkYXkgdG8gU3VuZGF5OgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgY2FsZW5kYXIKLWNhbGVuZGFyLnNldGZpcnN0d2Vla2RheShjYWxlbmRhci5TVU5EQVkpCi1cZW5ke3ZlcmJhdGltfQotXHZlcnNpb25hZGRlZHsyLjB9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2ZpcnN0d2Vla2RheX17fQotUmV0dXJucyB0aGUgY3VycmVudCBzZXR0aW5nIGZvciB0aGUgd2Vla2RheSB0byBzdGFydCBlYWNoIHdlZWsuCi1cdmVyc2lvbmFkZGVkezIuMH0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aXNsZWFwfXt5ZWFyfQotUmV0dXJucyBcY29uc3RhbnR7VHJ1ZX0gaWYgXHZhcnt5ZWFyfSBpcyBhIGxlYXAgeWVhciwgb3RoZXJ3aXNlCi1cY29uc3RhbnR7RmFsc2V9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtsZWFwZGF5c317eTEsIHkyfQotUmV0dXJucyB0aGUgbnVtYmVyIG9mIGxlYXAgeWVhcnMgaW4gdGhlIHJhbmdlCi1bXHZhcnt5MX1cbGRvdHNcdmFye3kyfSksIHdoZXJlIFx2YXJ7eTF9IGFuZCBcdmFye3kyfSBhcmUgeWVhcnMuCi1cdmVyc2lvbmNoYW5nZWRbVGhpcyBmdW5jdGlvbiBkaWRuJ3Qgd29yayBmb3IgcmFuZ2VzIHNwYW5uaW5nIAotICAgICAgICAgICAgICAgIGEgY2VudHVyeSBjaGFuZ2UgaW4gUHl0aG9uIDEuNS4yXXsyLjB9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3dlZWtkYXl9e3llYXIsIG1vbnRoLCBkYXl9Ci1SZXR1cm5zIHRoZSBkYXkgb2YgdGhlIHdlZWsgKFxjb2RlezB9IGlzIE1vbmRheSkgZm9yIFx2YXJ7eWVhcn0KLShcY29kZXsxOTcwfS0tXGxkb3RzKSwgXHZhcnttb250aH0gKFxjb2RlezF9LS1cY29kZXsxMn0pLCBcdmFye2RheX0KLShcY29kZXsxfS0tXGNvZGV7MzF9KS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317d2Vla2hlYWRlcn17bn0KLVJldHVybiBhIGhlYWRlciBjb250YWluaW5nIGFiYnJldmlhdGVkIHdlZWtkYXkgbmFtZXMuIFx2YXJ7bn0gc3BlY2lmaWVzCi10aGUgd2lkdGggaW4gY2hhcmFjdGVycyBmb3Igb25lIHdlZWtkYXkuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e21vbnRocmFuZ2V9e3llYXIsIG1vbnRofQotUmV0dXJucyB3ZWVrZGF5IG9mIGZpcnN0IGRheSBvZiB0aGUgbW9udGggYW5kIG51bWJlciBvZiBkYXlzIGluIG1vbnRoLCAKLWZvciB0aGUgc3BlY2lmaWVkIFx2YXJ7eWVhcn0gYW5kIFx2YXJ7bW9udGh9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXttb250aGNhbGVuZGFyfXt5ZWFyLCBtb250aH0KLVJldHVybnMgYSBtYXRyaXggcmVwcmVzZW50aW5nIGEgbW9udGgncyBjYWxlbmRhci4gIEVhY2ggcm93IHJlcHJlc2VudHMKLWEgd2VlazsgZGF5cyBvdXRzaWRlIG9mIHRoZSBtb250aCBhIHJlcHJlc2VudGVkIGJ5IHplcm9zLgotRWFjaCB3ZWVrIGJlZ2lucyB3aXRoIE1vbmRheSB1bmxlc3Mgc2V0IGJ5IFxmdW5jdGlvbntzZXRmaXJzdHdlZWtkYXkoKX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3BybW9udGh9e3RoZXllYXIsIHRoZW1vbnRoXG9wdGlvbmFseywgd1xvcHRpb25hbHssIGx9fX0KLVByaW50cyBhIG1vbnRoJ3MgY2FsZW5kYXIgYXMgcmV0dXJuZWQgYnkgXGZ1bmN0aW9ue21vbnRoKCl9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXttb250aH17dGhleWVhciwgdGhlbW9udGhcb3B0aW9uYWx7LCB3XG9wdGlvbmFseywgbH19fQotUmV0dXJucyBhIG1vbnRoJ3MgY2FsZW5kYXIgaW4gYSBtdWx0aS1saW5lIHN0cmluZyB1c2luZyB0aGUKLVxtZXRob2R7Zm9ybWF0bW9udGh9IG9mIHRoZSBcY2xhc3N7VGV4dENhbGVuZGFyfSBjbGFzcy4KLVx2ZXJzaW9uYWRkZWR7Mi4wfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtwcmNhbH17eWVhclxvcHRpb25hbHssIHdcb3B0aW9uYWx7LCBsXG9wdGlvbmFse2N9fX19Ci1QcmludHMgdGhlIGNhbGVuZGFyIGZvciBhbiBlbnRpcmUgeWVhciBhcyByZXR1cm5lZCBieSAKLVxmdW5jdGlvbntjYWxlbmRhcigpfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y2FsZW5kYXJ9e3llYXJcb3B0aW9uYWx7LCB3XG9wdGlvbmFseywgbFxvcHRpb25hbHtjfX19fQotUmV0dXJucyBhIDMtY29sdW1uIGNhbGVuZGFyIGZvciBhbiBlbnRpcmUgeWVhciBhcyBhIG11bHRpLWxpbmUgc3RyaW5nCi11c2luZyB0aGUgXG1ldGhvZHtmb3JtYXR5ZWFyfSBvZiB0aGUgXGNsYXNze1RleHRDYWxlbmRhcn0gY2xhc3MuCi1cdmVyc2lvbmFkZGVkezIuMH0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dGltZWdtfXt0dXBsZX0KLUFuIHVucmVsYXRlZCBidXQgaGFuZHkgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIHRpbWUgdHVwbGUgc3VjaCBhcwotcmV0dXJuZWQgYnkgdGhlIFxmdW5jdGlvbntnbXRpbWUoKX0gZnVuY3Rpb24gaW4gdGhlIFxyZWZtb2R1bGV7dGltZX0KLW1vZHVsZSwgYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgXFVOSVh7fSB0aW1lc3RhbXAgdmFsdWUsIGFzc3VtaW5nCi1hbiBlcG9jaCBvZiAxOTcwLCBhbmQgdGhlIFBPU0lYIGVuY29kaW5nLiAgSW4gZmFjdCwKLVxmdW5jdGlvbnt0aW1lLmdtdGltZSgpfSBhbmQgXGZ1bmN0aW9ue3RpbWVnbSgpfSBhcmUgZWFjaCBvdGhlcnMnIGludmVyc2UuCi1cdmVyc2lvbmFkZGVkezIuMH0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVRoZSBcbW9kdWxle2NhbGVuZGFyfSBtb2R1bGUgZXhwb3J0cyB0aGUgZm9sbG93aW5nIGRhdGEgYXR0cmlidXRlczoKLQotXGJlZ2lue2RhdGFkZXNjfXtkYXlfbmFtZX0KLUFuIGFycmF5IHRoYXQgcmVwcmVzZW50cyB0aGUgZGF5cyBvZiB0aGUgd2VlayBpbiB0aGUKLWN1cnJlbnQgbG9jYWxlLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtkYXlfYWJicn0KLUFuIGFycmF5IHRoYXQgcmVwcmVzZW50cyB0aGUgYWJicmV2aWF0ZWQgZGF5cyBvZiB0aGUgd2VlawotaW4gdGhlIGN1cnJlbnQgbG9jYWxlLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXttb250aF9uYW1lfQotQW4gYXJyYXkgdGhhdCByZXByZXNlbnRzIHRoZSBtb250aHMgb2YgdGhlIHllYXIgaW4gdGhlCi1jdXJyZW50IGxvY2FsZS4gIFRoaXMgZm9sbG93cyBub3JtYWwgY29udmVudGlvbgotb2YgSmFudWFyeSBiZWluZyBtb250aCBudW1iZXIgMSwgc28gaXQgaGFzIGEgbGVuZ3RoIG9mIDEzIGFuZCAKLVxjb2Rle21vbnRoX25hbWVbMF19IGlzIHRoZSBlbXB0eSBzdHJpbmcuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e21vbnRoX2FiYnJ9Ci1BbiBhcnJheSB0aGF0IHJlcHJlc2VudHMgdGhlIGFiYnJldmlhdGVkIG1vbnRocyBvZiB0aGUgeWVhcgotaW4gdGhlIGN1cnJlbnQgbG9jYWxlLiAgVGhpcyBmb2xsb3dzIG5vcm1hbCBjb252ZW50aW9uCi1vZiBKYW51YXJ5IGJlaW5nIG1vbnRoIG51bWJlciAxLCBzbyBpdCBoYXMgYSBsZW5ndGggb2YgMTMgYW5kIAotXGNvZGV7bW9udGhfYWJiclswXX0gaXMgdGhlIGVtcHR5IHN0cmluZy4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntzZWVhbHNvfQotICBcc2VlbW9kdWxle2RhdGV0aW1lfXtPYmplY3Qtb3JpZW50ZWQgaW50ZXJmYWNlIHRvIGRhdGVzIGFuZCB0aW1lcwotICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHNpbWlsYXIgZnVuY3Rpb25hbGl0eSB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgXHJlZm1vZHVsZXt0aW1lfSBtb2R1bGUufQotICBcc2VlbW9kdWxle3RpbWV9e0xvdy1sZXZlbCB0aW1lIHJlbGF0ZWQgZnVuY3Rpb25zLn0KLVxlbmR7c2VlYWxzb30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliY2ZncGFyc2VyLnRleCBiL0RvYy9saWIvbGliY2ZncGFyc2VyLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQxYWVlMS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmNmZ3BhcnNlci50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtDb25maWdQYXJzZXJ9IC0tLQotICAgICAgICAgQ29uZmlndXJhdGlvbiBmaWxlIHBhcnNlcn0KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e0NvbmZpZ1BhcnNlcn0KLVxtb2R1bGVzeW5vcHNpc3tDb25maWd1cmF0aW9uIGZpbGUgcGFyc2VyLn0KLVxtb2R1bGVhdXRob3J7S2VuIE1hbmhlaW1lcn17a2xtQHpvcGUuY29tfQotXG1vZHVsZWF1dGhvcntCYXJyeSBXYXJzYXd9e2J3YXJzYXdAcHl0aG9uLm9yZ30KLVxtb2R1bGVhdXRob3J7RXJpYyBTLiBSYXltb25kfXtlc3JAdGh5cnN1cy5jb219Ci1cc2VjdGlvbmF1dGhvcntDaHJpc3RvcGhlciBHLiBQZXRyaWxsaX17cGV0cmlsbGlAYW1iZXIub3JnfQotCi1UaGlzIG1vZHVsZSBkZWZpbmVzIHRoZSBjbGFzcyBcY2xhc3N7Q29uZmlnUGFyc2VyfS4KLVxpbmRleGlpey5pbml9e2ZpbGV9XGluZGV4aWl7Y29uZmlndXJhdGlvbn17ZmlsZX1caW5kZXh7aW5pIGZpbGV9Ci1caW5kZXh7V2luZG93cyBpbmkgZmlsZX0KLVRoZSBcY2xhc3N7Q29uZmlnUGFyc2VyfSBjbGFzcyBpbXBsZW1lbnRzIGEgYmFzaWMgY29uZmlndXJhdGlvbiBmaWxlCi1wYXJzZXIgbGFuZ3VhZ2Ugd2hpY2ggcHJvdmlkZXMgYSBzdHJ1Y3R1cmUgc2ltaWxhciB0byB3aGF0IHlvdSB3b3VsZAotZmluZCBvbiBNaWNyb3NvZnQgV2luZG93cyBJTkkgZmlsZXMuICBZb3UgY2FuIHVzZSB0aGlzIHRvIHdyaXRlIFB5dGhvbgotcHJvZ3JhbXMgd2hpY2ggY2FuIGJlIGN1c3RvbWl6ZWQgYnkgZW5kIHVzZXJzIGVhc2lseS4KLQotXGJlZ2lue25vdGljZX1bd2FybmluZ10KLSAgVGhpcyBsaWJyYXJ5IGRvZXMgXGVtcGh7bm90fSBpbnRlcnByZXQgb3Igd3JpdGUgdGhlIHZhbHVlLXR5cGUKLSAgcHJlZml4ZXMgdXNlZCBpbiB0aGUgV2luZG93cyBSZWdpc3RyeSBleHRlbmRlZCB2ZXJzaW9uIG9mIElOSSBzeW50YXguCi1cZW5ke25vdGljZX0KLQotVGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBjb25zaXN0cyBvZiBzZWN0aW9ucywgbGVkIGJ5IGEKLVxzYW1we1tzZWN0aW9uXX0gaGVhZGVyIGFuZCBmb2xsb3dlZCBieSBcc2FtcHtuYW1lOiB2YWx1ZX0gZW50cmllcywKLXdpdGggY29udGludWF0aW9ucyBpbiB0aGUgc3R5bGUgb2YgXHJmY3s4MjJ9OyBcc2FtcHtuYW1lPXZhbHVlfSBpcwotYWxzbyBhY2NlcHRlZC4gIE5vdGUgdGhhdCBsZWFkaW5nIHdoaXRlc3BhY2UgaXMgcmVtb3ZlZCBmcm9tIHZhbHVlcy4KLVRoZSBvcHRpb25hbCB2YWx1ZXMgY2FuIGNvbnRhaW4gZm9ybWF0IHN0cmluZ3Mgd2hpY2ggcmVmZXIgdG8gb3RoZXIKLXZhbHVlcyBpbiB0aGUgc2FtZSBzZWN0aW9uLCBvciB2YWx1ZXMgaW4gYSBzcGVjaWFsCi1cY29kZXtERUZBVUxUfSBzZWN0aW9uLiAgQWRkaXRpb25hbCBkZWZhdWx0cyBjYW4gYmUgcHJvdmlkZWQgb24KLWluaXRpYWxpemF0aW9uIGFuZCByZXRyaWV2YWwuICBMaW5lcyBiZWdpbm5pbmcgd2l0aCBcY2hhcmFjdGVye1wjfSBvcgotXGNoYXJhY3Rlcns7fSBhcmUgaWdub3JlZCBhbmQgbWF5IGJlIHVzZWQgdG8gcHJvdmlkZSBjb21tZW50cy4KLQotRm9yIGV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLVtNeSBTZWN0aW9uXQotZm9vZGlyOiAlKGRpcilzL3doYXRldmVyCi1kaXI9ZnJvYgotXGVuZHt2ZXJiYXRpbX0KLQotd291bGQgcmVzb2x2ZSB0aGUgXHNhbXB7XCUoZGlyKXN9IHRvIHRoZSB2YWx1ZSBvZgotXHNhbXB7ZGlyfSAoXHNhbXB7ZnJvYn0gaW4gdGhpcyBjYXNlKS4gIEFsbCByZWZlcmVuY2UgZXhwYW5zaW9ucyBhcmUKLWRvbmUgb24gZGVtYW5kLgotCi1EZWZhdWx0IHZhbHVlcyBjYW4gYmUgc3BlY2lmaWVkIGJ5IHBhc3NpbmcgdGhlbSBpbnRvIHRoZQotXGNsYXNze0NvbmZpZ1BhcnNlcn0gY29uc3RydWN0b3IgYXMgYSBkaWN0aW9uYXJ5LiAgQWRkaXRpb25hbCBkZWZhdWx0cyAKLW1heSBiZSBwYXNzZWQgaW50byB0aGUgXG1ldGhvZHtnZXQoKX0gbWV0aG9kIHdoaWNoIHdpbGwgb3ZlcnJpZGUgYWxsCi1vdGhlcnMuCi0KLVNlY3Rpb25zIGFyZSBub3JtYWxseSBzdG9yZWQgaW4gYSBidWlsdGluIGRpY3Rpb25hcnkuIEFuIGFsdGVybmF0aXZlCi1kaWN0aW9uYXJ5IHR5cGUgY2FuIGJlIHBhc3NlZCB0byB0aGUgXGNsYXNze0NvbmZpZ1BhcnNlcn0gY29uc3RydWN0b3IuCi1Gb3IgZXhhbXBsZSwgaWYgYSBkaWN0aW9uYXJ5IHR5cGUgaXMgcGFzc2VkIHRoYXQgc29ydHMgaXRzIGtleXMsCi10aGUgc2VjdGlvbnMgd2lsbCBiZSBzb3J0ZWQgb24gd3JpdGUtYmFjaywgYXMgd2lsbCBiZSB0aGUga2V5cyB3aXRoaW4KLWVhY2ggc2VjdGlvbi4KLQotXGJlZ2lue2NsYXNzZGVzY317UmF3Q29uZmlnUGFyc2VyfXtcb3B0aW9uYWx7ZGVmYXVsdHNcb3B0aW9uYWx7LCBkaWN0X3R5cGV9fX0KLVRoZSBiYXNpYyBjb25maWd1cmF0aW9uIG9iamVjdC4gIFdoZW4gXHZhcntkZWZhdWx0c30gaXMgZ2l2ZW4sIGl0IGlzCi1pbml0aWFsaXplZCBpbnRvIHRoZSBkaWN0aW9uYXJ5IG9mIGludHJpbnNpYyBkZWZhdWx0cy4gIFdoZW4gXHZhcntkaWN0X3R5cGV9Ci1pcyBnaXZlbiwgaXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgZGljdGlvbmFyeSBvYmplY3RzIGZvciB0aGUgbGlzdAotb2Ygc2VjdGlvbnMsIGZvciB0aGUgb3B0aW9ucyB3aXRoaW4gYSBzZWN0aW9uLCBhbmQgZm9yIHRoZSBkZWZhdWx0IHZhbHVlcy4KLVRoaXMgY2xhc3MgZG9lcyBub3Qgc3VwcG9ydCB0aGUgbWFnaWNhbCBpbnRlcnBvbGF0aW9uIGJlaGF2aW9yLgotXHZlcnNpb25hZGRlZHsyLjN9Ci1cdmVyc2lvbmNoYW5nZWRbXHZhcntkaWN0X3R5cGV9IHdhcyBhZGRlZF17Mi42fQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0NvbmZpZ1BhcnNlcn17XG9wdGlvbmFse2RlZmF1bHRzfX0KLURlcml2ZWQgY2xhc3Mgb2YgXGNsYXNze1Jhd0NvbmZpZ1BhcnNlcn0gdGhhdCBpbXBsZW1lbnRzIHRoZSBtYWdpY2FsCi1pbnRlcnBvbGF0aW9uIGZlYXR1cmUgYW5kIGFkZHMgb3B0aW9uYWwgYXJndW1lbnRzIHRvIHRoZSBcbWV0aG9ke2dldCgpfQotYW5kIFxtZXRob2R7aXRlbXMoKX0gbWV0aG9kcy4gIFRoZSB2YWx1ZXMgaW4gXHZhcntkZWZhdWx0c30gbXVzdCBiZQotYXBwcm9wcmlhdGUgZm9yIHRoZSBcc2FtcHtcJSgpc30gc3RyaW5nIGludGVycG9sYXRpb24uICBOb3RlIHRoYXQKLVx2YXJ7X19uYW1lX199IGlzIGFuIGludHJpbnNpYyBkZWZhdWx0OyBpdHMgdmFsdWUgaXMgdGhlIHNlY3Rpb24gbmFtZSwKLWFuZCB3aWxsIG92ZXJyaWRlIGFueSB2YWx1ZSBwcm92aWRlZCBpbiBcdmFye2RlZmF1bHRzfS4KLQotQWxsIG9wdGlvbiBuYW1lcyB1c2VkIGluIGludGVycG9sYXRpb24gd2lsbCBiZSBwYXNzZWQgdGhyb3VnaCB0aGUKLVxtZXRob2R7b3B0aW9ueGZvcm0oKX0gbWV0aG9kIGp1c3QgbGlrZSBhbnkgb3RoZXIgb3B0aW9uIG5hbWUKLXJlZmVyZW5jZS4gIEZvciBleGFtcGxlLCB1c2luZyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZgotXG1ldGhvZHtvcHRpb254Zm9ybSgpfSAod2hpY2ggY29udmVydHMgb3B0aW9uIG5hbWVzIHRvIGxvd2VyIGNhc2UpLAotdGhlIHZhbHVlcyBcc2FtcHtmb28gXCUoYmFyKXN9IGFuZCBcc2FtcHtmb28gXCUoQkFSKXN9IGFyZQotZXF1aXZhbGVudC4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtTYWZlQ29uZmlnUGFyc2VyfXtcb3B0aW9uYWx7ZGVmYXVsdHN9fQotRGVyaXZlZCBjbGFzcyBvZiBcY2xhc3N7Q29uZmlnUGFyc2VyfSB0aGF0IGltcGxlbWVudHMgYSBtb3JlLXNhbmUKLXZhcmlhbnQgb2YgdGhlIG1hZ2ljYWwgaW50ZXJwb2xhdGlvbiBmZWF0dXJlLiAgVGhpcyBpbXBsZW1lbnRhdGlvbiBpcwotbW9yZSBwcmVkaWN0YWJsZSBhcyB3ZWxsLgotJSBYWFggTmVlZCB0byBleHBsYWluIHdoYXQncyBzYWZlci9tb3JlIHByZWRpY3RhYmxlIGFib3V0IGl0LgotTmV3IGFwcGxpY2F0aW9ucyBzaG91bGQgcHJlZmVyIHRoaXMgdmVyc2lvbiBpZiB0aGV5IGRvbid0IG5lZWQgdG8gYmUKLWNvbXBhdGlibGUgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBQeXRob24uCi1cdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317Tm9TZWN0aW9uRXJyb3J9Ci1FeGNlcHRpb24gcmFpc2VkIHdoZW4gYSBzcGVjaWZpZWQgc2VjdGlvbiBpcyBub3QgZm91bmQuCi1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtEdXBsaWNhdGVTZWN0aW9uRXJyb3J9Ci1FeGNlcHRpb24gcmFpc2VkIGlmIFxtZXRob2R7YWRkX3NlY3Rpb24oKX0gaXMgY2FsbGVkIHdpdGggdGhlIG5hbWUgb2YKLWEgc2VjdGlvbiB0aGF0IGlzIGFscmVhZHkgcHJlc2VudC4KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e05vT3B0aW9uRXJyb3J9Ci1FeGNlcHRpb24gcmFpc2VkIHdoZW4gYSBzcGVjaWZpZWQgb3B0aW9uIGlzIG5vdCBmb3VuZCBpbiB0aGUgc3BlY2lmaWVkIAotc2VjdGlvbi4KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e0ludGVycG9sYXRpb25FcnJvcn0KLUJhc2UgY2xhc3MgZm9yIGV4Y2VwdGlvbnMgcmFpc2VkIHdoZW4gcHJvYmxlbXMgb2NjdXIgcGVyZm9ybWluZyBzdHJpbmcKLWludGVycG9sYXRpb24uCi1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtJbnRlcnBvbGF0aW9uRGVwdGhFcnJvcn0KLUV4Y2VwdGlvbiByYWlzZWQgd2hlbiBzdHJpbmcgaW50ZXJwb2xhdGlvbiBjYW5ub3QgYmUgY29tcGxldGVkIGJlY2F1c2UKLXRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBleGNlZWRzIFxjb25zdGFudHtNQVhfSU5URVJQT0xBVElPTl9ERVBUSH0uCi1TdWJjbGFzcyBvZiBcZXhjZXB0aW9ue0ludGVycG9sYXRpb25FcnJvcn0uCi1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtJbnRlcnBvbGF0aW9uTWlzc2luZ09wdGlvbkVycm9yfQotRXhjZXB0aW9uIHJhaXNlZCB3aGVuIGFuIG9wdGlvbiByZWZlcmVuY2VkIGZyb20gYSB2YWx1ZSBkb2VzIG5vdCBleGlzdC4KLVN1YmNsYXNzIG9mIFxleGNlcHRpb257SW50ZXJwb2xhdGlvbkVycm9yfS4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317SW50ZXJwb2xhdGlvblN5bnRheEVycm9yfQotRXhjZXB0aW9uIHJhaXNlZCB3aGVuIHRoZSBzb3VyY2UgdGV4dCBpbnRvIHdoaWNoIHN1YnN0aXR1dGlvbnMgYXJlCi1tYWRlIGRvZXMgbm90IGNvbmZvcm0gdG8gdGhlIHJlcXVpcmVkIHN5bnRheC4KLVN1YmNsYXNzIG9mIFxleGNlcHRpb257SW50ZXJwb2xhdGlvbkVycm9yfS4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317TWlzc2luZ1NlY3Rpb25IZWFkZXJFcnJvcn0KLUV4Y2VwdGlvbiByYWlzZWQgd2hlbiBhdHRlbXB0aW5nIHRvIHBhcnNlIGEgZmlsZSB3aGljaCBoYXMgbm8gc2VjdGlvbgotaGVhZGVycy4KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e1BhcnNpbmdFcnJvcn0KLUV4Y2VwdGlvbiByYWlzZWQgd2hlbiBlcnJvcnMgb2NjdXIgYXR0ZW1wdGluZyB0byBwYXJzZSBhIGZpbGUuCi1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317TUFYX0lOVEVSUE9MQVRJT05fREVQVEh9Ci1UaGUgbWF4aW11bSBkZXB0aCBmb3IgcmVjdXJzaXZlIGludGVycG9sYXRpb24gZm9yIFxtZXRob2R7Z2V0KCl9IHdoZW4KLXRoZSBcdmFye3Jhd30gcGFyYW1ldGVyIGlzIGZhbHNlLiAgVGhpcyBpcyByZWxldmFudCBvbmx5IGZvciB0aGUKLVxjbGFzc3tDb25maWdQYXJzZXJ9IGNsYXNzLgotXGVuZHtkYXRhZGVzY30KLQotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZW1vZHVsZXtzaGxleH17U3VwcG9ydCBmb3IgYSBjcmVhdGluZyBcVU5JWHt9IHNoZWxsLWxpa2UKLSAgICAgICAgICAgICAgICAgICAgbWluaS1sYW5ndWFnZXMgd2hpY2ggY2FuIGJlIHVzZWQgYXMgYW4gYWx0ZXJuYXRlCi0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCBmb3IgYXBwbGljYXRpb24gY29uZmlndXJhdGlvbiBmaWxlcy59Ci1cZW5ke3NlZWFsc299Ci0KLQotXHN1YnNlY3Rpb257UmF3Q29uZmlnUGFyc2VyIE9iamVjdHMgXGxhYmVse1Jhd0NvbmZpZ1BhcnNlci1vYmplY3RzfX0KLQotXGNsYXNze1Jhd0NvbmZpZ1BhcnNlcn0gaW5zdGFuY2VzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotCi1cYmVnaW57bWV0aG9kZGVzY31bUmF3Q29uZmlnUGFyc2VyXXtkZWZhdWx0c317fQotUmV0dXJuIGEgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBpbnN0YW5jZS13aWRlIGRlZmF1bHRzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUmF3Q29uZmlnUGFyc2VyXXtzZWN0aW9uc317fQotUmV0dXJuIGEgbGlzdCBvZiB0aGUgc2VjdGlvbnMgYXZhaWxhYmxlOyBcY29kZXtERUZBVUxUfSBpcyBub3QKLWluY2x1ZGVkIGluIHRoZSBsaXN0LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUmF3Q29uZmlnUGFyc2VyXXthZGRfc2VjdGlvbn17c2VjdGlvbn0KLUFkZCBhIHNlY3Rpb24gbmFtZWQgXHZhcntzZWN0aW9ufSB0byB0aGUgaW5zdGFuY2UuICBJZiBhIHNlY3Rpb24gYnkKLXRoZSBnaXZlbiBuYW1lIGFscmVhZHkgZXhpc3RzLCBcZXhjZXB0aW9ue0R1cGxpY2F0ZVNlY3Rpb25FcnJvcn0gaXMKLXJhaXNlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1Jhd0NvbmZpZ1BhcnNlcl17aGFzX3NlY3Rpb259e3NlY3Rpb259Ci1JbmRpY2F0ZXMgd2hldGhlciB0aGUgbmFtZWQgc2VjdGlvbiBpcyBwcmVzZW50IGluIHRoZQotY29uZmlndXJhdGlvbi4gVGhlIFxjb2Rle0RFRkFVTFR9IHNlY3Rpb24gaXMgbm90IGFja25vd2xlZGdlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1Jhd0NvbmZpZ1BhcnNlcl17b3B0aW9uc317c2VjdGlvbn0KLVJldHVybnMgYSBsaXN0IG9mIG9wdGlvbnMgYXZhaWxhYmxlIGluIHRoZSBzcGVjaWZpZWQgXHZhcntzZWN0aW9ufS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1Jhd0NvbmZpZ1BhcnNlcl17aGFzX29wdGlvbn17c2VjdGlvbiwgb3B0aW9ufQotSWYgdGhlIGdpdmVuIHNlY3Rpb24gZXhpc3RzLCBhbmQgY29udGFpbnMgdGhlIGdpdmVuIG9wdGlvbiwKLXJldHVybiBcY29uc3RhbnR7VHJ1ZX07IG90aGVyd2lzZSByZXR1cm4gXGNvbnN0YW50e0ZhbHNlfS4KLVx2ZXJzaW9uYWRkZWR7MS42fQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUmF3Q29uZmlnUGFyc2VyXXtyZWFkfXtmaWxlbmFtZXN9Ci1BdHRlbXB0IHRvIHJlYWQgYW5kIHBhcnNlIGEgbGlzdCBvZiBmaWxlbmFtZXMsIHJldHVybmluZyBhIGxpc3Qgb2YgZmlsZW5hbWVzCi13aGljaCB3ZXJlIHN1Y2Nlc3NmdWxseSBwYXJzZWQuICBJZiBcdmFye2ZpbGVuYW1lc30gaXMgYSBzdHJpbmcgb3IKLVVuaWNvZGUgc3RyaW5nLCBpdCBpcyB0cmVhdGVkIGFzIGEgc2luZ2xlIGZpbGVuYW1lLgotSWYgYSBmaWxlIG5hbWVkIGluIFx2YXJ7ZmlsZW5hbWVzfSBjYW5ub3QgYmUgb3BlbmVkLCB0aGF0IGZpbGUgd2lsbCBiZQotaWdub3JlZC4gIFRoaXMgaXMgZGVzaWduZWQgc28gdGhhdCB5b3UgY2FuIHNwZWNpZnkgYSBsaXN0IG9mIHBvdGVudGlhbAotY29uZmlndXJhdGlvbiBmaWxlIGxvY2F0aW9ucyAoZm9yIGV4YW1wbGUsIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgdGhlCi11c2VyJ3MgaG9tZSBkaXJlY3RvcnksIGFuZCBzb21lIHN5c3RlbS13aWRlIGRpcmVjdG9yeSksIGFuZCBhbGwKLWV4aXN0aW5nIGNvbmZpZ3VyYXRpb24gZmlsZXMgaW4gdGhlIGxpc3Qgd2lsbCBiZSByZWFkLiAgSWYgbm9uZSBvZiB0aGUKLW5hbWVkIGZpbGVzIGV4aXN0LCB0aGUgXGNsYXNze0NvbmZpZ1BhcnNlcn0gaW5zdGFuY2Ugd2lsbCBjb250YWluIGFuCi1lbXB0eSBkYXRhc2V0LiAgQW4gYXBwbGljYXRpb24gd2hpY2ggcmVxdWlyZXMgaW5pdGlhbCB2YWx1ZXMgdG8gYmUKLWxvYWRlZCBmcm9tIGEgZmlsZSBzaG91bGQgbG9hZCB0aGUgcmVxdWlyZWQgZmlsZSBvciBmaWxlcyB1c2luZwotXG1ldGhvZHtyZWFkZnAoKX0gYmVmb3JlIGNhbGxpbmcgXG1ldGhvZHtyZWFkKCl9IGZvciBhbnkgb3B0aW9uYWwKLWZpbGVzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgQ29uZmlnUGFyc2VyLCBvcwotCi1jb25maWcgPSBDb25maWdQYXJzZXIuQ29uZmlnUGFyc2VyKCkKLWNvbmZpZy5yZWFkZnAob3BlbignZGVmYXVsdHMuY2ZnJykpCi1jb25maWcucmVhZChbJ3NpdGUuY2ZnJywgb3MucGF0aC5leHBhbmR1c2VyKCd+Ly5teWFwcC5jZmcnKV0pCi1cZW5ke3ZlcmJhdGltfQotXHZlcnNpb25jaGFuZ2VkW1JldHVybnMgbGlzdCBvZiBzdWNjZXNzZnVsbHkgcGFyc2VkIGZpbGVuYW1lc117Mi40fQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUmF3Q29uZmlnUGFyc2VyXXtyZWFkZnB9e2ZwXG9wdGlvbmFseywgZmlsZW5hbWV9fQotUmVhZCBhbmQgcGFyc2UgY29uZmlndXJhdGlvbiBkYXRhIGZyb20gdGhlIGZpbGUgb3IgZmlsZS1saWtlIG9iamVjdCBpbgotXHZhcntmcH0gKG9ubHkgdGhlIFxtZXRob2R7cmVhZGxpbmUoKX0gbWV0aG9kIGlzIHVzZWQpLiAgSWYKLVx2YXJ7ZmlsZW5hbWV9IGlzIG9taXR0ZWQgYW5kIFx2YXJ7ZnB9IGhhcyBhIFxtZW1iZXJ7bmFtZX0gYXR0cmlidXRlLAotdGhhdCBpcyB1c2VkIGZvciBcdmFye2ZpbGVuYW1lfTsgdGhlIGRlZmF1bHQgaXMgXHNhbXB7PD8/Pz59LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUmF3Q29uZmlnUGFyc2VyXXtnZXR9e3NlY3Rpb24sIG9wdGlvbn0KLUdldCBhbiBcdmFye29wdGlvbn0gdmFsdWUgZm9yIHRoZSBuYW1lZCBcdmFye3NlY3Rpb259LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUmF3Q29uZmlnUGFyc2VyXXtnZXRpbnR9e3NlY3Rpb24sIG9wdGlvbn0KLUEgY29udmVuaWVuY2UgbWV0aG9kIHdoaWNoIGNvZXJjZXMgdGhlIFx2YXJ7b3B0aW9ufSBpbiB0aGUgc3BlY2lmaWVkCi1cdmFye3NlY3Rpb259IHRvIGFuIGludGVnZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtSYXdDb25maWdQYXJzZXJde2dldGZsb2F0fXtzZWN0aW9uLCBvcHRpb259Ci1BIGNvbnZlbmllbmNlIG1ldGhvZCB3aGljaCBjb2VyY2VzIHRoZSBcdmFye29wdGlvbn0gaW4gdGhlIHNwZWNpZmllZAotXHZhcntzZWN0aW9ufSB0byBhIGZsb2F0aW5nIHBvaW50IG51bWJlci4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1Jhd0NvbmZpZ1BhcnNlcl17Z2V0Ym9vbGVhbn17c2VjdGlvbiwgb3B0aW9ufQotQSBjb252ZW5pZW5jZSBtZXRob2Qgd2hpY2ggY29lcmNlcyB0aGUgXHZhcntvcHRpb259IGluIHRoZSBzcGVjaWZpZWQKLVx2YXJ7c2VjdGlvbn0gdG8gYSBCb29sZWFuIHZhbHVlLiAgTm90ZSB0aGF0IHRoZSBhY2NlcHRlZCB2YWx1ZXMKLWZvciB0aGUgb3B0aW9uIGFyZSBcY29kZXsiMSJ9LCBcY29kZXsieWVzIn0sIFxjb2RleyJ0cnVlIn0sIGFuZCBcY29kZXsib24ifSwKLXdoaWNoIGNhdXNlIHRoaXMgbWV0aG9kIHRvIHJldHVybiBcY29kZXtUcnVlfSwgYW5kIFxjb2RleyIwIn0sIFxjb2RleyJubyJ9LAotXGNvZGV7ImZhbHNlIn0sIGFuZCBcY29kZXsib2ZmIn0sIHdoaWNoIGNhdXNlIGl0IHRvIHJldHVybiBcY29kZXtGYWxzZX0uICBUaGVzZQotc3RyaW5nIHZhbHVlcyBhcmUgY2hlY2tlZCBpbiBhIGNhc2UtaW5zZW5zaXRpdmUgbWFubmVyLiAgQW55IG90aGVyIHZhbHVlIHdpbGwKLWNhdXNlIGl0IHRvIHJhaXNlIFxleGNlcHRpb257VmFsdWVFcnJvcn0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtSYXdDb25maWdQYXJzZXJde2l0ZW1zfXtzZWN0aW9ufQotUmV0dXJuIGEgbGlzdCBvZiBcY29kZXsoXHZhcntuYW1lfSwgXHZhcnt2YWx1ZX0pfSBwYWlycyBmb3IgZWFjaAotb3B0aW9uIGluIHRoZSBnaXZlbiBcdmFye3NlY3Rpb259LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUmF3Q29uZmlnUGFyc2VyXXtzZXR9e3NlY3Rpb24sIG9wdGlvbiwgdmFsdWV9Ci1JZiB0aGUgZ2l2ZW4gc2VjdGlvbiBleGlzdHMsIHNldCB0aGUgZ2l2ZW4gb3B0aW9uIHRvIHRoZSBzcGVjaWZpZWQKLXZhbHVlOyBvdGhlcndpc2UgcmFpc2UgXGV4Y2VwdGlvbntOb1NlY3Rpb25FcnJvcn0uICBXaGlsZSBpdCBpcwotcG9zc2libGUgdG8gdXNlIFxjbGFzc3tSYXdDb25maWdQYXJzZXJ9IChvciBcY2xhc3N7Q29uZmlnUGFyc2VyfSB3aXRoCi1cdmFye3Jhd30gcGFyYW1ldGVycyBzZXQgdG8gdHJ1ZSkgZm9yIFxlbXBoe2ludGVybmFsfSBzdG9yYWdlIG9mCi1ub24tc3RyaW5nIHZhbHVlcywgZnVsbCBmdW5jdGlvbmFsaXR5IChpbmNsdWRpbmcgaW50ZXJwb2xhdGlvbiBhbmQKLW91dHB1dCB0byBmaWxlcykgY2FuIG9ubHkgYmUgYWNoaWV2ZWQgdXNpbmcgc3RyaW5nIHZhbHVlcy4KLVx2ZXJzaW9uYWRkZWR7MS42fQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUmF3Q29uZmlnUGFyc2VyXXt3cml0ZX17ZmlsZW9iamVjdH0KLVdyaXRlIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbmZpZ3VyYXRpb24gdG8gdGhlIHNwZWNpZmllZCBmaWxlCi1vYmplY3QuICBUaGlzIHJlcHJlc2VudGF0aW9uIGNhbiBiZSBwYXJzZWQgYnkgYSBmdXR1cmUgXG1ldGhvZHtyZWFkKCl9Ci1jYWxsLgotXHZlcnNpb25hZGRlZHsxLjZ9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtSYXdDb25maWdQYXJzZXJde3JlbW92ZV9vcHRpb259e3NlY3Rpb24sIG9wdGlvbn0KLVJlbW92ZSB0aGUgc3BlY2lmaWVkIFx2YXJ7b3B0aW9ufSBmcm9tIHRoZSBzcGVjaWZpZWQgXHZhcntzZWN0aW9ufS4KLUlmIHRoZSBzZWN0aW9uIGRvZXMgbm90IGV4aXN0LCByYWlzZSBcZXhjZXB0aW9ue05vU2VjdGlvbkVycm9yfS4gCi1JZiB0aGUgb3B0aW9uIGV4aXN0ZWQgdG8gYmUgcmVtb3ZlZCwgcmV0dXJuIFxjb25zdGFudHtUcnVlfTsKLW90aGVyd2lzZSByZXR1cm4gXGNvbnN0YW50e0ZhbHNlfS4KLVx2ZXJzaW9uYWRkZWR7MS42fQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUmF3Q29uZmlnUGFyc2VyXXtyZW1vdmVfc2VjdGlvbn17c2VjdGlvbn0KLVJlbW92ZSB0aGUgc3BlY2lmaWVkIFx2YXJ7c2VjdGlvbn0gZnJvbSB0aGUgY29uZmlndXJhdGlvbi4KLUlmIHRoZSBzZWN0aW9uIGluIGZhY3QgZXhpc3RlZCwgcmV0dXJuIFxjb2Rle1RydWV9LgotT3RoZXJ3aXNlIHJldHVybiBcY29kZXtGYWxzZX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtSYXdDb25maWdQYXJzZXJde29wdGlvbnhmb3JtfXtvcHRpb259Ci1UcmFuc2Zvcm1zIHRoZSBvcHRpb24gbmFtZSBcdmFye29wdGlvbn0gYXMgZm91bmQgaW4gYW4gaW5wdXQgZmlsZSBvcgotYXMgcGFzc2VkIGluIGJ5ICBjbGllbnQgY29kZSB0byB0aGUgZm9ybSB0aGF0IHNob3VsZCBiZSB1c2VkIGluIHRoZQotaW50ZXJuYWwgc3RydWN0dXJlcy4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgYSBsb3dlci1jYXNlCi12ZXJzaW9uIG9mIFx2YXJ7b3B0aW9ufTsgc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBvciBjbGllbnQgY29kZQotY2FuIHNldCBhbiBhdHRyaWJ1dGUgb2YgdGhpcyBuYW1lIG9uIGluc3RhbmNlcyB0byBhZmZlY3QgdGhpcwotYmVoYXZpb3IuICBTZXR0aW5nIHRoaXMgdG8gXGZ1bmN0aW9ue3N0cigpfSwgZm9yIGV4YW1wbGUsIHdvdWxkIG1ha2UKLW9wdGlvbiBuYW1lcyBjYXNlIHNlbnNpdGl2ZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cc3Vic2VjdGlvbntDb25maWdQYXJzZXIgT2JqZWN0cyBcbGFiZWx7Q29uZmlnUGFyc2VyLW9iamVjdHN9fQotCi1UaGUgXGNsYXNze0NvbmZpZ1BhcnNlcn0gY2xhc3MgZXh0ZW5kcyBzb21lIG1ldGhvZHMgb2YgdGhlCi1cY2xhc3N7UmF3Q29uZmlnUGFyc2VyfSBpbnRlcmZhY2UsIGFkZGluZyBzb21lIG9wdGlvbmFsIGFyZ3VtZW50cy4KLQotXGJlZ2lue21ldGhvZGRlc2N9W0NvbmZpZ1BhcnNlcl17Z2V0fXtzZWN0aW9uLCBvcHRpb25cb3B0aW9uYWx7LCByYXdcb3B0aW9uYWx7LCB2YXJzfX19Ci1HZXQgYW4gXHZhcntvcHRpb259IHZhbHVlIGZvciB0aGUgbmFtZWQgXHZhcntzZWN0aW9ufS4gIEFsbCB0aGUKLVxjaGFyYWN0ZXJ7XCV9IGludGVycG9sYXRpb25zIGFyZSBleHBhbmRlZCBpbiB0aGUgcmV0dXJuIHZhbHVlcywgYmFzZWQKLW9uIHRoZSBkZWZhdWx0cyBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3IsIGFzIHdlbGwgYXMgdGhlIG9wdGlvbnMKLVx2YXJ7dmFyc30gcHJvdmlkZWQsIHVubGVzcyB0aGUgXHZhcntyYXd9IGFyZ3VtZW50IGlzIHRydWUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb25maWdQYXJzZXJde2l0ZW1zfXtzZWN0aW9uXG9wdGlvbmFseywgcmF3XG9wdGlvbmFseywgdmFyc319fQotUmV0dXJuIGEgbGlzdCBvZiBcY29kZXsoXHZhcntuYW1lfSwgXHZhcnt2YWx1ZX0pfSBwYWlycyBmb3IgZWFjaAotb3B0aW9uIGluIHRoZSBnaXZlbiBcdmFye3NlY3Rpb259LiBPcHRpb25hbCBhcmd1bWVudHMgaGF2ZSB0aGUKLXNhbWUgbWVhbmluZyBhcyBmb3IgdGhlIFxtZXRob2R7Z2V0KCl9IG1ldGhvZC4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHttZXRob2RkZXNjfQotCi0KLVxzdWJzZWN0aW9ue1NhZmVDb25maWdQYXJzZXIgT2JqZWN0cyBcbGFiZWx7U2FmZUNvbmZpZ1BhcnNlci1vYmplY3RzfX0KLQotVGhlIFxjbGFzc3tTYWZlQ29uZmlnUGFyc2VyfSBjbGFzcyBpbXBsZW1lbnRzIHRoZSBzYW1lIGV4dGVuZGVkCi1pbnRlcmZhY2UgYXMgXGNsYXNze0NvbmZpZ1BhcnNlcn0sIHdpdGggdGhlIGZvbGxvd2luZyBhZGRpdGlvbjoKLQotXGJlZ2lue21ldGhvZGRlc2N9W1NhZmVDb25maWdQYXJzZXJde3NldH17c2VjdGlvbiwgb3B0aW9uLCB2YWx1ZX0KLUlmIHRoZSBnaXZlbiBzZWN0aW9uIGV4aXN0cywgc2V0IHRoZSBnaXZlbiBvcHRpb24gdG8gdGhlIHNwZWNpZmllZAotdmFsdWU7IG90aGVyd2lzZSByYWlzZSBcZXhjZXB0aW9ue05vU2VjdGlvbkVycm9yfS4gIFx2YXJ7dmFsdWV9IG11c3QKLWJlIGEgc3RyaW5nIChcY2xhc3N7c3RyfSBvciBcY2xhc3N7dW5pY29kZX0pOyBpZiBub3QsCi1cZXhjZXB0aW9ue1R5cGVFcnJvcn0gaXMgcmFpc2VkLgotXHZlcnNpb25hZGRlZHsyLjR9Ci1cZW5ke21ldGhvZGRlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmNnaS50ZXggYi9Eb2MvbGliL2xpYmNnaS50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZDdlMDMuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJjZ2kudGV4CisrKyAvZGV2L251bGwKQEAgLTEsNjAyICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7Y2dpfSAtLS0KLSAgICAgICAgIENvbW1vbiBHYXRld2F5IEludGVyZmFjZSBzdXBwb3J0Ln0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtjZ2l9Ci0KLVxtb2R1bGVzeW5vcHNpc3tDb21tb24gR2F0ZXdheSBJbnRlcmZhY2Ugc3VwcG9ydCwgdXNlZCB0byBpbnRlcnByZXQKLWZvcm1zIGluIHNlcnZlci1zaWRlIHNjcmlwdHMufQotCi1caW5kZXhpaXtXV1d9e3NlcnZlcn0KLVxpbmRleGlpe0NHSX17cHJvdG9jb2x9Ci1caW5kZXhpaXtIVFRQfXtwcm90b2NvbH0KLVxpbmRleGlpe01JTUV9e2hlYWRlcnN9Ci1caW5kZXh7VVJMfQotCi0KLVN1cHBvcnQgbW9kdWxlIGZvciBDb21tb24gR2F0ZXdheSBJbnRlcmZhY2UgKENHSSkgc2NyaXB0cy4lCi1caW5kZXh7Q29tbW9uIEdhdGV3YXkgSW50ZXJmYWNlfQotCi1UaGlzIG1vZHVsZSBkZWZpbmVzIGEgbnVtYmVyIG9mIHV0aWxpdGllcyBmb3IgdXNlIGJ5IENHSSBzY3JpcHRzCi13cml0dGVuIGluIFB5dGhvbi4KLQotXHN1YnNlY3Rpb257SW50cm9kdWN0aW9ufQotXG5vZGVuYW1le2NnaS1pbnRyb30KLQotQSBDR0kgc2NyaXB0IGlzIGludm9rZWQgYnkgYW4gSFRUUCBzZXJ2ZXIsIHVzdWFsbHkgdG8gcHJvY2VzcyB1c2VyCi1pbnB1dCBzdWJtaXR0ZWQgdGhyb3VnaCBhbiBIVE1MIFxjb2RlezxGT1JNPn0gb3IgXGNvZGV7PElTSU5ERVg+fSBlbGVtZW50LgotCi1Nb3N0IG9mdGVuLCBDR0kgc2NyaXB0cyBsaXZlIGluIHRoZSBzZXJ2ZXIncyBzcGVjaWFsIFxmaWxle2NnaS1iaW59Ci1kaXJlY3RvcnkuICBUaGUgSFRUUCBzZXJ2ZXIgcGxhY2VzIGFsbCBzb3J0cyBvZiBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLXJlcXVlc3QgKHN1Y2ggYXMgdGhlIGNsaWVudCdzIGhvc3RuYW1lLCB0aGUgcmVxdWVzdGVkIFVSTCwgdGhlIHF1ZXJ5Ci1zdHJpbmcsIGFuZCBsb3RzIG9mIG90aGVyIGdvb2RpZXMpIGluIHRoZSBzY3JpcHQncyBzaGVsbCBlbnZpcm9ubWVudCwKLWV4ZWN1dGVzIHRoZSBzY3JpcHQsIGFuZCBzZW5kcyB0aGUgc2NyaXB0J3Mgb3V0cHV0IGJhY2sgdG8gdGhlIGNsaWVudC4KLQotVGhlIHNjcmlwdCdzIGlucHV0IGlzIGNvbm5lY3RlZCB0byB0aGUgY2xpZW50IHRvbywgYW5kIHNvbWV0aW1lcyB0aGUKLWZvcm0gZGF0YSBpcyByZWFkIHRoaXMgd2F5OyBhdCBvdGhlciB0aW1lcyB0aGUgZm9ybSBkYXRhIGlzIHBhc3NlZCB2aWEKLXRoZSBgYHF1ZXJ5IHN0cmluZycnIHBhcnQgb2YgdGhlIFVSTC4gIFRoaXMgbW9kdWxlIGlzIGludGVuZGVkCi10byB0YWtlIGNhcmUgb2YgdGhlIGRpZmZlcmVudCBjYXNlcyBhbmQgcHJvdmlkZSBhIHNpbXBsZXIgaW50ZXJmYWNlIHRvCi10aGUgUHl0aG9uIHNjcmlwdC4gIEl0IGFsc28gcHJvdmlkZXMgYSBudW1iZXIgb2YgdXRpbGl0aWVzIHRoYXQgaGVscAotaW4gZGVidWdnaW5nIHNjcmlwdHMsIGFuZCB0aGUgbGF0ZXN0IGFkZGl0aW9uIGlzIHN1cHBvcnQgZm9yIGZpbGUKLXVwbG9hZHMgZnJvbSBhIGZvcm0gKGlmIHlvdXIgYnJvd3NlciBzdXBwb3J0cyBpdCkuCi0KLVRoZSBvdXRwdXQgb2YgYSBDR0kgc2NyaXB0IHNob3VsZCBjb25zaXN0IG9mIHR3byBzZWN0aW9ucywgc2VwYXJhdGVkCi1ieSBhIGJsYW5rIGxpbmUuICBUaGUgZmlyc3Qgc2VjdGlvbiBjb250YWlucyBhIG51bWJlciBvZiBoZWFkZXJzLAotdGVsbGluZyB0aGUgY2xpZW50IHdoYXQga2luZCBvZiBkYXRhIGlzIGZvbGxvd2luZy4gIFB5dGhvbiBjb2RlIHRvCi1nZW5lcmF0ZSBhIG1pbmltYWwgaGVhZGVyIHNlY3Rpb24gbG9va3MgbGlrZSB0aGlzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1wcmludCAiQ29udGVudC1UeXBlOiB0ZXh0L2h0bWwiICAgICAjIEhUTUwgaXMgZm9sbG93aW5nCi1wcmludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGJsYW5rIGxpbmUsIGVuZCBvZiBoZWFkZXJzCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgc2Vjb25kIHNlY3Rpb24gaXMgdXN1YWxseSBIVE1MLCB3aGljaCBhbGxvd3MgdGhlIGNsaWVudCBzb2Z0d2FyZQotdG8gZGlzcGxheSBuaWNlbHkgZm9ybWF0dGVkIHRleHQgd2l0aCBoZWFkZXIsIGluLWxpbmUgaW1hZ2VzLCBldGMuCi1IZXJlJ3MgUHl0aG9uIGNvZGUgdGhhdCBwcmludHMgYSBzaW1wbGUgcGllY2Ugb2YgSFRNTDoKLQotXGJlZ2lue3ZlcmJhdGltfQotcHJpbnQgIjxUSVRMRT5DR0kgc2NyaXB0IG91dHB1dDwvVElUTEU+IgotcHJpbnQgIjxIMT5UaGlzIGlzIG15IGZpcnN0IENHSSBzY3JpcHQ8L0gxPiIKLXByaW50ICJIZWxsbywgd29ybGQhIgotXGVuZHt2ZXJiYXRpbX0KLQotXHN1YnNlY3Rpb257VXNpbmcgdGhlIGNnaSBtb2R1bGV9Ci1cbm9kZW5hbWV7VXNpbmcgdGhlIGNnaSBtb2R1bGV9Ci0KLUJlZ2luIGJ5IHdyaXRpbmcgXHNhbXB7aW1wb3J0IGNnaX0uICBEbyBub3QgdXNlIFxzYW1we2Zyb20gY2dpIGltcG9ydAotKn0gLS0tIHRoZSBtb2R1bGUgZGVmaW5lcyBhbGwgc29ydHMgb2YgbmFtZXMgZm9yIGl0cyBvd24gdXNlIG9yIGZvcgotYmFja3dhcmQgY29tcGF0aWJpbGl0eSB0aGF0IHlvdSBkb24ndCB3YW50IGluIHlvdXIgbmFtZXNwYWNlLgotCi1XaGVuIHlvdSB3cml0ZSBhIG5ldyBzY3JpcHQsIGNvbnNpZGVyIGFkZGluZyB0aGUgbGluZToKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IGNnaXRiOyBjZ2l0Yi5lbmFibGUoKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhpcyBhY3RpdmF0ZXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiBoYW5kbGVyIHRoYXQgd2lsbCBkaXNwbGF5IGRldGFpbGVkCi1yZXBvcnRzIGluIHRoZSBXZWIgYnJvd3NlciBpZiBhbnkgZXJyb3JzIG9jY3VyLiAgSWYgeW91J2QgcmF0aGVyIG5vdAotc2hvdyB0aGUgZ3V0cyBvZiB5b3VyIHByb2dyYW0gdG8gdXNlcnMgb2YgeW91ciBzY3JpcHQsIHlvdSBjYW4gaGF2ZQotdGhlIHJlcG9ydHMgc2F2ZWQgdG8gZmlsZXMgaW5zdGVhZCwgd2l0aCBhIGxpbmUgbGlrZSB0aGlzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgY2dpdGI7IGNnaXRiLmVuYWJsZShkaXNwbGF5PTAsIGxvZ2Rpcj0iL3RtcCIpCi1cZW5ke3ZlcmJhdGltfQotCi1JdCdzIHZlcnkgaGVscGZ1bCB0byB1c2UgdGhpcyBmZWF0dXJlIGR1cmluZyBzY3JpcHQgZGV2ZWxvcG1lbnQuCi1UaGUgcmVwb3J0cyBwcm9kdWNlZCBieSBccmVmbW9kdWxle2NnaXRifSBwcm92aWRlIGluZm9ybWF0aW9uIHRoYXQKLWNhbiBzYXZlIHlvdSBhIGxvdCBvZiB0aW1lIGluIHRyYWNraW5nIGRvd24gYnVncy4gIFlvdSBjYW4gYWx3YXlzCi1yZW1vdmUgdGhlIFxjb2Rle2NnaXRifSBsaW5lIGxhdGVyIHdoZW4geW91IGhhdmUgdGVzdGVkIHlvdXIgc2NyaXB0Ci1hbmQgYXJlIGNvbmZpZGVudCB0aGF0IGl0IHdvcmtzIGNvcnJlY3RseS4KLQotVG8gZ2V0IGF0IHN1Ym1pdHRlZCBmb3JtIGRhdGEsCi1pdCdzIGJlc3QgdG8gdXNlIHRoZSBcY2xhc3N7RmllbGRTdG9yYWdlfSBjbGFzcy4gIFRoZSBvdGhlciBjbGFzc2VzCi1kZWZpbmVkIGluIHRoaXMgbW9kdWxlIGFyZSBwcm92aWRlZCBtb3N0bHkgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCi1JbnN0YW50aWF0ZSBpdCBleGFjdGx5IG9uY2UsIHdpdGhvdXQgYXJndW1lbnRzLiAgVGhpcyByZWFkcyB0aGUgZm9ybQotY29udGVudHMgZnJvbSBzdGFuZGFyZCBpbnB1dCBvciB0aGUgZW52aXJvbm1lbnQgKGRlcGVuZGluZyBvbiB0aGUKLXZhbHVlIG9mIHZhcmlvdXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIHNldCBhY2NvcmRpbmcgdG8gdGhlIENHSQotc3RhbmRhcmQpLiAgU2luY2UgaXQgbWF5IGNvbnN1bWUgc3RhbmRhcmQgaW5wdXQsIGl0IHNob3VsZCBiZQotaW5zdGFudGlhdGVkIG9ubHkgb25jZS4KLQotVGhlIFxjbGFzc3tGaWVsZFN0b3JhZ2V9IGluc3RhbmNlIGNhbiBiZSBpbmRleGVkIGxpa2UgYSBQeXRob24KLWRpY3Rpb25hcnksIGFuZCBhbHNvIHN1cHBvcnRzIHRoZSBzdGFuZGFyZCBkaWN0aW9uYXJ5IG1ldGhvZHMKLVxtZXRob2R7aGFzX2tleSgpfSBhbmQgXG1ldGhvZHtrZXlzKCl9LiAgVGhlIGJ1aWx0LWluIFxmdW5jdGlvbntsZW4oKX0KLWlzIGFsc28gc3VwcG9ydGVkLiAgRm9ybSBmaWVsZHMgY29udGFpbmluZyBlbXB0eSBzdHJpbmdzIGFyZSBpZ25vcmVkCi1hbmQgZG8gbm90IGFwcGVhciBpbiB0aGUgZGljdGlvbmFyeTsgdG8ga2VlcCBzdWNoIHZhbHVlcywgcHJvdmlkZQotYSB0cnVlIHZhbHVlIGZvciB0aGUgb3B0aW9uYWwgXHZhcntrZWVwX2JsYW5rX3ZhbHVlc30ga2V5d29yZAotcGFyYW1ldGVyIHdoZW4gY3JlYXRpbmcgdGhlIFxjbGFzc3tGaWVsZFN0b3JhZ2V9IGluc3RhbmNlLgotCi1Gb3IgaW5zdGFuY2UsIHRoZSBmb2xsb3dpbmcgY29kZSAod2hpY2ggYXNzdW1lcyB0aGF0IHRoZSAKLVxtYWlsaGVhZGVye0NvbnRlbnQtVHlwZX0gaGVhZGVyIGFuZCBibGFuayBsaW5lIGhhdmUgYWxyZWFkeSBiZWVuCi1wcmludGVkKSBjaGVja3MgdGhhdCB0aGUgZmllbGRzIFxjb2Rle25hbWV9IGFuZCBcY29kZXthZGRyfSBhcmUgYm90aAotc2V0IHRvIGEgbm9uLWVtcHR5IHN0cmluZzoKLQotXGJlZ2lue3ZlcmJhdGltfQotZm9ybSA9IGNnaS5GaWVsZFN0b3JhZ2UoKQotaWYgbm90IChmb3JtLmhhc19rZXkoIm5hbWUiKSBhbmQgZm9ybS5oYXNfa2V5KCJhZGRyIikpOgotICAgIHByaW50ICI8SDE+RXJyb3I8L0gxPiIKLSAgICBwcmludCAiUGxlYXNlIGZpbGwgaW4gdGhlIG5hbWUgYW5kIGFkZHIgZmllbGRzLiIKLSAgICByZXR1cm4KLXByaW50ICI8cD5uYW1lOiIsIGZvcm1bIm5hbWUiXS52YWx1ZQotcHJpbnQgIjxwPmFkZHI6IiwgZm9ybVsiYWRkciJdLnZhbHVlCi0uLi5mdXJ0aGVyIGZvcm0gcHJvY2Vzc2luZyBoZXJlLi4uCi1cZW5ke3ZlcmJhdGltfQotCi1IZXJlIHRoZSBmaWVsZHMsIGFjY2Vzc2VkIHRocm91Z2ggXHNhbXB7Zm9ybVtcdmFye2tleX1dfSwgYXJlCi10aGVtc2VsdmVzIGluc3RhbmNlcyBvZiBcY2xhc3N7RmllbGRTdG9yYWdlfSAob3IKLVxjbGFzc3tNaW5pRmllbGRTdG9yYWdlfSwgZGVwZW5kaW5nIG9uIHRoZSBmb3JtIGVuY29kaW5nKS4KLVRoZSBcbWVtYmVye3ZhbHVlfSBhdHRyaWJ1dGUgb2YgdGhlIGluc3RhbmNlIHlpZWxkcyB0aGUgc3RyaW5nIHZhbHVlCi1vZiB0aGUgZmllbGQuICBUaGUgXG1ldGhvZHtnZXR2YWx1ZSgpfSBtZXRob2QgcmV0dXJucyB0aGlzIHN0cmluZyB2YWx1ZQotZGlyZWN0bHk7IGl0IGFsc28gYWNjZXB0cyBhbiBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQgYXMgYSBkZWZhdWx0IHRvCi1yZXR1cm4gaWYgdGhlIHJlcXVlc3RlZCBrZXkgaXMgbm90IHByZXNlbnQuCi0KLUlmIHRoZSBzdWJtaXR0ZWQgZm9ybSBkYXRhIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgZmllbGQgd2l0aCB0aGUgc2FtZQotbmFtZSwgdGhlIG9iamVjdCByZXRyaWV2ZWQgYnkgXHNhbXB7Zm9ybVtcdmFye2tleX1dfSBpcyBub3QgYQotXGNsYXNze0ZpZWxkU3RvcmFnZX0gb3IgXGNsYXNze01pbmlGaWVsZFN0b3JhZ2V9Ci1pbnN0YW5jZSBidXQgYSBsaXN0IG9mIHN1Y2ggaW5zdGFuY2VzLiAgU2ltaWxhcmx5LCBpbiB0aGlzIHNpdHVhdGlvbiwKLVxzYW1we2Zvcm0uZ2V0dmFsdWUoXHZhcntrZXl9KX0gd291bGQgcmV0dXJuIGEgbGlzdCBvZiBzdHJpbmdzLgotSWYgeW91IGV4cGVjdCB0aGlzIHBvc3NpYmlsaXR5Ci0od2hlbiB5b3VyIEhUTUwgZm9ybSBjb250YWlucyBtdWx0aXBsZSBmaWVsZHMgd2l0aCB0aGUgc2FtZSBuYW1lKSwgdXNlCi10aGUgXGZ1bmN0aW9ue2dldGxpc3QoKX0gZnVuY3Rpb24sIHdoaWNoIGFsd2F5cyByZXR1cm5zIGEgbGlzdCBvZiB2YWx1ZXMgKHNvIHRoYXQgeW91Ci1kbyBub3QgbmVlZCB0byBzcGVjaWFsLWNhc2UgdGhlIHNpbmdsZSBpdGVtIGNhc2UpLiAgRm9yIGV4YW1wbGUsIHRoaXMKLWNvZGUgY29uY2F0ZW5hdGVzIGFueSBudW1iZXIgb2YgdXNlcm5hbWUgZmllbGRzLCBzZXBhcmF0ZWQgYnkKLWNvbW1hczoKLQotXGJlZ2lue3ZlcmJhdGltfQotdmFsdWUgPSBmb3JtLmdldGxpc3QoInVzZXJuYW1lIikKLXVzZXJuYW1lcyA9ICIsIi5qb2luKHZhbHVlKQotXGVuZHt2ZXJiYXRpbX0KLQotSWYgYSBmaWVsZCByZXByZXNlbnRzIGFuIHVwbG9hZGVkIGZpbGUsIGFjY2Vzc2luZyB0aGUgdmFsdWUgdmlhIHRoZQotXG1lbWJlcnt2YWx1ZX0gYXR0cmlidXRlIG9yIHRoZSBcZnVuY3Rpb257Z2V0dmFsdWUoKX0gbWV0aG9kIHJlYWRzIHRoZQotZW50aXJlIGZpbGUgaW4gbWVtb3J5IGFzIGEgc3RyaW5nLiAgVGhpcyBtYXkgbm90IGJlIHdoYXQgeW91IHdhbnQuCi1Zb3UgY2FuIHRlc3QgZm9yIGFuIHVwbG9hZGVkIGZpbGUgYnkgdGVzdGluZyBlaXRoZXIgdGhlIFxtZW1iZXJ7ZmlsZW5hbWV9Ci1hdHRyaWJ1dGUgb3IgdGhlIFxtZW1iZXJ7ZmlsZX0gYXR0cmlidXRlLiAgWW91IGNhbiB0aGVuIHJlYWQgdGhlIGRhdGEgYXQKLWxlaXN1cmUgZnJvbSB0aGUgXG1lbWJlcntmaWxlfSBhdHRyaWJ1dGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWZpbGVpdGVtID0gZm9ybVsidXNlcmZpbGUiXQotaWYgZmlsZWl0ZW0uZmlsZToKLSAgICAjIEl0J3MgYW4gdXBsb2FkZWQgZmlsZTsgY291bnQgbGluZXMKLSAgICBsaW5lY291bnQgPSAwCi0gICAgd2hpbGUgMToKLSAgICAgICAgbGluZSA9IGZpbGVpdGVtLmZpbGUucmVhZGxpbmUoKQotICAgICAgICBpZiBub3QgbGluZTogYnJlYWsKLSAgICAgICAgbGluZWNvdW50ID0gbGluZWNvdW50ICsgMQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGZpbGUgdXBsb2FkIGRyYWZ0IHN0YW5kYXJkIGVudGVydGFpbnMgdGhlIHBvc3NpYmlsaXR5IG9mIHVwbG9hZGluZwotbXVsdGlwbGUgZmlsZXMgZnJvbSBvbmUgZmllbGQgKHVzaW5nIGEgcmVjdXJzaXZlCi1cbWltZXR5cGV7bXVsdGlwYXJ0Lyp9IGVuY29kaW5nKS4gIFdoZW4gdGhpcyBvY2N1cnMsIHRoZSBpdGVtIHdpbGwgYmUKLWEgZGljdGlvbmFyeS1saWtlIFxjbGFzc3tGaWVsZFN0b3JhZ2V9IGl0ZW0uICBUaGlzIGNhbiBiZSBkZXRlcm1pbmVkCi1ieSB0ZXN0aW5nIGl0cyBcbWVtYmVye3R5cGV9IGF0dHJpYnV0ZSwgd2hpY2ggc2hvdWxkIGJlCi1cbWltZXR5cGV7bXVsdGlwYXJ0L2Zvcm0tZGF0YX0gKG9yIHBlcmhhcHMgYW5vdGhlciBNSU1FIHR5cGUgbWF0Y2hpbmcKLVxtaW1ldHlwZXttdWx0aXBhcnQvKn0pLiAgSW4gdGhpcyBjYXNlLCBpdCBjYW4gYmUgaXRlcmF0ZWQgb3ZlcgotcmVjdXJzaXZlbHkganVzdCBsaWtlIHRoZSB0b3AtbGV2ZWwgZm9ybSBvYmplY3QuCi0KLVdoZW4gYSBmb3JtIGlzIHN1Ym1pdHRlZCBpbiB0aGUgYGBvbGQnJyBmb3JtYXQgKGFzIHRoZSBxdWVyeSBzdHJpbmcgb3IKLWFzIGEgc2luZ2xlIGRhdGEgcGFydCBvZiB0eXBlCi1cbWltZXR5cGV7YXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkfSksIHRoZSBpdGVtcyB3aWxsIGFjdHVhbGx5Ci1iZSBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzIFxjbGFzc3tNaW5pRmllbGRTdG9yYWdlfS4gIEluIHRoaXMgY2FzZSwgdGhlCi1cbWVtYmVye2xpc3R9LCBcbWVtYmVye2ZpbGV9LCBhbmQgXG1lbWJlcntmaWxlbmFtZX0gYXR0cmlidXRlcyBhcmUKLWFsd2F5cyBcY29kZXtOb25lfS4KLQotCi1cc3Vic2VjdGlvbntIaWdoZXIgTGV2ZWwgSW50ZXJmYWNlfQotCi1cdmVyc2lvbmFkZGVkezIuMn0gICUgWFhYOiBJcyB0aGlzIHRydWUgPyAKLQotVGhlIHByZXZpb3VzIHNlY3Rpb24gZXhwbGFpbnMgaG93IHRvIHJlYWQgQ0dJIGZvcm0gZGF0YSB1c2luZyB0aGUKLVxjbGFzc3tGaWVsZFN0b3JhZ2V9IGNsYXNzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBhIGhpZ2hlciBsZXZlbAotaW50ZXJmYWNlIHdoaWNoIHdhcyBhZGRlZCB0byB0aGlzIGNsYXNzIHRvIGFsbG93IG9uZSB0byBkbyBpdCBpbiBhCi1tb3JlIHJlYWRhYmxlIGFuZCBpbnR1aXRpdmUgd2F5LiAgVGhlIGludGVyZmFjZSBkb2Vzbid0IG1ha2UgdGhlCi10ZWNobmlxdWVzIGRlc2NyaWJlZCBpbiBwcmV2aW91cyBzZWN0aW9ucyBvYnNvbGV0ZSAtLS0gdGhleSBhcmUgc3RpbGwKLXVzZWZ1bCB0byBwcm9jZXNzIGZpbGUgdXBsb2FkcyBlZmZpY2llbnRseSwgZm9yIGV4YW1wbGUuCi0KLVRoZSBpbnRlcmZhY2UgY29uc2lzdHMgb2YgdHdvIHNpbXBsZSBtZXRob2RzLiBVc2luZyB0aGUgbWV0aG9kcwoteW91IGNhbiBwcm9jZXNzIGZvcm0gZGF0YSBpbiBhIGdlbmVyaWMgd2F5LCB3aXRob3V0IHRoZSBuZWVkIHRvIHdvcnJ5Ci13aGV0aGVyIG9ubHkgb25lIG9yIG1vcmUgdmFsdWVzIHdlcmUgcG9zdGVkIHVuZGVyIG9uZSBuYW1lLgotCi1JbiB0aGUgcHJldmlvdXMgc2VjdGlvbiwgeW91IGxlYXJuZWQgdG8gd3JpdGUgZm9sbG93aW5nIGNvZGUgYW55dGltZQoteW91IGV4cGVjdGVkIGEgdXNlciB0byBwb3N0IG1vcmUgdGhhbiBvbmUgdmFsdWUgdW5kZXIgb25lIG5hbWU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWl0ZW0gPSBmb3JtLmdldHZhbHVlKCJpdGVtIikKLWlmIGlzaW5zdGFuY2UoaXRlbSwgbGlzdCk6Ci0gICAgIyBUaGUgdXNlciBpcyByZXF1ZXN0aW5nIG1vcmUgdGhhbiBvbmUgaXRlbS4KLWVsc2U6Ci0gICAgIyBUaGUgdXNlciBpcyByZXF1ZXN0aW5nIG9ubHkgb25lIGl0ZW0uCi1cZW5ke3ZlcmJhdGltfQotCi1UaGlzIHNpdHVhdGlvbiBpcyBjb21tb24gZm9yIGV4YW1wbGUgd2hlbiBhIGZvcm0gY29udGFpbnMgYSBncm91cCBvZgotbXVsdGlwbGUgY2hlY2tib3hlcyB3aXRoIHRoZSBzYW1lIG5hbWU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLTxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iaXRlbSIgdmFsdWU9IjEiIC8+Ci08aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9Iml0ZW0iIHZhbHVlPSIyIiAvPgotXGVuZHt2ZXJiYXRpbX0KLQotSW4gbW9zdCBzaXR1YXRpb25zLCBob3dldmVyLCB0aGVyZSdzIG9ubHkgb25lIGZvcm0gY29udHJvbCB3aXRoIGEKLXBhcnRpY3VsYXIgbmFtZSBpbiBhIGZvcm0gYW5kIHRoZW4geW91IGV4cGVjdCBhbmQgbmVlZCBvbmx5IG9uZSB2YWx1ZQotYXNzb2NpYXRlZCB3aXRoIHRoaXMgbmFtZS4gIFNvIHlvdSB3cml0ZSBhIHNjcmlwdCBjb250YWluaW5nIGZvcgotZXhhbXBsZSB0aGlzIGNvZGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXVzZXIgPSBmb3JtLmdldHZhbHVlKCJ1c2VyIikudXBwZXIoKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIHByb2JsZW0gd2l0aCB0aGUgY29kZSBpcyB0aGF0IHlvdSBzaG91bGQgbmV2ZXIgZXhwZWN0IHRoYXQgYQotY2xpZW50IHdpbGwgcHJvdmlkZSB2YWxpZCBpbnB1dCB0byB5b3VyIHNjcmlwdHMuICBGb3IgZXhhbXBsZSwgaWYgYQotY3VyaW91cyB1c2VyIGFwcGVuZHMgYW5vdGhlciBcc2FtcHt1c2VyPWZvb30gcGFpciB0byB0aGUgcXVlcnkgc3RyaW5nLAotdGhlbiB0aGUgc2NyaXB0IHdvdWxkIGNyYXNoLCBiZWNhdXNlIGluIHRoaXMgc2l0dWF0aW9uIHRoZQotXGNvZGV7Z2V0dmFsdWUoInVzZXIiKX0gbWV0aG9kIGNhbGwgcmV0dXJucyBhIGxpc3QgaW5zdGVhZCBvZiBhCi1zdHJpbmcuICBDYWxsaW5nIHRoZSBcbWV0aG9ke3RvdXBwZXIoKX0gbWV0aG9kIG9uIGEgbGlzdCBpcyBub3QgdmFsaWQKLShzaW5jZSBsaXN0cyBkbyBub3QgaGF2ZSBhIG1ldGhvZCBvZiB0aGlzIG5hbWUpIGFuZCByZXN1bHRzIGluIGFuCi1cZXhjZXB0aW9ue0F0dHJpYnV0ZUVycm9yfSBleGNlcHRpb24uCi0KLVRoZXJlZm9yZSwgdGhlIGFwcHJvcHJpYXRlIHdheSB0byByZWFkIGZvcm0gZGF0YSB2YWx1ZXMgd2FzIHRvIGFsd2F5cwotdXNlIHRoZSBjb2RlIHdoaWNoIGNoZWNrcyB3aGV0aGVyIHRoZSBvYnRhaW5lZCB2YWx1ZSBpcyBhIHNpbmdsZSB2YWx1ZQotb3IgYSBsaXN0IG9mIHZhbHVlcy4gIFRoYXQncyBhbm5veWluZyBhbmQgbGVhZHMgdG8gbGVzcyByZWFkYWJsZQotc2NyaXB0cy4KLQotQSBtb3JlIGNvbnZlbmllbnQgYXBwcm9hY2ggaXMgdG8gdXNlIHRoZSBtZXRob2RzIFxtZXRob2R7Z2V0Zmlyc3QoKX0KLWFuZCBcbWV0aG9ke2dldGxpc3QoKX0gcHJvdmlkZWQgYnkgdGhpcyBoaWdoZXIgbGV2ZWwgaW50ZXJmYWNlLgotCi1cYmVnaW57bWV0aG9kZGVzY31bRmllbGRTdG9yYWdlXXtnZXRmaXJzdH17bmFtZVxvcHRpb25hbHssIGRlZmF1bHR9fQotICBUaGlzIG1ldGhvZCBhbHdheXMgcmV0dXJucyBvbmx5IG9uZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggZm9ybSBmaWVsZAotICBcdmFye25hbWV9LiAgVGhlIG1ldGhvZCByZXR1cm5zIG9ubHkgdGhlIGZpcnN0IHZhbHVlIGluIGNhc2UgdGhhdAotICBtb3JlIHZhbHVlcyB3ZXJlIHBvc3RlZCB1bmRlciBzdWNoIG5hbWUuICBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBvcmRlcgotICBpbiB3aGljaCB0aGUgdmFsdWVzIGFyZSByZWNlaXZlZCBtYXkgdmFyeSBmcm9tIGJyb3dzZXIgdG8gYnJvd3NlcgotICBhbmQgc2hvdWxkIG5vdCBiZSBjb3VudGVkIG9uLlxmb290bm90ZXtOb3RlIHRoYXQgc29tZSByZWNlbnQKLSAgICAgIHZlcnNpb25zIG9mIHRoZSBIVE1MIHNwZWNpZmljYXRpb24gZG8gc3RhdGUgd2hhdCBvcmRlciB0aGUKLSAgICAgIGZpZWxkIHZhbHVlcyBzaG91bGQgYmUgc3VwcGxpZWQgaW4sIGJ1dCBrbm93aW5nIHdoZXRoZXIgYQotICAgICAgcmVxdWVzdCB3YXMgcmVjZWl2ZWQgZnJvbSBhIGNvbmZvcm1pbmcgYnJvd3Nlciwgb3IgZXZlbiBmcm9tIGEKLSAgICAgIGJyb3dzZXIgYXQgYWxsLCBpcyB0ZWRpb3VzIGFuZCBlcnJvci1wcm9uZS59ICBJZiBubyBzdWNoIGZvcm0KLSAgZmllbGQgb3IgdmFsdWUgZXhpc3RzIHRoZW4gdGhlIG1ldGhvZCByZXR1cm5zIHRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkKLSAgdGhlIG9wdGlvbmFsIHBhcmFtZXRlciBcdmFye2RlZmF1bHR9LiAgVGhpcyBwYXJhbWV0ZXIgZGVmYXVsdHMgdG8KLSAgXGNvZGV7Tm9uZX0gaWYgbm90IHNwZWNpZmllZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0ZpZWxkU3RvcmFnZV17Z2V0bGlzdH17bmFtZX0KLSAgVGhpcyBtZXRob2QgYWx3YXlzIHJldHVybnMgYSBsaXN0IG9mIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggZm9ybQotICBmaWVsZCBcdmFye25hbWV9LiAgVGhlIG1ldGhvZCByZXR1cm5zIGFuIGVtcHR5IGxpc3QgaWYgbm8gc3VjaCBmb3JtCi0gIGZpZWxkIG9yIHZhbHVlIGV4aXN0cyBmb3IgXHZhcntuYW1lfS4gIEl0IHJldHVybnMgYSBsaXN0IGNvbnNpc3RpbmcKLSAgb2Ygb25lIGl0ZW0gaWYgb25seSBvbmUgc3VjaCB2YWx1ZSBleGlzdHMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVVzaW5nIHRoZXNlIG1ldGhvZHMgeW91IGNhbiB3cml0ZSBuaWNlIGNvbXBhY3QgY29kZToKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IGNnaQotZm9ybSA9IGNnaS5GaWVsZFN0b3JhZ2UoKQotdXNlciA9IGZvcm0uZ2V0Zmlyc3QoInVzZXIiLCAiIikudXBwZXIoKSAgICAjIFRoaXMgd2F5IGl0J3Mgc2FmZS4KLWZvciBpdGVtIGluIGZvcm0uZ2V0bGlzdCgiaXRlbSIpOgotICAgIGRvX3NvbWV0aGluZyhpdGVtKQotXGVuZHt2ZXJiYXRpbX0KLQotCi1cc3Vic2VjdGlvbntPbGQgY2xhc3Nlc30KLQotVGhlc2UgY2xhc3NlcywgcHJlc2VudCBpbiBlYXJsaWVyIHZlcnNpb25zIG9mIHRoZSBcbW9kdWxle2NnaX0gbW9kdWxlLAotYXJlIHN0aWxsIHN1cHBvcnRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gIE5ldyBhcHBsaWNhdGlvbnMKLXNob3VsZCB1c2UgdGhlIFxjbGFzc3tGaWVsZFN0b3JhZ2V9IGNsYXNzLgotCi1cY2xhc3N7U3ZGb3JtQ29udGVudERpY3R9IHN0b3JlcyBzaW5nbGUgdmFsdWUgZm9ybSBjb250ZW50IGFzCi1kaWN0aW9uYXJ5OyBpdCBhc3N1bWVzIGVhY2ggZmllbGQgbmFtZSBvY2N1cnMgaW4gdGhlIGZvcm0gb25seSBvbmNlLgotCi1cY2xhc3N7Rm9ybUNvbnRlbnREaWN0fSBzdG9yZXMgbXVsdGlwbGUgdmFsdWUgZm9ybSBjb250ZW50IGFzIGEKLWRpY3Rpb25hcnkgKHRoZSBmb3JtIGl0ZW1zIGFyZSBsaXN0cyBvZiB2YWx1ZXMpLiAgVXNlZnVsIGlmIHlvdXIgZm9ybQotY29udGFpbnMgbXVsdGlwbGUgZmllbGRzIHdpdGggdGhlIHNhbWUgbmFtZS4KLQotT3RoZXIgY2xhc3NlcyAoXGNsYXNze0Zvcm1Db250ZW50fSwgXGNsYXNze0ludGVycEZvcm1Db250ZW50RGljdH0pIGFyZQotcHJlc2VudCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCByZWFsbHkgb2xkIGFwcGxpY2F0aW9ucyBvbmx5LgotSWYgeW91IHN0aWxsIHVzZSB0aGVzZSBhbmQgd291bGQgYmUgaW5jb252ZW5pZW5jZWQgd2hlbiB0aGV5Ci1kaXNhcHBlYXJlZCBmcm9tIGEgbmV4dCB2ZXJzaW9uIG9mIHRoaXMgbW9kdWxlLCBkcm9wIG1lIGEgbm90ZS4KLQotCi1cc3Vic2VjdGlvbntGdW5jdGlvbnN9Ci1cbm9kZW5hbWV7RnVuY3Rpb25zIGluIGNnaSBtb2R1bGV9Ci0KLVRoZXNlIGFyZSB1c2VmdWwgaWYgeW91IHdhbnQgbW9yZSBjb250cm9sLCBvciBpZiB5b3Ugd2FudCB0byBlbXBsb3kKLXNvbWUgb2YgdGhlIGFsZ29yaXRobXMgaW1wbGVtZW50ZWQgaW4gdGhpcyBtb2R1bGUgaW4gb3RoZXIKLWNpcmN1bXN0YW5jZXMuCi0KLVxiZWdpbntmdW5jZGVzY317cGFyc2V9e2ZwXG9wdGlvbmFseywga2VlcF9ibGFua192YWx1ZXNcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0X3BhcnNpbmd9fX0KLSAgUGFyc2UgYSBxdWVyeSBpbiB0aGUgZW52aXJvbm1lbnQgb3IgZnJvbSBhIGZpbGUgKHRoZSBmaWxlIGRlZmF1bHRzCi0gIHRvIFxjb2Rle3N5cy5zdGRpbn0pLiAgVGhlIFx2YXJ7a2VlcF9ibGFua192YWx1ZXN9IGFuZAotICBcdmFye3N0cmljdF9wYXJzaW5nfSBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQgdG8gXGZ1bmN0aW9ue3BhcnNlX3FzKCl9Ci0gIHVuY2hhbmdlZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cGFyc2VfcXN9e3FzXG9wdGlvbmFseywga2VlcF9ibGFua192YWx1ZXNcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0X3BhcnNpbmd9fX0KLVBhcnNlIGEgcXVlcnkgc3RyaW5nIGdpdmVuIGFzIGEgc3RyaW5nIGFyZ3VtZW50IChkYXRhIG9mIHR5cGUgCi1cbWltZXR5cGV7YXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkfSkuICBEYXRhIGFyZQotcmV0dXJuZWQgYXMgYSBkaWN0aW9uYXJ5LiAgVGhlIGRpY3Rpb25hcnkga2V5cyBhcmUgdGhlIHVuaXF1ZSBxdWVyeQotdmFyaWFibGUgbmFtZXMgYW5kIHRoZSB2YWx1ZXMgYXJlIGxpc3RzIG9mIHZhbHVlcyBmb3IgZWFjaCBuYW1lLgotCi1UaGUgb3B0aW9uYWwgYXJndW1lbnQgXHZhcntrZWVwX2JsYW5rX3ZhbHVlc30gaXMKLWEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgYmxhbmsgdmFsdWVzIGluCi1VUkwgZW5jb2RlZCBxdWVyaWVzIHNob3VsZCBiZSB0cmVhdGVkIGFzIGJsYW5rIHN0cmluZ3MuICAKLUEgdHJ1ZSB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCBibGFua3Mgc2hvdWxkIGJlIHJldGFpbmVkIGFzIAotYmxhbmsgc3RyaW5ncy4gIFRoZSBkZWZhdWx0IGZhbHNlIHZhbHVlIGluZGljYXRlcyB0aGF0Ci1ibGFuayB2YWx1ZXMgYXJlIHRvIGJlIGlnbm9yZWQgYW5kIHRyZWF0ZWQgYXMgaWYgdGhleSB3ZXJlCi1ub3QgaW5jbHVkZWQuCi0KLVRoZSBvcHRpb25hbCBhcmd1bWVudCBcdmFye3N0cmljdF9wYXJzaW5nfSBpcyBhIGZsYWcgaW5kaWNhdGluZyB3aGF0Ci10byBkbyB3aXRoIHBhcnNpbmcgZXJyb3JzLiAgSWYgZmFsc2UgKHRoZSBkZWZhdWx0KSwgZXJyb3JzCi1hcmUgc2lsZW50bHkgaWdub3JlZC4gIElmIHRydWUsIGVycm9ycyByYWlzZSBhIFxleGNlcHRpb257VmFsdWVFcnJvcn0KLWV4Y2VwdGlvbi4KLQotVXNlIHRoZSBcZnVuY3Rpb257XHJlZm1vZHVsZXt1cmxsaWJ9LnVybGVuY29kZSgpfSBmdW5jdGlvbiB0byBjb252ZXJ0Ci1zdWNoIGRpY3Rpb25hcmllcyBpbnRvIHF1ZXJ5IHN0cmluZ3MuCi0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cGFyc2VfcXNsfXtxc1xvcHRpb25hbHssIGtlZXBfYmxhbmtfdmFsdWVzXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3RfcGFyc2luZ319fQotUGFyc2UgYSBxdWVyeSBzdHJpbmcgZ2l2ZW4gYXMgYSBzdHJpbmcgYXJndW1lbnQgKGRhdGEgb2YgdHlwZSAKLVxtaW1ldHlwZXthcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWR9KS4gIERhdGEgYXJlCi1yZXR1cm5lZCBhcyBhIGxpc3Qgb2YgbmFtZSwgdmFsdWUgcGFpcnMuCi0KLVRoZSBvcHRpb25hbCBhcmd1bWVudCBcdmFye2tlZXBfYmxhbmtfdmFsdWVzfSBpcwotYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBibGFuayB2YWx1ZXMgaW4KLVVSTCBlbmNvZGVkIHF1ZXJpZXMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYmxhbmsgc3RyaW5ncy4gIAotQSB0cnVlIHZhbHVlIGluZGljYXRlcyB0aGF0IGJsYW5rcyBzaG91bGQgYmUgcmV0YWluZWQgYXMgCi1ibGFuayBzdHJpbmdzLiAgVGhlIGRlZmF1bHQgZmFsc2UgdmFsdWUgaW5kaWNhdGVzIHRoYXQKLWJsYW5rIHZhbHVlcyBhcmUgdG8gYmUgaWdub3JlZCBhbmQgdHJlYXRlZCBhcyBpZiB0aGV5IHdlcmUKLW5vdCBpbmNsdWRlZC4KLQotVGhlIG9wdGlvbmFsIGFyZ3VtZW50IFx2YXJ7c3RyaWN0X3BhcnNpbmd9IGlzIGEgZmxhZyBpbmRpY2F0aW5nIHdoYXQKLXRvIGRvIHdpdGggcGFyc2luZyBlcnJvcnMuICBJZiBmYWxzZSAodGhlIGRlZmF1bHQpLCBlcnJvcnMKLWFyZSBzaWxlbnRseSBpZ25vcmVkLiAgSWYgdHJ1ZSwgZXJyb3JzIHJhaXNlIGEgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfQotZXhjZXB0aW9uLgotCi1Vc2UgdGhlIFxmdW5jdGlvbntccmVmbW9kdWxle3VybGxpYn0udXJsZW5jb2RlKCl9IGZ1bmN0aW9uIHRvIGNvbnZlcnQKLXN1Y2ggbGlzdHMgb2YgcGFpcnMgaW50byBxdWVyeSBzdHJpbmdzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtwYXJzZV9tdWx0aXBhcnR9e2ZwLCBwZGljdH0KLVBhcnNlIGlucHV0IG9mIHR5cGUgXG1pbWV0eXBle211bHRpcGFydC9mb3JtLWRhdGF9IChmb3IgCi1maWxlIHVwbG9hZHMpLiAgQXJndW1lbnRzIGFyZSBcdmFye2ZwfSBmb3IgdGhlIGlucHV0IGZpbGUgYW5kCi1cdmFye3BkaWN0fSBmb3IgYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgb3RoZXIgcGFyYW1ldGVycyBpbgotdGhlIFxtYWlsaGVhZGVye0NvbnRlbnQtVHlwZX0gaGVhZGVyLgotCi1SZXR1cm5zIGEgZGljdGlvbmFyeSBqdXN0IGxpa2UgXGZ1bmN0aW9ue3BhcnNlX3FzKCl9IGtleXMgYXJlIHRoZQotZmllbGQgbmFtZXMsIGVhY2ggdmFsdWUgaXMgYSBsaXN0IG9mIHZhbHVlcyBmb3IgdGhhdCBmaWVsZC4gIFRoaXMgaXMKLWVhc3kgdG8gdXNlIGJ1dCBub3QgbXVjaCBnb29kIGlmIHlvdSBhcmUgZXhwZWN0aW5nIG1lZ2FieXRlcyB0byBiZQotdXBsb2FkZWQgLS0tIGluIHRoYXQgY2FzZSwgdXNlIHRoZSBcY2xhc3N7RmllbGRTdG9yYWdlfSBjbGFzcyBpbnN0ZWFkCi13aGljaCBpcyBtdWNoIG1vcmUgZmxleGlibGUuCi0KLU5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IHBhcnNlIG5lc3RlZCBtdWx0aXBhcnQgcGFydHMgLS0tIHVzZQotXGNsYXNze0ZpZWxkU3RvcmFnZX0gZm9yIHRoYXQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3BhcnNlX2hlYWRlcn17c3RyaW5nfQotUGFyc2UgYSBNSU1FIGhlYWRlciAoc3VjaCBhcyBcbWFpbGhlYWRlcntDb250ZW50LVR5cGV9KSBpbnRvIGEgbWFpbgotdmFsdWUgYW5kIGEgZGljdGlvbmFyeSBvZiBwYXJhbWV0ZXJzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt0ZXN0fXt9Ci1Sb2J1c3QgdGVzdCBDR0kgc2NyaXB0LCB1c2FibGUgYXMgbWFpbiBwcm9ncmFtLgotV3JpdGVzIG1pbmltYWwgSFRUUCBoZWFkZXJzIGFuZCBmb3JtYXRzIGFsbCBpbmZvcm1hdGlvbiBwcm92aWRlZCB0bwotdGhlIHNjcmlwdCBpbiBIVE1MIGZvcm0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3ByaW50X2Vudmlyb259e30KLUZvcm1hdCB0aGUgc2hlbGwgZW52aXJvbm1lbnQgaW4gSFRNTC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cHJpbnRfZm9ybX17Zm9ybX0KLUZvcm1hdCBhIGZvcm0gaW4gSFRNTC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cHJpbnRfZGlyZWN0b3J5fXt9Ci1Gb3JtYXQgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGluIEhUTUwuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3ByaW50X2Vudmlyb25fdXNhZ2V9e30KLVByaW50IGEgbGlzdCBvZiB1c2VmdWwgKHVzZWQgYnkgQ0dJKSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaW4KLUhUTUwuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2VzY2FwZX17c1xvcHRpb25hbHssIHF1b3RlfX0KLUNvbnZlcnQgdGhlIGNoYXJhY3RlcnMKLVxjaGFyYWN0ZXJ7XCZ9LCBcY2hhcmFjdGVyezx9IGFuZCBcY2hhcmFjdGVyez59IGluIHN0cmluZyBcdmFye3N9IHRvCi1IVE1MLXNhZmUgc2VxdWVuY2VzLiAgVXNlIHRoaXMgaWYgeW91IG5lZWQgdG8gZGlzcGxheSB0ZXh0IHRoYXQgbWlnaHQKLWNvbnRhaW4gc3VjaCBjaGFyYWN0ZXJzIGluIEhUTUwuICBJZiB0aGUgb3B0aW9uYWwgZmxhZyBcdmFye3F1b3RlfSBpcwotdHJ1ZSwgdGhlIHF1b3RhdGlvbiBtYXJrIGNoYXJhY3RlciAoXGNoYXJhY3RlcnsifSkgaXMgYWxzbyB0cmFuc2xhdGVkOwotdGhpcyBoZWxwcyBmb3IgaW5jbHVzaW9uIGluIGFuIEhUTUwgYXR0cmlidXRlIHZhbHVlLCBhcyBpbiBcY29kZXs8QQotSFJFRj0iLi4uIj59LiAgSWYgdGhlIHZhbHVlIHRvIGJlIHF1b3RlZCBtaWdodCBpbmNsdWRlIHNpbmdsZS0gb3IKLWRvdWJsZS1xdW90ZSBjaGFyYWN0ZXJzLCBvciBib3RoLCBjb25zaWRlciB1c2luZyB0aGUKLVxmdW5jdGlvbntxdW90ZWF0dHIoKX0gZnVuY3Rpb24gaW4gdGhlIFxyZWZtb2R1bGV7eG1sLnNheC5zYXh1dGlsc30KLW1vZHVsZSBpbnN0ZWFkLgotXGVuZHtmdW5jZGVzY30KLQotCi1cc3Vic2VjdGlvbntDYXJpbmcgYWJvdXQgc2VjdXJpdHkgXGxhYmVse2NnaS1zZWN1cml0eX19Ci0KLVxpbmRleGlpe0NHSX17c2VjdXJpdHl9Ci0KLVRoZXJlJ3Mgb25lIGltcG9ydGFudCBydWxlOiBpZiB5b3UgaW52b2tlIGFuIGV4dGVybmFsIHByb2dyYW0gKHZpYSB0aGUKLVxmdW5jdGlvbntvcy5zeXN0ZW0oKX0gb3IgXGZ1bmN0aW9ue29zLnBvcGVuKCl9IGZ1bmN0aW9ucy4gb3Igb3RoZXJzCi13aXRoIHNpbWlsYXIgZnVuY3Rpb25hbGl0eSksIG1ha2UgdmVyeSBzdXJlIHlvdSBkb24ndCBwYXNzIGFyYml0cmFyeQotc3RyaW5ncyByZWNlaXZlZCBmcm9tIHRoZSBjbGllbnQgdG8gdGhlIHNoZWxsLiAgVGhpcyBpcyBhIHdlbGwta25vd24KLXNlY3VyaXR5IGhvbGUgd2hlcmVieSBjbGV2ZXIgaGFja2VycyBhbnl3aGVyZSBvbiB0aGUgV2ViIGNhbiBleHBsb2l0IGEKLWd1bGxpYmxlIENHSSBzY3JpcHQgdG8gaW52b2tlIGFyYml0cmFyeSBzaGVsbCBjb21tYW5kcy4gIEV2ZW4gcGFydHMgb2YKLXRoZSBVUkwgb3IgZmllbGQgbmFtZXMgY2Fubm90IGJlIHRydXN0ZWQsIHNpbmNlIHRoZSByZXF1ZXN0IGRvZXNuJ3QKLWhhdmUgdG8gY29tZSBmcm9tIHlvdXIgZm9ybSEKLQotVG8gYmUgb24gdGhlIHNhZmUgc2lkZSwgaWYgeW91IG11c3QgcGFzcyBhIHN0cmluZyBnb3R0ZW4gZnJvbSBhIGZvcm0KLXRvIGEgc2hlbGwgY29tbWFuZCwgeW91IHNob3VsZCBtYWtlIHN1cmUgdGhlIHN0cmluZyBjb250YWlucyBvbmx5Ci1hbHBoYW51bWVyaWMgY2hhcmFjdGVycywgZGFzaGVzLCB1bmRlcnNjb3JlcywgYW5kIHBlcmlvZHMuCi0KLQotXHN1YnNlY3Rpb257SW5zdGFsbGluZyB5b3VyIENHSSBzY3JpcHQgb24gYSBcVU5JWFwgc3lzdGVtfQotCi1SZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciB5b3VyIEhUVFAgc2VydmVyIGFuZCBjaGVjayB3aXRoIHlvdXIgbG9jYWwKLXN5c3RlbSBhZG1pbmlzdHJhdG9yIHRvIGZpbmQgdGhlIGRpcmVjdG9yeSB3aGVyZSBDR0kgc2NyaXB0cyBzaG91bGQgYmUKLWluc3RhbGxlZDsgdXN1YWxseSB0aGlzIGlzIGluIGEgZGlyZWN0b3J5IFxmaWxle2NnaS1iaW59IGluIHRoZSBzZXJ2ZXIgdHJlZS4KLQotTWFrZSBzdXJlIHRoYXQgeW91ciBzY3JpcHQgaXMgcmVhZGFibGUgYW5kIGV4ZWN1dGFibGUgYnkgYGBvdGhlcnMnJzsgdGhlCi1cVU5JWHt9IGZpbGUgbW9kZSBzaG91bGQgYmUgXGNvZGV7MDc1NX0gb2N0YWwgKHVzZSBcc2FtcHtjaG1vZCAwNzU1Ci1cdmFye2ZpbGVuYW1lfX0pLiAgTWFrZSBzdXJlIHRoYXQgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIHNjcmlwdCBjb250YWlucwotXGNvZGV7XCMhfSBzdGFydGluZyBpbiBjb2x1bW4gMSBmb2xsb3dlZCBieSB0aGUgcGF0aG5hbWUgb2YgdGhlIFB5dGhvbgotaW50ZXJwcmV0ZXIsIGZvciBpbnN0YW5jZToKLQotXGJlZ2lue3ZlcmJhdGltfQotIyEvdXNyL2xvY2FsL2Jpbi9weXRob24KLVxlbmR7dmVyYmF0aW19Ci0KLU1ha2Ugc3VyZSB0aGUgUHl0aG9uIGludGVycHJldGVyIGV4aXN0cyBhbmQgaXMgZXhlY3V0YWJsZSBieSBgYG90aGVycycnLgotCi1NYWtlIHN1cmUgdGhhdCBhbnkgZmlsZXMgeW91ciBzY3JpcHQgbmVlZHMgdG8gcmVhZCBvciB3cml0ZSBhcmUKLXJlYWRhYmxlIG9yIHdyaXRhYmxlLCByZXNwZWN0aXZlbHksIGJ5IGBgb3RoZXJzJycgLS0tIHRoZWlyIG1vZGUKLXNob3VsZCBiZSBcY29kZXswNjQ0fSBmb3IgcmVhZGFibGUgYW5kIFxjb2RlezA2NjZ9IGZvciB3cml0YWJsZS4gIFRoaXMKLWlzIGJlY2F1c2UsIGZvciBzZWN1cml0eSByZWFzb25zLCB0aGUgSFRUUCBzZXJ2ZXIgZXhlY3V0ZXMgeW91ciBzY3JpcHQKLWFzIHVzZXIgYGBub2JvZHknJywgd2l0aG91dCBhbnkgc3BlY2lhbCBwcml2aWxlZ2VzLiAgSXQgY2FuIG9ubHkgcmVhZAotKHdyaXRlLCBleGVjdXRlKSBmaWxlcyB0aGF0IGV2ZXJ5Ym9keSBjYW4gcmVhZCAod3JpdGUsIGV4ZWN1dGUpLiAgVGhlCi1jdXJyZW50IGRpcmVjdG9yeSBhdCBleGVjdXRpb24gdGltZSBpcyBhbHNvIGRpZmZlcmVudCAoaXQgaXMgdXN1YWxseQotdGhlIHNlcnZlcidzIGNnaS1iaW4gZGlyZWN0b3J5KSBhbmQgdGhlIHNldCBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMKLWlzIGFsc28gZGlmZmVyZW50IGZyb20gd2hhdCB5b3UgZ2V0IHdoZW4geW91IGxvZyBpbi4gIEluIHBhcnRpY3VsYXIsIGRvbid0Ci1jb3VudCBvbiB0aGUgc2hlbGwncyBzZWFyY2ggcGF0aCBmb3IgZXhlY3V0YWJsZXMgKFxlbnZ2YXJ7UEFUSH0pIG9yCi10aGUgUHl0aG9uIG1vZHVsZSBzZWFyY2ggcGF0aCAoXGVudnZhcntQWVRIT05QQVRIfSkgdG8gYmUgc2V0IHRvCi1hbnl0aGluZyBpbnRlcmVzdGluZy4KLQotSWYgeW91IG5lZWQgdG8gbG9hZCBtb2R1bGVzIGZyb20gYSBkaXJlY3Rvcnkgd2hpY2ggaXMgbm90IG9uIFB5dGhvbidzCi1kZWZhdWx0IG1vZHVsZSBzZWFyY2ggcGF0aCwgeW91IGNhbiBjaGFuZ2UgdGhlIHBhdGggaW4geW91ciBzY3JpcHQsCi1iZWZvcmUgaW1wb3J0aW5nIG90aGVyIG1vZHVsZXMuICBGb3IgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IHN5cwotc3lzLnBhdGguaW5zZXJ0KDAsICIvdXNyL2hvbWUvam9lL2xpYi9weXRob24iKQotc3lzLnBhdGguaW5zZXJ0KDAsICIvdXNyL2xvY2FsL2xpYi9weXRob24iKQotXGVuZHt2ZXJiYXRpbX0KLQotKFRoaXMgd2F5LCB0aGUgZGlyZWN0b3J5IGluc2VydGVkIGxhc3Qgd2lsbCBiZSBzZWFyY2hlZCBmaXJzdCEpCi0KLUluc3RydWN0aW9ucyBmb3Igbm9uLVxVTklYe30gc3lzdGVtcyB3aWxsIHZhcnk7IGNoZWNrIHlvdXIgSFRUUCBzZXJ2ZXIncwotZG9jdW1lbnRhdGlvbiAoaXQgd2lsbCB1c3VhbGx5IGhhdmUgYSBzZWN0aW9uIG9uIENHSSBzY3JpcHRzKS4KLQotCi1cc3Vic2VjdGlvbntUZXN0aW5nIHlvdXIgQ0dJIHNjcmlwdH0KLQotVW5mb3J0dW5hdGVseSwgYSBDR0kgc2NyaXB0IHdpbGwgZ2VuZXJhbGx5IG5vdCBydW4gd2hlbiB5b3UgdHJ5IGl0Ci1mcm9tIHRoZSBjb21tYW5kIGxpbmUsIGFuZCBhIHNjcmlwdCB0aGF0IHdvcmtzIHBlcmZlY3RseSBmcm9tIHRoZQotY29tbWFuZCBsaW5lIG1heSBmYWlsIG15c3RlcmlvdXNseSB3aGVuIHJ1biBmcm9tIHRoZSBzZXJ2ZXIuICBUaGVyZSdzCi1vbmUgcmVhc29uIHdoeSB5b3Ugc2hvdWxkIHN0aWxsIHRlc3QgeW91ciBzY3JpcHQgZnJvbSB0aGUgY29tbWFuZAotbGluZTogaWYgaXQgY29udGFpbnMgYSBzeW50YXggZXJyb3IsIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgd29uJ3QKLWV4ZWN1dGUgaXQgYXQgYWxsLCBhbmQgdGhlIEhUVFAgc2VydmVyIHdpbGwgbW9zdCBsaWtlbHkgc2VuZCBhIGNyeXB0aWMKLWVycm9yIHRvIHRoZSBjbGllbnQuCi0KLUFzc3VtaW5nIHlvdXIgc2NyaXB0IGhhcyBubyBzeW50YXggZXJyb3JzLCB5ZXQgaXQgZG9lcyBub3Qgd29yaywgeW91Ci1oYXZlIG5vIGNob2ljZSBidXQgdG8gcmVhZCB0aGUgbmV4dCBzZWN0aW9uLgotCi0KLVxzdWJzZWN0aW9ue0RlYnVnZ2luZyBDR0kgc2NyaXB0c30gXGluZGV4aWl7Q0dJfXtkZWJ1Z2dpbmd9Ci0KLUZpcnN0IG9mIGFsbCwgY2hlY2sgZm9yIHRyaXZpYWwgaW5zdGFsbGF0aW9uIGVycm9ycyAtLS0gcmVhZGluZyB0aGUKLXNlY3Rpb24gYWJvdmUgb24gaW5zdGFsbGluZyB5b3VyIENHSSBzY3JpcHQgY2FyZWZ1bGx5IGNhbiBzYXZlIHlvdSBhCi1sb3Qgb2YgdGltZS4gIElmIHlvdSB3b25kZXIgd2hldGhlciB5b3UgaGF2ZSB1bmRlcnN0b29kIHRoZQotaW5zdGFsbGF0aW9uIHByb2NlZHVyZSBjb3JyZWN0bHksIHRyeSBpbnN0YWxsaW5nIGEgY29weSBvZiB0aGlzIG1vZHVsZQotZmlsZSAoXGZpbGV7Y2dpLnB5fSkgYXMgYSBDR0kgc2NyaXB0LiAgV2hlbiBpbnZva2VkIGFzIGEgc2NyaXB0LCB0aGUgZmlsZQotd2lsbCBkdW1wIGl0cyBlbnZpcm9ubWVudCBhbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBmb3JtIGluIEhUTUwgZm9ybS4KLUdpdmUgaXQgdGhlIHJpZ2h0IG1vZGUgZXRjLCBhbmQgc2VuZCBpdCBhIHJlcXVlc3QuICBJZiBpdCdzIGluc3RhbGxlZAotaW4gdGhlIHN0YW5kYXJkIFxmaWxle2NnaS1iaW59IGRpcmVjdG9yeSwgaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHNlbmQgaXQgYQotcmVxdWVzdCBieSBlbnRlcmluZyBhIFVSTCBpbnRvIHlvdXIgYnJvd3NlciBvZiB0aGUgZm9ybToKLQotXGJlZ2lue3ZlcmJhdGltfQotaHR0cDovL3lvdXJob3N0bmFtZS9jZ2ktYmluL2NnaS5weT9uYW1lPUpvZStCbG93JmFkZHI9QXQrSG9tZQotXGVuZHt2ZXJiYXRpbX0KLQotSWYgdGhpcyBnaXZlcyBhbiBlcnJvciBvZiB0eXBlIDQwNCwgdGhlIHNlcnZlciBjYW5ub3QgZmluZCB0aGUgc2NyaXB0Ci0tLSBwZXJoYXBzIHlvdSBuZWVkIHRvIGluc3RhbGwgaXQgaW4gYSBkaWZmZXJlbnQgZGlyZWN0b3J5LiAgSWYgaXQKLWdpdmVzIGFub3RoZXIgZXJyb3IsIHRoZXJlJ3MgYW4gaW5zdGFsbGF0aW9uIHByb2JsZW0gdGhhdAoteW91IHNob3VsZCBmaXggYmVmb3JlIHRyeWluZyB0byBnbyBhbnkgZnVydGhlci4gIElmIHlvdSBnZXQgYSBuaWNlbHkKLWZvcm1hdHRlZCBsaXN0aW5nIG9mIHRoZSBlbnZpcm9ubWVudCBhbmQgZm9ybSBjb250ZW50IChpbiB0aGlzCi1leGFtcGxlLCB0aGUgZmllbGRzIHNob3VsZCBiZSBsaXN0ZWQgYXMgYGBhZGRyJycgd2l0aCB2YWx1ZSBgYEF0IEhvbWUnJwotYW5kIGBgbmFtZScnIHdpdGggdmFsdWUgYGBKb2UgQmxvdycnKSwgdGhlIFxmaWxle2NnaS5weX0gc2NyaXB0IGhhcyBiZWVuCi1pbnN0YWxsZWQgY29ycmVjdGx5LiAgSWYgeW91IGZvbGxvdyB0aGUgc2FtZSBwcm9jZWR1cmUgZm9yIHlvdXIgb3duCi1zY3JpcHQsIHlvdSBzaG91bGQgbm93IGJlIGFibGUgdG8gZGVidWcgaXQuCi0KLVRoZSBuZXh0IHN0ZXAgY291bGQgYmUgdG8gY2FsbCB0aGUgXG1vZHVsZXtjZ2l9IG1vZHVsZSdzCi1cZnVuY3Rpb257dGVzdCgpfSBmdW5jdGlvbiBmcm9tIHlvdXIgc2NyaXB0OiByZXBsYWNlIGl0cyBtYWluIGNvZGUKLXdpdGggdGhlIHNpbmdsZSBzdGF0ZW1lbnQKLQotXGJlZ2lue3ZlcmJhdGltfQotY2dpLnRlc3QoKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhpcyBzaG91bGQgcHJvZHVjZSB0aGUgc2FtZSByZXN1bHRzIGFzIHRob3NlIGdvdHRlbiBmcm9tIGluc3RhbGxpbmcKLXRoZSBcZmlsZXtjZ2kucHl9IGZpbGUgaXRzZWxmLgotCi1XaGVuIGFuIG9yZGluYXJ5IFB5dGhvbiBzY3JpcHQgcmFpc2VzIGFuIHVuaGFuZGxlZCBleGNlcHRpb24gKGZvcgotd2hhdGV2ZXIgcmVhc29uOiBvZiBhIHR5cG8gaW4gYSBtb2R1bGUgbmFtZSwgYSBmaWxlIHRoYXQgY2FuJ3QgYmUKLW9wZW5lZCwgZXRjLiksIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgcHJpbnRzIGEgbmljZSB0cmFjZWJhY2sgYW5kCi1leGl0cy4gIFdoaWxlIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgd2lsbCBzdGlsbCBkbyB0aGlzIHdoZW4geW91ciBDR0kKLXNjcmlwdCByYWlzZXMgYW4gZXhjZXB0aW9uLCBtb3N0IGxpa2VseSB0aGUgdHJhY2ViYWNrIHdpbGwgZW5kIHVwIGluCi1vbmUgb2YgdGhlIEhUVFAgc2VydmVyJ3MgbG9nIGZpbGVzLCBvciBiZSBkaXNjYXJkZWQgYWx0b2dldGhlci4KLQotRm9ydHVuYXRlbHksIG9uY2UgeW91IGhhdmUgbWFuYWdlZCB0byBnZXQgeW91ciBzY3JpcHQgdG8gZXhlY3V0ZQotXGVtcGh7c29tZX0gY29kZSwgeW91IGNhbiBlYXNpbHkgc2VuZCB0cmFjZWJhY2tzIHRvIHRoZSBXZWIgYnJvd3NlcgotdXNpbmcgdGhlIFxyZWZtb2R1bGV7Y2dpdGJ9IG1vZHVsZS4gIElmIHlvdSBoYXZlbid0IGRvbmUgc28gYWxyZWFkeSwKLWp1c3QgYWRkIHRoZSBsaW5lOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgY2dpdGI7IGNnaXRiLmVuYWJsZSgpCi1cZW5ke3ZlcmJhdGltfQotCi10byB0aGUgdG9wIG9mIHlvdXIgc2NyaXB0LiAgVGhlbiB0cnkgcnVubmluZyBpdCBhZ2Fpbjsgd2hlbiBhCi1wcm9ibGVtIG9jY3VycywgeW91IHNob3VsZCBzZWUgYSBkZXRhaWxlZCByZXBvcnQgdGhhdCB3aWxsCi1saWtlbHkgbWFrZSBhcHBhcmVudCB0aGUgY2F1c2Ugb2YgdGhlIGNyYXNoLgotCi1JZiB5b3Ugc3VzcGVjdCB0aGF0IHRoZXJlIG1heSBiZSBhIHByb2JsZW0gaW4gaW1wb3J0aW5nIHRoZQotXHJlZm1vZHVsZXtjZ2l0Yn0gbW9kdWxlLCB5b3UgY2FuIHVzZSBhbiBldmVuIG1vcmUgcm9idXN0IGFwcHJvYWNoCi0od2hpY2ggb25seSB1c2VzIGJ1aWx0LWluIG1vZHVsZXMpOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgc3lzCi1zeXMuc3RkZXJyID0gc3lzLnN0ZG91dAotcHJpbnQgIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbiIKLXByaW50Ci0uLi55b3VyIGNvZGUgaGVyZS4uLgotXGVuZHt2ZXJiYXRpbX0KLQotVGhpcyByZWxpZXMgb24gdGhlIFB5dGhvbiBpbnRlcnByZXRlciB0byBwcmludCB0aGUgdHJhY2ViYWNrLiAgVGhlCi1jb250ZW50IHR5cGUgb2YgdGhlIG91dHB1dCBpcyBzZXQgdG8gcGxhaW4gdGV4dCwgd2hpY2ggZGlzYWJsZXMgYWxsCi1IVE1MIHByb2Nlc3NpbmcuICBJZiB5b3VyIHNjcmlwdCB3b3JrcywgdGhlIHJhdyBIVE1MIHdpbGwgYmUgZGlzcGxheWVkCi1ieSB5b3VyIGNsaWVudC4gIElmIGl0IHJhaXNlcyBhbiBleGNlcHRpb24sIG1vc3QgbGlrZWx5IGFmdGVyIHRoZQotZmlyc3QgdHdvIGxpbmVzIGhhdmUgYmVlbiBwcmludGVkLCBhIHRyYWNlYmFjayB3aWxsIGJlIGRpc3BsYXllZC4KLUJlY2F1c2Ugbm8gSFRNTCBpbnRlcnByZXRhdGlvbiBpcyBnb2luZyBvbiwgdGhlIHRyYWNlYmFjayB3aWxsIGJlCi1yZWFkYWJsZS4KLQotCi1cc3Vic2VjdGlvbntDb21tb24gcHJvYmxlbXMgYW5kIHNvbHV0aW9uc30KLQotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSBNb3N0IEhUVFAgc2VydmVycyBidWZmZXIgdGhlIG91dHB1dCBmcm9tIENHSSBzY3JpcHRzIHVudGlsIHRoZQotc2NyaXB0IGlzIGNvbXBsZXRlZC4gIFRoaXMgbWVhbnMgdGhhdCBpdCBpcyBub3QgcG9zc2libGUgdG8gZGlzcGxheSBhCi1wcm9ncmVzcyByZXBvcnQgb24gdGhlIGNsaWVudCdzIGRpc3BsYXkgd2hpbGUgdGhlIHNjcmlwdCBpcyBydW5uaW5nLgotCi1caXRlbSBDaGVjayB0aGUgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBhYm92ZS4KLQotXGl0ZW0gQ2hlY2sgdGhlIEhUVFAgc2VydmVyJ3MgbG9nIGZpbGVzLiAgKFxzYW1we3RhaWwgLWYgbG9nZmlsZX0gaW4gYQotc2VwYXJhdGUgd2luZG93IG1heSBiZSB1c2VmdWwhKQotCi1caXRlbSBBbHdheXMgY2hlY2sgYSBzY3JpcHQgZm9yIHN5bnRheCBlcnJvcnMgZmlyc3QsIGJ5IGRvaW5nIHNvbWV0aGluZwotbGlrZSBcc2FtcHtweXRob24gc2NyaXB0LnB5fS4KLQotXGl0ZW0gSWYgeW91ciBzY3JpcHQgZG9lcyBub3QgaGF2ZSBhbnkgc3ludGF4IGVycm9ycywgdHJ5IGFkZGluZwotXHNhbXB7aW1wb3J0IGNnaXRiOyBjZ2l0Yi5lbmFibGUoKX0gdG8gdGhlIHRvcCBvZiB0aGUgc2NyaXB0LgotCi1caXRlbSBXaGVuIGludm9raW5nIGV4dGVybmFsIHByb2dyYW1zLCBtYWtlIHN1cmUgdGhleSBjYW4gYmUgZm91bmQuCi1Vc3VhbGx5LCB0aGlzIG1lYW5zIHVzaW5nIGFic29sdXRlIHBhdGggbmFtZXMgLS0tIFxlbnZ2YXJ7UEFUSH0gaXMKLXVzdWFsbHkgbm90IHNldCB0byBhIHZlcnkgdXNlZnVsIHZhbHVlIGluIGEgQ0dJIHNjcmlwdC4KLQotXGl0ZW0gV2hlbiByZWFkaW5nIG9yIHdyaXRpbmcgZXh0ZXJuYWwgZmlsZXMsIG1ha2Ugc3VyZSB0aGV5IGNhbiBiZSByZWFkCi1vciB3cml0dGVuIGJ5IHRoZSB1c2VyaWQgdW5kZXIgd2hpY2ggeW91ciBDR0kgc2NyaXB0IHdpbGwgYmUgcnVubmluZzoKLXRoaXMgaXMgdHlwaWNhbGx5IHRoZSB1c2VyaWQgdW5kZXIgd2hpY2ggdGhlIHdlYiBzZXJ2ZXIgaXMgcnVubmluZywgb3Igc29tZQotZXhwbGljaXRseSBzcGVjaWZpZWQgdXNlcmlkIGZvciBhIHdlYiBzZXJ2ZXIncyBcc2FtcHtzdWV4ZWN9IGZlYXR1cmUuCi0KLVxpdGVtIERvbid0IHRyeSB0byBnaXZlIGEgQ0dJIHNjcmlwdCBhIHNldC11aWQgbW9kZS4gIFRoaXMgZG9lc24ndCB3b3JrIG9uCi1tb3N0IHN5c3RlbXMsIGFuZCBpcyBhIHNlY3VyaXR5IGxpYWJpbGl0eSBhcyB3ZWxsLgotXGVuZHtpdGVtaXplfQotCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmNnaWh0dHAudGV4IGIvRG9jL2xpYi9saWJjZ2lodHRwLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYwNzI4ZS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmNnaWh0dHAudGV4CisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtDR0lIVFRQU2VydmVyfSAtLS0KLSAgICAgICAgIENHSS1jYXBhYmxlIEhUVFAgcmVxdWVzdCBoYW5kbGVyfQotCi0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtDR0lIVFRQU2VydmVyfQotXHNlY3Rpb25hdXRob3J7TW9zaGUgWmFka2F9e21vc2hlekB6YWRrYS5zaXRlLmNvLmlsfQotXG1vZHVsZXN5bm9wc2lze1RoaXMgbW9kdWxlIHByb3ZpZGVzIGEgcmVxdWVzdCBoYW5kbGVyIGZvciBIVFRQIHNlcnZlcnMKLSAgICAgICAgICAgICAgICB3aGljaCBjYW4gcnVuIENHSSBzY3JpcHRzLn0KLQotCi1UaGUgXG1vZHVsZXtDR0lIVFRQU2VydmVyfSBtb2R1bGUgZGVmaW5lcyBhIHJlcXVlc3QtaGFuZGxlciBjbGFzcywKLWludGVyZmFjZSBjb21wYXRpYmxlIHdpdGgKLVxjbGFzc3tCYXNlSFRUUFNlcnZlci5CYXNlSFRUUFJlcXVlc3RIYW5kbGVyfSBhbmQgaW5oZXJpdHMgYmVoYXZpb3IKLWZyb20gXGNsYXNze1NpbXBsZUhUVFBTZXJ2ZXIuU2ltcGxlSFRUUFJlcXVlc3RIYW5kbGVyfSBidXQgY2FuIGFsc28KLXJ1biBDR0kgc2NyaXB0cy4KLQotXG5vdGV7VGhpcyBtb2R1bGUgY2FuIHJ1biBDR0kgc2NyaXB0cyBvbiBcVU5JWHt9IGFuZCBXaW5kb3dzIHN5c3RlbXM7Ci1vbiBNYWMgT1MgaXQgd2lsbCBvbmx5IGJlIGFibGUgdG8gcnVuIFB5dGhvbiBzY3JpcHRzIHdpdGhpbiB0aGUgc2FtZQotcHJvY2VzcyBhcyBpdHNlbGYufQotCi1cbm90ZXtDR0kgc2NyaXB0cyBydW4gYnkgdGhlIFxjbGFzc3tDR0lIVFRQUmVxdWVzdEhhbmRsZXJ9IGNsYXNzIGNhbm5vdCBleGVjdXRlCi1yZWRpcmVjdHMgKEhUVFAgY29kZSAzMDIpLCBiZWNhdXNlIGNvZGUgMjAwIChzY3JpcHQgb3V0cHV0IGZvbGxvd3MpCi1pcyBzZW50IHByaW9yIHRvIGV4ZWN1dGlvbiBvZiB0aGUgQ0dJIHNjcmlwdC4gIFRoaXMgcHJlLWVtcHRzIHRoZSBzdGF0dXMKLWNvZGUufQotCi1UaGUgXG1vZHVsZXtDR0lIVFRQU2VydmVyfSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGNsYXNzOgotCi1cYmVnaW57Y2xhc3NkZXNjfXtDR0lIVFRQUmVxdWVzdEhhbmRsZXJ9e3JlcXVlc3QsIGNsaWVudF9hZGRyZXNzLCBzZXJ2ZXJ9Ci1UaGlzIGNsYXNzIGlzIHVzZWQgdG8gc2VydmUgZWl0aGVyIGZpbGVzIG9yIG91dHB1dCBvZiBDR0kgc2NyaXB0cyBmcm9tIAotdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCBiZWxvdy4gTm90ZSB0aGF0IG1hcHBpbmcgSFRUUCBoaWVyYXJjaGljCi1zdHJ1Y3R1cmUgdG8gbG9jYWwgZGlyZWN0b3J5IHN0cnVjdHVyZSBpcyBleGFjdGx5IGFzIGluCi1cY2xhc3N7U2ltcGxlSFRUUFNlcnZlci5TaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXJ9LgotCi1UaGUgY2xhc3Mgd2lsbCBob3dldmVyLCBydW4gdGhlIENHSSBzY3JpcHQsIGluc3RlYWQgb2Ygc2VydmluZyBpdCBhcyBhCi1maWxlLCBpZiBpdCBndWVzc2VzIGl0IHRvIGJlIGEgQ0dJIHNjcmlwdC4gT25seSBkaXJlY3RvcnktYmFzZWQgQ0dJCi1hcmUgdXNlZCAtLS0gdGhlIG90aGVyIGNvbW1vbiBzZXJ2ZXIgY29uZmlndXJhdGlvbiBpcyB0byB0cmVhdCBzcGVjaWFsCi1leHRlbnNpb25zIGFzIGRlbm90aW5nIENHSSBzY3JpcHRzLgotCi1UaGUgXGZ1bmN0aW9ue2RvX0dFVCgpfSBhbmQgXGZ1bmN0aW9ue2RvX0hFQUQoKX0gZnVuY3Rpb25zIGFyZQotbW9kaWZpZWQgdG8gcnVuIENHSSBzY3JpcHRzIGFuZCBzZXJ2ZSB0aGUgb3V0cHV0LCBpbnN0ZWFkIG9mIHNlcnZpbmcKLWZpbGVzLCBpZiB0aGUgcmVxdWVzdCBsZWFkcyB0byBzb21ld2hlcmUgYmVsb3cgdGhlCi1cY29kZXtjZ2lfZGlyZWN0b3JpZXN9IHBhdGguCi1cZW5ke2NsYXNzZGVzY30KLQotVGhlIFxjbGFzc3tDR0lIVFRQUmVxdWVzdEhhbmRsZXJ9IGRlZmluZXMgdGhlIGZvbGxvd2luZyBkYXRhIG1lbWJlcjoKLQotXGJlZ2lue21lbWJlcmRlc2N9e2NnaV9kaXJlY3Rvcmllc30KLVRoaXMgZGVmYXVsdHMgdG8gXGNvZGV7WycvY2dpLWJpbicsICcvaHRiaW4nXX0gYW5kIGRlc2NyaWJlcwotZGlyZWN0b3JpZXMgdG8gdHJlYXQgYXMgY29udGFpbmluZyBDR0kgc2NyaXB0cy4KLVxlbmR7bWVtYmVyZGVzY30KLQotVGhlIFxjbGFzc3tDR0lIVFRQUmVxdWVzdEhhbmRsZXJ9IGRlZmluZXMgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotCi1cYmVnaW57bWV0aG9kZGVzY317ZG9fUE9TVH17fQotVGhpcyBtZXRob2Qgc2VydmVzIHRoZSBcY29kZXsnUE9TVCd9IHJlcXVlc3QgdHlwZSwgb25seSBhbGxvd2VkIGZvcgotQ0dJIHNjcmlwdHMuICBFcnJvciA1MDEsICJDYW4gb25seSBQT1NUIHRvIENHSSBzY3JpcHRzIiwgaXMgb3V0cHV0Ci13aGVuIHRyeWluZyB0byBQT1NUIHRvIGEgbm9uLUNHSSB1cmwuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLU5vdGUgdGhhdCBDR0kgc2NyaXB0cyB3aWxsIGJlIHJ1biB3aXRoIFVJRCBvZiB1c2VyIG5vYm9keSwgZm9yIHNlY3VyaXR5Ci1yZWFzb25zLiBQcm9ibGVtcyB3aXRoIHRoZSBDR0kgc2NyaXB0IHdpbGwgYmUgdHJhbnNsYXRlZCB0byBlcnJvciA0MDMuCi0KLUZvciBleGFtcGxlIHVzYWdlLCBzZWUgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBcZnVuY3Rpb257dGVzdCgpfQotZnVuY3Rpb24uCi0KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWVtb2R1bGV7QmFzZUhUVFBTZXJ2ZXJ9e0Jhc2UgY2xhc3MgaW1wbGVtZW50YXRpb24gZm9yIFdlYiBzZXJ2ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHJlcXVlc3QgaGFuZGxlci59Ci1cZW5ke3NlZWFsc299CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmNnaXRiLnRleCBiL0RvYy9saWIvbGliY2dpdGIudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTk5NTlmLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGliY2dpdGIudGV4CisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtjZ2l0Yn0gLS0tCi0gICAgICAgICBUcmFjZWJhY2sgbWFuYWdlciBmb3IgQ0dJIHNjcmlwdHN9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtjZ2l0Yn0KLVxtb2R1bGVzeW5vcHNpc3tDb25maWd1cmFibGUgdHJhY2ViYWNrIGhhbmRsZXIgZm9yIENHSSBzY3JpcHRzLn0KLVxtb2R1bGVhdXRob3J7S2EtUGluZyBZZWV9e3BpbmdAbGZ3Lm9yZ30KLVxzZWN0aW9uYXV0aG9ye0ZyZWQgTC4gRHJha2UsIEpyLn17ZmRyYWtlQGFjbS5vcmd9Ci0KLVx2ZXJzaW9uYWRkZWR7Mi4yfQotXGluZGV4e0NHSSFleGNlcHRpb25zfQotXGluZGV4e0NHSSF0cmFjZWJhY2tzfQotXGluZGV4e2V4Y2VwdGlvbnMhaW4gQ0dJIHNjcmlwdHN9Ci1caW5kZXh7dHJhY2ViYWNrcyFpbiBDR0kgc2NyaXB0c30KLQotVGhlIFxtb2R1bGV7Y2dpdGJ9IG1vZHVsZSBwcm92aWRlcyBhIHNwZWNpYWwgZXhjZXB0aW9uIGhhbmRsZXIgZm9yIFB5dGhvbgotc2NyaXB0cy4gIChJdHMgbmFtZSBpcyBhIGJpdCBtaXNsZWFkaW5nLiAgSXQgd2FzIG9yaWdpbmFsbHkgZGVzaWduZWQgdG8KLWRpc3BsYXkgZXh0ZW5zaXZlIHRyYWNlYmFjayBpbmZvcm1hdGlvbiBpbiBIVE1MIGZvciBDR0kgc2NyaXB0cy4gIEl0IHdhcwotbGF0ZXIgZ2VuZXJhbGl6ZWQgdG8gYWxzbyBkaXNwbGF5IHRoaXMgaW5mb3JtYXRpb24gaW4gcGxhaW4gdGV4dC4pICBBZnRlcgotdGhpcyBtb2R1bGUgaXMgYWN0aXZhdGVkLCBpZiBhbiB1bmNhdWdodCBleGNlcHRpb24gb2NjdXJzLCBhIGRldGFpbGVkLAotZm9ybWF0dGVkIHJlcG9ydCB3aWxsIGJlIGRpc3BsYXllZC4gIFRoZSByZXBvcnQKLWluY2x1ZGVzIGEgdHJhY2ViYWNrIHNob3dpbmcgZXhjZXJwdHMgb2YgdGhlIHNvdXJjZSBjb2RlIGZvciBlYWNoIGxldmVsLAotYXMgd2VsbCBhcyB0aGUgdmFsdWVzIG9mIHRoZSBhcmd1bWVudHMgYW5kIGxvY2FsIHZhcmlhYmxlcyB0byBjdXJyZW50bHkKLXJ1bm5pbmcgZnVuY3Rpb25zLCB0byBoZWxwIHlvdSBkZWJ1ZyB0aGUgcHJvYmxlbS4gIE9wdGlvbmFsbHksIHlvdSBjYW4KLXNhdmUgdGhpcyBpbmZvcm1hdGlvbiB0byBhIGZpbGUgaW5zdGVhZCBvZiBzZW5kaW5nIGl0IHRvIHRoZSBicm93c2VyLgotCi1UbyBlbmFibGUgdGhpcyBmZWF0dXJlLCBzaW1wbHkgYWRkIG9uZSBsaW5lIHRvIHRoZSB0b3Agb2YgeW91ciBDR0kgc2NyaXB0OgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgY2dpdGI7IGNnaXRiLmVuYWJsZSgpCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgb3B0aW9ucyB0byB0aGUgXGZ1bmN0aW9ue2VuYWJsZSgpfSBmdW5jdGlvbiBjb250cm9sIHdoZXRoZXIgdGhlCi1yZXBvcnQgaXMgZGlzcGxheWVkIGluIHRoZSBicm93c2VyIGFuZCB3aGV0aGVyIHRoZSByZXBvcnQgaXMgbG9nZ2VkCi10byBhIGZpbGUgZm9yIGxhdGVyIGFuYWx5c2lzLgotCi0KLVxiZWdpbntmdW5jZGVzY317ZW5hYmxlfXtcb3B0aW9uYWx7ZGlzcGxheVxvcHRpb25hbHssIGxvZ2RpclxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dFxvcHRpb25hbHssIGZvcm1hdH19fX19Ci0gIFRoaXMgZnVuY3Rpb24gY2F1c2VzIHRoZSBcbW9kdWxle2NnaXRifSBtb2R1bGUgdG8gdGFrZSBvdmVyIHRoZQotICBpbnRlcnByZXRlcidzIGRlZmF1bHQgaGFuZGxpbmcgZm9yIGV4Y2VwdGlvbnMgYnkgc2V0dGluZyB0aGUKLSAgdmFsdWUgb2YgXG1lbWJlcntccmVmbW9kdWxle3N5c30uZXhjZXB0aG9va30uCi0gIFx3aXRoc3ViaXRlbXsoaW4gbW9kdWxlIHN5cyl9e1x0dGluZGV4e2V4Y2VwdGhvb2soKX19Ci0KLSAgVGhlIG9wdGlvbmFsIGFyZ3VtZW50IFx2YXJ7ZGlzcGxheX0gZGVmYXVsdHMgdG8gXGNvZGV7MX0gYW5kIGNhbiBiZSBzZXQKLSAgdG8gXGNvZGV7MH0gdG8gc3VwcHJlc3Mgc2VuZGluZyB0aGUgdHJhY2ViYWNrIHRvIHRoZSBicm93c2VyLgotICBJZiB0aGUgYXJndW1lbnQgXHZhcntsb2dkaXJ9IGlzIHByZXNlbnQsIHRoZSB0cmFjZWJhY2sgcmVwb3J0cyBhcmUKLSAgd3JpdHRlbiB0byBmaWxlcy4gIFRoZSB2YWx1ZSBvZiBcdmFye2xvZ2Rpcn0gc2hvdWxkIGJlIGEgZGlyZWN0b3J5Ci0gIHdoZXJlIHRoZXNlIGZpbGVzIHdpbGwgYmUgcGxhY2VkLgotICBUaGUgb3B0aW9uYWwgYXJndW1lbnQgXHZhcntjb250ZXh0fSBpcyB0aGUgbnVtYmVyIG9mIGxpbmVzIG9mCi0gIGNvbnRleHQgdG8gZGlzcGxheSBhcm91bmQgdGhlIGN1cnJlbnQgbGluZSBvZiBzb3VyY2UgY29kZSBpbiB0aGUKLSAgdHJhY2ViYWNrOyB0aGlzIGRlZmF1bHRzIHRvIFxjb2RlezV9LgotICBJZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgXHZhcntmb3JtYXR9IGlzIFxjb2RleyJodG1sIn0sIHRoZSBvdXRwdXQgaXMKLSAgZm9ybWF0dGVkIGFzIEhUTUwuICBBbnkgb3RoZXIgdmFsdWUgZm9yY2VzIHBsYWluIHRleHQgb3V0cHV0LiAgVGhlIGRlZmF1bHQKLSAgdmFsdWUgaXMgXGNvZGV7Imh0bWwifS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aGFuZGxlcn17XG9wdGlvbmFse2luZm99fQotICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgYW4gZXhjZXB0aW9uIHVzaW5nIHRoZSBkZWZhdWx0IHNldHRpbmdzCi0gICh0aGF0IGlzLCBzaG93IGEgcmVwb3J0IGluIHRoZSBicm93c2VyLCBidXQgZG9uJ3QgbG9nIHRvIGEgZmlsZSkuCi0gIFRoaXMgY2FuIGJlIHVzZWQgd2hlbiB5b3UndmUgY2F1Z2h0IGFuIGV4Y2VwdGlvbiBhbmQgd2FudCB0bwotICByZXBvcnQgaXQgdXNpbmcgXG1vZHVsZXtjZ2l0Yn0uICBUaGUgb3B0aW9uYWwgXHZhcntpbmZvfSBhcmd1bWVudAotICBzaG91bGQgYmUgYSAzLXR1cGxlIGNvbnRhaW5pbmcgYW4gZXhjZXB0aW9uIHR5cGUsIGV4Y2VwdGlvbgotICB2YWx1ZSwgYW5kIHRyYWNlYmFjayBvYmplY3QsIGV4YWN0bHkgbGlrZSB0aGUgdHVwbGUgcmV0dXJuZWQgYnkKLSAgXGZ1bmN0aW9ue1xyZWZtb2R1bGV7c3lzfS5leGNfaW5mbygpfS4gIElmIHRoZSBcdmFye2luZm99IGFyZ3VtZW50Ci0gIGlzIG5vdCBzdXBwbGllZCwgdGhlIGN1cnJlbnQgZXhjZXB0aW9uIGlzIG9idGFpbmVkIGZyb20KLSAgXGZ1bmN0aW9ue1xyZWZtb2R1bGV7c3lzfS5leGNfaW5mbygpfS4KLVxlbmR7ZnVuY2Rlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmNodW5rLnRleCBiL0RvYy9saWIvbGliY2h1bmsudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTJhNDk0Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGliY2h1bmsudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7Y2h1bmt9IC0tLQotCSBSZWFkIElGRiBjaHVua2VkIGRhdGF9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtjaHVua30KLVxtb2R1bGVzeW5vcHNpc3tNb2R1bGUgdG8gcmVhZCBJRkYgY2h1bmtzLn0KLVxtb2R1bGVhdXRob3J7U2pvZXJkIE11bGxlbmRlcn17c2pvZXJkQGFjbS5vcmd9Ci1cc2VjdGlvbmF1dGhvcntTam9lcmQgTXVsbGVuZGVyfXtzam9lcmRAYWNtLm9yZ30KLQotCi0KLVRoaXMgbW9kdWxlIHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IgcmVhZGluZyBmaWxlcyB0aGF0IHVzZSBFQSBJRkYgODUKLWNodW5rcy5cZm9vdG5vdGV7YGBFQSBJRkYgODUnJyBTdGFuZGFyZCBmb3IgSW50ZXJjaGFuZ2UgRm9ybWF0IEZpbGVzLAotSmVycnkgTW9ycmlzb24sIEVsZWN0cm9uaWMgQXJ0cywgSmFudWFyeSAxOTg1Ln0gIFRoaXMgZm9ybWF0IGlzIHVzZWQKLWluIGF0IGxlYXN0IHRoZSBBdWRpb1xpbmRleHtBdWRpbyBJbnRlcmNoYW5nZSBGaWxlCi1Gb3JtYXR9XGluZGV4e0FJRkZ9XGluZGV4e0FJRkYtQ30gSW50ZXJjaGFuZ2UgRmlsZSBGb3JtYXQKLShBSUZGL0FJRkYtQykgYW5kIHRoZSBSZWFsXGluZGV4e1JlYWwgTWVkaWEgRmlsZSBGb3JtYXR9IE1lZGlhIEZpbGUKLUZvcm1hdFxpbmRleHtSTUZGfSAoUk1GRikuICBUaGUgV0FWRSBhdWRpbyBmaWxlIGZvcm1hdCBpcyBjbG9zZWx5Ci1yZWxhdGVkIGFuZCBjYW4gYWxzbyBiZSByZWFkIHVzaW5nIHRoaXMgbW9kdWxlLgotCi1BIGNodW5rIGhhcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKLQotXGJlZ2lue3RhYmxlaWlpfXtjfGN8bH17dGV4dHJtfXtPZmZzZXR9e0xlbmd0aH17Q29udGVudHN9Ci0gIFxsaW5laWlpezB9ezR9e0NodW5rIElEfQotICBcbGluZWlpaXs0fXs0fXtTaXplIG9mIGNodW5rIGluIGJpZy1lbmRpYW4gYnl0ZSBvcmRlciwgbm90IGluY2x1ZGluZyB0aGUgCi0gICAgICAgICAgICAgICAgIGhlYWRlcn0KLSAgXGxpbmVpaWl7OH17XHZhcntufX17RGF0YSBieXRlcywgd2hlcmUgXHZhcntufSBpcyB0aGUgc2l6ZSBnaXZlbiBpbgotICAgICAgICAgICAgICAgICAgICAgICB0aGUgcHJlY2VkaW5nIGZpZWxkfQotICBcbGluZWlpaXs4ICsgXHZhcntufX17MCBvciAxfXtQYWQgYnl0ZSBuZWVkZWQgaWYgXHZhcntufSBpcyBvZGQgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rIGFsaWdubWVudCBpcyB1c2VkfQotXGVuZHt0YWJsZWlpaX0KLQotVGhlIElEIGlzIGEgNC1ieXRlIHN0cmluZyB3aGljaCBpZGVudGlmaWVzIHRoZSB0eXBlIG9mIGNodW5rLgotCi1UaGUgc2l6ZSBmaWVsZCAoYSAzMi1iaXQgdmFsdWUsIGVuY29kZWQgdXNpbmcgYmlnLWVuZGlhbiBieXRlIG9yZGVyKQotZ2l2ZXMgdGhlIHNpemUgb2YgdGhlIGNodW5rIGRhdGEsIG5vdCBpbmNsdWRpbmcgdGhlIDgtYnl0ZSBoZWFkZXIuCi0KLVVzdWFsbHkgYW4gSUZGLXR5cGUgZmlsZSBjb25zaXN0cyBvZiBvbmUgb3IgbW9yZSBjaHVua3MuICBUaGUgcHJvcG9zZWQKLXVzYWdlIG9mIHRoZSBcY2xhc3N7Q2h1bmt9IGNsYXNzIGRlZmluZWQgaGVyZSBpcyB0byBpbnN0YW50aWF0ZSBhbgotaW5zdGFuY2UgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggY2h1bmsgYW5kIHJlYWQgZnJvbSB0aGUgaW5zdGFuY2UgdW50aWwKLWl0IHJlYWNoZXMgdGhlIGVuZCwgYWZ0ZXIgd2hpY2ggYSBuZXcgaW5zdGFuY2UgY2FuIGJlIGluc3RhbnRpYXRlZC4KLUF0IHRoZSBlbmQgb2YgdGhlIGZpbGUsIGNyZWF0aW5nIGEgbmV3IGluc3RhbmNlIHdpbGwgZmFpbCB3aXRoIGEKLVxleGNlcHRpb257RU9GRXJyb3J9IGV4Y2VwdGlvbi4KLQotXGJlZ2lue2NsYXNzZGVzY317Q2h1bmt9e2ZpbGVcb3B0aW9uYWx7LCBhbGlnbiwgYmlnZW5kaWFuLCBpbmNsaGVhZGVyfX0KLUNsYXNzIHdoaWNoIHJlcHJlc2VudHMgYSBjaHVuay4gIFRoZSBcdmFye2ZpbGV9IGFyZ3VtZW50IGlzIGV4cGVjdGVkCi10byBiZSBhIGZpbGUtbGlrZSBvYmplY3QuICBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIHNwZWNpZmljYWxseQotYWxsb3dlZC4gIFRoZSBvbmx5IG1ldGhvZCB0aGF0IGlzIG5lZWRlZCBpcyBcbWV0aG9ke3JlYWQoKX0uICBJZiB0aGUKLW1ldGhvZHMgXG1ldGhvZHtzZWVrKCl9IGFuZCBcbWV0aG9ke3RlbGwoKX0gYXJlIHByZXNlbnQgYW5kIGRvbid0Ci1yYWlzZSBhbiBleGNlcHRpb24sIHRoZXkgYXJlIGFsc28gdXNlZC4gIElmIHRoZXNlIG1ldGhvZHMgYXJlIHByZXNlbnQKLWFuZCByYWlzZSBhbiBleGNlcHRpb24sIHRoZXkgYXJlIGV4cGVjdGVkIHRvIG5vdCBoYXZlIGFsdGVyZWQgdGhlCi1vYmplY3QuICBJZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgXHZhcnthbGlnbn0gaXMgdHJ1ZSwgY2h1bmtzIGFyZQotYXNzdW1lZCB0byBiZSBhbGlnbmVkIG9uIDItYnl0ZSBib3VuZGFyaWVzLiAgSWYgXHZhcnthbGlnbn0gaXMKLWZhbHNlLCBubyBhbGlnbm1lbnQgaXMgYXNzdW1lZC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuICBJZiB0aGUKLW9wdGlvbmFsIGFyZ3VtZW50IFx2YXJ7YmlnZW5kaWFufSBpcyBmYWxzZSwgdGhlIGNodW5rIHNpemUgaXMgYXNzdW1lZAotdG8gYmUgaW4gbGl0dGxlLWVuZGlhbiBvcmRlci4gIFRoaXMgaXMgbmVlZGVkIGZvciBXQVZFIGF1ZGlvIGZpbGVzLgotVGhlIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZS4gIElmIHRoZSBvcHRpb25hbCBhcmd1bWVudCBcdmFye2luY2xoZWFkZXJ9Ci1pcyB0cnVlLCB0aGUgc2l6ZSBnaXZlbiBpbiB0aGUgY2h1bmsgaGVhZGVyIGluY2x1ZGVzIHRoZSBzaXplIG9mIHRoZQotaGVhZGVyLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuCi1cZW5ke2NsYXNzZGVzY30KLQotQSBcY2xhc3N7Q2h1bmt9IG9iamVjdCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtnZXRuYW1lfXt9Ci1SZXR1cm5zIHRoZSBuYW1lIChJRCkgb2YgdGhlIGNodW5rLiAgVGhpcyBpcyB0aGUgZmlyc3QgNCBieXRlcyBvZiB0aGUKLWNodW5rLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Z2V0c2l6ZX17fQotUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgY2h1bmsuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtjbG9zZX17fQotQ2xvc2UgYW5kIHNraXAgdG8gdGhlIGVuZCBvZiB0aGUgY2h1bmsuICBUaGlzIGRvZXMgbm90IGNsb3NlIHRoZQotdW5kZXJseWluZyBmaWxlLgotXGVuZHttZXRob2RkZXNjfQotCi1UaGUgcmVtYWluaW5nIG1ldGhvZHMgd2lsbCByYWlzZSBcZXhjZXB0aW9ue0lPRXJyb3J9IGlmIGNhbGxlZCBhZnRlcgotdGhlIFxtZXRob2R7Y2xvc2UoKX0gbWV0aG9kIGhhcyBiZWVuIGNhbGxlZC4KLQotXGJlZ2lue21ldGhvZGRlc2N9e2lzYXR0eX17fQotUmV0dXJucyBcY29kZXtGYWxzZX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtzZWVrfXtwb3Ncb3B0aW9uYWx7LCB3aGVuY2V9fQotU2V0IHRoZSBjaHVuaydzIGN1cnJlbnQgcG9zaXRpb24uICBUaGUgXHZhcnt3aGVuY2V9IGFyZ3VtZW50IGlzCi1vcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gXGNvZGV7MH0gKGFic29sdXRlIGZpbGUgcG9zaXRpb25pbmcpOyBvdGhlcgotdmFsdWVzIGFyZSBcY29kZXsxfSAoc2VlayByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBwb3NpdGlvbikgYW5kCi1cY29kZXsyfSAoc2VlayByZWxhdGl2ZSB0byB0aGUgZmlsZSdzIGVuZCkuICBUaGVyZSBpcyBubyByZXR1cm4gdmFsdWUuCi1JZiB0aGUgdW5kZXJseWluZyBmaWxlIGRvZXMgbm90IGFsbG93IHNlZWssIG9ubHkgZm9yd2FyZCBzZWVrcyBhcmUKLWFsbG93ZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXt0ZWxsfXt9Ci1SZXR1cm4gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW50byB0aGUgY2h1bmsuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtyZWFkfXtcb3B0aW9uYWx7c2l6ZX19Ci1SZWFkIGF0IG1vc3QgXHZhcntzaXplfSBieXRlcyBmcm9tIHRoZSBjaHVuayAobGVzcyBpZiB0aGUgcmVhZCBoaXRzCi10aGUgZW5kIG9mIHRoZSBjaHVuayBiZWZvcmUgb2J0YWluaW5nIFx2YXJ7c2l6ZX0gYnl0ZXMpLiAgSWYgdGhlCi1cdmFye3NpemV9IGFyZ3VtZW50IGlzIG5lZ2F0aXZlIG9yIG9taXR0ZWQsIHJlYWQgYWxsIGRhdGEgdW50aWwgdGhlCi1lbmQgb2YgdGhlIGNodW5rLiAgVGhlIGJ5dGVzIGFyZSByZXR1cm5lZCBhcyBhIHN0cmluZyBvYmplY3QuICBBbgotZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIHdoZW4gdGhlIGVuZCBvZiB0aGUgY2h1bmsgaXMgZW5jb3VudGVyZWQKLWltbWVkaWF0ZWx5LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317c2tpcH17fQotU2tpcCB0byB0aGUgZW5kIG9mIHRoZSBjaHVuay4gIEFsbCBmdXJ0aGVyIGNhbGxzIHRvIFxtZXRob2R7cmVhZCgpfQotZm9yIHRoZSBjaHVuayB3aWxsIHJldHVybiBcY29kZXsnJ30uICBJZiB5b3UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIHRoZQotY29udGVudHMgb2YgdGhlIGNodW5rLCB0aGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHNvIHRoYXQgdGhlIGZpbGUKLXBvaW50cyB0byB0aGUgc3RhcnQgb2YgdGhlIG5leHQgY2h1bmsuCi1cZW5ke21ldGhvZGRlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmNtYXRoLnRleCBiL0RvYy9saWIvbGliY21hdGgudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGFhNDViLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGliY21hdGgudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7Y21hdGh9IC0tLQotICAgICAgICAgTWF0aGVtYXRpY2FsIGZ1bmN0aW9ucyBmb3IgY29tcGxleCBudW1iZXJzfQotCi1cZGVjbGFyZW1vZHVsZXtidWlsdGlufXtjbWF0aH0KLVxtb2R1bGVzeW5vcHNpc3tNYXRoZW1hdGljYWwgZnVuY3Rpb25zIGZvciBjb21wbGV4IG51bWJlcnMufQotCi1UaGlzIG1vZHVsZSBpcyBhbHdheXMgYXZhaWxhYmxlLiAgSXQgcHJvdmlkZXMgYWNjZXNzIHRvIG1hdGhlbWF0aWNhbAotZnVuY3Rpb25zIGZvciBjb21wbGV4IG51bWJlcnMuICBUaGUgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIGFjY2VwdAotaW50ZWdlcnMsIGZsb2F0aW5nLXBvaW50IG51bWJlcnMgb3IgY29tcGxleCBudW1iZXJzIGFzIGFyZ3VtZW50cy4KLVRoZXkgd2lsbCBhbHNvIGFjY2VwdCBhbnkgUHl0aG9uIG9iamVjdCB0aGF0IGhhcyBlaXRoZXIgYQotXG1ldGhvZHtfX2NvbXBsZXhfX30gb3IgYSBcbWV0aG9ke19fZmxvYXRfX30gbWV0aG9kOiB0aGVzZSBtZXRob2RzIGFyZQotdXNlZCB0byBjb252ZXJ0IHRoZSBvYmplY3QgdG8gYSBjb21wbGV4IG9yIGZsb2F0aW5nLXBvaW50IG51bWJlciwgcmVzcGVjdGl2ZWx5LCBhbmQKLXRoZSBmdW5jdGlvbiBpcyB0aGVuIGFwcGxpZWQgdG8gdGhlIHJlc3VsdCBvZiB0aGUgY29udmVyc2lvbi4KLQotVGhlIGZ1bmN0aW9ucyBhcmU6Ci0KLVxiZWdpbntmdW5jZGVzY317YWNvc317eH0KLVJldHVybiB0aGUgYXJjIGNvc2luZSBvZiBcdmFye3h9LgotVGhlcmUgYXJlIHR3byBicmFuY2ggY3V0czoKLU9uZSBleHRlbmRzIHJpZ2h0IGZyb20gMSBhbG9uZyB0aGUgcmVhbCBheGlzIHRvIFxpbmZpbml0eSwgY29udGludW91cwotZnJvbSBiZWxvdy4KLVRoZSBvdGhlciBleHRlbmRzIGxlZnQgZnJvbSAtMSBhbG9uZyB0aGUgcmVhbCBheGlzIHRvIC1caW5maW5pdHksCi1jb250aW51b3VzIGZyb20gYWJvdmUuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2Fjb3NofXt4fQotUmV0dXJuIHRoZSBoeXBlcmJvbGljIGFyYyBjb3NpbmUgb2YgXHZhcnt4fS4KLVRoZXJlIGlzIG9uZSBicmFuY2ggY3V0LCBleHRlbmRpbmcgbGVmdCBmcm9tIDEgYWxvbmcgdGhlIHJlYWwgYXhpcwotdG8gLVxpbmZpbml0eSwgY29udGludW91cyBmcm9tIGFib3ZlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXthc2lufXt4fQotUmV0dXJuIHRoZSBhcmMgc2luZSBvZiBcdmFye3h9LgotVGhpcyBoYXMgdGhlIHNhbWUgYnJhbmNoIGN1dHMgYXMgXGZ1bmN0aW9ue2Fjb3MoKX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2FzaW5ofXt4fQotUmV0dXJuIHRoZSBoeXBlcmJvbGljIGFyYyBzaW5lIG9mIFx2YXJ7eH0uCi1UaGVyZSBhcmUgdHdvIGJyYW5jaCBjdXRzLCBleHRlbmRpbmcgbGVmdCBmcm9tIFxwbHVzbWludXNcY29kZXsxan0gdG8KLVxwbHVzbWludXMtXGluZmluaXR5XGNvZGV7an0sIGJvdGggY29udGludW91cyBmcm9tIGFib3ZlLgotVGhlc2UgYnJhbmNoIGN1dHMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBidWcgdG8gYmUgY29ycmVjdGVkIGluIGEKLWZ1dHVyZSByZWxlYXNlLgotVGhlIGNvcnJlY3QgYnJhbmNoIGN1dHMgc2hvdWxkIGV4dGVuZCBhbG9uZyB0aGUgaW1hZ2luYXJ5IGF4aXMsCi1vbmUgZnJvbSBcY29kZXsxan0gdXAgdG8gXGluZmluaXR5XGNvZGV7an0gYW5kIGNvbnRpbnVvdXMgZnJvbSB0aGUKLXJpZ2h0LCBhbmQgb25lIGZyb20gLVxjb2RlezFqfSBkb3duIHRvIC1caW5maW5pdHlcY29kZXtqfSBhbmQKLWNvbnRpbnVvdXMgZnJvbSB0aGUgbGVmdC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317YXRhbn17eH0KLVJldHVybiB0aGUgYXJjIHRhbmdlbnQgb2YgXHZhcnt4fS4KLVRoZXJlIGFyZSB0d28gYnJhbmNoIGN1dHM6Ci1PbmUgZXh0ZW5kcyBmcm9tIFxjb2RlezFqfSBhbG9uZyB0aGUgaW1hZ2luYXJ5IGF4aXMgdG8KLVxpbmZpbml0eVxjb2Rle2p9LCBjb250aW51b3VzIGZyb20gdGhlIGxlZnQuCi1UaGUgb3RoZXIgZXh0ZW5kcyBmcm9tIC1cY29kZXsxan0gYWxvbmcgdGhlIGltYWdpbmFyeSBheGlzIHRvCi0tXGluZmluaXR5XGNvZGV7an0sIGNvbnRpbnVvdXMgZnJvbSB0aGUgbGVmdC4KLShUaGlzIHNob3VsZCBwcm9iYWJseSBiZSBjaGFuZ2VkIHNvIHRoZSB1cHBlciBjdXQgYmVjb21lcyBjb250aW51b3VzCi1mcm9tIHRoZSBvdGhlciBzaWRlLikKLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317YXRhbmh9e3h9Ci1SZXR1cm4gdGhlIGh5cGVyYm9saWMgYXJjIHRhbmdlbnQgb2YgXHZhcnt4fS4KLVRoZXJlIGFyZSB0d28gYnJhbmNoIGN1dHM6Ci1PbmUgZXh0ZW5kcyBmcm9tIDEgYWxvbmcgdGhlIHJlYWwgYXhpcyB0byBcaW5maW5pdHksIGNvbnRpbnVvdXMKLWZyb20gYWJvdmUuCi1UaGUgb3RoZXIgZXh0ZW5kcyBmcm9tIC0xIGFsb25nIHRoZSByZWFsIGF4aXMgdG8gLVxpbmZpbml0eSwKLWNvbnRpbnVvdXMgZnJvbSBhYm92ZS4KLShUaGlzIHNob3VsZCBwcm9iYWJseSBiZSBjaGFuZ2VkIHNvIHRoZSByaWdodCBjdXQgYmVjb21lcyBjb250aW51b3VzIGZyb20KLXRoZSBvdGhlciBzaWRlLikKLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y29zfXt4fQotUmV0dXJuIHRoZSBjb3NpbmUgb2YgXHZhcnt4fS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y29zaH17eH0KLVJldHVybiB0aGUgaHlwZXJib2xpYyBjb3NpbmUgb2YgXHZhcnt4fS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZXhwfXt4fQotUmV0dXJuIHRoZSBleHBvbmVudGlhbCB2YWx1ZSBcY29kZXtlKipcdmFye3h9fS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bG9nfXt4XG9wdGlvbmFseywgYmFzZX19Ci1SZXR1cm5zIHRoZSBsb2dhcml0aG0gb2YgXHZhcnt4fSB0byB0aGUgZ2l2ZW4gXHZhcntiYXNlfS4KLUlmIHRoZSBcdmFye2Jhc2V9IGlzIG5vdCBzcGVjaWZpZWQsIHJldHVybnMgdGhlIG5hdHVyYWwgbG9nYXJpdGhtIG9mIFx2YXJ7eH0uCi1UaGVyZSBpcyBvbmUgYnJhbmNoIGN1dCwgZnJvbSAwIGFsb25nIHRoZSBuZWdhdGl2ZSByZWFsIGF4aXMgdG8KLS1caW5maW5pdHksIGNvbnRpbnVvdXMgZnJvbSBhYm92ZS4KLVx2ZXJzaW9uY2hhbmdlZFtcdmFye2Jhc2V9IGFyZ3VtZW50IGFkZGVkXXsyLjR9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2xvZzEwfXt4fQotUmV0dXJuIHRoZSBiYXNlLTEwIGxvZ2FyaXRobSBvZiBcdmFye3h9LgotVGhpcyBoYXMgdGhlIHNhbWUgYnJhbmNoIGN1dCBhcyBcZnVuY3Rpb257bG9nKCl9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzaW59e3h9Ci1SZXR1cm4gdGhlIHNpbmUgb2YgXHZhcnt4fS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c2luaH17eH0KLVJldHVybiB0aGUgaHlwZXJib2xpYyBzaW5lIG9mIFx2YXJ7eH0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NxcnR9e3h9Ci1SZXR1cm4gdGhlIHNxdWFyZSByb290IG9mIFx2YXJ7eH0uCi1UaGlzIGhhcyB0aGUgc2FtZSBicmFuY2ggY3V0IGFzIFxmdW5jdGlvbntsb2coKX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3Rhbn17eH0KLVJldHVybiB0aGUgdGFuZ2VudCBvZiBcdmFye3h9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt0YW5ofXt4fQotUmV0dXJuIHRoZSBoeXBlcmJvbGljIHRhbmdlbnQgb2YgXHZhcnt4fS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVRoZSBtb2R1bGUgYWxzbyBkZWZpbmVzIHR3byBtYXRoZW1hdGljYWwgY29uc3RhbnRzOgotCi1cYmVnaW57ZGF0YWRlc2N9e3BpfQotVGhlIG1hdGhlbWF0aWNhbCBjb25zdGFudCBcZW1waHtwaX0sIGFzIGEgcmVhbC4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317ZX0KLVRoZSBtYXRoZW1hdGljYWwgY29uc3RhbnQgXGVtcGh7ZX0sIGFzIGEgcmVhbC4KLVxlbmR7ZGF0YWRlc2N9Ci0KLU5vdGUgdGhhdCB0aGUgc2VsZWN0aW9uIG9mIGZ1bmN0aW9ucyBpcyBzaW1pbGFyLCBidXQgbm90IGlkZW50aWNhbCwgdG8KLXRoYXQgaW4gbW9kdWxlIFxyZWZtb2R1bGV7bWF0aH1ccmVmYmltb2RpbmRleHttYXRofS4gIFRoZSByZWFzb24gZm9yIGhhdmluZwotdHdvIG1vZHVsZXMgaXMgdGhhdCBzb21lIHVzZXJzIGFyZW4ndCBpbnRlcmVzdGVkIGluIGNvbXBsZXggbnVtYmVycywKLWFuZCBwZXJoYXBzIGRvbid0IGV2ZW4ga25vdyB3aGF0IHRoZXkgYXJlLiAgVGhleSB3b3VsZCByYXRoZXIgaGF2ZQotXGNvZGV7bWF0aC5zcXJ0KC0xKX0gcmFpc2UgYW4gZXhjZXB0aW9uIHRoYW4gcmV0dXJuIGEgY29tcGxleCBudW1iZXIuCi1BbHNvIG5vdGUgdGhhdCB0aGUgZnVuY3Rpb25zIGRlZmluZWQgaW4gXG1vZHVsZXtjbWF0aH0gYWx3YXlzIHJldHVybiBhCi1jb21wbGV4IG51bWJlciwgZXZlbiBpZiB0aGUgYW5zd2VyIGNhbiBiZSBleHByZXNzZWQgYXMgYSByZWFsIG51bWJlcgotKGluIHdoaWNoIGNhc2UgdGhlIGNvbXBsZXggbnVtYmVyIGhhcyBhbiBpbWFnaW5hcnkgcGFydCBvZiB6ZXJvKS4KLQotQSBub3RlIG9uIGJyYW5jaCBjdXRzOiBUaGV5IGFyZSBjdXJ2ZXMgYWxvbmcgd2hpY2ggdGhlIGdpdmVuIGZ1bmN0aW9uCi1mYWlscyB0byBiZSBjb250aW51b3VzLiAgVGhleSBhcmUgYSBuZWNlc3NhcnkgZmVhdHVyZSBvZiBtYW55IGNvbXBsZXgKLWZ1bmN0aW9ucy4gIEl0IGlzIGFzc3VtZWQgdGhhdCBpZiB5b3UgbmVlZCB0byBjb21wdXRlIHdpdGggY29tcGxleAotZnVuY3Rpb25zLCB5b3Ugd2lsbCB1bmRlcnN0YW5kIGFib3V0IGJyYW5jaCBjdXRzLiAgQ29uc3VsdCBhbG1vc3QgYW55Ci0obm90IHRvbyBlbGVtZW50YXJ5KSBib29rIG9uIGNvbXBsZXggdmFyaWFibGVzIGZvciBlbmxpZ2h0ZW5tZW50LiAgRm9yCi1pbmZvcm1hdGlvbiBvZiB0aGUgcHJvcGVyIGNob2ljZSBvZiBicmFuY2ggY3V0cyBmb3IgbnVtZXJpY2FsCi1wdXJwb3NlcywgYSBnb29kIHJlZmVyZW5jZSBzaG91bGQgYmUgdGhlIGZvbGxvd2luZzoKLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWV0ZXh0e0thaGFuLCBXOiAgQnJhbmNoIGN1dHMgZm9yIGNvbXBsZXggZWxlbWVudGFyeSBmdW5jdGlvbnM7Ci0gICAgICAgICAgIG9yLCBNdWNoIGFkbyBhYm91dCBub3RoaW5nJ3Mgc2lnbiBiaXQuICBJbiBJc2VybGVzLCBBLiwKLSAgICAgICAgICAgYW5kIFBvd2VsbCwgTS4gKGVkcy4pLCBcY2l0ZXRpdGxle1RoZSBzdGF0ZSBvZiB0aGUgYXJ0IGluCi0gICAgICAgICAgIG51bWVyaWNhbCBhbmFseXNpc30uIENsYXJlbmRvbiBQcmVzcyAoMTk4NykgcHAxNjUtMjExLn0KLVxlbmR7c2VlYWxzb30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliY21kLnRleCBiL0RvYy9saWIvbGliY21kLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEwZjE5Yy4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmNtZC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtjbWR9IC0tLQotICAgICAgICAgU3VwcG9ydCBmb3IgbGluZS1vcmllbnRlZCBjb21tYW5kIGludGVycHJldGVyc30KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2NtZH0KLVxzZWN0aW9uYXV0aG9ye0VyaWMgUy4gUmF5bW9uZH17ZXNyQHNuYXJrLnRoeXJzdXMuY29tfQotXG1vZHVsZXN5bm9wc2lze0J1aWxkIGxpbmUtb3JpZW50ZWQgY29tbWFuZCBpbnRlcnByZXRlcnMufQotCi0KLVRoZSBcY2xhc3N7Q21kfSBjbGFzcyBwcm92aWRlcyBhIHNpbXBsZSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcKLWxpbmUtb3JpZW50ZWQgY29tbWFuZCBpbnRlcnByZXRlcnMuICBUaGVzZSBhcmUgb2Z0ZW4gdXNlZnVsIGZvcgotdGVzdCBoYXJuZXNzZXMsIGFkbWluaXN0cmF0aXZlIHRvb2xzLCBhbmQgcHJvdG90eXBlcyB0aGF0IHdpbGwKLWxhdGVyIGJlIHdyYXBwZWQgaW4gYSBtb3JlIHNvcGhpc3RpY2F0ZWQgaW50ZXJmYWNlLgotCi1cYmVnaW57Y2xhc3NkZXNjfXtDbWR9e1xvcHRpb25hbHtjb21wbGV0ZWtleVxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgIHN0ZGluXG9wdGlvbmFseywgc3Rkb3V0fX19fQotQSBcY2xhc3N7Q21kfSBpbnN0YW5jZSBvciBzdWJjbGFzcyBpbnN0YW5jZSBpcyBhIGxpbmUtb3JpZW50ZWQKLWludGVycHJldGVyIGZyYW1ld29yay4gIFRoZXJlIGlzIG5vIGdvb2QgcmVhc29uIHRvIGluc3RhbnRpYXRlCi1cY2xhc3N7Q21kfSBpdHNlbGY7IHJhdGhlciwgaXQncyB1c2VmdWwgYXMgYSBzdXBlcmNsYXNzIG9mIGFuCi1pbnRlcnByZXRlciBjbGFzcyB5b3UgZGVmaW5lIHlvdXJzZWxmIGluIG9yZGVyIHRvIGluaGVyaXQKLVxjbGFzc3tDbWR9J3MgbWV0aG9kcyBhbmQgZW5jYXBzdWxhdGUgYWN0aW9uIG1ldGhvZHMuCi0KLVRoZSBvcHRpb25hbCBhcmd1bWVudCBcdmFye2NvbXBsZXRla2V5fSBpcyB0aGUgXHJlZm1vZHVsZXtyZWFkbGluZX0gbmFtZQotb2YgYSBjb21wbGV0aW9uIGtleTsgaXQgZGVmYXVsdHMgdG8gXGtiZHtUYWJ9LiBJZiBcdmFye2NvbXBsZXRla2V5fSBpcwotbm90IFxjb25zdGFudHtOb25lfSBhbmQgXHJlZm1vZHVsZXtyZWFkbGluZX0gaXMgYXZhaWxhYmxlLCBjb21tYW5kIGNvbXBsZXRpb24KLWlzIGRvbmUgYXV0b21hdGljYWxseS4KLQotVGhlIG9wdGlvbmFsIGFyZ3VtZW50cyBcdmFye3N0ZGlufSBhbmQgXHZhcntzdGRvdXR9IHNwZWNpZnkgdGhlIAotaW5wdXQgYW5kIG91dHB1dCBmaWxlIG9iamVjdHMgdGhhdCB0aGUgQ21kIGluc3RhbmNlIG9yIHN1YmNsYXNzIAotaW5zdGFuY2Ugd2lsbCB1c2UgZm9yIGlucHV0IGFuZCBvdXRwdXQuIElmIG5vdCBzcGVjaWZpZWQsIHRoZXkKLXdpbGwgZGVmYXVsdCB0byBcdmFye3N5cy5zdGRpbn0gYW5kIFx2YXJ7c3lzLnN0ZG91dH0uCi0KLVx2ZXJzaW9uY2hhbmdlZFtUaGUgXHZhcntzdGRpbn0gYW5kIFx2YXJ7c3Rkb3V0fSBwYXJhbWV0ZXJzIHdlcmUgYWRkZWRdezIuM30KLVxlbmR7Y2xhc3NkZXNjfQotCi1cc3Vic2VjdGlvbntDbWQgT2JqZWN0c30KLVxsYWJlbHtDbWQtb2JqZWN0c30KLQotQSBcY2xhc3N7Q21kfSBpbnN0YW5jZSBoYXMgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotCi1cYmVnaW57bWV0aG9kZGVzY31bQ21kXXtjbWRsb29wfXtcb3B0aW9uYWx7aW50cm99fQotUmVwZWF0ZWRseSBpc3N1ZSBhIHByb21wdCwgYWNjZXB0IGlucHV0LCBwYXJzZSBhbiBpbml0aWFsIHByZWZpeCBvZmYKLXRoZSByZWNlaXZlZCBpbnB1dCwgYW5kIGRpc3BhdGNoIHRvIGFjdGlvbiBtZXRob2RzLCBwYXNzaW5nIHRoZW0gdGhlCi1yZW1haW5kZXIgb2YgdGhlIGxpbmUgYXMgYXJndW1lbnQuCi0KLVRoZSBvcHRpb25hbCBhcmd1bWVudCBpcyBhIGJhbm5lciBvciBpbnRybyBzdHJpbmcgdG8gYmUgaXNzdWVkIGJlZm9yZSB0aGUKLWZpcnN0IHByb21wdCAodGhpcyBvdmVycmlkZXMgdGhlIFxtZW1iZXJ7aW50cm99IGNsYXNzIG1lbWJlcikuCi0KLUlmIHRoZSBccmVmbW9kdWxle3JlYWRsaW5lfSBtb2R1bGUgaXMgbG9hZGVkLCBpbnB1dCB3aWxsIGF1dG9tYXRpY2FsbHkKLWluaGVyaXQgXHByb2dyYW17YmFzaH0tbGlrZSBoaXN0b3J5LWxpc3QgZWRpdGluZyAoZS5nLiBca2Jke0NvbnRyb2wtUH0KLXNjcm9sbHMgYmFjayB0byB0aGUgbGFzdCBjb21tYW5kLCBca2Jke0NvbnRyb2wtTn0gZm9yd2FyZCB0byB0aGUgbmV4dAotb25lLCBca2Jke0NvbnRyb2wtRn0gbW92ZXMgdGhlIGN1cnNvciB0byB0aGUgcmlnaHQgbm9uLWRlc3RydWN0aXZlbHksCi1ca2Jke0NvbnRyb2wtQn0gbW92ZXMgdGhlIGN1cnNvciB0byB0aGUgbGVmdCBub24tZGVzdHJ1Y3RpdmVseSwgZXRjLikuCi0KLUFuIGVuZC1vZi1maWxlIG9uIGlucHV0IGlzIHBhc3NlZCBiYWNrIGFzIHRoZSBzdHJpbmcgXGNvZGV7J0VPRid9LgotCi1BbiBpbnRlcnByZXRlciBpbnN0YW5jZSB3aWxsIHJlY29nbml6ZSBhIGNvbW1hbmQgbmFtZSBcc2FtcHtmb299IGlmCi1hbmQgb25seSBpZiBpdCBoYXMgYSBtZXRob2QgXG1ldGhvZHtkb19mb28oKX0uICBBcyBhIHNwZWNpYWwgY2FzZSwKLWEgbGluZSBiZWdpbm5pbmcgd2l0aCB0aGUgY2hhcmFjdGVyIFxjaGFyYWN0ZXJ7P30gaXMgZGlzcGF0Y2hlZCB0bwotdGhlIG1ldGhvZCBcbWV0aG9ke2RvX2hlbHAoKX0uICBBcyBhbm90aGVyIHNwZWNpYWwgY2FzZSwgYSBsaW5lCi1iZWdpbm5pbmcgd2l0aCB0aGUgY2hhcmFjdGVyIFxjaGFyYWN0ZXJ7IX0gaXMgZGlzcGF0Y2hlZCB0byB0aGUKLW1ldGhvZCBcbWV0aG9ke2RvX3NoZWxsKCl9IChpZiBzdWNoIGEgbWV0aG9kIGlzIGRlZmluZWQpLgotCi1UaGlzIG1ldGhvZCB3aWxsIHJldHVybiB3aGVuIHRoZSBcbWV0aG9ke3Bvc3RjbWQoKX0gbWV0aG9kIHJldHVybnMgYQotdHJ1ZSB2YWx1ZS4gIFRoZSBcdmFye3N0b3B9IGFyZ3VtZW50IHRvIFxtZXRob2R7cG9zdGNtZCgpfSBpcyB0aGUKLXJldHVybiB2YWx1ZSBmcm9tIHRoZSBjb21tYW5kJ3MgY29ycmVzcG9uZGluZyBcbWV0aG9ke2RvXyooKX0gbWV0aG9kLgotCi1JZiBjb21wbGV0aW9uIGlzIGVuYWJsZWQsIGNvbXBsZXRpbmcgY29tbWFuZHMgd2lsbCBiZSBkb25lCi1hdXRvbWF0aWNhbGx5LCBhbmQgY29tcGxldGluZyBvZiBjb21tYW5kcyBhcmdzIGlzIGRvbmUgYnkgY2FsbGluZwotXG1ldGhvZHtjb21wbGV0ZV9mb28oKX0gd2l0aCBhcmd1bWVudHMgXHZhcnt0ZXh0fSwgXHZhcntsaW5lfSwKLVx2YXJ7YmVnaWR4fSwgYW5kIFx2YXJ7ZW5kaWR4fS4gIFx2YXJ7dGV4dH0gaXMgdGhlIHN0cmluZyBwcmVmaXggd2UKLWFyZSBhdHRlbXB0aW5nIHRvIG1hdGNoOiBhbGwgcmV0dXJuZWQgbWF0Y2hlcyBtdXN0IGJlZ2luIHdpdGggaXQuCi1cdmFye2xpbmV9IGlzIHRoZSBjdXJyZW50IGlucHV0IGxpbmUgd2l0aCBsZWFkaW5nIHdoaXRlc3BhY2UgcmVtb3ZlZCwKLVx2YXJ7YmVnaWR4fSBhbmQgXHZhcntlbmRpZHh9IGFyZSB0aGUgYmVnaW5uaW5nIGFuZCBlbmRpbmcgaW5kZXhlcwotb2YgdGhlIHByZWZpeCB0ZXh0LCB3aGljaCBjb3VsZCBiZSB1c2VkIHRvIHByb3ZpZGUgZGlmZmVyZW50Ci1jb21wbGV0aW9uIGRlcGVuZGluZyB1cG9uIHdoaWNoIHBvc2l0aW9uIHRoZSBhcmd1bWVudCBpcyBpbi4KLQotQWxsIHN1YmNsYXNzZXMgb2YgXGNsYXNze0NtZH0gaW5oZXJpdCBhIHByZWRlZmluZWQgXG1ldGhvZHtkb19oZWxwKCl9LgotVGhpcyBtZXRob2QsIGNhbGxlZCB3aXRoIGFuIGFyZ3VtZW50IFxjb2RleydiYXInfSwgaW52b2tlcyB0aGUKLWNvcnJlc3BvbmRpbmcgbWV0aG9kIFxtZXRob2R7aGVscF9iYXIoKX0uICBXaXRoIG5vIGFyZ3VtZW50LAotXG1ldGhvZHtkb19oZWxwKCl9IGxpc3RzIGFsbCBhdmFpbGFibGUgaGVscCB0b3BpY3MgKHRoYXQgaXMsIGFsbAotY29tbWFuZHMgd2l0aCBjb3JyZXNwb25kaW5nIFxtZXRob2R7aGVscF8qKCl9IG1ldGhvZHMpLCBhbmQgYWxzbyBsaXN0cwotYW55IHVuZG9jdW1lbnRlZCBjb21tYW5kcy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0NtZF17b25lY21kfXtzdHJ9Ci1JbnRlcnByZXQgdGhlIGFyZ3VtZW50IGFzIHRob3VnaCBpdCBoYWQgYmVlbiB0eXBlZCBpbiByZXNwb25zZSB0byB0aGUKLXByb21wdC4gIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4sIGJ1dCBzaG91bGQgbm90IG5vcm1hbGx5IG5lZWQgdG8gYmU7Ci1zZWUgdGhlIFxtZXRob2R7cHJlY21kKCl9IGFuZCBcbWV0aG9ke3Bvc3RjbWQoKX0gbWV0aG9kcyBmb3IgdXNlZnVsCi1leGVjdXRpb24gaG9va3MuICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIKLWludGVycHJldGF0aW9uIG9mIGNvbW1hbmRzIGJ5IHRoZSBpbnRlcnByZXRlciBzaG91bGQgc3RvcC4gIElmIHRoZXJlCi1pcyBhIFxtZXRob2R7ZG9fKigpfSBtZXRob2QgZm9yIHRoZSBjb21tYW5kIFx2YXJ7c3RyfSwgdGhlIHJldHVybgotdmFsdWUgb2YgdGhhdCBtZXRob2QgaXMgcmV0dXJuZWQsIG90aGVyd2lzZSB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlCi1cbWV0aG9ke2RlZmF1bHQoKX0gbWV0aG9kIGlzIHJldHVybmVkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ21kXXtlbXB0eWxpbmV9e30KLU1ldGhvZCBjYWxsZWQgd2hlbiBhbiBlbXB0eSBsaW5lIGlzIGVudGVyZWQgaW4gcmVzcG9uc2UgdG8gdGhlIHByb21wdC4KLUlmIHRoaXMgbWV0aG9kIGlzIG5vdCBvdmVycmlkZGVuLCBpdCByZXBlYXRzIHRoZSBsYXN0IG5vbmVtcHR5IGNvbW1hbmQKLWVudGVyZWQuICAKLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0NtZF17ZGVmYXVsdH17bGluZX0KLU1ldGhvZCBjYWxsZWQgb24gYW4gaW5wdXQgbGluZSB3aGVuIHRoZSBjb21tYW5kIHByZWZpeCBpcyBub3QKLXJlY29nbml6ZWQuIElmIHRoaXMgbWV0aG9kIGlzIG5vdCBvdmVycmlkZGVuLCBpdCBwcmludHMgYW4KLWVycm9yIG1lc3NhZ2UgYW5kIHJldHVybnMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDbWRde2NvbXBsZXRlZGVmYXVsdH17dGV4dCwgbGluZSwgYmVnaWR4LCBlbmRpZHh9Ci1NZXRob2QgY2FsbGVkIHRvIGNvbXBsZXRlIGFuIGlucHV0IGxpbmUgd2hlbiBubyBjb21tYW5kLXNwZWNpZmljCi1cbWV0aG9ke2NvbXBsZXRlXyooKX0gbWV0aG9kIGlzIGF2YWlsYWJsZS4gIEJ5IGRlZmF1bHQsIGl0IHJldHVybnMgYW4KLWVtcHR5IGxpc3QuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDbWRde3ByZWNtZH17bGluZX0KLUhvb2sgbWV0aG9kIGV4ZWN1dGVkIGp1c3QgYmVmb3JlIHRoZSBjb21tYW5kIGxpbmUgXHZhcntsaW5lfSBpcwotaW50ZXJwcmV0ZWQsIGJ1dCBhZnRlciB0aGUgaW5wdXQgcHJvbXB0IGlzIGdlbmVyYXRlZCBhbmQgaXNzdWVkLiAgVGhpcwotbWV0aG9kIGlzIGEgc3R1YiBpbiBcY2xhc3N7Q21kfTsgaXQgZXhpc3RzIHRvIGJlIG92ZXJyaWRkZW4gYnkKLXN1YmNsYXNzZXMuICBUaGUgcmV0dXJuIHZhbHVlIGlzIHVzZWQgYXMgdGhlIGNvbW1hbmQgd2hpY2ggd2lsbCBiZQotZXhlY3V0ZWQgYnkgdGhlIFxtZXRob2R7b25lY21kKCl9IG1ldGhvZDsgdGhlIFxtZXRob2R7cHJlY21kKCl9Ci1pbXBsZW1lbnRhdGlvbiBtYXkgcmUtd3JpdGUgdGhlIGNvbW1hbmQgb3Igc2ltcGx5IHJldHVybiBcdmFye2xpbmV9Ci11bmNoYW5nZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDbWRde3Bvc3RjbWR9e3N0b3AsIGxpbmV9Ci1Ib29rIG1ldGhvZCBleGVjdXRlZCBqdXN0IGFmdGVyIGEgY29tbWFuZCBkaXNwYXRjaCBpcyBmaW5pc2hlZC4gIFRoaXMKLW1ldGhvZCBpcyBhIHN0dWIgaW4gXGNsYXNze0NtZH07IGl0IGV4aXN0cyB0byBiZSBvdmVycmlkZGVuIGJ5Ci1zdWJjbGFzc2VzLiAgXHZhcntsaW5lfSBpcyB0aGUgY29tbWFuZCBsaW5lIHdoaWNoIHdhcyBleGVjdXRlZCwgYW5kCi1cdmFye3N0b3B9IGlzIGEgZmxhZyB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciBleGVjdXRpb24gd2lsbCBiZQotdGVybWluYXRlZCBhZnRlciB0aGUgY2FsbCB0byBcbWV0aG9ke3Bvc3RjbWQoKX07IHRoaXMgd2lsbCBiZSB0aGUKLXJldHVybiB2YWx1ZSBvZiB0aGUgXG1ldGhvZHtvbmVjbWQoKX0gbWV0aG9kLiAgVGhlIHJldHVybiB2YWx1ZSBvZgotdGhpcyBtZXRob2Qgd2lsbCBiZSB1c2VkIGFzIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBpbnRlcm5hbCBmbGFnIHdoaWNoCi1jb3JyZXNwb25kcyB0byBcdmFye3N0b3B9OyByZXR1cm5pbmcgZmFsc2Ugd2lsbCBjYXVzZSBpbnRlcnByZXRhdGlvbgotdG8gY29udGludWUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDbWRde3ByZWxvb3B9e30KLUhvb2sgbWV0aG9kIGV4ZWN1dGVkIG9uY2Ugd2hlbiBcbWV0aG9ke2NtZGxvb3AoKX0gaXMgY2FsbGVkLiAgVGhpcwotbWV0aG9kIGlzIGEgc3R1YiBpbiBcY2xhc3N7Q21kfTsgaXQgZXhpc3RzIHRvIGJlIG92ZXJyaWRkZW4gYnkKLXN1YmNsYXNzZXMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDbWRde3Bvc3Rsb29wfXt9Ci1Ib29rIG1ldGhvZCBleGVjdXRlZCBvbmNlIHdoZW4gXG1ldGhvZHtjbWRsb29wKCl9IGlzIGFib3V0IHRvIHJldHVybi4KLVRoaXMgbWV0aG9kIGlzIGEgc3R1YiBpbiBcY2xhc3N7Q21kfTsgaXQgZXhpc3RzIHRvIGJlIG92ZXJyaWRkZW4gYnkKLXN1YmNsYXNzZXMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLUluc3RhbmNlcyBvZiBcY2xhc3N7Q21kfSBzdWJjbGFzc2VzIGhhdmUgc29tZSBwdWJsaWMgaW5zdGFuY2UgdmFyaWFibGVzOgotCi1cYmVnaW57bWVtYmVyZGVzY31bQ21kXXtwcm9tcHR9Ci1UaGUgcHJvbXB0IGlzc3VlZCB0byBzb2xpY2l0IGlucHV0LgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bQ21kXXtpZGVudGNoYXJzfQotVGhlIHN0cmluZyBvZiBjaGFyYWN0ZXJzIGFjY2VwdGVkIGZvciB0aGUgY29tbWFuZCBwcmVmaXguCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtDbWRde2xhc3RjbWR9Ci1UaGUgbGFzdCBub25lbXB0eSBjb21tYW5kIHByZWZpeCBzZWVuLiAKLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W0NtZF17aW50cm99Ci1BIHN0cmluZyB0byBpc3N1ZSBhcyBhbiBpbnRybyBvciBiYW5uZXIuICBNYXkgYmUgb3ZlcnJpZGRlbiBieSBnaXZpbmcKLXRoZSBcbWV0aG9ke2NtZGxvb3AoKX0gbWV0aG9kIGFuIGFyZ3VtZW50LgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bQ21kXXtkb2NfaGVhZGVyfQotVGhlIGhlYWRlciB0byBpc3N1ZSBpZiB0aGUgaGVscCBvdXRwdXQgaGFzIGEgc2VjdGlvbiBmb3IgZG9jdW1lbnRlZAotY29tbWFuZHMuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtDbWRde21pc2NfaGVhZGVyfQotVGhlIGhlYWRlciB0byBpc3N1ZSBpZiB0aGUgaGVscCBvdXRwdXQgaGFzIGEgc2VjdGlvbiBmb3IgbWlzY2VsbGFuZW91cyAKLWhlbHAgdG9waWNzICh0aGF0IGlzLCB0aGVyZSBhcmUgXG1ldGhvZHtoZWxwXyooKX0gbWV0aG9kcyB3aXRob3V0Ci1jb3JyZXNwb25kaW5nIFxtZXRob2R7ZG9fKigpfSBtZXRob2RzKS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W0NtZF17dW5kb2NfaGVhZGVyfQotVGhlIGhlYWRlciB0byBpc3N1ZSBpZiB0aGUgaGVscCBvdXRwdXQgaGFzIGEgc2VjdGlvbiBmb3IgdW5kb2N1bWVudGVkIAotY29tbWFuZHMgKHRoYXQgaXMsIHRoZXJlIGFyZSBcbWV0aG9ke2RvXyooKX0gbWV0aG9kcyB3aXRob3V0Ci1jb3JyZXNwb25kaW5nIFxtZXRob2R7aGVscF8qKCl9IG1ldGhvZHMpLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bQ21kXXtydWxlcn0KLVRoZSBjaGFyYWN0ZXIgdXNlZCB0byBkcmF3IHNlcGFyYXRvciBsaW5lcyB1bmRlciB0aGUgaGVscC1tZXNzYWdlCi1oZWFkZXJzLiAgSWYgZW1wdHksIG5vIHJ1bGVyIGxpbmUgaXMgZHJhd24uICBJdCBkZWZhdWx0cyB0bwotXGNoYXJhY3Rlcns9fS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W0NtZF17dXNlX3Jhd2lucHV0fQotQSBmbGFnLCBkZWZhdWx0aW5nIHRvIHRydWUuICBJZiB0cnVlLCBcbWV0aG9ke2NtZGxvb3AoKX0gdXNlcwotXGZ1bmN0aW9ue2lucHV0KCl9IHRvIGRpc3BsYXkgYSBwcm9tcHQgYW5kIHJlYWQgdGhlIG5leHQgY29tbWFuZDsKLWlmIGZhbHNlLCBcbWV0aG9ke3N5cy5zdGRvdXQud3JpdGUoKX0gYW5kCi1cbWV0aG9ke3N5cy5zdGRpbi5yZWFkbGluZSgpfSBhcmUgdXNlZC4gKFRoaXMgbWVhbnMgdGhhdCBieQotaW1wb3J0aW5nIFxyZWZtb2R1bGV7cmVhZGxpbmV9LCBvbiBzeXN0ZW1zIHRoYXQgc3VwcG9ydCBpdCwgdGhlCi1pbnRlcnByZXRlciB3aWxsIGF1dG9tYXRpY2FsbHkgc3VwcG9ydCBccHJvZ3JhbXtFbWFjc30tbGlrZSBsaW5lIGVkaXRpbmcgCi1hbmQgY29tbWFuZC1oaXN0b3J5IGtleXN0cm9rZXMuKQotXGVuZHttZW1iZXJkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJjbXAudGV4IGIvRG9jL2xpYi9saWJjbXAudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODllZmVlLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGliY21wLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7Y21wfSAtLS0KLSAgICAgICAgIEZpbGUgY29tcGFyaXNvbnN9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtjbXB9Ci1cc2VjdGlvbmF1dGhvcntNb3NoZSBaYWRrYX17bW9zaGV6QHphZGthLnNpdGUuY28uaWx9Ci1cbW9kdWxlc3lub3BzaXN7Q29tcGFyZSBmaWxlcyB2ZXJ5IGVmZmljaWVudGx5Ln0KLQotXGRlcHJlY2F0ZWR7MS42fXtVc2UgdGhlIFxyZWZtb2R1bGV7ZmlsZWNtcH0gbW9kdWxlIGluc3RlYWQufQotCi1UaGUgXG1vZHVsZXtjbXB9IG1vZHVsZSBkZWZpbmVzIGEgZnVuY3Rpb24gdG8gY29tcGFyZSBmaWxlcywgdGFraW5nIGFsbAotc29ydCBvZiBzaG9ydC1jdXRzIHRvIG1ha2UgaXQgYSBoaWdobHkgZWZmaWNpZW50IG9wZXJhdGlvbi4KLQotVGhlIFxtb2R1bGV7Y21wfSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOgotCi1cYmVnaW57ZnVuY2Rlc2N9e2NtcH17ZjEsIGYyfQotQ29tcGFyZSB0d28gZmlsZXMgZ2l2ZW4gYXMgbmFtZXMuIFRoZSBmb2xsb3dpbmcgdHJpY2tzIGFyZSB1c2VkIHRvCi1vcHRpbWl6ZSB0aGUgY29tcGFyaXNvbnM6Ci0KLVxiZWdpbntpdGVtaXplfQotICAgICAgICBcaXRlbSBGaWxlcyB3aXRoIGlkZW50aWNhbCB0eXBlLCBzaXplIGFuZCBtdGltZSBhcmUgYXNzdW1lZCBlcXVhbC4KLSAgICAgICAgXGl0ZW0gRmlsZXMgd2l0aCBkaWZmZXJlbnQgdHlwZSBvciBzaXplIGFyZSBuZXZlciBlcXVhbC4KLSAgICAgICAgXGl0ZW0gVGhlIG1vZHVsZSBvbmx5IGNvbXBhcmVzIGZpbGVzIGl0IGFscmVhZHkgY29tcGFyZWQgaWYgdGhlaXIKLSAgICAgICAgc2lnbmF0dXJlICh0eXBlLCBzaXplIGFuZCBtdGltZSkgY2hhbmdlZC4KLSAgICAgICAgXGl0ZW0gTm8gZXh0ZXJuYWwgcHJvZ3JhbXMgYXJlIGNhbGxlZC4KLVxlbmR7aXRlbWl6ZX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLUV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgY21wCi0+Pj4gY21wLmNtcCgnbGlidW5kb2MudGV4JywgJ2xpYnVuZG9jLnRleCcpCi0xCi0+Pj4gY21wLmNtcCgnbGlidW5kb2MudGV4JywgJ2xpYi50ZXgnKQotMAotXGVuZHt2ZXJiYXRpbX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliY21wY2FjaGUudGV4IGIvRG9jL2xpYi9saWJjbXBjYWNoZS50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5OTE0NzcuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJjbXBjYWNoZS50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle2NtcGNhY2hlfSAtLS0KLSAgICAgICAgIEVmZmljaWVudCBmaWxlIGNvbXBhcmlzb25zfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17Y21wY2FjaGV9Ci1cc2VjdGlvbmF1dGhvcntNb3NoZSBaYWRrYX17bW9zaGV6QHphZGthLnNpdGUuY28uaWx9Ci1cbW9kdWxlc3lub3BzaXN7Q29tcGFyZSBmaWxlcyB2ZXJ5IGVmZmljaWVudGx5Ln0KLQotXGRlcHJlY2F0ZWR7MS42fXtVc2UgdGhlIFxyZWZtb2R1bGV7ZmlsZWNtcH0gbW9kdWxlIGluc3RlYWQufQotCi1UaGUgXG1vZHVsZXtjbXBjYWNoZX0gbW9kdWxlIHByb3ZpZGVzIGFuIGlkZW50aWNhbCBpbnRlcmZhY2UgYW5kIHNpbWlsYXIKLWZ1bmN0aW9uYWxpdHkgYXMgdGhlIFxyZWZtb2R1bGV7Y21wfSBtb2R1bGUsIGJ1dCBjYW4gYmUgYSBiaXQgbW9yZSBlZmZpY2llbnQKLWFzIGl0IHVzZXMgXGZ1bmN0aW9ue3N0YXRjYWNoZS5zdGF0KCl9IGluc3RlYWQgb2YgXGZ1bmN0aW9ue29zLnN0YXQoKX0KLShzZWUgdGhlIFxyZWZtb2R1bGV7c3RhdGNhY2hlfSBtb2R1bGUgZm9yIGluZm9ybWF0aW9uIG9uIHRoZQotZGlmZmVyZW5jZSkuCi0KLVxub3Rle1VzaW5nIHRoZSBccmVmbW9kdWxle3N0YXRjYWNoZX0gbW9kdWxlIHRvIHByb3ZpZGUKLVxmdW5jdGlvbntzdGF0KCl9IGluZm9ybWF0aW9uIHJlc3VsdHMgaW4gdHJhc2hpbmcgdGhlIGNhY2hlCi1pbnZhbGlkYXRpb24gbWVjaGFuaXNtOiByZXN1bHRzIGFyZSBub3QgYXMgcmVsaWFibGUuICBUbyBlbnN1cmUKLWBgY3VycmVudCcnIHJlc3VsdHMsIHVzZSBcZnVuY3Rpb257Y21wLmNtcCgpfSBpbnN0ZWFkIG9mIHRoZSB2ZXJzaW9uCi1kZWZpbmVkIGluIHRoaXMgbW9kdWxlLCBvciB1c2UgXGZ1bmN0aW9ue3N0YXRjYWNoZS5mb3JnZXQoKX0gdG8KLWludmFsaWRhdGUgdGhlIGFwcHJvcHJpYXRlIGVudHJpZXMufQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJjb2RlLnRleCBiL0RvYy9saWIvbGliY29kZS50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMTRiMDIuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJjb2RlLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle2NvZGV9IC0tLQotICAgICAgICAgSW50ZXJwcmV0ZXIgYmFzZSBjbGFzc2VzfQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2NvZGV9Ci0KLVxtb2R1bGVzeW5vcHNpc3tCYXNlIGNsYXNzZXMgZm9yIGludGVyYWN0aXZlIFB5dGhvbiBpbnRlcnByZXRlcnMufQotCi0KLVRoZSBcY29kZXtjb2RlfSBtb2R1bGUgcHJvdmlkZXMgZmFjaWxpdGllcyB0byBpbXBsZW1lbnQKLXJlYWQtZXZhbC1wcmludCBsb29wcyBpbiBQeXRob24uICBUd28gY2xhc3NlcyBhbmQgY29udmVuaWVuY2UKLWZ1bmN0aW9ucyBhcmUgaW5jbHVkZWQgd2hpY2ggY2FuIGJlIHVzZWQgdG8gYnVpbGQgYXBwbGljYXRpb25zIHdoaWNoCi1wcm92aWRlIGFuIGludGVyYWN0aXZlIGludGVycHJldGVyIHByb21wdC4KLQotCi1cYmVnaW57Y2xhc3NkZXNjfXtJbnRlcmFjdGl2ZUludGVycHJldGVyfXtcb3B0aW9uYWx7bG9jYWxzfX0KLVRoaXMgY2xhc3MgZGVhbHMgd2l0aCBwYXJzaW5nIGFuZCBpbnRlcnByZXRlciBzdGF0ZSAodGhlIHVzZXIncwotbmFtZXNwYWNlKTsgaXQgZG9lcyBub3QgZGVhbCB3aXRoIGlucHV0IGJ1ZmZlcmluZyBvciBwcm9tcHRpbmcgb3IKLWlucHV0IGZpbGUgbmFtaW5nICh0aGUgZmlsZW5hbWUgaXMgYWx3YXlzIHBhc3NlZCBpbiBleHBsaWNpdGx5KS4KLVRoZSBvcHRpb25hbCBcdmFye2xvY2Fsc30gYXJndW1lbnQgc3BlY2lmaWVzIHRoZSBkaWN0aW9uYXJ5IGluCi13aGljaCBjb2RlIHdpbGwgYmUgZXhlY3V0ZWQ7IGl0IGRlZmF1bHRzIHRvIGEgbmV3bHkgY3JlYXRlZAotZGljdGlvbmFyeSB3aXRoIGtleSBcY29kZXsnX19uYW1lX18nfSBzZXQgdG8gXGNvZGV7J19fY29uc29sZV9fJ30KLWFuZCBrZXkgXGNvZGV7J19fZG9jX18nfSBzZXQgdG8gXGNvZGV7Tm9uZX0uCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317SW50ZXJhY3RpdmVDb25zb2xlfXtcb3B0aW9uYWx7bG9jYWxzXG9wdGlvbmFseywgZmlsZW5hbWV9fX0KLUNsb3NlbHkgZW11bGF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGludGVyYWN0aXZlIFB5dGhvbiBpbnRlcnByZXRlci4KLVRoaXMgY2xhc3MgYnVpbGRzIG9uIFxjbGFzc3tJbnRlcmFjdGl2ZUludGVycHJldGVyfSBhbmQgYWRkcwotcHJvbXB0aW5nIHVzaW5nIHRoZSBmYW1pbGlhciBcY29kZXtzeXMucHMxfSBhbmQgXGNvZGV7c3lzLnBzMn0sIGFuZAotaW5wdXQgYnVmZmVyaW5nLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLQotXGJlZ2lue2Z1bmNkZXNjfXtpbnRlcmFjdH17XG9wdGlvbmFse2Jhbm5lclxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZnVuY1xvcHRpb25hbHssIGxvY2FsfX19fQotQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gcnVuIGEgcmVhZC1ldmFsLXByaW50IGxvb3AuICBUaGlzIGNyZWF0ZXMgYQotbmV3IGluc3RhbmNlIG9mIFxjbGFzc3tJbnRlcmFjdGl2ZUNvbnNvbGV9IGFuZCBzZXRzIFx2YXJ7cmVhZGZ1bmN9Ci10byBiZSB1c2VkIGFzIHRoZSBcbWV0aG9ke3Jhd19pbnB1dCgpfSBtZXRob2QsIGlmIHByb3ZpZGVkLiAgSWYKLVx2YXJ7bG9jYWx9IGlzIHByb3ZpZGVkLCBpdCBpcyBwYXNzZWQgdG8gdGhlCi1cY2xhc3N7SW50ZXJhY3RpdmVDb25zb2xlfSBjb25zdHJ1Y3RvciBmb3IgdXNlIGFzIHRoZSBkZWZhdWx0Ci1uYW1lc3BhY2UgZm9yIHRoZSBpbnRlcnByZXRlciBsb29wLiAgVGhlIFxtZXRob2R7aW50ZXJhY3QoKX0gbWV0aG9kCi1vZiB0aGUgaW5zdGFuY2UgaXMgdGhlbiBydW4gd2l0aCBcdmFye2Jhbm5lcn0gcGFzc2VkIGFzIHRoZSBiYW5uZXIKLXRvIHVzZSwgaWYgcHJvdmlkZWQuICBUaGUgY29uc29sZSBvYmplY3QgaXMgZGlzY2FyZGVkIGFmdGVyIHVzZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y29tcGlsZV9jb21tYW5kfXtzb3VyY2Vcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lXG9wdGlvbmFseywgc3ltYm9sfX19Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCBmb3IgcHJvZ3JhbXMgdGhhdCB3YW50IHRvIGVtdWxhdGUgUHl0aG9uJ3MKLWludGVycHJldGVyIG1haW4gbG9vcCAoYS5rLmEuIHRoZSByZWFkLWV2YWwtcHJpbnQgbG9vcCkuICBUaGUgdHJpY2t5Ci1wYXJ0IGlzIHRvIGRldGVybWluZSB3aGVuIHRoZSB1c2VyIGhhcyBlbnRlcmVkIGFuIGluY29tcGxldGUgY29tbWFuZAotdGhhdCBjYW4gYmUgY29tcGxldGVkIGJ5IGVudGVyaW5nIG1vcmUgdGV4dCAoYXMgb3Bwb3NlZCB0byBhCi1jb21wbGV0ZSBjb21tYW5kIG9yIGEgc3ludGF4IGVycm9yKS4gIFRoaXMgZnVuY3Rpb24KLVxlbXBoe2FsbW9zdH0gYWx3YXlzIG1ha2VzIHRoZSBzYW1lIGRlY2lzaW9uIGFzIHRoZSByZWFsIGludGVycHJldGVyCi1tYWluIGxvb3AuCi0KLVx2YXJ7c291cmNlfSBpcyB0aGUgc291cmNlIHN0cmluZzsgXHZhcntmaWxlbmFtZX0gaXMgdGhlIG9wdGlvbmFsCi1maWxlbmFtZSBmcm9tIHdoaWNoIHNvdXJjZSB3YXMgcmVhZCwgZGVmYXVsdGluZyB0byBcY29kZXsnPGlucHV0Pid9OwotYW5kIFx2YXJ7c3ltYm9sfSBpcyB0aGUgb3B0aW9uYWwgZ3JhbW1hciBzdGFydCBzeW1ib2wsIHdoaWNoIHNob3VsZAotYmUgZWl0aGVyIFxjb2RleydzaW5nbGUnfSAodGhlIGRlZmF1bHQpIG9yIFxjb2RleydldmFsJ30uCi0KLVJldHVybnMgYSBjb2RlIG9iamVjdCAodGhlIHNhbWUgYXMgXGNvZGV7Y29tcGlsZShcdmFye3NvdXJjZX0sCi1cdmFye2ZpbGVuYW1lfSwgXHZhcntzeW1ib2x9KX0pIGlmIHRoZSBjb21tYW5kIGlzIGNvbXBsZXRlIGFuZAotdmFsaWQ7IFxjb2Rle05vbmV9IGlmIHRoZSBjb21tYW5kIGlzIGluY29tcGxldGU7IHJhaXNlcwotXGV4Y2VwdGlvbntTeW50YXhFcnJvcn0gaWYgdGhlIGNvbW1hbmQgaXMgY29tcGxldGUgYW5kIGNvbnRhaW5zIGEKLXN5bnRheCBlcnJvciwgb3IgcmFpc2VzIFxleGNlcHRpb257T3ZlcmZsb3dFcnJvcn0gb3IKLVxleGNlcHRpb257VmFsdWVFcnJvcn0gaWYgdGhlIGNvbW1hbmQgY29udGFpbnMgYW4gaW52YWxpZCBsaXRlcmFsLgotXGVuZHtmdW5jZGVzY30KLQotCi1cc3Vic2VjdGlvbntJbnRlcmFjdGl2ZSBJbnRlcnByZXRlciBPYmplY3RzCi0gICAgICAgICAgICBcbGFiZWx7aW50ZXJwcmV0ZXItb2JqZWN0c319Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtJbnRlcmFjdGl2ZUludGVycHJldGVyXXtydW5zb3VyY2V9e3NvdXJjZVxvcHRpb25hbHssIGZpbGVuYW1lXG9wdGlvbmFseywgc3ltYm9sfX19Ci1Db21waWxlIGFuZCBydW4gc29tZSBzb3VyY2UgaW4gdGhlIGludGVycHJldGVyLgotQXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyBmb3IgXGZ1bmN0aW9ue2NvbXBpbGVfY29tbWFuZCgpfTsgdGhlCi1kZWZhdWx0IGZvciBcdmFye2ZpbGVuYW1lfSBpcyBcY29kZXsnPGlucHV0Pid9LCBhbmQgZm9yCi1cdmFye3N5bWJvbH0gaXMgXGNvZGV7J3NpbmdsZSd9LiAgT25lIHNldmVyYWwgdGhpbmdzIGNhbiBoYXBwZW46Ci0KLVxiZWdpbntpdGVtaXplfQotXGl0ZW0KLVRoZSBpbnB1dCBpcyBpbmNvcnJlY3Q7IFxmdW5jdGlvbntjb21waWxlX2NvbW1hbmQoKX0gcmFpc2VkIGFuCi1leGNlcHRpb24gKFxleGNlcHRpb257U3ludGF4RXJyb3J9IG9yIFxleGNlcHRpb257T3ZlcmZsb3dFcnJvcn0pLiAgQQotc3ludGF4IHRyYWNlYmFjayB3aWxsIGJlIHByaW50ZWQgYnkgY2FsbGluZyB0aGUKLVxtZXRob2R7c2hvd3N5bnRheGVycm9yKCl9IG1ldGhvZC4gIFxtZXRob2R7cnVuc291cmNlKCl9IHJldHVybnMKLVxjb2Rle0ZhbHNlfS4KLQotXGl0ZW0KLVRoZSBpbnB1dCBpcyBpbmNvbXBsZXRlLCBhbmQgbW9yZSBpbnB1dCBpcyByZXF1aXJlZDsKLVxmdW5jdGlvbntjb21waWxlX2NvbW1hbmQoKX0gcmV0dXJuZWQgXGNvZGV7Tm9uZX0uCi1cbWV0aG9ke3J1bnNvdXJjZSgpfSByZXR1cm5zIFxjb2Rle1RydWV9LgotCi1caXRlbQotVGhlIGlucHV0IGlzIGNvbXBsZXRlOyBcZnVuY3Rpb257Y29tcGlsZV9jb21tYW5kKCl9IHJldHVybmVkIGEgY29kZQotb2JqZWN0LiAgVGhlIGNvZGUgaXMgZXhlY3V0ZWQgYnkgY2FsbGluZyB0aGUgXG1ldGhvZHtydW5jb2RlKCl9ICh3aGljaAotYWxzbyBoYW5kbGVzIHJ1bi10aW1lIGV4Y2VwdGlvbnMsIGV4Y2VwdCBmb3IgXGV4Y2VwdGlvbntTeXN0ZW1FeGl0fSkuCi1cbWV0aG9ke3J1bnNvdXJjZSgpfSByZXR1cm5zIFxjb2Rle0ZhbHNlfS4KLVxlbmR7aXRlbWl6ZX0KLQotVGhlIHJldHVybiB2YWx1ZSBjYW4gYmUgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0byB1c2UKLVxjb2Rle3N5cy5wczF9IG9yIFxjb2Rle3N5cy5wczJ9IHRvIHByb21wdCB0aGUgbmV4dCBsaW5lLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSW50ZXJhY3RpdmVJbnRlcnByZXRlcl17cnVuY29kZX17Y29kZX0KLUV4ZWN1dGUgYSBjb2RlIG9iamVjdC4KLVdoZW4gYW4gZXhjZXB0aW9uIG9jY3VycywgXG1ldGhvZHtzaG93dHJhY2ViYWNrKCl9IGlzIGNhbGxlZCB0bwotZGlzcGxheSBhIHRyYWNlYmFjay4gIEFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgZXhjZXB0Ci1cZXhjZXB0aW9ue1N5c3RlbUV4aXR9LCB3aGljaCBpcyBhbGxvd2VkIHRvIHByb3BhZ2F0ZS4KLQotQSBub3RlIGFib3V0IFxleGNlcHRpb257S2V5Ym9hcmRJbnRlcnJ1cHR9OiB0aGlzIGV4Y2VwdGlvbiBtYXkgb2NjdXIKLWVsc2V3aGVyZSBpbiB0aGlzIGNvZGUsIGFuZCBtYXkgbm90IGFsd2F5cyBiZSBjYXVnaHQuICBUaGUgY2FsbGVyCi1zaG91bGQgYmUgcHJlcGFyZWQgdG8gZGVhbCB3aXRoIGl0LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSW50ZXJhY3RpdmVJbnRlcnByZXRlcl17c2hvd3N5bnRheGVycm9yfXtcb3B0aW9uYWx7ZmlsZW5hbWV9fQotRGlzcGxheSB0aGUgc3ludGF4IGVycm9yIHRoYXQganVzdCBvY2N1cnJlZC4gIFRoaXMgZG9lcyBub3QgZGlzcGxheQotYSBzdGFjayB0cmFjZSBiZWNhdXNlIHRoZXJlIGlzbid0IG9uZSBmb3Igc3ludGF4IGVycm9ycy4KLUlmIFx2YXJ7ZmlsZW5hbWV9IGlzIGdpdmVuLCBpdCBpcyBzdHVmZmVkIGludG8gdGhlIGV4Y2VwdGlvbiBpbnN0ZWFkCi1vZiB0aGUgZGVmYXVsdCBmaWxlbmFtZSBwcm92aWRlZCBieSBQeXRob24ncyBwYXJzZXIsIGJlY2F1c2UgaXQKLWFsd2F5cyB1c2VzIFxjb2Rleyc8c3RyaW5nPid9IHdoZW4gcmVhZGluZyBmcm9tIGEgc3RyaW5nLgotVGhlIG91dHB1dCBpcyB3cml0dGVuIGJ5IHRoZSBcbWV0aG9ke3dyaXRlKCl9IG1ldGhvZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0ludGVyYWN0aXZlSW50ZXJwcmV0ZXJde3Nob3d0cmFjZWJhY2t9e30KLURpc3BsYXkgdGhlIGV4Y2VwdGlvbiB0aGF0IGp1c3Qgb2NjdXJyZWQuICBXZSByZW1vdmUgdGhlIGZpcnN0IHN0YWNrCi1pdGVtIGJlY2F1c2UgaXQgaXMgd2l0aGluIHRoZSBpbnRlcnByZXRlciBvYmplY3QgaW1wbGVtZW50YXRpb24uCi1UaGUgb3V0cHV0IGlzIHdyaXR0ZW4gYnkgdGhlIFxtZXRob2R7d3JpdGUoKX0gbWV0aG9kLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSW50ZXJhY3RpdmVJbnRlcnByZXRlcl17d3JpdGV9e2RhdGF9Ci1Xcml0ZSBhIHN0cmluZyB0byB0aGUgc3RhbmRhcmQgZXJyb3Igc3RyZWFtIChcY29kZXtzeXMuc3RkZXJyfSkuCi1EZXJpdmVkIGNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgdG8gcHJvdmlkZSB0aGUgYXBwcm9wcmlhdGUgb3V0cHV0Ci1oYW5kbGluZyBhcyBuZWVkZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLQotXHN1YnNlY3Rpb257SW50ZXJhY3RpdmUgQ29uc29sZSBPYmplY3RzCi0gICAgICAgICAgICBcbGFiZWx7Y29uc29sZS1vYmplY3RzfX0KLQotVGhlIFxjbGFzc3tJbnRlcmFjdGl2ZUNvbnNvbGV9IGNsYXNzIGlzIGEgc3ViY2xhc3Mgb2YKLVxjbGFzc3tJbnRlcmFjdGl2ZUludGVycHJldGVyfSwgYW5kIHNvIG9mZmVycyBhbGwgdGhlIG1ldGhvZHMgb2YgdGhlCi1pbnRlcnByZXRlciBvYmplY3RzIGFzIHdlbGwgYXMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbnMuCi0KLVxiZWdpbnttZXRob2RkZXNjfVtJbnRlcmFjdGl2ZUNvbnNvbGVde2ludGVyYWN0fXtcb3B0aW9uYWx7YmFubmVyfX0KLUNsb3NlbHkgZW11bGF0ZSB0aGUgaW50ZXJhY3RpdmUgUHl0aG9uIGNvbnNvbGUuCi1UaGUgb3B0aW9uYWwgYmFubmVyIGFyZ3VtZW50IHNwZWNpZnkgdGhlIGJhbm5lciB0byBwcmludCBiZWZvcmUgdGhlCi1maXJzdCBpbnRlcmFjdGlvbjsgYnkgZGVmYXVsdCBpdCBwcmludHMgYSBiYW5uZXIgc2ltaWxhciB0byB0aGUgb25lCi1wcmludGVkIGJ5IHRoZSBzdGFuZGFyZCBQeXRob24gaW50ZXJwcmV0ZXIsIGZvbGxvd2VkIGJ5IHRoZSBjbGFzcwotbmFtZSBvZiB0aGUgY29uc29sZSBvYmplY3QgaW4gcGFyZW50aGVzZXMgKHNvIGFzIG5vdCB0byBjb25mdXNlIHRoaXMKLXdpdGggdGhlIHJlYWwgaW50ZXJwcmV0ZXIgLS0gc2luY2UgaXQncyBzbyBjbG9zZSEpLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSW50ZXJhY3RpdmVDb25zb2xlXXtwdXNofXtsaW5lfQotUHVzaCBhIGxpbmUgb2Ygc291cmNlIHRleHQgdG8gdGhlIGludGVycHJldGVyLgotVGhlIGxpbmUgc2hvdWxkIG5vdCBoYXZlIGEgdHJhaWxpbmcgbmV3bGluZTsgaXQgbWF5IGhhdmUgaW50ZXJuYWwKLW5ld2xpbmVzLiAgVGhlIGxpbmUgaXMgYXBwZW5kZWQgdG8gYSBidWZmZXIgYW5kIHRoZSBpbnRlcnByZXRlcidzCi1cbWV0aG9ke3J1bnNvdXJjZSgpfSBtZXRob2QgaXMgY2FsbGVkIHdpdGggdGhlIGNvbmNhdGVuYXRlZCBjb250ZW50cwotb2YgdGhlIGJ1ZmZlciBhcyBzb3VyY2UuICBJZiB0aGlzIGluZGljYXRlcyB0aGF0IHRoZSBjb21tYW5kIHdhcwotZXhlY3V0ZWQgb3IgaW52YWxpZCwgdGhlIGJ1ZmZlciBpcyByZXNldDsgb3RoZXJ3aXNlLCB0aGUgY29tbWFuZCBpcwotaW5jb21wbGV0ZSwgYW5kIHRoZSBidWZmZXIgaXMgbGVmdCBhcyBpdCB3YXMgYWZ0ZXIgdGhlIGxpbmUgd2FzCi1hcHBlbmRlZC4gIFRoZSByZXR1cm4gdmFsdWUgaXMgXGNvZGV7VHJ1ZX0gaWYgbW9yZSBpbnB1dCBpcyByZXF1aXJlZCwKLVxjb2Rle0ZhbHNlfSBpZiB0aGUgbGluZSB3YXMgZGVhbHQgd2l0aCBpbiBzb21lIHdheSAodGhpcyBpcyB0aGUgc2FtZSBhcwotXG1ldGhvZHtydW5zb3VyY2UoKX0pLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSW50ZXJhY3RpdmVDb25zb2xlXXtyZXNldGJ1ZmZlcn17fQotUmVtb3ZlIGFueSB1bmhhbmRsZWQgc291cmNlIHRleHQgZnJvbSB0aGUgaW5wdXQgYnVmZmVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSW50ZXJhY3RpdmVDb25zb2xlXXtyYXdfaW5wdXR9e1xvcHRpb25hbHtwcm9tcHR9fQotV3JpdGUgYSBwcm9tcHQgYW5kIHJlYWQgYSBsaW5lLiAgVGhlIHJldHVybmVkIGxpbmUgZG9lcyBub3QgaW5jbHVkZQotdGhlIHRyYWlsaW5nIG5ld2xpbmUuICBXaGVuIHRoZSB1c2VyIGVudGVycyB0aGUgXEVPRnt9IGtleSBzZXF1ZW5jZSwKLVxleGNlcHRpb257RU9GRXJyb3J9IGlzIHJhaXNlZC4gIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIHJlYWRzIGZyb20KLVxjb2Rle3N5cy5zdGRpbn07IGEgc3ViY2xhc3MgbWF5IHJlcGxhY2UgdGhpcwotd2l0aCBhIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbi4KLVxlbmR7bWV0aG9kZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliY29kZWNzLnRleCBiL0RvYy9saWIvbGliY29kZWNzLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUxNDFkOS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmNvZGVjcy50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQxICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7Y29kZWNzfSAtLS0KLSAgICAgICAgIENvZGVjIHJlZ2lzdHJ5IGFuZCBiYXNlIGNsYXNzZXN9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtjb2RlY3N9Ci1cbW9kdWxlc3lub3BzaXN7RW5jb2RlIGFuZCBkZWNvZGUgZGF0YSBhbmQgc3RyZWFtcy59Ci1cbW9kdWxlYXV0aG9ye01hcmMtQW5kcmUgTGVtYnVyZ317bWFsQGxlbWJ1cmcuY29tfQotXHNlY3Rpb25hdXRob3J7TWFyYy1BbmRyZSBMZW1idXJnfXttYWxAbGVtYnVyZy5jb219Ci1cc2VjdGlvbmF1dGhvcntNYXJ0aW4gdi4gTFwib3dpc317bWFydGluQHYubG9ld2lzLmRlfQotCi1caW5kZXh7VW5pY29kZX0KLVxpbmRleHtDb2RlY3N9Ci1caW5kZXhpaXtDb2RlY3N9e2VuY29kZX0KLVxpbmRleGlpe0NvZGVjc317ZGVjb2RlfQotXGluZGV4e3N0cmVhbXN9Ci1caW5kZXhpaXtzdGFja2FibGV9e3N0cmVhbXN9Ci0KLQotVGhpcyBtb2R1bGUgZGVmaW5lcyBiYXNlIGNsYXNzZXMgZm9yIHN0YW5kYXJkIFB5dGhvbiBjb2RlY3MgKGVuY29kZXJzCi1hbmQgZGVjb2RlcnMpIGFuZCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGludGVybmFsIFB5dGhvbiBjb2RlYwotcmVnaXN0cnkgd2hpY2ggbWFuYWdlcyB0aGUgY29kZWMgYW5kIGVycm9yIGhhbmRsaW5nIGxvb2t1cCBwcm9jZXNzLgotCi1JdCBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgotCi1cYmVnaW57ZnVuY2Rlc2N9e3JlZ2lzdGVyfXtzZWFyY2hfZnVuY3Rpb259Ci1SZWdpc3RlciBhIGNvZGVjIHNlYXJjaCBmdW5jdGlvbi4gU2VhcmNoIGZ1bmN0aW9ucyBhcmUgZXhwZWN0ZWQgdG8KLXRha2Ugb25lIGFyZ3VtZW50LCB0aGUgZW5jb2RpbmcgbmFtZSBpbiBhbGwgbG93ZXIgY2FzZSBsZXR0ZXJzLCBhbmQKLXJldHVybiBhIFxjbGFzc3tDb2RlY0luZm99IG9iamVjdCBoYXZpbmcgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgotCi1cYmVnaW57aXRlbWl6ZX0KLSAgXGl0ZW0gXGNvZGV7bmFtZX0gVGhlIG5hbWUgb2YgdGhlIGVuY29kaW5nOwotICBcaXRlbSBcY29kZXtlbmNvZGVyfSBUaGUgc3RhdGVsZXNzIGVuY29kaW5nIGZ1bmN0aW9uOwotICBcaXRlbSBcY29kZXtkZWNvZGVyfSBUaGUgc3RhdGVsZXNzIGRlY29kaW5nIGZ1bmN0aW9uOwotICBcaXRlbSBcY29kZXtpbmNyZW1lbnRhbGVuY29kZXJ9IEFuIGluY3JlbWVudGFsIGVuY29kZXIgY2xhc3Mgb3IgZmFjdG9yeSBmdW5jdGlvbjsKLSAgXGl0ZW0gXGNvZGV7aW5jcmVtZW50YWxkZWNvZGVyfSBBbiBpbmNyZW1lbnRhbCBkZWNvZGVyIGNsYXNzIG9yIGZhY3RvcnkgZnVuY3Rpb247Ci0gIFxpdGVtIFxjb2Rle3N0cmVhbXdyaXRlcn0gQSBzdHJlYW0gd3JpdGVyIGNsYXNzIG9yIGZhY3RvcnkgZnVuY3Rpb247Ci0gIFxpdGVtIFxjb2Rle3N0cmVhbXJlYWRlcn0gQSBzdHJlYW0gcmVhZGVyIGNsYXNzIG9yIGZhY3RvcnkgZnVuY3Rpb24uCi1cZW5ke2l0ZW1pemV9Ci0KLVRoZSB2YXJpb3VzIGZ1bmN0aW9ucyBvciBjbGFzc2VzIHRha2UgdGhlIGZvbGxvd2luZyBhcmd1bWVudHM6Ci0KLSAgXHZhcntlbmNvZGVyfSBhbmQgXHZhcntkZWNvZGVyfTogVGhlc2UgbXVzdCBiZSBmdW5jdGlvbnMgb3IgbWV0aG9kcwotICB3aGljaCBoYXZlIHRoZSBzYW1lIGludGVyZmFjZSBhcyB0aGUKLSAgXG1ldGhvZHtlbmNvZGUoKX0vXG1ldGhvZHtkZWNvZGUoKX0gbWV0aG9kcyBvZiBDb2RlYyBpbnN0YW5jZXMgKHNlZQotICBDb2RlYyBJbnRlcmZhY2UpLiBUaGUgZnVuY3Rpb25zL21ldGhvZHMgYXJlIGV4cGVjdGVkIHRvIHdvcmsgaW4gYQotICBzdGF0ZWxlc3MgbW9kZS4KLQotICBcdmFye2luY3JlbWVudGFsZW5jb2Rlcn0gYW5kIFx2YXJ7aW5jcmVtZW50YWxlbmNvZGVyfTogVGhlc2UgaGF2ZSB0byBiZQotICBmYWN0b3J5IGZ1bmN0aW9ucyBwcm92aWRpbmcgdGhlIGZvbGxvd2luZyBpbnRlcmZhY2U6Ci0KLSAgICAgICAgXGNvZGV7ZmFjdG9yeShcdmFye2Vycm9yc309J3N0cmljdCcpfQotCi0gIFRoZSBmYWN0b3J5IGZ1bmN0aW9ucyBtdXN0IHJldHVybiBvYmplY3RzIHByb3ZpZGluZyB0aGUgaW50ZXJmYWNlcwotICBkZWZpbmVkIGJ5IHRoZSBiYXNlIGNsYXNzZXMgXGNsYXNze0luY3JlbWVudGFsRW5jb2Rlcn0gYW5kCi0gIFxjbGFzc3tJbmNyZW1lbnRhbEVuY29kZXJ9LCByZXNwZWN0aXZlbHkuIEluY3JlbWVudGFsIGNvZGVjcyBjYW4gbWFpbnRhaW4KLSAgc3RhdGUuCi0KLSAgXHZhcntzdHJlYW1yZWFkZXJ9IGFuZCBcdmFye3N0cmVhbXdyaXRlcn06IFRoZXNlIGhhdmUgdG8gYmUKLSAgZmFjdG9yeSBmdW5jdGlvbnMgcHJvdmlkaW5nIHRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlOgotCi0gICAgICAgIFxjb2Rle2ZhY3RvcnkoXHZhcntzdHJlYW19LCBcdmFye2Vycm9yc309J3N0cmljdCcpfQotCi0gIFRoZSBmYWN0b3J5IGZ1bmN0aW9ucyBtdXN0IHJldHVybiBvYmplY3RzIHByb3ZpZGluZyB0aGUgaW50ZXJmYWNlcwotICBkZWZpbmVkIGJ5IHRoZSBiYXNlIGNsYXNzZXMgXGNsYXNze1N0cmVhbVdyaXRlcn0gYW5kCi0gIFxjbGFzc3tTdHJlYW1SZWFkZXJ9LCByZXNwZWN0aXZlbHkuIFN0cmVhbSBjb2RlY3MgY2FuIG1haW50YWluCi0gIHN0YXRlLgotCi0gIFBvc3NpYmxlIHZhbHVlcyBmb3IgZXJyb3JzIGFyZSBcY29kZXsnc3RyaWN0J30gKHJhaXNlIGFuIGV4Y2VwdGlvbgotICBpbiBjYXNlIG9mIGFuIGVuY29kaW5nIGVycm9yKSwgXGNvZGV7J3JlcGxhY2UnfSAocmVwbGFjZSBtYWxmb3JtZWQKLSAgZGF0YSB3aXRoIGEgc3VpdGFibGUgcmVwbGFjZW1lbnQgbWFya2VyLCBzdWNoIGFzIFxjaGFyYWN0ZXJ7P30pLAotICBcY29kZXsnaWdub3JlJ30gKGlnbm9yZSBtYWxmb3JtZWQgZGF0YSBhbmQgY29udGludWUgd2l0aG91dCBmdXJ0aGVyCi0gIG5vdGljZSksIFxjb2Rleyd4bWxjaGFycmVmcmVwbGFjZSd9IChyZXBsYWNlIHdpdGggdGhlIGFwcHJvcHJpYXRlIFhNTAotICBjaGFyYWN0ZXIgcmVmZXJlbmNlIChmb3IgZW5jb2Rpbmcgb25seSkpIGFuZCBcY29kZXsnYmFja3NsYXNocmVwbGFjZSd9Ci0gIChyZXBsYWNlIHdpdGggYmFja3NsYXNoZWQgZXNjYXBlIHNlcXVlbmNlcyAoZm9yIGVuY29kaW5nIG9ubHkpKSBhcwotICB3ZWxsIGFzIGFueSBvdGhlciBlcnJvciBoYW5kbGluZyBuYW1lIGRlZmluZWQgdmlhCi0gIFxmdW5jdGlvbntyZWdpc3Rlcl9lcnJvcigpfS4KLQotSW4gY2FzZSBhIHNlYXJjaCBmdW5jdGlvbiBjYW5ub3QgZmluZCBhIGdpdmVuIGVuY29kaW5nLCBpdCBzaG91bGQKLXJldHVybiBcY29kZXtOb25lfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bG9va3VwfXtlbmNvZGluZ30KLUxvb2tzIHVwIHRoZSBjb2RlYyBpbmZvIGluIHRoZSBQeXRob24gY29kZWMgcmVnaXN0cnkgYW5kIHJldHVybnMgYQotXGNsYXNze0NvZGVjSW5mb30gb2JqZWN0IGFzIGRlZmluZWQgYWJvdmUuCi0KLUVuY29kaW5ncyBhcmUgZmlyc3QgbG9va2VkIHVwIGluIHRoZSByZWdpc3RyeSdzIGNhY2hlLiBJZiBub3QgZm91bmQsCi10aGUgbGlzdCBvZiByZWdpc3RlcmVkIHNlYXJjaCBmdW5jdGlvbnMgaXMgc2Nhbm5lZC4gSWYgbm8gXGNsYXNze0NvZGVjSW5mb30KLW9iamVjdCBpcyBmb3VuZCwgYSBcZXhjZXB0aW9ue0xvb2t1cEVycm9yfSBpcyByYWlzZWQuIE90aGVyd2lzZSwgdGhlCi1cY2xhc3N7Q29kZWNJbmZvfSBvYmplY3QgaXMgc3RvcmVkIGluIHRoZSBjYWNoZSBhbmQgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVRvIHNpbXBsaWZ5IGFjY2VzcyB0byB0aGUgdmFyaW91cyBjb2RlY3MsIHRoZSBtb2R1bGUgcHJvdmlkZXMgdGhlc2UKLWFkZGl0aW9uYWwgZnVuY3Rpb25zIHdoaWNoIHVzZSBcZnVuY3Rpb257bG9va3VwKCl9IGZvciB0aGUgY29kZWMKLWxvb2t1cDoKLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRlbmNvZGVyfXtlbmNvZGluZ30KLUxvb2sgdXAgdGhlIGNvZGVjIGZvciB0aGUgZ2l2ZW4gZW5jb2RpbmcgYW5kIHJldHVybiBpdHMgZW5jb2RlcgotZnVuY3Rpb24uCi0KLVJhaXNlcyBhIFxleGNlcHRpb257TG9va3VwRXJyb3J9IGluIGNhc2UgdGhlIGVuY29kaW5nIGNhbm5vdCBiZSBmb3VuZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0ZGVjb2Rlcn17ZW5jb2Rpbmd9Ci1Mb29rIHVwIHRoZSBjb2RlYyBmb3IgdGhlIGdpdmVuIGVuY29kaW5nIGFuZCByZXR1cm4gaXRzIGRlY29kZXIKLWZ1bmN0aW9uLgotCi1SYWlzZXMgYSBcZXhjZXB0aW9ue0xvb2t1cEVycm9yfSBpbiBjYXNlIHRoZSBlbmNvZGluZyBjYW5ub3QgYmUgZm91bmQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldGluY3JlbWVudGFsZW5jb2Rlcn17ZW5jb2Rpbmd9Ci1Mb29rIHVwIHRoZSBjb2RlYyBmb3IgdGhlIGdpdmVuIGVuY29kaW5nIGFuZCByZXR1cm4gaXRzIGluY3JlbWVudGFsIGVuY29kZXIKLWNsYXNzIG9yIGZhY3RvcnkgZnVuY3Rpb24uCi0KLVJhaXNlcyBhIFxleGNlcHRpb257TG9va3VwRXJyb3J9IGluIGNhc2UgdGhlIGVuY29kaW5nIGNhbm5vdCBiZSBmb3VuZCBvciB0aGUKLWNvZGVjIGRvZXNuJ3Qgc3VwcG9ydCBhbiBpbmNyZW1lbnRhbCBlbmNvZGVyLgotXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldGluY3JlbWVudGFsZGVjb2Rlcn17ZW5jb2Rpbmd9Ci1Mb29rIHVwIHRoZSBjb2RlYyBmb3IgdGhlIGdpdmVuIGVuY29kaW5nIGFuZCByZXR1cm4gaXRzIGluY3JlbWVudGFsIGRlY29kZXIKLWNsYXNzIG9yIGZhY3RvcnkgZnVuY3Rpb24uCi0KLVJhaXNlcyBhIFxleGNlcHRpb257TG9va3VwRXJyb3J9IGluIGNhc2UgdGhlIGVuY29kaW5nIGNhbm5vdCBiZSBmb3VuZCBvciB0aGUKLWNvZGVjIGRvZXNuJ3Qgc3VwcG9ydCBhbiBpbmNyZW1lbnRhbCBkZWNvZGVyLgotXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldHJlYWRlcn17ZW5jb2Rpbmd9Ci1Mb29rIHVwIHRoZSBjb2RlYyBmb3IgdGhlIGdpdmVuIGVuY29kaW5nIGFuZCByZXR1cm4gaXRzIFN0cmVhbVJlYWRlcgotY2xhc3Mgb3IgZmFjdG9yeSBmdW5jdGlvbi4KLQotUmFpc2VzIGEgXGV4Y2VwdGlvbntMb29rdXBFcnJvcn0gaW4gY2FzZSB0aGUgZW5jb2RpbmcgY2Fubm90IGJlIGZvdW5kLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXR3cml0ZXJ9e2VuY29kaW5nfQotTG9vayB1cCB0aGUgY29kZWMgZm9yIHRoZSBnaXZlbiBlbmNvZGluZyBhbmQgcmV0dXJuIGl0cyBTdHJlYW1Xcml0ZXIKLWNsYXNzIG9yIGZhY3RvcnkgZnVuY3Rpb24uCi0KLVJhaXNlcyBhIFxleGNlcHRpb257TG9va3VwRXJyb3J9IGluIGNhc2UgdGhlIGVuY29kaW5nIGNhbm5vdCBiZSBmb3VuZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cmVnaXN0ZXJfZXJyb3J9e25hbWUsIGVycm9yX2hhbmRsZXJ9Ci1SZWdpc3RlciB0aGUgZXJyb3IgaGFuZGxpbmcgZnVuY3Rpb24gXHZhcntlcnJvcl9oYW5kbGVyfSB1bmRlciB0aGUKLW5hbWUgXHZhcntuYW1lfS4gXHZhcntlcnJvcl9oYW5kbGVyfSB3aWxsIGJlIGNhbGxlZCBkdXJpbmcgZW5jb2RpbmcKLWFuZCBkZWNvZGluZyBpbiBjYXNlIG9mIGFuIGVycm9yLCB3aGVuIFx2YXJ7bmFtZX0gaXMgc3BlY2lmaWVkIGFzIHRoZQotZXJyb3JzIHBhcmFtZXRlci4KLQotRm9yIGVuY29kaW5nIFx2YXJ7ZXJyb3JfaGFuZGxlcn0gd2lsbCBiZSBjYWxsZWQgd2l0aCBhCi1cZXhjZXB0aW9ue1VuaWNvZGVFbmNvZGVFcnJvcn0gaW5zdGFuY2UsIHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0Ci10aGUgbG9jYXRpb24gb2YgdGhlIGVycm9yLiBUaGUgZXJyb3IgaGFuZGxlciBtdXN0IGVpdGhlciByYWlzZSB0aGlzIG9yCi1hIGRpZmZlcmVudCBleGNlcHRpb24gb3IgcmV0dXJuIGEgdHVwbGUgd2l0aCBhIHJlcGxhY2VtZW50IGZvciB0aGUKLXVuZW5jb2RhYmxlIHBhcnQgb2YgdGhlIGlucHV0IGFuZCBhIHBvc2l0aW9uIHdoZXJlIGVuY29kaW5nIHNob3VsZAotY29udGludWUuIFRoZSBlbmNvZGVyIHdpbGwgZW5jb2RlIHRoZSByZXBsYWNlbWVudCBhbmQgY29udGludWUgZW5jb2RpbmcKLXRoZSBvcmlnaW5hbCBpbnB1dCBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLiBOZWdhdGl2ZSBwb3NpdGlvbiB2YWx1ZXMKLXdpbGwgYmUgdHJlYXRlZCBhcyBiZWluZyByZWxhdGl2ZSB0byB0aGUgZW5kIG9mIHRoZSBpbnB1dCBzdHJpbmcuIElmIHRoZQotcmVzdWx0aW5nIHBvc2l0aW9uIGlzIG91dCBvZiBib3VuZCBhbiBcZXhjZXB0aW9ue0luZGV4RXJyb3J9IHdpbGwgYmUgcmFpc2VkLgotCi1EZWNvZGluZyBhbmQgdHJhbnNsYXRpbmcgd29ya3Mgc2ltaWxhciwgZXhjZXB0IFxleGNlcHRpb257VW5pY29kZURlY29kZUVycm9yfQotb3IgXGV4Y2VwdGlvbntVbmljb2RlVHJhbnNsYXRlRXJyb3J9IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBoYW5kbGVyIGFuZAotdGhhdCB0aGUgcmVwbGFjZW1lbnQgZnJvbSB0aGUgZXJyb3IgaGFuZGxlciB3aWxsIGJlIHB1dCBpbnRvIHRoZSBvdXRwdXQKLWRpcmVjdGx5LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtsb29rdXBfZXJyb3J9e25hbWV9Ci1SZXR1cm4gdGhlIGVycm9yIGhhbmRsZXIgcHJldmlvdXNseSByZWdpc3RlcmVkIHVuZGVyIHRoZSBuYW1lIFx2YXJ7bmFtZX0uCi0KLVJhaXNlcyBhIFxleGNlcHRpb257TG9va3VwRXJyb3J9IGluIGNhc2UgdGhlIGhhbmRsZXIgY2Fubm90IGJlIGZvdW5kLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzdHJpY3RfZXJyb3JzfXtleGNlcHRpb259Ci1JbXBsZW1lbnRzIHRoZSBcY29kZXtzdHJpY3R9IGVycm9yIGhhbmRsaW5nLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtyZXBsYWNlX2Vycm9yc317ZXhjZXB0aW9ufQotSW1wbGVtZW50cyB0aGUgXGNvZGV7cmVwbGFjZX0gZXJyb3IgaGFuZGxpbmcuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2lnbm9yZV9lcnJvcnN9e2V4Y2VwdGlvbn0KLUltcGxlbWVudHMgdGhlIFxjb2Rle2lnbm9yZX0gZXJyb3IgaGFuZGxpbmcuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3htbGNoYXJyZWZyZXBsYWNlX2Vycm9yc19lcnJvcnN9e2V4Y2VwdGlvbn0KLUltcGxlbWVudHMgdGhlIFxjb2Rle3htbGNoYXJyZWZyZXBsYWNlfSBlcnJvciBoYW5kbGluZy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317YmFja3NsYXNocmVwbGFjZV9lcnJvcnNfZXJyb3JzfXtleGNlcHRpb259Ci1JbXBsZW1lbnRzIHRoZSBcY29kZXtiYWNrc2xhc2hyZXBsYWNlfSBlcnJvciBoYW5kbGluZy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVRvIHNpbXBsaWZ5IHdvcmtpbmcgd2l0aCBlbmNvZGVkIGZpbGVzIG9yIHN0cmVhbSwgdGhlIG1vZHVsZQotYWxzbyBkZWZpbmVzIHRoZXNlIHV0aWxpdHkgZnVuY3Rpb25zOgotCi1cYmVnaW57ZnVuY2Rlc2N9e29wZW59e2ZpbGVuYW1lLCBtb2RlXG9wdGlvbmFseywgZW5jb2Rpbmdcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnNcb3B0aW9uYWx7LCBidWZmZXJpbmd9fX19Ci1PcGVuIGFuIGVuY29kZWQgZmlsZSB1c2luZyB0aGUgZ2l2ZW4gXHZhcnttb2RlfSBhbmQgcmV0dXJuCi1hIHdyYXBwZWQgdmVyc2lvbiBwcm92aWRpbmcgdHJhbnNwYXJlbnQgZW5jb2RpbmcvZGVjb2RpbmcuCi0KLVxub3Rle1RoZSB3cmFwcGVkIHZlcnNpb24gd2lsbCBvbmx5IGFjY2VwdCB0aGUgb2JqZWN0IGZvcm1hdAotZGVmaW5lZCBieSB0aGUgY29kZWNzLCBpLmUuXCBVbmljb2RlIG9iamVjdHMgZm9yIG1vc3QgYnVpbHQtaW4KLWNvZGVjcy4gIE91dHB1dCBpcyBhbHNvIGNvZGVjLWRlcGVuZGVudCBhbmQgd2lsbCB1c3VhbGx5IGJlIFVuaWNvZGUgYXMKLXdlbGwufQotCi1cdmFye2VuY29kaW5nfSBzcGVjaWZpZXMgdGhlIGVuY29kaW5nIHdoaWNoIGlzIHRvIGJlIHVzZWQgZm9yIHRoZQotZmlsZS4KLQotXHZhcntlcnJvcnN9IG1heSBiZSBnaXZlbiB0byBkZWZpbmUgdGhlIGVycm9yIGhhbmRsaW5nLiBJdCBkZWZhdWx0cwotdG8gXGNvZGV7J3N0cmljdCd9IHdoaWNoIGNhdXNlcyBhIFxleGNlcHRpb257VmFsdWVFcnJvcn0gdG8gYmUgcmFpc2VkCi1pbiBjYXNlIGFuIGVuY29kaW5nIGVycm9yIG9jY3Vycy4KLQotXHZhcntidWZmZXJpbmd9IGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIGZvciB0aGUgYnVpbHQtaW4KLVxmdW5jdGlvbntvcGVuKCl9IGZ1bmN0aW9uLiAgSXQgZGVmYXVsdHMgdG8gbGluZSBidWZmZXJlZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317RW5jb2RlZEZpbGV9e2ZpbGUsIGlucHV0XG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFxvcHRpb25hbHssIGVycm9yc319fQotUmV0dXJuIGEgd3JhcHBlZCB2ZXJzaW9uIG9mIGZpbGUgd2hpY2ggcHJvdmlkZXMgdHJhbnNwYXJlbnQKLWVuY29kaW5nIHRyYW5zbGF0aW9uLgotCi1TdHJpbmdzIHdyaXR0ZW4gdG8gdGhlIHdyYXBwZWQgZmlsZSBhcmUgaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvIHRoZQotZ2l2ZW4gXHZhcntpbnB1dH0gZW5jb2RpbmcgYW5kIHRoZW4gd3JpdHRlbiB0byB0aGUgb3JpZ2luYWwgZmlsZSBhcwotc3RyaW5ncyB1c2luZyB0aGUgXHZhcntvdXRwdXR9IGVuY29kaW5nLiBUaGUgaW50ZXJtZWRpYXRlIGVuY29kaW5nIHdpbGwKLXVzdWFsbHkgYmUgVW5pY29kZSBidXQgZGVwZW5kcyBvbiB0aGUgc3BlY2lmaWVkIGNvZGVjcy4KLQotSWYgXHZhcntvdXRwdXR9IGlzIG5vdCBnaXZlbiwgaXQgZGVmYXVsdHMgdG8gXHZhcntpbnB1dH0uCi0KLVx2YXJ7ZXJyb3JzfSBtYXkgYmUgZ2l2ZW4gdG8gZGVmaW5lIHRoZSBlcnJvciBoYW5kbGluZy4gSXQgZGVmYXVsdHMgdG8KLVxjb2RleydzdHJpY3QnfSwgd2hpY2ggY2F1c2VzIFxleGNlcHRpb257VmFsdWVFcnJvcn0gdG8gYmUgcmFpc2VkIGluIGNhc2UKLWFuIGVuY29kaW5nIGVycm9yIG9jY3Vycy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aXRlcmVuY29kZX17aXRlcmFibGUsIGVuY29kaW5nXG9wdGlvbmFseywgZXJyb3JzfX0KLVVzZXMgYW4gaW5jcmVtZW50YWwgZW5jb2RlciB0byBpdGVyYXRpdmVseSBlbmNvZGUgdGhlIGlucHV0IHByb3ZpZGVkIGJ5Ci1cdmFye2l0ZXJhYmxlfS4gVGhpcyBmdW5jdGlvbiBpcyBhIGdlbmVyYXRvci4gXHZhcntlcnJvcnN9IChhcyB3ZWxsIGFzCi1hbnkgb3RoZXIga2V5d29yZCBhcmd1bWVudCkgaXMgcGFzc2VkIHRocm91Z2ggdG8gdGhlIGluY3JlbWVudGFsIGVuY29kZXIuCi1cdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aXRlcmRlY29kZX17aXRlcmFibGUsIGVuY29kaW5nXG9wdGlvbmFseywgZXJyb3JzfX0KLVVzZXMgYW4gaW5jcmVtZW50YWwgZGVjb2RlciB0byBpdGVyYXRpdmVseSBkZWNvZGUgdGhlIGlucHV0IHByb3ZpZGVkIGJ5Ci1cdmFye2l0ZXJhYmxlfS4gVGhpcyBmdW5jdGlvbiBpcyBhIGdlbmVyYXRvci4gXHZhcntlcnJvcnN9IChhcyB3ZWxsIGFzCi1hbnkgb3RoZXIga2V5d29yZCBhcmd1bWVudCkgaXMgcGFzc2VkIHRocm91Z2ggdG8gdGhlIGluY3JlbWVudGFsIGRlY29kZXIuCi1cdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVRoZSBtb2R1bGUgYWxzbyBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGNvbnN0YW50cyB3aGljaCBhcmUgdXNlZnVsCi1mb3IgcmVhZGluZyBhbmQgd3JpdGluZyB0byBwbGF0Zm9ybSBkZXBlbmRlbnQgZmlsZXM6Ci0KLVxiZWdpbntkYXRhZGVzY317Qk9NfQotXGRhdGFsaW5le0JPTV9CRX0KLVxkYXRhbGluZXtCT01fTEV9Ci1cZGF0YWxpbmV7Qk9NX1VURjh9Ci1cZGF0YWxpbmV7Qk9NX1VURjE2fQotXGRhdGFsaW5le0JPTV9VVEYxNl9CRX0KLVxkYXRhbGluZXtCT01fVVRGMTZfTEV9Ci1cZGF0YWxpbmV7Qk9NX1VURjMyfQotXGRhdGFsaW5le0JPTV9VVEYzMl9CRX0KLVxkYXRhbGluZXtCT01fVVRGMzJfTEV9Ci1UaGVzZSBjb25zdGFudHMgZGVmaW5lIHZhcmlvdXMgZW5jb2RpbmdzIG9mIHRoZSBVbmljb2RlIGJ5dGUgb3JkZXIgbWFyawotKEJPTSkgdXNlZCBpbiBVVEYtMTYgYW5kIFVURi0zMiBkYXRhIHN0cmVhbXMgdG8gaW5kaWNhdGUgdGhlIGJ5dGUgb3JkZXIKLXVzZWQgaW4gdGhlIHN0cmVhbSBvciBmaWxlIGFuZCBpbiBVVEYtOCBhcyBhIFVuaWNvZGUgc2lnbmF0dXJlLgotXGNvbnN0YW50e0JPTV9VVEYxNn0gaXMgZWl0aGVyIFxjb25zdGFudHtCT01fVVRGMTZfQkV9IG9yCi1cY29uc3RhbnR7Qk9NX1VURjE2X0xFfSBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtJ3MgbmF0aXZlIGJ5dGUgb3JkZXIsCi1cY29uc3RhbnR7Qk9NfSBpcyBhbiBhbGlhcyBmb3IgXGNvbnN0YW50e0JPTV9VVEYxNn0sIFxjb25zdGFudHtCT01fTEV9Ci1mb3IgXGNvbnN0YW50e0JPTV9VVEYxNl9MRX0gYW5kIFxjb25zdGFudHtCT01fQkV9IGZvciBcY29uc3RhbnR7Qk9NX1VURjE2X0JFfS4KLVRoZSBvdGhlcnMgcmVwcmVzZW50IHRoZSBCT00gaW4gVVRGLTggYW5kIFVURi0zMiBlbmNvZGluZ3MuCi1cZW5ke2RhdGFkZXNjfQotCi0KLVxzdWJzZWN0aW9ue0NvZGVjIEJhc2UgQ2xhc3NlcyBcbGFiZWx7Y29kZWMtYmFzZS1jbGFzc2VzfX0KLQotVGhlIFxtb2R1bGV7Y29kZWNzfSBtb2R1bGUgZGVmaW5lcyBhIHNldCBvZiBiYXNlIGNsYXNzZXMgd2hpY2ggZGVmaW5lIHRoZQotaW50ZXJmYWNlIGFuZCBjYW4gYWxzbyBiZSB1c2VkIHRvIGVhc2lseSB3cml0ZSB5b3Ugb3duIGNvZGVjcyBmb3IgdXNlCi1pbiBQeXRob24uCi0KLUVhY2ggY29kZWMgaGFzIHRvIGRlZmluZSBmb3VyIGludGVyZmFjZXMgdG8gbWFrZSBpdCB1c2FibGUgYXMgY29kZWMgaW4KLVB5dGhvbjogc3RhdGVsZXNzIGVuY29kZXIsIHN0YXRlbGVzcyBkZWNvZGVyLCBzdHJlYW0gcmVhZGVyIGFuZCBzdHJlYW0KLXdyaXRlci4gVGhlIHN0cmVhbSByZWFkZXIgYW5kIHdyaXRlcnMgdHlwaWNhbGx5IHJldXNlIHRoZSBzdGF0ZWxlc3MKLWVuY29kZXIvZGVjb2RlciB0byBpbXBsZW1lbnQgdGhlIGZpbGUgcHJvdG9jb2xzLgotCi1UaGUgXGNsYXNze0NvZGVjfSBjbGFzcyBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgZm9yIHN0YXRlbGVzcwotZW5jb2RlcnMvZGVjb2RlcnMuCi0KLVRvIHNpbXBsaWZ5IGFuZCBzdGFuZGFyZGl6ZSBlcnJvciBoYW5kbGluZywgdGhlIFxtZXRob2R7ZW5jb2RlKCl9IGFuZAotXG1ldGhvZHtkZWNvZGUoKX0gbWV0aG9kcyBtYXkgaW1wbGVtZW50IGRpZmZlcmVudCBlcnJvciBoYW5kbGluZwotc2NoZW1lcyBieSBwcm92aWRpbmcgdGhlIFx2YXJ7ZXJyb3JzfSBzdHJpbmcgYXJndW1lbnQuICBUaGUgZm9sbG93aW5nCi1zdHJpbmcgdmFsdWVzIGFyZSBkZWZpbmVkIGFuZCBpbXBsZW1lbnRlZCBieSBhbGwgc3RhbmRhcmQgUHl0aG9uCi1jb2RlY3M6Ci0KLVxiZWdpbnt0YWJsZWlpfXtsfGx9e2NvZGV9e1ZhbHVlfXtNZWFuaW5nfQotICBcbGluZWlpeydzdHJpY3QnfXtSYWlzZSBcZXhjZXB0aW9ue1VuaWNvZGVFcnJvcn0gKG9yIGEgc3ViY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICB0aGlzIGlzIHRoZSBkZWZhdWx0Ln0KLSAgXGxpbmVpaXsnaWdub3JlJ317SWdub3JlIHRoZSBjaGFyYWN0ZXIgYW5kIGNvbnRpbnVlIHdpdGggdGhlIG5leHQufQotICBcbGluZWlpeydyZXBsYWNlJ317UmVwbGFjZSB3aXRoIGEgc3VpdGFibGUgcmVwbGFjZW1lbnQgY2hhcmFjdGVyOwotICAgICAgICAgICAgICAgICAgICAgUHl0aG9uIHdpbGwgdXNlIHRoZSBvZmZpY2lhbCBVK0ZGRkQgUkVQTEFDRU1FTlQKLSAgICAgICAgICAgICAgICAgICAgIENIQVJBQ1RFUiBmb3IgdGhlIGJ1aWx0LWluIFVuaWNvZGUgY29kZWNzIG9uCi0gICAgICAgICAgICAgICAgICAgICBkZWNvZGluZyBhbmQgJz8nIG9uIGVuY29kaW5nLn0KLSAgXGxpbmVpaXsneG1sY2hhcnJlZnJlcGxhY2UnfXtSZXBsYWNlIHdpdGggdGhlIGFwcHJvcHJpYXRlIFhNTAotICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyIHJlZmVyZW5jZSAob25seSBmb3IgZW5jb2RpbmcpLn0KLSAgXGxpbmVpaXsnYmFja3NsYXNocmVwbGFjZSd9e1JlcGxhY2Ugd2l0aCBiYWNrc2xhc2hlZCBlc2NhcGUgc2VxdWVuY2VzCi0gICAgICAgICAgICAgICAgICAgICAob25seSBmb3IgZW5jb2RpbmcpLn0KLVxlbmR7dGFibGVpaX0KLQotVGhlIHNldCBvZiBhbGxvd2VkIHZhbHVlcyBjYW4gYmUgZXh0ZW5kZWQgdmlhIFxtZXRob2R7cmVnaXN0ZXJfZXJyb3J9LgotCi0KLVxzdWJzdWJzZWN0aW9ue0NvZGVjIE9iamVjdHMgXGxhYmVse2NvZGVjLW9iamVjdHN9fQotCi1UaGUgXGNsYXNze0NvZGVjfSBjbGFzcyBkZWZpbmVzIHRoZXNlIG1ldGhvZHMgd2hpY2ggYWxzbyBkZWZpbmUgdGhlCi1mdW5jdGlvbiBpbnRlcmZhY2VzIG9mIHRoZSBzdGF0ZWxlc3MgZW5jb2RlciBhbmQgZGVjb2RlcjoKLQotXGJlZ2lue21ldGhvZGRlc2N9W0NvZGVjXXtlbmNvZGV9e2lucHV0XG9wdGlvbmFseywgZXJyb3JzfX0KLSAgRW5jb2RlcyB0aGUgb2JqZWN0IFx2YXJ7aW5wdXR9IGFuZCByZXR1cm5zIGEgdHVwbGUgKG91dHB1dCBvYmplY3QsCi0gIGxlbmd0aCBjb25zdW1lZCkuICBXaGlsZSBjb2RlY3MgYXJlIG5vdCByZXN0cmljdGVkIHRvIHVzZSB3aXRoIFVuaWNvZGUsIGluCi0gIGEgVW5pY29kZSBjb250ZXh0LCBlbmNvZGluZyBjb252ZXJ0cyBhIFVuaWNvZGUgb2JqZWN0IHRvIGEgcGxhaW4gc3RyaW5nCi0gIHVzaW5nIGEgcGFydGljdWxhciBjaGFyYWN0ZXIgc2V0IGVuY29kaW5nIChlLmcuLCBcY29kZXtjcDEyNTJ9IG9yCi0gIFxjb2Rle2lzby04ODU5LTF9KS4KLQotICBcdmFye2Vycm9yc30gZGVmaW5lcyB0aGUgZXJyb3IgaGFuZGxpbmcgdG8gYXBwbHkuIEl0IGRlZmF1bHRzIHRvCi0gIFxjb2RleydzdHJpY3QnfSBoYW5kbGluZy4KLQotICBUaGUgbWV0aG9kIG1heSBub3Qgc3RvcmUgc3RhdGUgaW4gdGhlIFxjbGFzc3tDb2RlY30gaW5zdGFuY2UuIFVzZQotICBcY2xhc3N7U3RyZWFtQ29kZWN9IGZvciBjb2RlY3Mgd2hpY2ggaGF2ZSB0byBrZWVwIHN0YXRlIGluIG9yZGVyIHRvCi0gIG1ha2UgZW5jb2RpbmcvZGVjb2RpbmcgZWZmaWNpZW50LgotCi0gIFRoZSBlbmNvZGVyIG11c3QgYmUgYWJsZSB0byBoYW5kbGUgemVybyBsZW5ndGggaW5wdXQgYW5kIHJldHVybiBhbgotICBlbXB0eSBvYmplY3Qgb2YgdGhlIG91dHB1dCBvYmplY3QgdHlwZSBpbiB0aGlzIHNpdHVhdGlvbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0NvZGVjXXtkZWNvZGV9e2lucHV0XG9wdGlvbmFseywgZXJyb3JzfX0KLSAgRGVjb2RlcyB0aGUgb2JqZWN0IFx2YXJ7aW5wdXR9IGFuZCByZXR1cm5zIGEgdHVwbGUgKG91dHB1dCBvYmplY3QsCi0gIGxlbmd0aCBjb25zdW1lZCkuICBJbiBhIFVuaWNvZGUgY29udGV4dCwgZGVjb2RpbmcgY29udmVydHMgYSBwbGFpbiBzdHJpbmcKLSAgZW5jb2RlZCB1c2luZyBhIHBhcnRpY3VsYXIgY2hhcmFjdGVyIHNldCBlbmNvZGluZyB0byBhIFVuaWNvZGUgb2JqZWN0LgotCi0gIFx2YXJ7aW5wdXR9IG11c3QgYmUgYW4gb2JqZWN0IHdoaWNoIHByb3ZpZGVzIHRoZSBcY29kZXtiZl9nZXRyZWFkYnVmfQotICBidWZmZXIgc2xvdC4gIFB5dGhvbiBzdHJpbmdzLCBidWZmZXIgb2JqZWN0cyBhbmQgbWVtb3J5IG1hcHBlZCBmaWxlcwotICBhcmUgZXhhbXBsZXMgb2Ygb2JqZWN0cyBwcm92aWRpbmcgdGhpcyBzbG90LgotCi0gIFx2YXJ7ZXJyb3JzfSBkZWZpbmVzIHRoZSBlcnJvciBoYW5kbGluZyB0byBhcHBseS4gSXQgZGVmYXVsdHMgdG8KLSAgXGNvZGV7J3N0cmljdCd9IGhhbmRsaW5nLgotCi0gIFRoZSBtZXRob2QgbWF5IG5vdCBzdG9yZSBzdGF0ZSBpbiB0aGUgXGNsYXNze0NvZGVjfSBpbnN0YW5jZS4gVXNlCi0gIFxjbGFzc3tTdHJlYW1Db2RlY30gZm9yIGNvZGVjcyB3aGljaCBoYXZlIHRvIGtlZXAgc3RhdGUgaW4gb3JkZXIgdG8KLSAgbWFrZSBlbmNvZGluZy9kZWNvZGluZyBlZmZpY2llbnQuCi0KLSAgVGhlIGRlY29kZXIgbXVzdCBiZSBhYmxlIHRvIGhhbmRsZSB6ZXJvIGxlbmd0aCBpbnB1dCBhbmQgcmV0dXJuIGFuCi0gIGVtcHR5IG9iamVjdCBvZiB0aGUgb3V0cHV0IG9iamVjdCB0eXBlIGluIHRoaXMgc2l0dWF0aW9uLgotXGVuZHttZXRob2RkZXNjfQotCi1UaGUgXGNsYXNze0luY3JlbWVudGFsRW5jb2Rlcn0gYW5kIFxjbGFzc3tJbmNyZW1lbnRhbERlY29kZXJ9IGNsYXNzZXMgcHJvdmlkZQotdGhlIGJhc2ljIGludGVyZmFjZSBmb3IgaW5jcmVtZW50YWwgZW5jb2RpbmcgYW5kIGRlY29kaW5nLiBFbmNvZGluZy9kZWNvZGluZyB0aGUKLWlucHV0IGlzbid0IGRvbmUgd2l0aCBvbmUgY2FsbCB0byB0aGUgc3RhdGVsZXNzIGVuY29kZXIvZGVjb2RlciBmdW5jdGlvbiwKLWJ1dCB3aXRoIG11bHRpcGxlIGNhbGxzIHRvIHRoZSBcbWV0aG9ke2VuY29kZX0vXG1ldGhvZHtkZWNvZGV9IG1ldGhvZCBvZiB0aGUKLWluY3JlbWVudGFsIGVuY29kZXIvZGVjb2Rlci4gVGhlIGluY3JlbWVudGFsIGVuY29kZXIvZGVjb2RlciBrZWVwcyB0cmFjayBvZgotdGhlIGVuY29kaW5nL2RlY29kaW5nIHByb2Nlc3MgZHVyaW5nIG1ldGhvZCBjYWxscy4KLQotVGhlIGpvaW5lZCBvdXRwdXQgb2YgY2FsbHMgdG8gdGhlIFxtZXRob2R7ZW5jb2RlfS9cbWV0aG9ke2RlY29kZX0gbWV0aG9kIGlzIHRoZQotc2FtZSBhcyBpZiBhbGwgdGhlIHNpbmdsZSBpbnB1dHMgd2VyZSBqb2luZWQgaW50byBvbmUsIGFuZCB0aGlzIGlucHV0IHdhcwotZW5jb2RlZC9kZWNvZGVkIHdpdGggdGhlIHN0YXRlbGVzcyBlbmNvZGVyL2RlY29kZXIuCi0KLQotXHN1YnN1YnNlY3Rpb257SW5jcmVtZW50YWxFbmNvZGVyIE9iamVjdHMgXGxhYmVse2luY3JlbWVudGFsLWVuY29kZXItb2JqZWN0c319Ci0KLVx2ZXJzaW9uYWRkZWR7Mi41fQotCi1UaGUgXGNsYXNze0luY3JlbWVudGFsRW5jb2Rlcn0gY2xhc3MgaXMgdXNlZCBmb3IgZW5jb2RpbmcgYW4gaW5wdXQgaW4gbXVsdGlwbGUKLXN0ZXBzLiBJdCBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyB3aGljaCBldmVyeSBpbmNyZW1lbnRhbCBlbmNvZGVyIG11c3QKLWRlZmluZSBpbiBvcmRlciB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlIFB5dGhvbiBjb2RlYyByZWdpc3RyeS4KLQotXGJlZ2lue2NsYXNzZGVzY317SW5jcmVtZW50YWxFbmNvZGVyfXtcb3B0aW9uYWx7ZXJyb3JzfX0KLSAgQ29uc3RydWN0b3IgZm9yIGFuIFxjbGFzc3tJbmNyZW1lbnRhbEVuY29kZXJ9IGluc3RhbmNlLgotCi0gIEFsbCBpbmNyZW1lbnRhbCBlbmNvZGVycyBtdXN0IHByb3ZpZGUgdGhpcyBjb25zdHJ1Y3RvciBpbnRlcmZhY2UuIFRoZXkgYXJlCi0gIGZyZWUgdG8gYWRkIGFkZGl0aW9uYWwga2V5d29yZCBhcmd1bWVudHMsIGJ1dCBvbmx5IHRoZSBvbmVzIGRlZmluZWQKLSAgaGVyZSBhcmUgdXNlZCBieSB0aGUgUHl0aG9uIGNvZGVjIHJlZ2lzdHJ5LgotCi0gIFRoZSBcY2xhc3N7SW5jcmVtZW50YWxFbmNvZGVyfSBtYXkgaW1wbGVtZW50IGRpZmZlcmVudCBlcnJvciBoYW5kbGluZwotICBzY2hlbWVzIGJ5IHByb3ZpZGluZyB0aGUgXHZhcntlcnJvcnN9IGtleXdvcmQgYXJndW1lbnQuIFRoZXNlCi0gIHBhcmFtZXRlcnMgYXJlIHByZWRlZmluZWQ6Ci0KLSAgXGJlZ2lue2l0ZW1pemV9Ci0gICAgXGl0ZW0gXGNvZGV7J3N0cmljdCd9IFJhaXNlIFxleGNlcHRpb257VmFsdWVFcnJvcn0gKG9yIGEgc3ViY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGlzIHRoZSBkZWZhdWx0LgotICAgIFxpdGVtIFxjb2RleydpZ25vcmUnfSBJZ25vcmUgdGhlIGNoYXJhY3RlciBhbmQgY29udGludWUgd2l0aCB0aGUgbmV4dC4KLSAgICBcaXRlbSBcY29kZXsncmVwbGFjZSd9IFJlcGxhY2Ugd2l0aCBhIHN1aXRhYmxlIHJlcGxhY2VtZW50IGNoYXJhY3RlcgotICAgIFxpdGVtIFxjb2Rleyd4bWxjaGFycmVmcmVwbGFjZSd9IFJlcGxhY2Ugd2l0aCB0aGUgYXBwcm9wcmlhdGUgWE1MCi0gICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgcmVmZXJlbmNlCi0gICAgXGl0ZW0gXGNvZGV7J2JhY2tzbGFzaHJlcGxhY2UnfSBSZXBsYWNlIHdpdGggYmFja3NsYXNoZWQgZXNjYXBlIHNlcXVlbmNlcy4KLSAgXGVuZHtpdGVtaXplfQotCi0gIFRoZSBcdmFye2Vycm9yc30gYXJndW1lbnQgd2lsbCBiZSBhc3NpZ25lZCB0byBhbiBhdHRyaWJ1dGUgb2YgdGhlCi0gIHNhbWUgbmFtZS4gQXNzaWduaW5nIHRvIHRoaXMgYXR0cmlidXRlIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHN3aXRjaAotICBiZXR3ZWVuIGRpZmZlcmVudCBlcnJvciBoYW5kbGluZyBzdHJhdGVnaWVzIGR1cmluZyB0aGUgbGlmZXRpbWUKLSAgb2YgdGhlIFxjbGFzc3tJbmNyZW1lbnRhbEVuY29kZXJ9IG9iamVjdC4KLQotICBUaGUgc2V0IG9mIGFsbG93ZWQgdmFsdWVzIGZvciB0aGUgXHZhcntlcnJvcnN9IGFyZ3VtZW50IGNhbgotICBiZSBleHRlbmRlZCB3aXRoIFxmdW5jdGlvbntyZWdpc3Rlcl9lcnJvcigpfS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317ZW5jb2RlfXtvYmplY3Rcb3B0aW9uYWx7LCBmaW5hbH19Ci0gIEVuY29kZXMgXHZhcntvYmplY3R9ICh0YWtpbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGVuY29kZXIgaW50byBhY2NvdW50KQotICBhbmQgcmV0dXJucyB0aGUgcmVzdWx0aW5nIGVuY29kZWQgb2JqZWN0LiBJZiB0aGlzIGlzIHRoZSBsYXN0IGNhbGwgdG8KLSAgXG1ldGhvZHtlbmNvZGV9IFx2YXJ7ZmluYWx9IG11c3QgYmUgdHJ1ZSAodGhlIGRlZmF1bHQgaXMgZmFsc2UpLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317cmVzZXR9e30KLSAgUmVzZXQgdGhlIGVuY29kZXIgdG8gdGhlIGluaXRpYWwgc3RhdGUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtnZXRzdGF0ZX17fQotICBSZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGVuY29kZXIgd2hpY2ggbXVzdCBiZSBhbiBpbnRlZ2VyLgotICBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IFxjb2RlezB9IGlzIHRoZSBtb3N0IGNvbW1vbiBzdGF0ZS4KLSAgKFN0YXRlcyB0aGF0IGFyZSBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gaW50ZWdlcnMgY2FuIGJlIGNvbnZlcnRlZCBpbnRvIGFuCi0gIGludGVnZXIgYnkgbWFyc2hhbGluZy9waWNrbGluZyB0aGUgc3RhdGUgYW5kIGVuY29kaW5nIHRoZSBieXRlcyBvZiB0aGUKLSAgcmVzdWx0aW5nIHN0cmluZyBpbnRvIGFuIGludGVnZXIpLgotICBcdmVyc2lvbmFkZGVkezMuMH0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3NldHN0YXRlfXtzdGF0ZX0KLSAgU2V0IHRoZSBzdGF0ZSBvZiB0aGUgZW5jb2RlciB0byBcdmFye3N0YXRlfS4gXHZhcntzdGF0ZX0gbXVzdCBiZSBhbgotICBlbmNvZGVyIHN0YXRlIHJldHVybmVkIGJ5IFxtZXRob2R7Z2V0c3RhdGV9LgotICBcdmVyc2lvbmFkZGVkezMuMH0KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cc3Vic3Vic2VjdGlvbntJbmNyZW1lbnRhbERlY29kZXIgT2JqZWN0cyBcbGFiZWx7aW5jcmVtZW50YWwtZGVjb2Rlci1vYmplY3RzfX0KLQotVGhlIFxjbGFzc3tJbmNyZW1lbnRhbERlY29kZXJ9IGNsYXNzIGlzIHVzZWQgZm9yIGRlY29kaW5nIGFuIGlucHV0IGluIG11bHRpcGxlCi1zdGVwcy4gSXQgZGVmaW5lcyB0aGUgZm9sbG93aW5nIG1ldGhvZHMgd2hpY2ggZXZlcnkgaW5jcmVtZW50YWwgZGVjb2RlciBtdXN0Ci1kZWZpbmUgaW4gb3JkZXIgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBQeXRob24gY29kZWMgcmVnaXN0cnkuCi0KLVxiZWdpbntjbGFzc2Rlc2N9e0luY3JlbWVudGFsRGVjb2Rlcn17XG9wdGlvbmFse2Vycm9yc319Ci0gIENvbnN0cnVjdG9yIGZvciBhbiBcY2xhc3N7SW5jcmVtZW50YWxEZWNvZGVyfSBpbnN0YW5jZS4KLQotICBBbGwgaW5jcmVtZW50YWwgZGVjb2RlcnMgbXVzdCBwcm92aWRlIHRoaXMgY29uc3RydWN0b3IgaW50ZXJmYWNlLiBUaGV5IGFyZQotICBmcmVlIHRvIGFkZCBhZGRpdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzLCBidXQgb25seSB0aGUgb25lcyBkZWZpbmVkCi0gIGhlcmUgYXJlIHVzZWQgYnkgdGhlIFB5dGhvbiBjb2RlYyByZWdpc3RyeS4KLQotICBUaGUgXGNsYXNze0luY3JlbWVudGFsRGVjb2Rlcn0gbWF5IGltcGxlbWVudCBkaWZmZXJlbnQgZXJyb3IgaGFuZGxpbmcKLSAgc2NoZW1lcyBieSBwcm92aWRpbmcgdGhlIFx2YXJ7ZXJyb3JzfSBrZXl3b3JkIGFyZ3VtZW50LiBUaGVzZQotICBwYXJhbWV0ZXJzIGFyZSBwcmVkZWZpbmVkOgotCi0gIFxiZWdpbntpdGVtaXplfQotICAgIFxpdGVtIFxjb2RleydzdHJpY3QnfSBSYWlzZSBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IChvciBhIHN1YmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBpcyB0aGUgZGVmYXVsdC4KLSAgICBcaXRlbSBcY29kZXsnaWdub3JlJ30gSWdub3JlIHRoZSBjaGFyYWN0ZXIgYW5kIGNvbnRpbnVlIHdpdGggdGhlIG5leHQuCi0gICAgXGl0ZW0gXGNvZGV7J3JlcGxhY2UnfSBSZXBsYWNlIHdpdGggYSBzdWl0YWJsZSByZXBsYWNlbWVudCBjaGFyYWN0ZXIuCi0gIFxlbmR7aXRlbWl6ZX0KLQotICBUaGUgXHZhcntlcnJvcnN9IGFyZ3VtZW50IHdpbGwgYmUgYXNzaWduZWQgdG8gYW4gYXR0cmlidXRlIG9mIHRoZQotICBzYW1lIG5hbWUuIEFzc2lnbmluZyB0byB0aGlzIGF0dHJpYnV0ZSBtYWtlcyBpdCBwb3NzaWJsZSB0byBzd2l0Y2gKLSAgYmV0d2VlbiBkaWZmZXJlbnQgZXJyb3IgaGFuZGxpbmcgc3RyYXRlZ2llcyBkdXJpbmcgdGhlIGxpZmV0aW1lCi0gIG9mIHRoZSBcY2xhc3N7SW5jcmVtZW50YWxFbmNvZGVyfSBvYmplY3QuCi0KLSAgVGhlIHNldCBvZiBhbGxvd2VkIHZhbHVlcyBmb3IgdGhlIFx2YXJ7ZXJyb3JzfSBhcmd1bWVudCBjYW4KLSAgYmUgZXh0ZW5kZWQgd2l0aCBcZnVuY3Rpb257cmVnaXN0ZXJfZXJyb3IoKX0uCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2RlY29kZX17b2JqZWN0XG9wdGlvbmFseywgZmluYWx9fQotICBEZWNvZGVzIFx2YXJ7b2JqZWN0fSAodGFraW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBkZWNvZGVyIGludG8gYWNjb3VudCkKLSAgYW5kIHJldHVybnMgdGhlIHJlc3VsdGluZyBkZWNvZGVkIG9iamVjdC4gSWYgdGhpcyBpcyB0aGUgbGFzdCBjYWxsIHRvCi0gIFxtZXRob2R7ZGVjb2RlfSBcdmFye2ZpbmFsfSBtdXN0IGJlIHRydWUgKHRoZSBkZWZhdWx0IGlzIGZhbHNlKS4KLSAgSWYgXHZhcntmaW5hbH0gaXMgdHJ1ZSB0aGUgZGVjb2RlciBtdXN0IGRlY29kZSB0aGUgaW5wdXQgY29tcGxldGVseSBhbmQgbXVzdAotICBmbHVzaCBhbGwgYnVmZmVycy4gSWYgdGhpcyBpc24ndCBwb3NzaWJsZSAoZS5nLiBiZWNhdXNlIG9mIGluY29tcGxldGUgYnl0ZQotICBzZXF1ZW5jZXMgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQpIGl0IG11c3QgaW5pdGlhdGUgZXJyb3IgaGFuZGxpbmcganVzdCBsaWtlCi0gIGluIHRoZSBzdGF0ZWxlc3MgY2FzZSAod2hpY2ggbWlnaHQgcmFpc2UgYW4gZXhjZXB0aW9uKS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3Jlc2V0fXt9Ci0gIFJlc2V0IHRoZSBkZWNvZGVyIHRvIHRoZSBpbml0aWFsIHN0YXRlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Z2V0c3RhdGV9e30KLSAgUmV0dXJuIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBkZWNvZGVyLiBUaGlzIG11c3QgYmUgYSB0dXBsZSB3aXRoIHR3bwotICBpdGVtcywgdGhlIGZpcnN0IG11c3QgYmUgdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBzdGlsbCB1bmRlY29kZWQgaW5wdXQuCi0gIFRoZSBzZWNvbmQgbXVzdCBiZSBhbiBpbnRlZ2VyIGFuZCBjYW4gYmUgYWRkaXRpb25hbCBzdGF0ZSBpbmZvLgotICAoVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBtYWtlIHN1cmUgdGhhdCBcY29kZXswfSBpcyB0aGUgbW9zdCBjb21tb24KLSAgYWRkaXRpb25hbCBzdGF0ZSBpbmZvLikgSWYgdGhpcyBhZGRpdGlvbmFsIHN0YXRlIGluZm8gaXMgXGNvZGV7MH0gaXQgbXVzdAotICBiZSBwb3NzaWJsZSB0byBzZXQgdGhlIGRlY29kZXIgdG8gdGhlIHN0YXRlIHdoaWNoIGhhcyBubyBpbnB1dCBidWZmZXJlZAotICBhbmQgXGNvZGV7MH0gYXMgdGhlIGFkZGl0aW9uYWwgc3RhdGUgaW5mbywgc28gdGhhdCBmZWVkaW5nIHRoZSBwcmV2aW91c2x5Ci0gIGJ1ZmZlcmVkIGlucHV0IHRvIHRoZSBkZWNvZGVyIHJldHVybnMgaXQgdG8gdGhlIHByZXZpb3VzIHN0YXRlIHdpdGhvdXQKLSAgcHJvZHVjaW5nIGFueSBvdXRwdXQuIChBZGRpdGlvbmFsIHN0YXRlIGluZm8gdGhhdCBpcyBtb3JlIGNvbXBsaWNhdGVkCi0gIHRoYW4gaW50ZWdlcnMgY2FuIGJlIGNvbnZlcnRlZCBpbnRvIGFuIGludGVnZXIgYnkgbWFyc2hhbGluZy9waWNrbGluZwotICB0aGUgaW5mbyBhbmQgZW5jb2RpbmcgdGhlIGJ5dGVzIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nIGludG8gYW4gaW50ZWdlci4pCi0gIFx2ZXJzaW9uYWRkZWR7My4wfQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317c2V0c3RhdGV9e3N0YXRlfQotICBTZXQgdGhlIHN0YXRlIG9mIHRoZSBlbmNvZGVyIHRvIFx2YXJ7c3RhdGV9LiBcdmFye3N0YXRlfSBtdXN0IGJlIGEKLSAgZGVjb2RlciBzdGF0ZSByZXR1cm5lZCBieSBcbWV0aG9ke2dldHN0YXRlfS4KLSAgXHZlcnNpb25hZGRlZHszLjB9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLQotVGhlIFxjbGFzc3tTdHJlYW1Xcml0ZXJ9IGFuZCBcY2xhc3N7U3RyZWFtUmVhZGVyfSBjbGFzc2VzIHByb3ZpZGUKLWdlbmVyaWMgd29ya2luZyBpbnRlcmZhY2VzIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBuZXcKLWVuY29kaW5nIHN1Ym1vZHVsZXMgdmVyeSBlYXNpbHkuIFNlZSBcbW9kdWxle2VuY29kaW5ncy51dGZfOH0gZm9yIGFuCi1leGFtcGxlIG9mIGhvdyB0aGlzIGlzIGRvbmUuCi0KLQotXHN1YnN1YnNlY3Rpb257U3RyZWFtV3JpdGVyIE9iamVjdHMgXGxhYmVse3N0cmVhbS13cml0ZXItb2JqZWN0c319Ci0KLVRoZSBcY2xhc3N7U3RyZWFtV3JpdGVyfSBjbGFzcyBpcyBhIHN1YmNsYXNzIG9mIFxjbGFzc3tDb2RlY30gYW5kCi1kZWZpbmVzIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyB3aGljaCBldmVyeSBzdHJlYW0gd3JpdGVyIG11c3QgZGVmaW5lIGluCi1vcmRlciB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlIFB5dGhvbiBjb2RlYyByZWdpc3RyeS4KLQotXGJlZ2lue2NsYXNzZGVzY317U3RyZWFtV3JpdGVyfXtzdHJlYW1cb3B0aW9uYWx7LCBlcnJvcnN9fQotICBDb25zdHJ1Y3RvciBmb3IgYSBcY2xhc3N7U3RyZWFtV3JpdGVyfSBpbnN0YW5jZS4gCi0KLSAgQWxsIHN0cmVhbSB3cml0ZXJzIG11c3QgcHJvdmlkZSB0aGlzIGNvbnN0cnVjdG9yIGludGVyZmFjZS4gVGhleSBhcmUKLSAgZnJlZSB0byBhZGQgYWRkaXRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cywgYnV0IG9ubHkgdGhlIG9uZXMgZGVmaW5lZAotICBoZXJlIGFyZSB1c2VkIGJ5IHRoZSBQeXRob24gY29kZWMgcmVnaXN0cnkuCi0KLSAgXHZhcntzdHJlYW19IG11c3QgYmUgYSBmaWxlLWxpa2Ugb2JqZWN0IG9wZW4gZm9yIHdyaXRpbmcgYmluYXJ5Ci0gIGRhdGEuCi0KLSAgVGhlIFxjbGFzc3tTdHJlYW1Xcml0ZXJ9IG1heSBpbXBsZW1lbnQgZGlmZmVyZW50IGVycm9yIGhhbmRsaW5nCi0gIHNjaGVtZXMgYnkgcHJvdmlkaW5nIHRoZSBcdmFye2Vycm9yc30ga2V5d29yZCBhcmd1bWVudC4gVGhlc2UKLSAgcGFyYW1ldGVycyBhcmUgcHJlZGVmaW5lZDoKLQotICBcYmVnaW57aXRlbWl6ZX0KLSAgICBcaXRlbSBcY29kZXsnc3RyaWN0J30gUmFpc2UgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSAob3IgYSBzdWJjbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgaXMgdGhlIGRlZmF1bHQuCi0gICAgXGl0ZW0gXGNvZGV7J2lnbm9yZSd9IElnbm9yZSB0aGUgY2hhcmFjdGVyIGFuZCBjb250aW51ZSB3aXRoIHRoZSBuZXh0LgotICAgIFxpdGVtIFxjb2RleydyZXBsYWNlJ30gUmVwbGFjZSB3aXRoIGEgc3VpdGFibGUgcmVwbGFjZW1lbnQgY2hhcmFjdGVyCi0gICAgXGl0ZW0gXGNvZGV7J3htbGNoYXJyZWZyZXBsYWNlJ30gUmVwbGFjZSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBYTUwKLSAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciByZWZlcmVuY2UKLSAgICBcaXRlbSBcY29kZXsnYmFja3NsYXNocmVwbGFjZSd9IFJlcGxhY2Ugd2l0aCBiYWNrc2xhc2hlZCBlc2NhcGUgc2VxdWVuY2VzLgotICBcZW5ke2l0ZW1pemV9Ci0KLSAgVGhlIFx2YXJ7ZXJyb3JzfSBhcmd1bWVudCB3aWxsIGJlIGFzc2lnbmVkIHRvIGFuIGF0dHJpYnV0ZSBvZiB0aGUKLSAgc2FtZSBuYW1lLiBBc3NpZ25pbmcgdG8gdGhpcyBhdHRyaWJ1dGUgbWFrZXMgaXQgcG9zc2libGUgdG8gc3dpdGNoCi0gIGJldHdlZW4gZGlmZmVyZW50IGVycm9yIGhhbmRsaW5nIHN0cmF0ZWdpZXMgZHVyaW5nIHRoZSBsaWZldGltZQotICBvZiB0aGUgXGNsYXNze1N0cmVhbVdyaXRlcn0gb2JqZWN0LgotCi0gIFRoZSBzZXQgb2YgYWxsb3dlZCB2YWx1ZXMgZm9yIHRoZSBcdmFye2Vycm9yc30gYXJndW1lbnQgY2FuCi0gIGJlIGV4dGVuZGVkIHdpdGggXGZ1bmN0aW9ue3JlZ2lzdGVyX2Vycm9yKCl9LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXt3cml0ZX17b2JqZWN0fQotICBXcml0ZXMgdGhlIG9iamVjdCdzIGNvbnRlbnRzIGVuY29kZWQgdG8gdGhlIHN0cmVhbS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3dyaXRlbGluZXN9e2xpc3R9Ci0gIFdyaXRlcyB0aGUgY29uY2F0ZW5hdGVkIGxpc3Qgb2Ygc3RyaW5ncyB0byB0aGUgc3RyZWFtIChwb3NzaWJseSBieQotICByZXVzaW5nIHRoZSBcbWV0aG9ke3dyaXRlKCl9IG1ldGhvZCkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtyZXNldH17fQotICBGbHVzaGVzIGFuZCByZXNldHMgdGhlIGNvZGVjIGJ1ZmZlcnMgdXNlZCBmb3Iga2VlcGluZyBzdGF0ZS4KLQotICBDYWxsaW5nIHRoaXMgbWV0aG9kIHNob3VsZCBlbnN1cmUgdGhhdCB0aGUgZGF0YSBvbiB0aGUgb3V0cHV0IGlzIHB1dAotICBpbnRvIGEgY2xlYW4gc3RhdGUgdGhhdCBhbGxvd3MgYXBwZW5kaW5nIG9mIG5ldyBmcmVzaCBkYXRhIHdpdGhvdXQKLSAgaGF2aW5nIHRvIHJlc2NhbiB0aGUgd2hvbGUgc3RyZWFtIHRvIHJlY292ZXIgc3RhdGUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLUluIGFkZGl0aW9uIHRvIHRoZSBhYm92ZSBtZXRob2RzLCB0aGUgXGNsYXNze1N0cmVhbVdyaXRlcn0gbXVzdCBhbHNvCi1pbmhlcml0IGFsbCBvdGhlciBtZXRob2RzIGFuZCBhdHRyaWJ1dGVzIGZyb20gdGhlIHVuZGVybHlpbmcgc3RyZWFtLgotCi0KLVxzdWJzdWJzZWN0aW9ue1N0cmVhbVJlYWRlciBPYmplY3RzIFxsYWJlbHtzdHJlYW0tcmVhZGVyLW9iamVjdHN9fQotCi1UaGUgXGNsYXNze1N0cmVhbVJlYWRlcn0gY2xhc3MgaXMgYSBzdWJjbGFzcyBvZiBcY2xhc3N7Q29kZWN9IGFuZAotZGVmaW5lcyB0aGUgZm9sbG93aW5nIG1ldGhvZHMgd2hpY2ggZXZlcnkgc3RyZWFtIHJlYWRlciBtdXN0IGRlZmluZSBpbgotb3JkZXIgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBQeXRob24gY29kZWMgcmVnaXN0cnkuCi0KLVxiZWdpbntjbGFzc2Rlc2N9e1N0cmVhbVJlYWRlcn17c3RyZWFtXG9wdGlvbmFseywgZXJyb3JzfX0KLSAgQ29uc3RydWN0b3IgZm9yIGEgXGNsYXNze1N0cmVhbVJlYWRlcn0gaW5zdGFuY2UuIAotCi0gIEFsbCBzdHJlYW0gcmVhZGVycyBtdXN0IHByb3ZpZGUgdGhpcyBjb25zdHJ1Y3RvciBpbnRlcmZhY2UuIFRoZXkgYXJlCi0gIGZyZWUgdG8gYWRkIGFkZGl0aW9uYWwga2V5d29yZCBhcmd1bWVudHMsIGJ1dCBvbmx5IHRoZSBvbmVzIGRlZmluZWQKLSAgaGVyZSBhcmUgdXNlZCBieSB0aGUgUHl0aG9uIGNvZGVjIHJlZ2lzdHJ5LgotCi0gIFx2YXJ7c3RyZWFtfSBtdXN0IGJlIGEgZmlsZS1saWtlIG9iamVjdCBvcGVuIGZvciByZWFkaW5nIChiaW5hcnkpCi0gIGRhdGEuCi0KLSAgVGhlIFxjbGFzc3tTdHJlYW1SZWFkZXJ9IG1heSBpbXBsZW1lbnQgZGlmZmVyZW50IGVycm9yIGhhbmRsaW5nCi0gIHNjaGVtZXMgYnkgcHJvdmlkaW5nIHRoZSBcdmFye2Vycm9yc30ga2V5d29yZCBhcmd1bWVudC4gVGhlc2UKLSAgcGFyYW1ldGVycyBhcmUgZGVmaW5lZDoKLQotICBcYmVnaW57aXRlbWl6ZX0KLSAgICBcaXRlbSBcY29kZXsnc3RyaWN0J30gUmFpc2UgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSAob3IgYSBzdWJjbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgaXMgdGhlIGRlZmF1bHQuCi0gICAgXGl0ZW0gXGNvZGV7J2lnbm9yZSd9IElnbm9yZSB0aGUgY2hhcmFjdGVyIGFuZCBjb250aW51ZSB3aXRoIHRoZSBuZXh0LgotICAgIFxpdGVtIFxjb2RleydyZXBsYWNlJ30gUmVwbGFjZSB3aXRoIGEgc3VpdGFibGUgcmVwbGFjZW1lbnQgY2hhcmFjdGVyLgotICBcZW5ke2l0ZW1pemV9Ci0KLSAgVGhlIFx2YXJ7ZXJyb3JzfSBhcmd1bWVudCB3aWxsIGJlIGFzc2lnbmVkIHRvIGFuIGF0dHJpYnV0ZSBvZiB0aGUKLSAgc2FtZSBuYW1lLiBBc3NpZ25pbmcgdG8gdGhpcyBhdHRyaWJ1dGUgbWFrZXMgaXQgcG9zc2libGUgdG8gc3dpdGNoCi0gIGJldHdlZW4gZGlmZmVyZW50IGVycm9yIGhhbmRsaW5nIHN0cmF0ZWdpZXMgZHVyaW5nIHRoZSBsaWZldGltZQotICBvZiB0aGUgXGNsYXNze1N0cmVhbVJlYWRlcn0gb2JqZWN0LgotCi0gIFRoZSBzZXQgb2YgYWxsb3dlZCB2YWx1ZXMgZm9yIHRoZSBcdmFye2Vycm9yc30gYXJndW1lbnQgY2FuCi0gIGJlIGV4dGVuZGVkIHdpdGggXGZ1bmN0aW9ue3JlZ2lzdGVyX2Vycm9yKCl9LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtyZWFkfXtcb3B0aW9uYWx7c2l6ZVxvcHRpb25hbHssIGNoYXJzLCBcb3B0aW9uYWx7Zmlyc3RsaW5lfX19fQotICBEZWNvZGVzIGRhdGEgZnJvbSB0aGUgc3RyZWFtIGFuZCByZXR1cm5zIHRoZSByZXN1bHRpbmcgb2JqZWN0LgotCi0gIFx2YXJ7Y2hhcnN9IGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVhZCBmcm9tIHRoZQotICBzdHJlYW0uIFxmdW5jdGlvbntyZWFkKCl9IHdpbGwgbmV2ZXIgcmV0dXJuIG1vcmUgdGhhbiBcdmFye2NoYXJzfQotICBjaGFyYWN0ZXJzLCBidXQgaXQgbWlnaHQgcmV0dXJuIGxlc3MsIGlmIHRoZXJlIGFyZSBub3QgZW5vdWdoCi0gIGNoYXJhY3RlcnMgYXZhaWxhYmxlLgotCi0gIFx2YXJ7c2l6ZX0gaW5kaWNhdGVzIHRoZSBhcHByb3hpbWF0ZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkCi0gIGZyb20gdGhlIHN0cmVhbSBmb3IgZGVjb2RpbmcgcHVycG9zZXMuIFRoZSBkZWNvZGVyIGNhbiBtb2RpZnkgdGhpcwotICBzZXR0aW5nIGFzIGFwcHJvcHJpYXRlLiBUaGUgZGVmYXVsdCB2YWx1ZSAtMSBpbmRpY2F0ZXMgdG8gcmVhZCBhbmQKLSAgZGVjb2RlIGFzIG11Y2ggYXMgcG9zc2libGUuICBcdmFye3NpemV9IGlzIGludGVuZGVkIHRvIHByZXZlbnQgaGF2aW5nCi0gIHRvIGRlY29kZSBodWdlIGZpbGVzIGluIG9uZSBzdGVwLgotCi0gIFx2YXJ7Zmlyc3RsaW5lfSBpbmRpY2F0ZXMgdGhhdCBpdCB3b3VsZCBiZSBzdWZmaWNpZW50IHRvIG9ubHkgcmV0dXJuCi0gIHRoZSBmaXJzdCBsaW5lLCBpZiB0aGVyZSBhcmUgZGVjb2RpbmcgZXJyb3JzIG9uIGxhdGVyIGxpbmVzLgotCi0gIFRoZSBtZXRob2Qgc2hvdWxkIHVzZSBhIGdyZWVkeSByZWFkIHN0cmF0ZWd5IG1lYW5pbmcgdGhhdCBpdCBzaG91bGQKLSAgcmVhZCBhcyBtdWNoIGRhdGEgYXMgaXMgYWxsb3dlZCB3aXRoaW4gdGhlIGRlZmluaXRpb24gb2YgdGhlIGVuY29kaW5nCi0gIGFuZCB0aGUgZ2l2ZW4gc2l6ZSwgZS5nLiAgaWYgb3B0aW9uYWwgZW5jb2RpbmcgZW5kaW5ncyBvciBzdGF0ZQotICBtYXJrZXJzIGFyZSBhdmFpbGFibGUgb24gdGhlIHN0cmVhbSwgdGhlc2Ugc2hvdWxkIGJlIHJlYWQgdG9vLgotCi0gIFx2ZXJzaW9uY2hhbmdlZFtcdmFye2NoYXJzfSBhcmd1bWVudCBhZGRlZF17Mi40fQotICBcdmVyc2lvbmNoYW5nZWRbXHZhcntmaXJzdGxpbmV9IGFyZ3VtZW50IGFkZGVkXXsyLjQuMn0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3JlYWRsaW5lfXtcb3B0aW9uYWx7c2l6ZVxvcHRpb25hbHssIGtlZXBlbmRzfX19Ci0gIFJlYWQgb25lIGxpbmUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtIGFuZCByZXR1cm4gdGhlCi0gIGRlY29kZWQgZGF0YS4KLQotICBcdmFye3NpemV9LCBpZiBnaXZlbiwgaXMgcGFzc2VkIGFzIHNpemUgYXJndW1lbnQgdG8gdGhlIHN0cmVhbSdzCi0gIFxtZXRob2R7cmVhZGxpbmUoKX0gbWV0aG9kLgotCi0gIElmIFx2YXJ7a2VlcGVuZHN9IGlzIGZhbHNlIGxpbmUtZW5kaW5ncyB3aWxsIGJlIHN0cmlwcGVkIGZyb20gdGhlCi0gIGxpbmVzIHJldHVybmVkLgotCi0gIFx2ZXJzaW9uY2hhbmdlZFtcdmFye2tlZXBlbmRzfSBhcmd1bWVudCBhZGRlZF17Mi40fQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317cmVhZGxpbmVzfXtcb3B0aW9uYWx7c2l6ZWhpbnRcb3B0aW9uYWx7LCBrZWVwZW5kc319fQotICBSZWFkIGFsbCBsaW5lcyBhdmFpbGFibGUgb24gdGhlIGlucHV0IHN0cmVhbSBhbmQgcmV0dXJuIHRoZW0gYXMgYSBsaXN0Ci0gIG9mIGxpbmVzLgotCi0gIExpbmUtZW5kaW5ncyBhcmUgaW1wbGVtZW50ZWQgdXNpbmcgdGhlIGNvZGVjJ3MgZGVjb2RlciBtZXRob2QgYW5kIGFyZQotICBpbmNsdWRlZCBpbiB0aGUgbGlzdCBlbnRyaWVzIGlmIFx2YXJ7a2VlcGVuZHN9IGlzIHRydWUuCi0KLSAgXHZhcntzaXplaGludH0sIGlmIGdpdmVuLCBpcyBwYXNzZWQgYXMgdGhlIFx2YXJ7c2l6ZX0gYXJndW1lbnQgdG8gdGhlCi0gIHN0cmVhbSdzIFxtZXRob2R7cmVhZCgpfSBtZXRob2QuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtyZXNldH17fQotICBSZXNldHMgdGhlIGNvZGVjIGJ1ZmZlcnMgdXNlZCBmb3Iga2VlcGluZyBzdGF0ZS4KLQotICBOb3RlIHRoYXQgbm8gc3RyZWFtIHJlcG9zaXRpb25pbmcgc2hvdWxkIHRha2UgcGxhY2UuICBUaGlzIG1ldGhvZCBpcwotICBwcmltYXJpbHkgaW50ZW5kZWQgdG8gYmUgYWJsZSB0byByZWNvdmVyIGZyb20gZGVjb2RpbmcgZXJyb3JzLgotXGVuZHttZXRob2RkZXNjfQotCi1JbiBhZGRpdGlvbiB0byB0aGUgYWJvdmUgbWV0aG9kcywgdGhlIFxjbGFzc3tTdHJlYW1SZWFkZXJ9IG11c3QgYWxzbwotaW5oZXJpdCBhbGwgb3RoZXIgbWV0aG9kcyBhbmQgYXR0cmlidXRlcyBmcm9tIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KLQotVGhlIG5leHQgdHdvIGJhc2UgY2xhc3NlcyBhcmUgaW5jbHVkZWQgZm9yIGNvbnZlbmllbmNlLiBUaGV5IGFyZSBub3QKLW5lZWRlZCBieSB0aGUgY29kZWMgcmVnaXN0cnksIGJ1dCBtYXkgcHJvdmlkZSB1c2VmdWwgaW4gcHJhY3RpY2UuCi0KLQotXHN1YnN1YnNlY3Rpb257U3RyZWFtUmVhZGVyV3JpdGVyIE9iamVjdHMgXGxhYmVse3N0cmVhbS1yZWFkZXItd3JpdGVyfX0KLQotVGhlIFxjbGFzc3tTdHJlYW1SZWFkZXJXcml0ZXJ9IGFsbG93cyB3cmFwcGluZyBzdHJlYW1zIHdoaWNoIHdvcmsgaW4KLWJvdGggcmVhZCBhbmQgd3JpdGUgbW9kZXMuCi0KLVRoZSBkZXNpZ24gaXMgc3VjaCB0aGF0IG9uZSBjYW4gdXNlIHRoZSBmYWN0b3J5IGZ1bmN0aW9ucyByZXR1cm5lZCBieQotdGhlIFxmdW5jdGlvbntsb29rdXAoKX0gZnVuY3Rpb24gdG8gY29uc3RydWN0IHRoZSBpbnN0YW5jZS4KLQotXGJlZ2lue2NsYXNzZGVzY317U3RyZWFtUmVhZGVyV3JpdGVyfXtzdHJlYW0sIFJlYWRlciwgV3JpdGVyLCBlcnJvcnN9Ci0gIENyZWF0ZXMgYSBcY2xhc3N7U3RyZWFtUmVhZGVyV3JpdGVyfSBpbnN0YW5jZS4KLSAgXHZhcntzdHJlYW19IG11c3QgYmUgYSBmaWxlLWxpa2Ugb2JqZWN0LgotICBcdmFye1JlYWRlcn0gYW5kIFx2YXJ7V3JpdGVyfSBtdXN0IGJlIGZhY3RvcnkgZnVuY3Rpb25zIG9yIGNsYXNzZXMKLSAgcHJvdmlkaW5nIHRoZSBcY2xhc3N7U3RyZWFtUmVhZGVyfSBhbmQgXGNsYXNze1N0cmVhbVdyaXRlcn0gaW50ZXJmYWNlCi0gIHJlc3AuCi0gIEVycm9yIGhhbmRsaW5nIGlzIGRvbmUgaW4gdGhlIHNhbWUgd2F5IGFzIGRlZmluZWQgZm9yIHRoZQotICBzdHJlYW0gcmVhZGVycyBhbmQgd3JpdGVycy4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cY2xhc3N7U3RyZWFtUmVhZGVyV3JpdGVyfSBpbnN0YW5jZXMgZGVmaW5lIHRoZSBjb21iaW5lZCBpbnRlcmZhY2VzIG9mCi1cY2xhc3N7U3RyZWFtUmVhZGVyfSBhbmQgXGNsYXNze1N0cmVhbVdyaXRlcn0gY2xhc3Nlcy4gVGhleSBpbmhlcml0Ci1hbGwgb3RoZXIgbWV0aG9kcyBhbmQgYXR0cmlidXRlcyBmcm9tIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KLQotCi1cc3Vic3Vic2VjdGlvbntTdHJlYW1SZWNvZGVyIE9iamVjdHMgXGxhYmVse3N0cmVhbS1yZWNvZGVyLW9iamVjdHN9fQotCi1UaGUgXGNsYXNze1N0cmVhbVJlY29kZXJ9IHByb3ZpZGUgYSBmcm9udGVuZCAtIGJhY2tlbmQgdmlldyBvZgotZW5jb2RpbmcgZGF0YSB3aGljaCBpcyBzb21ldGltZXMgdXNlZnVsIHdoZW4gZGVhbGluZyB3aXRoIGRpZmZlcmVudAotZW5jb2RpbmcgZW52aXJvbm1lbnRzLgotCi1UaGUgZGVzaWduIGlzIHN1Y2ggdGhhdCBvbmUgY2FuIHVzZSB0aGUgZmFjdG9yeSBmdW5jdGlvbnMgcmV0dXJuZWQgYnkKLXRoZSBcZnVuY3Rpb257bG9va3VwKCl9IGZ1bmN0aW9uIHRvIGNvbnN0cnVjdCB0aGUgaW5zdGFuY2UuCi0KLVxiZWdpbntjbGFzc2Rlc2N9e1N0cmVhbVJlY29kZXJ9e3N0cmVhbSwgZW5jb2RlLCBkZWNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkZXIsIFdyaXRlciwgZXJyb3JzfQotICBDcmVhdGVzIGEgXGNsYXNze1N0cmVhbVJlY29kZXJ9IGluc3RhbmNlIHdoaWNoIGltcGxlbWVudHMgYSB0d28td2F5Ci0gIGNvbnZlcnNpb246IFx2YXJ7ZW5jb2RlfSBhbmQgXHZhcntkZWNvZGV9IHdvcmsgb24gdGhlIGZyb250ZW5kICh0aGUKLSAgaW5wdXQgdG8gXG1ldGhvZHtyZWFkKCl9IGFuZCBvdXRwdXQgb2YgXG1ldGhvZHt3cml0ZSgpfSkgd2hpbGUKLSAgXHZhcntSZWFkZXJ9IGFuZCBcdmFye1dyaXRlcn0gd29yayBvbiB0aGUgYmFja2VuZCAocmVhZGluZyBhbmQKLSAgd3JpdGluZyB0byB0aGUgc3RyZWFtKS4KLQotICBZb3UgY2FuIHVzZSB0aGVzZSBvYmplY3RzIHRvIGRvIHRyYW5zcGFyZW50IGRpcmVjdCByZWNvZGluZ3MgZnJvbQotICBlLmcuXCBMYXRpbi0xIHRvIFVURi04IGFuZCBiYWNrLgotCi0gIFx2YXJ7c3RyZWFtfSBtdXN0IGJlIGEgZmlsZS1saWtlIG9iamVjdC4KLQotICBcdmFye2VuY29kZX0sIFx2YXJ7ZGVjb2RlfSBtdXN0IGFkaGVyZSB0byB0aGUgXGNsYXNze0NvZGVjfQotICBpbnRlcmZhY2UuIFx2YXJ7UmVhZGVyfSwgXHZhcntXcml0ZXJ9IG11c3QgYmUgZmFjdG9yeSBmdW5jdGlvbnMgb3IKLSAgY2xhc3NlcyBwcm92aWRpbmcgb2JqZWN0cyBvZiB0aGUgXGNsYXNze1N0cmVhbVJlYWRlcn0gYW5kCi0gIFxjbGFzc3tTdHJlYW1Xcml0ZXJ9IGludGVyZmFjZSByZXNwZWN0aXZlbHkuCi0KLSAgXHZhcntlbmNvZGV9IGFuZCBcdmFye2RlY29kZX0gYXJlIG5lZWRlZCBmb3IgdGhlIGZyb250ZW5kCi0gIHRyYW5zbGF0aW9uLCBcdmFye1JlYWRlcn0gYW5kIFx2YXJ7V3JpdGVyfSBmb3IgdGhlIGJhY2tlbmQKLSAgdHJhbnNsYXRpb24uICBUaGUgaW50ZXJtZWRpYXRlIGZvcm1hdCB1c2VkIGlzIGRldGVybWluZWQgYnkgdGhlIHR3bwotICBzZXRzIG9mIGNvZGVjcywgZS5nLiB0aGUgVW5pY29kZSBjb2RlY3Mgd2lsbCB1c2UgVW5pY29kZSBhcyB0aGUKLSAgaW50ZXJtZWRpYXRlIGVuY29kaW5nLgotCi0gIEVycm9yIGhhbmRsaW5nIGlzIGRvbmUgaW4gdGhlIHNhbWUgd2F5IGFzIGRlZmluZWQgZm9yIHRoZQotICBzdHJlYW0gcmVhZGVycyBhbmQgd3JpdGVycy4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cY2xhc3N7U3RyZWFtUmVjb2Rlcn0gaW5zdGFuY2VzIGRlZmluZSB0aGUgY29tYmluZWQgaW50ZXJmYWNlcyBvZgotXGNsYXNze1N0cmVhbVJlYWRlcn0gYW5kIFxjbGFzc3tTdHJlYW1Xcml0ZXJ9IGNsYXNzZXMuIFRoZXkgaW5oZXJpdAotYWxsIG90aGVyIG1ldGhvZHMgYW5kIGF0dHJpYnV0ZXMgZnJvbSB0aGUgdW5kZXJseWluZyBzdHJlYW0uCi0KLVxzdWJzZWN0aW9ue0VuY29kaW5ncyBhbmQgVW5pY29kZVxsYWJlbHtlbmNvZGluZ3Mtb3ZlcnZpZXd9fQotCi1Vbmljb2RlIHN0cmluZ3MgYXJlIHN0b3JlZCBpbnRlcm5hbGx5IGFzIHNlcXVlbmNlcyBvZiBjb2RlcG9pbnRzICh0bwotYmUgcHJlY2lzZSBhcyBcY3R5cGV7UHlfVU5JQ09ERX0gYXJyYXlzKS4gRGVwZW5kaW5nIG9uIHRoZSB3YXkgUHl0aG9uIGlzCi1jb21waWxlZCAoZWl0aGVyIHZpYSBcbG9uZ3Byb2dyYW1vcHR7ZW5hYmxlLXVuaWNvZGU9dWNzMn0gb3IgCi1cbG9uZ3Byb2dyYW1vcHR7ZW5hYmxlLXVuaWNvZGU9dWNzNH0sIHdpdGggdGhlIGZvcm1lciBiZWluZyB0aGUgZGVmYXVsdCkKLVxjdHlwZXtQeV9VTklDT0RFfSBpcyBlaXRoZXIgYSAxNi1iaXQgb3IKLTMyLWJpdCBkYXRhIHR5cGUuIE9uY2UgYSBVbmljb2RlIG9iamVjdCBpcyB1c2VkIG91dHNpZGUgb2YgQ1BVIGFuZAotbWVtb3J5LCBDUFUgZW5kaWFubmVzcyBhbmQgaG93IHRoZXNlIGFycmF5cyBhcmUgc3RvcmVkIGFzIGJ5dGVzIGJlY29tZQotYW4gaXNzdWUuIFRyYW5zZm9ybWluZyBhIHVuaWNvZGUgb2JqZWN0IGludG8gYSBzZXF1ZW5jZSBvZiBieXRlcyBpcwotY2FsbGVkIGVuY29kaW5nIGFuZCByZWNyZWF0aW5nIHRoZSB1bmljb2RlIG9iamVjdCBmcm9tIHRoZSBzZXF1ZW5jZSBvZgotYnl0ZXMgaXMga25vd24gYXMgZGVjb2RpbmcuIFRoZXJlIGFyZSBtYW55IGRpZmZlcmVudCBtZXRob2RzIGZvciBob3cgdGhpcwotdHJhbnNmb3JtYXRpb24gY2FuIGJlIGRvbmUgKHRoZXNlIG1ldGhvZHMgYXJlIGFsc28gY2FsbGVkIGVuY29kaW5ncykuCi1UaGUgc2ltcGxlc3QgbWV0aG9kIGlzIHRvIG1hcCB0aGUgY29kZXBvaW50cyAwLTI1NSB0byB0aGUgYnl0ZXMKLVxjb2RlezB4MH0tXGNvZGV7MHhmZn0uIFRoaXMgbWVhbnMgdGhhdCBhIHVuaWNvZGUgb2JqZWN0IHRoYXQgY29udGFpbnMgCi1jb2RlcG9pbnRzIGFib3ZlIFxjb2Rle1UrMDBGRn0gY2FuJ3QgYmUgZW5jb2RlZCB3aXRoIHRoaXMgbWV0aG9kICh3aGljaCAKLWlzIGNhbGxlZCBcY29kZXsnbGF0aW4tMSd9IG9yIFxjb2Rleydpc28tODg1OS0xJ30pLgotXGZ1bmN0aW9ue3VuaWNvZGUuZW5jb2RlKCl9IHdpbGwgcmFpc2UgYSBcZXhjZXB0aW9ue1VuaWNvZGVFbmNvZGVFcnJvcn0KLXRoYXQgbG9va3MgbGlrZSB0aGlzOiBcc2FtcHtVbmljb2RlRW5jb2RlRXJyb3I6ICdsYXRpbi0xJyBjb2RlYyBjYW4ndAotZW5jb2RlIGNoYXJhY3RlciB1J1xlIHUxMjM0JyBpbiBwb3NpdGlvbiAzOiBvcmRpbmFsIG5vdCBpbiByYW5nZSgyNTYpfS4KLQotVGhlcmUncyBhbm90aGVyIGdyb3VwIG9mIGVuY29kaW5ncyAodGhlIHNvIGNhbGxlZCBjaGFybWFwIGVuY29kaW5ncykKLXRoYXQgY2hvb3NlIGEgZGlmZmVyZW50IHN1YnNldCBvZiBhbGwgdW5pY29kZSBjb2RlIHBvaW50cyBhbmQgaG93Ci10aGVzZSBjb2RlcG9pbnRzIGFyZSBtYXBwZWQgdG8gdGhlIGJ5dGVzIFxjb2RlezB4MH0tXGNvZGV7MHhmZi59Ci1UbyBzZWUgaG93IHRoaXMgaXMgZG9uZSBzaW1wbHkgb3BlbiBlLmcuIFxmaWxle2VuY29kaW5ncy9jcDEyNTIucHl9Ci0od2hpY2ggaXMgYW4gZW5jb2RpbmcgdGhhdCBpcyB1c2VkIHByaW1hcmlseSBvbiBXaW5kb3dzKS4KLVRoZXJlJ3MgYSBzdHJpbmcgY29uc3RhbnQgd2l0aCAyNTYgY2hhcmFjdGVycyB0aGF0IHNob3dzIHlvdSB3aGljaCAKLWNoYXJhY3RlciBpcyBtYXBwZWQgdG8gd2hpY2ggYnl0ZSB2YWx1ZS4KLQotQWxsIG9mIHRoZXNlIGVuY29kaW5ncyBjYW4gb25seSBlbmNvZGUgMjU2IG9mIHRoZSA2NTUzNiAob3IgMTExNDExMSkKLWNvZGVwb2ludHMgZGVmaW5lZCBpbiB1bmljb2RlLiBBIHNpbXBsZSBhbmQgc3RyYWlnaHRmb3J3YXJkIHdheSB0aGF0Ci1jYW4gc3RvcmUgZWFjaCBVbmljb2RlIGNvZGUgcG9pbnQsIGlzIHRvIHN0b3JlIGVhY2ggY29kZXBvaW50IGFzIHR3bwotY29uc2VjdXRpdmUgYnl0ZXMuIFRoZXJlIGFyZSB0d28gcG9zc2liaWxpdGllczogU3RvcmUgdGhlIGJ5dGVzIGluIGJpZwotZW5kaWFuIG9yIGluIGxpdHRsZSBlbmRpYW4gb3JkZXIuIFRoZXNlIHR3byBlbmNvZGluZ3MgYXJlIGNhbGxlZAotVVRGLTE2LUJFIGFuZCBVVEYtMTYtTEUgcmVzcGVjdGl2ZWx5LiBUaGVpciBkaXNhZHZhbnRhZ2UgaXMgdGhhdCBpZgotZS5nLiB5b3UgdXNlIFVURi0xNi1CRSBvbiBhIGxpdHRsZSBlbmRpYW4gbWFjaGluZSB5b3Ugd2lsbCBhbHdheXMgaGF2ZQotdG8gc3dhcCBieXRlcyBvbiBlbmNvZGluZyBhbmQgZGVjb2RpbmcuIFVURi0xNiBhdm9pZHMgdGhpcyBwcm9ibGVtOgotQnl0ZXMgd2lsbCBhbHdheXMgYmUgaW4gbmF0dXJhbCBlbmRpYW5uZXNzLiBXaGVuIHRoZXNlIGJ5dGVzIGFyZSByZWFkCi1ieSBhIENQVSB3aXRoIGEgZGlmZmVyZW50IGVuZGlhbm5lc3MsIHRoZW4gYnl0ZXMgaGF2ZSB0byBiZSBzd2FwcGVkCi10aG91Z2guIFRvIGJlIGFibGUgdG8gZGV0ZWN0IHRoZSBlbmRpYW5uZXNzIG9mIGEgVVRGLTE2IGJ5dGUgc2VxdWVuY2UsCi10aGVyZSdzIHRoZSBzbyBjYWxsZWQgQk9NICh0aGUgIkJ5dGUgT3JkZXIgTWFyayIpLiBUaGlzIGlzIHRoZSBVbmljb2RlCi1jaGFyYWN0ZXIgXGNvZGV7VStGRUZGfS4gVGhpcyBjaGFyYWN0ZXIgd2lsbCBiZSBwcmVwZW5kZWQgdG8gZXZlcnkgVVRGLTE2Ci1ieXRlIHNlcXVlbmNlLiBUaGUgYnl0ZSBzd2FwcGVkIHZlcnNpb24gb2YgdGhpcyBjaGFyYWN0ZXIgKFxjb2RlezB4RkZGRX0pIGlzCi1hbiBpbGxlZ2FsIGNoYXJhY3RlciB0aGF0IG1heSBub3QgYXBwZWFyIGluIGEgVW5pY29kZSB0ZXh0LiBTbyB3aGVuCi10aGUgZmlyc3QgY2hhcmFjdGVyIGluIGFuIFVURi0xNiBieXRlIHNlcXVlbmNlIGFwcGVhcnMgdG8gYmUgYSBcY29kZXtVK0ZGRkV9Ci10aGUgYnl0ZXMgaGF2ZSB0byBiZSBzd2FwcGVkIG9uIGRlY29kaW5nLiBVbmZvcnR1bmF0ZWx5IHVwdG8gVW5pY29kZQotNC4wIHRoZSBjaGFyYWN0ZXIgXGNvZGV7VStGRUZGfSBoYWQgYSBzZWNvbmQgcHVycG9zZSBhcyBhIFxzYW1we1pFUk8gV0lEVEgKLU5PLUJSRUFLIFNQQUNFfTogQSBjaGFyYWN0ZXIgdGhhdCBoYXMgbm8gd2lkdGggYW5kIGRvZXNuJ3QgYWxsb3cgYQotd29yZCB0byBiZSBzcGxpdC4gSXQgY2FuIGUuZy4gYmUgdXNlZCB0byBnaXZlIGhpbnRzIHRvIGEgbGlnYXR1cmUKLWFsZ29yaXRobS4gV2l0aCBVbmljb2RlIDQuMCB1c2luZyBcY29kZXtVK0ZFRkZ9IGFzIGEgXHNhbXB7WkVSTyBXSURUSCBOTy1CUkVBSwotU1BBQ0V9IGhhcyBiZWVuIGRlcHJlY2F0ZWQgKHdpdGggXGNvZGV7VSsyMDYwfSAoXHNhbXB7V09SRCBKT0lORVJ9KSBhc3N1bWluZwotdGhpcyByb2xlKS4gTmV2ZXJ0aGVsZXNzIFVuaWNvZGUgc29mdHdhcmUgc3RpbGwgbXVzdCBiZSBhYmxlIHRvIGhhbmRsZQotXGNvZGV7VStGRUZGfSBpbiBib3RoIHJvbGVzOiBBcyBhIEJPTSBpdCdzIGEgZGV2aWNlIHRvIGRldGVybWluZSB0aGUgc3RvcmFnZQotbGF5b3V0IG9mIHRoZSBlbmNvZGVkIGJ5dGVzLCBhbmQgdmFuaXNoZXMgb25jZSB0aGUgYnl0ZSBzZXF1ZW5jZSBoYXMKLWJlZW4gZGVjb2RlZCBpbnRvIGEgVW5pY29kZSBzdHJpbmc7IGFzIGEgXHNhbXB7WkVSTyBXSURUSCBOTy1CUkVBSyBTUEFDRX0KLWl0J3MgYSBub3JtYWwgY2hhcmFjdGVyIHRoYXQgd2lsbCBiZSBkZWNvZGVkIGxpa2UgYW55IG90aGVyLgotCi1UaGVyZSdzIGFub3RoZXIgZW5jb2RpbmcgdGhhdCBpcyBhYmxlIHRvIGVuY29kaW5nIHRoZSBmdWxsIHJhbmdlIG9mCi1Vbmljb2RlIGNoYXJhY3RlcnM6IFVURi04LiBVVEYtOCBpcyBhbiA4LWJpdCBlbmNvZGluZywgd2hpY2ggbWVhbnMKLXRoZXJlIGFyZSBubyBpc3N1ZXMgd2l0aCBieXRlIG9yZGVyIGluIFVURi04LiBFYWNoIGJ5dGUgaW4gYSBVVEYtOAotYnl0ZSBzZXF1ZW5jZSBjb25zaXN0cyBvZiB0d28gcGFydHM6IE1hcmtlciBiaXRzICh0aGUgbW9zdCBzaWduaWZpY2FudAotYml0cykgYW5kIHBheWxvYWQgYml0cy4gVGhlIG1hcmtlciBiaXRzIGFyZSBhIHNlcXVlbmNlIG9mIHplcm8gdG8gc2l4Ci0xIGJpdHMgZm9sbG93ZWQgYnkgYSAwIGJpdC4gVW5pY29kZSBjaGFyYWN0ZXJzIGFyZSBlbmNvZGVkIGxpa2UgdGhpcwotKHdpdGggeCBiZWluZyBwYXlsb2FkIGJpdHMsIHdoaWNoIHdoZW4gY29uY2F0ZW5hdGVkIGdpdmUgdGhlIFVuaWNvZGUKLWNoYXJhY3Rlcik6Ci0KLVxiZWdpbnt0YWJsZWlpfXtsfGx9e3RleHRybX17UmFuZ2V9e0VuY29kaW5nfQotXGxpbmVpaXtcY29kZXtVLTAwMDAwMDAwfSAuLi4gXGNvZGV7VS0wMDAwMDA3Rn19ezB4eHh4eHh4fQotXGxpbmVpaXtcY29kZXtVLTAwMDAwMDgwfSAuLi4gXGNvZGV7VS0wMDAwMDdGRn19ezExMHh4eHh4IDEweHh4eHh4fQotXGxpbmVpaXtcY29kZXtVLTAwMDAwODAwfSAuLi4gXGNvZGV7VS0wMDAwRkZGRn19ezExMTB4eHh4IDEweHh4eHh4IDEweHh4eHh4fQotXGxpbmVpaXtcY29kZXtVLTAwMDEwMDAwfSAuLi4gXGNvZGV7VS0wMDFGRkZGRn19ezExMTEweHh4IDEweHh4eHh4IDEweHh4eHh4IDEweHh4eHh4fQotXGxpbmVpaXtcY29kZXtVLTAwMjAwMDAwfSAuLi4gXGNvZGV7VS0wM0ZGRkZGRn19ezExMTExMHh4IDEweHh4eHh4IDEweHh4eHh4IDEweHh4eHh4IDEweHh4eHh4fQotXGxpbmVpaXtcY29kZXtVLTA0MDAwMDAwfSAuLi4gXGNvZGV7VS03RkZGRkZGRn19ezExMTExMTB4IDEweHh4eHh4IDEweHh4eHh4IDEweHh4eHh4IDEweHh4eHh4IDEweHh4eHh4fQotXGVuZHt0YWJsZWlpfQotCi1UaGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHRoZSBVbmljb2RlIGNoYXJhY3RlciBpcyB0aGUgcmlnaHRtb3N0IHgKLWJpdC4KLQotQXMgVVRGLTggaXMgYW4gOC1iaXQgZW5jb2Rpbmcgbm8gQk9NIGlzIHJlcXVpcmVkIGFuZCBhbnkgXGNvZGV7VStGRUZGfQotY2hhcmFjdGVyIGluIHRoZSBkZWNvZGVkIFVuaWNvZGUgc3RyaW5nIChldmVuIGlmIGl0J3MgdGhlIGZpcnN0Ci1jaGFyYWN0ZXIpIGlzIHRyZWF0ZWQgYXMgYSBcc2FtcHtaRVJPIFdJRFRIIE5PLUJSRUFLIFNQQUNFfS4KLQotV2l0aG91dCBleHRlcm5hbCBpbmZvcm1hdGlvbiBpdCdzIGltcG9zc2libGUgdG8gcmVsaWFibHkgZGV0ZXJtaW5lCi13aGljaCBlbmNvZGluZyB3YXMgdXNlZCBmb3IgZW5jb2RpbmcgYSBVbmljb2RlIHN0cmluZy4gRWFjaCBjaGFybWFwCi1lbmNvZGluZyBjYW4gZGVjb2RlIGFueSByYW5kb20gYnl0ZSBzZXF1ZW5jZS4gSG93ZXZlciB0aGF0J3Mgbm90Ci1wb3NzaWJsZSB3aXRoIFVURi04LCBhcyBVVEYtOCBieXRlIHNlcXVlbmNlcyBoYXZlIGEgc3RydWN0dXJlIHRoYXQKLWRvZXNuJ3QgYWxsb3cgYXJiaXRyYXJ5IGJ5dGUgc2VxdWVuY2UuIFRvIGluY3JlYXNlIHRoZSByZWxpYWJpbGl0eQotd2l0aCB3aGljaCBhIFVURi04IGVuY29kaW5nIGNhbiBiZSBkZXRlY3RlZCwgTWljcm9zb2Z0IGludmVudGVkIGEKLXZhcmlhbnQgb2YgVVRGLTggKHRoYXQgUHl0aG9uIDIuNSBjYWxscyBcY29kZXsidXRmLTgtc2lnIn0pIGZvciBpdHMgTm90ZXBhZAotcHJvZ3JhbTogQmVmb3JlIGFueSBvZiB0aGUgVW5pY29kZSBjaGFyYWN0ZXJzIGlzIHdyaXR0ZW4gdG8gdGhlIGZpbGUsCi1hIFVURi04IGVuY29kZWQgQk9NICh3aGljaCBsb29rcyBsaWtlIHRoaXMgYXMgYSBieXRlIHNlcXVlbmNlOiBcY29kZXsweGVmfSwKLVxjb2RlezB4YmJ9LCBcY29kZXsweGJmfSkgaXMgd3JpdHRlbi4gQXMgaXQncyByYXRoZXIgaW1wcm9iYWJsZSB0aGF0IGFueQotY2hhcm1hcCBlbmNvZGVkIGZpbGUgc3RhcnRzIHdpdGggdGhlc2UgYnl0ZSB2YWx1ZXMgKHdoaWNoIHdvdWxkIGUuZy4gbWFwIHRvCi0KLSAgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTIFxcCi0gICBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksgXFwKLSAgIElOVkVSVEVEIFFVRVNUSU9OIE1BUksKLQotaW4gaXNvLTg4NTktMSksIHRoaXMgaW5jcmVhc2VzIHRoZSBwcm9iYWJpbGl0eSB0aGF0IGEgdXRmLTgtc2lnCi1lbmNvZGluZyBjYW4gYmUgY29ycmVjdGx5IGd1ZXNzZWQgZnJvbSB0aGUgYnl0ZSBzZXF1ZW5jZS4gU28gaGVyZSB0aGUKLUJPTSBpcyBub3QgdXNlZCB0byBiZSBhYmxlIHRvIGRldGVybWluZSB0aGUgYnl0ZSBvcmRlciB1c2VkIGZvcgotZ2VuZXJhdGluZyB0aGUgYnl0ZSBzZXF1ZW5jZSwgYnV0IGFzIGEgc2lnbmF0dXJlIHRoYXQgaGVscHMgaW4KLWd1ZXNzaW5nIHRoZSBlbmNvZGluZy4gT24gZW5jb2RpbmcgdGhlIHV0Zi04LXNpZyBjb2RlYyB3aWxsIHdyaXRlCi1cY29kZXsweGVmfSwgXGNvZGV7MHhiYn0sIFxjb2RlezB4YmZ9IGFzIHRoZSBmaXJzdCB0aHJlZSBieXRlcyB0byB0aGUgZmlsZS4KLU9uIGRlY29kaW5nIHV0Zi04LXNpZyB3aWxsIHNraXAgdGhvc2UgdGhyZWUgYnl0ZXMgaWYgdGhleSBhcHBlYXIgYXMgdGhlCi1maXJzdCB0aHJlZSBieXRlcyBpbiB0aGUgZmlsZS4KLQotCi1cc3Vic2VjdGlvbntTdGFuZGFyZCBFbmNvZGluZ3NcbGFiZWx7c3RhbmRhcmQtZW5jb2RpbmdzfX0KLQotUHl0aG9uIGNvbWVzIHdpdGggYSBudW1iZXIgb2YgY29kZWNzIGJ1aWx0LWluLCBlaXRoZXIgaW1wbGVtZW50ZWQgYXMgQwotZnVuY3Rpb25zIG9yIHdpdGggZGljdGlvbmFyaWVzIGFzIG1hcHBpbmcgdGFibGVzLiBUaGUgZm9sbG93aW5nIHRhYmxlCi1saXN0cyB0aGUgY29kZWNzIGJ5IG5hbWUsIHRvZ2V0aGVyIHdpdGggYSBmZXcgY29tbW9uIGFsaWFzZXMsIGFuZCB0aGUKLWxhbmd1YWdlcyBmb3Igd2hpY2ggdGhlIGVuY29kaW5nIGlzIGxpa2VseSB1c2VkLiBOZWl0aGVyIHRoZSBsaXN0IG9mCi1hbGlhc2VzIG5vciB0aGUgbGlzdCBvZiBsYW5ndWFnZXMgaXMgbWVhbnQgdG8gYmUgZXhoYXVzdGl2ZS4gTm90aWNlCi10aGF0IHNwZWxsaW5nIGFsdGVybmF0aXZlcyB0aGF0IG9ubHkgZGlmZmVyIGluIGNhc2Ugb3IgdXNlIGEgaHlwaGVuCi1pbnN0ZWFkIG9mIGFuIHVuZGVyc2NvcmUgYXJlIGFsc28gdmFsaWQgYWxpYXNlcy4KLQotTWFueSBvZiB0aGUgY2hhcmFjdGVyIHNldHMgc3VwcG9ydCB0aGUgc2FtZSBsYW5ndWFnZXMuIFRoZXkgdmFyeSBpbgotaW5kaXZpZHVhbCBjaGFyYWN0ZXJzIChlLmcuIHdoZXRoZXIgdGhlIEVVUk8gU0lHTiBpcyBzdXBwb3J0ZWQgb3IKLW5vdCksIGFuZCBpbiB0aGUgYXNzaWdubWVudCBvZiBjaGFyYWN0ZXJzIHRvIGNvZGUgcG9zaXRpb25zLiBGb3IgdGhlCi1FdXJvcGVhbiBsYW5ndWFnZXMgaW4gcGFydGljdWxhciwgdGhlIGZvbGxvd2luZyB2YXJpYW50cyB0eXBpY2FsbHkKLWV4aXN0OgotCi1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtIGFuIElTTyA4ODU5IGNvZGVzZXQKLVxpdGVtIGEgTWljcm9zb2Z0IFdpbmRvd3MgY29kZSBwYWdlLCB3aGljaCBpcyB0eXBpY2FsbHkgZGVyaXZlZCBmcm9tCi0gICAgICBhIDg4NTkgY29kZXNldCwgYnV0IHJlcGxhY2VzIGNvbnRyb2wgY2hhcmFjdGVycyB3aXRoIGFkZGl0aW9uYWwKLSAgICAgIGdyYXBoaWMgY2hhcmFjdGVycwotXGl0ZW0gYW4gSUJNIEVCQ0RJQyBjb2RlIHBhZ2UKLVxpdGVtIGFuIElCTSBQQyBjb2RlIHBhZ2UsIHdoaWNoIGlzIFxBU0NJSXt9IGNvbXBhdGlibGUKLVxlbmR7aXRlbWl6ZX0KLQotXGJlZ2lue2xvbmd0YWJsZWlpaX17bHxsfGx9e3RleHRybX17Q29kZWN9e0FsaWFzZXN9e0xhbmd1YWdlc30KLQotXGxpbmVpaWl7YXNjaWl9Ci0gICAgICAgIHs2NDYsIHVzLWFzY2lpfQotICAgICAgICB7RW5nbGlzaH0KLQotXGxpbmVpaWl7YmlnNX0KLSAgICAgICAge2JpZzUtdHcsIGNzYmlnNX0KLSAgICAgICAge1RyYWRpdGlvbmFsIENoaW5lc2V9Ci0KLVxsaW5laWlpe2JpZzVoa3Njc30KLSAgICAgICAge2JpZzUtaGtzY3MsIGhrc2NzfQotICAgICAgICB7VHJhZGl0aW9uYWwgQ2hpbmVzZX0KLQotXGxpbmVpaWl7Y3AwMzd9Ci0gICAgICAgIHtJQk0wMzcsIElCTTAzOX0KLSAgICAgICAge0VuZ2xpc2h9Ci0KLVxsaW5laWlpe2NwNDI0fQotICAgICAgICB7RUJDRElDLUNQLUhFLCBJQk00MjR9Ci0gICAgICAgIHtIZWJyZXd9Ci0KLVxsaW5laWlpe2NwNDM3fQotICAgICAgICB7NDM3LCBJQk00Mzd9Ci0gICAgICAgIHtFbmdsaXNofQotCi1cbGluZWlpaXtjcDUwMH0KLSAgICAgICAge0VCQ0RJQy1DUC1CRSwgRUJDRElDLUNQLUNILCBJQk01MDB9Ci0gICAgICAgIHtXZXN0ZXJuIEV1cm9wZX0KLQotXGxpbmVpaWl7Y3A3Mzd9Ci0gICAgICAgIHt9Ci0gICAgICAgIHtHcmVla30KLQotXGxpbmVpaWl7Y3A3NzV9Ci0gICAgICAgIHtJQk03NzV9Ci0gICAgICAgIHtCYWx0aWMgbGFuZ3VhZ2VzfQotCi1cbGluZWlpaXtjcDg1MH0KLSAgICAgICAgezg1MCwgSUJNODUwfQotICAgICAgICB7V2VzdGVybiBFdXJvcGV9Ci0KLVxsaW5laWlpe2NwODUyfQotICAgICAgICB7ODUyLCBJQk04NTJ9Ci0gICAgICAgIHtDZW50cmFsIGFuZCBFYXN0ZXJuIEV1cm9wZX0KLQotXGxpbmVpaWl7Y3A4NTV9Ci0gICAgICAgIHs4NTUsIElCTTg1NX0KLSAgICAgICAge0J1bGdhcmlhbiwgQnllbG9ydXNzaWFuLCBNYWNlZG9uaWFuLCBSdXNzaWFuLCBTZXJiaWFufQotCi1cbGluZWlpaXtjcDg1Nn0KLSAgICAgICAge30KLSAgICAgICAge0hlYnJld30KLQotXGxpbmVpaWl7Y3A4NTd9Ci0gICAgICAgIHs4NTcsIElCTTg1N30KLSAgICAgICAge1R1cmtpc2h9Ci0KLVxsaW5laWlpe2NwODYwfQotICAgICAgICB7ODYwLCBJQk04NjB9Ci0gICAgICAgIHtQb3J0dWd1ZXNlfQotCi1cbGluZWlpaXtjcDg2MX0KLSAgICAgICAgezg2MSwgQ1AtSVMsIElCTTg2MX0KLSAgICAgICAge0ljZWxhbmRpY30KLQotXGxpbmVpaWl7Y3A4NjJ9Ci0gICAgICAgIHs4NjIsIElCTTg2Mn0KLSAgICAgICAge0hlYnJld30KLQotXGxpbmVpaWl7Y3A4NjN9Ci0gICAgICAgIHs4NjMsIElCTTg2M30KLSAgICAgICAge0NhbmFkaWFufQotCi1cbGluZWlpaXtjcDg2NH0KLSAgICAgICAge0lCTTg2NH0KLSAgICAgICAge0FyYWJpY30KLQotXGxpbmVpaWl7Y3A4NjV9Ci0gICAgICAgIHs4NjUsIElCTTg2NX0KLSAgICAgICAge0RhbmlzaCwgTm9yd2VnaWFufQotCi1cbGluZWlpaXtjcDg2Nn0KLSAgICAgICAgezg2NiwgSUJNODY2fQotICAgICAgICB7UnVzc2lhbn0KLQotXGxpbmVpaWl7Y3A4Njl9Ci0gICAgICAgIHs4NjksIENQLUdSLCBJQk04Njl9Ci0gICAgICAgIHtHcmVla30KLQotXGxpbmVpaWl7Y3A4NzR9Ci0gICAgICAgIHt9Ci0gICAgICAgIHtUaGFpfQotCi1cbGluZWlpaXtjcDg3NX0KLSAgICAgICAge30KLSAgICAgICAge0dyZWVrfQotCi1cbGluZWlpaXtjcDkzMn0KLSAgICAgICAgezkzMiwgbXM5MzIsIG1za2FuamksIG1zLWthbmppfQotICAgICAgICB7SmFwYW5lc2V9Ci0KLVxsaW5laWlpe2NwOTQ5fQotICAgICAgICB7OTQ5LCBtczk0OSwgdWhjfQotICAgICAgICB7S29yZWFufQotCi1cbGluZWlpaXtjcDk1MH0KLSAgICAgICAgezk1MCwgbXM5NTB9Ci0gICAgICAgIHtUcmFkaXRpb25hbCBDaGluZXNlfQotCi1cbGluZWlpaXtjcDEwMDZ9Ci0gICAgICAgIHt9Ci0gICAgICAgIHtVcmR1fQotCi1cbGluZWlpaXtjcDEwMjZ9Ci0gICAgICAgIHtpYm0xMDI2fQotICAgICAgICB7VHVya2lzaH0KLQotXGxpbmVpaWl7Y3AxMTQwfQotICAgICAgICB7aWJtMTE0MH0KLSAgICAgICAge1dlc3Rlcm4gRXVyb3BlfQotCi1cbGluZWlpaXtjcDEyNTB9Ci0gICAgICAgIHt3aW5kb3dzLTEyNTB9Ci0gICAgICAgIHtDZW50cmFsIGFuZCBFYXN0ZXJuIEV1cm9wZX0KLQotXGxpbmVpaWl7Y3AxMjUxfQotICAgICAgICB7d2luZG93cy0xMjUxfQotICAgICAgICB7QnVsZ2FyaWFuLCBCeWVsb3J1c3NpYW4sIE1hY2Vkb25pYW4sIFJ1c3NpYW4sIFNlcmJpYW59Ci0KLVxsaW5laWlpe2NwMTI1Mn0KLSAgICAgICAge3dpbmRvd3MtMTI1Mn0KLSAgICAgICAge1dlc3Rlcm4gRXVyb3BlfQotCi1cbGluZWlpaXtjcDEyNTN9Ci0gICAgICAgIHt3aW5kb3dzLTEyNTN9Ci0gICAgICAgIHtHcmVla30KLQotXGxpbmVpaWl7Y3AxMjU0fQotICAgICAgICB7d2luZG93cy0xMjU0fQotICAgICAgICB7VHVya2lzaH0KLQotXGxpbmVpaWl7Y3AxMjU1fQotICAgICAgICB7d2luZG93cy0xMjU1fQotICAgICAgICB7SGVicmV3fQotCi1cbGluZWlpaXtjcDEyNTZ9Ci0gICAgICAgIHt3aW5kb3dzMTI1Nn0KLSAgICAgICAge0FyYWJpY30KLQotXGxpbmVpaWl7Y3AxMjU3fQotICAgICAgICB7d2luZG93cy0xMjU3fQotICAgICAgICB7QmFsdGljIGxhbmd1YWdlc30KLQotXGxpbmVpaWl7Y3AxMjU4fQotICAgICAgICB7d2luZG93cy0xMjU4fQotICAgICAgICB7VmlldG5hbWVzZX0KLQotXGxpbmVpaWl7ZXVjX2pwfQotICAgICAgICB7ZXVjanAsIHVqaXMsIHUtamlzfQotICAgICAgICB7SmFwYW5lc2V9Ci0KLVxsaW5laWlpe2V1Y19qaXNfMjAwNH0KLSAgICAgICAge2ppc3gwMjEzLCBldWNqaXMyMDA0fQotICAgICAgICB7SmFwYW5lc2V9Ci0KLVxsaW5laWlpe2V1Y19qaXN4MDIxM30KLSAgICAgICAge2V1Y2ppc3gwMjEzfQotICAgICAgICB7SmFwYW5lc2V9Ci0KLVxsaW5laWlpe2V1Y19rcn0KLSAgICAgICAge2V1Y2tyLCBrb3JlYW4sIGtzYzU2MDEsIGtzX2MtNTYwMSwga3NfYy01NjAxLTE5ODcsIGtzeDEwMDEsIGtzX3gtMTAwMX0KLSAgICAgICAge0tvcmVhbn0KLQotXGxpbmVpaWl7Z2IyMzEyfQotICAgICAgICB7Y2hpbmVzZSwgY3Npc281OGdiMjMxMjgwLCBldWMtY24sIGV1Y2NuLCBldWNnYjIzMTItY24sIGdiMjMxMi0xOTgwLAotICAgICAgICAgZ2IyMzEyLTgwLCBpc28taXItNTh9Ci0gICAgICAgIHtTaW1wbGlmaWVkIENoaW5lc2V9Ci0KLVxsaW5laWlpe2dia30KLSAgICAgICAgezkzNiwgY3A5MzYsIG1zOTM2fQotICAgICAgICB7VW5pZmllZCBDaGluZXNlfQotCi1cbGluZWlpaXtnYjE4MDMwfQotICAgICAgICB7Z2IxODAzMC0yMDAwfQotICAgICAgICB7VW5pZmllZCBDaGluZXNlfQotCi1cbGluZWlpaXtoen0KLSAgICAgICAge2h6Z2IsIGh6LWdiLCBoei1nYi0yMzEyfQotICAgICAgICB7U2ltcGxpZmllZCBDaGluZXNlfQotCi1cbGluZWlpaXtpc28yMDIyX2pwfQotICAgICAgICB7Y3Npc28yMDIyanAsIGlzbzIwMjJqcCwgaXNvLTIwMjItanB9Ci0gICAgICAgIHtKYXBhbmVzZX0KLQotXGxpbmVpaWl7aXNvMjAyMl9qcF8xfQotICAgICAgICB7aXNvMjAyMmpwLTEsIGlzby0yMDIyLWpwLTF9Ci0gICAgICAgIHtKYXBhbmVzZX0KLQotXGxpbmVpaWl7aXNvMjAyMl9qcF8yfQotICAgICAgICB7aXNvMjAyMmpwLTIsIGlzby0yMDIyLWpwLTJ9Ci0gICAgICAgIHtKYXBhbmVzZSwgS29yZWFuLCBTaW1wbGlmaWVkIENoaW5lc2UsIFdlc3Rlcm4gRXVyb3BlLCBHcmVla30KLQotXGxpbmVpaWl7aXNvMjAyMl9qcF8yMDA0fQotICAgICAgICB7aXNvMjAyMmpwLTIwMDQsIGlzby0yMDIyLWpwLTIwMDR9Ci0gICAgICAgIHtKYXBhbmVzZX0KLQotXGxpbmVpaWl7aXNvMjAyMl9qcF8zfQotICAgICAgICB7aXNvMjAyMmpwLTMsIGlzby0yMDIyLWpwLTN9Ci0gICAgICAgIHtKYXBhbmVzZX0KLQotXGxpbmVpaWl7aXNvMjAyMl9qcF9leHR9Ci0gICAgICAgIHtpc28yMDIyanAtZXh0LCBpc28tMjAyMi1qcC1leHR9Ci0gICAgICAgIHtKYXBhbmVzZX0KLQotXGxpbmVpaWl7aXNvMjAyMl9rcn0KLSAgICAgICAge2NzaXNvMjAyMmtyLCBpc28yMDIya3IsIGlzby0yMDIyLWtyfQotICAgICAgICB7S29yZWFufQotCi1cbGluZWlpaXtsYXRpbl8xfQotICAgICAgICB7aXNvLTg4NTktMSwgaXNvODg1OS0xLCA4ODU5LCBjcDgxOSwgbGF0aW4sIGxhdGluMSwgTDF9Ci0gICAgICAgIHtXZXN0IEV1cm9wZX0KLQotXGxpbmVpaWl7aXNvODg1OV8yfQotICAgICAgICB7aXNvLTg4NTktMiwgbGF0aW4yLCBMMn0KLSAgICAgICAge0NlbnRyYWwgYW5kIEVhc3Rlcm4gRXVyb3BlfQotCi1cbGluZWlpaXtpc284ODU5XzN9Ci0gICAgICAgIHtpc28tODg1OS0zLCBsYXRpbjMsIEwzfQotICAgICAgICB7RXNwZXJhbnRvLCBNYWx0ZXNlfQotCi1cbGluZWlpaXtpc284ODU5XzR9Ci0gICAgICAgIHtpc28tODg1OS00LCBsYXRpbjQsIEw0fQotICAgICAgICB7QmFsdGljIGxhbmd1YWd1ZXN9Ci0KLVxsaW5laWlpe2lzbzg4NTlfNX0KLSAgICAgICAge2lzby04ODU5LTUsIGN5cmlsbGljfQotICAgICAgICB7QnVsZ2FyaWFuLCBCeWVsb3J1c3NpYW4sIE1hY2Vkb25pYW4sIFJ1c3NpYW4sIFNlcmJpYW59Ci0KLVxsaW5laWlpe2lzbzg4NTlfNn0KLSAgICAgICAge2lzby04ODU5LTYsIGFyYWJpY30KLSAgICAgICAge0FyYWJpY30KLQotXGxpbmVpaWl7aXNvODg1OV83fQotICAgICAgICB7aXNvLTg4NTktNywgZ3JlZWssIGdyZWVrOH0KLSAgICAgICAge0dyZWVrfQotCi1cbGluZWlpaXtpc284ODU5Xzh9Ci0gICAgICAgIHtpc28tODg1OS04LCBoZWJyZXd9Ci0gICAgICAgIHtIZWJyZXd9Ci0KLVxsaW5laWlpe2lzbzg4NTlfOX0KLSAgICAgICAge2lzby04ODU5LTksIGxhdGluNSwgTDV9Ci0gICAgICAgIHtUdXJraXNofQotCi1cbGluZWlpaXtpc284ODU5XzEwfQotICAgICAgICB7aXNvLTg4NTktMTAsIGxhdGluNiwgTDZ9Ci0gICAgICAgIHtOb3JkaWMgbGFuZ3VhZ2VzfQotCi1cbGluZWlpaXtpc284ODU5XzEzfQotICAgICAgICB7aXNvLTg4NTktMTN9Ci0gICAgICAgIHtCYWx0aWMgbGFuZ3VhZ2VzfQotCi1cbGluZWlpaXtpc284ODU5XzE0fQotICAgICAgICB7aXNvLTg4NTktMTQsIGxhdGluOCwgTDh9Ci0gICAgICAgIHtDZWx0aWMgbGFuZ3VhZ2VzfQotCi1cbGluZWlpaXtpc284ODU5XzE1fQotICAgICAgICB7aXNvLTg4NTktMTV9Ci0gICAgICAgIHtXZXN0ZXJuIEV1cm9wZX0KLQotXGxpbmVpaWl7am9oYWJ9Ci0gICAgICAgIHtjcDEzNjEsIG1zMTM2MX0KLSAgICAgICAge0tvcmVhbn0KLQotXGxpbmVpaWl7a29pOF9yfQotICAgICAgICB7fQotICAgICAgICB7UnVzc2lhbn0KLQotXGxpbmVpaWl7a29pOF91fQotICAgICAgICB7fQotICAgICAgICB7VWtyYWluaWFufQotCi1cbGluZWlpaXttYWNfY3lyaWxsaWN9Ci0gICAgICAgIHttYWNjeXJpbGxpY30KLSAgICAgICAge0J1bGdhcmlhbiwgQnllbG9ydXNzaWFuLCBNYWNlZG9uaWFuLCBSdXNzaWFuLCBTZXJiaWFufQotCi1cbGluZWlpaXttYWNfZ3JlZWt9Ci0gICAgICAgIHttYWNncmVla30KLSAgICAgICAge0dyZWVrfQotCi1cbGluZWlpaXttYWNfaWNlbGFuZH0KLSAgICAgICAge21hY2ljZWxhbmR9Ci0gICAgICAgIHtJY2VsYW5kaWN9Ci0KLVxsaW5laWlpe21hY19sYXRpbjJ9Ci0gICAgICAgIHttYWNsYXRpbjIsIG1hY2NlbnRyYWxldXJvcGV9Ci0gICAgICAgIHtDZW50cmFsIGFuZCBFYXN0ZXJuIEV1cm9wZX0KLQotXGxpbmVpaWl7bWFjX3JvbWFufQotICAgICAgICB7bWFjcm9tYW59Ci0gICAgICAgIHtXZXN0ZXJuIEV1cm9wZX0KLQotXGxpbmVpaWl7bWFjX3R1cmtpc2h9Ci0gICAgICAgIHttYWN0dXJraXNofQotICAgICAgICB7VHVya2lzaH0KLQotXGxpbmVpaWl7cHRjcDE1NH0KLSAgICAgICAge2NzcHRjcDE1NCwgcHQxNTQsIGNwMTU0LCBjeXJpbGxpYy1hc2lhbn0KLSAgICAgICAge0themFraH0KLQotXGxpbmVpaWl7c2hpZnRfamlzfQotICAgICAgICB7Y3NzaGlmdGppcywgc2hpZnRqaXMsIHNqaXMsIHNfamlzfQotICAgICAgICB7SmFwYW5lc2V9Ci0KLVxsaW5laWlpe3NoaWZ0X2ppc18yMDA0fQotICAgICAgICB7c2hpZnRqaXMyMDA0LCBzamlzXzIwMDQsIHNqaXMyMDA0fQotICAgICAgICB7SmFwYW5lc2V9Ci0KLVxsaW5laWlpe3NoaWZ0X2ppc3gwMjEzfQotICAgICAgICB7c2hpZnRqaXN4MDIxMywgc2ppc3gwMjEzLCBzX2ppc3gwMjEzfQotICAgICAgICB7SmFwYW5lc2V9Ci0KLVxsaW5laWlpe3V0Zl8xNn0KLSAgICAgICAge1UxNiwgdXRmMTZ9Ci0gICAgICAgIHthbGwgbGFuZ3VhZ2VzfQotCi1cbGluZWlpaXt1dGZfMTZfYmV9Ci0gICAgICAgIHtVVEYtMTZCRX0KLSAgICAgICAge2FsbCBsYW5ndWFnZXMgKEJNUCBvbmx5KX0KLQotXGxpbmVpaWl7dXRmXzE2X2xlfQotICAgICAgICB7VVRGLTE2TEV9Ci0gICAgICAgIHthbGwgbGFuZ3VhZ2VzIChCTVAgb25seSl9Ci0KLVxsaW5laWlpe3V0Zl83fQotICAgICAgICB7VTcsIHVuaWNvZGUtMS0xLXV0Zi03fQotICAgICAgICB7YWxsIGxhbmd1YWdlc30KLQotXGxpbmVpaWl7dXRmXzh9Ci0gICAgICAgIHtVOCwgVVRGLCB1dGY4fQotICAgICAgICB7YWxsIGxhbmd1YWdlc30KLQotXGxpbmVpaWl7dXRmXzhfc2lnfQotICAgICAgICB7fQotICAgICAgICB7YWxsIGxhbmd1YWdlc30KLQotXGVuZHtsb25ndGFibGVpaWl9Ci0KLUEgbnVtYmVyIG9mIGNvZGVjcyBhcmUgc3BlY2lmaWMgdG8gUHl0aG9uLCBzbyB0aGVpciBjb2RlYyBuYW1lcyBoYXZlCi1ubyBtZWFuaW5nIG91dHNpZGUgUHl0aG9uLiBTb21lIG9mIHRoZW0gZG9uJ3QgY29udmVydCBmcm9tIFVuaWNvZGUKLXN0cmluZ3MgdG8gYnl0ZSBzdHJpbmdzLCBidXQgaW5zdGVhZCB1c2UgdGhlIHByb3BlcnR5IG9mIHRoZSBQeXRob24KLWNvZGVjcyBtYWNoaW5lcnkgdGhhdCBhbnkgYmlqZWN0aXZlIGZ1bmN0aW9uIHdpdGggb25lIGFyZ3VtZW50IGNhbiBiZQotY29uc2lkZXJlZCBhcyBhbiBlbmNvZGluZy4KLQotRm9yIHRoZSBjb2RlY3MgbGlzdGVkIGJlbG93LCB0aGUgcmVzdWx0IGluIHRoZSBgYGVuY29kaW5nJycgZGlyZWN0aW9uCi1pcyBhbHdheXMgYSBieXRlIHN0cmluZy4gVGhlIHJlc3VsdCBvZiB0aGUgYGBkZWNvZGluZycnIGRpcmVjdGlvbiBpcwotbGlzdGVkIGFzIG9wZXJhbmQgdHlwZSBpbiB0aGUgdGFibGUuCi0KLVxiZWdpbnt0YWJsZWl2fXtsfGx8bHxsfXt0ZXh0cm19e0NvZGVjfXtBbGlhc2VzfXtPcGVyYW5kIHR5cGV9e1B1cnBvc2V9Ci0KLVxsaW5laXZ7aWRuYX0KLSAgICAgICAgIHt9Ci0gICAgICAgICB7VW5pY29kZSBzdHJpbmd9Ci0gICAgICAgICB7SW1wbGVtZW50cyBccmZjezM0OTB9LAotICAgICAgICAgIHNlZSBhbHNvIFxyZWZtb2R1bGV7ZW5jb2RpbmdzLmlkbmF9fQotCi1cbGluZWl2e21iY3N9Ci0gICAgICAgICB7ZGJjc30KLSAgICAgICAgIHtVbmljb2RlIHN0cmluZ30KLSAgICAgICAgIHtXaW5kb3dzIG9ubHk6IEVuY29kZSBvcGVyYW5kIGFjY29yZGluZyB0byB0aGUgQU5TSSBjb2RlcGFnZSAoQ1BfQUNQKX0KLQotXGxpbmVpdntwYWxtb3N9Ci0gICAgICAgICB7fQotICAgICAgICAge1VuaWNvZGUgc3RyaW5nfQotICAgICAgICAge0VuY29kaW5nIG9mIFBhbG1PUyAzLjV9Ci0KLVxsaW5laXZ7cHVueWNvZGV9Ci0gICAgICAgICB7fQotICAgICAgICAge1VuaWNvZGUgc3RyaW5nfQotICAgICAgICAge0ltcGxlbWVudHMgXHJmY3szNDkyfX0KLQotXGxpbmVpdntyYXdfdW5pY29kZV9lc2NhcGV9Ci0gICAgICAgICB7fQotICAgICAgICAge1VuaWNvZGUgc3RyaW5nfQotICAgICAgICAge1Byb2R1Y2UgYSBzdHJpbmcgdGhhdCBpcyBzdWl0YWJsZSBhcyByYXcgVW5pY29kZSBsaXRlcmFsIGluCi0gICAgICAgICAgUHl0aG9uIHNvdXJjZSBjb2RlfQotCi1cbGluZWl2e3VuZGVmaW5lZH0KLSAgICAgICAgIHt9Ci0gICAgICAgICB7YW55fQotICAgICAgICAge1JhaXNlIGFuIGV4Y2VwdGlvbiBmb3IgYWxsIGNvbnZlcnNpb25zLiBDYW4gYmUgdXNlZCBhcyB0aGUKLSAgICAgICAgICBzeXN0ZW0gZW5jb2RpbmcgaWYgbm8gYXV0b21hdGljIGNvZXJjaW9uIGJldHdlZW4gYnl0ZSBhbmQKLSAgICAgICAgICBVbmljb2RlIHN0cmluZ3MgaXMgZGVzaXJlZC59Ci0KLVxsaW5laXZ7dW5pY29kZV9lc2NhcGV9Ci0gICAgICAgICB7fQotICAgICAgICAge1VuaWNvZGUgc3RyaW5nfQotICAgICAgICAge1Byb2R1Y2UgYSBzdHJpbmcgdGhhdCBpcyBzdWl0YWJsZSBhcyBVbmljb2RlIGxpdGVyYWwgaW4KLSAgICAgICAgICBQeXRob24gc291cmNlIGNvZGV9Ci0KLVxsaW5laXZ7dW5pY29kZV9pbnRlcm5hbH0KLSAgICAgICAgIHt9Ci0gICAgICAgICB7VW5pY29kZSBzdHJpbmd9Ci0gICAgICAgICB7UmV0dXJuIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgb3BlcmFuZH0KLVxlbmR7dGFibGVpdn0KLQotXHZlcnNpb25hZGRlZFtUaGUgXGNvZGV7aWRuYX0gYW5kIFxjb2Rle3B1bnljb2RlfSBlbmNvZGluZ3NdezIuM30KLQotXHN1YnNlY3Rpb257XG1vZHVsZXtlbmNvZGluZ3MuaWRuYX0gLS0tCi0gICAgICAgICAgICBJbnRlcm5hdGlvbmFsaXplZCBEb21haW4gTmFtZXMgaW4gQXBwbGljYXRpb25zfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZW5jb2RpbmdzLmlkbmF9Ci1cbW9kdWxlc3lub3BzaXN7SW50ZXJuYXRpb25hbGl6ZWQgRG9tYWluIE5hbWVzIGltcGxlbWVudGF0aW9ufQotJSBYWFggVGhlIG5leHQgbGluZSB0cmlnZ2VycyBhIGZvcm1hdHRpbmcgYnVnLCBzbyBpdCdzIGNvbW1lbnRlZCBvdXQKLSUgdW50aWwgdGhhdCBjYW4gYmUgZml4ZWQuCi0lXG1vZHVsZWF1dGhvcntNYXJ0aW4gdi4gTFwib3dpc30KLQotXHZlcnNpb25hZGRlZHsyLjN9Ci0KLVRoaXMgbW9kdWxlIGltcGxlbWVudHMgXHJmY3szNDkwfSAoSW50ZXJuYXRpb25hbGl6ZWQgRG9tYWluIE5hbWVzIGluCi1BcHBsaWNhdGlvbnMpIGFuZCBccmZjezM0OTJ9IChOYW1lcHJlcDogQSBTdHJpbmdwcmVwIFByb2ZpbGUgZm9yCi1JbnRlcm5hdGlvbmFsaXplZCBEb21haW4gTmFtZXMgKElETikpLiBJdCBidWlsZHMgdXBvbiB0aGUKLVxjb2Rle3B1bnljb2RlfSBlbmNvZGluZyBhbmQgXHJlZm1vZHVsZXtzdHJpbmdwcmVwfS4KLQotVGhlc2UgUkZDcyB0b2dldGhlciBkZWZpbmUgYSBwcm90b2NvbCB0byBzdXBwb3J0IG5vbi1cQVNDSUl7fSBjaGFyYWN0ZXJzCi1pbiBkb21haW4gbmFtZXMuIEEgZG9tYWluIG5hbWUgY29udGFpbmluZyBub24tXEFTQ0lJe30gY2hhcmFjdGVycyAoc3VjaAotYXMgYGB3d3cuQWxsaWFuY2VmcmFuXGMgY2Fpc2UubnUnJykgaXMgY29udmVydGVkIGludG8gYW4KLVxBU0NJSS1jb21wYXRpYmxlIGVuY29kaW5nIChBQ0UsIHN1Y2ggYXMKLWBgd3d3LnhuLS1hbGxpYW5jZWZyYW5haXNlLW5wYi5udScnKS4gVGhlIEFDRSBmb3JtIG9mIHRoZSBkb21haW4gbmFtZQotaXMgdGhlbiB1c2VkIGluIGFsbCBwbGFjZXMgd2hlcmUgYXJiaXRyYXJ5IGNoYXJhY3RlcnMgYXJlIG5vdCBhbGxvd2VkCi1ieSB0aGUgcHJvdG9jb2wsIHN1Y2ggYXMgRE5TIHF1ZXJpZXMsIEhUVFAgXG1haWxoZWFkZXJ7SG9zdH0gZmllbGRzLCBhbmQgc28KLW9uLiBUaGlzIGNvbnZlcnNpb24gaXMgY2FycmllZCBvdXQgaW4gdGhlIGFwcGxpY2F0aW9uOyBpZiBwb3NzaWJsZQotaW52aXNpYmxlIHRvIHRoZSB1c2VyOiBUaGUgYXBwbGljYXRpb24gc2hvdWxkIHRyYW5zcGFyZW50bHkgY29udmVydAotVW5pY29kZSBkb21haW4gbGFiZWxzIHRvIElETkEgb24gdGhlIHdpcmUsIGFuZCBjb252ZXJ0IGJhY2sgQUNFIGxhYmVscwotdG8gVW5pY29kZSBiZWZvcmUgcHJlc2VudGluZyB0aGVtIHRvIHRoZSB1c2VyLgotCi1QeXRob24gc3VwcG9ydHMgdGhpcyBjb252ZXJzaW9uIGluIHNldmVyYWwgd2F5czogVGhlIFxjb2Rle2lkbmF9IGNvZGVjCi1hbGxvd3MgdG8gY29udmVydCBiZXR3ZWVuIFVuaWNvZGUgYW5kIHRoZSBBQ0UuIEZ1cnRoZXJtb3JlLCB0aGUKLVxyZWZtb2R1bGV7c29ja2V0fSBtb2R1bGUgdHJhbnNwYXJlbnRseSBjb252ZXJ0cyBVbmljb2RlIGhvc3QgbmFtZXMgdG8KLUFDRSwgc28gdGhhdCBhcHBsaWNhdGlvbnMgbmVlZCBub3QgYmUgY29uY2VybmVkIGFib3V0IGNvbnZlcnRpbmcgaG9zdAotbmFtZXMgdGhlbXNlbHZlcyB3aGVuIHRoZXkgcGFzcyB0aGVtIHRvIHRoZSBzb2NrZXQgbW9kdWxlLiBPbiB0b3Agb2YKLXRoYXQsIG1vZHVsZXMgdGhhdCBoYXZlIGhvc3QgbmFtZXMgYXMgZnVuY3Rpb24gcGFyYW1ldGVycywgc3VjaCBhcwotXHJlZm1vZHVsZXtodHRwbGlifSBhbmQgXHJlZm1vZHVsZXtmdHBsaWJ9LCBhY2NlcHQgVW5pY29kZSBob3N0IG5hbWVzCi0oXHJlZm1vZHVsZXtodHRwbGlifSB0aGVuIGFsc28gdHJhbnNwYXJlbnRseSBzZW5kcyBhbiBJRE5BIGhvc3RuYW1lIGluCi10aGUgXG1haWxoZWFkZXJ7SG9zdH0gZmllbGQgaWYgaXQgc2VuZHMgdGhhdCBmaWVsZCBhdCBhbGwpLiAKLQotV2hlbiByZWNlaXZpbmcgaG9zdCBuYW1lcyBmcm9tIHRoZSB3aXJlIChzdWNoIGFzIGluIHJldmVyc2UgbmFtZQotbG9va3VwKSwgbm8gYXV0b21hdGljIGNvbnZlcnNpb24gdG8gVW5pY29kZSBpcyBwZXJmb3JtZWQ6IEFwcGxpY2F0aW9ucwotd2lzaGluZyB0byBwcmVzZW50IHN1Y2ggaG9zdCBuYW1lcyB0byB0aGUgdXNlciBzaG91bGQgZGVjb2RlIHRoZW0gdG8KLVVuaWNvZGUuCi0KLVRoZSBtb2R1bGUgXG1vZHVsZXtlbmNvZGluZ3MuaWRuYX0gYWxzbyBpbXBsZW1lbnRzIHRoZSBuYW1lcHJlcAotcHJvY2VkdXJlLCB3aGljaCBwZXJmb3JtcyBjZXJ0YWluIG5vcm1hbGl6YXRpb25zIG9uIGhvc3QgbmFtZXMsIHRvCi1hY2hpZXZlIGNhc2UtaW5zZW5zaXRpdml0eSBvZiBpbnRlcm5hdGlvbmFsIGRvbWFpbiBuYW1lcywgYW5kIHRvIHVuaWZ5Ci1zaW1pbGFyIGNoYXJhY3RlcnMuIFRoZSBuYW1lcHJlcCBmdW5jdGlvbnMgY2FuIGJlIHVzZWQgZGlyZWN0bHkgaWYKLWRlc2lyZWQuCi0KLVxiZWdpbntmdW5jZGVzY317bmFtZXByZXB9e2xhYmVsfQotUmV0dXJuIHRoZSBuYW1lcHJlcHBlZCB2ZXJzaW9uIG9mIFx2YXJ7bGFiZWx9LiBUaGUgaW1wbGVtZW50YXRpb24KLWN1cnJlbnRseSBhc3N1bWVzIHF1ZXJ5IHN0cmluZ3MsIHNvIFxjb2Rle0FsbG93VW5hc3NpZ25lZH0gaXMKLXRydWUuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e1RvQVNDSUl9e2xhYmVsfQotQ29udmVydCBhIGxhYmVsIHRvIFxBU0NJSSwgYXMgc3BlY2lmaWVkIGluIFxyZmN7MzQ5MH0uCi1cY29kZXtVc2VTVEQzQVNDSUlSdWxlc30gaXMgYXNzdW1lZCB0byBiZSBmYWxzZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317VG9Vbmljb2RlfXtsYWJlbH0KLUNvbnZlcnQgYSBsYWJlbCB0byBVbmljb2RlLCBhcyBzcGVjaWZpZWQgaW4gXHJmY3szNDkwfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLSBcc3Vic2VjdGlvbntcbW9kdWxle2VuY29kaW5ncy51dGZfOF9zaWd9IC0tLQotICAgICAgICAgICAgIFVURi04IGNvZGVjIHdpdGggQk9NIHNpZ25hdHVyZX0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtlbmNvZGluZ3MudXRmLTgtc2lnfSAgICUgWFhYIHV0Zl84X3NpZyBnaXZlcyBUZVggZXJyb3JzCi1cbW9kdWxlc3lub3BzaXN7VVRGLTggY29kZWMgd2l0aCBCT00gc2lnbmF0dXJlfQotXG1vZHVsZWF1dGhvcntXYWx0ZXIgRFwib3J3YWxkfXt9Ci0KLVx2ZXJzaW9uYWRkZWR7Mi41fQotCi1UaGlzIG1vZHVsZSBpbXBsZW1lbnRzIGEgdmFyaWFudCBvZiB0aGUgVVRGLTggY29kZWM6IE9uIGVuY29kaW5nIGEKLVVURi04IGVuY29kZWQgQk9NIHdpbGwgYmUgcHJlcGVuZGVkIHRvIHRoZSBVVEYtOCBlbmNvZGVkIGJ5dGVzLiBGb3IKLXRoZSBzdGF0ZWZ1bCBlbmNvZGVyIHRoaXMgaXMgb25seSBkb25lIG9uY2UgKG9uIHRoZSBmaXJzdCB3cml0ZSB0byB0aGUKLWJ5dGUgc3RyZWFtKS4gIEZvciBkZWNvZGluZyBhbiBvcHRpb25hbCBVVEYtOCBlbmNvZGVkIEJPTSBhdCB0aGUgc3RhcnQKLW9mIHRoZSBkYXRhIHdpbGwgYmUgc2tpcHBlZC4KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliY29kZW9wLnRleCBiL0RvYy9saWIvbGliY29kZW9wLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk3MmI2Zi4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmNvZGVvcC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtjb2Rlb3B9IC0tLQotICAgICAgICAgQ29tcGlsZSBQeXRob24gY29kZX0KLQotJSBMYVRlWGVkIGZyb20gZXhjZWxsZW50IGRvYy1zdHJpbmcuCi0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtjb2Rlb3B9Ci1cc2VjdGlvbmF1dGhvcntNb3NoZSBaYWRrYX17bW9zaGV6QHphZGthLnNpdGUuY28uaWx9Ci1cc2VjdGlvbmF1dGhvcntNaWNoYWVsIEh1ZHNvbn17bXdoQHB5dGhvbi5uZXR9Ci1cbW9kdWxlc3lub3BzaXN7Q29tcGlsZSAocG9zc2libHkgaW5jb21wbGV0ZSkgUHl0aG9uIGNvZGUufQotCi1UaGUgXG1vZHVsZXtjb2Rlb3B9IG1vZHVsZSBwcm92aWRlcyB1dGlsaXRpZXMgdXBvbiB3aGljaCB0aGUgUHl0aG9uCi1yZWFkLWV2YWwtcHJpbnQgbG9vcCBjYW4gYmUgZW11bGF0ZWQsIGFzIGlzIGRvbmUgaW4gdGhlCi1ccmVmbW9kdWxle2NvZGV9IG1vZHVsZS4gIEFzIGEgcmVzdWx0LCB5b3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byB1c2UKLXRoZSBtb2R1bGUgZGlyZWN0bHk7IGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgc3VjaCBhIGxvb3AgaW4geW91cgotcHJvZ3JhbSB5b3UgcHJvYmFibHkgd2FudCB0byB1c2UgdGhlIFxyZWZtb2R1bGV7Y29kZX0gbW9kdWxlIGluc3RlYWQuCi0KLVRoZXJlIGFyZSB0d28gcGFydHMgdG8gdGhpcyBqb2I6IAotCi1cYmVnaW57ZW51bWVyYXRlfQotICBcaXRlbSBCZWluZyBhYmxlIHRvIHRlbGwgaWYgYSBsaW5lIG9mIGlucHV0IGNvbXBsZXRlcyBhIFB5dGhvbiAKLSAgICAgICAgc3RhdGVtZW50OiBpbiBzaG9ydCwgdGVsbGluZyB3aGV0aGVyIHRvIHByaW50Ci0gICAgICAgIGBcY29kZXs+Pj5+fScgb3IgYFxjb2Rley4uLn59JyBuZXh0LgotICBcaXRlbSBSZW1lbWJlcmluZyB3aGljaCBmdXR1cmUgc3RhdGVtZW50cyB0aGUgdXNlciBoYXMgZW50ZXJlZCwgc28gCi0gICAgICAgIHN1YnNlcXVlbnQgaW5wdXQgY2FuIGJlIGNvbXBpbGVkIHdpdGggdGhlc2UgaW4gZWZmZWN0LgotXGVuZHtlbnVtZXJhdGV9Ci0KLVRoZSBcbW9kdWxle2NvZGVvcH0gbW9kdWxlIHByb3ZpZGVzIGEgd2F5IG9mIGRvaW5nIGVhY2ggb2YgdGhlc2UKLXRoaW5ncywgYW5kIGEgd2F5IG9mIGRvaW5nIHRoZW0gYm90aC4KLQotVG8gZG8ganVzdCB0aGUgZm9ybWVyOgotCi1cYmVnaW57ZnVuY2Rlc2N9e2NvbXBpbGVfY29tbWFuZH0KLSAgICAgICAgICAgICAgICB7c291cmNlXG9wdGlvbmFseywgZmlsZW5hbWVcb3B0aW9uYWx7LCBzeW1ib2x9fX0KLVRyaWVzIHRvIGNvbXBpbGUgXHZhcntzb3VyY2V9LCB3aGljaCBzaG91bGQgYmUgYSBzdHJpbmcgb2YgUHl0aG9uCi1jb2RlIGFuZCByZXR1cm4gYSBjb2RlIG9iamVjdCBpZiBcdmFye3NvdXJjZX0gaXMgdmFsaWQKLVB5dGhvbiBjb2RlLiBJbiB0aGF0IGNhc2UsIHRoZSBmaWxlbmFtZSBhdHRyaWJ1dGUgb2YgdGhlIGNvZGUgb2JqZWN0Ci13aWxsIGJlIFx2YXJ7ZmlsZW5hbWV9LCB3aGljaCBkZWZhdWx0cyB0byBcY29kZXsnPGlucHV0Pid9LgotUmV0dXJucyBcY29kZXtOb25lfSBpZiBcdmFye3NvdXJjZX0gaXMgXGVtcGh7bm90fSB2YWxpZCBQeXRob24KLWNvZGUsIGJ1dCBpcyBhIHByZWZpeCBvZiB2YWxpZCBQeXRob24gY29kZS4KLQotSWYgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggXHZhcntzb3VyY2V9LCBhbiBleGNlcHRpb24gd2lsbCBiZSByYWlzZWQuCi1cZXhjZXB0aW9ue1N5bnRheEVycm9yfSBpcyByYWlzZWQgaWYgdGhlcmUgaXMgaW52YWxpZCBQeXRob24gc3ludGF4LAotYW5kIFxleGNlcHRpb257T3ZlcmZsb3dFcnJvcn0gb3IgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSBpZiB0aGVyZSBpcyBhbgotaW52YWxpZCBsaXRlcmFsLgotCi1UaGUgXHZhcntzeW1ib2x9IGFyZ3VtZW50IGRldGVybWluZXMgd2hldGhlciBcdmFye3NvdXJjZX0gaXMgY29tcGlsZWQKLWFzIGEgc3RhdGVtZW50IChcY29kZXsnc2luZ2xlJ30sIHRoZSBkZWZhdWx0KSBvciBhcyBhbiBleHByZXNzaW9uCi0oXGNvZGV7J2V2YWwnfSkuICBBbnkgb3RoZXIgdmFsdWUgd2lsbCBjYXVzZSBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IHRvIAotYmUgcmFpc2VkLgotCi1cc3Ryb25ne0NhdmVhdDp9Ci1JdCBpcyBwb3NzaWJsZSAoYnV0IG5vdCBsaWtlbHkpIHRoYXQgdGhlIHBhcnNlciBzdG9wcyBwYXJzaW5nCi13aXRoIGEgc3VjY2Vzc2Z1bCBvdXRjb21lIGJlZm9yZSByZWFjaGluZyB0aGUgZW5kIG9mIHRoZSBzb3VyY2U7Ci1pbiB0aGlzIGNhc2UsIHRyYWlsaW5nIHN5bWJvbHMgbWF5IGJlIGlnbm9yZWQgaW5zdGVhZCBvZiBjYXVzaW5nIGFuCi1lcnJvci4gIEZvciBleGFtcGxlLCBhIGJhY2tzbGFzaCBmb2xsb3dlZCBieSB0d28gbmV3bGluZXMgbWF5IGJlCi1mb2xsb3dlZCBieSBhcmJpdHJhcnkgZ2FyYmFnZS4gIFRoaXMgd2lsbCBiZSBmaXhlZCBvbmNlIHRoZSBBUEkKLWZvciB0aGUgcGFyc2VyIGlzIGJldHRlci4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0NvbXBpbGV9e30KLUluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGhhdmUgXG1ldGhvZHtfX2NhbGxfXygpfSBtZXRob2RzIGlkZW50aWNhbCBpbgotc2lnbmF0dXJlIHRvIHRoZSBidWlsdC1pbiBmdW5jdGlvbiBcZnVuY3Rpb257Y29tcGlsZSgpfSwgYnV0IHdpdGggdGhlCi1kaWZmZXJlbmNlIHRoYXQgaWYgdGhlIGluc3RhbmNlIGNvbXBpbGVzIHByb2dyYW0gdGV4dCBjb250YWluaW5nIGEKLVxtb2R1bGV7X19mdXR1cmVfX30gc3RhdGVtZW50LCB0aGUgaW5zdGFuY2UgJ3JlbWVtYmVycycgYW5kIGNvbXBpbGVzCi1hbGwgc3Vic2VxdWVudCBwcm9ncmFtIHRleHRzIHdpdGggdGhlIHN0YXRlbWVudCBpbiBmb3JjZS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtDb21tYW5kQ29tcGlsZXJ9e30KLUluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGhhdmUgXG1ldGhvZHtfX2NhbGxfXygpfSBtZXRob2RzIGlkZW50aWNhbCBpbgotc2lnbmF0dXJlIHRvIFxmdW5jdGlvbntjb21waWxlX2NvbW1hbmQoKX07IHRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgaWYKLXRoZSBpbnN0YW5jZSBjb21waWxlcyBwcm9ncmFtIHRleHQgY29udGFpbmluZyBhIFxjb2Rle19fZnV0dXJlX199Ci1zdGF0ZW1lbnQsIHRoZSBpbnN0YW5jZSAncmVtZW1iZXJzJyBhbmQgY29tcGlsZXMgYWxsIHN1YnNlcXVlbnQKLXByb2dyYW0gdGV4dHMgd2l0aCB0aGUgc3RhdGVtZW50IGluIGZvcmNlLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLUEgbm90ZSBvbiB2ZXJzaW9uIGNvbXBhdGliaWxpdHk6IHRoZSBcY2xhc3N7Q29tcGlsZX0gYW5kCi1cY2xhc3N7Q29tbWFuZENvbXBpbGVyfSBhcmUgbmV3IGluIFB5dGhvbiAyLjIuICBJZiB5b3Ugd2FudCB0byBlbmFibGUKLXRoZSBmdXR1cmUtdHJhY2tpbmcgZmVhdHVyZXMgb2YgMi4yIGJ1dCBhbHNvIHJldGFpbiBjb21wYXRpYmlsaXR5IHdpdGgKLTIuMSBhbmQgZWFybGllciB2ZXJzaW9ucyBvZiBQeXRob24geW91IGNhbiBlaXRoZXIgd3JpdGUKLQotXGJlZ2lue3ZlcmJhdGltfQotdHJ5OgotICAgIGZyb20gY29kZW9wIGltcG9ydCBDb21tYW5kQ29tcGlsZXIKLSAgICBjb21waWxlX2NvbW1hbmQgPSBDb21tYW5kQ29tcGlsZXIoKQotICAgIGRlbCBDb21tYW5kQ29tcGlsZXIKLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICBmcm9tIGNvZGVvcCBpbXBvcnQgY29tcGlsZV9jb21tYW5kCi1cZW5ke3ZlcmJhdGltfQotCi13aGljaCBpcyBhIGxvdy1pbXBhY3QgY2hhbmdlLCBidXQgaW50cm9kdWNlcyBwb3NzaWJseSB1bndhbnRlZCBnbG9iYWwKLXN0YXRlIGludG8geW91ciBwcm9ncmFtLCBvciB5b3UgY2FuIHdyaXRlOgotCi1cYmVnaW57dmVyYmF0aW19Ci10cnk6Ci0gICAgZnJvbSBjb2Rlb3AgaW1wb3J0IENvbW1hbmRDb21waWxlcgotZXhjZXB0IEltcG9ydEVycm9yOgotICAgIGRlZiBDb21tYW5kQ29tcGlsZXIoKToKLSAgICAgICAgZnJvbSBjb2Rlb3AgaW1wb3J0IGNvbXBpbGVfY29tbWFuZAotICAgICAgICByZXR1cm4gY29tcGlsZV9jb21tYW5kCi1cZW5ke3ZlcmJhdGltfQotCi1hbmQgdGhlbiBjYWxsIFxjb2Rle0NvbW1hbmRDb21waWxlcn0gZXZlcnkgdGltZSB5b3UgbmVlZCBhIGZyZXNoCi1jb21waWxlciBvYmplY3QuCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmNvbGxlY3Rpb25zLnRleCBiL0RvYy9saWIvbGliY29sbGVjdGlvbnMudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzQ0ZTAxLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGliY29sbGVjdGlvbnMudGV4CisrKyAvZGV2L251bGwKQEAgLTEsNDAyICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7Y29sbGVjdGlvbnN9IC0tLQotICAgICAgICAgSGlnaC1wZXJmb3JtYW5jZSBjb250YWluZXIgZGF0YXR5cGVzfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17Y29sbGVjdGlvbnN9Ci1cbW9kdWxlc3lub3BzaXN7SGlnaC1wZXJmb3JtYW5jZSBkYXRhdHlwZXN9Ci1cbW9kdWxlYXV0aG9ye1JheW1vbmQgSGV0dGluZ2VyfXtweXRob25AcmNuLmNvbX0KLVxzZWN0aW9uYXV0aG9ye1JheW1vbmQgSGV0dGluZ2VyfXtweXRob25AcmNuLmNvbX0KLVx2ZXJzaW9uYWRkZWR7Mi40fQotCi0KLVRoaXMgbW9kdWxlIGltcGxlbWVudHMgaGlnaC1wZXJmb3JtYW5jZSBjb250YWluZXIgZGF0YXR5cGVzLiAgQ3VycmVudGx5LAotdGhlcmUgYXJlIHR3byBkYXRhdHlwZXMsIGRlcXVlIGFuZCBkZWZhdWx0ZGljdCwgYW5kIG9uZSBkYXRhdHlwZSBmYWN0b3J5Ci1mdW5jdGlvbiwgXGZ1bmN0aW9ue05hbWVkVHVwbGV9LgotRnV0dXJlIGFkZGl0aW9ucyBtYXkgaW5jbHVkZSBiYWxhbmNlZCB0cmVlcyBhbmQgb3JkZXJlZCBkaWN0aW9uYXJpZXMuCi1cdmVyc2lvbmNoYW5nZWRbQWRkZWQgZGVmYXVsdGRpY3RdezIuNX0KLVx2ZXJzaW9uY2hhbmdlZFtBZGRlZCBOYW1lZFR1cGxlXXsyLjZ9Ci0KLVxzdWJzZWN0aW9ue1xjbGFzc3tkZXF1ZX0gb2JqZWN0cyBcbGFiZWx7ZGVxdWUtb2JqZWN0c319Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e2RlcXVlfXtcb3B0aW9uYWx7aXRlcmFibGV9fQotICBSZXR1cm5zIGEgbmV3IGRlcXVlIG9iamVjdCBpbml0aWFsaXplZCBsZWZ0LXRvLXJpZ2h0ICh1c2luZwotICBcbWV0aG9ke2FwcGVuZCgpfSkgd2l0aCBkYXRhIGZyb20gXHZhcntpdGVyYWJsZX0uICBJZiBcdmFye2l0ZXJhYmxlfQotICBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgbmV3IGRlcXVlIGlzIGVtcHR5LgotCi0gIERlcXVlcyBhcmUgYSBnZW5lcmFsaXphdGlvbiBvZiBzdGFja3MgYW5kIHF1ZXVlcyAodGhlIG5hbWUgaXMgcHJvbm91bmNlZAotICBgYGRlY2snJyBhbmQgaXMgc2hvcnQgZm9yIGBgZG91YmxlLWVuZGVkIHF1ZXVlJycpLiAgRGVxdWVzIHN1cHBvcnQKLSAgdGhyZWFkLXNhZmUsIG1lbW9yeSBlZmZpY2llbnQgYXBwZW5kcyBhbmQgcG9wcyBmcm9tIGVpdGhlciBzaWRlIG9mIHRoZSBkZXF1ZQotICB3aXRoIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgXGNvZGV7TygxKX0gcGVyZm9ybWFuY2UgaW4gZWl0aGVyIGRpcmVjdGlvbi4KLQotICBUaG91Z2ggXGNsYXNze2xpc3R9IG9iamVjdHMgc3VwcG9ydCBzaW1pbGFyIG9wZXJhdGlvbnMsIHRoZXkgYXJlIG9wdGltaXplZAotICBmb3IgZmFzdCBmaXhlZC1sZW5ndGggb3BlcmF0aW9ucyBhbmQgaW5jdXIgXGNvZGV7TyhuKX0gbWVtb3J5IG1vdmVtZW50IGNvc3RzCi0gIGZvciBcc2FtcHtwb3AoMCl9IGFuZCBcc2FtcHtpbnNlcnQoMCwgdil9IG9wZXJhdGlvbnMgd2hpY2ggY2hhbmdlIGJvdGggdGhlCi0gIHNpemUgYW5kIHBvc2l0aW9uIG9mIHRoZSB1bmRlcmx5aW5nIGRhdGEgcmVwcmVzZW50YXRpb24uCi0gIFx2ZXJzaW9uYWRkZWR7Mi40fQotXGVuZHtjbGFzc2Rlc2N9Ci0KLURlcXVlIG9iamVjdHMgc3VwcG9ydCB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfXthcHBlbmR9e3h9Ci0gICBBZGQgXHZhcnt4fSB0byB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgZGVxdWUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXthcHBlbmRsZWZ0fXt4fQotICAgQWRkIFx2YXJ7eH0gdG8gdGhlIGxlZnQgc2lkZSBvZiB0aGUgZGVxdWUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtjbGVhcn17fQotICAgUmVtb3ZlIGFsbCBlbGVtZW50cyBmcm9tIHRoZSBkZXF1ZSBsZWF2aW5nIGl0IHdpdGggbGVuZ3RoIDAuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtleHRlbmR9e2l0ZXJhYmxlfQotICAgRXh0ZW5kIHRoZSByaWdodCBzaWRlIG9mIHRoZSBkZXF1ZSBieSBhcHBlbmRpbmcgZWxlbWVudHMgZnJvbQotICAgdGhlIGl0ZXJhYmxlIGFyZ3VtZW50LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317ZXh0ZW5kbGVmdH17aXRlcmFibGV9Ci0gICBFeHRlbmQgdGhlIGxlZnQgc2lkZSBvZiB0aGUgZGVxdWUgYnkgYXBwZW5kaW5nIGVsZW1lbnRzIGZyb20KLSAgIFx2YXJ7aXRlcmFibGV9LiAgTm90ZSwgdGhlIHNlcmllcyBvZiBsZWZ0IGFwcGVuZHMgcmVzdWx0cyBpbgotICAgcmV2ZXJzaW5nIHRoZSBvcmRlciBvZiBlbGVtZW50cyBpbiB0aGUgaXRlcmFibGUgYXJndW1lbnQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtwb3B9e30KLSAgIFJlbW92ZSBhbmQgcmV0dXJuIGFuIGVsZW1lbnQgZnJvbSB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgZGVxdWUuCi0gICBJZiBubyBlbGVtZW50cyBhcmUgcHJlc2VudCwgcmFpc2VzIGFuIFxleGNlcHRpb257SW5kZXhFcnJvcn0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtwb3BsZWZ0fXt9Ci0gICBSZW1vdmUgYW5kIHJldHVybiBhbiBlbGVtZW50IGZyb20gdGhlIGxlZnQgc2lkZSBvZiB0aGUgZGVxdWUuCi0gICBJZiBubyBlbGVtZW50cyBhcmUgcHJlc2VudCwgcmFpc2VzIGFuIFxleGNlcHRpb257SW5kZXhFcnJvcn0uICAgCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtyZW1vdmV9e3ZhbHVlfQotICAgUmVtb3ZlZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBcdmFye3ZhbHVlfS4gIElmIG5vdCBmb3VuZCwKLSAgIHJhaXNlcyBhIFxleGNlcHRpb257VmFsdWVFcnJvcn0uCi0gICBcdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3JvdGF0ZX17bn0KLSAgIFJvdGF0ZSB0aGUgZGVxdWUgXHZhcntufSBzdGVwcyB0byB0aGUgcmlnaHQuICBJZiBcdmFye259IGlzCi0gICBuZWdhdGl2ZSwgcm90YXRlIHRvIHRoZSBsZWZ0LiAgUm90YXRpbmcgb25lIHN0ZXAgdG8gdGhlIHJpZ2h0Ci0gICBpcyBlcXVpdmFsZW50IHRvOiAgXHNhbXB7ZC5hcHBlbmRsZWZ0KGQucG9wKCkpfS4gCi1cZW5ke21ldGhvZGRlc2N9Ci0KLUluIGFkZGl0aW9uIHRvIHRoZSBhYm92ZSwgZGVxdWVzIHN1cHBvcnQgaXRlcmF0aW9uLCBwaWNrbGluZywgXHNhbXB7bGVuKGQpfSwKLVxzYW1we3JldmVyc2VkKGQpfSwgXHNhbXB7Y29weS5jb3B5KGQpfSwgXHNhbXB7Y29weS5kZWVwY29weShkKX0sCi1tZW1iZXJzaGlwIHRlc3Rpbmcgd2l0aCB0aGUgXGtleXdvcmR7aW59IG9wZXJhdG9yLCBhbmQgc3Vic2NyaXB0IHJlZmVyZW5jZXMKLXN1Y2ggYXMgXHNhbXB7ZFstMV19LgotCi1FeGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKLT4+PiBkID0gZGVxdWUoJ2doaScpICAgICAgICAgICAgICAgICAjIG1ha2UgYSBuZXcgZGVxdWUgd2l0aCB0aHJlZSBpdGVtcwotPj4+IGZvciBlbGVtIGluIGQ6ICAgICAgICAgICAgICAgICAgICMgaXRlcmF0ZSBvdmVyIHRoZSBkZXF1ZSdzIGVsZW1lbnRzCi0uLi4gICAgIHByaW50IGVsZW0udXBwZXIoKQkKLUcKLUgKLUkKLQotPj4+IGQuYXBwZW5kKCdqJykgICAgICAgICAgICAgICAgICAgICMgYWRkIGEgbmV3IGVudHJ5IHRvIHRoZSByaWdodCBzaWRlCi0+Pj4gZC5hcHBlbmRsZWZ0KCdmJykgICAgICAgICAgICAgICAgIyBhZGQgYSBuZXcgZW50cnkgdG8gdGhlIGxlZnQgc2lkZQotPj4+IGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2hvdyB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRlcXVlCi1kZXF1ZShbJ2YnLCAnZycsICdoJywgJ2knLCAnaiddKQotCi0+Pj4gZC5wb3AoKSAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXR1cm4gYW5kIHJlbW92ZSB0aGUgcmlnaHRtb3N0IGl0ZW0KLSdqJwotPj4+IGQucG9wbGVmdCgpICAgICAgICAgICAgICAgICAgICAgICMgcmV0dXJuIGFuZCByZW1vdmUgdGhlIGxlZnRtb3N0IGl0ZW0KLSdmJwotPj4+IGxpc3QoZCkgICAgICAgICAgICAgICAgICAgICAgICAgICMgbGlzdCB0aGUgY29udGVudHMgb2YgdGhlIGRlcXVlCi1bJ2cnLCAnaCcsICdpJ10KLT4+PiBkWzBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBlZWsgYXQgbGVmdG1vc3QgaXRlbQotJ2cnCi0+Pj4gZFstMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwZWVrIGF0IHJpZ2h0bW9zdCBpdGVtCi0naScKLQotPj4+IGxpc3QocmV2ZXJzZWQoZCkpICAgICAgICAgICAgICAgICMgbGlzdCB0aGUgY29udGVudHMgb2YgYSBkZXF1ZSBpbiByZXZlcnNlCi1bJ2knLCAnaCcsICdnJ10KLT4+PiAnaCcgaW4gZCAgICAgICAgICAgICAgICAgICAgICAgICAjIHNlYXJjaCB0aGUgZGVxdWUKLVRydWUKLT4+PiBkLmV4dGVuZCgnamtsJykgICAgICAgICAgICAgICAgICAjIGFkZCBtdWx0aXBsZSBlbGVtZW50cyBhdCBvbmNlCi0+Pj4gZAotZGVxdWUoWydnJywgJ2gnLCAnaScsICdqJywgJ2snLCAnbCddKQotPj4+IGQucm90YXRlKDEpICAgICAgICAgICAgICAgICAgICAgICMgcmlnaHQgcm90YXRpb24KLT4+PiBkCi1kZXF1ZShbJ2wnLCAnZycsICdoJywgJ2knLCAnaicsICdrJ10pCi0+Pj4gZC5yb3RhdGUoLTEpICAgICAgICAgICAgICAgICAgICAgIyBsZWZ0IHJvdGF0aW9uCi0+Pj4gZAotZGVxdWUoWydnJywgJ2gnLCAnaScsICdqJywgJ2snLCAnbCddKQotCi0+Pj4gZGVxdWUocmV2ZXJzZWQoZCkpICAgICAgICAgICAgICAgIyBtYWtlIGEgbmV3IGRlcXVlIGluIHJldmVyc2Ugb3JkZXIKLWRlcXVlKFsnbCcsICdrJywgJ2onLCAnaScsICdoJywgJ2cnXSkKLT4+PiBkLmNsZWFyKCkgICAgICAgICAgICAgICAgICAgICAgICAjIGVtcHR5IHRoZSBkZXF1ZQotPj4+IGQucG9wKCkgICAgICAgICAgICAgICAgICAgICAgICAgICMgY2Fubm90IHBvcCBmcm9tIGFuIGVtcHR5IGRlcXVlCi1UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gIEZpbGUgIjxweXNoZWxsIzY+IiwgbGluZSAxLCBpbiAtdG9wbGV2ZWwtCi0gICAgZC5wb3AoKQotSW5kZXhFcnJvcjogcG9wIGZyb20gYW4gZW1wdHkgZGVxdWUKLQotPj4+IGQuZXh0ZW5kbGVmdCgnYWJjJykgICAgICAgICAgICAgICMgZXh0ZW5kbGVmdCgpIHJldmVyc2VzIHRoZSBpbnB1dCBvcmRlcgotPj4+IGQKLWRlcXVlKFsnYycsICdiJywgJ2EnXSkKLVxlbmR7dmVyYmF0aW19Ci0KLVxzdWJzdWJzZWN0aW9ue1JlY2lwZXMgXGxhYmVse2RlcXVlLXJlY2lwZXN9fQotCi1UaGlzIHNlY3Rpb24gc2hvd3MgdmFyaW91cyBhcHByb2FjaGVzIHRvIHdvcmtpbmcgd2l0aCBkZXF1ZXMuCi0KLVRoZSBcbWV0aG9ke3JvdGF0ZSgpfSBtZXRob2QgcHJvdmlkZXMgYSB3YXkgdG8gaW1wbGVtZW50IFxjbGFzc3tkZXF1ZX0KLXNsaWNpbmcgYW5kIGRlbGV0aW9uLiAgRm9yIGV4YW1wbGUsIGEgcHVyZSBweXRob24gaW1wbGVtZW50YXRpb24gb2YKLVxjb2Rle2RlbCBkW25dfSByZWxpZXMgb24gdGhlIFxtZXRob2R7cm90YXRlKCl9IG1ldGhvZCB0byBwb3NpdGlvbgotZWxlbWVudHMgdG8gYmUgcG9wcGVkOgotICAgIAotXGJlZ2lue3ZlcmJhdGltfQotZGVmIGRlbGV0ZV9udGgoZCwgbik6Ci0gICAgZC5yb3RhdGUoLW4pCi0gICAgZC5wb3BsZWZ0KCkKLSAgICBkLnJvdGF0ZShuKQotXGVuZHt2ZXJiYXRpbX0KLQotVG8gaW1wbGVtZW50IFxjbGFzc3tkZXF1ZX0gc2xpY2luZywgdXNlIGEgc2ltaWxhciBhcHByb2FjaCBhcHBseWluZwotXG1ldGhvZHtyb3RhdGUoKX0gdG8gYnJpbmcgYSB0YXJnZXQgZWxlbWVudCB0byB0aGUgbGVmdCBzaWRlIG9mIHRoZSBkZXF1ZS4KLVJlbW92ZSBvbGQgZW50cmllcyB3aXRoIFxtZXRob2R7cG9wbGVmdCgpfSwgYWRkIG5ldyBlbnRyaWVzIHdpdGgKLVxtZXRob2R7ZXh0ZW5kKCl9LCBhbmQgdGhlbiByZXZlcnNlIHRoZSByb3RhdGlvbi4KLQotV2l0aCBtaW5vciB2YXJpYXRpb25zIG9uIHRoYXQgYXBwcm9hY2gsIGl0IGlzIGVhc3kgdG8gaW1wbGVtZW50IEZvcnRoIHN0eWxlCi1zdGFjayBtYW5pcHVsYXRpb25zIHN1Y2ggYXMgXGNvZGV7ZHVwfSwgXGNvZGV7ZHJvcH0sIFxjb2Rle3N3YXB9LCBcY29kZXtvdmVyfSwKLVxjb2Rle3BpY2t9LCBcY29kZXtyb3R9LCBhbmQgXGNvZGV7cm9sbH0uCi0KLUEgcm91bmRyb2JpbiB0YXNrIHNlcnZlciBjYW4gYmUgYnVpbHQgZnJvbSBhIFxjbGFzc3tkZXF1ZX0gdXNpbmcKLVxtZXRob2R7cG9wbGVmdCgpfSB0byBzZWxlY3QgdGhlIGN1cnJlbnQgdGFzayBhbmQgXG1ldGhvZHthcHBlbmQoKX0KLXRvIGFkZCBpdCBiYWNrIHRvIHRoZSB0YXNrbGlzdCBpZiB0aGUgaW5wdXQgc3RyZWFtIGlzIG5vdCBleGhhdXN0ZWQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWRlZiByb3VuZHJvYmluKCppdGVyYWJsZXMpOgotICAgIHBlbmRpbmcgPSBkZXF1ZShpdGVyKGkpIGZvciBpIGluIGl0ZXJhYmxlcykKLSAgICB3aGlsZSBwZW5kaW5nOgotICAgICAgICB0YXNrID0gcGVuZGluZy5wb3BsZWZ0KCkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgeWllbGQgbmV4dCh0YXNrKQotICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIHBlbmRpbmcuYXBwZW5kKHRhc2spCi0KLT4+PiBmb3IgdmFsdWUgaW4gcm91bmRyb2JpbignYWJjJywgJ2QnLCAnZWZnaCcpOgotLi4uICAgICBwcmludCB2YWx1ZQotCi1hCi1kCi1lCi1iCi1mCi1jCi1nCi1oCi0KLVxlbmR7dmVyYmF0aW19Ci0KLQotTXVsdGktcGFzcyBkYXRhIHJlZHVjdGlvbiBhbGdvcml0aG1zIGNhbiBiZSBzdWNjaW5jdGx5IGV4cHJlc3NlZCBhbmQKLWVmZmljaWVudGx5IGNvZGVkIGJ5IGV4dHJhY3RpbmcgZWxlbWVudHMgd2l0aCBtdWx0aXBsZSBjYWxscyB0bwotXG1ldGhvZHtwb3BsZWZ0KCl9LCBhcHBseWluZyB0aGUgcmVkdWN0aW9uIGZ1bmN0aW9uLCBhbmQgY2FsbGluZwotXG1ldGhvZHthcHBlbmQoKX0gdG8gYWRkIHRoZSByZXN1bHQgYmFjayB0byB0aGUgcXVldWUuCi0KLUZvciBleGFtcGxlLCBidWlsZGluZyBhIGJhbGFuY2VkIGJpbmFyeSB0cmVlIG9mIG5lc3RlZCBsaXN0cyBlbnRhaWxzCi1yZWR1Y2luZyB0d28gYWRqYWNlbnQgbm9kZXMgaW50byBvbmUgYnkgZ3JvdXBpbmcgdGhlbSBpbiBhIGxpc3Q6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWRlZiBtYWtldHJlZShpdGVyYWJsZSk6Ci0gICAgZCA9IGRlcXVlKGl0ZXJhYmxlKQotICAgIHdoaWxlIGxlbihkKSA+IDE6Ci0gICAgICAgIHBhaXIgPSBbZC5wb3BsZWZ0KCksIGQucG9wbGVmdCgpXQotICAgICAgICBkLmFwcGVuZChwYWlyKQotICAgIHJldHVybiBsaXN0KGQpCi0KLT4+PiBwcmludCBtYWtldHJlZSgnYWJjZGVmZ2gnKQotW1tbWydhJywgJ2InXSwgWydjJywgJ2QnXV0sIFtbJ2UnLCAnZiddLCBbJ2cnLCAnaCddXV1dCi0KLVxlbmR7dmVyYmF0aW19Ci0KLQotCi1cc3Vic2VjdGlvbntcY2xhc3N7ZGVmYXVsdGRpY3R9IG9iamVjdHMgXGxhYmVse2RlZmF1bHRkaWN0LW9iamVjdHN9fQotCi1cYmVnaW57Y2xhc3NkZXNjfXtkZWZhdWx0ZGljdH17XG9wdGlvbmFse2RlZmF1bHRfZmFjdG9yeVxvcHRpb25hbHssIC4uLn19fQotICBSZXR1cm5zIGEgbmV3IGRpY3Rpb25hcnktbGlrZSBvYmplY3QuICBcY2xhc3N7ZGVmYXVsdGRpY3R9IGlzIGEgc3ViY2xhc3MKLSAgb2YgdGhlIGJ1aWx0aW4gXGNsYXNze2RpY3R9IGNsYXNzLiAgSXQgb3ZlcnJpZGVzIG9uZSBtZXRob2QgYW5kIGFkZHMgb25lCi0gIHdyaXRhYmxlIGluc3RhbmNlIHZhcmlhYmxlLiAgVGhlIHJlbWFpbmluZyBmdW5jdGlvbmFsaXR5IGlzIHRoZSBzYW1lIGFzCi0gIGZvciB0aGUgXGNsYXNze2RpY3R9IGNsYXNzIGFuZCBpcyBub3QgZG9jdW1lbnRlZCBoZXJlLgotCi0gIFRoZSBmaXJzdCBhcmd1bWVudCBwcm92aWRlcyB0aGUgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlCi0gIFxtZW1iZXJ7ZGVmYXVsdF9mYWN0b3J5fSBhdHRyaWJ1dGU7IGl0IGRlZmF1bHRzIHRvIFxjb2Rle05vbmV9LgotICBBbGwgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdHJlYXRlZCB0aGUgc2FtZSBhcyBpZiB0aGV5IHdlcmUKLSAgcGFzc2VkIHRvIHRoZSBcY2xhc3N7ZGljdH0gY29uc3RydWN0b3IsIGluY2x1ZGluZyBrZXl3b3JkIGFyZ3VtZW50cy4KLQotIFx2ZXJzaW9uYWRkZWR7Mi41fQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxjbGFzc3tkZWZhdWx0ZGljdH0gb2JqZWN0cyBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgbWV0aG9kIGluIGFkZGl0aW9uIHRvCi10aGUgc3RhbmRhcmQgXGNsYXNze2RpY3R9IG9wZXJhdGlvbnM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtfX21pc3NpbmdfX317a2V5fQotICBJZiB0aGUgXG1lbWJlcntkZWZhdWx0X2ZhY3Rvcnl9IGF0dHJpYnV0ZSBpcyBcY29kZXtOb25lfSwgdGhpcyByYWlzZXMKLSAgYW4gXGV4Y2VwdGlvbntLZXlFcnJvcn0gZXhjZXB0aW9uIHdpdGggdGhlIFx2YXJ7a2V5fSBhcyBhcmd1bWVudC4KLQotICBJZiBcbWVtYmVye2RlZmF1bHRfZmFjdG9yeX0gaXMgbm90IFxjb2Rle05vbmV9LCBpdCBpcyBjYWxsZWQgd2l0aG91dAotICBhcmd1bWVudHMgdG8gcHJvdmlkZSBhIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBnaXZlbiBcdmFye2tleX0sIHRoaXMKLSAgdmFsdWUgaXMgaW5zZXJ0ZWQgaW4gdGhlIGRpY3Rpb25hcnkgZm9yIHRoZSBcdmFye2tleX0sIGFuZCByZXR1cm5lZC4KLQotICBJZiBjYWxsaW5nIFxtZW1iZXJ7ZGVmYXVsdF9mYWN0b3J5fSByYWlzZXMgYW4gZXhjZXB0aW9uIHRoaXMgZXhjZXB0aW9uCi0gIGlzIHByb3BhZ2F0ZWQgdW5jaGFuZ2VkLgotCi0gIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgXG1ldGhvZHtfX2dldGl0ZW1fX30gbWV0aG9kIG9mIHRoZQotICBcY2xhc3N7ZGljdH0gY2xhc3Mgd2hlbiB0aGUgcmVxdWVzdGVkIGtleSBpcyBub3QgZm91bmQ7IHdoYXRldmVyIGl0Ci0gIHJldHVybnMgb3IgcmFpc2VzIGlzIHRoZW4gcmV0dXJuZWQgb3IgcmFpc2VkIGJ5IFxtZXRob2R7X19nZXRpdGVtX199LgotXGVuZHttZXRob2RkZXNjfQotCi1cY2xhc3N7ZGVmYXVsdGRpY3R9IG9iamVjdHMgc3VwcG9ydCB0aGUgZm9sbG93aW5nIGluc3RhbmNlIHZhcmlhYmxlOgotCi1cYmVnaW57bWVtYmVyZGVzY317ZGVmYXVsdF9mYWN0b3J5fQotICBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGJ5IHRoZSBcbWV0aG9ke19fbWlzc2luZ19ffSBtZXRob2Q7IGl0IGlzIGluaXRpYWxpemVkCi0gIGZyb20gdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBjb25zdHJ1Y3RvciwgaWYgcHJlc2VudCwgb3IgdG8gXGNvZGV7Tm9uZX0sIAotICBpZiBhYnNlbnQuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLQotXHN1YnN1YnNlY3Rpb257XGNsYXNze2RlZmF1bHRkaWN0fSBFeGFtcGxlcyBcbGFiZWx7ZGVmYXVsdGRpY3QtZXhhbXBsZXN9fQotCi1Vc2luZyBcY2xhc3N7bGlzdH0gYXMgdGhlIFxtZW1iZXJ7ZGVmYXVsdF9mYWN0b3J5fSwgaXQgaXMgZWFzeSB0byBncm91cAotYSBzZXF1ZW5jZSBvZiBrZXktdmFsdWUgcGFpcnMgaW50byBhIGRpY3Rpb25hcnkgb2YgbGlzdHM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBzID0gWygneWVsbG93JywgMSksICgnYmx1ZScsIDIpLCAoJ3llbGxvdycsIDMpLCAoJ2JsdWUnLCA0KSwgKCdyZWQnLCAxKV0KLT4+PiBkID0gZGVmYXVsdGRpY3QobGlzdCkKLT4+PiBmb3IgaywgdiBpbiBzOgotICAgICAgICBkW2tdLmFwcGVuZCh2KQotCi0+Pj4gZC5pdGVtcygpCi1bKCdibHVlJywgWzIsIDRdKSwgKCdyZWQnLCBbMV0pLCAoJ3llbGxvdycsIFsxLCAzXSldCi1cZW5ke3ZlcmJhdGltfQotCi1XaGVuIGVhY2gga2V5IGlzIGVuY291bnRlcmVkIGZvciB0aGUgZmlyc3QgdGltZSwgaXQgaXMgbm90IGFscmVhZHkgaW4gdGhlCi1tYXBwaW5nOyBzbyBhbiBlbnRyeSBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgdXNpbmcgdGhlCi1cbWVtYmVye2RlZmF1bHRfZmFjdG9yeX0gZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBlbXB0eSBcY2xhc3N7bGlzdH0uICBUaGUKLVxtZXRob2R7bGlzdC5hcHBlbmQoKX0gb3BlcmF0aW9uIHRoZW4gYXR0YWNoZXMgdGhlIHZhbHVlIHRvIHRoZSBuZXcgbGlzdC4gIFdoZW4KLWtleXMgYXJlIGVuY291bnRlcmVkIGFnYWluLCB0aGUgbG9vay11cCBwcm9jZWVkcyBub3JtYWxseSAocmV0dXJuaW5nIHRoZSBsaXN0Ci1mb3IgdGhhdCBrZXkpIGFuZCB0aGUgXG1ldGhvZHtsaXN0LmFwcGVuZCgpfSBvcGVyYXRpb24gYWRkcyBhbm90aGVyIHZhbHVlIHRvCi10aGUgbGlzdC4gVGhpcyB0ZWNobmlxdWUgaXMgc2ltcGxlciBhbmQgZmFzdGVyIHRoYW4gYW4gZXF1aXZhbGVudCB0ZWNobmlxdWUKLXVzaW5nIFxtZXRob2R7ZGljdC5zZXRkZWZhdWx0KCl9OgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZCA9IHt9Ci0+Pj4gZm9yIGssIHYgaW4gczoKLQlkLnNldGRlZmF1bHQoaywgW10pLmFwcGVuZCh2KQotCi0+Pj4gZC5pdGVtcygpCi1bKCdibHVlJywgWzIsIDRdKSwgKCdyZWQnLCBbMV0pLCAoJ3llbGxvdycsIFsxLCAzXSldCi1cZW5ke3ZlcmJhdGltfQotCi1TZXR0aW5nIHRoZSBcbWVtYmVye2RlZmF1bHRfZmFjdG9yeX0gdG8gXGNsYXNze2ludH0gbWFrZXMgdGhlCi1cY2xhc3N7ZGVmYXVsdGRpY3R9IHVzZWZ1bCBmb3IgY291bnRpbmcgKGxpa2UgYSBiYWcgb3IgbXVsdGlzZXQgaW4gb3RoZXIKLWxhbmd1YWdlcyk6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBzID0gJ21pc3Npc3NpcHBpJwotPj4+IGQgPSBkZWZhdWx0ZGljdChpbnQpCi0+Pj4gZm9yIGsgaW4gczoKLSAgICAgICAgZFtrXSArPSAxCi0KLT4+PiBkLml0ZW1zKCkKLVsoJ2knLCA0KSwgKCdwJywgMiksICgncycsIDQpLCAoJ20nLCAxKV0KLVxlbmR7dmVyYmF0aW19Ci0KLVdoZW4gYSBsZXR0ZXIgaXMgZmlyc3QgZW5jb3VudGVyZWQsIGl0IGlzIG1pc3NpbmcgZnJvbSB0aGUgbWFwcGluZywgc28gdGhlCi1cbWVtYmVye2RlZmF1bHRfZmFjdG9yeX0gZnVuY3Rpb24gY2FsbHMgXGZ1bmN0aW9ue2ludCgpfSB0byBzdXBwbHkgYSBkZWZhdWx0Ci1jb3VudCBvZiB6ZXJvLiAgVGhlIGluY3JlbWVudCBvcGVyYXRpb24gdGhlbiBidWlsZHMgdXAgdGhlIGNvdW50IGZvciBlYWNoCi1sZXR0ZXIuCi0KLVRoZSBmdW5jdGlvbiBcZnVuY3Rpb257aW50KCl9IHdoaWNoIGFsd2F5cyByZXR1cm5zIHplcm8gaXMganVzdCBhIHNwZWNpYWwKLWNhc2Ugb2YgY29uc3RhbnQgZnVuY3Rpb25zLiAgQSBmYXN0ZXIgYW5kIG1vcmUgZmxleGlibGUgd2F5IHRvIGNyZWF0ZQotY29uc3RhbnQgZnVuY3Rpb25zIGlzIHRvIHVzZSBhIGxhbWJkYSBmdW5jdGlvbiB3aGljaCBjYW4gc3VwcGx5Ci1hbnkgY29uc3RhbnQgdmFsdWUgKG5vdCBqdXN0IHplcm8pOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZGVmIGNvbnN0YW50X2ZhY3RvcnkodmFsdWUpOgotLi4uICAgICByZXR1cm4gbGFtYmRhOiB2YWx1ZQotPj4+IGQgPSBkZWZhdWx0ZGljdChjb25zdGFudF9mYWN0b3J5KCc8bWlzc2luZz4nKSkKLT4+PiBkLnVwZGF0ZShuYW1lPSdKb2huJywgYWN0aW9uPSdyYW4nKQotPj4+ICclKG5hbWUpcyAlKGFjdGlvbilzIHRvICUob2JqZWN0KXMnICUgZAotJ0pvaG4gcmFuIHRvIDxtaXNzaW5nPicKLVxlbmR7dmVyYmF0aW19Ci0KLVNldHRpbmcgdGhlIFxtZW1iZXJ7ZGVmYXVsdF9mYWN0b3J5fSB0byBcY2xhc3N7c2V0fSBtYWtlcyB0aGUKLVxjbGFzc3tkZWZhdWx0ZGljdH0gdXNlZnVsIGZvciBidWlsZGluZyBhIGRpY3Rpb25hcnkgb2Ygc2V0czoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHMgPSBbKCdyZWQnLCAxKSwgKCdibHVlJywgMiksICgncmVkJywgMyksICgnYmx1ZScsIDQpLCAoJ3JlZCcsIDEpLCAoJ2JsdWUnLCA0KV0KLT4+PiBkID0gZGVmYXVsdGRpY3Qoc2V0KQotPj4+IGZvciBrLCB2IGluIHM6Ci0gICAgICAgIGRba10uYWRkKHYpCi0KLT4+PiBkLml0ZW1zKCkKLVsoJ2JsdWUnLCBzZXQoWzIsIDRdKSksICgncmVkJywgc2V0KFsxLCAzXSkpXQotXGVuZHt2ZXJiYXRpbX0KLQotCi0KLVxzdWJzZWN0aW9ue1xmdW5jdGlvbntOYW1lZFR1cGxlfSBkYXRhdHlwZSBmYWN0b3J5IGZ1bmN0aW9uIFxsYWJlbHtuYW1lZC10dXBsZS1mYWN0b3J5fX0KLQotXGJlZ2lue2Z1bmNkZXNjfXtOYW1lZFR1cGxlfXt0eXBlbmFtZSwgZmllbGRuYW1lc30KLSAgUmV0dXJucyBhIG5ldyB0dXBsZSBzdWJjbGFzcyBuYW1lZCBcdmFye3R5cGVuYW1lfS4gIFRoZSBuZXcgc3ViY2xhc3MgaXMgdXNlZAotICB0byBjcmVhdGUgdHVwbGUtbGlrZSBvYmplY3RzIHRoYXQgaGF2ZSBmaWVsZHMgYWNjZXNzYWJsZSBieSBhdHRyaWJ1dGUKLSAgbG9va3VwIGFzIHdlbGwgYXMgYmVpbmcgaW5kZXhhYmxlIGFuZCBpdGVyYWJsZS4gIEluc3RhbmNlcyBvZiB0aGUgc3ViY2xhc3MKLSAgYWxzbyBoYXZlIGEgaGVscGZ1bCBkb2NzdHJpbmcgKHdpdGggdHlwZW5hbWUgYW5kIGZpZWxkbmFtZXMpIGFuZCBhIGhlbHBmdWwKLSAgXG1ldGhvZHtfX3JlcHJfXygpfSBtZXRob2Qgd2hpY2ggbGlzdHMgdGhlIHR1cGxlIGNvbnRlbnRzIGluIGEgXGNvZGV7bmFtZT12YWx1ZX0KLSAgZm9ybWF0LgotICBcdmVyc2lvbmFkZGVkezIuNn0KLQotICBUaGUgXHZhcntmaWVsZG5hbWVzfSBhcmUgc3BlY2lmaWVkIGluIGEgc2luZ2xlIHN0cmluZyBhbmQgYXJlIHNlcGFyYXRlZCBieSBzcGFjZXMuCi0gIEFueSB2YWxpZCBQeXRob24gaWRlbnRpZmllciBtYXkgYmUgdXNlZCBmb3IgYSBmaWVsZCBuYW1lLgotCi0gIEV4YW1wbGU6Ci0gIFxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBQb2ludCA9IE5hbWVkVHVwbGUoJ1BvaW50JywgJ3ggeScpCi0+Pj4gUG9pbnQuX19kb2NfXyAgICAgICAgICAgIyBkb2NzdHJpbmcgZm9yIHRoZSBuZXcgZGF0YXR5cGUKLSdQb2ludCh4LCB5KScKLT4+PiBwID0gUG9pbnQoMTEsIHk9MjIpICAgICAjIGluc3RhbnRpYXRlIHdpdGggcG9zaXRpb25hbCBvciBrZXl3b3JkIGFyZ3VtZW50cwotPj4+IHBbMF0gKyBwWzFdICAgICAgICAgICAgICMgd29ya3MganVzdCBsaWtlIHRoZSB0dXBsZSAoMTEsIDIyKQotMzMKLT4+PiB4LCB5ID0gcCAgICAgICAgICAgICAgICAjIHVucGFja3MganVzdCBsaWtlIGEgdHVwbGUKLT4+PiB4LCB5Ci0oMTEsIDIyKQotPj4+IHAueCArIHAueSAgICAgICAgICAgICAgICMgZmllbGRzIGFsc28gYWNjZXNzYWJsZSBieSBuYW1lCi0zMwotPj4+IHAgICAgICAgICAgICAgICAgICAgICAgICMgcmVhZGFibGUgX19yZXByX18gd2l0aCBuYW1lPXZhbHVlIHN0eWxlCi1Qb2ludCh4PTExLCB5PTIyKSAgCi1cZW5ke3ZlcmJhdGltfQotCi0gIFRoZSB1c2UgY2FzZXMgYXJlIHRoZSBzYW1lIGFzIHRob3NlIGZvciB0dXBsZXMuICBUaGUgbmFtZWQgZmFjdG9yaWVzCi0gIGFzc2lnbiBtZWFuaW5nIHRvIGVhY2ggdHVwbGUgcG9zaXRpb24gYW5kIGFsbG93IGZvciBtb3JlIHJlYWRhYmxlLAotICBzZWxmLWRvY3VtZW50aW5nIGNvZGUuICBOYW1lZCB0dXBsZXMgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NpZ24gZmllbGQgbmFtZXMgCi0gIHRvIHR1cGxlcyByZXR1cm5lZCBieSB0aGUgXG1vZHVsZXtjc3Z9IG9yIFxtb2R1bGV7c3FsaXRlM30gbW9kdWxlcy4KLSAgRm9yIGV4YW1wbGU6Ci0KLSAgXGJlZ2lue3ZlcmJhdGltfQotZnJvbSBpdGVydG9vbHMgaW1wb3J0IHN0YXJtYXAKLWltcG9ydCBjc3YKLUVtcGxveWVlUmVjb3JkID0gTmFtZWRUdXBsZSgnRW1wbG95ZWVSZWNvcmQnLCAnbmFtZSBhZ2UgdGl0bGUgZGVwYXJ0bWVudCBwYXlncmFkZScpCi1mb3IgcmVjb3JkIGluIHN0YXJtYXAoRW1wbG95ZWVSZWNvcmQsIGNzdi5yZWFkZXIob3BlbigiZW1wbG95ZWVzLmNzdiIsICJyYiIpKSk6Ci0gICAgcHJpbnQgcmVjb3JkCi1cZW5ke3ZlcmJhdGltfQotCi0gIFRvIGNhc3QgYW4gaW5kaXZpZHVhbCByZWNvcmQgc3RvcmVkIGFzIFxjbGFzc3tsaXN0fSwgXGNsYXNze3R1cGxlfSwgb3Igc29tZSBvdGhlcgotICBpdGVyYWJsZSB0eXBlLCB1c2UgdGhlIHN0YXItb3BlcmF0b3IgdG8gdW5wYWNrIHRoZSB2YWx1ZXM6Ci0KLSAgXGJlZ2lue3ZlcmJhdGltfQotPj4+IENvbG9yID0gTmFtZWRUdXBsZSgnQ29sb3InLCAnbmFtZSBjb2RlJykKLT4+PiBtID0gZGljdChyZWQ9MSwgZ3JlZW49MiwgYmx1ZT0zKQotPj4+IHByaW50IENvbG9yKCptLnBvcGl0ZW0oKSkKLUNvbG9yKG5hbWU9J2JsdWUnLCBjb2RlPTMpCi1cZW5ke3ZlcmJhdGltfQotCi1cZW5ke2Z1bmNkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJjb2xvcnN5cy50ZXggYi9Eb2MvbGliL2xpYmNvbG9yc3lzLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc0ODM3Ny4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmNvbG9yc3lzLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7Y29sb3JzeXN9IC0tLQotICAgICAgICAgQ29udmVyc2lvbnMgYmV0d2VlbiBjb2xvciBzeXN0ZW1zfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17Y29sb3JzeXN9Ci1cbW9kdWxlc3lub3BzaXN7Q29udmVyc2lvbiBmdW5jdGlvbnMgYmV0d2VlbiBSR0IgYW5kIG90aGVyIGNvbG9yIHN5c3RlbXMufQotXHNlY3Rpb25hdXRob3J7RGF2aWQgQXNjaGVyfXtkYUBweXRob24ubmV0fQotCi1UaGUgXG1vZHVsZXtjb2xvcnN5c30gbW9kdWxlIGRlZmluZXMgYmlkaXJlY3Rpb25hbCBjb252ZXJzaW9ucyBvZgotY29sb3IgdmFsdWVzIGJldHdlZW4gY29sb3JzIGV4cHJlc3NlZCBpbiB0aGUgUkdCIChSZWQgR3JlZW4gQmx1ZSkKLWNvbG9yIHNwYWNlIHVzZWQgaW4gY29tcHV0ZXIgbW9uaXRvcnMgYW5kIHRocmVlIG90aGVyIGNvb3JkaW5hdGUKLXN5c3RlbXM6IFlJUSwgSExTIChIdWUgTGlnaHRuZXNzIFNhdHVyYXRpb24pIGFuZCBIU1YgKEh1ZSBTYXR1cmF0aW9uCi1WYWx1ZSkuICBDb29yZGluYXRlcyBpbiBhbGwgb2YgdGhlc2UgY29sb3Igc3BhY2VzIGFyZSBmbG9hdGluZyBwb2ludAotdmFsdWVzLiAgSW4gdGhlIFlJUSBzcGFjZSwgdGhlIFkgY29vcmRpbmF0ZSBpcyBiZXR3ZWVuIDAgYW5kIDEsIGJ1dAotdGhlIEkgYW5kIFEgY29vcmRpbmF0ZXMgY2FuIGJlIHBvc2l0aXZlIG9yIG5lZ2F0aXZlLiAgSW4gYWxsIG90aGVyCi1zcGFjZXMsIHRoZSBjb29yZGluYXRlcyBhcmUgYWxsIGJldHdlZW4gMCBhbmQgMS4KLQotTW9yZSBpbmZvcm1hdGlvbiBhYm91dCBjb2xvciBzcGFjZXMgY2FuIGJlIGZvdW5kIGF0IAotXHVybHtodHRwOi8vd3d3LnBveW50b24uY29tL0NvbG9yRkFRLmh0bWx9LgotCi1UaGUgXG1vZHVsZXtjb2xvcnN5c30gbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6Ci0KLVxiZWdpbntmdW5jZGVzY317cmdiX3RvX3lpcX17ciwgZywgYn0KLUNvbnZlcnQgdGhlIGNvbG9yIGZyb20gUkdCIGNvb3JkaW5hdGVzIHRvIFlJUSBjb29yZGluYXRlcy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317eWlxX3RvX3JnYn17eSwgaSwgcX0KLUNvbnZlcnQgdGhlIGNvbG9yIGZyb20gWUlRIGNvb3JkaW5hdGVzIHRvIFJHQiBjb29yZGluYXRlcy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cmdiX3RvX2hsc317ciwgZywgYn0KLUNvbnZlcnQgdGhlIGNvbG9yIGZyb20gUkdCIGNvb3JkaW5hdGVzIHRvIEhMUyBjb29yZGluYXRlcy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aGxzX3RvX3JnYn17aCwgbCwgc30KLUNvbnZlcnQgdGhlIGNvbG9yIGZyb20gSExTIGNvb3JkaW5hdGVzIHRvIFJHQiBjb29yZGluYXRlcy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cmdiX3RvX2hzdn17ciwgZywgYn0KLUNvbnZlcnQgdGhlIGNvbG9yIGZyb20gUkdCIGNvb3JkaW5hdGVzIHRvIEhTViBjb29yZGluYXRlcy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aHN2X3RvX3JnYn17aCwgcywgdn0KLUNvbnZlcnQgdGhlIGNvbG9yIGZyb20gSFNWIGNvb3JkaW5hdGVzIHRvIFJHQiBjb29yZGluYXRlcy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLUV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgY29sb3JzeXMKLT4+PiBjb2xvcnN5cy5yZ2JfdG9faHN2KC4zLCAuNCwgLjIpCi0oMC4yNSwgMC41LCAwLjQpCi0+Pj4gY29sb3JzeXMuaHN2X3RvX3JnYigwLjI1LCAwLjUsIDAuNCkKLSgwLjMsIDAuNCwgMC4yKQotXGVuZHt2ZXJiYXRpbX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliY29tbWFuZHMudGV4IGIvRG9jL2xpYi9saWJjb21tYW5kcy50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNWZhNTUuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJjb21tYW5kcy50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle2NvbW1hbmRzfSAtLS0KLSAgICAgICAgIFV0aWxpdGllcyBmb3IgcnVubmluZyBjb21tYW5kc30KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2NvbW1hbmRzfQotICBccGxhdGZvcm17VW5peH0KLVxtb2R1bGVzeW5vcHNpc3tVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgcnVubmluZyBleHRlcm5hbCBjb21tYW5kcy59Ci1cc2VjdGlvbmF1dGhvcntTdWUgV2lsbGlhbXN9e3Nid0Bwcm92aXMuY29tfQotCi0KLVRoZSBcbW9kdWxle2NvbW1hbmRzfSBtb2R1bGUgY29udGFpbnMgd3JhcHBlciBmdW5jdGlvbnMgZm9yCi1cZnVuY3Rpb257b3MucG9wZW4oKX0gd2hpY2ggdGFrZSBhIHN5c3RlbSBjb21tYW5kIGFzIGEgc3RyaW5nIGFuZAotcmV0dXJuIGFueSBvdXRwdXQgZ2VuZXJhdGVkIGJ5IHRoZSBjb21tYW5kIGFuZCwgb3B0aW9uYWxseSwgdGhlIGV4aXQKLXN0YXR1cy4KLQotVGhlIFxtb2R1bGV7c3VicHJvY2Vzc30gbW9kdWxlIHByb3ZpZGVzIG1vcmUgcG93ZXJmdWwgZmFjaWxpdGllcyBmb3IKLXNwYXduaW5nIG5ldyBwcm9jZXNzZXMgYW5kIHJldHJpZXZpbmcgdGhlaXIgcmVzdWx0cy4gIFVzaW5nIHRoZQotXG1vZHVsZXtzdWJwcm9jZXNzfSBtb2R1bGUgaXMgcHJlZmVyYWJsZSB0byB1c2luZyB0aGUgXG1vZHVsZXtjb21tYW5kc30KLW1vZHVsZS4KLQotVGhlIFxtb2R1bGV7Y29tbWFuZHN9IG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgotCi0KLVxiZWdpbntmdW5jZGVzY317Z2V0c3RhdHVzb3V0cHV0fXtjbWR9Ci1FeGVjdXRlIHRoZSBzdHJpbmcgXHZhcntjbWR9IGluIGEgc2hlbGwgd2l0aCBcZnVuY3Rpb257b3MucG9wZW4oKX0gYW5kCi1yZXR1cm4gYSAyLXR1cGxlIFxjb2RleyhcdmFye3N0YXR1c30sIFx2YXJ7b3V0cHV0fSl9LiAgXHZhcntjbWR9IGlzCi1hY3R1YWxseSBydW4gYXMgXGNvZGV7XHsgXHZhcntjbWR9IDsgXH0gMj5cJjF9LCBzbyB0aGF0IHRoZSByZXR1cm5lZAotb3V0cHV0IHdpbGwgY29udGFpbiBvdXRwdXQgb3IgZXJyb3IgbWVzc2FnZXMuIEEgdHJhaWxpbmcgbmV3bGluZSBpcwotc3RyaXBwZWQgZnJvbSB0aGUgb3V0cHV0LiBUaGUgZXhpdCBzdGF0dXMgZm9yIHRoZSBjb21tYW5kIGNhbiBiZQotaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBmb3IgdGhlIEMgZnVuY3Rpb24KLVxjZnVuY3Rpb257d2FpdCgpfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0b3V0cHV0fXtjbWR9Ci1MaWtlIFxmdW5jdGlvbntnZXRzdGF0dXNvdXRwdXQoKX0sIGV4Y2VwdCB0aGUgZXhpdCBzdGF0dXMgaXMgaWdub3JlZAotYW5kIHRoZSByZXR1cm4gdmFsdWUgaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgY29tbWFuZCdzIG91dHB1dC4gIAotXGVuZHtmdW5jZGVzY30KLQotRXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGltcG9ydCBjb21tYW5kcwotPj4+IGNvbW1hbmRzLmdldHN0YXR1c291dHB1dCgnbHMgL2Jpbi9scycpCi0oMCwgJy9iaW4vbHMnKQotPj4+IGNvbW1hbmRzLmdldHN0YXR1c291dHB1dCgnY2F0IC9iaW4vanVuaycpCi0oMjU2LCAnY2F0OiAvYmluL2p1bms6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnknKQotPj4+IGNvbW1hbmRzLmdldHN0YXR1c291dHB1dCgnL2Jpbi9qdW5rJykKLSgyNTYsICdzaDogL2Jpbi9qdW5rOiBub3QgZm91bmQnKQotPj4+IGNvbW1hbmRzLmdldG91dHB1dCgnbHMgL2Jpbi9scycpCi0nL2Jpbi9scycKLVxlbmR7dmVyYmF0aW19Ci0KLVxiZWdpbntzZWVhbHNvfQotICBcc2VlbW9kdWxle3N1YnByb2Nlc3N9e01vZHVsZSBmb3Igc3Bhd25pbmcgYW5kIG1hbmFnaW5nIHN1YnByb2Nlc3Nlcy59Ci1cZW5ke3NlZWFsc299CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmNvbXBpbGVhbGwudGV4IGIvRG9jL2xpYi9saWJjb21waWxlYWxsLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U5NjY3ZC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmNvbXBpbGVhbGwudGV4CisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtjb21waWxlYWxsfSAtLS0KLSAgICAgICAgIEJ5dGUtY29tcGlsZSBQeXRob24gbGlicmFyaWVzfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17Y29tcGlsZWFsbH0KLVxtb2R1bGVzeW5vcHNpc3tUb29scyBmb3IgYnl0ZS1jb21waWxpbmcgYWxsIFB5dGhvbiBzb3VyY2UgZmlsZXMgaW4gYQotICAgICAgICAgICAgICAgIGRpcmVjdG9yeSB0cmVlLn0KLQotCi1UaGlzIG1vZHVsZSBwcm92aWRlcyBzb21lIHV0aWxpdHkgZnVuY3Rpb25zIHRvIHN1cHBvcnQgaW5zdGFsbGluZwotUHl0aG9uIGxpYnJhcmllcy4gIFRoZXNlIGZ1bmN0aW9ucyBjb21waWxlIFB5dGhvbiBzb3VyY2UgZmlsZXMgaW4gYQotZGlyZWN0b3J5IHRyZWUsIGFsbG93aW5nIHVzZXJzIHdpdGhvdXQgcGVybWlzc2lvbiB0byB3cml0ZSB0byB0aGUKLWxpYnJhcmllcyB0byB0YWtlIGFkdmFudGFnZSBvZiBjYWNoZWQgYnl0ZS1jb2RlIGZpbGVzLgotCi1UaGUgc291cmNlIGZpbGUgZm9yIHRoaXMgbW9kdWxlIG1heSBhbHNvIGJlIHVzZWQgYXMgYSBzY3JpcHQgdG8KLWNvbXBpbGUgUHl0aG9uIHNvdXJjZXMgaW4gZGlyZWN0b3JpZXMgbmFtZWQgb24gdGhlIGNvbW1hbmQgbGluZSBvciBpbgotXGNvZGV7c3lzLnBhdGh9LgotCi0KLVxiZWdpbntmdW5jZGVzY317Y29tcGlsZV9kaXJ9e2RpclxvcHRpb25hbHssIG1heGxldmVsc1xvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZGlyXG9wdGlvbmFseywgZm9yY2Vcb3B0aW9uYWx7LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ4XG9wdGlvbmFseywgcXVpZXR9fX19fX0KLSAgUmVjdXJzaXZlbHkgZGVzY2VuZCB0aGUgZGlyZWN0b3J5IHRyZWUgbmFtZWQgYnkgXHZhcntkaXJ9LCBjb21waWxpbmcKLSAgYWxsIFxmaWxley5weX0gZmlsZXMgYWxvbmcgdGhlIHdheS4gIFRoZSBcdmFye21heGxldmVsc30gcGFyYW1ldGVyCi0gIGlzIHVzZWQgdG8gbGltaXQgdGhlIGRlcHRoIG9mIHRoZSByZWN1cnNpb247IGl0IGRlZmF1bHRzIHRvCi0gIFxjb2RlezEwfS4gIElmIFx2YXJ7ZGRpcn0gaXMgZ2l2ZW4sIGl0IGlzIHVzZWQgYXMgdGhlIGJhc2UgcGF0aCBmcm9tIAotICB3aGljaCB0aGUgZmlsZW5hbWVzIHVzZWQgaW4gZXJyb3IgbWVzc2FnZXMgd2lsbCBiZSBnZW5lcmF0ZWQuICBJZgotICBcdmFye2ZvcmNlfSBpcyB0cnVlLCBtb2R1bGVzIGFyZSByZS1jb21waWxlZCBldmVuIGlmIHRoZSB0aW1lc3RhbXBzCi0gIGFyZSB1cCB0byBkYXRlLiAKLQotICBJZiBcdmFye3J4fSBpcyBnaXZlbiwgaXQgc3BlY2lmaWVzIGEgcmVndWxhciBleHByZXNzaW9uIG9mIGZpbGUKLSAgbmFtZXMgdG8gZXhjbHVkZSBmcm9tIHRoZSBzZWFyY2g7IHRoYXQgZXhwcmVzc2lvbiBpcyBzZWFyY2hlZCBmb3IgaW4KLSAgdGhlIGZ1bGwgcGF0aC4KLQotICBJZiBcdmFye3F1aWV0fSBpcyB0cnVlLCBub3RoaW5nIGlzIHByaW50ZWQgdG8gdGhlIHN0YW5kYXJkIG91dHB1dAotICBpbiBub3JtYWwgb3BlcmF0aW9uLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtjb21waWxlX3BhdGh9e1xvcHRpb25hbHtza2lwX2N1cmRpclxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4bGV2ZWxzXG9wdGlvbmFseywgZm9yY2V9fX19Ci0gIEJ5dGUtY29tcGlsZSBhbGwgdGhlIFxmaWxley5weX0gZmlsZXMgZm91bmQgYWxvbmcgXGNvZGV7c3lzLnBhdGh9LgotICBJZiBcdmFye3NraXBfY3VyZGlyfSBpcyB0cnVlICh0aGUgZGVmYXVsdCksIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcwotICBub3QgaW5jbHVkZWQgaW4gdGhlIHNlYXJjaC4gIFRoZSBcdmFye21heGxldmVsc30gYW5kCi0gIFx2YXJ7Zm9yY2V9IHBhcmFtZXRlcnMgZGVmYXVsdCB0byBcY29kZXswfSBhbmQgYXJlIHBhc3NlZCB0byB0aGUKLSAgXGZ1bmN0aW9ue2NvbXBpbGVfZGlyKCl9IGZ1bmN0aW9uLgotXGVuZHtmdW5jZGVzY30KLQotVG8gZm9yY2UgYSByZWNvbXBpbGUgb2YgYWxsIHRoZSBcZmlsZXsucHl9IGZpbGVzIGluIHRoZSBcZmlsZXtMaWIvfQotc3ViZGlyZWN0b3J5IGFuZCBhbGwgaXRzIHN1YmRpcmVjdG9yaWVzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgY29tcGlsZWFsbAotCi1jb21waWxlYWxsLmNvbXBpbGVfZGlyKCdMaWIvJywgZm9yY2U9VHJ1ZSkKLQotIyBQZXJmb3JtIHNhbWUgY29tcGlsYXRpb24sIGV4Y2x1ZGluZyBmaWxlcyBpbiAuc3ZuIGRpcmVjdG9yaWVzLgotaW1wb3J0IHJlCi1jb21waWxlYWxsLmNvbXBpbGVfZGlyKCdMaWIvJywgcng9cmUuY29tcGlsZSgnL1suXXN2bicpLCBmb3JjZT1UcnVlKQotXGVuZHt2ZXJiYXRpbX0KLQotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZW1vZHVsZVtweWNvbXBpbGVde3B5X2NvbXBpbGV9e0J5dGUtY29tcGlsZSBhIHNpbmdsZSBzb3VyY2UgZmlsZS59Ci1cZW5ke3NlZWFsc299CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmNvbnN0cy50ZXggYi9Eb2MvbGliL2xpYmNvbnN0cy50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMzYyODEuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJjb25zdHMudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotXHNlY3Rpb257QnVpbHQtaW4gQ29uc3RhbnRzfQotCi1BIHNtYWxsIG51bWJlciBvZiBjb25zdGFudHMgbGl2ZSBpbiB0aGUgYnVpbHQtaW4gbmFtZXNwYWNlLiAgVGhleSBhcmU6Ci0KLVxiZWdpbntkYXRhZGVzY317RmFsc2V9Ci0gIFRoZSBmYWxzZSB2YWx1ZSBvZiB0aGUgXGNsYXNze2Jvb2x9IHR5cGUuCi0gIFx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtUcnVlfQotICBUaGUgdHJ1ZSB2YWx1ZSBvZiB0aGUgXGNsYXNze2Jvb2x9IHR5cGUuCi0gIFx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtOb25lfQotICBUaGUgc29sZSB2YWx1ZSBvZiBcbWVtYmVye1xyZWZtb2R1bGV7dHlwZXN9Lk5vbmVUeXBlfS4gIFxjb2Rle05vbmV9IGlzCi0gIGZyZXF1ZW50bHkgdXNlZCB0byByZXByZXNlbnQgdGhlIGFic2VuY2Ugb2YgYSB2YWx1ZSwgYXMgd2hlbiBkZWZhdWx0Ci0gIGFyZ3VtZW50cyBhcmUgbm90IHBhc3NlZCB0byBhIGZ1bmN0aW9uLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtOb3RJbXBsZW1lbnRlZH0KLSAgU3BlY2lhbCB2YWx1ZSB3aGljaCBjYW4gYmUgcmV0dXJuZWQgYnkgdGhlIGBgcmljaCBjb21wYXJpc29uJycKLSAgc3BlY2lhbCBtZXRob2RzIChcbWV0aG9ke19fZXFfXygpfSwgXG1ldGhvZHtfX2x0X18oKX0sIGFuZCBmcmllbmRzKSwKLSAgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY29tcGFyaXNvbiBpcyBub3QgaW1wbGVtZW50ZWQgd2l0aCByZXNwZWN0IHRvCi0gIHRoZSBvdGhlciB0eXBlLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtFbGxpcHNpc30KLSAgVGhlIHNhbWUgYXMgXGNvZGV7Li4ufS4KLSAgU3BlY2lhbCB2YWx1ZSB1c2VkIG1vc3RseSBpbiBjb25qdW5jdGlvbiB3aXRoIGV4dGVuZGVkIHNsaWNpbmcgc3ludGF4Ci0gIGZvciB1c2VyLWRlZmluZWQgY29udGFpbmVyIGRhdGEgdHlwZXMuCi0gICUgWFhYIFNvbWVvbmUgd2hvIHVuZGVyc3RhbmRzIGV4dGVuZGVkIHNsaWNpbmcgc2hvdWxkIGZpbGwgaW4gaGVyZS4KLVxlbmR7ZGF0YWRlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmNvbnRleHRsaWIudGV4IGIvRG9jL2xpYi9saWJjb250ZXh0bGliLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFjNTQ0Mi4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmNvbnRleHRsaWIudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7Y29udGV4dGxpYn0gLS0tCi0gICAgICAgICBVdGlsaXRpZXMgZm9yIFxrZXl3b3Jke3dpdGh9LXN0YXRlbWVudCBjb250ZXh0cy59Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtjb250ZXh0bGlifQotXG1vZHVsZXN5bm9wc2lze1V0aWxpdGllcyBmb3IgXGtleXdvcmR7d2l0aH0tc3RhdGVtZW50IGNvbnRleHRzLn0KLQotXHZlcnNpb25hZGRlZHsyLjV9Ci0KLVRoaXMgbW9kdWxlIHByb3ZpZGVzIHV0aWxpdGllcyBmb3IgY29tbW9uIHRhc2tzIGludm9sdmluZyB0aGUKLVxrZXl3b3Jke3dpdGh9IHN0YXRlbWVudC4KLQotRnVuY3Rpb25zIHByb3ZpZGVkOgotCi1cYmVnaW57ZnVuY2Rlc2N9e2NvbnRleHRtYW5hZ2VyfXtmdW5jfQotVGhpcyBmdW5jdGlvbiBpcyBhIGRlY29yYXRvciB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhIGZhY3RvcnkKLWZ1bmN0aW9uIGZvciBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQgY29udGV4dCBtYW5hZ2Vycywgd2l0aG91dAotbmVlZGluZyB0byBjcmVhdGUgYSBjbGFzcyBvciBzZXBhcmF0ZSBcbWV0aG9ke19fZW50ZXJfXygpfSBhbmQKLVxtZXRob2R7X19leGl0X18oKX0gbWV0aG9kcy4KLQotQSBzaW1wbGUgZXhhbXBsZSAodGhpcyBpcyBub3QgcmVjb21tZW5kZWQgYXMgYSByZWFsIHdheSBvZgotZ2VuZXJhdGluZyBIVE1MISk6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWZyb20gX19mdXR1cmVfXyBpbXBvcnQgd2l0aF9zdGF0ZW1lbnQKLWZyb20gY29udGV4dGxpYiBpbXBvcnQgY29udGV4dG1hbmFnZXIKLQotQGNvbnRleHRtYW5hZ2VyCi1kZWYgdGFnKG5hbWUpOgotICAgIHByaW50ICI8JXM+IiAlIG5hbWUKLSAgICB5aWVsZAotICAgIHByaW50ICI8LyVzPiIgJSBuYW1lCi0KLT4+PiB3aXRoIHRhZygiaDEiKToKLS4uLiAgICBwcmludCAiZm9vIgotLi4uCi08aDE+Ci1mb28KLTwvaDE+Ci1cZW5ke3ZlcmJhdGltfQotCi1UaGUgZnVuY3Rpb24gYmVpbmcgZGVjb3JhdGVkIG11c3QgcmV0dXJuIGEgZ2VuZXJhdG9yLWl0ZXJhdG9yIHdoZW4KLWNhbGxlZC4gVGhpcyBpdGVyYXRvciBtdXN0IHlpZWxkIGV4YWN0bHkgb25lIHZhbHVlLCB3aGljaCB3aWxsIGJlCi1ib3VuZCB0byB0aGUgdGFyZ2V0cyBpbiB0aGUgXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50J3MgXGtleXdvcmR7YXN9Ci1jbGF1c2UsIGlmIGFueS4KLQotQXQgdGhlIHBvaW50IHdoZXJlIHRoZSBnZW5lcmF0b3IgeWllbGRzLCB0aGUgYmxvY2sgbmVzdGVkIGluIHRoZQotXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50IGlzIGV4ZWN1dGVkLiAgVGhlIGdlbmVyYXRvciBpcyB0aGVuIHJlc3VtZWQKLWFmdGVyIHRoZSBibG9jayBpcyBleGl0ZWQuICBJZiBhbiB1bmhhbmRsZWQgZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUKLWJsb2NrLCBpdCBpcyByZXJhaXNlZCBpbnNpZGUgdGhlIGdlbmVyYXRvciBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlIHlpZWxkCi1vY2N1cnJlZC4gIFRodXMsIHlvdSBjYW4gdXNlIGEKLVxrZXl3b3Jke3RyeX0uLi5ca2V5d29yZHtleGNlcHR9Li4uXGtleXdvcmR7ZmluYWxseX0gc3RhdGVtZW50IHRvIHRyYXAKLXRoZSBlcnJvciAoaWYgYW55KSwgb3IgZW5zdXJlIHRoYXQgc29tZSBjbGVhbnVwIHRha2VzIHBsYWNlLiBJZiBhbgotZXhjZXB0aW9uIGlzIHRyYXBwZWQgbWVyZWx5IGluIG9yZGVyIHRvIGxvZyBpdCBvciB0byBwZXJmb3JtIHNvbWUKLWFjdGlvbiAocmF0aGVyIHRoYW4gdG8gc3VwcHJlc3MgaXQgZW50aXJlbHkpLCB0aGUgZ2VuZXJhdG9yIG11c3QKLXJlcmFpc2UgdGhhdCBleGNlcHRpb24uIE90aGVyd2lzZSB0aGUgZ2VuZXJhdG9yIGNvbnRleHQgbWFuYWdlciB3aWxsCi1pbmRpY2F0ZSB0byB0aGUgXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50IHRoYXQgdGhlIGV4Y2VwdGlvbiBoYXMgYmVlbgotaGFuZGxlZCwgYW5kIGV4ZWN1dGlvbiB3aWxsIHJlc3VtZSB3aXRoIHRoZSBzdGF0ZW1lbnQgaW1tZWRpYXRlbHkKLWZvbGxvd2luZyB0aGUgXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtuZXN0ZWR9e21ncjFcb3B0aW9uYWx7LCBtZ3IyXG9wdGlvbmFseywgLi4ufX19Ci1Db21iaW5lIG11bHRpcGxlIGNvbnRleHQgbWFuYWdlcnMgaW50byBhIHNpbmdsZSBuZXN0ZWQgY29udGV4dCBtYW5hZ2VyLgotCi1Db2RlIGxpa2UgdGhpczoKLQotXGJlZ2lue3ZlcmJhdGltfQotZnJvbSBjb250ZXh0bGliIGltcG9ydCBuZXN0ZWQKLQotd2l0aCBuZXN0ZWQoQSwgQiwgQykgYXMgKFgsIFksIFopOgotICAgIGRvX3NvbWV0aGluZygpCi1cZW5ke3ZlcmJhdGltfQotCi1pcyBlcXVpdmFsZW50IHRvIHRoaXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXdpdGggQSBhcyBYOgotICAgIHdpdGggQiBhcyBZOgotICAgICAgICB3aXRoIEMgYXMgWjoKLSAgICAgICAgICAgIGRvX3NvbWV0aGluZygpCi1cZW5ke3ZlcmJhdGltfQotCi1Ob3RlIHRoYXQgaWYgdGhlIFxtZXRob2R7X19leGl0X18oKX0gbWV0aG9kIG9mIG9uZSBvZiB0aGUgbmVzdGVkCi1jb250ZXh0IG1hbmFnZXJzIGluZGljYXRlcyBhbiBleGNlcHRpb24gc2hvdWxkIGJlIHN1cHByZXNzZWQsIG5vCi1leGNlcHRpb24gaW5mb3JtYXRpb24gd2lsbCBiZSBwYXNzZWQgdG8gYW55IHJlbWFpbmluZyBvdXRlciBjb250ZXh0Ci1tYW5hZ2Vycy4gU2ltaWxhcmx5LCBpZiB0aGUgXG1ldGhvZHtfX2V4aXRfXygpfSBtZXRob2Qgb2Ygb25lIG9mIHRoZQotbmVzdGVkIG1hbmFnZXJzIHJhaXNlcyBhbiBleGNlcHRpb24sIGFueSBwcmV2aW91cyBleGNlcHRpb24gc3RhdGUgd2lsbAotYmUgbG9zdDsgdGhlIG5ldyBleGNlcHRpb24gd2lsbCBiZSBwYXNzZWQgdG8gdGhlCi1cbWV0aG9ke19fZXhpdF9fKCl9IG1ldGhvZHMgb2YgYW55IHJlbWFpbmluZyBvdXRlciBjb250ZXh0IG1hbmFnZXJzLgotSW4gZ2VuZXJhbCwgXG1ldGhvZHtfX2V4aXRfXygpfSBtZXRob2RzIHNob3VsZCBhdm9pZCByYWlzaW5nCi1leGNlcHRpb25zLCBhbmQgaW4gcGFydGljdWxhciB0aGV5IHNob3VsZCBub3QgcmUtcmFpc2UgYQotcGFzc2VkLWluIGV4Y2VwdGlvbi4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxsYWJlbHtjb250ZXh0LWNsb3Npbmd9Ci1cYmVnaW57ZnVuY2Rlc2N9e2Nsb3Npbmd9e3RoaW5nfQotUmV0dXJuIGEgY29udGV4dCBtYW5hZ2VyIHRoYXQgY2xvc2VzIFx2YXJ7dGhpbmd9IHVwb24gY29tcGxldGlvbiBvZgotdGhlIGJsb2NrLiAgVGhpcyBpcyBiYXNpY2FsbHkgZXF1aXZhbGVudCB0bzoKLQotXGJlZ2lue3ZlcmJhdGltfQotZnJvbSBjb250ZXh0bGliIGltcG9ydCBjb250ZXh0bWFuYWdlcgotCi1AY29udGV4dG1hbmFnZXIKLWRlZiBjbG9zaW5nKHRoaW5nKToKLSAgICB0cnk6Ci0gICAgICAgIHlpZWxkIHRoaW5nCi0gICAgZmluYWxseToKLSAgICAgICAgdGhpbmcuY2xvc2UoKQotXGVuZHt2ZXJiYXRpbX0KLQotQW5kIGxldHMgeW91IHdyaXRlIGNvZGUgbGlrZSB0aGlzOgotXGJlZ2lue3ZlcmJhdGltfQotZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB3aXRoX3N0YXRlbWVudAotZnJvbSBjb250ZXh0bGliIGltcG9ydCBjbG9zaW5nCi1pbXBvcnQgdXJsbGliCi0KLXdpdGggY2xvc2luZyh1cmxsaWIudXJsb3BlbignaHR0cDovL3d3dy5weXRob24ub3JnJykpIGFzIHBhZ2U6Ci0gICAgZm9yIGxpbmUgaW4gcGFnZToKLSAgICAgICAgcHJpbnQgbGluZQotXGVuZHt2ZXJiYXRpbX0KLQotd2l0aG91dCBuZWVkaW5nIHRvIGV4cGxpY2l0bHkgY2xvc2UgXGNvZGV7cGFnZX0uICBFdmVuIGlmIGFuIGVycm9yCi1vY2N1cnMsIFxjb2Rle3BhZ2UuY2xvc2UoKX0gd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgXGtleXdvcmR7d2l0aH0KLWJsb2NrIGlzIGV4aXRlZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntzZWVhbHNvfQotICBcc2VlcGVwezAzNDN9e1RoZSAid2l0aCIgc3RhdGVtZW50fQotICAgICAgICAge1RoZSBzcGVjaWZpY2F0aW9uLCBiYWNrZ3JvdW5kLCBhbmQgZXhhbXBsZXMgZm9yIHRoZQotICAgICAgICAgIFB5dGhvbiBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQufQotXGVuZHtzZWVhbHNvfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJjb29raWUudGV4IGIvRG9jL2xpYi9saWJjb29raWUudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWQyMDM4Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGliY29va2llLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle0Nvb2tpZX0gLS0tCi0gICAgICAgICBIVFRQIHN0YXRlIG1hbmFnZW1lbnR9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtDb29raWV9Ci1cbW9kdWxlc3lub3BzaXN7U3VwcG9ydCBmb3IgSFRUUCBzdGF0ZSBtYW5hZ2VtZW50IChjb29raWVzKS59Ci1cbW9kdWxlYXV0aG9ye1RpbW90aHkgTydNYWxsZXl9e3RpbW9AYWx1bS5taXQuZWR1fQotXHNlY3Rpb25hdXRob3J7TW9zaGUgWmFka2F9e21vc2hlekB6YWRrYS5zaXRlLmNvLmlsfQotCi0KLVRoZSBcbW9kdWxle0Nvb2tpZX0gbW9kdWxlIGRlZmluZXMgY2xhc3NlcyBmb3IgYWJzdHJhY3RpbmcgdGhlIGNvbmNlcHQgb2YgCi1jb29raWVzLCBhbiBIVFRQIHN0YXRlIG1hbmFnZW1lbnQgbWVjaGFuaXNtLiBJdCBzdXBwb3J0cyBib3RoIHNpbXBsZQotc3RyaW5nLW9ubHkgY29va2llcywgYW5kIHByb3ZpZGVzIGFuIGFic3RyYWN0aW9uIGZvciBoYXZpbmcgYW55IHNlcmlhbGl6YWJsZQotZGF0YS10eXBlIGFzIGNvb2tpZSB2YWx1ZS4KLQotVGhlIG1vZHVsZSBmb3JtZXJseSBzdHJpY3RseSBhcHBsaWVkIHRoZSBwYXJzaW5nIHJ1bGVzIGRlc2NyaWJlZCBpbgotdGhlIFxyZmN7MjEwOX0gYW5kIFxyZmN7MjA2OH0gc3BlY2lmaWNhdGlvbnMuICBJdCBoYXMgc2luY2UgYmVlbiBkaXNjb3ZlcmVkCi10aGF0IE1TSUUgMy4weCBkb2Vzbid0IGZvbGxvdyB0aGUgY2hhcmFjdGVyIHJ1bGVzIG91dGxpbmVkIGluIHRob3NlCi1zcGVjcy4gIEFzIGEgcmVzdWx0LCB0aGUgcGFyc2luZyBydWxlcyB1c2VkIGFyZSBhIGJpdCBsZXNzIHN0cmljdC4KLQotXGJlZ2lue2V4Y2Rlc2N9e0Nvb2tpZUVycm9yfQotRXhjZXB0aW9uIGZhaWxpbmcgYmVjYXVzZSBvZiBccmZjezIxMDl9IGludmFsaWRpdHk6IGluY29ycmVjdAotYXR0cmlidXRlcywgaW5jb3JyZWN0IFxtYWlsaGVhZGVye1NldC1Db29raWV9IGhlYWRlciwgZXRjLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtCYXNlQ29va2llfXtcb3B0aW9uYWx7aW5wdXR9fQotVGhpcyBjbGFzcyBpcyBhIGRpY3Rpb25hcnktbGlrZSBvYmplY3Qgd2hvc2Uga2V5cyBhcmUgc3RyaW5ncyBhbmQKLXdob3NlIHZhbHVlcyBhcmUgXGNsYXNze01vcnNlbH0gaW5zdGFuY2VzLiBOb3RlIHRoYXQgdXBvbiBzZXR0aW5nIGEga2V5IHRvCi1hIHZhbHVlLCB0aGUgdmFsdWUgaXMgZmlyc3QgY29udmVydGVkIHRvIGEgXGNsYXNze01vcnNlbH0gY29udGFpbmluZwotdGhlIGtleSBhbmQgdGhlIHZhbHVlLgotCi1JZiBcdmFye2lucHV0fSBpcyBnaXZlbiwgaXQgaXMgcGFzc2VkIHRvIHRoZSBcbWV0aG9ke2xvYWQoKX0gbWV0aG9kLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1NpbXBsZUNvb2tpZX17XG9wdGlvbmFse2lucHV0fX0KLVRoaXMgY2xhc3MgZGVyaXZlcyBmcm9tIFxjbGFzc3tCYXNlQ29va2llfSBhbmQgb3ZlcnJpZGVzCi1cbWV0aG9ke3ZhbHVlX2RlY29kZSgpfSBhbmQgXG1ldGhvZHt2YWx1ZV9lbmNvZGUoKX0gdG8gYmUgdGhlIGlkZW50aXR5Ci1hbmQgXGZ1bmN0aW9ue3N0cigpfSByZXNwZWN0aXZlbHkuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317U2VyaWFsQ29va2llfXtcb3B0aW9uYWx7aW5wdXR9fQotVGhpcyBjbGFzcyBkZXJpdmVzIGZyb20gXGNsYXNze0Jhc2VDb29raWV9IGFuZCBvdmVycmlkZXMKLVxtZXRob2R7dmFsdWVfZGVjb2RlKCl9IGFuZCBcbWV0aG9ke3ZhbHVlX2VuY29kZSgpfSB0byBiZSB0aGUKLVxmdW5jdGlvbntwaWNrbGUubG9hZHMoKX0gYW5kIFxmdW5jdGlvbntwaWNrbGUuZHVtcHMoKX0uCi0KLVxkZXByZWNhdGVkezIuM317UmVhZGluZyBwaWNrbGVkIHZhbHVlcyBmcm9tIHVudHJ1c3RlZAotY29va2llIGRhdGEgaXMgYSBodWdlIHNlY3VyaXR5IGhvbGUsIGFzIHBpY2tsZSBzdHJpbmdzIGNhbiBiZSBjcmFmdGVkCi10byBjYXVzZSBhcmJpdHJhcnkgY29kZSB0byBleGVjdXRlIG9uIHlvdXIgc2VydmVyLiAgSXQgaXMgc3VwcG9ydGVkCi1mb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seSwgYW5kIG1heSBldmVudHVhbGx5IGdvIGF3YXkufQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1NtYXJ0Q29va2llfXtcb3B0aW9uYWx7aW5wdXR9fQotVGhpcyBjbGFzcyBkZXJpdmVzIGZyb20gXGNsYXNze0Jhc2VDb29raWV9LiBJdCBvdmVycmlkZXMKLVxtZXRob2R7dmFsdWVfZGVjb2RlKCl9IHRvIGJlIFxmdW5jdGlvbntwaWNrbGUubG9hZHMoKX0gaWYgaXQgaXMgYQotdmFsaWQgcGlja2xlLCBhbmQgb3RoZXJ3aXNlIHRoZSB2YWx1ZSBpdHNlbGYuIEl0IG92ZXJyaWRlcwotXG1ldGhvZHt2YWx1ZV9lbmNvZGUoKX0gdG8gYmUgXGZ1bmN0aW9ue3BpY2tsZS5kdW1wcygpfSB1bmxlc3MgaXQgaXMgYQotc3RyaW5nLCBpbiB3aGljaCBjYXNlIGl0IHJldHVybnMgdGhlIHZhbHVlIGl0c2VsZi4KLQotXGRlcHJlY2F0ZWR7Mi4zfXtUaGUgc2FtZSBzZWN1cml0eSB3YXJuaW5nIGZyb20gXGNsYXNze1NlcmlhbENvb2tpZX0KLWFwcGxpZXMgaGVyZS59Ci1cZW5ke2NsYXNzZGVzY30KLQotQSBmdXJ0aGVyIHNlY3VyaXR5IG5vdGUgaXMgd2FycmFudGVkLiAgRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LAotdGhlIFxtb2R1bGV7Q29va2llfSBtb2R1bGUgZXhwb3J0cyBhIGNsYXNzIG5hbWVkIFxjbGFzc3tDb29raWV9IHdoaWNoCi1pcyBqdXN0IGFuIGFsaWFzIGZvciBcY2xhc3N7U21hcnRDb29raWV9LiAgVGhpcyBpcyBwcm9iYWJseSBhIG1pc3Rha2UKLWFuZCB3aWxsIGxpa2VseSBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uICBZb3Ugc2hvdWxkIG5vdCB1c2UKLXRoZSBcY2xhc3N7Q29va2llfSBjbGFzcyBpbiB5b3VyIGFwcGxpY2F0aW9ucywgZm9yIHRoZSBzYW1lIHJlYXNvbiB3aHkKLXlvdSBzaG91bGQgbm90IHVzZSB0aGUgXGNsYXNze1NlcmlhbENvb2tpZX0gY2xhc3MuCi0KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWVtb2R1bGV7Y29va2llbGlifXtIVFRQIGNvb2tpZSBoYW5kbGluZyBmb3Igd2ViCi0gICAgXGVtcGh7Y2xpZW50c30uICBUaGUgXG1vZHVsZXtjb29raWVsaWJ9IGFuZCBcbW9kdWxle0Nvb2tpZX0KLSAgICBtb2R1bGVzIGRvIG5vdCBkZXBlbmQgb24gZWFjaCBvdGhlci59Ci0KLSAgXHNlZXJmY3syMTA5fXtIVFRQIFN0YXRlIE1hbmFnZW1lbnQgTWVjaGFuaXNtfXtUaGlzIGlzIHRoZSBzdGF0ZQotICAgICAgICAgICAgICAgIG1hbmFnZW1lbnQgc3BlY2lmaWNhdGlvbiBpbXBsZW1lbnRlZCBieSB0aGlzIG1vZHVsZS59Ci1cZW5ke3NlZWFsc299Ci0KLQotXHN1YnNlY3Rpb257Q29va2llIE9iamVjdHMgXGxhYmVse2Nvb2tpZS1vYmplY3RzfX0KLQotXGJlZ2lue21ldGhvZGRlc2N9W0Jhc2VDb29raWVde3ZhbHVlX2RlY29kZX17dmFsfQotUmV0dXJuIGEgZGVjb2RlZCB2YWx1ZSBmcm9tIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uLiBSZXR1cm4gdmFsdWUgY2FuCi1iZSBhbnkgdHlwZS4gVGhpcyBtZXRob2QgZG9lcyBub3RoaW5nIGluIFxjbGFzc3tCYXNlQ29va2llfSAtLS0gaXQgZXhpc3RzCi1zbyBpdCBjYW4gYmUgb3ZlcnJpZGRlbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0Jhc2VDb29raWVde3ZhbHVlX2VuY29kZX17dmFsfQotUmV0dXJuIGFuIGVuY29kZWQgdmFsdWUuIFx2YXJ7dmFsfSBjYW4gYmUgYW55IHR5cGUsIGJ1dCByZXR1cm4gdmFsdWUKLW11c3QgYmUgYSBzdHJpbmcuIFRoaXMgbWV0aG9kIGRvZXMgbm90aGluZyBpbiBcY2xhc3N7QmFzZUNvb2tpZX0gLS0tIGl0IGV4aXN0cwotc28gaXQgY2FuIGJlIG92ZXJyaWRkZW4KLQotSW4gZ2VuZXJhbCwgaXQgc2hvdWxkIGJlIHRoZSBjYXNlIHRoYXQgXG1ldGhvZHt2YWx1ZV9lbmNvZGUoKX0gYW5kIAotXG1ldGhvZHt2YWx1ZV9kZWNvZGUoKX0gYXJlIGludmVyc2VzIG9uIHRoZSByYW5nZSBvZiBcdmFye3ZhbHVlX2RlY29kZX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtCYXNlQ29va2llXXtvdXRwdXR9e1xvcHRpb25hbHthdHRyc1xvcHRpb25hbHssIGhlYWRlclxvcHRpb25hbHssIHNlcH19fX0KLVJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBzdWl0YWJsZSB0byBiZSBzZW50IGFzIEhUVFAgaGVhZGVycy4KLVx2YXJ7YXR0cnN9IGFuZCBcdmFye2hlYWRlcn0gYXJlIHNlbnQgdG8gZWFjaCBcY2xhc3N7TW9yc2VsfSdzCi1cbWV0aG9ke291dHB1dCgpfSBtZXRob2QuIFx2YXJ7c2VwfSBpcyB1c2VkIHRvIGpvaW4gdGhlIGhlYWRlcnMKLXRvZ2V0aGVyLCBhbmQgaXMgYnkgZGVmYXVsdCB0aGUgY29tYmluYXRpb24gXGNvZGV7J1xlIHJcZSBuJ30gKENSTEYpLgotXHZlcnNpb25jaGFuZ2VkW1RoZSBkZWZhdWx0IHNlcGFyYXRvciBoYXMgYmVlbiBjaGFuZ2VkIGZyb20gXGNvZGV7J1xlIG4nfQotdG8gbWF0Y2ggdGhlIGNvb2tpZSBzcGVjaWZpY2F0aW9uXXsyLjV9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtCYXNlQ29va2llXXtqc19vdXRwdXR9e1xvcHRpb25hbHthdHRyc319Ci1SZXR1cm4gYW4gZW1iZWRkYWJsZSBKYXZhU2NyaXB0IHNuaXBwZXQsIHdoaWNoLCBpZiBydW4gb24gYSBicm93c2VyIHdoaWNoCi1zdXBwb3J0cyBKYXZhU2NyaXB0LCB3aWxsIGFjdCB0aGUgc2FtZSBhcyBpZiB0aGUgSFRUUCBoZWFkZXJzIHdhcyBzZW50LgotCi1UaGUgbWVhbmluZyBmb3IgXHZhcnthdHRyc30gaXMgdGhlIHNhbWUgYXMgaW4gXG1ldGhvZHtvdXRwdXQoKX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtCYXNlQ29va2llXXtsb2FkfXtyYXdkYXRhfQotSWYgXHZhcntyYXdkYXRhfSBpcyBhIHN0cmluZywgcGFyc2UgaXQgYXMgYW4gXGNvZGV7SFRUUF9DT09LSUV9IGFuZCBhZGQKLXRoZSB2YWx1ZXMgZm91bmQgdGhlcmUgYXMgXGNsYXNze01vcnNlbH1zLiBJZiBpdCBpcyBhIGRpY3Rpb25hcnksIGl0Ci1pcyBlcXVpdmFsZW50IHRvOgotCi1cYmVnaW57dmVyYmF0aW19Ci1mb3IgaywgdiBpbiByYXdkYXRhLml0ZW1zKCk6Ci0gICAgY29va2llW2tdID0gdgotXGVuZHt2ZXJiYXRpbX0KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cc3Vic2VjdGlvbntNb3JzZWwgT2JqZWN0cyBcbGFiZWx7bW9yc2VsLW9iamVjdHN9fQotCi1cYmVnaW57Y2xhc3NkZXNjfXtNb3JzZWx9e30KLUFic3RyYWN0IGEga2V5L3ZhbHVlIHBhaXIsIHdoaWNoIGhhcyBzb21lIFxyZmN7MjEwOX0gYXR0cmlidXRlcy4KLQotTW9yc2VscyBhcmUgZGljdGlvbmFyeS1saWtlIG9iamVjdHMsIHdob3NlIHNldCBvZiBrZXlzIGlzIGNvbnN0YW50IC0tLQotdGhlIHZhbGlkIFxyZmN7MjEwOX0gYXR0cmlidXRlcywgd2hpY2ggYXJlCi0KLVxiZWdpbntpdGVtaXplfQotXGl0ZW0gXGNvZGV7ZXhwaXJlc30KLVxpdGVtIFxjb2Rle3BhdGh9Ci1caXRlbSBcY29kZXtjb21tZW50fQotXGl0ZW0gXGNvZGV7ZG9tYWlufQotXGl0ZW0gXGNvZGV7bWF4LWFnZX0KLVxpdGVtIFxjb2Rle3NlY3VyZX0KLVxpdGVtIFxjb2Rle3ZlcnNpb259Ci1cZW5ke2l0ZW1pemV9Ci0KLVRoZSBrZXlzIGFyZSBjYXNlLWluc2Vuc2l0aXZlLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtNb3JzZWxde3ZhbHVlfQotVGhlIHZhbHVlIG9mIHRoZSBjb29raWUuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtNb3JzZWxde2NvZGVkX3ZhbHVlfQotVGhlIGVuY29kZWQgdmFsdWUgb2YgdGhlIGNvb2tpZSAtLS0gdGhpcyBpcyB3aGF0IHNob3VsZCBiZSBzZW50LgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bTW9yc2VsXXtrZXl9Ci1UaGUgbmFtZSBvZiB0aGUgY29va2llLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTW9yc2VsXXtzZXR9e2tleSwgdmFsdWUsIGNvZGVkX3ZhbHVlfQotU2V0IHRoZSBcdmFye2tleX0sIFx2YXJ7dmFsdWV9IGFuZCBcdmFye2NvZGVkX3ZhbHVlfSBtZW1iZXJzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTW9yc2VsXXtpc1Jlc2VydmVkS2V5fXtLfQotV2hldGhlciBcdmFye0t9IGlzIGEgbWVtYmVyIG9mIHRoZSBzZXQgb2Yga2V5cyBvZiBhIFxjbGFzc3tNb3JzZWx9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTW9yc2VsXXtvdXRwdXR9e1xvcHRpb25hbHthdHRyc1xvcHRpb25hbHssIGhlYWRlcn19fQotUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBNb3JzZWwsIHN1aXRhYmxlCi10byBiZSBzZW50IGFzIGFuIEhUVFAgaGVhZGVyLiBCeSBkZWZhdWx0LCBhbGwgdGhlIGF0dHJpYnV0ZXMgYXJlIGluY2x1ZGVkLAotdW5sZXNzIFx2YXJ7YXR0cnN9IGlzIGdpdmVuLCBpbiB3aGljaCBjYXNlIGl0IHNob3VsZCBiZSBhIGxpc3Qgb2YgYXR0cmlidXRlcwotdG8gdXNlLiBcdmFye2hlYWRlcn0gaXMgYnkgZGVmYXVsdCBcY29kZXsiU2V0LUNvb2tpZToifS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W01vcnNlbF17anNfb3V0cHV0fXtcb3B0aW9uYWx7YXR0cnN9fQotUmV0dXJuIGFuIGVtYmVkZGFibGUgSmF2YVNjcmlwdCBzbmlwcGV0LCB3aGljaCwgaWYgcnVuIG9uIGEgYnJvd3NlciB3aGljaAotc3VwcG9ydHMgSmF2YVNjcmlwdCwgd2lsbCBhY3QgdGhlIHNhbWUgYXMgaWYgdGhlIEhUVFAgaGVhZGVyIHdhcyBzZW50LgotCi1UaGUgbWVhbmluZyBmb3IgXHZhcnthdHRyc30gaXMgdGhlIHNhbWUgYXMgaW4gXG1ldGhvZHtvdXRwdXQoKX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtNb3JzZWxde091dHB1dFN0cmluZ317XG9wdGlvbmFse2F0dHJzfX0KLVJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIE1vcnNlbCwgd2l0aG91dCBhbnkgc3Vycm91bmRpbmcgSFRUUAotb3IgSmF2YVNjcmlwdC4KLQotVGhlIG1lYW5pbmcgZm9yIFx2YXJ7YXR0cnN9IGlzIHRoZSBzYW1lIGFzIGluIFxtZXRob2R7b3V0cHV0KCl9LgotXGVuZHttZXRob2RkZXNjfQotICAgICAgICAgICAgICAgIAotCi1cc3Vic2VjdGlvbntFeGFtcGxlIFxsYWJlbHtjb29raWUtZXhhbXBsZX19Ci0KLVRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIHVzZSB0aGUgXG1vZHVsZXtDb29raWV9IG1vZHVsZS4KLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGltcG9ydCBDb29raWUKLT4+PiBDID0gQ29va2llLlNpbXBsZUNvb2tpZSgpCi0+Pj4gQyA9IENvb2tpZS5TZXJpYWxDb29raWUoKQotPj4+IEMgPSBDb29raWUuU21hcnRDb29raWUoKQotPj4+IENbImZpZyJdID0gIm5ld3RvbiIKLT4+PiBDWyJzdWdhciJdID0gIndhZmVyIgotPj4+IHByaW50IEMgIyBnZW5lcmF0ZSBIVFRQIGhlYWRlcnMKLVNldC1Db29raWU6IHN1Z2FyPXdhZmVyCi1TZXQtQ29va2llOiBmaWc9bmV3dG9uCi0+Pj4gcHJpbnQgQy5vdXRwdXQoKSAjIHNhbWUgdGhpbmcKLVNldC1Db29raWU6IHN1Z2FyPXdhZmVyCi1TZXQtQ29va2llOiBmaWc9bmV3dG9uCi0+Pj4gQyA9IENvb2tpZS5TbWFydENvb2tpZSgpCi0+Pj4gQ1sicm9ja3kiXSA9ICJyb2FkIgotPj4+IENbInJvY2t5Il1bInBhdGgiXSA9ICIvY29va2llIgotPj4+IHByaW50IEMub3V0cHV0KGhlYWRlcj0iQ29va2llOiIpCi1Db29raWU6IHJvY2t5PXJvYWQ7IFBhdGg9L2Nvb2tpZQotPj4+IHByaW50IEMub3V0cHV0KGF0dHJzPVtdLCBoZWFkZXI9IkNvb2tpZToiKQotQ29va2llOiByb2NreT1yb2FkCi0+Pj4gQyA9IENvb2tpZS5TbWFydENvb2tpZSgpCi0+Pj4gQy5sb2FkKCJjaGlwcz1haG95OyB2aWVubmE9ZmluZ2VyIikgIyBsb2FkIGZyb20gYSBzdHJpbmcgKEhUVFAgaGVhZGVyKQotPj4+IHByaW50IEMKLVNldC1Db29raWU6IHZpZW5uYT1maW5nZXIKLVNldC1Db29raWU6IGNoaXBzPWFob3kKLT4+PiBDID0gQ29va2llLlNtYXJ0Q29va2llKCkKLT4+PiBDLmxvYWQoJ2tlZWJsZXI9IkU9ZXZlcnlib2R5OyBMPVxcIkxvdmVzXFwiOyBmdWRnZT1cXDAxMjsiOycpCi0+Pj4gcHJpbnQgQwotU2V0LUNvb2tpZToga2VlYmxlcj0iRT1ldmVyeWJvZHk7IEw9XCJMb3Zlc1wiOyBmdWRnZT1cMDEyOyIKLT4+PiBDID0gQ29va2llLlNtYXJ0Q29va2llKCkKLT4+PiBDWyJvcmVvIl0gPSAiZG91Ymxlc3R1ZmYiCi0+Pj4gQ1sib3JlbyJdWyJwYXRoIl0gPSAiLyIKLT4+PiBwcmludCBDCi1TZXQtQ29va2llOiBvcmVvPWRvdWJsZXN0dWZmOyBQYXRoPS8KLT4+PiBDID0gQ29va2llLlNtYXJ0Q29va2llKCkKLT4+PiBDWyJ0d2l4Il0gPSAibm9uZSBmb3IgeW91IgotPj4+IENbInR3aXgiXS52YWx1ZQotJ25vbmUgZm9yIHlvdScKLT4+PiBDID0gQ29va2llLlNpbXBsZUNvb2tpZSgpCi0+Pj4gQ1sibnVtYmVyIl0gPSA3ICMgZXF1aXZhbGVudCB0byBDWyJudW1iZXIiXSA9IHN0cig3KQotPj4+IENbInN0cmluZyJdID0gInNldmVuIgotPj4+IENbIm51bWJlciJdLnZhbHVlCi0nNycKLT4+PiBDWyJzdHJpbmciXS52YWx1ZQotJ3NldmVuJwotPj4+IHByaW50IEMKLVNldC1Db29raWU6IG51bWJlcj03Ci1TZXQtQ29va2llOiBzdHJpbmc9c2V2ZW4KLT4+PiBDID0gQ29va2llLlNlcmlhbENvb2tpZSgpCi0+Pj4gQ1sibnVtYmVyIl0gPSA3Ci0+Pj4gQ1sic3RyaW5nIl0gPSAic2V2ZW4iCi0+Pj4gQ1sibnVtYmVyIl0udmFsdWUKLTcKLT4+PiBDWyJzdHJpbmciXS52YWx1ZQotJ3NldmVuJwotPj4+IHByaW50IEMKLVNldC1Db29raWU6IG51bWJlcj0iSTdcMDEyLiIKLVNldC1Db29raWU6IHN0cmluZz0iUydzZXZlbidcMDEycDFcMDEyLiIKLT4+PiBDID0gQ29va2llLlNtYXJ0Q29va2llKCkKLT4+PiBDWyJudW1iZXIiXSA9IDcKLT4+PiBDWyJzdHJpbmciXSA9ICJzZXZlbiIKLT4+PiBDWyJudW1iZXIiXS52YWx1ZQotNwotPj4+IENbInN0cmluZyJdLnZhbHVlCi0nc2V2ZW4nCi0+Pj4gcHJpbnQgQwotU2V0LUNvb2tpZTogbnVtYmVyPSJJN1wwMTIuIgotU2V0LUNvb2tpZTogc3RyaW5nPXNldmVuCi1cZW5ke3ZlcmJhdGltfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJjb29raWVsaWIudGV4IGIvRG9jL2xpYi9saWJjb29raWVsaWIudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWEzNTU0Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGliY29va2llbGliLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDcyMCArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle2Nvb2tpZWxpYn0gLS0tCi0gICAgICAgICBDb29raWUgaGFuZGxpbmcgZm9yIEhUVFAgY2xpZW50c30KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2Nvb2tpZWxpYn0KLVxtb2R1bGVhdXRob3J7Sm9obiBKLiBMZWV9e2pqbEBwb2JveC5jb219Ci1cc2VjdGlvbmF1dGhvcntKb2huIEouIExlZX17ampsQHBvYm94LmNvbX0KLQotXHZlcnNpb25hZGRlZHsyLjR9Ci0KLVxtb2R1bGVzeW5vcHNpc3tDb29raWUgaGFuZGxpbmcgZm9yIEhUVFAgY2xpZW50c30KLQotVGhlIFxtb2R1bGV7Y29va2llbGlifSBtb2R1bGUgZGVmaW5lcyBjbGFzc2VzIGZvciBhdXRvbWF0aWMgaGFuZGxpbmcKLW9mIEhUVFAgY29va2llcy4gIEl0IGlzIHVzZWZ1bCBmb3IgYWNjZXNzaW5nIHdlYiBzaXRlcyB0aGF0IHJlcXVpcmUKLXNtYWxsIHBpZWNlcyBvZiBkYXRhIC0tIFxkZm57Y29va2llc30gLS0gdG8gYmUgc2V0IG9uIHRoZSBjbGllbnQKLW1hY2hpbmUgYnkgYW4gSFRUUCByZXNwb25zZSBmcm9tIGEgd2ViIHNlcnZlciwgYW5kIHRoZW4gcmV0dXJuZWQgdG8KLXRoZSBzZXJ2ZXIgaW4gbGF0ZXIgSFRUUCByZXF1ZXN0cy4KLQotQm90aCB0aGUgcmVndWxhciBOZXRzY2FwZSBjb29raWUgcHJvdG9jb2wgYW5kIHRoZSBwcm90b2NvbCBkZWZpbmVkIGJ5Ci1ccmZjezI5NjV9IGFyZSBoYW5kbGVkLiAgUkZDIDI5NjUgaGFuZGxpbmcgaXMgc3dpdGNoZWQgb2ZmIGJ5IGRlZmF1bHQuCi1ccmZjezIxMDl9IGNvb2tpZXMgYXJlIHBhcnNlZCBhcyBOZXRzY2FwZSBjb29raWVzIGFuZCBzdWJzZXF1ZW50bHkKLXRyZWF0ZWQgZWl0aGVyIGFzIE5ldHNjYXBlIG9yIFJGQyAyOTY1IGNvb2tpZXMgYWNjb3JkaW5nIHRvIHRoZQotJ3BvbGljeScgaW4gZWZmZWN0LiAgTm90ZSB0aGF0IHRoZSBncmVhdCBtYWpvcml0eSBvZiBjb29raWVzIG9uIHRoZQotSW50ZXJuZXQgYXJlIE5ldHNjYXBlIGNvb2tpZXMuICBcbW9kdWxle2Nvb2tpZWxpYn0gYXR0ZW1wdHMgdG8gZm9sbG93Ci10aGUgZGUtZmFjdG8gTmV0c2NhcGUgY29va2llIHByb3RvY29sICh3aGljaCBkaWZmZXJzIHN1YnN0YW50aWFsbHkKLWZyb20gdGhhdCBzZXQgb3V0IGluIHRoZSBvcmlnaW5hbCBOZXRzY2FwZSBzcGVjaWZpY2F0aW9uKSwgaW5jbHVkaW5nCi10YWtpbmcgbm90ZSBvZiB0aGUgXGNvZGV7bWF4LWFnZX0gYW5kIFxjb2Rle3BvcnR9IGNvb2tpZS1hdHRyaWJ1dGVzCi1pbnRyb2R1Y2VkIHdpdGggUkZDIDI5NjUuICBcbm90ZXtUaGUgdmFyaW91cyBuYW1lZCBwYXJhbWV0ZXJzIGZvdW5kIGluCi1cbWFpbGhlYWRlcntTZXQtQ29va2llfSBhbmQgXG1haWxoZWFkZXJ7U2V0LUNvb2tpZTJ9IGhlYWRlcnMKLShlZy4gXGNvZGV7ZG9tYWlufSBhbmQgXGNvZGV7ZXhwaXJlc30pIGFyZSBjb252ZW50aW9uYWxseSByZWZlcnJlZCB0bwotYXMgXGRmbnthdHRyaWJ1dGVzfS4gIFRvIGRpc3Rpbmd1aXNoIHRoZW0gZnJvbSBQeXRob24gYXR0cmlidXRlcywgdGhlCi1kb2N1bWVudGF0aW9uIGZvciB0aGlzIG1vZHVsZSB1c2VzIHRoZSB0ZXJtIFxkZm57Y29va2llLWF0dHJpYnV0ZX0KLWluc3RlYWR9LgotCi0KLVRoZSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbjoKLQotXGJlZ2lue2V4Y2Rlc2N9e0xvYWRFcnJvcn0KLUluc3RhbmNlcyBvZiBcY2xhc3N7RmlsZUNvb2tpZUphcn0gcmFpc2UgdGhpcyBleGNlcHRpb24gb24gZmFpbHVyZSB0bwotbG9hZCBjb29raWVzIGZyb20gYSBmaWxlLiAgXG5vdGV7Rm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5Ci13aXRoIFB5dGhvbiAyLjQgKHdoaWNoIHJhaXNlZCBhbiBcZXhjZXB0aW9ue0lPRXJyb3J9KSwKLVxleGNlcHRpb257TG9hZEVycm9yfSBpcyBhIHN1YmNsYXNzIG9mIFxleGNlcHRpb257SU9FcnJvcn19LgotXGVuZHtleGNkZXNjfQotCi0KLVRoZSBmb2xsb3dpbmcgY2xhc3NlcyBhcmUgcHJvdmlkZWQ6Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0Nvb2tpZUphcn17cG9saWN5PVxjb25zdGFudHtOb25lfX0KLVx2YXJ7cG9saWN5fSBpcyBhbiBvYmplY3QgaW1wbGVtZW50aW5nIHRoZSBcY2xhc3N7Q29va2llUG9saWN5fQotaW50ZXJmYWNlLgotCi1UaGUgXGNsYXNze0Nvb2tpZUphcn0gY2xhc3Mgc3RvcmVzIEhUVFAgY29va2llcy4gIEl0IGV4dHJhY3RzIGNvb2tpZXMKLWZyb20gSFRUUCByZXF1ZXN0cywgYW5kIHJldHVybnMgdGhlbSBpbiBIVFRQIHJlc3BvbnNlcy4KLVxjbGFzc3tDb29raWVKYXJ9IGluc3RhbmNlcyBhdXRvbWF0aWNhbGx5IGV4cGlyZSBjb250YWluZWQgY29va2llcwotd2hlbiBuZWNlc3NhcnkuICBTdWJjbGFzc2VzIGFyZSBhbHNvIHJlc3BvbnNpYmxlIGZvciBzdG9yaW5nIGFuZAotcmV0cmlldmluZyBjb29raWVzIGZyb20gYSBmaWxlIG9yIGRhdGFiYXNlLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0ZpbGVDb29raWVKYXJ9e2ZpbGVuYW1lLCBkZWxheWxvYWQ9XGNvbnN0YW50e05vbmV9LAotIHBvbGljeT1cY29uc3RhbnR7Tm9uZX19Ci1cdmFye3BvbGljeX0gaXMgYW4gb2JqZWN0IGltcGxlbWVudGluZyB0aGUgXGNsYXNze0Nvb2tpZVBvbGljeX0KLWludGVyZmFjZS4gIEZvciB0aGUgb3RoZXIgYXJndW1lbnRzLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZQotY29ycmVzcG9uZGluZyBhdHRyaWJ1dGVzLgotCi1BIFxjbGFzc3tDb29raWVKYXJ9IHdoaWNoIGNhbiBsb2FkIGNvb2tpZXMgZnJvbSwgYW5kIHBlcmhhcHMgc2F2ZQotY29va2llcyB0bywgYSBmaWxlIG9uIGRpc2suICBDb29raWVzIGFyZSBcc3Ryb25ne05PVH0gbG9hZGVkIGZyb20gdGhlCi1uYW1lZCBmaWxlIHVudGlsIGVpdGhlciB0aGUgXG1ldGhvZHtsb2FkKCl9IG9yIFxtZXRob2R7cmV2ZXJ0KCl9Ci1tZXRob2QgaXMgY2FsbGVkLiAgU3ViY2xhc3NlcyBvZiB0aGlzIGNsYXNzIGFyZSBkb2N1bWVudGVkIGluIHNlY3Rpb24KLVxyZWZ7ZmlsZS1jb29raWUtamFyLWNsYXNzZXN9LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0Nvb2tpZVBvbGljeX17fQotVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgZGVjaWRpbmcgd2hldGhlciBlYWNoIGNvb2tpZSBzaG91bGQgYmUKLWFjY2VwdGVkIGZyb20gLyByZXR1cm5lZCB0byB0aGUgc2VydmVyLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0RlZmF1bHRDb29raWVQb2xpY3l9ewotICAgIGJsb2NrZWRfZG9tYWlucz1cY29uc3RhbnR7Tm9uZX0sCi0gICAgYWxsb3dlZF9kb21haW5zPVxjb25zdGFudHtOb25lfSwKLSAgICBuZXRzY2FwZT1cY29uc3RhbnR7VHJ1ZX0sIHJmYzI5NjU9XGNvbnN0YW50e0ZhbHNlfSwKLSAgICByZmMyMTA5X2FzX25ldHNjYXBlPVxjb25zdGFudHtOb25lfSwKLSAgICBoaWRlX2Nvb2tpZTI9XGNvbnN0YW50e0ZhbHNlfSwKLSAgICBzdHJpY3RfZG9tYWluPVxjb25zdGFudHtGYWxzZX0sCi0gICAgc3RyaWN0X3JmYzI5NjVfdW52ZXJpZmlhYmxlPVxjb25zdGFudHtUcnVlfSwKLSAgICBzdHJpY3RfbnNfdW52ZXJpZmlhYmxlPVxjb25zdGFudHtGYWxzZX0sCi0gICAgc3RyaWN0X25zX2RvbWFpbj1cY29uc3RhbnR7RGVmYXVsdENvb2tpZVBvbGljeS5Eb21haW5MaWJlcmFsfSwKLSAgICBzdHJpY3RfbnNfc2V0X2luaXRpYWxfZG9sbGFyPVxjb25zdGFudHtGYWxzZX0sCi0gICAgc3RyaWN0X25zX3NldF9wYXRoPVxjb25zdGFudHtGYWxzZX0KLSAgfQotCi1Db25zdHJ1Y3RvciBhcmd1bWVudHMgc2hvdWxkIGJlIHBhc3NlZCBhcyBrZXl3b3JkIGFyZ3VtZW50cyBvbmx5LgotXHZhcntibG9ja2VkX2RvbWFpbnN9IGlzIGEgc2VxdWVuY2Ugb2YgZG9tYWluIG5hbWVzIHRoYXQgd2UgbmV2ZXIKLWFjY2VwdCBjb29raWVzIGZyb20sIG5vciByZXR1cm4gY29va2llcyB0by4gXHZhcnthbGxvd2VkX2RvbWFpbnN9IGlmCi1ub3QgXGNvbnN0YW50e05vbmV9LCB0aGlzIGlzIGEgc2VxdWVuY2Ugb2YgdGhlIG9ubHkgZG9tYWlucyBmb3Igd2hpY2gKLXdlIGFjY2VwdCBhbmQgcmV0dXJuIGNvb2tpZXMuICBGb3IgYWxsIG90aGVyIGFyZ3VtZW50cywgc2VlIHRoZQotZG9jdW1lbnRhdGlvbiBmb3IgXGNsYXNze0Nvb2tpZVBvbGljeX0gYW5kIFxjbGFzc3tEZWZhdWx0Q29va2llUG9saWN5fQotb2JqZWN0cy4KLQotXGNsYXNze0RlZmF1bHRDb29raWVQb2xpY3l9IGltcGxlbWVudHMgdGhlIHN0YW5kYXJkIGFjY2VwdCAvIHJlamVjdAotcnVsZXMgZm9yIE5ldHNjYXBlIGFuZCBSRkMgMjk2NSBjb29raWVzLiAgQnkgZGVmYXVsdCwgUkZDIDIxMDkgY29va2llcwotKGllLiBjb29raWVzIHJlY2VpdmVkIGluIGEgXG1haWxoZWFkZXJ7U2V0LUNvb2tpZX0gaGVhZGVyIHdpdGggYQotdmVyc2lvbiBjb29raWUtYXR0cmlidXRlIG9mIDEpIGFyZSB0cmVhdGVkIGFjY29yZGluZyB0byB0aGUgUkZDIDI5NjUKLXJ1bGVzLiAgSG93ZXZlciwgaWYgUkZDIDI5NjUgaGFuZGxpbmcgaXMgdHVybmVkIG9mZiBvcgotXG1lbWJlcntyZmMyMTA5X2FzX25ldHNjYXBlfSBpcyBUcnVlLCBSRkMgMjEwOSBjb29raWVzIGFyZQotJ2Rvd25ncmFkZWQnIGJ5IHRoZSBcY2xhc3N7Q29va2llSmFyfSBpbnN0YW5jZSB0byBOZXRzY2FwZSBjb29raWVzLCBieQotc2V0dGluZyB0aGUgXG1lbWJlcnt2ZXJzaW9ufSBhdHRyaWJ1dGUgb2YgdGhlIFxjbGFzc3tDb29raWV9IGluc3RhbmNlCi10byAwLiAgXGNsYXNze0RlZmF1bHRDb29raWVQb2xpY3l9IGFsc28gcHJvdmlkZXMgc29tZSBwYXJhbWV0ZXJzIHRvCi1hbGxvdyBzb21lIGZpbmUtdHVuaW5nIG9mIHBvbGljeS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtDb29raWV9e30KLVRoaXMgY2xhc3MgcmVwcmVzZW50cyBOZXRzY2FwZSwgUkZDIDIxMDkgYW5kIFJGQyAyOTY1IGNvb2tpZXMuICBJdCBpcwotbm90IGV4cGVjdGVkIHRoYXQgdXNlcnMgb2YgXG1vZHVsZXtjb29raWVsaWJ9IGNvbnN0cnVjdCB0aGVpciBvd24KLVxjbGFzc3tDb29raWV9IGluc3RhbmNlcy4gIEluc3RlYWQsIGlmIG5lY2Vzc2FyeSwgY2FsbAotXG1ldGhvZHttYWtlX2Nvb2tpZXMoKX0gb24gYSBcY2xhc3N7Q29va2llSmFyfSBpbnN0YW5jZS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57c2VlYWxzb30KLQotXHNlZW1vZHVsZXt1cmxsaWIyfXtVUkwgb3BlbmluZyB3aXRoIGF1dG9tYXRpYyBjb29raWUgaGFuZGxpbmcufQotCi1cc2VlbW9kdWxle0Nvb2tpZX17SFRUUCBjb29raWUgY2xhc3NlcywgcHJpbmNpcGFsbHkgdXNlZnVsIGZvcgotc2VydmVyLXNpZGUgY29kZS4gIFRoZSBcbW9kdWxle2Nvb2tpZWxpYn0gYW5kIFxtb2R1bGV7Q29va2llfSBtb2R1bGVzCi1kbyBub3QgZGVwZW5kIG9uIGVhY2ggb3RoZXIufQotCi1cc2VldXJse2h0dHA6Ly93d3dzZWFyY2guc2YubmV0L0NsaWVudENvb2tpZS99e0V4dGVuc2lvbnMgdG8gdGhpcwotbW9kdWxlLCBpbmNsdWRpbmcgYSBjbGFzcyBmb3IgcmVhZGluZyBNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIKLWNvb2tpZXMgb24gV2luZG93cy59Ci0KLVxzZWV1cmx7aHR0cDovL3d3dy5uZXRzY2FwZS5jb20vbmV3c3JlZi9zdGQvY29va2llX3NwZWMuaHRtbH17VGhlCi1zcGVjaWZpY2F0aW9uIG9mIHRoZSBvcmlnaW5hbCBOZXRzY2FwZSBjb29raWUgcHJvdG9jb2wuICBUaG91Z2ggdGhpcwotaXMgc3RpbGwgdGhlIGRvbWluYW50IHByb3RvY29sLCB0aGUgJ05ldHNjYXBlIGNvb2tpZSBwcm90b2NvbCcKLWltcGxlbWVudGVkIGJ5IGFsbCB0aGUgbWFqb3IgYnJvd3NlcnMgKGFuZCBcbW9kdWxle2Nvb2tpZWxpYn0pIG9ubHkKLWJlYXJzIGEgcGFzc2luZyByZXNlbWJsYW5jZSB0byB0aGUgb25lIHNrZXRjaGVkIG91dCBpbgotXGNvZGV7Y29va2llX3NwZWMuaHRtbH0ufQotCi1cc2VlcmZjezIxMDl9e0hUVFAgU3RhdGUgTWFuYWdlbWVudCBNZWNoYW5pc219e09ic29sZXRlZCBieSBSRkMgMjk2NS4KLVVzZXMgXG1haWxoZWFkZXJ7U2V0LUNvb2tpZX0gd2l0aCB2ZXJzaW9uPTEufQotCi1cc2VlcmZjezI5NjV9e0hUVFAgU3RhdGUgTWFuYWdlbWVudCBNZWNoYW5pc219e1RoZSBOZXRzY2FwZSBwcm90b2NvbAotd2l0aCB0aGUgYnVncyBmaXhlZC4gIFVzZXMgXG1haWxoZWFkZXJ7U2V0LUNvb2tpZTJ9IGluIHBsYWNlIG9mCi1cbWFpbGhlYWRlcntTZXQtQ29va2llfS4gIE5vdCB3aWRlbHkgdXNlZC59Ci0KLVxzZWV1cmx7aHR0cDovL2tyaXN0b2wub3JnL2Nvb2tpZS9lcnJhdGEuaHRtbH17VW5maW5pc2hlZCBlcnJhdGEgdG8KLVJGQyAyOTY1Ln0KLQotXHNlZXJmY3syOTY0fXtVc2Ugb2YgSFRUUCBTdGF0ZSBNYW5hZ2VtZW50fXt9Ci0KLVxlbmR7c2VlYWxzb30KLQotCi1cc3Vic2VjdGlvbntDb29raWVKYXIgYW5kIEZpbGVDb29raWVKYXIgT2JqZWN0cyBcbGFiZWx7Y29va2llLWphci1vYmplY3RzfX0KLQotXGNsYXNze0Nvb2tpZUphcn0gb2JqZWN0cyBzdXBwb3J0IHRoZSBpdGVyYXRvciBwcm90b2NvbCBmb3IgaXRlcmF0aW5nCi1vdmVyIGNvbnRhaW5lZCBcY2xhc3N7Q29va2llfSBvYmplY3RzLgotCi1cY2xhc3N7Q29va2llSmFyfSBoYXMgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29va2llSmFyXXthZGRfY29va2llX2hlYWRlcn17cmVxdWVzdH0KLUFkZCBjb3JyZWN0IFxtYWlsaGVhZGVye0Nvb2tpZX0gaGVhZGVyIHRvIFx2YXJ7cmVxdWVzdH0uCi0KLUlmIHBvbGljeSBhbGxvd3MgKGllLiB0aGUgXG1lbWJlcntyZmMyOTY1fSBhbmQgXG1lbWJlcntoaWRlX2Nvb2tpZTJ9Ci1hdHRyaWJ1dGVzIG9mIHRoZSBcY2xhc3N7Q29va2llSmFyfSdzIFxjbGFzc3tDb29raWVQb2xpY3l9IGluc3RhbmNlCi1hcmUgdHJ1ZSBhbmQgZmFsc2UgcmVzcGVjdGl2ZWx5KSwgdGhlIFxtYWlsaGVhZGVye0Nvb2tpZTJ9IGhlYWRlciBpcwotYWxzbyBhZGRlZCB3aGVuIGFwcHJvcHJpYXRlLgotCi1UaGUgXHZhcntyZXF1ZXN0fSBvYmplY3QgKHVzdWFsbHkgYSBcY2xhc3N7dXJsbGliMi5SZXF1ZXN0fSBpbnN0YW5jZSkKLW11c3Qgc3VwcG9ydCB0aGUgbWV0aG9kcyBcbWV0aG9ke2dldF9mdWxsX3VybCgpfSwgXG1ldGhvZHtnZXRfaG9zdCgpfSwKLVxtZXRob2R7Z2V0X3R5cGUoKX0sIFxtZXRob2R7dW52ZXJpZmlhYmxlKCl9LAotXG1ldGhvZHtnZXRfb3JpZ2luX3JlcV9ob3N0KCl9LCBcbWV0aG9ke2hhc19oZWFkZXIoKX0sCi1cbWV0aG9ke2dldF9oZWFkZXIoKX0sIFxtZXRob2R7aGVhZGVyX2l0ZW1zKCl9LCBhbmQKLVxtZXRob2R7YWRkX3VucmVkaXJlY3RlZF9oZWFkZXIoKX0sYXMgZG9jdW1lbnRlZCBieSBcbW9kdWxle3VybGxpYjJ9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29va2llSmFyXXtleHRyYWN0X2Nvb2tpZXN9e3Jlc3BvbnNlLCByZXF1ZXN0fQotRXh0cmFjdCBjb29raWVzIGZyb20gSFRUUCBcdmFye3Jlc3BvbnNlfSBhbmQgc3RvcmUgdGhlbSBpbiB0aGUKLVxjbGFzc3tDb29raWVKYXJ9LCB3aGVyZSBhbGxvd2VkIGJ5IHBvbGljeS4KLQotVGhlIFxjbGFzc3tDb29raWVKYXJ9IHdpbGwgbG9vayBmb3IgYWxsb3dhYmxlIFxtYWlsaGVhZGVye1NldC1Db29raWV9Ci1hbmQgXG1haWxoZWFkZXJ7U2V0LUNvb2tpZTJ9IGhlYWRlcnMgaW4gdGhlIFx2YXJ7cmVzcG9uc2V9IGFyZ3VtZW50LAotYW5kIHN0b3JlIGNvb2tpZXMgYXMgYXBwcm9wcmlhdGUgKHN1YmplY3QgdG8gdGhlCi1cbWV0aG9ke0Nvb2tpZVBvbGljeS5zZXRfb2soKX0gbWV0aG9kJ3MgYXBwcm92YWwpLgotCi1UaGUgXHZhcntyZXNwb25zZX0gb2JqZWN0ICh1c3VhbGx5IHRoZSByZXN1bHQgb2YgYSBjYWxsIHRvCi1cbWV0aG9ke3VybGxpYjIudXJsb3BlbigpfSwgb3Igc2ltaWxhcikgc2hvdWxkIHN1cHBvcnQgYW4KLVxtZXRob2R7aW5mbygpfSBtZXRob2QsIHdoaWNoIHJldHVybnMgYW4gb2JqZWN0IHdpdGggYQotXG1ldGhvZHtnZXRhbGxtYXRjaGluZ2hlYWRlcnMoKX0gbWV0aG9kICh1c3VhbGx5IGEKLVxjbGFzc3ttaW1ldG9vbHMuTWVzc2FnZX0gaW5zdGFuY2UpLgotCi1UaGUgXHZhcntyZXF1ZXN0fSBvYmplY3QgKHVzdWFsbHkgYSBcY2xhc3N7dXJsbGliMi5SZXF1ZXN0fSBpbnN0YW5jZSkKLW11c3Qgc3VwcG9ydCB0aGUgbWV0aG9kcyBcbWV0aG9ke2dldF9mdWxsX3VybCgpfSwgXG1ldGhvZHtnZXRfaG9zdCgpfSwKLVxtZXRob2R7dW52ZXJpZmlhYmxlKCl9LCBhbmQgXG1ldGhvZHtnZXRfb3JpZ2luX3JlcV9ob3N0KCl9LCBhcwotZG9jdW1lbnRlZCBieSBcbW9kdWxle3VybGxpYjJ9LiAgVGhlIHJlcXVlc3QgaXMgdXNlZCB0byBzZXQgZGVmYXVsdAotdmFsdWVzIGZvciBjb29raWUtYXR0cmlidXRlcyBhcyB3ZWxsIGFzIGZvciBjaGVja2luZyB0aGF0IHRoZSBjb29raWUKLWlzIGFsbG93ZWQgdG8gYmUgc2V0LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29va2llSmFyXXtzZXRfcG9saWN5fXtwb2xpY3l9Ci1TZXQgdGhlIFxjbGFzc3tDb29raWVQb2xpY3l9IGluc3RhbmNlIHRvIGJlIHVzZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb29raWVKYXJde21ha2VfY29va2llc317cmVzcG9uc2UsIHJlcXVlc3R9Ci1SZXR1cm4gc2VxdWVuY2Ugb2YgXGNsYXNze0Nvb2tpZX0gb2JqZWN0cyBleHRyYWN0ZWQgZnJvbQotXHZhcntyZXNwb25zZX0gb2JqZWN0LgotCi1TZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIFxtZXRob2R7ZXh0cmFjdF9jb29raWVzfSBmb3IgdGhlIGludGVyZmFjZXMKLXJlcXVpcmVkIG9mIHRoZSBcdmFye3Jlc3BvbnNlfSBhbmQgXHZhcntyZXF1ZXN0fSBhcmd1bWVudHMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb29raWVKYXJde3NldF9jb29raWVfaWZfb2t9e2Nvb2tpZSwgcmVxdWVzdH0KLVNldCBhIFxjbGFzc3tDb29raWV9IGlmIHBvbGljeSBzYXlzIGl0J3MgT0sgdG8gZG8gc28uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb29raWVKYXJde3NldF9jb29raWV9e2Nvb2tpZX0KLVNldCBhIFxjbGFzc3tDb29raWV9LCB3aXRob3V0IGNoZWNraW5nIHdpdGggcG9saWN5IHRvIHNlZSB3aGV0aGVyIG9yCi1ub3QgaXQgc2hvdWxkIGJlIHNldC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0Nvb2tpZUphcl17Y2xlYXJ9e1xvcHRpb25hbHtkb21haW5cb3B0aW9uYWx7LAotICAgICAgcGF0aFxvcHRpb25hbHssIG5hbWV9fX19Ci1DbGVhciBzb21lIGNvb2tpZXMuCi0KLUlmIGludm9rZWQgd2l0aG91dCBhcmd1bWVudHMsIGNsZWFyIGFsbCBjb29raWVzLiAgSWYgZ2l2ZW4gYSBzaW5nbGUKLWFyZ3VtZW50LCBvbmx5IGNvb2tpZXMgYmVsb25naW5nIHRvIHRoYXQgXHZhcntkb21haW59IHdpbGwgYmUgcmVtb3ZlZC4KLUlmIGdpdmVuIHR3byBhcmd1bWVudHMsIGNvb2tpZXMgYmVsb25naW5nIHRvIHRoZSBzcGVjaWZpZWQKLVx2YXJ7ZG9tYWlufSBhbmQgVVJMIFx2YXJ7cGF0aH0gYXJlIHJlbW92ZWQuICBJZiBnaXZlbiB0aHJlZQotYXJndW1lbnRzLCB0aGVuIHRoZSBjb29raWUgd2l0aCB0aGUgc3BlY2lmaWVkIFx2YXJ7ZG9tYWlufSwgXHZhcntwYXRofQotYW5kIFx2YXJ7bmFtZX0gaXMgcmVtb3ZlZC4KLQotUmFpc2VzIFxleGNlcHRpb257S2V5RXJyb3J9IGlmIG5vIG1hdGNoaW5nIGNvb2tpZSBleGlzdHMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb29raWVKYXJde2NsZWFyX3Nlc3Npb25fY29va2llc317fQotRGlzY2FyZCBhbGwgc2Vzc2lvbiBjb29raWVzLgotCi1EaXNjYXJkcyBhbGwgY29udGFpbmVkIGNvb2tpZXMgdGhhdCBoYXZlIGEgdHJ1ZSBcbWVtYmVye2Rpc2NhcmR9Ci1hdHRyaWJ1dGUgKHVzdWFsbHkgYmVjYXVzZSB0aGV5IGhhZCBlaXRoZXIgbm8gXGNvZGV7bWF4LWFnZX0gb3IKLVxjb2Rle2V4cGlyZXN9IGNvb2tpZS1hdHRyaWJ1dGUsIG9yIGFuIGV4cGxpY2l0IFxjb2Rle2Rpc2NhcmR9Ci1jb29raWUtYXR0cmlidXRlKS4gIEZvciBpbnRlcmFjdGl2ZSBicm93c2VycywgdGhlIGVuZCBvZiBhIHNlc3Npb24KLXVzdWFsbHkgY29ycmVzcG9uZHMgdG8gY2xvc2luZyB0aGUgYnJvd3NlciB3aW5kb3cuCi0KLU5vdGUgdGhhdCB0aGUgXG1ldGhvZHtzYXZlKCl9IG1ldGhvZCB3b24ndCBzYXZlIHNlc3Npb24gY29va2llcwotYW55d2F5LCB1bmxlc3MgeW91IGFzayBvdGhlcndpc2UgYnkgcGFzc2luZyBhIHRydWUKLVx2YXJ7aWdub3JlX2Rpc2NhcmR9IGFyZ3VtZW50LgotXGVuZHttZXRob2RkZXNjfQotCi1cY2xhc3N7RmlsZUNvb2tpZUphcn0gaW1wbGVtZW50cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgbWV0aG9kczoKLQotXGJlZ2lue21ldGhvZGRlc2N9W0ZpbGVDb29raWVKYXJde3NhdmV9e2ZpbGVuYW1lPVxjb25zdGFudHtOb25lfSwKLSAgICBpZ25vcmVfZGlzY2FyZD1cY29uc3RhbnR7RmFsc2V9LCBpZ25vcmVfZXhwaXJlcz1cY29uc3RhbnR7RmFsc2V9fQotU2F2ZSBjb29raWVzIHRvIGEgZmlsZS4KLQotVGhpcyBiYXNlIGNsYXNzIHJhaXNlcyBcZXhjZXB0aW9ue05vdEltcGxlbWVudGVkRXJyb3J9LiAgU3ViY2xhc3NlcyBtYXkKLWxlYXZlIHRoaXMgbWV0aG9kIHVuaW1wbGVtZW50ZWQuCi0KLVx2YXJ7ZmlsZW5hbWV9IGlzIHRoZSBuYW1lIG9mIGZpbGUgaW4gd2hpY2ggdG8gc2F2ZSBjb29raWVzLiAgSWYKLVx2YXJ7ZmlsZW5hbWV9IGlzIG5vdCBzcGVjaWZpZWQsIFxtZW1iZXJ7c2VsZi5maWxlbmFtZX0gaXMgdXNlZCAod2hvc2UKLWRlZmF1bHQgaXMgdGhlIHZhbHVlIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IsIGlmIGFueSk7IGlmCi1cbWVtYmVye3NlbGYuZmlsZW5hbWV9IGlzIFxjb25zdGFudHtOb25lfSwgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSBpcwotcmFpc2VkLgotCi1cdmFye2lnbm9yZV9kaXNjYXJkfTogc2F2ZSBldmVuIGNvb2tpZXMgc2V0IHRvIGJlIGRpc2NhcmRlZC4KLVx2YXJ7aWdub3JlX2V4cGlyZXN9OiBzYXZlIGV2ZW4gY29va2llcyB0aGF0IGhhdmUgZXhwaXJlZAotCi1UaGUgZmlsZSBpcyBvdmVyd3JpdHRlbiBpZiBpdCBhbHJlYWR5IGV4aXN0cywgdGh1cyB3aXBpbmcgYWxsIHRoZQotY29va2llcyBpdCBjb250YWlucy4gIFNhdmVkIGNvb2tpZXMgY2FuIGJlIHJlc3RvcmVkIGxhdGVyIHVzaW5nIHRoZQotXG1ldGhvZHtsb2FkKCl9IG9yIFxtZXRob2R7cmV2ZXJ0KCl9IG1ldGhvZHMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtGaWxlQ29va2llSmFyXXtsb2FkfXtmaWxlbmFtZT1cY29uc3RhbnR7Tm9uZX0sCi0gICAgaWdub3JlX2Rpc2NhcmQ9XGNvbnN0YW50e0ZhbHNlfSwgaWdub3JlX2V4cGlyZXM9XGNvbnN0YW50e0ZhbHNlfX0KLUxvYWQgY29va2llcyBmcm9tIGEgZmlsZS4KLQotT2xkIGNvb2tpZXMgYXJlIGtlcHQgdW5sZXNzIG92ZXJ3cml0dGVuIGJ5IG5ld2x5IGxvYWRlZCBvbmVzLgotCi1Bcmd1bWVudHMgYXJlIGFzIGZvciBcbWV0aG9ke3NhdmUoKX0uCi0KLVRoZSBuYW1lZCBmaWxlIG11c3QgYmUgaW4gdGhlIGZvcm1hdCB1bmRlcnN0b29kIGJ5IHRoZSBjbGFzcywgb3IKLVxleGNlcHRpb257TG9hZEVycm9yfSB3aWxsIGJlIHJhaXNlZC4gIEFsc28sIFxleGNlcHRpb257SU9FcnJvcn0gbWF5Ci1iZSByYWlzZWQsIGZvciBleGFtcGxlIGlmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LiAgXG5vdGV7Rm9yCi1iYWNrd2FyZHMtY29tcGF0aWJpbGl0eSB3aXRoIFB5dGhvbiAyLjQgKHdoaWNoIHJhaXNlZAotYW4gXGV4Y2VwdGlvbntJT0Vycm9yfSksIFxleGNlcHRpb257TG9hZEVycm9yfSBpcyBhIHN1YmNsYXNzCi1vZiBcZXhjZXB0aW9ue0lPRXJyb3J9Ln0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0ZpbGVDb29raWVKYXJde3JldmVydH17ZmlsZW5hbWU9XGNvbnN0YW50e05vbmV9LAotICAgIGlnbm9yZV9kaXNjYXJkPVxjb25zdGFudHtGYWxzZX0sIGlnbm9yZV9leHBpcmVzPVxjb25zdGFudHtGYWxzZX19Ci1DbGVhciBhbGwgY29va2llcyBhbmQgcmVsb2FkIGNvb2tpZXMgZnJvbSBhIHNhdmVkIGZpbGUuCi0KLVxtZXRob2R7cmV2ZXJ0KCl9IGNhbiByYWlzZSB0aGUgc2FtZSBleGNlcHRpb25zIGFzIFxtZXRob2R7bG9hZCgpfS4KLUlmIHRoZXJlIGlzIGEgZmFpbHVyZSwgdGhlIG9iamVjdCdzIHN0YXRlIHdpbGwgbm90IGJlIGFsdGVyZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxjbGFzc3tGaWxlQ29va2llSmFyfSBpbnN0YW5jZXMgaGF2ZSB0aGUgZm9sbG93aW5nIHB1YmxpYyBhdHRyaWJ1dGVzOgotCi1cYmVnaW57bWVtYmVyZGVzY31bRmlsZUNvb2tpZUphcl17ZmlsZW5hbWV9Ci1GaWxlbmFtZSBvZiBkZWZhdWx0IGZpbGUgaW4gd2hpY2ggdG8ga2VlcCBjb29raWVzLiAgVGhpcyBhdHRyaWJ1dGUgbWF5Ci1iZSBhc3NpZ25lZCB0by4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W0ZpbGVDb29raWVKYXJde2RlbGF5bG9hZH0KLUlmIHRydWUsIGxvYWQgY29va2llcyBsYXppbHkgZnJvbSBkaXNrLiAgVGhpcyBhdHRyaWJ1dGUgc2hvdWxkIG5vdCBiZQotYXNzaWduZWQgdG8uICBUaGlzIGlzIG9ubHkgYSBoaW50LCBzaW5jZSB0aGlzIG9ubHkgYWZmZWN0cwotcGVyZm9ybWFuY2UsIG5vdCBiZWhhdmlvdXIgKHVubGVzcyB0aGUgY29va2llcyBvbiBkaXNrIGFyZSBjaGFuZ2luZykuCi1BIFxjbGFzc3tDb29raWVKYXJ9IG9iamVjdCBtYXkgaWdub3JlIGl0LiAgTm9uZSBvZiB0aGUKLVxjbGFzc3tGaWxlQ29va2llSmFyfSBjbGFzc2VzIGluY2x1ZGVkIGluIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGxhemlseQotbG9hZHMgY29va2llcy4KLVxlbmR7bWVtYmVyZGVzY30KLQotCi1cc3Vic2VjdGlvbntGaWxlQ29va2llSmFyIHN1YmNsYXNzZXMgYW5kIGNvLW9wZXJhdGlvbiB3aXRoIHdlYiBicm93c2VycwotICBcbGFiZWx7ZmlsZS1jb29raWUtamFyLWNsYXNzZXN9fQotCi1UaGUgZm9sbG93aW5nIFxjbGFzc3tDb29raWVKYXJ9IHN1YmNsYXNzZXMgYXJlIHByb3ZpZGVkIGZvciByZWFkaW5nCi1hbmQgd3JpdGluZyAuICBGdXJ0aGVyIFxjbGFzc3tDb29raWVKYXJ9IHN1YmNsYXNzZXMsIGluY2x1ZGluZyBvbmUKLXRoYXQgcmVhZHMgTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIGNvb2tpZXMsIGFyZSBhdmFpbGFibGUgYXQKLVx1cmx7aHR0cDovL3d3d3NlYXJjaC5zZi5uZXQvQ2xpZW50Q29va2llL30uCi0KLVxiZWdpbntjbGFzc2Rlc2N9e01vemlsbGFDb29raWVKYXJ9e2ZpbGVuYW1lLCBkZWxheWxvYWQ9XGNvbnN0YW50e05vbmV9LAotIHBvbGljeT1cY29uc3RhbnR7Tm9uZX19Ci1BIFxjbGFzc3tGaWxlQ29va2llSmFyfSB0aGF0IGNhbiBsb2FkIGZyb20gYW5kIHNhdmUgY29va2llcyB0byBkaXNrIGluCi10aGUgTW96aWxsYSBcY29kZXtjb29raWVzLnR4dH0gZmlsZSBmb3JtYXQgKHdoaWNoIGlzIGFsc28gdXNlZCBieSB0aGUKLUx5bnggYW5kIE5ldHNjYXBlIGJyb3dzZXJzKS4gIFxub3Rle1RoaXMgbG9zZXMgaW5mb3JtYXRpb24gYWJvdXQgUkZDCi0yOTY1IGNvb2tpZXMsIGFuZCBhbHNvIGFib3V0IG5ld2VyIG9yIG5vbi1zdGFuZGFyZCBjb29raWUtYXR0cmlidXRlcwotc3VjaCBhcyBcY29kZXtwb3J0fS59Ci0KLVx3YXJuaW5ne0JhY2sgdXAgeW91ciBjb29raWVzIGJlZm9yZSBzYXZpbmcgaWYgeW91IGhhdmUgY29va2llcyB3aG9zZQotbG9zcyAvIGNvcnJ1cHRpb24gd291bGQgYmUgaW5jb252ZW5pZW50ICh0aGVyZSBhcmUgc29tZSBzdWJ0bGV0aWVzCi13aGljaCBtYXkgbGVhZCB0byBzbGlnaHQgY2hhbmdlcyBpbiB0aGUgZmlsZSBvdmVyIGEgbG9hZCAvIHNhdmUKLXJvdW5kLXRyaXApLn0KLQotQWxzbyBub3RlIHRoYXQgY29va2llcyBzYXZlZCB3aGlsZSBNb3ppbGxhIGlzIHJ1bm5pbmcgd2lsbCBnZXQKLWNsb2JiZXJlZCBieSBNb3ppbGxhLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0xXUENvb2tpZUphcn17ZmlsZW5hbWUsIGRlbGF5bG9hZD1cY29uc3RhbnR7Tm9uZX0sCi0gcG9saWN5PVxjb25zdGFudHtOb25lfX0KLUEgXGNsYXNze0ZpbGVDb29raWVKYXJ9IHRoYXQgY2FuIGxvYWQgZnJvbSBhbmQgc2F2ZSBjb29raWVzIHRvIGRpc2sgaW4KLWZvcm1hdCBjb21wYXRpYmxlIHdpdGggdGhlIGxpYnd3dy1wZXJsIGxpYnJhcnkncyBcY29kZXtTZXQtQ29va2llM30KLWZpbGUgZm9ybWF0LiAgVGhpcyBpcyBjb252ZW5pZW50IGlmIHlvdSB3YW50IHRvIHN0b3JlIGNvb2tpZXMgaW4gYQotaHVtYW4tcmVhZGFibGUgZmlsZS4KLVxlbmR7Y2xhc3NkZXNjfQotCi0KLVxzdWJzZWN0aW9ue0Nvb2tpZVBvbGljeSBPYmplY3RzIFxsYWJlbHtjb29raWUtcG9saWN5LW9iamVjdHN9fQotCi1PYmplY3RzIGltcGxlbWVudGluZyB0aGUgXGNsYXNze0Nvb2tpZVBvbGljeX0gaW50ZXJmYWNlIGhhdmUgdGhlCi1mb2xsb3dpbmcgbWV0aG9kczoKLQotXGJlZ2lue21ldGhvZGRlc2N9W0Nvb2tpZVBvbGljeV17c2V0X29rfXtjb29raWUsIHJlcXVlc3R9Ci1SZXR1cm4gYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgY29va2llIHNob3VsZCBiZSBhY2NlcHRlZCBmcm9tIHNlcnZlci4KLQotXHZhcntjb29raWV9IGlzIGEgXGNsYXNze2Nvb2tpZWxpYi5Db29raWV9IGluc3RhbmNlLiAgXHZhcntyZXF1ZXN0fSBpcwotYW4gb2JqZWN0IGltcGxlbWVudGluZyB0aGUgaW50ZXJmYWNlIGRlZmluZWQgYnkgdGhlIGRvY3VtZW50YXRpb24gZm9yCi1cbWV0aG9ke0Nvb2tpZUphci5leHRyYWN0X2Nvb2tpZXMoKX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb29raWVQb2xpY3lde3JldHVybl9va317Y29va2llLCByZXF1ZXN0fQotUmV0dXJuIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIGNvb2tpZSBzaG91bGQgYmUgcmV0dXJuZWQgdG8gc2VydmVyLgotCi1cdmFye2Nvb2tpZX0gaXMgYSBcY2xhc3N7Y29va2llbGliLkNvb2tpZX0gaW5zdGFuY2UuICBcdmFye3JlcXVlc3R9IGlzCi1hbiBvYmplY3QgaW1wbGVtZW50aW5nIHRoZSBpbnRlcmZhY2UgZGVmaW5lZCBieSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IKLVxtZXRob2R7Q29va2llSmFyLmFkZF9jb29raWVfaGVhZGVyKCl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29va2llUG9saWN5XXtkb21haW5fcmV0dXJuX29rfXtkb21haW4sIHJlcXVlc3R9Ci1SZXR1cm4gZmFsc2UgaWYgY29va2llcyBzaG91bGQgbm90IGJlIHJldHVybmVkLCBnaXZlbiBjb29raWUgZG9tYWluLgotCi1UaGlzIG1ldGhvZCBpcyBhbiBvcHRpbWl6YXRpb24uICBJdCByZW1vdmVzIHRoZSBuZWVkIGZvciBjaGVja2luZwotZXZlcnkgY29va2llIHdpdGggYSBwYXJ0aWN1bGFyIGRvbWFpbiAod2hpY2ggbWlnaHQgaW52b2x2ZSByZWFkaW5nCi1tYW55IGZpbGVzKS4gIFJldHVybmluZyB0cnVlIGZyb20gXG1ldGhvZHtkb21haW5fcmV0dXJuX29rKCl9IGFuZAotXG1ldGhvZHtwYXRoX3JldHVybl9vaygpfSBsZWF2ZXMgYWxsIHRoZSB3b3JrIHRvIFxtZXRob2R7cmV0dXJuX29rKCl9LgotCi1JZiBcbWV0aG9ke2RvbWFpbl9yZXR1cm5fb2soKX0gcmV0dXJucyB0cnVlIGZvciB0aGUgY29va2llIGRvbWFpbiwKLVxtZXRob2R7cGF0aF9yZXR1cm5fb2soKX0gaXMgY2FsbGVkIGZvciB0aGUgY29va2llIHBhdGguICBPdGhlcndpc2UsCi1cbWV0aG9ke3BhdGhfcmV0dXJuX29rKCl9IGFuZCBcbWV0aG9ke3JldHVybl9vaygpfSBhcmUgbmV2ZXIgY2FsbGVkCi1mb3IgdGhhdCBjb29raWUgZG9tYWluLiAgSWYgXG1ldGhvZHtwYXRoX3JldHVybl9vaygpfSByZXR1cm5zIHRydWUsCi1cbWV0aG9ke3JldHVybl9vaygpfSBpcyBjYWxsZWQgd2l0aCB0aGUgXGNsYXNze0Nvb2tpZX0gb2JqZWN0IGl0c2VsZgotZm9yIGEgZnVsbCBjaGVjay4gIE90aGVyd2lzZSwgXG1ldGhvZHtyZXR1cm5fb2soKX0gaXMgbmV2ZXIgY2FsbGVkIGZvcgotdGhhdCBjb29raWUgcGF0aC4KLQotTm90ZSB0aGF0IFxtZXRob2R7ZG9tYWluX3JldHVybl9vaygpfSBpcyBjYWxsZWQgZm9yIGV2ZXJ5Ci1cZW1waHtjb29raWV9IGRvbWFpbiwgbm90IGp1c3QgZm9yIHRoZSBcZW1waHtyZXF1ZXN0fSBkb21haW4uICBGb3IKLWV4YW1wbGUsIHRoZSBmdW5jdGlvbiBtaWdodCBiZSBjYWxsZWQgd2l0aCBib3RoIFxjb2RleyIuZXhhbXBsZS5jb20ifQotYW5kIFxjb2RleyJ3d3cuZXhhbXBsZS5jb20ifSBpZiB0aGUgcmVxdWVzdCBkb21haW4gaXMKLVxjb2RleyJ3d3cuZXhhbXBsZS5jb20ifS4gIFRoZSBzYW1lIGdvZXMgZm9yCi1cbWV0aG9ke3BhdGhfcmV0dXJuX29rKCl9LgotCi1UaGUgXHZhcntyZXF1ZXN0fSBhcmd1bWVudCBpcyBhcyBkb2N1bWVudGVkIGZvciBcbWV0aG9ke3JldHVybl9vaygpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0Nvb2tpZVBvbGljeV17cGF0aF9yZXR1cm5fb2t9e3BhdGgsIHJlcXVlc3R9Ci1SZXR1cm4gZmFsc2UgaWYgY29va2llcyBzaG91bGQgbm90IGJlIHJldHVybmVkLCBnaXZlbiBjb29raWUgcGF0aC4KLQotU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBcbWV0aG9ke2RvbWFpbl9yZXR1cm5fb2soKX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLQotSW4gYWRkaXRpb24gdG8gaW1wbGVtZW50aW5nIHRoZSBtZXRob2RzIGFib3ZlLCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlCi1cY2xhc3N7Q29va2llUG9saWN5fSBpbnRlcmZhY2UgbXVzdCBhbHNvIHN1cHBseSB0aGUgZm9sbG93aW5nCi1hdHRyaWJ1dGVzLCBpbmRpY2F0aW5nIHdoaWNoIHByb3RvY29scyBzaG91bGQgYmUgdXNlZCwgYW5kIGhvdy4gIEFsbAotb2YgdGhlc2UgYXR0cmlidXRlcyBtYXkgYmUgYXNzaWduZWQgdG8uCi0KLVxiZWdpbnttZW1iZXJkZXNjfVtDb29raWVQb2xpY3lde25ldHNjYXBlfQotSW1wbGVtZW50IE5ldHNjYXBlIHByb3RvY29sLgotXGVuZHttZW1iZXJkZXNjfQotXGJlZ2lue21lbWJlcmRlc2N9W0Nvb2tpZVBvbGljeV17cmZjMjk2NX0KLUltcGxlbWVudCBSRkMgMjk2NSBwcm90b2NvbC4KLVxlbmR7bWVtYmVyZGVzY30KLVxiZWdpbnttZW1iZXJkZXNjfVtDb29raWVQb2xpY3lde2hpZGVfY29va2llMn0KLURvbid0IGFkZCBcbWFpbGhlYWRlcntDb29raWUyfSBoZWFkZXIgdG8gcmVxdWVzdHMgKHRoZSBwcmVzZW5jZSBvZgotdGhpcyBoZWFkZXIgaW5kaWNhdGVzIHRvIHRoZSBzZXJ2ZXIgdGhhdCB3ZSB1bmRlcnN0YW5kIFJGQyAyOTY1Ci1jb29raWVzKS4KLVxlbmR7bWVtYmVyZGVzY30KLQotVGhlIG1vc3QgdXNlZnVsIHdheSB0byBkZWZpbmUgYSBcY2xhc3N7Q29va2llUG9saWN5fSBjbGFzcyBpcyBieQotc3ViY2xhc3NpbmcgZnJvbSBcY2xhc3N7RGVmYXVsdENvb2tpZVBvbGljeX0gYW5kIG92ZXJyaWRpbmcgc29tZSBvcgotYWxsIG9mIHRoZSBtZXRob2RzIGFib3ZlLiAgXGNsYXNze0Nvb2tpZVBvbGljeX0gaXRzZWxmIG1heSBiZSB1c2VkIGFzCi1hICdudWxsIHBvbGljeScgdG8gYWxsb3cgc2V0dGluZyBhbmQgcmVjZWl2aW5nIGFueSBhbmQgYWxsIGNvb2tpZXMKLSh0aGlzIGlzIHVubGlrZWx5IHRvIGJlIHVzZWZ1bCkuCi0KLQotXHN1YnNlY3Rpb257RGVmYXVsdENvb2tpZVBvbGljeSBPYmplY3RzIFxsYWJlbHtkZWZhdWx0LWNvb2tpZS1wb2xpY3ktb2JqZWN0c319Ci0KLUltcGxlbWVudHMgdGhlIHN0YW5kYXJkIHJ1bGVzIGZvciBhY2NlcHRpbmcgYW5kIHJldHVybmluZyBjb29raWVzLgotCi1Cb3RoIFJGQyAyOTY1IGFuZCBOZXRzY2FwZSBjb29raWVzIGFyZSBjb3ZlcmVkLiAgUkZDIDI5NjUgaGFuZGxpbmcgaXMKLXN3aXRjaGVkIG9mZiBieSBkZWZhdWx0LgotCi1UaGUgZWFzaWVzdCB3YXkgdG8gcHJvdmlkZSB5b3VyIG93biBwb2xpY3kgaXMgdG8gb3ZlcnJpZGUgdGhpcyBjbGFzcwotYW5kIGNhbGwgaXRzIG1ldGhvZHMgaW4geW91ciBvdmVycmlkZGVuIGltcGxlbWVudGF0aW9ucyBiZWZvcmUgYWRkaW5nCi15b3VyIG93biBhZGRpdGlvbmFsIGNoZWNrczoKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IGNvb2tpZWxpYgotY2xhc3MgTXlDb29raWVQb2xpY3koY29va2llbGliLkRlZmF1bHRDb29raWVQb2xpY3kpOgotICAgIGRlZiBzZXRfb2soc2VsZiwgY29va2llLCByZXF1ZXN0KToKLSAgICAgICAgaWYgbm90IGNvb2tpZWxpYi5EZWZhdWx0Q29va2llUG9saWN5LnNldF9vayhzZWxmLCBjb29raWUsIHJlcXVlc3QpOgotICAgICAgICAgICAgcmV0dXJuIEZhbHNlCi0gICAgICAgIGlmIGlfZG9udF93YW50X3RvX3N0b3JlX3RoaXNfY29va2llKGNvb2tpZSk6Ci0gICAgICAgICAgICByZXR1cm4gRmFsc2UKLSAgICAgICAgcmV0dXJuIFRydWUKLVxlbmR7dmVyYmF0aW19Ci0KLUluIGFkZGl0aW9uIHRvIHRoZSBmZWF0dXJlcyByZXF1aXJlZCB0byBpbXBsZW1lbnQgdGhlCi1cY2xhc3N7Q29va2llUG9saWN5fSBpbnRlcmZhY2UsIHRoaXMgY2xhc3MgYWxsb3dzIHlvdSB0byBibG9jayBhbmQKLWFsbG93IGRvbWFpbnMgZnJvbSBzZXR0aW5nIGFuZCByZWNlaXZpbmcgY29va2llcy4gIFRoZXJlIGFyZSBhbHNvIHNvbWUKLXN0cmljdG5lc3Mgc3dpdGNoZXMgdGhhdCBhbGxvdyB5b3UgdG8gdGlnaHRlbiB1cCB0aGUgcmF0aGVyIGxvb3NlCi1OZXRzY2FwZSBwcm90b2NvbCBydWxlcyBhIGxpdHRsZSBiaXQgKGF0IHRoZSBjb3N0IG9mIGJsb2NraW5nIHNvbWUKLWJlbmlnbiBjb29raWVzKS4KLQotQSBkb21haW4gYmxhY2tsaXN0IGFuZCB3aGl0ZWxpc3QgaXMgcHJvdmlkZWQgKGJvdGggb2ZmIGJ5IGRlZmF1bHQpLgotT25seSBkb21haW5zIG5vdCBpbiB0aGUgYmxhY2tsaXN0IGFuZCBwcmVzZW50IGluIHRoZSB3aGl0ZWxpc3QgKGlmIHRoZQotd2hpdGVsaXN0IGlzIGFjdGl2ZSkgcGFydGljaXBhdGUgaW4gY29va2llIHNldHRpbmcgYW5kIHJldHVybmluZy4gIFVzZQotdGhlIFx2YXJ7YmxvY2tlZF9kb21haW5zfSBjb25zdHJ1Y3RvciBhcmd1bWVudCwgYW5kCi1cbWV0aG9ke2Jsb2NrZWRfZG9tYWlucygpfSBhbmQgXG1ldGhvZHtzZXRfYmxvY2tlZF9kb21haW5zKCl9IG1ldGhvZHMKLShhbmQgdGhlIGNvcnJlc3BvbmRpbmcgYXJndW1lbnQgYW5kIG1ldGhvZHMgZm9yCi1cdmFye2FsbG93ZWRfZG9tYWluc30pLiAgSWYgeW91IHNldCBhIHdoaXRlbGlzdCwgeW91IGNhbiB0dXJuIGl0IG9mZgotYWdhaW4gYnkgc2V0dGluZyBpdCB0byBcY29uc3RhbnR7Tm9uZX0uCi0KLURvbWFpbnMgaW4gYmxvY2sgb3IgYWxsb3cgbGlzdHMgdGhhdCBkbyBub3Qgc3RhcnQgd2l0aCBhIGRvdCBtdXN0Ci1lcXVhbCB0aGUgY29va2llIGRvbWFpbiB0byBiZSBtYXRjaGVkLiAgRm9yIGV4YW1wbGUsCi1cY29kZXsiZXhhbXBsZS5jb20ifSBtYXRjaGVzIGEgYmxhY2tsaXN0IGVudHJ5IG9mCi1cY29kZXsiZXhhbXBsZS5jb20ifSwgYnV0IFxjb2RleyJ3d3cuZXhhbXBsZS5jb20ifSBkb2VzIG5vdC4gIERvbWFpbnMKLXRoYXQgZG8gc3RhcnQgd2l0aCBhIGRvdCBhcmUgbWF0Y2hlZCBieSBtb3JlIHNwZWNpZmljIGRvbWFpbnMgdG9vLgotRm9yIGV4YW1wbGUsIGJvdGggXGNvZGV7Ind3dy5leGFtcGxlLmNvbSJ9IGFuZAotXGNvZGV7Ind3dy5jb3lvdGUuZXhhbXBsZS5jb20ifSBtYXRjaCBcY29kZXsiLmV4YW1wbGUuY29tIn0gKGJ1dAotXGNvZGV7ImV4YW1wbGUuY29tIn0gaXRzZWxmIGRvZXMgbm90KS4gIElQIGFkZHJlc3NlcyBhcmUgYW4gZXhjZXB0aW9uLAotYW5kIG11c3QgbWF0Y2ggZXhhY3RseS4gIEZvciBleGFtcGxlLCBpZiBibG9ja2VkX2RvbWFpbnMgY29udGFpbnMKLVxjb2RleyIxOTIuMTY4LjEuMiJ9IGFuZCBcY29kZXsiLjE2OC4xLjIifSwgMTkyLjE2OC4xLjIgaXMgYmxvY2tlZCwKLWJ1dCAxOTMuMTY4LjEuMiBpcyBub3QuCi0KLVxjbGFzc3tEZWZhdWx0Q29va2llUG9saWN5fSBpbXBsZW1lbnRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbAotbWV0aG9kczoKLQotXGJlZ2lue21ldGhvZGRlc2N9W0RlZmF1bHRDb29raWVQb2xpY3lde2Jsb2NrZWRfZG9tYWluc317fQotUmV0dXJuIHRoZSBzZXF1ZW5jZSBvZiBibG9ja2VkIGRvbWFpbnMgKGFzIGEgdHVwbGUpLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRGVmYXVsdENvb2tpZVBvbGljeV17c2V0X2Jsb2NrZWRfZG9tYWluc30KLSAge2Jsb2NrZWRfZG9tYWluc30KLVNldCB0aGUgc2VxdWVuY2Ugb2YgYmxvY2tlZCBkb21haW5zLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRGVmYXVsdENvb2tpZVBvbGljeV17aXNfYmxvY2tlZH17ZG9tYWlufQotUmV0dXJuIHdoZXRoZXIgXHZhcntkb21haW59IGlzIG9uIHRoZSBibGFja2xpc3QgZm9yIHNldHRpbmcgb3IKLXJlY2VpdmluZyBjb29raWVzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRGVmYXVsdENvb2tpZVBvbGljeV17YWxsb3dlZF9kb21haW5zfXt9Ci1SZXR1cm4gXGNvbnN0YW50e05vbmV9LCBvciB0aGUgc2VxdWVuY2Ugb2YgYWxsb3dlZCBkb21haW5zIChhcyBhIHR1cGxlKS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0RlZmF1bHRDb29raWVQb2xpY3lde3NldF9hbGxvd2VkX2RvbWFpbnN9Ci0gIHthbGxvd2VkX2RvbWFpbnN9Ci1TZXQgdGhlIHNlcXVlbmNlIG9mIGFsbG93ZWQgZG9tYWlucywgb3IgXGNvbnN0YW50e05vbmV9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRGVmYXVsdENvb2tpZVBvbGljeV17aXNfbm90X2FsbG93ZWR9e2RvbWFpbn0KLVJldHVybiB3aGV0aGVyIFx2YXJ7ZG9tYWlufSBpcyBub3Qgb24gdGhlIHdoaXRlbGlzdCBmb3Igc2V0dGluZyBvcgotcmVjZWl2aW5nIGNvb2tpZXMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxjbGFzc3tEZWZhdWx0Q29va2llUG9saWN5fSBpbnN0YW5jZXMgaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMsCi13aGljaCBhcmUgYWxsIGluaXRpYWxpc2VkIGZyb20gdGhlIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyBvZiB0aGUgc2FtZQotbmFtZSwgYW5kIHdoaWNoIG1heSBhbGwgYmUgYXNzaWduZWQgdG8uCi0KLVxiZWdpbnttZW1iZXJkZXNjfVtEZWZhdWx0Q29va2llUG9saWN5XXtyZmMyMTA5X2FzX25ldHNjYXBlfQotSWYgdHJ1ZSwgcmVxdWVzdCB0aGF0IHRoZSBcY2xhc3N7Q29va2llSmFyfSBpbnN0YW5jZSBkb3duZ3JhZGUgUkZDCi0yMTA5IGNvb2tpZXMgKGllLiBjb29raWVzIHJlY2VpdmVkIGluIGEgXG1haWxoZWFkZXJ7U2V0LUNvb2tpZX0gaGVhZGVyCi13aXRoIGEgdmVyc2lvbiBjb29raWUtYXR0cmlidXRlIG9mIDEpIHRvIE5ldHNjYXBlIGNvb2tpZXMgYnkgc2V0dGluZwotdGhlIHZlcnNpb24gYXR0cmlidXRlIG9mIHRoZSBcY2xhc3N7Q29va2llfSBpbnN0YW5jZSB0byAwLiAgVGhlCi1kZWZhdWx0IHZhbHVlIGlzIFxjb25zdGFudHtOb25lfSwgaW4gd2hpY2ggY2FzZSBSRkMgMjEwOSBjb29raWVzIGFyZQotZG93bmdyYWRlZCBpZiBhbmQgb25seSBpZiBSRkMgMjk2NSBoYW5kbGluZyBpcyB0dXJuZWQgb2ZmLiAgVGhlcmVmb3JlLAotUkZDIDIxMDkgY29va2llcyBhcmUgZG93bmdyYWRlZCBieSBkZWZhdWx0LgotXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke21lbWJlcmRlc2N9Ci0KLUdlbmVyYWwgc3RyaWN0bmVzcyBzd2l0Y2hlczoKLQotXGJlZ2lue21lbWJlcmRlc2N9W0RlZmF1bHRDb29raWVQb2xpY3lde3N0cmljdF9kb21haW59Ci1Eb24ndCBhbGxvdyBzaXRlcyB0byBzZXQgdHdvLWNvbXBvbmVudCBkb21haW5zIHdpdGggY291bnRyeS1jb2RlCi10b3AtbGV2ZWwgZG9tYWlucyBsaWtlIFxjb2Rley5jby51a30sIFxjb2Rley5nb3YudWt9LAotXGNvZGV7LmNvLm56fS5ldGMuICBUaGlzIGlzIGZhciBmcm9tIHBlcmZlY3QgYW5kIGlzbid0IGd1YXJhbnRlZWQgdG8KLXdvcmshCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVJGQyAyOTY1IHByb3RvY29sIHN0cmljdG5lc3Mgc3dpdGNoZXM6Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtEZWZhdWx0Q29va2llUG9saWN5XXtzdHJpY3RfcmZjMjk2NV91bnZlcmlmaWFibGV9Ci1Gb2xsb3cgUkZDIDI5NjUgcnVsZXMgb24gdW52ZXJpZmlhYmxlIHRyYW5zYWN0aW9ucyAodXN1YWxseSwgYW4KLXVudmVyaWZpYWJsZSB0cmFuc2FjdGlvbiBpcyBvbmUgcmVzdWx0aW5nIGZyb20gYSByZWRpcmVjdCBvciBhIHJlcXVlc3QKLWZvciBhbiBpbWFnZSBob3N0ZWQgb24gYW5vdGhlciBzaXRlKS4gIElmIHRoaXMgaXMgZmFsc2UsIGNvb2tpZXMgYXJlCi1cZW1waHtuZXZlcn0gYmxvY2tlZCBvbiB0aGUgYmFzaXMgb2YgdmVyaWZpYWJpbGl0eQotXGVuZHttZW1iZXJkZXNjfQotCi1OZXRzY2FwZSBwcm90b2NvbCBzdHJpY3RuZXNzIHN3aXRjaGVzOgotCi1cYmVnaW57bWVtYmVyZGVzY31bRGVmYXVsdENvb2tpZVBvbGljeV17c3RyaWN0X25zX3VudmVyaWZpYWJsZX0KLWFwcGx5IFJGQyAyOTY1IHJ1bGVzIG9uIHVudmVyaWZpYWJsZSB0cmFuc2FjdGlvbnMgZXZlbiB0byBOZXRzY2FwZQotY29va2llcwotXGVuZHttZW1iZXJkZXNjfQotXGJlZ2lue21lbWJlcmRlc2N9W0RlZmF1bHRDb29raWVQb2xpY3lde3N0cmljdF9uc19kb21haW59Ci1GbGFncyBpbmRpY2F0aW5nIGhvdyBzdHJpY3QgdG8gYmUgd2l0aCBkb21haW4tbWF0Y2hpbmcgcnVsZXMgZm9yCi1OZXRzY2FwZSBjb29raWVzLiAgU2VlIGJlbG93IGZvciBhY2NlcHRhYmxlIHZhbHVlcy4KLVxlbmR7bWVtYmVyZGVzY30KLVxiZWdpbnttZW1iZXJkZXNjfVtEZWZhdWx0Q29va2llUG9saWN5XXtzdHJpY3RfbnNfc2V0X2luaXRpYWxfZG9sbGFyfQotSWdub3JlIGNvb2tpZXMgaW4gU2V0LUNvb2tpZTogaGVhZGVycyB0aGF0IGhhdmUgbmFtZXMgc3RhcnRpbmcgd2l0aAotXGNvZGV7J1wkJ30uCi1cZW5ke21lbWJlcmRlc2N9Ci1cYmVnaW57bWVtYmVyZGVzY31bRGVmYXVsdENvb2tpZVBvbGljeV17c3RyaWN0X25zX3NldF9wYXRofQotRG9uJ3QgYWxsb3cgc2V0dGluZyBjb29raWVzIHdob3NlIHBhdGggZG9lc24ndCBwYXRoLW1hdGNoIHJlcXVlc3QgVVJJLgotXGVuZHttZW1iZXJkZXNjfQotCi1cbWVtYmVye3N0cmljdF9uc19kb21haW59IGlzIGEgY29sbGVjdGlvbiBvZiBmbGFncy4gIEl0cyB2YWx1ZSBpcwotY29uc3RydWN0ZWQgYnkgb3ItaW5nIHRvZ2V0aGVyIChmb3IgZXhhbXBsZSwKLVxjb2Rle0RvbWFpblN0cmljdE5vRG90c3xEb21haW5TdHJpY3ROb25Eb21haW59IG1lYW5zIGJvdGggZmxhZ3MgYXJlCi1zZXQpLgotCi1cYmVnaW57bWVtYmVyZGVzY31bRGVmYXVsdENvb2tpZVBvbGljeV17RG9tYWluU3RyaWN0Tm9Eb3RzfQotV2hlbiBzZXR0aW5nIGNvb2tpZXMsIHRoZSAnaG9zdCBwcmVmaXgnIG11c3Qgbm90IGNvbnRhaW4gYSBkb3QKLShlZy4gXGNvZGV7d3d3LmZvby5iYXIuY29tfSBjYW4ndCBzZXQgYSBjb29raWUgZm9yIFxjb2Rley5iYXIuY29tfSwKLWJlY2F1c2UgXGNvZGV7d3d3LmZvb30gY29udGFpbnMgYSBkb3QpLgotXGVuZHttZW1iZXJkZXNjfQotXGJlZ2lue21lbWJlcmRlc2N9W0RlZmF1bHRDb29raWVQb2xpY3lde0RvbWFpblN0cmljdE5vbkRvbWFpbn0KLUNvb2tpZXMgdGhhdCBkaWQgbm90IGV4cGxpY2l0bHkgc3BlY2lmeSBhIFxjb2Rle2RvbWFpbn0KLWNvb2tpZS1hdHRyaWJ1dGUgY2FuIG9ubHkgYmUgcmV0dXJuZWQgdG8gYSBkb21haW4gZXF1YWwgdG8gdGhlIGRvbWFpbgotdGhhdCBzZXQgdGhlIGNvb2tpZSAoZWcuIFxjb2Rle3NwYW0uZXhhbXBsZS5jb219IHdvbid0IGJlIHJldHVybmVkCi1jb29raWVzIGZyb20gXGNvZGV7ZXhhbXBsZS5jb219IHRoYXQgaGFkIG5vIFxjb2Rle2RvbWFpbn0KLWNvb2tpZS1hdHRyaWJ1dGUpLgotXGVuZHttZW1iZXJkZXNjfQotXGJlZ2lue21lbWJlcmRlc2N9W0RlZmF1bHRDb29raWVQb2xpY3lde0RvbWFpblJGQzI5NjVNYXRjaH0KLVdoZW4gc2V0dGluZyBjb29raWVzLCByZXF1aXJlIGEgZnVsbCBSRkMgMjk2NSBkb21haW4tbWF0Y2guCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgcHJvdmlkZWQgZm9yIGNvbnZlbmllbmNlLCBhbmQgYXJlIHRoZQotbW9zdCB1c2VmdWwgY29tYmluYXRpb25zIG9mIHRoZSBhYm92ZSBmbGFnczoKLQotXGJlZ2lue21lbWJlcmRlc2N9W0RlZmF1bHRDb29raWVQb2xpY3lde0RvbWFpbkxpYmVyYWx9Ci1FcXVpdmFsZW50IHRvIDAgKGllLiBhbGwgb2YgdGhlIGFib3ZlIE5ldHNjYXBlIGRvbWFpbiBzdHJpY3RuZXNzIGZsYWdzCi1zd2l0Y2hlZCBvZmYpLgotXGVuZHttZW1iZXJkZXNjfQotXGJlZ2lue21lbWJlcmRlc2N9W0RlZmF1bHRDb29raWVQb2xpY3lde0RvbWFpblN0cmljdH0KLUVxdWl2YWxlbnQgdG8gXGNvZGV7RG9tYWluU3RyaWN0Tm9Eb3RzfERvbWFpblN0cmljdE5vbkRvbWFpbn0uCi1cZW5ke21lbWJlcmRlc2N9Ci0KLQotXHN1YnNlY3Rpb257Q29va2llIE9iamVjdHMgXGxhYmVse2Nvb2tpZS1vYmplY3RzfX0KLQotXGNsYXNze0Nvb2tpZX0gaW5zdGFuY2VzIGhhdmUgUHl0aG9uIGF0dHJpYnV0ZXMgcm91Z2hseSBjb3JyZXNwb25kaW5nCi10byB0aGUgc3RhbmRhcmQgY29va2llLWF0dHJpYnV0ZXMgc3BlY2lmaWVkIGluIHRoZSB2YXJpb3VzIGNvb2tpZQotc3RhbmRhcmRzLiAgVGhlIGNvcnJlc3BvbmRlbmNlIGlzIG5vdCBvbmUtdG8tb25lLCBiZWNhdXNlIHRoZXJlIGFyZQotY29tcGxpY2F0ZWQgcnVsZXMgZm9yIGFzc2lnbmluZyBkZWZhdWx0IHZhbHVlcywgYmVjYXVzZSB0aGUKLVxjb2Rle21heC1hZ2V9IGFuZCBcY29kZXtleHBpcmVzfSBjb29raWUtYXR0cmlidXRlcyBjb250YWluIGVxdWl2YWxlbnQKLWluZm9ybWF0aW9uLCBhbmQgYmVjYXVzZSBSRkMgMjEwOSBjb29raWVzIG1heSBiZSAnZG93bmdyYWRlZCcgYnkKLVxtb2R1bGV7Y29va2llbGlifSBmcm9tIHZlcnNpb24gMSB0byB2ZXJzaW9uIDAgKE5ldHNjYXBlKSBjb29raWVzLgotCi1Bc3NpZ25tZW50IHRvIHRoZXNlIGF0dHJpYnV0ZXMgc2hvdWxkIG5vdCBiZSBuZWNlc3Nhcnkgb3RoZXIgdGhhbiBpbgotcmFyZSBjaXJjdW1zdGFuY2VzIGluIGEgXGNsYXNze0Nvb2tpZVBvbGljeX0gbWV0aG9kLiAgVGhlIGNsYXNzIGRvZXMKLW5vdCBlbmZvcmNlIGludGVybmFsIGNvbnNpc3RlbmN5LCBzbyB5b3Ugc2hvdWxkIGtub3cgd2hhdCB5b3UncmUKLWRvaW5nIGlmIHlvdSBkbyB0aGF0LgotCi1cYmVnaW57bWVtYmVyZGVzY31bQ29va2llXXt2ZXJzaW9ufQotSW50ZWdlciBvciBcY29uc3RhbnR7Tm9uZX0uICBOZXRzY2FwZSBjb29raWVzIGhhdmUgXG1lbWJlcnt2ZXJzaW9ufSAwLgotUkZDIDI5NjUgYW5kIFJGQyAyMTA5IGNvb2tpZXMgaGF2ZSBhIFxjb2Rle3ZlcnNpb259IGNvb2tpZS1hdHRyaWJ1dGUKLW9mIDEuICBIb3dldmVyLCBub3RlIHRoYXQgXG1vZHVsZXtjb29raWVsaWJ9IG1heSAnZG93bmdyYWRlJyBSRkMgMjEwOQotY29va2llcyB0byBOZXRzY2FwZSBjb29raWVzLCBpbiB3aGljaCBjYXNlIFxtZW1iZXJ7dmVyc2lvbn0gaXMgMC4KLVxlbmR7bWVtYmVyZGVzY30KLVxiZWdpbnttZW1iZXJkZXNjfVtDb29raWVde25hbWV9Ci1Db29raWUgbmFtZSAoYSBzdHJpbmcpLgotXGVuZHttZW1iZXJkZXNjfQotXGJlZ2lue21lbWJlcmRlc2N9W0Nvb2tpZV17dmFsdWV9Ci1Db29raWUgdmFsdWUgKGEgc3RyaW5nKSwgb3IgXGNvbnN0YW50e05vbmV9LgotXGVuZHttZW1iZXJkZXNjfQotXGJlZ2lue21lbWJlcmRlc2N9W0Nvb2tpZV17cG9ydH0KLVN0cmluZyByZXByZXNlbnRpbmcgYSBwb3J0IG9yIGEgc2V0IG9mIHBvcnRzIChlZy4gJzgwJywgb3IgJzgwLDgwODAnKSwKLW9yIFxjb25zdGFudHtOb25lfS4KLVxlbmR7bWVtYmVyZGVzY30KLVxiZWdpbnttZW1iZXJkZXNjfVtDb29raWVde3BhdGh9Ci1Db29raWUgcGF0aCAoYSBzdHJpbmcsIGVnLiBcY29kZXsnL2FjbWUvcm9ja2V0X2xhdW5jaGVycyd9KS4KLVxlbmR7bWVtYmVyZGVzY30KLVxiZWdpbnttZW1iZXJkZXNjfVtDb29raWVde3NlY3VyZX0KLVRydWUgaWYgY29va2llIHNob3VsZCBvbmx5IGJlIHJldHVybmVkIG92ZXIgYSBzZWN1cmUgY29ubmVjdGlvbi4KLVxlbmR7bWVtYmVyZGVzY30KLVxiZWdpbnttZW1iZXJkZXNjfVtDb29raWVde2V4cGlyZXN9Ci1JbnRlZ2VyIGV4cGlyeSBkYXRlIGluIHNlY29uZHMgc2luY2UgZXBvY2gsIG9yIFxjb25zdGFudHtOb25lfS4gIFNlZQotYWxzbyB0aGUgXG1ldGhvZHtpc19leHBpcmVkKCl9IG1ldGhvZC4KLVxlbmR7bWVtYmVyZGVzY30KLVxiZWdpbnttZW1iZXJkZXNjfVtDb29raWVde2Rpc2NhcmR9Ci1UcnVlIGlmIHRoaXMgaXMgYSBzZXNzaW9uIGNvb2tpZS4KLVxlbmR7bWVtYmVyZGVzY30KLVxiZWdpbnttZW1iZXJkZXNjfVtDb29raWVde2NvbW1lbnR9Ci1TdHJpbmcgY29tbWVudCBmcm9tIHRoZSBzZXJ2ZXIgZXhwbGFpbmluZyB0aGUgZnVuY3Rpb24gb2YgdGhpcyBjb29raWUsCi1vciBcY29uc3RhbnR7Tm9uZX0uCi1cZW5ke21lbWJlcmRlc2N9Ci1cYmVnaW57bWVtYmVyZGVzY31bQ29va2llXXtjb21tZW50X3VybH0KLVVSTCBsaW5raW5nIHRvIGEgY29tbWVudCBmcm9tIHRoZSBzZXJ2ZXIgZXhwbGFpbmluZyB0aGUgZnVuY3Rpb24gb2YKLXRoaXMgY29va2llLCBvciBcY29uc3RhbnR7Tm9uZX0uCi1cZW5ke21lbWJlcmRlc2N9Ci1cYmVnaW57bWVtYmVyZGVzY31bQ29va2llXXtyZmMyMTA5fQotVHJ1ZSBpZiB0aGlzIGNvb2tpZSB3YXMgcmVjZWl2ZWQgYXMgYW4gUkZDIDIxMDkgY29va2llIChpZS4gdGhlIGNvb2tpZQotYXJyaXZlZCBpbiBhIFxtYWlsaGVhZGVye1NldC1Db29raWV9IGhlYWRlciwgYW5kIHRoZSB2YWx1ZSBvZiB0aGUKLVZlcnNpb24gY29va2llLWF0dHJpYnV0ZSBpbiB0aGF0IGhlYWRlciB3YXMgMSkuICBUaGlzIGF0dHJpYnV0ZSBpcwotcHJvdmlkZWQgYmVjYXVzZSBcbW9kdWxle2Nvb2tpZWxpYn0gbWF5ICdkb3duZ3JhZGUnIFJGQyAyMTA5IGNvb2tpZXMKLXRvIE5ldHNjYXBlIGNvb2tpZXMsIGluIHdoaWNoIGNhc2UgXG1lbWJlcnt2ZXJzaW9ufSBpcyAwLgotXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtDb29raWVde3BvcnRfc3BlY2lmaWVkfQotVHJ1ZSBpZiBhIHBvcnQgb3Igc2V0IG9mIHBvcnRzIHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZCBieSB0aGUgc2VydmVyCi0oaW4gdGhlIFxtYWlsaGVhZGVye1NldC1Db29raWV9IC8gXG1haWxoZWFkZXJ7U2V0LUNvb2tpZTJ9IGhlYWRlcikuCi1cZW5ke21lbWJlcmRlc2N9Ci1cYmVnaW57bWVtYmVyZGVzY31bQ29va2llXXtkb21haW5fc3BlY2lmaWVkfQotVHJ1ZSBpZiBhIGRvbWFpbiB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQgYnkgdGhlIHNlcnZlci4KLVxlbmR7bWVtYmVyZGVzY30KLVxiZWdpbnttZW1iZXJkZXNjfVtDb29raWVde2RvbWFpbl9pbml0aWFsX2RvdH0KLVRydWUgaWYgdGhlIGRvbWFpbiBleHBsaWNpdGx5IHNwZWNpZmllZCBieSB0aGUgc2VydmVyIGJlZ2FuIHdpdGggYQotZG90IChcY29kZXsnLid9KS4KLVxlbmR7bWVtYmVyZGVzY30KLQotQ29va2llcyBtYXkgaGF2ZSBhZGRpdGlvbmFsIG5vbi1zdGFuZGFyZCBjb29raWUtYXR0cmlidXRlcy4gIFRoZXNlIG1heQotYmUgYWNjZXNzZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29va2llXXtoYXNfbm9uc3RhbmRhcmRfYXR0cn17bmFtZX0KLVJldHVybiB0cnVlIGlmIGNvb2tpZSBoYXMgdGhlIG5hbWVkIGNvb2tpZS1hdHRyaWJ1dGUuCi1cZW5ke21ldGhvZGRlc2N9Ci1cYmVnaW57bWV0aG9kZGVzY31bQ29va2llXXtnZXRfbm9uc3RhbmRhcmRfYXR0cn17bmFtZSwgZGVmYXVsdD1cY29uc3RhbnR7Tm9uZX19Ci1JZiBjb29raWUgaGFzIHRoZSBuYW1lZCBjb29raWUtYXR0cmlidXRlLCByZXR1cm4gaXRzIHZhbHVlLgotT3RoZXJ3aXNlLCByZXR1cm4gXHZhcntkZWZhdWx0fS4KLVxlbmR7bWV0aG9kZGVzY30KLVxiZWdpbnttZXRob2RkZXNjfVtDb29raWVde3NldF9ub25zdGFuZGFyZF9hdHRyfXtuYW1lLCB2YWx1ZX0KLVNldCB0aGUgdmFsdWUgb2YgdGhlIG5hbWVkIGNvb2tpZS1hdHRyaWJ1dGUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVRoZSBcY2xhc3N7Q29va2llfSBjbGFzcyBhbHNvIGRlZmluZXMgdGhlIGZvbGxvd2luZyBtZXRob2Q6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb29raWVde2lzX2V4cGlyZWR9e1xvcHRpb25hbHtub3c9XGNvbnN0YW50e05vbmV9fX0KLVRydWUgaWYgY29va2llIGhhcyBwYXNzZWQgdGhlIHRpbWUgYXQgd2hpY2ggdGhlIHNlcnZlciByZXF1ZXN0ZWQgaXQKLXNob3VsZCBleHBpcmUuICBJZiBcdmFye25vd30gaXMgZ2l2ZW4gKGluIHNlY29uZHMgc2luY2UgdGhlIGVwb2NoKSwKLXJldHVybiB3aGV0aGVyIHRoZSBjb29raWUgaGFzIGV4cGlyZWQgYXQgdGhlIHNwZWNpZmllZCB0aW1lLgotXGVuZHttZXRob2RkZXNjfQotCi0KLVxzdWJzZWN0aW9ue0V4YW1wbGVzIFxsYWJlbHtjb29raWVsaWItZXhhbXBsZXN9fQotCi1UaGUgZmlyc3QgZXhhbXBsZSBzaG93cyB0aGUgbW9zdCBjb21tb24gdXNhZ2Ugb2YgXG1vZHVsZXtjb29raWVsaWJ9OgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgY29va2llbGliLCB1cmxsaWIyCi1jaiA9IGNvb2tpZWxpYi5Db29raWVKYXIoKQotb3BlbmVyID0gdXJsbGliMi5idWlsZF9vcGVuZXIodXJsbGliMi5IVFRQQ29va2llUHJvY2Vzc29yKGNqKSkKLXIgPSBvcGVuZXIub3BlbigiaHR0cDovL2V4YW1wbGUuY29tLyIpCi1cZW5ke3ZlcmJhdGltfQotCi1UaGlzIGV4YW1wbGUgaWxsdXN0cmF0ZXMgaG93IHRvIG9wZW4gYSBVUkwgdXNpbmcgeW91ciBOZXRzY2FwZSwKLU1vemlsbGEsIG9yIEx5bnggY29va2llcyAoYXNzdW1lcyBcVU5JWHt9L05ldHNjYXBlIGNvbnZlbnRpb24gZm9yCi1sb2NhdGlvbiBvZiB0aGUgY29va2llcyBmaWxlKToKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IG9zLCBjb29raWVsaWIsIHVybGxpYjIKLWNqID0gY29va2llbGliLk1vemlsbGFDb29raWVKYXIoKQotY2oubG9hZChvcy5wYXRoLmpvaW4ob3MuZW52aXJvblsiSE9NRSJdLCAiLm5ldHNjYXBlL2Nvb2tpZXMudHh0IikpCi1vcGVuZXIgPSB1cmxsaWIyLmJ1aWxkX29wZW5lcih1cmxsaWIyLkhUVFBDb29raWVQcm9jZXNzb3IoY2opKQotciA9IG9wZW5lci5vcGVuKCJodHRwOi8vZXhhbXBsZS5jb20vIikKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBuZXh0IGV4YW1wbGUgaWxsdXN0cmF0ZXMgdGhlIHVzZSBvZiBcY2xhc3N7RGVmYXVsdENvb2tpZVBvbGljeX0uCi1UdXJuIG9uIFJGQyAyOTY1IGNvb2tpZXMsIGJlIG1vcmUgc3RyaWN0IGFib3V0IGRvbWFpbnMgd2hlbiBzZXR0aW5nCi1hbmQgcmV0dXJuaW5nIE5ldHNjYXBlIGNvb2tpZXMsIGFuZCBibG9jayBzb21lIGRvbWFpbnMgZnJvbSBzZXR0aW5nCi1jb29raWVzIG9yIGhhdmluZyB0aGVtIHJldHVybmVkOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgdXJsbGliMgotZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQotcG9saWN5ID0gRGVmYXVsdENvb2tpZVBvbGljeSgKLSAgICByZmMyOTY1PVRydWUsIHN0cmljdF9uc19kb21haW49UG9saWN5LkRvbWFpblN0cmljdCwKLSAgICBibG9ja2VkX2RvbWFpbnM9WyJhZHMubmV0IiwgIi5hZHMubmV0Il0pCi1jaiA9IENvb2tpZUphcihwb2xpY3kpCi1vcGVuZXIgPSB1cmxsaWIyLmJ1aWxkX29wZW5lcih1cmxsaWIyLkhUVFBDb29raWVQcm9jZXNzb3IoY2opKQotciA9IG9wZW5lci5vcGVuKCJodHRwOi8vZXhhbXBsZS5jb20vIikKLVxlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmNvcHkudGV4IGIvRG9jL2xpYi9saWJjb3B5LnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk2NDE4Ny4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmNvcHkudGV4CisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtjb3B5fSAtLS0KLSAgICAgICAgIFNoYWxsb3cgYW5kIGRlZXAgY29weSBvcGVyYXRpb25zfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17Y29weX0KLVxtb2R1bGVzeW5vcHNpc3tTaGFsbG93IGFuZCBkZWVwIGNvcHkgb3BlcmF0aW9ucy59Ci0KLQotVGhpcyBtb2R1bGUgcHJvdmlkZXMgZ2VuZXJpYyAoc2hhbGxvdyBhbmQgZGVlcCkgY29weWluZyBvcGVyYXRpb25zLgotXHdpdGhzdWJpdGVteyhpbiBjb3B5KX17XHR0aW5kZXh7Y29weSgpfVx0dGluZGV4e2RlZXBjb3B5KCl9fQotCi1JbnRlcmZhY2Ugc3VtbWFyeToKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IGNvcHkKLQoteCA9IGNvcHkuY29weSh5KSAgICAgICAgIyBtYWtlIGEgc2hhbGxvdyBjb3B5IG9mIHkKLXggPSBjb3B5LmRlZXBjb3B5KHkpICAgICMgbWFrZSBhIGRlZXAgY29weSBvZiB5Ci1cZW5ke3ZlcmJhdGltfQotJQotRm9yIG1vZHVsZSBzcGVjaWZpYyBlcnJvcnMsIFxleGNlcHRpb257Y29weS5lcnJvcn0gaXMgcmFpc2VkLgotCi1UaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHNoYWxsb3cgYW5kIGRlZXAgY29weWluZyBpcyBvbmx5IHJlbGV2YW50IGZvcgotY29tcG91bmQgb2JqZWN0cyAob2JqZWN0cyB0aGF0IGNvbnRhaW4gb3RoZXIgb2JqZWN0cywgbGlrZSBsaXN0cyBvcgotY2xhc3MgaW5zdGFuY2VzKToKLQotXGJlZ2lue2l0ZW1pemV9Ci0KLVxpdGVtCi1BIFxlbXBoe3NoYWxsb3cgY29weX0gY29uc3RydWN0cyBhIG5ldyBjb21wb3VuZCBvYmplY3QgYW5kIHRoZW4gKHRvIHRoZQotZXh0ZW50IHBvc3NpYmxlKSBpbnNlcnRzIFxlbXBoe3JlZmVyZW5jZXN9IGludG8gaXQgdG8gdGhlIG9iamVjdHMgZm91bmQKLWluIHRoZSBvcmlnaW5hbC4KLQotXGl0ZW0KLUEgXGVtcGh7ZGVlcCBjb3B5fSBjb25zdHJ1Y3RzIGEgbmV3IGNvbXBvdW5kIG9iamVjdCBhbmQgdGhlbiwKLXJlY3Vyc2l2ZWx5LCBpbnNlcnRzIFxlbXBoe2NvcGllc30gaW50byBpdCBvZiB0aGUgb2JqZWN0cyBmb3VuZCBpbiB0aGUKLW9yaWdpbmFsLgotCi1cZW5ke2l0ZW1pemV9Ci0KLVR3byBwcm9ibGVtcyBvZnRlbiBleGlzdCB3aXRoIGRlZXAgY29weSBvcGVyYXRpb25zIHRoYXQgZG9uJ3QgZXhpc3QKLXdpdGggc2hhbGxvdyBjb3B5IG9wZXJhdGlvbnM6Ci0KLVxiZWdpbntpdGVtaXplfQotCi1caXRlbQotUmVjdXJzaXZlIG9iamVjdHMgKGNvbXBvdW5kIG9iamVjdHMgdGhhdCwgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwKLWNvbnRhaW4gYSByZWZlcmVuY2UgdG8gdGhlbXNlbHZlcykgbWF5IGNhdXNlIGEgcmVjdXJzaXZlIGxvb3AuCi0KLVxpdGVtCi1CZWNhdXNlIGRlZXAgY29weSBjb3BpZXMgXGVtcGh7ZXZlcnl0aGluZ30gaXQgbWF5IGNvcHkgdG9vIG11Y2gsCi1lLmcuLCBhZG1pbmlzdHJhdGl2ZSBkYXRhIHN0cnVjdHVyZXMgdGhhdCBzaG91bGQgYmUgc2hhcmVkIGV2ZW4KLWJldHdlZW4gY29waWVzLgotCi1cZW5ke2l0ZW1pemV9Ci0KLVRoZSBcZnVuY3Rpb257ZGVlcGNvcHkoKX0gZnVuY3Rpb24gYXZvaWRzIHRoZXNlIHByb2JsZW1zIGJ5OgotCi1cYmVnaW57aXRlbWl6ZX0KLQotXGl0ZW0KLWtlZXBpbmcgYSBgYG1lbW8nJyBkaWN0aW9uYXJ5IG9mIG9iamVjdHMgYWxyZWFkeSBjb3BpZWQgZHVyaW5nIHRoZSBjdXJyZW50Ci1jb3B5aW5nIHBhc3M7IGFuZAotCi1caXRlbQotbGV0dGluZyB1c2VyLWRlZmluZWQgY2xhc3NlcyBvdmVycmlkZSB0aGUgY29weWluZyBvcGVyYXRpb24gb3IgdGhlCi1zZXQgb2YgY29tcG9uZW50cyBjb3BpZWQuCi0KLVxlbmR7aXRlbWl6ZX0KLQotVGhpcyBtb2R1bGUgZG9lcyBub3QgY29weSB0eXBlcyBsaWtlIG1vZHVsZSwgbWV0aG9kLAotc3RhY2sgdHJhY2UsIHN0YWNrIGZyYW1lLCBmaWxlLCBzb2NrZXQsIHdpbmRvdywgYXJyYXksIG9yIGFueSBzaW1pbGFyCi10eXBlcy4gIEl0IGRvZXMgYGBjb3B5JycgZnVuY3Rpb25zIGFuZCBjbGFzc2VzIChzaGFsbG93IGFuZCBkZWVwbHkpLAotYnkgcmV0dXJuaW5nIHRoZSBvcmlnaW5hbCBvYmplY3QgdW5jaGFuZ2VkOyB0aGlzIGlzIGNvbXBhdGlibGUgd2l0aAotdGhlIHdheSB0aGVzZSBhcmUgdHJlYXRlZCBieSB0aGUgXG1vZHVsZXtwaWNrbGV9IG1vZHVsZS4KLVx2ZXJzaW9uY2hhbmdlZFtBZGRlZCBjb3B5aW5nIGZ1bmN0aW9uc117Mi41fQotCi1DbGFzc2VzIGNhbiB1c2UgdGhlIHNhbWUgaW50ZXJmYWNlcyB0byBjb250cm9sIGNvcHlpbmcgdGhhdCB0aGV5IHVzZQotdG8gY29udHJvbCBwaWNrbGluZy4gIFNlZSB0aGUgZGVzY3JpcHRpb24gb2YgbW9kdWxlCi1ccmVmbW9kdWxle3BpY2tsZX1ccmVmc3Rtb2RpbmRleHtwaWNrbGV9IGZvciBpbmZvcm1hdGlvbiBvbiB0aGVzZQotbWV0aG9kcy4gIFRoZSBcbW9kdWxle2NvcHl9IG1vZHVsZSBkb2VzIG5vdCB1c2UgdGhlCi1ccmVmbW9kdWxlW2NvcHlyZWdde2NvcHlfcmVnfSByZWdpc3RyYXRpb24gbW9kdWxlLgotCi1JbiBvcmRlciBmb3IgYSBjbGFzcyB0byBkZWZpbmUgaXRzIG93biBjb3B5IGltcGxlbWVudGF0aW9uLCBpdCBjYW4KLWRlZmluZSBzcGVjaWFsIG1ldGhvZHMgXG1ldGhvZHtfX2NvcHlfXygpfSBhbmQKLVxtZXRob2R7X19kZWVwY29weV9fKCl9LiAgVGhlIGZvcm1lciBpcyBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZQotc2hhbGxvdyBjb3B5IG9wZXJhdGlvbjsgbm8gYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIHBhc3NlZC4gIFRoZQotbGF0dGVyIGlzIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGRlZXAgY29weSBvcGVyYXRpb247IGl0IGlzIHBhc3NlZAotb25lIGFyZ3VtZW50LCB0aGUgbWVtbyBkaWN0aW9uYXJ5LiAgSWYgdGhlIFxtZXRob2R7X19kZWVwY29weV9fKCl9Ci1pbXBsZW1lbnRhdGlvbiBuZWVkcyB0byBtYWtlIGEgZGVlcCBjb3B5IG9mIGEgY29tcG9uZW50LCBpdCBzaG91bGQKLWNhbGwgdGhlIFxmdW5jdGlvbntkZWVwY29weSgpfSBmdW5jdGlvbiB3aXRoIHRoZSBjb21wb25lbnQgYXMgZmlyc3QKLWFyZ3VtZW50IGFuZCB0aGUgbWVtbyBkaWN0aW9uYXJ5IGFzIHNlY29uZCBhcmd1bWVudC4KLVx3aXRoc3ViaXRlbXsoY29weSBwcm90b2NvbCl9e1x0dGluZGV4e19fY29weV9fKCl9XHR0aW5kZXh7X19kZWVwY29weV9fKCl9fQotCi1cYmVnaW57c2VlYWxzb30KLVxzZWVtb2R1bGV7cGlja2xlfXtEaXNjdXNzaW9uIG9mIHRoZSBzcGVjaWFsIG1ldGhvZHMgdXNlZCB0bwotc3VwcG9ydCBvYmplY3Qgc3RhdGUgcmV0cmlldmFsIGFuZCByZXN0b3JhdGlvbi59Ci1cZW5ke3NlZWFsc299CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmNvcHlyZWcudGV4IGIvRG9jL2xpYi9saWJjb3B5cmVnLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0OTc4Yy4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmNvcHlyZWcudGV4CisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtjb3B5X3JlZ30gLS0tCi0gICAgICAgICBSZWdpc3RlciBcbW9kdWxle3BpY2tsZX0gc3VwcG9ydCBmdW5jdGlvbnN9Ci0KLVxkZWNsYXJlbW9kdWxlW2NvcHlyZWdde3N0YW5kYXJkfXtjb3B5X3JlZ30KLVxtb2R1bGVzeW5vcHNpc3tSZWdpc3RlciBcbW9kdWxle3BpY2tsZX0gc3VwcG9ydCBmdW5jdGlvbnMufQotCi0KLVRoZSBcbW9kdWxle2NvcHlfcmVnfSBtb2R1bGUgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlCi1ccmVmbW9kdWxle3BpY2tsZX1ccmVmc3Rtb2RpbmRleHtwaWNrbGV9XCBhbmQKLVxyZWZtb2R1bGV7Y1BpY2tsZX1ccmVmYmltb2RpbmRleHtjUGlja2xlfVwgbW9kdWxlcy4gIFRoZQotXHJlZm1vZHVsZXtjb3B5fVxyZWZzdG1vZGluZGV4e2NvcHl9XCBtb2R1bGUgaXMgbGlrZWx5IHRvIHVzZSB0aGlzIGluIHRoZQotZnV0dXJlIGFzIHdlbGwuICBJdCBwcm92aWRlcyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGFib3V0IG9iamVjdAotY29uc3RydWN0b3JzIHdoaWNoIGFyZSBub3QgY2xhc3Nlcy4gIFN1Y2ggY29uc3RydWN0b3JzIG1heSBiZSBmYWN0b3J5Ci1mdW5jdGlvbnMgb3IgY2xhc3MgaW5zdGFuY2VzLgotCi0KLVxiZWdpbntmdW5jZGVzY317Y29uc3RydWN0b3J9e29iamVjdH0KLSAgRGVjbGFyZXMgXHZhcntvYmplY3R9IHRvIGJlIGEgdmFsaWQgY29uc3RydWN0b3IuICBJZiBcdmFye29iamVjdH0gaXMKLSAgbm90IGNhbGxhYmxlIChhbmQgaGVuY2Ugbm90IHZhbGlkIGFzIGEgY29uc3RydWN0b3IpLCByYWlzZXMKLSAgXGV4Y2VwdGlvbntUeXBlRXJyb3J9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtwaWNrbGV9e3R5cGUsIGZ1bmN0aW9uXG9wdGlvbmFseywgY29uc3RydWN0b3J9fQotICBEZWNsYXJlcyB0aGF0IFx2YXJ7ZnVuY3Rpb259IHNob3VsZCBiZSB1c2VkIGFzIGEgYGByZWR1Y3Rpb24nJwotICBmdW5jdGlvbiBmb3Igb2JqZWN0cyBvZiB0eXBlIFx2YXJ7dHlwZX07IFx2YXJ7dHlwZX0gbXVzdCBub3QgYmUgYQotICBgYGNsYXNzaWMnJyBjbGFzcyBvYmplY3QuICAoQ2xhc3NpYyBjbGFzc2VzIGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5OwotICBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBccmVmbW9kdWxle3BpY2tsZX0gbW9kdWxlIGZvcgotICBkZXRhaWxzLikgIFx2YXJ7ZnVuY3Rpb259IHNob3VsZCByZXR1cm4gZWl0aGVyIGEgc3RyaW5nIG9yIGEgdHVwbGUKLSAgY29udGFpbmluZyB0d28gb3IgdGhyZWUgZWxlbWVudHMuCi0KLSAgVGhlIG9wdGlvbmFsIFx2YXJ7Y29uc3RydWN0b3J9IHBhcmFtZXRlciwgaWYgcHJvdmlkZWQsIGlzIGEKLSAgY2FsbGFibGUgb2JqZWN0IHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlY29uc3RydWN0IHRoZSBvYmplY3Qgd2hlbgotICBjYWxsZWQgd2l0aCB0aGUgdHVwbGUgb2YgYXJndW1lbnRzIHJldHVybmVkIGJ5IFx2YXJ7ZnVuY3Rpb259IGF0Ci0gIHBpY2tsaW5nIHRpbWUuICBcZXhjZXB0aW9ue1R5cGVFcnJvcn0gd2lsbCBiZSByYWlzZWQgaWYKLSAgXHZhcntvYmplY3R9IGlzIGEgY2xhc3Mgb3IgXHZhcntjb25zdHJ1Y3Rvcn0gaXMgbm90IGNhbGxhYmxlLgotCi0gIFNlZSB0aGUgXHJlZm1vZHVsZXtwaWNrbGV9IG1vZHVsZSBmb3IgbW9yZQotICBkZXRhaWxzIG9uIHRoZSBpbnRlcmZhY2UgZXhwZWN0ZWQgb2YgXHZhcntmdW5jdGlvbn0gYW5kCi0gIFx2YXJ7Y29uc3RydWN0b3J9LgotXGVuZHtmdW5jZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliY3J5cHQudGV4IGIvRG9jL2xpYi9saWJjcnlwdC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZTcxNjMuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJjcnlwdC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle2NyeXB0fSAtLS0KLSAgICAgICAgIEZ1bmN0aW9uIHRvIGNoZWNrIFxVTklYe30gcGFzc3dvcmRzfQotCi1cZGVjbGFyZW1vZHVsZXtidWlsdGlufXtjcnlwdH0KLSAgXHBsYXRmb3Jte1VuaXh9Ci1cbW9kdWxlc3lub3BzaXN7VGhlIFxjZnVuY3Rpb257Y3J5cHQoKX0gZnVuY3Rpb24gdXNlZCB0byBjaGVjawotICBcVU5JWFwgcGFzc3dvcmRzLn0KLVxtb2R1bGVhdXRob3J7U3RldmVuIEQuIE1hamV3c2tpfXtzZG03Z0B2aXJnaW5pYS5lZHV9Ci1cc2VjdGlvbmF1dGhvcntTdGV2ZW4gRC4gTWFqZXdza2l9e3NkbTdnQHZpcmdpbmlhLmVkdX0KLVxzZWN0aW9uYXV0aG9ye1BldGVyIEZ1bmt9e3BmQGFydGNvbS1nbWJoLmRlfQotCi0KLVRoaXMgbW9kdWxlIGltcGxlbWVudHMgYW4gaW50ZXJmYWNlIHRvIHRoZQotXG1hbnBhZ2V7Y3J5cHR9ezN9XGluZGV4e2NyeXB0KDMpfSByb3V0aW5lLCB3aGljaCBpcyBhIG9uZS13YXkgaGFzaAotZnVuY3Rpb24gYmFzZWQgdXBvbiBhIG1vZGlmaWVkIERFU1xpbmRleGlpe2NpcGhlcn17REVTfSBhbGdvcml0aG07IHNlZQotdGhlIFxVTklYe30gbWFuIHBhZ2UgZm9yIGZ1cnRoZXIgZGV0YWlscy4gIFBvc3NpYmxlIHVzZXMgaW5jbHVkZQotYWxsb3dpbmcgUHl0aG9uIHNjcmlwdHMgdG8gYWNjZXB0IHR5cGVkIHBhc3N3b3JkcyBmcm9tIHRoZSB1c2VyLCBvcgotYXR0ZW1wdGluZyB0byBjcmFjayBcVU5JWHt9IHBhc3N3b3JkcyB3aXRoIGEgZGljdGlvbmFyeS4KLQotTm90aWNlIHRoYXQgdGhlIGJlaGF2aW9yIG9mIHRoaXMgbW9kdWxlIGRlcGVuZHMgb24gdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiAKLW9mIHRoZSBcbWFucGFnZXtjcnlwdH17M31caW5kZXh7Y3J5cHQoMyl9IHJvdXRpbmUgaW4gdGhlIHJ1bm5pbmcgc3lzdGVtLiAKLVRoZXJlZm9yZSwgYW55IGV4dGVuc2lvbnMgYXZhaWxhYmxlIG9uIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHdpbGwgYWxzbyAKLWJlIGF2YWlsYWJsZSBvbiB0aGlzIG1vZHVsZS4KLVxiZWdpbntmdW5jZGVzY317Y3J5cHR9e3dvcmQsIHNhbHR9IAotICBcdmFye3dvcmR9IHdpbGwgdXN1YWxseSBiZSBhIHVzZXIncyBwYXNzd29yZCBhcyB0eXBlZCBhdCBhIHByb21wdCBvciAKLSAgaW4gYSBncmFwaGljYWwgaW50ZXJmYWNlLiAgXHZhcntzYWx0fSBpcyB1c3VhbGx5IGEgcmFuZG9tCi0gIHR3by1jaGFyYWN0ZXIgc3RyaW5nIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBwZXJ0dXJiIHRoZSBERVMgYWxnb3JpdGhtCi0gIGluIG9uZSBvZiA0MDk2IHdheXMuICBUaGUgY2hhcmFjdGVycyBpbiBcdmFye3NhbHR9IG11c3QgYmUgaW4gdGhlCi0gIHNldCBccmVnZXhwe1suL2EtekEtWjAtOV19LiAgUmV0dXJucyB0aGUgaGFzaGVkIHBhc3N3b3JkIGFzIGEKLSAgc3RyaW5nLCB3aGljaCB3aWxsIGJlIGNvbXBvc2VkIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgc2FtZSBhbHBoYWJldAotICAgYXMgdGhlIHNhbHQgKHRoZSBmaXJzdCB0d28gY2hhcmFjdGVycyByZXByZXNlbnQgdGhlIHNhbHQgaXRzZWxmKS4KLQotICBTaW5jZSBhIGZldyBcbWFucGFnZXtjcnlwdH17M31caW5kZXh7Y3J5cHQoMyl9IGV4dGVuc2lvbnMgYWxsb3cgZGlmZmVyZW50Ci0gIHZhbHVlcywgd2l0aCBkaWZmZXJlbnQgc2l6ZXMgaW4gdGhlIFx2YXJ7c2FsdH0sIGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSAKLSAgdGhlIGZ1bGwgY3J5cHRlZCBwYXNzd29yZCBhcyBzYWx0IHdoZW4gY2hlY2tpbmcgZm9yIGEgcGFzc3dvcmQuCi1cZW5ke2Z1bmNkZXNjfQotCi0KLUEgc2ltcGxlIGV4YW1wbGUgaWxsdXN0cmF0aW5nIHR5cGljYWwgdXNlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgY3J5cHQsIGdldHBhc3MsIHB3ZAotCi1kZWYgcmF3X2lucHV0KHByb21wdCk6Ci0gICAgaW1wb3J0IHN5cwotICAgIHN5cy5zdGRvdXQud3JpdGUocHJvbXB0KQotICAgIHN5cy5zdGRvdXQuZmx1c2goKQotICAgIHJldHVybiBzeXMuc3RkaW4ucmVhZGxpbmUoKQotCi1kZWYgbG9naW4oKToKLSAgICB1c2VybmFtZSA9IHJhd19pbnB1dCgnUHl0aG9uIGxvZ2luOicpCi0gICAgY3J5cHRlZHBhc3N3ZCA9IHB3ZC5nZXRwd25hbSh1c2VybmFtZSlbMV0KLSAgICBpZiBjcnlwdGVkcGFzc3dkOgotICAgICAgICBpZiBjcnlwdGVkcGFzc3dkID09ICd4JyBvciBjcnlwdGVkcGFzc3dkID09ICcqJzogCi0gICAgICAgICAgICByYWlzZSAiU29ycnksIGN1cnJlbnRseSBubyBzdXBwb3J0IGZvciBzaGFkb3cgcGFzc3dvcmRzIgotICAgICAgICBjbGVhcnRleHQgPSBnZXRwYXNzLmdldHBhc3MoKQotICAgICAgICByZXR1cm4gY3J5cHQuY3J5cHQoY2xlYXJ0ZXh0LCBjcnlwdGVkcGFzc3dkKSA9PSBjcnlwdGVkcGFzc3dkCi0gICAgZWxzZToKLSAgICAgICAgcmV0dXJuIDEKLVxlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmNyeXB0by50ZXggYi9Eb2MvbGliL2xpYmNyeXB0by50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1OTg3YmYuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJjcnlwdG8udGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotXGNoYXB0ZXJ7Q3J5cHRvZ3JhcGhpYyBTZXJ2aWNlc30KLVxsYWJlbHtjcnlwdG99Ci1caW5kZXh7Y3J5cHRvZ3JhcGh5fQotCi1UaGUgbW9kdWxlcyBkZXNjcmliZWQgaW4gdGhpcyBjaGFwdGVyIGltcGxlbWVudCB2YXJpb3VzIGFsZ29yaXRobXMgb2YKLWEgY3J5cHRvZ3JhcGhpYyBuYXR1cmUuICBUaGV5IGFyZSBhdmFpbGFibGUgYXQgdGhlIGRpc2NyZXRpb24gb2YgdGhlCi1pbnN0YWxsYXRpb24uICBIZXJlJ3MgYW4gb3ZlcnZpZXc6Ci0KLVxsb2NhbG1vZHVsZXRhYmxlCi0KLUhhcmRjb3JlIGN5cGhlcnB1bmtzIHdpbGwgcHJvYmFibHkgZmluZCB0aGUgY3J5cHRvZ3JhcGhpYyBtb2R1bGVzCi13cml0dGVuIGJ5IEEuTS4gS3VjaGxpbmcgb2YgZnVydGhlciBpbnRlcmVzdDsgdGhlIHBhY2thZ2UgY29udGFpbnMKLW1vZHVsZXMgZm9yIHZhcmlvdXMgZW5jcnlwdGlvbiBhbGdvcml0aG1zLCBtb3N0IG5vdGFibHkgQUVTLiAgVGhlc2UgbW9kdWxlcwotYXJlIG5vdCBkaXN0cmlidXRlZCB3aXRoIFB5dGhvbiBidXQgYXZhaWxhYmxlIHNlcGFyYXRlbHkuICBTZWUgdGhlIFVSTAotXHVybHtodHRwOi8vd3d3LmFtay5jYS9weXRob24vY29kZS9jcnlwdG8uaHRtbH0gCi1mb3IgbW9yZSBpbmZvcm1hdGlvbi4KLVxpbmRleGlpe0FFU317YWxnb3JpdGhtfQotXGluZGV4e2NyeXB0b2dyYXBoeX0KLVxpbmRleHtLdWNobGluZywgQW5kcmV3fQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJjc3YudGV4IGIvRG9jL2xpYi9saWJjc3YudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGZjOGRiLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGliY3N2LnRleAorKysgL2Rldi9udWxsCkBAIC0xLDUzOCArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle2Nzdn0gLS0tIENTViBGaWxlIFJlYWRpbmcgYW5kIFdyaXRpbmd9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtjc3Z9Ci1cbW9kdWxlc3lub3BzaXN7V3JpdGUgYW5kIHJlYWQgdGFidWxhciBkYXRhIHRvIGFuZCBmcm9tIGRlbGltaXRlZCBmaWxlcy59Ci1cc2VjdGlvbmF1dGhvcntTa2lwIE1vbnRhbmFyb317c2tpcEBwb2JveC5jb219Ci0KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGluZGV4e2Nzdn0KLVxpbmRleGlpe2RhdGF9e3RhYnVsYXJ9Ci0KLVRoZSBzby1jYWxsZWQgQ1NWIChDb21tYSBTZXBhcmF0ZWQgVmFsdWVzKSBmb3JtYXQgaXMgdGhlIG1vc3QgY29tbW9uIGltcG9ydAotYW5kIGV4cG9ydCBmb3JtYXQgZm9yIHNwcmVhZHNoZWV0cyBhbmQgZGF0YWJhc2VzLiAgVGhlcmUgaXMgbm8gYGBDU1YKLXN0YW5kYXJkJycsIHNvIHRoZSBmb3JtYXQgaXMgb3BlcmF0aW9uYWxseSBkZWZpbmVkIGJ5IHRoZSBtYW55IGFwcGxpY2F0aW9ucwotd2hpY2ggcmVhZCBhbmQgd3JpdGUgaXQuICBUaGUgbGFjayBvZiBhIHN0YW5kYXJkIG1lYW5zIHRoYXQgc3VidGxlCi1kaWZmZXJlbmNlcyBvZnRlbiBleGlzdCBpbiB0aGUgZGF0YSBwcm9kdWNlZCBhbmQgY29uc3VtZWQgYnkgZGlmZmVyZW50Ci1hcHBsaWNhdGlvbnMuICBUaGVzZSBkaWZmZXJlbmNlcyBjYW4gbWFrZSBpdCBhbm5veWluZyB0byBwcm9jZXNzIENTViBmaWxlcwotZnJvbSBtdWx0aXBsZSBzb3VyY2VzLiAgU3RpbGwsIHdoaWxlIHRoZSBkZWxpbWl0ZXJzIGFuZCBxdW90aW5nIGNoYXJhY3RlcnMKLXZhcnksIHRoZSBvdmVyYWxsIGZvcm1hdCBpcyBzaW1pbGFyIGVub3VnaCB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIHdyaXRlIGEKLXNpbmdsZSBtb2R1bGUgd2hpY2ggY2FuIGVmZmljaWVudGx5IG1hbmlwdWxhdGUgc3VjaCBkYXRhLCBoaWRpbmcgdGhlIGRldGFpbHMKLW9mIHJlYWRpbmcgYW5kIHdyaXRpbmcgdGhlIGRhdGEgZnJvbSB0aGUgcHJvZ3JhbW1lci4KLQotVGhlIFxtb2R1bGV7Y3N2fSBtb2R1bGUgaW1wbGVtZW50cyBjbGFzc2VzIHRvIHJlYWQgYW5kIHdyaXRlIHRhYnVsYXIgZGF0YSBpbgotQ1NWIGZvcm1hdC4gIEl0IGFsbG93cyBwcm9ncmFtbWVycyB0byBzYXksIGBgd3JpdGUgdGhpcyBkYXRhIGluIHRoZSBmb3JtYXQKLXByZWZlcnJlZCBieSBFeGNlbCwnJyBvciBgYHJlYWQgZGF0YSBmcm9tIHRoaXMgZmlsZSB3aGljaCB3YXMgZ2VuZXJhdGVkIGJ5Ci1FeGNlbCwnJyB3aXRob3V0IGtub3dpbmcgdGhlIHByZWNpc2UgZGV0YWlscyBvZiB0aGUgQ1NWIGZvcm1hdCB1c2VkIGJ5Ci1FeGNlbC4gIFByb2dyYW1tZXJzIGNhbiBhbHNvIGRlc2NyaWJlIHRoZSBDU1YgZm9ybWF0cyB1bmRlcnN0b29kIGJ5IG90aGVyCi1hcHBsaWNhdGlvbnMgb3IgZGVmaW5lIHRoZWlyIG93biBzcGVjaWFsLXB1cnBvc2UgQ1NWIGZvcm1hdHMuCi0KLVRoZSBcbW9kdWxle2Nzdn0gbW9kdWxlJ3MgXGNsYXNze3JlYWRlcn0gYW5kIFxjbGFzc3t3cml0ZXJ9IG9iamVjdHMgcmVhZCBhbmQKLXdyaXRlIHNlcXVlbmNlcy4gIFByb2dyYW1tZXJzIGNhbiBhbHNvIHJlYWQgYW5kIHdyaXRlIGRhdGEgaW4gZGljdGlvbmFyeQotZm9ybSB1c2luZyB0aGUgXGNsYXNze0RpY3RSZWFkZXJ9IGFuZCBcY2xhc3N7RGljdFdyaXRlcn0gY2xhc3Nlcy4KLQotXGJlZ2lue25vdGljZX0KLSAgVGhpcyB2ZXJzaW9uIG9mIHRoZSBcbW9kdWxle2Nzdn0gbW9kdWxlIGRvZXNuJ3Qgc3VwcG9ydCBVbmljb2RlCi0gIGlucHV0LiAgQWxzbywgdGhlcmUgYXJlIGN1cnJlbnRseSBzb21lIGlzc3VlcyByZWdhcmRpbmcgXEFTQ0lJe30gTlVMCi0gIGNoYXJhY3RlcnMuICBBY2NvcmRpbmdseSwgYWxsIGlucHV0IHNob3VsZCBiZSBVVEYtOCBvciBwcmludGFibGUKLSAgXEFTQ0lJe30gdG8gYmUgc2FmZTsgc2VlIHRoZSBleGFtcGxlcyBpbiBzZWN0aW9uflxyZWZ7Y3N2LWV4YW1wbGVzfS4KLSAgVGhlc2UgcmVzdHJpY3Rpb25zIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgotXGVuZHtub3RpY2V9Ci0KLVxiZWdpbntzZWVhbHNvfQotJSAgXHNlZW1vZHVsZXthcnJheX17QXJyYXlzIG9mIHVuaWZvcm1seSB0eXBlcyBudW1lcmljIHZhbHVlcy59Ci0gIFxzZWVwZXB7MzA1fXtDU1YgRmlsZSBBUEl9Ci0gICAgICAgICB7VGhlIFB5dGhvbiBFbmhhbmNlbWVudCBQcm9wb3NhbCB3aGljaCBwcm9wb3NlZCB0aGlzIGFkZGl0aW9uCi0gICAgICAgICAgdG8gUHl0aG9uLn0KLVxlbmR7c2VlYWxzb30KLQotCi1cc3Vic2VjdGlvbntNb2R1bGUgQ29udGVudHMgXGxhYmVse2Nzdi1jb250ZW50c319Ci0KLVRoZSBcbW9kdWxle2Nzdn0gbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6Ci0KLVxiZWdpbntmdW5jZGVzY317cmVhZGVyfXtjc3ZmaWxlXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsZWN0PVxjb2RleydleGNlbCd9fVxvcHRpb25hbHssIGZtdHBhcmFtfX0KLVJldHVybiBhIHJlYWRlciBvYmplY3Qgd2hpY2ggd2lsbCBpdGVyYXRlIG92ZXIgbGluZXMgaW4gdGhlIGdpdmVuCi17fVx2YXJ7Y3N2ZmlsZX0uICBcdmFye2NzdmZpbGV9IGNhbiBiZSBhbnkgb2JqZWN0IHdoaWNoIHN1cHBvcnRzIHRoZQotaXRlcmF0b3IgcHJvdG9jb2wgYW5kIHJldHVybnMgYSBzdHJpbmcgZWFjaCB0aW1lIGl0cyBcbWV0aG9ke25leHR9Ci1tZXRob2QgaXMgY2FsbGVkIC0tLSBmaWxlIG9iamVjdHMgYW5kIGxpc3Qgb2JqZWN0cyBhcmUgYm90aCBzdWl0YWJsZS4gIAotSWYgXHZhcntjc3ZmaWxlfSBpcyBhIGZpbGUgb2JqZWN0LCBpdCBtdXN0IGJlIG9wZW5lZCB3aXRoCi10aGUgJ2InIGZsYWcgb24gcGxhdGZvcm1zIHdoZXJlIHRoYXQgbWFrZXMgYSBkaWZmZXJlbmNlLiAgQW4gb3B0aW9uYWwKLXt9XHZhcntkaWFsZWN0fSBwYXJhbWV0ZXIgY2FuIGJlIGdpdmVuCi13aGljaCBpcyB1c2VkIHRvIGRlZmluZSBhIHNldCBvZiBwYXJhbWV0ZXJzIHNwZWNpZmljIHRvIGEgcGFydGljdWxhciBDU1YKLWRpYWxlY3QuICBJdCBtYXkgYmUgYW4gaW5zdGFuY2Ugb2YgYSBzdWJjbGFzcyBvZiB0aGUgXGNsYXNze0RpYWxlY3R9Ci1jbGFzcyBvciBvbmUgb2YgdGhlIHN0cmluZ3MgcmV0dXJuZWQgYnkgdGhlIFxmdW5jdGlvbntsaXN0X2RpYWxlY3RzfQotZnVuY3Rpb24uICBUaGUgb3RoZXIgb3B0aW9uYWwge31cdmFye2ZtdHBhcmFtfSBrZXl3b3JkIGFyZ3VtZW50cyBjYW4gYmUKLWdpdmVuIHRvIG92ZXJyaWRlIGluZGl2aWR1YWwgZm9ybWF0dGluZyBwYXJhbWV0ZXJzIGluIHRoZSBjdXJyZW50Ci1kaWFsZWN0LiAgRm9yIGZ1bGwgZGV0YWlscyBhYm91dCB0aGUgZGlhbGVjdCBhbmQgZm9ybWF0dGluZwotcGFyYW1ldGVycywgc2VlIHNlY3Rpb25+XHJlZntjc3YtZm10LXBhcmFtc30sIGBgRGlhbGVjdHMgYW5kIEZvcm1hdHRpbmcKLVBhcmFtZXRlcnMnJy4KLQotQWxsIGRhdGEgcmVhZCBhcmUgcmV0dXJuZWQgYXMgc3RyaW5ncy4gIE5vIGF1dG9tYXRpYyBkYXRhIHR5cGUKLWNvbnZlcnNpb24gaXMgcGVyZm9ybWVkLgotCi1cdmVyc2lvbmNoYW5nZWRbCi1UaGUgcGFyc2VyIGlzIG5vdyBzdHJpY3RlciB3aXRoIHJlc3BlY3QgdG8gbXVsdGktbGluZSBxdW90ZWQKLWZpZWxkcy4gUHJldmlvdXNseSwgaWYgYSBsaW5lIGVuZGVkIHdpdGhpbiBhIHF1b3RlZCBmaWVsZCB3aXRob3V0IGEKLXRlcm1pbmF0aW5nIG5ld2xpbmUgY2hhcmFjdGVyLCBhIG5ld2xpbmUgd291bGQgYmUgaW5zZXJ0ZWQgaW50byB0aGUKLXJldHVybmVkIGZpZWxkLiBUaGlzIGJlaGF2aW9yIGNhdXNlZCBwcm9ibGVtcyB3aGVuIHJlYWRpbmcgZmlsZXMKLXdoaWNoIGNvbnRhaW5lZCBjYXJyaWFnZSByZXR1cm4gY2hhcmFjdGVycyB3aXRoaW4gZmllbGRzLiAgVGhlCi1iZWhhdmlvciB3YXMgY2hhbmdlZCB0byByZXR1cm4gdGhlIGZpZWxkIHdpdGhvdXQgaW5zZXJ0aW5nIG5ld2xpbmVzLiBBcwotYSBjb25zZXF1ZW5jZSwgaWYgbmV3bGluZXMgZW1iZWRkZWQgd2l0aGluIGZpZWxkcyBhcmUgaW1wb3J0YW50LCB0aGUKLWlucHV0IHNob3VsZCBiZSBzcGxpdCBpbnRvIGxpbmVzIGluIGEgbWFubmVyIHdoaWNoIHByZXNlcnZlcyB0aGUgbmV3bGluZQotY2hhcmFjdGVyc117Mi41fQotCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3dyaXRlcn17Y3N2ZmlsZVxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgZGlhbGVjdD1cY29kZXsnZXhjZWwnfX1cb3B0aW9uYWx7LCBmbXRwYXJhbX19Ci1SZXR1cm4gYSB3cml0ZXIgb2JqZWN0IHJlc3BvbnNpYmxlIGZvciBjb252ZXJ0aW5nIHRoZSB1c2VyJ3MgZGF0YSBpbnRvCi1kZWxpbWl0ZWQgc3RyaW5ncyBvbiB0aGUgZ2l2ZW4gZmlsZS1saWtlIG9iamVjdC4gIFx2YXJ7Y3N2ZmlsZX0gY2FuIGJlIGFueQotb2JqZWN0IHdpdGggYSBcZnVuY3Rpb257d3JpdGV9IG1ldGhvZC4gIElmIFx2YXJ7Y3N2ZmlsZX0gaXMgYSBmaWxlIG9iamVjdCwKLWl0IG11c3QgYmUgb3BlbmVkIHdpdGggdGhlICdiJyBmbGFnIG9uIHBsYXRmb3JtcyB3aGVyZSB0aGF0IG1ha2VzIGEKLWRpZmZlcmVuY2UuICBBbiBvcHRpb25hbAote31cdmFye2RpYWxlY3R9IHBhcmFtZXRlciBjYW4gYmUgZ2l2ZW4gd2hpY2ggaXMgdXNlZCB0byBkZWZpbmUgYSBzZXQgb2YKLXBhcmFtZXRlcnMgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIENTViBkaWFsZWN0LiAgSXQgbWF5IGJlIGFuIGluc3RhbmNlCi1vZiBhIHN1YmNsYXNzIG9mIHRoZSBcY2xhc3N7RGlhbGVjdH0gY2xhc3Mgb3Igb25lIG9mIHRoZSBzdHJpbmdzCi1yZXR1cm5lZCBieSB0aGUgXGZ1bmN0aW9ue2xpc3RfZGlhbGVjdHN9IGZ1bmN0aW9uLiAgVGhlIG90aGVyIG9wdGlvbmFsCi17fVx2YXJ7Zm10cGFyYW19IGtleXdvcmQgYXJndW1lbnRzIGNhbiBiZSBnaXZlbiB0byBvdmVycmlkZSBpbmRpdmlkdWFsCi1mb3JtYXR0aW5nIHBhcmFtZXRlcnMgaW4gdGhlIGN1cnJlbnQgZGlhbGVjdC4gIEZvciBmdWxsIGRldGFpbHMKLWFib3V0IHRoZSBkaWFsZWN0IGFuZCBmb3JtYXR0aW5nIHBhcmFtZXRlcnMsIHNlZQotc2VjdGlvbn5ccmVme2Nzdi1mbXQtcGFyYW1zfSwgYGBEaWFsZWN0cyBhbmQgRm9ybWF0dGluZyBQYXJhbWV0ZXJzJycuCi1UbyBtYWtlIGl0IGFzIGVhc3kgYXMgcG9zc2libGUgdG8KLWludGVyZmFjZSB3aXRoIG1vZHVsZXMgd2hpY2ggaW1wbGVtZW50IHRoZSBEQiBBUEksIHRoZSB2YWx1ZQotXGNvbnN0YW50e05vbmV9IGlzIHdyaXR0ZW4gYXMgdGhlIGVtcHR5IHN0cmluZy4gIFdoaWxlIHRoaXMgaXNuJ3QgYQotcmV2ZXJzaWJsZSB0cmFuc2Zvcm1hdGlvbiwgaXQgbWFrZXMgaXQgZWFzaWVyIHRvIGR1bXAgU1FMIE5VTEwgZGF0YSB2YWx1ZXMKLXRvIENTViBmaWxlcyB3aXRob3V0IHByZXByb2Nlc3NpbmcgdGhlIGRhdGEgcmV0dXJuZWQgZnJvbSBhCi1cY29kZXtjdXJzb3IuZmV0Y2gqKCl9IGNhbGwuICBBbGwgb3RoZXIgbm9uLXN0cmluZyBkYXRhIGFyZSBzdHJpbmdpZmllZAotd2l0aCBcZnVuY3Rpb257c3RyKCl9IGJlZm9yZSBiZWluZyB3cml0dGVuLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtyZWdpc3Rlcl9kaWFsZWN0fXtuYW1lXG9wdGlvbmFseywgZGlhbGVjdH1cb3B0aW9uYWx7LCBmbXRwYXJhbX19Ci1Bc3NvY2lhdGUgXHZhcntkaWFsZWN0fSB3aXRoIFx2YXJ7bmFtZX0uICBcdmFye25hbWV9IG11c3QgYmUgYSBzdHJpbmcKLW9yIFVuaWNvZGUgb2JqZWN0LiBUaGUgZGlhbGVjdCBjYW4gYmUgc3BlY2lmaWVkIGVpdGhlciBieSBwYXNzaW5nIGEKLXN1Yi1jbGFzcyBvZiBcY2xhc3N7RGlhbGVjdH0sIG9yIGJ5IFx2YXJ7Zm10cGFyYW19IGtleXdvcmQgYXJndW1lbnRzLAotb3IgYm90aCwgd2l0aCBrZXl3b3JkIGFyZ3VtZW50cyBvdmVycmlkaW5nIHBhcmFtZXRlcnMgb2YgdGhlIGRpYWxlY3QuCi1Gb3IgZnVsbCBkZXRhaWxzIGFib3V0IHRoZSBkaWFsZWN0IGFuZCBmb3JtYXR0aW5nIHBhcmFtZXRlcnMsIHNlZQotc2VjdGlvbn5ccmVme2Nzdi1mbXQtcGFyYW1zfSwgYGBEaWFsZWN0cyBhbmQgRm9ybWF0dGluZyBQYXJhbWV0ZXJzJycuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3VucmVnaXN0ZXJfZGlhbGVjdH17bmFtZX0KLURlbGV0ZSB0aGUgZGlhbGVjdCBhc3NvY2lhdGVkIHdpdGggXHZhcntuYW1lfSBmcm9tIHRoZSBkaWFsZWN0IHJlZ2lzdHJ5LiAgQW4KLVxleGNlcHRpb257RXJyb3J9IGlzIHJhaXNlZCBpZiBcdmFye25hbWV9IGlzIG5vdCBhIHJlZ2lzdGVyZWQgZGlhbGVjdAotbmFtZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0X2RpYWxlY3R9e25hbWV9Ci1SZXR1cm4gdGhlIGRpYWxlY3QgYXNzb2NpYXRlZCB3aXRoIFx2YXJ7bmFtZX0uICBBbiBcZXhjZXB0aW9ue0Vycm9yfSBpcwotcmFpc2VkIGlmIFx2YXJ7bmFtZX0gaXMgbm90IGEgcmVnaXN0ZXJlZCBkaWFsZWN0IG5hbWUuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2xpc3RfZGlhbGVjdHN9e30KLVJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHJlZ2lzdGVyZWQgZGlhbGVjdHMuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2ZpZWxkX3NpemVfbGltaXR9e1xvcHRpb25hbHtuZXdfbGltaXR9fQotICBSZXR1cm5zIHRoZSBjdXJyZW50IG1heGltdW0gZmllbGQgc2l6ZSBhbGxvd2VkIGJ5IHRoZSBwYXJzZXIuIElmCi0gIFx2YXJ7bmV3X2xpbWl0fSBpcyBnaXZlbiwgdGhpcyBiZWNvbWVzIHRoZSBuZXcgbGltaXQuCi0gIFx2ZXJzaW9uYWRkZWR7Mi41fQotXGVuZHtmdW5jZGVzY30KLQotCi1UaGUgXG1vZHVsZXtjc3Z9IG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgY2xhc3NlczoKLQotXGJlZ2lue2NsYXNzZGVzY317RGljdFJlYWRlcn17Y3N2ZmlsZVxvcHRpb25hbHssCi0JCQkgICAgICBmaWVsZG5hbWVzPVxjb25zdGFudHtOb25lfSxcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdGtleT1cY29uc3RhbnR7Tm9uZX1cb3B0aW9uYWx7LAotCQkJICAgICAgcmVzdHZhbD1cY29uc3RhbnR7Tm9uZX1cb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbGVjdD1cY29kZXsnZXhjZWwnfVxvcHRpb25hbHssCi0JCQkgICAgICAqYXJncywgKiprd2RzfX19fX19Ci1DcmVhdGUgYW4gb2JqZWN0IHdoaWNoIG9wZXJhdGVzIGxpa2UgYSByZWd1bGFyIHJlYWRlciBidXQgbWFwcyB0aGUKLWluZm9ybWF0aW9uIHJlYWQgaW50byBhIGRpY3Qgd2hvc2Uga2V5cyBhcmUgZ2l2ZW4gYnkgdGhlIG9wdGlvbmFsCi17fSBcdmFye2ZpZWxkbmFtZXN9Ci1wYXJhbWV0ZXIuICBJZiB0aGUgXHZhcntmaWVsZG5hbWVzfSBwYXJhbWV0ZXIgaXMgb21pdHRlZCwgdGhlIHZhbHVlcyBpbgotdGhlIGZpcnN0IHJvdyBvZiB0aGUgXHZhcntjc3ZmaWxlfSB3aWxsIGJlIHVzZWQgYXMgdGhlIGZpZWxkbmFtZXMuCi1JZiB0aGUgcm93IHJlYWQgaGFzIGZld2VyIGZpZWxkcyB0aGFuIHRoZSBmaWVsZG5hbWVzIHNlcXVlbmNlLAotdGhlIHZhbHVlIG9mIFx2YXJ7cmVzdHZhbH0gd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHZhbHVlLiAgSWYgdGhlIHJvdwotcmVhZCBoYXMgbW9yZSBmaWVsZHMgdGhhbiB0aGUgZmllbGRuYW1lcyBzZXF1ZW5jZSwgdGhlIHJlbWFpbmluZyBkYXRhIGlzCi1hZGRlZCBhcyBhIHNlcXVlbmNlIGtleWVkIGJ5IHRoZSB2YWx1ZSBvZiBcdmFye3Jlc3RrZXl9LiAgSWYgdGhlIHJvdyByZWFkCi1oYXMgZmV3ZXIgZmllbGRzIHRoYW4gdGhlIGZpZWxkbmFtZXMgc2VxdWVuY2UsIHRoZSByZW1haW5pbmcga2V5cyB0YWtlIHRoZQotdmFsdWUgb2YgdGhlIG9wdGlvbmFsIFx2YXJ7cmVzdHZhbH0gcGFyYW1ldGVyLiAgQW55IG90aGVyIG9wdGlvbmFsIG9yCi1rZXl3b3JkIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvIHRoZSB1bmRlcmx5aW5nIFxjbGFzc3tyZWFkZXJ9IGluc3RhbmNlLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLQotXGJlZ2lue2NsYXNzZGVzY317RGljdFdyaXRlcn17Y3N2ZmlsZSwgZmllbGRuYW1lc1xvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0dmFsPSIiXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhc2FjdGlvbj1cY29kZXsncmFpc2UnfVxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsZWN0PVxjb2RleydleGNlbCd9XG9wdGlvbmFseywKLQkJCSAgICAgICphcmdzLCAqKmt3ZHN9fX19fQotQ3JlYXRlIGFuIG9iamVjdCB3aGljaCBvcGVyYXRlcyBsaWtlIGEgcmVndWxhciB3cml0ZXIgYnV0IG1hcHMgZGljdGlvbmFyaWVzCi1vbnRvIG91dHB1dCByb3dzLiAgVGhlIFx2YXJ7ZmllbGRuYW1lc30gcGFyYW1ldGVyIGlkZW50aWZpZXMgdGhlIG9yZGVyIGluCi13aGljaCB2YWx1ZXMgaW4gdGhlIGRpY3Rpb25hcnkgcGFzc2VkIHRvIHRoZSBcbWV0aG9ke3dyaXRlcm93KCl9IG1ldGhvZCBhcmUKLXdyaXR0ZW4gdG8gdGhlIFx2YXJ7Y3N2ZmlsZX0uICBUaGUgb3B0aW9uYWwgXHZhcntyZXN0dmFsfSBwYXJhbWV0ZXIKLXNwZWNpZmllcyB0aGUgdmFsdWUgdG8gYmUgd3JpdHRlbiBpZiB0aGUgZGljdGlvbmFyeSBpcyBtaXNzaW5nIGEga2V5IGluCi1cdmFye2ZpZWxkbmFtZXN9LiAgSWYgdGhlIGRpY3Rpb25hcnkgcGFzc2VkIHRvIHRoZSBcbWV0aG9ke3dyaXRlcm93KCl9Ci1tZXRob2QgY29udGFpbnMgYSBrZXkgbm90IGZvdW5kIGluIFx2YXJ7ZmllbGRuYW1lc30sIHRoZSBvcHRpb25hbAotXHZhcntleHRyYXNhY3Rpb259IHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hhdCBhY3Rpb24gdG8gdGFrZS4gIElmIGl0IGlzIHNldAotdG8gXGNvZGV7J3JhaXNlJ30gYSBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IGlzIHJhaXNlZC4gIElmIGl0IGlzIHNldCB0bwotXGNvZGV7J2lnbm9yZSd9LCBleHRyYSB2YWx1ZXMgaW4gdGhlIGRpY3Rpb25hcnkgYXJlIGlnbm9yZWQuICBBbnkgb3RoZXIKLW9wdGlvbmFsIG9yIGtleXdvcmQgYXJndW1lbnRzIGFyZSBwYXNzZWQgdG8gdGhlIHVuZGVybHlpbmcgXGNsYXNze3dyaXRlcn0KLWluc3RhbmNlLgotCi1Ob3RlIHRoYXQgdW5saWtlIHRoZSBcY2xhc3N7RGljdFJlYWRlcn0gY2xhc3MsIHRoZSBcdmFye2ZpZWxkbmFtZXN9Ci1wYXJhbWV0ZXIgb2YgdGhlIFxjbGFzc3tEaWN0V3JpdGVyfSBpcyBub3Qgb3B0aW9uYWwuICBTaW5jZSBQeXRob24ncwotXGNsYXNze2RpY3R9IG9iamVjdHMgYXJlIG5vdCBvcmRlcmVkLCB0aGVyZSBpcyBub3QgZW5vdWdoIGluZm9ybWF0aW9uCi1hdmFpbGFibGUgdG8gZGVkdWNlIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgcm93IHNob3VsZCBiZSB3cml0dGVuIHRvIHRoZQotXHZhcntjc3ZmaWxlfS4KLQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2MqfXtEaWFsZWN0fXt9Ci1UaGUgXGNsYXNze0RpYWxlY3R9IGNsYXNzIGlzIGEgY29udGFpbmVyIGNsYXNzIHJlbGllZCBvbiBwcmltYXJpbHkgZm9yIGl0cwotYXR0cmlidXRlcywgd2hpY2ggYXJlIHVzZWQgdG8gZGVmaW5lIHRoZSBwYXJhbWV0ZXJzIGZvciBhIHNwZWNpZmljCi1cY2xhc3N7cmVhZGVyfSBvciBcY2xhc3N7d3JpdGVyfSBpbnN0YW5jZS4KLVxlbmR7Y2xhc3NkZXNjKn0KLQotXGJlZ2lue2NsYXNzZGVzY317ZXhjZWx9e30KLVRoZSBcY2xhc3N7ZXhjZWx9IGNsYXNzIGRlZmluZXMgdGhlIHVzdWFsIHByb3BlcnRpZXMgb2YgYW4gRXhjZWwtZ2VuZXJhdGVkCi1DU1YgZmlsZS4gIEl0IGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgZGlhbGVjdCBuYW1lIFxjb2RleydleGNlbCd9LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e2V4Y2VsX3RhYn17fQotVGhlIFxjbGFzc3tleGNlbF90YWJ9IGNsYXNzIGRlZmluZXMgdGhlIHVzdWFsIHByb3BlcnRpZXMgb2YgYW4KLUV4Y2VsLWdlbmVyYXRlZCBUQUItZGVsaW1pdGVkIGZpbGUuICBJdCBpcyByZWdpc3RlcmVkIHdpdGggdGhlIGRpYWxlY3QgbmFtZQotXGNvZGV7J2V4Y2VsLXRhYid9LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1NuaWZmZXJ9e30KLVRoZSBcY2xhc3N7U25pZmZlcn0gY2xhc3MgaXMgdXNlZCB0byBkZWR1Y2UgdGhlIGZvcm1hdCBvZiBhIENTViBmaWxlLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVRoZSBcY2xhc3N7U25pZmZlcn0gY2xhc3MgcHJvdmlkZXMgdHdvIG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtzbmlmZn17c2FtcGxlXG9wdGlvbmFseyxkZWxpbWl0ZXJzPU5vbmV9fQotQW5hbHl6ZSB0aGUgZ2l2ZW4gXHZhcntzYW1wbGV9IGFuZCByZXR1cm4gYSBcY2xhc3N7RGlhbGVjdH0gc3ViY2xhc3MKLXJlZmxlY3RpbmcgdGhlIHBhcmFtZXRlcnMgZm91bmQuICBJZiB0aGUgb3B0aW9uYWwgXHZhcntkZWxpbWl0ZXJzfSBwYXJhbWV0ZXIKLWlzIGdpdmVuLCBpdCBpcyBpbnRlcnByZXRlZCBhcyBhIHN0cmluZyBjb250YWluaW5nIHBvc3NpYmxlIHZhbGlkIGRlbGltaXRlcgotY2hhcmFjdGVycy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2hhc19oZWFkZXJ9e3NhbXBsZX0KLUFuYWx5emUgdGhlIHNhbXBsZSB0ZXh0IChwcmVzdW1lZCB0byBiZSBpbiBDU1YgZm9ybWF0KSBhbmQgcmV0dXJuCi1cY29uc3RhbnR7VHJ1ZX0gaWYgdGhlIGZpcnN0IHJvdyBhcHBlYXJzIHRvIGJlIGEgc2VyaWVzIG9mIGNvbHVtbgotaGVhZGVycy4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1UaGUgXG1vZHVsZXtjc3Z9IG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzOgotCi1cYmVnaW57ZGF0YWRlc2N9e1FVT1RFX0FMTH0KLUluc3RydWN0cyBcY2xhc3N7d3JpdGVyfSBvYmplY3RzIHRvIHF1b3RlIGFsbCBmaWVsZHMuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1FVT1RFX01JTklNQUx9Ci1JbnN0cnVjdHMgXGNsYXNze3dyaXRlcn0gb2JqZWN0cyB0byBvbmx5IHF1b3RlIHRob3NlIGZpZWxkcyB3aGljaCBjb250YWluCi1zcGVjaWFsIGNoYXJhY3RlcnMgc3VjaCBhcyBcdmFye2RlbGltaXRlcn0sIFx2YXJ7cXVvdGVjaGFyfSBvciBhbnkgb2YgdGhlCi1jaGFyYWN0ZXJzIGluIFx2YXJ7bGluZXRlcm1pbmF0b3J9LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtRVU9URV9OT05OVU1FUklDfQotSW5zdHJ1Y3RzIFxjbGFzc3t3cml0ZXJ9IG9iamVjdHMgdG8gcXVvdGUgYWxsIG5vbi1udW1lcmljCi1maWVsZHMuIAotCi1JbnN0cnVjdHMgdGhlIHJlYWRlciB0byBjb252ZXJ0IGFsbCBub24tcXVvdGVkIGZpZWxkcyB0byB0eXBlIFx2YXJ7ZmxvYXR9LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtRVU9URV9OT05FfQotSW5zdHJ1Y3RzIFxjbGFzc3t3cml0ZXJ9IG9iamVjdHMgdG8gbmV2ZXIgcXVvdGUgZmllbGRzLiAgV2hlbiB0aGUgY3VycmVudAotXHZhcntkZWxpbWl0ZXJ9IG9jY3VycyBpbiBvdXRwdXQgZGF0YSBpdCBpcyBwcmVjZWRlZCBieSB0aGUgY3VycmVudAotXHZhcntlc2NhcGVjaGFyfSBjaGFyYWN0ZXIuICBJZiBcdmFye2VzY2FwZWNoYXJ9IGlzIG5vdCBzZXQsIHRoZSB3cml0ZXIKLXdpbGwgcmFpc2UgXGV4Y2VwdGlvbntFcnJvcn0gaWYgYW55IGNoYXJhY3RlcnMgdGhhdCByZXF1aXJlIGVzY2FwaW5nCi1hcmUgZW5jb3VudGVyZWQuCi0KLUluc3RydWN0cyBcY2xhc3N7cmVhZGVyfSB0byBwZXJmb3JtIG5vIHNwZWNpYWwgcHJvY2Vzc2luZyBvZiBxdW90ZSBjaGFyYWN0ZXJzLgotXGVuZHtkYXRhZGVzY30KLQotCi1UaGUgXG1vZHVsZXtjc3Z9IG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uOgotCi1cYmVnaW57ZXhjZGVzY317RXJyb3J9Ci1SYWlzZWQgYnkgYW55IG9mIHRoZSBmdW5jdGlvbnMgd2hlbiBhbiBlcnJvciBpcyBkZXRlY3RlZC4KLVxlbmR7ZXhjZGVzY30KLQotCi1cc3Vic2VjdGlvbntEaWFsZWN0cyBhbmQgRm9ybWF0dGluZyBQYXJhbWV0ZXJzXGxhYmVse2Nzdi1mbXQtcGFyYW1zfX0KLQotVG8gbWFrZSBpdCBlYXNpZXIgdG8gc3BlY2lmeSB0aGUgZm9ybWF0IG9mIGlucHV0IGFuZCBvdXRwdXQgcmVjb3JkcywKLXNwZWNpZmljIGZvcm1hdHRpbmcgcGFyYW1ldGVycyBhcmUgZ3JvdXBlZCB0b2dldGhlciBpbnRvIGRpYWxlY3RzLiAgQQotZGlhbGVjdCBpcyBhIHN1YmNsYXNzIG9mIHRoZSBcY2xhc3N7RGlhbGVjdH0gY2xhc3MgaGF2aW5nIGEgc2V0IG9mIHNwZWNpZmljCi1tZXRob2RzIGFuZCBhIHNpbmdsZSBcbWV0aG9ke3ZhbGlkYXRlKCl9IG1ldGhvZC4gIFdoZW4gY3JlYXRpbmcgXGNsYXNze3JlYWRlcn0KLW9yIFxjbGFzc3t3cml0ZXJ9IG9iamVjdHMsIHRoZSBwcm9ncmFtbWVyIGNhbiBzcGVjaWZ5IGEgc3RyaW5nIG9yIGEgc3ViY2xhc3MKLW9mIHRoZSBcY2xhc3N7RGlhbGVjdH0gY2xhc3MgYXMgdGhlIGRpYWxlY3QgcGFyYW1ldGVyLiAgSW4gYWRkaXRpb24gdG8sIG9yCi1pbnN0ZWFkIG9mLCB0aGUgXHZhcntkaWFsZWN0fSBwYXJhbWV0ZXIsIHRoZSBwcm9ncmFtbWVyIGNhbiBhbHNvIHNwZWNpZnkKLWluZGl2aWR1YWwgZm9ybWF0dGluZyBwYXJhbWV0ZXJzLCB3aGljaCBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZQotYXR0cmlidXRlcyBkZWZpbmVkIGJlbG93IGZvciB0aGUgXGNsYXNze0RpYWxlY3R9IGNsYXNzLgotCi1EaWFsZWN0cyBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKLQotXGJlZ2lue21lbWJlcmRlc2N9W0RpYWxlY3Rde2RlbGltaXRlcn0KLUEgb25lLWNoYXJhY3RlciBzdHJpbmcgdXNlZCB0byBzZXBhcmF0ZSBmaWVsZHMuICBJdCBkZWZhdWx0cyB0byBcY29kZXsnLCd9LgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bRGlhbGVjdF17ZG91YmxlcXVvdGV9Ci1Db250cm9scyBob3cgaW5zdGFuY2VzIG9mIFx2YXJ7cXVvdGVjaGFyfSBhcHBlYXJpbmcgaW5zaWRlIGEgZmllbGQgc2hvdWxkCi1iZSB0aGVtc2VsdmVzIGJlIHF1b3RlZC4gIFdoZW4gXGNvbnN0YW50e1RydWV9LCB0aGUgY2hhcmFjdGVyIGlzIGRvdWJsZWQuCi1XaGVuIFxjb25zdGFudHtGYWxzZX0sIHRoZSBcdmFye2VzY2FwZWNoYXJ9IGlzIHVzZWQgYXMgYSBwcmVmaXggdG8gdGhlCi1cdmFye3F1b3RlY2hhcn0uICBJdCBkZWZhdWx0cyB0byBcY29uc3RhbnR7VHJ1ZX0uCi0KLU9uIG91dHB1dCwgaWYgXHZhcntkb3VibGVxdW90ZX0gaXMgXGNvbnN0YW50e0ZhbHNlfSBhbmQgbm8KLVx2YXJ7ZXNjYXBlY2hhcn0gaXMgc2V0LCBcZXhjZXB0aW9ue0Vycm9yfSBpcyByYWlzZWQgaWYgYSBcdmFye3F1b3RlY2hhcn0KLWlzIGZvdW5kIGluIGEgZmllbGQuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtEaWFsZWN0XXtlc2NhcGVjaGFyfQotQSBvbmUtY2hhcmFjdGVyIHN0cmluZyB1c2VkIGJ5IHRoZSB3cml0ZXIgdG8gZXNjYXBlIHRoZSBcdmFye2RlbGltaXRlcn0gaWYKLVx2YXJ7cXVvdGluZ30gaXMgc2V0IHRvIFxjb25zdGFudHtRVU9URV9OT05FfSBhbmQgdGhlIFx2YXJ7cXVvdGVjaGFyfQotaWYgXHZhcntkb3VibGVxdW90ZX0gaXMgXGNvbnN0YW50e0ZhbHNlfS4gT24gcmVhZGluZywgdGhlIFx2YXJ7ZXNjYXBlY2hhcn0KLXJlbW92ZXMgYW55IHNwZWNpYWwgbWVhbmluZyBmcm9tIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyLiBJdCBkZWZhdWx0cwotdG8gXGNvbnN0YW50e05vbmV9LCB3aGljaCBkaXNhYmxlcyBlc2NhcGluZy4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W0RpYWxlY3Rde2xpbmV0ZXJtaW5hdG9yfQotVGhlIHN0cmluZyB1c2VkIHRvIHRlcm1pbmF0ZSBsaW5lcyBwcm9kdWNlZCBieSB0aGUgXGNsYXNze3dyaXRlcn0uCi1JdCBkZWZhdWx0cyB0byBcY29kZXsnXGUgclxlIG4nfS4gCi0KLVxub3Rle1RoZSBcY2xhc3N7cmVhZGVyfSBpcyBoYXJkLWNvZGVkIHRvIHJlY29nbmlzZSBlaXRoZXIgXGNvZGV7J1xlIHInfQotb3IgXGNvZGV7J1xlIG4nfSBhcyBlbmQtb2YtbGluZSwgYW5kIGlnbm9yZXMgXHZhcntsaW5ldGVybWluYXRvcn0uIFRoaXMKLWJlaGF2aW9yIG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS59Ci1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtEaWFsZWN0XXtxdW90ZWNoYXJ9Ci1BIG9uZS1jaGFyYWN0ZXIgc3RyaW5nIHVzZWQgdG8gcXVvdGUgZmllbGRzIGNvbnRhaW5pbmcgc3BlY2lhbCBjaGFyYWN0ZXJzLAotc3VjaCBhcyB0aGUgXHZhcntkZWxpbWl0ZXJ9IG9yIFx2YXJ7cXVvdGVjaGFyfSwgb3Igd2hpY2ggY29udGFpbiBuZXctbGluZQotY2hhcmFjdGVycy4gIEl0IGRlZmF1bHRzIHRvIFxjb2RleyciJ30uCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtEaWFsZWN0XXtxdW90aW5nfQotQ29udHJvbHMgd2hlbiBxdW90ZXMgc2hvdWxkIGJlIGdlbmVyYXRlZCBieSB0aGUgd3JpdGVyIGFuZCByZWNvZ25pc2VkCi1ieSB0aGUgcmVhZGVyLiAgSXQgY2FuIHRha2Ugb24gYW55IG9mIHRoZSBcY29uc3RhbnR7UVVPVEVfKn0gY29uc3RhbnRzCi0oc2VlIHNlY3Rpb25+XHJlZntjc3YtY29udGVudHN9KSBhbmQgZGVmYXVsdHMgdG8gXGNvbnN0YW50e1FVT1RFX01JTklNQUx9LgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bRGlhbGVjdF17c2tpcGluaXRpYWxzcGFjZX0KLVdoZW4gXGNvbnN0YW50e1RydWV9LCB3aGl0ZXNwYWNlIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgXHZhcntkZWxpbWl0ZXJ9Ci1pcyBpZ25vcmVkLiAgVGhlIGRlZmF1bHQgaXMgXGNvbnN0YW50e0ZhbHNlfS4KLVxlbmR7bWVtYmVyZGVzY30KLQotCi1cc3Vic2VjdGlvbntSZWFkZXIgT2JqZWN0c30KLQotUmVhZGVyIG9iamVjdHMgKFxjbGFzc3tEaWN0UmVhZGVyfSBpbnN0YW5jZXMgYW5kIG9iamVjdHMgcmV0dXJuZWQgYnkKLXRoZSBcZnVuY3Rpb257cmVhZGVyKCl9IGZ1bmN0aW9uKSBoYXZlIHRoZSBmb2xsb3dpbmcgcHVibGljIG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtjc3YgcmVhZGVyXXtuZXh0fXt9Ci1SZXR1cm4gdGhlIG5leHQgcm93IG9mIHRoZSByZWFkZXIncyBpdGVyYWJsZSBvYmplY3QgYXMgYSBsaXN0LCBwYXJzZWQKLWFjY29yZGluZyB0byB0aGUgY3VycmVudCBkaWFsZWN0LgotXGVuZHttZXRob2RkZXNjfQotCi1SZWFkZXIgb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgcHVibGljIGF0dHJpYnV0ZXM6Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtjc3YgcmVhZGVyXXtkaWFsZWN0fQotQSByZWFkLW9ubHkgZGVzY3JpcHRpb24gb2YgdGhlIGRpYWxlY3QgaW4gdXNlIGJ5IHRoZSBwYXJzZXIuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtjc3YgcmVhZGVyXXtsaW5lX251bX0KLSBUaGUgbnVtYmVyIG9mIGxpbmVzIHJlYWQgZnJvbSB0aGUgc291cmNlIGl0ZXJhdG9yLiBUaGlzIGlzIG5vdCB0aGUgc2FtZQotIGFzIHRoZSBudW1iZXIgb2YgcmVjb3JkcyByZXR1cm5lZCwgYXMgcmVjb3JkcyBjYW4gc3BhbiBtdWx0aXBsZSBsaW5lcy4KLSBcdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7bWVtYmVyZGVzY30KLQotCi1cc3Vic2VjdGlvbntXcml0ZXIgT2JqZWN0c30KLQotXGNsYXNze1dyaXRlcn0gb2JqZWN0cyAoXGNsYXNze0RpY3RXcml0ZXJ9IGluc3RhbmNlcyBhbmQgb2JqZWN0cyByZXR1cm5lZCBieQotdGhlIFxmdW5jdGlvbnt3cml0ZXIoKX0gZnVuY3Rpb24pIGhhdmUgdGhlIGZvbGxvd2luZyBwdWJsaWMgbWV0aG9kcy4gIEEKLXt9XHZhcntyb3d9IG11c3QgYmUgYSBzZXF1ZW5jZSBvZiBzdHJpbmdzIG9yIG51bWJlcnMgZm9yIFxjbGFzc3tXcml0ZXJ9Ci1vYmplY3RzIGFuZCBhIGRpY3Rpb25hcnkgbWFwcGluZyBmaWVsZG5hbWVzIHRvIHN0cmluZ3Mgb3IgbnVtYmVycyAoYnkKLXBhc3NpbmcgdGhlbSB0aHJvdWdoIFxmdW5jdGlvbntzdHIoKX0gZmlyc3QpIGZvciB7fVxjbGFzc3tEaWN0V3JpdGVyfQotb2JqZWN0cy4gIE5vdGUgdGhhdCBjb21wbGV4IG51bWJlcnMgYXJlIHdyaXR0ZW4gb3V0IHN1cnJvdW5kZWQgYnkgcGFyZW5zLgotVGhpcyBtYXkgY2F1c2Ugc29tZSBwcm9ibGVtcyBmb3Igb3RoZXIgcHJvZ3JhbXMgd2hpY2ggcmVhZCBDU1YgZmlsZXMKLShhc3N1bWluZyB0aGV5IHN1cHBvcnQgY29tcGxleCBudW1iZXJzIGF0IGFsbCkuCi0KLVxiZWdpbnttZXRob2RkZXNjfVtjc3Ygd3JpdGVyXXt3cml0ZXJvd317cm93fQotV3JpdGUgdGhlIFx2YXJ7cm93fSBwYXJhbWV0ZXIgdG8gdGhlIHdyaXRlcidzIGZpbGUgb2JqZWN0LCBmb3JtYXR0ZWQKLWFjY29yZGluZyB0byB0aGUgY3VycmVudCBkaWFsZWN0LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bY3N2IHdyaXRlcl17d3JpdGVyb3dzfXtyb3dzfQotV3JpdGUgYWxsIHRoZSBcdmFye3Jvd3N9IHBhcmFtZXRlcnMgKGEgbGlzdCBvZiBcdmFye3Jvd30gb2JqZWN0cyBhcwotZGVzY3JpYmVkIGFib3ZlKSB0byB0aGUgd3JpdGVyJ3MgZmlsZSBvYmplY3QsIGZvcm1hdHRlZAotYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGRpYWxlY3QuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVdyaXRlciBvYmplY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBwdWJsaWMgYXR0cmlidXRlOgotCi1cYmVnaW57bWVtYmVyZGVzY31bY3N2IHdyaXRlcl17ZGlhbGVjdH0KLUEgcmVhZC1vbmx5IGRlc2NyaXB0aW9uIG9mIHRoZSBkaWFsZWN0IGluIHVzZSBieSB0aGUgd3JpdGVyLgotXGVuZHttZW1iZXJkZXNjfQotCi0KLQotXHN1YnNlY3Rpb257RXhhbXBsZXNcbGFiZWx7Y3N2LWV4YW1wbGVzfX0KLQotVGhlIHNpbXBsZXN0IGV4YW1wbGUgb2YgcmVhZGluZyBhIENTViBmaWxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgY3N2Ci1yZWFkZXIgPSBjc3YucmVhZGVyKG9wZW4oInNvbWUuY3N2IiwgInJiIikpCi1mb3Igcm93IGluIHJlYWRlcjoKLSAgICBwcmludCByb3cKLVxlbmR7dmVyYmF0aW19Ci0KLVJlYWRpbmcgYSBmaWxlIHdpdGggYW4gYWx0ZXJuYXRlIGZvcm1hdDoKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IGNzdgotcmVhZGVyID0gY3N2LnJlYWRlcihvcGVuKCJwYXNzd2QiLCAicmIiKSwgZGVsaW1pdGVyPSc6JywgcXVvdGluZz1jc3YuUVVPVEVfTk9ORSkKLWZvciByb3cgaW4gcmVhZGVyOgotICAgIHByaW50IHJvdwotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGNvcnJlc3BvbmRpbmcgc2ltcGxlc3QgcG9zc2libGUgd3JpdGluZyBleGFtcGxlIGlzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgY3N2Ci13cml0ZXIgPSBjc3Yud3JpdGVyKG9wZW4oInNvbWUuY3N2IiwgIndiIikpCi13cml0ZXIud3JpdGVyb3dzKHNvbWVpdGVyYWJsZSkKLVxlbmR7dmVyYmF0aW19Ci0KLVJlZ2lzdGVyaW5nIGEgbmV3IGRpYWxlY3Q6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCBjc3YKLQotY3N2LnJlZ2lzdGVyX2RpYWxlY3QoJ3VuaXhwd2QnLCBkZWxpbWl0ZXI9JzonLCBxdW90aW5nPWNzdi5RVU9URV9OT05FKQotCi1yZWFkZXIgPSBjc3YucmVhZGVyKG9wZW4oInBhc3N3ZCIsICJyYiIpLCAndW5peHB3ZCcpCi1cZW5ke3ZlcmJhdGltfQotCi1BIHNsaWdodGx5IG1vcmUgYWR2YW5jZWQgdXNlIG9mIHRoZSByZWFkZXIgLS0tIGNhdGNoaW5nIGFuZCByZXBvcnRpbmcgZXJyb3JzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgY3N2LCBzeXMKLWZpbGVuYW1lID0gInNvbWUuY3N2IgotcmVhZGVyID0gY3N2LnJlYWRlcihvcGVuKGZpbGVuYW1lLCAicmIiKSkKLXRyeToKLSAgICBmb3Igcm93IGluIHJlYWRlcjoKLSAgICAgICAgcHJpbnQgcm93Ci1leGNlcHQgY3N2LkVycm9yIGFzIGU6Ci0gICAgc3lzLmV4aXQoJ2ZpbGUgJXMsIGxpbmUgJWQ6ICVzJyAlIChmaWxlbmFtZSwgcmVhZGVyLmxpbmVfbnVtLCBlKSkKLVxlbmR7dmVyYmF0aW19Ci0KLUFuZCB3aGlsZSB0aGUgbW9kdWxlIGRvZXNuJ3QgZGlyZWN0bHkgc3VwcG9ydCBwYXJzaW5nIHN0cmluZ3MsIGl0IGNhbgotZWFzaWx5IGJlIGRvbmU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCBjc3YKLWZvciByb3cgaW4gY3N2LnJlYWRlcihbJ29uZSx0d28sdGhyZWUnXSk6Ci0gICAgcHJpbnQgcm93Ci1cZW5ke3ZlcmJhdGltfQotCi1UaGUgXG1vZHVsZXtjc3Z9IG1vZHVsZSBkb2Vzbid0IGRpcmVjdGx5IHN1cHBvcnQgcmVhZGluZyBhbmQgd3JpdGluZwotVW5pY29kZSwgYnV0IGl0IGlzIDgtYml0LWNsZWFuIHNhdmUgZm9yIHNvbWUgcHJvYmxlbXMgd2l0aCBcQVNDSUl7fSBOVUwKLWNoYXJhY3RlcnMuICBTbyB5b3UgY2FuIHdyaXRlIGZ1bmN0aW9ucyBvciBjbGFzc2VzIHRoYXQgaGFuZGxlIHRoZQotZW5jb2RpbmcgYW5kIGRlY29kaW5nIGZvciB5b3UgYXMgbG9uZyBhcyB5b3UgYXZvaWQgZW5jb2RpbmdzIGxpa2UKLVVURi0xNiB0aGF0IHVzZSBOVUxzLiAgVVRGLTggaXMgcmVjb21tZW5kZWQuCi0KLVxmdW5jdGlvbnt1bmljb2RlX2Nzdl9yZWFkZXJ9IGJlbG93IGlzIGEgZ2VuZXJhdG9yIHRoYXQgd3JhcHMKLVxjbGFzc3tjc3YucmVhZGVyfSB0byBoYW5kbGUgVW5pY29kZSBDU1YgZGF0YSAoYSBsaXN0IG9mIFVuaWNvZGUKLXN0cmluZ3MpLiAgXGZ1bmN0aW9ue3V0Zl84X2VuY29kZXJ9IGlzIGEgZ2VuZXJhdG9yIHRoYXQgZW5jb2RlcyB0aGUKLVVuaWNvZGUgc3RyaW5ncyBhcyBVVEYtOCwgb25lIHN0cmluZyAob3Igcm93KSBhdCBhIHRpbWUuICBUaGUgZW5jb2RlZAotc3RyaW5ncyBhcmUgcGFyc2VkIGJ5IHRoZSBDU1YgcmVhZGVyLCBhbmQKLVxmdW5jdGlvbnt1bmljb2RlX2Nzdl9yZWFkZXJ9IGRlY29kZXMgdGhlIFVURi04LWVuY29kZWQgY2VsbHMgYmFjawotaW50byBVbmljb2RlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgY3N2Ci0KLWRlZiB1bmljb2RlX2Nzdl9yZWFkZXIodW5pY29kZV9jc3ZfZGF0YSwgZGlhbGVjdD1jc3YuZXhjZWwsICoqa3dhcmdzKToKLSAgICAjIGNzdi5weSBkb2Vzbid0IGRvIFVuaWNvZGU7IGVuY29kZSB0ZW1wb3JhcmlseSBhcyBVVEYtODoKLSAgICBjc3ZfcmVhZGVyID0gY3N2LnJlYWRlcih1dGZfOF9lbmNvZGVyKHVuaWNvZGVfY3N2X2RhdGEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpYWxlY3Q9ZGlhbGVjdCwgKiprd2FyZ3MpCi0gICAgZm9yIHJvdyBpbiBjc3ZfcmVhZGVyOgotICAgICAgICAjIGRlY29kZSBVVEYtOCBiYWNrIHRvIFVuaWNvZGUsIGNlbGwgYnkgY2VsbDoKLSAgICAgICAgeWllbGQgW3VuaWNvZGUoY2VsbCwgJ3V0Zi04JykgZm9yIGNlbGwgaW4gcm93XQotCi1kZWYgdXRmXzhfZW5jb2Rlcih1bmljb2RlX2Nzdl9kYXRhKToKLSAgICBmb3IgbGluZSBpbiB1bmljb2RlX2Nzdl9kYXRhOgotICAgICAgICB5aWVsZCBsaW5lLmVuY29kZSgndXRmLTgnKQotXGVuZHt2ZXJiYXRpbX0KLQotRm9yIGFsbCBvdGhlciBlbmNvZGluZ3MgdGhlIGZvbGxvd2luZyBcY2xhc3N7VW5pY29kZVJlYWRlcn0gYW5kCi1cY2xhc3N7VW5pY29kZVdyaXRlcn0gY2xhc3NlcyBjYW4gYmUgdXNlZC4gVGhleSB0YWtlIGFuIGFkZGl0aW9uYWwKLVx2YXJ7ZW5jb2Rpbmd9IHBhcmFtZXRlciBpbiB0aGVpciBjb25zdHJ1Y3RvciBhbmQgbWFrZSBzdXJlIHRoYXQgdGhlIGRhdGEKLXBhc3NlcyB0aGUgcmVhbCByZWFkZXIgb3Igd3JpdGVyIGVuY29kZWQgYXMgVVRGLTg6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCBjc3YsIGNvZGVjcywgY1N0cmluZ0lPCi0KLWNsYXNzIFVURjhSZWNvZGVyOgotICAgICIiIgotICAgIEl0ZXJhdG9yIHRoYXQgcmVhZHMgYW4gZW5jb2RlZCBzdHJlYW0gYW5kIHJlZW5jb2RlcyB0aGUgaW5wdXQgdG8gVVRGLTgKLSAgICAiIiIKLSAgICBkZWYgX19pbml0X18oc2VsZiwgZiwgZW5jb2RpbmcpOgotICAgICAgICBzZWxmLnJlYWRlciA9IGNvZGVjcy5nZXRyZWFkZXIoZW5jb2RpbmcpKGYpCi0KLSAgICBkZWYgX19pdGVyX18oc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmCi0KLSAgICBkZWYgX19uZXh0X18oc2VsZik6Ci0gICAgICAgIHJldHVybiBuZXh0KHNlbGYucmVhZGVyKS5lbmNvZGUoInV0Zi04IikKLQotY2xhc3MgVW5pY29kZVJlYWRlcjoKLSAgICAiIiIKLSAgICBBIENTViByZWFkZXIgd2hpY2ggd2lsbCBpdGVyYXRlIG92ZXIgbGluZXMgaW4gdGhlIENTViBmaWxlICJmIiwKLSAgICB3aGljaCBpcyBlbmNvZGVkIGluIHRoZSBnaXZlbiBlbmNvZGluZy4KLSAgICAiIiIKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmLCBkaWFsZWN0PWNzdi5leGNlbCwgZW5jb2Rpbmc9InV0Zi04IiwgKiprd2RzKToKLSAgICAgICAgZiA9IFVURjhSZWNvZGVyKGYsIGVuY29kaW5nKQotICAgICAgICBzZWxmLnJlYWRlciA9IGNzdi5yZWFkZXIoZiwgZGlhbGVjdD1kaWFsZWN0LCAqKmt3ZHMpCi0KLSAgICBkZWYgX19uZXh0X18oc2VsZik6Ci0gICAgICAgIHJvdyA9IG5leHQoc2VsZi5yZWFkZXIpCi0gICAgICAgIHJldHVybiBbdW5pY29kZShzLCAidXRmLTgiKSBmb3IgcyBpbiByb3ddCi0KLSAgICBkZWYgX19pdGVyX18oc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmCi0KLWNsYXNzIFVuaWNvZGVXcml0ZXI6Ci0gICAgIiIiCi0gICAgQSBDU1Ygd3JpdGVyIHdoaWNoIHdpbGwgd3JpdGUgcm93cyB0byBDU1YgZmlsZSAiZiIsCi0gICAgd2hpY2ggaXMgZW5jb2RlZCBpbiB0aGUgZ2l2ZW4gZW5jb2RpbmcuCi0gICAgIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgZiwgZGlhbGVjdD1jc3YuZXhjZWwsIGVuY29kaW5nPSJ1dGYtOCIsICoqa3dkcyk6Ci0gICAgICAgICMgUmVkaXJlY3Qgb3V0cHV0IHRvIGEgcXVldWUKLSAgICAgICAgc2VsZi5xdWV1ZSA9IGNTdHJpbmdJTy5TdHJpbmdJTygpCi0gICAgICAgIHNlbGYud3JpdGVyID0gY3N2LndyaXRlcihzZWxmLnF1ZXVlLCBkaWFsZWN0PWRpYWxlY3QsICoqa3dkcykKLSAgICAgICAgc2VsZi5zdHJlYW0gPSBmCi0gICAgICAgIHNlbGYuZW5jb2RlciA9IGNvZGVjcy5nZXRpbmNyZW1lbnRhbGVuY29kZXIoZW5jb2RpbmcpKCkKLQotICAgIGRlZiB3cml0ZXJvdyhzZWxmLCByb3cpOgotICAgICAgICBzZWxmLndyaXRlci53cml0ZXJvdyhbcy5lbmNvZGUoInV0Zi04IikgZm9yIHMgaW4gcm93XSkKLSAgICAgICAgIyBGZXRjaCBVVEYtOCBvdXRwdXQgZnJvbSB0aGUgcXVldWUgLi4uCi0gICAgICAgIGRhdGEgPSBzZWxmLnF1ZXVlLmdldHZhbHVlKCkKLSAgICAgICAgZGF0YSA9IGRhdGEuZGVjb2RlKCJ1dGYtOCIpCi0gICAgICAgICMgLi4uIGFuZCByZWVuY29kZSBpdCBpbnRvIHRoZSB0YXJnZXQgZW5jb2RpbmcKLSAgICAgICAgZGF0YSA9IHNlbGYuZW5jb2Rlci5lbmNvZGUoZGF0YSkKLSAgICAgICAgIyB3cml0ZSB0byB0aGUgdGFyZ2V0IHN0cmVhbQotICAgICAgICBzZWxmLnN0cmVhbS53cml0ZShkYXRhKQotICAgICAgICAjIGVtcHR5IHF1ZXVlCi0gICAgICAgIHNlbGYucXVldWUudHJ1bmNhdGUoMCkKLQotICAgIGRlZiB3cml0ZXJvd3Moc2VsZiwgcm93cyk6Ci0gICAgICAgIGZvciByb3cgaW4gcm93czoKLSAgICAgICAgICAgIHNlbGYud3JpdGVyb3cocm93KQotXGVuZHt2ZXJiYXRpbX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliY3R5cGVzLnRleCBiL0RvYy9saWIvbGliY3R5cGVzLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzQ2ODYzZC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmN0eXBlcy50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUwICswLDAgQEAKLVxpZnhcbG9jYWxsaW5ld2lkdGhcdW5kZWZpbmVkXG5ld2xlbmd0aHtcbG9jYWxsaW5ld2lkdGh9XGZpCi1cc2V0bGVuZ3Roe1xsb2NhbGxpbmV3aWR0aH17XGxpbmV3aWR0aH0KLVxzZWN0aW9ue1xtb2R1bGV7Y3R5cGVzfSAtLS0gQSBmb3JlaWduIGZ1bmN0aW9uIGxpYnJhcnkgZm9yIFB5dGhvbi59Ci1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17Y3R5cGVzfQotXG1vZHVsZWF1dGhvcntUaG9tYXMgSGVsbGVyfXt0aGVsbGVyQHB5dGhvbi5uZXR9Ci1cbW9kdWxlc3lub3BzaXN7QSBmb3JlaWduIGZ1bmN0aW9uIGxpYnJhcnkgZm9yIFB5dGhvbi59Ci1cdmVyc2lvbmFkZGVkezIuNX0KLQotXGNvZGV7Y3R5cGVzfSBpcyBhIGZvcmVpZ24gZnVuY3Rpb24gbGlicmFyeSBmb3IgUHl0aG9uLiAgSXQgcHJvdmlkZXMgQwotY29tcGF0aWJsZSBkYXRhIHR5cGVzLCBhbmQgYWxsb3dzIGNhbGxpbmcgZnVuY3Rpb25zIGluIGRsbHMvc2hhcmVkCi1saWJyYXJpZXMuICBJdCBjYW4gYmUgdXNlZCB0byB3cmFwIHRoZXNlIGxpYnJhcmllcyBpbiBwdXJlIFB5dGhvbi4KLQotCi1cc3Vic2VjdGlvbntjdHlwZXMgdHV0b3JpYWxcbGFiZWx7Y3R5cGVzLWN0eXBlcy10dXRvcmlhbH19Ci0KLU5vdGU6IFRoZSBjb2RlIHNhbXBsZXMgaW4gdGhpcyB0dXRvcmlhbCB1c2UgXGNvZGV7ZG9jdGVzdH0gdG8gbWFrZSBzdXJlCi10aGF0IHRoZXkgYWN0dWFsbHkgd29yay4gIFNpbmNlIHNvbWUgY29kZSBzYW1wbGVzIGJlaGF2ZSBkaWZmZXJlbnRseQotdW5kZXIgTGludXgsIFdpbmRvd3MsIG9yIE1hYyBPUyBYLCB0aGV5IGNvbnRhaW4gZG9jdGVzdCBkaXJlY3RpdmVzIGluCi1jb21tZW50cy4KLQotTm90ZTogU29tZSBjb2RlIHNhbXBsZSByZWZlcmVuY2VzIHRoZSBjdHlwZXMgXGNsYXNze2N7XF99aW50fSB0eXBlLgotVGhpcyB0eXBlIGlzIGFuIGFsaWFzIHRvIHRoZSBcY2xhc3N7Y3tcX31sb25nfSB0eXBlIG9uIDMyLWJpdCBzeXN0ZW1zLiAgU28sCi15b3Ugc2hvdWxkIG5vdCBiZSBjb25mdXNlZCBpZiBcY2xhc3N7Y3tcX31sb25nfSBpcyBwcmludGVkIGlmIHlvdSB3b3VsZAotZXhwZWN0IFxjbGFzc3tje1xffWludH0gLS0tIHRoZXkgYXJlIGFjdHVhbGx5IHRoZSBzYW1lIHR5cGUuCi0KLQotXHN1YnN1YnNlY3Rpb257TG9hZGluZyBkeW5hbWljIGxpbmsgbGlicmFyaWVzXGxhYmVse2N0eXBlcy1sb2FkaW5nLWR5bmFtaWMtbGluay1saWJyYXJpZXN9fQotCi1cY29kZXtjdHlwZXN9IGV4cG9ydHMgdGhlIFx2YXJ7Y2RsbH0sIGFuZCBvbiBXaW5kb3dzIGFsc28gXHZhcnt3aW5kbGx9IGFuZAotXHZhcntvbGVkbGx9IG9iamVjdHMgdG8gbG9hZCBkeW5hbWljIGxpbmsgbGlicmFyaWVzLgotCi1Zb3UgbG9hZCBsaWJyYXJpZXMgYnkgYWNjZXNzaW5nIHRoZW0gYXMgYXR0cmlidXRlcyBvZiB0aGVzZSBvYmplY3RzLgotXHZhcntjZGxsfSBsb2FkcyBsaWJyYXJpZXMgd2hpY2ggZXhwb3J0IGZ1bmN0aW9ucyB1c2luZyB0aGUgc3RhbmRhcmQKLVxjb2Rle2NkZWNsfSBjYWxsaW5nIGNvbnZlbnRpb24sIHdoaWxlIFx2YXJ7d2luZGxsfSBsaWJyYXJpZXMgY2FsbAotZnVuY3Rpb25zIHVzaW5nIHRoZSBcY29kZXtzdGRjYWxsfSBjYWxsaW5nIGNvbnZlbnRpb24uIFx2YXJ7b2xlZGxsfSBhbHNvCi11c2VzIHRoZSBcY29kZXtzdGRjYWxsfSBjYWxsaW5nIGNvbnZlbnRpb24sIGFuZCBhc3N1bWVzIHRoZSBmdW5jdGlvbnMKLXJldHVybiBhIFdpbmRvd3MgXGNsYXNze0hSRVNVTFR9IGVycm9yIGNvZGUuIFRoZSBlcnJvciBjb2RlIGlzIHVzZWQgdG8KLWF1dG9tYXRpY2FsbHkgcmFpc2UgXGNsYXNze1dpbmRvd3NFcnJvcn0gUHl0aG9uIGV4Y2VwdGlvbnMgd2hlbiB0aGUKLWZ1bmN0aW9uIGNhbGwgZmFpbHMuCi0KLUhlcmUgYXJlIHNvbWUgZXhhbXBsZXMgZm9yIFdpbmRvd3MuIE5vdGUgdGhhdCBcY29kZXttc3ZjcnR9IGlzIHRoZSBNUwotc3RhbmRhcmQgQyBsaWJyYXJ5IGNvbnRhaW5pbmcgbW9zdCBzdGFuZGFyZCBDIGZ1bmN0aW9ucywgYW5kIHVzZXMgdGhlCi1jZGVjbCBjYWxsaW5nIGNvbnZlbnRpb246Ci1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZnJvbSBjdHlwZXMgaW1wb3J0ICoKLT4+PiBwcmludCB3aW5kbGwua2VybmVsMzIgIyBkb2N0ZXN0OiArV0lORE9XUwotPFdpbkRMTCAna2VybmVsMzInLCBoYW5kbGUgLi4uIGF0IC4uLj4KLT4+PiBwcmludCBjZGxsLm1zdmNydCAjIGRvY3Rlc3Q6ICtXSU5ET1dTCi08Q0RMTCAnbXN2Y3J0JywgaGFuZGxlIC4uLiBhdCAuLi4+Ci0+Pj4gbGliYyA9IGNkbGwubXN2Y3J0ICMgZG9jdGVzdDogK1dJTkRPV1MKLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotV2luZG93cyBhcHBlbmRzIHRoZSB1c3VhbCAnLmRsbCcgZmlsZSBzdWZmaXggYXV0b21hdGljYWxseS4KLQotT24gTGludXgsIGl0IGlzIHJlcXVpcmVkIHRvIHNwZWNpZnkgdGhlIGZpbGVuYW1lIFxlbXBoe2luY2x1ZGluZ30gdGhlCi1leHRlbnNpb24gdG8gbG9hZCBhIGxpYnJhcnksIHNvIGF0dHJpYnV0ZSBhY2Nlc3MgZG9lcyBub3Qgd29yay4KLUVpdGhlciB0aGUgXG1ldGhvZHtMb2FkTGlicmFyeX0gbWV0aG9kIG9mIHRoZSBkbGwgbG9hZGVycyBzaG91bGQgYmUgdXNlZCwKLW9yIHlvdSBzaG91bGQgbG9hZCB0aGUgbGlicmFyeSBieSBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiBDRExMIGJ5Ci1jYWxsaW5nIHRoZSBjb25zdHJ1Y3RvcjoKLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBjZGxsLkxvYWRMaWJyYXJ5KCJsaWJjLnNvLjYiKSAjIGRvY3Rlc3Q6ICtMSU5VWAotPENETEwgJ2xpYmMuc28uNicsIGhhbmRsZSAuLi4gYXQgLi4uPgotPj4+IGxpYmMgPSBDRExMKCJsaWJjLnNvLjYiKSAgICAgIyBkb2N0ZXN0OiArTElOVVgKLT4+PiBsaWJjICAgICAgICAgICAgICAgICAgICAgICAgICMgZG9jdGVzdDogK0xJTlVYCi08Q0RMTCAnbGliYy5zby42JywgaGFuZGxlIC4uLiBhdCAuLi4+Ci0+Pj4KLVxlbmR7dmVyYmF0aW19Ci0lIFhYWCBBZGQgc2VjdGlvbiBmb3IgTWFjIE9TIFguIAotCi0KLVxzdWJzdWJzZWN0aW9ue0FjY2Vzc2luZyBmdW5jdGlvbnMgZnJvbSBsb2FkZWQgZGxsc1xsYWJlbHtjdHlwZXMtYWNjZXNzaW5nLWZ1bmN0aW9ucy1mcm9tLWxvYWRlZC1kbGxzfX0KLQotRnVuY3Rpb25zIGFyZSBhY2Nlc3NlZCBhcyBhdHRyaWJ1dGVzIG9mIGRsbCBvYmplY3RzOgotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGZyb20gY3R5cGVzIGltcG9ydCAqCi0+Pj4gbGliYy5wcmludGYKLTxfRnVuY1B0ciBvYmplY3QgYXQgMHguLi4+Ci0+Pj4gcHJpbnQgd2luZGxsLmtlcm5lbDMyLkdldE1vZHVsZUhhbmRsZUEgIyBkb2N0ZXN0OiArV0lORE9XUwotPF9GdW5jUHRyIG9iamVjdCBhdCAweC4uLj4KLT4+PiBwcmludCB3aW5kbGwua2VybmVsMzIuTXlPd25GdW5jdGlvbiAjIGRvY3Rlc3Q6ICtXSU5ET1dTCi1UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KLSAgRmlsZSAiY3R5cGVzLnB5IiwgbGluZSAyMzksIGluIF9fZ2V0YXR0cl9fCi0gICAgZnVuYyA9IF9TdGRjYWxsRnVuY1B0cihuYW1lLCBzZWxmKQotQXR0cmlidXRlRXJyb3I6IGZ1bmN0aW9uICdNeU93bkZ1bmN0aW9uJyBub3QgZm91bmQKLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotTm90ZSB0aGF0IHdpbjMyIHN5c3RlbSBkbGxzIGxpa2UgXGNvZGV7a2VybmVsMzJ9IGFuZCBcY29kZXt1c2VyMzJ9IG9mdGVuCi1leHBvcnQgQU5TSSBhcyB3ZWxsIGFzIFVOSUNPREUgdmVyc2lvbnMgb2YgYSBmdW5jdGlvbi4gVGhlIFVOSUNPREUKLXZlcnNpb24gaXMgZXhwb3J0ZWQgd2l0aCBhbiBcY29kZXtXfSBhcHBlbmRlZCB0byB0aGUgbmFtZSwgd2hpbGUgdGhlIEFOU0kKLXZlcnNpb24gaXMgZXhwb3J0ZWQgd2l0aCBhbiBcY29kZXtBfSBhcHBlbmRlZCB0byB0aGUgbmFtZS4gVGhlIHdpbjMyCi1cY29kZXtHZXRNb2R1bGVIYW5kbGV9IGZ1bmN0aW9uLCB3aGljaCByZXR1cm5zIGEgXGVtcGh7bW9kdWxlIGhhbmRsZX0gZm9yIGEKLWdpdmVuIG1vZHVsZSBuYW1lLCBoYXMgdGhlIGZvbGxvd2luZyBDIHByb3RvdHlwZSwgYW5kIGEgbWFjcm8gaXMgdXNlZAotdG8gZXhwb3NlIG9uZSBvZiB0aGVtIGFzIFxjb2Rle0dldE1vZHVsZUhhbmRsZX0gZGVwZW5kaW5nIG9uIHdoZXRoZXIKLVVOSUNPREUgaXMgZGVmaW5lZCBvciBub3Q6Ci1cYmVnaW57dmVyYmF0aW19Ci0vKiBBTlNJIHZlcnNpb24gKi8KLUhNT0RVTEUgR2V0TW9kdWxlSGFuZGxlQShMUENTVFIgbHBNb2R1bGVOYW1lKTsKLS8qIFVOSUNPREUgdmVyc2lvbiAqLwotSE1PRFVMRSBHZXRNb2R1bGVIYW5kbGVXKExQQ1dTVFIgbHBNb2R1bGVOYW1lKTsKLVxlbmR7dmVyYmF0aW19Ci0KLVx2YXJ7d2luZGxsfSBkb2VzIG5vdCB0cnkgdG8gc2VsZWN0IG9uZSBvZiB0aGVtIGJ5IG1hZ2ljLCB5b3UgbXVzdAotYWNjZXNzIHRoZSB2ZXJzaW9uIHlvdSBuZWVkIGJ5IHNwZWNpZnlpbmcgXGNvZGV7R2V0TW9kdWxlSGFuZGxlQX0gb3IKLVxjb2Rle0dldE1vZHVsZUhhbmRsZVd9IGV4cGxpY2l0ZWx5LCBhbmQgdGhlbiBjYWxsIGl0IHdpdGggbm9ybWFsIHN0cmluZ3MKLW9yIHVuaWNvZGUgc3RyaW5ncyByZXNwZWN0aXZlbHkuCi0KLVNvbWV0aW1lcywgZGxscyBleHBvcnQgZnVuY3Rpb25zIHdpdGggbmFtZXMgd2hpY2ggYXJlbid0IHZhbGlkIFB5dGhvbgotaWRlbnRpZmllcnMsIGxpa2UgXGNvZGV7Ij8/MkBZQVBBWElAWiJ9LiBJbiB0aGlzIGNhc2UgeW91IGhhdmUgdG8gdXNlCi1cY29kZXtnZXRhdHRyfSB0byByZXRyaWV2ZSB0aGUgZnVuY3Rpb246Ci1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZ2V0YXR0cihjZGxsLm1zdmNydCwgIj8/MkBZQVBBWElAWiIpICMgZG9jdGVzdDogK1dJTkRPV1MKLTxfRnVuY1B0ciBvYmplY3QgYXQgMHguLi4+Ci0+Pj4KLVxlbmR7dmVyYmF0aW19Ci0KLU9uIFdpbmRvd3MsIHNvbWUgZGxscyBleHBvcnQgZnVuY3Rpb25zIG5vdCBieSBuYW1lIGJ1dCBieSBvcmRpbmFsLgotVGhlc2UgZnVuY3Rpb25zIGNhbiBiZSBhY2Nlc3NlZCBieSBpbmRleGluZyB0aGUgZGxsIG9iamVjdCB3aXRoIHRoZQotb3JkaW5hbCBudW1iZXI6Ci1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gY2RsbC5rZXJuZWwzMlsxXSAjIGRvY3Rlc3Q6ICtXSU5ET1dTCi08X0Z1bmNQdHIgb2JqZWN0IGF0IDB4Li4uPgotPj4+IGNkbGwua2VybmVsMzJbMF0gIyBkb2N0ZXN0OiArV0lORE9XUwotVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/Ci0gIEZpbGUgImN0eXBlcy5weSIsIGxpbmUgMzEwLCBpbiBfX2dldGl0ZW1fXwotICAgIGZ1bmMgPSBfU3RkY2FsbEZ1bmNQdHIobmFtZSwgc2VsZikKLUF0dHJpYnV0ZUVycm9yOiBmdW5jdGlvbiBvcmRpbmFsIDAgbm90IGZvdW5kCi0+Pj4KLVxlbmR7dmVyYmF0aW19Ci0KLQotXHN1YnN1YnNlY3Rpb257Q2FsbGluZyBmdW5jdGlvbnNcbGFiZWx7Y3R5cGVzLWNhbGxpbmctZnVuY3Rpb25zfX0KLQotWW91IGNhbiBjYWxsIHRoZXNlIGZ1bmN0aW9ucyBsaWtlIGFueSBvdGhlciBQeXRob24gY2FsbGFibGUuIFRoaXMKLWV4YW1wbGUgdXNlcyB0aGUgXGNvZGV7dGltZSgpfSBmdW5jdGlvbiwgd2hpY2ggcmV0dXJucyBzeXN0ZW0gdGltZSBpbgotc2Vjb25kcyBzaW5jZSB0aGUgXFVOSVh7fSBlcG9jaCwgYW5kIHRoZSBcY29kZXtHZXRNb2R1bGVIYW5kbGVBKCl9IGZ1bmN0aW9uLAotd2hpY2ggcmV0dXJucyBhIHdpbjMyIG1vZHVsZSBoYW5kbGUuCi0KLVRoaXMgZXhhbXBsZSBjYWxscyBib3RoIGZ1bmN0aW9ucyB3aXRoIGEgTlVMTCBwb2ludGVyIChcY29kZXtOb25lfSBzaG91bGQKLWJlIHVzZWQgYXMgdGhlIE5VTEwgcG9pbnRlcik6Ci1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gcHJpbnQgbGliYy50aW1lKE5vbmUpICMgZG9jdGVzdDogK1NLSVAKLTExNTA2NDA3OTIKLT4+PiBwcmludCBoZXgod2luZGxsLmtlcm5lbDMyLkdldE1vZHVsZUhhbmRsZUEoTm9uZSkpICMgZG9jdGVzdDogK1dJTkRPV1MKLTB4MWQwMDAwMDAKLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotXGNvZGV7Y3R5cGVzfSB0cmllcyB0byBwcm90ZWN0IHlvdSBmcm9tIGNhbGxpbmcgZnVuY3Rpb25zIHdpdGggdGhlIHdyb25nCi1udW1iZXIgb2YgYXJndW1lbnRzIG9yIHRoZSB3cm9uZyBjYWxsaW5nIGNvbnZlbnRpb24uICBVbmZvcnR1bmF0ZWx5Ci10aGlzIG9ubHkgd29ya3Mgb24gV2luZG93cy4gIEl0IGRvZXMgdGhpcyBieSBleGFtaW5pbmcgdGhlIHN0YWNrIGFmdGVyCi10aGUgZnVuY3Rpb24gcmV0dXJucywgc28gYWx0aG91Z2ggYW4gZXJyb3IgaXMgcmFpc2VkIHRoZSBmdW5jdGlvbgotXGVtcGh7aGFzfSBiZWVuIGNhbGxlZDoKLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiB3aW5kbGwua2VybmVsMzIuR2V0TW9kdWxlSGFuZGxlQSgpICMgZG9jdGVzdDogK1dJTkRPV1MKLVRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLSAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwotVmFsdWVFcnJvcjogUHJvY2VkdXJlIHByb2JhYmx5IGNhbGxlZCB3aXRoIG5vdCBlbm91Z2ggYXJndW1lbnRzICg0IGJ5dGVzIG1pc3NpbmcpCi0+Pj4gd2luZGxsLmtlcm5lbDMyLkdldE1vZHVsZUhhbmRsZUEoMCwgMCkgIyBkb2N0ZXN0OiArV0lORE9XUwotVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/Ci1WYWx1ZUVycm9yOiBQcm9jZWR1cmUgcHJvYmFibHkgY2FsbGVkIHdpdGggdG9vIG1hbnkgYXJndW1lbnRzICg0IGJ5dGVzIGluIGV4Y2VzcykKLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIHNhbWUgZXhjZXB0aW9uIGlzIHJhaXNlZCB3aGVuIHlvdSBjYWxsIGFuIFxjb2Rle3N0ZGNhbGx9IGZ1bmN0aW9uCi13aXRoIHRoZSBcY29kZXtjZGVjbH0gY2FsbGluZyBjb252ZW50aW9uLCBvciB2aWNlIHZlcnNhOgotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGNkbGwua2VybmVsMzIuR2V0TW9kdWxlSGFuZGxlQShOb25lKSAjIGRvY3Rlc3Q6ICtXSU5ET1dTCi1UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KLVZhbHVlRXJyb3I6IFByb2NlZHVyZSBwcm9iYWJseSBjYWxsZWQgd2l0aCBub3QgZW5vdWdoIGFyZ3VtZW50cyAoNCBieXRlcyBtaXNzaW5nKQotPj4+Ci0KLT4+PiB3aW5kbGwubXN2Y3J0LnByaW50Zigic3BhbSIpICMgZG9jdGVzdDogK1dJTkRPV1MKLVRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLSAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwotVmFsdWVFcnJvcjogUHJvY2VkdXJlIHByb2JhYmx5IGNhbGxlZCB3aXRoIHRvbyBtYW55IGFyZ3VtZW50cyAoNCBieXRlcyBpbiBleGNlc3MpCi0+Pj4KLVxlbmR7dmVyYmF0aW19Ci0KLVRvIGZpbmQgb3V0IHRoZSBjb3JyZWN0IGNhbGxpbmcgY29udmVudGlvbiB5b3UgaGF2ZSB0byBsb29rIGludG8gdGhlIEMKLWhlYWRlciBmaWxlIG9yIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgZnVuY3Rpb24geW91IHdhbnQgdG8gY2FsbC4KLQotT24gV2luZG93cywgXGNvZGV7Y3R5cGVzfSB1c2VzIHdpbjMyIHN0cnVjdHVyZWQgZXhjZXB0aW9uIGhhbmRsaW5nIHRvCi1wcmV2ZW50IGNyYXNoZXMgZnJvbSBnZW5lcmFsIHByb3RlY3Rpb24gZmF1bHRzIHdoZW4gZnVuY3Rpb25zIGFyZQotY2FsbGVkIHdpdGggaW52YWxpZCBhcmd1bWVudCB2YWx1ZXM6Ci1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gd2luZGxsLmtlcm5lbDMyLkdldE1vZHVsZUhhbmRsZUEoMzIpICMgZG9jdGVzdDogK1dJTkRPV1MKLVRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLSAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwotV2luZG93c0Vycm9yOiBleGNlcHRpb246IGFjY2VzcyB2aW9sYXRpb24gcmVhZGluZyAweDAwMDAwMDIwCi0+Pj4KLVxlbmR7dmVyYmF0aW19Ci0KLVRoZXJlIGFyZSwgaG93ZXZlciwgZW5vdWdoIHdheXMgdG8gY3Jhc2ggUHl0aG9uIHdpdGggXGNvZGV7Y3R5cGVzfSwgc28KLXlvdSBzaG91bGQgYmUgY2FyZWZ1bCBhbnl3YXkuCi0KLVxjb2Rle05vbmV9LCBpbnRlZ2VycywgbG9uZ3MsIGJ5dGUgc3RyaW5ncyBhbmQgdW5pY29kZSBzdHJpbmdzIGFyZSB0aGUKLW9ubHkgbmF0aXZlIFB5dGhvbiBvYmplY3RzIHRoYXQgY2FuIGRpcmVjdGx5IGJlIHVzZWQgYXMgcGFyYW1ldGVycyBpbgotdGhlc2UgZnVuY3Rpb24gY2FsbHMuICBcY29kZXtOb25lfSBpcyBwYXNzZWQgYXMgYSBDIFxjb2Rle05VTEx9IHBvaW50ZXIsCi1ieXRlIHN0cmluZ3MgYW5kIHVuaWNvZGUgc3RyaW5ncyBhcmUgcGFzc2VkIGFzIHBvaW50ZXIgdG8gdGhlIG1lbW9yeQotYmxvY2sgdGhhdCBjb250YWlucyB0aGVpciBkYXRhIChcY29kZXtjaGFyICp9IG9yIFxjb2Rle3djaGFye1xffXQgKn0pLiAgUHl0aG9uCi1pbnRlZ2VycyBhbmQgUHl0aG9uIGxvbmdzIGFyZSBwYXNzZWQgYXMgdGhlIHBsYXRmb3JtcyBkZWZhdWx0IEMKLVxjb2Rle2ludH0gdHlwZSwgdGhlaXIgdmFsdWUgaXMgbWFza2VkIHRvIGZpdCBpbnRvIHRoZSBDIHR5cGUuCi0KLUJlZm9yZSB3ZSBtb3ZlIG9uIGNhbGxpbmcgZnVuY3Rpb25zIHdpdGggb3RoZXIgcGFyYW1ldGVyIHR5cGVzLCB3ZQotaGF2ZSB0byBsZWFybiBtb3JlIGFib3V0IFxjb2Rle2N0eXBlc30gZGF0YSB0eXBlcy4KLQotCi1cc3Vic3Vic2VjdGlvbntGdW5kYW1lbnRhbCBkYXRhIHR5cGVzXGxhYmVse2N0eXBlcy1mdW5kYW1lbnRhbC1kYXRhLXR5cGVzfX0KLQotXGNvZGV7Y3R5cGVzfSBkZWZpbmVzIGEgbnVtYmVyIG9mIHByaW1pdGl2ZSBDIGNvbXBhdGlibGUgZGF0YSB0eXBlcyA6Ci1cYmVnaW57cXVvdGV9Ci1cYmVnaW57dGFibGVpaWl9e2x8bHxsfXt0ZXh0cm19Ci17Ci1jdHlwZXMgdHlwZQotfQotewotQyB0eXBlCi19Ci17Ci1QeXRob24gdHlwZQotfQotXGxpbmVpaWl7Ci1cY2xhc3N7Y3tcX31jaGFyfQotfQotewotXGNvZGV7Y2hhcn0KLX0KLXsKLTEtY2hhcmFjdGVyCi1zdHJpbmcKLX0KLVxsaW5laWlpewotXGNsYXNze2N7XF99d2NoYXJ9Ci19Ci17Ci1cY29kZXt3Y2hhcntcX310fQotfQotewotMS1jaGFyYWN0ZXIKLXVuaWNvZGUgc3RyaW5nCi19Ci1cbGluZWlpaXsKLVxjbGFzc3tje1xffWJ5dGV9Ci19Ci17Ci1cY29kZXtjaGFyfQotfQotewotaW50L2xvbmcKLX0KLVxsaW5laWlpewotXGNsYXNze2N7XF99dWJ5dGV9Ci19Ci17Ci1cY29kZXt1bnNpZ25lZCBjaGFyfQotfQotewotaW50L2xvbmcKLX0KLVxsaW5laWlpewotXGNsYXNze2N7XF99c2hvcnR9Ci19Ci17Ci1cY29kZXtzaG9ydH0KLX0KLXsKLWludC9sb25nCi19Ci1cbGluZWlpaXsKLVxjbGFzc3tje1xffXVzaG9ydH0KLX0KLXsKLVxjb2Rle3Vuc2lnbmVkIHNob3J0fQotfQotewotaW50L2xvbmcKLX0KLVxsaW5laWlpewotXGNsYXNze2N7XF99aW50fQotfQotewotXGNvZGV7aW50fQotfQotewotaW50L2xvbmcKLX0KLVxsaW5laWlpewotXGNsYXNze2N7XF99dWludH0KLX0KLXsKLVxjb2Rle3Vuc2lnbmVkIGludH0KLX0KLXsKLWludC9sb25nCi19Ci1cbGluZWlpaXsKLVxjbGFzc3tje1xffWxvbmd9Ci19Ci17Ci1cY29kZXtsb25nfQotfQotewotaW50L2xvbmcKLX0KLVxsaW5laWlpewotXGNsYXNze2N7XF99dWxvbmd9Ci19Ci17Ci1cY29kZXt1bnNpZ25lZCBsb25nfQotfQotewotaW50L2xvbmcKLX0KLVxsaW5laWlpewotXGNsYXNze2N7XF99bG9uZ2xvbmd9Ci19Ci17Ci1cY29kZXt7XF99e1xffWludDY0fSBvcgotXGNvZGV7bG9uZyBsb25nfQotfQotewotaW50L2xvbmcKLX0KLVxsaW5laWlpewotXGNsYXNze2N7XF99dWxvbmdsb25nfQotfQotewotXGNvZGV7dW5zaWduZWQge1xffXtcX31pbnQ2NH0gb3IKLVxjb2Rle3Vuc2lnbmVkIGxvbmcgbG9uZ30KLX0KLXsKLWludC9sb25nCi19Ci1cbGluZWlpaXsKLVxjbGFzc3tje1xffWZsb2F0fQotfQotewotXGNvZGV7ZmxvYXR9Ci19Ci17Ci1mbG9hdAotfQotXGxpbmVpaWl7Ci1cY2xhc3N7Y3tcX31kb3VibGV9Ci19Ci17Ci1cY29kZXtkb3VibGV9Ci19Ci17Ci1mbG9hdAotfQotXGxpbmVpaWl7Ci1cY2xhc3N7Y3tcX31jaGFye1xffXB9Ci19Ci17Ci1cY29kZXtjaGFyICp9Ci0oTlVMIHRlcm1pbmF0ZWQpCi19Ci17Ci1zdHJpbmcgb3IKLVxjb2Rle05vbmV9Ci19Ci1cbGluZWlpaXsKLVxjbGFzc3tje1xffXdjaGFye1xffXB9Ci19Ci17Ci1cY29kZXt3Y2hhcntcX310ICp9Ci0oTlVMIHRlcm1pbmF0ZWQpCi19Ci17Ci11bmljb2RlIG9yCi1cY29kZXtOb25lfQotfQotXGxpbmVpaWl7Ci1cY2xhc3N7Y3tcX312b2lke1xffXB9Ci19Ci17Ci1cY29kZXt2b2lkICp9Ci19Ci17Ci1pbnQvbG9uZwotb3IgXGNvZGV7Tm9uZX0KLX0KLVxlbmR7dGFibGVpaWl9Ci1cZW5ke3F1b3RlfQotCi1BbGwgdGhlc2UgdHlwZXMgY2FuIGJlIGNyZWF0ZWQgYnkgY2FsbGluZyB0aGVtIHdpdGggYW4gb3B0aW9uYWwKLWluaXRpYWxpemVyIG9mIHRoZSBjb3JyZWN0IHR5cGUgYW5kIHZhbHVlOgotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGNfaW50KCkKLWNfbG9uZygwKQotPj4+IGNfY2hhcl9wKCJIZWxsbywgV29ybGQiKQotY19jaGFyX3AoJ0hlbGxvLCBXb3JsZCcpCi0+Pj4gY191c2hvcnQoLTMpCi1jX3VzaG9ydCg2NTUzMykKLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotU2luY2UgdGhlc2UgdHlwZXMgYXJlIG11dGFibGUsIHRoZWlyIHZhbHVlIGNhbiBhbHNvIGJlIGNoYW5nZWQKLWFmdGVyd2FyZHM6Ci1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gaSA9IGNfaW50KDQyKQotPj4+IHByaW50IGkKLWNfbG9uZyg0MikKLT4+PiBwcmludCBpLnZhbHVlCi00MgotPj4+IGkudmFsdWUgPSAtOTkKLT4+PiBwcmludCBpLnZhbHVlCi0tOTkKLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotQXNzaWduaW5nIGEgbmV3IHZhbHVlIHRvIGluc3RhbmNlcyBvZiB0aGUgcG9pbnRlciB0eXBlcyBcY2xhc3N7Y3tcX31jaGFye1xffXB9LAotXGNsYXNze2N7XF99d2NoYXJ7XF99cH0sIGFuZCBcY2xhc3N7Y3tcX312b2lke1xffXB9IGNoYW5nZXMgdGhlIFxlbXBoe21lbW9yeSBsb2NhdGlvbn0gdGhleQotcG9pbnQgdG8sIFxlbXBoe25vdCB0aGUgY29udGVudHN9IG9mIHRoZSBtZW1vcnkgYmxvY2sgKG9mIGNvdXJzZSBub3QsCi1iZWNhdXNlIFB5dGhvbiBzdHJpbmdzIGFyZSBpbW11dGFibGUpOgotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHMgPSAiSGVsbG8sIFdvcmxkIgotPj4+IGNfcyA9IGNfY2hhcl9wKHMpCi0+Pj4gcHJpbnQgY19zCi1jX2NoYXJfcCgnSGVsbG8sIFdvcmxkJykKLT4+PiBjX3MudmFsdWUgPSAiSGksIHRoZXJlIgotPj4+IHByaW50IGNfcwotY19jaGFyX3AoJ0hpLCB0aGVyZScpCi0+Pj4gcHJpbnQgcyAgICAgICAgICAgICAgICAgIyBmaXJzdCBzdHJpbmcgaXMgdW5jaGFuZ2VkCi1IZWxsbywgV29ybGQKLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotWW91IHNob3VsZCBiZSBjYXJlZnVsLCBob3dldmVyLCBub3QgdG8gcGFzcyB0aGVtIHRvIGZ1bmN0aW9ucwotZXhwZWN0aW5nIHBvaW50ZXJzIHRvIG11dGFibGUgbWVtb3J5LiBJZiB5b3UgbmVlZCBtdXRhYmxlIG1lbW9yeQotYmxvY2tzLCBjdHlwZXMgaGFzIGEgXGNvZGV7Y3JlYXRle1xffXN0cmluZ3tcX31idWZmZXJ9IGZ1bmN0aW9uIHdoaWNoIGNyZWF0ZXMKLXRoZXNlIGluIHZhcmlvdXMgd2F5cy4gIFRoZSBjdXJyZW50IG1lbW9yeSBibG9jayBjb250ZW50cyBjYW4gYmUKLWFjY2Vzc2VkIChvciBjaGFuZ2VkKSB3aXRoIHRoZSBcY29kZXtyYXd9IHByb3BlcnR5OyBpZiB5b3Ugd2FudCB0byBhY2Nlc3MKLWl0IGFzIE5VTCB0ZXJtaW5hdGVkIHN0cmluZywgdXNlIHRoZSBcY29kZXt2YWx1ZX0gcHJvcGVydHk6Ci1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZnJvbSBjdHlwZXMgaW1wb3J0ICoKLT4+PiBwID0gY3JlYXRlX3N0cmluZ19idWZmZXIoMykgICAgICAjIGNyZWF0ZSBhIDMgYnl0ZSBidWZmZXIsIGluaXRpYWxpemVkIHRvIE5VTCBieXRlcwotPj4+IHByaW50IHNpemVvZihwKSwgcmVwcihwLnJhdykKLTMgJ1x4MDBceDAwXHgwMCcKLT4+PiBwID0gY3JlYXRlX3N0cmluZ19idWZmZXIoIkhlbGxvIikgICAgICAjIGNyZWF0ZSBhIGJ1ZmZlciBjb250YWluaW5nIGEgTlVMIHRlcm1pbmF0ZWQgc3RyaW5nCi0+Pj4gcHJpbnQgc2l6ZW9mKHApLCByZXByKHAucmF3KQotNiAnSGVsbG9ceDAwJwotPj4+IHByaW50IHJlcHIocC52YWx1ZSkKLSdIZWxsbycKLT4+PiBwID0gY3JlYXRlX3N0cmluZ19idWZmZXIoIkhlbGxvIiwgMTApICAjIGNyZWF0ZSBhIDEwIGJ5dGUgYnVmZmVyCi0+Pj4gcHJpbnQgc2l6ZW9mKHApLCByZXByKHAucmF3KQotMTAgJ0hlbGxvXHgwMFx4MDBceDAwXHgwMFx4MDAnCi0+Pj4gcC52YWx1ZSA9ICJIaSIgICAgICAKLT4+PiBwcmludCBzaXplb2YocCksIHJlcHIocC5yYXcpCi0xMCAnSGlceDAwbG9ceDAwXHgwMFx4MDBceDAwXHgwMCcKLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIFxjb2Rle2NyZWF0ZXtcX31zdHJpbmd7XF99YnVmZmVyfSBmdW5jdGlvbiByZXBsYWNlcyB0aGUgXGNvZGV7Y3tcX31idWZmZXJ9Ci1mdW5jdGlvbiAod2hpY2ggaXMgc3RpbGwgYXZhaWxhYmxlIGFzIGFuIGFsaWFzKSwgYXMgd2VsbCBhcyB0aGUKLVxjb2Rle2N7XF99c3RyaW5nfSBmdW5jdGlvbiBmcm9tIGVhcmxpZXIgY3R5cGVzIHJlbGVhc2VzLiAgVG8gY3JlYXRlIGEKLW11dGFibGUgbWVtb3J5IGJsb2NrIGNvbnRhaW5pbmcgdW5pY29kZSBjaGFyYWN0ZXJzIG9mIHRoZSBDIHR5cGUKLVxjb2Rle3djaGFye1xffXR9IHVzZSB0aGUgXGNvZGV7Y3JlYXRle1xffXVuaWNvZGV7XF99YnVmZmVyfSBmdW5jdGlvbi4KLQotCi1cc3Vic3Vic2VjdGlvbntDYWxsaW5nIGZ1bmN0aW9ucywgY29udGludWVkXGxhYmVse2N0eXBlcy1jYWxsaW5nLWZ1bmN0aW9ucy1jb250aW51ZWR9fQotCi1Ob3RlIHRoYXQgcHJpbnRmIHByaW50cyB0byB0aGUgcmVhbCBzdGFuZGFyZCBvdXRwdXQgY2hhbm5lbCwgXGVtcGh7bm90fSB0bwotXGNvZGV7c3lzLnN0ZG91dH0sIHNvIHRoZXNlIGV4YW1wbGVzIHdpbGwgb25seSB3b3JrIGF0IHRoZSBjb25zb2xlCi1wcm9tcHQsIG5vdCBmcm9tIHdpdGhpbiBcZW1waHtJRExFfSBvciBcZW1waHtQeXRob25XaW59OgotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHByaW50ZiA9IGxpYmMucHJpbnRmCi0+Pj4gcHJpbnRmKCJIZWxsbywgJXNcbiIsICJXb3JsZCEiKQotSGVsbG8sIFdvcmxkIQotMTQKLT4+PiBwcmludGYoIkhlbGxvLCAlUyIsIHUiV29ybGQhIikKLUhlbGxvLCBXb3JsZCEKLTEzCi0+Pj4gcHJpbnRmKCIlZCBib3R0bGVzIG9mIGJlZXJcbiIsIDQyKQotNDIgYm90dGxlcyBvZiBiZWVyCi0xOQotPj4+IHByaW50ZigiJWYgYm90dGxlcyBvZiBiZWVyXG4iLCA0Mi41KQotVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/Ci1Bcmd1bWVudEVycm9yOiBhcmd1bWVudCAyOiBleGNlcHRpb25zLlR5cGVFcnJvcjogRG9uJ3Qga25vdyBob3cgdG8gY29udmVydCBwYXJhbWV0ZXIgMgotPj4+Ci1cZW5ke3ZlcmJhdGltfQotCi1BcyBoYXMgYmVlbiBtZW50aW9uZWQgYmVmb3JlLCBhbGwgUHl0aG9uIHR5cGVzIGV4Y2VwdCBpbnRlZ2VycywKLXN0cmluZ3MsIGFuZCB1bmljb2RlIHN0cmluZ3MgaGF2ZSB0byBiZSB3cmFwcGVkIGluIHRoZWlyIGNvcnJlc3BvbmRpbmcKLVxjb2Rle2N0eXBlc30gdHlwZSwgc28gdGhhdCB0aGV5IGNhbiBiZSBjb252ZXJ0ZWQgdG8gdGhlIHJlcXVpcmVkIEMgZGF0YQotdHlwZToKLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBwcmludGYoIkFuIGludCAlZCwgYSBkb3VibGUgJWZcbiIsIDEyMzQsIGNfZG91YmxlKDMuMTQpKQotSW50ZWdlciAxMjM0LCBkb3VibGUgMy4xNDAwMDAxMDQ5Ci0zMQotPj4+Ci1cZW5ke3ZlcmJhdGltfQotCi0KLVxzdWJzdWJzZWN0aW9ue0NhbGxpbmcgZnVuY3Rpb25zIHdpdGggeW91ciBvd24gY3VzdG9tIGRhdGEgdHlwZXNcbGFiZWx7Y3R5cGVzLWNhbGxpbmctZnVuY3Rpb25zLXdpdGgtb3duLWN1c3RvbS1kYXRhLXR5cGVzfX0KLQotWW91IGNhbiBhbHNvIGN1c3RvbWl6ZSBcY29kZXtjdHlwZXN9IGFyZ3VtZW50IGNvbnZlcnNpb24gdG8gYWxsb3cKLWluc3RhbmNlcyBvZiB5b3VyIG93biBjbGFzc2VzIGJlIHVzZWQgYXMgZnVuY3Rpb24gYXJndW1lbnRzLgotXGNvZGV7Y3R5cGVzfSBsb29rcyBmb3IgYW4gXG1lbWJlcnt7XF99YXN7XF99cGFyYW1ldGVye1xffX0gYXR0cmlidXRlIGFuZCB1c2VzIHRoaXMgYXMKLXRoZSBmdW5jdGlvbiBhcmd1bWVudC4gT2YgY291cnNlLCBpdCBtdXN0IGJlIG9uZSBvZiBpbnRlZ2VyLCBzdHJpbmcsCi1vciB1bmljb2RlOgotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGNsYXNzIEJvdHRsZXMob2JqZWN0KToKLS4uLiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG51bWJlcik6Ci0uLi4gICAgICAgICBzZWxmLl9hc19wYXJhbWV0ZXJfID0gbnVtYmVyCi0uLi4KLT4+PiBib3R0bGVzID0gQm90dGxlcyg0MikKLT4+PiBwcmludGYoIiVkIGJvdHRsZXMgb2YgYmVlclxuIiwgYm90dGxlcykKLTQyIGJvdHRsZXMgb2YgYmVlcgotMTkKLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotSWYgeW91IGRvbid0IHdhbnQgdG8gc3RvcmUgdGhlIGluc3RhbmNlJ3MgZGF0YSBpbiB0aGUKLVxtZW1iZXJ7e1xffWFze1xffXBhcmFtZXRlcntcX319IGluc3RhbmNlIHZhcmlhYmxlLCB5b3UgY291bGQgZGVmaW5lIGEgXGNvZGV7cHJvcGVydHl9Ci13aGljaCBtYWtlcyB0aGUgZGF0YSBhdmFpYmxhYmxlLgotCi0KLVxzdWJzdWJzZWN0aW9ue1NwZWNpZnlpbmcgdGhlIHJlcXVpcmVkIGFyZ3VtZW50IHR5cGVzIChmdW5jdGlvbiBwcm90b3R5cGVzKVxsYWJlbHtjdHlwZXMtc3BlY2lmeWluZy1yZXF1aXJlZC1hcmd1bWVudC10eXBlc319Ci0KLUl0IGlzIHBvc3NpYmxlIHRvIHNwZWNpZnkgdGhlIHJlcXVpcmVkIGFyZ3VtZW50IHR5cGVzIG9mIGZ1bmN0aW9ucwotZXhwb3J0ZWQgZnJvbSBETExzIGJ5IHNldHRpbmcgdGhlIFxtZW1iZXJ7YXJndHlwZXN9IGF0dHJpYnV0ZS4KLQotXG1lbWJlcnthcmd0eXBlc30gbXVzdCBiZSBhIHNlcXVlbmNlIG9mIEMgZGF0YSB0eXBlcyAodGhlIFxjb2Rle3ByaW50Zn0KLWZ1bmN0aW9uIGlzIHByb2JhYmx5IG5vdCBhIGdvb2QgZXhhbXBsZSBoZXJlLCBiZWNhdXNlIGl0IHRha2VzIGEKLXZhcmlhYmxlIG51bWJlciBhbmQgZGlmZmVyZW50IHR5cGVzIG9mIHBhcmFtZXRlcnMgZGVwZW5kaW5nIG9uIHRoZQotZm9ybWF0IHN0cmluZywgb24gdGhlIG90aGVyIGhhbmQgdGhpcyBpcyBxdWl0ZSBoYW5keSB0byBleHBlcmltZW50Ci13aXRoIHRoaXMgZmVhdHVyZSk6Ci1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gcHJpbnRmLmFyZ3R5cGVzID0gW2NfY2hhcl9wLCBjX2NoYXJfcCwgY19pbnQsIGNfZG91YmxlXQotPj4+IHByaW50ZigiU3RyaW5nICclcycsIEludCAlZCwgRG91YmxlICVmXG4iLCAiSGkiLCAxMCwgMi4yKQotU3RyaW5nICdIaScsIEludCAxMCwgRG91YmxlIDIuMjAwMDAwCi0zNwotPj4+Ci1cZW5ke3ZlcmJhdGltfQotCi1TcGVjaWZ5aW5nIGEgZm9ybWF0IHByb3RlY3RzIGFnYWluc3QgaW5jb21wYXRpYmxlIGFyZ3VtZW50IHR5cGVzIChqdXN0Ci1hcyBhIHByb3RvdHlwZSBmb3IgYSBDIGZ1bmN0aW9uKSwgYW5kIHRyaWVzIHRvIGNvbnZlcnQgdGhlIGFyZ3VtZW50cwotdG8gdmFsaWQgdHlwZXM6Ci1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gcHJpbnRmKCIlZCAlZCAlZCIsIDEsIDIsIDMpCi1UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KLUFyZ3VtZW50RXJyb3I6IGFyZ3VtZW50IDI6IGV4Y2VwdGlvbnMuVHlwZUVycm9yOiB3cm9uZyB0eXBlCi0+Pj4gcHJpbnRmKCIlcyAlZCAlZiIsICJYIiwgMiwgMykKLVggMiAzLjAwMDAwMDEyCi0xMgotPj4+Ci1cZW5ke3ZlcmJhdGltfQotCi1JZiB5b3UgaGF2ZSBkZWZpbmVkIHlvdXIgb3duIGNsYXNzZXMgd2hpY2ggeW91IHBhc3MgdG8gZnVuY3Rpb24gY2FsbHMsCi15b3UgaGF2ZSB0byBpbXBsZW1lbnQgYSBcbWV0aG9ke2Zyb217XF99cGFyYW19IGNsYXNzIG1ldGhvZCBmb3IgdGhlbSB0byBiZQotYWJsZSB0byB1c2UgdGhlbSBpbiB0aGUgXG1lbWJlcnthcmd0eXBlc30gc2VxdWVuY2UuIFRoZSBcbWV0aG9ke2Zyb217XF99cGFyYW19Ci1jbGFzcyBtZXRob2QgcmVjZWl2ZXMgdGhlIFB5dGhvbiBvYmplY3QgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiBjYWxsLAotaXQgc2hvdWxkIGRvIGEgdHlwZWNoZWNrIG9yIHdoYXRldmVyIGlzIG5lZWRlZCB0byBtYWtlIHN1cmUgdGhpcwotb2JqZWN0IGlzIGFjY2VwdGFibGUsIGFuZCB0aGVuIHJldHVybiB0aGUgb2JqZWN0IGl0c2VsZiwgaXQncwotXG1lbWJlcnt7XF99YXN7XF99cGFyYW1ldGVye1xffX0gYXR0cmlidXRlLCBvciB3aGF0ZXZlciB5b3Ugd2FudCB0byBwYXNzIGFzIHRoZSBDCi1mdW5jdGlvbiBhcmd1bWVudCBpbiB0aGlzIGNhc2UuIEFnYWluLCB0aGUgcmVzdWx0IHNob3VsZCBiZSBhbgotaW50ZWdlciwgc3RyaW5nLCB1bmljb2RlLCBhIFxjb2Rle2N0eXBlc30gaW5zdGFuY2UsIG9yIHNvbWV0aGluZyBoYXZpbmcKLXRoZSBcbWVtYmVye3tcX31hc3tcX31wYXJhbWV0ZXJ7XF99fSBhdHRyaWJ1dGUuCi0KLQotXHN1YnN1YnNlY3Rpb257UmV0dXJuIHR5cGVzXGxhYmVse2N0eXBlcy1yZXR1cm4tdHlwZXN9fQotCi1CeSBkZWZhdWx0IGZ1bmN0aW9ucyBhcmUgYXNzdW1lZCB0byByZXR1cm4gdGhlIEMgXGNvZGV7aW50fSB0eXBlLiAgT3RoZXIKLXJldHVybiB0eXBlcyBjYW4gYmUgc3BlY2lmaWVkIGJ5IHNldHRpbmcgdGhlIFxtZW1iZXJ7cmVzdHlwZX0gYXR0cmlidXRlIG9mCi10aGUgZnVuY3Rpb24gb2JqZWN0LgotCi1IZXJlIGlzIGEgbW9yZSBhZHZhbmNlZCBleGFtcGxlLCBpdCB1c2VzIHRoZSBcY29kZXtzdHJjaHJ9IGZ1bmN0aW9uLCB3aGljaAotZXhwZWN0cyBhIHN0cmluZyBwb2ludGVyIGFuZCBhIGNoYXIsIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byBhCi1zdHJpbmc6Ci1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gc3RyY2hyID0gbGliYy5zdHJjaHIKLT4+PiBzdHJjaHIoImFiY2RlZiIsIG9yZCgiZCIpKSAjIGRvY3Rlc3Q6ICtTS0lQCi04MDU5OTgzCi0+Pj4gc3RyY2hyLnJlc3R5cGUgPSBjX2NoYXJfcCAjIGNfY2hhcl9wIGlzIGEgcG9pbnRlciB0byBhIHN0cmluZwotPj4+IHN0cmNocigiYWJjZGVmIiwgb3JkKCJkIikpCi0nZGVmJwotPj4+IHByaW50IHN0cmNocigiYWJjZGVmIiwgb3JkKCJ4IikpCi1Ob25lCi0+Pj4KLVxlbmR7dmVyYmF0aW19Ci0KLUlmIHlvdSB3YW50IHRvIGF2b2lkIHRoZSBcY29kZXtvcmQoIngiKX0gY2FsbHMgYWJvdmUsIHlvdSBjYW4gc2V0IHRoZQotXG1lbWJlcnthcmd0eXBlc30gYXR0cmlidXRlLCBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCB3aWxsIGJlIGNvbnZlcnRlZCBmcm9tCi1hIHNpbmdsZSBjaGFyYWN0ZXIgUHl0aG9uIHN0cmluZyBpbnRvIGEgQyBjaGFyOgotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHN0cmNoci5yZXN0eXBlID0gY19jaGFyX3AKLT4+PiBzdHJjaHIuYXJndHlwZXMgPSBbY19jaGFyX3AsIGNfY2hhcl0KLT4+PiBzdHJjaHIoImFiY2RlZiIsICJkIikKLSdkZWYnCi0+Pj4gc3RyY2hyKCJhYmNkZWYiLCAiZGVmIikKLVRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLSAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwotQXJndW1lbnRFcnJvcjogYXJndW1lbnQgMjogZXhjZXB0aW9ucy5UeXBlRXJyb3I6IG9uZSBjaGFyYWN0ZXIgc3RyaW5nIGV4cGVjdGVkCi0+Pj4gcHJpbnQgc3RyY2hyKCJhYmNkZWYiLCAieCIpCi1Ob25lCi0+Pj4gc3RyY2hyKCJhYmNkZWYiLCAiZCIpCi0nZGVmJwotPj4+Ci1cZW5ke3ZlcmJhdGltfQotCi1Zb3UgY2FuIGFsc28gdXNlIGEgY2FsbGFibGUgUHl0aG9uIG9iamVjdCAoYSBmdW5jdGlvbiBvciBhIGNsYXNzIGZvcgotZXhhbXBsZSkgYXMgdGhlIFxtZW1iZXJ7cmVzdHlwZX0gYXR0cmlidXRlLCBpZiB0aGUgZm9yZWlnbiBmdW5jdGlvbiByZXR1cm5zCi1hbiBpbnRlZ2VyLiAgVGhlIGNhbGxhYmxlIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIFxjb2Rle2ludGVnZXJ9IHRoZSBDCi1mdW5jdGlvbiByZXR1cm5zLCBhbmQgdGhlIHJlc3VsdCBvZiB0aGlzIGNhbGwgd2lsbCBiZSB1c2VkIGFzIHRoZQotcmVzdWx0IG9mIHlvdXIgZnVuY3Rpb24gY2FsbC4gVGhpcyBpcyB1c2VmdWwgdG8gY2hlY2sgZm9yIGVycm9yIHJldHVybgotdmFsdWVzIGFuZCBhdXRvbWF0aWNhbGx5IHJhaXNlIGFuIGV4Y2VwdGlvbjoKLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBHZXRNb2R1bGVIYW5kbGUgPSB3aW5kbGwua2VybmVsMzIuR2V0TW9kdWxlSGFuZGxlQSAjIGRvY3Rlc3Q6ICtXSU5ET1dTCi0+Pj4gZGVmIFZhbGlkSGFuZGxlKHZhbHVlKToKLS4uLiAgICAgaWYgdmFsdWUgPT0gMDoKLS4uLiAgICAgICAgIHJhaXNlIFdpbkVycm9yKCkKLS4uLiAgICAgcmV0dXJuIHZhbHVlCi0uLi4KLT4+PgotPj4+IEdldE1vZHVsZUhhbmRsZS5yZXN0eXBlID0gVmFsaWRIYW5kbGUgIyBkb2N0ZXN0OiArV0lORE9XUwotPj4+IEdldE1vZHVsZUhhbmRsZShOb25lKSAjIGRvY3Rlc3Q6ICtXSU5ET1dTCi00ODY1MzkyNjQKLT4+PiBHZXRNb2R1bGVIYW5kbGUoInNvbWV0aGluZyBzaWxseSIpICMgZG9jdGVzdDogK1dJTkRPV1MKLVRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLSAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwotICBGaWxlICI8c3RkaW4+IiwgbGluZSAzLCBpbiBWYWxpZEhhbmRsZQotV2luZG93c0Vycm9yOiBbRXJybm8gMTI2XSBUaGUgc3BlY2lmaWVkIG1vZHVsZSBjb3VsZCBub3QgYmUgZm91bmQuCi0+Pj4KLVxlbmR7dmVyYmF0aW19Ci0KLVxjb2Rle1dpbkVycm9yfSBpcyBhIGZ1bmN0aW9uIHdoaWNoIHdpbGwgY2FsbCBXaW5kb3dzIFxjb2Rle0Zvcm1hdE1lc3NhZ2UoKX0KLWFwaSB0byBnZXQgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBlcnJvciBjb2RlLCBhbmQgXGVtcGh7cmV0dXJuc30KLWFuIGV4Y2VwdGlvbi4gIFxjb2Rle1dpbkVycm9yfSB0YWtlcyBhbiBvcHRpb25hbCBlcnJvciBjb2RlIHBhcmFtZXRlciwgaWYKLW5vIG9uZSBpcyB1c2VkLCBpdCBjYWxscyBcZnVuY3Rpb257R2V0TGFzdEVycm9yKCl9IHRvIHJldHJpZXZlIGl0LgotCi1QbGVhc2Ugbm90ZSB0aGF0IGEgbXVjaCBtb3JlIHBvd2VyZnVsIGVycm9yIGNoZWNraW5nIG1lY2hhbmlzbSBpcwotYXZhaWxhYmxlIHRocm91Z2ggdGhlIFxtZW1iZXJ7ZXJyY2hlY2t9IGF0dHJpYnV0ZTsgc2VlIHRoZSByZWZlcmVuY2UgbWFudWFsCi1mb3IgZGV0YWlscy4KLQotCi1cc3Vic3Vic2VjdGlvbntQYXNzaW5nIHBvaW50ZXJzIChvcjogcGFzc2luZyBwYXJhbWV0ZXJzIGJ5IHJlZmVyZW5jZSlcbGFiZWx7Y3R5cGVzLXBhc3NpbmctcG9pbnRlcnN9fQotCi1Tb21ldGltZXMgYSBDIGFwaSBmdW5jdGlvbiBleHBlY3RzIGEgXGVtcGh7cG9pbnRlcn0gdG8gYSBkYXRhIHR5cGUgYXMKLXBhcmFtZXRlciwgcHJvYmFibHkgdG8gd3JpdGUgaW50byB0aGUgY29ycmVzcG9uZGluZyBsb2NhdGlvbiwgb3IgaWYKLXRoZSBkYXRhIGlzIHRvbyBsYXJnZSB0byBiZSBwYXNzZWQgYnkgdmFsdWUuIFRoaXMgaXMgYWxzbyBrbm93biBhcwotXGVtcGh7cGFzc2luZyBwYXJhbWV0ZXJzIGJ5IHJlZmVyZW5jZX0uCi0KLVxjb2Rle2N0eXBlc30gZXhwb3J0cyB0aGUgXGZ1bmN0aW9ue2J5cmVmfSBmdW5jdGlvbiB3aGljaCBpcyB1c2VkIHRvIHBhc3MKLXBhcmFtZXRlcnMgYnkgcmVmZXJlbmNlLiAgVGhlIHNhbWUgZWZmZWN0IGNhbiBiZSBhY2hpZXZlZCB3aXRoIHRoZQotXGNvZGV7cG9pbnRlcn0gZnVuY3Rpb24sIGFsdGhvdWdoIFxjb2Rle3BvaW50ZXJ9IGRvZXMgYSBsb3QgbW9yZSB3b3JrIHNpbmNlCi1pdCBjb25zdHJ1Y3RzIGEgcmVhbCBwb2ludGVyIG9iamVjdCwgc28gaXQgaXMgZmFzdGVyIHRvIHVzZSBcZnVuY3Rpb257YnlyZWZ9Ci1pZiB5b3UgZG9uJ3QgbmVlZCB0aGUgcG9pbnRlciBvYmplY3QgaW4gUHl0aG9uIGl0c2VsZjoKLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpID0gY19pbnQoKQotPj4+IGYgPSBjX2Zsb2F0KCkKLT4+PiBzID0gY3JlYXRlX3N0cmluZ19idWZmZXIoJ1wwMDAnICogMzIpCi0+Pj4gcHJpbnQgaS52YWx1ZSwgZi52YWx1ZSwgcmVwcihzLnZhbHVlKQotMCAwLjAgJycKLT4+PiBsaWJjLnNzY2FuZigiMSAzLjE0IEhlbGxvIiwgIiVkICVmICVzIiwKLS4uLiAgICAgICAgICAgICBieXJlZihpKSwgYnlyZWYoZiksIHMpCi0zCi0+Pj4gcHJpbnQgaS52YWx1ZSwgZi52YWx1ZSwgcmVwcihzLnZhbHVlKQotMSAzLjE0MDAwMDEwNDkgJ0hlbGxvJwotPj4+Ci1cZW5ke3ZlcmJhdGltfQotCi0KLVxzdWJzdWJzZWN0aW9ue1N0cnVjdHVyZXMgYW5kIHVuaW9uc1xsYWJlbHtjdHlwZXMtc3RydWN0dXJlcy11bmlvbnN9fQotCi1TdHJ1Y3R1cmVzIGFuZCB1bmlvbnMgbXVzdCBkZXJpdmUgZnJvbSB0aGUgXGNsYXNze1N0cnVjdHVyZX0gYW5kIFxjbGFzc3tVbmlvbn0KLWJhc2UgY2xhc3NlcyB3aGljaCBhcmUgZGVmaW5lZCBpbiB0aGUgXGNvZGV7Y3R5cGVzfSBtb2R1bGUuIEVhY2ggc3ViY2xhc3MKLW11c3QgZGVmaW5lIGEgXG1lbWJlcnt7XF99ZmllbGRze1xffX0gYXR0cmlidXRlLiAgXG1lbWJlcnt7XF99ZmllbGRze1xffX0gbXVzdCBiZSBhIGxpc3Qgb2YKLVxlbXBoezItdHVwbGVzfSwgY29udGFpbmluZyBhIFxlbXBoe2ZpZWxkIG5hbWV9IGFuZCBhIFxlbXBoe2ZpZWxkIHR5cGV9LgotCi1UaGUgZmllbGQgdHlwZSBtdXN0IGJlIGEgXGNvZGV7Y3R5cGVzfSB0eXBlIGxpa2UgXGNsYXNze2N7XF99aW50fSwgb3IgYW55IG90aGVyCi1kZXJpdmVkIFxjb2Rle2N0eXBlc30gdHlwZTogc3RydWN0dXJlLCB1bmlvbiwgYXJyYXksIHBvaW50ZXIuCi0KLUhlcmUgaXMgYSBzaW1wbGUgZXhhbXBsZSBvZiBhIFBPSU5UIHN0cnVjdHVyZSwgd2hpY2ggY29udGFpbnMgdHdvCi1pbnRlZ2VycyBuYW1lZCBcY29kZXt4fSBhbmQgXGNvZGV7eX0sIGFuZCBhbHNvIHNob3dzIGhvdyB0byBpbml0aWFsaXplIGEKLXN0cnVjdHVyZSBpbiB0aGUgY29uc3RydWN0b3I6Ci1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZnJvbSBjdHlwZXMgaW1wb3J0ICoKLT4+PiBjbGFzcyBQT0lOVChTdHJ1Y3R1cmUpOgotLi4uICAgICBfZmllbGRzXyA9IFsoIngiLCBjX2ludCksCi0uLi4gICAgICAgICAgICAgICAgICgieSIsIGNfaW50KV0KLS4uLgotPj4+IHBvaW50ID0gUE9JTlQoMTAsIDIwKQotPj4+IHByaW50IHBvaW50LngsIHBvaW50LnkKLTEwIDIwCi0+Pj4gcG9pbnQgPSBQT0lOVCh5PTUpCi0+Pj4gcHJpbnQgcG9pbnQueCwgcG9pbnQueQotMCA1Ci0+Pj4gUE9JTlQoMSwgMiwgMykKLVRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLSAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwotVmFsdWVFcnJvcjogdG9vIG1hbnkgaW5pdGlhbGl6ZXJzCi0+Pj4KLVxlbmR7dmVyYmF0aW19Ci0KLVlvdSBjYW4sIGhvd2V2ZXIsIGJ1aWxkIG11Y2ggbW9yZSBjb21wbGljYXRlZCBzdHJ1Y3R1cmVzLiBTdHJ1Y3R1cmVzCi1jYW4gaXRzZWxmIGNvbnRhaW4gb3RoZXIgc3RydWN0dXJlcyBieSB1c2luZyBhIHN0cnVjdHVyZSBhcyBhIGZpZWxkCi10eXBlLgotCi1IZXJlIGlzIGEgUkVDVCBzdHJ1Y3R1cmUgd2hpY2ggY29udGFpbnMgdHdvIFBPSU5UcyBuYW1lZCBcY29kZXt1cHBlcmxlZnR9Ci1hbmQgXGNvZGV7bG93ZXJyaWdodH0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBjbGFzcyBSRUNUKFN0cnVjdHVyZSk6Ci0uLi4gICAgIF9maWVsZHNfID0gWygidXBwZXJsZWZ0IiwgUE9JTlQpLAotLi4uICAgICAgICAgICAgICAgICAoImxvd2VycmlnaHQiLCBQT0lOVCldCi0uLi4KLT4+PiByYyA9IFJFQ1QocG9pbnQpCi0+Pj4gcHJpbnQgcmMudXBwZXJsZWZ0LngsIHJjLnVwcGVybGVmdC55Ci0wIDUKLT4+PiBwcmludCByYy5sb3dlcnJpZ2h0LngsIHJjLmxvd2VycmlnaHQueQotMCAwCi0+Pj4KLVxlbmR7dmVyYmF0aW19Ci0KLU5lc3RlZCBzdHJ1Y3R1cmVzIGNhbiBhbHNvIGJlIGluaXRpYWxpemVkIGluIHRoZSBjb25zdHJ1Y3RvciBpbgotc2V2ZXJhbCB3YXlzOgotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHIgPSBSRUNUKFBPSU5UKDEsIDIpLCBQT0lOVCgzLCA0KSkKLT4+PiByID0gUkVDVCgoMSwgMiksICgzLCA0KSkKLVxlbmR7dmVyYmF0aW19Ci0KLUZpZWxkcyBkZXNjcmlwdG9ycyBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIFxlbXBoe2NsYXNzfSwgdGhleSBhcmUgdXNlZnVsCi1mb3IgZGVidWdnaW5nIGJlY2F1c2UgdGhleSBjYW4gcHJvdmlkZSB1c2VmdWwgaW5mb3JtYXRpb246Ci1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gcHJpbnQgUE9JTlQueAotPEZpZWxkIHR5cGU9Y19sb25nLCBvZnM9MCwgc2l6ZT00PgotPj4+IHByaW50IFBPSU5ULnkKLTxGaWVsZCB0eXBlPWNfbG9uZywgb2ZzPTQsIHNpemU9ND4KLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotCi1cc3Vic3Vic2VjdGlvbntTdHJ1Y3R1cmUvdW5pb24gYWxpZ25tZW50IGFuZCBieXRlIG9yZGVyXGxhYmVse2N0eXBlcy1zdHJ1Y3R1cmV1bmlvbi1hbGlnbm1lbnQtYnl0ZS1vcmRlcn19Ci0KLUJ5IGRlZmF1bHQsIFN0cnVjdHVyZSBhbmQgVW5pb24gZmllbGRzIGFyZSBhbGlnbmVkIGluIHRoZSBzYW1lIHdheSB0aGUKLUMgY29tcGlsZXIgZG9lcyBpdC4gSXQgaXMgcG9zc2libGUgdG8gb3ZlcnJpZGUgdGhpcyBiZWhhdmlvdXIgYmUKLXNwZWNpZnlpbmcgYSBcbWVtYmVye3tcX31wYWNre1xffX0gY2xhc3MgYXR0cmlidXRlIGluIHRoZSBzdWJjbGFzcwotZGVmaW5pdGlvbi4gVGhpcyBtdXN0IGJlIHNldCB0byBhIHBvc2l0aXZlIGludGVnZXIgYW5kIHNwZWNpZmllcyB0aGUKLW1heGltdW0gYWxpZ25tZW50IGZvciB0aGUgZmllbGRzLiBUaGlzIGlzIHdoYXQgXGNvZGV7e1wjfXByYWdtYSBwYWNrKG4pfQotYWxzbyBkb2VzIGluIE1TVkMuCi0KLVxjb2Rle2N0eXBlc30gdXNlcyB0aGUgbmF0aXZlIGJ5dGUgb3JkZXIgZm9yIFN0cnVjdHVyZXMgYW5kIFVuaW9ucy4gIFRvCi1idWlsZCBzdHJ1Y3R1cmVzIHdpdGggbm9uLW5hdGl2ZSBieXRlIG9yZGVyLCB5b3UgY2FuIHVzZSBvbmUgb2YgdGhlCi1CaWdFbmRpYW5TdHJ1Y3R1cmUsIExpdHRsZUVuZGlhblN0cnVjdHVyZSwgQmlnRW5kaWFuVW5pb24sIGFuZAotTGl0dGxlRW5kaWFuVW5pb24gYmFzZSBjbGFzc2VzLiAgVGhlc2UgY2xhc3NlcyBjYW5ub3QgY29udGFpbiBwb2ludGVyCi1maWVsZHMuCi0KLQotXHN1YnN1YnNlY3Rpb257Qml0IGZpZWxkcyBpbiBzdHJ1Y3R1cmVzIGFuZCB1bmlvbnNcbGFiZWx7Y3R5cGVzLWJpdC1maWVsZHMtaW4tc3RydWN0dXJlcy11bmlvbnN9fQotCi1JdCBpcyBwb3NzaWJsZSB0byBjcmVhdGUgc3RydWN0dXJlcyBhbmQgdW5pb25zIGNvbnRhaW5pbmcgYml0IGZpZWxkcy4KLUJpdCBmaWVsZHMgYXJlIG9ubHkgcG9zc2libGUgZm9yIGludGVnZXIgZmllbGRzLCB0aGUgYml0IHdpZHRoIGlzCi1zcGVjaWZpZWQgYXMgdGhlIHRoaXJkIGl0ZW0gaW4gdGhlIFxtZW1iZXJ7e1xffWZpZWxkc3tcX319IHR1cGxlczoKLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBjbGFzcyBJbnQoU3RydWN0dXJlKToKLS4uLiAgICAgX2ZpZWxkc18gPSBbKCJmaXJzdF8xNiIsIGNfaW50LCAxNiksCi0uLi4gICAgICAgICAgICAgICAgICgic2Vjb25kXzE2IiwgY19pbnQsIDE2KV0KLS4uLgotPj4+IHByaW50IEludC5maXJzdF8xNgotPEZpZWxkIHR5cGU9Y19sb25nLCBvZnM9MDowLCBiaXRzPTE2PgotPj4+IHByaW50IEludC5zZWNvbmRfMTYKLTxGaWVsZCB0eXBlPWNfbG9uZywgb2ZzPTA6MTYsIGJpdHM9MTY+Ci0+Pj4KLVxlbmR7dmVyYmF0aW19Ci0KLQotXHN1YnN1YnNlY3Rpb257QXJyYXlzXGxhYmVse2N0eXBlcy1hcnJheXN9fQotCi1BcnJheXMgYXJlIHNlcXVlbmNlcywgY29udGFpbmluZyBhIGZpeGVkIG51bWJlciBvZiBpbnN0YW5jZXMgb2YgdGhlCi1zYW1lIHR5cGUuCi0KLVRoZSByZWNvbW1lbmRlZCB3YXkgdG8gY3JlYXRlIGFycmF5IHR5cGVzIGlzIGJ5IG11bHRpcGx5aW5nIGEgZGF0YQotdHlwZSB3aXRoIGEgcG9zaXRpdmUgaW50ZWdlcjoKLVxiZWdpbnt2ZXJiYXRpbX0KLVRlblBvaW50c0FycmF5VHlwZSA9IFBPSU5UICogMTAKLVxlbmR7dmVyYmF0aW19Ci0KLUhlcmUgaXMgYW4gZXhhbXBsZSBvZiBhbiBzb21ld2hhdCBhcnRpZmljYWwgZGF0YSB0eXBlLCBhIHN0cnVjdHVyZQotY29udGFpbmluZyA0IFBPSU5UcyBhbW9uZyBvdGhlciBzdHVmZjoKLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBmcm9tIGN0eXBlcyBpbXBvcnQgKgotPj4+IGNsYXNzIFBPSU5UKFN0cnVjdHVyZSk6Ci0uLi4gICAgX2ZpZWxkc18gPSAoIngiLCBjX2ludCksICgieSIsIGNfaW50KQotLi4uCi0+Pj4gY2xhc3MgTXlTdHJ1Y3QoU3RydWN0dXJlKToKLS4uLiAgICBfZmllbGRzXyA9IFsoImEiLCBjX2ludCksCi0uLi4gICAgICAgICAgICAgICAgKCJiIiwgY19mbG9hdCksCi0uLi4gICAgICAgICAgICAgICAgKCJwb2ludF9hcnJheSIsIFBPSU5UICogNCldCi0+Pj4KLT4+PiBwcmludCBsZW4oTXlTdHJ1Y3QoKS5wb2ludF9hcnJheSkKLTQKLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotSW5zdGFuY2VzIGFyZSBjcmVhdGVkIGluIHRoZSB1c3VhbCB3YXksIGJ5IGNhbGxpbmcgdGhlIGNsYXNzOgotXGJlZ2lue3ZlcmJhdGltfQotYXJyID0gVGVuUG9pbnRzQXJyYXlUeXBlKCkKLWZvciBwdCBpbiBhcnI6Ci0gICAgcHJpbnQgcHQueCwgcHQueQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGFib3ZlIGNvZGUgcHJpbnQgYSBzZXJpZXMgb2YgXGNvZGV7MCAwfSBsaW5lcywgYmVjYXVzZSB0aGUgYXJyYXkKLWNvbnRlbnRzIGlzIGluaXRpYWxpemVkIHRvIHplcm9zLgotCi1Jbml0aWFsaXplcnMgb2YgdGhlIGNvcnJlY3QgdHlwZSBjYW4gYWxzbyBiZSBzcGVjaWZpZWQ6Ci1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZnJvbSBjdHlwZXMgaW1wb3J0ICoKLT4+PiBUZW5JbnRlZ2VycyA9IGNfaW50ICogMTAKLT4+PiBpaSA9IFRlbkludGVnZXJzKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwKQotPj4+IHByaW50IGlpCi08Y19sb25nX0FycmF5XzEwIG9iamVjdCBhdCAweC4uLj4KLT4+PiBmb3IgaSBpbiBpaTogcHJpbnQgaSwKLS4uLgotMSAyIDMgNCA1IDYgNyA4IDkgMTAKLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotCi1cc3Vic3Vic2VjdGlvbntQb2ludGVyc1xsYWJlbHtjdHlwZXMtcG9pbnRlcnN9fQotCi1Qb2ludGVyIGluc3RhbmNlcyBhcmUgY3JlYXRlZCBieSBjYWxsaW5nIHRoZSBcY29kZXtwb2ludGVyfSBmdW5jdGlvbiBvbiBhCi1cY29kZXtjdHlwZXN9IHR5cGU6Ci1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZnJvbSBjdHlwZXMgaW1wb3J0ICoKLT4+PiBpID0gY19pbnQoNDIpCi0+Pj4gcGkgPSBwb2ludGVyKGkpCi0+Pj4KLVxlbmR7dmVyYmF0aW19Ci0KLVBvaW50ZXIgaW5zdGFuY2VzIGhhdmUgYSBcY29kZXtjb250ZW50c30gYXR0cmlidXRlIHdoaWNoIHJldHVybnMgdGhlCi1vYmplY3QgdG8gd2hpY2ggdGhlIHBvaW50ZXIgcG9pbnRzLCB0aGUgXGNvZGV7aX0gb2JqZWN0IGFib3ZlOgotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHBpLmNvbnRlbnRzCi1jX2xvbmcoNDIpCi0+Pj4KLVxlbmR7dmVyYmF0aW19Ci0KLU5vdGUgdGhhdCBcY29kZXtjdHlwZXN9IGRvZXMgbm90IGhhdmUgT09SIChvcmlnaW5hbCBvYmplY3QgcmV0dXJuKSwgaXQKLWNvbnN0cnVjdHMgYSBuZXcsIGVxdWl2YWxlbnQgb2JqZWN0IGVhY2ggdGltZSB5b3UgcmV0cmlldmUgYW4KLWF0dHJpYnV0ZToKLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBwaS5jb250ZW50cyBpcyBpCi1GYWxzZQotPj4+IHBpLmNvbnRlbnRzIGlzIHBpLmNvbnRlbnRzCi1GYWxzZQotPj4+Ci1cZW5ke3ZlcmJhdGltfQotCi1Bc3NpZ25pbmcgYW5vdGhlciBcY2xhc3N7Y3tcX31pbnR9IGluc3RhbmNlIHRvIHRoZSBwb2ludGVyJ3MgY29udGVudHMKLWF0dHJpYnV0ZSB3b3VsZCBjYXVzZSB0aGUgcG9pbnRlciB0byBwb2ludCB0byB0aGUgbWVtb3J5IGxvY2F0aW9uCi13aGVyZSB0aGlzIGlzIHN0b3JlZDoKLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpID0gY19pbnQoOTkpCi0+Pj4gcGkuY29udGVudHMgPSBpCi0+Pj4gcGkuY29udGVudHMKLWNfbG9uZyg5OSkKLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotUG9pbnRlciBpbnN0YW5jZXMgY2FuIGFsc28gYmUgaW5kZXhlZCB3aXRoIGludGVnZXJzOgotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHBpWzBdCi05OQotPj4+Ci1cZW5ke3ZlcmJhdGltfQotCi1Bc3NpZ25pbmcgdG8gYW4gaW50ZWdlciBpbmRleCBjaGFuZ2VzIHRoZSBwb2ludGVkIHRvIHZhbHVlOgotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHByaW50IGkKLWNfbG9uZyg5OSkKLT4+PiBwaVswXSA9IDIyCi0+Pj4gcHJpbnQgaQotY19sb25nKDIyKQotPj4+Ci1cZW5ke3ZlcmJhdGltfQotCi1JdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHVzZSBpbmRleGVzIGRpZmZlcmVudCBmcm9tIDAsIGJ1dCB5b3UgbXVzdCBrbm93Ci13aGF0IHlvdSdyZSBkb2luZywganVzdCBhcyBpbiBDOiBZb3UgY2FuIGFjY2VzcyBvciBjaGFuZ2UgYXJiaXRyYXJ5Ci1tZW1vcnkgbG9jYXRpb25zLiBHZW5lcmFsbHkgeW91IG9ubHkgdXNlIHRoaXMgZmVhdHVyZSBpZiB5b3UgcmVjZWl2ZSBhCi1wb2ludGVyIGZyb20gYSBDIGZ1bmN0aW9uLCBhbmQgeW91IFxlbXBoe2tub3d9IHRoYXQgdGhlIHBvaW50ZXIgYWN0dWFsbHkKLXBvaW50cyB0byBhbiBhcnJheSBpbnN0ZWFkIG9mIGEgc2luZ2xlIGl0ZW0uCi0KLUJlaGluZCB0aGUgc2NlbmVzLCB0aGUgXGNvZGV7cG9pbnRlcn0gZnVuY3Rpb24gZG9lcyBtb3JlIHRoYW4gc2ltcGx5Ci1jcmVhdGUgcG9pbnRlciBpbnN0YW5jZXMsIGl0IGhhcyB0byBjcmVhdGUgcG9pbnRlciBcZW1waHt0eXBlc30gZmlyc3QuCi1UaGlzIGlzIGRvbmUgd2l0aCB0aGUgXGNvZGV7UE9JTlRFUn0gZnVuY3Rpb24sIHdoaWNoIGFjY2VwdHMgYW55Ci1cY29kZXtjdHlwZXN9IHR5cGUsIGFuZCByZXR1cm5zIGEgbmV3IHR5cGU6Ci1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gUEkgPSBQT0lOVEVSKGNfaW50KQotPj4+IFBJCi08Y2xhc3MgJ2N0eXBlcy5MUF9jX2xvbmcnPgotPj4+IFBJKDQyKQotVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/Ci1UeXBlRXJyb3I6IGV4cGVjdGVkIGNfbG9uZyBpbnN0ZWFkIG9mIGludAotPj4+IFBJKGNfaW50KDQyKSkKLTxjdHlwZXMuTFBfY19sb25nIG9iamVjdCBhdCAweC4uLj4KLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotQ2FsbGluZyB0aGUgcG9pbnRlciB0eXBlIHdpdGhvdXQgYW4gYXJndW1lbnQgY3JlYXRlcyBhIFxjb2Rle05VTEx9Ci1wb2ludGVyLiAgXGNvZGV7TlVMTH0gcG9pbnRlcnMgaGF2ZSBhIFxjb2Rle0ZhbHNlfSBib29sZWFuIHZhbHVlOgotXGJlZ2lue3ZlcmJhdGltfQotPj4+IG51bGxfcHRyID0gUE9JTlRFUihjX2ludCkoKQotPj4+IHByaW50IGJvb2wobnVsbF9wdHIpCi1GYWxzZQotPj4+Ci1cZW5ke3ZlcmJhdGltfQotCi1cY29kZXtjdHlwZXN9IGNoZWNrcyBmb3IgXGNvZGV7TlVMTH0gd2hlbiBkZXJlZmVyZW5jaW5nIHBvaW50ZXJzIChidXQKLWRlcmVmZXJlbmNpbmcgbm9uLVxjb2Rle05VTEx9IHBvaW50ZXJzIHdvdWxkIGNyYXNoIFB5dGhvbik6Ci1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gbnVsbF9wdHJbMF0KLVRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLSAgICAuLi4uCi1WYWx1ZUVycm9yOiBOVUxMIHBvaW50ZXIgYWNjZXNzCi0+Pj4KLQotPj4+IG51bGxfcHRyWzBdID0gMTIzNAotVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICAgIC4uLi4KLVZhbHVlRXJyb3I6IE5VTEwgcG9pbnRlciBhY2Nlc3MKLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotCi1cc3Vic3Vic2VjdGlvbntUeXBlIGNvbnZlcnNpb25zXGxhYmVse2N0eXBlcy10eXBlLWNvbnZlcnNpb25zfX0KLQotVXN1YWxseSwgY3R5cGVzIGRvZXMgc3RyaWN0IHR5cGUgY2hlY2tpbmcuICBUaGlzIG1lYW5zLCBpZiB5b3UgaGF2ZQotXGNvZGV7UE9JTlRFUihje1xffWludCl9IGluIHRoZSBcbWVtYmVye2FyZ3R5cGVzfSBsaXN0IG9mIGEgZnVuY3Rpb24gb3IgYXMgdGhlCi10eXBlIG9mIGEgbWVtYmVyIGZpZWxkIGluIGEgc3RydWN0dXJlIGRlZmluaXRpb24sIG9ubHkgaW5zdGFuY2VzIG9mCi1leGFjdGx5IHRoZSBzYW1lIHR5cGUgYXJlIGFjY2VwdGVkLiAgVGhlcmUgYXJlIHNvbWUgZXhjZXB0aW9ucyB0byB0aGlzCi1ydWxlLCB3aGVyZSBjdHlwZXMgYWNjZXB0cyBvdGhlciBvYmplY3RzLiAgRm9yIGV4YW1wbGUsIHlvdSBjYW4gcGFzcwotY29tcGF0aWJsZSBhcnJheSBpbnN0YW5jZXMgaW5zdGVhZCBvZiBwb2ludGVyIHR5cGVzLiAgU28sIGZvcgotXGNvZGV7UE9JTlRFUihje1xffWludCl9LCBjdHlwZXMgYWNjZXB0cyBhbiBhcnJheSBvZiBje1xffWludDoKLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBjbGFzcyBCYXIoU3RydWN0dXJlKToKLS4uLiAgICAgX2ZpZWxkc18gPSBbKCJjb3VudCIsIGNfaW50KSwgKCJ2YWx1ZXMiLCBQT0lOVEVSKGNfaW50KSldCi0uLi4KLT4+PiBiYXIgPSBCYXIoKQotPj4+IGJhci52YWx1ZXMgPSAoY19pbnQgKiAzKSgxLCAyLCAzKQotPj4+IGJhci5jb3VudCA9IDMKLT4+PiBmb3IgaSBpbiByYW5nZShiYXIuY291bnQpOgotLi4uICAgICBwcmludCBiYXIudmFsdWVzW2ldCi0uLi4KLTEKLTIKLTMKLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotVG8gc2V0IGEgUE9JTlRFUiB0eXBlIGZpZWxkIHRvIFxjb2Rle05VTEx9LCB5b3UgY2FuIGFzc2lnbiBcY29kZXtOb25lfToKLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBiYXIudmFsdWVzID0gTm9uZQotPj4+Ci1cZW5ke3ZlcmJhdGltfQotCi1YWFggbGlzdCBvdGhlciBjb252ZXJzaW9ucy4uLgotCi1Tb21ldGltZXMgeW91IGhhdmUgaW5zdGFuY2VzIG9mIGluY29tcGF0aWJsZSB0eXBlcy4gIEluIFxjb2Rle0N9LCB5b3UgY2FuCi1jYXN0IG9uZSB0eXBlIGludG8gYW5vdGhlciB0eXBlLiAgXGNvZGV7Y3R5cGVzfSBwcm92aWRlcyBhIFxjb2Rle2Nhc3R9Ci1mdW5jdGlvbiB3aGljaCBjYW4gYmUgdXNlZCBpbiB0aGUgc2FtZSB3YXkuICBUaGUgXGNvZGV7QmFyfSBzdHJ1Y3R1cmUKLWRlZmluZWQgYWJvdmUgYWNjZXB0cyBcY29kZXtQT0lOVEVSKGN7XF99aW50KX0gcG9pbnRlcnMgb3IgXGNsYXNze2N7XF99aW50fSBhcnJheXMKLWZvciBpdHMgXGNvZGV7dmFsdWVzfSBmaWVsZCwgYnV0IG5vdCBpbnN0YW5jZXMgb2Ygb3RoZXIgdHlwZXM6Ci1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gYmFyLnZhbHVlcyA9IChjX2J5dGUgKiA0KSgpCi1UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KLVR5cGVFcnJvcjogaW5jb21wYXRpYmxlIHR5cGVzLCBjX2J5dGVfQXJyYXlfNCBpbnN0YW5jZSBpbnN0ZWFkIG9mIExQX2NfbG9uZyBpbnN0YW5jZQotPj4+Ci1cZW5ke3ZlcmJhdGltfQotCi1Gb3IgdGhlc2UgY2FzZXMsIHRoZSBcY29kZXtjYXN0fSBmdW5jdGlvbiBpcyBoYW5keS4KLQotVGhlIFxjb2Rle2Nhc3R9IGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNhc3QgYSBjdHlwZXMgaW5zdGFuY2UgaW50byBhCi1wb2ludGVyIHRvIGEgZGlmZmVyZW50IGN0eXBlcyBkYXRhIHR5cGUuICBcY29kZXtjYXN0fSB0YWtlcyB0d28KLXBhcmFtZXRlcnMsIGEgY3R5cGVzIG9iamVjdCB0aGF0IGlzIG9yIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSBwb2ludGVyCi1vZiBzb21lIGtpbmQsIGFuZCBhIGN0eXBlcyBwb2ludGVyIHR5cGUuICBJdCByZXR1cm5zIGFuIGluc3RhbmNlIG9mCi10aGUgc2Vjb25kIGFyZ3VtZW50LCB3aGljaCByZWZlcmVuY2VzIHRoZSBzYW1lIG1lbW9yeSBibG9jayBhcyB0aGUKLWZpcnN0IGFyZ3VtZW50OgotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGEgPSAoY19ieXRlICogNCkoKQotPj4+IGNhc3QoYSwgUE9JTlRFUihjX2ludCkpCi08Y3R5cGVzLkxQX2NfbG9uZyBvYmplY3QgYXQgLi4uPgotPj4+Ci1cZW5ke3ZlcmJhdGltfQotCi1TbywgXGNvZGV7Y2FzdH0gY2FuIGJlIHVzZWQgdG8gYXNzaWduIHRvIHRoZSBcY29kZXt2YWx1ZXN9IGZpZWxkIG9mIFxjb2Rle0Jhcn0KLXRoZSBzdHJ1Y3R1cmU6Ci1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gYmFyID0gQmFyKCkKLT4+PiBiYXIudmFsdWVzID0gY2FzdCgoY19ieXRlICogNCkoKSwgUE9JTlRFUihjX2ludCkpCi0+Pj4gcHJpbnQgYmFyLnZhbHVlc1swXQotMAotPj4+Ci1cZW5ke3ZlcmJhdGltfQotCi0KLVxzdWJzdWJzZWN0aW9ue0luY29tcGxldGUgVHlwZXNcbGFiZWx7Y3R5cGVzLWluY29tcGxldGUtdHlwZXN9fQotCi1cZW1waHtJbmNvbXBsZXRlIFR5cGVzfSBhcmUgc3RydWN0dXJlcywgdW5pb25zIG9yIGFycmF5cyB3aG9zZSBtZW1iZXJzIGFyZQotbm90IHlldCBzcGVjaWZpZWQuIEluIEMsIHRoZXkgYXJlIHNwZWNpZmllZCBieSBmb3J3YXJkIGRlY2xhcmF0aW9ucywgd2hpY2gKLWFyZSBkZWZpbmVkIGxhdGVyOgotXGJlZ2lue3ZlcmJhdGltfQotc3RydWN0IGNlbGw7IC8qIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KLQotc3RydWN0IHsKLSAgICBjaGFyICpuYW1lOwotICAgIHN0cnVjdCBjZWxsICpuZXh0OwotfSBjZWxsOwotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIHN0cmFpZ2h0Zm9yd2FyZCB0cmFuc2xhdGlvbiBpbnRvIGN0eXBlcyBjb2RlIHdvdWxkIGJlIHRoaXMsIGJ1dCBpdAotZG9lcyBub3Qgd29yazoKLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBjbGFzcyBjZWxsKFN0cnVjdHVyZSk6Ci0uLi4gICAgIF9maWVsZHNfID0gWygibmFtZSIsIGNfY2hhcl9wKSwKLS4uLiAgICAgICAgICAgICAgICAgKCJuZXh0IiwgUE9JTlRFUihjZWxsKSldCi0uLi4KLVRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLSAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwotICBGaWxlICI8c3RkaW4+IiwgbGluZSAyLCBpbiBjZWxsCi1OYW1lRXJyb3I6IG5hbWUgJ2NlbGwnIGlzIG5vdCBkZWZpbmVkCi0+Pj4KLVxlbmR7dmVyYmF0aW19Ci0KLWJlY2F1c2UgdGhlIG5ldyBcY29kZXtjbGFzcyBjZWxsfSBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBjbGFzcyBzdGF0ZW1lbnQKLWl0c2VsZi4gIEluIFxjb2Rle2N0eXBlc30sIHdlIGNhbiBkZWZpbmUgdGhlIFxjb2Rle2NlbGx9IGNsYXNzIGFuZCBzZXQgdGhlCi1cbWVtYmVye3tcX31maWVsZHN7XF99fSBhdHRyaWJ1dGUgbGF0ZXIsIGFmdGVyIHRoZSBjbGFzcyBzdGF0ZW1lbnQ6Ci1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZnJvbSBjdHlwZXMgaW1wb3J0ICoKLT4+PiBjbGFzcyBjZWxsKFN0cnVjdHVyZSk6Ci0uLi4gICAgIHBhc3MKLS4uLgotPj4+IGNlbGwuX2ZpZWxkc18gPSBbKCJuYW1lIiwgY19jaGFyX3ApLAotLi4uICAgICAgICAgICAgICAgICAgKCJuZXh0IiwgUE9JTlRFUihjZWxsKSldCi0+Pj4KLVxlbmR7dmVyYmF0aW19Ci0KLUxldHMgdHJ5IGl0LiBXZSBjcmVhdGUgdHdvIGluc3RhbmNlcyBvZiBcY29kZXtjZWxsfSwgYW5kIGxldCB0aGVtIHBvaW50Ci10byBlYWNoIG90aGVyLCBhbmQgZmluYWxseSBmb2xsb3cgdGhlIHBvaW50ZXIgY2hhaW4gYSBmZXcgdGltZXM6Ci1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gYzEgPSBjZWxsKCkKLT4+PiBjMS5uYW1lID0gImZvbyIKLT4+PiBjMiA9IGNlbGwoKQotPj4+IGMyLm5hbWUgPSAiYmFyIgotPj4+IGMxLm5leHQgPSBwb2ludGVyKGMyKQotPj4+IGMyLm5leHQgPSBwb2ludGVyKGMxKQotPj4+IHAgPSBjMQotPj4+IGZvciBpIGluIHJhbmdlKDgpOgotLi4uICAgICBwcmludCBwLm5hbWUsCi0uLi4gICAgIHAgPSBwLm5leHRbMF0KLS4uLgotZm9vIGJhciBmb28gYmFyIGZvbyBiYXIgZm9vIGJhcgotPj4+ICAgIAotXGVuZHt2ZXJiYXRpbX0KLQotCi1cc3Vic3Vic2VjdGlvbntDYWxsYmFjayBmdW5jdGlvbnNcbGFiZWx7Y3R5cGVzLWNhbGxiYWNrLWZ1bmN0aW9uc319Ci0KLVxjb2Rle2N0eXBlc30gYWxsb3dzIHRvIGNyZWF0ZSBDIGNhbGxhYmxlIGZ1bmN0aW9uIHBvaW50ZXJzIGZyb20gUHl0aG9uCi1jYWxsYWJsZXMuIFRoZXNlIGFyZSBzb21ldGltZXMgY2FsbGVkIFxlbXBoe2NhbGxiYWNrIGZ1bmN0aW9uc30uCi0KLUZpcnN0LCB5b3UgbXVzdCBjcmVhdGUgYSBjbGFzcyBmb3IgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLCB0aGUgY2xhc3MKLWtub3dzIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24sIHRoZSByZXR1cm4gdHlwZSwgYW5kIHRoZSBudW1iZXIgYW5kCi10eXBlcyBvZiBhcmd1bWVudHMgdGhpcyBmdW5jdGlvbiB3aWxsIHJlY2VpdmUuCi0KLVRoZSBDRlVOQ1RZUEUgZmFjdG9yeSBmdW5jdGlvbiBjcmVhdGVzIHR5cGVzIGZvciBjYWxsYmFjayBmdW5jdGlvbnMKLXVzaW5nIHRoZSBub3JtYWwgY2RlY2wgY2FsbGluZyBjb252ZW50aW9uLCBhbmQsIG9uIFdpbmRvd3MsIHRoZQotV0lORlVOQ1RZUEUgZmFjdG9yeSBmdW5jdGlvbiBjcmVhdGVzIHR5cGVzIGZvciBjYWxsYmFjayBmdW5jdGlvbnMKLXVzaW5nIHRoZSBzdGRjYWxsIGNhbGxpbmcgY29udmVudGlvbi4KLQotQm90aCBvZiB0aGVzZSBmYWN0b3J5IGZ1bmN0aW9ucyBhcmUgY2FsbGVkIHdpdGggdGhlIHJlc3VsdCB0eXBlIGFzCi1maXJzdCBhcmd1bWVudCwgYW5kIHRoZSBjYWxsYmFjayBmdW5jdGlvbnMgZXhwZWN0ZWQgYXJndW1lbnQgdHlwZXMgYXMKLXRoZSByZW1haW5pbmcgYXJndW1lbnRzLgotCi1JIHdpbGwgcHJlc2VudCBhbiBleGFtcGxlIGhlcmUgd2hpY2ggdXNlcyB0aGUgc3RhbmRhcmQgQyBsaWJyYXJ5J3MKLVxmdW5jdGlvbntxc29ydH0gZnVuY3Rpb24sIHRoaXMgaXMgdXNlZCB0byBzb3J0IGl0ZW1zIHdpdGggdGhlIGhlbHAgb2YgYQotY2FsbGJhY2sgZnVuY3Rpb24uIFxmdW5jdGlvbntxc29ydH0gd2lsbCBiZSB1c2VkIHRvIHNvcnQgYW4gYXJyYXkgb2YKLWludGVnZXJzOgotXGJlZ2lue3ZlcmJhdGltfQotPj4+IEludEFycmF5NSA9IGNfaW50ICogNQotPj4+IGlhID0gSW50QXJyYXk1KDUsIDEsIDcsIDMzLCA5OSkKLT4+PiBxc29ydCA9IGxpYmMucXNvcnQKLT4+PiBxc29ydC5yZXN0eXBlID0gTm9uZQotPj4+Ci1cZW5ke3ZlcmJhdGltfQotCi1cZnVuY3Rpb257cXNvcnR9IG11c3QgYmUgY2FsbGVkIHdpdGggYSBwb2ludGVyIHRvIHRoZSBkYXRhIHRvIHNvcnQsIHRoZQotbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBkYXRhIGFycmF5LCB0aGUgc2l6ZSBvZiBvbmUgaXRlbSwgYW5kIGEgcG9pbnRlcgotdG8gdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24sIHRoZSBjYWxsYmFjay4gVGhlIGNhbGxiYWNrIHdpbGwgdGhlbiBiZQotY2FsbGVkIHdpdGggdHdvIHBvaW50ZXJzIHRvIGl0ZW1zLCBhbmQgaXQgbXVzdCByZXR1cm4gYSBuZWdhdGl2ZQotaW50ZWdlciBpZiB0aGUgZmlyc3QgaXRlbSBpcyBzbWFsbGVyIHRoYW4gdGhlIHNlY29uZCwgYSB6ZXJvIGlmIHRoZXkKLWFyZSBlcXVhbCwgYW5kIGEgcG9zaXRpdmUgaW50ZWdlciBlbHNlLgotCi1TbyBvdXIgY2FsbGJhY2sgZnVuY3Rpb24gcmVjZWl2ZXMgcG9pbnRlcnMgdG8gaW50ZWdlcnMsIGFuZCBtdXN0Ci1yZXR1cm4gYW4gaW50ZWdlci4gRmlyc3Qgd2UgY3JlYXRlIHRoZSBcY29kZXt0eXBlfSBmb3IgdGhlIGNhbGxiYWNrCi1mdW5jdGlvbjoKLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBDTVBGVU5DID0gQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKGNfaW50KSwgUE9JTlRFUihjX2ludCkpCi0+Pj4KLVxlbmR7dmVyYmF0aW19Ci0KLUZvciB0aGUgZmlyc3QgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLCB3ZSBzaW1wbHkgcHJpbnQKLXRoZSBhcmd1bWVudHMgd2UgZ2V0LCBhbmQgcmV0dXJuIDAgKGluY3JlbWVudGFsIGRldmVsb3BtZW50IDstKToKLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBkZWYgcHlfY21wX2Z1bmMoYSwgYik6Ci0uLi4gICAgIHByaW50ICJweV9jbXBfZnVuYyIsIGEsIGIKLS4uLiAgICAgcmV0dXJuIDAKLS4uLgotPj4+Ci1cZW5ke3ZlcmJhdGltfQotCi1DcmVhdGUgdGhlIEMgY2FsbGFibGUgY2FsbGJhY2s6Ci1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gY21wX2Z1bmMgPSBDTVBGVU5DKHB5X2NtcF9mdW5jKQotPj4+Ci1cZW5ke3ZlcmJhdGltfQotCi1BbmQgd2UncmUgcmVhZHkgdG8gZ286Ci1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gcXNvcnQoaWEsIGxlbihpYSksIHNpemVvZihjX2ludCksIGNtcF9mdW5jKSAjIGRvY3Rlc3Q6ICtXSU5ET1dTCi1weV9jbXBfZnVuYyA8Y3R5cGVzLkxQX2NfbG9uZyBvYmplY3QgYXQgMHgwMC4uLj4gPGN0eXBlcy5MUF9jX2xvbmcgb2JqZWN0IGF0IDB4MDAuLi4+Ci1weV9jbXBfZnVuYyA8Y3R5cGVzLkxQX2NfbG9uZyBvYmplY3QgYXQgMHgwMC4uLj4gPGN0eXBlcy5MUF9jX2xvbmcgb2JqZWN0IGF0IDB4MDAuLi4+Ci1weV9jbXBfZnVuYyA8Y3R5cGVzLkxQX2NfbG9uZyBvYmplY3QgYXQgMHgwMC4uLj4gPGN0eXBlcy5MUF9jX2xvbmcgb2JqZWN0IGF0IDB4MDAuLi4+Ci1weV9jbXBfZnVuYyA8Y3R5cGVzLkxQX2NfbG9uZyBvYmplY3QgYXQgMHgwMC4uLj4gPGN0eXBlcy5MUF9jX2xvbmcgb2JqZWN0IGF0IDB4MDAuLi4+Ci1weV9jbXBfZnVuYyA8Y3R5cGVzLkxQX2NfbG9uZyBvYmplY3QgYXQgMHgwMC4uLj4gPGN0eXBlcy5MUF9jX2xvbmcgb2JqZWN0IGF0IDB4MDAuLi4+Ci1weV9jbXBfZnVuYyA8Y3R5cGVzLkxQX2NfbG9uZyBvYmplY3QgYXQgMHgwMC4uLj4gPGN0eXBlcy5MUF9jX2xvbmcgb2JqZWN0IGF0IDB4MDAuLi4+Ci1weV9jbXBfZnVuYyA8Y3R5cGVzLkxQX2NfbG9uZyBvYmplY3QgYXQgMHgwMC4uLj4gPGN0eXBlcy5MUF9jX2xvbmcgb2JqZWN0IGF0IDB4MDAuLi4+Ci1weV9jbXBfZnVuYyA8Y3R5cGVzLkxQX2NfbG9uZyBvYmplY3QgYXQgMHgwMC4uLj4gPGN0eXBlcy5MUF9jX2xvbmcgb2JqZWN0IGF0IDB4MDAuLi4+Ci1weV9jbXBfZnVuYyA8Y3R5cGVzLkxQX2NfbG9uZyBvYmplY3QgYXQgMHgwMC4uLj4gPGN0eXBlcy5MUF9jX2xvbmcgb2JqZWN0IGF0IDB4MDAuLi4+Ci1weV9jbXBfZnVuYyA8Y3R5cGVzLkxQX2NfbG9uZyBvYmplY3QgYXQgMHgwMC4uLj4gPGN0eXBlcy5MUF9jX2xvbmcgb2JqZWN0IGF0IDB4MDAuLi4+Ci0+Pj4KLVxlbmR7dmVyYmF0aW19Ci0KLVdlIGtub3cgaG93IHRvIGFjY2VzcyB0aGUgY29udGVudHMgb2YgYSBwb2ludGVyLCBzbyBsZXRzIHJlZGVmaW5lIG91ciBjYWxsYmFjazoKLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBkZWYgcHlfY21wX2Z1bmMoYSwgYik6Ci0uLi4gICAgIHByaW50ICJweV9jbXBfZnVuYyIsIGFbMF0sIGJbMF0KLS4uLiAgICAgcmV0dXJuIDAKLS4uLgotPj4+IGNtcF9mdW5jID0gQ01QRlVOQyhweV9jbXBfZnVuYykKLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotSGVyZSBpcyB3aGF0IHdlIGdldCBvbiBXaW5kb3dzOgotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHFzb3J0KGlhLCBsZW4oaWEpLCBzaXplb2YoY19pbnQpLCBjbXBfZnVuYykgIyBkb2N0ZXN0OiArV0lORE9XUwotcHlfY21wX2Z1bmMgNyAxCi1weV9jbXBfZnVuYyAzMyAxCi1weV9jbXBfZnVuYyA5OSAxCi1weV9jbXBfZnVuYyA1IDEKLXB5X2NtcF9mdW5jIDcgNQotcHlfY21wX2Z1bmMgMzMgNQotcHlfY21wX2Z1bmMgOTkgNQotcHlfY21wX2Z1bmMgNyA5OQotcHlfY21wX2Z1bmMgMzMgOTkKLXB5X2NtcF9mdW5jIDcgMzMKLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotSXQgaXMgZnVubnkgdG8gc2VlIHRoYXQgb24gbGludXggdGhlIHNvcnQgZnVuY3Rpb24gc2VlbXMgdG8gd29yayBtdWNoCi1tb3JlIGVmZmljaWVudCwgaXQgaXMgZG9pbmcgbGVzcyBjb21wYXJpc29uczoKLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBxc29ydChpYSwgbGVuKGlhKSwgc2l6ZW9mKGNfaW50KSwgY21wX2Z1bmMpICMgZG9jdGVzdDogK0xJTlVYCi1weV9jbXBfZnVuYyA1IDEKLXB5X2NtcF9mdW5jIDMzIDk5Ci1weV9jbXBfZnVuYyA3IDMzCi1weV9jbXBfZnVuYyA1IDcKLXB5X2NtcF9mdW5jIDEgNwotPj4+Ci1cZW5ke3ZlcmJhdGltfQotCi1BaCwgd2UncmUgbmVhcmx5IGRvbmUhIFRoZSBsYXN0IHN0ZXAgaXMgdG8gYWN0dWFsbHkgY29tcGFyZSB0aGUgdHdvCi1pdGVtcyBhbmQgcmV0dXJuIGEgdXNlZnVsIHJlc3VsdDoKLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBkZWYgcHlfY21wX2Z1bmMoYSwgYik6Ci0uLi4gICAgIHByaW50ICJweV9jbXBfZnVuYyIsIGFbMF0sIGJbMF0KLS4uLiAgICAgcmV0dXJuIGFbMF0gLSBiWzBdCi0uLi4KLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotRmluYWwgcnVuIG9uIFdpbmRvd3M6Ci1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gcXNvcnQoaWEsIGxlbihpYSksIHNpemVvZihjX2ludCksIENNUEZVTkMocHlfY21wX2Z1bmMpKSAjIGRvY3Rlc3Q6ICtXSU5ET1dTCi1weV9jbXBfZnVuYyAzMyA3Ci1weV9jbXBfZnVuYyA5OSAzMwotcHlfY21wX2Z1bmMgNSA5OQotcHlfY21wX2Z1bmMgMSA5OQotcHlfY21wX2Z1bmMgMzMgNwotcHlfY21wX2Z1bmMgMSAzMwotcHlfY21wX2Z1bmMgNSAzMwotcHlfY21wX2Z1bmMgNSA3Ci1weV9jbXBfZnVuYyAxIDcKLXB5X2NtcF9mdW5jIDUgMQotPj4+Ci1cZW5ke3ZlcmJhdGltfQotCi1hbmQgb24gTGludXg6Ci1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gcXNvcnQoaWEsIGxlbihpYSksIHNpemVvZihjX2ludCksIENNUEZVTkMocHlfY21wX2Z1bmMpKSAjIGRvY3Rlc3Q6ICtMSU5VWAotcHlfY21wX2Z1bmMgNSAxCi1weV9jbXBfZnVuYyAzMyA5OQotcHlfY21wX2Z1bmMgNyAzMwotcHlfY21wX2Z1bmMgMSA3Ci1weV9jbXBfZnVuYyA1IDcKLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotSXQgaXMgcXVpdGUgaW50ZXJlc3RpbmcgdG8gc2VlIHRoYXQgdGhlIFdpbmRvd3MgXGZ1bmN0aW9ue3Fzb3J0fSBmdW5jdGlvbgotbmVlZHMgbW9yZSBjb21wYXJpc29ucyB0aGFuIHRoZSBsaW51eCB2ZXJzaW9uIQotCi1BcyB3ZSBjYW4gZWFzaWx5IGNoZWNrLCBvdXIgYXJyYXkgaXMgc29ydGVkIG5vdzoKLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBmb3IgaSBpbiBpYTogcHJpbnQgaSwKLS4uLgotMSA1IDcgMzMgOTkKLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotXHRleHRiZntJbXBvcnRhbnQgbm90ZSBmb3IgY2FsbGJhY2sgZnVuY3Rpb25zOn0KLQotTWFrZSBzdXJlIHlvdSBrZWVwIHJlZmVyZW5jZXMgdG8gQ0ZVTkNUWVBFIG9iamVjdHMgYXMgbG9uZyBhcyB0aGV5IGFyZQotdXNlZCBmcm9tIEMgY29kZS4gXGNvZGV7Y3R5cGVzfSBkb2Vzbid0LCBhbmQgaWYgeW91IGRvbid0LCB0aGV5IG1heSBiZQotZ2FyYmFnZSBjb2xsZWN0ZWQsIGNyYXNoaW5nIHlvdXIgcHJvZ3JhbSB3aGVuIGEgY2FsbGJhY2sgaXMgbWFkZS4KLQotCi1cc3Vic3Vic2VjdGlvbntBY2Nlc3NpbmcgdmFsdWVzIGV4cG9ydGVkIGZyb20gZGxsc1xsYWJlbHtjdHlwZXMtYWNjZXNzaW5nLXZhbHVlcy1leHBvcnRlZC1mcm9tLWRsbHN9fQotCi1Tb21ldGltZXMsIGEgZGxsIG5vdCBvbmx5IGV4cG9ydHMgZnVuY3Rpb25zLCBpdCBhbHNvIGV4cG9ydHMKLXZhcmlhYmxlcy4gQW4gZXhhbXBsZSBpbiB0aGUgUHl0aG9uIGxpYnJhcnkgaXRzZWxmIGlzIHRoZQotXGNvZGV7UHl7XF99T3B0aW1pemVGbGFnfSwgYW4gaW50ZWdlciBzZXQgdG8gMCwgMSwgb3IgMiwgZGVwZW5kaW5nIG9uIHRoZQotXHByb2dyYW1vcHR7LU99IG9yIFxwcm9ncmFtb3B0ey1PT30gZmxhZyBnaXZlbiBvbiBzdGFydHVwLgotCi1cY29kZXtjdHlwZXN9IGNhbiBhY2Nlc3MgdmFsdWVzIGxpa2UgdGhpcyB3aXRoIHRoZSBcbWV0aG9ke2lue1xffWRsbH0gY2xhc3MKLW1ldGhvZHMgb2YgdGhlIHR5cGUuICBcdmFye3B5dGhvbmFwaX0gaXMgYSBwcmVkZWZpbmVkIHN5bWJvbCBnaXZpbmcKLWFjY2VzcyB0byB0aGUgUHl0aG9uIEMgYXBpOgotXGJlZ2lue3ZlcmJhdGltfQotPj4+IG9wdF9mbGFnID0gY19pbnQuaW5fZGxsKHB5dGhvbmFwaSwgIlB5X09wdGltaXplRmxhZyIpCi0+Pj4gcHJpbnQgb3B0X2ZsYWcKLWNfbG9uZygwKQotPj4+Ci1cZW5ke3ZlcmJhdGltfQotCi1JZiB0aGUgaW50ZXJwcmV0ZXIgd291bGQgaGF2ZSBiZWVuIHN0YXJ0ZWQgd2l0aCBccHJvZ3JhbW9wdHstT30sIHRoZSBzYW1wbGUKLXdvdWxkIGhhdmUgcHJpbnRlZCBcY29kZXtje1xffWxvbmcoMSl9LCBvciBcY29kZXtje1xffWxvbmcoMil9IGlmIFxwcm9ncmFtb3B0ey1PT30gd291bGQgaGF2ZQotYmVlbiBzcGVjaWZpZWQuCi0KLUFuIGV4dGVuZGVkIGV4YW1wbGUgd2hpY2ggYWxzbyBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiBwb2ludGVycwotYWNjZXNzZXMgdGhlIFxjb2Rle1B5SW1wb3J0e1xffUZyb3plbk1vZHVsZXN9IHBvaW50ZXIgZXhwb3J0ZWQgYnkgUHl0aG9uLgotCi1RdW90aW5nIHRoZSBQeXRob24gZG9jczogXGVtcGh7VGhpcyBwb2ludGVyIGlzIGluaXRpYWxpemVkIHRvIHBvaW50IHRvIGFuCi1hcnJheSBvZiBgYHN0cnVjdCB7XF99ZnJvemVuYGAgcmVjb3JkcywgdGVybWluYXRlZCBieSBvbmUgd2hvc2UgbWVtYmVycwotYXJlIGFsbCBOVUxMIG9yIHplcm8uIFdoZW4gYSBmcm96ZW4gbW9kdWxlIGlzIGltcG9ydGVkLCBpdCBpcyBzZWFyY2hlZAotaW4gdGhpcyB0YWJsZS4gVGhpcmQtcGFydHkgY29kZSBjb3VsZCBwbGF5IHRyaWNrcyB3aXRoIHRoaXMgdG8gcHJvdmlkZQotYSBkeW5hbWljYWxseSBjcmVhdGVkIGNvbGxlY3Rpb24gb2YgZnJvemVuIG1vZHVsZXMufQotCi1TbyBtYW5pcHVsYXRpbmcgdGhpcyBwb2ludGVyIGNvdWxkIGV2ZW4gcHJvdmUgdXNlZnVsLiBUbyByZXN0cmljdCB0aGUKLWV4YW1wbGUgc2l6ZSwgd2Ugc2hvdyBvbmx5IGhvdyB0aGlzIHRhYmxlIGNhbiBiZSByZWFkIHdpdGgKLVxjb2Rle2N0eXBlc306Ci1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZnJvbSBjdHlwZXMgaW1wb3J0ICoKLT4+PgotPj4+IGNsYXNzIHN0cnVjdF9mcm96ZW4oU3RydWN0dXJlKToKLS4uLiAgICAgX2ZpZWxkc18gPSBbKCJuYW1lIiwgY19jaGFyX3ApLAotLi4uICAgICAgICAgICAgICAgICAoImNvZGUiLCBQT0lOVEVSKGNfdWJ5dGUpKSwKLS4uLiAgICAgICAgICAgICAgICAgKCJzaXplIiwgY19pbnQpXQotLi4uCi0+Pj4KLVxlbmR7dmVyYmF0aW19Ci0KLVdlIGhhdmUgZGVmaW5lZCB0aGUgXGNvZGV7c3RydWN0IHtcX31mcm96ZW59IGRhdGEgdHlwZSwgc28gd2UgY2FuIGdldCB0aGUKLXBvaW50ZXIgdG8gdGhlIHRhYmxlOgotXGJlZ2lue3ZlcmJhdGltfQotPj4+IEZyb3plblRhYmxlID0gUE9JTlRFUihzdHJ1Y3RfZnJvemVuKQotPj4+IHRhYmxlID0gRnJvemVuVGFibGUuaW5fZGxsKHB5dGhvbmFwaSwgIlB5SW1wb3J0X0Zyb3plbk1vZHVsZXMiKQotPj4+Ci1cZW5ke3ZlcmJhdGltfQotCi1TaW5jZSBcY29kZXt0YWJsZX0gaXMgYSBcY29kZXtwb2ludGVyfSB0byB0aGUgYXJyYXkgb2YgXGNvZGV7c3RydWN0e1xffWZyb3plbn0KLXJlY29yZHMsIHdlIGNhbiBpdGVyYXRlIG92ZXIgaXQsIGJ1dCB3ZSBqdXN0IGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQKLW91ciBsb29wIHRlcm1pbmF0ZXMsIGJlY2F1c2UgcG9pbnRlcnMgaGF2ZSBubyBzaXplLiBTb29uZXIgb3IgbGF0ZXIgaXQKLXdvdWxkIHByb2JhYmx5IGNyYXNoIHdpdGggYW4gYWNjZXNzIHZpb2xhdGlvbiBvciB3aGF0ZXZlciwgc28gaXQncwotYmV0dGVyIHRvIGJyZWFrIG91dCBvZiB0aGUgbG9vcCB3aGVuIHdlIGhpdCB0aGUgTlVMTCBlbnRyeToKLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBmb3IgaXRlbSBpbiB0YWJsZToKLS4uLiAgICBwcmludCBpdGVtLm5hbWUsIGl0ZW0uc2l6ZQotLi4uICAgIGlmIGl0ZW0ubmFtZSBpcyBOb25lOgotLi4uICAgICAgICBicmVhawotLi4uCi1fX2hlbGxvX18gMTA0Ci1fX3BoZWxsb19fIC0xMDQKLV9fcGhlbGxvX18uc3BhbSAxMDQKLU5vbmUgMAotPj4+Ci1cZW5ke3ZlcmJhdGltfQotCi1UaGUgZmFjdCB0aGF0IHN0YW5kYXJkIFB5dGhvbiBoYXMgYSBmcm96ZW4gbW9kdWxlIGFuZCBhIGZyb3plbiBwYWNrYWdlCi0oaW5kaWNhdGVkIGJ5IHRoZSBuZWdhdGl2ZSBzaXplIG1lbWJlcikgaXMgbm90IHdlbGxrbm93biwgaXQgaXMgb25seQotdXNlZCBmb3IgdGVzdGluZy4gVHJ5IGl0IG91dCB3aXRoIFxjb2Rle2ltcG9ydCB7XF99e1xffWhlbGxve1xffXtcX319IGZvciBleGFtcGxlLgotCi0KLVxzdWJzdWJzZWN0aW9ue1N1cnByaXNlc1xsYWJlbHtjdHlwZXMtc3VycHJpc2VzfX0KLQotVGhlcmUgYXJlIHNvbWUgZWRnZXMgaW4gXGNvZGV7Y3R5cGVzfSB3aGVyZSB5b3UgbWF5IGJlIGV4cGVjdCBzb21ldGhpbmcKLWVsc2UgdGhhbiB3aGF0IGFjdHVhbGx5IGhhcHBlbnMuCi0KLUNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBmcm9tIGN0eXBlcyBpbXBvcnQgKgotPj4+IGNsYXNzIFBPSU5UKFN0cnVjdHVyZSk6Ci0uLi4gICAgIF9maWVsZHNfID0gKCJ4IiwgY19pbnQpLCAoInkiLCBjX2ludCkKLS4uLgotPj4+IGNsYXNzIFJFQ1QoU3RydWN0dXJlKToKLS4uLiAgICAgX2ZpZWxkc18gPSAoImEiLCBQT0lOVCksICgiYiIsIFBPSU5UKQotLi4uCi0+Pj4gcDEgPSBQT0lOVCgxLCAyKQotPj4+IHAyID0gUE9JTlQoMywgNCkKLT4+PiByYyA9IFJFQ1QocDEsIHAyKQotPj4+IHByaW50IHJjLmEueCwgcmMuYS55LCByYy5iLngsIHJjLmIueQotMSAyIDMgNAotPj4+ICMgbm93IHN3YXAgdGhlIHR3byBwb2ludHMKLT4+PiByYy5hLCByYy5iID0gcmMuYiwgcmMuYQotPj4+IHByaW50IHJjLmEueCwgcmMuYS55LCByYy5iLngsIHJjLmIueQotMyA0IDMgNAotPj4+Ci1cZW5ke3ZlcmJhdGltfQotCi1IbS4gV2UgY2VydGFpbmx5IGV4cGVjdGVkIHRoZSBsYXN0IHN0YXRlbWVudCB0byBwcmludCBcY29kZXszIDQgMSAyfS4KLVdoYXQgaGFwcGVuZGVkPyBIZXJlIGFyZSB0aGUgc3RlcHMgb2YgdGhlIFxjb2Rle3JjLmEsIHJjLmIgPSByYy5iLCByYy5hfQotbGluZSBhYm92ZToKLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiB0ZW1wMCwgdGVtcDEgPSByYy5iLCByYy5hCi0+Pj4gcmMuYSA9IHRlbXAwCi0+Pj4gcmMuYiA9IHRlbXAxCi0+Pj4KLVxlbmR7dmVyYmF0aW19Ci0KLU5vdGUgdGhhdCBcY29kZXt0ZW1wMH0gYW5kIFxjb2Rle3RlbXAxfSBhcmUgb2JqZWN0cyBzdGlsbCB1c2luZyB0aGUgaW50ZXJuYWwKLWJ1ZmZlciBvZiB0aGUgXGNvZGV7cmN9IG9iamVjdCBhYm92ZS4gU28gZXhlY3V0aW5nIFxjb2Rle3JjLmEgPSB0ZW1wMH0KLWNvcGllcyB0aGUgYnVmZmVyIGNvbnRlbnRzIG9mIFxjb2Rle3RlbXAwfSBpbnRvIFxjb2Rle3JjfSAncyBidWZmZXIuICBUaGlzLAotaW4gdHVybiwgY2hhbmdlcyB0aGUgY29udGVudHMgb2YgXGNvZGV7dGVtcDF9LiBTbywgdGhlIGxhc3QgYXNzaWdubWVudAotXGNvZGV7cmMuYiA9IHRlbXAxfSwgZG9lc24ndCBoYXZlIHRoZSBleHBlY3RlZCBlZmZlY3QuCi0KLUtlZXAgaW4gbWluZCB0aGF0IHJldHJpZXZpbmcgc3Vib2JqZWN0cyBmcm9tIFN0cnVjdHVyZSwgVW5pb25zLCBhbmQKLUFycmF5cyBkb2Vzbid0IFxlbXBoe2NvcHl9IHRoZSBzdWJvYmplY3QsIGluc3RlYWQgaXQgcmV0cmlldmVzIGEgd3JhcHBlcgotb2JqZWN0IGFjY2Vzc2luZyB0aGUgcm9vdC1vYmplY3QncyB1bmRlcmx5aW5nIGJ1ZmZlci4KLQotQW5vdGhlciBleGFtcGxlIHRoYXQgbWF5IGJlaGF2ZSBkaWZmZXJlbnQgZnJvbSB3aGF0IG9uZSB3b3VsZCBleHBlY3QgaXMgdGhpczoKLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBzID0gY19jaGFyX3AoKQotPj4+IHMudmFsdWUgPSAiYWJjIGRlZiBnaGkiCi0+Pj4gcy52YWx1ZQotJ2FiYyBkZWYgZ2hpJwotPj4+IHMudmFsdWUgaXMgcy52YWx1ZQotRmFsc2UKLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotV2h5IGlzIGl0IHByaW50aW5nIFxjb2Rle0ZhbHNlfT8gIGN0eXBlcyBpbnN0YW5jZXMgYXJlIG9iamVjdHMgY29udGFpbmluZwotYSBtZW1vcnkgYmxvY2sgcGx1cyBzb21lIGRlc2NyaXB0b3JzIGFjY2Vzc2luZyB0aGUgY29udGVudHMgb2YgdGhlCi1tZW1vcnkuICBTdG9yaW5nIGEgUHl0aG9uIG9iamVjdCBpbiB0aGUgbWVtb3J5IGJsb2NrIGRvZXMgbm90IHN0b3JlCi10aGUgb2JqZWN0IGl0c2VsZiwgaW5zdGVhZCB0aGUgXGNvZGV7Y29udGVudHN9IG9mIHRoZSBvYmplY3QgaXMgc3RvcmVkLgotQWNjZXNzaW5nIHRoZSBjb250ZW50cyBhZ2FpbiBjb25zdHJ1Y3RzIGEgbmV3IFB5dGhvbiBlYWNoIHRpbWUhCi0KLQotXHN1YnN1YnNlY3Rpb257VmFyaWFibGUtc2l6ZWQgZGF0YSB0eXBlc1xsYWJlbHtjdHlwZXMtdmFyaWFibGUtc2l6ZWQtZGF0YS10eXBlc319Ci0KLVxjb2Rle2N0eXBlc30gcHJvdmlkZXMgc29tZSBzdXBwb3J0IGZvciB2YXJpYWJsZS1zaXplZCBhcnJheXMgYW5kCi1zdHJ1Y3R1cmVzICh0aGlzIHdhcyBhZGRlZCBpbiB2ZXJzaW9uIDAuOS45LjcpLgotCi1UaGUgXGNvZGV7cmVzaXplfSBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXNpemUgdGhlIG1lbW9yeSBidWZmZXIgb2YgYW4KLWV4aXN0aW5nIGN0eXBlcyBvYmplY3QuICBUaGUgZnVuY3Rpb24gdGFrZXMgdGhlIG9iamVjdCBhcyBmaXJzdAotYXJndW1lbnQsIGFuZCB0aGUgcmVxdWVzdGVkIHNpemUgaW4gYnl0ZXMgYXMgdGhlIHNlY29uZCBhcmd1bWVudC4gIFRoZQotbWVtb3J5IGJsb2NrIGNhbm5vdCBiZSBtYWRlIHNtYWxsZXIgdGhhbiB0aGUgbmF0dXJhbCBtZW1vcnkgYmxvY2sKLXNwZWNpZmllZCBieSB0aGUgb2JqZWN0cyB0eXBlLCBhIFxjb2Rle1ZhbHVlRXJyb3J9IGlzIHJhaXNlZCBpZiB0aGlzIGlzCi10cmllZDoKLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBzaG9ydF9hcnJheSA9IChjX3Nob3J0ICogNCkoKQotPj4+IHByaW50IHNpemVvZihzaG9ydF9hcnJheSkKLTgKLT4+PiByZXNpemUoc2hvcnRfYXJyYXksIDQpCi1UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gICAgLi4uCi1WYWx1ZUVycm9yOiBtaW5pbXVtIHNpemUgaXMgOAotPj4+IHJlc2l6ZShzaG9ydF9hcnJheSwgMzIpCi0+Pj4gc2l6ZW9mKHNob3J0X2FycmF5KQotMzIKLT4+PiBzaXplb2YodHlwZShzaG9ydF9hcnJheSkpCi04Ci0+Pj4KLVxlbmR7dmVyYmF0aW19Ci0KLVRoaXMgaXMgbmljZSBhbmQgZmluZSwgYnV0IGhvdyB3b3VsZCBvbmUgYWNjZXNzIHRoZSBhZGRpdGlvbmFsCi1lbGVtZW50cyBjb250YWluZWQgaW4gdGhpcyBhcnJheT8gIFNpbmNlIHRoZSB0eXBlIHN0aWxsIG9ubHkga25vd3MKLWFib3V0IDQgZWxlbWVudHMsIHdlIGdldCBlcnJvcnMgYWNjZXNzaW5nIG90aGVyIGVsZW1lbnRzOgotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHNob3J0X2FycmF5WzpdCi1bMCwgMCwgMCwgMF0KLT4+PiBzaG9ydF9hcnJheVs3XQotVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICAgIC4uLgotSW5kZXhFcnJvcjogaW52YWxpZCBpbmRleAotPj4+Ci1cZW5ke3ZlcmJhdGltfQotCi1Bbm90aGVyIHdheSB0byB1c2UgdmFyaWFibGUtc2l6ZWQgZGF0YSB0eXBlcyB3aXRoIFxjb2Rle2N0eXBlc30gaXMgdG8gdXNlCi10aGUgZHluYW1pYyBuYXR1cmUgb2YgUHl0aG9uLCBhbmQgKHJlLSlkZWZpbmUgdGhlIGRhdGEgdHlwZSBhZnRlciB0aGUKLXJlcXVpcmVkIHNpemUgaXMgYWxyZWFkeSBrbm93biwgb24gYSBjYXNlIGJ5IGNhc2UgYmFzaXMuCi0KLQotXHN1YnN1YnNlY3Rpb257QnVncywgVG9EbyBhbmQgbm9uLWltcGxlbWVudGVkIHRoaW5nc1xsYWJlbHtjdHlwZXMtYnVncy10b2RvLW5vbi1pbXBsZW1lbnRlZC10aGluZ3N9fQotCi1FbnVtZXJhdGlvbiB0eXBlcyBhcmUgbm90IGltcGxlbWVudGVkLiBZb3UgY2FuIGRvIGl0IGVhc2lseSB5b3Vyc2VsZiwKLXVzaW5nIFxjbGFzc3tje1xffWludH0gYXMgdGhlIGJhc2UgY2xhc3MuCi0KLVxjb2Rle2xvbmcgZG91YmxlfSBpcyBub3QgaW1wbGVtZW50ZWQuCi0lIExvY2FsIFZhcmlhYmxlczoKLSUgY29tcGlsZS1jb21tYW5kOiAibWFrZS5iYXQiCi0lIEVuZDogCi0KLQotXHN1YnNlY3Rpb257Y3R5cGVzIHJlZmVyZW5jZVxsYWJlbHtjdHlwZXMtY3R5cGVzLXJlZmVyZW5jZX19Ci0KLQotXHN1YnN1YnNlY3Rpb257RmluZGluZyBzaGFyZWQgbGlicmFyaWVzXGxhYmVse2N0eXBlcy1maW5kaW5nLXNoYXJlZC1saWJyYXJpZXN9fQotCi1XaGVuIHByb2dyYW1taW5nIGluIGEgY29tcGlsZWQgbGFuZ3VhZ2UsIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGFjY2Vzc2VkCi13aGVuIGNvbXBpbGluZy9saW5raW5nIGEgcHJvZ3JhbSwgYW5kIHdoZW4gdGhlIHByb2dyYW0gaXMgcnVuLgotCi1UaGUgcHVycG9zZSBvZiB0aGUgXGNvZGV7ZmluZHtcX31saWJyYXJ5fSBmdW5jdGlvbiBpcyB0byBsb2NhdGUgYSBsaWJyYXJ5IGluCi1hIHdheSBzaW1pbGFyIHRvIHdoYXQgdGhlIGNvbXBpbGVyIGRvZXMgKG9uIHBsYXRmb3JtcyB3aXRoIHNldmVyYWwKLXZlcnNpb25zIG9mIGEgc2hhcmVkIGxpYnJhcnkgdGhlIG1vc3QgcmVjZW50IHNob3VsZCBiZSBsb2FkZWQpLCB3aGlsZQotdGhlIGN0eXBlcyBsaWJyYXJ5IGxvYWRlcnMgYWN0IGxpa2Ugd2hlbiBhIHByb2dyYW0gaXMgcnVuLCBhbmQgY2FsbAotdGhlIHJ1bnRpbWUgbG9hZGVyIGRpcmVjdGx5LgotCi1UaGUgXGNvZGV7Y3R5cGVzLnV0aWx9IG1vZHVsZSBwcm92aWRlcyBhIGZ1bmN0aW9uIHdoaWNoIGNhbiBoZWxwIHRvCi1kZXRlcm1pbmUgdGhlIGxpYnJhcnkgdG8gbG9hZC4KLQotXGJlZ2lue2RhdGFkZXNjbml9e2ZpbmRfbGlicmFyeShuYW1lKX0KLVRyeSB0byBmaW5kIGEgbGlicmFyeSBhbmQgcmV0dXJuIGEgcGF0aG5hbWUuICBcdmFye25hbWV9IGlzIHRoZQotbGlicmFyeSBuYW1lIHdpdGhvdXQgYW55IHByZWZpeCBsaWtlIFx2YXJ7bGlifSwgc3VmZml4IGxpa2UgXGNvZGV7LnNvfSwKLVxjb2Rley5keWxpYn0gb3IgdmVyc2lvbiBudW1iZXIgKHRoaXMgaXMgdGhlIGZvcm0gdXNlZCBmb3IgdGhlIHBvc2l4Ci1saW5rZXIgb3B0aW9uIFxwcm9ncmFtb3B0ey1sfSkuICBJZiBubyBsaWJyYXJ5IGNhbiBiZSBmb3VuZCwgcmV0dXJucwotXGNvZGV7Tm9uZX0uCi1cZW5ke2RhdGFkZXNjbml9Ci0KLVRoZSBleGFjdCBmdW5jdGlvbmFsaXR5IGlzIHN5c3RlbSBkZXBlbmRlbmQuCi0KLU9uIExpbnV4LCBcY29kZXtmaW5ke1xffWxpYnJhcnl9IHRyaWVzIHRvIHJ1biBleHRlcm5hbCBwcm9ncmFtcwotKC9zYmluL2xkY29uZmlnLCBnY2MsIGFuZCBvYmpkdW1wKSB0byBmaW5kIHRoZSBsaWJyYXJ5IGZpbGUuICBJdAotcmV0dXJucyB0aGUgZmlsZW5hbWUgb2YgdGhlIGxpYnJhcnkgZmlsZS4gIEhlcmUgYXJlIHNvbmUgZXhhbXBsZXM6Ci1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZnJvbSBjdHlwZXMudXRpbCBpbXBvcnQgZmluZF9saWJyYXJ5Ci0+Pj4gZmluZF9saWJyYXJ5KCJtIikKLSdsaWJtLnNvLjYnCi0+Pj4gZmluZF9saWJyYXJ5KCJjIikKLSdsaWJjLnNvLjYnCi0+Pj4gZmluZF9saWJyYXJ5KCJiejIiKQotJ2xpYmJ6Mi5zby4xLjAnCi0+Pj4KLVxlbmR7dmVyYmF0aW19Ci0KLU9uIE9TIFgsIFxjb2Rle2ZpbmR7XF99bGlicmFyeX0gdHJpZXMgc2V2ZXJhbCBwcmVkZWZpbmVkIG5hbWluZyBzY2hlbWVzIGFuZAotcGF0aHMgdG8gbG9jYXRlIHRoZSBsaWJyYXJ5LCBhbmQgcmV0dXJucyBhIGZ1bGwgcGF0aG5hbWUgaWYgc3VjY2Vzc2Z1bGw6Ci1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZnJvbSBjdHlwZXMudXRpbCBpbXBvcnQgZmluZF9saWJyYXJ5Ci0+Pj4gZmluZF9saWJyYXJ5KCJjIikKLScvdXNyL2xpYi9saWJjLmR5bGliJwotPj4+IGZpbmRfbGlicmFyeSgibSIpCi0nL3Vzci9saWIvbGlibS5keWxpYicKLT4+PiBmaW5kX2xpYnJhcnkoImJ6MiIpCi0nL3Vzci9saWIvbGliYnoyLmR5bGliJwotPj4+IGZpbmRfbGlicmFyeSgiQUdMIikKLScvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9BR0wuZnJhbWV3b3JrL0FHTCcKLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotT24gV2luZG93cywgXGNvZGV7ZmluZHtcX31saWJyYXJ5fSBzZWFyY2hlcyBhbG9uZyB0aGUgc3lzdGVtIHNlYXJjaCBwYXRoLAotYW5kIHJldHVybnMgdGhlIGZ1bGwgcGF0aG5hbWUsIGJ1dCBzaW5jZSB0aGVyZSBpcyBubyBwcmVkZWZpbmVkIG5hbWluZwotc2NoZW1lIGEgY2FsbCBsaWtlIFxjb2Rle2ZpbmR7XF99bGlicmFyeSgiYyIpfSB3aWxsIGZhaWwgYW5kIHJldHVybgotXGNvZGV7Tm9uZX0uCi0KLUlmIHdyYXBwaW5nIGEgc2hhcmVkIGxpYnJhcnkgd2l0aCBcY29kZXtjdHlwZXN9LCBpdCBcZW1waHttYXl9IGJlIGJldHRlciB0bwotZGV0ZXJtaW5lIHRoZSBzaGFyZWQgbGlicmFyeSBuYW1lIGF0IGRldmVsb3BtZW50IHR5cGUsIGFuZCBoYXJkY29kZQotdGhhdCBpbnRvIHRoZSB3cmFwcGVyIG1vZHVsZSBpbnN0ZWFkIG9mIHVzaW5nIFxjb2Rle2ZpbmR7XF99bGlicmFyeX0gdG8KLWxvY2F0ZSB0aGUgbGlicmFyeSBhdCBydW50aW1lLgotCi0KLVxzdWJzdWJzZWN0aW9ue0xvYWRpbmcgc2hhcmVkIGxpYnJhcmllc1xsYWJlbHtjdHlwZXMtbG9hZGluZy1zaGFyZWQtbGlicmFyaWVzfX0KLQotVGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byBsb2FkZWQgc2hhcmVkIGxpYnJhcmllcyBpbnRvIHRoZSBQeXRob24KLXByb2Nlc3MuICBPbmUgd2F5IGlzIHRvIGluc3RhbnRpYXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNsYXNzZXM6Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0NETEx9e25hbWUsIG1vZGU9REVGQVVMVF9NT0RFLCBoYW5kbGU9Tm9uZX0KLUluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBsb2FkZWQgc2hhcmVkIGxpYnJhcmllcy4KLUZ1bmN0aW9ucyBpbiB0aGVzZSBsaWJyYXJpZXMgdXNlIHRoZSBzdGFuZGFyZCBDIGNhbGxpbmcKLWNvbnZlbnRpb24sIGFuZCBhcmUgYXNzdW1lZCB0byByZXR1cm4gXGNvZGV7aW50fS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtPbGVETEx9e25hbWUsIG1vZGU9REVGQVVMVF9NT0RFLCBoYW5kbGU9Tm9uZX0KLVdpbmRvd3Mgb25seTogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGxvYWRlZCBzaGFyZWQKLWxpYnJhcmllcywgZnVuY3Rpb25zIGluIHRoZXNlIGxpYnJhcmllcyB1c2UgdGhlIFxjb2Rle3N0ZGNhbGx9Ci1jYWxsaW5nIGNvbnZlbnRpb24sIGFuZCBhcmUgYXNzdW1lZCB0byByZXR1cm4gdGhlIHdpbmRvd3Mgc3BlY2lmaWMKLVxjbGFzc3tIUkVTVUxUfSBjb2RlLiAgXGNsYXNze0hSRVNVTFR9IHZhbHVlcyBjb250YWluIGluZm9ybWF0aW9uCi1zcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGNhbGwgZmFpbGVkIG9yIHN1Y2NlZWRlZCwgdG9nZXRoZXIKLXdpdGggYWRkaXRpb25hbCBlcnJvciBjb2RlLiAgSWYgdGhlIHJldHVybiB2YWx1ZSBzaWduYWxzIGEKLWZhaWx1cmUsIGFuIFxjbGFzc3tXaW5kb3dzRXJyb3J9IGlzIGF1dG9tYXRpY2FsbHkgcmFpc2VkLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1dpbkRMTH17bmFtZSwgbW9kZT1ERUZBVUxUX01PREUsIGhhbmRsZT1Ob25lfQotV2luZG93cyBvbmx5OiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgbG9hZGVkIHNoYXJlZAotbGlicmFyaWVzLCBmdW5jdGlvbnMgaW4gdGhlc2UgbGlicmFyaWVzIHVzZSB0aGUgXGNvZGV7c3RkY2FsbH0KLWNhbGxpbmcgY29udmVudGlvbiwgYW5kIGFyZSBhc3N1bWVkIHRvIHJldHVybiBcY29kZXtpbnR9IGJ5IGRlZmF1bHQuCi0KLU9uIFdpbmRvd3MgQ0Ugb25seSB0aGUgc3RhbmRhcmQgY2FsbGluZyBjb252ZW50aW9uIGlzIHVzZWQsIGZvcgotY29udmVuaWVuY2UgdGhlIFxjbGFzc3tXaW5ETEx9IGFuZCBcY2xhc3N7T2xlRExMfSB1c2UgdGhlIHN0YW5kYXJkIGNhbGxpbmcKLWNvbnZlbnRpb24gb24gdGhpcyBwbGF0Zm9ybS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1UaGUgUHl0aG9uIEdJTCBpcyByZWxlYXNlZCBiZWZvcmUgY2FsbGluZyBhbnkgZnVuY3Rpb24gZXhwb3J0ZWQgYnkKLXRoZXNlIGxpYnJhcmllcywgYW5kIHJlYXF1aXJlZCBhZnRlcndhcmRzLgotCi1cYmVnaW57Y2xhc3NkZXNjfXtQeURMTH17bmFtZSwgbW9kZT1ERUZBVUxUX01PREUsIGhhbmRsZT1Ob25lfQotSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYmVoYXZlIGxpa2UgXGNsYXNze0NETEx9IGluc3RhbmNlcywgZXhjZXB0Ci10aGF0IHRoZSBQeXRob24gR0lMIGlzIFxlbXBoe25vdH0gcmVsZWFzZWQgZHVyaW5nIHRoZSBmdW5jdGlvbiBjYWxsLAotYW5kIGFmdGVyIHRoZSBmdW5jdGlvbiBleGVjdXRpb24gdGhlIFB5dGhvbiBlcnJvciBmbGFnIGlzIGNoZWNrZWQuCi1JZiB0aGUgZXJyb3IgZmxhZyBpcyBzZXQsIGEgUHl0aG9uIGV4Y2VwdGlvbiBpcyByYWlzZWQuCi0KLVRodXMsIHRoaXMgaXMgb25seSB1c2VmdWwgdG8gY2FsbCBQeXRob24gQyBhcGkgZnVuY3Rpb25zIGRpcmVjdGx5LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLUFsbCB0aGVzZSBjbGFzc2VzIGNhbiBiZSBpbnN0YW50aWF0ZWQgYnkgY2FsbGluZyB0aGVtIHdpdGggYXQgbGVhc3QKLW9uZSBhcmd1bWVudCwgdGhlIHBhdGhuYW1lIG9mIHRoZSBzaGFyZWQgbGlicmFyeS4gIElmIHlvdSBoYXZlIGFuCi1leGlzdGluZyBoYW5kbGUgdG8gYW4gYWxyZWFkeSBsb2FkZWQgc2hhcmQgbGlicmFyeSwgaXQgY2FuIGJlIHBhc3NlZAotYXMgdGhlIFxjb2Rle2hhbmRsZX0gbmFtZWQgcGFyYW1ldGVyLCBvdGhlcndpc2UgdGhlIHVuZGVybHlpbmcgcGxhdGZvcm1zCi1cY29kZXtkbG9wZW59IG9yIFxtZXRob2R7TG9hZExpYnJhcnl9IGZ1bmN0aW9uIGlzIHVzZWQgdG8gbG9hZCB0aGUgbGlicmFyeQotaW50byB0aGUgcHJvY2VzcywgYW5kIHRvIGdldCBhIGhhbmRsZSB0byBpdC4KLQotVGhlIFx2YXJ7bW9kZX0gcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgaG93IHRoZSBsaWJyYXJ5IGlzCi1sb2FkZWQuICBGb3IgZGV0YWlscywgY29uc3VsdCB0aGUgXGNvZGV7ZGxvcGVuKDMpfSBtYW5wYWdlLCBvbiBXaW5kb3dzLAotXHZhcnttb2RlfSBpcyBpZ25vcmVkLgotCi1cYmVnaW57ZGF0YWRlc2NuaX17UlRMRF9HTE9CQUx9Ci1GbGFnIHRvIHVzZSBhcyBcdmFye21vZGV9IHBhcmFtZXRlci4gIE9uIHBsYXRmb3JtcyB3aGVyZSB0aGlzIGZsYWcKLWlzIG5vdCBhdmFpbGFibGUsIGl0IGlzIGRlZmluZWQgYXMgdGhlIGludGVnZXIgemVyby4KLVxlbmR7ZGF0YWRlc2NuaX0KLQotXGJlZ2lue2RhdGFkZXNjbml9e1JUTERfTE9DQUx9Ci1GbGFnIHRvIHVzZSBhcyBcdmFye21vZGV9IHBhcmFtZXRlci4gIE9uIHBsYXRmb3JtcyB3aGVyZSB0aGlzIGlzIG5vdAotYXZhaWxhYmxlLCBpdCBpcyB0aGUgc2FtZSBhcyBcdmFye1JUTER7XF99R0xPQkFMfS4KLVxlbmR7ZGF0YWRlc2NuaX0KLQotXGJlZ2lue2RhdGFkZXNjbml9e0RFRkFVTFRfTU9ERX0KLVRoZSBkZWZhdWx0IG1vZGUgd2hpY2ggaXMgdXNlZCB0byBsb2FkIHNoYXJlZCBsaWJyYXJpZXMuICBPbiBPU1gKLTEwLjMsIHRoaXMgaXMgXHZhcntSVExEe1xffUdMT0JBTH0sIG90aGVyd2lzZSBpdCBpcyB0aGUgc2FtZSBhcwotXHZhcntSVExEe1xffUxPQ0FMfS4KLVxlbmR7ZGF0YWRlc2NuaX0KLQotSW5zdGFuY2VzIG9mIHRoZXNlIGNsYXNzZXMgaGF2ZSBubyBwdWJsaWMgbWV0aG9kcywgaG93ZXZlcgotXG1ldGhvZHt7XF99e1xffWdldGF0dHJ7XF99e1xffX0gYW5kIFxtZXRob2R7e1xffXtcX31nZXRpdGVte1xffXtcX319IGhhdmUgc3BlY2lhbCBiZWhhdmlvdXI6IGZ1bmN0aW9ucwotZXhwb3J0ZWQgYnkgdGhlIHNoYXJlZCBsaWJyYXJ5IGNhbiBiZSBhY2Nlc3NlZCBhcyBhdHRyaWJ1dGVzIG9mIGJ5Ci1pbmRleC4gIFBsZWFzZSBub3RlIHRoYXQgYm90aCBcbWV0aG9ke3tcX317XF99Z2V0YXR0cntcX317XF99fSBhbmQgXG1ldGhvZHt7XF99e1xffWdldGl0ZW17XF99e1xffX0KLWNhY2hlIHRoZWlyIHJlc3VsdCwgc28gY2FsbGluZyB0aGVtIHJlcGVhdGVkbHkgcmV0dXJucyB0aGUgc2FtZSBvYmplY3QKLWVhY2ggdGltZS4KLQotVGhlIGZvbGxvd2luZyBwdWJsaWMgYXR0cmlidXRlcyBhcmUgYXZhaWxhYmxlLCB0aGVpciBuYW1lIHN0YXJ0cyB3aXRoCi1hbiB1bmRlcnNjb3JlIHRvIG5vdCBjbGFzaCB3aXRoIGV4cG9ydGVkIGZ1bmN0aW9uIG5hbWVzOgotCi1cYmVnaW57bWVtYmVyZGVzY317X2hhbmRsZX0KLVRoZSBzeXN0ZW0gaGFuZGxlIHVzZWQgdG8gYWNjZXNzIHRoZSBsaWJyYXJ5LgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY317X25hbWV9Ci1UaGUgbmFtZSBvZiB0aGUgbGlicmFyeSBwYXNzZWQgaW4gdGhlIGNvbnRydWN0b3IuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVNoYXJlZCBsaWJyYXJpZXMgY2FuIGFsc28gYmUgbG9hZGVkIGJ5IHVzaW5nIG9uZSBvZiB0aGUgcHJlZmFicmljYXRlZAotb2JqZWN0cywgd2hpY2ggYXJlIGluc3RhbmNlcyBvZiB0aGUgXGNsYXNze0xpYnJhcnlMb2FkZXJ9IGNsYXNzLCBlaXRoZXIgYnkKLWNhbGxpbmcgdGhlIFxtZXRob2R7TG9hZExpYnJhcnl9IG1ldGhvZCwgb3IgYnkgcmV0cmlldmluZyB0aGUgbGlicmFyeSBhcwotYXR0cmlidXRlIG9mIHRoZSBsb2FkZXIgaW5zdGFuY2UuCi0KLVxiZWdpbntjbGFzc2Rlc2N9e0xpYnJhcnlMb2FkZXJ9e2RsbHR5cGV9Ci1DbGFzcyB3aGljaCBsb2FkcyBzaGFyZWQgbGlicmFyaWVzLiAgXGNvZGV7ZGxsdHlwZX0gc2hvdWxkIGJlIG9uZQotb2YgdGhlIFxjbGFzc3tDRExMfSwgXGNsYXNze1B5RExMfSwgXGNsYXNze1dpbkRMTH0sIG9yIFxjbGFzc3tPbGVETEx9IHR5cGVzLgotCi1cbWV0aG9ke3tcX317XF99Z2V0YXR0cntcX317XF99fSBoYXMgc3BlY2lhbCBiZWhhdmlvdXI6IEl0IGFsbG93cyB0byBsb2FkIGEgc2hhcmVkCi1saWJyYXJ5IGJ5IGFjY2Vzc2luZyBpdCBhcyBhdHRyaWJ1dGUgb2YgYSBsaWJyYXJ5IGxvYWRlcgotaW5zdGFuY2UuICBUaGUgcmVzdWx0IGlzIGNhY2hlZCwgc28gcmVwZWF0ZWQgYXR0cmlidXRlIGFjY2Vzc2VzCi1yZXR1cm4gdGhlIHNhbWUgbGlicmFyeSBlYWNoIHRpbWUuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e0xvYWRMaWJyYXJ5fXtuYW1lfQotTG9hZCBhIHNoYXJlZCBsaWJyYXJ5IGludG8gdGhlIHByb2Nlc3MgYW5kIHJldHVybiBpdC4gIFRoaXMgbWV0aG9kCi1hbHdheXMgcmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgbGlicmFyeS4KLVxlbmR7bWV0aG9kZGVzY30KLQotVGhlc2UgcHJlZmFicmljYXRlZCBsaWJyYXJ5IGxvYWRlcnMgYXJlIGF2YWlsYWJsZToKLQotXGJlZ2lue2RhdGFkZXNjbml9e2NkbGx9Ci1DcmVhdGVzIFxjbGFzc3tDRExMfSBpbnN0YW5jZXMuCi1cZW5ke2RhdGFkZXNjbml9Ci0KLVxiZWdpbntkYXRhZGVzY25pfXt3aW5kbGx9Ci1XaW5kb3dzIG9ubHk6IENyZWF0ZXMgXGNsYXNze1dpbkRMTH0gaW5zdGFuY2VzLgotXGVuZHtkYXRhZGVzY25pfQotCi1cYmVnaW57ZGF0YWRlc2NuaX17b2xlZGxsfQotV2luZG93cyBvbmx5OiBDcmVhdGVzIFxjbGFzc3tPbGVETEx9IGluc3RhbmNlcy4KLVxlbmR7ZGF0YWRlc2NuaX0KLQotXGJlZ2lue2RhdGFkZXNjbml9e3B5ZGxsfQotQ3JlYXRlcyBcY2xhc3N7UHlETEx9IGluc3RhbmNlcy4KLVxlbmR7ZGF0YWRlc2NuaX0KLQotRm9yIGFjY2Vzc2luZyB0aGUgQyBQeXRob24gYXBpIGRpcmVjdGx5LCBhIHJlYWR5LXRvLXVzZSBQeXRob24gc2hhcmVkCi1saWJyYXJ5IG9iamVjdCBpcyBhdmFpbGFibGU6Ci0KLVxiZWdpbntkYXRhZGVzY25pfXtweXRob25hcGl9Ci1BbiBpbnN0YW5jZSBvZiBcY2xhc3N7UHlETEx9IHRoYXQgZXhwb3NlcyBQeXRob24gQyBhcGkgZnVuY3Rpb25zIGFzCi1hdHRyaWJ1dGVzLiAgTm90ZSB0aGF0IGFsbCB0aGVzZSBmdW5jdGlvbnMgYXJlIGFzc3VtZWQgdG8gcmV0dXJuIEMKLVxjb2Rle2ludH0sIHdoaWNoIGlzIG9mIGNvdXJzZSBub3QgYWx3YXlzIHRoZSB0cnV0aCwgc28geW91IGhhdmUgdG8KLWFzc2lnbiB0aGUgY29ycmVjdCBcbWVtYmVye3Jlc3R5cGV9IGF0dHJpYnV0ZSB0byB1c2UgdGhlc2UgZnVuY3Rpb25zLgotXGVuZHtkYXRhZGVzY25pfQotCi0KLVxzdWJzdWJzZWN0aW9ue0ZvcmVpZ24gZnVuY3Rpb25zXGxhYmVse2N0eXBlcy1mb3JlaWduLWZ1bmN0aW9uc319Ci0KLUFzIGV4cGxhaW5lZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiwgZm9yZWlnbiBmdW5jdGlvbnMgY2FuIGJlCi1hY2Nlc3NlZCBhcyBhdHRyaWJ1dGVzIG9mIGxvYWRlZCBzaGFyZWQgbGlicmFyaWVzLiAgVGhlIGZ1bmN0aW9uCi1vYmplY3RzIGNyZWF0ZWQgaW4gdGhpcyB3YXkgYnkgZGVmYXVsdCBhY2NlcHQgYW55IG51bWJlciBvZiBhcmd1bWVudHMsCi1hY2NlcHQgYW55IGN0eXBlcyBkYXRhIGluc3RhbmNlcyBhcyBhcmd1bWVudHMsIGFuZCByZXR1cm4gdGhlIGRlZmF1bHQKLXJlc3VsdCB0eXBlIHNwZWNpZmllZCBieSB0aGUgbGlicmFyeSBsb2FkZXIuICBUaGV5IGFyZSBpbnN0YW5jZXMgb2YgYQotcHJpdmF0ZSBjbGFzczoKLQotXGJlZ2lue2NsYXNzZGVzYyp9e19GdW5jUHRyfQotQmFzZSBjbGFzcyBmb3IgQyBjYWxsYWJsZSBmb3JlaWduIGZ1bmN0aW9ucy4KLVxlbmR7Y2xhc3NkZXNjKn0KLQotSW5zdGFuY2VzIG9mIGZvcmVpZ24gZnVuY3Rpb25zIGFyZSBhbHNvIEMgY29tcGF0aWJsZSBkYXRhIHR5cGVzOyB0aGV5Ci1yZXByZXNlbnQgQyBmdW5jdGlvbiBwb2ludGVycy4KLQotVGhpcyBiZWhhdmlvdXIgY2FuIGJlIGN1c3RvbWl6ZWQgYnkgYXNzaWduaW5nIHRvIHNwZWNpYWwgYXR0cmlidXRlcyBvZgotdGhlIGZvcmVpZ24gZnVuY3Rpb24gb2JqZWN0LgotCi1cYmVnaW57bWVtYmVyZGVzY317cmVzdHlwZX0KLUFzc2lnbiBhIGN0eXBlcyB0eXBlIHRvIHNwZWNpZnkgdGhlIHJlc3VsdCB0eXBlIG9mIHRoZSBmb3JlaWduCi1mdW5jdGlvbi4gIFVzZSBcY29kZXtOb25lfSBmb3IgXGNvZGV7dm9pZH0gYSBmdW5jdGlvbiBub3QgcmV0dXJuaW5nCi1hbnl0aGluZy4KLQotSXQgaXMgcG9zc2libGUgdG8gYXNzaWduIGEgY2FsbGFibGUgUHl0aG9uIG9iamVjdCB0aGF0IGlzIG5vdCBhCi1jdHlwZXMgdHlwZSwgaW4gdGhpcyBjYXNlIHRoZSBmdW5jdGlvbiBpcyBhc3N1bWVkIHRvIHJldHVybiBhCi1DIFxjb2Rle2ludH0sIGFuZCB0aGUgY2FsbGFibGUgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGlzIGludGVnZXIsCi1hbGxvd2luZyB0byBkbyBmdXJ0aGVyIHByb2Nlc3Npbmcgb3IgZXJyb3IgY2hlY2tpbmcuICBVc2luZyB0aGlzCi1pcyBkZXByZWNhdGVkLCBmb3IgbW9yZSBmbGV4aWJsZSBwb3N0cHJvY2Vzc2luZyBvciBlcnJvciBjaGVja2luZwotdXNlIGEgY3R5cGVzIGRhdGEgdHlwZSBhcyBcbWVtYmVye3Jlc3R5cGV9IGFuZCBhc3NpZ24gYSBjYWxsYWJsZSB0byB0aGUKLVxtZW1iZXJ7ZXJyY2hlY2t9IGF0dHJpYnV0ZS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9e2FyZ3R5cGVzfQotQXNzaWduIGEgdHVwbGUgb2YgY3R5cGVzIHR5cGVzIHRvIHNwZWNpZnkgdGhlIGFyZ3VtZW50IHR5cGVzIHRoYXQKLXRoZSBmdW5jdGlvbiBhY2NlcHRzLiAgRnVuY3Rpb25zIHVzaW5nIHRoZSBcY29kZXtzdGRjYWxsfSBjYWxsaW5nCi1jb252ZW50aW9uIGNhbiBvbmx5IGJlIGNhbGxlZCB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBhcmd1bWVudHMgYXMKLXRoZSBsZW5ndGggb2YgdGhpcyB0dXBsZTsgZnVuY3Rpb25zIHVzaW5nIHRoZSBDIGNhbGxpbmcgY29udmVudGlvbgotYWNjZXB0IGFkZGl0aW9uYWwsIHVuc3BlY2lmaWVkIGFyZ3VtZW50cyBhcyB3ZWxsLgotCi1XaGVuIGEgZm9yZWlnbiBmdW5jdGlvbiBpcyBjYWxsZWQsIGVhY2ggYWN0dWFsIGFyZ3VtZW50IGlzIHBhc3NlZAotdG8gdGhlIFxtZXRob2R7ZnJvbXtcX31wYXJhbX0gY2xhc3MgbWV0aG9kIG9mIHRoZSBpdGVtcyBpbiB0aGUKLVxtZW1iZXJ7YXJndHlwZXN9IHR1cGxlLCB0aGlzIG1ldGhvZCBhbGxvd3MgdG8gYWRhcHQgdGhlIGFjdHVhbAotYXJndW1lbnQgdG8gYW4gb2JqZWN0IHRoYXQgdGhlIGZvcmVpZ24gZnVuY3Rpb24gYWNjZXB0cy4gIEZvcgotZXhhbXBsZSwgYSBcY2xhc3N7Y3tcX31jaGFye1xffXB9IGl0ZW0gaW4gdGhlIFxtZW1iZXJ7YXJndHlwZXN9IHR1cGxlIHdpbGwKLWNvbnZlcnQgYSB1bmljb2RlIHN0cmluZyBwYXNzZWQgYXMgYXJndW1lbnQgaW50byBhbiBieXRlIHN0cmluZwotdXNpbmcgY3R5cGVzIGNvbnZlcnNpb24gcnVsZXMuCi0KLU5ldzogSXQgaXMgbm93IHBvc3NpYmxlIHRvIHB1dCBpdGVtcyBpbiBhcmd0eXBlcyB3aGljaCBhcmUgbm90Ci1jdHlwZXMgdHlwZXMsIGJ1dCBlYWNoIGl0ZW0gbXVzdCBoYXZlIGEgXG1ldGhvZHtmcm9te1xffXBhcmFtfSBtZXRob2QKLXdoaWNoIHJldHVybnMgYSB2YWx1ZSB1c2FibGUgYXMgYXJndW1lbnQgKGludGVnZXIsIHN0cmluZywgY3R5cGVzCi1pbnN0YW5jZSkuICBUaGlzIGFsbG93cyB0byBkZWZpbmUgYWRhcHRlcnMgdGhhdCBjYW4gYWRhcHQgY3VzdG9tCi1vYmplY3RzIGFzIGZ1bmN0aW9uIHBhcmFtZXRlcnMuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXtlcnJjaGVja30KLUFzc2lnbiBhIFB5dGhvbiBmdW5jdGlvbiBvciBhbm90aGVyIGNhbGxhYmxlIHRvIHRoaXMgYXR0cmlidXRlLgotVGhlIGNhbGxhYmxlIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhyZWUgb3IgbW9yZSBhcmd1bWVudHM6Ci1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY25pfXtjYWxsYWJsZX17cmVzdWx0LCBmdW5jLCBhcmd1bWVudHN9Ci1cY29kZXtyZXN1bHR9IGlzIHdoYXQgdGhlIGZvcmVpZ24gZnVuY3Rpb24gcmV0dXJucywgYXMgc3BlY2lmaWVkIGJ5IHRoZQotXG1lbWJlcntyZXN0eXBlfSBhdHRyaWJ1dGUuCi0KLVxjb2Rle2Z1bmN9IGlzIHRoZSBmb3JlaWduIGZ1bmN0aW9uIG9iamVjdCBpdHNlbGYsIHRoaXMgYWxsb3dzIHRvCi1yZXVzZSB0aGUgc2FtZSBjYWxsYWJsZSBvYmplY3QgdG8gY2hlY2sgb3IgcG9zdHByb2Nlc3MgdGhlIHJlc3VsdHMKLW9mIHNldmVyYWwgZnVuY3Rpb25zLgotCi1cY29kZXthcmd1bWVudHN9IGlzIGEgdHVwbGUgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBvcmlnaW5hbGx5Ci1wYXNzZWQgdG8gdGhlIGZ1bmN0aW9uIGNhbGwsIHRoaXMgYWxsb3dzIHRvIHNwZWNpYWxpemUgdGhlCi1iZWhhdmlvdXIgb24gdGhlIGFyZ3VtZW50cyB1c2VkLgotCi1UaGUgb2JqZWN0IHRoYXQgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHdpbGwgYmUgcmV0dXJuZWQgZnJvbSB0aGUKLWZvcmVpZ24gZnVuY3Rpb24gY2FsbCwgYnV0IGl0IGNhbiBhbHNvIGNoZWNrIHRoZSByZXN1bHQgdmFsdWUgYW5kCi1yYWlzZSBhbiBleGNlcHRpb24gaWYgdGhlIGZvcmVpZ24gZnVuY3Rpb24gY2FsbCBmYWlsZWQuCi1cZW5ke2Z1bmNkZXNjbml9Ci0KLVxiZWdpbntleGNkZXNjfXtBcmd1bWVudEVycm9yKCl9Ci1UaGlzIGV4Y2VwdGlvbiBpcyByYWlzZWQgd2hlbiBhIGZvcmVpZ24gZnVuY3Rpb24gY2FsbCBjYW5ub3QKLWNvbnZlcnQgb25lIG9mIHRoZSBwYXNzZWQgYXJndW1lbnRzLgotXGVuZHtleGNkZXNjfQotCi0KLVxzdWJzdWJzZWN0aW9ue0Z1bmN0aW9uIHByb3RvdHlwZXNcbGFiZWx7Y3R5cGVzLWZ1bmN0aW9uLXByb3RvdHlwZXN9fQotCi1Gb3JlaWduIGZ1bmN0aW9ucyBjYW4gYWxzbyBiZSBjcmVhdGVkIGJ5IGluc3RhbnRpYXRpbmcgZnVuY3Rpb24KLXByb3RvdHlwZXMuICBGdW5jdGlvbiBwcm90b3R5cGVzIGFyZSBzaW1pbGFyIHRvIGZ1bmN0aW9uIHByb3RvdHlwZXMgaW4KLUM7IHRoZXkgZGVzY3JpYmUgYSBmdW5jdGlvbiAocmV0dXJuIHR5cGUsIGFyZ3VtZW50IHR5cGVzLCBjYWxsaW5nCi1jb252ZW50aW9uKSB3aXRob3V0IGRlZmluaW5nIGFuIGltcGxlbWVudGF0aW9uLiAgVGhlIGZhY3RvcnkKLWZ1bmN0aW9ucyBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBkZXNpcmVkIHJlc3VsdCB0eXBlIGFuZCB0aGUgYXJndW1lbnQKLXR5cGVzIG9mIHRoZSBmdW5jdGlvbi4KLQotXGJlZ2lue2Z1bmNkZXNjfXtDRlVOQ1RZUEV9e3Jlc3R5cGUsICphcmd0eXBlc30KLVRoZSByZXR1cm5lZCBmdW5jdGlvbiBwcm90b3R5cGUgY3JlYXRlcyBmdW5jdGlvbnMgdGhhdCB1c2UgdGhlCi1zdGFuZGFyZCBDIGNhbGxpbmcgY29udmVudGlvbi4gIFRoZSBmdW5jdGlvbiB3aWxsIHJlbGVhc2UgdGhlIEdJTAotZHVyaW5nIHRoZSBjYWxsLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtXSU5GVU5DVFlQRX17cmVzdHlwZSwgKmFyZ3R5cGVzfQotV2luZG93cyBvbmx5OiBUaGUgcmV0dXJuZWQgZnVuY3Rpb24gcHJvdG90eXBlIGNyZWF0ZXMgZnVuY3Rpb25zCi10aGF0IHVzZSB0aGUgXGNvZGV7c3RkY2FsbH0gY2FsbGluZyBjb252ZW50aW9uLCBleGNlcHQgb24gV2luZG93cyBDRQotd2hlcmUgXGZ1bmN0aW9ue1dJTkZVTkNUWVBFfSBpcyB0aGUgc2FtZSBhcyBcZnVuY3Rpb257Q0ZVTkNUWVBFfS4gIFRoZSBmdW5jdGlvbgotd2lsbCByZWxlYXNlIHRoZSBHSUwgZHVyaW5nIHRoZSBjYWxsLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtQWUZVTkNUWVBFfXtyZXN0eXBlLCAqYXJndHlwZXN9Ci1UaGUgcmV0dXJuZWQgZnVuY3Rpb24gcHJvdG90eXBlIGNyZWF0ZXMgZnVuY3Rpb25zIHRoYXQgdXNlIHRoZQotUHl0aG9uIGNhbGxpbmcgY29udmVudGlvbi4gIFRoZSBmdW5jdGlvbiB3aWxsIFxlbXBoe25vdH0gcmVsZWFzZSB0aGUKLUdJTCBkdXJpbmcgdGhlIGNhbGwuCi1cZW5ke2Z1bmNkZXNjfQotCi1GdW5jdGlvbiBwcm90b3R5cGVzIGNyZWF0ZWQgYnkgdGhlIGZhY3RvcnkgZnVuY3Rpb25zIGNhbiBiZQotaW5zdGFudGlhdGVkIGluIGRpZmZlcmVudCB3YXlzLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgYW5kIG51bWJlciBvZgotdGhlIHBhcmFtZXRlcnMgaW4gdGhlIGNhbGwuCi0KLVxiZWdpbntmdW5jZGVzY25pfXtwcm90b3R5cGV9e2FkZHJlc3N9Ci1SZXR1cm5zIGEgZm9yZWlnbiBmdW5jdGlvbiBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuCi1cZW5ke2Z1bmNkZXNjbml9Ci0KLVxiZWdpbntmdW5jZGVzY25pfXtwcm90b3R5cGV9e2NhbGxhYmxlfQotQ3JlYXRlIGEgQyBjYWxsYWJsZSBmdW5jdGlvbiAoYSBjYWxsYmFjayBmdW5jdGlvbikgZnJvbSBhIFB5dGhvbgotXGNvZGV7Y2FsbGFibGV9LgotXGVuZHtmdW5jZGVzY25pfQotCi1cYmVnaW57ZnVuY2Rlc2NuaX17cHJvdG90eXBlfXtmdW5jX3NwZWNcb3B0aW9uYWx7LCBwYXJhbWZsYWdzfX0KLVJldHVybnMgYSBmb3JlaWduIGZ1bmN0aW9uIGV4cG9ydGVkIGJ5IGEgc2hhcmVkIGxpYnJhcnkuCi1cY29kZXtmdW5je1xffXNwZWN9IG11c3QgYmUgYSAyLXR1cGxlIFxjb2RleyhuYW1le1xffW9ye1xffW9yZGluYWwsIGxpYnJhcnkpfS4KLVRoZSBmaXJzdCBpdGVtIGlzIHRoZSBuYW1lIG9mIHRoZSBleHBvcnRlZCBmdW5jdGlvbiBhcyBzdHJpbmcsIG9yCi10aGUgb3JkaW5hbCBvZiB0aGUgZXhwb3J0ZWQgZnVuY3Rpb24gYXMgc21hbGwgaW50ZWdlci4gIFRoZSBzZWNvbmQKLWl0ZW0gaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IGluc3RhbmNlLgotXGVuZHtmdW5jZGVzY25pfQotCi1cYmVnaW57ZnVuY2Rlc2NuaX17cHJvdG90eXBlfXt2dGJsX2luZGV4LCBuYW1lXG9wdGlvbmFseywgcGFyYW1mbGFnc1xvcHRpb25hbHssIGlpZH19fQotUmV0dXJucyBhIGZvcmVpZ24gZnVuY3Rpb24gdGhhdCB3aWxsIGNhbGwgYSBDT00gbWV0aG9kLgotXGNvZGV7dnRibHtcX31pbmRleH0gaXMgdGhlIGluZGV4IGludG8gdGhlIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUsIGEKLXNtYWxsIG5vbm5lZ2F0aXZlIGludGVnZXIuIFx2YXJ7bmFtZX0gaXMgbmFtZSBvZiB0aGUgQ09NIG1ldGhvZC4KLVx2YXJ7aWlkfSBpcyBhbiBvcHRpb25hbCBwb2ludGVyIHRvIHRoZSBpbnRlcmZhY2UgaWRlbnRpZmllciB3aGljaAotaXMgdXNlZCBpbiBleHRlbmRlZCBlcnJvciByZXBvcnRpbmcuCi0KLUNPTSBtZXRob2RzIHVzZSBhIHNwZWNpYWwgY2FsbGluZyBjb252ZW50aW9uOiBUaGV5IHJlcXVpcmUgYQotcG9pbnRlciB0byB0aGUgQ09NIGludGVyZmFjZSBhcyBmaXJzdCBhcmd1bWVudCwgaW4gYWRkaXRpb24gdG8KLXRob3NlIHBhcmFtZXRlcnMgdGhhdCBhcmUgc3BlY2lmaWVkIGluIHRoZSBcbWVtYmVye2FyZ3R5cGVzfSB0dXBsZS4KLVxlbmR7ZnVuY2Rlc2NuaX0KLQotVGhlIG9wdGlvbmFsIFx2YXJ7cGFyYW1mbGFnc30gcGFyYW1ldGVyIGNyZWF0ZXMgZm9yZWlnbiBmdW5jdGlvbgotd3JhcHBlcnMgd2l0aCBtdWNoIG1vcmUgZnVuY3Rpb25hbGl0eSB0aGFuIHRoZSBmZWF0dXJlcyBkZXNjcmliZWQKLWFib3ZlLgotCi1cdmFye3BhcmFtZmxhZ3N9IG11c3QgYmUgYSB0dXBsZSBvZiB0aGUgc2FtZSBsZW5ndGggYXMgXG1lbWJlcnthcmd0eXBlc30uCi0KLUVhY2ggaXRlbSBpbiB0aGlzIHR1cGxlIGNvbnRhaW5zIGZ1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgYQotcGFyYW1ldGVyLCBpdCBtdXN0IGJlIGEgdHVwbGUgY29udGFpbmluZyAxLCAyLCBvciAzIGl0ZW1zLgotCi1UaGUgZmlyc3QgaXRlbSBpcyBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgZmxhZ3MgZm9yIHRoZSBwYXJhbWV0ZXI6Ci0KLVxiZWdpbntkYXRhZGVzY25pfXsxfQotU3BlY2lmaWVzIGFuIGlucHV0IHBhcmFtZXRlciB0byB0aGUgZnVuY3Rpb24uCi1cZW5ke2RhdGFkZXNjbml9Ci0KLVxiZWdpbntkYXRhZGVzY25pfXsyfQotT3V0cHV0IHBhcmFtZXRlci4gIFRoZSBmb3JlaWduIGZ1bmN0aW9uIGZpbGxzIGluIGEgdmFsdWUuCi1cZW5ke2RhdGFkZXNjbml9Ci0KLVxiZWdpbntkYXRhZGVzY25pfXs0fQotSW5wdXQgcGFyYW1ldGVyIHdoaWNoIGRlZmF1bHRzIHRvIHRoZSBpbnRlZ2VyIHplcm8uCi1cZW5ke2RhdGFkZXNjbml9Ci0KLVRoZSBvcHRpb25hbCBzZWNvbmQgaXRlbSBpcyB0aGUgcGFyYW1ldGVyIG5hbWUgYXMgc3RyaW5nLiAgSWYgdGhpcyBpcwotc3BlY2lmaWVkLCB0aGUgZm9yZWlnbiBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIHdpdGggbmFtZWQgcGFyYW1ldGVycy4KLQotVGhlIG9wdGlvbmFsIHRoaXJkIGl0ZW0gaXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyLgotCi1UaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byB3cmFwIHRoZSBXaW5kb3dzIFxjb2Rle01lc3NhZ2VCb3hBfQotZnVuY3Rpb24gc28gdGhhdCBpdCBzdXBwb3J0cyBkZWZhdWx0IHBhcmFtZXRlcnMgYW5kIG5hbWVkIGFyZ3VtZW50cy4KLVRoZSBDIGRlY2xhcmF0aW9uIGZyb20gdGhlIHdpbmRvd3MgaGVhZGVyIGZpbGUgaXMgdGhpczoKLVxiZWdpbnt2ZXJiYXRpbX0KLVdJTlVTRVJBUEkgaW50IFdJTkFQSQotTWVzc2FnZUJveEEoCi0gICAgSFdORCBoV25kICwKLSAgICBMUENTVFIgbHBUZXh0LAotICAgIExQQ1NUUiBscENhcHRpb24sCi0gICAgVUlOVCB1VHlwZSk7Ci1cZW5ke3ZlcmJhdGltfQotCi1IZXJlIGlzIHRoZSB3cmFwcGluZyB3aXRoIFxjb2Rle2N0eXBlc306Ci1cYmVnaW57cXVvdGV9Ci1cYmVnaW57dmVyYmF0aW19Pj4+IGZyb20gY3R5cGVzIGltcG9ydCBjX2ludCwgV0lORlVOQ1RZUEUsIHdpbmRsbAotPj4+IGZyb20gY3R5cGVzLndpbnR5cGVzIGltcG9ydCBIV05ELCBMUENTVFIsIFVJTlQKLT4+PiBwcm90b3R5cGUgPSBXSU5GVU5DVFlQRShjX2ludCwgSFdORCwgTFBDU1RSLCBMUENTVFIsIFVJTlQpCi0+Pj4gcGFyYW1mbGFncyA9ICgxLCAiaHduZCIsIDApLCAoMSwgInRleHQiLCAiSGkiKSwgKDEsICJjYXB0aW9uIiwgTm9uZSksICgxLCAiZmxhZ3MiLCAwKQotPj4+IE1lc3NhZ2VCb3ggPSBwcm90b3R5cGUoKCJNZXNzYWdlQm94QSIsIHdpbmRsbC51c2VyMzIpLCBwYXJhbWZsYWdzKQotPj4+XGVuZHt2ZXJiYXRpbX0KLVxlbmR7cXVvdGV9Ci0KLVRoZSBNZXNzYWdlQm94IGZvcmVpZ24gZnVuY3Rpb24gY2FuIG5vdyBiZSBjYWxsZWQgaW4gdGhlc2Ugd2F5czoKLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBNZXNzYWdlQm94KCkKLT4+PiBNZXNzYWdlQm94KHRleHQ9IlNwYW0sIHNwYW0sIHNwYW0iKQotPj4+IE1lc3NhZ2VCb3goZmxhZ3M9MiwgdGV4dD0iZm9vIGJhciIpCi0+Pj4KLVxlbmR7dmVyYmF0aW19Ci0KLUEgc2Vjb25kIGV4YW1wbGUgZGVtb25zdHJhdGVzIG91dHB1dCBwYXJhbWV0ZXJzLiAgVGhlIHdpbjMyCi1cY29kZXtHZXRXaW5kb3dSZWN0fSBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIGRpbWVuc2lvbnMgb2YgYSBzcGVjaWZpZWQKLXdpbmRvdyBieSBjb3B5aW5nIHRoZW0gaW50byBcY29kZXtSRUNUfSBzdHJ1Y3R1cmUgdGhhdCB0aGUgY2FsbGVyIGhhcyB0bwotc3VwcGx5LiAgSGVyZSBpcyB0aGUgQyBkZWNsYXJhdGlvbjoKLVxiZWdpbnt2ZXJiYXRpbX0KLVdJTlVTRVJBUEkgQk9PTCBXSU5BUEkKLUdldFdpbmRvd1JlY3QoCi0gICAgIEhXTkQgaFduZCwKLSAgICAgTFBSRUNUIGxwUmVjdCk7Ci1cZW5ke3ZlcmJhdGltfQotCi1IZXJlIGlzIHRoZSB3cmFwcGluZyB3aXRoIFxjb2Rle2N0eXBlc306Ci1cYmVnaW57cXVvdGV9Ci1cYmVnaW57dmVyYmF0aW19Pj4+IGZyb20gY3R5cGVzIGltcG9ydCBQT0lOVEVSLCBXSU5GVU5DVFlQRSwgd2luZGxsLCBXaW5FcnJvcgotPj4+IGZyb20gY3R5cGVzLndpbnR5cGVzIGltcG9ydCBCT09MLCBIV05ELCBSRUNUCi0+Pj4gcHJvdG90eXBlID0gV0lORlVOQ1RZUEUoQk9PTCwgSFdORCwgUE9JTlRFUihSRUNUKSkKLT4+PiBwYXJhbWZsYWdzID0gKDEsICJod25kIiksICgyLCAibHByZWN0IikKLT4+PiBHZXRXaW5kb3dSZWN0ID0gcHJvdG90eXBlKCgiR2V0V2luZG93UmVjdCIsIHdpbmRsbC51c2VyMzIpLCBwYXJhbWZsYWdzKQotPj4+XGVuZHt2ZXJiYXRpbX0KLVxlbmR7cXVvdGV9Ci0KLUZ1bmN0aW9ucyB3aXRoIG91dHB1dCBwYXJhbWV0ZXJzIHdpbGwgYXV0b21hdGljYWxseSByZXR1cm4gdGhlIG91dHB1dAotcGFyYW1ldGVyIHZhbHVlIGlmIHRoZXJlIGlzIGEgc2luZ2xlIG9uZSwgb3IgYSB0dXBsZSBjb250YWluaW5nIHRoZQotb3V0cHV0IHBhcmFtZXRlciB2YWx1ZXMgd2hlbiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSwgc28gdGhlCi1HZXRXaW5kb3dSZWN0IGZ1bmN0aW9uIG5vdyByZXR1cm5zIGEgUkVDVCBpbnN0YW5jZSwgd2hlbiBjYWxsZWQuCi0KLU91dHB1dCBwYXJhbWV0ZXJzIGNhbiBiZSBjb21iaW5lZCB3aXRoIHRoZSBcbWVtYmVye2VycmNoZWNrfSBwcm90b2NvbCB0byBkbwotZnVydGhlciBvdXRwdXQgcHJvY2Vzc2luZyBhbmQgZXJyb3IgY2hlY2tpbmcuICBUaGUgd2luMzIKLVxjb2Rle0dldFdpbmRvd1JlY3R9IGFwaSBmdW5jdGlvbiByZXR1cm5zIGEgXGNvZGV7Qk9PTH0gdG8gc2lnbmFsIHN1Y2Nlc3Mgb3IKLWZhaWx1cmUsIHNvIHRoaXMgZnVuY3Rpb24gY291bGQgZG8gdGhlIGVycm9yIGNoZWNraW5nLCBhbmQgcmFpc2VzIGFuCi1leGNlcHRpb24gd2hlbiB0aGUgYXBpIGNhbGwgZmFpbGVkOgotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGRlZiBlcnJjaGVjayhyZXN1bHQsIGZ1bmMsIGFyZ3MpOgotLi4uICAgICBpZiBub3QgcmVzdWx0OgotLi4uICAgICAgICAgcmFpc2UgV2luRXJyb3IoKQotLi4uICAgICByZXR1cm4gYXJncwotPj4+IEdldFdpbmRvd1JlY3QuZXJyY2hlY2sgPSBlcnJjaGVjawotPj4+Ci1cZW5ke3ZlcmJhdGltfQotCi1JZiB0aGUgXG1lbWJlcntlcnJjaGVja30gZnVuY3Rpb24gcmV0dXJucyB0aGUgYXJndW1lbnQgdHVwbGUgaXQgcmVjZWl2ZXMKLXVuY2hhbmdlZCwgXGNvZGV7Y3R5cGVzfSBjb250aW51ZXMgdGhlIG5vcm1hbCBwcm9jZXNzaW5nIGl0IGRvZXMgb24gdGhlCi1vdXRwdXQgcGFyYW1ldGVycy4gIElmIHlvdSB3YW50IHRvIHJldHVybiBhIHR1cGxlIG9mIHdpbmRvdwotY29vcmRpbmF0ZXMgaW5zdGVhZCBvZiBhIFxjb2Rle1JFQ1R9IGluc3RhbmNlLCB5b3UgY2FuIHJldHJpZXZlIHRoZQotZmllbGRzIGluIHRoZSBmdW5jdGlvbiBhbmQgcmV0dXJuIHRoZW0gaW5zdGVhZCwgdGhlIG5vcm1hbCBwcm9jZXNzaW5nCi13aWxsIG5vIGxvbmdlciB0YWtlIHBsYWNlOgotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGRlZiBlcnJjaGVjayhyZXN1bHQsIGZ1bmMsIGFyZ3MpOgotLi4uICAgICBpZiBub3QgcmVzdWx0OgotLi4uICAgICAgICAgcmFpc2UgV2luRXJyb3IoKQotLi4uICAgICByYyA9IGFyZ3NbMV0KLS4uLiAgICAgcmV0dXJuIHJjLmxlZnQsIHJjLnRvcCwgcmMuYm90dG9tLCByYy5yaWdodAotPj4+Ci0+Pj4gR2V0V2luZG93UmVjdC5lcnJjaGVjayA9IGVycmNoZWNrCi0+Pj4KLVxlbmR7dmVyYmF0aW19Ci0KLQotXHN1YnN1YnNlY3Rpb257VXRpbGl0eSBmdW5jdGlvbnNcbGFiZWx7Y3R5cGVzLXV0aWxpdHktZnVuY3Rpb25zfX0KLQotXGJlZ2lue2Z1bmNkZXNjfXthZGRyZXNzb2Z9e29ian0KLVJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSBidWZmZXIgYXMgaW50ZWdlci4gIFxjb2Rle29ian0gbXVzdAotYmUgYW4gaW5zdGFuY2Ugb2YgYSBjdHlwZXMgdHlwZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317YWxpZ25tZW50fXtvYmpfb3JfdHlwZX0KLVJldHVybnMgdGhlIGFsaWdubWVudCByZXF1aXJlbWVudHMgb2YgYSBjdHlwZXMgdHlwZS4KLVxjb2Rle29iantcX31vcntcX310eXBlfSBtdXN0IGJlIGEgY3R5cGVzIHR5cGUgb3IgaW5zdGFuY2UuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2J5cmVmfXtvYmp9Ci1SZXR1cm5zIGEgbGlnaHQtd2VpZ2h0IHBvaW50ZXIgdG8gXGNvZGV7b2JqfSwgd2hpY2ggbXVzdCBiZSBhbgotaW5zdGFuY2Ugb2YgYSBjdHlwZXMgdHlwZS4gVGhlIHJldHVybmVkIG9iamVjdCBjYW4gb25seSBiZSB1c2VkIGFzCi1hIGZvcmVpZ24gZnVuY3Rpb24gY2FsbCBwYXJhbWV0ZXIuIEl0IGJlaGF2ZXMgc2ltaWxhciB0bwotXGNvZGV7cG9pbnRlcihvYmopfSwgYnV0IHRoZSBjb25zdHJ1Y3Rpb24gaXMgYSBsb3QgZmFzdGVyLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtjYXN0fXtvYmosIHR5cGV9Ci1UaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gdGhlIGNhc3Qgb3BlcmF0b3IgaW4gQy4gSXQgcmV0dXJucyBhCi1uZXcgaW5zdGFuY2Ugb2YgXGNvZGV7dHlwZX0gd2hpY2ggcG9pbnRzIHRvIHRoZSBzYW1lIG1lbW9yeSBibG9jayBhcwotXGNvZGV7b2JqfS4gXGNvZGV7dHlwZX0gbXVzdCBiZSBhIHBvaW50ZXIgdHlwZSwgYW5kIFxjb2Rle29ian0gbXVzdCBiZSBhbgotb2JqZWN0IHRoYXQgY2FuIGJlIGludGVycHJldGVkIGFzIGEgcG9pbnRlci4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y3JlYXRlX3N0cmluZ19idWZmZXJ9e2luaXRfb3Jfc2l6ZVxvcHRpb25hbHssIHNpemV9fQotVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgbXV0YWJsZSBjaGFyYWN0ZXIgYnVmZmVyLiBUaGUgcmV0dXJuZWQKLW9iamVjdCBpcyBhIGN0eXBlcyBhcnJheSBvZiBcY2xhc3N7Y3tcX31jaGFyfS4KLQotXGNvZGV7aW5pdHtcX31vcntcX31zaXplfSBtdXN0IGJlIGFuIGludGVnZXIgd2hpY2ggc3BlY2lmaWVzIHRoZSBzaXplIG9mCi10aGUgYXJyYXksIG9yIGEgc3RyaW5nIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBpbml0aWFsaXplIHRoZSBhcnJheQotaXRlbXMuCi0KLUlmIGEgc3RyaW5nIGlzIHNwZWNpZmllZCBhcyBmaXJzdCBhcmd1bWVudCwgdGhlIGJ1ZmZlciBpcyBtYWRlIG9uZQotaXRlbSBsYXJnZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgc28gdGhhdCB0aGUgbGFzdCBlbGVtZW50Ci1pbiB0aGUgYXJyYXkgaXMgYSBOVUwgdGVybWluYXRpb24gY2hhcmFjdGVyLiBBbiBpbnRlZ2VyIGNhbiBiZQotcGFzc2VkIGFzIHNlY29uZCBhcmd1bWVudCB3aGljaCBhbGxvd3MgdG8gc3BlY2lmeSB0aGUgc2l6ZSBvZiB0aGUKLWFycmF5IGlmIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBzaG91bGQgbm90IGJlIHVzZWQuCi0KLUlmIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgYSB1bmljb2RlIHN0cmluZywgaXQgaXMgY29udmVydGVkIGludG8KLWFuIDgtYml0IHN0cmluZyBhY2NvcmRpbmcgdG8gY3R5cGVzIGNvbnZlcnNpb24gcnVsZXMuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2NyZWF0ZV91bmljb2RlX2J1ZmZlcn17aW5pdF9vcl9zaXplXG9wdGlvbmFseywgc2l6ZX19Ci1UaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBtdXRhYmxlIHVuaWNvZGUgY2hhcmFjdGVyIGJ1ZmZlci4gVGhlCi1yZXR1cm5lZCBvYmplY3QgaXMgYSBjdHlwZXMgYXJyYXkgb2YgXGNsYXNze2N7XF99d2NoYXJ9LgotCi1cY29kZXtpbml0e1xffW9ye1xffXNpemV9IG11c3QgYmUgYW4gaW50ZWdlciB3aGljaCBzcGVjaWZpZXMgdGhlIHNpemUgb2YKLXRoZSBhcnJheSwgb3IgYSB1bmljb2RlIHN0cmluZyB3aGljaCB3aWxsIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZQotdGhlIGFycmF5IGl0ZW1zLgotCi1JZiBhIHVuaWNvZGUgc3RyaW5nIGlzIHNwZWNpZmllZCBhcyBmaXJzdCBhcmd1bWVudCwgdGhlIGJ1ZmZlciBpcwotbWFkZSBvbmUgaXRlbSBsYXJnZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgc28gdGhhdCB0aGUKLWxhc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkgaXMgYSBOVUwgdGVybWluYXRpb24gY2hhcmFjdGVyLiBBbgotaW50ZWdlciBjYW4gYmUgcGFzc2VkIGFzIHNlY29uZCBhcmd1bWVudCB3aGljaCBhbGxvd3MgdG8gc3BlY2lmeQotdGhlIHNpemUgb2YgdGhlIGFycmF5IGlmIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBzaG91bGQgbm90IGJlCi11c2VkLgotCi1JZiB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIGEgOC1iaXQgc3RyaW5nLCBpdCBpcyBjb252ZXJ0ZWQgaW50byBhbgotdW5pY29kZSBzdHJpbmcgYWNjb3JkaW5nIHRvIGN0eXBlcyBjb252ZXJzaW9uIHJ1bGVzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtEbGxDYW5VbmxvYWROb3d9e30KLVdpbmRvd3Mgb25seTogVGhpcyBmdW5jdGlvbiBpcyBhIGhvb2sgd2hpY2ggYWxsb3dzIHRvIGltcGxlbWVudAotaW5wcm9jZXNzIENPTSBzZXJ2ZXJzIHdpdGggY3R5cGVzLiBJdCBpcyBjYWxsZWQgZnJvbSB0aGUKLURsbENhblVubG9hZE5vdyBmdW5jdGlvbiB0aGF0IHRoZSB7XF99Y3R5cGVzIGV4dGVuc2lvbiBkbGwgZXhwb3J0cy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317RGxsR2V0Q2xhc3NPYmplY3R9e30KLVdpbmRvd3Mgb25seTogVGhpcyBmdW5jdGlvbiBpcyBhIGhvb2sgd2hpY2ggYWxsb3dzIHRvIGltcGxlbWVudAotaW5wcm9jZXNzIENPTSBzZXJ2ZXJzIHdpdGggY3R5cGVzLiBJdCBpcyBjYWxsZWQgZnJvbSB0aGUKLURsbEdldENsYXNzT2JqZWN0IGZ1bmN0aW9uIHRoYXQgdGhlIFxjb2Rle3tcX31jdHlwZXN9IGV4dGVuc2lvbiBkbGwgZXhwb3J0cy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Rm9ybWF0RXJyb3J9e1xvcHRpb25hbHtjb2RlfX0KLVdpbmRvd3Mgb25seTogUmV0dXJucyBhIHRleHR1YWwgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yIGNvZGUuIElmCi1ubyBlcnJvciBjb2RlIGlzIHNwZWNpZmllZCwgdGhlIGxhc3QgZXJyb3IgY29kZSBpcyB1c2VkIGJ5IGNhbGxpbmcKLXRoZSBXaW5kb3dzIGFwaSBmdW5jdGlvbiBHZXRMYXN0RXJyb3IuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e0dldExhc3RFcnJvcn17fQotV2luZG93cyBvbmx5OiBSZXR1cm5zIHRoZSBsYXN0IGVycm9yIGNvZGUgc2V0IGJ5IFdpbmRvd3MgaW4gdGhlCi1jYWxsaW5nIHRocmVhZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bWVtbW92ZX17ZHN0LCBzcmMsIGNvdW50fQotU2FtZSBhcyB0aGUgc3RhbmRhcmQgQyBtZW1tb3ZlIGxpYnJhcnkgZnVuY3Rpb246IGNvcGllcyBcdmFye2NvdW50fQotYnl0ZXMgZnJvbSBcY29kZXtzcmN9IHRvIFx2YXJ7ZHN0fS4gXHZhcntkc3R9IGFuZCBcY29kZXtzcmN9IG11c3QgYmUKLWludGVnZXJzIG9yIGN0eXBlcyBpbnN0YW5jZXMgdGhhdCBjYW4gYmUgY29udmVydGVkIHRvIHBvaW50ZXJzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXttZW1zZXR9e2RzdCwgYywgY291bnR9Ci1TYW1lIGFzIHRoZSBzdGFuZGFyZCBDIG1lbXNldCBsaWJyYXJ5IGZ1bmN0aW9uOiBmaWxscyB0aGUgbWVtb3J5Ci1ibG9jayBhdCBhZGRyZXNzIFx2YXJ7ZHN0fSB3aXRoIFx2YXJ7Y291bnR9IGJ5dGVzIG9mIHZhbHVlCi1cdmFye2N9LiBcdmFye2RzdH0gbXVzdCBiZSBhbiBpbnRlZ2VyIHNwZWNpZnlpbmcgYW4gYWRkcmVzcywgb3IgYQotY3R5cGVzIGluc3RhbmNlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtQT0lOVEVSfXt0eXBlfQotVGhpcyBmYWN0b3J5IGZ1bmN0aW9uIGNyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgY3R5cGVzIHBvaW50ZXIKLXR5cGUuIFBvaW50ZXIgdHlwZXMgYXJlIGNhY2hlZCBhbiByZXVzZWQgaW50ZXJuYWxseSwgc28gY2FsbGluZwotdGhpcyBmdW5jdGlvbiByZXBlYXRlZGx5IGlzIGNoZWFwLiB0eXBlIG11c3QgYmUgYSBjdHlwZXMgdHlwZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cG9pbnRlcn17b2JqfQotVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgbmV3IHBvaW50ZXIgaW5zdGFuY2UsIHBvaW50aW5nIHRvCi1cY29kZXtvYmp9LiBUaGUgcmV0dXJuZWQgb2JqZWN0IGlzIG9mIHRoZSB0eXBlIFBPSU5URVIodHlwZShvYmopKS4KLQotTm90ZTogSWYgeW91IGp1c3Qgd2FudCB0byBwYXNzIGEgcG9pbnRlciB0byBhbiBvYmplY3QgdG8gYSBmb3JlaWduCi1mdW5jdGlvbiBjYWxsLCB5b3Ugc2hvdWxkIHVzZSBcY29kZXtieXJlZihvYmopfSB3aGljaCBpcyBtdWNoIGZhc3Rlci4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cmVzaXplfXtvYmosIHNpemV9Ci1UaGlzIGZ1bmN0aW9uIHJlc2l6ZXMgdGhlIGludGVybmFsIG1lbW9yeSBidWZmZXIgb2Ygb2JqLCB3aGljaAotbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBhIGN0eXBlcyB0eXBlLiBJdCBpcyBub3QgcG9zc2libGUgdG8gbWFrZQotdGhlIGJ1ZmZlciBzbWFsbGVyIHRoYW4gdGhlIG5hdGl2ZSBzaXplIG9mIHRoZSBvYmplY3RzIHR5cGUsIGFzCi1naXZlbiBieSBzaXplb2YodHlwZShvYmopKSwgYnV0IGl0IGlzIHBvc3NpYmxlIHRvIGVubGFyZ2UgdGhlCi1idWZmZXIuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NldF9jb252ZXJzaW9uX21vZGV9e2VuY29kaW5nLCBlcnJvcnN9Ci1UaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHJ1bGVzIHRoYXQgY3R5cGVzIG9iamVjdHMgdXNlIHdoZW4KLWNvbnZlcnRpbmcgYmV0d2VlbiA4LWJpdCBzdHJpbmdzIGFuZCB1bmljb2RlIHN0cmluZ3MuIGVuY29kaW5nCi1tdXN0IGJlIGEgc3RyaW5nIHNwZWNpZnlpbmcgYW4gZW5jb2RpbmcsIGxpa2UgXGNvZGV7J3V0Zi04J30gb3IKLVxjb2RleydtYmNzJ30sIGVycm9ycyBtdXN0IGJlIGEgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIGVycm9yIGhhbmRsaW5nCi1vbiBlbmNvZGluZy9kZWNvZGluZyBlcnJvcnMuIEV4YW1wbGVzIG9mIHBvc3NpYmxlIHZhbHVlcyBhcmUKLVxjb2RleyJzdHJpY3QifSwgXGNvZGV7InJlcGxhY2UifSwgb3IgXGNvZGV7Imlnbm9yZSJ9LgotCi1cY29kZXtzZXR7XF99Y29udmVyc2lvbntcX31tb2RlfSByZXR1cm5zIGEgMi10dXBsZSBjb250YWluaW5nIHRoZSBwcmV2aW91cwotY29udmVyc2lvbiBydWxlcy4gT24gd2luZG93cywgdGhlIGluaXRpYWwgY29udmVyc2lvbiBydWxlcyBhcmUKLVxjb2RleygnbWJjcycsICdpZ25vcmUnKX0sIG9uIG90aGVyIHN5c3RlbXMgXGNvZGV7KCdhc2NpaScsICdzdHJpY3QnKX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NpemVvZn17b2JqX29yX3R5cGV9Ci1SZXR1cm5zIHRoZSBzaXplIGluIGJ5dGVzIG9mIGEgY3R5cGVzIHR5cGUgb3IgaW5zdGFuY2UgbWVtb3J5Ci1idWZmZXIuIERvZXMgdGhlIHNhbWUgYXMgdGhlIEMgXGNvZGV7c2l6ZW9mKCl9IGZ1bmN0aW9uLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzdHJpbmdfYXR9e2FkZHJlc3Ncb3B0aW9uYWx7LCBzaXplfX0KLVRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgc3RyaW5nIHN0YXJ0aW5nIGF0IG1lbW9yeSBhZGRyZXNzCi1hZGRyZXNzLiBJZiBzaXplIGlzIHNwZWNpZmllZCwgaXQgaXMgdXNlZCBhcyBzaXplLCBvdGhlcndpc2UgdGhlCi1zdHJpbmcgaXMgYXNzdW1lZCB0byBiZSB6ZXJvLXRlcm1pbmF0ZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e1dpbkVycm9yfXtjb2RlPU5vbmUsIGRlc2NyPU5vbmV9Ci1XaW5kb3dzIG9ubHk6IHRoaXMgZnVuY3Rpb24gaXMgcHJvYmFibHkgdGhlIHdvcnN0LW5hbWVkIHRoaW5nIGluCi1jdHlwZXMuIEl0IGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgV2luZG93c0Vycm9yLiBJZiBcdmFye2NvZGV9IGlzIG5vdAotc3BlY2lmaWVkLCBcY29kZXtHZXRMYXN0RXJyb3J9IGlzIGNhbGxlZCB0byBkZXRlcm1pbmUgdGhlIGVycm9yCi1jb2RlLiBJZiBcY29kZXtkZXNjcn0gaXMgbm90IHNwY2lmaWVkLCBcZnVuY3Rpb257Rm9ybWF0RXJyb3J9IGlzIGNhbGxlZCB0bwotZ2V0IGEgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3dzdHJpbmdfYXR9e2FkZHJlc3N9Ci1UaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHdpZGUgY2hhcmFjdGVyIHN0cmluZyBzdGFydGluZyBhdCBtZW1vcnkKLWFkZHJlc3MgXGNvZGV7YWRkcmVzc30gYXMgdW5pY29kZSBzdHJpbmcuIElmIFxjb2Rle3NpemV9IGlzIHNwZWNpZmllZCwKLWl0IGlzIHVzZWQgYXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIG9mIHRoZSBzdHJpbmcsIG90aGVyd2lzZQotdGhlIHN0cmluZyBpcyBhc3N1bWVkIHRvIGJlIHplcm8tdGVybWluYXRlZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotXHN1YnN1YnNlY3Rpb257RGF0YSB0eXBlc1xsYWJlbHtjdHlwZXMtZGF0YS10eXBlc319Ci0KLVxiZWdpbntjbGFzc2Rlc2MqfXtfQ0RhdGF9Ci1UaGlzIG5vbi1wdWJsaWMgY2xhc3MgaXMgdGhlIGNvbW1vbiBiYXNlIGNsYXNzIG9mIGFsbCBjdHlwZXMgZGF0YQotdHlwZXMuICBBbW9uZyBvdGhlciB0aGluZ3MsIGFsbCBjdHlwZXMgdHlwZSBpbnN0YW5jZXMgY29udGFpbiBhCi1tZW1vcnkgYmxvY2sgdGhhdCBob2xkIEMgY29tcGF0aWJsZSBkYXRhOyB0aGUgYWRkcmVzcyBvZiB0aGUKLW1lbW9yeSBibG9jayBpcyByZXR1cm5lZCBieSB0aGUgXGNvZGV7YWRkcmVzc29mKCl9IGhlbHBlciBmdW5jdGlvbi4KLUFub3RoZXIgaW5zdGFuY2UgdmFyaWFibGUgaXMgZXhwb3NlZCBhcyBcbWVtYmVye3tcX31vYmplY3RzfTsgdGhpcwotY29udGFpbnMgb3RoZXIgUHl0aG9uIG9iamVjdHMgdGhhdCBuZWVkIHRvIGJlIGtlcHQgYWxpdmUgaW4gY2FzZQotdGhlIG1lbW9yeSBibG9jayBjb250YWlucyBwb2ludGVycy4KLVxlbmR7Y2xhc3NkZXNjKn0KLQotQ29tbW9uIG1ldGhvZHMgb2YgY3R5cGVzIGRhdGEgdHlwZXMsIHRoZXNlIGFyZSBhbGwgY2xhc3MgbWV0aG9kcyAodG8KLWJlIGV4YWN0LCB0aGV5IGFyZSBtZXRob2RzIG9mIHRoZSBtZXRhY2xhc3MpOgotCi1cYmVnaW57bWV0aG9kZGVzY317ZnJvbV9hZGRyZXNzfXthZGRyZXNzfQotVGhpcyBtZXRob2QgcmV0dXJucyBhIGN0eXBlcyB0eXBlIGluc3RhbmNlIHVzaW5nIHRoZSBtZW1vcnkKLXNwZWNpZmllZCBieSBhZGRyZXNzIHdoaWNoIG11c3QgYmUgYW4gaW50ZWdlci4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2Zyb21fcGFyYW19e29ian0KLVRoaXMgbWV0aG9kIGFkYXB0cyBvYmogdG8gYSBjdHlwZXMgdHlwZS4gIEl0IGlzIGNhbGxlZCB3aXRoIHRoZQotYWN0dWFsIG9iamVjdCB1c2VkIGluIGEgZm9yZWlnbiBmdW5jdGlvbiBjYWxsLCB3aGVuIHRoZSB0eXBlIGlzCi1wcmVzZW50IGluIHRoZSBmb3JlaWduIGZ1bmN0aW9ucyBcbWVtYmVye2FyZ3R5cGVzfSB0dXBsZTsgaXQgbXVzdAotcmV0dXJuIGFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGFzIGZ1bmN0aW9uIGNhbGwgcGFyYW1ldGVyLgotCi1BbGwgY3R5cGVzIGRhdGEgdHlwZXMgaGF2ZSBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcwotY2xhc3NtZXRob2QsIG5vcm1hbGx5IGl0IHJldHVybnMgXGNvZGV7b2JqfSBpZiB0aGF0IGlzIGFuIGluc3RhbmNlIG9mCi10aGUgdHlwZS4gIFNvbWUgdHlwZXMgYWNjZXB0IG90aGVyIG9iamVjdHMgYXMgd2VsbC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2luX2RsbH17bGlicmFyeSwgbmFtZX0KLVRoaXMgbWV0aG9kIHJldHVybnMgYSBjdHlwZXMgdHlwZSBpbnN0YW5jZSBleHBvcnRlZCBieSBhIHNoYXJlZAotbGlicmFyeS4gXHZhcntuYW1lfSBpcyB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sIHRoYXQgZXhwb3J0cyB0aGUgZGF0YSwKLVx2YXJ7bGlicmFyeX0gaXMgdGhlIGxvYWRlZCBzaGFyZWQgbGlicmFyeS4KLVxlbmR7bWV0aG9kZGVzY30KLQotQ29tbW9uIGluc3RhbmNlIHZhcmlhYmxlcyBvZiBjdHlwZXMgZGF0YSB0eXBlczoKLQotXGJlZ2lue21lbWJlcmRlc2N9e19iX2Jhc2VffQotU29tZXRpbWVzIGN0eXBlcyBkYXRhIGluc3RhbmNlcyBkbyBub3Qgb3duIHRoZSBtZW1vcnkgYmxvY2sgdGhleQotY29udGFpbiwgaW5zdGVhZCB0aGV5IHNoYXJlIHBhcnQgb2YgdGhlIG1lbW9yeSBibG9jayBvZiBhIGJhc2UKLW9iamVjdC4gIFRoZSBcbWVtYmVye3tcX31ie1xffWJhc2V7XF99fSByZWFkb25seSBtZW1iZXIgaXMgdGhlIHJvb3QgY3R5cGVzCi1vYmplY3QgdGhhdCBvd25zIHRoZSBtZW1vcnkgYmxvY2suCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXtfYl9uZWVkc2ZyZWVffQotVGhpcyByZWFkb25seSB2YXJpYWJsZSBpcyB0cnVlIHdoZW4gdGhlIGN0eXBlcyBkYXRhIGluc3RhbmNlIGhhcwotYWxsb2NhdGVkIHRoZSBtZW1vcnkgYmxvY2sgaXRzZWxmLCBmYWxzZSBvdGhlcndpc2UuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXtfb2JqZWN0c30KLVRoaXMgbWVtYmVyIGlzIGVpdGhlciBcY29kZXtOb25lfSBvciBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBQeXRob24KLW9iamVjdHMgdGhhdCBuZWVkIHRvIGJlIGtlcHQgYWxpdmUgc28gdGhhdCB0aGUgbWVtb3J5IGJsb2NrCi1jb250ZW50cyBpcyBrZXB0IHZhbGlkLiAgVGhpcyBvYmplY3QgaXMgb25seSBleHBvc2VkIGZvcgotZGVidWdnaW5nOyBuZXZlciBtb2RpZnkgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZGljdGlvbmFyeS4KLVxlbmR7bWVtYmVyZGVzY30KLQotCi1cc3Vic3Vic2VjdGlvbntGdW5kYW1lbnRhbCBkYXRhIHR5cGVzXGxhYmVse2N0eXBlcy1mdW5kYW1lbnRhbC1kYXRhLXR5cGVzLTJ9fQotCi1cYmVnaW57Y2xhc3NkZXNjKn17X1NpbXBsZUNEYXRhfQotVGhpcyBub24tcHVibGljIGNsYXNzIGlzIHRoZSBiYXNlIGNsYXNzIG9mIGFsbCBmdW5kYW1lbnRhbCBjdHlwZXMKLWRhdGEgdHlwZXMuIEl0IGlzIG1lbnRpb25lZCBoZXJlIGJlY2F1c2UgaXQgY29udGFpbnMgdGhlIGNvbW1vbgotYXR0cmlidXRlcyBvZiB0aGUgZnVuZGFtZW50YWwgY3R5cGVzIGRhdGEgdHlwZXMuICBcY29kZXt7XF99U2ltcGxlQ0RhdGF9Ci1pcyBhIHN1YmNsYXNzIG9mIFxjb2Rle3tcX31DRGF0YX0sIHNvIGl0IGluaGVyaXRzIHRoZWlyIG1ldGhvZHMgYW5kCi1hdHRyaWJ1dGVzLgotXGVuZHtjbGFzc2Rlc2MqfQotCi1JbnN0YW5jZXMgaGF2ZSBhIHNpbmdsZSBhdHRyaWJ1dGU6Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXt2YWx1ZX0KLVRoaXMgYXR0cmlidXRlIGNvbnRhaW5zIHRoZSBhY3R1YWwgdmFsdWUgb2YgdGhlIGluc3RhbmNlLiBGb3IKLWludGVnZXIgYW5kIHBvaW50ZXIgdHlwZXMsIGl0IGlzIGFuIGludGVnZXIsIGZvciBjaGFyYWN0ZXIgdHlwZXMsCi1pdCBpcyBhIHNpbmdsZSBjaGFyYWN0ZXIgc3RyaW5nLCBmb3IgY2hhcmFjdGVyIHBvaW50ZXIgdHlwZXMgaXQKLWlzIGEgUHl0aG9uIHN0cmluZyBvciB1bmljb2RlIHN0cmluZy4KLQotV2hlbiB0aGUgXGNvZGV7dmFsdWV9IGF0dHJpYnV0ZSBpcyByZXRyaWV2ZWQgZnJvbSBhIGN0eXBlcyBpbnN0YW5jZSwKLXVzdWFsbHkgYSBuZXcgb2JqZWN0IGlzIHJldHVybmVkIGVhY2ggdGltZS4gIFxjb2Rle2N0eXBlc30gZG9lcyBcZW1waHtub3R9Ci1pbXBsZW1lbnQgb3JpZ2luYWwgb2JqZWN0IHJldHVybiwgYWx3YXlzIGEgbmV3IG9iamVjdCBpcwotY29uc3RydWN0ZWQuICBUaGUgc2FtZSBpcyB0cnVlIGZvciBhbGwgb3RoZXIgY3R5cGVzIG9iamVjdAotaW5zdGFuY2VzLgotXGVuZHttZW1iZXJkZXNjfQotCi1GdW5kYW1lbnRhbCBkYXRhIHR5cGVzLCB3aGVuIHJldHVybmVkIGFzIGZvcmVpZ24gZnVuY3Rpb24gY2FsbAotcmVzdWx0cywgb3IsIGZvciBleGFtcGxlLCBieSByZXRyaWV2aW5nIHN0cnVjdHVyZSBmaWVsZCBtZW1iZXJzIG9yCi1hcnJheSBpdGVtcywgYXJlIHRyYW5zcGFyZW50bHkgY29udmVydGVkIHRvIG5hdGl2ZSBQeXRob24gdHlwZXMuICBJbgotb3RoZXIgd29yZHMsIGlmIGEgZm9yZWlnbiBmdW5jdGlvbiBoYXMgYSBcbWVtYmVye3Jlc3R5cGV9IG9mIFxjbGFzc3tje1xffWNoYXJ7XF99cH0sCi15b3Ugd2lsbCBhbHdheXMgcmVjZWl2ZSBhIFB5dGhvbiBzdHJpbmcsIFxlbXBoe25vdH0gYSBcY2xhc3N7Y3tcX31jaGFye1xffXB9Ci1pbnN0YW5jZS4KLQotU3ViY2xhc3NlcyBvZiBmdW5kYW1lbnRhbCBkYXRhIHR5cGVzIGRvIFxlbXBoe25vdH0gaW5oZXJpdCB0aGlzIGJlaGF2aW91ci4KLVNvLCBpZiBhIGZvcmVpZ24gZnVuY3Rpb25zIFxtZW1iZXJ7cmVzdHlwZX0gaXMgYSBzdWJjbGFzcyBvZiBcY2xhc3N7Y3tcX312b2lke1xffXB9LAoteW91IHdpbGwgcmVjZWl2ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIHN1YmNsYXNzIGZyb20gdGhlIGZ1bmN0aW9uIGNhbGwuCi1PZiBjb3Vyc2UsIHlvdSBjYW4gZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgcG9pbnRlciBieSBhY2Nlc3NpbmcgdGhlCi1cY29kZXt2YWx1ZX0gYXR0cmlidXRlLgotCi1UaGVzZSBhcmUgdGhlIGZ1bmRhbWVudGFsIGN0eXBlcyBkYXRhIHR5cGVzOgotCi1cYmVnaW57Y2xhc3NkZXNjKn17Y19ieXRlfQotUmVwcmVzZW50cyB0aGUgQyBzaWduZWQgY2hhciBkYXRhdHlwZSwgYW5kIGludGVycHJldHMgdGhlIHZhbHVlIGFzCi1zbWFsbCBpbnRlZ2VyLiBUaGUgY29uc3RydWN0b3IgYWNjZXB0cyBhbiBvcHRpb25hbCBpbnRlZ2VyCi1pbml0aWFsaXplcjsgbm8gb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZG9uZS4KLVxlbmR7Y2xhc3NkZXNjKn0KLQotXGJlZ2lue2NsYXNzZGVzYyp9e2NfY2hhcn0KLVJlcHJlc2VudHMgdGhlIEMgY2hhciBkYXRhdHlwZSwgYW5kIGludGVycHJldHMgdGhlIHZhbHVlIGFzIGEgc2luZ2xlCi1jaGFyYWN0ZXIuIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIGFuIG9wdGlvbmFsIHN0cmluZyBpbml0aWFsaXplciwKLXRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBtdXN0IGJlIGV4YWN0bHkgb25lIGNoYXJhY3Rlci4KLVxlbmR7Y2xhc3NkZXNjKn0KLQotXGJlZ2lue2NsYXNzZGVzYyp9e2NfY2hhcl9wfQotUmVwcmVzZW50cyB0aGUgQyBjaGFyICogZGF0YXR5cGUsIHdoaWNoIG11c3QgYmUgYSBwb2ludGVyIHRvIGEKLXplcm8tdGVybWluYXRlZCBzdHJpbmcuIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIGFuIGludGVnZXIKLWFkZHJlc3MsIG9yIGEgc3RyaW5nLgotXGVuZHtjbGFzc2Rlc2MqfQotCi1cYmVnaW57Y2xhc3NkZXNjKn17Y19kb3VibGV9Ci1SZXByZXNlbnRzIHRoZSBDIGRvdWJsZSBkYXRhdHlwZS4gVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4KLW9wdGlvbmFsIGZsb2F0IGluaXRpYWxpemVyLgotXGVuZHtjbGFzc2Rlc2MqfQotCi1cYmVnaW57Y2xhc3NkZXNjKn17Y19mbG9hdH0KLVJlcHJlc2VudHMgdGhlIEMgZG91YmxlIGRhdGF0eXBlLiBUaGUgY29uc3RydWN0b3IgYWNjZXB0cyBhbgotb3B0aW9uYWwgZmxvYXQgaW5pdGlhbGl6ZXIuCi1cZW5ke2NsYXNzZGVzYyp9Ci0KLVxiZWdpbntjbGFzc2Rlc2MqfXtjX2ludH0KLVJlcHJlc2VudHMgdGhlIEMgc2lnbmVkIGludCBkYXRhdHlwZS4gVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4KLW9wdGlvbmFsIGludGVnZXIgaW5pdGlhbGl6ZXI7IG5vIG92ZXJmbG93IGNoZWNraW5nIGlzIGRvbmUuIE9uCi1wbGF0Zm9ybXMgd2hlcmUgXGNvZGV7c2l6ZW9mKGludCkgPT0gc2l6ZW9mKGxvbmcpfSBpdCBpcyBhbiBhbGlhcyB0bwotXGNsYXNze2N7XF99bG9uZ30uCi1cZW5ke2NsYXNzZGVzYyp9Ci0KLVxiZWdpbntjbGFzc2Rlc2MqfXtjX2ludDh9Ci1SZXByZXNlbnRzIHRoZSBDIDgtYml0IFxjb2Rle3NpZ25lZCBpbnR9IGRhdGF0eXBlLiBVc3VhbGx5IGFuIGFsaWFzIGZvcgotXGNsYXNze2N7XF99Ynl0ZX0uCi1cZW5ke2NsYXNzZGVzYyp9Ci0KLVxiZWdpbntjbGFzc2Rlc2MqfXtjX2ludDE2fQotUmVwcmVzZW50cyB0aGUgQyAxNi1iaXQgc2lnbmVkIGludCBkYXRhdHlwZS4gVXN1YWxseSBhbiBhbGlhcyBmb3IKLVxjbGFzc3tje1xffXNob3J0fS4KLVxlbmR7Y2xhc3NkZXNjKn0KLQotXGJlZ2lue2NsYXNzZGVzYyp9e2NfaW50MzJ9Ci1SZXByZXNlbnRzIHRoZSBDIDMyLWJpdCBzaWduZWQgaW50IGRhdGF0eXBlLiBVc3VhbGx5IGFuIGFsaWFzIGZvcgotXGNsYXNze2N7XF99aW50fS4KLVxlbmR7Y2xhc3NkZXNjKn0KLQotXGJlZ2lue2NsYXNzZGVzYyp9e2NfaW50NjR9Ci1SZXByZXNlbnRzIHRoZSBDIDY0LWJpdCBcY29kZXtzaWduZWQgaW50fSBkYXRhdHlwZS4gVXN1YWxseSBhbiBhbGlhcwotZm9yIFxjbGFzc3tje1xffWxvbmdsb25nfS4KLVxlbmR7Y2xhc3NkZXNjKn0KLQotXGJlZ2lue2NsYXNzZGVzYyp9e2NfbG9uZ30KLVJlcHJlc2VudHMgdGhlIEMgXGNvZGV7c2lnbmVkIGxvbmd9IGRhdGF0eXBlLiBUaGUgY29uc3RydWN0b3IgYWNjZXB0cyBhbgotb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplcjsgbm8gb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZG9uZS4KLVxlbmR7Y2xhc3NkZXNjKn0KLQotXGJlZ2lue2NsYXNzZGVzYyp9e2NfbG9uZ2xvbmd9Ci1SZXByZXNlbnRzIHRoZSBDIFxjb2Rle3NpZ25lZCBsb25nIGxvbmd9IGRhdGF0eXBlLiBUaGUgY29uc3RydWN0b3IgYWNjZXB0cwotYW4gb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplcjsgbm8gb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZG9uZS4KLVxlbmR7Y2xhc3NkZXNjKn0KLQotXGJlZ2lue2NsYXNzZGVzYyp9e2Nfc2hvcnR9Ci1SZXByZXNlbnRzIHRoZSBDIFxjb2Rle3NpZ25lZCBzaG9ydH0gZGF0YXR5cGUuIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIGFuCi1vcHRpb25hbCBpbnRlZ2VyIGluaXRpYWxpemVyOyBubyBvdmVyZmxvdyBjaGVja2luZyBpcyBkb25lLgotXGVuZHtjbGFzc2Rlc2MqfQotCi1cYmVnaW57Y2xhc3NkZXNjKn17Y19zaXplX3R9Ci1SZXByZXNlbnRzIHRoZSBDIFxjb2Rle3NpemV7XF99dH0gZGF0YXR5cGUuCi1cZW5ke2NsYXNzZGVzYyp9Ci0KLVxiZWdpbntjbGFzc2Rlc2MqfXtjX3VieXRlfQotUmVwcmVzZW50cyB0aGUgQyBcY29kZXt1bnNpZ25lZCBjaGFyfSBkYXRhdHlwZSwgaXQgaW50ZXJwcmV0cyB0aGUKLXZhbHVlIGFzIHNtYWxsIGludGVnZXIuIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIGFuIG9wdGlvbmFsCi1pbnRlZ2VyIGluaXRpYWxpemVyOyBubyBvdmVyZmxvdyBjaGVja2luZyBpcyBkb25lLgotXGVuZHtjbGFzc2Rlc2MqfQotCi1cYmVnaW57Y2xhc3NkZXNjKn17Y191aW50fQotUmVwcmVzZW50cyB0aGUgQyBcY29kZXt1bnNpZ25lZCBpbnR9IGRhdGF0eXBlLiBUaGUgY29uc3RydWN0b3IgYWNjZXB0cyBhbgotb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplcjsgbm8gb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZG9uZS4gT24KLXBsYXRmb3JtcyB3aGVyZSBcY29kZXtzaXplb2YoaW50KSA9PSBzaXplb2YobG9uZyl9IGl0IGlzIGFuIGFsaWFzIGZvcgotXGNsYXNze2N7XF99dWxvbmd9LgotXGVuZHtjbGFzc2Rlc2MqfQotCi1cYmVnaW57Y2xhc3NkZXNjKn17Y191aW50OH0KLVJlcHJlc2VudHMgdGhlIEMgOC1iaXQgdW5zaWduZWQgaW50IGRhdGF0eXBlLiBVc3VhbGx5IGFuIGFsaWFzIGZvcgotXGNsYXNze2N7XF99dWJ5dGV9LgotXGVuZHtjbGFzc2Rlc2MqfQotCi1cYmVnaW57Y2xhc3NkZXNjKn17Y191aW50MTZ9Ci1SZXByZXNlbnRzIHRoZSBDIDE2LWJpdCB1bnNpZ25lZCBpbnQgZGF0YXR5cGUuIFVzdWFsbHkgYW4gYWxpYXMgZm9yCi1cY2xhc3N7Y3tcX311c2hvcnR9LgotXGVuZHtjbGFzc2Rlc2MqfQotCi1cYmVnaW57Y2xhc3NkZXNjKn17Y191aW50MzJ9Ci1SZXByZXNlbnRzIHRoZSBDIDMyLWJpdCB1bnNpZ25lZCBpbnQgZGF0YXR5cGUuIFVzdWFsbHkgYW4gYWxpYXMgZm9yCi1cY2xhc3N7Y3tcX311aW50fS4KLVxlbmR7Y2xhc3NkZXNjKn0KLQotXGJlZ2lue2NsYXNzZGVzYyp9e2NfdWludDY0fQotUmVwcmVzZW50cyB0aGUgQyA2NC1iaXQgdW5zaWduZWQgaW50IGRhdGF0eXBlLiBVc3VhbGx5IGFuIGFsaWFzIGZvcgotXGNsYXNze2N7XF99dWxvbmdsb25nfS4KLVxlbmR7Y2xhc3NkZXNjKn0KLQotXGJlZ2lue2NsYXNzZGVzYyp9e2NfdWxvbmd9Ci1SZXByZXNlbnRzIHRoZSBDIFxjb2Rle3Vuc2lnbmVkIGxvbmd9IGRhdGF0eXBlLiBUaGUgY29uc3RydWN0b3IgYWNjZXB0cyBhbgotb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplcjsgbm8gb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZG9uZS4KLVxlbmR7Y2xhc3NkZXNjKn0KLQotXGJlZ2lue2NsYXNzZGVzYyp9e2NfdWxvbmdsb25nfQotUmVwcmVzZW50cyB0aGUgQyBcY29kZXt1bnNpZ25lZCBsb25nIGxvbmd9IGRhdGF0eXBlLiBUaGUgY29uc3RydWN0b3IKLWFjY2VwdHMgYW4gb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplcjsgbm8gb3ZlcmZsb3cgY2hlY2tpbmcgaXMKLWRvbmUuCi1cZW5ke2NsYXNzZGVzYyp9Ci0KLVxiZWdpbntjbGFzc2Rlc2MqfXtjX3VzaG9ydH0KLVJlcHJlc2VudHMgdGhlIEMgXGNvZGV7dW5zaWduZWQgc2hvcnR9IGRhdGF0eXBlLiBUaGUgY29uc3RydWN0b3IgYWNjZXB0cyBhbgotb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplcjsgbm8gb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZG9uZS4KLVxlbmR7Y2xhc3NkZXNjKn0KLQotXGJlZ2lue2NsYXNzZGVzYyp9e2Nfdm9pZF9wfQotUmVwcmVzZW50cyB0aGUgQyBcY29kZXt2b2lkICp9IHR5cGUuIFRoZSB2YWx1ZSBpcyByZXByZXNlbnRlZCBhcwotaW50ZWdlci4gVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4gb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplci4KLVxlbmR7Y2xhc3NkZXNjKn0KLQotXGJlZ2lue2NsYXNzZGVzYyp9e2Nfd2NoYXJ9Ci1SZXByZXNlbnRzIHRoZSBDIFxjb2Rle3djaGFye1xffXR9IGRhdGF0eXBlLCBhbmQgaW50ZXJwcmV0cyB0aGUgdmFsdWUgYXMgYQotc2luZ2xlIGNoYXJhY3RlciB1bmljb2RlIHN0cmluZy4gVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4KLW9wdGlvbmFsIHN0cmluZyBpbml0aWFsaXplciwgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIG11c3QgYmUKLWV4YWN0bHkgb25lIGNoYXJhY3Rlci4KLVxlbmR7Y2xhc3NkZXNjKn0KLQotXGJlZ2lue2NsYXNzZGVzYyp9e2Nfd2NoYXJfcH0KLVJlcHJlc2VudHMgdGhlIEMgXGNvZGV7d2NoYXJ7XF99dCAqfSBkYXRhdHlwZSwgd2hpY2ggbXVzdCBiZSBhIHBvaW50ZXIgdG8KLWEgemVyby10ZXJtaW5hdGVkIHdpZGUgY2hhcmFjdGVyIHN0cmluZy4gVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMKLWFuIGludGVnZXIgYWRkcmVzcywgb3IgYSBzdHJpbmcuCi1cZW5ke2NsYXNzZGVzYyp9Ci0KLVxiZWdpbntjbGFzc2Rlc2MqfXtjX2Jvb2x9Ci1SZXByZXNlbnQgdGhlIEMgXGNvZGV7Ym9vbH0gZGF0YXR5cGUgKG1vcmUgYWNjdXJhdGVseSwgX0Jvb2wgZnJvbSBDOTkpLgotSXRzIHZhbHVlIGNhbiBiZSBUcnVlIG9yIEZhbHNlLCBhbmQgdGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW55IG9iamVjdCB0aGF0Ci1oYXMgYSB0cnV0aCB2YWx1ZS4KLVx2ZXJzaW9uYWRkZWR7Mi42fQotXGVuZHtjbGFzc2Rlc2MqfQotCi1cYmVnaW57Y2xhc3NkZXNjKn17SFJFU1VMVH0KLVdpbmRvd3Mgb25seTogUmVwcmVzZW50cyBhIFxjbGFzc3tIUkVTVUxUfSB2YWx1ZSwgd2hpY2ggY29udGFpbnMgc3VjY2Vzcwotb3IgZXJyb3IgaW5mb3JtYXRpb24gZm9yIGEgZnVuY3Rpb24gb3IgbWV0aG9kIGNhbGwuCi1cZW5ke2NsYXNzZGVzYyp9Ci0KLVxiZWdpbntjbGFzc2Rlc2MqfXtweV9vYmplY3R9Ci1SZXByZXNlbnRzIHRoZSBDIFxjb2Rle1B5T2JqZWN0ICp9IGRhdGF0eXBlLiAgQ2FsbGluZyB0aGlzIHdpdGhvdXQgYW4KLWFyZ3VtZW50IGNyZWF0ZXMgYSBcY29kZXtOVUxMfSBcY29kZXtQeU9iamVjdCAqfSBwb2ludGVyLgotXGVuZHtjbGFzc2Rlc2MqfQotCi1UaGUgXGNvZGV7Y3R5cGVzLndpbnR5cGVzfSBtb2R1bGUgcHJvdmlkZXMgcXVpdGUgc29tZSBvdGhlciBXaW5kb3dzCi1zcGVjaWZpYyBkYXRhIHR5cGVzLCBmb3IgZXhhbXBsZSBcY29kZXtIV05EfSwgXGNvZGV7V1BBUkFNfSwgb3IgXGNvZGV7RFdPUkR9LgotU29tZSB1c2VmdWwgc3RydWN0dXJlcyBsaWtlIFxjb2Rle01TR30gb3IgXGNvZGV7UkVDVH0gYXJlIGFsc28gZGVmaW5lZC4KLQotCi1cc3Vic3Vic2VjdGlvbntTdHJ1Y3R1cmVkIGRhdGEgdHlwZXNcbGFiZWx7Y3R5cGVzLXN0cnVjdHVyZWQtZGF0YS10eXBlc319Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1VuaW9ufXsqYXJncywgKiprd30KLUFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHVuaW9ucyBpbiBuYXRpdmUgYnl0ZSBvcmRlci4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtCaWdFbmRpYW5TdHJ1Y3R1cmV9eyphcmdzLCAqKmt3fQotQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3Igc3RydWN0dXJlcyBpbiBcZW1waHtiaWcgZW5kaWFufSBieXRlIG9yZGVyLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0xpdHRsZUVuZGlhblN0cnVjdHVyZX17KmFyZ3MsICoqa3d9Ci1BYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBzdHJ1Y3R1cmVzIGluIFxlbXBoe2xpdHRsZSBlbmRpYW59IGJ5dGUgb3JkZXIuCi1cZW5ke2NsYXNzZGVzY30KLQotU3RydWN0dXJlcyB3aXRoIG5vbi1uYXRpdmUgYnl0ZSBvcmRlciBjYW5ub3QgY29udGFpbiBwb2ludGVyIHR5cGUKLWZpZWxkcywgb3IgYW55IG90aGVyIGRhdGEgdHlwZXMgY29udGFpbmluZyBwb2ludGVyIHR5cGUgZmllbGRzLgotCi1cYmVnaW57Y2xhc3NkZXNjfXtTdHJ1Y3R1cmV9eyphcmdzLCAqKmt3fQotQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3Igc3RydWN0dXJlcyBpbiBcZW1waHtuYXRpdmV9IGJ5dGUgb3JkZXIuCi1cZW5ke2NsYXNzZGVzY30KLQotQ29uY3JldGUgc3RydWN0dXJlIGFuZCB1bmlvbiB0eXBlcyBtdXN0IGJlIGNyZWF0ZWQgYnkgc3ViY2xhc3Npbmcgb25lCi1vZiB0aGVzZSB0eXBlcywgYW5kIGF0IGxlYXN0IGRlZmluZSBhIFxtZW1iZXJ7e1xffWZpZWxkc3tcX319IGNsYXNzIHZhcmlhYmxlLgotXGNvZGV7Y3R5cGVzfSB3aWxsIGNyZWF0ZSBkZXNjcmlwdG9ycyB3aGljaCBhbGxvdyByZWFkaW5nIGFuZCB3cml0aW5nIHRoZQotZmllbGRzIGJ5IGRpcmVjdCBhdHRyaWJ1dGUgYWNjZXNzZXMuICBUaGVzZSBhcmUgdGhlCi0KLVxiZWdpbnttZW1iZXJkZXNjfXtfZmllbGRzX30KLUEgc2VxdWVuY2UgZGVmaW5pbmcgdGhlIHN0cnVjdHVyZSBmaWVsZHMuICBUaGUgaXRlbXMgbXVzdCBiZQotMi10dXBsZXMgb3IgMy10dXBsZXMuICBUaGUgZmlyc3QgaXRlbSBpcyB0aGUgbmFtZSBvZiB0aGUgZmllbGQsCi10aGUgc2Vjb25kIGl0ZW0gc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBmaWVsZDsgaXQgY2FuIGJlIGFueQotY3R5cGVzIGRhdGEgdHlwZS4KLQotRm9yIGludGVnZXIgdHlwZSBmaWVsZHMgbGlrZSBcY2xhc3N7Y3tcX31pbnR9LCBhIHRoaXJkIG9wdGlvbmFsIGl0ZW0gY2FuCi1iZSBnaXZlbi4gIEl0IG11c3QgYmUgYSBzbWFsbCBwb3NpdGl2ZSBpbnRlZ2VyIGRlZmluaW5nIHRoZSBiaXQKLXdpZHRoIG9mIHRoZSBmaWVsZC4KLQotRmllbGQgbmFtZXMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIG9uZSBzdHJ1Y3R1cmUgb3IgdW5pb24uICBUaGlzIGlzCi1ub3QgY2hlY2tlZCwgb25seSBvbmUgZmllbGQgY2FuIGJlIGFjY2Vzc2VkIHdoZW4gbmFtZXMgYXJlCi1yZXBlYXRlZC4KLQotSXQgaXMgcG9zc2libGUgdG8gZGVmaW5lIHRoZSBcbWVtYmVye3tcX31maWVsZHN7XF99fSBjbGFzcyB2YXJpYWJsZSBcZW1waHthZnRlcn0KLXRoZSBjbGFzcyBzdGF0ZW1lbnQgdGhhdCBkZWZpbmVzIHRoZSBTdHJ1Y3R1cmUgc3ViY2xhc3MsIHRoaXMKLWFsbG93cyB0byBjcmVhdGUgZGF0YSB0eXBlcyB0aGF0IGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgcmVmZXJlbmNlCi10aGVtc2VsdmVzOgotXGJlZ2lue3ZlcmJhdGltfQotY2xhc3MgTGlzdChTdHJ1Y3R1cmUpOgotICAgIHBhc3MKLUxpc3QuX2ZpZWxkc18gPSBbKCJwbmV4dCIsIFBPSU5URVIoTGlzdCkpLAotICAgICAgICAgICAgICAgICAuLi4KLSAgICAgICAgICAgICAgICBdCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgXG1lbWJlcnt7XF99ZmllbGRze1xffX0gY2xhc3MgdmFyaWFibGUgbXVzdCwgaG93ZXZlciwgYmUgZGVmaW5lZCBiZWZvcmUKLXRoZSB0eXBlIGlzIGZpcnN0IHVzZWQgKGFuIGluc3RhbmNlIGlzIGNyZWF0ZWQsIFxjb2Rle3NpemVvZigpfSBpcwotY2FsbGVkIG9uIGl0LCBhbmQgc28gb24pLiAgTGF0ZXIgYXNzaWdubWVudHMgdG8gdGhlIFxtZW1iZXJ7e1xffWZpZWxkc3tcX319Ci1jbGFzcyB2YXJpYWJsZSB3aWxsIHJhaXNlIGFuIEF0dHJpYnV0ZUVycm9yLgotCi1TdHJ1Y3R1cmUgYW5kIHVuaW9uIHN1YmNsYXNzIGNvbnN0cnVjdG9ycyBhY2NlcHQgYm90aCBwb3NpdGlvbmFsCi1hbmQgbmFtZWQgYXJndW1lbnRzLiAgUG9zaXRpb25hbCBhcmd1bWVudHMgYXJlIHVzZWQgdG8gaW5pdGlhbGl6ZQotdGhlIGZpZWxkcyBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGV5IGFwcGVhciBpbiB0aGUgXG1lbWJlcnt7XF99ZmllbGRze1xffX0KLWRlZmluaXRpb24sIG5hbWVkIGFyZ3VtZW50cyBhcmUgdXNlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZHMgd2l0aAotdGhlIGNvcnJlc3BvbmRpbmcgbmFtZS4KLQotSXQgaXMgcG9zc2libGUgdG8gZGVmaW5lZCBzdWItc3ViY2xhc3NlcyBvZiBzdHJ1Y3R1cmUgdHlwZXMsIHRoZXkKLWluaGVyaXQgdGhlIGZpZWxkcyBvZiB0aGUgYmFzZSBjbGFzcyBwbHVzIHRoZSBcbWVtYmVye3tcX31maWVsZHN7XF99fSBkZWZpbmVkCi1pbiB0aGUgc3ViLXN1YmNsYXNzLCBpZiBhbnkuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXtfcGFja199Ci1BbiBvcHRpb25hbCBzbWFsbCBpbnRlZ2VyIHRoYXQgYWxsb3dzIHRvIG92ZXJyaWRlIHRoZSBhbGlnbm1lbnQgb2YKLXN0cnVjdHVyZSBmaWVsZHMgaW4gdGhlIGluc3RhbmNlLiAgXG1lbWJlcnt7XF99cGFja3tcX319IG11c3QgYWxyZWFkeSBiZQotZGVmaW5lZCB3aGVuIFxtZW1iZXJ7e1xffWZpZWxkc3tcX319IGlzIGFzc2lnbmVkLCBvdGhlcndpc2UgaXQgd2lsbCBoYXZlIG5vCi1lZmZlY3QuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXtfYW5vbnltb3VzX30KLUFuIG9wdGlvbmFsIHNlcXVlbmNlIHRoYXQgbGlzdHMgdGhlIG5hbWVzIG9mIHVubmFtZWQgKGFub255bW91cykKLWZpZWxkcy4gIFxjb2Rle3tcX31hbm9ueW1vdXN7XF99fSBtdXN0IGJlIGFscmVhZHkgZGVmaW5lZCB3aGVuIFxtZW1iZXJ7e1xffWZpZWxkc3tcX319Ci1pcyBhc3NpZ25lZCwgb3RoZXJ3aXNlIGl0IHdpbGwgaGF2ZSBubyBlZmZlY3QuCi0KLVRoZSBmaWVsZHMgbGlzdGVkIGluIHRoaXMgdmFyaWFibGUgbXVzdCBiZSBzdHJ1Y3R1cmUgb3IgdW5pb24gdHlwZQotZmllbGRzLiAgXGNvZGV7Y3R5cGVzfSB3aWxsIGNyZWF0ZSBkZXNjcmlwdG9ycyBpbiB0aGUgc3RydWN0dXJlIHR5cGUKLXRoYXQgYWxsb3dzIHRvIGFjY2VzcyB0aGUgbmVzdGVkIGZpZWxkcyBkaXJlY3RseSwgd2l0aG91dCB0aGUgbmVlZAotdG8gY3JlYXRlIHRoZSBzdHJ1Y3R1cmUgb3IgdW5pb24gZmllbGQuCi0KLUhlcmUgaXMgYW4gZXhhbXBsZSB0eXBlIChXaW5kb3dzKToKLVxiZWdpbnt2ZXJiYXRpbX0KLWNsYXNzIF9VKFVuaW9uKToKLSAgICBfZmllbGRzXyA9IFsoImxwdGRlc2MiLCBQT0lOVEVSKFRZUEVERVNDKSksCi0gICAgICAgICAgICAgICAgKCJscGFkZXNjIiwgUE9JTlRFUihBUlJBWURFU0MpKSwKLSAgICAgICAgICAgICAgICAoImhyZWZ0eXBlIiwgSFJFRlRZUEUpXQotCi1jbGFzcyBUWVBFREVTQyhTdHJ1Y3R1cmUpOgotICAgIF9maWVsZHNfID0gWygidSIsIF9VKSwKLSAgICAgICAgICAgICAgICAoInZ0IiwgVkFSVFlQRSldCi0KLSAgICBfYW5vbnltb3VzXyA9ICgidSIsKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIFxjb2Rle1RZUEVERVNDfSBzdHJ1Y3R1cmUgZGVzY3JpYmVzIGEgQ09NIGRhdGEgdHlwZSwgdGhlIFxjb2Rle3Z0fQotZmllbGQgc3BlY2lmaWVzIHdoaWNoIG9uZSBvZiB0aGUgdW5pb24gZmllbGRzIGlzIHZhbGlkLiAgU2luY2UgdGhlCi1cY29kZXt1fSBmaWVsZCBpcyBkZWZpbmVkIGFzIGFub255bW91cyBmaWVsZCwgaXQgaXMgbm93IHBvc3NpYmxlIHRvCi1hY2Nlc3MgdGhlIG1lbWJlcnMgZGlyZWN0bHkgb2ZmIHRoZSBUWVBFREVTQyBpbnN0YW5jZS4KLVxjb2Rle3RkLmxwdGRlc2N9IGFuZCBcY29kZXt0ZC51LmxwdGRlc2N9IGFyZSBlcXVpdmFsZW50LCBidXQgdGhlIGZvcm1lcgotaXMgZmFzdGVyIHNpbmNlIGl0IGRvZXMgbm90IG5lZWQgdG8gY3JlYXRlIGEgdGVtcG9yYXJ5IHVuaW9uCi1pbnN0YW5jZToKLVxiZWdpbnt2ZXJiYXRpbX0KLXRkID0gVFlQRURFU0MoKQotdGQudnQgPSBWVF9QVFIKLXRkLmxwdGRlc2MgPSBQT0lOVEVSKHNvbWVfdHlwZSkKLXRkLnUubHB0ZGVzYyA9IFBPSU5URVIoc29tZV90eXBlKQotXGVuZHt2ZXJiYXRpbX0KLVxlbmR7bWVtYmVyZGVzY30KLQotSXQgaXMgcG9zc2libGUgdG8gZGVmaW5lZCBzdWItc3ViY2xhc3NlcyBvZiBzdHJ1Y3R1cmVzLCB0aGV5IGluaGVyaXQKLXRoZSBmaWVsZHMgb2YgdGhlIGJhc2UgY2xhc3MuICBJZiB0aGUgc3ViY2xhc3MgZGVmaW5pdGlvbiBoYXMgYQotc2VwYXJhdGUgXG1lbWJlcnt7XF99ZmllbGRze1xffX0gdmFyaWFibGUsIHRoZSBmaWVsZHMgc3BlY2lmaWVkIGluIHRoaXMgYXJlCi1hcHBlbmRlZCB0byB0aGUgZmllbGRzIG9mIHRoZSBiYXNlIGNsYXNzLgotCi1TdHJ1Y3R1cmUgYW5kIHVuaW9uIGNvbnN0cnVjdG9ycyBhY2NlcHQgYm90aCBwb3NpdGlvbmFsIGFuZAota2V5d29yZCBhcmd1bWVudHMuICBQb3NpdGlvbmFsIGFyZ3VtZW50cyBhcmUgdXNlZCB0byBpbml0aWFsaXplIG1lbWJlcgotZmllbGRzIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZXkgYXJlIGFwcGVhciBpbiBcbWVtYmVye3tcX31maWVsZHN7XF99fS4gIEtleXdvcmQKLWFyZ3VtZW50cyBpbiB0aGUgY29uc3RydWN0b3IgYXJlIGludGVycHJldGVkIGFzIGF0dHJpYnV0ZSBhc3NpZ25tZW50cywKLXNvIHRoZXkgd2lsbCBpbml0aWFsaXplIFxtZW1iZXJ7e1xffWZpZWxkc3tcX319IHdpdGggdGhlIHNhbWUgbmFtZSwgb3IgY3JlYXRlIG5ldwotYXR0cmlidXRlcyBmb3IgbmFtZXMgbm90IHByZXNlbnQgaW4gXG1lbWJlcnt7XF99ZmllbGRze1xffX0uCi0KLQotXHN1YnN1YnNlY3Rpb257QXJyYXlzIGFuZCBwb2ludGVyc1xsYWJlbHtjdHlwZXMtYXJyYXlzLXBvaW50ZXJzfX0KLQotTm90IHlldCB3cml0dGVuIC0gcGxlYXNlIHNlZSBzZWN0aW9uflxyZWZ7Y3R5cGVzLXBvaW50ZXJzfSwgcG9pbnRlcnMgYW5kCi1zZWN0aW9uflxyZWZ7Y3R5cGVzLWFycmF5c30sIGFycmF5cyBpbiB0aGUgdHV0b3JpYWwuCi0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliY3Vyc2VzLnRleCBiL0RvYy9saWIvbGliY3Vyc2VzLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNkZWE1YS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmN1cnNlcy50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDA1ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7Y3Vyc2VzfSAtLS0KLSAgICAgICAgIFRlcm1pbmFsIGhhbmRsaW5nIGZvciBjaGFyYWN0ZXItY2VsbCBkaXNwbGF5c30KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2N1cnNlc30KLVxzZWN0aW9uYXV0aG9ye01vc2hlIFphZGthfXttb3NoZXpAemFka2Euc2l0ZS5jby5pbH0KLVxzZWN0aW9uYXV0aG9ye0VyaWMgUmF5bW9uZH17ZXNyQHRoeXJzdXMuY29tfQotXG1vZHVsZXN5bm9wc2lze0FuIGludGVyZmFjZSB0byB0aGUgY3Vyc2VzIGxpYnJhcnksIHByb3ZpZGluZyBwb3J0YWJsZQotICAgICAgICAgICAgICAgIHRlcm1pbmFsIGhhbmRsaW5nLn0KLQotXHZlcnNpb25jaGFuZ2VkW0FkZGVkIHN1cHBvcnQgZm9yIHRoZSBcY29kZXtuY3Vyc2VzfSBsaWJyYXJ5IGFuZAotICAgICAgICAgICAgICAgIGNvbnZlcnRlZCB0byBhIHBhY2thZ2VdezEuNn0KLQotVGhlIFxtb2R1bGV7Y3Vyc2VzfSBtb2R1bGUgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIHRoZSBjdXJzZXMKLWxpYnJhcnksIHRoZSBkZS1mYWN0byBzdGFuZGFyZCBmb3IgcG9ydGFibGUgYWR2YW5jZWQgdGVybWluYWwKLWhhbmRsaW5nLgotCi1XaGlsZSBjdXJzZXMgaXMgbW9zdCB3aWRlbHkgdXNlZCBpbiB0aGUgXFVOSVh7fSBlbnZpcm9ubWVudCwgdmVyc2lvbnMKLWFyZSBhdmFpbGFibGUgZm9yIERPUywgT1MvMiwgYW5kIHBvc3NpYmx5IG90aGVyIHN5c3RlbXMgYXMgd2VsbC4gIFRoaXMKLWV4dGVuc2lvbiBtb2R1bGUgaXMgZGVzaWduZWQgdG8gbWF0Y2ggdGhlIEFQSSBvZiBuY3Vyc2VzLCBhbgotb3Blbi1zb3VyY2UgY3Vyc2VzIGxpYnJhcnkgaG9zdGVkIG9uIExpbnV4IGFuZCB0aGUgQlNEIHZhcmlhbnRzIG9mCi1cVU5JWC4KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWVtb2R1bGV7Y3Vyc2VzLmFzY2lpfXtVdGlsaXRpZXMgZm9yIHdvcmtpbmcgd2l0aCBcQVNDSUl7fQotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVycywgcmVnYXJkbGVzcyBvZiB5b3VyIGxvY2FsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MufQotICBcc2VlbW9kdWxle2N1cnNlcy5wYW5lbH17QSBwYW5lbCBzdGFjayBleHRlbnNpb24gdGhhdCBhZGRzIGRlcHRoIHRvIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc2VzIHdpbmRvd3MufQotICBcc2VlbW9kdWxle2N1cnNlcy50ZXh0cGFkfXtFZGl0YWJsZSB0ZXh0IHdpZGdldCBmb3IgY3Vyc2VzIHN1cHBvcnRpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxwcm9ncmFte0VtYWNzfS1saWtlIGJpbmRpbmdzLn0KLSAgXHNlZW1vZHVsZXtjdXJzZXMud3JhcHBlcn17Q29udmVuaWVuY2UgZnVuY3Rpb24gdG8gZW5zdXJlIHByb3BlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hbCBzZXR1cCBhbmQgcmVzZXR0aW5nIG9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGVudHJ5IGFuZCBleGl0Ln0KLSAgXHNlZXRpdGxlW2h0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvaG93dG8vY3Vyc2VzL2N1cnNlcy5odG1sXXtDdXJzZXMKLSAgICAgICAgICAgIFByb2dyYW1taW5nIHdpdGggUHl0aG9ufXtUdXRvcmlhbCBtYXRlcmlhbCBvbiB1c2luZyBjdXJzZXMKLSAgICAgICAgICAgIHdpdGggUHl0aG9uLCBieSBBbmRyZXcgS3VjaGxpbmcgYW5kIEVyaWMgUmF5bW9uZCwgaXMKLSAgICAgICAgICAgIGF2YWlsYWJsZSBvbiB0aGUgUHl0aG9uIFdlYiBzaXRlLn0KLSAgXHNlZXRleHR7VGhlIFxmaWxle0RlbW8vY3Vyc2VzL30gZGlyZWN0b3J5IGluIHRoZSBQeXRob24gc291cmNlCi0gICAgICAgICAgIGRpc3RyaWJ1dGlvbiBjb250YWlucyBzb21lIGV4YW1wbGUgcHJvZ3JhbXMgdXNpbmcgdGhlCi0gICAgICAgICAgIGN1cnNlcyBiaW5kaW5ncyBwcm92aWRlZCBieSB0aGlzIG1vZHVsZS59Ci1cZW5ke3NlZWFsc299Ci0KLQotXHN1YnNlY3Rpb257RnVuY3Rpb25zIFxsYWJlbHtjdXJzZXMtZnVuY3Rpb25zfX0KLQotVGhlIG1vZHVsZSBcbW9kdWxle2N1cnNlc30gZGVmaW5lcyB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbjoKLQotXGJlZ2lue2V4Y2Rlc2N9e2Vycm9yfQotRXhjZXB0aW9uIHJhaXNlZCB3aGVuIGEgY3Vyc2VzIGxpYnJhcnkgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvci4KLVxlbmR7ZXhjZGVzY30KLQotXG5vdGV7V2hlbmV2ZXIgXHZhcnt4fSBvciBcdmFye3l9IGFyZ3VtZW50cyB0byBhIGZ1bmN0aW9uCi1vciBhIG1ldGhvZCBhcmUgb3B0aW9uYWwsIHRoZXkgZGVmYXVsdCB0byB0aGUgY3VycmVudCBjdXJzb3IgbG9jYXRpb24uCi1XaGVuZXZlciBcdmFye2F0dHJ9IGlzIG9wdGlvbmFsLCBpdCBkZWZhdWx0cyB0byBcY29uc3RhbnR7QV9OT1JNQUx9Ln0KLQotVGhlIG1vZHVsZSBcbW9kdWxle2N1cnNlc30gZGVmaW5lcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKLQotXGJlZ2lue2Z1bmNkZXNjfXtiYXVkcmF0ZX17fQotUmV0dXJucyB0aGUgb3V0cHV0IHNwZWVkIG9mIHRoZSB0ZXJtaW5hbCBpbiBiaXRzIHBlciBzZWNvbmQuICBPbgotc29mdHdhcmUgdGVybWluYWwgZW11bGF0b3JzIGl0IHdpbGwgaGF2ZSBhIGZpeGVkIGhpZ2ggdmFsdWUuCi1JbmNsdWRlZCBmb3IgaGlzdG9yaWNhbCByZWFzb25zOyBpbiBmb3JtZXIgdGltZXMsIGl0IHdhcyB1c2VkIHRvIAotd3JpdGUgb3V0cHV0IGxvb3BzIGZvciB0aW1lIGRlbGF5cyBhbmQgb2NjYXNpb25hbGx5IHRvIGNoYW5nZQotaW50ZXJmYWNlcyBkZXBlbmRpbmcgb24gdGhlIGxpbmUgc3BlZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2JlZXB9e30KLUVtaXQgYSBzaG9ydCBhdHRlbnRpb24gc291bmQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2Nhbl9jaGFuZ2VfY29sb3J9e30KLVJldHVybnMgdHJ1ZSBvciBmYWxzZSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHByb2dyYW1tZXIgY2FuIGNoYW5nZQotdGhlIGNvbG9ycyBkaXNwbGF5ZWQgYnkgdGhlIHRlcm1pbmFsLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtjYnJlYWt9e30KLUVudGVyIGNicmVhayBtb2RlLiAgSW4gY2JyZWFrIG1vZGUgKHNvbWV0aW1lcyBjYWxsZWQgYGByYXJlJycgbW9kZSkKLW5vcm1hbCB0dHkgbGluZSBidWZmZXJpbmcgaXMgdHVybmVkIG9mZiBhbmQgY2hhcmFjdGVycyBhcmUgYXZhaWxhYmxlCi10byBiZSByZWFkIG9uZSBieSBvbmUuICBIb3dldmVyLCB1bmxpa2UgcmF3IG1vZGUsIHNwZWNpYWwgY2hhcmFjdGVycwotKGludGVycnVwdCwgcXVpdCwgc3VzcGVuZCwgYW5kIGZsb3cgY29udHJvbCkgcmV0YWluIHRoZWlyIGVmZmVjdHMgb24KLXRoZSB0dHkgZHJpdmVyIGFuZCBjYWxsaW5nIHByb2dyYW0uICBDYWxsaW5nIGZpcnN0IFxmdW5jdGlvbntyYXcoKX0KLXRoZW4gXGZ1bmN0aW9ue2NicmVhaygpfSBsZWF2ZXMgdGhlIHRlcm1pbmFsIGluIGNicmVhayBtb2RlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtjb2xvcl9jb250ZW50fXtjb2xvcl9udW1iZXJ9Ci1SZXR1cm5zIHRoZSBpbnRlbnNpdHkgb2YgdGhlIHJlZCwgZ3JlZW4sIGFuZCBibHVlIChSR0IpIGNvbXBvbmVudHMgaW4KLXRoZSBjb2xvciBcdmFye2NvbG9yX251bWJlcn0sIHdoaWNoIG11c3QgYmUgYmV0d2VlbiBcY29kZXswfSBhbmQKLVxjb25zdGFudHtDT0xPUlN9LiAgQSAzLXR1cGxlIGlzIHJldHVybmVkLCBjb250YWluaW5nIHRoZSBSLEcsQiB2YWx1ZXMKLWZvciB0aGUgZ2l2ZW4gY29sb3IsIHdoaWNoIHdpbGwgYmUgYmV0d2VlbiBcY29kZXswfSAobm8gY29tcG9uZW50KSBhbmQKLVxjb2RlezEwMDB9IChtYXhpbXVtIGFtb3VudCBvZiBjb21wb25lbnQpLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtjb2xvcl9wYWlyfXtjb2xvcl9udW1iZXJ9Ci1SZXR1cm5zIHRoZSBhdHRyaWJ1dGUgdmFsdWUgZm9yIGRpc3BsYXlpbmcgdGV4dCBpbiB0aGUgc3BlY2lmaWVkCi1jb2xvci4gIFRoaXMgYXR0cmlidXRlIHZhbHVlIGNhbiBiZSBjb21iaW5lZCB3aXRoCi1cY29uc3RhbnR7QV9TVEFORE9VVH0sIFxjb25zdGFudHtBX1JFVkVSU0V9LCBhbmQgdGhlIG90aGVyCi1cY29uc3RhbnR7QV8qfSBhdHRyaWJ1dGVzLiAgXGZ1bmN0aW9ue3BhaXJfbnVtYmVyKCl9IGlzIHRoZQotY291bnRlcnBhcnQgdG8gdGhpcyBmdW5jdGlvbi4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y3Vyc19zZXR9e3Zpc2liaWxpdHl9Ci1TZXRzIHRoZSBjdXJzb3Igc3RhdGUuICBcdmFye3Zpc2liaWxpdHl9IGNhbiBiZSBzZXQgdG8gMCwgMSwgb3IgMiwgZm9yCi1pbnZpc2libGUsIG5vcm1hbCwgb3IgdmVyeSB2aXNpYmxlLiAgSWYgdGhlIHRlcm1pbmFsIHN1cHBvcnRzIHRoZQotdmlzaWJpbGl0eSByZXF1ZXN0ZWQsIHRoZSBwcmV2aW91cyBjdXJzb3Igc3RhdGUgaXMgcmV0dXJuZWQ7Ci1vdGhlcndpc2UsIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQuICBPbiBtYW55IHRlcm1pbmFscywgdGhlIGBgdmlzaWJsZScnCi1tb2RlIGlzIGFuIHVuZGVybGluZSBjdXJzb3IgYW5kIHRoZSBgYHZlcnkgdmlzaWJsZScnIG1vZGUgaXMgYSBibG9jayBjdXJzb3IuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2RlZl9wcm9nX21vZGV9e30KLVNhdmVzIHRoZSBjdXJyZW50IHRlcm1pbmFsIG1vZGUgYXMgdGhlIGBgcHJvZ3JhbScnIG1vZGUsIHRoZSBtb2RlIHdoZW4KLXRoZSBydW5uaW5nIHByb2dyYW0gaXMgdXNpbmcgY3Vyc2VzLiAgKEl0cyBjb3VudGVycGFydCBpcyB0aGUKLWBgc2hlbGwnJyBtb2RlLCBmb3Igd2hlbiB0aGUgcHJvZ3JhbSBpcyBub3QgaW4gY3Vyc2VzLikgIFN1YnNlcXVlbnQgY2FsbHMKLXRvIFxmdW5jdGlvbntyZXNldF9wcm9nX21vZGUoKX0gd2lsbCByZXN0b3JlIHRoaXMgbW9kZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZGVmX3NoZWxsX21vZGV9e30KLVNhdmVzIHRoZSBjdXJyZW50IHRlcm1pbmFsIG1vZGUgYXMgdGhlIGBgc2hlbGwnJyBtb2RlLCB0aGUgbW9kZSB3aGVuCi10aGUgcnVubmluZyBwcm9ncmFtIGlzIG5vdCB1c2luZyBjdXJzZXMuICAoSXRzIGNvdW50ZXJwYXJ0IGlzIHRoZQotYGBwcm9ncmFtJycgbW9kZSwgd2hlbiB0aGUgcHJvZ3JhbSBpcyB1c2luZyBjdXJzZXMgY2FwYWJpbGl0aWVzLikKLVN1YnNlcXVlbnQgY2FsbHMKLXRvIFxmdW5jdGlvbntyZXNldF9zaGVsbF9tb2RlKCl9IHdpbGwgcmVzdG9yZSB0aGlzIG1vZGUuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2RlbGF5X291dHB1dH17bXN9Ci1JbnNlcnRzIGFuIFx2YXJ7bXN9IG1pbGxpc2Vjb25kIHBhdXNlIGluIG91dHB1dC4gIAotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtkb3VwZGF0ZX17fQotVXBkYXRlIHRoZSBwaHlzaWNhbCBzY3JlZW4uICBUaGUgY3Vyc2VzIGxpYnJhcnkga2VlcHMgdHdvIGRhdGEKLXN0cnVjdHVyZXMsIG9uZSByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgcGh5c2ljYWwgc2NyZWVuIGNvbnRlbnRzCi1hbmQgYSB2aXJ0dWFsIHNjcmVlbiByZXByZXNlbnRpbmcgdGhlIGRlc2lyZWQgbmV4dCBzdGF0ZS4gIFRoZQotXGZ1bmN0aW9ue2RvdXBkYXRlKCl9IGdyb3VuZCB1cGRhdGVzIHRoZSBwaHlzaWNhbCBzY3JlZW4gdG8gbWF0Y2ggdGhlCi12aXJ0dWFsIHNjcmVlbi4KLQotVGhlIHZpcnR1YWwgc2NyZWVuIG1heSBiZSB1cGRhdGVkIGJ5IGEgXG1ldGhvZHtub3V0cmVmcmVzaCgpfSBjYWxsCi1hZnRlciB3cml0ZSBvcGVyYXRpb25zIHN1Y2ggYXMgXG1ldGhvZHthZGRzdHIoKX0gaGF2ZSBiZWVuIHBlcmZvcm1lZAotb24gYSB3aW5kb3cuICBUaGUgbm9ybWFsIFxtZXRob2R7cmVmcmVzaCgpfSBjYWxsIGlzIHNpbXBseQotXG1ldGhvZHtub3V0cmVmcmVzaCgpfSBmb2xsb3dlZCBieSBcZnVuY3Rpb257ZG91cGRhdGUoKX07IGlmIHlvdSBoYXZlCi10byB1cGRhdGUgbXVsdGlwbGUgd2luZG93cywgeW91IGNhbiBzcGVlZCBwZXJmb3JtYW5jZSBhbmQgcGVyaGFwcwotcmVkdWNlIHNjcmVlbiBmbGlja2VyIGJ5IGlzc3VpbmcgXG1ldGhvZHtub3V0cmVmcmVzaCgpfSBjYWxscyBvbgotYWxsIHdpbmRvd3MsIGZvbGxvd2VkIGJ5IGEgc2luZ2xlIFxmdW5jdGlvbntkb3VwZGF0ZSgpfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZWNob317fQotRW50ZXIgZWNobyBtb2RlLiAgSW4gZWNobyBtb2RlLCBlYWNoIGNoYXJhY3RlciBpbnB1dCBpcyBlY2hvZWQgdG8gdGhlCi1zY3JlZW4gYXMgaXQgaXMgZW50ZXJlZC4gIAotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtlbmR3aW59e30KLURlLWluaXRpYWxpemUgdGhlIGxpYnJhcnksIGFuZCByZXR1cm4gdGVybWluYWwgdG8gbm9ybWFsIHN0YXR1cy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZXJhc2VjaGFyfXt9Ci1SZXR1cm5zIHRoZSB1c2VyJ3MgY3VycmVudCBlcmFzZSBjaGFyYWN0ZXIuICBVbmRlciBcVU5JWHt9IG9wZXJhdGluZwotc3lzdGVtcyB0aGlzIGlzIGEgcHJvcGVydHkgb2YgdGhlIGNvbnRyb2xsaW5nIHR0eSBvZiB0aGUgY3Vyc2VzCi1wcm9ncmFtLCBhbmQgaXMgbm90IHNldCBieSB0aGUgY3Vyc2VzIGxpYnJhcnkgaXRzZWxmLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtmaWx0ZXJ9e30KLVRoZSBcZnVuY3Rpb257ZmlsdGVyKCl9IHJvdXRpbmUsIGlmIHVzZWQsIG11c3QgYmUgY2FsbGVkIGJlZm9yZQotXGZ1bmN0aW9ue2luaXRzY3IoKX0gaXMgIGNhbGxlZC4gIFRoZSBlZmZlY3QgaXMgdGhhdCwgZHVyaW5nIHRob3NlCi1jYWxscywgTElORVMgaXMgc2V0IHRvIDE7IHRoZSBjYXBhYmlsaXRpZXMgY2xlYXIsIGN1cCwgY3VkLCBjdWQxLAotY3V1MSwgY3V1LCB2cGEgYXJlIGRpc2FibGVkOyBhbmQgdGhlIGhvbWUgc3RyaW5nIGlzIHNldCB0byB0aGUgdmFsdWUgb2YgY3IuCi1UaGUgZWZmZWN0IGlzIHRoYXQgdGhlIGN1cnNvciBpcyBjb25maW5lZCB0byB0aGUgY3VycmVudCBsaW5lLCBhbmQgc28KLWFyZSBzY3JlZW4gdXBkYXRlcy4gIFRoaXMgbWF5IGJlIHVzZWQgZm9yIGVuYWJsaW5nIGNoYXJhY3Rlci1hdC1hLXRpbWUgCi1saW5lIGVkaXRpbmcgd2l0aG91dCB0b3VjaGluZyB0aGUgcmVzdCBvZiB0aGUgc2NyZWVuLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtmbGFzaH17fQotRmxhc2ggdGhlIHNjcmVlbi4gIFRoYXQgaXMsIGNoYW5nZSBpdCB0byByZXZlcnNlLXZpZGVvIGFuZCB0aGVuIGNoYW5nZQotaXQgYmFjayBpbiBhIHNob3J0IGludGVydmFsLiAgU29tZSBwZW9wbGUgcHJlZmVyIHN1Y2ggYXMgYHZpc2libGUgYmVsbCcKLXRvIHRoZSBhdWRpYmxlIGF0dGVudGlvbiBzaWduYWwgcHJvZHVjZWQgYnkgXGZ1bmN0aW9ue2JlZXAoKX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2ZsdXNoaW5wfXt9Ci1GbHVzaCBhbGwgaW5wdXQgYnVmZmVycy4gIFRoaXMgdGhyb3dzIGF3YXkgYW55ICB0eXBlYWhlYWQgIHRoYXQgIGhhcwotYmVlbiB0eXBlZCBieSB0aGUgdXNlciBhbmQgaGFzIG5vdCB5ZXQgYmVlbiBwcm9jZXNzZWQgYnkgdGhlIHByb2dyYW0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldG1vdXNlfXt9Ci1BZnRlciBcbWV0aG9ke2dldGNoKCl9IHJldHVybnMgXGNvbnN0YW50e0tFWV9NT1VTRX0gdG8gc2lnbmFsIGEgbW91c2UKLWV2ZW50LCB0aGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbCB0byByZXRyaWV2ZSB0aGUgcXVldWVkIG1vdXNlIGV2ZW50LAotcmVwcmVzZW50ZWQgYXMgYSA1LXR1cGxlCi1cY29kZXsoXHZhcntpZH0sIFx2YXJ7eH0sIFx2YXJ7eX0sIFx2YXJ7en0sIFx2YXJ7YnN0YXRlfSl9LgotXHZhcntpZH0gaXMgYW4gSUQgdmFsdWUgdXNlZCB0byBkaXN0aW5ndWlzaCBtdWx0aXBsZSBkZXZpY2VzLAotYW5kIFx2YXJ7eH0sIFx2YXJ7eX0sIFx2YXJ7en0gYXJlIHRoZSBldmVudCdzIGNvb3JkaW5hdGVzLiAgKFx2YXJ7en0KLWlzIGN1cnJlbnRseSB1bnVzZWQuKS4gIFx2YXJ7YnN0YXRlfSBpcyBhbiBpbnRlZ2VyIHZhbHVlIHdob3NlIGJpdHMKLXdpbGwgYmUgc2V0IHRvIGluZGljYXRlIHRoZSB0eXBlIG9mIGV2ZW50LCBhbmQgd2lsbCBiZSB0aGUgYml0d2lzZSBPUgotb2Ygb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBjb25zdGFudHMsIHdoZXJlIFx2YXJ7bn0gaXMgdGhlIGJ1dHRvbgotbnVtYmVyIGZyb20gMSB0byA0OgotXGNvbnN0YW50e0JVVFRPTlx2YXJ7bn1fUFJFU1NFRH0sCi1cY29uc3RhbnR7QlVUVE9OXHZhcntufV9SRUxFQVNFRH0sCi1cY29uc3RhbnR7QlVUVE9OXHZhcntufV9DTElDS0VEfSwKLVxjb25zdGFudHtCVVRUT05cdmFye259X0RPVUJMRV9DTElDS0VEfSwKLVxjb25zdGFudHtCVVRUT05cdmFye259X1RSSVBMRV9DTElDS0VEfSwKLVxjb25zdGFudHtCVVRUT05fU0hJRlR9LAotXGNvbnN0YW50e0JVVFRPTl9DVFJMfSwKLVxjb25zdGFudHtCVVRUT05fQUxUfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0c3l4fXt9Ci1SZXR1cm5zIHRoZSBjdXJyZW50IGNvb3JkaW5hdGVzIG9mIHRoZSB2aXJ0dWFsIHNjcmVlbiBjdXJzb3IgaW4geSBhbmQKLXguICBJZiBsZWF2ZW9rIGlzIGN1cnJlbnRseSB0cnVlLCB0aGVuIC0xLC0xIGlzIHJldHVybmVkLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXR3aW59e2ZpbGV9Ci1SZWFkcyB3aW5kb3cgcmVsYXRlZCBkYXRhIHN0b3JlZCBpbiB0aGUgZmlsZSBieSBhbiBlYXJsaWVyCi1cZnVuY3Rpb257cHV0d2luKCl9IGNhbGwuICBUaGUgcm91dGluZSB0aGVuIGNyZWF0ZXMgYW5kIGluaXRpYWxpemVzIGEKLW5ldyB3aW5kb3cgdXNpbmcgdGhhdCBkYXRhLCByZXR1cm5pbmcgdGhlIG5ldyB3aW5kb3cgb2JqZWN0LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtoYXNfY29sb3JzfXt9Ci1SZXR1cm5zIHRydWUgaWYgdGhlIHRlcm1pbmFsIGNhbiBkaXNwbGF5IGNvbG9yczsgb3RoZXJ3aXNlLCBpdAotcmV0dXJucyBmYWxzZS4gCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2hhc19pY317fQotUmV0dXJucyB0cnVlIGlmIHRoZSB0ZXJtaW5hbCBoYXMgaW5zZXJ0LSBhbmQgZGVsZXRlLSBjaGFyYWN0ZXIKLWNhcGFiaWxpdGllcy4gIFRoaXMgZnVuY3Rpb24gaXMgaW5jbHVkZWQgZm9yIGhpc3RvcmljYWwgcmVhc29ucyBvbmx5LAotYXMgYWxsIG1vZGVybiBzb2Z0d2FyZSB0ZXJtaW5hbCBlbXVsYXRvcnMgaGF2ZSBzdWNoIGNhcGFiaWxpdGllcy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aGFzX2lsfXt9Ci1SZXR1cm5zIHRydWUgaWYgdGhlIHRlcm1pbmFsIGhhcyBpbnNlcnQtIGFuZAotZGVsZXRlLWxpbmUgIGNhcGFiaWxpdGllcywgIG9yICBjYW4gIHNpbXVsYXRlICB0aGVtICB1c2luZwotc2Nyb2xsaW5nIHJlZ2lvbnMuIFRoaXMgZnVuY3Rpb24gaXMgaW5jbHVkZWQgZm9yIGhpc3RvcmljYWwgcmVhc29ucyBvbmx5LAotYXMgYWxsIG1vZGVybiBzb2Z0d2FyZSB0ZXJtaW5hbCBlbXVsYXRvcnMgaGF2ZSBzdWNoIGNhcGFiaWxpdGllcy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aGFzX2tleX17Y2h9Ci1UYWtlcyBhIGtleSB2YWx1ZSBcdmFye2NofSwgYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCB0ZXJtaW5hbAotdHlwZSByZWNvZ25pemVzIGEga2V5IHdpdGggdGhhdCB2YWx1ZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aGFsZmRlbGF5fXt0ZW50aHN9Ci1Vc2VkIGZvciBoYWxmLWRlbGF5IG1vZGUsIHdoaWNoIGlzIHNpbWlsYXIgdG8gY2JyZWFrIG1vZGUgaW4gdGhhdAotY2hhcmFjdGVycyB0eXBlZCBieSB0aGUgdXNlciBhcmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIHRoZSBwcm9ncmFtLgotSG93ZXZlciwgYWZ0ZXIgYmxvY2tpbmcgZm9yIFx2YXJ7dGVudGhzfSB0ZW50aHMgb2Ygc2Vjb25kcywgYW4KLWV4Y2VwdGlvbiBpcyByYWlzZWQgaWYgbm90aGluZyBoYXMgYmVlbiB0eXBlZC4gIFRoZSB2YWx1ZSBvZgotXHZhcnt0ZW50aHN9IG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAxIGFuZCAyNTUuICBVc2UKLVxmdW5jdGlvbntub2NicmVhaygpfSB0byBsZWF2ZSBoYWxmLWRlbGF5IG1vZGUuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2luaXRfY29sb3J9e2NvbG9yX251bWJlciwgciwgZywgYn0KLUNoYW5nZXMgdGhlIGRlZmluaXRpb24gb2YgYSBjb2xvciwgdGFraW5nIHRoZSBudW1iZXIgb2YgdGhlIGNvbG9yIHRvCi1iZSBjaGFuZ2VkIGZvbGxvd2VkIGJ5IHRocmVlIFJHQiB2YWx1ZXMgKGZvciB0aGUgYW1vdW50cyBvZiByZWQsCi1ncmVlbiwgYW5kIGJsdWUgY29tcG9uZW50cykuICBUaGUgdmFsdWUgb2YgXHZhcntjb2xvcl9udW1iZXJ9IG11c3QgYmUKLWJldHdlZW4gXGNvZGV7MH0gYW5kIFxjb25zdGFudHtDT0xPUlN9LiAgRWFjaCBvZiBcdmFye3J9LCBcdmFye2d9LAotXHZhcntifSwgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gXGNvZGV7MH0gYW5kIFxjb2RlezEwMDB9LiAgV2hlbgotXGZ1bmN0aW9ue2luaXRfY29sb3IoKX0gaXMgdXNlZCwgYWxsIG9jY3VycmVuY2VzIG9mIHRoYXQgY29sb3Igb24gdGhlCi1zY3JlZW4gaW1tZWRpYXRlbHkgY2hhbmdlIHRvIHRoZSBuZXcgZGVmaW5pdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgYQotbm8tb3Agb24gbW9zdCB0ZXJtaW5hbHM7IGl0IGlzIGFjdGl2ZSBvbmx5IGlmCi1cZnVuY3Rpb257Y2FuX2NoYW5nZV9jb2xvcigpfSByZXR1cm5zIFxjb2RlezF9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpbml0X3BhaXJ9e3BhaXJfbnVtYmVyLCBmZywgYmd9Ci1DaGFuZ2VzIHRoZSBkZWZpbml0aW9uIG9mIGEgY29sb3ItcGFpci4gIEl0IHRha2VzIHRocmVlIGFyZ3VtZW50czogdGhlCi1udW1iZXIgb2YgdGhlIGNvbG9yLXBhaXIgdG8gYmUgY2hhbmdlZCwgdGhlIGZvcmVncm91bmQgY29sb3IgbnVtYmVyLAotYW5kIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG51bWJlci4gIFRoZSB2YWx1ZSBvZiBcdmFye3BhaXJfbnVtYmVyfSBtdXN0Ci1iZSBiZXR3ZWVuIFxjb2RlezF9IGFuZCBcY29kZXtDT0xPUl9QQUlSUyAtIDF9ICh0aGUgXGNvZGV7MH0gY29sb3IKLXBhaXIgaXMgd2lyZWQgdG8gd2hpdGUgb24gYmxhY2sgYW5kIGNhbm5vdCBiZSBjaGFuZ2VkKS4gIFRoZSB2YWx1ZSBvZgotXHZhcntmZ30gYW5kIFx2YXJ7Ymd9IGFyZ3VtZW50cyBtdXN0IGJlIGJldHdlZW4gXGNvZGV7MH0gYW5kCi1cY29uc3RhbnR7Q09MT1JTfS4gIElmIHRoZSBjb2xvci1wYWlyIHdhcyBwcmV2aW91c2x5IGluaXRpYWxpemVkLCB0aGUKLXNjcmVlbiBpcyByZWZyZXNoZWQgYW5kIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGF0IGNvbG9yLXBhaXIgYXJlIGNoYW5nZWQKLXRvIHRoZSBuZXcgZGVmaW5pdGlvbi4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aW5pdHNjcn17fQotSW5pdGlhbGl6ZSB0aGUgbGlicmFyeS4gUmV0dXJucyBhIFxjbGFzc3tXaW5kb3dPYmplY3R9IHdoaWNoIHJlcHJlc2VudHMKLXRoZSB3aG9sZSBzY3JlZW4uICBcbm90ZXtJZiB0aGVyZSBpcyBhbiBlcnJvciBvcGVuaW5nIHRoZSB0ZXJtaW5hbCwKLXRoZSB1bmRlcmx5aW5nIGN1cnNlcyBsaWJyYXJ5IG1heSBjYXVzZSB0aGUgaW50ZXJwcmV0ZXIgdG8gZXhpdC59Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2lzZW5kd2lufXt9Ci1SZXR1cm5zIHRydWUgaWYgXGZ1bmN0aW9ue2VuZHdpbigpfSBoYXMgYmVlbiBjYWxsZWQgKHRoYXQgaXMsIHRoZSAKLWN1cnNlcyBsaWJyYXJ5IGhhcyBiZWVuIGRlaW5pdGlhbGl6ZWQpLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtrZXluYW1lfXtrfQotUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBrZXkgbnVtYmVyZWQgXHZhcntrfS4gIFRoZSBuYW1lIG9mIGEga2V5Ci1nZW5lcmF0aW5nIHByaW50YWJsZSBBU0NJSSBjaGFyYWN0ZXIgaXMgdGhlIGtleSdzIGNoYXJhY3Rlci4gIFRoZSBuYW1lCi1vZiBhIGNvbnRyb2wta2V5IGNvbWJpbmF0aW9uIGlzIGEgdHdvLWNoYXJhY3RlciBzdHJpbmcgY29uc2lzdGluZyBvZiBhCi1jYXJldCBmb2xsb3dlZCBieSB0aGUgY29ycmVzcG9uZGluZyBwcmludGFibGUgQVNDSUkgY2hhcmFjdGVyLiAgVGhlCi1uYW1lIG9mIGFuIGFsdC1rZXkgY29tYmluYXRpb24gKDEyOC0yNTUpIGlzIGEgc3RyaW5nIGNvbnNpc3Rpbmcgb2YgdGhlCi1wcmVmaXggYE0tJyBmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiB0aGUgY29ycmVzcG9uZGluZyBBU0NJSSBjaGFyYWN0ZXIuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2tpbGxjaGFyfXt9Ci1SZXR1cm5zIHRoZSB1c2VyJ3MgY3VycmVudCBsaW5lIGtpbGwgY2hhcmFjdGVyLiBVbmRlciBcVU5JWHt9IG9wZXJhdGluZwotc3lzdGVtcyB0aGlzIGlzIGEgcHJvcGVydHkgb2YgdGhlIGNvbnRyb2xsaW5nIHR0eSBvZiB0aGUgY3Vyc2VzCi1wcm9ncmFtLCBhbmQgaXMgbm90IHNldCBieSB0aGUgY3Vyc2VzIGxpYnJhcnkgaXRzZWxmLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtsb25nbmFtZX17fQotUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIHRoZSB0ZXJtaW5mbyBsb25nIG5hbWUgZmllbGQgZGVzY3JpYmluZyB0aGUgY3VycmVudAotdGVybWluYWwuICBUaGUgbWF4aW11bSBsZW5ndGggb2YgYSB2ZXJib3NlIGRlc2NyaXB0aW9uIGlzIDEyOAotY2hhcmFjdGVycy4gIEl0IGlzIGRlZmluZWQgb25seSBhZnRlciB0aGUgY2FsbCB0bwotXGZ1bmN0aW9ue2luaXRzY3IoKX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e21ldGF9e3llc30KLUlmIFx2YXJ7eWVzfSBpcyAxLCBhbGxvdyA4LWJpdCBjaGFyYWN0ZXJzIHRvIGJlIGlucHV0LiBJZiBcdmFye3llc30gaXMgMCwgCi1hbGxvdyBvbmx5IDctYml0IGNoYXJzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXttb3VzZWludGVydmFsfXtpbnRlcnZhbH0KLVNldHMgdGhlIG1heGltdW0gdGltZSBpbiBtaWxsaXNlY29uZHMgdGhhdCBjYW4gZWxhcHNlIGJldHdlZW4gcHJlc3MgYW5kCi1yZWxlYXNlIGV2ZW50cyBpbiBvcmRlciBmb3IgdGhlbSB0byBiZSByZWNvZ25pemVkIGFzIGEgY2xpY2ssIGFuZAotcmV0dXJucyB0aGUgcHJldmlvdXMgaW50ZXJ2YWwgdmFsdWUuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAyMDAgbXNlYywKLW9yIG9uZSBmaWZ0aCBvZiBhIHNlY29uZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bW91c2VtYXNrfXttb3VzZW1hc2t9Ci1TZXRzIHRoZSBtb3VzZSBldmVudHMgdG8gYmUgcmVwb3J0ZWQsIGFuZCByZXR1cm5zIGEgdHVwbGUKLVxjb2RleyhcdmFye2F2YWlsbWFza30sIFx2YXJ7b2xkbWFza30pfS4gIAotXHZhcnthdmFpbG1hc2t9IGluZGljYXRlcyB3aGljaCBvZiB0aGUKLXNwZWNpZmllZCBtb3VzZSBldmVudHMgY2FuIGJlIHJlcG9ydGVkOyBvbiBjb21wbGV0ZSBmYWlsdXJlIGl0IHJldHVybnMKLTAuICBcdmFye29sZG1hc2t9IGlzIHRoZSBwcmV2aW91cyB2YWx1ZSBvZiB0aGUgZ2l2ZW4gd2luZG93J3MgbW91c2UKLWV2ZW50IG1hc2suICBJZiB0aGlzIGZ1bmN0aW9uIGlzIG5ldmVyIGNhbGxlZCwgbm8gbW91c2UgZXZlbnRzIGFyZQotZXZlciByZXBvcnRlZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bmFwbXN9e21zfQotU2xlZXAgZm9yIFx2YXJ7bXN9IG1pbGxpc2Vjb25kcy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bmV3cGFkfXtubGluZXMsIG5jb2xzfQotQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBuZXcgcGFkIGRhdGEgc3RydWN0dXJlIHdpdGggdGhlCi1naXZlbiBudW1iZXIgb2YgbGluZXMgYW5kIGNvbHVtbnMuICBBIHBhZCBpcyByZXR1cm5lZCBhcyBhCi13aW5kb3cgb2JqZWN0LgotCi1BIHBhZCBpcyBsaWtlIGEgd2luZG93LCBleGNlcHQgdGhhdCBpdCBpcyBub3QgcmVzdHJpY3RlZCBieSB0aGUgc2NyZWVuCi1zaXplLCBhbmQgaXMgbm90IG5lY2Vzc2FyaWx5IGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgcGFydCBvZiB0aGUKLXNjcmVlbi4gIFBhZHMgY2FuIGJlIHVzZWQgd2hlbiBhIGxhcmdlIHdpbmRvdyBpcyBuZWVkZWQsIGFuZCBvbmx5IGEKLXBhcnQgb2YgdGhlIHdpbmRvdyB3aWxsIGJlIG9uIHRoZSBzY3JlZW4gYXQgb25lIHRpbWUuICBBdXRvbWF0aWMKLXJlZnJlc2hlcyBvZiBwYWRzIChzdWNoIGFzIGZyb20gc2Nyb2xsaW5nIG9yIGVjaG9pbmcgb2YgaW5wdXQpIGRvIG5vdAotb2NjdXIuICBUaGUgXG1ldGhvZHtyZWZyZXNoKCl9IGFuZCBcbWV0aG9ke25vdXRyZWZyZXNoKCl9IG1ldGhvZHMgb2YgYQotcGFkIHJlcXVpcmUgNiBhcmd1bWVudHMgdG8gc3BlY2lmeSB0aGUgcGFydCBvZiB0aGUgcGFkIHRvIGJlCi1kaXNwbGF5ZWQgYW5kIHRoZSBsb2NhdGlvbiBvbiB0aGUgc2NyZWVuIHRvIGJlIHVzZWQgZm9yIHRoZSBkaXNwbGF5LgotVGhlIGFyZ3VtZW50cyBhcmUgcG1pbnJvdywgcG1pbmNvbCwgc21pbnJvdywgc21pbmNvbCwgc21heHJvdywKLXNtYXhjb2w7IHRoZSBwIGFyZ3VtZW50cyByZWZlciB0byB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHBhZAotcmVnaW9uIHRvIGJlIGRpc3BsYXllZCBhbmQgdGhlIHMgYXJndW1lbnRzIGRlZmluZSBhIGNsaXBwaW5nIGJveCBvbgotdGhlIHNjcmVlbiB3aXRoaW4gd2hpY2ggdGhlIHBhZCByZWdpb24gaXMgdG8gYmUgZGlzcGxheWVkLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtuZXd3aW59e1xvcHRpb25hbHtubGluZXMsIG5jb2xzLH0gYmVnaW5feSwgYmVnaW5feH0KLVJldHVybiBhIG5ldyB3aW5kb3csIHdob3NlIGxlZnQtdXBwZXIgY29ybmVyIGlzIGF0IAotXGNvZGV7KFx2YXJ7YmVnaW5feX0sIFx2YXJ7YmVnaW5feH0pfSwgYW5kIHdob3NlIGhlaWdodC93aWR0aCBpcyAKLVx2YXJ7bmxpbmVzfS9cdmFye25jb2xzfS4gIAotCi1CeSBkZWZhdWx0LCB0aGUgd2luZG93IHdpbGwgZXh0ZW5kIGZyb20gdGhlIAotc3BlY2lmaWVkIHBvc2l0aW9uIHRvIHRoZSBsb3dlciByaWdodCBjb3JuZXIgb2YgdGhlIHNjcmVlbi4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bmx9e30KLUVudGVyIG5ld2xpbmUgbW9kZS4gIFRoaXMgbW9kZSB0cmFuc2xhdGVzIHRoZSByZXR1cm4ga2V5IGludG8gbmV3bGluZQotb24gaW5wdXQsIGFuZCB0cmFuc2xhdGVzIG5ld2xpbmUgaW50byByZXR1cm4gYW5kIGxpbmUtZmVlZCBvbiBvdXRwdXQuCi1OZXdsaW5lIG1vZGUgaXMgaW5pdGlhbGx5IG9uLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtub2NicmVha317fQotTGVhdmUgY2JyZWFrIG1vZGUuICBSZXR1cm4gdG8gbm9ybWFsIGBgY29va2VkJycgbW9kZSB3aXRoIGxpbmUgYnVmZmVyaW5nLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtub2VjaG99e30KLUxlYXZlIGVjaG8gbW9kZS4gIEVjaG9pbmcgb2YgaW5wdXQgY2hhcmFjdGVycyBpcyB0dXJuZWQgb2ZmLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtub25sfXt9Ci1MZWF2ZSBuZXdsaW5lIG1vZGUuICBEaXNhYmxlIHRyYW5zbGF0aW9uIG9mIHJldHVybiBpbnRvIG5ld2xpbmUgb24KLWlucHV0LCBhbmQgZGlzYWJsZSBsb3ctbGV2ZWwgdHJhbnNsYXRpb24gb2YgbmV3bGluZSBpbnRvCi1uZXdsaW5lL3JldHVybiBvbiBvdXRwdXQgKGJ1dCB0aGlzIGRvZXMgbm90IGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YKLVxjb2Rle2FkZGNoKCdcZSBuJyl9LCB3aGljaCBhbHdheXMgZG9lcyB0aGUgZXF1aXZhbGVudCBvZiByZXR1cm4gYW5kCi1saW5lIGZlZWQgb24gdGhlIHZpcnR1YWwgc2NyZWVuKS4gIFdpdGggdHJhbnNsYXRpb24gb2ZmLCBjdXJzZXMgY2FuCi1zb21ldGltZXMgc3BlZWQgdXAgdmVydGljYWwgbW90aW9uIGEgbGl0dGxlOyBhbHNvLCBpdCB3aWxsIGJlIGFibGUgdG8KLWRldGVjdCB0aGUgcmV0dXJuIGtleSBvbiBpbnB1dC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bm9xaWZsdXNofXt9Ci1XaGVuIHRoZSBub3FpZmx1c2ggcm91dGluZSBpcyB1c2VkLCBub3JtYWwgZmx1c2ggb2YgaW5wdXQgYW5kCi1vdXRwdXQgcXVldWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSU5UUiwgUVVJVCBhbmQgU1VTUAotY2hhcmFjdGVycyB3aWxsIG5vdCBiZSBkb25lLiAgWW91IG1heSB3YW50IHRvIGNhbGwKLVxmdW5jdGlvbntub3FpZmx1c2goKX0gaW4gYSBzaWduYWwgaGFuZGxlciBpZiB5b3Ugd2FudCBvdXRwdXQKLXRvIGNvbnRpbnVlIGFzIHRob3VnaCB0aGUgaW50ZXJydXB0IGhhZCBub3Qgb2NjdXJyZWQsIGFmdGVyIHRoZQotaGFuZGxlciBleGl0cy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bm9yYXd9e30KLUxlYXZlIHJhdyBtb2RlLiBSZXR1cm4gdG8gbm9ybWFsIGBgY29va2VkJycgbW9kZSB3aXRoIGxpbmUgYnVmZmVyaW5nLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtwYWlyX2NvbnRlbnR9e3BhaXJfbnVtYmVyfQotUmV0dXJucyBhIHR1cGxlIFxjb2RleyhcdmFye2ZnfSwgXHZhcntiZ30pfSBjb250YWluaW5nIHRoZSBjb2xvcnMgZm9yCi10aGUgcmVxdWVzdGVkIGNvbG9yIHBhaXIuICBUaGUgdmFsdWUgb2YgXHZhcntwYWlyX251bWJlcn0gbXVzdCBiZQotYmV0d2VlbiBcY29kZXsxfSBhbmQgXGNvZGV7XGNvbnN0YW50e0NPTE9SX1BBSVJTfSAtIDF9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtwYWlyX251bWJlcn17YXR0cn0KLVJldHVybnMgdGhlIG51bWJlciBvZiB0aGUgY29sb3ItcGFpciBzZXQgYnkgdGhlIGF0dHJpYnV0ZSB2YWx1ZQotXHZhcnthdHRyfS4gIFxmdW5jdGlvbntjb2xvcl9wYWlyKCl9IGlzIHRoZSBjb3VudGVycGFydCB0byB0aGlzCi1mdW5jdGlvbi4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cHV0cH17c3RyaW5nfQotRXF1aXZhbGVudCB0byBcY29kZXt0cHV0cyhzdHIsIDEsIHB1dGNoYXIpfTsgZW1pdHMgdGhlIHZhbHVlIG9mIGEKLXNwZWNpZmllZCB0ZXJtaW5mbyBjYXBhYmlsaXR5IGZvciB0aGUgY3VycmVudCB0ZXJtaW5hbC4gIE5vdGUgdGhhdCB0aGUKLW91dHB1dCBvZiBwdXRwIGFsd2F5cyBnb2VzIHRvIHN0YW5kYXJkIG91dHB1dC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cWlmbHVzaH17IFxvcHRpb25hbHtmbGFnfSB9Ci1JZiBcdmFye2ZsYWd9IGlzIGZhbHNlLCB0aGUgZWZmZWN0IGlzIHRoZSBzYW1lIGFzIGNhbGxpbmcKLVxmdW5jdGlvbntub3FpZmx1c2goKX0uIElmIFx2YXJ7ZmxhZ30gaXMgdHJ1ZSwgb3Igbm8gYXJndW1lbnQgaXMKLXByb3ZpZGVkLCB0aGUgcXVldWVzIHdpbGwgYmUgZmx1c2hlZCB3aGVuIHRoZXNlIGNvbnRyb2wgY2hhcmFjdGVycyBhcmUKLXJlYWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3Jhd317fQotRW50ZXIgcmF3IG1vZGUuICBJbiByYXcgbW9kZSwgbm9ybWFsIGxpbmUgYnVmZmVyaW5nIGFuZCAKLXByb2Nlc3Npbmcgb2YgaW50ZXJydXB0LCBxdWl0LCBzdXNwZW5kLCBhbmQgZmxvdyBjb250cm9sIGtleXMgYXJlCi10dXJuZWQgb2ZmOyBjaGFyYWN0ZXJzIGFyZSBwcmVzZW50ZWQgdG8gY3Vyc2VzIGlucHV0IGZ1bmN0aW9ucyBvbmUKLWJ5IG9uZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cmVzZXRfcHJvZ19tb2RlfXt9Ci1SZXN0b3JlcyB0aGUgIHRlcm1pbmFsICB0byBgYHByb2dyYW0nJyBtb2RlLCBhcyBwcmV2aW91c2x5IHNhdmVkIAotYnkgXGZ1bmN0aW9ue2RlZl9wcm9nX21vZGUoKX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3Jlc2V0X3NoZWxsX21vZGV9e30KLVJlc3RvcmVzIHRoZSAgdGVybWluYWwgIHRvIGBgc2hlbGwnJyBtb2RlLCBhcyBwcmV2aW91c2x5IHNhdmVkIAotYnkgXGZ1bmN0aW9ue2RlZl9zaGVsbF9tb2RlKCl9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzZXRzeXh9e3ksIHh9Ci1TZXRzIHRoZSB2aXJ0dWFsIHNjcmVlbiBjdXJzb3IgdG8gXHZhcnt5fSwgXHZhcnt4fS4KLUlmIFx2YXJ7eX0gYW5kIFx2YXJ7eH0gYXJlIGJvdGggLTEsIHRoZW4gbGVhdmVvayBpcyBzZXQuICAKLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c2V0dXB0ZXJtfXtcb3B0aW9uYWx7dGVybXN0ciwgZmR9fQotSW5pdGlhbGl6ZXMgdGhlIHRlcm1pbmFsLiAgXHZhcnt0ZXJtc3RyfSBpcyBhIHN0cmluZyBnaXZpbmcgdGhlCi10ZXJtaW5hbCBuYW1lOyBpZiBvbWl0dGVkLCB0aGUgdmFsdWUgb2YgdGhlIFRFUk0gZW52aXJvbm1lbnQgdmFyaWFibGUKLXdpbGwgYmUgdXNlZC4gIFx2YXJ7ZmR9IGlzIHRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gd2hpY2ggYW55Ci1pbml0aWFsaXphdGlvbiBzZXF1ZW5jZXMgd2lsbCBiZSBzZW50OyBpZiBub3Qgc3VwcGxpZWQsIHRoZSBmaWxlCi1kZXNjcmlwdG9yIGZvciBcY29kZXtzeXMuc3Rkb3V0fSB3aWxsIGJlIHVzZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3N0YXJ0X2NvbG9yfXt9Ci1NdXN0IGJlIGNhbGxlZCBpZiB0aGUgcHJvZ3JhbW1lciB3YW50cyB0byB1c2UgY29sb3JzLCBhbmQgYmVmb3JlIGFueQotb3RoZXIgY29sb3IgbWFuaXB1bGF0aW9uIHJvdXRpbmUgaXMgY2FsbGVkLiAgSXQgaXMgZ29vZAotcHJhY3RpY2UgdG8gY2FsbCB0aGlzIHJvdXRpbmUgcmlnaHQgYWZ0ZXIgXGZ1bmN0aW9ue2luaXRzY3IoKX0uCi0KLVxmdW5jdGlvbntzdGFydF9jb2xvcigpfSBpbml0aWFsaXplcyBlaWdodCBiYXNpYyBjb2xvcnMgKGJsYWNrLCByZWQsIAotZ3JlZW4sIHllbGxvdywgYmx1ZSwgbWFnZW50YSwgY3lhbiwgYW5kIHdoaXRlKSwgYW5kIHR3byBnbG9iYWwKLXZhcmlhYmxlcyBpbiB0aGUgXG1vZHVsZXtjdXJzZXN9IG1vZHVsZSwgXGNvbnN0YW50e0NPTE9SU30gYW5kCi1cY29uc3RhbnR7Q09MT1JfUEFJUlN9LCBjb250YWluaW5nIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb2xvcnMgYW5kCi1jb2xvci1wYWlycyB0aGUgdGVybWluYWwgY2FuIHN1cHBvcnQuICBJdCBhbHNvIHJlc3RvcmVzIHRoZSBjb2xvcnMgb24KLXRoZSB0ZXJtaW5hbCB0byB0aGUgdmFsdWVzIHRoZXkgaGFkIHdoZW4gdGhlIHRlcm1pbmFsIHdhcyBqdXN0IHR1cm5lZAotb24uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3Rlcm1hdHRyc317fQotUmV0dXJucyBhIGxvZ2ljYWwgT1Igb2YgYWxsIHZpZGVvIGF0dHJpYnV0ZXMgc3VwcG9ydGVkIGJ5IHRoZQotdGVybWluYWwuICBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWZ1bCB3aGVuIGEgY3Vyc2VzIHByb2dyYW0gbmVlZHMKLWNvbXBsZXRlIGNvbnRyb2wgb3ZlciB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgc2NyZWVuLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt0ZXJtbmFtZX17fQotUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFRFUk0sIHRydW5jYXRlZCB0byAxNAotY2hhcmFjdGVycy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dGlnZXRmbGFnfXtjYXBuYW1lfQotUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIEJvb2xlYW4gY2FwYWJpbGl0eSBjb3JyZXNwb25kaW5nIHRvIHRoZQotdGVybWluZm8gY2FwYWJpbGl0eSBuYW1lIFx2YXJ7Y2FwbmFtZX0uICBUaGUgdmFsdWUgXGNvZGV7LTF9IGlzCi1yZXR1cm5lZCBpZiBcdmFye2NhcG5hbWV9IGlzIG5vdCBhIEJvb2xlYW4gY2FwYWJpbGl0eSwgb3IgXGNvZGV7MH0gaWYKLWl0IGlzIGNhbmNlbGVkIG9yIGFic2VudCBmcm9tIHRoZSB0ZXJtaW5hbCBkZXNjcmlwdGlvbi4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dGlnZXRudW19e2NhcG5hbWV9Ci1SZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgbnVtZXJpYyBjYXBhYmlsaXR5IGNvcnJlc3BvbmRpbmcgdG8gdGhlCi10ZXJtaW5mbyBjYXBhYmlsaXR5IG5hbWUgXHZhcntjYXBuYW1lfS4gIFRoZSB2YWx1ZSBcY29kZXstMn0gaXMKLXJldHVybmVkIGlmIFx2YXJ7Y2FwbmFtZX0gaXMgbm90IGEgbnVtZXJpYyBjYXBhYmlsaXR5LCBvciBcY29kZXstMX0gaWYKLWl0IGlzIGNhbmNlbGVkIG9yIGFic2VudCBmcm9tIHRoZSB0ZXJtaW5hbCBkZXNjcmlwdGlvbi4gIAotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt0aWdldHN0cn17Y2FwbmFtZX0KLVJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcgY2FwYWJpbGl0eSBjb3JyZXNwb25kaW5nIHRvIHRoZQotdGVybWluZm8gY2FwYWJpbGl0eSBuYW1lIFx2YXJ7Y2FwbmFtZX0uICBcY29kZXtOb25lfSBpcyByZXR1cm5lZCBpZgotXHZhcntjYXBuYW1lfSBpcyBub3QgYSBzdHJpbmcgY2FwYWJpbGl0eSwgb3IgaXMgY2FuY2VsZWQgb3IgYWJzZW50Ci1mcm9tIHRoZSB0ZXJtaW5hbCBkZXNjcmlwdGlvbi4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dHBhcm19e3N0clxvcHRpb25hbHssLi4ufX0KLUluc3RhbnRpYXRlcyB0aGUgc3RyaW5nIFx2YXJ7c3RyfSB3aXRoIHRoZSBzdXBwbGllZCBwYXJhbWV0ZXJzLCB3aGVyZSAKLVx2YXJ7c3RyfSBzaG91bGQgYmUgYSBwYXJhbWV0ZXJpemVkIHN0cmluZyBvYnRhaW5lZCBmcm9tIHRoZSB0ZXJtaW5mbyAKLWRhdGFiYXNlLiAgRS5nLiBcY29kZXt0cGFybSh0aWdldHN0cigiY3VwIiksIDUsIDMpfSBjb3VsZCByZXN1bHQgaW4gCi1cY29kZXsnXGV7fTAzM1s2OzRIJ30sIHRoZSBleGFjdCByZXN1bHQgZGVwZW5kaW5nIG9uIHRlcm1pbmFsIHR5cGUuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3R5cGVhaGVhZH17ZmR9Ci1TcGVjaWZpZXMgdGhhdCB0aGUgZmlsZSBkZXNjcmlwdG9yIFx2YXJ7ZmR9IGJlIHVzZWQgZm9yIHR5cGVhaGVhZAotY2hlY2tpbmcuICBJZiBcdmFye2ZkfSBpcyBcY29kZXstMX0sIHRoZW4gbm8gdHlwZWFoZWFkIGNoZWNraW5nIGlzCi1kb25lLgotCi1UaGUgY3Vyc2VzIGxpYnJhcnkgZG9lcyBgYGxpbmUtYnJlYWtvdXQgb3B0aW1pemF0aW9uJycgYnkgbG9va2luZyBmb3IKLXR5cGVhaGVhZCBwZXJpb2RpY2FsbHkgd2hpbGUgdXBkYXRpbmcgdGhlIHNjcmVlbi4gIElmIGlucHV0IGlzIGZvdW5kLAotYW5kIGl0IGlzIGNvbWluZyBmcm9tIGEgdHR5LCB0aGUgY3VycmVudCB1cGRhdGUgaXMgcG9zdHBvbmVkIHVudGlsCi1yZWZyZXNoIG9yIGRvdXBkYXRlIGlzIGNhbGxlZCBhZ2FpbiwgYWxsb3dpbmcgZmFzdGVyIHJlc3BvbnNlIHRvCi1jb21tYW5kcyB0eXBlZCBpbiBhZHZhbmNlLiBUaGlzIGZ1bmN0aW9uIGFsbG93cyBzcGVjaWZ5aW5nIGEgZGlmZmVyZW50Ci1maWxlIGRlc2NyaXB0b3IgZm9yIHR5cGVhaGVhZCBjaGVja2luZy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dW5jdHJsfXtjaH0KLVJldHVybnMgYSBzdHJpbmcgd2hpY2ggaXMgYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNoYXJhY3RlcgotXHZhcntjaH0uICBDb250cm9sIGNoYXJhY3RlcnMgYXJlIGRpc3BsYXllZCBhcyBhIGNhcmV0IGZvbGxvd2VkIGJ5IHRoZQotY2hhcmFjdGVyLCBmb3IgZXhhbXBsZSBhcyBcY29kZXtcdGV4dGFzY2lpY2lyY3VtIEN9LiBQcmludGluZwotY2hhcmFjdGVycyBhcmUgbGVmdCBhcyB0aGV5IGFyZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dW5nZXRjaH17Y2h9Ci1QdXNoIFx2YXJ7Y2h9IHNvIHRoZSBuZXh0IFxtZXRob2R7Z2V0Y2goKX0gd2lsbCByZXR1cm4gaXQuCi1cbm90ZXtPbmx5IG9uZSBcdmFye2NofSBjYW4gYmUgcHVzaGVkIGJlZm9yZSBcbWV0aG9ke2dldGNoKCl9Ci1pcyBjYWxsZWQufQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt1bmdldG1vdXNlfXtpZCwgeCwgeSwgeiwgYnN0YXRlfQotUHVzaCBhIFxjb25zdGFudHtLRVlfTU9VU0V9IGV2ZW50IG9udG8gdGhlIGlucHV0IHF1ZXVlLCBhc3NvY2lhdGluZwotdGhlIGdpdmVuIHN0YXRlIGRhdGEgd2l0aCBpdC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dXNlX2Vudn17ZmxhZ30KLUlmIHVzZWQsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgXGZ1bmN0aW9ue2luaXRzY3IoKX0gb3IKLW5ld3Rlcm0gYXJlIGNhbGxlZC4gIFdoZW4gXHZhcntmbGFnfSBpcyBmYWxzZSwgdGhlIHZhbHVlcyBvZgotbGluZXMgYW5kIGNvbHVtbnMgc3BlY2lmaWVkIGluIHRoZSB0ZXJtaW5mbyBkYXRhYmFzZSB3aWxsIGJlCi11c2VkLCBldmVuIGlmIGVudmlyb25tZW50IHZhcmlhYmxlcyBcZW52dmFye0xJTkVTfSBhbmQKLVxlbnZ2YXJ7Q09MVU1OU30gKHVzZWQgYnkgZGVmYXVsdCkgYXJlIHNldCwgb3IgaWYgY3Vyc2VzIGlzIHJ1bm5pbmcgaW4KLWEgd2luZG93IChpbiB3aGljaCBjYXNlIGRlZmF1bHQgYmVoYXZpb3Igd291bGQgYmUgdG8gdXNlIHRoZSB3aW5kb3cKLXNpemUgaWYgXGVudnZhcntMSU5FU30gYW5kIFxlbnZ2YXJ7Q09MVU1OU30gYXJlIG5vdCBzZXQpLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt1c2VfZGVmYXVsdF9jb2xvcnN9e30KLUFsbG93IHVzZSBvZiBkZWZhdWx0IHZhbHVlcyBmb3IgY29sb3JzIG9uIHRlcm1pbmFscyBzdXBwb3J0aW5nIHRoaXMKLWZlYXR1cmUuIFVzZSB0aGlzIHRvIHN1cHBvcnQgdHJhbnNwYXJlbmN5IGluIHlvdXIKLWFwcGxpY2F0aW9uLiAgVGhlIGRlZmF1bHQgY29sb3IgaXMgYXNzaWduZWQgdG8gdGhlIGNvbG9yIG51bWJlciAtMS4KLUFmdGVyIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgCi1cY29kZXtpbml0X3BhaXIoeCwgY3Vyc2VzLkNPTE9SX1JFRCwgLTEpfSBpbml0aWFsaXplcywgZm9yIGluc3RhbmNlLAotY29sb3IgcGFpciBcdmFye3h9IHRvIGEgcmVkIGZvcmVncm91bmQgY29sb3Igb24gdGhlIGRlZmF1bHQgYmFja2dyb3VuZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxzdWJzZWN0aW9ue1dpbmRvdyBPYmplY3RzIFxsYWJlbHtjdXJzZXMtd2luZG93LW9iamVjdHN9fQotCi1XaW5kb3cgb2JqZWN0cywgYXMgcmV0dXJuZWQgYnkgXGZ1bmN0aW9ue2luaXRzY3IoKX0gYW5kCi1cZnVuY3Rpb257bmV3d2luKCl9IGFib3ZlLCBoYXZlIHRoZQotZm9sbG93aW5nIG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt3aW5kb3dde2FkZGNofXtcb3B0aW9uYWx7eSwgeCx9IGNoXG9wdGlvbmFseywgYXR0cn19Ci1cbm90ZXtBIFxlbXBoe2NoYXJhY3Rlcn0gbWVhbnMgYSBDIGNoYXJhY3RlciAoYW4KLVxBU0NJSXt9IGNvZGUpLCByYXRoZXIgdGhlbiBhIFB5dGhvbiBjaGFyYWN0ZXIgKGEgc3RyaW5nIG9mIGxlbmd0aCAxKS4KLShUaGlzIG5vdGUgaXMgdHJ1ZSB3aGVuZXZlciB0aGUgZG9jdW1lbnRhdGlvbiBtZW50aW9ucyBhIGNoYXJhY3Rlci4pCi1UaGUgYnVpbHRpbiBcZnVuY3Rpb257b3JkKCl9IGlzIGhhbmR5IGZvciBjb252ZXlpbmcgc3RyaW5ncyB0byBjb2Rlcy59Ci0KLVBhaW50IGNoYXJhY3RlciBcdmFye2NofSBhdCBcY29kZXsoXHZhcnt5fSwgXHZhcnt4fSl9IHdpdGggYXR0cmlidXRlcwotXHZhcnthdHRyfSwgb3ZlcndyaXRpbmcgYW55IGNoYXJhY3RlciBwcmV2aW91c2x5IHBhaW50ZXIgYXQgdGhhdAotbG9jYXRpb24uICBCeSBkZWZhdWx0LCB0aGUgY2hhcmFjdGVyIHBvc2l0aW9uIGFuZCBhdHRyaWJ1dGVzIGFyZSB0aGUKLWN1cnJlbnQgc2V0dGluZ3MgZm9yIHRoZSB3aW5kb3cgb2JqZWN0LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bd2luZG93XXthZGRuc3RyfXtcb3B0aW9uYWx7eSwgeCx9IHN0ciwgblxvcHRpb25hbHssIGF0dHJ9fQotUGFpbnQgYXQgbW9zdCBcdmFye259IGNoYXJhY3RlcnMgb2YgdGhlIAotc3RyaW5nIFx2YXJ7c3RyfSBhdCBcY29kZXsoXHZhcnt5fSwgXHZhcnt4fSl9IHdpdGggYXR0cmlidXRlcwotXHZhcnthdHRyfSwgb3ZlcndyaXRpbmcgYW55dGhpbmcgcHJldmlvdXNseSBvbiB0aGUgZGlzcGxheS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3dpbmRvd117YWRkc3RyfXtcb3B0aW9uYWx7eSwgeCx9IHN0clxvcHRpb25hbHssIGF0dHJ9fQotUGFpbnQgdGhlIHN0cmluZyBcdmFye3N0cn0gYXQgXGNvZGV7KFx2YXJ7eX0sIFx2YXJ7eH0pfSB3aXRoIGF0dHJpYnV0ZXMKLVx2YXJ7YXR0cn0sIG92ZXJ3cml0aW5nIGFueXRoaW5nIHByZXZpb3VzbHkgb24gdGhlIGRpc3BsYXkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt3aW5kb3dde2F0dHJvZmZ9e2F0dHJ9Ci1SZW1vdmUgYXR0cmlidXRlIFx2YXJ7YXR0cn0gZnJvbSB0aGUgYGBiYWNrZ3JvdW5kJycgc2V0IGFwcGxpZWQgdG8gYWxsCi13cml0ZXMgdG8gdGhlIGN1cnJlbnQgd2luZG93LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bd2luZG93XXthdHRyb259e2F0dHJ9Ci1BZGQgYXR0cmlidXRlIFx2YXJ7YXR0cn0gZnJvbSB0aGUgYGBiYWNrZ3JvdW5kJycgc2V0IGFwcGxpZWQgdG8gYWxsCi13cml0ZXMgdG8gdGhlIGN1cnJlbnQgd2luZG93LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bd2luZG93XXthdHRyc2V0fXthdHRyfQotU2V0IHRoZSBgYGJhY2tncm91bmQnJyBzZXQgb2YgYXR0cmlidXRlcyB0byBcdmFye2F0dHJ9LiAgVGhpcyBzZXQgaXMKLWluaXRpYWxseSAwIChubyBhdHRyaWJ1dGVzKS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3dpbmRvd117YmtnZH17Y2hcb3B0aW9uYWx7LCBhdHRyfX0KLVNldHMgdGhlIGJhY2tncm91bmQgcHJvcGVydHkgb2YgdGhlIHdpbmRvdyB0byB0aGUgY2hhcmFjdGVyIFx2YXJ7Y2h9LAotd2l0aCBhdHRyaWJ1dGVzIFx2YXJ7YXR0cn0uICBUaGUgY2hhbmdlIGlzIHRoZW4gYXBwbGllZCB0byBldmVyeQotY2hhcmFjdGVyIHBvc2l0aW9uIGluIHRoYXQgd2luZG93OgotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSAgCi1UaGUgYXR0cmlidXRlIG9mIGV2ZXJ5IGNoYXJhY3RlciBpbiB0aGUgd2luZG93ICBpcwotY2hhbmdlZCB0byB0aGUgbmV3IGJhY2tncm91bmQgYXR0cmlidXRlLgotXGl0ZW0KLVdoZXJldmVyICB0aGUgIGZvcm1lciBiYWNrZ3JvdW5kIGNoYXJhY3RlciBhcHBlYXJzLAotaXQgaXMgY2hhbmdlZCB0byB0aGUgbmV3IGJhY2tncm91bmQgY2hhcmFjdGVyLgotXGVuZHtpdGVtaXplfQotCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt3aW5kb3dde2JrZ2RzZXR9e2NoXG9wdGlvbmFseywgYXR0cn19Ci1TZXRzIHRoZSB3aW5kb3cncyBiYWNrZ3JvdW5kLiAgQSB3aW5kb3cncyBiYWNrZ3JvdW5kIGNvbnNpc3RzIG9mIGEKLWNoYXJhY3RlciBhbmQgYW55IGNvbWJpbmF0aW9uIG9mIGF0dHJpYnV0ZXMuICBUaGUgYXR0cmlidXRlIHBhcnQgb2YKLXRoZSBiYWNrZ3JvdW5kIGlzIGNvbWJpbmVkIChPUidlZCkgd2l0aCBhbGwgbm9uLWJsYW5rIGNoYXJhY3RlcnMgdGhhdAotYXJlIHdyaXR0ZW4gaW50byB0aGUgd2luZG93LiAgQm90aCB0aGUgY2hhcmFjdGVyIGFuZCBhdHRyaWJ1dGUgcGFydHMKLW9mIHRoZSBiYWNrZ3JvdW5kIGFyZSBjb21iaW5lZCB3aXRoIHRoZSBibGFuayBjaGFyYWN0ZXJzLiAgVGhlCi1iYWNrZ3JvdW5kIGJlY29tZXMgYSBwcm9wZXJ0eSBvZiB0aGUgY2hhcmFjdGVyIGFuZCBtb3ZlcyB3aXRoIHRoZQotY2hhcmFjdGVyIHRocm91Z2ggYW55IHNjcm9sbGluZyBhbmQgaW5zZXJ0L2RlbGV0ZSBsaW5lL2NoYXJhY3Rlcgotb3BlcmF0aW9ucy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3dpbmRvd117Ym9yZGVyfXtcb3B0aW9uYWx7bHNcb3B0aW9uYWx7LCByc1xvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzXG9wdGlvbmFseywgYnNcb3B0aW9uYWx7LCB0bFxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyXG9wdGlvbmFseywgYmxcb3B0aW9uYWx7LCBicn19fX19fX19fQotRHJhdyBhIGJvcmRlciBhcm91bmQgdGhlIGVkZ2VzIG9mIHRoZSB3aW5kb3cuIEVhY2ggcGFyYW1ldGVyIHNwZWNpZmllcyAKLXRoZSBjaGFyYWN0ZXIgdG8gdXNlIGZvciBhIHNwZWNpZmljIHBhcnQgb2YgdGhlIGJvcmRlcjsgc2VlIHRoZSB0YWJsZQotYmVsb3cgZm9yIG1vcmUgZGV0YWlscy4gIFRoZSBjaGFyYWN0ZXJzIGNhbiBiZSBzcGVjaWZpZWQgYXMgaW50ZWdlcnMKLW9yIGFzIG9uZS1jaGFyYWN0ZXIgc3RyaW5ncy4KLQotXG5vdGV7QSBcY29kZXswfSB2YWx1ZSBmb3IgYW55IHBhcmFtZXRlciB3aWxsIGNhdXNlIHRoZQotZGVmYXVsdCBjaGFyYWN0ZXIgdG8gYmUgdXNlZCBmb3IgdGhhdCBwYXJhbWV0ZXIuICBLZXl3b3JkIHBhcmFtZXRlcnMKLWNhbiBcZW1waHtub3R9IGJlIHVzZWQuICBUaGUgZGVmYXVsdHMgYXJlIGxpc3RlZCBpbiB0aGlzIHRhYmxlOn0KLQotXGJlZ2lue3RhYmxlaWlpfXtsfGx8bH17dmFyfXtQYXJhbWV0ZXJ9e0Rlc2NyaXB0aW9ufXtEZWZhdWx0IHZhbHVlfQotICBcbGluZWlpaXtsc317TGVmdCBzaWRlfXtcY29uc3RhbnR7QUNTX1ZMSU5FfX0KLSAgXGxpbmVpaWl7cnN9e1JpZ2h0IHNpZGV9e1xjb25zdGFudHtBQ1NfVkxJTkV9fQotICBcbGluZWlpaXt0c317VG9wfXtcY29uc3RhbnR7QUNTX0hMSU5FfX0KLSAgXGxpbmVpaWl7YnN9e0JvdHRvbX17XGNvbnN0YW50e0FDU19ITElORX19Ci0gIFxsaW5laWlpe3RsfXtVcHBlci1sZWZ0IGNvcm5lcn17XGNvbnN0YW50e0FDU19VTENPUk5FUn19Ci0gIFxsaW5laWlpe3RyfXtVcHBlci1yaWdodCBjb3JuZXJ9e1xjb25zdGFudHtBQ1NfVVJDT1JORVJ9fQotICBcbGluZWlpaXtibH17Qm90dG9tLWxlZnQgY29ybmVyfXtcY29uc3RhbnR7QUNTX0xMQ09STkVSfX0KLSAgXGxpbmVpaWl7YnJ9e0JvdHRvbS1yaWdodCBjb3JuZXJ9e1xjb25zdGFudHtBQ1NfTFJDT1JORVJ9fQotXGVuZHt0YWJsZWlpaX0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3dpbmRvd117Ym94fXtcb3B0aW9uYWx7dmVydGNoLCBob3JjaH19Ci1TaW1pbGFyIHRvIFxtZXRob2R7Ym9yZGVyKCl9LCBidXQgYm90aCBcdmFye2xzfSBhbmQgXHZhcntyc30gYXJlCi1cdmFye3ZlcnRjaH0gYW5kIGJvdGggXHZhcnt0c30gYW5kIHtic30gYXJlIFx2YXJ7aG9yY2h9LiAgVGhlIGRlZmF1bHQKLWNvcm5lciBjaGFyYWN0ZXJzIGFyZSBhbHdheXMgdXNlZCBieSB0aGlzIGZ1bmN0aW9uLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bd2luZG93XXtjaGdhdH17XG9wdGlvbmFse3ksIHgsIH0gXG9wdGlvbmFse251bSx9IGF0dHJ9Ci1TZXRzIHRoZSBhdHRyaWJ1dGVzIG9mIFx2YXJ7bnVtfSBjaGFyYWN0ZXJzIGF0IHRoZSBjdXJyZW50IGN1cnNvcgotcG9zaXRpb24sIG9yIGF0IHBvc2l0aW9uIFxjb2RleyhcdmFye3l9LCBcdmFye3h9KX0gaWYgc3VwcGxpZWQuIElmIG5vCi12YWx1ZSBvZiBcdmFye251bX0gaXMgZ2l2ZW4gb3IgXHZhcntudW19ID0gLTEsIHRoZSBhdHRyaWJ1dGUgd2lsbCAKLWJlIHNldCBvbiBhbGwgdGhlIGNoYXJhY3RlcnMgdG8gdGhlIGVuZCBvZiB0aGUgbGluZS4gCi1UaGlzIGZ1bmN0aW9uIGRvZXMgbm90IG1vdmUgdGhlIGN1cnNvci4gVGhlIGNoYW5nZWQgbGluZQotd2lsbCBiZSB0b3VjaGVkIHVzaW5nIHRoZSBcbWV0aG9ke3RvdWNobGluZX0gbWV0aG9kIHNvIHRoYXQgdGhlCi1jb250ZW50cyB3aWxsIGJlIHJlZGlzcGxheWVkIGJ5IHRoZSBuZXh0IHdpbmRvdyByZWZyZXNoLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bd2luZG93XXtjbGVhcn17fQotTGlrZSBcbWV0aG9ke2VyYXNlKCl9LCBidXQgYWxzbyBjYXVzZXMgdGhlIHdob2xlIHdpbmRvdyB0byBiZSByZXBhaW50ZWQKLXVwb24gbmV4dCBjYWxsIHRvIFxtZXRob2R7cmVmcmVzaCgpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3dpbmRvd117Y2xlYXJva317eWVzfQotSWYgXHZhcnt5ZXN9IGlzIDEsIHRoZSBuZXh0IGNhbGwgdG8gXG1ldGhvZHtyZWZyZXNoKCl9Ci13aWxsIGNsZWFyIHRoZSB3aW5kb3cgY29tcGxldGVseS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3dpbmRvd117Y2xydG9ib3R9e30KLUVyYXNlIGZyb20gY3Vyc29yIHRvIHRoZSBlbmQgb2YgdGhlIHdpbmRvdzogYWxsIGxpbmVzIGJlbG93IHRoZSBjdXJzb3IKLWFyZSBkZWxldGVkLCBhbmQgdGhlbiB0aGUgZXF1aXZhbGVudCBvZiBcbWV0aG9ke2NscnRvZW9sKCl9IGlzIHBlcmZvcm1lZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3dpbmRvd117Y2xydG9lb2x9e30KLUVyYXNlIGZyb20gY3Vyc29yIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt3aW5kb3dde2N1cnN5bmN1cH17fQotVXBkYXRlcyB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24gb2YgYWxsIHRoZSBhbmNlc3RvcnMgb2YgdGhlIHdpbmRvdwotdG8gcmVmbGVjdCB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3dpbmRvd117ZGVsY2h9e1xvcHRpb25hbHt5LCB4fX0KLURlbGV0ZSBhbnkgY2hhcmFjdGVyIGF0IFxjb2RleyhcdmFye3l9LCBcdmFye3h9KX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt3aW5kb3dde2RlbGV0ZWxufXt9Ci1EZWxldGUgdGhlIGxpbmUgdW5kZXIgdGhlIGN1cnNvci4gQWxsIGZvbGxvd2luZyBsaW5lcyBhcmUgbW92ZWQgdXAKLWJ5IDEgbGluZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3dpbmRvd117ZGVyd2lufXtcb3B0aW9uYWx7bmxpbmVzLCBuY29scyx9IGJlZ2luX3ksIGJlZ2luX3h9Ci1BbiBhYmJyZXZpYXRpb24gZm9yIGBgZGVyaXZlIHdpbmRvdycnLCBcbWV0aG9ke2RlcndpbigpfSBpcyB0aGUgc2FtZQotYXMgY2FsbGluZyBcbWV0aG9ke3N1YndpbigpfSwgZXhjZXB0IHRoYXQgXHZhcntiZWdpbl95fSBhbmQKLVx2YXJ7YmVnaW5feH0gYXJlIHJlbGF0aXZlIHRvIHRoZSBvcmlnaW4gb2YgdGhlIHdpbmRvdywgcmF0aGVyIHRoYW4KLXJlbGF0aXZlIHRvIHRoZSBlbnRpcmUgc2NyZWVuLiAgUmV0dXJucyBhIHdpbmRvdyBvYmplY3QgZm9yIHRoZQotZGVyaXZlZCB3aW5kb3cuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt3aW5kb3dde2VjaG9jaGFyfXtjaFxvcHRpb25hbHssIGF0dHJ9fQotQWRkIGNoYXJhY3RlciBcdmFye2NofSB3aXRoIGF0dHJpYnV0ZSBcdmFye2F0dHJ9LCBhbmQgaW1tZWRpYXRlbHkgCi1jYWxsIFxtZXRob2R7cmVmcmVzaCgpfSBvbiB0aGUgd2luZG93LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bd2luZG93XXtlbmNsb3NlfXt5LCB4fQotVGVzdHMgd2hldGhlciB0aGUgZ2l2ZW4gcGFpciBvZiBzY3JlZW4tcmVsYXRpdmUgY2hhcmFjdGVyLWNlbGwKLWNvb3JkaW5hdGVzIGFyZSBlbmNsb3NlZCBieSB0aGUgZ2l2ZW4gd2luZG93LCByZXR1cm5pbmcgdHJ1ZSBvcgotZmFsc2UuICBJdCBpcyB1c2VmdWwgZm9yIGRldGVybWluaW5nIHdoYXQgc3Vic2V0IG9mIHRoZSBzY3JlZW4KLXdpbmRvd3MgZW5jbG9zZSB0aGUgbG9jYXRpb24gb2YgYSBtb3VzZSBldmVudC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3dpbmRvd117ZXJhc2V9e30KLUNsZWFyIHRoZSB3aW5kb3cuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt3aW5kb3dde2dldGJlZ3l4fXt9Ci1SZXR1cm4gYSB0dXBsZSBcY29kZXsoXHZhcnt5fSwgXHZhcnt4fSl9IG9mIGNvLW9yZGluYXRlcyBvZiB1cHBlci1sZWZ0Ci1jb3JuZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt3aW5kb3dde2dldGNofXtcb3B0aW9uYWx7eSwgeH19Ci1HZXQgYSBjaGFyYWN0ZXIuIE5vdGUgdGhhdCB0aGUgaW50ZWdlciByZXR1cm5lZCBkb2VzIFxlbXBoe25vdH0gaGF2ZSB0bwotYmUgaW4gXEFTQ0lJe30gcmFuZ2U6IGZ1bmN0aW9uIGtleXMsIGtleXBhZCBrZXlzIGFuZCBzbyBvbiByZXR1cm4gbnVtYmVycwotaGlnaGVyIHRoYW4gMjU2LiBJbiBuby1kZWxheSBtb2RlLCAtMSBpcyByZXR1cm5lZCBpZiB0aGVyZSBpcyAKLW5vIGlucHV0LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bd2luZG93XXtnZXRrZXl9e1xvcHRpb25hbHt5LCB4fX0KLUdldCBhIGNoYXJhY3RlciwgcmV0dXJuaW5nIGEgc3RyaW5nIGluc3RlYWQgb2YgYW4gaW50ZWdlciwgYXMKLVxtZXRob2R7Z2V0Y2goKX0gZG9lcy4gRnVuY3Rpb24ga2V5cywga2V5cGFkIGtleXMgYW5kIHNvIG9uIHJldHVybiBhCi1tdWx0aWJ5dGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGtleSBuYW1lLiAgSW4gbm8tZGVsYXkgbW9kZSwgYW4KLWV4Y2VwdGlvbiBpcyByYWlzZWQgaWYgdGhlcmUgaXMgbm8gaW5wdXQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt3aW5kb3dde2dldG1heHl4fXt9Ci1SZXR1cm4gYSB0dXBsZSBcY29kZXsoXHZhcnt5fSwgXHZhcnt4fSl9IG9mIHRoZSBoZWlnaHQgYW5kIHdpZHRoIG9mCi10aGUgd2luZG93LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bd2luZG93XXtnZXRwYXJ5eH17fQotUmV0dXJucyB0aGUgYmVnaW5uaW5nIGNvb3JkaW5hdGVzIG9mIHRoaXMgd2luZG93IHJlbGF0aXZlIHRvIGl0cwotcGFyZW50IHdpbmRvdyBpbnRvIHR3byBpbnRlZ2VyIHZhcmlhYmxlcyB5IGFuZCB4LiAgUmV0dXJucwotXGNvZGV7LTEsLTF9IGlmIHRoaXMgd2luZG93IGhhcyBubyBwYXJlbnQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt3aW5kb3dde2dldHN0cn17XG9wdGlvbmFse3ksIHh9fQotUmVhZCBhIHN0cmluZyBmcm9tIHRoZSB1c2VyLCB3aXRoIHByaW1pdGl2ZSBsaW5lIGVkaXRpbmcgY2FwYWNpdHkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt3aW5kb3dde2dldHl4fXt9Ci1SZXR1cm4gYSB0dXBsZSBcY29kZXsoXHZhcnt5fSwgXHZhcnt4fSl9IG9mIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uIAotcmVsYXRpdmUgdG8gdGhlIHdpbmRvdydzIHVwcGVyLWxlZnQgY29ybmVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bd2luZG93XXtobGluZX17XG9wdGlvbmFse3ksIHgsfSBjaCwgbn0KLURpc3BsYXkgYSBob3Jpem9udGFsIGxpbmUgc3RhcnRpbmcgYXQgXGNvZGV7KFx2YXJ7eX0sIFx2YXJ7eH0pfSB3aXRoCi1sZW5ndGggXHZhcntufSBjb25zaXN0aW5nIG9mIHRoZSBjaGFyYWN0ZXIgXHZhcntjaH0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt3aW5kb3dde2lkY29rfXtmbGFnfQotSWYgXHZhcntmbGFnfSBpcyBmYWxzZSwgY3Vyc2VzIG5vIGxvbmdlciBjb25zaWRlcnMgdXNpbmcgdGhlIGhhcmR3YXJlCi1pbnNlcnQvZGVsZXRlIGNoYXJhY3RlciBmZWF0dXJlIG9mIHRoZSB0ZXJtaW5hbDsgaWYgXHZhcntmbGFnfSBpcwotdHJ1ZSwgdXNlIG9mIGNoYXJhY3RlciBpbnNlcnRpb24gYW5kIGRlbGV0aW9uIGlzIGVuYWJsZWQuICBXaGVuIGN1cnNlcwotaXMgZmlyc3QgaW5pdGlhbGl6ZWQsIHVzZSBvZiBjaGFyYWN0ZXIgaW5zZXJ0L2RlbGV0ZSBpcyBlbmFibGVkIGJ5Ci1kZWZhdWx0LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bd2luZG93XXtpZGxva317eWVzfQotSWYgY2FsbGVkIHdpdGggXHZhcnt5ZXN9IGVxdWFsIHRvIDEsIFxtb2R1bGV7Y3Vyc2VzfSB3aWxsIHRyeSBhbmQgdXNlCi1oYXJkd2FyZSBsaW5lIGVkaXRpbmcgZmFjaWxpdGllcy4gT3RoZXJ3aXNlLCBsaW5lIGluc2VydGlvbi9kZWxldGlvbgotYXJlIGRpc2FibGVkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bd2luZG93XXtpbW1lZG9rfXtmbGFnfQotSWYgXHZhcntmbGFnfSBpcyB0cnVlLCBhbnkgY2hhbmdlIGluIHRoZSB3aW5kb3cgaW1hZ2UKLWF1dG9tYXRpY2FsbHkgY2F1c2VzIHRoZSB3aW5kb3cgdG8gYmUgcmVmcmVzaGVkOyB5b3Ugbm8gbG9uZ2VyCi1oYXZlIHRvIGNhbGwgXG1ldGhvZHtyZWZyZXNoKCl9IHlvdXJzZWxmLiAgSG93ZXZlciwgaXQgbWF5Ci1kZWdyYWRlIHBlcmZvcm1hbmNlIGNvbnNpZGVyYWJseSwgZHVlIHRvIHJlcGVhdGVkIGNhbGxzIHRvCi13cmVmcmVzaC4gIFRoaXMgb3B0aW9uIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt3aW5kb3dde2luY2h9e1xvcHRpb25hbHt5LCB4fX0KLVJldHVybiB0aGUgY2hhcmFjdGVyIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBpbiB0aGUgd2luZG93LiBUaGUgYm90dG9tCi04IGJpdHMgYXJlIHRoZSBjaGFyYWN0ZXIgcHJvcGVyLCBhbmQgdXBwZXIgYml0cyBhcmUgdGhlIGF0dHJpYnV0ZXMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt3aW5kb3dde2luc2NofXtcb3B0aW9uYWx7eSwgeCx9IGNoXG9wdGlvbmFseywgYXR0cn19Ci1QYWludCBjaGFyYWN0ZXIgXHZhcntjaH0gYXQgXGNvZGV7KFx2YXJ7eX0sIFx2YXJ7eH0pfSB3aXRoIGF0dHJpYnV0ZXMKLVx2YXJ7YXR0cn0sIG1vdmluZyB0aGUgbGluZSBmcm9tIHBvc2l0aW9uIFx2YXJ7eH0gcmlnaHQgYnkgb25lCi1jaGFyYWN0ZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt3aW5kb3dde2luc2RlbGxufXtubGluZXN9Ci1JbnNlcnRzIFx2YXJ7bmxpbmVzfSBsaW5lcyBpbnRvIHRoZSBzcGVjaWZpZWQgd2luZG93IGFib3ZlIHRoZSBjdXJyZW50Ci1saW5lLiAgVGhlIFx2YXJ7bmxpbmVzfSBib3R0b20gbGluZXMgYXJlIGxvc3QuICBGb3IgbmVnYXRpdmUKLVx2YXJ7bmxpbmVzfSwgZGVsZXRlIFx2YXJ7bmxpbmVzfSBsaW5lcyBzdGFydGluZyB3aXRoIHRoZSBvbmUgdW5kZXIKLXRoZSBjdXJzb3IsIGFuZCBtb3ZlIHRoZSByZW1haW5pbmcgbGluZXMgdXAuICBUaGUgYm90dG9tIFx2YXJ7bmxpbmVzfQotbGluZXMgYXJlIGNsZWFyZWQuICBUaGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24gcmVtYWlucyB0aGUgc2FtZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3dpbmRvd117aW5zZXJ0bG59e30KLUluc2VydCBhIGJsYW5rIGxpbmUgdW5kZXIgdGhlIGN1cnNvci4gQWxsIGZvbGxvd2luZyBsaW5lcyBhcmUgbW92ZWQKLWRvd24gYnkgMSBsaW5lLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bd2luZG93XXtpbnNuc3RyfXtcb3B0aW9uYWx7eSwgeCx9IHN0ciwgbiBcb3B0aW9uYWx7LCBhdHRyfX0KLUluc2VydCBhIGNoYXJhY3RlciBzdHJpbmcgKGFzIG1hbnkgY2hhcmFjdGVycyBhcyB3aWxsIGZpdCBvbiB0aGUgbGluZSkKLWJlZm9yZSB0aGUgY2hhcmFjdGVyIHVuZGVyIHRoZSBjdXJzb3IsIHVwIHRvIFx2YXJ7bn0gY2hhcmFjdGVycy4gIAotSWYgXHZhcntufSBpcyB6ZXJvIG9yIG5lZ2F0aXZlLAotdGhlIGVudGlyZSBzdHJpbmcgaXMgaW5zZXJ0ZWQuCi1BbGwgY2hhcmFjdGVycyB0byB0aGUgcmlnaHQgb2YKLXRoZSBjdXJzb3IgYXJlIHNoaWZ0ZWQgcmlnaHQsIHdpdGggdGhlIHJpZ2h0bW9zdCBjaGFyYWN0ZXJzIG9uIHRoZQotbGluZSBiZWluZyBsb3N0LiAgVGhlIGN1cnNvciBwb3NpdGlvbiBkb2VzIG5vdCBjaGFuZ2UgKGFmdGVyIG1vdmluZyB0bwotXHZhcnt5fSwgXHZhcnt4fSwgaWYgc3BlY2lmaWVkKS4gCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt3aW5kb3dde2luc3N0cn17XG9wdGlvbmFse3ksIHgsIH0gc3RyIFxvcHRpb25hbHssIGF0dHJ9fQotSW5zZXJ0IGEgY2hhcmFjdGVyIHN0cmluZyAoYXMgbWFueSBjaGFyYWN0ZXJzIGFzIHdpbGwgZml0IG9uIHRoZSBsaW5lKQotYmVmb3JlIHRoZSBjaGFyYWN0ZXIgdW5kZXIgdGhlIGN1cnNvci4gIEFsbCBjaGFyYWN0ZXJzIHRvIHRoZSByaWdodCBvZgotdGhlIGN1cnNvciBhcmUgc2hpZnRlZCByaWdodCwgd2l0aCB0aGUgcmlnaHRtb3N0IGNoYXJhY3RlcnMgb24gdGhlCi1saW5lIGJlaW5nIGxvc3QuICBUaGUgY3Vyc29yIHBvc2l0aW9uIGRvZXMgbm90IGNoYW5nZSAoYWZ0ZXIgbW92aW5nIHRvCi1cdmFye3l9LCBcdmFye3h9LCBpZiBzcGVjaWZpZWQpLiAKLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3dpbmRvd117aW5zdHJ9e1xvcHRpb25hbHt5LCB4fSBcb3B0aW9uYWx7LCBufX0KLVJldHVybnMgYSBzdHJpbmcgb2YgY2hhcmFjdGVycywgZXh0cmFjdGVkIGZyb20gdGhlIHdpbmRvdyBzdGFydGluZyBhdAotdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uLCBvciBhdCBcdmFye3l9LCBcdmFye3h9IGlmIHNwZWNpZmllZC4KLUF0dHJpYnV0ZXMgYXJlIHN0cmlwcGVkIGZyb20gdGhlIGNoYXJhY3RlcnMuICBJZiBcdmFye259IGlzIHNwZWNpZmllZCwKLVxtZXRob2R7aW5zdHIoKX0gcmV0dXJucyByZXR1cm4gYSBzdHJpbmcgYXQgbW9zdCBcdmFye259IGNoYXJhY3RlcnMKLWxvbmcgKGV4Y2x1c2l2ZSBvZiB0aGUgdHJhaWxpbmcgTlVMKS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3dpbmRvd117aXNfbGluZXRvdWNoZWR9e1x2YXJ7bGluZX19Ci1SZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBsaW5lIHdhcyBtb2RpZmllZCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvCi1cbWV0aG9ke3JlZnJlc2goKX07IG90aGVyd2lzZSByZXR1cm5zIGZhbHNlLiAgUmFpc2VzIGEKLVxleGNlcHRpb257Y3Vyc2VzLmVycm9yfSBleGNlcHRpb24gaWYgXHZhcntsaW5lfSBpcyBub3QgdmFsaWQKLWZvciB0aGUgZ2l2ZW4gd2luZG93LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bd2luZG93XXtpc193aW50b3VjaGVkfXt9Ci1SZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB3aW5kb3cgd2FzIG1vZGlmaWVkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8KLVxtZXRob2R7cmVmcmVzaCgpfTsgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt3aW5kb3dde2tleXBhZH17eWVzfQotSWYgXHZhcnt5ZXN9IGlzIDEsIGVzY2FwZSBzZXF1ZW5jZXMgZ2VuZXJhdGVkIGJ5IHNvbWUga2V5cyAoa2V5cGFkLCAKLWZ1bmN0aW9uIGtleXMpIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYnkgXG1vZHVsZXtjdXJzZXN9LgotSWYgXHZhcnt5ZXN9IGlzIDAsIGVzY2FwZSBzZXF1ZW5jZXMgd2lsbCBiZSBsZWZ0IGFzIGlzIGluIHRoZSBpbnB1dAotc3RyZWFtLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bd2luZG93XXtsZWF2ZW9rfXt5ZXN9Ci1JZiBcdmFye3llc30gaXMgMSwgY3Vyc29yIGlzIGxlZnQgd2hlcmUgaXQgaXMgb24gdXBkYXRlLCBpbnN0ZWFkIG9mCi1iZWluZyBhdCBgYGN1cnNvciBwb3NpdGlvbi4nJyAgVGhpcyByZWR1Y2VzIGN1cnNvciBtb3ZlbWVudCB3aGVyZQotcG9zc2libGUuIElmIHBvc3NpYmxlIHRoZSBjdXJzb3Igd2lsbCBiZSBtYWRlIGludmlzaWJsZS4KLQotSWYgXHZhcnt5ZXN9IGlzIDAsIGN1cnNvciB3aWxsIGFsd2F5cyBiZSBhdCBgYGN1cnNvciBwb3NpdGlvbicnIGFmdGVyCi1hbiB1cGRhdGUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt3aW5kb3dde21vdmV9e25ld195LCBuZXdfeH0KLU1vdmUgY3Vyc29yIHRvIFxjb2RleyhcdmFye25ld195fSwgXHZhcntuZXdfeH0pfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3dpbmRvd117bXZkZXJ3aW59e3ksIHh9Ci1Nb3ZlcyB0aGUgd2luZG93IGluc2lkZSBpdHMgcGFyZW50IHdpbmRvdy4gIFRoZSBzY3JlZW4tcmVsYXRpdmUKLXBhcmFtZXRlcnMgb2YgdGhlIHdpbmRvdyBhcmUgbm90IGNoYW5nZWQuICBUaGlzIHJvdXRpbmUgaXMgdXNlZCB0bwotZGlzcGxheSBkaWZmZXJlbnQgcGFydHMgb2YgdGhlIHBhcmVudCB3aW5kb3cgYXQgdGhlIHNhbWUgcGh5c2ljYWwKLXBvc2l0aW9uIG9uIHRoZSBzY3JlZW4uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt3aW5kb3dde212d2lufXtuZXdfeSwgbmV3X3h9Ci1Nb3ZlIHRoZSB3aW5kb3cgc28gaXRzIHVwcGVyLWxlZnQgY29ybmVyIGlzIGF0Ci1cY29kZXsoXHZhcntuZXdfeX0sIFx2YXJ7bmV3X3h9KX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt3aW5kb3dde25vZGVsYXl9e3llc30KLUlmIFx2YXJ7eWVzfSBpcyBcY29kZXsxfSwgXG1ldGhvZHtnZXRjaCgpfSB3aWxsIGJlIG5vbi1ibG9ja2luZy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3dpbmRvd117bm90aW1lb3V0fXt5ZXN9Ci1JZiBcdmFye3llc30gaXMgXGNvZGV7MX0sIGVzY2FwZSBzZXF1ZW5jZXMgd2lsbCBub3QgYmUgdGltZWQgb3V0LgotCi1JZiBcdmFye3llc30gaXMgXGNvZGV7MH0sIGFmdGVyIGEgZmV3IG1pbGxpc2Vjb25kcywgYW4gZXNjYXBlIHNlcXVlbmNlCi13aWxsIG5vdCBiZSBpbnRlcnByZXRlZCwgYW5kIHdpbGwgYmUgbGVmdCBpbiB0aGUgaW5wdXQgc3RyZWFtIGFzIGlzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bd2luZG93XXtub3V0cmVmcmVzaH17fQotTWFyayBmb3IgcmVmcmVzaCBidXQgd2FpdC4gIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgZGF0YSBzdHJ1Y3R1cmUKLXJlcHJlc2VudGluZyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiB0aGUgd2luZG93LCBidXQgZG9lcyBub3QgZm9yY2UKLWFuIHVwZGF0ZSBvZiB0aGUgcGh5c2ljYWwgc2NyZWVuLiAgVG8gYWNjb21wbGlzaCB0aGF0LCBjYWxsIAotXGZ1bmN0aW9ue2RvdXBkYXRlKCl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bd2luZG93XXtvdmVybGF5fXtkZXN0d2luXG9wdGlvbmFseywgc21pbnJvdywgc21pbmNvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRtaW5yb3csIGRtaW5jb2wsIGRtYXhyb3csIGRtYXhjb2x9fQotT3ZlcmxheSB0aGUgd2luZG93IG9uIHRvcCBvZiBcdmFye2Rlc3R3aW59LiBUaGUgd2luZG93cyBuZWVkIG5vdCBiZQotdGhlIHNhbWUgc2l6ZSwgb25seSB0aGUgb3ZlcmxhcHBpbmcgcmVnaW9uIGlzIGNvcGllZC4gVGhpcyBjb3B5IGlzCi1ub24tZGVzdHJ1Y3RpdmUsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGN1cnJlbnQgYmFja2dyb3VuZCBjaGFyYWN0ZXIKLWRvZXMgbm90IG92ZXJ3cml0ZSB0aGUgb2xkIGNvbnRlbnRzIG9mIFx2YXJ7ZGVzdHdpbn0uCi0KLVRvIGdldCBmaW5lLWdyYWluZWQgY29udHJvbCBvdmVyIHRoZSBjb3BpZWQgcmVnaW9uLCB0aGUgc2Vjb25kIGZvcm0KLW9mIFxtZXRob2R7b3ZlcmxheSgpfSBjYW4gYmUgdXNlZC4gXHZhcntzbWlucm93fSBhbmQgXHZhcntzbWluY29sfSBhcmUKLXRoZSB1cHBlci1sZWZ0IGNvb3JkaW5hdGVzIG9mIHRoZSBzb3VyY2Ugd2luZG93LCBhbmQgdGhlIG90aGVyIHZhcmlhYmxlcwotbWFyayBhIHJlY3RhbmdsZSBpbiB0aGUgZGVzdGluYXRpb24gd2luZG93LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bd2luZG93XXtvdmVyd3JpdGV9e2Rlc3R3aW5cb3B0aW9uYWx7LCBzbWlucm93LCBzbWluY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbWlucm93LCBkbWluY29sLCBkbWF4cm93LCBkbWF4Y29sfX0KLU92ZXJ3cml0ZSB0aGUgd2luZG93IG9uIHRvcCBvZiBcdmFye2Rlc3R3aW59LiBUaGUgd2luZG93cyBuZWVkIG5vdCBiZQotdGhlIHNhbWUgc2l6ZSwgaW4gd2hpY2ggY2FzZSBvbmx5IHRoZSBvdmVybGFwcGluZyByZWdpb24gaXMKLWNvcGllZC4gVGhpcyBjb3B5IGlzIGRlc3RydWN0aXZlLCB3aGljaCBtZWFucyB0aGF0IHRoZSBjdXJyZW50Ci1iYWNrZ3JvdW5kIGNoYXJhY3RlciBvdmVyd3JpdGVzIHRoZSBvbGQgY29udGVudHMgb2YgXHZhcntkZXN0d2lufS4KLQotVG8gZ2V0IGZpbmUtZ3JhaW5lZCBjb250cm9sIG92ZXIgdGhlIGNvcGllZCByZWdpb24sIHRoZSBzZWNvbmQgZm9ybQotb2YgXG1ldGhvZHtvdmVyd3JpdGUoKX0gY2FuIGJlIHVzZWQuIFx2YXJ7c21pbnJvd30gYW5kIFx2YXJ7c21pbmNvbH0gYXJlCi10aGUgdXBwZXItbGVmdCBjb29yZGluYXRlcyBvZiB0aGUgc291cmNlIHdpbmRvdywgdGhlIG90aGVyIHZhcmlhYmxlcwotbWFyayBhIHJlY3RhbmdsZSBpbiB0aGUgZGVzdGluYXRpb24gd2luZG93LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bd2luZG93XXtwdXR3aW59e2ZpbGV9Ci1Xcml0ZXMgYWxsIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSB3aW5kb3cgaW50byB0aGUgcHJvdmlkZWQgZmlsZQotb2JqZWN0LiAgVGhpcyBpbmZvcm1hdGlvbiBjYW4gYmUgbGF0ZXIgcmV0cmlldmVkIHVzaW5nIHRoZQotXGZ1bmN0aW9ue2dldHdpbigpfSBmdW5jdGlvbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3dpbmRvd117cmVkcmF3bG59e2JlZywgbnVtfQotSW5kaWNhdGVzIHRoYXQgdGhlIFx2YXJ7bnVtfSBzY3JlZW4gbGluZXMsIHN0YXJ0aW5nIGF0IGxpbmUgXHZhcntiZWd9LAotYXJlIGNvcnJ1cHRlZCBhbmQgc2hvdWxkIGJlIGNvbXBsZXRlbHkgcmVkcmF3biBvbiB0aGUgbmV4dAotXG1ldGhvZHtyZWZyZXNoKCl9IGNhbGwuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt3aW5kb3dde3JlZHJhd3dpbn17fQotVG91Y2hlcyB0aGUgZW50aXJlIHdpbmRvdywgY2F1c2luZyBpdCB0byBiZSBjb21wbGV0ZWx5IHJlZHJhd24gb24gdGhlCi1uZXh0IFxtZXRob2R7cmVmcmVzaCgpfSBjYWxsLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bd2luZG93XXtyZWZyZXNofXtcb3B0aW9uYWx7cG1pbnJvdywgcG1pbmNvbCwgc21pbnJvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtaW5jb2wsIHNtYXhyb3csIHNtYXhjb2x9fQotVXBkYXRlIHRoZSBkaXNwbGF5IGltbWVkaWF0ZWx5IChzeW5jIGFjdHVhbCBzY3JlZW4gd2l0aCBwcmV2aW91cwotZHJhd2luZy9kZWxldGluZyBtZXRob2RzKS4KLQotVGhlIDYgb3B0aW9uYWwgYXJndW1lbnRzIGNhbiBvbmx5IGJlIHNwZWNpZmllZCB3aGVuIHRoZSB3aW5kb3cgaXMgYQotcGFkIGNyZWF0ZWQgd2l0aCBcZnVuY3Rpb257bmV3cGFkKCl9LiAgVGhlIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBhcmUKLW5lZWRlZCB0byBpbmRpY2F0ZSB3aGF0IHBhcnQgb2YgdGhlIHBhZCBhbmQgc2NyZWVuIGFyZSBpbnZvbHZlZC4KLVx2YXJ7cG1pbnJvd30gYW5kIFx2YXJ7cG1pbmNvbH0gc3BlY2lmeSB0aGUgdXBwZXIgbGVmdC1oYW5kIGNvcm5lciBvZiB0aGUKLXJlY3RhbmdsZSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHBhZC4gIFx2YXJ7c21pbnJvd30sIFx2YXJ7c21pbmNvbH0sCi1cdmFye3NtYXhyb3d9LCBhbmQgXHZhcntzbWF4Y29sfSBzcGVjaWZ5IHRoZSBlZGdlcyBvZiB0aGUgcmVjdGFuZ2xlIHRvCi1iZSBkaXNwbGF5ZWQgb24gdGhlIHNjcmVlbi4gIFRoZSBsb3dlciByaWdodC1oYW5kIGNvcm5lciBvZiB0aGUKLXJlY3RhbmdsZSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHBhZCBpcyBjYWxjdWxhdGVkIGZyb20gdGhlIHNjcmVlbgotY29vcmRpbmF0ZXMsIHNpbmNlIHRoZSByZWN0YW5nbGVzIG11c3QgYmUgdGhlIHNhbWUgc2l6ZS4gIEJvdGgKLXJlY3RhbmdsZXMgbXVzdCBiZSBlbnRpcmVseSBjb250YWluZWQgd2l0aGluIHRoZWlyIHJlc3BlY3RpdmUKLXN0cnVjdHVyZXMuICBOZWdhdGl2ZSB2YWx1ZXMgb2YgXHZhcntwbWlucm93fSwgXHZhcntwbWluY29sfSwKLVx2YXJ7c21pbnJvd30sIG9yIFx2YXJ7c21pbmNvbH0gYXJlIHRyZWF0ZWQgYXMgaWYgdGhleSB3ZXJlIHplcm8uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt3aW5kb3dde3Njcm9sbH17XG9wdGlvbmFse2xpbmVzXGNvZGV7ID0gMX19fQotU2Nyb2xsIHRoZSBzY3JlZW4gb3Igc2Nyb2xsaW5nIHJlZ2lvbiB1cHdhcmQgYnkgXHZhcntsaW5lc30gbGluZXMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt3aW5kb3dde3Njcm9sbG9rfXtmbGFnfQotQ29udHJvbHMgd2hhdCBoYXBwZW5zIHdoZW4gdGhlIGN1cnNvciBvZiBhIHdpbmRvdyBpcyBtb3ZlZCBvZmYgdGhlCi1lZGdlIG9mIHRoZSB3aW5kb3cgb3Igc2Nyb2xsaW5nIHJlZ2lvbiwgZWl0aGVyIGFzIGEgcmVzdWx0IG9mIGEKLW5ld2xpbmUgYWN0aW9uIG9uIHRoZSBib3R0b20gbGluZSwgb3IgdHlwaW5nIHRoZSBsYXN0IGNoYXJhY3Rlcgotb2YgdGhlIGxhc3QgbGluZS4gIElmIFx2YXJ7ZmxhZ30gaXMgZmFsc2UsIHRoZSBjdXJzb3IgaXMgbGVmdAotb24gdGhlIGJvdHRvbSBsaW5lLiAgSWYgXHZhcntmbGFnfSBpcyB0cnVlLCB0aGUgd2luZG93IGlzCi1zY3JvbGxlZCB1cCBvbmUgbGluZS4gIE5vdGUgdGhhdCBpbiBvcmRlciB0byBnZXQgdGhlIHBoeXNpY2FsCi1zY3JvbGxpbmcgZWZmZWN0IG9uIHRoZSB0ZXJtaW5hbCwgaXQgaXMgYWxzbyBuZWNlc3NhcnkgdG8gY2FsbAotXG1ldGhvZHtpZGxvaygpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3dpbmRvd117c2V0c2NycmVnfXt0b3AsIGJvdHRvbX0KLVNldCB0aGUgc2Nyb2xsaW5nIHJlZ2lvbiBmcm9tIGxpbmUgXHZhcnt0b3B9IHRvIGxpbmUgXHZhcntib3R0b219LiBBbGwKLXNjcm9sbGluZyBhY3Rpb25zIHdpbGwgdGFrZSBwbGFjZSBpbiB0aGlzIHJlZ2lvbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3dpbmRvd117c3RhbmRlbmR9e30KLVR1cm4gb2ZmIHRoZSBzdGFuZG91dCBhdHRyaWJ1dGUuICBPbiBzb21lIHRlcm1pbmFscyB0aGlzIGhhcyB0aGUKLXNpZGUgZWZmZWN0IG9mIHR1cm5pbmcgb2ZmIGFsbCBhdHRyaWJ1dGVzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bd2luZG93XXtzdGFuZG91dH17fQotVHVybiBvbiBhdHRyaWJ1dGUgXHZhcntBX1NUQU5ET1VUfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3dpbmRvd117c3VicGFkfXtcb3B0aW9uYWx7bmxpbmVzLCBuY29scyx9IGJlZ2luX3ksIGJlZ2luX3h9Ci1SZXR1cm4gYSBzdWItd2luZG93LCB3aG9zZSB1cHBlci1sZWZ0IGNvcm5lciBpcyBhdAotXGNvZGV7KFx2YXJ7YmVnaW5feX0sIFx2YXJ7YmVnaW5feH0pfSwgYW5kIHdob3NlIHdpZHRoL2hlaWdodCBpcwotXHZhcntuY29sc30vXHZhcntubGluZXN9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bd2luZG93XXtzdWJ3aW59e1xvcHRpb25hbHtubGluZXMsIG5jb2xzLH0gYmVnaW5feSwgYmVnaW5feH0KLVJldHVybiBhIHN1Yi13aW5kb3csIHdob3NlIHVwcGVyLWxlZnQgY29ybmVyIGlzIGF0Ci1cY29kZXsoXHZhcntiZWdpbl95fSwgXHZhcntiZWdpbl94fSl9LCBhbmQgd2hvc2Ugd2lkdGgvaGVpZ2h0IGlzCi1cdmFye25jb2xzfS9cdmFye25saW5lc30uCi0KLUJ5IGRlZmF1bHQsIHRoZSBzdWItd2luZG93IHdpbGwgZXh0ZW5kIGZyb20gdGhlCi1zcGVjaWZpZWQgcG9zaXRpb24gdG8gdGhlIGxvd2VyIHJpZ2h0IGNvcm5lciBvZiB0aGUgd2luZG93LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bd2luZG93XXtzeW5jZG93bn17fQotVG91Y2hlcyBlYWNoIGxvY2F0aW9uIGluIHRoZSB3aW5kb3cgdGhhdCBoYXMgYmVlbiB0b3VjaGVkIGluIGFueSBvZgotaXRzIGFuY2VzdG9yIHdpbmRvd3MuICBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IFxtZXRob2R7cmVmcmVzaCgpfSwKLXNvIGl0IHNob3VsZCBhbG1vc3QgbmV2ZXIgYmUgbmVjZXNzYXJ5IHRvIGNhbGwgaXQgbWFudWFsbHkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt3aW5kb3dde3N5bmNva317ZmxhZ30KLUlmIGNhbGxlZCB3aXRoIFx2YXJ7ZmxhZ30gc2V0IHRvIHRydWUsIHRoZW4gXG1ldGhvZHtzeW5jdXAoKX0gaXMKLWNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW5ldmVyIHRoZXJlIGlzIGEgY2hhbmdlIGluIHRoZSB3aW5kb3cuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt3aW5kb3dde3N5bmN1cH17fQotVG91Y2hlcyBhbGwgbG9jYXRpb25zIGluIGFuY2VzdG9ycyBvZiB0aGUgd2luZG93IHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQgaW4gCi10aGUgd2luZG93LiAgCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt3aW5kb3dde3RpbWVvdXR9e2RlbGF5fQotU2V0cyBibG9ja2luZyBvciBub24tYmxvY2tpbmcgcmVhZCBiZWhhdmlvciBmb3IgdGhlIHdpbmRvdy4gIElmCi1cdmFye2RlbGF5fSBpcyBuZWdhdGl2ZSwgYmxvY2tpbmcgcmVhZCBpcyB1c2VkICh3aGljaCB3aWxsIHdhaXQKLWluZGVmaW5pdGVseSBmb3IgaW5wdXQpLiAgSWYgXHZhcntkZWxheX0gaXMgemVybywgdGhlbiBub24tYmxvY2tpbmcKLXJlYWQgaXMgdXNlZCwgYW5kIC0xIHdpbGwgYmUgcmV0dXJuZWQgYnkgXG1ldGhvZHtnZXRjaCgpfSBpZiBubyBpbnB1dAotaXMgd2FpdGluZy4gIElmIFx2YXJ7ZGVsYXl9IGlzIHBvc2l0aXZlLCB0aGVuIFxtZXRob2R7Z2V0Y2goKX0gd2lsbAotYmxvY2sgZm9yIFx2YXJ7ZGVsYXl9IG1pbGxpc2Vjb25kcywgYW5kIHJldHVybiAtMSBpZiB0aGVyZSBpcyBzdGlsbCBubwotaW5wdXQgYXQgdGhlIGVuZCBvZiB0aGF0IHRpbWUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt3aW5kb3dde3RvdWNobGluZX17c3RhcnQsIGNvdW50XG9wdGlvbmFseywgY2hhbmdlZH19Ci1QcmV0ZW5kIFx2YXJ7Y291bnR9IGxpbmVzIGhhdmUgYmVlbiBjaGFuZ2VkLCBzdGFydGluZyB3aXRoIGxpbmUKLVx2YXJ7c3RhcnR9LiAgSWYgXHZhcntjaGFuZ2VkfSBpcyBzdXBwbGllZCwgaXQgc3BlY2lmaWVzCi13aGV0aGVyIHRoZSBhZmZlY3RlZCBsaW5lcyBhcmUgbWFya2VkIGFzIAotaGF2aW5nIGJlZW4gY2hhbmdlZCAoXHZhcntjaGFuZ2VkfT0xKSBvciB1bmNoYW5nZWQgKFx2YXJ7Y2hhbmdlZH09MCkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt3aW5kb3dde3RvdWNod2lufXt9Ci1QcmV0ZW5kIHRoZSB3aG9sZSB3aW5kb3cgaGFzIGJlZW4gY2hhbmdlZCwgZm9yIHB1cnBvc2VzIG9mIGRyYXdpbmcKLW9wdGltaXphdGlvbnMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt3aW5kb3dde3VudG91Y2h3aW59e30KLU1hcmtzIGFsbCBsaW5lcyBpbiAgdGhlICB3aW5kb3cgIGFzIHVuY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvCi1cbWV0aG9ke3JlZnJlc2goKX0uIAotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bd2luZG93XXt2bGluZX17XG9wdGlvbmFse3ksIHgsfSBjaCwgbn0KLURpc3BsYXkgYSB2ZXJ0aWNhbCBsaW5lIHN0YXJ0aW5nIGF0IFxjb2RleyhcdmFye3l9LCBcdmFye3h9KX0gd2l0aAotbGVuZ3RoIFx2YXJ7bn0gY29uc2lzdGluZyBvZiB0aGUgY2hhcmFjdGVyIFx2YXJ7Y2h9LgotXGVuZHttZXRob2RkZXNjfQotCi1cc3Vic2VjdGlvbntDb25zdGFudHN9Ci0KLVRoZSBcbW9kdWxle2N1cnNlc30gbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBkYXRhIG1lbWJlcnM6Ci0KLVxiZWdpbntkYXRhZGVzY317RVJSfQotU29tZSBjdXJzZXMgcm91dGluZXMgIHRoYXQgIHJldHVybiAgYW4gaW50ZWdlciwgc3VjaCBhcyAKLVxmdW5jdGlvbntnZXRjaCgpfSwgcmV0dXJuIFxjb25zdGFudHtFUlJ9IHVwb24gZmFpbHVyZS4gIAotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtPS30KLVNvbWUgY3Vyc2VzIHJvdXRpbmVzICB0aGF0ICByZXR1cm4gIGFuIGludGVnZXIsIHN1Y2ggYXMgCi1cZnVuY3Rpb257bmFwbXMoKX0sIHJldHVybiBcY29uc3RhbnR7T0t9IHVwb24gc3VjY2Vzcy4gIAotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXt2ZXJzaW9ufQotQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIG1vZHVsZS4gCi1BbHNvIGF2YWlsYWJsZSBhcyBcY29uc3RhbnR7X192ZXJzaW9uX199LgotXGVuZHtkYXRhZGVzY30KLQotU2V2ZXJhbCBjb25zdGFudHMgYXJlIGF2YWlsYWJsZSB0byBzcGVjaWZ5IGNoYXJhY3RlciBjZWxsIGF0dHJpYnV0ZXM6Ci0KLVxiZWdpbnt0YWJsZWlpfXtsfGx9e2NvZGV9e0F0dHJpYnV0ZX17TWVhbmluZ30KLSAgXGxpbmVpaXtBX0FMVENIQVJTRVR9e0FsdGVybmF0ZSBjaGFyYWN0ZXIgc2V0IG1vZGUufQotICBcbGluZWlpe0FfQkxJTkt9e0JsaW5rIG1vZGUufQotICBcbGluZWlpe0FfQk9MRH17Qm9sZCBtb2RlLn0KLSAgXGxpbmVpaXtBX0RJTX17RGltIG1vZGUufQotICBcbGluZWlpe0FfTk9STUFMfXtOb3JtYWwgYXR0cmlidXRlLn0KLSAgXGxpbmVpaXtBX1NUQU5ET1VUfXtTdGFuZG91dCBtb2RlLn0KLSAgXGxpbmVpaXtBX1VOREVSTElORX17VW5kZXJsaW5lIG1vZGUufQotXGVuZHt0YWJsZWlpfQotCi1LZXlzIGFyZSByZWZlcnJlZCB0byBieSBpbnRlZ2VyIGNvbnN0YW50cyB3aXRoIG5hbWVzIHN0YXJ0aW5nIHdpdGggCi1cc2FtcHtLRVlffS4gICBUaGUgZXhhY3Qga2V5Y2FwcyBhdmFpbGFibGUgYXJlIHN5c3RlbSBkZXBlbmRlbnQuCi0KLSUgWFhYIHRoaXMgdGFibGUgaXMgZmFyIHRvbyBsYXJnZSEKLSUgWFhYIHNob3VsZCB0aGlzIHRhYmxlIGJlIGFscGhhYmV0aXplZD8KLQotXGJlZ2lue2xvbmd0YWJsZWlpfXtsfGx9e2NvZGV9e0tleSBjb25zdGFudH17S2V5fQotICBcbGluZWlpe0tFWV9NSU59e01pbmltdW0ga2V5IHZhbHVlfQotICBcbGluZWlpe0tFWV9CUkVBS317IEJyZWFrIGtleSAodW5yZWxpYWJsZSkgfQotICBcbGluZWlpe0tFWV9ET1dOfXsgRG93bi1hcnJvdyB9Ci0gIFxsaW5laWl7S0VZX1VQfXsgVXAtYXJyb3cgfQotICBcbGluZWlpe0tFWV9MRUZUfXsgTGVmdC1hcnJvdyB9Ci0gIFxsaW5laWl7S0VZX1JJR0hUfXsgUmlnaHQtYXJyb3cgfQotICBcbGluZWlpe0tFWV9IT01FfXsgSG9tZSBrZXkgKHVwd2FyZCtsZWZ0IGFycm93KSB9Ci0gIFxsaW5laWl7S0VZX0JBQ0tTUEFDRX17IEJhY2tzcGFjZSAodW5yZWxpYWJsZSkgfQotICBcbGluZWlpe0tFWV9GMH17IEZ1bmN0aW9uIGtleXMuICBVcCB0byA2NCBmdW5jdGlvbiBrZXlzIGFyZSBzdXBwb3J0ZWQuIH0KLSAgXGxpbmVpaXtLRVlfRlx2YXJ7bn19eyBWYWx1ZSBvZiBmdW5jdGlvbiBrZXkgXHZhcntufSB9Ci0gIFxsaW5laWl7S0VZX0RMfXsgRGVsZXRlIGxpbmUgfQotICBcbGluZWlpe0tFWV9JTH17IEluc2VydCBsaW5lIH0KLSAgXGxpbmVpaXtLRVlfREN9eyBEZWxldGUgY2hhcmFjdGVyIH0KLSAgXGxpbmVpaXtLRVlfSUN9eyBJbnNlcnQgY2hhciBvciBlbnRlciBpbnNlcnQgbW9kZSB9Ci0gIFxsaW5laWl7S0VZX0VJQ317IEV4aXQgaW5zZXJ0IGNoYXIgbW9kZSB9Ci0gIFxsaW5laWl7S0VZX0NMRUFSfXsgQ2xlYXIgc2NyZWVuIH0KLSAgXGxpbmVpaXtLRVlfRU9TfXsgQ2xlYXIgdG8gZW5kIG9mIHNjcmVlbiB9Ci0gIFxsaW5laWl7S0VZX0VPTH17IENsZWFyIHRvIGVuZCBvZiBsaW5lIH0KLSAgXGxpbmVpaXtLRVlfU0Z9eyBTY3JvbGwgMSBsaW5lIGZvcndhcmQgfQotICBcbGluZWlpe0tFWV9TUn17IFNjcm9sbCAxIGxpbmUgYmFja3dhcmQgKHJldmVyc2UpIH0KLSAgXGxpbmVpaXtLRVlfTlBBR0V9eyBOZXh0IHBhZ2UgfQotICBcbGluZWlpe0tFWV9QUEFHRX17IFByZXZpb3VzIHBhZ2UgfQotICBcbGluZWlpe0tFWV9TVEFCfXsgU2V0IHRhYiB9Ci0gIFxsaW5laWl7S0VZX0NUQUJ9eyBDbGVhciB0YWIgfQotICBcbGluZWlpe0tFWV9DQVRBQn17IENsZWFyIGFsbCB0YWJzIH0KLSAgXGxpbmVpaXtLRVlfRU5URVJ9eyBFbnRlciBvciBzZW5kICh1bnJlbGlhYmxlKSB9Ci0gIFxsaW5laWl7S0VZX1NSRVNFVH17IFNvZnQgKHBhcnRpYWwpIHJlc2V0ICh1bnJlbGlhYmxlKSB9Ci0gIFxsaW5laWl7S0VZX1JFU0VUfXsgUmVzZXQgb3IgaGFyZCByZXNldCAodW5yZWxpYWJsZSkgfQotICBcbGluZWlpe0tFWV9QUklOVH17IFByaW50IH0KLSAgXGxpbmVpaXtLRVlfTEx9eyBIb21lIGRvd24gb3IgYm90dG9tIChsb3dlciBsZWZ0KSB9Ci0gIFxsaW5laWl7S0VZX0ExfXsgVXBwZXIgbGVmdCBvZiBrZXlwYWQgfQotICBcbGluZWlpe0tFWV9BM317IFVwcGVyIHJpZ2h0IG9mIGtleXBhZCB9Ci0gIFxsaW5laWl7S0VZX0IyfXsgQ2VudGVyIG9mIGtleXBhZCB9Ci0gIFxsaW5laWl7S0VZX0MxfXsgTG93ZXIgbGVmdCBvZiBrZXlwYWQgfQotICBcbGluZWlpe0tFWV9DM317IExvd2VyIHJpZ2h0IG9mIGtleXBhZCB9Ci0gIFxsaW5laWl7S0VZX0JUQUJ9eyBCYWNrIHRhYiB9Ci0gIFxsaW5laWl7S0VZX0JFR317IEJlZyAoYmVnaW5uaW5nKSB9Ci0gIFxsaW5laWl7S0VZX0NBTkNFTH17IENhbmNlbCB9Ci0gIFxsaW5laWl7S0VZX0NMT1NFfXsgQ2xvc2UgfQotICBcbGluZWlpe0tFWV9DT01NQU5EfXsgQ21kIChjb21tYW5kKSB9Ci0gIFxsaW5laWl7S0VZX0NPUFl9eyBDb3B5IH0KLSAgXGxpbmVpaXtLRVlfQ1JFQVRFfXsgQ3JlYXRlIH0KLSAgXGxpbmVpaXtLRVlfRU5EfXsgRW5kIH0KLSAgXGxpbmVpaXtLRVlfRVhJVH17IEV4aXQgfQotICBcbGluZWlpe0tFWV9GSU5EfXsgRmluZCB9Ci0gIFxsaW5laWl7S0VZX0hFTFB9eyBIZWxwIH0KLSAgXGxpbmVpaXtLRVlfTUFSS317IE1hcmsgfQotICBcbGluZWlpe0tFWV9NRVNTQUdFfXsgTWVzc2FnZSB9Ci0gIFxsaW5laWl7S0VZX01PVkV9eyBNb3ZlIH0KLSAgXGxpbmVpaXtLRVlfTkVYVH17IE5leHQgfQotICBcbGluZWlpe0tFWV9PUEVOfXsgT3BlbiB9Ci0gIFxsaW5laWl7S0VZX09QVElPTlN9eyBPcHRpb25zIH0KLSAgXGxpbmVpaXtLRVlfUFJFVklPVVN9eyBQcmV2IChwcmV2aW91cykgfQotICBcbGluZWlpe0tFWV9SRURPfXsgUmVkbyB9Ci0gIFxsaW5laWl7S0VZX1JFRkVSRU5DRX17IFJlZiAocmVmZXJlbmNlKSB9Ci0gIFxsaW5laWl7S0VZX1JFRlJFU0h9eyBSZWZyZXNoIH0KLSAgXGxpbmVpaXtLRVlfUkVQTEFDRX17IFJlcGxhY2UgfQotICBcbGluZWlpe0tFWV9SRVNUQVJUfXsgUmVzdGFydCB9Ci0gIFxsaW5laWl7S0VZX1JFU1VNRX17IFJlc3VtZSB9Ci0gIFxsaW5laWl7S0VZX1NBVkV9eyBTYXZlIH0KLSAgXGxpbmVpaXtLRVlfU0JFR317IFNoaWZ0ZWQgQmVnIChiZWdpbm5pbmcpIH0KLSAgXGxpbmVpaXtLRVlfU0NBTkNFTH17IFNoaWZ0ZWQgQ2FuY2VsIH0KLSAgXGxpbmVpaXtLRVlfU0NPTU1BTkR9eyBTaGlmdGVkIENvbW1hbmQgfQotICBcbGluZWlpe0tFWV9TQ09QWX17IFNoaWZ0ZWQgQ29weSB9Ci0gIFxsaW5laWl7S0VZX1NDUkVBVEV9eyBTaGlmdGVkIENyZWF0ZSB9Ci0gIFxsaW5laWl7S0VZX1NEQ317IFNoaWZ0ZWQgRGVsZXRlIGNoYXIgfQotICBcbGluZWlpe0tFWV9TREx9eyBTaGlmdGVkIERlbGV0ZSBsaW5lIH0KLSAgXGxpbmVpaXtLRVlfU0VMRUNUfXsgU2VsZWN0IH0KLSAgXGxpbmVpaXtLRVlfU0VORH17IFNoaWZ0ZWQgRW5kIH0KLSAgXGxpbmVpaXtLRVlfU0VPTH17IFNoaWZ0ZWQgQ2xlYXIgbGluZSB9Ci0gIFxsaW5laWl7S0VZX1NFWElUfXsgU2hpZnRlZCBEeGl0IH0KLSAgXGxpbmVpaXtLRVlfU0ZJTkR9eyBTaGlmdGVkIEZpbmQgfQotICBcbGluZWlpe0tFWV9TSEVMUH17IFNoaWZ0ZWQgSGVscCB9Ci0gIFxsaW5laWl7S0VZX1NIT01FfXsgU2hpZnRlZCBIb21lIH0KLSAgXGxpbmVpaXtLRVlfU0lDfXsgU2hpZnRlZCBJbnB1dCB9Ci0gIFxsaW5laWl7S0VZX1NMRUZUfXsgU2hpZnRlZCBMZWZ0IGFycm93IH0KLSAgXGxpbmVpaXtLRVlfU01FU1NBR0V9eyBTaGlmdGVkIE1lc3NhZ2UgfQotICBcbGluZWlpe0tFWV9TTU9WRX17IFNoaWZ0ZWQgTW92ZSB9Ci0gIFxsaW5laWl7S0VZX1NORVhUfXsgU2hpZnRlZCBOZXh0IH0KLSAgXGxpbmVpaXtLRVlfU09QVElPTlN9eyBTaGlmdGVkIE9wdGlvbnMgfQotICBcbGluZWlpe0tFWV9TUFJFVklPVVN9eyBTaGlmdGVkIFByZXYgfQotICBcbGluZWlpe0tFWV9TUFJJTlR9eyBTaGlmdGVkIFByaW50IH0KLSAgXGxpbmVpaXtLRVlfU1JFRE99eyBTaGlmdGVkIFJlZG8gfQotICBcbGluZWlpe0tFWV9TUkVQTEFDRX17IFNoaWZ0ZWQgUmVwbGFjZSB9Ci0gIFxsaW5laWl7S0VZX1NSSUdIVH17IFNoaWZ0ZWQgUmlnaHQgYXJyb3cgfQotICBcbGluZWlpe0tFWV9TUlNVTUV9eyBTaGlmdGVkIFJlc3VtZSB9Ci0gIFxsaW5laWl7S0VZX1NTQVZFfXsgU2hpZnRlZCBTYXZlIH0KLSAgXGxpbmVpaXtLRVlfU1NVU1BFTkR9eyBTaGlmdGVkIFN1c3BlbmQgfQotICBcbGluZWlpe0tFWV9TVU5ET317IFNoaWZ0ZWQgVW5kbyB9Ci0gIFxsaW5laWl7S0VZX1NVU1BFTkR9eyBTdXNwZW5kIH0KLSAgXGxpbmVpaXtLRVlfVU5ET317IFVuZG8gfQotICBcbGluZWlpe0tFWV9NT1VTRX17IE1vdXNlIGV2ZW50IGhhcyBvY2N1cnJlZCB9Ci0gIFxsaW5laWl7S0VZX1JFU0laRX17IFRlcm1pbmFsIHJlc2l6ZSBldmVudCB9Ci0gIFxsaW5laWl7S0VZX01BWH17TWF4aW11bSBrZXkgdmFsdWV9Ci1cZW5ke2xvbmd0YWJsZWlpfQotCi1PbiBWVDEwMHMgYW5kIHRoZWlyIHNvZnR3YXJlIGVtdWxhdGlvbnMsIHN1Y2ggYXMgWCB0ZXJtaW5hbCBlbXVsYXRvcnMsCi10aGVyZSBhcmUgbm9ybWFsbHkgYXQgbGVhc3QgZm91ciBmdW5jdGlvbiBrZXlzIChcY29uc3RhbnR7S0VZX0YxfSwKLVxjb25zdGFudHtLRVlfRjJ9LCBcY29uc3RhbnR7S0VZX0YzfSwgXGNvbnN0YW50e0tFWV9GNH0pIGF2YWlsYWJsZSwKLWFuZCB0aGUgYXJyb3cga2V5cyBtYXBwZWQgdG8gXGNvbnN0YW50e0tFWV9VUH0sIFxjb25zdGFudHtLRVlfRE9XTn0sCi1cY29uc3RhbnR7S0VZX0xFRlR9IGFuZCBcY29uc3RhbnR7S0VZX1JJR0hUfSBpbiB0aGUgb2J2aW91cyB3YXkuICBJZgoteW91ciBtYWNoaW5lIGhhcyBhIFBDIGtleWJvYXJkLCBpdCBpcyBzYWZlIHRvIGV4cGVjdCBhcnJvdyBrZXlzIGFuZAotdHdlbHZlIGZ1bmN0aW9uIGtleXMgKG9sZGVyIFBDIGtleWJvYXJkcyBtYXkgaGF2ZSBvbmx5IHRlbiBmdW5jdGlvbgota2V5cyk7IGFsc28sIHRoZSBmb2xsb3dpbmcga2V5cGFkIG1hcHBpbmdzIGFyZSBzdGFuZGFyZDoKLQotXGJlZ2lue3RhYmxlaWl9e2x8bH17a2JkfXtLZXljYXB9e0NvbnN0YW50fQotICAgXGxpbmVpaXtJbnNlcnR9e0tFWV9JQ30KLSAgIFxsaW5laWl7RGVsZXRlfXtLRVlfREN9Ci0gICBcbGluZWlpe0hvbWV9e0tFWV9IT01FfQotICAgXGxpbmVpaXtFbmR9e0tFWV9FTkR9Ci0gICBcbGluZWlpe1BhZ2UgVXB9e0tFWV9OUEFHRX0KLSAgIFxsaW5laWl7UGFnZSBEb3dufXtLRVlfUFBBR0V9Ci1cZW5ke3RhYmxlaWl9Ci0KLVRoZSBmb2xsb3dpbmcgdGFibGUgbGlzdHMgY2hhcmFjdGVycyBmcm9tIHRoZSBhbHRlcm5hdGUgY2hhcmFjdGVyIHNldC4KLVRoZXNlIGFyZSBpbmhlcml0ZWQgZnJvbSB0aGUgVlQxMDAgdGVybWluYWwsIGFuZCB3aWxsIGdlbmVyYWxseSBiZSAKLWF2YWlsYWJsZSBvbiBzb2Z0d2FyZSBlbXVsYXRpb25zIHN1Y2ggYXMgWCB0ZXJtaW5hbHMuICBXaGVuIHRoZXJlCi1pcyBubyBncmFwaGljIGF2YWlsYWJsZSwgY3Vyc2VzIGZhbGxzIGJhY2sgb24gYSBjcnVkZSBwcmludGFibGUgQVNDSUkKLWFwcHJveGltYXRpb24uCi1cbm90ZXtUaGVzZSBhcmUgYXZhaWxhYmxlIG9ubHkgYWZ0ZXIgXGZ1bmN0aW9ue2luaXRzY3IoKX0gaGFzIAotYmVlbiBjYWxsZWQufQotCi1cYmVnaW57bG9uZ3RhYmxlaWl9e2x8bH17Y29kZX17QUNTIGNvZGV9e01lYW5pbmd9Ci0gIFxsaW5laWl7QUNTX0JCU1N9e2FsdGVybmF0ZSBuYW1lIGZvciB1cHBlciByaWdodCBjb3JuZXJ9Ci0gIFxsaW5laWl7QUNTX0JMT0NLfXtzb2xpZCBzcXVhcmUgYmxvY2t9Ci0gIFxsaW5laWl7QUNTX0JPQVJEfXtib2FyZCBvZiBzcXVhcmVzfQotICBcbGluZWlpe0FDU19CU0JTfXthbHRlcm5hdGUgbmFtZSBmb3IgaG9yaXpvbnRhbCBsaW5lfQotICBcbGluZWlpe0FDU19CU1NCfXthbHRlcm5hdGUgbmFtZSBmb3IgdXBwZXIgbGVmdCBjb3JuZXJ9Ci0gIFxsaW5laWl7QUNTX0JTU1N9e2FsdGVybmF0ZSBuYW1lIGZvciB0b3AgdGVlfQotICBcbGluZWlpe0FDU19CVEVFfXtib3R0b20gdGVlfQotICBcbGluZWlpe0FDU19CVUxMRVR9e2J1bGxldH0KLSAgXGxpbmVpaXtBQ1NfQ0tCT0FSRH17Y2hlY2tlciBib2FyZCAoc3RpcHBsZSl9Ci0gIFxsaW5laWl7QUNTX0RBUlJPV317YXJyb3cgcG9pbnRpbmcgZG93bn0KLSAgXGxpbmVpaXtBQ1NfREVHUkVFfXtkZWdyZWUgc3ltYm9sfQotICBcbGluZWlpe0FDU19ESUFNT05EfXtkaWFtb25kfQotICBcbGluZWlpe0FDU19HRVFVQUx9e2dyZWF0ZXItdGhhbi1vci1lcXVhbC10b30KLSAgXGxpbmVpaXtBQ1NfSExJTkV9e2hvcml6b250YWwgbGluZX0KLSAgXGxpbmVpaXtBQ1NfTEFOVEVSTn17bGFudGVybiBzeW1ib2x9Ci0gIFxsaW5laWl7QUNTX0xBUlJPV317bGVmdCBhcnJvd30KLSAgXGxpbmVpaXtBQ1NfTEVRVUFMfXtsZXNzLXRoYW4tb3ItZXF1YWwtdG99Ci0gIFxsaW5laWl7QUNTX0xMQ09STkVSfXtsb3dlciBsZWZ0LWhhbmQgY29ybmVyfQotICBcbGluZWlpe0FDU19MUkNPUk5FUn17bG93ZXIgcmlnaHQtaGFuZCBjb3JuZXJ9Ci0gIFxsaW5laWl7QUNTX0xURUV9e2xlZnQgdGVlfQotICBcbGluZWlpe0FDU19ORVFVQUx9e25vdC1lcXVhbCBzaWdufQotICBcbGluZWlpe0FDU19QSX17bGV0dGVyIHBpfQotICBcbGluZWlpe0FDU19QTE1JTlVTfXtwbHVzLW9yLW1pbnVzIHNpZ259Ci0gIFxsaW5laWl7QUNTX1BMVVN9e2JpZyBwbHVzIHNpZ259Ci0gIFxsaW5laWl7QUNTX1JBUlJPV317cmlnaHQgYXJyb3d9Ci0gIFxsaW5laWl7QUNTX1JURUV9e3JpZ2h0IHRlZX0KLSAgXGxpbmVpaXtBQ1NfUzF9e3NjYW4gbGluZSAxfQotICBcbGluZWlpe0FDU19TM317c2NhbiBsaW5lIDN9Ci0gIFxsaW5laWl7QUNTX1M3fXtzY2FuIGxpbmUgN30KLSAgXGxpbmVpaXtBQ1NfUzl9e3NjYW4gbGluZSA5fQotICBcbGluZWlpe0FDU19TQkJTfXthbHRlcm5hdGUgbmFtZSBmb3IgbG93ZXIgcmlnaHQgY29ybmVyfQotICBcbGluZWlpe0FDU19TQlNCfXthbHRlcm5hdGUgbmFtZSBmb3IgdmVydGljYWwgbGluZX0KLSAgXGxpbmVpaXtBQ1NfU0JTU317YWx0ZXJuYXRlIG5hbWUgZm9yIHJpZ2h0IHRlZX0KLSAgXGxpbmVpaXtBQ1NfU1NCQn17YWx0ZXJuYXRlIG5hbWUgZm9yIGxvd2VyIGxlZnQgY29ybmVyfQotICBcbGluZWlpe0FDU19TU0JTfXthbHRlcm5hdGUgbmFtZSBmb3IgYm90dG9tIHRlZX0KLSAgXGxpbmVpaXtBQ1NfU1NTQn17YWx0ZXJuYXRlIG5hbWUgZm9yIGxlZnQgdGVlfQotICBcbGluZWlpe0FDU19TU1NTfXthbHRlcm5hdGUgbmFtZSBmb3IgY3Jvc3NvdmVyIG9yIGJpZyBwbHVzfQotICBcbGluZWlpe0FDU19TVEVSTElOR317cG91bmQgc3Rlcmxpbmd9Ci0gIFxsaW5laWl7QUNTX1RURUV9e3RvcCB0ZWV9Ci0gIFxsaW5laWl7QUNTX1VBUlJPV317dXAgYXJyb3d9Ci0gIFxsaW5laWl7QUNTX1VMQ09STkVSfXt1cHBlciBsZWZ0IGNvcm5lcn0KLSAgXGxpbmVpaXtBQ1NfVVJDT1JORVJ9e3VwcGVyIHJpZ2h0IGNvcm5lcn0KLSAgXGxpbmVpaXtBQ1NfVkxJTkV9e3ZlcnRpY2FsIGxpbmV9Ci1cZW5ke2xvbmd0YWJsZWlpfQotCi1UaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzIHRoZSBwcmVkZWZpbmVkIGNvbG9yczoKLQotXGJlZ2lue3RhYmxlaWl9e2x8bH17Y29kZX17Q29uc3RhbnR9e0NvbG9yfQotICBcbGluZWlpe0NPTE9SX0JMQUNLfXtCbGFja30KLSAgXGxpbmVpaXtDT0xPUl9CTFVFfXtCbHVlfQotICBcbGluZWlpe0NPTE9SX0NZQU59e0N5YW4gKGxpZ2h0IGdyZWVuaXNoIGJsdWUpfQotICBcbGluZWlpe0NPTE9SX0dSRUVOfXtHcmVlbn0KLSAgXGxpbmVpaXtDT0xPUl9NQUdFTlRBfXtNYWdlbnRhIChwdXJwbGlzaCByZWQpfQotICBcbGluZWlpe0NPTE9SX1JFRH17UmVkfQotICBcbGluZWlpe0NPTE9SX1dISVRFfXtXaGl0ZX0KLSAgXGxpbmVpaXtDT0xPUl9ZRUxMT1d9e1llbGxvd30KLVxlbmR7dGFibGVpaX0KLQotXHNlY3Rpb257XG1vZHVsZXtjdXJzZXMudGV4dHBhZH0gLS0tCi0gICAgICAgICBUZXh0IGlucHV0IHdpZGdldCBmb3IgY3Vyc2VzIHByb2dyYW1zfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17Y3Vyc2VzLnRleHRwYWR9Ci1cc2VjdGlvbmF1dGhvcntFcmljIFJheW1vbmR9e2VzckB0aHlyc3VzLmNvbX0KLVxtb2R1bGVhdXRob3J7RXJpYyBSYXltb25kfXtlc3JAdGh5cnN1cy5jb219Ci1cbW9kdWxlc3lub3BzaXN7RW1hY3MtbGlrZSBpbnB1dCBlZGl0aW5nIGluIGEgY3Vyc2VzIHdpbmRvdy59Ci1cdmVyc2lvbmFkZGVkezEuNn0KLQotVGhlIFxtb2R1bGV7Y3Vyc2VzLnRleHRwYWR9IG1vZHVsZSBwcm92aWRlcyBhIFxjbGFzc3tUZXh0Ym94fSBjbGFzcwotdGhhdCBoYW5kbGVzIGVsZW1lbnRhcnkgdGV4dCBlZGl0aW5nIGluIGEgY3Vyc2VzIHdpbmRvdywgc3VwcG9ydGluZyBhCi1zZXQgb2Yga2V5YmluZGluZ3MgcmVzZW1ibGluZyB0aG9zZSBvZiBFbWFjcyAodGh1cywgYWxzbyBvZiBOZXRzY2FwZQotTmF2aWdhdG9yLCBCQmVkaXQgNi54LCBGcmFtZU1ha2VyLCBhbmQgbWFueSBvdGhlciBwcm9ncmFtcykuICBUaGUKLW1vZHVsZSBhbHNvIHByb3ZpZGVzIGEgcmVjdGFuZ2xlLWRyYXdpbmcgZnVuY3Rpb24gdXNlZnVsIGZvciBmcmFtaW5nCi10ZXh0IGJveGVzIG9yIGZvciBvdGhlciBwdXJwb3Nlcy4KLQotVGhlIG1vZHVsZSBcbW9kdWxle2N1cnNlcy50ZXh0cGFkfSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb246Ci0KLVxiZWdpbntmdW5jZGVzY317cmVjdGFuZ2xlfXt3aW4sIHVseSwgdWx4LCBscnksIGxyeH0KLURyYXcgYSByZWN0YW5nbGUuICBUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHdpbmRvdyBvYmplY3Q7IHRoZQotcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gdGhhdCB3aW5kb3cuICBUaGUKLXNlY29uZCBhbmQgdGhpcmQgYXJndW1lbnRzIGFyZSB0aGUgeSBhbmQgeCBjb29yZGluYXRlcyBvZiB0aGUgdXBwZXIKLWxlZnQgaGFuZCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZSB0byBiZSBkcmF3bjsgdGhlIGZvdXJ0aCBhbmQgZmlmdGgKLWFyZ3VtZW50cyBhcmUgdGhlIHkgYW5kIHggY29vcmRpbmF0ZXMgb2YgdGhlIGxvd2VyIHJpZ2h0IGhhbmQgY29ybmVyLgotVGhlIHJlY3RhbmdsZSB3aWxsIGJlIGRyYXduIHVzaW5nIFZUMTAwL0lCTSBQQyBmb3JtcyBjaGFyYWN0ZXJzIG9uCi10ZXJtaW5hbHMgdGhhdCBtYWtlIHRoaXMgcG9zc2libGUgKGluY2x1ZGluZyB4dGVybSBhbmQgbW9zdCBvdGhlcgotc29mdHdhcmUgdGVybWluYWwgZW11bGF0b3JzKS4gIE90aGVyd2lzZSBpdCB3aWxsIGJlIGRyYXduIHdpdGggQVNDSUkgCi1kYXNoZXMsIHZlcnRpY2FsIGJhcnMsIGFuZCBwbHVzIHNpZ25zLgotXGVuZHtmdW5jZGVzY30KLQotCi1cc3Vic2VjdGlvbntUZXh0Ym94IG9iamVjdHMgXGxhYmVse2N1cnNlcy10ZXh0cGFkLW9iamVjdHN9fQotCi1Zb3UgY2FuIGluc3RhbnRpYXRlIGEgXGNsYXNze1RleHRib3h9IG9iamVjdCBhcyBmb2xsb3dzOgotCi1cYmVnaW57Y2xhc3NkZXNjfXtUZXh0Ym94fXt3aW59Ci1SZXR1cm4gYSB0ZXh0Ym94IHdpZGdldCBvYmplY3QuICBUaGUgXHZhcnt3aW59IGFyZ3VtZW50IHNob3VsZCBiZSBhCi1jdXJzZXMgXGNsYXNze1dpbmRvd09iamVjdH0gaW4gd2hpY2ggdGhlIHRleHRib3ggaXMgdG8gYmUgY29udGFpbmVkLgotVGhlIGVkaXQgY3Vyc29yIG9mIHRoZSB0ZXh0Ym94IGlzIGluaXRpYWxseSBsb2NhdGVkIGF0IHRoZSB1cHBlciBsZWZ0Ci1oYW5kIGNvcm5lciBvZiB0aGUgY29udGFpbmluZyB3aW5kb3csIHdpdGggY29vcmRpbmF0ZXMgXGNvZGV7KDAsIDApfS4KLVRoZSBpbnN0YW5jZSdzIFxtZW1iZXJ7c3RyaXBzcGFjZXN9IGZsYWcgaXMgaW5pdGlhbGx5IG9uLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxjbGFzc3tUZXh0Ym94fSBvYmplY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotCi1cYmVnaW57bWV0aG9kZGVzY317ZWRpdH17XG9wdGlvbmFse3ZhbGlkYXRvcn19Ci1UaGlzIGlzIHRoZSBlbnRyeSBwb2ludCB5b3Ugd2lsbCBub3JtYWxseSB1c2UuICBJdCBhY2NlcHRzIGVkaXRpbmcKLWtleXN0cm9rZXMgdW50aWwgb25lIG9mIHRoZSB0ZXJtaW5hdGlvbiBrZXlzdHJva2VzIGlzIGVudGVyZWQuICBJZgotXHZhcnt2YWxpZGF0b3J9IGlzIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGEgZnVuY3Rpb24uICBJdCB3aWxsIGJlIGNhbGxlZAotZm9yIGVhY2gga2V5c3Ryb2tlIGVudGVyZWQgd2l0aCB0aGUga2V5c3Ryb2tlIGFzIGEgcGFyYW1ldGVyOyBjb21tYW5kCi1kaXNwYXRjaCBpcyBkb25lIG9uIHRoZSByZXN1bHQuIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHdpbmRvdwotY29udGVudHMgYXMgYSBzdHJpbmc7IHdoZXRoZXIgYmxhbmtzIGluIHRoZSB3aW5kb3cgYXJlIGluY2x1ZGVkIGlzCi1hZmZlY3RlZCBieSB0aGUgXG1lbWJlcntzdHJpcHNwYWNlc30gbWVtYmVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317ZG9fY29tbWFuZH17Y2h9Ci1Qcm9jZXNzIGEgc2luZ2xlIGNvbW1hbmQga2V5c3Ryb2tlLiAgSGVyZSBhcmUgdGhlIHN1cHBvcnRlZCBzcGVjaWFsCi1rZXlzdHJva2VzOiAKLQotXGJlZ2lue3RhYmxlaWl9e2x8bH17a2JkfXtLZXlzdHJva2V9e0FjdGlvbn0KLSAgXGxpbmVpaXtDb250cm9sLUF9e0dvIHRvIGxlZnQgZWRnZSBvZiB3aW5kb3cufQotICBcbGluZWlpe0NvbnRyb2wtQn17Q3Vyc29yIGxlZnQsIHdyYXBwaW5nIHRvIHByZXZpb3VzIGxpbmUgaWYgYXBwcm9wcmlhdGUufQotICBcbGluZWlpe0NvbnRyb2wtRH17RGVsZXRlIGNoYXJhY3RlciB1bmRlciBjdXJzb3IufQotICBcbGluZWlpe0NvbnRyb2wtRX17R28gdG8gcmlnaHQgZWRnZSAoc3RyaXBzcGFjZXMgb2ZmKSBvciBlbmQgb2YgbGluZQotICAgICAgICAgICAgICAgICAgKHN0cmlwc3BhY2VzIG9uKS59Ci0gIFxsaW5laWl7Q29udHJvbC1GfXtDdXJzb3IgcmlnaHQsIHdyYXBwaW5nIHRvIG5leHQgbGluZSB3aGVuIGFwcHJvcHJpYXRlLn0KLSAgXGxpbmVpaXtDb250cm9sLUd9e1Rlcm1pbmF0ZSwgcmV0dXJuaW5nIHRoZSB3aW5kb3cgY29udGVudHMufQotICBcbGluZWlpe0NvbnRyb2wtSH17RGVsZXRlIGNoYXJhY3RlciBiYWNrd2FyZC59Ci0gIFxsaW5laWl7Q29udHJvbC1KfXtUZXJtaW5hdGUgaWYgdGhlIHdpbmRvdyBpcyAxIGxpbmUsIG90aGVyd2lzZQotICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0IG5ld2xpbmUufQotICBcbGluZWlpe0NvbnRyb2wtS317SWYgbGluZSBpcyBibGFuaywgZGVsZXRlIGl0LCBvdGhlcndpc2UgY2xlYXIgdG8KLSAgICAgICAgICAgICAgICAgICAgIGVuZCBvZiBsaW5lLn0KLSAgXGxpbmVpaXtDb250cm9sLUx9e1JlZnJlc2ggc2NyZWVuLn0KLSAgXGxpbmVpaXtDb250cm9sLU59e0N1cnNvciBkb3duOyBtb3ZlIGRvd24gb25lIGxpbmUufQotICBcbGluZWlpe0NvbnRyb2wtT317SW5zZXJ0IGEgYmxhbmsgbGluZSBhdCBjdXJzb3IgbG9jYXRpb24ufQotICBcbGluZWlpe0NvbnRyb2wtUH17Q3Vyc29yIHVwOyBtb3ZlIHVwIG9uZSBsaW5lLn0KLVxlbmR7dGFibGVpaX0KLQotTW92ZSBvcGVyYXRpb25zIGRvIG5vdGhpbmcgaWYgdGhlIGN1cnNvciBpcyBhdCBhbiBlZGdlIHdoZXJlIHRoZQotbW92ZW1lbnQgaXMgbm90IHBvc3NpYmxlLiAgVGhlIGZvbGxvd2luZyBzeW5vbnltcyBhcmUgc3VwcG9ydGVkIHdoZXJlCi1wb3NzaWJsZToKLQotXGJlZ2lue3RhYmxlaWl9e2x8bH17Y29uc3RhbnR9e0NvbnN0YW50fXtLZXlzdHJva2V9Ci0gIFxsaW5laWl7S0VZX0xFRlR9e1xrYmR7Q29udHJvbC1CfX0KLSAgXGxpbmVpaXtLRVlfUklHSFR9e1xrYmR7Q29udHJvbC1GfX0KLSAgXGxpbmVpaXtLRVlfVVB9e1xrYmR7Q29udHJvbC1QfX0KLSAgXGxpbmVpaXtLRVlfRE9XTn17XGtiZHtDb250cm9sLU59fQotICBcbGluZWlpe0tFWV9CQUNLU1BBQ0V9e1xrYmR7Q29udHJvbC1ofX0KLVxlbmR7dGFibGVpaX0KLQotQWxsIG90aGVyIGtleXN0cm9rZXMgYXJlIHRyZWF0ZWQgYXMgYSBjb21tYW5kIHRvIGluc2VydCB0aGUgZ2l2ZW4KLWNoYXJhY3RlciBhbmQgbW92ZSByaWdodCAod2l0aCBsaW5lIHdyYXBwaW5nKS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2dhdGhlcn17fQotVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgd2luZG93IGNvbnRlbnRzIGFzIGEgc3RyaW5nOyB3aGV0aGVyIGJsYW5rcyBpbgotdGhlIHdpbmRvdyBhcmUgaW5jbHVkZWQgaXMgYWZmZWN0ZWQgYnkgdGhlIFxtZW1iZXJ7c3RyaXBzcGFjZXN9Ci1tZW1iZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXtzdHJpcHNwYWNlc30KLVRoaXMgZGF0YSBtZW1iZXIgaXMgYSBmbGFnIHdoaWNoIGNvbnRyb2xzIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBibGFua3MgaW4KLXRoZSB3aW5kb3cuICBXaGVuIGl0IGlzIG9uLCB0cmFpbGluZyBibGFua3Mgb24gZWFjaCBsaW5lIGFyZSBpZ25vcmVkOwotYW55IGN1cnNvciBtb3Rpb24gdGhhdCB3b3VsZCBsYW5kIHRoZSBjdXJzb3Igb24gYSB0cmFpbGluZyBibGFuayBnb2VzCi10byB0aGUgZW5kIG9mIHRoYXQgbGluZSBpbnN0ZWFkLCBhbmQgdHJhaWxpbmcgYmxhbmtzIGFyZSBzdHJpcHBlZCB3aGVuCi10aGUgd2luZG93IGNvbnRlbnRzIGFyZSBnYXRoZXJlZC4KLVxlbmR7bWVtYmVyZGVzY30KLQotCi1cc2VjdGlvbntcbW9kdWxle2N1cnNlcy53cmFwcGVyfSAtLS0KLSAgICAgICAgIFRlcm1pbmFsIGhhbmRsZXIgZm9yIGN1cnNlcyBwcm9ncmFtc30KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2N1cnNlcy53cmFwcGVyfQotXHNlY3Rpb25hdXRob3J7RXJpYyBSYXltb25kfXtlc3JAdGh5cnN1cy5jb219Ci1cbW9kdWxlYXV0aG9ye0VyaWMgUmF5bW9uZH17ZXNyQHRoeXJzdXMuY29tfQotXG1vZHVsZXN5bm9wc2lze1Rlcm1pbmFsIGNvbmZpZ3VyYXRpb24gd3JhcHBlciBmb3IgY3Vyc2VzIHByb2dyYW1zLn0KLVx2ZXJzaW9uYWRkZWR7MS42fQotCi1UaGlzIG1vZHVsZSBzdXBwbGllcyBvbmUgZnVuY3Rpb24sIFxmdW5jdGlvbnt3cmFwcGVyKCl9LCB3aGljaCBydW5zCi1hbm90aGVyIGZ1bmN0aW9uIHdoaWNoIHNob3VsZCBiZSB0aGUgcmVzdCBvZiB5b3VyIGN1cnNlcy11c2luZwotYXBwbGljYXRpb24uICBJZiB0aGUgYXBwbGljYXRpb24gcmFpc2VzIGFuIGV4Y2VwdGlvbiwKLVxmdW5jdGlvbnt3cmFwcGVyKCl9IHdpbGwgcmVzdG9yZSB0aGUgdGVybWluYWwgdG8gYSBzYW5lIHN0YXRlIGJlZm9yZQotcmUtcmFpc2luZyB0aGUgZXhjZXB0aW9uIGFuZCBnZW5lcmF0aW5nIGEgdHJhY2ViYWNrLgotCi1cYmVnaW57ZnVuY2Rlc2N9e3dyYXBwZXJ9e2Z1bmMsIFxtb3JlYXJnc30KLVdyYXBwZXIgZnVuY3Rpb24gdGhhdCBpbml0aWFsaXplcyBjdXJzZXMgYW5kIGNhbGxzIGFub3RoZXIgZnVuY3Rpb24sCi1cdmFye2Z1bmN9LCByZXN0b3Jpbmcgbm9ybWFsIGtleWJvYXJkL3NjcmVlbiBiZWhhdmlvciBvbiBlcnJvci4KLVRoZSBjYWxsYWJsZSBvYmplY3QgXHZhcntmdW5jfSBpcyB0aGVuIHBhc3NlZCB0aGUgbWFpbiB3aW5kb3cgJ3N0ZHNjcicKLWFzIGl0cyBmaXJzdCBhcmd1bWVudCwgZm9sbG93ZWQgYnkgYW55IG90aGVyIGFyZ3VtZW50cyBwYXNzZWQgdG8KLVxmdW5jdGlvbnt3cmFwcGVyKCl9LgotXGVuZHtmdW5jZGVzY30KLQotQmVmb3JlIGNhbGxpbmcgdGhlIGhvb2sgZnVuY3Rpb24sIFxmdW5jdGlvbnt3cmFwcGVyKCl9IHR1cm5zIG9uIGNicmVhawotbW9kZSwgdHVybnMgb2ZmIGVjaG8sIGVuYWJsZXMgdGhlIHRlcm1pbmFsIGtleXBhZCwgYW5kIGluaXRpYWxpemVzCi1jb2xvcnMgaWYgdGhlIHRlcm1pbmFsIGhhcyBjb2xvciBzdXBwb3J0LiAgT24gZXhpdCAod2hldGhlciBub3JtYWxseQotb3IgYnkgZXhjZXB0aW9uKSBpdCByZXN0b3JlcyBjb29rZWQgbW9kZSwgdHVybnMgb24gZWNobywgYW5kIGRpc2FibGVzCi10aGUgdGVybWluYWwga2V5cGFkLgotCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmN1cnNlc3BhbmVsLnRleCBiL0RvYy9saWIvbGliY3Vyc2VzcGFuZWwudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGQ4M2UzLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGliY3Vyc2VzcGFuZWwudGV4CisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtjdXJzZXMucGFuZWx9IC0tLQotICAgICAgICAgQSBwYW5lbCBzdGFjayBleHRlbnNpb24gZm9yIGN1cnNlcy59Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtjdXJzZXMucGFuZWx9Ci1cc2VjdGlvbmF1dGhvcntBLk0uIEt1Y2hsaW5nfXthbWtAYW1rLmNhfQotXG1vZHVsZXN5bm9wc2lze0EgcGFuZWwgc3RhY2sgZXh0ZW5zaW9uIHRoYXQgYWRkcyBkZXB0aCB0byAKLSAgICAgICAgICAgICAgICBjdXJzZXMgd2luZG93cy59Ci0KLVBhbmVscyBhcmUgd2luZG93cyB3aXRoIHRoZSBhZGRlZCBmZWF0dXJlIG9mIGRlcHRoLCBzbyB0aGV5IGNhbiBiZQotc3RhY2tlZCBvbiB0b3Agb2YgZWFjaCBvdGhlciwgYW5kIG9ubHkgdGhlIHZpc2libGUgcG9ydGlvbnMgb2YKLWVhY2ggd2luZG93IHdpbGwgYmUgZGlzcGxheWVkLiAgUGFuZWxzIGNhbiBiZSBhZGRlZCwgbW92ZWQgdXAKLW9yIGRvd24gaW4gdGhlIHN0YWNrLCBhbmQgcmVtb3ZlZC4gCi0KLVxzdWJzZWN0aW9ue0Z1bmN0aW9ucyBcbGFiZWx7Y3Vyc2VzcGFuZWwtZnVuY3Rpb25zfX0KLQotVGhlIG1vZHVsZSBcbW9kdWxle2N1cnNlcy5wYW5lbH0gZGVmaW5lcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKLQotCi1cYmVnaW57ZnVuY2Rlc2N9e2JvdHRvbV9wYW5lbH17fQotUmV0dXJucyB0aGUgYm90dG9tIHBhbmVsIGluIHRoZSBwYW5lbCBzdGFjay4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bmV3X3BhbmVsfXt3aW59Ci1SZXR1cm5zIGEgcGFuZWwgb2JqZWN0LCBhc3NvY2lhdGluZyBpdCB3aXRoIHRoZSBnaXZlbiB3aW5kb3cgXHZhcnt3aW59LgotQmUgYXdhcmUgdGhhdCB5b3UgbmVlZCB0byBrZWVwIHRoZSByZXR1cm5lZCBwYW5lbCBvYmplY3QgcmVmZXJlbmNlZAotZXhwbGljaXRseS4gIElmIHlvdSBkb24ndCwgdGhlIHBhbmVsIG9iamVjdCBpcyBnYXJiYWdlIGNvbGxlY3RlZCBhbmQKLXJlbW92ZWQgZnJvbSB0aGUgcGFuZWwgc3RhY2suCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3RvcF9wYW5lbH17fQotUmV0dXJucyB0aGUgdG9wIHBhbmVsIGluIHRoZSBwYW5lbCBzdGFjay4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dXBkYXRlX3BhbmVsc317fQotVXBkYXRlcyB0aGUgdmlydHVhbCBzY3JlZW4gYWZ0ZXIgY2hhbmdlcyBpbiB0aGUgcGFuZWwgc3RhY2suIFRoaXMgZG9lcwotbm90IGNhbGwgXGZ1bmN0aW9ue2N1cnNlcy5kb3VwZGF0ZSgpfSwgc28geW91J2xsIGhhdmUgdG8gZG8gdGhpcyB5b3Vyc2VsZi4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxzdWJzZWN0aW9ue1BhbmVsIE9iamVjdHMgXGxhYmVse2N1cnNlcy1wYW5lbC1vYmplY3RzfX0KLQotUGFuZWwgb2JqZWN0cywgYXMgcmV0dXJuZWQgYnkgXGZ1bmN0aW9ue25ld19wYW5lbCgpfSBhYm92ZSwgYXJlIHdpbmRvd3MKLXdpdGggYSBzdGFja2luZyBvcmRlci4gVGhlcmUncyBhbHdheXMgYSB3aW5kb3cgYXNzb2NpYXRlZCB3aXRoIGEKLXBhbmVsIHdoaWNoIGRldGVybWluZXMgdGhlIGNvbnRlbnQsIHdoaWxlIHRoZSBwYW5lbCBtZXRob2RzIGFyZQotcmVzcG9uc2libGUgZm9yIHRoZSB3aW5kb3cncyBkZXB0aCBpbiB0aGUgcGFuZWwgc3RhY2suCi0KLVBhbmVsIG9iamVjdHMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtQYW5lbF17YWJvdmV9e30KLVJldHVybnMgdGhlIHBhbmVsIGFib3ZlIHRoZSBjdXJyZW50IHBhbmVsLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUGFuZWxde2JlbG93fXt9Ci1SZXR1cm5zIHRoZSBwYW5lbCBiZWxvdyB0aGUgY3VycmVudCBwYW5lbC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1BhbmVsXXtib3R0b219e30KLVB1c2ggdGhlIHBhbmVsIHRvIHRoZSBib3R0b20gb2YgdGhlIHN0YWNrLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUGFuZWxde2hpZGRlbn17fQotUmV0dXJucyB0cnVlIGlmIHRoZSBwYW5lbCBpcyBoaWRkZW4gKG5vdCB2aXNpYmxlKSwgZmFsc2Ugb3RoZXJ3aXNlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUGFuZWxde2hpZGV9e30KLUhpZGUgdGhlIHBhbmVsLiBUaGlzIGRvZXMgbm90IGRlbGV0ZSB0aGUgb2JqZWN0LCBpdCBqdXN0IG1ha2VzIHRoZQotd2luZG93IG9uIHNjcmVlbiBpbnZpc2libGUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtQYW5lbF17bW92ZX17eSwgeH0KLU1vdmUgdGhlIHBhbmVsIHRvIHRoZSBzY3JlZW4gY29vcmRpbmF0ZXMgXGNvZGV7KFx2YXJ7eX0sIFx2YXJ7eH0pfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1BhbmVsXXtyZXBsYWNlfXt3aW59Ci1DaGFuZ2UgdGhlIHdpbmRvdyBhc3NvY2lhdGVkIHdpdGggdGhlIHBhbmVsIHRvIHRoZSB3aW5kb3cgXHZhcnt3aW59LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUGFuZWxde3NldF91c2VycHRyfXtvYmp9Ci1TZXQgdGhlIHBhbmVsJ3MgdXNlciBwb2ludGVyIHRvIFx2YXJ7b2JqfS4gVGhpcyBpcyB1c2VkIHRvIGFzc29jaWF0ZSBhbgotYXJiaXRyYXJ5IHBpZWNlIG9mIGRhdGEgd2l0aCB0aGUgcGFuZWwsIGFuZCBjYW4gYmUgYW55IFB5dGhvbiBvYmplY3QuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtQYW5lbF17c2hvd317fQotRGlzcGxheSB0aGUgcGFuZWwgKHdoaWNoIG1pZ2h0IGhhdmUgYmVlbiBoaWRkZW4pLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUGFuZWxde3RvcH17fQotUHVzaCBwYW5lbCB0byB0aGUgdG9wIG9mIHRoZSBzdGFjay4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1BhbmVsXXt1c2VycHRyfXt9Ci1SZXR1cm5zIHRoZSB1c2VyIHBvaW50ZXIgZm9yIHRoZSBwYW5lbC4gIFRoaXMgbWlnaHQgYmUgYW55IFB5dGhvbiBvYmplY3QuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtQYW5lbF17d2luZG93fXt9Ci1SZXR1cm5zIHRoZSB3aW5kb3cgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFuZWwuCi1cZW5ke21ldGhvZGRlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmRhdGV0aW1lLnRleCBiL0RvYy9saWIvbGliZGF0ZXRpbWUudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjEzZWE3Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGliZGF0ZXRpbWUudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTQ0MSArMCwwIEBACi0lIFhYWCB3aGF0IG9yZGVyIHNob3VsZCB0aGUgdHlwZXMgYmUgZGlzY3Vzc2VkIGluPwotCi1cc2VjdGlvbntcbW9kdWxle2RhdGV0aW1lfSAtLS0KLSAgICAgICAgIEJhc2ljIGRhdGUgYW5kIHRpbWUgdHlwZXN9Ci0KLVxkZWNsYXJlbW9kdWxle2J1aWx0aW59e2RhdGV0aW1lfQotXG1vZHVsZXN5bm9wc2lze0Jhc2ljIGRhdGUgYW5kIHRpbWUgdHlwZXMufQotXG1vZHVsZWF1dGhvcntUaW0gUGV0ZXJzfXt0aW1Aem9wZS5jb219Ci1cc2VjdGlvbmF1dGhvcntUaW0gUGV0ZXJzfXt0aW1Aem9wZS5jb219Ci1cc2VjdGlvbmF1dGhvcntBLk0uIEt1Y2hsaW5nfXthbWtAYW1rLmNhfQotCi1cdmVyc2lvbmFkZGVkezIuM30KLQotCi1UaGUgXG1vZHVsZXtkYXRldGltZX0gbW9kdWxlIHN1cHBsaWVzIGNsYXNzZXMgZm9yIG1hbmlwdWxhdGluZyBkYXRlcwotYW5kIHRpbWVzIGluIGJvdGggc2ltcGxlIGFuZCBjb21wbGV4IHdheXMuICBXaGlsZSBkYXRlIGFuZCB0aW1lCi1hcml0aG1ldGljIGlzIHN1cHBvcnRlZCwgdGhlIGZvY3VzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBvbgotZWZmaWNpZW50IG1lbWJlciBleHRyYWN0aW9uIGZvciBvdXRwdXQgZm9ybWF0dGluZyBhbmQgbWFuaXB1bGF0aW9uLgotCi1UaGVyZSBhcmUgdHdvIGtpbmRzIG9mIGRhdGUgYW5kIHRpbWUgb2JqZWN0czogYGBuYWl2ZScnIGFuZCBgYGF3YXJlJycuCi1UaGlzIGRpc3RpbmN0aW9uIHJlZmVycyB0byB3aGV0aGVyIHRoZSBvYmplY3QgaGFzIGFueSBub3Rpb24gb2YgdGltZQotem9uZSwgZGF5bGlnaHQgc2F2aW5nIHRpbWUsIG9yIG90aGVyIGtpbmQgb2YgYWxnb3JpdGhtaWMgb3IgcG9saXRpY2FsCi10aW1lIGFkanVzdG1lbnQuICBXaGV0aGVyIGEgbmFpdmUgXGNsYXNze2RhdGV0aW1lfSBvYmplY3QgcmVwcmVzZW50cwotQ29vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWUgKFVUQyksIGxvY2FsIHRpbWUsIG9yIHRpbWUgaW4gc29tZSBvdGhlcgotdGltZXpvbmUgaXMgcHVyZWx5IHVwIHRvIHRoZSBwcm9ncmFtLCBqdXN0IGxpa2UgaXQncyB1cCB0byB0aGUgcHJvZ3JhbQotd2hldGhlciBhIHBhcnRpY3VsYXIgbnVtYmVyIHJlcHJlc2VudHMgbWV0cmVzLCBtaWxlcywgb3IgbWFzcy4gIE5haXZlCi1cY2xhc3N7ZGF0ZXRpbWV9IG9iamVjdHMgYXJlIGVhc3kgdG8gdW5kZXJzdGFuZCBhbmQgdG8gd29yayB3aXRoLCBhdAotdGhlIGNvc3Qgb2YgaWdub3Jpbmcgc29tZSBhc3BlY3RzIG9mIHJlYWxpdHkuCi0KLUZvciBhcHBsaWNhdGlvbnMgcmVxdWlyaW5nIG1vcmUsIFxjbGFzc3tkYXRldGltZX0gYW5kIFxjbGFzc3t0aW1lfQotb2JqZWN0cyBoYXZlIGFuIG9wdGlvbmFsIHRpbWUgem9uZSBpbmZvcm1hdGlvbiBtZW1iZXIsCi1cbWVtYmVye3R6aW5mb30sIHRoYXQgY2FuIGNvbnRhaW4gYW4gaW5zdGFuY2Ugb2YgYSBzdWJjbGFzcyBvZgotdGhlIGFic3RyYWN0IFxjbGFzc3t0emluZm99IGNsYXNzLiAgVGhlc2UgXGNsYXNze3R6aW5mb30gb2JqZWN0cwotY2FwdHVyZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2Zmc2V0IGZyb20gVVRDIHRpbWUsIHRoZSB0aW1lIHpvbmUKLW5hbWUsIGFuZCB3aGV0aGVyIERheWxpZ2h0IFNhdmluZyBUaW1lIGlzIGluIGVmZmVjdC4gIE5vdGUgdGhhdCBubwotY29uY3JldGUgXGNsYXNze3R6aW5mb30gY2xhc3NlcyBhcmUgc3VwcGxpZWQgYnkgdGhlIFxtb2R1bGV7ZGF0ZXRpbWV9Ci1tb2R1bGUuICBTdXBwb3J0aW5nIHRpbWV6b25lcyBhdCB3aGF0ZXZlciBsZXZlbCBvZiBkZXRhaWwgaXMgcmVxdWlyZWQKLWlzIHVwIHRvIHRoZSBhcHBsaWNhdGlvbi4gIFRoZSBydWxlcyBmb3IgdGltZSBhZGp1c3RtZW50IGFjcm9zcyB0aGUKLXdvcmxkIGFyZSBtb3JlIHBvbGl0aWNhbCB0aGFuIHJhdGlvbmFsLCBhbmQgdGhlcmUgaXMgbm8gc3RhbmRhcmQKLXN1aXRhYmxlIGZvciBldmVyeSBhcHBsaWNhdGlvbi4KLQotVGhlIFxtb2R1bGV7ZGF0ZXRpbWV9IG1vZHVsZSBleHBvcnRzIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzOgotCi1cYmVnaW57ZGF0YWRlc2N9e01JTllFQVJ9Ci0gIFRoZSBzbWFsbGVzdCB5ZWFyIG51bWJlciBhbGxvd2VkIGluIGEgXGNsYXNze2RhdGV9IG9yCi0gIFxjbGFzc3tkYXRldGltZX0gb2JqZWN0LiAgXGNvbnN0YW50e01JTllFQVJ9Ci0gIGlzIFxjb2RlezF9LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtNQVhZRUFSfQotICBUaGUgbGFyZ2VzdCB5ZWFyIG51bWJlciBhbGxvd2VkIGluIGEgXGNsYXNze2RhdGV9IG9yIFxjbGFzc3tkYXRldGltZX0KLSAgb2JqZWN0LiAgXGNvbnN0YW50e01BWFlFQVJ9IGlzIFxjb2Rlezk5OTl9LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWVtb2R1bGV7Y2FsZW5kYXJ9e0dlbmVyYWwgY2FsZW5kYXIgcmVsYXRlZCBmdW5jdGlvbnMufQotICBcc2VlbW9kdWxle3RpbWV9e1RpbWUgYWNjZXNzIGFuZCBjb252ZXJzaW9ucy59Ci1cZW5ke3NlZWFsc299Ci0KLVxzdWJzZWN0aW9ue0F2YWlsYWJsZSBUeXBlc30KLQotXGJlZ2lue2NsYXNzZGVzYyp9e2RhdGV9Ci0gIEFuIGlkZWFsaXplZCBuYWl2ZSBkYXRlLCBhc3N1bWluZyB0aGUgY3VycmVudCBHcmVnb3JpYW4gY2FsZW5kYXIKLSAgYWx3YXlzIHdhcywgYW5kIGFsd2F5cyB3aWxsIGJlLCBpbiBlZmZlY3QuCi0gIEF0dHJpYnV0ZXM6IFxtZW1iZXJ7eWVhcn0sIFxtZW1iZXJ7bW9udGh9LCBhbmQgXG1lbWJlcntkYXl9LgotXGVuZHtjbGFzc2Rlc2MqfQotCi1cYmVnaW57Y2xhc3NkZXNjKn17dGltZX0KLSAgQW4gaWRlYWxpemVkIHRpbWUsIGluZGVwZW5kZW50IG9mIGFueSBwYXJ0aWN1bGFyIGRheSwgYXNzdW1pbmcKLSAgdGhhdCBldmVyeSBkYXkgaGFzIGV4YWN0bHkgMjQqNjAqNjAgc2Vjb25kcyAodGhlcmUgaXMgbm8gbm90aW9uCi0gIG9mICJsZWFwIHNlY29uZHMiIGhlcmUpLgotICBBdHRyaWJ1dGVzOiBcbWVtYmVye2hvdXJ9LCBcbWVtYmVye21pbnV0ZX0sIFxtZW1iZXJ7c2Vjb25kfSwKLSAgICAgICAgICAgICAgXG1lbWJlcnttaWNyb3NlY29uZH0sIGFuZCBcbWVtYmVye3R6aW5mb30uCi1cZW5ke2NsYXNzZGVzYyp9Ci0KLVxiZWdpbntjbGFzc2Rlc2MqfXtkYXRldGltZX0KLSAgQSBjb21iaW5hdGlvbiBvZiBhIGRhdGUgYW5kIGEgdGltZS4KLSAgQXR0cmlidXRlczogXG1lbWJlcnt5ZWFyfSwgXG1lbWJlcnttb250aH0sIFxtZW1iZXJ7ZGF5fSwKLSAgICAgICAgICAgICAgXG1lbWJlcntob3VyfSwgXG1lbWJlcnttaW51dGV9LCBcbWVtYmVye3NlY29uZH0sCi0gICAgICAgICAgICAgIFxtZW1iZXJ7bWljcm9zZWNvbmR9LCBhbmQgXG1lbWJlcnt0emluZm99LgotXGVuZHtjbGFzc2Rlc2MqfQotCi1cYmVnaW57Y2xhc3NkZXNjKn17dGltZWRlbHRhfQotICBBIGR1cmF0aW9uIGV4cHJlc3NpbmcgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gXGNsYXNze2RhdGV9LAotICBcY2xhc3N7dGltZX0sIG9yIFxjbGFzc3tkYXRldGltZX0gaW5zdGFuY2VzIHRvIG1pY3Jvc2Vjb25kCi0gIHJlc29sdXRpb24uCi1cZW5ke2NsYXNzZGVzYyp9Ci0KLVxiZWdpbntjbGFzc2Rlc2MqfXt0emluZm99Ci0gIEFuIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHRpbWUgem9uZSBpbmZvcm1hdGlvbiBvYmplY3RzLiAgVGhlc2UKLSAgYXJlIHVzZWQgYnkgdGhlICBcY2xhc3N7ZGF0ZXRpbWV9IGFuZCBcY2xhc3N7dGltZX0gY2xhc3NlcyB0bwotICBwcm92aWRlIGEgY3VzdG9taXphYmxlIG5vdGlvbiBvZiB0aW1lIGFkanVzdG1lbnQgKGZvciBleGFtcGxlLCB0bwotICBhY2NvdW50IGZvciB0aW1lIHpvbmUgYW5kL29yIGRheWxpZ2h0IHNhdmluZyB0aW1lKS4KLVxlbmR7Y2xhc3NkZXNjKn0KLQotT2JqZWN0cyBvZiB0aGVzZSB0eXBlcyBhcmUgaW1tdXRhYmxlLgotCi1PYmplY3RzIG9mIHRoZSBcY2xhc3N7ZGF0ZX0gdHlwZSBhcmUgYWx3YXlzIG5haXZlLgotCi1BbiBvYmplY3QgXHZhcntkfSBvZiB0eXBlIFxjbGFzc3t0aW1lfSBvciBcY2xhc3N7ZGF0ZXRpbWV9IG1heSBiZQotbmFpdmUgb3IgYXdhcmUuICBcdmFye2R9IGlzIGF3YXJlIGlmIFxjb2Rle1x2YXJ7ZH0udHppbmZvfSBpcyBub3QKLVxjb2Rle05vbmV9IGFuZCBcY29kZXtcdmFye2R9LnR6aW5mby51dGNvZmZzZXQoXHZhcntkfSl9IGRvZXMgbm90IHJldHVybgotXGNvZGV7Tm9uZX0uICBJZiBcY29kZXtcdmFye2R9LnR6aW5mb30gaXMgXGNvZGV7Tm9uZX0sIG9yIGlmCi1cY29kZXtcdmFye2R9LnR6aW5mb30gaXMgbm90IFxjb2Rle05vbmV9IGJ1dAotXGNvZGV7XHZhcntkfS50emluZm8udXRjb2Zmc2V0KFx2YXJ7ZH0pfSByZXR1cm5zIFxjb2Rle05vbmV9LCBcdmFye2R9Ci1pcyBuYWl2ZS4KLQotVGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gbmFpdmUgYW5kIGF3YXJlIGRvZXNuJ3QgYXBwbHkgdG8KLVxjbGFzc3t0aW1lZGVsdGF9IG9iamVjdHMuCi0KLVN1YmNsYXNzIHJlbGF0aW9uc2hpcHM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLW9iamVjdAotICAgIHRpbWVkZWx0YQotICAgIHR6aW5mbwotICAgIHRpbWUKLSAgICBkYXRlCi0gICAgICAgIGRhdGV0aW1lCi1cZW5ke3ZlcmJhdGltfQotCi1cc3Vic2VjdGlvbntcY2xhc3N7dGltZWRlbHRhfSBPYmplY3RzIFxsYWJlbHtkYXRldGltZS10aW1lZGVsdGF9fQotCi1BIFxjbGFzc3t0aW1lZGVsdGF9IG9iamVjdCByZXByZXNlbnRzIGEgZHVyYXRpb24sIHRoZSBkaWZmZXJlbmNlCi1iZXR3ZWVuIHR3byBkYXRlcyBvciB0aW1lcy4KLQotXGJlZ2lue2NsYXNzZGVzY317dGltZWRlbHRhfXtcb3B0aW9uYWx7ZGF5c1xvcHRpb25hbHssIHNlY29uZHNcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWNyb3NlY29uZHNcb3B0aW9uYWx7LCBtaWxsaXNlY29uZHNcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW51dGVzXG9wdGlvbmFseywgaG91cnNcb3B0aW9uYWx7LCB3ZWVrc319fX19fX19Ci0gIEFsbCBhcmd1bWVudHMgYXJlIG9wdGlvbmFsIGFuZCBkZWZhdWx0IHRvIFxjb2RlezB9LiAgQXJndW1lbnRzIG1heQotICBiZSBpbnRzLCBsb25ncywgb3IgZmxvYXRzLCBhbmQgbWF5IGJlIHBvc2l0aXZlIG9yIG5lZ2F0aXZlLgotCi0gIE9ubHkgXHZhcntkYXlzfSwgXHZhcntzZWNvbmRzfSBhbmQgXHZhcnttaWNyb3NlY29uZHN9IGFyZSBzdG9yZWQKLSAgaW50ZXJuYWxseS4gIEFyZ3VtZW50cyBhcmUgY29udmVydGVkIHRvIHRob3NlIHVuaXRzOgotCi1cYmVnaW57aXRlbWl6ZX0KLSAgXGl0ZW0gQSBtaWxsaXNlY29uZCBpcyBjb252ZXJ0ZWQgdG8gMTAwMCBtaWNyb3NlY29uZHMuCi0gIFxpdGVtIEEgbWludXRlIGlzIGNvbnZlcnRlZCB0byA2MCBzZWNvbmRzLgotICBcaXRlbSBBbiBob3VyIGlzIGNvbnZlcnRlZCB0byAzNjAwIHNlY29uZHMuCi0gIFxpdGVtIEEgd2VlayBpcyBjb252ZXJ0ZWQgdG8gNyBkYXlzLgotXGVuZHtpdGVtaXplfQotCi0gIGFuZCBkYXlzLCBzZWNvbmRzIGFuZCBtaWNyb3NlY29uZHMgYXJlIHRoZW4gbm9ybWFsaXplZCBzbyB0aGF0IHRoZQotICByZXByZXNlbnRhdGlvbiBpcyB1bmlxdWUsIHdpdGgKLQotXGJlZ2lue2l0ZW1pemV9Ci0gIFxpdGVtIFxjb2RlezAgPD0gXHZhcnttaWNyb3NlY29uZHN9IDwgMTAwMDAwMH0KLSAgXGl0ZW0gXGNvZGV7MCA8PSBcdmFye3NlY29uZHN9IDwgMzYwMCoyNH0gKHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBpbiBvbmUgZGF5KQotICBcaXRlbSBcY29kZXstOTk5OTk5OTk5IDw9IFx2YXJ7ZGF5c30gPD0gOTk5OTk5OTk5fQotXGVuZHtpdGVtaXplfQotCi0gIElmIGFueSBhcmd1bWVudCBpcyBhIGZsb2F0IGFuZCB0aGVyZSBhcmUgZnJhY3Rpb25hbCBtaWNyb3NlY29uZHMsCi0gIHRoZSBmcmFjdGlvbmFsIG1pY3Jvc2Vjb25kcyBsZWZ0IG92ZXIgZnJvbSBhbGwgYXJndW1lbnRzIGFyZSBjb21iaW5lZAotICBhbmQgdGhlaXIgc3VtIGlzIHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgbWljcm9zZWNvbmQuICBJZiBubwotICBhcmd1bWVudCBpcyBhIGZsb2F0LCB0aGUgY29udmVyc2lvbiBhbmQgbm9ybWFsaXphdGlvbiBwcm9jZXNzZXMKLSAgYXJlIGV4YWN0IChubyBpbmZvcm1hdGlvbiBpcyBsb3N0KS4KLQotICBJZiB0aGUgbm9ybWFsaXplZCB2YWx1ZSBvZiBkYXlzIGxpZXMgb3V0c2lkZSB0aGUgaW5kaWNhdGVkIHJhbmdlLAotICBcZXhjZXB0aW9ue092ZXJmbG93RXJyb3J9IGlzIHJhaXNlZC4KLQotICBOb3RlIHRoYXQgbm9ybWFsaXphdGlvbiBvZiBuZWdhdGl2ZSB2YWx1ZXMgbWF5IGJlIHN1cnByaXNpbmcgYXQgZmlyc3QuCi0gIEZvciBleGFtcGxlLAotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZCA9IHRpbWVkZWx0YShtaWNyb3NlY29uZHM9LTEpCi0+Pj4gKGQuZGF5cywgZC5zZWNvbmRzLCBkLm1pY3Jvc2Vjb25kcykKLSgtMSwgODYzOTksIDk5OTk5OSkKLVxlbmR7dmVyYmF0aW19Ci1cZW5ke2NsYXNzZGVzY30KLQotQ2xhc3MgYXR0cmlidXRlcyBhcmU6Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXttaW59Ci0gIFRoZSBtb3N0IG5lZ2F0aXZlIFxjbGFzc3t0aW1lZGVsdGF9IG9iamVjdCwKLSAgXGNvZGV7dGltZWRlbHRhKC05OTk5OTk5OTkpfS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9e21heH0KLSAgVGhlIG1vc3QgcG9zaXRpdmUgXGNsYXNze3RpbWVkZWx0YX0gb2JqZWN0LAotICBcY29kZXt0aW1lZGVsdGEoZGF5cz05OTk5OTk5OTksIGhvdXJzPTIzLCBtaW51dGVzPTU5LCBzZWNvbmRzPTU5LAotICAgICAgICAgICAgICAgICAgbWljcm9zZWNvbmRzPTk5OTk5OSl9LgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY317cmVzb2x1dGlvbn0KLSAgVGhlIHNtYWxsZXN0IHBvc3NpYmxlIGRpZmZlcmVuY2UgYmV0d2VlbiBub24tZXF1YWwKLSAgXGNsYXNze3RpbWVkZWx0YX0gb2JqZWN0cywgXGNvZGV7dGltZWRlbHRhKG1pY3Jvc2Vjb25kcz0xKX0uCi1cZW5ke21lbWJlcmRlc2N9Ci0KLU5vdGUgdGhhdCwgYmVjYXVzZSBvZiBub3JtYWxpemF0aW9uLCBcY29kZXt0aW1lZGVsdGEubWF4fSBcdGV4dGdyZWF0ZXIKLVxjb2Rley10aW1lZGVsdGEubWlufS4gIFxjb2Rley10aW1lZGVsdGEubWF4fSBpcyBub3QgcmVwcmVzZW50YWJsZSBhcwotYSBcY2xhc3N7dGltZWRlbHRhfSBvYmplY3QuCi0KLUluc3RhbmNlIGF0dHJpYnV0ZXMgKHJlYWQtb25seSk6Ci0KLVxiZWdpbnt0YWJsZWlpfXtjfGx9e2NvZGV9e0F0dHJpYnV0ZX17VmFsdWV9Ci0gIFxsaW5laWl7ZGF5c317QmV0d2VlbiAtOTk5OTk5OTk5IGFuZCA5OTk5OTk5OTkgaW5jbHVzaXZlfQotICBcbGluZWlpe3NlY29uZHN9e0JldHdlZW4gMCBhbmQgODYzOTkgaW5jbHVzaXZlfQotICBcbGluZWlpe21pY3Jvc2Vjb25kc317QmV0d2VlbiAwIGFuZCA5OTk5OTkgaW5jbHVzaXZlfQotXGVuZHt0YWJsZWlpfQotCi1TdXBwb3J0ZWQgb3BlcmF0aW9uczoKLQotJSBYWFggdGhpcyB0YWJsZSBpcyB0b28gd2lkZSEKLVxiZWdpbnt0YWJsZWlpfXtjfGx9e2NvZGV9e09wZXJhdGlvbn17UmVzdWx0fQotICBcbGluZWlpe1x2YXJ7dDF9ID0gXHZhcnt0Mn0gKyBcdmFye3QzfX0KLSAgICAgICAgICB7U3VtIG9mIFx2YXJ7dDJ9IGFuZCBcdmFye3QzfS4KLSAgICAgICAgICAgQWZ0ZXJ3YXJkcyBcdmFye3QxfS1cdmFye3QyfSA9PSBcdmFye3QzfSBhbmQgXHZhcnt0MX0tXHZhcnt0M30KLSAgICAgICAgICAgPT0gXHZhcnt0Mn0gYXJlIHRydWUuCi0gICAgICAgICAgKDEpfQotICBcbGluZWlpe1x2YXJ7dDF9ID0gXHZhcnt0Mn0gLSBcdmFye3QzfX0KLSAgICAgICAgICB7RGlmZmVyZW5jZSBvZiBcdmFye3QyfSBhbmQgXHZhcnt0M30uCi0gICAgICAgICAgIEFmdGVyd2FyZHMgXHZhcnt0MX0gPT0gXHZhcnt0Mn0gLSBcdmFye3QzfSBhbmQKLSAgICAgICAgICAgXHZhcnt0Mn0gPT0gXHZhcnt0MX0gKyBcdmFye3QzfSBhcmUgdHJ1ZS4KLSAgICAgICAgICAoMSl9Ci0gIFxsaW5laWl7XHZhcnt0MX0gPSBcdmFye3QyfSAqIFx2YXJ7aX0gb3IgXHZhcnt0MX0gPSBcdmFye2l9ICogXHZhcnt0Mn19Ci0gICAgICAgICAge0RlbHRhIG11bHRpcGxpZWQgYnkgYW4gaW50ZWdlciBvciBsb25nLgotICAgICAgICAgICBBZnRlcndhcmRzIFx2YXJ7dDF9IC8vIGkgPT0gXHZhcnt0Mn0gaXMgdHJ1ZSwKLSAgICAgICAgICAgcHJvdmlkZWQgXGNvZGV7aSAhPSAwfS59Ci0gIFxsaW5laWl7fXtJbiBnZW5lcmFsLCBcdmFye3QxfSAqIGkgPT0gXHZhcnt0MX0gKiAoaS0xKSArIFx2YXJ7dDF9IGlzIHRydWUuCi0gICAgICAgICAgKDEpfQotICBcbGluZWlpe1x2YXJ7dDF9ID0gXHZhcnt0Mn0gLy8gXHZhcntpfX0KLSAgICAgICAgICB7VGhlIGZsb29yIGlzIGNvbXB1dGVkIGFuZCB0aGUgcmVtYWluZGVyIChpZiBhbnkpIGlzIHRocm93biBhd2F5LgotICAgICAgICAgICgzKX0KLSAgXGxpbmVpaXsrXHZhcnt0MX19Ci0gICAgICAgICAge1JldHVybnMgYSBcY2xhc3N7dGltZWRlbHRhfSBvYmplY3Qgd2l0aCB0aGUgc2FtZSB2YWx1ZS4KLSAgICAgICAgICAoMil9Ci0gIFxsaW5laWl7LVx2YXJ7dDF9fQotICAgICAgICAgIHtlcXVpdmFsZW50IHRvIFxjbGFzc3t0aW1lZGVsdGF9KC1cdmFye3QxLmRheXN9LCAtXHZhcnt0MS5zZWNvbmRzfSwKLSAgICAgICAgICAgLVx2YXJ7dDEubWljcm9zZWNvbmRzfSksIGFuZCB0byBcdmFye3QxfSogLTEuCi0gICAgICAgICAgKDEpKDQpfQotICBcbGluZWlpe2FicyhcdmFye3R9KX0KLSAgICAgICAgICB7ZXF1aXZhbGVudCB0byArXHZhcnt0fSB3aGVuIFxjb2Rle3QuZGF5cyA+PSAwfSwgYW5kIHRvCi0gICAgICAgICAgIC1cdmFye3R9IHdoZW4gXGNvZGV7dC5kYXlzIDwgMH0uCi0gICAgICAgICAgKDIpfQotXGVuZHt0YWJsZWlpfQotXG5vaW5kZW50Ci1Ob3RlczoKLQotXGJlZ2lue2Rlc2NyaXB0aW9ufQotXGl0ZW1bKDEpXQotICBUaGlzIGlzIGV4YWN0LCBidXQgbWF5IG92ZXJmbG93LgotCi1caXRlbVsoMildCi0gIFRoaXMgaXMgZXhhY3QsIGFuZCBjYW5ub3Qgb3ZlcmZsb3cuCi0KLVxpdGVtWygzKV0KLSAgRGl2aXNpb24gYnkgMCByYWlzZXMgXGV4Y2VwdGlvbntaZXJvRGl2aXNpb25FcnJvcn0uCi0KLVxpdGVtWyg0KV0KLSAgLVx2YXJ7dGltZWRlbHRhLm1heH0gaXMgbm90IHJlcHJlc2VudGFibGUgYXMgYSBcY2xhc3N7dGltZWRlbHRhfSBvYmplY3QuCi1cZW5ke2Rlc2NyaXB0aW9ufQotCi1JbiBhZGRpdGlvbiB0byB0aGUgb3BlcmF0aW9ucyBsaXN0ZWQgYWJvdmUgXGNsYXNze3RpbWVkZWx0YX0gb2JqZWN0cwotc3VwcG9ydCBjZXJ0YWluIGFkZGl0aW9ucyBhbmQgc3VidHJhY3Rpb25zIHdpdGggXGNsYXNze2RhdGV9IGFuZAotXGNsYXNze2RhdGV0aW1lfSBvYmplY3RzIChzZWUgYmVsb3cpLgotCi1Db21wYXJpc29ucyBvZiBcY2xhc3N7dGltZWRlbHRhfSBvYmplY3RzIGFyZSBzdXBwb3J0ZWQgd2l0aCB0aGUKLVxjbGFzc3t0aW1lZGVsdGF9IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNtYWxsZXIgZHVyYXRpb24gY29uc2lkZXJlZAotdG8gYmUgdGhlIHNtYWxsZXIgdGltZWRlbHRhLgotSW4gb3JkZXIgdG8gc3RvcCBtaXhlZC10eXBlIGNvbXBhcmlzb25zIGZyb20gZmFsbGluZyBiYWNrIHRvIHRoZQotZGVmYXVsdCBjb21wYXJpc29uIGJ5IG9iamVjdCBhZGRyZXNzLCB3aGVuIGEgXGNsYXNze3RpbWVkZWx0YX0gb2JqZWN0IGlzCi1jb21wYXJlZCB0byBhbiBvYmplY3Qgb2YgYSBkaWZmZXJlbnQgdHlwZSwgXGV4Y2VwdGlvbntUeXBlRXJyb3J9IGlzCi1yYWlzZWQgdW5sZXNzIHRoZSBjb21wYXJpc29uIGlzIFxjb2Rlez09fSBvciBcY29kZXshPX0uICBUaGUgbGF0dGVyCi1jYXNlcyByZXR1cm4gXGNvbnN0YW50e0ZhbHNlfSBvciBcY29uc3RhbnR7VHJ1ZX0sIHJlc3BlY3RpdmVseS4KLQotXGNsYXNze3RpbWVkZWx0YX0gb2JqZWN0cyBhcmUgaGFzaGFibGUgKHVzYWJsZSBhcyBkaWN0aW9uYXJ5IGtleXMpLAotc3VwcG9ydCBlZmZpY2llbnQgcGlja2xpbmcsIGFuZCBpbiBCb29sZWFuIGNvbnRleHRzLCBhIFxjbGFzc3t0aW1lZGVsdGF9Ci1vYmplY3QgaXMgY29uc2lkZXJlZCB0byBiZSB0cnVlIGlmIGFuZCBvbmx5IGlmIGl0IGlzbid0IGVxdWFsIHRvCi1cY29kZXt0aW1lZGVsdGEoMCl9LgotCi0KLVxzdWJzZWN0aW9ue1xjbGFzc3tkYXRlfSBPYmplY3RzIFxsYWJlbHtkYXRldGltZS1kYXRlfX0KLQotQSBcY2xhc3N7ZGF0ZX0gb2JqZWN0IHJlcHJlc2VudHMgYSBkYXRlICh5ZWFyLCBtb250aCBhbmQgZGF5KSBpbiBhbiBpZGVhbGl6ZWQKLWNhbGVuZGFyLCB0aGUgY3VycmVudCBHcmVnb3JpYW4gY2FsZW5kYXIgaW5kZWZpbml0ZWx5IGV4dGVuZGVkIGluIGJvdGgKLWRpcmVjdGlvbnMuICBKYW51YXJ5IDEgb2YgeWVhciAxIGlzIGNhbGxlZCBkYXkgbnVtYmVyIDEsIEphbnVhcnkgMiBvZiB5ZWFyCi0xIGlzIGNhbGxlZCBkYXkgbnVtYmVyIDIsIGFuZCBzbyBvbi4gIFRoaXMgbWF0Y2hlcyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKLSJwcm9sZXB0aWMgR3JlZ29yaWFuIiBjYWxlbmRhciBpbiBEZXJzaG93aXR6IGFuZCBSZWluZ29sZCdzIGJvb2sKLVxjaXRldGl0bGV7Q2FsZW5kcmljYWwgQ2FsY3VsYXRpb25zfSwgd2hlcmUgaXQncyB0aGUgYmFzZSBjYWxlbmRhciBmb3IgYWxsCi1jb21wdXRhdGlvbnMuICBTZWUgdGhlIGJvb2sgZm9yIGFsZ29yaXRobXMgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbgotcHJvbGVwdGljIEdyZWdvcmlhbiBvcmRpbmFscyBhbmQgbWFueSBvdGhlciBjYWxlbmRhciBzeXN0ZW1zLgotCi1cYmVnaW57Y2xhc3NkZXNjfXtkYXRlfXt5ZWFyLCBtb250aCwgZGF5fQotICBBbGwgYXJndW1lbnRzIGFyZSByZXF1aXJlZC4gIEFyZ3VtZW50cyBtYXkgYmUgaW50cyBvciBsb25ncywgaW4gdGhlCi0gIGZvbGxvd2luZyByYW5nZXM6Ci0KLSAgXGJlZ2lue2l0ZW1pemV9Ci0gICAgXGl0ZW0gXGNvZGV7TUlOWUVBUiA8PSBcdmFye3llYXJ9IDw9IE1BWFlFQVJ9Ci0gICAgXGl0ZW0gXGNvZGV7MSA8PSBcdmFye21vbnRofSA8PSAxMn0KLSAgICBcaXRlbSBcY29kZXsxIDw9IFx2YXJ7ZGF5fSA8PSBudW1iZXIgb2YgZGF5cyBpbiB0aGUgZ2l2ZW4gbW9udGggYW5kIHllYXJ9Ci0gIFxlbmR7aXRlbWl6ZX0KLQotICBJZiBhbiBhcmd1bWVudCBvdXRzaWRlIHRob3NlIHJhbmdlcyBpcyBnaXZlbiwgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfQotICBpcyByYWlzZWQuCi1cZW5ke2NsYXNzZGVzY30KLQotT3RoZXIgY29uc3RydWN0b3JzLCBhbGwgY2xhc3MgbWV0aG9kczoKLQotXGJlZ2lue21ldGhvZGRlc2N9e3RvZGF5fXt9Ci0gIFJldHVybiB0aGUgY3VycmVudCBsb2NhbCBkYXRlLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvCi0gIFxjb2Rle2RhdGUuZnJvbXRpbWVzdGFtcCh0aW1lLnRpbWUoKSl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317ZnJvbXRpbWVzdGFtcH17dGltZXN0YW1wfQotICBSZXR1cm4gdGhlIGxvY2FsIGRhdGUgY29ycmVzcG9uZGluZyB0byB0aGUgUE9TSVggdGltZXN0YW1wLCBzdWNoCi0gIGFzIGlzIHJldHVybmVkIGJ5IFxmdW5jdGlvbnt0aW1lLnRpbWUoKX0uICBUaGlzIG1heSByYWlzZQotICBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9LCBpZiB0aGUgdGltZXN0YW1wIGlzIG91dCBvZiB0aGUgcmFuZ2Ugb2YKLSAgdmFsdWVzIHN1cHBvcnRlZCBieSB0aGUgcGxhdGZvcm0gQyBcY2Z1bmN0aW9ue2xvY2FsdGltZSgpfQotICBmdW5jdGlvbi4gIEl0J3MgY29tbW9uIGZvciB0aGlzIHRvIGJlIHJlc3RyaWN0ZWQgdG8geWVhcnMgZnJvbSAxOTcwCi0gIHRocm91Z2ggMjAzOC4gIE5vdGUgdGhhdCBvbiBub24tUE9TSVggc3lzdGVtcyB0aGF0IGluY2x1ZGUgbGVhcAotICBzZWNvbmRzIGluIHRoZWlyIG5vdGlvbiBvZiBhIHRpbWVzdGFtcCwgbGVhcCBzZWNvbmRzIGFyZSBpZ25vcmVkIGJ5Ci0gIFxtZXRob2R7ZnJvbXRpbWVzdGFtcCgpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2Zyb21vcmRpbmFsfXtvcmRpbmFsfQotICBSZXR1cm4gdGhlIGRhdGUgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvbGVwdGljIEdyZWdvcmlhbiBvcmRpbmFsLAotICB3aGVyZSBKYW51YXJ5IDEgb2YgeWVhciAxIGhhcyBvcmRpbmFsIDEuICBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IGlzCi0gIHJhaXNlZCB1bmxlc3MgXGNvZGV7MSA8PSBcdmFye29yZGluYWx9IDw9IGRhdGUubWF4LnRvb3JkaW5hbCgpfS4KLSAgRm9yIGFueSBkYXRlIFx2YXJ7ZH0sIFxjb2Rle2RhdGUuZnJvbW9yZGluYWwoXHZhcntkfS50b29yZGluYWwoKSkgPT0KLSAgXHZhcntkfX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLUNsYXNzIGF0dHJpYnV0ZXM6Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXttaW59Ci0gIFRoZSBlYXJsaWVzdCByZXByZXNlbnRhYmxlIGRhdGUsIFxjb2Rle2RhdGUoTUlOWUVBUiwgMSwgMSl9LgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY317bWF4fQotICBUaGUgbGF0ZXN0IHJlcHJlc2VudGFibGUgZGF0ZSwgXGNvZGV7ZGF0ZShNQVhZRUFSLCAxMiwgMzEpfS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9e3Jlc29sdXRpb259Ci0gIFRoZSBzbWFsbGVzdCBwb3NzaWJsZSBkaWZmZXJlbmNlIGJldHdlZW4gbm9uLWVxdWFsIGRhdGUKLSAgb2JqZWN0cywgXGNvZGV7dGltZWRlbHRhKGRheXM9MSl9LgotXGVuZHttZW1iZXJkZXNjfQotCi1JbnN0YW5jZSBhdHRyaWJ1dGVzIChyZWFkLW9ubHkpOgotCi1cYmVnaW57bWVtYmVyZGVzY317eWVhcn0KLSAgQmV0d2VlbiBcY29uc3RhbnR7TUlOWUVBUn0gYW5kIFxjb25zdGFudHtNQVhZRUFSfSBpbmNsdXNpdmUuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXttb250aH0KLSAgQmV0d2VlbiAxIGFuZCAxMiBpbmNsdXNpdmUuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXtkYXl9Ci0gIEJldHdlZW4gMSBhbmQgdGhlIG51bWJlciBvZiBkYXlzIGluIHRoZSBnaXZlbiBtb250aCBvZiB0aGUgZ2l2ZW4KLSAgeWVhci4KLVxlbmR7bWVtYmVyZGVzY30KLQotU3VwcG9ydGVkIG9wZXJhdGlvbnM6Ci0KLVxiZWdpbnt0YWJsZWlpfXtjfGx9e2NvZGV9e09wZXJhdGlvbn17UmVzdWx0fQotICBcbGluZWlpe1x2YXJ7ZGF0ZTJ9ID0gXHZhcntkYXRlMX0gKyBcdmFye3RpbWVkZWx0YX19Ci0gICAge1x2YXJ7ZGF0ZTJ9IGlzIFxjb2Rle1x2YXJ7dGltZWRlbHRhfS5kYXlzfSBkYXlzIHJlbW92ZWQgZnJvbQotICAgIFx2YXJ7ZGF0ZTF9LiAgKDEpfQotCi0KLSAgXGxpbmVpaXtcdmFye2RhdGUyfSA9IFx2YXJ7ZGF0ZTF9IC0gXHZhcnt0aW1lZGVsdGF9fQotICAge0NvbXB1dGVzIFx2YXJ7ZGF0ZTJ9IHN1Y2ggdGhhdCBcY29kZXtcdmFye2RhdGUyfSArIFx2YXJ7dGltZWRlbHRhfQotICAgPT0gXHZhcntkYXRlMX19LiAoMil9Ci0KLSAgXGxpbmVpaXtcdmFye3RpbWVkZWx0YX0gPSBcdmFye2RhdGUxfSAtIFx2YXJ7ZGF0ZTJ9fQotICAgeygzKX0KLQotICBcbGluZWlpe1x2YXJ7ZGF0ZTF9IDwgXHZhcntkYXRlMn19Ci0gICB7XHZhcntkYXRlMX0gaXMgY29uc2lkZXJlZCBsZXNzIHRoYW4gXHZhcntkYXRlMn0gd2hlbiBcdmFye2RhdGUxfQotICAgcHJlY2VkZXMgXHZhcntkYXRlMn0gaW4gdGltZS4gKDQpfQotCi1cZW5ke3RhYmxlaWl9Ci0KLU5vdGVzOgotXGJlZ2lue2Rlc2NyaXB0aW9ufQotCi1caXRlbVsoMSldCi0gXHZhcntkYXRlMn0gaXMgbW92ZWQgZm9yd2FyZCBpbiB0aW1lIGlmIFxjb2Rle1x2YXJ7dGltZWRlbHRhfS5kYXlzCi0gICAgPiAwfSwgb3IgYmFja3dhcmQgaWYgXGNvZGV7XHZhcnt0aW1lZGVsdGF9LmRheXMgPCAwfS4gIEFmdGVyd2FyZAotICAgIFxjb2Rle1x2YXJ7ZGF0ZTJ9IC0gXHZhcntkYXRlMX0gPT0gXHZhcnt0aW1lZGVsdGF9LmRheXN9LgotICAgIFxjb2Rle1x2YXJ7dGltZWRlbHRhfS5zZWNvbmRzfSBhbmQKLSAgICBcY29kZXtcdmFye3RpbWVkZWx0YX0ubWljcm9zZWNvbmRzfSBhcmUgaWdub3JlZC4KLSAgICBcZXhjZXB0aW9ue092ZXJmbG93RXJyb3J9IGlzIHJhaXNlZCBpZiBcY29kZXtcdmFye2RhdGUyfS55ZWFyfQotICAgIHdvdWxkIGJlIHNtYWxsZXIgdGhhbiBcY29uc3RhbnR7TUlOWUVBUn0gb3IgbGFyZ2VyIHRoYW4KLSAgICBcY29uc3RhbnR7TUFYWUVBUn0uCi0KLVxpdGVtWygyKV0KLSBUaGlzIGlzbid0IHF1aXRlIGVxdWl2YWxlbnQgdG8gZGF0ZTEgKwotICAgKC10aW1lZGVsdGEpLCBiZWNhdXNlIC10aW1lZGVsdGEgaW4gaXNvbGF0aW9uIGNhbiBvdmVyZmxvdyBpbiBjYXNlcwotICAgd2hlcmUgZGF0ZTEgLSB0aW1lZGVsdGEgZG9lcyBub3QuICBcY29kZXtcdmFye3RpbWVkZWx0YX0uc2Vjb25kc30KLSAgIGFuZCBcY29kZXtcdmFye3RpbWVkZWx0YX0ubWljcm9zZWNvbmRzfSBhcmUgaWdub3JlZC4KLQotXGl0ZW1bKDMpXQotVGhpcyBpcyBleGFjdCwgYW5kIGNhbm5vdCBvdmVyZmxvdy4gIHRpbWVkZWx0YS5zZWNvbmRzIGFuZAotICAgIHRpbWVkZWx0YS5taWNyb3NlY29uZHMgYXJlIDAsIGFuZCBkYXRlMiArIHRpbWVkZWx0YSA9PSBkYXRlMQotICAgIGFmdGVyLgotCi1caXRlbVsoNCldCi1JbiBvdGhlciB3b3JkcywgXGNvZGV7ZGF0ZTEgPCBkYXRlMn0KLSAgIGlmIGFuZCBvbmx5IGlmIFxjb2Rle1x2YXJ7ZGF0ZTF9LnRvb3JkaW5hbCgpIDwKLSAgIFx2YXJ7ZGF0ZTJ9LnRvb3JkaW5hbCgpfS4KLUluIG9yZGVyIHRvIHN0b3AgY29tcGFyaXNvbiBmcm9tIGZhbGxpbmcgYmFjayB0byB0aGUgZGVmYXVsdAotc2NoZW1lIG9mIGNvbXBhcmluZyBvYmplY3QgYWRkcmVzc2VzLCBkYXRlIGNvbXBhcmlzb24KLW5vcm1hbGx5IHJhaXNlcyBcZXhjZXB0aW9ue1R5cGVFcnJvcn0gaWYgdGhlIG90aGVyIGNvbXBhcmFuZAotaXNuJ3QgYWxzbyBhIFxjbGFzc3tkYXRlfSBvYmplY3QuICBIb3dldmVyLCBcY29kZXtOb3RJbXBsZW1lbnRlZH0KLWlzIHJldHVybmVkIGluc3RlYWQgaWYgdGhlIG90aGVyIGNvbXBhcmFuZCBoYXMgYQotXG1ldGhvZHt0aW1ldHVwbGV9IGF0dHJpYnV0ZS4gIFRoaXMgaG9vayBnaXZlcyBvdGhlciBraW5kcyBvZgotZGF0ZSBvYmplY3RzIGEgY2hhbmNlIGF0IGltcGxlbWVudGluZyBtaXhlZC10eXBlIGNvbXBhcmlzb24uCi1JZiBub3QsIHdoZW4gYSBcY2xhc3N7ZGF0ZX0gb2JqZWN0IGlzCi1jb21wYXJlZCB0byBhbiBvYmplY3Qgb2YgYSBkaWZmZXJlbnQgdHlwZSwgXGV4Y2VwdGlvbntUeXBlRXJyb3J9IGlzCi1yYWlzZWQgdW5sZXNzIHRoZSBjb21wYXJpc29uIGlzIFxjb2Rlez09fSBvciBcY29kZXshPX0uICBUaGUgbGF0dGVyCi1jYXNlcyByZXR1cm4gXGNvbnN0YW50e0ZhbHNlfSBvciBcY29uc3RhbnR7VHJ1ZX0sIHJlc3BlY3RpdmVseS4KLQotXGVuZHtkZXNjcmlwdGlvbn0KLQotCi1EYXRlcyBjYW4gYmUgdXNlZCBhcyBkaWN0aW9uYXJ5IGtleXMuIEluIEJvb2xlYW4gY29udGV4dHMsIGFsbAotXGNsYXNze2RhdGV9IG9iamVjdHMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgdHJ1ZS4KLQotSW5zdGFuY2UgbWV0aG9kczoKLQotXGJlZ2lue21ldGhvZGRlc2N9e3JlcGxhY2V9e3llYXIsIG1vbnRoLCBkYXl9Ci0gIFJldHVybiBhIGRhdGUgd2l0aCB0aGUgc2FtZSB2YWx1ZSwgZXhjZXB0IGZvciB0aG9zZSBtZW1iZXJzIGdpdmVuCi0gIG5ldyB2YWx1ZXMgYnkgd2hpY2hldmVyIGtleXdvcmQgYXJndW1lbnRzIGFyZSBzcGVjaWZpZWQuICBGb3IKLSAgZXhhbXBsZSwgaWYgXGNvZGV7ZCA9PSBkYXRlKDIwMDIsIDEyLCAzMSl9LCB0aGVuCi0gIFxjb2Rle2QucmVwbGFjZShkYXk9MjYpID09IGRhdGUoMjAwMiwgMTIsIDI2KX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXt0aW1ldHVwbGV9e30KLSAgUmV0dXJuIGEgXGNsYXNze3RpbWUuc3RydWN0X3RpbWV9IHN1Y2ggYXMgcmV0dXJuZWQgYnkKLSAgXGZ1bmN0aW9ue3RpbWUubG9jYWx0aW1lKCl9LiAgVGhlIGhvdXJzLCBtaW51dGVzIGFuZCBzZWNvbmRzIGFyZQotICAwLCBhbmQgdGhlIERTVCBmbGFnIGlzIC0xLgotICBcY29kZXtcdmFye2R9LnRpbWV0dXBsZSgpfSBpcyBlcXVpdmFsZW50IHRvCi0gICAgICBcY29kZXt0aW1lLnN0cnVjdF90aW1lKChcdmFye2R9LnllYXIsIFx2YXJ7ZH0ubW9udGgsIFx2YXJ7ZH0uZGF5LAotICAgICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgICAgXHZhcntkfS53ZWVrZGF5KCksCi0gICAgICAgICAgICAgXHZhcntkfS50b29yZGluYWwoKSAtIGRhdGUoXHZhcntkfS55ZWFyLCAxLCAxKS50b29yZGluYWwoKSArIDEsCi0gICAgICAgICAgICAtMSkpfQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317dG9vcmRpbmFsfXt9Ci0gIFJldHVybiB0aGUgcHJvbGVwdGljIEdyZWdvcmlhbiBvcmRpbmFsIG9mIHRoZSBkYXRlLCB3aGVyZSBKYW51YXJ5IDEKLSAgb2YgeWVhciAxIGhhcyBvcmRpbmFsIDEuICBGb3IgYW55IFxjbGFzc3tkYXRlfSBvYmplY3QgXHZhcntkfSwKLSAgXGNvZGV7ZGF0ZS5mcm9tb3JkaW5hbChcdmFye2R9LnRvb3JkaW5hbCgpKSA9PSBcdmFye2R9fS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3dlZWtkYXl9e30KLSAgUmV0dXJuIHRoZSBkYXkgb2YgdGhlIHdlZWsgYXMgYW4gaW50ZWdlciwgd2hlcmUgTW9uZGF5IGlzIDAgYW5kCi0gIFN1bmRheSBpcyA2LiAgRm9yIGV4YW1wbGUsIFxjb2Rle2RhdGUoMjAwMiwgMTIsIDQpLndlZWtkYXkoKSA9PSAyfSwgYQotICBXZWRuZXNkYXkuCi0gIFNlZSBhbHNvIFxtZXRob2R7aXNvd2Vla2RheSgpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2lzb3dlZWtkYXl9e30KLSAgUmV0dXJuIHRoZSBkYXkgb2YgdGhlIHdlZWsgYXMgYW4gaW50ZWdlciwgd2hlcmUgTW9uZGF5IGlzIDEgYW5kCi0gIFN1bmRheSBpcyA3LiAgRm9yIGV4YW1wbGUsIFxjb2Rle2RhdGUoMjAwMiwgMTIsIDQpLmlzb3dlZWtkYXkoKSA9PSAzfSwgYQotICBXZWRuZXNkYXkuCi0gIFNlZSBhbHNvIFxtZXRob2R7d2Vla2RheSgpfSwgXG1ldGhvZHtpc29jYWxlbmRhcigpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2lzb2NhbGVuZGFyfXt9Ci0gIFJldHVybiBhIDMtdHVwbGUsIChJU08geWVhciwgSVNPIHdlZWsgbnVtYmVyLCBJU08gd2Vla2RheSkuCi0KLSAgVGhlIElTTyBjYWxlbmRhciBpcyBhIHdpZGVseSB1c2VkIHZhcmlhbnQgb2YgdGhlIEdyZWdvcmlhbiBjYWxlbmRhci4KLSAgU2VlIFx1cmx7aHR0cDovL3d3dy5waHlzLnV1Lm5sL352Z2VudC9jYWxlbmRhci9pc29jYWxlbmRhci5odG19Ci0gIGZvciBhIGdvb2QgZXhwbGFuYXRpb24uCi0KLSAgVGhlIElTTyB5ZWFyIGNvbnNpc3RzIG9mIDUyIG9yIDUzIGZ1bGwgd2Vla3MsIGFuZCB3aGVyZSBhIHdlZWsgc3RhcnRzCi0gIG9uIGEgTW9uZGF5IGFuZCBlbmRzIG9uIGEgU3VuZGF5LiAgVGhlIGZpcnN0IHdlZWsgb2YgYW4gSVNPIHllYXIgaXMKLSAgdGhlIGZpcnN0IChHcmVnb3JpYW4pIGNhbGVuZGFyIHdlZWsgb2YgYSB5ZWFyIGNvbnRhaW5pbmcgYSBUaHVyc2RheS4KLSAgVGhpcyBpcyBjYWxsZWQgd2VlayBudW1iZXIgMSwgYW5kIHRoZSBJU08geWVhciBvZiB0aGF0IFRodXJzZGF5IGlzCi0gIHRoZSBzYW1lIGFzIGl0cyBHcmVnb3JpYW4geWVhci4KLQotICBGb3IgZXhhbXBsZSwgMjAwNCBiZWdpbnMgb24gYSBUaHVyc2RheSwgc28gdGhlIGZpcnN0IHdlZWsgb2YgSVNPCi0gIHllYXIgMjAwNCBiZWdpbnMgb24gTW9uZGF5LCAyOSBEZWMgMjAwMyBhbmQgZW5kcyBvbiBTdW5kYXksIDQgSmFuCi0gIDIwMDQsIHNvIHRoYXQKLSAgXGNvZGV7ZGF0ZSgyMDAzLCAxMiwgMjkpLmlzb2NhbGVuZGFyKCkgPT0gKDIwMDQsIDEsIDEpfQotICBhbmQKLSAgXGNvZGV7ZGF0ZSgyMDA0LCAxLCA0KS5pc29jYWxlbmRhcigpID09ICgyMDA0LCAxLCA3KX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtpc29mb3JtYXR9e30KLSAgUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZGF0ZSBpbiBJU08gODYwMSBmb3JtYXQsCi0gICdZWVlZLU1NLUREJy4gIEZvciBleGFtcGxlLAotICBcY29kZXtkYXRlKDIwMDIsIDEyLCA0KS5pc29mb3JtYXQoKSA9PSAnMjAwMi0xMi0wNCd9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317X19zdHJfX317fQotICBGb3IgYSBkYXRlIFx2YXJ7ZH0sIFxjb2Rle3N0cihcdmFye2R9KX0gaXMgZXF1aXZhbGVudCB0bwotICBcY29kZXtcdmFye2R9Lmlzb2Zvcm1hdCgpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2N0aW1lfXt9Ci0gIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGRhdGUsIGZvciBleGFtcGxlCi0gIGRhdGUoMjAwMiwgMTIsIDQpLmN0aW1lKCkgPT0gJ1dlZCBEZWMgIDQgMDA6MDA6MDAgMjAwMicuCi0gIFxjb2Rle1x2YXJ7ZH0uY3RpbWUoKX0gaXMgZXF1aXZhbGVudCB0bwotICBcY29kZXt0aW1lLmN0aW1lKHRpbWUubWt0aW1lKFx2YXJ7ZH0udGltZXR1cGxlKCkpKX0KLSAgb24gcGxhdGZvcm1zIHdoZXJlIHRoZSBuYXRpdmUgQyBcY2Z1bmN0aW9ue2N0aW1lKCl9IGZ1bmN0aW9uCi0gICh3aGljaCBcZnVuY3Rpb257dGltZS5jdGltZSgpfSBpbnZva2VzLCBidXQgd2hpY2gKLSAgXG1ldGhvZHtkYXRlLmN0aW1lKCl9IGRvZXMgbm90IGludm9rZSkgY29uZm9ybXMgdG8gdGhlIEMgc3RhbmRhcmQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtzdHJmdGltZX17Zm9ybWF0fQotICBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkYXRlLCBjb250cm9sbGVkIGJ5IGFuIGV4cGxpY2l0Ci0gIGZvcm1hdCBzdHJpbmcuICBGb3JtYXQgY29kZXMgcmVmZXJyaW5nIHRvIGhvdXJzLCBtaW51dGVzIG9yIHNlY29uZHMKLSAgd2lsbCBzZWUgMCB2YWx1ZXMuCi0gIFNlZSBzZWN0aW9uflxyZWZ7c3RyZnRpbWUtYmVoYXZpb3J9IC0tIFxtZXRob2R7c3RyZnRpbWUoKX0gYmVoYXZpb3IuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLQotXHN1YnNlY3Rpb257XGNsYXNze2RhdGV0aW1lfSBPYmplY3RzIFxsYWJlbHtkYXRldGltZS1kYXRldGltZX19Ci0KLUEgXGNsYXNze2RhdGV0aW1lfSBvYmplY3QgaXMgYSBzaW5nbGUgb2JqZWN0IGNvbnRhaW5pbmcgYWxsIHRoZQotaW5mb3JtYXRpb24gZnJvbSBhIFxjbGFzc3tkYXRlfSBvYmplY3QgYW5kIGEgXGNsYXNze3RpbWV9IG9iamVjdC4gIExpa2UgYQotXGNsYXNze2RhdGV9IG9iamVjdCwgXGNsYXNze2RhdGV0aW1lfSBhc3N1bWVzIHRoZSBjdXJyZW50IEdyZWdvcmlhbgotY2FsZW5kYXIgZXh0ZW5kZWQgaW4gYm90aCBkaXJlY3Rpb25zOyBsaWtlIGEgdGltZSBvYmplY3QsCi1cY2xhc3N7ZGF0ZXRpbWV9IGFzc3VtZXMgdGhlcmUgYXJlIGV4YWN0bHkgMzYwMCoyNCBzZWNvbmRzIGluIGV2ZXJ5Ci1kYXkuCi0KLUNvbnN0cnVjdG9yOgotCi1cYmVnaW57Y2xhc3NkZXNjfXtkYXRldGltZX17eWVhciwgbW9udGgsIGRheVxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaG91clxvcHRpb25hbHssIG1pbnV0ZVxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kXG9wdGlvbmFseywgbWljcm9zZWNvbmRcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR6aW5mb319fX19fQotICBUaGUgeWVhciwgbW9udGggYW5kIGRheSBhcmd1bWVudHMgYXJlIHJlcXVpcmVkLiAgXHZhcnt0emluZm99IG1heQotICBiZSBcY29kZXtOb25lfSwgb3IgYW4gaW5zdGFuY2Ugb2YgYSBcY2xhc3N7dHppbmZvfSBzdWJjbGFzcy4gIFRoZQotICByZW1haW5pbmcgYXJndW1lbnRzIG1heSBiZSBpbnRzIG9yIGxvbmdzLCBpbiB0aGUgZm9sbG93aW5nIHJhbmdlczoKLQotICBcYmVnaW57aXRlbWl6ZX0KLSAgICBcaXRlbSBcY29kZXtNSU5ZRUFSIDw9IFx2YXJ7eWVhcn0gPD0gTUFYWUVBUn0KLSAgICBcaXRlbSBcY29kZXsxIDw9IFx2YXJ7bW9udGh9IDw9IDEyfQotICAgIFxpdGVtIFxjb2RlezEgPD0gXHZhcntkYXl9IDw9IG51bWJlciBvZiBkYXlzIGluIHRoZSBnaXZlbiBtb250aCBhbmQgeWVhcn0KLSAgICBcaXRlbSBcY29kZXswIDw9IFx2YXJ7aG91cn0gPCAyNH0KLSAgICBcaXRlbSBcY29kZXswIDw9IFx2YXJ7bWludXRlfSA8IDYwfQotICAgIFxpdGVtIFxjb2RlezAgPD0gXHZhcntzZWNvbmR9IDwgNjB9Ci0gICAgXGl0ZW0gXGNvZGV7MCA8PSBcdmFye21pY3Jvc2Vjb25kfSA8IDEwMDAwMDB9Ci0gIFxlbmR7aXRlbWl6ZX0KLQotICBJZiBhbiBhcmd1bWVudCBvdXRzaWRlIHRob3NlIHJhbmdlcyBpcyBnaXZlbiwKLSAgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSBpcyByYWlzZWQuCi1cZW5ke2NsYXNzZGVzY30KLQotT3RoZXIgY29uc3RydWN0b3JzLCBhbGwgY2xhc3MgbWV0aG9kczoKLQotXGJlZ2lue21ldGhvZGRlc2N9e3RvZGF5fXt9Ci0gIFJldHVybiB0aGUgY3VycmVudCBsb2NhbCBkYXRldGltZSwgd2l0aCBcbWVtYmVye3R6aW5mb30gXGNvZGV7Tm9uZX0uCi0gIFRoaXMgaXMgZXF1aXZhbGVudCB0bwotICBcY29kZXtkYXRldGltZS5mcm9tdGltZXN0YW1wKHRpbWUudGltZSgpKX0uCi0gIFNlZSBhbHNvIFxtZXRob2R7bm93KCl9LCBcbWV0aG9ke2Zyb210aW1lc3RhbXAoKX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtub3d9e1xvcHRpb25hbHt0en19Ci0gIFJldHVybiB0aGUgY3VycmVudCBsb2NhbCBkYXRlIGFuZCB0aW1lLiAgSWYgb3B0aW9uYWwgYXJndW1lbnQKLSAgXHZhcnt0en0gaXMgXGNvZGV7Tm9uZX0gb3Igbm90IHNwZWNpZmllZCwgdGhpcyBpcyBsaWtlCi0gIFxtZXRob2R7dG9kYXkoKX0sIGJ1dCwgaWYgcG9zc2libGUsIHN1cHBsaWVzIG1vcmUgcHJlY2lzaW9uIHRoYW4gY2FuCi0gIGJlIGdvdHRlbiBmcm9tIGdvaW5nIHRocm91Z2ggYSBcZnVuY3Rpb257dGltZS50aW1lKCl9IHRpbWVzdGFtcCAoZm9yCi0gIGV4YW1wbGUsIHRoaXMgbWF5IGJlIHBvc3NpYmxlIG9uIHBsYXRmb3JtcyBzdXBwbHlpbmcgdGhlIEMKLSAgXGNmdW5jdGlvbntnZXR0aW1lb2ZkYXkoKX0gZnVuY3Rpb24pLgotCi0gIEVsc2UgXHZhcnt0en0gbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIFxjbGFzc3t0emluZm99IHN1YmNsYXNzLAotICBhbmQgdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSBhcmUgY29udmVydGVkIHRvIFx2YXJ7dHp9J3MgdGltZQotICB6b25lLiAgSW4gdGhpcyBjYXNlIHRoZSByZXN1bHQgaXMgZXF1aXZhbGVudCB0bwotICBcY29kZXtcdmFye3R6fS5mcm9tdXRjKGRhdGV0aW1lLnV0Y25vdygpLnJlcGxhY2UodHppbmZvPVx2YXJ7dHp9KSl9LgotICBTZWUgYWxzbyBcbWV0aG9ke3RvZGF5KCl9LCBcbWV0aG9ke3V0Y25vdygpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3V0Y25vd317fQotICBSZXR1cm4gdGhlIGN1cnJlbnQgVVRDIGRhdGUgYW5kIHRpbWUsIHdpdGggXG1lbWJlcnt0emluZm99IFxjb2Rle05vbmV9LgotICBUaGlzIGlzIGxpa2UgXG1ldGhvZHtub3coKX0sIGJ1dCByZXR1cm5zIHRoZSBjdXJyZW50IFVUQyBkYXRlIGFuZCB0aW1lLAotICBhcyBhIG5haXZlIFxjbGFzc3tkYXRldGltZX0gb2JqZWN0LgotICBTZWUgYWxzbyBcbWV0aG9ke25vdygpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2Zyb210aW1lc3RhbXB9e3RpbWVzdGFtcFxvcHRpb25hbHssIHR6fX0KLSAgUmV0dXJuIHRoZSBsb2NhbCBkYXRlIGFuZCB0aW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFxQT1NJWHt9Ci0gIHRpbWVzdGFtcCwgc3VjaCBhcyBpcyByZXR1cm5lZCBieSBcZnVuY3Rpb257dGltZS50aW1lKCl9LgotICBJZiBvcHRpb25hbCBhcmd1bWVudCBcdmFye3R6fSBpcyBcY29kZXtOb25lfSBvciBub3Qgc3BlY2lmaWVkLCB0aGUKLSAgdGltZXN0YW1wIGlzIGNvbnZlcnRlZCB0byB0aGUgcGxhdGZvcm0ncyBsb2NhbCBkYXRlIGFuZCB0aW1lLCBhbmQKLSAgdGhlIHJldHVybmVkIFxjbGFzc3tkYXRldGltZX0gb2JqZWN0IGlzIG5haXZlLgotCi0gIEVsc2UgXHZhcnt0en0gbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIFxjbGFzc3t0emluZm99IHN1YmNsYXNzLAotICBhbmQgdGhlIHRpbWVzdGFtcCBpcyBjb252ZXJ0ZWQgdG8gXHZhcnt0en0ncyB0aW1lIHpvbmUuICBJbiB0aGlzIGNhc2UKLSAgdGhlIHJlc3VsdCBpcyBlcXVpdmFsZW50IHRvCi0gIFxjb2Rle1x2YXJ7dHp9LmZyb211dGMoZGF0ZXRpbWUudXRjZnJvbXRpbWVzdGFtcChcdmFye3RpbWVzdGFtcH0pLnJlcGxhY2UodHppbmZvPVx2YXJ7dHp9KSl9LgotCi0gIFxtZXRob2R7ZnJvbXRpbWVzdGFtcCgpfSBtYXkgcmFpc2UgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSwgaWYgdGhlCi0gIHRpbWVzdGFtcCBpcyBvdXQgb2YgdGhlIHJhbmdlIG9mIHZhbHVlcyBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtIEMKLSAgXGNmdW5jdGlvbntsb2NhbHRpbWUoKX0gb3IgXGNmdW5jdGlvbntnbXRpbWUoKX0gZnVuY3Rpb25zLiAgSXQncyBjb21tb24KLSAgZm9yIHRoaXMgdG8gYmUgcmVzdHJpY3RlZCB0byB5ZWFycyBpbiAxOTcwIHRocm91Z2ggMjAzOC4KLSAgTm90ZSB0aGF0IG9uIG5vbi1QT1NJWCBzeXN0ZW1zIHRoYXQgaW5jbHVkZSBsZWFwIHNlY29uZHMgaW4gdGhlaXIKLSAgbm90aW9uIG9mIGEgdGltZXN0YW1wLCBsZWFwIHNlY29uZHMgYXJlIGlnbm9yZWQgYnkKLSAgXG1ldGhvZHtmcm9tdGltZXN0YW1wKCl9LCBhbmQgdGhlbiBpdCdzIHBvc3NpYmxlIHRvIGhhdmUgdHdvIHRpbWVzdGFtcHMKLSAgZGlmZmVyaW5nIGJ5IGEgc2Vjb25kIHRoYXQgeWllbGQgaWRlbnRpY2FsIFxjbGFzc3tkYXRldGltZX0gb2JqZWN0cy4KLSAgU2VlIGFsc28gXG1ldGhvZHt1dGNmcm9tdGltZXN0YW1wKCl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317dXRjZnJvbXRpbWVzdGFtcH17dGltZXN0YW1wfQotICBSZXR1cm4gdGhlIFVUQyBcY2xhc3N7ZGF0ZXRpbWV9IGNvcnJlc3BvbmRpbmcgdG8gdGhlIFxQT1NJWHt9Ci0gIHRpbWVzdGFtcCwgd2l0aCBcbWVtYmVye3R6aW5mb30gXGNvZGV7Tm9uZX0uCi0gIFRoaXMgbWF5IHJhaXNlIFxleGNlcHRpb257VmFsdWVFcnJvcn0sIGlmIHRoZQotICB0aW1lc3RhbXAgaXMgb3V0IG9mIHRoZSByYW5nZSBvZiB2YWx1ZXMgc3VwcG9ydGVkIGJ5IHRoZSBwbGF0Zm9ybQotICBDIFxjZnVuY3Rpb257Z210aW1lKCl9IGZ1bmN0aW9uLiAgSXQncyBjb21tb24gZm9yIHRoaXMgdG8gYmUKLSAgcmVzdHJpY3RlZCB0byB5ZWFycyBpbiAxOTcwIHRocm91Z2ggMjAzOC4KLSAgU2VlIGFsc28gXG1ldGhvZHtmcm9tdGltZXN0YW1wKCl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317ZnJvbW9yZGluYWx9e29yZGluYWx9Ci0gIFJldHVybiB0aGUgXGNsYXNze2RhdGV0aW1lfSBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9sZXB0aWMKLSAgR3JlZ29yaWFuIG9yZGluYWwsIHdoZXJlIEphbnVhcnkgMSBvZiB5ZWFyIDEgaGFzIG9yZGluYWwgMS4KLSAgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSBpcyByYWlzZWQgdW5sZXNzIFxjb2RlezEgPD0gb3JkaW5hbCA8PQotICBkYXRldGltZS5tYXgudG9vcmRpbmFsKCl9LiAgVGhlIGhvdXIsIG1pbnV0ZSwgc2Vjb25kIGFuZAotICBtaWNyb3NlY29uZCBvZiB0aGUgcmVzdWx0IGFyZSBhbGwgMCwKLSAgYW5kIFxtZW1iZXJ7dHppbmZvfSBpcyBcY29kZXtOb25lfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2NvbWJpbmV9e2RhdGUsIHRpbWV9Ci0gIFJldHVybiBhIG5ldyBcY2xhc3N7ZGF0ZXRpbWV9IG9iamVjdCB3aG9zZSBkYXRlIG1lbWJlcnMgYXJlCi0gIGVxdWFsIHRvIHRoZSBnaXZlbiBcY2xhc3N7ZGF0ZX0gb2JqZWN0J3MsIGFuZCB3aG9zZSB0aW1lCi0gIGFuZCBcbWVtYmVye3R6aW5mb30gbWVtYmVycyBhcmUgZXF1YWwgdG8gdGhlIGdpdmVuIFxjbGFzc3t0aW1lfSBvYmplY3Qncy4KLSAgRm9yIGFueSBcY2xhc3N7ZGF0ZXRpbWV9IG9iamVjdCBcdmFye2R9LCBcY29kZXtcdmFye2R9ID09Ci0gIGRhdGV0aW1lLmNvbWJpbmUoXHZhcntkfS5kYXRlKCksIFx2YXJ7ZH0udGltZXR6KCkpfS4gIElmIGRhdGUgaXMgYQotICBcY2xhc3N7ZGF0ZXRpbWV9IG9iamVjdCwgaXRzIHRpbWUgYW5kIFxtZW1iZXJ7dHppbmZvfSBtZW1iZXJzIGFyZQotICBpZ25vcmVkLgotICBcZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtzdHJwdGltZX17ZGF0ZV9zdHJpbmcsIGZvcm1hdH0KLSAgUmV0dXJuIGEgXGNsYXNze2RhdGV0aW1lfSBjb3JyZXNwb25kaW5nIHRvIFx2YXJ7ZGF0ZV9zdHJpbmd9LCBwYXJzZWQKLSAgYWNjb3JkaW5nIHRvIFx2YXJ7Zm9ybWF0fS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0bwotICBcY29kZXtkYXRldGltZSgqKHRpbWUuc3RycHRpbWUoZGF0ZV9zdHJpbmcsCi0gIGZvcm1hdClbMDo2XSkpfS4gXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSBpcyByYWlzZWQgaWYgdGhlIGRhdGVfc3RyaW5nIGFuZAotICBmb3JtYXQgY2FuJ3QgYmUgcGFyc2VkIGJ5IFxmdW5jdGlvbnt0aW1lLnN0cnB0aW1lKCl9IG9yIGlmIGl0IHJldHVybnMgYQotICB2YWx1ZSB3aGljaCBpc24ndCBhIHRpbWUgdHVwbGUuCi0KLSAgXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLUNsYXNzIGF0dHJpYnV0ZXM6Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXttaW59Ci0gIFRoZSBlYXJsaWVzdCByZXByZXNlbnRhYmxlIFxjbGFzc3tkYXRldGltZX0sCi0gIFxjb2Rle2RhdGV0aW1lKE1JTllFQVIsIDEsIDEsIHR6aW5mbz1Ob25lKX0uCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXttYXh9Ci0gIFRoZSBsYXRlc3QgcmVwcmVzZW50YWJsZSBcY2xhc3N7ZGF0ZXRpbWV9LAotICBcY29kZXtkYXRldGltZShNQVhZRUFSLCAxMiwgMzEsIDIzLCA1OSwgNTksIDk5OTk5OSwgdHppbmZvPU5vbmUpfS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9e3Jlc29sdXRpb259Ci0gIFRoZSBzbWFsbGVzdCBwb3NzaWJsZSBkaWZmZXJlbmNlIGJldHdlZW4gbm9uLWVxdWFsIFxjbGFzc3tkYXRldGltZX0KLSAgb2JqZWN0cywgXGNvZGV7dGltZWRlbHRhKG1pY3Jvc2Vjb25kcz0xKX0uCi1cZW5ke21lbWJlcmRlc2N9Ci0KLUluc3RhbmNlIGF0dHJpYnV0ZXMgKHJlYWQtb25seSk6Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXt5ZWFyfQotICBCZXR3ZWVuIFxjb25zdGFudHtNSU5ZRUFSfSBhbmQgXGNvbnN0YW50e01BWFlFQVJ9IGluY2x1c2l2ZS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9e21vbnRofQotICBCZXR3ZWVuIDEgYW5kIDEyIGluY2x1c2l2ZS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9e2RheX0KLSAgQmV0d2VlbiAxIGFuZCB0aGUgbnVtYmVyIG9mIGRheXMgaW4gdGhlIGdpdmVuIG1vbnRoIG9mIHRoZSBnaXZlbgotICB5ZWFyLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY317aG91cn0KLSAgSW4gXGNvZGV7cmFuZ2UoMjQpfS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9e21pbnV0ZX0KLSAgSW4gXGNvZGV7cmFuZ2UoNjApfS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9e3NlY29uZH0KLSAgSW4gXGNvZGV7cmFuZ2UoNjApfS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9e21pY3Jvc2Vjb25kfQotICBJbiBcY29kZXtyYW5nZSgxMDAwMDAwKX0uCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXt0emluZm99Ci0gIFRoZSBvYmplY3QgcGFzc2VkIGFzIHRoZSBcdmFye3R6aW5mb30gYXJndW1lbnQgdG8gdGhlCi0gIFxjbGFzc3tkYXRldGltZX0gY29uc3RydWN0b3IsIG9yIFxjb2Rle05vbmV9IGlmIG5vbmUgd2FzIHBhc3NlZC4KLVxlbmR7bWVtYmVyZGVzY30KLQotU3VwcG9ydGVkIG9wZXJhdGlvbnM6Ci0KLVxiZWdpbnt0YWJsZWlpfXtjfGx9e2NvZGV9e09wZXJhdGlvbn17UmVzdWx0fQotICBcbGluZWlpe1x2YXJ7ZGF0ZXRpbWUyfSA9IFx2YXJ7ZGF0ZXRpbWUxfSArIFx2YXJ7dGltZWRlbHRhfX17KDEpfQotCi0gIFxsaW5laWl7XHZhcntkYXRldGltZTJ9ID0gXHZhcntkYXRldGltZTF9IC0gXHZhcnt0aW1lZGVsdGF9fXsoMil9Ci0KLSAgXGxpbmVpaXtcdmFye3RpbWVkZWx0YX0gPSBcdmFye2RhdGV0aW1lMX0gLSBcdmFye2RhdGV0aW1lMn19eygzKX0KLQotICBcbGluZWlpe1x2YXJ7ZGF0ZXRpbWUxfSA8IFx2YXJ7ZGF0ZXRpbWUyfX0KLSAgIHtDb21wYXJlcyBcY2xhc3N7ZGF0ZXRpbWV9IHRvIFxjbGFzc3tkYXRldGltZX0uCi0gICAgKDQpfQotCi1cZW5ke3RhYmxlaWl9Ci0KLVxiZWdpbntkZXNjcmlwdGlvbn0KLQotXGl0ZW1bKDEpXQotCi0gICAgZGF0ZXRpbWUyIGlzIGEgZHVyYXRpb24gb2YgdGltZWRlbHRhIHJlbW92ZWQgZnJvbSBkYXRldGltZTEsIG1vdmluZwotICAgIGZvcndhcmQgaW4gdGltZSBpZiBcY29kZXtcdmFye3RpbWVkZWx0YX0uZGF5c30gPiAwLCBvciBiYWNrd2FyZCBpZgotICAgIFxjb2Rle1x2YXJ7dGltZWRlbHRhfS5kYXlzfSA8IDAuICBUaGUgcmVzdWx0IGhhcyB0aGUgc2FtZSBcbWVtYmVye3R6aW5mb30gbWVtYmVyCi0gICAgYXMgdGhlIGlucHV0IGRhdGV0aW1lLCBhbmQgZGF0ZXRpbWUyIC0gZGF0ZXRpbWUxID09IHRpbWVkZWx0YSBhZnRlci4KLSAgICBcZXhjZXB0aW9ue092ZXJmbG93RXJyb3J9IGlzIHJhaXNlZCBpZiBkYXRldGltZTIueWVhciB3b3VsZCBiZQotICAgIHNtYWxsZXIgdGhhbiBcY29uc3RhbnR7TUlOWUVBUn0gb3IgbGFyZ2VyIHRoYW4gXGNvbnN0YW50e01BWFlFQVJ9LgotICAgIE5vdGUgdGhhdCBubyB0aW1lIHpvbmUgYWRqdXN0bWVudHMgYXJlIGRvbmUgZXZlbiBpZiB0aGUgaW5wdXQgaXMgYW4KLSAgICBhd2FyZSBvYmplY3QuCi0KLVxpdGVtWygyKV0KLSAgICBDb21wdXRlcyB0aGUgZGF0ZXRpbWUyIHN1Y2ggdGhhdCBkYXRldGltZTIgKyB0aW1lZGVsdGEgPT0gZGF0ZXRpbWUxLgotICAgIEFzIGZvciBhZGRpdGlvbiwgdGhlIHJlc3VsdCBoYXMgdGhlIHNhbWUgXG1lbWJlcnt0emluZm99IG1lbWJlcgotICAgIGFzIHRoZSBpbnB1dCBkYXRldGltZSwgYW5kIG5vIHRpbWUgem9uZSBhZGp1c3RtZW50cyBhcmUgZG9uZSBldmVuCi0gICAgaWYgdGhlIGlucHV0IGlzIGF3YXJlLgotICAgIFRoaXMgaXNuJ3QgcXVpdGUgZXF1aXZhbGVudCB0byBkYXRldGltZTEgKyAoLXRpbWVkZWx0YSksIGJlY2F1c2UKLSAgICAtdGltZWRlbHRhIGluIGlzb2xhdGlvbiBjYW4gb3ZlcmZsb3cgaW4gY2FzZXMgd2hlcmUKLSAgICBkYXRldGltZTEgLSB0aW1lZGVsdGEgZG9lcyBub3QuCi0KLVxpdGVtWygzKV0KLSAgICBTdWJ0cmFjdGlvbiBvZiBhIFxjbGFzc3tkYXRldGltZX0gZnJvbSBhCi0gICAgXGNsYXNze2RhdGV0aW1lfSBpcyBkZWZpbmVkIG9ubHkgaWYgYm90aAotICAgIG9wZXJhbmRzIGFyZSBuYWl2ZSwgb3IgaWYgYm90aCBhcmUgYXdhcmUuICBJZiBvbmUgaXMgYXdhcmUgYW5kIHRoZQotICAgIG90aGVyIGlzIG5haXZlLCBcZXhjZXB0aW9ue1R5cGVFcnJvcn0gaXMgcmFpc2VkLgotCi0gICAgSWYgYm90aCBhcmUgbmFpdmUsIG9yIGJvdGggYXJlIGF3YXJlIGFuZCBoYXZlIHRoZSBzYW1lIFxtZW1iZXJ7dHppbmZvfQotICAgIG1lbWJlciwgdGhlIFxtZW1iZXJ7dHppbmZvfSBtZW1iZXJzIGFyZSBpZ25vcmVkLCBhbmQgdGhlIHJlc3VsdCBpcwotICAgIGEgXGNsYXNze3RpbWVkZWx0YX0gb2JqZWN0IFx2YXJ7dH0gc3VjaCB0aGF0Ci0gICAgXGNvZGV7XHZhcntkYXRldGltZTJ9ICsgXHZhcnt0fSA9PSBcdmFye2RhdGV0aW1lMX19LiAgTm8gdGltZSB6b25lCi0gICAgYWRqdXN0bWVudHMgYXJlIGRvbmUgaW4gdGhpcyBjYXNlLgotCi0gICAgSWYgYm90aCBhcmUgYXdhcmUgYW5kIGhhdmUgZGlmZmVyZW50IFxtZW1iZXJ7dHppbmZvfSBtZW1iZXJzLAotICAgIFxjb2Rle2EtYn0gYWN0cyBhcyBpZiBcdmFye2F9IGFuZCBcdmFye2J9IHdlcmUgZmlyc3QgY29udmVydGVkIHRvCi0gICAgbmFpdmUgVVRDIGRhdGV0aW1lcyBmaXJzdC4gIFRoZSByZXN1bHQgaXMKLSAgICBcY29kZXsoXHZhcnthfS5yZXBsYWNlKHR6aW5mbz1Ob25lKSAtIFx2YXJ7YX0udXRjb2Zmc2V0KCkpIC0KLSAgICAgICAgICAoXHZhcntifS5yZXBsYWNlKHR6aW5mbz1Ob25lKSAtIFx2YXJ7Yn0udXRjb2Zmc2V0KCkpfQotICAgIGV4Y2VwdCB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBuZXZlciBvdmVyZmxvd3MuCi0KLVxpdGVtWyg0KV0KLQotXHZhcntkYXRldGltZTF9IGlzIGNvbnNpZGVyZWQgbGVzcyB0aGFuIFx2YXJ7ZGF0ZXRpbWUyfQotd2hlbiBcdmFye2RhdGV0aW1lMX0gcHJlY2VkZXMgXHZhcntkYXRldGltZTJ9IGluIHRpbWUuCi0KLUlmIG9uZSBjb21wYXJhbmQgaXMgbmFpdmUgYW5kCi10aGUgb3RoZXIgaXMgYXdhcmUsIFxleGNlcHRpb257VHlwZUVycm9yfSBpcyByYWlzZWQuICBJZiBib3RoCi0gICAgY29tcGFyYW5kcyBhcmUgYXdhcmUsIGFuZCBoYXZlIHRoZSBzYW1lIFxtZW1iZXJ7dHppbmZvfSBtZW1iZXIsCi0gICAgdGhlIGNvbW1vbiBcbWVtYmVye3R6aW5mb30gbWVtYmVyIGlzIGlnbm9yZWQgYW5kIHRoZSBiYXNlIGRhdGV0aW1lcwotICAgIGFyZSBjb21wYXJlZC4gIElmIGJvdGggY29tcGFyYW5kcyBhcmUgYXdhcmUgYW5kIGhhdmUgZGlmZmVyZW50Ci0gICAgXG1lbWJlcnt0emluZm99IG1lbWJlcnMsIHRoZSBjb21wYXJhbmRzIGFyZSBmaXJzdCBhZGp1c3RlZCBieQotICAgIHN1YnRyYWN0aW5nIHRoZWlyIFVUQyBvZmZzZXRzIChvYnRhaW5lZCBmcm9tIFxjb2Rle3NlbGYudXRjb2Zmc2V0KCl9KS4KLSAgICBcbm90ZXtJbiBvcmRlciB0byBzdG9wIGNvbXBhcmlzb24gZnJvbSBmYWxsaW5nIGJhY2sgdG8gdGhlIGRlZmF1bHQKLSAgICAgICAgICBzY2hlbWUgb2YgY29tcGFyaW5nIG9iamVjdCBhZGRyZXNzZXMsIGRhdGV0aW1lIGNvbXBhcmlzb24KLSAgICAgICAgICBub3JtYWxseSByYWlzZXMgXGV4Y2VwdGlvbntUeXBlRXJyb3J9IGlmIHRoZSBvdGhlciBjb21wYXJhbmQKLSAgICAgICAgICBpc24ndCBhbHNvIGEgXGNsYXNze2RhdGV0aW1lfSBvYmplY3QuICBIb3dldmVyLAotICAgICAgICAgIFxjb2Rle05vdEltcGxlbWVudGVkfSBpcyByZXR1cm5lZCBpbnN0ZWFkIGlmIHRoZSBvdGhlciBjb21wYXJhbmQKLSAgICAgICAgICBoYXMgYSBcbWV0aG9ke3RpbWV0dXBsZX0gYXR0cmlidXRlLiAgVGhpcyBob29rIGdpdmVzIG90aGVyCi0gICAgICAgICAga2luZHMgb2YgZGF0ZSBvYmplY3RzIGEgY2hhbmNlIGF0IGltcGxlbWVudGluZyBtaXhlZC10eXBlCi0gICAgICAgICAgY29tcGFyaXNvbi4gIElmIG5vdCwgd2hlbiBhIFxjbGFzc3tkYXRldGltZX0gb2JqZWN0IGlzCi0gICAgICAgICAgY29tcGFyZWQgdG8gYW4gb2JqZWN0IG9mIGEgZGlmZmVyZW50IHR5cGUsIFxleGNlcHRpb257VHlwZUVycm9yfQotICAgICAgICAgIGlzIHJhaXNlZCB1bmxlc3MgdGhlIGNvbXBhcmlzb24gaXMgXGNvZGV7PT19IG9yIFxjb2RleyE9fS4gIFRoZQotICAgICAgICAgIGxhdHRlciBjYXNlcyByZXR1cm4gXGNvbnN0YW50e0ZhbHNlfSBvciBcY29uc3RhbnR7VHJ1ZX0sCi0gICAgICAgICAgcmVzcGVjdGl2ZWx5Ln0KLQotXGVuZHtkZXNjcmlwdGlvbn0KLQotXGNsYXNze2RhdGV0aW1lfSBvYmplY3RzIGNhbiBiZSB1c2VkIGFzIGRpY3Rpb25hcnkga2V5cy4gSW4gQm9vbGVhbgotY29udGV4dHMsIGFsbCBcY2xhc3N7ZGF0ZXRpbWV9IG9iamVjdHMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgdHJ1ZS4KLQotCi1JbnN0YW5jZSBtZXRob2RzOgotCi1cYmVnaW57bWV0aG9kZGVzY317ZGF0ZX17fQotICBSZXR1cm4gXGNsYXNze2RhdGV9IG9iamVjdCB3aXRoIHNhbWUgeWVhciwgbW9udGggYW5kIGRheS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3RpbWV9e30KLSAgUmV0dXJuIFxjbGFzc3t0aW1lfSBvYmplY3Qgd2l0aCBzYW1lIGhvdXIsIG1pbnV0ZSwgc2Vjb25kIGFuZCBtaWNyb3NlY29uZC4KLSAgXG1lbWJlcnt0emluZm99IGlzIFxjb2Rle05vbmV9LiAgU2VlIGFsc28gbWV0aG9kIFxtZXRob2R7dGltZXR6KCl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317dGltZXR6fXt9Ci0gIFJldHVybiBcY2xhc3N7dGltZX0gb2JqZWN0IHdpdGggc2FtZSBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQsCi0gIGFuZCB0emluZm8gbWVtYmVycy4gIFNlZSBhbHNvIG1ldGhvZCBcbWV0aG9ke3RpbWUoKX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtyZXBsYWNlfXtcb3B0aW9uYWx7eWVhclxvcHRpb25hbHssIG1vbnRoXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXlcb3B0aW9uYWx7LCBob3VyXG9wdGlvbmFseywgbWludXRlXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRcb3B0aW9uYWx7LCBtaWNyb3NlY29uZFxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHppbmZvfX19fX19fX19Ci0gIFJldHVybiBhIGRhdGV0aW1lIHdpdGggdGhlIHNhbWUgbWVtYmVycywgZXhjZXB0IGZvciB0aG9zZSBtZW1iZXJzIGdpdmVuCi0gIG5ldyB2YWx1ZXMgYnkgd2hpY2hldmVyIGtleXdvcmQgYXJndW1lbnRzIGFyZSBzcGVjaWZpZWQuICBOb3RlIHRoYXQKLSAgXGNvZGV7dHppbmZvPU5vbmV9IGNhbiBiZSBzcGVjaWZpZWQgdG8gY3JlYXRlIGEgbmFpdmUgZGF0ZXRpbWUgZnJvbQotICBhbiBhd2FyZSBkYXRldGltZSB3aXRoIG5vIGNvbnZlcnNpb24gb2YgZGF0ZSBhbmQgdGltZSBtZW1iZXJzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317YXN0aW1lem9uZX17dHp9Ci0gIFJldHVybiBhIFxjbGFzc3tkYXRldGltZX0gb2JqZWN0IHdpdGggbmV3IFxtZW1iZXJ7dHppbmZvfSBtZW1iZXIKLSAgXHZhcnt0en0sIGFkanVzdGluZyB0aGUgZGF0ZSBhbmQgdGltZSBtZW1iZXJzIHNvIHRoZSByZXN1bHQgaXMgdGhlCi0gIHNhbWUgVVRDIHRpbWUgYXMgXHZhcntzZWxmfSwgYnV0IGluIFx2YXJ7dHp9J3MgbG9jYWwgdGltZS4KLQotICBcdmFye3R6fSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIGEgXGNsYXNze3R6aW5mb30gc3ViY2xhc3MsIGFuZCBpdHMKLSAgXG1ldGhvZHt1dGNvZmZzZXQoKX0gYW5kIFxtZXRob2R7ZHN0KCl9IG1ldGhvZHMgbXVzdCBub3QgcmV0dXJuCi0gIFxjb2Rle05vbmV9LiAgXHZhcntzZWxmfSBtdXN0IGJlIGF3YXJlIChcY29kZXtcdmFye3NlbGZ9LnR6aW5mb30gbXVzdAotICBub3QgYmUgXGNvZGV7Tm9uZX0sIGFuZCBcY29kZXtcdmFye3NlbGZ9LnV0Y29mZnNldCgpfSBtdXN0IG5vdCByZXR1cm4KLSAgXGNvZGV7Tm9uZX0pLgotCi0gIElmIFxjb2Rle1x2YXJ7c2VsZn0udHppbmZvfSBpcyBcdmFye3R6fSwKLSAgXGNvZGV7XHZhcntzZWxmfS5hc3RpbWV6b25lKFx2YXJ7dHp9KX0gaXMgZXF1YWwgdG8gXHZhcntzZWxmfTogIG5vCi0gIGFkanVzdG1lbnQgb2YgZGF0ZSBvciB0aW1lIG1lbWJlcnMgaXMgcGVyZm9ybWVkLgotICBFbHNlIHRoZSByZXN1bHQgaXMgbG9jYWwgdGltZSBpbiB0aW1lIHpvbmUgXHZhcnt0en0sIHJlcHJlc2VudGluZyB0aGUKLSAgc2FtZSBVVEMgdGltZSBhcyBcdmFye3NlbGZ9OiAgYWZ0ZXIgXGNvZGV7XHZhcnthc3R6fSA9Ci0gIFx2YXJ7ZHR9LmFzdGltZXpvbmUoXHZhcnt0en0pfSwKLSAgXGNvZGV7XHZhcnthc3R6fSAtIFx2YXJ7YXN0en0udXRjb2Zmc2V0KCl9IHdpbGwgdXN1YWxseSBoYXZlIHRoZSBzYW1lCi0gIGRhdGUgYW5kIHRpbWUgbWVtYmVycyBhcyBcY29kZXtcdmFye2R0fSAtIFx2YXJ7ZHR9LnV0Y29mZnNldCgpfS4KLSAgVGhlIGRpc2N1c3Npb24gb2YgY2xhc3MgXGNsYXNze3R6aW5mb30gZXhwbGFpbnMgdGhlIGNhc2VzIGF0IERheWxpZ2h0Ci0gIFNhdmluZyBUaW1lIHRyYW5zaXRpb24gYm91bmRhcmllcyB3aGVyZSB0aGlzIGNhbm5vdCBiZSBhY2hpZXZlZCAoYW4gaXNzdWUKLSAgb25seSBpZiBcdmFye3R6fSBtb2RlbHMgYm90aCBzdGFuZGFyZCBhbmQgZGF5bGlnaHQgdGltZSkuCi0KLSAgSWYgeW91IG1lcmVseSB3YW50IHRvIGF0dGFjaCBhIHRpbWUgem9uZSBvYmplY3QgXHZhcnt0en0gdG8gYQotICBkYXRldGltZSBcdmFye2R0fSB3aXRob3V0IGFkanVzdG1lbnQgb2YgZGF0ZSBhbmQgdGltZSBtZW1iZXJzLAotICB1c2UgXGNvZGV7XHZhcntkdH0ucmVwbGFjZSh0emluZm89XHZhcnt0en0pfS4gIElmCi0gIHlvdSBtZXJlbHkgd2FudCB0byByZW1vdmUgdGhlIHRpbWUgem9uZSBvYmplY3QgZnJvbSBhbiBhd2FyZSBkYXRldGltZQotICBcdmFye2R0fSB3aXRob3V0IGNvbnZlcnNpb24gb2YgZGF0ZSBhbmQgdGltZSBtZW1iZXJzLCB1c2UKLSAgXGNvZGV7XHZhcntkdH0ucmVwbGFjZSh0emluZm89Tm9uZSl9LgotCi0gIE5vdGUgdGhhdCB0aGUgZGVmYXVsdCBcbWV0aG9ke3R6aW5mby5mcm9tdXRjKCl9IG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbgotICBpbiBhIFxjbGFzc3t0emluZm99IHN1YmNsYXNzIHRvIGFmZmVjdCB0aGUgcmVzdWx0IHJldHVybmVkIGJ5Ci0gIFxtZXRob2R7YXN0aW1lem9uZSgpfS4gIElnbm9yaW5nIGVycm9yIGNhc2VzLCBcbWV0aG9ke2FzdGltZXpvbmUoKX0KLSAgYWN0cyBsaWtlOgotCi0gIFxiZWdpbnt2ZXJiYXRpbX0KLSAgZGVmIGFzdGltZXpvbmUoc2VsZiwgdHopOgotICAgICAgaWYgc2VsZi50emluZm8gaXMgdHo6Ci0gICAgICAgICAgcmV0dXJuIHNlbGYKLSAgICAgICMgQ29udmVydCBzZWxmIHRvIFVUQywgYW5kIGF0dGFjaCB0aGUgbmV3IHRpbWUgem9uZSBvYmplY3QuCi0gICAgICB1dGMgPSAoc2VsZiAtIHNlbGYudXRjb2Zmc2V0KCkpLnJlcGxhY2UodHppbmZvPXR6KQotICAgICAgIyBDb252ZXJ0IGZyb20gVVRDIHRvIHR6J3MgbG9jYWwgdGltZS4KLSAgICAgIHJldHVybiB0ei5mcm9tdXRjKHV0YykKLSAgXGVuZHt2ZXJiYXRpbX0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3V0Y29mZnNldH17fQotICBJZiBcbWVtYmVye3R6aW5mb30gaXMgXGNvZGV7Tm9uZX0sIHJldHVybnMgXGNvZGV7Tm9uZX0sIGVsc2UKLSAgcmV0dXJucyBcY29kZXtcdmFye3NlbGZ9LnR6aW5mby51dGNvZmZzZXQoXHZhcntzZWxmfSl9LCBhbmQKLSAgcmFpc2VzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgbGF0dGVyIGRvZXNuJ3QgcmV0dXJuIFxjb2Rle05vbmV9LCBvcgotICBhIFxjbGFzc3t0aW1lZGVsdGF9IG9iamVjdCByZXByZXNlbnRpbmcgYSB3aG9sZSBudW1iZXIgb2YgbWludXRlcwotICB3aXRoIG1hZ25pdHVkZSBsZXNzIHRoYW4gb25lIGRheS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2RzdH17fQotICBJZiBcbWVtYmVye3R6aW5mb30gaXMgXGNvZGV7Tm9uZX0sIHJldHVybnMgXGNvZGV7Tm9uZX0sIGVsc2UKLSAgcmV0dXJucyBcY29kZXtcdmFye3NlbGZ9LnR6aW5mby5kc3QoXHZhcntzZWxmfSl9LCBhbmQKLSAgcmFpc2VzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgbGF0dGVyIGRvZXNuJ3QgcmV0dXJuIFxjb2Rle05vbmV9LCBvcgotICBhIFxjbGFzc3t0aW1lZGVsdGF9IG9iamVjdCByZXByZXNlbnRpbmcgYSB3aG9sZSBudW1iZXIgb2YgbWludXRlcwotICB3aXRoIG1hZ25pdHVkZSBsZXNzIHRoYW4gb25lIGRheS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3R6bmFtZX17fQotICBJZiBcbWVtYmVye3R6aW5mb30gaXMgXGNvZGV7Tm9uZX0sIHJldHVybnMgXGNvZGV7Tm9uZX0sIGVsc2UKLSAgcmV0dXJucyBcY29kZXtcdmFye3NlbGZ9LnR6aW5mby50em5hbWUoXHZhcntzZWxmfSl9LAotICByYWlzZXMgYW4gZXhjZXB0aW9uIGlmIHRoZSBsYXR0ZXIgZG9lc24ndCByZXR1cm4gXGNvZGV7Tm9uZX0gb3IKLSAgYSBzdHJpbmcgb2JqZWN0LAotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317dGltZXR1cGxlfXt9Ci0gIFJldHVybiBhIFxjbGFzc3t0aW1lLnN0cnVjdF90aW1lfSBzdWNoIGFzIHJldHVybmVkIGJ5Ci0gIFxmdW5jdGlvbnt0aW1lLmxvY2FsdGltZSgpfS4KLSAgXGNvZGV7XHZhcntkfS50aW1ldHVwbGUoKX0gaXMgZXF1aXZhbGVudCB0bwotICBcY29kZXt0aW1lLnN0cnVjdF90aW1lKChcdmFye2R9LnllYXIsIFx2YXJ7ZH0ubW9udGgsIFx2YXJ7ZH0uZGF5LAotICAgICAgICAgXHZhcntkfS5ob3VyLCBcdmFye2R9Lm1pbnV0ZSwgXHZhcntkfS5zZWNvbmQsCi0gICAgICAgICBcdmFye2R9LndlZWtkYXkoKSwKLSAgICAgICAgIFx2YXJ7ZH0udG9vcmRpbmFsKCkgLSBkYXRlKFx2YXJ7ZH0ueWVhciwgMSwgMSkudG9vcmRpbmFsKCkgKyAxLAotICAgICAgICAgZHN0KSl9Ci0gIFRoZSBcbWVtYmVye3RtX2lzZHN0fSBmbGFnIG9mIHRoZSByZXN1bHQgaXMgc2V0IGFjY29yZGluZyB0bwotICB0aGUgXG1ldGhvZHtkc3QoKX0gbWV0aG9kOiAgXG1lbWJlcnt0emluZm99IGlzIFxjb2Rle05vbmV9IG9yCi0gIFxtZXRob2R7ZHN0KCl9IHJldHVybnMgXGNvZGV7Tm9uZX0sCi0gIFxtZW1iZXJ7dG1faXNkc3R9IGlzIHNldCB0byAgXGNvZGV7LTF9OyBlbHNlIGlmIFxtZXRob2R7ZHN0KCl9IHJldHVybnMKLSAgYSBub24temVybyB2YWx1ZSwgXG1lbWJlcnt0bV9pc2RzdH0gaXMgc2V0IHRvIFxjb2RlezF9OwotICBlbHNlIFxjb2Rle3RtX2lzZHN0fSBpcyBzZXQgdG8gXGNvZGV7MH0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXt1dGN0aW1ldHVwbGV9e30KLSAgSWYgXGNsYXNze2RhdGV0aW1lfSBpbnN0YW5jZSBcdmFye2R9IGlzIG5haXZlLCB0aGlzIGlzIHRoZSBzYW1lIGFzCi0gIFxjb2Rle1x2YXJ7ZH0udGltZXR1cGxlKCl9IGV4Y2VwdCB0aGF0IFxtZW1iZXJ7dG1faXNkc3R9IGlzIGZvcmNlZCB0byAwCi0gIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBcY29kZXtkLmRzdCgpfSByZXR1cm5zLiAgRFNUIGlzIG5ldmVyIGluIGVmZmVjdAotICBmb3IgYSBVVEMgdGltZS4KLQotICBJZiBcdmFye2R9IGlzIGF3YXJlLCBcdmFye2R9IGlzIG5vcm1hbGl6ZWQgdG8gVVRDIHRpbWUsIGJ5IHN1YnRyYWN0aW5nCi0gIFxjb2Rle1x2YXJ7ZH0udXRjb2Zmc2V0KCl9LCBhbmQgYSBcY2xhc3N7dGltZS5zdHJ1Y3RfdGltZX0gZm9yIHRoZQotICBub3JtYWxpemVkIHRpbWUgaXMgcmV0dXJuZWQuICBcbWVtYmVye3RtX2lzZHN0fSBpcyBmb3JjZWQgdG8gMC4KLSAgTm90ZSB0aGF0IHRoZSByZXN1bHQncyBcbWVtYmVye3RtX3llYXJ9IG1lbWJlciBtYXkgYmUKLSAgXGNvbnN0YW50e01JTllFQVJ9LTEgb3IgXGNvbnN0YW50e01BWFlFQVJ9KzEsIGlmIFx2YXJ7ZH0ueWVhciB3YXMKLSAgXGNvZGV7TUlOWUVBUn0gb3IgXGNvZGV7TUFYWUVBUn0gYW5kIFVUQyBhZGp1c3RtZW50IHNwaWxscyBvdmVyIGEKLSAgeWVhciBib3VuZGFyeS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3Rvb3JkaW5hbH17fQotICBSZXR1cm4gdGhlIHByb2xlcHRpYyBHcmVnb3JpYW4gb3JkaW5hbCBvZiB0aGUgZGF0ZS4gIFRoZSBzYW1lIGFzCi0gIFxjb2Rle3NlbGYuZGF0ZSgpLnRvb3JkaW5hbCgpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3dlZWtkYXl9e30KLSAgUmV0dXJuIHRoZSBkYXkgb2YgdGhlIHdlZWsgYXMgYW4gaW50ZWdlciwgd2hlcmUgTW9uZGF5IGlzIDAgYW5kCi0gIFN1bmRheSBpcyA2LiAgVGhlIHNhbWUgYXMgXGNvZGV7c2VsZi5kYXRlKCkud2Vla2RheSgpfS4KLSAgU2VlIGFsc28gXG1ldGhvZHtpc293ZWVrZGF5KCl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317aXNvd2Vla2RheX17fQotICBSZXR1cm4gdGhlIGRheSBvZiB0aGUgd2VlayBhcyBhbiBpbnRlZ2VyLCB3aGVyZSBNb25kYXkgaXMgMSBhbmQKLSAgU3VuZGF5IGlzIDcuICBUaGUgc2FtZSBhcyBcY29kZXtzZWxmLmRhdGUoKS5pc293ZWVrZGF5KCl9LgotICBTZWUgYWxzbyBcbWV0aG9ke3dlZWtkYXkoKX0sIFxtZXRob2R7aXNvY2FsZW5kYXIoKX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtpc29jYWxlbmRhcn17fQotICBSZXR1cm4gYSAzLXR1cGxlLCAoSVNPIHllYXIsIElTTyB3ZWVrIG51bWJlciwgSVNPIHdlZWtkYXkpLiAgVGhlCi0gIHNhbWUgYXMgXGNvZGV7c2VsZi5kYXRlKCkuaXNvY2FsZW5kYXIoKX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtpc29mb3JtYXR9e1xvcHRpb25hbHtzZXB9fQotICBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkYXRlIGFuZCB0aW1lIGluIElTTyA4NjAxIGZvcm1hdCwKLSAgICAgIFlZWVktTU0tRERUSEg6TU06U1MubW1tbW1tCi0gIG9yLCBpZiBcbWVtYmVye21pY3Jvc2Vjb25kfSBpcyAwLAotICAgICAgWVlZWS1NTS1ERFRISDpNTTpTUwotCi0gIElmIFxtZXRob2R7dXRjb2Zmc2V0KCl9IGRvZXMgbm90IHJldHVybiBcY29kZXtOb25lfSwgYSA2LWNoYXJhY3RlcgotICBzdHJpbmcgaXMgYXBwZW5kZWQsIGdpdmluZyB0aGUgVVRDIG9mZnNldCBpbiAoc2lnbmVkKSBob3VycyBhbmQKLSAgbWludXRlczoKLSAgICAgIFlZWVktTU0tRERUSEg6TU06U1MubW1tbW1tK0hIOk1NCi0gIG9yLCBpZiBcbWVtYmVye21pY3Jvc2Vjb25kfSBpcyAwCi0gICAgICBZWVlZLU1NLUREVEhIOk1NOlNTK0hIOk1NCi0KLSAgVGhlIG9wdGlvbmFsIGFyZ3VtZW50IFx2YXJ7c2VwfSAoZGVmYXVsdCBcY29kZXsnVCd9KSBpcyBhCi0gIG9uZS1jaGFyYWN0ZXIgc2VwYXJhdG9yLCBwbGFjZWQgYmV0d2VlbiB0aGUgZGF0ZSBhbmQgdGltZSBwb3J0aW9ucwotICBvZiB0aGUgcmVzdWx0LiAgRm9yIGV4YW1wbGUsCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBmcm9tIGRhdGV0aW1lIGltcG9ydCB0emluZm8sIHRpbWVkZWx0YSwgZGF0ZXRpbWUKLT4+PiBjbGFzcyBUWih0emluZm8pOgotLi4uICAgICBkZWYgdXRjb2Zmc2V0KHNlbGYsIGR0KTogcmV0dXJuIHRpbWVkZWx0YShtaW51dGVzPS0zOTkpCi0uLi4KLT4+PiBkYXRldGltZSgyMDAyLCAxMiwgMjUsIHR6aW5mbz1UWigpKS5pc29mb3JtYXQoJyAnKQotJzIwMDItMTItMjUgMDA6MDA6MDAtMDY6MzknCi1cZW5ke3ZlcmJhdGltfQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317X19zdHJfX317fQotICBGb3IgYSBcY2xhc3N7ZGF0ZXRpbWV9IGluc3RhbmNlIFx2YXJ7ZH0sIFxjb2Rle3N0cihcdmFye2R9KX0gaXMKLSAgZXF1aXZhbGVudCB0byBcY29kZXtcdmFye2R9Lmlzb2Zvcm1hdCgnICcpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2N0aW1lfXt9Ci0gIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGRhdGUgYW5kIHRpbWUsIGZvciBleGFtcGxlCi0gIFxjb2Rle2RhdGV0aW1lKDIwMDIsIDEyLCA0LCAyMCwgMzAsIDQwKS5jdGltZSgpID09Ci0gICAnV2VkIERlYyAgNCAyMDozMDo0MCAyMDAyJ30uCi0gIFxjb2Rle2QuY3RpbWUoKX0gaXMgZXF1aXZhbGVudCB0bwotICBcY29kZXt0aW1lLmN0aW1lKHRpbWUubWt0aW1lKGQudGltZXR1cGxlKCkpKX0gb24gcGxhdGZvcm1zIHdoZXJlCi0gIHRoZSBuYXRpdmUgQyBcY2Z1bmN0aW9ue2N0aW1lKCl9IGZ1bmN0aW9uICh3aGljaAotICBcZnVuY3Rpb257dGltZS5jdGltZSgpfSBpbnZva2VzLCBidXQgd2hpY2gKLSAgXG1ldGhvZHtkYXRldGltZS5jdGltZSgpfSBkb2VzIG5vdCBpbnZva2UpIGNvbmZvcm1zIHRvIHRoZSBDCi0gIHN0YW5kYXJkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317c3RyZnRpbWV9e2Zvcm1hdH0KLSAgUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZGF0ZSBhbmQgdGltZSwgY29udHJvbGxlZCBieSBhbgotICBleHBsaWNpdCBmb3JtYXQgc3RyaW5nLiAgU2VlIHNlY3Rpb25+XHJlZntzdHJmdGltZS1iZWhhdmlvcn0gLS0KLSAgXG1ldGhvZHtzdHJmdGltZSgpfSBiZWhhdmlvci4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cc3Vic2VjdGlvbntcY2xhc3N7dGltZX0gT2JqZWN0cyBcbGFiZWx7ZGF0ZXRpbWUtdGltZX19Ci0KLUEgdGltZSBvYmplY3QgcmVwcmVzZW50cyBhIChsb2NhbCkgdGltZSBvZiBkYXksIGluZGVwZW5kZW50IG9mIGFueQotcGFydGljdWxhciBkYXksIGFuZCBzdWJqZWN0IHRvIGFkanVzdG1lbnQgdmlhIGEgXGNsYXNze3R6aW5mb30gb2JqZWN0LgotCi1cYmVnaW57Y2xhc3NkZXNjfXt0aW1lfXtob3VyXG9wdGlvbmFseywgbWludXRlXG9wdGlvbmFseywgc2Vjb25kXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pY3Jvc2Vjb25kXG9wdGlvbmFseywgdHppbmZvfX19fX0KLSAgQWxsIGFyZ3VtZW50cyBhcmUgb3B0aW9uYWwuICBcdmFye3R6aW5mb30gbWF5IGJlIFxjb2Rle05vbmV9LCBvcgotICBhbiBpbnN0YW5jZSBvZiBhIFxjbGFzc3t0emluZm99IHN1YmNsYXNzLiAgVGhlIHJlbWFpbmluZyBhcmd1bWVudHMKLSAgbWF5IGJlIGludHMgb3IgbG9uZ3MsIGluIHRoZSBmb2xsb3dpbmcgcmFuZ2VzOgotCi0gIFxiZWdpbntpdGVtaXplfQotICAgIFxpdGVtIFxjb2RlezAgPD0gXHZhcntob3VyfSA8IDI0fQotICAgIFxpdGVtIFxjb2RlezAgPD0gXHZhcnttaW51dGV9IDwgNjB9Ci0gICAgXGl0ZW0gXGNvZGV7MCA8PSBcdmFye3NlY29uZH0gPCA2MH0KLSAgICBcaXRlbSBcY29kZXswIDw9IFx2YXJ7bWljcm9zZWNvbmR9IDwgMTAwMDAwMH0uCi0gIFxlbmR7aXRlbWl6ZX0KLQotICBJZiBhbiBhcmd1bWVudCBvdXRzaWRlIHRob3NlIHJhbmdlcyBpcyBnaXZlbiwKLSAgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSBpcyByYWlzZWQuICBBbGwgZGVmYXVsdCB0byBcY29kZXswfSBleGNlcHQKLSAgXHZhcnt0emluZm99LCB3aGljaCBkZWZhdWx0cyB0byBcY29uc3RhbnR7Tm9uZX0uCi1cZW5ke2NsYXNzZGVzY30KLQotQ2xhc3MgYXR0cmlidXRlczoKLQotXGJlZ2lue21lbWJlcmRlc2N9e21pbn0KLSAgVGhlIGVhcmxpZXN0IHJlcHJlc2VudGFibGUgXGNsYXNze3RpbWV9LCBcY29kZXt0aW1lKDAsIDAsIDAsIDApfS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9e21heH0KLSAgVGhlIGxhdGVzdCByZXByZXNlbnRhYmxlIFxjbGFzc3t0aW1lfSwgXGNvZGV7dGltZSgyMywgNTksIDU5LCA5OTk5OTkpfS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9e3Jlc29sdXRpb259Ci0gIFRoZSBzbWFsbGVzdCBwb3NzaWJsZSBkaWZmZXJlbmNlIGJldHdlZW4gbm9uLWVxdWFsIFxjbGFzc3t0aW1lfQotICBvYmplY3RzLCBcY29kZXt0aW1lZGVsdGEobWljcm9zZWNvbmRzPTEpfSwgYWx0aG91Z2ggbm90ZSB0aGF0Ci0gIGFyaXRobWV0aWMgb24gXGNsYXNze3RpbWV9IG9iamVjdHMgaXMgbm90IHN1cHBvcnRlZC4KLVxlbmR7bWVtYmVyZGVzY30KLQotSW5zdGFuY2UgYXR0cmlidXRlcyAocmVhZC1vbmx5KToKLQotXGJlZ2lue21lbWJlcmRlc2N9e2hvdXJ9Ci0gIEluIFxjb2Rle3JhbmdlKDI0KX0uCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXttaW51dGV9Ci0gIEluIFxjb2Rle3JhbmdlKDYwKX0uCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXtzZWNvbmR9Ci0gIEluIFxjb2Rle3JhbmdlKDYwKX0uCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXttaWNyb3NlY29uZH0KLSAgSW4gXGNvZGV7cmFuZ2UoMTAwMDAwMCl9LgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY317dHppbmZvfQotICBUaGUgb2JqZWN0IHBhc3NlZCBhcyB0aGUgdHppbmZvIGFyZ3VtZW50IHRvIHRoZSBcY2xhc3N7dGltZX0KLSAgY29uc3RydWN0b3IsIG9yIFxjb2Rle05vbmV9IGlmIG5vbmUgd2FzIHBhc3NlZC4KLVxlbmR7bWVtYmVyZGVzY30KLQotU3VwcG9ydGVkIG9wZXJhdGlvbnM6Ci0KLVxiZWdpbntpdGVtaXplfQotICBcaXRlbQotICAgIGNvbXBhcmlzb24gb2YgXGNsYXNze3RpbWV9IHRvIFxjbGFzc3t0aW1lfSwKLSAgICB3aGVyZSBcdmFye2F9IGlzIGNvbnNpZGVyZWQgbGVzcyB0aGFuIFx2YXJ7Yn0gd2hlbiBcdmFye2F9IHByZWNlZGVzCi0gICAgXHZhcntifSBpbiB0aW1lLiAgSWYgb25lIGNvbXBhcmFuZCBpcyBuYWl2ZSBhbmQgdGhlIG90aGVyIGlzIGF3YXJlLAotICAgIFxleGNlcHRpb257VHlwZUVycm9yfSBpcyByYWlzZWQuICBJZiBib3RoIGNvbXBhcmFuZHMgYXJlIGF3YXJlLCBhbmQKLSAgICBoYXZlIHRoZSBzYW1lIFxtZW1iZXJ7dHppbmZvfSBtZW1iZXIsIHRoZSBjb21tb24gXG1lbWJlcnt0emluZm99Ci0gICAgbWVtYmVyIGlzIGlnbm9yZWQgYW5kIHRoZSBiYXNlIHRpbWVzIGFyZSBjb21wYXJlZC4gIElmIGJvdGgKLSAgICBjb21wYXJhbmRzIGFyZSBhd2FyZSBhbmQgaGF2ZSBkaWZmZXJlbnQgXG1lbWJlcnt0emluZm99IG1lbWJlcnMsCi0gICAgdGhlIGNvbXBhcmFuZHMgYXJlIGZpcnN0IGFkanVzdGVkIGJ5IHN1YnRyYWN0aW5nIHRoZWlyIFVUQyBvZmZzZXRzCi0gICAgKG9idGFpbmVkIGZyb20gXGNvZGV7c2VsZi51dGNvZmZzZXQoKX0pLgotICAgIEluIG9yZGVyIHRvIHN0b3AgbWl4ZWQtdHlwZSBjb21wYXJpc29ucyBmcm9tIGZhbGxpbmcgYmFjayB0byB0aGUKLSAgICBkZWZhdWx0IGNvbXBhcmlzb24gYnkgb2JqZWN0IGFkZHJlc3MsIHdoZW4gYSBcY2xhc3N7dGltZX0gb2JqZWN0IGlzCi0gICAgY29tcGFyZWQgdG8gYW4gb2JqZWN0IG9mIGEgZGlmZmVyZW50IHR5cGUsIFxleGNlcHRpb257VHlwZUVycm9yfSBpcwotICAgIHJhaXNlZCB1bmxlc3MgdGhlIGNvbXBhcmlzb24gaXMgXGNvZGV7PT19IG9yIFxjb2RleyE9fS4gIFRoZSBsYXR0ZXIKLSAgICBjYXNlcyByZXR1cm4gXGNvbnN0YW50e0ZhbHNlfSBvciBcY29uc3RhbnR7VHJ1ZX0sIHJlc3BlY3RpdmVseS4KLQotICBcaXRlbQotICAgIGhhc2gsIHVzZSBhcyBkaWN0IGtleQotCi0gIFxpdGVtCi0gICAgZWZmaWNpZW50IHBpY2tsaW5nCi0KLSAgXGl0ZW0KLSAgICBpbiBCb29sZWFuIGNvbnRleHRzLCBhIFxjbGFzc3t0aW1lfSBvYmplY3QgaXMgY29uc2lkZXJlZCB0byBiZQotICAgIHRydWUgaWYgYW5kIG9ubHkgaWYsIGFmdGVyIGNvbnZlcnRpbmcgaXQgdG8gbWludXRlcyBhbmQKLSAgICBzdWJ0cmFjdGluZyBcbWV0aG9ke3V0Y29mZnNldCgpfSAob3IgXGNvZGV7MH0gaWYgdGhhdCdzCi0gICAgXGNvZGV7Tm9uZX0pLCB0aGUgcmVzdWx0IGlzIG5vbi16ZXJvLgotXGVuZHtpdGVtaXplfQotCi1JbnN0YW5jZSBtZXRob2RzOgotCi1cYmVnaW57bWV0aG9kZGVzY317cmVwbGFjZX17XG9wdGlvbmFse2hvdXJcb3B0aW9uYWx7LCBtaW51dGVcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZFxvcHRpb25hbHssIG1pY3Jvc2Vjb25kXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0emluZm99fX19fX0KLSAgUmV0dXJuIGEgXGNsYXNze3RpbWV9IHdpdGggdGhlIHNhbWUgdmFsdWUsIGV4Y2VwdCBmb3IgdGhvc2UgbWVtYmVycyBnaXZlbgotICBuZXcgdmFsdWVzIGJ5IHdoaWNoZXZlciBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgc3BlY2lmaWVkLiAgTm90ZSB0aGF0Ci0gIFxjb2Rle3R6aW5mbz1Ob25lfSBjYW4gYmUgc3BlY2lmaWVkIHRvIGNyZWF0ZSBhIG5haXZlIFxjbGFzc3t0aW1lfSBmcm9tCi0gIGFuIGF3YXJlIFxjbGFzc3t0aW1lfSwgd2l0aG91dCBjb252ZXJzaW9uIG9mIHRoZSB0aW1lIG1lbWJlcnMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtpc29mb3JtYXR9e30KLSAgUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdGltZSBpbiBJU08gODYwMSBmb3JtYXQsCi0gICAgICBISDpNTTpTUy5tbW1tbW0KLSAgb3IsIGlmIHNlbGYubWljcm9zZWNvbmQgaXMgMCwKLSAgICAgIEhIOk1NOlNTCi0gIElmIFxtZXRob2R7dXRjb2Zmc2V0KCl9IGRvZXMgbm90IHJldHVybiBcY29kZXtOb25lfSwgYSA2LWNoYXJhY3RlcgotICBzdHJpbmcgaXMgYXBwZW5kZWQsIGdpdmluZyB0aGUgVVRDIG9mZnNldCBpbiAoc2lnbmVkKSBob3VycyBhbmQKLSAgbWludXRlczoKLSAgICAgIEhIOk1NOlNTLm1tbW1tbStISDpNTQotICBvciwgaWYgc2VsZi5taWNyb3NlY29uZCBpcyAwLAotICAgICAgSEg6TU06U1MrSEg6TU0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e19fc3RyX199e30KLSAgRm9yIGEgdGltZSBcdmFye3R9LCBcY29kZXtzdHIoXHZhcnt0fSl9IGlzIGVxdWl2YWxlbnQgdG8KLSAgXGNvZGV7XHZhcnt0fS5pc29mb3JtYXQoKX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtzdHJmdGltZX17Zm9ybWF0fQotICBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB0aW1lLCBjb250cm9sbGVkIGJ5IGFuIGV4cGxpY2l0Ci0gIGZvcm1hdCBzdHJpbmcuICBTZWUgc2VjdGlvbn5ccmVme3N0cmZ0aW1lLWJlaGF2aW9yfSAtLQotICBcbWV0aG9ke3N0cmZ0aW1lKCl9IGJlaGF2aW9yLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317dXRjb2Zmc2V0fXt9Ci0gIElmIFxtZW1iZXJ7dHppbmZvfSBpcyBcY29kZXtOb25lfSwgcmV0dXJucyBcY29kZXtOb25lfSwgZWxzZQotICByZXR1cm5zIFxjb2Rle1x2YXJ7c2VsZn0udHppbmZvLnV0Y29mZnNldChOb25lKX0sIGFuZAotICByYWlzZXMgYW4gZXhjZXB0aW9uIGlmIHRoZSBsYXR0ZXIgZG9lc24ndCByZXR1cm4gXGNvZGV7Tm9uZX0gb3IKLSAgYSBcY2xhc3N7dGltZWRlbHRhfSBvYmplY3QgcmVwcmVzZW50aW5nIGEgd2hvbGUgbnVtYmVyIG9mIG1pbnV0ZXMKLSAgd2l0aCBtYWduaXR1ZGUgbGVzcyB0aGFuIG9uZSBkYXkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtkc3R9e30KLSAgSWYgXG1lbWJlcnt0emluZm99IGlzIFxjb2Rle05vbmV9LCByZXR1cm5zIFxjb2Rle05vbmV9LCBlbHNlCi0gIHJldHVybnMgXGNvZGV7XHZhcntzZWxmfS50emluZm8uZHN0KE5vbmUpfSwgYW5kCi0gIHJhaXNlcyBhbiBleGNlcHRpb24gaWYgdGhlIGxhdHRlciBkb2Vzbid0IHJldHVybiBcY29kZXtOb25lfSwgb3IKLSAgYSBcY2xhc3N7dGltZWRlbHRhfSBvYmplY3QgcmVwcmVzZW50aW5nIGEgd2hvbGUgbnVtYmVyIG9mIG1pbnV0ZXMKLSAgd2l0aCBtYWduaXR1ZGUgbGVzcyB0aGFuIG9uZSBkYXkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXt0em5hbWV9e30KLSAgSWYgXG1lbWJlcnt0emluZm99IGlzIFxjb2Rle05vbmV9LCByZXR1cm5zIFxjb2Rle05vbmV9LCBlbHNlCi0gIHJldHVybnMgXGNvZGV7XHZhcntzZWxmfS50emluZm8udHpuYW1lKE5vbmUpfSwgb3IKLSAgcmFpc2VzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgbGF0dGVyIGRvZXNuJ3QgcmV0dXJuIFxjb2Rle05vbmV9IG9yCi0gIGEgc3RyaW5nIG9iamVjdC4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cc3Vic2VjdGlvbntcY2xhc3N7dHppbmZvfSBPYmplY3RzIFxsYWJlbHtkYXRldGltZS10emluZm99fQotCi1cY2xhc3N7dHppbmZvfSBpcyBhbiBhYnN0cmFjdCBiYXNlIGNsYXNlLCBtZWFuaW5nIHRoYXQgdGhpcyBjbGFzcwotc2hvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHkuICBZb3UgbmVlZCB0byBkZXJpdmUgYSBjb25jcmV0ZQotc3ViY2xhc3MsIGFuZCAoYXQgbGVhc3QpIHN1cHBseSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIHN0YW5kYXJkCi1cY2xhc3N7dHppbmZvfSBtZXRob2RzIG5lZWRlZCBieSB0aGUgXGNsYXNze2RhdGV0aW1lfSBtZXRob2RzIHlvdQotdXNlLiAgVGhlIFxtb2R1bGV7ZGF0ZXRpbWV9IG1vZHVsZSBkb2VzIG5vdCBzdXBwbHkgYW55IGNvbmNyZXRlCi1zdWJjbGFzc2VzIG9mIFxjbGFzc3t0emluZm99LgotCi1BbiBpbnN0YW5jZSBvZiAoYSBjb25jcmV0ZSBzdWJjbGFzcyBvZikgXGNsYXNze3R6aW5mb30gY2FuIGJlIHBhc3NlZAotdG8gdGhlIGNvbnN0cnVjdG9ycyBmb3IgXGNsYXNze2RhdGV0aW1lfSBhbmQgXGNsYXNze3RpbWV9IG9iamVjdHMuCi1UaGUgbGF0dGVyIG9iamVjdHMgdmlldyB0aGVpciBtZW1iZXJzIGFzIGJlaW5nIGluIGxvY2FsIHRpbWUsIGFuZCB0aGUKLVxjbGFzc3t0emluZm99IG9iamVjdCBzdXBwb3J0cyBtZXRob2RzIHJldmVhbGluZyBvZmZzZXQgb2YgbG9jYWwgdGltZQotZnJvbSBVVEMsIHRoZSBuYW1lIG9mIHRoZSB0aW1lIHpvbmUsIGFuZCBEU1Qgb2Zmc2V0LCBhbGwgcmVsYXRpdmUgdG8gYQotZGF0ZSBvciB0aW1lIG9iamVjdCBwYXNzZWQgdG8gdGhlbS4KLQotU3BlY2lhbCByZXF1aXJlbWVudCBmb3IgcGlja2xpbmc6ICBBIFxjbGFzc3t0emluZm99IHN1YmNsYXNzIG11c3QgaGF2ZSBhbgotXG1ldGhvZHtfX2luaXRfX30gbWV0aG9kIHRoYXQgY2FuIGJlIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50cywgZWxzZSBpdAotY2FuIGJlIHBpY2tsZWQgYnV0IHBvc3NpYmx5IG5vdCB1bnBpY2tsZWQgYWdhaW4uICBUaGlzIGlzIGEgdGVjaG5pY2FsCi1yZXF1aXJlbWVudCB0aGF0IG1heSBiZSByZWxheGVkIGluIHRoZSBmdXR1cmUuCi0KLUEgY29uY3JldGUgc3ViY2xhc3Mgb2YgXGNsYXNze3R6aW5mb30gbWF5IG5lZWQgdG8gaW1wbGVtZW50IHRoZQotZm9sbG93aW5nIG1ldGhvZHMuICBFeGFjdGx5IHdoaWNoIG1ldGhvZHMgYXJlIG5lZWRlZCBkZXBlbmRzIG9uIHRoZQotdXNlcyBtYWRlIG9mIGF3YXJlIFxtb2R1bGV7ZGF0ZXRpbWV9IG9iamVjdHMuICBJZiBpbiBkb3VidCwgc2ltcGx5Ci1pbXBsZW1lbnQgYWxsIG9mIHRoZW0uCi0KLVxiZWdpbnttZXRob2RkZXNjfVt0emluZm9de3V0Y29mZnNldH17c2VsZiwgZHR9Ci0gIFJldHVybiBvZmZzZXQgb2YgbG9jYWwgdGltZSBmcm9tIFVUQywgaW4gbWludXRlcyBlYXN0IG9mIFVUQy4gIElmCi0gIGxvY2FsIHRpbWUgaXMgd2VzdCBvZiBVVEMsIHRoaXMgc2hvdWxkIGJlIG5lZ2F0aXZlLiAgTm90ZSB0aGF0IHRoaXMKLSAgaXMgaW50ZW5kZWQgdG8gYmUgdGhlIHRvdGFsIG9mZnNldCBmcm9tIFVUQzsgZm9yIGV4YW1wbGUsIGlmIGEKLSAgXGNsYXNze3R6aW5mb30gb2JqZWN0IHJlcHJlc2VudHMgYm90aCB0aW1lIHpvbmUgYW5kIERTVCBhZGp1c3RtZW50cywKLSAgXG1ldGhvZHt1dGNvZmZzZXQoKX0gc2hvdWxkIHJldHVybiB0aGVpciBzdW0uICBJZiB0aGUgVVRDIG9mZnNldAotICBpc24ndCBrbm93biwgcmV0dXJuIFxjb2Rle05vbmV9LiAgRWxzZSB0aGUgdmFsdWUgcmV0dXJuZWQgbXVzdCBiZQotICBhIFxjbGFzc3t0aW1lZGVsdGF9IG9iamVjdCBzcGVjaWZ5aW5nIGEgd2hvbGUgbnVtYmVyIG9mIG1pbnV0ZXMgaW4gdGhlCi0gIHJhbmdlIC0xNDM5IHRvIDE0MzkgaW5jbHVzaXZlICgxNDQwID0gMjQqNjA7IHRoZSBtYWduaXR1ZGUgb2YgdGhlIG9mZnNldAotICBtdXN0IGJlIGxlc3MgdGhhbiBvbmUgZGF5KS4gIE1vc3QgaW1wbGVtZW50YXRpb25zIG9mCi0gIFxtZXRob2R7dXRjb2Zmc2V0KCl9IHdpbGwgcHJvYmFibHkgbG9vayBsaWtlIG9uZSBvZiB0aGVzZSB0d286Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICByZXR1cm4gQ09OU1RBTlQgICAgICAgICAgICAgICAgICMgZml4ZWQtb2Zmc2V0IGNsYXNzCi0gICAgcmV0dXJuIENPTlNUQU5UICsgc2VsZi5kc3QoZHQpICAjIGRheWxpZ2h0LWF3YXJlIGNsYXNzCi1cZW5ke3ZlcmJhdGltfQotCi0gICAgSWYgXG1ldGhvZHt1dGNvZmZzZXQoKX0gZG9lcyBub3QgcmV0dXJuIFxjb2Rle05vbmV9LAotICAgIFxtZXRob2R7ZHN0KCl9IHNob3VsZCBub3QgcmV0dXJuIFxjb2Rle05vbmV9IGVpdGhlci4KLQotICAgIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIFxtZXRob2R7dXRjb2Zmc2V0KCl9IHJhaXNlcwotICAgIFxleGNlcHRpb257Tm90SW1wbGVtZW50ZWRFcnJvcn0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt0emluZm9de2RzdH17c2VsZiwgZHR9Ci0gIFJldHVybiB0aGUgZGF5bGlnaHQgc2F2aW5nIHRpbWUgKERTVCkgYWRqdXN0bWVudCwgaW4gbWludXRlcyBlYXN0IG9mCi0gIFVUQywgb3IgXGNvZGV7Tm9uZX0gaWYgRFNUIGluZm9ybWF0aW9uIGlzbid0IGtub3duLiAgUmV0dXJuCi0gIFxjb2Rle3RpbWVkZWx0YSgwKX0gaWYgRFNUIGlzIG5vdCBpbiBlZmZlY3QuCi0gIElmIERTVCBpcyBpbiBlZmZlY3QsIHJldHVybiB0aGUgb2Zmc2V0IGFzIGEKLSAgXGNsYXNze3RpbWVkZWx0YX0gb2JqZWN0IChzZWUgXG1ldGhvZHt1dGNvZmZzZXQoKX0gZm9yIGRldGFpbHMpLgotICBOb3RlIHRoYXQgRFNUIG9mZnNldCwgaWYgYXBwbGljYWJsZSwgaGFzCi0gIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgVVRDIG9mZnNldCByZXR1cm5lZCBieQotICBcbWV0aG9ke3V0Y29mZnNldCgpfSwgc28gdGhlcmUncyBubyBuZWVkIHRvIGNvbnN1bHQgXG1ldGhvZHtkc3QoKX0KLSAgdW5sZXNzIHlvdSdyZSBpbnRlcmVzdGVkIGluIG9idGFpbmluZyBEU1QgaW5mbyBzZXBhcmF0ZWx5LiAgRm9yCi0gIGV4YW1wbGUsIFxtZXRob2R7ZGF0ZXRpbWUudGltZXR1cGxlKCl9IGNhbGxzIGl0cyBcbWVtYmVye3R6aW5mb30KLSAgbWVtYmVyJ3MgXG1ldGhvZHtkc3QoKX0gbWV0aG9kIHRvIGRldGVybWluZSBob3cgdGhlCi0gIFxtZW1iZXJ7dG1faXNkc3R9IGZsYWcgc2hvdWxkIGJlIHNldCwgYW5kCi0gIFxtZXRob2R7dHppbmZvLmZyb211dGMoKX0gY2FsbHMgXG1ldGhvZHtkc3QoKX0gdG8gYWNjb3VudCBmb3IKLSAgRFNUIGNoYW5nZXMgd2hlbiBjcm9zc2luZyB0aW1lIHpvbmVzLgotCi0gIEFuIGluc3RhbmNlIFx2YXJ7dHp9IG9mIGEgXGNsYXNze3R6aW5mb30gc3ViY2xhc3MgdGhhdCBtb2RlbHMgYm90aAotICBzdGFuZGFyZCBhbmQgZGF5bGlnaHQgdGltZXMgbXVzdCBiZSBjb25zaXN0ZW50IGluIHRoaXMgc2Vuc2U6Ci0KLSAgICAgIFxjb2Rle1x2YXJ7dHp9LnV0Y29mZnNldChcdmFye2R0fSkgLSBcdmFye3R6fS5kc3QoXHZhcntkdH0pfQotCi0gIG11c3QgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IgZXZlcnkgXGNsYXNze2RhdGV0aW1lfSBcdmFye2R0fQotICB3aXRoIFxjb2Rle1x2YXJ7ZHR9LnR6aW5mbyA9PSBcdmFye3R6fX0gIEZvciBzYW5lIFxjbGFzc3t0emluZm99Ci0gIHN1YmNsYXNzZXMsIHRoaXMgZXhwcmVzc2lvbiB5aWVsZHMgdGhlIHRpbWUgem9uZSdzICJzdGFuZGFyZCBvZmZzZXQiLAotICB3aGljaCBzaG91bGQgbm90IGRlcGVuZCBvbiB0aGUgZGF0ZSBvciB0aGUgdGltZSwgYnV0IG9ubHkgb24gZ2VvZ3JhcGhpYwotICBsb2NhdGlvbi4gIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBcbWV0aG9ke2RhdGV0aW1lLmFzdGltZXpvbmUoKX0gcmVsaWVzCi0gIG9uIHRoaXMsIGJ1dCBjYW5ub3QgZGV0ZWN0IHZpb2xhdGlvbnM7IGl0J3MgdGhlIHByb2dyYW1tZXIncwotICByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgaXQuICBJZiBhIFxjbGFzc3t0emluZm99IHN1YmNsYXNzIGNhbm5vdAotICBndWFyYW50ZWUgdGhpcywgaXQgbWF5IGJlIGFibGUgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLSAgb2YgXG1ldGhvZHt0emluZm8uZnJvbXV0YygpfSB0byB3b3JrIGNvcnJlY3RseSB3aXRoIFxtZXRob2R7YXN0aW1lem9uZSgpfQotICByZWdhcmRsZXNzLgotCi0gIE1vc3QgaW1wbGVtZW50YXRpb25zIG9mIFxtZXRob2R7ZHN0KCl9IHdpbGwgcHJvYmFibHkgbG9vayBsaWtlIG9uZQotICBvZiB0aGVzZSB0d286Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICBkZWYgZHN0KHNlbGYpOgotICAgICAgICAjIGEgZml4ZWQtb2Zmc2V0IGNsYXNzOiAgZG9lc24ndCBhY2NvdW50IGZvciBEU1QKLSAgICAgICAgcmV0dXJuIHRpbWVkZWx0YSgwKQotXGVuZHt2ZXJiYXRpbX0KLQotICBvcgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgZGVmIGRzdChzZWxmKToKLSAgICAgICAgIyBDb2RlIHRvIHNldCBkc3RvbiBhbmQgZHN0b2ZmIHRvIHRoZSB0aW1lIHpvbmUncyBEU1QKLSAgICAgICAgIyB0cmFuc2l0aW9uIHRpbWVzIGJhc2VkIG9uIHRoZSBpbnB1dCBkdC55ZWFyLCBhbmQgZXhwcmVzc2VkCi0gICAgICAgICMgaW4gc3RhbmRhcmQgbG9jYWwgdGltZS4gIFRoZW4KLQotICAgICAgICBpZiBkc3RvbiA8PSBkdC5yZXBsYWNlKHR6aW5mbz1Ob25lKSA8IGRzdG9mZjoKLSAgICAgICAgICAgIHJldHVybiB0aW1lZGVsdGEoaG91cnM9MSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiB0aW1lZGVsdGEoMCkKLVxlbmR7dmVyYmF0aW19Ci0KLSAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgXG1ldGhvZHtkc3QoKX0gcmFpc2VzCi0gIFxleGNlcHRpb257Tm90SW1wbGVtZW50ZWRFcnJvcn0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt0emluZm9de3R6bmFtZX17c2VsZiwgZHR9Ci0gIFJldHVybiB0aGUgdGltZSB6b25lIG5hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgXGNsYXNze2RhdGV0aW1lfQotICBvYmplY3QgXHZhcntkdH0sIGFzIGEgc3RyaW5nLgotICBOb3RoaW5nIGFib3V0IHN0cmluZyBuYW1lcyBpcyBkZWZpbmVkIGJ5IHRoZQotICBcbW9kdWxle2RhdGV0aW1lfSBtb2R1bGUsIGFuZCB0aGVyZSdzIG5vIHJlcXVpcmVtZW50IHRoYXQgaXQgbWVhbgotICBhbnl0aGluZyBpbiBwYXJ0aWN1bGFyLiAgRm9yIGV4YW1wbGUsICJHTVQiLCAiVVRDIiwgIi01MDAiLCAiLTU6MDAiLAotICAiRURUIiwgIlVTL0Vhc3Rlcm4iLCAiQW1lcmljYS9OZXcgWW9yayIgYXJlIGFsbCB2YWxpZCByZXBsaWVzLiAgUmV0dXJuCi0gIFxjb2Rle05vbmV9IGlmIGEgc3RyaW5nIG5hbWUgaXNuJ3Qga25vd24uICBOb3RlIHRoYXQgdGhpcyBpcyBhIG1ldGhvZAotICByYXRoZXIgdGhhbiBhIGZpeGVkIHN0cmluZyBwcmltYXJpbHkgYmVjYXVzZSBzb21lIFxjbGFzc3t0emluZm99Ci0gIHN1YmNsYXNzZXMgd2lsbCB3aXNoIHRvIHJldHVybiBkaWZmZXJlbnQgbmFtZXMgZGVwZW5kaW5nIG9uIHRoZSBzcGVjaWZpYwotICB2YWx1ZSBvZiBcdmFye2R0fSBwYXNzZWQsIGVzcGVjaWFsbHkgaWYgdGhlIFxjbGFzc3t0emluZm99IGNsYXNzIGlzCi0gIGFjY291bnRpbmcgZm9yIGRheWxpZ2h0IHRpbWUuCi0KLSAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgXG1ldGhvZHt0em5hbWUoKX0gcmFpc2VzCi0gIFxleGNlcHRpb257Tm90SW1wbGVtZW50ZWRFcnJvcn0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCBieSBhIFxjbGFzc3tkYXRldGltZX0gb3IgXGNsYXNze3RpbWV9IG9iamVjdCwKLWluIHJlc3BvbnNlIHRvIHRoZWlyIG1ldGhvZHMgb2YgdGhlIHNhbWUgbmFtZXMuICBBIFxjbGFzc3tkYXRldGltZX0KLW9iamVjdCBwYXNzZXMgaXRzZWxmIGFzIHRoZSBhcmd1bWVudCwgYW5kIGEgXGNsYXNze3RpbWV9IG9iamVjdCBwYXNzZXMKLVxjb2Rle05vbmV9IGFzIHRoZSBhcmd1bWVudC4gIEEgXGNsYXNze3R6aW5mb30gc3ViY2xhc3MncyBtZXRob2RzIHNob3VsZAotdGhlcmVmb3JlIGJlIHByZXBhcmVkIHRvIGFjY2VwdCBhIFx2YXJ7ZHR9IGFyZ3VtZW50IG9mIFxjb2Rle05vbmV9LCBvciBvZgotY2xhc3MgXGNsYXNze2RhdGV0aW1lfS4KLQotV2hlbiBcY29kZXtOb25lfSBpcyBwYXNzZWQsIGl0J3MgdXAgdG8gdGhlIGNsYXNzIGRlc2lnbmVyIHRvIGRlY2lkZSB0aGUKLWJlc3QgcmVzcG9uc2UuICBGb3IgZXhhbXBsZSwgcmV0dXJuaW5nIFxjb2Rle05vbmV9IGlzIGFwcHJvcHJpYXRlIGlmIHRoZQotY2xhc3Mgd2lzaGVzIHRvIHNheSB0aGF0IHRpbWUgb2JqZWN0cyBkb24ndCBwYXJ0aWNpcGF0ZSBpbiB0aGUKLVxjbGFzc3t0emluZm99IHByb3RvY29scy4gIEl0IG1heSBiZSBtb3JlIHVzZWZ1bCBmb3IgXGNvZGV7dXRjb2Zmc2V0KE5vbmUpfQotdG8gcmV0dXJuIHRoZSBzdGFuZGFyZCBVVEMgb2Zmc2V0LCBhcyB0aGVyZSBpcyBubyBvdGhlciBjb252ZW50aW9uIGZvcgotZGlzY292ZXJpbmcgdGhlIHN0YW5kYXJkIG9mZnNldC4KLQotV2hlbiBhIFxjbGFzc3tkYXRldGltZX0gb2JqZWN0IGlzIHBhc3NlZCBpbiByZXNwb25zZSB0byBhCi1cY2xhc3N7ZGF0ZXRpbWV9IG1ldGhvZCwgXGNvZGV7ZHQudHppbmZvfSBpcyB0aGUgc2FtZSBvYmplY3QgYXMKLVx2YXJ7c2VsZn0uICBcY2xhc3N7dHppbmZvfSBtZXRob2RzIGNhbiByZWx5IG9uIHRoaXMsIHVubGVzcwotdXNlciBjb2RlIGNhbGxzIFxjbGFzc3t0emluZm99IG1ldGhvZHMgZGlyZWN0bHkuICBUaGUgaW50ZW50IGlzIHRoYXQKLXRoZSBcY2xhc3N7dHppbmZvfSBtZXRob2RzIGludGVycHJldCBcdmFye2R0fSBhcyBiZWluZyBpbiBsb2NhbCB0aW1lLAotYW5kIG5vdCBuZWVkIHdvcnJ5IGFib3V0IG9iamVjdHMgaW4gb3RoZXIgdGltZXpvbmVzLgotCi1UaGVyZSBpcyBvbmUgbW9yZSBcY2xhc3N7dHppbmZvfSBtZXRob2QgdGhhdCBhIHN1YmNsYXNzIG1heSB3aXNoIHRvCi1vdmVycmlkZToKLQotXGJlZ2lue21ldGhvZGRlc2N9W3R6aW5mb117ZnJvbXV0Y317c2VsZiwgZHR9Ci0gIFRoaXMgaXMgY2FsbGVkIGZyb20gdGhlIGRlZmF1bHQgXGNsYXNze2RhdGV0aW1lLmFzdGltZXpvbmUoKX0KLSAgaW1wbGVtZW50YXRpb24uICBXaGVuIGNhbGxlZCBmcm9tIHRoYXQsIFxjb2Rle1x2YXJ7ZHR9LnR6aW5mb30gaXMKLSAgXHZhcntzZWxmfSwgYW5kIFx2YXJ7ZHR9J3MgZGF0ZSBhbmQgdGltZSBtZW1iZXJzIGFyZSB0byBiZSB2aWV3ZWQgYXMKLSAgZXhwcmVzc2luZyBhIFVUQyB0aW1lLiAgVGhlIHB1cnBvc2Ugb2YgXG1ldGhvZHtmcm9tdXRjKCl9IGlzIHRvCi0gIGFkanVzdCB0aGUgZGF0ZSBhbmQgdGltZSBtZW1iZXJzLCByZXR1cm5pbmcgYW4gZXF1aXZhbGVudCBkYXRldGltZSBpbgotICBcdmFye3NlbGZ9J3MgbG9jYWwgdGltZS4KLQotICBNb3N0IFxjbGFzc3t0emluZm99IHN1YmNsYXNzZXMgc2hvdWxkIGJlIGFibGUgdG8gaW5oZXJpdCB0aGUgZGVmYXVsdAotICBcbWV0aG9ke2Zyb211dGMoKX0gaW1wbGVtZW50YXRpb24gd2l0aG91dCBwcm9ibGVtcy4gIEl0J3Mgc3Ryb25nIGVub3VnaAotICB0byBoYW5kbGUgZml4ZWQtb2Zmc2V0IHRpbWUgem9uZXMsIGFuZCB0aW1lIHpvbmVzIGFjY291bnRpbmcgZm9yIGJvdGgKLSAgc3RhbmRhcmQgYW5kIGRheWxpZ2h0IHRpbWUsIGFuZCB0aGUgbGF0dGVyIGV2ZW4gaWYgdGhlIERTVCB0cmFuc2l0aW9uCi0gIHRpbWVzIGRpZmZlciBpbiBkaWZmZXJlbnQgeWVhcnMuICBBbiBleGFtcGxlIG9mIGEgdGltZSB6b25lIHRoZSBkZWZhdWx0Ci0gIFxtZXRob2R7ZnJvbXV0YygpfSBpbXBsZW1lbnRhdGlvbiBtYXkgbm90IGhhbmRsZSBjb3JyZWN0bHkgaW4gYWxsIGNhc2VzCi0gIGlzIG9uZSB3aGVyZSB0aGUgc3RhbmRhcmQgb2Zmc2V0IChmcm9tIFVUQykgZGVwZW5kcyBvbiB0aGUgc3BlY2lmaWMgZGF0ZQotICBhbmQgdGltZSBwYXNzZWQsIHdoaWNoIGNhbiBoYXBwZW4gZm9yIHBvbGl0aWNhbCByZWFzb25zLgotICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgb2YgXG1ldGhvZHthc3RpbWV6b25lKCl9IGFuZAotICBcbWV0aG9ke2Zyb211dGMoKX0gbWF5IG5vdCBwcm9kdWNlIHRoZSByZXN1bHQgeW91IHdhbnQgaWYgdGhlIHJlc3VsdCBpcwotICBvbmUgb2YgdGhlIGhvdXJzIHN0cmFkZGxpbmcgdGhlIG1vbWVudCB0aGUgc3RhbmRhcmQgb2Zmc2V0IGNoYW5nZXMuCi0KLSAgU2tpcHBpbmcgY29kZSBmb3IgZXJyb3IgY2FzZXMsIHRoZSBkZWZhdWx0IFxtZXRob2R7ZnJvbXV0YygpfQotICBpbXBsZW1lbnRhdGlvbiBhY3RzIGxpa2U6Ci0KLSAgXGJlZ2lue3ZlcmJhdGltfQotICBkZWYgZnJvbXV0YyhzZWxmLCBkdCk6Ci0gICAgICAjIHJhaXNlIFZhbHVlRXJyb3IgZXJyb3IgaWYgZHQudHppbmZvIGlzIG5vdCBzZWxmCi0gICAgICBkdG9mZiA9IGR0LnV0Y29mZnNldCgpCi0gICAgICBkdGRzdCA9IGR0LmRzdCgpCi0gICAgICAjIHJhaXNlIFZhbHVlRXJyb3IgaWYgZHRvZmYgaXMgTm9uZSBvciBkdGRzdCBpcyBOb25lCi0gICAgICBkZWx0YSA9IGR0b2ZmIC0gZHRkc3QgICMgdGhpcyBpcyBzZWxmJ3Mgc3RhbmRhcmQgb2Zmc2V0Ci0gICAgICBpZiBkZWx0YToKLSAgICAgICAgICBkdCArPSBkZWx0YSAgICMgY29udmVydCB0byBzdGFuZGFyZCBsb2NhbCB0aW1lCi0gICAgICAgICAgZHRkc3QgPSBkdC5kc3QoKQotICAgICAgICAgICMgcmFpc2UgVmFsdWVFcnJvciBpZiBkdGRzdCBpcyBOb25lCi0gICAgICBpZiBkdGRzdDoKLSAgICAgICAgICByZXR1cm4gZHQgKyBkdGRzdAotICAgICAgZWxzZToKLSAgICAgICAgICByZXR1cm4gZHQKLSAgXGVuZHt2ZXJiYXRpbX0KLVxlbmR7bWV0aG9kZGVzY30KLQotRXhhbXBsZSBcY2xhc3N7dHppbmZvfSBjbGFzc2VzOgotCi1cdmVyYmF0aW1pbnB1dHt0emluZm8tZXhhbXBsZXMucHl9Ci0KLU5vdGUgdGhhdCB0aGVyZSBhcmUgdW5hdm9pZGFibGUgc3VidGxldGllcyB0d2ljZSBwZXIgeWVhciBpbiBhCi1cY2xhc3N7dHppbmZvfQotc3ViY2xhc3MgYWNjb3VudGluZyBmb3IgYm90aCBzdGFuZGFyZCBhbmQgZGF5bGlnaHQgdGltZSwgYXQgdGhlIERTVAotdHJhbnNpdGlvbiBwb2ludHMuICBGb3IgY29uY3JldGVuZXNzLCBjb25zaWRlciBVUyBFYXN0ZXJuIChVVEMgLTA1MDApLAotd2hlcmUgRURUIGJlZ2lucyB0aGUgbWludXRlIGFmdGVyIDE6NTkgKEVTVCkgb24gdGhlIGZpcnN0IFN1bmRheSBpbgotQXByaWwsIGFuZCBlbmRzIHRoZSBtaW51dGUgYWZ0ZXIgMTo1OSAoRURUKSBvbiB0aGUgbGFzdCBTdW5kYXkgaW4gT2N0b2JlcjoKLQotXGJlZ2lue3ZlcmJhdGltfQotICAgIFVUQyAgIDM6TU0gIDQ6TU0gIDU6TU0gIDY6TU0gIDc6TU0gIDg6TU0KLSAgICBFU1QgIDIyOk1NIDIzOk1NICAwOk1NICAxOk1NICAyOk1NICAzOk1NCi0gICAgRURUICAyMzpNTSAgMDpNTSAgMTpNTSAgMjpNTSAgMzpNTSAgNDpNTQotCi0gIHN0YXJ0ICAyMjpNTSAyMzpNTSAgMDpNTSAgMTpNTSAgMzpNTSAgNDpNTQotCi0gICAgZW5kICAyMzpNTSAgMDpNTSAgMTpNTSAgMTpNTSAgMjpNTSAgMzpNTQotXGVuZHt2ZXJiYXRpbX0KLQotV2hlbiBEU1Qgc3RhcnRzICh0aGUgInN0YXJ0IiBsaW5lKSwgdGhlIGxvY2FsIHdhbGwgY2xvY2sgbGVhcHMgZnJvbSAxOjU5Ci10byAzOjAwLiAgQSB3YWxsIHRpbWUgb2YgdGhlIGZvcm0gMjpNTSBkb2Vzbid0IHJlYWxseSBtYWtlIHNlbnNlIG9uIHRoYXQKLWRheSwgc28gXGNvZGV7YXN0aW1lem9uZShFYXN0ZXJuKX0gd29uJ3QgZGVsaXZlciBhIHJlc3VsdCB3aXRoCi1cY29kZXtob3VyID09IDJ9IG9uIHRoZQotZGF5IERTVCBiZWdpbnMuICBJbiBvcmRlciBmb3IgXG1ldGhvZHthc3RpbWV6b25lKCl9IHRvIG1ha2UgdGhpcwotZ3VhcmFudGVlLCB0aGUgXG1ldGhvZHtyemluZm8uZHN0KCl9IG1ldGhvZCBtdXN0IGNvbnNpZGVyIHRpbWVzCi1pbiB0aGUgIm1pc3NpbmcgaG91ciIgKDI6TU0gZm9yIEVhc3Rlcm4pIHRvIGJlIGluIGRheWxpZ2h0IHRpbWUuCi0KLVdoZW4gRFNUIGVuZHMgKHRoZSAiZW5kIiBsaW5lKSwgdGhlcmUncyBhIHBvdGVudGlhbGx5IHdvcnNlIHByb2JsZW06Ci10aGVyZSdzIGFuIGhvdXIgdGhhdCBjYW4ndCBiZSBzcGVsbGVkIHVuYW1iaWd1b3VzbHkgaW4gbG9jYWwgd2FsbCB0aW1lOgotdGhlIGxhc3QgaG91ciBvZiBkYXlsaWdodCB0aW1lLiAgSW4gRWFzdGVybiwgdGhhdCdzIHRpbWVzIG9mCi10aGUgZm9ybSA1Ok1NIFVUQyBvbiB0aGUgZGF5IGRheWxpZ2h0IHRpbWUgZW5kcy4gIFRoZSBsb2NhbCB3YWxsIGNsb2NrCi1sZWFwcyBmcm9tIDE6NTkgKGRheWxpZ2h0IHRpbWUpIGJhY2sgdG8gMTowMCAoc3RhbmRhcmQgdGltZSkgYWdhaW4uCi1Mb2NhbCB0aW1lcyBvZiB0aGUgZm9ybSAxOk1NIGFyZSBhbWJpZ3VvdXMuICBcbWV0aG9ke2FzdGltZXpvbmUoKX0gbWltaWNzCi10aGUgbG9jYWwgY2xvY2sncyBiZWhhdmlvciBieSBtYXBwaW5nIHR3byBhZGphY2VudCBVVEMgaG91cnMgaW50byB0aGUKLXNhbWUgbG9jYWwgaG91ciB0aGVuLiAgSW4gdGhlIEVhc3Rlcm4gZXhhbXBsZSwgVVRDIHRpbWVzIG9mIHRoZSBmb3JtCi01Ok1NIGFuZCA2Ok1NIGJvdGggbWFwIHRvIDE6TU0gd2hlbiBjb252ZXJ0ZWQgdG8gRWFzdGVybi4gIEluIG9yZGVyIGZvcgotXG1ldGhvZHthc3RpbWV6b25lKCl9IHRvIG1ha2UgdGhpcyBndWFyYW50ZWUsIHRoZSBcbWV0aG9ke3R6aW5mby5kc3QoKX0KLW1ldGhvZCBtdXN0IGNvbnNpZGVyIHRpbWVzIGluIHRoZSAicmVwZWF0ZWQgaG91ciIgdG8gYmUgaW4KLXN0YW5kYXJkIHRpbWUuICBUaGlzIGlzIGVhc2lseSBhcnJhbmdlZCwgYXMgaW4gdGhlIGV4YW1wbGUsIGJ5IGV4cHJlc3NpbmcKLURTVCBzd2l0Y2ggdGltZXMgaW4gdGhlIHRpbWUgem9uZSdzIHN0YW5kYXJkIGxvY2FsIHRpbWUuCi0KLUFwcGxpY2F0aW9ucyB0aGF0IGNhbid0IGJlYXIgc3VjaCBhbWJpZ3VpdGllcyBzaG91bGQgYXZvaWQgdXNpbmcgaHlicmlkCi1cY2xhc3N7dHppbmZvfSBzdWJjbGFzc2VzOyB0aGVyZSBhcmUgbm8gYW1iaWd1aXRpZXMgd2hlbiB1c2luZyBVVEMsIG9yCi1hbnkgb3RoZXIgZml4ZWQtb2Zmc2V0IFxjbGFzc3t0emluZm99IHN1YmNsYXNzIChzdWNoIGFzIGEgY2xhc3MKLXJlcHJlc2VudGluZyBvbmx5IEVTVCAoZml4ZWQgb2Zmc2V0IC01IGhvdXJzKSwgb3Igb25seSBFRFQgKGZpeGVkIG9mZnNldAotLTQgaG91cnMpKS4KLQotCi1cc3Vic2VjdGlvbntcbWV0aG9ke3N0cmZ0aW1lKCl9IEJlaGF2aW9yXGxhYmVse3N0cmZ0aW1lLWJlaGF2aW9yfX0KLQotXGNsYXNze2RhdGV9LCBcY2xhc3N7ZGF0ZXRpbWV9LCBhbmQgXGNsYXNze3RpbWV9Ci1vYmplY3RzIGFsbCBzdXBwb3J0IGEgXGNvZGV7c3RyZnRpbWUoXHZhcntmb3JtYXR9KX0KLW1ldGhvZCwgdG8gY3JlYXRlIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdGltZSB1bmRlciB0aGUgY29udHJvbCBvZgotYW4gZXhwbGljaXQgZm9ybWF0IHN0cmluZy4gIEJyb2FkbHkgc3BlYWtpbmcsCi1cY29kZXtkLnN0cmZ0aW1lKGZtdCl9Ci1hY3RzIGxpa2UgdGhlIFxyZWZtb2R1bGV7dGltZX0gbW9kdWxlJ3MKLVxjb2Rle3RpbWUuc3RyZnRpbWUoZm10LCBkLnRpbWV0dXBsZSgpKX0KLWFsdGhvdWdoIG5vdCBhbGwgb2JqZWN0cyBzdXBwb3J0IGEgXG1ldGhvZHt0aW1ldHVwbGUoKX0gbWV0aG9kLgotCi1Gb3IgXGNsYXNze3RpbWV9IG9iamVjdHMsIHRoZSBmb3JtYXQgY29kZXMgZm9yCi15ZWFyLCBtb250aCwgYW5kIGRheSBzaG91bGQgbm90IGJlIHVzZWQsIGFzIHRpbWUgb2JqZWN0cyBoYXZlIG5vIHN1Y2gKLXZhbHVlcy4gIElmIHRoZXkncmUgdXNlZCBhbnl3YXksIFxjb2RlezE5MDB9IGlzIHN1YnN0aXR1dGVkIGZvciB0aGUKLXllYXIsIGFuZCBcY29kZXswfSBmb3IgdGhlIG1vbnRoIGFuZCBkYXkuCi0KLUZvciBcY2xhc3N7ZGF0ZX0gb2JqZWN0cywgdGhlIGZvcm1hdCBjb2RlcyBmb3IgaG91cnMsIG1pbnV0ZXMsIGFuZAotc2Vjb25kcyBzaG91bGQgbm90IGJlIHVzZWQsIGFzIFxjbGFzc3tkYXRlfSBvYmplY3RzIGhhdmUgbm8gc3VjaAotdmFsdWVzLiAgSWYgdGhleSdyZSB1c2VkIGFueXdheSwgXGNvZGV7MH0gaXMgc3Vic3RpdHV0ZWQgZm9yIHRoZW0uCi0KLUZvciBhIG5haXZlIG9iamVjdCwgdGhlIFxjb2Rle1wlen0gYW5kIFxjb2Rle1wlWn0gZm9ybWF0IGNvZGVzIGFyZQotcmVwbGFjZWQgYnkgZW1wdHkgc3RyaW5ncy4KLQotRm9yIGFuIGF3YXJlIG9iamVjdDoKLQotXGJlZ2lue2l0ZW1pemV9Ci0gIFxpdGVtW1xjb2Rle1wlen1dCi0gICAgXG1ldGhvZHt1dGNvZmZzZXQoKX0gaXMgdHJhbnNmb3JtZWQgaW50byBhIDUtY2hhcmFjdGVyIHN0cmluZyBvZgotICAgIHRoZSBmb3JtICtISE1NIG9yIC1ISE1NLCB3aGVyZSBISCBpcyBhIDItZGlnaXQgc3RyaW5nIGdpdmluZyB0aGUKLSAgICBudW1iZXIgb2YgVVRDIG9mZnNldCBob3VycywgYW5kIE1NIGlzIGEgMi1kaWdpdCBzdHJpbmcgZ2l2aW5nIHRoZQotICAgIG51bWJlciBvZiBVVEMgb2Zmc2V0IG1pbnV0ZXMuICBGb3IgZXhhbXBsZSwgaWYKLSAgICBcbWV0aG9ke3V0Y29mZnNldCgpfSByZXR1cm5zIFxjb2Rle3RpbWVkZWx0YShob3Vycz0tMywgbWludXRlcz0tMzApfSwKLSAgICBcY29kZXtcJXp9IGlzIHJlcGxhY2VkIHdpdGggdGhlIHN0cmluZyBcY29kZXsnLTAzMzAnfS4KLQotICBcaXRlbVtcY29kZXtcJVp9XQotICAgIElmIFxtZXRob2R7dHpuYW1lKCl9IHJldHVybnMgXGNvZGV7Tm9uZX0sIFxjb2Rle1wlWn0gaXMgcmVwbGFjZWQKLSAgICBieSBhbiBlbXB0eSBzdHJpbmcuICBPdGhlcndpc2UgXGNvZGV7XCVafSBpcyByZXBsYWNlZCBieSB0aGUgcmV0dXJuZWQKLSAgICB2YWx1ZSwgd2hpY2ggbXVzdCBiZSBhIHN0cmluZy4KLVxlbmR7aXRlbWl6ZX0KLQotVGhlIGZ1bGwgc2V0IG9mIGZvcm1hdCBjb2RlcyBzdXBwb3J0ZWQgdmFyaWVzIGFjcm9zcyBwbGF0Zm9ybXMsCi1iZWNhdXNlIFB5dGhvbiBjYWxscyB0aGUgcGxhdGZvcm0gQyBsaWJyYXJ5J3MgXGZ1bmN0aW9ue3N0cmZ0aW1lKCl9Ci1mdW5jdGlvbiwgYW5kIHBsYXRmb3JtIHZhcmlhdGlvbnMgYXJlIGNvbW1vbi4gIFRoZSBkb2N1bWVudGF0aW9uIGZvcgotUHl0aG9uJ3MgXHJlZm1vZHVsZXt0aW1lfSBtb2R1bGUgbGlzdHMgdGhlIGZvcm1hdCBjb2RlcyB0aGF0IHRoZSBDCi1zdGFuZGFyZCAoMTk4OSB2ZXJzaW9uKSByZXF1aXJlcywgYW5kIHRob3NlIHdvcmsgb24gYWxsIHBsYXRmb3Jtcwotd2l0aCBhIHN0YW5kYXJkIEMgaW1wbGVtZW50YXRpb24uICBOb3RlIHRoYXQgdGhlIDE5OTkgdmVyc2lvbiBvZiB0aGUKLUMgc3RhbmRhcmQgYWRkZWQgYWRkaXRpb25hbCBmb3JtYXQgY29kZXMuCi0KLVRoZSBleGFjdCByYW5nZSBvZiB5ZWFycyBmb3Igd2hpY2ggXG1ldGhvZHtzdHJmdGltZSgpfSB3b3JrcyBhbHNvCi12YXJpZXMgYWNyb3NzIHBsYXRmb3Jtcy4gIFJlZ2FyZGxlc3Mgb2YgcGxhdGZvcm0sIHllYXJzIGJlZm9yZSAxOTAwCi1jYW5ub3QgYmUgdXNlZC4KLQotJSUlIFRoaXMgZXhhbXBsZSBpcyBvYnNvbGV0ZSwgc2luY2Ugc3RycHRpbWUgaXMgbm93IHN1cHBvcnRlZCBieSBkYXRldGltZS4KLSUgCi0lIFxzdWJzZWN0aW9ue0V4YW1wbGVzfQotJSAKLSUgXHN1YnN1YnNlY3Rpb257Q3JlYXRpbmcgRGF0ZXRpbWUgT2JqZWN0cyBmcm9tIEZvcm1hdHRlZCBTdHJpbmdzfQotJSAKLSUgVGhlIFxjbGFzc3tkYXRldGltZX0gY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkgc3VwcG9ydCBwYXJzaW5nIGZvcm1hdHRlZCB0aW1lCi0lIHN0cmluZ3MuICBZb3UgY2FuIHVzZSBcZnVuY3Rpb257dGltZS5zdHJwdGltZX0gdG8gZG8gdGhlIHBhcnNpbmcgYW5kIGNyZWF0ZQotJSBhIFxjbGFzc3tkYXRldGltZX0gb2JqZWN0IGZyb20gdGhlIHR1cGxlIGl0IHJldHVybnM6Ci0lIAotJSBcYmVnaW57dmVyYmF0aW19Ci0lID4+PiBzID0gIjIwMDUtMTItMDZUMTI6MTM6MTQiCi0lID4+PiBmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZQotJSA+Pj4gZnJvbSB0aW1lIGltcG9ydCBzdHJwdGltZQotJSA+Pj4gZGF0ZXRpbWUoKnN0cnB0aW1lKHMsICIlWS0lbS0lZFQlSDolTTolUyIpWzA6Nl0pCi0lIGRhdGV0aW1lLmRhdGV0aW1lKDIwMDUsIDEyLCA2LCAxMiwgMTMsIDE0KQotJSBcZW5ke3ZlcmJhdGltfQotJSAKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliZGJoYXNoLnRleCBiL0RvYy9saWIvbGliZGJoYXNoLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg1MmI3My4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmRiaGFzaC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle2RiaGFzaH0gLS0tCi0gICAgICAgICBEQk0tc3R5bGUgaW50ZXJmYWNlIHRvIHRoZSBCU0QgZGF0YWJhc2UgbGlicmFyeX0KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2RiaGFzaH0KLVxtb2R1bGVzeW5vcHNpc3tEQk0tc3R5bGUgaW50ZXJmYWNlIHRvIHRoZSBCU0QgZGF0YWJhc2UgbGlicmFyeS59Ci1cc2VjdGlvbmF1dGhvcntGcmVkIEwuIERyYWtlLCBKci59e2ZkcmFrZUBhY20ub3JnfQotCi0KLVRoZSBcbW9kdWxle2RiaGFzaH0gbW9kdWxlIHByb3ZpZGVzIGEgZnVuY3Rpb24gdG8gb3BlbiBkYXRhYmFzZXMgdXNpbmcKLXRoZSBCU0QgXGNvZGV7ZGJ9IGxpYnJhcnkuICBUaGlzIG1vZHVsZSBtaXJyb3JzIHRoZSBpbnRlcmZhY2Ugb2YgdGhlCi1vdGhlciBQeXRob24gZGF0YWJhc2UgbW9kdWxlcyB0aGF0IHByb3ZpZGUgYWNjZXNzIHRvIERCTS1zdHlsZQotZGF0YWJhc2VzLiAgVGhlIFxyZWZtb2R1bGV7YnNkZGJ9XHJlZmJpbW9kaW5kZXh7YnNkZGJ9IG1vZHVsZSBpcyByZXF1aXJlZCAKLXRvIHVzZSBcbW9kdWxle2RiaGFzaH0uCi0KLVRoaXMgbW9kdWxlIHByb3ZpZGVzIGFuIGV4Y2VwdGlvbiBhbmQgYSBmdW5jdGlvbjoKLQotCi1cYmVnaW57ZXhjZGVzY317ZXJyb3J9Ci0gIEV4Y2VwdGlvbiByYWlzZWQgb24gZGF0YWJhc2UgZXJyb3JzIG90aGVyIHRoYW4KLSAgXGV4Y2VwdGlvbntLZXlFcnJvcn0uICBJdCBpcyBhIHN5bm9ueW0gZm9yIFxleGNlcHRpb257YnNkZGIuZXJyb3J9LgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e29wZW59e3BhdGhcb3B0aW9uYWx7LCBmbGFnXG9wdGlvbmFseywgbW9kZX19fQotICBPcGVuIGEgXGNvZGV7ZGJ9IGRhdGFiYXNlIGFuZCByZXR1cm4gdGhlIGRhdGFiYXNlIG9iamVjdC4gIFRoZQotICBcdmFye3BhdGh9IGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSBkYXRhYmFzZSBmaWxlLgotCi0gIFRoZSBcdmFye2ZsYWd9IGFyZ3VtZW50IGNhbiBiZQotICBcY29kZXsncid9ICh0aGUgZGVmYXVsdCksIFxjb2Rleyd3J30sCi0gIFxjb2RleydjJ30gKHdoaWNoIGNyZWF0ZXMgdGhlIGRhdGFiYXNlIGlmIGl0IGRvZXNuJ3QgZXhpc3QpLCBvcgotICBcY29kZXsnbid9ICh3aGljaCBhbHdheXMgY3JlYXRlcyBhIG5ldyBlbXB0eSBkYXRhYmFzZSkuCi0gIEZvciBwbGF0Zm9ybXMgb24gd2hpY2ggdGhlIEJTRCBcY29kZXtkYn0gbGlicmFyeSBzdXBwb3J0cyBsb2NraW5nLAotICBhbiBcY2hhcmFjdGVye2x9IGNhbiBiZSBhcHBlbmRlZCB0byBpbmRpY2F0ZSB0aGF0IGxvY2tpbmcgc2hvdWxkIGJlCi0gIHVzZWQuCi0KLSAgVGhlIG9wdGlvbmFsIFx2YXJ7bW9kZX0gcGFyYW1ldGVyIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIFxVTklYe30KLSAgcGVybWlzc2lvbiBiaXRzIHRoYXQgc2hvdWxkIGJlIHNldCBpZiBhIG5ldyBkYXRhYmFzZSBtdXN0IGJlCi0gIGNyZWF0ZWQ7IHRoaXMgd2lsbCBiZSBtYXNrZWQgYnkgdGhlIGN1cnJlbnQgdW1hc2sgdmFsdWUgZm9yIHRoZQotICBwcm9jZXNzLgotXGVuZHtmdW5jZGVzY30KLQotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZW1vZHVsZXthbnlkYm19e0dlbmVyaWMgaW50ZXJmYWNlIHRvIFxjb2Rle2RibX0tc3R5bGUgZGF0YWJhc2VzLn0KLSAgXHNlZW1vZHVsZXtic2RkYn17TG93ZXItbGV2ZWwgaW50ZXJmYWNlIHRvIHRoZSBCU0QgXGNvZGV7ZGJ9IGxpYnJhcnkufQotICBcc2VlbW9kdWxle3doaWNoZGJ9e1V0aWxpdHkgbW9kdWxlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGFuCi0gICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcgZGF0YWJhc2UufQotXGVuZHtzZWVhbHNvfQotCi0KLVxzdWJzZWN0aW9ue0RhdGFiYXNlIE9iamVjdHMgXGxhYmVse2RiaGFzaC1vYmplY3RzfX0KLQotVGhlIGRhdGFiYXNlIG9iamVjdHMgcmV0dXJuZWQgYnkgXGZ1bmN0aW9ue29wZW4oKX0gcHJvdmlkZSB0aGUgbWV0aG9kcyAKLWNvbW1vbiB0byBhbGwgdGhlIERCTS1zdHlsZSBkYXRhYmFzZXMgYW5kIG1hcHBpbmcgb2JqZWN0cy4gIFRoZSBmb2xsb3dpbmcKLW1ldGhvZHMgYXJlIGF2YWlsYWJsZSBpbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgbWV0aG9kcy4KLQotXGJlZ2lue21ldGhvZGRlc2N9W2RiaGFzaF17Zmlyc3R9e30KLSAgSXQncyBwb3NzaWJsZSB0byBsb29wIG92ZXIgZXZlcnkga2V5L3ZhbHVlIHBhaXIgaW4gdGhlIGRhdGFiYXNlIHVzaW5nCi0gIHRoaXMgbWV0aG9kICAgYW5kIHRoZSBcbWV0aG9ke25leHQoKX0gbWV0aG9kLiAgVGhlIHRyYXZlcnNhbCBpcyBvcmRlcmVkIGJ5Ci0gIHRoZSBkYXRhYmFzZXMgaW50ZXJuYWwgaGFzaCB2YWx1ZXMsIGFuZCB3b24ndCBiZSBzb3J0ZWQgYnkgdGhlIGtleQotICB2YWx1ZXMuICBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBzdGFydGluZyBrZXkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtkYmhhc2hde2xhc3R9e30KLSAgUmV0dXJuIHRoZSBsYXN0IGtleS92YWx1ZSBwYWlyIGluIGEgZGF0YWJhc2UgdHJhdmVyc2FsLiAgVGhpcyBtYXkgYmUgdXNlZCB0bwotICBiZWdpbiBhIHJldmVyc2Utb3JkZXIgdHJhdmVyc2FsOyBzZWUgXG1ldGhvZHtwcmV2aW91cygpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2RiaGFzaF17bmV4dH17fQotICBSZXR1cm5zIHRoZSBrZXkgbmV4dCBrZXkvdmFsdWUgcGFpciBpbiBhIGRhdGFiYXNlIHRyYXZlcnNhbC4gIFRoZQotICBmb2xsb3dpbmcgY29kZSBwcmludHMgZXZlcnkga2V5IGluIHRoZSBkYXRhYmFzZSBcY29kZXtkYn0sIHdpdGhvdXQKLSAgaGF2aW5nIHRvIGNyZWF0ZSBhIGxpc3QgaW4gbWVtb3J5IHRoYXQgY29udGFpbnMgdGhlbSBhbGw6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXByaW50IGRiLmZpcnN0KCkKLWZvciBpIGluIHJhbmdlKDEsIGxlbihkYikpOgotICAgIHByaW50IGRiLm5leHQoKQotXGVuZHt2ZXJiYXRpbX0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2RiaGFzaF17cHJldmlvdXN9e30KLSAgUmV0dXJucyB0aGUgcHJldmlvdXMga2V5L3ZhbHVlIHBhaXIgaW4gYSBmb3J3YXJkLXRyYXZlcnNhbCBvZiB0aGUgZGF0YWJhc2UuCi0gIEluIGNvbmp1bmN0aW9uIHdpdGggXG1ldGhvZHtsYXN0KCl9LCB0aGlzIG1heSBiZSB1c2VkIHRvIGltcGxlbWVudAotICBhIHJldmVyc2Utb3JkZXIgdHJhdmVyc2FsLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bZGJoYXNoXXtzeW5jfXt9Ci0gIFRoaXMgbWV0aG9kIGZvcmNlcyBhbnkgdW53cml0dGVuIGRhdGEgdG8gYmUgd3JpdHRlbiB0byB0aGUgZGlzay4KLVxlbmR7bWV0aG9kZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliZGJtLnRleCBiL0RvYy9saWIvbGliZGJtLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA4YWY5OS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmRibS50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle2RibX0gLS0tCi0gICAgICAgICBTaW1wbGUgYGBkYXRhYmFzZScnIGludGVyZmFjZX0KLQotXGRlY2xhcmVtb2R1bGV7YnVpbHRpbn17ZGJtfQotICBccGxhdGZvcm17VW5peH0KLVxtb2R1bGVzeW5vcHNpc3tUaGUgc3RhbmRhcmQgYGBkYXRhYmFzZScnIGludGVyZmFjZSwgYmFzZWQgb24gbmRibS59Ci0KLQotVGhlIFxtb2R1bGV7ZGJtfSBtb2R1bGUgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIHRoZSBcVU5JWHt9Ci0oXGNvZGV7bn0pXGNvZGV7ZGJtfSBsaWJyYXJ5LiAgRGJtIG9iamVjdHMgYmVoYXZlIGxpa2UgbWFwcGluZ3MKLShkaWN0aW9uYXJpZXMpLCBleGNlcHQgdGhhdCBrZXlzIGFuZCB2YWx1ZXMgYXJlIGFsd2F5cyBzdHJpbmdzLgotUHJpbnRpbmcgYSBkYm0gb2JqZWN0IGRvZXNuJ3QgcHJpbnQgdGhlIGtleXMgYW5kIHZhbHVlcywgYW5kIHRoZQotXG1ldGhvZHtpdGVtcygpfSBhbmQgXG1ldGhvZHt2YWx1ZXMoKX0gbWV0aG9kcyBhcmUgbm90IHN1cHBvcnRlZC4KLQotVGhpcyBtb2R1bGUgY2FuIGJlIHVzZWQgd2l0aCB0aGUgYGBjbGFzc2ljJycgbmRibSBpbnRlcmZhY2UsIHRoZSBCU0QKLURCIGNvbXBhdGliaWxpdHkgaW50ZXJmYWNlLCBvciB0aGUgR05VIEdEQk0gY29tcGF0aWJpbGl0eSBpbnRlcmZhY2UuCi1PbiBcVU5JWCwgdGhlIFxwcm9ncmFte2NvbmZpZ3VyZX0gc2NyaXB0IHdpbGwgYXR0ZW1wdCB0byBsb2NhdGUgdGhlCi1hcHByb3ByaWF0ZSBoZWFkZXIgZmlsZSB0byBzaW1wbGlmeSBidWlsZGluZyB0aGlzIG1vZHVsZS4KLQotVGhlIG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmc6Ci0KLVxiZWdpbntleGNkZXNjfXtlcnJvcn0KLVJhaXNlZCBvbiBkYm0tc3BlY2lmaWMgZXJyb3JzLCBzdWNoIGFzIEkvTyBlcnJvcnMuCi1cZXhjZXB0aW9ue0tleUVycm9yfSBpcyByYWlzZWQgZm9yIGdlbmVyYWwgbWFwcGluZyBlcnJvcnMgbGlrZQotc3BlY2lmeWluZyBhbiBpbmNvcnJlY3Qga2V5LgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e2xpYnJhcnl9Ci1OYW1lIG9mIHRoZSBcY29kZXtuZGJtfSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5IHVzZWQuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e29wZW59e2ZpbGVuYW1lXG9wdGlvbmFseywgZmxhZ1xvcHRpb25hbHssIG1vZGV9fX0KLU9wZW4gYSBkYm0gZGF0YWJhc2UgYW5kIHJldHVybiBhIGRibSBvYmplY3QuICBUaGUgXHZhcntmaWxlbmFtZX0KLWFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSBkYXRhYmFzZSBmaWxlICh3aXRob3V0IHRoZSBcZmlsZXsuZGlyfSBvcgotXGZpbGV7LnBhZ30gZXh0ZW5zaW9uczsgbm90ZSB0aGF0IHRoZSBCU0QgREIgaW1wbGVtZW50YXRpb24gb2YgdGhlCi1pbnRlcmZhY2Ugd2lsbCBhcHBlbmQgdGhlIGV4dGVuc2lvbiBcZmlsZXsuZGJ9IGFuZCBvbmx5IGNyZWF0ZSBvbmUKLWZpbGUpLgotCi1UaGUgb3B0aW9uYWwgXHZhcntmbGFnfSBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0aGVzZSB2YWx1ZXM6Ci0KLVxiZWdpbnt0YWJsZWlpfXtjfGx9e2NvZGV9e1ZhbHVlfXtNZWFuaW5nfQotICBcbGluZWlpeydyJ317T3BlbiBleGlzdGluZyBkYXRhYmFzZSBmb3IgcmVhZGluZyBvbmx5IChkZWZhdWx0KX0KLSAgXGxpbmVpaXsndyd9e09wZW4gZXhpc3RpbmcgZGF0YWJhc2UgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmd9Ci0gIFxsaW5laWl7J2MnfXtPcGVuIGRhdGFiYXNlIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLCBjcmVhdGluZyBpdCBpZgotICAgICAgICAgICAgICAgaXQgZG9lc24ndCBleGlzdH0KLSAgXGxpbmVpaXsnbid9e0Fsd2F5cyBjcmVhdGUgYSBuZXcsIGVtcHR5IGRhdGFiYXNlLCBvcGVuIGZvciByZWFkaW5nCi0gICAgICAgICAgICAgICBhbmQgd3JpdGluZ30KLVxlbmR7dGFibGVpaX0KLQotVGhlIG9wdGlvbmFsIFx2YXJ7bW9kZX0gYXJndW1lbnQgaXMgdGhlIFxVTklYe30gbW9kZSBvZiB0aGUgZmlsZSwgdXNlZAotb25seSB3aGVuIHRoZSBkYXRhYmFzZSBoYXMgdG8gYmUgY3JlYXRlZC4gIEl0IGRlZmF1bHRzIHRvIG9jdGFsCi1cY29kZXswNjY2fS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWVtb2R1bGV7YW55ZGJtfXtHZW5lcmljIGludGVyZmFjZSB0byBcY29kZXtkYm19LXN0eWxlIGRhdGFiYXNlcy59Ci0gIFxzZWVtb2R1bGV7Z2RibX17U2ltaWxhciBpbnRlcmZhY2UgdG8gdGhlIEdOVSBHREJNIGxpYnJhcnkufQotICBcc2VlbW9kdWxle3doaWNoZGJ9e1V0aWxpdHkgbW9kdWxlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGFuCi0gICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcgZGF0YWJhc2UufQotXGVuZHtzZWVhbHNvfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJkZWNpbWFsLnRleCBiL0RvYy9saWIvbGliZGVjaW1hbC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNjY1ZGEuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJkZWNpbWFsLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDEzMTMgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtkZWNpbWFsfSAtLS0KLSAgICAgICAgIERlY2ltYWwgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpY30KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2RlY2ltYWx9Ci1cbW9kdWxlc3lub3BzaXN7SW1wbGVtZW50YXRpb24gb2YgdGhlIEdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIAotU3BlY2lmaWNhdGlvbi59Ci0KLVxtb2R1bGVhdXRob3J7RXJpYyBQcmljZX17ZXByaWNlIGF0IHRqaHNzdC5lZHV9Ci1cbW9kdWxlYXV0aG9ye0ZhY3VuZG8gQmF0aXN0YX17ZmFjdW5kbyBhdCB0YW5pcXVldGlsLmNvbS5hcn0KLVxtb2R1bGVhdXRob3J7UmF5bW9uZCBIZXR0aW5nZXJ9e3B5dGhvbiBhdCByY24uY29tfQotXG1vZHVsZWF1dGhvcntBYWh6fXthYWh6IGF0IHBvYm94LmNvbX0KLVxtb2R1bGVhdXRob3J7VGltIFBldGVyc317dGltLm9uZSBhdCBjb21jYXN0Lm5ldH0KLQotXHNlY3Rpb25hdXRob3J7UmF5bW9uZCBELiBIZXR0aW5nZXJ9e3B5dGhvbiBhdCByY24uY29tfQotCi1cdmVyc2lvbmFkZGVkezIuNH0KLQotVGhlIFxtb2R1bGV7ZGVjaW1hbH0gbW9kdWxlIHByb3ZpZGVzIHN1cHBvcnQgZm9yIGRlY2ltYWwgZmxvYXRpbmcgcG9pbnQKLWFyaXRobWV0aWMuICBJdCBvZmZlcnMgc2V2ZXJhbCBhZHZhbnRhZ2VzIG92ZXIgdGhlIFxjbGFzc3tmbG9hdCgpfSBkYXRhdHlwZToKLQotXGJlZ2lue2l0ZW1pemV9Ci0KLVxpdGVtIERlY2ltYWwgbnVtYmVycyBjYW4gYmUgcmVwcmVzZW50ZWQgZXhhY3RseS4gIEluIGNvbnRyYXN0LCBudW1iZXJzIGxpa2UKLVxjb25zdGFudHsxLjF9IGRvIG5vdCBoYXZlIGFuIGV4YWN0IHJlcHJlc2VudGF0aW9uIGluIGJpbmFyeSBmbG9hdGluZyBwb2ludC4KLUVuZCB1c2VycyB0eXBpY2FsbHkgd291bGQgbm90IGV4cGVjdCBcY29uc3RhbnR7MS4xfSB0byBkaXNwbGF5IGFzCi1cY29uc3RhbnR7MS4xMDAwMDAwMDAwMDAwMDAxfSBhcyBpdCBkb2VzIHdpdGggYmluYXJ5IGZsb2F0aW5nIHBvaW50LgotCi1caXRlbSBUaGUgZXhhY3RuZXNzIGNhcnJpZXMgb3ZlciBpbnRvIGFyaXRobWV0aWMuICBJbiBkZWNpbWFsIGZsb2F0aW5nIHBvaW50LAotXHNhbXB7MC4xICsgMC4xICsgMC4xIC0gMC4zfSBpcyBleGFjdGx5IGVxdWFsIHRvIHplcm8uICBJbiBiaW5hcnkgZmxvYXRpbmcKLXBvaW50LCByZXN1bHQgaXMgXGNvbnN0YW50ezUuNTUxMTE1MTIzMTI1NzgyN2UtMDE3fS4gIFdoaWxlIG5lYXIgdG8gemVybywgdGhlCi1kaWZmZXJlbmNlcyBwcmV2ZW50IHJlbGlhYmxlIGVxdWFsaXR5IHRlc3RpbmcgYW5kIGRpZmZlcmVuY2VzIGNhbiBhY2N1bXVsYXRlLgotRm9yIHRoaXMgcmVhc29uLCBkZWNpbWFsIHdvdWxkIGJlIHByZWZlcnJlZCBpbiBhY2NvdW50aW5nIGFwcGxpY2F0aW9ucyB3aGljaAotaGF2ZSBzdHJpY3QgZXF1YWxpdHkgaW52YXJpYW50cy4KLQotXGl0ZW0gVGhlIGRlY2ltYWwgbW9kdWxlIGluY29ycG9yYXRlcyBhIG5vdGlvbiBvZiBzaWduaWZpY2FudCBwbGFjZXMgc28gdGhhdAotXHNhbXB7MS4zMCArIDEuMjB9IGlzIFxjb25zdGFudHsyLjUwfS4gIFRoZSB0cmFpbGluZyB6ZXJvIGlzIGtlcHQgdG8gaW5kaWNhdGUKLXNpZ25pZmljYW5jZS4gIFRoaXMgaXMgdGhlIGN1c3RvbWFyeSBwcmVzZW50YXRpb24gZm9yIG1vbmV0YXJ5IGFwcGxpY2F0aW9ucy4gRm9yCi1tdWx0aXBsaWNhdGlvbiwgdGhlIGBgc2Nob29sYm9vaycnIGFwcHJvYWNoIHVzZXMgYWxsIHRoZSBmaWd1cmVzIGluIHRoZQotbXVsdGlwbGljYW5kcy4gIEZvciBpbnN0YW5jZSwgXHNhbXB7MS4zICogMS4yfSBnaXZlcyBcY29uc3RhbnR7MS41Nn0gd2hpbGUKLVxzYW1wezEuMzAgKiAxLjIwfSBnaXZlcyBcY29uc3RhbnR7MS41NjAwfS4KLQotXGl0ZW0gVW5saWtlIGhhcmR3YXJlIGJhc2VkIGJpbmFyeSBmbG9hdGluZyBwb2ludCwgdGhlIGRlY2ltYWwgbW9kdWxlIGhhcyBhIHVzZXIKLXNldHRhYmxlIHByZWNpc2lvbiAoZGVmYXVsdGluZyB0byAyOCBwbGFjZXMpIHdoaWNoIGNhbiBiZSBhcyBsYXJnZSBhcyBuZWVkZWQgZm9yCi1hIGdpdmVuIHByb2JsZW06Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBnZXRjb250ZXh0KCkucHJlYyA9IDYKLT4+PiBEZWNpbWFsKDEpIC8gRGVjaW1hbCg3KQotRGVjaW1hbCgiMC4xNDI4NTciKQotPj4+IGdldGNvbnRleHQoKS5wcmVjID0gMjgKLT4+PiBEZWNpbWFsKDEpIC8gRGVjaW1hbCg3KQotRGVjaW1hbCgiMC4xNDI4NTcxNDI4NTcxNDI4NTcxNDI4NTcxNDI5IikKLVxlbmR7dmVyYmF0aW19Ci0KLVxpdGVtIEJvdGggYmluYXJ5IGFuZCBkZWNpbWFsIGZsb2F0aW5nIHBvaW50IGFyZSBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiBwdWJsaXNoZWQKLXN0YW5kYXJkcy4gIFdoaWxlIHRoZSBidWlsdC1pbiBmbG9hdCB0eXBlIGV4cG9zZXMgb25seSBhIG1vZGVzdCBwb3J0aW9uIG9mIGl0cwotY2FwYWJpbGl0aWVzLCB0aGUgZGVjaW1hbCBtb2R1bGUgZXhwb3NlcyBhbGwgcmVxdWlyZWQgcGFydHMgb2YgdGhlIHN0YW5kYXJkLgotV2hlbiBuZWVkZWQsIHRoZSBwcm9ncmFtbWVyIGhhcyBmdWxsIGNvbnRyb2wgb3ZlciByb3VuZGluZyBhbmQgc2lnbmFsIGhhbmRsaW5nLgotCi1cZW5ke2l0ZW1pemV9Ci0KLQotVGhlIG1vZHVsZSBkZXNpZ24gaXMgY2VudGVyZWQgYXJvdW5kIHRocmVlIGNvbmNlcHRzOiAgdGhlIGRlY2ltYWwgbnVtYmVyLCB0aGUKLWNvbnRleHQgZm9yIGFyaXRobWV0aWMsIGFuZCBzaWduYWxzLgotCi1BIGRlY2ltYWwgbnVtYmVyIGlzIGltbXV0YWJsZS4gIEl0IGhhcyBhIHNpZ24sIGNvZWZmaWNpZW50IGRpZ2l0cywgYW5kIGFuCi1leHBvbmVudC4gIFRvIHByZXNlcnZlIHNpZ25pZmljYW5jZSwgdGhlIGNvZWZmaWNpZW50IGRpZ2l0cyBkbyBub3QgdHJ1bmNhdGUKLXRyYWlsaW5nIHplcm9lcy4gIERlY2ltYWxzIGFsc28gaW5jbHVkZSBzcGVjaWFsIHZhbHVlcyBzdWNoIGFzCi1cY29uc3RhbnR7SW5maW5pdHl9LCBcY29uc3RhbnR7LUluZmluaXR5fSwgYW5kIFxjb25zdGFudHtOYU59LiAgVGhlIHN0YW5kYXJkCi1hbHNvIGRpZmZlcmVudGlhdGVzIFxjb25zdGFudHstMH0gZnJvbSBcY29uc3RhbnR7KzB9LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1UaGUgY29udGV4dCBmb3IgYXJpdGhtZXRpYyBpcyBhbiBlbnZpcm9ubWVudCBzcGVjaWZ5aW5nIHByZWNpc2lvbiwgcm91bmRpbmcKLXJ1bGVzLCBsaW1pdHMgb24gZXhwb25lbnRzLCBmbGFncyBpbmRpY2F0aW5nIHRoZSByZXN1bHRzIG9mIG9wZXJhdGlvbnMsCi1hbmQgdHJhcCBlbmFibGVycyB3aGljaCBkZXRlcm1pbmUgd2hldGhlciBzaWduYWxzIGFyZSB0cmVhdGVkIGFzCi1leGNlcHRpb25zLiAgUm91bmRpbmcgb3B0aW9ucyBpbmNsdWRlIFxjb25zdGFudHtST1VORF9DRUlMSU5HfSwKLVxjb25zdGFudHtST1VORF9ET1dOfSwgXGNvbnN0YW50e1JPVU5EX0ZMT09SfSwgXGNvbnN0YW50e1JPVU5EX0hBTEZfRE9XTn0sCi1cY29uc3RhbnR7Uk9VTkRfSEFMRl9FVkVOfSwgXGNvbnN0YW50e1JPVU5EX0hBTEZfVVB9LCBhbmQgXGNvbnN0YW50e1JPVU5EX1VQfS4KLQotU2lnbmFscyBhcmUgZ3JvdXBzIG9mIGV4Y2VwdGlvbmFsIGNvbmRpdGlvbnMgYXJpc2luZyBkdXJpbmcgdGhlIGNvdXJzZSBvZgotY29tcHV0YXRpb24uICBEZXBlbmRpbmcgb24gdGhlIG5lZWRzIG9mIHRoZSBhcHBsaWNhdGlvbiwgc2lnbmFscyBtYXkgYmUKLWlnbm9yZWQsIGNvbnNpZGVyZWQgYXMgaW5mb3JtYXRpb25hbCwgb3IgdHJlYXRlZCBhcyBleGNlcHRpb25zLiBUaGUgc2lnbmFscyBpbgotdGhlIGRlY2ltYWwgbW9kdWxlIGFyZTogXGNvbnN0YW50e0NsYW1wZWR9LCBcY29uc3RhbnR7SW52YWxpZE9wZXJhdGlvbn0sCi1cY29uc3RhbnR7RGl2aXNpb25CeVplcm99LCBcY29uc3RhbnR7SW5leGFjdH0sIFxjb25zdGFudHtSb3VuZGVkfSwKLVxjb25zdGFudHtTdWJub3JtYWx9LCBcY29uc3RhbnR7T3ZlcmZsb3d9LCBhbmQgXGNvbnN0YW50e1VuZGVyZmxvd30uCi0KLUZvciBlYWNoIHNpZ25hbCB0aGVyZSBpcyBhIGZsYWcgYW5kIGEgdHJhcCBlbmFibGVyLiAgV2hlbiBhIHNpZ25hbCBpcwotZW5jb3VudGVyZWQsIGl0cyBmbGFnIGlzIGluY3JlbWVudGVkIGZyb20gemVybyBhbmQsIHRoZW4sIGlmIHRoZSB0cmFwIGVuYWJsZXIKLWlzIHNldCB0byBvbmUsIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQuICBGbGFncyBhcmUgc3RpY2t5LCBzbyB0aGUgdXNlcgotbmVlZHMgdG8gcmVzZXQgdGhlbSBiZWZvcmUgbW9uaXRvcmluZyBhIGNhbGN1bGF0aW9uLgotCi0KLVxiZWdpbntzZWVhbHNvfQotICBcc2VldGV4dHtJQk0ncyBHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBTcGVjaWZpY2F0aW9uLAotICAgICAgICAgICBcY2l0ZXRpdGxlW2h0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsL2RlY2FyaXRoLmh0bWxdCi0gICAgICAgICAgIHtUaGUgR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgU3BlY2lmaWNhdGlvbn0ufQotCi0gIFxzZWV0ZXh0e0lFRUUgc3RhbmRhcmQgODU0LTE5ODcsCi0gICAgICAgICAgIFxjaXRldGl0bGVbaHR0cDovL3d3dy5jcy5iZXJrZWxleS5lZHUvXHRleHRhc2NpaXRpbGRlIGVqci9wcm9qZWN0cy83NTQvcHJpdmF0ZS9kcmFmdHMvODU0LTE5ODcvZGlyLmh0bWxdCi0gICAgICAgICAgIHtVbm9mZmljaWFsIElFRUUgODU0IFRleHR9Ln0gCi1cZW5ke3NlZWFsc299Ci0KLQotCi0lJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKLVxzdWJzZWN0aW9ue1F1aWNrLXN0YXJ0IFR1dG9yaWFsIFxsYWJlbHtkZWNpbWFsLXR1dG9yaWFsfX0KLQotVGhlIHVzdWFsIHN0YXJ0IHRvIHVzaW5nIGRlY2ltYWxzIGlzIGltcG9ydGluZyB0aGUgbW9kdWxlLCB2aWV3aW5nIHRoZSBjdXJyZW50Ci1jb250ZXh0IHdpdGggXGZ1bmN0aW9ue2dldGNvbnRleHQoKX0gYW5kLCBpZiBuZWNlc3NhcnksIHNldHRpbmcgbmV3IHZhbHVlcwotZm9yIHByZWNpc2lvbiwgcm91bmRpbmcsIG9yIGVuYWJsZWQgdHJhcHM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBmcm9tIGRlY2ltYWwgaW1wb3J0ICoKLT4+PiBnZXRjb250ZXh0KCkKLUNvbnRleHQocHJlYz0yOCwgcm91bmRpbmc9Uk9VTkRfSEFMRl9FVkVOLCBFbWluPS05OTk5OTk5OTksIEVtYXg9OTk5OTk5OTk5LAotICAgICAgICBjYXBpdGFscz0xLCBmbGFncz1bXSwgdHJhcHM9W092ZXJmbG93LCBJbnZhbGlkT3BlcmF0aW9uLAotICAgICAgICBEaXZpc2lvbkJ5WmVyb10pCi0KLT4+PiBnZXRjb250ZXh0KCkucHJlYyA9IDcgICAgICAgIyBTZXQgYSBuZXcgcHJlY2lzaW9uCi1cZW5ke3ZlcmJhdGltfQotCi0KLURlY2ltYWwgaW5zdGFuY2VzIGNhbiBiZSBjb25zdHJ1Y3RlZCBmcm9tIGludGVnZXJzLCBzdHJpbmdzLCBvciB0dXBsZXMuICBUbwotY3JlYXRlIGEgRGVjaW1hbCBmcm9tIGEgXGNsYXNze2Zsb2F0fSwgZmlyc3QgY29udmVydCBpdCB0byBhIHN0cmluZy4gIFRoaXMKLXNlcnZlcyBhcyBhbiBleHBsaWNpdCByZW1pbmRlciBvZiB0aGUgZGV0YWlscyBvZiB0aGUgY29udmVyc2lvbiAoaW5jbHVkaW5nCi1yZXByZXNlbnRhdGlvbiBlcnJvcikuICBEZWNpbWFsIG51bWJlcnMgaW5jbHVkZSBzcGVjaWFsIHZhbHVlcyBzdWNoIGFzCi1cY29uc3RhbnR7TmFOfSB3aGljaCBzdGFuZHMgZm9yIGBgTm90IGEgbnVtYmVyJycsIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZQotXGNvbnN0YW50e0luZmluaXR5fSwgYW5kIFxjb25zdGFudHstMH0uICAgICAgICAKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IERlY2ltYWwoMTApCi1EZWNpbWFsKCIxMCIpCi0+Pj4gRGVjaW1hbCgiMy4xNCIpCi1EZWNpbWFsKCIzLjE0IikKLT4+PiBEZWNpbWFsKCgwLCAoMywgMSwgNCksIC0yKSkKLURlY2ltYWwoIjMuMTQiKQotPj4+IERlY2ltYWwoc3RyKDIuMCAqKiAwLjUpKQotRGVjaW1hbCgiMS40MTQyMTM1NjIzNyIpCi0+Pj4gRGVjaW1hbCgiTmFOIikKLURlY2ltYWwoIk5hTiIpCi0+Pj4gRGVjaW1hbCgiLUluZmluaXR5IikKLURlY2ltYWwoIi1JbmZpbml0eSIpCi1cZW5ke3ZlcmJhdGltfQotCi0KLVRoZSBzaWduaWZpY2FuY2Ugb2YgYSBuZXcgRGVjaW1hbCBpcyBkZXRlcm1pbmVkIHNvbGVseSBieSB0aGUgbnVtYmVyCi1vZiBkaWdpdHMgaW5wdXQuICBDb250ZXh0IHByZWNpc2lvbiBhbmQgcm91bmRpbmcgb25seSBjb21lIGludG8gcGxheSBkdXJpbmcKLWFyaXRobWV0aWMgb3BlcmF0aW9ucy4KLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGdldGNvbnRleHQoKS5wcmVjID0gNgotPj4+IERlY2ltYWwoJzMuMCcpCi1EZWNpbWFsKCIzLjAiKQotPj4+IERlY2ltYWwoJzMuMTQxNTkyNjUzNScpCi1EZWNpbWFsKCIzLjE0MTU5MjY1MzUiKQotPj4+IERlY2ltYWwoJzMuMTQxNTkyNjUzNScpICsgRGVjaW1hbCgnMi43MTgyODE4Mjg1JykKLURlY2ltYWwoIjUuODU5ODciKQotPj4+IGdldGNvbnRleHQoKS5yb3VuZGluZyA9IFJPVU5EX1VQCi0+Pj4gRGVjaW1hbCgnMy4xNDE1OTI2NTM1JykgKyBEZWNpbWFsKCcyLjcxODI4MTgyODUnKQotRGVjaW1hbCgiNS44NTk4OCIpCi1cZW5ke3ZlcmJhdGltfQotCi0KLURlY2ltYWxzIGludGVyYWN0IHdlbGwgd2l0aCBtdWNoIG9mIHRoZSByZXN0IG9mIFB5dGhvbi4gIEhlcmUgaXMgYSBzbWFsbAotZGVjaW1hbCBmbG9hdGluZyBwb2ludCBmbHlpbmcgY2lyY3VzOgotICAgIAotXGJlZ2lue3ZlcmJhdGltfSAgICAKLT4+PiBkYXRhID0gbWFwKERlY2ltYWwsICcxLjM0IDEuODcgMy40NSAyLjM1IDEuMDAgMC4wMyA5LjI1Jy5zcGxpdCgpKQotPj4+IG1heChkYXRhKQotRGVjaW1hbCgiOS4yNSIpCi0+Pj4gbWluKGRhdGEpCi1EZWNpbWFsKCIwLjAzIikKLT4+PiBzb3J0ZWQoZGF0YSkKLVtEZWNpbWFsKCIwLjAzIiksIERlY2ltYWwoIjEuMDAiKSwgRGVjaW1hbCgiMS4zNCIpLCBEZWNpbWFsKCIxLjg3IiksCi0gRGVjaW1hbCgiMi4zNSIpLCBEZWNpbWFsKCIzLjQ1IiksIERlY2ltYWwoIjkuMjUiKV0KLT4+PiBzdW0oZGF0YSkKLURlY2ltYWwoIjE5LjI5IikKLT4+PiBhLGIsYyA9IGRhdGFbOjNdCi0+Pj4gc3RyKGEpCi0nMS4zNCcKLT4+PiBmbG9hdChhKQotMS4zNDAwMDAwMDAwMDAwMDAxCi0+Pj4gcm91bmQoYSwgMSkgICAgICMgcm91bmQoKSBmaXJzdCBjb252ZXJ0cyB0byBiaW5hcnkgZmxvYXRpbmcgcG9pbnQKLTEuMwotPj4+IGludChhKQotMQotPj4+IGEgKiA1Ci1EZWNpbWFsKCI2LjcwIikKLT4+PiBhICogYgotRGVjaW1hbCgiMi41MDU4IikKLT4+PiBjICUgYQotRGVjaW1hbCgiMC43NyIpCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgXG1ldGhvZHtxdWFudGl6ZSgpfSBtZXRob2Qgcm91bmRzIGEgbnVtYmVyIHRvIGEgZml4ZWQgZXhwb25lbnQuICBUaGlzCi1tZXRob2QgaXMgdXNlZnVsIGZvciBtb25ldGFyeSBhcHBsaWNhdGlvbnMgdGhhdCBvZnRlbiByb3VuZCByZXN1bHRzIHRvIGEgZml4ZWQKLW51bWJlciBvZiBwbGFjZXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0gCi0+Pj4gRGVjaW1hbCgnNy4zMjUnKS5xdWFudGl6ZShEZWNpbWFsKCcuMDEnKSwgcm91bmRpbmc9Uk9VTkRfRE9XTikKLURlY2ltYWwoIjcuMzIiKQotPj4+IERlY2ltYWwoJzcuMzI1JykucXVhbnRpemUoRGVjaW1hbCgnMS4nKSwgcm91bmRpbmc9Uk9VTkRfVVApCi1EZWNpbWFsKCI4IikKLVxlbmR7dmVyYmF0aW19Ci0KLUFzIHNob3duIGFib3ZlLCB0aGUgXGZ1bmN0aW9ue2dldGNvbnRleHQoKX0gZnVuY3Rpb24gYWNjZXNzZXMgdGhlIGN1cnJlbnQKLWNvbnRleHQgYW5kIGFsbG93cyB0aGUgc2V0dGluZ3MgdG8gYmUgY2hhbmdlZC4gIFRoaXMgYXBwcm9hY2ggbWVldHMgdGhlCi1uZWVkcyBvZiBtb3N0IGFwcGxpY2F0aW9ucy4KLQotRm9yIG1vcmUgYWR2YW5jZWQgd29yaywgaXQgbWF5IGJlIHVzZWZ1bCB0byBjcmVhdGUgYWx0ZXJuYXRlIGNvbnRleHRzIHVzaW5nCi10aGUgQ29udGV4dCgpIGNvbnN0cnVjdG9yLiAgVG8gbWFrZSBhbiBhbHRlcm5hdGUgYWN0aXZlLCB1c2UgdGhlCi1cZnVuY3Rpb257c2V0Y29udGV4dCgpfSBmdW5jdGlvbi4KLQotSW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBzdGFuZGFyZCwgdGhlIFxtb2R1bGV7RGVjaW1hbH0gbW9kdWxlIHByb3ZpZGVzIHR3bwotcmVhZHkgdG8gdXNlIHN0YW5kYXJkIGNvbnRleHRzLCBcY29uc3RhbnR7QmFzaWNDb250ZXh0fSBhbmQKLVxjb25zdGFudHtFeHRlbmRlZENvbnRleHR9LiBUaGUgZm9ybWVyIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLWJlY2F1c2UgbWFueSBvZiB0aGUgdHJhcHMgYXJlIGVuYWJsZWQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBteW90aGVyY29udGV4dCA9IENvbnRleHQocHJlYz02MCwgcm91bmRpbmc9Uk9VTkRfSEFMRl9ET1dOKQotPj4+IHNldGNvbnRleHQobXlvdGhlcmNvbnRleHQpCi0+Pj4gRGVjaW1hbCgxKSAvIERlY2ltYWwoNykKLURlY2ltYWwoIjAuMTQyODU3MTQyODU3MTQyODU3MTQyODU3MTQyODU3MTQyODU3MTQyODU3MTQyODU3MTQyODU3MTQyODU3IikKLQotPj4+IEV4dGVuZGVkQ29udGV4dAotQ29udGV4dChwcmVjPTksIHJvdW5kaW5nPVJPVU5EX0hBTEZfRVZFTiwgRW1pbj0tOTk5OTk5OTk5LCBFbWF4PTk5OTk5OTk5OSwKLSAgICAgICAgY2FwaXRhbHM9MSwgZmxhZ3M9W10sIHRyYXBzPVtdKQotPj4+IHNldGNvbnRleHQoRXh0ZW5kZWRDb250ZXh0KQotPj4+IERlY2ltYWwoMSkgLyBEZWNpbWFsKDcpCi1EZWNpbWFsKCIwLjE0Mjg1NzE0MyIpCi0+Pj4gRGVjaW1hbCg0MikgLyBEZWNpbWFsKDApCi1EZWNpbWFsKCJJbmZpbml0eSIpCi0KLT4+PiBzZXRjb250ZXh0KEJhc2ljQ29udGV4dCkKLT4+PiBEZWNpbWFsKDQyKSAvIERlY2ltYWwoMCkKLVRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLSAgRmlsZSAiPHB5c2hlbGwjMTQzPiIsIGxpbmUgMSwgaW4gLXRvcGxldmVsLQotICAgIERlY2ltYWwoNDIpIC8gRGVjaW1hbCgwKQotRGl2aXNpb25CeVplcm86IHggLyAwCi1cZW5ke3ZlcmJhdGltfQotCi0KLUNvbnRleHRzIGFsc28gaGF2ZSBzaWduYWwgZmxhZ3MgZm9yIG1vbml0b3JpbmcgZXhjZXB0aW9uYWwgY29uZGl0aW9ucwotZW5jb3VudGVyZWQgZHVyaW5nIGNvbXB1dGF0aW9ucy4gIFRoZSBmbGFncyByZW1haW4gc2V0IHVudGlsIGV4cGxpY2l0bHkKLWNsZWFyZWQsIHNvIGl0IGlzIGJlc3QgdG8gY2xlYXIgdGhlIGZsYWdzIGJlZm9yZSBlYWNoIHNldCBvZiBtb25pdG9yZWQKLWNvbXB1dGF0aW9ucyBieSB1c2luZyB0aGUgXG1ldGhvZHtjbGVhcl9mbGFncygpfSBtZXRob2QuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBzZXRjb250ZXh0KEV4dGVuZGVkQ29udGV4dCkKLT4+PiBnZXRjb250ZXh0KCkuY2xlYXJfZmxhZ3MoKQotPj4+IERlY2ltYWwoMzU1KSAvIERlY2ltYWwoMTEzKQotRGVjaW1hbCgiMy4xNDE1OTI5MiIpCi0+Pj4gZ2V0Y29udGV4dCgpCi1Db250ZXh0KHByZWM9OSwgcm91bmRpbmc9Uk9VTkRfSEFMRl9FVkVOLCBFbWluPS05OTk5OTk5OTksIEVtYXg9OTk5OTk5OTk5LAotICAgICAgICBjYXBpdGFscz0xLCBmbGFncz1bSW5leGFjdCwgUm91bmRlZF0sIHRyYXBzPVtdKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIFx2YXJ7ZmxhZ3N9IGVudHJ5IHNob3dzIHRoYXQgdGhlIHJhdGlvbmFsIGFwcHJveGltYXRpb24gdG8gXGNvbnN0YW50e1BpfQotd2FzIHJvdW5kZWQgKGRpZ2l0cyBiZXlvbmQgdGhlIGNvbnRleHQgcHJlY2lzaW9uIHdlcmUgdGhyb3duIGF3YXkpIGFuZCB0aGF0Ci10aGUgcmVzdWx0IGlzIGluZXhhY3QgKHNvbWUgb2YgdGhlIGRpc2NhcmRlZCBkaWdpdHMgd2VyZSBub24temVybykuCi0KLUluZGl2aWR1YWwgdHJhcHMgYXJlIHNldCB1c2luZyB0aGUgZGljdGlvbmFyeSBpbiB0aGUgXG1lbWJlcnt0cmFwc30KLWZpZWxkIG9mIGEgY29udGV4dDoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IERlY2ltYWwoMSkgLyBEZWNpbWFsKDApCi1EZWNpbWFsKCJJbmZpbml0eSIpCi0+Pj4gZ2V0Y29udGV4dCgpLnRyYXBzW0RpdmlzaW9uQnlaZXJvXSA9IDEKLT4+PiBEZWNpbWFsKDEpIC8gRGVjaW1hbCgwKQotVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICBGaWxlICI8cHlzaGVsbCMxMTI+IiwgbGluZSAxLCBpbiAtdG9wbGV2ZWwtCi0gICAgRGVjaW1hbCgxKSAvIERlY2ltYWwoMCkKLURpdmlzaW9uQnlaZXJvOiB4IC8gMAotXGVuZHt2ZXJiYXRpbX0KLQotTW9zdCBwcm9ncmFtcyBhZGp1c3QgdGhlIGN1cnJlbnQgY29udGV4dCBvbmx5IG9uY2UsIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCi1wcm9ncmFtLiAgQW5kLCBpbiBtYW55IGFwcGxpY2F0aW9ucywgZGF0YSBpcyBjb252ZXJ0ZWQgdG8gXGNsYXNze0RlY2ltYWx9IHdpdGgKLWEgc2luZ2xlIGNhc3QgaW5zaWRlIGEgbG9vcC4gIFdpdGggY29udGV4dCBzZXQgYW5kIGRlY2ltYWxzIGNyZWF0ZWQsIHRoZSBidWxrCi1vZiB0aGUgcHJvZ3JhbSBtYW5pcHVsYXRlcyB0aGUgZGF0YSBubyBkaWZmZXJlbnRseSB0aGFuIHdpdGggb3RoZXIgUHl0aG9uCi1udW1lcmljIHR5cGVzLgotCi0KLQotJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCi1cc3Vic2VjdGlvbntEZWNpbWFsIG9iamVjdHMgXGxhYmVse2RlY2ltYWwtZGVjaW1hbH19Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0RlY2ltYWx9e1xvcHRpb25hbHt2YWx1ZSBcb3B0aW9uYWx7LCBjb250ZXh0fX19Ci0gIENvbnN0cnVjdHMgYSBuZXcgXGNsYXNze0RlY2ltYWx9IG9iamVjdCBiYXNlZCBmcm9tIFx2YXJ7dmFsdWV9LgotCi0gIFx2YXJ7dmFsdWV9IGNhbiBiZSBhbiBpbnRlZ2VyLCBzdHJpbmcsIHR1cGxlLCBvciBhbm90aGVyIFxjbGFzc3tEZWNpbWFsfQotICBvYmplY3QuIElmIG5vIFx2YXJ7dmFsdWV9IGlzIGdpdmVuLCByZXR1cm5zIFxjb2Rle0RlY2ltYWwoIjAiKX0uICBJZgotICBcdmFye3ZhbHVlfSBpcyBhIHN0cmluZywgaXQgc2hvdWxkIGNvbmZvcm0gdG8gdGhlIGRlY2ltYWwgbnVtZXJpYyBzdHJpbmcKLSAgc3ludGF4OgotICAgIAotICBcYmVnaW57dmVyYmF0aW19Ci0gICAgc2lnbiAgICAgICAgICAgOjo9ICAnKycgfCAnLScKLSAgICBkaWdpdCAgICAgICAgICA6Oj0gICcwJyB8ICcxJyB8ICcyJyB8ICczJyB8ICc0JyB8ICc1JyB8ICc2JyB8ICc3JyB8ICc4JyB8ICc5JwotICAgIGluZGljYXRvciAgICAgIDo6PSAgJ2UnIHwgJ0UnCi0gICAgZGlnaXRzICAgICAgICAgOjo9ICBkaWdpdCBbZGlnaXRdLi4uCi0gICAgZGVjaW1hbC1wYXJ0ICAgOjo9ICBkaWdpdHMgJy4nIFtkaWdpdHNdIHwgWycuJ10gZGlnaXRzCi0gICAgZXhwb25lbnQtcGFydCAgOjo9ICBpbmRpY2F0b3IgW3NpZ25dIGRpZ2l0cwotICAgIGluZmluaXR5ICAgICAgIDo6PSAgJ0luZmluaXR5JyB8ICdJbmYnCi0gICAgbmFuICAgICAgICAgICAgOjo9ICAnTmFOJyBbZGlnaXRzXSB8ICdzTmFOJyBbZGlnaXRzXQotICAgIG51bWVyaWMtdmFsdWUgIDo6PSAgZGVjaW1hbC1wYXJ0IFtleHBvbmVudC1wYXJ0XSB8IGluZmluaXR5Ci0gICAgbnVtZXJpYy1zdHJpbmcgOjo9ICBbc2lnbl0gbnVtZXJpYy12YWx1ZSB8IFtzaWduXSBuYW4gIAotICBcZW5ke3ZlcmJhdGltfQotCi0gIElmIFx2YXJ7dmFsdWV9IGlzIGEgXGNsYXNze3R1cGxlfSwgaXQgc2hvdWxkIGhhdmUgdGhyZWUgY29tcG9uZW50cywKLSAgYSBzaWduIChcY29uc3RhbnR7MH0gZm9yIHBvc2l0aXZlIG9yIFxjb25zdGFudHsxfSBmb3IgbmVnYXRpdmUpLAotICBhIFxjbGFzc3t0dXBsZX0gb2YgZGlnaXRzLCBhbmQgYW4gaW50ZWdlciBleHBvbmVudC4gRm9yIGV4YW1wbGUsCi0gIFxzYW1we0RlY2ltYWwoKDAsICgxLCA0LCAxLCA0KSwgLTMpKX0gcmV0dXJucyBcY29kZXtEZWNpbWFsKCIxLjQxNCIpfS4KLQotICBUaGUgXHZhcntjb250ZXh0fSBwcmVjaXNpb24gZG9lcyBub3QgYWZmZWN0IGhvdyBtYW55IGRpZ2l0cyBhcmUgc3RvcmVkLgotICBUaGF0IGlzIGRldGVybWluZWQgZXhjbHVzaXZlbHkgYnkgdGhlIG51bWJlciBvZiBkaWdpdHMgaW4gXHZhcnt2YWx1ZX0uIEZvcgotICBleGFtcGxlLCBcc2FtcHtEZWNpbWFsKCIzLjAwMDAwIil9IHJlY29yZHMgYWxsIGZpdmUgemVyb2VzIGV2ZW4gaWYgdGhlCi0gIGNvbnRleHQgcHJlY2lzaW9uIGlzIG9ubHkgdGhyZWUuCi0KLSAgVGhlIHB1cnBvc2Ugb2YgdGhlIFx2YXJ7Y29udGV4dH0gYXJndW1lbnQgaXMgZGV0ZXJtaW5pbmcgd2hhdCB0byBkbyBpZgotICBcdmFye3ZhbHVlfSBpcyBhIG1hbGZvcm1lZCBzdHJpbmcuICBJZiB0aGUgY29udGV4dCB0cmFwcwotICBcY29uc3RhbnR7SW52YWxpZE9wZXJhdGlvbn0sIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQ7IG90aGVyd2lzZSwgdGhlCi0gIGNvbnN0cnVjdG9yIHJldHVybnMgYSBuZXcgRGVjaW1hbCB3aXRoIHRoZSB2YWx1ZSBvZiBcY29uc3RhbnR7TmFOfS4KLQotICBPbmNlIGNvbnN0cnVjdGVkLCBcY2xhc3N7RGVjaW1hbH0gb2JqZWN0cyBhcmUgaW1tdXRhYmxlLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLURlY2ltYWwgZmxvYXRpbmcgcG9pbnQgb2JqZWN0cyBzaGFyZSBtYW55IHByb3BlcnRpZXMgd2l0aCB0aGUgb3RoZXIgYnVpbHRpbgotbnVtZXJpYyB0eXBlcyBzdWNoIGFzIFxjbGFzc3tmbG9hdH0gYW5kIFxjbGFzc3tpbnR9LiAgQWxsIG9mIHRoZSB1c3VhbAotbWF0aCBvcGVyYXRpb25zIGFuZCBzcGVjaWFsIG1ldGhvZHMgYXBwbHkuICBMaWtld2lzZSwgZGVjaW1hbCBvYmplY3RzIGNhbgotYmUgY29waWVkLCBwaWNrbGVkLCBwcmludGVkLCB1c2VkIGFzIGRpY3Rpb25hcnkga2V5cywgdXNlZCBhcyBzZXQgZWxlbWVudHMsCi1jb21wYXJlZCwgc29ydGVkLCBhbmQgY29lcmNlZCB0byBhbm90aGVyIHR5cGUgKHN1Y2ggYXMgXGNsYXNze2Zsb2F0fQotb3IgXGNsYXNze2xvbmd9KS4KLQotSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIG51bWVyaWMgcHJvcGVydGllcywgZGVjaW1hbCBmbG9hdGluZyBwb2ludCBvYmplY3RzCi1hbHNvIGhhdmUgYSBudW1iZXIgb2Ygc3BlY2lhbGl6ZWQgbWV0aG9kczoKLQotXGJlZ2lue21ldGhvZGRlc2N9e2FkanVzdGVkfXt9Ci0gIFJldHVybiB0aGUgYWRqdXN0ZWQgZXhwb25lbnQgYWZ0ZXIgc2hpZnRpbmcgb3V0IHRoZSBjb2VmZmljaWVudCdzIHJpZ2h0bW9zdAotICBkaWdpdHMgdW50aWwgb25seSB0aGUgbGVhZCBkaWdpdCByZW1haW5zOiBcY29kZXtEZWNpbWFsKCIzMjFlKzUiKS5hZGp1c3RlZCgpfQotICByZXR1cm5zIHNldmVuLiAgVXNlZCBmb3IgZGV0ZXJtaW5pbmcgdGhlIHBvc2l0aW9uIG9mIHRoZSBtb3N0IHNpZ25pZmljYW50Ci0gIGRpZ2l0IHdpdGggcmVzcGVjdCB0byB0aGUgZGVjaW1hbCBwb2ludC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2FzX3R1cGxlfXt9Ci0gIFJldHVybnMgYSB0dXBsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbnVtYmVyOgotICBcc2FtcHsoc2lnbiwgZGlnaXR0dXBsZSwgZXhwb25lbnQpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2NvbXBhcmV9e290aGVyXG9wdGlvbmFseywgY29udGV4dH19Ci0gIENvbXBhcmVzIGxpa2UgXG1ldGhvZHtfX2NtcF9fKCl9IGJ1dCByZXR1cm5zIGEgZGVjaW1hbCBpbnN0YW5jZToKLSAgXGJlZ2lue3ZlcmJhdGltfQotICAgICAgICBhIG9yIGIgaXMgYSBOYU4gPT0+IERlY2ltYWwoIk5hTiIpCi0gICAgICAgIGEgPCBiICAgICAgICAgICA9PT4gRGVjaW1hbCgiLTEiKQotICAgICAgICBhID09IGIgICAgICAgICAgPT0+IERlY2ltYWwoIjAiKQotICAgICAgICBhID4gYiAgICAgICAgICAgPT0+IERlY2ltYWwoIjEiKQotICBcZW5ke3ZlcmJhdGltfQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317bWF4fXtvdGhlclxvcHRpb25hbHssIGNvbnRleHR9fQotICBMaWtlIFxzYW1we21heChzZWxmLCBvdGhlcil9IGV4Y2VwdCB0aGF0IHRoZSBjb250ZXh0IHJvdW5kaW5nIHJ1bGUKLSAgaXMgYXBwbGllZCBiZWZvcmUgcmV0dXJuaW5nIGFuZCB0aGF0IFxjb25zdGFudHtOYU59IHZhbHVlcyBhcmUKLSAgZWl0aGVyIHNpZ25hbGxlZCBvciBpZ25vcmVkIChkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgYW5kIHdoZXRoZXIKLSAgdGhleSBhcmUgc2lnbmFsaW5nIG9yIHF1aWV0KS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e21pbn17b3RoZXJcb3B0aW9uYWx7LCBjb250ZXh0fX0KLSAgTGlrZSBcc2FtcHttaW4oc2VsZiwgb3RoZXIpfSBleGNlcHQgdGhhdCB0aGUgY29udGV4dCByb3VuZGluZyBydWxlCi0gIGlzIGFwcGxpZWQgYmVmb3JlIHJldHVybmluZyBhbmQgdGhhdCBcY29uc3RhbnR7TmFOfSB2YWx1ZXMgYXJlCi0gIGVpdGhlciBzaWduYWxsZWQgb3IgaWdub3JlZCAoZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0IGFuZCB3aGV0aGVyCi0gIHRoZXkgYXJlIHNpZ25hbGluZyBvciBxdWlldCkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtub3JtYWxpemV9e1xvcHRpb25hbHtjb250ZXh0fX0KLSAgTm9ybWFsaXplIHRoZSBudW1iZXIgYnkgc3RyaXBwaW5nIHRoZSByaWdodG1vc3QgdHJhaWxpbmcgemVyb2VzIGFuZAotICBjb252ZXJ0aW5nIGFueSByZXN1bHQgZXF1YWwgdG8gXGNvbnN0YW50e0RlY2ltYWwoIjAiKX0gdG8KLSAgXGNvbnN0YW50e0RlY2ltYWwoIjBlMCIpfS4gVXNlZCBmb3IgcHJvZHVjaW5nIGNhbm9uaWNhbCB2YWx1ZXMgZm9yIG1lbWJlcnMKLSAgb2YgYW4gZXF1aXZhbGVuY2UgY2xhc3MuIEZvciBleGFtcGxlLCBcY29kZXtEZWNpbWFsKCIzMi4xMDAiKX0gYW5kCi0gIFxjb2Rle0RlY2ltYWwoIjAuMzIxMDAwZSsyIil9IGJvdGggbm9ybWFsaXplIHRvIHRoZSBlcXVpdmFsZW50IHZhbHVlCi0gIFxjb2Rle0RlY2ltYWwoIjMyLjEiKX0uCi1cZW5ke21ldGhvZGRlc2N9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi1cYmVnaW57bWV0aG9kZGVzY317cXVhbnRpemV9Ci0gIHtleHAgXG9wdGlvbmFseywgcm91bmRpbmdcb3B0aW9uYWx7LCBjb250ZXh0XG9wdGlvbmFseywgd2F0Y2hleHB9fX19Ci0gIFF1YW50aXplIG1ha2VzIHRoZSBleHBvbmVudCB0aGUgc2FtZSBhcyBcdmFye2V4cH0uICBTZWFyY2hlcyBmb3IgYQotICByb3VuZGluZyBtZXRob2QgaW4gXHZhcntyb3VuZGluZ30sIHRoZW4gaW4gXHZhcntjb250ZXh0fSwgYW5kIHRoZW4KLSAgaW4gdGhlIGN1cnJlbnQgY29udGV4dC4KLQotICBJZiBcdmFye3dhdGNoZXhwfSBpcyBzZXQgKGRlZmF1bHQpLCB0aGVuIGFuIGVycm9yIGlzIHJldHVybmVkIHdoZW5ldmVyCi0gIHRoZSByZXN1bHRpbmcgZXhwb25lbnQgaXMgZ3JlYXRlciB0aGFuIFxtZW1iZXJ7RW1heH0gb3IgbGVzcyB0aGFuCi0gIFxtZW1iZXJ7RXRpbnl9LgotXGVuZHttZXRob2RkZXNjfSAKLQotXGJlZ2lue21ldGhvZGRlc2N9e3JlbWFpbmRlcl9uZWFyfXtvdGhlclxvcHRpb25hbHssIGNvbnRleHR9fQotICBDb21wdXRlcyB0aGUgbW9kdWxvIGFzIGVpdGhlciBhIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIHZhbHVlIGRlcGVuZGluZwotICBvbiB3aGljaCBpcyBjbG9zZXN0IHRvIHplcm8uICBGb3IgaW5zdGFuY2UsCi0gIFxzYW1we0RlY2ltYWwoMTApLnJlbWFpbmRlcl9uZWFyKDYpfSByZXR1cm5zIFxjb2Rle0RlY2ltYWwoIi0yIil9Ci0gIHdoaWNoIGlzIGNsb3NlciB0byB6ZXJvIHRoYW4gXGNvZGV7RGVjaW1hbCgiNCIpfS4KLQotICBJZiBib3RoIGFyZSBlcXVhbGx5IGNsb3NlLCB0aGUgb25lIGNob3NlbiB3aWxsIGhhdmUgdGhlIHNhbWUgc2lnbgotICBhcyBcdmFye3NlbGZ9LgotXGVuZHttZXRob2RkZXNjfSAgCi0KLVxiZWdpbnttZXRob2RkZXNjfXtzYW1lX3F1YW50dW19e290aGVyXG9wdGlvbmFseywgY29udGV4dH19Ci0gIFRlc3Qgd2hldGhlciBzZWxmIGFuZCBvdGhlciBoYXZlIHRoZSBzYW1lIGV4cG9uZW50IG9yIHdoZXRoZXIgYm90aAotICBhcmUgXGNvbnN0YW50e05hTn0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtzcXJ0fXtcb3B0aW9uYWx7Y29udGV4dH19Ci0gIFJldHVybiB0aGUgc3F1YXJlIHJvb3QgdG8gZnVsbCBwcmVjaXNpb24uCi1cZW5ke21ldGhvZGRlc2N9ICAgICAgICAgICAgICAgICAgICAKLSAKLVxiZWdpbnttZXRob2RkZXNjfXt0b19lbmdfc3RyaW5nfXtcb3B0aW9uYWx7Y29udGV4dH19Ci0gIENvbnZlcnQgdG8gYW4gZW5naW5lZXJpbmctdHlwZSBzdHJpbmcuCi0KLSAgRW5naW5lZXJpbmcgbm90YXRpb24gaGFzIGFuIGV4cG9uZW50IHdoaWNoIGlzIGEgbXVsdGlwbGUgb2YgMywgc28gdGhlcmUKLSAgYXJlIHVwIHRvIDMgZGlnaXRzIGxlZnQgb2YgdGhlIGRlY2ltYWwgcGxhY2UuICBGb3IgZXhhbXBsZSwgY29udmVydHMKLSAgXGNvZGV7RGVjaW1hbCgnMTIzRSsxJyl9IHRvIFxjb2Rle0RlY2ltYWwoIjEuMjNFKzMiKX0KLVxlbmR7bWV0aG9kZGVzY30gIAotCi1cYmVnaW57bWV0aG9kZGVzY317dG9faW50ZWdyYWx9e1xvcHRpb25hbHtyb3VuZGluZ1xvcHRpb25hbHssIGNvbnRleHR9fX0gICAgICAgICAgICAgICAgICAgCi0gIFJvdW5kcyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyIHdpdGhvdXQgc2lnbmFsaW5nIFxjb25zdGFudHtJbmV4YWN0fQotICBvciBcY29uc3RhbnR7Um91bmRlZH0uICBJZiBnaXZlbiwgYXBwbGllcyBcdmFye3JvdW5kaW5nfTsgb3RoZXJ3aXNlLAotICB1c2VzIHRoZSByb3VuZGluZyBtZXRob2QgaW4gZWl0aGVyIHRoZSBzdXBwbGllZCBcdmFye2NvbnRleHR9IG9yIHRoZQotICBjdXJyZW50IGNvbnRleHQuCi1cZW5ke21ldGhvZGRlc2N9IAotCi0KLQotJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlICAgICAgICAgICAgCi1cc3Vic2VjdGlvbntDb250ZXh0IG9iamVjdHMgXGxhYmVse2RlY2ltYWwtY29udGV4dH19Ci0KLUNvbnRleHRzIGFyZSBlbnZpcm9ubWVudHMgZm9yIGFyaXRobWV0aWMgb3BlcmF0aW9ucy4gIFRoZXkgZ292ZXJuIHByZWNpc2lvbiwKLXNldCBydWxlcyBmb3Igcm91bmRpbmcsIGRldGVybWluZSB3aGljaCBzaWduYWxzIGFyZSB0cmVhdGVkIGFzIGV4Y2VwdGlvbnMsIGFuZAotbGltaXQgdGhlIHJhbmdlIGZvciBleHBvbmVudHMuCi0KLUVhY2ggdGhyZWFkIGhhcyBpdHMgb3duIGN1cnJlbnQgY29udGV4dCB3aGljaCBpcyBhY2Nlc3NlZCBvciBjaGFuZ2VkIHVzaW5nCi10aGUgXGZ1bmN0aW9ue2dldGNvbnRleHQoKX0gYW5kIFxmdW5jdGlvbntzZXRjb250ZXh0KCl9IGZ1bmN0aW9uczoKLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRjb250ZXh0fXt9Ci0gIFJldHVybiB0aGUgY3VycmVudCBjb250ZXh0IGZvciB0aGUgYWN0aXZlIHRocmVhZC4KLVxlbmR7ZnVuY2Rlc2N9ICAgICAgICAgICAgCi0KLVxiZWdpbntmdW5jZGVzY317c2V0Y29udGV4dH17Y30KLSAgU2V0IHRoZSBjdXJyZW50IGNvbnRleHQgZm9yIHRoZSBhY3RpdmUgdGhyZWFkIHRvIFx2YXJ7Y30uCi1cZW5ke2Z1bmNkZXNjfSAgCi0KLUJlZ2lubmluZyB3aXRoIFB5dGhvbiAyLjUsIHlvdSBjYW4gYWxzbyB1c2UgdGhlIFxrZXl3b3Jke3dpdGh9IHN0YXRlbWVudAotYW5kIHRoZSBcZnVuY3Rpb257bG9jYWxjb250ZXh0KCl9IGZ1bmN0aW9uIHRvIHRlbXBvcmFyaWx5IGNoYW5nZSB0aGUKLWFjdGl2ZSBjb250ZXh0LgotCi1cYmVnaW57ZnVuY2Rlc2N9e2xvY2FsY29udGV4dH17XG9wdGlvbmFse2N9fQotICBSZXR1cm4gYSBjb250ZXh0IG1hbmFnZXIgdGhhdCB3aWxsIHNldCB0aGUgY3VycmVudCBjb250ZXh0IGZvcgotICB0aGUgYWN0aXZlIHRocmVhZCB0byBhIGNvcHkgb2YgXHZhcntjfSBvbiBlbnRyeSB0byB0aGUgd2l0aC1zdGF0ZW1lbnQKLSAgYW5kIHJlc3RvcmUgdGhlIHByZXZpb3VzIGNvbnRleHQgd2hlbiBleGl0aW5nIHRoZSB3aXRoLXN0YXRlbWVudC4gSWYKLSAgbm8gY29udGV4dCBpcyBzcGVjaWZpZWQsIGEgY29weSBvZiB0aGUgY3VycmVudCBjb250ZXh0IGlzIHVzZWQuCi0gIFx2ZXJzaW9uYWRkZWR7Mi41fQotCi0gIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGUgc2V0cyB0aGUgY3VycmVudCBkZWNpbWFsIHByZWNpc2lvbgotICB0byA0MiBwbGFjZXMsIHBlcmZvcm1zIGEgY2FsY3VsYXRpb24sIGFuZCB0aGVuIGF1dG9tYXRpY2FsbHkgcmVzdG9yZXMKLSAgdGhlIHByZXZpb3VzIGNvbnRleHQ6Ci1cYmVnaW57dmVyYmF0aW19Ci0gICAgZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB3aXRoX3N0YXRlbWVudAotICAgIGZyb20gZGVjaW1hbCBpbXBvcnQgbG9jYWxjb250ZXh0Ci0KLSAgICB3aXRoIGxvY2FsY29udGV4dCgpIGFzIGN0eDoKLSAgICAgICAgY3R4LnByZWMgPSA0MiAgICMgUGVyZm9ybSBhIGhpZ2ggcHJlY2lzaW9uIGNhbGN1bGF0aW9uCi0gICAgICAgIHMgPSBjYWxjdWxhdGVfc29tZXRoaW5nKCkKLSAgICBzID0gK3MgICMgUm91bmQgdGhlIGZpbmFsIHJlc3VsdCBiYWNrIHRvIHRoZSBkZWZhdWx0IHByZWNpc2lvbgotXGVuZHt2ZXJiYXRpbX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLU5ldyBjb250ZXh0cyBjYW4gYWxzbyBiZSBjcmVhdGVkIHVzaW5nIHRoZSBcY2xhc3N7Q29udGV4dH0gY29uc3RydWN0b3IKLWRlc2NyaWJlZCBiZWxvdy4gSW4gYWRkaXRpb24sIHRoZSBtb2R1bGUgcHJvdmlkZXMgdGhyZWUgcHJlLW1hZGUKLWNvbnRleHRzOgotCi1cYmVnaW57Y2xhc3NkZXNjKn17QmFzaWNDb250ZXh0fQotICBUaGlzIGlzIGEgc3RhbmRhcmQgY29udGV4dCBkZWZpbmVkIGJ5IHRoZSBHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYwotICBTcGVjaWZpY2F0aW9uLiAgUHJlY2lzaW9uIGlzIHNldCB0byBuaW5lLiAgUm91bmRpbmcgaXMgc2V0IHRvCi0gIFxjb25zdGFudHtST1VORF9IQUxGX1VQfS4gIEFsbCBmbGFncyBhcmUgY2xlYXJlZC4gIEFsbCB0cmFwcyBhcmUgZW5hYmxlZAotICAodHJlYXRlZCBhcyBleGNlcHRpb25zKSBleGNlcHQgXGNvbnN0YW50e0luZXhhY3R9LCBcY29uc3RhbnR7Um91bmRlZH0sIGFuZAotICBcY29uc3RhbnR7U3Vibm9ybWFsfS4KLQotICBCZWNhdXNlIG1hbnkgb2YgdGhlIHRyYXBzIGFyZSBlbmFibGVkLCB0aGlzIGNvbnRleHQgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuCi1cZW5ke2NsYXNzZGVzYyp9Ci0KLVxiZWdpbntjbGFzc2Rlc2MqfXtFeHRlbmRlZENvbnRleHR9Ci0gIFRoaXMgaXMgYSBzdGFuZGFyZCBjb250ZXh0IGRlZmluZWQgYnkgdGhlIEdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljCi0gIFNwZWNpZmljYXRpb24uICBQcmVjaXNpb24gaXMgc2V0IHRvIG5pbmUuICBSb3VuZGluZyBpcyBzZXQgdG8KLSAgXGNvbnN0YW50e1JPVU5EX0hBTEZfRVZFTn0uICBBbGwgZmxhZ3MgYXJlIGNsZWFyZWQuICBObyB0cmFwcyBhcmUgZW5hYmxlZAotICAoc28gdGhhdCBleGNlcHRpb25zIGFyZSBub3QgcmFpc2VkIGR1cmluZyBjb21wdXRhdGlvbnMpLgotCi0gIEJlY2F1c2UgdGhlIHRyYXBwZWQgYXJlIGRpc2FibGVkLCB0aGlzIGNvbnRleHQgaXMgdXNlZnVsIGZvciBhcHBsaWNhdGlvbnMKLSAgdGhhdCBwcmVmZXIgdG8gaGF2ZSByZXN1bHQgdmFsdWUgb2YgXGNvbnN0YW50e05hTn0gb3IgXGNvbnN0YW50e0luZmluaXR5fQotICBpbnN0ZWFkIG9mIHJhaXNpbmcgZXhjZXB0aW9ucy4gIFRoaXMgYWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGNvbXBsZXRlIGEKLSAgcnVuIGluIHRoZSBwcmVzZW5jZSBvZiBjb25kaXRpb25zIHRoYXQgd291bGQgb3RoZXJ3aXNlIGhhbHQgdGhlIHByb2dyYW0uCi1cZW5ke2NsYXNzZGVzYyp9Ci0KLVxiZWdpbntjbGFzc2Rlc2MqfXtEZWZhdWx0Q29udGV4dH0KLSAgVGhpcyBjb250ZXh0IGlzIHVzZWQgYnkgdGhlIFxjbGFzc3tDb250ZXh0fSBjb25zdHJ1Y3RvciBhcyBhIHByb3RvdHlwZSBmb3IKLSAgbmV3IGNvbnRleHRzLiAgQ2hhbmdpbmcgYSBmaWVsZCAoc3VjaCBhIHByZWNpc2lvbikgaGFzIHRoZSBlZmZlY3Qgb2YKLSAgY2hhbmdpbmcgdGhlIGRlZmF1bHQgZm9yIG5ldyBjb250ZXh0cyBjcmVhdGluZyBieSB0aGUgXGNsYXNze0NvbnRleHR9Ci0gIGNvbnN0cnVjdG9yLgotCi0gIFRoaXMgY29udGV4dCBpcyBtb3N0IHVzZWZ1bCBpbiBtdWx0aS10aHJlYWRlZCBlbnZpcm9ubWVudHMuICBDaGFuZ2luZyBvbmUgb2YKLSAgdGhlIGZpZWxkcyBiZWZvcmUgdGhyZWFkcyBhcmUgc3RhcnRlZCBoYXMgdGhlIGVmZmVjdCBvZiBzZXR0aW5nIHN5c3RlbS13aWRlCi0gIGRlZmF1bHRzLiAgQ2hhbmdpbmcgdGhlIGZpZWxkcyBhZnRlciB0aHJlYWRzIGhhdmUgc3RhcnRlZCBpcyBub3QgcmVjb21tZW5kZWQKLSAgYXMgaXQgd291bGQgcmVxdWlyZSB0aHJlYWQgc3luY2hyb25pemF0aW9uIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zLgotCi0gIEluIHNpbmdsZSB0aHJlYWRlZCBlbnZpcm9ubWVudHMsIGl0IGlzIHByZWZlcmFibGUgdG8gbm90IHVzZSB0aGlzIGNvbnRleHQKLSAgYXQgYWxsLiAgSW5zdGVhZCwgc2ltcGx5IGNyZWF0ZSBjb250ZXh0cyBleHBsaWNpdGx5IGFzIGRlc2NyaWJlZCBiZWxvdy4KLQotICBUaGUgZGVmYXVsdCB2YWx1ZXMgYXJlIHByZWNpc2lvbj0yOCwgcm91bmRpbmc9Uk9VTkRfSEFMRl9FVkVOLCBhbmQgZW5hYmxlZAotICB0cmFwcyBmb3IgT3ZlcmZsb3csIEludmFsaWRPcGVyYXRpb24sIGFuZCBEaXZpc2lvbkJ5WmVyby4KLVxlbmR7Y2xhc3NkZXNjKn0KLQotCi1JbiBhZGRpdGlvbiB0byB0aGUgdGhyZWUgc3VwcGxpZWQgY29udGV4dHMsIG5ldyBjb250ZXh0cyBjYW4gYmUgY3JlYXRlZAotd2l0aCB0aGUgXGNsYXNze0NvbnRleHR9IGNvbnN0cnVjdG9yLgotCi1cYmVnaW57Y2xhc3NkZXNjfXtDb250ZXh0fXtwcmVjPU5vbmUsIHJvdW5kaW5nPU5vbmUsIHRyYXBzPU5vbmUsCi0gICAgICAgIGZsYWdzPU5vbmUsIEVtaW49Tm9uZSwgRW1heD1Ob25lLCBjYXBpdGFscz0xfQotICBDcmVhdGVzIGEgbmV3IGNvbnRleHQuICBJZiBhIGZpZWxkIGlzIG5vdCBzcGVjaWZpZWQgb3IgaXMgXGNvbnN0YW50e05vbmV9LAotICB0aGUgZGVmYXVsdCB2YWx1ZXMgYXJlIGNvcGllZCBmcm9tIHRoZSBcY29uc3RhbnR7RGVmYXVsdENvbnRleHR9LiAgSWYgdGhlCi0gIFx2YXJ7ZmxhZ3N9IGZpZWxkIGlzIG5vdCBzcGVjaWZpZWQgb3IgaXMgXGNvbnN0YW50e05vbmV9LCBhbGwgZmxhZ3MgYXJlCi0gIGNsZWFyZWQuCi0KLSAgVGhlIFx2YXJ7cHJlY30gZmllbGQgaXMgYSBwb3NpdGl2ZSBpbnRlZ2VyIHRoYXQgc2V0cyB0aGUgcHJlY2lzaW9uIGZvcgotICBhcml0aG1ldGljIG9wZXJhdGlvbnMgaW4gdGhlIGNvbnRleHQuCi0KLSAgVGhlIFx2YXJ7cm91bmRpbmd9IG9wdGlvbiBpcyBvbmUgb2Y6Ci0gIFxiZWdpbntpdGVtaXplfQotICBcaXRlbSBcY29uc3RhbnR7Uk9VTkRfQ0VJTElOR30gKHRvd2FyZHMgXGNvbnN0YW50e0luZmluaXR5fSksCi0gIFxpdGVtIFxjb25zdGFudHtST1VORF9ET1dOfSAodG93YXJkcyB6ZXJvKSwKLSAgXGl0ZW0gXGNvbnN0YW50e1JPVU5EX0ZMT09SfSAodG93YXJkcyBcY29uc3RhbnR7LUluZmluaXR5fSksCi0gIFxpdGVtIFxjb25zdGFudHtST1VORF9IQUxGX0RPV059ICh0byBuZWFyZXN0IHdpdGggdGllcyBnb2luZyB0b3dhcmRzIHplcm8pLAotICBcaXRlbSBcY29uc3RhbnR7Uk9VTkRfSEFMRl9FVkVOfSAodG8gbmVhcmVzdCB3aXRoIHRpZXMgZ29pbmcgdG8gbmVhcmVzdCBldmVuIGludGVnZXIpLAotICBcaXRlbSBcY29uc3RhbnR7Uk9VTkRfSEFMRl9VUH0gKHRvIG5lYXJlc3Qgd2l0aCB0aWVzIGdvaW5nIGF3YXkgZnJvbSB6ZXJvKSwgb3IKLSAgXGl0ZW0gXGNvbnN0YW50e1JPVU5EX1VQfSAoYXdheSBmcm9tIHplcm8pLgotICBcZW5ke2l0ZW1pemV9Ci0KLSAgVGhlIFx2YXJ7dHJhcHN9IGFuZCBcdmFye2ZsYWdzfSBmaWVsZHMgbGlzdCBhbnkgc2lnbmFscyB0byBiZSBzZXQuCi0gIEdlbmVyYWxseSwgbmV3IGNvbnRleHRzIHNob3VsZCBvbmx5IHNldCB0cmFwcyBhbmQgbGVhdmUgdGhlIGZsYWdzIGNsZWFyLgotCi0gIFRoZSBcdmFye0VtaW59IGFuZCBcdmFye0VtYXh9IGZpZWxkcyBhcmUgaW50ZWdlcnMgc3BlY2lmeWluZyB0aGUgb3V0ZXIKLSAgbGltaXRzIGFsbG93YWJsZSBmb3IgZXhwb25lbnRzLgotCi0gIFRoZSBcdmFye2NhcGl0YWxzfSBmaWVsZCBpcyBlaXRoZXIgXGNvbnN0YW50ezB9IG9yIFxjb25zdGFudHsxfSAodGhlCi0gIGRlZmF1bHQpLiBJZiBzZXQgdG8gXGNvbnN0YW50ezF9LCBleHBvbmVudHMgYXJlIHByaW50ZWQgd2l0aCBhIGNhcGl0YWwKLSAgXGNvbnN0YW50e0V9OyBvdGhlcndpc2UsIGEgbG93ZXJjYXNlIFxjb25zdGFudHtlfSBpcyB1c2VkOgotICBcY29uc3RhbnR7RGVjaW1hbCgnNi4wMmUrMjMnKX0uCi1cZW5ke2NsYXNzZGVzY30KLQotVGhlIFxjbGFzc3tDb250ZXh0fSBjbGFzcyBkZWZpbmVzIHNldmVyYWwgZ2VuZXJhbCBwdXJwb3NlIG1ldGhvZHMgYXMgd2VsbCBhcyBhCi1sYXJnZSBudW1iZXIgb2YgbWV0aG9kcyBmb3IgZG9pbmcgYXJpdGhtZXRpYyBkaXJlY3RseSBpbiBhIGdpdmVuIGNvbnRleHQuCi0KLVxiZWdpbnttZXRob2RkZXNjfXtjbGVhcl9mbGFnc317fQotICBSZXNldHMgYWxsIG9mIHRoZSBmbGFncyB0byBcY29uc3RhbnR7MH0uCi1cZW5ke21ldGhvZGRlc2N9ICAKLQotXGJlZ2lue21ldGhvZGRlc2N9e2NvcHl9e30KLSAgUmV0dXJuIGEgZHVwbGljYXRlIG9mIHRoZSBjb250ZXh0LgotXGVuZHttZXRob2RkZXNjfSAgCi0KLVxiZWdpbnttZXRob2RkZXNjfXtjcmVhdGVfZGVjaW1hbH17bnVtfQotICBDcmVhdGVzIGEgbmV3IERlY2ltYWwgaW5zdGFuY2UgZnJvbSBcdmFye251bX0gYnV0IHVzaW5nIFx2YXJ7c2VsZn0gYXMKLSAgY29udGV4dC4gVW5saWtlIHRoZSBcY2xhc3N7RGVjaW1hbH0gY29uc3RydWN0b3IsIHRoZSBjb250ZXh0IHByZWNpc2lvbiwKLSAgcm91bmRpbmcgbWV0aG9kLCBmbGFncywgYW5kIHRyYXBzIGFyZSBhcHBsaWVkIHRvIHRoZSBjb252ZXJzaW9uLgotCi0gIFRoaXMgaXMgdXNlZnVsIGJlY2F1c2UgY29uc3RhbnRzIGFyZSBvZnRlbiBnaXZlbiB0byBhIGdyZWF0ZXIgcHJlY2lzaW9uIHRoYW4KLSAgaXMgbmVlZGVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gIEFub3RoZXIgYmVuZWZpdCBpcyB0aGF0IHJvdW5kaW5nIGltbWVkaWF0ZWx5Ci0gIGVsaW1pbmF0ZXMgdW5pbnRlbmRlZCBlZmZlY3RzIGZyb20gZGlnaXRzIGJleW9uZCB0aGUgY3VycmVudCBwcmVjaXNpb24uCi0gIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgdXNpbmcgdW5yb3VuZGVkIGlucHV0cyBtZWFucyB0aGF0IGFkZGluZyB6ZXJvCi0gIHRvIGEgc3VtIGNhbiBjaGFuZ2UgdGhlIHJlc3VsdDoKLQotICBcYmVnaW57dmVyYmF0aW19Ci0gICAgPj4+IGdldGNvbnRleHQoKS5wcmVjID0gMwotICAgID4+PiBEZWNpbWFsKCIzLjQ0NDUiKSArIERlY2ltYWwoIjEuMDAyMyIpCi0gICAgRGVjaW1hbCgiNC40NSIpCi0gICAgPj4+IERlY2ltYWwoIjMuNDQ0NSIpICsgRGVjaW1hbCgwKSArIERlY2ltYWwoIjEuMDAyMyIpCi0gICAgRGVjaW1hbCgiNC40NCIpCi0gIFxlbmR7dmVyYmF0aW19Ci0gICAgICAKLVxlbmR7bWV0aG9kZGVzY30gCi0KLVxiZWdpbnttZXRob2RkZXNjfXtFdGlueX17fQotICBSZXR1cm5zIGEgdmFsdWUgZXF1YWwgdG8gXHNhbXB7RW1pbiAtIHByZWMgKyAxfSB3aGljaCBpcyB0aGUgbWluaW11bQotICBleHBvbmVudCB2YWx1ZSBmb3Igc3Vibm9ybWFsIHJlc3VsdHMuICBXaGVuIHVuZGVyZmxvdyBvY2N1cnMsIHRoZQotICBleHBvbmVudCBpcyBzZXQgdG8gXGNvbnN0YW50e0V0aW55fS4KLVxlbmR7bWV0aG9kZGVzY30gCi0KLVxiZWdpbnttZXRob2RkZXNjfXtFdG9wfXt9Ci0gIFJldHVybnMgYSB2YWx1ZSBlcXVhbCB0byBcc2FtcHtFbWF4IC0gcHJlYyArIDF9LgotXGVuZHttZXRob2RkZXNjfSAKLQotCi1UaGUgdXN1YWwgYXBwcm9hY2ggdG8gd29ya2luZyB3aXRoIGRlY2ltYWxzIGlzIHRvIGNyZWF0ZSBcY2xhc3N7RGVjaW1hbH0KLWluc3RhbmNlcyBhbmQgdGhlbiBhcHBseSBhcml0aG1ldGljIG9wZXJhdGlvbnMgd2hpY2ggdGFrZSBwbGFjZSB3aXRoaW4gdGhlCi1jdXJyZW50IGNvbnRleHQgZm9yIHRoZSBhY3RpdmUgdGhyZWFkLiAgQW4gYWx0ZXJuYXRlIGFwcHJvYWNoIGlzIHRvIHVzZQotY29udGV4dCBtZXRob2RzIGZvciBjYWxjdWxhdGluZyB3aXRoaW4gYSBzcGVjaWZpYyBjb250ZXh0LiAgVGhlIG1ldGhvZHMgYXJlCi1zaW1pbGFyIHRvIHRob3NlIGZvciB0aGUgXGNsYXNze0RlY2ltYWx9IGNsYXNzIGFuZCBhcmUgb25seSBicmllZmx5IHJlY291bnRlZAotaGVyZS4KLQotXGJlZ2lue21ldGhvZGRlc2N9e2Fic317eH0KLSAgUmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgXHZhcnt4fS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2FkZH17eCwgeX0KLSAgUmV0dXJuIHRoZSBzdW0gb2YgXHZhcnt4fSBhbmQgXHZhcnt5fS4KLVxlbmR7bWV0aG9kZGVzY30KLSAgIAotXGJlZ2lue21ldGhvZGRlc2N9e2NvbXBhcmV9e3gsIHl9Ci0gIENvbXBhcmVzIHZhbHVlcyBudW1lcmljYWxseS4KLSAgCi0gIExpa2UgXG1ldGhvZHtfX2NtcF9fKCl9IGJ1dCByZXR1cm5zIGEgZGVjaW1hbCBpbnN0YW5jZToKLSAgXGJlZ2lue3ZlcmJhdGltfQotICAgICAgICBhIG9yIGIgaXMgYSBOYU4gPT0+IERlY2ltYWwoIk5hTiIpCi0gICAgICAgIGEgPCBiICAgICAgICAgICA9PT4gRGVjaW1hbCgiLTEiKQotICAgICAgICBhID09IGIgICAgICAgICAgPT0+IERlY2ltYWwoIjAiKQotICAgICAgICBhID4gYiAgICAgICAgICAgPT0+IERlY2ltYWwoIjEiKQotICBcZW5ke3ZlcmJhdGltfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317ZGl2aWRlfXt4LCB5fQotICBSZXR1cm4gXHZhcnt4fSBkaXZpZGVkIGJ5IFx2YXJ7eX0uCi1cZW5ke21ldGhvZGRlc2N9ICAgCi0gIAotXGJlZ2lue21ldGhvZGRlc2N9e2Rpdm1vZH17eCwgeX0KLSAgRGl2aWRlcyB0d28gbnVtYmVycyBhbmQgcmV0dXJucyB0aGUgaW50ZWdlciBwYXJ0IG9mIHRoZSByZXN1bHQuCi1cZW5ke21ldGhvZGRlc2N9IAotCi1cYmVnaW57bWV0aG9kZGVzY317bWF4fXt4LCB5fQotICBDb21wYXJlIHR3byB2YWx1ZXMgbnVtZXJpY2FsbHkgYW5kIHJldHVybiB0aGUgbWF4aW11bS4KLQotICBJZiB0aGV5IGFyZSBudW1lcmljYWxseSBlcXVhbCB0aGVuIHRoZSBsZWZ0LWhhbmQgb3BlcmFuZCBpcyBjaG9zZW4gYXMgdGhlCi0gIHJlc3VsdC4KLVxlbmR7bWV0aG9kZGVzY30gCi0gCi1cYmVnaW57bWV0aG9kZGVzY317bWlufXt4LCB5fQotICBDb21wYXJlIHR3byB2YWx1ZXMgbnVtZXJpY2FsbHkgYW5kIHJldHVybiB0aGUgbWluaW11bS4KLQotICBJZiB0aGV5IGFyZSBudW1lcmljYWxseSBlcXVhbCB0aGVuIHRoZSBsZWZ0LWhhbmQgb3BlcmFuZCBpcyBjaG9zZW4gYXMgdGhlCi0gIHJlc3VsdC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e21pbnVzfXt4fQotICBNaW51cyBjb3JyZXNwb25kcyB0byB0aGUgdW5hcnkgcHJlZml4IG1pbnVzIG9wZXJhdG9yIGluIFB5dGhvbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e211bHRpcGx5fXt4LCB5fQotICBSZXR1cm4gdGhlIHByb2R1Y3Qgb2YgXHZhcnt4fSBhbmQgXHZhcnt5fS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e25vcm1hbGl6ZX17eH0KLSAgTm9ybWFsaXplIHJlZHVjZXMgYW4gb3BlcmFuZCB0byBpdHMgc2ltcGxlc3QgZm9ybS4KLQotICBFc3NlbnRpYWxseSBhIFxtZXRob2R7cGx1c30gb3BlcmF0aW9uIHdpdGggYWxsIHRyYWlsaW5nIHplcm9zIHJlbW92ZWQgZnJvbQotICB0aGUgcmVzdWx0LgotXGVuZHttZXRob2RkZXNjfQotICAKLVxiZWdpbnttZXRob2RkZXNjfXtwbHVzfXt4fQotICBQbHVzIGNvcnJlc3BvbmRzIHRvIHRoZSB1bmFyeSBwcmVmaXggcGx1cyBvcGVyYXRvciBpbiBQeXRob24uICBUaGlzCi0gIG9wZXJhdGlvbiBhcHBsaWVzIHRoZSBjb250ZXh0IHByZWNpc2lvbiBhbmQgcm91bmRpbmcsIHNvIGl0IGlzCi0gIFxlbXBoe25vdH0gYW4gaWRlbnRpdHkgb3BlcmF0aW9uLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317cG93ZXJ9e3gsIHlcb3B0aW9uYWx7LCBtb2R1bG99fQotICBSZXR1cm4gXHNhbXB7eCAqKiB5fSB0byB0aGUgXHZhcnttb2R1bG99IGlmIGdpdmVuLgotCi0gIFRoZSByaWdodC1oYW5kIG9wZXJhbmQgbXVzdCBiZSBhIHdob2xlIG51bWJlciB3aG9zZSBpbnRlZ2VyIHBhcnQgKGFmdGVyIGFueQotICBleHBvbmVudCBoYXMgYmVlbiBhcHBsaWVkKSBoYXMgbm8gbW9yZSB0aGFuIDkgZGlnaXRzIGFuZCB3aG9zZSBmcmFjdGlvbmFsCi0gIHBhcnQgKGlmIGFueSkgaXMgYWxsIHplcm9zIGJlZm9yZSBhbnkgcm91bmRpbmcuIFRoZSBvcGVyYW5kIG1heSBiZSBwb3NpdGl2ZSwKLSAgbmVnYXRpdmUsIG9yIHplcm87IGlmIG5lZ2F0aXZlLCB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIHBvd2VyIGlzIHVzZWQsIGFuZAotICB0aGUgbGVmdC1oYW5kIG9wZXJhbmQgaXMgaW52ZXJ0ZWQgKGRpdmlkZWQgaW50byAxKSBiZWZvcmUgdXNlLgotCi0gIElmIHRoZSBpbmNyZWFzZWQgcHJlY2lzaW9uIG5lZWRlZCBmb3IgdGhlIGludGVybWVkaWF0ZSBjYWxjdWxhdGlvbnMgZXhjZWVkcwotICB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiB0aGVuIGFuIFxjb25zdGFudHtJbnZhbGlkT3BlcmF0aW9ufQotICBjb25kaXRpb24gaXMgc2lnbmFsZWQuCi0KLSAgSWYsIHdoZW4gcmFpc2luZyB0byBhIG5lZ2F0aXZlIHBvd2VyLCBhbiB1bmRlcmZsb3cgb2NjdXJzIGR1cmluZyB0aGUKLSAgZGl2aXNpb24gaW50byAxLCB0aGUgb3BlcmF0aW9uIGlzIG5vdCBoYWx0ZWQgYXQgdGhhdCBwb2ludCBidXQgY29udGludWVzLiAKLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3F1YW50aXplfXt4LCB5fQotICBSZXR1cm5zIGEgdmFsdWUgZXF1YWwgdG8gXHZhcnt4fSBhZnRlciByb3VuZGluZyBhbmQgaGF2aW5nIHRoZSBleHBvbmVudCBvZgotICBcdmFye3l9LgotCi0gIFVubGlrZSBvdGhlciBvcGVyYXRpb25zLCBpZiB0aGUgbGVuZ3RoIG9mIHRoZSBjb2VmZmljaWVudCBhZnRlciB0aGUgcXVhbnRpemUKLSAgb3BlcmF0aW9uIHdvdWxkIGJlIGdyZWF0ZXIgdGhhbiBwcmVjaXNpb24sIHRoZW4gYW4KLSAgXGNvbnN0YW50e0ludmFsaWRPcGVyYXRpb259IGlzIHNpZ25hbGVkLiBUaGlzIGd1YXJhbnRlZXMgdGhhdCwgdW5sZXNzIHRoZXJlCi0gIGlzIGFuIGVycm9yIGNvbmRpdGlvbiwgdGhlIHF1YW50aXplZCBleHBvbmVudCBpcyBhbHdheXMgZXF1YWwgdG8gdGhhdCBvZiB0aGUKLSAgcmlnaHQtaGFuZCBvcGVyYW5kLgotCi0gIEFsc28gdW5saWtlIG90aGVyIG9wZXJhdGlvbnMsIHF1YW50aXplIG5ldmVyIHNpZ25hbHMgVW5kZXJmbG93LCBldmVuCi0gIGlmIHRoZSByZXN1bHQgaXMgc3Vibm9ybWFsIGFuZCBpbmV4YWN0LiAgCi1cZW5ke21ldGhvZGRlc2N9IAotCi1cYmVnaW57bWV0aG9kZGVzY317cmVtYWluZGVyfXt4LCB5fQotICBSZXR1cm5zIHRoZSByZW1haW5kZXIgZnJvbSBpbnRlZ2VyIGRpdmlzaW9uLgotCi0gIFRoZSBzaWduIG9mIHRoZSByZXN1bHQsIGlmIG5vbi16ZXJvLCBpcyB0aGUgc2FtZSBhcyB0aGF0IG9mIHRoZSBvcmlnaW5hbAotICBkaXZpZGVuZC4gCi1cZW5ke21ldGhvZGRlc2N9Ci0gCi1cYmVnaW57bWV0aG9kZGVzY317cmVtYWluZGVyX25lYXJ9e3gsIHl9Ci0gIENvbXB1dGVkIHRoZSBtb2R1bG8gYXMgZWl0aGVyIGEgcG9zaXRpdmUgb3IgbmVnYXRpdmUgdmFsdWUgZGVwZW5kaW5nCi0gIG9uIHdoaWNoIGlzIGNsb3Nlc3QgdG8gemVyby4gIEZvciBpbnN0YW5jZSwKLSAgXHNhbXB7RGVjaW1hbCgxMCkucmVtYWluZGVyX25lYXIoNil9IHJldHVybnMgXGNvZGV7RGVjaW1hbCgiLTIiKX0KLSAgd2hpY2ggaXMgY2xvc2VyIHRvIHplcm8gdGhhbiBcY29kZXtEZWNpbWFsKCI0Iil9LgotCi0gIElmIGJvdGggYXJlIGVxdWFsbHkgY2xvc2UsIHRoZSBvbmUgY2hvc2VuIHdpbGwgaGF2ZSB0aGUgc2FtZSBzaWduCi0gIGFzIFx2YXJ7c2VsZn0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtzYW1lX3F1YW50dW19e3gsIHl9Ci0gIFRlc3Qgd2hldGhlciBcdmFye3h9IGFuZCBcdmFye3l9IGhhdmUgdGhlIHNhbWUgZXhwb25lbnQgb3Igd2hldGhlciBib3RoIGFyZQotICBcY29uc3RhbnR7TmFOfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3NxcnR9e3h9Ci0gIFJldHVybiB0aGUgc3F1YXJlIHJvb3Qgb2YgXHZhcnt4fSB0byBmdWxsIHByZWNpc2lvbi4KLVxlbmR7bWV0aG9kZGVzY30gICAgICAgICAgICAgICAgICAgIAotCi1cYmVnaW57bWV0aG9kZGVzY317c3VidHJhY3R9e3gsIHl9Ci0gIFJldHVybiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFx2YXJ7eH0gYW5kIFx2YXJ7eX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0gCi1cYmVnaW57bWV0aG9kZGVzY317dG9fZW5nX3N0cmluZ317fQotICBDb252ZXJ0IHRvIGVuZ2luZWVyaW5nLXR5cGUgc3RyaW5nLgotCi0gIEVuZ2luZWVyaW5nIG5vdGF0aW9uIGhhcyBhbiBleHBvbmVudCB3aGljaCBpcyBhIG11bHRpcGxlIG9mIDMsIHNvIHRoZXJlCi0gIGFyZSB1cCB0byAzIGRpZ2l0cyBsZWZ0IG9mIHRoZSBkZWNpbWFsIHBsYWNlLiAgRm9yIGV4YW1wbGUsIGNvbnZlcnRzCi0gIFxjb2Rle0RlY2ltYWwoJzEyM0UrMScpfSB0byBcY29kZXtEZWNpbWFsKCIxLjIzRSszIil9Ci1cZW5ke21ldGhvZGRlc2N9ICAKLQotXGJlZ2lue21ldGhvZGRlc2N9e3RvX2ludGVncmFsfXt4fSAgICAgICAgICAgICAgICAgIAotICBSb3VuZHMgdG8gdGhlIG5lYXJlc3QgaW50ZWdlciB3aXRob3V0IHNpZ25hbGluZyBcY29uc3RhbnR7SW5leGFjdH0KLSAgb3IgXGNvbnN0YW50e1JvdW5kZWR9LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLVxlbmR7bWV0aG9kZGVzY30gCi0KLVxiZWdpbnttZXRob2RkZXNjfXt0b19zY2lfc3RyaW5nfXt4fQotICBDb252ZXJ0cyBhIG51bWJlciB0byBhIHN0cmluZyB1c2luZyBzY2llbnRpZmljIG5vdGF0aW9uLgotXGVuZHttZXRob2RkZXNjfSAKLQotCi0KLSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAgICAgICAgICAgIAotXHN1YnNlY3Rpb257U2lnbmFscyBcbGFiZWx7ZGVjaW1hbC1zaWduYWxzfX0KLQotU2lnbmFscyByZXByZXNlbnQgY29uZGl0aW9ucyB0aGF0IGFyaXNlIGR1cmluZyBjb21wdXRhdGlvbi4KLUVhY2ggY29ycmVzcG9uZHMgdG8gb25lIGNvbnRleHQgZmxhZyBhbmQgb25lIGNvbnRleHQgdHJhcCBlbmFibGVyLgotCi1UaGUgY29udGV4dCBmbGFnIGlzIGluY3JlbWVudGVkIHdoZW5ldmVyIHRoZSBjb25kaXRpb24gaXMgZW5jb3VudGVyZWQuCi1BZnRlciB0aGUgY29tcHV0YXRpb24sIGZsYWdzIG1heSBiZSBjaGVja2VkIGZvciBpbmZvcm1hdGlvbmFsCi1wdXJwb3NlcyAoZm9yIGluc3RhbmNlLCB0byBkZXRlcm1pbmUgd2hldGhlciBhIGNvbXB1dGF0aW9uIHdhcyBleGFjdCkuCi1BZnRlciBjaGVja2luZyB0aGUgZmxhZ3MsIGJlIHN1cmUgdG8gY2xlYXIgYWxsIGZsYWdzIGJlZm9yZSBzdGFydGluZwotdGhlIG5leHQgY29tcHV0YXRpb24uCi0KLUlmIHRoZSBjb250ZXh0J3MgdHJhcCBlbmFibGVyIGlzIHNldCBmb3IgdGhlIHNpZ25hbCwgdGhlbiB0aGUgY29uZGl0aW9uCi1jYXVzZXMgYSBQeXRob24gZXhjZXB0aW9uIHRvIGJlIHJhaXNlZC4gIEZvciBleGFtcGxlLCBpZiB0aGUKLVxjbGFzc3tEaXZpc2lvbkJ5WmVyb30gdHJhcCBpcyBzZXQsIHRoZW4gYSBcZXhjZXB0aW9ue0RpdmlzaW9uQnlaZXJvfQotZXhjZXB0aW9uIGlzIHJhaXNlZCB1cG9uIGVuY291bnRlcmluZyB0aGUgY29uZGl0aW9uLgotCi0KLVxiZWdpbntjbGFzc2Rlc2MqfXtDbGFtcGVkfQotICAgIEFsdGVyZWQgYW4gZXhwb25lbnQgdG8gZml0IHJlcHJlc2VudGF0aW9uIGNvbnN0cmFpbnRzLgotCi0gICAgVHlwaWNhbGx5LCBjbGFtcGluZyBvY2N1cnMgd2hlbiBhbiBleHBvbmVudCBmYWxscyBvdXRzaWRlIHRoZSBjb250ZXh0J3MKLSAgICBcbWVtYmVye0VtaW59IGFuZCBcbWVtYmVye0VtYXh9IGxpbWl0cy4gIElmIHBvc3NpYmxlLCB0aGUgZXhwb25lbnQgaXMKLSAgICByZWR1Y2VkIHRvIGZpdCBieSBhZGRpbmcgemVyb2VzIHRvIHRoZSBjb2VmZmljaWVudC4KLVxlbmR7Y2xhc3NkZXNjKn0KLQotXGJlZ2lue2NsYXNzZGVzYyp9e0RlY2ltYWxFeGNlcHRpb259Ci0gICAgQmFzZSBjbGFzcyBmb3Igb3RoZXIgc2lnbmFscyBhbmQgYSBzdWJjbGFzcyBvZgotICAgIFxleGNlcHRpb257QXJpdGhtZXRpY0Vycm9yfS4KLVxlbmR7Y2xhc3NkZXNjKn0KLQotXGJlZ2lue2NsYXNzZGVzYyp9e0RpdmlzaW9uQnlaZXJvfQotICAgIFNpZ25hbHMgdGhlIGRpdmlzaW9uIG9mIGEgbm9uLWluZmluaXRlIG51bWJlciBieSB6ZXJvLgotCi0gICAgQ2FuIG9jY3VyIHdpdGggZGl2aXNpb24sIG1vZHVsbyBkaXZpc2lvbiwgb3Igd2hlbiByYWlzaW5nIGEgbnVtYmVyIHRvIGEKLSAgICBuZWdhdGl2ZSBwb3dlci4gIElmIHRoaXMgc2lnbmFsIGlzIG5vdCB0cmFwcGVkLCByZXR1cm5zCi0gICAgXGNvbnN0YW50e0luZmluaXR5fSBvciBcY29uc3RhbnR7LUluZmluaXR5fSB3aXRoIHRoZSBzaWduIGRldGVybWluZWQgYnkKLSAgICB0aGUgaW5wdXRzIHRvIHRoZSBjYWxjdWxhdGlvbi4KLVxlbmR7Y2xhc3NkZXNjKn0KLQotXGJlZ2lue2NsYXNzZGVzYyp9e0luZXhhY3R9Ci0gICAgSW5kaWNhdGVzIHRoYXQgcm91bmRpbmcgb2NjdXJyZWQgYW5kIHRoZSByZXN1bHQgaXMgbm90IGV4YWN0LgotCi0gICAgU2lnbmFscyB3aGVuIG5vbi16ZXJvIGRpZ2l0cyB3ZXJlIGRpc2NhcmRlZCBkdXJpbmcgcm91bmRpbmcuIFRoZSByb3VuZGVkCi0gICAgcmVzdWx0IGlzIHJldHVybmVkLiAgVGhlIHNpZ25hbCBmbGFnIG9yIHRyYXAgaXMgdXNlZCB0byBkZXRlY3Qgd2hlbgotICAgIHJlc3VsdHMgYXJlIGluZXhhY3QuCi1cZW5ke2NsYXNzZGVzYyp9Ci0KLVxiZWdpbntjbGFzc2Rlc2MqfXtJbnZhbGlkT3BlcmF0aW9ufQotICAgIEFuIGludmFsaWQgb3BlcmF0aW9uIHdhcyBwZXJmb3JtZWQuCi0KLSAgICBJbmRpY2F0ZXMgdGhhdCBhbiBvcGVyYXRpb24gd2FzIHJlcXVlc3RlZCB0aGF0IGRvZXMgbm90IG1ha2Ugc2Vuc2UuCi0gICAgSWYgbm90IHRyYXBwZWQsIHJldHVybnMgXGNvbnN0YW50e05hTn0uICBQb3NzaWJsZSBjYXVzZXMgaW5jbHVkZToKLQotICAgIFxiZWdpbnt2ZXJiYXRpbX0KLSAgICAgICAgSW5maW5pdHkgLSBJbmZpbml0eQotICAgICAgICAwICogSW5maW5pdHkKLSAgICAgICAgSW5maW5pdHkgLyBJbmZpbml0eQotICAgICAgICB4ICUgMAotICAgICAgICBJbmZpbml0eSAlIHgKLSAgICAgICAgeC5fcmVzY2FsZSggbm9uLWludGVnZXIgKQotICAgICAgICBzcXJ0KC14KSBhbmQgeCA+IDAKLSAgICAgICAgMCAqKiAwCi0gICAgICAgIHggKiogKG5vbi1pbnRlZ2VyKQotICAgICAgICB4ICoqIEluZmluaXR5ICAgICAgCi0gICAgXGVuZHt2ZXJiYXRpbX0gICAgCi1cZW5ke2NsYXNzZGVzYyp9Ci0KLVxiZWdpbntjbGFzc2Rlc2MqfXtPdmVyZmxvd30KLSAgICBOdW1lcmljYWwgb3ZlcmZsb3cuCi0KLSAgICBJbmRpY2F0ZXMgdGhlIGV4cG9uZW50IGlzIGxhcmdlciB0aGFuIFxtZW1iZXJ7RW1heH0gYWZ0ZXIgcm91bmRpbmcgaGFzCi0gICAgb2NjdXJyZWQuICBJZiBub3QgdHJhcHBlZCwgdGhlIHJlc3VsdCBkZXBlbmRzIG9uIHRoZSByb3VuZGluZyBtb2RlLCBlaXRoZXIKLSAgICBwdWxsaW5nIGlud2FyZCB0byB0aGUgbGFyZ2VzdCByZXByZXNlbnRhYmxlIGZpbml0ZSBudW1iZXIgb3Igcm91bmRpbmcKLSAgICBvdXR3YXJkIHRvIFxjb25zdGFudHtJbmZpbml0eX0uICBJbiBlaXRoZXIgY2FzZSwgXGNsYXNze0luZXhhY3R9IGFuZAotICAgIFxjbGFzc3tSb3VuZGVkfSBhcmUgYWxzbyBzaWduYWxlZC4gICAKLVxlbmR7Y2xhc3NkZXNjKn0KLQotXGJlZ2lue2NsYXNzZGVzYyp9e1JvdW5kZWR9Ci0gICAgUm91bmRpbmcgb2NjdXJyZWQgdGhvdWdoIHBvc3NpYmx5IG5vIGluZm9ybWF0aW9uIHdhcyBsb3N0LgotCi0gICAgU2lnbmFsZWQgd2hlbmV2ZXIgcm91bmRpbmcgZGlzY2FyZHMgZGlnaXRzOyBldmVuIGlmIHRob3NlIGRpZ2l0cyBhcmUKLSAgICB6ZXJvIChzdWNoIGFzIHJvdW5kaW5nIFxjb25zdGFudHs1LjAwfSB0byBcY29uc3RhbnR7NS4wfSkuICAgSWYgbm90Ci0gICAgdHJhcHBlZCwgcmV0dXJucyB0aGUgcmVzdWx0IHVuY2hhbmdlZC4gIFRoaXMgc2lnbmFsIGlzIHVzZWQgdG8gZGV0ZWN0Ci0gICAgbG9zcyBvZiBzaWduaWZpY2FudCBkaWdpdHMuCi1cZW5ke2NsYXNzZGVzYyp9Ci0KLVxiZWdpbntjbGFzc2Rlc2MqfXtTdWJub3JtYWx9Ci0gICAgRXhwb25lbnQgd2FzIGxvd2VyIHRoYW4gXG1lbWJlcntFbWlufSBwcmlvciB0byByb3VuZGluZy4KLSAgICAgICAgICAKLSAgICBPY2N1cnMgd2hlbiBhbiBvcGVyYXRpb24gcmVzdWx0IGlzIHN1Ym5vcm1hbCAodGhlIGV4cG9uZW50IGlzIHRvbyBzbWFsbCkuCi0gICAgSWYgbm90IHRyYXBwZWQsIHJldHVybnMgdGhlIHJlc3VsdCB1bmNoYW5nZWQuCi1cZW5ke2NsYXNzZGVzYyp9Ci0KLVxiZWdpbntjbGFzc2Rlc2MqfXtVbmRlcmZsb3d9Ci0gICAgTnVtZXJpY2FsIHVuZGVyZmxvdyB3aXRoIHJlc3VsdCByb3VuZGVkIHRvIHplcm8uCi0KLSAgICBPY2N1cnMgd2hlbiBhIHN1Ym5vcm1hbCByZXN1bHQgaXMgcHVzaGVkIHRvIHplcm8gYnkgcm91bmRpbmcuCi0gICAgXGNsYXNze0luZXhhY3R9IGFuZCBcY2xhc3N7U3Vibm9ybWFsfSBhcmUgYWxzbyBzaWduYWxlZC4KLVxlbmR7Y2xhc3NkZXNjKn0KLQotVGhlIGZvbGxvd2luZyB0YWJsZSBzdW1tYXJpemVzIHRoZSBoaWVyYXJjaHkgb2Ygc2lnbmFsczoKLQotXGJlZ2lue3ZlcmJhdGltfSAgICAKLSAgICBleGNlcHRpb25zLkFyaXRobWV0aWNFcnJvcihleGNlcHRpb25zLkV4Y2VwdGlvbikKLSAgICAgICAgRGVjaW1hbEV4Y2VwdGlvbgotICAgICAgICAgICAgQ2xhbXBlZAotICAgICAgICAgICAgRGl2aXNpb25CeVplcm8oRGVjaW1hbEV4Y2VwdGlvbiwgZXhjZXB0aW9ucy5aZXJvRGl2aXNpb25FcnJvcikKLSAgICAgICAgICAgIEluZXhhY3QKLSAgICAgICAgICAgICAgICBPdmVyZmxvdyhJbmV4YWN0LCBSb3VuZGVkKQotICAgICAgICAgICAgICAgIFVuZGVyZmxvdyhJbmV4YWN0LCBSb3VuZGVkLCBTdWJub3JtYWwpCi0gICAgICAgICAgICBJbnZhbGlkT3BlcmF0aW9uCi0gICAgICAgICAgICBSb3VuZGVkCi0gICAgICAgICAgICBTdWJub3JtYWwKLVxlbmR7dmVyYmF0aW19ICAgICAgICAgICAgCi0KLQotJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCi1cc3Vic2VjdGlvbntGbG9hdGluZyBQb2ludCBOb3RlcyBcbGFiZWx7ZGVjaW1hbC1ub3Rlc319Ci0KLVxzdWJzdWJzZWN0aW9ue01pdGlnYXRpbmcgcm91bmQtb2ZmIGVycm9yIHdpdGggaW5jcmVhc2VkIHByZWNpc2lvbn0KLQotVGhlIHVzZSBvZiBkZWNpbWFsIGZsb2F0aW5nIHBvaW50IGVsaW1pbmF0ZXMgZGVjaW1hbCByZXByZXNlbnRhdGlvbiBlcnJvcgotKG1ha2luZyBpdCBwb3NzaWJsZSB0byByZXByZXNlbnQgXGNvbnN0YW50ezAuMX0gZXhhY3RseSk7IGhvd2V2ZXIsIHNvbWUKLW9wZXJhdGlvbnMgY2FuIHN0aWxsIGluY3VyIHJvdW5kLW9mZiBlcnJvciB3aGVuIG5vbi16ZXJvIGRpZ2l0cyBleGNlZWQgdGhlCi1maXhlZCBwcmVjaXNpb24uCi0KLVRoZSBlZmZlY3RzIG9mIHJvdW5kLW9mZiBlcnJvciBjYW4gYmUgYW1wbGlmaWVkIGJ5IHRoZSBhZGRpdGlvbiBvciBzdWJ0cmFjdGlvbgotb2YgbmVhcmx5IG9mZnNldHRpbmcgcXVhbnRpdGllcyByZXN1bHRpbmcgaW4gbG9zcyBvZiBzaWduaWZpY2FuY2UuICBLbnV0aAotcHJvdmlkZXMgdHdvIGluc3RydWN0aXZlIGV4YW1wbGVzIHdoZXJlIHJvdW5kZWQgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYyB3aXRoCi1pbnN1ZmZpY2llbnQgcHJlY2lzaW9uIGNhdXNlcyB0aGUgYnJlYWtkb3duIG9mIHRoZSBhc3NvY2lhdGl2ZSBhbmQKLWRpc3RyaWJ1dGl2ZSBwcm9wZXJ0aWVzIG9mIGFkZGl0aW9uOgotCi1cYmVnaW57dmVyYmF0aW19Ci0jIEV4YW1wbGVzIGZyb20gU2VtaW51bWVyaWNhbCBBbGdvcml0aG1zLCBTZWN0aW9uIDQuMi4yLgotPj4+IGZyb20gZGVjaW1hbCBpbXBvcnQgRGVjaW1hbCwgZ2V0Y29udGV4dAotPj4+IGdldGNvbnRleHQoKS5wcmVjID0gOAotCi0+Pj4gdSwgdiwgdyA9IERlY2ltYWwoMTExMTExMTMpLCBEZWNpbWFsKC0xMTExMTExMSksIERlY2ltYWwoJzcuNTExMTExMTEnKQotPj4+ICh1ICsgdikgKyB3Ci1EZWNpbWFsKCI5LjUxMTExMTEiKQotPj4+IHUgKyAodiArIHcpCi1EZWNpbWFsKCIxMCIpCi0KLT4+PiB1LCB2LCB3ID0gRGVjaW1hbCgyMDAwMCksIERlY2ltYWwoLTYpLCBEZWNpbWFsKCc2LjAwMDAwMDMnKQotPj4+ICh1KnYpICsgKHUqdykKLURlY2ltYWwoIjAuMDEiKQotPj4+IHUgKiAodit3KQotRGVjaW1hbCgiMC4wMDYwMDAwIikKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBcbW9kdWxle2RlY2ltYWx9IG1vZHVsZSBtYWtlcyBpdCBwb3NzaWJsZSB0byByZXN0b3JlIHRoZSBpZGVudGl0aWVzCi1ieSBleHBhbmRpbmcgdGhlIHByZWNpc2lvbiBzdWZmaWNpZW50bHkgdG8gYXZvaWQgbG9zcyBvZiBzaWduaWZpY2FuY2U6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBnZXRjb250ZXh0KCkucHJlYyA9IDIwCi0+Pj4gdSwgdiwgdyA9IERlY2ltYWwoMTExMTExMTMpLCBEZWNpbWFsKC0xMTExMTExMSksIERlY2ltYWwoJzcuNTExMTExMTEnKQotPj4+ICh1ICsgdikgKyB3Ci1EZWNpbWFsKCI5LjUxMTExMTExIikKLT4+PiB1ICsgKHYgKyB3KQotRGVjaW1hbCgiOS41MTExMTExMSIpCi0+Pj4gCi0+Pj4gdSwgdiwgdyA9IERlY2ltYWwoMjAwMDApLCBEZWNpbWFsKC02KSwgRGVjaW1hbCgnNi4wMDAwMDAzJykKLT4+PiAodSp2KSArICh1KncpCi1EZWNpbWFsKCIwLjAwNjAwMDAiKQotPj4+IHUgKiAodit3KQotRGVjaW1hbCgiMC4wMDYwMDAwIikKLVxlbmR7dmVyYmF0aW19Ci0KLVxzdWJzdWJzZWN0aW9ue1NwZWNpYWwgdmFsdWVzfQotCi1UaGUgbnVtYmVyIHN5c3RlbSBmb3IgdGhlIFxtb2R1bGV7ZGVjaW1hbH0gbW9kdWxlIHByb3ZpZGVzIHNwZWNpYWwKLXZhbHVlcyBpbmNsdWRpbmcgXGNvbnN0YW50e05hTn0sIFxjb25zdGFudHtzTmFOfSwgXGNvbnN0YW50ey1JbmZpbml0eX0sCi1cY29uc3RhbnR7SW5maW5pdHl9LCBhbmQgdHdvIHplcm9lcywgXGNvbnN0YW50eyswfSBhbmQgXGNvbnN0YW50ey0wfS4KLQotSW5maW5pdGllcyBjYW4gYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgd2l0aDogIFxjb2Rle0RlY2ltYWwoJ0luZmluaXR5Jyl9LiBBbHNvLAotdGhleSBjYW4gYXJpc2UgZnJvbSBkaXZpZGluZyBieSB6ZXJvIHdoZW4gdGhlIFxleGNlcHRpb257RGl2aXNpb25CeVplcm99Ci1zaWduYWwgaXMgbm90IHRyYXBwZWQuICBMaWtld2lzZSwgd2hlbiB0aGUgXGV4Y2VwdGlvbntPdmVyZmxvd30gc2lnbmFsIGlzIG5vdAotdHJhcHBlZCwgaW5maW5pdHkgY2FuIHJlc3VsdCBmcm9tIHJvdW5kaW5nIGJleW9uZCB0aGUgbGltaXRzIG9mIHRoZSBsYXJnZXN0Ci1yZXByZXNlbnRhYmxlIG51bWJlci4KLQotVGhlIGluZmluaXRpZXMgYXJlIHNpZ25lZCAoYWZmaW5lKSBhbmQgY2FuIGJlIHVzZWQgaW4gYXJpdGhtZXRpYyBvcGVyYXRpb25zCi13aGVyZSB0aGV5IGdldCB0cmVhdGVkIGFzIHZlcnkgbGFyZ2UsIGluZGV0ZXJtaW5hdGUgbnVtYmVycy4gIEZvciBpbnN0YW5jZSwKLWFkZGluZyBhIGNvbnN0YW50IHRvIGluZmluaXR5IGdpdmVzIGFub3RoZXIgaW5maW5pdGUgcmVzdWx0LgotCi1Tb21lIG9wZXJhdGlvbnMgYXJlIGluZGV0ZXJtaW5hdGUgYW5kIHJldHVybiBcY29uc3RhbnR7TmFOfSwgb3IgaWYgdGhlCi1cZXhjZXB0aW9ue0ludmFsaWRPcGVyYXRpb259IHNpZ25hbCBpcyB0cmFwcGVkLCByYWlzZSBhbiBleGNlcHRpb24uICBGb3IKLWV4YW1wbGUsIFxjb2RlezAvMH0gcmV0dXJucyBcY29uc3RhbnR7TmFOfSB3aGljaCBtZWFucyBgYG5vdCBhIG51bWJlcicnLiAgVGhpcwotdmFyaWV0eSBvZiBcY29uc3RhbnR7TmFOfSBpcyBxdWlldCBhbmQsIG9uY2UgY3JlYXRlZCwgd2lsbCBmbG93IHRocm91Z2ggb3RoZXIKLWNvbXB1dGF0aW9ucyBhbHdheXMgcmVzdWx0aW5nIGluIGFub3RoZXIgXGNvbnN0YW50e05hTn0uICBUaGlzIGJlaGF2aW9yIGNhbiBiZQotdXNlZnVsIGZvciBhIHNlcmllcyBvZiBjb21wdXRhdGlvbnMgdGhhdCBvY2Nhc2lvbmFsbHkgaGF2ZSBtaXNzaW5nIGlucHV0cyAtLS0KLWl0IGFsbG93cyB0aGUgY2FsY3VsYXRpb24gdG8gcHJvY2VlZCB3aGlsZSBmbGFnZ2luZyBzcGVjaWZpYyByZXN1bHRzIGFzCi1pbnZhbGlkLiAgICAgCi0KLUEgdmFyaWFudCBpcyBcY29uc3RhbnR7c05hTn0gd2hpY2ggc2lnbmFscyByYXRoZXIgdGhhbiByZW1haW5pbmcgcXVpZXQKLWFmdGVyIGV2ZXJ5IG9wZXJhdGlvbi4gIFRoaXMgaXMgYSB1c2VmdWwgcmV0dXJuIHZhbHVlIHdoZW4gYW4gaW52YWxpZAotcmVzdWx0IG5lZWRzIHRvIGludGVycnVwdCBhIGNhbGN1bGF0aW9uIGZvciBzcGVjaWFsIGhhbmRsaW5nLgotCi1UaGUgc2lnbmVkIHplcm9zIGNhbiByZXN1bHQgZnJvbSBjYWxjdWxhdGlvbnMgdGhhdCB1bmRlcmZsb3cuCi1UaGV5IGtlZXAgdGhlIHNpZ24gdGhhdCB3b3VsZCBoYXZlIHJlc3VsdGVkIGlmIHRoZSBjYWxjdWxhdGlvbiBoYWQKLWJlZW4gY2FycmllZCBvdXQgdG8gZ3JlYXRlciBwcmVjaXNpb24uICBTaW5jZSB0aGVpciBtYWduaXR1ZGUgaXMKLXplcm8sIGJvdGggcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHplcm9zIGFyZSB0cmVhdGVkIGFzIGVxdWFsIGFuZCB0aGVpcgotc2lnbiBpcyBpbmZvcm1hdGlvbmFsLgotCi1JbiBhZGRpdGlvbiB0byB0aGUgdHdvIHNpZ25lZCB6ZXJvcyB3aGljaCBhcmUgZGlzdGluY3QgeWV0IGVxdWFsLAotdGhlcmUgYXJlIHZhcmlvdXMgcmVwcmVzZW50YXRpb25zIG9mIHplcm8gd2l0aCBkaWZmZXJpbmcgcHJlY2lzaW9ucwoteWV0IGVxdWl2YWxlbnQgaW4gdmFsdWUuICBUaGlzIHRha2VzIGEgYml0IG9mIGdldHRpbmcgdXNlZCB0by4gIEZvcgotYW4gZXllIGFjY3VzdG9tZWQgdG8gbm9ybWFsaXplZCBmbG9hdGluZyBwb2ludCByZXByZXNlbnRhdGlvbnMsIGl0Ci1pcyBub3QgaW1tZWRpYXRlbHkgb2J2aW91cyB0aGF0IHRoZSBmb2xsb3dpbmcgY2FsY3VsYXRpb24gcmV0dXJucwotYSB2YWx1ZSBlcXVhbCB0byB6ZXJvOiAgICAgICAgICAKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IDEgLyBEZWNpbWFsKCdJbmZpbml0eScpCi1EZWNpbWFsKCIwRS0xMDAwMDAwMDI2IikKLVxlbmR7dmVyYmF0aW19Ci0KLSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQotXHN1YnNlY3Rpb257V29ya2luZyB3aXRoIHRocmVhZHMgXGxhYmVse2RlY2ltYWwtdGhyZWFkc319Ci0KLVRoZSBcZnVuY3Rpb257Z2V0Y29udGV4dCgpfSBmdW5jdGlvbiBhY2Nlc3NlcyBhIGRpZmZlcmVudCBcY2xhc3N7Q29udGV4dH0KLW9iamVjdCBmb3IgZWFjaCB0aHJlYWQuICBIYXZpbmcgc2VwYXJhdGUgdGhyZWFkIGNvbnRleHRzIG1lYW5zIHRoYXQgdGhyZWFkcwotbWF5IG1ha2UgY2hhbmdlcyAoc3VjaCBhcyBcY29kZXtnZXRjb250ZXh0LnByZWM9MTB9KSB3aXRob3V0IGludGVyZmVyaW5nIHdpdGgKLW90aGVyIHRocmVhZHMuCi0KLUxpa2V3aXNlLCB0aGUgXGZ1bmN0aW9ue3NldGNvbnRleHQoKX0gZnVuY3Rpb24gYXV0b21hdGljYWxseSBhc3NpZ25zIGl0cyB0YXJnZXQKLXRvIHRoZSBjdXJyZW50IHRocmVhZC4KLQotSWYgXGZ1bmN0aW9ue3NldGNvbnRleHQoKX0gaGFzIG5vdCBiZWVuIGNhbGxlZCBiZWZvcmUgXGZ1bmN0aW9ue2dldGNvbnRleHQoKX0sCi10aGVuIFxmdW5jdGlvbntnZXRjb250ZXh0KCl9IHdpbGwgYXV0b21hdGljYWxseSBjcmVhdGUgYSBuZXcgY29udGV4dCBmb3IgdXNlCi1pbiB0aGUgY3VycmVudCB0aHJlYWQuCi0KLVRoZSBuZXcgY29udGV4dCBpcyBjb3BpZWQgZnJvbSBhIHByb3RvdHlwZSBjb250ZXh0IGNhbGxlZAotXHZhcntEZWZhdWx0Q29udGV4dH0uIFRvIGNvbnRyb2wgdGhlIGRlZmF1bHRzIHNvIHRoYXQgZWFjaCB0aHJlYWQgd2lsbCB1c2UgdGhlCi1zYW1lIHZhbHVlcyB0aHJvdWdob3V0IHRoZSBhcHBsaWNhdGlvbiwgZGlyZWN0bHkgbW9kaWZ5IHRoZQotXHZhcntEZWZhdWx0Q29udGV4dH0gb2JqZWN0LiBUaGlzIHNob3VsZCBiZSBkb25lIFxlbXBoe2JlZm9yZX0gYW55IHRocmVhZHMgYXJlCi1zdGFydGVkIHNvIHRoYXQgdGhlcmUgd29uJ3QgYmUgYSByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIHRocmVhZHMgY2FsbGluZwotXGZ1bmN0aW9ue2dldGNvbnRleHQoKX0uIEZvciBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0jIFNldCBhcHBsaWNhdGlvbndpZGUgZGVmYXVsdHMgZm9yIGFsbCB0aHJlYWRzIGFib3V0IHRvIGJlIGxhdW5jaGVkCi1EZWZhdWx0Q29udGV4dC5wcmVjID0gMTIKLURlZmF1bHRDb250ZXh0LnJvdW5kaW5nID0gUk9VTkRfRE9XTgotRGVmYXVsdENvbnRleHQudHJhcHMgPSBFeHRlbmRlZENvbnRleHQudHJhcHMuY29weSgpCi1EZWZhdWx0Q29udGV4dC50cmFwc1tJbnZhbGlkT3BlcmF0aW9uXSA9IDEKLXNldGNvbnRleHQoRGVmYXVsdENvbnRleHQpCi0KLSMgQWZ0ZXJ3YXJkcywgdGhlIHRocmVhZHMgY2FuIGJlIHN0YXJ0ZWQKLXQxLnN0YXJ0KCkKLXQyLnN0YXJ0KCkKLXQzLnN0YXJ0KCkKLSAuIC4gLgotXGVuZHt2ZXJiYXRpbX0KLQotCi0KLSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQotXHN1YnNlY3Rpb257UmVjaXBlcyBcbGFiZWx7ZGVjaW1hbC1yZWNpcGVzfX0KLQotSGVyZSBhcmUgYSBmZXcgcmVjaXBlcyB0aGF0IHNlcnZlIGFzIHV0aWxpdHkgZnVuY3Rpb25zIGFuZCB0aGF0IGRlbW9uc3RyYXRlCi13YXlzIHRvIHdvcmsgd2l0aCB0aGUgXGNsYXNze0RlY2ltYWx9IGNsYXNzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1kZWYgbW9uZXlmbXQodmFsdWUsIHBsYWNlcz0yLCBjdXJyPScnLCBzZXA9JywnLCBkcD0nLicsCi0gICAgICAgICAgICAgcG9zPScnLCBuZWc9Jy0nLCB0cmFpbG5lZz0nJyk6Ci0gICAgIiIiQ29udmVydCBEZWNpbWFsIHRvIGEgbW9uZXkgZm9ybWF0dGVkIHN0cmluZy4KLQotICAgIHBsYWNlczogIHJlcXVpcmVkIG51bWJlciBvZiBwbGFjZXMgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQKLSAgICBjdXJyOiAgICBvcHRpb25hbCBjdXJyZW5jeSBzeW1ib2wgYmVmb3JlIHRoZSBzaWduIChtYXkgYmUgYmxhbmspCi0gICAgc2VwOiAgICAgb3B0aW9uYWwgZ3JvdXBpbmcgc2VwYXJhdG9yIChjb21tYSwgcGVyaW9kLCBzcGFjZSwgb3IgYmxhbmspCi0gICAgZHA6ICAgICAgZGVjaW1hbCBwb2ludCBpbmRpY2F0b3IgKGNvbW1hIG9yIHBlcmlvZCkKLSAgICAgICAgICAgICBvbmx5IHNwZWNpZnkgYXMgYmxhbmsgd2hlbiBwbGFjZXMgaXMgemVybwotICAgIHBvczogICAgIG9wdGlvbmFsIHNpZ24gZm9yIHBvc2l0aXZlIG51bWJlcnM6ICcrJywgc3BhY2Ugb3IgYmxhbmsKLSAgICBuZWc6ICAgICBvcHRpb25hbCBzaWduIGZvciBuZWdhdGl2ZSBudW1iZXJzOiAnLScsICcoJywgc3BhY2Ugb3IgYmxhbmsKLSAgICB0cmFpbG5lZzpvcHRpb25hbCB0cmFpbGluZyBtaW51cyBpbmRpY2F0b3I6ICAnLScsICcpJywgc3BhY2Ugb3IgYmxhbmsKLQotICAgID4+PiBkID0gRGVjaW1hbCgnLTEyMzQ1NjcuODkwMScpCi0gICAgPj4+IG1vbmV5Zm10KGQsIGN1cnI9JyQnKQotICAgICctJDEsMjM0LDU2Ny44OScKLSAgICA+Pj4gbW9uZXlmbXQoZCwgcGxhY2VzPTAsIHNlcD0nLicsIGRwPScnLCBuZWc9JycsIHRyYWlsbmVnPSctJykKLSAgICAnMS4yMzQuNTY4LScKLSAgICA+Pj4gbW9uZXlmbXQoZCwgY3Vycj0nJCcsIG5lZz0nKCcsIHRyYWlsbmVnPScpJykKLSAgICAnKCQxLDIzNCw1NjcuODkpJwotICAgID4+PiBtb25leWZtdChEZWNpbWFsKDEyMzQ1Njc4OSksIHNlcD0nICcpCi0gICAgJzEyMyA0NTYgNzg5LjAwJwotICAgID4+PiBtb25leWZtdChEZWNpbWFsKCctMC4wMicpLCBuZWc9JzwnLCB0cmFpbG5lZz0nPicpCi0gICAgJzwuMDI+JwotCi0gICAgIiIiCi0gICAgcSA9IERlY2ltYWwoKDAsICgxLCksIC1wbGFjZXMpKSAgICAjIDIgcGxhY2VzIC0tPiAnMC4wMScKLSAgICBzaWduLCBkaWdpdHMsIGV4cCA9IHZhbHVlLnF1YW50aXplKHEpLmFzX3R1cGxlKCkKLSAgICBhc3NlcnQgZXhwID09IC1wbGFjZXMgICAgCi0gICAgcmVzdWx0ID0gW10KLSAgICBkaWdpdHMgPSBtYXAoc3RyLCBkaWdpdHMpCi0gICAgYnVpbGQsIG5leHQgPSByZXN1bHQuYXBwZW5kLCBkaWdpdHMucG9wCi0gICAgaWYgc2lnbjoKLSAgICAgICAgYnVpbGQodHJhaWxuZWcpCi0gICAgZm9yIGkgaW4gcmFuZ2UocGxhY2VzKToKLSAgICAgICAgaWYgZGlnaXRzOgotICAgICAgICAgICAgYnVpbGQobmV4dCgpKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgYnVpbGQoJzAnKQotICAgIGJ1aWxkKGRwKQotICAgIGkgPSAwCi0gICAgd2hpbGUgZGlnaXRzOgotICAgICAgICBidWlsZChuZXh0KCkpCi0gICAgICAgIGkgKz0gMQotICAgICAgICBpZiBpID09IDMgYW5kIGRpZ2l0czoKLSAgICAgICAgICAgIGkgPSAwCi0gICAgICAgICAgICBidWlsZChzZXApCi0gICAgYnVpbGQoY3VycikKLSAgICBpZiBzaWduOgotICAgICAgICBidWlsZChuZWcpCi0gICAgZWxzZToKLSAgICAgICAgYnVpbGQocG9zKQotICAgIHJlc3VsdC5yZXZlcnNlKCkKLSAgICByZXR1cm4gJycuam9pbihyZXN1bHQpCi0KLWRlZiBwaSgpOgotICAgICIiIkNvbXB1dGUgUGkgdG8gdGhlIGN1cnJlbnQgcHJlY2lzaW9uLgotCi0gICAgPj4+IHByaW50IHBpKCkKLSAgICAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MwotICAgIAotICAgICIiIgotICAgIGdldGNvbnRleHQoKS5wcmVjICs9IDIgICMgZXh0cmEgZGlnaXRzIGZvciBpbnRlcm1lZGlhdGUgc3RlcHMKLSAgICB0aHJlZSA9IERlY2ltYWwoMykgICAgICAjIHN1YnN0aXR1dGUgInRocmVlPTMuMCIgZm9yIHJlZ3VsYXIgZmxvYXRzCi0gICAgbGFzdHMsIHQsIHMsIG4sIG5hLCBkLCBkYSA9IDAsIHRocmVlLCAzLCAxLCAwLCAwLCAyNAotICAgIHdoaWxlIHMgIT0gbGFzdHM6Ci0gICAgICAgIGxhc3RzID0gcwotICAgICAgICBuLCBuYSA9IG4rbmEsIG5hKzgKLSAgICAgICAgZCwgZGEgPSBkK2RhLCBkYSszMgotICAgICAgICB0ID0gKHQgKiBuKSAvIGQKLSAgICAgICAgcyArPSB0Ci0gICAgZ2V0Y29udGV4dCgpLnByZWMgLT0gMgotICAgIHJldHVybiArcyAgICAgICAgICAgICAgICMgdW5hcnkgcGx1cyBhcHBsaWVzIHRoZSBuZXcgcHJlY2lzaW9uCi0KLWRlZiBleHAoeCk6Ci0gICAgIiIiUmV0dXJuIGUgcmFpc2VkIHRvIHRoZSBwb3dlciBvZiB4LiAgUmVzdWx0IHR5cGUgbWF0Y2hlcyBpbnB1dCB0eXBlLgotCi0gICAgPj4+IHByaW50IGV4cChEZWNpbWFsKDEpKQotICAgIDIuNzE4MjgxODI4NDU5MDQ1MjM1MzYwMjg3NDcxCi0gICAgPj4+IHByaW50IGV4cChEZWNpbWFsKDIpKQotICAgIDcuMzg5MDU2MDk4OTMwNjUwMjI3MjMwNDI3NDYxCi0gICAgPj4+IHByaW50IGV4cCgyLjApCi0gICAgNy4zODkwNTYwOTg5MwotICAgID4+PiBwcmludCBleHAoMiswaikKLSAgICAoNy4zODkwNTYwOTg5MyswaikKLSAgICAKLSAgICAiIiIKLSAgICBnZXRjb250ZXh0KCkucHJlYyArPSAyCi0gICAgaSwgbGFzdHMsIHMsIGZhY3QsIG51bSA9IDAsIDAsIDEsIDEsIDEKLSAgICB3aGlsZSBzICE9IGxhc3RzOgotICAgICAgICBsYXN0cyA9IHMgICAgCi0gICAgICAgIGkgKz0gMQotICAgICAgICBmYWN0ICo9IGkKLSAgICAgICAgbnVtICo9IHggICAgIAotICAgICAgICBzICs9IG51bSAvIGZhY3QgICAKLSAgICBnZXRjb250ZXh0KCkucHJlYyAtPSAyICAgICAgICAKLSAgICByZXR1cm4gK3MKLQotZGVmIGNvcyh4KToKLSAgICAiIiJSZXR1cm4gdGhlIGNvc2luZSBvZiB4IGFzIG1lYXN1cmVkIGluIHJhZGlhbnMuCi0KLSAgICA+Pj4gcHJpbnQgY29zKERlY2ltYWwoJzAuNScpKQotICAgIDAuODc3NTgyNTYxODkwMzcyNzE2MTE2MjgxNTgyNgotICAgID4+PiBwcmludCBjb3MoMC41KQotICAgIDAuODc3NTgyNTYxODkKLSAgICA+Pj4gcHJpbnQgY29zKDAuNSswaikKLSAgICAoMC44Nzc1ODI1NjE4OSswaikKLSAgICAKLSAgICAiIiIKLSAgICBnZXRjb250ZXh0KCkucHJlYyArPSAyCi0gICAgaSwgbGFzdHMsIHMsIGZhY3QsIG51bSwgc2lnbiA9IDAsIDAsIDEsIDEsIDEsIDEKLSAgICB3aGlsZSBzICE9IGxhc3RzOgotICAgICAgICBsYXN0cyA9IHMgICAgCi0gICAgICAgIGkgKz0gMgotICAgICAgICBmYWN0ICo9IGkgKiAoaS0xKQotICAgICAgICBudW0gKj0geCAqIHgKLSAgICAgICAgc2lnbiAqPSAtMQotICAgICAgICBzICs9IG51bSAvIGZhY3QgKiBzaWduIAotICAgIGdldGNvbnRleHQoKS5wcmVjIC09IDIgICAgICAgIAotICAgIHJldHVybiArcwotCi1kZWYgc2luKHgpOgotICAgICIiIlJldHVybiB0aGUgc2luZSBvZiB4IGFzIG1lYXN1cmVkIGluIHJhZGlhbnMuCi0KLSAgICA+Pj4gcHJpbnQgc2luKERlY2ltYWwoJzAuNScpKQotICAgIDAuNDc5NDI1NTM4NjA0MjAzMDAwMjczMjg3OTM1MgotICAgID4+PiBwcmludCBzaW4oMC41KQotICAgIDAuNDc5NDI1NTM4NjA0Ci0gICAgPj4+IHByaW50IHNpbigwLjUrMGopCi0gICAgKDAuNDc5NDI1NTM4NjA0KzBqKQotICAgIAotICAgICIiIgotICAgIGdldGNvbnRleHQoKS5wcmVjICs9IDIKLSAgICBpLCBsYXN0cywgcywgZmFjdCwgbnVtLCBzaWduID0gMSwgMCwgeCwgMSwgeCwgMQotICAgIHdoaWxlIHMgIT0gbGFzdHM6Ci0gICAgICAgIGxhc3RzID0gcyAgICAKLSAgICAgICAgaSArPSAyCi0gICAgICAgIGZhY3QgKj0gaSAqIChpLTEpCi0gICAgICAgIG51bSAqPSB4ICogeAotICAgICAgICBzaWduICo9IC0xCi0gICAgICAgIHMgKz0gbnVtIC8gZmFjdCAqIHNpZ24gCi0gICAgZ2V0Y29udGV4dCgpLnByZWMgLT0gMiAgICAgICAgCi0gICAgcmV0dXJuICtzCi0KLVxlbmR7dmVyYmF0aW19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0lJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKLVxzdWJzZWN0aW9ue0RlY2ltYWwgRkFRIFxsYWJlbHtkZWNpbWFsLWZhcX19Ci0KLVEuICBJdCBpcyBjdW1iZXJzb21lIHRvIHR5cGUgXGNvZGV7ZGVjaW1hbC5EZWNpbWFsKCcxMjM0LjUnKX0uICBJcyB0aGVyZSBhIHdheQotdG8gbWluaW1pemUgdHlwaW5nIHdoZW4gdXNpbmcgdGhlIGludGVyYWN0aXZlIGludGVycHJldGVyPwotCi1BLiAgU29tZSB1c2VycyBhYmJyZXZpYXRlIHRoZSBjb25zdHJ1Y3RvciB0byBqdXN0IGEgc2luZ2xlIGxldHRlcjoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IEQgPSBkZWNpbWFsLkRlY2ltYWwKLT4+PiBEKCcxLjIzJykgKyBEKCczLjQ1JykKLURlY2ltYWwoIjQuNjgiKQotXGVuZHt2ZXJiYXRpbX0KLQotCi1RLiAgSW4gYSBmaXhlZC1wb2ludCBhcHBsaWNhdGlvbiB3aXRoIHR3byBkZWNpbWFsIHBsYWNlcywgc29tZSBpbnB1dHMKLWhhdmUgbWFueSBwbGFjZXMgYW5kIG5lZWQgdG8gYmUgcm91bmRlZC4gIE90aGVycyBhcmUgbm90IHN1cHBvc2VkIHRvIGhhdmUKLWV4Y2VzcyBkaWdpdHMgYW5kIG5lZWQgdG8gYmUgdmFsaWRhdGVkLiAgV2hhdCBtZXRob2RzIHNob3VsZCBiZSB1c2VkPwotCi1BLiAgVGhlIFxtZXRob2R7cXVhbnRpemUoKX0gbWV0aG9kIHJvdW5kcyB0byBhIGZpeGVkIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcy4KLUlmIHRoZSBcY29uc3RhbnR7SW5leGFjdH0gdHJhcCBpcyBzZXQsIGl0IGlzIGFsc28gdXNlZnVsIGZvciB2YWxpZGF0aW9uOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gVFdPUExBQ0VTID0gRGVjaW1hbCgxMCkgKiogLTIgICAgICAgIyBzYW1lIGFzIERlY2ltYWwoJzAuMDEnKQotCi0+Pj4gIyBSb3VuZCB0byB0d28gcGxhY2VzCi0+Pj4gRGVjaW1hbCgiMy4yMTQiKS5xdWFudGl6ZShUV09QTEFDRVMpCi1EZWNpbWFsKCIzLjIxIikKLQotPj4+ICMgVmFsaWRhdGUgdGhhdCBhIG51bWJlciBkb2VzIG5vdCBleGNlZWQgdHdvIHBsYWNlcyAKLT4+PiBEZWNpbWFsKCIzLjIxIikucXVhbnRpemUoVFdPUExBQ0VTLCBjb250ZXh0PUNvbnRleHQodHJhcHM9W0luZXhhY3RdKSkKLURlY2ltYWwoIjMuMjEiKQotCi0+Pj4gRGVjaW1hbCgiMy4yMTQiKS5xdWFudGl6ZShUV09QTEFDRVMsIGNvbnRleHQ9Q29udGV4dCh0cmFwcz1bSW5leGFjdF0pKQotVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICAgLi4uCi1JbmV4YWN0OiBDaGFuZ2VkIGluIHJvdW5kaW5nCi1cZW5ke3ZlcmJhdGltfQotCi0KLVEuICBPbmNlIEkgaGF2ZSB2YWxpZCB0d28gcGxhY2UgaW5wdXRzLCBob3cgZG8gSSBtYWludGFpbiB0aGF0IGludmFyaWFudAotdGhyb3VnaG91dCBhbiBhcHBsaWNhdGlvbj8KLQotQS4gIFNvbWUgb3BlcmF0aW9ucyBsaWtlIGFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbiBhdXRvbWF0aWNhbGx5IHByZXNlcnZlIGZpeGVkCi1wb2ludC4gIE90aGVycywgbGlrZSBtdWx0aXBsaWNhdGlvbiBhbmQgZGl2aXNpb24sIGNoYW5nZSB0aGUgbnVtYmVyIG9mIGRlY2ltYWwKLXBsYWNlcyBhbmQgbmVlZCB0byBiZSBmb2xsb3dlZC11cCB3aXRoIGEgXG1ldGhvZHtxdWFudGl6ZSgpfSBzdGVwLgotCi0KLVEuICBUaGVyZSBhcmUgbWFueSB3YXlzIHRvIGV4cHJlc3MgdGhlIHNhbWUgdmFsdWUuICBUaGUgbnVtYmVycwotXGNvbnN0YW50ezIwMH0sIFxjb25zdGFudHsyMDAuMDAwfSwgXGNvbnN0YW50ezJFMn0sIGFuZCBcY29uc3RhbnR7LjAyRSs0fSBhbGwKLWhhdmUgdGhlIHNhbWUgdmFsdWUgYXQgdmFyaW91cyBwcmVjaXNpb25zLiBJcyB0aGVyZSBhIHdheSB0byB0cmFuc2Zvcm0gdGhlbSB0bwotYSBzaW5nbGUgcmVjb2duaXphYmxlIGNhbm9uaWNhbCB2YWx1ZT8KLQotQS4gIFRoZSBcbWV0aG9ke25vcm1hbGl6ZSgpfSBtZXRob2QgbWFwcyBhbGwgZXF1aXZhbGVudCB2YWx1ZXMgdG8gYSBzaW5nbGUKLXJlcHJlc2VudGF0aXZlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gdmFsdWVzID0gbWFwKERlY2ltYWwsICcyMDAgMjAwLjAwMCAyRTIgLjAyRSs0Jy5zcGxpdCgpKQotPj4+IFt2Lm5vcm1hbGl6ZSgpIGZvciB2IGluIHZhbHVlc10KLVtEZWNpbWFsKCIyRSsyIiksIERlY2ltYWwoIjJFKzIiKSwgRGVjaW1hbCgiMkUrMiIpLCBEZWNpbWFsKCIyRSsyIildCi1cZW5ke3ZlcmJhdGltfQotCi0KLVEuICBTb21lIGRlY2ltYWwgdmFsdWVzIGFsd2F5cyBwcmludCB3aXRoIGV4cG9uZW50aWFsIG5vdGF0aW9uLiAgSXMgdGhlcmUKLWEgd2F5IHRvIGdldCBhIG5vbi1leHBvbmVudGlhbCByZXByZXNlbnRhdGlvbj8KLQotQS4gIEZvciBzb21lIHZhbHVlcywgZXhwb25lbnRpYWwgbm90YXRpb24gaXMgdGhlIG9ubHkgd2F5IHRvIGV4cHJlc3MKLXRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgcGxhY2VzIGluIHRoZSBjb2VmZmljaWVudC4gIEZvciBleGFtcGxlLAotZXhwcmVzc2luZyBcY29uc3RhbnR7NS4wRSszfSBhcyBcY29uc3RhbnR7NTAwMH0ga2VlcHMgdGhlIHZhbHVlCi1jb25zdGFudCBidXQgY2Fubm90IHNob3cgdGhlIG9yaWdpbmFsJ3MgdHdvLXBsYWNlIHNpZ25pZmljYW5jZS4KLQotCi1RLiAgSXMgdGhlcmUgYSB3YXkgdG8gY29udmVydCBhIHJlZ3VsYXIgZmxvYXQgdG8gYSBcY2xhc3N7RGVjaW1hbH0/Ci0KLUEuICBZZXMsIGFsbCBiaW5hcnkgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBjYW4gYmUgZXhhY3RseSBleHByZXNzZWQgYXMgYQotRGVjaW1hbC4gIEFuIGV4YWN0IGNvbnZlcnNpb24gbWF5IHRha2UgbW9yZSBwcmVjaXNpb24gdGhhbiBpbnR1aXRpb24gd291bGQKLXN1Z2dlc3QsIHNvIHRyYXBwaW5nIFxjb25zdGFudHtJbmV4YWN0fSB3aWxsIHNpZ25hbCBhIG5lZWQgZm9yIG1vcmUgcHJlY2lzaW9uOgotCi1cYmVnaW57dmVyYmF0aW19Ci1kZWYgZmxvYXRUb0RlY2ltYWwoZik6Ci0gICAgIkNvbnZlcnQgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgdG8gYSBEZWNpbWFsIHdpdGggbm8gbG9zcyBvZiBpbmZvcm1hdGlvbiIKLSAgICAjIFRyYW5zZm9ybSAoZXhhY3RseSkgYSBmbG9hdCB0byBhIG1hbnRpc3NhICgwLjUgPD0gYWJzKG0pIDwgMS4wKSBhbmQgYW4KLSAgICAjIGV4cG9uZW50LiAgRG91YmxlIHRoZSBtYW50aXNzYSB1bnRpbCBpdCBpcyBhbiBpbnRlZ2VyLiAgVXNlIHRoZSBpbnRlZ2VyCi0gICAgIyBtYW50aXNzYSBhbmQgZXhwb25lbnQgdG8gY29tcHV0ZSBhbiBlcXVpdmFsZW50IERlY2ltYWwuICBJZiB0aGlzIGNhbm5vdAotICAgICMgYmUgZG9uZSBleGFjdGx5LCB0aGVuIHJldHJ5IHdpdGggbW9yZSBwcmVjaXNpb24uCi0KLSAgICBtYW50aXNzYSwgZXhwb25lbnQgPSBtYXRoLmZyZXhwKGYpCi0gICAgd2hpbGUgbWFudGlzc2EgIT0gaW50KG1hbnRpc3NhKToKLSAgICAgICAgbWFudGlzc2EgKj0gMi4wCi0gICAgICAgIGV4cG9uZW50IC09IDEKLSAgICBtYW50aXNzYSA9IGludChtYW50aXNzYSkKLQotICAgIG9sZGNvbnRleHQgPSBnZXRjb250ZXh0KCkKLSAgICBzZXRjb250ZXh0KENvbnRleHQodHJhcHM9W0luZXhhY3RdKSkKLSAgICB0cnk6Ci0gICAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICByZXR1cm4gbWFudGlzc2EgKiBEZWNpbWFsKDIpICoqIGV4cG9uZW50Ci0gICAgICAgICAgICBleGNlcHQgSW5leGFjdDoKLSAgICAgICAgICAgICAgICBnZXRjb250ZXh0KCkucHJlYyArPSAxCi0gICAgZmluYWxseToKLSAgICAgICAgc2V0Y29udGV4dChvbGRjb250ZXh0KQotXGVuZHt2ZXJiYXRpbX0KLQotCi1RLiAgV2h5IGlzbid0IHRoZSBcZnVuY3Rpb257ZmxvYXRUb0RlY2ltYWwoKX0gcm91dGluZSBpbmNsdWRlZCBpbiB0aGUgbW9kdWxlPwotCi1BLiAgVGhlcmUgaXMgc29tZSBxdWVzdGlvbiBhYm91dCB3aGV0aGVyIGl0IGlzIGFkdmlzYWJsZSB0byBtaXggYmluYXJ5IGFuZAotZGVjaW1hbCBmbG9hdGluZyBwb2ludC4gIEFsc28sIGl0cyB1c2UgcmVxdWlyZXMgc29tZSBjYXJlIHRvIGF2b2lkIHRoZQotcmVwcmVzZW50YXRpb24gaXNzdWVzIGFzc29jaWF0ZWQgd2l0aCBiaW5hcnkgZmxvYXRpbmcgcG9pbnQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBmbG9hdFRvRGVjaW1hbCgxLjEpCi1EZWNpbWFsKCIxLjEwMDAwMDAwMDAwMDAwMDA4ODgxNzg0MTk3MDAxMjUyMzIzMzg5MDUzMzQ0NzI2NTYyNSIpCi1cZW5ke3ZlcmJhdGltfQotCi0KLVEuICBXaXRoaW4gYSBjb21wbGV4IGNhbGN1bGF0aW9uLCBob3cgY2FuIEkgbWFrZSBzdXJlIHRoYXQgSSBoYXZlbid0IGdvdHRlbiBhCi1zcHVyaW91cyByZXN1bHQgYmVjYXVzZSBvZiBpbnN1ZmZpY2llbnQgcHJlY2lzaW9uIG9yIHJvdW5kaW5nIGFub21hbGllcy4KLQotQS4gIFRoZSBkZWNpbWFsIG1vZHVsZSBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgcmVzdWx0cy4gIEEgYmVzdCBwcmFjdGljZSBpcyB0bwotcmUtcnVuIGNhbGN1bGF0aW9ucyB1c2luZyBncmVhdGVyIHByZWNpc2lvbiBhbmQgd2l0aCB2YXJpb3VzIHJvdW5kaW5nIG1vZGVzLgotV2lkZWx5IGRpZmZlcmluZyByZXN1bHRzIGluZGljYXRlIGluc3VmZmljaWVudCBwcmVjaXNpb24sIHJvdW5kaW5nIG1vZGUKLWlzc3VlcywgaWxsLWNvbmRpdGlvbmVkIGlucHV0cywgb3IgYSBudW1lcmljYWxseSB1bnN0YWJsZSBhbGdvcml0aG0uCi0KLQotUS4gIEkgbm90aWNlZCB0aGF0IGNvbnRleHQgcHJlY2lzaW9uIGlzIGFwcGxpZWQgdG8gdGhlIHJlc3VsdHMgb2Ygb3BlcmF0aW9ucwotYnV0IG5vdCB0byB0aGUgaW5wdXRzLiAgSXMgdGhlcmUgYW55dGhpbmcgdG8gd2F0Y2ggb3V0IGZvciB3aGVuIG1peGluZwotdmFsdWVzIG9mIGRpZmZlcmVudCBwcmVjaXNpb25zPwotCi1BLiAgWWVzLiAgVGhlIHByaW5jaXBsZSBpcyB0aGF0IGFsbCB2YWx1ZXMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgZXhhY3QgYW5kIHNvCi1pcyB0aGUgYXJpdGhtZXRpYyBvbiB0aG9zZSB2YWx1ZXMuICBPbmx5IHRoZSByZXN1bHRzIGFyZSByb3VuZGVkLiAgVGhlCi1hZHZhbnRhZ2UgZm9yIGlucHV0cyBpcyB0aGF0IGBgd2hhdCB5b3UgdHlwZSBpcyB3aGF0IHlvdSBnZXQnJy4gIEEKLWRpc2FkdmFudGFnZSBpcyB0aGF0IHRoZSByZXN1bHRzIGNhbiBsb29rIG9kZCBpZiB5b3UgZm9yZ2V0IHRoYXQgdGhlIGlucHV0cwotaGF2ZW4ndCBiZWVuIHJvdW5kZWQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBnZXRjb250ZXh0KCkucHJlYyA9IDMKLT4+PiBEZWNpbWFsKCczLjEwNCcpICsgRCgnMi4xMDQnKQotRGVjaW1hbCgiNS4yMSIpCi0+Pj4gRGVjaW1hbCgnMy4xMDQnKSArIEQoJzAuMDAwJykgKyBEKCcyLjEwNCcpCi1EZWNpbWFsKCI1LjIwIikKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBzb2x1dGlvbiBpcyBlaXRoZXIgdG8gaW5jcmVhc2UgcHJlY2lzaW9uIG9yIHRvIGZvcmNlIHJvdW5kaW5nIG9mIGlucHV0cwotdXNpbmcgdGhlIHVuYXJ5IHBsdXMgb3BlcmF0aW9uOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZ2V0Y29udGV4dCgpLnByZWMgPSAzCi0+Pj4gK0RlY2ltYWwoJzEuMjM0NTY3ODknKSAgICAgICMgdW5hcnkgcGx1cyB0cmlnZ2VycyByb3VuZGluZwotRGVjaW1hbCgiMS4yMyIpCi1cZW5ke3ZlcmJhdGltfQotCi1BbHRlcm5hdGl2ZWx5LCBpbnB1dHMgY2FuIGJlIHJvdW5kZWQgdXBvbiBjcmVhdGlvbiB1c2luZyB0aGUKLVxtZXRob2R7Q29udGV4dC5jcmVhdGVfZGVjaW1hbCgpfSBtZXRob2Q6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBDb250ZXh0KHByZWM9NSwgcm91bmRpbmc9Uk9VTkRfRE9XTikuY3JlYXRlX2RlY2ltYWwoJzEuMjM0NTY3OCcpCi1EZWNpbWFsKCIxLjIzNDUiKQotXGVuZHt2ZXJiYXRpbX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliZGlmZmxpYi50ZXggYi9Eb2MvbGliL2xpYmRpZmZsaWIudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmI4ZTkyLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGliZGlmZmxpYi50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw3MDQgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtkaWZmbGlifSAtLS0KLSAgICAgICAgIEhlbHBlcnMgZm9yIGNvbXB1dGluZyBkZWx0YXN9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtkaWZmbGlifQotXG1vZHVsZXN5bm9wc2lze0hlbHBlcnMgZm9yIGNvbXB1dGluZyBkaWZmZXJlbmNlcyBiZXR3ZWVuIG9iamVjdHMufQotXG1vZHVsZWF1dGhvcntUaW0gUGV0ZXJzfXt0aW1fb25lQHVzZXJzLnNvdXJjZWZvcmdlLm5ldH0KLVxzZWN0aW9uYXV0aG9ye1RpbSBQZXRlcnN9e3RpbV9vbmVAdXNlcnMuc291cmNlZm9yZ2UubmV0fQotJSBMYVRlWGlmaWNhdGlvbiBieSBGcmVkIEwuIERyYWtlLCBKci4gPGZkcmFrZUBhY20ub3JnPi4KLQotXHZlcnNpb25hZGRlZHsyLjF9Ci0KLQotXGJlZ2lue2NsYXNzZGVzYyp9e1NlcXVlbmNlTWF0Y2hlcn0KLSAgVGhpcyBpcyBhIGZsZXhpYmxlIGNsYXNzIGZvciBjb21wYXJpbmcgcGFpcnMgb2Ygc2VxdWVuY2VzIG9mIGFueQotICB0eXBlLCBzbyBsb25nIGFzIHRoZSBzZXF1ZW5jZSBlbGVtZW50cyBhcmUgaGFzaGFibGUuICBUaGUgYmFzaWMKLSAgYWxnb3JpdGhtIHByZWRhdGVzLCBhbmQgaXMgYSBsaXR0bGUgZmFuY2llciB0aGFuLCBhbiBhbGdvcml0aG0KLSAgcHVibGlzaGVkIGluIHRoZSBsYXRlIDE5ODAncyBieSBSYXRjbGlmZiBhbmQgT2JlcnNoZWxwIHVuZGVyIHRoZQotICBoeXBlcmJvbGljIG5hbWUgYGBnZXN0YWx0IHBhdHRlcm4gbWF0Y2hpbmcuJycgIFRoZSBpZGVhIGlzIHRvIGZpbmQKLSAgdGhlIGxvbmdlc3QgY29udGlndW91cyBtYXRjaGluZyBzdWJzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIG5vCi0gIGBganVuaycnIGVsZW1lbnRzICh0aGUgUmF0Y2xpZmYgYW5kIE9iZXJzaGVscCBhbGdvcml0aG0gZG9lc24ndAotICBhZGRyZXNzIGp1bmspLiAgVGhlIHNhbWUgaWRlYSBpcyB0aGVuIGFwcGxpZWQgcmVjdXJzaXZlbHkgdG8gdGhlCi0gIHBpZWNlcyBvZiB0aGUgc2VxdWVuY2VzIHRvIHRoZSBsZWZ0IGFuZCB0byB0aGUgcmlnaHQgb2YgdGhlIG1hdGNoaW5nCi0gIHN1YnNlcXVlbmNlLiAgVGhpcyBkb2VzIG5vdCB5aWVsZCBtaW5pbWFsIGVkaXQgc2VxdWVuY2VzLCBidXQgZG9lcwotICB0ZW5kIHRvIHlpZWxkIG1hdGNoZXMgdGhhdCBgYGxvb2sgcmlnaHQnJyB0byBwZW9wbGUuCi0KLSAgXHN0cm9uZ3tUaW1pbmc6fSBUaGUgYmFzaWMgUmF0Y2xpZmYtT2JlcnNoZWxwIGFsZ29yaXRobSBpcyBjdWJpYwotICB0aW1lIGluIHRoZSB3b3JzdCBjYXNlIGFuZCBxdWFkcmF0aWMgdGltZSBpbiB0aGUgZXhwZWN0ZWQgY2FzZS4KLSAgXGNsYXNze1NlcXVlbmNlTWF0Y2hlcn0gaXMgcXVhZHJhdGljIHRpbWUgZm9yIHRoZSB3b3JzdCBjYXNlIGFuZCBoYXMKLSAgZXhwZWN0ZWQtY2FzZSBiZWhhdmlvciBkZXBlbmRlbnQgaW4gYSBjb21wbGljYXRlZCB3YXkgb24gaG93IG1hbnkKLSAgZWxlbWVudHMgdGhlIHNlcXVlbmNlcyBoYXZlIGluIGNvbW1vbjsgYmVzdCBjYXNlIHRpbWUgaXMgbGluZWFyLgotXGVuZHtjbGFzc2Rlc2MqfQotCi1cYmVnaW57Y2xhc3NkZXNjKn17RGlmZmVyfQotICBUaGlzIGlzIGEgY2xhc3MgZm9yIGNvbXBhcmluZyBzZXF1ZW5jZXMgb2YgbGluZXMgb2YgdGV4dCwgYW5kCi0gIHByb2R1Y2luZyBodW1hbi1yZWFkYWJsZSBkaWZmZXJlbmNlcyBvciBkZWx0YXMuICBEaWZmZXIgdXNlcwotICBcY2xhc3N7U2VxdWVuY2VNYXRjaGVyfSBib3RoIHRvIGNvbXBhcmUgc2VxdWVuY2VzIG9mIGxpbmVzLCBhbmQgdG8KLSAgY29tcGFyZSBzZXF1ZW5jZXMgb2YgY2hhcmFjdGVycyB3aXRoaW4gc2ltaWxhciAobmVhci1tYXRjaGluZykKLSAgbGluZXMuCi0KLSAgRWFjaCBsaW5lIG9mIGEgXGNsYXNze0RpZmZlcn0gZGVsdGEgYmVnaW5zIHdpdGggYSB0d28tbGV0dGVyIGNvZGU6Ci0KLVxiZWdpbnt0YWJsZWlpfXtsfGx9e2NvZGV9e0NvZGV9e01lYW5pbmd9Ci0gIFxsaW5laWl7Jy0gJ317bGluZSB1bmlxdWUgdG8gc2VxdWVuY2UgMX0KLSAgXGxpbmVpaXsnKyAnfXtsaW5lIHVuaXF1ZSB0byBzZXF1ZW5jZSAyfQotICBcbGluZWlpeycgICd9e2xpbmUgY29tbW9uIHRvIGJvdGggc2VxdWVuY2VzfQotICBcbGluZWlpeyc/ICd9e2xpbmUgbm90IHByZXNlbnQgaW4gZWl0aGVyIGlucHV0IHNlcXVlbmNlfQotXGVuZHt0YWJsZWlpfQotCi0gIExpbmVzIGJlZ2lubmluZyB3aXRoIGBcY29kZXs/fn0nIGF0dGVtcHQgdG8gZ3VpZGUgdGhlIGV5ZSB0bwotICBpbnRyYWxpbmUgZGlmZmVyZW5jZXMsIGFuZCB3ZXJlIG5vdCBwcmVzZW50IGluIGVpdGhlciBpbnB1dAotICBzZXF1ZW5jZS4gVGhlc2UgbGluZXMgY2FuIGJlIGNvbmZ1c2luZyBpZiB0aGUgc2VxdWVuY2VzIGNvbnRhaW4gdGFiCi0gIGNoYXJhY3RlcnMuCi1cZW5ke2NsYXNzZGVzYyp9Ci0KLVxiZWdpbntjbGFzc2Rlc2MqfXtIdG1sRGlmZn0KLQotICBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhbiBIVE1MIHRhYmxlIChvciBhIGNvbXBsZXRlIEhUTUwgZmlsZQotICBjb250YWluaW5nIHRoZSB0YWJsZSkgc2hvd2luZyBhIHNpZGUgYnkgc2lkZSwgbGluZSBieSBsaW5lIGNvbXBhcmlzb24KLSAgb2YgdGV4dCB3aXRoIGludGVyLWxpbmUgYW5kIGludHJhLWxpbmUgY2hhbmdlIGhpZ2hsaWdodHMuICBUaGUgdGFibGUgY2FuCi0gIGJlIGdlbmVyYXRlZCBpbiBlaXRoZXIgZnVsbCBvciBjb250ZXh0dWFsIGRpZmZlcmVuY2UgbW9kZS4KLQotICBUaGUgY29uc3RydWN0b3IgZm9yIHRoaXMgY2xhc3MgaXM6Ci0KLSAgXGJlZ2lue2Z1bmNkZXNjfXtfX2luaXRfX317XG9wdGlvbmFse3RhYnNpemV9XG9wdGlvbmFseywKLSAgICB3cmFwY29sdW1ufVxvcHRpb25hbHssIGxpbmVqdW5rfVxvcHRpb25hbHssIGNoYXJqdW5rfX0KLQotICAgIEluaXRpYWxpemVzIGluc3RhbmNlIG9mIFxjbGFzc3tIdG1sRGlmZn0uCi0KLSAgICBcdmFye3RhYnNpemV9IGlzIGFuIG9wdGlvbmFsIGtleXdvcmQgYXJndW1lbnQgdG8gc3BlY2lmeSB0YWIgc3RvcCBzcGFjaW5nCi0gICAgYW5kIGRlZmF1bHRzIHRvIFxjb2Rlezh9LgotCi0gICAgXHZhcnt3cmFwY29sdW1ufSBpcyBhbiBvcHRpb25hbCBrZXl3b3JkIHRvIHNwZWNpZnkgY29sdW1uIG51bWJlciB3aGVyZQotICAgIGxpbmVzIGFyZSBicm9rZW4gYW5kIHdyYXBwZWQsIGRlZmF1bHRzIHRvIFxjb2Rle05vbmV9IHdoZXJlIGxpbmVzIGFyZSBub3QKLSAgICB3cmFwcGVkLgotCi0gICAgXHZhcntsaW5lanVua30gYW5kIFx2YXJ7Y2hhcmp1bmt9IGFyZSBvcHRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cyBwYXNzZWQKLSAgICBpbnRvIFxjb2Rle25kaWZmKCl9ICh1c2VkIGJ5IFxjbGFzc3tIdG1sRGlmZn0gdG8gZ2VuZXJhdGUgdGhlCi0gICAgc2lkZSBieSBzaWRlIEhUTUwgZGlmZmVyZW5jZXMpLiAgU2VlIFxjb2Rle25kaWZmKCl9IGRvY3VtZW50YXRpb24gZm9yCi0gICAgYXJndW1lbnQgZGVmYXVsdCB2YWx1ZXMgYW5kIGRlc2NyaXB0aW9ucy4KLQotICBcZW5ke2Z1bmNkZXNjfQotCi0gIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgcHVibGljOgotCi0gIFxiZWdpbntmdW5jZGVzY317bWFrZV9maWxlfXtmcm9tbGluZXMsIHRvbGluZXMKLSAgICBcb3B0aW9uYWx7LCBmcm9tZGVzY31cb3B0aW9uYWx7LCB0b2Rlc2N9XG9wdGlvbmFseywgY29udGV4dH1cb3B0aW9uYWx7LAotICAgIG51bWxpbmVzfX0KLSAgICBDb21wYXJlcyBcdmFye2Zyb21saW5lc30gYW5kIFx2YXJ7dG9saW5lc30gKGxpc3RzIG9mIHN0cmluZ3MpIGFuZCByZXR1cm5zCi0gICAgYSBzdHJpbmcgd2hpY2ggaXMgYSBjb21wbGV0ZSBIVE1MIGZpbGUgY29udGFpbmluZyBhIHRhYmxlIHNob3dpbmcgbGluZSBieQotICAgIGxpbmUgZGlmZmVyZW5jZXMgd2l0aCBpbnRlci1saW5lIGFuZCBpbnRyYS1saW5lIGNoYW5nZXMgaGlnaGxpZ2h0ZWQuCi0KLSAgICBcdmFye2Zyb21kZXNjfSBhbmQgXHZhcnt0b2Rlc2N9IGFyZSBvcHRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cyB0byBzcGVjaWZ5Ci0gICAgZnJvbS90byBmaWxlIGNvbHVtbiBoZWFkZXIgc3RyaW5ncyAoYm90aCBkZWZhdWx0IHRvIGFuIGVtcHR5IHN0cmluZykuCi0KLSAgICBcdmFye2NvbnRleHR9IGFuZCBcdmFye251bWxpbmVzfSBhcmUgYm90aCBvcHRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cy4KLSAgICBTZXQgXHZhcntjb250ZXh0fSB0byBcY29kZXtUcnVlfSB3aGVuIGNvbnRleHR1YWwgZGlmZmVyZW5jZXMgYXJlIHRvIGJlCi0gICAgc2hvd24sIGVsc2UgdGhlIGRlZmF1bHQgaXMgXGNvZGV7RmFsc2V9IHRvIHNob3cgdGhlIGZ1bGwgZmlsZXMuCi0gICAgXHZhcntudW1saW5lc30gZGVmYXVsdHMgdG8gXGNvZGV7NX0uICBXaGVuIFx2YXJ7Y29udGV4dH0gaXMgXGNvZGV7VHJ1ZX0KLSAgICBcdmFye251bWxpbmVzfSBjb250cm9scyB0aGUgbnVtYmVyIG9mIGNvbnRleHQgbGluZXMgd2hpY2ggc3Vycm91bmQgdGhlCi0gICAgZGlmZmVyZW5jZSBoaWdobGlnaHRzLiAgV2hlbiBcdmFye2NvbnRleHR9IGlzIFxjb2Rle0ZhbHNlfSBcdmFye251bWxpbmVzfQotICAgIGNvbnRyb2xzIHRoZSBudW1iZXIgb2YgbGluZXMgd2hpY2ggYXJlIHNob3duIGJlZm9yZSBhIGRpZmZlcmVuY2UKLSAgICBoaWdobGlnaHQgd2hlbiB1c2luZyB0aGUgIm5leHQiIGh5cGVybGlua3MgKHNldHRpbmcgdG8gemVybyB3b3VsZCBjYXVzZQotICAgIHRoZSAibmV4dCIgaHlwZXJsaW5rcyB0byBwbGFjZSB0aGUgbmV4dCBkaWZmZXJlbmNlIGhpZ2hsaWdodCBhdCB0aGUgdG9wIG9mCi0gICAgdGhlIGJyb3dzZXIgd2l0aG91dCBhbnkgbGVhZGluZyBjb250ZXh0KS4KLSAgXGVuZHtmdW5jZGVzY30KLQotICBcYmVnaW57ZnVuY2Rlc2N9e21ha2VfdGFibGV9e2Zyb21saW5lcywgdG9saW5lcwotICAgIFxvcHRpb25hbHssIGZyb21kZXNjfVxvcHRpb25hbHssIHRvZGVzY31cb3B0aW9uYWx7LCBjb250ZXh0fVxvcHRpb25hbHssCi0gICAgbnVtbGluZXN9fQotICAgIENvbXBhcmVzIFx2YXJ7ZnJvbWxpbmVzfSBhbmQgXHZhcnt0b2xpbmVzfSAobGlzdHMgb2Ygc3RyaW5ncykgYW5kIHJldHVybnMKLSAgICBhIHN0cmluZyB3aGljaCBpcyBhIGNvbXBsZXRlIEhUTUwgdGFibGUgc2hvd2luZyBsaW5lIGJ5IGxpbmUgZGlmZmVyZW5jZXMKLSAgICB3aXRoIGludGVyLWxpbmUgYW5kIGludHJhLWxpbmUgY2hhbmdlcyBoaWdobGlnaHRlZC4KLQotICAgIFRoZSBhcmd1bWVudHMgZm9yIHRoaXMgbWV0aG9kIGFyZSB0aGUgc2FtZSBhcyB0aG9zZSBmb3IgdGhlCi0gICAgXG1ldGhvZHttYWtlX2ZpbGUoKX0gbWV0aG9kLgotICBcZW5ke2Z1bmNkZXNjfQotCi0gIFxmaWxle1Rvb2xzL3NjcmlwdHMvZGlmZi5weX0gaXMgYSBjb21tYW5kLWxpbmUgZnJvbnQtZW5kIHRvIHRoaXMgY2xhc3MKLSAgYW5kIGNvbnRhaW5zIGEgZ29vZCBleGFtcGxlIG9mIGl0cyB1c2UuCi0KLSAgXHZlcnNpb25hZGRlZHsyLjR9Ci1cZW5ke2NsYXNzZGVzYyp9Ci0KLVxiZWdpbntmdW5jZGVzY317Y29udGV4dF9kaWZmfXthLCBiXG9wdGlvbmFseywgZnJvbWZpbGV9XG9wdGlvbmFseywKLSAgICB0b2ZpbGV9XG9wdGlvbmFseywgZnJvbWZpbGVkYXRlfVxvcHRpb25hbHssIHRvZmlsZWRhdGV9XG9wdGlvbmFseywKLSAgICBufVxvcHRpb25hbHssIGxpbmV0ZXJtfX0KLSAgQ29tcGFyZSBcdmFye2F9IGFuZCBcdmFye2J9IChsaXN0cyBvZiBzdHJpbmdzKTsgcmV0dXJuIGEKLSAgZGVsdGEgKGEgZ2VuZXJhdG9yIGdlbmVyYXRpbmcgdGhlIGRlbHRhIGxpbmVzKSBpbiBjb250ZXh0IGRpZmYKLSAgZm9ybWF0LgotCi0gIENvbnRleHQgZGlmZnMgYXJlIGEgY29tcGFjdCB3YXkgb2Ygc2hvd2luZyBqdXN0IHRoZSBsaW5lcyB0aGF0IGhhdmUKLSAgY2hhbmdlZCBwbHVzIGEgZmV3IGxpbmVzIG9mIGNvbnRleHQuICBUaGUgY2hhbmdlcyBhcmUgc2hvd24gaW4gYQotICBiZWZvcmUvYWZ0ZXIgc3R5bGUuICBUaGUgbnVtYmVyIG9mIGNvbnRleHQgbGluZXMgaXMgc2V0IGJ5IFx2YXJ7bn0KLSAgd2hpY2ggZGVmYXVsdHMgdG8gdGhyZWUuCi0KLSAgQnkgZGVmYXVsdCwgdGhlIGRpZmYgY29udHJvbCBsaW5lcyAodGhvc2Ugd2l0aCBcY29kZXsqKip9IG9yIFxjb2Rley0tLX0pCi0gIGFyZSBjcmVhdGVkIHdpdGggYSB0cmFpbGluZyBuZXdsaW5lLiAgVGhpcyBpcyBoZWxwZnVsIHNvIHRoYXQgaW5wdXRzIGNyZWF0ZWQKLSAgZnJvbSBcZnVuY3Rpb257ZmlsZS5yZWFkbGluZXMoKX0gcmVzdWx0IGluIGRpZmZzIHRoYXQgYXJlIHN1aXRhYmxlIGZvciB1c2UKLSAgd2l0aCBcZnVuY3Rpb257ZmlsZS53cml0ZWxpbmVzKCl9IHNpbmNlIGJvdGggdGhlIGlucHV0cyBhbmQgb3V0cHV0cyBoYXZlCi0gIHRyYWlsaW5nIG5ld2xpbmVzLgotCi0gIEZvciBpbnB1dHMgdGhhdCBkbyBub3QgaGF2ZSB0cmFpbGluZyBuZXdsaW5lcywgc2V0IHRoZSBcdmFye2xpbmV0ZXJtfQotICBhcmd1bWVudCB0byBcY29kZXsiIn0gc28gdGhhdCB0aGUgb3V0cHV0IHdpbGwgYmUgdW5pZm9ybWx5IG5ld2xpbmUgZnJlZS4KLQotICBUaGUgY29udGV4dCBkaWZmIGZvcm1hdCBub3JtYWxseSBoYXMgYSBoZWFkZXIgZm9yIGZpbGVuYW1lcyBhbmQKLSAgbW9kaWZpY2F0aW9uIHRpbWVzLiAgQW55IG9yIGFsbCBvZiB0aGVzZSBtYXkgYmUgc3BlY2lmaWVkIHVzaW5nIHN0cmluZ3MgZm9yCi0gIFx2YXJ7ZnJvbWZpbGV9LCBcdmFye3RvZmlsZX0sIFx2YXJ7ZnJvbWZpbGVkYXRlfSwgYW5kIFx2YXJ7dG9maWxlZGF0ZX0uCi0gIFRoZSBtb2RpZmljYXRpb24gdGltZXMgYXJlIG5vcm1hbGx5IGV4cHJlc3NlZCBpbiB0aGUgZm9ybWF0IHJldHVybmVkIGJ5Ci0gIFxmdW5jdGlvbnt0aW1lLmN0aW1lKCl9LiAgSWYgbm90IHNwZWNpZmllZCwgdGhlIHN0cmluZ3MgZGVmYXVsdCB0byBibGFua3MuCi0KLSAgXGZpbGV7VG9vbHMvc2NyaXB0cy9kaWZmLnB5fSBpcyBhIGNvbW1hbmQtbGluZSBmcm9udC1lbmQgZm9yIHRoaXMKLSAgZnVuY3Rpb24uCi0KLSAgXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldF9jbG9zZV9tYXRjaGVzfXt3b3JkLCBwb3NzaWJpbGl0aWVzXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgbn1cb3B0aW9uYWx7LCBjdXRvZmZ9fQotICBSZXR1cm4gYSBsaXN0IG9mIHRoZSBiZXN0IGBgZ29vZCBlbm91Z2gnJyBtYXRjaGVzLiAgXHZhcnt3b3JkfSBpcyBhCi0gIHNlcXVlbmNlIGZvciB3aGljaCBjbG9zZSBtYXRjaGVzIGFyZSBkZXNpcmVkICh0eXBpY2FsbHkgYSBzdHJpbmcpLAotICBhbmQgXHZhcntwb3NzaWJpbGl0aWVzfSBpcyBhIGxpc3Qgb2Ygc2VxdWVuY2VzIGFnYWluc3Qgd2hpY2ggdG8KLSAgbWF0Y2ggXHZhcnt3b3JkfSAodHlwaWNhbGx5IGEgbGlzdCBvZiBzdHJpbmdzKS4KLQotICBPcHRpb25hbCBhcmd1bWVudCBcdmFye259IChkZWZhdWx0IFxjb2RlezN9KSBpcyB0aGUgbWF4aW11bSBudW1iZXIKLSAgb2YgY2xvc2UgbWF0Y2hlcyB0byByZXR1cm47IFx2YXJ7bn0gbXVzdCBiZSBncmVhdGVyIHRoYW4gXGNvZGV7MH0uCi0KLSAgT3B0aW9uYWwgYXJndW1lbnQgXHZhcntjdXRvZmZ9IChkZWZhdWx0IFxjb2RlezAuNn0pIGlzIGEgZmxvYXQgaW4KLSAgdGhlIHJhbmdlIFswLCAxXS4gIFBvc3NpYmlsaXRpZXMgdGhhdCBkb24ndCBzY29yZSBhdCBsZWFzdCB0aGF0Ci0gIHNpbWlsYXIgdG8gXHZhcnt3b3JkfSBhcmUgaWdub3JlZC4KLQotICBUaGUgYmVzdCAobm8gbW9yZSB0aGFuIFx2YXJ7bn0pIG1hdGNoZXMgYW1vbmcgdGhlIHBvc3NpYmlsaXRpZXMgYXJlCi0gIHJldHVybmVkIGluIGEgbGlzdCwgc29ydGVkIGJ5IHNpbWlsYXJpdHkgc2NvcmUsIG1vc3Qgc2ltaWxhciBmaXJzdC4KLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGdldF9jbG9zZV9tYXRjaGVzKCdhcHBlbCcsIFsnYXBlJywgJ2FwcGxlJywgJ3BlYWNoJywgJ3B1cHB5J10pCi1bJ2FwcGxlJywgJ2FwZSddCi0+Pj4gaW1wb3J0IGtleXdvcmQKLT4+PiBnZXRfY2xvc2VfbWF0Y2hlcygnd2hlZWwnLCBrZXl3b3JkLmt3bGlzdCkKLVsnd2hpbGUnXQotPj4+IGdldF9jbG9zZV9tYXRjaGVzKCdhcHBsZScsIGtleXdvcmQua3dsaXN0KQotW10KLT4+PiBnZXRfY2xvc2VfbWF0Y2hlcygnYWNjZXB0Jywga2V5d29yZC5rd2xpc3QpCi1bJ2V4Y2VwdCddCi1cZW5ke3ZlcmJhdGltfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtuZGlmZn17YSwgYlxvcHRpb25hbHssIGxpbmVqdW5rfVxvcHRpb25hbHssIGNoYXJqdW5rfX0KLSAgQ29tcGFyZSBcdmFye2F9IGFuZCBcdmFye2J9IChsaXN0cyBvZiBzdHJpbmdzKTsgcmV0dXJuIGEKLSAgXGNsYXNze0RpZmZlcn0tc3R5bGUgZGVsdGEgKGEgZ2VuZXJhdG9yIGdlbmVyYXRpbmcgdGhlIGRlbHRhIGxpbmVzKS4KLQotICBPcHRpb25hbCBrZXl3b3JkIHBhcmFtZXRlcnMgXHZhcntsaW5lanVua30gYW5kIFx2YXJ7Y2hhcmp1bmt9IGFyZQotICBmb3IgZmlsdGVyIGZ1bmN0aW9ucyAob3IgXGNvZGV7Tm9uZX0pOgotCi0gIFx2YXJ7bGluZWp1bmt9OiBBIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBhIHNpbmdsZSBzdHJpbmcKLSAgYXJndW1lbnQsIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIHN0cmluZyBpcyBqdW5rLCBvciBmYWxzZSBpZiBub3QuCi0gIFRoZSBkZWZhdWx0IGlzIChcY29kZXtOb25lfSksIHN0YXJ0aW5nIHdpdGggUHl0aG9uIDIuMy4gIEJlZm9yZSB0aGVuLAotICB0aGUgZGVmYXVsdCB3YXMgdGhlIG1vZHVsZS1sZXZlbCBmdW5jdGlvbgotICBcZnVuY3Rpb257SVNfTElORV9KVU5LKCl9LCB3aGljaCBmaWx0ZXJzIG91dCBsaW5lcyB3aXRob3V0IHZpc2libGUKLSAgY2hhcmFjdGVycywgZXhjZXB0IGZvciBhdCBtb3N0IG9uZSBwb3VuZCBjaGFyYWN0ZXIgKFxjaGFyYWN0ZXJ7XCN9KS4KLSAgQXMgb2YgUHl0aG9uIDIuMywgdGhlIHVuZGVybHlpbmcgXGNsYXNze1NlcXVlbmNlTWF0Y2hlcn0gY2xhc3MKLSAgZG9lcyBhIGR5bmFtaWMgYW5hbHlzaXMgb2Ygd2hpY2ggbGluZXMgYXJlIHNvIGZyZXF1ZW50IGFzIHRvCi0gIGNvbnN0aXR1dGUgbm9pc2UsIGFuZCB0aGlzIHVzdWFsbHkgd29ya3MgYmV0dGVyIHRoYW4gdGhlIHByZS0yLjMKLSAgZGVmYXVsdC4KLQotICBcdmFye2NoYXJqdW5rfTogQSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYSBjaGFyYWN0ZXIgKGEgc3RyaW5nIG9mCi0gIGxlbmd0aCAxKSwgYW5kIHJldHVybnMgaWYgdGhlIGNoYXJhY3RlciBpcyBqdW5rLCBvciBmYWxzZSBpZiBub3QuCi0gIFRoZSBkZWZhdWx0IGlzIG1vZHVsZS1sZXZlbCBmdW5jdGlvbiBcZnVuY3Rpb257SVNfQ0hBUkFDVEVSX0pVTksoKX0sCi0gIHdoaWNoIGZpbHRlcnMgb3V0IHdoaXRlc3BhY2UgY2hhcmFjdGVycyAoYSBibGFuayBvciB0YWI7IG5vdGU6IGJhZAotICBpZGVhIHRvIGluY2x1ZGUgbmV3bGluZSBpbiB0aGlzISkuCi0KLSAgXGZpbGV7VG9vbHMvc2NyaXB0cy9uZGlmZi5weX0gaXMgYSBjb21tYW5kLWxpbmUgZnJvbnQtZW5kIHRvIHRoaXMKLSAgZnVuY3Rpb24uCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBkaWZmID0gbmRpZmYoJ29uZVxudHdvXG50aHJlZVxuJy5zcGxpdGxpbmVzKDEpLAotLi4uICAgICAgICAgICAgICAnb3JlXG50cmVlXG5lbXVcbicuc3BsaXRsaW5lcygxKSkKLT4+PiBwcmludCAnJy5qb2luKGRpZmYpLAotLSBvbmUKLT8gIF4KLSsgb3JlCi0/ICBeCi0tIHR3bwotLSB0aHJlZQotPyAgLQotKyB0cmVlCi0rIGVtdQotXGVuZHt2ZXJiYXRpbX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cmVzdG9yZX17c2VxdWVuY2UsIHdoaWNofQotICBSZXR1cm4gb25lIG9mIHRoZSB0d28gc2VxdWVuY2VzIHRoYXQgZ2VuZXJhdGVkIGEgZGVsdGEuCi0KLSAgR2l2ZW4gYSBcdmFye3NlcXVlbmNlfSBwcm9kdWNlZCBieSBcbWV0aG9ke0RpZmZlci5jb21wYXJlKCl9IG9yCi0gIFxmdW5jdGlvbntuZGlmZigpfSwgZXh0cmFjdCBsaW5lcyBvcmlnaW5hdGluZyBmcm9tIGZpbGUgMSBvciAyCi0gIChwYXJhbWV0ZXIgXHZhcnt3aGljaH0pLCBzdHJpcHBpbmcgb2ZmIGxpbmUgcHJlZml4ZXMuCi0KLSAgRXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGRpZmYgPSBuZGlmZignb25lXG50d29cbnRocmVlXG4nLnNwbGl0bGluZXMoMSksCi0uLi4gICAgICAgICAgICAgICdvcmVcbnRyZWVcbmVtdVxuJy5zcGxpdGxpbmVzKDEpKQotPj4+IGRpZmYgPSBsaXN0KGRpZmYpICMgbWF0ZXJpYWxpemUgdGhlIGdlbmVyYXRlZCBkZWx0YSBpbnRvIGEgbGlzdAotPj4+IHByaW50ICcnLmpvaW4ocmVzdG9yZShkaWZmLCAxKSksCi1vbmUKLXR3bwotdGhyZWUKLT4+PiBwcmludCAnJy5qb2luKHJlc3RvcmUoZGlmZiwgMikpLAotb3JlCi10cmVlCi1lbXUKLVxlbmR7dmVyYmF0aW19Ci0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dW5pZmllZF9kaWZmfXthLCBiXG9wdGlvbmFseywgZnJvbWZpbGV9XG9wdGlvbmFseywKLSAgICB0b2ZpbGV9XG9wdGlvbmFseywgZnJvbWZpbGVkYXRlfVxvcHRpb25hbHssIHRvZmlsZWRhdGV9XG9wdGlvbmFseywKLSAgICBufVxvcHRpb25hbHssIGxpbmV0ZXJtfX0KLSAgQ29tcGFyZSBcdmFye2F9IGFuZCBcdmFye2J9IChsaXN0cyBvZiBzdHJpbmdzKTsgcmV0dXJuIGEKLSAgZGVsdGEgKGEgZ2VuZXJhdG9yIGdlbmVyYXRpbmcgdGhlIGRlbHRhIGxpbmVzKSBpbiB1bmlmaWVkIGRpZmYKLSAgZm9ybWF0LgotCi0gIFVuaWZpZWQgZGlmZnMgYXJlIGEgY29tcGFjdCB3YXkgb2Ygc2hvd2luZyBqdXN0IHRoZSBsaW5lcyB0aGF0IGhhdmUKLSAgY2hhbmdlZCBwbHVzIGEgZmV3IGxpbmVzIG9mIGNvbnRleHQuICBUaGUgY2hhbmdlcyBhcmUgc2hvd24gaW4gYQotICBpbmxpbmUgc3R5bGUgKGluc3RlYWQgb2Ygc2VwYXJhdGUgYmVmb3JlL2FmdGVyIGJsb2NrcykuICBUaGUgbnVtYmVyCi0gIG9mIGNvbnRleHQgbGluZXMgaXMgc2V0IGJ5IFx2YXJ7bn0gd2hpY2ggZGVmYXVsdHMgdG8gdGhyZWUuCi0KLSAgQnkgZGVmYXVsdCwgdGhlIGRpZmYgY29udHJvbCBsaW5lcyAodGhvc2Ugd2l0aCBcY29kZXstLS19LCBcY29kZXsrKyt9LAotICBvciBcY29kZXtAQH0pIGFyZSBjcmVhdGVkIHdpdGggYSB0cmFpbGluZyBuZXdsaW5lLiAgVGhpcyBpcyBoZWxwZnVsIHNvCi0gIHRoYXQgaW5wdXRzIGNyZWF0ZWQgZnJvbSBcZnVuY3Rpb257ZmlsZS5yZWFkbGluZXMoKX0gcmVzdWx0IGluIGRpZmZzCi0gIHRoYXQgYXJlIHN1aXRhYmxlIGZvciB1c2Ugd2l0aCBcZnVuY3Rpb257ZmlsZS53cml0ZWxpbmVzKCl9IHNpbmNlIGJvdGgKLSAgdGhlIGlucHV0cyBhbmQgb3V0cHV0cyBoYXZlIHRyYWlsaW5nIG5ld2xpbmVzLgotCi0gIEZvciBpbnB1dHMgdGhhdCBkbyBub3QgaGF2ZSB0cmFpbGluZyBuZXdsaW5lcywgc2V0IHRoZSBcdmFye2xpbmV0ZXJtfQotICBhcmd1bWVudCB0byBcY29kZXsiIn0gc28gdGhhdCB0aGUgb3V0cHV0IHdpbGwgYmUgdW5pZm9ybWx5IG5ld2xpbmUgZnJlZS4KLQotICBUaGUgY29udGV4dCBkaWZmIGZvcm1hdCBub3JtYWxseSBoYXMgYSBoZWFkZXIgZm9yIGZpbGVuYW1lcyBhbmQKLSAgbW9kaWZpY2F0aW9uIHRpbWVzLiAgQW55IG9yIGFsbCBvZiB0aGVzZSBtYXkgYmUgc3BlY2lmaWVkIHVzaW5nIHN0cmluZ3MgZm9yCi0gIFx2YXJ7ZnJvbWZpbGV9LCBcdmFye3RvZmlsZX0sIFx2YXJ7ZnJvbWZpbGVkYXRlfSwgYW5kIFx2YXJ7dG9maWxlZGF0ZX0uCi0gIFRoZSBtb2RpZmljYXRpb24gdGltZXMgYXJlIG5vcm1hbGx5IGV4cHJlc3NlZCBpbiB0aGUgZm9ybWF0IHJldHVybmVkIGJ5Ci0gIFxmdW5jdGlvbnt0aW1lLmN0aW1lKCl9LiAgSWYgbm90IHNwZWNpZmllZCwgdGhlIHN0cmluZ3MgZGVmYXVsdCB0byBibGFua3MuCi0KLSAgXGZpbGV7VG9vbHMvc2NyaXB0cy9kaWZmLnB5fSBpcyBhIGNvbW1hbmQtbGluZSBmcm9udC1lbmQgZm9yIHRoaXMKLSAgZnVuY3Rpb24uCi0KLSAgXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e0lTX0xJTkVfSlVOS317bGluZX0KLSAgUmV0dXJuIHRydWUgZm9yIGlnbm9yYWJsZSBsaW5lcy4gIFRoZSBsaW5lIFx2YXJ7bGluZX0gaXMgaWdub3JhYmxlCi0gIGlmIFx2YXJ7bGluZX0gaXMgYmxhbmsgb3IgY29udGFpbnMgYSBzaW5nbGUgXGNoYXJhY3RlcntcI30sCi0gIG90aGVyd2lzZSBpdCBpcyBub3QgaWdub3JhYmxlLiAgVXNlZCBhcyBhIGRlZmF1bHQgZm9yIHBhcmFtZXRlcgotICBcdmFye2xpbmVqdW5rfSBpbiBcZnVuY3Rpb257bmRpZmYoKX0gYmVmb3JlIFB5dGhvbiAyLjMuCi1cZW5ke2Z1bmNkZXNjfQotCi0KLVxiZWdpbntmdW5jZGVzY317SVNfQ0hBUkFDVEVSX0pVTkt9e2NofQotICBSZXR1cm4gdHJ1ZSBmb3IgaWdub3JhYmxlIGNoYXJhY3RlcnMuICBUaGUgY2hhcmFjdGVyIFx2YXJ7Y2h9IGlzCi0gIGlnbm9yYWJsZSBpZiBcdmFye2NofSBpcyBhIHNwYWNlIG9yIHRhYiwgb3RoZXJ3aXNlIGl0IGlzIG5vdAotICBpZ25vcmFibGUuICBVc2VkIGFzIGEgZGVmYXVsdCBmb3IgcGFyYW1ldGVyIFx2YXJ7Y2hhcmp1bmt9IGluCi0gIFxmdW5jdGlvbntuZGlmZigpfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWV0aXRsZVtodHRwOi8vd3d3LmRkai5jb20vMTg0NDA3OTcwP3Bnbm89NV0KLSAgICAgICAgICAge1BhdHRlcm4gTWF0Y2hpbmc6IFRoZSBHZXN0YWx0IEFwcHJvYWNofXtEaXNjdXNzaW9uIG9mIGEKLSAgICAgICAgICAgIHNpbWlsYXIgYWxnb3JpdGhtIGJ5IEpvaG4gVy4gUmF0Y2xpZmYgYW5kIEQuIEUuIE1ldHplbmVyLgotICAgICAgICAgICAgVGhpcyB3YXMgcHVibGlzaGVkIGluCi0gICAgICAgICAgICBcY2l0ZXRpdGxlW2h0dHA6Ly93d3cuZGRqLmNvbS9de0RyLiBEb2JiJ3MgSm91cm5hbH0gaW4KLSAgICAgICAgICAgIEp1bHksIDE5ODgufQotXGVuZHtzZWVhbHNvfQotCi0KLVxzdWJzZWN0aW9ue1NlcXVlbmNlTWF0Y2hlciBPYmplY3RzIFxsYWJlbHtzZXF1ZW5jZS1tYXRjaGVyfX0KLQotVGhlIFxjbGFzc3tTZXF1ZW5jZU1hdGNoZXJ9IGNsYXNzIGhhcyB0aGlzIGNvbnN0cnVjdG9yOgotCi1cYmVnaW57Y2xhc3NkZXNjfXtTZXF1ZW5jZU1hdGNoZXJ9e1xvcHRpb25hbHtpc2p1bmtcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhXG9wdGlvbmFseywgYn19fX0KLSAgT3B0aW9uYWwgYXJndW1lbnQgXHZhcntpc2p1bmt9IG11c3QgYmUgXGNvZGV7Tm9uZX0gKHRoZSBkZWZhdWx0KSBvcgotICBhIG9uZS1hcmd1bWVudCBmdW5jdGlvbiB0aGF0IHRha2VzIGEgc2VxdWVuY2UgZWxlbWVudCBhbmQgcmV0dXJucwotICB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBlbGVtZW50IGlzIGBganVuaycnIGFuZCBzaG91bGQgYmUgaWdub3JlZC4KLSAgUGFzc2luZyBcY29kZXtOb25lfSBmb3IgXHZhcntpc2p1bmt9IGlzIGVxdWl2YWxlbnQgdG8gcGFzc2luZwotICBcY29kZXtsYW1iZGEgeDogMH07IGluIG90aGVyIHdvcmRzLCBubyBlbGVtZW50cyBhcmUgaWdub3JlZC4gIEZvcgotICBleGFtcGxlLCBwYXNzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1sYW1iZGEgeDogeCBpbiAiIFx0IgotXGVuZHt2ZXJiYXRpbX0KLQotICBpZiB5b3UncmUgY29tcGFyaW5nIGxpbmVzIGFzIHNlcXVlbmNlcyBvZiBjaGFyYWN0ZXJzLCBhbmQgZG9uJ3Qgd2FudAotICB0byBzeW5jaCB1cCBvbiBibGFua3Mgb3IgaGFyZCB0YWJzLgotCi0gIFRoZSBvcHRpb25hbCBhcmd1bWVudHMgXHZhcnthfSBhbmQgXHZhcntifSBhcmUgc2VxdWVuY2VzIHRvIGJlCi0gIGNvbXBhcmVkOyBib3RoIGRlZmF1bHQgdG8gZW1wdHkgc3RyaW5ncy4gIFRoZSBlbGVtZW50cyBvZiBib3RoCi0gIHNlcXVlbmNlcyBtdXN0IGJlIGhhc2hhYmxlLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLQotXGNsYXNze1NlcXVlbmNlTWF0Y2hlcn0gb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLQotXGJlZ2lue21ldGhvZGRlc2N9e3NldF9zZXFzfXthLCBifQotICBTZXQgdGhlIHR3byBzZXF1ZW5jZXMgdG8gYmUgY29tcGFyZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxjbGFzc3tTZXF1ZW5jZU1hdGNoZXJ9IGNvbXB1dGVzIGFuZCBjYWNoZXMgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQKLXRoZSBzZWNvbmQgc2VxdWVuY2UsIHNvIGlmIHlvdSB3YW50IHRvIGNvbXBhcmUgb25lIHNlcXVlbmNlIGFnYWluc3QKLW1hbnkgc2VxdWVuY2VzLCB1c2UgXG1ldGhvZHtzZXRfc2VxMigpfSB0byBzZXQgdGhlIGNvbW1vbmx5IHVzZWQKLXNlcXVlbmNlIG9uY2UgYW5kIGNhbGwgXG1ldGhvZHtzZXRfc2VxMSgpfSByZXBlYXRlZGx5LCBvbmNlIGZvciBlYWNoCi1vZiB0aGUgb3RoZXIgc2VxdWVuY2VzLgotCi1cYmVnaW57bWV0aG9kZGVzY317c2V0X3NlcTF9e2F9Ci0gIFNldCB0aGUgZmlyc3Qgc2VxdWVuY2UgdG8gYmUgY29tcGFyZWQuICBUaGUgc2Vjb25kIHNlcXVlbmNlIHRvIGJlCi0gIGNvbXBhcmVkIGlzIG5vdCBjaGFuZ2VkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317c2V0X3NlcTJ9e2J9Ci0gIFNldCB0aGUgc2Vjb25kIHNlcXVlbmNlIHRvIGJlIGNvbXBhcmVkLiAgVGhlIGZpcnN0IHNlcXVlbmNlIHRvIGJlCi0gIGNvbXBhcmVkIGlzIG5vdCBjaGFuZ2VkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317ZmluZF9sb25nZXN0X21hdGNofXthbG8sIGFoaSwgYmxvLCBiaGl9Ci0gIEZpbmQgbG9uZ2VzdCBtYXRjaGluZyBibG9jayBpbiBcY29kZXtcdmFye2F9W1x2YXJ7YWxvfTpcdmFye2FoaX1dfQotICBhbmQgXGNvZGV7XHZhcntifVtcdmFye2Jsb306XHZhcntiaGl9XX0uCi0KLSAgSWYgXHZhcntpc2p1bmt9IHdhcyBvbWl0dGVkIG9yIFxjb2Rle05vbmV9LAotICBcbWV0aG9ke2dldF9sb25nZXN0X21hdGNoKCl9IHJldHVybnMgXGNvZGV7KFx2YXJ7aX0sIFx2YXJ7an0sCi0gIFx2YXJ7a30pfSBzdWNoIHRoYXQgXGNvZGV7XHZhcnthfVtcdmFye2l9Olx2YXJ7aX0rXHZhcntrfV19IGlzIGVxdWFsCi0gIHRvIFxjb2Rle1x2YXJ7Yn1bXHZhcntqfTpcdmFye2p9K1x2YXJ7a31dfSwgd2hlcmUKLSAgICAgIFxjb2Rle1x2YXJ7YWxvfSA8PSBcdmFye2l9IDw9IFx2YXJ7aX0rXHZhcntrfSA8PSBcdmFye2FoaX19IGFuZAotICAgICAgXGNvZGV7XHZhcntibG99IDw9IFx2YXJ7an0gPD0gXHZhcntqfStcdmFye2t9IDw9IFx2YXJ7YmhpfX0uCi0gIEZvciBhbGwgXGNvZGV7KFx2YXJ7aSd9LCBcdmFye2onfSwgXHZhcntrJ30pfSBtZWV0aW5nIHRob3NlCi0gIGNvbmRpdGlvbnMsIHRoZSBhZGRpdGlvbmFsIGNvbmRpdGlvbnMKLSAgICAgIFxjb2Rle1x2YXJ7a30gPj0gXHZhcntrJ319LAotICAgICAgXGNvZGV7XHZhcntpfSA8PSBcdmFye2knfX0sCi0gICAgICBhbmQgaWYgXGNvZGV7XHZhcntpfSA9PSBcdmFye2knfX0sIFxjb2Rle1x2YXJ7an0gPD0gXHZhcntqJ319Ci0gIGFyZSBhbHNvIG1ldC4KLSAgSW4gb3RoZXIgd29yZHMsIG9mIGFsbCBtYXhpbWFsIG1hdGNoaW5nIGJsb2NrcywgcmV0dXJuIG9uZSB0aGF0Ci0gIHN0YXJ0cyBlYXJsaWVzdCBpbiBcdmFye2F9LCBhbmQgb2YgYWxsIHRob3NlIG1heGltYWwgbWF0Y2hpbmcgYmxvY2tzCi0gIHRoYXQgc3RhcnQgZWFybGllc3QgaW4gXHZhcnthfSwgcmV0dXJuIHRoZSBvbmUgdGhhdCBzdGFydHMgZWFybGllc3QKLSAgaW4gXHZhcntifS4KLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHMgPSBTZXF1ZW5jZU1hdGNoZXIoTm9uZSwgIiBhYmNkIiwgImFiY2QgYWJjZCIpCi0+Pj4gcy5maW5kX2xvbmdlc3RfbWF0Y2goMCwgNSwgMCwgOSkKLSgwLCA0LCA1KQotXGVuZHt2ZXJiYXRpbX0KLQotICBJZiBcdmFye2lzanVua30gd2FzIHByb3ZpZGVkLCBmaXJzdCB0aGUgbG9uZ2VzdCBtYXRjaGluZyBibG9jayBpcwotICBkZXRlcm1pbmVkIGFzIGFib3ZlLCBidXQgd2l0aCB0aGUgYWRkaXRpb25hbCByZXN0cmljdGlvbiB0aGF0IG5vCi0gIGp1bmsgZWxlbWVudCBhcHBlYXJzIGluIHRoZSBibG9jay4gIFRoZW4gdGhhdCBibG9jayBpcyBleHRlbmRlZCBhcwotICBmYXIgYXMgcG9zc2libGUgYnkgbWF0Y2hpbmcgKG9ubHkpIGp1bmsgZWxlbWVudHMgb24gYm90aCBzaWRlcy4KLSAgU28gdGhlIHJlc3VsdGluZyBibG9jayBuZXZlciBtYXRjaGVzIG9uIGp1bmsgZXhjZXB0IGFzIGlkZW50aWNhbAotICBqdW5rIGhhcHBlbnMgdG8gYmUgYWRqYWNlbnQgdG8gYW4gaW50ZXJlc3RpbmcgbWF0Y2guCi0KLSAgSGVyZSdzIHRoZSBzYW1lIGV4YW1wbGUgYXMgYmVmb3JlLCBidXQgY29uc2lkZXJpbmcgYmxhbmtzIHRvIGJlIGp1bmsuCi0gIFRoYXQgcHJldmVudHMgXGNvZGV7JyBhYmNkJ30gZnJvbSBtYXRjaGluZyB0aGUgXGNvZGV7JyBhYmNkJ30gYXQgdGhlCi0gIHRhaWwgZW5kIG9mIHRoZSBzZWNvbmQgc2VxdWVuY2UgZGlyZWN0bHkuICBJbnN0ZWFkIG9ubHkgdGhlCi0gIFxjb2RleydhYmNkJ30gY2FuIG1hdGNoLCBhbmQgbWF0Y2hlcyB0aGUgbGVmdG1vc3QgXGNvZGV7J2FiY2QnfSBpbgotICB0aGUgc2Vjb25kIHNlcXVlbmNlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gcyA9IFNlcXVlbmNlTWF0Y2hlcihsYW1iZGEgeDogeD09IiAiLCAiIGFiY2QiLCAiYWJjZCBhYmNkIikKLT4+PiBzLmZpbmRfbG9uZ2VzdF9tYXRjaCgwLCA1LCAwLCA5KQotKDEsIDAsIDQpCi1cZW5ke3ZlcmJhdGltfQotCi0gIElmIG5vIGJsb2NrcyBtYXRjaCwgdGhpcyByZXR1cm5zIFxjb2RleyhcdmFye2Fsb30sIFx2YXJ7YmxvfSwgMCl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Z2V0X21hdGNoaW5nX2Jsb2Nrc317fQotICBSZXR1cm4gbGlzdCBvZiB0cmlwbGVzIGRlc2NyaWJpbmcgbWF0Y2hpbmcgc3Vic2VxdWVuY2VzLgotICBFYWNoIHRyaXBsZSBpcyBvZiB0aGUgZm9ybSBcY29kZXsoXHZhcntpfSwgXHZhcntqfSwgXHZhcntufSl9LCBhbmQKLSAgbWVhbnMgdGhhdCBcY29kZXtcdmFye2F9W1x2YXJ7aX06XHZhcntpfStcdmFye259XSA9PQotICBcdmFye2J9W1x2YXJ7an06XHZhcntqfStcdmFye259XX0uICBUaGUgdHJpcGxlcyBhcmUgbW9ub3RvbmljYWxseQotICBpbmNyZWFzaW5nIGluIFx2YXJ7aX0gYW5kIFx2YXJ7an0uCi0KLSAgVGhlIGxhc3QgdHJpcGxlIGlzIGEgZHVtbXksIGFuZCBoYXMgdGhlIHZhbHVlIFxjb2RleyhsZW4oXHZhcnthfSksCi0gIGxlbihcdmFye2J9KSwgMCl9LiAgSXQgaXMgdGhlIG9ubHkgdHJpcGxlIHdpdGggXGNvZGV7XHZhcntufSA9PSAwfS4KLSAgJSBFeHBsYWluIHdoeSBhIGR1bW15IGlzIHVzZWQhCi0KLSAgSWYKLSAgXGNvZGV7KFx2YXJ7aX0sIFx2YXJ7an0sIFx2YXJ7bn0pfSBhbmQKLSAgXGNvZGV7KFx2YXJ7aSd9LCBcdmFye2onfSwgXHZhcntuJ30pfSBhcmUgYWRqYWNlbnQgdHJpcGxlcyBpbiB0aGUgbGlzdCwKLSAgYW5kIHRoZSBzZWNvbmQgaXMgbm90IHRoZSBsYXN0IHRyaXBsZSBpbiB0aGUgbGlzdCwgdGhlbgotICBcY29kZXtcdmFye2l9K1x2YXJ7bn0gIT0gXHZhcntpJ319IG9yCi0gIFxjb2Rle1x2YXJ7an0rXHZhcntufSAhPSBcdmFye2onfX07IGluIG90aGVyIHdvcmRzLCBhZGphY2VudCB0cmlwbGVzCi0gIGFsd2F5cyBkZXNjcmliZSBub24tYWRqYWNlbnQgZXF1YWwgYmxvY2tzLgotICBcdmVyc2lvbmNoYW5nZWRbVGhlIGd1YXJhbnRlZSB0aGF0IGFkamFjZW50IHRyaXBsZXMgYWx3YXlzIGRlc2NyaWJlCi0gICAgICAgICAgICAgICAgICBub24tYWRqYWNlbnQgYmxvY2tzIHdhcyBpbXBsZW1lbnRlZF17Mi41fQotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gcyA9IFNlcXVlbmNlTWF0Y2hlcihOb25lLCAiYWJ4Y2QiLCAiYWJjZCIpCi0+Pj4gcy5nZXRfbWF0Y2hpbmdfYmxvY2tzKCkKLVsoMCwgMCwgMiksICgzLCAyLCAyKSwgKDUsIDQsIDApXQotXGVuZHt2ZXJiYXRpbX0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2dldF9vcGNvZGVzfXt9Ci0gIFJldHVybiBsaXN0IG9mIDUtdHVwbGVzIGRlc2NyaWJpbmcgaG93IHRvIHR1cm4gXHZhcnthfSBpbnRvIFx2YXJ7Yn0uCi0gIEVhY2ggdHVwbGUgaXMgb2YgdGhlIGZvcm0gXGNvZGV7KFx2YXJ7dGFnfSwgXHZhcntpMX0sIFx2YXJ7aTJ9LAotICBcdmFye2oxfSwgXHZhcntqMn0pfS4gIFRoZSBmaXJzdCB0dXBsZSBoYXMgXGNvZGV7XHZhcntpMX0gPT0KLSAgXHZhcntqMX0gPT0gMH0sIGFuZCByZW1haW5pbmcgdHVwbGVzIGhhdmUgXHZhcntpMX0gZXF1YWwgdG8gdGhlCi0gIFx2YXJ7aTJ9IGZyb20gdGhlIHByZWNlZGluZyB0dXBsZSwgYW5kLCBsaWtld2lzZSwgXHZhcntqMX0gZXF1YWwgdG8KLSAgdGhlIHByZXZpb3VzIFx2YXJ7ajJ9LgotCi0gIFRoZSBcdmFye3RhZ30gdmFsdWVzIGFyZSBzdHJpbmdzLCB3aXRoIHRoZXNlIG1lYW5pbmdzOgotCi1cYmVnaW57dGFibGVpaX17bHxsfXtjb2RlfXtWYWx1ZX17TWVhbmluZ30KLSAgXGxpbmVpaXsncmVwbGFjZSd9e1xjb2Rle1x2YXJ7YX1bXHZhcntpMX06XHZhcntpMn1dfSBzaG91bGQgYmUKLSAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VkIGJ5IFxjb2Rle1x2YXJ7Yn1bXHZhcntqMX06XHZhcntqMn1dfS59Ci0gIFxsaW5laWl7J2RlbGV0ZSd9e1xjb2Rle1x2YXJ7YX1bXHZhcntpMX06XHZhcntpMn1dfSBzaG91bGQgYmUKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlZC4gIE5vdGUgdGhhdCBcY29kZXtcdmFye2oxfSA9PSBcdmFye2oyfX0gaW4KLSAgICAgICAgICAgICAgICAgICAgdGhpcyBjYXNlLn0KLSAgXGxpbmVpaXsnaW5zZXJ0J317XGNvZGV7XHZhcntifVtcdmFye2oxfTpcdmFye2oyfV19IHNob3VsZCBiZQotICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZCBhdCBcY29kZXtcdmFye2F9W1x2YXJ7aTF9Olx2YXJ7aTF9XX0uCi0gICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBcY29kZXtcdmFye2kxfSA9PSBcdmFye2kyfX0gaW4gdGhpcwotICAgICAgICAgICAgICAgICAgICBjYXNlLn0KLSAgXGxpbmVpaXsnZXF1YWwnfXtcY29kZXtcdmFye2F9W1x2YXJ7aTF9Olx2YXJ7aTJ9XSA9PQotICAgICAgICAgICAgICAgICAgIFx2YXJ7Yn1bXHZhcntqMX06XHZhcntqMn1dfSAodGhlIHN1Yi1zZXF1ZW5jZXMgYXJlCi0gICAgICAgICAgICAgICAgICAgZXF1YWwpLn0KLVxlbmR7dGFibGVpaX0KLQotRm9yIGV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBhID0gInFhYnhjZCIKLT4+PiBiID0gImFieWNkZiIKLT4+PiBzID0gU2VxdWVuY2VNYXRjaGVyKE5vbmUsIGEsIGIpCi0+Pj4gZm9yIHRhZywgaTEsIGkyLCBqMSwgajIgaW4gcy5nZXRfb3Bjb2RlcygpOgotLi4uICAgIHByaW50ICgiJTdzIGFbJWQ6JWRdICglcykgYlslZDolZF0gKCVzKSIgJQotLi4uICAgICAgICAgICAodGFnLCBpMSwgaTIsIGFbaTE6aTJdLCBqMSwgajIsIGJbajE6ajJdKSkKLSBkZWxldGUgYVswOjFdIChxKSBiWzA6MF0gKCkKLSAgZXF1YWwgYVsxOjNdIChhYikgYlswOjJdIChhYikKLXJlcGxhY2UgYVszOjRdICh4KSBiWzI6M10gKHkpCi0gIGVxdWFsIGFbNDo2XSAoY2QpIGJbMzo1XSAoY2QpCi0gaW5zZXJ0IGFbNjo2XSAoKSBiWzU6Nl0gKGYpCi1cZW5ke3ZlcmJhdGltfQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Z2V0X2dyb3VwZWRfb3Bjb2Rlc317XG9wdGlvbmFse259fQotICBSZXR1cm4gYSBnZW5lcmF0b3Igb2YgZ3JvdXBzIHdpdGggdXAgdG8gXHZhcntufSBsaW5lcyBvZiBjb250ZXh0LgotCi0gIFN0YXJ0aW5nIHdpdGggdGhlIGdyb3VwcyByZXR1cm5lZCBieSBcbWV0aG9ke2dldF9vcGNvZGVzKCl9LAotICB0aGlzIG1ldGhvZCBzcGxpdHMgb3V0IHNtYWxsZXIgY2hhbmdlIGNsdXN0ZXJzIGFuZCBlbGltaW5hdGVzCi0gIGludGVydmVuaW5nIHJhbmdlcyB3aGljaCBoYXZlIG5vIGNoYW5nZXMuCi0KLSAgVGhlIGdyb3VwcyBhcmUgcmV0dXJuZWQgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIFxtZXRob2R7Z2V0X29wY29kZXMoKX0uCi0gIFx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317cmF0aW99e30KLSAgUmV0dXJuIGEgbWVhc3VyZSBvZiB0aGUgc2VxdWVuY2VzJyBzaW1pbGFyaXR5IGFzIGEgZmxvYXQgaW4gdGhlCi0gIHJhbmdlIFswLCAxXS4KLQotICBXaGVyZSBUIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgZWxlbWVudHMgaW4gYm90aCBzZXF1ZW5jZXMsIGFuZCBNIGlzCi0gIHRoZSBudW1iZXIgb2YgbWF0Y2hlcywgdGhpcyBpcyAyLjAqTSAvIFQuIE5vdGUgdGhhdCB0aGlzIGlzCi0gIFxjb2RlezEuMH0gaWYgdGhlIHNlcXVlbmNlcyBhcmUgaWRlbnRpY2FsLCBhbmQgXGNvZGV7MC4wfSBpZiB0aGV5Ci0gIGhhdmUgbm90aGluZyBpbiBjb21tb24uCi0KLSAgVGhpcyBpcyBleHBlbnNpdmUgdG8gY29tcHV0ZSBpZiBcbWV0aG9ke2dldF9tYXRjaGluZ19ibG9ja3MoKX0gb3IKLSAgXG1ldGhvZHtnZXRfb3Bjb2RlcygpfSBoYXNuJ3QgYWxyZWFkeSBiZWVuIGNhbGxlZCwgaW4gd2hpY2ggY2FzZSB5b3UKLSAgbWF5IHdhbnQgdG8gdHJ5IFxtZXRob2R7cXVpY2tfcmF0aW8oKX0gb3IKLSAgXG1ldGhvZHtyZWFsX3F1aWNrX3JhdGlvKCl9IGZpcnN0IHRvIGdldCBhbiB1cHBlciBib3VuZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3F1aWNrX3JhdGlvfXt9Ci0gIFJldHVybiBhbiB1cHBlciBib3VuZCBvbiBcbWV0aG9ke3JhdGlvKCl9IHJlbGF0aXZlbHkgcXVpY2tseS4KLQotICBUaGlzIGlzbid0IGRlZmluZWQgYmV5b25kIHRoYXQgaXQgaXMgYW4gdXBwZXIgYm91bmQgb24KLSAgXG1ldGhvZHtyYXRpbygpfSwgYW5kIGlzIGZhc3RlciB0byBjb21wdXRlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317cmVhbF9xdWlja19yYXRpb317fQotICBSZXR1cm4gYW4gdXBwZXIgYm91bmQgb24gXG1ldGhvZHtyYXRpbygpfSB2ZXJ5IHF1aWNrbHkuCi0KLSAgVGhpcyBpc24ndCBkZWZpbmVkIGJleW9uZCB0aGF0IGl0IGlzIGFuIHVwcGVyIGJvdW5kIG9uCi0gIFxtZXRob2R7cmF0aW8oKX0sIGFuZCBpcyBmYXN0ZXIgdG8gY29tcHV0ZSB0aGFuIGVpdGhlcgotICBcbWV0aG9ke3JhdGlvKCl9IG9yIFxtZXRob2R7cXVpY2tfcmF0aW8oKX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVRoZSB0aHJlZSBtZXRob2RzIHRoYXQgcmV0dXJuIHRoZSByYXRpbyBvZiBtYXRjaGluZyB0byB0b3RhbCBjaGFyYWN0ZXJzCi1jYW4gZ2l2ZSBkaWZmZXJlbnQgcmVzdWx0cyBkdWUgdG8gZGlmZmVyaW5nIGxldmVscyBvZiBhcHByb3hpbWF0aW9uLAotYWx0aG91Z2ggXG1ldGhvZHtxdWlja19yYXRpbygpfSBhbmQgXG1ldGhvZHtyZWFsX3F1aWNrX3JhdGlvKCl9IGFyZSBhbHdheXMKLWF0IGxlYXN0IGFzIGxhcmdlIGFzIFxtZXRob2R7cmF0aW8oKX06Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBzID0gU2VxdWVuY2VNYXRjaGVyKE5vbmUsICJhYmNkIiwgImJjZGUiKQotPj4+IHMucmF0aW8oKQotMC43NQotPj4+IHMucXVpY2tfcmF0aW8oKQotMC43NQotPj4+IHMucmVhbF9xdWlja19yYXRpbygpCi0xLjAKLVxlbmR7dmVyYmF0aW19Ci0KLQotXHN1YnNlY3Rpb257U2VxdWVuY2VNYXRjaGVyIEV4YW1wbGVzIFxsYWJlbHtzZXF1ZW5jZW1hdGNoZXItZXhhbXBsZXN9fQotCi0KLVRoaXMgZXhhbXBsZSBjb21wYXJlcyB0d28gc3RyaW5ncywgY29uc2lkZXJpbmcgYmxhbmtzIHRvIGJlIGBganVuazonJwotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gcyA9IFNlcXVlbmNlTWF0Y2hlcihsYW1iZGEgeDogeCA9PSAiICIsCi0uLi4gICAgICAgICAgICAgICAgICAgICAicHJpdmF0ZSBUaHJlYWQgY3VycmVudFRocmVhZDsiLAotLi4uICAgICAgICAgICAgICAgICAgICAgInByaXZhdGUgdm9sYXRpbGUgVGhyZWFkIGN1cnJlbnRUaHJlYWQ7IikKLVxlbmR7dmVyYmF0aW19Ci0KLVxtZXRob2R7cmF0aW8oKX0gcmV0dXJucyBhIGZsb2F0IGluIFswLCAxXSwgbWVhc3VyaW5nIHRoZSBzaW1pbGFyaXR5Ci1vZiB0aGUgc2VxdWVuY2VzLiAgQXMgYSBydWxlIG9mIHRodW1iLCBhIFxtZXRob2R7cmF0aW8oKX0gdmFsdWUgb3ZlcgotMC42IG1lYW5zIHRoZSBzZXF1ZW5jZXMgYXJlIGNsb3NlIG1hdGNoZXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBwcmludCByb3VuZChzLnJhdGlvKCksIDMpCi0wLjg2NgotXGVuZHt2ZXJiYXRpbX0KLQotSWYgeW91J3JlIG9ubHkgaW50ZXJlc3RlZCBpbiB3aGVyZSB0aGUgc2VxdWVuY2VzIG1hdGNoLAotXG1ldGhvZHtnZXRfbWF0Y2hpbmdfYmxvY2tzKCl9IGlzIGhhbmR5OgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZm9yIGJsb2NrIGluIHMuZ2V0X21hdGNoaW5nX2Jsb2NrcygpOgotLi4uICAgICBwcmludCAiYVslZF0gYW5kIGJbJWRdIG1hdGNoIGZvciAlZCBlbGVtZW50cyIgJSBibG9jawotYVswXSBhbmQgYlswXSBtYXRjaCBmb3IgOCBlbGVtZW50cwotYVs4XSBhbmQgYlsxN10gbWF0Y2ggZm9yIDYgZWxlbWVudHMKLWFbMTRdIGFuZCBiWzIzXSBtYXRjaCBmb3IgMTUgZWxlbWVudHMKLWFbMjldIGFuZCBiWzM4XSBtYXRjaCBmb3IgMCBlbGVtZW50cwotXGVuZHt2ZXJiYXRpbX0KLQotTm90ZSB0aGF0IHRoZSBsYXN0IHR1cGxlIHJldHVybmVkIGJ5IFxtZXRob2R7Z2V0X21hdGNoaW5nX2Jsb2NrcygpfSBpcwotYWx3YXlzIGEgZHVtbXksIFxjb2RleyhsZW4oXHZhcnthfSksIGxlbihcdmFye2J9KSwgMCl9LCBhbmQgdGhpcyBpcwotdGhlIG9ubHkgY2FzZSBpbiB3aGljaCB0aGUgbGFzdCB0dXBsZSBlbGVtZW50IChudW1iZXIgb2YgZWxlbWVudHMKLW1hdGNoZWQpIGlzIFxjb2RlezB9LgotCi1JZiB5b3Ugd2FudCB0byBrbm93IGhvdyB0byBjaGFuZ2UgdGhlIGZpcnN0IHNlcXVlbmNlIGludG8gdGhlIHNlY29uZCwKLXVzZSBcbWV0aG9ke2dldF9vcGNvZGVzKCl9OgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZm9yIG9wY29kZSBpbiBzLmdldF9vcGNvZGVzKCk6Ci0uLi4gICAgIHByaW50ICIlNnMgYVslZDolZF0gYlslZDolZF0iICUgb3Bjb2RlCi0gZXF1YWwgYVswOjhdIGJbMDo4XQotaW5zZXJ0IGFbODo4XSBiWzg6MTddCi0gZXF1YWwgYVs4OjE0XSBiWzE3OjIzXQotIGVxdWFsIGFbMTQ6MjldIGJbMjM6MzhdCi1cZW5ke3ZlcmJhdGltfQotCi1TZWUgYWxzbyB0aGUgZnVuY3Rpb24gXGZ1bmN0aW9ue2dldF9jbG9zZV9tYXRjaGVzKCl9IGluIHRoaXMgbW9kdWxlLAotd2hpY2ggc2hvd3MgaG93IHNpbXBsZSBjb2RlIGJ1aWxkaW5nIG9uIFxjbGFzc3tTZXF1ZW5jZU1hdGNoZXJ9IGNhbiBiZQotdXNlZCB0byBkbyB1c2VmdWwgd29yay4KLQotCi1cc3Vic2VjdGlvbntEaWZmZXIgT2JqZWN0cyBcbGFiZWx7ZGlmZmVyLW9iamVjdHN9fQotCi1Ob3RlIHRoYXQgXGNsYXNze0RpZmZlcn0tZ2VuZXJhdGVkIGRlbHRhcyBtYWtlIG5vIGNsYWltIHRvIGJlCi1cc3Ryb25ne21pbmltYWx9IGRpZmZzLiBUbyB0aGUgY29udHJhcnksIG1pbmltYWwgZGlmZnMgYXJlIG9mdGVuCi1jb3VudGVyLWludHVpdGl2ZSwgYmVjYXVzZSB0aGV5IHN5bmNoIHVwIGFueXdoZXJlIHBvc3NpYmxlLCBzb21ldGltZXMKLWFjY2lkZW50YWwgbWF0Y2hlcyAxMDAgcGFnZXMgYXBhcnQuIFJlc3RyaWN0aW5nIHN5bmNoIHBvaW50cyB0bwotY29udGlndW91cyBtYXRjaGVzIHByZXNlcnZlcyBzb21lIG5vdGlvbiBvZiBsb2NhbGl0eSwgYXQgdGhlCi1vY2Nhc2lvbmFsIGNvc3Qgb2YgcHJvZHVjaW5nIGEgbG9uZ2VyIGRpZmYuCi0KLVRoZSBcY2xhc3N7RGlmZmVyfSBjbGFzcyBoYXMgdGhpcyBjb25zdHJ1Y3RvcjoKLQotXGJlZ2lue2NsYXNzZGVzY317RGlmZmVyfXtcb3B0aW9uYWx7bGluZWp1bmtcb3B0aW9uYWx7LCBjaGFyanVua319fQotICBPcHRpb25hbCBrZXl3b3JkIHBhcmFtZXRlcnMgXHZhcntsaW5lanVua30gYW5kIFx2YXJ7Y2hhcmp1bmt9IGFyZQotICBmb3IgZmlsdGVyIGZ1bmN0aW9ucyAob3IgXGNvZGV7Tm9uZX0pOgotCi0gIFx2YXJ7bGluZWp1bmt9OiBBIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBhIHNpbmdsZSBzdHJpbmcKLSAgYXJndW1lbnQsIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIHN0cmluZyBpcyBqdW5rLiAgVGhlIGRlZmF1bHQgaXMKLSAgXGNvZGV7Tm9uZX0sIG1lYW5pbmcgdGhhdCBubyBsaW5lIGlzIGNvbnNpZGVyZWQganVuay4KLQotICBcdmFye2NoYXJqdW5rfTogQSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYSBzaW5nbGUgY2hhcmFjdGVyIGFyZ3VtZW50Ci0gIChhIHN0cmluZyBvZiBsZW5ndGggMSksIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIGNoYXJhY3RlciBpcyBqdW5rLgotICBUaGUgZGVmYXVsdCBpcyBcY29kZXtOb25lfSwgbWVhbmluZyB0aGF0IG5vIGNoYXJhY3RlciBpcwotICBjb25zaWRlcmVkIGp1bmsuCi1cZW5ke2NsYXNzZGVzY30KLQotXGNsYXNze0RpZmZlcn0gb2JqZWN0cyBhcmUgdXNlZCAoZGVsdGFzIGdlbmVyYXRlZCkgdmlhIGEgc2luZ2xlCi1tZXRob2Q6Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtjb21wYXJlfXthLCBifQotICBDb21wYXJlIHR3byBzZXF1ZW5jZXMgb2YgbGluZXMsIGFuZCBnZW5lcmF0ZSB0aGUgZGVsdGEgKGEgc2VxdWVuY2UKLSAgb2YgbGluZXMpLgotCi0gIEVhY2ggc2VxdWVuY2UgbXVzdCBjb250YWluIGluZGl2aWR1YWwgc2luZ2xlLWxpbmUgc3RyaW5ncyBlbmRpbmcKLSAgd2l0aCBuZXdsaW5lcy4gU3VjaCBzZXF1ZW5jZXMgY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlCi0gIFxtZXRob2R7cmVhZGxpbmVzKCl9IG1ldGhvZCBvZiBmaWxlLWxpa2Ugb2JqZWN0cy4gIFRoZSBkZWx0YSBnZW5lcmF0ZWQKLSAgYWxzbyBjb25zaXN0cyBvZiBuZXdsaW5lLXRlcm1pbmF0ZWQgc3RyaW5ncywgcmVhZHkgdG8gYmUgcHJpbnRlZCBhcy1pcwotICB2aWEgdGhlIFxtZXRob2R7d3JpdGVsaW5lcygpfSBtZXRob2Qgb2YgYSBmaWxlLWxpa2Ugb2JqZWN0LgotXGVuZHttZXRob2RkZXNjfQotCi0KLVxzdWJzZWN0aW9ue0RpZmZlciBFeGFtcGxlIFxsYWJlbHtkaWZmZXItZXhhbXBsZXN9fQotCi1UaGlzIGV4YW1wbGUgY29tcGFyZXMgdHdvIHRleHRzLiBGaXJzdCB3ZSBzZXQgdXAgdGhlIHRleHRzLCBzZXF1ZW5jZXMKLW9mIGluZGl2aWR1YWwgc2luZ2xlLWxpbmUgc3RyaW5ncyBlbmRpbmcgd2l0aCBuZXdsaW5lcyAoc3VjaCBzZXF1ZW5jZXMKLWNhbiBhbHNvIGJlIG9idGFpbmVkIGZyb20gdGhlIFxtZXRob2R7cmVhZGxpbmVzKCl9IG1ldGhvZCBvZiBmaWxlLWxpa2UKLW9iamVjdHMpOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gdGV4dDEgPSAnJycgIDEuIEJlYXV0aWZ1bCBpcyBiZXR0ZXIgdGhhbiB1Z2x5LgotLi4uICAgMi4gRXhwbGljaXQgaXMgYmV0dGVyIHRoYW4gaW1wbGljaXQuCi0uLi4gICAzLiBTaW1wbGUgaXMgYmV0dGVyIHRoYW4gY29tcGxleC4KLS4uLiAgIDQuIENvbXBsZXggaXMgYmV0dGVyIHRoYW4gY29tcGxpY2F0ZWQuCi0uLi4gJycnLnNwbGl0bGluZXMoMSkKLT4+PiBsZW4odGV4dDEpCi00Ci0+Pj4gdGV4dDFbMF1bLTFdCi0nXG4nCi0+Pj4gdGV4dDIgPSAnJycgIDEuIEJlYXV0aWZ1bCBpcyBiZXR0ZXIgdGhhbiB1Z2x5LgotLi4uICAgMy4gICBTaW1wbGUgaXMgYmV0dGVyIHRoYW4gY29tcGxleC4KLS4uLiAgIDQuIENvbXBsaWNhdGVkIGlzIGJldHRlciB0aGFuIGNvbXBsZXguCi0uLi4gICA1LiBGbGF0IGlzIGJldHRlciB0aGFuIG5lc3RlZC4KLS4uLiAnJycuc3BsaXRsaW5lcygxKQotXGVuZHt2ZXJiYXRpbX0KLQotTmV4dCB3ZSBpbnN0YW50aWF0ZSBhIERpZmZlciBvYmplY3Q6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBkID0gRGlmZmVyKCkKLVxlbmR7dmVyYmF0aW19Ci0KLU5vdGUgdGhhdCB3aGVuIGluc3RhbnRpYXRpbmcgYSBcY2xhc3N7RGlmZmVyfSBvYmplY3Qgd2UgbWF5IHBhc3MKLWZ1bmN0aW9ucyB0byBmaWx0ZXIgb3V0IGxpbmUgYW5kIGNoYXJhY3RlciBgYGp1bmsuJycgIFNlZSB0aGUKLVxtZXRob2R7RGlmZmVyKCl9IGNvbnN0cnVjdG9yIGZvciBkZXRhaWxzLgotCi1GaW5hbGx5LCB3ZSBjb21wYXJlIHRoZSB0d286Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiByZXN1bHQgPSBsaXN0KGQuY29tcGFyZSh0ZXh0MSwgdGV4dDIpKQotXGVuZHt2ZXJiYXRpbX0KLQotXGNvZGV7cmVzdWx0fSBpcyBhIGxpc3Qgb2Ygc3RyaW5ncywgc28gbGV0J3MgcHJldHR5LXByaW50IGl0OgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZnJvbSBwcHJpbnQgaW1wb3J0IHBwcmludAotPj4+IHBwcmludChyZXN1bHQpCi1bJyAgICAxLiBCZWF1dGlmdWwgaXMgYmV0dGVyIHRoYW4gdWdseS5cbicsCi0gJy0gICAyLiBFeHBsaWNpdCBpcyBiZXR0ZXIgdGhhbiBpbXBsaWNpdC5cbicsCi0gJy0gICAzLiBTaW1wbGUgaXMgYmV0dGVyIHRoYW4gY29tcGxleC5cbicsCi0gJysgICAzLiAgIFNpbXBsZSBpcyBiZXR0ZXIgdGhhbiBjb21wbGV4LlxuJywKLSAnPyAgICAgKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuJywKLSAnLSAgIDQuIENvbXBsZXggaXMgYmV0dGVyIHRoYW4gY29tcGxpY2F0ZWQuXG4nLAotICc/ICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgIC0tLS0gXiAgXG4nLAotICcrICAgNC4gQ29tcGxpY2F0ZWQgaXMgYmV0dGVyIHRoYW4gY29tcGxleC5cbicsCi0gJz8gICAgICAgICAgICsrKysgXiAgICAgICAgICAgICAgICAgICAgICBeICBcbicsCi0gJysgICA1LiBGbGF0IGlzIGJldHRlciB0aGFuIG5lc3RlZC5cbiddCi1cZW5ke3ZlcmJhdGltfQotCi1BcyBhIHNpbmdsZSBtdWx0aS1saW5lIHN0cmluZyBpdCBsb29rcyBsaWtlIHRoaXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgc3lzCi0+Pj4gc3lzLnN0ZG91dC53cml0ZWxpbmVzKHJlc3VsdCkKLSAgICAxLiBCZWF1dGlmdWwgaXMgYmV0dGVyIHRoYW4gdWdseS4KLS0gICAyLiBFeHBsaWNpdCBpcyBiZXR0ZXIgdGhhbiBpbXBsaWNpdC4KLS0gICAzLiBTaW1wbGUgaXMgYmV0dGVyIHRoYW4gY29tcGxleC4KLSsgICAzLiAgIFNpbXBsZSBpcyBiZXR0ZXIgdGhhbiBjb21wbGV4LgotPyAgICAgKysKLS0gICA0LiBDb21wbGV4IGlzIGJldHRlciB0aGFuIGNvbXBsaWNhdGVkLgotPyAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgICAtLS0tIF4KLSsgICA0LiBDb21wbGljYXRlZCBpcyBiZXR0ZXIgdGhhbiBjb21wbGV4LgotPyAgICAgICAgICAgKysrKyBeICAgICAgICAgICAgICAgICAgICAgIF4KLSsgICA1LiBGbGF0IGlzIGJldHRlciB0aGFuIG5lc3RlZC4KLVxlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmRpcmNhY2hlLnRleCBiL0RvYy9saWIvbGliZGlyY2FjaGUudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODg0NTQ5Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGliZGlyY2FjaGUudGV4CisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtkaXJjYWNoZX0gLS0tCi0gICAgICAgICBDYWNoZWQgZGlyZWN0b3J5IGxpc3RpbmdzfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZGlyY2FjaGV9Ci1cc2VjdGlvbmF1dGhvcntNb3NoZSBaYWRrYX17bW9zaGV6QHphZGthLnNpdGUuY28uaWx9Ci1cbW9kdWxlc3lub3BzaXN7UmV0dXJuIGRpcmVjdG9yeSBsaXN0aW5nLCB3aXRoIGNhY2hlIG1lY2hhbmlzbS59Ci0KLVRoZSBcbW9kdWxle2RpcmNhY2hlfSBtb2R1bGUgZGVmaW5lcyBhIGZ1bmN0aW9uIGZvciByZWFkaW5nIGRpcmVjdG9yeSBsaXN0aW5nCi11c2luZyBhIGNhY2hlLCBhbmQgY2FjaGUgaW52YWxpZGF0aW9uIHVzaW5nIHRoZSBcdmFye210aW1lfSBvZiB0aGUgZGlyZWN0b3J5LgotQWRkaXRpb25hbGx5LCBpdCBkZWZpbmVzIGEgZnVuY3Rpb24gdG8gYW5ub3RhdGUgZGlyZWN0b3JpZXMgYnkgYXBwZW5kaW5nCi1hIHNsYXNoLgotCi1UaGUgXG1vZHVsZXtkaXJjYWNoZX0gbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6Ci0KLVxiZWdpbntmdW5jZGVzY317cmVzZXR9e30KLVJlc2V0cyB0aGUgZGlyZWN0b3J5IGNhY2hlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtsaXN0ZGlyfXtwYXRofQotUmV0dXJuIGEgZGlyZWN0b3J5IGxpc3Rpbmcgb2YgXHZhcntwYXRofSwgYXMgZ290dGVuIGZyb20KLVxmdW5jdGlvbntvcy5saXN0ZGlyKCl9LiBOb3RlIHRoYXQgdW5sZXNzIFx2YXJ7cGF0aH0gY2hhbmdlcywgZnVydGhlciBjYWxsCi10byBcZnVuY3Rpb257bGlzdGRpcigpfSB3aWxsIG5vdCByZS1yZWFkIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlLgotCi1Ob3RlIHRoYXQgdGhlIGxpc3QgcmV0dXJuZWQgc2hvdWxkIGJlIHJlZ2FyZGVkIGFzIHJlYWQtb25seS4gKFBlcmhhcHMKLWEgZnV0dXJlIHZlcnNpb24gc2hvdWxkIGNoYW5nZSBpdCB0byByZXR1cm4gYSB0dXBsZT8pCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e29wZW5kaXJ9e3BhdGh9Ci1TYW1lIGFzIFxmdW5jdGlvbntsaXN0ZGlyKCl9LiBEZWZpbmVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317YW5ub3RhdGV9e2hlYWQsIGxpc3R9Ci1Bc3N1bWUgXHZhcntsaXN0fSBpcyBhIGxpc3Qgb2YgcGF0aHMgcmVsYXRpdmUgdG8gXHZhcntoZWFkfSwgYW5kIGFwcGVuZCwKLWluIHBsYWNlLCBhIFxjaGFyYWN0ZXJ7L30gdG8gZWFjaCBwYXRoIHdoaWNoIHBvaW50cyB0byBhIGRpcmVjdG9yeS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgZGlyY2FjaGUKLT4+PiBhID0gZGlyY2FjaGUubGlzdGRpcignLycpCi0+Pj4gYSA9IGFbOl0gIyBDb3B5IHRoZSByZXR1cm4gdmFsdWUgc28gd2UgY2FuIGNoYW5nZSAnYScKLT4+PiBhCi1bJ2JpbicsICdib290JywgJ2Nkcm9tJywgJ2RldicsICdldGMnLCAnZmxvcHB5JywgJ2hvbWUnLCAnaW5pdHJkJywgJ2xpYicsICdsb3N0KwotZm91bmQnLCAnbW50JywgJ3Byb2MnLCAncm9vdCcsICdzYmluJywgJ3RtcCcsICd1c3InLCAndmFyJywgJ3ZtbGludXonXQotPj4+IGRpcmNhY2hlLmFubm90YXRlKCcvJywgYSkKLT4+PiBhCi1bJ2Jpbi8nLCAnYm9vdC8nLCAnY2Ryb20vJywgJ2Rldi8nLCAnZXRjLycsICdmbG9wcHkvJywgJ2hvbWUvJywgJ2luaXRyZC8nLCAnbGliLwotJywgJ2xvc3QrZm91bmQvJywgJ21udC8nLCAncHJvYy8nLCAncm9vdC8nLCAnc2Jpbi8nLCAndG1wLycsICd1c3IvJywgJ3Zhci8nLCAndm0KLWxpbnV6J10KLVxlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmRpcy50ZXggYi9Eb2MvbGliL2xpYmRpcy50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNzhkOWEuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJkaXMudGV4CisrKyAvZGV2L251bGwKQEAgLTEsNjc0ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7ZGlzfSAtLS0KLSAgICAgICAgIERpc2Fzc2VtYmxlciBmb3IgUHl0aG9uIGJ5dGUgY29kZX0KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2Rpc30KLVxtb2R1bGVzeW5vcHNpc3tEaXNhc3NlbWJsZXIgZm9yIFB5dGhvbiBieXRlIGNvZGUufQotCi0KLVRoZSBcbW9kdWxle2Rpc30gbW9kdWxlIHN1cHBvcnRzIHRoZSBhbmFseXNpcyBvZiBQeXRob24gYnl0ZSBjb2RlIGJ5Ci1kaXNhc3NlbWJsaW5nIGl0LiAgU2luY2UgdGhlcmUgaXMgbm8gUHl0aG9uIGFzc2VtYmxlciwgdGhpcyBtb2R1bGUKLWRlZmluZXMgdGhlIFB5dGhvbiBhc3NlbWJseSBsYW5ndWFnZS4gIFRoZSBQeXRob24gYnl0ZSBjb2RlIHdoaWNoCi10aGlzIG1vZHVsZSB0YWtlcyBhcyBhbiBpbnB1dCBpcyBkZWZpbmVkIGluIHRoZSBmaWxlIAotXGZpbGV7SW5jbHVkZS9vcGNvZGUuaH0gYW5kIHVzZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCB0aGUgaW50ZXJwcmV0ZXIuCi0KLUV4YW1wbGU6IEdpdmVuIHRoZSBmdW5jdGlvbiBcZnVuY3Rpb257bXlmdW5jfToKLQotXGJlZ2lue3ZlcmJhdGltfQotZGVmIG15ZnVuYyhhbGlzdCk6Ci0gICAgcmV0dXJuIGxlbihhbGlzdCkKLVxlbmR7dmVyYmF0aW19Ci0KLXRoZSBmb2xsb3dpbmcgY29tbWFuZCBjYW4gYmUgdXNlZCB0byBnZXQgdGhlIGRpc2Fzc2VtYmx5IG9mCi1cZnVuY3Rpb257bXlmdW5jKCl9OgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZGlzLmRpcyhteWZ1bmMpCi0gIDIgICAgICAgICAgIDAgTE9BRF9HTE9CQUwgICAgICAgICAgICAgIDAgKGxlbikKLSAgICAgICAgICAgICAgMyBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMCAoYWxpc3QpCi0gICAgICAgICAgICAgIDYgQ0FMTF9GVU5DVElPTiAgICAgICAgICAgIDEKLSAgICAgICAgICAgICAgOSBSRVRVUk5fVkFMVUUKLVxlbmR7dmVyYmF0aW19Ci0KLShUaGUgYGAyJycgaXMgYSBsaW5lIG51bWJlcikuCi0KLVRoZSBcbW9kdWxle2Rpc30gbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYW5kIGNvbnN0YW50czoKLQotXGJlZ2lue2Z1bmNkZXNjfXtkaXN9e1xvcHRpb25hbHtieXRlc291cmNlfX0KLURpc2Fzc2VtYmxlIHRoZSBcdmFye2J5dGVzb3VyY2V9IG9iamVjdC4gXHZhcntieXRlc291cmNlfSBjYW4gZGVub3RlCi1laXRoZXIgYSBtb2R1bGUsIGEgY2xhc3MsIGEgbWV0aG9kLCBhIGZ1bmN0aW9uLCBvciBhIGNvZGUgb2JqZWN0LiAgCi1Gb3IgYSBtb2R1bGUsIGl0IGRpc2Fzc2VtYmxlcyBhbGwgZnVuY3Rpb25zLiAgRm9yIGEgY2xhc3MsCi1pdCBkaXNhc3NlbWJsZXMgYWxsIG1ldGhvZHMuICBGb3IgYSBzaW5nbGUgY29kZSBzZXF1ZW5jZSwgaXQgcHJpbnRzCi1vbmUgbGluZSBwZXIgYnl0ZSBjb2RlIGluc3RydWN0aW9uLiAgSWYgbm8gb2JqZWN0IGlzIHByb3ZpZGVkLCBpdAotZGlzYXNzZW1ibGVzIHRoZSBsYXN0IHRyYWNlYmFjay4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZGlzdGJ9e1xvcHRpb25hbHt0Yn19Ci1EaXNhc3NlbWJsZXMgdGhlIHRvcC1vZi1zdGFjayBmdW5jdGlvbiBvZiBhIHRyYWNlYmFjaywgdXNpbmcgdGhlIGxhc3QKLXRyYWNlYmFjayBpZiBub25lIHdhcyBwYXNzZWQuICBUaGUgaW5zdHJ1Y3Rpb24gY2F1c2luZyB0aGUgZXhjZXB0aW9uCi1pcyBpbmRpY2F0ZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2Rpc2Fzc2VtYmxlfXtjb2RlXG9wdGlvbmFseywgbGFzdGl9fQotRGlzYXNzZW1ibGVzIGEgY29kZSBvYmplY3QsIGluZGljYXRpbmcgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gaWYgXHZhcntsYXN0aX0KLXdhcyBwcm92aWRlZC4gIFRoZSBvdXRwdXQgaXMgZGl2aWRlZCBpbiB0aGUgZm9sbG93aW5nIGNvbHVtbnM6Ci0KLVxiZWdpbntlbnVtZXJhdGV9Ci1caXRlbSB0aGUgbGluZSBudW1iZXIsIGZvciB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gb2YgZWFjaCBsaW5lCi1caXRlbSB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiwgaW5kaWNhdGVkIGFzIFxzYW1wey0tPn0sCi1caXRlbSBhIGxhYmVsbGVkIGluc3RydWN0aW9uLCBpbmRpY2F0ZWQgd2l0aCBcc2FtcHs+Pn0sCi1caXRlbSB0aGUgYWRkcmVzcyBvZiB0aGUgaW5zdHJ1Y3Rpb24sCi1caXRlbSB0aGUgb3BlcmF0aW9uIGNvZGUgbmFtZSwKLVxpdGVtIG9wZXJhdGlvbiBwYXJhbWV0ZXJzLCBhbmQKLVxpdGVtIGludGVycHJldGF0aW9uIG9mIHRoZSBwYXJhbWV0ZXJzIGluIHBhcmVudGhlc2VzLgotXGVuZHtlbnVtZXJhdGV9Ci0KLVRoZSBwYXJhbWV0ZXIgaW50ZXJwcmV0YXRpb24gcmVjb2duaXplcyBsb2NhbCBhbmQgZ2xvYmFsCi12YXJpYWJsZSBuYW1lcywgY29uc3RhbnQgdmFsdWVzLCBicmFuY2ggdGFyZ2V0cywgYW5kIGNvbXBhcmUKLW9wZXJhdG9ycy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZGlzY299e2NvZGVcb3B0aW9uYWx7LCBsYXN0aX19Ci1BIHN5bm9ueW0gZm9yIGRpc2Fzc2VtYmxlLiAgSXQgaXMgbW9yZSBjb252ZW5pZW50IHRvIHR5cGUsIGFuZCBrZXB0Ci1mb3IgY29tcGF0aWJpbGl0eSB3aXRoIGVhcmxpZXIgUHl0aG9uIHJlbGVhc2VzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtvcG5hbWV9Ci1TZXF1ZW5jZSBvZiBvcGVyYXRpb24gbmFtZXMsIGluZGV4YWJsZSB1c2luZyB0aGUgYnl0ZSBjb2RlLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtvcG1hcH0KLURpY3Rpb25hcnkgbWFwcGluZyBieXRlIGNvZGVzIHRvIG9wZXJhdGlvbiBuYW1lcy4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317Y21wX29wfQotU2VxdWVuY2Ugb2YgYWxsIGNvbXBhcmUgb3BlcmF0aW9uIG5hbWVzLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtoYXNjb25zdH0KLVNlcXVlbmNlIG9mIGJ5dGUgY29kZXMgdGhhdCBoYXZlIGEgY29uc3RhbnQgcGFyYW1ldGVyLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtoYXNmcmVlfQotU2VxdWVuY2Ugb2YgYnl0ZSBjb2RlcyB0aGF0IGFjY2VzcyBhIGZyZWUgdmFyaWFibGUuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e2hhc25hbWV9Ci1TZXF1ZW5jZSBvZiBieXRlIGNvZGVzIHRoYXQgYWNjZXNzIGFuIGF0dHJpYnV0ZSBieSBuYW1lLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtoYXNqcmVsfQotU2VxdWVuY2Ugb2YgYnl0ZSBjb2RlcyB0aGF0IGhhdmUgYSByZWxhdGl2ZSBqdW1wIHRhcmdldC4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317aGFzamFic30KLVNlcXVlbmNlIG9mIGJ5dGUgY29kZXMgdGhhdCBoYXZlIGFuIGFic29sdXRlIGp1bXAgdGFyZ2V0LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtoYXNsb2NhbH0KLVNlcXVlbmNlIG9mIGJ5dGUgY29kZXMgdGhhdCBhY2Nlc3MgYSBsb2NhbCB2YXJpYWJsZS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317aGFzY29tcGFyZX0KLVNlcXVlbmNlIG9mIGJ5dGUgY29kZXMgb2YgQm9vbGVhbiBvcGVyYXRpb25zLgotXGVuZHtkYXRhZGVzY30KLQotXHN1YnNlY3Rpb257UHl0aG9uIEJ5dGUgQ29kZSBJbnN0cnVjdGlvbnN9Ci1cbGFiZWx7Ynl0ZWNvZGVzfQotCi1UaGUgUHl0aG9uIGNvbXBpbGVyIGN1cnJlbnRseSBnZW5lcmF0ZXMgdGhlIGZvbGxvd2luZyBieXRlIGNvZGUKLWluc3RydWN0aW9ucy4KLQotXHNldGluZGV4c3ViaXRlbXsoYnl0ZSBjb2RlIGluc25zKX0KLQotXGJlZ2lue29wY29kZWRlc2N9e1NUT1BfQ09ERX17fQotSW5kaWNhdGVzIGVuZC1vZi1jb2RlIHRvIHRoZSBjb21waWxlciwgbm90IHVzZWQgYnkgdGhlIGludGVycHJldGVyLgotXGVuZHtvcGNvZGVkZXNjfQotCi1cYmVnaW57b3Bjb2RlZGVzY317Tk9QfXt9Ci1EbyBub3RoaW5nIGNvZGUuICBVc2VkIGFzIGEgcGxhY2Vob2xkZXIgYnkgdGhlIGJ5dGVjb2RlIG9wdGltaXplci4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e1BPUF9UT1B9e30KLVJlbW92ZXMgdGhlIHRvcC1vZi1zdGFjayAoVE9TKSBpdGVtLgotXGVuZHtvcGNvZGVkZXNjfQotCi1cYmVnaW57b3Bjb2RlZGVzY317Uk9UX1RXT317fQotU3dhcHMgdGhlIHR3byB0b3AtbW9zdCBzdGFjayBpdGVtcy4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e1JPVF9USFJFRX17fQotTGlmdHMgc2Vjb25kIGFuZCB0aGlyZCBzdGFjayBpdGVtIG9uZSBwb3NpdGlvbiB1cCwgbW92ZXMgdG9wIGRvd24KLXRvIHBvc2l0aW9uIHRocmVlLgotXGVuZHtvcGNvZGVkZXNjfQotCi1cYmVnaW57b3Bjb2RlZGVzY317Uk9UX0ZPVVJ9e30KLUxpZnRzIHNlY29uZCwgdGhpcmQgYW5kIGZvcnRoIHN0YWNrIGl0ZW0gb25lIHBvc2l0aW9uIHVwLCBtb3ZlcyB0b3AgZG93biB0bwotcG9zaXRpb24gZm91ci4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e0RVUF9UT1B9e30KLUR1cGxpY2F0ZXMgdGhlIHJlZmVyZW5jZSBvbiB0b3Agb2YgdGhlIHN0YWNrLgotXGVuZHtvcGNvZGVkZXNjfQotCi1VbmFyeSBPcGVyYXRpb25zIHRha2UgdGhlIHRvcCBvZiB0aGUgc3RhY2ssIGFwcGx5IHRoZSBvcGVyYXRpb24sIGFuZAotcHVzaCB0aGUgcmVzdWx0IGJhY2sgb24gdGhlIHN0YWNrLgotCi1cYmVnaW57b3Bjb2RlZGVzY317VU5BUllfUE9TSVRJVkV9e30KLUltcGxlbWVudHMgXGNvZGV7VE9TID0gK1RPU30uCi1cZW5ke29wY29kZWRlc2N9Ci0KLVxiZWdpbntvcGNvZGVkZXNjfXtVTkFSWV9ORUdBVElWRX17fQotSW1wbGVtZW50cyBcY29kZXtUT1MgPSAtVE9TfS4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e1VOQVJZX05PVH17fQotSW1wbGVtZW50cyBcY29kZXtUT1MgPSBub3QgVE9TfS4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e1VOQVJZX0lOVkVSVH17fQotSW1wbGVtZW50cyBcY29kZXtUT1MgPSBcfnt9VE9TfS4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e0dFVF9JVEVSfXt9Ci1JbXBsZW1lbnRzIFxjb2Rle1RPUyA9IGl0ZXIoVE9TKX0uCi1cZW5ke29wY29kZWRlc2N9Ci0KLUJpbmFyeSBvcGVyYXRpb25zIHJlbW92ZSB0aGUgdG9wIG9mIHRoZSBzdGFjayAoVE9TKSBhbmQgdGhlIHNlY29uZCB0b3AtbW9zdAotc3RhY2sgaXRlbSAoVE9TMSkgZnJvbSB0aGUgc3RhY2suICBUaGV5IHBlcmZvcm0gdGhlIG9wZXJhdGlvbiwgYW5kIHB1dCB0aGUKLXJlc3VsdCBiYWNrIG9uIHRoZSBzdGFjay4KLQotXGJlZ2lue29wY29kZWRlc2N9e0JJTkFSWV9QT1dFUn17fQotSW1wbGVtZW50cyBcY29kZXtUT1MgPSBUT1MxICoqIFRPU30uCi1cZW5ke29wY29kZWRlc2N9Ci0KLVxiZWdpbntvcGNvZGVkZXNjfXtCSU5BUllfTVVMVElQTFl9e30KLUltcGxlbWVudHMgXGNvZGV7VE9TID0gVE9TMSAqIFRPU30uCi1cZW5ke29wY29kZWRlc2N9Ci0KLVxiZWdpbntvcGNvZGVkZXNjfXtCSU5BUllfRkxPT1JfRElWSURFfXt9Ci1JbXBsZW1lbnRzIFxjb2Rle1RPUyA9IFRPUzEgLy8gVE9TfS4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e0JJTkFSWV9UUlVFX0RJVklERX17fQotSW1wbGVtZW50cyBcY29kZXtUT1MgPSBUT1MxIC8gVE9TfSB3aGVuCi1cY29kZXtmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9ufSBpcyBpbiBlZmZlY3QuCi1cZW5ke29wY29kZWRlc2N9Ci0KLVxiZWdpbntvcGNvZGVkZXNjfXtCSU5BUllfTU9EVUxPfXt9Ci1JbXBsZW1lbnRzIFxjb2Rle1RPUyA9IFRPUzEgXCV7fSBUT1N9LgotXGVuZHtvcGNvZGVkZXNjfQotCi1cYmVnaW57b3Bjb2RlZGVzY317QklOQVJZX0FERH17fQotSW1wbGVtZW50cyBcY29kZXtUT1MgPSBUT1MxICsgVE9TfS4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e0JJTkFSWV9TVUJUUkFDVH17fQotSW1wbGVtZW50cyBcY29kZXtUT1MgPSBUT1MxIC0gVE9TfS4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e0JJTkFSWV9TVUJTQ1J9e30KLUltcGxlbWVudHMgXGNvZGV7VE9TID0gVE9TMVtUT1NdfS4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e0JJTkFSWV9MU0hJRlR9e30KLUltcGxlbWVudHMgXGNvZGV7VE9TID0gVE9TMSA8XGNvZGV7fTwgVE9TfS4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e0JJTkFSWV9SU0hJRlR9e30KLUltcGxlbWVudHMgXGNvZGV7VE9TID0gVE9TMSA+XGNvZGV7fT4gVE9TfS4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e0JJTkFSWV9BTkR9e30KLUltcGxlbWVudHMgXGNvZGV7VE9TID0gVE9TMSBcJlwgVE9TfS4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e0JJTkFSWV9YT1J9e30KLUltcGxlbWVudHMgXGNvZGV7VE9TID0gVE9TMSBcXlwgVE9TfS4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e0JJTkFSWV9PUn17fQotSW1wbGVtZW50cyBcY29kZXtUT1MgPSBUT1MxIHwgVE9TfS4KLVxlbmR7b3Bjb2RlZGVzY30KLQotSW4tcGxhY2Ugb3BlcmF0aW9ucyBhcmUgbGlrZSBiaW5hcnkgb3BlcmF0aW9ucywgaW4gdGhhdCB0aGV5IHJlbW92ZSBUT1MgYW5kCi1UT1MxLCBhbmQgcHVzaCB0aGUgcmVzdWx0IGJhY2sgb24gdGhlIHN0YWNrLCBidXQgdGhlIG9wZXJhdGlvbiBpcyBkb25lCi1pbi1wbGFjZSB3aGVuIFRPUzEgc3VwcG9ydHMgaXQsIGFuZCB0aGUgcmVzdWx0aW5nIFRPUyBtYXkgYmUgKGJ1dCBkb2VzIG5vdAotaGF2ZSB0byBiZSkgdGhlIG9yaWdpbmFsIFRPUzEuCi0KLVxiZWdpbntvcGNvZGVkZXNjfXtJTlBMQUNFX1BPV0VSfXt9Ci1JbXBsZW1lbnRzIGluLXBsYWNlIFxjb2Rle1RPUyA9IFRPUzEgKiogVE9TfS4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e0lOUExBQ0VfTVVMVElQTFl9e30KLUltcGxlbWVudHMgaW4tcGxhY2UgXGNvZGV7VE9TID0gVE9TMSAqIFRPU30uCi1cZW5ke29wY29kZWRlc2N9Ci0KLVxiZWdpbntvcGNvZGVkZXNjfXtJTlBMQUNFX0ZMT09SX0RJVklERX17fQotSW1wbGVtZW50cyBpbi1wbGFjZSBcY29kZXtUT1MgPSBUT1MxIC8vIFRPU30uCi1cZW5ke29wY29kZWRlc2N9Ci0KLVxiZWdpbntvcGNvZGVkZXNjfXtJTlBMQUNFX1RSVUVfRElWSURFfXt9Ci1JbXBsZW1lbnRzIGluLXBsYWNlIFxjb2Rle1RPUyA9IFRPUzEgLyBUT1N9IHdoZW4KLVxjb2Rle2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb259IGlzIGluIGVmZmVjdC4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e0lOUExBQ0VfTU9EVUxPfXt9Ci1JbXBsZW1lbnRzIGluLXBsYWNlIFxjb2Rle1RPUyA9IFRPUzEgXCV7fSBUT1N9LgotXGVuZHtvcGNvZGVkZXNjfQotCi1cYmVnaW57b3Bjb2RlZGVzY317SU5QTEFDRV9BRER9e30KLUltcGxlbWVudHMgaW4tcGxhY2UgXGNvZGV7VE9TID0gVE9TMSArIFRPU30uCi1cZW5ke29wY29kZWRlc2N9Ci0KLVxiZWdpbntvcGNvZGVkZXNjfXtJTlBMQUNFX1NVQlRSQUNUfXt9Ci1JbXBsZW1lbnRzIGluLXBsYWNlIFxjb2Rle1RPUyA9IFRPUzEgLSBUT1N9LgotXGVuZHtvcGNvZGVkZXNjfQotCi1cYmVnaW57b3Bjb2RlZGVzY317SU5QTEFDRV9MU0hJRlR9e30KLUltcGxlbWVudHMgaW4tcGxhY2UgXGNvZGV7VE9TID0gVE9TMSA8XGNvZGV7fTwgVE9TfS4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e0lOUExBQ0VfUlNISUZUfXt9Ci1JbXBsZW1lbnRzIGluLXBsYWNlIFxjb2Rle1RPUyA9IFRPUzEgPlxjb2Rle30+IFRPU30uCi1cZW5ke29wY29kZWRlc2N9Ci0KLVxiZWdpbntvcGNvZGVkZXNjfXtJTlBMQUNFX0FORH17fQotSW1wbGVtZW50cyBpbi1wbGFjZSBcY29kZXtUT1MgPSBUT1MxIFwmXCBUT1N9LgotXGVuZHtvcGNvZGVkZXNjfQotCi1cYmVnaW57b3Bjb2RlZGVzY317SU5QTEFDRV9YT1J9e30KLUltcGxlbWVudHMgaW4tcGxhY2UgXGNvZGV7VE9TID0gVE9TMSBcXlwgVE9TfS4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e0lOUExBQ0VfT1J9e30KLUltcGxlbWVudHMgaW4tcGxhY2UgXGNvZGV7VE9TID0gVE9TMSB8IFRPU30uCi1cZW5ke29wY29kZWRlc2N9Ci0KLVRoZSBzbGljZSBvcGNvZGVzIHRha2UgdXAgdG8gdGhyZWUgcGFyYW1ldGVycy4KLQotXGJlZ2lue29wY29kZWRlc2N9e1NMSUNFKzB9e30KLUltcGxlbWVudHMgXGNvZGV7VE9TID0gVE9TWzpdfS4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e1NMSUNFKzF9e30KLUltcGxlbWVudHMgXGNvZGV7VE9TID0gVE9TMVtUT1M6XX0uCi1cZW5ke29wY29kZWRlc2N9Ci0KLVxiZWdpbntvcGNvZGVkZXNjfXtTTElDRSsyfXt9Ci1JbXBsZW1lbnRzIFxjb2Rle1RPUyA9IFRPUzFbOlRPU119LgotXGVuZHtvcGNvZGVkZXNjfQotCi1cYmVnaW57b3Bjb2RlZGVzY317U0xJQ0UrM317fQotSW1wbGVtZW50cyBcY29kZXtUT1MgPSBUT1MyW1RPUzE6VE9TXX0uCi1cZW5ke29wY29kZWRlc2N9Ci0KLVNsaWNlIGFzc2lnbm1lbnQgbmVlZHMgZXZlbiBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlci4gIEFzIGFueSBzdGF0ZW1lbnQsCi10aGV5IHB1dCBub3RoaW5nIG9uIHRoZSBzdGFjay4KLQotXGJlZ2lue29wY29kZWRlc2N9e1NUT1JFX1NMSUNFKzB9e30KLUltcGxlbWVudHMgXGNvZGV7VE9TWzpdID0gVE9TMX0uCi1cZW5ke29wY29kZWRlc2N9Ci0KLVxiZWdpbntvcGNvZGVkZXNjfXtTVE9SRV9TTElDRSsxfXt9Ci1JbXBsZW1lbnRzIFxjb2Rle1RPUzFbVE9TOl0gPSBUT1MyfS4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e1NUT1JFX1NMSUNFKzJ9e30KLUltcGxlbWVudHMgXGNvZGV7VE9TMVs6VE9TXSA9IFRPUzJ9LgotXGVuZHtvcGNvZGVkZXNjfQotCi1cYmVnaW57b3Bjb2RlZGVzY317U1RPUkVfU0xJQ0UrM317fQotSW1wbGVtZW50cyBcY29kZXtUT1MyW1RPUzE6VE9TXSA9IFRPUzN9LgotXGVuZHtvcGNvZGVkZXNjfQotCi1cYmVnaW57b3Bjb2RlZGVzY317REVMRVRFX1NMSUNFKzB9e30KLUltcGxlbWVudHMgXGNvZGV7ZGVsIFRPU1s6XX0uCi1cZW5ke29wY29kZWRlc2N9Ci0KLVxiZWdpbntvcGNvZGVkZXNjfXtERUxFVEVfU0xJQ0UrMX17fQotSW1wbGVtZW50cyBcY29kZXtkZWwgVE9TMVtUT1M6XX0uCi1cZW5ke29wY29kZWRlc2N9Ci0KLVxiZWdpbntvcGNvZGVkZXNjfXtERUxFVEVfU0xJQ0UrMn17fQotSW1wbGVtZW50cyBcY29kZXtkZWwgVE9TMVs6VE9TXX0uCi1cZW5ke29wY29kZWRlc2N9Ci0KLVxiZWdpbntvcGNvZGVkZXNjfXtERUxFVEVfU0xJQ0UrM317fQotSW1wbGVtZW50cyBcY29kZXtkZWwgVE9TMltUT1MxOlRPU119LgotXGVuZHtvcGNvZGVkZXNjfQotCi1cYmVnaW57b3Bjb2RlZGVzY317U1RPUkVfU1VCU0NSfXt9Ci1JbXBsZW1lbnRzIFxjb2Rle1RPUzFbVE9TXSA9IFRPUzJ9LgotXGVuZHtvcGNvZGVkZXNjfQotCi1cYmVnaW57b3Bjb2RlZGVzY317REVMRVRFX1NVQlNDUn17fQotSW1wbGVtZW50cyBcY29kZXtkZWwgVE9TMVtUT1NdfS4KLVxlbmR7b3Bjb2RlZGVzY30KLQotTWlzY2VsbGFuZW91cyBvcGNvZGVzLgotCi1cYmVnaW57b3Bjb2RlZGVzY317UFJJTlRfRVhQUn17fQotSW1wbGVtZW50cyB0aGUgZXhwcmVzc2lvbiBzdGF0ZW1lbnQgZm9yIHRoZSBpbnRlcmFjdGl2ZSBtb2RlLiAgVE9TIGlzCi1yZW1vdmVkIGZyb20gdGhlIHN0YWNrIGFuZCBwcmludGVkLiAgSW4gbm9uLWludGVyYWN0aXZlIG1vZGUsIGFuCi1leHByZXNzaW9uIHN0YXRlbWVudCBpcyB0ZXJtaW5hdGVkIHdpdGggXGNvZGV7UE9QX1NUQUNLfS4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e0JSRUFLX0xPT1B9e30KLVRlcm1pbmF0ZXMgYSBsb29wIGR1ZSB0byBhIFxrZXl3b3Jke2JyZWFrfSBzdGF0ZW1lbnQuCi1cZW5ke29wY29kZWRlc2N9Ci0KLVxiZWdpbntvcGNvZGVkZXNjfXtDT05USU5VRV9MT09QfXt0YXJnZXR9Ci1Db250aW51ZXMgYSBsb29wIGR1ZSB0byBhIFxrZXl3b3Jke2NvbnRpbnVlfSBzdGF0ZW1lbnQuICBcdmFye3RhcmdldH0KLWlzIHRoZSBhZGRyZXNzIHRvIGp1bXAgdG8gKHdoaWNoIHNob3VsZCBiZSBhIFxjb2Rle0ZPUl9JVEVSfQotaW5zdHJ1Y3Rpb24pLgotXGVuZHtvcGNvZGVkZXNjfQotCi1cYmVnaW57b3Bjb2RlZGVzY317U0VUX0FERH17fQotQ2FsbHMgXGNvZGV7c2V0LmFkZChUT1MxLCBUT1MpfS4gIFVzZWQgdG8gaW1wbGVtZW50IHNldCBjb21wcmVoZW5zaW9ucy4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e0xJU1RfQVBQRU5EfXt9Ci1DYWxscyBcY29kZXtsaXN0LmFwcGVuZChUT1MxLCBUT1MpfS4gIFVzZWQgdG8gaW1wbGVtZW50IGxpc3QgY29tcHJlaGVuc2lvbnMuCi1cZW5ke29wY29kZWRlc2N9Ci0KLVxiZWdpbntvcGNvZGVkZXNjfXtMT0FEX0xPQ0FMU317fQotUHVzaGVzIGEgcmVmZXJlbmNlIHRvIHRoZSBsb2NhbHMgb2YgdGhlIGN1cnJlbnQgc2NvcGUgb24gdGhlIHN0YWNrLgotVGhpcyBpcyB1c2VkIGluIHRoZSBjb2RlIGZvciBhIGNsYXNzIGRlZmluaXRpb246IEFmdGVyIHRoZSBjbGFzcyBib2R5Ci1pcyBldmFsdWF0ZWQsIHRoZSBsb2NhbHMgYXJlIHBhc3NlZCB0byB0aGUgY2xhc3MgZGVmaW5pdGlvbi4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e1JFVFVSTl9WQUxVRX17fQotUmV0dXJucyB3aXRoIFRPUyB0byB0aGUgY2FsbGVyIG9mIHRoZSBmdW5jdGlvbi4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e1lJRUxEX1ZBTFVFfXt9Ci1Qb3BzIFxjb2Rle1RPU30gYW5kIHlpZWxkcyBpdCBmcm9tIGEgZ2VuZXJhdG9yLgotXGVuZHtvcGNvZGVkZXNjfQotCi1cYmVnaW57b3Bjb2RlZGVzY317SU1QT1JUX1NUQVJ9e30KLUxvYWRzIGFsbCBzeW1ib2xzIG5vdCBzdGFydGluZyB3aXRoIFxjaGFyYWN0ZXJ7X30gZGlyZWN0bHkgZnJvbSB0aGUgbW9kdWxlIFRPUwotdG8gdGhlIGxvY2FsIG5hbWVzcGFjZS4gVGhlIG1vZHVsZSBpcyBwb3BwZWQgYWZ0ZXIgbG9hZGluZyBhbGwgbmFtZXMuCi1UaGlzIG9wY29kZSBpbXBsZW1lbnRzIFxjb2Rle2Zyb20gbW9kdWxlIGltcG9ydCAqfS4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e1BPUF9CTE9DS317fQotUmVtb3ZlcyBvbmUgYmxvY2sgZnJvbSB0aGUgYmxvY2sgc3RhY2suICBQZXIgZnJhbWUsIHRoZXJlIGlzIGEgCi1zdGFjayBvZiBibG9ja3MsIGRlbm90aW5nIG5lc3RlZCBsb29wcywgdHJ5IHN0YXRlbWVudHMsIGFuZCBzdWNoLgotXGVuZHtvcGNvZGVkZXNjfQotCi1cYmVnaW57b3Bjb2RlZGVzY317RU5EX0ZJTkFMTFl9e30KLVRlcm1pbmF0ZXMgYSBca2V5d29yZHtmaW5hbGx5fSBjbGF1c2UuICBUaGUgaW50ZXJwcmV0ZXIgcmVjYWxscwotd2hldGhlciB0aGUgZXhjZXB0aW9uIGhhcyB0byBiZSByZS1yYWlzZWQsIG9yIHdoZXRoZXIgdGhlIGZ1bmN0aW9uCi1yZXR1cm5zLCBhbmQgY29udGludWVzIHdpdGggdGhlIG91dGVyLW5leHQgYmxvY2suCi1cZW5ke29wY29kZWRlc2N9Ci0KLVxiZWdpbntvcGNvZGVkZXNjfXtCVUlMRF9DTEFTU317fQotQ3JlYXRlcyBhIG5ldyBjbGFzcyBvYmplY3QuICBUT1MgaXMgdGhlIG1ldGhvZHMgZGljdGlvbmFyeSwgVE9TMQotdGhlIHR1cGxlIG9mIHRoZSBuYW1lcyBvZiB0aGUgYmFzZSBjbGFzc2VzLCBhbmQgVE9TMiB0aGUgY2xhc3MgbmFtZS4KLVxlbmR7b3Bjb2RlZGVzY30KLQotQWxsIG9mIHRoZSBmb2xsb3dpbmcgb3Bjb2RlcyBleHBlY3QgYXJndW1lbnRzLiAgQW4gYXJndW1lbnQgaXMgdHdvCi1ieXRlcywgd2l0aCB0aGUgbW9yZSBzaWduaWZpY2FudCBieXRlIGxhc3QuCi0KLVxiZWdpbntvcGNvZGVkZXNjfXtTVE9SRV9OQU1FfXtuYW1laX0KLUltcGxlbWVudHMgXGNvZGV7bmFtZSA9IFRPU30uIFx2YXJ7bmFtZWl9IGlzIHRoZSBpbmRleCBvZiBcdmFye25hbWV9Ci1pbiB0aGUgYXR0cmlidXRlIFxtZW1iZXJ7Y29fbmFtZXN9IG9mIHRoZSBjb2RlIG9iamVjdC4KLVRoZSBjb21waWxlciB0cmllcyB0byB1c2UgXGNvZGV7U1RPUkVfTE9DQUx9IG9yIFxjb2Rle1NUT1JFX0dMT0JBTH0KLWlmIHBvc3NpYmxlLgotXGVuZHtvcGNvZGVkZXNjfQotCi1cYmVnaW57b3Bjb2RlZGVzY317REVMRVRFX05BTUV9e25hbWVpfQotSW1wbGVtZW50cyBcY29kZXtkZWwgbmFtZX0sIHdoZXJlIFx2YXJ7bmFtZWl9IGlzIHRoZSBpbmRleCBpbnRvCi1cbWVtYmVye2NvX25hbWVzfSBhdHRyaWJ1dGUgb2YgdGhlIGNvZGUgb2JqZWN0LgotXGVuZHtvcGNvZGVkZXNjfQotCi1cYmVnaW57b3Bjb2RlZGVzY317VU5QQUNLX1NFUVVFTkNFfXtjb3VudH0KLVVucGFja3MgVE9TIGludG8gXHZhcntjb3VudH0gaW5kaXZpZHVhbCB2YWx1ZXMsIHdoaWNoIGFyZSBwdXQgb250bwotdGhlIHN0YWNrIHJpZ2h0LXRvLWxlZnQuCi1cZW5ke29wY29kZWRlc2N9Ci0KLSVcYmVnaW57b3Bjb2RlZGVzY317VU5QQUNLX0xJU1R9e2NvdW50fQotJVRoaXMgb3Bjb2RlIGlzIG9ic29sZXRlLgotJVxlbmR7b3Bjb2RlZGVzY30KLQotJVxiZWdpbntvcGNvZGVkZXNjfXtVTlBBQ0tfQVJHfXtjb3VudH0KLSVUaGlzIG9wY29kZSBpcyBvYnNvbGV0ZS4KLSVcZW5ke29wY29kZWRlc2N9Ci0KLVxiZWdpbntvcGNvZGVkZXNjfXtEVVBfVE9QWH17Y291bnR9Ci1EdXBsaWNhdGUgXHZhcntjb3VudH0gaXRlbXMsIGtlZXBpbmcgdGhlbSBpbiB0aGUgc2FtZSBvcmRlci4gRHVlIHRvCi1pbXBsZW1lbnRhdGlvbiBsaW1pdHMsIFx2YXJ7Y291bnR9IHNob3VsZCBiZSBiZXR3ZWVuIDEgYW5kIDUgaW5jbHVzaXZlLgotXGVuZHtvcGNvZGVkZXNjfQotCi1cYmVnaW57b3Bjb2RlZGVzY317U1RPUkVfQVRUUn17bmFtZWl9Ci1JbXBsZW1lbnRzIFxjb2Rle1RPUy5uYW1lID0gVE9TMX0sIHdoZXJlIFx2YXJ7bmFtZWl9IGlzIHRoZSBpbmRleAotb2YgbmFtZSBpbiBcbWVtYmVye2NvX25hbWVzfS4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e0RFTEVURV9BVFRSfXtuYW1laX0KLUltcGxlbWVudHMgXGNvZGV7ZGVsIFRPUy5uYW1lfSwgdXNpbmcgXHZhcntuYW1laX0gYXMgaW5kZXggaW50bwotXG1lbWJlcntjb19uYW1lc30uCi1cZW5ke29wY29kZWRlc2N9Ci0KLVxiZWdpbntvcGNvZGVkZXNjfXtTVE9SRV9HTE9CQUx9e25hbWVpfQotV29ya3MgYXMgXGNvZGV7U1RPUkVfTkFNRX0sIGJ1dCBzdG9yZXMgdGhlIG5hbWUgYXMgYSBnbG9iYWwuCi1cZW5ke29wY29kZWRlc2N9Ci0KLVxiZWdpbntvcGNvZGVkZXNjfXtERUxFVEVfR0xPQkFMfXtuYW1laX0KLVdvcmtzIGFzIFxjb2Rle0RFTEVURV9OQU1FfSwgYnV0IGRlbGV0ZXMgYSBnbG9iYWwgbmFtZS4KLVxlbmR7b3Bjb2RlZGVzY30KLQotJVxiZWdpbntvcGNvZGVkZXNjfXtVTlBBQ0tfVkFSQVJHfXthcmdjfQotJVRoaXMgb3Bjb2RlIGlzIG9ic29sZXRlLgotJVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e0xPQURfQ09OU1R9e2NvbnN0aX0KLVB1c2hlcyBcc2FtcHtjb19jb25zdHNbXHZhcntjb25zdGl9XX0gb250byB0aGUgc3RhY2suCi1cZW5ke29wY29kZWRlc2N9Ci0KLVxiZWdpbntvcGNvZGVkZXNjfXtMT0FEX05BTUV9e25hbWVpfQotUHVzaGVzIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggXHNhbXB7Y29fbmFtZXNbXHZhcntuYW1laX1dfSBvbnRvIHRoZSBzdGFjay4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e0JVSUxEX1RVUExFfXtjb3VudH0KLUNyZWF0ZXMgYSB0dXBsZSBjb25zdW1pbmcgXHZhcntjb3VudH0gaXRlbXMgZnJvbSB0aGUgc3RhY2ssIGFuZCBwdXNoZXMKLXRoZSByZXN1bHRpbmcgdHVwbGUgb250byB0aGUgc3RhY2suCi1cZW5ke29wY29kZWRlc2N9Ci0KLVxiZWdpbntvcGNvZGVkZXNjfXtCVUlMRF9MSVNUfXtjb3VudH0KLVdvcmtzIGFzIFxjb2Rle0JVSUxEX1RVUExFfSwgYnV0IGNyZWF0ZXMgYSBsaXN0LgotXGVuZHtvcGNvZGVkZXNjfQotCi1cYmVnaW57b3Bjb2RlZGVzY317QlVJTERfU0VUfXtjb3VudH0KLVdvcmtzIGFzIFxjb2Rle0JVSUxEX1RVUExFfSwgYnV0IGNyZWF0ZXMgYSBzZXQuCi1cZW5ke29wY29kZWRlc2N9Ci0KLVxiZWdpbntvcGNvZGVkZXNjfXtCVUlMRF9NQVB9e3plcm99Ci1QdXNoZXMgYSBuZXcgZW1wdHkgZGljdGlvbmFyeSBvYmplY3Qgb250byB0aGUgc3RhY2suICBUaGUgYXJndW1lbnQgaXMKLWlnbm9yZWQgYW5kIHNldCB0byB6ZXJvIGJ5IHRoZSBjb21waWxlci4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e0xPQURfQVRUUn17bmFtZWl9Ci1SZXBsYWNlcyBUT1Mgd2l0aCBcY29kZXtnZXRhdHRyKFRPUywgY29fbmFtZXNbXHZhcntuYW1laX1dKX0uCi1cZW5ke29wY29kZWRlc2N9Ci0KLVxiZWdpbntvcGNvZGVkZXNjfXtDT01QQVJFX09QfXtvcG5hbWV9Ci1QZXJmb3JtcyBhIEJvb2xlYW4gb3BlcmF0aW9uLiAgVGhlIG9wZXJhdGlvbiBuYW1lIGNhbiBiZSBmb3VuZAotaW4gXGNvZGV7Y21wX29wW1x2YXJ7b3BuYW1lfV19LgotXGVuZHtvcGNvZGVkZXNjfQotCi1cYmVnaW57b3Bjb2RlZGVzY317SU1QT1JUX05BTUV9e25hbWVpfQotSW1wb3J0cyB0aGUgbW9kdWxlIFxjb2Rle2NvX25hbWVzW1x2YXJ7bmFtZWl9XX0uICBUaGUgbW9kdWxlIG9iamVjdCBpcwotcHVzaGVkIG9udG8gdGhlIHN0YWNrLiAgVGhlIGN1cnJlbnQgbmFtZXNwYWNlIGlzIG5vdCBhZmZlY3RlZDogZm9yIGEKLXByb3BlciBpbXBvcnQgc3RhdGVtZW50LCBhIHN1YnNlcXVlbnQgXGNvZGV7U1RPUkVfRkFTVH0gaW5zdHJ1Y3Rpb24KLW1vZGlmaWVzIHRoZSBuYW1lc3BhY2UuCi1cZW5ke29wY29kZWRlc2N9Ci0KLVxiZWdpbntvcGNvZGVkZXNjfXtJTVBPUlRfRlJPTX17bmFtZWl9Ci1Mb2FkcyB0aGUgYXR0cmlidXRlIFxjb2Rle2NvX25hbWVzW1x2YXJ7bmFtZWl9XX0gZnJvbSB0aGUgbW9kdWxlIGZvdW5kIGluCi1UT1MuIFRoZSByZXN1bHRpbmcgb2JqZWN0IGlzIHB1c2hlZCBvbnRvIHRoZSBzdGFjaywgdG8gYmUgc3Vic2VxdWVudGx5Ci1zdG9yZWQgYnkgYSBcY29kZXtTVE9SRV9GQVNUfSBpbnN0cnVjdGlvbi4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e0pVTVBfRk9SV0FSRH17ZGVsdGF9Ci1JbmNyZW1lbnRzIGJ5dGUgY29kZSBjb3VudGVyIGJ5IFx2YXJ7ZGVsdGF9LgotXGVuZHtvcGNvZGVkZXNjfQotCi1cYmVnaW57b3Bjb2RlZGVzY317SlVNUF9JRl9UUlVFfXtkZWx0YX0KLUlmIFRPUyBpcyB0cnVlLCBpbmNyZW1lbnQgdGhlIGJ5dGUgY29kZSBjb3VudGVyIGJ5IFx2YXJ7ZGVsdGF9LiAgVE9TIGlzCi1sZWZ0IG9uIHRoZSBzdGFjay4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e0pVTVBfSUZfRkFMU0V9e2RlbHRhfQotSWYgVE9TIGlzIGZhbHNlLCBpbmNyZW1lbnQgdGhlIGJ5dGUgY29kZSBjb3VudGVyIGJ5IFx2YXJ7ZGVsdGF9LiAgVE9TCi1pcyBub3QgY2hhbmdlZC4gCi1cZW5ke29wY29kZWRlc2N9Ci0KLVxiZWdpbntvcGNvZGVkZXNjfXtKVU1QX0FCU09MVVRFfXt0YXJnZXR9Ci1TZXQgYnl0ZSBjb2RlIGNvdW50ZXIgdG8gXHZhcnt0YXJnZXR9LgotXGVuZHtvcGNvZGVkZXNjfQotCi1cYmVnaW57b3Bjb2RlZGVzY317Rk9SX0lURVJ9e2RlbHRhfQotICBcY29kZXtUT1N9IGlzIGFuIGl0ZXJhdG9yLiAgQ2FsbCBpdHMgXG1ldGhvZHtfX25leHRfXygpfSBtZXRob2QuICBJZiB0aGlzCi0gIHlpZWxkcyBhIG5ldyB2YWx1ZSwgcHVzaCBpdCBvbiB0aGUgc3RhY2sgKGxlYXZpbmcgdGhlIGl0ZXJhdG9yIGJlbG93IGl0KS4gIElmCi0gIHRoZSBpdGVyYXRvciBpbmRpY2F0ZXMgaXQgaXMgZXhoYXVzdGVkIFxjb2Rle1RPU30gaXMgcG9wcGVkLCBhbmQgdGhlIGJ5dGUgY29kZQotICBjb3VudGVyIGlzIGluY3JlbWVudGVkIGJ5IFx2YXJ7ZGVsdGF9LgotXGVuZHtvcGNvZGVkZXNjfQotCi0lXGJlZ2lue29wY29kZWRlc2N9e0ZPUl9MT09QfXtkZWx0YX0KLSVUaGlzIG9wY29kZSBpcyBvYnNvbGV0ZS4KLSVcZW5ke29wY29kZWRlc2N9Ci0KLSVcYmVnaW57b3Bjb2RlZGVzY317TE9BRF9MT0NBTH17bmFtZWl9Ci0lVGhpcyBvcGNvZGUgaXMgb2Jzb2xldGUuCi0lXGVuZHtvcGNvZGVkZXNjfQotCi1cYmVnaW57b3Bjb2RlZGVzY317TE9BRF9HTE9CQUx9e25hbWVpfQotTG9hZHMgdGhlIGdsb2JhbCBuYW1lZCBcY29kZXtjb19uYW1lc1tcdmFye25hbWVpfV19IG9udG8gdGhlIHN0YWNrLgotXGVuZHtvcGNvZGVkZXNjfQotCi0lXGJlZ2lue29wY29kZWRlc2N9e1NFVF9GVU5DX0FSR1N9e2FyZ2N9Ci0lVGhpcyBvcGNvZGUgaXMgb2Jzb2xldGUuCi0lXGVuZHtvcGNvZGVkZXNjfQotCi1cYmVnaW57b3Bjb2RlZGVzY317U0VUVVBfTE9PUH17ZGVsdGF9Ci1QdXNoZXMgYSBibG9jayBmb3IgYSBsb29wIG9udG8gdGhlIGJsb2NrIHN0YWNrLiAgVGhlIGJsb2NrIHNwYW5zCi1mcm9tIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIHdpdGggYSBzaXplIG9mIFx2YXJ7ZGVsdGF9IGJ5dGVzLgotXGVuZHtvcGNvZGVkZXNjfQotCi1cYmVnaW57b3Bjb2RlZGVzY317U0VUVVBfRVhDRVBUfXtkZWx0YX0KLVB1c2hlcyBhIHRyeSBibG9jayBmcm9tIGEgdHJ5LWV4Y2VwdCBjbGF1c2Ugb250byB0aGUgYmxvY2sgc3RhY2suCi1cdmFye2RlbHRhfSBwb2ludHMgdG8gdGhlIGZpcnN0IGV4Y2VwdCBibG9jay4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e1NFVFVQX0ZJTkFMTFl9e2RlbHRhfQotUHVzaGVzIGEgdHJ5IGJsb2NrIGZyb20gYSB0cnktZXhjZXB0IGNsYXVzZSBvbnRvIHRoZSBibG9jayBzdGFjay4KLVx2YXJ7ZGVsdGF9IHBvaW50cyB0byB0aGUgZmluYWxseSBibG9jay4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e0xPQURfRkFTVH17dmFyX251bX0KLVB1c2hlcyBhIHJlZmVyZW5jZSB0byB0aGUgbG9jYWwgXGNvZGV7Y29fdmFybmFtZXNbXHZhcnt2YXJfbnVtfV19IG9udG8KLXRoZSBzdGFjay4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e1NUT1JFX0ZBU1R9e3Zhcl9udW19Ci1TdG9yZXMgVE9TIGludG8gdGhlIGxvY2FsIFxjb2Rle2NvX3Zhcm5hbWVzW1x2YXJ7dmFyX251bX1dfS4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e0RFTEVURV9GQVNUfXt2YXJfbnVtfQotRGVsZXRlcyBsb2NhbCBcY29kZXtjb192YXJuYW1lc1tcdmFye3Zhcl9udW19XX0uCi1cZW5ke29wY29kZWRlc2N9Ci0KLVxiZWdpbntvcGNvZGVkZXNjfXtMT0FEX0NMT1NVUkV9e2l9Ci1QdXNoZXMgYSByZWZlcmVuY2UgdG8gdGhlIGNlbGwgY29udGFpbmVkIGluIHNsb3QgXHZhcntpfSBvZiB0aGUKLWNlbGwgYW5kIGZyZWUgdmFyaWFibGUgc3RvcmFnZS4gIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSBpcyAKLVxjb2Rle2NvX2NlbGx2YXJzW1x2YXJ7aX1dfSBpZiBcdmFye2l9IGlzIGxlc3MgdGhhbiB0aGUgbGVuZ3RoIG9mCi1cdmFye2NvX2NlbGx2YXJzfS4gIE90aGVyd2lzZSBpdCBpcyAKLVxjb2Rle2NvX2ZyZWV2YXJzW1x2YXJ7aX0gLSBsZW4oY29fY2VsbHZhcnMpXX0uCi1cZW5ke29wY29kZWRlc2N9Ci0KLVxiZWdpbntvcGNvZGVkZXNjfXtMT0FEX0RFUkVGfXtpfQotTG9hZHMgdGhlIGNlbGwgY29udGFpbmVkIGluIHNsb3QgXHZhcntpfSBvZiB0aGUgY2VsbCBhbmQgZnJlZSB2YXJpYWJsZQotc3RvcmFnZS4gIFB1c2hlcyBhIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IHRoZSBjZWxsIGNvbnRhaW5zIG9uIHRoZQotc3RhY2suIAotXGVuZHtvcGNvZGVkZXNjfQotCi1cYmVnaW57b3Bjb2RlZGVzY317U1RPUkVfREVSRUZ9e2l9Ci1TdG9yZXMgVE9TIGludG8gdGhlIGNlbGwgY29udGFpbmVkIGluIHNsb3QgXHZhcntpfSBvZiB0aGUgY2VsbCBhbmQKLWZyZWUgdmFyaWFibGUgc3RvcmFnZS4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e1NFVF9MSU5FTk99e2xpbmVub30KLVRoaXMgb3Bjb2RlIGlzIG9ic29sZXRlLgotXGVuZHtvcGNvZGVkZXNjfQotCi1cYmVnaW57b3Bjb2RlZGVzY317UkFJU0VfVkFSQVJHU317YXJnY30KLVJhaXNlcyBhbiBleGNlcHRpb24uIFx2YXJ7YXJnY30gaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycwotdG8gdGhlIHJhaXNlIHN0YXRlbWVudCwgcmFuZ2luZyBmcm9tIDAgdG8gMy4gIFRoZSBoYW5kbGVyIHdpbGwgZmluZAotdGhlIHRyYWNlYmFjayBhcyBUT1MyLCB0aGUgcGFyYW1ldGVyIGFzIFRPUzEsIGFuZCB0aGUgZXhjZXB0aW9uCi1hcyBUT1MuCi1cZW5ke29wY29kZWRlc2N9Ci0KLVxiZWdpbntvcGNvZGVkZXNjfXtDQUxMX0ZVTkNUSU9OfXthcmdjfQotQ2FsbHMgYSBmdW5jdGlvbi4gIFRoZSBsb3cgYnl0ZSBvZiBcdmFye2FyZ2N9IGluZGljYXRlcyB0aGUgbnVtYmVyIG9mCi1wb3NpdGlvbmFsIHBhcmFtZXRlcnMsIHRoZSBoaWdoIGJ5dGUgdGhlIG51bWJlciBvZiBrZXl3b3JkIHBhcmFtZXRlcnMuCi1PbiB0aGUgc3RhY2ssIHRoZSBvcGNvZGUgZmluZHMgdGhlIGtleXdvcmQgcGFyYW1ldGVycyBmaXJzdC4gIEZvciBlYWNoCi1rZXl3b3JkIGFyZ3VtZW50LCB0aGUgdmFsdWUgaXMgb24gdG9wIG9mIHRoZSBrZXkuICBCZWxvdyB0aGUga2V5d29yZAotcGFyYW1ldGVycywgdGhlIHBvc2l0aW9uYWwgcGFyYW1ldGVycyBhcmUgb24gdGhlIHN0YWNrLCB3aXRoIHRoZQotcmlnaHQtbW9zdCBwYXJhbWV0ZXIgb24gdG9wLiAgQmVsb3cgdGhlIHBhcmFtZXRlcnMsIHRoZSBmdW5jdGlvbiBvYmplY3QKLXRvIGNhbGwgaXMgb24gdGhlIHN0YWNrLgotXGVuZHtvcGNvZGVkZXNjfQotCi1cYmVnaW57b3Bjb2RlZGVzY317TUFLRV9GVU5DVElPTn17YXJnY30KLVB1c2hlcyBhIG5ldyBmdW5jdGlvbiBvYmplY3Qgb24gdGhlIHN0YWNrLiAgVE9TIGlzIHRoZSBjb2RlIGFzc29jaWF0ZWQKLXdpdGggdGhlIGZ1bmN0aW9uLiAgVGhlIGZ1bmN0aW9uIG9iamVjdCBpcyBkZWZpbmVkIHRvIGhhdmUgXHZhcnthcmdjfQotZGVmYXVsdCBwYXJhbWV0ZXJzLCB3aGljaCBhcmUgZm91bmQgYmVsb3cgVE9TLgotXGVuZHtvcGNvZGVkZXNjfQotCi1cYmVnaW57b3Bjb2RlZGVzY317TUFLRV9DTE9TVVJFfXthcmdjfQotQ3JlYXRlcyBhIG5ldyBmdW5jdGlvbiBvYmplY3QsIHNldHMgaXRzIFx2YXJ7X19jbG9zdXJlX199IHNsb3QsIGFuZAotcHVzaGVzIGl0IG9uIHRoZSBzdGFjay4gIFRPUyBpcyB0aGUgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGZ1bmN0aW9uLgotSWYgdGhlIGNvZGUgb2JqZWN0IGhhcyBOIGZyZWUgdmFyaWFibGVzLCB0aGUgbmV4dCBOIGl0ZW1zIG9uIHRoZSBzdGFjawotYXJlIHRoZSBjZWxscyBmb3IgdGhlc2UgdmFyaWFibGVzLiAgVGhlIGZ1bmN0aW9uIGFsc28gaGFzIFx2YXJ7YXJnY30KLWRlZmF1bHQgcGFyYW1ldGVycywgd2hlcmUgYXJlIGZvdW5kIGJlZm9yZSB0aGUgY2VsbHMuCi1cZW5ke29wY29kZWRlc2N9Ci0KLVxiZWdpbntvcGNvZGVkZXNjfXtCVUlMRF9TTElDRX17YXJnY30KLVB1c2hlcyBhIHNsaWNlIG9iamVjdCBvbiB0aGUgc3RhY2suICBcdmFye2FyZ2N9IG11c3QgYmUgMiBvciAzLiAgSWYgaXQKLWlzIDIsIFxjb2Rle3NsaWNlKFRPUzEsIFRPUyl9IGlzIHB1c2hlZDsgaWYgaXQgaXMgMywKLVxjb2Rle3NsaWNlKFRPUzIsIFRPUzEsIFRPUyl9IGlzIHB1c2hlZC4KLVNlZSB0aGUgXGNvZGV7c2xpY2UoKX1cYmlmdW5jaW5kZXh7c2xpY2V9IGJ1aWx0LWluIGZ1bmN0aW9uIGZvciBtb3JlCi1pbmZvcm1hdGlvbi4KLVxlbmR7b3Bjb2RlZGVzY30KLQotXGJlZ2lue29wY29kZWRlc2N9e0VYVEVOREVEX0FSR317ZXh0fQotUHJlZml4ZXMgYW55IG9wY29kZSB3aGljaCBoYXMgYW4gYXJndW1lbnQgdG9vIGJpZyB0byBmaXQgaW50byB0aGUKLWRlZmF1bHQgdHdvIGJ5dGVzLiAgXHZhcntleHR9IGhvbGRzIHR3byBhZGRpdGlvbmFsIGJ5dGVzIHdoaWNoLCB0YWtlbgotdG9nZXRoZXIgd2l0aCB0aGUgc3Vic2VxdWVudCBvcGNvZGUncyBhcmd1bWVudCwgY29tcHJpc2UgYSBmb3VyLWJ5dGUKLWFyZ3VtZW50LCBcdmFye2V4dH0gYmVpbmcgdGhlIHR3byBtb3N0LXNpZ25pZmljYW50IGJ5dGVzLgotXGVuZHtvcGNvZGVkZXNjfQotCi1cYmVnaW57b3Bjb2RlZGVzY317Q0FMTF9GVU5DVElPTl9WQVJ9e2FyZ2N9Ci1DYWxscyBhIGZ1bmN0aW9uLiBcdmFye2FyZ2N9IGlzIGludGVycHJldGVkIGFzIGluIFxjb2Rle0NBTExfRlVOQ1RJT059LgotVGhlIHRvcCBlbGVtZW50IG9uIHRoZSBzdGFjayBjb250YWlucyB0aGUgdmFyaWFibGUgYXJndW1lbnQgbGlzdCwgZm9sbG93ZWQKLWJ5IGtleXdvcmQgYW5kIHBvc2l0aW9uYWwgYXJndW1lbnRzLgotXGVuZHtvcGNvZGVkZXNjfQotCi1cYmVnaW57b3Bjb2RlZGVzY317Q0FMTF9GVU5DVElPTl9LV317YXJnY30KLUNhbGxzIGEgZnVuY3Rpb24uIFx2YXJ7YXJnY30gaXMgaW50ZXJwcmV0ZWQgYXMgaW4gXGNvZGV7Q0FMTF9GVU5DVElPTn0uCi1UaGUgdG9wIGVsZW1lbnQgb24gdGhlIHN0YWNrIGNvbnRhaW5zIHRoZSBrZXl3b3JkIGFyZ3VtZW50cyBkaWN0aW9uYXJ5LCAKLWZvbGxvd2VkIGJ5IGV4cGxpY2l0IGtleXdvcmQgYW5kIHBvc2l0aW9uYWwgYXJndW1lbnRzLgotXGVuZHtvcGNvZGVkZXNjfQotCi1cYmVnaW57b3Bjb2RlZGVzY317Q0FMTF9GVU5DVElPTl9WQVJfS1d9e2FyZ2N9Ci1DYWxscyBhIGZ1bmN0aW9uLiBcdmFye2FyZ2N9IGlzIGludGVycHJldGVkIGFzIGluCi1cY29kZXtDQUxMX0ZVTkNUSU9OfS4gIFRoZSB0b3AgZWxlbWVudCBvbiB0aGUgc3RhY2sgY29udGFpbnMgdGhlCi1rZXl3b3JkIGFyZ3VtZW50cyBkaWN0aW9uYXJ5LCBmb2xsb3dlZCBieSB0aGUgdmFyaWFibGUtYXJndW1lbnRzCi10dXBsZSwgZm9sbG93ZWQgYnkgZXhwbGljaXQga2V5d29yZCBhbmQgcG9zaXRpb25hbCBhcmd1bWVudHMuCi1cZW5ke29wY29kZWRlc2N9Ci0KLVxiZWdpbntvcGNvZGVkZXNjfXtIQVZFX0FSR1VNRU5UfXt9Ci1UaGlzIGlzIG5vdCByZWFsbHkgYW4gb3Bjb2RlLiAgSXQgaWRlbnRpZmllcyB0aGUgZGl2aWRpbmcgbGluZSBiZXR3ZWVuCi1vcGNvZGVzIHdoaWNoIGRvbid0IHRha2UgYXJndW1lbnRzIFxjb2RlezwgSEFWRV9BUkdVTUVOVH0gYW5kIHRob3NlIHdoaWNoIGRvCi1cY29kZXs+PSBIQVZFX0FSR1VNRU5UfS4KLVxlbmR7b3Bjb2RlZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliZGwudGV4IGIvRG9jL2xpYi9saWJkbC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YTc5OWUuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJkbC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtkbH0gLS0tCi0gICAgICAgICBDYWxsIEMgZnVuY3Rpb25zIGluIHNoYXJlZCBvYmplY3RzfQotXGRlY2xhcmVtb2R1bGV7ZXh0ZW5zaW9ufXtkbH0KLSAgXHBsYXRmb3Jte1VuaXh9ICU/Pz8/Pz8/Pz8/IEFueW9uZT8/Pz8/Pz8/Pz8/PwotXHNlY3Rpb25hdXRob3J7TW9zaGUgWmFka2F9e21vc2hlekB6YWRrYS5zaXRlLmNvLmlsfQotXG1vZHVsZXN5bm9wc2lze0NhbGwgQyBmdW5jdGlvbnMgaW4gc2hhcmVkIG9iamVjdHMufQotCi1UaGUgXG1vZHVsZXtkbH0gbW9kdWxlIGRlZmluZXMgYW4gaW50ZXJmYWNlIHRvIHRoZQotXGNmdW5jdGlvbntkbG9wZW4oKX0gZnVuY3Rpb24sIHdoaWNoIGlzIHRoZSBtb3N0IGNvbW1vbiBpbnRlcmZhY2Ugb24KLVxVTklYe30gcGxhdGZvcm1zIGZvciBoYW5kbGluZyBkeW5hbWljYWxseSBsaW5rZWQgbGlicmFyaWVzLiBJdCBhbGxvd3MKLXRoZSBwcm9ncmFtIHRvIGNhbGwgYXJiaXRyYXJ5IGZ1bmN0aW9ucyBpbiBzdWNoIGEgbGlicmFyeS4KLQotXHdhcm5pbmd7VGhlIFxtb2R1bGV7ZGx9IG1vZHVsZSBieXBhc3NlcyB0aGUgUHl0aG9uIHR5cGUgc3lzdGVtIGFuZCAKLWVycm9yIGhhbmRsaW5nLiBJZiB1c2VkIGluY29ycmVjdGx5IGl0IG1heSBjYXVzZSBzZWdtZW50YXRpb24gZmF1bHRzLAotY3Jhc2hlcyBvciBvdGhlciBpbmNvcnJlY3QgYmVoYXZpb3VyLn0KLQotXG5vdGV7VGhpcyBtb2R1bGUgd2lsbCBub3Qgd29yayB1bmxlc3MKLVxjb2Rle3NpemVvZihpbnQpID09IHNpemVvZihsb25nKSA9PSBzaXplb2YoY2hhciAqKX0KLUlmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBcZXhjZXB0aW9ue1N5c3RlbUVycm9yfSB3aWxsIGJlIHJhaXNlZCBvbgotaW1wb3J0Ln0KLQotVGhlIFxtb2R1bGV7ZGx9IG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb246Ci0KLVxiZWdpbntmdW5jZGVzY317b3Blbn17bmFtZVxvcHRpb25hbHssIG1vZGVcY29kZXsgPSBSVExEX0xBWll9fX0KLU9wZW4gYSBzaGFyZWQgb2JqZWN0IGZpbGUsIGFuZCByZXR1cm4gYSBoYW5kbGUuIE1vZGUKLXNpZ25pZmllcyBsYXRlIGJpbmRpbmcgKFxjb25zdGFudHtSVExEX0xBWll9KSBvciBpbW1lZGlhdGUgYmluZGluZwotKFxjb25zdGFudHtSVExEX05PV30pLiBEZWZhdWx0IGlzIFxjb25zdGFudHtSVExEX0xBWll9LiBOb3RlIHRoYXQgc29tZQotc3lzdGVtcyBkbyBub3Qgc3VwcG9ydCBcY29uc3RhbnR7UlRMRF9OT1d9LgotCi1SZXR1cm4gdmFsdWUgaXMgYSBcY2xhc3N7ZGxvYmplY3R9LgotXGVuZHtmdW5jZGVzY30KLQotVGhlIFxtb2R1bGV7ZGx9IG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzOgotCi1cYmVnaW57ZGF0YWRlc2N9e1JUTERfTEFaWX0KLVVzZWZ1bCBhcyBhbiBhcmd1bWVudCB0byBcZnVuY3Rpb257b3BlbigpfS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317UlRMRF9OT1d9Ci1Vc2VmdWwgYXMgYW4gYXJndW1lbnQgdG8gXGZ1bmN0aW9ue29wZW4oKX0uICBOb3RlIHRoYXQgb24gc3lzdGVtcwotd2hpY2ggZG8gbm90IHN1cHBvcnQgaW1tZWRpYXRlIGJpbmRpbmcsIHRoaXMgY29uc3RhbnQgd2lsbCBub3QgYXBwZWFyCi1pbiB0aGUgbW9kdWxlLiBGb3IgbWF4aW11bSBwb3J0YWJpbGl0eSwgdXNlIFxmdW5jdGlvbntoYXNhdHRyKCl9IHRvCi1kZXRlcm1pbmUgaWYgdGhlIHN5c3RlbSBzdXBwb3J0cyBpbW1lZGlhdGUgYmluZGluZy4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVRoZSBcbW9kdWxle2RsfSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbjoKLQotXGJlZ2lue2V4Y2Rlc2N9e2Vycm9yfQotRXhjZXB0aW9uIHJhaXNlZCB3aGVuIGFuIGVycm9yIGhhcyBvY2N1cnJlZCBpbnNpZGUgdGhlIGR5bmFtaWMgbG9hZGluZwotYW5kIGxpbmtpbmcgcm91dGluZXMuCi1cZW5ke2V4Y2Rlc2N9Ci0KLUV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgZGwsIHRpbWUKLT4+PiBhPWRsLm9wZW4oJy9saWIvbGliYy5zby42JykKLT4+PiBhLmNhbGwoJ3RpbWUnKSwgdGltZS50aW1lKCkKLSg5Mjk3MjM5MTQsIDkyOTcyMzkxNC40OTgpCi1cZW5ke3ZlcmJhdGltfQotCi1UaGlzIGV4YW1wbGUgd2FzIHRyaWVkIG9uIGEgRGViaWFuIEdOVS9MaW51eCBzeXN0ZW0sIGFuZCBpcyBhIGdvb2QKLWV4YW1wbGUgb2YgdGhlIGZhY3QgdGhhdCB1c2luZyB0aGlzIG1vZHVsZSBpcyB1c3VhbGx5IGEgYmFkIGFsdGVybmF0aXZlLgotCi1cc3Vic2VjdGlvbntEbCBPYmplY3RzIFxsYWJlbHtkbC1vYmplY3RzfX0KLQotRGwgb2JqZWN0cywgYXMgcmV0dXJuZWQgYnkgXGZ1bmN0aW9ue29wZW4oKX0gYWJvdmUsIGhhdmUgdGhlCi1mb2xsb3dpbmcgbWV0aG9kczoKLQotXGJlZ2lue21ldGhvZGRlc2N9W2RsXXtjbG9zZX17fQotRnJlZSBhbGwgcmVzb3VyY2VzLCBleGNlcHQgdGhlIG1lbW9yeS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2RsXXtzeW19e25hbWV9Ci1SZXR1cm4gdGhlIHBvaW50ZXIgZm9yIHRoZSBmdW5jdGlvbiBuYW1lZCBcdmFye25hbWV9LCBhcyBhIG51bWJlciwgaWYKLWl0IGV4aXN0cyBpbiB0aGUgcmVmZXJlbmNlZCBzaGFyZWQgb2JqZWN0LCBvdGhlcndpc2UgXGNvZGV7Tm9uZX0uIFRoaXMKLWlzIHVzZWZ1bCBpbiBjb2RlIGxpa2U6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpZiBhLnN5bSgndGltZScpOiAKLS4uLiAgICAgYS5jYWxsKCd0aW1lJykKLS4uLiBlbHNlOiAKLS4uLiAgICAgdGltZS50aW1lKCkKLVxlbmR7dmVyYmF0aW19Ci0KLShOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBhIG5vbi16ZXJvIG51bWJlciwgYXMgemVybyBpcyB0aGUKLVxOVUxMe30gcG9pbnRlcikKLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2RsXXtjYWxsfXtuYW1lXG9wdGlvbmFseywgYXJnMVxvcHRpb25hbHssIGFyZzJcbGRvdHN9fX0KLUNhbGwgdGhlIGZ1bmN0aW9uIG5hbWVkIFx2YXJ7bmFtZX0gaW4gdGhlIHJlZmVyZW5jZWQgc2hhcmVkIG9iamVjdC4KLVRoZSBhcmd1bWVudHMgbXVzdCBiZSBlaXRoZXIgUHl0aG9uIGludGVnZXJzLCB3aGljaCB3aWxsIGJlIAotcGFzc2VkIGFzIGlzLCBQeXRob24gc3RyaW5ncywgdG8gd2hpY2ggYSBwb2ludGVyIHdpbGwgYmUgcGFzc2VkLCAKLW9yIFxjb2Rle05vbmV9LCB3aGljaCB3aWxsIGJlIHBhc3NlZCBhcyBcTlVMTC4gIE5vdGUgdGhhdCAKLXN0cmluZ3Mgc2hvdWxkIG9ubHkgYmUgcGFzc2VkIHRvIGZ1bmN0aW9ucyBhcyBcY3R5cGV7Y29uc3QgY2hhcip9LCBhcwotUHl0aG9uIHdpbGwgbm90IGxpa2UgaXRzIHN0cmluZyBtdXRhdGVkLgotCi1UaGVyZSBtdXN0IGJlIGF0IG1vc3QgMTAgYXJndW1lbnRzLCBhbmQgYXJndW1lbnRzIG5vdCBnaXZlbiB3aWxsIGJlCi10cmVhdGVkIGFzIFxjb2Rle05vbmV9LiBUaGUgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUgbXVzdCBiZSBhIEMKLVxjdHlwZXtsb25nfSwgd2hpY2ggaXMgYSBQeXRob24gaW50ZWdlci4KLVxlbmR7bWV0aG9kZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliZG9jdGVzdC50ZXggYi9Eb2MvbGliL2xpYmRvY3Rlc3QudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTQzYjg0Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGliZG9jdGVzdC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTc0ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7ZG9jdGVzdH0gLS0tCi0gICAgICAgICBUZXN0IGludGVyYWN0aXZlIFB5dGhvbiBleGFtcGxlc30KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2RvY3Rlc3R9Ci1cbW9kdWxlYXV0aG9ye1RpbSBQZXRlcnN9e3RpbUBweXRob24ub3JnfQotXHNlY3Rpb25hdXRob3J7VGltIFBldGVyc317dGltQHB5dGhvbi5vcmd9Ci1cc2VjdGlvbmF1dGhvcntNb3NoZSBaYWRrYX17bW9zaGV6QGRlYmlhbi5vcmd9Ci1cc2VjdGlvbmF1dGhvcntFZHdhcmQgTG9wZXJ9e2VkbG9wZXJAdXNlcnMuc291cmNlZm9yZ2UubmV0fQotCi1cbW9kdWxlc3lub3BzaXN7QSBmcmFtZXdvcmsgZm9yIHZlcmlmeWluZyBpbnRlcmFjdGl2ZSBQeXRob24gZXhhbXBsZXMufQotCi1UaGUgXHJlZm1vZHVsZXtkb2N0ZXN0fSBtb2R1bGUgc2VhcmNoZXMgZm9yIHBpZWNlcyBvZiB0ZXh0IHRoYXQgbG9vayBsaWtlCi1pbnRlcmFjdGl2ZSBQeXRob24gc2Vzc2lvbnMsIGFuZCB0aGVuIGV4ZWN1dGVzIHRob3NlIHNlc3Npb25zIHRvCi12ZXJpZnkgdGhhdCB0aGV5IHdvcmsgZXhhY3RseSBhcyBzaG93bi4gIFRoZXJlIGFyZSBzZXZlcmFsIGNvbW1vbiB3YXlzIHRvCi11c2UgZG9jdGVzdDoKLQotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSBUbyBjaGVjayB0aGF0IGEgbW9kdWxlJ3MgZG9jc3RyaW5ncyBhcmUgdXAtdG8tZGF0ZSBieSB2ZXJpZnlpbmcKLSAgICAgIHRoYXQgYWxsIGludGVyYWN0aXZlIGV4YW1wbGVzIHN0aWxsIHdvcmsgYXMgZG9jdW1lbnRlZC4KLVxpdGVtIFRvIHBlcmZvcm0gcmVncmVzc2lvbiB0ZXN0aW5nIGJ5IHZlcmlmeWluZyB0aGF0IGludGVyYWN0aXZlCi0gICAgICBleGFtcGxlcyBmcm9tIGEgdGVzdCBmaWxlIG9yIGEgdGVzdCBvYmplY3Qgd29yayBhcyBleHBlY3RlZC4KLVxpdGVtIFRvIHdyaXRlIHR1dG9yaWFsIGRvY3VtZW50YXRpb24gZm9yIGEgcGFja2FnZSwgbGliZXJhbGx5Ci0gICAgICBpbGx1c3RyYXRlZCB3aXRoIGlucHV0LW91dHB1dCBleGFtcGxlcy4gIERlcGVuZGluZyBvbiB3aGV0aGVyCi0gICAgICB0aGUgZXhhbXBsZXMgb3IgdGhlIGV4cG9zaXRvcnkgdGV4dCBhcmUgZW1waGFzaXplZCwgdGhpcyBoYXMKLSAgICAgIHRoZSBmbGF2b3Igb2YgImxpdGVyYXRlIHRlc3RpbmciIG9yICJleGVjdXRhYmxlIGRvY3VtZW50YXRpb24iLgotXGVuZHtpdGVtaXplfQotCi1IZXJlJ3MgYSBjb21wbGV0ZSBidXQgc21hbGwgZXhhbXBsZSBtb2R1bGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSIiIgotVGhpcyBpcyB0aGUgImV4YW1wbGUiIG1vZHVsZS4KLQotVGhlIGV4YW1wbGUgbW9kdWxlIHN1cHBsaWVzIG9uZSBmdW5jdGlvbiwgZmFjdG9yaWFsKCkuICBGb3IgZXhhbXBsZSwKLQotPj4+IGZhY3RvcmlhbCg1KQotMTIwCi0iIiIKLQotZGVmIGZhY3RvcmlhbChuKToKLSAgICAiIiJSZXR1cm4gdGhlIGZhY3RvcmlhbCBvZiBuLCBhbiBleGFjdCBpbnRlZ2VyID49IDAuCi0KLSAgICBJZiB0aGUgcmVzdWx0IGlzIHNtYWxsIGVub3VnaCB0byBmaXQgaW4gYW4gaW50LCByZXR1cm4gYW4gaW50LgotICAgIEVsc2UgcmV0dXJuIGEgbG9uZy4KLQotICAgID4+PiBbZmFjdG9yaWFsKG4pIGZvciBuIGluIHJhbmdlKDYpXQotICAgIFsxLCAxLCAyLCA2LCAyNCwgMTIwXQotICAgID4+PiBbZmFjdG9yaWFsKGxvbmcobikpIGZvciBuIGluIHJhbmdlKDYpXQotICAgIFsxLCAxLCAyLCA2LCAyNCwgMTIwXQotICAgID4+PiBmYWN0b3JpYWwoMzApCi0gICAgMjY1MjUyODU5ODEyMTkxMDU4NjM2MzA4NDgwMDAwMDAwTAotICAgID4+PiBmYWN0b3JpYWwoMzBMKQotICAgIDI2NTI1Mjg1OTgxMjE5MTA1ODYzNjMwODQ4MDAwMDAwMEwKLSAgICA+Pj4gZmFjdG9yaWFsKC0xKQotICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLSAgICAgICAgLi4uCi0gICAgVmFsdWVFcnJvcjogbiBtdXN0IGJlID49IDAKLQotICAgIEZhY3RvcmlhbHMgb2YgZmxvYXRzIGFyZSBPSywgYnV0IHRoZSBmbG9hdCBtdXN0IGJlIGFuIGV4YWN0IGludGVnZXI6Ci0gICAgPj4+IGZhY3RvcmlhbCgzMC4xKQotICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLSAgICAgICAgLi4uCi0gICAgVmFsdWVFcnJvcjogbiBtdXN0IGJlIGV4YWN0IGludGVnZXIKLSAgICA+Pj4gZmFjdG9yaWFsKDMwLjApCi0gICAgMjY1MjUyODU5ODEyMTkxMDU4NjM2MzA4NDgwMDAwMDAwTAotCi0gICAgSXQgbXVzdCBhbHNvIG5vdCBiZSByaWRpY3Vsb3VzbHkgbGFyZ2U6Ci0gICAgPj4+IGZhY3RvcmlhbCgxZTEwMCkKLSAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gICAgICAgIC4uLgotICAgIE92ZXJmbG93RXJyb3I6IG4gdG9vIGxhcmdlCi0gICAgIiIiCi0KLVxlbmR7dmVyYmF0aW19Ci0lIGFsbG93IExhVGVYIHRvIGJyZWFrIGhlcmUuCi1cYmVnaW57dmVyYmF0aW19Ci0KLSAgICBpbXBvcnQgbWF0aAotICAgIGlmIG5vdCBuID49IDA6Ci0gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm4gbXVzdCBiZSA+PSAwIikKLSAgICBpZiBtYXRoLmZsb29yKG4pICE9IG46Ci0gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm4gbXVzdCBiZSBleGFjdCBpbnRlZ2VyIikKLSAgICBpZiBuKzEgPT0gbjogICMgY2F0Y2ggYSB2YWx1ZSBsaWtlIDFlMzAwCi0gICAgICAgIHJhaXNlIE92ZXJmbG93RXJyb3IoIm4gdG9vIGxhcmdlIikKLSAgICByZXN1bHQgPSAxCi0gICAgZmFjdG9yID0gMgotICAgIHdoaWxlIGZhY3RvciA8PSBuOgotICAgICAgICByZXN1bHQgKj0gZmFjdG9yCi0gICAgICAgIGZhY3RvciArPSAxCi0gICAgcmV0dXJuIHJlc3VsdAotCi1kZWYgX3Rlc3QoKToKLSAgICBpbXBvcnQgZG9jdGVzdAotICAgIGRvY3Rlc3QudGVzdG1vZCgpCi0KLWlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgX3Rlc3QoKQotXGVuZHt2ZXJiYXRpbX0KLQotSWYgeW91IHJ1biBcZmlsZXtleGFtcGxlLnB5fSBkaXJlY3RseSBmcm9tIHRoZSBjb21tYW5kIGxpbmUsCi1ccmVmbW9kdWxle2RvY3Rlc3R9IHdvcmtzIGl0cyBtYWdpYzoKLQotXGJlZ2lue3ZlcmJhdGltfQotJCBweXRob24gZXhhbXBsZS5weQotJAotXGVuZHt2ZXJiYXRpbX0KLQotVGhlcmUncyBubyBvdXRwdXQhICBUaGF0J3Mgbm9ybWFsLCBhbmQgaXQgbWVhbnMgYWxsIHRoZSBleGFtcGxlcwotd29ya2VkLiAgUGFzcyBccHJvZ3JhbW9wdHstdn0gdG8gdGhlIHNjcmlwdCwgYW5kIFxyZWZtb2R1bGV7ZG9jdGVzdH0KLXByaW50cyBhIGRldGFpbGVkIGxvZyBvZiB3aGF0IGl0J3MgdHJ5aW5nLCBhbmQgcHJpbnRzIGEgc3VtbWFyeSBhdCB0aGUKLWVuZDoKLQotXGJlZ2lue3ZlcmJhdGltfQotJCBweXRob24gZXhhbXBsZS5weSAtdgotVHJ5aW5nOgotICAgIGZhY3RvcmlhbCg1KQotRXhwZWN0aW5nOgotICAgIDEyMAotb2sKLVRyeWluZzoKLSAgICBbZmFjdG9yaWFsKG4pIGZvciBuIGluIHJhbmdlKDYpXQotRXhwZWN0aW5nOgotICAgIFsxLCAxLCAyLCA2LCAyNCwgMTIwXQotb2sKLVRyeWluZzoKLSAgICBbZmFjdG9yaWFsKGxvbmcobikpIGZvciBuIGluIHJhbmdlKDYpXQotRXhwZWN0aW5nOgotICAgIFsxLCAxLCAyLCA2LCAyNCwgMTIwXQotb2sKLVxlbmR7dmVyYmF0aW19Ci0KLUFuZCBzbyBvbiwgZXZlbnR1YWxseSBlbmRpbmcgd2l0aDoKLQotXGJlZ2lue3ZlcmJhdGltfQotVHJ5aW5nOgotICAgIGZhY3RvcmlhbCgxZTEwMCkKLUV4cGVjdGluZzoKLSAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gICAgICAgIC4uLgotICAgIE92ZXJmbG93RXJyb3I6IG4gdG9vIGxhcmdlCi1vawotMSBpdGVtcyBoYWQgbm8gdGVzdHM6Ci0gICAgX19tYWluX18uX3Rlc3QKLTIgaXRlbXMgcGFzc2VkIGFsbCB0ZXN0czoKLSAgIDEgdGVzdHMgaW4gX19tYWluX18KLSAgIDggdGVzdHMgaW4gX19tYWluX18uZmFjdG9yaWFsCi05IHRlc3RzIGluIDMgaXRlbXMuCi05IHBhc3NlZCBhbmQgMCBmYWlsZWQuCi1UZXN0IHBhc3NlZC4KLSQKLVxlbmR7dmVyYmF0aW19Ci0KLVRoYXQncyBhbGwgeW91IG5lZWQgdG8ga25vdyB0byBzdGFydCBtYWtpbmcgcHJvZHVjdGl2ZSB1c2Ugb2YKLVxyZWZtb2R1bGV7ZG9jdGVzdH0hICBKdW1wIGluLiAgVGhlIGZvbGxvd2luZyBzZWN0aW9ucyBwcm92aWRlIGZ1bGwKLWRldGFpbHMuICBOb3RlIHRoYXQgdGhlcmUgYXJlIG1hbnkgZXhhbXBsZXMgb2YgZG9jdGVzdHMgaW4KLXRoZSBzdGFuZGFyZCBQeXRob24gdGVzdCBzdWl0ZSBhbmQgbGlicmFyaWVzLiAgRXNwZWNpYWxseSB1c2VmdWwgZXhhbXBsZXMKLWNhbiBiZSBmb3VuZCBpbiB0aGUgc3RhbmRhcmQgdGVzdCBmaWxlIFxmaWxle0xpYi90ZXN0L3Rlc3RfZG9jdGVzdC5weX0uCi0KLVxzdWJzZWN0aW9ue1NpbXBsZSBVc2FnZTogQ2hlY2tpbmcgRXhhbXBsZXMgaW4KLSAgICAgICAgICAgIERvY3N0cmluZ3NcbGFiZWx7ZG9jdGVzdC1zaW1wbGUtdGVzdG1vZH19Ci0KLVRoZSBzaW1wbGVzdCB3YXkgdG8gc3RhcnQgdXNpbmcgZG9jdGVzdCAoYnV0IG5vdCBuZWNlc3NhcmlseSB0aGUgd2F5Ci15b3UnbGwgY29udGludWUgdG8gZG8gaXQpIGlzIHRvIGVuZCBlYWNoIG1vZHVsZSBcbW9kdWxle019IHdpdGg6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWRlZiBfdGVzdCgpOgotICAgIGltcG9ydCBkb2N0ZXN0Ci0gICAgZG9jdGVzdC50ZXN0bW9kKCkKLQotaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgICBfdGVzdCgpCi1cZW5ke3ZlcmJhdGltfQotCi1ccmVmbW9kdWxle2RvY3Rlc3R9IHRoZW4gZXhhbWluZXMgZG9jc3RyaW5ncyBpbiBtb2R1bGUgXG1vZHVsZXtNfS4KLQotUnVubmluZyB0aGUgbW9kdWxlIGFzIGEgc2NyaXB0IGNhdXNlcyB0aGUgZXhhbXBsZXMgaW4gdGhlIGRvY3N0cmluZ3MKLXRvIGdldCBleGVjdXRlZCBhbmQgdmVyaWZpZWQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXB5dGhvbiBNLnB5Ci1cZW5ke3ZlcmJhdGltfQotCi1UaGlzIHdvbid0IGRpc3BsYXkgYW55dGhpbmcgdW5sZXNzIGFuIGV4YW1wbGUgZmFpbHMsIGluIHdoaWNoIGNhc2UgdGhlCi1mYWlsaW5nIGV4YW1wbGUocykgYW5kIHRoZSBjYXVzZShzKSBvZiB0aGUgZmFpbHVyZShzKSBhcmUgcHJpbnRlZCB0byBzdGRvdXQsCi1hbmQgdGhlIGZpbmFsIGxpbmUgb2Ygb3V0cHV0IGlzCi1cc2FtcHsqKipUZXN0IEZhaWxlZCoqKiBcdmFye059IGZhaWx1cmVzLn0sIHdoZXJlIFx2YXJ7Tn0gaXMgdGhlCi1udW1iZXIgb2YgZXhhbXBsZXMgdGhhdCBmYWlsZWQuCi0KLVJ1biBpdCB3aXRoIHRoZSBccHJvZ3JhbW9wdHstdn0gc3dpdGNoIGluc3RlYWQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXB5dGhvbiBNLnB5IC12Ci1cZW5ke3ZlcmJhdGltfQotCi1hbmQgYSBkZXRhaWxlZCByZXBvcnQgb2YgYWxsIGV4YW1wbGVzIHRyaWVkIGlzIHByaW50ZWQgdG8gc3RhbmRhcmQKLW91dHB1dCwgYWxvbmcgd2l0aCBhc3NvcnRlZCBzdW1tYXJpZXMgYXQgdGhlIGVuZC4KLQotWW91IGNhbiBmb3JjZSB2ZXJib3NlIG1vZGUgYnkgcGFzc2luZyBcY29kZXt2ZXJib3NlPVRydWV9IHRvCi1cZnVuY3Rpb257dGVzdG1vZCgpfSwgb3IKLXByb2hpYml0IGl0IGJ5IHBhc3NpbmcgXGNvZGV7dmVyYm9zZT1GYWxzZX0uICBJbiBlaXRoZXIgb2YgdGhvc2UgY2FzZXMsCi1cY29kZXtzeXMuYXJndn0gaXMgbm90IGV4YW1pbmVkIGJ5IFxmdW5jdGlvbnt0ZXN0bW9kKCl9IChzbyBwYXNzaW5nCi1ccHJvZ3JhbW9wdHstdn0gb3Igbm90IGhhcyBubyBlZmZlY3QpLgotCi1TaW5jZSBQeXRob24gMi42LCB0aGVyZSBpcyBhbHNvIGEgY29tbWFuZCBsaW5lIHNob3J0Y3V0IGZvciBydW5uaW5nCi1cZnVuY3Rpb257dGVzdG1vZCgpfS4gIFlvdSBjYW4gaW5zdHJ1Y3QgdGhlIFB5dGhvbiBpbnRlcnByZXRlciB0byBydW4KLXRoZSBkb2N0ZXN0IG1vZHVsZSBkaXJlY3RseSBmcm9tIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGFuZCBwYXNzIHRoZSBtb2R1bGUKLW5hbWUocykgb24gdGhlIGNvbW1hbmQgbGluZToKLQotXGJlZ2lue3ZlcmJhdGltfQotcHl0aG9uIC1tIGRvY3Rlc3QgLXYgZXhhbXBsZS5weQotXGVuZHt2ZXJiYXRpbX0KLQotVGhpcyB3aWxsIGltcG9ydCBcZmlsZXtleGFtcGxlLnB5fSBhcyBhIHN0YW5kYWxvbmUgbW9kdWxlIGFuZCBydW4KLVxmdW5jdGlvbnt0ZXN0bW9kKCl9IG9uIGl0LiAgTm90ZSB0aGF0IHRoaXMgbWF5IG5vdCB3b3JrIGNvcnJlY3RseSBpZiB0aGUKLWZpbGUgaXMgcGFydCBvZiBhIHBhY2thZ2UgYW5kIGltcG9ydHMgb3RoZXIgc3VibW9kdWxlcyBmcm9tIHRoYXQgcGFja2FnZS4KLQotRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gXGZ1bmN0aW9ue3Rlc3Rtb2QoKX0sIHNlZQotc2VjdGlvbn5ccmVme2RvY3Rlc3QtYmFzaWMtYXBpfS4KLQotXHN1YnNlY3Rpb257U2ltcGxlIFVzYWdlOiBDaGVja2luZyBFeGFtcGxlcyBpbiBhIFRleHQKLSAgICAgICAgICAgIEZpbGVcbGFiZWx7ZG9jdGVzdC1zaW1wbGUtdGVzdGZpbGV9fQotCi1Bbm90aGVyIHNpbXBsZSBhcHBsaWNhdGlvbiBvZiBkb2N0ZXN0IGlzIHRlc3RpbmcgaW50ZXJhY3RpdmUgZXhhbXBsZXMKLWluIGEgdGV4dCBmaWxlLiAgVGhpcyBjYW4gYmUgZG9uZSB3aXRoIHRoZSBcZnVuY3Rpb257dGVzdGZpbGUoKX0KLWZ1bmN0aW9uOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgZG9jdGVzdAotZG9jdGVzdC50ZXN0ZmlsZSgiZXhhbXBsZS50eHQiKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhhdCBzaG9ydCBzY3JpcHQgZXhlY3V0ZXMgYW5kIHZlcmlmaWVzIGFueSBpbnRlcmFjdGl2ZSBQeXRob24KLWV4YW1wbGVzIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSBcZmlsZXtleGFtcGxlLnR4dH0uICBUaGUgZmlsZSBjb250ZW50Ci1pcyB0cmVhdGVkIGFzIGlmIGl0IHdlcmUgYSBzaW5nbGUgZ2lhbnQgZG9jc3RyaW5nOyB0aGUgZmlsZSBkb2Vzbid0Ci1uZWVkIHRvIGNvbnRhaW4gYSBQeXRob24gcHJvZ3JhbSEgICBGb3IgZXhhbXBsZSwgcGVyaGFwcyBcZmlsZXtleGFtcGxlLnR4dH0KLWNvbnRhaW5zIHRoaXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLVRoZSBgYGV4YW1wbGVgYCBtb2R1bGUKLT09PT09PT09PT09PT09PT09PT09PT0KLQotVXNpbmcgYGBmYWN0b3JpYWxgYAotLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGlzIGlzIGFuIGV4YW1wbGUgdGV4dCBmaWxlIGluIHJlU3RydWN0dXJlZFRleHQgZm9ybWF0LiAgRmlyc3QgaW1wb3J0Ci1gYGZhY3RvcmlhbGBgIGZyb20gdGhlIGBgZXhhbXBsZWBgIG1vZHVsZToKLQotICAgID4+PiBmcm9tIGV4YW1wbGUgaW1wb3J0IGZhY3RvcmlhbAotCi1Ob3cgdXNlIGl0OgotCi0gICAgPj4+IGZhY3RvcmlhbCg2KQotICAgIDEyMAotXGVuZHt2ZXJiYXRpbX0KLQotUnVubmluZyBcY29kZXtkb2N0ZXN0LnRlc3RmaWxlKCJleGFtcGxlLnR4dCIpfSB0aGVuIGZpbmRzIHRoZSBlcnJvcgotaW4gdGhpcyBkb2N1bWVudGF0aW9uOgotCi1cYmVnaW57dmVyYmF0aW19Ci1GaWxlICIuL2V4YW1wbGUudHh0IiwgbGluZSAxNCwgaW4gZXhhbXBsZS50eHQKLUZhaWxlZCBleGFtcGxlOgotICAgIGZhY3RvcmlhbCg2KQotRXhwZWN0ZWQ6Ci0gICAgMTIwCi1Hb3Q6Ci0gICAgNzIwCi1cZW5ke3ZlcmJhdGltfQotCi1BcyB3aXRoIFxmdW5jdGlvbnt0ZXN0bW9kKCl9LCBcZnVuY3Rpb257dGVzdGZpbGUoKX0gd29uJ3QgZGlzcGxheSBhbnl0aGluZwotdW5sZXNzIGFuIGV4YW1wbGUgZmFpbHMuICBJZiBhbiBleGFtcGxlIGRvZXMgZmFpbCwgdGhlbiB0aGUgZmFpbGluZwotZXhhbXBsZShzKSBhbmQgdGhlIGNhdXNlKHMpIG9mIHRoZSBmYWlsdXJlKHMpIGFyZSBwcmludGVkIHRvIHN0ZG91dCwgdXNpbmcKLXRoZSBzYW1lIGZvcm1hdCBhcyBcZnVuY3Rpb257dGVzdG1vZCgpfS4KLQotQnkgZGVmYXVsdCwgXGZ1bmN0aW9ue3Rlc3RmaWxlKCl9IGxvb2tzIGZvciBmaWxlcyBpbiB0aGUgY2FsbGluZwotbW9kdWxlJ3MgZGlyZWN0b3J5LiAgU2VlIHNlY3Rpb25+XHJlZntkb2N0ZXN0LWJhc2ljLWFwaX0gZm9yIGEKLWRlc2NyaXB0aW9uIG9mIHRoZSBvcHRpb25hbCBhcmd1bWVudHMgdGhhdCBjYW4gYmUgdXNlZCB0byB0ZWxsIGl0IHRvCi1sb29rIGZvciBmaWxlcyBpbiBvdGhlciBsb2NhdGlvbnMuCi0KLUxpa2UgXGZ1bmN0aW9ue3Rlc3Rtb2QoKX0sIFxmdW5jdGlvbnt0ZXN0ZmlsZSgpfSdzIHZlcmJvc2l0eSBjYW4gYmUKLXNldCB3aXRoIHRoZSBccHJvZ3JhbW9wdHstdn0gY29tbWFuZC1saW5lIHN3aXRjaCBvciB3aXRoIHRoZSBvcHRpb25hbAota2V5d29yZCBhcmd1bWVudCBcdmFye3ZlcmJvc2V9LgotCi1TaW5jZSBQeXRob24gMi42LCB0aGVyZSBpcyBhbHNvIGEgY29tbWFuZCBsaW5lIHNob3J0Y3V0IGZvciBydW5uaW5nCi1cZnVuY3Rpb257dGVzdGZpbGUoKX0uICBZb3UgY2FuIGluc3RydWN0IHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgdG8gcnVuCi10aGUgZG9jdGVzdCBtb2R1bGUgZGlyZWN0bHkgZnJvbSB0aGUgc3RhbmRhcmQgbGlicmFyeSBhbmQgcGFzcyB0aGUgZmlsZQotbmFtZShzKSBvbiB0aGUgY29tbWFuZCBsaW5lOgotCi1cYmVnaW57dmVyYmF0aW19Ci1weXRob24gLW0gZG9jdGVzdCAtdiBleGFtcGxlLnR4dAotXGVuZHt2ZXJiYXRpbX0KLQotQmVjYXVzZSB0aGUgZmlsZSBuYW1lIGRvZXMgbm90IGVuZCB3aXRoIFxmaWxley5weX0sIFxtb2R1bGV7ZG9jdGVzdH0gaW5mZXJzCi10aGF0IGl0IG11c3QgYmUgcnVuIHdpdGggXGZ1bmN0aW9ue3Rlc3RmaWxlKCl9LCBub3QgXGZ1bmN0aW9ue3Rlc3Rtb2QoKX0uCi0KLUZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFxmdW5jdGlvbnt0ZXN0ZmlsZSgpfSwgc2VlCi1zZWN0aW9uflxyZWZ7ZG9jdGVzdC1iYXNpYy1hcGl9LgotCi1cc3Vic2VjdGlvbntIb3cgSXQgV29ya3NcbGFiZWx7ZG9jdGVzdC1ob3ctaXQtd29ya3N9fQotCi1UaGlzIHNlY3Rpb24gZXhhbWluZXMgaW4gZGV0YWlsIGhvdyBkb2N0ZXN0IHdvcmtzOiB3aGljaCBkb2NzdHJpbmdzIGl0Ci1sb29rcyBhdCwgaG93IGl0IGZpbmRzIGludGVyYWN0aXZlIGV4YW1wbGVzLCB3aGF0IGV4ZWN1dGlvbiBjb250ZXh0IGl0Ci11c2VzLCBob3cgaXQgaGFuZGxlcyBleGNlcHRpb25zLCBhbmQgaG93IG9wdGlvbiBmbGFncyBjYW4gYmUgdXNlZCB0bwotY29udHJvbCBpdHMgYmVoYXZpb3IuICBUaGlzIGlzIHRoZSBpbmZvcm1hdGlvbiB0aGF0IHlvdSBuZWVkIHRvIGtub3cKLXRvIHdyaXRlIGRvY3Rlc3QgZXhhbXBsZXM7IGZvciBpbmZvcm1hdGlvbiBhYm91dCBhY3R1YWxseSBydW5uaW5nCi1kb2N0ZXN0IG9uIHRoZXNlIGV4YW1wbGVzLCBzZWUgdGhlIGZvbGxvd2luZyBzZWN0aW9ucy4KLQotXHN1YnN1YnNlY3Rpb257V2hpY2ggRG9jc3RyaW5ncyBBcmUgRXhhbWluZWQ/XGxhYmVse2RvY3Rlc3Qtd2hpY2gtZG9jc3RyaW5nc319Ci0KLVRoZSBtb2R1bGUgZG9jc3RyaW5nLCBhbmQgYWxsIGZ1bmN0aW9uLCBjbGFzcyBhbmQgbWV0aG9kIGRvY3N0cmluZ3MgYXJlCi1zZWFyY2hlZC4gIE9iamVjdHMgaW1wb3J0ZWQgaW50byB0aGUgbW9kdWxlIGFyZSBub3Qgc2VhcmNoZWQuCi0KLUluIGFkZGl0aW9uLCBpZiBcY29kZXtNLl9fdGVzdF9ffSBleGlzdHMgYW5kICJpcyB0cnVlIiwgaXQgbXVzdCBiZSBhCi1kaWN0LCBhbmQgZWFjaCBlbnRyeSBtYXBzIGEgKHN0cmluZykgbmFtZSB0byBhIGZ1bmN0aW9uIG9iamVjdCwgY2xhc3MKLW9iamVjdCwgb3Igc3RyaW5nLiAgRnVuY3Rpb24gYW5kIGNsYXNzIG9iamVjdCBkb2NzdHJpbmdzIGZvdW5kIGZyb20KLVxjb2Rle00uX190ZXN0X199IGFyZSBzZWFyY2hlZCwgYW5kIHN0cmluZ3MgYXJlIHRyZWF0ZWQgYXMgaWYgdGhleQotd2VyZSBkb2NzdHJpbmdzLiAgSW4gb3V0cHV0LCBhIGtleSBcY29kZXtLfSBpbiBcY29kZXtNLl9fdGVzdF9ffSBhcHBlYXJzCi13aXRoIG5hbWUKLQotXGJlZ2lue3ZlcmJhdGltfQotPG5hbWUgb2YgTT4uX190ZXN0X18uSwotXGVuZHt2ZXJiYXRpbX0KLQotQW55IGNsYXNzZXMgZm91bmQgYXJlIHJlY3Vyc2l2ZWx5IHNlYXJjaGVkIHNpbWlsYXJseSwgdG8gdGVzdCBkb2NzdHJpbmdzIGluCi10aGVpciBjb250YWluZWQgbWV0aG9kcyBhbmQgbmVzdGVkIGNsYXNzZXMuCi0KLVx2ZXJzaW9uY2hhbmdlZFtBICJwcml2YXRlIG5hbWUiIGNvbmNlcHQgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyCi0gICAgICAgICAgICAgICAgZG9jdW1lbnRlZF17Mi40fQotCi1cc3Vic3Vic2VjdGlvbntIb3cgYXJlIERvY3N0cmluZyBFeGFtcGxlcwotICAgICAgICAgICAgICAgUmVjb2duaXplZD9cbGFiZWx7ZG9jdGVzdC1maW5kaW5nLWV4YW1wbGVzfX0KLQotSW4gbW9zdCBjYXNlcyBhIGNvcHktYW5kLXBhc3RlIG9mIGFuIGludGVyYWN0aXZlIGNvbnNvbGUgc2Vzc2lvbiB3b3JrcwotZmluZSwgYnV0IGRvY3Rlc3QgaXNuJ3QgdHJ5aW5nIHRvIGRvIGFuIGV4YWN0IGVtdWxhdGlvbiBvZiBhbnkgc3BlY2lmaWMKLVB5dGhvbiBzaGVsbC4gIEFsbCBoYXJkIHRhYiBjaGFyYWN0ZXJzIGFyZSBleHBhbmRlZCB0byBzcGFjZXMsIHVzaW5nCi04LWNvbHVtbiB0YWIgc3RvcHMuICBJZiB5b3UgZG9uJ3QgYmVsaWV2ZSB0YWJzIHNob3VsZCBtZWFuIHRoYXQsIHRvbwotYmFkOiAgZG9uJ3QgdXNlIGhhcmQgdGFicywgb3Igd3JpdGUgeW91ciBvd24gXGNsYXNze0RvY1Rlc3RQYXJzZXJ9Ci1jbGFzcy4KLQotXHZlcnNpb25jaGFuZ2VkW0V4cGFuZGluZyB0YWJzIHRvIHNwYWNlcyBpcyBuZXc7IHByZXZpb3VzIHZlcnNpb25zCi0gICAgICAgICAgICAgICAgdHJpZWQgdG8gcHJlc2VydmUgaGFyZCB0YWJzLCB3aXRoIGNvbmZ1c2luZyByZXN1bHRzXXsyLjR9Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiAjIGNvbW1lbnRzIGFyZSBpZ25vcmVkCi0+Pj4geCA9IDEyCi0+Pj4geAotMTIKLT4+PiBpZiB4ID09IDEzOgotLi4uICAgICBwcmludCAieWVzIgotLi4uIGVsc2U6Ci0uLi4gICAgIHByaW50ICJubyIKLS4uLiAgICAgcHJpbnQgIk5PIgotLi4uICAgICBwcmludCAiTk8hISEiCi0uLi4KLW5vCi1OTwotTk8hISEKLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotQW55IGV4cGVjdGVkIG91dHB1dCBtdXN0IGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgZmluYWwKLVxjb2Rleyc+Pj5+J30gb3IgXGNvZGV7Jy4uLn4nfSBsaW5lIGNvbnRhaW5pbmcgdGhlIGNvZGUsIGFuZAotdGhlIGV4cGVjdGVkIG91dHB1dCAoaWYgYW55KSBleHRlbmRzIHRvIHRoZSBuZXh0IFxjb2Rleyc+Pj5+J30KLW9yIGFsbC13aGl0ZXNwYWNlIGxpbmUuCi0KLVRoZSBmaW5lIHByaW50OgotCi1cYmVnaW57aXRlbWl6ZX0KLQotXGl0ZW0gRXhwZWN0ZWQgb3V0cHV0IGNhbm5vdCBjb250YWluIGFuIGFsbC13aGl0ZXNwYWNlIGxpbmUsIHNpbmNlIHN1Y2ggYQotICBsaW5lIGlzIHRha2VuIHRvIHNpZ25hbCB0aGUgZW5kIG9mIGV4cGVjdGVkIG91dHB1dC4gIElmIGV4cGVjdGVkCi0gIG91dHB1dCBkb2VzIGNvbnRhaW4gYSBibGFuayBsaW5lLCBwdXQgXGNvZGV7PEJMQU5LTElORT59IGluIHlvdXIKLSAgZG9jdGVzdCBleGFtcGxlIGVhY2ggcGxhY2UgYSBibGFuayBsaW5lIGlzIGV4cGVjdGVkLgotICBcdmVyc2lvbmNoYW5nZWRbXGNvZGV7PEJMQU5LTElORT59IHdhcyBhZGRlZDsgdGhlcmUgd2FzIG5vIHdheSB0bwotICAgICAgICAgICAgICAgICAgdXNlIGV4cGVjdGVkIG91dHB1dCBjb250YWluaW5nIGVtcHR5IGxpbmVzIGluCi0gICAgICAgICAgICAgICAgICBwcmV2aW91cyB2ZXJzaW9uc117Mi40fQotCi1caXRlbSBPdXRwdXQgdG8gc3Rkb3V0IGlzIGNhcHR1cmVkLCBidXQgbm90IG91dHB1dCB0byBzdGRlcnIgKGV4Y2VwdGlvbgotICB0cmFjZWJhY2tzIGFyZSBjYXB0dXJlZCB2aWEgYSBkaWZmZXJlbnQgbWVhbnMpLgotCi1caXRlbSBJZiB5b3UgY29udGludWUgYSBsaW5lIHZpYSBiYWNrc2xhc2hpbmcgaW4gYW4gaW50ZXJhY3RpdmUgc2Vzc2lvbiwKLSAgb3IgZm9yIGFueSBvdGhlciByZWFzb24gdXNlIGEgYmFja3NsYXNoLCB5b3Ugc2hvdWxkIHVzZSBhIHJhdwotICBkb2NzdHJpbmcsIHdoaWNoIHdpbGwgcHJlc2VydmUgeW91ciBiYWNrc2xhc2hlcyBleGFjdGx5IGFzIHlvdSB0eXBlCi0gIHRoZW06Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBkZWYgZih4KToKLS4uLiAgICAgcicnJ0JhY2tzbGFzaGVzIGluIGEgcmF3IGRvY3N0cmluZzogbVxuJycnCi0+Pj4gcHJpbnQgZi5fX2RvY19fCi1CYWNrc2xhc2hlcyBpbiBhIHJhdyBkb2NzdHJpbmc6IG1cbgotXGVuZHt2ZXJiYXRpbX0KLQotICBPdGhlcndpc2UsIHRoZSBiYWNrc2xhc2ggd2lsbCBiZSBpbnRlcnByZXRlZCBhcyBwYXJ0IG9mIHRoZSBzdHJpbmcuCi0gIEZvciBleGFtcGxlLCB0aGUgIntcdGV4dGJhY2tzbGFzaH0iIGFib3ZlIHdvdWxkIGJlIGludGVycHJldGVkIGFzIGEKLSAgbmV3bGluZSBjaGFyYWN0ZXIuICBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGRvdWJsZSBlYWNoIGJhY2tzbGFzaCBpbiB0aGUKLSAgZG9jdGVzdCB2ZXJzaW9uIChhbmQgbm90IHVzZSBhIHJhdyBzdHJpbmcpOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZGVmIGYoeCk6Ci0uLi4gICAgICcnJ0JhY2tzbGFzaGVzIGluIGEgcmF3IGRvY3N0cmluZzogbVxcbicnJwotPj4+IHByaW50IGYuX19kb2NfXwotQmFja3NsYXNoZXMgaW4gYSByYXcgZG9jc3RyaW5nOiBtXG4KLVxlbmR7dmVyYmF0aW19Ci0KLVxpdGVtIFRoZSBzdGFydGluZyBjb2x1bW4gZG9lc24ndCBtYXR0ZXI6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgPj4+IGFzc2VydCAiRWFzeSEiCi0gICAgICAgID4+PiBpbXBvcnQgbWF0aAotICAgICAgICAgICAgPj4+IG1hdGguZmxvb3IoMS45KQotICAgICAgICAgICAgMS4wCi1cZW5ke3ZlcmJhdGltfQotCi1hbmQgYXMgbWFueSBsZWFkaW5nIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBhcmUgc3RyaXBwZWQgZnJvbSB0aGUKLWV4cGVjdGVkIG91dHB1dCBhcyBhcHBlYXJlZCBpbiB0aGUgaW5pdGlhbCBcY29kZXsnPj4+fid9IGxpbmUKLXRoYXQgc3RhcnRlZCB0aGUgZXhhbXBsZS4KLVxlbmR7aXRlbWl6ZX0KLQotXHN1YnN1YnNlY3Rpb257V2hhdCdzIHRoZSBFeGVjdXRpb24gQ29udGV4dD9cbGFiZWx7ZG9jdGVzdC1leGVjdXRpb24tY29udGV4dH19Ci0KLUJ5IGRlZmF1bHQsIGVhY2ggdGltZSBccmVmbW9kdWxle2RvY3Rlc3R9IGZpbmRzIGEgZG9jc3RyaW5nIHRvIHRlc3QsIGl0Ci11c2VzIGEgXGVtcGh7c2hhbGxvdyBjb3B5fSBvZiBcbW9kdWxle019J3MgZ2xvYmFscywgc28gdGhhdCBydW5uaW5nIHRlc3RzCi1kb2Vzbid0IGNoYW5nZSB0aGUgbW9kdWxlJ3MgcmVhbCBnbG9iYWxzLCBhbmQgc28gdGhhdCBvbmUgdGVzdCBpbgotXG1vZHVsZXtNfSBjYW4ndCBsZWF2ZSBiZWhpbmQgY3J1bWJzIHRoYXQgYWNjaWRlbnRhbGx5IGFsbG93IGFub3RoZXIgdGVzdAotdG8gd29yay4gIFRoaXMgbWVhbnMgZXhhbXBsZXMgY2FuIGZyZWVseSB1c2UgYW55IG5hbWVzIGRlZmluZWQgYXQgdG9wLWxldmVsCi1pbiBcbW9kdWxle019LCBhbmQgbmFtZXMgZGVmaW5lZCBlYXJsaWVyIGluIHRoZSBkb2NzdHJpbmcgYmVpbmcgcnVuLgotRXhhbXBsZXMgY2Fubm90IHNlZSBuYW1lcyBkZWZpbmVkIGluIG90aGVyIGRvY3N0cmluZ3MuCi0KLVlvdSBjYW4gZm9yY2UgdXNlIG9mIHlvdXIgb3duIGRpY3QgYXMgdGhlIGV4ZWN1dGlvbiBjb250ZXh0IGJ5IHBhc3NpbmcKLVxjb2Rle2dsb2JzPXlvdXJfZGljdH0gdG8gXGZ1bmN0aW9ue3Rlc3Rtb2QoKX0gb3IKLVxmdW5jdGlvbnt0ZXN0ZmlsZSgpfSBpbnN0ZWFkLgotCi1cc3Vic3Vic2VjdGlvbntXaGF0IEFib3V0IEV4Y2VwdGlvbnM/XGxhYmVse2RvY3Rlc3QtZXhjZXB0aW9uc319Ci0KLU5vIHByb2JsZW0sIHByb3ZpZGVkIHRoYXQgdGhlIHRyYWNlYmFjayBpcyB0aGUgb25seSBvdXRwdXQgcHJvZHVjZWQgYnkKLXRoZSBleGFtcGxlOiAganVzdCBwYXN0ZSBpbiB0aGUgdHJhY2ViYWNrLlxmb290bm90ZXtFeGFtcGxlcyBjb250YWluaW5nCi0gICAgYm90aCBleHBlY3RlZCBvdXRwdXQgYW5kIGFuIGV4Y2VwdGlvbiBhcmUgbm90IHN1cHBvcnRlZC4gIFRyeWluZwotICAgIHRvIGd1ZXNzIHdoZXJlIG9uZSBlbmRzIGFuZCB0aGUgb3RoZXIgYmVnaW5zIGlzIHRvbyBlcnJvci1wcm9uZSwKLSAgICBhbmQgdGhhdCBhbHNvIG1ha2VzIGZvciBhIGNvbmZ1c2luZyB0ZXN0Ln0KLVNpbmNlIHRyYWNlYmFja3MgY29udGFpbiBkZXRhaWxzIHRoYXQgYXJlIGxpa2VseSB0byBjaGFuZ2UgcmFwaWRseSAoZm9yCi1leGFtcGxlLCBleGFjdCBmaWxlIHBhdGhzIGFuZCBsaW5lIG51bWJlcnMpLCB0aGlzIGlzIG9uZSBjYXNlIHdoZXJlIGRvY3Rlc3QKLXdvcmtzIGhhcmQgdG8gYmUgZmxleGlibGUgaW4gd2hhdCBpdCBhY2NlcHRzLgotCi1TaW1wbGUgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IFsxLCAyLCAzXS5yZW1vdmUoNDIpCi1UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KLVZhbHVlRXJyb3I6IGxpc3QucmVtb3ZlKHgpOiB4IG5vdCBpbiBsaXN0Ci1cZW5ke3ZlcmJhdGltfQotCi1UaGF0IGRvY3Rlc3Qgc3VjY2VlZHMgaWYgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSBpcyByYWlzZWQsIHdpdGggdGhlCi1cc2FtcHtsaXN0LnJlbW92ZSh4KTogeCBub3QgaW4gbGlzdH0gZGV0YWlsIGFzIHNob3duLgotCi1UaGUgZXhwZWN0ZWQgb3V0cHV0IGZvciBhbiBleGNlcHRpb24gbXVzdCBzdGFydCB3aXRoIGEgdHJhY2ViYWNrCi1oZWFkZXIsIHdoaWNoIG1heSBiZSBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZyB0d28gbGluZXMsIGluZGVudGVkIHRoZQotc2FtZSBhcyB0aGUgZmlyc3QgbGluZSBvZiB0aGUgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotVHJhY2ViYWNrIChpbm5lcm1vc3QgbGFzdCk6Ci1cZW5ke3ZlcmJhdGltfQotCi1UaGUgdHJhY2ViYWNrIGhlYWRlciBpcyBmb2xsb3dlZCBieSBhbiBvcHRpb25hbCB0cmFjZWJhY2sgc3RhY2ssIHdob3NlCi1jb250ZW50cyBhcmUgaWdub3JlZCBieSBkb2N0ZXN0LiAgVGhlIHRyYWNlYmFjayBzdGFjayBpcyB0eXBpY2FsbHkKLW9taXR0ZWQsIG9yIGNvcGllZCB2ZXJiYXRpbSBmcm9tIGFuIGludGVyYWN0aXZlIHNlc3Npb24uCi0KLVRoZSB0cmFjZWJhY2sgc3RhY2sgaXMgZm9sbG93ZWQgYnkgdGhlIG1vc3QgaW50ZXJlc3RpbmcgcGFydDogIHRoZQotbGluZShzKSBjb250YWluaW5nIHRoZSBleGNlcHRpb24gdHlwZSBhbmQgZGV0YWlsLiAgVGhpcyBpcyB1c3VhbGx5IHRoZQotbGFzdCBsaW5lIG9mIGEgdHJhY2ViYWNrLCBidXQgY2FuIGV4dGVuZCBhY3Jvc3MgbXVsdGlwbGUgbGluZXMgaWYgdGhlCi1leGNlcHRpb24gaGFzIGEgbXVsdGktbGluZSBkZXRhaWw6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiByYWlzZSBWYWx1ZUVycm9yKCdtdWx0aVxuICAgIGxpbmVcbmRldGFpbCcpCi1UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KLVZhbHVlRXJyb3I6IG11bHRpCi0gICAgbGluZQotZGV0YWlsCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgbGFzdCB0aHJlZSBsaW5lcyAoc3RhcnRpbmcgd2l0aCBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9KSBhcmUKLWNvbXBhcmVkIGFnYWluc3QgdGhlIGV4Y2VwdGlvbidzIHR5cGUgYW5kIGRldGFpbCwgYW5kIHRoZSByZXN0IGFyZQotaWdub3JlZC4KLQotQmVzdCBwcmFjdGljZSBpcyB0byBvbWl0IHRoZSB0cmFjZWJhY2sgc3RhY2ssIHVubGVzcyBpdCBhZGRzCi1zaWduaWZpY2FudCBkb2N1bWVudGF0aW9uIHZhbHVlIHRvIHRoZSBleGFtcGxlLiAgU28gdGhlIGxhc3QgZXhhbXBsZQotaXMgcHJvYmFibHkgYmV0dGVyIGFzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gcmFpc2UgVmFsdWVFcnJvcignbXVsdGlcbiAgICBsaW5lXG5kZXRhaWwnKQotVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICAgIC4uLgotVmFsdWVFcnJvcjogbXVsdGkKLSAgICBsaW5lCi1kZXRhaWwKLVxlbmR7dmVyYmF0aW19Ci0KLU5vdGUgdGhhdCB0cmFjZWJhY2tzIGFyZSB0cmVhdGVkIHZlcnkgc3BlY2lhbGx5LiAgSW4gcGFydGljdWxhciwgaW4gdGhlCi1yZXdyaXR0ZW4gZXhhbXBsZSwgdGhlIHVzZSBvZiBcc2FtcHsuLi59IGlzIGluZGVwZW5kZW50IG9mIGRvY3Rlc3QncwotXGNvbnN0YW50e0VMTElQU0lTfSBvcHRpb24uICBUaGUgZWxsaXBzaXMgaW4gdGhhdCBleGFtcGxlIGNvdWxkIGJlIGxlZnQKLW91dCwgb3IgY291bGQganVzdCBhcyB3ZWxsIGJlIHRocmVlIChvciB0aHJlZSBodW5kcmVkKSBjb21tYXMgb3IgZGlnaXRzLAotb3IgYW4gaW5kZW50ZWQgdHJhbnNjcmlwdCBvZiBhIE1vbnR5IFB5dGhvbiBza2l0LgotCi1Tb21lIGRldGFpbHMgeW91IHNob3VsZCByZWFkIG9uY2UsIGJ1dCB3b24ndCBuZWVkIHRvIHJlbWVtYmVyOgotCi1cYmVnaW57aXRlbWl6ZX0KLQotXGl0ZW0gRG9jdGVzdCBjYW4ndCBndWVzcyB3aGV0aGVyIHlvdXIgZXhwZWN0ZWQgb3V0cHV0IGNhbWUgZnJvbSBhbgotICBleGNlcHRpb24gdHJhY2ViYWNrIG9yIGZyb20gb3JkaW5hcnkgcHJpbnRpbmcuICBTbywgZS5nLiwgYW4gZXhhbXBsZQotICB0aGF0IGV4cGVjdHMgXHNhbXB7VmFsdWVFcnJvcjogNDIgaXMgcHJpbWV9IHdpbGwgcGFzcyB3aGV0aGVyCi0gIFxleGNlcHRpb257VmFsdWVFcnJvcn0gaXMgYWN0dWFsbHkgcmFpc2VkIG9yIGlmIHRoZSBleGFtcGxlIG1lcmVseQotICBwcmludHMgdGhhdCB0cmFjZWJhY2sgdGV4dC4gIEluIHByYWN0aWNlLCBvcmRpbmFyeSBvdXRwdXQgcmFyZWx5IGJlZ2lucwotICB3aXRoIGEgdHJhY2ViYWNrIGhlYWRlciBsaW5lLCBzbyB0aGlzIGRvZXNuJ3QgY3JlYXRlIHJlYWwgcHJvYmxlbXMuCi0KLVxpdGVtIEVhY2ggbGluZSBvZiB0aGUgdHJhY2ViYWNrIHN0YWNrIChpZiBwcmVzZW50KSBtdXN0IGJlIGluZGVudGVkCi0gIGZ1cnRoZXIgdGhhbiB0aGUgZmlyc3QgbGluZSBvZiB0aGUgZXhhbXBsZSwgXGVtcGh7b3J9IHN0YXJ0IHdpdGggYQotICBub24tYWxwaGFudW1lcmljIGNoYXJhY3Rlci4gIFRoZSBmaXJzdCBsaW5lIGZvbGxvd2luZyB0aGUgdHJhY2ViYWNrCi0gIGhlYWRlciBpbmRlbnRlZCB0aGUgc2FtZSBhbmQgc3RhcnRpbmcgd2l0aCBhbiBhbHBoYW51bWVyaWMgaXMgdGFrZW4KLSAgdG8gYmUgdGhlIHN0YXJ0IG9mIHRoZSBleGNlcHRpb24gZGV0YWlsLiAgT2YgY291cnNlIHRoaXMgZG9lcyB0aGUKLSAgcmlnaHQgdGhpbmcgZm9yIGdlbnVpbmUgdHJhY2ViYWNrcy4KLQotXGl0ZW0gV2hlbiB0aGUgXGNvbnN0YW50e0lHTk9SRV9FWENFUFRJT05fREVUQUlMfSBkb2N0ZXN0IG9wdGlvbiBpcwotICBpcyBzcGVjaWZpZWQsIGV2ZXJ5dGhpbmcgZm9sbG93aW5nIHRoZSBsZWZ0bW9zdCBjb2xvbiBpcyBpZ25vcmVkLgotCi1caXRlbSBUaGUgaW50ZXJhY3RpdmUgc2hlbGwgb21pdHMgdGhlIHRyYWNlYmFjayBoZWFkZXIgbGluZSBmb3Igc29tZQotICBcZXhjZXB0aW9ue1N5bnRheEVycm9yfXMuICBCdXQgZG9jdGVzdCB1c2VzIHRoZSB0cmFjZWJhY2sgaGVhZGVyCi0gIGxpbmUgdG8gZGlzdGluZ3Vpc2ggZXhjZXB0aW9ucyBmcm9tIG5vbi1leGNlcHRpb25zLiAgU28gaW4gdGhlIHJhcmUKLSAgY2FzZSB3aGVyZSB5b3UgbmVlZCB0byB0ZXN0IGEgXGV4Y2VwdGlvbntTeW50YXhFcnJvcn0gdGhhdCBvbWl0cyB0aGUKLSAgdHJhY2ViYWNrIGhlYWRlciwgeW91IHdpbGwgbmVlZCB0byBtYW51YWxseSBhZGQgdGhlIHRyYWNlYmFjayBoZWFkZXIKLSAgbGluZSB0byB5b3VyIHRlc3QgZXhhbXBsZS4KLQotXGl0ZW0gRm9yIHNvbWUgXGV4Y2VwdGlvbntTeW50YXhFcnJvcn1zLCBQeXRob24gZGlzcGxheXMgdGhlIGNoYXJhY3RlcgotICBwb3NpdGlvbiBvZiB0aGUgc3ludGF4IGVycm9yLCB1c2luZyBhIFxjb2Rle1xefSBtYXJrZXI6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiAxIDEKLSAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMQotICAgIDEgMQotICAgICAgXgotU3ludGF4RXJyb3I6IGludmFsaWQgc3ludGF4Ci1cZW5ke3ZlcmJhdGltfQotCi0gIFNpbmNlIHRoZSBsaW5lcyBzaG93aW5nIHRoZSBwb3NpdGlvbiBvZiB0aGUgZXJyb3IgY29tZSBiZWZvcmUgdGhlCi0gIGV4Y2VwdGlvbiB0eXBlIGFuZCBkZXRhaWwsIHRoZXkgYXJlIG5vdCBjaGVja2VkIGJ5IGRvY3Rlc3QuICBGb3IKLSAgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyB0ZXN0IHdvdWxkIHBhc3MsIGV2ZW4gdGhvdWdoIGl0IHB1dHMgdGhlCi0gIFxjb2Rle1xefSBtYXJrZXIgaW4gdGhlIHdyb25nIGxvY2F0aW9uOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gMSAxCi1UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEKLSAgICAxIDEKLSAgICBeCi1TeW50YXhFcnJvcjogaW52YWxpZCBzeW50YXgKLVxlbmR7dmVyYmF0aW19Ci0KLVxlbmR7aXRlbWl6ZX0KLQotXHZlcnNpb25jaGFuZ2VkW1RoZSBhYmlsaXR5IHRvIGhhbmRsZSBhIG11bHRpLWxpbmUgZXhjZXB0aW9uIGRldGFpbCwKLSAgICAgICAgICAgICAgICBhbmQgdGhlIFxjb25zdGFudHtJR05PUkVfRVhDRVBUSU9OX0RFVEFJTH0gZG9jdGVzdCBvcHRpb24sCi0gICAgICAgICAgICAgICAgd2VyZSBhZGRlZF17Mi40fQotCi1cc3Vic3Vic2VjdGlvbntPcHRpb24gRmxhZ3MgYW5kIERpcmVjdGl2ZXNcbGFiZWx7ZG9jdGVzdC1vcHRpb25zfX0KLQotQSBudW1iZXIgb2Ygb3B0aW9uIGZsYWdzIGNvbnRyb2wgdmFyaW91cyBhc3BlY3RzIG9mIGRvY3Rlc3QncwotYmVoYXZpb3IuICBTeW1ib2xpYyBuYW1lcyBmb3IgdGhlIGZsYWdzIGFyZSBzdXBwbGllZCBhcyBtb2R1bGUgY29uc3RhbnRzLAotd2hpY2ggY2FuIGJlIG9yJ2VkIHRvZ2V0aGVyIGFuZCBwYXNzZWQgdG8gdmFyaW91cyBmdW5jdGlvbnMuICBUaGUgbmFtZXMKLWNhbiBhbHNvIGJlIHVzZWQgaW4gZG9jdGVzdCBkaXJlY3RpdmVzIChzZWUgYmVsb3cpLgotCi1UaGUgZmlyc3QgZ3JvdXAgb2Ygb3B0aW9ucyBkZWZpbmUgdGVzdCBzZW1hbnRpY3MsIGNvbnRyb2xsaW5nCi1hc3BlY3RzIG9mIGhvdyBkb2N0ZXN0IGRlY2lkZXMgd2hldGhlciBhY3R1YWwgb3V0cHV0IG1hdGNoZXMgYW4KLWV4YW1wbGUncyBleHBlY3RlZCBvdXRwdXQ6Ci0KLVxiZWdpbntkYXRhZGVzY317RE9OVF9BQ0NFUFRfVFJVRV9GT1JfMX0KLSAgICBCeSBkZWZhdWx0LCBpZiBhbiBleHBlY3RlZCBvdXRwdXQgYmxvY2sgY29udGFpbnMganVzdCBcY29kZXsxfSwKLSAgICBhbiBhY3R1YWwgb3V0cHV0IGJsb2NrIGNvbnRhaW5pbmcganVzdCBcY29kZXsxfSBvciBqdXN0Ci0gICAgXGNvZGV7VHJ1ZX0gaXMgY29uc2lkZXJlZCB0byBiZSBhIG1hdGNoLCBhbmQgc2ltaWxhcmx5IGZvciBcY29kZXswfQotICAgIHZlcnN1cyBcY29kZXtGYWxzZX0uICBXaGVuIFxjb25zdGFudHtET05UX0FDQ0VQVF9UUlVFX0ZPUl8xfSBpcwotICAgIHNwZWNpZmllZCwgbmVpdGhlciBzdWJzdGl0dXRpb24gaXMgYWxsb3dlZC4gIFRoZSBkZWZhdWx0IGJlaGF2aW9yCi0gICAgY2F0ZXJzIHRvIHRoYXQgUHl0aG9uIGNoYW5nZWQgdGhlIHJldHVybiB0eXBlIG9mIG1hbnkgZnVuY3Rpb25zCi0gICAgZnJvbSBpbnRlZ2VyIHRvIGJvb2xlYW47IGRvY3Rlc3RzIGV4cGVjdGluZyAibGl0dGxlIGludGVnZXIiCi0gICAgb3V0cHV0IHN0aWxsIHdvcmsgaW4gdGhlc2UgY2FzZXMuICBUaGlzIG9wdGlvbiB3aWxsIHByb2JhYmx5IGdvCi0gICAgYXdheSwgYnV0IG5vdCBmb3Igc2V2ZXJhbCB5ZWFycy4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317RE9OVF9BQ0NFUFRfQkxBTktMSU5FfQotICAgIEJ5IGRlZmF1bHQsIGlmIGFuIGV4cGVjdGVkIG91dHB1dCBibG9jayBjb250YWlucyBhIGxpbmUKLSAgICBjb250YWluaW5nIG9ubHkgdGhlIHN0cmluZyBcY29kZXs8QkxBTktMSU5FPn0sIHRoZW4gdGhhdCBsaW5lCi0gICAgd2lsbCBtYXRjaCBhIGJsYW5rIGxpbmUgaW4gdGhlIGFjdHVhbCBvdXRwdXQuICBCZWNhdXNlIGEKLSAgICBnZW51aW5lbHkgYmxhbmsgbGluZSBkZWxpbWl0cyB0aGUgZXhwZWN0ZWQgb3V0cHV0LCB0aGlzIGlzCi0gICAgdGhlIG9ubHkgd2F5IHRvIGNvbW11bmljYXRlIHRoYXQgYSBibGFuayBsaW5lIGlzIGV4cGVjdGVkLiAgV2hlbgotICAgIFxjb25zdGFudHtET05UX0FDQ0VQVF9CTEFOS0xJTkV9IGlzIHNwZWNpZmllZCwgdGhpcyBzdWJzdGl0dXRpb24KLSAgICBpcyBub3QgYWxsb3dlZC4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317Tk9STUFMSVpFX1dISVRFU1BBQ0V9Ci0gICAgV2hlbiBzcGVjaWZpZWQsIGFsbCBzZXF1ZW5jZXMgb2Ygd2hpdGVzcGFjZSAoYmxhbmtzIGFuZCBuZXdsaW5lcykgYXJlCi0gICAgdHJlYXRlZCBhcyBlcXVhbC4gIEFueSBzZXF1ZW5jZSBvZiB3aGl0ZXNwYWNlIHdpdGhpbiB0aGUgZXhwZWN0ZWQKLSAgICBvdXRwdXQgd2lsbCBtYXRjaCBhbnkgc2VxdWVuY2Ugb2Ygd2hpdGVzcGFjZSB3aXRoaW4gdGhlIGFjdHVhbCBvdXRwdXQuCi0gICAgQnkgZGVmYXVsdCwgd2hpdGVzcGFjZSBtdXN0IG1hdGNoIGV4YWN0bHkuCi0gICAgXGNvbnN0YW50e05PUk1BTElaRV9XSElURVNQQUNFfSBpcyBlc3BlY2lhbGx5IHVzZWZ1bCB3aGVuIGEgbGluZQotICAgIG9mIGV4cGVjdGVkIG91dHB1dCBpcyB2ZXJ5IGxvbmcsIGFuZCB5b3Ugd2FudCB0byB3cmFwIGl0IGFjcm9zcwotICAgIG11bHRpcGxlIGxpbmVzIGluIHlvdXIgc291cmNlLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtFTExJUFNJU30KLSAgICBXaGVuIHNwZWNpZmllZCwgYW4gZWxsaXBzaXMgbWFya2VyIChcY29kZXsuLi59KSBpbiB0aGUgZXhwZWN0ZWQgb3V0cHV0Ci0gICAgY2FuIG1hdGNoIGFueSBzdWJzdHJpbmcgaW4gdGhlIGFjdHVhbCBvdXRwdXQuICBUaGlzIGluY2x1ZGVzCi0gICAgc3Vic3RyaW5ncyB0aGF0IHNwYW4gbGluZSBib3VuZGFyaWVzLCBhbmQgZW1wdHkgc3Vic3RyaW5ncywgc28gaXQncwotICAgIGJlc3QgdG8ga2VlcCB1c2FnZSBvZiB0aGlzIHNpbXBsZS4gIENvbXBsaWNhdGVkIHVzZXMgY2FuIGxlYWQgdG8gdGhlCi0gICAgc2FtZSBraW5kcyBvZiAib29wcywgaXQgbWF0Y2hlZCB0b28gbXVjaCEiIHN1cnByaXNlcyB0aGF0IFxyZWdleHB7Lip9Ci0gICAgaXMgcHJvbmUgdG8gaW4gcmVndWxhciBleHByZXNzaW9ucy4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317SUdOT1JFX0VYQ0VQVElPTl9ERVRBSUx9Ci0gICAgV2hlbiBzcGVjaWZpZWQsIGFuIGV4YW1wbGUgdGhhdCBleHBlY3RzIGFuIGV4Y2VwdGlvbiBwYXNzZXMgaWYKLSAgICBhbiBleGNlcHRpb24gb2YgdGhlIGV4cGVjdGVkIHR5cGUgaXMgcmFpc2VkLCBldmVuIGlmIHRoZSBleGNlcHRpb24KLSAgICBkZXRhaWwgZG9lcyBub3QgbWF0Y2guICBGb3IgZXhhbXBsZSwgYW4gZXhhbXBsZSBleHBlY3RpbmcKLSAgICBcc2FtcHtWYWx1ZUVycm9yOiA0Mn0gd2lsbCBwYXNzIGlmIHRoZSBhY3R1YWwgZXhjZXB0aW9uIHJhaXNlZCBpcwotICAgIFxzYW1we1ZhbHVlRXJyb3I6IDMqMTR9LCBidXQgd2lsbCBmYWlsLCBlLmcuLCBpZgotICAgIFxleGNlcHRpb257VHlwZUVycm9yfSBpcyByYWlzZWQuCi0KLSAgICBOb3RlIHRoYXQgYSBzaW1pbGFyIGVmZmVjdCBjYW4gYmUgb2J0YWluZWQgdXNpbmcgXGNvbnN0YW50e0VMTElQU0lTfSwKLSAgICBhbmQgXGNvbnN0YW50e0lHTk9SRV9FWENFUFRJT05fREVUQUlMfSBtYXkgZ28gYXdheSB3aGVuIFB5dGhvbiByZWxlYXNlcwotICAgIHByaW9yIHRvIDIuNCBiZWNvbWUgdW5pbnRlcmVzdGluZy4gIFVudGlsIHRoZW4sCi0gICAgXGNvbnN0YW50e0lHTk9SRV9FWENFUFRJT05fREVUQUlMfSBpcyB0aGUgb25seSBjbGVhciB3YXkgdG8gd3JpdGUgYQotICAgIGRvY3Rlc3QgdGhhdCBkb2Vzbid0IGNhcmUgYWJvdXQgdGhlIGV4Y2VwdGlvbiBkZXRhaWwgeWV0IGNvbnRpbnVlcwotICAgIHRvIHBhc3MgdW5kZXIgUHl0aG9uIHJlbGVhc2VzIHByaW9yIHRvIDIuNCAoZG9jdGVzdCBkaXJlY3RpdmVzCi0gICAgYXBwZWFyIHRvIGJlIGNvbW1lbnRzIHRvIHRoZW0pLiAgRm9yIGV4YW1wbGUsCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiAoMSwgMilbM10gPSAnbW9vJyAjZG9jdGVzdDogK0lHTk9SRV9FWENFUFRJT05fREVUQUlMCi1UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KLVR5cGVFcnJvcjogb2JqZWN0IGRvZXNuJ3Qgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnQKLVxlbmR7dmVyYmF0aW19Ci0KLSAgICBwYXNzZXMgdW5kZXIgUHl0aG9uIDIuNCBhbmQgUHl0aG9uIDIuMy4gIFRoZSBkZXRhaWwgY2hhbmdlZCBpbiAyLjQsCi0gICAgdG8gc2F5ICJkb2VzIG5vdCIgaW5zdGVhZCBvZiAiZG9lc24ndCIuCi0KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317U0tJUH0KLQotICAgIFdoZW4gc3BlY2lmaWVkLCBkbyBub3QgcnVuIHRoZSBleGFtcGxlIGF0IGFsbC4gIFRoaXMgY2FuIGJlIHVzZWZ1bAotICAgIGluIGNvbnRleHRzIHdoZXJlIGRvY3Rlc3QgZXhhbXBsZXMgc2VydmUgYXMgYm90aCBkb2N1bWVudGF0aW9uIGFuZAotICAgIHRlc3QgY2FzZXMsIGFuZCBhbiBleGFtcGxlIHNob3VsZCBiZSBpbmNsdWRlZCBmb3IgZG9jdW1lbnRhdGlvbgotICAgIHB1cnBvc2VzLCBidXQgc2hvdWxkIG5vdCBiZSBjaGVja2VkLiAgRS5nLiwgdGhlIGV4YW1wbGUncyBvdXRwdXQKLSAgICBtaWdodCBiZSByYW5kb207IG9yIHRoZSBleGFtcGxlIG1pZ2h0IGRlcGVuZCBvbiByZXNvdXJjZXMgd2hpY2gKLSAgICB3b3VsZCBiZSB1bmF2YWlsYWJsZSB0byB0aGUgdGVzdCBkcml2ZXIuCi0KLSAgICBUaGUgU0tJUCBmbGFnIGNhbiBhbHNvIGJlIHVzZWQgZm9yIHRlbXBvcmFyaWx5ICJjb21tZW50aW5nIG91dCIKLSAgICBleGFtcGxlcy4KLQotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtDT01QQVJJU09OX0ZMQUdTfQotICAgIEEgYml0bWFzayBvcidpbmcgdG9nZXRoZXIgYWxsIHRoZSBjb21wYXJpc29uIGZsYWdzIGFib3ZlLgotXGVuZHtkYXRhZGVzY30KLQotVGhlIHNlY29uZCBncm91cCBvZiBvcHRpb25zIGNvbnRyb2xzIGhvdyB0ZXN0IGZhaWx1cmVzIGFyZSByZXBvcnRlZDoKLQotXGJlZ2lue2RhdGFkZXNjfXtSRVBPUlRfVURJRkZ9Ci0gICAgV2hlbiBzcGVjaWZpZWQsIGZhaWx1cmVzIHRoYXQgaW52b2x2ZSBtdWx0aS1saW5lIGV4cGVjdGVkIGFuZAotICAgIGFjdHVhbCBvdXRwdXRzIGFyZSBkaXNwbGF5ZWQgdXNpbmcgYSB1bmlmaWVkIGRpZmYuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1JFUE9SVF9DRElGRn0KLSAgICBXaGVuIHNwZWNpZmllZCwgZmFpbHVyZXMgdGhhdCBpbnZvbHZlIG11bHRpLWxpbmUgZXhwZWN0ZWQgYW5kCi0gICAgYWN0dWFsIG91dHB1dHMgd2lsbCBiZSBkaXNwbGF5ZWQgdXNpbmcgYSBjb250ZXh0IGRpZmYuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1JFUE9SVF9ORElGRn0KLSAgICBXaGVuIHNwZWNpZmllZCwgZGlmZmVyZW5jZXMgYXJlIGNvbXB1dGVkIGJ5IFxjb2Rle2RpZmZsaWIuRGlmZmVyfSwKLSAgICB1c2luZyB0aGUgc2FtZSBhbGdvcml0aG0gYXMgdGhlIHBvcHVsYXIgXGZpbGV7bmRpZmYucHl9IHV0aWxpdHkuCi0gICAgVGhpcyBpcyB0aGUgb25seSBtZXRob2QgdGhhdCBtYXJrcyBkaWZmZXJlbmNlcyB3aXRoaW4gbGluZXMgYXMKLSAgICB3ZWxsIGFzIGFjcm9zcyBsaW5lcy4gIEZvciBleGFtcGxlLCBpZiBhIGxpbmUgb2YgZXhwZWN0ZWQgb3V0cHV0Ci0gICAgY29udGFpbnMgZGlnaXQgXGNvZGV7MX0gd2hlcmUgYWN0dWFsIG91dHB1dCBjb250YWlucyBsZXR0ZXIgXGNvZGV7bH0sCi0gICAgYSBsaW5lIGlzIGluc2VydGVkIHdpdGggYSBjYXJldCBtYXJraW5nIHRoZSBtaXNtYXRjaGluZyBjb2x1bW4KLSAgICBwb3NpdGlvbnMuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1JFUE9SVF9PTkxZX0ZJUlNUX0ZBSUxVUkV9Ci0gIFdoZW4gc3BlY2lmaWVkLCBkaXNwbGF5IHRoZSBmaXJzdCBmYWlsaW5nIGV4YW1wbGUgaW4gZWFjaCBkb2N0ZXN0LAotICBidXQgc3VwcHJlc3Mgb3V0cHV0IGZvciBhbGwgcmVtYWluaW5nIGV4YW1wbGVzLiAgVGhpcyB3aWxsIHByZXZlbnQKLSAgZG9jdGVzdCBmcm9tIHJlcG9ydGluZyBjb3JyZWN0IGV4YW1wbGVzIHRoYXQgYnJlYWsgYmVjYXVzZSBvZgotICBlYXJsaWVyIGZhaWx1cmVzOyBidXQgaXQgbWlnaHQgYWxzbyBoaWRlIGluY29ycmVjdCBleGFtcGxlcyB0aGF0Ci0gIGZhaWwgaW5kZXBlbmRlbnRseSBvZiB0aGUgZmlyc3QgZmFpbHVyZS4gIFdoZW4KLSAgXGNvbnN0YW50e1JFUE9SVF9PTkxZX0ZJUlNUX0ZBSUxVUkV9IGlzIHNwZWNpZmllZCwgdGhlIHJlbWFpbmluZwotICBleGFtcGxlcyBhcmUgc3RpbGwgcnVuLCBhbmQgc3RpbGwgY291bnQgdG93YXJkcyB0aGUgdG90YWwgbnVtYmVyIG9mCi0gIGZhaWx1cmVzIHJlcG9ydGVkOyBvbmx5IHRoZSBvdXRwdXQgaXMgc3VwcHJlc3NlZC4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317UkVQT1JUSU5HX0ZMQUdTfQotICAgIEEgYml0bWFzayBvcidpbmcgdG9nZXRoZXIgYWxsIHRoZSByZXBvcnRpbmcgZmxhZ3MgYWJvdmUuCi1cZW5ke2RhdGFkZXNjfQotCi0iRG9jdGVzdCBkaXJlY3RpdmVzIiBtYXkgYmUgdXNlZCB0byBtb2RpZnkgdGhlIG9wdGlvbiBmbGFncyBmb3IKLWluZGl2aWR1YWwgZXhhbXBsZXMuICBEb2N0ZXN0IGRpcmVjdGl2ZXMgYXJlIGV4cHJlc3NlZCBhcyBhIHNwZWNpYWwKLVB5dGhvbiBjb21tZW50IGZvbGxvd2luZyBhbiBleGFtcGxlJ3Mgc291cmNlIGNvZGU6Ci0KLVxiZWdpbntwcm9kdWN0aW9ubGlzdH1bZG9jdGVzdF0KLSAgICBccHJvZHVjdGlvbntkaXJlY3RpdmV9Ci0gICAgICAgICAgICAgICB7IlwjIiAiZG9jdGVzdDoiIFx0b2tlbntkaXJlY3RpdmVfb3B0aW9uc319Ci0gICAgXHByb2R1Y3Rpb257ZGlyZWN0aXZlX29wdGlvbnN9Ci0gICAgICAgICAgICAgICB7XHRva2Vue2RpcmVjdGl2ZV9vcHRpb259ICgiLCIgXHRva2Vue2RpcmVjdGl2ZV9vcHRpb259KSp9Ci0gICAgXHByb2R1Y3Rpb257ZGlyZWN0aXZlX29wdGlvbn0KLSAgICAgICAgICAgICAgIHtcdG9rZW57b25fb3Jfb2ZmfSBcdG9rZW57ZGlyZWN0aXZlX29wdGlvbl9uYW1lfX0KLSAgICBccHJvZHVjdGlvbntvbl9vcl9vZmZ9Ci0gICAgICAgICAgICAgICB7IisiIHwgIi0ifQotICAgIFxwcm9kdWN0aW9ue2RpcmVjdGl2ZV9vcHRpb25fbmFtZX0KLSAgICAgICAgICAgICAgIHsiRE9OVF9BQ0NFUFRfQkxBTktMSU5FIiB8ICJOT1JNQUxJWkVfV0hJVEVTUEFDRSIgfCAuLi59Ci1cZW5ke3Byb2R1Y3Rpb25saXN0fQotCi1XaGl0ZXNwYWNlIGlzIG5vdCBhbGxvd2VkIGJldHdlZW4gdGhlIFxjb2Rleyt9IG9yIFxjb2Rley19IGFuZCB0aGUKLWRpcmVjdGl2ZSBvcHRpb24gbmFtZS4gIFRoZSBkaXJlY3RpdmUgb3B0aW9uIG5hbWUgY2FuIGJlIGFueSBvZiB0aGUKLW9wdGlvbiBmbGFnIG5hbWVzIGV4cGxhaW5lZCBhYm92ZS4KLQotQW4gZXhhbXBsZSdzIGRvY3Rlc3QgZGlyZWN0aXZlcyBtb2RpZnkgZG9jdGVzdCdzIGJlaGF2aW9yIGZvciB0aGF0Ci1zaW5nbGUgZXhhbXBsZS4gIFVzZSBcY29kZXsrfSB0byBlbmFibGUgdGhlIG5hbWVkIGJlaGF2aW9yLCBvcgotXGNvZGV7LX0gdG8gZGlzYWJsZSBpdC4KLQotRm9yIGV4YW1wbGUsIHRoaXMgdGVzdCBwYXNzZXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBwcmludCByYW5nZSgyMCkgI2RvY3Rlc3Q6ICtOT1JNQUxJWkVfV0hJVEVTUEFDRQotWzAsICAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LAotMTAsICAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5XQotXGVuZHt2ZXJiYXRpbX0KLQotV2l0aG91dCB0aGUgZGlyZWN0aXZlIGl0IHdvdWxkIGZhaWwsIGJvdGggYmVjYXVzZSB0aGUgYWN0dWFsIG91dHB1dAotZG9lc24ndCBoYXZlIHR3byBibGFua3MgYmVmb3JlIHRoZSBzaW5nbGUtZGlnaXQgbGlzdCBlbGVtZW50cywgYW5kCi1iZWNhdXNlIHRoZSBhY3R1YWwgb3V0cHV0IGlzIG9uIGEgc2luZ2xlIGxpbmUuICBUaGlzIHRlc3QgYWxzbyBwYXNzZXMsCi1hbmQgYWxzbyByZXF1aXJlcyBhIGRpcmVjdGl2ZSB0byBkbyBzbzoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHByaW50IHJhbmdlKDIwKSAjIGRvY3Rlc3Q6K0VMTElQU0lTCi1bMCwgMSwgLi4uLCAxOCwgMTldCi1cZW5ke3ZlcmJhdGltfQotCi1NdWx0aXBsZSBkaXJlY3RpdmVzIGNhbiBiZSB1c2VkIG9uIGEgc2luZ2xlIHBoeXNpY2FsIGxpbmUsIHNlcGFyYXRlZAotYnkgY29tbWFzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gcHJpbnQgcmFuZ2UoMjApICMgZG9jdGVzdDogK0VMTElQU0lTLCArTk9STUFMSVpFX1dISVRFU1BBQ0UKLVswLCAgICAxLCAuLi4sICAgMTgsICAgIDE5XQotXGVuZHt2ZXJiYXRpbX0KLQotSWYgbXVsdGlwbGUgZGlyZWN0aXZlIGNvbW1lbnRzIGFyZSB1c2VkIGZvciBhIHNpbmdsZSBleGFtcGxlLCB0aGVuCi10aGV5IGFyZSBjb21iaW5lZDoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHByaW50IHJhbmdlKDIwKSAjIGRvY3Rlc3Q6ICtFTExJUFNJUwotLi4uICAgICAgICAgICAgICAgICAjIGRvY3Rlc3Q6ICtOT1JNQUxJWkVfV0hJVEVTUEFDRQotWzAsICAgIDEsIC4uLiwgICAxOCwgICAgMTldCi1cZW5ke3ZlcmJhdGltfQotCi1BcyB0aGUgcHJldmlvdXMgZXhhbXBsZSBzaG93cywgeW91IGNhbiBhZGQgXHNhbXB7Li4ufSBsaW5lcyB0byB5b3VyCi1leGFtcGxlIGNvbnRhaW5pbmcgb25seSBkaXJlY3RpdmVzLiAgVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gYW4KLWV4YW1wbGUgaXMgdG9vIGxvbmcgZm9yIGEgZGlyZWN0aXZlIHRvIGNvbWZvcnRhYmx5IGZpdCBvbiB0aGUgc2FtZQotbGluZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHByaW50IHJhbmdlKDUpICsgcmFuZ2UoMTAsMjApICsgcmFuZ2UoMzAsNDApICsgcmFuZ2UoNTAsNjApCi0uLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKLVswLCAuLi4sIDQsIDEwLCAuLi4sIDE5LCAzMCwgLi4uLCAzOSwgNTAsIC4uLiwgNTldCi1cZW5ke3ZlcmJhdGltfQotCi1Ob3RlIHRoYXQgc2luY2UgYWxsIG9wdGlvbnMgYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGFuZCBkaXJlY3RpdmVzIGFwcGx5Ci1vbmx5IHRvIHRoZSBleGFtcGxlIHRoZXkgYXBwZWFyIGluLCBlbmFibGluZyBvcHRpb25zICh2aWEgXGNvZGV7K30gaW4gYQotZGlyZWN0aXZlKSBpcyB1c3VhbGx5IHRoZSBvbmx5IG1lYW5pbmdmdWwgY2hvaWNlLiAgSG93ZXZlciwgb3B0aW9uIGZsYWdzCi1jYW4gYWxzbyBiZSBwYXNzZWQgdG8gZnVuY3Rpb25zIHRoYXQgcnVuIGRvY3Rlc3RzLCBlc3RhYmxpc2hpbmcgZGlmZmVyZW50Ci1kZWZhdWx0cy4gIEluIHN1Y2ggY2FzZXMsIGRpc2FibGluZyBhbiBvcHRpb24gdmlhIFxjb2Rley19IGluIGEgZGlyZWN0aXZlCi1jYW4gYmUgdXNlZnVsLgotCi1cdmVyc2lvbmNoYW5nZWRbQ29uc3RhbnRzIFxjb25zdGFudHtET05UX0FDQ0VQVF9CTEFOS0xJTkV9LAotICAgIFxjb25zdGFudHtOT1JNQUxJWkVfV0hJVEVTUEFDRX0sIFxjb25zdGFudHtFTExJUFNJU30sCi0gICAgXGNvbnN0YW50e0lHTk9SRV9FWENFUFRJT05fREVUQUlMfSwKLSAgICBcY29uc3RhbnR7UkVQT1JUX1VESUZGfSwgXGNvbnN0YW50e1JFUE9SVF9DRElGRn0sCi0gICAgXGNvbnN0YW50e1JFUE9SVF9ORElGRn0sIFxjb25zdGFudHtSRVBPUlRfT05MWV9GSVJTVF9GQUlMVVJFfSwKLSAgICBcY29uc3RhbnR7Q09NUEFSSVNPTl9GTEFHU30gYW5kIFxjb25zdGFudHtSRVBPUlRJTkdfRkxBR1N9Ci0gICAgd2VyZSBhZGRlZDsgYnkgZGVmYXVsdCBcY29kZXs8QkxBTktMSU5FPn0gaW4gZXhwZWN0ZWQgb3V0cHV0Ci0gICAgbWF0Y2hlcyBhbiBlbXB0eSBsaW5lIGluIGFjdHVhbCBvdXRwdXQ7IGFuZCBkb2N0ZXN0IGRpcmVjdGl2ZXMKLSAgICB3ZXJlIGFkZGVkXXsyLjR9Ci1cdmVyc2lvbmNoYW5nZWRbQ29uc3RhbnQgXGNvbnN0YW50e1NLSVB9IHdhcyBhZGRlZF17Mi41fQotCi1UaGVyZSdzIGFsc28gYSB3YXkgdG8gcmVnaXN0ZXIgbmV3IG9wdGlvbiBmbGFnIG5hbWVzLCBhbHRob3VnaCB0aGlzCi1pc24ndCB1c2VmdWwgdW5sZXNzIHlvdSBpbnRlbmQgdG8gZXh0ZW5kIFxyZWZtb2R1bGV7ZG9jdGVzdH0gaW50ZXJuYWxzCi12aWEgc3ViY2xhc3Npbmc6Ci0KLVxiZWdpbntmdW5jZGVzY317cmVnaXN0ZXJfb3B0aW9uZmxhZ317bmFtZX0KLSAgQ3JlYXRlIGEgbmV3IG9wdGlvbiBmbGFnIHdpdGggYSBnaXZlbiBuYW1lLCBhbmQgcmV0dXJuIHRoZSBuZXcKLSAgZmxhZydzIGludGVnZXIgdmFsdWUuICBcZnVuY3Rpb257cmVnaXN0ZXJfb3B0aW9uZmxhZygpfSBjYW4gYmUKLSAgdXNlZCB3aGVuIHN1YmNsYXNzaW5nIFxjbGFzc3tPdXRwdXRDaGVja2VyfSBvcgotICBcY2xhc3N7RG9jVGVzdFJ1bm5lcn0gdG8gY3JlYXRlIG5ldyBvcHRpb25zIHRoYXQgYXJlIHN1cHBvcnRlZCBieQotICB5b3VyIHN1YmNsYXNzZXMuICBcZnVuY3Rpb257cmVnaXN0ZXJfb3B0aW9uZmxhZ30gc2hvdWxkIGFsd2F5cyBiZQotICBjYWxsZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBpZGlvbToKLQotXGJlZ2lue3ZlcmJhdGltfQotICBNWV9GTEFHID0gcmVnaXN0ZXJfb3B0aW9uZmxhZygnTVlfRkxBRycpCi1cZW5ke3ZlcmJhdGltfQotCi0gIFx2ZXJzaW9uYWRkZWR7Mi40fQotXGVuZHtmdW5jZGVzY30KLQotXHN1YnN1YnNlY3Rpb257V2FybmluZ3NcbGFiZWx7ZG9jdGVzdC13YXJuaW5nc319Ci0KLVxyZWZtb2R1bGV7ZG9jdGVzdH0gaXMgc2VyaW91cyBhYm91dCByZXF1aXJpbmcgZXhhY3QgbWF0Y2hlcyBpbiBleHBlY3RlZAotb3V0cHV0LiAgSWYgZXZlbiBhIHNpbmdsZSBjaGFyYWN0ZXIgZG9lc24ndCBtYXRjaCwgdGhlIHRlc3QgZmFpbHMuICBUaGlzCi13aWxsIHByb2JhYmx5IHN1cnByaXNlIHlvdSBhIGZldyB0aW1lcywgYXMgeW91IGxlYXJuIGV4YWN0bHkgd2hhdCBQeXRob24KLWRvZXMgYW5kIGRvZXNuJ3QgZ3VhcmFudGVlIGFib3V0IG91dHB1dC4gIEZvciBleGFtcGxlLCB3aGVuIHByaW50aW5nIGEKLWRpY3QsIFB5dGhvbiBkb2Vzbid0IGd1YXJhbnRlZSB0aGF0IHRoZSBrZXktdmFsdWUgcGFpcnMgd2lsbCBiZSBwcmludGVkCi1pbiBhbnkgcGFydGljdWxhciBvcmRlciwgc28gYSB0ZXN0IGxpa2UKLQotJSBIZXkhIFdoYXQgaGFwcGVuZWQgdG8gTW9udHkgUHl0aG9uIGV4YW1wbGVzPwotJSBUaW06IGFzayBHdWlkbyAtLSBpdCdzIGhpcyBleGFtcGxlIQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGZvbygpCi17Ikhlcm1pb25lIjogImhpcHBvZ3J5cGgiLCAiSGFycnkiOiAiYnJvb21zdGljayJ9Ci1cZW5ke3ZlcmJhdGltfQotCi1pcyB2dWxuZXJhYmxlISAgT25lIHdvcmthcm91bmQgaXMgdG8gZG8KLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGZvbygpID09IHsiSGVybWlvbmUiOiAiaGlwcG9ncnlwaCIsICJIYXJyeSI6ICJicm9vbXN0aWNrIn0KLVRydWUKLVxlbmR7dmVyYmF0aW19Ci0KLWluc3RlYWQuICBBbm90aGVyIGlzIHRvIGRvCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBkID0gZm9vKCkuaXRlbXMoKQotPj4+IGQuc29ydCgpCi0+Pj4gZAotWygnSGFycnknLCAnYnJvb21zdGljaycpLCAoJ0hlcm1pb25lJywgJ2hpcHBvZ3J5cGgnKV0KLVxlbmR7dmVyYmF0aW19Ci0KLVRoZXJlIGFyZSBvdGhlcnMsIGJ1dCB5b3UgZ2V0IHRoZSBpZGVhLgotCi1Bbm90aGVyIGJhZCBpZGVhIGlzIHRvIHByaW50IHRoaW5ncyB0aGF0IGVtYmVkIGFuIG9iamVjdCBhZGRyZXNzLCBsaWtlCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpZCgxLjApICMgY2VydGFpbiB0byBmYWlsIHNvbWUgb2YgdGhlIHRpbWUKLTc5NDg2NDgKLT4+PiBjbGFzcyBDOiBwYXNzCi0+Pj4gQygpICAgIyB0aGUgZGVmYXVsdCByZXByKCkgZm9yIGluc3RhbmNlcyBlbWJlZHMgYW4gYWRkcmVzcwotPF9fbWFpbl9fLkMgaW5zdGFuY2UgYXQgMHgwMEFDMThGMD4KLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBcY29uc3RhbnR7RUxMSVBTSVN9IGRpcmVjdGl2ZSBnaXZlcyBhIG5pY2UgYXBwcm9hY2ggZm9yIHRoZSBsYXN0Ci1leGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gQygpICNkb2N0ZXN0OiArRUxMSVBTSVMKLTxfX21haW5fXy5DIGluc3RhbmNlIGF0IDB4Li4uPgotXGVuZHt2ZXJiYXRpbX0KLQotRmxvYXRpbmctcG9pbnQgbnVtYmVycyBhcmUgYWxzbyBzdWJqZWN0IHRvIHNtYWxsIG91dHB1dCB2YXJpYXRpb25zIGFjcm9zcwotcGxhdGZvcm1zLCBiZWNhdXNlIFB5dGhvbiBkZWZlcnMgdG8gdGhlIHBsYXRmb3JtIEMgbGlicmFyeSBmb3IgZmxvYXQKLWZvcm1hdHRpbmcsIGFuZCBDIGxpYnJhcmllcyB2YXJ5IHdpZGVseSBpbiBxdWFsaXR5IGhlcmUuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiAxLi83ICAjIHJpc2t5Ci0wLjE0Mjg1NzE0Mjg1NzE0Mjg1Ci0+Pj4gcHJpbnQgMS4vNyAjIHNhZmVyCi0wLjE0Mjg1NzE0Mjg1NwotPj4+IHByaW50IHJvdW5kKDEuLzcsIDYpICMgbXVjaCBzYWZlcgotMC4xNDI4NTcKLVxlbmR7dmVyYmF0aW19Ci0KLU51bWJlcnMgb2YgdGhlIGZvcm0gXGNvZGV7SS8yLioqSn0gYXJlIHNhZmUgYWNyb3NzIGFsbCBwbGF0Zm9ybXMsIGFuZCBJCi1vZnRlbiBjb250cml2ZSBkb2N0ZXN0IGV4YW1wbGVzIHRvIHByb2R1Y2UgbnVtYmVycyBvZiB0aGF0IGZvcm06Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiAzLi80ICAjIHV0dGVybHkgc2FmZQotMC43NQotXGVuZHt2ZXJiYXRpbX0KLQotU2ltcGxlIGZyYWN0aW9ucyBhcmUgYWxzbyBlYXNpZXIgZm9yIHBlb3BsZSB0byB1bmRlcnN0YW5kLCBhbmQgdGhhdCBtYWtlcwotZm9yIGJldHRlciBkb2N1bWVudGF0aW9uLgotCi1cc3Vic2VjdGlvbntCYXNpYyBBUElcbGFiZWx7ZG9jdGVzdC1iYXNpYy1hcGl9fQotCi1UaGUgZnVuY3Rpb25zIFxmdW5jdGlvbnt0ZXN0bW9kKCl9IGFuZCBcZnVuY3Rpb257dGVzdGZpbGUoKX0gcHJvdmlkZSBhCi1zaW1wbGUgaW50ZXJmYWNlIHRvIGRvY3Rlc3QgdGhhdCBzaG91bGQgYmUgc3VmZmljaWVudCBmb3IgbW9zdCBiYXNpYwotdXNlcy4gIEZvciBhIGxlc3MgZm9ybWFsIGludHJvZHVjdGlvbiB0byB0aGVzZSB0d28gZnVuY3Rpb25zLCBzZWUKLXNlY3Rpb25zIFxyZWZ7ZG9jdGVzdC1zaW1wbGUtdGVzdG1vZH0gYW5kCi1ccmVme2RvY3Rlc3Qtc2ltcGxlLXRlc3RmaWxlfS4KLQotXGJlZ2lue2Z1bmNkZXNjfXt0ZXN0ZmlsZX17ZmlsZW5hbWVcb3B0aW9uYWx7LCBtb2R1bGVfcmVsYXRpdmV9XG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZX1cb3B0aW9uYWx7LCBwYWNrYWdlfVxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JzfVxvcHRpb25hbHssIHZlcmJvc2V9XG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0fVxvcHRpb25hbHssIG9wdGlvbmZsYWdzfVxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhZ2xvYnN9XG9wdGlvbmFseywgcmFpc2Vfb25fZXJyb3J9XG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyfVxvcHRpb25hbHssIGVuY29kaW5nfX0KLQotICBBbGwgYXJndW1lbnRzIGV4Y2VwdCBcdmFye2ZpbGVuYW1lfSBhcmUgb3B0aW9uYWwsIGFuZCBzaG91bGQgYmUKLSAgc3BlY2lmaWVkIGluIGtleXdvcmQgZm9ybS4KLQotICBUZXN0IGV4YW1wbGVzIGluIHRoZSBmaWxlIG5hbWVkIFx2YXJ7ZmlsZW5hbWV9LiAgUmV0dXJuCi0gIFxzYW1weyhcdmFye2ZhaWx1cmVfY291bnR9LCBcdmFye3Rlc3RfY291bnR9KX0uCi0KLSAgT3B0aW9uYWwgYXJndW1lbnQgXHZhcnttb2R1bGVfcmVsYXRpdmV9IHNwZWNpZmllcyBob3cgdGhlIGZpbGVuYW1lCi0gIHNob3VsZCBiZSBpbnRlcnByZXRlZDoKLQotICBcYmVnaW57aXRlbWl6ZX0KLSAgXGl0ZW0gSWYgXHZhcnttb2R1bGVfcmVsYXRpdmV9IGlzIFxjb2Rle1RydWV9ICh0aGUgZGVmYXVsdCksIHRoZW4KLSAgICAgICAgXHZhcntmaWxlbmFtZX0gc3BlY2lmaWVzIGFuIE9TLWluZGVwZW5kZW50IG1vZHVsZS1yZWxhdGl2ZQotICAgICAgICBwYXRoLiAgQnkgZGVmYXVsdCwgdGhpcyBwYXRoIGlzIHJlbGF0aXZlIHRvIHRoZSBjYWxsaW5nCi0gICAgICAgIG1vZHVsZSdzIGRpcmVjdG9yeTsgYnV0IGlmIHRoZSBcdmFye3BhY2thZ2V9IGFyZ3VtZW50IGlzCi0gICAgICAgIHNwZWNpZmllZCwgdGhlbiBpdCBpcyByZWxhdGl2ZSB0byB0aGF0IHBhY2thZ2UuICBUbyBlbnN1cmUKLSAgICAgICAgT1MtaW5kZXBlbmRlbmNlLCBcdmFye2ZpbGVuYW1lfSBzaG91bGQgdXNlIFxjb2Rley99IGNoYXJhY3RlcnMKLSAgICAgICAgdG8gc2VwYXJhdGUgcGF0aCBzZWdtZW50cywgYW5kIG1heSBub3QgYmUgYW4gYWJzb2x1dGUgcGF0aAotICAgICAgICAoaS5lLiwgaXQgbWF5IG5vdCBiZWdpbiB3aXRoIFxjb2Rley99KS4KLSAgXGl0ZW0gSWYgXHZhcnttb2R1bGVfcmVsYXRpdmV9IGlzIFxjb2Rle0ZhbHNlfSwgdGhlbiBcdmFye2ZpbGVuYW1lfQotICAgICAgICBzcGVjaWZpZXMgYW4gT1Mtc3BlY2lmaWMgcGF0aC4gIFRoZSBwYXRoIG1heSBiZSBhYnNvbHV0ZSBvcgotICAgICAgICByZWxhdGl2ZTsgcmVsYXRpdmUgcGF0aHMgYXJlIHJlc29sdmVkIHdpdGggcmVzcGVjdCB0byB0aGUKLSAgICAgICAgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KLSAgXGVuZHtpdGVtaXplfQotCi0gIE9wdGlvbmFsIGFyZ3VtZW50IFx2YXJ7bmFtZX0gZ2l2ZXMgdGhlIG5hbWUgb2YgdGhlIHRlc3Q7IGJ5IGRlZmF1bHQsCi0gIG9yIGlmIFxjb2Rle05vbmV9LCBcY29kZXtvcy5wYXRoLmJhc2VuYW1lKFx2YXJ7ZmlsZW5hbWV9KX0gaXMgdXNlZC4KLQotICBPcHRpb25hbCBhcmd1bWVudCBcdmFye3BhY2thZ2V9IGlzIGEgUHl0aG9uIHBhY2thZ2Ugb3IgdGhlIG5hbWUgb2YgYQotICBQeXRob24gcGFja2FnZSB3aG9zZSBkaXJlY3Rvcnkgc2hvdWxkIGJlIHVzZWQgYXMgdGhlIGJhc2UgZGlyZWN0b3J5Ci0gIGZvciBhIG1vZHVsZS1yZWxhdGl2ZSBmaWxlbmFtZS4gIElmIG5vIHBhY2thZ2UgaXMgc3BlY2lmaWVkLCB0aGVuCi0gIHRoZSBjYWxsaW5nIG1vZHVsZSdzIGRpcmVjdG9yeSBpcyB1c2VkIGFzIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IKLSAgbW9kdWxlLXJlbGF0aXZlIGZpbGVuYW1lcy4gIEl0IGlzIGFuIGVycm9yIHRvIHNwZWNpZnkgXHZhcntwYWNrYWdlfQotICBpZiBcdmFye21vZHVsZV9yZWxhdGl2ZX0gaXMgXGNvZGV7RmFsc2V9LgotCi0gIE9wdGlvbmFsIGFyZ3VtZW50IFx2YXJ7Z2xvYnN9IGdpdmVzIGEgZGljdCB0byBiZSB1c2VkIGFzIHRoZSBnbG9iYWxzCi0gIHdoZW4gZXhlY3V0aW5nIGV4YW1wbGVzLiAgQSBuZXcgc2hhbGxvdyBjb3B5IG9mIHRoaXMgZGljdCBpcwotICBjcmVhdGVkIGZvciB0aGUgZG9jdGVzdCwgc28gaXRzIGV4YW1wbGVzIHN0YXJ0IHdpdGggYSBjbGVhbiBzbGF0ZS4KLSAgQnkgZGVmYXVsdCwgb3IgaWYgXGNvZGV7Tm9uZX0sIGEgbmV3IGVtcHR5IGRpY3QgaXMgdXNlZC4KLQotICBPcHRpb25hbCBhcmd1bWVudCBcdmFye2V4dHJhZ2xvYnN9IGdpdmVzIGEgZGljdCBtZXJnZWQgaW50byB0aGUKLSAgZ2xvYmFscyB1c2VkIHRvIGV4ZWN1dGUgZXhhbXBsZXMuICBUaGlzIHdvcmtzIGxpa2UKLSAgXG1ldGhvZHtkaWN0LnVwZGF0ZSgpfTogIGlmIFx2YXJ7Z2xvYnN9IGFuZCBcdmFye2V4dHJhZ2xvYnN9IGhhdmUgYQotICBjb21tb24ga2V5LCB0aGUgYXNzb2NpYXRlZCB2YWx1ZSBpbiBcdmFye2V4dHJhZ2xvYnN9IGFwcGVhcnMgaW4gdGhlCi0gIGNvbWJpbmVkIGRpY3QuICBCeSBkZWZhdWx0LCBvciBpZiBcY29kZXtOb25lfSwgbm8gZXh0cmEgZ2xvYmFscyBhcmUKLSAgdXNlZC4gIFRoaXMgaXMgYW4gYWR2YW5jZWQgZmVhdHVyZSB0aGF0IGFsbG93cyBwYXJhbWV0ZXJpemF0aW9uIG9mCi0gIGRvY3Rlc3RzLiAgRm9yIGV4YW1wbGUsIGEgZG9jdGVzdCBjYW4gYmUgd3JpdHRlbiBmb3IgYSBiYXNlIGNsYXNzLCB1c2luZwotICBhIGdlbmVyaWMgbmFtZSBmb3IgdGhlIGNsYXNzLCB0aGVuIHJldXNlZCB0byB0ZXN0IGFueSBudW1iZXIgb2YKLSAgc3ViY2xhc3NlcyBieSBwYXNzaW5nIGFuIFx2YXJ7ZXh0cmFnbG9ic30gZGljdCBtYXBwaW5nIHRoZSBnZW5lcmljCi0gIG5hbWUgdG8gdGhlIHN1YmNsYXNzIHRvIGJlIHRlc3RlZC4KLQotICBPcHRpb25hbCBhcmd1bWVudCBcdmFye3ZlcmJvc2V9IHByaW50cyBsb3RzIG9mIHN0dWZmIGlmIHRydWUsIGFuZCBwcmludHMKLSAgb25seSBmYWlsdXJlcyBpZiBmYWxzZTsgYnkgZGVmYXVsdCwgb3IgaWYgXGNvZGV7Tm9uZX0sIGl0J3MgdHJ1ZQotICBpZiBhbmQgb25seSBpZiBcY29kZXsnLXYnfSBpcyBpbiBcY29kZXtzeXMuYXJndn0uCi0KLSAgT3B0aW9uYWwgYXJndW1lbnQgXHZhcntyZXBvcnR9IHByaW50cyBhIHN1bW1hcnkgYXQgdGhlIGVuZCB3aGVuIHRydWUsCi0gIGVsc2UgcHJpbnRzIG5vdGhpbmcgYXQgdGhlIGVuZC4gIEluIHZlcmJvc2UgbW9kZSwgdGhlIHN1bW1hcnkgaXMKLSAgZGV0YWlsZWQsIGVsc2UgdGhlIHN1bW1hcnkgaXMgdmVyeSBicmllZiAoaW4gZmFjdCwgZW1wdHkgaWYgYWxsIHRlc3RzCi0gIHBhc3NlZCkuCi0KLSAgT3B0aW9uYWwgYXJndW1lbnQgXHZhcntvcHRpb25mbGFnc30gb3IncyB0b2dldGhlciBvcHRpb24gZmxhZ3MuICBTZWUKLSAgc2VjdGlvbn5ccmVme2RvY3Rlc3Qtb3B0aW9uc30uCi0KLSAgT3B0aW9uYWwgYXJndW1lbnQgXHZhcntyYWlzZV9vbl9lcnJvcn0gZGVmYXVsdHMgdG8gZmFsc2UuICBJZiB0cnVlLAotICBhbiBleGNlcHRpb24gaXMgcmFpc2VkIHVwb24gdGhlIGZpcnN0IGZhaWx1cmUgb3IgdW5leHBlY3RlZCBleGNlcHRpb24KLSAgaW4gYW4gZXhhbXBsZS4gIFRoaXMgYWxsb3dzIGZhaWx1cmVzIHRvIGJlIHBvc3QtbW9ydGVtIGRlYnVnZ2VkLgotICBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGNvbnRpbnVlIHJ1bm5pbmcgZXhhbXBsZXMuCi0KLSAgT3B0aW9uYWwgYXJndW1lbnQgXHZhcntwYXJzZXJ9IHNwZWNpZmllcyBhIFxjbGFzc3tEb2NUZXN0UGFyc2VyfSAob3IKLSAgc3ViY2xhc3MpIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gZXh0cmFjdCB0ZXN0cyBmcm9tIHRoZSBmaWxlcy4gIEl0Ci0gIGRlZmF1bHRzIHRvIGEgbm9ybWFsIHBhcnNlciAoaS5lLiwgXGNvZGV7XGNsYXNze0RvY1Rlc3RQYXJzZXJ9KCl9KS4KLQotICBPcHRpb25hbCBhcmd1bWVudCBcdmFye2VuY29kaW5nfSBzcGVjaWZpZXMgYW4gZW5jb2RpbmcgdGhhdCBzaG91bGQKLSAgYmUgdXNlZCB0byBjb252ZXJ0IHRoZSBmaWxlIHRvIHVuaWNvZGUuCi0KLSAgXHZlcnNpb25hZGRlZHsyLjR9Ci0KLSAgXHZlcnNpb25jaGFuZ2VkW1RoZSBwYXJhbWV0ZXIgXHZhcntlbmNvZGluZ30gd2FzIGFkZGVkXXsyLjV9Ci0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dGVzdG1vZH17XG9wdGlvbmFse219XG9wdGlvbmFseywgbmFtZX1cb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9ic31cb3B0aW9uYWx7LCB2ZXJib3NlfVxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydH1cb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25mbGFnc31cb3B0aW9uYWx7LCBleHRyYWdsb2JzfVxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlX29uX2Vycm9yfVxvcHRpb25hbHssIGV4Y2x1ZGVfZW1wdHl9fQotCi0gIEFsbCBhcmd1bWVudHMgYXJlIG9wdGlvbmFsLCBhbmQgYWxsIGV4Y2VwdCBmb3IgXHZhcnttfSBzaG91bGQgYmUKLSAgc3BlY2lmaWVkIGluIGtleXdvcmQgZm9ybS4KLQotICBUZXN0IGV4YW1wbGVzIGluIGRvY3N0cmluZ3MgaW4gZnVuY3Rpb25zIGFuZCBjbGFzc2VzIHJlYWNoYWJsZQotICBmcm9tIG1vZHVsZSBcdmFye219IChvciBtb2R1bGUgXG1vZHVsZXtfX21haW5fX30gaWYgXHZhcnttfSBpcyBub3QKLSAgc3VwcGxpZWQgb3IgaXMgXGNvZGV7Tm9uZX0pLCBzdGFydGluZyB3aXRoIFxjb2Rle1x2YXJ7bX0uX19kb2NfX30uCi0KLSAgQWxzbyB0ZXN0IGV4YW1wbGVzIHJlYWNoYWJsZSBmcm9tIGRpY3QgXGNvZGV7XHZhcnttfS5fX3Rlc3RfX30sIGlmIGl0Ci0gIGV4aXN0cyBhbmQgaXMgbm90IFxjb2Rle05vbmV9LiAgXGNvZGV7XHZhcnttfS5fX3Rlc3RfX30gbWFwcwotICBuYW1lcyAoc3RyaW5ncykgdG8gZnVuY3Rpb25zLCBjbGFzc2VzIGFuZCBzdHJpbmdzOyBmdW5jdGlvbiBhbmQgY2xhc3MKLSAgZG9jc3RyaW5ncyBhcmUgc2VhcmNoZWQgZm9yIGV4YW1wbGVzOyBzdHJpbmdzIGFyZSBzZWFyY2hlZCBkaXJlY3RseSwKLSAgYXMgaWYgdGhleSB3ZXJlIGRvY3N0cmluZ3MuCi0KLSAgT25seSBkb2NzdHJpbmdzIGF0dGFjaGVkIHRvIG9iamVjdHMgYmVsb25naW5nIHRvIG1vZHVsZSBcdmFye219IGFyZQotICBzZWFyY2hlZC4KLQotICBSZXR1cm4gXHNhbXB7KFx2YXJ7ZmFpbHVyZV9jb3VudH0sIFx2YXJ7dGVzdF9jb3VudH0pfS4KLQotICBPcHRpb25hbCBhcmd1bWVudCBcdmFye25hbWV9IGdpdmVzIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGU7IGJ5IGRlZmF1bHQsCi0gIG9yIGlmIFxjb2Rle05vbmV9LCBcY29kZXtcdmFye219Ll9fbmFtZV9ffSBpcyB1c2VkLgotCi0gIE9wdGlvbmFsIGFyZ3VtZW50IFx2YXJ7ZXhjbHVkZV9lbXB0eX0gZGVmYXVsdHMgdG8gZmFsc2UuICBJZiB0cnVlLAotICBvYmplY3RzIGZvciB3aGljaCBubyBkb2N0ZXN0cyBhcmUgZm91bmQgYXJlIGV4Y2x1ZGVkIGZyb20gY29uc2lkZXJhdGlvbi4KLSAgVGhlIGRlZmF1bHQgaXMgYSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGhhY2ssIHNvIHRoYXQgY29kZSBzdGlsbAotICB1c2luZyBcbWV0aG9ke2RvY3Rlc3QubWFzdGVyLnN1bW1hcml6ZSgpfSBpbiBjb25qdW5jdGlvbiB3aXRoCi0gIFxmdW5jdGlvbnt0ZXN0bW9kKCl9IGNvbnRpbnVlcyB0byBnZXQgb3V0cHV0IGZvciBvYmplY3RzIHdpdGggbm8gdGVzdHMuCi0gIFRoZSBcdmFye2V4Y2x1ZGVfZW1wdHl9IGFyZ3VtZW50IHRvIHRoZSBuZXdlciBcY2xhc3N7RG9jVGVzdEZpbmRlcn0KLSAgY29uc3RydWN0b3IgZGVmYXVsdHMgdG8gdHJ1ZS4KLQotICBPcHRpb25hbCBhcmd1bWVudHMgXHZhcntleHRyYWdsb2JzfSwgXHZhcnt2ZXJib3NlfSwgXHZhcntyZXBvcnR9LAotICBcdmFye29wdGlvbmZsYWdzfSwgXHZhcntyYWlzZV9vbl9lcnJvcn0sIGFuZCBcdmFye2dsb2JzfSBhcmUgdGhlIHNhbWUgYXMKLSAgZm9yIGZ1bmN0aW9uIFxmdW5jdGlvbnt0ZXN0ZmlsZSgpfSBhYm92ZSwgZXhjZXB0IHRoYXQgXHZhcntnbG9ic30KLSAgZGVmYXVsdHMgdG8gXGNvZGV7XHZhcnttfS5fX2RpY3RfX30uCi0KLSAgXHZlcnNpb25jaGFuZ2VkW1RoZSBwYXJhbWV0ZXIgXHZhcntvcHRpb25mbGFnc30gd2FzIGFkZGVkXXsyLjN9Ci0KLSAgXHZlcnNpb25jaGFuZ2VkW1RoZSBwYXJhbWV0ZXJzIFx2YXJ7ZXh0cmFnbG9ic30sIFx2YXJ7cmFpc2Vfb25fZXJyb3J9Ci0gICAgICAgICAgICAgICAgICBhbmQgXHZhcntleGNsdWRlX2VtcHR5fSB3ZXJlIGFkZGVkXXsyLjR9Ci0KLSAgXHZlcnNpb25jaGFuZ2VkW1RoZSBvcHRpb25hbCBhcmd1bWVudCBcdmFye2lzcHJpdmF0ZX0sIGRlcHJlY2F0ZWQKLSAgICAgICAgICAgICAgICAgIGluIDIuNCwgd2FzIHJlbW92ZWRdezIuNX0KLQotXGVuZHtmdW5jZGVzY30KLQotVGhlcmUncyBhbHNvIGEgZnVuY3Rpb24gdG8gcnVuIHRoZSBkb2N0ZXN0cyBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgb2JqZWN0LgotVGhpcyBmdW5jdGlvbiBpcyBwcm92aWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gIFRoZXJlIGFyZSBubyBwbGFucwotdG8gZGVwcmVjYXRlIGl0LCBidXQgaXQncyByYXJlbHkgdXNlZnVsOgotCi1cYmVnaW57ZnVuY2Rlc2N9e3J1bl9kb2NzdHJpbmdfZXhhbXBsZXN9e2YsIGdsb2JzXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlfVxvcHRpb25hbHssIG5hbWV9XG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlZmxhZ3N9XG9wdGlvbmFseywgb3B0aW9uZmxhZ3N9fQotCi0gIFRlc3QgZXhhbXBsZXMgYXNzb2NpYXRlZCB3aXRoIG9iamVjdCBcdmFye2Z9OyBmb3IgZXhhbXBsZSwgXHZhcntmfSBtYXkKLSAgYmUgYSBtb2R1bGUsIGZ1bmN0aW9uLCBvciBjbGFzcyBvYmplY3QuCi0KLSAgQSBzaGFsbG93IGNvcHkgb2YgZGljdGlvbmFyeSBhcmd1bWVudCBcdmFye2dsb2JzfSBpcyB1c2VkIGZvciB0aGUKLSAgZXhlY3V0aW9uIGNvbnRleHQuCi0KLSAgT3B0aW9uYWwgYXJndW1lbnQgXHZhcntuYW1lfSBpcyB1c2VkIGluIGZhaWx1cmUgbWVzc2FnZXMsIGFuZCBkZWZhdWx0cwotICB0byBcY29kZXsiTm9OYW1lIn0uCi0KLSAgSWYgb3B0aW9uYWwgYXJndW1lbnQgXHZhcnt2ZXJib3NlfSBpcyB0cnVlLCBvdXRwdXQgaXMgZ2VuZXJhdGVkIGV2ZW4KLSAgaWYgdGhlcmUgYXJlIG5vIGZhaWx1cmVzLiAgQnkgZGVmYXVsdCwgb3V0cHV0IGlzIGdlbmVyYXRlZCBvbmx5IGluIGNhc2UKLSAgb2YgYW4gZXhhbXBsZSBmYWlsdXJlLgotCi0gIE9wdGlvbmFsIGFyZ3VtZW50IFx2YXJ7Y29tcGlsZWZsYWdzfSBnaXZlcyB0aGUgc2V0IG9mIGZsYWdzIHRoYXQgc2hvdWxkCi0gIGJlIHVzZWQgYnkgdGhlIFB5dGhvbiBjb21waWxlciB3aGVuIHJ1bm5pbmcgdGhlIGV4YW1wbGVzLiAgQnkgZGVmYXVsdCwgb3IKLSAgaWYgXGNvZGV7Tm9uZX0sIGZsYWdzIGFyZSBkZWR1Y2VkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNldCBvZiBmdXR1cmUKLSAgZmVhdHVyZXMgZm91bmQgaW4gXHZhcntnbG9ic30uCi0KLSAgT3B0aW9uYWwgYXJndW1lbnQgXHZhcntvcHRpb25mbGFnc30gd29ya3MgYXMgZm9yIGZ1bmN0aW9uCi0gIFxmdW5jdGlvbnt0ZXN0ZmlsZSgpfSBhYm92ZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxzdWJzZWN0aW9ue1VuaXR0ZXN0IEFQSVxsYWJlbHtkb2N0ZXN0LXVuaXR0ZXN0LWFwaX19Ci0KLUFzIHlvdXIgY29sbGVjdGlvbiBvZiBkb2N0ZXN0J2VkIG1vZHVsZXMgZ3Jvd3MsIHlvdSdsbCB3YW50IGEgd2F5IHRvIHJ1bgotYWxsIHRoZWlyIGRvY3Rlc3RzIHN5c3RlbWF0aWNhbGx5LiAgUHJpb3IgdG8gUHl0aG9uIDIuNCwgXHJlZm1vZHVsZXtkb2N0ZXN0fQotaGFkIGEgYmFyZWx5IGRvY3VtZW50ZWQgXGNsYXNze1Rlc3Rlcn0gY2xhc3MgdGhhdCBzdXBwbGllZCBhIHJ1ZGltZW50YXJ5Ci13YXkgdG8gY29tYmluZSBkb2N0ZXN0cyBmcm9tIG11bHRpcGxlIG1vZHVsZXMuIFxjbGFzc3tUZXN0ZXJ9IHdhcyBmZWVibGUsCi1hbmQgaW4gcHJhY3RpY2UgbW9zdCBzZXJpb3VzIFB5dGhvbiB0ZXN0aW5nIGZyYW1ld29ya3MgYnVpbGQgb24gdGhlCi1ccmVmbW9kdWxle3VuaXR0ZXN0fSBtb2R1bGUsIHdoaWNoIHN1cHBsaWVzIG1hbnkgZmxleGlibGUgd2F5cyB0byBjb21iaW5lCi10ZXN0cyBmcm9tIG11bHRpcGxlIHNvdXJjZXMuICBTbywgaW4gUHl0aG9uIDIuNCwgXHJlZm1vZHVsZXtkb2N0ZXN0fSdzCi1cY2xhc3N7VGVzdGVyfSBjbGFzcyBpcyBkZXByZWNhdGVkLCBhbmQgXHJlZm1vZHVsZXtkb2N0ZXN0fSBwcm92aWRlcyB0d28KLWZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBccmVmbW9kdWxle3VuaXR0ZXN0fSB0ZXN0IHN1aXRlcyBmcm9tCi1tb2R1bGVzIGFuZCB0ZXh0IGZpbGVzIGNvbnRhaW5pbmcgZG9jdGVzdHMuICBUaGVzZSB0ZXN0IHN1aXRlcyBjYW4gdGhlbiBiZQotcnVuIHVzaW5nIFxyZWZtb2R1bGV7dW5pdHRlc3R9IHRlc3QgcnVubmVyczoKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgZG9jdGVzdAotaW1wb3J0IG15X21vZHVsZV93aXRoX2RvY3Rlc3RzLCBhbmRfYW5vdGhlcgotCi1zdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCi1mb3IgbW9kIGluIG15X21vZHVsZV93aXRoX2RvY3Rlc3RzLCBhbmRfYW5vdGhlcjoKLSAgICBzdWl0ZS5hZGRUZXN0KGRvY3Rlc3QuRG9jVGVzdFN1aXRlKG1vZCkpCi1ydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcigpCi1ydW5uZXIucnVuKHN1aXRlKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlcmUgYXJlIHR3byBtYWluIGZ1bmN0aW9ucyBmb3IgY3JlYXRpbmcgXGNsYXNze1xyZWZtb2R1bGV7dW5pdHRlc3R9LlRlc3RTdWl0ZX0KLWluc3RhbmNlcyBmcm9tIHRleHQgZmlsZXMgYW5kIG1vZHVsZXMgd2l0aCBkb2N0ZXN0czoKLQotXGJlZ2lue2Z1bmNkZXNjfXtEb2NGaWxlU3VpdGV9e1xvcHRpb25hbHttb2R1bGVfcmVsYXRpdmV9XG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2V9XG9wdGlvbmFseywgc2V0VXB9XG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYXJEb3dufVxvcHRpb25hbHssIGdsb2JzfVxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25mbGFnc31cb3B0aW9uYWx7LCBwYXJzZXJ9XG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nfX0KLQotICBDb252ZXJ0IGRvY3Rlc3QgdGVzdHMgZnJvbSBvbmUgb3IgbW9yZSB0ZXh0IGZpbGVzIHRvIGEKLSAgXGNsYXNze1xyZWZtb2R1bGV7dW5pdHRlc3R9LlRlc3RTdWl0ZX0uCi0KLSAgVGhlIHJldHVybmVkIFxjbGFzc3tccmVmbW9kdWxle3VuaXR0ZXN0fS5UZXN0U3VpdGV9IGlzIHRvIGJlIHJ1biBieSB0aGUKLSAgdW5pdHRlc3QgZnJhbWV3b3JrIGFuZCBydW5zIHRoZSBpbnRlcmFjdGl2ZSBleGFtcGxlcyBpbiBlYWNoIGZpbGUuICBJZiBhbgotICBleGFtcGxlIGluIGFueSBmaWxlIGZhaWxzLCB0aGVuIHRoZSBzeW50aGVzaXplZCB1bml0IHRlc3QgZmFpbHMsIGFuZCBhCi0gIFxleGNlcHRpb257ZmFpbHVyZUV4Y2VwdGlvbn0gZXhjZXB0aW9uIGlzIHJhaXNlZCBzaG93aW5nIHRoZSBuYW1lIG9mIHRoZQotICBmaWxlIGNvbnRhaW5pbmcgdGhlIHRlc3QgYW5kIGEgKHNvbWV0aW1lcyBhcHByb3hpbWF0ZSkgbGluZSBudW1iZXIuCi0KLSAgUGFzcyBvbmUgb3IgbW9yZSBwYXRocyAoYXMgc3RyaW5ncykgdG8gdGV4dCBmaWxlcyB0byBiZSBleGFtaW5lZC4KLQotICBPcHRpb25zIG1heSBiZSBwcm92aWRlZCBhcyBrZXl3b3JkIGFyZ3VtZW50czoKLQotICBPcHRpb25hbCBhcmd1bWVudCBcdmFye21vZHVsZV9yZWxhdGl2ZX0gc3BlY2lmaWVzIGhvdwotICB0aGUgZmlsZW5hbWVzIGluIFx2YXJ7cGF0aHN9IHNob3VsZCBiZSBpbnRlcnByZXRlZDoKLQotICBcYmVnaW57aXRlbWl6ZX0KLSAgXGl0ZW0gSWYgXHZhcnttb2R1bGVfcmVsYXRpdmV9IGlzIFxjb2Rle1RydWV9ICh0aGUgZGVmYXVsdCksIHRoZW4KLSAgICAgICAgZWFjaCBmaWxlbmFtZSBzcGVjaWZpZXMgYW4gT1MtaW5kZXBlbmRlbnQgbW9kdWxlLXJlbGF0aXZlCi0gICAgICAgIHBhdGguICBCeSBkZWZhdWx0LCB0aGlzIHBhdGggaXMgcmVsYXRpdmUgdG8gdGhlIGNhbGxpbmcKLSAgICAgICAgbW9kdWxlJ3MgZGlyZWN0b3J5OyBidXQgaWYgdGhlIFx2YXJ7cGFja2FnZX0gYXJndW1lbnQgaXMKLSAgICAgICAgc3BlY2lmaWVkLCB0aGVuIGl0IGlzIHJlbGF0aXZlIHRvIHRoYXQgcGFja2FnZS4gIFRvIGVuc3VyZQotICAgICAgICBPUy1pbmRlcGVuZGVuY2UsIGVhY2ggZmlsZW5hbWUgc2hvdWxkIHVzZSBcY29kZXsvfSBjaGFyYWN0ZXJzCi0gICAgICAgIHRvIHNlcGFyYXRlIHBhdGggc2VnbWVudHMsIGFuZCBtYXkgbm90IGJlIGFuIGFic29sdXRlIHBhdGgKLSAgICAgICAgKGkuZS4sIGl0IG1heSBub3QgYmVnaW4gd2l0aCBcY29kZXsvfSkuCi0gIFxpdGVtIElmIFx2YXJ7bW9kdWxlX3JlbGF0aXZlfSBpcyBcY29kZXtGYWxzZX0sIHRoZW4gZWFjaCBmaWxlbmFtZQotICAgICAgICBzcGVjaWZpZXMgYW4gT1Mtc3BlY2lmaWMgcGF0aC4gIFRoZSBwYXRoIG1heSBiZSBhYnNvbHV0ZSBvcgotICAgICAgICByZWxhdGl2ZTsgcmVsYXRpdmUgcGF0aHMgYXJlIHJlc29sdmVkIHdpdGggcmVzcGVjdCB0byB0aGUKLSAgICAgICAgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KLSAgXGVuZHtpdGVtaXplfQotCi0gIE9wdGlvbmFsIGFyZ3VtZW50IFx2YXJ7cGFja2FnZX0gaXMgYSBQeXRob24gcGFja2FnZSBvciB0aGUgbmFtZQotICBvZiBhIFB5dGhvbiBwYWNrYWdlIHdob3NlIGRpcmVjdG9yeSBzaG91bGQgYmUgdXNlZCBhcyB0aGUgYmFzZQotICBkaXJlY3RvcnkgZm9yIG1vZHVsZS1yZWxhdGl2ZSBmaWxlbmFtZXMuICBJZiBubyBwYWNrYWdlIGlzCi0gIHNwZWNpZmllZCwgdGhlbiB0aGUgY2FsbGluZyBtb2R1bGUncyBkaXJlY3RvcnkgaXMgdXNlZCBhcyB0aGUgYmFzZQotICBkaXJlY3RvcnkgZm9yIG1vZHVsZS1yZWxhdGl2ZSBmaWxlbmFtZXMuICBJdCBpcyBhbiBlcnJvciB0byBzcGVjaWZ5Ci0gIFx2YXJ7cGFja2FnZX0gaWYgXHZhcnttb2R1bGVfcmVsYXRpdmV9IGlzIFxjb2Rle0ZhbHNlfS4KLQotICBPcHRpb25hbCBhcmd1bWVudCBcdmFye3NldFVwfSBzcGVjaWZpZXMgYSBzZXQtdXAgZnVuY3Rpb24gZm9yCi0gIHRoZSB0ZXN0IHN1aXRlLiAgVGhpcyBpcyBjYWxsZWQgYmVmb3JlIHJ1bm5pbmcgdGhlIHRlc3RzIGluIGVhY2gKLSAgZmlsZS4gIFRoZSBcdmFye3NldFVwfSBmdW5jdGlvbiB3aWxsIGJlIHBhc3NlZCBhIFxjbGFzc3tEb2NUZXN0fQotICBvYmplY3QuICBUaGUgc2V0VXAgZnVuY3Rpb24gY2FuIGFjY2VzcyB0aGUgdGVzdCBnbG9iYWxzIGFzIHRoZQotICBcdmFye2dsb2JzfSBhdHRyaWJ1dGUgb2YgdGhlIHRlc3QgcGFzc2VkLgotCi0gIE9wdGlvbmFsIGFyZ3VtZW50IFx2YXJ7dGVhckRvd259IHNwZWNpZmllcyBhIHRlYXItZG93biBmdW5jdGlvbgotICBmb3IgdGhlIHRlc3Qgc3VpdGUuICBUaGlzIGlzIGNhbGxlZCBhZnRlciBydW5uaW5nIHRoZSB0ZXN0cyBpbiBlYWNoCi0gIGZpbGUuICBUaGUgXHZhcnt0ZWFyRG93bn0gZnVuY3Rpb24gd2lsbCBiZSBwYXNzZWQgYSBcY2xhc3N7RG9jVGVzdH0KLSAgb2JqZWN0LiAgVGhlIHNldFVwIGZ1bmN0aW9uIGNhbiBhY2Nlc3MgdGhlIHRlc3QgZ2xvYmFscyBhcyB0aGUKLSAgXHZhcntnbG9ic30gYXR0cmlidXRlIG9mIHRoZSB0ZXN0IHBhc3NlZC4KLQotICBPcHRpb25hbCBhcmd1bWVudCBcdmFye2dsb2JzfSBpcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUKLSAgaW5pdGlhbCBnbG9iYWwgdmFyaWFibGVzIGZvciB0aGUgdGVzdHMuICBBIG5ldyBjb3B5IG9mIHRoaXMKLSAgZGljdGlvbmFyeSBpcyBjcmVhdGVkIGZvciBlYWNoIHRlc3QuICBCeSBkZWZhdWx0LCBcdmFye2dsb2JzfSBpcwotICBhIG5ldyBlbXB0eSBkaWN0aW9uYXJ5LgotCi0gIE9wdGlvbmFsIGFyZ3VtZW50IFx2YXJ7b3B0aW9uZmxhZ3N9IHNwZWNpZmllcyB0aGUgZGVmYXVsdAotICBkb2N0ZXN0IG9wdGlvbnMgZm9yIHRoZSB0ZXN0cywgY3JlYXRlZCBieSBvci1pbmcgdG9nZXRoZXIKLSAgaW5kaXZpZHVhbCBvcHRpb24gZmxhZ3MuICBTZWUgc2VjdGlvbn5ccmVme2RvY3Rlc3Qtb3B0aW9uc30uCi0gIFNlZSBmdW5jdGlvbiBcZnVuY3Rpb257c2V0X3VuaXR0ZXN0X3JlcG9ydGZsYWdzKCl9IGJlbG93IGZvcgotICBhIGJldHRlciB3YXkgdG8gc2V0IHJlcG9ydGluZyBvcHRpb25zLgotCi0gIE9wdGlvbmFsIGFyZ3VtZW50IFx2YXJ7cGFyc2VyfSBzcGVjaWZpZXMgYSBcY2xhc3N7RG9jVGVzdFBhcnNlcn0gKG9yCi0gIHN1YmNsYXNzKSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGV4dHJhY3QgdGVzdHMgZnJvbSB0aGUgZmlsZXMuICBJdAotICBkZWZhdWx0cyB0byBhIG5vcm1hbCBwYXJzZXIgKGkuZS4sIFxjb2Rle1xjbGFzc3tEb2NUZXN0UGFyc2VyfSgpfSkuCi0KLSAgT3B0aW9uYWwgYXJndW1lbnQgXHZhcntlbmNvZGluZ30gc3BlY2lmaWVzIGFuIGVuY29kaW5nIHRoYXQgc2hvdWxkCi0gIGJlIHVzZWQgdG8gY29udmVydCB0aGUgZmlsZSB0byB1bmljb2RlLgotCi0gIFx2ZXJzaW9uYWRkZWR7Mi40fQotCi0gIFx2ZXJzaW9uY2hhbmdlZFtUaGUgZ2xvYmFsIFxjb2Rle19fZmlsZV9ffSB3YXMgYWRkZWQgdG8gdGhlCi0gIGdsb2JhbHMgcHJvdmlkZWQgdG8gZG9jdGVzdHMgbG9hZGVkIGZyb20gYSB0ZXh0IGZpbGUgdXNpbmcKLSAgXGZ1bmN0aW9ue0RvY0ZpbGVTdWl0ZSgpfV17Mi41fQotCi0gIFx2ZXJzaW9uY2hhbmdlZFtUaGUgcGFyYW1ldGVyIFx2YXJ7ZW5jb2Rpbmd9IHdhcyBhZGRlZF17Mi41fQotCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e0RvY1Rlc3RTdWl0ZX17XG9wdGlvbmFse21vZHVsZX1cb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYnN9XG9wdGlvbmFseywgZXh0cmFnbG9ic31cb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9maW5kZXJ9XG9wdGlvbmFseywgc2V0VXB9XG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYXJEb3dufVxvcHRpb25hbHssIGNoZWNrZXJ9fQotICBDb252ZXJ0IGRvY3Rlc3QgdGVzdHMgZm9yIGEgbW9kdWxlIHRvIGEKLSAgXGNsYXNze1xyZWZtb2R1bGV7dW5pdHRlc3R9LlRlc3RTdWl0ZX0uCi0KLSAgVGhlIHJldHVybmVkIFxjbGFzc3tccmVmbW9kdWxle3VuaXR0ZXN0fS5UZXN0U3VpdGV9IGlzIHRvIGJlIHJ1biBieSB0aGUKLSAgdW5pdHRlc3QgZnJhbWV3b3JrIGFuZCBydW5zIGVhY2ggZG9jdGVzdCBpbiB0aGUgbW9kdWxlLiAgSWYgYW55IG9mIHRoZQotICBkb2N0ZXN0cyBmYWlsLCB0aGVuIHRoZSBzeW50aGVzaXplZCB1bml0IHRlc3QgZmFpbHMsIGFuZCBhCi0gIFxleGNlcHRpb257ZmFpbHVyZUV4Y2VwdGlvbn0gZXhjZXB0aW9uIGlzIHJhaXNlZCBzaG93aW5nIHRoZSBuYW1lIG9mIHRoZQotICBmaWxlIGNvbnRhaW5pbmcgdGhlIHRlc3QgYW5kIGEgKHNvbWV0aW1lcyBhcHByb3hpbWF0ZSkgbGluZSBudW1iZXIuCi0KLSAgT3B0aW9uYWwgYXJndW1lbnQgXHZhcnttb2R1bGV9IHByb3ZpZGVzIHRoZSBtb2R1bGUgdG8gYmUgdGVzdGVkLiAgSXQKLSAgY2FuIGJlIGEgbW9kdWxlIG9iamVjdCBvciBhIChwb3NzaWJseSBkb3R0ZWQpIG1vZHVsZSBuYW1lLiAgSWYgbm90Ci0gIHNwZWNpZmllZCwgdGhlIG1vZHVsZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gaXMgdXNlZC4KLQotICBPcHRpb25hbCBhcmd1bWVudCBcdmFye2dsb2JzfSBpcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUKLSAgaW5pdGlhbCBnbG9iYWwgdmFyaWFibGVzIGZvciB0aGUgdGVzdHMuICBBIG5ldyBjb3B5IG9mIHRoaXMKLSAgZGljdGlvbmFyeSBpcyBjcmVhdGVkIGZvciBlYWNoIHRlc3QuICBCeSBkZWZhdWx0LCBcdmFye2dsb2JzfSBpcwotICBhIG5ldyBlbXB0eSBkaWN0aW9uYXJ5LgotCi0gIE9wdGlvbmFsIGFyZ3VtZW50IFx2YXJ7ZXh0cmFnbG9ic30gc3BlY2lmaWVzIGFuIGV4dHJhIHNldCBvZgotICBnbG9iYWwgdmFyaWFibGVzLCB3aGljaCBpcyBtZXJnZWQgaW50byBcdmFye2dsb2JzfS4gIEJ5IGRlZmF1bHQsIG5vCi0gIGV4dHJhIGdsb2JhbHMgYXJlIHVzZWQuCi0KLSAgT3B0aW9uYWwgYXJndW1lbnQgXHZhcnt0ZXN0X2ZpbmRlcn0gaXMgdGhlIFxjbGFzc3tEb2NUZXN0RmluZGVyfQotICBvYmplY3QgKG9yIGEgZHJvcC1pbiByZXBsYWNlbWVudCkgdGhhdCBpcyB1c2VkIHRvIGV4dHJhY3QgZG9jdGVzdHMKLSAgZnJvbSB0aGUgbW9kdWxlLgotCi0gIE9wdGlvbmFsIGFyZ3VtZW50cyBcdmFye3NldFVwfSwgXHZhcnt0ZWFyRG93bn0sIGFuZCBcdmFye29wdGlvbmZsYWdzfQotICBhcmUgdGhlIHNhbWUgYXMgZm9yIGZ1bmN0aW9uIFxmdW5jdGlvbntEb2NGaWxlU3VpdGUoKX0gYWJvdmUuCi0KLSAgXHZlcnNpb25hZGRlZHsyLjN9Ci0KLSAgXHZlcnNpb25jaGFuZ2VkW1RoZSBwYXJhbWV0ZXJzIFx2YXJ7Z2xvYnN9LCBcdmFye2V4dHJhZ2xvYnN9LAotICAgIFx2YXJ7dGVzdF9maW5kZXJ9LCBcdmFye3NldFVwfSwgXHZhcnt0ZWFyRG93bn0sIGFuZAotICAgIFx2YXJ7b3B0aW9uZmxhZ3N9IHdlcmUgYWRkZWQ7IHRoaXMgZnVuY3Rpb24gbm93IHVzZXMgdGhlIHNhbWUgc2VhcmNoCi0gICAgdGVjaG5pcXVlIGFzIFxmdW5jdGlvbnt0ZXN0bW9kKCl9XXsyLjR9Ci1cZW5ke2Z1bmNkZXNjfQotCi1VbmRlciB0aGUgY292ZXJzLCBcZnVuY3Rpb257RG9jVGVzdFN1aXRlKCl9IGNyZWF0ZXMgYQotXGNsYXNze1xyZWZtb2R1bGV7dW5pdHRlc3R9LlRlc3RTdWl0ZX0gb3V0IG9mIFxjbGFzc3tkb2N0ZXN0LkRvY1Rlc3RDYXNlfQotaW5zdGFuY2VzLCBhbmQgXGNsYXNze0RvY1Rlc3RDYXNlfSBpcyBhIHN1YmNsYXNzIG9mCi1cY2xhc3N7XHJlZm1vZHVsZXt1bml0dGVzdH0uVGVzdENhc2V9LiBcY2xhc3N7RG9jVGVzdENhc2V9IGlzbid0IGRvY3VtZW50ZWQKLWhlcmUgKGl0J3MgYW4gaW50ZXJuYWwgZGV0YWlsKSwgYnV0IHN0dWR5aW5nIGl0cyBjb2RlIGNhbiBhbnN3ZXIgcXVlc3Rpb25zCi1hYm91dCB0aGUgZXhhY3QgZGV0YWlscyBvZiBccmVmbW9kdWxle3VuaXR0ZXN0fSBpbnRlZ3JhdGlvbi4KLQotU2ltaWxhcmx5LCBcZnVuY3Rpb257RG9jRmlsZVN1aXRlKCl9IGNyZWF0ZXMgYQotXGNsYXNze1xyZWZtb2R1bGV7dW5pdHRlc3R9LlRlc3RTdWl0ZX0gb3V0IG9mIFxjbGFzc3tkb2N0ZXN0LkRvY0ZpbGVDYXNlfQotaW5zdGFuY2VzLCBhbmQgXGNsYXNze0RvY0ZpbGVDYXNlfSBpcyBhIHN1YmNsYXNzIG9mIFxjbGFzc3tEb2NUZXN0Q2FzZX0uCi0KLVNvIGJvdGggd2F5cyBvZiBjcmVhdGluZyBhIFxjbGFzc3tccmVmbW9kdWxle3VuaXR0ZXN0fS5UZXN0U3VpdGV9IHJ1bgotaW5zdGFuY2VzIG9mIFxjbGFzc3tEb2NUZXN0Q2FzZX0uICBUaGlzIGlzIGltcG9ydGFudCBmb3IgYSBzdWJ0bGUgcmVhc29uOgotd2hlbiB5b3UgcnVuIFxyZWZtb2R1bGV7ZG9jdGVzdH0gZnVuY3Rpb25zIHlvdXJzZWxmLCB5b3UgY2FuIGNvbnRyb2wgdGhlCi1ccmVmbW9kdWxle2RvY3Rlc3R9IG9wdGlvbnMgaW4gdXNlIGRpcmVjdGx5LCBieSBwYXNzaW5nIG9wdGlvbiBmbGFncyB0bwotXHJlZm1vZHVsZXtkb2N0ZXN0fSBmdW5jdGlvbnMuICBIb3dldmVyLCBpZiB5b3UncmUgd3JpdGluZyBhCi1ccmVmbW9kdWxle3VuaXR0ZXN0fSBmcmFtZXdvcmssIFxyZWZtb2R1bGV7dW5pdHRlc3R9IHVsdGltYXRlbHkgY29udHJvbHMKLXdoZW4gYW5kIGhvdyB0ZXN0cyBnZXQgcnVuLiAgVGhlIGZyYW1ld29yayBhdXRob3IgdHlwaWNhbGx5IHdhbnRzIHRvCi1jb250cm9sIFxyZWZtb2R1bGV7ZG9jdGVzdH0gcmVwb3J0aW5nIG9wdGlvbnMgKHBlcmhhcHMsIGUuZy4sIHNwZWNpZmllZCBieQotY29tbWFuZCBsaW5lIG9wdGlvbnMpLCBidXQgdGhlcmUncyBubyB3YXkgdG8gcGFzcyBvcHRpb25zIHRocm91Z2gKLVxyZWZtb2R1bGV7dW5pdHRlc3R9IHRvIFxyZWZtb2R1bGV7ZG9jdGVzdH0gdGVzdCBydW5uZXJzLgotCi1Gb3IgdGhpcyByZWFzb24sIFxyZWZtb2R1bGV7ZG9jdGVzdH0gYWxzbyBzdXBwb3J0cyBhIG5vdGlvbiBvZgotXHJlZm1vZHVsZXtkb2N0ZXN0fSByZXBvcnRpbmcgZmxhZ3Mgc3BlY2lmaWMgdG8gXHJlZm1vZHVsZXt1bml0dGVzdH0KLXN1cHBvcnQsIHZpYSB0aGlzIGZ1bmN0aW9uOgotCi1cYmVnaW57ZnVuY2Rlc2N9e3NldF91bml0dGVzdF9yZXBvcnRmbGFnc317ZmxhZ3N9Ci0gIFNldCB0aGUgXHJlZm1vZHVsZXtkb2N0ZXN0fSByZXBvcnRpbmcgZmxhZ3MgdG8gdXNlLgotCi0gIEFyZ3VtZW50IFx2YXJ7ZmxhZ3N9IG9yJ3MgdG9nZXRoZXIgb3B0aW9uIGZsYWdzLiAgU2VlCi0gIHNlY3Rpb25+XHJlZntkb2N0ZXN0LW9wdGlvbnN9LiAgT25seSAicmVwb3J0aW5nIGZsYWdzIiBjYW4gYmUgdXNlZC4KLQotICBUaGlzIGlzIGEgbW9kdWxlLWdsb2JhbCBzZXR0aW5nLCBhbmQgYWZmZWN0cyBhbGwgZnV0dXJlIGRvY3Rlc3RzIHJ1biBieQotICBtb2R1bGUgXHJlZm1vZHVsZXt1bml0dGVzdH06ICB0aGUgXG1ldGhvZHtydW5UZXN0KCl9IG1ldGhvZCBvZgotICBcY2xhc3N7RG9jVGVzdENhc2V9IGxvb2tzIGF0IHRoZSBvcHRpb24gZmxhZ3Mgc3BlY2lmaWVkIGZvciB0aGUgdGVzdCBjYXNlCi0gIHdoZW4gdGhlIFxjbGFzc3tEb2NUZXN0Q2FzZX0gaW5zdGFuY2Ugd2FzIGNvbnN0cnVjdGVkLiAgSWYgbm8gcmVwb3J0aW5nCi0gIGZsYWdzIHdlcmUgc3BlY2lmaWVkICh3aGljaCBpcyB0aGUgdHlwaWNhbCBhbmQgZXhwZWN0ZWQgY2FzZSksCi0gIFxyZWZtb2R1bGV7ZG9jdGVzdH0ncyBccmVmbW9kdWxle3VuaXR0ZXN0fSByZXBvcnRpbmcgZmxhZ3MgYXJlIG9yJ2VkIGludG8KLSAgdGhlIG9wdGlvbiBmbGFncywgYW5kIHRoZSBvcHRpb24gZmxhZ3Mgc28gYXVnbWVudGVkIGFyZSBwYXNzZWQgdG8gdGhlCi0gIFxjbGFzc3tEb2NUZXN0UnVubmVyfSBpbnN0YW5jZSBjcmVhdGVkIHRvIHJ1biB0aGUgZG9jdGVzdC4gIElmIGFueQotICByZXBvcnRpbmcgZmxhZ3Mgd2VyZSBzcGVjaWZpZWQgd2hlbiB0aGUgXGNsYXNze0RvY1Rlc3RDYXNlfSBpbnN0YW5jZSB3YXMKLSAgY29uc3RydWN0ZWQsIFxyZWZtb2R1bGV7ZG9jdGVzdH0ncyBccmVmbW9kdWxle3VuaXR0ZXN0fSByZXBvcnRpbmcgZmxhZ3MKLSAgYXJlIGlnbm9yZWQuCi0KLSAgVGhlIHZhbHVlIG9mIHRoZSBccmVmbW9kdWxle3VuaXR0ZXN0fSByZXBvcnRpbmcgZmxhZ3MgaW4gZWZmZWN0IGJlZm9yZSB0aGUKLSAgZnVuY3Rpb24gd2FzIGNhbGxlZCBpcyByZXR1cm5lZCBieSB0aGUgZnVuY3Rpb24uCi0KLSAgXHZlcnNpb25hZGRlZHsyLjR9Ci1cZW5ke2Z1bmNkZXNjfQotCi0KLVxzdWJzZWN0aW9ue0FkdmFuY2VkIEFQSVxsYWJlbHtkb2N0ZXN0LWFkdmFuY2VkLWFwaX19Ci0KLVRoZSBiYXNpYyBBUEkgaXMgYSBzaW1wbGUgd3JhcHBlciB0aGF0J3MgaW50ZW5kZWQgdG8gbWFrZSBkb2N0ZXN0IGVhc3kKLXRvIHVzZS4gIEl0IGlzIGZhaXJseSBmbGV4aWJsZSwgYW5kIHNob3VsZCBtZWV0IG1vc3QgdXNlcnMnIG5lZWRzOwotaG93ZXZlciwgaWYgeW91IHJlcXVpcmUgbW9yZSBmaW5lLWdyYWluZWQgY29udHJvbCBvdmVyIHRlc3RpbmcsIG9yCi13aXNoIHRvIGV4dGVuZCBkb2N0ZXN0J3MgY2FwYWJpbGl0aWVzLCB0aGVuIHlvdSBzaG91bGQgdXNlIHRoZQotYWR2YW5jZWQgQVBJLgotCi1UaGUgYWR2YW5jZWQgQVBJIHJldm9sdmVzIGFyb3VuZCB0d28gY29udGFpbmVyIGNsYXNzZXMsIHdoaWNoIGFyZSB1c2VkCi10byBzdG9yZSB0aGUgaW50ZXJhY3RpdmUgZXhhbXBsZXMgZXh0cmFjdGVkIGZyb20gZG9jdGVzdCBjYXNlczoKLQotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSBcY2xhc3N7RXhhbXBsZX06IEEgc2luZ2xlIHB5dGhvbiBzdGF0ZW1lbnQsIHBhaXJlZCB3aXRoIGl0cwotICAgICAgZXhwZWN0ZWQgb3V0cHV0LgotXGl0ZW0gXGNsYXNze0RvY1Rlc3R9OiBBIGNvbGxlY3Rpb24gb2YgXGNsYXNze0V4YW1wbGV9cywgdHlwaWNhbGx5Ci0gICAgICBleHRyYWN0ZWQgZnJvbSBhIHNpbmdsZSBkb2NzdHJpbmcgb3IgdGV4dCBmaWxlLgotXGVuZHtpdGVtaXplfQotCi1BZGRpdGlvbmFsIHByb2Nlc3NpbmcgY2xhc3NlcyBhcmUgZGVmaW5lZCB0byBmaW5kLCBwYXJzZSwgYW5kIHJ1biwgYW5kCi1jaGVjayBkb2N0ZXN0IGV4YW1wbGVzOgotCi1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtIFxjbGFzc3tEb2NUZXN0RmluZGVyfTogRmluZHMgYWxsIGRvY3N0cmluZ3MgaW4gYSBnaXZlbiBtb2R1bGUsCi0gICAgICBhbmQgdXNlcyBhIFxjbGFzc3tEb2NUZXN0UGFyc2VyfSB0byBjcmVhdGUgYSBcY2xhc3N7RG9jVGVzdH0KLSAgICAgIGZyb20gZXZlcnkgZG9jc3RyaW5nIHRoYXQgY29udGFpbnMgaW50ZXJhY3RpdmUgZXhhbXBsZXMuCi1caXRlbSBcY2xhc3N7RG9jVGVzdFBhcnNlcn06IENyZWF0ZXMgYSBcY2xhc3N7RG9jVGVzdH0gb2JqZWN0IGZyb20KLSAgICAgIGEgc3RyaW5nIChzdWNoIGFzIGFuIG9iamVjdCdzIGRvY3N0cmluZykuCi1caXRlbSBcY2xhc3N7RG9jVGVzdFJ1bm5lcn06IEV4ZWN1dGVzIHRoZSBleGFtcGxlcyBpbiBhCi0gICAgICBcY2xhc3N7RG9jVGVzdH0sIGFuZCB1c2VzIGFuIFxjbGFzc3tPdXRwdXRDaGVja2VyfSB0byB2ZXJpZnkKLSAgICAgIHRoZWlyIG91dHB1dC4KLVxpdGVtIFxjbGFzc3tPdXRwdXRDaGVja2VyfTogQ29tcGFyZXMgdGhlIGFjdHVhbCBvdXRwdXQgZnJvbSBhCi0gICAgICBkb2N0ZXN0IGV4YW1wbGUgd2l0aCB0aGUgZXhwZWN0ZWQgb3V0cHV0LCBhbmQgZGVjaWRlcyB3aGV0aGVyCi0gICAgICB0aGV5IG1hdGNoLgotXGVuZHtpdGVtaXplfQotCi1UaGUgcmVsYXRpb25zaGlwcyBhbW9uZyB0aGVzZSBwcm9jZXNzaW5nIGNsYXNzZXMgYXJlIHN1bW1hcml6ZWQgaW4gdGhlCi1mb2xsb3dpbmcgZGlhZ3JhbToKLQotXGJlZ2lue3ZlcmJhdGltfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Qgb2Y6Ci0rLS0tLS0tKyAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tKwotfG1vZHVsZXwgLS1Eb2NUZXN0RmluZGVyLT4gfCBEb2NUZXN0IHwgLS1Eb2NUZXN0UnVubmVyLT4gcmVzdWx0cwotKy0tLS0tLSsgICAgfCAgICAgICAgXiAgICAgKy0tLS0tLS0tLSsgICAgIHwgICAgICAgXiAgICAocHJpbnRlZCkKLSAgICAgICAgICAgIHwgICAgICAgIHwgICAgIHwgRXhhbXBsZSB8ICAgICB8ICAgICAgIHwKLSAgICAgICAgICAgIHYgICAgICAgIHwgICAgIHwgICAuLi4gICB8ICAgICB2ICAgICAgIHwKLSAgICAgICAgICAgRG9jVGVzdFBhcnNlciAgIHwgRXhhbXBsZSB8ICAgT3V0cHV0Q2hlY2tlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLSsKLVxlbmR7dmVyYmF0aW19Ci0KLVxzdWJzdWJzZWN0aW9ue0RvY1Rlc3QgT2JqZWN0c1xsYWJlbHtkb2N0ZXN0LURvY1Rlc3R9fQotXGJlZ2lue2NsYXNzZGVzY317RG9jVGVzdH17ZXhhbXBsZXMsIGdsb2JzLCBuYW1lLCBmaWxlbmFtZSwgbGluZW5vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jc3RyaW5nfQotICAgIEEgY29sbGVjdGlvbiBvZiBkb2N0ZXN0IGV4YW1wbGVzIHRoYXQgc2hvdWxkIGJlIHJ1biBpbiBhIHNpbmdsZQotICAgIG5hbWVzcGFjZS4gIFRoZSBjb25zdHJ1Y3RvciBhcmd1bWVudHMgYXJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUKLSAgICBtZW1iZXIgdmFyaWFibGVzIG9mIHRoZSBzYW1lIG5hbWVzLgotICAgIFx2ZXJzaW9uYWRkZWR7Mi40fQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxjbGFzc3tEb2NUZXN0fSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgbWVtYmVyIHZhcmlhYmxlcy4gIFRoZXkgYXJlCi1pbml0aWFsaXplZCBieSB0aGUgY29uc3RydWN0b3IsIGFuZCBzaG91bGQgbm90IGJlIG1vZGlmaWVkIGRpcmVjdGx5LgotCi1cYmVnaW57bWVtYmVyZGVzY317ZXhhbXBsZXN9Ci0gICAgQSBsaXN0IG9mIFxjbGFzc3tFeGFtcGxlfSBvYmplY3RzIGVuY29kaW5nIHRoZSBpbmRpdmlkdWFsCi0gICAgaW50ZXJhY3RpdmUgUHl0aG9uIGV4YW1wbGVzIHRoYXQgc2hvdWxkIGJlIHJ1biBieSB0aGlzIHRlc3QuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXtnbG9ic30KLSAgICBUaGUgbmFtZXNwYWNlIChha2EgZ2xvYmFscykgdGhhdCB0aGUgZXhhbXBsZXMgc2hvdWxkIGJlIHJ1biBpbi4KLSAgICBUaGlzIGlzIGEgZGljdGlvbmFyeSBtYXBwaW5nIG5hbWVzIHRvIHZhbHVlcy4gIEFueSBjaGFuZ2VzIHRvIHRoZQotICAgIG5hbWVzcGFjZSBtYWRlIGJ5IHRoZSBleGFtcGxlcyAoc3VjaCBhcyBiaW5kaW5nIG5ldyB2YXJpYWJsZXMpCi0gICAgd2lsbCBiZSByZWZsZWN0ZWQgaW4gXG1lbWJlcntnbG9ic30gYWZ0ZXIgdGhlIHRlc3QgaXMgcnVuLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY317bmFtZX0KLSAgICBBIHN0cmluZyBuYW1lIGlkZW50aWZ5aW5nIHRoZSBcY2xhc3N7RG9jVGVzdH0uICBUeXBpY2FsbHksIHRoaXMgaXMKLSAgICB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IG9yIGZpbGUgdGhhdCB0aGUgdGVzdCB3YXMgZXh0cmFjdGVkIGZyb20uCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXtmaWxlbmFtZX0KLSAgICBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0aGF0IHRoaXMgXGNsYXNze0RvY1Rlc3R9IHdhcyBleHRyYWN0ZWQgZnJvbTsKLSAgICBvciBcY29kZXtOb25lfSBpZiB0aGUgZmlsZW5hbWUgaXMgdW5rbm93biwgb3IgaWYgdGhlCi0gICAgXGNsYXNze0RvY1Rlc3R9IHdhcyBub3QgZXh0cmFjdGVkIGZyb20gYSBmaWxlLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY317bGluZW5vfQotICAgIFRoZSBsaW5lIG51bWJlciB3aXRoaW4gXG1lbWJlcntmaWxlbmFtZX0gd2hlcmUgdGhpcwotICAgIFxjbGFzc3tEb2NUZXN0fSBiZWdpbnMsIG9yIFxjb2Rle05vbmV9IGlmIHRoZSBsaW5lIG51bWJlciBpcwotICAgIHVuYXZhaWxhYmxlLiAgVGhpcyBsaW5lIG51bWJlciBpcyB6ZXJvLWJhc2VkIHdpdGggcmVzcGVjdCB0byB0aGUKLSAgICBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXtkb2NzdHJpbmd9Ci0gICAgVGhlIHN0cmluZyB0aGF0IHRoZSB0ZXN0IHdhcyBleHRyYWN0ZWQgZnJvbSwgb3IgYE5vbmVgIGlmIHRoZQotICAgIHN0cmluZyBpcyB1bmF2YWlsYWJsZSwgb3IgaWYgdGhlIHRlc3Qgd2FzIG5vdCBleHRyYWN0ZWQgZnJvbSBhCi0gICAgc3RyaW5nLgotXGVuZHttZW1iZXJkZXNjfQotCi1cc3Vic3Vic2VjdGlvbntFeGFtcGxlIE9iamVjdHNcbGFiZWx7ZG9jdGVzdC1FeGFtcGxlfX0KLVxiZWdpbntjbGFzc2Rlc2N9e0V4YW1wbGV9e3NvdXJjZSwgd2FudFxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBleGNfbXNnfVxvcHRpb25hbHssIGxpbmVub31cb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50fVxvcHRpb25hbHssIG9wdGlvbnN9fQotICAgIEEgc2luZ2xlIGludGVyYWN0aXZlIGV4YW1wbGUsIGNvbnNpc3Rpbmcgb2YgYSBQeXRob24gc3RhdGVtZW50IGFuZAotICAgIGl0cyBleHBlY3RlZCBvdXRwdXQuICBUaGUgY29uc3RydWN0b3IgYXJndW1lbnRzIGFyZSB1c2VkIHRvCi0gICAgaW5pdGlhbGl6ZSB0aGUgbWVtYmVyIHZhcmlhYmxlcyBvZiB0aGUgc2FtZSBuYW1lcy4KLSAgICBcdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7Y2xhc3NkZXNjfQotCi1cY2xhc3N7RXhhbXBsZX0gZGVmaW5lcyB0aGUgZm9sbG93aW5nIG1lbWJlciB2YXJpYWJsZXMuICBUaGV5IGFyZQotaW5pdGlhbGl6ZWQgYnkgdGhlIGNvbnN0cnVjdG9yLCBhbmQgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCBkaXJlY3RseS4KLQotXGJlZ2lue21lbWJlcmRlc2N9e3NvdXJjZX0KLSAgICBBIHN0cmluZyBjb250YWluaW5nIHRoZSBleGFtcGxlJ3Mgc291cmNlIGNvZGUuICBUaGlzIHNvdXJjZSBjb2RlCi0gICAgY29uc2lzdHMgb2YgYSBzaW5nbGUgUHl0aG9uIHN0YXRlbWVudCwgYW5kIGFsd2F5cyBlbmRzIHdpdGggYQotICAgIG5ld2xpbmU7IHRoZSBjb25zdHJ1Y3RvciBhZGRzIGEgbmV3bGluZSB3aGVuIG5lY2Vzc2FyeS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9e3dhbnR9Ci0gICAgVGhlIGV4cGVjdGVkIG91dHB1dCBmcm9tIHJ1bm5pbmcgdGhlIGV4YW1wbGUncyBzb3VyY2UgY29kZSAoZWl0aGVyCi0gICAgZnJvbSBzdGRvdXQsIG9yIGEgdHJhY2ViYWNrIGluIGNhc2Ugb2YgZXhjZXB0aW9uKS4gIFxtZW1iZXJ7d2FudH0KLSAgICBlbmRzIHdpdGggYSBuZXdsaW5lIHVubGVzcyBubyBvdXRwdXQgaXMgZXhwZWN0ZWQsIGluIHdoaWNoIGNhc2UKLSAgICBpdCdzIGFuIGVtcHR5IHN0cmluZy4gIFRoZSBjb25zdHJ1Y3RvciBhZGRzIGEgbmV3bGluZSB3aGVuCi0gICAgbmVjZXNzYXJ5LgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY317ZXhjX21zZ30KLSAgICBUaGUgZXhjZXB0aW9uIG1lc3NhZ2UgZ2VuZXJhdGVkIGJ5IHRoZSBleGFtcGxlLCBpZiB0aGUgZXhhbXBsZSBpcwotICAgIGV4cGVjdGVkIHRvIGdlbmVyYXRlIGFuIGV4Y2VwdGlvbjsgb3IgXGNvZGV7Tm9uZX0gaWYgaXQgaXMgbm90Ci0gICAgZXhwZWN0ZWQgdG8gZ2VuZXJhdGUgYW4gZXhjZXB0aW9uLiAgVGhpcyBleGNlcHRpb24gbWVzc2FnZSBpcwotICAgIGNvbXBhcmVkIGFnYWluc3QgdGhlIHJldHVybiB2YWx1ZSBvZgotICAgIFxmdW5jdGlvbnt0cmFjZWJhY2suZm9ybWF0X2V4Y2VwdGlvbl9vbmx5KCl9LiAgXG1lbWJlcntleGNfbXNnfQotICAgIGVuZHMgd2l0aCBhIG5ld2xpbmUgdW5sZXNzIGl0J3MgXGNvZGV7Tm9uZX0uICBUaGUgY29uc3RydWN0b3IgYWRkcwotICAgIGEgbmV3bGluZSBpZiBuZWVkZWQuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXtsaW5lbm99Ci0gICAgVGhlIGxpbmUgbnVtYmVyIHdpdGhpbiB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhpcyBleGFtcGxlIHdoZXJlCi0gICAgdGhlIGV4YW1wbGUgYmVnaW5zLiAgVGhpcyBsaW5lIG51bWJlciBpcyB6ZXJvLWJhc2VkIHdpdGggcmVzcGVjdAotICAgIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbnRhaW5pbmcgc3RyaW5nLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY317aW5kZW50fQotICAgIFRoZSBleGFtcGxlJ3MgaW5kZW50YXRpb24gaW4gdGhlIGNvbnRhaW5pbmcgc3RyaW5nLCBpLmUuLCB0aGUKLSAgICBudW1iZXIgb2Ygc3BhY2UgY2hhcmFjdGVycyB0aGF0IHByZWNlZGUgdGhlIGV4YW1wbGUncyBmaXJzdAotICAgIHByb21wdC4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9e29wdGlvbnN9Ci0gICAgQSBkaWN0aW9uYXJ5IG1hcHBpbmcgZnJvbSBvcHRpb24gZmxhZ3MgdG8gXGNvZGV7VHJ1ZX0gb3IKLSAgICBcY29kZXtGYWxzZX0sIHdoaWNoIGlzIHVzZWQgdG8gb3ZlcnJpZGUgZGVmYXVsdCBvcHRpb25zIGZvciB0aGlzCi0gICAgZXhhbXBsZS4gIEFueSBvcHRpb24gZmxhZ3Mgbm90IGNvbnRhaW5lZCBpbiB0aGlzIGRpY3Rpb25hcnkgYXJlCi0gICAgbGVmdCBhdCB0aGVpciBkZWZhdWx0IHZhbHVlIChhcyBzcGVjaWZpZWQgYnkgdGhlCi0gICAgXGNsYXNze0RvY1Rlc3RSdW5uZXJ9J3MgXG1lbWJlcntvcHRpb25mbGFnc30pLgotICAgIEJ5IGRlZmF1bHQsIG5vIG9wdGlvbnMgYXJlIHNldC4KLVxlbmR7bWVtYmVyZGVzY30KLQotXHN1YnN1YnNlY3Rpb257RG9jVGVzdEZpbmRlciBvYmplY3RzXGxhYmVse2RvY3Rlc3QtRG9jVGVzdEZpbmRlcn19Ci1cYmVnaW57Y2xhc3NkZXNjfXtEb2NUZXN0RmluZGVyfXtcb3B0aW9uYWx7dmVyYm9zZX1cb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJ9XG9wdGlvbmFseywgcmVjdXJzZX1cb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlX2VtcHR5fX0KLSAgICBBIHByb2Nlc3NpbmcgY2xhc3MgdXNlZCB0byBleHRyYWN0IHRoZSBcY2xhc3N7RG9jVGVzdH1zIHRoYXQgYXJlCi0gICAgcmVsZXZhbnQgdG8gYSBnaXZlbiBvYmplY3QsIGZyb20gaXRzIGRvY3N0cmluZyBhbmQgdGhlIGRvY3N0cmluZ3MKLSAgICBvZiBpdHMgY29udGFpbmVkIG9iamVjdHMuICBcY2xhc3N7RG9jVGVzdH1zIGNhbiBjdXJyZW50bHkgYmUKLSAgICBleHRyYWN0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIG9iamVjdCB0eXBlczogbW9kdWxlcywgZnVuY3Rpb25zLAotICAgIGNsYXNzZXMsIG1ldGhvZHMsIHN0YXRpY21ldGhvZHMsIGNsYXNzbWV0aG9kcywgYW5kIHByb3BlcnRpZXMuCi0KLSAgICBUaGUgb3B0aW9uYWwgYXJndW1lbnQgXHZhcnt2ZXJib3NlfSBjYW4gYmUgdXNlZCB0byBkaXNwbGF5IHRoZQotICAgIG9iamVjdHMgc2VhcmNoZWQgYnkgdGhlIGZpbmRlci4gIEl0IGRlZmF1bHRzIHRvIFxjb2Rle0ZhbHNlfSAobm8KLSAgICBvdXRwdXQpLgotCi0gICAgVGhlIG9wdGlvbmFsIGFyZ3VtZW50IFx2YXJ7cGFyc2VyfSBzcGVjaWZpZXMgdGhlCi0gICAgXGNsYXNze0RvY1Rlc3RQYXJzZXJ9IG9iamVjdCAob3IgYSBkcm9wLWluIHJlcGxhY2VtZW50KSB0aGF0IGlzCi0gICAgdXNlZCB0byBleHRyYWN0IGRvY3Rlc3RzIGZyb20gZG9jc3RyaW5ncy4KLQotICAgIElmIHRoZSBvcHRpb25hbCBhcmd1bWVudCBcdmFye3JlY3Vyc2V9IGlzIGZhbHNlLCB0aGVuCi0gICAgXG1ldGhvZHtEb2NUZXN0RmluZGVyLmZpbmQoKX0gd2lsbCBvbmx5IGV4YW1pbmUgdGhlIGdpdmVuIG9iamVjdCwKLSAgICBhbmQgbm90IGFueSBjb250YWluZWQgb2JqZWN0cy4KLQotICAgIElmIHRoZSBvcHRpb25hbCBhcmd1bWVudCBcdmFye2V4Y2x1ZGVfZW1wdHl9IGlzIGZhbHNlLCB0aGVuCi0gICAgXG1ldGhvZHtEb2NUZXN0RmluZGVyLmZpbmQoKX0gd2lsbCBpbmNsdWRlIHRlc3RzIGZvciBvYmplY3RzIHdpdGgKLSAgICBlbXB0eSBkb2NzdHJpbmdzLgotCi0gICAgXHZlcnNpb25hZGRlZHsyLjR9Ci1cZW5ke2NsYXNzZGVzY30KLQotXGNsYXNze0RvY1Rlc3RGaW5kZXJ9IGRlZmluZXMgdGhlIGZvbGxvd2luZyBtZXRob2Q6Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtmaW5kfXtvYmpcb3B0aW9uYWx7LCBuYW1lfVxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgbW9kdWxlfVxvcHRpb25hbHssIGdsb2JzfVxvcHRpb25hbHssIGV4dHJhZ2xvYnN9fQotICAgIFJldHVybiBhIGxpc3Qgb2YgdGhlIFxjbGFzc3tEb2NUZXN0fXMgdGhhdCBhcmUgZGVmaW5lZCBieQotICAgIFx2YXJ7b2JqfSdzIGRvY3N0cmluZywgb3IgYnkgYW55IG9mIGl0cyBjb250YWluZWQgb2JqZWN0cycKLSAgICBkb2NzdHJpbmdzLgotCi0gICAgVGhlIG9wdGlvbmFsIGFyZ3VtZW50IFx2YXJ7bmFtZX0gc3BlY2lmaWVzIHRoZSBvYmplY3QncyBuYW1lOyB0aGlzCi0gICAgbmFtZSB3aWxsIGJlIHVzZWQgdG8gY29uc3RydWN0IG5hbWVzIGZvciB0aGUgcmV0dXJuZWQKLSAgICBcY2xhc3N7RG9jVGVzdH1zLiAgSWYgXHZhcntuYW1lfSBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuCi0gICAgXGNvZGV7XHZhcntvYmp9Ll9fbmFtZV9ffSBpcyB1c2VkLgotCi0gICAgVGhlIG9wdGlvbmFsIHBhcmFtZXRlciBcdmFye21vZHVsZX0gaXMgdGhlIG1vZHVsZSB0aGF0IGNvbnRhaW5zCi0gICAgdGhlIGdpdmVuIG9iamVjdC4gIElmIHRoZSBtb2R1bGUgaXMgbm90IHNwZWNpZmllZCBvciBpcyBOb25lLCB0aGVuCi0gICAgdGhlIHRlc3QgZmluZGVyIHdpbGwgYXR0ZW1wdCB0byBhdXRvbWF0aWNhbGx5IGRldGVybWluZSB0aGUKLSAgICBjb3JyZWN0IG1vZHVsZS4gIFRoZSBvYmplY3QncyBtb2R1bGUgaXMgdXNlZDoKLQotICAgIFxiZWdpbntpdGVtaXplfQotICAgIFxpdGVtIEFzIGEgZGVmYXVsdCBuYW1lc3BhY2UsIGlmIFx2YXJ7Z2xvYnN9IGlzIG5vdCBzcGVjaWZpZWQuCi0gICAgXGl0ZW0gVG8gcHJldmVudCB0aGUgRG9jVGVzdEZpbmRlciBmcm9tIGV4dHJhY3RpbmcgRG9jVGVzdHMKLSAgICAgICAgICBmcm9tIG9iamVjdHMgdGhhdCBhcmUgaW1wb3J0ZWQgZnJvbSBvdGhlciBtb2R1bGVzLiAgKENvbnRhaW5lZAotICAgICAgICAgIG9iamVjdHMgd2l0aCBtb2R1bGVzIG90aGVyIHRoYW4gXHZhcnttb2R1bGV9IGFyZSBpZ25vcmVkLikKLSAgICBcaXRlbSBUbyBmaW5kIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIG9iamVjdC4KLSAgICBcaXRlbSBUbyBoZWxwIGZpbmQgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBvYmplY3Qgd2l0aGluIGl0cyBmaWxlLgotICAgIFxlbmR7aXRlbWl6ZX0KLQotICAgIElmIFx2YXJ7bW9kdWxlfSBpcyBcY29kZXtGYWxzZX0sIG5vIGF0dGVtcHQgdG8gZmluZCB0aGUgbW9kdWxlCi0gICAgd2lsbCBiZSBtYWRlLiAgVGhpcyBpcyBvYnNjdXJlLCBvZiB1c2UgbW9zdGx5IGluIHRlc3RpbmcgZG9jdGVzdAotICAgIGl0c2VsZjogaWYgXHZhcnttb2R1bGV9IGlzIFxjb2Rle0ZhbHNlfSwgb3IgaXMgXGNvZGV7Tm9uZX0gYnV0Ci0gICAgY2Fubm90IGJlIGZvdW5kIGF1dG9tYXRpY2FsbHksIHRoZW4gYWxsIG9iamVjdHMgYXJlIGNvbnNpZGVyZWQgdG8KLSAgICBiZWxvbmcgdG8gdGhlIChub24tZXhpc3RlbnQpIG1vZHVsZSwgc28gYWxsIGNvbnRhaW5lZCBvYmplY3RzIHdpbGwKLSAgICAocmVjdXJzaXZlbHkpIGJlIHNlYXJjaGVkIGZvciBkb2N0ZXN0cy4KLQotICAgIFRoZSBnbG9iYWxzIGZvciBlYWNoIFxjbGFzc3tEb2NUZXN0fSBpcyBmb3JtZWQgYnkgY29tYmluaW5nCi0gICAgXHZhcntnbG9ic30gYW5kIFx2YXJ7ZXh0cmFnbG9ic30gKGJpbmRpbmdzIGluIFx2YXJ7ZXh0cmFnbG9ic30KLSAgICBvdmVycmlkZSBiaW5kaW5ncyBpbiBcdmFye2dsb2JzfSkuICBBIG5ldyBzaGFsbG93IGNvcHkgb2YgdGhlIGdsb2JhbHMKLSAgICBkaWN0aW9uYXJ5IGlzIGNyZWF0ZWQgZm9yIGVhY2ggXGNsYXNze0RvY1Rlc3R9LiAgSWYgXHZhcntnbG9ic30gaXMKLSAgICBub3Qgc3BlY2lmaWVkLCB0aGVuIGl0IGRlZmF1bHRzIHRvIHRoZSBtb2R1bGUncyBcdmFye19fZGljdF9ffSwgaWYKLSAgICBzcGVjaWZpZWQsIG9yIFxjb2Rle1x7XH19IG90aGVyd2lzZS4gIElmIFx2YXJ7ZXh0cmFnbG9ic30gaXMgbm90Ci0gICAgc3BlY2lmaWVkLCB0aGVuIGl0IGRlZmF1bHRzIHRvIFxjb2Rle1x7XH19LgotXGVuZHttZXRob2RkZXNjfQotCi1cc3Vic3Vic2VjdGlvbntEb2NUZXN0UGFyc2VyIG9iamVjdHNcbGFiZWx7ZG9jdGVzdC1Eb2NUZXN0UGFyc2VyfX0KLVxiZWdpbntjbGFzc2Rlc2N9e0RvY1Rlc3RQYXJzZXJ9e30KLSAgICBBIHByb2Nlc3NpbmcgY2xhc3MgdXNlZCB0byBleHRyYWN0IGludGVyYWN0aXZlIGV4YW1wbGVzIGZyb20gYQotICAgIHN0cmluZywgYW5kIHVzZSB0aGVtIHRvIGNyZWF0ZSBhIFxjbGFzc3tEb2NUZXN0fSBvYmplY3QuCi0gICAgXHZlcnNpb25hZGRlZHsyLjR9Ci1cZW5ke2NsYXNzZGVzY30KLQotXGNsYXNze0RvY1Rlc3RQYXJzZXJ9IGRlZmluZXMgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotCi1cYmVnaW57bWV0aG9kZGVzY317Z2V0X2RvY3Rlc3R9e3N0cmluZywgZ2xvYnMsIG5hbWUsIGZpbGVuYW1lLCBsaW5lbm99Ci0gICAgRXh0cmFjdCBhbGwgZG9jdGVzdCBleGFtcGxlcyBmcm9tIHRoZSBnaXZlbiBzdHJpbmcsIGFuZCBjb2xsZWN0Ci0gICAgdGhlbSBpbnRvIGEgXGNsYXNze0RvY1Rlc3R9IG9iamVjdC4KLQotICAgIFx2YXJ7Z2xvYnN9LCBcdmFye25hbWV9LCBcdmFye2ZpbGVuYW1lfSwgYW5kIFx2YXJ7bGluZW5vfSBhcmUKLSAgICBhdHRyaWJ1dGVzIGZvciB0aGUgbmV3IFxjbGFzc3tEb2NUZXN0fSBvYmplY3QuICBTZWUgdGhlCi0gICAgZG9jdW1lbnRhdGlvbiBmb3IgXGNsYXNze0RvY1Rlc3R9IGZvciBtb3JlIGluZm9ybWF0aW9uLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Z2V0X2V4YW1wbGVzfXtzdHJpbmdcb3B0aW9uYWx7LCBuYW1lfX0KLSAgICBFeHRyYWN0IGFsbCBkb2N0ZXN0IGV4YW1wbGVzIGZyb20gdGhlIGdpdmVuIHN0cmluZywgYW5kIHJldHVybgotICAgIHRoZW0gYXMgYSBsaXN0IG9mIFxjbGFzc3tFeGFtcGxlfSBvYmplY3RzLiAgTGluZSBudW1iZXJzIGFyZQotICAgIDAtYmFzZWQuICBUaGUgb3B0aW9uYWwgYXJndW1lbnQgXHZhcntuYW1lfSBpcyBhIG5hbWUgaWRlbnRpZnlpbmcKLSAgICB0aGlzIHN0cmluZywgYW5kIGlzIG9ubHkgdXNlZCBmb3IgZXJyb3IgbWVzc2FnZXMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtwYXJzZX17c3RyaW5nXG9wdGlvbmFseywgbmFtZX19Ci0gICAgRGl2aWRlIHRoZSBnaXZlbiBzdHJpbmcgaW50byBleGFtcGxlcyBhbmQgaW50ZXJ2ZW5pbmcgdGV4dCwgYW5kCi0gICAgcmV0dXJuIHRoZW0gYXMgYSBsaXN0IG9mIGFsdGVybmF0aW5nIFxjbGFzc3tFeGFtcGxlfXMgYW5kIHN0cmluZ3MuCi0gICAgTGluZSBudW1iZXJzIGZvciB0aGUgXGNsYXNze0V4YW1wbGV9cyBhcmUgMC1iYXNlZC4gIFRoZSBvcHRpb25hbAotICAgIGFyZ3VtZW50IFx2YXJ7bmFtZX0gaXMgYSBuYW1lIGlkZW50aWZ5aW5nIHRoaXMgc3RyaW5nLCBhbmQgaXMgb25seQotICAgIHVzZWQgZm9yIGVycm9yIG1lc3NhZ2VzLgotXGVuZHttZXRob2RkZXNjfQotCi1cc3Vic3Vic2VjdGlvbntEb2NUZXN0UnVubmVyIG9iamVjdHNcbGFiZWx7ZG9jdGVzdC1Eb2NUZXN0UnVubmVyfX0KLVxiZWdpbntjbGFzc2Rlc2N9e0RvY1Rlc3RSdW5uZXJ9e1xvcHRpb25hbHtjaGVja2VyfVxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlfVxvcHRpb25hbHssIG9wdGlvbmZsYWdzfX0KLSAgICBBIHByb2Nlc3NpbmcgY2xhc3MgdXNlZCB0byBleGVjdXRlIGFuZCB2ZXJpZnkgdGhlIGludGVyYWN0aXZlCi0gICAgZXhhbXBsZXMgaW4gYSBcY2xhc3N7RG9jVGVzdH0uCi0KLSAgICBUaGUgY29tcGFyaXNvbiBiZXR3ZWVuIGV4cGVjdGVkIG91dHB1dHMgYW5kIGFjdHVhbCBvdXRwdXRzIGlzIGRvbmUKLSAgICBieSBhbiBcY2xhc3N7T3V0cHV0Q2hlY2tlcn0uICBUaGlzIGNvbXBhcmlzb24gbWF5IGJlIGN1c3RvbWl6ZWQKLSAgICB3aXRoIGEgbnVtYmVyIG9mIG9wdGlvbiBmbGFnczsgc2VlIHNlY3Rpb25+XHJlZntkb2N0ZXN0LW9wdGlvbnN9Ci0gICAgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBJZiB0aGUgb3B0aW9uIGZsYWdzIGFyZSBpbnN1ZmZpY2llbnQsIHRoZW4KLSAgICB0aGUgY29tcGFyaXNvbiBtYXkgYWxzbyBiZSBjdXN0b21pemVkIGJ5IHBhc3NpbmcgYSBzdWJjbGFzcyBvZgotICAgIFxjbGFzc3tPdXRwdXRDaGVja2VyfSB0byB0aGUgY29uc3RydWN0b3IuCi0KLSAgICBUaGUgdGVzdCBydW5uZXIncyBkaXNwbGF5IG91dHB1dCBjYW4gYmUgY29udHJvbGxlZCBpbiB0d28gd2F5cy4KLSAgICBGaXJzdCwgYW4gb3V0cHV0IGZ1bmN0aW9uIGNhbiBiZSBwYXNzZWQgdG8KLSAgICBcbWV0aG9ke1Rlc3RSdW5uZXIucnVuKCl9OyB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGgKLSAgICBzdHJpbmdzIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZC4gIEl0IGRlZmF1bHRzIHRvCi0gICAgXGNvZGV7c3lzLnN0ZG91dC53cml0ZX0uICBJZiBjYXB0dXJpbmcgdGhlIG91dHB1dCBpcyBub3QKLSAgICBzdWZmaWNpZW50LCB0aGVuIHRoZSBkaXNwbGF5IG91dHB1dCBjYW4gYmUgYWxzbyBjdXN0b21pemVkIGJ5Ci0gICAgc3ViY2xhc3NpbmcgRG9jVGVzdFJ1bm5lciwgYW5kIG92ZXJyaWRpbmcgdGhlIG1ldGhvZHMKLSAgICBcbWV0aG9ke3JlcG9ydF9zdGFydH0sIFxtZXRob2R7cmVwb3J0X3N1Y2Nlc3N9LAotICAgIFxtZXRob2R7cmVwb3J0X3VuZXhwZWN0ZWRfZXhjZXB0aW9ufSwgYW5kIFxtZXRob2R7cmVwb3J0X2ZhaWx1cmV9LgotCi0gICAgVGhlIG9wdGlvbmFsIGtleXdvcmQgYXJndW1lbnQgXHZhcntjaGVja2VyfSBzcGVjaWZpZXMgdGhlCi0gICAgXGNsYXNze091dHB1dENoZWNrZXJ9IG9iamVjdCAob3IgZHJvcC1pbiByZXBsYWNlbWVudCkgdGhhdCBzaG91bGQKLSAgICBiZSB1c2VkIHRvIGNvbXBhcmUgdGhlIGV4cGVjdGVkIG91dHB1dHMgdG8gdGhlIGFjdHVhbCBvdXRwdXRzIG9mCi0gICAgZG9jdGVzdCBleGFtcGxlcy4KLQotICAgIFRoZSBvcHRpb25hbCBrZXl3b3JkIGFyZ3VtZW50IFx2YXJ7dmVyYm9zZX0gY29udHJvbHMgdGhlCi0gICAgXGNsYXNze0RvY1Rlc3RSdW5uZXJ9J3MgdmVyYm9zaXR5LiAgSWYgXHZhcnt2ZXJib3NlfSBpcwotICAgIFxjb2Rle1RydWV9LCB0aGVuIGluZm9ybWF0aW9uIGlzIHByaW50ZWQgYWJvdXQgZWFjaCBleGFtcGxlLCBhcyBpdAotICAgIGlzIHJ1bi4gIElmIFx2YXJ7dmVyYm9zZX0gaXMgXGNvZGV7RmFsc2V9LCB0aGVuIG9ubHkgZmFpbHVyZXMgYXJlCi0gICAgcHJpbnRlZC4gIElmIFx2YXJ7dmVyYm9zZX0gaXMgdW5zcGVjaWZpZWQsIG9yIFxjb2Rle05vbmV9LCB0aGVuCi0gICAgdmVyYm9zZSBvdXRwdXQgaXMgdXNlZCBpZmYgdGhlIGNvbW1hbmQtbGluZSBzd2l0Y2ggXHByb2dyYW1vcHR7LXZ9Ci0gICAgaXMgdXNlZC4KLQotICAgIFRoZSBvcHRpb25hbCBrZXl3b3JkIGFyZ3VtZW50IFx2YXJ7b3B0aW9uZmxhZ3N9IGNhbiBiZSB1c2VkIHRvCi0gICAgY29udHJvbCBob3cgdGhlIHRlc3QgcnVubmVyIGNvbXBhcmVzIGV4cGVjdGVkIG91dHB1dCB0byBhY3R1YWwKLSAgICBvdXRwdXQsIGFuZCBob3cgaXQgZGlzcGxheXMgZmFpbHVyZXMuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlCi0gICAgc2VjdGlvbn5ccmVme2RvY3Rlc3Qtb3B0aW9uc30uCi0KLSAgICBcdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7Y2xhc3NkZXNjfQotCi1cY2xhc3N7RG9jVGVzdFBhcnNlcn0gZGVmaW5lcyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtyZXBvcnRfc3RhcnR9e291dCwgdGVzdCwgZXhhbXBsZX0KLSAgICBSZXBvcnQgdGhhdCB0aGUgdGVzdCBydW5uZXIgaXMgYWJvdXQgdG8gcHJvY2VzcyB0aGUgZ2l2ZW4gZXhhbXBsZS4KLSAgICBUaGlzIG1ldGhvZCBpcyBwcm92aWRlZCB0byBhbGxvdyBzdWJjbGFzc2VzIG9mCi0gICAgXGNsYXNze0RvY1Rlc3RSdW5uZXJ9IHRvIGN1c3RvbWl6ZSB0aGVpciBvdXRwdXQ7IGl0IHNob3VsZCBub3QgYmUKLSAgICBjYWxsZWQgZGlyZWN0bHkuCi0KLSAgICBcdmFye2V4YW1wbGV9IGlzIHRoZSBleGFtcGxlIGFib3V0IHRvIGJlIHByb2Nlc3NlZC4gIFx2YXJ7dGVzdH0gaXMKLSAgICB0aGUgdGVzdCBjb250YWluaW5nIFx2YXJ7ZXhhbXBsZX0uICBcdmFye291dH0gaXMgdGhlIG91dHB1dAotICAgIGZ1bmN0aW9uIHRoYXQgd2FzIHBhc3NlZCB0byBcbWV0aG9ke0RvY1Rlc3RSdW5uZXIucnVuKCl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317cmVwb3J0X3N1Y2Nlc3N9e291dCwgdGVzdCwgZXhhbXBsZSwgZ290fQotICAgIFJlcG9ydCB0aGF0IHRoZSBnaXZlbiBleGFtcGxlIHJhbiBzdWNjZXNzZnVsbHkuICBUaGlzIG1ldGhvZCBpcwotICAgIHByb3ZpZGVkIHRvIGFsbG93IHN1YmNsYXNzZXMgb2YgXGNsYXNze0RvY1Rlc3RSdW5uZXJ9IHRvIGN1c3RvbWl6ZQotICAgIHRoZWlyIG91dHB1dDsgaXQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuCi0KLSAgICBcdmFye2V4YW1wbGV9IGlzIHRoZSBleGFtcGxlIGFib3V0IHRvIGJlIHByb2Nlc3NlZC4gIFx2YXJ7Z290fSBpcwotICAgIHRoZSBhY3R1YWwgb3V0cHV0IGZyb20gdGhlIGV4YW1wbGUuICBcdmFye3Rlc3R9IGlzIHRoZSB0ZXN0Ci0gICAgY29udGFpbmluZyBcdmFye2V4YW1wbGV9LiAgXHZhcntvdXR9IGlzIHRoZSBvdXRwdXQgZnVuY3Rpb24gdGhhdAotICAgIHdhcyBwYXNzZWQgdG8gXG1ldGhvZHtEb2NUZXN0UnVubmVyLnJ1bigpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3JlcG9ydF9mYWlsdXJlfXtvdXQsIHRlc3QsIGV4YW1wbGUsIGdvdH0KLSAgICBSZXBvcnQgdGhhdCB0aGUgZ2l2ZW4gZXhhbXBsZSBmYWlsZWQuICBUaGlzIG1ldGhvZCBpcyBwcm92aWRlZCB0bwotICAgIGFsbG93IHN1YmNsYXNzZXMgb2YgXGNsYXNze0RvY1Rlc3RSdW5uZXJ9IHRvIGN1c3RvbWl6ZSB0aGVpcgotICAgIG91dHB1dDsgaXQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuCi0KLSAgICBcdmFye2V4YW1wbGV9IGlzIHRoZSBleGFtcGxlIGFib3V0IHRvIGJlIHByb2Nlc3NlZC4gIFx2YXJ7Z290fSBpcwotICAgIHRoZSBhY3R1YWwgb3V0cHV0IGZyb20gdGhlIGV4YW1wbGUuICBcdmFye3Rlc3R9IGlzIHRoZSB0ZXN0Ci0gICAgY29udGFpbmluZyBcdmFye2V4YW1wbGV9LiAgXHZhcntvdXR9IGlzIHRoZSBvdXRwdXQgZnVuY3Rpb24gdGhhdAotICAgIHdhcyBwYXNzZWQgdG8gXG1ldGhvZHtEb2NUZXN0UnVubmVyLnJ1bigpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3JlcG9ydF91bmV4cGVjdGVkX2V4Y2VwdGlvbn17b3V0LCB0ZXN0LCBleGFtcGxlLCBleGNfaW5mb30KLSAgICBSZXBvcnQgdGhhdCB0aGUgZ2l2ZW4gZXhhbXBsZSByYWlzZWQgYW4gdW5leHBlY3RlZCBleGNlcHRpb24uCi0gICAgVGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgdG8gYWxsb3cgc3ViY2xhc3NlcyBvZgotICAgIFxjbGFzc3tEb2NUZXN0UnVubmVyfSB0byBjdXN0b21pemUgdGhlaXIgb3V0cHV0OyBpdCBzaG91bGQgbm90IGJlCi0gICAgY2FsbGVkIGRpcmVjdGx5LgotCi0gICAgXHZhcntleGFtcGxlfSBpcyB0aGUgZXhhbXBsZSBhYm91dCB0byBiZSBwcm9jZXNzZWQuCi0gICAgXHZhcntleGNfaW5mb30gaXMgYSB0dXBsZSBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZQotICAgIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIChhcyByZXR1cm5lZCBieSBcZnVuY3Rpb257c3lzLmV4Y19pbmZvKCl9KS4KLSAgICBcdmFye3Rlc3R9IGlzIHRoZSB0ZXN0IGNvbnRhaW5pbmcgXHZhcntleGFtcGxlfS4gIFx2YXJ7b3V0fSBpcyB0aGUKLSAgICBvdXRwdXQgZnVuY3Rpb24gdGhhdCB3YXMgcGFzc2VkIHRvIFxtZXRob2R7RG9jVGVzdFJ1bm5lci5ydW4oKX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtydW59e3Rlc3Rcb3B0aW9uYWx7LCBjb21waWxlZmxhZ3N9XG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dH1cb3B0aW9uYWx7LCBjbGVhcl9nbG9ic319Ci0gICAgUnVuIHRoZSBleGFtcGxlcyBpbiBcdmFye3Rlc3R9IChhIFxjbGFzc3tEb2NUZXN0fSBvYmplY3QpLCBhbmQKLSAgICBkaXNwbGF5IHRoZSByZXN1bHRzIHVzaW5nIHRoZSB3cml0ZXIgZnVuY3Rpb24gXHZhcntvdXR9LgotCi0gICAgVGhlIGV4YW1wbGVzIGFyZSBydW4gaW4gdGhlIG5hbWVzcGFjZSBcY29kZXt0ZXN0Lmdsb2JzfS4gIElmCi0gICAgXHZhcntjbGVhcl9nbG9ic30gaXMgdHJ1ZSAodGhlIGRlZmF1bHQpLCB0aGVuIHRoaXMgbmFtZXNwYWNlIHdpbGwKLSAgICBiZSBjbGVhcmVkIGFmdGVyIHRoZSB0ZXN0IHJ1bnMsIHRvIGhlbHAgd2l0aCBnYXJiYWdlIGNvbGxlY3Rpb24uCi0gICAgSWYgeW91IHdvdWxkIGxpa2UgdG8gZXhhbWluZSB0aGUgbmFtZXNwYWNlIGFmdGVyIHRoZSB0ZXN0Ci0gICAgY29tcGxldGVzLCB0aGVuIHVzZSBcdmFye2NsZWFyX2dsb2JzPUZhbHNlfS4KLQotICAgIFx2YXJ7Y29tcGlsZWZsYWdzfSBnaXZlcyB0aGUgc2V0IG9mIGZsYWdzIHRoYXQgc2hvdWxkIGJlIHVzZWQgYnkKLSAgICB0aGUgUHl0aG9uIGNvbXBpbGVyIHdoZW4gcnVubmluZyB0aGUgZXhhbXBsZXMuICBJZiBub3Qgc3BlY2lmaWVkLAotICAgIHRoZW4gaXQgd2lsbCBkZWZhdWx0IHRvIHRoZSBzZXQgb2YgZnV0dXJlLWltcG9ydCBmbGFncyB0aGF0IGFwcGx5Ci0gICAgdG8gXHZhcntnbG9ic30uCi0KLSAgICBUaGUgb3V0cHV0IG9mIGVhY2ggZXhhbXBsZSBpcyBjaGVja2VkIHVzaW5nIHRoZQotICAgIFxjbGFzc3tEb2NUZXN0UnVubmVyfSdzIG91dHB1dCBjaGVja2VyLCBhbmQgdGhlIHJlc3VsdHMgYXJlCi0gICAgZm9ybWF0dGVkIGJ5IHRoZSBcbWV0aG9ke0RvY1Rlc3RSdW5uZXIucmVwb3J0Xyp9IG1ldGhvZHMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtzdW1tYXJpemV9e1xvcHRpb25hbHt2ZXJib3NlfX0KLSAgICBQcmludCBhIHN1bW1hcnkgb2YgYWxsIHRoZSB0ZXN0IGNhc2VzIHRoYXQgaGF2ZSBiZWVuIHJ1biBieSB0aGlzCi0gICAgRG9jVGVzdFJ1bm5lciwgYW5kIHJldHVybiBhIHR1cGxlIFxzYW1weyhcdmFye2ZhaWx1cmVfY291bnR9LAotICAgIFx2YXJ7dGVzdF9jb3VudH0pfS4KLQotICAgIFRoZSBvcHRpb25hbCBcdmFye3ZlcmJvc2V9IGFyZ3VtZW50IGNvbnRyb2xzIGhvdyBkZXRhaWxlZCB0aGUKLSAgICBzdW1tYXJ5IGlzLiAgSWYgdGhlIHZlcmJvc2l0eSBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRoZQotICAgIFxjbGFzc3tEb2NUZXN0UnVubmVyfSdzIHZlcmJvc2l0eSBpcyB1c2VkLgotXGVuZHttZXRob2RkZXNjfQotCi1cc3Vic3Vic2VjdGlvbntPdXRwdXRDaGVja2VyIG9iamVjdHNcbGFiZWx7ZG9jdGVzdC1PdXRwdXRDaGVja2VyfX0KLQotXGJlZ2lue2NsYXNzZGVzY317T3V0cHV0Q2hlY2tlcn17fQotICAgIEEgY2xhc3MgdXNlZCB0byBjaGVjayB0aGUgd2hldGhlciB0aGUgYWN0dWFsIG91dHB1dCBmcm9tIGEgZG9jdGVzdAotICAgIGV4YW1wbGUgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgb3V0cHV0LiAgXGNsYXNze091dHB1dENoZWNrZXJ9Ci0gICAgZGVmaW5lcyB0d28gbWV0aG9kczogXG1ldGhvZHtjaGVja19vdXRwdXR9LCB3aGljaCBjb21wYXJlcyBhIGdpdmVuCi0gICAgcGFpciBvZiBvdXRwdXRzLCBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZXkgbWF0Y2g7IGFuZAotICAgIFxtZXRob2R7b3V0cHV0X2RpZmZlcmVuY2V9LCB3aGljaCByZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlCi0gICAgZGlmZmVyZW5jZXMgYmV0d2VlbiB0d28gb3V0cHV0cy4KLSAgICBcdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7Y2xhc3NkZXNjfQotCi1cY2xhc3N7T3V0cHV0Q2hlY2tlcn0gZGVmaW5lcyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtjaGVja19vdXRwdXR9e3dhbnQsIGdvdCwgb3B0aW9uZmxhZ3N9Ci0gICAgUmV0dXJuIFxjb2Rle1RydWV9IGlmZiB0aGUgYWN0dWFsIG91dHB1dCBmcm9tIGFuIGV4YW1wbGUKLSAgICAoXHZhcntnb3R9KSBtYXRjaGVzIHRoZSBleHBlY3RlZCBvdXRwdXQgKFx2YXJ7d2FudH0pLiAgVGhlc2UKLSAgICBzdHJpbmdzIGFyZSBhbHdheXMgY29uc2lkZXJlZCB0byBtYXRjaCBpZiB0aGV5IGFyZSBpZGVudGljYWw7IGJ1dAotICAgIGRlcGVuZGluZyBvbiB3aGF0IG9wdGlvbiBmbGFncyB0aGUgdGVzdCBydW5uZXIgaXMgdXNpbmcsIHNldmVyYWwKLSAgICBub24tZXhhY3QgbWF0Y2ggdHlwZXMgYXJlIGFsc28gcG9zc2libGUuICBTZWUKLSAgICBzZWN0aW9uflxyZWZ7ZG9jdGVzdC1vcHRpb25zfSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBvcHRpb24KLSAgICBmbGFncy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e291dHB1dF9kaWZmZXJlbmNlfXtleGFtcGxlLCBnb3QsIG9wdGlvbmZsYWdzfQotICAgIFJldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBleHBlY3RlZAotICAgIG91dHB1dCBmb3IgYSBnaXZlbiBleGFtcGxlIChcdmFye2V4YW1wbGV9KSBhbmQgdGhlIGFjdHVhbCBvdXRwdXQKLSAgICAoXHZhcntnb3R9KS4gIFx2YXJ7b3B0aW9uZmxhZ3N9IGlzIHRoZSBzZXQgb2Ygb3B0aW9uIGZsYWdzIHVzZWQgdG8KLSAgICBjb21wYXJlIFx2YXJ7d2FudH0gYW5kIFx2YXJ7Z290fS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXHN1YnNlY3Rpb257RGVidWdnaW5nXGxhYmVse2RvY3Rlc3QtZGVidWdnaW5nfX0KLQotRG9jdGVzdCBwcm92aWRlcyBzZXZlcmFsIG1lY2hhbmlzbXMgZm9yIGRlYnVnZ2luZyBkb2N0ZXN0IGV4YW1wbGVzOgotCi1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtIFNldmVyYWwgZnVuY3Rpb25zIGNvbnZlcnQgZG9jdGVzdHMgdG8gZXhlY3V0YWJsZSBQeXRob24KLSAgICAgIHByb2dyYW1zLCB3aGljaCBjYW4gYmUgcnVuIHVuZGVyIHRoZSBQeXRob24gZGVidWdnZXIsIFxyZWZtb2R1bGV7cGRifS4KLVxpdGVtIFRoZSBcY2xhc3N7RGVidWdSdW5uZXJ9IGNsYXNzIGlzIGEgc3ViY2xhc3Mgb2YKLSAgICAgIFxjbGFzc3tEb2NUZXN0UnVubmVyfSB0aGF0IHJhaXNlcyBhbiBleGNlcHRpb24gZm9yIHRoZSBmaXJzdAotICAgICAgZmFpbGluZyBleGFtcGxlLCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoYXQgZXhhbXBsZS4KLSAgICAgIFRoaXMgaW5mb3JtYXRpb24gY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSBwb3N0LW1vcnRlbSBkZWJ1Z2dpbmcgb24KLSAgICAgIHRoZSBleGFtcGxlLgotXGl0ZW0gVGhlIFxyZWZtb2R1bGV7dW5pdHRlc3R9IGNhc2VzIGdlbmVyYXRlZCBieSBcZnVuY3Rpb257RG9jVGVzdFN1aXRlKCl9Ci0gICAgICBzdXBwb3J0IHRoZSBcbWV0aG9ke2RlYnVnKCl9IG1ldGhvZCBkZWZpbmVkIGJ5Ci0gICAgICBcY2xhc3N7XHJlZm1vZHVsZXt1bml0dGVzdH0uVGVzdENhc2V9LgotXGl0ZW0gWW91IGNhbiBhZGQgYSBjYWxsIHRvIFxmdW5jdGlvbntccmVmbW9kdWxle3BkYn0uc2V0X3RyYWNlKCl9IGluIGEKLSAgICAgIGRvY3Rlc3QgZXhhbXBsZSwgYW5kIHlvdSdsbCBkcm9wIGludG8gdGhlIFB5dGhvbiBkZWJ1Z2dlciB3aGVuIHRoYXQKLSAgICAgIGxpbmUgaXMgZXhlY3V0ZWQuICBUaGVuIHlvdSBjYW4gaW5zcGVjdCBjdXJyZW50IHZhbHVlcyBvZiB2YXJpYWJsZXMsCi0gICAgICBhbmQgc28gb24uICBGb3IgZXhhbXBsZSwgc3VwcG9zZSBcZmlsZXthLnB5fSBjb250YWlucyBqdXN0IHRoaXMKLSAgICAgIG1vZHVsZSBkb2NzdHJpbmc6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSIiIgotPj4+IGRlZiBmKHgpOgotLi4uICAgICBnKHgqMikKLT4+PiBkZWYgZyh4KToKLS4uLiAgICAgcHJpbnQgeCszCi0uLi4gICAgIGltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UoKQotPj4+IGYoMykKLTkKLSIiIgotXGVuZHt2ZXJiYXRpbX0KLQotICAgICAgVGhlbiBhbiBpbnRlcmFjdGl2ZSBQeXRob24gc2Vzc2lvbiBtYXkgbG9vayBsaWtlIHRoaXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgYSwgZG9jdGVzdAotPj4+IGRvY3Rlc3QudGVzdG1vZChhKQotLS1SZXR1cm4tLQotPiA8ZG9jdGVzdCBhWzFdPigzKWcoKS0+Tm9uZQotLT4gaW1wb3J0IHBkYjsgcGRiLnNldF90cmFjZSgpCi0oUGRiKSBsaXN0Ci0gIDEgICAgIGRlZiBnKHgpOgotICAyICAgICAgICAgcHJpbnQgeCszCi0gIDMgIC0+ICAgICBpbXBvcnQgcGRiOyBwZGIuc2V0X3RyYWNlKCkKLVtFT0ZdCi0oUGRiKSBwcmludCB4Ci02Ci0oUGRiKSBzdGVwCi0tLVJldHVybi0tCi0+IDxkb2N0ZXN0IGFbMF0+KDIpZigpLT5Ob25lCi0tPiBnKHgqMikKLShQZGIpIGxpc3QKLSAgMSAgICAgZGVmIGYoeCk6Ci0gIDIgIC0+ICAgICBnKHgqMikKLVtFT0ZdCi0oUGRiKSBwcmludCB4Ci0zCi0oUGRiKSBzdGVwCi0tLVJldHVybi0tCi0+IDxkb2N0ZXN0IGFbMl0+KDEpPygpLT5Ob25lCi0tPiBmKDMpCi0oUGRiKSBjb250Ci0oMCwgMykKLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotICAgIFx2ZXJzaW9uY2hhbmdlZFtUaGUgYWJpbGl0eSB0byB1c2UgXGZ1bmN0aW9ue1xyZWZtb2R1bGV7cGRifS5zZXRfdHJhY2UoKX0KLSAgICAgICAgICAgICAgICAgICAgdXNlZnVsbHkgaW5zaWRlIGRvY3Rlc3RzIHdhcyBhZGRlZF17Mi40fQotXGVuZHtpdGVtaXplfQotCi1GdW5jdGlvbnMgdGhhdCBjb252ZXJ0IGRvY3Rlc3RzIHRvIFB5dGhvbiBjb2RlLCBhbmQgcG9zc2libHkgcnVuCi10aGUgc3ludGhlc2l6ZWQgY29kZSB1bmRlciB0aGUgZGVidWdnZXI6Ci0KLVxiZWdpbntmdW5jZGVzY317c2NyaXB0X2Zyb21fZXhhbXBsZXN9e3N9Ci0gIENvbnZlcnQgdGV4dCB3aXRoIGV4YW1wbGVzIHRvIGEgc2NyaXB0LgotCi0gIEFyZ3VtZW50IFx2YXJ7c30gaXMgYSBzdHJpbmcgY29udGFpbmluZyBkb2N0ZXN0IGV4YW1wbGVzLiAgVGhlIHN0cmluZwotICBpcyBjb252ZXJ0ZWQgdG8gYSBQeXRob24gc2NyaXB0LCB3aGVyZSBkb2N0ZXN0IGV4YW1wbGVzIGluIFx2YXJ7c30KLSAgYXJlIGNvbnZlcnRlZCB0byByZWd1bGFyIGNvZGUsIGFuZCBldmVyeXRoaW5nIGVsc2UgaXMgY29udmVydGVkIHRvCi0gIFB5dGhvbiBjb21tZW50cy4gIFRoZSBnZW5lcmF0ZWQgc2NyaXB0IGlzIHJldHVybmVkIGFzIGEgc3RyaW5nLgotICBGb3IgZXhhbXBsZSwKLQotICAgIFxiZWdpbnt2ZXJiYXRpbX0KLSAgICBpbXBvcnQgZG9jdGVzdAotICAgIHByaW50IGRvY3Rlc3Quc2NyaXB0X2Zyb21fZXhhbXBsZXMociIiIgotICAgICAgICBTZXQgeCBhbmQgeSB0byAxIGFuZCAyLgotICAgICAgICA+Pj4geCwgeSA9IDEsIDIKLQotICAgICAgICBQcmludCB0aGVpciBzdW06Ci0gICAgICAgID4+PiBwcmludCB4K3kKLSAgICAgICAgMwotICAgICIiIikKLSAgICBcZW5ke3ZlcmJhdGltfQotCi0gIGRpc3BsYXlzOgotCi0gICAgXGJlZ2lue3ZlcmJhdGltfQotICAgICMgU2V0IHggYW5kIHkgdG8gMSBhbmQgMi4KLSAgICB4LCB5ID0gMSwgMgotICAgICMKLSAgICAjIFByaW50IHRoZWlyIHN1bToKLSAgICBwcmludCB4K3kKLSAgICAjIEV4cGVjdGVkOgotICAgICMjIDMKLSAgICBcZW5ke3ZlcmJhdGltfQotCi0gIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IG90aGVyIGZ1bmN0aW9ucyAoc2VlIGJlbG93KSwgYnV0Ci0gIGNhbiBhbHNvIGJlIHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIHRyYW5zZm9ybSBhbiBpbnRlcmFjdGl2ZSBQeXRob24KLSAgc2Vzc2lvbiBpbnRvIGEgUHl0aG9uIHNjcmlwdC4KLQotICBcdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dGVzdHNvdXJjZX17bW9kdWxlLCBuYW1lfQotICAgQ29udmVydCB0aGUgZG9jdGVzdCBmb3IgYW4gb2JqZWN0IHRvIGEgc2NyaXB0LgotCi0gICBBcmd1bWVudCBcdmFye21vZHVsZX0gaXMgYSBtb2R1bGUgb2JqZWN0LCBvciBkb3R0ZWQgbmFtZSBvZiBhIG1vZHVsZSwKLSAgIGNvbnRhaW5pbmcgdGhlIG9iamVjdCB3aG9zZSBkb2N0ZXN0cyBhcmUgb2YgaW50ZXJlc3QuICBBcmd1bWVudAotICAgXHZhcntuYW1lfSBpcyB0aGUgbmFtZSAod2l0aGluIHRoZSBtb2R1bGUpIG9mIHRoZSBvYmplY3Qgd2l0aCB0aGUKLSAgIGRvY3Rlc3RzIG9mIGludGVyZXN0LiAgVGhlIHJlc3VsdCBpcyBhIHN0cmluZywgY29udGFpbmluZyB0aGUKLSAgIG9iamVjdCdzIGRvY3N0cmluZyBjb252ZXJ0ZWQgdG8gYSBQeXRob24gc2NyaXB0LCBhcyBkZXNjcmliZWQgZm9yCi0gICBcZnVuY3Rpb257c2NyaXB0X2Zyb21fZXhhbXBsZXMoKX0gYWJvdmUuICBGb3IgZXhhbXBsZSwgaWYgbW9kdWxlCi0gICBcZmlsZXthLnB5fSBjb250YWlucyBhIHRvcC1sZXZlbCBmdW5jdGlvbiBcZnVuY3Rpb257ZigpfSwgdGhlbgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgYSwgZG9jdGVzdAotcHJpbnQgZG9jdGVzdC50ZXN0c291cmNlKGEsICJhLmYiKQotXGVuZHt2ZXJiYXRpbX0KLQotICBwcmludHMgYSBzY3JpcHQgdmVyc2lvbiBvZiBmdW5jdGlvbiBcZnVuY3Rpb257ZigpfSdzIGRvY3N0cmluZywKLSAgd2l0aCBkb2N0ZXN0cyBjb252ZXJ0ZWQgdG8gY29kZSwgYW5kIHRoZSByZXN0IHBsYWNlZCBpbiBjb21tZW50cy4KLQotICBcdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZGVidWd9e21vZHVsZSwgbmFtZVxvcHRpb25hbHssIHBtfX0KLSAgRGVidWcgdGhlIGRvY3Rlc3RzIGZvciBhbiBvYmplY3QuCi0KLSAgVGhlIFx2YXJ7bW9kdWxlfSBhbmQgXHZhcntuYW1lfSBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIGZvciBmdW5jdGlvbgotICBcZnVuY3Rpb257dGVzdHNvdXJjZSgpfSBhYm92ZS4gIFRoZSBzeW50aGVzaXplZCBQeXRob24gc2NyaXB0IGZvciB0aGUKLSAgbmFtZWQgb2JqZWN0J3MgZG9jc3RyaW5nIGlzIHdyaXR0ZW4gdG8gYSB0ZW1wb3JhcnkgZmlsZSwgYW5kIHRoZW4gdGhhdAotICBmaWxlIGlzIHJ1biB1bmRlciB0aGUgY29udHJvbCBvZiB0aGUgUHl0aG9uIGRlYnVnZ2VyLCBccmVmbW9kdWxle3BkYn0uCi0KLSAgQSBzaGFsbG93IGNvcHkgb2YgXGNvZGV7XHZhcnttb2R1bGV9Ll9fZGljdF9ffSBpcyB1c2VkIGZvciBib3RoIGxvY2FsCi0gIGFuZCBnbG9iYWwgZXhlY3V0aW9uIGNvbnRleHQuCi0KLSAgT3B0aW9uYWwgYXJndW1lbnQgXHZhcntwbX0gY29udHJvbHMgd2hldGhlciBwb3N0LW1vcnRlbSBkZWJ1Z2dpbmcgaXMKLSAgdXNlZC4gIElmIFx2YXJ7cG19IGhhcyBhIHRydWUgdmFsdWUsIHRoZSBzY3JpcHQgZmlsZSBpcyBydW4gZGlyZWN0bHksIGFuZAotICB0aGUgZGVidWdnZXIgZ2V0cyBpbnZvbHZlZCBvbmx5IGlmIHRoZSBzY3JpcHQgdGVybWluYXRlcyB2aWEgcmFpc2luZyBhbgotICB1bmhhbmRsZWQgZXhjZXB0aW9uLiAgSWYgaXQgZG9lcywgdGhlbiBwb3N0LW1vcnRlbSBkZWJ1Z2dpbmcgaXMgaW52b2tlZCwKLSAgdmlhIFxmdW5jdGlvbntccmVmbW9kdWxle3BkYn0ucG9zdF9tb3J0ZW0oKX0sIHBhc3NpbmcgdGhlIHRyYWNlYmFjayBvYmplY3QKLSAgZnJvbSB0aGUgdW5oYW5kbGVkIGV4Y2VwdGlvbi4gIElmIFx2YXJ7cG19IGlzIG5vdCBzcGVjaWZpZWQsIG9yIGlzIGZhbHNlLAotICB0aGUgc2NyaXB0IGlzIHJ1biB1bmRlciB0aGUgZGVidWdnZXIgZnJvbSB0aGUgc3RhcnQsIHZpYSBwYXNzaW5nIGFuCi0gIGFwcHJvcHJpYXRlIFxmdW5jdGlvbntleGVjKCl9IGNhbGwgdG8gXGZ1bmN0aW9ue1xyZWZtb2R1bGV7cGRifS5ydW4oKX0uCi0KLSAgXHZlcnNpb25hZGRlZHsyLjN9Ci0KLSAgXHZlcnNpb25jaGFuZ2VkW1RoZSBcdmFye3BtfSBhcmd1bWVudCB3YXMgYWRkZWRdezIuNH0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZGVidWdfc3JjfXtzcmNcb3B0aW9uYWx7LCBwbX1cb3B0aW9uYWx7LCBnbG9ic319Ci0gIERlYnVnIHRoZSBkb2N0ZXN0cyBpbiBhIHN0cmluZy4KLQotICBUaGlzIGlzIGxpa2UgZnVuY3Rpb24gXGZ1bmN0aW9ue2RlYnVnKCl9IGFib3ZlLCBleGNlcHQgdGhhdAotICBhIHN0cmluZyBjb250YWluaW5nIGRvY3Rlc3QgZXhhbXBsZXMgaXMgc3BlY2lmaWVkIGRpcmVjdGx5LCB2aWEKLSAgdGhlIFx2YXJ7c3JjfSBhcmd1bWVudC4KLQotICBPcHRpb25hbCBhcmd1bWVudCBcdmFye3BtfSBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBpbiBmdW5jdGlvbgotICBcZnVuY3Rpb257ZGVidWcoKX0gYWJvdmUuCi0KLSAgT3B0aW9uYWwgYXJndW1lbnQgXHZhcntnbG9ic30gZ2l2ZXMgYSBkaWN0aW9uYXJ5IHRvIHVzZSBhcyBib3RoCi0gIGxvY2FsIGFuZCBnbG9iYWwgZXhlY3V0aW9uIGNvbnRleHQuICBJZiBub3Qgc3BlY2lmaWVkLCBvciBcY29kZXtOb25lfSwKLSAgYW4gZW1wdHkgZGljdGlvbmFyeSBpcyB1c2VkLiAgSWYgc3BlY2lmaWVkLCBhIHNoYWxsb3cgY29weSBvZiB0aGUKLSAgZGljdGlvbmFyeSBpcyB1c2VkLgotCi0gIFx2ZXJzaW9uYWRkZWR7Mi40fQotXGVuZHtmdW5jZGVzY30KLQotVGhlIFxjbGFzc3tEZWJ1Z1J1bm5lcn0gY2xhc3MsIGFuZCB0aGUgc3BlY2lhbCBleGNlcHRpb25zIGl0IG1heSByYWlzZSwKLWFyZSBvZiBtb3N0IGludGVyZXN0IHRvIHRlc3RpbmcgZnJhbWV3b3JrIGF1dGhvcnMsIGFuZCB3aWxsIG9ubHkgYmUKLXNrZXRjaGVkIGhlcmUuICBTZWUgdGhlIHNvdXJjZSBjb2RlLCBhbmQgZXNwZWNpYWxseSBcY2xhc3N7RGVidWdSdW5uZXJ9J3MKLWRvY3N0cmluZyAod2hpY2ggaXMgYSBkb2N0ZXN0ISkgZm9yIG1vcmUgZGV0YWlsczoKLQotXGJlZ2lue2NsYXNzZGVzY317RGVidWdSdW5uZXJ9e1xvcHRpb25hbHtjaGVja2VyfVxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlfVxvcHRpb25hbHssIG9wdGlvbmZsYWdzfX0KLQotICAgIEEgc3ViY2xhc3Mgb2YgXGNsYXNze0RvY1Rlc3RSdW5uZXJ9IHRoYXQgcmFpc2VzIGFuIGV4Y2VwdGlvbiBhcwotICAgIHNvb24gYXMgYSBmYWlsdXJlIGlzIGVuY291bnRlcmVkLiAgSWYgYW4gdW5leHBlY3RlZCBleGNlcHRpb24KLSAgICBvY2N1cnMsIGFuIFxleGNlcHRpb257VW5leHBlY3RlZEV4Y2VwdGlvbn0gZXhjZXB0aW9uIGlzIHJhaXNlZCwKLSAgICBjb250YWluaW5nIHRoZSB0ZXN0LCB0aGUgZXhhbXBsZSwgYW5kIHRoZSBvcmlnaW5hbCBleGNlcHRpb24uICBJZgotICAgIHRoZSBvdXRwdXQgZG9lc24ndCBtYXRjaCwgdGhlbiBhIFxleGNlcHRpb257RG9jVGVzdEZhaWx1cmV9Ci0gICAgZXhjZXB0aW9uIGlzIHJhaXNlZCwgY29udGFpbmluZyB0aGUgdGVzdCwgdGhlIGV4YW1wbGUsIGFuZCB0aGUKLSAgICBhY3R1YWwgb3V0cHV0LgotCi0gICAgRm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIGFuZCBtZXRob2RzLCBzZWUKLSAgICB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgXGNsYXNze0RvY1Rlc3RSdW5uZXJ9IGluCi0gICAgc2VjdGlvbn5ccmVme2RvY3Rlc3QtYWR2YW5jZWQtYXBpfS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1UaGVyZSBhcmUgdHdvIGV4Y2VwdGlvbnMgdGhhdCBtYXkgYmUgcmFpc2VkIGJ5IFxjbGFzc3tEZWJ1Z1J1bm5lcn0KLWluc3RhbmNlczoKLQotXGJlZ2lue2V4Y2NsYXNzZGVzY317RG9jVGVzdEZhaWx1cmV9e3Rlc3QsIGV4YW1wbGUsIGdvdH0KLSAgICBBbiBleGNlcHRpb24gdGhyb3duIGJ5IFxjbGFzc3tEb2NUZXN0UnVubmVyfSB0byBzaWduYWwgdGhhdCBhCi0gICAgZG9jdGVzdCBleGFtcGxlJ3MgYWN0dWFsIG91dHB1dCBkaWQgbm90IG1hdGNoIGl0cyBleHBlY3RlZCBvdXRwdXQuCi0gICAgVGhlIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyBhcmUgdXNlZCB0byBpbml0aWFsaXplIHRoZSBtZW1iZXIKLSAgICB2YXJpYWJsZXMgb2YgdGhlIHNhbWUgbmFtZXMuCi1cZW5ke2V4Y2NsYXNzZGVzY30KLVxleGNlcHRpb257RG9jVGVzdEZhaWx1cmV9IGRlZmluZXMgdGhlIGZvbGxvd2luZyBtZW1iZXIgdmFyaWFibGVzOgotXGJlZ2lue21lbWJlcmRlc2N9e3Rlc3R9Ci0gICAgVGhlIFxjbGFzc3tEb2NUZXN0fSBvYmplY3QgdGhhdCB3YXMgYmVpbmcgcnVuIHdoZW4gdGhlIGV4YW1wbGUgZmFpbGVkLgotXGVuZHttZW1iZXJkZXNjfQotXGJlZ2lue21lbWJlcmRlc2N9e2V4YW1wbGV9Ci0gICAgVGhlIFxjbGFzc3tFeGFtcGxlfSB0aGF0IGZhaWxlZC4KLVxlbmR7bWVtYmVyZGVzY30KLVxiZWdpbnttZW1iZXJkZXNjfXtnb3R9Ci0gICAgVGhlIGV4YW1wbGUncyBhY3R1YWwgb3V0cHV0LgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57ZXhjY2xhc3NkZXNjfXtVbmV4cGVjdGVkRXhjZXB0aW9ufXt0ZXN0LCBleGFtcGxlLCBleGNfaW5mb30KLSAgICBBbiBleGNlcHRpb24gdGhyb3duIGJ5IFxjbGFzc3tEb2NUZXN0UnVubmVyfSB0byBzaWduYWwgdGhhdCBhCi0gICAgZG9jdGVzdCBleGFtcGxlIHJhaXNlZCBhbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbi4gIFRoZSBjb25zdHJ1Y3RvcgotICAgIGFyZ3VtZW50cyBhcmUgdXNlZCB0byBpbml0aWFsaXplIHRoZSBtZW1iZXIgdmFyaWFibGVzIG9mIHRoZSBzYW1lCi0gICAgbmFtZXMuCi1cZW5ke2V4Y2NsYXNzZGVzY30KLVxleGNlcHRpb257VW5leHBlY3RlZEV4Y2VwdGlvbn0gZGVmaW5lcyB0aGUgZm9sbG93aW5nIG1lbWJlciB2YXJpYWJsZXM6Ci1cYmVnaW57bWVtYmVyZGVzY317dGVzdH0KLSAgICBUaGUgXGNsYXNze0RvY1Rlc3R9IG9iamVjdCB0aGF0IHdhcyBiZWluZyBydW4gd2hlbiB0aGUgZXhhbXBsZSBmYWlsZWQuCi1cZW5ke21lbWJlcmRlc2N9Ci1cYmVnaW57bWVtYmVyZGVzY317ZXhhbXBsZX0KLSAgICBUaGUgXGNsYXNze0V4YW1wbGV9IHRoYXQgZmFpbGVkLgotXGVuZHttZW1iZXJkZXNjfQotXGJlZ2lue21lbWJlcmRlc2N9e2V4Y19pbmZvfQotICAgIEEgdHVwbGUgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdW5leHBlY3RlZCBleGNlcHRpb24sIGFzCi0gICAgcmV0dXJuZWQgYnkgXGZ1bmN0aW9ue3N5cy5leGNfaW5mbygpfS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXHN1YnNlY3Rpb257U29hcGJveFxsYWJlbHtkb2N0ZXN0LXNvYXBib3h9fQotCi1BcyBtZW50aW9uZWQgaW4gdGhlIGludHJvZHVjdGlvbiwgXHJlZm1vZHVsZXtkb2N0ZXN0fSBoYXMgZ3Jvd24gdG8gaGF2ZQotdGhyZWUgcHJpbWFyeSB1c2VzOgotCi1cYmVnaW57ZW51bWVyYXRlfQotXGl0ZW0gQ2hlY2tpbmcgZXhhbXBsZXMgaW4gZG9jc3RyaW5ncy4KLVxpdGVtIFJlZ3Jlc3Npb24gdGVzdGluZy4KLVxpdGVtIEV4ZWN1dGFibGUgZG9jdW1lbnRhdGlvbiAvIGxpdGVyYXRlIHRlc3RpbmcuCi1cZW5ke2VudW1lcmF0ZX0KLQotVGhlc2UgdXNlcyBoYXZlIGRpZmZlcmVudCByZXF1aXJlbWVudHMsIGFuZCBpdCBpcyBpbXBvcnRhbnQgdG8KLWRpc3Rpbmd1aXNoIHRoZW0uICBJbiBwYXJ0aWN1bGFyLCBmaWxsaW5nIHlvdXIgZG9jc3RyaW5ncyB3aXRoIG9ic2N1cmUKLXRlc3QgY2FzZXMgbWFrZXMgZm9yIGJhZCBkb2N1bWVudGF0aW9uLgotCi1XaGVuIHdyaXRpbmcgYSBkb2NzdHJpbmcsIGNob29zZSBkb2NzdHJpbmcgZXhhbXBsZXMgd2l0aCBjYXJlLgotVGhlcmUncyBhbiBhcnQgdG8gdGhpcyB0aGF0IG5lZWRzIHRvIGJlIGxlYXJuZWQtLS1pdCBtYXkgbm90IGJlCi1uYXR1cmFsIGF0IGZpcnN0LiAgRXhhbXBsZXMgc2hvdWxkIGFkZCBnZW51aW5lIHZhbHVlIHRvIHRoZQotZG9jdW1lbnRhdGlvbi4gIEEgZ29vZCBleGFtcGxlIGNhbiBvZnRlbiBiZSB3b3J0aCBtYW55IHdvcmRzLgotSWYgZG9uZSB3aXRoIGNhcmUsIHRoZSBleGFtcGxlcyB3aWxsIGJlIGludmFsdWFibGUgZm9yIHlvdXIgdXNlcnMsIGFuZAotd2lsbCBwYXkgYmFjayB0aGUgdGltZSBpdCB0YWtlcyB0byBjb2xsZWN0IHRoZW0gbWFueSB0aW1lcyBvdmVyIGFzIHRoZQoteWVhcnMgZ28gYnkgYW5kIHRoaW5ncyBjaGFuZ2UuICBJJ20gc3RpbGwgYW1hemVkIGF0IGhvdyBvZnRlbiBvbmUgb2YKLW15IFxyZWZtb2R1bGV7ZG9jdGVzdH0gZXhhbXBsZXMgc3RvcHMgd29ya2luZyBhZnRlciBhICJoYXJtbGVzcyIKLWNoYW5nZS4KLQotRG9jdGVzdCBhbHNvIG1ha2VzIGFuIGV4Y2VsbGVudCB0b29sIGZvciByZWdyZXNzaW9uIHRlc3RpbmcsIGVzcGVjaWFsbHkgaWYKLXlvdSBkb24ndCBza2ltcCBvbiBleHBsYW5hdG9yeSB0ZXh0LiAgQnkgaW50ZXJsZWF2aW5nIHByb3NlIGFuZCBleGFtcGxlcywKLWl0IGJlY29tZXMgbXVjaCBlYXNpZXIgdG8ga2VlcCB0cmFjayBvZiB3aGF0J3MgYWN0dWFsbHkgYmVpbmcgdGVzdGVkLCBhbmQKLXdoeS4gIFdoZW4gYSB0ZXN0IGZhaWxzLCBnb29kIHByb3NlIGNhbiBtYWtlIGl0IG11Y2ggZWFzaWVyIHRvIGZpZ3VyZSBvdXQKLXdoYXQgdGhlIHByb2JsZW0gaXMsIGFuZCBob3cgaXQgc2hvdWxkIGJlIGZpeGVkLiAgSXQncyB0cnVlIHRoYXQgeW91IGNvdWxkCi13cml0ZSBleHRlbnNpdmUgY29tbWVudHMgaW4gY29kZS1iYXNlZCB0ZXN0aW5nLCBidXQgZmV3IHByb2dyYW1tZXJzIGRvLgotTWFueSBoYXZlIGZvdW5kIHRoYXQgdXNpbmcgZG9jdGVzdCBhcHByb2FjaGVzIGluc3RlYWQgbGVhZHMgdG8gbXVjaCBjbGVhcmVyCi10ZXN0cy4gIFBlcmhhcHMgdGhpcyBpcyBzaW1wbHkgYmVjYXVzZSBkb2N0ZXN0IG1ha2VzIHdyaXRpbmcgcHJvc2UgYSBsaXR0bGUKLWVhc2llciB0aGFuIHdyaXRpbmcgY29kZSwgd2hpbGUgd3JpdGluZyBjb21tZW50cyBpbiBjb2RlIGlzIGEgbGl0dGxlCi1oYXJkZXIuICBJIHRoaW5rIGl0IGdvZXMgZGVlcGVyIHRoYW4ganVzdCB0aGF0OiAgdGhlIG5hdHVyYWwgYXR0aXR1ZGUKLXdoZW4gd3JpdGluZyBhIGRvY3Rlc3QtYmFzZWQgdGVzdCBpcyB0aGF0IHlvdSB3YW50IHRvIGV4cGxhaW4gdGhlIGZpbmUKLXBvaW50cyBvZiB5b3VyIHNvZnR3YXJlLCBhbmQgaWxsdXN0cmF0ZSB0aGVtIHdpdGggZXhhbXBsZXMuICBUaGlzIGluCi10dXJuIG5hdHVyYWxseSBsZWFkcyB0byB0ZXN0IGZpbGVzIHRoYXQgc3RhcnQgd2l0aCB0aGUgc2ltcGxlc3QgZmVhdHVyZXMsCi1hbmQgbG9naWNhbGx5IHByb2dyZXNzIHRvIGNvbXBsaWNhdGlvbnMgYW5kIGVkZ2UgY2FzZXMuICBBIGNvaGVyZW50Ci1uYXJyYXRpdmUgaXMgdGhlIHJlc3VsdCwgaW5zdGVhZCBvZiBhIGNvbGxlY3Rpb24gb2YgaXNvbGF0ZWQgZnVuY3Rpb25zCi10aGF0IHRlc3QgaXNvbGF0ZWQgYml0cyBvZiBmdW5jdGlvbmFsaXR5IHNlZW1pbmdseSBhdCByYW5kb20uICBJdCdzCi1hIGRpZmZlcmVudCBhdHRpdHVkZSwgYW5kIHByb2R1Y2VzIGRpZmZlcmVudCByZXN1bHRzLCBibHVycmluZyB0aGUKLWRpc3RpbmN0aW9uIGJldHdlZW4gdGVzdGluZyBhbmQgZXhwbGFpbmluZy4KLQotUmVncmVzc2lvbiB0ZXN0aW5nIGlzIGJlc3QgY29uZmluZWQgdG8gZGVkaWNhdGVkIG9iamVjdHMgb3IgZmlsZXMuICBUaGVyZQotYXJlIHNldmVyYWwgb3B0aW9ucyBmb3Igb3JnYW5pemluZyB0ZXN0czoKLQotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSBXcml0ZSB0ZXh0IGZpbGVzIGNvbnRhaW5pbmcgdGVzdCBjYXNlcyBhcyBpbnRlcmFjdGl2ZSBleGFtcGxlcywKLSAgICAgIGFuZCB0ZXN0IHRoZSBmaWxlcyB1c2luZyBcZnVuY3Rpb257dGVzdGZpbGUoKX0gb3IKLSAgICAgIFxmdW5jdGlvbntEb2NGaWxlU3VpdGUoKX0uICBUaGlzIGlzIHJlY29tbWVuZGVkLCBhbHRob3VnaCBpcwotICAgICAgZWFzaWVzdCB0byBkbyBmb3IgbmV3IHByb2plY3RzLCBkZXNpZ25lZCBmcm9tIHRoZSBzdGFydCB0byB1c2UKLSAgICAgIGRvY3Rlc3QuCi1caXRlbSBEZWZpbmUgZnVuY3Rpb25zIG5hbWVkIFxjb2Rle19yZWdydGVzdF9cdGV4dGl0e3RvcGljfX0gdGhhdAotICAgICAgY29uc2lzdCBvZiBzaW5nbGUgZG9jc3RyaW5ncywgY29udGFpbmluZyB0ZXN0IGNhc2VzIGZvciB0aGUKLSAgICAgIG5hbWVkIHRvcGljcy4gIFRoZXNlIGZ1bmN0aW9ucyBjYW4gYmUgaW5jbHVkZWQgaW4gdGhlIHNhbWUgZmlsZQotICAgICAgYXMgdGhlIG1vZHVsZSwgb3Igc2VwYXJhdGVkIG91dCBpbnRvIGEgc2VwYXJhdGUgdGVzdCBmaWxlLgotXGl0ZW0gRGVmaW5lIGEgXGNvZGV7X190ZXN0X199IGRpY3Rpb25hcnkgbWFwcGluZyBmcm9tIHJlZ3Jlc3Npb24gdGVzdAotICAgICAgdG9waWNzIHRvIGRvY3N0cmluZ3MgY29udGFpbmluZyB0ZXN0IGNhc2VzLgotXGVuZHtpdGVtaXplfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJkb2N4bWxycGMudGV4IGIvRG9jL2xpYi9saWJkb2N4bWxycGMudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTNiM2IyLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGliZG9jeG1scnBjLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle0RvY1hNTFJQQ1NlcnZlcn0gLS0tCi0gICAgICAgICBTZWxmLWRvY3VtZW50aW5nIFhNTC1SUEMgc2VydmVyfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17RG9jWE1MUlBDU2VydmVyfQotXG1vZHVsZXN5bm9wc2lze1NlbGYtZG9jdW1lbnRpbmcgWE1MLVJQQyBzZXJ2ZXIgaW1wbGVtZW50YXRpb24ufQotXG1vZHVsZWF1dGhvcntCcmlhbiBRdWlubGFufXticmlhbnFAYWN0aXZlc3RhdGUuY29tfQotXHNlY3Rpb25hdXRob3J7QnJpYW4gUXVpbmxhbn17YnJpYW5xQGFjdGl2ZXN0YXRlLmNvbX0KLQotXHZlcnNpb25hZGRlZHsyLjN9Ci0KLVRoZSBcbW9kdWxle0RvY1hNTFJQQ1NlcnZlcn0gbW9kdWxlIGV4dGVuZHMgdGhlIGNsYXNzZXMgZm91bmQgaW4KLVxtb2R1bGV7U2ltcGxlWE1MUlBDU2VydmVyfSB0byBzZXJ2ZSBIVE1MIGRvY3VtZW50YXRpb24gaW4gcmVzcG9uc2UgdG8KLUhUVFAgR0VUIHJlcXVlc3RzLiBTZXJ2ZXJzIGNhbiBlaXRoZXIgYmUgZnJlZSBzdGFuZGluZywgdXNpbmcKLVxjbGFzc3tEb2NYTUxSUENTZXJ2ZXJ9LCBvciBlbWJlZGRlZCBpbiBhIENHSSBlbnZpcm9ubWVudCwgdXNpbmcKLVxjbGFzc3tEb2NDR0lYTUxSUENSZXF1ZXN0SGFuZGxlcn0uCi0KLVxiZWdpbntjbGFzc2Rlc2N9e0RvY1hNTFJQQ1NlcnZlcn17YWRkclxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVyXG9wdGlvbmFseywKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgbG9nUmVxdWVzdHNcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19ub25lXG9wdGlvbmFseywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZF9hbmRfYWN0aXZhdGV9fX19fX0KLQotQ3JlYXRlIGEgbmV3IHNlcnZlciBpbnN0YW5jZS4gQWxsIHBhcmFtZXRlcnMgaGF2ZSB0aGUgc2FtZSBtZWFuaW5nIGFzCi1mb3IgXGNsYXNze1NpbXBsZVhNTFJQQ1NlcnZlci5TaW1wbGVYTUxSUENTZXJ2ZXJ9OwotXHZhcntyZXF1ZXN0SGFuZGxlcn0gZGVmYXVsdHMgdG8gXGNsYXNze0RvY1hNTFJQQ1JlcXVlc3RIYW5kbGVyfS4KLQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0RvY0NHSVhNTFJQQ1JlcXVlc3RIYW5kbGVyfXt9Ci0KLUNyZWF0ZSBhIG5ldyBpbnN0YW5jZSB0byBoYW5kbGUgWE1MLVJQQyByZXF1ZXN0cyBpbiBhIENHSSBlbnZpcm9ubWVudC4KLQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0RvY1hNTFJQQ1JlcXVlc3RIYW5kbGVyfXt9Ci0KLUNyZWF0ZSBhIG5ldyByZXF1ZXN0IGhhbmRsZXIgaW5zdGFuY2UuIFRoaXMgcmVxdWVzdCBoYW5kbGVyIHN1cHBvcnRzCi1YTUwtUlBDIFBPU1QgcmVxdWVzdHMsIGRvY3VtZW50YXRpb24gR0VUIHJlcXVlc3RzLCBhbmQgbW9kaWZpZXMKLWxvZ2dpbmcgc28gdGhhdCB0aGUgXHZhcntsb2dSZXF1ZXN0c30gcGFyYW1ldGVyIHRvIHRoZQotXGNsYXNze0RvY1hNTFJQQ1NlcnZlcn0gY29uc3RydWN0b3IgcGFyYW1ldGVyIGlzIGhvbm9yZWQuCi0KLVxlbmR7Y2xhc3NkZXNjfQotCi1cc3Vic2VjdGlvbntEb2NYTUxSUENTZXJ2ZXIgT2JqZWN0cyBcbGFiZWx7ZG9jLXhtbHJwYy1zZXJ2ZXJzfX0KLQotVGhlIFxjbGFzc3tEb2NYTUxSUENTZXJ2ZXJ9IGNsYXNzIGlzIGRlcml2ZWQgZnJvbQotXGNsYXNze1NpbXBsZVhNTFJQQ1NlcnZlci5TaW1wbGVYTUxSUENTZXJ2ZXJ9IGFuZCBwcm92aWRlcyBhIG1lYW5zIG9mCi1jcmVhdGluZyBzZWxmLWRvY3VtZW50aW5nLCBzdGFuZCBhbG9uZSBYTUwtUlBDIHNlcnZlcnMuIEhUVFAgUE9TVAotcmVxdWVzdHMgYXJlIGhhbmRsZWQgYXMgWE1MLVJQQyBtZXRob2QgY2FsbHMuIEhUVFAgR0VUIHJlcXVlc3RzIGFyZQotaGFuZGxlZCBieSBnZW5lcmF0aW5nIHB5ZG9jLXN0eWxlIEhUTUwgZG9jdW1lbnRhdGlvbi4gVGhpcyBhbGxvd3MgYQotc2VydmVyIHRvIHByb3ZpZGUgaXRzIG93biB3ZWItYmFzZWQgZG9jdW1lbnRhdGlvbi4KLQotXGJlZ2lue21ldGhvZGRlc2N9W0RvY1hNTFJQQ1NlcnZlcl17c2V0X3NlcnZlcl90aXRsZX17c2VydmVyX3RpdGxlfQotCi1TZXQgdGhlIHRpdGxlIHVzZWQgaW4gdGhlIGdlbmVyYXRlZCBIVE1MIGRvY3VtZW50YXRpb24uIFRoaXMgdGl0bGUKLXdpbGwgYmUgdXNlZCBpbnNpZGUgdGhlIEhUTUwgInRpdGxlIiBlbGVtZW50LgotCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtEb2NYTUxSUENTZXJ2ZXJde3NldF9zZXJ2ZXJfbmFtZX17c2VydmVyX25hbWV9Ci0KLVNldCB0aGUgbmFtZSB1c2VkIGluIHRoZSBnZW5lcmF0ZWQgSFRNTCBkb2N1bWVudGF0aW9uLiBUaGlzIG5hbWUgd2lsbAotYXBwZWFyIGF0IHRoZSB0b3Agb2YgdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIGluc2lkZSBhICJoMSIKLWVsZW1lbnQuCi0KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cYmVnaW57bWV0aG9kZGVzY31bRG9jWE1MUlBDU2VydmVyXXtzZXRfc2VydmVyX2RvY3VtZW50YXRpb259e3NlcnZlcl9kb2N1bWVudGF0aW9ufQotCi1TZXQgdGhlIGRlc2NyaXB0aW9uIHVzZWQgaW4gdGhlIGdlbmVyYXRlZCBIVE1MIGRvY3VtZW50YXRpb24uIFRoaXMKLWRlc2NyaXB0aW9uIHdpbGwgYXBwZWFyIGFzIGEgcGFyYWdyYXBoLCBiZWxvdyB0aGUgc2VydmVyIG5hbWUsIGluIHRoZQotZG9jdW1lbnRhdGlvbi4KLQotXGVuZHttZXRob2RkZXNjfQotCi1cc3Vic2VjdGlvbntEb2NDR0lYTUxSUENSZXF1ZXN0SGFuZGxlcn0KLQotVGhlIFxjbGFzc3tEb2NDR0lYTUxSUENSZXF1ZXN0SGFuZGxlcn0gY2xhc3MgaXMgZGVyaXZlZCBmcm9tCi1cY2xhc3N7U2ltcGxlWE1MUlBDU2VydmVyLkNHSVhNTFJQQ1JlcXVlc3RIYW5kbGVyfSBhbmQgcHJvdmlkZXMgYSBtZWFucwotb2YgY3JlYXRpbmcgc2VsZi1kb2N1bWVudGluZywgWE1MLVJQQyBDR0kgc2NyaXB0cy4gSFRUUCBQT1NUIHJlcXVlc3RzCi1hcmUgaGFuZGxlZCBhcyBYTUwtUlBDIG1ldGhvZCBjYWxscy4gSFRUUCBHRVQgcmVxdWVzdHMgYXJlIGhhbmRsZWQgYnkKLWdlbmVyYXRpbmcgcHlkb2Mtc3R5bGUgSFRNTCBkb2N1bWVudGF0aW9uLiBUaGlzIGFsbG93cyBhIHNlcnZlciB0bwotcHJvdmlkZSBpdHMgb3duIHdlYi1iYXNlZCBkb2N1bWVudGF0aW9uLgotCi1cYmVnaW57bWV0aG9kZGVzY31bRG9jQ0dJWE1MUlBDUmVxdWVzdEhhbmRsZXJde3NldF9zZXJ2ZXJfdGl0bGV9e3NlcnZlcl90aXRsZX0KLQotU2V0IHRoZSB0aXRsZSB1c2VkIGluIHRoZSBnZW5lcmF0ZWQgSFRNTCBkb2N1bWVudGF0aW9uLiBUaGlzIHRpdGxlCi13aWxsIGJlIHVzZWQgaW5zaWRlIHRoZSBIVE1MICJ0aXRsZSIgZWxlbWVudC4KLQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRG9jQ0dJWE1MUlBDUmVxdWVzdEhhbmRsZXJde3NldF9zZXJ2ZXJfbmFtZX17c2VydmVyX25hbWV9Ci0KLVNldCB0aGUgbmFtZSB1c2VkIGluIHRoZSBnZW5lcmF0ZWQgSFRNTCBkb2N1bWVudGF0aW9uLiBUaGlzIG5hbWUgd2lsbAotYXBwZWFyIGF0IHRoZSB0b3Agb2YgdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIGluc2lkZSBhICJoMSIKLWVsZW1lbnQuCi0KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cYmVnaW57bWV0aG9kZGVzY31bRG9jQ0dJWE1MUlBDUmVxdWVzdEhhbmRsZXJde3NldF9zZXJ2ZXJfZG9jdW1lbnRhdGlvbn17c2VydmVyX2RvY3VtZW50YXRpb259Ci0KLVNldCB0aGUgZGVzY3JpcHRpb24gdXNlZCBpbiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4gVGhpcwotZGVzY3JpcHRpb24gd2lsbCBhcHBlYXIgYXMgYSBwYXJhZ3JhcGgsIGJlbG93IHRoZSBzZXJ2ZXIgbmFtZSwgaW4gdGhlCi1kb2N1bWVudGF0aW9uLgotCi1cZW5ke21ldGhvZGRlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmR1bWJkYm0udGV4IGIvRG9jL2xpYi9saWJkdW1iZGJtLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA5MTdiZS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmR1bWJkYm0udGV4CisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtkdW1iZGJtfSAtLS0KLSAgICAgICAgIFBvcnRhYmxlIERCTSBpbXBsZW1lbnRhdGlvbn0KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2R1bWJkYm19Ci1cbW9kdWxlc3lub3BzaXN7UG9ydGFibGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNpbXBsZSBEQk0gaW50ZXJmYWNlLn0KLQotXGluZGV4e2RhdGFiYXNlc30KLQotXGJlZ2lue25vdGljZX0KLVRoZSBcbW9kdWxle2R1bWJkYm19IG1vZHVsZSBpcyBpbnRlbmRlZCBhcyBhIGxhc3QgcmVzb3J0IGZhbGxiYWNrIGZvcgotdGhlIFxyZWZtb2R1bGV7YW55ZGJtfSBtb2R1bGUgd2hlbiBubyBtb3JlIHJvYnVzdCBtb2R1bGUgaXMgYXZhaWxhYmxlLgotVGhlIFxtb2R1bGV7ZHVtYmRibX0gbW9kdWxlIGlzIG5vdCB3cml0dGVuIGZvciBzcGVlZCBhbmQgaXMgbm90IG5lYXJseSBhcwotaGVhdmlseSB1c2VkIGFzIHRoZSBvdGhlciBkYXRhYmFzZSBtb2R1bGVzLgotXGVuZHtub3RpY2V9Ci0KLVRoZSBcbW9kdWxle2R1bWJkYm19IG1vZHVsZSBwcm92aWRlcyBhIHBlcnNpc3RlbnQgZGljdGlvbmFyeS1saWtlIGludGVyZmFjZQotd2hpY2ggaXMgd3JpdHRlbiBlbnRpcmVseSBpbiBQeXRob24uICBVbmxpa2Ugb3RoZXIgbW9kdWxlcyBzdWNoIGFzCi1ccmVmbW9kdWxle2dkYm19IGFuZCBccmVmbW9kdWxle2JzZGRifSwgbm8gZXh0ZXJuYWwgbGlicmFyeSBpcyByZXF1aXJlZC4gIEFzCi13aXRoIG90aGVyIHBlcnNpc3RlbnQgbWFwcGluZ3MsIHRoZSBrZXlzIGFuZCB2YWx1ZXMgbXVzdCBhbHdheXMgYmUgc3RyaW5ncy4KLQotVGhlIG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmc6Ci0KLVxiZWdpbntleGNkZXNjfXtlcnJvcn0KLVJhaXNlZCBvbiBkdW1iZGJtLXNwZWNpZmljIGVycm9ycywgc3VjaCBhcyBJL08gZXJyb3JzLiAgXGV4Y2VwdGlvbntLZXlFcnJvcn0KLWlzIHJhaXNlZCBmb3IgZ2VuZXJhbCBtYXBwaW5nIGVycm9ycyBsaWtlIHNwZWNpZnlpbmcgYW4gaW5jb3JyZWN0IGtleS4KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtvcGVufXtmaWxlbmFtZVxvcHRpb25hbHssIGZsYWdcb3B0aW9uYWx7LCBtb2RlfX19Ci1PcGVuIGEgZHVtYmRibSBkYXRhYmFzZSBhbmQgcmV0dXJuIGEgZHVtYmRibSBvYmplY3QuICBUaGUgXHZhcntmaWxlbmFtZX0KLWFyZ3VtZW50IGlzIHRoZSBiYXNlbmFtZSBvZiB0aGUgZGF0YWJhc2UgZmlsZSAod2l0aG91dCBhbnkgc3BlY2lmaWMKLWV4dGVuc2lvbnMpLiAgV2hlbiBhIGR1bWJkYm0gZGF0YWJhc2UgaXMgY3JlYXRlZCwgZmlsZXMgd2l0aCBcZmlsZXsuZGF0fSBhbmQKLVxmaWxley5kaXJ9IGV4dGVuc2lvbnMgYXJlIGNyZWF0ZWQuCi0KLVRoZSBvcHRpb25hbCBcdmFye2ZsYWd9IGFyZ3VtZW50IGlzIGN1cnJlbnRseSBpZ25vcmVkOyB0aGUgZGF0YWJhc2UgaXMKLWFsd2F5cyBvcGVuZWQgZm9yIHVwZGF0ZSwgYW5kIHdpbGwgYmUgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLQotVGhlIG9wdGlvbmFsIFx2YXJ7bW9kZX0gYXJndW1lbnQgaXMgdGhlIFxVTklYe30gbW9kZSBvZiB0aGUgZmlsZSwgdXNlZAotb25seSB3aGVuIHRoZSBkYXRhYmFzZSBoYXMgdG8gYmUgY3JlYXRlZC4gIEl0IGRlZmF1bHRzIHRvIG9jdGFsCi1cY29kZXswNjY2fSAoYW5kIHdpbGwgYmUgbW9kaWZpZWQgYnkgdGhlIHByZXZhaWxpbmcgdW1hc2spLgotXHZlcnNpb25jaGFuZ2VkW1RoZSBcdmFye21vZGV9IGFyZ3VtZW50IHdhcyBpZ25vcmVkIGluIGVhcmxpZXIKLSAgICAgICAgICAgICAgICB2ZXJzaW9uc117Mi4yfQotXGVuZHtmdW5jZGVzY30KLQotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZW1vZHVsZXthbnlkYm19e0dlbmVyaWMgaW50ZXJmYWNlIHRvIFxjb2Rle2RibX0tc3R5bGUgZGF0YWJhc2VzLn0KLSAgXHNlZW1vZHVsZXtkYm19e1NpbWlsYXIgaW50ZXJmYWNlIHRvIHRoZSBEQk0vTkRCTSBsaWJyYXJ5Ln0KLSAgXHNlZW1vZHVsZXtnZGJtfXtTaW1pbGFyIGludGVyZmFjZSB0byB0aGUgR05VIEdEQk0gbGlicmFyeS59Ci0gIFxzZWVtb2R1bGV7c2hlbHZlfXtQZXJzaXN0ZW5jZSBtb2R1bGUgd2hpY2ggc3RvcmVzIG5vbi1zdHJpbmcgZGF0YS59Ci0gIFxzZWVtb2R1bGV7d2hpY2hkYn17VXRpbGl0eSBtb2R1bGUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgYW4KLSAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZyBkYXRhYmFzZS59Ci1cZW5ke3NlZWFsc299Ci0KLQotXHN1YnNlY3Rpb257RHVtYmRibSBPYmplY3RzIFxsYWJlbHtkdW1iZGJtLW9iamVjdHN9fQotCi1JbiBhZGRpdGlvbiB0byB0aGUgbWV0aG9kcyBwcm92aWRlZCBieSB0aGUgXGNsYXNze1VzZXJEaWN0LkRpY3RNaXhpbn0gY2xhc3MsCi1cY2xhc3N7ZHVtYmRibX0gb2JqZWN0cyBwcm92aWRlIHRoZSBmb2xsb3dpbmcgbWV0aG9kcy4KLQotXGJlZ2lue21ldGhvZGRlc2N9W2R1bWJkYm1de3N5bmN9e30KLVN5bmNocm9uaXplIHRoZSBvbi1kaXNrIGRpcmVjdG9yeSBhbmQgZGF0YSBmaWxlcy4gIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieQotdGhlIFxtZXRob2R7c3luY30gbWV0aG9kIG9mIFxjbGFzc3tTaGVsdmV9IG9iamVjdHMuCi1cZW5ke21ldGhvZGRlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmR1bW15dGhyZWFkLnRleCBiL0RvYy9saWIvbGliZHVtbXl0aHJlYWQudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmI0YzU2Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGliZHVtbXl0aHJlYWQudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtkdW1teV90aHJlYWR9IC0tLQotICAgICAgICAgRHJvcC1pbiByZXBsYWNlbWVudCBmb3IgdGhlIFxtb2R1bGV7dGhyZWFkfSBtb2R1bGV9Ci0KLVxkZWNsYXJlbW9kdWxlW2R1bW15dGhyZWFkXXtzdGFuZGFyZH17ZHVtbXlfdGhyZWFkfQotXG1vZHVsZXN5bm9wc2lze0Ryb3AtaW4gcmVwbGFjZW1lbnQgZm9yIHRoZSBccmVmbW9kdWxle3RocmVhZH0gbW9kdWxlLn0KLQotVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBkdXBsaWNhdGUgaW50ZXJmYWNlIHRvIHRoZSBccmVmbW9kdWxle3RocmVhZH0KLW1vZHVsZS4gIEl0IGlzIG1lYW50IHRvIGJlIGltcG9ydGVkIHdoZW4gdGhlIFxyZWZtb2R1bGV7dGhyZWFkfSBtb2R1bGUKLWlzIG5vdCBwcm92aWRlZCBvbiBhIHBsYXRmb3JtLgotCi1TdWdnZXN0ZWQgdXNhZ2UgaXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXRyeToKLSAgICBpbXBvcnQgdGhyZWFkIGFzIF90aHJlYWQKLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICBpbXBvcnQgZHVtbXlfdGhyZWFkIGFzIF90aHJlYWQKLVxlbmR7dmVyYmF0aW19Ci0KLUJlIGNhcmVmdWwgdG8gbm90IHVzZSB0aGlzIG1vZHVsZSB3aGVyZSBkZWFkbG9jayBtaWdodCBvY2N1ciBmcm9tIGEgdGhyZWFkIAotYmVpbmcgY3JlYXRlZCB0aGF0IGJsb2NrcyB3YWl0aW5nIGZvciBhbm90aGVyIHRocmVhZCB0byBiZSBjcmVhdGVkLiAgVGhpcyAKLW9mdGVuIG9jY3VycyB3aXRoIGJsb2NraW5nIEkvTy4KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliZHVtbXl0aHJlYWRpbmcudGV4IGIvRG9jL2xpYi9saWJkdW1teXRocmVhZGluZy50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NGY1OTYuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJkdW1teXRocmVhZGluZy50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle2R1bW15X3RocmVhZGluZ30gLS0tCi0gICAgICAgICBEcm9wLWluIHJlcGxhY2VtZW50IGZvciB0aGUgXG1vZHVsZXt0aHJlYWRpbmd9IG1vZHVsZX0KLQotXGRlY2xhcmVtb2R1bGVbZHVtbXl0aHJlYWRpbmdde3N0YW5kYXJkfXtkdW1teV90aHJlYWRpbmd9Ci1cbW9kdWxlc3lub3BzaXN7RHJvcC1pbiByZXBsYWNlbWVudCBmb3IgdGhlIFxyZWZtb2R1bGV7dGhyZWFkaW5nfSBtb2R1bGUufQotCi1UaGlzIG1vZHVsZSBwcm92aWRlcyBhIGR1cGxpY2F0ZSBpbnRlcmZhY2UgdG8gdGhlCi1ccmVmbW9kdWxle3RocmVhZGluZ30gbW9kdWxlLiAgSXQgaXMgbWVhbnQgdG8gYmUgaW1wb3J0ZWQgd2hlbiB0aGUKLVxyZWZtb2R1bGV7dGhyZWFkfSBtb2R1bGUgaXMgbm90IHByb3ZpZGVkIG9uIGEgcGxhdGZvcm0uCi0KLVN1Z2dlc3RlZCB1c2FnZSBpczoKLQotXGJlZ2lue3ZlcmJhdGltfQotdHJ5OgotICAgIGltcG9ydCB0aHJlYWRpbmcgYXMgX3RocmVhZGluZwotZXhjZXB0IEltcG9ydEVycm9yOgotICAgIGltcG9ydCBkdW1teV90aHJlYWRpbmcgYXMgX3RocmVhZGluZwotXGVuZHt2ZXJiYXRpbX0KLQotQmUgY2FyZWZ1bCB0byBub3QgdXNlIHRoaXMgbW9kdWxlIHdoZXJlIGRlYWRsb2NrIG1pZ2h0IG9jY3VyIGZyb20gYSB0aHJlYWQgCi1iZWluZyBjcmVhdGVkIHRoYXQgYmxvY2tzIHdhaXRpbmcgZm9yIGFub3RoZXIgdGhyZWFkIHRvIGJlIGNyZWF0ZWQuICBUaGlzIAotb2Z0ZW4gb2NjdXJzIHdpdGggYmxvY2tpbmcgSS9PLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJlcnJuby50ZXggYi9Eb2MvbGliL2xpYmVycm5vLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBjZTZlOC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmVycm5vLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle2Vycm5vfSAtLS0KLSAgICAgICAgIFN0YW5kYXJkIGVycm5vIHN5c3RlbSBzeW1ib2xzfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZXJybm99Ci1cbW9kdWxlc3lub3BzaXN7U3RhbmRhcmQgZXJybm8gc3lzdGVtIHN5bWJvbHMufQotCi0KLVRoaXMgbW9kdWxlIG1ha2VzIGF2YWlsYWJsZSBzdGFuZGFyZCBcY29kZXtlcnJub30gc3lzdGVtIHN5bWJvbHMuCi1UaGUgdmFsdWUgb2YgZWFjaCBzeW1ib2wgaXMgdGhlIGNvcnJlc3BvbmRpbmcgaW50ZWdlciB2YWx1ZS4KLVRoZSBuYW1lcyBhbmQgZGVzY3JpcHRpb25zIGFyZSBib3Jyb3dlZCBmcm9tIFxmaWxle2xpbnV4L2luY2x1ZGUvZXJybm8uaH0sCi13aGljaCBzaG91bGQgYmUgcHJldHR5IGFsbC1pbmNsdXNpdmUuCi0KLVxiZWdpbntkYXRhZGVzY317ZXJyb3Jjb2RlfQotICBEaWN0aW9uYXJ5IHByb3ZpZGluZyBhIG1hcHBpbmcgZnJvbSB0aGUgZXJybm8gdmFsdWUgdG8gdGhlIHN0cmluZwotICBuYW1lIGluIHRoZSB1bmRlcmx5aW5nIHN5c3RlbS4gIEZvciBpbnN0YW5jZSwKLSAgXGNvZGV7ZXJybm8uZXJyb3Jjb2RlW2Vycm5vLkVQRVJNXX0gbWFwcyB0byBcY29kZXsnRVBFUk0nfS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVRvIHRyYW5zbGF0ZSBhIG51bWVyaWMgZXJyb3IgY29kZSB0byBhbiBlcnJvciBtZXNzYWdlLCB1c2UKLVxmdW5jdGlvbntvcy5zdHJlcnJvcigpfS4KLQotT2YgdGhlIGZvbGxvd2luZyBsaXN0LCBzeW1ib2xzIHRoYXQgYXJlIG5vdCB1c2VkIG9uIHRoZSBjdXJyZW50Ci1wbGF0Zm9ybSBhcmUgbm90IGRlZmluZWQgYnkgdGhlIG1vZHVsZS4gIFRoZSBzcGVjaWZpYyBsaXN0IG9mIGRlZmluZWQKLXN5bWJvbHMgaXMgYXZhaWxhYmxlIGFzIFxjb2Rle2Vycm5vLmVycm9yY29kZS5rZXlzKCl9LiAgU3ltYm9scwotYXZhaWxhYmxlIGNhbiBpbmNsdWRlOgotCi1cYmVnaW57ZGF0YWRlc2N9e0VQRVJNfSBPcGVyYXRpb24gbm90IHBlcm1pdHRlZCBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFTk9FTlR9IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RVNSQ0h9IE5vIHN1Y2ggcHJvY2VzcyBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFSU5UUn0gSW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RUlPfSBJL08gZXJyb3IgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RU5YSU99IE5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RTJCSUd9IEFyZyBsaXN0IHRvbyBsb25nIFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VOT0VYRUN9IEV4ZWMgZm9ybWF0IGVycm9yIFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VCQURGfSBCYWQgZmlsZSBudW1iZXIgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RUNISUxEfSBObyBjaGlsZCBwcm9jZXNzZXMgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RUFHQUlOfSBUcnkgYWdhaW4gXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RU5PTUVNfSBPdXQgb2YgbWVtb3J5IFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VBQ0NFU30gUGVybWlzc2lvbiBkZW5pZWQgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RUZBVUxUfSBCYWQgYWRkcmVzcyBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFTk9UQkxLfSBCbG9jayBkZXZpY2UgcmVxdWlyZWQgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RUJVU1l9IERldmljZSBvciByZXNvdXJjZSBidXN5IFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VFWElTVH0gRmlsZSBleGlzdHMgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RVhERVZ9IENyb3NzLWRldmljZSBsaW5rIFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VOT0RFVn0gTm8gc3VjaCBkZXZpY2UgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RU5PVERJUn0gTm90IGEgZGlyZWN0b3J5IFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VJU0RJUn0gSXMgYSBkaXJlY3RvcnkgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RUlOVkFMfSBJbnZhbGlkIGFyZ3VtZW50IFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VORklMRX0gRmlsZSB0YWJsZSBvdmVyZmxvdyBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFTUZJTEV9IFRvbyBtYW55IG9wZW4gZmlsZXMgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RU5PVFRZfSBOb3QgYSB0eXBld3JpdGVyIFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VUWFRCU1l9IFRleHQgZmlsZSBidXN5IFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VGQklHfSBGaWxlIHRvbyBsYXJnZSBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFTk9TUEN9IE5vIHNwYWNlIGxlZnQgb24gZGV2aWNlIFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VTUElQRX0gSWxsZWdhbCBzZWVrIFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VST0ZTfSBSZWFkLW9ubHkgZmlsZSBzeXN0ZW0gXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RU1MSU5LfSBUb28gbWFueSBsaW5rcyBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFUElQRX0gQnJva2VuIHBpcGUgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RURPTX0gTWF0aCBhcmd1bWVudCBvdXQgb2YgZG9tYWluIG9mIGZ1bmMgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RVJBTkdFfSBNYXRoIHJlc3VsdCBub3QgcmVwcmVzZW50YWJsZSBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFREVBRExLfSBSZXNvdXJjZSBkZWFkbG9jayB3b3VsZCBvY2N1ciBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFTkFNRVRPT0xPTkd9IEZpbGUgbmFtZSB0b28gbG9uZyBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFTk9MQ0t9IE5vIHJlY29yZCBsb2NrcyBhdmFpbGFibGUgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RU5PU1lTfSBGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RU5PVEVNUFRZfSBEaXJlY3Rvcnkgbm90IGVtcHR5IFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VMT09QfSBUb28gbWFueSBzeW1ib2xpYyBsaW5rcyBlbmNvdW50ZXJlZCBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFV09VTERCTE9DS30gT3BlcmF0aW9uIHdvdWxkIGJsb2NrIFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VOT01TR30gTm8gbWVzc2FnZSBvZiBkZXNpcmVkIHR5cGUgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RUlEUk19IElkZW50aWZpZXIgcmVtb3ZlZCBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFQ0hSTkd9IENoYW5uZWwgbnVtYmVyIG91dCBvZiByYW5nZSBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFTDJOU1lOQ30gTGV2ZWwgMiBub3Qgc3luY2hyb25pemVkIFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VMM0hMVH0gTGV2ZWwgMyBoYWx0ZWQgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RUwzUlNUfSBMZXZlbCAzIHJlc2V0IFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VMTlJOR30gTGluayBudW1iZXIgb3V0IG9mIHJhbmdlIFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VVTkFUQ0h9IFByb3RvY29sIGRyaXZlciBub3QgYXR0YWNoZWQgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RU5PQ1NJfSBObyBDU0kgc3RydWN0dXJlIGF2YWlsYWJsZSBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFTDJITFR9IExldmVsIDIgaGFsdGVkIFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VCQURFfSBJbnZhbGlkIGV4Y2hhbmdlIFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VCQURSfSBJbnZhbGlkIHJlcXVlc3QgZGVzY3JpcHRvciBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFWEZVTEx9IEV4Y2hhbmdlIGZ1bGwgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RU5PQU5PfSBObyBhbm9kZSBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFQkFEUlFDfSBJbnZhbGlkIHJlcXVlc3QgY29kZSBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFQkFEU0xUfSBJbnZhbGlkIHNsb3QgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RURFQURMT0NLfSBGaWxlIGxvY2tpbmcgZGVhZGxvY2sgZXJyb3IgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RUJGT05UfSBCYWQgZm9udCBmaWxlIGZvcm1hdCBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFTk9TVFJ9IERldmljZSBub3QgYSBzdHJlYW0gXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RU5PREFUQX0gTm8gZGF0YSBhdmFpbGFibGUgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RVRJTUV9IFRpbWVyIGV4cGlyZWQgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RU5PU1J9IE91dCBvZiBzdHJlYW1zIHJlc291cmNlcyBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFTk9ORVR9IE1hY2hpbmUgaXMgbm90IG9uIHRoZSBuZXR3b3JrIFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VOT1BLR30gUGFja2FnZSBub3QgaW5zdGFsbGVkIFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VSRU1PVEV9IE9iamVjdCBpcyByZW1vdGUgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RU5PTElOS30gTGluayBoYXMgYmVlbiBzZXZlcmVkIFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VBRFZ9IEFkdmVydGlzZSBlcnJvciBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFU1JNTlR9IFNybW91bnQgZXJyb3IgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RUNPTU19IENvbW11bmljYXRpb24gZXJyb3Igb24gc2VuZCBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFUFJPVE99IFByb3RvY29sIGVycm9yIFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VNVUxUSUhPUH0gTXVsdGlob3AgYXR0ZW1wdGVkIFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VET1RET1R9IFJGUyBzcGVjaWZpYyBlcnJvciBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFQkFETVNHfSBOb3QgYSBkYXRhIG1lc3NhZ2UgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RU9WRVJGTE9XfSBWYWx1ZSB0b28gbGFyZ2UgZm9yIGRlZmluZWQgZGF0YSB0eXBlIFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VOT1RVTklRfSBOYW1lIG5vdCB1bmlxdWUgb24gbmV0d29yayBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFQkFERkR9IEZpbGUgZGVzY3JpcHRvciBpbiBiYWQgc3RhdGUgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RVJFTUNIR30gUmVtb3RlIGFkZHJlc3MgY2hhbmdlZCBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFTElCQUNDfSBDYW4gbm90IGFjY2VzcyBhIG5lZWRlZCBzaGFyZWQgbGlicmFyeSBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFTElCQkFEfSBBY2Nlc3NpbmcgYSBjb3JydXB0ZWQgc2hhcmVkIGxpYnJhcnkgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RUxJQlNDTn0gLmxpYiBzZWN0aW9uIGluIGEub3V0IGNvcnJ1cHRlZCBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFTElCTUFYfSBBdHRlbXB0aW5nIHRvIGxpbmsgaW4gdG9vIG1hbnkgc2hhcmVkIGxpYnJhcmllcyBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFTElCRVhFQ30gQ2Fubm90IGV4ZWMgYSBzaGFyZWQgbGlicmFyeSBkaXJlY3RseSBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFSUxTRVF9IElsbGVnYWwgYnl0ZSBzZXF1ZW5jZSBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFUkVTVEFSVH0gSW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwgc2hvdWxkIGJlIHJlc3RhcnRlZCBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFU1RSUElQRX0gU3RyZWFtcyBwaXBlIGVycm9yIFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VVU0VSU30gVG9vIG1hbnkgdXNlcnMgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RU5PVFNPQ0t9IFNvY2tldCBvcGVyYXRpb24gb24gbm9uLXNvY2tldCBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFREVTVEFERFJSRVF9IERlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RU1TR1NJWkV9IE1lc3NhZ2UgdG9vIGxvbmcgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RVBST1RPVFlQRX0gUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0IFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VOT1BST1RPT1BUfSBQcm90b2NvbCBub3QgYXZhaWxhYmxlIFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VQUk9UT05PU1VQUE9SVH0gUHJvdG9jb2wgbm90IHN1cHBvcnRlZCBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFU09DS1ROT1NVUFBPUlR9IFNvY2tldCB0eXBlIG5vdCBzdXBwb3J0ZWQgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RU9QTk9UU1VQUH0gT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgb24gdHJhbnNwb3J0IGVuZHBvaW50IFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VQRk5PU1VQUE9SVH0gUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RUFGTk9TVVBQT1JUfSBBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvY29sIFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VBRERSSU5VU0V9IEFkZHJlc3MgYWxyZWFkeSBpbiB1c2UgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RUFERFJOT1RBVkFJTH0gQ2Fubm90IGFzc2lnbiByZXF1ZXN0ZWQgYWRkcmVzcyBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFTkVURE9XTn0gTmV0d29yayBpcyBkb3duIFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VORVRVTlJFQUNIfSBOZXR3b3JrIGlzIHVucmVhY2hhYmxlIFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VORVRSRVNFVH0gTmV0d29yayBkcm9wcGVkIGNvbm5lY3Rpb24gYmVjYXVzZSBvZiByZXNldCBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFQ09OTkFCT1JURUR9IFNvZnR3YXJlIGNhdXNlZCBjb25uZWN0aW9uIGFib3J0IFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VDT05OUkVTRVR9IENvbm5lY3Rpb24gcmVzZXQgYnkgcGVlciBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFTk9CVUZTfSBObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlIFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VJU0NPTk59IFRyYW5zcG9ydCBlbmRwb2ludCBpcyBhbHJlYWR5IGNvbm5lY3RlZCBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFTk9UQ09OTn0gVHJhbnNwb3J0IGVuZHBvaW50IGlzIG5vdCBjb25uZWN0ZWQgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RVNIVVRET1dOfSBDYW5ub3Qgc2VuZCBhZnRlciB0cmFuc3BvcnQgZW5kcG9pbnQgc2h1dGRvd24gXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RVRPT01BTllSRUZTfSBUb28gbWFueSByZWZlcmVuY2VzOiBjYW5ub3Qgc3BsaWNlIFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VUSU1FRE9VVH0gQ29ubmVjdGlvbiB0aW1lZCBvdXQgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RUNPTk5SRUZVU0VEfSBDb25uZWN0aW9uIHJlZnVzZWQgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RUhPU1RET1dOfSBIb3N0IGlzIGRvd24gXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RUhPU1RVTlJFQUNIfSBObyByb3V0ZSB0byBob3N0IFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VBTFJFQURZfSBPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcyBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFSU5QUk9HUkVTU30gT3BlcmF0aW9uIG5vdyBpbiBwcm9ncmVzcyBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFU1RBTEV9IFN0YWxlIE5GUyBmaWxlIGhhbmRsZSBcZW5ke2RhdGFkZXNjfQotXGJlZ2lue2RhdGFkZXNjfXtFVUNMRUFOfSBTdHJ1Y3R1cmUgbmVlZHMgY2xlYW5pbmcgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RU5PVE5BTX0gTm90IGEgWEVOSVggbmFtZWQgdHlwZSBmaWxlIFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VOQVZBSUx9IE5vIFhFTklYIHNlbWFwaG9yZXMgYXZhaWxhYmxlIFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VJU05BTX0gSXMgYSBuYW1lZCB0eXBlIGZpbGUgXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317RVJFTU9URUlPfSBSZW1vdGUgSS9PIGVycm9yIFxlbmR7ZGF0YWRlc2N9Ci1cYmVnaW57ZGF0YWRlc2N9e0VEUVVPVH0gUXVvdGEgZXhjZWVkZWQgXGVuZHtkYXRhZGVzY30KLQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJldHJlZS50ZXggYi9Eb2MvbGliL2xpYmV0cmVlLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYyMGVlMy4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmV0cmVlLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDQyNiArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3htbC5ldHJlZS5FbGVtZW50VHJlZX0gLS0tIFRoZSBFbGVtZW50VHJlZSBYTUwgQVBJfQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e3htbC5ldHJlZS5FbGVtZW50VHJlZX0KLVxtb2R1bGVhdXRob3J7RnJlZHJpayBMdW5kaH17ZnJlZHJpa0BweXRob253YXJlLmNvbX0KLVxtb2R1bGVzeW5vcHNpc3tJbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWxlbWVudFRyZWUgQVBJLn0KLQotXHZlcnNpb25hZGRlZHsyLjV9Ci0KLVRoZSBFbGVtZW50IHR5cGUgaXMgYSBmbGV4aWJsZSBjb250YWluZXIgb2JqZWN0LCBkZXNpZ25lZCB0byBzdG9yZQotaGllcmFyY2hpY2FsIGRhdGEgc3RydWN0dXJlcyBpbiBtZW1vcnkuIFRoZSB0eXBlIGNhbiBiZSBkZXNjcmliZWQgYXMgYQotY3Jvc3MgYmV0d2VlbiBhIGxpc3QgYW5kIGEgZGljdGlvbmFyeS4KLQotRWFjaCBlbGVtZW50IGhhcyBhIG51bWJlciBvZiBwcm9wZXJ0aWVzIGFzc29jaWF0ZWQgd2l0aCBpdDoKLQotXGJlZ2lue2l0ZW1pemV9Ci0gIFxpdGVtIGEgdGFnIHdoaWNoIGlzIGEgc3RyaW5nIGlkZW50aWZ5aW5nIHdoYXQga2luZCBvZiBkYXRhCi0gICAgICAgIHRoaXMgZWxlbWVudCByZXByZXNlbnRzICh0aGUgZWxlbWVudCB0eXBlLCBpbiBvdGhlciB3b3JkcykuCi0gIFxpdGVtIGEgbnVtYmVyIG9mIGF0dHJpYnV0ZXMsIHN0b3JlZCBpbiBhIFB5dGhvbiBkaWN0aW9uYXJ5LgotICBcaXRlbSBhIHRleHQgc3RyaW5nLgotICBcaXRlbSBhbiBvcHRpb25hbCB0YWlsIHN0cmluZy4KLSAgXGl0ZW0gYSBudW1iZXIgb2YgY2hpbGQgZWxlbWVudHMsIHN0b3JlZCBpbiBhIFB5dGhvbiBzZXF1ZW5jZQotXGVuZHtpdGVtaXplfQotCi1UbyBjcmVhdGUgYW4gZWxlbWVudCBpbnN0YW5jZSwgdXNlIHRoZSBFbGVtZW50IG9yIFN1YkVsZW1lbnQgZmFjdG9yeQotZnVuY3Rpb25zLgotCi1UaGUgXGNsYXNze0VsZW1lbnRUcmVlfSBjbGFzcyBjYW4gYmUgdXNlZCB0byB3cmFwIGFuIGVsZW1lbnQKLXN0cnVjdHVyZSwgYW5kIGNvbnZlcnQgaXQgZnJvbSBhbmQgdG8gWE1MLgotCi1BIEMgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBBUEkgaXMgYXZhaWxhYmxlIGFzCi1cbW9kdWxle3htbC5ldHJlZS5jRWxlbWVudFRyZWV9LgotCi0KLVxzdWJzZWN0aW9ue0Z1bmN0aW9uc1xsYWJlbHtlbGVtZW50dHJlZS1mdW5jdGlvbnN9fQotCi1cYmVnaW57ZnVuY2Rlc2N9e0NvbW1lbnR9e1xvcHRpb25hbHt0ZXh0fX0KLUNvbW1lbnQgZWxlbWVudCBmYWN0b3J5LiAgVGhpcyBmYWN0b3J5IGZ1bmN0aW9uIGNyZWF0ZXMgYSBzcGVjaWFsCi1lbGVtZW50IHRoYXQgd2lsbCBiZSBzZXJpYWxpemVkIGFzIGFuIFhNTCBjb21tZW50LgotVGhlIGNvbW1lbnQgc3RyaW5nIGNhbiBiZSBlaXRoZXIgYW4gOC1iaXQgQVNDSUkgc3RyaW5nIG9yIGEgVW5pY29kZQotc3RyaW5nLgotXHZhcnt0ZXh0fSBpcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBjb21tZW50IHN0cmluZy4KLVJldHVybnMgYW4gZWxlbWVudCBpbnN0YW5jZSByZXByZXNlbnRpbmcgYSBjb21tZW50LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtkdW1wfXtlbGVtfQotV3JpdGVzIGFuIGVsZW1lbnQgdHJlZSBvciBlbGVtZW50IHN0cnVjdHVyZSB0byBzeXMuc3Rkb3V0LiAgVGhpcwotZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQgZm9yIGRlYnVnZ2luZyBvbmx5LgotCi1UaGUgZXhhY3Qgb3V0cHV0IGZvcm1hdCBpcyBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQuICBJbiB0aGlzCi12ZXJzaW9uLCBpdCdzIHdyaXR0ZW4gYXMgYW4gb3JkaW5hcnkgWE1MIGZpbGUuCi0KLVx2YXJ7ZWxlbX0gaXMgYW4gZWxlbWVudCB0cmVlIG9yIGFuIGluZGl2aWR1YWwgZWxlbWVudC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317RWxlbWVudH17dGFnXG9wdGlvbmFseywgYXR0cmlifVxvcHRpb25hbHssICoqZXh0cmF9fQotRWxlbWVudCBmYWN0b3J5LiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIG9iamVjdCBpbXBsZW1lbnRpbmcgdGhlCi1zdGFuZGFyZCBFbGVtZW50IGludGVyZmFjZS4gIFRoZSBleGFjdCBjbGFzcyBvciB0eXBlIG9mIHRoYXQgb2JqZWN0Ci1pcyBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQsIGJ1dCBpdCB3aWxsIGFsd2F5cyBiZSBjb21wYXRpYmxlIHdpdGgKLXRoZSB7XF99RWxlbWVudEludGVyZmFjZSBjbGFzcyBpbiB0aGlzIG1vZHVsZS4KLQotVGhlIGVsZW1lbnQgbmFtZSwgYXR0cmlidXRlIG5hbWVzLCBhbmQgYXR0cmlidXRlIHZhbHVlcyBjYW4gYmUKLWVpdGhlciA4LWJpdCBBU0NJSSBzdHJpbmdzIG9yIFVuaWNvZGUgc3RyaW5ncy4KLVx2YXJ7dGFnfSBpcyB0aGUgZWxlbWVudCBuYW1lLgotXHZhcnthdHRyaWJ9IGlzIGFuIG9wdGlvbmFsIGRpY3Rpb25hcnksIGNvbnRhaW5pbmcgZWxlbWVudCBhdHRyaWJ1dGVzLgotXHZhcntleHRyYX0gY29udGFpbnMgYWRkaXRpb25hbCBhdHRyaWJ1dGVzLCBnaXZlbiBhcyBrZXl3b3JkIGFyZ3VtZW50cy4KLVJldHVybnMgYW4gZWxlbWVudCBpbnN0YW5jZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZnJvbXN0cmluZ317dGV4dH0KLVBhcnNlcyBhbiBYTUwgc2VjdGlvbiBmcm9tIGEgc3RyaW5nIGNvbnN0YW50LiAgU2FtZSBhcyBYTUwuCi1cdmFye3RleHR9IGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgWE1MIGRhdGEuCi1SZXR1cm5zIGFuIEVsZW1lbnQgaW5zdGFuY2UuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2lzZWxlbWVudH17ZWxlbWVudH0KLUNoZWNrcyBpZiBhbiBvYmplY3QgYXBwZWFycyB0byBiZSBhIHZhbGlkIGVsZW1lbnQgb2JqZWN0LgotXHZhcntlbGVtZW50fSBpcyBhbiBlbGVtZW50IGluc3RhbmNlLgotUmV0dXJucyBhIHRydWUgdmFsdWUgaWYgdGhpcyBpcyBhbiBlbGVtZW50IG9iamVjdC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aXRlcnBhcnNlfXtzb3VyY2Vcb3B0aW9uYWx7LCBldmVudHN9fQotUGFyc2VzIGFuIFhNTCBzZWN0aW9uIGludG8gYW4gZWxlbWVudCB0cmVlIGluY3JlbWVudGFsbHksIGFuZCByZXBvcnRzCi13aGF0J3MgZ29pbmcgb24gdG8gdGhlIHVzZXIuCi1cdmFye3NvdXJjZX0gaXMgYSBmaWxlbmFtZSBvciBmaWxlIG9iamVjdCBjb250YWluaW5nIFhNTCBkYXRhLgotXHZhcntldmVudHN9IGlzIGEgbGlzdCBvZiBldmVudHMgdG8gcmVwb3J0IGJhY2suICBJZiBvbWl0dGVkLCBvbmx5IGBgZW5kJycKLWV2ZW50cyBhcmUgcmVwb3J0ZWQuCi1SZXR1cm5zIGFuIGl0ZXJhdG9yIHByb3ZpZGluZyBcY29kZXsoXHZhcntldmVudH0sIFx2YXJ7ZWxlbX0pfSBwYWlycy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cGFyc2V9e3NvdXJjZVxvcHRpb25hbHssIHBhcnNlcn19Ci1QYXJzZXMgYW4gWE1MIHNlY3Rpb24gaW50byBhbiBlbGVtZW50IHRyZWUuCi1cdmFye3NvdXJjZX0gaXMgYSBmaWxlbmFtZSBvciBmaWxlIG9iamVjdCBjb250YWluaW5nIFhNTCBkYXRhLgotXHZhcntwYXJzZXJ9IGlzIGFuIG9wdGlvbmFsIHBhcnNlciBpbnN0YW5jZS4gIElmIG5vdCBnaXZlbiwgdGhlCi1zdGFuZGFyZCBYTUxUcmVlQnVpbGRlciBwYXJzZXIgaXMgdXNlZC4KLVJldHVybnMgYW4gRWxlbWVudFRyZWUgaW5zdGFuY2UuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e1Byb2Nlc3NpbmdJbnN0cnVjdGlvbn17dGFyZ2V0XG9wdGlvbmFseywgdGV4dH19Ci1QSSBlbGVtZW50IGZhY3RvcnkuICBUaGlzIGZhY3RvcnkgZnVuY3Rpb24gY3JlYXRlcyBhIHNwZWNpYWwgZWxlbWVudAotdGhhdCB3aWxsIGJlIHNlcmlhbGl6ZWQgYXMgYW4gWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uCi1cdmFye3RhcmdldH0gaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgUEkgdGFyZ2V0LgotXHZhcnt0ZXh0fSBpcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBQSSBjb250ZW50cywgaWYgZ2l2ZW4uCi1SZXR1cm5zIGFuIGVsZW1lbnQgaW5zdGFuY2UsIHJlcHJlc2VudGluZyBhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e1N1YkVsZW1lbnR9e3BhcmVudCwgdGFnXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmliXG9wdGlvbmFseywgICoqZXh0cmF9fX0KLVN1YmVsZW1lbnQgZmFjdG9yeS4gIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhbiBlbGVtZW50IGluc3RhbmNlLCBhbmQKLWFwcGVuZHMgaXQgdG8gYW4gZXhpc3RpbmcgZWxlbWVudC4KLQotVGhlIGVsZW1lbnQgbmFtZSwgYXR0cmlidXRlIG5hbWVzLCBhbmQgYXR0cmlidXRlIHZhbHVlcyBjYW4gYmUKLWVpdGhlciA4LWJpdCBBU0NJSSBzdHJpbmdzIG9yIFVuaWNvZGUgc3RyaW5ncy4KLVx2YXJ7cGFyZW50fSBpcyB0aGUgcGFyZW50IGVsZW1lbnQuCi1cdmFye3RhZ30gaXMgdGhlIHN1YmVsZW1lbnQgbmFtZS4KLVx2YXJ7YXR0cmlifSBpcyBhbiBvcHRpb25hbCBkaWN0aW9uYXJ5LCBjb250YWluaW5nIGVsZW1lbnQgYXR0cmlidXRlcy4KLVx2YXJ7ZXh0cmF9IGNvbnRhaW5zIGFkZGl0aW9uYWwgYXR0cmlidXRlcywgZ2l2ZW4gYXMga2V5d29yZCBhcmd1bWVudHMuCi1SZXR1cm5zIGFuIGVsZW1lbnQgaW5zdGFuY2UuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3Rvc3RyaW5nfXtlbGVtZW50XG9wdGlvbmFseywgZW5jb2Rpbmd9fQotR2VuZXJhdGVzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIFhNTCBlbGVtZW50LCBpbmNsdWRpbmcgYWxsCi1zdWJlbGVtZW50cy4KLVx2YXJ7ZWxlbWVudH0gaXMgYW4gRWxlbWVudCBpbnN0YW5jZS4KLVx2YXJ7ZW5jb2Rpbmd9IGlzIHRoZSBvdXRwdXQgZW5jb2RpbmcgKGRlZmF1bHQgaXMgVVMtQVNDSUkpLgotUmV0dXJucyBhbiBlbmNvZGVkIHN0cmluZyBjb250YWluaW5nIHRoZSBYTUwgZGF0YS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317WE1MfXt0ZXh0fQotUGFyc2VzIGFuIFhNTCBzZWN0aW9uIGZyb20gYSBzdHJpbmcgY29uc3RhbnQuICBUaGlzIGZ1bmN0aW9uIGNhbgotYmUgdXNlZCB0byBlbWJlZCBgYFhNTCBsaXRlcmFscycnIGluIFB5dGhvbiBjb2RlLgotXHZhcnt0ZXh0fSBpcyBhIHN0cmluZyBjb250YWluaW5nIFhNTCBkYXRhLgotUmV0dXJucyBhbiBFbGVtZW50IGluc3RhbmNlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtYTUxJRH17dGV4dH0KLVBhcnNlcyBhbiBYTUwgc2VjdGlvbiBmcm9tIGEgc3RyaW5nIGNvbnN0YW50LCBhbmQgYWxzbyByZXR1cm5zCi1hIGRpY3Rpb25hcnkgd2hpY2ggbWFwcyBmcm9tIGVsZW1lbnQgaWQ6cyB0byBlbGVtZW50cy4KLVx2YXJ7dGV4dH0gaXMgYSBzdHJpbmcgY29udGFpbmluZyBYTUwgZGF0YS4KLVJldHVybnMgYSB0dXBsZSBjb250YWluaW5nIGFuIEVsZW1lbnQgaW5zdGFuY2UgYW5kIGEgZGljdGlvbmFyeS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotXHN1YnNlY3Rpb257VGhlIEVsZW1lbnQgSW50ZXJmYWNlXGxhYmVse2VsZW1lbnR0cmVlLWVsZW1lbnQtaW50ZXJmYWNlfX0KLQotRWxlbWVudCBvYmplY3RzIHJldHVybmVkIGJ5IEVsZW1lbnQgb3IgU3ViRWxlbWVudCBoYXZlIHRoZSAKLWZvbGxvd2luZyBtZXRob2RzIGFuZCBhdHRyaWJ1dGVzLgotCi1cYmVnaW57bWVtYmVyZGVzY31bRWxlbWVudF17dGFnfQotQSBzdHJpbmcgaWRlbnRpZnlpbmcgd2hhdCBraW5kIG9mIGRhdGEgdGhpcyBlbGVtZW50IHJlcHJlc2VudHMKLSh0aGUgZWxlbWVudCB0eXBlLCBpbiBvdGhlciB3b3JkcykuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtFbGVtZW50XXt0ZXh0fQotVGhlIFx2YXJ7dGV4dH0gYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIGhvbGQgYWRkaXRpb25hbCBkYXRhCi1hc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQuCi1BcyB0aGUgbmFtZSBpbXBsaWVzIHRoaXMgYXR0cmlidXRlIGlzIHVzdWFsbHkgYSBzdHJpbmcgYnV0IG1heSBiZSBhbnkKLWFwcGxpY2F0aW9uLXNwZWNpZmljIG9iamVjdC4KLUlmIHRoZSBlbGVtZW50IGlzIGNyZWF0ZWQgZnJvbSBhbiBYTUwgZmlsZSB0aGUgYXR0cmlidXRlIHdpbGwgY29udGFpbgotYW55IHRleHQgZm91bmQgYmV0d2VlbiB0aGUgZWxlbWVudCB0YWdzLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bRWxlbWVudF17dGFpbH0KLVRoZSBcdmFye3RhaWx9IGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBob2xkIGFkZGl0aW9uYWwgZGF0YQotYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50LgotVGhpcyBhdHRyaWJ1dGUgaXMgdXN1YWxseSBhIHN0cmluZyBidXQgbWF5IGJlIGFueSBhcHBsaWNhdGlvbi1zcGVjaWZpYyBvYmplY3QuCi1JZiB0aGUgZWxlbWVudCBpcyBjcmVhdGVkIGZyb20gYW4gWE1MIGZpbGUgdGhlIGF0dHJpYnV0ZSB3aWxsIGNvbnRhaW4KLWFueSB0ZXh0IGZvdW5kIGFmdGVyIHRoZSBlbGVtZW50J3MgZW5kIHRhZyBhbmQgYmVmb3JlIHRoZSBuZXh0IHRhZy4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W0VsZW1lbnRde2F0dHJpYn0KLUEgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBlbGVtZW50J3MgYXR0cmlidXRlcy4KLU5vdGUgdGhhdCB3aGlsZSB0aGUgXHZhcnthdHRyaWJ9IHZhbHVlIGlzIGFsd2F5cyBhIHJlYWwgbXV0YWJsZSBQeXRob24KLWRpY3Rpb25hcnksIGFuIEVsZW1lbnRUcmVlIGltcGxlbWVudGF0aW9uIG1heSBjaG9vc2UgdG8gdXNlIGFub3RoZXIKLWludGVybmFsIHJlcHJlc2VudGF0aW9uLCBhbmQgY3JlYXRlIHRoZSBkaWN0aW9uYXJ5IG9ubHkgaWYgc29tZW9uZQotYXNrcyBmb3IgaXQuIFRvIHRha2UgYWR2YW50YWdlIG9mIHN1Y2ggaW1wbGVtZW50YXRpb25zLCB1c2UgdGhlCi1kaWN0aW9uYXJ5IG1ldGhvZHMgYmVsb3cgd2hlbmV2ZXIgcG9zc2libGUuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVRoZSBmb2xsb3dpbmcgZGljdGlvbmFyeS1saWtlIG1ldGhvZHMgd29yayBvbiB0aGUgZWxlbWVudCBhdHRyaWJ1dGVzLgotCi1cYmVnaW57bWV0aG9kZGVzY31bRWxlbWVudF17Y2xlYXJ9e30KLVJlc2V0cyBhbiBlbGVtZW50LiAgVGhpcyBmdW5jdGlvbiByZW1vdmVzIGFsbCBzdWJlbGVtZW50cywgY2xlYXJzCi1hbGwgYXR0cmlidXRlcywgYW5kIHNldHMgdGhlIHRleHQgYW5kIHRhaWwgYXR0cmlidXRlcyB0byBOb25lLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRWxlbWVudF17Z2V0fXtrZXlcb3B0aW9uYWx7LCBkZWZhdWx0PU5vbmV9fQotR2V0cyB0aGUgZWxlbWVudCBhdHRyaWJ1dGUgbmFtZWQgXHZhcntrZXl9LgotCi1SZXR1cm5zIHRoZSBhdHRyaWJ1dGUgdmFsdWUsIG9yIFx2YXJ7ZGVmYXVsdH0gaWYgdGhlCi1hdHRyaWJ1dGUgd2FzIG5vdCBmb3VuZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0VsZW1lbnRde2l0ZW1zfXt9Ci1SZXR1cm5zIHRoZSBlbGVtZW50IGF0dHJpYnV0ZXMgYXMgYSBzZXF1ZW5jZSBvZiAobmFtZSwgdmFsdWUpIHBhaXJzLgotVGhlIGF0dHJpYnV0ZXMgYXJlIHJldHVybmVkIGluIGFuIGFyYml0cmFyeSBvcmRlci4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0VsZW1lbnRde2tleXN9e30KLVJldHVybnMgdGhlIGVsZW1lbnRzIGF0dHJpYnV0ZSBuYW1lcyBhcyBhIGxpc3QuCi1UaGUgbmFtZXMgYXJlIHJldHVybmVkIGluIGFuIGFyYml0cmFyeSBvcmRlci4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0VsZW1lbnRde3NldH17a2V5LCB2YWx1ZX0KLVNldCB0aGUgYXR0cmlidXRlIFx2YXJ7a2V5fSBvbiB0aGUgZWxlbWVudCB0byBcdmFye3ZhbHVlfS4gIAotXGVuZHttZXRob2RkZXNjfQotCi1UaGUgZm9sbG93aW5nIG1ldGhvZHMgd29yayBvbiB0aGUgZWxlbWVudCdzIGNoaWxkcmVuIChzdWJlbGVtZW50cykuCi0KLVxiZWdpbnttZXRob2RkZXNjfVtFbGVtZW50XXthcHBlbmR9e3N1YmVsZW1lbnR9Ci1BZGRzIHRoZSBlbGVtZW50IFx2YXJ7c3ViZWxlbWVudH0gdG8gdGhlIGVuZCBvZiB0aGlzIGVsZW1lbnRzIGludGVybmFsIGxpc3QKLW9mIHN1YmVsZW1lbnRzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRWxlbWVudF17ZmluZH17bWF0Y2h9Ci1GaW5kcyB0aGUgZmlyc3Qgc3ViZWxlbWVudCBtYXRjaGluZyBcdmFye21hdGNofS4gCi1cdmFye21hdGNofSBtYXkgYmUgYSB0YWcgbmFtZSBvciBwYXRoLgotUmV0dXJucyBhbiBlbGVtZW50IGluc3RhbmNlIG9yIFxjb2Rle05vbmV9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRWxlbWVudF17ZmluZGFsbH17bWF0Y2h9Ci1GaW5kcyBhbGwgc3ViZWxlbWVudHMgbWF0Y2hpbmcgXHZhcnttYXRjaH0uIAotXHZhcnttYXRjaH0gbWF5IGJlIGEgdGFnIG5hbWUgb3IgcGF0aC4KLVJldHVybnMgYW4gaXRlcmFibGUgeWllbGRpbmcgYWxsIG1hdGNoaW5nIGVsZW1lbnRzIGluIGRvY3VtZW50IG9yZGVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRWxlbWVudF17ZmluZHRleHR9e2NvbmRpdGlvblxvcHRpb25hbHssIGRlZmF1bHQ9Tm9uZX19Ci1GaW5kcyB0ZXh0IGZvciB0aGUgZmlyc3Qgc3ViZWxlbWVudCBtYXRjaGluZyBcdmFye2NvbmRpdGlvbn0uIAotXHZhcntjb25kaXRpb259IG1heSBiZSBhIHRhZyBuYW1lIG9yIHBhdGguCi1SZXR1cm5zIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGZpcnN0IG1hdGNoaW5nIGVsZW1lbnQsIG9yCi1cdmFye2RlZmF1bHR9IGlmIG5vIGVsZW1lbnQgd2FzIGZvdW5kLiAgTm90ZSB0aGF0IGlmIHRoZQotbWF0Y2hpbmcgZWxlbWVudCBoYXMgbm8gdGV4dCBjb250ZW50IGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0VsZW1lbnRde2dldGNoaWxkcmVufXt9Ci1SZXR1cm5zIGFsbCBzdWJlbGVtZW50cy4gIFRoZSBlbGVtZW50cyBhcmUgcmV0dXJuZWQgaW4gZG9jdW1lbnQgb3JkZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtFbGVtZW50XXtnZXRpdGVyYXRvcn17XG9wdGlvbmFse3RhZz1Ob25lfX0KLUNyZWF0ZXMgYSB0cmVlIGl0ZXJhdG9yIHdpdGggdGhlIGN1cnJlbnQgZWxlbWVudCBhcyB0aGUgcm9vdC4gIAotVGhlIGl0ZXJhdG9yIGl0ZXJhdGVzIG92ZXIgdGhpcyBlbGVtZW50IGFuZCBhbGwgZWxlbWVudHMgYmVsb3cgaXQgCi10aGF0IG1hdGNoIHRoZSBnaXZlbiB0YWcuIElmIHRhZwotaXMgXGNvZGV7Tm9uZX0gb3IgXGNvZGV7JyonfSB0aGVuIGFsbCBlbGVtZW50cyBhcmUgaXRlcmF0ZWQgb3Zlci4KLVJldHVybnMgYW4gaXRlcmFibGUgdGhhdCBwcm92aWRlcyBlbGVtZW50IG9iamVjdHMgaW4gZG9jdW1lbnQgKGRlcHRoIGZpcnN0KQotb3JkZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtFbGVtZW50XXtpbnNlcnR9e2luZGV4LCBlbGVtZW50fQotSW5zZXJ0cyBhIHN1YmVsZW1lbnQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uIGluIHRoaXMgZWxlbWVudC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0VsZW1lbnRde21ha2VlbGVtZW50fXt0YWcsIGF0dHJpYn0KLUNyZWF0ZXMgYSBuZXcgZWxlbWVudCBvYmplY3Qgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGlzIGVsZW1lbnQuCi1EbyBub3QgY2FsbCB0aGlzIG1ldGhvZCwgdXNlIHRoZSBTdWJFbGVtZW50IGZhY3RvcnkgZnVuY3Rpb24gaW5zdGVhZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0VsZW1lbnRde3JlbW92ZX17c3ViZWxlbWVudH0KLVJlbW92ZXMgXHZhcntzdWJlbGVtZW50fSBmcm9tIHRoZSBlbGVtZW50LiAgCi1Vbmxpa2UgdGhlIGZpbmRYWFggbWV0aG9kcyB0aGlzIG1ldGhvZCBjb21wYXJlcyBlbGVtZW50cyBiYXNlZCBvbiAKLXRoZSBpbnN0YW5jZSBpZGVudGl0eSwgbm90IG9uIHRhZyB2YWx1ZSBvciBjb250ZW50cy4KLVxlbmR7bWV0aG9kZGVzY30KLQotRWxlbWVudCBvYmplY3RzIGFsc28gc3VwcG9ydCB0aGUgZm9sbG93aW5nIHNlcXVlbmNlIHR5cGUgbWV0aG9kcyBmb3IKLXdvcmtpbmcgd2l0aCBzdWJlbGVtZW50czogXG1ldGhvZHtfX2RlbGl0ZW1fXygpfSwKLVxtZXRob2R7X19nZXRpdGVtX18oKX0sIFxtZXRob2R7X19zZXRpdGVtX18oKX0sIFxtZXRob2R7X19sZW5fXygpfS4KLQotQ2F1dGlvbjogQmVjYXVzZSBFbGVtZW50IG9iamVjdHMgZG8gbm90IGRlZmluZSBhCi1cbWV0aG9ke19fbm9uemVyb19fKCl9IG1ldGhvZCwgZWxlbWVudHMgd2l0aCBubyBzdWJlbGVtZW50cyB3aWxsIHRlc3QKLWFzIFxjb2Rle0ZhbHNlfS4KLQotXGJlZ2lue3ZlcmJhdGltfQotZWxlbWVudCA9IHJvb3QuZmluZCgnZm9vJykKLQotaWYgbm90IGVsZW1lbnQ6ICMgY2FyZWZ1bCEKLSAgICBwcmludCAiZWxlbWVudCBub3QgZm91bmQsIG9yIGVsZW1lbnQgaGFzIG5vIHN1YmVsZW1lbnRzIgotCi1pZiBlbGVtZW50IGlzIE5vbmU6Ci0gICAgcHJpbnQgImVsZW1lbnQgbm90IGZvdW5kIgotXGVuZHt2ZXJiYXRpbX0KLQotCi1cc3Vic2VjdGlvbntFbGVtZW50VHJlZSBPYmplY3RzXGxhYmVse2VsZW1lbnR0cmVlLWVsZW1lbnR0cmVlLW9iamVjdHN9fQotCi1cYmVnaW57Y2xhc3NkZXNjfXtFbGVtZW50VHJlZX17XG9wdGlvbmFse2VsZW1lbnQsfSBcb3B0aW9uYWx7ZmlsZX19Ci1FbGVtZW50VHJlZSB3cmFwcGVyIGNsYXNzLiAgVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGVudGlyZSBlbGVtZW50Ci1oaWVyYXJjaHksIGFuZCBhZGRzIHNvbWUgZXh0cmEgc3VwcG9ydCBmb3Igc2VyaWFsaXphdGlvbiB0byBhbmQgZnJvbQotc3RhbmRhcmQgWE1MLgotCi1cdmFye2VsZW1lbnR9IGlzIHRoZSByb290IGVsZW1lbnQuCi1UaGUgdHJlZSBpcyBpbml0aWFsaXplZCB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgWE1MIFx2YXJ7ZmlsZX0gaWYgZ2l2ZW4uCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e19zZXRyb290fXtlbGVtZW50fQotUmVwbGFjZXMgdGhlIHJvb3QgZWxlbWVudCBmb3IgdGhpcyB0cmVlLiAgVGhpcyBkaXNjYXJkcyB0aGUKLWN1cnJlbnQgY29udGVudHMgb2YgdGhlIHRyZWUsIGFuZCByZXBsYWNlcyBpdCB3aXRoIHRoZSBnaXZlbgotZWxlbWVudC4gIFVzZSB3aXRoIGNhcmUuCi1cdmFye2VsZW1lbnR9IGlzIGFuIGVsZW1lbnQgaW5zdGFuY2UuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtmaW5kfXtwYXRofQotRmluZHMgdGhlIGZpcnN0IHRvcGxldmVsIGVsZW1lbnQgd2l0aCBnaXZlbiB0YWcuCi1TYW1lIGFzIGdldHJvb3QoKS5maW5kKHBhdGgpLgotXHZhcntwYXRofSBpcyB0aGUgZWxlbWVudCB0byBsb29rIGZvci4KLVJldHVybnMgdGhlIGZpcnN0IG1hdGNoaW5nIGVsZW1lbnQsIG9yIFxjb2Rle05vbmV9IGlmIG5vIGVsZW1lbnQgd2FzIGZvdW5kLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317ZmluZGFsbH17cGF0aH0KLUZpbmRzIGFsbCB0b3BsZXZlbCBlbGVtZW50cyB3aXRoIHRoZSBnaXZlbiB0YWcuCi1TYW1lIGFzIGdldHJvb3QoKS5maW5kYWxsKHBhdGgpLgotXHZhcntwYXRofSBpcyB0aGUgZWxlbWVudCB0byBsb29rIGZvci4KLVJldHVybnMgYSBsaXN0IG9yIGl0ZXJhdG9yIGNvbnRhaW5pbmcgYWxsIG1hdGNoaW5nIGVsZW1lbnRzLAotaW4gZG9jdW1lbnQgb3JkZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtmaW5kdGV4dH17cGF0aFxvcHRpb25hbHssIGRlZmF1bHR9fQotRmluZHMgdGhlIGVsZW1lbnQgdGV4dCBmb3IgdGhlIGZpcnN0IHRvcGxldmVsIGVsZW1lbnQgd2l0aCBnaXZlbgotdGFnLiAgU2FtZSBhcyBnZXRyb290KCkuZmluZHRleHQocGF0aCkuCi1cdmFye3BhdGh9IGlzIHRoZSB0b3BsZXZlbCBlbGVtZW50IHRvIGxvb2sgZm9yLgotXHZhcntkZWZhdWx0fSBpcyB0aGUgdmFsdWUgdG8gcmV0dXJuIGlmIHRoZSBlbGVtZW50IHdhcyBub3QgZm91bmQuCi1SZXR1cm5zIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGZpcnN0IG1hdGNoaW5nIGVsZW1lbnQsIG9yIHRoZQotZGVmYXVsdCB2YWx1ZSBubyBlbGVtZW50IHdhcyBmb3VuZC4gIE5vdGUgdGhhdCBpZiB0aGUgZWxlbWVudAotaGFzIGlzIGZvdW5kLCBidXQgaGFzIG5vIHRleHQgY29udGVudCwgdGhpcyBtZXRob2QgcmV0dXJucyBhbgotZW1wdHkgc3RyaW5nLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Z2V0aXRlcmF0b3J9e1xvcHRpb25hbHt0YWd9fQotQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHRyZWUgaXRlcmF0b3IgZm9yIHRoZSByb290IGVsZW1lbnQuICBUaGUgaXRlcmF0b3IgbG9vcHMKLW92ZXIgYWxsIGVsZW1lbnRzIGluIHRoaXMgdHJlZSwgaW4gc2VjdGlvbiBvcmRlci4KLVx2YXJ7dGFnfSBpcyB0aGUgdGFnIHRvIGxvb2sgZm9yIChkZWZhdWx0IGlzIHRvIHJldHVybiBhbGwgZWxlbWVudHMpCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtnZXRyb290fXt9Ci1SZXR1cm5zIHRoZSByb290IGVsZW1lbnQgZm9yIHRoaXMgdHJlZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3BhcnNlfXtzb3VyY2Vcb3B0aW9uYWx7LCBwYXJzZXJ9fQotTG9hZHMgYW4gZXh0ZXJuYWwgWE1MIHNlY3Rpb24gaW50byB0aGlzIGVsZW1lbnQgdHJlZS4KLVx2YXJ7c291cmNlfSBpcyBhIGZpbGUgbmFtZSBvciBmaWxlIG9iamVjdC4KLVx2YXJ7cGFyc2VyfSBpcyBhbiBvcHRpb25hbCBwYXJzZXIgaW5zdGFuY2UuICBJZiBub3QgZ2l2ZW4sIHRoZQotc3RhbmRhcmQgWE1MVHJlZUJ1aWxkZXIgcGFyc2VyIGlzIHVzZWQuCi1SZXR1cm5zIHRoZSBzZWN0aW9uIHJvb3QgZWxlbWVudC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3dyaXRlfXtmaWxlXG9wdGlvbmFseywgZW5jb2Rpbmd9fQotV3JpdGVzIHRoZSBlbGVtZW50IHRyZWUgdG8gYSBmaWxlLCBhcyBYTUwuCi1cdmFye2ZpbGV9IGlzIGEgZmlsZSBuYW1lLCBvciBhIGZpbGUgb2JqZWN0IG9wZW5lZCBmb3Igd3JpdGluZy4KLVx2YXJ7ZW5jb2Rpbmd9IGlzIHRoZSBvdXRwdXQgZW5jb2RpbmcgKGRlZmF1bHQgaXMgVVMtQVNDSUkpLgotXGVuZHttZXRob2RkZXNjfQotCi0KLVxzdWJzZWN0aW9ue1FOYW1lIE9iamVjdHNcbGFiZWx7ZWxlbWVudHRyZWUtcW5hbWUtb2JqZWN0c319Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1FOYW1lfXt0ZXh0X29yX3VyaVxvcHRpb25hbHssIHRhZ319Ci1RTmFtZSB3cmFwcGVyLiAgVGhpcyBjYW4gYmUgdXNlZCB0byB3cmFwIGEgUU5hbWUgYXR0cmlidXRlIHZhbHVlLCBpbgotb3JkZXIgdG8gZ2V0IHByb3BlciBuYW1lc3BhY2UgaGFuZGxpbmcgb24gb3V0cHV0LgotXHZhcnt0ZXh0X29yX3VyaX0gaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgUU5hbWUgdmFsdWUsCi1pbiB0aGUgZm9ybSB7XHt9dXJpe1x9fWxvY2FsLCBvciwgaWYgdGhlIHRhZyBhcmd1bWVudCBpcyBnaXZlbiwKLXRoZSBVUkkgcGFydCBvZiBhIFFOYW1lLgotSWYgXHZhcnt0YWd9IGlzIGdpdmVuLCB0aGUgZmlyc3QgYXJndW1lbnQgaXMgaW50ZXJwcmV0ZWQgYXMKLWFuIFVSSSwgYW5kIHRoaXMgYXJndW1lbnQgaXMgaW50ZXJwcmV0ZWQgYXMgYSBsb2NhbCBuYW1lLgotXGNsYXNze1FOYW1lfSBpbnN0YW5jZXMgYXJlIG9wYXF1ZS4KLVxlbmR7Y2xhc3NkZXNjfQotCi0KLVxzdWJzZWN0aW9ue1RyZWVCdWlsZGVyIE9iamVjdHNcbGFiZWx7ZWxlbWVudHRyZWUtdHJlZWJ1aWxkZXItb2JqZWN0c319Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1RyZWVCdWlsZGVyfXtcb3B0aW9uYWx7ZWxlbWVudF9mYWN0b3J5fX0KLUdlbmVyaWMgZWxlbWVudCBzdHJ1Y3R1cmUgYnVpbGRlci4gIFRoaXMgYnVpbGRlciBjb252ZXJ0cyBhIHNlcXVlbmNlCi1vZiBzdGFydCwgZGF0YSwgYW5kIGVuZCBtZXRob2QgY2FsbHMgdG8gYSB3ZWxsLWZvcm1lZCBlbGVtZW50IHN0cnVjdHVyZS4KLVlvdSBjYW4gdXNlIHRoaXMgY2xhc3MgdG8gYnVpbGQgYW4gZWxlbWVudCBzdHJ1Y3R1cmUgdXNpbmcgYSBjdXN0b20gWE1MCi1wYXJzZXIsIG9yIGEgcGFyc2VyIGZvciBzb21lIG90aGVyIFhNTC1saWtlIGZvcm1hdC4KLVRoZSBcdmFye2VsZW1lbnRfZmFjdG9yeX0gaXMgY2FsbGVkIHRvIGNyZWF0ZSBuZXcgRWxlbWVudCBpbnN0YW5jZXMgd2hlbgotZ2l2ZW4uCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2Nsb3NlfXt9Ci1GbHVzaGVzIHRoZSBwYXJzZXIgYnVmZmVycywgYW5kIHJldHVybnMgdGhlIHRvcGxldmVsIGRvY3VtZW4KLWVsZW1lbnQuCi1SZXR1cm5zIGFuIEVsZW1lbnQgaW5zdGFuY2UuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtkYXRhfXtkYXRhfQotQWRkcyB0ZXh0IHRvIHRoZSBjdXJyZW50IGVsZW1lbnQuCi1cdmFye2RhdGF9IGlzIGEgc3RyaW5nLiAgVGhpcyBzaG91bGQgYmUgZWl0aGVyIGFuIDgtYml0IHN0cmluZwotY29udGFpbmluZyBBU0NJSSB0ZXh0LCBvciBhIFVuaWNvZGUgc3RyaW5nLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317ZW5kfXt0YWd9Ci1DbG9zZXMgdGhlIGN1cnJlbnQgZWxlbWVudC4KLVx2YXJ7dGFnfSBpcyB0aGUgZWxlbWVudCBuYW1lLgotUmV0dXJucyB0aGUgY2xvc2VkIGVsZW1lbnQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtzdGFydH17dGFnLCBhdHRyc30KLU9wZW5zIGEgbmV3IGVsZW1lbnQuCi1cdmFye3RhZ30gaXMgdGhlIGVsZW1lbnQgbmFtZS4KLVx2YXJ7YXR0cnN9IGlzIGEgZGljdGlvbmFyeSBjb250YWluaW5nIGVsZW1lbnQgYXR0cmlidXRlcy4KLVJldHVybnMgdGhlIG9wZW5lZCBlbGVtZW50LgotXGVuZHttZXRob2RkZXNjfQotCi0KLVxzdWJzZWN0aW9ue1hNTFRyZWVCdWlsZGVyIE9iamVjdHNcbGFiZWx7ZWxlbWVudHRyZWUteG1sdHJlZWJ1aWxkZXItb2JqZWN0c319Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1hNTFRyZWVCdWlsZGVyfXtcb3B0aW9uYWx7aHRtbCx9IFxvcHRpb25hbHt0YXJnZXR9fQotRWxlbWVudCBzdHJ1Y3R1cmUgYnVpbGRlciBmb3IgWE1MIHNvdXJjZSBkYXRhLCBiYXNlZCBvbiB0aGUKLWV4cGF0IHBhcnNlci4KLVx2YXJ7aHRtbH0gYXJlIHByZWRlZmluZWQgSFRNTCBlbnRpdGllcy4gIFRoaXMgZmxhZyBpcyBub3Qgc3VwcG9ydGVkCi1ieSB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbi4KLVx2YXJ7dGFyZ2V0fSBpcyB0aGUgdGFyZ2V0IG9iamVjdC4gIElmIG9taXR0ZWQsIHRoZSBidWlsZGVyIHVzZXMgYW4KLWluc3RhbmNlIG9mIHRoZSBzdGFuZGFyZCBUcmVlQnVpbGRlciBjbGFzcy4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Y2xvc2V9e30KLUZpbmlzaGVzIGZlZWRpbmcgZGF0YSB0byB0aGUgcGFyc2VyLgotUmV0dXJucyBhbiBlbGVtZW50IHN0cnVjdHVyZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2RvY3R5cGV9e25hbWUsIHB1YmlkLCBzeXN0ZW19Ci1IYW5kbGVzIGEgZG9jdHlwZSBkZWNsYXJhdGlvbi4KLVx2YXJ7bmFtZX0gaXMgdGhlIGRvY3R5cGUgbmFtZS4KLVx2YXJ7cHViaWR9IGlzIHRoZSBwdWJsaWMgaWRlbnRpZmllci4KLVx2YXJ7c3lzdGVtfSBpcyB0aGUgc3lzdGVtIGlkZW50aWZpZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtmZWVkfXtkYXRhfQotRmVlZHMgZGF0YSB0byB0aGUgcGFyc2VyLgotXHZhcntkYXRhfSBpcyBlbmNvZGVkIGRhdGEuCi1cZW5ke21ldGhvZGRlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmV4Y3MudGV4IGIvRG9jL2xpYi9saWJleGNzLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ1MzFkMy4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmV4Y3MudGV4CisrKyAvZGV2L251bGwKQEAgLTEsNDI3ICswLDAgQEAKLVxzZWN0aW9ue0J1aWx0LWluIEV4Y2VwdGlvbnN9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtleGNlcHRpb25zfQotXG1vZHVsZXN5bm9wc2lze1N0YW5kYXJkIGV4Y2VwdGlvbiBjbGFzc2VzLn0KLQotCi1FeGNlcHRpb25zIHNob3VsZCBiZSBjbGFzcyBvYmplY3RzLiAgCi1UaGUgZXhjZXB0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgbW9kdWxlIFxtb2R1bGV7ZXhjZXB0aW9uc30uICBUaGlzCi1tb2R1bGUgbmV2ZXIgbmVlZHMgdG8gYmUgaW1wb3J0ZWQgZXhwbGljaXRseTogdGhlIGV4Y2VwdGlvbnMgYXJlCi1wcm92aWRlZCBpbiB0aGUgYnVpbHQtaW4gbmFtZXNwYWNlIGFzIHdlbGwgYXMgdGhlIFxtb2R1bGV7ZXhjZXB0aW9uc30KLW1vZHVsZS4KLQotRm9yIGNsYXNzIGV4Y2VwdGlvbnMsIGluIGEgXGtleXdvcmR7dHJ5fVxzdGluZGV4e3RyeX0gc3RhdGVtZW50IHdpdGgKLWFuIFxrZXl3b3Jke2V4Y2VwdH1cc3RpbmRleHtleGNlcHR9IGNsYXVzZSB0aGF0IG1lbnRpb25zIGEgcGFydGljdWxhcgotY2xhc3MsIHRoYXQgY2xhdXNlIGFsc28gaGFuZGxlcyBhbnkgZXhjZXB0aW9uIGNsYXNzZXMgZGVyaXZlZCBmcm9tCi10aGF0IGNsYXNzIChidXQgbm90IGV4Y2VwdGlvbiBjbGFzc2VzIGZyb20gd2hpY2ggXGVtcGh7aXR9IGlzCi1kZXJpdmVkKS4gIFR3byBleGNlcHRpb24gY2xhc3NlcyB0aGF0IGFyZSBub3QgcmVsYXRlZCB2aWEgc3ViY2xhc3NpbmcKLWFyZSBuZXZlciBlcXVpdmFsZW50LCBldmVuIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBuYW1lLgotCi1UaGUgYnVpbHQtaW4gZXhjZXB0aW9ucyBsaXN0ZWQgYmVsb3cgY2FuIGJlIGdlbmVyYXRlZCBieSB0aGUKLWludGVycHJldGVyIG9yIGJ1aWx0LWluIGZ1bmN0aW9ucy4gIEV4Y2VwdCB3aGVyZSBtZW50aW9uZWQsIHRoZXkgaGF2ZQotYW4gYGBhc3NvY2lhdGVkIHZhbHVlJycgaW5kaWNhdGluZyB0aGUgZGV0YWlsZWQgY2F1c2Ugb2YgdGhlIGVycm9yLgotVGhpcyBtYXkgYmUgYSBzdHJpbmcgb3IgYSB0dXBsZSBjb250YWluaW5nIHNldmVyYWwgaXRlbXMgb2YKLWluZm9ybWF0aW9uIChlLmcuLCBhbiBlcnJvciBjb2RlIGFuZCBhIHN0cmluZyBleHBsYWluaW5nIHRoZSBjb2RlKS4KLVRoZSBhc3NvY2lhdGVkIHZhbHVlIGlzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gdGhlCi1ca2V5d29yZHtyYWlzZX1cc3RpbmRleHtyYWlzZX0gc3RhdGVtZW50LiAgSWYgdGhlIGV4Y2VwdGlvbiBjbGFzcyBpcwotZGVyaXZlZCBmcm9tIHRoZSBzdGFuZGFyZCByb290IGNsYXNzIFxleGNlcHRpb257QmFzZUV4Y2VwdGlvbn0sIHRoZQotYXNzb2NpYXRlZCB2YWx1ZSBpcyBwcmVzZW50IGFzIHRoZSBleGNlcHRpb24gaW5zdGFuY2UncyBcbWVtYmVye2FyZ3N9Ci1hdHRyaWJ1dGUuCi0KLVVzZXIgY29kZSBjYW4gcmFpc2UgYnVpbHQtaW4gZXhjZXB0aW9ucy4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gdGVzdCBhbgotZXhjZXB0aW9uIGhhbmRsZXIgb3IgdG8gcmVwb3J0IGFuIGVycm9yIGNvbmRpdGlvbiBgYGp1c3QgbGlrZScnIHRoZQotc2l0dWF0aW9uIGluIHdoaWNoIHRoZSBpbnRlcnByZXRlciByYWlzZXMgdGhlIHNhbWUgZXhjZXB0aW9uOyBidXQKLWJld2FyZSB0aGF0IHRoZXJlIGlzIG5vdGhpbmcgdG8gcHJldmVudCB1c2VyIGNvZGUgZnJvbSByYWlzaW5nIGFuCi1pbmFwcHJvcHJpYXRlIGVycm9yLgotCi1UaGUgYnVpbHQtaW4gZXhjZXB0aW9uIGNsYXNzZXMgY2FuIGJlIHN1Yi1jbGFzc2VkIHRvIGRlZmluZSBuZXcKLWV4Y2VwdGlvbnM7IHByb2dyYW1tZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGF0IGxlYXN0IGRlcml2ZSBuZXcKLWV4Y2VwdGlvbnMgZnJvbSB0aGUgXGV4Y2VwdGlvbntFeGNlcHRpb259IGNsYXNzIGFuZCBub3QKLVxleGNlcHRpb257QmFzZUV4Y2VwdGlvbn0uICBNb3JlCi1pbmZvcm1hdGlvbiBvbiBkZWZpbmluZyBleGNlcHRpb25zIGlzIGF2YWlsYWJsZSBpbiB0aGUKLVxjaXRldGl0bGVbLi4vdHV0L3R1dC5odG1sXXtQeXRob24gVHV0b3JpYWx9IHVuZGVyIHRoZSBoZWFkaW5nCi1gYFVzZXItZGVmaW5lZCBFeGNlcHRpb25zLicnCi0KLVxzZXRpbmRleHN1Yml0ZW17KGJ1aWx0LWluIGV4Y2VwdGlvbiBiYXNlIGNsYXNzKX0KLQotVGhlIGZvbGxvd2luZyBleGNlcHRpb25zIGFyZSBvbmx5IHVzZWQgYXMgYmFzZSBjbGFzc2VzIGZvciBvdGhlcgotZXhjZXB0aW9ucy4KLQotXGJlZ2lue2V4Y2Rlc2N9e0Jhc2VFeGNlcHRpb259Ci1UaGUgYmFzZSBjbGFzcyBmb3IgYWxsIGJ1aWx0LWluIGV4Y2VwdGlvbnMuICBJdCBpcyBub3QgbWVhbnQgdG8gYmUgZGlyZWN0bHkKLWluaGVyaXRlZCBieSB1c2VyLWRlZmluZWQgY2xhc3NlcyAoZm9yIHRoYXQgdXNlIFxleGNlcHRpb257RXhjZXB0aW9ufSkuICBJZgotXGZ1bmN0aW9ue3N0cigpfSBvciBcZnVuY3Rpb257dW5pY29kZSgpfSBpcyBjYWxsZWQgb24gYW4gaW5zdGFuY2Ugb2YgdGhpcwotY2xhc3MsIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgYXJndW1lbnQocykgdG8gdGhlIGluc3RhbmNlIGFyZSByZXR1cm5lZCBvcgotdGhlIGVtcHRyeSBzdHJpbmcgd2hlbiB0aGVyZSB3ZXJlIG5vIGFyZ3VtZW50cy4gIEFsbCBhcmd1bWVudHMgYXJlIAotc3RvcmVkIGluIFxtZW1iZXJ7YXJnc30gYXMgYSB0dXBsZS4KLVx2ZXJzaW9uYWRkZWR7Mi41fQotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317RXhjZXB0aW9ufQotQWxsIGJ1aWx0LWluLCBub24tc3lzdGVtLWV4aXRpbmcgZXhjZXB0aW9ucyBhcmUgZGVyaXZlZAotZnJvbSB0aGlzIGNsYXNzLiAgQWxsIHVzZXItZGVmaW5lZCBleGNlcHRpb25zIHNob3VsZCBhbHNvIGJlIGRlcml2ZWQKLWZyb20gdGhpcyBjbGFzcy4KLVx2ZXJzaW9uY2hhbmdlZFtDaGFuZ2VkIHRvIGluaGVyaXQgZnJvbSBcZXhjZXB0aW9ue0Jhc2VFeGNlcHRpb259XXsyLjV9Ci1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtBcml0aG1ldGljRXJyb3J9Ci1UaGUgYmFzZSBjbGFzcyBmb3IgdGhvc2UgYnVpbHQtaW4gZXhjZXB0aW9ucyB0aGF0IGFyZSByYWlzZWQgZm9yCi12YXJpb3VzIGFyaXRobWV0aWMgZXJyb3JzOiBcZXhjZXB0aW9ue092ZXJmbG93RXJyb3J9LAotXGV4Y2VwdGlvbntaZXJvRGl2aXNpb25FcnJvcn0sIFxleGNlcHRpb257RmxvYXRpbmdQb2ludEVycm9yfS4KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e0xvb2t1cEVycm9yfQotVGhlIGJhc2UgY2xhc3MgZm9yIHRoZSBleGNlcHRpb25zIHRoYXQgYXJlIHJhaXNlZCB3aGVuIGEga2V5IG9yCi1pbmRleCB1c2VkIG9uIGEgbWFwcGluZyBvciBzZXF1ZW5jZSBpcyBpbnZhbGlkOiBcZXhjZXB0aW9ue0luZGV4RXJyb3J9LAotXGV4Y2VwdGlvbntLZXlFcnJvcn0uICBUaGlzIGNhbiBiZSByYWlzZWQgZGlyZWN0bHkgYnkKLVxmdW5jdGlvbntzeXMuc2V0ZGVmYXVsdGVuY29kaW5nKCl9LgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317RW52aXJvbm1lbnRFcnJvcn0KLVRoZSBiYXNlIGNsYXNzIGZvciBleGNlcHRpb25zIHRoYXQKLWNhbiBvY2N1ciBvdXRzaWRlIHRoZSBQeXRob24gc3lzdGVtOiBcZXhjZXB0aW9ue0lPRXJyb3J9LAotXGV4Y2VwdGlvbntPU0Vycm9yfS4gIFdoZW4gZXhjZXB0aW9ucyBvZiB0aGlzIHR5cGUgYXJlIGNyZWF0ZWQgd2l0aCBhCi0yLXR1cGxlLCB0aGUgZmlyc3QgaXRlbSBpcyBhdmFpbGFibGUgb24gdGhlIGluc3RhbmNlJ3MgXG1lbWJlcntlcnJub30KLWF0dHJpYnV0ZSAoaXQgaXMgYXNzdW1lZCB0byBiZSBhbiBlcnJvciBudW1iZXIpLCBhbmQgdGhlIHNlY29uZCBpdGVtCi1pcyBhdmFpbGFibGUgb24gdGhlIFxtZW1iZXJ7c3RyZXJyb3J9IGF0dHJpYnV0ZSAoaXQgaXMgdXN1YWxseSB0aGUKLWFzc29jaWF0ZWQgZXJyb3IgbWVzc2FnZSkuICBUaGUgdHVwbGUgaXRzZWxmIGlzIGFsc28gYXZhaWxhYmxlIG9uIHRoZQotXG1lbWJlcnthcmdzfSBhdHRyaWJ1dGUuCi1cdmVyc2lvbmFkZGVkezEuNS4yfQotCi1XaGVuIGFuIFxleGNlcHRpb257RW52aXJvbm1lbnRFcnJvcn0gZXhjZXB0aW9uIGlzIGluc3RhbnRpYXRlZCB3aXRoIGEKLTMtdHVwbGUsIHRoZSBmaXJzdCB0d28gaXRlbXMgYXJlIGF2YWlsYWJsZSBhcyBhYm92ZSwgd2hpbGUgdGhlIHRoaXJkCi1pdGVtIGlzIGF2YWlsYWJsZSBvbiB0aGUgXG1lbWJlcntmaWxlbmFtZX0gYXR0cmlidXRlLiAgSG93ZXZlciwgZm9yCi1iYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdGhlIFxtZW1iZXJ7YXJnc30gYXR0cmlidXRlIGNvbnRhaW5zIG9ubHkgYQotMi10dXBsZSBvZiB0aGUgZmlyc3QgdHdvIGNvbnN0cnVjdG9yIGFyZ3VtZW50cy4KLQotVGhlIFxtZW1iZXJ7ZmlsZW5hbWV9IGF0dHJpYnV0ZSBpcyBcY29kZXtOb25lfSB3aGVuIHRoaXMgZXhjZXB0aW9uIGlzCi1jcmVhdGVkIHdpdGggb3RoZXIgdGhhbiAzIGFyZ3VtZW50cy4gIFRoZSBcbWVtYmVye2Vycm5vfSBhbmQKLVxtZW1iZXJ7c3RyZXJyb3J9IGF0dHJpYnV0ZXMgYXJlIGFsc28gXGNvZGV7Tm9uZX0gd2hlbiB0aGUgaW5zdGFuY2Ugd2FzCi1jcmVhdGVkIHdpdGggb3RoZXIgdGhhbiAyIG9yIDMgYXJndW1lbnRzLiAgSW4gdGhpcyBsYXN0IGNhc2UsCi1cbWVtYmVye2FyZ3N9IGNvbnRhaW5zIHRoZSB2ZXJiYXRpbSBjb25zdHJ1Y3RvciBhcmd1bWVudHMgYXMgYSB0dXBsZS4KLVxlbmR7ZXhjZGVzY30KLQotCi1cc2V0aW5kZXhzdWJpdGVteyhidWlsdC1pbiBleGNlcHRpb24pfQotCi1UaGUgZm9sbG93aW5nIGV4Y2VwdGlvbnMgYXJlIHRoZSBleGNlcHRpb25zIHRoYXQgYXJlIGFjdHVhbGx5IHJhaXNlZC4KLQotXGJlZ2lue2V4Y2Rlc2N9e0Fzc2VydGlvbkVycm9yfQotXHN0aW5kZXh7YXNzZXJ0fQotUmFpc2VkIHdoZW4gYW4gXGtleXdvcmR7YXNzZXJ0fSBzdGF0ZW1lbnQgZmFpbHMuCi1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtBdHRyaWJ1dGVFcnJvcn0KLSUgeHJlZiB0byBhdHRyaWJ1dGUgcmVmZXJlbmNlPwotICBSYWlzZWQgd2hlbiBhbiBhdHRyaWJ1dGUgcmVmZXJlbmNlIG9yIGFzc2lnbm1lbnQgZmFpbHMuICAoV2hlbiBhbgotICBvYmplY3QgZG9lcyBub3Qgc3VwcG9ydCBhdHRyaWJ1dGUgcmVmZXJlbmNlcyBvciBhdHRyaWJ1dGUgYXNzaWdubWVudHMKLSAgYXQgYWxsLCBcZXhjZXB0aW9ue1R5cGVFcnJvcn0gaXMgcmFpc2VkLikKLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e0VPRkVycm9yfQotJSBYWFhKSCB4cmVmcyBoZXJlCi0gIFJhaXNlZCB3aGVuIGF0dGVtcHRpbmcgdG8gcmVhZCBiZXlvbmQgdGhlIGVuZCBvZiBhIGZpbGUuCi0lIFhYWEpIIHhyZWZzIGhlcmUKLSAgKE4uQi46IHRoZSBcbWV0aG9ke3JlYWQoKX0gYW5kIFxtZXRob2R7cmVhZGxpbmUoKX0gbWV0aG9kcyBvZiBmaWxlCi0gIG9iamVjdHMgcmV0dXJuIGFuIGVtcHR5IHN0cmluZyB3aGVuIHRoZXkgaGl0IFxFT0YuKQotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317RmxvYXRpbmdQb2ludEVycm9yfQotICBSYWlzZWQgd2hlbiBhIGZsb2F0aW5nIHBvaW50IG9wZXJhdGlvbiBmYWlscy4gIFRoaXMgZXhjZXB0aW9uIGlzCi0gIGFsd2F5cyBkZWZpbmVkLCBidXQgY2FuIG9ubHkgYmUgcmFpc2VkIHdoZW4gUHl0aG9uIGlzIGNvbmZpZ3VyZWQKLSAgd2l0aCB0aGUgXGxvbmdwcm9ncmFtb3B0e3dpdGgtZnBlY3RsfSBvcHRpb24sIG9yIHRoZQotICBcY29uc3RhbnR7V0FOVF9TSUdGUEVfSEFORExFUn0gc3ltYm9sIGlzIGRlZmluZWQgaW4gdGhlCi0gIFxmaWxle3B5Y29uZmlnLmh9IGZpbGUuCi1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtHZW5lcmF0b3JFeGl0fQotICBSYWlzZSB3aGVuIGEgZ2VuZXJhdG9yJ3MgXG1ldGhvZHtjbG9zZSgpfSBtZXRob2QgaXMgY2FsbGVkLgotICBcdmVyc2lvbmFkZGVkezIuNX0KLSAgXHZlcnNpb25jaGFuZ2VkW0NoYW5nZWQgdG8gaW5oZXJpdCBmcm9tIEV4Y2VwdGlvbiBpbnN0ZWFkIG9mCi0gIFN0YW5kYXJkRXJyb3JdezMuMH0KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e0lPRXJyb3J9Ci0lIFhYWEpIIHhyZWZzIGhlcmUKLSAgUmFpc2VkIHdoZW4gYW4gSS9PIG9wZXJhdGlvbiAoc3VjaCBhcyBhIFxrZXl3b3Jke3ByaW50fSBzdGF0ZW1lbnQsCi0gIHRoZSBidWlsdC1pbiBcZnVuY3Rpb257b3BlbigpfSBmdW5jdGlvbiBvciBhIG1ldGhvZCBvZiBhIGZpbGUKLSAgb2JqZWN0KSBmYWlscyBmb3IgYW4gSS9PLXJlbGF0ZWQgcmVhc29uLCBlLmcuLCBgYGZpbGUgbm90IGZvdW5kJycgb3IKLSAgYGBkaXNrIGZ1bGwnJy4KLQotICBUaGlzIGNsYXNzIGlzIGRlcml2ZWQgZnJvbSBcZXhjZXB0aW9ue0Vudmlyb25tZW50RXJyb3J9LiAgU2VlIHRoZQotICBkaXNjdXNzaW9uIGFib3ZlIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGV4Y2VwdGlvbiBpbnN0YW5jZQotICBhdHRyaWJ1dGVzLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317SW1wb3J0RXJyb3J9Ci0lIFhYWEpIIHhyZWYgdG8gaW1wb3J0IHN0YXRlbWVudD8KLSAgUmFpc2VkIHdoZW4gYW4gXGtleXdvcmR7aW1wb3J0fSBzdGF0ZW1lbnQgZmFpbHMgdG8gZmluZCB0aGUgbW9kdWxlCi0gIGRlZmluaXRpb24gb3Igd2hlbiBhIFxjb2Rle2Zyb20gXHRleHRybXtcbGRvdHN9IGltcG9ydH0gZmFpbHMgdG8gZmluZCBhCi0gIG5hbWUgdGhhdCBpcyB0byBiZSBpbXBvcnRlZC4KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e0luZGV4RXJyb3J9Ci0lIFhYWEpIIHhyZWYgdG8gc2VxdWVuY2VzCi0gIFJhaXNlZCB3aGVuIGEgc2VxdWVuY2Ugc3Vic2NyaXB0IGlzIG91dCBvZiByYW5nZS4gIChTbGljZSBpbmRpY2VzIGFyZQotICBzaWxlbnRseSB0cnVuY2F0ZWQgdG8gZmFsbCBpbiB0aGUgYWxsb3dlZCByYW5nZTsgaWYgYW4gaW5kZXggaXMgbm90IGEKLSAgcGxhaW4gaW50ZWdlciwgXGV4Y2VwdGlvbntUeXBlRXJyb3J9IGlzIHJhaXNlZC4pCi1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtLZXlFcnJvcn0KLSUgWFhYSkggeHJlZiB0byBtYXBwaW5nIG9iamVjdHM/Ci0gIFJhaXNlZCB3aGVuIGEgbWFwcGluZyAoZGljdGlvbmFyeSkga2V5IGlzIG5vdCBmb3VuZCBpbiB0aGUgc2V0IG9mCi0gIGV4aXN0aW5nIGtleXMuCi1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtLZXlib2FyZEludGVycnVwdH0KLSAgUmFpc2VkIHdoZW4gdGhlIHVzZXIgaGl0cyB0aGUgaW50ZXJydXB0IGtleSAobm9ybWFsbHkKLSAgXGtiZHtDb250cm9sLUN9IG9yIFxrYmR7RGVsZXRlfSkuICBEdXJpbmcgZXhlY3V0aW9uLCBhIGNoZWNrIGZvcgotICBpbnRlcnJ1cHRzIGlzIG1hZGUgcmVndWxhcmx5LgotJSBYWFgoaHlsdG9uKSB4cmVmcyBoZXJlCi0gIFRoZSBleGNlcHRpb24gaW5oZXJpdHMgZnJvbSBcZXhjZXB0aW9ue0Jhc2VFeGNlcHRpb259IHNvIGFzIHRvIG5vdCBiZQotICBhY2NpZGVudGFsbHkgY2F1Z2h0IGJ5IGNvZGUgdGhhdCBjYXRjaGVzIFxleGNlcHRpb257RXhjZXB0aW9ufSBhbmQgdGh1cwotICBwcmV2ZW50IHRoZSBpbnRlcnByZXRlciBmcm9tIGV4aXRpbmcuCi0gIFx2ZXJzaW9uY2hhbmdlZFtDaGFuZ2VkIHRvIGluaGVyaXQgZnJvbSBcZXhjZXB0aW9ue0Jhc2VFeGNlcHRpb259XXsyLjV9Ci1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtNZW1vcnlFcnJvcn0KLSAgUmFpc2VkIHdoZW4gYW4gb3BlcmF0aW9uIHJ1bnMgb3V0IG9mIG1lbW9yeSBidXQgdGhlIHNpdHVhdGlvbiBtYXkKLSAgc3RpbGwgYmUgcmVzY3VlZCAoYnkgZGVsZXRpbmcgc29tZSBvYmplY3RzKS4gIFRoZSBhc3NvY2lhdGVkIHZhbHVlIGlzCi0gIGEgc3RyaW5nIGluZGljYXRpbmcgd2hhdCBraW5kIG9mIChpbnRlcm5hbCkgb3BlcmF0aW9uIHJhbiBvdXQgb2YgbWVtb3J5LgotICBOb3RlIHRoYXQgYmVjYXVzZSBvZiB0aGUgdW5kZXJseWluZyBtZW1vcnkgbWFuYWdlbWVudCBhcmNoaXRlY3R1cmUKLSAgKEMncyBcY2Z1bmN0aW9ue21hbGxvYygpfSBmdW5jdGlvbiksIHRoZSBpbnRlcnByZXRlciBtYXkgbm90Ci0gIGFsd2F5cyBiZSBhYmxlIHRvIGNvbXBsZXRlbHkgcmVjb3ZlciBmcm9tIHRoaXMgc2l0dWF0aW9uOyBpdAotICBuZXZlcnRoZWxlc3MgcmFpc2VzIGFuIGV4Y2VwdGlvbiBzbyB0aGF0IGEgc3RhY2sgdHJhY2ViYWNrIGNhbiBiZQotICBwcmludGVkLCBpbiBjYXNlIGEgcnVuLWF3YXkgcHJvZ3JhbSB3YXMgdGhlIGNhdXNlLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317TmFtZUVycm9yfQotICBSYWlzZWQgd2hlbiBhIGxvY2FsIG9yIGdsb2JhbCBuYW1lIGlzIG5vdCBmb3VuZC4gIFRoaXMgYXBwbGllcyBvbmx5Ci0gIHRvIHVucXVhbGlmaWVkIG5hbWVzLiAgVGhlIGFzc29jaWF0ZWQgdmFsdWUgaXMgYW4gZXJyb3IgbWVzc2FnZSB0aGF0Ci0gIGluY2x1ZGVzIHRoZSBuYW1lIHRoYXQgY291bGQgbm90IGJlIGZvdW5kLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317Tm90SW1wbGVtZW50ZWRFcnJvcn0KLSAgVGhpcyBleGNlcHRpb24gaXMgZGVyaXZlZCBmcm9tIFxleGNlcHRpb257UnVudGltZUVycm9yfS4gIEluIHVzZXIKLSAgZGVmaW5lZCBiYXNlIGNsYXNzZXMsIGFic3RyYWN0IG1ldGhvZHMgc2hvdWxkIHJhaXNlIHRoaXMgZXhjZXB0aW9uCi0gIHdoZW4gdGhleSByZXF1aXJlIGRlcml2ZWQgY2xhc3NlcyB0byBvdmVycmlkZSB0aGUgbWV0aG9kLgotICBcdmVyc2lvbmFkZGVkezEuNS4yfQotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317T1NFcnJvcn0KLSAgJXhyZWYgZm9yIG9zIG1vZHVsZQotICBUaGlzIGNsYXNzIGlzIGRlcml2ZWQgZnJvbSBcZXhjZXB0aW9ue0Vudmlyb25tZW50RXJyb3J9IGFuZCBpcyB1c2VkCi0gIHByaW1hcmlseSBhcyB0aGUgXHJlZm1vZHVsZXtvc30gbW9kdWxlJ3MgXGNvZGV7b3MuZXJyb3J9IGV4Y2VwdGlvbi4KLSAgU2VlIFxleGNlcHRpb257RW52aXJvbm1lbnRFcnJvcn0gYWJvdmUgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlCi0gIHBvc3NpYmxlIGFzc29jaWF0ZWQgdmFsdWVzLgotICBcdmVyc2lvbmFkZGVkezEuNS4yfQotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317T3ZlcmZsb3dFcnJvcn0KLSUgWFhYSkggcmVmZXJlbmNlIHRvIGxvbmcncyBhbmQvb3IgaW50J3M/Ci0gIFJhaXNlZCB3aGVuIHRoZSByZXN1bHQgb2YgYW4gYXJpdGhtZXRpYyBvcGVyYXRpb24gaXMgdG9vIGxhcmdlIHRvIGJlCi0gIHJlcHJlc2VudGVkLiAgVGhpcyBjYW5ub3Qgb2NjdXIgZm9yIGxvbmcgaW50ZWdlcnMgKHdoaWNoIHdvdWxkIHJhdGhlcgotICByYWlzZSBcZXhjZXB0aW9ue01lbW9yeUVycm9yfSB0aGFuIGdpdmUgdXApLiAgQmVjYXVzZSBvZiB0aGUgbGFjayBvZgotICBzdGFuZGFyZGl6YXRpb24gb2YgZmxvYXRpbmcgcG9pbnQgZXhjZXB0aW9uIGhhbmRsaW5nIGluIEMsIG1vc3QKLSAgZmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9ucyBhbHNvIGFyZW4ndCBjaGVja2VkLiAgRm9yIHBsYWluIGludGVnZXJzLAotICBhbGwgb3BlcmF0aW9ucyB0aGF0IGNhbiBvdmVyZmxvdyBhcmUgY2hlY2tlZCBleGNlcHQgbGVmdCBzaGlmdCwgd2hlcmUKLSAgdHlwaWNhbCBhcHBsaWNhdGlvbnMgcHJlZmVyIHRvIGRyb3AgYml0cyB0aGFuIHJhaXNlIGFuIGV4Y2VwdGlvbi4KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e1JlZmVyZW5jZUVycm9yfQotICBUaGlzIGV4Y2VwdGlvbiBpcyByYWlzZWQgd2hlbiBhIHdlYWsgcmVmZXJlbmNlIHByb3h5LCBjcmVhdGVkIGJ5IHRoZQotICBcZnVuY3Rpb257XHJlZm1vZHVsZXt3ZWFrcmVmfS5wcm94eSgpfSBmdW5jdGlvbiwgaXMgdXNlZCB0byBhY2Nlc3MKLSAgYW4gYXR0cmlidXRlIG9mIHRoZSByZWZlcmVudCBhZnRlciBpdCBoYXMgYmVlbiBnYXJiYWdlIGNvbGxlY3RlZC4KLSAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gd2VhayByZWZlcmVuY2VzLCBzZWUgdGhlIFxyZWZtb2R1bGV7d2Vha3JlZn0KLSAgbW9kdWxlLgotICBcdmVyc2lvbmFkZGVkW1ByZXZpb3VzbHkga25vd24gYXMgdGhlCi0gICAgICAgICAgICAgICAgXGV4Y2VwdGlvbntccmVmbW9kdWxle3dlYWtyZWZ9LlJlZmVyZW5jZUVycm9yfQotICAgICAgICAgICAgICAgIGV4Y2VwdGlvbl17Mi4yfQotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317UnVudGltZUVycm9yfQotICBSYWlzZWQgd2hlbiBhbiBlcnJvciBpcyBkZXRlY3RlZCB0aGF0IGRvZXNuJ3QgZmFsbCBpbiBhbnkgb2YgdGhlCi0gIG90aGVyIGNhdGVnb3JpZXMuICBUaGUgYXNzb2NpYXRlZCB2YWx1ZSBpcyBhIHN0cmluZyBpbmRpY2F0aW5nIHdoYXQKLSAgcHJlY2lzZWx5IHdlbnQgd3JvbmcuICAoVGhpcyBleGNlcHRpb24gaXMgbW9zdGx5IGEgcmVsaWMgZnJvbSBhCi0gIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIGludGVycHJldGVyOyBpdCBpcyBub3QgdXNlZCB2ZXJ5IG11Y2ggYW55Ci0gIG1vcmUuKQotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317U3RvcEl0ZXJhdGlvbn0KLSAgUmFpc2VkIGJ5IGJ1aWx0aW4gXGZ1bmN0aW9ue25leHQoKX0gYW5kIGFuIGl0ZXJhdG9yJ3MgXG1ldGhvZHtfX25leHRfXygpfQotICBtZXRob2QgdG8gc2lnbmFsIHRoYXQgdGhlcmUgYXJlIG5vIGZ1cnRoZXIgdmFsdWVzLgotICBcdmVyc2lvbmFkZGVkezIuMn0KLSAgXHZlcnNpb25jaGFuZ2VkW0NoYW5nZWQgdG8gaW5oZXJpdCBmcm9tIEV4Y2VwdGlvbiBpbnN0ZWFkIG9mCi0gIFN0YW5kYXJkRXJyb3JdezMuMH0KLVxlbmR7ZXhjZGVzY30KLQotCi1cYmVnaW57ZXhjZGVzY317U3ludGF4RXJyb3J9Ci0lIFhYWEpIIHhyZWYgdG8gdGhlc2UgZnVuY3Rpb25zPwotICBSYWlzZWQgd2hlbiB0aGUgcGFyc2VyIGVuY291bnRlcnMgYSBzeW50YXggZXJyb3IuICBUaGlzIG1heSBvY2N1ciBpbgotICBhbiBca2V5d29yZHtpbXBvcnR9IHN0YXRlbWVudCwgaW4gYSBjYWxsIHRvIHRoZSBidWlsdC1pbiBmdW5jdGlvbnMKLSAgXGZ1bmN0aW9ue2V4ZWMoKX0sIFxmdW5jdGlvbntldmFsKCl9IG9yCi0gIFxmdW5jdGlvbntpbnB1dCgpfSwgb3Igd2hlbiByZWFkaW5nIHRoZSBpbml0aWFsIHNjcmlwdCBvciBzdGFuZGFyZAotICBpbnB1dCAoYWxzbyBpbnRlcmFjdGl2ZWx5KS4KLQotICBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBoYXZlIGF0dHJpYnV0ZXMgXG1lbWJlcntmaWxlbmFtZX0sCi0gIFxtZW1iZXJ7bGluZW5vfSwgXG1lbWJlcntvZmZzZXR9IGFuZCBcbWVtYmVye3RleHR9IGZvciBlYXNpZXIgYWNjZXNzCi0gIHRvIHRoZSBkZXRhaWxzLiAgXGZ1bmN0aW9ue3N0cigpfSBvZiB0aGUgZXhjZXB0aW9uIGluc3RhbmNlIHJldHVybnMKLSAgb25seSB0aGUgbWVzc2FnZS4KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e1N5c3RlbUVycm9yfQotICBSYWlzZWQgd2hlbiB0aGUgaW50ZXJwcmV0ZXIgZmluZHMgYW4gaW50ZXJuYWwgZXJyb3IsIGJ1dCB0aGUKLSAgc2l0dWF0aW9uIGRvZXMgbm90IGxvb2sgc28gc2VyaW91cyB0byBjYXVzZSBpdCB0byBhYmFuZG9uIGFsbCBob3BlLgotICBUaGUgYXNzb2NpYXRlZCB2YWx1ZSBpcyBhIHN0cmluZyBpbmRpY2F0aW5nIHdoYXQgd2VudCB3cm9uZyAoaW4KLSAgbG93LWxldmVsIHRlcm1zKS4KLSAgCi0gIFlvdSBzaG91bGQgcmVwb3J0IHRoaXMgdG8gdGhlIGF1dGhvciBvciBtYWludGFpbmVyIG9mIHlvdXIgUHl0aG9uCi0gIGludGVycHJldGVyLiAgQmUgc3VyZSB0byByZXBvcnQgdGhlIHZlcnNpb24gb2YgdGhlIFB5dGhvbgotICBpbnRlcnByZXRlciAoXGNvZGV7c3lzLnZlcnNpb259OyBpdCBpcyBhbHNvIHByaW50ZWQgYXQgdGhlIHN0YXJ0IG9mIGFuCi0gIGludGVyYWN0aXZlIFB5dGhvbiBzZXNzaW9uKSwgdGhlIGV4YWN0IGVycm9yIG1lc3NhZ2UgKHRoZSBleGNlcHRpb24ncwotICBhc3NvY2lhdGVkIHZhbHVlKSBhbmQgaWYgcG9zc2libGUgdGhlIHNvdXJjZSBvZiB0aGUgcHJvZ3JhbSB0aGF0Ci0gIHRyaWdnZXJlZCB0aGUgZXJyb3IuCi1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtTeXN0ZW1FeGl0fQotJSBYWFgoaHlsdG9uKSB4cmVmIHRvIG1vZHVsZSBzeXM/Ci0gIFRoaXMgZXhjZXB0aW9uIGlzIHJhaXNlZCBieSB0aGUgXGZ1bmN0aW9ue3N5cy5leGl0KCl9IGZ1bmN0aW9uLiAgV2hlbiBpdAotICBpcyBub3QgaGFuZGxlZCwgdGhlIFB5dGhvbiBpbnRlcnByZXRlciBleGl0czsgbm8gc3RhY2sgdHJhY2ViYWNrIGlzCi0gIHByaW50ZWQuICBJZiB0aGUgYXNzb2NpYXRlZCB2YWx1ZSBpcyBhIHBsYWluIGludGVnZXIsIGl0IHNwZWNpZmllcyB0aGUKLSAgc3lzdGVtIGV4aXQgc3RhdHVzIChwYXNzZWQgdG8gQydzIFxjZnVuY3Rpb257ZXhpdCgpfSBmdW5jdGlvbik7IGlmIGl0IGlzCi0gIFxjb2Rle05vbmV9LCB0aGUgZXhpdCBzdGF0dXMgaXMgemVybzsgaWYgaXQgaGFzIGFub3RoZXIgdHlwZSAoc3VjaCBhcwotICBhIHN0cmluZyksIHRoZSBvYmplY3QncyB2YWx1ZSBpcyBwcmludGVkIGFuZCB0aGUgZXhpdCBzdGF0dXMgaXMgb25lLgotCi0gIEluc3RhbmNlcyBoYXZlIGFuIGF0dHJpYnV0ZSBcbWVtYmVye2NvZGV9IHdoaWNoIGlzIHNldCB0byB0aGUKLSAgcHJvcG9zZWQgZXhpdCBzdGF0dXMgb3IgZXJyb3IgbWVzc2FnZSAoZGVmYXVsdGluZyB0byBcY29kZXtOb25lfSkuCi0gIEFsc28sIHRoaXMgZXhjZXB0aW9uIGRlcml2ZXMgZGlyZWN0bHkgZnJvbSBcZXhjZXB0aW9ue0Jhc2VFeGNlcHRpb259IGFuZAotICBub3QgXGV4Y2VwdGlvbntFeGNlcHRpb259LCBzaW5jZSBpdCBpcyBub3QgdGVjaG5pY2FsbHkgYW4gZXJyb3IuCi0KLSAgQSBjYWxsIHRvIFxmdW5jdGlvbntzeXMuZXhpdCgpfSBpcyB0cmFuc2xhdGVkIGludG8gYW4gZXhjZXB0aW9uIHNvIHRoYXQKLSAgY2xlYW4tdXAgaGFuZGxlcnMgKFxrZXl3b3Jke2ZpbmFsbHl9IGNsYXVzZXMgb2YgXGtleXdvcmR7dHJ5fSBzdGF0ZW1lbnRzKQotICBjYW4gYmUgZXhlY3V0ZWQsIGFuZCBzbyB0aGF0IGEgZGVidWdnZXIgY2FuIGV4ZWN1dGUgYSBzY3JpcHQgd2l0aG91dAotICBydW5uaW5nIHRoZSByaXNrIG9mIGxvc2luZyBjb250cm9sLiAgVGhlIFxmdW5jdGlvbntvcy5fZXhpdCgpfSBmdW5jdGlvbgotICBjYW4gYmUgdXNlZCBpZiBpdCBpcyBhYnNvbHV0ZWx5IHBvc2l0aXZlbHkgbmVjZXNzYXJ5IHRvIGV4aXQKLSAgaW1tZWRpYXRlbHkgKGZvciBleGFtcGxlLCBpbiB0aGUgY2hpbGQgcHJvY2VzcyBhZnRlciBhIGNhbGwgdG8KLSAgXGZ1bmN0aW9ue2ZvcmsoKX0pLgotCi0gIFRoZSBleGNlcHRpb24gaW5oZXJpdHMgZnJvbSBcZXhjZXB0aW9ue0Jhc2VFeGNlcHRpb259IGluc3RlYWQgb2YKLSAgXGV4Y2VwdGlvbntFeGNlcHRpb259IHNvIHRoYXQgaXQgaXMgbm90Ci0gIGFjY2lkZW50YWxseSBjYXVnaHQgYnkgY29kZSB0aGF0IGNhdGNoZXMgXGV4Y2VwdGlvbntFeGNlcHRpb259LiAgVGhpcyBhbGxvd3MKLSAgdGhlIGV4Y2VwdGlvbiB0byBwcm9wZXJseSBwcm9wYWdhdGUgdXAgYW5kIGNhdXNlIHRoZSBpbnRlcnByZXRlciB0byBleGl0LgotICBcdmVyc2lvbmNoYW5nZWRbQ2hhbmdlZCB0byBpbmhlcml0IGZyb20gXGV4Y2VwdGlvbntCYXNlRXhjZXB0aW9ufV17Mi41fQotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317VHlwZUVycm9yfQotICBSYWlzZWQgd2hlbiBhbiBvcGVyYXRpb24gb3IgZnVuY3Rpb24gaXMgYXBwbGllZCB0byBhbiBvYmplY3QKLSAgb2YgaW5hcHByb3ByaWF0ZSB0eXBlLiAgVGhlIGFzc29jaWF0ZWQgdmFsdWUgaXMgYSBzdHJpbmcgZ2l2aW5nCi0gIGRldGFpbHMgYWJvdXQgdGhlIHR5cGUgbWlzbWF0Y2guCi1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtVbmJvdW5kTG9jYWxFcnJvcn0KLSAgUmFpc2VkIHdoZW4gYSByZWZlcmVuY2UgaXMgbWFkZSB0byBhIGxvY2FsIHZhcmlhYmxlIGluIGEgZnVuY3Rpb24gb3IKLSAgbWV0aG9kLCBidXQgbm8gdmFsdWUgaGFzIGJlZW4gYm91bmQgdG8gdGhhdCB2YXJpYWJsZS4gIFRoaXMgaXMgYQotICBzdWJjbGFzcyBvZiBcZXhjZXB0aW9ue05hbWVFcnJvcn0uCi1cdmVyc2lvbmFkZGVkezIuMH0KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e1VuaWNvZGVFcnJvcn0KLSAgUmFpc2VkIHdoZW4gYSBVbmljb2RlLXJlbGF0ZWQgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgZXJyb3Igb2NjdXJzLiAgSXQKLSAgaXMgYSBzdWJjbGFzcyBvZiBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9LgotXHZlcnNpb25hZGRlZHsyLjB9Ci1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtVbmljb2RlRW5jb2RlRXJyb3J9Ci0gIFJhaXNlZCB3aGVuIGEgVW5pY29kZS1yZWxhdGVkIGVycm9yIG9jY3VycyBkdXJpbmcgZW5jb2RpbmcuICBJdAotICBpcyBhIHN1YmNsYXNzIG9mIFxleGNlcHRpb257VW5pY29kZUVycm9yfS4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317VW5pY29kZURlY29kZUVycm9yfQotICBSYWlzZWQgd2hlbiBhIFVuaWNvZGUtcmVsYXRlZCBlcnJvciBvY2N1cnMgZHVyaW5nIGRlY29kaW5nLiAgSXQKLSAgaXMgYSBzdWJjbGFzcyBvZiBcZXhjZXB0aW9ue1VuaWNvZGVFcnJvcn0uCi1cdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e1VuaWNvZGVUcmFuc2xhdGVFcnJvcn0KLSAgUmFpc2VkIHdoZW4gYSBVbmljb2RlLXJlbGF0ZWQgZXJyb3Igb2NjdXJzIGR1cmluZyB0cmFuc2xhdGluZy4gIEl0Ci0gIGlzIGEgc3ViY2xhc3Mgb2YgXGV4Y2VwdGlvbntVbmljb2RlRXJyb3J9LgotXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtWYWx1ZUVycm9yfQotICBSYWlzZWQgd2hlbiBhIGJ1aWx0LWluIG9wZXJhdGlvbiBvciBmdW5jdGlvbiByZWNlaXZlcyBhbiBhcmd1bWVudAotICB0aGF0IGhhcyB0aGUgcmlnaHQgdHlwZSBidXQgYW4gaW5hcHByb3ByaWF0ZSB2YWx1ZSwgYW5kIHRoZQotICBzaXR1YXRpb24gaXMgbm90IGRlc2NyaWJlZCBieSBhIG1vcmUgcHJlY2lzZSBleGNlcHRpb24gc3VjaCBhcwotICBcZXhjZXB0aW9ue0luZGV4RXJyb3J9LgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317V2luZG93c0Vycm9yfQotICBSYWlzZWQgd2hlbiBhIFdpbmRvd3Mtc3BlY2lmaWMgZXJyb3Igb2NjdXJzIG9yIHdoZW4gdGhlIGVycm9yIG51bWJlcgotICBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGFuIFxjZGF0YXtlcnJub30gdmFsdWUuICBUaGUKLSAgXG1lbWJlcnt3aW5lcnJvcn0gYW5kIFxtZW1iZXJ7c3RyZXJyb3J9IHZhbHVlcyBhcmUgY3JlYXRlZCBmcm9tIHRoZQotICByZXR1cm4gdmFsdWVzIG9mIHRoZSBcY2Z1bmN0aW9ue0dldExhc3RFcnJvcigpfSBhbmQKLSAgXGNmdW5jdGlvbntGb3JtYXRNZXNzYWdlKCl9IGZ1bmN0aW9ucyBmcm9tIHRoZSBXaW5kb3dzIFBsYXRmb3JtIEFQSS4KLSAgVGhlIFxtZW1iZXJ7ZXJybm99IHZhbHVlIG1hcHMgdGhlIFxtZW1iZXJ7d2luZXJyb3J9IHZhbHVlIHRvIAotICBjb3JyZXNwb25kaW5nIFxjb2Rle2Vycm5vLmh9IHZhbHVlcy4KLSAgVGhpcyBpcyBhIHN1YmNsYXNzIG9mIFxleGNlcHRpb257T1NFcnJvcn0uCi1cdmVyc2lvbmFkZGVkezIuMH0KLVx2ZXJzaW9uY2hhbmdlZFtQcmV2aW91cyB2ZXJzaW9ucyBwdXQgdGhlIFxjZnVuY3Rpb257R2V0TGFzdEVycm9yKCl9Ci1jb2RlcyBpbnRvIFxtZW1iZXJ7ZXJybm99XXsyLjV9Ci1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtaZXJvRGl2aXNpb25FcnJvcn0KLSAgUmFpc2VkIHdoZW4gdGhlIHNlY29uZCBhcmd1bWVudCBvZiBhIGRpdmlzaW9uIG9yIG1vZHVsbyBvcGVyYXRpb24gaXMKLSAgemVyby4gIFRoZSBhc3NvY2lhdGVkIHZhbHVlIGlzIGEgc3RyaW5nIGluZGljYXRpbmcgdGhlIHR5cGUgb2YgdGhlCi0gIG9wZXJhbmRzIGFuZCB0aGUgb3BlcmF0aW9uLgotXGVuZHtleGNkZXNjfQotCi0KLVxzZXRpbmRleHN1Yml0ZW17KGJ1aWx0LWluIHdhcm5pbmcpfQotCi1UaGUgZm9sbG93aW5nIGV4Y2VwdGlvbnMgYXJlIHVzZWQgYXMgd2FybmluZyBjYXRlZ29yaWVzOyBzZWUgdGhlCi1ccmVmbW9kdWxle3dhcm5pbmdzfSBtb2R1bGUgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLVxiZWdpbntleGNkZXNjfXtXYXJuaW5nfQotQmFzZSBjbGFzcyBmb3Igd2FybmluZyBjYXRlZ29yaWVzLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317VXNlcldhcm5pbmd9Ci1CYXNlIGNsYXNzIGZvciB3YXJuaW5ncyBnZW5lcmF0ZWQgYnkgdXNlciBjb2RlLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317RGVwcmVjYXRpb25XYXJuaW5nfQotQmFzZSBjbGFzcyBmb3Igd2FybmluZ3MgYWJvdXQgZGVwcmVjYXRlZCBmZWF0dXJlcy4KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e1BlbmRpbmdEZXByZWNhdGlvbldhcm5pbmd9Ci1CYXNlIGNsYXNzIGZvciB3YXJuaW5ncyBhYm91dCBmZWF0dXJlcyB3aGljaCB3aWxsIGJlIGRlcHJlY2F0ZWQgaW4gdGhlIGZ1dHVyZS4KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e1N5bnRheFdhcm5pbmd9Ci1CYXNlIGNsYXNzIGZvciB3YXJuaW5ncyBhYm91dCBkdWJpb3VzIHN5bnRheAotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317UnVudGltZVdhcm5pbmd9Ci1CYXNlIGNsYXNzIGZvciB3YXJuaW5ncyBhYm91dCBkdWJpb3VzIHJ1bnRpbWUgYmVoYXZpb3IuCi1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtGdXR1cmVXYXJuaW5nfQotQmFzZSBjbGFzcyBmb3Igd2FybmluZ3MgYWJvdXQgY29uc3RydWN0cyB0aGF0IHdpbGwgY2hhbmdlIHNlbWFudGljYWxseQotaW4gdGhlIGZ1dHVyZS4KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e0ltcG9ydFdhcm5pbmd9Ci1CYXNlIGNsYXNzIGZvciB3YXJuaW5ncyBhYm91dCBwcm9iYWJsZSBtaXN0YWtlcyBpbiBtb2R1bGUgaW1wb3J0cy4KLVx2ZXJzaW9uYWRkZWR7Mi41fQotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317VW5pY29kZVdhcm5pbmd9Ci1CYXNlIGNsYXNzIGZvciB3YXJuaW5ncyByZWxhdGVkIHRvIFVuaWNvZGUuCi1cdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7ZXhjZGVzY30KLQotVGhlIGNsYXNzIGhpZXJhcmNoeSBmb3IgYnVpbHQtaW4gZXhjZXB0aW9ucyBpczoKLQotXHZlcmJhdGltaW5wdXR7Li4vLi4vTGliL3Rlc3QvZXhjZXB0aW9uX2hpZXJhcmNoeS50eHR9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmZjbnRsLnRleCBiL0RvYy9saWIvbGliZmNudGwudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzc2ZGEzLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGliZmNudGwudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7ZmNudGx9IC0tLQotICAgICAgICAgVGhlIFxmdW5jdGlvbntmY250bCgpfSBhbmQgXGZ1bmN0aW9ue2lvY3RsKCl9IHN5c3RlbSBjYWxsc30KLQotXGRlY2xhcmVtb2R1bGV7YnVpbHRpbn17ZmNudGx9Ci0gIFxwbGF0Zm9ybXtVbml4fQotXG1vZHVsZXN5bm9wc2lze1RoZSBcZnVuY3Rpb257ZmNudGwoKX0gYW5kIFxmdW5jdGlvbntpb2N0bCgpfSBzeXN0ZW0gY2FsbHMufQotXHNlY3Rpb25hdXRob3J7SmFhcCBWZXJtZXVsZW59e30KLQotXGluZGV4aWl7VU5JWEBcVU5JWH17ZmlsZSBjb250cm9sfQotXGluZGV4aWl7VU5JWEBcVU5JWH17SS9PIGNvbnRyb2x9Ci0KLVRoaXMgbW9kdWxlIHBlcmZvcm1zIGZpbGUgY29udHJvbCBhbmQgSS9PIGNvbnRyb2wgb24gZmlsZSBkZXNjcmlwdG9ycy4KLUl0IGlzIGFuIGludGVyZmFjZSB0byB0aGUgXGNmdW5jdGlvbntmY250bCgpfSBhbmQgXGNmdW5jdGlvbntpb2N0bCgpfQotXFVOSVh7fSByb3V0aW5lcy4KLQotQWxsIGZ1bmN0aW9ucyBpbiB0aGlzIG1vZHVsZSB0YWtlIGEgZmlsZSBkZXNjcmlwdG9yIFx2YXJ7ZmR9IGFzIHRoZWlyCi1maXJzdCBhcmd1bWVudC4gIFRoaXMgY2FuIGJlIGFuIGludGVnZXIgZmlsZSBkZXNjcmlwdG9yLCBzdWNoIGFzCi1yZXR1cm5lZCBieSBcY29kZXtzeXMuc3RkaW4uZmlsZW5vKCl9LCBvciBhIGZpbGUgb2JqZWN0LCBzdWNoIGFzCi1cY29kZXtzeXMuc3RkaW59IGl0c2VsZiwgd2hpY2ggcHJvdmlkZXMgYSBcbWV0aG9ke2ZpbGVubygpfSB3aGljaAotcmV0dXJucyBhIGdlbnVpbmUgZmlsZSBkZXNjcmlwdG9yLgotCi1UaGUgbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6Ci0KLQotXGJlZ2lue2Z1bmNkZXNjfXtmY250bH17ZmQsIG9wXG9wdGlvbmFseywgYXJnfX0KLSAgUGVyZm9ybSB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbiBvbiBmaWxlIGRlc2NyaXB0b3IgXHZhcntmZH0gKGZpbGUKLSAgb2JqZWN0cyBwcm92aWRpbmcgYSBcbWV0aG9ke2ZpbGVubygpfSBtZXRob2QgYXJlIGFjY2VwdGVkIGFzIHdlbGwpLgotICBUaGUgb3BlcmF0aW9uIGlzIGRlZmluZWQgYnkgXHZhcntvcH0gYW5kIGlzIG9wZXJhdGluZyBzeXN0ZW0KLSAgZGVwZW5kZW50LiAgVGhlc2UgY29kZXMgYXJlIGFsc28gZm91bmQgaW4gdGhlIFxtb2R1bGV7ZmNudGx9Ci0gIG1vZHVsZS4gVGhlIGFyZ3VtZW50IFx2YXJ7YXJnfSBpcyBvcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIHRoZQotICBpbnRlZ2VyIHZhbHVlIFxjb2RlezB9LiAgV2hlbiBwcmVzZW50LCBpdCBjYW4gZWl0aGVyIGJlIGFuIGludGVnZXIKLSAgdmFsdWUsIG9yIGEgc3RyaW5nLiAgV2l0aCB0aGUgYXJndW1lbnQgbWlzc2luZyBvciBhbiBpbnRlZ2VyIHZhbHVlLAotICB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMgZnVuY3Rpb24gaXMgdGhlIGludGVnZXIgcmV0dXJuIHZhbHVlIG9mIHRoZQotICBDIFxjZnVuY3Rpb257ZmNudGwoKX0gY2FsbC4gIFdoZW4gdGhlIGFyZ3VtZW50IGlzIGEgc3RyaW5nIGl0Ci0gIHJlcHJlc2VudHMgYSBiaW5hcnkgc3RydWN0dXJlLCBlLmcuXCBjcmVhdGVkIGJ5Ci0gIFxmdW5jdGlvbntccmVmbW9kdWxle3N0cnVjdH0ucGFjaygpfS4gVGhlIGJpbmFyeSBkYXRhIGlzIGNvcGllZCB0byBhIGJ1ZmZlcgotICB3aG9zZSBhZGRyZXNzIGlzIHBhc3NlZCB0byB0aGUgQyBcY2Z1bmN0aW9ue2ZjbnRsKCl9IGNhbGwuICBUaGUKLSAgcmV0dXJuIHZhbHVlIGFmdGVyIGEgc3VjY2Vzc2Z1bCBjYWxsIGlzIHRoZSBjb250ZW50cyBvZiB0aGUgYnVmZmVyLAotICBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgb2JqZWN0LiAgVGhlIGxlbmd0aCBvZiB0aGUgcmV0dXJuZWQgc3RyaW5nCi0gIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIGxlbmd0aCBvZiB0aGUgXHZhcnthcmd9IGFyZ3VtZW50LiAgVGhpcyBpcwotICBsaW1pdGVkIHRvIDEwMjQgYnl0ZXMuICBJZiB0aGUgaW5mb3JtYXRpb24gcmV0dXJuZWQgaW4gdGhlIGJ1ZmZlciBieQotICB0aGUgb3BlcmF0aW5nIHN5c3RlbSBpcyBsYXJnZXIgdGhhbiAxMDI0IGJ5dGVzLCB0aGlzIGlzIG1vc3QgbGlrZWx5Ci0gIHRvIHJlc3VsdCBpbiBhIHNlZ21lbnRhdGlvbiB2aW9sYXRpb24gb3IgYSBtb3JlIHN1YnRsZSBkYXRhCi0gIGNvcnJ1cHRpb24uCi0KLSAgSWYgdGhlIFxjZnVuY3Rpb257ZmNudGwoKX0gZmFpbHMsIGFuIFxleGNlcHRpb257SU9FcnJvcn0gaXMKLSAgcmFpc2VkLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpb2N0bH17ZmQsIG9wXG9wdGlvbmFseywgYXJnXG9wdGlvbmFseywgbXV0YXRlX2ZsYWd9fX0KLSAgVGhpcyBmdW5jdGlvbiBpcyBpZGVudGljYWwgdG8gdGhlIFxmdW5jdGlvbntmY250bCgpfSBmdW5jdGlvbiwKLSAgZXhjZXB0IHRoYXQgdGhlIG9wZXJhdGlvbnMgYXJlIHR5cGljYWxseSBkZWZpbmVkIGluIHRoZSBsaWJyYXJ5Ci0gIG1vZHVsZSBccmVmbW9kdWxle3Rlcm1pb3N9IGFuZCB0aGUgYXJndW1lbnQgaGFuZGxpbmcgaXMgZXZlbiBtb3JlCi0gIGNvbXBsaWNhdGVkLgotICAKLSAgVGhlIHBhcmFtZXRlciBcdmFye2FyZ30gY2FuIGJlIG9uZSBvZiBhbiBpbnRlZ2VyLCBhYnNlbnQgKHRyZWF0ZWQKLSAgaWRlbnRpY2FsbHkgdG8gdGhlIGludGVnZXIgXGNvZGV7MH0pLCBhbiBvYmplY3Qgc3VwcG9ydGluZyB0aGUKLSAgcmVhZC1vbmx5IGJ1ZmZlciBpbnRlcmZhY2UgKG1vc3QgbGlrZWx5IGEgcGxhaW4gUHl0aG9uIHN0cmluZykgb3IgYW4KLSAgb2JqZWN0IHN1cHBvcnRpbmcgdGhlIHJlYWQtd3JpdGUgYnVmZmVyIGludGVyZmFjZS4KLSAgCi0gIEluIGFsbCBidXQgdGhlIGxhc3QgY2FzZSwgYmVoYXZpb3VyIGlzIGFzIGZvciB0aGUgXGZ1bmN0aW9ue2ZjbnRsKCl9Ci0gIGZ1bmN0aW9uLgotICAKLSAgSWYgYSBtdXRhYmxlIGJ1ZmZlciBpcyBwYXNzZWQsIHRoZW4gdGhlIGJlaGF2aW91ciBpcyBkZXRlcm1pbmVkIGJ5Ci0gIHRoZSB2YWx1ZSBvZiB0aGUgXHZhcnttdXRhdGVfZmxhZ30gcGFyYW1ldGVyLgotICAKLSAgSWYgaXQgaXMgZmFsc2UsIHRoZSBidWZmZXIncyBtdXRhYmlsaXR5IGlzIGlnbm9yZWQgYW5kIGJlaGF2aW91ciBpcwotICBhcyBmb3IgYSByZWFkLW9ubHkgYnVmZmVyLCBleGNlcHQgdGhhdCB0aGUgMTAyNCBieXRlIGxpbWl0IG1lbnRpb25lZAotICBhYm92ZSBpcyBhdm9pZGVkIC0tIHNvIGxvbmcgYXMgdGhlIGJ1ZmZlciB5b3UgcGFzcyBpcyBhcyBsZWFzdCBhcwotICBsb25nIGFzIHdoYXQgdGhlIG9wZXJhdGluZyBzeXN0ZW0gd2FudHMgdG8gcHV0IHRoZXJlLCB0aGluZ3Mgc2hvdWxkCi0gIHdvcmsuCi0gIAotICBJZiBcdmFye211dGF0ZV9mbGFnfSBpcyB0cnVlLCB0aGVuIHRoZSBidWZmZXIgaXMgKGluIGVmZmVjdCkgcGFzc2VkCi0gIHRvIHRoZSB1bmRlcmx5aW5nIFxmdW5jdGlvbntpb2N0bCgpfSBzeXN0ZW0gY2FsbCwgdGhlIGxhdHRlcidzCi0gIHJldHVybiBjb2RlIGlzIHBhc3NlZCBiYWNrIHRvIHRoZSBjYWxsaW5nIFB5dGhvbiwgYW5kIHRoZSBidWZmZXIncwotICBuZXcgY29udGVudHMgcmVmbGVjdCB0aGUgYWN0aW9uIG9mIHRoZSBcZnVuY3Rpb257aW9jdGwoKX0uICBUaGlzIGlzIGEKLSAgc2xpZ2h0IHNpbXBsaWZpY2F0aW9uLCBiZWNhdXNlIGlmIHRoZSBzdXBwbGllZCBidWZmZXIgaXMgbGVzcyB0aGFuCi0gIDEwMjQgYnl0ZXMgbG9uZyBpdCBpcyBmaXJzdCBjb3BpZWQgaW50byBhIHN0YXRpYyBidWZmZXIgMTAyNCBieXRlcwotICBsb25nIHdoaWNoIGlzIHRoZW4gcGFzc2VkIHRvIFxmdW5jdGlvbntpb2N0bCgpfSBhbmQgY29waWVkIGJhY2sgaW50bwotICB0aGUgc3VwcGxpZWQgYnVmZmVyLgotICAKLSAgSWYgXHZhcnttdXRhdGVfZmxhZ30gaXMgbm90IHN1cHBsaWVkLCB0aGVuIGZyb20gUHl0aG9uIDIuNSBpdAotICBkZWZhdWx0cyB0byB0cnVlLCB3aGljaCBpcyBhIGNoYW5nZSBmcm9tIHZlcnNpb25zIDIuMyBhbmQgMi40LgotICBTdXBwbHkgdGhlIGFyZ3VtZW50IGV4cGxpY2l0bHkgaWYgdmVyc2lvbiBwb3J0YWJpbGl0eSBpcyBhIHByaW9yaXR5LgotCi0gIEFuIGV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgYXJyYXksIGZjbnRsLCBzdHJ1Y3QsIHRlcm1pb3MsIG9zCi0+Pj4gb3MuZ2V0cGdycCgpCi0xMzM0MQotPj4+IHN0cnVjdC51bnBhY2soJ2gnLCBmY250bC5pb2N0bCgwLCB0ZXJtaW9zLlRJT0NHUEdSUCwgIiAgIikpWzBdCi0xMzM0MQotPj4+IGJ1ZiA9IGFycmF5LmFycmF5KCdoJywgWzBdKQotPj4+IGZjbnRsLmlvY3RsKDAsIHRlcm1pb3MuVElPQ0dQR1JQLCBidWYsIDEpCi0wCi0+Pj4gYnVmCi1hcnJheSgnaCcsIFsxMzM0MV0pCi1cZW5ke3ZlcmJhdGltfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtmbG9ja317ZmQsIG9wfQotUGVyZm9ybSB0aGUgbG9jayBvcGVyYXRpb24gXHZhcntvcH0gb24gZmlsZSBkZXNjcmlwdG9yIFx2YXJ7ZmR9IChmaWxlCi0gIG9iamVjdHMgcHJvdmlkaW5nIGEgXG1ldGhvZHtmaWxlbm8oKX0gbWV0aG9kIGFyZSBhY2NlcHRlZCBhcyB3ZWxsKS4KLVNlZSB0aGUgXFVOSVh7fSBtYW51YWwgXG1hbnBhZ2V7ZmxvY2t9ezN9IGZvciBkZXRhaWxzLiAgKE9uIHNvbWUKLXN5c3RlbXMsIHRoaXMgZnVuY3Rpb24gaXMgZW11bGF0ZWQgdXNpbmcgXGNmdW5jdGlvbntmY250bCgpfS4pCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2xvY2tmfXtmZCwgb3BlcmF0aW9uLAotICAgIFxvcHRpb25hbHtsZW5ndGgsIFxvcHRpb25hbHtzdGFydCwgXG9wdGlvbmFse3doZW5jZX19fX0KLVRoaXMgaXMgZXNzZW50aWFsbHkgYSB3cmFwcGVyIGFyb3VuZCB0aGUgXGZ1bmN0aW9ue2ZjbnRsKCl9IGxvY2tpbmcKLWNhbGxzLiAgXHZhcntmZH0gaXMgdGhlIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgZmlsZSB0byBsb2NrIG9yIHVubG9jaywKLWFuZCBcdmFye29wZXJhdGlvbn0gaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotCi1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtIFxjb25zdGFudHtMT0NLX1VOfSAtLSB1bmxvY2sKLVxpdGVtIFxjb25zdGFudHtMT0NLX1NIfSAtLSBhY3F1aXJlIGEgc2hhcmVkIGxvY2sKLVxpdGVtIFxjb25zdGFudHtMT0NLX0VYfSAtLSBhY3F1aXJlIGFuIGV4Y2x1c2l2ZSBsb2NrCi1cZW5ke2l0ZW1pemV9Ci0KLVdoZW4gXHZhcntvcGVyYXRpb259IGlzIFxjb25zdGFudHtMT0NLX1NIfSBvciBcY29uc3RhbnR7TE9DS19FWH0sIGl0Ci1jYW4gYWxzbyBiZSBiaXQtd2lzZSBPUidkIHdpdGggXGNvbnN0YW50e0xPQ0tfTkJ9IHRvIGF2b2lkIGJsb2NraW5nIG9uCi1sb2NrIGFjcXVpc2l0aW9uLiAgSWYgXGNvbnN0YW50e0xPQ0tfTkJ9IGlzIHVzZWQgYW5kIHRoZSBsb2NrIGNhbm5vdAotYmUgYWNxdWlyZWQsIGFuIFxleGNlcHRpb257SU9FcnJvcn0gd2lsbCBiZSByYWlzZWQgYW5kIHRoZSBleGNlcHRpb24KLXdpbGwgaGF2ZSBhbiBcdmFye2Vycm5vfSBhdHRyaWJ1dGUgc2V0IHRvIFxjb25zdGFudHtFQUNDRVN9IG9yCi1cY29uc3RhbnR7RUFHQUlOfSAoZGVwZW5kaW5nIG9uIHRoZSBvcGVyYXRpbmcgc3lzdGVtOyBmb3IgcG9ydGFiaWxpdHksCi1jaGVjayBmb3IgYm90aCB2YWx1ZXMpLiAgT24gYXQgbGVhc3Qgc29tZSBzeXN0ZW1zLCBcY29uc3RhbnR7TE9DS19FWH0KLWNhbiBvbmx5IGJlIHVzZWQgaWYgdGhlIGZpbGUgZGVzY3JpcHRvciByZWZlcnMgdG8gYSBmaWxlIG9wZW5lZCBmb3IKLXdyaXRpbmcuCi0KLVx2YXJ7bGVuZ3RofSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGxvY2ssIFx2YXJ7c3RhcnR9IGlzIHRoZSBieXRlCi1vZmZzZXQgYXQgd2hpY2ggdGhlIGxvY2sgc3RhcnRzLCByZWxhdGl2ZSB0byBcdmFye3doZW5jZX0sIGFuZAotXHZhcnt3aGVuY2V9IGlzIGFzIHdpdGggXGZ1bmN0aW9ue2ZpbGVvYmouc2VlaygpfSwgc3BlY2lmaWNhbGx5OgotCi1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtIFxjb25zdGFudHswfSAtLSByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGZpbGUKLSAgICAgIChcY29uc3RhbnR7U0VFS19TRVR9KQotXGl0ZW0gXGNvbnN0YW50ezF9IC0tIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGJ1ZmZlciBwb3NpdGlvbgotICAgICAgKFxjb25zdGFudHtTRUVLX0NVUn0pCi1caXRlbSBcY29uc3RhbnR7Mn0gLS0gcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZQotICAgICAgKFxjb25zdGFudHtTRUVLX0VORH0pCi1cZW5ke2l0ZW1pemV9Ci0KLVRoZSBkZWZhdWx0IGZvciBcdmFye3N0YXJ0fSBpcyAwLCB3aGljaCBtZWFucyB0byBzdGFydCBhdCB0aGUKLWJlZ2lubmluZyBvZiB0aGUgZmlsZS4gIFRoZSBkZWZhdWx0IGZvciBcdmFye2xlbmd0aH0gaXMgMCB3aGljaCBtZWFucwotdG8gbG9jayB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLiAgVGhlIGRlZmF1bHQgZm9yIFx2YXJ7d2hlbmNlfSBpcyBhbHNvCi0wLgotXGVuZHtmdW5jZGVzY30KLQotRXhhbXBsZXMgKGFsbCBvbiBhIFNWUjQgY29tcGxpYW50IHN5c3RlbSk6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCBzdHJ1Y3QsIGZjbnRsLCBvcwotCi1mID0gb3BlbiguLi4pCi1ydiA9IGZjbnRsLmZjbnRsKGYsIGZjbnRsLkZfU0VURkwsIG9zLk9fTkRFTEFZKQotCi1sb2NrZGF0YSA9IHN0cnVjdC5wYWNrKCdoaGxsaGgnLCBmY250bC5GX1dSTENLLCAwLCAwLCAwLCAwLCAwKQotcnYgPSBmY250bC5mY250bChmLCBmY250bC5GX1NFVExLVywgbG9ja2RhdGEpCi1cZW5ke3ZlcmJhdGltfQotCi1Ob3RlIHRoYXQgaW4gdGhlIGZpcnN0IGV4YW1wbGUgdGhlIHJldHVybiB2YWx1ZSB2YXJpYWJsZSBcdmFye3J2fSB3aWxsCi1ob2xkIGFuIGludGVnZXIgdmFsdWU7IGluIHRoZSBzZWNvbmQgZXhhbXBsZSBpdCB3aWxsIGhvbGQgYSBzdHJpbmcKLXZhbHVlLiAgVGhlIHN0cnVjdHVyZSBsYXktb3V0IGZvciB0aGUgXHZhcntsb2NrZGF0YX0gdmFyaWFibGUgaXMKLXN5c3RlbSBkZXBlbmRlbnQgLS0tIHRoZXJlZm9yZSB1c2luZyB0aGUgXGZ1bmN0aW9ue2Zsb2NrKCl9IGNhbGwgbWF5IGJlCi1iZXR0ZXIuCi0KLVxiZWdpbntzZWVhbHNvfQotICBcc2VlbW9kdWxle29zfXtJZiB0aGUgbG9ja2luZyBmbGFncyBcY29uc3RhbnR7T19TSExPQ0t9IGFuZAotCQkgXGNvbnN0YW50e09fRVhMT0NLfSBhcmUgcHJlc2VudCBpbiB0aGUgXG1vZHVsZXtvc30gbW9kdWxlLAotICAJCSB0aGUgXGZ1bmN0aW9ue29zLm9wZW4oKX0gZnVuY3Rpb24gcHJvdmlkZXMgYSBtb3JlCi0gIAkJIHBsYXRmb3JtLWluZGVwZW5kZW50IGFsdGVybmF0aXZlIHRvIHRoZSBcZnVuY3Rpb257bG9ja2YoKX0KLSAgCQkgYW5kIFxmdW5jdGlvbntmbG9jaygpfSBmdW5jdGlvbnMufQotXGVuZHtzZWVhbHNvfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJmaWxlY21wLnRleCBiL0RvYy9saWIvbGliZmlsZWNtcC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYjRiOGMuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJmaWxlY21wLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle2ZpbGVjbXB9IC0tLQotICAgICAgICAgRmlsZSBhbmQgRGlyZWN0b3J5IENvbXBhcmlzb25zfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZmlsZWNtcH0KLVxzZWN0aW9uYXV0aG9ye01vc2hlIFphZGthfXttb3NoZXpAemFka2Euc2l0ZS5jby5pbH0KLVxtb2R1bGVzeW5vcHNpc3tDb21wYXJlIGZpbGVzIGVmZmljaWVudGx5Ln0KLQotCi1UaGUgXG1vZHVsZXtmaWxlY21wfSBtb2R1bGUgZGVmaW5lcyBmdW5jdGlvbnMgdG8gY29tcGFyZSBmaWxlcyBhbmQKLWRpcmVjdG9yaWVzLCB3aXRoIHZhcmlvdXMgb3B0aW9uYWwgdGltZS9jb3JyZWN0bmVzcyB0cmFkZS1vZmZzLgotCi1UaGUgXG1vZHVsZXtmaWxlY21wfSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKLQotXGJlZ2lue2Z1bmNkZXNjfXtjbXB9e2YxLCBmMlxvcHRpb25hbHssIHNoYWxsb3d9fQotQ29tcGFyZSB0aGUgZmlsZXMgbmFtZWQgXHZhcntmMX0gYW5kIFx2YXJ7ZjJ9LCByZXR1cm5pbmcgXGNvZGV7VHJ1ZX0gaWYKLXRoZXkgc2VlbSBlcXVhbCwgXGNvZGV7RmFsc2V9IG90aGVyd2lzZS4KLQotVW5sZXNzIFx2YXJ7c2hhbGxvd30gaXMgZ2l2ZW4gYW5kIGlzIGZhbHNlLCBmaWxlcyB3aXRoIGlkZW50aWNhbAotXGZ1bmN0aW9ue29zLnN0YXQoKX0gc2lnbmF0dXJlcyBhcmUgdGFrZW4gdG8gYmUgZXF1YWwuCi0KLUZpbGVzIHRoYXQgd2VyZSBjb21wYXJlZCB1c2luZyB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IGJlIGNvbXBhcmVkIGFnYWluCi11bmxlc3MgdGhlaXIgXGZ1bmN0aW9ue29zLnN0YXQoKX0gc2lnbmF0dXJlIGNoYW5nZXMuCi0KLU5vdGUgdGhhdCBubyBleHRlcm5hbCBwcm9ncmFtcyBhcmUgY2FsbGVkIGZyb20gdGhpcyBmdW5jdGlvbiwgZ2l2aW5nIGl0Ci1wb3J0YWJpbGl0eSBhbmQgZWZmaWNpZW5jeS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y21wZmlsZXN9e2RpcjEsIGRpcjIsIGNvbW1vblxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFsbG93fX0KLVJldHVybnMgdGhyZWUgbGlzdHMgb2YgZmlsZSBuYW1lczogXHZhcnttYXRjaH0sIFx2YXJ7bWlzbWF0Y2h9LAotXHZhcntlcnJvcnN9LiAgXHZhcnttYXRjaH0gY29udGFpbnMgdGhlIGxpc3Qgb2YgZmlsZXMgbWF0Y2ggaW4gYm90aAotZGlyZWN0b3JpZXMsIFx2YXJ7bWlzbWF0Y2h9IGluY2x1ZGVzIHRoZSBuYW1lcyBvZiB0aG9zZSB0aGF0IGRvbid0LAotYW5kIFx2YXJ7ZXJycm9zfSBsaXN0cyB0aGUgbmFtZXMgb2YgZmlsZXMgd2hpY2ggY291bGQgbm90IGJlCi1jb21wYXJlZC4gIEZpbGVzIG1heSBiZSBsaXN0ZWQgaW4gXHZhcntlcnJvcnN9IGJlY2F1c2UgdGhlIHVzZXIgbWF5Ci1sYWNrIHBlcm1pc3Npb24gdG8gcmVhZCB0aGVtIG9yIG1hbnkgb3RoZXIgcmVhc29ucywgYnV0IGFsd2F5cyB0aGF0Ci10aGUgY29tcGFyaXNvbiBjb3VsZCBub3QgYmUgZG9uZSBmb3Igc29tZSByZWFzb24uCi0KLVRoZSBcdmFye2NvbW1vbn0gcGFyYW1ldGVyIGlzIGEgbGlzdCBvZiBmaWxlIG5hbWVzIGZvdW5kIGluIGJvdGggZGlyZWN0b3JpZXMuCi1UaGUgXHZhcntzaGFsbG93fSBwYXJhbWV0ZXIgaGFzIHRoZSBzYW1lCi1tZWFuaW5nIGFuZCBkZWZhdWx0IHZhbHVlIGFzIGZvciBcZnVuY3Rpb257ZmlsZWNtcC5jbXAoKX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1FeGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gaW1wb3J0IGZpbGVjbXAKLT4+PiBmaWxlY21wLmNtcCgnbGlidW5kb2MudGV4JywgJ2xpYnVuZG9jLnRleCcpCi1UcnVlCi0+Pj4gZmlsZWNtcC5jbXAoJ2xpYnVuZG9jLnRleCcsICdsaWIudGV4JykKLUZhbHNlCi1cZW5ke3ZlcmJhdGltfQotCi0KLVxzdWJzZWN0aW9ue1RoZSBccHJvdGVjdFxjbGFzc3tkaXJjbXB9IGNsYXNzIFxsYWJlbHtkaXJjbXAtb2JqZWN0c319Ci0KLVxjbGFzc3tkaXJjbXB9IGluc3RhbmNlcyBhcmUgYnVpbHQgdXNpbmcgdGhpcyBjb25zdHJ1Y3RvcjoKLQotXGJlZ2lue2NsYXNzZGVzY317ZGlyY21wfXthLCBiXG9wdGlvbmFseywgaWdub3JlXG9wdGlvbmFseywgaGlkZX19fQotQ29uc3RydWN0IGEgbmV3IGRpcmVjdG9yeSBjb21wYXJpc29uIG9iamVjdCwgdG8gY29tcGFyZSB0aGUKLWRpcmVjdG9yaWVzIFx2YXJ7YX0gYW5kIFx2YXJ7Yn0uIFx2YXJ7aWdub3JlfSBpcyBhIGxpc3Qgb2YgbmFtZXMgdG8KLWlnbm9yZSwgYW5kIGRlZmF1bHRzIHRvIFxjb2Rle1snUkNTJywgJ0NWUycsICd0YWdzJ119LiBcdmFye2hpZGV9IGlzIGEKLWxpc3Qgb2YgbmFtZXMgdG8gaGlkZSwgYW5kIGRlZmF1bHRzIHRvIFxjb2Rle1tvcy5jdXJkaXIsIG9zLnBhcmRpcl19LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVRoZSBcY2xhc3N7ZGlyY21wfSBjbGFzcyBwcm92aWRlcyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtkaXJjbXBde3JlcG9ydH17fQotUHJpbnQgKHRvIFxjb2Rle3N5cy5zdGRvdXR9KSBhIGNvbXBhcmlzb24gYmV0d2VlbiBcdmFye2F9IGFuZCBcdmFye2J9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bZGlyY21wXXtyZXBvcnRfcGFydGlhbF9jbG9zdXJlfXt9Ci1QcmludCBhIGNvbXBhcmlzb24gYmV0d2VlbiBcdmFye2F9IGFuZCBcdmFye2J9IGFuZCBjb21tb24gaW1tZWRpYXRlCi1zdWJkaXJlY3Rvcmllcy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2RpcmNtcF17cmVwb3J0X2Z1bGxfY2xvc3VyZX17fQotUHJpbnQgYSBjb21wYXJpc29uIGJldHdlZW4gXHZhcnthfSBhbmQgXHZhcntifSBhbmQgY29tbW9uIAotc3ViZGlyZWN0b3JpZXMgKHJlY3Vyc2l2ZWx5KS4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1UaGUgXGNsYXNze2RpcmNtcH0gb2ZmZXJzIGEgbnVtYmVyIG9mIGludGVyZXN0aW5nIGF0dHJpYnV0ZXMgdGhhdCBtYXkKLWJlIHVzZWQgdG8gZ2V0IHZhcmlvdXMgYml0cyBvZiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGlyZWN0b3J5IHRyZWVzCi1iZWluZyBjb21wYXJlZC4KLQotTm90ZSB0aGF0IHZpYSBcbWV0aG9ke19fZ2V0YXR0cl9fKCl9IGhvb2tzLCBhbGwgYXR0cmlidXRlcyBhcmUKLWNvbXB1dGVkIGxhemlseSwgc28gdGhlcmUgaXMgbm8gc3BlZWQgcGVuYWx0eSBpZiBvbmx5IHRob3NlCi1hdHRyaWJ1dGVzIHdoaWNoIGFyZSBsaWdodHdlaWdodCB0byBjb21wdXRlIGFyZSB1c2VkLgotCi1cYmVnaW57bWVtYmVyZGVzY31bZGlyY21wXXtsZWZ0X2xpc3R9Ci1GaWxlcyBhbmQgc3ViZGlyZWN0b3JpZXMgaW4gXHZhcnthfSwgZmlsdGVyZWQgYnkgXHZhcntoaWRlfSBhbmQKLVx2YXJ7aWdub3JlfS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W2RpcmNtcF17cmlnaHRfbGlzdH0KLUZpbGVzIGFuZCBzdWJkaXJlY3RvcmllcyBpbiBcdmFye2J9LCBmaWx0ZXJlZCBieSBcdmFye2hpZGV9IGFuZAotXHZhcntpZ25vcmV9LgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bZGlyY21wXXtjb21tb259Ci1GaWxlcyBhbmQgc3ViZGlyZWN0b3JpZXMgaW4gYm90aCBcdmFye2F9IGFuZCBcdmFye2J9LgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bZGlyY21wXXtsZWZ0X29ubHl9Ci1GaWxlcyBhbmQgc3ViZGlyZWN0b3JpZXMgb25seSBpbiBcdmFye2F9LgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bZGlyY21wXXtyaWdodF9vbmx5fQotRmlsZXMgYW5kIHN1YmRpcmVjdG9yaWVzIG9ubHkgaW4gXHZhcntifS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W2RpcmNtcF17Y29tbW9uX2RpcnN9Ci1TdWJkaXJlY3RvcmllcyBpbiBib3RoIFx2YXJ7YX0gYW5kIFx2YXJ7Yn0uCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtkaXJjbXBde2NvbW1vbl9maWxlc30KLUZpbGVzIGluIGJvdGggXHZhcnthfSBhbmQgXHZhcntifQotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bZGlyY21wXXtjb21tb25fZnVubnl9Ci1OYW1lcyBpbiBib3RoIFx2YXJ7YX0gYW5kIFx2YXJ7Yn0sIHN1Y2ggdGhhdCB0aGUgdHlwZSBkaWZmZXJzIGJldHdlZW4KLXRoZSBkaXJlY3Rvcmllcywgb3IgbmFtZXMgZm9yIHdoaWNoIFxmdW5jdGlvbntvcy5zdGF0KCl9IHJlcG9ydHMgYW4KLWVycm9yLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bZGlyY21wXXtzYW1lX2ZpbGVzfQotRmlsZXMgd2hpY2ggYXJlIGlkZW50aWNhbCBpbiBib3RoIFx2YXJ7YX0gYW5kIFx2YXJ7Yn0uCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtkaXJjbXBde2RpZmZfZmlsZXN9Ci1GaWxlcyB3aGljaCBhcmUgaW4gYm90aCBcdmFye2F9IGFuZCBcdmFye2J9LCB3aG9zZSBjb250ZW50cyBkaWZmZXIuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtkaXJjbXBde2Z1bm55X2ZpbGVzfQotRmlsZXMgd2hpY2ggYXJlIGluIGJvdGggXHZhcnthfSBhbmQgXHZhcntifSwgYnV0IGNvdWxkIG5vdCBiZQotY29tcGFyZWQuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtkaXJjbXBde3N1YmRpcnN9Ci1BIGRpY3Rpb25hcnkgbWFwcGluZyBuYW1lcyBpbiBcbWVtYmVye2NvbW1vbl9kaXJzfSB0bwotXGNsYXNze2RpcmNtcH0gb2JqZWN0cy4KLVxlbmR7bWVtYmVyZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliZmlsZWlucHV0LnRleCBiL0RvYy9saWIvbGliZmlsZWlucHV0LnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NmYjdiYy4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmZpbGVpbnB1dC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtmaWxlaW5wdXR9IC0tLQotICAgICAgICAgSXRlcmF0ZSBvdmVyIGxpbmVzIGZyb20gbXVsdGlwbGUgaW5wdXQgc3RyZWFtc30KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtmaWxlaW5wdXR9Ci1cbW9kdWxlYXV0aG9ye0d1aWRvIHZhbiBSb3NzdW19e2d1aWRvQHB5dGhvbi5vcmd9Ci1cc2VjdGlvbmF1dGhvcntGcmVkIEwuIERyYWtlLCBKci59e2ZkcmFrZUBhY20ub3JnfQotCi1cbW9kdWxlc3lub3BzaXN7UGVybC1saWtlIGl0ZXJhdGlvbiBvdmVyIGxpbmVzIGZyb20gbXVsdGlwbGUgaW5wdXQKLXN0cmVhbXMsIHdpdGggYGBzYXZlIGluIHBsYWNlJycgY2FwYWJpbGl0eS59Ci0KLQotVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBhIGhlbHBlciBjbGFzcyBhbmQgZnVuY3Rpb25zIHRvIHF1aWNrbHkgd3JpdGUgYQotbG9vcCBvdmVyIHN0YW5kYXJkIGlucHV0IG9yIGEgbGlzdCBvZiBmaWxlcy4KLQotVGhlIHR5cGljYWwgdXNlIGlzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgZmlsZWlucHV0Ci1mb3IgbGluZSBpbiBmaWxlaW5wdXQuaW5wdXQoKToKLSAgICBwcm9jZXNzKGxpbmUpCi1cZW5ke3ZlcmJhdGltfQotCi1UaGlzIGl0ZXJhdGVzIG92ZXIgdGhlIGxpbmVzIG9mIGFsbCBmaWxlcyBsaXN0ZWQgaW4KLVxjb2Rle3N5cy5hcmd2WzE6XX0sIGRlZmF1bHRpbmcgdG8gXGNvZGV7c3lzLnN0ZGlufSBpZiB0aGUgbGlzdCBpcwotZW1wdHkuICBJZiBhIGZpbGVuYW1lIGlzIFxjb2RleyctJ30sIGl0IGlzIGFsc28gcmVwbGFjZWQgYnkKLVxjb2Rle3N5cy5zdGRpbn0uICBUbyBzcGVjaWZ5IGFuIGFsdGVybmF0aXZlIGxpc3Qgb2YgZmlsZW5hbWVzLCBwYXNzCi1pdCBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gXGZ1bmN0aW9ue2lucHV0KCl9LiAgQSBzaW5nbGUgZmlsZSBuYW1lIGlzCi1hbHNvIGFsbG93ZWQuCi0KLUFsbCBmaWxlcyBhcmUgb3BlbmVkIGluIHRleHQgbW9kZSBieSBkZWZhdWx0LCBidXQgeW91IGNhbiBvdmVycmlkZSB0aGlzIGJ5Ci1zcGVjaWZ5aW5nIHRoZSBcdmFye21vZGV9IHBhcmFtZXRlciBpbiB0aGUgY2FsbCB0byBcZnVuY3Rpb257aW5wdXQoKX0KLW9yIFxjbGFzc3tGaWxlSW5wdXQoKX0uICBJZiBhbiBJL08gZXJyb3Igb2NjdXJzIGR1cmluZyBvcGVuaW5nIG9yIHJlYWRpbmcKLWEgZmlsZSwgXGV4Y2VwdGlvbntJT0Vycm9yfSBpcyByYWlzZWQuCi0KLUlmIFxjb2Rle3N5cy5zdGRpbn0gaXMgdXNlZCBtb3JlIHRoYW4gb25jZSwgdGhlIHNlY29uZCBhbmQgZnVydGhlciB1c2UKLXdpbGwgcmV0dXJuIG5vIGxpbmVzLCBleGNlcHQgcGVyaGFwcyBmb3IgaW50ZXJhY3RpdmUgdXNlLCBvciBpZiBpdCBoYXMKLWJlZW4gZXhwbGljaXRseSByZXNldCAoZS5nLiB1c2luZyBcY29kZXtzeXMuc3RkaW4uc2VlaygwKX0pLgotCi1FbXB0eSBmaWxlcyBhcmUgb3BlbmVkIGFuZCBpbW1lZGlhdGVseSBjbG9zZWQ7IHRoZSBvbmx5IHRpbWUgdGhlaXIKLXByZXNlbmNlIGluIHRoZSBsaXN0IG9mIGZpbGVuYW1lcyBpcyBub3RpY2VhYmxlIGF0IGFsbCBpcyB3aGVuIHRoZQotbGFzdCBmaWxlIG9wZW5lZCBpcyBlbXB0eS4KLQotSXQgaXMgcG9zc2libGUgdGhhdCB0aGUgbGFzdCBsaW5lIG9mIGEgZmlsZSBkb2VzIG5vdCBlbmQgaW4gYSBuZXdsaW5lCi1jaGFyYWN0ZXI7IGxpbmVzIGFyZSByZXR1cm5lZCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nIG5ld2xpbmUgd2hlbiBpdAotaXMgcHJlc2VudC4KLQotWW91IGNhbiBjb250cm9sIGhvdyBmaWxlcyBhcmUgb3BlbmVkIGJ5IHByb3ZpZGluZyBhbiBvcGVuaW5nIGhvb2sgdmlhIHRoZQotXHZhcntvcGVuaG9va30gcGFyYW1ldGVyIHRvIFxmdW5jdGlvbntpbnB1dCgpfSBvciBcY2xhc3N7RmlsZUlucHV0KCl9LgotVGhlIGhvb2sgbXVzdCBiZSBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgdHdvIGFyZ3VtZW50cywgXHZhcntmaWxlbmFtZX0KLWFuZCBcdmFye21vZGV9LCBhbmQgcmV0dXJucyBhbiBhY2NvcmRpbmdseSBvcGVuZWQgZmlsZS1saWtlIG9iamVjdC4KLVR3byB1c2VmdWwgaG9va3MgYXJlIGFscmVhZHkgcHJvdmlkZWQgYnkgdGhpcyBtb2R1bGUuCi0KLVRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaXMgdGhlIHByaW1hcnkgaW50ZXJmYWNlIG9mIHRoaXMgbW9kdWxlOgotCi1cYmVnaW57ZnVuY2Rlc2N9e2lucHV0fXtcb3B0aW9uYWx7ZmlsZXNcb3B0aW9uYWx7LCBpbnBsYWNlXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgIGJhY2t1cFxvcHRpb25hbHssIG1vZGVcb3B0aW9uYWx7LCBvcGVuaG9va319fX19fQotICBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIFxjbGFzc3tGaWxlSW5wdXR9IGNsYXNzLiAgVGhlIGluc3RhbmNlCi0gIHdpbGwgYmUgdXNlZCBhcyBnbG9iYWwgc3RhdGUgZm9yIHRoZSBmdW5jdGlvbnMgb2YgdGhpcyBtb2R1bGUsIGFuZAotICBpcyBhbHNvIHJldHVybmVkIHRvIHVzZSBkdXJpbmcgaXRlcmF0aW9uLiAgVGhlIHBhcmFtZXRlcnMgdG8gdGhpcwotICBmdW5jdGlvbiB3aWxsIGJlIHBhc3NlZCBhbG9uZyB0byB0aGUgY29uc3RydWN0b3Igb2YgdGhlCi0gIFxjbGFzc3tGaWxlSW5wdXR9IGNsYXNzLgotCi0gIFx2ZXJzaW9uY2hhbmdlZFtBZGRlZCB0aGUgXHZhcnttb2RlfSBhbmQgXHZhcntvcGVuaG9va30gcGFyYW1ldGVyc117Mi41fQotXGVuZHtmdW5jZGVzY30KLQotCi1UaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyB1c2UgdGhlIGdsb2JhbCBzdGF0ZSBjcmVhdGVkIGJ5Ci1cZnVuY3Rpb257aW5wdXQoKX07IGlmIHRoZXJlIGlzIG5vIGFjdGl2ZSBzdGF0ZSwKLVxleGNlcHRpb257UnVudGltZUVycm9yfSBpcyByYWlzZWQuCi0KLVxiZWdpbntmdW5jZGVzY317ZmlsZW5hbWV9e30KLSAgUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGN1cnJlbnRseSBiZWluZyByZWFkLiAgQmVmb3JlIHRoZSBmaXJzdAotICBsaW5lIGhhcyBiZWVuIHJlYWQsIHJldHVybnMgXGNvZGV7Tm9uZX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2ZpbGVub317fQotICBSZXR1cm4gdGhlIGludGVnZXIgYGBmaWxlIGRlc2NyaXB0b3InJyBmb3IgdGhlIGN1cnJlbnQgZmlsZS4gV2hlbiBubwotICBmaWxlIGlzIG9wZW5lZCAoYmVmb3JlIHRoZSBmaXJzdCBsaW5lIGFuZCBiZXR3ZWVuIGZpbGVzKSwgcmV0dXJucwotICBcY29kZXstMX0uCi1cdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bGluZW5vfXt9Ci0gIFJldHVybiB0aGUgY3VtdWxhdGl2ZSBsaW5lIG51bWJlciBvZiB0aGUgbGluZSB0aGF0IGhhcyBqdXN0IGJlZW4KLSAgcmVhZC4gIEJlZm9yZSB0aGUgZmlyc3QgbGluZSBoYXMgYmVlbiByZWFkLCByZXR1cm5zIFxjb2RlezB9LiAgQWZ0ZXIKLSAgdGhlIGxhc3QgbGluZSBvZiB0aGUgbGFzdCBmaWxlIGhhcyBiZWVuIHJlYWQsIHJldHVybnMgdGhlIGxpbmUKLSAgbnVtYmVyIG9mIHRoYXQgbGluZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZmlsZWxpbmVub317fQotICBSZXR1cm4gdGhlIGxpbmUgbnVtYmVyIGluIHRoZSBjdXJyZW50IGZpbGUuICBCZWZvcmUgdGhlIGZpcnN0IGxpbmUKLSAgaGFzIGJlZW4gcmVhZCwgcmV0dXJucyBcY29kZXswfS4gIEFmdGVyIHRoZSBsYXN0IGxpbmUgb2YgdGhlIGxhc3QKLSAgZmlsZSBoYXMgYmVlbiByZWFkLCByZXR1cm5zIHRoZSBsaW5lIG51bWJlciBvZiB0aGF0IGxpbmUgd2l0aGluIHRoZQotICBmaWxlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpc2ZpcnN0bGluZX17fQotICBSZXR1cm5zIHRydWUgaWYgdGhlIGxpbmUganVzdCByZWFkIGlzIHRoZSBmaXJzdCBsaW5lIG9mIGl0cyBmaWxlLAotICBvdGhlcndpc2UgcmV0dXJucyBmYWxzZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aXNzdGRpbn17fQotICBSZXR1cm5zIHRydWUgaWYgdGhlIGxhc3QgbGluZSB3YXMgcmVhZCBmcm9tIFxjb2Rle3N5cy5zdGRpbn0sCi0gIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtuZXh0ZmlsZX17fQotICBDbG9zZSB0aGUgY3VycmVudCBmaWxlIHNvIHRoYXQgdGhlIG5leHQgaXRlcmF0aW9uIHdpbGwgcmVhZCB0aGUKLSAgZmlyc3QgbGluZSBmcm9tIHRoZSBuZXh0IGZpbGUgKGlmIGFueSk7IGxpbmVzIG5vdCByZWFkIGZyb20gdGhlIGZpbGUKLSAgd2lsbCBub3QgY291bnQgdG93YXJkcyB0aGUgY3VtdWxhdGl2ZSBsaW5lIGNvdW50LiAgVGhlIGZpbGVuYW1lIGlzCi0gIG5vdCBjaGFuZ2VkIHVudGlsIGFmdGVyIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBuZXh0IGZpbGUgaGFzIGJlZW4KLSAgcmVhZC4gIEJlZm9yZSB0aGUgZmlyc3QgbGluZSBoYXMgYmVlbiByZWFkLCB0aGlzIGZ1bmN0aW9uIGhhcyBubwotICBlZmZlY3Q7IGl0IGNhbm5vdCBiZSB1c2VkIHRvIHNraXAgdGhlIGZpcnN0IGZpbGUuICBBZnRlciB0aGUgbGFzdAotICBsaW5lIG9mIHRoZSBsYXN0IGZpbGUgaGFzIGJlZW4gcmVhZCwgdGhpcyBmdW5jdGlvbiBoYXMgbm8gZWZmZWN0LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtjbG9zZX17fQotICBDbG9zZSB0aGUgc2VxdWVuY2UuCi1cZW5ke2Z1bmNkZXNjfQotCi0KLVRoZSBjbGFzcyB3aGljaCBpbXBsZW1lbnRzIHRoZSBzZXF1ZW5jZSBiZWhhdmlvciBwcm92aWRlZCBieSB0aGUKLW1vZHVsZSBpcyBhdmFpbGFibGUgZm9yIHN1YmNsYXNzaW5nIGFzIHdlbGw6Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0ZpbGVJbnB1dH17XG9wdGlvbmFse2ZpbGVzXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wbGFjZVxvcHRpb25hbHssIGJhY2t1cFxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVcb3B0aW9uYWx7LCBvcGVuaG9va319fX19fQotICBDbGFzcyBcY2xhc3N7RmlsZUlucHV0fSBpcyB0aGUgaW1wbGVtZW50YXRpb247IGl0cyBtZXRob2RzCi0gIFxtZXRob2R7ZmlsZW5hbWUoKX0sIFxtZXRob2R7ZmlsZW5vKCl9LCBcbWV0aG9ke2xpbmVubygpfSwKLSAgXG1ldGhvZHtmaWxlbGluZSgpfSwgXG1ldGhvZHtpc2ZpcnN0bGluZSgpfSwgXG1ldGhvZHtpc3N0ZGluKCl9LAotICBcbWV0aG9ke25leHRmaWxlKCl9IGFuZCBcbWV0aG9ke2Nsb3NlKCl9IGNvcnJlc3BvbmQgdG8gdGhlIGZ1bmN0aW9ucwotICBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBtb2R1bGUuCi0gIEluIGFkZGl0aW9uIGl0IGhhcyBhIFxtZXRob2R7cmVhZGxpbmUoKX0gbWV0aG9kIHdoaWNoCi0gIHJldHVybnMgdGhlIG5leHQgaW5wdXQgbGluZSwgYW5kIGEgXG1ldGhvZHtfX2dldGl0ZW1fXygpfSBtZXRob2QKLSAgd2hpY2ggaW1wbGVtZW50cyB0aGUgc2VxdWVuY2UgYmVoYXZpb3IuICBUaGUgc2VxdWVuY2UgbXVzdCBiZQotICBhY2Nlc3NlZCBpbiBzdHJpY3RseSBzZXF1ZW50aWFsIG9yZGVyOyByYW5kb20gYWNjZXNzIGFuZAotICBcbWV0aG9ke3JlYWRsaW5lKCl9IGNhbm5vdCBiZSBtaXhlZC4KLQotICBXaXRoIFx2YXJ7bW9kZX0geW91IGNhbiBzcGVjaWZ5IHdoaWNoIGZpbGUgbW9kZSB3aWxsIGJlIHBhc3NlZCB0bwotICBcZnVuY3Rpb257b3BlbigpfS4gSXQgbXVzdCBiZSBvbmUgb2YgXGNvZGV7J3InfSwgXGNvZGV7J3JVJ30sCi0gIFxjb2RleydVJ30gYW5kIFxjb2RleydyYid9LgotCi0gIFRoZSBcdmFye29wZW5ob29rfSwgd2hlbiBnaXZlbiwgbXVzdCBiZSBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgdHdvIGFyZ3VtZW50cywKLSAgXHZhcntmaWxlbmFtZX0gYW5kIFx2YXJ7bW9kZX0sIGFuZCByZXR1cm5zIGFuIGFjY29yZGluZ2x5IG9wZW5lZAotICBmaWxlLWxpa2Ugb2JqZWN0LgotICBZb3UgY2Fubm90IHVzZSBcdmFye2lucGxhY2V9IGFuZCBcdmFye29wZW5ob29rfSB0b2dldGhlci4KLQotICBcdmVyc2lvbmNoYW5nZWRbQWRkZWQgdGhlIFx2YXJ7bW9kZX0gYW5kIFx2YXJ7b3Blbmhvb2t9IHBhcmFtZXRlcnNdezIuNX0KLVxlbmR7Y2xhc3NkZXNjfQotCi1cc3Ryb25ne09wdGlvbmFsIGluLXBsYWNlIGZpbHRlcmluZzp9IGlmIHRoZSBrZXl3b3JkIGFyZ3VtZW50Ci1cY29kZXtcdmFye2lucGxhY2V9PTF9IGlzIHBhc3NlZCB0byBcZnVuY3Rpb257aW5wdXQoKX0gb3IgdG8gdGhlCi1cY2xhc3N7RmlsZUlucHV0fSBjb25zdHJ1Y3RvciwgdGhlIGZpbGUgaXMgbW92ZWQgdG8gYSBiYWNrdXAgZmlsZSBhbmQKLXN0YW5kYXJkIG91dHB1dCBpcyBkaXJlY3RlZCB0byB0aGUgaW5wdXQgZmlsZSAoaWYgYSBmaWxlIG9mIHRoZSBzYW1lCi1uYW1lIGFzIHRoZSBiYWNrdXAgZmlsZSBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSByZXBsYWNlZCBzaWxlbnRseSkuCi1UaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHdyaXRlIGEgZmlsdGVyIHRoYXQgcmV3cml0ZXMgaXRzIGlucHV0IGZpbGUKLWluIHBsYWNlLiAgSWYgdGhlIGtleXdvcmQgYXJndW1lbnQgXGNvZGV7XHZhcntiYWNrdXB9PScuPHNvbWUKLWV4dGVuc2lvbj4nfSBpcyBhbHNvIGdpdmVuLCBpdCBzcGVjaWZpZXMgdGhlIGV4dGVuc2lvbiBmb3IgdGhlIGJhY2t1cAotZmlsZSwgYW5kIHRoZSBiYWNrdXAgZmlsZSByZW1haW5zIGFyb3VuZDsgYnkgZGVmYXVsdCwgdGhlIGV4dGVuc2lvbiBpcwotXGNvZGV7Jy5iYWsnfSBhbmQgaXQgaXMgZGVsZXRlZCB3aGVuIHRoZSBvdXRwdXQgZmlsZSBpcyBjbG9zZWQuICBJbi1wbGFjZQotZmlsdGVyaW5nIGlzIGRpc2FibGVkIHdoZW4gc3RhbmRhcmQgaW5wdXQgaXMgcmVhZC4KLQotXHN0cm9uZ3tDYXZlYXQ6fSBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCB3b3JrIGZvciBNUy1ET1MKLTgrMyBmaWxlc3lzdGVtcy4KLQotCi1UaGUgdHdvIGZvbGxvd2luZyBvcGVuaW5nIGhvb2tzIGFyZSBwcm92aWRlZCBieSB0aGlzIG1vZHVsZToKLQotXGJlZ2lue2Z1bmNkZXNjfXtob29rX2NvbXByZXNzZWR9e2ZpbGVuYW1lLCBtb2RlfQotICBUcmFuc3BhcmVudGx5IG9wZW5zIGZpbGVzIGNvbXByZXNzZWQgd2l0aCBnemlwIGFuZCBiemlwMiAocmVjb2duaXplZAotICBieSB0aGUgZXh0ZW5zaW9ucyBcY29kZXsnLmd6J30gYW5kIFxjb2RleycuYnoyJ30pIHVzaW5nIHRoZSBcbW9kdWxle2d6aXB9Ci0gIGFuZCBcbW9kdWxle2J6Mn0gbW9kdWxlcy4gIElmIHRoZSBmaWxlbmFtZSBleHRlbnNpb24gaXMgbm90IFxjb2RleycuZ3onfQotICBvciBcY29kZXsnLmJ6Mid9LCB0aGUgZmlsZSBpcyBvcGVuZWQgbm9ybWFsbHkgKGllLAotICB1c2luZyBcZnVuY3Rpb257b3BlbigpfSB3aXRob3V0IGFueSBkZWNvbXByZXNzaW9uKS4KLQotICBVc2FnZSBleGFtcGxlOiAKLSAgXHNhbXB7ZmkgPSBmaWxlaW5wdXQuRmlsZUlucHV0KG9wZW5ob29rPWZpbGVpbnB1dC5ob29rX2NvbXByZXNzZWQpfQotCi0gIFx2ZXJzaW9uYWRkZWR7Mi41fQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtob29rX2VuY29kZWR9e2VuY29kaW5nfQotICBSZXR1cm5zIGEgaG9vayB3aGljaCBvcGVucyBlYWNoIGZpbGUgd2l0aCBcZnVuY3Rpb257Y29kZWNzLm9wZW4oKX0sCi0gIHVzaW5nIHRoZSBnaXZlbiBcdmFye2VuY29kaW5nfSB0byByZWFkIHRoZSBmaWxlLgotCi0gIFVzYWdlIGV4YW1wbGU6Ci0gIFxzYW1we2ZpID0gZmlsZWlucHV0LkZpbGVJbnB1dChvcGVuaG9vaz1maWxlaW5wdXQuaG9va19lbmNvZGVkKCJpc28tODg1OS0xIikpfQotCi0gIFxub3Rle1dpdGggdGhpcyBob29rLCBcY2xhc3N7RmlsZUlucHV0fSBtaWdodCByZXR1cm4gVW5pY29kZSBzdHJpbmdzCi0gICAgICAgIGRlcGVuZGluZyBvbiB0aGUgc3BlY2lmaWVkIFx2YXJ7ZW5jb2Rpbmd9Ln0KLSAgXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke2Z1bmNkZXNjfQotCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmZubWF0Y2gudGV4IGIvRG9jL2xpYi9saWJmbm1hdGNoLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFjNDZiZC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmZubWF0Y2gudGV4CisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtmbm1hdGNofSAtLS0KLSAgICAgICAgIFxVTklYe30gZmlsZW5hbWUgcGF0dGVybiBtYXRjaGluZ30KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2ZubWF0Y2h9Ci1cbW9kdWxlc3lub3BzaXN7XFVOSVhcIHNoZWxsIHN0eWxlIGZpbGVuYW1lIHBhdHRlcm4gbWF0Y2hpbmcufQotCi0KLVxpbmRleHtmaWxlbmFtZXMhd2lsZGNhcmQgZXhwYW5zaW9ufQotCi1UaGlzIG1vZHVsZSBwcm92aWRlcyBzdXBwb3J0IGZvciBcVU5JWHt9IHNoZWxsLXN0eWxlIHdpbGRjYXJkcywgd2hpY2gKLWFyZSBcZW1waHtub3R9IHRoZSBzYW1lIGFzIHJlZ3VsYXIgZXhwcmVzc2lvbnMgKHdoaWNoIGFyZSBkb2N1bWVudGVkCi1pbiB0aGUgXHJlZm1vZHVsZXtyZX1ccmVmc3Rtb2RpbmRleHtyZX0gbW9kdWxlKS4gIFRoZSBzcGVjaWFsCi1jaGFyYWN0ZXJzIHVzZWQgaW4gc2hlbGwtc3R5bGUgd2lsZGNhcmRzIGFyZToKLQotXGJlZ2lue3RhYmxlaWl9e2N8bH17Y29kZX17UGF0dGVybn17TWVhbmluZ30KLSAgXGxpbmVpaXsqfXttYXRjaGVzIGV2ZXJ5dGhpbmd9Ci0gIFxsaW5laWl7P317bWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3Rlcn0KLSAgXGxpbmVpaXtbXHZhcntzZXF9XX17bWF0Y2hlcyBhbnkgY2hhcmFjdGVyIGluIFx2YXJ7c2VxfX0KLSAgXGxpbmVpaXtbIVx2YXJ7c2VxfV19e21hdGNoZXMgYW55IGNoYXJhY3RlciBub3QgaW4gXHZhcntzZXF9fQotXGVuZHt0YWJsZWlpfQotCi1Ob3RlIHRoYXQgdGhlIGZpbGVuYW1lIHNlcGFyYXRvciAoXGNvZGV7Jy8nfSBvbiBcVU5JWCkgaXMgXGVtcGh7bm90fQotc3BlY2lhbCB0byB0aGlzIG1vZHVsZS4gIFNlZSBtb2R1bGUKLVxyZWZtb2R1bGV7Z2xvYn1ccmVmc3Rtb2RpbmRleHtnbG9ifSBmb3IgcGF0aG5hbWUgZXhwYW5zaW9uCi0oXHJlZm1vZHVsZXtnbG9ifSB1c2VzIFxmdW5jdGlvbntmbm1hdGNoKCl9IHRvIG1hdGNoIHBhdGhuYW1lCi1zZWdtZW50cykuICBTaW1pbGFybHksIGZpbGVuYW1lcyBzdGFydGluZyB3aXRoIGEgcGVyaW9kIGFyZQotbm90IHNwZWNpYWwgZm9yIHRoaXMgbW9kdWxlLCBhbmQgYXJlIG1hdGNoZWQgYnkgdGhlIFxjb2Rleyp9IGFuZAotXGNvZGV7P30gcGF0dGVybnMuCi0KLQotXGJlZ2lue2Z1bmNkZXNjfXtmbm1hdGNofXtmaWxlbmFtZSwgcGF0dGVybn0KLVRlc3Qgd2hldGhlciB0aGUgXHZhcntmaWxlbmFtZX0gc3RyaW5nIG1hdGNoZXMgdGhlIFx2YXJ7cGF0dGVybn0KLXN0cmluZywgcmV0dXJuaW5nIHRydWUgb3IgZmFsc2UuICBJZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBpcwotY2FzZS1pbnNlbnNpdGl2ZSwgdGhlbiBib3RoIHBhcmFtZXRlcnMgd2lsbCBiZSBub3JtYWxpemVkIHRvIGFsbAotbG93ZXItIG9yIHVwcGVyLWNhc2UgYmVmb3JlIHRoZSBjb21wYXJpc29uIGlzIHBlcmZvcm1lZC4gIElmIHlvdQotcmVxdWlyZSBhIGNhc2Utc2Vuc2l0aXZlIGNvbXBhcmlzb24gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoYXQncwotc3RhbmRhcmQgZm9yIHlvdXIgb3BlcmF0aW5nIHN5c3RlbSwgdXNlIFxmdW5jdGlvbntmbm1hdGNoY2FzZSgpfQotaW5zdGVhZC4KLQotVGhpcyBleGFtcGxlIHdpbGwgcHJpbnQgYWxsIGZpbGUgbmFtZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdpdGggdGhlCi1leHRlbnNpb24gXGNvZGV7LnR4dH06Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCBmbm1hdGNoCi1pbXBvcnQgb3MKLQotZm9yIGZpbGUgaW4gb3MubGlzdGRpcignLicpOgotICAgIGlmIGZubWF0Y2guZm5tYXRjaChmaWxlLCAnKi50eHQnKToKLSAgICAgICAgcHJpbnQgZmlsZQotXGVuZHt2ZXJiYXRpbX0KLQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtmbm1hdGNoY2FzZX17ZmlsZW5hbWUsIHBhdHRlcm59Ci1UZXN0IHdoZXRoZXIgXHZhcntmaWxlbmFtZX0gbWF0Y2hlcyBcdmFye3BhdHRlcm59LCByZXR1cm5pbmcgdHJ1ZSBvcgotZmFsc2U7IHRoZSBjb21wYXJpc29uIGlzIGNhc2Utc2Vuc2l0aXZlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtmaWx0ZXJ9e25hbWVzLCBwYXR0ZXJufQotUmV0dXJuIHRoZSBzdWJzZXQgb2YgdGhlIGxpc3Qgb2YgXHZhcntuYW1lc30gdGhhdCBtYXRjaCBcdmFye3BhdHRlcm59LgotSXQgaXMgdGhlIHNhbWUgYXMgXGNvZGV7W24gZm9yIG4gaW4gbmFtZXMgaWYgZm5tYXRjaChuLCBwYXR0ZXJuKV19LCBidXQKLWltcGxlbWVudGVkIG1vcmUgZWZmaWNpZW50bHkuCi1cdmVyc2lvbmFkZGVkezIuMn0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dHJhbnNsYXRlfXtwYXR0ZXJufQotUmV0dXJuIHRoZSBzaGVsbC1zdHlsZSBcdmFye3BhdHRlcm59IGNvbnZlcnRlZCB0byBhIHJlZ3VsYXIKLWV4cHJlc3Npb24uCi0KLUV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgZm5tYXRjaCwgcmUKLT4+PgotPj4+IHJlZ2V4ID0gZm5tYXRjaC50cmFuc2xhdGUoJyoudHh0JykKLT4+PiByZWdleAotJy4qXFwudHh0JCcKLT4+PiByZW9iaiA9IHJlLmNvbXBpbGUocmVnZXgpCi0+Pj4gcHJpbnQgcmVvYmoubWF0Y2goJ2Zvb2Jhci50eHQnKQotPF9zcmUuU1JFX01hdGNoIG9iamVjdCBhdCAweC4uLj4KLVxlbmR7dmVyYmF0aW19Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZW1vZHVsZXtnbG9ifXtcVU5JWHt9IHNoZWxsLXN0eWxlIHBhdGggZXhwYW5zaW9uLn0KLVxlbmR7c2VlYWxzb30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliZm9ybWF0dGVyLnRleCBiL0RvYy9saWIvbGliZm9ybWF0dGVyLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdjNWE2Yi4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmZvcm1hdHRlci50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwzMjkgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtmb3JtYXR0ZXJ9IC0tLQotICAgICAgICAgR2VuZXJpYyBvdXRwdXQgZm9ybWF0dGluZ30KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2Zvcm1hdHRlcn0KLVxtb2R1bGVzeW5vcHNpc3tHZW5lcmljIG91dHB1dCBmb3JtYXR0ZXIgYW5kIGRldmljZSBpbnRlcmZhY2UufQotCi0KLQotVGhpcyBtb2R1bGUgc3VwcG9ydHMgdHdvIGludGVyZmFjZSBkZWZpbml0aW9ucywgZWFjaCB3aXRoIG11bHRpcGxlCi1pbXBsZW1lbnRhdGlvbnMuICBUaGUgXGVtcGh7Zm9ybWF0dGVyfSBpbnRlcmZhY2UgaXMgdXNlZCBieSB0aGUKLVxjbGFzc3tIVE1MUGFyc2VyfSBjbGFzcyBvZiB0aGUgXHJlZm1vZHVsZXtodG1sbGlifSBtb2R1bGUsIGFuZCB0aGUKLVxlbXBoe3dyaXRlcn0gaW50ZXJmYWNlIGlzIHJlcXVpcmVkIGJ5IHRoZSBmb3JtYXR0ZXIgaW50ZXJmYWNlLgotXHdpdGhzdWJpdGVteyhjbGFzcyBpbiBodG1sbGliKX17XHR0aW5kZXh7SFRNTFBhcnNlcn19Ci0KLUZvcm1hdHRlciBvYmplY3RzIHRyYW5zZm9ybSBhbiBhYnN0cmFjdCBmbG93IG9mIGZvcm1hdHRpbmcgZXZlbnRzIGludG8KLXNwZWNpZmljIG91dHB1dCBldmVudHMgb24gd3JpdGVyIG9iamVjdHMuICBGb3JtYXR0ZXJzIG1hbmFnZSBzZXZlcmFsCi1zdGFjayBzdHJ1Y3R1cmVzIHRvIGFsbG93IHZhcmlvdXMgcHJvcGVydGllcyBvZiBhIHdyaXRlciBvYmplY3QgdG8gYmUKLWNoYW5nZWQgYW5kIHJlc3RvcmVkOyB3cml0ZXJzIG5lZWQgbm90IGJlIGFibGUgdG8gaGFuZGxlIHJlbGF0aXZlCi1jaGFuZ2VzIG5vciBhbnkgc29ydCBvZiBgYGNoYW5nZSBiYWNrJycgb3BlcmF0aW9uLiAgU3BlY2lmaWMgd3JpdGVyCi1wcm9wZXJ0aWVzIHdoaWNoIG1heSBiZSBjb250cm9sbGVkIHZpYSBmb3JtYXR0ZXIgb2JqZWN0cyBhcmUKLWhvcml6b250YWwgYWxpZ25tZW50LCBmb250LCBhbmQgbGVmdCBtYXJnaW4gaW5kZW50YXRpb25zLiAgQSBtZWNoYW5pc20KLWlzIHByb3ZpZGVkIHdoaWNoIHN1cHBvcnRzIHByb3ZpZGluZyBhcmJpdHJhcnksIG5vbi1leGNsdXNpdmUgc3R5bGUKLXNldHRpbmdzIHRvIGEgd3JpdGVyIGFzIHdlbGwuICBBZGRpdGlvbmFsIGludGVyZmFjZXMgZmFjaWxpdGF0ZQotZm9ybWF0dGluZyBldmVudHMgd2hpY2ggYXJlIG5vdCByZXZlcnNpYmxlLCBzdWNoIGFzIHBhcmFncmFwaAotc2VwYXJhdGlvbi4KLQotV3JpdGVyIG9iamVjdHMgZW5jYXBzdWxhdGUgZGV2aWNlIGludGVyZmFjZXMuICBBYnN0cmFjdCBkZXZpY2VzLCBzdWNoCi1hcyBmaWxlIGZvcm1hdHMsIGFyZSBzdXBwb3J0ZWQgYXMgd2VsbCBhcyBwaHlzaWNhbCBkZXZpY2VzLiAgVGhlCi1wcm92aWRlZCBpbXBsZW1lbnRhdGlvbnMgYWxsIHdvcmsgd2l0aCBhYnN0cmFjdCBkZXZpY2VzLiAgVGhlCi1pbnRlcmZhY2UgbWFrZXMgYXZhaWxhYmxlIG1lY2hhbmlzbXMgZm9yIHNldHRpbmcgdGhlIHByb3BlcnRpZXMgd2hpY2gKLWZvcm1hdHRlciBvYmplY3RzIG1hbmFnZSBhbmQgaW5zZXJ0aW5nIGRhdGEgaW50byB0aGUgb3V0cHV0LgotCi0KLVxzdWJzZWN0aW9ue1RoZSBGb3JtYXR0ZXIgSW50ZXJmYWNlIFxsYWJlbHtmb3JtYXR0ZXItaW50ZXJmYWNlfX0KLQotSW50ZXJmYWNlcyB0byBjcmVhdGUgZm9ybWF0dGVycyBhcmUgZGVwZW5kZW50IG9uIHRoZSBzcGVjaWZpYwotZm9ybWF0dGVyIGNsYXNzIGJlaW5nIGluc3RhbnRpYXRlZC4gIFRoZSBpbnRlcmZhY2VzIGRlc2NyaWJlZCBiZWxvdwotYXJlIHRoZSByZXF1aXJlZCBpbnRlcmZhY2VzIHdoaWNoIGFsbCBmb3JtYXR0ZXJzIG11c3Qgc3VwcG9ydCBvbmNlCi1pbml0aWFsaXplZC4KLQotT25lIGRhdGEgZWxlbWVudCBpcyBkZWZpbmVkIGF0IHRoZSBtb2R1bGUgbGV2ZWw6Ci0KLQotXGJlZ2lue2RhdGFkZXNjfXtBU19JU30KLVZhbHVlIHdoaWNoIGNhbiBiZSB1c2VkIGluIHRoZSBmb250IHNwZWNpZmljYXRpb24gcGFzc2VkIHRvIHRoZQotXGNvZGV7cHVzaF9mb250KCl9IG1ldGhvZCBkZXNjcmliZWQgYmVsb3csIG9yIGFzIHRoZSBuZXcgdmFsdWUgdG8gYW55Ci1vdGhlciBcY29kZXtwdXNoX1x2YXJ7cHJvcGVydHl9KCl9IG1ldGhvZC4gIFB1c2hpbmcgdGhlIFxjb2Rle0FTX0lTfQotdmFsdWUgYWxsb3dzIHRoZSBjb3JyZXNwb25kaW5nIFxjb2Rle3BvcF9cdmFye3Byb3BlcnR5fSgpfSBtZXRob2QgdG8KLWJlIGNhbGxlZCB3aXRob3V0IGhhdmluZyB0byB0cmFjayB3aGV0aGVyIHRoZSBwcm9wZXJ0eSB3YXMgY2hhbmdlZC4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgZGVmaW5lZCBmb3IgZm9ybWF0dGVyIGluc3RhbmNlIG9iamVjdHM6Ci0KLQotXGJlZ2lue21lbWJlcmRlc2N9W2Zvcm1hdHRlcl17d3JpdGVyfQotVGhlIHdyaXRlciBpbnN0YW5jZSB3aXRoIHdoaWNoIHRoZSBmb3JtYXR0ZXIgaW50ZXJhY3RzLgotXGVuZHttZW1iZXJkZXNjfQotCi0KLVxiZWdpbnttZXRob2RkZXNjfVtmb3JtYXR0ZXJde2VuZF9wYXJhZ3JhcGh9e2JsYW5rbGluZXN9Ci1DbG9zZSBhbnkgb3BlbiBwYXJhZ3JhcGhzIGFuZCBpbnNlcnQgYXQgbGVhc3QgXHZhcntibGFua2xpbmVzfQotYmVmb3JlIHRoZSBuZXh0IHBhcmFncmFwaC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2Zvcm1hdHRlcl17YWRkX2xpbmVfYnJlYWt9e30KLUFkZCBhIGhhcmQgbGluZSBicmVhayBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4gIFRoaXMgZG9lcyBub3QKLWJyZWFrIHRoZSBsb2dpY2FsIHBhcmFncmFwaC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2Zvcm1hdHRlcl17YWRkX2hvcl9ydWxlfXsqYXJncywgKiprd30KLUluc2VydCBhIGhvcml6b250YWwgcnVsZSBpbiB0aGUgb3V0cHV0LiAgQSBoYXJkIGJyZWFrIGlzIGluc2VydGVkIGlmCi10aGVyZSBpcyBkYXRhIGluIHRoZSBjdXJyZW50IHBhcmFncmFwaCwgYnV0IHRoZSBsb2dpY2FsIHBhcmFncmFwaCBpcwotbm90IGJyb2tlbi4gIFRoZSBhcmd1bWVudHMgYW5kIGtleXdvcmRzIGFyZSBwYXNzZWQgb24gdG8gdGhlIHdyaXRlcidzCi1cbWV0aG9ke3NlbmRfbGluZV9icmVhaygpfSBtZXRob2QuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtmb3JtYXR0ZXJde2FkZF9mbG93aW5nX2RhdGF9e2RhdGF9Ci1Qcm92aWRlIGRhdGEgd2hpY2ggc2hvdWxkIGJlIGZvcm1hdHRlZCB3aXRoIGNvbGxhcHNlZCB3aGl0ZXNwYWNlLgotV2hpdGVzcGFjZSBmcm9tIHByZWNlZGluZyBhbmQgc3VjY2Vzc2l2ZSBjYWxscyB0bwotXG1ldGhvZHthZGRfZmxvd2luZ19kYXRhKCl9IGlzIGNvbnNpZGVyZWQgYXMgd2VsbCB3aGVuIHRoZSB3aGl0ZXNwYWNlCi1jb2xsYXBzZSBpcyBwZXJmb3JtZWQuICBUaGUgZGF0YSB3aGljaCBpcyBwYXNzZWQgdG8gdGhpcyBtZXRob2QgaXMKLWV4cGVjdGVkIHRvIGJlIHdvcmQtd3JhcHBlZCBieSB0aGUgb3V0cHV0IGRldmljZS4gIE5vdGUgdGhhdCBhbnkKLXdvcmQtd3JhcHBpbmcgc3RpbGwgbXVzdCBiZSBwZXJmb3JtZWQgYnkgdGhlIHdyaXRlciBvYmplY3QgZHVlIHRvIHRoZQotbmVlZCB0byByZWx5IG9uIGRldmljZSBhbmQgZm9udCBpbmZvcm1hdGlvbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2Zvcm1hdHRlcl17YWRkX2xpdGVyYWxfZGF0YX17ZGF0YX0KLVByb3ZpZGUgZGF0YSB3aGljaCBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSB3cml0ZXIgdW5jaGFuZ2VkLgotV2hpdGVzcGFjZSwgaW5jbHVkaW5nIG5ld2xpbmUgYW5kIHRhYiBjaGFyYWN0ZXJzLCBhcmUgY29uc2lkZXJlZCBsZWdhbAotaW4gdGhlIHZhbHVlIG9mIFx2YXJ7ZGF0YX0uICAKLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2Zvcm1hdHRlcl17YWRkX2xhYmVsX2RhdGF9e2Zvcm1hdCwgY291bnRlcn0KLUluc2VydCBhIGxhYmVsIHdoaWNoIHNob3VsZCBiZSBwbGFjZWQgdG8gdGhlIGxlZnQgb2YgdGhlIGN1cnJlbnQgbGVmdAotbWFyZ2luLiAgVGhpcyBzaG91bGQgYmUgdXNlZCBmb3IgY29uc3RydWN0aW5nIGJ1bGxldGVkIG9yIG51bWJlcmVkCi1saXN0cy4gIElmIHRoZSBcdmFye2Zvcm1hdH0gdmFsdWUgaXMgYSBzdHJpbmcsIGl0IGlzIGludGVycHJldGVkIGFzIGEKLWZvcm1hdCBzcGVjaWZpY2F0aW9uIGZvciBcdmFye2NvdW50ZXJ9LCB3aGljaCBzaG91bGQgYmUgYW4gaW50ZWdlci4KLVRoZSByZXN1bHQgb2YgdGhpcyBmb3JtYXR0aW5nIGJlY29tZXMgdGhlIHZhbHVlIG9mIHRoZSBsYWJlbDsgaWYKLVx2YXJ7Zm9ybWF0fSBpcyBub3QgYSBzdHJpbmcgaXQgaXMgdXNlZCBhcyB0aGUgbGFiZWwgdmFsdWUgZGlyZWN0bHkuCi1UaGUgbGFiZWwgdmFsdWUgaXMgcGFzc2VkIGFzIHRoZSBvbmx5IGFyZ3VtZW50IHRvIHRoZSB3cml0ZXIncwotXG1ldGhvZHtzZW5kX2xhYmVsX2RhdGEoKX0gbWV0aG9kLiAgSW50ZXJwcmV0YXRpb24gb2Ygbm9uLXN0cmluZyBsYWJlbAotdmFsdWVzIGlzIGRlcGVuZGVudCBvbiB0aGUgYXNzb2NpYXRlZCB3cml0ZXIuCi0KLUZvcm1hdCBzcGVjaWZpY2F0aW9ucyBhcmUgc3RyaW5ncyB3aGljaCwgaW4gY29tYmluYXRpb24gd2l0aCBhIGNvdW50ZXIKLXZhbHVlLCBhcmUgdXNlZCB0byBjb21wdXRlIGxhYmVsIHZhbHVlcy4gIEVhY2ggY2hhcmFjdGVyIGluIHRoZSBmb3JtYXQKLXN0cmluZyBpcyBjb3BpZWQgdG8gdGhlIGxhYmVsIHZhbHVlLCB3aXRoIHNvbWUgY2hhcmFjdGVycyByZWNvZ25pemVkCi10byBpbmRpY2F0ZSBhIHRyYW5zZm9ybSBvbiB0aGUgY291bnRlciB2YWx1ZS4gIFNwZWNpZmljYWxseSwgdGhlCi1jaGFyYWN0ZXIgXGNoYXJhY3RlcnsxfSByZXByZXNlbnRzIHRoZSBjb3VudGVyIHZhbHVlIGZvcm1hdHRlciBhcyBhbgotQXJhYmljIG51bWJlciwgdGhlIGNoYXJhY3RlcnMgXGNoYXJhY3RlcntBfSBhbmQgXGNoYXJhY3RlcnthfQotcmVwcmVzZW50IGFscGhhYmV0aWMgcmVwcmVzZW50YXRpb25zIG9mIHRoZSBjb3VudGVyIHZhbHVlIGluIHVwcGVyIGFuZAotbG93ZXIgY2FzZSwgcmVzcGVjdGl2ZWx5LCBhbmQgXGNoYXJhY3RlcntJfSBhbmQgXGNoYXJhY3RlcntpfQotcmVwcmVzZW50IHRoZSBjb3VudGVyIHZhbHVlIGluIFJvbWFuIG51bWVyYWxzLCBpbiB1cHBlciBhbmQgbG93ZXIKLWNhc2UuICBOb3RlIHRoYXQgdGhlIGFscGhhYmV0aWMgYW5kIHJvbWFuIHRyYW5zZm9ybXMgcmVxdWlyZSB0aGF0IHRoZQotY291bnRlciB2YWx1ZSBiZSBncmVhdGVyIHRoYW4gemVyby4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2Zvcm1hdHRlcl17Zmx1c2hfc29mdHNwYWNlfXt9Ci1TZW5kIGFueSBwZW5kaW5nIHdoaXRlc3BhY2UgYnVmZmVyZWQgZnJvbSBhIHByZXZpb3VzIGNhbGwgdG8KLVxtZXRob2R7YWRkX2Zsb3dpbmdfZGF0YSgpfSB0byB0aGUgYXNzb2NpYXRlZCB3cml0ZXIgb2JqZWN0LiAgVGhpcwotc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgYW55IGRpcmVjdCBtYW5pcHVsYXRpb24gb2YgdGhlIHdyaXRlciBvYmplY3QuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtmb3JtYXR0ZXJde3B1c2hfYWxpZ25tZW50fXthbGlnbn0KLVB1c2ggYSBuZXcgYWxpZ25tZW50IHNldHRpbmcgb250byB0aGUgYWxpZ25tZW50IHN0YWNrLiAgVGhpcyBtYXkgYmUKLVxjb25zdGFudHtBU19JU30gaWYgbm8gY2hhbmdlIGlzIGRlc2lyZWQuICBJZiB0aGUgYWxpZ25tZW50IHZhbHVlIGlzCi1jaGFuZ2VkIGZyb20gdGhlIHByZXZpb3VzIHNldHRpbmcsIHRoZSB3cml0ZXIncyBcbWV0aG9ke25ld19hbGlnbm1lbnQoKX0KLW1ldGhvZCBpcyBjYWxsZWQgd2l0aCB0aGUgXHZhcnthbGlnbn0gdmFsdWUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtmb3JtYXR0ZXJde3BvcF9hbGlnbm1lbnR9e30KLVJlc3RvcmUgdGhlIHByZXZpb3VzIGFsaWdubWVudC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2Zvcm1hdHRlcl17cHVzaF9mb250fXtcY29kZXsofXNpemUsIGl0YWxpYywgYm9sZCwgdGVsZXR5cGVcY29kZXspfX0KLUNoYW5nZSBzb21lIG9yIGFsbCBmb250IHByb3BlcnRpZXMgb2YgdGhlIHdyaXRlciBvYmplY3QuICBQcm9wZXJ0aWVzCi13aGljaCBhcmUgbm90IHNldCB0byBcY29uc3RhbnR7QVNfSVN9IGFyZSBzZXQgdG8gdGhlIHZhbHVlcyBwYXNzZWQgaW4KLXdoaWxlIG90aGVycyBhcmUgbWFpbnRhaW5lZCBhdCB0aGVpciBjdXJyZW50IHNldHRpbmdzLiAgVGhlIHdyaXRlcidzCi1cbWV0aG9ke25ld19mb250KCl9IG1ldGhvZCBpcyBjYWxsZWQgd2l0aCB0aGUgZnVsbHkgcmVzb2x2ZWQgZm9udAotc3BlY2lmaWNhdGlvbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2Zvcm1hdHRlcl17cG9wX2ZvbnR9e30KLVJlc3RvcmUgdGhlIHByZXZpb3VzIGZvbnQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtmb3JtYXR0ZXJde3B1c2hfbWFyZ2lufXttYXJnaW59Ci1JbmNyZWFzZSB0aGUgbnVtYmVyIG9mIGxlZnQgbWFyZ2luIGluZGVudGF0aW9ucyBieSBvbmUsIGFzc29jaWF0aW5nCi10aGUgbG9naWNhbCB0YWcgXHZhcnttYXJnaW59IHdpdGggdGhlIG5ldyBpbmRlbnRhdGlvbi4gIFRoZSBpbml0aWFsCi1tYXJnaW4gbGV2ZWwgaXMgXGNvZGV7MH0uICBDaGFuZ2VkIHZhbHVlcyBvZiB0aGUgbG9naWNhbCB0YWcgbXVzdCBiZQotdHJ1ZSB2YWx1ZXM7IGZhbHNlIHZhbHVlcyBvdGhlciB0aGFuIFxjb25zdGFudHtBU19JU30gYXJlIG5vdAotc3VmZmljaWVudCB0byBjaGFuZ2UgdGhlIG1hcmdpbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2Zvcm1hdHRlcl17cG9wX21hcmdpbn17fQotUmVzdG9yZSB0aGUgcHJldmlvdXMgbWFyZ2luLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bZm9ybWF0dGVyXXtwdXNoX3N0eWxlfXsqc3R5bGVzfQotUHVzaCBhbnkgbnVtYmVyIG9mIGFyYml0cmFyeSBzdHlsZSBzcGVjaWZpY2F0aW9ucy4gIEFsbCBzdHlsZXMgYXJlCi1wdXNoZWQgb250byB0aGUgc3R5bGVzIHN0YWNrIGluIG9yZGVyLiAgQSB0dXBsZSByZXByZXNlbnRpbmcgdGhlCi1lbnRpcmUgc3RhY2ssIGluY2x1ZGluZyBcY29uc3RhbnR7QVNfSVN9IHZhbHVlcywgaXMgcGFzc2VkIHRvIHRoZQotd3JpdGVyJ3MgXG1ldGhvZHtuZXdfc3R5bGVzKCl9IG1ldGhvZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2Zvcm1hdHRlcl17cG9wX3N0eWxlfXtcb3B0aW9uYWx7blxjb2RleyA9IDF9fX0KLVBvcCB0aGUgbGFzdCBcdmFye259IHN0eWxlIHNwZWNpZmljYXRpb25zIHBhc3NlZCB0bwotXG1ldGhvZHtwdXNoX3N0eWxlKCl9LiAgQSB0dXBsZSByZXByZXNlbnRpbmcgdGhlIHJldmlzZWQgc3RhY2ssCi1pbmNsdWRpbmcgXGNvbnN0YW50e0FTX0lTfSB2YWx1ZXMsIGlzIHBhc3NlZCB0byB0aGUgd3JpdGVyJ3MKLVxtZXRob2R7bmV3X3N0eWxlcygpfSBtZXRob2QuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtmb3JtYXR0ZXJde3NldF9zcGFjaW5nfXtzcGFjaW5nfQotU2V0IHRoZSBzcGFjaW5nIHN0eWxlIGZvciB0aGUgd3JpdGVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bZm9ybWF0dGVyXXthc3NlcnRfbGluZV9kYXRhfXtcb3B0aW9uYWx7ZmxhZ1xjb2RleyA9IDF9fX0KLUluZm9ybSB0aGUgZm9ybWF0dGVyIHRoYXQgZGF0YSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgY3VycmVudCBwYXJhZ3JhcGgKLW91dC1vZi1iYW5kLiAgVGhpcyBzaG91bGQgYmUgdXNlZCB3aGVuIHRoZSB3cml0ZXIgaGFzIGJlZW4gbWFuaXB1bGF0ZWQKLWRpcmVjdGx5LiAgVGhlIG9wdGlvbmFsIFx2YXJ7ZmxhZ30gYXJndW1lbnQgY2FuIGJlIHNldCB0byBmYWxzZSBpZgotdGhlIHdyaXRlciBtYW5pcHVsYXRpb25zIHByb2R1Y2VkIGEgaGFyZCBsaW5lIGJyZWFrIGF0IHRoZSBlbmQgb2YgdGhlCi1vdXRwdXQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLQotXHN1YnNlY3Rpb257Rm9ybWF0dGVyIEltcGxlbWVudGF0aW9ucyBcbGFiZWx7Zm9ybWF0dGVyLWltcGxzfX0KLQotVHdvIGltcGxlbWVudGF0aW9ucyBvZiBmb3JtYXR0ZXIgb2JqZWN0cyBhcmUgcHJvdmlkZWQgYnkgdGhpcyBtb2R1bGUuCi1Nb3N0IGFwcGxpY2F0aW9ucyBtYXkgdXNlIG9uZSBvZiB0aGVzZSBjbGFzc2VzIHdpdGhvdXQgbW9kaWZpY2F0aW9uIG9yCi1zdWJjbGFzc2luZy4KLQotXGJlZ2lue2NsYXNzZGVzY317TnVsbEZvcm1hdHRlcn17XG9wdGlvbmFse3dyaXRlcn19Ci1BIGZvcm1hdHRlciB3aGljaCBkb2VzIG5vdGhpbmcuICBJZiBcdmFye3dyaXRlcn0gaXMgb21pdHRlZCwgYQotXGNsYXNze051bGxXcml0ZXJ9IGluc3RhbmNlIGlzIGNyZWF0ZWQuICBObyBtZXRob2RzIG9mIHRoZSB3cml0ZXIgYXJlCi1jYWxsZWQgYnkgXGNsYXNze051bGxGb3JtYXR0ZXJ9IGluc3RhbmNlcy4gIEltcGxlbWVudGF0aW9ucyBzaG91bGQKLWluaGVyaXQgZnJvbSB0aGlzIGNsYXNzIGlmIGltcGxlbWVudGluZyBhIHdyaXRlciBpbnRlcmZhY2UgYnV0IGRvbid0Ci1uZWVkIHRvIGluaGVyaXQgYW55IGltcGxlbWVudGF0aW9uLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0Fic3RyYWN0Rm9ybWF0dGVyfXt3cml0ZXJ9Ci1UaGUgc3RhbmRhcmQgZm9ybWF0dGVyLiAgVGhpcyBpbXBsZW1lbnRhdGlvbiBoYXMgZGVtb25zdHJhdGVkIHdpZGUKLWFwcGxpY2FiaWxpdHkgdG8gbWFueSB3cml0ZXJzLCBhbmQgbWF5IGJlIHVzZWQgZGlyZWN0bHkgaW4gbW9zdAotY2lyY3Vtc3RhbmNlcy4gIEl0IGhhcyBiZWVuIHVzZWQgdG8gaW1wbGVtZW50IGEgZnVsbC1mZWF0dXJlZAotV29ybGQgV2lkZSBXZWIgYnJvd3Nlci4KLVxlbmR7Y2xhc3NkZXNjfQotCi0KLQotXHN1YnNlY3Rpb257VGhlIFdyaXRlciBJbnRlcmZhY2UgXGxhYmVse3dyaXRlci1pbnRlcmZhY2V9fQotCi1JbnRlcmZhY2VzIHRvIGNyZWF0ZSB3cml0ZXJzIGFyZSBkZXBlbmRlbnQgb24gdGhlIHNwZWNpZmljIHdyaXRlcgotY2xhc3MgYmVpbmcgaW5zdGFudGlhdGVkLiAgVGhlIGludGVyZmFjZXMgZGVzY3JpYmVkIGJlbG93IGFyZSB0aGUKLXJlcXVpcmVkIGludGVyZmFjZXMgd2hpY2ggYWxsIHdyaXRlcnMgbXVzdCBzdXBwb3J0IG9uY2UgaW5pdGlhbGl6ZWQuCi1Ob3RlIHRoYXQgd2hpbGUgbW9zdCBhcHBsaWNhdGlvbnMgY2FuIHVzZSB0aGUKLVxjbGFzc3tBYnN0cmFjdEZvcm1hdHRlcn0gY2xhc3MgYXMgYSBmb3JtYXR0ZXIsIHRoZSB3cml0ZXIgbXVzdAotdHlwaWNhbGx5IGJlIHByb3ZpZGVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KLQotCi1cYmVnaW57bWV0aG9kZGVzY31bd3JpdGVyXXtmbHVzaH17fQotRmx1c2ggYW55IGJ1ZmZlcmVkIG91dHB1dCBvciBkZXZpY2UgY29udHJvbCBldmVudHMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt3cml0ZXJde25ld19hbGlnbm1lbnR9e2FsaWdufQotU2V0IHRoZSBhbGlnbm1lbnQgc3R5bGUuICBUaGUgXHZhcnthbGlnbn0gdmFsdWUgY2FuIGJlIGFueSBvYmplY3QsCi1idXQgYnkgY29udmVudGlvbiBpcyBhIHN0cmluZyBvciBcY29kZXtOb25lfSwgd2hlcmUgXGNvZGV7Tm9uZX0KLWluZGljYXRlcyB0aGF0IHRoZSB3cml0ZXIncyBgYHByZWZlcnJlZCcnIGFsaWdubWVudCBzaG91bGQgYmUgdXNlZC4KLUNvbnZlbnRpb25hbCBcdmFye2FsaWdufSB2YWx1ZXMgYXJlIFxjb2RleydsZWZ0J30sIFxjb2RleydjZW50ZXInfSwKLVxjb2RleydyaWdodCd9LCBhbmQgXGNvZGV7J2p1c3RpZnknfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3dyaXRlcl17bmV3X2ZvbnR9e2ZvbnR9Ci1TZXQgdGhlIGZvbnQgc3R5bGUuICBUaGUgdmFsdWUgb2YgXHZhcntmb250fSB3aWxsIGJlIFxjb2Rle05vbmV9LAotaW5kaWNhdGluZyB0aGF0IHRoZSBkZXZpY2UncyBkZWZhdWx0IGZvbnQgc2hvdWxkIGJlIHVzZWQsIG9yIGEgdHVwbGUKLW9mIHRoZSBmb3JtIFxjb2Rleyh9XHZhcntzaXplfSwgXHZhcntpdGFsaWN9LCBcdmFye2JvbGR9LAotXHZhcnt0ZWxldHlwZX1cY29kZXspfS4gIFNpemUgd2lsbCBiZSBhIHN0cmluZyBpbmRpY2F0aW5nIHRoZSBzaXplIG9mCi1mb250IHRoYXQgc2hvdWxkIGJlIHVzZWQ7IHNwZWNpZmljIHN0cmluZ3MgYW5kIHRoZWlyIGludGVycHJldGF0aW9uCi1tdXN0IGJlIGRlZmluZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiAgVGhlIFx2YXJ7aXRhbGljfSwgXHZhcntib2xkfSwgYW5kCi1cdmFye3RlbGV0eXBlfSB2YWx1ZXMgYXJlIEJvb2xlYW4gdmFsdWVzIHNwZWNpZnlpbmcgd2hpY2ggb2YgdGhvc2UKLWZvbnQgYXR0cmlidXRlcyBzaG91bGQgYmUgdXNlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3dyaXRlcl17bmV3X21hcmdpbn17bWFyZ2luLCBsZXZlbH0KLVNldCB0aGUgbWFyZ2luIGxldmVsIHRvIHRoZSBpbnRlZ2VyIFx2YXJ7bGV2ZWx9IGFuZCB0aGUgbG9naWNhbCB0YWcKLXRvIFx2YXJ7bWFyZ2lufS4gIEludGVycHJldGF0aW9uIG9mIHRoZSBsb2dpY2FsIHRhZyBpcyBhdCB0aGUKLXdyaXRlcidzIGRpc2NyZXRpb247IHRoZSBvbmx5IHJlc3RyaWN0aW9uIG9uIHRoZSB2YWx1ZSBvZiB0aGUgbG9naWNhbAotdGFnIGlzIHRoYXQgaXQgbm90IGJlIGEgZmFsc2UgdmFsdWUgZm9yIG5vbi16ZXJvIHZhbHVlcyBvZgotXHZhcntsZXZlbH0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt3cml0ZXJde25ld19zcGFjaW5nfXtzcGFjaW5nfQotU2V0IHRoZSBzcGFjaW5nIHN0eWxlIHRvIFx2YXJ7c3BhY2luZ30uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt3cml0ZXJde25ld19zdHlsZXN9e3N0eWxlc30KLVNldCBhZGRpdGlvbmFsIHN0eWxlcy4gIFRoZSBcdmFye3N0eWxlc30gdmFsdWUgaXMgYSB0dXBsZSBvZgotYXJiaXRyYXJ5IHZhbHVlczsgdGhlIHZhbHVlIFxjb25zdGFudHtBU19JU30gc2hvdWxkIGJlIGlnbm9yZWQuICBUaGUKLVx2YXJ7c3R5bGVzfSB0dXBsZSBtYXkgYmUgaW50ZXJwcmV0ZWQgZWl0aGVyIGFzIGEgc2V0IG9yIGFzIGEgc3RhY2sKLWRlcGVuZGluZyBvbiB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSBhcHBsaWNhdGlvbiBhbmQgd3JpdGVyCi1pbXBsZW1lbnRhdGlvbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3dyaXRlcl17c2VuZF9saW5lX2JyZWFrfXt9Ci1CcmVhayB0aGUgY3VycmVudCBsaW5lLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bd3JpdGVyXXtzZW5kX3BhcmFncmFwaH17YmxhbmtsaW5lfQotUHJvZHVjZSBhIHBhcmFncmFwaCBzZXBhcmF0aW9uIG9mIGF0IGxlYXN0IFx2YXJ7YmxhbmtsaW5lfSBibGFuawotbGluZXMsIG9yIHRoZSBlcXVpdmFsZW50LiAgVGhlIFx2YXJ7YmxhbmtsaW5lfSB2YWx1ZSB3aWxsIGJlIGFuCi1pbnRlZ2VyLiAgTm90ZSB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiB3aWxsIHJlY2VpdmUgYSBjYWxsIHRvCi1cbWV0aG9ke3NlbmRfbGluZV9icmVhaygpfSBiZWZvcmUgdGhpcyBjYWxsIGlmIGEgbGluZSBicmVhayBpcyBuZWVkZWQ7IAotdGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBpbmNsdWRlIGVuZGluZyB0aGUgbGFzdCBsaW5lIG9mIHRoZSBwYXJhZ3JhcGguCi1JdCBpcyBvbmx5IHJlc3BvbnNpYmxlIGZvciB2ZXJ0aWNhbCBzcGFjaW5nIGJldHdlZW4gcGFyYWdyYXBocy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3dyaXRlcl17c2VuZF9ob3JfcnVsZX17KmFyZ3MsICoqa3d9Ci1EaXNwbGF5IGEgaG9yaXpvbnRhbCBydWxlIG9uIHRoZSBvdXRwdXQgZGV2aWNlLiAgVGhlIGFyZ3VtZW50cyB0byB0aGlzCi1tZXRob2QgYXJlIGVudGlyZWx5IGFwcGxpY2F0aW9uLSBhbmQgd3JpdGVyLXNwZWNpZmljLCBhbmQgc2hvdWxkIGJlCi1pbnRlcnByZXRlZCB3aXRoIGNhcmUuICBUaGUgbWV0aG9kIGltcGxlbWVudGF0aW9uIG1heSBhc3N1bWUgdGhhdCBhCi1saW5lIGJyZWFrIGhhcyBhbHJlYWR5IGJlZW4gaXNzdWVkIHZpYSBcbWV0aG9ke3NlbmRfbGluZV9icmVhaygpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3dyaXRlcl17c2VuZF9mbG93aW5nX2RhdGF9e2RhdGF9Ci1PdXRwdXQgY2hhcmFjdGVyIGRhdGEgd2hpY2ggbWF5IGJlIHdvcmQtd3JhcHBlZCBhbmQgcmUtZmxvd2VkIGFzCi1uZWVkZWQuICBXaXRoaW4gYW55IHNlcXVlbmNlIG9mIGNhbGxzIHRvIHRoaXMgbWV0aG9kLCB0aGUgd3JpdGVyIG1heQotYXNzdW1lIHRoYXQgc3BhbnMgb2YgbXVsdGlwbGUgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGhhdmUgYmVlbgotY29sbGFwc2VkIHRvIHNpbmdsZSBzcGFjZSBjaGFyYWN0ZXJzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bd3JpdGVyXXtzZW5kX2xpdGVyYWxfZGF0YX17ZGF0YX0KLU91dHB1dCBjaGFyYWN0ZXIgZGF0YSB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIGZvcm1hdHRlZAotZm9yIGRpc3BsYXkuICBHZW5lcmFsbHksIHRoaXMgc2hvdWxkIGJlIGludGVycHJldGVkIHRvIG1lYW4gdGhhdCBsaW5lCi1icmVha3MgaW5kaWNhdGVkIGJ5IG5ld2xpbmUgY2hhcmFjdGVycyBzaG91bGQgYmUgcHJlc2VydmVkIGFuZCBubyBuZXcKLWxpbmUgYnJlYWtzIHNob3VsZCBiZSBpbnRyb2R1Y2VkLiAgVGhlIGRhdGEgbWF5IGNvbnRhaW4gZW1iZWRkZWQKLW5ld2xpbmUgYW5kIHRhYiBjaGFyYWN0ZXJzLCB1bmxpa2UgZGF0YSBwcm92aWRlZCB0byB0aGUKLVxtZXRob2R7c2VuZF9mb3JtYXR0ZWRfZGF0YSgpfSBpbnRlcmZhY2UuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt3cml0ZXJde3NlbmRfbGFiZWxfZGF0YX17ZGF0YX0KLVNldCBcdmFye2RhdGF9IHRvIHRoZSBsZWZ0IG9mIHRoZSBjdXJyZW50IGxlZnQgbWFyZ2luLCBpZiBwb3NzaWJsZS4KLVRoZSB2YWx1ZSBvZiBcdmFye2RhdGF9IGlzIG5vdCByZXN0cmljdGVkOyB0cmVhdG1lbnQgb2Ygbm9uLXN0cmluZwotdmFsdWVzIGlzIGVudGlyZWx5IGFwcGxpY2F0aW9uLSBhbmQgd3JpdGVyLWRlcGVuZGVudC4gIFRoaXMgbWV0aG9kCi13aWxsIG9ubHkgYmUgY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLgotXGVuZHttZXRob2RkZXNjfQotCi0KLVxzdWJzZWN0aW9ue1dyaXRlciBJbXBsZW1lbnRhdGlvbnMgXGxhYmVse3dyaXRlci1pbXBsc319Ci0KLVRocmVlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgd3JpdGVyIG9iamVjdCBpbnRlcmZhY2UgYXJlIHByb3ZpZGVkIGFzCi1leGFtcGxlcyBieSB0aGlzIG1vZHVsZS4gIE1vc3QgYXBwbGljYXRpb25zIHdpbGwgbmVlZCB0byBkZXJpdmUgbmV3Ci13cml0ZXIgY2xhc3NlcyBmcm9tIHRoZSBcY2xhc3N7TnVsbFdyaXRlcn0gY2xhc3MuCi0KLVxiZWdpbntjbGFzc2Rlc2N9e051bGxXcml0ZXJ9e30KLUEgd3JpdGVyIHdoaWNoIG9ubHkgcHJvdmlkZXMgdGhlIGludGVyZmFjZSBkZWZpbml0aW9uOyBubyBhY3Rpb25zIGFyZQotdGFrZW4gb24gYW55IG1ldGhvZHMuICBUaGlzIHNob3VsZCBiZSB0aGUgYmFzZSBjbGFzcyBmb3IgYWxsIHdyaXRlcnMKLXdoaWNoIGRvIG5vdCBuZWVkIHRvIGluaGVyaXQgYW55IGltcGxlbWVudGF0aW9uIG1ldGhvZHMuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317QWJzdHJhY3RXcml0ZXJ9e30KLUEgd3JpdGVyIHdoaWNoIGNhbiBiZSB1c2VkIGluIGRlYnVnZ2luZyBmb3JtYXR0ZXJzLCBidXQgbm90IG11Y2gKLWVsc2UuICBFYWNoIG1ldGhvZCBzaW1wbHkgYW5ub3VuY2VzIGl0c2VsZiBieSBwcmludGluZyBpdHMgbmFtZSBhbmQKLWFyZ3VtZW50cyBvbiBzdGFuZGFyZCBvdXRwdXQuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317RHVtYldyaXRlcn17XG9wdGlvbmFse2ZpbGVcb3B0aW9uYWx7LCBtYXhjb2xcY29kZXsgPSA3Mn19fX0KLVNpbXBsZSB3cml0ZXIgY2xhc3Mgd2hpY2ggd3JpdGVzIG91dHB1dCBvbiB0aGUgZmlsZSBvYmplY3QgcGFzc2VkIGluCi1hcyBcdmFye2ZpbGV9IG9yLCBpZiBcdmFye2ZpbGV9IGlzIG9taXR0ZWQsIG9uIHN0YW5kYXJkIG91dHB1dC4gIFRoZQotb3V0cHV0IGlzIHNpbXBseSB3b3JkLXdyYXBwZWQgdG8gdGhlIG51bWJlciBvZiBjb2x1bW5zIHNwZWNpZmllZCBieQotXHZhcnttYXhjb2x9LiAgVGhpcyBjbGFzcyBpcyBzdWl0YWJsZSBmb3IgcmVmbG93aW5nIGEgc2VxdWVuY2Ugb2YKLXBhcmFncmFwaHMuCi1cZW5ke2NsYXNzZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliZnBlY3RsLnRleCBiL0RvYy9saWIvbGliZnBlY3RsLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NhMjMxNC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmZwZWN0bC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtmcGVjdGx9IC0tLQotICAgICAgICAgRmxvYXRpbmcgcG9pbnQgZXhjZXB0aW9uIGNvbnRyb2x9Ci0KLVxkZWNsYXJlbW9kdWxle2V4dGVuc2lvbn17ZnBlY3RsfQotICBccGxhdGZvcm17VW5peH0KLVxtb2R1bGVhdXRob3J7TGVlIEJ1c2J5fXtidXNieTFAbGxubC5nb3Z9Ci1cc2VjdGlvbmF1dGhvcntMZWUgQnVzYnl9e2J1c2J5MUBsbG5sLmdvdn0KLVxtb2R1bGVzeW5vcHNpc3tQcm92aWRlIGNvbnRyb2wgZm9yIGZsb2F0aW5nIHBvaW50IGV4Y2VwdGlvbiBoYW5kbGluZy59Ci0KLVxub3Rle1RoZSBcbW9kdWxle2ZwZWN0bH0gbW9kdWxlIGlzIG5vdCBidWlsdCBieSBkZWZhdWx0LCBhbmQgaXRzIHVzYWdlCi0gICAgICBpcyBkaXNjb3VyYWdlZCBhbmQgbWF5IGJlIGRhbmdlcm91cyBleGNlcHQgaW4gdGhlIGhhbmRzIG9mCi0gICAgICBleHBlcnRzLiAgU2VlIGFsc28gdGhlIHNlY3Rpb24gXHJlZntmcGVjdGwtbGltaXRhdGlvbnN9IG9uCi0gICAgICBsaW1pdGF0aW9ucyBmb3IgbW9yZSBkZXRhaWxzLn0KLQotTW9zdCBjb21wdXRlcnMgY2Fycnkgb3V0IGZsb2F0aW5nIHBvaW50IG9wZXJhdGlvbnNcaW5kZXh7SUVFRS03NTR9Ci1pbiBjb25mb3JtYW5jZSB3aXRoIHRoZSBzby1jYWxsZWQgSUVFRS03NTQgc3RhbmRhcmQuCi1PbiBhbnkgcmVhbCBjb21wdXRlciwKLXNvbWUgZmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9ucyBwcm9kdWNlIHJlc3VsdHMgdGhhdCBjYW5ub3QKLWJlIGV4cHJlc3NlZCBhcyBhIG5vcm1hbCBmbG9hdGluZyBwb2ludCB2YWx1ZS4KLUZvciBleGFtcGxlLCB0cnkKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGltcG9ydCBtYXRoCi0+Pj4gbWF0aC5leHAoMTAwMCkKLWluZgotPj4+IG1hdGguZXhwKDEwMDApIC8gbWF0aC5leHAoMTAwMCkKLW5hbgotXGVuZHt2ZXJiYXRpbX0KLQotKFRoZSBleGFtcGxlIGFib3ZlIHdpbGwgd29yayBvbiBtYW55IHBsYXRmb3Jtcy4KLURFQyBBbHBoYSBtYXkgYmUgb25lIGV4Y2VwdGlvbi4pCi0iSW5mIiBpcyBhIHNwZWNpYWwsIG5vbi1udW1lcmljIHZhbHVlIGluIElFRUUtNzU0IHRoYXQKLXN0YW5kcyBmb3IgImluZmluaXR5IiwgYW5kICJuYW4iIG1lYW5zICJub3QgYSBudW1iZXIuIgotTm90ZSB0aGF0LAotb3RoZXIgdGhhbiB0aGUgbm9uLW51bWVyaWMgcmVzdWx0cywKLW5vdGhpbmcgc3BlY2lhbCBoYXBwZW5lZCB3aGVuIHlvdSBhc2tlZCBQeXRob24KLXRvIGNhcnJ5IG91dCB0aG9zZSBjYWxjdWxhdGlvbnMuCi1UaGF0IGlzIGluIGZhY3QgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIHByZXNjcmliZWQgaW4gdGhlIElFRUUtNzU0IHN0YW5kYXJkLAotYW5kIGlmIGl0IHdvcmtzIGZvciB5b3UsCi1zdG9wIHJlYWRpbmcgbm93LgotCi1JbiBzb21lIGNpcmN1bXN0YW5jZXMsCi1pdCB3b3VsZCBiZSBiZXR0ZXIgdG8gcmFpc2UgYW4gZXhjZXB0aW9uIGFuZCBzdG9wIHByb2Nlc3NpbmcKLWF0IHRoZSBwb2ludCB3aGVyZSB0aGUgZmF1bHR5IG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkLgotVGhlIFxtb2R1bGV7ZnBlY3RsfSBtb2R1bGUKLWlzIGZvciB1c2UgaW4gdGhhdCBzaXR1YXRpb24uCi1JdCBwcm92aWRlcyBjb250cm9sIG92ZXIgZmxvYXRpbmcgcG9pbnQKLXVuaXRzIGZyb20gc2V2ZXJhbCBoYXJkd2FyZSBtYW51ZmFjdHVyZXJzLAotYWxsb3dpbmcgdGhlIHVzZXIgdG8gdHVybiBvbiB0aGUgZ2VuZXJhdGlvbgotb2YgXGNvbnN0YW50e1NJR0ZQRX0gd2hlbmV2ZXIgYW55IG9mIHRoZQotSUVFRS03NTQgZXhjZXB0aW9ucyBEaXZpc2lvbiBieSBaZXJvLCBPdmVyZmxvdywgb3IKLUludmFsaWQgT3BlcmF0aW9uIG9jY3Vycy4KLUluIHRhbmRlbSB3aXRoIGEgcGFpciBvZiB3cmFwcGVyIG1hY3JvcyB0aGF0IGFyZSBpbnNlcnRlZAotaW50byB0aGUgQyBjb2RlIGNvbXByaXNpbmcgeW91ciBweXRob24gc3lzdGVtLAotXGNvbnN0YW50e1NJR0ZQRX0gaXMgdHJhcHBlZCBhbmQgY29udmVydGVkIGludG8gdGhlIFB5dGhvbgotXGV4Y2VwdGlvbntGbG9hdGluZ1BvaW50RXJyb3J9IGV4Y2VwdGlvbi4KLQotVGhlIFxtb2R1bGV7ZnBlY3RsfSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhbmQKLW1heSByYWlzZSB0aGUgZ2l2ZW4gZXhjZXB0aW9uOgotCi1cYmVnaW57ZnVuY2Rlc2N9e3R1cm5vbl9zaWdmcGV9e30KLVR1cm4gb24gdGhlIGdlbmVyYXRpb24gb2YgXGNvbnN0YW50e1NJR0ZQRX0sCi1hbmQgc2V0IHVwIGFuIGFwcHJvcHJpYXRlIHNpZ25hbCBoYW5kbGVyLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt0dXJub2ZmX3NpZ2ZwZX17fQotUmVzZXQgZGVmYXVsdCBoYW5kbGluZyBvZiBmbG9hdGluZyBwb2ludCBleGNlcHRpb25zLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e0Zsb2F0aW5nUG9pbnRFcnJvcn0KLUFmdGVyIFxmdW5jdGlvbnt0dXJub25fc2lnZnBlKCl9IGhhcyBiZWVuIGV4ZWN1dGVkLAotYSBmbG9hdGluZyBwb2ludCBvcGVyYXRpb24gdGhhdCByYWlzZXMgb25lIG9mIHRoZQotSUVFRS03NTQgZXhjZXB0aW9ucwotRGl2aXNpb24gYnkgWmVybywgT3ZlcmZsb3csIG9yIEludmFsaWQgb3BlcmF0aW9uCi13aWxsIGluIHR1cm4gcmFpc2UgdGhpcyBzdGFuZGFyZCBQeXRob24gZXhjZXB0aW9uLgotXGVuZHtleGNkZXNjfQotCi0KLVxzdWJzZWN0aW9ue0V4YW1wbGUgXGxhYmVse2ZwZWN0bC1leGFtcGxlfX0KLQotVGhlIGZvbGxvd2luZyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gc3RhcnQgdXAgYW5kIHRlc3Qgb3BlcmF0aW9uIG9mCi10aGUgXG1vZHVsZXtmcGVjdGx9IG1vZHVsZS4KLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGltcG9ydCBmcGVjdGwKLT4+PiBpbXBvcnQgZnBldGVzdAotPj4+IGZwZWN0bC50dXJub25fc2lnZnBlKCkKLT4+PiBmcGV0ZXN0LnRlc3QoKQotb3ZlcmZsb3cgICAgICAgIFBBU1MKLUZsb2F0aW5nUG9pbnRFcnJvcjogT3ZlcmZsb3cKLQotZGl2IGJ5IDAgICAgICAgIFBBU1MKLUZsb2F0aW5nUG9pbnRFcnJvcjogRGl2aXNpb24gYnkgemVybwotICBbIG1vcmUgb3V0cHV0IGZyb20gdGVzdCBlbGlkZWQgXQotPj4+IGltcG9ydCBtYXRoCi0+Pj4gbWF0aC5leHAoMTAwMCkKLVRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLSAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwotRmxvYXRpbmdQb2ludEVycm9yOiBpbiBtYXRoXzEKLVxlbmR7dmVyYmF0aW19Ci0KLQotXHN1YnNlY3Rpb257TGltaXRhdGlvbnMgYW5kIG90aGVyIGNvbnNpZGVyYXRpb25zIFxsYWJlbHtmcGVjdGwtbGltaXRhdGlvbnN9fQotCi1TZXR0aW5nIHVwIGEgZ2l2ZW4gcHJvY2Vzc29yIHRvIHRyYXAgSUVFRS03NTQgZmxvYXRpbmcgcG9pbnQKLWVycm9ycyBjdXJyZW50bHkgcmVxdWlyZXMgY3VzdG9tIGNvZGUgb24gYSBwZXItYXJjaGl0ZWN0dXJlIGJhc2lzLgotWW91IG1heSBoYXZlIHRvIG1vZGlmeSBcbW9kdWxle2ZwZWN0bH0gdG8gY29udHJvbCB5b3VyIHBhcnRpY3VsYXIgaGFyZHdhcmUuCi0KLUNvbnZlcnNpb24gb2YgYW4gSUVFRS03NTQgZXhjZXB0aW9uIHRvIGEgUHl0aG9uIGV4Y2VwdGlvbiByZXF1aXJlcwotdGhhdCB0aGUgd3JhcHBlciBtYWNyb3MgXGNvZGV7UHlGUEVfU1RBUlRfUFJPVEVDVH0gYW5kCi1cY29kZXtQeUZQRV9FTkRfUFJPVEVDVH0gYmUgaW5zZXJ0ZWQgaW50byB5b3VyIGNvZGUgaW4gYW4gYXBwcm9wcmlhdGUKLWZhc2hpb24uICBQeXRob24gaXRzZWxmIGhhcyBiZWVuIG1vZGlmaWVkIHRvIHN1cHBvcnQgdGhlCi1cbW9kdWxle2ZwZWN0bH0gbW9kdWxlLCBidXQgbWFueSBvdGhlciBjb2RlcyBvZiBpbnRlcmVzdCB0byBudW1lcmljYWwKLWFuYWx5c3RzIGhhdmUgbm90LgotCi1UaGUgXG1vZHVsZXtmcGVjdGx9IG1vZHVsZSBpcyBub3QgdGhyZWFkLXNhZmUuCi0KLVxiZWdpbntzZWVhbHNvfQotICBcc2VldGV4dHtTb21lIGZpbGVzIGluIHRoZSBzb3VyY2UgZGlzdHJpYnV0aW9uIG1heSBiZSBpbnRlcmVzdGluZyBpbgotICAgICAgICAgICBsZWFybmluZyBtb3JlIGFib3V0IGhvdyB0aGlzIG1vZHVsZSBvcGVyYXRlcy4KLSAgICAgICAgICAgVGhlIGluY2x1ZGUgZmlsZSBcZmlsZXtJbmNsdWRlL3B5ZnBlLmh9IGRpc2N1c3NlcyB0aGUKLSAgICAgICAgICAgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtb2R1bGUgYXQgc29tZSBsZW5ndGguCi0gICAgICAgICAgIFxmaWxle01vZHVsZXMvZnBldGVzdG1vZHVsZS5jfSBnaXZlcyBzZXZlcmFsIGV4YW1wbGVzIG9mCi0gICAgICAgICAgIHVzZS4KLSAgICAgICAgICAgTWFueSBhZGRpdGlvbmFsIGV4YW1wbGVzIGNhbiBiZSBmb3VuZCBpbgotICAgICAgICAgICBcZmlsZXtPYmplY3RzL2Zsb2F0b2JqZWN0LmN9Ln0KLVxlbmR7c2VlYWxzb30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliZnBmb3JtYXQudGV4IGIvRG9jL2xpYi9saWJmcGZvcm1hdC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYTYyODIuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJmcGZvcm1hdC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle2ZwZm9ybWF0fSAtLS0KLSAgICAgICAgIEZsb2F0aW5nIHBvaW50IGNvbnZlcnNpb25zfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZnBmb3JtYXR9Ci1cc2VjdGlvbmF1dGhvcntNb3NoZSBaYWRrYX17bW9zaGV6QHphZGthLnNpdGUuY28uaWx9Ci1cbW9kdWxlc3lub3BzaXN7R2VuZXJhbCBmbG9hdGluZyBwb2ludCBmb3JtYXR0aW5nIGZ1bmN0aW9ucy59Ci0KLQotVGhlIFxtb2R1bGV7ZnBmb3JtYXR9IG1vZHVsZSBkZWZpbmVzIGZ1bmN0aW9ucyBmb3IgZGVhbGluZyB3aXRoCi1mbG9hdGluZyBwb2ludCBudW1iZXJzIHJlcHJlc2VudGF0aW9ucyBpbiAxMDBcJSBwdXJlCi1QeXRob24uIFxub3Rle1RoaXMgbW9kdWxlIGlzIHVubmVlZGVkOiBldmVyeXRoaW5nIGhlcmUgY291bGQKLWJlIGRvbmUgdmlhIHRoZSBcY29kZXtcJX0gc3RyaW5nIGludGVycG9sYXRpb24gb3BlcmF0b3IufQotCi1UaGUgXG1vZHVsZXtmcGZvcm1hdH0gbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYW5kIGFuCi1leGNlcHRpb246Ci0KLQotXGJlZ2lue2Z1bmNkZXNjfXtmaXh9e3gsIGRpZ3N9Ci1Gb3JtYXQgXHZhcnt4fSBhcyBcY29kZXtbLV1kZGQuZGRkfSB3aXRoIFx2YXJ7ZGlnc30gZGlnaXRzIGFmdGVyIHRoZQotcG9pbnQgYW5kIGF0IGxlYXN0IG9uZSBkaWdpdCBiZWZvcmUuCi1JZiBcY29kZXtcdmFye2RpZ3N9IDw9IDB9LCB0aGUgZGVjaW1hbCBwb2ludCBpcyBzdXBwcmVzc2VkLgotCi1cdmFye3h9IGNhbiBiZSBlaXRoZXIgYSBudW1iZXIgb3IgYSBzdHJpbmcgdGhhdCBsb29rcyBsaWtlCi1vbmUuIFx2YXJ7ZGlnc30gaXMgYW4gaW50ZWdlci4KLQotUmV0dXJuIHZhbHVlIGlzIGEgc3RyaW5nLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzY2l9e3gsIGRpZ3N9Ci1Gb3JtYXQgXHZhcnt4fSBhcyBcY29kZXtbLV1kLmRkZEVbKy1dZGRkfSB3aXRoIFx2YXJ7ZGlnc30gZGlnaXRzIGFmdGVyIHRoZSAKLXBvaW50IGFuZCBleGFjdGx5IG9uZSBkaWdpdCBiZWZvcmUuCi1JZiBcY29kZXtcdmFye2RpZ3N9IDw9IDB9LCBvbmUgZGlnaXQgaXMga2VwdCBhbmQgdGhlIHBvaW50IGlzIHN1cHByZXNzZWQuCi0KLVx2YXJ7eH0gY2FuIGJlIGVpdGhlciBhIHJlYWwgbnVtYmVyLCBvciBhIHN0cmluZyB0aGF0IGxvb2tzIGxpa2UKLW9uZS4gXHZhcntkaWdzfSBpcyBhbiBpbnRlZ2VyLgotCi1SZXR1cm4gdmFsdWUgaXMgYSBzdHJpbmcuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317Tm90QU51bWJlcn0KLUV4Y2VwdGlvbiByYWlzZWQgd2hlbiBhIHN0cmluZyBwYXNzZWQgdG8gXGZ1bmN0aW9ue2ZpeCgpfSBvcgotXGZ1bmN0aW9ue3NjaSgpfSBhcyB0aGUgXHZhcnt4fSBwYXJhbWV0ZXIgZG9lcyBub3QgbG9vayBsaWtlIGEgbnVtYmVyLgotVGhpcyBpcyBhIHN1YmNsYXNzIG9mIFxleGNlcHRpb257VmFsdWVFcnJvcn0gd2hlbiB0aGUgc3RhbmRhcmQKLWV4Y2VwdGlvbnMgYXJlIHN0cmluZ3MuICBUaGUgZXhjZXB0aW9uIHZhbHVlIGlzIHRoZSBpbXByb3Blcmx5Ci1mb3JtYXR0ZWQgc3RyaW5nIHRoYXQgY2F1c2VkIHRoZSBleGNlcHRpb24gdG8gYmUgcmFpc2VkLgotXGVuZHtleGNkZXNjfQotCi1FeGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gaW1wb3J0IGZwZm9ybWF0Ci0+Pj4gZnBmb3JtYXQuZml4KDEuMjMsIDEpCi0nMS4yJwotXGVuZHt2ZXJiYXRpbX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliZnRwbGliLnRleCBiL0RvYy9saWIvbGliZnRwbGliLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNlNWY5Yi4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmZ0cGxpYi50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtmdHBsaWJ9IC0tLQotICAgICAgICAgRlRQIHByb3RvY29sIGNsaWVudH0KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2Z0cGxpYn0KLVxtb2R1bGVzeW5vcHNpc3tGVFAgcHJvdG9jb2wgY2xpZW50IChyZXF1aXJlcyBzb2NrZXRzKS59Ci0KLVxpbmRleGlpe0ZUUH17cHJvdG9jb2x9Ci1caW5kZXh7RlRQIVxtb2R1bGV7ZnRwbGlifSAoc3RhbmRhcmQgbW9kdWxlKX0KLQotVGhpcyBtb2R1bGUgZGVmaW5lcyB0aGUgY2xhc3MgXGNsYXNze0ZUUH0gYW5kIGEgZmV3IHJlbGF0ZWQgaXRlbXMuCi1UaGUgXGNsYXNze0ZUUH0gY2xhc3MgaW1wbGVtZW50cyB0aGUgY2xpZW50IHNpZGUgb2YgdGhlIEZUUAotcHJvdG9jb2wuICBZb3UgY2FuIHVzZSB0aGlzIHRvIHdyaXRlIFB5dGhvbgotcHJvZ3JhbXMgdGhhdCBwZXJmb3JtIGEgdmFyaWV0eSBvZiBhdXRvbWF0ZWQgRlRQIGpvYnMsIHN1Y2ggYXMKLW1pcnJvcmluZyBvdGhlciBmdHAgc2VydmVycy4gIEl0IGlzIGFsc28gdXNlZCBieSB0aGUgbW9kdWxlCi1ccmVmbW9kdWxle3VybGxpYn0gdG8gaGFuZGxlIFVSTHMgdGhhdCB1c2UgRlRQLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24KLW9uIEZUUCAoRmlsZSBUcmFuc2ZlciBQcm90b2NvbCksIHNlZSBJbnRlcm5ldCBccmZjezk1OX0uCi0KLUhlcmUncyBhIHNhbXBsZSBzZXNzaW9uIHVzaW5nIHRoZSBcbW9kdWxle2Z0cGxpYn0gbW9kdWxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZnJvbSBmdHBsaWIgaW1wb3J0IEZUUAotPj4+IGZ0cCA9IEZUUCgnZnRwLmN3aS5ubCcpICAgIyBjb25uZWN0IHRvIGhvc3QsIGRlZmF1bHQgcG9ydAotPj4+IGZ0cC5sb2dpbigpICAgICAgICAgICAgICAgIyB1c2VyIGFub255bW91cywgcGFzc3dkIGFub255bW91c0AKLT4+PiBmdHAucmV0cmxpbmVzKCdMSVNUJykgICAgICMgbGlzdCBkaXJlY3RvcnkgY29udGVudHMKLXRvdGFsIDI0NDE4Ci1kcnd4cndzci14ICAgNSBmdHAtdXNyICBwZG1haW50ICAgICAxNTM2IE1hciAyMCAwOTo0OCAuCi1kci14ci1zcnd0IDEwNSBmdHAtdXNyICBwZG1haW50ICAgICAxNTM2IE1hciAyMSAxNDozMiAuLgotLXJ3LXItLXItLSAgIDEgZnRwLXVzciAgcGRtYWludCAgICAgNTMwNSBNYXIgMjAgMDk6NDggSU5ERVgKLSAuCi0gLgotIC4KLT4+PiBmdHAucmV0cmJpbmFyeSgnUkVUUiBSRUFETUUnLCBvcGVuKCdSRUFETUUnLCAnd2InKS53cml0ZSkKLScyMjYgVHJhbnNmZXIgY29tcGxldGUuJwotPj4+IGZ0cC5xdWl0KCkKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGl0ZW1zOgotCi1cYmVnaW57Y2xhc3NkZXNjfXtGVFB9e1xvcHRpb25hbHtob3N0XG9wdGlvbmFseywgdXNlclxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgIHBhc3N3ZFxvcHRpb25hbHssIGFjY3Rcb3B0aW9uYWx7LCB0aW1lb3V0fX19fX19Ci1SZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFxjbGFzc3tGVFB9IGNsYXNzLiAgV2hlbgotXHZhcntob3N0fSBpcyBnaXZlbiwgdGhlIG1ldGhvZCBjYWxsIFxjb2Rle2Nvbm5lY3QoXHZhcntob3N0fSl9IGlzCi1tYWRlLiAgV2hlbiBcdmFye3VzZXJ9IGlzIGdpdmVuLCBhZGRpdGlvbmFsbHkgdGhlIG1ldGhvZCBjYWxsCi1cY29kZXtsb2dpbihcdmFye3VzZXJ9LCBcdmFye3Bhc3N3ZH0sIFx2YXJ7YWNjdH0pfSBpcyBtYWRlICh3aGVyZQotXHZhcntwYXNzd2R9IGFuZCBcdmFye2FjY3R9IGRlZmF1bHQgdG8gdGhlIGVtcHR5IHN0cmluZyB3aGVuIG5vdCBnaXZlbikuCi1UaGUgb3B0aW9uYWwgXHZhcnt0aW1lb3V0fSBwYXJhbWV0ZXIgc3BlY2lmaWVzIGEgdGltZW91dCBpbiBzZWNvbmRzIGZvciB0aGUKLWNvbm5lY3Rpb24gYXR0ZW1wdCAoaWYgaXMgbm90IHNwZWNpZmllZCwgb3IgcGFzc2VkIGFzIE5vbmUsIHRoZSBnbG9iYWwKLWRlZmF1bHQgdGltZW91dCBzZXR0aW5nIHdpbGwgYmUgdXNlZCkuCi1cdmVyc2lvbmNoYW5nZWRbXHZhcnt0aW1lb3V0fSB3YXMgYWRkZWRdezIuNn0KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e2FsbF9lcnJvcnN9Ci1UaGUgc2V0IG9mIGFsbCBleGNlcHRpb25zIChhcyBhIHR1cGxlKSB0aGF0IG1ldGhvZHMgb2YgXGNsYXNze0ZUUH0KLWluc3RhbmNlcyBtYXkgcmFpc2UgYXMgYSByZXN1bHQgb2YgcHJvYmxlbXMgd2l0aCB0aGUgRlRQIGNvbm5lY3Rpb24KLShhcyBvcHBvc2VkIHRvIHByb2dyYW1taW5nIGVycm9ycyBtYWRlIGJ5IHRoZSBjYWxsZXIpLiAgVGhpcyBzZXQKLWluY2x1ZGVzIHRoZSBmb3VyIGV4Y2VwdGlvbnMgbGlzdGVkIGJlbG93IGFzIHdlbGwgYXMKLVxleGNlcHRpb257c29ja2V0LmVycm9yfSBhbmQgXGV4Y2VwdGlvbntJT0Vycm9yfS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtlcnJvcl9yZXBseX0KLUV4Y2VwdGlvbiByYWlzZWQgd2hlbiBhbiB1bmV4cGVjdGVkIHJlcGx5IGlzIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlci4KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e2Vycm9yX3RlbXB9Ci1FeGNlcHRpb24gcmFpc2VkIHdoZW4gYW4gZXJyb3IgY29kZSBpbiB0aGUgcmFuZ2UgNDAwLS00OTkgaXMgcmVjZWl2ZWQuCi1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtlcnJvcl9wZXJtfQotRXhjZXB0aW9uIHJhaXNlZCB3aGVuIGFuIGVycm9yIGNvZGUgaW4gdGhlIHJhbmdlIDUwMC0tNTk5IGlzIHJlY2VpdmVkLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317ZXJyb3JfcHJvdG99Ci1FeGNlcHRpb24gcmFpc2VkIHdoZW4gYSByZXBseSBpcyByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXIgdGhhdCBkb2VzCi1ub3QgYmVnaW4gd2l0aCBhIGRpZ2l0IGluIHRoZSByYW5nZSAxLS01LgotXGVuZHtleGNkZXNjfQotCi0KLVxiZWdpbntzZWVhbHNvfQotICBcc2VlbW9kdWxle25ldHJjfXtQYXJzZXIgZm9yIHRoZSBcZmlsZXsubmV0cmN9IGZpbGUgZm9ybWF0LiAgVGhlIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgXGZpbGV7Lm5ldHJjfSBpcyB0eXBpY2FsbHkgdXNlZCBieSBGVFAgY2xpZW50cyB0bwotICAgICAgICAgICAgICAgICAgICBsb2FkIHVzZXIgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24gYmVmb3JlIHByb21wdGluZwotICAgICAgICAgICAgICAgICAgICB0aGUgdXNlci59Ci0gIFxzZWV0ZXh0e1RoZSBmaWxlIFxmaWxle1Rvb2xzL3NjcmlwdHMvZnRwbWlycm9yLnB5fVxpbmRleHtmdHBtaXJyb3IucHl9Ci0gICAgICAgICAgIGluIHRoZSBQeXRob24gc291cmNlIGRpc3RyaWJ1dGlvbiBpcyBhIHNjcmlwdCB0aGF0IGNhbiBtaXJyb3IKLSAgICAgICAgICAgRlRQIHNpdGVzLCBvciBwb3J0aW9ucyB0aGVyZW9mLCB1c2luZyB0aGUgXG1vZHVsZXtmdHBsaWJ9IG1vZHVsZS4KLSAgICAgICAgICAgSXQgY2FuIGJlIHVzZWQgYXMgYW4gZXh0ZW5kZWQgZXhhbXBsZSB0aGF0IGFwcGxpZXMgdGhpcyBtb2R1bGUufQotXGVuZHtzZWVhbHNvfQotCi0KLVxzdWJzZWN0aW9ue0ZUUCBPYmplY3RzIFxsYWJlbHtmdHAtb2JqZWN0c319Ci0KLVNldmVyYWwgbWV0aG9kcyBhcmUgYXZhaWxhYmxlIGluIHR3byBmbGF2b3JzOiBvbmUgZm9yIGhhbmRsaW5nIHRleHQKLWZpbGVzIGFuZCBhbm90aGVyIGZvciBiaW5hcnkgZmlsZXMuICBUaGVzZSBhcmUgbmFtZWQgZm9yIHRoZSBjb21tYW5kCi13aGljaCBpcyB1c2VkIGZvbGxvd2VkIGJ5IFxzYW1we2xpbmVzfSBmb3IgdGhlIHRleHQgdmVyc2lvbiBvcgotXHNhbXB7YmluYXJ5fSBmb3IgdGhlIGJpbmFyeSB2ZXJzaW9uLgotCi1cY2xhc3N7RlRQfSBpbnN0YW5jZXMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtGVFBde3NldF9kZWJ1Z2xldmVsfXtsZXZlbH0KLVNldCB0aGUgaW5zdGFuY2UncyBkZWJ1Z2dpbmcgbGV2ZWwuICBUaGlzIGNvbnRyb2xzIHRoZSBhbW91bnQgb2YKLWRlYnVnZ2luZyBvdXRwdXQgcHJpbnRlZC4gIFRoZSBkZWZhdWx0LCBcY29kZXswfSwgcHJvZHVjZXMgbm8KLWRlYnVnZ2luZyBvdXRwdXQuICBBIHZhbHVlIG9mIFxjb2RlezF9IHByb2R1Y2VzIGEgbW9kZXJhdGUgYW1vdW50IG9mCi1kZWJ1Z2dpbmcgb3V0cHV0LCBnZW5lcmFsbHkgYSBzaW5nbGUgbGluZSBwZXIgcmVxdWVzdC4gIEEgdmFsdWUgb2YKLVxjb2RlezJ9IG9yIGhpZ2hlciBwcm9kdWNlcyB0aGUgbWF4aW11bSBhbW91bnQgb2YgZGVidWdnaW5nIG91dHB1dCwKLWxvZ2dpbmcgZWFjaCBsaW5lIHNlbnQgYW5kIHJlY2VpdmVkIG9uIHRoZSBjb250cm9sIGNvbm5lY3Rpb24uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtGVFBde2Nvbm5lY3R9e2hvc3Rcb3B0aW9uYWx7LCBwb3J0XG9wdGlvbmFseywgdGltZW91dH19fQotQ29ubmVjdCB0byB0aGUgZ2l2ZW4gaG9zdCBhbmQgcG9ydC4gIFRoZSBkZWZhdWx0IHBvcnQgbnVtYmVyIGlzIFxjb2RlezIxfSwgYXMKLXNwZWNpZmllZCBieSB0aGUgRlRQIHByb3RvY29sIHNwZWNpZmljYXRpb24uICBJdCBpcyByYXJlbHkgbmVlZGVkIHRvCi1zcGVjaWZ5IGEgZGlmZmVyZW50IHBvcnQgbnVtYmVyLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIG9ubHkKLW9uY2UgZm9yIGVhY2ggaW5zdGFuY2U7IGl0IHNob3VsZCBub3QgYmUgY2FsbGVkIGF0IGFsbCBpZiBhIGhvc3Qgd2FzCi1naXZlbiB3aGVuIHRoZSBpbnN0YW5jZSB3YXMgY3JlYXRlZC4gIEFsbCBvdGhlciBtZXRob2RzIGNhbiBvbmx5IGJlCi11c2VkIGFmdGVyIGEgY29ubmVjdGlvbiBoYXMgYmVlbiBtYWRlLgotCi1UaGUgb3B0aW9uYWwgXHZhcnt0aW1lb3V0fSBwYXJhbWV0ZXIgc3BlY2lmaWVzIGEgdGltZW91dCBpbiBzZWNvbmRzIGZvcgotdGhlIGNvbm5lY3Rpb24gYXR0ZW1wdC4gSWYgaXMgbm90IHNwZWNpZmllZCwgb3IgcGFzc2VkIGFzIE5vbmUsIHRoZSAKLW9iamVjdCB0aW1lb3V0IGlzIHVzZWQgKHRoZSB0aW1lb3V0IHRoYXQgeW91IHBhc3NlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhlCi1jbGFzcyk7IGlmIHRoZSBvYmplY3QgdGltZW91dCBpcyBhbHNvIE5vbmUsIHRoZSBnbG9iYWwgZGVmYXVsdCB0aW1lb3V0IAotc2V0dGluZyB3aWxsIGJlIHVzZWQuCi0KLVx2ZXJzaW9uY2hhbmdlZFtcdmFye3RpbWVvdXR9IHdhcyBhZGRlZF17Mi42fQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRlRQXXtnZXR3ZWxjb21lfXt9Ci1SZXR1cm4gdGhlIHdlbGNvbWUgbWVzc2FnZSBzZW50IGJ5IHRoZSBzZXJ2ZXIgaW4gcmVwbHkgdG8gdGhlIGluaXRpYWwKLWNvbm5lY3Rpb24uICAoVGhpcyBtZXNzYWdlIHNvbWV0aW1lcyBjb250YWlucyBkaXNjbGFpbWVycyBvciBoZWxwCi1pbmZvcm1hdGlvbiB0aGF0IG1heSBiZSByZWxldmFudCB0byB0aGUgdXNlci4pCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtGVFBde2xvZ2lufXtcb3B0aW9uYWx7dXNlclxvcHRpb25hbHssIHBhc3N3ZFxvcHRpb25hbHssIGFjY3R9fX19Ci1Mb2cgaW4gYXMgdGhlIGdpdmVuIFx2YXJ7dXNlcn0uICBUaGUgXHZhcntwYXNzd2R9IGFuZCBcdmFye2FjY3R9Ci1wYXJhbWV0ZXJzIGFyZSBvcHRpb25hbCBhbmQgZGVmYXVsdCB0byB0aGUgZW1wdHkgc3RyaW5nLiAgSWYgbm8KLVx2YXJ7dXNlcn0gaXMgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBcY29kZXsnYW5vbnltb3VzJ30uICBJZgotXHZhcnt1c2VyfSBpcyBcY29kZXsnYW5vbnltb3VzJ30sIHRoZSBkZWZhdWx0IFx2YXJ7cGFzc3dkfSBpcwotXGNvZGV7J2Fub255bW91c0AnfS4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBvbmx5Ci1vbmNlIGZvciBlYWNoIGluc3RhbmNlLCBhZnRlciBhIGNvbm5lY3Rpb24gaGFzIGJlZW4gZXN0YWJsaXNoZWQ7IGl0Ci1zaG91bGQgbm90IGJlIGNhbGxlZCBhdCBhbGwgaWYgYSBob3N0IGFuZCB1c2VyIHdlcmUgZ2l2ZW4gd2hlbiB0aGUKLWluc3RhbmNlIHdhcyBjcmVhdGVkLiAgTW9zdCBGVFAgY29tbWFuZHMgYXJlIG9ubHkgYWxsb3dlZCBhZnRlciB0aGUKLWNsaWVudCBoYXMgbG9nZ2VkIGluLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRlRQXXthYm9ydH17fQotQWJvcnQgYSBmaWxlIHRyYW5zZmVyIHRoYXQgaXMgaW4gcHJvZ3Jlc3MuICBVc2luZyB0aGlzIGRvZXMgbm90IGFsd2F5cwotd29yaywgYnV0IGl0J3Mgd29ydGggYSB0cnkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtGVFBde3NlbmRjbWR9e2NvbW1hbmR9Ci1TZW5kIGEgc2ltcGxlIGNvbW1hbmQgc3RyaW5nIHRvIHRoZSBzZXJ2ZXIgYW5kIHJldHVybiB0aGUgcmVzcG9uc2UKLXN0cmluZy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0ZUUF17dm9pZGNtZH17Y29tbWFuZH0KLVNlbmQgYSBzaW1wbGUgY29tbWFuZCBzdHJpbmcgdG8gdGhlIHNlcnZlciBhbmQgaGFuZGxlIHRoZSByZXNwb25zZS4KLVJldHVybiBub3RoaW5nIGlmIGEgcmVzcG9uc2UgY29kZSBpbiB0aGUgcmFuZ2UgMjAwLS0yOTkgaXMgcmVjZWl2ZWQuCi1SYWlzZSBhbiBleGNlcHRpb24gb3RoZXJ3aXNlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRlRQXXtyZXRyYmluYXJ5fXtjb21tYW5kLAotICAgIGNhbGxiYWNrXG9wdGlvbmFseywgbWF4YmxvY2tzaXplXG9wdGlvbmFseywgcmVzdH19fQotUmV0cmlldmUgYSBmaWxlIGluIGJpbmFyeSB0cmFuc2ZlciBtb2RlLiAgXHZhcntjb21tYW5kfSBzaG91bGQgYmUgYW4KLWFwcHJvcHJpYXRlIFxzYW1we1JFVFJ9IGNvbW1hbmQ6IFxjb2RleydSRVRSIFx2YXJ7ZmlsZW5hbWV9J30uCi1UaGUgXHZhcntjYWxsYmFja30gZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBlYWNoIGJsb2NrIG9mIGRhdGEgcmVjZWl2ZWQsCi13aXRoIGEgc2luZ2xlIHN0cmluZyBhcmd1bWVudCBnaXZpbmcgdGhlIGRhdGEgYmxvY2suCi1UaGUgb3B0aW9uYWwgXHZhcnttYXhibG9ja3NpemV9IGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgbWF4aW11bSBjaHVuayBzaXplIHRvCi1yZWFkIG9uIHRoZSBsb3ctbGV2ZWwgc29ja2V0IG9iamVjdCBjcmVhdGVkIHRvIGRvIHRoZSBhY3R1YWwgdHJhbnNmZXIKLSh3aGljaCB3aWxsIGFsc28gYmUgdGhlIGxhcmdlc3Qgc2l6ZSBvZiB0aGUgZGF0YSBibG9ja3MgcGFzc2VkIHRvCi1cdmFye2NhbGxiYWNrfSkuICBBIHJlYXNvbmFibGUgZGVmYXVsdCBpcyBjaG9zZW4uIFx2YXJ7cmVzdH0gbWVhbnMgdGhlCi1zYW1lIHRoaW5nIGFzIGluIHRoZSBcbWV0aG9ke3RyYW5zZmVyY21kKCl9IG1ldGhvZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0ZUUF17cmV0cmxpbmVzfXtjb21tYW5kXG9wdGlvbmFseywgY2FsbGJhY2t9fQotUmV0cmlldmUgYSBmaWxlIG9yIGRpcmVjdG9yeSBsaXN0aW5nIGluIFxBU0NJSXt9IHRyYW5zZmVyIG1vZGUuCi1cdmFye2NvbW1hbmR9IHNob3VsZCBiZSBhbiBhcHByb3ByaWF0ZSBcc2FtcHtSRVRSfSBjb21tYW5kIChzZWUKLVxtZXRob2R7cmV0cmJpbmFyeSgpfSkgb3IgYSBcc2FtcHtMSVNUfSBjb21tYW5kICh1c3VhbGx5IGp1c3QgdGhlIHN0cmluZwotXGNvZGV7J0xJU1QnfSkuICBUaGUgXHZhcntjYWxsYmFja30gZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBlYWNoIGxpbmUsCi13aXRoIHRoZSB0cmFpbGluZyBDUkxGIHN0cmlwcGVkLiAgVGhlIGRlZmF1bHQgXHZhcntjYWxsYmFja30gcHJpbnRzCi10aGUgbGluZSB0byBcY29kZXtzeXMuc3Rkb3V0fS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0ZUUF17c2V0X3Bhc3Z9e2Jvb2xlYW59Ci1FbmFibGUgYGBwYXNzaXZlJycgbW9kZSBpZiBcdmFye2Jvb2xlYW59IGlzIHRydWUsIG90aGVyIGRpc2FibGUKLXBhc3NpdmUgbW9kZS4gIChJbiBQeXRob24gMi4wIGFuZCBiZWZvcmUsIHBhc3NpdmUgbW9kZSB3YXMgb2ZmIGJ5Ci1kZWZhdWx0OyBpbiBQeXRob24gMi4xIGFuZCBsYXRlciwgaXQgaXMgb24gYnkgZGVmYXVsdC4pCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtGVFBde3N0b3JiaW5hcnl9e2NvbW1hbmQsIGZpbGVcb3B0aW9uYWx7LCBibG9ja3NpemV9fQotU3RvcmUgYSBmaWxlIGluIGJpbmFyeSB0cmFuc2ZlciBtb2RlLiAgXHZhcntjb21tYW5kfSBzaG91bGQgYmUgYW4KLWFwcHJvcHJpYXRlIFxzYW1we1NUT1J9IGNvbW1hbmQ6IFxjb2RleyJTVE9SIFx2YXJ7ZmlsZW5hbWV9In0uCi1cdmFye2ZpbGV9IGlzIGFuIG9wZW4gZmlsZSBvYmplY3Qgd2hpY2ggaXMgcmVhZCB1bnRpbCBcRU9Ge30gdXNpbmcgaXRzCi1cbWV0aG9ke3JlYWQoKX0gbWV0aG9kIGluIGJsb2NrcyBvZiBzaXplIFx2YXJ7YmxvY2tzaXplfSB0byBwcm92aWRlIHRoZQotZGF0YSB0byBiZSBzdG9yZWQuICBUaGUgXHZhcntibG9ja3NpemV9IGFyZ3VtZW50IGRlZmF1bHRzIHRvIDgxOTIuCi1cdmVyc2lvbmNoYW5nZWRbZGVmYXVsdCBmb3IgXHZhcntibG9ja3NpemV9IGFkZGVkXXsyLjF9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtGVFBde3N0b3JsaW5lc317Y29tbWFuZCwgZmlsZX0KLVN0b3JlIGEgZmlsZSBpbiBcQVNDSUl7fSB0cmFuc2ZlciBtb2RlLiAgXHZhcntjb21tYW5kfSBzaG91bGQgYmUgYW4KLWFwcHJvcHJpYXRlIFxzYW1we1NUT1J9IGNvbW1hbmQgKHNlZSBcbWV0aG9ke3N0b3JiaW5hcnkoKX0pLiAgTGluZXMgYXJlCi1yZWFkIHVudGlsIFxFT0Z7fSBmcm9tIHRoZSBvcGVuIGZpbGUgb2JqZWN0IFx2YXJ7ZmlsZX0gdXNpbmcgaXRzCi1cbWV0aG9ke3JlYWRsaW5lKCl9IG1ldGhvZCB0byBwcm92aWRlIHRoZSBkYXRhIHRvIGJlIHN0b3JlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0ZUUF17dHJhbnNmZXJjbWR9e2NtZFxvcHRpb25hbHssIHJlc3R9fQotSW5pdGlhdGUgYSB0cmFuc2ZlciBvdmVyIHRoZSBkYXRhIGNvbm5lY3Rpb24uICBJZiB0aGUgdHJhbnNmZXIgaXMKLWFjdGl2ZSwgc2VuZCBhIFxzYW1we0VQUlR9IG9yICBcc2FtcHtQT1JUfSBjb21tYW5kIGFuZCB0aGUgdHJhbnNmZXIgY29tbWFuZCBzcGVjaWZpZWQKLWJ5IFx2YXJ7Y21kfSwgYW5kIGFjY2VwdCB0aGUgY29ubmVjdGlvbi4gIElmIHRoZSBzZXJ2ZXIgaXMgcGFzc2l2ZSwKLXNlbmQgYSBcc2FtcHtFUFNWfSBvciBcc2FtcHtQQVNWfSBjb21tYW5kLCBjb25uZWN0IHRvIGl0LCBhbmQgc3RhcnQgdGhlIHRyYW5zZmVyCi1jb21tYW5kLiAgRWl0aGVyIHdheSwgcmV0dXJuIHRoZSBzb2NrZXQgZm9yIHRoZSBjb25uZWN0aW9uLgotCi1JZiBvcHRpb25hbCBcdmFye3Jlc3R9IGlzIGdpdmVuLCBhIFxzYW1we1JFU1R9IGNvbW1hbmQgaXMKLXNlbnQgdG8gdGhlIHNlcnZlciwgcGFzc2luZyBcdmFye3Jlc3R9IGFzIGFuIGFyZ3VtZW50LiAgXHZhcntyZXN0fSBpcwotdXN1YWxseSBhIGJ5dGUgb2Zmc2V0IGludG8gdGhlIHJlcXVlc3RlZCBmaWxlLCB0ZWxsaW5nIHRoZSBzZXJ2ZXIgdG8KLXJlc3RhcnQgc2VuZGluZyB0aGUgZmlsZSdzIGJ5dGVzIGF0IHRoZSByZXF1ZXN0ZWQgb2Zmc2V0LCBza2lwcGluZwotb3ZlciB0aGUgaW5pdGlhbCBieXRlcy4gIE5vdGUgaG93ZXZlciB0aGF0IFJGQwotOTU5IHJlcXVpcmVzIG9ubHkgdGhhdCBcdmFye3Jlc3R9IGJlIGEgc3RyaW5nIGNvbnRhaW5pbmcgY2hhcmFjdGVycwotaW4gdGhlIHByaW50YWJsZSByYW5nZSBmcm9tIEFTQ0lJIGNvZGUgMzMgdG8gQVNDSUkgY29kZSAxMjYuICBUaGUKLVxtZXRob2R7dHJhbnNmZXJjbWQoKX0gbWV0aG9kLCB0aGVyZWZvcmUsIGNvbnZlcnRzCi1cdmFye3Jlc3R9IHRvIGEgc3RyaW5nLCBidXQgbm8gY2hlY2sgaXMKLXBlcmZvcm1lZCBvbiB0aGUgc3RyaW5nJ3MgY29udGVudHMuICBJZiB0aGUgc2VydmVyIGRvZXMKLW5vdCByZWNvZ25pemUgdGhlIFxzYW1we1JFU1R9IGNvbW1hbmQsIGFuCi1cZXhjZXB0aW9ue2Vycm9yX3JlcGx5fSBleGNlcHRpb24gd2lsbCBiZSByYWlzZWQuICBJZiB0aGlzIGhhcHBlbnMsCi1zaW1wbHkgY2FsbCBcbWV0aG9ke3RyYW5zZmVyY21kKCl9IHdpdGhvdXQgYSBcdmFye3Jlc3R9IGFyZ3VtZW50LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRlRQXXtudHJhbnNmZXJjbWR9e2NtZFxvcHRpb25hbHssIHJlc3R9fQotTGlrZSBcbWV0aG9ke3RyYW5zZmVyY21kKCl9LCBidXQgcmV0dXJucyBhIHR1cGxlIG9mIHRoZSBkYXRhCi1jb25uZWN0aW9uIGFuZCB0aGUgZXhwZWN0ZWQgc2l6ZSBvZiB0aGUgZGF0YS4gIElmIHRoZSBleHBlY3RlZCBzaXplCi1jb3VsZCBub3QgYmUgY29tcHV0ZWQsIFxjb2Rle05vbmV9IHdpbGwgYmUgcmV0dXJuZWQgYXMgdGhlIGV4cGVjdGVkCi1zaXplLiAgXHZhcntjbWR9IGFuZCBcdmFye3Jlc3R9IG1lYW5zIHRoZSBzYW1lIHRoaW5nIGFzIGluCi1cbWV0aG9ke3RyYW5zZmVyY21kKCl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRlRQXXtubHN0fXthcmd1bWVudFxvcHRpb25hbHssIFxsZG90c319Ci1SZXR1cm4gYSBsaXN0IG9mIGZpbGVzIGFzIHJldHVybmVkIGJ5IHRoZSBcc2FtcHtOTFNUfSBjb21tYW5kLiAgVGhlCi1vcHRpb25hbCBcdmFye2FyZ3VtZW50fSBpcyBhIGRpcmVjdG9yeSB0byBsaXN0IChkZWZhdWx0IGlzIHRoZSBjdXJyZW50Ci1zZXJ2ZXIgZGlyZWN0b3J5KS4gIE11bHRpcGxlIGFyZ3VtZW50cyBjYW4gYmUgdXNlZCB0byBwYXNzCi1ub24tc3RhbmRhcmQgb3B0aW9ucyB0byB0aGUgXHNhbXB7TkxTVH0gY29tbWFuZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0ZUUF17ZGlyfXthcmd1bWVudFxvcHRpb25hbHssIFxsZG90c319Ci1Qcm9kdWNlIGEgZGlyZWN0b3J5IGxpc3RpbmcgYXMgcmV0dXJuZWQgYnkgdGhlIFxzYW1we0xJU1R9IGNvbW1hbmQsCi1wcmludGluZyBpdCB0byBzdGFuZGFyZCBvdXRwdXQuICBUaGUgb3B0aW9uYWwgXHZhcnthcmd1bWVudH0gaXMgYQotZGlyZWN0b3J5IHRvIGxpc3QgKGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgc2VydmVyIGRpcmVjdG9yeSkuICBNdWx0aXBsZQotYXJndW1lbnRzIGNhbiBiZSB1c2VkIHRvIHBhc3Mgbm9uLXN0YW5kYXJkIG9wdGlvbnMgdG8gdGhlIFxzYW1we0xJU1R9Ci1jb21tYW5kLiAgSWYgdGhlIGxhc3QgYXJndW1lbnQgaXMgYSBmdW5jdGlvbiwgaXQgaXMgdXNlZCBhcyBhCi1cdmFye2NhbGxiYWNrfSBmdW5jdGlvbiBhcyBmb3IgXG1ldGhvZHtyZXRybGluZXMoKX07IHRoZSBkZWZhdWx0Ci1wcmludHMgdG8gXGNvZGV7c3lzLnN0ZG91dH0uICBUaGlzIG1ldGhvZCByZXR1cm5zIFxjb2Rle05vbmV9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRlRQXXtyZW5hbWV9e2Zyb21uYW1lLCB0b25hbWV9Ci1SZW5hbWUgZmlsZSBcdmFye2Zyb21uYW1lfSBvbiB0aGUgc2VydmVyIHRvIFx2YXJ7dG9uYW1lfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0ZUUF17ZGVsZXRlfXtmaWxlbmFtZX0KLVJlbW92ZSB0aGUgZmlsZSBuYW1lZCBcdmFye2ZpbGVuYW1lfSBmcm9tIHRoZSBzZXJ2ZXIuICBJZiBzdWNjZXNzZnVsLAotcmV0dXJucyB0aGUgdGV4dCBvZiB0aGUgcmVzcG9uc2UsIG90aGVyd2lzZSByYWlzZXMKLVxleGNlcHRpb257ZXJyb3JfcGVybX0gb24gcGVybWlzc2lvbiBlcnJvcnMgb3IKLVxleGNlcHRpb257ZXJyb3JfcmVwbHl9IG9uIG90aGVyIGVycm9ycy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0ZUUF17Y3dkfXtwYXRobmFtZX0KLVNldCB0aGUgY3VycmVudCBkaXJlY3Rvcnkgb24gdGhlIHNlcnZlci4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0ZUUF17bWtkfXtwYXRobmFtZX0KLUNyZWF0ZSBhIG5ldyBkaXJlY3Rvcnkgb24gdGhlIHNlcnZlci4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0ZUUF17cHdkfXt9Ci1SZXR1cm4gdGhlIHBhdGhuYW1lIG9mIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBvbiB0aGUgc2VydmVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRlRQXXtybWR9e2Rpcm5hbWV9Ci1SZW1vdmUgdGhlIGRpcmVjdG9yeSBuYW1lZCBcdmFye2Rpcm5hbWV9IG9uIHRoZSBzZXJ2ZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtGVFBde3NpemV9e2ZpbGVuYW1lfQotUmVxdWVzdCB0aGUgc2l6ZSBvZiB0aGUgZmlsZSBuYW1lZCBcdmFye2ZpbGVuYW1lfSBvbiB0aGUgc2VydmVyLiAgT24KLXN1Y2Nlc3MsIHRoZSBzaXplIG9mIHRoZSBmaWxlIGlzIHJldHVybmVkIGFzIGFuIGludGVnZXIsIG90aGVyd2lzZQotXGNvZGV7Tm9uZX0gaXMgcmV0dXJuZWQuICBOb3RlIHRoYXQgdGhlIFxzYW1we1NJWkV9IGNvbW1hbmQgaXMgbm90IAotc3RhbmRhcmRpemVkLCBidXQgaXMgc3VwcG9ydGVkIGJ5IG1hbnkgY29tbW9uIHNlcnZlciBpbXBsZW1lbnRhdGlvbnMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtGVFBde3F1aXR9e30KLVNlbmQgYSBcc2FtcHtRVUlUfSBjb21tYW5kIHRvIHRoZSBzZXJ2ZXIgYW5kIGNsb3NlIHRoZSBjb25uZWN0aW9uLgotVGhpcyBpcyB0aGUgYGBwb2xpdGUnJyB3YXkgdG8gY2xvc2UgYSBjb25uZWN0aW9uLCBidXQgaXQgbWF5IHJhaXNlIGFuCi1leGNlcHRpb24gb2YgdGhlIHNlcnZlciByZXBvbmRzIHdpdGggYW4gZXJyb3IgdG8gdGhlCi1cc2FtcHtRVUlUfSBjb21tYW5kLiAgVGhpcyBpbXBsaWVzIGEgY2FsbCB0byB0aGUgXG1ldGhvZHtjbG9zZSgpfQotbWV0aG9kIHdoaWNoIHJlbmRlcnMgdGhlIFxjbGFzc3tGVFB9IGluc3RhbmNlIHVzZWxlc3MgZm9yIHN1YnNlcXVlbnQKLWNhbGxzIChzZWUgYmVsb3cpLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRlRQXXtjbG9zZX17fQotQ2xvc2UgdGhlIGNvbm5lY3Rpb24gdW5pbGF0ZXJhbGx5LiAgVGhpcyBzaG91bGQgbm90IGJlIGFwcGxpZWQgdG8gYW4KLWFscmVhZHkgY2xvc2VkIGNvbm5lY3Rpb24gc3VjaCBhcyBhZnRlciBhIHN1Y2Nlc3NmdWwgY2FsbCB0bwotXG1ldGhvZHtxdWl0KCl9LiAgQWZ0ZXIgdGhpcyBjYWxsIHRoZSBcY2xhc3N7RlRQfSBpbnN0YW5jZSBzaG91bGQgbm90Ci1iZSB1c2VkIGFueSBtb3JlIChhZnRlciBhIGNhbGwgdG8gXG1ldGhvZHtjbG9zZSgpfSBvcgotXG1ldGhvZHtxdWl0KCl9IHlvdSBjYW5ub3QgcmVvcGVuIHRoZSBjb25uZWN0aW9uIGJ5IGlzc3VpbmcgYW5vdGhlcgotXG1ldGhvZHtsb2dpbigpfSBtZXRob2QpLgotXGVuZHttZXRob2RkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJmdW5jcy50ZXggYi9Eb2MvbGliL2xpYmZ1bmNzLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZjYzRmNC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmZ1bmNzLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDExMjUgKzAsMCBAQAotXHNlY3Rpb257QnVpbHQtaW4gRnVuY3Rpb25zIFxsYWJlbHtidWlsdC1pbi1mdW5jc319Ci0KLVRoZSBQeXRob24gaW50ZXJwcmV0ZXIgaGFzIGEgbnVtYmVyIG9mIGZ1bmN0aW9ucyBidWlsdCBpbnRvIGl0IHRoYXQKLWFyZSBhbHdheXMgYXZhaWxhYmxlLiAgVGhleSBhcmUgbGlzdGVkIGhlcmUgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLgotCi0KLVxzZXRpbmRleHN1Yml0ZW17KGJ1aWx0LWluIGZ1bmN0aW9uKX0KLQotXGJlZ2lue2Z1bmNkZXNjfXtfX2ltcG9ydF9ffXtuYW1lXG9wdGlvbmFseywgZ2xvYmFsc1xvcHRpb25hbHssIGxvY2Fsc1xvcHRpb25hbHssIGZyb21saXN0XG9wdGlvbmFseywgbGV2ZWx9fX19fQotICBUaGlzIGZ1bmN0aW9uIGlzIGludm9rZWQgYnkgdGhlIFxrZXl3b3Jke2ltcG9ydH1cc3RpbmRleHtpbXBvcnR9Ci0gIHN0YXRlbWVudC4gIEl0IG1haW5seSBleGlzdHMgc28gdGhhdCB5b3UgY2FuIHJlcGxhY2UgaXQgd2l0aCBhbm90aGVyCi0gIGZ1bmN0aW9uIHRoYXQgaGFzIGEgY29tcGF0aWJsZSBpbnRlcmZhY2UsIGluIG9yZGVyIHRvIGNoYW5nZSB0aGUKLSAgc2VtYW50aWNzIG9mIHRoZSBca2V5d29yZHtpbXBvcnR9IHN0YXRlbWVudC4gIEZvciBleGFtcGxlcyBvZiB3aHkKLSAgYW5kIGhvdyB5b3Ugd291bGQgZG8gdGhpcywgc2VlIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IG1vZHVsZXMKLSAgXG1vZHVsZXtpaG9va3N9XHJlZnN0bW9kaW5kZXh7aWhvb2tzfSBhbmQKLSAgXHJlZm1vZHVsZXtyZXhlY31ccmVmc3Rtb2RpbmRleHtyZXhlY30uICBTZWUgYWxzbyB0aGUgYnVpbHQtaW4KLSAgbW9kdWxlIFxyZWZtb2R1bGV7aW1wfVxyZWZiaW1vZGluZGV4e2ltcH0sIHdoaWNoIGRlZmluZXMgc29tZSB1c2VmdWwKLSAgb3BlcmF0aW9ucyBvdXQgb2Ygd2hpY2ggeW91IGNhbiBidWlsZCB5b3VyIG93bgotICBcZnVuY3Rpb257X19pbXBvcnRfXygpfSBmdW5jdGlvbi4KLQotICBGb3IgZXhhbXBsZSwgdGhlIHN0YXRlbWVudCBcc2FtcHtpbXBvcnQgc3BhbX0gcmVzdWx0cyBpbiB0aGUKLSAgZm9sbG93aW5nIGNhbGw6IFxjb2Rle19faW1wb3J0X18oJ3NwYW0nLH0gXGNvZGV7Z2xvYmFscygpLH0KLSAgXGNvZGV7bG9jYWxzKCksIFtdLCAtMSl9OyB0aGUgc3RhdGVtZW50IFxzYW1we2Zyb20gc3BhbS5oYW0gaW1wb3J0IGVnZ3N9Ci0gIHJlc3VsdHMgaW4gXHNhbXB7X19pbXBvcnRfXygnc3BhbS5oYW0nLCBnbG9iYWxzKCksIGxvY2FscygpLAotICBbJ2VnZ3MnXSwgLTEpfS4gIE5vdGUgdGhhdCBldmVuIHRob3VnaCBcY29kZXtsb2NhbHMoKX0gYW5kCi0gIFxjb2Rle1snZWdncyddfSBhcmUgcGFzc2VkIGluIGFzIGFyZ3VtZW50cywgdGhlCi0gIFxmdW5jdGlvbntfX2ltcG9ydF9fKCl9IGZ1bmN0aW9uIGRvZXMgbm90IHNldCB0aGUgbG9jYWwgdmFyaWFibGUKLSAgbmFtZWQgXGNvZGV7ZWdnc307IHRoaXMgaXMgZG9uZSBieSBzdWJzZXF1ZW50IGNvZGUgdGhhdCBpcyBnZW5lcmF0ZWQKLSAgZm9yIHRoZSBpbXBvcnQgc3RhdGVtZW50LiAgKEluIGZhY3QsIHRoZSBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbgotICBkb2VzIG5vdCB1c2UgaXRzIFx2YXJ7bG9jYWxzfSBhcmd1bWVudCBhdCBhbGwsIGFuZCB1c2VzIGl0cwotICBcdmFye2dsb2JhbHN9IG9ubHkgdG8gZGV0ZXJtaW5lIHRoZSBwYWNrYWdlIGNvbnRleHQgb2YgdGhlCi0gIFxrZXl3b3Jke2ltcG9ydH0gc3RhdGVtZW50LikKLQotICBXaGVuIHRoZSBcdmFye25hbWV9IHZhcmlhYmxlIGlzIG9mIHRoZSBmb3JtIFxjb2Rle3BhY2thZ2UubW9kdWxlfSwKLSAgbm9ybWFsbHksIHRoZSB0b3AtbGV2ZWwgcGFja2FnZSAodGhlIG5hbWUgdXAgdGlsbCB0aGUgZmlyc3QgZG90KSBpcwotICByZXR1cm5lZCwgXGVtcGh7bm90fSB0aGUgbW9kdWxlIG5hbWVkIGJ5IFx2YXJ7bmFtZX0uICBIb3dldmVyLCB3aGVuCi0gIGEgbm9uLWVtcHR5IFx2YXJ7ZnJvbWxpc3R9IGFyZ3VtZW50IGlzIGdpdmVuLCB0aGUgbW9kdWxlIG5hbWVkIGJ5Ci0gIFx2YXJ7bmFtZX0gaXMgcmV0dXJuZWQuICBUaGlzIGlzIGRvbmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUKLSAgYnl0ZWNvZGUgZ2VuZXJhdGVkIGZvciB0aGUgZGlmZmVyZW50IGtpbmRzIG9mIGltcG9ydCBzdGF0ZW1lbnQ7IHdoZW4KLSAgdXNpbmcgXHNhbXB7aW1wb3J0IHNwYW0uaGFtLmVnZ3N9LCB0aGUgdG9wLWxldmVsIHBhY2thZ2UgXG1vZHVsZXtzcGFtfQotICBtdXN0IGJlIHBsYWNlZCBpbiB0aGUgaW1wb3J0aW5nIG5hbWVzcGFjZSwgYnV0IHdoZW4gdXNpbmcgXHNhbXB7ZnJvbQotICBzcGFtLmhhbSBpbXBvcnQgZWdnc30sIHRoZSBcY29kZXtzcGFtLmhhbX0gc3VicGFja2FnZSBtdXN0IGJlIHVzZWQKLSAgdG8gZmluZCB0aGUgXGNvZGV7ZWdnc30gdmFyaWFibGUuICBBcyBhIHdvcmthcm91bmQgZm9yIHRoaXMKLSAgYmVoYXZpb3IsIHVzZSBcZnVuY3Rpb257Z2V0YXR0cigpfSB0byBleHRyYWN0IHRoZSBkZXNpcmVkCi0gIGNvbXBvbmVudHMuICBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIGRlZmluZSB0aGUgZm9sbG93aW5nIGhlbHBlcjoKLQotXGJlZ2lue3ZlcmJhdGltfQotZGVmIG15X2ltcG9ydChuYW1lKToKLSAgICBtb2QgPSBfX2ltcG9ydF9fKG5hbWUpCi0gICAgY29tcG9uZW50cyA9IG5hbWUuc3BsaXQoJy4nKQotICAgIGZvciBjb21wIGluIGNvbXBvbmVudHNbMTpdOgotICAgICAgICBtb2QgPSBnZXRhdHRyKG1vZCwgY29tcCkKLSAgICByZXR1cm4gbW9kCi1cZW5ke3ZlcmJhdGltfQotCi0gIFx2YXJ7bGV2ZWx9IHNwZWNpZmllcyB3aGV0aGVyIHRvIHVzZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBpbXBvcnRzLgotICBUaGUgZGVmYXVsdCBpcyBcY29kZXstMX0gd2hpY2ggaW5kaWNhdGVzIGJvdGggYWJzb2x1dGUgYW5kIHJlbGF0aXZlCi0gIGltcG9ydHMgd2lsbCBiZSBhdHRlbXB0ZWQuICBcY29kZXswfSBtZWFucyBvbmx5IHBlcmZvcm0gYWJzb2x1dGUgaW1wb3J0cy4KLSAgUG9zaXRpdmUgdmFsdWVzIGZvciBcdmFye2xldmVsfSBpbmRpY2F0ZSB0aGUgbnVtYmVyIG9mIHBhcmVudCBkaXJlY3RvcmllcwotICB0byBzZWFyY2ggcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBvZiB0aGUgbW9kdWxlIGNhbGxpbmcKLSAgXGZ1bmN0aW9ue19faW1wb3J0X199LgotXHZlcnNpb25jaGFuZ2VkW1RoZSBsZXZlbCBwYXJhbWV0ZXIgd2FzIGFkZGVkXXsyLjV9Ci1cdmVyc2lvbmNoYW5nZWRbS2V5d29yZCBzdXBwb3J0IGZvciBwYXJhbWV0ZXJzIHdhcyBhZGRlZF17Mi41fQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXthYnN9e3h9Ci0gIFJldHVybiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgYSBudW1iZXIuICBUaGUgYXJndW1lbnQgbWF5IGJlIGEgcGxhaW4KLSAgb3IgbG9uZyBpbnRlZ2VyIG9yIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLiAgSWYgdGhlIGFyZ3VtZW50IGlzIGEKLSAgY29tcGxleCBudW1iZXIsIGl0cyBtYWduaXR1ZGUgaXMgcmV0dXJuZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2FsbH17aXRlcmFibGV9Ci0gIFJldHVybiBUcnVlIGlmIGFsbCBlbGVtZW50cyBvZiB0aGUgXHZhcntpdGVyYWJsZX0gYXJlIHRydWUuCi0gIEVxdWl2YWxlbnQgdG86Ci0gIFxiZWdpbnt2ZXJiYXRpbX0KLSAgICAgZGVmIGFsbChpdGVyYWJsZSk6Ci0gICAgICAgICBmb3IgZWxlbWVudCBpbiBpdGVyYWJsZToKLSAgICAgICAgICAgICBpZiBub3QgZWxlbWVudDoKLSAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCi0gICAgICAgICByZXR1cm4gVHJ1ZQotICBcZW5ke3ZlcmJhdGltfQotICBcdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317YW55fXtpdGVyYWJsZX0KLSAgUmV0dXJuIFRydWUgaWYgYW55IGVsZW1lbnQgb2YgdGhlIFx2YXJ7aXRlcmFibGV9IGlzIHRydWUuCi0gIEVxdWl2YWxlbnQgdG86Ci0gIFxiZWdpbnt2ZXJiYXRpbX0KLSAgICAgZGVmIGFueShpdGVyYWJsZSk6Ci0gICAgICAgICBmb3IgZWxlbWVudCBpbiBpdGVyYWJsZToKLSAgICAgICAgICAgICBpZiBlbGVtZW50OgotICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQotICAgICAgICAgcmV0dXJuIEZhbHNlCi0gIFxlbmR7dmVyYmF0aW19Ci0gIFx2ZXJzaW9uYWRkZWR7Mi41fQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtiYXNlc3RyaW5nfXt9Ci0gIFRoaXMgYWJzdHJhY3QgdHlwZSBpcyB0aGUgc3VwZXJjbGFzcyBmb3IgXGNsYXNze3N0cn0uCi0gIEl0IGNhbm5vdCBiZSBjYWxsZWQgb3IgaW5zdGFudGlhdGVkLCBidXQgaXQgY2FuIGJlIHVzZWQgdG8gdGVzdCB3aGV0aGVyCi0gIGFuIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiBcY2xhc3N7c3RyfS4KLSAgXGNvZGV7aXNpbnN0YW5jZShvYmosIGJhc2VzdHJpbmcpfSBpcyBlcXVpdmFsZW50IHRvCi0gIFxjb2Rle2lzaW5zdGFuY2Uob2JqLCBzdHIpfS4KLSAgXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2Jpbn17eH0KLSAgQ29udmVydCBhbiBpbnRlZ2VyIG51bWJlciB0byBhIGJpbmFyeSBzdHJpbmcuCi0gIFRoZSByZXN1bHQgaXMgYSB2YWxpZCBQeXRob24gZXhwcmVzc2lvbi4gIElmIFx2YXJ7eH0gaXMgbm90IGEgUHl0aG9uCi0gIFxjbGFzc3tpbnR9IG9iamVjdCwgaXQgaGFzIHRvIGRlZmluZSBhbiBcbWV0aG9ke19faW5kZXhfX30gbWV0aG9kCi0gIHRoYXQgcmV0dXJucyBhbiBpbnRlZ2VyLgotICBcdmVyc2lvbmFkZGVkezMuMH0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Ym9vbH17XG9wdGlvbmFse3h9fQotICBDb252ZXJ0IGEgdmFsdWUgdG8gYSBCb29sZWFuLCB1c2luZyB0aGUgc3RhbmRhcmQgdHJ1dGggdGVzdGluZwotICBwcm9jZWR1cmUuICBJZiBcdmFye3h9IGlzIGZhbHNlIG9yIG9taXR0ZWQsIHRoaXMgcmV0dXJucwotICBcY29uc3RhbnR7RmFsc2V9OyBvdGhlcndpc2UgaXQgcmV0dXJucyBcY29uc3RhbnR7VHJ1ZX0uCi0gIFxjbGFzc3tib29sfSBpcyBhbHNvIGEgY2xhc3MsIHdoaWNoIGlzIGEgc3ViY2xhc3Mgb2YgXGNsYXNze2ludH0uCi0gIENsYXNzIFxjbGFzc3tib29sfSBjYW5ub3QgYmUgc3ViY2xhc3NlZCBmdXJ0aGVyLiAgSXRzIG9ubHkgaW5zdGFuY2VzCi0gIGFyZSBcY29uc3RhbnR7RmFsc2V9IGFuZCBcY29uc3RhbnR7VHJ1ZX0uCi0KLSAgXGluZGV4aWl7Qm9vbGVhbn17dHlwZX0KLSAgXHZlcnNpb25hZGRlZHsyLjIuMX0KLSAgXHZlcnNpb25jaGFuZ2VkW0lmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMKLSAgICAgICAgICAgICAgICAgIFxjb25zdGFudHtGYWxzZX1dezIuM30KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y2hyfXtpfQotICBSZXR1cm4gdGhlIFVuaWNvZGUgc3RyaW5nIG9mIG9uZSBjaGFyYWN0ZXIgd2hvc2UgVW5pY29kZSBjb2RlIGlzIHRoZQotICBpbnRlZ2VyIFx2YXJ7aX0uICBGb3IgZXhhbXBsZSwgXGNvZGV7dW5pY2hyKDk3KX0gcmV0dXJucyB0aGUgc3RyaW5nCi0gIFxjb2Rle3UnYSd9LiAgVGhpcyBpcyB0aGUgaW52ZXJzZSBvZiBcZnVuY3Rpb257b3JkKCl9IGZvciBVbmljb2RlCi0gIHN0cmluZ3MuICBUaGUgdmFsaWQgcmFuZ2UgZm9yIHRoZSBhcmd1bWVudCBkZXBlbmRzIGhvdyBQeXRob24gd2FzCi0gIGNvbmZpZ3VyZWQgLS0gaXQgbWF5IGJlIGVpdGhlciBVQ1MyIFswLi4weEZGRkZdIG9yIFVDUzQgWzAuLjB4MTBGRkZGXS4KLSAgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSBpcyByYWlzZWQgb3RoZXJ3aXNlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtjbGFzc21ldGhvZH17ZnVuY3Rpb259Ci0gIFJldHVybiBhIGNsYXNzIG1ldGhvZCBmb3IgXHZhcntmdW5jdGlvbn0uCi0KLSAgQSBjbGFzcyBtZXRob2QgcmVjZWl2ZXMgdGhlIGNsYXNzIGFzIGltcGxpY2l0IGZpcnN0IGFyZ3VtZW50LAotICBqdXN0IGxpa2UgYW4gaW5zdGFuY2UgbWV0aG9kIHJlY2VpdmVzIHRoZSBpbnN0YW5jZS4KLSAgVG8gZGVjbGFyZSBhIGNsYXNzIG1ldGhvZCwgdXNlIHRoaXMgaWRpb206Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWNsYXNzIEM6Ci0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIGYoY2xzLCBhcmcxLCBhcmcyLCAuLi4pOiAuLi4KLVxlbmR7dmVyYmF0aW19Ci0KLSAgVGhlIFxjb2Rle0BjbGFzc21ldGhvZH0gZm9ybSBpcyBhIGZ1bmN0aW9uIGRlY29yYXRvciAtLSBzZWUgdGhlIGRlc2NyaXB0aW9uCi0gIG9mIGZ1bmN0aW9uIGRlZmluaXRpb25zIGluIGNoYXB0ZXIgNyBvZiB0aGUKLSAgXGNpdGV0aXRsZVsuLi9yZWYvcmVmLmh0bWxde1B5dGhvbiBSZWZlcmVuY2UgTWFudWFsfSBmb3IgZGV0YWlscy4KLQotICBJdCBjYW4gYmUgY2FsbGVkIGVpdGhlciBvbiB0aGUgY2xhc3MgKHN1Y2ggYXMgXGNvZGV7Qy5mKCl9KSBvciBvbiBhbgotICBpbnN0YW5jZSAoc3VjaCBhcyBcY29kZXtDKCkuZigpfSkuICBUaGUgaW5zdGFuY2UgaXMgaWdub3JlZCBleGNlcHQgZm9yCi0gIGl0cyBjbGFzcy4KLSAgSWYgYSBjbGFzcyBtZXRob2QgaXMgY2FsbGVkIGZvciBhIGRlcml2ZWQgY2xhc3MsIHRoZSBkZXJpdmVkIGNsYXNzCi0gIG9iamVjdCBpcyBwYXNzZWQgYXMgdGhlIGltcGxpZWQgZmlyc3QgYXJndW1lbnQuCi0KLSAgQ2xhc3MgbWV0aG9kcyBhcmUgZGlmZmVyZW50IHRoYW4gXENwcHt9IG9yIEphdmEgc3RhdGljIG1ldGhvZHMuCi0gIElmIHlvdSB3YW50IHRob3NlLCBzZWUgXGZ1bmN0aW9ue3N0YXRpY21ldGhvZCgpfSBpbiB0aGlzIHNlY3Rpb24uCi0gIAotICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBjbGFzcyBtZXRob2RzLCBjb25zdWx0IHRoZSBkb2N1bWVudGF0aW9uIG9uIHRoZQotICBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSBpbiBjaGFwdGVyIDMgb2YgdGhlCi0gIFxjaXRldGl0bGVbLi4vcmVmL3R5cGVzLmh0bWxde1B5dGhvbiBSZWZlcmVuY2UgTWFudWFsfSAoYXQgdGhlIGJvdHRvbSkuCi0gIFx2ZXJzaW9uYWRkZWR7Mi4yfQotICBcdmVyc2lvbmNoYW5nZWRbRnVuY3Rpb24gZGVjb3JhdG9yIHN5bnRheCBhZGRlZF17Mi40fQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtjbXB9e3gsIHl9Ci0gIENvbXBhcmUgdGhlIHR3byBvYmplY3RzIFx2YXJ7eH0gYW5kIFx2YXJ7eX0gYW5kIHJldHVybiBhbiBpbnRlZ2VyCi0gIGFjY29yZGluZyB0byB0aGUgb3V0Y29tZS4gIFRoZSByZXR1cm4gdmFsdWUgaXMgbmVnYXRpdmUgaWYgXGNvZGV7XHZhcnt4fQotICA8IFx2YXJ7eX19LCB6ZXJvIGlmIFxjb2Rle1x2YXJ7eH0gPT0gXHZhcnt5fX0gYW5kIHN0cmljdGx5IHBvc2l0aXZlIGlmCi0gIFxjb2Rle1x2YXJ7eH0gPiBcdmFye3l9fS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y29tcGlsZX17c291cmNlLCBmaWxlbmFtZSwgbW9kZVxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzXG9wdGlvbmFseywgZG9udF9pbmhlcml0fX19Ci0gIENvbXBpbGUgdGhlIFx2YXJ7c291cmNlfSBpbnRvIGEgY29kZSBvYmplY3QuICBDb2RlIG9iamVjdHMgY2FuIGJlCi0gIGV4ZWN1dGVkIGJ5IGEgY2FsbCB0byBcZnVuY3Rpb257ZXhlYygpfSBvciBldmFsdWF0ZWQgYnkgYSBjYWxsIHRvCi0gIFxmdW5jdGlvbntldmFsKCl9LiAgVGhlIFx2YXJ7ZmlsZW5hbWV9IGFyZ3VtZW50IHNob3VsZAotICBnaXZlIHRoZSBmaWxlIGZyb20gd2hpY2ggdGhlIGNvZGUgd2FzIHJlYWQ7IHBhc3Mgc29tZSByZWNvZ25pemFibGUgdmFsdWUKLSAgaWYgaXQgd2Fzbid0IHJlYWQgZnJvbSBhIGZpbGUgKFxjb2Rleyc8c3RyaW5nPid9IGlzIGNvbW1vbmx5IHVzZWQpLgotICBUaGUgXHZhcnttb2RlfSBhcmd1bWVudCBzcGVjaWZpZXMgd2hhdCBraW5kIG9mIGNvZGUgbXVzdCBiZQotICBjb21waWxlZDsgaXQgY2FuIGJlIFxjb2RleydleGVjJ30gaWYgXHZhcntzb3VyY2V9IGNvbnNpc3RzIG9mIGEKLSAgc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cywgXGNvZGV7J2V2YWwnfSBpZiBpdCBjb25zaXN0cyBvZiBhIHNpbmdsZQotICBleHByZXNzaW9uLCBvciBcY29kZXsnc2luZ2xlJ30gaWYgaXQgY29uc2lzdHMgb2YgYSBzaW5nbGUKLSAgaW50ZXJhY3RpdmUgc3RhdGVtZW50IChpbiB0aGUgbGF0dGVyIGNhc2UsIGV4cHJlc3Npb24gc3RhdGVtZW50cwotICB0aGF0IGV2YWx1YXRlIHRvIHNvbWV0aGluZyBlbHNlIHRoYW4gXGNvZGV7Tm9uZX0gd2lsbCBiZSBwcmludGVkKS4KLQotICBXaGVuIGNvbXBpbGluZyBtdWx0aS1saW5lIHN0YXRlbWVudHMsIHR3byBjYXZlYXRzIGFwcGx5OiBsaW5lCi0gIGVuZGluZ3MgbXVzdCBiZSByZXByZXNlbnRlZCBieSBhIHNpbmdsZSBuZXdsaW5lIGNoYXJhY3RlcgotICAoXGNvZGV7J1xlIG4nfSksIGFuZCB0aGUgaW5wdXQgbXVzdCBiZSB0ZXJtaW5hdGVkIGJ5IGF0IGxlYXN0IG9uZQotICBuZXdsaW5lIGNoYXJhY3Rlci4gIElmIGxpbmUgZW5kaW5ncyBhcmUgcmVwcmVzZW50ZWQgYnkKLSAgXGNvZGV7J1xlIHJcZSBuJ30sIHVzZSB0aGUgc3RyaW5nIFxtZXRob2R7cmVwbGFjZSgpfSBtZXRob2QgdG8KLSAgY2hhbmdlIHRoZW0gaW50byBcY29kZXsnXGUgbid9LgotCi0gIFRoZSBvcHRpb25hbCBhcmd1bWVudHMgXHZhcntmbGFnc30gYW5kIFx2YXJ7ZG9udF9pbmhlcml0fQotICAod2hpY2ggYXJlIG5ldyBpbiBQeXRob24gMi4yKSBjb250cm9sIHdoaWNoIGZ1dHVyZSBzdGF0ZW1lbnRzIChzZWUKLSAgXHBlcHsyMzZ9KSBhZmZlY3QgdGhlIGNvbXBpbGF0aW9uIG9mIFx2YXJ7c291cmNlfS4gIElmIG5laXRoZXIgaXMKLSAgcHJlc2VudCAob3IgYm90aCBhcmUgemVybykgdGhlIGNvZGUgaXMgY29tcGlsZWQgd2l0aCB0aG9zZSBmdXR1cmUKLSAgc3RhdGVtZW50cyB0aGF0IGFyZSBpbiBlZmZlY3QgaW4gdGhlIGNvZGUgdGhhdCBpcyBjYWxsaW5nIGNvbXBpbGUuCi0gIElmIHRoZSBcdmFye2ZsYWdzfSBhcmd1bWVudCBpcyBnaXZlbiBhbmQgXHZhcntkb250X2luaGVyaXR9IGlzIG5vdAotICAob3IgaXMgemVybykgdGhlbiB0aGUgZnV0dXJlIHN0YXRlbWVudHMgc3BlY2lmaWVkIGJ5IHRoZSBcdmFye2ZsYWdzfQotICBhcmd1bWVudCBhcmUgdXNlZCBpbiBhZGRpdGlvbiB0byB0aG9zZSB0aGF0IHdvdWxkIGJlIHVzZWQgYW55d2F5LgotICBJZiBcdmFye2RvbnRfaW5oZXJpdH0gaXMgYSBub24temVybyBpbnRlZ2VyIHRoZW4gdGhlIFx2YXJ7ZmxhZ3N9Ci0gIGFyZ3VtZW50IGlzIGl0IC0tIHRoZSBmdXR1cmUgc3RhdGVtZW50cyBpbiBlZmZlY3QgYXJvdW5kIHRoZSBjYWxsIHRvCi0gIGNvbXBpbGUgYXJlIGlnbm9yZWQuCi0KLSAgRnV0dXJlIHN0YXRlbWVudHMgYXJlIHNwZWNpZmllZCBieSBiaXRzIHdoaWNoIGNhbiBiZSBiaXR3aXNlIG9yLWVkCi0gIHRvZ2V0aGVyIHRvIHNwZWNpZnkgbXVsdGlwbGUgc3RhdGVtZW50cy4gIFRoZSBiaXRmaWVsZCByZXF1aXJlZCB0bwotICBzcGVjaWZ5IGEgZ2l2ZW4gZmVhdHVyZSBjYW4gYmUgZm91bmQgYXMgdGhlIFxtZW1iZXJ7Y29tcGlsZXJfZmxhZ30KLSAgYXR0cmlidXRlIG9uIHRoZSBcY2xhc3N7X0ZlYXR1cmV9IGluc3RhbmNlIGluIHRoZQotICBcbW9kdWxle19fZnV0dXJlX199IG1vZHVsZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y29tcGxleH17XG9wdGlvbmFse3JlYWxcb3B0aW9uYWx7LCBpbWFnfX19Ci0gIENyZWF0ZSBhIGNvbXBsZXggbnVtYmVyIHdpdGggdGhlIHZhbHVlIFx2YXJ7cmVhbH0gKyBcdmFye2ltYWd9Kmogb3IKLSAgY29udmVydCBhIHN0cmluZyBvciBudW1iZXIgdG8gYSBjb21wbGV4IG51bWJlci4gIElmIHRoZSBmaXJzdAotICBwYXJhbWV0ZXIgaXMgYSBzdHJpbmcsIGl0IHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYSBjb21wbGV4IG51bWJlcgotICBhbmQgdGhlIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGhvdXQgYSBzZWNvbmQgcGFyYW1ldGVyLiAgVGhlCi0gIHNlY29uZCBwYXJhbWV0ZXIgY2FuIG5ldmVyIGJlIGEgc3RyaW5nLgotICBFYWNoIGFyZ3VtZW50IG1heSBiZSBhbnkgbnVtZXJpYyB0eXBlIChpbmNsdWRpbmcgY29tcGxleCkuCi0gIElmIFx2YXJ7aW1hZ30gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gemVybyBhbmQgdGhlIGZ1bmN0aW9uCi0gIHNlcnZlcyBhcyBhIG51bWVyaWMgY29udmVyc2lvbiBmdW5jdGlvbiBsaWtlIFxmdW5jdGlvbntpbnQoKX0sCi0gIFxmdW5jdGlvbntsb25nKCl9IGFuZCBcZnVuY3Rpb257ZmxvYXQoKX0uICBJZiBib3RoIGFyZ3VtZW50cwotICBhcmUgb21pdHRlZCwgcmV0dXJucyBcY29kZXswan0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2RlbGF0dHJ9e29iamVjdCwgbmFtZX0KLSAgVGhpcyBpcyBhIHJlbGF0aXZlIG9mIFxmdW5jdGlvbntzZXRhdHRyKCl9LiAgVGhlIGFyZ3VtZW50cyBhcmUgYW4KLSAgb2JqZWN0IGFuZCBhIHN0cmluZy4gIFRoZSBzdHJpbmcgbXVzdCBiZSB0aGUgbmFtZQotICBvZiBvbmUgb2YgdGhlIG9iamVjdCdzIGF0dHJpYnV0ZXMuICBUaGUgZnVuY3Rpb24gZGVsZXRlcwotICB0aGUgbmFtZWQgYXR0cmlidXRlLCBwcm92aWRlZCB0aGUgb2JqZWN0IGFsbG93cyBpdC4gIEZvciBleGFtcGxlLAotICBcY29kZXtkZWxhdHRyKFx2YXJ7eH0sICdcdmFye2Zvb2Jhcn0nKX0gaXMgZXF1aXZhbGVudCB0bwotICBcY29kZXtkZWwgXHZhcnt4fS5cdmFye2Zvb2Jhcn19LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtkaWN0fXtcb3B0aW9uYWx7YXJnfX0KLSAgUmV0dXJuIGEgbmV3IGRpY3Rpb25hcnkgaW5pdGlhbGl6ZWQgZnJvbSBhbiBvcHRpb25hbCBwb3NpdGlvbmFsCi0gIGFyZ3VtZW50IG9yIGZyb20gYSBzZXQgb2Yga2V5d29yZCBhcmd1bWVudHMuCi0gIElmIG5vIGFyZ3VtZW50cyBhcmUgZ2l2ZW4sIHJldHVybiBhIG5ldyBlbXB0eSBkaWN0aW9uYXJ5LgotICBJZiB0aGUgcG9zaXRpb25hbCBhcmd1bWVudCBcdmFye2FyZ30gaXMgYSBtYXBwaW5nIG9iamVjdCwgcmV0dXJuIGEgZGljdGlvbmFyeQotICBtYXBwaW5nIHRoZSBzYW1lIGtleXMgdG8gdGhlIHNhbWUgdmFsdWVzIGFzIGRvZXMgdGhlIG1hcHBpbmcgb2JqZWN0LgotICBPdGhlcndpc2UgdGhlIHBvc2l0aW9uYWwgYXJndW1lbnQgbXVzdCBiZSBhIHNlcXVlbmNlLCBhIGNvbnRhaW5lciB0aGF0Ci0gIHN1cHBvcnRzIGl0ZXJhdGlvbiwgb3IgYW4gaXRlcmF0b3Igb2JqZWN0LiAgVGhlIGVsZW1lbnRzIG9mIHRoZSBhcmd1bWVudAotICBtdXN0IGVhY2ggYWxzbyBiZSBvZiBvbmUgb2YgdGhvc2Uga2luZHMsIGFuZCBlYWNoIG11c3QgaW4gdHVybiBjb250YWluCi0gIGV4YWN0bHkgdHdvIG9iamVjdHMuICBUaGUgZmlyc3QgaXMgdXNlZCBhcyBhIGtleSBpbiB0aGUgbmV3IGRpY3Rpb25hcnksCi0gIGFuZCB0aGUgc2Vjb25kIGFzIHRoZSBrZXkncyB2YWx1ZS4gIElmIGEgZ2l2ZW4ga2V5IGlzIHNlZW4gbW9yZSB0aGFuCi0gIG9uY2UsIHRoZSBsYXN0IHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBpdCBpcyByZXRhaW5lZCBpbiB0aGUgbmV3Ci0gIGRpY3Rpb25hcnkuCi0KLSAgSWYga2V5d29yZCBhcmd1bWVudHMgYXJlIGdpdmVuLCB0aGUga2V5d29yZHMgdGhlbXNlbHZlcyB3aXRoIHRoZWlyCi0gIGFzc29jaWF0ZWQgdmFsdWVzIGFyZSBhZGRlZCBhcyBpdGVtcyB0byB0aGUgZGljdGlvbmFyeS4gSWYgYSBrZXkKLSAgaXMgc3BlY2lmaWVkIGJvdGggaW4gdGhlIHBvc2l0aW9uYWwgYXJndW1lbnQgYW5kIGFzIGEga2V5d29yZCBhcmd1bWVudCwKLSAgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5d29yZCBpcyByZXRhaW5lZCBpbiB0aGUgZGljdGlvbmFyeS4KLSAgRm9yIGV4YW1wbGUsIHRoZXNlIGFsbCByZXR1cm4gYSBkaWN0aW9uYXJ5IGVxdWFsIHRvCi0gIFxjb2Rle1x7Im9uZSI6IDIsICJ0d28iOiAzXH19OgotCi0gIFxiZWdpbntpdGVtaXplfQotICAgIFxpdGVtIFxjb2Rle2RpY3QoXHsnb25lJzogMiwgJ3R3byc6IDNcfSl9Ci0gICAgXGl0ZW0gXGNvZGV7ZGljdChceydvbmUnOiAyLCAndHdvJzogM1x9Lml0ZW1zKCkpfQotICAgIFxpdGVtIFxjb2Rle2RpY3QoXHsnb25lJzogMiwgJ3R3byc6IDNcfS5pdGVyaXRlbXMoKSl9Ci0gICAgXGl0ZW0gXGNvZGV7ZGljdCh6aXAoKCdvbmUnLCAndHdvJyksICgyLCAzKSkpfQotICAgIFxpdGVtIFxjb2Rle2RpY3QoW1sndHdvJywgM10sIFsnb25lJywgMl1dKX0KLSAgICBcaXRlbSBcY29kZXtkaWN0KG9uZT0yLCB0d289Myl9Ci0gICAgXGl0ZW0gXGNvZGV7ZGljdChbKFsnb25lJywgJ3R3byddW2ktMl0sIGkpIGZvciBpIGluICgyLCAzKV0pfQotICBcZW5ke2l0ZW1pemV9Ci0KLSAgXHZlcnNpb25hZGRlZHsyLjJ9Ci0gIFx2ZXJzaW9uY2hhbmdlZFtTdXBwb3J0IGZvciBidWlsZGluZyBhIGRpY3Rpb25hcnkgZnJvbSBrZXl3b3JkCi0gICAgICAgICAgICAgICAgICBhcmd1bWVudHMgYWRkZWRdezIuM30KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZGlyfXtcb3B0aW9uYWx7b2JqZWN0fX0KLSAgV2l0aG91dCBhcmd1bWVudHMsIHJldHVybiB0aGUgbGlzdCBvZiBuYW1lcyBpbiB0aGUgY3VycmVudCBsb2NhbCBzY29wZS4gIFdpdGgKLSAgYW4gYXJndW1lbnQsIGF0dGVtcHQgdG8gcmV0dXJuIGEgbGlzdCBvZiB2YWxpZCBhdHRyaWJ1dGVzIGZvciB0aGF0IG9iamVjdC4KLQotICBJZiB0aGUgb2JqZWN0IGhhcyBhIG1ldGhvZCBuYW1lZCBcbWV0aG9ke19fZGlyX18oKX0sIHRoaXMgbWV0aG9kIHdpbGwgYmUKLSAgY2FsbGVkIGFuZCBtdXN0IHJldHVybiB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzLiBUaGlzIGFsbG93cyBvYmplY3RzIHRoYXQKLSAgaW1wbGVtZW50IGEgY3VzdG9tIFxmdW5jdGlvbntfX2dldGF0dHJfXygpfSBvciBcZnVuY3Rpb257X19nZXRhdHRyaWJ1dGVfXygpfQotICBmdW5jdGlvbiB0byBjdXN0b21pemUgdGhlIHdheSBcZnVuY3Rpb257ZGlyKCl9IHJlcG9ydHMgdGhlaXIgYXR0cmlidXRlcy4KLQotICBJZiB0aGUgb2JqZWN0IGRvZXMgbm90IHByb3ZpZGUgXG1ldGhvZHtfX2Rpcl9fKCl9LCB0aGUgZnVuY3Rpb24gdHJpZXMgaXRzIGJlc3QKLSAgdG8gZ2F0aGVyIGluZm9ybWF0aW9uIGZyb20gdGhlIG9iamVjdCdzIFxtZW1iZXJ7X19kaWN0X199IGF0dHJpYnV0ZSwgaWYKLSAgZGVmaW5lZCwgYW5kIGZyb20gaXRzIHR5cGUgb2JqZWN0LiAgVGhlIHJlc3VsdGluZyBsaXN0IGlzIG5vdCBuZWNlc3NhcmlseQotICBjb21wbGV0ZSwgYW5kIG1heSBiZSBpbmFjY3VyYXRlIHdoZW4gdGhlIG9iamVjdCBoYXMgYSBjdXN0b20KLSAgXGZ1bmN0aW9ue19fZ2V0YXR0cl9fKCl9LgotICAKLSAgVGhlIGRlZmF1bHQgXGZ1bmN0aW9ue2RpcigpfSBtZWNoYW5pc20gYmVoYXZlcyBkaWZmZXJlbnRseSB3aXRoIGRpZmZlcmVudAotICB0eXBlcyBvZiBvYmplY3RzLCBhcyBpdCBhdHRlbXB0cyB0byBwcm9kdWNlIHRoZSBtb3N0IHJlbGV2YW50LCByYXRoZXIgdGhhbgotICBjb21wbGV0ZSwgaW5mb3JtYXRpb246Ci0gIFxiZWdpbntpdGVtaXplfQotICBcaXRlbSBJZiB0aGUgb2JqZWN0IGlzIGEgbW9kdWxlIG9iamVjdCwgdGhlIGxpc3QgY29udGFpbnMgdGhlIG5hbWVzIG9mIHRoZQotICAgIG1vZHVsZSdzIGF0dHJpYnV0ZXMuCi0gIFxpdGVtIElmIHRoZSBvYmplY3QgaXMgYSB0eXBlIG9yIGNsYXNzIG9iamVjdCwgdGhlIGxpc3QgY29udGFpbnMgdGhlIG5hbWVzIG9mCi0gICAgaXRzIGF0dHJpYnV0ZXMsIGFuZCByZWN1cnNpdmVseSBvZiB0aGUgYXR0cmlidXRlcyBvZiBpdHMgYmFzZXMuCi0gIFxpdGVtIE90aGVyd2lzZSwgdGhlIGxpc3QgY29udGFpbnMgdGhlIG9iamVjdCdzIGF0dHJpYnV0ZXMnIG5hbWVzLCB0aGUgbmFtZXMKLSAgICBvZiBpdHMgY2xhc3MncyBhdHRyaWJ1dGVzLCBhbmQgcmVjdXJzaXZlbHkgb2YgdGhlIGF0dHJpYnV0ZXMgb2YgaXRzIGNsYXNzJ3MKLSAgICBiYXNlIGNsYXNzZXMuCi0gIFxlbmR7aXRlbWl6ZX0KLSAgCi0gIFRoZSByZXN1bHRpbmcgbGlzdCBpcyBzb3J0ZWQgYWxwaGFiZXRpY2FsbHkuICBGb3IgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGltcG9ydCBzdHJ1Y3QKLT4+PiBkaXIoKQotWydfX2J1aWx0aW5zX18nLCAnX19kb2NfXycsICdfX25hbWVfXycsICdzdHJ1Y3QnXQotPj4+IGRpcihzdHJ1Y3QpCi1bJ19fZG9jX18nLCAnX19uYW1lX18nLCAnY2FsY3NpemUnLCAnZXJyb3InLCAncGFjaycsICd1bnBhY2snXQotPj4+IGNsYXNzIEZvbyhvYmplY3QpOgotLi4uICAgICBkZWYgX19kaXJfXyhzZWxmKToKLS4uLiAgICAgICAgIHJldHVybiBbImthbiIsICJnYSIsICJyb28iXQotLi4uCi0+Pj4gZiA9IEZvbygpCi0+Pj4gZGlyKGYpCi1bJ2dhJywgJ2thbicsICdyb28nXQotXGVuZHt2ZXJiYXRpbX0KLQotICBcbm90ZXtCZWNhdXNlIFxmdW5jdGlvbntkaXIoKX0gaXMgc3VwcGxpZWQgcHJpbWFyaWx5IGFzIGEgY29udmVuaWVuY2UgZm9yIHVzZQotICAgIGF0IGFuIGludGVyYWN0aXZlIHByb21wdCwgaXQgdHJpZXMgdG8gc3VwcGx5IGFuIGludGVyZXN0aW5nIHNldCBvZiBuYW1lcwotICAgIG1vcmUgdGhhbiBpdCB0cmllcyB0byBzdXBwbHkgYSByaWdvcm91c2x5IG9yIGNvbnNpc3RlbnRseSBkZWZpbmVkIHNldCBvZgotICAgIG5hbWVzLCBhbmQgaXRzIGRldGFpbGVkIGJlaGF2aW9yIG1heSBjaGFuZ2UgYWNyb3NzIHJlbGVhc2VzLn0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZGl2bW9kfXthLCBifQotICBUYWtlIHR3byAobm9uIGNvbXBsZXgpIG51bWJlcnMgYXMgYXJndW1lbnRzIGFuZCByZXR1cm4gYSBwYWlyIG9mIG51bWJlcnMKLSAgY29uc2lzdGluZyBvZiB0aGVpciBxdW90aWVudCBhbmQgcmVtYWluZGVyIHdoZW4gdXNpbmcgbG9uZyBkaXZpc2lvbi4gIFdpdGgKLSAgbWl4ZWQgb3BlcmFuZCB0eXBlcywgdGhlIHJ1bGVzIGZvciBiaW5hcnkgYXJpdGhtZXRpYyBvcGVyYXRvcnMgYXBwbHkuICBGb3IKLSAgcGxhaW4gYW5kIGxvbmcgaW50ZWdlcnMsIHRoZSByZXN1bHQgaXMgdGhlIHNhbWUgYXMKLSAgXGNvZGV7KFx2YXJ7YX0gLy8gXHZhcntifSwgXHZhcnthfSBcJXt9IFx2YXJ7Yn0pfS4KLSAgRm9yIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgdGhlIHJlc3VsdCBpcyBcY29kZXsoXHZhcntxfSwgXHZhcnthfSBcJXt9Ci0gIFx2YXJ7Yn0pfSwgd2hlcmUgXHZhcntxfSBpcyB1c3VhbGx5IFxjb2Rle21hdGguZmxvb3IoXHZhcnthfSAvCi0gIFx2YXJ7Yn0pfSBidXQgbWF5IGJlIDEgbGVzcyB0aGFuIHRoYXQuICBJbiBhbnkgY2FzZSBcY29kZXtcdmFye3F9ICoKLSAgXHZhcntifSArIFx2YXJ7YX0gXCV7fSBcdmFye2J9fSBpcyB2ZXJ5IGNsb3NlIHRvIFx2YXJ7YX0sIGlmCi0gIFxjb2Rle1x2YXJ7YX0gXCV7fSBcdmFye2J9fSBpcyBub24temVybyBpdCBoYXMgdGhlIHNhbWUgc2lnbiBhcwotICBcdmFye2J9LCBhbmQgXGNvZGV7MCA8PSBhYnMoXHZhcnthfSBcJXt9IFx2YXJ7Yn0pIDwgYWJzKFx2YXJ7Yn0pfS4KLQotICBcdmVyc2lvbmNoYW5nZWRbVXNpbmcgXGZ1bmN0aW9ue2Rpdm1vZCgpfSB3aXRoIGNvbXBsZXggbnVtYmVycyBpcwotICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZF17Mi4zfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtlbnVtZXJhdGV9e2l0ZXJhYmxlfQotICBSZXR1cm4gYW4gZW51bWVyYXRlIG9iamVjdC4gXHZhcntpdGVyYWJsZX0gbXVzdCBiZSBhIHNlcXVlbmNlLCBhbiBpdGVyYXRvciwgb3IKLSAgc29tZSBvdGhlciBvYmplY3Qgd2hpY2ggc3VwcG9ydHMgaXRlcmF0aW9uLiAgVGhlIFxtZXRob2R7X19uZXh0X18oKX0gbWV0aG9kIG9mCi0gIHRoZSBpdGVyYXRvciByZXR1cm5lZCBieSBcZnVuY3Rpb257ZW51bWVyYXRlKCl9IHJldHVybnMgYSB0dXBsZSBjb250YWluaW5nIGEKLSAgY291bnQgKGZyb20gemVybykgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIG9idGFpbmVkIGZyb20gaXRlcmF0aW5nIG92ZXIKLSAgXHZhcntpdGVyYWJsZX0uICBcZnVuY3Rpb257ZW51bWVyYXRlKCl9IGlzIHVzZWZ1bCBmb3Igb2J0YWluaW5nIGFuIGluZGV4ZWQKLSAgc2VyaWVzOiBcY29kZXsoMCwgc2VxWzBdKX0sIFxjb2RleygxLCBzZXFbMV0pfSwgXGNvZGV7KDIsIHNlcVsyXSl9LCBcbGRvdHMuCi0gIFx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtldmFsfXtleHByZXNzaW9uXG9wdGlvbmFseywgZ2xvYmFsc1xvcHRpb25hbHssIGxvY2Fsc319fQotICBUaGUgYXJndW1lbnRzIGFyZSBhIHN0cmluZyBhbmQgb3B0aW9uYWwgZ2xvYmFscyBhbmQgbG9jYWxzLiAgSWYgcHJvdmlkZWQsCi0gIFx2YXJ7Z2xvYmFsc30gbXVzdCBiZSBhIGRpY3Rpb25hcnkuICBJZiBwcm92aWRlZCwgXHZhcntsb2NhbHN9IGNhbiBiZQotICBhbnkgbWFwcGluZyBvYmplY3QuICBcdmVyc2lvbmNoYW5nZWRbZm9ybWVybHkgXHZhcntsb2NhbHN9IHdhcyByZXF1aXJlZAotICB0byBiZSBhIGRpY3Rpb25hcnldezIuNH0KLQotICBUaGUgXHZhcntleHByZXNzaW9ufSBhcmd1bWVudCBpcyBwYXJzZWQgYW5kIGV2YWx1YXRlZCBhcyBhIFB5dGhvbgotICBleHByZXNzaW9uICh0ZWNobmljYWxseSBzcGVha2luZywgYSBjb25kaXRpb24gbGlzdCkgdXNpbmcgdGhlCi0gIFx2YXJ7Z2xvYmFsc30gYW5kIFx2YXJ7bG9jYWxzfSBkaWN0aW9uYXJpZXMgYXMgZ2xvYmFsIGFuZCBsb2NhbCBuYW1lCi0gIHNwYWNlLiAgSWYgdGhlIFx2YXJ7Z2xvYmFsc30gZGljdGlvbmFyeSBpcyBwcmVzZW50IGFuZCBsYWNrcwotICAnX19idWlsdGluc19fJywgdGhlIGN1cnJlbnQgZ2xvYmFscyBhcmUgY29waWVkIGludG8gXHZhcntnbG9iYWxzfSBiZWZvcmUKLSAgXHZhcntleHByZXNzaW9ufSBpcyBwYXJzZWQuICBUaGlzIG1lYW5zIHRoYXQgXHZhcntleHByZXNzaW9ufQotICBub3JtYWxseSBoYXMgZnVsbCBhY2Nlc3MgdG8gdGhlIHN0YW5kYXJkCi0gIFxyZWZtb2R1bGVbYnVpbHRpbl17X19idWlsdGluX199IG1vZHVsZSBhbmQgcmVzdHJpY3RlZCBlbnZpcm9ubWVudHMKLSAgYXJlIHByb3BhZ2F0ZWQuICBJZiB0aGUgXHZhcntsb2NhbHN9IGRpY3Rpb25hcnkgaXMgb21pdHRlZCBpdCBkZWZhdWx0cyB0bwotICB0aGUgXHZhcntnbG9iYWxzfSBkaWN0aW9uYXJ5LiAgSWYgYm90aCBkaWN0aW9uYXJpZXMgYXJlIG9taXR0ZWQsIHRoZQotICBleHByZXNzaW9uIGlzIGV4ZWN1dGVkIGluIHRoZSBlbnZpcm9ubWVudCB3aGVyZSBca2V5d29yZHtldmFsfSBpcwotICBjYWxsZWQuICBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSByZXN1bHQgb2YgdGhlIGV2YWx1YXRlZCBleHByZXNzaW9uLgotICBTeW50YXggZXJyb3JzIGFyZSByZXBvcnRlZCBhcyBleGNlcHRpb25zLiAgRXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHggPSAxCi0+Pj4gcHJpbnQgZXZhbCgneCsxJykKLTIKLVxlbmR7dmVyYmF0aW19Ci0KLSAgVGhpcyBmdW5jdGlvbiBjYW4gYWxzbyBiZSB1c2VkIHRvIGV4ZWN1dGUgYXJiaXRyYXJ5IGNvZGUgb2JqZWN0cwotICAoc3VjaCBhcyB0aG9zZSBjcmVhdGVkIGJ5IFxmdW5jdGlvbntjb21waWxlKCl9KS4gIEluIHRoaXMgY2FzZSBwYXNzCi0gIGEgY29kZSBvYmplY3QgaW5zdGVhZCBvZiBhIHN0cmluZy4gIFRoZSBjb2RlIG9iamVjdCBtdXN0IGhhdmUgYmVlbgotICBjb21waWxlZCBwYXNzaW5nIFxjb2RleydldmFsJ30gYXMgdGhlIFx2YXJ7a2luZH0gYXJndW1lbnQuCi0KLSAgSGludHM6IGR5bmFtaWMgZXhlY3V0aW9uIG9mIHN0YXRlbWVudHMgaXMgc3VwcG9ydGVkIGJ5IHRoZQotICBcZnVuY3Rpb257ZXhlYygpfSBmdW5jdGlvbi4gIFRoZQotICBcZnVuY3Rpb257Z2xvYmFscygpfSBhbmQgXGZ1bmN0aW9ue2xvY2FscygpfSBmdW5jdGlvbnMgcmV0dXJucyB0aGUKLSAgY3VycmVudCBnbG9iYWwgYW5kIGxvY2FsIGRpY3Rpb25hcnksIHJlc3BlY3RpdmVseSwgd2hpY2ggbWF5IGJlCi0gIHVzZWZ1bCB0byBwYXNzIGFyb3VuZCBmb3IgdXNlIGJ5IFxmdW5jdGlvbntldmFsKCl9IG9yCi0gIFxmdW5jdGlvbntleGVjKCl9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtleGVjfXtvYmplY3Rcb3B0aW9uYWx7LCBnbG9iYWxzXG9wdGlvbmFseywgbG9jYWxzfX19Ci0gIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgZHluYW1pYyBleGVjdXRpb24gb2YgUHl0aG9uIGNvZGUuCi0gIFx2YXJ7b2JqZWN0fSBtdXN0IGJlIGVpdGhlciBhIHN0cmluZywgYW4gb3BlbiBmaWxlIG9iamVjdCwgb3IKLSAgYSBjb2RlIG9iamVjdC4gIElmIGl0IGlzIGEgc3RyaW5nLCB0aGUgc3RyaW5nIGlzIHBhcnNlZCBhcyBhIHN1aXRlIG9mCi0gIFB5dGhvbiBzdGF0ZW1lbnRzIHdoaWNoIGlzIHRoZW4gZXhlY3V0ZWQgKHVubGVzcyBhIHN5bnRheCBlcnJvcgotICBvY2N1cnMpLiAgSWYgaXQgaXMgYW4gb3BlbiBmaWxlLCB0aGUgZmlsZSBpcyBwYXJzZWQgdW50aWwgXEVPRnt9IGFuZAotICBleGVjdXRlZC4gIElmIGl0IGlzIGEgY29kZSBvYmplY3QsIGl0IGlzIHNpbXBseSBleGVjdXRlZC4gIEluIGFsbAotICBjYXNlcywgdGhlIGNvZGUgdGhhdCdzIGV4ZWN1dGVkIGlzIGV4cGVjdGVkIHRvIGJlIHZhbGlkIGFzIGZpbGUKLSAgaW5wdXQgKHNlZSB0aGUgc2VjdGlvbiBgYEZpbGUgaW5wdXQnJyBpbiB0aGUgUmVmZXJlbmNlIE1hbnVhbCkuCi0gIEJlIGF3YXJlIHRoYXQgdGhlIFxrZXl3b3Jke3JldHVybn0gYW5kIFxrZXl3b3Jke3lpZWxkfSBzdGF0ZW1lbnRzIG1heQotICBub3QgYmUgdXNlZCBvdXRzaWRlIG9mIGZ1bmN0aW9uIGRlZmluaXRpb25zIGV2ZW4gd2l0aGluIHRoZSBjb250ZXh0IG9mCi0gIGNvZGUgcGFzc2VkIHRvIHRoZSBcZnVuY3Rpb257ZXhlYygpfSBmdW5jdGlvbi4KLSAgVGhlIHJldHVybiB2YWx1ZSBpcyBcY29kZXtOb25lfS4KLQotICBJbiBhbGwgY2FzZXMsIGlmIHRoZSBvcHRpb25hbCBwYXJ0cyBhcmUgb21pdHRlZCwgdGhlIGNvZGUgaXMgZXhlY3V0ZWQKLSAgaW4gdGhlIGN1cnJlbnQgc2NvcGUuICBJZiBvbmx5IFx2YXJ7Z2xvYmFsc30gaXMgcHJvdmlkZWQsIGl0IG11c3QgYmUKLSAgYSBkaWN0aW9uYXJ5LCB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIGJvdGggdGhlIGdsb2JhbCBhbmQgdGhlIGxvY2FsCi0gIHZhcmlhYmxlcy4gIElmIFx2YXJ7Z2xvYmFsc30gYW5kIFx2YXJ7bG9jYWxzfSBhcmUgZ2l2ZW4sIHRoZXkgYXJlIHVzZWQKLSAgZm9yIHRoZSBnbG9iYWwgYW5kIGxvY2FsIHZhcmlhYmxlcywgcmVzcGVjdGl2ZWx5LiAgSWYgcHJvdmlkZWQsCi0gIFx2YXJ7bG9jYWxzfSBjYW4gYmUgYW55IG1hcHBpbmcgb2JqZWN0LgotCi0gIElmIHRoZSBcdmFye2dsb2JhbHN9IGRpY3Rpb25hcnkgZG9lcyBub3QgY29udGFpbiBhIHZhbHVlIGZvciB0aGUKLSAga2V5IFxjb2Rle19fYnVpbHRpbnNfX30sIGEgcmVmZXJlbmNlIHRvIHRoZSBkaWN0aW9uYXJ5IG9mIHRoZSBidWlsdC1pbgotICBtb2R1bGUgXG1vZHVsZXtfX2J1aWx0aW5fX30gaXMgaW5zZXJ0ZWQgdW5kZXIgdGhhdCBrZXkuICBUaGF0IHdheSB5b3UKLSAgY2FuIGNvbnRyb2wgd2hhdCBidWlsdGlucyBhcmUgYXZhaWxhYmxlIHRvIHRoZSBleGVjdXRlZCBjb2RlIGJ5Ci0gIGluc2VydGluZyB5b3VyIG93biBcY29kZXtfX2J1aWx0aW5zX199IGRpY3Rpb25hcnkgaW50byBcdmFye2dsb2JhbHN9Ci0gIGJlZm9yZSBwYXNzaW5nIGl0IHRvIFxmdW5jdGlvbntleGVjKCl9LgotCi0gIFxub3Rle1RoZSBidWlsdC1pbiBmdW5jdGlvbnMgXGZ1bmN0aW9ue2dsb2JhbHMoKX0gYW5kIFxmdW5jdGlvbntsb2NhbHMoKX0KLSAgICAgICAgcmV0dXJuIHRoZSBjdXJyZW50IGdsb2JhbCBhbmQgbG9jYWwgZGljdGlvbmFyeSwgcmVzcGVjdGl2ZWx5LCB3aGljaAotCW1heSBiZSB1c2VmdWwgdG8gcGFzcyBhcm91bmQgZm9yIHVzZSBhcyB0aGUgc2Vjb25kIGFuZCB0aGlyZAotCWFyZ3VtZW50IHRvIFxmdW5jdGlvbntleGVjKCl9Ln0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZmlsdGVyfXtmdW5jdGlvbiwgaXRlcmFibGV9Ci0gIENvbnN0cnVjdCBhIGxpc3QgZnJvbSB0aG9zZSBlbGVtZW50cyBvZiBcdmFye2l0ZXJhYmxlfSBmb3Igd2hpY2gKLSAgXHZhcntmdW5jdGlvbn0gcmV0dXJucyB0cnVlLiAgXHZhcntpdGVyYWJsZX0gbWF5IGJlIGVpdGhlciBhIHNlcXVlbmNlLCBhCi0gIGNvbnRhaW5lciB3aGljaCBzdXBwb3J0cyBpdGVyYXRpb24sIG9yIGFuIGl0ZXJhdG9yLCAgSWYgXHZhcntpdGVyYWJsZX0KLSAgaXMgYSBzdHJpbmcgb3IgYSB0dXBsZSwgdGhlIHJlc3VsdAotICBhbHNvIGhhcyB0aGF0IHR5cGU7IG90aGVyd2lzZSBpdCBpcyBhbHdheXMgYSBsaXN0LiAgSWYgXHZhcntmdW5jdGlvbn0gaXMKLSAgXGNvZGV7Tm9uZX0sIHRoZSBpZGVudGl0eSBmdW5jdGlvbiBpcyBhc3N1bWVkLCB0aGF0IGlzLCBhbGwgZWxlbWVudHMgb2YKLSAgXHZhcntpdGVyYWJsZX0gdGhhdCBhcmUgZmFsc2UgYXJlIHJlbW92ZWQuCi0KLSAgTm90ZSB0aGF0IFxjb2Rle2ZpbHRlcihmdW5jdGlvbiwgXHZhcntpdGVyYWJsZX0pfSBpcyBlcXVpdmFsZW50IHRvCi0gIFxjb2Rle1tpdGVtIGZvciBpdGVtIGluIFx2YXJ7aXRlcmFibGV9IGlmIGZ1bmN0aW9uKGl0ZW0pXX0gaWYgZnVuY3Rpb24gaXMKLSAgbm90IFxjb2Rle05vbmV9IGFuZCBcY29kZXtbaXRlbSBmb3IgaXRlbSBpbiBcdmFye2l0ZXJhYmxlfSBpZiBpdGVtXX0gaWYKLSAgZnVuY3Rpb24gaXMgXGNvZGV7Tm9uZX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2Zsb2F0fXtcb3B0aW9uYWx7eH19Ci0gIENvbnZlcnQgYSBzdHJpbmcgb3IgYSBudW1iZXIgdG8gZmxvYXRpbmcgcG9pbnQuICBJZiB0aGUgYXJndW1lbnQgaXMgYQotICBzdHJpbmcsIGl0IG11c3QgY29udGFpbiBhIHBvc3NpYmx5IHNpZ25lZCBkZWNpbWFsIG9yIGZsb2F0aW5nIHBvaW50Ci0gIG51bWJlciwgcG9zc2libHkgZW1iZWRkZWQgaW4gd2hpdGVzcGFjZS4gT3RoZXJ3aXNlLCB0aGUgYXJndW1lbnQgbWF5IGJlIGEgcGxhaW4KLSAgb3IgbG9uZyBpbnRlZ2VyIG9yIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCBhbmQgYSBmbG9hdGluZyBwb2ludAotICBudW1iZXIgd2l0aCB0aGUgc2FtZSB2YWx1ZSAod2l0aGluIFB5dGhvbidzIGZsb2F0aW5nIHBvaW50Ci0gIHByZWNpc2lvbikgaXMgcmV0dXJuZWQuICBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgcmV0dXJucyBcY29kZXswLjB9LgotCi0gIFxub3Rle1doZW4gcGFzc2luZyBpbiBhIHN0cmluZywgdmFsdWVzIGZvciBOYU5caW5kZXh7TmFOfQotICBhbmQgSW5maW5pdHlcaW5kZXh7SW5maW5pdHl9IG1heSBiZSByZXR1cm5lZCwgZGVwZW5kaW5nIG9uIHRoZQotICB1bmRlcmx5aW5nIEMgbGlicmFyeS4gIFRoZSBzcGVjaWZpYyBzZXQgb2Ygc3RyaW5ncyBhY2NlcHRlZCB3aGljaAotICBjYXVzZSB0aGVzZSB2YWx1ZXMgdG8gYmUgcmV0dXJuZWQgZGVwZW5kcyBlbnRpcmVseSBvbiB0aGUgQyBsaWJyYXJ5Ci0gIGFuZCBpcyBrbm93biB0byB2YXJ5Ln0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZnJvemVuc2V0fXtcb3B0aW9uYWx7aXRlcmFibGV9fQotICBSZXR1cm4gYSBmcm96ZW5zZXQgb2JqZWN0IHdob3NlIGVsZW1lbnRzIGFyZSB0YWtlbiBmcm9tIFx2YXJ7aXRlcmFibGV9LgotICBGcm96ZW5zZXRzIGFyZSBzZXRzIHRoYXQgaGF2ZSBubyB1cGRhdGUgbWV0aG9kcyBidXQgY2FuIGJlIGhhc2hlZCBhbmQKLSAgdXNlZCBhcyBtZW1iZXJzIG9mIG90aGVyIHNldHMgb3IgYXMgZGljdGlvbmFyeSBrZXlzLiAgVGhlIGVsZW1lbnRzIG9mCi0gIGEgZnJvemVuc2V0IG11c3QgYmUgaW1tdXRhYmxlIHRoZW1zZWx2ZXMuICBUbyByZXByZXNlbnQgc2V0cyBvZiBzZXRzLAotICB0aGUgaW5uZXIgc2V0cyBzaG91bGQgYWxzbyBiZSBcY2xhc3N7ZnJvemVuc2V0fSBvYmplY3RzLiAgSWYKLSAgXHZhcntpdGVyYWJsZX0gaXMgbm90IHNwZWNpZmllZCwgcmV0dXJucyBhIG5ldyBlbXB0eSBzZXQsCi0gIFxjb2Rle2Zyb3plbnNldChbXSl9LgotICBcdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0YXR0cn17b2JqZWN0LCBuYW1lXG9wdGlvbmFseywgZGVmYXVsdH19Ci0gIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG5hbWVkIGF0dHJpYnV0ZWQgb2YgXHZhcntvYmplY3R9LiAgXHZhcntuYW1lfQotICBtdXN0IGJlIGEgc3RyaW5nLiAgSWYgdGhlIHN0cmluZyBpcyB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlIG9iamVjdCdzCi0gIGF0dHJpYnV0ZXMsIHRoZSByZXN1bHQgaXMgdGhlIHZhbHVlIG9mIHRoYXQgYXR0cmlidXRlLiAgRm9yIGV4YW1wbGUsCi0gIFxjb2Rle2dldGF0dHIoeCwgJ2Zvb2JhcicpfSBpcyBlcXVpdmFsZW50IHRvIFxjb2Rle3guZm9vYmFyfS4gIElmIHRoZQotICBuYW1lZCBhdHRyaWJ1dGUgZG9lcyBub3QgZXhpc3QsIFx2YXJ7ZGVmYXVsdH0gaXMgcmV0dXJuZWQgaWYgcHJvdmlkZWQsCi0gIG90aGVyd2lzZSBcZXhjZXB0aW9ue0F0dHJpYnV0ZUVycm9yfSBpcyByYWlzZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dsb2JhbHN9e30KLSAgUmV0dXJuIGEgZGljdGlvbmFyeSByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgZ2xvYmFsIHN5bWJvbCB0YWJsZS4KLSAgVGhpcyBpcyBhbHdheXMgdGhlIGRpY3Rpb25hcnkgb2YgdGhlIGN1cnJlbnQgbW9kdWxlIChpbnNpZGUgYQotICBmdW5jdGlvbiBvciBtZXRob2QsIHRoaXMgaXMgdGhlIG1vZHVsZSB3aGVyZSBpdCBpcyBkZWZpbmVkLCBub3QgdGhlCi0gIG1vZHVsZSBmcm9tIHdoaWNoIGl0IGlzIGNhbGxlZCkuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2hhc2F0dHJ9e29iamVjdCwgbmFtZX0KLSAgVGhlIGFyZ3VtZW50cyBhcmUgYW4gb2JqZWN0IGFuZCBhIHN0cmluZy4gIFRoZSByZXN1bHQgaXMgXGNvZGV7VHJ1ZX0gaWYgdGhlCi0gIHN0cmluZyBpcyB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlIG9iamVjdCdzIGF0dHJpYnV0ZXMsIFxjb2Rle0ZhbHNlfSBpZiBub3QuCi0gIChUaGlzIGlzIGltcGxlbWVudGVkIGJ5IGNhbGxpbmcgXGNvZGV7Z2V0YXR0cihcdmFye29iamVjdH0sCi0gIFx2YXJ7bmFtZX0pfSBhbmQgc2VlaW5nIHdoZXRoZXIgaXQgcmFpc2VzIGFuIGV4Y2VwdGlvbiBvciBub3QuKQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtoYXNofXtvYmplY3R9Ci0gIFJldHVybiB0aGUgaGFzaCB2YWx1ZSBvZiB0aGUgb2JqZWN0IChpZiBpdCBoYXMgb25lKS4gIEhhc2ggdmFsdWVzCi0gIGFyZSBpbnRlZ2Vycy4gIFRoZXkgYXJlIHVzZWQgdG8gcXVpY2tseSBjb21wYXJlIGRpY3Rpb25hcnkKLSAga2V5cyBkdXJpbmcgYSBkaWN0aW9uYXJ5IGxvb2t1cC4gIE51bWVyaWMgdmFsdWVzIHRoYXQgY29tcGFyZSBlcXVhbAotICBoYXZlIHRoZSBzYW1lIGhhc2ggdmFsdWUgKGV2ZW4gaWYgdGhleSBhcmUgb2YgZGlmZmVyZW50IHR5cGVzLCBhcyBpcwotICB0aGUgY2FzZSBmb3IgMSBhbmQgMS4wKS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aGVscH17XG9wdGlvbmFse29iamVjdH19Ci0gIEludm9rZSB0aGUgYnVpbHQtaW4gaGVscCBzeXN0ZW0uICAoVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCBmb3IKLSAgaW50ZXJhY3RpdmUgdXNlLikgIElmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCB0aGUgaW50ZXJhY3RpdmUgaGVscAotICBzeXN0ZW0gc3RhcnRzIG9uIHRoZSBpbnRlcnByZXRlciBjb25zb2xlLiAgSWYgdGhlIGFyZ3VtZW50IGlzIGEKLSAgc3RyaW5nLCB0aGVuIHRoZSBzdHJpbmcgaXMgbG9va2VkIHVwIGFzIHRoZSBuYW1lIG9mIGEgbW9kdWxlLAotICBmdW5jdGlvbiwgY2xhc3MsIG1ldGhvZCwga2V5d29yZCwgb3IgZG9jdW1lbnRhdGlvbiB0b3BpYywgYW5kIGEKLSAgaGVscCBwYWdlIGlzIHByaW50ZWQgb24gdGhlIGNvbnNvbGUuICBJZiB0aGUgYXJndW1lbnQgaXMgYW55IG90aGVyCi0gIGtpbmQgb2Ygb2JqZWN0LCBhIGhlbHAgcGFnZSBvbiB0aGUgb2JqZWN0IGlzIGdlbmVyYXRlZC4KLSAgXHZlcnNpb25hZGRlZHsyLjJ9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2hleH17eH0KLSAgQ29udmVydCBhbiBpbnRlZ2VyIG51bWJlciB0byBhIGhleGFkZWNpbWFsIHN0cmluZy4KLSAgVGhlIHJlc3VsdCBpcyBhIHZhbGlkIFB5dGhvbiBleHByZXNzaW9uLiAgSWYgXHZhcnt4fSBpcyBub3QgYSBQeXRob24KLSAgXGNsYXNze2ludH0gb2JqZWN0LCBpdCBoYXMgdG8gZGVmaW5lIGFuIFxtZXRob2R7X19pbmRleF9ffSBtZXRob2QKLSAgdGhhdCByZXR1cm5zIGFuIGludGVnZXIuCi0gIFx2ZXJzaW9uY2hhbmdlZFtGb3JtZXJseSBvbmx5IHJldHVybmVkIGFuIHVuc2lnbmVkIGxpdGVyYWxdezIuNH0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aWR9e29iamVjdH0KLSAgUmV0dXJuIHRoZSBgYGlkZW50aXR5Jycgb2YgYW4gb2JqZWN0LiAgVGhpcyBpcyBhbiBpbnRlZ2VyIChvciBsb25nCi0gIGludGVnZXIpIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gYmUgdW5pcXVlIGFuZCBjb25zdGFudCBmb3IgdGhpcwotICBvYmplY3QgZHVyaW5nIGl0cyBsaWZldGltZS4gIFR3byBvYmplY3RzIHdpdGggbm9uLW92ZXJsYXBwaW5nIGxpZmV0aW1lcwotICBtYXkgaGF2ZSB0aGUgc2FtZSBcZnVuY3Rpb257aWQoKX0gdmFsdWUuICAoSW1wbGVtZW50YXRpb24KLSAgbm90ZTogdGhpcyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgb2JqZWN0LikKLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aW50fXtcb3B0aW9uYWx7eFxvcHRpb25hbHssIHJhZGl4fX19Ci0gIENvbnZlcnQgYSBzdHJpbmcgb3IgbnVtYmVyIHRvIGEgbG9uZyBpbnRlZ2VyLiAgSWYgdGhlIGFyZ3VtZW50IGlzIGEKLSAgc3RyaW5nLCBpdCBtdXN0IGNvbnRhaW4gYSBwb3NzaWJseSBzaWduZWQgbnVtYmVyIG9mCi0gIGFyYml0cmFyeSBzaXplLCBwb3NzaWJseSBlbWJlZGRlZCBpbiB3aGl0ZXNwYWNlLiBUaGUKLSAgXHZhcntyYWRpeH0gYXJndW1lbnQgaXMgaW50ZXJwcmV0ZWQgaW4gdGhlIHNhbWUgd2F5IGFzIGZvcgotICBcZnVuY3Rpb257aW50KCl9LCBhbmQgbWF5IG9ubHkgYmUgZ2l2ZW4gd2hlbiBcdmFye3h9IGlzIGEgc3RyaW5nLgotICBPdGhlcndpc2UsIHRoZSBhcmd1bWVudCBtYXkgYmUgYW5vdGhlcgotICBpbnRlZ2VyIG9yIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCBhbmQgYW4gaW50ZWdlciB3aXRoCi0gIHRoZSBzYW1lIHZhbHVlIGlzIHJldHVybmVkLiAgICBDb252ZXJzaW9uIG9mIGZsb2F0aW5nCi0gIHBvaW50IG51bWJlcnMgdG8gaW50ZWdlcnMgdHJ1bmNhdGVzICh0b3dhcmRzIHplcm8pLiAgSWYgbm8gYXJndW1lbnRzCi0gIGFyZSBnaXZlbiwgcmV0dXJucyBcY29kZXswfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aXNpbnN0YW5jZX17b2JqZWN0LCBjbGFzc2luZm99Ci0gIFJldHVybiB0cnVlIGlmIHRoZSBcdmFye29iamVjdH0gYXJndW1lbnQgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlCi0gIFx2YXJ7Y2xhc3NpbmZvfSBhcmd1bWVudCwgb3Igb2YgYSAoZGlyZWN0IG9yIGluZGlyZWN0KSBzdWJjbGFzcwotICB0aGVyZW9mLiAgQWxzbyByZXR1cm4gdHJ1ZSBpZiBcdmFye2NsYXNzaW5mb30gaXMgYSB0eXBlIG9iamVjdAotICAobmV3LXN0eWxlIGNsYXNzKSBhbmQgXHZhcntvYmplY3R9IGlzIGFuIG9iamVjdCBvZiB0aGF0IHR5cGUgb3Igb2YgYQotICAoZGlyZWN0IG9yIGluZGlyZWN0KSBzdWJjbGFzcyB0aGVyZW9mLiAgSWYgXHZhcntvYmplY3R9IGlzIG5vdCBhCi0gIGNsYXNzIGluc3RhbmNlIG9yIGFuIG9iamVjdCBvZiB0aGUgZ2l2ZW4gdHlwZSwgdGhlIGZ1bmN0aW9uIGFsd2F5cwotICByZXR1cm5zIGZhbHNlLiAgSWYgXHZhcntjbGFzc2luZm99IGlzIG5laXRoZXIgYSBjbGFzcyBvYmplY3Qgbm9yIGEKLSAgdHlwZSBvYmplY3QsIGl0IG1heSBiZSBhIHR1cGxlIG9mIGNsYXNzIG9yIHR5cGUgb2JqZWN0cywgb3IgbWF5Ci0gIHJlY3Vyc2l2ZWx5IGNvbnRhaW4gb3RoZXIgc3VjaCB0dXBsZXMgKG90aGVyIHNlcXVlbmNlIHR5cGVzIGFyZSBub3QKLSAgYWNjZXB0ZWQpLiAgSWYgXHZhcntjbGFzc2luZm99IGlzIG5vdCBhIGNsYXNzLCB0eXBlLCBvciB0dXBsZSBvZgotICBjbGFzc2VzLCB0eXBlcywgYW5kIHN1Y2ggdHVwbGVzLCBhIFxleGNlcHRpb257VHlwZUVycm9yfSBleGNlcHRpb24KLSAgaXMgcmFpc2VkLgotICBcdmVyc2lvbmNoYW5nZWRbU3VwcG9ydCBmb3IgYSB0dXBsZSBvZiB0eXBlIGluZm9ybWF0aW9uIHdhcyBhZGRlZF17Mi4yfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpc3N1YmNsYXNzfXtjbGFzcywgY2xhc3NpbmZvfQotICBSZXR1cm4gdHJ1ZSBpZiBcdmFye2NsYXNzfSBpcyBhIHN1YmNsYXNzIChkaXJlY3Qgb3IgaW5kaXJlY3QpIG9mCi0gIFx2YXJ7Y2xhc3NpbmZvfS4gIEEgY2xhc3MgaXMgY29uc2lkZXJlZCBhIHN1YmNsYXNzIG9mIGl0c2VsZi4KLSAgXHZhcntjbGFzc2luZm99IG1heSBiZSBhIHR1cGxlIG9mIGNsYXNzIG9iamVjdHMsIGluIHdoaWNoIGNhc2UgZXZlcnkKLSAgZW50cnkgaW4gXHZhcntjbGFzc2luZm99IHdpbGwgYmUgY2hlY2tlZC4gSW4gYW55IG90aGVyIGNhc2UsIGEKLSAgXGV4Y2VwdGlvbntUeXBlRXJyb3J9IGV4Y2VwdGlvbiBpcyByYWlzZWQuCi0gIFx2ZXJzaW9uY2hhbmdlZFtTdXBwb3J0IGZvciBhIHR1cGxlIG9mIHR5cGUgaW5mb3JtYXRpb24gd2FzIGFkZGVkXXsyLjN9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2l0ZXJ9e29cb3B0aW9uYWx7LCBzZW50aW5lbH19Ci0gIFJldHVybiBhbiBpdGVyYXRvciBvYmplY3QuICBUaGUgZmlyc3QgYXJndW1lbnQgaXMgaW50ZXJwcmV0ZWQgdmVyeQotICBkaWZmZXJlbnRseSBkZXBlbmRpbmcgb24gdGhlIHByZXNlbmNlIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQuCi0gIFdpdGhvdXQgYSBzZWNvbmQgYXJndW1lbnQsIFx2YXJ7b30gbXVzdCBiZSBhIGNvbGxlY3Rpb24gb2JqZWN0IHdoaWNoCi0gIHN1cHBvcnRzIHRoZSBpdGVyYXRpb24gcHJvdG9jb2wgKHRoZSBcbWV0aG9ke19faXRlcl9fKCl9IG1ldGhvZCksIG9yCi0gIGl0IG11c3Qgc3VwcG9ydCB0aGUgc2VxdWVuY2UgcHJvdG9jb2wgKHRoZSBcbWV0aG9ke19fZ2V0aXRlbV9fKCl9Ci0gIG1ldGhvZCB3aXRoIGludGVnZXIgYXJndW1lbnRzIHN0YXJ0aW5nIGF0IFxjb2RlezB9KS4gIElmIGl0IGRvZXMgbm90Ci0gIHN1cHBvcnQgZWl0aGVyIG9mIHRob3NlIHByb3RvY29scywgXGV4Y2VwdGlvbntUeXBlRXJyb3J9IGlzIHJhaXNlZC4KLSAgSWYgdGhlIHNlY29uZCBhcmd1bWVudCwgXHZhcntzZW50aW5lbH0sIGlzIGdpdmVuLCB0aGVuIFx2YXJ7b30gbXVzdAotICBiZSBhIGNhbGxhYmxlIG9iamVjdC4gIFRoZSBpdGVyYXRvciBjcmVhdGVkIGluIHRoaXMgY2FzZSB3aWxsIGNhbGwKLSAgXHZhcntvfSB3aXRoIG5vIGFyZ3VtZW50cyBmb3IgZWFjaCBjYWxsIHRvIGl0cyBcbWV0aG9ke19fbmV4dF9fKCl9Ci0gIG1ldGhvZDsgaWYgdGhlIHZhbHVlIHJldHVybmVkIGlzIGVxdWFsIHRvIFx2YXJ7c2VudGluZWx9LAotICBcZXhjZXB0aW9ue1N0b3BJdGVyYXRpb259IHdpbGwgYmUgcmFpc2VkLCBvdGhlcndpc2UgdGhlIHZhbHVlIHdpbGwKLSAgYmUgcmV0dXJuZWQuCi0gIFx2ZXJzaW9uYWRkZWR7Mi4yfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtsZW59e3N9Ci0gIFJldHVybiB0aGUgbGVuZ3RoICh0aGUgbnVtYmVyIG9mIGl0ZW1zKSBvZiBhbiBvYmplY3QuICBUaGUgYXJndW1lbnQKLSAgbWF5IGJlIGEgc2VxdWVuY2UgKHN0cmluZywgdHVwbGUgb3IgbGlzdCkgb3IgYSBtYXBwaW5nIChkaWN0aW9uYXJ5KS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bGlzdH17XG9wdGlvbmFse2l0ZXJhYmxlfX0KLSAgUmV0dXJuIGEgbGlzdCB3aG9zZSBpdGVtcyBhcmUgdGhlIHNhbWUgYW5kIGluIHRoZSBzYW1lIG9yZGVyIGFzCi0gIFx2YXJ7aXRlcmFibGV9J3MgaXRlbXMuICBcdmFye2l0ZXJhYmxlfSBtYXkgYmUgZWl0aGVyIGEgc2VxdWVuY2UsIGEKLSAgY29udGFpbmVyIHRoYXQgc3VwcG9ydHMgaXRlcmF0aW9uLCBvciBhbiBpdGVyYXRvciBvYmplY3QuICBJZgotICBcdmFye2l0ZXJhYmxlfSBpcyBhbHJlYWR5IGEgbGlzdCwgYSBjb3B5IGlzIG1hZGUgYW5kIHJldHVybmVkLAotICBzaW1pbGFyIHRvIFxjb2Rle1x2YXJ7aXRlcmFibGV9WzpdfS4gIEZvciBpbnN0YW5jZSwKLSAgXGNvZGV7bGlzdCgnYWJjJyl9IHJldHVybnMgXGNvZGV7WydhJywgJ2InLCAnYyddfSBhbmQgXGNvZGV7bGlzdCgKLSAgKDEsIDIsIDMpICl9IHJldHVybnMgXGNvZGV7WzEsIDIsIDNdfS4gIElmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLAotICByZXR1cm5zIGEgbmV3IGVtcHR5IGxpc3QsIFxjb2Rle1tdfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bG9jYWxzfXt9Ci0gIFVwZGF0ZSBhbmQgcmV0dXJuIGEgZGljdGlvbmFyeSByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgbG9jYWwgc3ltYm9sIHRhYmxlLgotICBcd2FybmluZ3tUaGUgY29udGVudHMgb2YgdGhpcyBkaWN0aW9uYXJ5IHNob3VsZCBub3QgYmUgbW9kaWZpZWQ7Ci0gIGNoYW5nZXMgbWF5IG5vdCBhZmZlY3QgdGhlIHZhbHVlcyBvZiBsb2NhbCB2YXJpYWJsZXMgdXNlZCBieSB0aGUKLSAgaW50ZXJwcmV0ZXIufQotCi0gIEZyZWUgdmFyaWFibGVzIGFyZSByZXR1cm5lZCBieSBcdmFye2xvY2Fsc30gd2hlbiBpdCBpcyBjYWxsZWQgaW4KLSAgYSBmdW5jdGlvbiBibG9jay4gIE1vZGlmaWNhdGlvbnMgb2YgZnJlZSB2YXJpYWJsZXMgbWF5IG5vdCBhZmZlY3QKLSAgdGhlIHZhbHVlcyB1c2VkIGJ5IHRoZSBpbnRlcnByZXRlci4gIEZyZWUgdmFyaWFibGVzIGFyZSBub3QKLSAgcmV0dXJuZWQgaW4gY2xhc3MgYmxvY2tzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXttYXB9e2Z1bmN0aW9uLCBpdGVyYWJsZSwgLi4ufQotICBBcHBseSBcdmFye2Z1bmN0aW9ufSB0byBldmVyeSBpdGVtIG9mIFx2YXJ7aXRlcmFibGV9IGFuZCByZXR1cm4gYSBsaXN0Ci0gIG9mIHRoZSByZXN1bHRzLiAgSWYgYWRkaXRpb25hbCBcdmFye2l0ZXJhYmxlfSBhcmd1bWVudHMgYXJlIHBhc3NlZCwKLSAgXHZhcntmdW5jdGlvbn0gbXVzdCB0YWtlIHRoYXQgbWFueSBhcmd1bWVudHMgYW5kIGlzIGFwcGxpZWQgdG8gdGhlCi0gIGl0ZW1zIGZyb20gYWxsIGl0ZXJhYmxlcyBpbiBwYXJhbGxlbC4gIElmIG9uZSBpdGVyYWJsZSBpcyBzaG9ydGVyIHRoYW4gYW5vdGhlciBpdAotICBpcyBhc3N1bWVkIHRvIGJlIGV4dGVuZGVkIHdpdGggXGNvZGV7Tm9uZX0gaXRlbXMuICBJZiBcdmFye2Z1bmN0aW9ufQotICBpcyBcY29kZXtOb25lfSwgdGhlIGlkZW50aXR5IGZ1bmN0aW9uIGlzIGFzc3VtZWQ7IGlmIHRoZXJlIGFyZQotICBtdWx0aXBsZSBhcmd1bWVudHMsIFxmdW5jdGlvbnttYXAoKX0gcmV0dXJucyBhIGxpc3QgY29uc2lzdGluZwotICBvZiB0dXBsZXMgY29udGFpbmluZyB0aGUgY29ycmVzcG9uZGluZyBpdGVtcyBmcm9tIGFsbCBpdGVyYWJsZXMgKGEga2luZAotICBvZiB0cmFuc3Bvc2Ugb3BlcmF0aW9uKS4gIFRoZSBcdmFye2l0ZXJhYmxlfSBhcmd1bWVudHMgbWF5IGJlIGEgc2VxdWVuY2UgCi0gIG9yIGFueSBpdGVyYWJsZSBvYmplY3Q7IHRoZSByZXN1bHQgaXMgYWx3YXlzIGEgbGlzdC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bWF4fXtpdGVyYWJsZVxvcHRpb25hbHssIGFyZ3MuLi59XG9wdGlvbmFse2tleX19Ci0gIFdpdGggYSBzaW5nbGUgYXJndW1lbnQgXHZhcntpdGVyYWJsZX0sIHJldHVybiB0aGUgbGFyZ2VzdCBpdGVtIG9mIGEKLSAgbm9uLWVtcHR5IGl0ZXJhYmxlIChzdWNoIGFzIGEgc3RyaW5nLCB0dXBsZSBvciBsaXN0KS4gIFdpdGggbW9yZQotICB0aGFuIG9uZSBhcmd1bWVudCwgcmV0dXJuIHRoZSBsYXJnZXN0IG9mIHRoZSBhcmd1bWVudHMuCi0KLSAgVGhlIG9wdGlvbmFsIFx2YXJ7a2V5fSBhcmd1bWVudCBzcGVjaWZpZXMgYSBvbmUtYXJndW1lbnQgb3JkZXJpbmcKLSAgZnVuY3Rpb24gbGlrZSB0aGF0IHVzZWQgZm9yIFxtZXRob2R7bGlzdC5zb3J0KCl9LiAgVGhlIFx2YXJ7a2V5fQotICBhcmd1bWVudCwgaWYgc3VwcGxpZWQsIG11c3QgYmUgaW4ga2V5d29yZCBmb3JtIChmb3IgZXhhbXBsZSwKLSAgXHNhbXB7bWF4KGEsYixjLGtleT1mdW5jKX0pLgotICBcdmVyc2lvbmNoYW5nZWRbQWRkZWQgc3VwcG9ydCBmb3IgdGhlIG9wdGlvbmFsIFx2YXJ7a2V5fSBhcmd1bWVudF17Mi41fQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXttaW59e2l0ZXJhYmxlXG9wdGlvbmFseywgYXJncy4uLn1cb3B0aW9uYWx7a2V5fX0KLSAgV2l0aCBhIHNpbmdsZSBhcmd1bWVudCBcdmFye2l0ZXJhYmxlfSwgcmV0dXJuIHRoZSBzbWFsbGVzdCBpdGVtIG9mIGEKLSAgbm9uLWVtcHR5IGl0ZXJhYmxlIChzdWNoIGFzIGEgc3RyaW5nLCB0dXBsZSBvciBsaXN0KS4gIFdpdGggbW9yZQotICB0aGFuIG9uZSBhcmd1bWVudCwgcmV0dXJuIHRoZSBzbWFsbGVzdCBvZiB0aGUgYXJndW1lbnRzLgotCi0gIFRoZSBvcHRpb25hbCBcdmFye2tleX0gYXJndW1lbnQgc3BlY2lmaWVzIGEgb25lLWFyZ3VtZW50IG9yZGVyaW5nCi0gIGZ1bmN0aW9uIGxpa2UgdGhhdCB1c2VkIGZvciBcbWV0aG9ke2xpc3Quc29ydCgpfS4gIFRoZSBcdmFye2tleX0KLSAgYXJndW1lbnQsIGlmIHN1cHBsaWVkLCBtdXN0IGJlIGluIGtleXdvcmQgZm9ybSAoZm9yIGV4YW1wbGUsCi0gIFxzYW1we21pbihhLGIsYyxrZXk9ZnVuYyl9KS4KLSAgXHZlcnNpb25jaGFuZ2VkW0FkZGVkIHN1cHBvcnQgZm9yIHRoZSBvcHRpb25hbCBcdmFye2tleX0gYXJndW1lbnRdezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bmV4dH17aXRlcmF0b3Jcb3B0aW9uYWx7LCBkZWZhdWx0fX0KLSAgUmV0cmlldmUgdGhlIG5leHQgaXRlbSBmcm9tIHRoZSBcdmFye2l0ZXJhYmxlfSBieSBjYWxsaW5nIGl0cwotICBcbWV0aG9ke19fbmV4dF9fKCl9IG1ldGhvZC4gIElmIFx2YXJ7ZGVmYXVsdH0gaXMgZ2l2ZW4sIGl0IGlzIHJldHVybmVkIGlmIHRoZQotICBpdGVyYXRvciBpcyBleGhhdXN0ZWQsIG90aGVyd2lzZSBcZXhjZXB0aW9ue1N0b3BJdGVyYXRpb259IGlzIHJhaXNlZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317b2JqZWN0fXt9Ci0gIFJldHVybiBhIG5ldyBmZWF0dXJlbGVzcyBvYmplY3QuICBcY2xhc3N7b2JqZWN0fSBpcyBhIGJhc2UKLSAgZm9yIGFsbCBuZXcgc3R5bGUgY2xhc3Nlcy4gIEl0IGhhcyB0aGUgbWV0aG9kcyB0aGF0IGFyZSBjb21tb24KLSAgdG8gYWxsIGluc3RhbmNlcyBvZiBuZXcgc3R5bGUgY2xhc3Nlcy4KLSAgXHZlcnNpb25hZGRlZHsyLjJ9Ci0KLSAgXHZlcnNpb25jaGFuZ2VkW1RoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWNjZXB0IGFueSBhcmd1bWVudHMuCi0gIEZvcm1lcmx5LCBpdCBhY2NlcHRlZCBhcmd1bWVudHMgYnV0IGlnbm9yZWQgdGhlbV17Mi4zfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtvY3R9e3h9Ci0gIENvbnZlcnQgYW4gaW50ZWdlciBudW1iZXIgdG8gYW4gb2N0YWwgc3RyaW5nLiAgVGhlCi0gIHJlc3VsdCBpcyBhIHZhbGlkIFB5dGhvbiBleHByZXNzaW9uLiAgSWYgXHZhcnt4fSBpcyBub3QgYSBQeXRob24KLSAgXGNsYXNze2ludH0gb2JqZWN0LCBpdCBoYXMgdG8gZGVmaW5lIGFuIFxtZXRob2R7X19pbmRleF9ffSBtZXRob2QKLSAgdGhhdCByZXR1cm5zIGFuIGludGVnZXIuCi0gIFx2ZXJzaW9uY2hhbmdlZFtGb3JtZXJseSBvbmx5IHJldHVybmVkIGFuIHVuc2lnbmVkIGxpdGVyYWxdezIuNH0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317b3Blbn17ZmlsZW5hbWVcb3B0aW9uYWx7LCBtb2RlXG9wdGlvbmFseywgYnVmc2l6ZX19fQotICBPcGVuIGEgZmlsZSwgcmV0dXJuaW5nIGFuIG9iamVjdCBvZiB0aGUgXGNsYXNze2ZpbGV9IHR5cGUgZGVzY3JpYmVkCi0gIGluIHNlY3Rpb25+XHJlZntibHRpbi1maWxlLW9iamVjdHN9LCBgYFx1bGlua3tGaWxlCi0gIE9iamVjdHN9e2JsdGluLWZpbGUtb2JqZWN0cy5odG1sfScnLiAgSWYgdGhlIGZpbGUgY2Fubm90IGJlIG9wZW5lZCwKLSAgXGV4Y2VwdGlvbntJT0Vycm9yfSBpcyByYWlzZWQuICBXaGVuIG9wZW5pbmcgYSBmaWxlLCBpdCdzCi0gIHByZWZlcmFibGUgdG8gdXNlIFxmdW5jdGlvbntvcGVuKCl9IGluc3RlYWQgb2YgaW52b2tpbmcgdGhlCi0gIFxjbGFzc3tmaWxlfSBjb25zdHJ1Y3RvciBkaXJlY3RseS4KLQotICBUaGUgZmlyc3QgdHdvIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgZm9yIFxjb2Rle3N0ZGlvfSdzCi0gIFxjZnVuY3Rpb257Zm9wZW4oKX06IFx2YXJ7ZmlsZW5hbWV9IGlzIHRoZSBmaWxlIG5hbWUgdG8gYmUgb3BlbmVkLAotICBhbmQgXHZhcnttb2RlfSBpcyBhIHN0cmluZyBpbmRpY2F0aW5nIGhvdyB0aGUgZmlsZSBpcyB0byBiZSBvcGVuZWQuCi0KLSAgVGhlIG1vc3QgY29tbW9ubHktdXNlZCB2YWx1ZXMgb2YgXHZhcnttb2RlfSBhcmUgXGNvZGV7J3InfSBmb3IKLSAgcmVhZGluZywgXGNvZGV7J3cnfSBmb3Igd3JpdGluZyAodHJ1bmNhdGluZyB0aGUgZmlsZSBpZiBpdCBhbHJlYWR5Ci0gIGV4aXN0cyksIGFuZCBcY29kZXsnYSd9IGZvciBhcHBlbmRpbmcgKHdoaWNoIG9uIFxlbXBoe3NvbWV9IFxVTklYe30KLSAgc3lzdGVtcyBtZWFucyB0aGF0IFxlbXBoe2FsbH0gd3JpdGVzIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlCi0gIHJlZ2FyZGxlc3Mgb2YgdGhlIGN1cnJlbnQgc2VlayBwb3NpdGlvbikuICBJZiBcdmFye21vZGV9IGlzIG9taXR0ZWQsCi0gIGl0IGRlZmF1bHRzIHRvIFxjb2RleydyJ30uICBXaGVuIG9wZW5pbmcgYSBiaW5hcnkgZmlsZSwgeW91IHNob3VsZAotICBhcHBlbmQgXGNvZGV7J2InfSB0byB0aGUgXHZhcnttb2RlfSB2YWx1ZSB0byBvcGVuIHRoZSBmaWxlIGluIGJpbmFyeQotICBtb2RlLCB3aGljaCB3aWxsIGltcHJvdmUgcG9ydGFiaWxpdHkuICAoQXBwZW5kaW5nIFxjb2RleydiJ30gaXMKLSAgdXNlZnVsIGV2ZW4gb24gc3lzdGVtcyB0aGF0IGRvbid0IHRyZWF0IGJpbmFyeSBhbmQgdGV4dCBmaWxlcwotICBkaWZmZXJlbnRseSwgd2hlcmUgaXQgc2VydmVzIGFzIGRvY3VtZW50YXRpb24uKSAgU2VlIGJlbG93IGZvciBtb3JlCi0gIHBvc3NpYmxlIHZhbHVlcyBvZiBcdmFye21vZGV9LgotCi0gIFxpbmRleHtsaW5lLWJ1ZmZlcmVkIEkvT31caW5kZXh7dW5idWZmZXJlZCBJL099XGluZGV4e2J1ZmZlciBzaXplLCBJL099Ci0gIFxpbmRleHtJL08gY29udHJvbCFidWZmZXJpbmd9Ci0gIFRoZSBvcHRpb25hbCBcdmFye2J1ZnNpemV9IGFyZ3VtZW50IHNwZWNpZmllcyB0aGUKLSAgZmlsZSdzIGRlc2lyZWQgYnVmZmVyIHNpemU6IDAgbWVhbnMgdW5idWZmZXJlZCwgMSBtZWFucyBsaW5lCi0gIGJ1ZmZlcmVkLCBhbnkgb3RoZXIgcG9zaXRpdmUgdmFsdWUgbWVhbnMgdXNlIGEgYnVmZmVyIG9mCi0gIChhcHByb3hpbWF0ZWx5KSB0aGF0IHNpemUuICBBIG5lZ2F0aXZlIFx2YXJ7YnVmc2l6ZX0gbWVhbnMgdG8gdXNlCi0gIHRoZSBzeXN0ZW0gZGVmYXVsdCwgd2hpY2ggaXMgdXN1YWxseSBsaW5lIGJ1ZmZlcmVkIGZvciB0dHkKLSAgZGV2aWNlcyBhbmQgZnVsbHkgYnVmZmVyZWQgZm9yIG90aGVyIGZpbGVzLiAgSWYgb21pdHRlZCwgdGhlIHN5c3RlbQotICBkZWZhdWx0IGlzIHVzZWQuXGZvb3Rub3RlewotICAgIFNwZWNpZnlpbmcgYSBidWZmZXIgc2l6ZSBjdXJyZW50bHkgaGFzIG5vIGVmZmVjdCBvbiBzeXN0ZW1zIHRoYXQKLSAgICBkb24ndCBoYXZlIFxjZnVuY3Rpb257c2V0dmJ1ZigpfS4gIFRoZSBpbnRlcmZhY2UgdG8gc3BlY2lmeSB0aGUKLSAgICBidWZmZXIgc2l6ZSBpcyBub3QgZG9uZSB1c2luZyBhIG1ldGhvZCB0aGF0IGNhbGxzCi0gICAgXGNmdW5jdGlvbntzZXR2YnVmKCl9LCBiZWNhdXNlIHRoYXQgbWF5IGR1bXAgY29yZSB3aGVuIGNhbGxlZAotICAgIGFmdGVyIGFueSBJL08gaGFzIGJlZW4gcGVyZm9ybWVkLCBhbmQgdGhlcmUncyBubyByZWxpYWJsZSB3YXkgdG8KLSAgICBkZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIHRoZSBjYXNlLn0KLQotICBNb2RlcyBcY29kZXsncisnfSwgXGNvZGV7J3crJ30gYW5kIFxjb2RleydhKyd9IG9wZW4gdGhlIGZpbGUgZm9yCi0gIHVwZGF0aW5nIChub3RlIHRoYXQgXGNvZGV7J3crJ30gdHJ1bmNhdGVzIHRoZSBmaWxlKS4gIEFwcGVuZAotICBcY29kZXsnYid9IHRvIHRoZSBtb2RlIHRvIG9wZW4gdGhlIGZpbGUgaW4gYmluYXJ5IG1vZGUsIG9uIHN5c3RlbXMKLSAgdGhhdCBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYmluYXJ5IGFuZCB0ZXh0IGZpbGVzOyBvbiBzeXN0ZW1zCi0gIHRoYXQgZG9uJ3QgaGF2ZSB0aGlzIGRpc3RpbmN0aW9uLCBhZGRpbmcgdGhlIFxjb2RleydiJ30gaGFzIG5vIGVmZmVjdC4KLSAgCi0gIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBcY2Z1bmN0aW9ue2ZvcGVuKCl9IHZhbHVlcyBcdmFye21vZGV9Ci0gIG1heSBiZSBcY29kZXsnVSd9IG9yIFxjb2RleydyVSd9LiAgUHl0aG9uIGlzIHVzdWFsbHkgYnVpbHQgd2l0aCB1bml2ZXJzYWwKLSAgbmV3bGluZSBzdXBwb3J0OyBzdXBwbHlpbmcgXGNvZGV7J1UnfSBvcGVucyB0aGUgZmlsZSBhcyBhIHRleHQgZmlsZSwgYnV0Ci0gIGxpbmVzIG1heSBiZSB0ZXJtaW5hdGVkIGJ5IGFueSBvZiB0aGUgZm9sbG93aW5nOiB0aGUgXFVOSVh7fSBlbmQtb2YtbGluZQotICBjb252ZW50aW9uIFxjb2RleydcZSBuJ30sIAotICB0aGUgTWFjaW50b3NoIGNvbnZlbnRpb24gXGNvZGV7J1xlIHInfSwgb3IgdGhlIFdpbmRvd3MKLSAgY29udmVudGlvbiBcY29kZXsnXGUgclxlIG4nfS4gQWxsIG9mIHRoZXNlIGV4dGVybmFsIHJlcHJlc2VudGF0aW9ucyBhcmUgc2VlbiBhcwotICBcY29kZXsnXGUgbid9Ci0gIGJ5IHRoZSBQeXRob24gcHJvZ3JhbS4gSWYgUHl0aG9uIGlzIGJ1aWx0IHdpdGhvdXQgdW5pdmVyc2FsIG5ld2xpbmUgc3VwcG9ydAotICBhIFx2YXJ7bW9kZX0gd2l0aCBcY29kZXsnVSd9IGlzIHRoZSBzYW1lIGFzIG5vcm1hbCB0ZXh0IG1vZGUuICBOb3RlIHRoYXQKLSAgZmlsZSBvYmplY3RzIHNvIG9wZW5lZCBhbHNvIGhhdmUgYW4gYXR0cmlidXRlIGNhbGxlZAotICBcbWVtYmVye25ld2xpbmVzfSB3aGljaCBoYXMgYSB2YWx1ZSBvZiBcY29kZXtOb25lfSAoaWYgbm8gbmV3bGluZXMKLSAgaGF2ZSB5ZXQgYmVlbiBzZWVuKSwgXGNvZGV7J1xlIG4nfSwgXGNvZGV7J1xlIHInfSwgXGNvZGV7J1xlIHJcZSBuJ30sCi0gIG9yIGEgdHVwbGUgY29udGFpbmluZyBhbGwgdGhlIG5ld2xpbmUgdHlwZXMgc2Vlbi4KLQotICBQeXRob24gZW5mb3JjZXMgdGhhdCB0aGUgbW9kZSwgYWZ0ZXIgc3RyaXBwaW5nIFxjb2RleydVJ30sIGJlZ2lucyB3aXRoCi0gIFxjb2RleydyJ30sIFxjb2Rleyd3J30gb3IgXGNvZGV7J2EnfS4KLQotICBcdmVyc2lvbmNoYW5nZWRbUmVzdHJpY3Rpb24gb24gZmlyc3QgbGV0dGVyIG9mIG1vZGUgc3RyaW5nCi0gICAgICAgICAgICAgICAgICBpbnRyb2R1Y2VkXXsyLjV9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e29yZH17Y30KLSAgR2l2ZW4gYSBzdHJpbmcgb2YgbGVuZ3RoIG9uZSwgcmV0dXJuIGFuIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZQotICBVbmljb2RlIGNvZGUgcG9pbnQgb2YgdGhlIGNoYXJhY3RlciB3aGVuIHRoZSBhcmd1bWVudCBpcyBhIHVuaWNvZGUgb2JqZWN0LAotICBvciB0aGUgdmFsdWUgb2YgdGhlIGJ5dGUgd2hlbiB0aGUgYXJndW1lbnQgaXMgYW4gOC1iaXQgc3RyaW5nLgotICBGb3IgZXhhbXBsZSwgXGNvZGV7b3JkKCdhJyl9IHJldHVybnMgdGhlIGludGVnZXIgXGNvZGV7OTd9LAotICBcY29kZXtvcmQodSdcZSB1MjAyMCcpfSByZXR1cm5zIFxjb2RlezgyMjR9LiAgVGhpcyBpcyB0aGUgaW52ZXJzZSBvZgotICBcZnVuY3Rpb257Y2hyKCl9IGZvciBzdHJpbmdzLgotICBJZiBQeXRob24gd2FzIGJ1aWx0IHdpdGgKLSAgVUNTMiBVbmljb2RlLCB0aGVuIHRoZSBjaGFyYWN0ZXIncyBjb2RlIHBvaW50IG11c3QgYmUgaW4gdGhlIHJhbmdlCi0gIFswLi42NTUzNV0gaW5jbHVzaXZlOyBvdGhlcndpc2UgdGhlIHN0cmluZyBsZW5ndGggaXMgdHdvLCBhbmQgYQotICBcZXhjZXB0aW9ue1R5cGVFcnJvcn0gd2lsbCBiZSByYWlzZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3Bvd317eCwgeVxvcHRpb25hbHssIHp9fQotICBSZXR1cm4gXHZhcnt4fSB0byB0aGUgcG93ZXIgXHZhcnt5fTsgaWYgXHZhcnt6fSBpcyBwcmVzZW50LCByZXR1cm4KLSAgXHZhcnt4fSB0byB0aGUgcG93ZXIgXHZhcnt5fSwgbW9kdWxvIFx2YXJ7en0gKGNvbXB1dGVkIG1vcmUKLSAgZWZmaWNpZW50bHkgdGhhbiBcY29kZXtwb3coXHZhcnt4fSwgXHZhcnt5fSkgXCVcIFx2YXJ7en19KS4KLSAgVGhlIHR3by1hcmd1bWVudCBmb3JtIFxjb2Rle3BvdyhcdmFye3h9LCBcdmFye3l9KX0gaXMgZXF1aXZhbGVudCB0byB1c2luZwotICB0aGUgcG93ZXIgb3BlcmF0b3I6IFxjb2Rle1x2YXJ7eH0qKlx2YXJ7eX19LgotICAKLSAgVGhlIGFyZ3VtZW50cyBtdXN0IGhhdmUgbnVtZXJpYyB0eXBlcy4gIFdpdGggbWl4ZWQgb3BlcmFuZCB0eXBlcywgdGhlCi0gIGNvZXJjaW9uIHJ1bGVzIGZvciBiaW5hcnkgYXJpdGhtZXRpYyBvcGVyYXRvcnMgYXBwbHkuICBGb3IgaW50IGFuZAotICBsb25nIGludCBvcGVyYW5kcywgdGhlIHJlc3VsdCBoYXMgdGhlIHNhbWUgdHlwZSBhcyB0aGUgb3BlcmFuZHMKLSAgKGFmdGVyIGNvZXJjaW9uKSB1bmxlc3MgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBuZWdhdGl2ZTsgaW4gdGhhdAotICBjYXNlLCBhbGwgYXJndW1lbnRzIGFyZSBjb252ZXJ0ZWQgdG8gZmxvYXQgYW5kIGEgZmxvYXQgcmVzdWx0IGlzCi0gIGRlbGl2ZXJlZC4gIEZvciBleGFtcGxlLCBcY29kZXsxMCoqMn0gcmV0dXJucyBcY29kZXsxMDB9LCBidXQKLSAgXGNvZGV7MTAqKi0yfSByZXR1cm5zIFxjb2RlezAuMDF9LiAgKFRoaXMgbGFzdCBmZWF0dXJlIHdhcyBhZGRlZCBpbgotICBQeXRob24gMi4yLiAgSW4gUHl0aG9uIDIuMSBhbmQgYmVmb3JlLCBpZiBib3RoIGFyZ3VtZW50cyB3ZXJlIG9mIGludGVnZXIKLSAgdHlwZXMgYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgd2FzIG5lZ2F0aXZlLCBhbiBleGNlcHRpb24gd2FzIHJhaXNlZC4pCi0gIElmIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgbmVnYXRpdmUsIHRoZSB0aGlyZCBhcmd1bWVudCBtdXN0IGJlIG9taXR0ZWQuCi0gIElmIFx2YXJ7en0gaXMgcHJlc2VudCwgXHZhcnt4fSBhbmQgXHZhcnt5fSBtdXN0IGJlIG9mIGludGVnZXIgdHlwZXMsCi0gIGFuZCBcdmFye3l9IG11c3QgYmUgbm9uLW5lZ2F0aXZlLiAgKFRoaXMgcmVzdHJpY3Rpb24gd2FzIGFkZGVkIGluCi0gIFB5dGhvbiAyLjIuICBJbiBQeXRob24gMi4xIGFuZCBiZWZvcmUsIGZsb2F0aW5nIDMtYXJndW1lbnQgXGNvZGV7cG93KCl9Ci0gIHJldHVybmVkIHBsYXRmb3JtLWRlcGVuZGVudCByZXN1bHRzIGRlcGVuZGluZyBvbiBmbG9hdGluZy1wb2ludAotICByb3VuZGluZyBhY2NpZGVudHMuKQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtwcm9wZXJ0eX17XG9wdGlvbmFse2ZnZXRcb3B0aW9uYWx7LCBmc2V0XG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkZWxcb3B0aW9uYWx7LCBkb2N9fX19fQotICBSZXR1cm4gYSBwcm9wZXJ0eSBhdHRyaWJ1dGUgZm9yIG5ldy1zdHlsZSBjbGFzc2VzIChjbGFzc2VzIHRoYXQKLSAgZGVyaXZlIGZyb20gXGNsYXNze29iamVjdH0pLgotCi0gIFx2YXJ7ZmdldH0gaXMgYSBmdW5jdGlvbiBmb3IgZ2V0dGluZyBhbiBhdHRyaWJ1dGUgdmFsdWUsIGxpa2V3aXNlCi0gIFx2YXJ7ZnNldH0gaXMgYSBmdW5jdGlvbiBmb3Igc2V0dGluZywgYW5kIFx2YXJ7ZmRlbH0gYSBmdW5jdGlvbgotICBmb3IgZGVsJ2luZywgYW4gYXR0cmlidXRlLiAgVHlwaWNhbCB1c2UgaXMgdG8gZGVmaW5lIGEgbWFuYWdlZCBhdHRyaWJ1dGUgeDoKLQotXGJlZ2lue3ZlcmJhdGltfQotY2xhc3MgQyhvYmplY3QpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmKTogc2VsZi5feCA9IE5vbmUKLSAgICBkZWYgZ2V0eChzZWxmKTogcmV0dXJuIHNlbGYuX3gKLSAgICBkZWYgc2V0eChzZWxmLCB2YWx1ZSk6IHNlbGYuX3ggPSB2YWx1ZQotICAgIGRlZiBkZWx4KHNlbGYpOiBkZWwgc2VsZi5feAotICAgIHggPSBwcm9wZXJ0eShnZXR4LCBzZXR4LCBkZWx4LCAiSSdtIHRoZSAneCcgcHJvcGVydHkuIikKLVxlbmR7dmVyYmF0aW19Ci0KLSAgSWYgZ2l2ZW4sIFx2YXJ7ZG9jfSB3aWxsIGJlIHRoZSBkb2NzdHJpbmcgb2YgdGhlIHByb3BlcnR5IGF0dHJpYnV0ZS4KLSAgT3RoZXJ3aXNlLCB0aGUgcHJvcGVydHkgd2lsbCBjb3B5IFx2YXJ7ZmdldH0ncyBkb2NzdHJpbmcgKGlmIGl0Ci0gIGV4aXN0cykuICBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGNyZWF0ZSByZWFkLW9ubHkgcHJvcGVydGllcwotICBlYXNpbHkgdXNpbmcgXGZ1bmN0aW9ue3Byb3BlcnR5KCl9IGFzIGEgZGVjb3JhdG9yOgotCi1cYmVnaW57dmVyYmF0aW19Ci1jbGFzcyBQYXJyb3Qob2JqZWN0KToKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYuX3ZvbHRhZ2UgPSAxMDAwMDAKLQotICAgIEBwcm9wZXJ0eQotICAgIGRlZiB2b2x0YWdlKHNlbGYpOgotICAgICAgICAiIiJHZXQgdGhlIGN1cnJlbnQgdm9sdGFnZS4iIiIKLSAgICAgICAgcmV0dXJuIHNlbGYuX3ZvbHRhZ2UKLVxlbmR7dmVyYmF0aW19Ci0KLSAgdHVybnMgdGhlIFxtZXRob2R7dm9sdGFnZSgpfSBtZXRob2QgaW50byBhIGBgZ2V0dGVyJycgZm9yIGEgcmVhZC1vbmx5Ci0gIGF0dHJpYnV0ZSB3aXRoIHRoZSBzYW1lIG5hbWUuCi0KLSAgXHZlcnNpb25hZGRlZHsyLjJ9Ci0gIFx2ZXJzaW9uY2hhbmdlZFtVc2UgXHZhcntmZ2V0fSdzIGRvY3N0cmluZyBpZiBubyBcdmFye2RvY30gZ2l2ZW5dezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cmFuZ2V9e1xvcHRpb25hbHtzdGFydCx9IHN0b3Bcb3B0aW9uYWx7LCBzdGVwfX0KLSAgVGhpcyBpcyBhIHZlcnNhdGlsZSBmdW5jdGlvbiB0byBjcmVhdGUgc2VxdWVuY2VzIGNvbnRhaW5pbmcgYXJpdGhtZXRpYwotICBwcm9ncmVzc2lvbnMuICBJdCBpcyBtb3N0IG9mdGVuIHVzZWQgaW4gXGtleXdvcmR7Zm9yfSBsb29wcy4gIFRoZQotICBhcmd1bWVudHMgbXVzdCBiZSBwbGFpbiBpbnRlZ2Vycy4gIElmIHRoZSBcdmFye3N0ZXB9IGFyZ3VtZW50IGlzCi0gIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIFxjb2RlezF9LiAgSWYgdGhlIFx2YXJ7c3RhcnR9IGFyZ3VtZW50IGlzCi0gIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIFxjb2RlezB9LiAgVGhlIGZ1bGwgZm9ybSByZXR1cm5zIGEgbGlzdCBvZgotICBwbGFpbiBpbnRlZ2VycyBcY29kZXtbXHZhcntzdGFydH0sIFx2YXJ7c3RhcnR9ICsgXHZhcntzdGVwfSwKLSAgXHZhcntzdGFydH0gKyAyICogXHZhcntzdGVwfSwgXGxkb3RzXX0uICBJZiBcdmFye3N0ZXB9IGlzIHBvc2l0aXZlLAotICB0aGUgbGFzdCBlbGVtZW50IGlzIHRoZSBsYXJnZXN0IFxjb2Rle1x2YXJ7c3RhcnR9ICsgXHZhcntpfSAqCi0gIFx2YXJ7c3RlcH19IGxlc3MgdGhhbiBcdmFye3N0b3B9OyBpZiBcdmFye3N0ZXB9IGlzIG5lZ2F0aXZlLCB0aGUgbGFzdAotICBlbGVtZW50IGlzIHRoZSBzbWFsbGVzdCBcY29kZXtcdmFye3N0YXJ0fSArIFx2YXJ7aX0gKiBcdmFye3N0ZXB9fQotICBncmVhdGVyIHRoYW4gXHZhcntzdG9wfS4gIFx2YXJ7c3RlcH0gbXVzdCBub3QgYmUgemVybyAob3IgZWxzZQotICBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IGlzIHJhaXNlZCkuICBFeGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gbGlzdChyYW5nZSgxMCkpCi1bMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOV0KLT4+PiBsaXN0KHJhbmdlKDEsIDExKSkKLVsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMF0KLT4+PiBsaXN0KHJhbmdlKDAsIDMwLCA1KSkKLVswLCA1LCAxMCwgMTUsIDIwLCAyNV0KLT4+PiBsaXN0KHJhbmdlKDAsIDEwLCAzKSkKLVswLCAzLCA2LCA5XQotPj4+IGxpc3QocmFuZ2UoMCwgLTEwLCAtMSkpCi1bMCwgLTEsIC0yLCAtMywgLTQsIC01LCAtNiwgLTcsIC04LCAtOV0KLT4+PiBsaXN0KHJhbmdlKDApKQotW10KLT4+PiBsaXN0KHJhbmdlKDEsIDApKQotW10KLVxlbmR7dmVyYmF0aW19Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3JlcHJ9e29iamVjdH0KLSAgUmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LgotICBUaGlzIGlzIHRoZSBzYW1lIHZhbHVlIHlpZWxkZWQgYnkgY29udmVyc2lvbnMgKHJldmVyc2UgcXVvdGVzKS4KLSAgSXQgaXMgc29tZXRpbWVzIHVzZWZ1bCB0byBiZSBhYmxlIHRvIGFjY2VzcyB0aGlzIG9wZXJhdGlvbiBhcyBhbgotICBvcmRpbmFyeSBmdW5jdGlvbi4gIEZvciBtYW55IHR5cGVzLCB0aGlzIGZ1bmN0aW9uIG1ha2VzIGFuIGF0dGVtcHQKLSAgdG8gcmV0dXJuIGEgc3RyaW5nIHRoYXQgd291bGQgeWllbGQgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgdmFsdWUKLSAgd2hlbiBwYXNzZWQgdG8gXGZ1bmN0aW9ue2V2YWwoKX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3JldmVyc2VkfXtzZXF9Ci0gIFJldHVybiBhIHJldmVyc2UgaXRlcmF0b3IuICBcdmFye3NlcX0gbXVzdCBiZSBhbiBvYmplY3Qgd2hpY2gKLSAgc3VwcG9ydHMgdGhlIHNlcXVlbmNlIHByb3RvY29sICh0aGUgXG1ldGhvZHtfX2xlbl9fKCl9IG1ldGhvZCBhbmQgdGhlCi0gIFxtZXRob2R7X19nZXRpdGVtX18oKX0gbWV0aG9kIHdpdGggaW50ZWdlciBhcmd1bWVudHMgc3RhcnRpbmcgYXQKLSAgXGNvZGV7MH0pLgotICBcdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cm91bmR9e3hcb3B0aW9uYWx7LCBufX0KLSAgUmV0dXJuIHRoZSBmbG9hdGluZyBwb2ludCB2YWx1ZSBcdmFye3h9IHJvdW5kZWQgdG8gXHZhcntufSBkaWdpdHMKLSAgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQuICBJZiBcdmFye259IGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIHplcm8uCi0gIFRoZSByZXN1bHQgaXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIuICBWYWx1ZXMgYXJlIHJvdW5kZWQgdG8gdGhlCi0gIGNsb3Nlc3QgbXVsdGlwbGUgb2YgMTAgdG8gdGhlIHBvd2VyIG1pbnVzIFx2YXJ7bn07IGlmIHR3byBtdWx0aXBsZXMKLSAgYXJlIGVxdWFsbHkgY2xvc2UsIHJvdW5kaW5nIGlzIGRvbmUgYXdheSBmcm9tIDAgKHNvLiBmb3IgZXhhbXBsZSwKLSAgXGNvZGV7cm91bmQoMC41KX0gaXMgXGNvZGV7MS4wfSBhbmQgXGNvZGV7cm91bmQoLTAuNSl9IGlzIFxjb2Rley0xLjB9KS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c2V0fXtcb3B0aW9uYWx7aXRlcmFibGV9fQotICBSZXR1cm4gYSBzZXQgd2hvc2UgZWxlbWVudHMgYXJlIHRha2VuIGZyb20gXHZhcntpdGVyYWJsZX0uICBUaGUgZWxlbWVudHMKLSAgbXVzdCBiZSBpbW11dGFibGUuICBUbyByZXByZXNlbnQgc2V0cyBvZiBzZXRzLCB0aGUgaW5uZXIgc2V0cyBzaG91bGQKLSAgYmUgXGNsYXNze2Zyb3plbnNldH0gb2JqZWN0cy4gIElmIFx2YXJ7aXRlcmFibGV9IGlzIG5vdCBzcGVjaWZpZWQsCi0gIHJldHVybnMgYSBuZXcgZW1wdHkgc2V0LCBcY29kZXtzZXQoW10pfS4KLSAgXHZlcnNpb25hZGRlZHsyLjR9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NldGF0dHJ9e29iamVjdCwgbmFtZSwgdmFsdWV9Ci0gIFRoaXMgaXMgdGhlIGNvdW50ZXJwYXJ0IG9mIFxmdW5jdGlvbntnZXRhdHRyKCl9LiAgVGhlIGFyZ3VtZW50cyBhcmUgYW4KLSAgb2JqZWN0LCBhIHN0cmluZyBhbmQgYW4gYXJiaXRyYXJ5IHZhbHVlLiAgVGhlIHN0cmluZyBtYXkgbmFtZSBhbgotICBleGlzdGluZyBhdHRyaWJ1dGUgb3IgYSBuZXcgYXR0cmlidXRlLiAgVGhlIGZ1bmN0aW9uIGFzc2lnbnMgdGhlCi0gIHZhbHVlIHRvIHRoZSBhdHRyaWJ1dGUsIHByb3ZpZGVkIHRoZSBvYmplY3QgYWxsb3dzIGl0LiAgRm9yIGV4YW1wbGUsCi0gIFxjb2Rle3NldGF0dHIoXHZhcnt4fSwgJ1x2YXJ7Zm9vYmFyfScsIDEyMyl9IGlzIGVxdWl2YWxlbnQgdG8KLSAgXGNvZGV7XHZhcnt4fS5cdmFye2Zvb2Jhcn0gPSAxMjN9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzbGljZX17XG9wdGlvbmFse3N0YXJ0LH0gc3RvcFxvcHRpb25hbHssIHN0ZXB9fQotICBSZXR1cm4gYSBzbGljZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXQgb2YgaW5kaWNlcyBzcGVjaWZpZWQgYnkKLSAgXGNvZGV7cmFuZ2UoXHZhcntzdGFydH0sIFx2YXJ7c3RvcH0sIFx2YXJ7c3RlcH0pfS4gIFRoZSBcdmFye3N0YXJ0fQotICBhbmQgXHZhcntzdGVwfSBhcmd1bWVudHMgZGVmYXVsdCB0byBcY29kZXtOb25lfS4gIFNsaWNlIG9iamVjdHMgaGF2ZQotICByZWFkLW9ubHkgZGF0YSBhdHRyaWJ1dGVzIFxtZW1iZXJ7c3RhcnR9LCBcbWVtYmVye3N0b3B9IGFuZAotICBcbWVtYmVye3N0ZXB9IHdoaWNoIG1lcmVseSByZXR1cm4gdGhlIGFyZ3VtZW50IHZhbHVlcyAob3IgdGhlaXIKLSAgZGVmYXVsdCkuICBUaGV5IGhhdmUgbm8gb3RoZXIgZXhwbGljaXQgZnVuY3Rpb25hbGl0eTsgaG93ZXZlciB0aGV5Ci0gIGFyZSB1c2VkIGJ5IE51bWVyaWNhbCBQeXRob25caW5kZXh7TnVtZXJpY2FsIFB5dGhvbn0gYW5kIG90aGVyIHRoaXJkCi0gIHBhcnR5IGV4dGVuc2lvbnMuICBTbGljZSBvYmplY3RzIGFyZSBhbHNvIGdlbmVyYXRlZCB3aGVuIGV4dGVuZGVkCi0gIGluZGV4aW5nIHN5bnRheCBpcyB1c2VkLiAgRm9yIGV4YW1wbGU6IFxzYW1we2Fbc3RhcnQ6c3RvcDpzdGVwXX0gb3IKLSAgXHNhbXB7YVtzdGFydDpzdG9wLCBpXX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NvcnRlZH17aXRlcmFibGVcb3B0aW9uYWx7LCBjbXBcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgIGtleVxvcHRpb25hbHssIHJldmVyc2V9fX19Ci0gIFJldHVybiBhIG5ldyBzb3J0ZWQgbGlzdCBmcm9tIHRoZSBpdGVtcyBpbiBcdmFye2l0ZXJhYmxlfS4KLQotICBUaGUgb3B0aW9uYWwgYXJndW1lbnRzIFx2YXJ7Y21wfSwgXHZhcntrZXl9LCBhbmQgXHZhcntyZXZlcnNlfSBoYXZlCi0gIHRoZSBzYW1lIG1lYW5pbmcgYXMgdGhvc2UgZm9yIHRoZSBcbWV0aG9ke2xpc3Quc29ydCgpfSBtZXRob2QKLSAgKGRlc2NyaWJlZCBpbiBzZWN0aW9uflxyZWZ7dHlwZXNzZXEtbXV0YWJsZX0pLgotCi0gIFx2YXJ7Y21wfSBzcGVjaWZpZXMgYSBjdXN0b20gY29tcGFyaXNvbiBmdW5jdGlvbiBvZiB0d28gYXJndW1lbnRzCi0gIChpdGVyYWJsZSBlbGVtZW50cykgd2hpY2ggc2hvdWxkIHJldHVybiBhIG5lZ2F0aXZlLCB6ZXJvIG9yIHBvc2l0aXZlCi0gIG51bWJlciBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgZmlyc3QgYXJndW1lbnQgaXMgY29uc2lkZXJlZCBzbWFsbGVyCi0gIHRoYW4sIGVxdWFsIHRvLCBvciBsYXJnZXIgdGhhbiB0aGUgc2Vjb25kIGFyZ3VtZW50OgotICBcc2FtcHtcdmFye2NtcH09XGtleXdvcmR7bGFtYmRhfSBcdmFye3h9LFx2YXJ7eX06Ci0gIFxmdW5jdGlvbntjbXB9KHgubG93ZXIoKSwgeS5sb3dlcigpKX0KLSAgICAgCi0gIFx2YXJ7a2V5fSBzcGVjaWZpZXMgYSBmdW5jdGlvbiBvZiBvbmUgYXJndW1lbnQgdGhhdCBpcyB1c2VkIHRvCi0gICAgIGV4dHJhY3QgYSBjb21wYXJpc29uIGtleSBmcm9tIGVhY2ggbGlzdCBlbGVtZW50OgotICAgICBcc2FtcHtcdmFye2tleX09XGZ1bmN0aW9ue3N0ci5sb3dlcn19Ci0KLSAgXHZhcntyZXZlcnNlfSBpcyBhIGJvb2xlYW4gdmFsdWUuICBJZiBzZXQgdG8gXGNvZGV7VHJ1ZX0sIHRoZW4gdGhlCi0gICAgIGxpc3QgZWxlbWVudHMgYXJlIHNvcnRlZCBhcyBpZiBlYWNoIGNvbXBhcmlzb24gd2VyZSByZXZlcnNlZC4KLQotICBJbiBnZW5lcmFsLCB0aGUgXHZhcntrZXl9IGFuZCBcdmFye3JldmVyc2V9IGNvbnZlcnNpb24gcHJvY2Vzc2VzIGFyZQotICBtdWNoIGZhc3RlciB0aGFuIHNwZWNpZnlpbmcgYW4gZXF1aXZhbGVudCBcdmFye2NtcH0gZnVuY3Rpb24uICBUaGlzIGlzCi0gIGJlY2F1c2UgXHZhcntjbXB9IGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgZWFjaCBsaXN0IGVsZW1lbnQgd2hpbGUKLSAgXHZhcntrZXl9IGFuZCBcdmFye3JldmVyc2V9IHRvdWNoIGVhY2ggZWxlbWVudCBvbmx5IG9uY2UuCi0KLSAgXHZlcnNpb25hZGRlZHsyLjR9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3N0YXRpY21ldGhvZH17ZnVuY3Rpb259Ci0gIFJldHVybiBhIHN0YXRpYyBtZXRob2QgZm9yIFx2YXJ7ZnVuY3Rpb259LgotCi0gIEEgc3RhdGljIG1ldGhvZCBkb2VzIG5vdCByZWNlaXZlIGFuIGltcGxpY2l0IGZpcnN0IGFyZ3VtZW50LgotICBUbyBkZWNsYXJlIGEgc3RhdGljIG1ldGhvZCwgdXNlIHRoaXMgaWRpb206Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWNsYXNzIEM6Ci0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBmKGFyZzEsIGFyZzIsIC4uLik6IC4uLgotXGVuZHt2ZXJiYXRpbX0KLQotICBUaGUgXGNvZGV7QHN0YXRpY21ldGhvZH0gZm9ybSBpcyBhIGZ1bmN0aW9uIGRlY29yYXRvciAtLSBzZWUgdGhlIGRlc2NyaXB0aW9uCi0gIG9mIGZ1bmN0aW9uIGRlZmluaXRpb25zIGluIGNoYXB0ZXIgNyBvZiB0aGUKLSAgXGNpdGV0aXRsZVsuLi9yZWYvZnVuY3Rpb24uaHRtbF17UHl0aG9uIFJlZmVyZW5jZSBNYW51YWx9IGZvciBkZXRhaWxzLgotCi0gIEl0IGNhbiBiZSBjYWxsZWQgZWl0aGVyIG9uIHRoZSBjbGFzcyAoc3VjaCBhcyBcY29kZXtDLmYoKX0pIG9yIG9uIGFuCi0gIGluc3RhbmNlIChzdWNoIGFzIFxjb2Rle0MoKS5mKCl9KS4gIFRoZSBpbnN0YW5jZSBpcyBpZ25vcmVkIGV4Y2VwdAotICBmb3IgaXRzIGNsYXNzLgotCi0gIFN0YXRpYyBtZXRob2RzIGluIFB5dGhvbiBhcmUgc2ltaWxhciB0byB0aG9zZSBmb3VuZCBpbiBKYXZhIG9yIFxDcHAuCi0gIEZvciBhIG1vcmUgYWR2YW5jZWQgY29uY2VwdCwgc2VlIFxmdW5jdGlvbntjbGFzc21ldGhvZCgpfSBpbiB0aGlzCi0gIHNlY3Rpb24uCi0gIAotICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBzdGF0aWMgbWV0aG9kcywgY29uc3VsdCB0aGUgZG9jdW1lbnRhdGlvbiBvbiB0aGUKLSAgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkgaW4gY2hhcHRlciAzIG9mIHRoZQotICBcY2l0ZXRpdGxlWy4uL3JlZi90eXBlcy5odG1sXXtQeXRob24gUmVmZXJlbmNlIE1hbnVhbH0gKGF0IHRoZSBib3R0b20pLgotICBcdmVyc2lvbmFkZGVkezIuMn0KLSAgXHZlcnNpb25jaGFuZ2VkW0Z1bmN0aW9uIGRlY29yYXRvciBzeW50YXggYWRkZWRdezIuNH0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c3RyfXtcb3B0aW9uYWx7b2JqZWN0XG9wdGlvbmFseywgZW5jb2RpbmcKLQkJCQlcb3B0aW9uYWx7LCBlcnJvcnN9fX19Ci0gIFJldHVybiB0aGUgVW5pY29kZSBzdHJpbmcgdmVyc2lvbiBvZiBcdmFye29iamVjdH0gdXNpbmcgb25lIG9mIHRoZQotICBmb2xsb3dpbmcgbW9kZXM6Ci0KLSAgSWYgXHZhcntlbmNvZGluZ30gYW5kL29yIFx2YXJ7ZXJyb3JzfSBhcmUgZ2l2ZW4sIFxjb2Rle3VuaWNvZGUoKX0KLSAgd2lsbCBkZWNvZGUgdGhlIG9iamVjdCB3aGljaCBjYW4gZWl0aGVyIGJlIGFuIDgtYml0IHN0cmluZyBvciBhCi0gIGNoYXJhY3RlciBidWZmZXIgdXNpbmcgdGhlIGNvZGVjIGZvciBcdmFye2VuY29kaW5nfS4gVGhlCi0gIFx2YXJ7ZW5jb2Rpbmd9IHBhcmFtZXRlciBpcyBhIHN0cmluZyBnaXZpbmcgdGhlIG5hbWUgb2YgYW4gZW5jb2Rpbmc7Ci0gIGlmIHRoZSBlbmNvZGluZyBpcyBub3Qga25vd24sIFxleGNlcHRpb257TG9va3VwRXJyb3J9IGlzIHJhaXNlZC4KLSAgRXJyb3IgaGFuZGxpbmcgaXMgZG9uZSBhY2NvcmRpbmcgdG8gXHZhcntlcnJvcnN9OyB0aGlzIHNwZWNpZmllcyB0aGUKLSAgdHJlYXRtZW50IG9mIGNoYXJhY3RlcnMgd2hpY2ggYXJlIGludmFsaWQgaW4gdGhlIGlucHV0IGVuY29kaW5nLiAgSWYKLSAgXHZhcntlcnJvcnN9IGlzIFxjb2RleydzdHJpY3QnfSAodGhlIGRlZmF1bHQpLCBhCi0gIFxleGNlcHRpb257VmFsdWVFcnJvcn0gaXMgcmFpc2VkIG9uIGVycm9ycywgd2hpbGUgYSB2YWx1ZSBvZgotICBcY29kZXsnaWdub3JlJ30gY2F1c2VzIGVycm9ycyB0byBiZSBzaWxlbnRseSBpZ25vcmVkLCBhbmQgYSB2YWx1ZSBvZgotICBcY29kZXsncmVwbGFjZSd9IGNhdXNlcyB0aGUgb2ZmaWNpYWwgVW5pY29kZSByZXBsYWNlbWVudCBjaGFyYWN0ZXIsCi0gIFxjb2Rle1UrRkZGRH0sIHRvIGJlIHVzZWQgdG8gcmVwbGFjZSBpbnB1dCBjaGFyYWN0ZXJzIHdoaWNoIGNhbm5vdAotICBiZSBkZWNvZGVkLiAgU2VlIGFsc28gdGhlIFxyZWZtb2R1bGV7Y29kZWNzfSBtb2R1bGUuCi0KLSAgSWYgbm8gb3B0aW9uYWwgcGFyYW1ldGVycyBhcmUgZ2l2ZW4sIFxjb2Rle3VuaWNvZGUoKX0gd2lsbCBtaW1pYyB0aGUKLSAgYmVoYXZpb3VyIG9mIFxjb2Rle3N0cigpfSBleGNlcHQgdGhhdCBpdCByZXR1cm5zIFVuaWNvZGUgc3RyaW5ncwotICBpbnN0ZWFkIG9mIDgtYml0IHN0cmluZ3MuIE1vcmUgcHJlY2lzZWx5LCBpZiBcdmFye29iamVjdH0gaXMgYQotICBVbmljb2RlIHN0cmluZyBvciBzdWJjbGFzcyBpdCB3aWxsIHJldHVybiB0aGF0IFVuaWNvZGUgc3RyaW5nIHdpdGhvdXQKLSAgYW55IGFkZGl0aW9uYWwgZGVjb2RpbmcgYXBwbGllZC4KLQotICBGb3Igb2JqZWN0cyB3aGljaCBwcm92aWRlIGEgXG1ldGhvZHtfX3VuaWNvZGVfXygpfSBtZXRob2QsIGl0IHdpbGwKLSAgY2FsbCB0aGlzIG1ldGhvZCB3aXRob3V0IGFyZ3VtZW50cyB0byBjcmVhdGUgYSBVbmljb2RlIHN0cmluZy4gRm9yCi0gIGFsbCBvdGhlciBvYmplY3RzLCB0aGUgOC1iaXQgc3RyaW5nIHZlcnNpb24gb3IgcmVwcmVzZW50YXRpb24gaXMKLSAgcmVxdWVzdGVkIGFuZCB0aGVuIGNvbnZlcnRlZCB0byBhIFVuaWNvZGUgc3RyaW5nIHVzaW5nIHRoZSBjb2RlYyBmb3IKLSAgdGhlIGRlZmF1bHQgZW5jb2RpbmcgaW4gXGNvZGV7J3N0cmljdCd9IG1vZGUuCi0KLSAgXHZlcnNpb25hZGRlZHsyLjB9Ci0gIFx2ZXJzaW9uY2hhbmdlZFtTdXBwb3J0IGZvciBcbWV0aG9ke19fdW5pY29kZV9fKCl9IGFkZGVkXXsyLjJ9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3N1bX17aXRlcmFibGVcb3B0aW9uYWx7LCBzdGFydH19Ci0gIFN1bXMgXHZhcntzdGFydH0gYW5kIHRoZSBpdGVtcyBvZiBhbiBcdmFye2l0ZXJhYmxlfSBmcm9tIGxlZnQgdG8KLSAgcmlnaHQgYW5kIHJldHVybnMgdGhlIHRvdGFsLiAgXHZhcntzdGFydH0gZGVmYXVsdHMgdG8gXGNvZGV7MH0uCi0gIFRoZSBcdmFye2l0ZXJhYmxlfSdzIGl0ZW1zIGFyZSBub3JtYWxseSBudW1iZXJzLCBhbmQgYXJlIG5vdCBhbGxvd2VkCi0gIHRvIGJlIHN0cmluZ3MuICBUaGUgZmFzdCwgY29ycmVjdCB3YXkgdG8gY29uY2F0ZW5hdGUgYSBzZXF1ZW5jZSBvZgotICBzdHJpbmdzIGlzIGJ5IGNhbGxpbmcgXGNvZGV7Jycuam9pbihcdmFye3NlcXVlbmNlfSl9LgotICBcdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c3VwZXJ9e3R5cGVcb3B0aW9uYWx7LCBvYmplY3Qtb3ItdHlwZX19Ci0gIFJldHVybiB0aGUgc3VwZXJjbGFzcyBvZiBcdmFye3R5cGV9LiAgSWYgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBvbWl0dGVkCi0gIHRoZSBzdXBlciBvYmplY3QgcmV0dXJuZWQgaXMgdW5ib3VuZC4gIElmIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgYW4KLSAgb2JqZWN0LCBcY29kZXtpc2luc3RhbmNlKFx2YXJ7b2JqfSwgXHZhcnt0eXBlfSl9IG11c3QgYmUgdHJ1ZS4gIElmCi0gIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgYSB0eXBlLCBcY29kZXtpc3N1YmNsYXNzKFx2YXJ7dHlwZTJ9LAotICBcdmFye3R5cGV9KX0gbXVzdCBiZSB0cnVlLgotICBcZnVuY3Rpb257c3VwZXIoKX0gb25seSB3b3JrcyBmb3IgbmV3LXN0eWxlIGNsYXNzZXMuCi0KLSAgQSB0eXBpY2FsIHVzZSBmb3IgY2FsbGluZyBhIGNvb3BlcmF0aXZlIHN1cGVyY2xhc3MgbWV0aG9kIGlzOgotXGJlZ2lue3ZlcmJhdGltfQotY2xhc3MgQyhCKToKLSAgICBkZWYgbWV0aChzZWxmLCBhcmcpOgotICAgICAgICBzdXBlcihDLCBzZWxmKS5tZXRoKGFyZykKLVxlbmR7dmVyYmF0aW19Ci0KLSAgTm90ZSB0aGF0IFxmdW5jdGlvbntzdXBlcn0gaXMgaW1wbGVtZW50ZWQgYXMgcGFydCBvZiB0aGUgYmluZGluZyBwcm9jZXNzIGZvcgotICBleHBsaWNpdCBkb3R0ZWQgYXR0cmlidXRlIGxvb2t1cHMgc3VjaCBhcwotICBcc2FtcHtzdXBlcihDLCBzZWxmKS5fX2dldGl0ZW1fXyhuYW1lKX0uICBBY2NvcmRpbmdseSwgXGZ1bmN0aW9ue3N1cGVyfSBpcwotICB1bmRlZmluZWQgZm9yIGltcGxpY2l0IGxvb2t1cHMgdXNpbmcgc3RhdGVtZW50cyBvciBvcGVyYXRvcnMgc3VjaCBhcwotICBcc2FtcHtzdXBlcihDLCBzZWxmKVtuYW1lXX0uCi1cdmVyc2lvbmFkZGVkezIuMn0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dHVwbGV9e1xvcHRpb25hbHtpdGVyYWJsZX19Ci0gIFJldHVybiBhIHR1cGxlIHdob3NlIGl0ZW1zIGFyZSB0aGUgc2FtZSBhbmQgaW4gdGhlIHNhbWUgb3JkZXIgYXMKLSAgXHZhcntpdGVyYWJsZX0ncyBpdGVtcy4gIFx2YXJ7aXRlcmFibGV9IG1heSBiZSBhIHNlcXVlbmNlLCBhCi0gIGNvbnRhaW5lciB0aGF0IHN1cHBvcnRzIGl0ZXJhdGlvbiwgb3IgYW4gaXRlcmF0b3Igb2JqZWN0LgotICBJZiBcdmFye2l0ZXJhYmxlfSBpcyBhbHJlYWR5IGEgdHVwbGUsIGl0Ci0gIGlzIHJldHVybmVkIHVuY2hhbmdlZC4gIEZvciBpbnN0YW5jZSwgXGNvZGV7dHVwbGUoJ2FiYycpfSByZXR1cm5zCi0gIFxjb2RleygnYScsICdiJywgJ2MnKX0gYW5kIFxjb2Rle3R1cGxlKFsxLCAyLCAzXSl9IHJldHVybnMKLSAgXGNvZGV7KDEsIDIsIDMpfS4gIElmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCByZXR1cm5zIGEgbmV3IGVtcHR5Ci0gIHR1cGxlLCBcY29kZXsoKX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3R5cGV9e29iamVjdH0KLSAgUmV0dXJuIHRoZSB0eXBlIG9mIGFuIFx2YXJ7b2JqZWN0fS4gIFRoZSByZXR1cm4gdmFsdWUgaXMgYQotICB0eXBlXG9iaW5kZXh7dHlwZX0gb2JqZWN0LiAgVGhlIFxmdW5jdGlvbntpc2luc3RhbmNlKCl9IGJ1aWx0LWluCi0gIGZ1bmN0aW9uIGlzIHJlY29tbWVuZGVkIGZvciB0ZXN0aW5nIHRoZSB0eXBlIG9mIGFuIG9iamVjdC4KLQotICBXaXRoIHRocmVlIGFyZ3VtZW50cywgXGZ1bmN0aW9ue3R5cGV9IGZ1bmN0aW9ucyBhcyBhIGNvbnN0cnVjdG9yCi0gIGFzIGRldGFpbGVkIGJlbG93LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjbml9e3R5cGV9e25hbWUsIGJhc2VzLCBkaWN0fQotICBSZXR1cm4gYSBuZXcgdHlwZSBvYmplY3QuICBUaGlzIGlzIGVzc2VudGlhbGx5IGEgZHluYW1pYyBmb3JtIG9mIHRoZQotICBca2V5d29yZHtjbGFzc30gc3RhdGVtZW50LiBUaGUgXHZhcntuYW1lfSBzdHJpbmcgaXMgdGhlIGNsYXNzIG5hbWUKLSAgYW5kIGJlY29tZXMgdGhlIFxtZW1iZXJ7X19uYW1lX199IGF0dHJpYnV0ZTsgdGhlIFx2YXJ7YmFzZXN9IHR1cGxlCi0gIGl0ZW1pemVzIHRoZSBiYXNlIGNsYXNzZXMgYW5kIGJlY29tZXMgdGhlIFxtZW1iZXJ7X19iYXNlc19ffQotICBhdHRyaWJ1dGU7IGFuZCB0aGUgXHZhcntkaWN0fSBkaWN0aW9uYXJ5IGlzIHRoZSBuYW1lc3BhY2UgY29udGFpbmluZwotICBkZWZpbml0aW9ucyBmb3IgY2xhc3MgYm9keSBhbmQgYmVjb21lcyB0aGUgXG1lbWJlcntfX2RpY3RfX30KLSAgYXR0cmlidXRlLiAgRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgdHdvIHN0YXRlbWVudHMgY3JlYXRlCi0gIGlkZW50aWNhbCBcY2xhc3N7dHlwZX0gb2JqZWN0czoKLQotXGJlZ2lue3ZlcmJhdGltfQotICA+Pj4gY2xhc3MgWChvYmplY3QpOgotICAuLi4gICAgIGEgPSAxCi0gIC4uLiAgICAgCi0gID4+PiBYID0gdHlwZSgnWCcsIChvYmplY3QsKSwgZGljdChhPTEpKQotXGVuZHt2ZXJiYXRpbX0KLVx2ZXJzaW9uYWRkZWR7Mi4yfSAgICAgICAgICAKLVxlbmR7ZnVuY2Rlc2NuaX0KLQotXGJlZ2lue2Z1bmNkZXNjfXt2YXJzfXtcb3B0aW9uYWx7b2JqZWN0fX0KLSAgV2l0aG91dCBhcmd1bWVudHMsIHJldHVybiBhIGRpY3Rpb25hcnkgY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmVudAotICBsb2NhbCBzeW1ib2wgdGFibGUuICBXaXRoIGEgbW9kdWxlLCBjbGFzcyBvciBjbGFzcyBpbnN0YW5jZSBvYmplY3QKLSAgYXMgYXJndW1lbnQgKG9yIGFueXRoaW5nIGVsc2UgdGhhdCBoYXMgYSBcbWVtYmVye19fZGljdF9ffQotICBhdHRyaWJ1dGUpLCByZXR1cm5zIGEgZGljdGlvbmFyeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBvYmplY3QncwotICBzeW1ib2wgdGFibGUuICBUaGUgcmV0dXJuZWQgZGljdGlvbmFyeSBzaG91bGQgbm90IGJlIG1vZGlmaWVkOiB0aGUKLSAgZWZmZWN0cyBvbiB0aGUgY29ycmVzcG9uZGluZyBzeW1ib2wgdGFibGUgYXJlIHVuZGVmaW5lZC5cZm9vdG5vdGV7Ci0gICAgSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIGxvY2FsIHZhcmlhYmxlIGJpbmRpbmdzIGNhbm5vdAotICAgIG5vcm1hbGx5IGJlIGFmZmVjdGVkIHRoaXMgd2F5LCBidXQgdmFyaWFibGVzIHJldHJpZXZlZCBmcm9tCi0gICAgb3RoZXIgc2NvcGVzIChzdWNoIGFzIG1vZHVsZXMpIGNhbiBiZS4gIFRoaXMgbWF5IGNoYW5nZS59Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3ppcH17XG9wdGlvbmFse2l0ZXJhYmxlLCBcbW9yZWFyZ3N9fQotICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBsaXN0IG9mIHR1cGxlcywgd2hlcmUgdGhlIFx2YXJ7aX0tdGggdHVwbGUgY29udGFpbnMKLSAgdGhlIFx2YXJ7aX0tdGggZWxlbWVudCBmcm9tIGVhY2ggb2YgdGhlIGFyZ3VtZW50IHNlcXVlbmNlcyBvciBpdGVyYWJsZXMuCi0gIFRoZSByZXR1cm5lZCBsaXN0IGlzIHRydW5jYXRlZCBpbiBsZW5ndGggdG8gdGhlIGxlbmd0aCBvZgotICB0aGUgc2hvcnRlc3QgYXJndW1lbnQgc2VxdWVuY2UuICBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBhcmd1bWVudHMKLSAgd2hpY2ggYXJlIGFsbCBvZiB0aGUgc2FtZSBsZW5ndGgsIFxmdW5jdGlvbnt6aXAoKX0gaXMKLSAgc2ltaWxhciB0byBcZnVuY3Rpb257bWFwKCl9IHdpdGggYW4gaW5pdGlhbCBhcmd1bWVudCBvZiBcY29kZXtOb25lfS4KLSAgV2l0aCBhIHNpbmdsZSBzZXF1ZW5jZSBhcmd1bWVudCwgaXQgcmV0dXJucyBhIGxpc3Qgb2YgMS10dXBsZXMuCi0gIFdpdGggbm8gYXJndW1lbnRzLCBpdCByZXR1cm5zIGFuIGVtcHR5IGxpc3QuCi0gIFx2ZXJzaW9uYWRkZWR7Mi4wfQotCi0gIFx2ZXJzaW9uY2hhbmdlZFtGb3JtZXJseSwgXGZ1bmN0aW9ue3ppcCgpfSByZXF1aXJlZCBhdCBsZWFzdCBvbmUgYXJndW1lbnQKLSAgYW5kIFxjb2Rle3ppcCgpfSByYWlzZWQgYSBcZXhjZXB0aW9ue1R5cGVFcnJvcn0gaW5zdGVhZCBvZiByZXR1cm5pbmcKLSAgYW4gZW1wdHkgbGlzdF17Mi40fQotXGVuZHtmdW5jZGVzY30KLQotCi0lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLVxzZWN0aW9ue05vbi1lc3NlbnRpYWwgQnVpbHQtaW4gRnVuY3Rpb25zIFxsYWJlbHtub24tZXNzZW50aWFsLWJ1aWx0LWluLWZ1bmNzfX0KLQotVGhlcmUgYXJlIHNldmVyYWwgYnVpbHQtaW4gZnVuY3Rpb25zIHRoYXQgYXJlIG5vIGxvbmdlciBlc3NlbnRpYWwgdG8gbGVhcm4sCi1rbm93IG9yIHVzZSBpbiBtb2Rlcm4gUHl0aG9uIHByb2dyYW1taW5nLiAgVGhleSBoYXZlIGJlZW4ga2VwdCBoZXJlIHRvCi1tYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIHByb2dyYW1zIHdyaXR0ZW4gZm9yIG9sZGVyIHZlcnNpb25zCi1vZiBQeXRob24uCi0KLVB5dGhvbiBwcm9ncmFtbWVycywgdHJhaW5lcnMsIHN0dWRlbnRzIGFuZCBib29rd3JpdGVycyBzaG91bGQgZmVlbCBmcmVlIHRvCi1ieXBhc3MgdGhlc2UgZnVuY3Rpb25zIHdpdGhvdXQgY29uY2VybnMgYWJvdXQgbWlzc2luZyBzb21ldGhpbmcgaW1wb3J0YW50LgotCi0KLVxzZXRpbmRleHN1Yml0ZW17KG5vbi1lc3NlbnRpYWwgYnVpbHQtaW4gZnVuY3Rpb25zKX0KLQotXGJlZ2lue2Z1bmNkZXNjfXtidWZmZXJ9e29iamVjdFxvcHRpb25hbHssIG9mZnNldFxvcHRpb25hbHssIHNpemV9fX0KLSAgVGhlIFx2YXJ7b2JqZWN0fSBhcmd1bWVudCBtdXN0IGJlIGFuIG9iamVjdCB0aGF0IHN1cHBvcnRzIHRoZSBidWZmZXIKLSAgY2FsbCBpbnRlcmZhY2UgKHN1Y2ggYXMgc3RyaW5ncywgYXJyYXlzLCBhbmQgYnVmZmVycykuICBBIG5ldyBidWZmZXIKLSAgb2JqZWN0IHdpbGwgYmUgY3JlYXRlZCB3aGljaCByZWZlcmVuY2VzIHRoZSBcdmFye29iamVjdH0gYXJndW1lbnQuCi0gIFRoZSBidWZmZXIgb2JqZWN0IHdpbGwgYmUgYSBzbGljZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgXHZhcntvYmplY3R9Ci0gIChvciBmcm9tIHRoZSBzcGVjaWZpZWQgXHZhcntvZmZzZXR9KS4gVGhlIHNsaWNlIHdpbGwgZXh0ZW5kIHRvIHRoZQotICBlbmQgb2YgXHZhcntvYmplY3R9IChvciB3aWxsIGhhdmUgYSBsZW5ndGggZ2l2ZW4gYnkgdGhlIFx2YXJ7c2l6ZX0KLSAgYXJndW1lbnQpLgotXGVuZHtmdW5jZGVzY30KLQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJmdW5jdG9vbHMudGV4IGIvRG9jL2xpYi9saWJmdW5jdG9vbHMudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTRhNWIxLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGliZnVuY3Rvb2xzLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle2Z1bmN0b29sc30gLS0tCi0gICAgICAgICBIaWdoZXIgb3JkZXIgZnVuY3Rpb25zIGFuZCBvcGVyYXRpb25zIG9uIGNhbGxhYmxlIG9iamVjdHMufQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZnVuY3Rvb2xzfQkJJSBzdGFuZGFyZCBsaWJyYXJ5LCBpbiBQeXRob24KLQotXG1vZHVsZWF1dGhvcntQZXRlciBIYXJyaXN9e3NjYXZAYmx1ZXlvbmRlci5jby51a30KLVxtb2R1bGVhdXRob3J7UmF5bW9uZCBIZXR0aW5nZXJ9e3B5dGhvbkByY24uY29tfQotXG1vZHVsZWF1dGhvcntOaWNrIENvZ2hsYW59e25jb2dobGFuQGdtYWlsLmNvbX0KLVxzZWN0aW9uYXV0aG9ye1BldGVyIEhhcnJpc317c2NhdkBibHVleW9uZGVyLmNvLnVrfQotCi1cbW9kdWxlc3lub3BzaXN7SGlnaGVyLW9yZGVyIGZ1bmN0aW9ucyBhbmQgb3BlcmF0aW9ucyBvbiBjYWxsYWJsZSBvYmplY3RzLn0KLQotXHZlcnNpb25hZGRlZHsyLjV9Ci0KLVRoZSBcbW9kdWxle2Z1bmN0b29sc30gbW9kdWxlIGlzIGZvciBoaWdoZXItb3JkZXIgZnVuY3Rpb25zOiBmdW5jdGlvbnMKLXRoYXQgYWN0IG9uIG9yIHJldHVybiBvdGhlciBmdW5jdGlvbnMuIEluIGdlbmVyYWwsIGFueSBjYWxsYWJsZSBvYmplY3QgY2FuCi1iZSB0cmVhdGVkIGFzIGEgZnVuY3Rpb24gZm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIG1vZHVsZS4KLQotCi1UaGUgXG1vZHVsZXtmdW5jdG9vbHN9IG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb246Ci0KLVxiZWdpbntmdW5jZGVzY317cGFydGlhbH17ZnVuY1xvcHRpb25hbHssKmFyZ3N9XG9wdGlvbmFseywgKiprZXl3b3Jkc319Ci1SZXR1cm4gYSBuZXcgXGNsYXNze3BhcnRpYWx9IG9iamVjdCB3aGljaCB3aGVuIGNhbGxlZCB3aWxsIGJlaGF2ZSBsaWtlCi1cdmFye2Z1bmN9IGNhbGxlZCB3aXRoIHRoZSBwb3NpdGlvbmFsIGFyZ3VtZW50cyBcdmFye2FyZ3N9IGFuZCBrZXl3b3JkCi1hcmd1bWVudHMgXHZhcntrZXl3b3Jkc30uIElmIG1vcmUgYXJndW1lbnRzIGFyZSBzdXBwbGllZCB0byB0aGUgY2FsbCwgdGhleQotYXJlIGFwcGVuZGVkIHRvIFx2YXJ7YXJnc30uIElmIGFkZGl0aW9uYWwga2V5d29yZCBhcmd1bWVudHMgYXJlIHN1cHBsaWVkLAotdGhleSBleHRlbmQgYW5kIG92ZXJyaWRlIFx2YXJ7a2V5d29yZHN9LiBSb3VnaGx5IGVxdWl2YWxlbnQgdG86Ci0gIFxiZWdpbnt2ZXJiYXRpbX0KLSAgICAgICAgZGVmIHBhcnRpYWwoZnVuYywgKmFyZ3MsICoqa2V5d29yZHMpOgotICAgICAgICAgICAgZGVmIG5ld2Z1bmMoKmZhcmdzLCAqKmZrZXl3b3Jkcyk6Ci0gICAgICAgICAgICAgICAgbmV3a2V5d29yZHMgPSBrZXl3b3Jkcy5jb3B5KCkKLSAgICAgICAgICAgICAgICBuZXdrZXl3b3Jkcy51cGRhdGUoZmtleXdvcmRzKQotICAgICAgICAgICAgICAgIHJldHVybiBmdW5jKCooYXJncyArIGZhcmdzKSwgKipuZXdrZXl3b3JkcykKLSAgICAgICAgICAgIG5ld2Z1bmMuZnVuYyA9IGZ1bmMKLSAgICAgICAgICAgIG5ld2Z1bmMuYXJncyA9IGFyZ3MKLSAgICAgICAgICAgIG5ld2Z1bmMua2V5d29yZHMgPSBrZXl3b3JkcwotICAgICAgICAgICAgcmV0dXJuIG5ld2Z1bmMKLSAgXGVuZHt2ZXJiYXRpbX0KLQotVGhlIFxmdW5jdGlvbntwYXJ0aWFsfSBpcyB1c2VkIGZvciBwYXJ0aWFsIGZ1bmN0aW9uIGFwcGxpY2F0aW9uIHdoaWNoCi1gYGZyZWV6ZXMnJyBzb21lIHBvcnRpb24gb2YgYSBmdW5jdGlvbidzIGFyZ3VtZW50cyBhbmQvb3Iga2V5d29yZHMKLXJlc3VsdGluZyBpbiBhIG5ldyBvYmplY3Qgd2l0aCBhIHNpbXBsaWZpZWQgc2lnbmF0dXJlLiAgRm9yIGV4YW1wbGUsCi1cZnVuY3Rpb257cGFydGlhbH0gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgY2FsbGFibGUgdGhhdCBiZWhhdmVzIGxpa2UKLXRoZSBcZnVuY3Rpb257aW50fSBmdW5jdGlvbiB3aGVyZSB0aGUgXHZhcntiYXNlfSBhcmd1bWVudCBkZWZhdWx0cyB0bwotdHdvOgotICBcYmVnaW57dmVyYmF0aW19Ci0gICAgICAgID4+PiBiYXNldHdvID0gcGFydGlhbChpbnQsIGJhc2U9MikKLSAgICAgICAgPj4+IGJhc2V0d28uX19kb2NfXyA9ICdDb252ZXJ0IGJhc2UgMiBzdHJpbmcgdG8gYW4gaW50LicKLSAgICAgICAgPj4+IGJhc2V0d28oJzEwMDEwJykKLSAgICAgICAgMTgKLSAgXGVuZHt2ZXJiYXRpbX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cmVkdWNlfXtmdW5jdGlvbiwgc2VxdWVuY2Vcb3B0aW9uYWx7LCBpbml0aWFsaXplcn19Ci0gIEFwcGx5IFx2YXJ7ZnVuY3Rpb259IG9mIHR3byBhcmd1bWVudHMgY3VtdWxhdGl2ZWx5IHRvIHRoZSBpdGVtcyBvZgotICBcdmFye3NlcXVlbmNlfSwgZnJvbSBsZWZ0IHRvIHJpZ2h0LCBzbyBhcyB0byByZWR1Y2UgdGhlIHNlcXVlbmNlIHRvCi0gIGEgc2luZ2xlIHZhbHVlLiAgRm9yIGV4YW1wbGUsIFxjb2Rle3JlZHVjZShsYW1iZGEgeCwgeTogeCt5LCBbMSwgMiwKLSAgMywgNCwgNV0pfSBjYWxjdWxhdGVzIFxjb2RleygoKCgxKzIpKzMpKzQpKzUpfS4gIFRoZSBsZWZ0IGFyZ3VtZW50LAotICBcdmFye3h9LCBpcyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUgYW5kIHRoZSByaWdodCBhcmd1bWVudCwgXHZhcnt5fSwKLSAgaXMgdGhlIHVwZGF0ZSB2YWx1ZSBmcm9tIHRoZSBcdmFye3NlcXVlbmNlfS4gIElmIHRoZSBvcHRpb25hbAotICBcdmFye2luaXRpYWxpemVyfSBpcyBwcmVzZW50LCBpdCBpcyBwbGFjZWQgYmVmb3JlIHRoZSBpdGVtcyBvZiB0aGUKLSAgc2VxdWVuY2UgaW4gdGhlIGNhbGN1bGF0aW9uLCBhbmQgc2VydmVzIGFzIGEgZGVmYXVsdCB3aGVuIHRoZQotICBzZXF1ZW5jZSBpcyBlbXB0eS4gIElmIFx2YXJ7aW5pdGlhbGl6ZXJ9IGlzIG5vdCBnaXZlbiBhbmQKLSAgXHZhcntzZXF1ZW5jZX0gY29udGFpbnMgb25seSBvbmUgaXRlbSwgdGhlIGZpcnN0IGl0ZW0gaXMgcmV0dXJuZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3VwZGF0ZV93cmFwcGVyfQote3dyYXBwZXIsIHdyYXBwZWRcb3B0aW9uYWx7LCBhc3NpZ25lZH1cb3B0aW9uYWx7LCB1cGRhdGVkfX0KLVVwZGF0ZSBhIFx2YXJ7d3JhcHBlcn0gZnVuY3Rpb24gdG8gbG9vayBsaWtlIHRoZSBcdmFye3dyYXBwZWR9IGZ1bmN0aW9uLgotVGhlIG9wdGlvbmFsIGFyZ3VtZW50cyBhcmUgdHVwbGVzIHRvIHNwZWNpZnkgd2hpY2ggYXR0cmlidXRlcyBvZiB0aGUgb3JpZ2luYWwKLWZ1bmN0aW9uIGFyZSBhc3NpZ25lZCBkaXJlY3RseSB0byB0aGUgbWF0Y2hpbmcgYXR0cmlidXRlcyBvbiB0aGUgd3JhcHBlcgotZnVuY3Rpb24gYW5kIHdoaWNoIGF0dHJpYnV0ZXMgb2YgdGhlIHdyYXBwZXIgZnVuY3Rpb24gYXJlIHVwZGF0ZWQgd2l0aAotdGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlcyBmcm9tIHRoZSBvcmlnaW5hbCBmdW5jdGlvbi4gVGhlIGRlZmF1bHQKLXZhbHVlcyBmb3IgdGhlc2UgYXJndW1lbnRzIGFyZSB0aGUgbW9kdWxlIGxldmVsIGNvbnN0YW50cwotXHZhcntXUkFQUEVSX0FTU0lHTk1FTlRTfSAod2hpY2ggYXNzaWducyB0byB0aGUgd3JhcHBlciBmdW5jdGlvbidzCi1cdmFye19fbmFtZV9ffSwgXHZhcntfX21vZHVsZV9ffSBhbmQgXHZhcntfX2RvY19ffSwgdGhlIGRvY3VtZW50YXRpb24gc3RyaW5nKQotYW5kIFx2YXJ7V1JBUFBFUl9VUERBVEVTfSAod2hpY2ggdXBkYXRlcyB0aGUgd3JhcHBlciBmdW5jdGlvbidzIFx2YXJ7X19kaWN0X199LAotaS5lLiB0aGUgaW5zdGFuY2UgZGljdGlvbmFyeSkuCi0KLVRoZSBtYWluIGludGVuZGVkIHVzZSBmb3IgdGhpcyBmdW5jdGlvbiBpcyBpbiBkZWNvcmF0b3IgZnVuY3Rpb25zCi13aGljaCB3cmFwIHRoZSBkZWNvcmF0ZWQgZnVuY3Rpb24gYW5kIHJldHVybiB0aGUgd3JhcHBlci4gSWYgdGhlCi13cmFwcGVyIGZ1bmN0aW9uIGlzIG5vdCB1cGRhdGVkLCB0aGUgbWV0YWRhdGEgb2YgdGhlIHJldHVybmVkIGZ1bmN0aW9uCi13aWxsIHJlZmxlY3QgdGhlIHdyYXBwZXIgZGVmaW5pdGlvbiByYXRoZXIgdGhhbiB0aGUgb3JpZ2luYWwgZnVuY3Rpb24KLWRlZmluaXRpb24sIHdoaWNoIGlzIHR5cGljYWxseSBsZXNzIHRoYW4gaGVscGZ1bC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317d3JhcHN9Ci17d3JhcHBlZFxvcHRpb25hbHssIGFzc2lnbmVkfVxvcHRpb25hbHssIHVwZGF0ZWR9fQotVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBpbnZva2luZwotXGNvZGV7cGFydGlhbCh1cGRhdGVfd3JhcHBlciwgd3JhcHBlZD13cmFwcGVkLCBhc3NpZ25lZD1hc3NpZ25lZCwgdXBkYXRlZD11cGRhdGVkKX0KLWFzIGEgZnVuY3Rpb24gZGVjb3JhdG9yIHdoZW4gZGVmaW5pbmcgYSB3cmFwcGVyIGZ1bmN0aW9uLiBGb3IgZXhhbXBsZToKLSAgXGJlZ2lue3ZlcmJhdGltfQotICAgICAgICA+Pj4gZGVmIG15X2RlY29yYXRvcihmKToKLSAgICAgICAgLi4uICAgICBAd3JhcHMoZikKLSAgICAgICAgLi4uICAgICBkZWYgd3JhcHBlcigqYXJncywgKiprd2RzKToKLSAgICAgICAgLi4uICAgICAgICAgcHJpbnQgJ0NhbGxpbmcgZGVjb3JhdGVkIGZ1bmN0aW9uJwotICAgICAgICAuLi4gICAgICAgICByZXR1cm4gZigqYXJncywgKiprd2RzKQotICAgICAgICAuLi4gICAgIHJldHVybiB3cmFwcGVyCi0gICAgICAgIC4uLgotICAgICAgICA+Pj4gQG15X2RlY29yYXRvcgotICAgICAgICAuLi4gZGVmIGV4YW1wbGUoKToKLQkuLi4gICAgICIiIkRvY3N0cmluZyIiIgotICAgICAgICAuLi4gICAgIHByaW50ICdDYWxsZWQgZXhhbXBsZSBmdW5jdGlvbicKLSAgICAgICAgLi4uCi0gICAgICAgID4+PiBleGFtcGxlKCkKLSAgICAgICAgQ2FsbGluZyBkZWNvcmF0ZWQgZnVuY3Rpb24KLSAgICAgICAgQ2FsbGVkIGV4YW1wbGUgZnVuY3Rpb24KLSAgICAgICAgPj4+IGV4YW1wbGUuX19uYW1lX18KLSAgICAgICAgJ2V4YW1wbGUnCi0JPj4+IGV4YW1wbGUuX19kb2NfXwotCSdEb2NzdHJpbmcnCi0gIFxlbmR7dmVyYmF0aW19Ci1XaXRob3V0IHRoZSB1c2Ugb2YgdGhpcyBkZWNvcmF0b3IgZmFjdG9yeSwgdGhlIG5hbWUgb2YgdGhlIGV4YW1wbGUKLWZ1bmN0aW9uIHdvdWxkIGhhdmUgYmVlbiBcY29kZXsnd3JhcHBlcid9LCBhbmQgdGhlIGRvY3N0cmluZyBvZiB0aGUKLW9yaWdpbmFsIFxmdW5jdGlvbntleGFtcGxlKCl9IHdvdWxkIGhhdmUgYmVlbiBsb3N0LgotXGVuZHtmdW5jZGVzY30KLQotCi1cc3Vic2VjdGlvbntcY2xhc3N7cGFydGlhbH0gT2JqZWN0cyBcbGFiZWx7cGFydGlhbC1vYmplY3RzfX0KLQotCi1cY2xhc3N7cGFydGlhbH0gb2JqZWN0cyBhcmUgY2FsbGFibGUgb2JqZWN0cyBjcmVhdGVkIGJ5IFxmdW5jdGlvbntwYXJ0aWFsKCl9LgotVGhleSBoYXZlIHRocmVlIHJlYWQtb25seSBhdHRyaWJ1dGVzOgotCi1cYmVnaW57bWVtYmVyZGVzY31bY2FsbGFibGVde2Z1bmN9e30KLUEgY2FsbGFibGUgb2JqZWN0IG9yIGZ1bmN0aW9uLiAgQ2FsbHMgdG8gdGhlIFxjbGFzc3twYXJ0aWFsfSBvYmplY3Qgd2lsbAotYmUgZm9yd2FyZGVkIHRvIFxtZW1iZXJ7ZnVuY30gd2l0aCBuZXcgYXJndW1lbnRzIGFuZCBrZXl3b3Jkcy4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W3R1cGxlXXthcmdzfXt9Ci1UaGUgbGVmdG1vc3QgcG9zaXRpb25hbCBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHByZXBlbmRlZCB0byB0aGUKLXBvc2l0aW9uYWwgYXJndW1lbnRzIHByb3ZpZGVkIHRvIGEgXGNsYXNze3BhcnRpYWx9IG9iamVjdCBjYWxsLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bZGljdF17a2V5d29yZHN9e30KLVRoZSBrZXl3b3JkIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgc3VwcGxpZWQgd2hlbiB0aGUgXGNsYXNze3BhcnRpYWx9IG9iamVjdAotaXMgY2FsbGVkLgotXGVuZHttZW1iZXJkZXNjfQotCi1cY2xhc3N7cGFydGlhbH0gb2JqZWN0cyBhcmUgbGlrZSBcY2xhc3N7ZnVuY3Rpb259IG9iamVjdHMgaW4gdGhhdCB0aGV5IGFyZQotY2FsbGFibGUsIHdlYWsgcmVmZXJlbmNhYmxlLCBhbmQgY2FuIGhhdmUgYXR0cmlidXRlcy4gIFRoZXJlIGFyZSBzb21lCi1pbXBvcnRhbnQgZGlmZmVyZW5jZXMuICBGb3IgaW5zdGFuY2UsIHRoZSBcbWVtYmVye19fbmFtZV9ffSBhbmQKLVxtZW1iZXJ7X19kb2NfX30gYXR0cmlidXRlcyBhcmUgbm90IGNyZWF0ZWQgYXV0b21hdGljYWxseS4gIEFsc28sCi1cY2xhc3N7cGFydGlhbH0gb2JqZWN0cyBkZWZpbmVkIGluIGNsYXNzZXMgYmVoYXZlIGxpa2Ugc3RhdGljIG1ldGhvZHMgYW5kCi1kbyBub3QgdHJhbnNmb3JtIGludG8gYm91bmQgbWV0aG9kcyBkdXJpbmcgaW5zdGFuY2UgYXR0cmlidXRlIGxvb2stdXAuCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmZ1dHVyZS50ZXggYi9Eb2MvbGliL2xpYmZ1dHVyZS50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYmEwNjQuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJmdXR1cmUudGV4CisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtfX2Z1dHVyZV9ffSAtLS0KLSAgICAgICAgIEZ1dHVyZSBzdGF0ZW1lbnQgZGVmaW5pdGlvbnN9Ci0KLVxkZWNsYXJlbW9kdWxlW2Z1dHVyZV17c3RhbmRhcmR9e19fZnV0dXJlX199Ci1cbW9kdWxlc3lub3BzaXN7RnV0dXJlIHN0YXRlbWVudCBkZWZpbml0aW9uc30KLQotXG1vZHVsZXtfX2Z1dHVyZV9ffSBpcyBhIHJlYWwgbW9kdWxlLCBhbmQgc2VydmVzIHRocmVlIHB1cnBvc2VzOgotCi1cYmVnaW57aXRlbWl6ZX0KLQotXGl0ZW0gVG8gYXZvaWQgY29uZnVzaW5nIGV4aXN0aW5nIHRvb2xzIHRoYXQgYW5hbHl6ZSBpbXBvcnQgc3RhdGVtZW50cwotICAgICAgYW5kIGV4cGVjdCB0byBmaW5kIHRoZSBtb2R1bGVzIHRoZXkncmUgaW1wb3J0aW5nLgotCi1caXRlbSBUbyBlbnN1cmUgdGhhdCBmdXR1cmVfc3RhdGVtZW50cyBydW4gdW5kZXIgcmVsZWFzZXMgcHJpb3IgdG8gMi4xCi0gICAgICBhdCBsZWFzdCB5aWVsZCBydW50aW1lIGV4Y2VwdGlvbnMgKHRoZSBpbXBvcnQgb2YKLSAgICAgIFxtb2R1bGV7X19mdXR1cmVfX30gd2lsbCBmYWlsLCBiZWNhdXNlIHRoZXJlIHdhcyBubyBtb2R1bGUgb2YKLSAgICAgIHRoYXQgbmFtZSBwcmlvciB0byAyLjEpLiAKLQotXGl0ZW0gVG8gZG9jdW1lbnQgd2hlbiBpbmNvbXBhdGlibGUgY2hhbmdlcyB3ZXJlIGludHJvZHVjZWQsIGFuZCB3aGVuIHRoZXkKLSAgICAgIHdpbGwgYmUgLS0tIG9yIHdlcmUgLS0tIG1hZGUgbWFuZGF0b3J5LiAgVGhpcyBpcyBhIGZvcm0gb2YgZXhlY3V0YWJsZQotICAgICAgZG9jdW1lbnRhdGlvbiwgYW5kIGNhbiBiZSBpbnNwZWN0ZWQgcHJvZ3JhbWF0aWNhbGx5IHZpYSBpbXBvcnRpbmcKLSAgICAgIFxtb2R1bGV7X19mdXR1cmVfX30gYW5kIGV4YW1pbmluZyBpdHMgY29udGVudHMuCi0KLVxlbmR7aXRlbWl6ZX0KLQotRWFjaCBzdGF0ZW1lbnQgaW4gXGZpbGV7X19mdXR1cmVfXy5weX0gaXMgb2YgdGhlIGZvcm06Ci0KLVxiZWdpbnthbGx0dH0KLUZlYXR1cmVOYW1lID0gIl9GZWF0dXJlKCIgXHZhcntPcHRpb25hbFJlbGVhc2V9ICIsIiBcdmFye01hbmRhdG9yeVJlbGVhc2V9ICIsIgotICAgICAgICAgICAgICAgICAgICAgICAgXHZhcntDb21waWxlckZsYWd9ICIpIgotXGVuZHthbGx0dH0KLQotd2hlcmUsIG5vcm1hbGx5LCBcdmFye09wdGlvbmFsUmVsZWFzZX0gaXMgbGVzcyB0aGFuCi1cdmFye01hbmRhdG9yeVJlbGVhc2V9LCBhbmQgYm90aCBhcmUgNS10dXBsZXMgb2YgdGhlIHNhbWUgZm9ybSBhcwotXGNvZGV7c3lzLnZlcnNpb25faW5mb306Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICAoUFlfTUFKT1JfVkVSU0lPTiwgIyB0aGUgMiBpbiAyLjEuMGEzOyBhbiBpbnQKLSAgICAgUFlfTUlOT1JfVkVSU0lPTiwgIyB0aGUgMTsgYW4gaW50Ci0gICAgIFBZX01JQ1JPX1ZFUlNJT04sICMgdGhlIDA7IGFuIGludAotICAgICBQWV9SRUxFQVNFX0xFVkVMLCAjICJhbHBoYSIsICJiZXRhIiwgImNhbmRpZGF0ZSIgb3IgImZpbmFsIjsgc3RyaW5nCi0gICAgIFBZX1JFTEVBU0VfU0VSSUFMICMgdGhlIDM7IGFuIGludAotICAgICkKLVxlbmR7dmVyYmF0aW19Ci0KLVx2YXJ7T3B0aW9uYWxSZWxlYXNlfSByZWNvcmRzIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoZSBmZWF0dXJlCi13YXMgYWNjZXB0ZWQuCi0KLUluIHRoZSBjYXNlIG9mIGEgXHZhcntNYW5kYXRvcnlSZWxlYXNlfSB0aGF0IGhhcyBub3QgeWV0IG9jY3VycmVkLAotXHZhcntNYW5kYXRvcnlSZWxlYXNlfSBwcmVkaWN0cyB0aGUgcmVsZWFzZSBpbiB3aGljaCB0aGUgZmVhdHVyZSB3aWxsCi1iZWNvbWUgcGFydCBvZiB0aGUgbGFuZ3VhZ2UuCi0KLUVsc2UgXHZhcntNYW5kYXRvcnlSZWxlYXNlfSByZWNvcmRzIHdoZW4gdGhlIGZlYXR1cmUgYmVjYW1lIHBhcnQgb2YKLXRoZSBsYW5ndWFnZTsgaW4gcmVsZWFzZXMgYXQgb3IgYWZ0ZXIgdGhhdCwgbW9kdWxlcyBubyBsb25nZXIgbmVlZCBhCi1mdXR1cmUgc3RhdGVtZW50IHRvIHVzZSB0aGUgZmVhdHVyZSBpbiBxdWVzdGlvbiwgYnV0IG1heSBjb250aW51ZSB0bwotdXNlIHN1Y2ggaW1wb3J0cy4KLQotXHZhcntNYW5kYXRvcnlSZWxlYXNlfSBtYXkgYWxzbyBiZSBcY29kZXtOb25lfSwgbWVhbmluZyB0aGF0IGEgcGxhbm5lZAotZmVhdHVyZSBnb3QgZHJvcHBlZC4KLQotSW5zdGFuY2VzIG9mIGNsYXNzIFxjbGFzc3tfRmVhdHVyZX0gaGF2ZSB0d28gY29ycmVzcG9uZGluZyBtZXRob2RzLAotXG1ldGhvZHtnZXRPcHRpb25hbFJlbGVhc2UoKX0gYW5kIFxtZXRob2R7Z2V0TWFuZGF0b3J5UmVsZWFzZSgpfS4KLQotXHZhcntDb21waWxlckZsYWd9IGlzIHRoZSAoYml0ZmllbGQpIGZsYWcgdGhhdCBzaG91bGQgYmUgcGFzc2VkIGluIHRoZQotZm91cnRoIGFyZ3VtZW50IHRvIHRoZSBidWlsdGluIGZ1bmN0aW9uIFxmdW5jdGlvbntjb21waWxlKCl9IHRvIGVuYWJsZQotdGhlIGZlYXR1cmUgaW4gZHluYW1pY2FsbHkgY29tcGlsZWQgY29kZS4gIFRoaXMgZmxhZyBpcyBzdG9yZWQgaW4gdGhlCi1cbWVtYmVye2NvbXBpbGVyX2ZsYWd9IGF0dHJpYnV0ZSBvbiBcY2xhc3N7X0ZlYXR1cmV9IGluc3RhbmNlcy4KLQotTm8gZmVhdHVyZSBkZXNjcmlwdGlvbiB3aWxsIGV2ZXIgYmUgZGVsZXRlZCBmcm9tIFxtb2R1bGV7X19mdXR1cmVfX30uCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmdjLnRleCBiL0RvYy9saWIvbGliZ2MudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDM0MDhiLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGliZ2MudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7Z2N9IC0tLQotICAgICAgICAgR2FyYmFnZSBDb2xsZWN0b3IgaW50ZXJmYWNlfQotCi1cZGVjbGFyZW1vZHVsZXtleHRlbnNpb259e2djfQotXG1vZHVsZXN5bm9wc2lze0ludGVyZmFjZSB0byB0aGUgY3ljbGUtZGV0ZWN0aW5nIGdhcmJhZ2UgY29sbGVjdG9yLn0KLVxtb2R1bGVhdXRob3J7TmVpbCBTY2hlbWVuYXVlcn17bmFzQGFyY3RyaXguY29tfQotXHNlY3Rpb25hdXRob3J7TmVpbCBTY2hlbWVuYXVlcn17bmFzQGFyY3RyaXguY29tfQotCi1UaGlzIG1vZHVsZSBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gdGhlIG9wdGlvbmFsIGdhcmJhZ2UgY29sbGVjdG9yLiAgSXQKLXByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGRpc2FibGUgdGhlIGNvbGxlY3RvciwgdHVuZSB0aGUgY29sbGVjdGlvbgotZnJlcXVlbmN5LCBhbmQgc2V0IGRlYnVnZ2luZyBvcHRpb25zLiAgSXQgYWxzbyBwcm92aWRlcyBhY2Nlc3MgdG8KLXVucmVhY2hhYmxlIG9iamVjdHMgdGhhdCB0aGUgY29sbGVjdG9yIGZvdW5kIGJ1dCBjYW5ub3QgZnJlZS4gIFNpbmNlIHRoZQotY29sbGVjdG9yIHN1cHBsZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnRpbmcgYWxyZWFkeSB1c2VkIGluIFB5dGhvbiwgeW91Ci1jYW4gZGlzYWJsZSB0aGUgY29sbGVjdG9yIGlmIHlvdSBhcmUgc3VyZSB5b3VyIHByb2dyYW0gZG9lcyBub3QgY3JlYXRlCi1yZWZlcmVuY2UgY3ljbGVzLiAgQXV0b21hdGljIGNvbGxlY3Rpb24gY2FuIGJlIGRpc2FibGVkIGJ5IGNhbGxpbmcKLVxjb2Rle2djLmRpc2FibGUoKX0uICBUbyBkZWJ1ZyBhIGxlYWtpbmcgcHJvZ3JhbSBjYWxsCi1cY29kZXtnYy5zZXRfZGVidWcoZ2MuREVCVUdfTEVBSyl9LiBOb3RpY2UgdGhhdCB0aGlzIGluY2x1ZGVzIAotXGNvZGV7Z2MuREVCVUdfU0FWRUFMTH0sIGNhdXNpbmcgZ2FyYmFnZS1jb2xsZWN0ZWQgb2JqZWN0cyB0byBiZQotc2F2ZWQgaW4gZ2MuZ2FyYmFnZSBmb3IgaW5zcGVjdGlvbi4KLQotVGhlIFxtb2R1bGV7Z2N9IG1vZHVsZSBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKLQotXGJlZ2lue2Z1bmNkZXNjfXtlbmFibGV9e30KLUVuYWJsZSBhdXRvbWF0aWMgZ2FyYmFnZSBjb2xsZWN0aW9uLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtkaXNhYmxlfXt9Ci1EaXNhYmxlIGF1dG9tYXRpYyBnYXJiYWdlIGNvbGxlY3Rpb24uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2lzZW5hYmxlZH17fQotUmV0dXJucyB0cnVlIGlmIGF1dG9tYXRpYyBjb2xsZWN0aW9uIGlzIGVuYWJsZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2NvbGxlY3R9e1xvcHRpb25hbHtnZW5lcmF0aW9ufX0KLVdpdGggbm8gYXJndW1lbnRzLCBydW4gYSBmdWxsIGNvbGxlY3Rpb24uICBUaGUgb3B0aW9uYWwgYXJndW1lbnQKLVx2YXJ7Z2VuZXJhdGlvbn0gbWF5IGJlIGFuIGludGVnZXIgc3BlY2lmeWluZyB3aGljaCBnZW5lcmF0aW9uIHRvIGNvbGxlY3QKLShmcm9tIDAgdG8gMikuICBBIFxleGNlcHRpb257VmFsdWVFcnJvcn0gaXMgcmFpc2VkIGlmIHRoZSBnZW5lcmF0aW9uIG51bWJlciAKLWlzIGludmFsaWQuCi1UaGUgbnVtYmVyIG9mIHVucmVhY2hhYmxlIG9iamVjdHMgZm91bmQgaXMgcmV0dXJuZWQuCi0KLVx2ZXJzaW9uY2hhbmdlZFtUaGUgb3B0aW9uYWwgXHZhcntnZW5lcmF0aW9ufSBhcmd1bWVudCB3YXMgYWRkZWRdezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c2V0X2RlYnVnfXtmbGFnc30KLVNldCB0aGUgZ2FyYmFnZSBjb2xsZWN0aW9uIGRlYnVnZ2luZyBmbGFncy4KLURlYnVnZ2luZyBpbmZvcm1hdGlvbiB3aWxsIGJlIHdyaXR0ZW4gdG8gXGNvZGV7c3lzLnN0ZGVycn0uICBTZWUgYmVsb3cKLWZvciBhIGxpc3Qgb2YgZGVidWdnaW5nIGZsYWdzIHdoaWNoIGNhbiBiZSBjb21iaW5lZCB1c2luZyBiaXQKLW9wZXJhdGlvbnMgdG8gY29udHJvbCBkZWJ1Z2dpbmcuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldF9kZWJ1Z317fQotUmV0dXJuIHRoZSBkZWJ1Z2dpbmcgZmxhZ3MgY3VycmVudGx5IHNldC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0X29iamVjdHN9e30KLVJldHVybnMgYSBsaXN0IG9mIGFsbCBvYmplY3RzIHRyYWNrZWQgYnkgdGhlIGNvbGxlY3RvciwgZXhjbHVkaW5nIHRoZQotbGlzdCByZXR1cm5lZC4KLVx2ZXJzaW9uYWRkZWR7Mi4yfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzZXRfdGhyZXNob2xkfXt0aHJlc2hvbGQwXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkMVxvcHRpb25hbHssIHRocmVzaG9sZDJ9fX0KLVNldCB0aGUgZ2FyYmFnZSBjb2xsZWN0aW9uIHRocmVzaG9sZHMgKHRoZSBjb2xsZWN0aW9uIGZyZXF1ZW5jeSkuCi1TZXR0aW5nIFx2YXJ7dGhyZXNob2xkMH0gdG8gemVybyBkaXNhYmxlcyBjb2xsZWN0aW9uLgotCi1UaGUgR0MgY2xhc3NpZmllcyBvYmplY3RzIGludG8gdGhyZWUgZ2VuZXJhdGlvbnMgZGVwZW5kaW5nIG9uIGhvdyBtYW55Ci1jb2xsZWN0aW9uIHN3ZWVwcyB0aGV5IGhhdmUgc3Vydml2ZWQuICBOZXcgb2JqZWN0cyBhcmUgcGxhY2VkIGluIHRoZQoteW91bmdlc3QgZ2VuZXJhdGlvbiAoZ2VuZXJhdGlvbiBcY29kZXswfSkuICBJZiBhbiBvYmplY3Qgc3Vydml2ZXMgYQotY29sbGVjdGlvbiBpdCBpcyBtb3ZlZCBpbnRvIHRoZSBuZXh0IG9sZGVyIGdlbmVyYXRpb24uICBTaW5jZQotZ2VuZXJhdGlvbiBcY29kZXsyfSBpcyB0aGUgb2xkZXN0IGdlbmVyYXRpb24sIG9iamVjdHMgaW4gdGhhdAotZ2VuZXJhdGlvbiByZW1haW4gdGhlcmUgYWZ0ZXIgYSBjb2xsZWN0aW9uLiAgSW4gb3JkZXIgdG8gZGVjaWRlIHdoZW4KLXRvIHJ1biwgdGhlIGNvbGxlY3RvciBrZWVwcyB0cmFjayBvZiB0aGUgbnVtYmVyIG9iamVjdCBhbGxvY2F0aW9ucyBhbmQKLWRlYWxsb2NhdGlvbnMgc2luY2UgdGhlIGxhc3QgY29sbGVjdGlvbi4gIFdoZW4gdGhlIG51bWJlciBvZgotYWxsb2NhdGlvbnMgbWludXMgdGhlIG51bWJlciBvZiBkZWFsbG9jYXRpb25zIGV4Y2VlZHMKLVx2YXJ7dGhyZXNob2xkMH0sIGNvbGxlY3Rpb24gc3RhcnRzLiAgSW5pdGlhbGx5IG9ubHkgZ2VuZXJhdGlvbgotXGNvZGV7MH0gaXMgZXhhbWluZWQuICBJZiBnZW5lcmF0aW9uIFxjb2RlezB9IGhhcyBiZWVuIGV4YW1pbmVkIG1vcmUKLXRoYW4gXHZhcnt0aHJlc2hvbGQxfSB0aW1lcyBzaW5jZSBnZW5lcmF0aW9uIFxjb2RlezF9IGhhcyBiZWVuCi1leGFtaW5lZCwgdGhlbiBnZW5lcmF0aW9uIFxjb2RlezF9IGlzIGV4YW1pbmVkIGFzIHdlbGwuICBTaW1pbGFybHksCi1cdmFye3RocmVzaG9sZDJ9IGNvbnRyb2xzIHRoZSBudW1iZXIgb2YgY29sbGVjdGlvbnMgb2YgZ2VuZXJhdGlvbgotXGNvZGV7MX0gYmVmb3JlIGNvbGxlY3RpbmcgZ2VuZXJhdGlvbiBcY29kZXsyfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0X2NvdW50fXt9Ci1SZXR1cm4gdGhlIGN1cnJlbnQgY29sbGVjdGlvbiAgY291bnRzIGFzIGEgdHVwbGUgb2YKLVxjb2RleyhcdmFye2NvdW50MH0sIFx2YXJ7Y291bnQxfSwgXHZhcntjb3VudDJ9KX0uCi1cdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0X3RocmVzaG9sZH17fQotUmV0dXJuIHRoZSBjdXJyZW50IGNvbGxlY3Rpb24gdGhyZXNob2xkcyBhcyBhIHR1cGxlIG9mCi1cY29kZXsoXHZhcnt0aHJlc2hvbGQwfSwgXHZhcnt0aHJlc2hvbGQxfSwgXHZhcnt0aHJlc2hvbGQyfSl9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRfcmVmZXJyZXJzfXsqb2Jqc30KLVJldHVybiB0aGUgbGlzdCBvZiBvYmplY3RzIHRoYXQgZGlyZWN0bHkgcmVmZXIgdG8gYW55IG9mIG9ianMuIFRoaXMKLWZ1bmN0aW9uIHdpbGwgb25seSBsb2NhdGUgdGhvc2UgY29udGFpbmVycyB3aGljaCBzdXBwb3J0IGdhcmJhZ2UKLWNvbGxlY3Rpb247IGV4dGVuc2lvbiB0eXBlcyB3aGljaCBkbyByZWZlciB0byBvdGhlciBvYmplY3RzIGJ1dCBkbyBub3QKLXN1cHBvcnQgZ2FyYmFnZSBjb2xsZWN0aW9uIHdpbGwgbm90IGJlIGZvdW5kLgotCi1Ob3RlIHRoYXQgb2JqZWN0cyB3aGljaCBoYXZlIGFscmVhZHkgYmVlbiBkZXJlZmVyZW5jZWQsIGJ1dCB3aGljaCBsaXZlCi1pbiBjeWNsZXMgYW5kIGhhdmUgbm90IHlldCBiZWVuIGNvbGxlY3RlZCBieSB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IgY2FuCi1iZSBsaXN0ZWQgYW1vbmcgdGhlIHJlc3VsdGluZyByZWZlcnJlcnMuICBUbyBnZXQgb25seSBjdXJyZW50bHkgbGl2ZQotb2JqZWN0cywgY2FsbCBcZnVuY3Rpb257Y29sbGVjdCgpfSBiZWZvcmUgY2FsbGluZwotXGZ1bmN0aW9ue2dldF9yZWZlcnJlcnMoKX0uCi0KLUNhcmUgbXVzdCBiZSB0YWtlbiB3aGVuIHVzaW5nIG9iamVjdHMgcmV0dXJuZWQgYnkKLVxmdW5jdGlvbntnZXRfcmVmZXJyZXJzKCl9IGJlY2F1c2Ugc29tZSBvZiB0aGVtIGNvdWxkIHN0aWxsIGJlIHVuZGVyCi1jb25zdHJ1Y3Rpb24gYW5kIGhlbmNlIGluIGEgdGVtcG9yYXJpbHkgaW52YWxpZCBzdGF0ZS4gQXZvaWQgdXNpbmcKLVxmdW5jdGlvbntnZXRfcmVmZXJyZXJzKCl9IGZvciBhbnkgcHVycG9zZSBvdGhlciB0aGFuIGRlYnVnZ2luZy4KLQotXHZlcnNpb25hZGRlZHsyLjJ9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldF9yZWZlcmVudHN9eypvYmpzfQotUmV0dXJuIGEgbGlzdCBvZiBvYmplY3RzIGRpcmVjdGx5IHJlZmVycmVkIHRvIGJ5IGFueSBvZiB0aGUgYXJndW1lbnRzLgotVGhlIHJlZmVyZW50cyByZXR1cm5lZCBhcmUgdGhvc2Ugb2JqZWN0cyB2aXNpdGVkIGJ5IHRoZSBhcmd1bWVudHMnCi1DLWxldmVsIFxtZW1iZXJ7dHBfdHJhdmVyc2V9IG1ldGhvZHMgKGlmIGFueSksIGFuZCBtYXkgbm90IGJlIGFsbAotb2JqZWN0cyBhY3R1YWxseSBkaXJlY3RseSByZWFjaGFibGUuICBcbWVtYmVye3RwX3RyYXZlcnNlfSBtZXRob2RzCi1hcmUgc3VwcG9ydGVkIG9ubHkgYnkgb2JqZWN0cyB0aGF0IHN1cHBvcnQgZ2FyYmFnZSBjb2xsZWN0aW9uLCBhbmQgYXJlCi1vbmx5IHJlcXVpcmVkIHRvIHZpc2l0IG9iamVjdHMgdGhhdCBtYXkgYmUgaW52b2x2ZWQgaW4gYSBjeWNsZS4gIFNvLAotZm9yIGV4YW1wbGUsIGlmIGFuIGludGVnZXIgaXMgZGlyZWN0bHkgcmVhY2hhYmxlIGZyb20gYW4gYXJndW1lbnQsIHRoYXQKLWludGVnZXIgb2JqZWN0IG1heSBvciBtYXkgbm90IGFwcGVhciBpbiB0aGUgcmVzdWx0IGxpc3QuCi0KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtmdW5jZGVzY30KLQotVGhlIGZvbGxvd2luZyB2YXJpYWJsZSBpcyBwcm92aWRlZCBmb3IgcmVhZC1vbmx5IGFjY2VzcyAoeW91IGNhbgotbXV0YXRlIGl0cyB2YWx1ZSBidXQgc2hvdWxkIG5vdCByZWJpbmQgaXQpOgotCi1cYmVnaW57ZGF0YWRlc2N9e2dhcmJhZ2V9Ci1BIGxpc3Qgb2Ygb2JqZWN0cyB3aGljaCB0aGUgY29sbGVjdG9yIGZvdW5kIHRvIGJlIHVucmVhY2hhYmxlCi1idXQgY291bGQgbm90IGJlIGZyZWVkICh1bmNvbGxlY3RhYmxlIG9iamVjdHMpLiAgQnkgZGVmYXVsdCwgdGhpcyBsaXN0Ci1jb250YWlucyBvbmx5IG9iamVjdHMgd2l0aCBcbWV0aG9ke19fZGVsX18oKX0gbWV0aG9kcy5cZm9vdG5vdGV7UHJpb3IgdG8KLSAgUHl0aG9uIDIuMiwgdGhlIGxpc3QgY29udGFpbmVkIGFsbCBpbnN0YW5jZSBvYmplY3RzIGluIHVucmVhY2hhYmxlCi0gIGN5Y2xlcywgIG5vdCBvbmx5IHRob3NlIHdpdGggXG1ldGhvZHtfX2RlbF9fKCl9IG1ldGhvZHMufQotT2JqZWN0cyB0aGF0IGhhdmUKLVxtZXRob2R7X19kZWxfXygpfSBtZXRob2RzIGFuZCBhcmUgcGFydCBvZiBhIHJlZmVyZW5jZSBjeWNsZSBjYXVzZQotdGhlIGVudGlyZSByZWZlcmVuY2UgY3ljbGUgdG8gYmUgdW5jb2xsZWN0YWJsZSwgaW5jbHVkaW5nIG9iamVjdHMKLW5vdCBuZWNlc3NhcmlseSBpbiB0aGUgY3ljbGUgYnV0IHJlYWNoYWJsZSBvbmx5IGZyb20gaXQuICBQeXRob24gZG9lc24ndAotY29sbGVjdCBzdWNoIGN5Y2xlcyBhdXRvbWF0aWNhbGx5IGJlY2F1c2UsIGluIGdlbmVyYWwsIGl0IGlzbid0IHBvc3NpYmxlCi1mb3IgUHl0aG9uIHRvIGd1ZXNzIGEgc2FmZSBvcmRlciBpbiB3aGljaCB0byBydW4gdGhlIFxtZXRob2R7X19kZWxfXygpfQotbWV0aG9kcy4gIElmIHlvdSBrbm93IGEgc2FmZSBvcmRlciwgeW91IGNhbiBmb3JjZSB0aGUgaXNzdWUgYnkgZXhhbWluaW5nCi10aGUgXHZhcntnYXJiYWdlfSBsaXN0LCBhbmQgZXhwbGljaXRseSBicmVha2luZyBjeWNsZXMgZHVlIHRvIHlvdXIKLW9iamVjdHMgd2l0aGluIHRoZSBsaXN0LiAgTm90ZSB0aGF0IHRoZXNlIG9iamVjdHMgYXJlIGtlcHQgYWxpdmUgZXZlbgotc28gYnkgdmlydHVlIG9mIGJlaW5nIGluIHRoZSBcdmFye2dhcmJhZ2V9IGxpc3QsIHNvIHRoZXkgc2hvdWxkIGJlCi1yZW1vdmVkIGZyb20gXHZhcntnYXJiYWdlfSB0b28uICBGb3IgZXhhbXBsZSwgYWZ0ZXIgYnJlYWtpbmcgY3ljbGVzLCBkbwotXGNvZGV7ZGVsIGdjLmdhcmJhZ2VbOl19IHRvIGVtcHR5IHRoZSBsaXN0LiAgSXQncyBnZW5lcmFsbHkgYmV0dGVyCi10byBhdm9pZCB0aGUgaXNzdWUgYnkgbm90IGNyZWF0aW5nIGN5Y2xlcyBjb250YWluaW5nIG9iamVjdHMgd2l0aAotXG1ldGhvZHtfX2RlbF9fKCl9IG1ldGhvZHMsIGFuZCBcdmFye2dhcmJhZ2V9IGNhbiBiZSBleGFtaW5lZCBpbiB0aGF0Ci1jYXNlIHRvIHZlcmlmeSB0aGF0IG5vIHN1Y2ggY3ljbGVzIGFyZSBiZWluZyBjcmVhdGVkLgotCi1JZiBcY29uc3RhbnR7REVCVUdfU0FWRUFMTH0gaXMgc2V0LCB0aGVuIGFsbCB1bnJlYWNoYWJsZSBvYmplY3RzIHdpbGwKLWJlIGFkZGVkIHRvIHRoaXMgbGlzdCByYXRoZXIgdGhhbiBmcmVlZC4KLVxlbmR7ZGF0YWRlc2N9Ci0KLQotVGhlIGZvbGxvd2luZyBjb25zdGFudHMgYXJlIHByb3ZpZGVkIGZvciB1c2Ugd2l0aAotXGZ1bmN0aW9ue3NldF9kZWJ1ZygpfToKLQotXGJlZ2lue2RhdGFkZXNjfXtERUJVR19TVEFUU30KLVByaW50IHN0YXRpc3RpY3MgZHVyaW5nIGNvbGxlY3Rpb24uICBUaGlzIGluZm9ybWF0aW9uIGNhbgotYmUgdXNlZnVsIHdoZW4gdHVuaW5nIHRoZSBjb2xsZWN0aW9uIGZyZXF1ZW5jeS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317REVCVUdfQ09MTEVDVEFCTEV9Ci1QcmludCBpbmZvcm1hdGlvbiBvbiBjb2xsZWN0YWJsZSBvYmplY3RzIGZvdW5kLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtERUJVR19VTkNPTExFQ1RBQkxFfQotUHJpbnQgaW5mb3JtYXRpb24gb2YgdW5jb2xsZWN0YWJsZSBvYmplY3RzIGZvdW5kIChvYmplY3RzIHdoaWNoIGFyZQotbm90IHJlYWNoYWJsZSBidXQgY2Fubm90IGJlIGZyZWVkIGJ5IHRoZSBjb2xsZWN0b3IpLiAgVGhlc2Ugb2JqZWN0cwotd2lsbCBiZSBhZGRlZCB0byB0aGUgXGNvZGV7Z2FyYmFnZX0gbGlzdC4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317REVCVUdfSU5TVEFOQ0VTfQotV2hlbiBcY29uc3RhbnR7REVCVUdfQ09MTEVDVEFCTEV9IG9yIFxjb25zdGFudHtERUJVR19VTkNPTExFQ1RBQkxFfSBpcwotc2V0LCBwcmludCBpbmZvcm1hdGlvbiBhYm91dCBpbnN0YW5jZSBvYmplY3RzIGZvdW5kLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtERUJVR19PQkpFQ1RTfQotV2hlbiBcY29uc3RhbnR7REVCVUdfQ09MTEVDVEFCTEV9IG9yIFxjb25zdGFudHtERUJVR19VTkNPTExFQ1RBQkxFfSBpcwotc2V0LCBwcmludCBpbmZvcm1hdGlvbiBhYm91dCBvYmplY3RzIG90aGVyIHRoYW4gaW5zdGFuY2Ugb2JqZWN0cyBmb3VuZC4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317REVCVUdfU0FWRUFMTH0KLVdoZW4gc2V0LCBhbGwgdW5yZWFjaGFibGUgb2JqZWN0cyBmb3VuZCB3aWxsIGJlIGFwcGVuZGVkIHRvCi1cdmFye2dhcmJhZ2V9IHJhdGhlciB0aGFuIGJlaW5nIGZyZWVkLiAgVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLWEgbGVha2luZyBwcm9ncmFtLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtERUJVR19MRUFLfQotVGhlIGRlYnVnZ2luZyBmbGFncyBuZWNlc3NhcnkgZm9yIHRoZSBjb2xsZWN0b3IgdG8gcHJpbnQKLWluZm9ybWF0aW9uIGFib3V0IGEgbGVha2luZyBwcm9ncmFtIChlcXVhbCB0byBcY29kZXtERUJVR19DT0xMRUNUQUJMRSB8Ci1ERUJVR19VTkNPTExFQ1RBQkxFIHwgREVCVUdfSU5TVEFOQ0VTIHwgREVCVUdfT0JKRUNUUyB8IERFQlVHX1NBVkVBTEx9KS4KLVxlbmR7ZGF0YWRlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmdkYm0udGV4IGIvRG9jL2xpYi9saWJnZGJtLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMzNjY3Ny4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmdkYm0udGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7Z2RibX0gLS0tCi0gICAgICAgICBHTlUncyByZWludGVycHJldGF0aW9uIG9mIGRibX0KLQotXGRlY2xhcmVtb2R1bGV7YnVpbHRpbn17Z2RibX0KLSAgXHBsYXRmb3Jte1VuaXh9Ci1cbW9kdWxlc3lub3BzaXN7R05VJ3MgcmVpbnRlcnByZXRhdGlvbiBvZiBkYm0ufQotCi0KLVRoaXMgbW9kdWxlIGlzIHF1aXRlIHNpbWlsYXIgdG8gdGhlIFxyZWZtb2R1bGV7ZGJtfVxyZWZiaW1vZGluZGV4e2RibX0KLW1vZHVsZSwgYnV0IHVzZXMgXGNvZGV7Z2RibX0gaW5zdGVhZCB0byBwcm92aWRlIHNvbWUgYWRkaXRpb25hbAotZnVuY3Rpb25hbGl0eS4gIFBsZWFzZSBub3RlIHRoYXQgdGhlIGZpbGUgZm9ybWF0cyBjcmVhdGVkIGJ5Ci1cY29kZXtnZGJtfSBhbmQgXGNvZGV7ZGJtfSBhcmUgaW5jb21wYXRpYmxlLgotCi1UaGUgXG1vZHVsZXtnZGJtfSBtb2R1bGUgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIHRoZSBHTlUgREJNCi1saWJyYXJ5LiAgXGNvZGV7Z2RibX0gb2JqZWN0cyBiZWhhdmUgbGlrZSBtYXBwaW5ncwotKGRpY3Rpb25hcmllcyksIGV4Y2VwdCB0aGF0IGtleXMgYW5kIHZhbHVlcyBhcmUgYWx3YXlzIHN0cmluZ3MuCi1QcmludGluZyBhIFxjb2Rle2dkYm19IG9iamVjdCBkb2Vzbid0IHByaW50IHRoZSBrZXlzIGFuZCB2YWx1ZXMsIGFuZAotdGhlIFxtZXRob2R7aXRlbXMoKX0gYW5kIFxtZXRob2R7dmFsdWVzKCl9IG1ldGhvZHMgYXJlIG5vdCBzdXBwb3J0ZWQuCi0KLVRoZSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGNvbnN0YW50IGFuZCBmdW5jdGlvbnM6Ci0KLVxiZWdpbntleGNkZXNjfXtlcnJvcn0KLVJhaXNlZCBvbiBcY29kZXtnZGJtfS1zcGVjaWZpYyBlcnJvcnMsIHN1Y2ggYXMgSS9PIGVycm9ycy4KLVxleGNlcHRpb257S2V5RXJyb3J9IGlzIHJhaXNlZCBmb3IgZ2VuZXJhbCBtYXBwaW5nIGVycm9ycyBsaWtlCi1zcGVjaWZ5aW5nIGFuIGluY29ycmVjdCBrZXkuCi1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317b3Blbn17ZmlsZW5hbWUsIFxvcHRpb25hbHtmbGFnLCBcb3B0aW9uYWx7bW9kZX19fQotT3BlbiBhIFxjb2Rle2dkYm19IGRhdGFiYXNlIGFuZCByZXR1cm4gYSBcY29kZXtnZGJtfSBvYmplY3QuICBUaGUKLVx2YXJ7ZmlsZW5hbWV9IGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSBkYXRhYmFzZSBmaWxlLgotCi1UaGUgb3B0aW9uYWwgXHZhcntmbGFnfSBhcmd1bWVudCBjYW4gYmUKLVxjb2RleydyJ30gKHRvIG9wZW4gYW4gZXhpc3RpbmcgZGF0YWJhc2UgZm9yIHJlYWRpbmcgb25seSAtLS0gZGVmYXVsdCksCi1cY29kZXsndyd9ICh0byBvcGVuIGFuIGV4aXN0aW5nIGRhdGFiYXNlIGZvciByZWFkaW5nIGFuZCB3cml0aW5nKSwKLVxjb2RleydjJ30gKHdoaWNoIGNyZWF0ZXMgdGhlIGRhdGFiYXNlIGlmIGl0IGRvZXNuJ3QgZXhpc3QpLCBvcgotXGNvZGV7J24nfSAod2hpY2ggYWx3YXlzIGNyZWF0ZXMgYSBuZXcgZW1wdHkgZGF0YWJhc2UpLgotCi1UaGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgY2hhcmFjdGVycyBtYXkgYmUgYXBwZW5kZWQgdG8gdGhlIGZsYWcgdG8KLWNvbnRyb2wgaG93IHRoZSBkYXRhYmFzZSBpcyBvcGVuZWQ6Ci0KLVxiZWdpbntpdGVtaXplfQotXGl0ZW0gXGNvZGV7J2YnfSAtLS0gT3BlbiB0aGUgZGF0YWJhc2UgaW4gZmFzdCBtb2RlLiAgV3JpdGVzIHRvIHRoZSBkYXRhYmFzZQotICAgICAgICAgICAgICAgICAgICAgd2lsbCBub3QgYmUgc3luY2hyb25pemVkLgotXGl0ZW0gXGNvZGV7J3MnfSAtLS0gU3luY2hyb25pemVkIG1vZGUuIFRoaXMgd2lsbCBjYXVzZSBjaGFuZ2VzIHRvIHRoZSBkYXRhYmFzZQotICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBpbW1lZGlhdGVseSB3cml0dGVuIHRvIHRoZSBmaWxlLgotXGl0ZW0gXGNvZGV7J3UnfSAtLS0gRG8gbm90IGxvY2sgZGF0YWJhc2UuIAotXGVuZHtpdGVtaXplfQotCi1Ob3QgYWxsIGZsYWdzIGFyZSB2YWxpZCBmb3IgYWxsIHZlcnNpb25zIG9mIFxjb2Rle2dkYm19LiAgVGhlCi1tb2R1bGUgY29uc3RhbnQgXGNvZGV7b3Blbl9mbGFnc30gaXMgYSBzdHJpbmcgb2Ygc3VwcG9ydGVkIGZsYWcKLWNoYXJhY3RlcnMuICBUaGUgZXhjZXB0aW9uIFxleGNlcHRpb257ZXJyb3J9IGlzIHJhaXNlZCBpZiBhbiBpbnZhbGlkCi1mbGFnIGlzIHNwZWNpZmllZC4KLQotVGhlIG9wdGlvbmFsIFx2YXJ7bW9kZX0gYXJndW1lbnQgaXMgdGhlIFxVTklYe30gbW9kZSBvZiB0aGUgZmlsZSwgdXNlZAotb25seSB3aGVuIHRoZSBkYXRhYmFzZSBoYXMgdG8gYmUgY3JlYXRlZC4gIEl0IGRlZmF1bHRzIHRvIG9jdGFsCi1cY29kZXswNjY2fS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLUluIGFkZGl0aW9uIHRvIHRoZSBkaWN0aW9uYXJ5LWxpa2UgbWV0aG9kcywgXGNvZGV7Z2RibX0gb2JqZWN0cyBoYXZlIHRoZQotZm9sbG93aW5nIG1ldGhvZHM6Ci0KLVxiZWdpbntmdW5jZGVzY317Zmlyc3RrZXl9e30KLUl0J3MgcG9zc2libGUgdG8gbG9vcCBvdmVyIGV2ZXJ5IGtleSBpbiB0aGUgZGF0YWJhc2UgdXNpbmcgdGhpcyBtZXRob2QgCi1hbmQgdGhlIFxtZXRob2R7bmV4dGtleSgpfSBtZXRob2QuICBUaGUgdHJhdmVyc2FsIGlzIG9yZGVyZWQgYnkKLVxjb2Rle2dkYm19J3MgaW50ZXJuYWwgaGFzaCB2YWx1ZXMsIGFuZCB3b24ndCBiZSBzb3J0ZWQgYnkgdGhlIGtleQotdmFsdWVzLiAgVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgc3RhcnRpbmcga2V5LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtuZXh0a2V5fXtrZXl9Ci1SZXR1cm5zIHRoZSBrZXkgdGhhdCBmb2xsb3dzIFx2YXJ7a2V5fSBpbiB0aGUgdHJhdmVyc2FsLiAgVGhlCi1mb2xsb3dpbmcgY29kZSBwcmludHMgZXZlcnkga2V5IGluIHRoZSBkYXRhYmFzZSBcY29kZXtkYn0sIHdpdGhvdXQKLWhhdmluZyB0byBjcmVhdGUgYSBsaXN0IGluIG1lbW9yeSB0aGF0IGNvbnRhaW5zIHRoZW0gYWxsOgotCi1cYmVnaW57dmVyYmF0aW19Ci1rID0gZGIuZmlyc3RrZXkoKQotd2hpbGUgayAhPSBOb25lOgotICAgIHByaW50IGsKLSAgICBrID0gZGIubmV4dGtleShrKQotXGVuZHt2ZXJiYXRpbX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cmVvcmdhbml6ZX17fQotSWYgeW91IGhhdmUgY2FycmllZCBvdXQgYSBsb3Qgb2YgZGVsZXRpb25zIGFuZCB3b3VsZCBsaWtlIHRvIHNocmluawotdGhlIHNwYWNlIHVzZWQgYnkgdGhlIFxjb2Rle2dkYm19IGZpbGUsIHRoaXMgcm91dGluZSB3aWxsIHJlb3JnYW5pemUKLXRoZSBkYXRhYmFzZS4gIFxjb2Rle2dkYm19IHdpbGwgbm90IHNob3J0ZW4gdGhlIGxlbmd0aCBvZiBhIGRhdGFiYXNlCi1maWxlIGV4Y2VwdCBieSB1c2luZyB0aGlzIHJlb3JnYW5pemF0aW9uOyBvdGhlcndpc2UsIGRlbGV0ZWQgZmlsZQotc3BhY2Ugd2lsbCBiZSBrZXB0IGFuZCByZXVzZWQgYXMgbmV3IChrZXksIHZhbHVlKSBwYWlycyBhcmUgYWRkZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3N5bmN9e30KLVdoZW4gdGhlIGRhdGFiYXNlIGhhcyBiZWVuIG9wZW5lZCBpbiBmYXN0IG1vZGUsIHRoaXMgbWV0aG9kIGZvcmNlcyBhbnkgCi11bndyaXR0ZW4gZGF0YSB0byBiZSB3cml0dGVuIHRvIHRoZSBkaXNrLgotXGVuZHtmdW5jZGVzY30KLQotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZW1vZHVsZXthbnlkYm19e0dlbmVyaWMgaW50ZXJmYWNlIHRvIFxjb2Rle2RibX0tc3R5bGUgZGF0YWJhc2VzLn0KLSAgXHNlZW1vZHVsZXt3aGljaGRifXtVdGlsaXR5IG1vZHVsZSB1c2VkIHRvIGRldGVybWluZSB0aGUgdHlwZSBvZiBhbgotICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nIGRhdGFiYXNlLn0KLVxlbmR7c2VlYWxzb30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliZ2V0b3B0LnRleCBiL0RvYy9saWIvbGliZ2V0b3B0LnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkzMGFjZC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmdldG9wdC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtnZXRvcHR9IC0tLQotICAgICAgICAgUGFyc2VyIGZvciBjb21tYW5kIGxpbmUgb3B0aW9uc30KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2dldG9wdH0KLVxtb2R1bGVzeW5vcHNpc3tQb3J0YWJsZSBwYXJzZXIgZm9yIGNvbW1hbmQgbGluZSBvcHRpb25zOyBzdXBwb3J0IGJvdGgKLSAgICAgICAgICAgICAgICBzaG9ydCBhbmQgbG9uZyBvcHRpb24gbmFtZXMufQotCi0KLVRoaXMgbW9kdWxlIGhlbHBzIHNjcmlwdHMgdG8gcGFyc2UgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgaW4KLVxjb2Rle3N5cy5hcmd2fS4KLUl0IHN1cHBvcnRzIHRoZSBzYW1lIGNvbnZlbnRpb25zIGFzIHRoZSBcVU5JWHt9IFxjZnVuY3Rpb257Z2V0b3B0KCl9Ci1mdW5jdGlvbiAoaW5jbHVkaW5nIHRoZSBzcGVjaWFsIG1lYW5pbmdzIG9mIGFyZ3VtZW50cyBvZiB0aGUgZm9ybQotYFxjb2Rley19JyBhbmQgYFxjb2Rley19XGNvZGV7LX0nKS4KLSUgVGhhdCdzIHRvIGZvb2wgbGF0ZXgyaHRtbCBpbnRvIGxlYXZpbmcgdGhlIHR3byBoeXBoZW5zIGFsb25lIQotTG9uZyBvcHRpb25zIHNpbWlsYXIgdG8gdGhvc2Ugc3VwcG9ydGVkIGJ5Ci1HTlUgc29mdHdhcmUgbWF5IGJlIHVzZWQgYXMgd2VsbCB2aWEgYW4gb3B0aW9uYWwgdGhpcmQgYXJndW1lbnQuCi1UaGlzIG1vZHVsZSBwcm92aWRlcyBhIHNpbmdsZSBmdW5jdGlvbiBhbmQgYW4gZXhjZXB0aW9uOgotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldG9wdH17YXJncywgb3B0aW9uc1xvcHRpb25hbHssIGxvbmdfb3B0aW9uc319Ci1QYXJzZXMgY29tbWFuZCBsaW5lIG9wdGlvbnMgYW5kIHBhcmFtZXRlciBsaXN0LiAgXHZhcnthcmdzfSBpcyB0aGUKLWFyZ3VtZW50IGxpc3QgdG8gYmUgcGFyc2VkLCB3aXRob3V0IHRoZSBsZWFkaW5nIHJlZmVyZW5jZSB0byB0aGUKLXJ1bm5pbmcgcHJvZ3JhbS4gVHlwaWNhbGx5LCB0aGlzIG1lYW5zIFxzYW1we3N5cy5hcmd2WzE6XX0uCi1cdmFye29wdGlvbnN9IGlzIHRoZSBzdHJpbmcgb2Ygb3B0aW9uIGxldHRlcnMgdGhhdCB0aGUgc2NyaXB0IHdhbnRzIHRvCi1yZWNvZ25pemUsIHdpdGggb3B0aW9ucyB0aGF0IHJlcXVpcmUgYW4gYXJndW1lbnQgZm9sbG93ZWQgYnkgYSBjb2xvbgotKFxjaGFyYWN0ZXJ7On07IGkuZS4sIHRoZSBzYW1lIGZvcm1hdCB0aGF0IFxVTklYe30KLVxjZnVuY3Rpb257Z2V0b3B0KCl9IHVzZXMpLgotCi1cbm90ZXtVbmxpa2UgR05VIFxjZnVuY3Rpb257Z2V0b3B0KCl9LCBhZnRlciBhIG5vbi1vcHRpb24KLWFyZ3VtZW50LCBhbGwgZnVydGhlciBhcmd1bWVudHMgYXJlIGNvbnNpZGVyZWQgYWxzbyBub24tb3B0aW9ucy4KLVRoaXMgaXMgc2ltaWxhciB0byB0aGUgd2F5IG5vbi1HTlUgXFVOSVh7fSBzeXN0ZW1zIHdvcmsufQotCi1cdmFye2xvbmdfb3B0aW9uc30sIGlmIHNwZWNpZmllZCwgbXVzdCBiZSBhIGxpc3Qgb2Ygc3RyaW5ncyB3aXRoIHRoZQotbmFtZXMgb2YgdGhlIGxvbmcgb3B0aW9ucyB3aGljaCBzaG91bGQgYmUgc3VwcG9ydGVkLiAgVGhlIGxlYWRpbmcKLVxjb2RleyctfVxjb2Rley0nfSBjaGFyYWN0ZXJzIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIG9wdGlvbgotbmFtZS4gIExvbmcgb3B0aW9ucyB3aGljaCByZXF1aXJlIGFuIGFyZ3VtZW50IHNob3VsZCBiZSBmb2xsb3dlZCBieSBhbgotZXF1YWwgc2lnbiAoXGNoYXJhY3Rlcns9fSkuICBUbyBhY2NlcHQgb25seSBsb25nIG9wdGlvbnMsCi1cdmFye29wdGlvbnN9IHNob3VsZCBiZSBhbiBlbXB0eSBzdHJpbmcuICBMb25nIG9wdGlvbnMgb24gdGhlIGNvbW1hbmQKLWxpbmUgY2FuIGJlIHJlY29nbml6ZWQgc28gbG9uZyBhcyB0aGV5IHByb3ZpZGUgYSBwcmVmaXggb2YgdGhlIG9wdGlvbgotbmFtZSB0aGF0IG1hdGNoZXMgZXhhY3RseSBvbmUgb2YgdGhlIGFjY2VwdGVkIG9wdGlvbnMuICBGb3IgZXhhbXBsZSwKLWlmIFx2YXJ7bG9uZ19vcHRpb25zfSBpcyBcY29kZXtbJ2ZvbycsICdmcm9iJ119LCB0aGUgb3B0aW9uCi1cbG9uZ3Byb2dyYW1vcHR7Zm99IHdpbGwgbWF0Y2ggYXMgXGxvbmdwcm9ncmFtb3B0e2Zvb30sIGJ1dAotXGxvbmdwcm9ncmFtb3B0e2Z9IHdpbGwgbm90IG1hdGNoIHVuaXF1ZWx5LCBzbyBcZXhjZXB0aW9ue0dldG9wdEVycm9yfQotd2lsbCBiZSByYWlzZWQuCi0KLVRoZSByZXR1cm4gdmFsdWUgY29uc2lzdHMgb2YgdHdvIGVsZW1lbnRzOiB0aGUgZmlyc3QgaXMgYSBsaXN0IG9mCi1cY29kZXsoXHZhcntvcHRpb259LCBcdmFye3ZhbHVlfSl9IHBhaXJzOyB0aGUgc2Vjb25kIGlzIHRoZSBsaXN0IG9mCi1wcm9ncmFtIGFyZ3VtZW50cyBsZWZ0IGFmdGVyIHRoZSBvcHRpb24gbGlzdCB3YXMgc3RyaXBwZWQgKHRoaXMgaXMgYQotdHJhaWxpbmcgc2xpY2Ugb2YgXHZhcnthcmdzfSkuICBFYWNoIG9wdGlvbi1hbmQtdmFsdWUgcGFpciByZXR1cm5lZAotaGFzIHRoZSBvcHRpb24gYXMgaXRzIGZpcnN0IGVsZW1lbnQsIHByZWZpeGVkIHdpdGggYSBoeXBoZW4gZm9yIHNob3J0Ci1vcHRpb25zIChlLmcuLCBcY29kZXsnLXgnfSkgb3IgdHdvIGh5cGhlbnMgZm9yIGxvbmcgb3B0aW9ucyAoZS5nLiwKLVxjb2RleyctfVxjb2Rley1sb25nLW9wdGlvbid9KSwgYW5kIHRoZSBvcHRpb24gYXJndW1lbnQgYXMgaXRzIHNlY29uZAotZWxlbWVudCwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBvcHRpb24gaGFzIG5vIGFyZ3VtZW50LiAgVGhlCi1vcHRpb25zIG9jY3VyIGluIHRoZSBsaXN0IGluIHRoZSBzYW1lIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZSBmb3VuZCwKLXRodXMgYWxsb3dpbmcgbXVsdGlwbGUgb2NjdXJyZW5jZXMuICBMb25nIGFuZCBzaG9ydCBvcHRpb25zIG1heSBiZQotbWl4ZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dudV9nZXRvcHR9e2FyZ3MsIG9wdGlvbnNcb3B0aW9uYWx7LCBsb25nX29wdGlvbnN9fQotVGhpcyBmdW5jdGlvbiB3b3JrcyBsaWtlIFxmdW5jdGlvbntnZXRvcHQoKX0sIGV4Y2VwdCB0aGF0IEdOVSBzdHlsZQotc2Nhbm5pbmcgbW9kZSBpcyB1c2VkIGJ5IGRlZmF1bHQuIFRoaXMgbWVhbnMgdGhhdCBvcHRpb24gYW5kCi1ub24tb3B0aW9uIGFyZ3VtZW50cyBtYXkgYmUgaW50ZXJtaXhlZC4gVGhlIFxmdW5jdGlvbntnZXRvcHQoKX0KLWZ1bmN0aW9uIHN0b3BzIHByb2Nlc3Npbmcgb3B0aW9ucyBhcyBzb29uIGFzIGEgbm9uLW9wdGlvbiBhcmd1bWVudCBpcwotZW5jb3VudGVyZWQuCi0KLUlmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIG9wdGlvbiBzdHJpbmcgaXMgYCsnLCBvciBpZiB0aGUKLWVudmlyb25tZW50IHZhcmlhYmxlIFBPU0lYTFlfQ09SUkVDVCBpcyBzZXQsIHRoZW4gb3B0aW9uIHByb2Nlc3NpbmcKLXN0b3BzIGFzIHNvb24gYXMgYSBub24tb3B0aW9uIGFyZ3VtZW50IGlzIGVuY291bnRlcmVkLgotCi1cdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtHZXRvcHRFcnJvcn0KLVRoaXMgaXMgcmFpc2VkIHdoZW4gYW4gdW5yZWNvZ25pemVkIG9wdGlvbiBpcyBmb3VuZCBpbiB0aGUgYXJndW1lbnQKLWxpc3Qgb3Igd2hlbiBhbiBvcHRpb24gcmVxdWlyaW5nIGFuIGFyZ3VtZW50IGlzIGdpdmVuIG5vbmUuCi1UaGUgYXJndW1lbnQgdG8gdGhlIGV4Y2VwdGlvbiBpcyBhIHN0cmluZyBpbmRpY2F0aW5nIHRoZSBjYXVzZSBvZiB0aGUKLWVycm9yLiAgRm9yIGxvbmcgb3B0aW9ucywgYW4gYXJndW1lbnQgZ2l2ZW4gdG8gYW4gb3B0aW9uIHdoaWNoIGRvZXMKLW5vdCByZXF1aXJlIG9uZSB3aWxsIGFsc28gY2F1c2UgdGhpcyBleGNlcHRpb24gdG8gYmUgcmFpc2VkLiAgVGhlCi1hdHRyaWJ1dGVzIFxtZW1iZXJ7bXNnfSBhbmQgXG1lbWJlcntvcHR9IGdpdmUgdGhlIGVycm9yIG1lc3NhZ2UgYW5kCi1yZWxhdGVkIG9wdGlvbjsgaWYgdGhlcmUgaXMgbm8gc3BlY2lmaWMgb3B0aW9uIHRvIHdoaWNoIHRoZSBleGNlcHRpb24KLXJlbGF0ZXMsIFxtZW1iZXJ7b3B0fSBpcyBhbiBlbXB0eSBzdHJpbmcuCi0KLVx2ZXJzaW9uY2hhbmdlZFtJbnRyb2R1Y2VkIFxleGNlcHRpb257R2V0b3B0RXJyb3J9IGFzIGEgc3lub255bSBmb3IKLSAgICAgICAgICAgICAgICBcZXhjZXB0aW9ue2Vycm9yfV17MS42fQotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317ZXJyb3J9Ci1BbGlhcyBmb3IgXGV4Y2VwdGlvbntHZXRvcHRFcnJvcn07IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotXGVuZHtleGNkZXNjfQotCi0KLUFuIGV4YW1wbGUgdXNpbmcgb25seSBcVU5JWHt9IHN0eWxlIG9wdGlvbnM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgZ2V0b3B0Ci0+Pj4gYXJncyA9ICctYSAtYiAtY2ZvbyAtZCBiYXIgYTEgYTInLnNwbGl0KCkKLT4+PiBhcmdzCi1bJy1hJywgJy1iJywgJy1jZm9vJywgJy1kJywgJ2JhcicsICdhMScsICdhMiddCi0+Pj4gb3B0bGlzdCwgYXJncyA9IGdldG9wdC5nZXRvcHQoYXJncywgJ2FiYzpkOicpCi0+Pj4gb3B0bGlzdAotWygnLWEnLCAnJyksICgnLWInLCAnJyksICgnLWMnLCAnZm9vJyksICgnLWQnLCAnYmFyJyldCi0+Pj4gYXJncwotWydhMScsICdhMiddCi1cZW5ke3ZlcmJhdGltfQotCi1Vc2luZyBsb25nIG9wdGlvbiBuYW1lcyBpcyBlcXVhbGx5IGVhc3k6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBzID0gJy0tY29uZGl0aW9uPWZvbyAtLXRlc3RpbmcgLS1vdXRwdXQtZmlsZSBhYmMuZGVmIC14IGExIGEyJwotPj4+IGFyZ3MgPSBzLnNwbGl0KCkKLT4+PiBhcmdzCi1bJy0tY29uZGl0aW9uPWZvbycsICctLXRlc3RpbmcnLCAnLS1vdXRwdXQtZmlsZScsICdhYmMuZGVmJywgJy14JywgJ2ExJywgJ2EyJ10KLT4+PiBvcHRsaXN0LCBhcmdzID0gZ2V0b3B0LmdldG9wdChhcmdzLCAneCcsIFsKLS4uLiAgICAgJ2NvbmRpdGlvbj0nLCAnb3V0cHV0LWZpbGU9JywgJ3Rlc3RpbmcnXSkKLT4+PiBvcHRsaXN0Ci1bKCctLWNvbmRpdGlvbicsICdmb28nKSwgKCctLXRlc3RpbmcnLCAnJyksICgnLS1vdXRwdXQtZmlsZScsICdhYmMuZGVmJyksICgnLXgnLAotICcnKV0KLT4+PiBhcmdzCi1bJ2ExJywgJ2EyJ10KLVxlbmR7dmVyYmF0aW19Ci0KLUluIGEgc2NyaXB0LCB0eXBpY2FsIHVzYWdlIGlzIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCBnZXRvcHQsIHN5cwotCi1kZWYgbWFpbigpOgotICAgIHRyeToKLSAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAiaG86diIsIFsiaGVscCIsICJvdXRwdXQ9Il0pCi0gICAgZXhjZXB0IGdldG9wdC5HZXRvcHRFcnJvciBhcyBlcnI6Ci0gICAgICAgICMgcHJpbnQgaGVscCBpbmZvcm1hdGlvbiBhbmQgZXhpdDoKLSAgICAgICAgcHJpbnQgc3RyKGVycikgIyB3aWxsIHByaW50IHNvbWV0aGluZyBsaWtlICJvcHRpb24gLWEgbm90IHJlY29nbml6ZWQiCi0gICAgICAgIHVzYWdlKCkKLSAgICAgICAgc3lzLmV4aXQoMikKLSAgICBvdXRwdXQgPSBOb25lCi0gICAgdmVyYm9zZSA9IEZhbHNlCi0gICAgZm9yIG8sIGEgaW4gb3B0czoKLSAgICAgICAgaWYgbyA9PSAiLXYiOgotICAgICAgICAgICAgdmVyYm9zZSA9IFRydWUKLSAgICAgICAgZWxpZiBvIGluICgiLWgiLCAiLS1oZWxwIik6Ci0gICAgICAgICAgICB1c2FnZSgpCi0gICAgICAgICAgICBzeXMuZXhpdCgpCi0gICAgICAgIGVsaWYgbyBpbiAoIi1vIiwgIi0tb3V0cHV0Iik6Ci0gICAgICAgICAgICBvdXRwdXQgPSBhCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBhc3NlcnQgRmFsc2UsICJ1bmhhbmRsZWQgb3B0aW9uIgotICAgICMgLi4uCi0KLWlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgbWFpbigpCi1cZW5ke3ZlcmJhdGltfQotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZW1vZHVsZXtvcHRwYXJzZX17TW9yZSBvYmplY3Qtb3JpZW50ZWQgY29tbWFuZCBsaW5lIG9wdGlvbiBwYXJzaW5nLn0KLVxlbmR7c2VlYWxzb30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliZ2V0cGFzcy50ZXggYi9Eb2MvbGliL2xpYmdldHBhc3MudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzQyNDM5Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGliZ2V0cGFzcy50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle2dldHBhc3N9Ci0gICAgICAgICAtLS0gUG9ydGFibGUgcGFzc3dvcmQgaW5wdXR9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtnZXRwYXNzfQotXG1vZHVsZXN5bm9wc2lze1BvcnRhYmxlIHJlYWRpbmcgb2YgcGFzc3dvcmRzIGFuZCByZXRyaWV2YWwgb2YgdGhlIHVzZXJpZC59Ci1cbW9kdWxlYXV0aG9ye1BpZXJzIExhdWRlcn17cGllcnNAY3Muc3Uub3ouYXV9Ci0lIFdpbmRvd3MgKCYgTWFjPykgc3VwcG9ydCBieSBHdWlkbyB2YW4gUm9zc3VtLgotXHNlY3Rpb25hdXRob3J7RnJlZCBMLiBEcmFrZSwgSnIufXtmZHJha2VAYWNtLm9yZ30KLQotCi1UaGUgXG1vZHVsZXtnZXRwYXNzfSBtb2R1bGUgcHJvdmlkZXMgdHdvIGZ1bmN0aW9uczoKLQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldHBhc3N9e1xvcHRpb25hbHtwcm9tcHRcb3B0aW9uYWx7LCBzdHJlYW19fX0KLSAgUHJvbXB0IHRoZSB1c2VyIGZvciBhIHBhc3N3b3JkIHdpdGhvdXQgZWNob2luZy4gIFRoZSB1c2VyIGlzCi0gIHByb21wdGVkIHVzaW5nIHRoZSBzdHJpbmcgXHZhcntwcm9tcHR9LCB3aGljaCBkZWZhdWx0cyB0bwotICBcY29kZXsnUGFzc3dvcmQ6ICd9LiBPbiBcVU5JWCwgdGhlIHByb21wdCBpcyB3cml0dGVuIHRvIHRoZQotICBmaWxlLWxpa2Ugb2JqZWN0IFx2YXJ7c3RyZWFtfSwgd2hpY2ggZGVmYXVsdHMgdG8KLSAgXGNvZGV7c3lzLnN0ZG91dH0gKHRoaXMgYXJndW1lbnQgaXMgaWdub3JlZCBvbiBXaW5kb3dzKS4KLQotICBBdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgXFVOSVgsIFdpbmRvd3MuCi0gIFx2ZXJzaW9uY2hhbmdlZFtUaGUgXHZhcntzdHJlYW19IHBhcmFtZXRlciB3YXMgYWRkZWRdezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXR1c2VyfXt9Ci0gIFJldHVybiB0aGUgYGBsb2dpbiBuYW1lJycgb2YgdGhlIHVzZXIuCi0gIEF2YWlsYWJpbGl0eTogXFVOSVgsIFdpbmRvd3MuCi0KLSAgVGhpcyBmdW5jdGlvbiBjaGVja3MgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBcZW52dmFye0xPR05BTUV9LAotICBcZW52dmFye1VTRVJ9LCBcZW52dmFye0xOQU1FfSBhbmQgXGVudnZhcntVU0VSTkFNRX0sIGluIG9yZGVyLCBhbmQKLSAgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IG9uZSB3aGljaCBpcyBzZXQgdG8gYSBub24tZW1wdHkKLSAgc3RyaW5nLiAgSWYgbm9uZSBhcmUgc2V0LCB0aGUgbG9naW4gbmFtZSBmcm9tIHRoZSBwYXNzd29yZCBkYXRhYmFzZQotICBpcyByZXR1cm5lZCBvbiBzeXN0ZW1zIHdoaWNoIHN1cHBvcnQgdGhlIFxyZWZtb2R1bGV7cHdkfSBtb2R1bGUsCi0gIG90aGVyd2lzZSwgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZC4KLVxlbmR7ZnVuY2Rlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmdldHRleHQudGV4IGIvRG9jL2xpYi9saWJnZXR0ZXh0LnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFlZTI1NS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmdldHRleHQudGV4CisrKyAvZGV2L251bGwKQEAgLTEsNzczICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7Z2V0dGV4dH0gLS0tCi0gICAgICAgICBNdWx0aWxpbmd1YWwgaW50ZXJuYXRpb25hbGl6YXRpb24gc2VydmljZXN9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtnZXR0ZXh0fQotXG1vZHVsZXN5bm9wc2lze011bHRpbGluZ3VhbCBpbnRlcm5hdGlvbmFsaXphdGlvbiBzZXJ2aWNlcy59Ci1cbW9kdWxlYXV0aG9ye0JhcnJ5IEEuIFdhcnNhd317YmFycnlAem9wZS5jb219Ci1cc2VjdGlvbmF1dGhvcntCYXJyeSBBLiBXYXJzYXd9e2JhcnJ5QHpvcGUuY29tfQotCi0KLVRoZSBcbW9kdWxle2dldHRleHR9IG1vZHVsZSBwcm92aWRlcyBpbnRlcm5hdGlvbmFsaXphdGlvbiAoSTE4TikgYW5kCi1sb2NhbGl6YXRpb24gKEwxME4pIHNlcnZpY2VzIGZvciB5b3VyIFB5dGhvbiBtb2R1bGVzIGFuZCBhcHBsaWNhdGlvbnMuCi1JdCBzdXBwb3J0cyBib3RoIHRoZSBHTlUgXGNvZGV7Z2V0dGV4dH0gbWVzc2FnZSBjYXRhbG9nIEFQSSBhbmQgYQotaGlnaGVyIGxldmVsLCBjbGFzcy1iYXNlZCBBUEkgdGhhdCBtYXkgYmUgbW9yZSBhcHByb3ByaWF0ZSBmb3IgUHl0aG9uCi1maWxlcy4gIFRoZSBpbnRlcmZhY2UgZGVzY3JpYmVkIGJlbG93IGFsbG93cyB5b3UgdG8gd3JpdGUgeW91cgotbW9kdWxlIGFuZCBhcHBsaWNhdGlvbiBtZXNzYWdlcyBpbiBvbmUgbmF0dXJhbCBsYW5ndWFnZSwgYW5kIHByb3ZpZGUgYQotY2F0YWxvZyBvZiB0cmFuc2xhdGVkIG1lc3NhZ2VzIGZvciBydW5uaW5nIHVuZGVyIGRpZmZlcmVudCBuYXR1cmFsCi1sYW5ndWFnZXMuCi0KLVNvbWUgaGludHMgb24gbG9jYWxpemluZyB5b3VyIFB5dGhvbiBtb2R1bGVzIGFuZCBhcHBsaWNhdGlvbnMgYXJlIGFsc28KLWdpdmVuLgotCi1cc3Vic2VjdGlvbntHTlUgXHByb2dyYW17Z2V0dGV4dH0gQVBJfQotCi1UaGUgXG1vZHVsZXtnZXR0ZXh0fSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIEFQSSwgd2hpY2ggaXMgdmVyeQotc2ltaWxhciB0byB0aGUgR05VIFxwcm9ncmFte2dldHRleHR9IEFQSS4gIElmIHlvdSB1c2UgdGhpcyBBUEkgeW91Ci13aWxsIGFmZmVjdCB0aGUgdHJhbnNsYXRpb24gb2YgeW91ciBlbnRpcmUgYXBwbGljYXRpb24gZ2xvYmFsbHkuICBPZnRlbgotdGhpcyBpcyB3aGF0IHlvdSB3YW50IGlmIHlvdXIgYXBwbGljYXRpb24gaXMgbW9ub2xpbmd1YWwsIHdpdGggdGhlIGNob2ljZQotb2YgbGFuZ3VhZ2UgZGVwZW5kZW50IG9uIHRoZSBsb2NhbGUgb2YgeW91ciB1c2VyLiAgSWYgeW91IGFyZQotbG9jYWxpemluZyBhIFB5dGhvbiBtb2R1bGUsIG9yIGlmIHlvdXIgYXBwbGljYXRpb24gbmVlZHMgdG8gc3dpdGNoCi1sYW5ndWFnZXMgb24gdGhlIGZseSwgeW91IHByb2JhYmx5IHdhbnQgdG8gdXNlIHRoZSBjbGFzcy1iYXNlZCBBUEkKLWluc3RlYWQuCi0KLVxiZWdpbntmdW5jZGVzY317YmluZHRleHRkb21haW59e2RvbWFpblxvcHRpb25hbHssIGxvY2FsZWRpcn19Ci1CaW5kIHRoZSBcdmFye2RvbWFpbn0gdG8gdGhlIGxvY2FsZSBkaXJlY3RvcnkKLVx2YXJ7bG9jYWxlZGlyfS4gIE1vcmUgY29uY3JldGVseSwgXG1vZHVsZXtnZXR0ZXh0fSB3aWxsIGxvb2sgZm9yCi1iaW5hcnkgXGZpbGV7Lm1vfSBmaWxlcyBmb3IgdGhlIGdpdmVuIGRvbWFpbiB1c2luZyB0aGUgcGF0aCAob24gXFVOSVgpOgotXGZpbGV7XHZhcntsb2NhbGVkaXJ9L1x2YXJ7bGFuZ3VhZ2V9L0xDX01FU1NBR0VTL1x2YXJ7ZG9tYWlufS5tb30sCi13aGVyZSBcdmFye2xhbmd1YWdlc30gaXMgc2VhcmNoZWQgZm9yIGluIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKLVxlbnZ2YXJ7TEFOR1VBR0V9LCBcZW52dmFye0xDX0FMTH0sIFxlbnZ2YXJ7TENfTUVTU0FHRVN9LCBhbmQKLVxlbnZ2YXJ7TEFOR30gcmVzcGVjdGl2ZWx5LgotCi1JZiBcdmFye2xvY2FsZWRpcn0gaXMgb21pdHRlZCBvciBcY29kZXtOb25lfSwgdGhlbiB0aGUgY3VycmVudCBiaW5kaW5nCi1mb3IgXHZhcntkb21haW59IGlzIHJldHVybmVkLlxmb290bm90ZXsKLSAgICAgICAgVGhlIGRlZmF1bHQgbG9jYWxlIGRpcmVjdG9yeSBpcyBzeXN0ZW0gZGVwZW5kZW50OyBmb3IgZXhhbXBsZSwKLSAgICAgICAgb24gUmVkSGF0IExpbnV4IGl0IGlzIFxmaWxley91c3Ivc2hhcmUvbG9jYWxlfSwgYnV0IG9uIFNvbGFyaXMKLSAgICAgICAgaXQgaXMgXGZpbGV7L3Vzci9saWIvbG9jYWxlfS4gIFRoZSBcbW9kdWxle2dldHRleHR9IG1vZHVsZQotICAgICAgICBkb2VzIG5vdCB0cnkgdG8gc3VwcG9ydCB0aGVzZSBzeXN0ZW0gZGVwZW5kZW50IGRlZmF1bHRzOwotICAgICAgICBpbnN0ZWFkIGl0cyBkZWZhdWx0IGlzIFxmaWxle1xjb2Rle3N5cy5wcmVmaXh9L3NoYXJlL2xvY2FsZX0uCi0gICAgICAgIEZvciB0aGlzIHJlYXNvbiwgaXQgaXMgYWx3YXlzIGJlc3QgdG8gY2FsbAotICAgICAgICBcZnVuY3Rpb257YmluZHRleHRkb21haW4oKX0gd2l0aCBhbiBleHBsaWNpdCBhYnNvbHV0ZSBwYXRoIGF0Ci0gICAgICAgIHRoZSBzdGFydCBvZiB5b3VyIGFwcGxpY2F0aW9uLn0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317YmluZF90ZXh0ZG9tYWluX2NvZGVzZXR9e2RvbWFpblxvcHRpb25hbHssIGNvZGVzZXR9fQotQmluZCB0aGUgXHZhcntkb21haW59IHRvIFx2YXJ7Y29kZXNldH0sIGNoYW5naW5nIHRoZSBlbmNvZGluZyBvZgotc3RyaW5ncyByZXR1cm5lZCBieSB0aGUgXGZ1bmN0aW9ue2dldHRleHQoKX0gZmFtaWx5IG9mIGZ1bmN0aW9ucy4KLUlmIFx2YXJ7Y29kZXNldH0gaXMgb21pdHRlZCwgdGhlbiB0aGUgY3VycmVudCBiaW5kaW5nIGlzIHJldHVybmVkLgotCi1cdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dGV4dGRvbWFpbn17XG9wdGlvbmFse2RvbWFpbn19Ci1DaGFuZ2Ugb3IgcXVlcnkgdGhlIGN1cnJlbnQgZ2xvYmFsIGRvbWFpbi4gIElmIFx2YXJ7ZG9tYWlufSBpcwotXGNvZGV7Tm9uZX0sIHRoZW4gdGhlIGN1cnJlbnQgZ2xvYmFsIGRvbWFpbiBpcyByZXR1cm5lZCwgb3RoZXJ3aXNlIHRoZQotZ2xvYmFsIGRvbWFpbiBpcyBzZXQgdG8gXHZhcntkb21haW59LCB3aGljaCBpcyByZXR1cm5lZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0dGV4dH17bWVzc2FnZX0KLVJldHVybiB0aGUgbG9jYWxpemVkIHRyYW5zbGF0aW9uIG9mIFx2YXJ7bWVzc2FnZX0sIGJhc2VkIG9uIHRoZQotY3VycmVudCBnbG9iYWwgZG9tYWluLCBsYW5ndWFnZSwgYW5kIGxvY2FsZSBkaXJlY3RvcnkuICBUaGlzIGZ1bmN0aW9uCi1pcyB1c3VhbGx5IGFsaWFzZWQgYXMgXGZ1bmN0aW9ue199IGluIHRoZSBsb2NhbCBuYW1lc3BhY2UgKHNlZQotZXhhbXBsZXMgYmVsb3cpLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtsZ2V0dGV4dH17bWVzc2FnZX0KLUVxdWl2YWxlbnQgdG8gXGZ1bmN0aW9ue2dldHRleHQoKX0sIGJ1dCB0aGUgdHJhbnNsYXRpb24gaXMgcmV0dXJuZWQKLWluIHRoZSBwcmVmZXJyZWQgc3lzdGVtIGVuY29kaW5nLCBpZiBubyBvdGhlciBlbmNvZGluZyB3YXMgZXhwbGljaXRseQotc2V0IHdpdGggXGZ1bmN0aW9ue2JpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0KCl9LgotCi1cdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZGdldHRleHR9e2RvbWFpbiwgbWVzc2FnZX0KLUxpa2UgXGZ1bmN0aW9ue2dldHRleHQoKX0sIGJ1dCBsb29rIHRoZSBtZXNzYWdlIHVwIGluIHRoZSBzcGVjaWZpZWQKLVx2YXJ7ZG9tYWlufS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bGRnZXR0ZXh0fXtkb21haW4sIG1lc3NhZ2V9Ci1FcXVpdmFsZW50IHRvIFxmdW5jdGlvbntkZ2V0dGV4dCgpfSwgYnV0IHRoZSB0cmFuc2xhdGlvbiBpcyByZXR1cm5lZAotaW4gdGhlIHByZWZlcnJlZCBzeXN0ZW0gZW5jb2RpbmcsIGlmIG5vIG90aGVyIGVuY29kaW5nIHdhcyBleHBsaWNpdGx5Ci1zZXQgd2l0aCBcZnVuY3Rpb257YmluZF90ZXh0ZG9tYWluX2NvZGVzZXQoKX0uCi0KLVx2ZXJzaW9uYWRkZWR7Mi40fQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtuZ2V0dGV4dH17c2luZ3VsYXIsIHBsdXJhbCwgbn0KLQotTGlrZSBcZnVuY3Rpb257Z2V0dGV4dCgpfSwgYnV0IGNvbnNpZGVyIHBsdXJhbCBmb3Jtcy4gSWYgYSB0cmFuc2xhdGlvbgotaXMgZm91bmQsIGFwcGx5IHRoZSBwbHVyYWwgZm9ybXVsYSB0byBcdmFye259LCBhbmQgcmV0dXJuIHRoZQotcmVzdWx0aW5nIG1lc3NhZ2UgKHNvbWUgbGFuZ3VhZ2VzIGhhdmUgbW9yZSB0aGFuIHR3byBwbHVyYWwgZm9ybXMpLgotSWYgbm8gdHJhbnNsYXRpb24gaXMgZm91bmQsIHJldHVybiBcdmFye3Npbmd1bGFyfSBpZiBcdmFye259IGlzIDE7Ci1yZXR1cm4gXHZhcntwbHVyYWx9IG90aGVyd2lzZS4KLQotVGhlIFBsdXJhbCBmb3JtdWxhIGlzIHRha2VuIGZyb20gdGhlIGNhdGFsb2cgaGVhZGVyLiBJdCBpcyBhIEMgb3IKLVB5dGhvbiBleHByZXNzaW9uIHRoYXQgaGFzIGEgZnJlZSB2YXJpYWJsZSBcdmFye259OyB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMKLXRvIHRoZSBpbmRleCBvZiB0aGUgcGx1cmFsIGluIHRoZSBjYXRhbG9nLiBTZWUgdGhlIEdOVSBnZXR0ZXh0Ci1kb2N1bWVudGF0aW9uIGZvciB0aGUgcHJlY2lzZSBzeW50YXggdG8gYmUgdXNlZCBpbiBcZmlsZXsucG99IGZpbGVzIGFuZCB0aGUKLWZvcm11bGFzIGZvciBhIHZhcmlldHkgb2YgbGFuZ3VhZ2VzLgotCi1cdmVyc2lvbmFkZGVkezIuM30KLQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtsbmdldHRleHR9e3Npbmd1bGFyLCBwbHVyYWwsIG59Ci1FcXVpdmFsZW50IHRvIFxmdW5jdGlvbntuZ2V0dGV4dCgpfSwgYnV0IHRoZSB0cmFuc2xhdGlvbiBpcyByZXR1cm5lZAotaW4gdGhlIHByZWZlcnJlZCBzeXN0ZW0gZW5jb2RpbmcsIGlmIG5vIG90aGVyIGVuY29kaW5nIHdhcyBleHBsaWNpdGx5Ci1zZXQgd2l0aCBcZnVuY3Rpb257YmluZF90ZXh0ZG9tYWluX2NvZGVzZXQoKX0uCi0KLVx2ZXJzaW9uYWRkZWR7Mi40fQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtkbmdldHRleHR9e2RvbWFpbiwgc2luZ3VsYXIsIHBsdXJhbCwgbn0KLUxpa2UgXGZ1bmN0aW9ue25nZXR0ZXh0KCl9LCBidXQgbG9vayB0aGUgbWVzc2FnZSB1cCBpbiB0aGUgc3BlY2lmaWVkCi1cdmFye2RvbWFpbn0uCi0KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtsZG5nZXR0ZXh0fXtkb21haW4sIHNpbmd1bGFyLCBwbHVyYWwsIG59Ci1FcXVpdmFsZW50IHRvIFxmdW5jdGlvbntkbmdldHRleHQoKX0sIGJ1dCB0aGUgdHJhbnNsYXRpb24gaXMgcmV0dXJuZWQKLWluIHRoZSBwcmVmZXJyZWQgc3lzdGVtIGVuY29kaW5nLCBpZiBubyBvdGhlciBlbmNvZGluZyB3YXMgZXhwbGljaXRseQotc2V0IHdpdGggXGZ1bmN0aW9ue2JpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0KCl9LgotCi1cdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotCi1Ob3RlIHRoYXQgR05VIFxwcm9ncmFte2dldHRleHR9IGFsc28gZGVmaW5lcyBhIFxmdW5jdGlvbntkY2dldHRleHQoKX0KLW1ldGhvZCwgYnV0IHRoaXMgd2FzIGRlZW1lZCBub3QgdXNlZnVsIGFuZCBzbyBpdCBpcyBjdXJyZW50bHkKLXVuaW1wbGVtZW50ZWQuCi0KLUhlcmUncyBhbiBleGFtcGxlIG9mIHR5cGljYWwgdXNhZ2UgZm9yIHRoaXMgQVBJOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgZ2V0dGV4dAotZ2V0dGV4dC5iaW5kdGV4dGRvbWFpbignbXlhcHBsaWNhdGlvbicsICcvcGF0aC90by9teS9sYW5ndWFnZS9kaXJlY3RvcnknKQotZ2V0dGV4dC50ZXh0ZG9tYWluKCdteWFwcGxpY2F0aW9uJykKLV8gPSBnZXR0ZXh0LmdldHRleHQKLSMgLi4uCi1wcmludCBfKCdUaGlzIGlzIGEgdHJhbnNsYXRhYmxlIHN0cmluZy4nKQotXGVuZHt2ZXJiYXRpbX0KLQotXHN1YnNlY3Rpb257Q2xhc3MtYmFzZWQgQVBJfQotCi1UaGUgY2xhc3MtYmFzZWQgQVBJIG9mIHRoZSBcbW9kdWxle2dldHRleHR9IG1vZHVsZSBnaXZlcyB5b3UgbW9yZQotZmxleGliaWxpdHkgYW5kIGdyZWF0ZXIgY29udmVuaWVuY2UgdGhhbiB0aGUgR05VIFxwcm9ncmFte2dldHRleHR9Ci1BUEkuICBJdCBpcyB0aGUgcmVjb21tZW5kZWQgd2F5IG9mIGxvY2FsaXppbmcgeW91ciBQeXRob24gYXBwbGljYXRpb25zIGFuZAotbW9kdWxlcy4gIFxtb2R1bGV7Z2V0dGV4dH0gZGVmaW5lcyBhIGBgdHJhbnNsYXRpb25zJycgY2xhc3Mgd2hpY2gKLWltcGxlbWVudHMgdGhlIHBhcnNpbmcgb2YgR05VIFxmaWxley5tb30gZm9ybWF0IGZpbGVzLCBhbmQgaGFzIG1ldGhvZHMKLWZvciByZXR1cm5pbmcgZWl0aGVyIHN0YW5kYXJkIDgtYml0IHN0cmluZ3Mgb3IgVW5pY29kZSBzdHJpbmdzLgotSW5zdGFuY2VzIG9mIHRoaXMgYGB0cmFuc2xhdGlvbnMnJyBjbGFzcyBjYW4gYWxzbyBpbnN0YWxsIHRoZW1zZWx2ZXMgCi1pbiB0aGUgYnVpbHQtaW4gbmFtZXNwYWNlIGFzIHRoZSBmdW5jdGlvbiBcZnVuY3Rpb257XygpfS4KLQotXGJlZ2lue2Z1bmNkZXNjfXtmaW5kfXtkb21haW5cb3B0aW9uYWx7LCBsb2NhbGVkaXJcb3B0aW9uYWx7LCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlc1xvcHRpb25hbHssIGFsbH19fX0KLVRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgc3RhbmRhcmQgXGZpbGV7Lm1vfSBmaWxlIHNlYXJjaAotYWxnb3JpdGhtLiAgSXQgdGFrZXMgYSBcdmFye2RvbWFpbn0sIGlkZW50aWNhbCB0byB3aGF0Ci1cZnVuY3Rpb257dGV4dGRvbWFpbigpfSB0YWtlcy4gIE9wdGlvbmFsIFx2YXJ7bG9jYWxlZGlyfSBpcyBhcyBpbgotXGZ1bmN0aW9ue2JpbmR0ZXh0ZG9tYWluKCl9ICBPcHRpb25hbCBcdmFye2xhbmd1YWdlc30gaXMgYSBsaXN0IG9mCi1zdHJpbmdzLCB3aGVyZSBlYWNoIHN0cmluZyBpcyBhIGxhbmd1YWdlIGNvZGUuCi0KLUlmIFx2YXJ7bG9jYWxlZGlyfSBpcyBub3QgZ2l2ZW4sIHRoZW4gdGhlIGRlZmF1bHQgc3lzdGVtIGxvY2FsZQotZGlyZWN0b3J5IGlzIHVzZWQuXGZvb3Rub3Rle1NlZSB0aGUgZm9vdG5vdGUgZm9yCi1cZnVuY3Rpb257YmluZHRleHRkb21haW4oKX0gYWJvdmUufSAgSWYgXHZhcntsYW5ndWFnZXN9IGlzIG5vdCBnaXZlbiwKLXRoZW4gdGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHNlYXJjaGVkOiBcZW52dmFye0xBTkdVQUdFfSwKLVxlbnZ2YXJ7TENfQUxMfSwgXGVudnZhcntMQ19NRVNTQUdFU30sIGFuZCBcZW52dmFye0xBTkd9LiAgVGhlIGZpcnN0IG9uZQotcmV0dXJuaW5nIGEgbm9uLWVtcHR5IHZhbHVlIGlzIHVzZWQgZm9yIHRoZSBcdmFye2xhbmd1YWdlc30gdmFyaWFibGUuCi1UaGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHNob3VsZCBjb250YWluIGEgY29sb24gc2VwYXJhdGVkIGxpc3Qgb2YKLWxhbmd1YWdlcywgd2hpY2ggd2lsbCBiZSBzcGxpdCBvbiB0aGUgY29sb24gdG8gcHJvZHVjZSB0aGUgZXhwZWN0ZWQKLWxpc3Qgb2YgbGFuZ3VhZ2UgY29kZSBzdHJpbmdzLgotCi1cZnVuY3Rpb257ZmluZCgpfSB0aGVuIGV4cGFuZHMgYW5kIG5vcm1hbGl6ZXMgdGhlIGxhbmd1YWdlcywgYW5kIHRoZW4KLWl0ZXJhdGVzIHRocm91Z2ggdGhlbSwgc2VhcmNoaW5nIGZvciBhbiBleGlzdGluZyBmaWxlIGJ1aWx0IG9mIHRoZXNlCi1jb21wb25lbnRzOgotCi1cZmlsZXtcdmFye2xvY2FsZWRpcn0vXHZhcntsYW5ndWFnZX0vTENfTUVTU0FHRVMvXHZhcntkb21haW59Lm1vfQotCi1UaGUgZmlyc3Qgc3VjaCBmaWxlIG5hbWUgdGhhdCBleGlzdHMgaXMgcmV0dXJuZWQgYnkgXGZ1bmN0aW9ue2ZpbmQoKX0uCi1JZiBubyBzdWNoIGZpbGUgaXMgZm91bmQsIHRoZW4gXGNvZGV7Tm9uZX0gaXMgcmV0dXJuZWQuIElmIFx2YXJ7YWxsfQotaXMgZ2l2ZW4sIGl0IHJldHVybnMgYSBsaXN0IG9mIGFsbCBmaWxlIG5hbWVzLCBpbiB0aGUgb3JkZXIgaW4gd2hpY2gKLXRoZXkgYXBwZWFyIGluIHRoZSBsYW5ndWFnZXMgbGlzdCBvciB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt0cmFuc2xhdGlvbn17ZG9tYWluXG9wdGlvbmFseywgbG9jYWxlZGlyXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlc1xvcHRpb25hbHssIGNsYXNzX1xvcHRpb25hbHssCi0JCQkgICAgICBmYWxsYmFja1xvcHRpb25hbHssIGNvZGVzZXR9fX19fX0KLVJldHVybiBhIFxjbGFzc3tUcmFuc2xhdGlvbnN9IGluc3RhbmNlIGJhc2VkIG9uIHRoZSBcdmFye2RvbWFpbn0sCi1cdmFye2xvY2FsZWRpcn0sIGFuZCBcdmFye2xhbmd1YWdlc30sIHdoaWNoIGFyZSBmaXJzdCBwYXNzZWQgdG8KLVxmdW5jdGlvbntmaW5kKCl9IHRvIGdldCBhIGxpc3Qgb2YgdGhlCi1hc3NvY2lhdGVkIFxmaWxley5tb30gZmlsZSBwYXRocy4gIEluc3RhbmNlcyB3aXRoCi1pZGVudGljYWwgXGZpbGV7Lm1vfSBmaWxlIG5hbWVzIGFyZSBjYWNoZWQuICBUaGUgYWN0dWFsIGNsYXNzIGluc3RhbnRpYXRlZAotaXMgZWl0aGVyIFx2YXJ7Y2xhc3NffSBpZiBwcm92aWRlZCwgb3RoZXJ3aXNlCi1cY2xhc3N7R05VVHJhbnNsYXRpb25zfS4gIFRoZSBjbGFzcydzIGNvbnN0cnVjdG9yIG11c3QgdGFrZSBhIHNpbmdsZQotZmlsZSBvYmplY3QgYXJndW1lbnQuIElmIHByb3ZpZGVkLCBcdmFye2NvZGVzZXR9IHdpbGwgY2hhbmdlIHRoZQotY2hhcnNldCB1c2VkIHRvIGVuY29kZSB0cmFuc2xhdGVkIHN0cmluZ3MuCi0KLUlmIG11bHRpcGxlIGZpbGVzIGFyZSBmb3VuZCwgbGF0ZXIgZmlsZXMgYXJlIHVzZWQgYXMgZmFsbGJhY2tzIGZvcgotZWFybGllciBvbmVzLiBUbyBhbGxvdyBzZXR0aW5nIHRoZSBmYWxsYmFjaywgXGZ1bmN0aW9ue2NvcHkuY29weX0KLWlzIHVzZWQgdG8gY2xvbmUgZWFjaCB0cmFuc2xhdGlvbiBvYmplY3QgZnJvbSB0aGUgY2FjaGU7IHRoZSBhY3R1YWwKLWluc3RhbmNlIGRhdGEgaXMgc3RpbGwgc2hhcmVkIHdpdGggdGhlIGNhY2hlLgotCi1JZiBubyBcZmlsZXsubW99IGZpbGUgaXMgZm91bmQsIHRoaXMgZnVuY3Rpb24gcmFpc2VzCi1cZXhjZXB0aW9ue0lPRXJyb3J9IGlmIFx2YXJ7ZmFsbGJhY2t9IGlzIGZhbHNlICh3aGljaCBpcyB0aGUgZGVmYXVsdCksCi1hbmQgcmV0dXJucyBhIFxjbGFzc3tOdWxsVHJhbnNsYXRpb25zfSBpbnN0YW5jZSBpZiBcdmFye2ZhbGxiYWNrfSBpcwotdHJ1ZS4KLQotXHZlcnNpb25jaGFuZ2VkW0FkZGVkIHRoZSBcdmFye2NvZGVzZXR9IHBhcmFtZXRlcl17Mi40fQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpbnN0YWxsfXtkb21haW5cb3B0aW9uYWx7LCBsb2NhbGVkaXJcb3B0aW9uYWx7LCB1bmljb2RlCi0JCQkgIFxvcHRpb25hbHssIGNvZGVzZXRcb3B0aW9uYWx7LCBuYW1lc319fX19Ci1UaGlzIGluc3RhbGxzIHRoZSBmdW5jdGlvbiBcZnVuY3Rpb257X30gaW4gUHl0aG9uJ3MgYnVpbHRpbiBuYW1lc3BhY2UsCi1iYXNlZCBvbiBcdmFye2RvbWFpbn0sIFx2YXJ7bG9jYWxlZGlyfSwgYW5kIFx2YXJ7Y29kZXNldH0gd2hpY2ggYXJlCi1wYXNzZWQgdG8gdGhlIGZ1bmN0aW9uIFxmdW5jdGlvbnt0cmFuc2xhdGlvbigpfS4gIFRoZSBcdmFye3VuaWNvZGV9Ci1mbGFnIGlzIHBhc3NlZCB0byB0aGUgcmVzdWx0aW5nIHRyYW5zbGF0aW9uIG9iamVjdCdzIFxtZXRob2R7aW5zdGFsbH0KLW1ldGhvZC4KLQotRm9yIHRoZSBcdmFye25hbWVzfSBwYXJhbWV0ZXIsIHBsZWFzZSBzZWUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZQotdHJhbnNsYXRpb24gb2JqZWN0J3MgXG1ldGhvZHtpbnN0YWxsfSBtZXRob2QuCi0KLUFzIHNlZW4gYmVsb3csIHlvdSB1c3VhbGx5IG1hcmsgdGhlIHN0cmluZ3MgaW4geW91ciBhcHBsaWNhdGlvbiB0aGF0IGFyZQotY2FuZGlkYXRlcyBmb3IgdHJhbnNsYXRpb24sIGJ5IHdyYXBwaW5nIHRoZW0gaW4gYSBjYWxsIHRvIHRoZQotXGZ1bmN0aW9ue18oKX0gZnVuY3Rpb24sIGxpa2UgdGhpczoKLQotXGJlZ2lue3ZlcmJhdGltfQotcHJpbnQgXygnVGhpcyBzdHJpbmcgd2lsbCBiZSB0cmFuc2xhdGVkLicpCi1cZW5ke3ZlcmJhdGltfQotCi1Gb3IgY29udmVuaWVuY2UsIHlvdSB3YW50IHRoZSBcZnVuY3Rpb257XygpfSBmdW5jdGlvbiB0byBiZSBpbnN0YWxsZWQgaW4KLVB5dGhvbidzIGJ1aWx0aW4gbmFtZXNwYWNlLCBzbyBpdCBpcyBlYXNpbHkgYWNjZXNzaWJsZSBpbiBhbGwgbW9kdWxlcwotb2YgeW91ciBhcHBsaWNhdGlvbi4gIAotCi1cdmVyc2lvbmNoYW5nZWRbQWRkZWQgdGhlIFx2YXJ7Y29kZXNldH0gcGFyYW1ldGVyXXsyLjR9Ci1cdmVyc2lvbmNoYW5nZWRbQWRkZWQgdGhlIFx2YXJ7bmFtZXN9IHBhcmFtZXRlcl17Mi41fQotXGVuZHtmdW5jZGVzY30KLQotXHN1YnN1YnNlY3Rpb257VGhlIFxjbGFzc3tOdWxsVHJhbnNsYXRpb25zfSBjbGFzc30KLVRyYW5zbGF0aW9uIGNsYXNzZXMgYXJlIHdoYXQgYWN0dWFsbHkgaW1wbGVtZW50IHRoZSB0cmFuc2xhdGlvbiBvZgotb3JpZ2luYWwgc291cmNlIGZpbGUgbWVzc2FnZSBzdHJpbmdzIHRvIHRyYW5zbGF0ZWQgbWVzc2FnZSBzdHJpbmdzLgotVGhlIGJhc2UgY2xhc3MgdXNlZCBieSBhbGwgdHJhbnNsYXRpb24gY2xhc3NlcyBpcwotXGNsYXNze051bGxUcmFuc2xhdGlvbnN9OyB0aGlzIHByb3ZpZGVzIHRoZSBiYXNpYyBpbnRlcmZhY2UgeW91IGNhbiB1c2UKLXRvIHdyaXRlIHlvdXIgb3duIHNwZWNpYWxpemVkIHRyYW5zbGF0aW9uIGNsYXNzZXMuICBIZXJlIGFyZSB0aGUKLW1ldGhvZHMgb2YgXGNsYXNze051bGxUcmFuc2xhdGlvbnN9OgotCi1cYmVnaW57bWV0aG9kZGVzY31bTnVsbFRyYW5zbGF0aW9uc117X19pbml0X199e1xvcHRpb25hbHtmcH19Ci1UYWtlcyBhbiBvcHRpb25hbCBmaWxlIG9iamVjdCBcdmFye2ZwfSwgd2hpY2ggaXMgaWdub3JlZCBieSB0aGUgYmFzZQotY2xhc3MuICBJbml0aWFsaXplcyBgYHByb3RlY3RlZCcnIGluc3RhbmNlIHZhcmlhYmxlcyBcdmFye19pbmZvfSBhbmQKLVx2YXJ7X2NoYXJzZXR9IHdoaWNoIGFyZSBzZXQgYnkgZGVyaXZlZCBjbGFzc2VzLCBhcyB3ZWxsIGFzIFx2YXJ7X2ZhbGxiYWNrfSwKLXdoaWNoIGlzIHNldCB0aHJvdWdoIFxtZXRob2R7YWRkX2ZhbGxiYWNrfS4gIEl0IHRoZW4gY2FsbHMKLVxjb2Rle3NlbGYuX3BhcnNlKGZwKX0gaWYgXHZhcntmcH0gaXMgbm90IFxjb2Rle05vbmV9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTnVsbFRyYW5zbGF0aW9uc117X3BhcnNlfXtmcH0KLU5vLW9wJ2QgaW4gdGhlIGJhc2UgY2xhc3MsIHRoaXMgbWV0aG9kIHRha2VzIGZpbGUgb2JqZWN0IFx2YXJ7ZnB9LCBhbmQKLXJlYWRzIHRoZSBkYXRhIGZyb20gdGhlIGZpbGUsIGluaXRpYWxpemluZyBpdHMgbWVzc2FnZSBjYXRhbG9nLiAgSWYKLXlvdSBoYXZlIGFuIHVuc3VwcG9ydGVkIG1lc3NhZ2UgY2F0YWxvZyBmaWxlIGZvcm1hdCwgeW91IHNob3VsZAotb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcGFyc2UgeW91ciBmb3JtYXQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtOdWxsVHJhbnNsYXRpb25zXXthZGRfZmFsbGJhY2t9e2ZhbGxiYWNrfQotQWRkIFx2YXJ7ZmFsbGJhY2t9IGFzIHRoZSBmYWxsYmFjayBvYmplY3QgZm9yIHRoZSBjdXJyZW50IHRyYW5zbGF0aW9uCi1vYmplY3QuIEEgdHJhbnNsYXRpb24gb2JqZWN0IHNob3VsZCBjb25zdWx0IHRoZSBmYWxsYmFjayBpZiBpdCBjYW5ub3QKLXByb3ZpZGUgYSB0cmFuc2xhdGlvbiBmb3IgYSBnaXZlbiBtZXNzYWdlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTnVsbFRyYW5zbGF0aW9uc117Z2V0dGV4dH17bWVzc2FnZX0KLUlmIGEgZmFsbGJhY2sgaGFzIGJlZW4gc2V0LCBmb3J3YXJkIFxtZXRob2R7Z2V0dGV4dCgpfSB0byB0aGUgZmFsbGJhY2suCi1PdGhlcndpc2UsIHJldHVybiB0aGUgdHJhbnNsYXRlZCBtZXNzYWdlLiAgT3ZlcnJpZGRlbiBpbiBkZXJpdmVkIGNsYXNzZXMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtOdWxsVHJhbnNsYXRpb25zXXtsZ2V0dGV4dH17bWVzc2FnZX0KLUlmIGEgZmFsbGJhY2sgaGFzIGJlZW4gc2V0LCBmb3J3YXJkIFxtZXRob2R7bGdldHRleHQoKX0gdG8gdGhlIGZhbGxiYWNrLgotT3RoZXJ3aXNlLCByZXR1cm4gdGhlIHRyYW5zbGF0ZWQgbWVzc2FnZS4gIE92ZXJyaWRkZW4gaW4gZGVyaXZlZCBjbGFzc2VzLgotCi1cdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W051bGxUcmFuc2xhdGlvbnNde3VnZXR0ZXh0fXttZXNzYWdlfQotSWYgYSBmYWxsYmFjayBoYXMgYmVlbiBzZXQsIGZvcndhcmQgXG1ldGhvZHt1Z2V0dGV4dCgpfSB0byB0aGUgZmFsbGJhY2suCi1PdGhlcndpc2UsIHJldHVybiB0aGUgdHJhbnNsYXRlZCBtZXNzYWdlIGFzIGEgVW5pY29kZSBzdHJpbmcuCi1PdmVycmlkZGVuIGluIGRlcml2ZWQgY2xhc3Nlcy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W051bGxUcmFuc2xhdGlvbnNde25nZXR0ZXh0fXtzaW5ndWxhciwgcGx1cmFsLCBufQotSWYgYSBmYWxsYmFjayBoYXMgYmVlbiBzZXQsIGZvcndhcmQgXG1ldGhvZHtuZ2V0dGV4dCgpfSB0byB0aGUgZmFsbGJhY2suCi1PdGhlcndpc2UsIHJldHVybiB0aGUgdHJhbnNsYXRlZCBtZXNzYWdlLiAgT3ZlcnJpZGRlbiBpbiBkZXJpdmVkIGNsYXNzZXMuCi0KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTnVsbFRyYW5zbGF0aW9uc117bG5nZXR0ZXh0fXtzaW5ndWxhciwgcGx1cmFsLCBufQotSWYgYSBmYWxsYmFjayBoYXMgYmVlbiBzZXQsIGZvcndhcmQgXG1ldGhvZHtuZ2V0dGV4dCgpfSB0byB0aGUgZmFsbGJhY2suCi1PdGhlcndpc2UsIHJldHVybiB0aGUgdHJhbnNsYXRlZCBtZXNzYWdlLiAgT3ZlcnJpZGRlbiBpbiBkZXJpdmVkIGNsYXNzZXMuCi0KLVx2ZXJzaW9uYWRkZWR7Mi40fQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTnVsbFRyYW5zbGF0aW9uc117dW5nZXR0ZXh0fXtzaW5ndWxhciwgcGx1cmFsLCBufQotSWYgYSBmYWxsYmFjayBoYXMgYmVlbiBzZXQsIGZvcndhcmQgXG1ldGhvZHt1bmdldHRleHQoKX0gdG8gdGhlIGZhbGxiYWNrLgotT3RoZXJ3aXNlLCByZXR1cm4gdGhlIHRyYW5zbGF0ZWQgbWVzc2FnZSBhcyBhIFVuaWNvZGUgc3RyaW5nLgotT3ZlcnJpZGRlbiBpbiBkZXJpdmVkIGNsYXNzZXMuCi0KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTnVsbFRyYW5zbGF0aW9uc117aW5mb317fQotUmV0dXJuIHRoZSBgYHByb3RlY3RlZCcnIFxtZW1iZXJ7X2luZm99IHZhcmlhYmxlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTnVsbFRyYW5zbGF0aW9uc117Y2hhcnNldH17fQotUmV0dXJuIHRoZSBgYHByb3RlY3RlZCcnIFxtZW1iZXJ7X2NoYXJzZXR9IHZhcmlhYmxlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTnVsbFRyYW5zbGF0aW9uc117b3V0cHV0X2NoYXJzZXR9e30KLVJldHVybiB0aGUgYGBwcm90ZWN0ZWQnJyBcbWVtYmVye19vdXRwdXRfY2hhcnNldH0gdmFyaWFibGUsIHdoaWNoCi1kZWZpbmVzIHRoZSBlbmNvZGluZyB1c2VkIHRvIHJldHVybiB0cmFuc2xhdGVkIG1lc3NhZ2VzLgotCi1cdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W051bGxUcmFuc2xhdGlvbnNde3NldF9vdXRwdXRfY2hhcnNldH17Y2hhcnNldH0KLUNoYW5nZSB0aGUgYGBwcm90ZWN0ZWQnJyBcbWVtYmVye19vdXRwdXRfY2hhcnNldH0gdmFyaWFibGUsIHdoaWNoCi1kZWZpbmVzIHRoZSBlbmNvZGluZyB1c2VkIHRvIHJldHVybiB0cmFuc2xhdGVkIG1lc3NhZ2VzLgotCi1cdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W051bGxUcmFuc2xhdGlvbnNde2luc3RhbGx9e1xvcHRpb25hbHt1bmljb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG9wdGlvbmFseywgbmFtZXN9fX0KLUlmIHRoZSBcdmFye3VuaWNvZGV9IGZsYWcgaXMgZmFsc2UsIHRoaXMgbWV0aG9kIGluc3RhbGxzCi1cbWV0aG9ke3NlbGYuZ2V0dGV4dCgpfSBpbnRvIHRoZSBidWlsdC1pbiBuYW1lc3BhY2UsIGJpbmRpbmcgaXQgdG8KLVxzYW1we199LiAgSWYgXHZhcnt1bmljb2RlfSBpcyB0cnVlLCBpdCBiaW5kcyBcbWV0aG9ke3NlbGYudWdldHRleHQoKX0KLWluc3RlYWQuICBCeSBkZWZhdWx0LCBcdmFye3VuaWNvZGV9IGlzIGZhbHNlLgotCi1JZiB0aGUgXHZhcntuYW1lc30gcGFyYW1ldGVyIGlzIGdpdmVuLCBpdCBtdXN0IGJlIGEgc2VxdWVuY2UgY29udGFpbmluZwotdGhlIG5hbWVzIG9mIGZ1bmN0aW9ucyB5b3Ugd2FudCB0byBpbnN0YWxsIGluIHRoZSBidWlsdGluIG5hbWVzcGFjZSBpbgotYWRkaXRpb24gdG8gXGZ1bmN0aW9ue18oKX0uIFN1cHBvcnRlZCBuYW1lcyBhcmUgXGNvZGV7J2dldHRleHQnfSAoYm91bmQKLXRvIFxtZXRob2R7c2VsZi5nZXR0ZXh0KCl9IG9yIFxtZXRob2R7c2VsZi51Z2V0dGV4dCgpfSBhY2NvcmRpbmcgdG8gdGhlCi1cdmFye3VuaWNvZGV9IGZsYWcpLCBcY29kZXsnbmdldHRleHQnfSAoYm91bmQgdG8gXG1ldGhvZHtzZWxmLm5nZXR0ZXh0KCl9Ci1vciBcbWV0aG9ke3NlbGYudW5nZXR0ZXh0KCl9IGFjY29yZGluZyB0byB0aGUgXHZhcnt1bmljb2RlfSBmbGFnKSwKLVxjb2RleydsZ2V0dGV4dCd9IGFuZCBcY29kZXsnbG5nZXR0ZXh0J30uCi0KLU5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgb25lIHdheSwgYWxiZWl0IHRoZSBtb3N0IGNvbnZlbmllbnQgd2F5LCB0bwotbWFrZSB0aGUgXGZ1bmN0aW9ue199IGZ1bmN0aW9uIGF2YWlsYWJsZSB0byB5b3VyIGFwcGxpY2F0aW9uLiAgQmVjYXVzZSBpdAotYWZmZWN0cyB0aGUgZW50aXJlIGFwcGxpY2F0aW9uIGdsb2JhbGx5LCBhbmQgc3BlY2lmaWNhbGx5IHRoZSBidWlsdC1pbgotbmFtZXNwYWNlLCBsb2NhbGl6ZWQgbW9kdWxlcyBzaG91bGQgbmV2ZXIgaW5zdGFsbCBcZnVuY3Rpb257X30uCi1JbnN0ZWFkLCB0aGV5IHNob3VsZCB1c2UgdGhpcyBjb2RlIHRvIG1ha2UgXGZ1bmN0aW9ue199IGF2YWlsYWJsZSB0bwotdGhlaXIgbW9kdWxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgZ2V0dGV4dAotdCA9IGdldHRleHQudHJhbnNsYXRpb24oJ215bW9kdWxlJywgLi4uKQotXyA9IHQuZ2V0dGV4dAotXGVuZHt2ZXJiYXRpbX0KLQotVGhpcyBwdXRzIFxmdW5jdGlvbntffSBvbmx5IGluIHRoZSBtb2R1bGUncyBnbG9iYWwgbmFtZXNwYWNlIGFuZCBzbwotb25seSBhZmZlY3RzIGNhbGxzIHdpdGhpbiB0aGlzIG1vZHVsZS4KLQotXHZlcnNpb25jaGFuZ2VkW0FkZGVkIHRoZSBcdmFye25hbWVzfSBwYXJhbWV0ZXJdezIuNX0KLVxlbmR7bWV0aG9kZGVzY30KLQotXHN1YnN1YnNlY3Rpb257VGhlIFxjbGFzc3tHTlVUcmFuc2xhdGlvbnN9IGNsYXNzfQotCi1UaGUgXG1vZHVsZXtnZXR0ZXh0fSBtb2R1bGUgcHJvdmlkZXMgb25lIGFkZGl0aW9uYWwgY2xhc3MgZGVyaXZlZCBmcm9tCi1cY2xhc3N7TnVsbFRyYW5zbGF0aW9uc306IFxjbGFzc3tHTlVUcmFuc2xhdGlvbnN9LiAgVGhpcyBjbGFzcwotb3ZlcnJpZGVzIFxtZXRob2R7X3BhcnNlKCl9IHRvIGVuYWJsZSByZWFkaW5nIEdOVSBccHJvZ3JhbXtnZXR0ZXh0fQotZm9ybWF0IFxmaWxley5tb30gZmlsZXMgaW4gYm90aCBiaWctZW5kaWFuIGFuZCBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KLUl0IGFsc28gY29lcmNlcyBib3RoIG1lc3NhZ2UgaWRzIGFuZCBtZXNzYWdlIHN0cmluZ3MgdG8gVW5pY29kZS4KLQotXGNsYXNze0dOVVRyYW5zbGF0aW9uc30gcGFyc2VzIG9wdGlvbmFsIG1ldGEtZGF0YSBvdXQgb2YgdGhlCi10cmFuc2xhdGlvbiBjYXRhbG9nLiAgSXQgaXMgY29udmVudGlvbiB3aXRoIEdOVSBccHJvZ3JhbXtnZXR0ZXh0fSB0bwotaW5jbHVkZSBtZXRhLWRhdGEgYXMgdGhlIHRyYW5zbGF0aW9uIGZvciB0aGUgZW1wdHkgc3RyaW5nLiAgVGhpcwotbWV0YS1kYXRhIGlzIGluIFxyZmN7ODIyfS1zdHlsZSBcY29kZXtrZXk6IHZhbHVlfSBwYWlycywgYW5kIHNob3VsZAotY29udGFpbiB0aGUgXGNvZGV7UHJvamVjdC1JZC1WZXJzaW9ufSBrZXkuICBJZiB0aGUga2V5Ci1cY29kZXtDb250ZW50LVR5cGV9IGlzIGZvdW5kLCB0aGVuIHRoZSBcY29kZXtjaGFyc2V0fSBwcm9wZXJ0eSBpcyB1c2VkCi10byBpbml0aWFsaXplIHRoZSBgYHByb3RlY3RlZCcnIFxtZW1iZXJ7X2NoYXJzZXR9IGluc3RhbmNlIHZhcmlhYmxlLAotZGVmYXVsdGluZyB0byBcY29kZXtOb25lfSBpZiBub3QgZm91bmQuICBJZiB0aGUgY2hhcnNldCBlbmNvZGluZyBpcwotc3BlY2lmaWVkLCB0aGVuIGFsbCBtZXNzYWdlIGlkcyBhbmQgbWVzc2FnZSBzdHJpbmdzIHJlYWQgZnJvbSB0aGUKLWNhdGFsb2cgYXJlIGNvbnZlcnRlZCB0byBVbmljb2RlIHVzaW5nIHRoaXMgZW5jb2RpbmcuICBUaGUKLVxtZXRob2R7dWdldHRleHQoKX0gbWV0aG9kIGFsd2F5cyByZXR1cm5zIGEgVW5pY29kZSwgd2hpbGUgdGhlCi1cbWV0aG9ke2dldHRleHQoKX0gcmV0dXJucyBhbiBlbmNvZGVkIDgtYml0IHN0cmluZy4gIEZvciB0aGUgbWVzc2FnZQotaWQgYXJndW1lbnRzIG9mIGJvdGggbWV0aG9kcywgZWl0aGVyIFVuaWNvZGUgc3RyaW5ncyBvciA4LWJpdCBzdHJpbmdzCi1jb250YWluaW5nIG9ubHkgVVMtQVNDSUkgY2hhcmFjdGVycyBhcmUgYWNjZXB0YWJsZS4gIE5vdGUgdGhhdCB0aGUKLVVuaWNvZGUgdmVyc2lvbiBvZiB0aGUgbWV0aG9kcyAoaS5lLiBcbWV0aG9ke3VnZXR0ZXh0KCl9IGFuZAotXG1ldGhvZHt1bmdldHRleHQoKX0pIGFyZSB0aGUgcmVjb21tZW5kZWQgaW50ZXJmYWNlIHRvIHVzZSBmb3IKLWludGVybmF0aW9uYWxpemVkIFB5dGhvbiBwcm9ncmFtcy4KLQotVGhlIGVudGlyZSBzZXQgb2Yga2V5L3ZhbHVlIHBhaXJzIGFyZSBwbGFjZWQgaW50byBhIGRpY3Rpb25hcnkgYW5kIHNldAotYXMgdGhlIGBgcHJvdGVjdGVkJycgXG1lbWJlcntfaW5mb30gaW5zdGFuY2UgdmFyaWFibGUuCi0KLUlmIHRoZSBcZmlsZXsubW99IGZpbGUncyBtYWdpYyBudW1iZXIgaXMgaW52YWxpZCwgb3IgaWYgb3RoZXIgcHJvYmxlbXMKLW9jY3VyIHdoaWxlIHJlYWRpbmcgdGhlIGZpbGUsIGluc3RhbnRpYXRpbmcgYSBcY2xhc3N7R05VVHJhbnNsYXRpb25zfSBjbGFzcwotY2FuIHJhaXNlIFxleGNlcHRpb257SU9FcnJvcn0uCi0KLVRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgb3ZlcnJpZGRlbiBmcm9tIHRoZSBiYXNlIGNsYXNzIGltcGxlbWVudGF0aW9uOgotCi1cYmVnaW57bWV0aG9kZGVzY31bR05VVHJhbnNsYXRpb25zXXtnZXR0ZXh0fXttZXNzYWdlfQotTG9vayB1cCB0aGUgXHZhcnttZXNzYWdlfSBpZCBpbiB0aGUgY2F0YWxvZyBhbmQgcmV0dXJuIHRoZQotY29ycmVzcG9uZGluZyBtZXNzYWdlIHN0cmluZywgYXMgYW4gOC1iaXQgc3RyaW5nIGVuY29kZWQgd2l0aCB0aGUKLWNhdGFsb2cncyBjaGFyc2V0IGVuY29kaW5nLCBpZiBrbm93bi4gIElmIHRoZXJlIGlzIG5vIGVudHJ5IGluIHRoZQotY2F0YWxvZyBmb3IgdGhlIFx2YXJ7bWVzc2FnZX0gaWQsIGFuZCBhIGZhbGxiYWNrIGhhcyBiZWVuIHNldCwgdGhlCi1sb29rIHVwIGlzIGZvcndhcmRlZCB0byB0aGUgZmFsbGJhY2sncyBcbWV0aG9ke2dldHRleHQoKX0gbWV0aG9kLgotT3RoZXJ3aXNlLCB0aGUgXHZhcnttZXNzYWdlfSBpZCBpcyByZXR1cm5lZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0dOVVRyYW5zbGF0aW9uc117bGdldHRleHR9e21lc3NhZ2V9Ci1FcXVpdmFsZW50IHRvIFxtZXRob2R7Z2V0dGV4dCgpfSwgYnV0IHRoZSB0cmFuc2xhdGlvbiBpcyByZXR1cm5lZAotaW4gdGhlIHByZWZlcnJlZCBzeXN0ZW0gZW5jb2RpbmcsIGlmIG5vIG90aGVyIGVuY29kaW5nIHdhcyBleHBsaWNpdGx5Ci1zZXQgd2l0aCBcbWV0aG9ke3NldF9vdXRwdXRfY2hhcnNldCgpfS4KLQotXHZlcnNpb25hZGRlZHsyLjR9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtHTlVUcmFuc2xhdGlvbnNde3VnZXR0ZXh0fXttZXNzYWdlfQotTG9vayB1cCB0aGUgXHZhcnttZXNzYWdlfSBpZCBpbiB0aGUgY2F0YWxvZyBhbmQgcmV0dXJuIHRoZQotY29ycmVzcG9uZGluZyBtZXNzYWdlIHN0cmluZywgYXMgYSBVbmljb2RlIHN0cmluZy4gIElmIHRoZXJlIGlzIG5vCi1lbnRyeSBpbiB0aGUgY2F0YWxvZyBmb3IgdGhlIFx2YXJ7bWVzc2FnZX0gaWQsIGFuZCBhIGZhbGxiYWNrIGhhcyBiZWVuCi1zZXQsIHRoZSBsb29rIHVwIGlzIGZvcndhcmRlZCB0byB0aGUgZmFsbGJhY2sncyBcbWV0aG9ke3VnZXR0ZXh0KCl9Ci1tZXRob2QuICBPdGhlcndpc2UsIHRoZSBcdmFye21lc3NhZ2V9IGlkIGlzIHJldHVybmVkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bR05VVHJhbnNsYXRpb25zXXtuZ2V0dGV4dH17c2luZ3VsYXIsIHBsdXJhbCwgbn0KLURvIGEgcGx1cmFsLWZvcm1zIGxvb2t1cCBvZiBhIG1lc3NhZ2UgaWQuICBcdmFye3Npbmd1bGFyfSBpcyB1c2VkIGFzCi10aGUgbWVzc2FnZSBpZCBmb3IgcHVycG9zZXMgb2YgbG9va3VwIGluIHRoZSBjYXRhbG9nLCB3aGlsZSBcdmFye259IGlzCi11c2VkIHRvIGRldGVybWluZSB3aGljaCBwbHVyYWwgZm9ybSB0byB1c2UuICBUaGUgcmV0dXJuZWQgbWVzc2FnZQotc3RyaW5nIGlzIGFuIDgtYml0IHN0cmluZyBlbmNvZGVkIHdpdGggdGhlIGNhdGFsb2cncyBjaGFyc2V0IGVuY29kaW5nLAotaWYga25vd24uCi0KLUlmIHRoZSBtZXNzYWdlIGlkIGlzIG5vdCBmb3VuZCBpbiB0aGUgY2F0YWxvZywgYW5kIGEgZmFsbGJhY2sgaXMKLXNwZWNpZmllZCwgdGhlIHJlcXVlc3QgaXMgZm9yd2FyZGVkIHRvIHRoZSBmYWxsYmFjaydzCi1cbWV0aG9ke25nZXR0ZXh0KCl9IG1ldGhvZC4gIE90aGVyd2lzZSwgd2hlbiBcdmFye259IGlzIDEgXHZhcntzaW5ndWxhcn0gaXMKLXJldHVybmVkLCBhbmQgXHZhcntwbHVyYWx9IGlzIHJldHVybmVkIGluIGFsbCBvdGhlciBjYXNlcy4KLQotXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtHTlVUcmFuc2xhdGlvbnNde2xuZ2V0dGV4dH17c2luZ3VsYXIsIHBsdXJhbCwgbn0KLUVxdWl2YWxlbnQgdG8gXG1ldGhvZHtnZXR0ZXh0KCl9LCBidXQgdGhlIHRyYW5zbGF0aW9uIGlzIHJldHVybmVkCi1pbiB0aGUgcHJlZmVycmVkIHN5c3RlbSBlbmNvZGluZywgaWYgbm8gb3RoZXIgZW5jb2Rpbmcgd2FzIGV4cGxpY2l0bHkKLXNldCB3aXRoIFxtZXRob2R7c2V0X291dHB1dF9jaGFyc2V0KCl9LgotCi1cdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0dOVVRyYW5zbGF0aW9uc117dW5nZXR0ZXh0fXtzaW5ndWxhciwgcGx1cmFsLCBufQotRG8gYSBwbHVyYWwtZm9ybXMgbG9va3VwIG9mIGEgbWVzc2FnZSBpZC4gIFx2YXJ7c2luZ3VsYXJ9IGlzIHVzZWQgYXMKLXRoZSBtZXNzYWdlIGlkIGZvciBwdXJwb3NlcyBvZiBsb29rdXAgaW4gdGhlIGNhdGFsb2csIHdoaWxlIFx2YXJ7bn0gaXMKLXVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIHBsdXJhbCBmb3JtIHRvIHVzZS4gIFRoZSByZXR1cm5lZCBtZXNzYWdlCi1zdHJpbmcgaXMgYSBVbmljb2RlIHN0cmluZy4KLQotSWYgdGhlIG1lc3NhZ2UgaWQgaXMgbm90IGZvdW5kIGluIHRoZSBjYXRhbG9nLCBhbmQgYSBmYWxsYmFjayBpcwotc3BlY2lmaWVkLCB0aGUgcmVxdWVzdCBpcyBmb3J3YXJkZWQgdG8gdGhlIGZhbGxiYWNrJ3MKLVxtZXRob2R7dW5nZXR0ZXh0KCl9IG1ldGhvZC4gIE90aGVyd2lzZSwgd2hlbiBcdmFye259IGlzIDEgXHZhcntzaW5ndWxhcn0gaXMKLXJldHVybmVkLCBhbmQgXHZhcntwbHVyYWx9IGlzIHJldHVybmVkIGluIGFsbCBvdGhlciBjYXNlcy4KLQotSGVyZSBpcyBhbiBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1uID0gbGVuKG9zLmxpc3RkaXIoJy4nKSkKLWNhdCA9IEdOVVRyYW5zbGF0aW9ucyhzb21lZmlsZSkKLW1lc3NhZ2UgPSBjYXQudW5nZXR0ZXh0KAotICAgICdUaGVyZSBpcyAlKG51bSlkIGZpbGUgaW4gdGhpcyBkaXJlY3RvcnknLAotICAgICdUaGVyZSBhcmUgJShudW0pZCBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeScsCi0gICAgbikgJSB7J251bSc6IG59Ci1cZW5ke3ZlcmJhdGltfQotCi1cdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7bWV0aG9kZGVzY30KLQotXHN1YnN1YnNlY3Rpb257U29sYXJpcyBtZXNzYWdlIGNhdGFsb2cgc3VwcG9ydH0KLQotVGhlIFNvbGFyaXMgb3BlcmF0aW5nIHN5c3RlbSBkZWZpbmVzIGl0cyBvd24gYmluYXJ5Ci1cZmlsZXsubW99IGZpbGUgZm9ybWF0LCBidXQgc2luY2Ugbm8gZG9jdW1lbnRhdGlvbiBjYW4gYmUgZm91bmQgb24KLXRoaXMgZm9ybWF0LCBpdCBpcyBub3Qgc3VwcG9ydGVkIGF0IHRoaXMgdGltZS4KLQotXHN1YnN1YnNlY3Rpb257VGhlIENhdGFsb2cgY29uc3RydWN0b3J9Ci0KLUdOT01FXGluZGV4e0dOT01FfSB1c2VzIGEgdmVyc2lvbiBvZiB0aGUgXG1vZHVsZXtnZXR0ZXh0fSBtb2R1bGUgYnkKLUphbWVzIEhlbnN0cmlkZ2UsIGJ1dCB0aGlzIHZlcnNpb24gaGFzIGEgc2xpZ2h0bHkgZGlmZmVyZW50IEFQSS4gIEl0cwotZG9jdW1lbnRlZCB1c2FnZSB3YXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCBnZXR0ZXh0Ci1jYXQgPSBnZXR0ZXh0LkNhdGFsb2coZG9tYWluLCBsb2NhbGVkaXIpCi1fID0gY2F0LmdldHRleHQKLXByaW50IF8oJ2hlbGxvIHdvcmxkJykKLVxlbmR7dmVyYmF0aW19Ci0KLUZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhpcyBvbGRlciBtb2R1bGUsIHRoZSBmdW5jdGlvbgotXGZ1bmN0aW9ue0NhdGFsb2coKX0gaXMgYW4gYWxpYXMgZm9yIHRoZSBcZnVuY3Rpb257dHJhbnNsYXRpb24oKX0KLWZ1bmN0aW9uIGRlc2NyaWJlZCBhYm92ZS4KLQotT25lIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIG1vZHVsZSBhbmQgSGVuc3RyaWRnZSdzOiBoaXMgY2F0YWxvZwotb2JqZWN0cyBzdXBwb3J0ZWQgYWNjZXNzIHRocm91Z2ggYSBtYXBwaW5nIEFQSSwgYnV0IHRoaXMgYXBwZWFycyB0byBiZQotdW51c2VkIGFuZCBzbyBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4KLQotXHN1YnNlY3Rpb257SW50ZXJuYXRpb25hbGl6aW5nIHlvdXIgcHJvZ3JhbXMgYW5kIG1vZHVsZXN9Ci1JbnRlcm5hdGlvbmFsaXphdGlvbiAoSTE4TikgcmVmZXJzIHRvIHRoZSBvcGVyYXRpb24gYnkgd2hpY2ggYSBwcm9ncmFtCi1pcyBtYWRlIGF3YXJlIG9mIG11bHRpcGxlIGxhbmd1YWdlcy4gIExvY2FsaXphdGlvbiAoTDEwTikgcmVmZXJzIHRvCi10aGUgYWRhcHRhdGlvbiBvZiB5b3VyIHByb2dyYW0sIG9uY2UgaW50ZXJuYXRpb25hbGl6ZWQsIHRvIHRoZSBsb2NhbAotbGFuZ3VhZ2UgYW5kIGN1bHR1cmFsIGhhYml0cy4gIEluIG9yZGVyIHRvIHByb3ZpZGUgbXVsdGlsaW5ndWFsCi1tZXNzYWdlcyBmb3IgeW91ciBQeXRob24gcHJvZ3JhbXMsIHlvdSBuZWVkIHRvIHRha2UgdGhlIGZvbGxvd2luZwotc3RlcHM6Ci0KLVxiZWdpbntlbnVtZXJhdGV9Ci0gICAgXGl0ZW0gcHJlcGFyZSB5b3VyIHByb2dyYW0gb3IgbW9kdWxlIGJ5IHNwZWNpYWxseSBtYXJraW5nCi0gICAgICAgICAgdHJhbnNsYXRhYmxlIHN0cmluZ3MKLSAgICBcaXRlbSBydW4gYSBzdWl0ZSBvZiB0b29scyBvdmVyIHlvdXIgbWFya2VkIGZpbGVzIHRvIGdlbmVyYXRlIHJhdwotICAgICAgICAgIG1lc3NhZ2VzIGNhdGFsb2dzCi0gICAgXGl0ZW0gY3JlYXRlIGxhbmd1YWdlIHNwZWNpZmljIHRyYW5zbGF0aW9ucyBvZiB0aGUgbWVzc2FnZSBjYXRhbG9ncwotICAgIFxpdGVtIHVzZSB0aGUgXG1vZHVsZXtnZXR0ZXh0fSBtb2R1bGUgc28gdGhhdCBtZXNzYWdlIHN0cmluZ3MgYXJlCi0gICAgICAgICAgcHJvcGVybHkgdHJhbnNsYXRlZAotXGVuZHtlbnVtZXJhdGV9Ci0KLUluIG9yZGVyIHRvIHByZXBhcmUgeW91ciBjb2RlIGZvciBJMThOLCB5b3UgbmVlZCB0byBsb29rIGF0IGFsbCB0aGUKLXN0cmluZ3MgaW4geW91ciBmaWxlcy4gIEFueSBzdHJpbmcgdGhhdCBuZWVkcyB0byBiZSB0cmFuc2xhdGVkCi1zaG91bGQgYmUgbWFya2VkIGJ5IHdyYXBwaW5nIGl0IGluIFxjb2Rle18oJy4uLicpfSAtLS0gdGhhdCBpcywgYSBjYWxsCi10byB0aGUgZnVuY3Rpb24gXGZ1bmN0aW9ue18oKX0uICBGb3IgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotZmlsZW5hbWUgPSAnbXlsb2cudHh0JwotbWVzc2FnZSA9IF8oJ3dyaXRpbmcgYSBsb2cgbWVzc2FnZScpCi1mcCA9IG9wZW4oZmlsZW5hbWUsICd3JykKLWZwLndyaXRlKG1lc3NhZ2UpCi1mcC5jbG9zZSgpCi1cZW5ke3ZlcmJhdGltfQotCi1JbiB0aGlzIGV4YW1wbGUsIHRoZSBzdHJpbmcgXGNvZGV7J3dyaXRpbmcgYSBsb2cgbWVzc2FnZSd9IGlzIG1hcmtlZCBhcwotYSBjYW5kaWRhdGUgZm9yIHRyYW5zbGF0aW9uLCB3aGlsZSB0aGUgc3RyaW5ncyBcY29kZXsnbXlsb2cudHh0J30gYW5kCi1cY29kZXsndyd9IGFyZSBub3QuCi0KLVRoZSBQeXRob24gZGlzdHJpYnV0aW9uIGNvbWVzIHdpdGggdHdvIHRvb2xzIHdoaWNoIGhlbHAgeW91IGdlbmVyYXRlCi10aGUgbWVzc2FnZSBjYXRhbG9ncyBvbmNlIHlvdSd2ZSBwcmVwYXJlZCB5b3VyIHNvdXJjZSBjb2RlLiAgVGhlc2UgbWF5Ci1vciBtYXkgbm90IGJlIGF2YWlsYWJsZSBmcm9tIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbiwgYnV0IHRoZXkgY2FuIGJlCi1mb3VuZCBpbiBhIHNvdXJjZSBkaXN0cmlidXRpb24sIGluIHRoZSBcZmlsZXtUb29scy9pMThufSBkaXJlY3RvcnkuCi0KLVRoZSBccHJvZ3JhbXtweWdldHRleHR9XGZvb3Rub3Rle0ZyYW5cYyBjb2lzIFBpbmFyZCBoYXMKLXdyaXR0ZW4gYSBwcm9ncmFtIGNhbGxlZAotXHByb2dyYW17eHBvdH0gd2hpY2ggZG9lcyBhIHNpbWlsYXIgam9iLiAgSXQgaXMgYXZhaWxhYmxlIGFzIHBhcnQgb2YKLWhpcyBccHJvZ3JhbXtwby11dGlsc30gcGFja2FnZSBhdAotXHVybHtodHRwOi8vcG8tdXRpbHMucHJvZ2ljaWVscy1icGkuY2EvfS59IHByb2dyYW0KLXNjYW5zIGFsbCB5b3VyIFB5dGhvbiBzb3VyY2UgY29kZSBsb29raW5nIGZvciB0aGUgc3RyaW5ncyB5b3UKLXByZXZpb3VzbHkgbWFya2VkIGFzIHRyYW5zbGF0YWJsZS4gIEl0IGlzIHNpbWlsYXIgdG8gdGhlIEdOVQotXHByb2dyYW17Z2V0dGV4dH0gcHJvZ3JhbSBleGNlcHQgdGhhdCBpdCB1bmRlcnN0YW5kcyBhbGwgdGhlCi1pbnRyaWNhY2llcyBvZiBQeXRob24gc291cmNlIGNvZGUsIGJ1dCBrbm93cyBub3RoaW5nIGFib3V0IEMgb3IgXENwcAotc291cmNlIGNvZGUuICBZb3UgZG9uJ3QgbmVlZCBHTlUgXGNvZGV7Z2V0dGV4dH0gdW5sZXNzIHlvdSdyZSBhbHNvCi1nb2luZyB0byBiZSB0cmFuc2xhdGluZyBDIGNvZGUgKHN1Y2ggYXMgQyBleHRlbnNpb24gbW9kdWxlcykuCi0KLVxwcm9ncmFte3B5Z2V0dGV4dH0gZ2VuZXJhdGVzIHRleHR1YWwgVW5pZm9ydW0tc3R5bGUgaHVtYW4gcmVhZGFibGUKLW1lc3NhZ2UgY2F0YWxvZyBcZmlsZXsucG90fSBmaWxlcywgZXNzZW50aWFsbHkgc3RydWN0dXJlZCBodW1hbgotcmVhZGFibGUgZmlsZXMgd2hpY2ggY29udGFpbiBldmVyeSBtYXJrZWQgc3RyaW5nIGluIHRoZSBzb3VyY2UgY29kZSwKLWFsb25nIHdpdGggYSBwbGFjZWhvbGRlciBmb3IgdGhlIHRyYW5zbGF0aW9uIHN0cmluZ3MuCi1ccHJvZ3JhbXtweWdldHRleHR9IGlzIGEgY29tbWFuZCBsaW5lIHNjcmlwdCB0aGF0IHN1cHBvcnRzIGEgc2ltaWxhcgotY29tbWFuZCBsaW5lIGludGVyZmFjZSBhcyBccHJvZ3JhbXt4Z2V0dGV4dH07IGZvciBkZXRhaWxzIG9uIGl0cyB1c2UsCi1ydW46Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXB5Z2V0dGV4dC5weSAtLWhlbHAKLVxlbmR7dmVyYmF0aW19Ci0KLUNvcGllcyBvZiB0aGVzZSBcZmlsZXsucG90fSBmaWxlcyBhcmUgdGhlbiBoYW5kZWQgb3ZlciB0byB0aGUKLWluZGl2aWR1YWwgaHVtYW4gdHJhbnNsYXRvcnMgd2hvIHdyaXRlIGxhbmd1YWdlLXNwZWNpZmljIHZlcnNpb25zIGZvcgotZXZlcnkgc3VwcG9ydGVkIG5hdHVyYWwgbGFuZ3VhZ2UuICBUaGV5IHNlbmQgeW91IGJhY2sgdGhlIGZpbGxlZCBpbgotbGFuZ3VhZ2Utc3BlY2lmaWMgdmVyc2lvbnMgYXMgYSBcZmlsZXsucG99IGZpbGUuICBVc2luZyB0aGUKLVxwcm9ncmFte21zZ2ZtdC5weX1cZm9vdG5vdGV7XHByb2dyYW17bXNnZm10LnB5fSBpcyBiaW5hcnkKLWNvbXBhdGlibGUgd2l0aCBHTlUgXHByb2dyYW17bXNnZm10fSBleGNlcHQgdGhhdCBpdCBwcm92aWRlcyBhCi1zaW1wbGVyLCBhbGwtUHl0aG9uIGltcGxlbWVudGF0aW9uLiAgV2l0aCB0aGlzIGFuZAotXHByb2dyYW17cHlnZXR0ZXh0LnB5fSwgeW91IGdlbmVyYWxseSB3b24ndCBuZWVkIHRvIGluc3RhbGwgdGhlIEdOVQotXHByb2dyYW17Z2V0dGV4dH0gcGFja2FnZSB0byBpbnRlcm5hdGlvbmFsaXplIHlvdXIgUHl0aG9uCi1hcHBsaWNhdGlvbnMufSBwcm9ncmFtIChpbiB0aGUgXGZpbGV7VG9vbHMvaTE4bn0gZGlyZWN0b3J5KSwgeW91IHRha2UgdGhlCi1cZmlsZXsucG99IGZpbGVzIGZyb20geW91ciB0cmFuc2xhdG9ycyBhbmQgZ2VuZXJhdGUgdGhlCi1tYWNoaW5lLXJlYWRhYmxlIFxmaWxley5tb30gYmluYXJ5IGNhdGFsb2cgZmlsZXMuICBUaGUgXGZpbGV7Lm1vfQotZmlsZXMgYXJlIHdoYXQgdGhlIFxtb2R1bGV7Z2V0dGV4dH0gbW9kdWxlIHVzZXMgZm9yIHRoZSBhY3R1YWwKLXRyYW5zbGF0aW9uIHByb2Nlc3NpbmcgZHVyaW5nIHJ1bi10aW1lLgotCi1Ib3cgeW91IHVzZSB0aGUgXG1vZHVsZXtnZXR0ZXh0fSBtb2R1bGUgaW4geW91ciBjb2RlIGRlcGVuZHMgb24KLXdoZXRoZXIgeW91IGFyZSBpbnRlcm5hdGlvbmFsaXppbmcgYSBzaW5nbGUgbW9kdWxlIG9yIHlvdXIgZW50aXJlIGFwcGxpY2F0aW9uLgotVGhlIG5leHQgdHdvIHNlY3Rpb25zIHdpbGwgZGlzY3VzcyBlYWNoIGNhc2UuCi0KLVxzdWJzdWJzZWN0aW9ue0xvY2FsaXppbmcgeW91ciBtb2R1bGV9Ci0KLUlmIHlvdSBhcmUgbG9jYWxpemluZyB5b3VyIG1vZHVsZSwgeW91IG11c3QgdGFrZSBjYXJlIG5vdCB0byBtYWtlCi1nbG9iYWwgY2hhbmdlcywgZS5nLiB0byB0aGUgYnVpbHQtaW4gbmFtZXNwYWNlLiAgWW91IHNob3VsZCBub3QgdXNlCi10aGUgR05VIFxjb2Rle2dldHRleHR9IEFQSSBidXQgaW5zdGVhZCB0aGUgY2xhc3MtYmFzZWQgQVBJLiAgCi0KLUxldCdzIHNheSB5b3VyIG1vZHVsZSBpcyBjYWxsZWQgYGBzcGFtJycgYW5kIHRoZSBtb2R1bGUncyB2YXJpb3VzCi1uYXR1cmFsIGxhbmd1YWdlIHRyYW5zbGF0aW9uIFxmaWxley5tb30gZmlsZXMgcmVzaWRlIGluCi1cZmlsZXsvdXNyL3NoYXJlL2xvY2FsZX0gaW4gR05VIFxwcm9ncmFte2dldHRleHR9IGZvcm1hdC4gIEhlcmUncyB3aGF0Ci15b3Ugd291bGQgcHV0IGF0IHRoZSB0b3Agb2YgeW91ciBtb2R1bGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCBnZXR0ZXh0Ci10ID0gZ2V0dGV4dC50cmFuc2xhdGlvbignc3BhbScsICcvdXNyL3NoYXJlL2xvY2FsZScpCi1fID0gdC5sZ2V0dGV4dAotXGVuZHt2ZXJiYXRpbX0KLQotSWYgeW91ciB0cmFuc2xhdG9ycyB3ZXJlIHByb3ZpZGluZyB5b3Ugd2l0aCBVbmljb2RlIHN0cmluZ3MgaW4gdGhlaXIKLVxmaWxley5wb30gZmlsZXMsIHlvdSdkIGluc3RlYWQgZG86Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCBnZXR0ZXh0Ci10ID0gZ2V0dGV4dC50cmFuc2xhdGlvbignc3BhbScsICcvdXNyL3NoYXJlL2xvY2FsZScpCi1fID0gdC51Z2V0dGV4dAotXGVuZHt2ZXJiYXRpbX0KLQotXHN1YnN1YnNlY3Rpb257TG9jYWxpemluZyB5b3VyIGFwcGxpY2F0aW9ufQotCi1JZiB5b3UgYXJlIGxvY2FsaXppbmcgeW91ciBhcHBsaWNhdGlvbiwgeW91IGNhbiBpbnN0YWxsIHRoZSBcZnVuY3Rpb257XygpfQotZnVuY3Rpb24gZ2xvYmFsbHkgaW50byB0aGUgYnVpbHQtaW4gbmFtZXNwYWNlLCB1c3VhbGx5IGluIHRoZSBtYWluIGRyaXZlciBmaWxlCi1vZiB5b3VyIGFwcGxpY2F0aW9uLiAgVGhpcyB3aWxsIGxldCBhbGwgeW91ciBhcHBsaWNhdGlvbi1zcGVjaWZpYwotZmlsZXMganVzdCB1c2UgXGNvZGV7XygnLi4uJyl9IHdpdGhvdXQgaGF2aW5nIHRvIGV4cGxpY2l0bHkgaW5zdGFsbCBpdCBpbgotZWFjaCBmaWxlLgotCi1JbiB0aGUgc2ltcGxlIGNhc2UgdGhlbiwgeW91IG5lZWQgb25seSBhZGQgdGhlIGZvbGxvd2luZyBiaXQgb2YgY29kZQotdG8gdGhlIG1haW4gZHJpdmVyIGZpbGUgb2YgeW91ciBhcHBsaWNhdGlvbjoKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IGdldHRleHQKLWdldHRleHQuaW5zdGFsbCgnbXlhcHBsaWNhdGlvbicpCi1cZW5ke3ZlcmJhdGltfQotCi1JZiB5b3UgbmVlZCB0byBzZXQgdGhlIGxvY2FsZSBkaXJlY3Rvcnkgb3IgdGhlIFx2YXJ7dW5pY29kZX0gZmxhZywKLXlvdSBjYW4gcGFzcyB0aGVzZSBpbnRvIHRoZSBcZnVuY3Rpb257aW5zdGFsbCgpfSBmdW5jdGlvbjoKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IGdldHRleHQKLWdldHRleHQuaW5zdGFsbCgnbXlhcHBsaWNhdGlvbicsICcvdXNyL3NoYXJlL2xvY2FsZScsIHVuaWNvZGU9MSkKLVxlbmR7dmVyYmF0aW19Ci0KLVxzdWJzdWJzZWN0aW9ue0NoYW5naW5nIGxhbmd1YWdlcyBvbiB0aGUgZmx5fQotCi1JZiB5b3VyIHByb2dyYW0gbmVlZHMgdG8gc3VwcG9ydCBtYW55IGxhbmd1YWdlcyBhdCB0aGUgc2FtZSB0aW1lLCB5b3UKLW1heSB3YW50IHRvIGNyZWF0ZSBtdWx0aXBsZSB0cmFuc2xhdGlvbiBpbnN0YW5jZXMgYW5kIHRoZW4gc3dpdGNoCi1iZXR3ZWVuIHRoZW0gZXhwbGljaXRseSwgbGlrZSBzbzoKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IGdldHRleHQKLQotbGFuZzEgPSBnZXR0ZXh0LnRyYW5zbGF0aW9uKCdteWFwcGxpY2F0aW9uJywgbGFuZ3VhZ2VzPVsnZW4nXSkKLWxhbmcyID0gZ2V0dGV4dC50cmFuc2xhdGlvbignbXlhcHBsaWNhdGlvbicsIGxhbmd1YWdlcz1bJ2ZyJ10pCi1sYW5nMyA9IGdldHRleHQudHJhbnNsYXRpb24oJ215YXBwbGljYXRpb24nLCBsYW5ndWFnZXM9WydkZSddKQotCi0jIHN0YXJ0IGJ5IHVzaW5nIGxhbmd1YWdlMQotbGFuZzEuaW5zdGFsbCgpCi0KLSMgLi4uIHRpbWUgZ29lcyBieSwgdXNlciBzZWxlY3RzIGxhbmd1YWdlIDIKLWxhbmcyLmluc3RhbGwoKQotCi0jIC4uLiBtb3JlIHRpbWUgZ29lcyBieSwgdXNlciBzZWxlY3RzIGxhbmd1YWdlIDMKLWxhbmczLmluc3RhbGwoKQotXGVuZHt2ZXJiYXRpbX0KLQotXHN1YnN1YnNlY3Rpb257RGVmZXJyZWQgdHJhbnNsYXRpb25zfQotCi1JbiBtb3N0IGNvZGluZyBzaXR1YXRpb25zLCBzdHJpbmdzIGFyZSB0cmFuc2xhdGVkIHdoZXJlIHRoZXkgYXJlIGNvZGVkLgotT2NjYXNpb25hbGx5IGhvd2V2ZXIsIHlvdSBuZWVkIHRvIG1hcmsgc3RyaW5ncyBmb3IgdHJhbnNsYXRpb24sIGJ1dAotZGVmZXIgYWN0dWFsIHRyYW5zbGF0aW9uIHVudGlsIGxhdGVyLiAgQSBjbGFzc2ljIGV4YW1wbGUgaXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWFuaW1hbHMgPSBbJ21vbGx1c2snLAotICAgICAgICAgICAnYWxiYXRyb3NzJywKLQkgICAncmF0JywKLQkgICAncGVuZ3VpbicsCi0JICAgJ3B5dGhvbicsCi0JICAgXQotIyAuLi4KLWZvciBhIGluIGFuaW1hbHM6Ci0gICAgcHJpbnQgYQotXGVuZHt2ZXJiYXRpbX0KLQotSGVyZSwgeW91IHdhbnQgdG8gbWFyayB0aGUgc3RyaW5ncyBpbiB0aGUgXGNvZGV7YW5pbWFsc30gbGlzdCBhcyBiZWluZwotdHJhbnNsYXRhYmxlLCBidXQgeW91IGRvbid0IGFjdHVhbGx5IHdhbnQgdG8gdHJhbnNsYXRlIHRoZW0gdW50aWwgdGhleQotYXJlIHByaW50ZWQuCi0KLUhlcmUgaXMgb25lIHdheSB5b3UgY2FuIGhhbmRsZSB0aGlzIHNpdHVhdGlvbjoKLQotXGJlZ2lue3ZlcmJhdGltfQotZGVmIF8obWVzc2FnZSk6IHJldHVybiBtZXNzYWdlCi0KLWFuaW1hbHMgPSBbXygnbW9sbHVzaycpLAotICAgICAgICAgICBfKCdhbGJhdHJvc3MnKSwKLQkgICBfKCdyYXQnKSwKLQkgICBfKCdwZW5ndWluJyksCi0JICAgXygncHl0aG9uJyksCi0JICAgXQotCi1kZWwgXwotCi0jIC4uLgotZm9yIGEgaW4gYW5pbWFsczoKLSAgICBwcmludCBfKGEpCi1cZW5ke3ZlcmJhdGltfQotCi1UaGlzIHdvcmtzIGJlY2F1c2UgdGhlIGR1bW15IGRlZmluaXRpb24gb2YgXGZ1bmN0aW9ue18oKX0gc2ltcGx5IHJldHVybnMKLXRoZSBzdHJpbmcgdW5jaGFuZ2VkLiAgQW5kIHRoaXMgZHVtbXkgZGVmaW5pdGlvbiB3aWxsIHRlbXBvcmFyaWx5Ci1vdmVycmlkZSBhbnkgZGVmaW5pdGlvbiBvZiBcZnVuY3Rpb257XygpfSBpbiB0aGUgYnVpbHQtaW4gbmFtZXNwYWNlCi0odW50aWwgdGhlIFxrZXl3b3Jke2RlbH0gY29tbWFuZCkuCi1UYWtlIGNhcmUsIHRob3VnaCBpZiB5b3UgaGF2ZSBhIHByZXZpb3VzIGRlZmluaXRpb24gb2YgXGZ1bmN0aW9ue199IGluCi10aGUgbG9jYWwgbmFtZXNwYWNlLgotCi1Ob3RlIHRoYXQgdGhlIHNlY29uZCB1c2Ugb2YgXGZ1bmN0aW9ue18oKX0gd2lsbCBub3QgaWRlbnRpZnkgYGBhJycgYXMKLWJlaW5nIHRyYW5zbGF0YWJsZSB0byB0aGUgXHByb2dyYW17cHlnZXR0ZXh0fSBwcm9ncmFtLCBzaW5jZSBpdCBpcyBub3QKLWEgc3RyaW5nLgotCi1Bbm90aGVyIHdheSB0byBoYW5kbGUgdGhpcyBpcyB3aXRoIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotZGVmIE5fKG1lc3NhZ2UpOiByZXR1cm4gbWVzc2FnZQotCi1hbmltYWxzID0gW05fKCdtb2xsdXNrJyksCi0gICAgICAgICAgIE5fKCdhbGJhdHJvc3MnKSwKLQkgICBOXygncmF0JyksCi0JICAgTl8oJ3Blbmd1aW4nKSwKLQkgICBOXygncHl0aG9uJyksCi0JICAgXQotCi0jIC4uLgotZm9yIGEgaW4gYW5pbWFsczoKLSAgICBwcmludCBfKGEpCi1cZW5ke3ZlcmJhdGltfQotCi1JbiB0aGlzIGNhc2UsIHlvdSBhcmUgbWFya2luZyB0cmFuc2xhdGFibGUgc3RyaW5ncyB3aXRoIHRoZSBmdW5jdGlvbgotXGZ1bmN0aW9ue05fKCl9LFxmb290bm90ZXtUaGUgY2hvaWNlIG9mIFxmdW5jdGlvbntOXygpfSBoZXJlIGlzIHRvdGFsbHkKLWFyYml0cmFyeTsgaXQgY291bGQgaGF2ZSBqdXN0IGFzIGVhc2lseSBiZWVuCi1cZnVuY3Rpb257TWFya1RoaXNTdHJpbmdGb3JUcmFuc2xhdGlvbigpfS4KLX0gd2hpY2ggd29uJ3QgY29uZmxpY3Qgd2l0aCBhbnkgZGVmaW5pdGlvbiBvZgotXGZ1bmN0aW9ue18oKX0uICBIb3dldmVyLCB5b3Ugd2lsbCBuZWVkIHRvIHRlYWNoIHlvdXIgbWVzc2FnZSBleHRyYWN0aW9uCi1wcm9ncmFtIHRvIGxvb2sgZm9yIHRyYW5zbGF0YWJsZSBzdHJpbmdzIG1hcmtlZCB3aXRoIFxmdW5jdGlvbntOXygpfS4KLVxwcm9ncmFte3B5Z2V0dGV4dH0gYW5kIFxwcm9ncmFte3hwb3R9IGJvdGggc3VwcG9ydCB0aGlzIHRocm91Z2ggdGhlCi11c2Ugb2YgY29tbWFuZCBsaW5lIHN3aXRjaGVzLgotCi1cc3Vic3Vic2VjdGlvbntcZnVuY3Rpb257Z2V0dGV4dCgpfSB2cy4gXGZ1bmN0aW9ue2xnZXR0ZXh0KCl9fQotSW4gUHl0aG9uIDIuNCB0aGUgXGZ1bmN0aW9ue2xnZXR0ZXh0KCl9IGZhbWlseSBvZiBmdW5jdGlvbnMgd2VyZQotaW50cm9kdWNlZC4gVGhlIGludGVudGlvbiBvZiB0aGVzZSBmdW5jdGlvbnMgaXMgdG8gcHJvdmlkZSBhbgotYWx0ZXJuYXRpdmUgd2hpY2ggaXMgbW9yZSBjb21wbGlhbnQgd2l0aCB0aGUgY3VycmVudAotaW1wbGVtZW50YXRpb24gb2YgR05VIGdldHRleHQuIFVubGlrZSBcZnVuY3Rpb257Z2V0dGV4dCgpfSwgd2hpY2gKLXJldHVybnMgc3RyaW5ncyBlbmNvZGVkIHdpdGggdGhlIHNhbWUgY29kZXNldCB1c2VkIGluIHRoZQotdHJhbnNsYXRpb24gZmlsZSwgXGZ1bmN0aW9ue2xnZXR0ZXh0KCl9IHdpbGwgcmV0dXJuIHN0cmluZ3MKLWVuY29kZWQgd2l0aCB0aGUgcHJlZmVycmVkIHN5c3RlbSBlbmNvZGluZywgYXMgcmV0dXJuZWQgYnkKLVxmdW5jdGlvbntsb2NhbGUuZ2V0cHJlZmVycmVkZW5jb2RpbmcoKX0uIEFsc28gbm90aWNlIHRoYXQKLVB5dGhvbiAyLjQgaW50cm9kdWNlcyBuZXcgZnVuY3Rpb25zIHRvIGV4cGxpY2l0bHkgY2hvb3NlCi10aGUgY29kZXNldCB1c2VkIGluIHRyYW5zbGF0ZWQgc3RyaW5ncy4gSWYgYSBjb2Rlc2V0IGlzIGV4cGxpY2l0bHkKLXNldCwgZXZlbiBcZnVuY3Rpb257bGdldHRleHQoKX0gd2lsbCByZXR1cm4gdHJhbnNsYXRlZCBzdHJpbmdzIGluCi10aGUgcmVxdWVzdGVkIGNvZGVzZXQsIGFzIHdvdWxkIGJlIGV4cGVjdGVkIGluIHRoZSBHTlUgZ2V0dGV4dAotaW1wbGVtZW50YXRpb24uCi0KLVxzdWJzZWN0aW9ue0Fja25vd2xlZGdlbWVudHN9Ci0KLVRoZSBmb2xsb3dpbmcgcGVvcGxlIGNvbnRyaWJ1dGVkIGNvZGUsIGZlZWRiYWNrLCBkZXNpZ24gc3VnZ2VzdGlvbnMsCi1wcmV2aW91cyBpbXBsZW1lbnRhdGlvbnMsIGFuZCB2YWx1YWJsZSBleHBlcmllbmNlIHRvIHRoZSBjcmVhdGlvbiBvZgotdGhpcyBtb2R1bGU6Ci0KLVxiZWdpbntpdGVtaXplfQotICAgIFxpdGVtIFBldGVyIEZ1bmsKLSAgICBcaXRlbSBKYW1lcyBIZW5zdHJpZGdlCi0gICAgXGl0ZW0gSnVhbiBEYXZpZCBJYlwnYVx+bmV6IFBhbG9tYXIKLSAgICBcaXRlbSBNYXJjLUFuZHJcJ2UgTGVtYnVyZwotICAgIFxpdGVtIE1hcnRpbiB2b24gTFwib3dpcwotICAgIFxpdGVtIEZyYW5cYyBjb2lzIFBpbmFyZAotICAgIFxpdGVtIEJhcnJ5IFdhcnNhdwotICAgIFxpdGVtIEd1c3Rhdm8gTmllbWV5ZXIKLVxlbmR7aXRlbWl6ZX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliZ2xvYi50ZXggYi9Eb2MvbGliL2xpYmdsb2IudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2Y0ZmI3Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGliZ2xvYi50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle2dsb2J9IC0tLQotICAgICAgICAgXFVOSVh7fSBzdHlsZSBwYXRobmFtZSBwYXR0ZXJuIGV4cGFuc2lvbn0KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2dsb2J9Ci1cbW9kdWxlc3lub3BzaXN7XFVOSVhcIHNoZWxsIHN0eWxlIHBhdGhuYW1lIHBhdHRlcm4gZXhwYW5zaW9uLn0KLQotCi1UaGUgXG1vZHVsZXtnbG9ifSBtb2R1bGUgZmluZHMgYWxsIHRoZSBwYXRobmFtZXMgbWF0Y2hpbmcgYSBzcGVjaWZpZWQKLXBhdHRlcm4gYWNjb3JkaW5nIHRvIHRoZSBydWxlcyB1c2VkIGJ5IHRoZSBcVU5JWHt9IHNoZWxsLiAgTm8gdGlsZGUKLWV4cGFuc2lvbiBpcyBkb25lLCBidXQgXGNvZGV7Kn0sIFxjb2Rlez99LCBhbmQgY2hhcmFjdGVyIHJhbmdlcwotZXhwcmVzc2VkIHdpdGggXGNvZGV7W119IHdpbGwgYmUgY29ycmVjdGx5IG1hdGNoZWQuICBUaGlzIGlzIGRvbmUgYnkKLXVzaW5nIHRoZSBcZnVuY3Rpb257b3MubGlzdGRpcigpfSBhbmQgXGZ1bmN0aW9ue2ZubWF0Y2guZm5tYXRjaCgpfQotZnVuY3Rpb25zIGluIGNvbmNlcnQsIGFuZCBub3QgYnkgYWN0dWFsbHkgaW52b2tpbmcgYSBzdWJzaGVsbC4gIChGb3IKLXRpbGRlIGFuZCBzaGVsbCB2YXJpYWJsZSBleHBhbnNpb24sIHVzZSBcZnVuY3Rpb257b3MucGF0aC5leHBhbmR1c2VyKCl9Ci1hbmQgXGZ1bmN0aW9ue29zLnBhdGguZXhwYW5kdmFycygpfS4pCi1caW5kZXh7ZmlsZW5hbWVzIXBhdGhuYW1lIGV4cGFuc2lvbn0KLQotXGJlZ2lue2Z1bmNkZXNjfXtnbG9ifXtwYXRobmFtZX0KLVJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGxpc3Qgb2YgcGF0aCBuYW1lcyB0aGF0IG1hdGNoIFx2YXJ7cGF0aG5hbWV9LAotd2hpY2ggbXVzdCBiZSBhIHN0cmluZyBjb250YWluaW5nIGEgcGF0aCBzcGVjaWZpY2F0aW9uLgotXHZhcntwYXRobmFtZX0gY2FuIGJlIGVpdGhlciBhYnNvbHV0ZSAobGlrZQotXGZpbGV7L3Vzci9zcmMvUHl0aG9uLTEuNS9NYWtlZmlsZX0pIG9yIHJlbGF0aXZlIChsaWtlCi1cZmlsZXsuLi8uLi9Ub29scy8qLyouZ2lmfSksIGFuZCBjYW4gY29udGFpbiBzaGVsbC1zdHlsZSB3aWxkY2FyZHMuCi1Ccm9rZW4gc3ltbGlua3MgYXJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRzIChhcyBpbiB0aGUgc2hlbGwpLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpZ2xvYn17cGF0aG5hbWV9Ci1SZXR1cm4gYW4gaXRlcmF0b3Igd2hpY2ggeWllbGRzIHRoZSBzYW1lIHZhbHVlcyBhcyBcZnVuY3Rpb257Z2xvYigpfQotd2l0aG91dCBhY3R1YWxseSBzdG9yaW5nIHRoZW0gYWxsIHNpbXVsdGFuZW91c2x5LgotXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke2Z1bmNkZXNjfQotCi1Gb3IgZXhhbXBsZSwgY29uc2lkZXIgYSBkaXJlY3RvcnkgY29udGFpbmluZyBvbmx5IHRoZSBmb2xsb3dpbmcgZmlsZXM6Ci1cZmlsZXsxLmdpZn0sIFxmaWxlezIudHh0fSwgYW5kIFxmaWxle2NhcmQuZ2lmfS4gIFxmdW5jdGlvbntnbG9iKCl9Ci13aWxsIHByb2R1Y2UgdGhlIGZvbGxvd2luZyByZXN1bHRzLiAgTm90aWNlIGhvdyBhbnkgbGVhZGluZyBjb21wb25lbnRzCi1vZiB0aGUgcGF0aCBhcmUgcHJlc2VydmVkLgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gaW1wb3J0IGdsb2IKLT4+PiBnbG9iLmdsb2IoJy4vWzAtOV0uKicpCi1bJy4vMS5naWYnLCAnLi8yLnR4dCddCi0+Pj4gZ2xvYi5nbG9iKCcqLmdpZicpCi1bJzEuZ2lmJywgJ2NhcmQuZ2lmJ10KLT4+PiBnbG9iLmdsb2IoJz8uZ2lmJykKLVsnMS5naWYnXQotXGVuZHt2ZXJiYXRpbX0KLQotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZW1vZHVsZXtmbm1hdGNofXtTaGVsbC1zdHlsZSBmaWxlbmFtZSAobm90IHBhdGgpIGV4cGFuc2lvbn0KLVxlbmR7c2VlYWxzb30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliZ3JwLnRleCBiL0RvYy9saWIvbGliZ3JwLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VlZDdkMC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmdycC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle2dycH0gLS0tCi0gICAgICAgICBUaGUgZ3JvdXAgZGF0YWJhc2V9Ci0KLVxkZWNsYXJlbW9kdWxle2J1aWx0aW59e2dycH0KLSAgXHBsYXRmb3Jte1VuaXh9Ci1cbW9kdWxlc3lub3BzaXN7VGhlIGdyb3VwIGRhdGFiYXNlIChcZnVuY3Rpb257Z2V0Z3JuYW0oKX0gYW5kIGZyaWVuZHMpLn0KLQotCi1UaGlzIG1vZHVsZSBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIFxVTklYe30gZ3JvdXAgZGF0YWJhc2UuCi1JdCBpcyBhdmFpbGFibGUgb24gYWxsIFxVTklYe30gdmVyc2lvbnMuCi0KLUdyb3VwIGRhdGFiYXNlIGVudHJpZXMgYXJlIHJlcG9ydGVkIGFzIGEgdHVwbGUtbGlrZSBvYmplY3QsIHdob3NlCi1hdHRyaWJ1dGVzIGNvcnJlc3BvbmQgdG8gdGhlIG1lbWJlcnMgb2YgdGhlIFxjb2Rle2dyb3VwfSBzdHJ1Y3R1cmUKLShBdHRyaWJ1dGUgZmllbGQgYmVsb3csIHNlZSBcY29kZXs8cHdkLmg+fSk6Ci0KLVxiZWdpbnt0YWJsZWlpaX17cnxsfGx9e3RleHRybX17SW5kZXh9e0F0dHJpYnV0ZX17TWVhbmluZ30KLSAgXGxpbmVpaWl7MH17Z3JfbmFtZX17dGhlIG5hbWUgb2YgdGhlIGdyb3VwfQotICBcbGluZWlpaXsxfXtncl9wYXNzd2R9e3RoZSAoZW5jcnlwdGVkKSBncm91cCBwYXNzd29yZDsgb2Z0ZW4gZW1wdHl9Ci0gIFxsaW5laWlpezJ9e2dyX2dpZH17dGhlIG51bWVyaWNhbCBncm91cCBJRH0KLSAgXGxpbmVpaWl7M317Z3JfbWVtfXthbGwgdGhlIGdyb3VwIG1lbWJlcidzICB1c2VyICBuYW1lc30KLVxlbmR7dGFibGVpaWl9Ci0KLVRoZSBnaWQgaXMgYW4gaW50ZWdlciwgbmFtZSBhbmQgcGFzc3dvcmQgYXJlIHN0cmluZ3MsIGFuZCB0aGUgbWVtYmVyCi1saXN0IGlzIGEgbGlzdCBvZiBzdHJpbmdzLgotKE5vdGUgdGhhdCBtb3N0IHVzZXJzIGFyZSBub3QgZXhwbGljaXRseSBsaXN0ZWQgYXMgbWVtYmVycyBvZiB0aGUKLWdyb3VwIHRoZXkgYXJlIGluIGFjY29yZGluZyB0byB0aGUgcGFzc3dvcmQgZGF0YWJhc2UuICBDaGVjayBib3RoCi1kYXRhYmFzZXMgdG8gZ2V0IGNvbXBsZXRlIG1lbWJlcnNoaXAgaW5mb3JtYXRpb24uKQotCi1JdCBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgaXRlbXM6Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0Z3JnaWR9e2dpZH0KLVJldHVybiB0aGUgZ3JvdXAgZGF0YWJhc2UgZW50cnkgZm9yIHRoZSBnaXZlbiBudW1lcmljIGdyb3VwIElELgotXGV4Y2VwdGlvbntLZXlFcnJvcn0gaXMgcmFpc2VkIGlmIHRoZSBlbnRyeSBhc2tlZCBmb3IgY2Fubm90IGJlIGZvdW5kLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRncm5hbX17bmFtZX0KLVJldHVybiB0aGUgZ3JvdXAgZGF0YWJhc2UgZW50cnkgZm9yIHRoZSBnaXZlbiBncm91cCBuYW1lLgotXGV4Y2VwdGlvbntLZXlFcnJvcn0gaXMgcmFpc2VkIGlmIHRoZSBlbnRyeSBhc2tlZCBmb3IgY2Fubm90IGJlIGZvdW5kLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRncmFsbH17fQotUmV0dXJuIGEgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIGdyb3VwIGVudHJpZXMsIGluIGFyYml0cmFyeSBvcmRlci4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWVtb2R1bGV7cHdkfXtBbiBpbnRlcmZhY2UgdG8gdGhlIHVzZXIgZGF0YWJhc2UsIHNpbWlsYXIgdG8gdGhpcy59Ci0gIFxzZWVtb2R1bGV7c3B3ZH17QW4gaW50ZXJmYWNlIHRvIHRoZSBzaGFkb3cgcGFzc3dvcmQgZGF0YWJhc2UsIHNpbWlsYXIgdG8gdGhpcy59Ci1cZW5ke3NlZWFsc299CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmd6aXAudGV4IGIvRG9jL2xpYi9saWJnemlwLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRjYzY1OS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmd6aXAudGV4CisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtnemlwfSAtLS0KLSAgICAgICAgIFN1cHBvcnQgZm9yIFxwcm9ncmFte2d6aXB9IGZpbGVzfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17Z3ppcH0KLVxtb2R1bGVzeW5vcHNpc3tJbnRlcmZhY2VzIGZvciBccHJvZ3JhbXtnemlwfSBjb21wcmVzc2lvbiBhbmQKLWRlY29tcHJlc3Npb24gdXNpbmcgZmlsZSBvYmplY3RzLn0KLQotCi1UaGUgZGF0YSBjb21wcmVzc2lvbiBwcm92aWRlZCBieSB0aGUgXGNvZGV7emxpYn0gbW9kdWxlIGlzIGNvbXBhdGlibGUKLXdpdGggdGhhdCB1c2VkIGJ5IHRoZSBHTlUgY29tcHJlc3Npb24gcHJvZ3JhbSBccHJvZ3JhbXtnemlwfS4KLUFjY29yZGluZ2x5LCB0aGUgXG1vZHVsZXtnemlwfSBtb2R1bGUgcHJvdmlkZXMgdGhlIFxjbGFzc3tHemlwRmlsZX0KLWNsYXNzIHRvIHJlYWQgYW5kIHdyaXRlIFxwcm9ncmFte2d6aXB9LWZvcm1hdCBmaWxlcywgYXV0b21hdGljYWxseQotY29tcHJlc3Npbmcgb3IgZGVjb21wcmVzc2luZyB0aGUgZGF0YSBzbyBpdCBsb29rcyBsaWtlIGFuIG9yZGluYXJ5Ci1maWxlIG9iamVjdC4gIE5vdGUgdGhhdCBhZGRpdGlvbmFsIGZpbGUgZm9ybWF0cyB3aGljaCBjYW4gYmUKLWRlY29tcHJlc3NlZCBieSB0aGUgXHByb2dyYW17Z3ppcH0gYW5kIFxwcm9ncmFte2d1bnppcH0gcHJvZ3JhbXMsIHN1Y2ggCi1hcyB0aG9zZSBwcm9kdWNlZCBieSBccHJvZ3JhbXtjb21wcmVzc30gYW5kIFxwcm9ncmFte3BhY2t9LCBhcmUgbm90Ci1zdXBwb3J0ZWQgYnkgdGhpcyBtb2R1bGUuCi0KLVRoZSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGl0ZW1zOgotCi1cYmVnaW57Y2xhc3NkZXNjfXtHemlwRmlsZX17XG9wdGlvbmFse2ZpbGVuYW1lXG9wdGlvbmFseywgbW9kZVxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NsZXZlbFxvcHRpb25hbHssIGZpbGVvYmp9fX19fQotQ29uc3RydWN0b3IgZm9yIHRoZSBcY2xhc3N7R3ppcEZpbGV9IGNsYXNzLCB3aGljaCBzaW11bGF0ZXMgbW9zdCBvZgotdGhlIG1ldGhvZHMgb2YgYSBmaWxlIG9iamVjdCwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBcbWV0aG9ke3JlYWRpbnRvKCl9Ci1hbmQgXG1ldGhvZHt0cnVuY2F0ZSgpfSBtZXRob2RzLiAgQXQgbGVhc3Qgb25lIG9mCi1cdmFye2ZpbGVvYmp9IGFuZCBcdmFye2ZpbGVuYW1lfSBtdXN0IGJlIGdpdmVuIGEgbm9uLXRyaXZpYWwgdmFsdWUuCi0KLVRoZSBuZXcgY2xhc3MgaW5zdGFuY2UgaXMgYmFzZWQgb24gXHZhcntmaWxlb2JqfSwgd2hpY2ggY2FuIGJlIGEKLXJlZ3VsYXIgZmlsZSwgYSBcY2xhc3N7U3RyaW5nSU99IG9iamVjdCwgb3IgYW55IG90aGVyIG9iamVjdCB3aGljaAotc2ltdWxhdGVzIGEgZmlsZS4gIEl0IGRlZmF1bHRzIHRvIFxjb2Rle05vbmV9LCBpbiB3aGljaCBjYXNlCi1cdmFye2ZpbGVuYW1lfSBpcyBvcGVuZWQgdG8gcHJvdmlkZSBhIGZpbGUgb2JqZWN0LgotCi1XaGVuIFx2YXJ7ZmlsZW9ian0gaXMgbm90IFxjb2Rle05vbmV9LCB0aGUgXHZhcntmaWxlbmFtZX0gYXJndW1lbnQgaXMKLW9ubHkgdXNlZCB0byBiZSBpbmNsdWRlZCBpbiB0aGUgXHByb2dyYW17Z3ppcH0gZmlsZSBoZWFkZXIsIHdoaWNoIG1heQotaW5jbHVkZXMgdGhlIG9yaWdpbmFsIGZpbGVuYW1lIG9mIHRoZSB1bmNvbXByZXNzZWQgZmlsZS4gIEl0IGRlZmF1bHRzCi10byB0aGUgZmlsZW5hbWUgb2YgXHZhcntmaWxlb2JqfSwgaWYgZGlzY2VybmlibGU7IG90aGVyd2lzZSwgaXQKLWRlZmF1bHRzIHRvIHRoZSBlbXB0eSBzdHJpbmcsIGFuZCBpbiB0aGlzIGNhc2UgdGhlIG9yaWdpbmFsIGZpbGVuYW1lCi1pcyBub3QgaW5jbHVkZWQgaW4gdGhlIGhlYWRlci4KLQotVGhlIFx2YXJ7bW9kZX0gYXJndW1lbnQgY2FuIGJlIGFueSBvZiBcY29kZXsncid9LCBcY29kZXsncmInfSwKLVxjb2RleydhJ30sIFxjb2RleydhYid9LCBcY29kZXsndyd9LCBvciBcY29kZXsnd2InfSwgZGVwZW5kaW5nIG9uCi13aGV0aGVyIHRoZSBmaWxlIHdpbGwgYmUgcmVhZCBvciB3cml0dGVuLiAgVGhlIGRlZmF1bHQgaXMgdGhlIG1vZGUgb2YKLVx2YXJ7ZmlsZW9ian0gaWYgZGlzY2VybmlibGU7IG90aGVyd2lzZSwgdGhlIGRlZmF1bHQgaXMgXGNvZGV7J3JiJ30uCi1JZiBub3QgZ2l2ZW4sIHRoZSAnYicgZmxhZyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBtb2RlIHRvIGVuc3VyZSB0aGUKLWZpbGUgaXMgb3BlbmVkIGluIGJpbmFyeSBtb2RlIGZvciBjcm9zcy1wbGF0Zm9ybSBwb3J0YWJpbGl0eS4KLQotVGhlIFx2YXJ7Y29tcHJlc3NsZXZlbH0gYXJndW1lbnQgaXMgYW4gaW50ZWdlciBmcm9tIFxjb2RlezF9IHRvCi1cY29kZXs5fSBjb250cm9sbGluZyB0aGUgbGV2ZWwgb2YgY29tcHJlc3Npb247IFxjb2RlezF9IGlzIGZhc3Rlc3QgYW5kCi1wcm9kdWNlcyB0aGUgbGVhc3QgY29tcHJlc3Npb24sIGFuZCBcY29kZXs5fSBpcyBzbG93ZXN0IGFuZCBwcm9kdWNlcwotdGhlIG1vc3QgY29tcHJlc3Npb24uICBUaGUgZGVmYXVsdCBpcyBcY29kZXs5fS4KLQotQ2FsbGluZyBhIFxjbGFzc3tHemlwRmlsZX0gb2JqZWN0J3MgXG1ldGhvZHtjbG9zZSgpfSBtZXRob2QgZG9lcyBub3QKLWNsb3NlIFx2YXJ7ZmlsZW9ian0sIHNpbmNlIHlvdSBtaWdodCB3aXNoIHRvIGFwcGVuZCBtb3JlIG1hdGVyaWFsCi1hZnRlciB0aGUgY29tcHJlc3NlZCBkYXRhLiAgVGhpcyBhbHNvIGFsbG93cyB5b3UgdG8gcGFzcyBhCi1cY2xhc3N7U3RyaW5nSU99IG9iamVjdCBvcGVuZWQgZm9yIHdyaXRpbmcgYXMgXHZhcntmaWxlb2JqfSwgYW5kCi1yZXRyaWV2ZSB0aGUgcmVzdWx0aW5nIG1lbW9yeSBidWZmZXIgdXNpbmcgdGhlIFxjbGFzc3tTdHJpbmdJT30KLW9iamVjdCdzIFxtZXRob2R7Z2V0dmFsdWUoKX0gbWV0aG9kLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317b3Blbn17ZmlsZW5hbWVcb3B0aW9uYWx7LCBtb2RlXG9wdGlvbmFseywgY29tcHJlc3NsZXZlbH19fQotVGhpcyBpcyBhIHNob3J0aGFuZCBmb3IgXGNvZGV7R3ppcEZpbGUoXHZhcntmaWxlbmFtZX0sfQotXGNvZGV7XHZhcnttb2RlfSx9IFxjb2Rle1x2YXJ7Y29tcHJlc3NsZXZlbH0pfS4gIFRoZSBcdmFye2ZpbGVuYW1lfQotYXJndW1lbnQgaXMgcmVxdWlyZWQ7IFx2YXJ7bW9kZX0gZGVmYXVsdHMgdG8gXGNvZGV7J3JiJ30gYW5kCi1cdmFye2NvbXByZXNzbGV2ZWx9IGRlZmF1bHRzIHRvIFxjb2Rlezl9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWVtb2R1bGV7emxpYn17VGhlIGJhc2ljIGRhdGEgY29tcHJlc3Npb24gbW9kdWxlIG5lZWRlZCB0byBzdXBwb3J0Ci0gICAgICAgICAgICAgICAgICAgdGhlIFxwcm9ncmFte2d6aXB9IGZpbGUgZm9ybWF0Ln0KLVxlbmR7c2VlYWxzb30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliaGFzaGxpYi50ZXggYi9Eb2MvbGliL2xpYmhhc2hsaWIudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2Y1MTc5Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGliaGFzaGxpYi50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtoYXNobGlifSAtLS0KLSAgICAgICAgIFNlY3VyZSBoYXNoZXMgYW5kIG1lc3NhZ2UgZGlnZXN0c30KLQotXGRlY2xhcmVtb2R1bGV7YnVpbHRpbn17aGFzaGxpYn0KLVxtb2R1bGVzeW5vcHNpc3tTZWN1cmUgaGFzaCBhbmQgbWVzc2FnZSBkaWdlc3QgYWxnb3JpdGhtcy59Ci1cbW9kdWxlYXV0aG9ye0dyZWdvcnkgUC4gU21pdGh9e2dyZWdAdXNlcnMuc291cmNlZm9yZ2UubmV0fQotXHNlY3Rpb25hdXRob3J7R3JlZ29yeSBQLiBTbWl0aH17Z3JlZ0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXR9Ci0KLVx2ZXJzaW9uYWRkZWR7Mi41fQotCi1caW5kZXh7bWVzc2FnZSBkaWdlc3QsIE1ENX0KLVxpbmRleHtzZWN1cmUgaGFzaCBhbGdvcml0aG0sIFNIQTEsIFNIQTIyNCwgU0hBMjU2LCBTSEEzODQsIFNIQTUxMn0KLQotVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBhIGNvbW1vbiBpbnRlcmZhY2UgdG8gbWFueSBkaWZmZXJlbnQgc2VjdXJlIGhhc2ggYW5kCi1tZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG1zLiAgSW5jbHVkZWQgYXJlIHRoZSBGSVBTIHNlY3VyZSBoYXNoIGFsZ29yaXRobXMgU0hBMSwKLVNIQTIyNCwgU0hBMjU2LCBTSEEzODQsIGFuZCBTSEE1MTIgKGRlZmluZWQgaW4gRklQUyAxODAtMikgYXMgd2VsbCBhcyBSU0EncyBNRDUKLWFsZ29yaXRobSAoZGVmaW5lZCBpbiBJbnRlcm5ldCBccmZjezEzMjF9KS4KLVRoZSB0ZXJtcyBzZWN1cmUgaGFzaCBhbmQgbWVzc2FnZSBkaWdlc3QgYXJlIGludGVyY2hhbmdlYWJsZS4gIE9sZGVyCi1hbGdvcml0aG1zIHdlcmUgY2FsbGVkIG1lc3NhZ2UgZGlnZXN0cy4gIFRoZSBtb2Rlcm4gdGVybSBpcyBzZWN1cmUgaGFzaC4KLQotXHdhcm5pbmd7U29tZSBhbGdvcml0aG1zIGhhdmUga25vd24gaGFzaCBjb2xsaXNpb24gd2Vha25lc3Nlcywgc2VlIHRoZSBGQVEgYXQgdGhlIGVuZC59Ci0KLVRoZXJlIGlzIG9uZSBjb25zdHJ1Y3RvciBtZXRob2QgbmFtZWQgZm9yIGVhY2ggdHlwZSBvZiBcZGZue2hhc2h9LiAgQWxsIHJldHVybgotYSBoYXNoIG9iamVjdCB3aXRoIHRoZSBzYW1lIHNpbXBsZSBpbnRlcmZhY2UuCi1Gb3IgZXhhbXBsZTogdXNlIFxmdW5jdGlvbntzaGExKCl9IHRvIGNyZWF0ZSBhIFNIQTEgaGFzaCBvYmplY3QuCi1Zb3UgY2FuIG5vdyBmZWVkIHRoaXMgb2JqZWN0IHdpdGggYXJiaXRyYXJ5IHN0cmluZ3MgdXNpbmcgdGhlIFxtZXRob2R7dXBkYXRlKCl9Ci1tZXRob2QuICBBdCBhbnkgcG9pbnQgeW91IGNhbiBhc2sgaXQgZm9yIHRoZSBcZGZue2RpZ2VzdH0gb2YgdGhlIGNvbmNhdGVuYXRpb24KLW9mIHRoZSBzdHJpbmdzIGZlZCB0byBpdCBzbyBmYXIgdXNpbmcgdGhlIFxtZXRob2R7ZGlnZXN0KCl9IG9yCi1cbWV0aG9ke2hleGRpZ2VzdCgpfSBtZXRob2RzLgotCi1Db25zdHJ1Y3RvcnMgZm9yIGhhc2ggYWxnb3JpdGhtcyB0aGF0IGFyZSBhbHdheXMgcHJlc2VudCBpbiB0aGlzIG1vZHVsZSBhcmUKLVxmdW5jdGlvbnttZDUoKX0sIFxmdW5jdGlvbntzaGExKCl9LCBcZnVuY3Rpb257c2hhMjI0KCl9LCBcZnVuY3Rpb257c2hhMjU2KCl9LAotXGZ1bmN0aW9ue3NoYTM4NCgpfSwgYW5kIFxmdW5jdGlvbntzaGE1MTIoKX0uICBBZGRpdGlvbmFsIGFsZ29yaXRobXMgbWF5IGFsc28KLWJlIGF2YWlsYWJsZSBkZXBlbmRpbmcgdXBvbiB0aGUgT3BlblNTTCBsaWJyYXJ5IHRoYXQgUHl0aG9uIHVzZXMgb24geW91ciBwbGF0Zm9ybS4KLVxpbmRleHtPcGVuU1NMfQotCi1Gb3IgZXhhbXBsZSwgdG8gb2J0YWluIHRoZSBkaWdlc3Qgb2YgdGhlIHN0cmluZyBcY29kZXsnTm9ib2R5IGluc3BlY3RzCi10aGUgc3BhbW1pc2ggcmVwZXRpdGlvbid9OgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gaW1wb3J0IGhhc2hsaWIKLT4+PiBtID0gaGFzaGxpYi5tZDUoKQotPj4+IG0udXBkYXRlKCJOb2JvZHkgaW5zcGVjdHMiKQotPj4+IG0udXBkYXRlKCIgdGhlIHNwYW1taXNoIHJlcGV0aXRpb24iKQotPj4+IG0uZGlnZXN0KCkKLSdceGJiZFx4OWNceDgzXHhkZFx4MWVceGE1XHhjOVx4ZDlceGRlXHhjOVx4YTFceDhkXHhmMFx4ZmZceGU5JwotXGVuZHt2ZXJiYXRpbX0KLQotTW9yZSBjb25kZW5zZWQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBoYXNobGliLnNoYTIyNCgiTm9ib2R5IGluc3BlY3RzIHRoZSBzcGFtbWlzaCByZXBldGl0aW9uIikuaGV4ZGlnZXN0KCkKLSdhNDMzN2JjNDVhOGZjNTQ0YzAzZjUyZGM1NTBjZDZlMWU4NzAyMWJjODk2NTg4YmQ3OWU5MDFlMicKLVxlbmR7dmVyYmF0aW19Ci0KLUEgZ2VuZXJpYyBcZnVuY3Rpb257bmV3KCl9IGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgdGhlIHN0cmluZyBuYW1lIG9mIHRoZQotZGVzaXJlZCBhbGdvcml0aG0gYXMgaXRzIGZpcnN0IHBhcmFtZXRlciBhbHNvIGV4aXN0cyB0byBhbGxvdyBhY2Nlc3MgdG8gdGhlCi1hYm92ZSBsaXN0ZWQgaGFzaGVzIGFzIHdlbGwgYXMgYW55IG90aGVyIGFsZ29yaXRobXMgdGhhdCB5b3VyIE9wZW5TU0wgbGlicmFyeQotbWF5IG9mZmVyLiAgVGhlIG5hbWVkIGNvbnN0cnVjdG9ycyBhcmUgbXVjaCBmYXN0ZXIgdGhhbiBcZnVuY3Rpb257bmV3KCl9IGFuZAotc2hvdWxkIGJlIHByZWZlcnJlZC4KLQotVXNpbmcgXGZ1bmN0aW9ue25ldygpfSB3aXRoIGFuIGFsZ29yaXRobSBwcm92aWRlZCBieSBPcGVuU1NMOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gaCA9IGhhc2hsaWIubmV3KCdyaXBlbWQxNjAnKQotPj4+IGgudXBkYXRlKCJOb2JvZHkgaW5zcGVjdHMgdGhlIHNwYW1taXNoIHJlcGV0aXRpb24iKQotPj4+IGguaGV4ZGlnZXN0KCkKLSdjYzRhNWNlMWIzZGY0OGFlYzVkMjJkMWYxNmI4OTRhMGI4OTRlY2NjJwotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHByb3ZpZGVkIGFzIGNvbnN0YW50IGF0dHJpYnV0ZXMgb2YgdGhlIGhhc2ggb2JqZWN0cwotcmV0dXJuZWQgYnkgdGhlIGNvbnN0cnVjdG9yczoKLQotXGJlZ2lue2RhdGFkZXNjfXtkaWdlc3Rfc2l6ZX0KLSAgVGhlIHNpemUgb2YgdGhlIHJlc3VsdGluZyBkaWdlc3QgaW4gYnl0ZXMuCi1cZW5ke2RhdGFkZXNjfQotCi1BIGhhc2ggb2JqZWN0IGhhcyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtoYXNoXXt1cGRhdGV9e2FyZ30KLVVwZGF0ZSB0aGUgaGFzaCBvYmplY3Qgd2l0aCB0aGUgc3RyaW5nIFx2YXJ7YXJnfS4gIFJlcGVhdGVkIGNhbGxzIGFyZQotZXF1aXZhbGVudCB0byBhIHNpbmdsZSBjYWxsIHdpdGggdGhlIGNvbmNhdGVuYXRpb24gb2YgYWxsIHRoZQotYXJndW1lbnRzOiBcY29kZXttLnVwZGF0ZShhKTsgbS51cGRhdGUoYil9IGlzIGVxdWl2YWxlbnQgdG8KLVxjb2Rle20udXBkYXRlKGErYil9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31baGFzaF17ZGlnZXN0fXt9Ci1SZXR1cm4gdGhlIGRpZ2VzdCBvZiB0aGUgc3RyaW5ncyBwYXNzZWQgdG8gdGhlIFxtZXRob2R7dXBkYXRlKCl9Ci1tZXRob2Qgc28gZmFyLiAgVGhpcyBpcyBhIHN0cmluZyBvZiBcbWVtYmVye2RpZ2VzdF9zaXplfSBieXRlcyB3aGljaCBtYXkKLWNvbnRhaW4gbm9uLVxBU0NJSXt9IGNoYXJhY3RlcnMsIGluY2x1ZGluZyBudWxsIGJ5dGVzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31baGFzaF17aGV4ZGlnZXN0fXt9Ci1MaWtlIFxtZXRob2R7ZGlnZXN0KCl9IGV4Y2VwdCB0aGUgZGlnZXN0IGlzIHJldHVybmVkIGFzIGEgc3RyaW5nIG9mCi1kb3VibGUgbGVuZ3RoLCBjb250YWluaW5nIG9ubHkgaGV4YWRlY2ltYWwgZGlnaXRzLiAgVGhpcyBtYXkgCi1iZSB1c2VkIHRvIGV4Y2hhbmdlIHRoZSB2YWx1ZSBzYWZlbHkgaW4gZW1haWwgb3Igb3RoZXIgbm9uLWJpbmFyeQotZW52aXJvbm1lbnRzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31baGFzaF17Y29weX17fQotUmV0dXJuIGEgY29weSAoYGBjbG9uZScnKSBvZiB0aGUgaGFzaCBvYmplY3QuICBUaGlzIGNhbiBiZSB1c2VkIHRvCi1lZmZpY2llbnRseSBjb21wdXRlIHRoZSBkaWdlc3RzIG9mIHN0cmluZ3MgdGhhdCBzaGFyZSBhIGNvbW1vbiBpbml0aWFsCi1zdWJzdHJpbmcuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbntzZWVhbHNvfQotICBcc2VlbW9kdWxle2htYWN9e0EgbW9kdWxlIHRvIGdlbmVyYXRlIG1lc3NhZ2UgYXV0aGVudGljYXRpb24gY29kZXMgdXNpbmcgaGFzaGVzLn0KLSAgXHNlZW1vZHVsZXtiYXNlNjR9e0Fub3RoZXIgd2F5IHRvIGVuY29kZSBiaW5hcnkgaGFzaGVzIGZvciBub24tYmluYXJ5IGVudmlyb25tZW50cy59Ci0gIFxzZWV1cmx7aHR0cDovL2NzcmMubmlzdC5nb3YvcHVibGljYXRpb25zL2ZpcHMvZmlwczE4MC0yL2ZpcHMxODAtMi5wZGZ9Ci0gIHtUaGUgRklQUyAxODAtMiBwdWJsaWNhdGlvbiBvbiBTZWN1cmUgSGFzaCBBbGdvcml0aG1zLn0KLSAgXHNlZXVybHtodHRwOi8vd3d3LmNyeXB0b2dyYXBoeS5jb20vY25ld3MvaGFzaC5odG1sfQotICB7SGFzaCBDb2xsaXNpb24gRkFRIHdpdGggaW5mb3JtYXRpb24gb24gd2hpY2ggYWxnb3JpdGhtcyBoYXZlIGtub3duIGlzc3VlcyBhbmQKLSAgIHdoYXQgdGhhdCBtZWFucyByZWdhcmRpbmcgdGhlaXIgdXNlLn0KLVxlbmR7c2VlYWxzb30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliaGVhcHEudGV4IGIvRG9jL2xpYi9saWJoZWFwcS50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MDNhM2EuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJoZWFwcS50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtoZWFwcX0gLS0tCi0gICAgICAgICBIZWFwIHF1ZXVlIGFsZ29yaXRobX0KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2hlYXBxfQotXG1vZHVsZXN5bm9wc2lze0hlYXAgcXVldWUgYWxnb3JpdGhtIChhLmsuYS4gcHJpb3JpdHkgcXVldWUpLn0KLVxtb2R1bGVhdXRob3J7S2V2aW4gTydDb25ub3J9e30KLVxzZWN0aW9uYXV0aG9ye0d1aWRvIHZhbiBSb3NzdW19e2d1aWRvQHB5dGhvbi5vcmd9Ci0lIFRoZW9yZXRpY2FsIGV4cGxhbmF0aW9uOgotXHNlY3Rpb25hdXRob3J7RnJhblxjIGNvaXMgUGluYXJkfXt9Ci1cdmVyc2lvbmFkZGVkezIuM30KLQotCi1UaGlzIG1vZHVsZSBwcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaGVhcCBxdWV1ZSBhbGdvcml0aG0sCi1hbHNvIGtub3duIGFzIHRoZSBwcmlvcml0eSBxdWV1ZSBhbGdvcml0aG0uCi0KLUhlYXBzIGFyZSBhcnJheXMgZm9yIHdoaWNoCi1cY29kZXtcdmFye2hlYXB9W1x2YXJ7a31dIDw9IFx2YXJ7aGVhcH1bMipcdmFye2t9KzFdfSBhbmQKLVxjb2Rle1x2YXJ7aGVhcH1bXHZhcntrfV0gPD0gXHZhcntoZWFwfVsyKlx2YXJ7a30rMl19Ci1mb3IgYWxsIFx2YXJ7a30sIGNvdW50aW5nIGVsZW1lbnRzIGZyb20gemVyby4gIEZvciB0aGUgc2FrZSBvZgotY29tcGFyaXNvbiwgbm9uLWV4aXN0aW5nIGVsZW1lbnRzIGFyZSBjb25zaWRlcmVkIHRvIGJlIGluZmluaXRlLiAgVGhlCi1pbnRlcmVzdGluZyBwcm9wZXJ0eSBvZiBhIGhlYXAgaXMgdGhhdCBcY29kZXtcdmFye2hlYXB9WzBdfSBpcyBhbHdheXMKLWl0cyBzbWFsbGVzdCBlbGVtZW50LgotCi1UaGUgQVBJIGJlbG93IGRpZmZlcnMgZnJvbSB0ZXh0Ym9vayBoZWFwIGFsZ29yaXRobXMgaW4gdHdvIGFzcGVjdHM6Ci0oYSkgV2UgdXNlIHplcm8tYmFzZWQgaW5kZXhpbmcuICBUaGlzIG1ha2VzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUKLWluZGV4IGZvciBhIG5vZGUgYW5kIHRoZSBpbmRleGVzIGZvciBpdHMgY2hpbGRyZW4gc2xpZ2h0bHkgbGVzcwotb2J2aW91cywgYnV0IGlzIG1vcmUgc3VpdGFibGUgc2luY2UgUHl0aG9uIHVzZXMgemVyby1iYXNlZCBpbmRleGluZy4KLShiKSBPdXIgcG9wIG1ldGhvZCByZXR1cm5zIHRoZSBzbWFsbGVzdCBpdGVtLCBub3QgdGhlIGxhcmdlc3QgKGNhbGxlZCBhCi0ibWluIGhlYXAiIGluIHRleHRib29rczsgYSAibWF4IGhlYXAiIGlzIG1vcmUgY29tbW9uIGluIHRleHRzIGJlY2F1c2UKLW9mIGl0cyBzdWl0YWJpbGl0eSBmb3IgaW4tcGxhY2Ugc29ydGluZykuCi0KLVRoZXNlIHR3byBtYWtlIGl0IHBvc3NpYmxlIHRvIHZpZXcgdGhlIGhlYXAgYXMgYSByZWd1bGFyIFB5dGhvbiBsaXN0Ci13aXRob3V0IHN1cnByaXNlczogXGNvZGV7XHZhcntoZWFwfVswXX0gaXMgdGhlIHNtYWxsZXN0IGl0ZW0sIGFuZAotXGNvZGV7XHZhcntoZWFwfS5zb3J0KCl9IG1haW50YWlucyB0aGUgaGVhcCBpbnZhcmlhbnQhCi0KLVRvIGNyZWF0ZSBhIGhlYXAsIHVzZSBhIGxpc3QgaW5pdGlhbGl6ZWQgdG8gXGNvZGV7W119LCBvciB5b3UgY2FuCi10cmFuc2Zvcm0gYSBwb3B1bGF0ZWQgbGlzdCBpbnRvIGEgaGVhcCB2aWEgZnVuY3Rpb24gXGZ1bmN0aW9ue2hlYXBpZnkoKX0uCi0KLVRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBwcm92aWRlZDoKLQotXGJlZ2lue2Z1bmNkZXNjfXtoZWFwcHVzaH17aGVhcCwgaXRlbX0KLVB1c2ggdGhlIHZhbHVlIFx2YXJ7aXRlbX0gb250byB0aGUgXHZhcntoZWFwfSwgbWFpbnRhaW5pbmcgdGhlCi1oZWFwIGludmFyaWFudC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aGVhcHBvcH17aGVhcH0KLVBvcCBhbmQgcmV0dXJuIHRoZSBzbWFsbGVzdCBpdGVtIGZyb20gdGhlIFx2YXJ7aGVhcH0sIG1haW50YWluaW5nIHRoZQotaGVhcCBpbnZhcmlhbnQuICBJZiB0aGUgaGVhcCBpcyBlbXB0eSwgXGV4Y2VwdGlvbntJbmRleEVycm9yfSBpcyByYWlzZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2hlYXBpZnl9e3h9Ci1UcmFuc2Zvcm0gbGlzdCBcdmFye3h9IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gbGluZWFyIHRpbWUuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2hlYXByZXBsYWNlfXtoZWFwLCBpdGVtfQotUG9wIGFuZCByZXR1cm4gdGhlIHNtYWxsZXN0IGl0ZW0gZnJvbSB0aGUgXHZhcntoZWFwfSwgYW5kIGFsc28gcHVzaAotdGhlIG5ldyBcdmFye2l0ZW19LiAgVGhlIGhlYXAgc2l6ZSBkb2Vzbid0IGNoYW5nZS4KLUlmIHRoZSBoZWFwIGlzIGVtcHR5LCBcZXhjZXB0aW9ue0luZGV4RXJyb3J9IGlzIHJhaXNlZC4KLVRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBcZnVuY3Rpb257aGVhcHBvcCgpfSBmb2xsb3dlZAotYnkgIFxmdW5jdGlvbntoZWFwcHVzaCgpfSwgYW5kIGNhbiBiZSBtb3JlIGFwcHJvcHJpYXRlIHdoZW4gdXNpbmcKLWEgZml4ZWQtc2l6ZSBoZWFwLiAgTm90ZSB0aGF0IHRoZSB2YWx1ZSByZXR1cm5lZCBtYXkgYmUgbGFyZ2VyCi10aGFuIFx2YXJ7aXRlbX0hICBUaGF0IGNvbnN0cmFpbnMgcmVhc29uYWJsZSB1c2VzIG9mIHRoaXMgcm91dGluZQotdW5sZXNzIHdyaXR0ZW4gYXMgcGFydCBvZiBhIGNvbmRpdGlvbmFsIHJlcGxhY2VtZW50OgotXGJlZ2lue3ZlcmJhdGltfQotICAgICAgICBpZiBpdGVtID4gaGVhcFswXToKLSAgICAgICAgICAgIGl0ZW0gPSBoZWFwcmVwbGFjZShoZWFwLCBpdGVtKQotXGVuZHt2ZXJiYXRpbX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLUV4YW1wbGUgb2YgdXNlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZnJvbSBoZWFwcSBpbXBvcnQgaGVhcHB1c2gsIGhlYXBwb3AKLT4+PiBoZWFwID0gW10KLT4+PiBkYXRhID0gWzEsIDMsIDUsIDcsIDksIDIsIDQsIDYsIDgsIDBdCi0+Pj4gZm9yIGl0ZW0gaW4gZGF0YToKLS4uLiAgICAgaGVhcHB1c2goaGVhcCwgaXRlbSkKLS4uLgotPj4+IG9yZGVyZWQgPSBbXQotPj4+IHdoaWxlIGhlYXA6Ci0uLi4gICAgIG9yZGVyZWQuYXBwZW5kKGhlYXBwb3AoaGVhcCkpCi0uLi4KLT4+PiBwcmludCBvcmRlcmVkCi1bMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOV0KLT4+PiBkYXRhLnNvcnQoKQotPj4+IHByaW50IGRhdGEgPT0gb3JkZXJlZAotVHJ1ZQotPj4+Ci1cZW5ke3ZlcmJhdGltfQotCi1UaGUgbW9kdWxlIGFsc28gb2ZmZXJzIHRocmVlIGdlbmVyYWwgcHVycG9zZSBmdW5jdGlvbnMgYmFzZWQgb24gaGVhcHMuCi0KLVxiZWdpbntmdW5jZGVzY317bWVyZ2V9eyppdGVyYWJsZXN9Ci1NZXJnZSBtdWx0aXBsZSBzb3J0ZWQgaW5wdXRzIGludG8gYSBzaW5nbGUgc29ydGVkIG91dHB1dCAoZm9yIGV4YW1wbGUsIG1lcmdlCi10aW1lc3RhbXBlZCBlbnRyaWVzIGZyb20gbXVsdGlwbGUgbG9nIGZpbGVzKS4gIFJldHVybnMgYW4gaXRlcmF0b3Igb3Zlcgotb3ZlciB0aGUgc29ydGVkIHZhbHVlcy4KLQotU2ltaWxhciB0byBcY29kZXtzb3J0ZWQoaXRlcnRvb2xzLmNoYWluKCppdGVyYWJsZXMpKX0gYnV0IHJldHVybnMgYW4gaXRlcmFibGUsCi1kb2VzIG5vdCBwdWxsIHRoZSBkYXRhIGludG8gbWVtb3J5IGFsbCBhdCBvbmNlLCBhbmQgYXNzdW1lcyB0aGF0IGVhY2ggb2YgdGhlCi1pbnB1dCBzdHJlYW1zIGlzIGFscmVhZHkgc29ydGVkIChzbWFsbGVzdCB0byBsYXJnZXN0KS4gICAgICAgICAgICAKLVx2ZXJzaW9uYWRkZWR7Mi42fQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtubGFyZ2VzdH17biwgaXRlcmFibGVcb3B0aW9uYWx7LCBrZXl9fQotUmV0dXJuIGEgbGlzdCB3aXRoIHRoZSBcdmFye259IGxhcmdlc3QgZWxlbWVudHMgZnJvbSB0aGUgZGF0YXNldCBkZWZpbmVkCi1ieSBcdmFye2l0ZXJhYmxlfS4gIFx2YXJ7a2V5fSwgaWYgcHJvdmlkZWQsIHNwZWNpZmllcyBhIGZ1bmN0aW9uIG9mIG9uZQotYXJndW1lbnQgdGhhdCBpcyB1c2VkIHRvIGV4dHJhY3QgYSBjb21wYXJpc29uIGtleSBmcm9tIGVhY2ggZWxlbWVudAotaW4gdGhlIGl0ZXJhYmxlOiAgXHNhbXB7XHZhcntrZXl9PVxmdW5jdGlvbntzdHIubG93ZXJ9fQotRXF1aXZhbGVudCB0bzogIFxzYW1we3NvcnRlZChpdGVyYWJsZSwga2V5PWtleSwgcmV2ZXJzZT1UcnVlKVs6bl19Ci1cdmVyc2lvbmFkZGVkezIuNH0KLVx2ZXJzaW9uY2hhbmdlZFtBZGRlZCB0aGUgb3B0aW9uYWwgXHZhcntrZXl9IGFyZ3VtZW50XXsyLjV9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e25zbWFsbGVzdH17biwgaXRlcmFibGVcb3B0aW9uYWx7LCBrZXl9fQotUmV0dXJuIGEgbGlzdCB3aXRoIHRoZSBcdmFye259IHNtYWxsZXN0IGVsZW1lbnRzIGZyb20gdGhlIGRhdGFzZXQgZGVmaW5lZAotYnkgXHZhcntpdGVyYWJsZX0uICBcdmFye2tleX0sIGlmIHByb3ZpZGVkLCBzcGVjaWZpZXMgYSBmdW5jdGlvbiBvZiBvbmUKLWFyZ3VtZW50IHRoYXQgaXMgdXNlZCB0byBleHRyYWN0IGEgY29tcGFyaXNvbiBrZXkgZnJvbSBlYWNoIGVsZW1lbnQKLWluIHRoZSBpdGVyYWJsZTogIFxzYW1we1x2YXJ7a2V5fT1cZnVuY3Rpb257c3RyLmxvd2VyfX0KLUVxdWl2YWxlbnQgdG86ICBcc2FtcHtzb3J0ZWQoaXRlcmFibGUsIGtleT1rZXkpWzpuXX0KLVx2ZXJzaW9uYWRkZWR7Mi40fQotXHZlcnNpb25jaGFuZ2VkW0FkZGVkIHRoZSBvcHRpb25hbCBcdmFye2tleX0gYXJndW1lbnRdezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVRoZSBsYXR0ZXIgdHdvIGZ1bmN0aW9ucyBwZXJmb3JtIGJlc3QgZm9yIHNtYWxsZXIgdmFsdWVzIG9mIFx2YXJ7bn0uICBGb3IgbGFyZ2VyCi12YWx1ZXMsIGl0IGlzIG1vcmUgZWZmaWNpZW50IHRvIHVzZSB0aGUgXGZ1bmN0aW9ue3NvcnRlZCgpfSBmdW5jdGlvbi4gIEFsc28sCi13aGVuIFxjb2Rle249PTF9LCBpdCBpcyBtb3JlIGVmZmljaWVudCB0byB1c2UgdGhlIGJ1aWx0aW4gXGZ1bmN0aW9ue21pbigpfQotYW5kIFxmdW5jdGlvbnttYXgoKX0gZnVuY3Rpb25zLgotCi0KLVxzdWJzZWN0aW9ue1RoZW9yeX0KLQotKFRoaXMgZXhwbGFuYXRpb24gaXMgZHVlIHRvIEZyYW7nb2lzIFBpbmFyZC4gIFRoZSBQeXRob24KLWNvZGUgZm9yIHRoaXMgbW9kdWxlIHdhcyBjb250cmlidXRlZCBieSBLZXZpbiBPJ0Nvbm5vci4pCi0KLUhlYXBzIGFyZSBhcnJheXMgZm9yIHdoaWNoIFxjb2Rle2FbXHZhcntrfV0gPD0gYVsyKlx2YXJ7a30rMV19IGFuZAotXGNvZGV7YVtcdmFye2t9XSA8PSBhWzIqXHZhcntrfSsyXX0KLWZvciBhbGwgXHZhcntrfSwgY291bnRpbmcgZWxlbWVudHMgZnJvbSAwLiAgRm9yIHRoZSBzYWtlIG9mIGNvbXBhcmlzb24sCi1ub24tZXhpc3RpbmcgZWxlbWVudHMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgaW5maW5pdGUuICBUaGUgaW50ZXJlc3RpbmcKLXByb3BlcnR5IG9mIGEgaGVhcCBpcyB0aGF0IFxjb2Rle2FbMF19IGlzIGFsd2F5cyBpdHMgc21hbGxlc3QgZWxlbWVudC4KLQotVGhlIHN0cmFuZ2UgaW52YXJpYW50IGFib3ZlIGlzIG1lYW50IHRvIGJlIGFuIGVmZmljaWVudCBtZW1vcnkKLXJlcHJlc2VudGF0aW9uIGZvciBhIHRvdXJuYW1lbnQuICBUaGUgbnVtYmVycyBiZWxvdyBhcmUgXHZhcntrfSwgbm90Ci1cY29kZXthW1x2YXJ7a31dfToKLQotXGJlZ2lue3ZlcmJhdGltfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLSAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCi0KLSAgICAgICAgICAzICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgICA1ICAgICAgICAgICAgICAgNgotCi0gICAgICA3ICAgICAgIDggICAgICAgOSAgICAgICAxMCAgICAgIDExICAgICAgMTIgICAgICAxMyAgICAgIDE0Ci0KLSAgICAxNSAxNiAgIDE3IDE4ICAgMTkgMjAgICAyMSAyMiAgIDIzIDI0ICAgMjUgMjYgICAyNyAyOCAgIDI5IDMwCi1cZW5ke3ZlcmJhdGltfQotCi1JbiB0aGUgdHJlZSBhYm92ZSwgZWFjaCBjZWxsIFx2YXJ7a30gaXMgdG9wcGluZyBcY29kZXsyKlx2YXJ7a30rMX0gYW5kCi1cY29kZXsyKlx2YXJ7a30rMn0uCi1JbiBhbiB1c3VhbCBiaW5hcnkgdG91cm5hbWVudCB3ZSBzZWUgaW4gc3BvcnRzLCBlYWNoIGNlbGwgaXMgdGhlIHdpbm5lcgotb3ZlciB0aGUgdHdvIGNlbGxzIGl0IHRvcHMsIGFuZCB3ZSBjYW4gdHJhY2UgdGhlIHdpbm5lciBkb3duIHRoZSB0cmVlCi10byBzZWUgYWxsIG9wcG9uZW50cyBzL2hlIGhhZC4gIEhvd2V2ZXIsIGluIG1hbnkgY29tcHV0ZXIgYXBwbGljYXRpb25zCi1vZiBzdWNoIHRvdXJuYW1lbnRzLCB3ZSBkbyBub3QgbmVlZCB0byB0cmFjZSB0aGUgaGlzdG9yeSBvZiBhIHdpbm5lci4KLVRvIGJlIG1vcmUgbWVtb3J5IGVmZmljaWVudCwgd2hlbiBhIHdpbm5lciBpcyBwcm9tb3RlZCwgd2UgdHJ5IHRvCi1yZXBsYWNlIGl0IGJ5IHNvbWV0aGluZyBlbHNlIGF0IGEgbG93ZXIgbGV2ZWwsIGFuZCB0aGUgcnVsZSBiZWNvbWVzCi10aGF0IGEgY2VsbCBhbmQgdGhlIHR3byBjZWxscyBpdCB0b3BzIGNvbnRhaW4gdGhyZWUgZGlmZmVyZW50IGl0ZW1zLAotYnV0IHRoZSB0b3AgY2VsbCAid2lucyIgb3ZlciB0aGUgdHdvIHRvcHBlZCBjZWxscy4KLQotSWYgdGhpcyBoZWFwIGludmFyaWFudCBpcyBwcm90ZWN0ZWQgYXQgYWxsIHRpbWUsIGluZGV4IDAgaXMgY2xlYXJseQotdGhlIG92ZXJhbGwgd2lubmVyLiAgVGhlIHNpbXBsZXN0IGFsZ29yaXRobWljIHdheSB0byByZW1vdmUgaXQgYW5kCi1maW5kIHRoZSAibmV4dCIgd2lubmVyIGlzIHRvIG1vdmUgc29tZSBsb3NlciAobGV0J3Mgc2F5IGNlbGwgMzAgaW4gdGhlCi1kaWFncmFtIGFib3ZlKSBpbnRvIHRoZSAwIHBvc2l0aW9uLCBhbmQgdGhlbiBwZXJjb2xhdGUgdGhpcyBuZXcgMCBkb3duCi10aGUgdHJlZSwgZXhjaGFuZ2luZyB2YWx1ZXMsIHVudGlsIHRoZSBpbnZhcmlhbnQgaXMgcmUtZXN0YWJsaXNoZWQuCi1UaGlzIGlzIGNsZWFybHkgbG9nYXJpdGhtaWMgb24gdGhlIHRvdGFsIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgdHJlZS4KLUJ5IGl0ZXJhdGluZyBvdmVyIGFsbCBpdGVtcywgeW91IGdldCBhbiBPKG4gbG9nIG4pIHNvcnQuCi0KLUEgbmljZSBmZWF0dXJlIG9mIHRoaXMgc29ydCBpcyB0aGF0IHlvdSBjYW4gZWZmaWNpZW50bHkgaW5zZXJ0IG5ldwotaXRlbXMgd2hpbGUgdGhlIHNvcnQgaXMgZ29pbmcgb24sIHByb3ZpZGVkIHRoYXQgdGhlIGluc2VydGVkIGl0ZW1zIGFyZQotbm90ICJiZXR0ZXIiIHRoYW4gdGhlIGxhc3QgMCd0aCBlbGVtZW50IHlvdSBleHRyYWN0ZWQuICBUaGlzIGlzCi1lc3BlY2lhbGx5IHVzZWZ1bCBpbiBzaW11bGF0aW9uIGNvbnRleHRzLCB3aGVyZSB0aGUgdHJlZSBob2xkcyBhbGwKLWluY29taW5nIGV2ZW50cywgYW5kIHRoZSAid2luIiBjb25kaXRpb24gbWVhbnMgdGhlIHNtYWxsZXN0IHNjaGVkdWxlZAotdGltZS4gIFdoZW4gYW4gZXZlbnQgc2NoZWR1bGUgb3RoZXIgZXZlbnRzIGZvciBleGVjdXRpb24sIHRoZXkgYXJlCi1zY2hlZHVsZWQgaW50byB0aGUgZnV0dXJlLCBzbyB0aGV5IGNhbiBlYXNpbHkgZ28gaW50byB0aGUgaGVhcC4gIFNvLCBhCi1oZWFwIGlzIGEgZ29vZCBzdHJ1Y3R1cmUgZm9yIGltcGxlbWVudGluZyBzY2hlZHVsZXJzICh0aGlzIGlzIHdoYXQgSQotdXNlZCBmb3IgbXkgTUlESSBzZXF1ZW5jZXIgOi0pLgotCi1WYXJpb3VzIHN0cnVjdHVyZXMgZm9yIGltcGxlbWVudGluZyBzY2hlZHVsZXJzIGhhdmUgYmVlbiBleHRlbnNpdmVseQotc3R1ZGllZCwgYW5kIGhlYXBzIGFyZSBnb29kIGZvciB0aGlzLCBhcyB0aGV5IGFyZSByZWFzb25hYmx5IHNwZWVkeSwKLXRoZSBzcGVlZCBpcyBhbG1vc3QgY29uc3RhbnQsIGFuZCB0aGUgd29yc3QgY2FzZSBpcyBub3QgbXVjaCBkaWZmZXJlbnQKLXRoYW4gdGhlIGF2ZXJhZ2UgY2FzZS4gIEhvd2V2ZXIsIHRoZXJlIGFyZSBvdGhlciByZXByZXNlbnRhdGlvbnMgd2hpY2gKLWFyZSBtb3JlIGVmZmljaWVudCBvdmVyYWxsLCB5ZXQgdGhlIHdvcnN0IGNhc2VzIG1pZ2h0IGJlIHRlcnJpYmxlLgotCi1IZWFwcyBhcmUgYWxzbyB2ZXJ5IHVzZWZ1bCBpbiBiaWcgZGlzayBzb3J0cy4gIFlvdSBtb3N0IHByb2JhYmx5IGFsbAota25vdyB0aGF0IGEgYmlnIHNvcnQgaW1wbGllcyBwcm9kdWNpbmcgInJ1bnMiICh3aGljaCBhcmUgcHJlLXNvcnRlZAotc2VxdWVuY2VzLCB3aGljaCBzaXplIGlzIHVzdWFsbHkgcmVsYXRlZCB0byB0aGUgYW1vdW50IG9mIENQVSBtZW1vcnkpLAotZm9sbG93ZWQgYnkgYSBtZXJnaW5nIHBhc3NlcyBmb3IgdGhlc2UgcnVucywgd2hpY2ggbWVyZ2luZyBpcyBvZnRlbgotdmVyeSBjbGV2ZXJseSBvcmdhbmlzZWRcZm9vdG5vdGV7VGhlIGRpc2sgYmFsYW5jaW5nIGFsZ29yaXRobXMgd2hpY2gKLWFyZSBjdXJyZW50LCBub3dhZGF5cywgYXJlCi1tb3JlIGFubm95aW5nIHRoYW4gY2xldmVyLCBhbmQgdGhpcyBpcyBhIGNvbnNlcXVlbmNlIG9mIHRoZSBzZWVraW5nCi1jYXBhYmlsaXRpZXMgb2YgdGhlIGRpc2tzLiAgT24gZGV2aWNlcyB3aGljaCBjYW5ub3Qgc2VlaywgbGlrZSBiaWcKLXRhcGUgZHJpdmVzLCB0aGUgc3Rvcnkgd2FzIHF1aXRlIGRpZmZlcmVudCwgYW5kIG9uZSBoYWQgdG8gYmUgdmVyeQotY2xldmVyIHRvIGVuc3VyZSAoZmFyIGluIGFkdmFuY2UpIHRoYXQgZWFjaCB0YXBlIG1vdmVtZW50IHdpbGwgYmUgdGhlCi1tb3N0IGVmZmVjdGl2ZSBwb3NzaWJsZSAodGhhdCBpcywgd2lsbCBiZXN0IHBhcnRpY2lwYXRlIGF0Ci0icHJvZ3Jlc3NpbmciIHRoZSBtZXJnZSkuICBTb21lIHRhcGVzIHdlcmUgZXZlbiBhYmxlIHRvIHJlYWQKLWJhY2t3YXJkcywgYW5kIHRoaXMgd2FzIGFsc28gdXNlZCB0byBhdm9pZCB0aGUgcmV3aW5kaW5nIHRpbWUuCi1CZWxpZXZlIG1lLCByZWFsIGdvb2QgdGFwZSBzb3J0cyB3ZXJlIHF1aXRlIHNwZWN0YWN1bGFyIHRvIHdhdGNoIQotRnJvbSBhbGwgdGltZXMsIHNvcnRpbmcgaGFzIGFsd2F5cyBiZWVuIGEgR3JlYXQgQXJ0ISA6LSl9LgotSXQgaXMgdmVyeSBpbXBvcnRhbnQgdGhhdCB0aGUgaW5pdGlhbAotc29ydCBwcm9kdWNlcyB0aGUgbG9uZ2VzdCBydW5zIHBvc3NpYmxlLiAgVG91cm5hbWVudHMgYXJlIGEgZ29vZCB3YXkKLXRvIHRoYXQuICBJZiwgdXNpbmcgYWxsIHRoZSBtZW1vcnkgYXZhaWxhYmxlIHRvIGhvbGQgYSB0b3VybmFtZW50LCB5b3UKLXJlcGxhY2UgYW5kIHBlcmNvbGF0ZSBpdGVtcyB0aGF0IGhhcHBlbiB0byBmaXQgdGhlIGN1cnJlbnQgcnVuLCB5b3UnbGwKLXByb2R1Y2UgcnVucyB3aGljaCBhcmUgdHdpY2UgdGhlIHNpemUgb2YgdGhlIG1lbW9yeSBmb3IgcmFuZG9tIGlucHV0LAotYW5kIG11Y2ggYmV0dGVyIGZvciBpbnB1dCBmdXp6aWx5IG9yZGVyZWQuCi0KLU1vcmVvdmVyLCBpZiB5b3Ugb3V0cHV0IHRoZSAwJ3RoIGl0ZW0gb24gZGlzayBhbmQgZ2V0IGFuIGlucHV0IHdoaWNoCi1tYXkgbm90IGZpdCBpbiB0aGUgY3VycmVudCB0b3VybmFtZW50IChiZWNhdXNlIHRoZSB2YWx1ZSAid2lucyIgb3ZlcgotdGhlIGxhc3Qgb3V0cHV0IHZhbHVlKSwgaXQgY2Fubm90IGZpdCBpbiB0aGUgaGVhcCwgc28gdGhlIHNpemUgb2YgdGhlCi1oZWFwIGRlY3JlYXNlcy4gIFRoZSBmcmVlZCBtZW1vcnkgY291bGQgYmUgY2xldmVybHkgcmV1c2VkIGltbWVkaWF0ZWx5Ci1mb3IgcHJvZ3Jlc3NpdmVseSBidWlsZGluZyBhIHNlY29uZCBoZWFwLCB3aGljaCBncm93cyBhdCBleGFjdGx5IHRoZQotc2FtZSByYXRlIHRoZSBmaXJzdCBoZWFwIGlzIG1lbHRpbmcuICBXaGVuIHRoZSBmaXJzdCBoZWFwIGNvbXBsZXRlbHkKLXZhbmlzaGVzLCB5b3Ugc3dpdGNoIGhlYXBzIGFuZCBzdGFydCBhIG5ldyBydW4uICBDbGV2ZXIgYW5kIHF1aXRlCi1lZmZlY3RpdmUhCi0KLUluIGEgd29yZCwgaGVhcHMgYXJlIHVzZWZ1bCBtZW1vcnkgc3RydWN0dXJlcyB0byBrbm93LiAgSSB1c2UgdGhlbSBpbgotYSBmZXcgYXBwbGljYXRpb25zLCBhbmQgSSB0aGluayBpdCBpcyBnb29kIHRvIGtlZXAgYSBgaGVhcCcgbW9kdWxlCi1hcm91bmQuIDotKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJobWFjLnRleCBiL0RvYy9saWIvbGliaG1hYy50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMjljYjUuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJobWFjLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7aG1hY30gLS0tCi0gICAgICAgICBLZXllZC1IYXNoaW5nIGZvciBNZXNzYWdlIEF1dGhlbnRpY2F0aW9ufQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17aG1hY30KLVxtb2R1bGVzeW5vcHNpc3tLZXllZC1IYXNoaW5nIGZvciBNZXNzYWdlIEF1dGhlbnRpY2F0aW9uIChITUFDKQotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGZvciBQeXRob24ufQotXG1vZHVsZWF1dGhvcntHZXJoYXJkIEh7XCJhfXJpbmd9e2doYWVyaW5nQHVzZXJzLnNvdXJjZWZvcmdlLm5ldH0KLVxzZWN0aW9uYXV0aG9ye0dlcmhhcmQgSHtcImF9cmluZ317Z2hhZXJpbmdAdXNlcnMuc291cmNlZm9yZ2UubmV0fQotCi1cdmVyc2lvbmFkZGVkezIuMn0KLQotVGhpcyBtb2R1bGUgaW1wbGVtZW50cyB0aGUgSE1BQyBhbGdvcml0aG0gYXMgZGVzY3JpYmVkIGJ5IFxyZmN7MjEwNH0uCi0KLVxiZWdpbntmdW5jZGVzY317bmV3fXtrZXlcb3B0aW9uYWx7LCBtc2dcb3B0aW9uYWx7LCBkaWdlc3Rtb2R9fX0KLSAgUmV0dXJuIGEgbmV3IGhtYWMgb2JqZWN0LiAgSWYgXHZhcnttc2d9IGlzIHByZXNlbnQsIHRoZSBtZXRob2QgY2FsbAotICBcY29kZXt1cGRhdGUoXHZhcnttc2d9KX0gaXMgbWFkZS4gXHZhcntkaWdlc3Rtb2R9IGlzIHRoZSBkaWdlc3QKLSAgY29uc3RydWN0b3Igb3IgbW9kdWxlIGZvciB0aGUgSE1BQyBvYmplY3QgdG8gdXNlLiBJdCBkZWZhdWx0cyB0byAKLSAgdGhlIFxmdW5jdGlvbntccmVmbW9kdWxle2hhc2hsaWJ9Lm1kNX0gY29uc3RydWN0b3IuICBcbm90ZXtUaGUgbWQ1IGhhc2gKLSAgaGFzIGtub3duIHdlYWtuZXNzZXMgYnV0IHJlbWFpbnMgdGhlIGRlZmF1bHQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgotICBDaG9vc2UgYSBiZXR0ZXIgb25lIGZvciB5b3VyIGFwcGxpY2F0aW9uLn0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLUFuIEhNQUMgb2JqZWN0IGhhcyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtobWFjXXt1cGRhdGV9e21zZ30KLSAgVXBkYXRlIHRoZSBobWFjIG9iamVjdCB3aXRoIHRoZSBzdHJpbmcgXHZhcnttc2d9LiAgUmVwZWF0ZWQgY2FsbHMKLSAgYXJlIGVxdWl2YWxlbnQgdG8gYSBzaW5nbGUgY2FsbCB3aXRoIHRoZSBjb25jYXRlbmF0aW9uIG9mIGFsbCB0aGUKLSAgYXJndW1lbnRzOiBcY29kZXttLnVwZGF0ZShhKTsgbS51cGRhdGUoYil9IGlzIGVxdWl2YWxlbnQgdG8KLSAgXGNvZGV7bS51cGRhdGUoYSArIGIpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2htYWNde2RpZ2VzdH17fQotICBSZXR1cm4gdGhlIGRpZ2VzdCBvZiB0aGUgc3RyaW5ncyBwYXNzZWQgdG8gdGhlIFxtZXRob2R7dXBkYXRlKCl9Ci0gIG1ldGhvZCBzbyBmYXIuICBUaGlzIHN0cmluZyB3aWxsIGJlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUKLSAgXHZhcntkaWdlc3Rfc2l6ZX0gb2YgdGhlIGRpZ2VzdCBnaXZlbiB0byB0aGUgY29uc3RydWN0b3IuICBJdAotICBtYXkgY29udGFpbiBub24tXEFTQ0lJe30gY2hhcmFjdGVycywgaW5jbHVkaW5nIE5VTCBieXRlcy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2htYWNde2hleGRpZ2VzdH17fQotICBMaWtlIFxtZXRob2R7ZGlnZXN0KCl9IGV4Y2VwdCB0aGUgZGlnZXN0IGlzIHJldHVybmVkIGFzIGEgc3RyaW5nCi0gIHR3aWNlIHRoZSBsZW5ndGggY29udGFpbmluZwotICBvbmx5IGhleGFkZWNpbWFsIGRpZ2l0cy4gIFRoaXMgbWF5IGJlIHVzZWQgdG8gZXhjaGFuZ2UgdGhlIHZhbHVlCi0gIHNhZmVseSBpbiBlbWFpbCBvciBvdGhlciBub24tYmluYXJ5IGVudmlyb25tZW50cy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2htYWNde2NvcHl9e30KLSAgUmV0dXJuIGEgY29weSAoYGBjbG9uZScnKSBvZiB0aGUgaG1hYyBvYmplY3QuICBUaGlzIGNhbiBiZSB1c2VkIHRvCi0gIGVmZmljaWVudGx5IGNvbXB1dGUgdGhlIGRpZ2VzdHMgb2Ygc3RyaW5ncyB0aGF0IHNoYXJlIGEgY29tbW9uCi0gIGluaXRpYWwgc3Vic3RyaW5nLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZW1vZHVsZXtoYXNobGlifXtUaGUgcHl0aG9uIG1vZHVsZSBwcm92aWRpbmcgc2VjdXJlIGhhc2ggZnVuY3Rpb25zLn0KLVxlbmR7c2VlYWxzb30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliaG90c2hvdC50ZXggYi9Eb2MvbGliL2xpYmhvdHNob3QudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDA0ZTM3Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGliaG90c2hvdC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtob3RzaG90fSAtLS0KLSAgICAgICAgIEhpZ2ggcGVyZm9ybWFuY2UgbG9nZ2luZyBwcm9maWxlcn0KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2hvdHNob3R9Ci1cbW9kdWxlc3lub3BzaXN7SGlnaCBwZXJmb3JtYW5jZSBsb2dnaW5nIHByb2ZpbGVyLCBtb3N0bHkgd3JpdHRlbiBpbiBDLn0KLVxtb2R1bGVhdXRob3J7RnJlZCBMLiBEcmFrZSwgSnIufXtmZHJha2VAYWNtLm9yZ30KLVxzZWN0aW9uYXV0aG9ye0FudGhvbnkgQmF4dGVyfXthbnRob255QGludGVybGluay5jb20uYXV9Ci0KLVx2ZXJzaW9uYWRkZWR7Mi4yfQotCi0KLVRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgbmljZXIgaW50ZXJmYWNlIHRvIHRoZSBcbW9kdWxle19ob3RzaG90fSBDIG1vZHVsZS4KLUhvdHNob3QgaXMgYSByZXBsYWNlbWVudCBmb3IgdGhlIGV4aXN0aW5nIFxyZWZtb2R1bGV7cHJvZmlsZX0gbW9kdWxlLiBBcyBpdCdzCi13cml0dGVuIG1vc3RseSBpbiBDLCBpdCBzaG91bGQgcmVzdWx0IGluIGEgbXVjaCBzbWFsbGVyIHBlcmZvcm1hbmNlIGltcGFjdAotdGhhbiB0aGUgZXhpc3RpbmcgXHJlZm1vZHVsZXtwcm9maWxlfSBtb2R1bGUuCi0KLVxiZWdpbntub3RpY2V9W25vdGVdCi0gIFRoZSBcbW9kdWxle2hvdHNob3R9IG1vZHVsZSBmb2N1c2VzIG9uIG1pbmltaXppbmcgdGhlIG92ZXJoZWFkCi0gIHdoaWxlIHByb2ZpbGluZywgYXQgdGhlIGV4cGVuc2Ugb2YgbG9uZyBkYXRhIHBvc3QtcHJvY2Vzc2luZyB0aW1lcy4KLSAgRm9yIGNvbW1vbiB1c2FnZXMgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIFxtb2R1bGV7Y1Byb2ZpbGV9IGluc3RlYWQuCi0gIFxtb2R1bGV7aG90c2hvdH0gaXMgbm90IG1haW50YWluZWQgYW5kIG1pZ2h0IGJlIHJlbW92ZWQgZnJvbSB0aGUKLSAgc3RhbmRhcmQgbGlicmFyeSBpbiB0aGUgZnV0dXJlLgotXGVuZHtub3RpY2V9Ci0KLVx2ZXJzaW9uY2hhbmdlZFt0aGUgcmVzdWx0cyBzaG91bGQgYmUgbW9yZSBtZWFuaW5nZnVsIHRoYW4gaW4gdGhlCi1wYXN0OiB0aGUgdGltaW5nIGNvcmUgY29udGFpbmVkIGEgY3JpdGljYWwgYnVnXXsyLjV9Ci0KLVxiZWdpbntub3RpY2V9W3dhcm5pbmddCi0gIFRoZSBcbW9kdWxle2hvdHNob3R9IHByb2ZpbGVyIGRvZXMgbm90IHlldCB3b3JrIHdlbGwgd2l0aCB0aHJlYWRzLgotICBJdCBpcyB1c2VmdWwgdG8gdXNlIGFuIHVudGhyZWFkZWQgc2NyaXB0IHRvIHJ1biB0aGUgcHJvZmlsZXIgb3ZlcgotICB0aGUgY29kZSB5b3UncmUgaW50ZXJlc3RlZCBpbiBtZWFzdXJpbmcgaWYgYXQgYWxsIHBvc3NpYmxlLgotXGVuZHtub3RpY2V9Ci0KLQotXGJlZ2lue2NsYXNzZGVzY317UHJvZmlsZX17bG9nZmlsZVxvcHRpb25hbHssIGxpbmVldmVudHNcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXRpbWluZ3N9fX0KLVRoZSBwcm9maWxlciBvYmplY3QuIFRoZSBhcmd1bWVudCBcdmFye2xvZ2ZpbGV9IGlzIHRoZSBuYW1lIG9mIGEgbG9nCi1maWxlIHRvIHVzZSBmb3IgbG9nZ2VkIHByb2ZpbGUgZGF0YS4gVGhlIGFyZ3VtZW50IFx2YXJ7bGluZWV2ZW50c30KLXNwZWNpZmllcyB3aGV0aGVyIHRvIGdlbmVyYXRlIGV2ZW50cyBmb3IgZXZlcnkgc291cmNlIGxpbmUsIG9yIGp1c3Qgb24KLWZ1bmN0aW9uIGNhbGwvcmV0dXJuLiBJdCBkZWZhdWx0cyB0byBcY29kZXswfSAob25seSBsb2cgZnVuY3Rpb24KLWNhbGwvcmV0dXJuKS4gVGhlIGFyZ3VtZW50IFx2YXJ7bGluZXRpbWluZ3N9IHNwZWNpZmllcyB3aGV0aGVyIHRvCi1yZWNvcmQgdGltaW5nIGluZm9ybWF0aW9uLiBJdCBkZWZhdWx0cyB0byBcY29kZXsxfSAoc3RvcmUgdGltaW5nCi1pbmZvcm1hdGlvbikuCi1cZW5ke2NsYXNzZGVzY30KLQotCi1cc3Vic2VjdGlvbntQcm9maWxlIE9iamVjdHMgXGxhYmVse2hvdHNob3Qtb2JqZWN0c319Ci0KLVByb2ZpbGUgb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLQotXGJlZ2lue21ldGhvZGRlc2N9W1Byb2ZpbGVde2FkZGluZm99e2tleSwgdmFsdWV9Ci1BZGQgYW4gYXJiaXRyYXJ5IGxhYmVsbGVkIHZhbHVlIHRvIHRoZSBwcm9maWxlIG91dHB1dC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1Byb2ZpbGVde2Nsb3NlfXt9Ci1DbG9zZSB0aGUgbG9nZmlsZSBhbmQgdGVybWluYXRlIHRoZSBwcm9maWxlci4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1Byb2ZpbGVde2ZpbGVub317fQotUmV0dXJuIHRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIHByb2ZpbGVyJ3MgbG9nIGZpbGUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtQcm9maWxlXXtydW59e2NtZH0KLVByb2ZpbGUgYW4gXGZ1bmN0aW9ue2V4ZWMoKX0tY29tcGF0aWJsZSBzdHJpbmcgaW4gdGhlIHNjcmlwdCBlbnZpcm9ubWVudC4KLVRoZSBnbG9iYWxzIGZyb20gdGhlIFxyZWZtb2R1bGVbbWFpbl17X19tYWluX199IG1vZHVsZSBhcmUgdXNlZCBhcwotYm90aCB0aGUgZ2xvYmFscyBhbmQgbG9jYWxzIGZvciB0aGUgc2NyaXB0LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUHJvZmlsZV17cnVuY2FsbH17ZnVuYywgKmFyZ3MsICoqa2V5d29yZHN9Ci1Qcm9maWxlIGEgc2luZ2xlIGNhbGwgb2YgYSBjYWxsYWJsZS4KLUFkZGl0aW9uYWwgcG9zaXRpb25hbCBhbmQga2V5d29yZCBhcmd1bWVudHMgbWF5IGJlIHBhc3NlZAotYWxvbmc7IHRoZSByZXN1bHQgb2YgdGhlIGNhbGwgaXMgcmV0dXJuZWQsIGFuZCBleGNlcHRpb25zIGFyZQotYWxsb3dlZCB0byBwcm9wYWdhdGUgY2xlYW5seSwgd2hpbGUgZW5zdXJpbmcgdGhhdCBwcm9maWxpbmcgaXMKLWRpc2FibGVkIG9uIHRoZSB3YXkgb3V0LgotXGVuZHttZXRob2RkZXNjfQotCi0KLVxiZWdpbnttZXRob2RkZXNjfVtQcm9maWxlXXtydW5jdHh9e2NtZCwgZ2xvYmFscywgbG9jYWxzfQotUHJvZmlsZSBhbiBcZnVuY3Rpb257ZXhlYygpfS1jb21wYXRpYmxlIHN0cmluZyBpbiBhIHNwZWNpZmljIGVudmlyb25tZW50LgotVGhlIHN0cmluZyBpcyBjb21waWxlZCBiZWZvcmUgcHJvZmlsaW5nIGJlZ2lucy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1Byb2ZpbGVde3N0YXJ0fXt9Ci1TdGFydCB0aGUgcHJvZmlsZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtQcm9maWxlXXtzdG9wfXt9Ci1TdG9wIHRoZSBwcm9maWxlci4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cc3Vic2VjdGlvbntVc2luZyBob3RzaG90IGRhdGF9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtob3RzaG90LnN0YXRzfQotXG1vZHVsZXN5bm9wc2lze1N0YXRpc3RpY2FsIGFuYWx5c2lzIGZvciBIb3RzaG90fQotCi1cdmVyc2lvbmFkZGVkezIuMn0KLQotVGhpcyBtb2R1bGUgbG9hZHMgaG90c2hvdCBwcm9maWxpbmcgZGF0YSBpbnRvIHRoZSBzdGFuZGFyZCBcbW9kdWxle3BzdGF0c30KLVN0YXRzIG9iamVjdHMuCi0KLVxiZWdpbntmdW5jZGVzY317bG9hZH17ZmlsZW5hbWV9Ci1Mb2FkIGhvdHNob3QgZGF0YSBmcm9tIFx2YXJ7ZmlsZW5hbWV9LiBSZXR1cm5zIGFuIGluc3RhbmNlCi1vZiB0aGUgXGNsYXNze3BzdGF0cy5TdGF0c30gY2xhc3MuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZW1vZHVsZXtwcm9maWxlfXtUaGUgXG1vZHVsZXtwcm9maWxlfSBtb2R1bGUncyBcY2xhc3N7U3RhdHN9IGNsYXNzfQotXGVuZHtzZWVhbHNvfQotCi0KLVxzdWJzZWN0aW9ue0V4YW1wbGUgVXNhZ2UgXGxhYmVse2hvdHNob3QtZXhhbXBsZX19Ci0KLU5vdGUgdGhhdCB0aGlzIGV4YW1wbGUgcnVucyB0aGUgcHl0aG9uIGBgYmVuY2htYXJrJycgcHlzdG9uZXMuICBJdCBjYW4KLXRha2Ugc29tZSB0aW1lIHRvIHJ1biwgYW5kIHdpbGwgcHJvZHVjZSBsYXJnZSBvdXRwdXQgZmlsZXMuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgaG90c2hvdCwgaG90c2hvdC5zdGF0cywgdGVzdC5weXN0b25lCi0+Pj4gcHJvZiA9IGhvdHNob3QuUHJvZmlsZSgic3RvbmVzLnByb2YiKQotPj4+IGJlbmNodGltZSwgc3RvbmVzID0gcHJvZi5ydW5jYWxsKHRlc3QucHlzdG9uZS5weXN0b25lcykKLT4+PiBwcm9mLmNsb3NlKCkKLT4+PiBzdGF0cyA9IGhvdHNob3Quc3RhdHMubG9hZCgic3RvbmVzLnByb2YiKQotPj4+IHN0YXRzLnN0cmlwX2RpcnMoKQotPj4+IHN0YXRzLnNvcnRfc3RhdHMoJ3RpbWUnLCAnY2FsbHMnKQotPj4+IHN0YXRzLnByaW50X3N0YXRzKDIwKQotICAgICAgICAgODUwMDA0IGZ1bmN0aW9uIGNhbGxzIGluIDEwLjA5MCBDUFUgc2Vjb25kcwotCi0gICBPcmRlcmVkIGJ5OiBpbnRlcm5hbCB0aW1lLCBjYWxsIGNvdW50Ci0KLSAgIG5jYWxscyAgdG90dGltZSAgcGVyY2FsbCAgY3VtdGltZSAgcGVyY2FsbCBmaWxlbmFtZTpsaW5lbm8oZnVuY3Rpb24pCi0gICAgICAgIDEgICAgMy4yOTUgICAgMy4yOTUgICAxMC4wOTAgICAxMC4wOTAgcHlzdG9uZS5weTo3OShQcm9jMCkKLSAgIDE1MDAwMCAgICAxLjMxNSAgICAwLjAwMCAgICAxLjMxNSAgICAwLjAwMCBweXN0b25lLnB5OjIwMyhQcm9jNykKLSAgICA1MDAwMCAgICAxLjMxMyAgICAwLjAwMCAgICAxLjQ2MyAgICAwLjAwMCBweXN0b25lLnB5OjIyOShGdW5jMikKLSAuCi0gLgotIC4KLVxlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmh0bWxsaWIudGV4IGIvRG9jL2xpYi9saWJodG1sbGliLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUxZGZjYi4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmh0bWxsaWIudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7aHRtbGxpYn0gLS0tCi0gICAgICAgICBBIHBhcnNlciBmb3IgSFRNTCBkb2N1bWVudHN9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtodG1sbGlifQotXG1vZHVsZXN5bm9wc2lze0EgcGFyc2VyIGZvciBIVE1MIGRvY3VtZW50cy59Ci0KLVxpbmRleHtIVE1MfQotXGluZGV4e2h5cGVydGV4dH0KLQotCi1UaGlzIG1vZHVsZSBkZWZpbmVzIGEgY2xhc3Mgd2hpY2ggY2FuIHNlcnZlIGFzIGEgYmFzZSBmb3IgcGFyc2luZyB0ZXh0Ci1maWxlcyBmb3JtYXR0ZWQgaW4gdGhlIEh5cGVyVGV4dCBNYXJrLXVwIExhbmd1YWdlIChIVE1MKS4gIFRoZSBjbGFzcwotaXMgbm90IGRpcmVjdGx5IGNvbmNlcm5lZCB3aXRoIEkvTyAtLS0gaXQgbXVzdCBiZSBwcm92aWRlZCB3aXRoIGlucHV0Ci1pbiBzdHJpbmcgZm9ybSB2aWEgYSBtZXRob2QsIGFuZCBtYWtlcyBjYWxscyB0byBtZXRob2RzIG9mIGEKLWBgZm9ybWF0dGVyJycgb2JqZWN0IGluIG9yZGVyIHRvIHByb2R1Y2Ugb3V0cHV0LiAgVGhlCi1cY2xhc3N7SFRNTFBhcnNlcn0gY2xhc3MgaXMgZGVzaWduZWQgdG8gYmUgdXNlZCBhcyBhIGJhc2UgY2xhc3MgZm9yCi1vdGhlciBjbGFzc2VzIGluIG9yZGVyIHRvIGFkZCBmdW5jdGlvbmFsaXR5LCBhbmQgYWxsb3dzIG1vc3Qgb2YgaXRzCi1tZXRob2RzIHRvIGJlIGV4dGVuZGVkIG9yIG92ZXJyaWRkZW4uICBJbiB0dXJuLCB0aGlzIGNsYXNzIGlzIGRlcml2ZWQKLWZyb20gYW5kIGV4dGVuZHMgdGhlIFxjbGFzc3tTR01MUGFyc2VyfSBjbGFzcyBkZWZpbmVkIGluIG1vZHVsZQotXHJlZm1vZHVsZXtzZ21sbGlifVxyZWZzdG1vZGluZGV4e3NnbWxsaWJ9LiAgVGhlIFxjbGFzc3tIVE1MUGFyc2VyfQotaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgdGhlIEhUTUwgMi4wIGxhbmd1YWdlIGFzIGRlc2NyaWJlZCBpbgotXHJmY3sxODY2fS4gIFR3byBpbXBsZW1lbnRhdGlvbnMgb2YgZm9ybWF0dGVyIG9iamVjdHMgYXJlIHByb3ZpZGVkIGluCi10aGUgXHJlZm1vZHVsZXtmb3JtYXR0ZXJ9XHJlZnN0bW9kaW5kZXh7Zm9ybWF0dGVyfVwgbW9kdWxlOyByZWZlciB0byB0aGUKLWRvY3VtZW50YXRpb24gZm9yIHRoYXQgbW9kdWxlIGZvciBpbmZvcm1hdGlvbiBvbiB0aGUgZm9ybWF0dGVyCi1pbnRlcmZhY2UuCi1cd2l0aHN1Yml0ZW17KGluIG1vZHVsZSBzZ21sbGliKX17XHR0aW5kZXh7U0dNTFBhcnNlcn19Ci0KLVRoZSBmb2xsb3dpbmcgaXMgYSBzdW1tYXJ5IG9mIHRoZSBpbnRlcmZhY2UgZGVmaW5lZCBieQotXGNsYXNze3NnbWxsaWIuU0dNTFBhcnNlcn06Ci0KLVxiZWdpbntpdGVtaXplfQotCi1caXRlbQotVGhlIGludGVyZmFjZSB0byBmZWVkIGRhdGEgdG8gYW4gaW5zdGFuY2UgaXMgdGhyb3VnaCB0aGUgXG1ldGhvZHtmZWVkKCl9Ci1tZXRob2QsIHdoaWNoIHRha2VzIGEgc3RyaW5nIGFyZ3VtZW50LiAgVGhpcyBjYW4gYmUgY2FsbGVkIHdpdGggYXMKLWxpdHRsZSBvciBhcyBtdWNoIHRleHQgYXQgYSB0aW1lIGFzIGRlc2lyZWQ7IFxzYW1we3AuZmVlZChhKTsKLXAuZmVlZChiKX0gaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBcc2FtcHtwLmZlZWQoYStiKX0uICBXaGVuIHRoZSBkYXRhCi1jb250YWlucyBjb21wbGV0ZSBIVE1MIG1hcmt1cCBjb25zdHJ1Y3RzLCB0aGVzZSBhcmUgcHJvY2Vzc2VkIGltbWVkaWF0ZWx5OwotaW5jb21wbGV0ZSBjb25zdHJ1Y3RzIGFyZSBzYXZlZCBpbiBhIGJ1ZmZlci4gIFRvIGZvcmNlIHByb2Nlc3Npbmcgb2YgYWxsCi11bnByb2Nlc3NlZCBkYXRhLCBjYWxsIHRoZSBcbWV0aG9ke2Nsb3NlKCl9IG1ldGhvZC4KLQotRm9yIGV4YW1wbGUsIHRvIHBhcnNlIHRoZSBlbnRpcmUgY29udGVudHMgb2YgYSBmaWxlLCB1c2U6Ci1cYmVnaW57dmVyYmF0aW19Ci1wYXJzZXIuZmVlZChvcGVuKCdteWZpbGUuaHRtbCcpLnJlYWQoKSkKLXBhcnNlci5jbG9zZSgpCi1cZW5ke3ZlcmJhdGltfQotCi1caXRlbQotVGhlIGludGVyZmFjZSB0byBkZWZpbmUgc2VtYW50aWNzIGZvciBIVE1MIHRhZ3MgaXMgdmVyeSBzaW1wbGU6IGRlcml2ZQotYSBjbGFzcyBhbmQgZGVmaW5lIG1ldGhvZHMgY2FsbGVkIFxtZXRob2R7c3RhcnRfXHZhcnt0YWd9KCl9LAotXG1ldGhvZHtlbmRfXHZhcnt0YWd9KCl9LCBvciBcbWV0aG9ke2RvX1x2YXJ7dGFnfSgpfS4gIFRoZSBwYXJzZXIgd2lsbAotY2FsbCB0aGVzZSBhdCBhcHByb3ByaWF0ZSBtb21lbnRzOiBcbWV0aG9ke3N0YXJ0X1x2YXJ7dGFnfX0gb3IKLVxtZXRob2R7ZG9fXHZhcnt0YWd9KCl9IGlzIGNhbGxlZCB3aGVuIGFuIG9wZW5pbmcgdGFnIG9mIHRoZSBmb3JtCi1cY29kZXs8XHZhcnt0YWd9IC4uLj59IGlzIGVuY291bnRlcmVkOyBcbWV0aG9ke2VuZF9cdmFye3RhZ30oKX0gaXMgY2FsbGVkCi13aGVuIGEgY2xvc2luZyB0YWcgb2YgdGhlIGZvcm0gXGNvZGV7PFx2YXJ7dGFnfT59IGlzIGVuY291bnRlcmVkLiAgSWYKLWFuIG9wZW5pbmcgdGFnIHJlcXVpcmVzIGEgY29ycmVzcG9uZGluZyBjbG9zaW5nIHRhZywgbGlrZSBcY29kZXs8SDE+fQotLi4uIFxjb2RlezwvSDE+fSwgdGhlIGNsYXNzIHNob3VsZCBkZWZpbmUgdGhlIFxtZXRob2R7c3RhcnRfXHZhcnt0YWd9KCl9Ci1tZXRob2Q7IGlmIGEgdGFnIHJlcXVpcmVzIG5vIGNsb3NpbmcgdGFnLCBsaWtlIFxjb2RlezxQPn0sIHRoZSBjbGFzcwotc2hvdWxkIGRlZmluZSB0aGUgXG1ldGhvZHtkb19cdmFye3RhZ30oKX0gbWV0aG9kLgotCi1cZW5ke2l0ZW1pemV9Ci0KLVRoZSBtb2R1bGUgZGVmaW5lcyBhIHBhcnNlciBjbGFzcyBhbmQgYW4gZXhjZXB0aW9uOgotCi1cYmVnaW57Y2xhc3NkZXNjfXtIVE1MUGFyc2VyfXtmb3JtYXR0ZXJ9Ci1UaGlzIGlzIHRoZSBiYXNpYyBIVE1MIHBhcnNlciBjbGFzcy4gIEl0IHN1cHBvcnRzIGFsbCBlbnRpdHkgbmFtZXMKLXJlcXVpcmVkIGJ5IHRoZSBYSFRNTCAxLjAgUmVjb21tZW5kYXRpb24gKFx1cmx7aHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxfSkuICAKLUl0IGFsc28gZGVmaW5lcyBoYW5kbGVycyBmb3IgYWxsIEhUTUwgMi4wIGFuZCBtYW55IEhUTUwgMy4wIGFuZCAzLjIgZWxlbWVudHMuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e0hUTUxQYXJzZUVycm9yfQotRXhjZXB0aW9uIHJhaXNlZCBieSB0aGUgXGNsYXNze0hUTUxQYXJzZXJ9IGNsYXNzIHdoZW4gaXQgZW5jb3VudGVycyBhbgotZXJyb3Igd2hpbGUgcGFyc2luZy4KLVx2ZXJzaW9uYWRkZWR7Mi40fQotXGVuZHtleGNkZXNjfQotCi0KLVxiZWdpbntzZWVhbHNvfQotICBcc2VlbW9kdWxle2Zvcm1hdHRlcn17SW50ZXJmYWNlIGRlZmluaXRpb24gZm9yIHRyYW5zZm9ybWluZyBhbgotICAgICAgICAgICAgICAgICAgICAgICAgYWJzdHJhY3QgZmxvdyBvZiBmb3JtYXR0aW5nIGV2ZW50cyBpbnRvCi0gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpYyBvdXRwdXQgZXZlbnRzIG9uIHdyaXRlciBvYmplY3RzLn0KLSAgXHNlZW1vZHVsZXtIVE1MUGFyc2VyfXtBbHRlcm5hdGUgSFRNTCBwYXJzZXIgdGhhdCBvZmZlcnMgYSBzbGlnaHRseQotICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyLWxldmVsIHZpZXcgb2YgdGhlIGlucHV0LCBidXQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpZ25lZCB0byB3b3JrIHdpdGggWEhUTUwsIGFuZCBkb2VzIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudCBzb21lIG9mIHRoZSBTR01MIHN5bnRheCBub3QgdXNlZCBpbgotICAgICAgICAgICAgICAgICAgICAgICAgIGBgSFRNTCBhcyBkZXBsb3llZCcnIGFuZCB3aGljaCBpc24ndCBsZWdhbAotICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBYSFRNTC59Ci0gIFxzZWVtb2R1bGV7aHRtbGVudGl0eWRlZnN9e0RlZmluaXRpb24gb2YgcmVwbGFjZW1lbnQgdGV4dCBmb3IgWEhUTUwgMS4wIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdGllcy59Ci0gIFxzZWVtb2R1bGV7c2dtbGxpYn17QmFzZSBjbGFzcyBmb3IgXGNsYXNze0hUTUxQYXJzZXJ9Ln0KLVxlbmR7c2VlYWxzb30KLQotCi1cc3Vic2VjdGlvbntIVE1MUGFyc2VyIE9iamVjdHMgXGxhYmVse2h0bWwtcGFyc2VyLW9iamVjdHN9fQotCi1JbiBhZGRpdGlvbiB0byB0YWcgbWV0aG9kcywgdGhlIFxjbGFzc3tIVE1MUGFyc2VyfSBjbGFzcyBwcm92aWRlcyBzb21lCi1hZGRpdGlvbmFsIG1ldGhvZHMgYW5kIGluc3RhbmNlIHZhcmlhYmxlcyBmb3IgdXNlIHdpdGhpbiB0YWcgbWV0aG9kcy4KLQotXGJlZ2lue21lbWJlcmRlc2N9W0hUTUxQYXJzZXJde2Zvcm1hdHRlcn0KLVRoaXMgaXMgdGhlIGZvcm1hdHRlciBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggdGhlIHBhcnNlci4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W0hUTUxQYXJzZXJde25vZmlsbH0KLUJvb2xlYW4gZmxhZyB3aGljaCBzaG91bGQgYmUgdHJ1ZSB3aGVuIHdoaXRlc3BhY2Ugc2hvdWxkIG5vdCBiZQotY29sbGFwc2VkLCBvciBmYWxzZSB3aGVuIGl0IHNob3VsZCBiZS4gIEluIGdlbmVyYWwsIHRoaXMgc2hvdWxkIG9ubHkKLWJlIHRydWUgd2hlbiBjaGFyYWN0ZXIgZGF0YSBpcyB0byBiZSB0cmVhdGVkIGFzIGBgcHJlZm9ybWF0dGVkJycgdGV4dCwKLWFzIHdpdGhpbiBhIFxjb2RlezxQUkU+fSBlbGVtZW50LiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuICBUaGlzCi1hZmZlY3RzIHRoZSBvcGVyYXRpb24gb2YgXG1ldGhvZHtoYW5kbGVfZGF0YSgpfSBhbmQgXG1ldGhvZHtzYXZlX2VuZCgpfS4KLVxlbmR7bWVtYmVyZGVzY30KLQotCi1cYmVnaW57bWV0aG9kZGVzY31bSFRNTFBhcnNlcl17YW5jaG9yX2Jnbn17aHJlZiwgbmFtZSwgdHlwZX0KLVRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdCB0aGUgc3RhcnQgb2YgYW4gYW5jaG9yIHJlZ2lvbi4gIFRoZSBhcmd1bWVudHMKLWNvcnJlc3BvbmQgdG8gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIFxjb2RlezxBPn0gdGFnIHdpdGggdGhlIHNhbWUKLW5hbWVzLiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gbWFpbnRhaW5zIGEgbGlzdCBvZiBoeXBlcmxpbmtzCi0oZGVmaW5lZCBieSB0aGUgXGNvZGV7SFJFRn0gYXR0cmlidXRlIGZvciBcY29kZXs8QT59IHRhZ3MpIHdpdGhpbiB0aGUKLWRvY3VtZW50LiAgVGhlIGxpc3Qgb2YgaHlwZXJsaW5rcyBpcyBhdmFpbGFibGUgYXMgdGhlIGRhdGEgYXR0cmlidXRlCi1cbWVtYmVye2FuY2hvcmxpc3R9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSFRNTFBhcnNlcl17YW5jaG9yX2VuZH17fQotVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF0IHRoZSBlbmQgb2YgYW4gYW5jaG9yIHJlZ2lvbi4gIFRoZSBkZWZhdWx0Ci1pbXBsZW1lbnRhdGlvbiBhZGRzIGEgdGV4dHVhbCBmb290bm90ZSBtYXJrZXIgdXNpbmcgYW4gaW5kZXggaW50byB0aGUKLWxpc3Qgb2YgaHlwZXJsaW5rcyBjcmVhdGVkIGJ5IFxtZXRob2R7YW5jaG9yX2JnbigpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0hUTUxQYXJzZXJde2hhbmRsZV9pbWFnZX17c291cmNlLCBhbHRcb3B0aW9uYWx7LCBpc21hcFxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnblxvcHRpb25hbHssIHdpZHRoXG9wdGlvbmFseywgaGVpZ2h0fX19fX0KLVRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBoYW5kbGUgaW1hZ2VzLiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLXNpbXBseSBwYXNzZXMgdGhlIFx2YXJ7YWx0fSB2YWx1ZSB0byB0aGUgXG1ldGhvZHtoYW5kbGVfZGF0YSgpfQotbWV0aG9kLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSFRNTFBhcnNlcl17c2F2ZV9iZ259e30KLUJlZ2lucyBzYXZpbmcgY2hhcmFjdGVyIGRhdGEgaW4gYSBidWZmZXIgaW5zdGVhZCBvZiBzZW5kaW5nIGl0IHRvIHRoZQotZm9ybWF0dGVyIG9iamVjdC4gIFJldHJpZXZlIHRoZSBzdG9yZWQgZGF0YSB2aWEgXG1ldGhvZHtzYXZlX2VuZCgpfS4KLVVzZSBvZiB0aGUgXG1ldGhvZHtzYXZlX2JnbigpfSAvIFxtZXRob2R7c2F2ZV9lbmQoKX0gcGFpciBtYXkgbm90IGJlCi1uZXN0ZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtIVE1MUGFyc2VyXXtzYXZlX2VuZH17fQotRW5kcyBidWZmZXJpbmcgY2hhcmFjdGVyIGRhdGEgYW5kIHJldHVybnMgYWxsIGRhdGEgc2F2ZWQgc2luY2UgdGhlCi1wcmVjZWRpbmcgY2FsbCB0byBcbWV0aG9ke3NhdmVfYmduKCl9LiAgSWYgdGhlIFxtZW1iZXJ7bm9maWxsfSBmbGFnIGlzCi1mYWxzZSwgd2hpdGVzcGFjZSBpcyBjb2xsYXBzZWQgdG8gc2luZ2xlIHNwYWNlcy4gIEEgY2FsbCB0byB0aGlzCi1tZXRob2Qgd2l0aG91dCBhIHByZWNlZGluZyBjYWxsIHRvIFxtZXRob2R7c2F2ZV9iZ24oKX0gd2lsbCByYWlzZSBhCi1cZXhjZXB0aW9ue1R5cGVFcnJvcn0gZXhjZXB0aW9uLgotXGVuZHttZXRob2RkZXNjfQotCi0KLQotXHNlY3Rpb257XG1vZHVsZXtodG1sZW50aXR5ZGVmc30gLS0tCi0gICAgICAgICBEZWZpbml0aW9ucyBvZiBIVE1MIGdlbmVyYWwgZW50aXRpZXN9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtodG1sZW50aXR5ZGVmc30KLVxtb2R1bGVzeW5vcHNpc3tEZWZpbml0aW9ucyBvZiBIVE1MIGdlbmVyYWwgZW50aXRpZXMufQotXHNlY3Rpb25hdXRob3J7RnJlZCBMLiBEcmFrZSwgSnIufXtmZHJha2VAYWNtLm9yZ30KLQotVGhpcyBtb2R1bGUgZGVmaW5lcyB0aHJlZSBkaWN0aW9uYXJpZXMsIFxjb2Rle25hbWUyY29kZXBvaW50fSwKLVxjb2Rle2NvZGVwb2ludDJuYW1lfSwgYW5kIFxjb2Rle2VudGl0eWRlZnN9LiBcY29kZXtlbnRpdHlkZWZzfSBpcwotdXNlZCBieSB0aGUgXHJlZm1vZHVsZXtodG1sbGlifSBtb2R1bGUgdG8gcHJvdmlkZSB0aGUKLVxtZW1iZXJ7ZW50aXR5ZGVmc30gbWVtYmVyIG9mIHRoZSBcY2xhc3N7SFRNTFBhcnNlcn0gY2xhc3MuICBUaGUKLWRlZmluaXRpb24gcHJvdmlkZWQgaGVyZSBjb250YWlucyBhbGwgdGhlIGVudGl0aWVzIGRlZmluZWQgYnkgWEhUTUwgMS4wIAotdGhhdCBjYW4gYmUgaGFuZGxlZCB1c2luZyBzaW1wbGUgdGV4dHVhbCBzdWJzdGl0dXRpb24gaW4gdGhlIExhdGluLTEKLWNoYXJhY3RlciBzZXQgKElTTy04ODU5LTEpLgotCi0KLVxiZWdpbntkYXRhZGVzY317ZW50aXR5ZGVmc30KLSAgQSBkaWN0aW9uYXJ5IG1hcHBpbmcgWEhUTUwgMS4wIGVudGl0eSBkZWZpbml0aW9ucyB0byB0aGVpcgotICByZXBsYWNlbWVudCB0ZXh0IGluIElTTyBMYXRpbi0xLgotCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e25hbWUyY29kZXBvaW50fQotICBBIGRpY3Rpb25hcnkgdGhhdCBtYXBzIEhUTUwgZW50aXR5IG5hbWVzIHRvIHRoZSBVbmljb2RlIGNvZGVwb2ludHMuCi0gIFx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtjb2RlcG9pbnQybmFtZX0KLSAgQSBkaWN0aW9uYXJ5IHRoYXQgbWFwcyBVbmljb2RlIGNvZGVwb2ludHMgdG8gSFRNTCBlbnRpdHkgbmFtZXMuCi0gIFx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtkYXRhZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliaHRtbHBhcnNlci50ZXggYi9Eb2MvbGliL2xpYmh0bWxwYXJzZXIudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTk5ZjI3Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGliaHRtbHBhcnNlci50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtIVE1MUGFyc2VyfSAtLS0KLSAgICAgICAgIFNpbXBsZSBIVE1MIGFuZCBYSFRNTCBwYXJzZXJ9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtIVE1MUGFyc2VyfQotXG1vZHVsZXN5bm9wc2lze0Egc2ltcGxlIHBhcnNlciB0aGF0IGNhbiBoYW5kbGUgSFRNTCBhbmQgWEhUTUwufQotCi1cdmVyc2lvbmFkZGVkezIuMn0KLQotVGhpcyBtb2R1bGUgZGVmaW5lcyBhIGNsYXNzIFxjbGFzc3tIVE1MUGFyc2VyfSB3aGljaCBzZXJ2ZXMgYXMgdGhlCi1iYXNpcyBmb3IgcGFyc2luZyB0ZXh0IGZpbGVzIGZvcm1hdHRlZCBpbiBIVE1MXGluZGV4e0hUTUx9IChIeXBlclRleHQKLU1hcmstdXAgTGFuZ3VhZ2UpIGFuZCBYSFRNTC5caW5kZXh7WEhUTUx9ICBVbmxpa2UgdGhlIHBhcnNlciBpbgotXHJlZm1vZHVsZXtodG1sbGlifSwgdGhpcyBwYXJzZXIgaXMgbm90IGJhc2VkIG9uIHRoZSBTR01MIHBhcnNlciBpbgotXHJlZm1vZHVsZXtzZ21sbGlifS4KLQotCi1cYmVnaW57Y2xhc3NkZXNjfXtIVE1MUGFyc2VyfXt9Ci1UaGUgXGNsYXNze0hUTUxQYXJzZXJ9IGNsYXNzIGlzIGluc3RhbnRpYXRlZCB3aXRob3V0IGFyZ3VtZW50cy4KLQotQW4gSFRNTFBhcnNlciBpbnN0YW5jZSBpcyBmZWQgSFRNTCBkYXRhIGFuZCBjYWxscyBoYW5kbGVyIGZ1bmN0aW9ucwotd2hlbiB0YWdzIGJlZ2luIGFuZCBlbmQuICBUaGUgXGNsYXNze0hUTUxQYXJzZXJ9IGNsYXNzIGlzIG1lYW50IHRvIGJlCi1vdmVycmlkZGVuIGJ5IHRoZSB1c2VyIHRvIHByb3ZpZGUgYSBkZXNpcmVkIGJlaGF2aW9yLgotCi1Vbmxpa2UgdGhlIHBhcnNlciBpbiBccmVmbW9kdWxle2h0bWxsaWJ9LCB0aGlzIHBhcnNlciBkb2VzIG5vdCBjaGVjawotdGhhdCBlbmQgdGFncyBtYXRjaCBzdGFydCB0YWdzIG9yIGNhbGwgdGhlIGVuZC10YWcgaGFuZGxlciBmb3IKLWVsZW1lbnRzIHdoaWNoIGFyZSBjbG9zZWQgaW1wbGljaXRseSBieSBjbG9zaW5nIGFuIG91dGVyIGVsZW1lbnQuCi1cZW5ke2NsYXNzZGVzY30KLQotQW4gZXhjZXB0aW9uIGlzIGRlZmluZWQgYXMgd2VsbDoKLQotXGJlZ2lue2V4Y2Rlc2N9e0hUTUxQYXJzZUVycm9yfQotRXhjZXB0aW9uIHJhaXNlZCBieSB0aGUgXGNsYXNze0hUTUxQYXJzZXJ9IGNsYXNzIHdoZW4gaXQgZW5jb3VudGVycyBhbgotZXJyb3Igd2hpbGUgcGFyc2luZy4gIFRoaXMgZXhjZXB0aW9uIHByb3ZpZGVzIHRocmVlIGF0dHJpYnV0ZXM6Ci1cbWVtYmVye21zZ30gaXMgYSBicmllZiBtZXNzYWdlIGV4cGxhaW5pbmcgdGhlIGVycm9yLCBcbWVtYmVye2xpbmVub30KLWlzIHRoZSBudW1iZXIgb2YgdGhlIGxpbmUgb24gd2hpY2ggdGhlIGJyb2tlbiBjb25zdHJ1Y3Qgd2FzIGRldGVjdGVkLAotYW5kIFxtZW1iZXJ7b2Zmc2V0fSBpcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW50byB0aGUgbGluZSBhdCB3aGljaAotdGhlIGNvbnN0cnVjdCBzdGFydHMuCi1cZW5ke2V4Y2Rlc2N9Ci0KLQotXGNsYXNze0hUTUxQYXJzZXJ9IGluc3RhbmNlcyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLQotXGJlZ2lue21ldGhvZGRlc2N9e3Jlc2V0fXt9Ci1SZXNldCB0aGUgaW5zdGFuY2UuICBMb3NlcyBhbGwgdW5wcm9jZXNzZWQgZGF0YS4gIFRoaXMgaXMgY2FsbGVkCi1pbXBsaWNpdGx5IGF0IGluc3RhbnRpYXRpb24gdGltZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2ZlZWR9e2RhdGF9Ci1GZWVkIHNvbWUgdGV4dCB0byB0aGUgcGFyc2VyLiAgSXQgaXMgcHJvY2Vzc2VkIGluc29mYXIgYXMgaXQgY29uc2lzdHMKLW9mIGNvbXBsZXRlIGVsZW1lbnRzOyBpbmNvbXBsZXRlIGRhdGEgaXMgYnVmZmVyZWQgdW50aWwgbW9yZSBkYXRhIGlzCi1mZWQgb3IgXG1ldGhvZHtjbG9zZSgpfSBpcyBjYWxsZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtjbG9zZX17fQotRm9yY2UgcHJvY2Vzc2luZyBvZiBhbGwgYnVmZmVyZWQgZGF0YSBhcyBpZiBpdCB3ZXJlIGZvbGxvd2VkIGJ5IGFuCi1lbmQtb2YtZmlsZSBtYXJrLiAgVGhpcyBtZXRob2QgbWF5IGJlIHJlZGVmaW5lZCBieSBhIGRlcml2ZWQgY2xhc3MgdG8KLWRlZmluZSBhZGRpdGlvbmFsIHByb2Nlc3NpbmcgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQsIGJ1dCB0aGUKLXJlZGVmaW5lZCB2ZXJzaW9uIHNob3VsZCBhbHdheXMgY2FsbCB0aGUgXGNsYXNze0hUTUxQYXJzZXJ9IGJhc2UgY2xhc3MKLW1ldGhvZCBcbWV0aG9ke2Nsb3NlKCl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Z2V0cG9zfXt9Ci1SZXR1cm4gY3VycmVudCBsaW5lIG51bWJlciBhbmQgb2Zmc2V0LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Z2V0X3N0YXJ0dGFnX3RleHR9e30KLVJldHVybiB0aGUgdGV4dCBvZiB0aGUgbW9zdCByZWNlbnRseSBvcGVuZWQgc3RhcnQgdGFnLiAgVGhpcyBzaG91bGQKLW5vdCBub3JtYWxseSBiZSBuZWVkZWQgZm9yIHN0cnVjdHVyZWQgcHJvY2Vzc2luZywgYnV0IG1heSBiZSB1c2VmdWwgaW4KLWRlYWxpbmcgd2l0aCBIVE1MIGBgYXMgZGVwbG95ZWQnJyBvciBmb3IgcmUtZ2VuZXJhdGluZyBpbnB1dCB3aXRoCi1taW5pbWFsIGNoYW5nZXMgKHdoaXRlc3BhY2UgYmV0d2VlbiBhdHRyaWJ1dGVzIGNhbiBiZSBwcmVzZXJ2ZWQsCi1ldGMuKS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2hhbmRsZV9zdGFydHRhZ317dGFnLCBhdHRyc30gCi1UaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gaGFuZGxlIHRoZSBzdGFydCBvZiBhIHRhZy4gIEl0IGlzIGludGVuZGVkIHRvCi1iZSBvdmVycmlkZGVuIGJ5IGEgZGVyaXZlZCBjbGFzczsgdGhlIGJhc2UgY2xhc3MgaW1wbGVtZW50YXRpb24gZG9lcwotbm90aGluZy4gIAotCi1UaGUgXHZhcnt0YWd9IGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSB0YWcgY29udmVydGVkIHRvIGxvd2VyIGNhc2UuCi1UaGUgXHZhcnthdHRyc30gYXJndW1lbnQgaXMgYSBsaXN0IG9mIFxjb2RleyhcdmFye25hbWV9LCBcdmFye3ZhbHVlfSl9Ci1wYWlycyBjb250YWluaW5nIHRoZSBhdHRyaWJ1dGVzIGZvdW5kIGluc2lkZSB0aGUgdGFnJ3MgXGNvZGV7PD59Ci1icmFja2V0cy4gIFRoZSBcdmFye25hbWV9IHdpbGwgYmUgdHJhbnNsYXRlZCB0byBsb3dlciBjYXNlLCBhbmQgcXVvdGVzCi1pbiB0aGUgXHZhcnt2YWx1ZX0gaGF2ZSBiZWVuIHJlbW92ZWQsIGFuZCBjaGFyYWN0ZXIgYW5kIGVudGl0eQotcmVmZXJlbmNlcyBoYXZlIGJlZW4gcmVwbGFjZWQuICBGb3IgaW5zdGFuY2UsIGZvciB0aGUgdGFnIFxjb2RlezxBCi0gIEhSRUY9Imh0dHA6Ly93d3cuY3dpLm5sLyI+fSwgdGhpcyBtZXRob2Qgd291bGQgYmUgY2FsbGVkIGFzCi1cc2FtcHtoYW5kbGVfc3RhcnR0YWcoJ2EnLCBbKCdocmVmJywgJ2h0dHA6Ly93d3cuY3dpLm5sLycpXSl9LgotCi1cdmVyc2lvbmNoYW5nZWRbQWxsIGVudGl0eSByZWZlcmVuY2VzIGZyb20gaHRtbGVudGl0eWRlZnMgYXJlIG5vdwotcmVwbGFjZWQgaW4gdGhlIGF0dHJpYnV0ZSB2YWx1ZXNdezIuNn0KLQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317aGFuZGxlX3N0YXJ0ZW5kdGFnfXt0YWcsIGF0dHJzfQotU2ltaWxhciB0byBcbWV0aG9ke2hhbmRsZV9zdGFydHRhZygpfSwgYnV0IGNhbGxlZCB3aGVuIHRoZSBwYXJzZXIKLWVuY291bnRlcnMgYW4gWEhUTUwtc3R5bGUgZW1wdHkgdGFnIChcY29kZXs8YSAuLi4vPn0pLiAgVGhpcyBtZXRob2QKLW1heSBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMgd2hpY2ggcmVxdWlyZSB0aGlzIHBhcnRpY3VsYXIgbGV4aWNhbAotaW5mb3JtYXRpb247IHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBsZSBjYWxscwotXG1ldGhvZHtoYW5kbGVfc3RhcnR0YWcoKX0gYW5kIFxtZXRob2R7aGFuZGxlX2VuZHRhZygpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2hhbmRsZV9lbmR0YWd9e3RhZ30KLVRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBoYW5kbGUgdGhlIGVuZCB0YWcgb2YgYW4gZWxlbWVudC4gIEl0IGlzCi1pbnRlbmRlZCB0byBiZSBvdmVycmlkZGVuIGJ5IGEgZGVyaXZlZCBjbGFzczsgdGhlIGJhc2UgY2xhc3MKLWltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gIFRoZSBcdmFye3RhZ30gYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YKLXRoZSB0YWcgY29udmVydGVkIHRvIGxvd2VyIGNhc2UuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtoYW5kbGVfZGF0YX17ZGF0YX0KLVRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBwcm9jZXNzIGFyYml0cmFyeSBkYXRhLiAgSXQgaXMgaW50ZW5kZWQgdG8gYmUKLW92ZXJyaWRkZW4gYnkgYSBkZXJpdmVkIGNsYXNzOyB0aGUgYmFzZSBjbGFzcyBpbXBsZW1lbnRhdGlvbiBkb2VzCi1ub3RoaW5nLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317aGFuZGxlX2NoYXJyZWZ9e25hbWV9IFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0bwotcHJvY2VzcyBhIGNoYXJhY3RlciByZWZlcmVuY2Ugb2YgdGhlIGZvcm0gXHNhbXB7XCZcI1x2YXJ7cmVmfTt9LiAgSXQKLWlzIGludGVuZGVkIHRvIGJlIG92ZXJyaWRkZW4gYnkgYSBkZXJpdmVkIGNsYXNzOyB0aGUgYmFzZSBjbGFzcwotaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiAgCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtoYW5kbGVfZW50aXR5cmVmfXtuYW1lfSAKLVRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBwcm9jZXNzIGEgZ2VuZXJhbCBlbnRpdHkgcmVmZXJlbmNlIG9mIHRoZQotZm9ybSBcc2FtcHtcJlx2YXJ7bmFtZX07fSB3aGVyZSBcdmFye25hbWV9IGlzIGFuIGdlbmVyYWwgZW50aXR5Ci1yZWZlcmVuY2UuICBJdCBpcyBpbnRlbmRlZCB0byBiZSBvdmVycmlkZGVuIGJ5IGEgZGVyaXZlZCBjbGFzczsgdGhlCi1iYXNlIGNsYXNzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2hhbmRsZV9jb21tZW50fXtkYXRhfQotVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYSBjb21tZW50IGlzIGVuY291bnRlcmVkLiAgVGhlCi1cdmFye2NvbW1lbnR9IGFyZ3VtZW50IGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHRleHQgYmV0d2VlbiB0aGUKLVxzYW1wey0tfSBhbmQgXHNhbXB7LS19IGRlbGltaXRlcnMsIGJ1dCBub3QgdGhlIGRlbGltaXRlcnMKLXRoZW1zZWx2ZXMuICBGb3IgZXhhbXBsZSwgdGhlIGNvbW1lbnQgXHNhbXB7PCEtLXRleHQtLT59IHdpbGwKLWNhdXNlIHRoaXMgbWV0aG9kIHRvIGJlIGNhbGxlZCB3aXRoIHRoZSBhcmd1bWVudCBcY29kZXsndGV4dCd9LiAgSXQgaXMKLWludGVuZGVkIHRvIGJlIG92ZXJyaWRkZW4gYnkgYSBkZXJpdmVkIGNsYXNzOyB0aGUgYmFzZSBjbGFzcwotaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317aGFuZGxlX2RlY2x9e2RlY2x9Ci1NZXRob2QgY2FsbGVkIHdoZW4gYW4gU0dNTCBkZWNsYXJhdGlvbiBpcyByZWFkIGJ5IHRoZSBwYXJzZXIuICBUaGUKLVx2YXJ7ZGVjbH0gcGFyYW1ldGVyIHdpbGwgYmUgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgZGVjbGFyYXRpb24KLWluc2lkZSB0aGUgXGNvZGV7PCF9Li4uXGNvZGV7Pn0gbWFya3VwLiAgSXQgaXMgaW50ZW5kZWQgdG8gYmUgb3ZlcnJpZGRlbgotYnkgYSBkZXJpdmVkIGNsYXNzOyB0aGUgYmFzZSBjbGFzcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtoYW5kbGVfcGl9e2RhdGF9Ci1NZXRob2QgY2FsbGVkIHdoZW4gYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGlzIGVuY291bnRlcmVkLiAgVGhlCi1cdmFye2RhdGF9IHBhcmFtZXRlciB3aWxsIGNvbnRhaW4gdGhlIGVudGlyZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uLgotRm9yIGV4YW1wbGUsIGZvciB0aGUgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBcY29kZXs8P3Byb2MgY29sb3I9J3JlZCc+fSwKLXRoaXMgbWV0aG9kIHdvdWxkIGJlIGNhbGxlZCBhcyBcY29kZXtoYW5kbGVfcGkoInByb2MgY29sb3I9J3JlZCciKX0uICBJdAotaXMgaW50ZW5kZWQgdG8gYmUgb3ZlcnJpZGRlbiBieSBhIGRlcml2ZWQgY2xhc3M7IHRoZSBiYXNlIGNsYXNzCi1pbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCi0KLVxub3Rle1RoZSBcY2xhc3N7SFRNTFBhcnNlcn0gY2xhc3MgdXNlcyB0aGUgU0dNTCBzeW50YWN0aWMgcnVsZXMgZm9yCi1wcm9jZXNzaW5nIGluc3RydWN0aW9ucy4gIEFuIFhIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdXNpbmcgdGhlCi10cmFpbGluZyBcY2hhcmFjdGVyez99IHdpbGwgY2F1c2UgdGhlIFxjaGFyYWN0ZXJ7P30gdG8gYmUgaW5jbHVkZWQgaW4KLVx2YXJ7ZGF0YX0ufQotXGVuZHttZXRob2RkZXNjfQotCi0KLVxzdWJzZWN0aW9ue0V4YW1wbGUgSFRNTCBQYXJzZXIgQXBwbGljYXRpb24gXGxhYmVse2h0bWxwYXJzZXItZXhhbXBsZX19Ci0KLUFzIGEgYmFzaWMgZXhhbXBsZSwgYmVsb3cgaXMgYSB2ZXJ5IGJhc2ljIEhUTUwgcGFyc2VyIHRoYXQgdXNlcyB0aGUKLVxjbGFzc3tIVE1MUGFyc2VyfSBjbGFzcyB0byBwcmludCBvdXQgdGFncyBhcyB0aGV5IGFyZSBlbmNvdW50ZXJlZDoKLQotXGJlZ2lue3ZlcmJhdGltfQotZnJvbSBIVE1MUGFyc2VyIGltcG9ydCBIVE1MUGFyc2VyCi0KLWNsYXNzIE15SFRNTFBhcnNlcihIVE1MUGFyc2VyKToKLQotICAgIGRlZiBoYW5kbGVfc3RhcnR0YWcoc2VsZiwgdGFnLCBhdHRycyk6Ci0gICAgICAgIHByaW50ICJFbmNvdW50ZXJlZCB0aGUgYmVnaW5uaW5nIG9mIGEgJXMgdGFnIiAlIHRhZwotCi0gICAgZGVmIGhhbmRsZV9lbmR0YWcoc2VsZiwgdGFnKToKLSAgICAgICAgcHJpbnQgIkVuY291bnRlcmVkIHRoZSBlbmQgb2YgYSAlcyB0YWciICUgdGFnCi1cZW5ke3ZlcmJhdGltfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJodHRwbGliLnRleCBiL0RvYy9saWIvbGliaHR0cGxpYi50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YTQ0MmQuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJodHRwbGliLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDQ1MiArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle2h0dHBsaWJ9IC0tLQotICAgICAgICAgSFRUUCBwcm90b2NvbCBjbGllbnR9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtodHRwbGlifQotXG1vZHVsZXN5bm9wc2lze0hUVFAgYW5kIEhUVFBTIHByb3RvY29sIGNsaWVudCAocmVxdWlyZXMgc29ja2V0cykufQotCi1caW5kZXhpaXtIVFRQfXtwcm90b2NvbH0KLVxpbmRleHtIVFRQIVxtb2R1bGV7aHR0cGxpYn0gKHN0YW5kYXJkIG1vZHVsZSl9Ci0KLVRoaXMgbW9kdWxlIGRlZmluZXMgY2xhc3NlcyB3aGljaCBpbXBsZW1lbnQgdGhlIGNsaWVudCBzaWRlIG9mIHRoZQotSFRUUCBhbmQgSFRUUFMgcHJvdG9jb2xzLiAgSXQgaXMgbm9ybWFsbHkgbm90IHVzZWQgZGlyZWN0bHkgLS0tIHRoZQotbW9kdWxlIFxyZWZtb2R1bGV7dXJsbGlifVxyZWZzdG1vZGluZGV4e3VybGxpYn0gdXNlcyBpdCB0byBoYW5kbGUgVVJMcwotdGhhdCB1c2UgSFRUUCBhbmQgSFRUUFMuCi0KLVxiZWdpbntub3RpY2V9Ci0gIEhUVFBTIHN1cHBvcnQgaXMgb25seSBhdmFpbGFibGUgaWYgdGhlIFxyZWZtb2R1bGV7c29ja2V0fSBtb2R1bGUgd2FzCi0gIGNvbXBpbGVkIHdpdGggU1NMIHN1cHBvcnQuCi1cZW5ke25vdGljZX0KLQotXGJlZ2lue25vdGljZX0KLSAgVGhlIHB1YmxpYyBpbnRlcmZhY2UgZm9yIHRoaXMgbW9kdWxlIGNoYW5nZWQgc3Vic3RhbnRpYWxseSBpbiBQeXRob24KLSAgMi4wLiAgVGhlIFxjbGFzc3tIVFRQfSBjbGFzcyBpcyByZXRhaW5lZCBvbmx5IGZvciBiYWNrd2FyZAotICBjb21wYXRpYmlsaXR5IHdpdGggMS41LjIuICBJdCBzaG91bGQgbm90IGJlIHVzZWQgaW4gbmV3IGNvZGUuICBSZWZlcgotICB0byB0aGUgb25saW5lIGRvY3N0cmluZ3MgZm9yIHVzYWdlLgotXGVuZHtub3RpY2V9Ci0KLVRoZSBtb2R1bGUgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBjbGFzc2VzOgotCi1cYmVnaW57Y2xhc3NkZXNjfXtIVFRQQ29ubmVjdGlvbn17aG9zdFxvcHRpb25hbHssIHBvcnRcb3B0aW9uYWx7LAotCQkgIHN0cmljdFxvcHRpb25hbHssIHRpbWVvdXR9fX19Ci1BbiBcY2xhc3N7SFRUUENvbm5lY3Rpb259IGluc3RhbmNlIHJlcHJlc2VudHMgb25lIHRyYW5zYWN0aW9uIHdpdGggYW4gSFRUUAotc2VydmVyLiAgSXQgc2hvdWxkIGJlIGluc3RhbnRpYXRlZCBwYXNzaW5nIGl0IGEgaG9zdCBhbmQgb3B0aW9uYWwgcG9ydCBudW1iZXIuCi1JZiBubyBwb3J0IG51bWJlciBpcyBwYXNzZWQsIHRoZSBwb3J0IGlzIGV4dHJhY3RlZCBmcm9tIHRoZSBob3N0IHN0cmluZyBpZiBpdAotaGFzIHRoZSBmb3JtIFxjb2Rle1x2YXJ7aG9zdH06XHZhcntwb3J0fX0sIGVsc2UgdGhlIGRlZmF1bHQgSFRUUCBwb3J0ICg4MCkgaXMKLXVzZWQuICBXaGVuIFRydWUsIHRoZSBvcHRpb25hbCBwYXJhbWV0ZXIgXHZhcntzdHJpY3R9Ci1jYXVzZXMgXGNvZGV7QmFkU3RhdHVzTGluZX0gdG8gYmUgcmFpc2VkIGlmIHRoZSBzdGF0dXMgbGluZSBjYW4ndCBiZSBwYXJzZWQKLWFzIGEgdmFsaWQgSFRUUC8xLjAgb3IgMS4xIHN0YXR1cyBsaW5lLiAgSWYgdGhlIG9wdGlvbmFsIFx2YXJ7dGltZW91dH0KLXBhcmFtZXRlciBpcyBnaXZlbiwgY29ubmVjdGlvbiBhdHRlbXB0cyB3aWxsIHRpbWVvdXQgYWZ0ZXIgdGhhdCBtYW55Ci1zZWNvbmRzIChpZiBpdCBpcyBub3QgZ2l2ZW4gb3IgXGNvZGV7Tm9uZX0sIHRoZSBnbG9iYWwgZGVmYXVsdCAKLXRpbWVvdXQgc2V0dGluZyBpcyB1c2VkKS4KLQotRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY2FsbHMgYWxsIGNyZWF0ZSBpbnN0YW5jZXMgdGhhdCBjb25uZWN0IHRvCi10aGUgc2VydmVyIGF0IHRoZSBzYW1lIGhvc3QgYW5kIHBvcnQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBoMSA9IGh0dHBsaWIuSFRUUENvbm5lY3Rpb24oJ3d3dy5jd2kubmwnKQotPj4+IGgyID0gaHR0cGxpYi5IVFRQQ29ubmVjdGlvbignd3d3LmN3aS5ubDo4MCcpCi0+Pj4gaDMgPSBodHRwbGliLkhUVFBDb25uZWN0aW9uKCd3d3cuY3dpLm5sJywgODApCi0+Pj4gaDMgPSBodHRwbGliLkhUVFBDb25uZWN0aW9uKCd3d3cuY3dpLm5sJywgODAsIHRpbWVvdXQ9MTApCi1cZW5ke3ZlcmJhdGltfQotXHZlcnNpb25hZGRlZHsyLjB9Ci1cdmVyc2lvbmNoYW5nZWRbXHZhcnt0aW1lb3V0fSB3YXMgYWRkZWRdezIuNn0KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtIVFRQU0Nvbm5lY3Rpb259e2hvc3Rcb3B0aW9uYWx7LCBwb3J0XG9wdGlvbmFseywKLQkJICBrZXlfZmlsZVxvcHRpb25hbHssIGNlcnRfZmlsZVxvcHRpb25hbHssCi0JCSAgc3RyaWN0XG9wdGlvbmFseywgdGltZW91dH19fX19fQotQSBzdWJjbGFzcyBvZiBcY2xhc3N7SFRUUENvbm5lY3Rpb259IHRoYXQgdXNlcyBTU0wgZm9yIGNvbW11bmljYXRpb24gd2l0aAotc2VjdXJlIHNlcnZlcnMuICBEZWZhdWx0IHBvcnQgaXMgXGNvZGV7NDQzfS4KLVx2YXJ7a2V5X2ZpbGV9IGlzCi10aGUgbmFtZSBvZiBhIFBFTSBmb3JtYXR0ZWQgZmlsZSB0aGF0IGNvbnRhaW5zIHlvdXIgcHJpdmF0ZQota2V5LiBcdmFye2NlcnRfZmlsZX0gaXMgYSBQRU0gZm9ybWF0dGVkIGNlcnRpZmljYXRlIGNoYWluIGZpbGUuCi0KLVx3YXJuaW5ne1RoaXMgZG9lcyBub3QgZG8gYW55IGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiF9Ci0KLVx2ZXJzaW9uYWRkZWR7Mi4wfQotXHZlcnNpb25jaGFuZ2VkW1x2YXJ7dGltZW91dH0gd2FzIGFkZGVkXXsyLjZ9Ci1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317SFRUUFJlc3BvbnNlfXtzb2NrXG9wdGlvbmFseywgZGVidWdsZXZlbD0wfVxvcHRpb25hbHssIHN0cmljdD0wfX0KLUNsYXNzIHdob3NlIGluc3RhbmNlcyBhcmUgcmV0dXJuZWQgdXBvbiBzdWNjZXNzZnVsIGNvbm5lY3Rpb24uICBOb3QKLWluc3RhbnRpYXRlZCBkaXJlY3RseSBieSB1c2VyLgotXHZlcnNpb25hZGRlZHsyLjB9Ci1cZW5ke2NsYXNzZGVzY30KLQotVGhlIGZvbGxvd2luZyBleGNlcHRpb25zIGFyZSByYWlzZWQgYXMgYXBwcm9wcmlhdGU6Ci0KLVxiZWdpbntleGNkZXNjfXtIVFRQRXhjZXB0aW9ufQotVGhlIGJhc2UgY2xhc3Mgb2YgdGhlIG90aGVyIGV4Y2VwdGlvbnMgaW4gdGhpcyBtb2R1bGUuICBJdCBpcyBhCi1zdWJjbGFzcyBvZiBcZXhjZXB0aW9ue0V4Y2VwdGlvbn0uCi1cdmVyc2lvbmFkZGVkezIuMH0KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e05vdENvbm5lY3RlZH0KLUEgc3ViY2xhc3Mgb2YgXGV4Y2VwdGlvbntIVFRQRXhjZXB0aW9ufS4KLVx2ZXJzaW9uYWRkZWR7Mi4wfQotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317SW52YWxpZFVSTH0KLUEgc3ViY2xhc3Mgb2YgXGV4Y2VwdGlvbntIVFRQRXhjZXB0aW9ufSwgcmFpc2VkIGlmIGEgcG9ydCBpcyBnaXZlbiBhbmQgaXMKLWVpdGhlciBub24tbnVtZXJpYyBvciBlbXB0eS4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317VW5rbm93blByb3RvY29sfQotQSBzdWJjbGFzcyBvZiBcZXhjZXB0aW9ue0hUVFBFeGNlcHRpb259LgotXHZlcnNpb25hZGRlZHsyLjB9Ci1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtVbmtub3duVHJhbnNmZXJFbmNvZGluZ30KLUEgc3ViY2xhc3Mgb2YgXGV4Y2VwdGlvbntIVFRQRXhjZXB0aW9ufS4KLVx2ZXJzaW9uYWRkZWR7Mi4wfQotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317VW5pbXBsZW1lbnRlZEZpbGVNb2RlfQotQSBzdWJjbGFzcyBvZiBcZXhjZXB0aW9ue0hUVFBFeGNlcHRpb259LgotXHZlcnNpb25hZGRlZHsyLjB9Ci1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtJbmNvbXBsZXRlUmVhZH0KLUEgc3ViY2xhc3Mgb2YgXGV4Y2VwdGlvbntIVFRQRXhjZXB0aW9ufS4KLVx2ZXJzaW9uYWRkZWR7Mi4wfQotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317SW1wcm9wZXJDb25uZWN0aW9uU3RhdGV9Ci1BIHN1YmNsYXNzIG9mIFxleGNlcHRpb257SFRUUEV4Y2VwdGlvbn0uCi1cdmVyc2lvbmFkZGVkezIuMH0KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e0Nhbm5vdFNlbmRSZXF1ZXN0fQotQSBzdWJjbGFzcyBvZiBcZXhjZXB0aW9ue0ltcHJvcGVyQ29ubmVjdGlvblN0YXRlfS4KLVx2ZXJzaW9uYWRkZWR7Mi4wfQotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317Q2Fubm90U2VuZEhlYWRlcn0KLUEgc3ViY2xhc3Mgb2YgXGV4Y2VwdGlvbntJbXByb3BlckNvbm5lY3Rpb25TdGF0ZX0uCi1cdmVyc2lvbmFkZGVkezIuMH0KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e1Jlc3BvbnNlTm90UmVhZHl9Ci1BIHN1YmNsYXNzIG9mIFxleGNlcHRpb257SW1wcm9wZXJDb25uZWN0aW9uU3RhdGV9LgotXHZlcnNpb25hZGRlZHsyLjB9Ci1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtCYWRTdGF0dXNMaW5lfQotQSBzdWJjbGFzcyBvZiBcZXhjZXB0aW9ue0hUVFBFeGNlcHRpb259LiAgUmFpc2VkIGlmIGEgc2VydmVyIHJlc3BvbmRzIHdpdGggYQotSFRUUCBzdGF0dXMgY29kZSB0aGF0IHdlIGRvbid0IHVuZGVyc3RhbmQuCi1cdmVyc2lvbmFkZGVkezIuMH0KLVxlbmR7ZXhjZGVzY30KLQotVGhlIGNvbnN0YW50cyBkZWZpbmVkIGluIHRoaXMgbW9kdWxlIGFyZToKLQotXGJlZ2lue2RhdGFkZXNjfXtIVFRQX1BPUlR9Ci0gIFRoZSBkZWZhdWx0IHBvcnQgZm9yIHRoZSBIVFRQIHByb3RvY29sIChhbHdheXMgXGNvZGV7ODB9KS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317SFRUUFNfUE9SVH0KLSAgVGhlIGRlZmF1bHQgcG9ydCBmb3IgdGhlIEhUVFBTIHByb3RvY29sIChhbHdheXMgXGNvZGV7NDQzfSkuCi1cZW5ke2RhdGFkZXNjfQotCi1hbmQgYWxzbyB0aGUgZm9sbG93aW5nIGNvbnN0YW50cyBmb3IgaW50ZWdlciBzdGF0dXMgY29kZXM6Ci0KLVxiZWdpbnt0YWJsZWlpaX17bHxjfGx9e2NvbnN0YW50fXtDb25zdGFudH17VmFsdWV9e0RlZmluaXRpb259Ci0gIFxsaW5laWlpe0NPTlRJTlVFfXtcY29kZXsxMDB9fQotICAgIHtIVFRQLzEuMSwgXHVsaW5re1JGQyAyNjE2LCBTZWN0aW9uIDEwLjEuMX0KLSAgICAgIHtodHRwOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzEwLmh0bWwjc2VjMTAuMS4xfX0KLSAgXGxpbmVpaWl7U1dJVENISU5HX1BST1RPQ09MU317XGNvZGV7MTAxfX0KLSAgICB7SFRUUC8xLjEsIFx1bGlua3tSRkMgMjYxNiwgU2VjdGlvbiAxMC4xLjJ9Ci0gICAgICB7aHR0cDovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMxMC5odG1sI3NlYzEwLjEuMn19Ci0gIFxsaW5laWlpe1BST0NFU1NJTkd9e1xjb2RlezEwMn19Ci0gICAge1dFQkRBViwgXHVsaW5re1JGQyAyNTE4LCBTZWN0aW9uIDEwLjF9Ci0gICAgICB7aHR0cDovL3d3dy53ZWJkYXYub3JnL3NwZWNzL3JmYzI1MTguaHRtbCNTVEFUVVNfMTAyfX0KLQotICBcbGluZWlpaXtPS317XGNvZGV7MjAwfX0KLSAgICB7SFRUUC8xLjEsIFx1bGlua3tSRkMgMjYxNiwgU2VjdGlvbiAxMC4yLjF9Ci0gICAgICB7aHR0cDovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMxMC5odG1sI3NlYzEwLjIuMX19Ci0gIFxsaW5laWlpe0NSRUFURUR9e1xjb2RlezIwMX19Ci0gICAge0hUVFAvMS4xLCBcdWxpbmt7UkZDIDI2MTYsIFNlY3Rpb24gMTAuMi4yfQotICAgICAge2h0dHA6Ly93d3cudzMub3JnL1Byb3RvY29scy9yZmMyNjE2L3JmYzI2MTYtc2VjMTAuaHRtbCNzZWMxMC4yLjJ9fQotICBcbGluZWlpaXtBQ0NFUFRFRH17XGNvZGV7MjAyfX0KLSAgICB7SFRUUC8xLjEsIFx1bGlua3tSRkMgMjYxNiwgU2VjdGlvbiAxMC4yLjN9Ci0gICAgICB7aHR0cDovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMxMC5odG1sI3NlYzEwLjIuM319Ci0gIFxsaW5laWlpe05PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OfXtcY29kZXsyMDN9fQotICAgIHtIVFRQLzEuMSwgXHVsaW5re1JGQyAyNjE2LCBTZWN0aW9uIDEwLjIuNH0KLSAgICAgIHtodHRwOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzEwLmh0bWwjc2VjMTAuMi40fX0KLSAgXGxpbmVpaWl7Tk9fQ09OVEVOVH17XGNvZGV7MjA0fX0KLSAgICB7SFRUUC8xLjEsIFx1bGlua3tSRkMgMjYxNiwgU2VjdGlvbiAxMC4yLjV9Ci0gICAgICB7aHR0cDovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMxMC5odG1sI3NlYzEwLjIuNX19Ci0gIFxsaW5laWlpe1JFU0VUX0NPTlRFTlR9e1xjb2RlezIwNX19Ci0gICAge0hUVFAvMS4xLCBcdWxpbmt7UkZDIDI2MTYsIFNlY3Rpb24gMTAuMi42fQotICAgICAge2h0dHA6Ly93d3cudzMub3JnL1Byb3RvY29scy9yZmMyNjE2L3JmYzI2MTYtc2VjMTAuaHRtbCNzZWMxMC4yLjZ9fQotICBcbGluZWlpaXtQQVJUSUFMX0NPTlRFTlR9e1xjb2RlezIwNn19Ci0gICAge0hUVFAvMS4xLCBcdWxpbmt7UkZDIDI2MTYsIFNlY3Rpb24gMTAuMi43fQotICAgICAge2h0dHA6Ly93d3cudzMub3JnL1Byb3RvY29scy9yZmMyNjE2L3JmYzI2MTYtc2VjMTAuaHRtbCNzZWMxMC4yLjd9fQotICBcbGluZWlpaXtNVUxUSV9TVEFUVVN9e1xjb2RlezIwN319Ci0gICAge1dFQkRBViBcdWxpbmt7UkZDIDI1MTgsIFNlY3Rpb24gMTAuMn0KLSAgICAgIHtodHRwOi8vd3d3LndlYmRhdi5vcmcvc3BlY3MvcmZjMjUxOC5odG1sI1NUQVRVU18yMDd9fQotICBcbGluZWlpaXtJTV9VU0VEfXtcY29kZXsyMjZ9fQotICAgIHtEZWx0YSBlbmNvZGluZyBpbiBIVFRQLCBccmZjezMyMjl9LCBTZWN0aW9uIDEwLjQuMX0KLQotICBcbGluZWlpaXtNVUxUSVBMRV9DSE9JQ0VTfXtcY29kZXszMDB9fQotICAgIHtIVFRQLzEuMSwgXHVsaW5re1JGQyAyNjE2LCBTZWN0aW9uIDEwLjMuMX0KLSAgICAgIHtodHRwOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzEwLmh0bWwjc2VjMTAuMy4xfX0KLSAgXGxpbmVpaWl7TU9WRURfUEVSTUFORU5UTFl9e1xjb2RlezMwMX19Ci0gICAge0hUVFAvMS4xLCBcdWxpbmt7UkZDIDI2MTYsIFNlY3Rpb24gMTAuMy4yfQotICAgICAge2h0dHA6Ly93d3cudzMub3JnL1Byb3RvY29scy9yZmMyNjE2L3JmYzI2MTYtc2VjMTAuaHRtbCNzZWMxMC4zLjJ9fQotICBcbGluZWlpaXtGT1VORH17XGNvZGV7MzAyfX0KLSAgICB7SFRUUC8xLjEsIFx1bGlua3tSRkMgMjYxNiwgU2VjdGlvbiAxMC4zLjN9Ci0gICAgICB7aHR0cDovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMxMC5odG1sI3NlYzEwLjMuM319Ci0gIFxsaW5laWlpe1NFRV9PVEhFUn17XGNvZGV7MzAzfX0KLSAgICB7SFRUUC8xLjEsIFx1bGlua3tSRkMgMjYxNiwgU2VjdGlvbiAxMC4zLjR9Ci0gICAgICB7aHR0cDovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMxMC5odG1sI3NlYzEwLjMuNH19Ci0gIFxsaW5laWlpe05PVF9NT0RJRklFRH17XGNvZGV7MzA0fX0KLSAgICB7SFRUUC8xLjEsIFx1bGlua3tSRkMgMjYxNiwgU2VjdGlvbiAxMC4zLjV9Ci0gICAgICB7aHR0cDovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMxMC5odG1sI3NlYzEwLjMuNX19Ci0gIFxsaW5laWlpe1VTRV9QUk9YWX17XGNvZGV7MzA1fX0KLSAgICB7SFRUUC8xLjEsIFx1bGlua3tSRkMgMjYxNiwgU2VjdGlvbiAxMC4zLjZ9Ci0gICAgICB7aHR0cDovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMxMC5odG1sI3NlYzEwLjMuNn19Ci0gIFxsaW5laWlpe1RFTVBPUkFSWV9SRURJUkVDVH17XGNvZGV7MzA3fX0KLSAgICB7SFRUUC8xLjEsIFx1bGlua3tSRkMgMjYxNiwgU2VjdGlvbiAxMC4zLjh9Ci0gICAgICB7aHR0cDovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMxMC5odG1sI3NlYzEwLjMuOH19Ci0KLSAgXGxpbmVpaWl7QkFEX1JFUVVFU1R9e1xjb2RlezQwMH19Ci0gICAge0hUVFAvMS4xLCBcdWxpbmt7UkZDIDI2MTYsIFNlY3Rpb24gMTAuNC4xfQotICAgICAge2h0dHA6Ly93d3cudzMub3JnL1Byb3RvY29scy9yZmMyNjE2L3JmYzI2MTYtc2VjMTAuaHRtbCNzZWMxMC40LjF9fQotICBcbGluZWlpaXtVTkFVVEhPUklaRUR9e1xjb2RlezQwMX19Ci0gICAge0hUVFAvMS4xLCBcdWxpbmt7UkZDIDI2MTYsIFNlY3Rpb24gMTAuNC4yfQotICAgICAge2h0dHA6Ly93d3cudzMub3JnL1Byb3RvY29scy9yZmMyNjE2L3JmYzI2MTYtc2VjMTAuaHRtbCNzZWMxMC40LjJ9fQotICBcbGluZWlpaXtQQVlNRU5UX1JFUVVJUkVEfXtcY29kZXs0MDJ9fQotICAgIHtIVFRQLzEuMSwgXHVsaW5re1JGQyAyNjE2LCBTZWN0aW9uIDEwLjQuM30KLSAgICAgIHtodHRwOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzEwLmh0bWwjc2VjMTAuNC4zfX0KLSAgXGxpbmVpaWl7Rk9SQklEREVOfXtcY29kZXs0MDN9fQotICAgIHtIVFRQLzEuMSwgXHVsaW5re1JGQyAyNjE2LCBTZWN0aW9uIDEwLjQuNH0KLSAgICAgIHtodHRwOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzEwLmh0bWwjc2VjMTAuNC40fX0KLSAgXGxpbmVpaWl7Tk9UX0ZPVU5EfXtcY29kZXs0MDR9fQotICAgIHtIVFRQLzEuMSwgXHVsaW5re1JGQyAyNjE2LCBTZWN0aW9uIDEwLjQuNX0KLSAgICAgIHtodHRwOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzEwLmh0bWwjc2VjMTAuNC41fX0KLSAgXGxpbmVpaWl7TUVUSE9EX05PVF9BTExPV0VEfXtcY29kZXs0MDV9fQotICAgIHtIVFRQLzEuMSwgXHVsaW5re1JGQyAyNjE2LCBTZWN0aW9uIDEwLjQuNn0KLSAgICAgIHtodHRwOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzEwLmh0bWwjc2VjMTAuNC42fX0KLSAgXGxpbmVpaWl7Tk9UX0FDQ0VQVEFCTEV9e1xjb2RlezQwNn19Ci0gICAge0hUVFAvMS4xLCBcdWxpbmt7UkZDIDI2MTYsIFNlY3Rpb24gMTAuNC43fQotICAgICAge2h0dHA6Ly93d3cudzMub3JnL1Byb3RvY29scy9yZmMyNjE2L3JmYzI2MTYtc2VjMTAuaHRtbCNzZWMxMC40Ljd9fQotICBcbGluZWlpaXtQUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRH0KLSAgICB7XGNvZGV7NDA3fX17SFRUUC8xLjEsIFx1bGlua3tSRkMgMjYxNiwgU2VjdGlvbiAxMC40Ljh9Ci0gICAgICB7aHR0cDovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMxMC5odG1sI3NlYzEwLjQuOH19Ci0gIFxsaW5laWlpe1JFUVVFU1RfVElNRU9VVH17XGNvZGV7NDA4fX0KLSAgICB7SFRUUC8xLjEsIFx1bGlua3tSRkMgMjYxNiwgU2VjdGlvbiAxMC40Ljl9Ci0gICAgICB7aHR0cDovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMxMC5odG1sI3NlYzEwLjQuOX19Ci0gIFxsaW5laWlpe0NPTkZMSUNUfXtcY29kZXs0MDl9fQotICAgIHtIVFRQLzEuMSwgXHVsaW5re1JGQyAyNjE2LCBTZWN0aW9uIDEwLjQuMTB9Ci0gICAgICB7aHR0cDovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMxMC5odG1sI3NlYzEwLjQuMTB9fQotICBcbGluZWlpaXtHT05FfXtcY29kZXs0MTB9fQotICAgIHtIVFRQLzEuMSwgXHVsaW5re1JGQyAyNjE2LCBTZWN0aW9uIDEwLjQuMTF9Ci0gICAgICB7aHR0cDovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMxMC5odG1sI3NlYzEwLjQuMTF9fQotICBcbGluZWlpaXtMRU5HVEhfUkVRVUlSRUR9e1xjb2RlezQxMX19Ci0gICAge0hUVFAvMS4xLCBcdWxpbmt7UkZDIDI2MTYsIFNlY3Rpb24gMTAuNC4xMn0KLSAgICAgIHtodHRwOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzEwLmh0bWwjc2VjMTAuNC4xMn19Ci0gIFxsaW5laWlpe1BSRUNPTkRJVElPTl9GQUlMRUR9e1xjb2RlezQxMn19Ci0gICAge0hUVFAvMS4xLCBcdWxpbmt7UkZDIDI2MTYsIFNlY3Rpb24gMTAuNC4xM30KLSAgICAgIHtodHRwOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzEwLmh0bWwjc2VjMTAuNC4xM319Ci0gIFxsaW5laWlpe1JFUVVFU1RfRU5USVRZX1RPT19MQVJHRX0KLSAgICB7XGNvZGV7NDEzfX17SFRUUC8xLjEsIFx1bGlua3tSRkMgMjYxNiwgU2VjdGlvbiAxMC40LjE0fQotICAgICAge2h0dHA6Ly93d3cudzMub3JnL1Byb3RvY29scy9yZmMyNjE2L3JmYzI2MTYtc2VjMTAuaHRtbCNzZWMxMC40LjE0fX0KLSAgXGxpbmVpaWl7UkVRVUVTVF9VUklfVE9PX0xPTkd9e1xjb2RlezQxNH19Ci0gICAge0hUVFAvMS4xLCBcdWxpbmt7UkZDIDI2MTYsIFNlY3Rpb24gMTAuNC4xNX0KLSAgICAgIHtodHRwOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzEwLmh0bWwjc2VjMTAuNC4xNX19Ci0gIFxsaW5laWlpe1VOU1VQUE9SVEVEX01FRElBX1RZUEV9e1xjb2RlezQxNX19Ci0gICAge0hUVFAvMS4xLCBcdWxpbmt7UkZDIDI2MTYsIFNlY3Rpb24gMTAuNC4xNn0KLSAgICAgIHtodHRwOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzEwLmh0bWwjc2VjMTAuNC4xNn19Ci0gIFxsaW5laWlpe1JFUVVFU1RFRF9SQU5HRV9OT1RfU0FUSVNGSUFCTEV9e1xjb2RlezQxNn19Ci0gICAge0hUVFAvMS4xLCBcdWxpbmt7UkZDIDI2MTYsIFNlY3Rpb24gMTAuNC4xN30KLSAgICAgIHtodHRwOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzEwLmh0bWwjc2VjMTAuNC4xN319Ci0gIFxsaW5laWlpe0VYUEVDVEFUSU9OX0ZBSUxFRH17XGNvZGV7NDE3fX0KLSAgICB7SFRUUC8xLjEsIFx1bGlua3tSRkMgMjYxNiwgU2VjdGlvbiAxMC40LjE4fQotICAgICAge2h0dHA6Ly93d3cudzMub3JnL1Byb3RvY29scy9yZmMyNjE2L3JmYzI2MTYtc2VjMTAuaHRtbCNzZWMxMC40LjE4fX0KLSAgXGxpbmVpaWl7VU5QUk9DRVNTQUJMRV9FTlRJVFl9e1xjb2RlezQyMn19Ci0gICAge1dFQkRBViwgXHVsaW5re1JGQyAyNTE4LCBTZWN0aW9uIDEwLjN9Ci0gICAgICB7aHR0cDovL3d3dy53ZWJkYXYub3JnL3NwZWNzL3JmYzI1MTguaHRtbCNTVEFUVVNfNDIyfX0KLSAgXGxpbmVpaWl7TE9DS0VEfXtcY29kZXs0MjN9fQotICAgIHtXRUJEQVYgXHVsaW5re1JGQyAyNTE4LCBTZWN0aW9uIDEwLjR9Ci0gICAgICB7aHR0cDovL3d3dy53ZWJkYXYub3JnL3NwZWNzL3JmYzI1MTguaHRtbCNTVEFUVVNfNDIzfX0KLSAgXGxpbmVpaWl7RkFJTEVEX0RFUEVOREVOQ1l9e1xjb2RlezQyNH19Ci0gICAge1dFQkRBViwgXHVsaW5re1JGQyAyNTE4LCBTZWN0aW9uIDEwLjV9Ci0gICAgICB7aHR0cDovL3d3dy53ZWJkYXYub3JnL3NwZWNzL3JmYzI1MTguaHRtbCNTVEFUVVNfNDI0fX0KLSAgXGxpbmVpaWl7VVBHUkFERV9SRVFVSVJFRH17XGNvZGV7NDI2fX0KLSAgICB7SFRUUCBVcGdyYWRlIHRvIFRMUywgXHJmY3syODE3fSwgU2VjdGlvbiA2fQotCi0gIFxsaW5laWlpe0lOVEVSTkFMX1NFUlZFUl9FUlJPUn17XGNvZGV7NTAwfX0KLSAgICB7SFRUUC8xLjEsIFx1bGlua3tSRkMgMjYxNiwgU2VjdGlvbiAxMC41LjF9Ci0gICAgICB7aHR0cDovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMxMC5odG1sI3NlYzEwLjUuMX19Ci0gIFxsaW5laWlpe05PVF9JTVBMRU1FTlRFRH17XGNvZGV7NTAxfX0KLSAgICB7SFRUUC8xLjEsIFx1bGlua3tSRkMgMjYxNiwgU2VjdGlvbiAxMC41LjJ9Ci0gICAgICB7aHR0cDovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMxMC5odG1sI3NlYzEwLjUuMn19Ci0gIFxsaW5laWlpe0JBRF9HQVRFV0FZfXtcY29kZXs1MDJ9fQotICAgIHtIVFRQLzEuMSBcdWxpbmt7UkZDIDI2MTYsIFNlY3Rpb24gMTAuNS4zfQotICAgICAge2h0dHA6Ly93d3cudzMub3JnL1Byb3RvY29scy9yZmMyNjE2L3JmYzI2MTYtc2VjMTAuaHRtbCNzZWMxMC41LjN9fQotICBcbGluZWlpaXtTRVJWSUNFX1VOQVZBSUxBQkxFfXtcY29kZXs1MDN9fQotICAgIHtIVFRQLzEuMSwgXHVsaW5re1JGQyAyNjE2LCBTZWN0aW9uIDEwLjUuNH0KLSAgICAgIHtodHRwOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzEwLmh0bWwjc2VjMTAuNS40fX0KLSAgXGxpbmVpaWl7R0FURVdBWV9USU1FT1VUfXtcY29kZXs1MDR9fQotICAgIHtIVFRQLzEuMSBcdWxpbmt7UkZDIDI2MTYsIFNlY3Rpb24gMTAuNS41fQotICAgICAge2h0dHA6Ly93d3cudzMub3JnL1Byb3RvY29scy9yZmMyNjE2L3JmYzI2MTYtc2VjMTAuaHRtbCNzZWMxMC41LjV9fQotICBcbGluZWlpaXtIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRH17XGNvZGV7NTA1fX0KLSAgICB7SFRUUC8xLjEsIFx1bGlua3tSRkMgMjYxNiwgU2VjdGlvbiAxMC41LjZ9Ci0gICAgICB7aHR0cDovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMxMC5odG1sI3NlYzEwLjUuNn19Ci0gIFxsaW5laWlpe0lOU1VGRklDSUVOVF9TVE9SQUdFfXtcY29kZXs1MDd9fQotICAgIHtXRUJEQVYsIFx1bGlua3tSRkMgMjUxOCwgU2VjdGlvbiAxMC42fQotICAgICAge2h0dHA6Ly93d3cud2ViZGF2Lm9yZy9zcGVjcy9yZmMyNTE4Lmh0bWwjU1RBVFVTXzUwN319Ci0gIFxsaW5laWlpe05PVF9FWFRFTkRFRH17XGNvZGV7NTEwfX0KLSAgICB7QW4gSFRUUCBFeHRlbnNpb24gRnJhbWV3b3JrLCBccmZjezI3NzR9LCBTZWN0aW9uIDd9Ci1cZW5ke3RhYmxlaWlpfQotCi1cYmVnaW57ZGF0YWRlc2N9e3Jlc3BvbnNlc30KLVRoaXMgZGljdGlvbmFyeSBtYXBzIHRoZSBIVFRQIDEuMSBzdGF0dXMgY29kZXMgdG8gdGhlIFczQyBuYW1lcy4KLQotRXhhbXBsZTogXGNvZGV7aHR0cGxpYi5yZXNwb25zZXNbaHR0cGxpYi5OT1RfRk9VTkRdfSBpcyBcY29kZXsnTm90IEZvdW5kJ30uCi1cdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7ZGF0YWRlc2N9Ci0KLQotXHN1YnNlY3Rpb257SFRUUENvbm5lY3Rpb24gT2JqZWN0cyBcbGFiZWx7aHR0cGNvbm5lY3Rpb24tb2JqZWN0c319Ci0KLVxjbGFzc3tIVFRQQ29ubmVjdGlvbn0gaW5zdGFuY2VzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotCi1cYmVnaW57bWV0aG9kZGVzY31bSFRUUENvbm5lY3Rpb25de3JlcXVlc3R9e21ldGhvZCwgdXJsXG9wdGlvbmFseywgYm9keVxvcHRpb25hbHssIGhlYWRlcnN9fX0KLVRoaXMgd2lsbCBzZW5kIGEgcmVxdWVzdCB0byB0aGUgc2VydmVyIHVzaW5nIHRoZSBIVFRQIHJlcXVlc3QgbWV0aG9kCi1cdmFye21ldGhvZH0gYW5kIHRoZSBzZWxlY3RvciBcdmFye3VybH0uICBJZiB0aGUgXHZhcntib2R5fSBhcmd1bWVudCBpcwotcHJlc2VudCwgaXQgc2hvdWxkIGJlIGEgc3RyaW5nIG9mIGRhdGEgdG8gc2VuZCBhZnRlciB0aGUgaGVhZGVycyBhcmUgZmluaXNoZWQuCi1BbHRlcm5hdGl2ZWx5LCBpdCBtYXkgYmUgYW4gb3BlbiBmaWxlIG9iamVjdCwgaW4gd2hpY2ggY2FzZSB0aGUKLWNvbnRlbnRzIG9mIHRoZSBmaWxlIGlzIHNlbnQ7IHRoaXMgZmlsZSBvYmplY3Qgc2hvdWxkIHN1cHBvcnQKLVxjb2Rle2ZpbGVubygpfSBhbmQgXGNvZGV7cmVhZCgpfSBtZXRob2RzLgotVGhlIGhlYWRlciBDb250ZW50LUxlbmd0aCBpcyBhdXRvbWF0aWNhbGx5IHNldCB0byB0aGUgY29ycmVjdCB2YWx1ZS4KLVRoZSBcdmFye2hlYWRlcnN9IGFyZ3VtZW50IHNob3VsZCBiZSBhIG1hcHBpbmcgb2YgZXh0cmEgSFRUUCBoZWFkZXJzIHRvIHNlbmQKLXdpdGggdGhlIHJlcXVlc3QuCi0KLVx2ZXJzaW9uY2hhbmdlZFtcdmFye2JvZHl9IGNhbiBiZSBhIGZpbGUgb2JqZWN0XXsyLjZ9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtIVFRQQ29ubmVjdGlvbl17Z2V0cmVzcG9uc2V9e30KLVNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgYSByZXF1ZXN0IGlzIHNlbnQgdG8gZ2V0IHRoZSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIuCi1SZXR1cm5zIGFuIFxjbGFzc3tIVFRQUmVzcG9uc2V9IGluc3RhbmNlLgotXG5vdGV7Tm90ZSB0aGF0IHlvdSBtdXN0IGhhdmUgcmVhZCB0aGUgd2hvbGUgcmVzcG9uc2UgYmVmb3JlIHlvdSBjYW4gc2VuZCBhIG5ldwotcmVxdWVzdCB0byB0aGUgc2VydmVyLn0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0hUVFBDb25uZWN0aW9uXXtzZXRfZGVidWdsZXZlbH17bGV2ZWx9Ci1TZXQgdGhlIGRlYnVnZ2luZyBsZXZlbCAodGhlIGFtb3VudCBvZiBkZWJ1Z2dpbmcgb3V0cHV0IHByaW50ZWQpLgotVGhlIGRlZmF1bHQgZGVidWcgbGV2ZWwgaXMgXGNvZGV7MH0sIG1lYW5pbmcgbm8gZGVidWdnaW5nIG91dHB1dCBpcwotcHJpbnRlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0hUVFBDb25uZWN0aW9uXXtjb25uZWN0fXt9Ci1Db25uZWN0IHRvIHRoZSBzZXJ2ZXIgc3BlY2lmaWVkIHdoZW4gdGhlIG9iamVjdCB3YXMgY3JlYXRlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0hUVFBDb25uZWN0aW9uXXtjbG9zZX17fQotQ2xvc2UgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlci4KLVxlbmR7bWV0aG9kZGVzY30KLQotQXMgYW4gYWx0ZXJuYXRpdmUgdG8gdXNpbmcgdGhlIFxtZXRob2R7cmVxdWVzdCgpfSBtZXRob2QgZGVzY3JpYmVkIGFib3ZlLAoteW91IGNhbiBhbHNvIHNlbmQgeW91ciByZXF1ZXN0IHN0ZXAgYnkgc3RlcCwgYnkgdXNpbmcgdGhlIGZvdXIgZnVuY3Rpb25zCi1iZWxvdy4KLQotXGJlZ2lue21ldGhvZGRlc2N9W0hUVFBDb25uZWN0aW9uXXtwdXRyZXF1ZXN0fXtyZXF1ZXN0LCBzZWxlY3RvclxvcHRpb25hbHssCi1za2lwXF9ob3N0XG9wdGlvbmFseywgc2tpcF9hY2NlcHRfZW5jb2Rpbmd9fX0KLVRoaXMgc2hvdWxkIGJlIHRoZSBmaXJzdCBjYWxsIGFmdGVyIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIgaGFzCi1iZWVuIG1hZGUuICBJdCBzZW5kcyBhIGxpbmUgdG8gdGhlIHNlcnZlciBjb25zaXN0aW5nIG9mIHRoZQotXHZhcntyZXF1ZXN0fSBzdHJpbmcsIHRoZSBcdmFye3NlbGVjdG9yfSBzdHJpbmcsIGFuZCB0aGUgSFRUUCB2ZXJzaW9uCi0oXGNvZGV7SFRUUC8xLjF9KS4gIFRvIGRpc2FibGUgYXV0b21hdGljIHNlbmRpbmcgb2YgXGNvZGV7SG9zdDp9IG9yCi1cY29kZXtBY2NlcHQtRW5jb2Rpbmc6fSBoZWFkZXJzIChmb3IgZXhhbXBsZSB0byBhY2NlcHQgYWRkaXRpb25hbAotY29udGVudCBlbmNvZGluZ3MpLCBzcGVjaWZ5IFx2YXJ7c2tpcF9ob3N0fSBvciBcdmFye3NraXBfYWNjZXB0X2VuY29kaW5nfQotd2l0aCBub24tRmFsc2UgdmFsdWVzLgotXHZlcnNpb25jaGFuZ2VkW1x2YXJ7c2tpcF9hY2NlcHRfZW5jb2Rpbmd9IGFyZ3VtZW50IGFkZGVkXXsyLjR9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtIVFRQQ29ubmVjdGlvbl17cHV0aGVhZGVyfXtoZWFkZXIsIGFyZ3VtZW50XG9wdGlvbmFseywgLi4ufX0KLVNlbmQgYW4gXHJmY3s4MjJ9LXN0eWxlIGhlYWRlciB0byB0aGUgc2VydmVyLiAgSXQgc2VuZHMgYSBsaW5lIHRvIHRoZQotc2VydmVyIGNvbnNpc3Rpbmcgb2YgdGhlIGhlYWRlciwgYSBjb2xvbiBhbmQgYSBzcGFjZSwgYW5kIHRoZSBmaXJzdAotYXJndW1lbnQuICBJZiBtb3JlIGFyZ3VtZW50cyBhcmUgZ2l2ZW4sIGNvbnRpbnVhdGlvbiBsaW5lcyBhcmUgc2VudCwKLWVhY2ggY29uc2lzdGluZyBvZiBhIHRhYiBhbmQgYW4gYXJndW1lbnQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtIVFRQQ29ubmVjdGlvbl17ZW5kaGVhZGVyc317fQotU2VuZCBhIGJsYW5rIGxpbmUgdG8gdGhlIHNlcnZlciwgc2lnbmFsbGluZyB0aGUgZW5kIG9mIHRoZSBoZWFkZXJzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSFRUUENvbm5lY3Rpb25de3NlbmR9e2RhdGF9Ci1TZW5kIGRhdGEgdG8gdGhlIHNlcnZlci4gIFRoaXMgc2hvdWxkIGJlIHVzZWQgZGlyZWN0bHkgb25seSBhZnRlciB0aGUKLVxtZXRob2R7ZW5kaGVhZGVycygpfSBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIGFuZCBiZWZvcmUKLVxtZXRob2R7Z2V0cmVzcG9uc2UoKX0gaXMgY2FsbGVkLgotXGVuZHttZXRob2RkZXNjfQotCi1cc3Vic2VjdGlvbntIVFRQUmVzcG9uc2UgT2JqZWN0cyBcbGFiZWx7aHR0cHJlc3BvbnNlLW9iamVjdHN9fQotCi1cY2xhc3N7SFRUUFJlc3BvbnNlfSBpbnN0YW5jZXMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgYW5kIGF0dHJpYnV0ZXM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtIVFRQUmVzcG9uc2Vde3JlYWR9e1xvcHRpb25hbHthbXR9fQotUmVhZHMgYW5kIHJldHVybnMgdGhlIHJlc3BvbnNlIGJvZHksIG9yIHVwIHRvIHRoZSBuZXh0IFx2YXJ7YW10fSBieXRlcy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0hUVFBSZXNwb25zZV17Z2V0aGVhZGVyfXtuYW1lXG9wdGlvbmFseywgZGVmYXVsdH19Ci1HZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBoZWFkZXIgXHZhcntuYW1lfSwgb3IgXHZhcntkZWZhdWx0fSBpZiB0aGVyZSBpcyBubwotbWF0Y2hpbmcgaGVhZGVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSFRUUFJlc3BvbnNlXXtnZXRoZWFkZXJzfXt9Ci1SZXR1cm4gYSBsaXN0IG9mIChoZWFkZXIsIHZhbHVlKSB0dXBsZXMuIFx2ZXJzaW9uYWRkZWR7Mi40fQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bSFRUUFJlc3BvbnNlXXttc2d9Ci0gIEEgXGNsYXNze21pbWV0b29scy5NZXNzYWdlfSBpbnN0YW5jZSBjb250YWluaW5nIHRoZSByZXNwb25zZSBoZWFkZXJzLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bSFRUUFJlc3BvbnNlXXt2ZXJzaW9ufQotICBIVFRQIHByb3RvY29sIHZlcnNpb24gdXNlZCBieSBzZXJ2ZXIuICAxMCBmb3IgSFRUUC8xLjAsIDExIGZvciBIVFRQLzEuMS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W0hUVFBSZXNwb25zZV17c3RhdHVzfQotICBTdGF0dXMgY29kZSByZXR1cm5lZCBieSBzZXJ2ZXIuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtIVFRQUmVzcG9uc2Vde3JlYXNvbn0KLSAgUmVhc29uIHBocmFzZSByZXR1cm5lZCBieSBzZXJ2ZXIuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLQotXHN1YnNlY3Rpb257RXhhbXBsZXMgXGxhYmVse2h0dHBsaWItZXhhbXBsZXN9fQotCi1IZXJlIGlzIGFuIGV4YW1wbGUgc2Vzc2lvbiB0aGF0IHVzZXMgdGhlIFxzYW1we0dFVH0gbWV0aG9kOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gaW1wb3J0IGh0dHBsaWIKLT4+PiBjb25uID0gaHR0cGxpYi5IVFRQQ29ubmVjdGlvbigid3d3LnB5dGhvbi5vcmciKQotPj4+IGNvbm4ucmVxdWVzdCgiR0VUIiwgIi9pbmRleC5odG1sIikKLT4+PiByMSA9IGNvbm4uZ2V0cmVzcG9uc2UoKQotPj4+IHByaW50IHIxLnN0YXR1cywgcjEucmVhc29uCi0yMDAgT0sKLT4+PiBkYXRhMSA9IHIxLnJlYWQoKQotPj4+IGNvbm4ucmVxdWVzdCgiR0VUIiwgIi9wYXJyb3Quc3BhbSIpCi0+Pj4gcjIgPSBjb25uLmdldHJlc3BvbnNlKCkKLT4+PiBwcmludCByMi5zdGF0dXMsIHIyLnJlYXNvbgotNDA0IE5vdCBGb3VuZAotPj4+IGRhdGEyID0gcjIucmVhZCgpCi0+Pj4gY29ubi5jbG9zZSgpCi1cZW5ke3ZlcmJhdGltfQotCi1IZXJlIGlzIGFuIGV4YW1wbGUgc2Vzc2lvbiB0aGF0IHNob3dzIGhvdyB0byBcc2FtcHtQT1NUfSByZXF1ZXN0czoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGltcG9ydCBodHRwbGliLCB1cmxsaWIKLT4+PiBwYXJhbXMgPSB1cmxsaWIudXJsZW5jb2RlKHsnc3BhbSc6IDEsICdlZ2dzJzogMiwgJ2JhY29uJzogMH0pCi0+Pj4gaGVhZGVycyA9IHsiQ29udGVudC10eXBlIjogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsCi0uLi4gICAgICAgICAgICAiQWNjZXB0IjogInRleHQvcGxhaW4ifQotPj4+IGNvbm4gPSBodHRwbGliLkhUVFBDb25uZWN0aW9uKCJtdXNpLWNhbC5tb2phbS5jb206ODAiKQotPj4+IGNvbm4ucmVxdWVzdCgiUE9TVCIsICIvY2dpLWJpbi9xdWVyeSIsIHBhcmFtcywgaGVhZGVycykKLT4+PiByZXNwb25zZSA9IGNvbm4uZ2V0cmVzcG9uc2UoKQotPj4+IHByaW50IHJlc3BvbnNlLnN0YXR1cywgcmVzcG9uc2UucmVhc29uCi0yMDAgT0sKLT4+PiBkYXRhID0gcmVzcG9uc2UucmVhZCgpCi0+Pj4gY29ubi5jbG9zZSgpCi1cZW5ke3ZlcmJhdGltfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJpbWFwbGliLnRleCBiL0RvYy9saWIvbGliaW1hcGxpYi50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNGNhYWEuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJpbWFwbGliLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDUwNyArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle2ltYXBsaWJ9IC0tLQotICAgICAgICAgSU1BUDQgcHJvdG9jb2wgY2xpZW50fQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17aW1hcGxpYn0KLVxtb2R1bGVzeW5vcHNpc3tJTUFQNCBwcm90b2NvbCBjbGllbnQgKHJlcXVpcmVzIHNvY2tldHMpLn0KLVxtb2R1bGVhdXRob3J7UGllcnMgTGF1ZGVyfXtwaWVyc0Bjb21tdW5pdHlzb2x1dGlvbnMuY29tLmF1fQotXHNlY3Rpb25hdXRob3J7UGllcnMgTGF1ZGVyfXtwaWVyc0Bjb21tdW5pdHlzb2x1dGlvbnMuY29tLmF1fQotCi0lIEJhc2VkIG9uIEhUTUwgZG9jdW1lbnRhdGlvbiBieSBQaWVycyBMYXVkZXIKLSUgPHBpZXJzQGNvbW11bml0eXNvbHV0aW9ucy5jb20uYXU+OwotJSBjb252ZXJ0ZWQgYnkgRnJlZCBMLiBEcmFrZSwgSnIuIDxmZHJha2VAYWNtLm9yZz4uCi0lIFJldmlzZWQgYnkgRVNSLCBKYW51YXJ5IDIwMDAuCi0lIENoYW5nZXMgZm9yIElNQVA0X1NTTCBieSBUaW5vIExhbmdlIDxUaW5vLkxhbmdlQGlzZy5kZT4sIE1hcmNoIDIwMDIgCi0lIENoYW5nZXMgZm9yIElNQVA0X3N0cmVhbSBieSBQaWVycyBMYXVkZXIKLSUgPHBpZXJzQGNvbW11bml0eXNvbHV0aW9ucy5jb20uYXU+LCBOb3ZlbWJlciAyMDAyCi0KLVxpbmRleGlpe0lNQVA0fXtwcm90b2NvbH0KLVxpbmRleGlpe0lNQVA0X1NTTH17cHJvdG9jb2x9Ci1caW5kZXhpaXtJTUFQNF9zdHJlYW19e3Byb3RvY29sfQotCi1UaGlzIG1vZHVsZSBkZWZpbmVzIHRocmVlIGNsYXNzZXMsIFxjbGFzc3tJTUFQNH0sIFxjbGFzc3tJTUFQNF9TU0x9Ci1hbmQgXGNsYXNze0lNQVA0X3N0cmVhbX0sIHdoaWNoIGVuY2Fwc3VsYXRlIGEKLWNvbm5lY3Rpb24gdG8gYW4gSU1BUDQgc2VydmVyIGFuZCBpbXBsZW1lbnQgYSBsYXJnZSBzdWJzZXQgb2YgdGhlCi1JTUFQNHJldjEgY2xpZW50IHByb3RvY29sIGFzIGRlZmluZWQgaW4gXHJmY3syMDYwfS4gSXQgaXMgYmFja3dhcmQKLWNvbXBhdGlibGUgd2l0aCBJTUFQNCAoXHJmY3sxNzMwfSkgc2VydmVycywgYnV0IG5vdGUgdGhhdCB0aGUKLVxzYW1we1NUQVRVU30gY29tbWFuZCBpcyBub3Qgc3VwcG9ydGVkIGluIElNQVA0LgotCi1UaHJlZSBjbGFzc2VzIGFyZSBwcm92aWRlZCBieSB0aGUgXG1vZHVsZXtpbWFwbGlifSBtb2R1bGUsCi1cY2xhc3N7SU1BUDR9IGlzIHRoZSBiYXNlIGNsYXNzOgotCi1cYmVnaW57Y2xhc3NkZXNjfXtJTUFQNH17XG9wdGlvbmFse2hvc3Rcb3B0aW9uYWx7LCBwb3J0fX19Ci1UaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIGFjdHVhbCBJTUFQNCBwcm90b2NvbC4gIFRoZSBjb25uZWN0aW9uIGlzCi1jcmVhdGVkIGFuZCBwcm90b2NvbCB2ZXJzaW9uIChJTUFQNCBvciBJTUFQNHJldjEpIGlzIGRldGVybWluZWQgd2hlbgotdGhlIGluc3RhbmNlIGlzIGluaXRpYWxpemVkLgotSWYgXHZhcntob3N0fSBpcyBub3Qgc3BlY2lmaWVkLCBcY29kZXsnJ30gKHRoZSBsb2NhbCBob3N0KSBpcyB1c2VkLgotSWYgXHZhcntwb3J0fSBpcyBvbWl0dGVkLCB0aGUgc3RhbmRhcmQgSU1BUDQgcG9ydCAoMTQzKSBpcyB1c2VkLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVRocmVlIGV4Y2VwdGlvbnMgYXJlIGRlZmluZWQgYXMgYXR0cmlidXRlcyBvZiB0aGUgXGNsYXNze0lNQVA0fSBjbGFzczoKLQotXGJlZ2lue2V4Y2Rlc2N9e0lNQVA0LmVycm9yfQotRXhjZXB0aW9uIHJhaXNlZCBvbiBhbnkgZXJyb3JzLiAgVGhlIHJlYXNvbiBmb3IgdGhlIGV4Y2VwdGlvbiBpcwotcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvciBhcyBhIHN0cmluZy4KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e0lNQVA0LmFib3J0fQotSU1BUDQgc2VydmVyIGVycm9ycyBjYXVzZSB0aGlzIGV4Y2VwdGlvbiB0byBiZSByYWlzZWQuICBUaGlzIGlzIGEKLXN1Yi1jbGFzcyBvZiBcZXhjZXB0aW9ue0lNQVA0LmVycm9yfS4gIE5vdGUgdGhhdCBjbG9zaW5nIHRoZSBpbnN0YW5jZQotYW5kIGluc3RhbnRpYXRpbmcgYSBuZXcgb25lIHdpbGwgdXN1YWxseSBhbGxvdyByZWNvdmVyeSBmcm9tIHRoaXMKLWV4Y2VwdGlvbi4KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e0lNQVA0LnJlYWRvbmx5fQotVGhpcyBleGNlcHRpb24gaXMgcmFpc2VkIHdoZW4gYSB3cml0YWJsZSBtYWlsYm94IGhhcyBpdHMgc3RhdHVzCi1jaGFuZ2VkIGJ5IHRoZSBzZXJ2ZXIuICBUaGlzIGlzIGEgc3ViLWNsYXNzIG9mCi1cZXhjZXB0aW9ue0lNQVA0LmVycm9yfS4gIFNvbWUgb3RoZXIgY2xpZW50IG5vdyBoYXMgd3JpdGUgcGVybWlzc2lvbiwKLWFuZCB0aGUgbWFpbGJveCB3aWxsIG5lZWQgdG8gYmUgcmUtb3BlbmVkIHRvIHJlLW9idGFpbiB3cml0ZQotcGVybWlzc2lvbi4KLVxlbmR7ZXhjZGVzY30KLQotVGhlcmUncyBhbHNvIGEgc3ViY2xhc3MgZm9yIHNlY3VyZSBjb25uZWN0aW9uczoKLQotXGJlZ2lue2NsYXNzZGVzY317SU1BUDRfU1NMfXtcb3B0aW9uYWx7aG9zdFxvcHRpb25hbHssIHBvcnRcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlmaWxlXG9wdGlvbmFseywgY2VydGZpbGV9fX19fQotVGhpcyBpcyBhIHN1YmNsYXNzIGRlcml2ZWQgZnJvbSBcY2xhc3N7SU1BUDR9IHRoYXQgY29ubmVjdHMgb3ZlciBhbgotU1NMIGVuY3J5cHRlZCBzb2NrZXQgKHRvIHVzZSB0aGlzIGNsYXNzIHlvdSBuZWVkIGEgc29ja2V0IG1vZHVsZSB0aGF0Ci13YXMgY29tcGlsZWQgd2l0aCBTU0wgc3VwcG9ydCkuICBJZiBcdmFye2hvc3R9IGlzIG5vdCBzcGVjaWZpZWQsCi1cY29kZXsnJ30gKHRoZSBsb2NhbCBob3N0KSBpcyB1c2VkLiAgSWYgXHZhcntwb3J0fSBpcyBvbWl0dGVkLCB0aGUKLXN0YW5kYXJkIElNQVA0LW92ZXItU1NMIHBvcnQgKDk5MykgaXMgdXNlZC4gIFx2YXJ7a2V5ZmlsZX0gYW5kCi1cdmFye2NlcnRmaWxlfSBhcmUgYWxzbyBvcHRpb25hbCAtIHRoZXkgY2FuIGNvbnRhaW4gYSBQRU0gZm9ybWF0dGVkCi1wcml2YXRlIGtleSBhbmQgY2VydGlmaWNhdGUgY2hhaW4gZmlsZSBmb3IgdGhlIFNTTCBjb25uZWN0aW9uLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVRoZSBzZWNvbmQgc3ViY2xhc3MgYWxsb3dzIGZvciBjb25uZWN0aW9ucyBjcmVhdGVkIGJ5IGEgY2hpbGQgcHJvY2VzczoKLQotXGJlZ2lue2NsYXNzZGVzY317SU1BUDRfc3RyZWFtfXtjb21tYW5kfQotVGhpcyBpcyBhIHN1YmNsYXNzIGRlcml2ZWQgZnJvbSBcY2xhc3N7SU1BUDR9IHRoYXQgY29ubmVjdHMKLXRvIHRoZSBcY29kZXtzdGRpbi9zdGRvdXR9IGZpbGUgZGVzY3JpcHRvcnMgY3JlYXRlZCBieSBwYXNzaW5nCi1cdmFye2NvbW1hbmR9IHRvIFxjb2Rle29zLnBvcGVuMigpfS4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVRoZSBmb2xsb3dpbmcgdXRpbGl0eSBmdW5jdGlvbnMgYXJlIGRlZmluZWQ6Ci0KLVxiZWdpbntmdW5jZGVzY317SW50ZXJuYWxkYXRlMnR1cGxlfXtkYXRlc3RyfQotICBDb252ZXJ0cyBhbiBJTUFQNCBJTlRFUk5BTERBVEUgc3RyaW5nIHRvIENvb3JkaW5hdGVkIFVuaXZlcnNhbAotICBUaW1lLiBSZXR1cm5zIGEgXHJlZm1vZHVsZXt0aW1lfSBtb2R1bGUgdHVwbGUuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e0ludDJBUH17bnVtfQotICBDb252ZXJ0cyBhbiBpbnRlZ2VyIGludG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gdXNpbmcgY2hhcmFjdGVycwotICBmcm9tIHRoZSBzZXQgW1xjb2Rle0F9IC4uIFxjb2Rle1B9XS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317UGFyc2VGbGFnc317ZmxhZ3N0cn0KLSAgQ29udmVydHMgYW4gSU1BUDQgXHNhbXB7RkxBR1N9IHJlc3BvbnNlIHRvIGEgdHVwbGUgb2YgaW5kaXZpZHVhbAotICBmbGFncy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317VGltZTJJbnRlcm5hbGRhdGV9e2RhdGVfdGltZX0KLSAgQ29udmVydHMgYSBccmVmbW9kdWxle3RpbWV9IG1vZHVsZSB0dXBsZSB0byBhbiBJTUFQNAotICBcc2FtcHtJTlRFUk5BTERBVEV9IHJlcHJlc2VudGF0aW9uLiAgUmV0dXJucyBhIHN0cmluZyBpbiB0aGUgZm9ybToKLSAgXGNvZGV7IkRELU1tbS1ZWVlZIEhIOk1NOlNTICtISE1NIn0gKGluY2x1ZGluZyBkb3VibGUtcXVvdGVzKS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotTm90ZSB0aGF0IElNQVA0IG1lc3NhZ2UgbnVtYmVycyBjaGFuZ2UgYXMgdGhlIG1haWxib3ggY2hhbmdlczsgaW4KLXBhcnRpY3VsYXIsIGFmdGVyIGFuIFxzYW1we0VYUFVOR0V9IGNvbW1hbmQgcGVyZm9ybXMgZGVsZXRpb25zIHRoZQotcmVtYWluaW5nIG1lc3NhZ2VzIGFyZSByZW51bWJlcmVkLiBTbyBpdCBpcyBoaWdobHkgYWR2aXNhYmxlIHRvIHVzZQotVUlEcyBpbnN0ZWFkLCB3aXRoIHRoZSBVSUQgY29tbWFuZC4KLQotQXQgdGhlIGVuZCBvZiB0aGUgbW9kdWxlLCB0aGVyZSBpcyBhIHRlc3Qgc2VjdGlvbiB0aGF0IGNvbnRhaW5zIGEgbW9yZQotZXh0ZW5zaXZlIGV4YW1wbGUgb2YgdXNhZ2UuCi0KLVxiZWdpbntzZWVhbHNvfQotICBcc2VldGV4dHtEb2N1bWVudHMgZGVzY3JpYmluZyB0aGUgcHJvdG9jb2wsIGFuZCBzb3VyY2VzIGFuZCBiaW5hcmllcyAKLSAgICAgICAgICAgZm9yIHNlcnZlcnMgaW1wbGVtZW50aW5nIGl0LCBjYW4gYWxsIGJlIGZvdW5kIGF0IHRoZQotICAgICAgICAgICBVbml2ZXJzaXR5IG9mIFdhc2hpbmd0b24ncyBcZW1waHtJTUFQIEluZm9ybWF0aW9uIENlbnRlcn0KLSAgICAgICAgICAgKFx1cmx7aHR0cDovL3d3dy5jYWMud2FzaGluZ3Rvbi5lZHUvaW1hcC99KS59Ci1cZW5ke3NlZWFsc299Ci0KLQotXHN1YnNlY3Rpb257SU1BUDQgT2JqZWN0cyBcbGFiZWx7aW1hcDQtb2JqZWN0c319Ci0KLUFsbCBJTUFQNHJldjEgY29tbWFuZHMgYXJlIHJlcHJlc2VudGVkIGJ5IG1ldGhvZHMgb2YgdGhlIHNhbWUgbmFtZSwKLWVpdGhlciB1cHBlci1jYXNlIG9yIGxvd2VyLWNhc2UuCi0KLUFsbCBhcmd1bWVudHMgdG8gY29tbWFuZHMgYXJlIGNvbnZlcnRlZCB0byBzdHJpbmdzLCBleGNlcHQgZm9yCi1cc2FtcHtBVVRIRU5USUNBVEV9LCBhbmQgdGhlIGxhc3QgYXJndW1lbnQgdG8gXHNhbXB7QVBQRU5EfSB3aGljaCBpcwotcGFzc2VkIGFzIGFuIElNQVA0IGxpdGVyYWwuICBJZiBuZWNlc3NhcnkgKHRoZSBzdHJpbmcgY29udGFpbnMgSU1BUDQKLXByb3RvY29sLXNlbnNpdGl2ZSBjaGFyYWN0ZXJzIGFuZCBpc24ndCBlbmNsb3NlZCB3aXRoIGVpdGhlcgotcGFyZW50aGVzZXMgb3IgZG91YmxlIHF1b3RlcykgZWFjaCBzdHJpbmcgaXMgcXVvdGVkLiBIb3dldmVyLCB0aGUKLVx2YXJ7cGFzc3dvcmR9IGFyZ3VtZW50IHRvIHRoZSBcc2FtcHtMT0dJTn0gY29tbWFuZCBpcyBhbHdheXMgcXVvdGVkLgotSWYgeW91IHdhbnQgdG8gYXZvaWQgaGF2aW5nIGFuIGFyZ3VtZW50IHN0cmluZyBxdW90ZWQKLShlZzogdGhlIFx2YXJ7ZmxhZ3N9IGFyZ3VtZW50IHRvIFxzYW1we1NUT1JFfSkgdGhlbiBlbmNsb3NlIHRoZSBzdHJpbmcgaW4KLXBhcmVudGhlc2VzIChlZzogXGNvZGV7cicoXGUgRGVsZXRlZCknfSkuCi0KLUVhY2ggY29tbWFuZCByZXR1cm5zIGEgdHVwbGU6IFxjb2RleyhcdmFye3R5cGV9LCBbXHZhcntkYXRhfSwKLS4uLl0pfSB3aGVyZSBcdmFye3R5cGV9IGlzIHVzdWFsbHkgXGNvZGV7J09LJ30gb3IgXGNvZGV7J05PJ30sCi1hbmQgXHZhcntkYXRhfSBpcyBlaXRoZXIgdGhlIHRleHQgZnJvbSB0aGUgY29tbWFuZCByZXNwb25zZSwgb3IKLW1hbmRhdGVkIHJlc3VsdHMgZnJvbSB0aGUgY29tbWFuZC4gRWFjaCBcdmFye2RhdGF9Ci1pcyBlaXRoZXIgYSBzdHJpbmcsIG9yIGEgdHVwbGUuIElmIGEgdHVwbGUsIHRoZW4gdGhlIGZpcnN0IHBhcnQKLWlzIHRoZSBoZWFkZXIgb2YgdGhlIHJlc3BvbnNlLCBhbmQgdGhlIHNlY29uZCBwYXJ0IGNvbnRhaW5zCi10aGUgZGF0YSAoaWU6ICdsaXRlcmFsJyB2YWx1ZSkuCi0KLVRoZSBcdmFye21lc3NhZ2Vfc2V0fSBvcHRpb25zIHRvIGNvbW1hbmRzIGJlbG93IGlzIGEgc3RyaW5nIHNwZWNpZnlpbmcgb25lCi1vciBtb3JlIG1lc3NhZ2VzIHRvIGJlIGFjdGVkIHVwb24uICBJdCBtYXkgYmUgYSBzaW1wbGUgbWVzc2FnZSBudW1iZXIKLShcY29kZXsnMSd9KSwgYSByYW5nZSBvZiBtZXNzYWdlIG51bWJlcnMgKFxjb2RleycyOjQnfSksIG9yIGEgZ3JvdXAgb2YKLW5vbi1jb250aWd1b3VzIHJhbmdlcyBzZXBhcmF0ZWQgYnkgY29tbWFzIChcY29kZXsnMTozLDY6OSd9KS4gIEEgcmFuZ2UKLWNhbiBjb250YWluIGFuIGFzdGVyaXNrIHRvIGluZGljYXRlIGFuIGluZmluaXRlIHVwcGVyIGJvdW5kCi0oXGNvZGV7JzM6Kid9KS4KLQotQW4gXGNsYXNze0lNQVA0fSBpbnN0YW5jZSBoYXMgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotCi0KLVxiZWdpbnttZXRob2RkZXNjfVtJTUFQNF17YXBwZW5kfXttYWlsYm94LCBmbGFncywgZGF0ZV90aW1lLCBtZXNzYWdlfQotICBBcHBlbmQgXHZhcnttZXNzYWdlfSB0byBuYW1lZCBtYWlsYm94LiAKLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0lNQVA0XXthdXRoZW50aWNhdGV9e21lY2hhbmlzbSwgYXV0aG9iamVjdH0KLSAgQXV0aGVudGljYXRlIGNvbW1hbmQgLS0tIHJlcXVpcmVzIHJlc3BvbnNlIHByb2Nlc3NpbmcuCi0KLSAgXHZhcnttZWNoYW5pc219IHNwZWNpZmllcyB3aGljaCBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20gaXMgdG8gYmUKLSAgdXNlZCAtIGl0IHNob3VsZCBhcHBlYXIgaW4gdGhlIGluc3RhbmNlIHZhcmlhYmxlIFxjb2Rle2NhcGFiaWxpdGllc30KLSAgaW4gdGhlIGZvcm0gXGNvZGV7QVVUSD1tZWNoYW5pc219LgotCi0gIFx2YXJ7YXV0aG9iamVjdH0gbXVzdCBiZSBhIGNhbGxhYmxlIG9iamVjdDoKLQotXGJlZ2lue3ZlcmJhdGltfQotZGF0YSA9IGF1dGhvYmplY3QocmVzcG9uc2UpCi1cZW5ke3ZlcmJhdGltfQotCi0gIEl0IHdpbGwgYmUgY2FsbGVkIHRvIHByb2Nlc3Mgc2VydmVyIGNvbnRpbnVhdGlvbiByZXNwb25zZXMuCi0gIEl0IHNob3VsZCByZXR1cm4gXGNvZGV7ZGF0YX0gdGhhdCB3aWxsIGJlIGVuY29kZWQgYW5kIHNlbnQgdG8gc2VydmVyLgotICBJdCBzaG91bGQgcmV0dXJuIFxjb2Rle05vbmV9IGlmIHRoZSBjbGllbnQgYWJvcnQgcmVzcG9uc2UgXHNhbXB7Kn0gc2hvdWxkCi0gIGJlIHNlbnQgaW5zdGVhZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0lNQVA0XXtjaGVja317fQotICBDaGVja3BvaW50IG1haWxib3ggb24gc2VydmVyLiAKLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0lNQVA0XXtjbG9zZX17fQotICBDbG9zZSBjdXJyZW50bHkgc2VsZWN0ZWQgbWFpbGJveC4gRGVsZXRlZCBtZXNzYWdlcyBhcmUgcmVtb3ZlZCBmcm9tCi0gIHdyaXRhYmxlIG1haWxib3guIFRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIGNvbW1hbmQgYmVmb3JlCi0gIFxzYW1we0xPR09VVH0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtJTUFQNF17Y29weX17bWVzc2FnZV9zZXQsIG5ld19tYWlsYm94fQotICBDb3B5IFx2YXJ7bWVzc2FnZV9zZXR9IG1lc3NhZ2VzIG9udG8gZW5kIG9mIFx2YXJ7bmV3X21haWxib3h9LiAKLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0lNQVA0XXtjcmVhdGV9e21haWxib3h9Ci0gIENyZWF0ZSBuZXcgbWFpbGJveCBuYW1lZCBcdmFye21haWxib3h9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSU1BUDRde2RlbGV0ZX17bWFpbGJveH0KLSAgRGVsZXRlIG9sZCBtYWlsYm94IG5hbWVkIFx2YXJ7bWFpbGJveH0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtJTUFQNF17ZGVsZXRlYWNsfXttYWlsYm94LCB3aG99Ci0gIERlbGV0ZSB0aGUgQUNMcyAocmVtb3ZlIGFueSByaWdodHMpIHNldCBmb3Igd2hvIG9uIG1haWxib3guCi1cdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0lNQVA0XXtleHB1bmdlfXt9Ci0gIFBlcm1hbmVudGx5IHJlbW92ZSBkZWxldGVkIGl0ZW1zIGZyb20gc2VsZWN0ZWQgbWFpbGJveC4gR2VuZXJhdGVzIGFuCi0gIFxzYW1we0VYUFVOR0V9IHJlc3BvbnNlIGZvciBlYWNoIGRlbGV0ZWQgbWVzc2FnZS4gUmV0dXJuZWQgZGF0YQotICBjb250YWlucyBhIGxpc3Qgb2YgXHNhbXB7RVhQVU5HRX0gbWVzc2FnZSBudW1iZXJzIGluIG9yZGVyCi0gIHJlY2VpdmVkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSU1BUDRde2ZldGNofXttZXNzYWdlX3NldCwgbWVzc2FnZV9wYXJ0c30KLSAgRmV0Y2ggKHBhcnRzIG9mKSBtZXNzYWdlcy4gIFx2YXJ7bWVzc2FnZV9wYXJ0c30gc2hvdWxkIGJlCi0gIGEgc3RyaW5nIG9mIG1lc3NhZ2UgcGFydCBuYW1lcyBlbmNsb3NlZCB3aXRoaW4gcGFyZW50aGVzZXMsCi0gIGVnOiBcc2FtcHsiKFVJRCBCT0RZW1RFWFRdKSJ9LiAgUmV0dXJuZWQgZGF0YSBhcmUgdHVwbGVzCi0gIG9mIG1lc3NhZ2UgcGFydCBlbnZlbG9wZSBhbmQgZGF0YS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0lNQVA0XXtnZXRhY2x9e21haWxib3h9Ci0gIEdldCB0aGUgXHNhbXB7QUNMfXMgZm9yIFx2YXJ7bWFpbGJveH0uCi0gIFRoZSBtZXRob2QgaXMgbm9uLXN0YW5kYXJkLCBidXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBcc2FtcHtDeXJ1c30gc2VydmVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSU1BUDRde2dldGFubm90YXRpb259e21haWxib3gsIGVudHJ5LCBhdHRyaWJ1dGV9Ci0gIFJldHJpZXZlIHRoZSBzcGVjaWZpZWQgXHNhbXB7QU5OT1RBVElPTn1zIGZvciBcdmFye21haWxib3h9LgotICBUaGUgbWV0aG9kIGlzIG5vbi1zdGFuZGFyZCwgYnV0IGlzIHN1cHBvcnRlZCBieSB0aGUgXHNhbXB7Q3lydXN9IHNlcnZlci4KLVx2ZXJzaW9uYWRkZWR7Mi41fQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSU1BUDRde2dldHF1b3RhfXtyb290fQotICBHZXQgdGhlIFxzYW1we3F1b3RhfSBcdmFye3Jvb3R9J3MgcmVzb3VyY2UgdXNhZ2UgYW5kIGxpbWl0cy4KLSAgVGhpcyBtZXRob2QgaXMgcGFydCBvZiB0aGUgSU1BUDQgUVVPVEEgZXh0ZW5zaW9uIGRlZmluZWQgaW4gcmZjMjA4Ny4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSU1BUDRde2dldHF1b3Rhcm9vdH17bWFpbGJveH0KLSAgR2V0IHRoZSBsaXN0IG9mIFxzYW1we3F1b3RhfSBcc2FtcHtyb290c30gZm9yIHRoZSBuYW1lZCBcdmFye21haWxib3h9LgotICBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIHRoZSBJTUFQNCBRVU9UQSBleHRlbnNpb24gZGVmaW5lZCBpbiByZmMyMDg3LgotXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtJTUFQNF17bGlzdH17XG9wdGlvbmFse2RpcmVjdG9yeVxvcHRpb25hbHssIHBhdHRlcm59fX0KLSAgTGlzdCBtYWlsYm94IG5hbWVzIGluIFx2YXJ7ZGlyZWN0b3J5fSBtYXRjaGluZwotICBcdmFye3BhdHRlcm59LiAgXHZhcntkaXJlY3Rvcnl9IGRlZmF1bHRzIHRvIHRoZSB0b3AtbGV2ZWwgbWFpbAotICBmb2xkZXIsIGFuZCBcdmFye3BhdHRlcm59IGRlZmF1bHRzIHRvIG1hdGNoIGFueXRoaW5nLiAgUmV0dXJuZWQgZGF0YQotICBjb250YWlucyBhIGxpc3Qgb2YgXHNhbXB7TElTVH0gcmVzcG9uc2VzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSU1BUDRde2xvZ2lufXt1c2VyLCBwYXNzd29yZH0KLSAgSWRlbnRpZnkgdGhlIGNsaWVudCB1c2luZyBhIHBsYWludGV4dCBwYXNzd29yZC4KLSAgVGhlIFx2YXJ7cGFzc3dvcmR9IHdpbGwgYmUgcXVvdGVkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSU1BUDRde2xvZ2luX2NyYW1fbWQ1fXt1c2VyLCBwYXNzd29yZH0KLSAgRm9yY2UgdXNlIG9mIFxzYW1we0NSQU0tTUQ1fSBhdXRoZW50aWNhdGlvbiB3aGVuIGlkZW50aWZ5aW5nIHRoZQotICBjbGllbnQgdG8gcHJvdGVjdCB0aGUgcGFzc3dvcmQuICBXaWxsIG9ubHkgd29yayBpZiB0aGUgc2VydmVyCi0gIFxzYW1we0NBUEFCSUxJVFl9IHJlc3BvbnNlIGluY2x1ZGVzIHRoZSBwaHJhc2UgXHNhbXB7QVVUSD1DUkFNLU1ENX0uCi1cdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0lNQVA0XXtsb2dvdXR9e30KLSAgU2h1dGRvd24gY29ubmVjdGlvbiB0byBzZXJ2ZXIuIFJldHVybnMgc2VydmVyIFxzYW1we0JZRX0gcmVzcG9uc2UuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtJTUFQNF17bHN1Yn17XG9wdGlvbmFse2RpcmVjdG9yeVxvcHRpb25hbHssIHBhdHRlcm59fX0KLSAgTGlzdCBzdWJzY3JpYmVkIG1haWxib3ggbmFtZXMgaW4gZGlyZWN0b3J5IG1hdGNoaW5nIHBhdHRlcm4uCi0gIFx2YXJ7ZGlyZWN0b3J5fSBkZWZhdWx0cyB0byB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSBhbmQKLSAgXHZhcntwYXR0ZXJufSBkZWZhdWx0cyB0byBtYXRjaCBhbnkgbWFpbGJveC4KLSAgUmV0dXJuZWQgZGF0YSBhcmUgdHVwbGVzIG9mIG1lc3NhZ2UgcGFydCBlbnZlbG9wZSBhbmQgZGF0YS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0lNQVA0XXtteXJpZ2h0c317bWFpbGJveH0KLSAgU2hvdyBteSBBQ0xzIGZvciBhIG1haWxib3ggKGkuZS4gdGhlIHJpZ2h0cyB0aGF0IEkgaGF2ZSBvbiBtYWlsYm94KS4KLVx2ZXJzaW9uYWRkZWR7Mi40fQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSU1BUDRde25hbWVzcGFjZX17fQotICBSZXR1cm5zIElNQVAgbmFtZXNwYWNlcyBhcyBkZWZpbmVkIGluIFJGQzIzNDIuCi1cdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0lNQVA0XXtub29wfXt9Ci0gIFNlbmQgXHNhbXB7Tk9PUH0gdG8gc2VydmVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSU1BUDRde29wZW59e2hvc3QsIHBvcnR9Ci0gIE9wZW5zIHNvY2tldCB0byBcdmFye3BvcnR9IGF0IFx2YXJ7aG9zdH0uCi0gIFRoZSBjb25uZWN0aW9uIG9iamVjdHMgZXN0YWJsaXNoZWQgYnkgdGhpcyBtZXRob2QKLSAgd2lsbCBiZSB1c2VkIGluIHRoZSBcY29kZXtyZWFkfSwgXGNvZGV7cmVhZGxpbmV9LCBcY29kZXtzZW5kfSwgYW5kCi0gIFxjb2Rle3NodXRkb3dufSBtZXRob2RzLgotICBZb3UgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSU1BUDRde3BhcnRpYWx9e21lc3NhZ2VfbnVtLCBtZXNzYWdlX3BhcnQsIHN0YXJ0LCBsZW5ndGh9Ci0gIEZldGNoIHRydW5jYXRlZCBwYXJ0IG9mIGEgbWVzc2FnZS4KLSAgUmV0dXJuZWQgZGF0YSBpcyBhIHR1cGxlIG9mIG1lc3NhZ2UgcGFydCBlbnZlbG9wZSBhbmQgZGF0YS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0lNQVA0XXtwcm94eWF1dGh9e3VzZXJ9Ci0gIEFzc3VtZSBhdXRoZW50aWNhdGlvbiBhcyBcdmFye3VzZXJ9LgotICBBbGxvd3MgYW4gYXV0aG9yaXNlZCBhZG1pbmlzdHJhdG9yIHRvIHByb3h5IGludG8gYW55IHVzZXIncyBtYWlsYm94LgotXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtJTUFQNF17cmVhZH17c2l6ZX0KLSAgUmVhZHMgXHZhcntzaXplfSBieXRlcyBmcm9tIHRoZSByZW1vdGUgc2VydmVyLgotICBZb3UgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSU1BUDRde3JlYWRsaW5lfXt9Ci0gIFJlYWRzIG9uZSBsaW5lIGZyb20gdGhlIHJlbW90ZSBzZXJ2ZXIuCi0gIFlvdSBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtJTUFQNF17cmVjZW50fXt9Ci0gIFByb21wdCBzZXJ2ZXIgZm9yIGFuIHVwZGF0ZS4gUmV0dXJuZWQgZGF0YSBpcyBcY29kZXtOb25lfSBpZiBubyBuZXcKLSAgbWVzc2FnZXMsIGVsc2UgdmFsdWUgb2YgXHNhbXB7UkVDRU5UfSByZXNwb25zZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0lNQVA0XXtyZW5hbWV9e29sZG1haWxib3gsIG5ld21haWxib3h9Ci0gIFJlbmFtZSBtYWlsYm94IG5hbWVkIFx2YXJ7b2xkbWFpbGJveH0gdG8gXHZhcntuZXdtYWlsYm94fS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0lNQVA0XXtyZXNwb25zZX17Y29kZX0KLSAgUmV0dXJuIGRhdGEgZm9yIHJlc3BvbnNlIFx2YXJ7Y29kZX0gaWYgcmVjZWl2ZWQsIG9yCi0gIFxjb2Rle05vbmV9LiBSZXR1cm5zIHRoZSBnaXZlbiBjb2RlLCBpbnN0ZWFkIG9mIHRoZSB1c3VhbCB0eXBlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSU1BUDRde3NlYXJjaH17Y2hhcnNldCwgY3JpdGVyaW9uXG9wdGlvbmFseywgLi4ufX0KLSAgU2VhcmNoIG1haWxib3ggZm9yIG1hdGNoaW5nIG1lc3NhZ2VzLiAgXHZhcntjaGFyc2V0fSBtYXkgYmUKLSAgXGNvZGV7Tm9uZX0sIGluIHdoaWNoIGNhc2Ugbm8gXHNhbXB7Q0hBUlNFVH0gd2lsbCBiZSBzcGVjaWZpZWQgaW4gdGhlCi0gIHJlcXVlc3QgdG8gdGhlIHNlcnZlci4gIFRoZSBJTUFQIHByb3RvY29sIHJlcXVpcmVzIHRoYXQgYXQgbGVhc3Qgb25lCi0gIGNyaXRlcmlvbiBiZSBzcGVjaWZpZWQ7IGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNlZCB3aGVuIHRoZSBzZXJ2ZXIKLSAgcmV0dXJucyBhbiBlcnJvci4KLQotICBFeGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0jIE0gaXMgYSBjb25uZWN0ZWQgSU1BUDQgaW5zdGFuY2UuLi4KLXR5cCwgbXNnbnVtcyA9IE0uc2VhcmNoKE5vbmUsICdGUk9NJywgJyJMREoiJykKLQotIyBvcjoKLXR5cCwgbXNnbnVtcyA9IE0uc2VhcmNoKE5vbmUsICcoRlJPTSAiTERKIiknKQotXGVuZHt2ZXJiYXRpbX0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0lNQVA0XXtzZWxlY3R9e1xvcHRpb25hbHttYWlsYm94XG9wdGlvbmFseywgcmVhZG9ubHl9fX0KLSAgU2VsZWN0IGEgbWFpbGJveC4gUmV0dXJuZWQgZGF0YSBpcyB0aGUgY291bnQgb2YgbWVzc2FnZXMgaW4KLSAgXHZhcnttYWlsYm94fSAoXHNhbXB7RVhJU1RTfSByZXNwb25zZSkuICBUaGUgZGVmYXVsdCBcdmFye21haWxib3h9Ci0gIGlzIFxjb2RleydJTkJPWCd9LiAgSWYgdGhlIFx2YXJ7cmVhZG9ubHl9IGZsYWcgaXMgc2V0LCBtb2RpZmljYXRpb25zCi0gIHRvIHRoZSBtYWlsYm94IGFyZSBub3QgYWxsb3dlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0lNQVA0XXtzZW5kfXtkYXRhfQotICBTZW5kcyBcY29kZXtkYXRhfSB0byB0aGUgcmVtb3RlIHNlcnZlci4KLSAgWW91IG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0lNQVA0XXtzZXRhY2x9e21haWxib3gsIHdobywgd2hhdH0KLSAgU2V0IGFuIFxzYW1we0FDTH0gZm9yIFx2YXJ7bWFpbGJveH0uCi0gIFRoZSBtZXRob2QgaXMgbm9uLXN0YW5kYXJkLCBidXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBcc2FtcHtDeXJ1c30gc2VydmVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSU1BUDRde3NldGFubm90YXRpb259e21haWxib3gsIGVudHJ5LCBhdHRyaWJ1dGVcb3B0aW9uYWx7LCAuLi59fQotICBTZXQgXHNhbXB7QU5OT1RBVElPTn1zIGZvciBcdmFye21haWxib3h9LgotICBUaGUgbWV0aG9kIGlzIG5vbi1zdGFuZGFyZCwgYnV0IGlzIHN1cHBvcnRlZCBieSB0aGUgXHNhbXB7Q3lydXN9IHNlcnZlci4KLVx2ZXJzaW9uYWRkZWR7Mi41fQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSU1BUDRde3NldHF1b3RhfXtyb290LCBsaW1pdHN9Ci0gIFNldCB0aGUgXHNhbXB7cXVvdGF9IFx2YXJ7cm9vdH0ncyByZXNvdXJjZSBcdmFye2xpbWl0c30uCi0gIFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgdGhlIElNQVA0IFFVT1RBIGV4dGVuc2lvbiBkZWZpbmVkIGluIHJmYzIwODcuCi1cdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0lNQVA0XXtzaHV0ZG93bn17fQotICBDbG9zZSBjb25uZWN0aW9uIGVzdGFibGlzaGVkIGluIFxjb2Rle29wZW59LgotICBZb3UgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSU1BUDRde3NvY2tldH17fQotICBSZXR1cm5zIHNvY2tldCBpbnN0YW5jZSB1c2VkIHRvIGNvbm5lY3QgdG8gc2VydmVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSU1BUDRde3NvcnR9e3NvcnRfY3JpdGVyaWEsIGNoYXJzZXQsIHNlYXJjaF9jcml0ZXJpb25cb3B0aW9uYWx7LCAuLi59fQotICBUaGUgXGNvZGV7c29ydH0gY29tbWFuZCBpcyBhIHZhcmlhbnQgb2YgXGNvZGV7c2VhcmNofSB3aXRoIHNvcnRpbmcKLSAgc2VtYW50aWNzIGZvciB0aGUgcmVzdWx0cy4gIFJldHVybmVkIGRhdGEgY29udGFpbnMgYSBzcGFjZSBzZXBhcmF0ZWQKLSAgbGlzdCBvZiBtYXRjaGluZyBtZXNzYWdlIG51bWJlcnMuCi0KLSAgU29ydCBoYXMgdHdvIGFyZ3VtZW50cyBiZWZvcmUgdGhlIFx2YXJ7c2VhcmNoX2NyaXRlcmlvbn0KLSAgYXJndW1lbnQocyk7IGEgcGFyZW50aGVzaXplZCBsaXN0IG9mIFx2YXJ7c29ydF9jcml0ZXJpYX0sIGFuZCB0aGUKLSAgc2VhcmNoaW5nIFx2YXJ7Y2hhcnNldH0uICBOb3RlIHRoYXQgdW5saWtlIFxjb2Rle3NlYXJjaH0sIHRoZQotICBzZWFyY2hpbmcgXHZhcntjaGFyc2V0fSBhcmd1bWVudCBpcyBtYW5kYXRvcnkuICBUaGVyZSBpcyBhbHNvIGEKLSAgXGNvZGV7dWlkIHNvcnR9IGNvbW1hbmQgd2hpY2ggY29ycmVzcG9uZHMgdG8gXGNvZGV7c29ydH0gdGhlIHdheQotICB0aGF0IFxjb2Rle3VpZCBzZWFyY2h9IGNvcnJlc3BvbmRzIHRvIFxjb2Rle3NlYXJjaH0uICBUaGUKLSAgXGNvZGV7c29ydH0gY29tbWFuZCBmaXJzdCBzZWFyY2hlcyB0aGUgbWFpbGJveCBmb3IgbWVzc2FnZXMgdGhhdAotICBtYXRjaCB0aGUgZ2l2ZW4gc2VhcmNoaW5nIGNyaXRlcmlhIHVzaW5nIHRoZSBjaGFyc2V0IGFyZ3VtZW50IGZvcgotICB0aGUgaW50ZXJwcmV0YXRpb24gb2Ygc3RyaW5ncyBpbiB0aGUgc2VhcmNoaW5nIGNyaXRlcmlhLiAgSXQgdGhlbgotICByZXR1cm5zIHRoZSBudW1iZXJzIG9mIG1hdGNoaW5nIG1lc3NhZ2VzLgotCi0gIFRoaXMgaXMgYW4gXHNhbXB7SU1BUDRyZXYxfSBleHRlbnNpb24gY29tbWFuZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0lNQVA0XXtzdGF0dXN9e21haWxib3gsIG5hbWVzfQotICBSZXF1ZXN0IG5hbWVkIHN0YXR1cyBjb25kaXRpb25zIGZvciBcdmFye21haWxib3h9LiAKLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0lNQVA0XXtzdG9yZX17bWVzc2FnZV9zZXQsIGNvbW1hbmQsIGZsYWdfbGlzdH0KLSAgQWx0ZXJzIGZsYWcgZGlzcG9zaXRpb25zIGZvciBtZXNzYWdlcyBpbiBtYWlsYm94LiAgXHZhcntjb21tYW5kfSBpcwotICBzcGVjaWZpZWQgYnkgc2VjdGlvbiA2LjQuNiBvZiBccmZjezIwNjB9IGFzIGJlaW5nIG9uZSBvZiAiRkxBR1MiLCAiK0ZMQUdTIiwKLSAgb3IgIi1GTEFHUyIsIG9wdGlvbmFsbHkgd2l0aCBhIHN1ZmZpeCBvZiAiLlNJTEVOVCIuCi0KLSAgRm9yIGV4YW1wbGUsIHRvIHNldCB0aGUgZGVsZXRlIGZsYWcgb24gYWxsIG1lc3NhZ2VzOgotCi1cYmVnaW57dmVyYmF0aW19Ci10eXAsIGRhdGEgPSBNLnNlYXJjaChOb25lLCAnQUxMJykKLWZvciBudW0gaW4gZGF0YVswXS5zcGxpdCgpOgotICAgTS5zdG9yZShudW0sICcrRkxBR1MnLCAnXFxEZWxldGVkJykKLU0uZXhwdW5nZSgpCi1cZW5ke3ZlcmJhdGltfQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSU1BUDRde3N1YnNjcmliZX17bWFpbGJveH0KLSAgU3Vic2NyaWJlIHRvIG5ldyBtYWlsYm94LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSU1BUDRde3RocmVhZH17dGhyZWFkaW5nX2FsZ29yaXRobSwgY2hhcnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaF9jcml0ZXJpb25cb3B0aW9uYWx7LCAuLi59fQotICBUaGUgXGNvZGV7dGhyZWFkfSBjb21tYW5kIGlzIGEgdmFyaWFudCBvZiBcY29kZXtzZWFyY2h9IHdpdGgKLSAgdGhyZWFkaW5nIHNlbWFudGljcyBmb3IgdGhlIHJlc3VsdHMuICBSZXR1cm5lZCBkYXRhIGNvbnRhaW5zIGEgc3BhY2UKLSAgc2VwYXJhdGVkIGxpc3Qgb2YgdGhyZWFkIG1lbWJlcnMuCi0KLSAgVGhyZWFkIG1lbWJlcnMgY29uc2lzdCBvZiB6ZXJvIG9yIG1vcmUgbWVzc2FnZXMgbnVtYmVycywgZGVsaW1pdGVkCi0gIGJ5IHNwYWNlcywgaW5kaWNhdGluZyBzdWNjZXNzaXZlIHBhcmVudCBhbmQgY2hpbGQuCi0KLSAgVGhyZWFkIGhhcyB0d28gYXJndW1lbnRzIGJlZm9yZSB0aGUgXHZhcntzZWFyY2hfY3JpdGVyaW9ufQotICBhcmd1bWVudChzKTsgYSBcdmFye3RocmVhZGluZ19hbGdvcml0aG19LCBhbmQgdGhlIHNlYXJjaGluZwotICBcdmFye2NoYXJzZXR9LiAgTm90ZSB0aGF0IHVubGlrZSBcY29kZXtzZWFyY2h9LCB0aGUgc2VhcmNoaW5nCi0gIFx2YXJ7Y2hhcnNldH0gYXJndW1lbnQgaXMgbWFuZGF0b3J5LiAgVGhlcmUgaXMgYWxzbyBhIFxjb2Rle3VpZAotICB0aHJlYWR9IGNvbW1hbmQgd2hpY2ggY29ycmVzcG9uZHMgdG8gXGNvZGV7dGhyZWFkfSB0aGUgd2F5IHRoYXQKLSAgXGNvZGV7dWlkIHNlYXJjaH0gY29ycmVzcG9uZHMgdG8gXGNvZGV7c2VhcmNofS4gIFRoZSBcY29kZXt0aHJlYWR9Ci0gIGNvbW1hbmQgZmlyc3Qgc2VhcmNoZXMgdGhlIG1haWxib3ggZm9yIG1lc3NhZ2VzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuCi0gIHNlYXJjaGluZyBjcml0ZXJpYSB1c2luZyB0aGUgY2hhcnNldCBhcmd1bWVudCBmb3IgdGhlIGludGVycHJldGF0aW9uCi0gIG9mIHN0cmluZ3MgaW4gdGhlIHNlYXJjaGluZyBjcml0ZXJpYS4gSXQgdGhlbiByZXR1cm5zIHRoZSBtYXRjaGluZwotICBtZXNzYWdlcyB0aHJlYWRlZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCB0aHJlYWRpbmcgYWxnb3JpdGhtLgotCi0gIFRoaXMgaXMgYW4gXHNhbXB7SU1BUDRyZXYxfSBleHRlbnNpb24gY29tbWFuZC4gXHZlcnNpb25hZGRlZHsyLjR9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtJTUFQNF17dWlkfXtjb21tYW5kLCBhcmdcb3B0aW9uYWx7LCAuLi59fQotICBFeGVjdXRlIGNvbW1hbmQgYXJncyB3aXRoIG1lc3NhZ2VzIGlkZW50aWZpZWQgYnkgVUlELCByYXRoZXIgdGhhbgotICBtZXNzYWdlIG51bWJlci4gIFJldHVybnMgcmVzcG9uc2UgYXBwcm9wcmlhdGUgdG8gY29tbWFuZC4gIEF0IGxlYXN0Ci0gIG9uZSBhcmd1bWVudCBtdXN0IGJlIHN1cHBsaWVkOyBpZiBub25lIGFyZSBwcm92aWRlZCwgdGhlIHNlcnZlciB3aWxsCi0gIHJldHVybiBhbiBlcnJvciBhbmQgYW4gZXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSU1BUDRde3Vuc3Vic2NyaWJlfXttYWlsYm94fQotICBVbnN1YnNjcmliZSBmcm9tIG9sZCBtYWlsYm94LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSU1BUDRde3hhdG9tfXtuYW1lXG9wdGlvbmFseywgYXJnXG9wdGlvbmFseywgLi4ufX19Ci0gIEFsbG93IHNpbXBsZSBleHRlbnNpb24gY29tbWFuZHMgbm90aWZpZWQgYnkgc2VydmVyIGluCi0gIFxzYW1we0NBUEFCSUxJVFl9IHJlc3BvbnNlLgotXGVuZHttZXRob2RkZXNjfQotCi0KLUluc3RhbmNlcyBvZiBcY2xhc3N7SU1BUDRfU1NMfSBoYXZlIGp1c3Qgb25lIGFkZGl0aW9uYWwgbWV0aG9kOgotCi1cYmVnaW57bWV0aG9kZGVzY31bSU1BUDRfU1NMXXtzc2x9e30KLSAgUmV0dXJucyBTU0xPYmplY3QgaW5zdGFuY2UgdXNlZCBmb3IgdGhlIHNlY3VyZSBjb25uZWN0aW9uIHdpdGggdGhlIHNlcnZlci4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1UaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGRlZmluZWQgb24gaW5zdGFuY2VzIG9mIFxjbGFzc3tJTUFQNH06Ci0KLQotXGJlZ2lue21lbWJlcmRlc2N9W0lNQVA0XXtQUk9UT0NPTF9WRVJTSU9OfQotVGhlIG1vc3QgcmVjZW50IHN1cHBvcnRlZCBwcm90b2NvbCBpbiB0aGUKLVxzYW1we0NBUEFCSUxJVFl9IHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlci4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W0lNQVA0XXtkZWJ1Z30KLUludGVnZXIgdmFsdWUgdG8gY29udHJvbCBkZWJ1Z2dpbmcgb3V0cHV0LiAgVGhlIGluaXRpYWxpemUgdmFsdWUgaXMKLXRha2VuIGZyb20gdGhlIG1vZHVsZSB2YXJpYWJsZSBcY29kZXtEZWJ1Z30uICBWYWx1ZXMgZ3JlYXRlciB0aGFuCi10aHJlZSB0cmFjZSBlYWNoIGNvbW1hbmQuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLQotXHN1YnNlY3Rpb257SU1BUDQgRXhhbXBsZSBcbGFiZWx7aW1hcDQtZXhhbXBsZX19Ci0KLUhlcmUgaXMgYSBtaW5pbWFsIGV4YW1wbGUgKHdpdGhvdXQgZXJyb3IgY2hlY2tpbmcpIHRoYXQgb3BlbnMgYQotbWFpbGJveCBhbmQgcmV0cmlldmVzIGFuZCBwcmludHMgYWxsIG1lc3NhZ2VzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgZ2V0cGFzcywgaW1hcGxpYgotCi1NID0gaW1hcGxpYi5JTUFQNCgpCi1NLmxvZ2luKGdldHBhc3MuZ2V0dXNlcigpLCBnZXRwYXNzLmdldHBhc3MoKSkKLU0uc2VsZWN0KCkKLXR5cCwgZGF0YSA9IE0uc2VhcmNoKE5vbmUsICdBTEwnKQotZm9yIG51bSBpbiBkYXRhWzBdLnNwbGl0KCk6Ci0gICAgdHlwLCBkYXRhID0gTS5mZXRjaChudW0sICcoUkZDODIyKScpCi0gICAgcHJpbnQgJ01lc3NhZ2UgJXNcbiVzXG4nICUgKG51bSwgZGF0YVswXVsxXSkKLU0uY2xvc2UoKQotTS5sb2dvdXQoKQotXGVuZHt2ZXJiYXRpbX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliaW1naGRyLnRleCBiL0RvYy9saWIvbGliaW1naGRyLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE0ZjM2OC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmltZ2hkci50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle2ltZ2hkcn0gLS0tCi0gICAgICAgICBEZXRlcm1pbmUgdGhlIHR5cGUgb2YgYW4gaW1hZ2V9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtpbWdoZHJ9Ci1cbW9kdWxlc3lub3BzaXN7RGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGltYWdlIGNvbnRhaW5lZCBpbiBhIGZpbGUgb3IKLSAgICAgICAgICAgICAgICBieXRlIHN0cmVhbS59Ci0KLQotVGhlIFxtb2R1bGV7aW1naGRyfSBtb2R1bGUgZGV0ZXJtaW5lcyB0aGUgdHlwZSBvZiBpbWFnZSBjb250YWluZWQgaW4gYQotZmlsZSBvciBieXRlIHN0cmVhbS4KLQotVGhlIFxtb2R1bGV7aW1naGRyfSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOgotCi0KLVxiZWdpbntmdW5jZGVzY317d2hhdH17ZmlsZW5hbWVcb3B0aW9uYWx7LCBofX0KLVRlc3RzIHRoZSBpbWFnZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSBuYW1lZCBieSBcdmFye2ZpbGVuYW1lfSwKLWFuZCByZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGltYWdlIHR5cGUuICBJZiBvcHRpb25hbCBcdmFye2h9Ci1pcyBwcm92aWRlZCwgdGhlIFx2YXJ7ZmlsZW5hbWV9IGlzIGlnbm9yZWQgYW5kIFx2YXJ7aH0gaXMgYXNzdW1lZCB0bwotY29udGFpbiB0aGUgYnl0ZSBzdHJlYW0gdG8gdGVzdC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVRoZSBmb2xsb3dpbmcgaW1hZ2UgdHlwZXMgYXJlIHJlY29nbml6ZWQsIGFzIGxpc3RlZCBiZWxvdyB3aXRoIHRoZQotcmV0dXJuIHZhbHVlIGZyb20gXGZ1bmN0aW9ue3doYXQoKX06Ci0KLVxiZWdpbnt0YWJsZWlpfXtsfGx9e2NvZGV9e1ZhbHVlfXtJbWFnZSBmb3JtYXR9Ci0gIFxsaW5laWl7J3JnYid9e1NHSSBJbWdMaWIgRmlsZXN9Ci0gIFxsaW5laWl7J2dpZid9e0dJRiA4N2EgYW5kIDg5YSBGaWxlc30KLSAgXGxpbmVpaXsncGJtJ317UG9ydGFibGUgQml0bWFwIEZpbGVzfQotICBcbGluZWlpeydwZ20nfXtQb3J0YWJsZSBHcmF5bWFwIEZpbGVzfQotICBcbGluZWlpeydwcG0nfXtQb3J0YWJsZSBQaXhtYXAgRmlsZXN9Ci0gIFxsaW5laWl7J3RpZmYnfXtUSUZGIEZpbGVzfQotICBcbGluZWlpeydyYXN0J317U3VuIFJhc3RlciBGaWxlc30KLSAgXGxpbmVpaXsneGJtJ317WCBCaXRtYXAgRmlsZXN9Ci0gIFxsaW5laWl7J2pwZWcnfXtKUEVHIGRhdGEgaW4gSkZJRiBvciBFeGlmIGZvcm1hdHN9Ci0gIFxsaW5laWl7J2JtcCd9e0JNUCBmaWxlc30KLSAgXGxpbmVpaXsncG5nJ317UG9ydGFibGUgTmV0d29yayBHcmFwaGljc30KLVxlbmR7dGFibGVpaX0KLQotXHZlcnNpb25hZGRlZFtFeGlmIGRldGVjdGlvbl17Mi41fQotCi1Zb3UgY2FuIGV4dGVuZCB0aGUgbGlzdCBvZiBmaWxlIHR5cGVzIFxtb2R1bGV7aW1naGRyfSBjYW4gcmVjb2duaXplIGJ5Ci1hcHBlbmRpbmcgdG8gdGhpcyB2YXJpYWJsZToKLQotXGJlZ2lue2RhdGFkZXNjfXt0ZXN0c30KLUEgbGlzdCBvZiBmdW5jdGlvbnMgcGVyZm9ybWluZyB0aGUgaW5kaXZpZHVhbCB0ZXN0cy4gIEVhY2ggZnVuY3Rpb24KLXRha2VzIHR3byBhcmd1bWVudHM6IHRoZSBieXRlLXN0cmVhbSBhbmQgYW4gb3BlbiBmaWxlLWxpa2Ugb2JqZWN0LgotV2hlbiBcZnVuY3Rpb257d2hhdCgpfSBpcyBjYWxsZWQgd2l0aCBhIGJ5dGUtc3RyZWFtLCB0aGUgZmlsZS1saWtlCi1vYmplY3Qgd2lsbCBiZSBcY29kZXtOb25lfS4KLQotVGhlIHRlc3QgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBpbWFnZSB0eXBlIGlmCi10aGUgdGVzdCBzdWNjZWVkZWQsIG9yIFxjb2Rle05vbmV9IGlmIGl0IGZhaWxlZC4KLVxlbmR7ZGF0YWRlc2N9Ci0KLUV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgaW1naGRyCi0+Pj4gaW1naGRyLndoYXQoJy90bXAvYmFzcy5naWYnKQotJ2dpZicKLVxlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmltcC50ZXggYi9Eb2MvbGliL2xpYmltcC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzOTY2MDUuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJpbXAudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMjkxICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7aW1wfSAtLS0KLSAgICAgICAgIEFjY2VzcyB0aGUgXGtleXdvcmR7aW1wb3J0fSBpbnRlcm5hbHN9Ci0KLVxkZWNsYXJlbW9kdWxle2J1aWx0aW59e2ltcH0KLVxtb2R1bGVzeW5vcHNpc3tBY2Nlc3MgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBca2V5d29yZHtpbXBvcnR9IHN0YXRlbWVudC59Ci0KLQotVGhpc1xzdGluZGV4e2ltcG9ydH0gbW9kdWxlIHByb3ZpZGVzIGFuIGludGVyZmFjZSB0byB0aGUgbWVjaGFuaXNtcwotdXNlZCB0byBpbXBsZW1lbnQgdGhlIFxrZXl3b3Jke2ltcG9ydH0gc3RhdGVtZW50LiAgSXQgZGVmaW5lcyB0aGUKLWZvbGxvd2luZyBjb25zdGFudHMgYW5kIGZ1bmN0aW9uczoKLQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldF9tYWdpY317fQotXGluZGV4aWl7ZmlsZX17Ynl0ZS1jb2RlfQotUmV0dXJuIHRoZSBtYWdpYyBzdHJpbmcgdmFsdWUgdXNlZCB0byByZWNvZ25pemUgYnl0ZS1jb21waWxlZCBjb2RlCi1maWxlcyAoXGZpbGV7LnB5Y30gZmlsZXMpLiAgKFRoaXMgdmFsdWUgbWF5IGJlIGRpZmZlcmVudCBmb3IgZWFjaAotUHl0aG9uIHZlcnNpb24uKQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRfc3VmZml4ZXN9e30KLVJldHVybiBhIGxpc3Qgb2YgdHJpcGxlcywgZWFjaCBkZXNjcmliaW5nIGEgcGFydGljdWxhciB0eXBlIG9mIG1vZHVsZS4KLUVhY2ggdHJpcGxlIGhhcyB0aGUgZm9ybSBcY29kZXsoXHZhcntzdWZmaXh9LCBcdmFye21vZGV9LAotXHZhcnt0eXBlfSl9LCB3aGVyZSBcdmFye3N1ZmZpeH0gaXMgYSBzdHJpbmcgdG8gYmUgYXBwZW5kZWQgdG8gdGhlCi1tb2R1bGUgbmFtZSB0byBmb3JtIHRoZSBmaWxlbmFtZSB0byBzZWFyY2ggZm9yLCBcdmFye21vZGV9IGlzIHRoZSBtb2RlCi1zdHJpbmcgdG8gcGFzcyB0byB0aGUgYnVpbHQtaW4gXGZ1bmN0aW9ue29wZW4oKX0gZnVuY3Rpb24gdG8gb3BlbiB0aGUKLWZpbGUgKHRoaXMgY2FuIGJlIFxjb2RleydyJ30gZm9yIHRleHQgZmlsZXMgb3IgXGNvZGV7J3JiJ30gZm9yIGJpbmFyeQotZmlsZXMpLCBhbmQgXHZhcnt0eXBlfSBpcyB0aGUgZmlsZSB0eXBlLCB3aGljaCBoYXMgb25lIG9mIHRoZSB2YWx1ZXMKLVxjb25zdGFudHtQWV9TT1VSQ0V9LCBcY29uc3RhbnR7UFlfQ09NUElMRUR9LCBvcgotXGNvbnN0YW50e0NfRVhURU5TSU9OfSwgZGVzY3JpYmVkIGJlbG93LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtmaW5kX21vZHVsZX17bmFtZVxvcHRpb25hbHssIHBhdGh9fQotVHJ5IHRvIGZpbmQgdGhlIG1vZHVsZSBcdmFye25hbWV9IG9uIHRoZSBzZWFyY2ggcGF0aCBcdmFye3BhdGh9LiAgSWYKLVx2YXJ7cGF0aH0gaXMgYSBsaXN0IG9mIGRpcmVjdG9yeSBuYW1lcywgZWFjaCBkaXJlY3RvcnkgaXMgc2VhcmNoZWQKLWZvciBmaWxlcyB3aXRoIGFueSBvZiB0aGUgc3VmZml4ZXMgcmV0dXJuZWQgYnkgXGZ1bmN0aW9ue2dldF9zdWZmaXhlcygpfQotYWJvdmUuICBJbnZhbGlkIG5hbWVzIGluIHRoZSBsaXN0IGFyZSBzaWxlbnRseSBpZ25vcmVkIChidXQgYWxsIGxpc3QKLWl0ZW1zIG11c3QgYmUgc3RyaW5ncykuICBJZiBcdmFye3BhdGh9IGlzIG9taXR0ZWQgb3IgXGNvZGV7Tm9uZX0sIHRoZQotbGlzdCBvZiBkaXJlY3RvcnkgbmFtZXMgZ2l2ZW4gYnkgXGNvZGV7c3lzLnBhdGh9IGlzIHNlYXJjaGVkLCBidXQKLWZpcnN0IGl0IHNlYXJjaGVzIGEgZmV3IHNwZWNpYWwgcGxhY2VzOiBpdCB0cmllcyB0byBmaW5kIGEgYnVpbHQtaW4KLW1vZHVsZSB3aXRoIHRoZSBnaXZlbiBuYW1lIChcY29uc3RhbnR7Q19CVUlMVElOfSksIHRoZW4gYSBmcm96ZW4gbW9kdWxlCi0oXGNvbnN0YW50e1BZX0ZST1pFTn0pLCBhbmQgb24gc29tZSBzeXN0ZW1zIHNvbWUgb3RoZXIgcGxhY2VzIGFyZSBsb29rZWQKLWluIGFzIHdlbGwgKG9uIHRoZSBNYWMsIGl0IGxvb2tzIGZvciBhIHJlc291cmNlIChcY29uc3RhbnR7UFlfUkVTT1VSQ0V9KTsKLW9uIFdpbmRvd3MsIGl0IGxvb2tzIGluIHRoZSByZWdpc3RyeSB3aGljaCBtYXkgcG9pbnQgdG8gYSBzcGVjaWZpYwotZmlsZSkuCi0KLUlmIHNlYXJjaCBpcyBzdWNjZXNzZnVsLCB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgdHJpcGxlCi1cY29kZXsoXHZhcntmaWxlfSwgXHZhcntwYXRobmFtZX0sIFx2YXJ7ZGVzY3JpcHRpb259KX0gd2hlcmUKLVx2YXJ7ZmlsZX0gaXMgYW4gb3BlbiBmaWxlIG9iamVjdCBwb3NpdGlvbmVkIGF0IHRoZSBiZWdpbm5pbmcsCi1cdmFye3BhdGhuYW1lfSBpcyB0aGUgcGF0aG5hbWUgb2YgdGhlCi1maWxlIGZvdW5kLCBhbmQgXHZhcntkZXNjcmlwdGlvbn0gaXMgYSB0cmlwbGUgYXMgY29udGFpbmVkIGluIHRoZSBsaXN0Ci1yZXR1cm5lZCBieSBcZnVuY3Rpb257Z2V0X3N1ZmZpeGVzKCl9IGRlc2NyaWJpbmcgdGhlIGtpbmQgb2YgbW9kdWxlIGZvdW5kLgotSWYgdGhlIG1vZHVsZSBkb2VzIG5vdCBsaXZlIGluIGEgZmlsZSwgdGhlIHJldHVybmVkIFx2YXJ7ZmlsZX0gaXMKLVxjb2Rle05vbmV9LCBcdmFye2ZpbGVuYW1lfSBpcyB0aGUgZW1wdHkgc3RyaW5nLCBhbmQgdGhlCi1cdmFye2Rlc2NyaXB0aW9ufSB0dXBsZSBjb250YWlucyBlbXB0eSBzdHJpbmdzIGZvciBpdHMgc3VmZml4IGFuZAotbW9kZTsgdGhlIG1vZHVsZSB0eXBlIGlzIGFzIGluZGljYXRlIGluIHBhcmVudGhlc2VzIGFib3ZlLiAgSWYgdGhlCi1zZWFyY2ggaXMgdW5zdWNjZXNzZnVsLCBcZXhjZXB0aW9ue0ltcG9ydEVycm9yfSBpcyByYWlzZWQuICBPdGhlcgotZXhjZXB0aW9ucyBpbmRpY2F0ZSBwcm9ibGVtcyB3aXRoIHRoZSBhcmd1bWVudHMgb3IgZW52aXJvbm1lbnQuCi0KLVRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGFuZGxlIGhpZXJhcmNoaWNhbCBtb2R1bGUgbmFtZXMgKG5hbWVzCi1jb250YWluaW5nIGRvdHMpLiAgSW4gb3JkZXIgdG8gZmluZCBcdmFye1B9Llx2YXJ7TX0sIHRoYXQgaXMsIHN1Ym1vZHVsZQotXHZhcntNfSBvZiBwYWNrYWdlIFx2YXJ7UH0sIHVzZSBcZnVuY3Rpb257ZmluZF9tb2R1bGUoKX0gYW5kCi1cZnVuY3Rpb257bG9hZF9tb2R1bGUoKX0gdG8gZmluZCBhbmQgbG9hZCBwYWNrYWdlIFx2YXJ7UH0sIGFuZCB0aGVuIHVzZQotXGZ1bmN0aW9ue2ZpbmRfbW9kdWxlKCl9IHdpdGggdGhlIFx2YXJ7cGF0aH0gYXJndW1lbnQgc2V0IHRvCi1cY29kZXtcdmFye1B9Ll9fcGF0aF9ffS4gIFdoZW4gXHZhcntQfSBpdHNlbGYgaGFzIGEgZG90dGVkIG5hbWUsIGFwcGx5Ci10aGlzIHJlY2lwZSByZWN1cnNpdmVseS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bG9hZF9tb2R1bGV9e25hbWUsIGZpbGUsIGZpbGVuYW1lLCBkZXNjcmlwdGlvbn0KLUxvYWQgYSBtb2R1bGUgdGhhdCB3YXMgcHJldmlvdXNseSBmb3VuZCBieSBcZnVuY3Rpb257ZmluZF9tb2R1bGUoKX0gKG9yIGJ5Ci1hbiBvdGhlcndpc2UgY29uZHVjdGVkIHNlYXJjaCB5aWVsZGluZyBjb21wYXRpYmxlIHJlc3VsdHMpLiAgVGhpcwotZnVuY3Rpb24gZG9lcyBtb3JlIHRoYW4gaW1wb3J0aW5nIHRoZSBtb2R1bGU6IGlmIHRoZSBtb2R1bGUgd2FzCi1hbHJlYWR5IGltcG9ydGVkLCBpdCB3aWxsIHJlbG9hZCB0aGUgbW9kdWxlISBUaGUgXHZhcntuYW1lfSBhcmd1bWVudAotaW5kaWNhdGVzIHRoZSBmdWxsIG1vZHVsZSBuYW1lIChpbmNsdWRpbmcgdGhlIHBhY2thZ2UgbmFtZSwgaWYgdGhpcyBpcwotYSBzdWJtb2R1bGUgb2YgYSBwYWNrYWdlKS4gIFRoZSBcdmFye2ZpbGV9IGFyZ3VtZW50IGlzIGFuIG9wZW4gZmlsZSwKLWFuZCBcdmFye2ZpbGVuYW1lfSBpcyB0aGUgY29ycmVzcG9uZGluZyBmaWxlIG5hbWU7IHRoZXNlIGNhbiBiZQotXGNvZGV7Tm9uZX0gYW5kIFxjb2RleycnfSwgcmVzcGVjdGl2ZWx5LCB3aGVuIHRoZSBtb2R1bGUgaXMgbm90IGJlaW5nCi1sb2FkZWQgZnJvbSBhIGZpbGUuICBUaGUgXHZhcntkZXNjcmlwdGlvbn0gYXJndW1lbnQgaXMgYSB0dXBsZSwgYXMKLXdvdWxkIGJlIHJldHVybmVkIGJ5IFxmdW5jdGlvbntnZXRfc3VmZml4ZXMoKX0sIGRlc2NyaWJpbmcgd2hhdCBraW5kCi1vZiBtb2R1bGUgbXVzdCBiZSBsb2FkZWQuCi0KLUlmIHRoZSBsb2FkIGlzIHN1Y2Nlc3NmdWwsIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIG1vZHVsZSBvYmplY3Q7Ci1vdGhlcndpc2UsIGFuIGV4Y2VwdGlvbiAodXN1YWxseSBcZXhjZXB0aW9ue0ltcG9ydEVycm9yfSkgaXMgcmFpc2VkLgotCi1cc3Ryb25ne0ltcG9ydGFudDp9IHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNsb3NpbmcgdGhlCi1cdmFye2ZpbGV9IGFyZ3VtZW50LCBpZiBpdCB3YXMgbm90IFxjb2Rle05vbmV9LCBldmVuIHdoZW4gYW4gZXhjZXB0aW9uCi1pcyByYWlzZWQuICBUaGlzIGlzIGJlc3QgZG9uZSB1c2luZyBhIFxrZXl3b3Jke3RyeX0KLS4uLiBca2V5d29yZHtmaW5hbGx5fSBzdGF0ZW1lbnQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e25ld19tb2R1bGV9e25hbWV9Ci1SZXR1cm4gYSBuZXcgZW1wdHkgbW9kdWxlIG9iamVjdCBjYWxsZWQgXHZhcntuYW1lfS4gIFRoaXMgb2JqZWN0IGlzCi1cZW1waHtub3R9IGluc2VydGVkIGluIFxjb2Rle3N5cy5tb2R1bGVzfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bG9ja19oZWxkfXt9Ci1SZXR1cm4gXGNvZGV7VHJ1ZX0gaWYgdGhlIGltcG9ydCBsb2NrIGlzIGN1cnJlbnRseSBoZWxkLCBlbHNlIFxjb2Rle0ZhbHNlfS4KLU9uIHBsYXRmb3JtcyB3aXRob3V0IHRocmVhZHMsIGFsd2F5cyByZXR1cm4gXGNvZGV7RmFsc2V9LgotCi1PbiBwbGF0Zm9ybXMgd2l0aCB0aHJlYWRzLCBhIHRocmVhZCBleGVjdXRpbmcgYW4gaW1wb3J0IGhvbGRzIGFuIGludGVybmFsCi1sb2NrIHVudGlsIHRoZSBpbXBvcnQgaXMgY29tcGxldGUuCi1UaGlzIGxvY2sgYmxvY2tzIG90aGVyIHRocmVhZHMgZnJvbSBkb2luZyBhbiBpbXBvcnQgdW50aWwgdGhlIG9yaWdpbmFsCi1pbXBvcnQgY29tcGxldGVzLCB3aGljaCBpbiB0dXJuIHByZXZlbnRzIG90aGVyIHRocmVhZHMgZnJvbSBzZWVpbmcKLWluY29tcGxldGUgbW9kdWxlIG9iamVjdHMgY29uc3RydWN0ZWQgYnkgdGhlIG9yaWdpbmFsIHRocmVhZCB3aGlsZSBpbgotdGhlIHByb2Nlc3Mgb2YgY29tcGxldGluZyBpdHMgaW1wb3J0IChhbmQgdGhlIGltcG9ydHMsIGlmIGFueSwKLXRyaWdnZXJlZCBieSB0aGF0KS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317YWNxdWlyZV9sb2NrfXt9Ci1BY3F1aXJlcyB0aGUgaW50ZXJwcmV0ZXIncyBpbXBvcnQgbG9jayBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLiAgVGhpcyBsb2NrCi1zaG91bGQgYmUgdXNlZCBieSBpbXBvcnQgaG9va3MgdG8gZW5zdXJlIHRocmVhZC1zYWZldHkgd2hlbiBpbXBvcnRpbmcgbW9kdWxlcy4KLU9uIHBsYXRmb3JtcyB3aXRob3V0IHRocmVhZHMsIHRoaXMgZnVuY3Rpb24gZG9lcyBub3RoaW5nLgotXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3JlbGVhc2VfbG9ja317fQotUmVsZWFzZSB0aGUgaW50ZXJwcmV0ZXIncyBpbXBvcnQgbG9jay4KLU9uIHBsYXRmb3JtcyB3aXRob3V0IHRocmVhZHMsIHRoaXMgZnVuY3Rpb24gZG9lcyBub3RoaW5nLgotXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke2Z1bmNkZXNjfQotCi1UaGUgZm9sbG93aW5nIGNvbnN0YW50cyB3aXRoIGludGVnZXIgdmFsdWVzLCBkZWZpbmVkIGluIHRoaXMgbW9kdWxlLAotYXJlIHVzZWQgdG8gaW5kaWNhdGUgdGhlIHNlYXJjaCByZXN1bHQgb2YgXGZ1bmN0aW9ue2ZpbmRfbW9kdWxlKCl9LgotCi1cYmVnaW57ZGF0YWRlc2N9e1BZX1NPVVJDRX0KLVRoZSBtb2R1bGUgd2FzIGZvdW5kIGFzIGEgc291cmNlIGZpbGUuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1BZX0NPTVBJTEVEfQotVGhlIG1vZHVsZSB3YXMgZm91bmQgYXMgYSBjb21waWxlZCBjb2RlIG9iamVjdCBmaWxlLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtDX0VYVEVOU0lPTn0KLVRoZSBtb2R1bGUgd2FzIGZvdW5kIGFzIGR5bmFtaWNhbGx5IGxvYWRhYmxlIHNoYXJlZCBsaWJyYXJ5LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtQWV9SRVNPVVJDRX0KLVRoZSBtb2R1bGUgd2FzIGZvdW5kIGFzIGEgTWFjIE9TIDkgcmVzb3VyY2UuICBUaGlzIHZhbHVlIGNhbiBvbmx5IGJlCi1yZXR1cm5lZCBvbiBhIE1hYyBPUyA5IG9yIGVhcmxpZXIgTWFjaW50b3NoLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtQS0dfRElSRUNUT1JZfQotVGhlIG1vZHVsZSB3YXMgZm91bmQgYXMgYSBwYWNrYWdlIGRpcmVjdG9yeS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317Q19CVUlMVElOfQotVGhlIG1vZHVsZSB3YXMgZm91bmQgYXMgYSBidWlsdC1pbiBtb2R1bGUuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1BZX0ZST1pFTn0KLVRoZSBtb2R1bGUgd2FzIGZvdW5kIGFzIGEgZnJvemVuIG1vZHVsZSAoc2VlIFxmdW5jdGlvbntpbml0X2Zyb3plbigpfSkuCi1cZW5ke2RhdGFkZXNjfQotCi1UaGUgZm9sbG93aW5nIGNvbnN0YW50IGFuZCBmdW5jdGlvbnMgYXJlIG9ic29sZXRlOyB0aGVpciBmdW5jdGlvbmFsaXR5Ci1pcyBhdmFpbGFibGUgdGhyb3VnaCBcZnVuY3Rpb257ZmluZF9tb2R1bGUoKX0gb3IgXGZ1bmN0aW9ue2xvYWRfbW9kdWxlKCl9LgotVGhleSBhcmUga2VwdCBhcm91bmQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6Ci0KLVxiZWdpbntkYXRhZGVzY317U0VBUkNIX0VSUk9SfQotVW51c2VkLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpbml0X2J1aWx0aW59e25hbWV9Ci1Jbml0aWFsaXplIHRoZSBidWlsdC1pbiBtb2R1bGUgY2FsbGVkIFx2YXJ7bmFtZX0gYW5kIHJldHVybiBpdHMgbW9kdWxlCi1vYmplY3QgYWxvbmcgd2l0aCBzdG9yaW5nIGl0IGluIFxjb2Rle3N5cy5tb2R1bGVzfS4gIElmIHRoZSBtb2R1bGUgd2FzIGFscmVhZHkKLWluaXRpYWxpemVkLCBpdCB3aWxsIGJlIGluaXRpYWxpemVkIFxlbXBoe2FnYWlufS4gIFJlLWluaXRpYWxpemF0aW9uIGludm9sdmVzCi10aGUgY29weWluZyBvZiB0aGUgYnVpbHQtaW4gbW9kdWxlJ3MgXGNvZGV7X19kaWN0X199IGZyb20gdGhlIGNhY2hlZAotbW9kdWxlIG92ZXIgdGhlIG1vZHVsZSdzIGVudHJ5IGluIFxjb2Rle3N5cy5tb2R1bGVzfS4gIElmIHRoZXJlIGlzIG5vCi1idWlsdC1pbiBtb2R1bGUgY2FsbGVkIFx2YXJ7bmFtZX0sIFxjb2Rle05vbmV9IGlzIHJldHVybmVkLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpbml0X2Zyb3plbn17bmFtZX0KLUluaXRpYWxpemUgdGhlIGZyb3plbiBtb2R1bGUgY2FsbGVkIFx2YXJ7bmFtZX0gYW5kIHJldHVybiBpdHMgbW9kdWxlCi1vYmplY3QuICBJZiB0aGUgbW9kdWxlIHdhcyBhbHJlYWR5IGluaXRpYWxpemVkLCBpdCB3aWxsIGJlIGluaXRpYWxpemVkCi1cZW1waHthZ2Fpbn0uICBJZiB0aGVyZSBpcyBubyBmcm96ZW4gbW9kdWxlIGNhbGxlZCBcdmFye25hbWV9LAotXGNvZGV7Tm9uZX0gaXMgcmV0dXJuZWQuICAoRnJvemVuIG1vZHVsZXMgYXJlIG1vZHVsZXMgd3JpdHRlbiBpbgotUHl0aG9uIHdob3NlIGNvbXBpbGVkIGJ5dGUtY29kZSBvYmplY3QgaXMgaW5jb3Jwb3JhdGVkIGludG8gYQotY3VzdG9tLWJ1aWx0IFB5dGhvbiBpbnRlcnByZXRlciBieSBQeXRob24ncyBccHJvZ3JhbXtmcmVlemV9IHV0aWxpdHkuCi1TZWUgXGZpbGV7VG9vbHMvZnJlZXplL30gZm9yIG5vdy4pCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2lzX2J1aWx0aW59e25hbWV9Ci1SZXR1cm4gXGNvZGV7MX0gaWYgdGhlcmUgaXMgYSBidWlsdC1pbiBtb2R1bGUgY2FsbGVkIFx2YXJ7bmFtZX0gd2hpY2gKLWNhbiBiZSBpbml0aWFsaXplZCBhZ2Fpbi4gIFJldHVybiBcY29kZXstMX0gaWYgdGhlcmUgaXMgYSBidWlsdC1pbgotbW9kdWxlIGNhbGxlZCBcdmFye25hbWV9IHdoaWNoIGNhbm5vdCBiZSBpbml0aWFsaXplZCBhZ2FpbiAoc2VlCi1cZnVuY3Rpb257aW5pdF9idWlsdGluKCl9KS4gIFJldHVybiBcY29kZXswfSBpZiB0aGVyZSBpcyBubyBidWlsdC1pbgotbW9kdWxlIGNhbGxlZCBcdmFye25hbWV9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpc19mcm96ZW59e25hbWV9Ci1SZXR1cm4gXGNvZGV7VHJ1ZX0gaWYgdGhlcmUgaXMgYSBmcm96ZW4gbW9kdWxlIChzZWUKLVxmdW5jdGlvbntpbml0X2Zyb3plbigpfSkgY2FsbGVkIFx2YXJ7bmFtZX0sIG9yIFxjb2Rle0ZhbHNlfSBpZiB0aGVyZSBpcwotbm8gc3VjaCBtb2R1bGUuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2xvYWRfY29tcGlsZWR9e25hbWUsIHBhdGhuYW1lLCBcb3B0aW9uYWx7ZmlsZX19Ci1caW5kZXhpaXtmaWxlfXtieXRlLWNvZGV9Ci1Mb2FkIGFuZCBpbml0aWFsaXplIGEgbW9kdWxlIGltcGxlbWVudGVkIGFzIGEgYnl0ZS1jb21waWxlZCBjb2RlIGZpbGUKLWFuZCByZXR1cm4gaXRzIG1vZHVsZSBvYmplY3QuICBJZiB0aGUgbW9kdWxlIHdhcyBhbHJlYWR5IGluaXRpYWxpemVkLAotaXQgd2lsbCBiZSBpbml0aWFsaXplZCBcZW1waHthZ2Fpbn0uICBUaGUgXHZhcntuYW1lfSBhcmd1bWVudCBpcyB1c2VkCi10byBjcmVhdGUgb3IgYWNjZXNzIGEgbW9kdWxlIG9iamVjdC4gIFRoZSBcdmFye3BhdGhuYW1lfSBhcmd1bWVudAotcG9pbnRzIHRvIHRoZSBieXRlLWNvbXBpbGVkIGNvZGUgZmlsZS4gIFRoZSBcdmFye2ZpbGV9Ci1hcmd1bWVudCBpcyB0aGUgYnl0ZS1jb21waWxlZCBjb2RlIGZpbGUsIG9wZW4gZm9yIHJlYWRpbmcgaW4gYmluYXJ5Ci1tb2RlLCBmcm9tIHRoZSBiZWdpbm5pbmcuCi1JdCBtdXN0IGN1cnJlbnRseSBiZSBhIHJlYWwgZmlsZSBvYmplY3QsIG5vdCBhCi11c2VyLWRlZmluZWQgY2xhc3MgZW11bGF0aW5nIGEgZmlsZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bG9hZF9keW5hbWljfXtuYW1lLCBwYXRobmFtZVxvcHRpb25hbHssIGZpbGV9fQotTG9hZCBhbmQgaW5pdGlhbGl6ZSBhIG1vZHVsZSBpbXBsZW1lbnRlZCBhcyBhIGR5bmFtaWNhbGx5IGxvYWRhYmxlCi1zaGFyZWQgbGlicmFyeSBhbmQgcmV0dXJuIGl0cyBtb2R1bGUgb2JqZWN0LiAgSWYgdGhlIG1vZHVsZSB3YXMKLWFscmVhZHkgaW5pdGlhbGl6ZWQsIGl0IHdpbGwgYmUgaW5pdGlhbGl6ZWQgXGVtcGh7YWdhaW59LgotUmUtaW5pdGlhbGl6YXRpb24gaW52b2x2ZXMgY29weWluZyB0aGUgXGNvZGV7X19kaWN0X199IGF0dHJpYnV0ZSBvZiB0aGUgY2FjaGVkCi1pbnN0YW5jZSBvZiB0aGUgbW9kdWxlIG92ZXIgdGhlIHZhbHVlIHVzZWQgaW4gdGhlIG1vZHVsZSBjYWNoZWQgaW4KLVxjb2Rle3N5cy5tb2R1bGVzfS4gIFRoZSBcdmFye3BhdGhuYW1lfSBhcmd1bWVudCBtdXN0IHBvaW50IHRvIHRoZSBzaGFyZWQKLWxpYnJhcnkuICBUaGUgXHZhcntuYW1lfSBhcmd1bWVudCBpcyB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgbmFtZSBvZiB0aGUKLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9uOiBhbiBleHRlcm5hbCBDIGZ1bmN0aW9uIGNhbGxlZAotXHNhbXB7aW5pdFx2YXJ7bmFtZX0oKX0gaW4gdGhlIHNoYXJlZCBsaWJyYXJ5IGlzIGNhbGxlZC4gIFRoZSBvcHRpb25hbAotXHZhcntmaWxlfSBhcmd1bWVudCBpcyBpZ25vcmVkLiAgKE5vdGU6IHVzaW5nIHNoYXJlZCBsaWJyYXJpZXMgaXMgaGlnaGx5Ci1zeXN0ZW0gZGVwZW5kZW50LCBhbmQgbm90IGFsbCBzeXN0ZW1zIHN1cHBvcnQgaXQuKQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtsb2FkX3NvdXJjZX17bmFtZSwgcGF0aG5hbWVcb3B0aW9uYWx7LCBmaWxlfX0KLUxvYWQgYW5kIGluaXRpYWxpemUgYSBtb2R1bGUgaW1wbGVtZW50ZWQgYXMgYSBQeXRob24gc291cmNlIGZpbGUgYW5kCi1yZXR1cm4gaXRzIG1vZHVsZSBvYmplY3QuICBJZiB0aGUgbW9kdWxlIHdhcyBhbHJlYWR5IGluaXRpYWxpemVkLCBpdAotd2lsbCBiZSBpbml0aWFsaXplZCBcZW1waHthZ2Fpbn0uICBUaGUgXHZhcntuYW1lfSBhcmd1bWVudCBpcyB1c2VkIHRvCi1jcmVhdGUgb3IgYWNjZXNzIGEgbW9kdWxlIG9iamVjdC4gIFRoZSBcdmFye3BhdGhuYW1lfSBhcmd1bWVudCBwb2ludHMKLXRvIHRoZSBzb3VyY2UgZmlsZS4gIFRoZSBcdmFye2ZpbGV9IGFyZ3VtZW50IGlzIHRoZSBzb3VyY2UKLWZpbGUsIG9wZW4gZm9yIHJlYWRpbmcgYXMgdGV4dCwgZnJvbSB0aGUgYmVnaW5uaW5nLgotSXQgbXVzdCBjdXJyZW50bHkgYmUgYSByZWFsIGZpbGUKLW9iamVjdCwgbm90IGEgdXNlci1kZWZpbmVkIGNsYXNzIGVtdWxhdGluZyBhIGZpbGUuICBOb3RlIHRoYXQgaWYgYQotcHJvcGVybHkgbWF0Y2hpbmcgYnl0ZS1jb21waWxlZCBmaWxlICh3aXRoIHN1ZmZpeCBcZmlsZXsucHljfSBvcgotXGZpbGV7LnB5b30pIGV4aXN0cywgaXQgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgcGFyc2luZyB0aGUgZ2l2ZW4KLXNvdXJjZSBmaWxlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317TnVsbEltcG9ydGVyfXtwYXRoX3N0cmluZ30KLVRoZSBcY2xhc3N7TnVsbEltcG9ydGVyfSB0eXBlIGlzIGEgXHBlcHszMDJ9IGltcG9ydCBob29rIHRoYXQgaGFuZGxlcwotbm9uLWRpcmVjdG9yeSBwYXRoIHN0cmluZ3MgYnkgZmFpbGluZyB0byBmaW5kIGFueSBtb2R1bGVzLiAgQ2FsbGluZyB0aGlzCi10eXBlIHdpdGggYW4gZXhpc3RpbmcgZGlyZWN0b3J5IG9yIGVtcHR5IHN0cmluZyByYWlzZXMKLVxleGNlcHRpb257SW1wb3J0RXJyb3J9LiAgT3RoZXJ3aXNlLCBhIFxjbGFzc3tOdWxsSW1wb3J0ZXJ9IGluc3RhbmNlIGlzCi1yZXR1cm5lZC4KLQotUHl0aG9uIGFkZHMgaW5zdGFuY2VzIG9mIHRoaXMgdHlwZSB0byBcY29kZXtzeXMucGF0aF9pbXBvcnRlcl9jYWNoZX0gZm9yCi1hbnkgcGF0aCBlbnRyaWVzIHRoYXQgYXJlIG5vdCBkaXJlY3RvcmllcyBhbmQgYXJlIG5vdCBoYW5kbGVkIGJ5IGFueSBvdGhlcgotcGF0aCBob29rcyBvbiBcY29kZXtzeXMucGF0aF9ob29rc30uICBJbnN0YW5jZXMgaGF2ZSBvbmx5IG9uZSBtZXRob2Q6Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtmaW5kX21vZHVsZX17ZnVsbG5hbWUgXG9wdGlvbmFseywgcGF0aH19Ci1UaGlzIG1ldGhvZCBhbHdheXMgcmV0dXJucyBcY29kZXtOb25lfSwgaW5kaWNhdGluZyB0aGF0IHRoZSByZXF1ZXN0ZWQKLW1vZHVsZSBjb3VsZCBub3QgYmUgZm91bmQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVx2ZXJzaW9uYWRkZWR7Mi41fQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxzdWJzZWN0aW9ue0V4YW1wbGVzfQotXGxhYmVse2V4YW1wbGVzLWltcH0KLQotVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBlbXVsYXRlcyB3aGF0IHdhcyB0aGUgc3RhbmRhcmQgaW1wb3J0IHN0YXRlbWVudAotdXAgdG8gUHl0aG9uIDEuNCAobm8gaGllcmFyY2hpY2FsIG1vZHVsZSBuYW1lcykuICAoVGhpcwotXGVtcGh7aW1wbGVtZW50YXRpb259IHdvdWxkbid0IHdvcmsgaW4gdGhhdCB2ZXJzaW9uLCBzaW5jZQotXGZ1bmN0aW9ue2ZpbmRfbW9kdWxlKCl9IGhhcyBiZWVuIGV4dGVuZGVkIGFuZAotXGZ1bmN0aW9ue2xvYWRfbW9kdWxlKCl9IGhhcyBiZWVuIGFkZGVkIGluIDEuNC4pCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCBpbXAKLWltcG9ydCBzeXMKLQotZGVmIF9faW1wb3J0X18obmFtZSwgZ2xvYmFscz1Ob25lLCBsb2NhbHM9Tm9uZSwgZnJvbWxpc3Q9Tm9uZSk6Ci0gICAgIyBGYXN0IHBhdGg6IHNlZSBpZiB0aGUgbW9kdWxlIGhhcyBhbHJlYWR5IGJlZW4gaW1wb3J0ZWQuCi0gICAgdHJ5OgotICAgICAgICByZXR1cm4gc3lzLm1vZHVsZXNbbmFtZV0KLSAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgIHBhc3MKLQotICAgICMgSWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgY2FsbHMgcmFpc2VzIGFuIGV4Y2VwdGlvbiwKLSAgICAjIHRoZXJlJ3MgYSBwcm9ibGVtIHdlIGNhbid0IGhhbmRsZSAtLSBsZXQgdGhlIGNhbGxlciBoYW5kbGUgaXQuCi0KLSAgICBmcCwgcGF0aG5hbWUsIGRlc2NyaXB0aW9uID0gaW1wLmZpbmRfbW9kdWxlKG5hbWUpCi0KLSAgICB0cnk6Ci0gICAgICAgIHJldHVybiBpbXAubG9hZF9tb2R1bGUobmFtZSwgZnAsIHBhdGhuYW1lLCBkZXNjcmlwdGlvbikKLSAgICBmaW5hbGx5OgotICAgICAgICAjIFNpbmNlIHdlIG1heSBleGl0IHZpYSBhbiBleGNlcHRpb24sIGNsb3NlIGZwIGV4cGxpY2l0bHkuCi0gICAgICAgIGlmIGZwOgotICAgICAgICAgICAgZnAuY2xvc2UoKQotXGVuZHt2ZXJiYXRpbX0KLQotQSBtb3JlIGNvbXBsZXRlIGV4YW1wbGUgdGhhdCBpbXBsZW1lbnRzIGhpZXJhcmNoaWNhbCBtb2R1bGUgbmFtZXMgYW5kCi1pbmNsdWRlcyBhIFxmdW5jdGlvbntyZWxvYWQoKX0gZnVuY3Rpb24gY2FuIGJlCi1mb3VuZCBpbiB0aGUgbW9kdWxlIFxtb2R1bGV7a25lZX1ccmVmbW9kaW5kZXh7a25lZX0uICBUaGUKLVxtb2R1bGV7a25lZX0gbW9kdWxlIGNhbiBiZSBmb3VuZCBpbiBcZmlsZXtEZW1vL2ltcHV0aWwvfSBpbiB0aGUKLVB5dGhvbiBzb3VyY2UgZGlzdHJpYnV0aW9uLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJpbnNwZWN0LnRleCBiL0RvYy9saWIvbGliaW5zcGVjdC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YTYzZmMuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJpbnNwZWN0LnRleAorKysgL2Rldi9udWxsCkBAIC0xLDM5MSArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle2luc3BlY3R9IC0tLQotICAgICAgICAgSW5zcGVjdCBsaXZlIG9iamVjdHN9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtpbnNwZWN0fQotXG1vZHVsZXN5bm9wc2lze0V4dHJhY3QgaW5mb3JtYXRpb24gYW5kIHNvdXJjZSBjb2RlIGZyb20gbGl2ZSBvYmplY3RzLn0KLVxtb2R1bGVhdXRob3J7S2EtUGluZyBZZWV9e3BpbmdAbGZ3Lm9yZ30KLVxzZWN0aW9uYXV0aG9ye0thLVBpbmcgWWVlfXtwaW5nQGxmdy5vcmd9Ci0KLVx2ZXJzaW9uYWRkZWR7Mi4xfQotCi1UaGUgXG1vZHVsZXtpbnNwZWN0fSBtb2R1bGUgcHJvdmlkZXMgc2V2ZXJhbCB1c2VmdWwgZnVuY3Rpb25zCi10byBoZWxwIGdldCBpbmZvcm1hdGlvbiBhYm91dCBsaXZlIG9iamVjdHMgc3VjaCBhcyBtb2R1bGVzLAotY2xhc3NlcywgbWV0aG9kcywgZnVuY3Rpb25zLCB0cmFjZWJhY2tzLCBmcmFtZSBvYmplY3RzLCBhbmQKLWNvZGUgb2JqZWN0cy4gIEZvciBleGFtcGxlLCBpdCBjYW4gaGVscCB5b3UgZXhhbWluZSB0aGUKLWNvbnRlbnRzIG9mIGEgY2xhc3MsIHJldHJpZXZlIHRoZSBzb3VyY2UgY29kZSBvZiBhIG1ldGhvZCwKLWV4dHJhY3QgYW5kIGZvcm1hdCB0aGUgYXJndW1lbnQgbGlzdCBmb3IgYSBmdW5jdGlvbiwgb3IKLWdldCBhbGwgdGhlIGluZm9ybWF0aW9uIHlvdSBuZWVkIHRvIGRpc3BsYXkgYSBkZXRhaWxlZCB0cmFjZWJhY2suCi0KLVRoZXJlIGFyZSBmb3VyIG1haW4ga2luZHMgb2Ygc2VydmljZXMgcHJvdmlkZWQgYnkgdGhpcyBtb2R1bGU6Ci10eXBlIGNoZWNraW5nLCBnZXR0aW5nIHNvdXJjZSBjb2RlLCBpbnNwZWN0aW5nIGNsYXNzZXMKLWFuZCBmdW5jdGlvbnMsIGFuZCBleGFtaW5pbmcgdGhlIGludGVycHJldGVyIHN0YWNrLgotCi1cc3Vic2VjdGlvbntUeXBlcyBhbmQgbWVtYmVycwotICAgICAgICAgICAgXGxhYmVse2luc3BlY3QtdHlwZXN9fQotCi1UaGUgXGZ1bmN0aW9ue2dldG1lbWJlcnMoKX0gZnVuY3Rpb24gcmV0cmlldmVzIHRoZSBtZW1iZXJzCi1vZiBhbiBvYmplY3Qgc3VjaCBhcyBhIGNsYXNzIG9yIG1vZHVsZS4KLVRoZSBlbGV2ZW4gZnVuY3Rpb25zIHdob3NlIG5hbWVzIGJlZ2luIHdpdGggYGBpcycnIGFyZSBtYWlubHkKLXByb3ZpZGVkIGFzIGNvbnZlbmllbnQgY2hvaWNlcyBmb3IgdGhlIHNlY29uZCBhcmd1bWVudCB0bwotXGZ1bmN0aW9ue2dldG1lbWJlcnMoKX0uICBUaGV5IGFsc28gaGVscCB5b3UgZGV0ZXJtaW5lIHdoZW4KLXlvdSBjYW4gZXhwZWN0IHRvIGZpbmQgdGhlIGZvbGxvd2luZyBzcGVjaWFsIGF0dHJpYnV0ZXM6Ci0KLVxiZWdpbnt0YWJsZWl2fXtjfGx8bHxjfXt9e1R5cGV9e0F0dHJpYnV0ZX17RGVzY3JpcHRpb259e05vdGVzfQotICBcbGluZWl2e21vZHVsZX17X19kb2NfX317ZG9jdW1lbnRhdGlvbiBzdHJpbmd9e30KLSAgXGxpbmVpdnt9e19fZmlsZV9ffXtmaWxlbmFtZSAobWlzc2luZyBmb3IgYnVpbHQtaW4gbW9kdWxlcyl9e30KLSAgXGhsaW5lCi0gIFxsaW5laXZ7Y2xhc3N9e19fZG9jX199e2RvY3VtZW50YXRpb24gc3RyaW5nfXt9Ci0gIFxsaW5laXZ7fXtfX21vZHVsZV9ffXtuYW1lIG9mIG1vZHVsZSBpbiB3aGljaCB0aGlzIGNsYXNzIHdhcyBkZWZpbmVkfXt9Ci0gIFxobGluZQotICBcbGluZWl2e21ldGhvZH17X19kb2NfX317ZG9jdW1lbnRhdGlvbiBzdHJpbmd9e30KLSAgXGxpbmVpdnt9e19fbmFtZV9ffXtuYW1lIHdpdGggd2hpY2ggdGhpcyBtZXRob2Qgd2FzIGRlZmluZWR9e30KLSAgXGxpbmVpdnt9e2ltX2NsYXNzfXtjbGFzcyBvYmplY3QgdGhhdCBhc2tlZCBmb3IgdGhpcyBtZXRob2R9eygxKX0KLSAgXGxpbmVpdnt9e2ltX2Z1bmN9e2Z1bmN0aW9uIG9iamVjdCBjb250YWluaW5nIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZH17fQotICBcbGluZWl2e317aW1fc2VsZn17aW5zdGFuY2UgdG8gd2hpY2ggdGhpcyBtZXRob2QgaXMgYm91bmQsIG9yIFxjb2Rle05vbmV9fXt9Ci0gIFxobGluZQotICBcbGluZWl2e2Z1bmN0aW9ufXtfX2RvY19ffXtkb2N1bWVudGF0aW9uIHN0cmluZ317fQotICBcbGluZWl2e317X19uYW1lX199e25hbWUgd2l0aCB3aGljaCB0aGlzIGZ1bmN0aW9uIHdhcyBkZWZpbmVkfXt9Ci0gIFxsaW5laXZ7fXtfX2NvZGVfX317Y29kZSBvYmplY3QgY29udGFpbmluZyBjb21waWxlZCBmdW5jdGlvbiBieXRlY29kZX17fQotICBcbGluZWl2e317X19kZWZhdWx0c19ffXt0dXBsZSBvZiBhbnkgZGVmYXVsdCB2YWx1ZXMgZm9yIGFyZ3VtZW50c317fQotICBcbGluZWl2e317X19nbG9iYWxzX199e2dsb2JhbCBuYW1lc3BhY2UgaW4gd2hpY2ggdGhpcyBmdW5jdGlvbiB3YXMgZGVmaW5lZH17fQotICBcaGxpbmUKLSAgXGxpbmVpdnt0cmFjZWJhY2t9e3RiX2ZyYW1lfXtmcmFtZSBvYmplY3QgYXQgdGhpcyBsZXZlbH17fQotICBcbGluZWl2e317dGJfbGFzdGl9e2luZGV4IG9mIGxhc3QgYXR0ZW1wdGVkIGluc3RydWN0aW9uIGluIGJ5dGVjb2RlfXt9Ci0gIFxsaW5laXZ7fXt0Yl9saW5lbm99e2N1cnJlbnQgbGluZSBudW1iZXIgaW4gUHl0aG9uIHNvdXJjZSBjb2RlfXt9Ci0gIFxsaW5laXZ7fXt0Yl9uZXh0fXtuZXh0IGlubmVyIHRyYWNlYmFjayBvYmplY3QgKGNhbGxlZCBieSB0aGlzIGxldmVsKX17fQotICBcaGxpbmUKLSAgXGxpbmVpdntmcmFtZX17Zl9iYWNrfXtuZXh0IG91dGVyIGZyYW1lIG9iamVjdCAodGhpcyBmcmFtZSdzIGNhbGxlcil9e30KLSAgXGxpbmVpdnt9e2ZfYnVpbHRpbnN9e2J1aWx0LWluIG5hbWVzcGFjZSBzZWVuIGJ5IHRoaXMgZnJhbWV9e30KLSAgXGxpbmVpdnt9e2ZfY29kZX17Y29kZSBvYmplY3QgYmVpbmcgZXhlY3V0ZWQgaW4gdGhpcyBmcmFtZX17fQotICBcbGluZWl2e317Zl9leGNfdHJhY2ViYWNrfXt0cmFjZWJhY2sgaWYgcmFpc2VkIGluIHRoaXMgZnJhbWUsIG9yIFxjb2Rle05vbmV9fXt9Ci0gIFxsaW5laXZ7fXtmX2V4Y190eXBlfXtleGNlcHRpb24gdHlwZSBpZiByYWlzZWQgaW4gdGhpcyBmcmFtZSwgb3IgXGNvZGV7Tm9uZX19e30KLSAgXGxpbmVpdnt9e2ZfZXhjX3ZhbHVlfXtleGNlcHRpb24gdmFsdWUgaWYgcmFpc2VkIGluIHRoaXMgZnJhbWUsIG9yIFxjb2Rle05vbmV9fXt9Ci0gIFxsaW5laXZ7fXtmX2dsb2JhbHN9e2dsb2JhbCBuYW1lc3BhY2Ugc2VlbiBieSB0aGlzIGZyYW1lfXt9Ci0gIFxsaW5laXZ7fXtmX2xhc3RpfXtpbmRleCBvZiBsYXN0IGF0dGVtcHRlZCBpbnN0cnVjdGlvbiBpbiBieXRlY29kZX17fQotICBcbGluZWl2e317Zl9saW5lbm99e2N1cnJlbnQgbGluZSBudW1iZXIgaW4gUHl0aG9uIHNvdXJjZSBjb2RlfXt9Ci0gIFxsaW5laXZ7fXtmX2xvY2Fsc317bG9jYWwgbmFtZXNwYWNlIHNlZW4gYnkgdGhpcyBmcmFtZX17fQotICBcbGluZWl2e317Zl9yZXN0cmljdGVkfXswIG9yIDEgaWYgZnJhbWUgaXMgaW4gcmVzdHJpY3RlZCBleGVjdXRpb24gbW9kZX17fQotICBcbGluZWl2e317Zl90cmFjZX17dHJhY2luZyBmdW5jdGlvbiBmb3IgdGhpcyBmcmFtZSwgb3IgXGNvZGV7Tm9uZX19e30KLSAgXGhsaW5lCi0gIFxsaW5laXZ7Y29kZX17Y29fYXJnY291bnR9e251bWJlciBvZiBhcmd1bWVudHMgKG5vdCBpbmNsdWRpbmcgKiBvciAqKiBhcmdzKX17fQotICBcbGluZWl2e317Y29fY29kZX17c3RyaW5nIG9mIHJhdyBjb21waWxlZCBieXRlY29kZX17fQotICBcbGluZWl2e317Y29fY29uc3RzfXt0dXBsZSBvZiBjb25zdGFudHMgdXNlZCBpbiB0aGUgYnl0ZWNvZGV9e30KLSAgXGxpbmVpdnt9e2NvX2ZpbGVuYW1lfXtuYW1lIG9mIGZpbGUgaW4gd2hpY2ggdGhpcyBjb2RlIG9iamVjdCB3YXMgY3JlYXRlZH17fQotICBcbGluZWl2e317Y29fZmlyc3RsaW5lbm99e251bWJlciBvZiBmaXJzdCBsaW5lIGluIFB5dGhvbiBzb3VyY2UgY29kZX17fQotICBcbGluZWl2e317Y29fZmxhZ3N9e2JpdG1hcDogMT1vcHRpbWl6ZWQgXGNvZGV7fH0gMj1uZXdsb2NhbHMgXGNvZGV7fH0gND0qYXJnIFxjb2Rle3x9IDg9Kiphcmd9e30KLSAgXGxpbmVpdnt9e2NvX2xub3RhYn17ZW5jb2RlZCBtYXBwaW5nIG9mIGxpbmUgbnVtYmVycyB0byBieXRlY29kZSBpbmRpY2VzfXt9Ci0gIFxsaW5laXZ7fXtjb19uYW1lfXtuYW1lIHdpdGggd2hpY2ggdGhpcyBjb2RlIG9iamVjdCB3YXMgZGVmaW5lZH17fQotICBcbGluZWl2e317Y29fbmFtZXN9e3R1cGxlIG9mIG5hbWVzIG9mIGxvY2FsIHZhcmlhYmxlc317fQotICBcbGluZWl2e317Y29fbmxvY2Fsc317bnVtYmVyIG9mIGxvY2FsIHZhcmlhYmxlc317fQotICBcbGluZWl2e317Y29fc3RhY2tzaXplfXt2aXJ0dWFsIG1hY2hpbmUgc3RhY2sgc3BhY2UgcmVxdWlyZWR9e30KLSAgXGxpbmVpdnt9e2NvX3Zhcm5hbWVzfXt0dXBsZSBvZiBuYW1lcyBvZiBhcmd1bWVudHMgYW5kIGxvY2FsIHZhcmlhYmxlc317fQotICBcaGxpbmUKLSAgXGxpbmVpdntidWlsdGlufXtfX2RvY19ffXtkb2N1bWVudGF0aW9uIHN0cmluZ317fQotICBcbGluZWl2e317X19uYW1lX199e29yaWdpbmFsIG5hbWUgb2YgdGhpcyBmdW5jdGlvbiBvciBtZXRob2R9e30KLSAgXGxpbmVpdnt9e19fc2VsZl9ffXtpbnN0YW5jZSB0byB3aGljaCBhIG1ldGhvZCBpcyBib3VuZCwgb3IgXGNvZGV7Tm9uZX19e30KLVxlbmR7dGFibGVpdn0KLQotXG5vaW5kZW50Ci1Ob3RlOgotXGJlZ2lue2Rlc2NyaXB0aW9ufQotXGl0ZW1bKDEpXQotXHZlcnNpb25jaGFuZ2VkW1xtZW1iZXJ7aW1fY2xhc3N9IHVzZWQgdG8gcmVmZXIgdG8gdGhlIGNsYXNzIHRoYXQKLSAgICAgICAgICAgICAgICBkZWZpbmVkIHRoZSBtZXRob2RdezIuMn0KLVxlbmR7ZGVzY3JpcHRpb259Ci0KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRtZW1iZXJzfXtvYmplY3Rcb3B0aW9uYWx7LCBwcmVkaWNhdGV9fQotICBSZXR1cm4gYWxsIHRoZSBtZW1iZXJzIG9mIGFuIG9iamVjdCBpbiBhIGxpc3Qgb2YgKG5hbWUsIHZhbHVlKSBwYWlycwotICBzb3J0ZWQgYnkgbmFtZS4gIElmIHRoZSBvcHRpb25hbCBcdmFye3ByZWRpY2F0ZX0gYXJndW1lbnQgaXMgc3VwcGxpZWQsCi0gIG9ubHkgbWVtYmVycyBmb3Igd2hpY2ggdGhlIHByZWRpY2F0ZSByZXR1cm5zIGEgdHJ1ZSB2YWx1ZSBhcmUgaW5jbHVkZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldG1vZHVsZWluZm99e3BhdGh9Ci0gIFJldHVybiBhIHR1cGxlIG9mIHZhbHVlcyB0aGF0IGRlc2NyaWJlIGhvdyBQeXRob24gd2lsbCBpbnRlcnByZXQgdGhlCi0gIGZpbGUgaWRlbnRpZmllZCBieSBcdmFye3BhdGh9IGlmIGl0IGlzIGEgbW9kdWxlLCBvciBcY29kZXtOb25lfSBpZgotICBpdCB3b3VsZCBub3QgYmUgaWRlbnRpZmllZCBhcyBhIG1vZHVsZS4gIFRoZSByZXR1cm4gdHVwbGUgaXMKLSAgXGNvZGV7KFx2YXJ7bmFtZX0sIFx2YXJ7c3VmZml4fSwgXHZhcnttb2RlfSwgXHZhcnttdHlwZX0pfSwgd2hlcmUKLSAgXHZhcntuYW1lfSBpcyB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHdpdGhvdXQgdGhlIG5hbWUgb2YgYW55Ci0gIGVuY2xvc2luZyBwYWNrYWdlLCBcdmFye3N1ZmZpeH0gaXMgdGhlIHRyYWlsaW5nIHBhcnQgb2YgdGhlIGZpbGUKLSAgbmFtZSAod2hpY2ggbWF5IG5vdCBiZSBhIGRvdC1kZWxpbWl0ZWQgZXh0ZW5zaW9uKSwgXHZhcnttb2RlfSBpcyB0aGUKLSAgXGZ1bmN0aW9ue29wZW4oKX0gbW9kZSB0aGF0IHdvdWxkIGJlIHVzZWQgKFxjb2RleydyJ30gb3IKLSAgXGNvZGV7J3JiJ30pLCBhbmQgXHZhcnttdHlwZX0gaXMgYW4gaW50ZWdlciBnaXZpbmcgdGhlIHR5cGUgb2YgdGhlCi0gIG1vZHVsZS4gIFx2YXJ7bXR5cGV9IHdpbGwgaGF2ZSBhIHZhbHVlIHdoaWNoIGNhbiBiZSBjb21wYXJlZCB0byB0aGUKLSAgY29uc3RhbnRzIGRlZmluZWQgaW4gdGhlIFxyZWZtb2R1bGV7aW1wfSBtb2R1bGU7IHNlZSB0aGUKLSAgZG9jdW1lbnRhdGlvbiBmb3IgdGhhdCBtb2R1bGUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gbW9kdWxlIHR5cGVzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRtb2R1bGVuYW1lfXtwYXRofQotICBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSBuYW1lZCBieSB0aGUgZmlsZSBcdmFye3BhdGh9LCB3aXRob3V0Ci0gIGluY2x1ZGluZyB0aGUgbmFtZXMgb2YgZW5jbG9zaW5nIHBhY2thZ2VzLiAgVGhpcyB1c2VzIHRoZSBzYW1lCi0gIGFsZ29yaXRobSBhcyB0aGUgaW50ZXJwcmV0ZXIgdXNlcyB3aGVuIHNlYXJjaGluZyBmb3IgbW9kdWxlcy4gIElmCi0gIHRoZSBuYW1lIGNhbm5vdCBiZSBtYXRjaGVkIGFjY29yZGluZyB0byB0aGUgaW50ZXJwcmV0ZXIncyBydWxlcywKLSAgXGNvZGV7Tm9uZX0gaXMgcmV0dXJuZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2lzbW9kdWxlfXtvYmplY3R9Ci0gIFJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSBtb2R1bGUuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2lzY2xhc3N9e29iamVjdH0KLSAgUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIGNsYXNzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpc21ldGhvZH17b2JqZWN0fQotICBSZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgbWV0aG9kLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpc2Z1bmN0aW9ufXtvYmplY3R9Ci0gIFJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSBQeXRob24gZnVuY3Rpb24gb3IgdW5uYW1lZCAobGFtYmRhKSBmdW5jdGlvbi4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aXN0cmFjZWJhY2t9e29iamVjdH0KLSAgUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIHRyYWNlYmFjay4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aXNmcmFtZX17b2JqZWN0fQotICBSZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgZnJhbWUuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2lzY29kZX17b2JqZWN0fQotICBSZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgY29kZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aXNidWlsdGlufXtvYmplY3R9Ci0gIFJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSBidWlsdC1pbiBmdW5jdGlvbi4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aXNyb3V0aW5lfXtvYmplY3R9Ci0gIFJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSB1c2VyLWRlZmluZWQgb3IgYnVpbHQtaW4gZnVuY3Rpb24gb3IgbWV0aG9kLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpc21ldGhvZGRlc2NyaXB0b3J9e29iamVjdH0KLSAgUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIG1ldGhvZCBkZXNjcmlwdG9yLCBidXQgbm90IGlmIGlzbWV0aG9kKCkgb3IgCi0gIGlzY2xhc3MoKSBvciBpc2Z1bmN0aW9uKCkgYXJlIHRydWUuCi0KLSAgVGhpcyBpcyBuZXcgYXMgb2YgUHl0aG9uIDIuMiwgYW5kLCBmb3IgZXhhbXBsZSwgaXMgdHJ1ZSBvZiBpbnQuX19hZGRfXy4KLSAgQW4gb2JqZWN0IHBhc3NpbmcgdGhpcyB0ZXN0IGhhcyBhIF9fZ2V0X18gYXR0cmlidXRlIGJ1dCBub3QgYSBfX3NldF9fCi0gIGF0dHJpYnV0ZSwgYnV0IGJleW9uZCB0aGF0IHRoZSBzZXQgb2YgYXR0cmlidXRlcyB2YXJpZXMuICBfX25hbWVfXyBpcwotICB1c3VhbGx5IHNlbnNpYmxlLCBhbmQgX19kb2NfXyBvZnRlbiBpcy4KLQotICBNZXRob2RzIGltcGxlbWVudGVkIHZpYSBkZXNjcmlwdG9ycyB0aGF0IGFsc28gcGFzcyBvbmUgb2YgdGhlIG90aGVyCi0gIHRlc3RzIHJldHVybiBmYWxzZSBmcm9tIHRoZSBpc21ldGhvZGRlc2NyaXB0b3IoKSB0ZXN0LCBzaW1wbHkgYmVjYXVzZQotICB0aGUgb3RoZXIgdGVzdHMgcHJvbWlzZSBtb3JlIC0tIHlvdSBjYW4sIGUuZy4sIGNvdW50IG9uIGhhdmluZyB0aGUKLSAgaW1fZnVuYyBhdHRyaWJ1dGUgKGV0Yykgd2hlbiBhbiBvYmplY3QgcGFzc2VzIGlzbWV0aG9kKCkuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2lzZGF0YWRlc2NyaXB0b3J9e29iamVjdH0KLSAgUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIGRhdGEgZGVzY3JpcHRvci4KLQotICBEYXRhIGRlc2NyaXB0b3JzIGhhdmUgYm90aCBhIF9fZ2V0X18gYW5kIGEgX19zZXRfXyBhdHRyaWJ1dGUuICBFeGFtcGxlcyBhcmUKLSAgcHJvcGVydGllcyAoZGVmaW5lZCBpbiBQeXRob24pLCBnZXRzZXRzLCBhbmQgbWVtYmVycy4gIFRoZSBsYXR0ZXIgdHdvIGFyZQotICBkZWZpbmVkIGluIEMgYW5kIHRoZXJlIGFyZSBtb3JlIHNwZWNpZmljIHRlc3RzIGF2YWlsYWJsZSBmb3IgdGhvc2UgdHlwZXMsCi0gIHdoaWNoIGlzIHJvYnVzdCBhY3Jvc3MgUHl0aG9uIGltcGxlbWVudGF0aW9ucy4gIFR5cGljYWxseSwgZGF0YSBkZXNjcmlwdG9ycwotICB3aWxsIGFsc28gaGF2ZSBfX25hbWVfXyBhbmQgX19kb2NfXyBhdHRyaWJ1dGVzIChwcm9wZXJ0aWVzLCBnZXRzZXRzLCBhbmQKLSAgbWVtYmVycyBoYXZlIGJvdGggb2YgdGhlc2UgYXR0cmlidXRlcyksIGJ1dCB0aGlzIGlzIG5vdCBndWFyYW50ZWVkLgotXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2lzZ2V0c2V0ZGVzY3JpcHRvcn17b2JqZWN0fQotICBSZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgZ2V0c2V0IGRlc2NyaXB0b3IuCi0KLSAgZ2V0c2V0cyBhcmUgYXR0cmlidXRlcyBkZWZpbmVkIGluIGV4dGVuc2lvbiBtb2R1bGVzIHZpYSBcY29kZXtQeUdldFNldERlZn0KLSAgc3RydWN0dXJlcy4gIEZvciBQeXRob24gaW1wbGVtZW50YXRpb25zIHdpdGhvdXQgc3VjaCB0eXBlcywgdGhpcyBtZXRob2Qgd2lsbAotICBhbHdheXMgcmV0dXJuIFxjb2Rle0ZhbHNlfS4KLVx2ZXJzaW9uYWRkZWR7Mi41fQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpc21lbWJlcmRlc2NyaXB0b3J9e29iamVjdH0KLSAgUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIG1lbWJlciBkZXNjcmlwdG9yLgotCi0gIE1lbWJlciBkZXNjcmlwdG9ycyBhcmUgYXR0cmlidXRlcyBkZWZpbmVkIGluIGV4dGVuc2lvbiBtb2R1bGVzIHZpYQotICBcY29kZXtQeU1lbWJlckRlZn0gc3RydWN0dXJlcy4gIEZvciBQeXRob24gaW1wbGVtZW50YXRpb25zIHdpdGhvdXQgc3VjaAotICB0eXBlcywgdGhpcyBtZXRob2Qgd2lsbCBhbHdheXMgcmV0dXJuIFxjb2Rle0ZhbHNlfS4KLVx2ZXJzaW9uYWRkZWR7Mi41fQotXGVuZHtmdW5jZGVzY30KLQotXHN1YnNlY3Rpb257UmV0cmlldmluZyBzb3VyY2UgY29kZQotICAgICAgICAgICAgXGxhYmVse2luc3BlY3Qtc291cmNlfX0KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRkb2N9e29iamVjdH0KLSAgR2V0IHRoZSBkb2N1bWVudGF0aW9uIHN0cmluZyBmb3IgYW4gb2JqZWN0LgotICBBbGwgdGFicyBhcmUgZXhwYW5kZWQgdG8gc3BhY2VzLiAgVG8gY2xlYW4gdXAgZG9jc3RyaW5ncyB0aGF0IGFyZQotICBpbmRlbnRlZCB0byBsaW5lIHVwIHdpdGggYmxvY2tzIG9mIGNvZGUsIGFueSB3aGl0ZXNwYWNlIHRoYW4gY2FuIGJlCi0gIHVuaWZvcm1seSByZW1vdmVkIGZyb20gdGhlIHNlY29uZCBsaW5lIG9ud2FyZHMgaXMgcmVtb3ZlZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0Y29tbWVudHN9e29iamVjdH0KLSAgUmV0dXJuIGluIGEgc2luZ2xlIHN0cmluZyBhbnkgbGluZXMgb2YgY29tbWVudHMgaW1tZWRpYXRlbHkgcHJlY2VkaW5nCi0gIHRoZSBvYmplY3QncyBzb3VyY2UgY29kZSAoZm9yIGEgY2xhc3MsIGZ1bmN0aW9uLCBvciBtZXRob2QpLCBvciBhdCB0aGUKLSAgdG9wIG9mIHRoZSBQeXRob24gc291cmNlIGZpbGUgKGlmIHRoZSBvYmplY3QgaXMgYSBtb2R1bGUpLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRmaWxlfXtvYmplY3R9Ci0gIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgKHRleHQgb3IgYmluYXJ5KSBmaWxlIGluIHdoaWNoIGFuIG9iamVjdCB3YXMKLSAgZGVmaW5lZC4gIFRoaXMgd2lsbCBmYWlsIHdpdGggYSBcZXhjZXB0aW9ue1R5cGVFcnJvcn0gaWYgdGhlIG9iamVjdAotICBpcyBhIGJ1aWx0LWluIG1vZHVsZSwgY2xhc3MsIG9yIGZ1bmN0aW9uLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRtb2R1bGV9e29iamVjdH0KLSAgVHJ5IHRvIGd1ZXNzIHdoaWNoIG1vZHVsZSBhbiBvYmplY3Qgd2FzIGRlZmluZWQgaW4uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldHNvdXJjZWZpbGV9e29iamVjdH0KLSAgUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBQeXRob24gc291cmNlIGZpbGUgaW4gd2hpY2ggYW4gb2JqZWN0IHdhcwotICBkZWZpbmVkLiAgVGhpcyB3aWxsIGZhaWwgd2l0aCBhIFxleGNlcHRpb257VHlwZUVycm9yfSBpZiB0aGUgb2JqZWN0Ci0gIGlzIGEgYnVpbHQtaW4gbW9kdWxlLCBjbGFzcywgb3IgZnVuY3Rpb24uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldHNvdXJjZWxpbmVzfXtvYmplY3R9Ci0gIFJldHVybiBhIGxpc3Qgb2Ygc291cmNlIGxpbmVzIGFuZCBzdGFydGluZyBsaW5lIG51bWJlciBmb3IgYW4gb2JqZWN0LgotICBUaGUgYXJndW1lbnQgbWF5IGJlIGEgbW9kdWxlLCBjbGFzcywgbWV0aG9kLCBmdW5jdGlvbiwgdHJhY2ViYWNrLCBmcmFtZSwKLSAgb3IgY29kZSBvYmplY3QuICBUaGUgc291cmNlIGNvZGUgaXMgcmV0dXJuZWQgYXMgYSBsaXN0IG9mIHRoZSBsaW5lcwotICBjb3JyZXNwb25kaW5nIHRvIHRoZSBvYmplY3QgYW5kIHRoZSBsaW5lIG51bWJlciBpbmRpY2F0ZXMgd2hlcmUgaW4gdGhlCi0gIG9yaWdpbmFsIHNvdXJjZSBmaWxlIHRoZSBmaXJzdCBsaW5lIG9mIGNvZGUgd2FzIGZvdW5kLiAgQW4KLSAgXGV4Y2VwdGlvbntJT0Vycm9yfSBpcyByYWlzZWQgaWYgdGhlIHNvdXJjZSBjb2RlIGNhbm5vdCBiZSByZXRyaWV2ZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldHNvdXJjZX17b2JqZWN0fQotICBSZXR1cm4gdGhlIHRleHQgb2YgdGhlIHNvdXJjZSBjb2RlIGZvciBhbiBvYmplY3QuCi0gIFRoZSBhcmd1bWVudCBtYXkgYmUgYSBtb2R1bGUsIGNsYXNzLCBtZXRob2QsIGZ1bmN0aW9uLCB0cmFjZWJhY2ssIGZyYW1lLAotICBvciBjb2RlIG9iamVjdC4gIFRoZSBzb3VyY2UgY29kZSBpcyByZXR1cm5lZCBhcyBhIHNpbmdsZSBzdHJpbmcuICBBbgotICBcZXhjZXB0aW9ue0lPRXJyb3J9IGlzIHJhaXNlZCBpZiB0aGUgc291cmNlIGNvZGUgY2Fubm90IGJlIHJldHJpZXZlZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxzdWJzZWN0aW9ue0NsYXNzZXMgYW5kIGZ1bmN0aW9ucwotICAgICAgICAgICAgXGxhYmVse2luc3BlY3QtY2xhc3Nlcy1mdW5jdGlvbnN9fQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldGNsYXNzdHJlZX17Y2xhc3Nlc1xvcHRpb25hbHssIHVuaXF1ZX19Ci0gIEFycmFuZ2UgdGhlIGdpdmVuIGxpc3Qgb2YgY2xhc3NlcyBpbnRvIGEgaGllcmFyY2h5IG9mIG5lc3RlZCBsaXN0cy4KLSAgV2hlcmUgYSBuZXN0ZWQgbGlzdCBhcHBlYXJzLCBpdCBjb250YWlucyBjbGFzc2VzIGRlcml2ZWQgZnJvbSB0aGUgY2xhc3MKLSAgd2hvc2UgZW50cnkgaW1tZWRpYXRlbHkgcHJlY2VkZXMgdGhlIGxpc3QuICBFYWNoIGVudHJ5IGlzIGEgMi10dXBsZQotICBjb250YWluaW5nIGEgY2xhc3MgYW5kIGEgdHVwbGUgb2YgaXRzIGJhc2UgY2xhc3Nlcy4gIElmIHRoZSBcdmFye3VuaXF1ZX0KLSAgYXJndW1lbnQgaXMgdHJ1ZSwgZXhhY3RseSBvbmUgZW50cnkgYXBwZWFycyBpbiB0aGUgcmV0dXJuZWQgc3RydWN0dXJlCi0gIGZvciBlYWNoIGNsYXNzIGluIHRoZSBnaXZlbiBsaXN0LiAgT3RoZXJ3aXNlLCBjbGFzc2VzIHVzaW5nIG11bHRpcGxlCi0gIGluaGVyaXRhbmNlIGFuZCB0aGVpciBkZXNjZW5kYW50cyB3aWxsIGFwcGVhciBtdWx0aXBsZSB0aW1lcy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0YXJnc3BlY317ZnVuY30KLSAgR2V0IHRoZSBuYW1lcyBhbmQgZGVmYXVsdCB2YWx1ZXMgb2YgYSBmdW5jdGlvbidzIGFyZ3VtZW50cy4KLSAgQSB0dXBsZSBvZiBmb3VyIHRoaW5ncyBpcyByZXR1cm5lZDogXGNvZGV7KFx2YXJ7YXJnc30sCi0gICAgXHZhcnt2YXJhcmdzfSwgXHZhcnt2YXJrd30sIFx2YXJ7ZGVmYXVsdHN9KX0uCi0gIFx2YXJ7YXJnc30gaXMgYSBsaXN0IG9mIHRoZSBhcmd1bWVudCBuYW1lcyAoaXQgbWF5IGNvbnRhaW4gbmVzdGVkIGxpc3RzKS4KLSAgXHZhcnt2YXJhcmdzfSBhbmQgXHZhcnt2YXJrd30gYXJlIHRoZSBuYW1lcyBvZiB0aGUgXGNvZGV7Kn0gYW5kCi0gIFxjb2RleyoqfSBhcmd1bWVudHMgb3IgXGNvZGV7Tm9uZX0uCi0gIFx2YXJ7ZGVmYXVsdHN9IGlzIGEgdHVwbGUgb2YgZGVmYXVsdCBhcmd1bWVudCB2YWx1ZXMgb3IgTm9uZSBpZiB0aGVyZSBhcmUgbm8KLSAgZGVmYXVsdCBhcmd1bWVudHM7IGlmIHRoaXMgdHVwbGUgaGFzIFx2YXJ7bn0gZWxlbWVudHMsIHRoZXkgY29ycmVzcG9uZCB0bwotICB0aGUgbGFzdCBcdmFye259IGVsZW1lbnRzIGxpc3RlZCBpbiBcdmFye2FyZ3N9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRhcmd2YWx1ZXN9e2ZyYW1lfQotICBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYXJndW1lbnRzIHBhc3NlZCBpbnRvIGEgcGFydGljdWxhciBmcmFtZS4KLSAgQSB0dXBsZSBvZiBmb3VyIHRoaW5ncyBpcyByZXR1cm5lZDogXGNvZGV7KFx2YXJ7YXJnc30sCi0gICAgXHZhcnt2YXJhcmdzfSwgXHZhcnt2YXJrd30sIFx2YXJ7bG9jYWxzfSl9LgotICBcdmFye2FyZ3N9IGlzIGEgbGlzdCBvZiB0aGUgYXJndW1lbnQgbmFtZXMgKGl0IG1heSBjb250YWluIG5lc3RlZAotICBsaXN0cykuCi0gIFx2YXJ7dmFyYXJnc30gYW5kIFx2YXJ7dmFya3d9IGFyZSB0aGUgbmFtZXMgb2YgdGhlIFxjb2Rleyp9IGFuZAotICBcY29kZXsqKn0gYXJndW1lbnRzIG9yIFxjb2Rle05vbmV9LgotICBcdmFye2xvY2Fsc30gaXMgdGhlIGxvY2FscyBkaWN0aW9uYXJ5IG9mIHRoZSBnaXZlbiBmcmFtZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Zm9ybWF0YXJnc3BlY317YXJnc1xvcHRpb25hbHssIHZhcmFyZ3MsIHZhcmt3LCBkZWZhdWx0cywKLSAgICAgIGZvcm1hdGFyZywgZm9ybWF0dmFyYXJncywgZm9ybWF0dmFya3csIGZvcm1hdHZhbHVlLCBqb2lufX0KLQotICBGb3JtYXQgYSBwcmV0dHkgYXJndW1lbnQgc3BlYyBmcm9tIHRoZSBmb3VyIHZhbHVlcyByZXR1cm5lZCBieQotICBcZnVuY3Rpb257Z2V0YXJnc3BlYygpfS4gIFRoZSBmb3JtYXQqIGFyZ3VtZW50cyBhcmUgdGhlCi0gIGNvcnJlc3BvbmRpbmcgb3B0aW9uYWwgZm9ybWF0dGluZyBmdW5jdGlvbnMgdGhhdCBhcmUgY2FsbGVkIHRvIHR1cm4KLSAgbmFtZXMgYW5kIHZhbHVlcyBpbnRvIHN0cmluZ3MuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2Zvcm1hdGFyZ3ZhbHVlc317YXJnc1xvcHRpb25hbHssIHZhcmFyZ3MsIHZhcmt3LCBsb2NhbHMsCi0gICAgICBmb3JtYXRhcmcsIGZvcm1hdHZhcmFyZ3MsIGZvcm1hdHZhcmt3LCBmb3JtYXR2YWx1ZSwgam9pbn19Ci0gIEZvcm1hdCBhIHByZXR0eSBhcmd1bWVudCBzcGVjIGZyb20gdGhlIGZvdXIgdmFsdWVzIHJldHVybmVkIGJ5Ci0gIFxmdW5jdGlvbntnZXRhcmd2YWx1ZXMoKX0uICBUaGUgZm9ybWF0KiBhcmd1bWVudHMgYXJlIHRoZQotICBjb3JyZXNwb25kaW5nIG9wdGlvbmFsIGZvcm1hdHRpbmcgZnVuY3Rpb25zIHRoYXQgYXJlIGNhbGxlZCB0byB0dXJuCi0gIG5hbWVzIGFuZCB2YWx1ZXMgaW50byBzdHJpbmdzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRtcm99e2Nsc30KLSAgUmV0dXJuIGEgdHVwbGUgb2YgY2xhc3MgY2xzJ3MgYmFzZSBjbGFzc2VzLCBpbmNsdWRpbmcgY2xzLCBpbgotICBtZXRob2QgcmVzb2x1dGlvbiBvcmRlci4gIE5vIGNsYXNzIGFwcGVhcnMgbW9yZSB0aGFuIG9uY2UgaW4gdGhpcyB0dXBsZS4KLSAgTm90ZSB0aGF0IHRoZSBtZXRob2QgcmVzb2x1dGlvbiBvcmRlciBkZXBlbmRzIG9uIGNscydzIHR5cGUuICBVbmxlc3MgYQotICB2ZXJ5IHBlY3VsaWFyIHVzZXItZGVmaW5lZCBtZXRhdHlwZSBpcyBpbiB1c2UsIGNscyB3aWxsIGJlIHRoZSBmaXJzdAotICBlbGVtZW50IG9mIHRoZSB0dXBsZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxzdWJzZWN0aW9ue1RoZSBpbnRlcnByZXRlciBzdGFjawotICAgICAgICAgICAgXGxhYmVse2luc3BlY3Qtc3RhY2t9fQotCi1XaGVuIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHJldHVybiBgYGZyYW1lIHJlY29yZHMsJycgZWFjaCByZWNvcmQKLWlzIGEgdHVwbGUgb2Ygc2l4IGl0ZW1zOiB0aGUgZnJhbWUgb2JqZWN0LCB0aGUgZmlsZW5hbWUsCi10aGUgbGluZSBudW1iZXIgb2YgdGhlIGN1cnJlbnQgbGluZSwgdGhlIGZ1bmN0aW9uIG5hbWUsIGEgbGlzdCBvZgotbGluZXMgb2YgY29udGV4dCBmcm9tIHRoZSBzb3VyY2UgY29kZSwgYW5kIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudAotbGluZSB3aXRoaW4gdGhhdCBsaXN0LgotCi1cYmVnaW57bm90aWNlfVt3YXJuaW5nXQotS2VlcGluZyByZWZlcmVuY2VzIHRvIGZyYW1lIG9iamVjdHMsIGFzIGZvdW5kIGluCi10aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgZnJhbWUgcmVjb3JkcyB0aGVzZSBmdW5jdGlvbnMgcmV0dXJuLCBjYW4KLWNhdXNlIHlvdXIgcHJvZ3JhbSB0byBjcmVhdGUgcmVmZXJlbmNlIGN5Y2xlcy4gIE9uY2UgYSByZWZlcmVuY2UgY3ljbGUKLWhhcyBiZWVuIGNyZWF0ZWQsIHRoZSBsaWZlc3BhbiBvZiBhbGwgb2JqZWN0cyB3aGljaCBjYW4gYmUgYWNjZXNzZWQKLWZyb20gdGhlIG9iamVjdHMgd2hpY2ggZm9ybSB0aGUgY3ljbGUgY2FuIGJlY29tZSBtdWNoIGxvbmdlciBldmVuIGlmCi1QeXRob24ncyBvcHRpb25hbCBjeWNsZSBkZXRlY3RvciBpcyBlbmFibGVkLiAgSWYgc3VjaCBjeWNsZXMgbXVzdCBiZQotY3JlYXRlZCwgaXQgaXMgaW1wb3J0YW50IHRvIGVuc3VyZSB0aGV5IGFyZSBleHBsaWNpdGx5IGJyb2tlbiB0byBhdm9pZAotdGhlIGRlbGF5ZWQgZGVzdHJ1Y3Rpb24gb2Ygb2JqZWN0cyBhbmQgaW5jcmVhc2VkIG1lbW9yeSBjb25zdW1wdGlvbgotd2hpY2ggb2NjdXJzLgotCi1UaG91Z2ggdGhlIGN5Y2xlIGRldGVjdG9yIHdpbGwgY2F0Y2ggdGhlc2UsIGRlc3RydWN0aW9uIG9mIHRoZSBmcmFtZXMKLShhbmQgbG9jYWwgdmFyaWFibGVzKSBjYW4gYmUgbWFkZSBkZXRlcm1pbmlzdGljIGJ5IHJlbW92aW5nIHRoZSBjeWNsZQotaW4gYSBca2V5d29yZHtmaW5hbGx5fSBjbGF1c2UuICBUaGlzIGlzIGFsc28gaW1wb3J0YW50IGlmIHRoZSBjeWNsZQotZGV0ZWN0b3Igd2FzIGRpc2FibGVkIHdoZW4gUHl0aG9uIHdhcyBjb21waWxlZCBvciB1c2luZwotXGZ1bmN0aW9ue1xyZWZtb2R1bGV7Z2N9LmRpc2FibGUoKX0uICBGb3IgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotZGVmIGhhbmRsZV9zdGFja2ZyYW1lX3dpdGhvdXRfbGVhaygpOgotICAgIGZyYW1lID0gaW5zcGVjdC5jdXJyZW50ZnJhbWUoKQotICAgIHRyeToKLSAgICAgICAgIyBkbyBzb21ldGhpbmcgd2l0aCB0aGUgZnJhbWUKLSAgICBmaW5hbGx5OgotICAgICAgICBkZWwgZnJhbWUKLVxlbmR7dmVyYmF0aW19Ci1cZW5ke25vdGljZX0KLQotVGhlIG9wdGlvbmFsIFx2YXJ7Y29udGV4dH0gYXJndW1lbnQgc3VwcG9ydGVkIGJ5IG1vc3Qgb2YgdGhlc2UKLWZ1bmN0aW9ucyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBsaW5lcyBvZiBjb250ZXh0IHRvIHJldHVybiwgd2hpY2gKLWFyZSBjZW50ZXJlZCBhcm91bmQgdGhlIGN1cnJlbnQgbGluZS4KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRmcmFtZWluZm99e2ZyYW1lXG9wdGlvbmFseywgY29udGV4dH19Ci0gIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIGZyYW1lIG9yIHRyYWNlYmFjayBvYmplY3QuICBBIDUtdHVwbGUKLSAgaXMgcmV0dXJuZWQsIHRoZSBsYXN0IGZpdmUgZWxlbWVudHMgb2YgdGhlIGZyYW1lJ3MgZnJhbWUgcmVjb3JkLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRvdXRlcmZyYW1lc317ZnJhbWVcb3B0aW9uYWx7LCBjb250ZXh0fX0KLSAgR2V0IGEgbGlzdCBvZiBmcmFtZSByZWNvcmRzIGZvciBhIGZyYW1lIGFuZCBhbGwgb3V0ZXIgZnJhbWVzLiAgVGhlc2UKLSAgZnJhbWVzIHJlcHJlc2VudCB0aGUgY2FsbHMgdGhhdCBsZWFkIHRvIHRoZSBjcmVhdGlvbiBvZiBcdmFye2ZyYW1lfS4KLSAgVGhlIGZpcnN0IGVudHJ5IGluIHRoZSByZXR1cm5lZCBsaXN0IHJlcHJlc2VudHMgXHZhcntmcmFtZX07IHRoZQotICBsYXN0IGVudHJ5IHJlcHJlc2VudHMgdGhlIG91dGVybW9zdCBjYWxsIG9uIFx2YXJ7ZnJhbWV9J3Mgc3RhY2suCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldGlubmVyZnJhbWVzfXt0cmFjZWJhY2tcb3B0aW9uYWx7LCBjb250ZXh0fX0KLSAgR2V0IGEgbGlzdCBvZiBmcmFtZSByZWNvcmRzIGZvciBhIHRyYWNlYmFjaydzIGZyYW1lIGFuZCBhbGwgaW5uZXIKLSAgZnJhbWVzLiAgVGhlc2UgZnJhbWVzIHJlcHJlc2VudCBjYWxscyBtYWRlIGFzIGEgY29uc2VxdWVuY2Ugb2YKLSAgXHZhcntmcmFtZX0uICBUaGUgZmlyc3QgZW50cnkgaW4gdGhlIGxpc3QgcmVwcmVzZW50cwotICBcdmFye3RyYWNlYmFja307IHRoZSBsYXN0IGVudHJ5IHJlcHJlc2VudHMgd2hlcmUgdGhlIGV4Y2VwdGlvbiB3YXMKLSAgcmFpc2VkLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtjdXJyZW50ZnJhbWV9e30KLSAgUmV0dXJuIHRoZSBmcmFtZSBvYmplY3QgZm9yIHRoZSBjYWxsZXIncyBzdGFjayBmcmFtZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c3RhY2t9e1xvcHRpb25hbHtjb250ZXh0fX0KLSAgUmV0dXJuIGEgbGlzdCBvZiBmcmFtZSByZWNvcmRzIGZvciB0aGUgY2FsbGVyJ3Mgc3RhY2suICBUaGUgZmlyc3QKLSAgZW50cnkgaW4gdGhlIHJldHVybmVkIGxpc3QgcmVwcmVzZW50cyB0aGUgY2FsbGVyOyB0aGUgbGFzdCBlbnRyeQotICByZXByZXNlbnRzIHRoZSBvdXRlcm1vc3QgY2FsbCBvbiB0aGUgc3RhY2suCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3RyYWNlfXtcb3B0aW9uYWx7Y29udGV4dH19Ci0gIFJldHVybiBhIGxpc3Qgb2YgZnJhbWUgcmVjb3JkcyBmb3IgdGhlIHN0YWNrIGJldHdlZW4gdGhlIGN1cnJlbnQKLSAgZnJhbWUgYW5kIHRoZSBmcmFtZSBpbiB3aGljaCBhbiBleGNlcHRpb24gY3VycmVudGx5IGJlaW5nIGhhbmRsZWQKLSAgd2FzIHJhaXNlZCBpbi4gIFRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgbGlzdCByZXByZXNlbnRzIHRoZSBjYWxsZXI7Ci0gIHRoZSBsYXN0IGVudHJ5IHJlcHJlc2VudHMgd2hlcmUgdGhlIGV4Y2VwdGlvbiB3YXMgcmFpc2VkLgotXGVuZHtmdW5jZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliaW50cm8udGV4IGIvRG9jL2xpYi9saWJpbnRyby50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNDM0Y2QuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJpbnRyby50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi1cY2hhcHRlcntJbnRyb2R1Y3Rpb259Ci1cbGFiZWx7aW50cm99Ci0KLVRoZSBgYFB5dGhvbiBsaWJyYXJ5JycgY29udGFpbnMgc2V2ZXJhbCBkaWZmZXJlbnQga2luZHMgb2YgY29tcG9uZW50cy4KLQotSXQgY29udGFpbnMgZGF0YSB0eXBlcyB0aGF0IHdvdWxkIG5vcm1hbGx5IGJlIGNvbnNpZGVyZWQgcGFydCBvZiB0aGUKLWBgY29yZScnIG9mIGEgbGFuZ3VhZ2UsIHN1Y2ggYXMgbnVtYmVycyBhbmQgbGlzdHMuICBGb3IgdGhlc2UgdHlwZXMsCi10aGUgUHl0aG9uIGxhbmd1YWdlIGNvcmUgZGVmaW5lcyB0aGUgZm9ybSBvZiBsaXRlcmFscyBhbmQgcGxhY2VzIHNvbWUKLWNvbnN0cmFpbnRzIG9uIHRoZWlyIHNlbWFudGljcywgYnV0IGRvZXMgbm90IGZ1bGx5IGRlZmluZSB0aGUKLXNlbWFudGljcy4gIChPbiB0aGUgb3RoZXIgaGFuZCwgdGhlIGxhbmd1YWdlIGNvcmUgZG9lcyBkZWZpbmUKLXN5bnRhY3RpYyBwcm9wZXJ0aWVzIGxpa2UgdGhlIHNwZWxsaW5nIGFuZCBwcmlvcml0aWVzIG9mIG9wZXJhdG9ycy4pCi0KLVRoZSBsaWJyYXJ5IGFsc28gY29udGFpbnMgYnVpbHQtaW4gZnVuY3Rpb25zIGFuZCBleGNlcHRpb25zIC0tLQotb2JqZWN0cyB0aGF0IGNhbiBiZSB1c2VkIGJ5IGFsbCBQeXRob24gY29kZSB3aXRob3V0IHRoZSBuZWVkIG9mIGFuCi1ca2V5d29yZHtpbXBvcnR9IHN0YXRlbWVudC4gIFNvbWUgb2YgdGhlc2UgYXJlIGRlZmluZWQgYnkgdGhlIGNvcmUKLWxhbmd1YWdlLCBidXQgbWFueSBhcmUgbm90IGVzc2VudGlhbCBmb3IgdGhlIGNvcmUgc2VtYW50aWNzIGFuZCBhcmUKLW9ubHkgZGVzY3JpYmVkIGhlcmUuCi0KLVRoZSBidWxrIG9mIHRoZSBsaWJyYXJ5LCBob3dldmVyLCBjb25zaXN0cyBvZiBhIGNvbGxlY3Rpb24gb2YgbW9kdWxlcy4KLVRoZXJlIGFyZSBtYW55IHdheXMgdG8gZGlzc2VjdCB0aGlzIGNvbGxlY3Rpb24uICBTb21lIG1vZHVsZXMgYXJlCi13cml0dGVuIGluIEMgYW5kIGJ1aWx0IGluIHRvIHRoZSBQeXRob24gaW50ZXJwcmV0ZXI7IG90aGVycyBhcmUKLXdyaXR0ZW4gaW4gUHl0aG9uIGFuZCBpbXBvcnRlZCBpbiBzb3VyY2UgZm9ybS4gIFNvbWUgbW9kdWxlcyBwcm92aWRlCi1pbnRlcmZhY2VzIHRoYXQgYXJlIGhpZ2hseSBzcGVjaWZpYyB0byBQeXRob24sIGxpa2UgcHJpbnRpbmcgYSBzdGFjawotdHJhY2U7IHNvbWUgcHJvdmlkZSBpbnRlcmZhY2VzIHRoYXQgYXJlIHNwZWNpZmljIHRvIHBhcnRpY3VsYXIKLW9wZXJhdGluZyBzeXN0ZW1zLCBzdWNoIGFzIGFjY2VzcyB0byBzcGVjaWZpYyBoYXJkd2FyZTsgb3RoZXJzIHByb3ZpZGUKLWludGVyZmFjZXMgdGhhdCBhcmUKLXNwZWNpZmljIHRvIGEgcGFydGljdWxhciBhcHBsaWNhdGlvbiBkb21haW4sIGxpa2UgdGhlIFdvcmxkIFdpZGUgV2ViLgotU29tZSBtb2R1bGVzIGFyZSBhdmFpbGFibGUgaW4gYWxsIHZlcnNpb25zIGFuZCBwb3J0cyBvZiBQeXRob247IG90aGVycwotYXJlIG9ubHkgYXZhaWxhYmxlIHdoZW4gdGhlIHVuZGVybHlpbmcgc3lzdGVtIHN1cHBvcnRzIG9yIHJlcXVpcmVzCi10aGVtOyB5ZXQgb3RoZXJzIGFyZSBhdmFpbGFibGUgb25seSB3aGVuIGEgcGFydGljdWxhciBjb25maWd1cmF0aW9uCi1vcHRpb24gd2FzIGNob3NlbiBhdCB0aGUgdGltZSB3aGVuIFB5dGhvbiB3YXMgY29tcGlsZWQgYW5kIGluc3RhbGxlZC4KLQotVGhpcyBtYW51YWwgaXMgb3JnYW5pemVkIGBgZnJvbSB0aGUgaW5zaWRlIG91dDonJyBpdCBmaXJzdCBkZXNjcmliZXMKLXRoZSBidWlsdC1pbiBkYXRhIHR5cGVzLCB0aGVuIHRoZSBidWlsdC1pbiBmdW5jdGlvbnMgYW5kIGV4Y2VwdGlvbnMsCi1hbmQgZmluYWxseSB0aGUgbW9kdWxlcywgZ3JvdXBlZCBpbiBjaGFwdGVycyBvZiByZWxhdGVkIG1vZHVsZXMuICBUaGUKLW9yZGVyaW5nIG9mIHRoZSBjaGFwdGVycyBhcyB3ZWxsIGFzIHRoZSBvcmRlcmluZyBvZiB0aGUgbW9kdWxlcyB3aXRoaW4KLWVhY2ggY2hhcHRlciBpcyByb3VnaGx5IGZyb20gbW9zdCByZWxldmFudCB0byBsZWFzdCBpbXBvcnRhbnQuCi0KLVRoaXMgbWVhbnMgdGhhdCBpZiB5b3Ugc3RhcnQgcmVhZGluZyB0aGlzIG1hbnVhbCBmcm9tIHRoZSBzdGFydCwgYW5kCi1za2lwIHRvIHRoZSBuZXh0IGNoYXB0ZXIgd2hlbiB5b3UgZ2V0IGJvcmVkLCB5b3Ugd2lsbCBnZXQgYSByZWFzb25hYmxlCi1vdmVydmlldyBvZiB0aGUgYXZhaWxhYmxlIG1vZHVsZXMgYW5kIGFwcGxpY2F0aW9uIGFyZWFzIHRoYXQgYXJlCi1zdXBwb3J0ZWQgYnkgdGhlIFB5dGhvbiBsaWJyYXJ5LiAgT2YgY291cnNlLCB5b3UgZG9uJ3QgXGVtcGh7aGF2ZX0gdG8KLXJlYWQgaXQgbGlrZSBhIG5vdmVsIC0tLSB5b3UgY2FuIGFsc28gYnJvd3NlIHRoZSB0YWJsZSBvZiBjb250ZW50cyAoaW4KLWZyb250IG9mIHRoZSBtYW51YWwpLCBvciBsb29rIGZvciBhIHNwZWNpZmljIGZ1bmN0aW9uLCBtb2R1bGUgb3IgdGVybQotaW4gdGhlIGluZGV4IChpbiB0aGUgYmFjaykuICBBbmQgZmluYWxseSwgaWYgeW91IGVuam95IGxlYXJuaW5nIGFib3V0Ci1yYW5kb20gc3ViamVjdHMsIHlvdSBjaG9vc2UgYSByYW5kb20gcGFnZSBudW1iZXIgKHNlZSBtb2R1bGUKLVxyZWZtb2R1bGV7cmFuZG9tfSkgYW5kIHJlYWQgYSBzZWN0aW9uIG9yIHR3by4gIFJlZ2FyZGxlc3Mgb2YgdGhlCi1vcmRlciBpbiB3aGljaCB5b3UgcmVhZCB0aGUgc2VjdGlvbnMgb2YgdGhpcyBtYW51YWwsIGl0IGhlbHBzIHRvIHN0YXJ0IAotd2l0aCBjaGFwdGVyIFxyZWZ7YnVpbHRpbn0sIGBgQnVpbHQtaW4gVHlwZXMsIEV4Y2VwdGlvbnMgYW5kCi1GdW5jdGlvbnMsJycgYXMgdGhlIHJlbWFpbmRlciBvZiB0aGUgbWFudWFsIGFzc3VtZXMgZmFtaWxpYXJpdHkgd2l0aAotdGhpcyBtYXRlcmlhbC4KLQotTGV0IHRoZSBzaG93IGJlZ2luIQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJpdGVydG9vbHMudGV4IGIvRG9jL2xpYi9saWJpdGVydG9vbHMudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDc4NGE4Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGliaXRlcnRvb2xzLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDU3NSArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle2l0ZXJ0b29sc30gLS0tCi0gICAgICAgICBGdW5jdGlvbnMgY3JlYXRpbmcgaXRlcmF0b3JzIGZvciBlZmZpY2llbnQgbG9vcGluZ30KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2l0ZXJ0b29sc30KLVxtb2R1bGVzeW5vcHNpc3tGdW5jdGlvbnMgY3JlYXRpbmcgaXRlcmF0b3JzIGZvciBlZmZpY2llbnQgbG9vcGluZy59Ci1cbW9kdWxlYXV0aG9ye1JheW1vbmQgSGV0dGluZ2VyfXtweXRob25AcmNuLmNvbX0KLVxzZWN0aW9uYXV0aG9ye1JheW1vbmQgSGV0dGluZ2VyfXtweXRob25AcmNuLmNvbX0KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotCi0KLVRoaXMgbW9kdWxlIGltcGxlbWVudHMgYSBudW1iZXIgb2YgaXRlcmF0b3IgYnVpbGRpbmcgYmxvY2tzIGluc3BpcmVkCi1ieSBjb25zdHJ1Y3RzIGZyb20gdGhlIEhhc2tlbGwgYW5kIFNNTCBwcm9ncmFtbWluZyBsYW5ndWFnZXMuICBFYWNoCi1oYXMgYmVlbiByZWNhc3QgaW4gYSBmb3JtIHN1aXRhYmxlIGZvciBQeXRob24uCi0KLVRoZSBtb2R1bGUgc3RhbmRhcmRpemVzIGEgY29yZSBzZXQgb2YgZmFzdCwgbWVtb3J5IGVmZmljaWVudCB0b29scwotdGhhdCBhcmUgdXNlZnVsIGJ5IHRoZW1zZWx2ZXMgb3IgaW4gY29tYmluYXRpb24uICBTdGFuZGFyZGl6YXRpb24gaGVscHMKLWF2b2lkIHRoZSByZWFkYWJpbGl0eSBhbmQgcmVsaWFiaWxpdHkgcHJvYmxlbXMgd2hpY2ggYXJpc2Ugd2hlbiBtYW55Ci1kaWZmZXJlbnQgaW5kaXZpZHVhbHMgY3JlYXRlIHRoZWlyIG93biBzbGlnaHRseSB2YXJ5aW5nIGltcGxlbWVudGF0aW9ucywKLWVhY2ggd2l0aCB0aGVpciBvd24gcXVpcmtzIGFuZCBuYW1pbmcgY29udmVudGlvbnMuCi0KLVRoZSB0b29scyBhcmUgZGVzaWduZWQgdG8gY29tYmluZSByZWFkaWx5IHdpdGggb25lIGFub3RoZXIuICBUaGlzIG1ha2VzCi1pdCBlYXN5IHRvIGNvbnN0cnVjdCBtb3JlIHNwZWNpYWxpemVkIHRvb2xzIHN1Y2NpbmN0bHkgYW5kIGVmZmljaWVudGx5Ci1pbiBwdXJlIFB5dGhvbi4KLQotRm9yIGluc3RhbmNlLCBTTUwgcHJvdmlkZXMgYSB0YWJ1bGF0aW9uIHRvb2w6IFxjb2Rle3RhYnVsYXRlKGYpfQotd2hpY2ggcHJvZHVjZXMgYSBzZXF1ZW5jZSBcY29kZXtmKDApLCBmKDEpLCAuLi59LiAgVGhpcyB0b29sYm94Ci1wcm92aWRlcyBcZnVuY3Rpb257aW1hcCgpfSBhbmQgXGZ1bmN0aW9ue2NvdW50KCl9IHdoaWNoIGNhbiBiZSBjb21iaW5lZAotdG8gZm9ybSBcY29kZXtpbWFwKGYsIGNvdW50KCkpfSBhbmQgcHJvZHVjZSBhbiBlcXVpdmFsZW50IHJlc3VsdC4KLQotTGlrZXdpc2UsIHRoZSBmdW5jdGlvbmFsIHRvb2xzIGFyZSBkZXNpZ25lZCB0byB3b3JrIHdlbGwgd2l0aCB0aGUKLWhpZ2gtc3BlZWQgZnVuY3Rpb25zIHByb3ZpZGVkIGJ5IHRoZSBccmVmbW9kdWxle29wZXJhdG9yfSBtb2R1bGUuCi0KLVRoZSBtb2R1bGUgYXV0aG9yIHdlbGNvbWVzIHN1Z2dlc3Rpb25zIGZvciBvdGhlciBiYXNpYyBidWlsZGluZyBibG9ja3MKLXRvIGJlIGFkZGVkIHRvIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGUgbW9kdWxlLgotCi1XaGV0aGVyIGNhc3QgaW4gcHVyZSBweXRob24gZm9ybSBvciBjb21waWxlZCBjb2RlLCB0b29scyB0aGF0IHVzZSBpdGVyYXRvcnMKLWFyZSBtb3JlIG1lbW9yeSBlZmZpY2llbnQgKGFuZCBmYXN0ZXIpIHRoYW4gdGhlaXIgbGlzdCBiYXNlZCBjb3VudGVycGFydHMuCi1BZG9wdGluZyB0aGUgcHJpbmNpcGxlcyBvZiBqdXN0LWluLXRpbWUgbWFudWZhY3R1cmluZywgdGhleSBjcmVhdGUKLWRhdGEgd2hlbiBhbmQgd2hlcmUgbmVlZGVkIGluc3RlYWQgb2YgY29uc3VtaW5nIG1lbW9yeSB3aXRoIHRoZQotY29tcHV0ZXIgZXF1aXZhbGVudCBvZiBgYGludmVudG9yeScnLgotCi1UaGUgcGVyZm9ybWFuY2UgYWR2YW50YWdlIG9mIGl0ZXJhdG9ycyBiZWNvbWVzIG1vcmUgYWN1dGUgYXMgdGhlIG51bWJlcgotb2YgZWxlbWVudHMgaW5jcmVhc2VzIC0tIGF0IHNvbWUgcG9pbnQsIGxpc3RzIGdyb3cgbGFyZ2UgZW5vdWdoIHRvCi1zZXZlcmVseSBpbXBhY3QgbWVtb3J5IGNhY2hlIHBlcmZvcm1hbmNlIGFuZCBzdGFydCBydW5uaW5nIHNsb3dseS4KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWV0ZXh0e1RoZSBTdGFuZGFyZCBNTCBCYXNpcyBMaWJyYXJ5LAotICAgICAgICAgICBcY2l0ZXRpdGxlW2h0dHA6Ly93d3cuc3RhbmRhcmRtbC5vcmcvQmFzaXMvXQotICAgICAgICAgICB7VGhlIFN0YW5kYXJkIE1MIEJhc2lzIExpYnJhcnl9Ln0KLQotICBcc2VldGV4dHtIYXNrZWxsLCBBIFB1cmVseSBGdW5jdGlvbmFsIExhbmd1YWdlLAotICAgICAgICAgICBcY2l0ZXRpdGxlW2h0dHA6Ly93d3cuaGFza2VsbC5vcmcvZGVmaW5pdGlvbi9dCi0gICAgICAgICAgIHtEZWZpbml0aW9uIG9mIEhhc2tlbGwgYW5kIHRoZSBTdGFuZGFyZCBMaWJyYXJpZXN9Ln0KLVxlbmR7c2VlYWxzb30KLQotCi1cc3Vic2VjdGlvbntJdGVydG9vbCBmdW5jdGlvbnMgXGxhYmVse2l0ZXJ0b29scy1mdW5jdGlvbnN9fQotCi1UaGUgZm9sbG93aW5nIG1vZHVsZSBmdW5jdGlvbnMgYWxsIGNvbnN0cnVjdCBhbmQgcmV0dXJuIGl0ZXJhdG9ycy4KLVNvbWUgcHJvdmlkZSBzdHJlYW1zIG9mIGluZmluaXRlIGxlbmd0aCwgc28gdGhleSBzaG91bGQgb25seSBiZSBhY2Nlc3NlZAotYnkgZnVuY3Rpb25zIG9yIGxvb3BzIHRoYXQgdHJ1bmNhdGUgdGhlIHN0cmVhbS4KLQotXGJlZ2lue2Z1bmNkZXNjfXtjaGFpbn17Kml0ZXJhYmxlc30KLSAgTWFrZSBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgZWxlbWVudHMgZnJvbSB0aGUgZmlyc3QgaXRlcmFibGUgdW50aWwKLSAgaXQgaXMgZXhoYXVzdGVkLCB0aGVuIHByb2NlZWRzIHRvIHRoZSBuZXh0IGl0ZXJhYmxlLCB1bnRpbCBhbGwgb2YgdGhlCi0gIGl0ZXJhYmxlcyBhcmUgZXhoYXVzdGVkLiAgVXNlZCBmb3IgdHJlYXRpbmcgY29uc2VjdXRpdmUgc2VxdWVuY2VzIGFzCi0gIGEgc2luZ2xlIHNlcXVlbmNlLiAgRXF1aXZhbGVudCB0bzoKLQotICBcYmVnaW57dmVyYmF0aW19Ci0gICAgIGRlZiBjaGFpbigqaXRlcmFibGVzKToKLSAgICAgICAgIGZvciBpdCBpbiBpdGVyYWJsZXM6Ci0gICAgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gaXQ6Ci0gICAgICAgICAgICAgICAgIHlpZWxkIGVsZW1lbnQKLSAgXGVuZHt2ZXJiYXRpbX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y291bnR9e1xvcHRpb25hbHtufX0KLSAgTWFrZSBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgY29uc2VjdXRpdmUgaW50ZWdlcnMgc3RhcnRpbmcgd2l0aCBcdmFye259LgotICBJZiBub3Qgc3BlY2lmaWVkIFx2YXJ7bn0gZGVmYXVsdHMgdG8gemVyby4gIAotICBEb2VzIG5vdCBjdXJyZW50bHkgc3VwcG9ydCBweXRob24gbG9uZyBpbnRlZ2Vycy4gIE9mdGVuIHVzZWQgYXMgYW4KLSAgYXJndW1lbnQgdG8gXGZ1bmN0aW9ue2ltYXAoKX0gdG8gZ2VuZXJhdGUgY29uc2VjdXRpdmUgZGF0YSBwb2ludHMuCi0gIEFsc28sIHVzZWQgd2l0aCBcZnVuY3Rpb257aXppcCgpfSB0byBhZGQgc2VxdWVuY2UgbnVtYmVycy4gIEVxdWl2YWxlbnQgdG86Ci0KLSAgXGJlZ2lue3ZlcmJhdGltfQotICAgICBkZWYgY291bnQobj0wKToKLSAgICAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgICAgICAgeWllbGQgbgotICAgICAgICAgICAgIG4gKz0gMQotICBcZW5ke3ZlcmJhdGltfQotCi0gIE5vdGUsIFxmdW5jdGlvbntjb3VudCgpfSBkb2VzIG5vdCBjaGVjayBmb3Igb3ZlcmZsb3cgYW5kIHdpbGwgcmV0dXJuCi0gIG5lZ2F0aXZlIG51bWJlcnMgYWZ0ZXIgZXhjZWVkaW5nIFxjb2Rle3N5cy5tYXhpbnR9LiAgVGhpcyBiZWhhdmlvcgotICBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2N5Y2xlfXtpdGVyYWJsZX0KLSAgTWFrZSBhbiBpdGVyYXRvciByZXR1cm5pbmcgZWxlbWVudHMgZnJvbSB0aGUgaXRlcmFibGUgYW5kIHNhdmluZyBhCi0gIGNvcHkgb2YgZWFjaC4gIFdoZW4gdGhlIGl0ZXJhYmxlIGlzIGV4aGF1c3RlZCwgcmV0dXJuIGVsZW1lbnRzIGZyb20KLSAgdGhlIHNhdmVkIGNvcHkuICBSZXBlYXRzIGluZGVmaW5pdGVseS4gIEVxdWl2YWxlbnQgdG86Ci0KLSAgXGJlZ2lue3ZlcmJhdGltfQotICAgICBkZWYgY3ljbGUoaXRlcmFibGUpOgotICAgICAgICAgc2F2ZWQgPSBbXQotICAgICAgICAgZm9yIGVsZW1lbnQgaW4gaXRlcmFibGU6Ci0gICAgICAgICAgICAgeWllbGQgZWxlbWVudAotICAgICAgICAgICAgIHNhdmVkLmFwcGVuZChlbGVtZW50KQotICAgICAgICAgd2hpbGUgc2F2ZWQ6Ci0gICAgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gc2F2ZWQ6Ci0gICAgICAgICAgICAgICAgICAgeWllbGQgZWxlbWVudAotICBcZW5ke3ZlcmJhdGltfQotCi0gIE5vdGUsIHRoaXMgbWVtYmVyIG9mIHRoZSB0b29sa2l0IG1heSByZXF1aXJlIHNpZ25pZmljYW50Ci0gIGF1eGlsaWFyeSBzdG9yYWdlIChkZXBlbmRpbmcgb24gdGhlIGxlbmd0aCBvZiB0aGUgaXRlcmFibGUpLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtkcm9wd2hpbGV9e3ByZWRpY2F0ZSwgaXRlcmFibGV9Ci0gIE1ha2UgYW4gaXRlcmF0b3IgdGhhdCBkcm9wcyBlbGVtZW50cyBmcm9tIHRoZSBpdGVyYWJsZSBhcyBsb25nIGFzCi0gIHRoZSBwcmVkaWNhdGUgaXMgdHJ1ZTsgYWZ0ZXJ3YXJkcywgcmV0dXJucyBldmVyeSBlbGVtZW50LiAgTm90ZSwKLSAgdGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb2R1Y2UgXGVtcGh7YW55fSBvdXRwdXQgdW50aWwgdGhlIHByZWRpY2F0ZQotICBmaXJzdCBiZWNvbWVzIGZhbHNlLCBzbyBpdCBtYXkgaGF2ZSBhIGxlbmd0aHkgc3RhcnQtdXAgdGltZS4gIEVxdWl2YWxlbnQgdG86Ci0KLSAgXGJlZ2lue3ZlcmJhdGltfQotICAgICBkZWYgZHJvcHdoaWxlKHByZWRpY2F0ZSwgaXRlcmFibGUpOgotICAgICAgICAgaXRlcmFibGUgPSBpdGVyKGl0ZXJhYmxlKQotICAgICAgICAgZm9yIHggaW4gaXRlcmFibGU6Ci0gICAgICAgICAgICAgaWYgbm90IHByZWRpY2F0ZSh4KToKLSAgICAgICAgICAgICAgICAgeWllbGQgeAotICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgZm9yIHggaW4gaXRlcmFibGU6Ci0gICAgICAgICAgICAgeWllbGQgeAotICBcZW5ke3ZlcmJhdGltfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtncm91cGJ5fXtpdGVyYWJsZVxvcHRpb25hbHssIGtleX19Ci0gIE1ha2UgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIGNvbnNlY3V0aXZlIGtleXMgYW5kIGdyb3VwcyBmcm9tIHRoZQotICBcdmFye2l0ZXJhYmxlfS4gVGhlIFx2YXJ7a2V5fSBpcyBhIGZ1bmN0aW9uIGNvbXB1dGluZyBhIGtleSB2YWx1ZSBmb3IgZWFjaAotICBlbGVtZW50LiAgSWYgbm90IHNwZWNpZmllZCBvciBpcyBcY29kZXtOb25lfSwgXHZhcntrZXl9IGRlZmF1bHRzIHRvIGFuCi0gIGlkZW50aXR5IGZ1bmN0aW9uIGFuZCByZXR1cm5zICB0aGUgZWxlbWVudCB1bmNoYW5nZWQuICBHZW5lcmFsbHksIHRoZQotICBpdGVyYWJsZSBuZWVkcyB0byBhbHJlYWR5IGJlIHNvcnRlZCBvbiB0aGUgc2FtZSBrZXkgZnVuY3Rpb24uCi0KLSAgVGhlIG9wZXJhdGlvbiBvZiBcZnVuY3Rpb257Z3JvdXBieSgpfSBpcyBzaW1pbGFyIHRvIHRoZSBcY29kZXt1bmlxfSBmaWx0ZXIKLSAgaW4gXFVOSVh7fS4gIEl0IGdlbmVyYXRlcyBhIGJyZWFrIG9yIG5ldyBncm91cCBldmVyeSB0aW1lIHRoZSB2YWx1ZQotICBvZiB0aGUga2V5IGZ1bmN0aW9uIGNoYW5nZXMgKHdoaWNoIGlzIHdoeSBpdCBpcyB1c3VhbGx5IG5lY2Vzc2FyeQotICB0byBoYXZlIHNvcnRlZCB0aGUgZGF0YSB1c2luZyB0aGUgc2FtZSBrZXkgZnVuY3Rpb24pLiAgVGhhdCBiZWhhdmlvcgotICBkaWZmZXJzIGZyb20gU1FMJ3MgR1JPVVAgQlkgd2hpY2ggYWdncmVnYXRlcyBjb21tb24gZWxlbWVudHMgcmVnYXJkbGVzcwotICBvZiB0aGVpciBpbnB1dCBvcmRlci4KLQotICBUaGUgcmV0dXJuZWQgZ3JvdXAgaXMgaXRzZWxmIGFuIGl0ZXJhdG9yIHRoYXQgc2hhcmVzIHRoZSB1bmRlcmx5aW5nCi0gIGl0ZXJhYmxlIHdpdGggXGZ1bmN0aW9ue2dyb3VwYnkoKX0uICBCZWNhdXNlIHRoZSBzb3VyY2UgaXMgc2hhcmVkLCB3aGVuCi0gIHRoZSBcZnVuY3Rpb257Z3JvdXBieX0gb2JqZWN0IGlzIGFkdmFuY2VkLCB0aGUgcHJldmlvdXMgZ3JvdXAgaXMgbm8KLSAgbG9uZ2VyIHZpc2libGUuICBTbywgaWYgdGhhdCBkYXRhIGlzIG5lZWRlZCBsYXRlciwgaXQgc2hvdWxkIGJlIHN0b3JlZAotICBhcyBhIGxpc3Q6Ci0KLSAgXGJlZ2lue3ZlcmJhdGltfQotICAgIGdyb3VwcyA9IFtdCi0gICAgdW5pcXVla2V5cyA9IFtdCi0gICAgZGF0YSA9IHNvcnRlZChkYXRhLCBrZXk9a2V5ZnVuYykKLSAgICBmb3IgaywgZyBpbiBncm91cGJ5KGRhdGEsIGtleWZ1bmMpOgotICAgICAgICBncm91cHMuYXBwZW5kKGxpc3QoZykpICAgICAgIyBTdG9yZSBncm91cCBpdGVyYXRvciBhcyBhIGxpc3QKLSAgICAgICAgdW5pcXVla2V5cy5hcHBlbmQoaykKLSAgXGVuZHt2ZXJiYXRpbX0KLQotICBcZnVuY3Rpb257Z3JvdXBieSgpfSBpcyBlcXVpdmFsZW50IHRvOgotCi0gIFxiZWdpbnt2ZXJiYXRpbX0KLSAgICBjbGFzcyBncm91cGJ5KG9iamVjdCk6Ci0gICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpdGVyYWJsZSwga2V5PU5vbmUpOgotICAgICAgICAgICAgaWYga2V5IGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAga2V5ID0gbGFtYmRhIHg6IHgKLSAgICAgICAgICAgIHNlbGYua2V5ZnVuYyA9IGtleQotICAgICAgICAgICAgc2VsZi5pdCA9IGl0ZXIoaXRlcmFibGUpCi0gICAgICAgICAgICBzZWxmLnRndGtleSA9IHNlbGYuY3VycmtleSA9IHNlbGYuY3VycnZhbHVlID0gW10KLSAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYKLSAgICAgICAgZGVmIF9fbmV4dF9fKHNlbGYpOgotICAgICAgICAgICAgd2hpbGUgc2VsZi5jdXJya2V5ID09IHNlbGYudGd0a2V5OgotICAgICAgICAgICAgICAgIHNlbGYuY3VycnZhbHVlID0gbmV4dChzZWxmLml0KSAjIEV4aXQgb24gU3RvcEl0ZXJhdGlvbgotICAgICAgICAgICAgICAgIHNlbGYuY3VycmtleSA9IHNlbGYua2V5ZnVuYyhzZWxmLmN1cnJ2YWx1ZSkKLSAgICAgICAgICAgIHNlbGYudGd0a2V5ID0gc2VsZi5jdXJya2V5Ci0gICAgICAgICAgICByZXR1cm4gKHNlbGYuY3VycmtleSwgc2VsZi5fZ3JvdXBlcihzZWxmLnRndGtleSkpCi0gICAgICAgIGRlZiBfZ3JvdXBlcihzZWxmLCB0Z3RrZXkpOgotICAgICAgICAgICAgd2hpbGUgc2VsZi5jdXJya2V5ID09IHRndGtleToKLSAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmN1cnJ2YWx1ZQotICAgICAgICAgICAgICAgIHNlbGYuY3VycnZhbHVlID0gbmV4dChzZWxmLml0KSAjIEV4aXQgb24gU3RvcEl0ZXJhdGlvbgotICAgICAgICAgICAgICAgIHNlbGYuY3VycmtleSA9IHNlbGYua2V5ZnVuYyhzZWxmLmN1cnJ2YWx1ZSkKLSAgXGVuZHt2ZXJiYXRpbX0KLSAgXHZlcnNpb25hZGRlZHsyLjR9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2lmaWx0ZXJ9e3ByZWRpY2F0ZSwgaXRlcmFibGV9Ci0gIE1ha2UgYW4gaXRlcmF0b3IgdGhhdCBmaWx0ZXJzIGVsZW1lbnRzIGZyb20gaXRlcmFibGUgcmV0dXJuaW5nIG9ubHkKLSAgdGhvc2UgZm9yIHdoaWNoIHRoZSBwcmVkaWNhdGUgaXMgXGNvZGV7VHJ1ZX0uCi0gIElmIFx2YXJ7cHJlZGljYXRlfSBpcyBcY29kZXtOb25lfSwgcmV0dXJuIHRoZSBpdGVtcyB0aGF0IGFyZSB0cnVlLgotICBFcXVpdmFsZW50IHRvOgotCi0gIFxiZWdpbnt2ZXJiYXRpbX0KLSAgICAgZGVmIGlmaWx0ZXIocHJlZGljYXRlLCBpdGVyYWJsZSk6Ci0gICAgICAgICBpZiBwcmVkaWNhdGUgaXMgTm9uZToKLSAgICAgICAgICAgICBwcmVkaWNhdGUgPSBib29sCi0gICAgICAgICBmb3IgeCBpbiBpdGVyYWJsZToKLSAgICAgICAgICAgICBpZiBwcmVkaWNhdGUoeCk6Ci0gICAgICAgICAgICAgICAgIHlpZWxkIHgKLSAgXGVuZHt2ZXJiYXRpbX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aWZpbHRlcmZhbHNlfXtwcmVkaWNhdGUsIGl0ZXJhYmxlfQotICBNYWtlIGFuIGl0ZXJhdG9yIHRoYXQgZmlsdGVycyBlbGVtZW50cyBmcm9tIGl0ZXJhYmxlIHJldHVybmluZyBvbmx5Ci0gIHRob3NlIGZvciB3aGljaCB0aGUgcHJlZGljYXRlIGlzIFxjb2Rle0ZhbHNlfS4KLSAgSWYgXHZhcntwcmVkaWNhdGV9IGlzIFxjb2Rle05vbmV9LCByZXR1cm4gdGhlIGl0ZW1zIHRoYXQgYXJlIGZhbHNlLgotICBFcXVpdmFsZW50IHRvOgotCi0gIFxiZWdpbnt2ZXJiYXRpbX0KLSAgICAgZGVmIGlmaWx0ZXJmYWxzZShwcmVkaWNhdGUsIGl0ZXJhYmxlKToKLSAgICAgICAgIGlmIHByZWRpY2F0ZSBpcyBOb25lOgotICAgICAgICAgICAgIHByZWRpY2F0ZSA9IGJvb2wKLSAgICAgICAgIGZvciB4IGluIGl0ZXJhYmxlOgotICAgICAgICAgICAgIGlmIG5vdCBwcmVkaWNhdGUoeCk6Ci0gICAgICAgICAgICAgICAgIHlpZWxkIHgKLSAgXGVuZHt2ZXJiYXRpbX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aW1hcH17ZnVuY3Rpb24sICppdGVyYWJsZXN9Ci0gIE1ha2UgYW4gaXRlcmF0b3IgdGhhdCBjb21wdXRlcyB0aGUgZnVuY3Rpb24gdXNpbmcgYXJndW1lbnRzIGZyb20KLSAgZWFjaCBvZiB0aGUgaXRlcmFibGVzLiAgSWYgXHZhcntmdW5jdGlvbn0gaXMgc2V0IHRvIFxjb2Rle05vbmV9LCB0aGVuCi0gIFxmdW5jdGlvbntpbWFwKCl9IHJldHVybnMgdGhlIGFyZ3VtZW50cyBhcyBhIHR1cGxlLiAgTGlrZQotICBcZnVuY3Rpb257bWFwKCl9IGJ1dCBzdG9wcyB3aGVuIHRoZSBzaG9ydGVzdCBpdGVyYWJsZSBpcyBleGhhdXN0ZWQKLSAgaW5zdGVhZCBvZiBmaWxsaW5nIGluIFxjb2Rle05vbmV9IGZvciBzaG9ydGVyIGl0ZXJhYmxlcy4gIFRoZSByZWFzb24KLSAgZm9yIHRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgaW5maW5pdGUgaXRlcmF0b3IgYXJndW1lbnRzIGFyZSB0eXBpY2FsbHkKLSAgYW4gZXJyb3IgZm9yIFxmdW5jdGlvbnttYXAoKX0gKGJlY2F1c2UgdGhlIG91dHB1dCBpcyBmdWxseSBldmFsdWF0ZWQpCi0gIGJ1dCByZXByZXNlbnQgYSBjb21tb24gYW5kIHVzZWZ1bCB3YXkgb2Ygc3VwcGx5aW5nIGFyZ3VtZW50cyB0bwotICBcZnVuY3Rpb257aW1hcCgpfS4KLSAgRXF1aXZhbGVudCB0bzoKLQotICBcYmVnaW57dmVyYmF0aW19Ci0gICAgIGRlZiBpbWFwKGZ1bmN0aW9uLCAqaXRlcmFibGVzKToKLSAgICAgICAgIGl0ZXJhYmxlcyA9IG1hcChpdGVyLCBpdGVyYWJsZXMpCi0gICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgIGFyZ3MgPSBbbmV4dChpKSBmb3IgaSBpbiBpdGVyYWJsZXNdCi0gICAgICAgICAgICAgaWYgZnVuY3Rpb24gaXMgTm9uZToKLSAgICAgICAgICAgICAgICAgeWllbGQgdHVwbGUoYXJncykKLSAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICB5aWVsZCBmdW5jdGlvbigqYXJncykKLSAgXGVuZHt2ZXJiYXRpbX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aXNsaWNlfXtpdGVyYWJsZSwgXG9wdGlvbmFse3N0YXJ0LH0gc3RvcCBcb3B0aW9uYWx7LCBzdGVwfX0KLSAgTWFrZSBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgc2VsZWN0ZWQgZWxlbWVudHMgZnJvbSB0aGUgaXRlcmFibGUuCi0gIElmIFx2YXJ7c3RhcnR9IGlzIG5vbi16ZXJvLCB0aGVuIGVsZW1lbnRzIGZyb20gdGhlIGl0ZXJhYmxlIGFyZSBza2lwcGVkCi0gIHVudGlsIHN0YXJ0IGlzIHJlYWNoZWQuICBBZnRlcndhcmQsIGVsZW1lbnRzIGFyZSByZXR1cm5lZCBjb25zZWN1dGl2ZWx5Ci0gIHVubGVzcyBcdmFye3N0ZXB9IGlzIHNldCBoaWdoZXIgdGhhbiBvbmUgd2hpY2ggcmVzdWx0cyBpbiBpdGVtcyBiZWluZwotICBza2lwcGVkLiAgSWYgXHZhcntzdG9wfSBpcyBcY29kZXtOb25lfSwgdGhlbiBpdGVyYXRpb24gY29udGludWVzIHVudGlsCi0gIHRoZSBpdGVyYXRvciBpcyBleGhhdXN0ZWQsIGlmIGF0IGFsbDsgb3RoZXJ3aXNlLCBpdCBzdG9wcyBhdCB0aGUgc3BlY2lmaWVkCi0gIHBvc2l0aW9uLiAgVW5saWtlIHJlZ3VsYXIgc2xpY2luZywKLSAgXGZ1bmN0aW9ue2lzbGljZSgpfSBkb2VzIG5vdCBzdXBwb3J0IG5lZ2F0aXZlIHZhbHVlcyBmb3IgXHZhcntzdGFydH0sCi0gIFx2YXJ7c3RvcH0sIG9yIFx2YXJ7c3RlcH0uICBDYW4gYmUgdXNlZCB0byBleHRyYWN0IHJlbGF0ZWQgZmllbGRzCi0gIGZyb20gZGF0YSB3aGVyZSB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGhhcyBiZWVuIGZsYXR0ZW5lZCAoZm9yCi0gIGV4YW1wbGUsIGEgbXVsdGktbGluZSByZXBvcnQgbWF5IGxpc3QgYSBuYW1lIGZpZWxkIG9uIGV2ZXJ5Ci0gIHRoaXJkIGxpbmUpLiAgRXF1aXZhbGVudCB0bzoKLQotICBcYmVnaW57dmVyYmF0aW19Ci0gICAgIGRlZiBpc2xpY2UoaXRlcmFibGUsICphcmdzKToKLSAgICAgICAgIHMgPSBzbGljZSgqYXJncykKLSAgICAgICAgIGl0ID0gaXRlcihyYW5nZShzLnN0YXJ0IG9yIDAsIHMuc3RvcCBvciBzeXMubWF4aW50LCBzLnN0ZXAgb3IgMSkpCi0gICAgICAgICBuZXh0aSA9IG5leHQoaXQpCi0gICAgICAgICBmb3IgaSwgZWxlbWVudCBpbiBlbnVtZXJhdGUoaXRlcmFibGUpOgotICAgICAgICAgICAgIGlmIGkgPT0gbmV4dGk6Ci0gICAgICAgICAgICAgICAgIHlpZWxkIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgbmV4dGkgPSBuZXh0KGl0KQotICBcZW5ke3ZlcmJhdGltfQotCi0gIElmIFx2YXJ7c3RhcnR9IGlzIFxjb2Rle05vbmV9LCB0aGVuIGl0ZXJhdGlvbiBzdGFydHMgYXQgemVyby4KLSAgSWYgXHZhcntzdGVwfSBpcyBcY29kZXtOb25lfSwgdGhlbiB0aGUgc3RlcCBkZWZhdWx0cyB0byBvbmUuCi0gIFx2ZXJzaW9uY2hhbmdlZFthY2NlcHQgXGNvZGV7Tm9uZX0gdmFsdWVzIGZvciBkZWZhdWx0IFx2YXJ7c3RhcnR9IGFuZAotICAgICAgICAgICAgICAgICAgXHZhcntzdGVwfV17Mi41fQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpemlwfXsqaXRlcmFibGVzfQotICBNYWtlIGFuIGl0ZXJhdG9yIHRoYXQgYWdncmVnYXRlcyBlbGVtZW50cyBmcm9tIGVhY2ggb2YgdGhlIGl0ZXJhYmxlcy4KLSAgTGlrZSBcZnVuY3Rpb257emlwKCl9IGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgYW4gaXRlcmF0b3IgaW5zdGVhZCBvZgotICBhIGxpc3QuICBVc2VkIGZvciBsb2NrLXN0ZXAgaXRlcmF0aW9uIG92ZXIgc2V2ZXJhbCBpdGVyYWJsZXMgYXQgYQotICB0aW1lLiAgRXF1aXZhbGVudCB0bzoKLQotICBcYmVnaW57dmVyYmF0aW19Ci0gICAgIGRlZiBpemlwKCppdGVyYWJsZXMpOgotICAgICAgICAgaXRlcmFibGVzID0gbWFwKGl0ZXIsIGl0ZXJhYmxlcykKLSAgICAgICAgIHdoaWxlIGl0ZXJhYmxlczoKLSAgICAgICAgICAgICByZXN1bHQgPSBbbmV4dChpdCkgZm9yIGl0IGluIGl0ZXJhYmxlc10KLSAgICAgICAgICAgICB5aWVsZCB0dXBsZShyZXN1bHQpCi0gIFxlbmR7dmVyYmF0aW19Ci0KLSAgXHZlcnNpb25jaGFuZ2VkW1doZW4gbm8gaXRlcmFibGVzIGFyZSBzcGVjaWZpZWQsIHJldHVybnMgYSB6ZXJvIGxlbmd0aAotICAgICAgICAgICAgICAgICAgaXRlcmF0b3IgaW5zdGVhZCBvZiByYWlzaW5nIGEgXGV4Y2VwdGlvbntUeXBlRXJyb3J9Ci0JCSAgZXhjZXB0aW9uXXsyLjR9Ci0KLSAgTm90ZSwgdGhlIGxlZnQtdG8tcmlnaHQgZXZhbHVhdGlvbiBvcmRlciBvZiB0aGUgaXRlcmFibGVzIGlzIGd1YXJhbnRlZWQuCi0gIFRoaXMgbWFrZXMgcG9zc2libGUgYW4gaWRpb20gZm9yIGNsdXN0ZXJpbmcgYSBkYXRhIHNlcmllcyBpbnRvIG4tbGVuZ3RoCi0gIGdyb3VwcyB1c2luZyBcc2FtcHtpemlwKCpbaXRlcihzKV0qbil9LiAgRm9yIGRhdGEgdGhhdCBkb2Vzbid0IGZpdAotICBuLWxlbmd0aCBncm91cHMgZXhhY3RseSwgdGhlIGxhc3QgdHVwbGUgY2FuIGJlIHByZS1wYWRkZWQgd2l0aCBmaWxsCi0gIHZhbHVlcyB1c2luZyBcc2FtcHtpemlwKCpbY2hhaW4ocywgW05vbmVdKihuLTEpKV0qbil9LgotICAgICAgICAgCi0gIE5vdGUsIHdoZW4gXGZ1bmN0aW9ue2l6aXAoKX0gaXMgdXNlZCB3aXRoIHVuZXF1YWwgbGVuZ3RoIGlucHV0cywgc3Vic2VxdWVudAotICBpdGVyYXRpb24gb3ZlciB0aGUgbG9uZ2VyIGl0ZXJhYmxlcyBjYW5ub3QgcmVsaWFibHkgYmUgY29udGludWVkIGFmdGVyCi0gIFxmdW5jdGlvbntpemlwKCl9IHRlcm1pbmF0ZXMuICBQb3RlbnRpYWxseSwgdXAgdG8gb25lIGVudHJ5IHdpbGwgYmUgbWlzc2luZwotICBmcm9tIGVhY2ggb2YgdGhlIGxlZnQtb3ZlciBpdGVyYWJsZXMuIFRoaXMgb2NjdXJzIGJlY2F1c2UgYSB2YWx1ZSBpcyBmZXRjaGVkCi0gIGZyb20gZWFjaCBpdGVyYXRvciBpbi10dXJuLCBidXQgdGhlIHByb2Nlc3MgZW5kcyB3aGVuIG9uZSBvZiB0aGUgaXRlcmF0b3JzCi0gIHRlcm1pbmF0ZXMuICBUaGlzIGxlYXZlcyB0aGUgbGFzdCBmZXRjaGVkIHZhbHVlcyBpbiBsaW1ibyAodGhleSBjYW5ub3QgYmUKLSAgcmV0dXJuZWQgaW4gYSBmaW5hbCwgaW5jb21wbGV0ZSB0dXBsZSBhbmQgdGhleSBhcmUgY2Fubm90IGJlIHB1c2hlZCBiYWNrCi0gIGludG8gdGhlIGl0ZXJhdG9yIGZvciByZXRyaWV2YWwgd2l0aCBcY29kZXtuZXh0KGl0KX0pLiAgSW4gZ2VuZXJhbCwKLSAgXGZ1bmN0aW9ue2l6aXAoKX0gc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoIHVuZXF1YWwgbGVuZ3RoIGlucHV0cyB3aGVuIHlvdQotICBkb24ndCBjYXJlIGFib3V0IHRyYWlsaW5nLCB1bm1hdGNoZWQgdmFsdWVzIGZyb20gdGhlIGxvbmdlciBpdGVyYWJsZXMuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2l6aXBfbG9uZ2VzdH17Kml0ZXJhYmxlc1xvcHRpb25hbHssIGZpbGx2YWx1ZX19Ci0gIE1ha2UgYW4gaXRlcmF0b3IgdGhhdCBhZ2dyZWdhdGVzIGVsZW1lbnRzIGZyb20gZWFjaCBvZiB0aGUgaXRlcmFibGVzLgotICBJZiB0aGUgaXRlcmFibGVzIGFyZSBvZiB1bmV2ZW4gbGVuZ3RoLCBtaXNzaW5nIHZhbHVlcyBhcmUgZmlsbGVkLWluCi0gIHdpdGggXHZhcntmaWxsdmFsdWV9LiAgSXRlcmF0aW9uIGNvbnRpbnVlcyB1bnRpbCB0aGUgbG9uZ2VzdCBpdGVyYWJsZQotICBpcyBleGhhdXN0ZWQuICBFcXVpdmFsZW50IHRvOgotCi0gIFxiZWdpbnt2ZXJiYXRpbX0KLSAgICBkZWYgaXppcF9sb25nZXN0KCphcmdzLCAqKmt3ZHMpOgotICAgICAgICBmaWxsdmFsdWUgPSBrd2RzLmdldCgnZmlsbHZhbHVlJykKLSAgICAgICAgZGVmIHNlbnRpbmVsKGNvdW50ZXIgPSAoW2ZpbGx2YWx1ZV0qKGxlbihhcmdzKS0xKSkucG9wKToKLSAgICAgICAgICAgIHlpZWxkIGNvdW50ZXIoKSAgICAgICAgICMgeWllbGRzIHRoZSBmaWxsdmFsdWUsIG9yIHJhaXNlcyBJbmRleEVycm9yCi0gICAgICAgIGZpbGxlcnMgPSByZXBlYXQoZmlsbHZhbHVlKQotICAgICAgICBpdGVycyA9IFtjaGFpbihpdCwgc2VudGluZWwoKSwgZmlsbGVycykgZm9yIGl0IGluIGFyZ3NdCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGZvciB0dXAgaW4gaXppcCgqaXRlcnMpOgotICAgICAgICAgICAgICAgIHlpZWxkIHR1cAotICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKLSAgICAgICAgICAgIHBhc3MKLSAgXGVuZHt2ZXJiYXRpbX0KLQotICBJZiBvbmUgb2YgdGhlIGl0ZXJhYmxlcyBpcyBwb3RlbnRpYWxseSBpbmZpbml0ZSwgdGhlbiB0aGUKLSAgXGZ1bmN0aW9ue2l6aXBfbG9uZ2VzdCgpfSBmdW5jdGlvbiBzaG91bGQgYmUgd3JhcHBlZCB3aXRoIHNvbWV0aGluZwotICB0aGF0IGxpbWl0cyB0aGUgbnVtYmVyIG9mIGNhbGxzIChmb3IgZXhhbXBsZSBcZnVuY3Rpb257aXNsaWNlKCl9IG9yCi0gIFxmdW5jdGlvbnt0YWtlKCl9KS4KLSAgXHZlcnNpb25hZGRlZHsyLjZ9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3JlcGVhdH17b2JqZWN0XG9wdGlvbmFseywgdGltZXN9fQotICBNYWtlIGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyBcdmFye29iamVjdH0gb3ZlciBhbmQgb3ZlciBhZ2Fpbi4KLSAgUnVucyBpbmRlZmluaXRlbHkgdW5sZXNzIHRoZSBcdmFye3RpbWVzfSBhcmd1bWVudCBpcyBzcGVjaWZpZWQuCi0gIFVzZWQgYXMgYXJndW1lbnQgdG8gXGZ1bmN0aW9ue2ltYXAoKX0gZm9yIGludmFyaWFudCBwYXJhbWV0ZXJzCi0gIHRvIHRoZSBjYWxsZWQgZnVuY3Rpb24uICBBbHNvIHVzZWQgd2l0aCBcZnVuY3Rpb257aXppcCgpfSB0byBjcmVhdGUKLSAgYW4gaW52YXJpYW50IHBhcnQgb2YgYSB0dXBsZSByZWNvcmQuICBFcXVpdmFsZW50IHRvOgotCi0gIFxiZWdpbnt2ZXJiYXRpbX0KLSAgICAgZGVmIHJlcGVhdChvYmplY3QsIHRpbWVzPU5vbmUpOgotICAgICAgICAgaWYgdGltZXMgaXMgTm9uZToKLSAgICAgICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgICAgICB5aWVsZCBvYmplY3QKLSAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UodGltZXMpOgotICAgICAgICAgICAgICAgICB5aWVsZCBvYmplY3QKLSAgXGVuZHt2ZXJiYXRpbX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c3Rhcm1hcH17ZnVuY3Rpb24sIGl0ZXJhYmxlfQotICBNYWtlIGFuIGl0ZXJhdG9yIHRoYXQgY29tcHV0ZXMgdGhlIGZ1bmN0aW9uIHVzaW5nIGFyZ3VtZW50cyB0dXBsZXMKLSAgb2J0YWluZWQgZnJvbSB0aGUgaXRlcmFibGUuICBVc2VkIGluc3RlYWQgb2YgXGZ1bmN0aW9ue2ltYXAoKX0gd2hlbgotICBhcmd1bWVudCBwYXJhbWV0ZXJzIGFyZSBhbHJlYWR5IGdyb3VwZWQgaW4gdHVwbGVzIGZyb20gYSBzaW5nbGUgaXRlcmFibGUKLSAgKHRoZSBkYXRhIGhhcyBiZWVuIGBgcHJlLXppcHBlZCcnKS4gIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4KLSAgXGZ1bmN0aW9ue2ltYXAoKX0gYW5kIFxmdW5jdGlvbntzdGFybWFwKCl9IHBhcmFsbGVscyB0aGUgZGlzdGluY3Rpb24KLSAgYmV0d2VlbiBcY29kZXtmdW5jdGlvbihhLGIpfSBhbmQgXGNvZGV7ZnVuY3Rpb24oKmMpfS4KLSAgRXF1aXZhbGVudCB0bzoKLQotICBcYmVnaW57dmVyYmF0aW19Ci0gICAgIGRlZiBzdGFybWFwKGZ1bmN0aW9uLCBpdGVyYWJsZSk6Ci0gICAgICAgICBpdGVyYWJsZSA9IGl0ZXIoaXRlcmFibGUpCi0gICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgIHlpZWxkIGZ1bmN0aW9uKCpuZXh0KGl0ZXJhYmxlKSkKLSAgXGVuZHt2ZXJiYXRpbX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dGFrZXdoaWxlfXtwcmVkaWNhdGUsIGl0ZXJhYmxlfQotICBNYWtlIGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyBlbGVtZW50cyBmcm9tIHRoZSBpdGVyYWJsZSBhcyBsb25nIGFzCi0gIHRoZSBwcmVkaWNhdGUgaXMgdHJ1ZS4gIEVxdWl2YWxlbnQgdG86Ci0KLSAgXGJlZ2lue3ZlcmJhdGltfQotICAgICBkZWYgdGFrZXdoaWxlKHByZWRpY2F0ZSwgaXRlcmFibGUpOgotICAgICAgICAgZm9yIHggaW4gaXRlcmFibGU6Ci0gICAgICAgICAgICAgaWYgcHJlZGljYXRlKHgpOgotICAgICAgICAgICAgICAgICB5aWVsZCB4Ci0gICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgYnJlYWsKLSAgXGVuZHt2ZXJiYXRpbX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dGVlfXtpdGVyYWJsZVxvcHRpb25hbHssIG49Mn19Ci0gIFJldHVybiBcdmFye259IGluZGVwZW5kZW50IGl0ZXJhdG9ycyBmcm9tIGEgc2luZ2xlIGl0ZXJhYmxlLgotICBUaGUgY2FzZSB3aGVyZSBcY29kZXtuPT0yfSBpcyBlcXVpdmFsZW50IHRvOgotCi0gIFxiZWdpbnt2ZXJiYXRpbX0KLSAgICAgZGVmIHRlZShpdGVyYWJsZSk6Ci0gICAgICAgICBkZWYgZ2VuKG5leHQsIGRhdGE9e30sIGNudD1bMF0pOgotICAgICAgICAgICAgIGZvciBpIGluIGNvdW50KCk6Ci0gICAgICAgICAgICAgICAgIGlmIGkgPT0gY250WzBdOgotICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IGRhdGFbaV0gPSBuZXh0KCkKLSAgICAgICAgICAgICAgICAgICAgIGNudFswXSArPSAxCi0gICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgICBpdGVtID0gZGF0YS5wb3AoaSkKLSAgICAgICAgICAgICAgICAgeWllbGQgaXRlbQotICAgICAgICAgaXQgPSBpdGVyKGl0ZXJhYmxlKQotICAgICAgICAgcmV0dXJuIChnZW4oaXQuX19uZXh0X18pLCBnZW4oaXQuX19uZXh0X18pKQotICBcZW5ke3ZlcmJhdGltfQotCi0gIE5vdGUsIG9uY2UgXGZ1bmN0aW9ue3RlZSgpfSBoYXMgbWFkZSBhIHNwbGl0LCB0aGUgb3JpZ2luYWwgXHZhcntpdGVyYWJsZX0KLSAgc2hvdWxkIG5vdCBiZSB1c2VkIGFueXdoZXJlIGVsc2U7IG90aGVyd2lzZSwgdGhlIFx2YXJ7aXRlcmFibGV9IGNvdWxkIGdldAotICBhZHZhbmNlZCB3aXRob3V0IHRoZSB0ZWUgb2JqZWN0cyBiZWluZyBpbmZvcm1lZC4KLQotICBOb3RlLCB0aGlzIG1lbWJlciBvZiB0aGUgdG9vbGtpdCBtYXkgcmVxdWlyZSBzaWduaWZpY2FudCBhdXhpbGlhcnkKLSAgc3RvcmFnZSAoZGVwZW5kaW5nIG9uIGhvdyBtdWNoIHRlbXBvcmFyeSBkYXRhIG5lZWRzIHRvIGJlIHN0b3JlZCkuCi0gIEluIGdlbmVyYWwsIGlmIG9uZSBpdGVyYXRvciBpcyBnb2luZyB0byB1c2UgbW9zdCBvciBhbGwgb2YgdGhlIGRhdGEgYmVmb3JlCi0gIHRoZSBvdGhlciBpdGVyYXRvciwgaXQgaXMgZmFzdGVyIHRvIHVzZSBcZnVuY3Rpb257bGlzdCgpfSBpbnN0ZWFkIG9mCi0gIFxmdW5jdGlvbnt0ZWUoKX0uCi0gIFx2ZXJzaW9uYWRkZWR7Mi40fQotXGVuZHtmdW5jZGVzY30KLQotCi1cc3Vic2VjdGlvbntFeGFtcGxlcyBcbGFiZWx7aXRlcnRvb2xzLWV4YW1wbGV9fQotCi1UaGUgZm9sbG93aW5nIGV4YW1wbGVzIHNob3cgY29tbW9uIHVzZXMgZm9yIGVhY2ggdG9vbCBhbmQKLWRlbW9uc3RyYXRlIHdheXMgdGhleSBjYW4gYmUgY29tYmluZWQuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLQotPj4+IGFtb3VudHMgPSBbMTIwLjE1LCA3NjQuMDUsIDgyMy4xNF0KLT4+PiBmb3IgY2hlY2tudW0sIGFtb3VudCBpbiBpemlwKGNvdW50KDEyMDApLCBhbW91bnRzKToKLS4uLiAgICAgcHJpbnQgJ0NoZWNrICVkIGlzIGZvciAkJS4yZicgJSAoY2hlY2tudW0sIGFtb3VudCkKLS4uLgotQ2hlY2sgMTIwMCBpcyBmb3IgJDEyMC4xNQotQ2hlY2sgMTIwMSBpcyBmb3IgJDc2NC4wNQotQ2hlY2sgMTIwMiBpcyBmb3IgJDgyMy4xNAotCi0+Pj4gaW1wb3J0IG9wZXJhdG9yCi0+Pj4gZm9yIGN1YmUgaW4gaW1hcChvcGVyYXRvci5wb3csIHJhbmdlKDEsNSksIHJlcGVhdCgzKSk6Ci0uLi4gICAgcHJpbnQgY3ViZQotLi4uCi0xCi04Ci0yNwotNjQKLQotPj4+IHJlcG9ydGxpbmVzID0gWydFdXJvUHl0aG9uJywgJ1Jvc3RlcicsICcnLCAnYWxleCcsICcnLCAnbGF1cmEnLAotICAgICAgICAgICAgICAgICAgJycsICdtYXJ0aW4nLCAnJywgJ3dhbHRlcicsICcnLCAnbWFyayddCi0+Pj4gZm9yIG5hbWUgaW4gaXNsaWNlKHJlcG9ydGxpbmVzLCAzLCBOb25lLCAyKToKLS4uLiAgICBwcmludCBuYW1lLnRpdGxlKCkKLS4uLgotQWxleAotTGF1cmEKLU1hcnRpbgotV2FsdGVyCi1NYXJrCi0KLSMgU2hvdyBhIGRpY3Rpb25hcnkgc29ydGVkIGFuZCBncm91cGVkIGJ5IHZhbHVlCi0+Pj4gZnJvbSBvcGVyYXRvciBpbXBvcnQgaXRlbWdldHRlcgotPj4+IGQgPSBkaWN0KGE9MSwgYj0yLCBjPTEsIGQ9MiwgZT0xLCBmPTIsIGc9MykKLT4+PiBkaSA9IHNvcnRlZChkLml0ZXJpdGVtcygpLCBrZXk9aXRlbWdldHRlcigxKSkKLT4+PiBmb3IgaywgZyBpbiBncm91cGJ5KGRpLCBrZXk9aXRlbWdldHRlcigxKSk6Ci0uLi4gICAgIHByaW50IGssIG1hcChpdGVtZ2V0dGVyKDApLCBnKQotLi4uCi0xIFsnYScsICdjJywgJ2UnXQotMiBbJ2InLCAnZCcsICdmJ10KLTMgWydnJ10KLQotIyBGaW5kIHJ1bnMgb2YgY29uc2VjdXRpdmUgbnVtYmVycyB1c2luZyBncm91cGJ5LiAgVGhlIGtleSB0byB0aGUgc29sdXRpb24KLSMgaXMgZGlmZmVyZW5jaW5nIHdpdGggYSByYW5nZSBzbyB0aGF0IGNvbnNlY3V0aXZlIG51bWJlcnMgYWxsIGFwcGVhciBpbgotIyBzYW1lIGdyb3VwLgotPj4+IGRhdGEgPSBbIDEsICA0LDUsNiwgMTAsIDE1LDE2LDE3LDE4LCAyMiwgMjUsMjYsMjcsMjhdCi0+Pj4gZm9yIGssIGcgaW4gZ3JvdXBieShlbnVtZXJhdGUoZGF0YSksIGxhbWJkYSB0OnRbMF0tdFsxXSk6Ci0uLi4gICAgIHByaW50IG1hcChvcGVyYXRvci5pdGVtZ2V0dGVyKDEpLCBnKQotLi4uIAotWzFdCi1bNCwgNSwgNl0KLVsxMF0KLVsxNSwgMTYsIDE3LCAxOF0KLVsyMl0KLVsyNSwgMjYsIDI3LCAyOF0KLQotXGVuZHt2ZXJiYXRpbX0KLQotCi1cc3Vic2VjdGlvbntSZWNpcGVzIFxsYWJlbHtpdGVydG9vbHMtcmVjaXBlc319Ci0KLVRoaXMgc2VjdGlvbiBzaG93cyByZWNpcGVzIGZvciBjcmVhdGluZyBhbiBleHRlbmRlZCB0b29sc2V0IHVzaW5nIHRoZQotZXhpc3RpbmcgaXRlcnRvb2xzIGFzIGJ1aWxkaW5nIGJsb2Nrcy4KLQotVGhlIGV4dGVuZGVkIHRvb2xzIG9mZmVyIHRoZSBzYW1lIGhpZ2ggcGVyZm9ybWFuY2UgYXMgdGhlIHVuZGVybHlpbmcKLXRvb2xzZXQuICBUaGUgc3VwZXJpb3IgbWVtb3J5IHBlcmZvcm1hbmNlIGlzIGtlcHQgYnkgcHJvY2Vzc2luZyBlbGVtZW50cyBvbmUKLWF0IGEgdGltZSByYXRoZXIgdGhhbiBicmluZ2luZyB0aGUgd2hvbGUgaXRlcmFibGUgaW50byBtZW1vcnkgYWxsIGF0IG9uY2UuCi1Db2RlIHZvbHVtZSBpcyBrZXB0IHNtYWxsIGJ5IGxpbmtpbmcgdGhlIHRvb2xzIHRvZ2V0aGVyIGluIGEgZnVuY3Rpb25hbCBzdHlsZQotd2hpY2ggaGVscHMgZWxpbWluYXRlIHRlbXBvcmFyeSB2YXJpYWJsZXMuICBIaWdoIHNwZWVkIGlzIHJldGFpbmVkIGJ5Ci1wcmVmZXJyaW5nIGBgdmVjdG9yaXplZCcnIGJ1aWxkaW5nIGJsb2NrcyBvdmVyIHRoZSB1c2Ugb2YgZm9yLWxvb3BzIGFuZAotZ2VuZXJhdG9ycyB3aGljaCBpbmN1ciBpbnRlcnByZXRlciBvdmVyaGVhZC4KLQotCi1cYmVnaW57dmVyYmF0aW19Ci1kZWYgdGFrZShuLCBzZXEpOgotICAgIHJldHVybiBsaXN0KGlzbGljZShzZXEsIG4pKQotCi1kZWYgZW51bWVyYXRlKGl0ZXJhYmxlKToKLSAgICByZXR1cm4gaXppcChjb3VudCgpLCBpdGVyYWJsZSkKLQotZGVmIHRhYnVsYXRlKGZ1bmN0aW9uKToKLSAgICAiUmV0dXJuIGZ1bmN0aW9uKDApLCBmdW5jdGlvbigxKSwgLi4uIgotICAgIHJldHVybiBpbWFwKGZ1bmN0aW9uLCBjb3VudCgpKQotCi1kZWYgaXRlcml0ZW1zKG1hcHBpbmcpOgotICAgIHJldHVybiBpemlwKG1hcHBpbmcuaXRlcmtleXMoKSwgbWFwcGluZy5pdGVydmFsdWVzKCkpCi0KLWRlZiBudGgoaXRlcmFibGUsIG4pOgotICAgICJSZXR1cm5zIHRoZSBudGggaXRlbSBvciByYWlzZSBTdG9wSXRlcmF0aW9uIgotICAgIHJldHVybiBpc2xpY2UoaXRlcmFibGUsIG4sIE5vbmUpLm5leHQoKQotCi1kZWYgYWxsKHNlcSwgcHJlZD1Ob25lKToKLSAgICAiUmV0dXJucyBUcnVlIGlmIHByZWQoeCkgaXMgdHJ1ZSBmb3IgZXZlcnkgZWxlbWVudCBpbiB0aGUgaXRlcmFibGUiCi0gICAgZm9yIGVsZW0gaW4gaWZpbHRlcmZhbHNlKHByZWQsIHNlcSk6Ci0gICAgICAgIHJldHVybiBGYWxzZQotICAgIHJldHVybiBUcnVlCi0KLWRlZiBhbnkoc2VxLCBwcmVkPU5vbmUpOgotICAgICJSZXR1cm5zIFRydWUgaWYgcHJlZCh4KSBpcyB0cnVlIGZvciBhdCBsZWFzdCBvbmUgZWxlbWVudCBpbiB0aGUgaXRlcmFibGUiCi0gICAgZm9yIGVsZW0gaW4gaWZpbHRlcihwcmVkLCBzZXEpOgotICAgICAgICByZXR1cm4gVHJ1ZQotICAgIHJldHVybiBGYWxzZQotCi1kZWYgbm8oc2VxLCBwcmVkPU5vbmUpOgotICAgICJSZXR1cm5zIFRydWUgaWYgcHJlZCh4KSBpcyBmYWxzZSBmb3IgZXZlcnkgZWxlbWVudCBpbiB0aGUgaXRlcmFibGUiCi0gICAgZm9yIGVsZW0gaW4gaWZpbHRlcihwcmVkLCBzZXEpOgotICAgICAgICByZXR1cm4gRmFsc2UKLSAgICByZXR1cm4gVHJ1ZQotCi1kZWYgcXVhbnRpZnkoc2VxLCBwcmVkPU5vbmUpOgotICAgICJDb3VudCBob3cgbWFueSB0aW1lcyB0aGUgcHJlZGljYXRlIGlzIHRydWUgaW4gdGhlIHNlcXVlbmNlIgotICAgIHJldHVybiBzdW0oaW1hcChwcmVkLCBzZXEpKQotCi1kZWYgcGFkbm9uZShzZXEpOgotICAgICIiIlJldHVybnMgdGhlIHNlcXVlbmNlIGVsZW1lbnRzIGFuZCB0aGVuIHJldHVybnMgTm9uZSBpbmRlZmluaXRlbHkuCi0KLSAgICBVc2VmdWwgZm9yIGVtdWxhdGluZyB0aGUgYmVoYXZpb3Igb2YgdGhlIGJ1aWx0LWluIG1hcCgpIGZ1bmN0aW9uLgotICAgICIiIgotICAgIHJldHVybiBjaGFpbihzZXEsIHJlcGVhdChOb25lKSkKLQotZGVmIG5jeWNsZXMoc2VxLCBuKToKLSAgICAiUmV0dXJucyB0aGUgc2VxdWVuY2UgZWxlbWVudHMgbiB0aW1lcyIKLSAgICByZXR1cm4gY2hhaW4oKnJlcGVhdChzZXEsIG4pKQotCi1kZWYgZG90cHJvZHVjdCh2ZWMxLCB2ZWMyKToKLSAgICByZXR1cm4gc3VtKGltYXAob3BlcmF0b3IubXVsLCB2ZWMxLCB2ZWMyKSkKLQotZGVmIGZsYXR0ZW4obGlzdE9mTGlzdHMpOgotICAgIHJldHVybiBsaXN0KGNoYWluKCpsaXN0T2ZMaXN0cykpCi0KLWRlZiByZXBlYXRmdW5jKGZ1bmMsIHRpbWVzPU5vbmUsICphcmdzKToKLSAgICAiIiJSZXBlYXQgY2FsbHMgdG8gZnVuYyB3aXRoIHNwZWNpZmllZCBhcmd1bWVudHMuCi0gICAgCi0gICAgRXhhbXBsZTogIHJlcGVhdGZ1bmMocmFuZG9tLnJhbmRvbSkKLSAgICAiIiIKLSAgICBpZiB0aW1lcyBpcyBOb25lOgotICAgICAgICByZXR1cm4gc3Rhcm1hcChmdW5jLCByZXBlYXQoYXJncykpCi0gICAgZWxzZToKLSAgICAgICAgcmV0dXJuIHN0YXJtYXAoZnVuYywgcmVwZWF0KGFyZ3MsIHRpbWVzKSkKLQotZGVmIHBhaXJ3aXNlKGl0ZXJhYmxlKToKLSAgICAicyAtPiAoczAsczEpLCAoczEsczIpLCAoczIsIHMzKSwgLi4uIgotICAgIGEsIGIgPSB0ZWUoaXRlcmFibGUpCi0gICAgbmV4dChiLCBOb25lKQotICAgIHJldHVybiBpemlwKGEsIGIpCi0KLWRlZiBncm91cGVyKG4sIGl0ZXJhYmxlLCBwYWR2YWx1ZT1Ob25lKToKLSAgICAiZ3JvdXBlcigzLCAnYWJjZGVmZycsICd4JykgLS0+ICgnYScsJ2InLCdjJyksICgnZCcsJ2UnLCdmJyksICgnZycsJ3gnLCd4JykiCi0gICAgcmV0dXJuIGl6aXAoKltjaGFpbihpdGVyYWJsZSwgcmVwZWF0KHBhZHZhbHVlLCBuLTEpKV0qbikKLQotCi1cZW5ke3ZlcmJhdGltfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJrZXl3b3JkLnRleCBiL0RvYy9saWIvbGlia2V5d29yZC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMDdjZWMuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJrZXl3b3JkLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7a2V5d29yZH0gLS0tCi0gICAgICAgICBUZXN0aW5nIGZvciBQeXRob24ga2V5d29yZHN9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtrZXl3b3JkfQotXG1vZHVsZXN5bm9wc2lze1Rlc3Qgd2hldGhlciBhIHN0cmluZyBpcyBhIGtleXdvcmQgaW4gUHl0aG9uLn0KLQotCi1UaGlzIG1vZHVsZSBhbGxvd3MgYSBQeXRob24gcHJvZ3JhbSB0byBkZXRlcm1pbmUgaWYgYSBzdHJpbmcgaXMgYQota2V5d29yZC4KLQotXGJlZ2lue2Z1bmNkZXNjfXtpc2tleXdvcmR9e3N9Ci1SZXR1cm4gdHJ1ZSBpZiBcdmFye3N9IGlzIGEgUHl0aG9uIGtleXdvcmQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e2t3bGlzdH0KLVNlcXVlbmNlIGNvbnRhaW5pbmcgYWxsIHRoZSBrZXl3b3JkcyBkZWZpbmVkIGZvciB0aGUgaW50ZXJwcmV0ZXIuICBJZgotYW55IGtleXdvcmRzIGFyZSBkZWZpbmVkIHRvIG9ubHkgYmUgYWN0aXZlIHdoZW4gcGFydGljdWxhcgotXG1vZHVsZXtfX2Z1dHVyZV9ffSBzdGF0ZW1lbnRzIGFyZSBpbiBlZmZlY3QsIHRoZXNlIHdpbGwgYmUgaW5jbHVkZWQKLWFzIHdlbGwuCi1cZW5ke2RhdGFkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJsaW5lY2FjaGUudGV4IGIvRG9jL2xpYi9saWJsaW5lY2FjaGUudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmM3NzQzLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlibGluZWNhY2hlLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7bGluZWNhY2hlfSAtLS0KLSAgICAgICAgIFJhbmRvbSBhY2Nlc3MgdG8gdGV4dCBsaW5lc30KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2xpbmVjYWNoZX0KLVxzZWN0aW9uYXV0aG9ye01vc2hlIFphZGthfXttb3NoZXpAemFka2Euc2l0ZS5jby5pbH0KLVxtb2R1bGVzeW5vcHNpc3tUaGlzIG1vZHVsZSBwcm92aWRlcyByYW5kb20gYWNjZXNzIHRvIGluZGl2aWR1YWwgbGluZXMKLSAgICAgICAgICAgICAgICBmcm9tIHRleHQgZmlsZXMufQotCi0KLVRoZSBcbW9kdWxle2xpbmVjYWNoZX0gbW9kdWxlIGFsbG93cyBvbmUgdG8gZ2V0IGFueSBsaW5lIGZyb20gYW55IGZpbGUsCi13aGlsZSBhdHRlbXB0aW5nIHRvIG9wdGltaXplIGludGVybmFsbHksIHVzaW5nIGEgY2FjaGUsIHRoZSBjb21tb24gY2FzZQotd2hlcmUgbWFueSBsaW5lcyBhcmUgcmVhZCBmcm9tIGEgc2luZ2xlIGZpbGUuICBUaGlzIGlzIHVzZWQgYnkgdGhlCi1ccmVmbW9kdWxle3RyYWNlYmFja30gbW9kdWxlIHRvIHJldHJpZXZlIHNvdXJjZSBsaW5lcyBmb3IgaW5jbHVzaW9uIGluIAotdGhlIGZvcm1hdHRlZCB0cmFjZWJhY2suCi0KLVRoZSBcbW9kdWxle2xpbmVjYWNoZX0gbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0bGluZX17ZmlsZW5hbWUsIGxpbmVub1xvcHRpb25hbHssIG1vZHVsZV9nbG9iYWxzfX0KLUdldCBsaW5lIFx2YXJ7bGluZW5vfSBmcm9tIGZpbGUgbmFtZWQgXHZhcntmaWxlbmFtZX0uIFRoaXMgZnVuY3Rpb24KLXdpbGwgbmV2ZXIgdGhyb3cgYW4gZXhjZXB0aW9uIC0tLSBpdCB3aWxsIHJldHVybiBcY29kZXsnJ30gb24gZXJyb3JzCi0odGhlIHRlcm1pbmF0aW5nIG5ld2xpbmUgY2hhcmFjdGVyIHdpbGwgYmUgaW5jbHVkZWQgZm9yIGxpbmVzIHRoYXQgYXJlCi1mb3VuZCkuCi0KLUlmIGEgZmlsZSBuYW1lZCBcdmFye2ZpbGVuYW1lfSBpcyBub3QgZm91bmQsIHRoZSBmdW5jdGlvbiB3aWxsIGxvb2sKLWZvciBpdCBpbiB0aGUgbW9kdWxlXGluZGV4aWlpe21vZHVsZX17c2VhcmNofXtwYXRofSBzZWFyY2ggcGF0aCwKLVxjb2Rle3N5cy5wYXRofSwgYWZ0ZXIgZmlyc3QgY2hlY2tpbmcgZm9yIGEgXHBlcHszMDJ9IFxjb2Rle19fbG9hZGVyX199Ci1pbiBcdmFye21vZHVsZV9nbG9iYWxzfSwgaW4gY2FzZSB0aGUgbW9kdWxlIHdhcyBpbXBvcnRlZCBmcm9tIGEgemlwZmlsZQotb3Igb3RoZXIgbm9uLWZpbGVzeXN0ZW0gaW1wb3J0IHNvdXJjZS4gCi0KLVx2ZXJzaW9uYWRkZWRbVGhlIFx2YXJ7bW9kdWxlX2dsb2JhbHN9IHBhcmFtZXRlciB3YXMgYWRkZWRdezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y2xlYXJjYWNoZX17fQotQ2xlYXIgdGhlIGNhY2hlLiAgVXNlIHRoaXMgZnVuY3Rpb24gaWYgeW91IG5vIGxvbmdlciBuZWVkIGxpbmVzIGZyb20KLWZpbGVzIHByZXZpb3VzbHkgcmVhZCB1c2luZyBcZnVuY3Rpb257Z2V0bGluZSgpfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y2hlY2tjYWNoZX17XG9wdGlvbmFse2ZpbGVuYW1lfX0KLUNoZWNrIHRoZSBjYWNoZSBmb3IgdmFsaWRpdHkuICBVc2UgdGhpcyBmdW5jdGlvbiBpZiBmaWxlcyBpbiB0aGUgY2FjaGUgCi1tYXkgaGF2ZSBjaGFuZ2VkIG9uIGRpc2ssIGFuZCB5b3UgcmVxdWlyZSB0aGUgdXBkYXRlZCB2ZXJzaW9uLiAgSWYKLVx2YXJ7ZmlsZW5hbWV9IGlzIG9taXR0ZWQsIGl0IHdpbGwgY2hlY2sgYWxsIHRoZSBlbnRyaWVzIGluIHRoZSBjYWNoZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLUV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgbGluZWNhY2hlCi0+Pj4gbGluZWNhY2hlLmdldGxpbmUoJy9ldGMvcGFzc3dkJywgNCkKLSdzeXM6eDozOjM6c3lzOi9kZXY6L2Jpbi9zaFxuJwotXGVuZHt2ZXJiYXRpbX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlibG9jYWxlLnRleCBiL0RvYy9saWIvbGlibG9jYWxlLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE5ZDg5My4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYmxvY2FsZS50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw1MjcgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtsb2NhbGV9IC0tLQotICAgICAgICAgSW50ZXJuYXRpb25hbGl6YXRpb24gc2VydmljZXN9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtsb2NhbGV9Ci1cbW9kdWxlc3lub3BzaXN7SW50ZXJuYXRpb25hbGl6YXRpb24gc2VydmljZXMufQotXG1vZHVsZWF1dGhvcntNYXJ0aW4gdm9uIExcIm93aXN9e21hcnRpbkB2LmxvZXdpcy5kZX0KLVxzZWN0aW9uYXV0aG9ye01hcnRpbiB2b24gTFwib3dpc317bWFydGluQHYubG9ld2lzLmRlfQotCi0KLVRoZSBcbW9kdWxle2xvY2FsZX0gbW9kdWxlIG9wZW5zIGFjY2VzcyB0byB0aGUgXFBPU0lYe30gbG9jYWxlCi1kYXRhYmFzZSBhbmQgZnVuY3Rpb25hbGl0eS4gVGhlIFxQT1NJWHt9IGxvY2FsZSBtZWNoYW5pc20gYWxsb3dzCi1wcm9ncmFtbWVycyB0byBkZWFsIHdpdGggY2VydGFpbiBjdWx0dXJhbCBpc3N1ZXMgaW4gYW4gYXBwbGljYXRpb24sCi13aXRob3V0IHJlcXVpcmluZyB0aGUgcHJvZ3JhbW1lciB0byBrbm93IGFsbCB0aGUgc3BlY2lmaWNzIG9mIGVhY2gKLWNvdW50cnkgd2hlcmUgdGhlIHNvZnR3YXJlIGlzIGV4ZWN1dGVkLgotCi1UaGUgXG1vZHVsZXtsb2NhbGV9IG1vZHVsZSBpcyBpbXBsZW1lbnRlZCBvbiB0b3Agb2YgdGhlCi1cbW9kdWxle19sb2NhbGV9XHJlZmJpbW9kaW5kZXh7X2xvY2FsZX0gbW9kdWxlLCB3aGljaCBpbiB0dXJuIHVzZXMgYW4KLUFOU0kgQyBsb2NhbGUgaW1wbGVtZW50YXRpb24gaWYgYXZhaWxhYmxlLgotCi1UaGUgXG1vZHVsZXtsb2NhbGV9IG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uIGFuZAotZnVuY3Rpb25zOgotCi0KLVxiZWdpbntleGNkZXNjfXtFcnJvcn0KLSAgRXhjZXB0aW9uIHJhaXNlZCB3aGVuIFxmdW5jdGlvbntzZXRsb2NhbGUoKX0gZmFpbHMuCi1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c2V0bG9jYWxlfXtjYXRlZ29yeVxvcHRpb25hbHssIGxvY2FsZX19Ci0gIElmIFx2YXJ7bG9jYWxlfSBpcyBzcGVjaWZpZWQsIGl0IG1heSBiZSBhIHN0cmluZywgYSB0dXBsZSBvZiB0aGUKLSAgZm9ybSBcY29kZXsoXHZhcntsYW5ndWFnZSBjb2RlfSwgXHZhcntlbmNvZGluZ30pfSwgb3IgXGNvZGV7Tm9uZX0uCi0gIElmIGl0IGlzIGEgdHVwbGUsIGl0IGlzIGNvbnZlcnRlZCB0byBhIHN0cmluZyB1c2luZyB0aGUgbG9jYWxlCi0gIGFsaWFzaW5nIGVuZ2luZS4gIElmIFx2YXJ7bG9jYWxlfSBpcyBnaXZlbiBhbmQgbm90IFxjb2Rle05vbmV9LAotICBcZnVuY3Rpb257c2V0bG9jYWxlKCl9IG1vZGlmaWVzIHRoZSBsb2NhbGUgc2V0dGluZyBmb3IgdGhlCi0gIFx2YXJ7Y2F0ZWdvcnl9LiAgVGhlIGF2YWlsYWJsZSBjYXRlZ29yaWVzIGFyZSBsaXN0ZWQgaW4gdGhlIGRhdGEKLSAgZGVzY3JpcHRpb24gYmVsb3cuICBUaGUgdmFsdWUgaXMgdGhlIG5hbWUgb2YgYSBsb2NhbGUuICBBbiBlbXB0eQotICBzdHJpbmcgc3BlY2lmaWVzIHRoZSB1c2VyJ3MgZGVmYXVsdCBzZXR0aW5ncy4gSWYgdGhlIG1vZGlmaWNhdGlvbiBvZgotICB0aGUgbG9jYWxlIGZhaWxzLCB0aGUgZXhjZXB0aW9uIFxleGNlcHRpb257RXJyb3J9IGlzIHJhaXNlZC4gIElmCi0gIHN1Y2Nlc3NmdWwsIHRoZSBuZXcgbG9jYWxlIHNldHRpbmcgaXMgcmV0dXJuZWQuCi0KLSAgSWYgXHZhcntsb2NhbGV9IGlzIG9taXR0ZWQgb3IgXGNvZGV7Tm9uZX0sIHRoZSBjdXJyZW50IHNldHRpbmcgZm9yCi0gIFx2YXJ7Y2F0ZWdvcnl9IGlzIHJldHVybmVkLgotCi0gIFxmdW5jdGlvbntzZXRsb2NhbGUoKX0gaXMgbm90IHRocmVhZCBzYWZlIG9uIG1vc3Qgc3lzdGVtcy4KLSAgQXBwbGljYXRpb25zIHR5cGljYWxseSBzdGFydCB3aXRoIGEgY2FsbCBvZgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgbG9jYWxlCi1sb2NhbGUuc2V0bG9jYWxlKGxvY2FsZS5MQ19BTEwsICcnKQotXGVuZHt2ZXJiYXRpbX0KLQotICBUaGlzIHNldHMgdGhlIGxvY2FsZSBmb3IgYWxsIGNhdGVnb3JpZXMgdG8gdGhlIHVzZXIncyBkZWZhdWx0Ci0gIHNldHRpbmcgKHR5cGljYWxseSBzcGVjaWZpZWQgaW4gdGhlIFxlbnZ2YXJ7TEFOR30gZW52aXJvbm1lbnQKLSAgdmFyaWFibGUpLiAgSWYgdGhlIGxvY2FsZSBpcyBub3QgY2hhbmdlZCB0aGVyZWFmdGVyLCB1c2luZwotICBtdWx0aXRocmVhZGluZyBzaG91bGQgbm90IGNhdXNlIHByb2JsZW1zLgotCi0gIFx2ZXJzaW9uY2hhbmdlZFtBZGRlZCBzdXBwb3J0IGZvciB0dXBsZSB2YWx1ZXMgb2YgdGhlIFx2YXJ7bG9jYWxlfQotICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyXXsyLjB9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2xvY2FsZWNvbnZ9e30KLSAgUmV0dXJucyB0aGUgZGF0YWJhc2Ugb2YgdGhlIGxvY2FsIGNvbnZlbnRpb25zIGFzIGEgZGljdGlvbmFyeS4KLSAgVGhpcyBkaWN0aW9uYXJ5IGhhcyB0aGUgZm9sbG93aW5nIHN0cmluZ3MgYXMga2V5czoKLQotICBcYmVnaW57dGFibGVpaWl9e2x8bHxwezNpbn19e2NvbnN0YW50fXtDYXRlZ29yeX17S2V5fXtNZWFuaW5nfQotICAgIFxsaW5laWlpe0xDX05VTUVSSUN9e1xjb2RleydkZWNpbWFsX3BvaW50J319Ci0gICAgICAgICAgICB7RGVjaW1hbCBwb2ludCBjaGFyYWN0ZXIufQotICAgIFxsaW5laWlpe317XGNvZGV7J2dyb3VwaW5nJ319Ci0gICAgICAgICAgICB7U2VxdWVuY2Ugb2YgbnVtYmVycyBzcGVjaWZ5aW5nIHdoaWNoIHJlbGF0aXZlIHBvc2l0aW9ucwotICAgICAgICAgICAgIHRoZSBcY29kZXsndGhvdXNhbmRzX3NlcCd9IGlzIGV4cGVjdGVkLiAgSWYgdGhlIHNlcXVlbmNlIGlzCi0gICAgICAgICAgICAgdGVybWluYXRlZCB3aXRoIFxjb25zdGFudHtDSEFSX01BWH0sIG5vIGZ1cnRoZXIgZ3JvdXBpbmcKLSAgICAgICAgICAgICBpcyBwZXJmb3JtZWQuIElmIHRoZSBzZXF1ZW5jZSB0ZXJtaW5hdGVzIHdpdGggYSBcY29kZXswfSwgCi0gICAgICAgICAgICAgdGhlIGxhc3QgZ3JvdXAgc2l6ZSBpcyByZXBlYXRlZGx5IHVzZWQufQotICAgIFxsaW5laWlpe317XGNvZGV7J3Rob3VzYW5kc19zZXAnfX0KLSAgICAgICAgICAgIHtDaGFyYWN0ZXIgdXNlZCBiZXR3ZWVuIGdyb3Vwcy59XGhsaW5lCi0gICAgXGxpbmVpaWl7TENfTU9ORVRBUll9e1xjb2RleydpbnRfY3Vycl9zeW1ib2wnfX0KLSAgICAgICAgICAgIHtJbnRlcm5hdGlvbmFsIGN1cnJlbmN5IHN5bWJvbC59Ci0gICAgXGxpbmVpaWl7fXtcY29kZXsnY3VycmVuY3lfc3ltYm9sJ319Ci0gICAgICAgICAgICB7TG9jYWwgY3VycmVuY3kgc3ltYm9sLn0KLSAgICBcbGluZWlpaXt9e1xjb2RleydwX2NzX3ByZWNlZGVzL25fY3NfcHJlY2VkZXMnfX0KLSAgICAgICAgICAgIHtXaGV0aGVyIHRoZSBjdXJyZW5jeSBzeW1ib2wgcHJlY2VkZXMgdGhlIHZhbHVlIChmb3IgcG9zaXRpdmUgcmVzcC4KLSAgICAgICAgICAgICBuZWdhdGl2ZSB2YWx1ZXMpLn0KLSAgICBcbGluZWlpaXt9e1xjb2RleydwX3NlcF9ieV9zcGFjZS9uX3NlcF9ieV9zcGFjZSd9fQotICAgICAgICAgICAge1doZXRoZXIgdGhlIGN1cnJlbmN5IHN5bWJvbCBpcyBzZXBhcmF0ZWQgZnJvbSB0aGUgdmFsdWUgCi0gICAgICAgICAgICAgYnkgYSBzcGFjZSAoZm9yIHBvc2l0aXZlIHJlc3AuIG5lZ2F0aXZlIHZhbHVlcykufQotICAgIFxsaW5laWlpe317XGNvZGV7J21vbl9kZWNpbWFsX3BvaW50J319Ci0gICAgICAgICAgICB7RGVjaW1hbCBwb2ludCB1c2VkIGZvciBtb25ldGFyeSB2YWx1ZXMufQotICAgIFxsaW5laWlpe317XGNvZGV7J2ZyYWNfZGlnaXRzJ319Ci0gICAgICAgICAgICB7TnVtYmVyIG9mIGZyYWN0aW9uYWwgZGlnaXRzIHVzZWQgaW4gbG9jYWwgZm9ybWF0dGluZwotICAgICAgICAgICAgIG9mIG1vbmV0YXJ5IHZhbHVlcy59Ci0gICAgXGxpbmVpaWl7fXtcY29kZXsnaW50X2ZyYWNfZGlnaXRzJ319Ci0gICAgICAgICAgICB7TnVtYmVyIG9mIGZyYWN0aW9uYWwgZGlnaXRzIHVzZWQgaW4gaW50ZXJuYXRpb25hbAotICAgICAgICAgICAgIGZvcm1hdHRpbmcgb2YgbW9uZXRhcnkgdmFsdWVzLn0KLSAgICBcbGluZWlpaXt9e1xjb2Rleydtb25fdGhvdXNhbmRzX3NlcCd9fQotICAgICAgICAgICAge0dyb3VwIHNlcGFyYXRvciB1c2VkIGZvciBtb25ldGFyeSB2YWx1ZXMufQotICAgIFxsaW5laWlpe317XGNvZGV7J21vbl9ncm91cGluZyd9fQotICAgICAgICAgICAge0VxdWl2YWxlbnQgdG8gXGNvZGV7J2dyb3VwaW5nJ30sIHVzZWQgZm9yIG1vbmV0YXJ5Ci0gICAgICAgICAgICAgdmFsdWVzLn0KLSAgICBcbGluZWlpaXt9e1xjb2Rleydwb3NpdGl2ZV9zaWduJ319Ci0gICAgICAgICAgICB7U3ltYm9sIHVzZWQgdG8gYW5ub3RhdGUgYSBwb3NpdGl2ZSBtb25ldGFyeSB2YWx1ZS59Ci0gICAgXGxpbmVpaWl7fXtcY29kZXsnbmVnYXRpdmVfc2lnbid9fQotICAgICAgICAgICAge1N5bWJvbCB1c2VkIHRvIGFubm90YXRlIGEgbmVnYXRpdmUgbW9uZXRhcnkgdmFsdWUufQotICAgIFxsaW5laWlpe317XGNvZGV7J3Bfc2lnbl9wb3NuL25fc2lnbl9wb3NuJ319Ci0gICAgICAgICAgICB7VGhlIHBvc2l0aW9uIG9mIHRoZSBzaWduIChmb3IgcG9zaXRpdmUgcmVzcC4gbmVnYXRpdmUgdmFsdWVzKSwgc2VlIGJlbG93Ln0KLSAgXGVuZHt0YWJsZWlpaX0KLSAgCi0gIEFsbCBudW1lcmljIHZhbHVlcyBjYW4gYmUgc2V0IHRvIFxjb25zdGFudHtDSEFSX01BWH0gdG8gaW5kaWNhdGUgdGhhdAotICB0aGVyZSBpcyBubyB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhpcyBsb2NhbGUuCi0KLSAgVGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgXGNvZGV7J3Bfc2lnbl9wb3NuJ30gYW5kCi0gIFxjb2RleyduX3NpZ25fcG9zbid9IGFyZSBnaXZlbiBiZWxvdy4KLQotICBcYmVnaW57dGFibGVpaX17Y3xsfXtjb2RlfXtWYWx1ZX17RXhwbGFuYXRpb259Ci0gICAgXGxpbmVpaXswfXtDdXJyZW5jeSBhbmQgdmFsdWUgYXJlIHN1cnJvdW5kZWQgYnkgcGFyZW50aGVzZXMufQotICAgIFxsaW5laWl7MX17VGhlIHNpZ24gc2hvdWxkIHByZWNlZGUgdGhlIHZhbHVlIGFuZCBjdXJyZW5jeSBzeW1ib2wufQotICAgIFxsaW5laWl7Mn17VGhlIHNpZ24gc2hvdWxkIGZvbGxvdyB0aGUgdmFsdWUgYW5kIGN1cnJlbmN5IHN5bWJvbC59Ci0gICAgXGxpbmVpaXszfXtUaGUgc2lnbiBzaG91bGQgaW1tZWRpYXRlbHkgcHJlY2VkZSB0aGUgdmFsdWUufQotICAgIFxsaW5laWl7NH17VGhlIHNpZ24gc2hvdWxkIGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgdmFsdWUufQotICAgIFxsaW5laWl7XGNvbnN0YW50e0NIQVJfTUFYfX17Tm90aGluZyBpcyBzcGVjaWZpZWQgaW4gdGhpcyBsb2NhbGUufQotICBcZW5ke3RhYmxlaWl9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e25sX2xhbmdpbmZvfXtvcHRpb259Ci0KLVJldHVybiBzb21lIGxvY2FsZS1zcGVjaWZpYyBpbmZvcm1hdGlvbiBhcyBhIHN0cmluZy4gVGhpcyBmdW5jdGlvbiBpcwotbm90IGF2YWlsYWJsZSBvbiBhbGwgc3lzdGVtcywgYW5kIHRoZSBzZXQgb2YgcG9zc2libGUgb3B0aW9ucyBtaWdodAotYWxzbyB2YXJ5IGFjcm9zcyBwbGF0Zm9ybXMuIFRoZSBwb3NzaWJsZSBhcmd1bWVudCB2YWx1ZXMgYXJlIG51bWJlcnMsCi1mb3Igd2hpY2ggc3ltYm9saWMgY29uc3RhbnRzIGFyZSBhdmFpbGFibGUgaW4gdGhlIGxvY2FsZSBtb2R1bGUuCi0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0ZGVmYXVsdGxvY2FsZX17XG9wdGlvbmFse2VudnZhcnN9fQotICBUcmllcyB0byBkZXRlcm1pbmUgdGhlIGRlZmF1bHQgbG9jYWxlIHNldHRpbmdzIGFuZCByZXR1cm5zCi0gIHRoZW0gYXMgYSB0dXBsZSBvZiB0aGUgZm9ybSBcY29kZXsoXHZhcntsYW5ndWFnZSBjb2RlfSwKLSAgXHZhcntlbmNvZGluZ30pfS4KLQotICBBY2NvcmRpbmcgdG8gXFBPU0lYLCBhIHByb2dyYW0gd2hpY2ggaGFzIG5vdCBjYWxsZWQKLSAgXGNvZGV7c2V0bG9jYWxlKExDX0FMTCwgJycpfSBydW5zIHVzaW5nIHRoZSBwb3J0YWJsZSBcY29kZXsnQyd9Ci0gIGxvY2FsZS4gIENhbGxpbmcgXGNvZGV7c2V0bG9jYWxlKExDX0FMTCwgJycpfSBsZXRzIGl0IHVzZSB0aGUKLSAgZGVmYXVsdCBsb2NhbGUgYXMgZGVmaW5lZCBieSB0aGUgXGVudnZhcntMQU5HfSB2YXJpYWJsZS4gIFNpbmNlIHdlCi0gIGRvIG5vdCB3YW50IHRvIGludGVyZmVyZSB3aXRoIHRoZSBjdXJyZW50IGxvY2FsZSBzZXR0aW5nIHdlIHRodXMKLSAgZW11bGF0ZSB0aGUgYmVoYXZpb3IgaW4gdGhlIHdheSBkZXNjcmliZWQgYWJvdmUuCi0KLSAgVG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIHBsYXRmb3Jtcywgbm90IG9ubHkgdGhlCi0gIFxlbnZ2YXJ7TEFOR30gdmFyaWFibGUgaXMgdGVzdGVkLCBidXQgYSBsaXN0IG9mIHZhcmlhYmxlcyBnaXZlbiBhcwotICBlbnZ2YXJzIHBhcmFtZXRlci4gIFRoZSBmaXJzdCBmb3VuZCB0byBiZSBkZWZpbmVkIHdpbGwgYmUKLSAgdXNlZC4gIFx2YXJ7ZW52dmFyc30gZGVmYXVsdHMgdG8gdGhlIHNlYXJjaCBwYXRoIHVzZWQgaW4gR05VIGdldHRleHQ7Ci0gIGl0IG11c3QgYWx3YXlzIGNvbnRhaW4gdGhlIHZhcmlhYmxlIG5hbWUgXHNhbXB7TEFOR30uICBUaGUgR05VCi0gIGdldHRleHQgc2VhcmNoIHBhdGggY29udGFpbnMgXGNvZGV7J0xBTkdVQUdFJ30sIFxjb2RleydMQ19BTEwnfSwKLSAgXGNvZGV7J0xDX0NUWVBFJ30sIGFuZCBcY29kZXsnTEFORyd9LCBpbiB0aGF0IG9yZGVyLgotCi0gIEV4Y2VwdCBmb3IgdGhlIGNvZGUgXGNvZGV7J0MnfSwgdGhlIGxhbmd1YWdlIGNvZGUgY29ycmVzcG9uZHMgdG8KLSAgXHJmY3sxNzY2fS4gIFx2YXJ7bGFuZ3VhZ2UgY29kZX0gYW5kIFx2YXJ7ZW5jb2Rpbmd9IG1heSBiZQotICBcY29kZXtOb25lfSBpZiB0aGVpciB2YWx1ZXMgY2Fubm90IGJlIGRldGVybWluZWQuCi0gIFx2ZXJzaW9uYWRkZWR7Mi4wfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRsb2NhbGV9e1xvcHRpb25hbHtjYXRlZ29yeX19Ci0gIFJldHVybnMgdGhlIGN1cnJlbnQgc2V0dGluZyBmb3IgdGhlIGdpdmVuIGxvY2FsZSBjYXRlZ29yeSBhcwotICBzZXF1ZW5jZSBjb250YWluaW5nIFx2YXJ7bGFuZ3VhZ2UgY29kZX0sIFx2YXJ7ZW5jb2Rpbmd9LgotICBcdmFye2NhdGVnb3J5fSBtYXkgYmUgb25lIG9mIHRoZSBcY29uc3RhbnR7TENfKn0gdmFsdWVzIGV4Y2VwdAotICBcY29uc3RhbnR7TENfQUxMfS4gIEl0IGRlZmF1bHRzIHRvIFxjb25zdGFudHtMQ19DVFlQRX0uCi0KLSAgRXhjZXB0IGZvciB0aGUgY29kZSBcY29kZXsnQyd9LCB0aGUgbGFuZ3VhZ2UgY29kZSBjb3JyZXNwb25kcyB0bwotICBccmZjezE3NjZ9LiAgXHZhcntsYW5ndWFnZSBjb2RlfSBhbmQgXHZhcntlbmNvZGluZ30gbWF5IGJlCi0gIFxjb2Rle05vbmV9IGlmIHRoZWlyIHZhbHVlcyBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4KLSAgXHZlcnNpb25hZGRlZHsyLjB9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldHByZWZlcnJlZGVuY29kaW5nfXtcb3B0aW9uYWx7ZG9fc2V0bG9jYWxlfX0KLSAgUmV0dXJuIHRoZSBlbmNvZGluZyB1c2VkIGZvciB0ZXh0IGRhdGEsIGFjY29yZGluZyB0byB1c2VyCi0gIHByZWZlcmVuY2VzLiAgVXNlciBwcmVmZXJlbmNlcyBhcmUgZXhwcmVzc2VkIGRpZmZlcmVudGx5IG9uCi0gIGRpZmZlcmVudCBzeXN0ZW1zLCBhbmQgbWlnaHQgbm90IGJlIGF2YWlsYWJsZSBwcm9ncmFtbWF0aWNhbGx5IG9uCi0gIHNvbWUgc3lzdGVtcywgc28gdGhpcyBmdW5jdGlvbiBvbmx5IHJldHVybnMgYSBndWVzcy4KLQotICBPbiBzb21lIHN5c3RlbXMsIGl0IGlzIG5lY2Vzc2FyeSB0byBpbnZva2UgXGZ1bmN0aW9ue3NldGxvY2FsZX0KLSAgdG8gb2J0YWluIHRoZSB1c2VyIHByZWZlcmVuY2VzLCBzbyB0aGlzIGZ1bmN0aW9uIGlzIG5vdCB0aHJlYWQtc2FmZS4KLSAgSWYgaW52b2tpbmcgc2V0bG9jYWxlIGlzIG5vdCBuZWNlc3Nhcnkgb3IgZGVzaXJlZCwgXHZhcntkb19zZXRsb2NhbGV9Ci0gIHNob3VsZCBiZSBzZXQgdG8gXGNvZGV7RmFsc2V9LgotCi0gIFx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtub3JtYWxpemV9e2xvY2FsZW5hbWV9Ci0gIFJldHVybnMgYSBub3JtYWxpemVkIGxvY2FsZSBjb2RlIGZvciB0aGUgZ2l2ZW4gbG9jYWxlIG5hbWUuICBUaGUKLSAgcmV0dXJuZWQgbG9jYWxlIGNvZGUgaXMgZm9ybWF0dGVkIGZvciB1c2Ugd2l0aAotICBcZnVuY3Rpb257c2V0bG9jYWxlKCl9LiAgSWYgbm9ybWFsaXphdGlvbiBmYWlscywgdGhlIG9yaWdpbmFsIG5hbWUKLSAgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCi0gIElmIHRoZSBnaXZlbiBlbmNvZGluZyBpcyBub3Qga25vd24sIHRoZSBmdW5jdGlvbiBkZWZhdWx0cyB0bwotICB0aGUgZGVmYXVsdCBlbmNvZGluZyBmb3IgdGhlIGxvY2FsZSBjb2RlIGp1c3QgbGlrZQotICBcZnVuY3Rpb257c2V0bG9jYWxlKCl9LgotICBcdmVyc2lvbmFkZGVkezIuMH0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cmVzZXRsb2NhbGV9e1xvcHRpb25hbHtjYXRlZ29yeX19Ci0gIFNldHMgdGhlIGxvY2FsZSBmb3IgXHZhcntjYXRlZ29yeX0gdG8gdGhlIGRlZmF1bHQgc2V0dGluZy4KLQotICBUaGUgZGVmYXVsdCBzZXR0aW5nIGlzIGRldGVybWluZWQgYnkgY2FsbGluZwotICBcZnVuY3Rpb257Z2V0ZGVmYXVsdGxvY2FsZSgpfS4gIFx2YXJ7Y2F0ZWdvcnl9IGRlZmF1bHRzIHRvCi0gIFxjb25zdGFudHtMQ19BTEx9LgotICBcdmVyc2lvbmFkZGVkezIuMH0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c3RyY29sbH17c3RyaW5nMSwgc3RyaW5nMn0KLSAgQ29tcGFyZXMgdHdvIHN0cmluZ3MgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50Ci0gIFxjb25zdGFudHtMQ19DT0xMQVRFfSBzZXR0aW5nLiBBcyBhbnkgb3RoZXIgY29tcGFyZSBmdW5jdGlvbiwKLSAgcmV0dXJucyBhIG5lZ2F0aXZlLCBvciBhIHBvc2l0aXZlIHZhbHVlLCBvciBcY29kZXswfSwgZGVwZW5kaW5nIG9uCi0gIHdoZXRoZXIgXHZhcntzdHJpbmcxfSBjb2xsYXRlcyBiZWZvcmUgb3IgYWZ0ZXIgXHZhcntzdHJpbmcyfSBvciBpcwotICBlcXVhbCB0byBpdC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c3RyeGZybX17c3RyaW5nfQotICBUcmFuc2Zvcm1zIGEgc3RyaW5nIHRvIG9uZSB0aGF0IGNhbiBiZSB1c2VkIGZvciB0aGUgYnVpbHQtaW4KLSAgZnVuY3Rpb24gXGZ1bmN0aW9ue2NtcCgpfVxiaWZ1bmNpbmRleHtjbXB9LCBhbmQgc3RpbGwgcmV0dXJucwotICBsb2NhbGUtYXdhcmUgcmVzdWx0cy4gIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgd2hlbiB0aGUgc2FtZQotICBzdHJpbmcgaXMgY29tcGFyZWQgcmVwZWF0ZWRseSwgZS5nLiB3aGVuIGNvbGxhdGluZyBhIHNlcXVlbmNlIG9mCi0gIHN0cmluZ3MuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2Zvcm1hdH17Zm9ybWF0LCB2YWxcb3B0aW9uYWx7LCBncm91cGluZ1xvcHRpb25hbHssIG1vbmV0YXJ5fX19Ci0gIEZvcm1hdHMgYSBudW1iZXIgXHZhcnt2YWx9IGFjY29yZGluZyB0byB0aGUgY3VycmVudAotICBcY29uc3RhbnR7TENfTlVNRVJJQ30gc2V0dGluZy4gIFRoZSBmb3JtYXQgZm9sbG93cyB0aGUgY29udmVudGlvbnMKLSAgb2YgdGhlIFxjb2Rle1wlfSBvcGVyYXRvci4gIEZvciBmbG9hdGluZyBwb2ludCB2YWx1ZXMsIHRoZSBkZWNpbWFsCi0gIHBvaW50IGlzIG1vZGlmaWVkIGlmIGFwcHJvcHJpYXRlLiAgSWYgXHZhcntncm91cGluZ30gaXMgdHJ1ZSwgYWxzbwotICB0YWtlcyB0aGUgZ3JvdXBpbmcgaW50byBhY2NvdW50LgotCi0gIElmIFx2YXJ7bW9uZXRhcnl9IGlzIHRydWUsIHRoZSBjb252ZXJzaW9uIHVzZXMgbW9uZXRhcnkgdGhvdXNhbmRzCi0gIHNlcGFyYXRvciBhbmQgZ3JvdXBpbmcgc3RyaW5ncy4KLQotICBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gd2lsbCBvbmx5IHdvcmsgZm9yIGV4YWN0bHkgb25lIFwlY2hhcgotICBzcGVjaWZpZXIuIEZvciB3aG9sZSBmb3JtYXQgc3RyaW5ncywgdXNlIFxmdW5jdGlvbntmb3JtYXRfc3RyaW5nKCl9LgotCi0gIFx2ZXJzaW9uY2hhbmdlZFtBZGRlZCB0aGUgXHZhcnttb25ldGFyeX0gcGFyYW1ldGVyXXsyLjV9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2Zvcm1hdF9zdHJpbmd9e2Zvcm1hdCwgdmFsXG9wdGlvbmFseywgZ3JvdXBpbmd9fQotICBQcm9jZXNzZXMgZm9ybWF0dGluZyBzcGVjaWZpZXJzIGFzIGluIFxjb2Rle2Zvcm1hdCBcJSB2YWx9LAotICBidXQgdGFrZXMgdGhlIGN1cnJlbnQgbG9jYWxlIHNldHRpbmdzIGludG8gYWNjb3VudC4KLQotICBcdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y3VycmVuY3l9e3ZhbFxvcHRpb25hbHssIHN5bWJvbFxvcHRpb25hbHssIGdyb3VwaW5nXG9wdGlvbmFseywgaW50ZXJuYXRpb25hbH19fX0KLSAgRm9ybWF0cyBhIG51bWJlciBcdmFye3ZhbH0gYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IFxjb25zdGFudHtMQ19NT05FVEFSWX0KLSAgc2V0dGluZ3MuIAotICAKLSAgVGhlIHJldHVybmVkIHN0cmluZyBpbmNsdWRlcyB0aGUgY3VycmVuY3kgc3ltYm9sIGlmIFx2YXJ7c3ltYm9sfSBpcyB0cnVlLAotICB3aGljaCBpcyB0aGUgZGVmYXVsdC4KLSAgSWYgXHZhcntncm91cGluZ30gaXMgdHJ1ZSAod2hpY2ggaXMgbm90IHRoZSBkZWZhdWx0KSwgZ3JvdXBpbmcgaXMgZG9uZSB3aXRoCi0gIHRoZSB2YWx1ZS4KLSAgSWYgXHZhcntpbnRlcm5hdGlvbmFsfSBpcyB0cnVlICh3aGljaCBpcyBub3QgdGhlIGRlZmF1bHQpLCB0aGUgaW50ZXJuYXRpb25hbAotICBjdXJyZW5jeSBzeW1ib2wgaXMgdXNlZC4KLQotICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdCB3b3JrIHdpdGggdGhlIGBDJyBsb2NhbGUsIHNvIHlvdSBoYXZlIHRvIHNldAotICBhIGxvY2FsZSB2aWEgXGZ1bmN0aW9ue3NldGxvY2FsZSgpfSBmaXJzdC4KLQotICBcdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c3RyfXtmbG9hdH0KLSAgRm9ybWF0cyBhIGZsb2F0aW5nIHBvaW50IG51bWJlciB1c2luZyB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlCi0gIGJ1aWx0LWluIGZ1bmN0aW9uIFxjb2Rle3N0cihcdmFye2Zsb2F0fSl9LCBidXQgdGFrZXMgdGhlIGRlY2ltYWwKLSAgcG9pbnQgaW50byBhY2NvdW50LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXthdG9mfXtzdHJpbmd9Ci0gIENvbnZlcnRzIGEgc3RyaW5nIHRvIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCBmb2xsb3dpbmcgdGhlCi0gIFxjb25zdGFudHtMQ19OVU1FUklDfSBzZXR0aW5ncy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317YXRvaX17c3RyaW5nfQotICBDb252ZXJ0cyBhIHN0cmluZyB0byBhbiBpbnRlZ2VyLCBmb2xsb3dpbmcgdGhlCi0gIFxjb25zdGFudHtMQ19OVU1FUklDfSBjb252ZW50aW9ucy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317TENfQ1RZUEV9Ci1ccmVmc3Rtb2RpbmRleHtzdHJpbmd9Ci0gIExvY2FsZSBjYXRlZ29yeSBmb3IgdGhlIGNoYXJhY3RlciB0eXBlIGZ1bmN0aW9ucy4gIERlcGVuZGluZyBvbiB0aGUKLSAgc2V0dGluZ3Mgb2YgdGhpcyBjYXRlZ29yeSwgdGhlIGZ1bmN0aW9ucyBvZiBtb2R1bGUKLSAgXHJlZm1vZHVsZXtzdHJpbmd9IGRlYWxpbmcgd2l0aCBjYXNlIGNoYW5nZSB0aGVpciBiZWhhdmlvdXIuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e0xDX0NPTExBVEV9Ci0gIExvY2FsZSBjYXRlZ29yeSBmb3Igc29ydGluZyBzdHJpbmdzLiAgVGhlIGZ1bmN0aW9ucwotICBcZnVuY3Rpb257c3RyY29sbCgpfSBhbmQgXGZ1bmN0aW9ue3N0cnhmcm0oKX0gb2YgdGhlCi0gIFxtb2R1bGV7bG9jYWxlfSBtb2R1bGUgYXJlIGFmZmVjdGVkLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtMQ19USU1FfQotICBMb2NhbGUgY2F0ZWdvcnkgZm9yIHRoZSBmb3JtYXR0aW5nIG9mIHRpbWUuICBUaGUgZnVuY3Rpb24KLSAgXGZ1bmN0aW9ue3RpbWUuc3RyZnRpbWUoKX0gZm9sbG93cyB0aGVzZSBjb252ZW50aW9ucy4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317TENfTU9ORVRBUll9Ci0gIExvY2FsZSBjYXRlZ29yeSBmb3IgZm9ybWF0dGluZyBvZiBtb25ldGFyeSB2YWx1ZXMuICBUaGUgYXZhaWxhYmxlCi0gIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSBmcm9tIHRoZSBcZnVuY3Rpb257bG9jYWxlY29udigpfSBmdW5jdGlvbi4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317TENfTUVTU0FHRVN9Ci0gIExvY2FsZSBjYXRlZ29yeSBmb3IgbWVzc2FnZSBkaXNwbGF5LiBQeXRob24gY3VycmVudGx5IGRvZXMgbm90Ci0gIHN1cHBvcnQgYXBwbGljYXRpb24gc3BlY2lmaWMgbG9jYWxlLWF3YXJlIG1lc3NhZ2VzLiAgTWVzc2FnZXMKLSAgZGlzcGxheWVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtLCBsaWtlIHRob3NlIHJldHVybmVkIGJ5Ci0gIFxmdW5jdGlvbntvcy5zdHJlcnJvcigpfSBtaWdodCBiZSBhZmZlY3RlZCBieSB0aGlzIGNhdGVnb3J5LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtMQ19OVU1FUklDfQotICBMb2NhbGUgY2F0ZWdvcnkgZm9yIGZvcm1hdHRpbmcgbnVtYmVycy4gIFRoZSBmdW5jdGlvbnMKLSAgXGZ1bmN0aW9ue2Zvcm1hdCgpfSwgXGZ1bmN0aW9ue2F0b2koKX0sIFxmdW5jdGlvbnthdG9mKCl9IGFuZAotICBcZnVuY3Rpb257c3RyKCl9IG9mIHRoZSBcbW9kdWxle2xvY2FsZX0gbW9kdWxlIGFyZSBhZmZlY3RlZCBieSB0aGF0Ci0gIGNhdGVnb3J5LiAgQWxsIG90aGVyIG51bWVyaWMgZm9ybWF0dGluZyBvcGVyYXRpb25zIGFyZSBub3QKLSAgYWZmZWN0ZWQuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e0xDX0FMTH0KLSAgQ29tYmluYXRpb24gb2YgYWxsIGxvY2FsZSBzZXR0aW5ncy4gIElmIHRoaXMgZmxhZyBpcyB1c2VkIHdoZW4gdGhlCi0gIGxvY2FsZSBpcyBjaGFuZ2VkLCBzZXR0aW5nIHRoZSBsb2NhbGUgZm9yIGFsbCBjYXRlZ29yaWVzIGlzCi0gIGF0dGVtcHRlZC4gSWYgdGhhdCBmYWlscyBmb3IgYW55IGNhdGVnb3J5LCBubyBjYXRlZ29yeSBpcyBjaGFuZ2VkIGF0Ci0gIGFsbC4gIFdoZW4gdGhlIGxvY2FsZSBpcyByZXRyaWV2ZWQgdXNpbmcgdGhpcyBmbGFnLCBhIHN0cmluZwotICBpbmRpY2F0aW5nIHRoZSBzZXR0aW5nIGZvciBhbGwgY2F0ZWdvcmllcyBpcyByZXR1cm5lZC4gVGhpcyBzdHJpbmcKLSAgY2FuIGJlIGxhdGVyIHVzZWQgdG8gcmVzdG9yZSB0aGUgc2V0dGluZ3MuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e0NIQVJfTUFYfQotICBUaGlzIGlzIGEgc3ltYm9saWMgY29uc3RhbnQgdXNlZCBmb3IgZGlmZmVyZW50IHZhbHVlcyByZXR1cm5lZCBieQotICBcZnVuY3Rpb257bG9jYWxlY29udigpfS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVRoZSBcZnVuY3Rpb257bmxfbGFuZ2luZm99IGZ1bmN0aW9uIGFjY2VwdHMgb25lIG9mIHRoZSBmb2xsb3dpbmcga2V5cy4KLU1vc3QgZGVzY3JpcHRpb25zIGFyZSB0YWtlbiBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIGRlc2NyaXB0aW9uIGluIHRoZQotR05VIEMgbGlicmFyeS4KLQotXGJlZ2lue2RhdGFkZXNjfXtDT0RFU0VUfQotUmV0dXJuIGEgc3RyaW5nIHdpdGggdGhlIG5hbWUgb2YgdGhlIGNoYXJhY3RlciBlbmNvZGluZyB1c2VkIGluIHRoZQotc2VsZWN0ZWQgbG9jYWxlLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtEX1RfRk1UfQotUmV0dXJuIGEgc3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBmb3JtYXQgc3RyaW5nIGZvciBzdHJmdGltZSgzKSB0bwotcmVwcmVzZW50IHRpbWUgYW5kIGRhdGUgaW4gYSBsb2NhbGUtc3BlY2lmaWMgd2F5LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtEX0ZNVH0KLVJldHVybiBhIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgZm9ybWF0IHN0cmluZyBmb3Igc3RyZnRpbWUoMykgdG8KLXJlcHJlc2VudCBhIGRhdGUgaW4gYSBsb2NhbGUtc3BlY2lmaWMgd2F5LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtUX0ZNVH0KLVJldHVybiBhIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgZm9ybWF0IHN0cmluZyBmb3Igc3RyZnRpbWUoMykgdG8KLXJlcHJlc2VudCBhIHRpbWUgaW4gYSBsb2NhbGUtc3BlY2lmaWMgd2F5LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtUX0ZNVF9BTVBNfQotVGhlIHJldHVybiB2YWx1ZSBjYW4gYmUgdXNlZCBhcyBhIGZvcm1hdCBzdHJpbmcgZm9yIGBzdHJmdGltZScgdG8KLXJlcHJlc2VudCB0aW1lIGluIHRoZSBhbS9wbSBmb3JtYXQuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e0RBWV8xIC4uLiBEQVlfN30KLVJldHVybiBuYW1lIG9mIHRoZSBuLXRoIGRheSBvZiB0aGUgd2Vlay4gXHdhcm5pbmd7VGhpcwotZm9sbG93cyB0aGUgVVMgY29udmVudGlvbiBvZiBcY29uc3RhbnR7REFZXzF9IGJlaW5nIFN1bmRheSwgbm90IHRoZQotaW50ZXJuYXRpb25hbCBjb252ZW50aW9uIChJU08gODYwMSkgdGhhdCBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZgotdGhlIHdlZWsufQotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtBQkRBWV8xIC4uLiBBQkRBWV83fQotUmV0dXJuIGFiYnJldmlhdGVkIG5hbWUgb2YgdGhlIG4tdGggZGF5IG9mIHRoZSB3ZWVrLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtNT05fMSAuLi4gTU9OXzEyfQotUmV0dXJuIG5hbWUgb2YgdGhlIG4tdGggbW9udGguCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e0FCTU9OXzEgLi4uIEFCTU9OXzEyfQotUmV0dXJuIGFiYnJldmlhdGVkIG5hbWUgb2YgdGhlIG4tdGggbW9udGguCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1JBRElYQ0hBUn0KLVJldHVybiByYWRpeCBjaGFyYWN0ZXIgKGRlY2ltYWwgZG90LCBkZWNpbWFsIGNvbW1hLCBldGMuKQotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtUSE9VU0VQfQotUmV0dXJuIHNlcGFyYXRvciBjaGFyYWN0ZXIgZm9yIHRob3VzYW5kcyAoZ3JvdXBzIG9mIHRocmVlIGRpZ2l0cykuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1lFU0VYUFJ9Ci1SZXR1cm4gYSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBjYW4gYmUgdXNlZCB3aXRoIHRoZSByZWdleAotZnVuY3Rpb24gdG8gcmVjb2duaXplIGEgcG9zaXRpdmUgcmVzcG9uc2UgdG8gYSB5ZXMvbm8gcXVlc3Rpb24uCi1cd2FybmluZ3tUaGUgZXhwcmVzc2lvbiBpcyBpbiB0aGUgc3ludGF4IHN1aXRhYmxlIGZvciB0aGUKLVxjZnVuY3Rpb257cmVnZXgoKX0gZnVuY3Rpb24gZnJvbSB0aGUgQyBsaWJyYXJ5LCB3aGljaCBtaWdodCBkaWZmZXIKLWZyb20gdGhlIHN5bnRheCB1c2VkIGluIFxyZWZtb2R1bGV7cmV9Ln0KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317Tk9FWFBSfQotUmV0dXJuIGEgcmVndWxhciBleHByZXNzaW9uIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCB0aGUgcmVnZXgoMykKLWZ1bmN0aW9uIHRvIHJlY29nbml6ZSBhIG5lZ2F0aXZlIHJlc3BvbnNlIHRvIGEgeWVzL25vIHF1ZXN0aW9uLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtDUk5DWVNUUn0KLVJldHVybiB0aGUgY3VycmVuY3kgc3ltYm9sLCBwcmVjZWRlZCBieSAiLSIgaWYgdGhlIHN5bWJvbCBzaG91bGQKLWFwcGVhciBiZWZvcmUgdGhlIHZhbHVlLCAiKyIgaWYgdGhlIHN5bWJvbCBzaG91bGQgYXBwZWFyIGFmdGVyIHRoZQotdmFsdWUsIG9yICIuIiBpZiB0aGUgc3ltYm9sIHNob3VsZCByZXBsYWNlIHRoZSByYWRpeCBjaGFyYWN0ZXIuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e0VSQX0KLVRoZSByZXR1cm4gdmFsdWUgcmVwcmVzZW50cyB0aGUgZXJhIHVzZWQgaW4gdGhlIGN1cnJlbnQgbG9jYWxlLgotCi1Nb3N0IGxvY2FsZXMgZG8gbm90IGRlZmluZSB0aGlzIHZhbHVlLiAgQW4gZXhhbXBsZSBvZiBhIGxvY2FsZSB3aGljaAotZG9lcyBkZWZpbmUgdGhpcyB2YWx1ZSBpcyB0aGUgSmFwYW5lc2Ugb25lLiAgSW4gSmFwYW4sIHRoZSB0cmFkaXRpb25hbAotcmVwcmVzZW50YXRpb24gb2YgZGF0ZXMgaW5jbHVkZXMgdGhlIG5hbWUgb2YgdGhlIGVyYSBjb3JyZXNwb25kaW5nIHRvCi10aGUgdGhlbi1lbXBlcm9yJ3MgcmVpZ24uCi0KLU5vcm1hbGx5IGl0IHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IHRvIHVzZSB0aGlzIHZhbHVlIGRpcmVjdGx5LgotU3BlY2lmeWluZyB0aGUgXGNvZGV7RX0gbW9kaWZpZXIgaW4gdGhlaXIgZm9ybWF0IHN0cmluZ3MgY2F1c2VzIHRoZQotXGZ1bmN0aW9ue3N0cmZ0aW1lfSBmdW5jdGlvbiB0byB1c2UgdGhpcyBpbmZvcm1hdGlvbi4gIFRoZSBmb3JtYXQgb2YgdGhlCi1yZXR1cm5lZCBzdHJpbmcgaXMgbm90IHNwZWNpZmllZCwgYW5kIHRoZXJlZm9yZSB5b3Ugc2hvdWxkIG5vdCBhc3N1bWUKLWtub3dsZWRnZSBvZiBpdCBvbiBkaWZmZXJlbnQgc3lzdGVtcy4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317RVJBX1lFQVJ9Ci1UaGUgcmV0dXJuIHZhbHVlIGdpdmVzIHRoZSB5ZWFyIGluIHRoZSByZWxldmFudCBlcmEgb2YgdGhlIGxvY2FsZS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317RVJBX0RfVF9GTVR9Ci1UaGlzIHJldHVybiB2YWx1ZSBjYW4gYmUgdXNlZCBhcyBhIGZvcm1hdCBzdHJpbmcgZm9yCi1cZnVuY3Rpb257c3RyZnRpbWV9IHRvIHJlcHJlc2VudCBkYXRlcyBhbmQgdGltZXMgaW4gYSBsb2NhbGUtc3BlY2lmaWMKLWVyYS1iYXNlZCB3YXkuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e0VSQV9EX0ZNVH0KLVRoaXMgcmV0dXJuIHZhbHVlIGNhbiBiZSB1c2VkIGFzIGEgZm9ybWF0IHN0cmluZyBmb3IKLVxmdW5jdGlvbntzdHJmdGltZX0gdG8gcmVwcmVzZW50IHRpbWUgaW4gYSBsb2NhbGUtc3BlY2lmaWMgZXJhLWJhc2VkCi13YXkuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e0FMVF9ESUdJVFN9Ci1UaGUgcmV0dXJuIHZhbHVlIGlzIGEgcmVwcmVzZW50YXRpb24gb2YgdXAgdG8gMTAwIHZhbHVlcyB1c2VkIHRvCi1yZXByZXNlbnQgdGhlIHZhbHVlcyAwIHRvIDk5LgotXGVuZHtkYXRhZGVzY30KLQotRXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGltcG9ydCBsb2NhbGUKLT4+PiBsb2MgPSBsb2NhbGUuZ2V0bG9jYWxlKGxvY2FsZS5MQ19BTEwpICMgZ2V0IGN1cnJlbnQgbG9jYWxlCi0+Pj4gbG9jYWxlLnNldGxvY2FsZShsb2NhbGUuTENfQUxMLCAnZGVfREUnKSAjIHVzZSBHZXJtYW4gbG9jYWxlOyBuYW1lIG1pZ2h0IHZhcnkgd2l0aCBwbGF0Zm9ybQotPj4+IGxvY2FsZS5zdHJjb2xsKCdmXHhlNG4nLCAnZm9vJykgIyBjb21wYXJlIGEgc3RyaW5nIGNvbnRhaW5pbmcgYW4gdW1sYXV0IAotPj4+IGxvY2FsZS5zZXRsb2NhbGUobG9jYWxlLkxDX0FMTCwgJycpICMgdXNlIHVzZXIncyBwcmVmZXJyZWQgbG9jYWxlCi0+Pj4gbG9jYWxlLnNldGxvY2FsZShsb2NhbGUuTENfQUxMLCAnQycpICMgdXNlIGRlZmF1bHQgKEMpIGxvY2FsZQotPj4+IGxvY2FsZS5zZXRsb2NhbGUobG9jYWxlLkxDX0FMTCwgbG9jKSAjIHJlc3RvcmUgc2F2ZWQgbG9jYWxlCi1cZW5ke3ZlcmJhdGltfQotCi0KLVxzdWJzZWN0aW9ue0JhY2tncm91bmQsIGRldGFpbHMsIGhpbnRzLCB0aXBzIGFuZCBjYXZlYXRzfQotCi1UaGUgQyBzdGFuZGFyZCBkZWZpbmVzIHRoZSBsb2NhbGUgYXMgYSBwcm9ncmFtLXdpZGUgcHJvcGVydHkgdGhhdCBtYXkKLWJlIHJlbGF0aXZlbHkgZXhwZW5zaXZlIHRvIGNoYW5nZS4gIE9uIHRvcCBvZiB0aGF0LCBzb21lCi1pbXBsZW1lbnRhdGlvbiBhcmUgYnJva2VuIGluIHN1Y2ggYSB3YXkgdGhhdCBmcmVxdWVudCBsb2NhbGUgY2hhbmdlcwotbWF5IGNhdXNlIGNvcmUgZHVtcHMuICBUaGlzIG1ha2VzIHRoZSBsb2NhbGUgc29tZXdoYXQgcGFpbmZ1bCB0byB1c2UKLWNvcnJlY3RseS4KLQotSW5pdGlhbGx5LCB3aGVuIGEgcHJvZ3JhbSBpcyBzdGFydGVkLCB0aGUgbG9jYWxlIGlzIHRoZSBcc2FtcHtDfSBsb2NhbGUsIG5vCi1tYXR0ZXIgd2hhdCB0aGUgdXNlcidzIHByZWZlcnJlZCBsb2NhbGUgaXMuICBUaGUgcHJvZ3JhbSBtdXN0Ci1leHBsaWNpdGx5IHNheSB0aGF0IGl0IHdhbnRzIHRoZSB1c2VyJ3MgcHJlZmVycmVkIGxvY2FsZSBzZXR0aW5ncyBieQotY2FsbGluZyBcY29kZXtzZXRsb2NhbGUoTENfQUxMLCAnJyl9LgotCi1JdCBpcyBnZW5lcmFsbHkgYSBiYWQgaWRlYSB0byBjYWxsIFxmdW5jdGlvbntzZXRsb2NhbGUoKX0gaW4gc29tZSBsaWJyYXJ5Ci1yb3V0aW5lLCBzaW5jZSBhcyBhIHNpZGUgZWZmZWN0IGl0IGFmZmVjdHMgdGhlIGVudGlyZSBwcm9ncmFtLiAgU2F2aW5nCi1hbmQgcmVzdG9yaW5nIGl0IGlzIGFsbW9zdCBhcyBiYWQ6IGl0IGlzIGV4cGVuc2l2ZSBhbmQgYWZmZWN0cyBvdGhlcgotdGhyZWFkcyB0aGF0IGhhcHBlbiB0byBydW4gYmVmb3JlIHRoZSBzZXR0aW5ncyBoYXZlIGJlZW4gcmVzdG9yZWQuCi0KLUlmLCB3aGVuIGNvZGluZyBhIG1vZHVsZSBmb3IgZ2VuZXJhbCB1c2UsIHlvdSBuZWVkIGEgbG9jYWxlCi1pbmRlcGVuZGVudCB2ZXJzaW9uIG9mIGFuIG9wZXJhdGlvbiB0aGF0IGlzIGFmZmVjdGVkIGJ5IHRoZSBsb2NhbGUKLShzdWNoIGFzIFxmdW5jdGlvbntzdHJpbmcubG93ZXIoKX0sIG9yIGNlcnRhaW4gZm9ybWF0cyB1c2VkIHdpdGgKLVxmdW5jdGlvbnt0aW1lLnN0cmZ0aW1lKCl9KSwgeW91IHdpbGwgaGF2ZSB0byBmaW5kIGEgd2F5IHRvIGRvIGl0Ci13aXRob3V0IHVzaW5nIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IHJvdXRpbmUuICBFdmVuIGJldHRlciBpcyBjb252aW5jaW5nCi15b3Vyc2VsZiB0aGF0IHVzaW5nIGxvY2FsZSBzZXR0aW5ncyBpcyBva2F5LiAgT25seSBhcyBhIGxhc3QgcmVzb3J0Ci1zaG91bGQgeW91IGRvY3VtZW50IHRoYXQgeW91ciBtb2R1bGUgaXMgbm90IGNvbXBhdGlibGUgd2l0aAotbm9uLVxzYW1we0N9IGxvY2FsZSBzZXR0aW5ncy4KLQotVGhlIGNhc2UgY29udmVyc2lvbiBmdW5jdGlvbnMgaW4gdGhlCi1ccmVmbW9kdWxle3N0cmluZ31ccmVmc3Rtb2RpbmRleHtzdHJpbmd9IG1vZHVsZSBhcmUgYWZmZWN0ZWQgYnkgdGhlCi1sb2NhbGUgc2V0dGluZ3MuICBXaGVuIGEgY2FsbCB0byB0aGUgXGZ1bmN0aW9ue3NldGxvY2FsZSgpfSBmdW5jdGlvbgotY2hhbmdlcyB0aGUgXGNvbnN0YW50e0xDX0NUWVBFfSBzZXR0aW5ncywgdGhlIHZhcmlhYmxlcwotXGNvZGV7c3RyaW5nLmxvd2VyY2FzZX0sIFxjb2Rle3N0cmluZy51cHBlcmNhc2V9IGFuZAotXGNvZGV7c3RyaW5nLmxldHRlcnN9IGFyZSByZWNhbGN1bGF0ZWQuICBOb3RlIHRoYXQgY29kZSB0aGF0IHVzZXMKLXRoZXNlIHZhcmlhYmxlIHRocm91Z2ggYFxrZXl3b3Jke2Zyb219IC4uLiBca2V5d29yZHtpbXBvcnR9IC4uLicsCi1lLmcuXCBcY29kZXtmcm9tIHN0cmluZyBpbXBvcnQgbGV0dGVyc30sIGlzIG5vdCBhZmZlY3RlZCBieSBzdWJzZXF1ZW50Ci1cZnVuY3Rpb257c2V0bG9jYWxlKCl9IGNhbGxzLgotCi1UaGUgb25seSB3YXkgdG8gcGVyZm9ybSBudW1lcmljIG9wZXJhdGlvbnMgYWNjb3JkaW5nIHRvIHRoZSBsb2NhbGUKLWlzIHRvIHVzZSB0aGUgc3BlY2lhbCBmdW5jdGlvbnMgZGVmaW5lZCBieSB0aGlzIG1vZHVsZToKLVxmdW5jdGlvbnthdG9mKCl9LCBcZnVuY3Rpb257YXRvaSgpfSwgXGZ1bmN0aW9ue2Zvcm1hdCgpfSwKLVxmdW5jdGlvbntzdHIoKX0uCi0KLVxzdWJzZWN0aW9ue0ZvciBleHRlbnNpb24gd3JpdGVycyBhbmQgcHJvZ3JhbXMgdGhhdCBlbWJlZCBQeXRob24KLSAgICAgICAgICAgIFxsYWJlbHtlbWJlZGRpbmctbG9jYWxlfX0KLQotRXh0ZW5zaW9uIG1vZHVsZXMgc2hvdWxkIG5ldmVyIGNhbGwgXGZ1bmN0aW9ue3NldGxvY2FsZSgpfSwgZXhjZXB0IHRvCi1maW5kIG91dCB3aGF0IHRoZSBjdXJyZW50IGxvY2FsZSBpcy4gIEJ1dCBzaW5jZSB0aGUgcmV0dXJuIHZhbHVlIGNhbgotb25seSBiZSB1c2VkIHBvcnRhYmx5IHRvIHJlc3RvcmUgaXQsIHRoYXQgaXMgbm90IHZlcnkgdXNlZnVsIChleGNlcHQKLXBlcmhhcHMgdG8gZmluZCBvdXQgd2hldGhlciBvciBub3QgdGhlIGxvY2FsZSBpcyBcc2FtcHtDfSkuCi0KLVdoZW4gUHl0aG9uIGNvZGUgdXNlcyB0aGUgXG1vZHVsZXtsb2NhbGV9IG1vZHVsZSB0byBjaGFuZ2UgdGhlIGxvY2FsZSwKLXRoaXMgYWxzbyBhZmZlY3RzIHRoZSBlbWJlZGRpbmcgYXBwbGljYXRpb24uICBJZiB0aGUgZW1iZWRkaW5nCi1hcHBsaWNhdGlvbiBkb2Vzbid0IHdhbnQgdGhpcyB0byBoYXBwZW4sIGl0IHNob3VsZCByZW1vdmUgdGhlCi1cbW9kdWxle19sb2NhbGV9IGV4dGVuc2lvbiBtb2R1bGUgKHdoaWNoIGRvZXMgYWxsIHRoZSB3b3JrKSBmcm9tIHRoZQotdGFibGUgb2YgYnVpbHQtaW4gbW9kdWxlcyBpbiB0aGUgXGZpbGV7Y29uZmlnLmN9IGZpbGUsIGFuZCBtYWtlIHN1cmUKLXRoYXQgdGhlIFxtb2R1bGV7X2xvY2FsZX0gbW9kdWxlIGlzIG5vdCBhY2Nlc3NpYmxlIGFzIGEgc2hhcmVkIGxpYnJhcnkuCi0KLQotXHN1YnNlY3Rpb257QWNjZXNzIHRvIG1lc3NhZ2UgY2F0YWxvZ3MgXGxhYmVse2xvY2FsZS1nZXR0ZXh0fX0KLQotVGhlIGxvY2FsZSBtb2R1bGUgZXhwb3NlcyB0aGUgQyBsaWJyYXJ5J3MgZ2V0dGV4dCBpbnRlcmZhY2Ugb24gc3lzdGVtcwotdGhhdCBwcm92aWRlIHRoaXMgaW50ZXJmYWNlLiAgSXQgY29uc2lzdHMgb2YgdGhlIGZ1bmN0aW9ucwotXGZ1bmN0aW9ue2dldHRleHQoKX0sIFxmdW5jdGlvbntkZ2V0dGV4dCgpfSwgXGZ1bmN0aW9ue2RjZ2V0dGV4dCgpfSwKLVxmdW5jdGlvbnt0ZXh0ZG9tYWluKCl9LCBcZnVuY3Rpb257YmluZHRleHRkb21haW4oKX0sIGFuZAotXGZ1bmN0aW9ue2JpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0KCl9LiAgVGhlc2UgYXJlIHNpbWlsYXIgdG8gdGhlIHNhbWUKLWZ1bmN0aW9ucyBpbiB0aGUgXHJlZm1vZHVsZXtnZXR0ZXh0fSBtb2R1bGUsIGJ1dCB1c2UgdGhlIEMgbGlicmFyeSdzCi1iaW5hcnkgZm9ybWF0IGZvciBtZXNzYWdlIGNhdGFsb2dzLCBhbmQgdGhlIEMgbGlicmFyeSdzIHNlYXJjaAotYWxnb3JpdGhtcyBmb3IgbG9jYXRpbmcgbWVzc2FnZSBjYXRhbG9ncy4gCi0KLVB5dGhvbiBhcHBsaWNhdGlvbnMgc2hvdWxkIG5vcm1hbGx5IGZpbmQgbm8gbmVlZCB0byBpbnZva2UgdGhlc2UKLWZ1bmN0aW9ucywgYW5kIHNob3VsZCB1c2UgXHJlZm1vZHVsZXtnZXR0ZXh0fSBpbnN0ZWFkLiAgQSBrbm93bgotZXhjZXB0aW9uIHRvIHRoaXMgcnVsZSBhcmUgYXBwbGljYXRpb25zIHRoYXQgbGluayB1c2UgYWRkaXRpb25hbCBDCi1saWJyYXJpZXMgd2hpY2ggaW50ZXJuYWxseSBpbnZva2UgXGNmdW5jdGlvbntnZXR0ZXh0KCl9IG9yCi1cZnVuY3Rpb257ZGNnZXR0ZXh0KCl9LiAgRm9yIHRoZXNlIGFwcGxpY2F0aW9ucywgaXQgbWF5IGJlIG5lY2Vzc2FyeSB0bwotYmluZCB0aGUgdGV4dCBkb21haW4sIHNvIHRoYXQgdGhlIGxpYnJhcmllcyBjYW4gcHJvcGVybHkgbG9jYXRlIHRoZWlyCi1tZXNzYWdlIGNhdGFsb2dzLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJsb2dnaW5nLnRleCBiL0RvYy9saWIvbGlibG9nZ2luZy50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YzNlNGUuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJsb2dnaW5nLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDE3NjggKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtsb2dnaW5nfSAtLS0KLSAgICAgICAgIExvZ2dpbmcgZmFjaWxpdHkgZm9yIFB5dGhvbn0KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2xvZ2dpbmd9Ci0KLSUgVGhlc2UgYXBwbHkgdG8gYWxsIG1vZHVsZXMsIGFuZCBtYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2U6Ci0KLVxtb2R1bGVhdXRob3J7VmluYXkgU2FqaXB9e3ZpbmF5X3NhamlwQHJlZC1kb3ZlLmNvbX0KLVxzZWN0aW9uYXV0aG9ye1ZpbmF5IFNhamlwfXt2aW5heV9zYWppcEByZWQtZG92ZS5jb219Ci0KLVxtb2R1bGVzeW5vcHNpc3tMb2dnaW5nIG1vZHVsZSBmb3IgUHl0aG9uIGJhc2VkIG9uIFxwZXB7MjgyfS59Ci0KLVxpbmRleGlpe0Vycm9yc317bG9nZ2luZ30KLQotXHZlcnNpb25hZGRlZHsyLjN9Ci1UaGlzIG1vZHVsZSBkZWZpbmVzIGZ1bmN0aW9ucyBhbmQgY2xhc3NlcyB3aGljaCBpbXBsZW1lbnQgYSBmbGV4aWJsZQotZXJyb3IgbG9nZ2luZyBzeXN0ZW0gZm9yIGFwcGxpY2F0aW9ucy4KLQotTG9nZ2luZyBpcyBwZXJmb3JtZWQgYnkgY2FsbGluZyBtZXRob2RzIG9uIGluc3RhbmNlcyBvZiB0aGUKLVxjbGFzc3tMb2dnZXJ9IGNsYXNzIChoZXJlYWZ0ZXIgY2FsbGVkIFxkZm57bG9nZ2Vyc30pLiBFYWNoIGluc3RhbmNlIGhhcyBhCi1uYW1lLCBhbmQgdGhleSBhcmUgY29uY2VwdHVhbGx5IGFycmFuZ2VkIGluIGEgbmFtZSBzcGFjZSBoaWVyYXJjaHkKLXVzaW5nIGRvdHMgKHBlcmlvZHMpIGFzIHNlcGFyYXRvcnMuIEZvciBleGFtcGxlLCBhIGxvZ2dlciBuYW1lZAotInNjYW4iIGlzIHRoZSBwYXJlbnQgb2YgbG9nZ2VycyAic2Nhbi50ZXh0IiwgInNjYW4uaHRtbCIgYW5kICJzY2FuLnBkZiIuCi1Mb2dnZXIgbmFtZXMgY2FuIGJlIGFueXRoaW5nIHlvdSB3YW50LCBhbmQgaW5kaWNhdGUgdGhlIGFyZWEgb2YgYW4KLWFwcGxpY2F0aW9uIGluIHdoaWNoIGEgbG9nZ2VkIG1lc3NhZ2Ugb3JpZ2luYXRlcy4KLQotTG9nZ2VkIG1lc3NhZ2VzIGFsc28gaGF2ZSBsZXZlbHMgb2YgaW1wb3J0YW5jZSBhc3NvY2lhdGVkIHdpdGggdGhlbS4KLVRoZSBkZWZhdWx0IGxldmVscyBwcm92aWRlZCBhcmUgXGNvbnN0YW50e0RFQlVHfSwgXGNvbnN0YW50e0lORk99LAotXGNvbnN0YW50e1dBUk5JTkd9LCBcY29uc3RhbnR7RVJST1J9IGFuZCBcY29uc3RhbnR7Q1JJVElDQUx9LiBBcyBhCi1jb252ZW5pZW5jZSwgeW91IGluZGljYXRlIHRoZSBpbXBvcnRhbmNlIG9mIGEgbG9nZ2VkIG1lc3NhZ2UgYnkgY2FsbGluZwotYW4gYXBwcm9wcmlhdGUgbWV0aG9kIG9mIFxjbGFzc3tMb2dnZXJ9LiBUaGUgbWV0aG9kcyBhcmUKLVxtZXRob2R7ZGVidWcoKX0sIFxtZXRob2R7aW5mbygpfSwgXG1ldGhvZHt3YXJuaW5nKCl9LCBcbWV0aG9ke2Vycm9yKCl9IGFuZAotXG1ldGhvZHtjcml0aWNhbCgpfSwgd2hpY2ggbWlycm9yIHRoZSBkZWZhdWx0IGxldmVscy4gWW91IGFyZSBub3QKLWNvbnN0cmFpbmVkIHRvIHVzZSB0aGVzZSBsZXZlbHM6IHlvdSBjYW4gc3BlY2lmeSB5b3VyIG93biBhbmQgdXNlIGEKLW1vcmUgZ2VuZXJhbCBcY2xhc3N7TG9nZ2VyfSBtZXRob2QsIFxtZXRob2R7bG9nKCl9LCB3aGljaCB0YWtlcyBhbgotZXhwbGljaXQgbGV2ZWwgYXJndW1lbnQuCi0KLVRoZSBudW1lcmljIHZhbHVlcyBvZiBsb2dnaW5nIGxldmVscyBhcmUgZ2l2ZW4gaW4gdGhlIGZvbGxvd2luZyB0YWJsZS4gVGhlc2UKLWFyZSBwcmltYXJpbHkgb2YgaW50ZXJlc3QgaWYgeW91IHdhbnQgdG8gZGVmaW5lIHlvdXIgb3duIGxldmVscywgYW5kIG5lZWQKLXRoZW0gdG8gaGF2ZSBzcGVjaWZpYyB2YWx1ZXMgcmVsYXRpdmUgdG8gdGhlIHByZWRlZmluZWQgbGV2ZWxzLiBJZiB5b3UKLWRlZmluZSBhIGxldmVsIHdpdGggdGhlIHNhbWUgbnVtZXJpYyB2YWx1ZSwgaXQgb3ZlcndyaXRlcyB0aGUgcHJlZGVmaW5lZAotdmFsdWU7IHRoZSBwcmVkZWZpbmVkIG5hbWUgaXMgbG9zdC4KLQotXGJlZ2lue3RhYmxlaWl9e2x8bH17Y29kZX17TGV2ZWx9e051bWVyaWMgdmFsdWV9Ci0gIFxsaW5laWl7Q1JJVElDQUx9ezUwfQotICBcbGluZWlpe0VSUk9SfXs0MH0KLSAgXGxpbmVpaXtXQVJOSU5HfXszMH0KLSAgXGxpbmVpaXtJTkZPfXsyMH0KLSAgXGxpbmVpaXtERUJVR317MTB9Ci0gIFxsaW5laWl7Tk9UU0VUfXswfQotXGVuZHt0YWJsZWlpfQotCi1MZXZlbHMgY2FuIGFsc28gYmUgYXNzb2NpYXRlZCB3aXRoIGxvZ2dlcnMsIGJlaW5nIHNldCBlaXRoZXIgYnkgdGhlCi1kZXZlbG9wZXIgb3IgdGhyb3VnaCBsb2FkaW5nIGEgc2F2ZWQgbG9nZ2luZyBjb25maWd1cmF0aW9uLiBXaGVuIGEKLWxvZ2dpbmcgbWV0aG9kIGlzIGNhbGxlZCBvbiBhIGxvZ2dlciwgdGhlIGxvZ2dlciBjb21wYXJlcyBpdHMgb3duCi1sZXZlbCB3aXRoIHRoZSBsZXZlbCBhc3NvY2lhdGVkIHdpdGggdGhlIG1ldGhvZCBjYWxsLiBJZiB0aGUgbG9nZ2VyJ3MKLWxldmVsIGlzIGhpZ2hlciB0aGFuIHRoZSBtZXRob2QgY2FsbCdzLCBubyBsb2dnaW5nIG1lc3NhZ2UgaXMgYWN0dWFsbHkKLWdlbmVyYXRlZC4gVGhpcyBpcyB0aGUgYmFzaWMgbWVjaGFuaXNtIGNvbnRyb2xsaW5nIHRoZSB2ZXJib3NpdHkgb2YKLWxvZ2dpbmcgb3V0cHV0LgotCi1Mb2dnaW5nIG1lc3NhZ2VzIGFyZSBlbmNvZGVkIGFzIGluc3RhbmNlcyBvZiB0aGUgXGNsYXNze0xvZ1JlY29yZH0gY2xhc3MuCi1XaGVuIGEgbG9nZ2VyIGRlY2lkZXMgdG8gYWN0dWFsbHkgbG9nIGFuIGV2ZW50LCBhIFxjbGFzc3tMb2dSZWNvcmR9Ci1pbnN0YW5jZSBpcyBjcmVhdGVkIGZyb20gdGhlIGxvZ2dpbmcgbWVzc2FnZS4KLQotTG9nZ2luZyBtZXNzYWdlcyBhcmUgc3ViamVjdGVkIHRvIGEgZGlzcGF0Y2ggbWVjaGFuaXNtIHRocm91Z2ggdGhlCi11c2Ugb2YgXGRmbntoYW5kbGVyc30sIHdoaWNoIGFyZSBpbnN0YW5jZXMgb2Ygc3ViY2xhc3NlcyBvZiB0aGUKLVxjbGFzc3tIYW5kbGVyfSBjbGFzcy4gSGFuZGxlcnMgYXJlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IGEgbG9nZ2VkCi1tZXNzYWdlIChpbiB0aGUgZm9ybSBvZiBhIFxjbGFzc3tMb2dSZWNvcmR9KSBlbmRzIHVwIGluIGEgcGFydGljdWxhcgotbG9jYXRpb24gKG9yIHNldCBvZiBsb2NhdGlvbnMpIHdoaWNoIGlzIHVzZWZ1bCBmb3IgdGhlIHRhcmdldCBhdWRpZW5jZSBmb3IKLXRoYXQgbWVzc2FnZSAoc3VjaCBhcyBlbmQgdXNlcnMsIHN1cHBvcnQgZGVzayBzdGFmZiwgc3lzdGVtIGFkbWluaXN0cmF0b3JzLAotZGV2ZWxvcGVycykuIEhhbmRsZXJzIGFyZSBwYXNzZWQgXGNsYXNze0xvZ1JlY29yZH0gaW5zdGFuY2VzIGludGVuZGVkIGZvcgotcGFydGljdWxhciBkZXN0aW5hdGlvbnMuIEVhY2ggbG9nZ2VyIGNhbiBoYXZlIHplcm8sIG9uZSBvciBtb3JlIGhhbmRsZXJzCi1hc3NvY2lhdGVkIHdpdGggaXQgKHZpYSB0aGUgXG1ldGhvZHthZGRIYW5kbGVyKCl9IG1ldGhvZCBvZiBcY2xhc3N7TG9nZ2VyfSkuCi1JbiBhZGRpdGlvbiB0byBhbnkgaGFuZGxlcnMgZGlyZWN0bHkgYXNzb2NpYXRlZCB3aXRoIGEgbG9nZ2VyLAotXGVtcGh7YWxsIGhhbmRsZXJzIGFzc29jaWF0ZWQgd2l0aCBhbGwgYW5jZXN0b3JzIG9mIHRoZSBsb2dnZXJ9IGFyZQotY2FsbGVkIHRvIGRpc3BhdGNoIHRoZSBtZXNzYWdlLgotCi1KdXN0IGFzIGZvciBsb2dnZXJzLCBoYW5kbGVycyBjYW4gaGF2ZSBsZXZlbHMgYXNzb2NpYXRlZCB3aXRoIHRoZW0uCi1BIGhhbmRsZXIncyBsZXZlbCBhY3RzIGFzIGEgZmlsdGVyIGluIHRoZSBzYW1lIHdheSBhcyBhIGxvZ2dlcidzIGxldmVsIGRvZXMuCi1JZiBhIGhhbmRsZXIgZGVjaWRlcyB0byBhY3R1YWxseSBkaXNwYXRjaCBhbiBldmVudCwgdGhlIFxtZXRob2R7ZW1pdCgpfSBtZXRob2QKLWlzIHVzZWQgdG8gc2VuZCB0aGUgbWVzc2FnZSB0byBpdHMgZGVzdGluYXRpb24uIE1vc3QgdXNlci1kZWZpbmVkIHN1YmNsYXNzZXMKLW9mIFxjbGFzc3tIYW5kbGVyfSB3aWxsIG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBcbWV0aG9ke2VtaXQoKX0uCi0KLUluIGFkZGl0aW9uIHRvIHRoZSBiYXNlIFxjbGFzc3tIYW5kbGVyfSBjbGFzcywgbWFueSB1c2VmdWwgc3ViY2xhc3NlcwotYXJlIHByb3ZpZGVkOgotCi1cYmVnaW57ZW51bWVyYXRlfQotCi1caXRlbSBcY2xhc3N7U3RyZWFtSGFuZGxlcn0gaW5zdGFuY2VzIHNlbmQgZXJyb3IgbWVzc2FnZXMgdG8KLXN0cmVhbXMgKGZpbGUtbGlrZSBvYmplY3RzKS4KLQotXGl0ZW0gXGNsYXNze0ZpbGVIYW5kbGVyfSBpbnN0YW5jZXMgc2VuZCBlcnJvciBtZXNzYWdlcyB0byBkaXNrCi1maWxlcy4KLQotXGl0ZW0gXGNsYXNze0Jhc2VSb3RhdGluZ0hhbmRsZXJ9IGlzIHRoZSBiYXNlIGNsYXNzIGZvciBoYW5kbGVycyB0aGF0Ci1yb3RhdGUgbG9nIGZpbGVzIGF0IGEgY2VydGFpbiBwb2ludC4gSXQgaXMgbm90IG1lYW50IHRvIGJlICBpbnN0YW50aWF0ZWQKLWRpcmVjdGx5LiBJbnN0ZWFkLCB1c2UgXGNsYXNze1JvdGF0aW5nRmlsZUhhbmRsZXJ9IG9yCi1cY2xhc3N7VGltZWRSb3RhdGluZ0ZpbGVIYW5kbGVyfS4KLQotXGl0ZW0gXGNsYXNze1JvdGF0aW5nRmlsZUhhbmRsZXJ9IGluc3RhbmNlcyBzZW5kIGVycm9yIG1lc3NhZ2VzIHRvIGRpc2sKLWZpbGVzLCB3aXRoIHN1cHBvcnQgZm9yIG1heGltdW0gbG9nIGZpbGUgc2l6ZXMgYW5kIGxvZyBmaWxlIHJvdGF0aW9uLgotCi1caXRlbSBcY2xhc3N7VGltZWRSb3RhdGluZ0ZpbGVIYW5kbGVyfSBpbnN0YW5jZXMgc2VuZCBlcnJvciBtZXNzYWdlcyB0bwotZGlzayBmaWxlcyByb3RhdGluZyB0aGUgbG9nIGZpbGUgYXQgY2VydGFpbiB0aW1lZCBpbnRlcnZhbHMuCi0KLVxpdGVtIFxjbGFzc3tTb2NrZXRIYW5kbGVyfSBpbnN0YW5jZXMgc2VuZCBlcnJvciBtZXNzYWdlcyB0bwotVENQL0lQIHNvY2tldHMuCi0KLVxpdGVtIFxjbGFzc3tEYXRhZ3JhbUhhbmRsZXJ9IGluc3RhbmNlcyBzZW5kIGVycm9yIG1lc3NhZ2VzIHRvIFVEUAotc29ja2V0cy4KLQotXGl0ZW0gXGNsYXNze1NNVFBIYW5kbGVyfSBpbnN0YW5jZXMgc2VuZCBlcnJvciBtZXNzYWdlcyB0byBhCi1kZXNpZ25hdGVkIGVtYWlsIGFkZHJlc3MuCi0KLVxpdGVtIFxjbGFzc3tTeXNMb2dIYW5kbGVyfSBpbnN0YW5jZXMgc2VuZCBlcnJvciBtZXNzYWdlcyB0byBhCi1cVU5JWHt9IHN5c2xvZyBkYWVtb24sIHBvc3NpYmx5IG9uIGEgcmVtb3RlIG1hY2hpbmUuCi0KLVxpdGVtIFxjbGFzc3tOVEV2ZW50TG9nSGFuZGxlcn0gaW5zdGFuY2VzIHNlbmQgZXJyb3IgbWVzc2FnZXMgdG8gYQotV2luZG93cyBOVC8yMDAwL1hQIGV2ZW50IGxvZy4KLQotXGl0ZW0gXGNsYXNze01lbW9yeUhhbmRsZXJ9IGluc3RhbmNlcyBzZW5kIGVycm9yIG1lc3NhZ2VzIHRvIGEKLWJ1ZmZlciBpbiBtZW1vcnksIHdoaWNoIGlzIGZsdXNoZWQgd2hlbmV2ZXIgc3BlY2lmaWMgY3JpdGVyaWEgYXJlCi1tZXQuCi0KLVxpdGVtIFxjbGFzc3tIVFRQSGFuZGxlcn0gaW5zdGFuY2VzIHNlbmQgZXJyb3IgbWVzc2FnZXMgdG8gYW4KLUhUVFAgc2VydmVyIHVzaW5nIGVpdGhlciBcc2FtcHtHRVR9IG9yIFxzYW1we1BPU1R9IHNlbWFudGljcy4KLQotXGVuZHtlbnVtZXJhdGV9Ci0KLVRoZSBcY2xhc3N7U3RyZWFtSGFuZGxlcn0gYW5kIFxjbGFzc3tGaWxlSGFuZGxlcn0gY2xhc3NlcyBhcmUgZGVmaW5lZAotaW4gdGhlIGNvcmUgbG9nZ2luZyBwYWNrYWdlLiBUaGUgb3RoZXIgaGFuZGxlcnMgYXJlIGRlZmluZWQgaW4gYSBzdWItCi1tb2R1bGUsIFxtb2R1bGV7bG9nZ2luZy5oYW5kbGVyc30uIChUaGVyZSBpcyBhbHNvIGFub3RoZXIgc3ViLW1vZHVsZSwKLVxtb2R1bGV7bG9nZ2luZy5jb25maWd9LCBmb3IgY29uZmlndXJhdGlvbiBmdW5jdGlvbmFsaXR5LikKLQotTG9nZ2VkIG1lc3NhZ2VzIGFyZSBmb3JtYXR0ZWQgZm9yIHByZXNlbnRhdGlvbiB0aHJvdWdoIGluc3RhbmNlcyBvZiB0aGUKLVxjbGFzc3tGb3JtYXR0ZXJ9IGNsYXNzLiBUaGV5IGFyZSBpbml0aWFsaXplZCB3aXRoIGEgZm9ybWF0IHN0cmluZwotc3VpdGFibGUgZm9yIHVzZSB3aXRoIHRoZSBcJSBvcGVyYXRvciBhbmQgYSBkaWN0aW9uYXJ5LgotCi1Gb3IgZm9ybWF0dGluZyBtdWx0aXBsZSBtZXNzYWdlcyBpbiBhIGJhdGNoLCBpbnN0YW5jZXMgb2YKLVxjbGFzc3tCdWZmZXJpbmdGb3JtYXR0ZXJ9IGNhbiBiZSB1c2VkLiBJbiBhZGRpdGlvbiB0byB0aGUgZm9ybWF0IHN0cmluZwotKHdoaWNoIGlzIGFwcGxpZWQgdG8gZWFjaCBtZXNzYWdlIGluIHRoZSBiYXRjaCksIHRoZXJlIGlzIHByb3Zpc2lvbiBmb3IKLWhlYWRlciBhbmQgdHJhaWxlciBmb3JtYXQgc3RyaW5ncy4KLQotV2hlbiBmaWx0ZXJpbmcgYmFzZWQgb24gbG9nZ2VyIGxldmVsIGFuZC9vciBoYW5kbGVyIGxldmVsIGlzIG5vdCBlbm91Z2gsCi1pbnN0YW5jZXMgb2YgXGNsYXNze0ZpbHRlcn0gY2FuIGJlIGFkZGVkIHRvIGJvdGggXGNsYXNze0xvZ2dlcn0gYW5kCi1cY2xhc3N7SGFuZGxlcn0gaW5zdGFuY2VzICh0aHJvdWdoIHRoZWlyIFxtZXRob2R7YWRkRmlsdGVyKCl9IG1ldGhvZCkuCi1CZWZvcmUgZGVjaWRpbmcgdG8gcHJvY2VzcyBhIG1lc3NhZ2UgZnVydGhlciwgYm90aCBsb2dnZXJzIGFuZCBoYW5kbGVycwotY29uc3VsdCBhbGwgdGhlaXIgZmlsdGVycyBmb3IgcGVybWlzc2lvbi4gSWYgYW55IGZpbHRlciByZXR1cm5zIGEgZmFsc2UKLXZhbHVlLCB0aGUgbWVzc2FnZSBpcyBub3QgcHJvY2Vzc2VkIGZ1cnRoZXIuCi0KLVRoZSBiYXNpYyBcY2xhc3N7RmlsdGVyfSBmdW5jdGlvbmFsaXR5IGFsbG93cyBmaWx0ZXJpbmcgYnkgc3BlY2lmaWMgbG9nZ2VyCi1uYW1lLiBJZiB0aGlzIGZlYXR1cmUgaXMgdXNlZCwgbWVzc2FnZXMgc2VudCB0byB0aGUgbmFtZWQgbG9nZ2VyIGFuZCBpdHMKLWNoaWxkcmVuIGFyZSBhbGxvd2VkIHRocm91Z2ggdGhlIGZpbHRlciwgYW5kIGFsbCBvdGhlcnMgZHJvcHBlZC4KLQotSW4gYWRkaXRpb24gdG8gdGhlIGNsYXNzZXMgZGVzY3JpYmVkIGFib3ZlLCB0aGVyZSBhcmUgYSBudW1iZXIgb2YgbW9kdWxlLQotbGV2ZWwgZnVuY3Rpb25zLgotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldExvZ2dlcn17XG9wdGlvbmFse25hbWV9fQotUmV0dXJuIGEgbG9nZ2VyIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIG9yLCBpZiBubyBuYW1lIGlzIHNwZWNpZmllZCwgcmV0dXJuCi1hIGxvZ2dlciB3aGljaCBpcyB0aGUgcm9vdCBsb2dnZXIgb2YgdGhlIGhpZXJhcmNoeS4gSWYgc3BlY2lmaWVkLCB0aGUgbmFtZQotaXMgdHlwaWNhbGx5IGEgZG90LXNlcGFyYXRlZCBoaWVyYXJjaGljYWwgbmFtZSBsaWtlIFx2YXJ7ImEifSwgXHZhcnsiYS5iIn0KLW9yIFx2YXJ7ImEuYi5jLmQifS4gQ2hvaWNlIG9mIHRoZXNlIG5hbWVzIGlzIGVudGlyZWx5IHVwIHRvIHRoZSBkZXZlbG9wZXIKLXdobyBpcyB1c2luZyBsb2dnaW5nLgotCi1BbGwgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbiB3aXRoIGEgZ2l2ZW4gbmFtZSByZXR1cm4gdGhlIHNhbWUgbG9nZ2VyIGluc3RhbmNlLgotVGhpcyBtZWFucyB0aGF0IGxvZ2dlciBpbnN0YW5jZXMgbmV2ZXIgbmVlZCB0byBiZSBwYXNzZWQgYmV0d2VlbiBkaWZmZXJlbnQKLXBhcnRzIG9mIGFuIGFwcGxpY2F0aW9uLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRMb2dnZXJDbGFzc317fQotUmV0dXJuIGVpdGhlciB0aGUgc3RhbmRhcmQgXGNsYXNze0xvZ2dlcn0gY2xhc3MsIG9yIHRoZSBsYXN0IGNsYXNzIHBhc3NlZCB0bwotXGZ1bmN0aW9ue3NldExvZ2dlckNsYXNzKCl9LiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gYSBuZXcKLWNsYXNzIGRlZmluaXRpb24sIHRvIGVuc3VyZSB0aGF0IGluc3RhbGxpbmcgYSBjdXN0b21pc2VkIFxjbGFzc3tMb2dnZXJ9IGNsYXNzCi13aWxsIG5vdCB1bmRvIGN1c3RvbWlzYXRpb25zIGFscmVhZHkgYXBwbGllZCBieSBvdGhlciBjb2RlLiBGb3IgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotIGNsYXNzIE15TG9nZ2VyKGxvZ2dpbmcuZ2V0TG9nZ2VyQ2xhc3MoKSk6Ci0gICAgICMgLi4uIG92ZXJyaWRlIGJlaGF2aW91ciBoZXJlCi1cZW5ke3ZlcmJhdGltfQotCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2RlYnVnfXttc2dcb3B0aW9uYWx7LCAqYXJnc1xvcHRpb25hbHssICoqa3dhcmdzfX19Ci1Mb2dzIGEgbWVzc2FnZSB3aXRoIGxldmVsIFxjb25zdGFudHtERUJVR30gb24gdGhlIHJvb3QgbG9nZ2VyLgotVGhlIFx2YXJ7bXNnfSBpcyB0aGUgbWVzc2FnZSBmb3JtYXQgc3RyaW5nLCBhbmQgdGhlIFx2YXJ7YXJnc30gYXJlIHRoZQotYXJndW1lbnRzIHdoaWNoIGFyZSBtZXJnZWQgaW50byBcdmFye21zZ30gdXNpbmcgdGhlIHN0cmluZyBmb3JtYXR0aW5nCi1vcGVyYXRvci4gKE5vdGUgdGhhdCB0aGlzIG1lYW5zIHRoYXQgeW91IGNhbiB1c2Uga2V5d29yZHMgaW4gdGhlCi1mb3JtYXQgc3RyaW5nLCB0b2dldGhlciB3aXRoIGEgc2luZ2xlIGRpY3Rpb25hcnkgYXJndW1lbnQuKQotCi1UaGVyZSBhcmUgdHdvIGtleXdvcmQgYXJndW1lbnRzIGluIFx2YXJ7a3dhcmdzfSB3aGljaCBhcmUgaW5zcGVjdGVkOgotXHZhcntleGNfaW5mb30gd2hpY2gsIGlmIGl0IGRvZXMgbm90IGV2YWx1YXRlIGFzIGZhbHNlLCBjYXVzZXMgZXhjZXB0aW9uCi1pbmZvcm1hdGlvbiB0byBiZSBhZGRlZCB0byB0aGUgbG9nZ2luZyBtZXNzYWdlLiBJZiBhbiBleGNlcHRpb24gdHVwbGUgKGluIHRoZQotZm9ybWF0IHJldHVybmVkIGJ5IFxmdW5jdGlvbntzeXMuZXhjX2luZm8oKX0pIGlzIHByb3ZpZGVkLCBpdCBpcyB1c2VkOwotb3RoZXJ3aXNlLCBcZnVuY3Rpb257c3lzLmV4Y19pbmZvKCl9IGlzIGNhbGxlZCB0byBnZXQgdGhlIGV4Y2VwdGlvbgotaW5mb3JtYXRpb24uCi0KLVRoZSBvdGhlciBvcHRpb25hbCBrZXl3b3JkIGFyZ3VtZW50IGlzIFx2YXJ7ZXh0cmF9IHdoaWNoIGNhbiBiZSB1c2VkIHRvIHBhc3MKLWEgZGljdGlvbmFyeSB3aGljaCBpcyB1c2VkIHRvIHBvcHVsYXRlIHRoZSBfX2RpY3RfXyBvZiB0aGUgTG9nUmVjb3JkIGNyZWF0ZWQKLWZvciB0aGUgbG9nZ2luZyBldmVudCB3aXRoIHVzZXItZGVmaW5lZCBhdHRyaWJ1dGVzLiBUaGVzZSBjdXN0b20gYXR0cmlidXRlcwotY2FuIHRoZW4gYmUgdXNlZCBhcyB5b3UgbGlrZS4gRm9yIGV4YW1wbGUsIHRoZXkgY291bGQgYmUgaW5jb3Jwb3JhdGVkIGludG8KLWxvZ2dlZCBtZXNzYWdlcy4gRm9yIGV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSBGT1JNQVQgPSAiJShhc2N0aW1lKS0xNXMgJShjbGllbnRpcClzICUodXNlciktOHMgJShtZXNzYWdlKXMiCi0gbG9nZ2luZy5iYXNpY0NvbmZpZyhmb3JtYXQ9Rk9STUFUKQotIGQgPSB7J2NsaWVudGlwJzogJzE5Mi4xNjguMC4xJywgJ3VzZXInOiAnZmJsb2dncyd9Ci0gbG9nZ2luZy53YXJuaW5nKCJQcm90b2NvbCBwcm9ibGVtOiAlcyIsICJjb25uZWN0aW9uIHJlc2V0IiwgZXh0cmE9ZCkKLVxlbmR7dmVyYmF0aW19Ci0KLXdvdWxkIHByaW50IHNvbWV0aGluZyBsaWtlCi1cYmVnaW57dmVyYmF0aW19Ci0yMDA2LTAyLTA4IDIyOjIwOjAyLDE2NSAxOTIuMTY4LjAuMSBmYmxvZ2dzICBQcm90b2NvbCBwcm9ibGVtOiBjb25uZWN0aW9uIHJlc2V0Ci1cZW5ke3ZlcmJhdGltfQotCi1UaGUga2V5cyBpbiB0aGUgZGljdGlvbmFyeSBwYXNzZWQgaW4gXHZhcntleHRyYX0gc2hvdWxkIG5vdCBjbGFzaCB3aXRoIHRoZSBrZXlzCi11c2VkIGJ5IHRoZSBsb2dnaW5nIHN5c3RlbS4gKFNlZSB0aGUgXGNsYXNze0Zvcm1hdHRlcn0gZG9jdW1lbnRhdGlvbiBmb3IgbW9yZQotaW5mb3JtYXRpb24gb24gd2hpY2gga2V5cyBhcmUgdXNlZCBieSB0aGUgbG9nZ2luZyBzeXN0ZW0uKQotCi1JZiB5b3UgY2hvb3NlIHRvIHVzZSB0aGVzZSBhdHRyaWJ1dGVzIGluIGxvZ2dlZCBtZXNzYWdlcywgeW91IG5lZWQgdG8gZXhlcmNpc2UKLXNvbWUgY2FyZS4gSW4gdGhlIGFib3ZlIGV4YW1wbGUsIGZvciBpbnN0YW5jZSwgdGhlIFxjbGFzc3tGb3JtYXR0ZXJ9IGhhcyBiZWVuCi1zZXQgdXAgd2l0aCBhIGZvcm1hdCBzdHJpbmcgd2hpY2ggZXhwZWN0cyAnY2xpZW50aXAnIGFuZCAndXNlcicgaW4gdGhlCi1hdHRyaWJ1dGUgZGljdGlvbmFyeSBvZiB0aGUgTG9nUmVjb3JkLiBJZiB0aGVzZSBhcmUgbWlzc2luZywgdGhlIG1lc3NhZ2Ugd2lsbAotbm90IGJlIGxvZ2dlZCBiZWNhdXNlIGEgc3RyaW5nIGZvcm1hdHRpbmcgZXhjZXB0aW9uIHdpbGwgb2NjdXIuIFNvIGluIHRoaXMKLWNhc2UsIHlvdSBhbHdheXMgbmVlZCB0byBwYXNzIHRoZSBcdmFye2V4dHJhfSBkaWN0aW9uYXJ5IHdpdGggdGhlc2Uga2V5cy4KLQotV2hpbGUgdGhpcyBtaWdodCBiZSBhbm5veWluZywgdGhpcyBmZWF0dXJlIGlzIGludGVuZGVkIGZvciB1c2UgaW4gc3BlY2lhbGl6ZWQKLWNpcmN1bXN0YW5jZXMsIHN1Y2ggYXMgbXVsdGktdGhyZWFkZWQgc2VydmVycyB3aGVyZSB0aGUgc2FtZSBjb2RlIGV4ZWN1dGVzCi1pbiBtYW55IGNvbnRleHRzLCBhbmQgaW50ZXJlc3RpbmcgY29uZGl0aW9ucyB3aGljaCBhcmlzZSBhcmUgZGVwZW5kZW50IG9uIHRoaXMKLWNvbnRleHQgKHN1Y2ggYXMgcmVtb3RlIGNsaWVudCBJUCBhZGRyZXNzIGFuZCBhdXRoZW50aWNhdGVkIHVzZXIgbmFtZSwgaW4gdGhlCi1hYm92ZSBleGFtcGxlKS4gSW4gc3VjaCBjaXJjdW1zdGFuY2VzLCBpdCBpcyBsaWtlbHkgdGhhdCBzcGVjaWFsaXplZAotXGNsYXNze0Zvcm1hdHRlcn1zIHdvdWxkIGJlIHVzZWQgd2l0aCBwYXJ0aWN1bGFyIFxjbGFzc3tIYW5kbGVyfXMuCi0KLVx2ZXJzaW9uY2hhbmdlZFtcdmFye2V4dHJhfSB3YXMgYWRkZWRdezIuNX0KLQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpbmZvfXttc2dcb3B0aW9uYWx7LCAqYXJnc1xvcHRpb25hbHssICoqa3dhcmdzfX19Ci1Mb2dzIGEgbWVzc2FnZSB3aXRoIGxldmVsIFxjb25zdGFudHtJTkZPfSBvbiB0aGUgcm9vdCBsb2dnZXIuCi1UaGUgYXJndW1lbnRzIGFyZSBpbnRlcnByZXRlZCBhcyBmb3IgXGZ1bmN0aW9ue2RlYnVnKCl9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt3YXJuaW5nfXttc2dcb3B0aW9uYWx7LCAqYXJnc1xvcHRpb25hbHssICoqa3dhcmdzfX19Ci1Mb2dzIGEgbWVzc2FnZSB3aXRoIGxldmVsIFxjb25zdGFudHtXQVJOSU5HfSBvbiB0aGUgcm9vdCBsb2dnZXIuCi1UaGUgYXJndW1lbnRzIGFyZSBpbnRlcnByZXRlZCBhcyBmb3IgXGZ1bmN0aW9ue2RlYnVnKCl9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtlcnJvcn17bXNnXG9wdGlvbmFseywgKmFyZ3Ncb3B0aW9uYWx7LCAqKmt3YXJnc319fQotTG9ncyBhIG1lc3NhZ2Ugd2l0aCBsZXZlbCBcY29uc3RhbnR7RVJST1J9IG9uIHRoZSByb290IGxvZ2dlci4KLVRoZSBhcmd1bWVudHMgYXJlIGludGVycHJldGVkIGFzIGZvciBcZnVuY3Rpb257ZGVidWcoKX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2NyaXRpY2FsfXttc2dcb3B0aW9uYWx7LCAqYXJnc1xvcHRpb25hbHssICoqa3dhcmdzfX19Ci1Mb2dzIGEgbWVzc2FnZSB3aXRoIGxldmVsIFxjb25zdGFudHtDUklUSUNBTH0gb24gdGhlIHJvb3QgbG9nZ2VyLgotVGhlIGFyZ3VtZW50cyBhcmUgaW50ZXJwcmV0ZWQgYXMgZm9yIFxmdW5jdGlvbntkZWJ1ZygpfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZXhjZXB0aW9ufXttc2dcb3B0aW9uYWx7LCAqYXJnc319Ci1Mb2dzIGEgbWVzc2FnZSB3aXRoIGxldmVsIFxjb25zdGFudHtFUlJPUn0gb24gdGhlIHJvb3QgbG9nZ2VyLgotVGhlIGFyZ3VtZW50cyBhcmUgaW50ZXJwcmV0ZWQgYXMgZm9yIFxmdW5jdGlvbntkZWJ1ZygpfS4gRXhjZXB0aW9uIGluZm8KLWlzIGFkZGVkIHRvIHRoZSBsb2dnaW5nIG1lc3NhZ2UuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkCi1mcm9tIGFuIGV4Y2VwdGlvbiBoYW5kbGVyLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtsb2d9e2xldmVsLCBtc2dcb3B0aW9uYWx7LCAqYXJnc1xvcHRpb25hbHssICoqa3dhcmdzfX19Ci1Mb2dzIGEgbWVzc2FnZSB3aXRoIGxldmVsIFx2YXJ7bGV2ZWx9IG9uIHRoZSByb290IGxvZ2dlci4KLVRoZSBvdGhlciBhcmd1bWVudHMgYXJlIGludGVycHJldGVkIGFzIGZvciBcZnVuY3Rpb257ZGVidWcoKX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2Rpc2FibGV9e2x2bH0KLVByb3ZpZGVzIGFuIG92ZXJyaWRpbmcgbGV2ZWwgXHZhcntsdmx9IGZvciBhbGwgbG9nZ2VycyB3aGljaCB0YWtlcwotcHJlY2VkZW5jZSBvdmVyIHRoZSBsb2dnZXIncyBvd24gbGV2ZWwuIFdoZW4gdGhlIG5lZWQgYXJpc2VzIHRvCi10ZW1wb3JhcmlseSB0aHJvdHRsZSBsb2dnaW5nIG91dHB1dCBkb3duIGFjcm9zcyB0aGUgd2hvbGUgYXBwbGljYXRpb24sCi10aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VmdWwuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2FkZExldmVsTmFtZX17bHZsLCBsZXZlbE5hbWV9Ci1Bc3NvY2lhdGVzIGxldmVsIFx2YXJ7bHZsfSB3aXRoIHRleHQgXHZhcntsZXZlbE5hbWV9IGluIGFuIGludGVybmFsCi1kaWN0aW9uYXJ5LCB3aGljaCBpcyB1c2VkIHRvIG1hcCBudW1lcmljIGxldmVscyB0byBhIHRleHR1YWwKLXJlcHJlc2VudGF0aW9uLCBmb3IgZXhhbXBsZSB3aGVuIGEgXGNsYXNze0Zvcm1hdHRlcn0gZm9ybWF0cyBhIG1lc3NhZ2UuCi1UaGlzIGZ1bmN0aW9uIGNhbiBhbHNvIGJlIHVzZWQgdG8gZGVmaW5lIHlvdXIgb3duIGxldmVscy4gVGhlIG9ubHkKLWNvbnN0cmFpbnRzIGFyZSB0aGF0IGFsbCBsZXZlbHMgdXNlZCBtdXN0IGJlIHJlZ2lzdGVyZWQgdXNpbmcgdGhpcwotZnVuY3Rpb24sIGxldmVscyBzaG91bGQgYmUgcG9zaXRpdmUgaW50ZWdlcnMgYW5kIHRoZXkgc2hvdWxkIGluY3JlYXNlCi1pbiBpbmNyZWFzaW5nIG9yZGVyIG9mIHNldmVyaXR5LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRMZXZlbE5hbWV9e2x2bH0KLVJldHVybnMgdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgbG9nZ2luZyBsZXZlbCBcdmFye2x2bH0uIElmIHRoZQotbGV2ZWwgaXMgb25lIG9mIHRoZSBwcmVkZWZpbmVkIGxldmVscyBcY29uc3RhbnR7Q1JJVElDQUx9LAotXGNvbnN0YW50e0VSUk9SfSwgXGNvbnN0YW50e1dBUk5JTkd9LCBcY29uc3RhbnR7SU5GT30gb3IgXGNvbnN0YW50e0RFQlVHfQotdGhlbiB5b3UgZ2V0IHRoZSBjb3JyZXNwb25kaW5nIHN0cmluZy4gSWYgeW91IGhhdmUgYXNzb2NpYXRlZCBsZXZlbHMKLXdpdGggbmFtZXMgdXNpbmcgXGZ1bmN0aW9ue2FkZExldmVsTmFtZSgpfSB0aGVuIHRoZSBuYW1lIHlvdSBoYXZlIGFzc29jaWF0ZWQKLXdpdGggXHZhcntsdmx9IGlzIHJldHVybmVkLiBJZiBhIG51bWVyaWMgdmFsdWUgY29ycmVzcG9uZGluZyB0byBvbmUgb2YgdGhlCi1kZWZpbmVkIGxldmVscyBpcyBwYXNzZWQgaW4sIHRoZSBjb3JyZXNwb25kaW5nIHN0cmluZyByZXByZXNlbnRhdGlvbiBpcwotcmV0dXJuZWQuIE90aGVyd2lzZSwgdGhlIHN0cmluZyAiTGV2ZWwgXCVzIiBcJSBsdmwgaXMgcmV0dXJuZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e21ha2VMb2dSZWNvcmR9e2F0dHJkaWN0fQotQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBcY2xhc3N7TG9nUmVjb3JkfSBpbnN0YW5jZSB3aG9zZSBhdHRyaWJ1dGVzIGFyZQotZGVmaW5lZCBieSBcdmFye2F0dHJkaWN0fS4gVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgZm9yIHRha2luZyBhIHBpY2tsZWQKLVxjbGFzc3tMb2dSZWNvcmR9IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5LCBzZW50IG92ZXIgYSBzb2NrZXQsIGFuZCByZWNvbnN0aXR1dGluZwotaXQgYXMgYSBcY2xhc3N7TG9nUmVjb3JkfSBpbnN0YW5jZSBhdCB0aGUgcmVjZWl2aW5nIGVuZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317YmFzaWNDb25maWd9e1xvcHRpb25hbHsqKmt3YXJnc319Ci1Eb2VzIGJhc2ljIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBsb2dnaW5nIHN5c3RlbSBieSBjcmVhdGluZyBhCi1cY2xhc3N7U3RyZWFtSGFuZGxlcn0gd2l0aCBhIGRlZmF1bHQgXGNsYXNze0Zvcm1hdHRlcn0gYW5kIGFkZGluZyBpdCB0bwotdGhlIHJvb3QgbG9nZ2VyLiBUaGUgZnVuY3Rpb25zIFxmdW5jdGlvbntkZWJ1ZygpfSwgXGZ1bmN0aW9ue2luZm8oKX0sCi1cZnVuY3Rpb257d2FybmluZygpfSwgXGZ1bmN0aW9ue2Vycm9yKCl9IGFuZCBcZnVuY3Rpb257Y3JpdGljYWwoKX0gd2lsbCBjYWxsCi1cZnVuY3Rpb257YmFzaWNDb25maWcoKX0gYXV0b21hdGljYWxseSBpZiBubyBoYW5kbGVycyBhcmUgZGVmaW5lZCBmb3IgdGhlCi1yb290IGxvZ2dlci4KLQotXHZlcnNpb25jaGFuZ2VkW0Zvcm1lcmx5LCBcZnVuY3Rpb257YmFzaWNDb25maWd9IGRpZCBub3QgdGFrZSBhbnkga2V5d29yZAotYXJndW1lbnRzXXsyLjR9Ci0KLVRoZSBmb2xsb3dpbmcga2V5d29yZCBhcmd1bWVudHMgYXJlIHN1cHBvcnRlZC4KLQotXGJlZ2lue3RhYmxlaWl9e2x8bH17Y29kZX17Rm9ybWF0fXtEZXNjcmlwdGlvbn0KLVxsaW5laWl7ZmlsZW5hbWV9e1NwZWNpZmllcyB0aGF0IGEgRmlsZUhhbmRsZXIgYmUgY3JlYXRlZCwgdXNpbmcgdGhlCi1zcGVjaWZpZWQgZmlsZW5hbWUsIHJhdGhlciB0aGFuIGEgU3RyZWFtSGFuZGxlci59Ci1cbGluZWlpe2ZpbGVtb2RlfXtTcGVjaWZpZXMgdGhlIG1vZGUgdG8gb3BlbiB0aGUgZmlsZSwgaWYgZmlsZW5hbWUgaXMKLXNwZWNpZmllZCAoaWYgZmlsZW1vZGUgaXMgdW5zcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvICdhJykufQotXGxpbmVpaXtmb3JtYXR9e1VzZSB0aGUgc3BlY2lmaWVkIGZvcm1hdCBzdHJpbmcgZm9yIHRoZSBoYW5kbGVyLn0KLVxsaW5laWl7ZGF0ZWZtdH17VXNlIHRoZSBzcGVjaWZpZWQgZGF0ZS90aW1lIGZvcm1hdC59Ci1cbGluZWlpe2xldmVsfXtTZXQgdGhlIHJvb3QgbG9nZ2VyIGxldmVsIHRvIHRoZSBzcGVjaWZpZWQgbGV2ZWwufQotXGxpbmVpaXtzdHJlYW19e1VzZSB0aGUgc3BlY2lmaWVkIHN0cmVhbSB0byBpbml0aWFsaXplIHRoZSBTdHJlYW1IYW5kbGVyLgotTm90ZSB0aGF0IHRoaXMgYXJndW1lbnQgaXMgaW5jb21wYXRpYmxlIHdpdGggJ2ZpbGVuYW1lJyAtIGlmIGJvdGgKLWFyZSBwcmVzZW50LCAnc3RyZWFtJyBpcyBpZ25vcmVkLn0KLVxlbmR7dGFibGVpaX0KLQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzaHV0ZG93bn17fQotSW5mb3JtcyB0aGUgbG9nZ2luZyBzeXN0ZW0gdG8gcGVyZm9ybSBhbiBvcmRlcmx5IHNodXRkb3duIGJ5IGZsdXNoaW5nIGFuZAotY2xvc2luZyBhbGwgaGFuZGxlcnMuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NldExvZ2dlckNsYXNzfXtrbGFzc30KLVRlbGxzIHRoZSBsb2dnaW5nIHN5c3RlbSB0byB1c2UgdGhlIGNsYXNzIFx2YXJ7a2xhc3N9IHdoZW4gaW5zdGFudGlhdGluZyBhCi1sb2dnZXIuIFRoZSBjbGFzcyBzaG91bGQgZGVmaW5lIFxtZXRob2R7X19pbml0X18oKX0gc3VjaCB0aGF0IG9ubHkgYSBuYW1lCi1hcmd1bWVudCBpcyByZXF1aXJlZCwgYW5kIHRoZSBcbWV0aG9ke19faW5pdF9fKCl9IHNob3VsZCBjYWxsCi1cbWV0aG9ke0xvZ2dlci5fX2luaXRfXygpfS4gVGhpcyBmdW5jdGlvbiBpcyB0eXBpY2FsbHkgY2FsbGVkIGJlZm9yZSBhbnkKLWxvZ2dlcnMgYXJlIGluc3RhbnRpYXRlZCBieSBhcHBsaWNhdGlvbnMgd2hpY2ggbmVlZCB0byB1c2UgY3VzdG9tIGxvZ2dlcgotYmVoYXZpb3IuCi1cZW5ke2Z1bmNkZXNjfQotCi0KLVxiZWdpbntzZWVhbHNvfQotICBcc2VlcGVwezI4Mn17QSBMb2dnaW5nIFN5c3RlbX0KLSAgICAgICAgIHtUaGUgcHJvcG9zYWwgd2hpY2ggZGVzY3JpYmVkIHRoaXMgZmVhdHVyZSBmb3IgaW5jbHVzaW9uIGluCi0gICAgICAgICAgdGhlIFB5dGhvbiBzdGFuZGFyZCBsaWJyYXJ5Ln0KLSAgXHNlZWxpbmt7aHR0cDovL3d3dy5yZWQtZG92ZS5jb20vcHl0aG9uX2xvZ2dpbmcuaHRtbH0KLSAgICAgICAgICB7T3JpZ2luYWwgUHl0aG9uIFxtb2R1bGV7bG9nZ2luZ30gcGFja2FnZX0KLSAgICAgICAgICB7VGhpcyBpcyB0aGUgb3JpZ2luYWwgc291cmNlIGZvciB0aGUgXG1vZHVsZXtsb2dnaW5nfQotICAgICAgICAgICBwYWNrYWdlLiAgVGhlIHZlcnNpb24gb2YgdGhlIHBhY2thZ2UgYXZhaWxhYmxlIGZyb20gdGhpcwotICAgICAgICAgICBzaXRlIGlzIHN1aXRhYmxlIGZvciB1c2Ugd2l0aCBQeXRob24gMS41LjIsIDIuMS54IGFuZCAyLjIueCwKLSAgICAgICAgICAgd2hpY2ggZG8gbm90IGluY2x1ZGUgdGhlIFxtb2R1bGV7bG9nZ2luZ30gcGFja2FnZSBpbiB0aGUgc3RhbmRhcmQKLSAgICAgICAgICAgbGlicmFyeS59Ci1cZW5ke3NlZWFsc299Ci0KLQotXHN1YnNlY3Rpb257TG9nZ2VyIE9iamVjdHN9Ci0KLUxvZ2dlcnMgaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYW5kIG1ldGhvZHMuIE5vdGUgdGhhdCBMb2dnZXJzIGFyZQotbmV2ZXIgaW5zdGFudGlhdGVkIGRpcmVjdGx5LCBidXQgYWx3YXlzIHRocm91Z2ggdGhlIG1vZHVsZS1sZXZlbCBmdW5jdGlvbgotXGZ1bmN0aW9ue2xvZ2dpbmcuZ2V0TG9nZ2VyKG5hbWUpfS4KLQotXGJlZ2lue21lbWJlcmRlc2N9W0xvZ2dlcl17cHJvcGFnYXRlfQotSWYgdGhpcyBldmFsdWF0ZXMgdG8gZmFsc2UsIGxvZ2dpbmcgbWVzc2FnZXMgYXJlIG5vdCBwYXNzZWQgYnkgdGhpcwotbG9nZ2VyIG9yIGJ5IGNoaWxkIGxvZ2dlcnMgdG8gaGlnaGVyIGxldmVsIChhbmNlc3RvcikgbG9nZ2Vycy4gVGhlCi1jb25zdHJ1Y3RvciBzZXRzIHRoaXMgYXR0cmlidXRlIHRvIDEuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtMb2dnZXJde3NldExldmVsfXtsdmx9Ci1TZXRzIHRoZSB0aHJlc2hvbGQgZm9yIHRoaXMgbG9nZ2VyIHRvIFx2YXJ7bHZsfS4gTG9nZ2luZyBtZXNzYWdlcwotd2hpY2ggYXJlIGxlc3Mgc2V2ZXJlIHRoYW4gXHZhcntsdmx9IHdpbGwgYmUgaWdub3JlZC4gV2hlbiBhIGxvZ2dlciBpcwotY3JlYXRlZCwgdGhlIGxldmVsIGlzIHNldCB0byBcY29uc3RhbnR7Tk9UU0VUfSAod2hpY2ggY2F1c2VzIGFsbCBtZXNzYWdlcwotdG8gYmUgcHJvY2Vzc2VkIHdoZW4gdGhlIGxvZ2dlciBpcyB0aGUgcm9vdCBsb2dnZXIsIG9yIGRlbGVnYXRpb24gdG8gdGhlCi1wYXJlbnQgd2hlbiB0aGUgbG9nZ2VyIGlzIGEgbm9uLXJvb3QgbG9nZ2VyKS4gTm90ZSB0aGF0IHRoZSByb290IGxvZ2dlcgotaXMgY3JlYXRlZCB3aXRoIGxldmVsIFxjb25zdGFudHtXQVJOSU5HfS4KLQotVGhlIHRlcm0gImRlbGVnYXRpb24gdG8gdGhlIHBhcmVudCIgbWVhbnMgdGhhdCBpZiBhIGxvZ2dlciBoYXMgYSBsZXZlbAotb2YgTk9UU0VULCBpdHMgY2hhaW4gb2YgYW5jZXN0b3IgbG9nZ2VycyBpcyB0cmF2ZXJzZWQgdW50aWwgZWl0aGVyIGFuCi1hbmNlc3RvciB3aXRoIGEgbGV2ZWwgb3RoZXIgdGhhbiBOT1RTRVQgaXMgZm91bmQsIG9yIHRoZSByb290IGlzCi1yZWFjaGVkLgotCi1JZiBhbiBhbmNlc3RvciBpcyBmb3VuZCB3aXRoIGEgbGV2ZWwgb3RoZXIgdGhhbiBOT1RTRVQsIHRoZW4gdGhhdAotYW5jZXN0b3IncyBsZXZlbCBpcyB0cmVhdGVkIGFzIHRoZSBlZmZlY3RpdmUgbGV2ZWwgb2YgdGhlIGxvZ2dlciB3aGVyZQotdGhlIGFuY2VzdG9yIHNlYXJjaCBiZWdhbiwgYW5kIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGhvdyBhIGxvZ2dpbmcKLWV2ZW50IGlzIGhhbmRsZWQuCi0KLUlmIHRoZSByb290IGlzIHJlYWNoZWQsIGFuZCBpdCBoYXMgYSBsZXZlbCBvZiBOT1RTRVQsIHRoZW4gYWxsCi1tZXNzYWdlcyB3aWxsIGJlIHByb2Nlc3NlZC4gT3RoZXJ3aXNlLCB0aGUgcm9vdCdzIGxldmVsIHdpbGwgYmUgdXNlZAotYXMgdGhlIGVmZmVjdGl2ZSBsZXZlbC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0xvZ2dlcl17aXNFbmFibGVkRm9yfXtsdmx9Ci1JbmRpY2F0ZXMgaWYgYSBtZXNzYWdlIG9mIHNldmVyaXR5IFx2YXJ7bHZsfSB3b3VsZCBiZSBwcm9jZXNzZWQgYnkKLXRoaXMgbG9nZ2VyLiAgVGhpcyBtZXRob2QgY2hlY2tzIGZpcnN0IHRoZSBtb2R1bGUtbGV2ZWwgbGV2ZWwgc2V0IGJ5Ci1cZnVuY3Rpb257bG9nZ2luZy5kaXNhYmxlKGx2bCl9IGFuZCB0aGVuIHRoZSBsb2dnZXIncyBlZmZlY3RpdmUgbGV2ZWwgYXMKLWRldGVybWluZWQgYnkgXG1ldGhvZHtnZXRFZmZlY3RpdmVMZXZlbCgpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0xvZ2dlcl17Z2V0RWZmZWN0aXZlTGV2ZWx9e30KLUluZGljYXRlcyB0aGUgZWZmZWN0aXZlIGxldmVsIGZvciB0aGlzIGxvZ2dlci4gSWYgYSB2YWx1ZSBvdGhlciB0aGFuCi1cY29uc3RhbnR7Tk9UU0VUfSBoYXMgYmVlbiBzZXQgdXNpbmcgXG1ldGhvZHtzZXRMZXZlbCgpfSwgaXQgaXMgcmV0dXJuZWQuCi1PdGhlcndpc2UsIHRoZSBoaWVyYXJjaHkgaXMgdHJhdmVyc2VkIHRvd2FyZHMgdGhlIHJvb3QgdW50aWwgYSB2YWx1ZQotb3RoZXIgdGhhbiBcY29uc3RhbnR7Tk9UU0VUfSBpcyBmb3VuZCwgYW5kIHRoYXQgdmFsdWUgaXMgcmV0dXJuZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtMb2dnZXJde2RlYnVnfXttc2dcb3B0aW9uYWx7LCAqYXJnc1xvcHRpb25hbHssICoqa3dhcmdzfX19Ci1Mb2dzIGEgbWVzc2FnZSB3aXRoIGxldmVsIFxjb25zdGFudHtERUJVR30gb24gdGhpcyBsb2dnZXIuCi1UaGUgXHZhcnttc2d9IGlzIHRoZSBtZXNzYWdlIGZvcm1hdCBzdHJpbmcsIGFuZCB0aGUgXHZhcnthcmdzfSBhcmUgdGhlCi1hcmd1bWVudHMgd2hpY2ggYXJlIG1lcmdlZCBpbnRvIFx2YXJ7bXNnfSB1c2luZyB0aGUgc3RyaW5nIGZvcm1hdHRpbmcKLW9wZXJhdG9yLiAoTm90ZSB0aGF0IHRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIHVzZSBrZXl3b3JkcyBpbiB0aGUKLWZvcm1hdCBzdHJpbmcsIHRvZ2V0aGVyIHdpdGggYSBzaW5nbGUgZGljdGlvbmFyeSBhcmd1bWVudC4pCi0KLVRoZXJlIGFyZSB0d28ga2V5d29yZCBhcmd1bWVudHMgaW4gXHZhcntrd2FyZ3N9IHdoaWNoIGFyZSBpbnNwZWN0ZWQ6Ci1cdmFye2V4Y19pbmZvfSB3aGljaCwgaWYgaXQgZG9lcyBub3QgZXZhbHVhdGUgYXMgZmFsc2UsIGNhdXNlcyBleGNlcHRpb24KLWluZm9ybWF0aW9uIHRvIGJlIGFkZGVkIHRvIHRoZSBsb2dnaW5nIG1lc3NhZ2UuIElmIGFuIGV4Y2VwdGlvbiB0dXBsZSAoaW4gdGhlCi1mb3JtYXQgcmV0dXJuZWQgYnkgXGZ1bmN0aW9ue3N5cy5leGNfaW5mbygpfSkgaXMgcHJvdmlkZWQsIGl0IGlzIHVzZWQ7Ci1vdGhlcndpc2UsIFxmdW5jdGlvbntzeXMuZXhjX2luZm8oKX0gaXMgY2FsbGVkIHRvIGdldCB0aGUgZXhjZXB0aW9uCi1pbmZvcm1hdGlvbi4KLQotVGhlIG90aGVyIG9wdGlvbmFsIGtleXdvcmQgYXJndW1lbnQgaXMgXHZhcntleHRyYX0gd2hpY2ggY2FuIGJlIHVzZWQgdG8gcGFzcwotYSBkaWN0aW9uYXJ5IHdoaWNoIGlzIHVzZWQgdG8gcG9wdWxhdGUgdGhlIF9fZGljdF9fIG9mIHRoZSBMb2dSZWNvcmQgY3JlYXRlZAotZm9yIHRoZSBsb2dnaW5nIGV2ZW50IHdpdGggdXNlci1kZWZpbmVkIGF0dHJpYnV0ZXMuIFRoZXNlIGN1c3RvbSBhdHRyaWJ1dGVzCi1jYW4gdGhlbiBiZSB1c2VkIGFzIHlvdSBsaWtlLiBGb3IgZXhhbXBsZSwgdGhleSBjb3VsZCBiZSBpbmNvcnBvcmF0ZWQgaW50bwotbG9nZ2VkIG1lc3NhZ2VzLiBGb3IgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotIEZPUk1BVCA9ICIlKGFzY3RpbWUpLTE1cyAlKGNsaWVudGlwKXMgJSh1c2VyKS04cyAlKG1lc3NhZ2UpcyIKLSBsb2dnaW5nLmJhc2ljQ29uZmlnKGZvcm1hdD1GT1JNQVQpCi0gZGljdCA9IHsgJ2NsaWVudGlwJyA6ICcxOTIuMTY4LjAuMScsICd1c2VyJyA6ICdmYmxvZ2dzJyB9Ci0gbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoInRjcHNlcnZlciIpCi0gbG9nZ2VyLndhcm5pbmcoIlByb3RvY29sIHByb2JsZW06ICVzIiwgImNvbm5lY3Rpb24gcmVzZXQiLCBleHRyYT1kKQotXGVuZHt2ZXJiYXRpbX0KLQotd291bGQgcHJpbnQgc29tZXRoaW5nIGxpa2UKLVxiZWdpbnt2ZXJiYXRpbX0KLTIwMDYtMDItMDggMjI6MjA6MDIsMTY1IDE5Mi4xNjguMC4xIGZibG9nZ3MgIFByb3RvY29sIHByb2JsZW06IGNvbm5lY3Rpb24gcmVzZXQKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBrZXlzIGluIHRoZSBkaWN0aW9uYXJ5IHBhc3NlZCBpbiBcdmFye2V4dHJhfSBzaG91bGQgbm90IGNsYXNoIHdpdGggdGhlIGtleXMKLXVzZWQgYnkgdGhlIGxvZ2dpbmcgc3lzdGVtLiAoU2VlIHRoZSBcY2xhc3N7Rm9ybWF0dGVyfSBkb2N1bWVudGF0aW9uIGZvciBtb3JlCi1pbmZvcm1hdGlvbiBvbiB3aGljaCBrZXlzIGFyZSB1c2VkIGJ5IHRoZSBsb2dnaW5nIHN5c3RlbS4pCi0KLUlmIHlvdSBjaG9vc2UgdG8gdXNlIHRoZXNlIGF0dHJpYnV0ZXMgaW4gbG9nZ2VkIG1lc3NhZ2VzLCB5b3UgbmVlZCB0byBleGVyY2lzZQotc29tZSBjYXJlLiBJbiB0aGUgYWJvdmUgZXhhbXBsZSwgZm9yIGluc3RhbmNlLCB0aGUgXGNsYXNze0Zvcm1hdHRlcn0gaGFzIGJlZW4KLXNldCB1cCB3aXRoIGEgZm9ybWF0IHN0cmluZyB3aGljaCBleHBlY3RzICdjbGllbnRpcCcgYW5kICd1c2VyJyBpbiB0aGUKLWF0dHJpYnV0ZSBkaWN0aW9uYXJ5IG9mIHRoZSBMb2dSZWNvcmQuIElmIHRoZXNlIGFyZSBtaXNzaW5nLCB0aGUgbWVzc2FnZSB3aWxsCi1ub3QgYmUgbG9nZ2VkIGJlY2F1c2UgYSBzdHJpbmcgZm9ybWF0dGluZyBleGNlcHRpb24gd2lsbCBvY2N1ci4gU28gaW4gdGhpcwotY2FzZSwgeW91IGFsd2F5cyBuZWVkIHRvIHBhc3MgdGhlIFx2YXJ7ZXh0cmF9IGRpY3Rpb25hcnkgd2l0aCB0aGVzZSBrZXlzLgotCi1XaGlsZSB0aGlzIG1pZ2h0IGJlIGFubm95aW5nLCB0aGlzIGZlYXR1cmUgaXMgaW50ZW5kZWQgZm9yIHVzZSBpbiBzcGVjaWFsaXplZAotY2lyY3Vtc3RhbmNlcywgc3VjaCBhcyBtdWx0aS10aHJlYWRlZCBzZXJ2ZXJzIHdoZXJlIHRoZSBzYW1lIGNvZGUgZXhlY3V0ZXMKLWluIG1hbnkgY29udGV4dHMsIGFuZCBpbnRlcmVzdGluZyBjb25kaXRpb25zIHdoaWNoIGFyaXNlIGFyZSBkZXBlbmRlbnQgb24gdGhpcwotY29udGV4dCAoc3VjaCBhcyByZW1vdGUgY2xpZW50IElQIGFkZHJlc3MgYW5kIGF1dGhlbnRpY2F0ZWQgdXNlciBuYW1lLCBpbiB0aGUKLWFib3ZlIGV4YW1wbGUpLiBJbiBzdWNoIGNpcmN1bXN0YW5jZXMsIGl0IGlzIGxpa2VseSB0aGF0IHNwZWNpYWxpemVkCi1cY2xhc3N7Rm9ybWF0dGVyfXMgd291bGQgYmUgdXNlZCB3aXRoIHBhcnRpY3VsYXIgXGNsYXNze0hhbmRsZXJ9cy4KLQotXHZlcnNpb25jaGFuZ2VkW1x2YXJ7ZXh0cmF9IHdhcyBhZGRlZF17Mi41fQotCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtMb2dnZXJde2luZm99e21zZ1xvcHRpb25hbHssICphcmdzXG9wdGlvbmFseywgKiprd2FyZ3N9fX0KLUxvZ3MgYSBtZXNzYWdlIHdpdGggbGV2ZWwgXGNvbnN0YW50e0lORk99IG9uIHRoaXMgbG9nZ2VyLgotVGhlIGFyZ3VtZW50cyBhcmUgaW50ZXJwcmV0ZWQgYXMgZm9yIFxtZXRob2R7ZGVidWcoKX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtMb2dnZXJde3dhcm5pbmd9e21zZ1xvcHRpb25hbHssICphcmdzXG9wdGlvbmFseywgKiprd2FyZ3N9fX0KLUxvZ3MgYSBtZXNzYWdlIHdpdGggbGV2ZWwgXGNvbnN0YW50e1dBUk5JTkd9IG9uIHRoaXMgbG9nZ2VyLgotVGhlIGFyZ3VtZW50cyBhcmUgaW50ZXJwcmV0ZWQgYXMgZm9yIFxtZXRob2R7ZGVidWcoKX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtMb2dnZXJde2Vycm9yfXttc2dcb3B0aW9uYWx7LCAqYXJnc1xvcHRpb25hbHssICoqa3dhcmdzfX19Ci1Mb2dzIGEgbWVzc2FnZSB3aXRoIGxldmVsIFxjb25zdGFudHtFUlJPUn0gb24gdGhpcyBsb2dnZXIuCi1UaGUgYXJndW1lbnRzIGFyZSBpbnRlcnByZXRlZCBhcyBmb3IgXG1ldGhvZHtkZWJ1ZygpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0xvZ2dlcl17Y3JpdGljYWx9e21zZ1xvcHRpb25hbHssICphcmdzXG9wdGlvbmFseywgKiprd2FyZ3N9fX0KLUxvZ3MgYSBtZXNzYWdlIHdpdGggbGV2ZWwgXGNvbnN0YW50e0NSSVRJQ0FMfSBvbiB0aGlzIGxvZ2dlci4KLVRoZSBhcmd1bWVudHMgYXJlIGludGVycHJldGVkIGFzIGZvciBcbWV0aG9ke2RlYnVnKCl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTG9nZ2VyXXtsb2d9e2x2bCwgbXNnXG9wdGlvbmFseywgKmFyZ3Ncb3B0aW9uYWx7LCAqKmt3YXJnc319fQotTG9ncyBhIG1lc3NhZ2Ugd2l0aCBpbnRlZ2VyIGxldmVsIFx2YXJ7bHZsfSBvbiB0aGlzIGxvZ2dlci4KLVRoZSBvdGhlciBhcmd1bWVudHMgYXJlIGludGVycHJldGVkIGFzIGZvciBcbWV0aG9ke2RlYnVnKCl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTG9nZ2VyXXtleGNlcHRpb259e21zZ1xvcHRpb25hbHssICphcmdzfX0KLUxvZ3MgYSBtZXNzYWdlIHdpdGggbGV2ZWwgXGNvbnN0YW50e0VSUk9SfSBvbiB0aGlzIGxvZ2dlci4KLVRoZSBhcmd1bWVudHMgYXJlIGludGVycHJldGVkIGFzIGZvciBcbWV0aG9ke2RlYnVnKCl9LiBFeGNlcHRpb24gaW5mbwotaXMgYWRkZWQgdG8gdGhlIGxvZ2dpbmcgbWVzc2FnZS4gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkCi1mcm9tIGFuIGV4Y2VwdGlvbiBoYW5kbGVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTG9nZ2VyXXthZGRGaWx0ZXJ9e2ZpbHR9Ci1BZGRzIHRoZSBzcGVjaWZpZWQgZmlsdGVyIFx2YXJ7ZmlsdH0gdG8gdGhpcyBsb2dnZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtMb2dnZXJde3JlbW92ZUZpbHRlcn17ZmlsdH0KLVJlbW92ZXMgdGhlIHNwZWNpZmllZCBmaWx0ZXIgXHZhcntmaWx0fSBmcm9tIHRoaXMgbG9nZ2VyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTG9nZ2VyXXtmaWx0ZXJ9e3JlY29yZH0KLUFwcGxpZXMgdGhpcyBsb2dnZXIncyBmaWx0ZXJzIHRvIHRoZSByZWNvcmQgYW5kIHJldHVybnMgYSB0cnVlIHZhbHVlIGlmCi10aGUgcmVjb3JkIGlzIHRvIGJlIHByb2Nlc3NlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0xvZ2dlcl17YWRkSGFuZGxlcn17aGRscn0KLUFkZHMgdGhlIHNwZWNpZmllZCBoYW5kbGVyIFx2YXJ7aGRscn0gdG8gdGhpcyBsb2dnZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtMb2dnZXJde3JlbW92ZUhhbmRsZXJ9e2hkbHJ9Ci1SZW1vdmVzIHRoZSBzcGVjaWZpZWQgaGFuZGxlciBcdmFye2hkbHJ9IGZyb20gdGhpcyBsb2dnZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtMb2dnZXJde2ZpbmRDYWxsZXJ9e30KLUZpbmRzIHRoZSBjYWxsZXIncyBzb3VyY2UgZmlsZW5hbWUgYW5kIGxpbmUgbnVtYmVyLiBSZXR1cm5zIHRoZSBmaWxlbmFtZSwKLWxpbmUgbnVtYmVyIGFuZCBmdW5jdGlvbiBuYW1lIGFzIGEgMy1lbGVtZW50IHR1cGxlLgotXHZlcnNpb25jaGFuZ2VkW1RoZSBmdW5jdGlvbiBuYW1lIHdhcyBhZGRlZC4gSW4gZWFybGllciB2ZXJzaW9ucywgdGhlCi1maWxlbmFtZSBhbmQgbGluZSBudW1iZXIgd2VyZSByZXR1cm5lZCBhcyBhIDItZWxlbWVudCB0dXBsZS5dezIuNX0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0xvZ2dlcl17aGFuZGxlfXtyZWNvcmR9Ci1IYW5kbGVzIGEgcmVjb3JkIGJ5IHBhc3NpbmcgaXQgdG8gYWxsIGhhbmRsZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxvZ2dlcgotYW5kIGl0cyBhbmNlc3RvcnMgKHVudGlsIGEgZmFsc2UgdmFsdWUgb2YgXHZhcntwcm9wYWdhdGV9IGlzIGZvdW5kKS4KLVRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIHVucGlja2xlZCByZWNvcmRzIHJlY2VpdmVkIGZyb20gYSBzb2NrZXQsIGFzIHdlbGwKLWFzIHRob3NlIGNyZWF0ZWQgbG9jYWxseS4gTG9nZ2VyLWxldmVsIGZpbHRlcmluZyBpcyBhcHBsaWVkIHVzaW5nCi1cbWV0aG9ke2ZpbHRlcigpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0xvZ2dlcl17bWFrZVJlY29yZH17bmFtZSwgbHZsLCBmbiwgbG5vLCBtc2csIGFyZ3MsIGV4Y19pbmZvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcb3B0aW9uYWx7LCBmdW5jLCBleHRyYX19Ci1UaGlzIGlzIGEgZmFjdG9yeSBtZXRob2Qgd2hpY2ggY2FuIGJlIG92ZXJyaWRkZW4gaW4gc3ViY2xhc3NlcyB0byBjcmVhdGUKLXNwZWNpYWxpemVkIFxjbGFzc3tMb2dSZWNvcmR9IGluc3RhbmNlcy4KLVx2ZXJzaW9uY2hhbmdlZFtcdmFye2Z1bmN9IGFuZCBcdmFye2V4dHJhfSB3ZXJlIGFkZGVkXXsyLjV9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxzdWJzZWN0aW9ue0Jhc2ljIGV4YW1wbGUgXGxhYmVse21pbmltYWwtZXhhbXBsZX19Ci0KLVx2ZXJzaW9uY2hhbmdlZFtmb3JtZXJseSBcZnVuY3Rpb257YmFzaWNDb25maWd9IGRpZCBub3QgdGFrZSBhbnkga2V5d29yZAotYXJndW1lbnRzXXsyLjR9Ci0KLVRoZSBcbW9kdWxle2xvZ2dpbmd9IHBhY2thZ2UgcHJvdmlkZXMgYSBsb3Qgb2YgZmxleGliaWxpdHksIGFuZCBpdHMKLWNvbmZpZ3VyYXRpb24gY2FuIGFwcGVhciBkYXVudGluZy4gIFRoaXMgc2VjdGlvbiBkZW1vbnN0cmF0ZXMgdGhhdCBzaW1wbGUKLXVzZSBvZiB0aGUgbG9nZ2luZyBwYWNrYWdlIGlzIHBvc3NpYmxlLgotCi1UaGUgc2ltcGxlc3QgZXhhbXBsZSBzaG93cyBsb2dnaW5nIHRvIHRoZSBjb25zb2xlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgbG9nZ2luZwotCi1sb2dnaW5nLmRlYnVnKCdBIGRlYnVnIG1lc3NhZ2UnKQotbG9nZ2luZy5pbmZvKCdTb21lIGluZm9ybWF0aW9uJykKLWxvZ2dpbmcud2FybmluZygnQSBzaG90IGFjcm9zcyB0aGUgYm93cycpCi1cZW5ke3ZlcmJhdGltfQotCi1JZiB5b3UgcnVuIHRoZSBhYm92ZSBzY3JpcHQsIHlvdSdsbCBzZWUgdGhpczoKLVxiZWdpbnt2ZXJiYXRpbX0KLVdBUk5JTkc6cm9vdDpBIHNob3QgYWNyb3NzIHRoZSBib3dzCi1cZW5ke3ZlcmJhdGltfQotCi1CZWNhdXNlIG5vIHBhcnRpY3VsYXIgbG9nZ2VyIHdhcyBzcGVjaWZpZWQsIHRoZSBzeXN0ZW0gdXNlZCB0aGUgcm9vdCBsb2dnZXIuCi1UaGUgZGVidWcgYW5kIGluZm8gbWVzc2FnZXMgZGlkbid0IGFwcGVhciBiZWNhdXNlIGJ5IGRlZmF1bHQsIHRoZSByb290Ci1sb2dnZXIgaXMgY29uZmlndXJlZCB0byBvbmx5IGhhbmRsZSBtZXNzYWdlcyB3aXRoIGEgc2V2ZXJpdHkgb2YgV0FSTklORwotb3IgYWJvdmUuIFRoZSBtZXNzYWdlIGZvcm1hdCBpcyBhbHNvIGEgY29uZmlndXJhdGlvbiBkZWZhdWx0LCBhcyBpcyB0aGUgb3V0cHV0Ci1kZXN0aW5hdGlvbiBvZiB0aGUgbWVzc2FnZXMgLSBcY29kZXtzeXMuc3RkZXJyfS4gVGhlIHNldmVyaXR5IGxldmVsLAotdGhlIG1lc3NhZ2UgZm9ybWF0IGFuZCBkZXN0aW5hdGlvbiBjYW4gYmUgZWFzaWx5IGNoYW5nZWQsIGFzIHNob3duIGluCi10aGUgZXhhbXBsZSBiZWxvdzoKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IGxvZ2dpbmcKLQotbG9nZ2luZy5iYXNpY0NvbmZpZyhsZXZlbD1sb2dnaW5nLkRFQlVHLAotICAgICAgICAgICAgICAgICAgICBmb3JtYXQ9JyUoYXNjdGltZSlzICUobGV2ZWxuYW1lKXMgJShtZXNzYWdlKXMnLAotICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZT0nL3RtcC9teWFwcC5sb2cnLAotICAgICAgICAgICAgICAgICAgICBmaWxlbW9kZT0ndycpCi1sb2dnaW5nLmRlYnVnKCdBIGRlYnVnIG1lc3NhZ2UnKQotbG9nZ2luZy5pbmZvKCdTb21lIGluZm9ybWF0aW9uJykKLWxvZ2dpbmcud2FybmluZygnQSBzaG90IGFjcm9zcyB0aGUgYm93cycpCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgXG1ldGhvZHtiYXNpY0NvbmZpZygpfSBtZXRob2QgaXMgdXNlZCB0byBjaGFuZ2UgdGhlIGNvbmZpZ3VyYXRpb24KLWRlZmF1bHRzLCB3aGljaCByZXN1bHRzIGluIG91dHB1dCAod3JpdHRlbiB0byBcY29kZXsvdG1wL215YXBwLmxvZ30pCi13aGljaCBzaG91bGQgbG9vayBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nOgotCi1cYmVnaW57dmVyYmF0aW19Ci0yMDA0LTA3LTAyIDEzOjAwOjA4LDc0MyBERUJVRyBBIGRlYnVnIG1lc3NhZ2UKLTIwMDQtMDctMDIgMTM6MDA6MDgsNzQzIElORk8gU29tZSBpbmZvcm1hdGlvbgotMjAwNC0wNy0wMiAxMzowMDowOCw3NDMgV0FSTklORyBBIHNob3QgYWNyb3NzIHRoZSBib3dzCi1cZW5ke3ZlcmJhdGltfQotCi1UaGlzIHRpbWUsIGFsbCBtZXNzYWdlcyB3aXRoIGEgc2V2ZXJpdHkgb2YgREVCVUcgb3IgYWJvdmUgd2VyZSBoYW5kbGVkLAotYW5kIHRoZSBmb3JtYXQgb2YgdGhlIG1lc3NhZ2VzIHdhcyBhbHNvIGNoYW5nZWQsIGFuZCBvdXRwdXQgd2VudCB0byB0aGUKLXNwZWNpZmllZCBmaWxlIHJhdGhlciB0aGFuIHRoZSBjb25zb2xlLgotCi1Gb3JtYXR0aW5nIHVzZXMgc3RhbmRhcmQgUHl0aG9uIHN0cmluZyBmb3JtYXR0aW5nIC0gc2VlIHNlY3Rpb24KLVxyZWZ7dHlwZXNzZXEtc3RyaW5nc30uIFRoZSBmb3JtYXQgc3RyaW5nIHRha2VzIHRoZSBmb2xsb3dpbmcKLWNvbW1vbiBzcGVjaWZpZXJzLiBGb3IgYSBjb21wbGV0ZSBsaXN0IG9mIHNwZWNpZmllcnMsIGNvbnN1bHQgdGhlCi1cY2xhc3N7Rm9ybWF0dGVyfSBkb2N1bWVudGF0aW9uLgotCi1cYmVnaW57dGFibGVpaX17bHxsfXtjb2RlfXtGb3JtYXR9e0Rlc2NyaXB0aW9ufQotXGxpbmVpaXtcJShuYW1lKXN9ICAgICB7TmFtZSBvZiB0aGUgbG9nZ2VyIChsb2dnaW5nIGNoYW5uZWwpLn0KLVxsaW5laWl7XCUobGV2ZWxuYW1lKXN9e1RleHQgbG9nZ2luZyBsZXZlbCBmb3IgdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgIChcY29kZXsnREVCVUcnfSwgXGNvZGV7J0lORk8nfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFxjb2RleydXQVJOSU5HJ30sIFxjb2RleydFUlJPUid9LAotICAgICAgICAgICAgICAgICAgICAgICAgXGNvZGV7J0NSSVRJQ0FMJ30pLn0KLVxsaW5laWl7XCUoYXNjdGltZSlzfSAge0h1bWFuLXJlYWRhYmxlIHRpbWUgd2hlbiB0aGUgXGNsYXNze0xvZ1JlY29yZH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdhcyBjcmVhdGVkLiAgQnkgZGVmYXVsdCB0aGlzIGlzIG9mIHRoZSBmb3JtCi0gICAgICAgICAgICAgICAgICAgICAgICBgYDIwMDMtMDctMDggMTY6NDk6NDUsODk2JycgKHRoZSBudW1iZXJzIGFmdGVyIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgY29tbWEgYXJlIG1pbGxpc2Vjb25kIHBvcnRpb24gb2YgdGhlIHRpbWUpLn0KLVxsaW5laWl7XCUobWVzc2FnZSlzfSAge1RoZSBsb2dnZWQgbWVzc2FnZS59Ci1cZW5ke3RhYmxlaWl9Ci0KLVRvIGNoYW5nZSB0aGUgZGF0ZS90aW1lIGZvcm1hdCwgeW91IGNhbiBwYXNzIGFuIGFkZGl0aW9uYWwga2V5d29yZCBwYXJhbWV0ZXIsCi1cdmFye2RhdGVmbXR9LCBhcyBpbiB0aGUgZm9sbG93aW5nOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgbG9nZ2luZwotCi1sb2dnaW5nLmJhc2ljQ29uZmlnKGxldmVsPWxvZ2dpbmcuREVCVUcsCi0gICAgICAgICAgICAgICAgICAgIGZvcm1hdD0nJShhc2N0aW1lKXMgJShsZXZlbG5hbWUpLThzICUobWVzc2FnZSlzJywKLSAgICAgICAgICAgICAgICAgICAgZGF0ZWZtdD0nJWEsICVkICViICVZICVIOiVNOiVTJywKLSAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU9Jy90ZW1wL215YXBwLmxvZycsCi0gICAgICAgICAgICAgICAgICAgIGZpbGVtb2RlPSd3JykKLWxvZ2dpbmcuZGVidWcoJ0EgZGVidWcgbWVzc2FnZScpCi1sb2dnaW5nLmluZm8oJ1NvbWUgaW5mb3JtYXRpb24nKQotbG9nZ2luZy53YXJuaW5nKCdBIHNob3QgYWNyb3NzIHRoZSBib3dzJykKLVxlbmR7dmVyYmF0aW19Ci0KLXdoaWNoIHdvdWxkIHJlc3VsdCBpbiBvdXRwdXQgbGlrZQotCi1cYmVnaW57dmVyYmF0aW19Ci1GcmksIDAyIEp1bCAyMDA0IDEzOjA2OjE4IERFQlVHICAgIEEgZGVidWcgbWVzc2FnZQotRnJpLCAwMiBKdWwgMjAwNCAxMzowNjoxOCBJTkZPICAgICBTb21lIGluZm9ybWF0aW9uCi1GcmksIDAyIEp1bCAyMDA0IDEzOjA2OjE4IFdBUk5JTkcgIEEgc2hvdCBhY3Jvc3MgdGhlIGJvd3MKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBkYXRlIGZvcm1hdCBzdHJpbmcgZm9sbG93cyB0aGUgcmVxdWlyZW1lbnRzIG9mIFxmdW5jdGlvbntzdHJmdGltZSgpfSAtCi1zZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBccmVmbW9kdWxle3RpbWV9IG1vZHVsZS4KLQotSWYsIGluc3RlYWQgb2Ygc2VuZGluZyBsb2dnaW5nIG91dHB1dCB0byB0aGUgY29uc29sZSBvciBhIGZpbGUsIHlvdSdkIHJhdGhlcgotdXNlIGEgZmlsZS1saWtlIG9iamVjdCB3aGljaCB5b3UgaGF2ZSBjcmVhdGVkIHNlcGFyYXRlbHksIHlvdSBjYW4gcGFzcyBpdAotdG8gXGZ1bmN0aW9ue2Jhc2ljQ29uZmlnKCl9IHVzaW5nIHRoZSBcdmFye3N0cmVhbX0ga2V5d29yZCBhcmd1bWVudC4gTm90ZQotdGhhdCBpZiBib3RoIFx2YXJ7c3RyZWFtfSBhbmQgXHZhcntmaWxlbmFtZX0ga2V5d29yZCBhcmd1bWVudHMgYXJlIHBhc3NlZCwKLXRoZSBcdmFye3N0cmVhbX0gYXJndW1lbnQgaXMgaWdub3JlZC4KLQotT2YgY291cnNlLCB5b3UgY2FuIHB1dCB2YXJpYWJsZSBpbmZvcm1hdGlvbiBpbiB5b3VyIG91dHB1dC4gVG8gZG8gdGhpcywKLXNpbXBseSBoYXZlIHRoZSBtZXNzYWdlIGJlIGEgZm9ybWF0IHN0cmluZyBhbmQgcGFzcyBpbiBhZGRpdGlvbmFsIGFyZ3VtZW50cwotY29udGFpbmluZyB0aGUgdmFyaWFibGUgaW5mb3JtYXRpb24sIGFzIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IGxvZ2dpbmcKLQotbG9nZ2luZy5iYXNpY0NvbmZpZyhsZXZlbD1sb2dnaW5nLkRFQlVHLAotICAgICAgICAgICAgICAgICAgICBmb3JtYXQ9JyUoYXNjdGltZSlzICUobGV2ZWxuYW1lKS04cyAlKG1lc3NhZ2UpcycsCi0gICAgICAgICAgICAgICAgICAgIGRhdGVmbXQ9JyVhLCAlZCAlYiAlWSAlSDolTTolUycsCi0gICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPScvdGVtcC9teWFwcC5sb2cnLAotICAgICAgICAgICAgICAgICAgICBmaWxlbW9kZT0ndycpCi1sb2dnaW5nLmVycm9yKCdQYWNrIG15IGJveCB3aXRoICVkIGRvemVuICVzJywgNSwgJ2xpcXVvciBqdWdzJykKLVxlbmR7dmVyYmF0aW19Ci0KLXdoaWNoIHdvdWxkIHJlc3VsdCBpbgotCi1cYmVnaW57dmVyYmF0aW19Ci1XZWQsIDIxIEp1bCAyMDA0IDE1OjM1OjE2IEVSUk9SICAgIFBhY2sgbXkgYm94IHdpdGggNSBkb3plbiBsaXF1b3IganVncwotXGVuZHt2ZXJiYXRpbX0KLQotXHN1YnNlY3Rpb257TG9nZ2luZyB0byBtdWx0aXBsZSBkZXN0aW5hdGlvbnMgXGxhYmVse211bHRpcGxlLWRlc3RpbmF0aW9uc319Ci0KLUxldCdzIHNheSB5b3Ugd2FudCB0byBsb2cgdG8gY29uc29sZSBhbmQgZmlsZSB3aXRoIGRpZmZlcmVudCBtZXNzYWdlIGZvcm1hdHMKLWFuZCBpbiBkaWZmZXJpbmcgY2lyY3Vtc3RhbmNlcy4gU2F5IHlvdSB3YW50IHRvIGxvZyBtZXNzYWdlcyB3aXRoIGxldmVscwotb2YgREVCVUcgYW5kIGhpZ2hlciB0byBmaWxlLCBhbmQgdGhvc2UgbWVzc2FnZXMgYXQgbGV2ZWwgSU5GTyBhbmQgaGlnaGVyIHRvCi10aGUgY29uc29sZS4gTGV0J3MgYWxzbyBhc3N1bWUgdGhhdCB0aGUgZmlsZSBzaG91bGQgY29udGFpbiB0aW1lc3RhbXBzLCBidXQKLXRoZSBjb25zb2xlIG1lc3NhZ2VzIHNob3VsZCBub3QuIEhlcmUncyBob3cgeW91IGNhbiBhY2hpZXZlIHRoaXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCBsb2dnaW5nCi0KLSMgc2V0IHVwIGxvZ2dpbmcgdG8gZmlsZSAtIHNlZSBwcmV2aW91cyBzZWN0aW9uIGZvciBtb3JlIGRldGFpbHMKLWxvZ2dpbmcuYmFzaWNDb25maWcobGV2ZWw9bG9nZ2luZy5ERUJVRywKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0PSclKGFzY3RpbWUpcyAlKG5hbWUpLTEycyAlKGxldmVsbmFtZSktOHMgJShtZXNzYWdlKXMnLAotICAgICAgICAgICAgICAgICAgICBkYXRlZm10PSclbS0lZCAlSDolTScsCi0gICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPScvdGVtcC9teWFwcC5sb2cnLAotICAgICAgICAgICAgICAgICAgICBmaWxlbW9kZT0ndycpCi0jIGRlZmluZSBhIEhhbmRsZXIgd2hpY2ggd3JpdGVzIElORk8gbWVzc2FnZXMgb3IgaGlnaGVyIHRvIHRoZSBzeXMuc3RkZXJyCi1jb25zb2xlID0gbG9nZ2luZy5TdHJlYW1IYW5kbGVyKCkKLWNvbnNvbGUuc2V0TGV2ZWwobG9nZ2luZy5JTkZPKQotIyBzZXQgYSBmb3JtYXQgd2hpY2ggaXMgc2ltcGxlciBmb3IgY29uc29sZSB1c2UKLWZvcm1hdHRlciA9IGxvZ2dpbmcuRm9ybWF0dGVyKCclKG5hbWUpLTEyczogJShsZXZlbG5hbWUpLThzICUobWVzc2FnZSlzJykKLSMgdGVsbCB0aGUgaGFuZGxlciB0byB1c2UgdGhpcyBmb3JtYXQKLWNvbnNvbGUuc2V0Rm9ybWF0dGVyKGZvcm1hdHRlcikKLSMgYWRkIHRoZSBoYW5kbGVyIHRvIHRoZSByb290IGxvZ2dlcgotbG9nZ2luZy5nZXRMb2dnZXIoJycpLmFkZEhhbmRsZXIoY29uc29sZSkKLQotIyBOb3csIHdlIGNhbiBsb2cgdG8gdGhlIHJvb3QgbG9nZ2VyLCBvciBhbnkgb3RoZXIgbG9nZ2VyLiBGaXJzdCB0aGUgcm9vdC4uLgotbG9nZ2luZy5pbmZvKCdKYWNrZGF3cyBsb3ZlIG15IGJpZyBzcGhpbnggb2YgcXVhcnR6LicpCi0KLSMgTm93LCBkZWZpbmUgYSBjb3VwbGUgb2Ygb3RoZXIgbG9nZ2VycyB3aGljaCBtaWdodCByZXByZXNlbnQgYXJlYXMgaW4geW91cgotIyBhcHBsaWNhdGlvbjoKLQotbG9nZ2VyMSA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCdteWFwcC5hcmVhMScpCi1sb2dnZXIyID0gbG9nZ2luZy5nZXRMb2dnZXIoJ215YXBwLmFyZWEyJykKLQotbG9nZ2VyMS5kZWJ1ZygnUXVpY2sgemVwaHlycyBibG93LCB2ZXhpbmcgZGFmdCBKaW0uJykKLWxvZ2dlcjEuaW5mbygnSG93IHF1aWNrbHkgZGFmdCBqdW1waW5nIHplYnJhcyB2ZXguJykKLWxvZ2dlcjIud2FybmluZygnSmFpbCB6ZXN0eSB2aXhlbiB3aG8gZ3JhYmJlZCBwYXkgZnJvbSBxdWFjay4nKQotbG9nZ2VyMi5lcnJvcignVGhlIGZpdmUgYm94aW5nIHdpemFyZHMganVtcCBxdWlja2x5LicpCi1cZW5ke3ZlcmJhdGltfQotCi1XaGVuIHlvdSBydW4gdGhpcywgb24gdGhlIGNvbnNvbGUgeW91IHdpbGwgc2VlCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLXJvb3QgICAgICAgIDogSU5GTyAgICAgSmFja2Rhd3MgbG92ZSBteSBiaWcgc3BoaW54IG9mIHF1YXJ0ei4KLW15YXBwLmFyZWExIDogSU5GTyAgICAgSG93IHF1aWNrbHkgZGFmdCBqdW1waW5nIHplYnJhcyB2ZXguCi1teWFwcC5hcmVhMiA6IFdBUk5JTkcgIEphaWwgemVzdHkgdml4ZW4gd2hvIGdyYWJiZWQgcGF5IGZyb20gcXVhY2suCi1teWFwcC5hcmVhMiA6IEVSUk9SICAgIFRoZSBmaXZlIGJveGluZyB3aXphcmRzIGp1bXAgcXVpY2tseS4KLVxlbmR7dmVyYmF0aW19Ci0KLWFuZCBpbiB0aGUgZmlsZSB5b3Ugd2lsbCBzZWUgc29tZXRoaW5nIGxpa2UKLQotXGJlZ2lue3ZlcmJhdGltfQotMTAtMjIgMjI6MTkgcm9vdCAgICAgICAgIElORk8gICAgIEphY2tkYXdzIGxvdmUgbXkgYmlnIHNwaGlueCBvZiBxdWFydHouCi0xMC0yMiAyMjoxOSBteWFwcC5hcmVhMSAgREVCVUcgICAgUXVpY2sgemVwaHlycyBibG93LCB2ZXhpbmcgZGFmdCBKaW0uCi0xMC0yMiAyMjoxOSBteWFwcC5hcmVhMSAgSU5GTyAgICAgSG93IHF1aWNrbHkgZGFmdCBqdW1waW5nIHplYnJhcyB2ZXguCi0xMC0yMiAyMjoxOSBteWFwcC5hcmVhMiAgV0FSTklORyAgSmFpbCB6ZXN0eSB2aXhlbiB3aG8gZ3JhYmJlZCBwYXkgZnJvbSBxdWFjay4KLTEwLTIyIDIyOjE5IG15YXBwLmFyZWEyICBFUlJPUiAgICBUaGUgZml2ZSBib3hpbmcgd2l6YXJkcyBqdW1wIHF1aWNrbHkuCi1cZW5ke3ZlcmJhdGltfQotCi1BcyB5b3UgY2FuIHNlZSwgdGhlIERFQlVHIG1lc3NhZ2Ugb25seSBzaG93cyB1cCBpbiB0aGUgZmlsZS4gVGhlIG90aGVyCi1tZXNzYWdlcyBhcmUgc2VudCB0byBib3RoIGRlc3RpbmF0aW9ucy4KLQotVGhpcyBleGFtcGxlIHVzZXMgY29uc29sZSBhbmQgZmlsZSBoYW5kbGVycywgYnV0IHlvdSBjYW4gdXNlIGFueSBudW1iZXIgYW5kCi1jb21iaW5hdGlvbiBvZiBoYW5kbGVycyB5b3UgY2hvb3NlLgotCi1cc3Vic2VjdGlvbntTZW5kaW5nIGFuZCByZWNlaXZpbmcgbG9nZ2luZyBldmVudHMgYWNyb3NzIGEgbmV0d29yawotXGxhYmVse25ldHdvcmstbG9nZ2luZ319Ci0KLUxldCdzIHNheSB5b3Ugd2FudCB0byBzZW5kIGxvZ2dpbmcgZXZlbnRzIGFjcm9zcyBhIG5ldHdvcmssIGFuZCBoYW5kbGUgdGhlbQotYXQgdGhlIHJlY2VpdmluZyBlbmQuIEEgc2ltcGxlIHdheSBvZiBkb2luZyB0aGlzIGlzIGF0dGFjaGluZyBhCi1cY2xhc3N7U29ja2V0SGFuZGxlcn0gaW5zdGFuY2UgdG8gdGhlIHJvb3QgbG9nZ2VyIGF0IHRoZSBzZW5kaW5nIGVuZDoKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IGxvZ2dpbmcsIGxvZ2dpbmcuaGFuZGxlcnMKLQotcm9vdExvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCcnKQotcm9vdExvZ2dlci5zZXRMZXZlbChsb2dnaW5nLkRFQlVHKQotc29ja2V0SGFuZGxlciA9IGxvZ2dpbmcuaGFuZGxlcnMuU29ja2V0SGFuZGxlcignbG9jYWxob3N0JywKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2luZy5oYW5kbGVycy5ERUZBVUxUX1RDUF9MT0dHSU5HX1BPUlQpCi0jIGRvbid0IGJvdGhlciB3aXRoIGEgZm9ybWF0dGVyLCBzaW5jZSBhIHNvY2tldCBoYW5kbGVyIHNlbmRzIHRoZSBldmVudCBhcwotIyBhbiB1bmZvcm1hdHRlZCBwaWNrbGUKLXJvb3RMb2dnZXIuYWRkSGFuZGxlcihzb2NrZXRIYW5kbGVyKQotCi0jIE5vdywgd2UgY2FuIGxvZyB0byB0aGUgcm9vdCBsb2dnZXIsIG9yIGFueSBvdGhlciBsb2dnZXIuIEZpcnN0IHRoZSByb290Li4uCi1sb2dnaW5nLmluZm8oJ0phY2tkYXdzIGxvdmUgbXkgYmlnIHNwaGlueCBvZiBxdWFydHouJykKLQotIyBOb3csIGRlZmluZSBhIGNvdXBsZSBvZiBvdGhlciBsb2dnZXJzIHdoaWNoIG1pZ2h0IHJlcHJlc2VudCBhcmVhcyBpbiB5b3VyCi0jIGFwcGxpY2F0aW9uOgotCi1sb2dnZXIxID0gbG9nZ2luZy5nZXRMb2dnZXIoJ215YXBwLmFyZWExJykKLWxvZ2dlcjIgPSBsb2dnaW5nLmdldExvZ2dlcignbXlhcHAuYXJlYTInKQotCi1sb2dnZXIxLmRlYnVnKCdRdWljayB6ZXBoeXJzIGJsb3csIHZleGluZyBkYWZ0IEppbS4nKQotbG9nZ2VyMS5pbmZvKCdIb3cgcXVpY2tseSBkYWZ0IGp1bXBpbmcgemVicmFzIHZleC4nKQotbG9nZ2VyMi53YXJuaW5nKCdKYWlsIHplc3R5IHZpeGVuIHdobyBncmFiYmVkIHBheSBmcm9tIHF1YWNrLicpCi1sb2dnZXIyLmVycm9yKCdUaGUgZml2ZSBib3hpbmcgd2l6YXJkcyBqdW1wIHF1aWNrbHkuJykKLVxlbmR7dmVyYmF0aW19Ci0KLUF0IHRoZSByZWNlaXZpbmcgZW5kLCB5b3UgY2FuIHNldCB1cCBhIHJlY2VpdmVyIHVzaW5nIHRoZQotXG1vZHVsZXtTb2NrZXRTZXJ2ZXJ9IG1vZHVsZS4gSGVyZSBpcyBhIGJhc2ljIHdvcmtpbmcgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IGNQaWNrbGUKLWltcG9ydCBsb2dnaW5nCi1pbXBvcnQgbG9nZ2luZy5oYW5kbGVycwotaW1wb3J0IFNvY2tldFNlcnZlcgotaW1wb3J0IHN0cnVjdAotCi0KLWNsYXNzIExvZ1JlY29yZFN0cmVhbUhhbmRsZXIoU29ja2V0U2VydmVyLlN0cmVhbVJlcXVlc3RIYW5kbGVyKToKLSAgICAiIiJIYW5kbGVyIGZvciBhIHN0cmVhbWluZyBsb2dnaW5nIHJlcXVlc3QuCi0KLSAgICBUaGlzIGJhc2ljYWxseSBsb2dzIHRoZSByZWNvcmQgdXNpbmcgd2hhdGV2ZXIgbG9nZ2luZyBwb2xpY3kgaXMKLSAgICBjb25maWd1cmVkIGxvY2FsbHkuCi0gICAgIiIiCi0KLSAgICBkZWYgaGFuZGxlKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgSGFuZGxlIG11bHRpcGxlIHJlcXVlc3RzIC0gZWFjaCBleHBlY3RlZCB0byBiZSBhIDQtYnl0ZSBsZW5ndGgsCi0gICAgICAgIGZvbGxvd2VkIGJ5IHRoZSBMb2dSZWNvcmQgaW4gcGlja2xlIGZvcm1hdC4gTG9ncyB0aGUgcmVjb3JkCi0gICAgICAgIGFjY29yZGluZyB0byB3aGF0ZXZlciBwb2xpY3kgaXMgY29uZmlndXJlZCBsb2NhbGx5LgotICAgICAgICAiIiIKLSAgICAgICAgd2hpbGUgMToKLSAgICAgICAgICAgIGNodW5rID0gc2VsZi5jb25uZWN0aW9uLnJlY3YoNCkKLSAgICAgICAgICAgIGlmIGxlbihjaHVuaykgPCA0OgotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBzbGVuID0gc3RydWN0LnVucGFjaygiPkwiLCBjaHVuaylbMF0KLSAgICAgICAgICAgIGNodW5rID0gc2VsZi5jb25uZWN0aW9uLnJlY3Yoc2xlbikKLSAgICAgICAgICAgIHdoaWxlIGxlbihjaHVuaykgPCBzbGVuOgotICAgICAgICAgICAgICAgIGNodW5rID0gY2h1bmsgKyBzZWxmLmNvbm5lY3Rpb24ucmVjdihzbGVuIC0gbGVuKGNodW5rKSkKLSAgICAgICAgICAgIG9iaiA9IHNlbGYudW5QaWNrbGUoY2h1bmspCi0gICAgICAgICAgICByZWNvcmQgPSBsb2dnaW5nLm1ha2VMb2dSZWNvcmQob2JqKQotICAgICAgICAgICAgc2VsZi5oYW5kbGVMb2dSZWNvcmQocmVjb3JkKQotCi0gICAgZGVmIHVuUGlja2xlKHNlbGYsIGRhdGEpOgotICAgICAgICByZXR1cm4gY1BpY2tsZS5sb2FkcyhkYXRhKQotCi0gICAgZGVmIGhhbmRsZUxvZ1JlY29yZChzZWxmLCByZWNvcmQpOgotICAgICAgICAjIGlmIGEgbmFtZSBpcyBzcGVjaWZpZWQsIHdlIHVzZSB0aGUgbmFtZWQgbG9nZ2VyIHJhdGhlciB0aGFuIHRoZSBvbmUKLSAgICAgICAgIyBpbXBsaWVkIGJ5IHRoZSByZWNvcmQuCi0gICAgICAgIGlmIHNlbGYuc2VydmVyLmxvZ25hbWUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBuYW1lID0gc2VsZi5zZXJ2ZXIubG9nbmFtZQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgbmFtZSA9IHJlY29yZC5uYW1lCi0gICAgICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKG5hbWUpCi0gICAgICAgICMgTi5CLiBFVkVSWSByZWNvcmQgZ2V0cyBsb2dnZWQuIFRoaXMgaXMgYmVjYXVzZSBMb2dnZXIuaGFuZGxlCi0gICAgICAgICMgaXMgbm9ybWFsbHkgY2FsbGVkIEFGVEVSIGxvZ2dlci1sZXZlbCBmaWx0ZXJpbmcuIElmIHlvdSB3YW50Ci0gICAgICAgICMgdG8gZG8gZmlsdGVyaW5nLCBkbyBpdCBhdCB0aGUgY2xpZW50IGVuZCB0byBzYXZlIHdhc3RpbmcKLSAgICAgICAgIyBjeWNsZXMgYW5kIG5ldHdvcmsgYmFuZHdpZHRoIQotICAgICAgICBsb2dnZXIuaGFuZGxlKHJlY29yZCkKLQotY2xhc3MgTG9nUmVjb3JkU29ja2V0UmVjZWl2ZXIoU29ja2V0U2VydmVyLlRocmVhZGluZ1RDUFNlcnZlcik6Ci0gICAgIiIic2ltcGxlIFRDUCBzb2NrZXQtYmFzZWQgbG9nZ2luZyByZWNlaXZlciBzdWl0YWJsZSBmb3IgdGVzdGluZy4KLSAgICAiIiIKLQotICAgIGFsbG93X3JldXNlX2FkZHJlc3MgPSAxCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdD0nbG9jYWxob3N0JywKLSAgICAgICAgICAgICAgICAgcG9ydD1sb2dnaW5nLmhhbmRsZXJzLkRFRkFVTFRfVENQX0xPR0dJTkdfUE9SVCwKLSAgICAgICAgICAgICAgICAgaGFuZGxlcj1Mb2dSZWNvcmRTdHJlYW1IYW5kbGVyKToKLSAgICAgICAgU29ja2V0U2VydmVyLlRocmVhZGluZ1RDUFNlcnZlci5fX2luaXRfXyhzZWxmLCAoaG9zdCwgcG9ydCksIGhhbmRsZXIpCi0gICAgICAgIHNlbGYuYWJvcnQgPSAwCi0gICAgICAgIHNlbGYudGltZW91dCA9IDEKLSAgICAgICAgc2VsZi5sb2duYW1lID0gTm9uZQotCi0gICAgZGVmIHNlcnZlX3VudGlsX3N0b3BwZWQoc2VsZik6Ci0gICAgICAgIGltcG9ydCBzZWxlY3QKLSAgICAgICAgYWJvcnQgPSAwCi0gICAgICAgIHdoaWxlIG5vdCBhYm9ydDoKLSAgICAgICAgICAgIHJkLCB3ciwgZXggPSBzZWxlY3Quc2VsZWN0KFtzZWxmLnNvY2tldC5maWxlbm8oKV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSwgW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRpbWVvdXQpCi0gICAgICAgICAgICBpZiByZDoKLSAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9yZXF1ZXN0KCkKLSAgICAgICAgICAgIGFib3J0ID0gc2VsZi5hYm9ydAotCi1kZWYgbWFpbigpOgotICAgIGxvZ2dpbmcuYmFzaWNDb25maWcoCi0gICAgICAgIGZvcm1hdD0iJShyZWxhdGl2ZUNyZWF0ZWQpNWQgJShuYW1lKS0xNXMgJShsZXZlbG5hbWUpLThzICUobWVzc2FnZSlzIikKLSAgICB0Y3BzZXJ2ZXIgPSBMb2dSZWNvcmRTb2NrZXRSZWNlaXZlcigpCi0gICAgcHJpbnQgIkFib3V0IHRvIHN0YXJ0IFRDUCBzZXJ2ZXIuLi4iCi0gICAgdGNwc2VydmVyLnNlcnZlX3VudGlsX3N0b3BwZWQoKQotCi1pZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIG1haW4oKQotXGVuZHt2ZXJiYXRpbX0KLQotRmlyc3QgcnVuIHRoZSBzZXJ2ZXIsIGFuZCB0aGVuIHRoZSBjbGllbnQuIE9uIHRoZSBjbGllbnQgc2lkZSwgbm90aGluZyBpcwotcHJpbnRlZCBvbiB0aGUgY29uc29sZTsgb24gdGhlIHNlcnZlciBzaWRlLCB5b3Ugc2hvdWxkIHNlZSBzb21ldGhpbmcgbGlrZToKLQotXGJlZ2lue3ZlcmJhdGltfQotQWJvdXQgdG8gc3RhcnQgVENQIHNlcnZlci4uLgotICAgNTkgcm9vdCAgICAgICAgICAgIElORk8gICAgIEphY2tkYXdzIGxvdmUgbXkgYmlnIHNwaGlueCBvZiBxdWFydHouCi0gICA1OSBteWFwcC5hcmVhMSAgICAgREVCVUcgICAgUXVpY2sgemVwaHlycyBibG93LCB2ZXhpbmcgZGFmdCBKaW0uCi0gICA2OSBteWFwcC5hcmVhMSAgICAgSU5GTyAgICAgSG93IHF1aWNrbHkgZGFmdCBqdW1waW5nIHplYnJhcyB2ZXguCi0gICA2OSBteWFwcC5hcmVhMiAgICAgV0FSTklORyAgSmFpbCB6ZXN0eSB2aXhlbiB3aG8gZ3JhYmJlZCBwYXkgZnJvbSBxdWFjay4KLSAgIDY5IG15YXBwLmFyZWEyICAgICBFUlJPUiAgICBUaGUgZml2ZSBib3hpbmcgd2l6YXJkcyBqdW1wIHF1aWNrbHkuCi1cZW5ke3ZlcmJhdGltfQotCi1cc3Vic2VjdGlvbntIYW5kbGVyIE9iamVjdHN9Ci0KLUhhbmRsZXJzIGhhdmUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFuZCBtZXRob2RzLiBOb3RlIHRoYXQKLVxjbGFzc3tIYW5kbGVyfSBpcyBuZXZlciBpbnN0YW50aWF0ZWQgZGlyZWN0bHk7IHRoaXMgY2xhc3MgYWN0cyBhcyBhCi1iYXNlIGZvciBtb3JlIHVzZWZ1bCBzdWJjbGFzc2VzLiBIb3dldmVyLCB0aGUgXG1ldGhvZHtfX2luaXRfXygpfQotbWV0aG9kIGluIHN1YmNsYXNzZXMgbmVlZHMgdG8gY2FsbCBcbWV0aG9ke0hhbmRsZXIuX19pbml0X18oKX0uCi0KLVxiZWdpbnttZXRob2RkZXNjfVtIYW5kbGVyXXtfX2luaXRfX317bGV2ZWw9XGNvbnN0YW50e05PVFNFVH19Ci1Jbml0aWFsaXplcyB0aGUgXGNsYXNze0hhbmRsZXJ9IGluc3RhbmNlIGJ5IHNldHRpbmcgaXRzIGxldmVsLCBzZXR0aW5nCi10aGUgbGlzdCBvZiBmaWx0ZXJzIHRvIHRoZSBlbXB0eSBsaXN0IGFuZCBjcmVhdGluZyBhIGxvY2sgKHVzaW5nCi1cbWV0aG9ke2NyZWF0ZUxvY2soKX0pIGZvciBzZXJpYWxpemluZyBhY2Nlc3MgdG8gYW4gSS9PIG1lY2hhbmlzbS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0hhbmRsZXJde2NyZWF0ZUxvY2t9e30KLUluaXRpYWxpemVzIGEgdGhyZWFkIGxvY2sgd2hpY2ggY2FuIGJlIHVzZWQgdG8gc2VyaWFsaXplIGFjY2VzcyB0bwotdW5kZXJseWluZyBJL08gZnVuY3Rpb25hbGl0eSB3aGljaCBtYXkgbm90IGJlIHRocmVhZHNhZmUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtIYW5kbGVyXXthY3F1aXJlfXt9Ci1BY3F1aXJlcyB0aGUgdGhyZWFkIGxvY2sgY3JlYXRlZCB3aXRoIFxtZXRob2R7Y3JlYXRlTG9jaygpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0hhbmRsZXJde3JlbGVhc2V9e30KLVJlbGVhc2VzIHRoZSB0aHJlYWQgbG9jayBhY3F1aXJlZCB3aXRoIFxtZXRob2R7YWNxdWlyZSgpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0hhbmRsZXJde3NldExldmVsfXtsdmx9Ci1TZXRzIHRoZSB0aHJlc2hvbGQgZm9yIHRoaXMgaGFuZGxlciB0byBcdmFye2x2bH0uIExvZ2dpbmcgbWVzc2FnZXMgd2hpY2ggYXJlCi1sZXNzIHNldmVyZSB0aGFuIFx2YXJ7bHZsfSB3aWxsIGJlIGlnbm9yZWQuIFdoZW4gYSBoYW5kbGVyIGlzIGNyZWF0ZWQsIHRoZQotbGV2ZWwgaXMgc2V0IHRvIFxjb25zdGFudHtOT1RTRVR9ICh3aGljaCBjYXVzZXMgYWxsIG1lc3NhZ2VzIHRvIGJlIHByb2Nlc3NlZCkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtIYW5kbGVyXXtzZXRGb3JtYXR0ZXJ9e2Zvcm19Ci1TZXRzIHRoZSBcY2xhc3N7Rm9ybWF0dGVyfSBmb3IgdGhpcyBoYW5kbGVyIHRvIFx2YXJ7Zm9ybX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtIYW5kbGVyXXthZGRGaWx0ZXJ9e2ZpbHR9Ci1BZGRzIHRoZSBzcGVjaWZpZWQgZmlsdGVyIFx2YXJ7ZmlsdH0gdG8gdGhpcyBoYW5kbGVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSGFuZGxlcl17cmVtb3ZlRmlsdGVyfXtmaWx0fQotUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGZpbHRlciBcdmFye2ZpbHR9IGZyb20gdGhpcyBoYW5kbGVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSGFuZGxlcl17ZmlsdGVyfXtyZWNvcmR9Ci1BcHBsaWVzIHRoaXMgaGFuZGxlcidzIGZpbHRlcnMgdG8gdGhlIHJlY29yZCBhbmQgcmV0dXJucyBhIHRydWUgdmFsdWUgaWYKLXRoZSByZWNvcmQgaXMgdG8gYmUgcHJvY2Vzc2VkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSGFuZGxlcl17Zmx1c2h9e30KLUVuc3VyZSBhbGwgbG9nZ2luZyBvdXRwdXQgaGFzIGJlZW4gZmx1c2hlZC4gVGhpcyB2ZXJzaW9uIGRvZXMKLW5vdGhpbmcgYW5kIGlzIGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtIYW5kbGVyXXtjbG9zZX17fQotVGlkeSB1cCBhbnkgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIGhhbmRsZXIuIFRoaXMgdmVyc2lvbiBkb2VzCi1ub3RoaW5nIGFuZCBpcyBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSGFuZGxlcl17aGFuZGxlfXtyZWNvcmR9Ci1Db25kaXRpb25hbGx5IGVtaXRzIHRoZSBzcGVjaWZpZWQgbG9nZ2luZyByZWNvcmQsIGRlcGVuZGluZyBvbgotZmlsdGVycyB3aGljaCBtYXkgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBoYW5kbGVyLiBXcmFwcyB0aGUgYWN0dWFsCi1lbWlzc2lvbiBvZiB0aGUgcmVjb3JkIHdpdGggYWNxdWlzaXRpb24vcmVsZWFzZSBvZiB0aGUgSS9PIHRocmVhZAotbG9jay4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0hhbmRsZXJde2hhbmRsZUVycm9yfXtyZWNvcmR9Ci1UaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGZyb20gaGFuZGxlcnMgd2hlbiBhbiBleGNlcHRpb24gaXMKLWVuY291bnRlcmVkIGR1cmluZyBhbiBcbWV0aG9ke2VtaXQoKX0gY2FsbC4gQnkgZGVmYXVsdCBpdCBkb2VzIG5vdGhpbmcsCi13aGljaCBtZWFucyB0aGF0IGV4Y2VwdGlvbnMgZ2V0IHNpbGVudGx5IGlnbm9yZWQuIFRoaXMgaXMgd2hhdCBpcwotbW9zdGx5IHdhbnRlZCBmb3IgYSBsb2dnaW5nIHN5c3RlbSAtIG1vc3QgdXNlcnMgd2lsbCBub3QgY2FyZQotYWJvdXQgZXJyb3JzIGluIHRoZSBsb2dnaW5nIHN5c3RlbSwgdGhleSBhcmUgbW9yZSBpbnRlcmVzdGVkIGluCi1hcHBsaWNhdGlvbiBlcnJvcnMuIFlvdSBjb3VsZCwgaG93ZXZlciwgcmVwbGFjZSB0aGlzIHdpdGggYSBjdXN0b20KLWhhbmRsZXIgaWYgeW91IHdpc2guIFRoZSBzcGVjaWZpZWQgcmVjb3JkIGlzIHRoZSBvbmUgd2hpY2ggd2FzIGJlaW5nCi1wcm9jZXNzZWQgd2hlbiB0aGUgZXhjZXB0aW9uIG9jY3VycmVkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSGFuZGxlcl17Zm9ybWF0fXtyZWNvcmR9Ci1EbyBmb3JtYXR0aW5nIGZvciBhIHJlY29yZCAtIGlmIGEgZm9ybWF0dGVyIGlzIHNldCwgdXNlIGl0LgotT3RoZXJ3aXNlLCB1c2UgdGhlIGRlZmF1bHQgZm9ybWF0dGVyIGZvciB0aGUgbW9kdWxlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSGFuZGxlcl17ZW1pdH17cmVjb3JkfQotRG8gd2hhdGV2ZXIgaXQgdGFrZXMgdG8gYWN0dWFsbHkgbG9nIHRoZSBzcGVjaWZpZWQgbG9nZ2luZyByZWNvcmQuCi1UaGlzIHZlcnNpb24gaXMgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyBhbmQgc28KLXJhaXNlcyBhIFxleGNlcHRpb257Tm90SW1wbGVtZW50ZWRFcnJvcn0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxzdWJzdWJzZWN0aW9ue1N0cmVhbUhhbmRsZXJ9Ci0KLVRoZSBcY2xhc3N7U3RyZWFtSGFuZGxlcn0gY2xhc3MsIGxvY2F0ZWQgaW4gdGhlIGNvcmUgXG1vZHVsZXtsb2dnaW5nfQotcGFja2FnZSwgc2VuZHMgbG9nZ2luZyBvdXRwdXQgdG8gc3RyZWFtcyBzdWNoIGFzIFx2YXJ7c3lzLnN0ZG91dH0sCi1cdmFye3N5cy5zdGRlcnJ9IG9yIGFueSBmaWxlLWxpa2Ugb2JqZWN0IChvciwgbW9yZSBwcmVjaXNlbHksIGFueQotb2JqZWN0IHdoaWNoIHN1cHBvcnRzIFxtZXRob2R7d3JpdGUoKX0gYW5kIFxtZXRob2R7Zmx1c2goKX0gbWV0aG9kcykuCi0KLVxiZWdpbntjbGFzc2Rlc2N9e1N0cmVhbUhhbmRsZXJ9e1xvcHRpb25hbHtzdHJtfX0KLVJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFxjbGFzc3tTdHJlYW1IYW5kbGVyfSBjbGFzcy4gSWYgXHZhcntzdHJtfSBpcwotc3BlY2lmaWVkLCB0aGUgaW5zdGFuY2Ugd2lsbCB1c2UgaXQgZm9yIGxvZ2dpbmcgb3V0cHV0OyBvdGhlcndpc2UsCi1cdmFye3N5cy5zdGRlcnJ9IHdpbGwgYmUgdXNlZC4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317ZW1pdH17cmVjb3JkfQotSWYgYSBmb3JtYXR0ZXIgaXMgc3BlY2lmaWVkLCBpdCBpcyB1c2VkIHRvIGZvcm1hdCB0aGUgcmVjb3JkLgotVGhlIHJlY29yZCBpcyB0aGVuIHdyaXR0ZW4gdG8gdGhlIHN0cmVhbSB3aXRoIGEgdHJhaWxpbmcgbmV3bGluZS4KLUlmIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbiBpcyBwcmVzZW50LCBpdCBpcyBmb3JtYXR0ZWQgdXNpbmcKLVxmdW5jdGlvbnt0cmFjZWJhY2sucHJpbnRfZXhjZXB0aW9uKCl9IGFuZCBhcHBlbmRlZCB0byB0aGUgc3RyZWFtLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Zmx1c2h9e30KLUZsdXNoZXMgdGhlIHN0cmVhbSBieSBjYWxsaW5nIGl0cyBcbWV0aG9ke2ZsdXNoKCl9IG1ldGhvZC4gTm90ZSB0aGF0Ci10aGUgXG1ldGhvZHtjbG9zZSgpfSBtZXRob2QgaXMgaW5oZXJpdGVkIGZyb20gXGNsYXNze0hhbmRsZXJ9IGFuZAotc28gZG9lcyBub3RoaW5nLCBzbyBhbiBleHBsaWNpdCBcbWV0aG9ke2ZsdXNoKCl9IGNhbGwgbWF5IGJlIG5lZWRlZAotYXQgdGltZXMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxzdWJzdWJzZWN0aW9ue0ZpbGVIYW5kbGVyfQotCi1UaGUgXGNsYXNze0ZpbGVIYW5kbGVyfSBjbGFzcywgbG9jYXRlZCBpbiB0aGUgY29yZSBcbW9kdWxle2xvZ2dpbmd9Ci1wYWNrYWdlLCBzZW5kcyBsb2dnaW5nIG91dHB1dCB0byBhIGRpc2sgZmlsZS4gIEl0IGluaGVyaXRzIHRoZSBvdXRwdXQKLWZ1bmN0aW9uYWxpdHkgZnJvbSBcY2xhc3N7U3RyZWFtSGFuZGxlcn0uCi0KLVxiZWdpbntjbGFzc2Rlc2N9e0ZpbGVIYW5kbGVyfXtmaWxlbmFtZVxvcHRpb25hbHssIG1vZGVcb3B0aW9uYWx7LCBlbmNvZGluZ319fQotUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgXGNsYXNze0ZpbGVIYW5kbGVyfSBjbGFzcy4gVGhlIHNwZWNpZmllZAotZmlsZSBpcyBvcGVuZWQgYW5kIHVzZWQgYXMgdGhlIHN0cmVhbSBmb3IgbG9nZ2luZy4gSWYgXHZhcnttb2RlfSBpcwotbm90IHNwZWNpZmllZCwgXGNvbnN0YW50eydhJ30gaXMgdXNlZC4gIElmIFx2YXJ7ZW5jb2Rpbmd9IGlzIG5vdCBcdmFye05vbmV9LAotaXQgaXMgdXNlZCB0byBvcGVuIHRoZSBmaWxlIHdpdGggdGhhdCBlbmNvZGluZy4gIEJ5IGRlZmF1bHQsIHRoZSBmaWxlIGdyb3dzCi1pbmRlZmluaXRlbHkuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2Nsb3NlfXt9Ci1DbG9zZXMgdGhlIGZpbGUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtlbWl0fXtyZWNvcmR9Ci1PdXRwdXRzIHRoZSByZWNvcmQgdG8gdGhlIGZpbGUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxzdWJzdWJzZWN0aW9ue1dhdGNoZWRGaWxlSGFuZGxlcn0KLQotXHZlcnNpb25hZGRlZHsyLjZ9Ci1UaGUgXGNsYXNze1dhdGNoZWRGaWxlSGFuZGxlcn0gY2xhc3MsIGxvY2F0ZWQgaW4gdGhlIFxtb2R1bGV7bG9nZ2luZy5oYW5kbGVyc30KLW1vZHVsZSwgaXMgYSBcY2xhc3N7RmlsZUhhbmRsZXJ9IHdoaWNoIHdhdGNoZXMgdGhlIGZpbGUgaXQgaXMgbG9nZ2luZyB0by4KLUlmIHRoZSBmaWxlIGNoYW5nZXMsIGl0IGlzIGNsb3NlZCBhbmQgcmVvcGVuZWQgdXNpbmcgdGhlIGZpbGUgbmFtZS4KLQotQSBmaWxlIGNoYW5nZSBjYW4gaGFwcGVuIGJlY2F1c2Ugb2YgdXNhZ2Ugb2YgcHJvZ3JhbXMgc3VjaCBhcyBcdmFye25ld3N5c2xvZ30KLWFuZCBcdmFye2xvZ3JvdGF0ZX0gd2hpY2ggcGVyZm9ybSBsb2cgZmlsZSByb3RhdGlvbi4gVGhpcyBoYW5kbGVyLCBpbnRlbmRlZAotZm9yIHVzZSB1bmRlciBVbml4L0xpbnV4LCB3YXRjaGVzIHRoZSBmaWxlIHRvIHNlZSBpZiBpdCBoYXMgY2hhbmdlZCBzaW5jZSB0aGUKLWxhc3QgZW1pdC4gKEEgZmlsZSBpcyBkZWVtZWQgdG8gaGF2ZSBjaGFuZ2VkIGlmIGl0cyBkZXZpY2Ugb3IgaW5vZGUgaGF2ZQotY2hhbmdlZC4pIElmIHRoZSBmaWxlIGhhcyBjaGFuZ2VkLCB0aGUgb2xkIGZpbGUgc3RyZWFtIGlzIGNsb3NlZCwgYW5kIHRoZSBmaWxlCi1vcGVuZWQgdG8gZ2V0IGEgbmV3IHN0cmVhbS4KLQotVGhpcyBoYW5kbGVyIGlzIG5vdCBhcHByb3ByaWF0ZSBmb3IgdXNlIHVuZGVyIFdpbmRvd3MsIGJlY2F1c2UgdW5kZXIgV2luZG93cwotb3BlbiBsb2cgZmlsZXMgY2Fubm90IGJlIG1vdmVkIG9yIHJlbmFtZWQgLSBsb2dnaW5nIG9wZW5zIHRoZSBmaWxlcyB3aXRoCi1leGNsdXNpdmUgbG9ja3MgLSBhbmQgc28gdGhlcmUgaXMgbm8gbmVlZCBmb3Igc3VjaCBhIGhhbmRsZXIuIEZ1cnRoZXJtb3JlLAotXHZhcntTVF9JTk99IGlzIG5vdCBzdXBwb3J0ZWQgdW5kZXIgV2luZG93czsgXGZ1bmN0aW9ue3N0YXQoKX0gYWx3YXlzIHJldHVybnMKLXplcm8gZm9yIHRoaXMgdmFsdWUuCi0KLVxiZWdpbntjbGFzc2Rlc2N9e1dhdGNoZWRGaWxlSGFuZGxlcn17ZmlsZW5hbWVcb3B0aW9uYWx7LG1vZGVcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ319fQotUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgXGNsYXNze1dhdGNoZWRGaWxlSGFuZGxlcn0gY2xhc3MuIFRoZSBzcGVjaWZpZWQKLWZpbGUgaXMgb3BlbmVkIGFuZCB1c2VkIGFzIHRoZSBzdHJlYW0gZm9yIGxvZ2dpbmcuIElmIFx2YXJ7bW9kZX0gaXMKLW5vdCBzcGVjaWZpZWQsIFxjb25zdGFudHsnYSd9IGlzIHVzZWQuICBJZiBcdmFye2VuY29kaW5nfSBpcyBub3QgXHZhcntOb25lfSwKLWl0IGlzIHVzZWQgdG8gb3BlbiB0aGUgZmlsZSB3aXRoIHRoYXQgZW5jb2RpbmcuICBCeSBkZWZhdWx0LCB0aGUgZmlsZSBncm93cwotaW5kZWZpbml0ZWx5LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtlbWl0fXtyZWNvcmR9Ci1PdXRwdXRzIHRoZSByZWNvcmQgdG8gdGhlIGZpbGUsIGJ1dCBmaXJzdCBjaGVja3MgdG8gc2VlIGlmIHRoZSBmaWxlIGhhcwotY2hhbmdlZC4gSWYgaXQgaGFzLCB0aGUgZXhpc3Rpbmcgc3RyZWFtIGlzIGZsdXNoZWQgYW5kIGNsb3NlZCBhbmQgdGhlIGZpbGUKLW9wZW5lZCBhZ2FpbiwgYmVmb3JlIG91dHB1dHRpbmcgdGhlIHJlY29yZCB0byB0aGUgZmlsZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXHN1YnN1YnNlY3Rpb257Um90YXRpbmdGaWxlSGFuZGxlcn0KLQotVGhlIFxjbGFzc3tSb3RhdGluZ0ZpbGVIYW5kbGVyfSBjbGFzcywgbG9jYXRlZCBpbiB0aGUgXG1vZHVsZXtsb2dnaW5nLmhhbmRsZXJzfQotbW9kdWxlLCBzdXBwb3J0cyByb3RhdGlvbiBvZiBkaXNrIGxvZyBmaWxlcy4KLQotXGJlZ2lue2NsYXNzZGVzY317Um90YXRpbmdGaWxlSGFuZGxlcn17ZmlsZW5hbWVcb3B0aW9uYWx7LCBtb2RlXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJ5dGVzXG9wdGlvbmFseywgYmFja3VwQ291bnR9fX19Ci1SZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBcY2xhc3N7Um90YXRpbmdGaWxlSGFuZGxlcn0gY2xhc3MuIFRoZQotc3BlY2lmaWVkIGZpbGUgaXMgb3BlbmVkIGFuZCB1c2VkIGFzIHRoZSBzdHJlYW0gZm9yIGxvZ2dpbmcuIElmCi1cdmFye21vZGV9IGlzIG5vdCBzcGVjaWZpZWQsIFxjb2RleydhJ30gaXMgdXNlZC4gQnkgZGVmYXVsdCwgdGhlCi1maWxlIGdyb3dzIGluZGVmaW5pdGVseS4KLQotWW91IGNhbiB1c2UgdGhlIFx2YXJ7bWF4Qnl0ZXN9IGFuZAotXHZhcntiYWNrdXBDb3VudH0gdmFsdWVzIHRvIGFsbG93IHRoZSBmaWxlIHRvIFxkZm57cm9sbG92ZXJ9IGF0IGEKLXByZWRldGVybWluZWQgc2l6ZS4gV2hlbiB0aGUgc2l6ZSBpcyBhYm91dCB0byBiZSBleGNlZWRlZCwgdGhlIGZpbGUgaXMKLWNsb3NlZCBhbmQgYSBuZXcgZmlsZSBpcyBzaWxlbnRseSBvcGVuZWQgZm9yIG91dHB1dC4gUm9sbG92ZXIgb2NjdXJzCi13aGVuZXZlciB0aGUgY3VycmVudCBsb2cgZmlsZSBpcyBuZWFybHkgXHZhcnttYXhCeXRlc30gaW4gbGVuZ3RoOyBpZgotXHZhcnttYXhCeXRlc30gaXMgemVybywgcm9sbG92ZXIgbmV2ZXIgb2NjdXJzLiAgSWYgXHZhcntiYWNrdXBDb3VudH0KLWlzIG5vbi16ZXJvLCB0aGUgc3lzdGVtIHdpbGwgc2F2ZSBvbGQgbG9nIGZpbGVzIGJ5IGFwcGVuZGluZyB0aGUKLWV4dGVuc2lvbnMgIi4xIiwgIi4yIiBldGMuLCB0byB0aGUgZmlsZW5hbWUuIEZvciBleGFtcGxlLCB3aXRoCi1hIFx2YXJ7YmFja3VwQ291bnR9IG9mIDUgYW5kIGEgYmFzZSBmaWxlIG5hbWUgb2YKLVxmaWxle2FwcC5sb2d9LCB5b3Ugd291bGQgZ2V0IFxmaWxle2FwcC5sb2d9LAotXGZpbGV7YXBwLmxvZy4xfSwgXGZpbGV7YXBwLmxvZy4yfSwgdXAgdG8gXGZpbGV7YXBwLmxvZy41fS4gVGhlIGZpbGUgYmVpbmcKLXdyaXR0ZW4gdG8gaXMgYWx3YXlzIFxmaWxle2FwcC5sb2d9LiAgV2hlbiB0aGlzIGZpbGUgaXMgZmlsbGVkLCBpdCBpcwotY2xvc2VkIGFuZCByZW5hbWVkIHRvIFxmaWxle2FwcC5sb2cuMX0sIGFuZCBpZiBmaWxlcyBcZmlsZXthcHAubG9nLjF9LAotXGZpbGV7YXBwLmxvZy4yfSwgZXRjLiAgZXhpc3QsIHRoZW4gdGhleSBhcmUgcmVuYW1lZCB0byBcZmlsZXthcHAubG9nLjJ9LAotXGZpbGV7YXBwLmxvZy4zfSBldGMuICByZXNwZWN0aXZlbHkuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2RvUm9sbG92ZXJ9e30KLURvZXMgYSByb2xsb3ZlciwgYXMgZGVzY3JpYmVkIGFib3ZlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317ZW1pdH17cmVjb3JkfQotT3V0cHV0cyB0aGUgcmVjb3JkIHRvIHRoZSBmaWxlLCBjYXRlcmluZyBmb3Igcm9sbG92ZXIgYXMgZGVzY3JpYmVkIHByZXZpb3VzbHkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxzdWJzdWJzZWN0aW9ue1RpbWVkUm90YXRpbmdGaWxlSGFuZGxlcn0KLQotVGhlIFxjbGFzc3tUaW1lZFJvdGF0aW5nRmlsZUhhbmRsZXJ9IGNsYXNzLCBsb2NhdGVkIGluIHRoZQotXG1vZHVsZXtsb2dnaW5nLmhhbmRsZXJzfSBtb2R1bGUsIHN1cHBvcnRzIHJvdGF0aW9uIG9mIGRpc2sgbG9nIGZpbGVzCi1hdCBjZXJ0YWluIHRpbWVkIGludGVydmFscy4KLQotXGJlZ2lue2NsYXNzZGVzY317VGltZWRSb3RhdGluZ0ZpbGVIYW5kbGVyfXtmaWxlbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcb3B0aW9uYWx7LHdoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG9wdGlvbmFseyxpbnRlcnZhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcb3B0aW9uYWx7LGJhY2t1cENvdW50fX19fQotCi1SZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBcY2xhc3N7VGltZWRSb3RhdGluZ0ZpbGVIYW5kbGVyfSBjbGFzcy4gVGhlCi1zcGVjaWZpZWQgZmlsZSBpcyBvcGVuZWQgYW5kIHVzZWQgYXMgdGhlIHN0cmVhbSBmb3IgbG9nZ2luZy4gT24gcm90YXRpbmcKLWl0IGFsc28gc2V0cyB0aGUgZmlsZW5hbWUgc3VmZml4LiBSb3RhdGluZyBoYXBwZW5zIGJhc2VkIG9uIHRoZSBwcm9kdWN0Ci1vZiBcdmFye3doZW59IGFuZCBcdmFye2ludGVydmFsfS4KLQotWW91IGNhbiB1c2UgdGhlIFx2YXJ7d2hlbn0gdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiBcdmFye2ludGVydmFsfS4gVGhlCi1saXN0IG9mIHBvc3NpYmxlIHZhbHVlcyBpcywgbm90ZSB0aGF0IHRoZXkgYXJlIG5vdCBjYXNlIHNlbnNpdGl2ZToKLQotXGJlZ2lue3RhYmxlaWl9e2x8bH17fXtWYWx1ZX17VHlwZSBvZiBpbnRlcnZhbH0KLSAgXGxpbmVpaXtTfXtTZWNvbmRzfQotICBcbGluZWlpe019e01pbnV0ZXN9Ci0gIFxsaW5laWl7SH17SG91cnN9Ci0gIFxsaW5laWl7RH17RGF5c30KLSAgXGxpbmVpaXtXfXtXZWVrIGRheSAoMD1Nb25kYXkpfQotICBcbGluZWlpe21pZG5pZ2h0fXtSb2xsIG92ZXIgYXQgbWlkbmlnaHR9Ci1cZW5ke3RhYmxlaWl9Ci0KLUlmIFx2YXJ7YmFja3VwQ291bnR9IGlzIG5vbi16ZXJvLCB0aGUgc3lzdGVtIHdpbGwgc2F2ZSBvbGQgbG9nIGZpbGVzIGJ5Ci1hcHBlbmRpbmcgZXh0ZW5zaW9ucyB0byB0aGUgZmlsZW5hbWUuIFRoZSBleHRlbnNpb25zIGFyZSBkYXRlLWFuZC10aW1lCi1iYXNlZCwgdXNpbmcgdGhlIHN0cmZ0aW1lIGZvcm1hdCBcY29kZXtcJVktXCVtLVwlZF9cJUgtXCVNLVwlU30gb3IgYSBsZWFkaW5nCi1wb3J0aW9uIHRoZXJlb2YsIGRlcGVuZGluZyBvbiB0aGUgcm9sbG92ZXIgaW50ZXJ2YWwuIEF0IG1vc3QgXHZhcntiYWNrdXBDb3VudH0KLWZpbGVzIHdpbGwgYmUga2VwdCwgYW5kIGlmIG1vcmUgd291bGQgYmUgY3JlYXRlZCB3aGVuIHJvbGxvdmVyIG9jY3VycywgdGhlCi1vbGRlc3Qgb25lIGlzIGRlbGV0ZWQuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2RvUm9sbG92ZXJ9e30KLURvZXMgYSByb2xsb3ZlciwgYXMgZGVzY3JpYmVkIGFib3ZlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317ZW1pdH17cmVjb3JkfQotT3V0cHV0cyB0aGUgcmVjb3JkIHRvIHRoZSBmaWxlLCBjYXRlcmluZyBmb3Igcm9sbG92ZXIgYXMgZGVzY3JpYmVkCi1hYm92ZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXHN1YnN1YnNlY3Rpb257U29ja2V0SGFuZGxlcn0KLQotVGhlIFxjbGFzc3tTb2NrZXRIYW5kbGVyfSBjbGFzcywgbG9jYXRlZCBpbiB0aGUKLVxtb2R1bGV7bG9nZ2luZy5oYW5kbGVyc30gbW9kdWxlLCBzZW5kcyBsb2dnaW5nIG91dHB1dCB0byBhIG5ldHdvcmsKLXNvY2tldC4gVGhlIGJhc2UgY2xhc3MgdXNlcyBhIFRDUCBzb2NrZXQuCi0KLVxiZWdpbntjbGFzc2Rlc2N9e1NvY2tldEhhbmRsZXJ9e2hvc3QsIHBvcnR9Ci1SZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBcY2xhc3N7U29ja2V0SGFuZGxlcn0gY2xhc3MgaW50ZW5kZWQgdG8KLWNvbW11bmljYXRlIHdpdGggYSByZW1vdGUgbWFjaGluZSB3aG9zZSBhZGRyZXNzIGlzIGdpdmVuIGJ5IFx2YXJ7aG9zdH0KLWFuZCBcdmFye3BvcnR9LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtjbG9zZX17fQotQ2xvc2VzIHRoZSBzb2NrZXQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtlbWl0fXt9Ci1QaWNrbGVzIHRoZSByZWNvcmQncyBhdHRyaWJ1dGUgZGljdGlvbmFyeSBhbmQgd3JpdGVzIGl0IHRvIHRoZSBzb2NrZXQgaW4KLWJpbmFyeSBmb3JtYXQuIElmIHRoZXJlIGlzIGFuIGVycm9yIHdpdGggdGhlIHNvY2tldCwgc2lsZW50bHkgZHJvcHMgdGhlCi1wYWNrZXQuIElmIHRoZSBjb25uZWN0aW9uIHdhcyBwcmV2aW91c2x5IGxvc3QsIHJlLWVzdGFibGlzaGVzIHRoZSBjb25uZWN0aW9uLgotVG8gdW5waWNrbGUgdGhlIHJlY29yZCBhdCB0aGUgcmVjZWl2aW5nIGVuZCBpbnRvIGEgXGNsYXNze0xvZ1JlY29yZH0sIHVzZSB0aGUKLVxmdW5jdGlvbnttYWtlTG9nUmVjb3JkKCl9IGZ1bmN0aW9uLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317aGFuZGxlRXJyb3J9e30KLUhhbmRsZXMgYW4gZXJyb3Igd2hpY2ggaGFzIG9jY3VycmVkIGR1cmluZyBcbWV0aG9ke2VtaXQoKX0uIFRoZQotbW9zdCBsaWtlbHkgY2F1c2UgaXMgYSBsb3N0IGNvbm5lY3Rpb24uIENsb3NlcyB0aGUgc29ja2V0IHNvIHRoYXQKLXdlIGNhbiByZXRyeSBvbiB0aGUgbmV4dCBldmVudC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e21ha2VTb2NrZXR9e30KLVRoaXMgaXMgYSBmYWN0b3J5IG1ldGhvZCB3aGljaCBhbGxvd3Mgc3ViY2xhc3NlcyB0byBkZWZpbmUgdGhlIHByZWNpc2UKLXR5cGUgb2Ygc29ja2V0IHRoZXkgd2FudC4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY3JlYXRlcyBhIFRDUAotc29ja2V0IChcY29uc3RhbnR7c29ja2V0LlNPQ0tfU1RSRUFNfSkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXttYWtlUGlja2xlfXtyZWNvcmR9Ci1QaWNrbGVzIHRoZSByZWNvcmQncyBhdHRyaWJ1dGUgZGljdGlvbmFyeSBpbiBiaW5hcnkgZm9ybWF0IHdpdGggYSBsZW5ndGgKLXByZWZpeCwgYW5kIHJldHVybnMgaXQgcmVhZHkgZm9yIHRyYW5zbWlzc2lvbiBhY3Jvc3MgdGhlIHNvY2tldC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3NlbmR9e3BhY2tldH0KLVNlbmQgYSBwaWNrbGVkIHN0cmluZyBcdmFye3BhY2tldH0gdG8gdGhlIHNvY2tldC4gVGhpcyBmdW5jdGlvbiBhbGxvd3MKLWZvciBwYXJ0aWFsIHNlbmRzIHdoaWNoIGNhbiBoYXBwZW4gd2hlbiB0aGUgbmV0d29yayBpcyBidXN5LgotXGVuZHttZXRob2RkZXNjfQotCi1cc3Vic3Vic2VjdGlvbntEYXRhZ3JhbUhhbmRsZXJ9Ci0KLVRoZSBcY2xhc3N7RGF0YWdyYW1IYW5kbGVyfSBjbGFzcywgbG9jYXRlZCBpbiB0aGUKLVxtb2R1bGV7bG9nZ2luZy5oYW5kbGVyc30gbW9kdWxlLCBpbmhlcml0cyBmcm9tIFxjbGFzc3tTb2NrZXRIYW5kbGVyfQotdG8gc3VwcG9ydCBzZW5kaW5nIGxvZ2dpbmcgbWVzc2FnZXMgb3ZlciBVRFAgc29ja2V0cy4KLQotXGJlZ2lue2NsYXNzZGVzY317RGF0YWdyYW1IYW5kbGVyfXtob3N0LCBwb3J0fQotUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgXGNsYXNze0RhdGFncmFtSGFuZGxlcn0gY2xhc3MgaW50ZW5kZWQgdG8KLWNvbW11bmljYXRlIHdpdGggYSByZW1vdGUgbWFjaGluZSB3aG9zZSBhZGRyZXNzIGlzIGdpdmVuIGJ5IFx2YXJ7aG9zdH0KLWFuZCBcdmFye3BvcnR9LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtlbWl0fXt9Ci1QaWNrbGVzIHRoZSByZWNvcmQncyBhdHRyaWJ1dGUgZGljdGlvbmFyeSBhbmQgd3JpdGVzIGl0IHRvIHRoZSBzb2NrZXQgaW4KLWJpbmFyeSBmb3JtYXQuIElmIHRoZXJlIGlzIGFuIGVycm9yIHdpdGggdGhlIHNvY2tldCwgc2lsZW50bHkgZHJvcHMgdGhlCi1wYWNrZXQuCi1UbyB1bnBpY2tsZSB0aGUgcmVjb3JkIGF0IHRoZSByZWNlaXZpbmcgZW5kIGludG8gYSBcY2xhc3N7TG9nUmVjb3JkfSwgdXNlIHRoZQotXGZ1bmN0aW9ue21ha2VMb2dSZWNvcmQoKX0gZnVuY3Rpb24uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXttYWtlU29ja2V0fXt9Ci1UaGUgZmFjdG9yeSBtZXRob2Qgb2YgXGNsYXNze1NvY2tldEhhbmRsZXJ9IGlzIGhlcmUgb3ZlcnJpZGRlbiB0byBjcmVhdGUKLWEgVURQIHNvY2tldCAoXGNvbnN0YW50e3NvY2tldC5TT0NLX0RHUkFNfSkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtzZW5kfXtzfQotU2VuZCBhIHBpY2tsZWQgc3RyaW5nIHRvIGEgc29ja2V0LgotXGVuZHttZXRob2RkZXNjfQotCi1cc3Vic3Vic2VjdGlvbntTeXNMb2dIYW5kbGVyfQotCi1UaGUgXGNsYXNze1N5c0xvZ0hhbmRsZXJ9IGNsYXNzLCBsb2NhdGVkIGluIHRoZQotXG1vZHVsZXtsb2dnaW5nLmhhbmRsZXJzfSBtb2R1bGUsIHN1cHBvcnRzIHNlbmRpbmcgbG9nZ2luZyBtZXNzYWdlcyB0bwotYSByZW1vdGUgb3IgbG9jYWwgXFVOSVh7fSBzeXNsb2cuCi0KLVxiZWdpbntjbGFzc2Rlc2N9e1N5c0xvZ0hhbmRsZXJ9e1xvcHRpb25hbHthZGRyZXNzXG9wdGlvbmFseywgZmFjaWxpdHl9fX0KLVJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFxjbGFzc3tTeXNMb2dIYW5kbGVyfSBjbGFzcyBpbnRlbmRlZCB0bwotY29tbXVuaWNhdGUgd2l0aCBhIHJlbW90ZSBcVU5JWHt9IG1hY2hpbmUgd2hvc2UgYWRkcmVzcyBpcyBnaXZlbiBieQotXHZhcnthZGRyZXNzfSBpbiB0aGUgZm9ybSBvZiBhIFxjb2RleyhcdmFye2hvc3R9LCBcdmFye3BvcnR9KX0KLXR1cGxlLiAgSWYgXHZhcnthZGRyZXNzfSBpcyBub3Qgc3BlY2lmaWVkLCBcY29kZXsoJ2xvY2FsaG9zdCcsIDUxNCl9IGlzCi11c2VkLiAgVGhlIGFkZHJlc3MgaXMgdXNlZCB0byBvcGVuIGEgVURQIHNvY2tldC4gIEFuIGFsdGVybmF0aXZlIHRvIHByb3ZpZGluZwotYSBcY29kZXsoXHZhcntob3N0fSwgXHZhcntwb3J0fSl9IHR1cGxlIGlzIHByb3ZpZGluZyBhbiBhZGRyZXNzIGFzIGEgc3RyaW5nLAotZm9yIGV4YW1wbGUgIi9kZXYvbG9nIi4gSW4gdGhpcyBjYXNlLCBhIFVuaXggZG9tYWluIHNvY2tldCBpcyB1c2VkIHRvIHNlbmQKLXRoZSBtZXNzYWdlIHRvIHRoZSBzeXNsb2cuIElmIFx2YXJ7ZmFjaWxpdHl9IGlzIG5vdCBzcGVjaWZpZWQsCi1cY29uc3RhbnR7TE9HX1VTRVJ9IGlzIHVzZWQuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2Nsb3NlfXt9Ci1DbG9zZXMgdGhlIHNvY2tldCB0byB0aGUgcmVtb3RlIGhvc3QuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtlbWl0fXtyZWNvcmR9Ci1UaGUgcmVjb3JkIGlzIGZvcm1hdHRlZCwgYW5kIHRoZW4gc2VudCB0byB0aGUgc3lzbG9nIHNlcnZlci4gSWYKLWV4Y2VwdGlvbiBpbmZvcm1hdGlvbiBpcyBwcmVzZW50LCBpdCBpcyBcZW1waHtub3R9IHNlbnQgdG8gdGhlIHNlcnZlci4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2VuY29kZVByaW9yaXR5fXtmYWNpbGl0eSwgcHJpb3JpdHl9Ci1FbmNvZGVzIHRoZSBmYWNpbGl0eSBhbmQgcHJpb3JpdHkgaW50byBhbiBpbnRlZ2VyLiBZb3UgY2FuIHBhc3MgaW4gc3RyaW5ncwotb3IgaW50ZWdlcnMgLSBpZiBzdHJpbmdzIGFyZSBwYXNzZWQsIGludGVybmFsIG1hcHBpbmcgZGljdGlvbmFyaWVzIGFyZSB1c2VkCi10byBjb252ZXJ0IHRoZW0gdG8gaW50ZWdlcnMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxzdWJzdWJzZWN0aW9ue05URXZlbnRMb2dIYW5kbGVyfQotCi1UaGUgXGNsYXNze05URXZlbnRMb2dIYW5kbGVyfSBjbGFzcywgbG9jYXRlZCBpbiB0aGUKLVxtb2R1bGV7bG9nZ2luZy5oYW5kbGVyc30gbW9kdWxlLCBzdXBwb3J0cyBzZW5kaW5nIGxvZ2dpbmcgbWVzc2FnZXMgdG8KLWEgbG9jYWwgV2luZG93cyBOVCwgV2luZG93cyAyMDAwIG9yIFdpbmRvd3MgWFAgZXZlbnQgbG9nLiBCZWZvcmUgeW91Ci1jYW4gdXNlIGl0LCB5b3UgbmVlZCBNYXJrIEhhbW1vbmQncyBXaW4zMiBleHRlbnNpb25zIGZvciBQeXRob24KLWluc3RhbGxlZC4KLQotXGJlZ2lue2NsYXNzZGVzY317TlRFdmVudExvZ0hhbmRsZXJ9e2FwcG5hbWVcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRsbG5hbWVcb3B0aW9uYWx7LCBsb2d0eXBlfX19Ci1SZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBcY2xhc3N7TlRFdmVudExvZ0hhbmRsZXJ9IGNsYXNzLiBUaGUKLVx2YXJ7YXBwbmFtZX0gaXMgdXNlZCB0byBkZWZpbmUgdGhlIGFwcGxpY2F0aW9uIG5hbWUgYXMgaXQgYXBwZWFycyBpbiB0aGUKLWV2ZW50IGxvZy4gQW4gYXBwcm9wcmlhdGUgcmVnaXN0cnkgZW50cnkgaXMgY3JlYXRlZCB1c2luZyB0aGlzIG5hbWUuCi1UaGUgXHZhcntkbGxuYW1lfSBzaG91bGQgZ2l2ZSB0aGUgZnVsbHkgcXVhbGlmaWVkIHBhdGhuYW1lIG9mIGEgLmRsbCBvciAuZXhlCi13aGljaCBjb250YWlucyBtZXNzYWdlIGRlZmluaXRpb25zIHRvIGhvbGQgaW4gdGhlIGxvZyAoaWYgbm90IHNwZWNpZmllZCwKLVxjb2Rleyd3aW4zMnNlcnZpY2UucHlkJ30gaXMgdXNlZCAtIHRoaXMgaXMgaW5zdGFsbGVkIHdpdGggdGhlIFdpbjMyCi1leHRlbnNpb25zIGFuZCBjb250YWlucyBzb21lIGJhc2ljIHBsYWNlaG9sZGVyIG1lc3NhZ2UgZGVmaW5pdGlvbnMuCi1Ob3RlIHRoYXQgdXNlIG9mIHRoZXNlIHBsYWNlaG9sZGVycyB3aWxsIG1ha2UgeW91ciBldmVudCBsb2dzIGJpZywgYXMgdGhlCi1lbnRpcmUgbWVzc2FnZSBzb3VyY2UgaXMgaGVsZCBpbiB0aGUgbG9nLiBJZiB5b3Ugd2FudCBzbGltbWVyIGxvZ3MsIHlvdSBoYXZlCi10byBwYXNzIGluIHRoZSBuYW1lIG9mIHlvdXIgb3duIC5kbGwgb3IgLmV4ZSB3aGljaCBjb250YWlucyB0aGUgbWVzc2FnZQotZGVmaW5pdGlvbnMgeW91IHdhbnQgdG8gdXNlIGluIHRoZSBldmVudCBsb2cpLiBUaGUgXHZhcntsb2d0eXBlfSBpcyBvbmUgb2YKLVxjb2RleydBcHBsaWNhdGlvbid9LCBcY29kZXsnU3lzdGVtJ30gb3IgXGNvZGV7J1NlY3VyaXR5J30sIGFuZAotZGVmYXVsdHMgdG8gXGNvZGV7J0FwcGxpY2F0aW9uJ30uCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2Nsb3NlfXt9Ci1BdCB0aGlzIHBvaW50LCB5b3UgY2FuIHJlbW92ZSB0aGUgYXBwbGljYXRpb24gbmFtZSBmcm9tIHRoZSByZWdpc3RyeSBhcyBhCi1zb3VyY2Ugb2YgZXZlbnQgbG9nIGVudHJpZXMuIEhvd2V2ZXIsIGlmIHlvdSBkbyB0aGlzLCB5b3Ugd2lsbCBub3QgYmUgYWJsZQotdG8gc2VlIHRoZSBldmVudHMgYXMgeW91IGludGVuZGVkIGluIHRoZSBFdmVudCBMb2cgVmlld2VyIC0gaXQgbmVlZHMgdG8gYmUKLWFibGUgdG8gYWNjZXNzIHRoZSByZWdpc3RyeSB0byBnZXQgdGhlIC5kbGwgbmFtZS4gVGhlIGN1cnJlbnQgdmVyc2lvbiBkb2VzCi1ub3QgZG8gdGhpcyAoaW4gZmFjdCBpdCBkb2Vzbid0IGRvIGFueXRoaW5nKS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2VtaXR9e3JlY29yZH0KLURldGVybWluZXMgdGhlIG1lc3NhZ2UgSUQsIGV2ZW50IGNhdGVnb3J5IGFuZCBldmVudCB0eXBlLCBhbmQgdGhlbiBsb2dzIHRoZQotbWVzc2FnZSBpbiB0aGUgTlQgZXZlbnQgbG9nLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Z2V0RXZlbnRDYXRlZ29yeX17cmVjb3JkfQotUmV0dXJucyB0aGUgZXZlbnQgY2F0ZWdvcnkgZm9yIHRoZSByZWNvcmQuIE92ZXJyaWRlIHRoaXMgaWYgeW91Ci13YW50IHRvIHNwZWNpZnkgeW91ciBvd24gY2F0ZWdvcmllcy4gVGhpcyB2ZXJzaW9uIHJldHVybnMgMC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2dldEV2ZW50VHlwZX17cmVjb3JkfQotUmV0dXJucyB0aGUgZXZlbnQgdHlwZSBmb3IgdGhlIHJlY29yZC4gT3ZlcnJpZGUgdGhpcyBpZiB5b3Ugd2FudAotdG8gc3BlY2lmeSB5b3VyIG93biB0eXBlcy4gVGhpcyB2ZXJzaW9uIGRvZXMgYSBtYXBwaW5nIHVzaW5nIHRoZQotaGFuZGxlcidzIHR5cGVtYXAgYXR0cmlidXRlLCB3aGljaCBpcyBzZXQgdXAgaW4gXG1ldGhvZHtfX2luaXRfXygpfQotdG8gYSBkaWN0aW9uYXJ5IHdoaWNoIGNvbnRhaW5zIG1hcHBpbmdzIGZvciBcY29uc3RhbnR7REVCVUd9LAotXGNvbnN0YW50e0lORk99LCBcY29uc3RhbnR7V0FSTklOR30sIFxjb25zdGFudHtFUlJPUn0gYW5kCi1cY29uc3RhbnR7Q1JJVElDQUx9LiBJZiB5b3UgYXJlIHVzaW5nIHlvdXIgb3duIGxldmVscywgeW91IHdpbGwgZWl0aGVyIG5lZWQKLXRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9yIHBsYWNlIGEgc3VpdGFibGUgZGljdGlvbmFyeSBpbiB0aGUKLWhhbmRsZXIncyBcdmFye3R5cGVtYXB9IGF0dHJpYnV0ZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2dldE1lc3NhZ2VJRH17cmVjb3JkfQotUmV0dXJucyB0aGUgbWVzc2FnZSBJRCBmb3IgdGhlIHJlY29yZC4gSWYgeW91IGFyZSB1c2luZyB5b3VyCi1vd24gbWVzc2FnZXMsIHlvdSBjb3VsZCBkbyB0aGlzIGJ5IGhhdmluZyB0aGUgXHZhcnttc2d9IHBhc3NlZCB0byB0aGUKLWxvZ2dlciBiZWluZyBhbiBJRCByYXRoZXIgdGhhbiBhIGZvcm1hdCBzdHJpbmcuIFRoZW4sIGluIGhlcmUsCi15b3UgY291bGQgdXNlIGEgZGljdGlvbmFyeSBsb29rdXAgdG8gZ2V0IHRoZSBtZXNzYWdlIElELiBUaGlzCi12ZXJzaW9uIHJldHVybnMgMSwgd2hpY2ggaXMgdGhlIGJhc2UgbWVzc2FnZSBJRCBpbgotXGZpbGV7d2luMzJzZXJ2aWNlLnB5ZH0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxzdWJzdWJzZWN0aW9ue1NNVFBIYW5kbGVyfQotCi1UaGUgXGNsYXNze1NNVFBIYW5kbGVyfSBjbGFzcywgbG9jYXRlZCBpbiB0aGUKLVxtb2R1bGV7bG9nZ2luZy5oYW5kbGVyc30gbW9kdWxlLCBzdXBwb3J0cyBzZW5kaW5nIGxvZ2dpbmcgbWVzc2FnZXMgdG8KLWFuIGVtYWlsIGFkZHJlc3MgdmlhIFNNVFAuCi0KLVxiZWdpbntjbGFzc2Rlc2N9e1NNVFBIYW5kbGVyfXttYWlsaG9zdCwgZnJvbWFkZHIsIHRvYWRkcnMsIHN1YmplY3Rcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzfX0KLVJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFxjbGFzc3tTTVRQSGFuZGxlcn0gY2xhc3MuIFRoZQotaW5zdGFuY2UgaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZnJvbSBhbmQgdG8gYWRkcmVzc2VzIGFuZCBzdWJqZWN0Ci1saW5lIG9mIHRoZSBlbWFpbC4gVGhlIFx2YXJ7dG9hZGRyc30gc2hvdWxkIGJlIGEgbGlzdCBvZiBzdHJpbmdzLiBUbyBzcGVjaWZ5IGEKLW5vbi1zdGFuZGFyZCBTTVRQIHBvcnQsIHVzZSB0aGUgKGhvc3QsIHBvcnQpIHR1cGxlIGZvcm1hdCBmb3IgdGhlCi1cdmFye21haWxob3N0fSBhcmd1bWVudC4gSWYgeW91IHVzZSBhIHN0cmluZywgdGhlIHN0YW5kYXJkIFNNVFAgcG9ydAotaXMgdXNlZC4gSWYgeW91ciBTTVRQIHNlcnZlciByZXF1aXJlcyBhdXRoZW50aWNhdGlvbiwgeW91IGNhbiBzcGVjaWZ5IGEKLSh1c2VybmFtZSwgcGFzc3dvcmQpIHR1cGxlIGZvciB0aGUgXHZhcntjcmVkZW50aWFsc30gYXJndW1lbnQuCi1cdmVyc2lvbmNoYW5nZWRbXHZhcntjcmVkZW50aWFsc30gd2FzIGFkZGVkXXsyLjZ9Ci1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2VtaXR9e3JlY29yZH0KLUZvcm1hdHMgdGhlIHJlY29yZCBhbmQgc2VuZHMgaXQgdG8gdGhlIHNwZWNpZmllZCBhZGRyZXNzZWVzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Z2V0U3ViamVjdH17cmVjb3JkfQotSWYgeW91IHdhbnQgdG8gc3BlY2lmeSBhIHN1YmplY3QgbGluZSB3aGljaCBpcyByZWNvcmQtZGVwZW5kZW50LAotb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxzdWJzdWJzZWN0aW9ue01lbW9yeUhhbmRsZXJ9Ci0KLVRoZSBcY2xhc3N7TWVtb3J5SGFuZGxlcn0gY2xhc3MsIGxvY2F0ZWQgaW4gdGhlCi1cbW9kdWxle2xvZ2dpbmcuaGFuZGxlcnN9IG1vZHVsZSwgc3VwcG9ydHMgYnVmZmVyaW5nIG9mIGxvZ2dpbmcKLXJlY29yZHMgaW4gbWVtb3J5LCBwZXJpb2RpY2FsbHkgZmx1c2hpbmcgdGhlbSB0byBhIFxkZm57dGFyZ2V0fQotaGFuZGxlci4gRmx1c2hpbmcgb2NjdXJzIHdoZW5ldmVyIHRoZSBidWZmZXIgaXMgZnVsbCwgb3Igd2hlbiBhbiBldmVudAotb2YgYSBjZXJ0YWluIHNldmVyaXR5IG9yIGdyZWF0ZXIgaXMgc2Vlbi4KLQotXGNsYXNze01lbW9yeUhhbmRsZXJ9IGlzIGEgc3ViY2xhc3Mgb2YgdGhlIG1vcmUgZ2VuZXJhbAotXGNsYXNze0J1ZmZlcmluZ0hhbmRsZXJ9LCB3aGljaCBpcyBhbiBhYnN0cmFjdCBjbGFzcy4gVGhpcyBidWZmZXJzIGxvZ2dpbmcKLXJlY29yZHMgaW4gbWVtb3J5LiBXaGVuZXZlciBlYWNoIHJlY29yZCBpcyBhZGRlZCB0byB0aGUgYnVmZmVyLCBhCi1jaGVjayBpcyBtYWRlIGJ5IGNhbGxpbmcgXG1ldGhvZHtzaG91bGRGbHVzaCgpfSB0byBzZWUgaWYgdGhlIGJ1ZmZlcgotc2hvdWxkIGJlIGZsdXNoZWQuICBJZiBpdCBzaG91bGQsIHRoZW4gXG1ldGhvZHtmbHVzaCgpfSBpcyBleHBlY3RlZCB0bwotZG8gdGhlIG5lZWRmdWwuCi0KLVxiZWdpbntjbGFzc2Rlc2N9e0J1ZmZlcmluZ0hhbmRsZXJ9e2NhcGFjaXR5fQotSW5pdGlhbGl6ZXMgdGhlIGhhbmRsZXIgd2l0aCBhIGJ1ZmZlciBvZiB0aGUgc3BlY2lmaWVkIGNhcGFjaXR5LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtlbWl0fXtyZWNvcmR9Ci1BcHBlbmRzIHRoZSByZWNvcmQgdG8gdGhlIGJ1ZmZlci4gSWYgXG1ldGhvZHtzaG91bGRGbHVzaCgpfSByZXR1cm5zIHRydWUsCi1jYWxscyBcbWV0aG9ke2ZsdXNoKCl9IHRvIHByb2Nlc3MgdGhlIGJ1ZmZlci4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2ZsdXNofXt9Ci1Zb3UgY2FuIG92ZXJyaWRlIHRoaXMgdG8gaW1wbGVtZW50IGN1c3RvbSBmbHVzaGluZyBiZWhhdmlvci4gVGhpcyB2ZXJzaW9uCi1qdXN0IHphcHMgdGhlIGJ1ZmZlciB0byBlbXB0eS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3Nob3VsZEZsdXNofXtyZWNvcmR9Ci1SZXR1cm5zIHRydWUgaWYgdGhlIGJ1ZmZlciBpcyB1cCB0byBjYXBhY2l0eS4gVGhpcyBtZXRob2QgY2FuIGJlCi1vdmVycmlkZGVuIHRvIGltcGxlbWVudCBjdXN0b20gZmx1c2hpbmcgc3RyYXRlZ2llcy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317TWVtb3J5SGFuZGxlcn17Y2FwYWNpdHlcb3B0aW9uYWx7LCBmbHVzaExldmVsCi1cb3B0aW9uYWx7LCB0YXJnZXR9fX0KLVJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFxjbGFzc3tNZW1vcnlIYW5kbGVyfSBjbGFzcy4gVGhlCi1pbnN0YW5jZSBpcyBpbml0aWFsaXplZCB3aXRoIGEgYnVmZmVyIHNpemUgb2YgXHZhcntjYXBhY2l0eX0uIElmCi1cdmFye2ZsdXNoTGV2ZWx9IGlzIG5vdCBzcGVjaWZpZWQsIFxjb25zdGFudHtFUlJPUn0gaXMgdXNlZC4gSWYgbm8KLVx2YXJ7dGFyZ2V0fSBpcyBzcGVjaWZpZWQsIHRoZSB0YXJnZXQgd2lsbCBuZWVkIHRvIGJlIHNldCB1c2luZwotXG1ldGhvZHtzZXRUYXJnZXQoKX0gYmVmb3JlIHRoaXMgaGFuZGxlciBkb2VzIGFueXRoaW5nIHVzZWZ1bC4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Y2xvc2V9e30KLUNhbGxzIFxtZXRob2R7Zmx1c2goKX0sIHNldHMgdGhlIHRhcmdldCB0byBcY29uc3RhbnR7Tm9uZX0gYW5kCi1jbGVhcnMgdGhlIGJ1ZmZlci4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2ZsdXNofXt9Ci1Gb3IgYSBcY2xhc3N7TWVtb3J5SGFuZGxlcn0sIGZsdXNoaW5nIG1lYW5zIGp1c3Qgc2VuZGluZyB0aGUgYnVmZmVyZWQKLXJlY29yZHMgdG8gdGhlIHRhcmdldCwgaWYgdGhlcmUgaXMgb25lLiBPdmVycmlkZSBpZiB5b3Ugd2FudAotZGlmZmVyZW50IGJlaGF2aW9yLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317c2V0VGFyZ2V0fXt0YXJnZXR9Ci1TZXRzIHRoZSB0YXJnZXQgaGFuZGxlciBmb3IgdGhpcyBoYW5kbGVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317c2hvdWxkRmx1c2h9e3JlY29yZH0KLUNoZWNrcyBmb3IgYnVmZmVyIGZ1bGwgb3IgYSByZWNvcmQgYXQgdGhlIFx2YXJ7Zmx1c2hMZXZlbH0gb3IgaGlnaGVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cc3Vic3Vic2VjdGlvbntIVFRQSGFuZGxlcn0KLQotVGhlIFxjbGFzc3tIVFRQSGFuZGxlcn0gY2xhc3MsIGxvY2F0ZWQgaW4gdGhlCi1cbW9kdWxle2xvZ2dpbmcuaGFuZGxlcnN9IG1vZHVsZSwgc3VwcG9ydHMgc2VuZGluZyBsb2dnaW5nIG1lc3NhZ2VzIHRvCi1hIFdlYiBzZXJ2ZXIsIHVzaW5nIGVpdGhlciBcc2FtcHtHRVR9IG9yIFxzYW1we1BPU1R9IHNlbWFudGljcy4KLQotXGJlZ2lue2NsYXNzZGVzY317SFRUUEhhbmRsZXJ9e2hvc3QsIHVybFxvcHRpb25hbHssIG1ldGhvZH19Ci1SZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBcY2xhc3N7SFRUUEhhbmRsZXJ9IGNsYXNzLiBUaGUKLWluc3RhbmNlIGlzIGluaXRpYWxpemVkIHdpdGggYSBob3N0IGFkZHJlc3MsIHVybCBhbmQgSFRUUCBtZXRob2QuCi1UaGUgXHZhcntob3N0fSBjYW4gYmUgb2YgdGhlIGZvcm0gXGNvZGV7aG9zdDpwb3J0fSwgc2hvdWxkIHlvdSBuZWVkIHRvCi11c2UgYSBzcGVjaWZpYyBwb3J0IG51bWJlci4gSWYgbm8gXHZhcnttZXRob2R9IGlzIHNwZWNpZmllZCwgXHNhbXB7R0VUfQotaXMgdXNlZC4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317ZW1pdH17cmVjb3JkfQotU2VuZHMgdGhlIHJlY29yZCB0byB0aGUgV2ViIHNlcnZlciBhcyBhbiBVUkwtZW5jb2RlZCBkaWN0aW9uYXJ5LgotXGVuZHttZXRob2RkZXNjfQotCi1cc3Vic2VjdGlvbntGb3JtYXR0ZXIgT2JqZWN0c30KLQotXGNsYXNze0Zvcm1hdHRlcn1zIGhhdmUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFuZCBtZXRob2RzLiBUaGV5IGFyZQotcmVzcG9uc2libGUgZm9yIGNvbnZlcnRpbmcgYSBcY2xhc3N7TG9nUmVjb3JkfSB0byAodXN1YWxseSkgYSBzdHJpbmcKLXdoaWNoIGNhbiBiZSBpbnRlcnByZXRlZCBieSBlaXRoZXIgYSBodW1hbiBvciBhbiBleHRlcm5hbCBzeXN0ZW0uIFRoZQotYmFzZQotXGNsYXNze0Zvcm1hdHRlcn0gYWxsb3dzIGEgZm9ybWF0dGluZyBzdHJpbmcgdG8gYmUgc3BlY2lmaWVkLiBJZiBub25lIGlzCi1zdXBwbGllZCwgdGhlIGRlZmF1bHQgdmFsdWUgb2YgXGNvZGV7J1wlKG1lc3NhZ2Upcyd9IGlzIHVzZWQuCi0KLUEgRm9ybWF0dGVyIGNhbiBiZSBpbml0aWFsaXplZCB3aXRoIGEgZm9ybWF0IHN0cmluZyB3aGljaCBtYWtlcyB1c2Ugb2YKLWtub3dsZWRnZSBvZiB0aGUgXGNsYXNze0xvZ1JlY29yZH0gYXR0cmlidXRlcyAtIHN1Y2ggYXMgdGhlIGRlZmF1bHQgdmFsdWUKLW1lbnRpb25lZCBhYm92ZSBtYWtpbmcgdXNlIG9mIHRoZSBmYWN0IHRoYXQgdGhlIHVzZXIncyBtZXNzYWdlIGFuZAotYXJndW1lbnRzIGFyZSBwcmUtZm9ybWF0dGVkIGludG8gYSBcY2xhc3N7TG9nUmVjb3JkfSdzIFx2YXJ7bWVzc2FnZX0KLWF0dHJpYnV0ZS4gIFRoaXMgZm9ybWF0IHN0cmluZyBjb250YWlucyBzdGFuZGFyZCBweXRob24gXCUtc3R5bGUKLW1hcHBpbmcga2V5cy4gU2VlIHNlY3Rpb24gXHJlZnt0eXBlc3NlcS1zdHJpbmdzfSwgYGBTdHJpbmcgRm9ybWF0dGluZwotT3BlcmF0aW9ucywnJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBzdHJpbmcgZm9ybWF0dGluZy4KLQotQ3VycmVudGx5LCB0aGUgdXNlZnVsIG1hcHBpbmcga2V5cyBpbiBhIFxjbGFzc3tMb2dSZWNvcmR9IGFyZToKLQotXGJlZ2lue3RhYmxlaWl9e2x8bH17Y29kZX17Rm9ybWF0fXtEZXNjcmlwdGlvbn0KLVxsaW5laWl7XCUobmFtZSlzfSAgICAge05hbWUgb2YgdGhlIGxvZ2dlciAobG9nZ2luZyBjaGFubmVsKS59Ci1cbGluZWlpe1wlKGxldmVsbm8pc30gIHtOdW1lcmljIGxvZ2dpbmcgbGV2ZWwgZm9yIHRoZSBtZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAoXGNvbnN0YW50e0RFQlVHfSwgXGNvbnN0YW50e0lORk99LAotICAgICAgICAgICAgICAgICAgICAgICAgXGNvbnN0YW50e1dBUk5JTkd9LCBcY29uc3RhbnR7RVJST1J9LAotICAgICAgICAgICAgICAgICAgICAgICAgXGNvbnN0YW50e0NSSVRJQ0FMfSkufQotXGxpbmVpaXtcJShsZXZlbG5hbWUpc317VGV4dCBsb2dnaW5nIGxldmVsIGZvciB0aGUgbWVzc2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgKFxjb2RleydERUJVRyd9LCBcY29kZXsnSU5GTyd9LAotICAgICAgICAgICAgICAgICAgICAgICAgXGNvZGV7J1dBUk5JTkcnfSwgXGNvZGV7J0VSUk9SJ30sCi0gICAgICAgICAgICAgICAgICAgICAgICBcY29kZXsnQ1JJVElDQUwnfSkufQotXGxpbmVpaXtcJShwYXRobmFtZSlzfSB7RnVsbCBwYXRobmFtZSBvZiB0aGUgc291cmNlIGZpbGUgd2hlcmUgdGhlIGxvZ2dpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGwgd2FzIGlzc3VlZCAoaWYgYXZhaWxhYmxlKS59Ci1cbGluZWlpe1wlKGZpbGVuYW1lKXN9IHtGaWxlbmFtZSBwb3J0aW9uIG9mIHBhdGhuYW1lLn0KLVxsaW5laWl7XCUobW9kdWxlKXN9ICAge01vZHVsZSAobmFtZSBwb3J0aW9uIG9mIGZpbGVuYW1lKS59Ci1cbGluZWlpe1wlKGZ1bmNOYW1lKXN9IHtOYW1lIG9mIGZ1bmN0aW9uIGNvbnRhaW5pbmcgdGhlIGxvZ2dpbmcgY2FsbC59Ci1cbGluZWlpe1wlKGxpbmVubylkfSAgIHtTb3VyY2UgbGluZSBudW1iZXIgd2hlcmUgdGhlIGxvZ2dpbmcgY2FsbCB3YXMgaXNzdWVkCi0gICAgICAgICAgICAgICAgICAgICAgICAoaWYgYXZhaWxhYmxlKS59Ci1cbGluZWlpe1wlKGNyZWF0ZWQpZn0gIHtUaW1lIHdoZW4gdGhlIFxjbGFzc3tMb2dSZWNvcmR9IHdhcyBjcmVhdGVkIChhcwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgYnkgXGZ1bmN0aW9ue3RpbWUudGltZSgpfSkufQotXGxpbmVpaXtcJShyZWxhdGl2ZUNyZWF0ZWQpZH0gIHtUaW1lIGluIG1pbGxpc2Vjb25kcyB3aGVuIHRoZSBMb2dSZWNvcmQgd2FzCi0gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkLCByZWxhdGl2ZSB0byB0aGUgdGltZSB0aGUgbG9nZ2luZyBtb2R1bGUgd2FzCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQufQotXGxpbmVpaXtcJShhc2N0aW1lKXN9ICB7SHVtYW4tcmVhZGFibGUgdGltZSB3aGVuIHRoZSBcY2xhc3N7TG9nUmVjb3JkfQotICAgICAgICAgICAgICAgICAgICAgICAgd2FzIGNyZWF0ZWQuICBCeSBkZWZhdWx0IHRoaXMgaXMgb2YgdGhlIGZvcm0KLSAgICAgICAgICAgICAgICAgICAgICAgIGBgMjAwMy0wNy0wOCAxNjo0OTo0NSw4OTYnJyAodGhlIG51bWJlcnMgYWZ0ZXIgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21tYSBhcmUgbWlsbGlzZWNvbmQgcG9ydGlvbiBvZiB0aGUgdGltZSkufQotXGxpbmVpaXtcJShtc2VjcylkfSAgICB7TWlsbGlzZWNvbmQgcG9ydGlvbiBvZiB0aGUgdGltZSB3aGVuIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgXGNsYXNze0xvZ1JlY29yZH0gd2FzIGNyZWF0ZWQufQotXGxpbmVpaXtcJSh0aHJlYWQpZH0gICB7VGhyZWFkIElEIChpZiBhdmFpbGFibGUpLn0KLVxsaW5laWl7XCUodGhyZWFkTmFtZSlzfSAgIHtUaHJlYWQgbmFtZSAoaWYgYXZhaWxhYmxlKS59Ci1cbGluZWlpe1wlKHByb2Nlc3MpZH0gIHtQcm9jZXNzIElEIChpZiBhdmFpbGFibGUpLn0KLVxsaW5laWl7XCUobWVzc2FnZSlzfSAge1RoZSBsb2dnZWQgbWVzc2FnZSwgY29tcHV0ZWQgYXMgXGNvZGV7bXNnIFwlIGFyZ3N9Ln0KLVxlbmR7dGFibGVpaX0KLQotXHZlcnNpb25jaGFuZ2VkW1x2YXJ7ZnVuY05hbWV9IHdhcyBhZGRlZF17Mi41fQotCi1cYmVnaW57Y2xhc3NkZXNjfXtGb3JtYXR0ZXJ9e1xvcHRpb25hbHtmbXRcb3B0aW9uYWx7LCBkYXRlZm10fX19Ci1SZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBcY2xhc3N7Rm9ybWF0dGVyfSBjbGFzcy4gVGhlCi1pbnN0YW5jZSBpcyBpbml0aWFsaXplZCB3aXRoIGEgZm9ybWF0IHN0cmluZyBmb3IgdGhlIG1lc3NhZ2UgYXMgYSB3aG9sZSwKLWFzIHdlbGwgYXMgYSBmb3JtYXQgc3RyaW5nIGZvciB0aGUgZGF0ZS90aW1lIHBvcnRpb24gb2YgYSBtZXNzYWdlLiBJZgotbm8gXHZhcntmbXR9IGlzIHNwZWNpZmllZCwgXGNvZGV7J1wlKG1lc3NhZ2Upcyd9IGlzIHVzZWQuIElmIG5vIFx2YXJ7ZGF0ZWZtdH0KLWlzIHNwZWNpZmllZCwgdGhlIElTTzg2MDEgZGF0ZSBmb3JtYXQgaXMgdXNlZC4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Zm9ybWF0fXtyZWNvcmR9Ci1UaGUgcmVjb3JkJ3MgYXR0cmlidXRlIGRpY3Rpb25hcnkgaXMgdXNlZCBhcyB0aGUgb3BlcmFuZCB0byBhCi1zdHJpbmcgZm9ybWF0dGluZyBvcGVyYXRpb24uIFJldHVybnMgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi1CZWZvcmUgZm9ybWF0dGluZyB0aGUgZGljdGlvbmFyeSwgYSBjb3VwbGUgb2YgcHJlcGFyYXRvcnkgc3RlcHMKLWFyZSBjYXJyaWVkIG91dC4gVGhlIFx2YXJ7bWVzc2FnZX0gYXR0cmlidXRlIG9mIHRoZSByZWNvcmQgaXMgY29tcHV0ZWQKLXVzaW5nIFx2YXJ7bXNnfSBcJSBcdmFye2FyZ3N9LiBJZiB0aGUgZm9ybWF0dGluZyBzdHJpbmcgY29udGFpbnMKLVxjb2RleycoYXNjdGltZSknfSwgXG1ldGhvZHtmb3JtYXRUaW1lKCl9IGlzIGNhbGxlZCB0byBmb3JtYXQgdGhlCi1ldmVudCB0aW1lLiBJZiB0aGVyZSBpcyBleGNlcHRpb24gaW5mb3JtYXRpb24sIGl0IGlzIGZvcm1hdHRlZCB1c2luZwotXG1ldGhvZHtmb3JtYXRFeGNlcHRpb24oKX0gYW5kIGFwcGVuZGVkIHRvIHRoZSBtZXNzYWdlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Zm9ybWF0VGltZX17cmVjb3JkXG9wdGlvbmFseywgZGF0ZWZtdH19Ci1UaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGZyb20gXG1ldGhvZHtmb3JtYXQoKX0gYnkgYSBmb3JtYXR0ZXIgd2hpY2gKLXdhbnRzIHRvIG1ha2UgdXNlIG9mIGEgZm9ybWF0dGVkIHRpbWUuIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuCi1pbiBmb3JtYXR0ZXJzIHRvIHByb3ZpZGUgZm9yIGFueSBzcGVjaWZpYyByZXF1aXJlbWVudCwgYnV0IHRoZQotYmFzaWMgYmVoYXZpb3IgaXMgYXMgZm9sbG93czogaWYgXHZhcntkYXRlZm10fSAoYSBzdHJpbmcpIGlzIHNwZWNpZmllZCwKLWl0IGlzIHVzZWQgd2l0aCBcZnVuY3Rpb257dGltZS5zdHJmdGltZSgpfSB0byBmb3JtYXQgdGhlIGNyZWF0aW9uIHRpbWUgb2YgdGhlCi1yZWNvcmQuIE90aGVyd2lzZSwgdGhlIElTTzg2MDEgZm9ybWF0IGlzIHVzZWQuIFRoZSByZXN1bHRpbmcKLXN0cmluZyBpcyByZXR1cm5lZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2Zvcm1hdEV4Y2VwdGlvbn17ZXhjX2luZm99Ci1Gb3JtYXRzIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uIGluZm9ybWF0aW9uIChhIHN0YW5kYXJkIGV4Y2VwdGlvbiB0dXBsZQotYXMgcmV0dXJuZWQgYnkgXGZ1bmN0aW9ue3N5cy5leGNfaW5mbygpfSkgYXMgYSBzdHJpbmcuIFRoaXMgZGVmYXVsdAotaW1wbGVtZW50YXRpb24ganVzdCB1c2VzIFxmdW5jdGlvbnt0cmFjZWJhY2sucHJpbnRfZXhjZXB0aW9uKCl9LgotVGhlIHJlc3VsdGluZyBzdHJpbmcgaXMgcmV0dXJuZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxzdWJzZWN0aW9ue0ZpbHRlciBPYmplY3RzfQotCi1cY2xhc3N7RmlsdGVyfXMgY2FuIGJlIHVzZWQgYnkgXGNsYXNze0hhbmRsZXJ9cyBhbmQgXGNsYXNze0xvZ2dlcn1zIGZvcgotbW9yZSBzb3BoaXN0aWNhdGVkIGZpbHRlcmluZyB0aGFuIGlzIHByb3ZpZGVkIGJ5IGxldmVscy4gVGhlIGJhc2UgZmlsdGVyCi1jbGFzcyBvbmx5IGFsbG93cyBldmVudHMgd2hpY2ggYXJlIGJlbG93IGEgY2VydGFpbiBwb2ludCBpbiB0aGUgbG9nZ2VyCi1oaWVyYXJjaHkuIEZvciBleGFtcGxlLCBhIGZpbHRlciBpbml0aWFsaXplZCB3aXRoICJBLkIiIHdpbGwgYWxsb3cgZXZlbnRzCi1sb2dnZWQgYnkgbG9nZ2VycyAiQS5CIiwgIkEuQi5DIiwgIkEuQi5DLkQiLCAiQS5CLkQiIGV0Yy4gYnV0IG5vdCAiQS5CQiIsCi0iQi5BLkIiIGV0Yy4gSWYgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZW1wdHkgc3RyaW5nLCBhbGwgZXZlbnRzIGFyZSBwYXNzZWQuCi0KLVxiZWdpbntjbGFzc2Rlc2N9e0ZpbHRlcn17XG9wdGlvbmFse25hbWV9fQotUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgXGNsYXNze0ZpbHRlcn0gY2xhc3MuIElmIFx2YXJ7bmFtZX0gaXMgc3BlY2lmaWVkLAotaXQgbmFtZXMgYSBsb2dnZXIgd2hpY2gsIHRvZ2V0aGVyIHdpdGggaXRzIGNoaWxkcmVuLCB3aWxsIGhhdmUgaXRzIGV2ZW50cwotYWxsb3dlZCB0aHJvdWdoIHRoZSBmaWx0ZXIuIElmIG5vIG5hbWUgaXMgc3BlY2lmaWVkLCBhbGxvd3MgZXZlcnkgZXZlbnQuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2ZpbHRlcn17cmVjb3JkfQotSXMgdGhlIHNwZWNpZmllZCByZWNvcmQgdG8gYmUgbG9nZ2VkPyBSZXR1cm5zIHplcm8gZm9yIG5vLCBub256ZXJvIGZvcgoteWVzLiBJZiBkZWVtZWQgYXBwcm9wcmlhdGUsIHRoZSByZWNvcmQgbWF5IGJlIG1vZGlmaWVkIGluLXBsYWNlIGJ5IHRoaXMKLW1ldGhvZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXHN1YnNlY3Rpb257TG9nUmVjb3JkIE9iamVjdHN9Ci0KLVxjbGFzc3tMb2dSZWNvcmR9IGluc3RhbmNlcyBhcmUgY3JlYXRlZCBldmVyeSB0aW1lIHNvbWV0aGluZyBpcyBsb2dnZWQuIFRoZXkKLWNvbnRhaW4gYWxsIHRoZSBpbmZvcm1hdGlvbiBwZXJ0aW5lbnQgdG8gdGhlIGV2ZW50IGJlaW5nIGxvZ2dlZC4gVGhlCi1tYWluIGluZm9ybWF0aW9uIHBhc3NlZCBpbiBpcyBpbiBtc2cgYW5kIGFyZ3MsIHdoaWNoIGFyZSBjb21iaW5lZAotdXNpbmcgbXNnIFwlIGFyZ3MgdG8gY3JlYXRlIHRoZSBtZXNzYWdlIGZpZWxkIG9mIHRoZSByZWNvcmQuIFRoZSByZWNvcmQKLWFsc28gaW5jbHVkZXMgaW5mb3JtYXRpb24gc3VjaCBhcyB3aGVuIHRoZSByZWNvcmQgd2FzIGNyZWF0ZWQsIHRoZQotc291cmNlIGxpbmUgd2hlcmUgdGhlIGxvZ2dpbmcgY2FsbCB3YXMgbWFkZSwgYW5kIGFueSBleGNlcHRpb24KLWluZm9ybWF0aW9uIHRvIGJlIGxvZ2dlZC4KLQotXGJlZ2lue2NsYXNzZGVzY317TG9nUmVjb3JkfXtuYW1lLCBsdmwsIHBhdGhuYW1lLCBsaW5lbm8sIG1zZywgYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjX2luZm8gXG9wdGlvbmFseywgZnVuY319Ci1SZXR1cm5zIGFuIGluc3RhbmNlIG9mIFxjbGFzc3tMb2dSZWNvcmR9IGluaXRpYWxpemVkIHdpdGggaW50ZXJlc3RpbmcKLWluZm9ybWF0aW9uLiBUaGUgXHZhcntuYW1lfSBpcyB0aGUgbG9nZ2VyIG5hbWU7IFx2YXJ7bHZsfSBpcyB0aGUKLW51bWVyaWMgbGV2ZWw7IFx2YXJ7cGF0aG5hbWV9IGlzIHRoZSBhYnNvbHV0ZSBwYXRobmFtZSBvZiB0aGUgc291cmNlCi1maWxlIGluIHdoaWNoIHRoZSBsb2dnaW5nIGNhbGwgd2FzIG1hZGU7IFx2YXJ7bGluZW5vfSBpcyB0aGUgbGluZQotbnVtYmVyIGluIHRoYXQgZmlsZSB3aGVyZSB0aGUgbG9nZ2luZyBjYWxsIGlzIGZvdW5kOyBcdmFye21zZ30gaXMgdGhlCi11c2VyLXN1cHBsaWVkIG1lc3NhZ2UgKGEgZm9ybWF0IHN0cmluZyk7IFx2YXJ7YXJnc30gaXMgdGhlIHR1cGxlCi13aGljaCwgdG9nZXRoZXIgd2l0aCBcdmFye21zZ30sIG1ha2VzIHVwIHRoZSB1c2VyIG1lc3NhZ2U7IGFuZAotXHZhcntleGNfaW5mb30gaXMgdGhlIGV4Y2VwdGlvbiB0dXBsZSBvYnRhaW5lZCBieSBjYWxsaW5nCi1cZnVuY3Rpb257c3lzLmV4Y19pbmZvKCkgfShvciBcY29uc3RhbnR7Tm9uZX0sIGlmIG5vIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbgotaXMgYXZhaWxhYmxlKS4gVGhlIFx2YXJ7ZnVuY30gaXMgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGZyb20gd2hpY2ggdGhlCi1sb2dnaW5nIGNhbGwgd2FzIG1hZGUuIElmIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIFxjb2Rle05vbmV9LgotXHZlcnNpb25jaGFuZ2VkW1x2YXJ7ZnVuY30gd2FzIGFkZGVkXXsyLjV9Ci1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2dldE1lc3NhZ2V9e30KLVJldHVybnMgdGhlIG1lc3NhZ2UgZm9yIHRoaXMgXGNsYXNze0xvZ1JlY29yZH0gaW5zdGFuY2UgYWZ0ZXIgbWVyZ2luZyBhbnkKLXVzZXItc3VwcGxpZWQgYXJndW1lbnRzIHdpdGggdGhlIG1lc3NhZ2UuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxzdWJzZWN0aW9ue1RocmVhZCBTYWZldHl9Ci0KLVRoZSBsb2dnaW5nIG1vZHVsZSBpcyBpbnRlbmRlZCB0byBiZSB0aHJlYWQtc2FmZSB3aXRob3V0IGFueSBzcGVjaWFsIHdvcmsKLW5lZWRpbmcgdG8gYmUgZG9uZSBieSBpdHMgY2xpZW50cy4gSXQgYWNoaWV2ZXMgdGhpcyB0aG91Z2ggdXNpbmcgdGhyZWFkaW5nCi1sb2NrczsgdGhlcmUgaXMgb25lIGxvY2sgdG8gc2VyaWFsaXplIGFjY2VzcyB0byB0aGUgbW9kdWxlJ3Mgc2hhcmVkIGRhdGEsCi1hbmQgZWFjaCBoYW5kbGVyIGFsc28gY3JlYXRlcyBhIGxvY2sgdG8gc2VyaWFsaXplIGFjY2VzcyB0byBpdHMgdW5kZXJseWluZwotSS9PLgotCi1cc3Vic2VjdGlvbntDb25maWd1cmF0aW9ufQotCi0KLVxzdWJzdWJzZWN0aW9ue0NvbmZpZ3VyYXRpb24gZnVuY3Rpb25zJQotICAgICAgICAgICAgICAgXGxhYmVse2xvZ2dpbmctY29uZmlnLWFwaX19Ci0KLVRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGNvbmZpZ3VyZSB0aGUgbG9nZ2luZyBtb2R1bGUuIFRoZXkgYXJlIGxvY2F0ZWQgaW4gdGhlCi1cbW9kdWxle2xvZ2dpbmcuY29uZmlnfSBtb2R1bGUuICBUaGVpciB1c2UgaXMgb3B0aW9uYWwgLS0tIHlvdSBjYW4gY29uZmlndXJlCi10aGUgbG9nZ2luZyBtb2R1bGUgdXNpbmcgdGhlc2UgZnVuY3Rpb25zIG9yIGJ5IG1ha2luZyBjYWxscyB0byB0aGUKLW1haW4gQVBJIChkZWZpbmVkIGluIFxtb2R1bGV7bG9nZ2luZ30gaXRzZWxmKSBhbmQgZGVmaW5pbmcgaGFuZGxlcnMKLXdoaWNoIGFyZSBkZWNsYXJlZCBlaXRoZXIgaW4gXG1vZHVsZXtsb2dnaW5nfSBvcgotXG1vZHVsZXtsb2dnaW5nLmhhbmRsZXJzfS4KLQotXGJlZ2lue2Z1bmNkZXNjfXtmaWxlQ29uZmlnfXtmbmFtZVxvcHRpb25hbHssIGRlZmF1bHRzfX0KLVJlYWRzIHRoZSBsb2dnaW5nIGNvbmZpZ3VyYXRpb24gZnJvbSBhIENvbmZpZ1BhcnNlci1mb3JtYXQgZmlsZSBuYW1lZAotXHZhcntmbmFtZX0uIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBzZXZlcmFsIHRpbWVzIGZyb20gYW4gYXBwbGljYXRpb24sCi1hbGxvd2luZyBhbiBlbmQgdXNlciB0aGUgYWJpbGl0eSB0byBzZWxlY3QgZnJvbSB2YXJpb3VzIHByZS1jYW5uZWQKLWNvbmZpZ3VyYXRpb25zIChpZiB0aGUgZGV2ZWxvcGVyIHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIHByZXNlbnQgdGhlCi1jaG9pY2VzIGFuZCBsb2FkIHRoZSBjaG9zZW4gY29uZmlndXJhdGlvbikuIERlZmF1bHRzIHRvIGJlIHBhc3NlZCB0bwotQ29uZmlnUGFyc2VyIGNhbiBiZSBzcGVjaWZpZWQgaW4gdGhlIFx2YXJ7ZGVmYXVsdHN9IGFyZ3VtZW50LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtsaXN0ZW59e1xvcHRpb25hbHtwb3J0fX0KLVN0YXJ0cyB1cCBhIHNvY2tldCBzZXJ2ZXIgb24gdGhlIHNwZWNpZmllZCBwb3J0LCBhbmQgbGlzdGVucyBmb3IgbmV3Ci1jb25maWd1cmF0aW9ucy4gSWYgbm8gcG9ydCBpcyBzcGVjaWZpZWQsIHRoZSBtb2R1bGUncyBkZWZhdWx0Ci1cY29uc3RhbnR7REVGQVVMVF9MT0dHSU5HX0NPTkZJR19QT1JUfSBpcyB1c2VkLiBMb2dnaW5nIGNvbmZpZ3VyYXRpb25zCi13aWxsIGJlIHNlbnQgYXMgYSBmaWxlIHN1aXRhYmxlIGZvciBwcm9jZXNzaW5nIGJ5IFxmdW5jdGlvbntmaWxlQ29uZmlnKCl9LgotUmV0dXJucyBhIFxjbGFzc3tUaHJlYWR9IGluc3RhbmNlIG9uIHdoaWNoIHlvdSBjYW4gY2FsbCBcbWV0aG9ke3N0YXJ0KCl9Ci10byBzdGFydCB0aGUgc2VydmVyLCBhbmQgd2hpY2ggeW91IGNhbiBcbWV0aG9ke2pvaW4oKX0gd2hlbiBhcHByb3ByaWF0ZS4KLVRvIHN0b3AgdGhlIHNlcnZlciwgY2FsbCBcZnVuY3Rpb257c3RvcExpc3RlbmluZygpfS4gVG8gc2VuZCBhIGNvbmZpZ3VyYXRpb24KLXRvIHRoZSBzb2NrZXQsIHJlYWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgc2VuZCBpdCB0byB0aGUgc29ja2V0Ci1hcyBhIHN0cmluZyBvZiBieXRlcyBwcmVjZWRlZCBieSBhIGZvdXItYnl0ZSBsZW5ndGggcGFja2VkIGluIGJpbmFyeSB1c2luZwotc3RydWN0Llxjb2Rle3BhY2soJz5MJywgbil9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzdG9wTGlzdGVuaW5nfXt9Ci1TdG9wcyB0aGUgbGlzdGVuaW5nIHNlcnZlciB3aGljaCB3YXMgY3JlYXRlZCB3aXRoIGEgY2FsbCB0bwotXGZ1bmN0aW9ue2xpc3RlbigpfS4gVGhpcyBpcyB0eXBpY2FsbHkgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIFxtZXRob2R7am9pbigpfQotb24gdGhlIHJldHVybiB2YWx1ZSBmcm9tIFxmdW5jdGlvbntsaXN0ZW4oKX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cc3Vic3Vic2VjdGlvbntDb25maWd1cmF0aW9uIGZpbGUgZm9ybWF0JQotICAgICAgICAgICAgICAgXGxhYmVse2xvZ2dpbmctY29uZmlnLWZpbGVmb3JtYXR9fQotCi1UaGUgY29uZmlndXJhdGlvbiBmaWxlIGZvcm1hdCB1bmRlcnN0b29kIGJ5IFxmdW5jdGlvbntmaWxlQ29uZmlnKCl9IGlzCi1iYXNlZCBvbiBDb25maWdQYXJzZXIgZnVuY3Rpb25hbGl0eS4gVGhlIGZpbGUgbXVzdCBjb250YWluIHNlY3Rpb25zCi1jYWxsZWQgXGNvZGV7W2xvZ2dlcnNdfSwgXGNvZGV7W2hhbmRsZXJzXX0gYW5kIFxjb2Rle1tmb3JtYXR0ZXJzXX0KLXdoaWNoIGlkZW50aWZ5IGJ5IG5hbWUgdGhlIGVudGl0aWVzIG9mIGVhY2ggdHlwZSB3aGljaCBhcmUgZGVmaW5lZCBpbgotdGhlIGZpbGUuIEZvciBlYWNoIHN1Y2ggZW50aXR5LCB0aGVyZSBpcyBhIHNlcGFyYXRlIHNlY3Rpb24gd2hpY2gKLWlkZW50aWZpZWQgaG93IHRoYXQgZW50aXR5IGlzIGNvbmZpZ3VyZWQuIFRodXMsIGZvciBhIGxvZ2dlciBuYW1lZAotXGNvZGV7bG9nMDF9IGluIHRoZSBcY29kZXtbbG9nZ2Vyc119IHNlY3Rpb24sIHRoZSByZWxldmFudAotY29uZmlndXJhdGlvbiBkZXRhaWxzIGFyZSBoZWxkIGluIGEgc2VjdGlvbgotXGNvZGV7W2xvZ2dlcl9sb2cwMV19LiBTaW1pbGFybHksIGEgaGFuZGxlciBjYWxsZWQgXGNvZGV7aGFuZDAxfSBpbgotdGhlIFxjb2Rle1toYW5kbGVyc119IHNlY3Rpb24gd2lsbCBoYXZlIGl0cyBjb25maWd1cmF0aW9uIGhlbGQgaW4gYQotc2VjdGlvbiBjYWxsZWQgXGNvZGV7W2hhbmRsZXJfaGFuZDAxXX0sIHdoaWxlIGEgZm9ybWF0dGVyIGNhbGxlZAotXGNvZGV7Zm9ybTAxfSBpbiB0aGUgXGNvZGV7W2Zvcm1hdHRlcnNdfSBzZWN0aW9uIHdpbGwgaGF2ZSBpdHMKLWNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkIGluIGEgc2VjdGlvbiBjYWxsZWQKLVxjb2Rle1tmb3JtYXR0ZXJfZm9ybTAxXX0uIFRoZSByb290IGxvZ2dlciBjb25maWd1cmF0aW9uIG11c3QgYmUKLXNwZWNpZmllZCBpbiBhIHNlY3Rpb24gY2FsbGVkIFxjb2Rle1tsb2dnZXJfcm9vdF19LgotCi1FeGFtcGxlcyBvZiB0aGVzZSBzZWN0aW9ucyBpbiB0aGUgZmlsZSBhcmUgZ2l2ZW4gYmVsb3cuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLVtsb2dnZXJzXQota2V5cz1yb290LGxvZzAyLGxvZzAzLGxvZzA0LGxvZzA1LGxvZzA2LGxvZzA3Ci0KLVtoYW5kbGVyc10KLWtleXM9aGFuZDAxLGhhbmQwMixoYW5kMDMsaGFuZDA0LGhhbmQwNSxoYW5kMDYsaGFuZDA3LGhhbmQwOCxoYW5kMDkKLQotW2Zvcm1hdHRlcnNdCi1rZXlzPWZvcm0wMSxmb3JtMDIsZm9ybTAzLGZvcm0wNCxmb3JtMDUsZm9ybTA2LGZvcm0wNyxmb3JtMDgsZm9ybTA5Ci1cZW5ke3ZlcmJhdGltfQotCi1UaGUgcm9vdCBsb2dnZXIgbXVzdCBzcGVjaWZ5IGEgbGV2ZWwgYW5kIGEgbGlzdCBvZiBoYW5kbGVycy4gQW4KLWV4YW1wbGUgb2YgYSByb290IGxvZ2dlciBzZWN0aW9uIGlzIGdpdmVuIGJlbG93LgotCi1cYmVnaW57dmVyYmF0aW19Ci1bbG9nZ2VyX3Jvb3RdCi1sZXZlbD1OT1RTRVQKLWhhbmRsZXJzPWhhbmQwMQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIFxjb2Rle2xldmVsfSBlbnRyeSBjYW4gYmUgb25lIG9mIFxjb2Rle0RFQlVHLCBJTkZPLCBXQVJOSU5HLAotRVJST1IsIENSSVRJQ0FMfSBvciBcY29kZXtOT1RTRVR9LiBGb3IgdGhlIHJvb3QgbG9nZ2VyIG9ubHksCi1cY29kZXtOT1RTRVR9IG1lYW5zIHRoYXQgYWxsIG1lc3NhZ2VzIHdpbGwgYmUgbG9nZ2VkLiBMZXZlbCB2YWx1ZXMgYXJlCi1cZnVuY3Rpb257ZXZhbCgpfXVhdGVkIGluIHRoZSBjb250ZXh0IG9mIHRoZSBcY29kZXtsb2dnaW5nfSBwYWNrYWdlJ3MKLW5hbWVzcGFjZS4KLQotVGhlIFxjb2Rle2hhbmRsZXJzfSBlbnRyeSBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGhhbmRsZXIgbmFtZXMsCi13aGljaCBtdXN0IGFwcGVhciBpbiB0aGUgXGNvZGV7W2hhbmRsZXJzXX0gc2VjdGlvbi4gVGhlc2UgbmFtZXMgbXVzdAotYXBwZWFyIGluIHRoZSBcY29kZXtbaGFuZGxlcnNdfSBzZWN0aW9uIGFuZCBoYXZlIGNvcnJlc3BvbmRpbmcKLXNlY3Rpb25zIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCi0KLUZvciBsb2dnZXJzIG90aGVyIHRoYW4gdGhlIHJvb3QgbG9nZ2VyLCBzb21lIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaXMKLXJlcXVpcmVkLiBUaGlzIGlzIGlsbHVzdHJhdGVkIGJ5IHRoZSBmb2xsb3dpbmcgZXhhbXBsZS4KLQotXGJlZ2lue3ZlcmJhdGltfQotW2xvZ2dlcl9wYXJzZXJdCi1sZXZlbD1ERUJVRwotaGFuZGxlcnM9aGFuZDAxCi1wcm9wYWdhdGU9MQotcXVhbG5hbWU9Y29tcGlsZXIucGFyc2VyCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgXGNvZGV7bGV2ZWx9IGFuZCBcY29kZXtoYW5kbGVyc30gZW50cmllcyBhcmUgaW50ZXJwcmV0ZWQgYXMgZm9yCi10aGUgcm9vdCBsb2dnZXIsIGV4Y2VwdCB0aGF0IGlmIGEgbm9uLXJvb3QgbG9nZ2VyJ3MgbGV2ZWwgaXMgc3BlY2lmaWVkCi1hcyBcY29kZXtOT1RTRVR9LCB0aGUgc3lzdGVtIGNvbnN1bHRzIGxvZ2dlcnMgaGlnaGVyIHVwIHRoZSBoaWVyYXJjaHkKLXRvIGRldGVybWluZSB0aGUgZWZmZWN0aXZlIGxldmVsIG9mIHRoZSBsb2dnZXIuIFRoZSBcY29kZXtwcm9wYWdhdGV9Ci1lbnRyeSBpcyBzZXQgdG8gMSB0byBpbmRpY2F0ZSB0aGF0IG1lc3NhZ2VzIG11c3QgcHJvcGFnYXRlIHRvIGhhbmRsZXJzCi1oaWdoZXIgdXAgdGhlIGxvZ2dlciBoaWVyYXJjaHkgZnJvbSB0aGlzIGxvZ2dlciwgb3IgMCB0byBpbmRpY2F0ZSB0aGF0Ci1tZXNzYWdlcyBhcmUgXHN0cm9uZ3tub3R9IHByb3BhZ2F0ZWQgdG8gaGFuZGxlcnMgdXAgdGhlIGhpZXJhcmNoeS4gVGhlCi1cY29kZXtxdWFsbmFtZX0gZW50cnkgaXMgdGhlIGhpZXJhcmNoaWNhbCBjaGFubmVsIG5hbWUgb2YgdGhlIGxvZ2dlciwKLXRoYXQgaXMgdG8gc2F5IHRoZSBuYW1lIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHRvIGdldCB0aGUgbG9nZ2VyLgotCi1TZWN0aW9ucyB3aGljaCBzcGVjaWZ5IGhhbmRsZXIgY29uZmlndXJhdGlvbiBhcmUgZXhlbXBsaWZpZWQgYnkgdGhlCi1mb2xsb3dpbmcuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLVtoYW5kbGVyX2hhbmQwMV0KLWNsYXNzPVN0cmVhbUhhbmRsZXIKLWxldmVsPU5PVFNFVAotZm9ybWF0dGVyPWZvcm0wMQotYXJncz0oc3lzLnN0ZG91dCwpCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgXGNvZGV7Y2xhc3N9IGVudHJ5IGluZGljYXRlcyB0aGUgaGFuZGxlcidzIGNsYXNzIChhcyBkZXRlcm1pbmVkIGJ5Ci1cZnVuY3Rpb257ZXZhbCgpfSBpbiB0aGUgXGNvZGV7bG9nZ2luZ30gcGFja2FnZSdzIG5hbWVzcGFjZSkuIFRoZQotXGNvZGV7bGV2ZWx9IGlzIGludGVycHJldGVkIGFzIGZvciBsb2dnZXJzLCBhbmQgXGNvZGV7Tk9UU0VUfSBpcyB0YWtlbgotdG8gbWVhbiAibG9nIGV2ZXJ5dGhpbmciLgotCi1UaGUgXGNvZGV7Zm9ybWF0dGVyfSBlbnRyeSBpbmRpY2F0ZXMgdGhlIGtleSBuYW1lIG9mIHRoZSBmb3JtYXR0ZXIgZm9yCi10aGlzIGhhbmRsZXIuIElmIGJsYW5rLCBhIGRlZmF1bHQgZm9ybWF0dGVyCi0oXGNvZGV7bG9nZ2luZy5fZGVmYXVsdEZvcm1hdHRlcn0pIGlzIHVzZWQuIElmIGEgbmFtZSBpcyBzcGVjaWZpZWQsIGl0Ci1tdXN0IGFwcGVhciBpbiB0aGUgXGNvZGV7W2Zvcm1hdHRlcnNdfSBzZWN0aW9uIGFuZCBoYXZlIGEKLWNvcnJlc3BvbmRpbmcgc2VjdGlvbiBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgotCi1UaGUgXGNvZGV7YXJnc30gZW50cnksIHdoZW4gXGZ1bmN0aW9ue2V2YWwoKX11YXRlZCBpbiB0aGUgY29udGV4dCBvZgotdGhlIFxjb2Rle2xvZ2dpbmd9IHBhY2thZ2UncyBuYW1lc3BhY2UsIGlzIHRoZSBsaXN0IG9mIGFyZ3VtZW50cyB0bwotdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgaGFuZGxlciBjbGFzcy4gUmVmZXIgdG8gdGhlIGNvbnN0cnVjdG9ycyBmb3IKLXRoZSByZWxldmFudCBoYW5kbGVycywgb3IgdG8gdGhlIGV4YW1wbGVzIGJlbG93LCB0byBzZWUgaG93IHR5cGljYWwKLWVudHJpZXMgYXJlIGNvbnN0cnVjdGVkLgotCi1cYmVnaW57dmVyYmF0aW19Ci1baGFuZGxlcl9oYW5kMDJdCi1jbGFzcz1GaWxlSGFuZGxlcgotbGV2ZWw9REVCVUcKLWZvcm1hdHRlcj1mb3JtMDIKLWFyZ3M9KCdweXRob24ubG9nJywgJ3cnKQotCi1baGFuZGxlcl9oYW5kMDNdCi1jbGFzcz1oYW5kbGVycy5Tb2NrZXRIYW5kbGVyCi1sZXZlbD1JTkZPCi1mb3JtYXR0ZXI9Zm9ybTAzCi1hcmdzPSgnbG9jYWxob3N0JywgaGFuZGxlcnMuREVGQVVMVF9UQ1BfTE9HR0lOR19QT1JUKQotCi1baGFuZGxlcl9oYW5kMDRdCi1jbGFzcz1oYW5kbGVycy5EYXRhZ3JhbUhhbmRsZXIKLWxldmVsPVdBUk4KLWZvcm1hdHRlcj1mb3JtMDQKLWFyZ3M9KCdsb2NhbGhvc3QnLCBoYW5kbGVycy5ERUZBVUxUX1VEUF9MT0dHSU5HX1BPUlQpCi0KLVtoYW5kbGVyX2hhbmQwNV0KLWNsYXNzPWhhbmRsZXJzLlN5c0xvZ0hhbmRsZXIKLWxldmVsPUVSUk9SCi1mb3JtYXR0ZXI9Zm9ybTA1Ci1hcmdzPSgoJ2xvY2FsaG9zdCcsIGhhbmRsZXJzLlNZU0xPR19VRFBfUE9SVCksIGhhbmRsZXJzLlN5c0xvZ0hhbmRsZXIuTE9HX1VTRVIpCi0KLVtoYW5kbGVyX2hhbmQwNl0KLWNsYXNzPWhhbmRsZXJzLk5URXZlbnRMb2dIYW5kbGVyCi1sZXZlbD1DUklUSUNBTAotZm9ybWF0dGVyPWZvcm0wNgotYXJncz0oJ1B5dGhvbiBBcHBsaWNhdGlvbicsICcnLCAnQXBwbGljYXRpb24nKQotCi1baGFuZGxlcl9oYW5kMDddCi1jbGFzcz1oYW5kbGVycy5TTVRQSGFuZGxlcgotbGV2ZWw9V0FSTgotZm9ybWF0dGVyPWZvcm0wNwotYXJncz0oJ2xvY2FsaG9zdCcsICdmcm9tQGFiYycsIFsndXNlcjFAYWJjJywgJ3VzZXIyQHh5eiddLCAnTG9nZ2VyIFN1YmplY3QnKQotCi1baGFuZGxlcl9oYW5kMDhdCi1jbGFzcz1oYW5kbGVycy5NZW1vcnlIYW5kbGVyCi1sZXZlbD1OT1RTRVQKLWZvcm1hdHRlcj1mb3JtMDgKLXRhcmdldD0KLWFyZ3M9KDEwLCBFUlJPUikKLQotW2hhbmRsZXJfaGFuZDA5XQotY2xhc3M9aGFuZGxlcnMuSFRUUEhhbmRsZXIKLWxldmVsPU5PVFNFVAotZm9ybWF0dGVyPWZvcm0wOQotYXJncz0oJ2xvY2FsaG9zdDo5MDIyJywgJy9sb2cnLCAnR0VUJykKLVxlbmR7dmVyYmF0aW19Ci0KLVNlY3Rpb25zIHdoaWNoIHNwZWNpZnkgZm9ybWF0dGVyIGNvbmZpZ3VyYXRpb24gYXJlIHR5cGlmaWVkIGJ5IHRoZSBmb2xsb3dpbmcuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLVtmb3JtYXR0ZXJfZm9ybTAxXQotZm9ybWF0PUYxICUoYXNjdGltZSlzICUobGV2ZWxuYW1lKXMgJShtZXNzYWdlKXMKLWRhdGVmbXQ9Ci1jbGFzcz1sb2dnaW5nLkZvcm1hdHRlcgotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIFxjb2Rle2Zvcm1hdH0gZW50cnkgaXMgdGhlIG92ZXJhbGwgZm9ybWF0IHN0cmluZywgYW5kIHRoZQotXGNvZGV7ZGF0ZWZtdH0gZW50cnkgaXMgdGhlIFxmdW5jdGlvbntzdHJmdGltZSgpfS1jb21wYXRpYmxlIGRhdGUvdGltZSBmb3JtYXQKLXN0cmluZy4gSWYgZW1wdHksIHRoZSBwYWNrYWdlIHN1YnN0aXR1dGVzIElTTzg2MDEgZm9ybWF0IGRhdGUvdGltZXMsIHdoaWNoCi1pcyBhbG1vc3QgZXF1aXZhbGVudCB0byBzcGVjaWZ5aW5nIHRoZSBkYXRlIGZvcm1hdCBzdHJpbmcgIiVZLSVtLSVkICVIOiVNOiVTIi4KLVRoZSBJU084NjAxIGZvcm1hdCBhbHNvIHNwZWNpZmllcyBtaWxsaXNlY29uZHMsIHdoaWNoIGFyZSBhcHBlbmRlZCB0byB0aGUKLXJlc3VsdCBvZiB1c2luZyB0aGUgYWJvdmUgZm9ybWF0IHN0cmluZywgd2l0aCBhIGNvbW1hIHNlcGFyYXRvci4gQW4gZXhhbXBsZQotdGltZSBpbiBJU084NjAxIGZvcm1hdCBpcyBcY29kZXsyMDAzLTAxLTIzIDAwOjI5OjUwLDQxMX0uCi0KLVRoZSBcY29kZXtjbGFzc30gZW50cnkgaXMgb3B0aW9uYWwuICBJdCBpbmRpY2F0ZXMgdGhlIG5hbWUgb2YgdGhlCi1mb3JtYXR0ZXIncyBjbGFzcyAoYXMgYSBkb3R0ZWQgbW9kdWxlIGFuZCBjbGFzcyBuYW1lLikgIFRoaXMgb3B0aW9uIGlzCi11c2VmdWwgZm9yIGluc3RhbnRpYXRpbmcgYSBcY2xhc3N7Rm9ybWF0dGVyfSBzdWJjbGFzcy4gIFN1YmNsYXNzZXMgb2YKLVxjbGFzc3tGb3JtYXR0ZXJ9IGNhbiBwcmVzZW50IGV4Y2VwdGlvbiB0cmFjZWJhY2tzIGluIGFuIGV4cGFuZGVkIG9yCi1jb25kZW5zZWQgZm9ybWF0LgpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJtYWlsYm94LnRleCBiL0RvYy9saWIvbGlibWFpbGJveC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZTdmZmQuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJtYWlsYm94LnRleAorKysgL2Rldi9udWxsCkBAIC0xLDE0NDMgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXttYWlsYm94fSAtLS0KLSAgICAgICAgICBNYW5pcHVsYXRlIG1haWxib3hlcyBpbiB2YXJpb3VzIGZvcm1hdHN9Ci0KLVxkZWNsYXJlbW9kdWxle317bWFpbGJveH0KLVxtb2R1bGVhdXRob3J7R3JlZ29yeSBLLn5Kb2huc29ufXtna2pAZ3JlZ29yeWtqb2huc29uLmNvbX0KLVxzZWN0aW9uYXV0aG9ye0dyZWdvcnkgSy5+Sm9obnNvbn17Z2tqQGdyZWdvcnlram9obnNvbi5jb219Ci1cbW9kdWxlc3lub3BzaXN7TWFuaXB1bGF0ZSBtYWlsYm94ZXMgaW4gdmFyaW91cyBmb3JtYXRzfQotCi0KLVRoaXMgbW9kdWxlIGRlZmluZXMgdHdvIGNsYXNzZXMsIFxjbGFzc3tNYWlsYm94fSBhbmQgXGNsYXNze01lc3NhZ2V9LCBmb3IKLWFjY2Vzc2luZyBhbmQgbWFuaXB1bGF0aW5nIG9uLWRpc2sgbWFpbGJveGVzIGFuZCB0aGUgbWVzc2FnZXMgdGhleSBjb250YWluLgotXGNsYXNze01haWxib3h9IG9mZmVycyBhIGRpY3Rpb25hcnktbGlrZSBtYXBwaW5nIGZyb20ga2V5cyB0byBtZXNzYWdlcy4KLVxjbGFzc3tNZXNzYWdlfSBleHRlbmRzIHRoZSBcbW9kdWxle2VtYWlsLk1lc3NhZ2V9IG1vZHVsZSdzIFxjbGFzc3tNZXNzYWdlfQotY2xhc3Mgd2l0aCBmb3JtYXQtc3BlY2lmaWMgc3RhdGUgYW5kIGJlaGF2aW9yLiBTdXBwb3J0ZWQgbWFpbGJveCBmb3JtYXRzIGFyZQotTWFpbGRpciwgbWJveCwgTUgsIEJhYnlsLCBhbmQgTU1ERi4KLQotXGJlZ2lue3NlZWFsc299Ci0gICAgXHNlZW1vZHVsZXtlbWFpbH17UmVwcmVzZW50IGFuZCBtYW5pcHVsYXRlIG1lc3NhZ2VzLn0KLVxlbmR7c2VlYWxzb30KLQotXHN1YnNlY3Rpb257XGNsYXNze01haWxib3h9IG9iamVjdHN9Ci1cbGFiZWx7bWFpbGJveC1vYmplY3RzfQotCi1cYmVnaW57Y2xhc3NkZXNjKn17TWFpbGJveH0KLUEgbWFpbGJveCwgd2hpY2ggbWF5IGJlIGluc3BlY3RlZCBhbmQgbW9kaWZpZWQuCi1cZW5ke2NsYXNzZGVzYyp9Ci0KLVRoZSBcY2xhc3N7TWFpbGJveH0gY2xhc3MgZGVmaW5lcyBhbiBpbnRlcmZhY2UgYW5kCi1pcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkLiAgSW5zdGVhZCwgZm9ybWF0LXNwZWNpZmljCi1zdWJjbGFzc2VzIHNob3VsZCBpbmhlcml0IGZyb20gXGNsYXNze01haWxib3h9IGFuZCB5b3VyIGNvZGUKLXNob3VsZCBpbnN0YW50aWF0ZSBhIHBhcnRpY3VsYXIgc3ViY2xhc3MuCi0KLVRoZSBcY2xhc3N7TWFpbGJveH0gaW50ZXJmYWNlIGlzIGRpY3Rpb25hcnktbGlrZSwgd2l0aCBzbWFsbCBrZXlzCi1jb3JyZXNwb25kaW5nIHRvIG1lc3NhZ2VzLiBLZXlzIGFyZSBpc3N1ZWQgYnkgdGhlIFxjbGFzc3tNYWlsYm94fQotaW5zdGFuY2Ugd2l0aCB3aGljaCB0aGV5IHdpbGwgYmUgdXNlZCBhbmQgYXJlIG9ubHkgbWVhbmluZ2Z1bCB0byB0aGF0Ci1cY2xhc3N7TWFpbGJveH0gaW5zdGFuY2UuIEEga2V5IGNvbnRpbnVlcyB0byBpZGVudGlmeSBhIG1lc3NhZ2UgZXZlbgotaWYgdGhlIGNvcnJlc3BvbmRpbmcgbWVzc2FnZSBpcyBtb2RpZmllZCwgc3VjaCBhcyBieSByZXBsYWNpbmcgaXQgd2l0aAotYW5vdGhlciBtZXNzYWdlLgotCi1NZXNzYWdlcyBtYXkgYmUgYWRkZWQgdG8gYSBcY2xhc3N7TWFpbGJveH0gaW5zdGFuY2UgdXNpbmcgdGhlIHNldC1saWtlCi1tZXRob2QgXG1ldGhvZHthZGQoKX0gYW5kIHJlbW92ZWQgdXNpbmcgYSBcY29kZXtkZWx9IHN0YXRlbWVudCBvciB0aGUKLXNldC1saWtlIG1ldGhvZHMgXG1ldGhvZHtyZW1vdmUoKX0gYW5kIFxtZXRob2R7ZGlzY2FyZCgpfS4KLQotXGNsYXNze01haWxib3h9IGludGVyZmFjZSBzZW1hbnRpY3MgZGlmZmVyIGZyb20gZGljdGlvbmFyeSBzZW1hbnRpY3MgaW4gc29tZQotbm90ZXdvcnRoeSB3YXlzLiBFYWNoIHRpbWUgYSBtZXNzYWdlIGlzIHJlcXVlc3RlZCwgYSBuZXcKLXJlcHJlc2VudGF0aW9uICh0eXBpY2FsbHkgYSBcY2xhc3N7TWVzc2FnZX0gaW5zdGFuY2UpIGlzIGdlbmVyYXRlZAotYmFzZWQgdXBvbiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbWFpbGJveC4gU2ltaWxhcmx5LCB3aGVuIGEgbWVzc2FnZQotaXMgYWRkZWQgdG8gYSBcY2xhc3N7TWFpbGJveH0gaW5zdGFuY2UsIHRoZSBwcm92aWRlZCBtZXNzYWdlCi1yZXByZXNlbnRhdGlvbidzIGNvbnRlbnRzIGFyZSBjb3BpZWQuIEluIG5laXRoZXIgY2FzZSBpcyBhIHJlZmVyZW5jZQotdG8gdGhlIG1lc3NhZ2UgcmVwcmVzZW50YXRpb24ga2VwdCBieSB0aGUgXGNsYXNze01haWxib3h9IGluc3RhbmNlLgotCi1UaGUgZGVmYXVsdCBcY2xhc3N7TWFpbGJveH0gaXRlcmF0b3IgaXRlcmF0ZXMgb3ZlciBtZXNzYWdlIHJlcHJlc2VudGF0aW9ucywgbm90Ci1rZXlzIGFzIHRoZSBkZWZhdWx0IGRpY3Rpb25hcnkgaXRlcmF0b3IgZG9lcy4gTW9yZW92ZXIsIG1vZGlmaWNhdGlvbiBvZiBhCi1tYWlsYm94IGR1cmluZyBpdGVyYXRpb24gaXMgc2FmZSBhbmQgd2VsbC1kZWZpbmVkLiBNZXNzYWdlcyBhZGRlZCB0byB0aGUKLW1haWxib3ggYWZ0ZXIgYW4gaXRlcmF0b3IgaXMgY3JlYXRlZCB3aWxsIG5vdCBiZSBzZWVuIGJ5IHRoZSBpdGVyYXRvci4gTWVzc2FnZXMKLXJlbW92ZWQgZnJvbSB0aGUgbWFpbGJveCBiZWZvcmUgdGhlIGl0ZXJhdG9yIHlpZWxkcyB0aGVtIHdpbGwgYmUgc2lsZW50bHkKLXNraXBwZWQsIHRob3VnaCB1c2luZyBhIGtleSBmcm9tIGFuIGl0ZXJhdG9yIG1heSByZXN1bHQgaW4gYQotXGV4Y2VwdGlvbntLZXlFcnJvcn0gZXhjZXB0aW9uIGlmIHRoZSBjb3JyZXNwb25kaW5nIG1lc3NhZ2UgaXMgc3Vic2VxdWVudGx5Ci1yZW1vdmVkLgotCi1cYmVnaW57bm90aWNlfVt3YXJuaW5nXQotQmUgdmVyeSBjYXV0aW91cyB3aGVuIG1vZGlmeWluZyBtYWlsYm94ZXMgdGhhdCBtaWdodCBiZQotc2ltdWx0YW5lb3VzbHkgY2hhbmdlZCBieSBzb21lIG90aGVyIHByb2Nlc3MuICBUaGUgc2FmZXN0IG1haWxib3gKLWZvcm1hdCB0byB1c2UgZm9yIHN1Y2ggdGFza3MgaXMgTWFpbGRpcjsgdHJ5IHRvIGF2b2lkIHVzaW5nCi1zaW5nbGUtZmlsZSBmb3JtYXRzIHN1Y2ggYXMgbWJveCBmb3IgY29uY3VycmVudCB3cml0aW5nLiAgSWYgeW91J3JlCi1tb2RpZnlpbmcgYSBtYWlsYm94LCB5b3UKLVxlbXBoe211c3R9IGxvY2sgaXQgYnkgY2FsbGluZyB0aGUgXG1ldGhvZHtsb2NrKCl9IGFuZAotXG1ldGhvZHt1bmxvY2soKX0gbWV0aG9kcyBcZW1waHtiZWZvcmV9IHJlYWRpbmcgYW55IG1lc3NhZ2VzIGluIHRoZSBmaWxlCi1vciBtYWtpbmcgYW55IGNoYW5nZXMgYnkgYWRkaW5nIG9yIGRlbGV0aW5nIGEgbWVzc2FnZS4gIEZhaWxpbmcgdG8KLWxvY2sgdGhlIG1haWxib3ggcnVucyB0aGUgcmlzayBvZiBsb3NpbmcgbWVzc2FnZXMgb3IgY29ycnVwdGluZyB0aGUgZW50aXJlCi1tYWlsYm94LgotXGVuZHtub3RpY2V9Ci0KLVxjbGFzc3tNYWlsYm94fSBpbnN0YW5jZXMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfXthZGR9e21lc3NhZ2V9Ci1BZGQgXHZhcnttZXNzYWdlfSB0byB0aGUgbWFpbGJveCBhbmQgcmV0dXJuIHRoZSBrZXkgdGhhdCBoYXMgYmVlbiBhc3NpZ25lZCB0bwotaXQuCi0KLVBhcmFtZXRlciBcdmFye21lc3NhZ2V9IG1heSBiZSBhIFxjbGFzc3tNZXNzYWdlfSBpbnN0YW5jZSwgYW4KLVxjbGFzc3tlbWFpbC5NZXNzYWdlLk1lc3NhZ2V9IGluc3RhbmNlLCBhIHN0cmluZywgb3IgYSBmaWxlLWxpa2Ugb2JqZWN0ICh3aGljaAotc2hvdWxkIGJlIG9wZW4gaW4gdGV4dCBtb2RlKS4gSWYgXHZhcnttZXNzYWdlfSBpcyBhbiBpbnN0YW5jZSBvZiB0aGUKLWFwcHJvcHJpYXRlIGZvcm1hdC1zcGVjaWZpYyBcY2xhc3N7TWVzc2FnZX0gc3ViY2xhc3MgKGUuZy4sIGlmIGl0J3MgYW4KLVxjbGFzc3ttYm94TWVzc2FnZX0gaW5zdGFuY2UgYW5kIHRoaXMgaXMgYW4gXGNsYXNze21ib3h9IGluc3RhbmNlKSwgaXRzCi1mb3JtYXQtc3BlY2lmaWMgaW5mb3JtYXRpb24gaXMgdXNlZC4gT3RoZXJ3aXNlLCByZWFzb25hYmxlIGRlZmF1bHRzIGZvcgotZm9ybWF0LXNwZWNpZmljIGluZm9ybWF0aW9uIGFyZSB1c2VkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317cmVtb3ZlfXtrZXl9Ci1cbWV0aG9kbGluZXtfX2RlbGl0ZW1fX317a2V5fQotXG1ldGhvZGxpbmV7ZGlzY2FyZH17a2V5fQotRGVsZXRlIHRoZSBtZXNzYWdlIGNvcnJlc3BvbmRpbmcgdG8gXHZhcntrZXl9IGZyb20gdGhlIG1haWxib3guCi0KLUlmIG5vIHN1Y2ggbWVzc2FnZSBleGlzdHMsIGEgXGV4Y2VwdGlvbntLZXlFcnJvcn0gZXhjZXB0aW9uIGlzIHJhaXNlZCBpZiB0aGUKLW1ldGhvZCB3YXMgY2FsbGVkIGFzIFxtZXRob2R7cmVtb3ZlKCl9IG9yIFxtZXRob2R7X19kZWxpdGVtX18oKX0gYnV0IG5vCi1leGNlcHRpb24gaXMgcmFpc2VkIGlmIHRoZSBtZXRob2Qgd2FzIGNhbGxlZCBhcyBcbWV0aG9ke2Rpc2NhcmQoKX0uIFRoZQotYmVoYXZpb3Igb2YgXG1ldGhvZHtkaXNjYXJkKCl9IG1heSBiZSBwcmVmZXJyZWQgaWYgdGhlIHVuZGVybHlpbmcgbWFpbGJveAotZm9ybWF0IHN1cHBvcnRzIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIGJ5IG90aGVyIHByb2Nlc3Nlcy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e19fc2V0aXRlbV9ffXtrZXksIG1lc3NhZ2V9Ci1SZXBsYWNlIHRoZSBtZXNzYWdlIGNvcnJlc3BvbmRpbmcgdG8gXHZhcntrZXl9IHdpdGggXHZhcnttZXNzYWdlfS4gUmFpc2UgYQotXGV4Y2VwdGlvbntLZXlFcnJvcn0gZXhjZXB0aW9uIGlmIG5vIG1lc3NhZ2UgYWxyZWFkeSBjb3JyZXNwb25kcyB0byBcdmFye2tleX0uCi0KLUFzIHdpdGggXG1ldGhvZHthZGQoKX0sIHBhcmFtZXRlciBcdmFye21lc3NhZ2V9IG1heSBiZSBhIFxjbGFzc3tNZXNzYWdlfQotaW5zdGFuY2UsIGFuIFxjbGFzc3tlbWFpbC5NZXNzYWdlLk1lc3NhZ2V9IGluc3RhbmNlLCBhIHN0cmluZywgb3IgYSBmaWxlLWxpa2UKLW9iamVjdCAod2hpY2ggc2hvdWxkIGJlIG9wZW4gaW4gdGV4dCBtb2RlKS4gSWYgXHZhcnttZXNzYWdlfSBpcyBhbiBpbnN0YW5jZSBvZgotdGhlIGFwcHJvcHJpYXRlIGZvcm1hdC1zcGVjaWZpYyBcY2xhc3N7TWVzc2FnZX0gc3ViY2xhc3MgKGUuZy4sIGlmIGl0J3MgYW4KLVxjbGFzc3ttYm94TWVzc2FnZX0gaW5zdGFuY2UgYW5kIHRoaXMgaXMgYW4gXGNsYXNze21ib3h9IGluc3RhbmNlKSwgaXRzCi1mb3JtYXQtc3BlY2lmaWMgaW5mb3JtYXRpb24gaXMgdXNlZC4gT3RoZXJ3aXNlLCB0aGUgZm9ybWF0LXNwZWNpZmljIGluZm9ybWF0aW9uCi1vZiB0aGUgbWVzc2FnZSB0aGF0IGN1cnJlbnRseSBjb3JyZXNwb25kcyB0byBcdmFye2tleX0gaXMgbGVmdCB1bmNoYW5nZWQuIAotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317aXRlcmtleXN9e30KLVxtZXRob2RsaW5le2tleXN9e30KLVJldHVybiBhbiBpdGVyYXRvciBvdmVyIGFsbCBrZXlzIGlmIGNhbGxlZCBhcyBcbWV0aG9ke2l0ZXJrZXlzKCl9IG9yIHJldHVybiBhCi1saXN0IG9mIGtleXMgaWYgY2FsbGVkIGFzIFxtZXRob2R7a2V5cygpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2l0ZXJ2YWx1ZXN9e30KLVxtZXRob2RsaW5le19faXRlcl9ffXt9Ci1cbWV0aG9kbGluZXt2YWx1ZXN9e30KLVJldHVybiBhbiBpdGVyYXRvciBvdmVyIHJlcHJlc2VudGF0aW9ucyBvZiBhbGwgbWVzc2FnZXMgaWYgY2FsbGVkIGFzCi1cbWV0aG9ke2l0ZXJ2YWx1ZXMoKX0gb3IgXG1ldGhvZHtfX2l0ZXJfXygpfSBvciByZXR1cm4gYSBsaXN0IG9mIHN1Y2gKLXJlcHJlc2VudGF0aW9ucyBpZiBjYWxsZWQgYXMgXG1ldGhvZHt2YWx1ZXMoKX0uIFRoZSBtZXNzYWdlcyBhcmUgcmVwcmVzZW50ZWQgYXMKLWluc3RhbmNlcyBvZiB0aGUgYXBwcm9wcmlhdGUgZm9ybWF0LXNwZWNpZmljIFxjbGFzc3tNZXNzYWdlfSBzdWJjbGFzcyB1bmxlc3MgYQotY3VzdG9tIG1lc3NhZ2UgZmFjdG9yeSB3YXMgc3BlY2lmaWVkIHdoZW4gdGhlIFxjbGFzc3tNYWlsYm94fSBpbnN0YW5jZSB3YXMKLWluaXRpYWxpemVkLiBcbm90ZXtUaGUgYmVoYXZpb3Igb2YgXG1ldGhvZHtfX2l0ZXJfXygpfSBpcyB1bmxpa2UgdGhhdCBvZgotZGljdGlvbmFyaWVzLCB3aGljaCBpdGVyYXRlIG92ZXIga2V5cy59Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtpdGVyaXRlbXN9e30KLVxtZXRob2RsaW5le2l0ZW1zfXt9Ci1SZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciAoXHZhcntrZXl9LCBcdmFye21lc3NhZ2V9KSBwYWlycywgd2hlcmUgXHZhcntrZXl9IGlzIGEKLWtleSBhbmQgXHZhcnttZXNzYWdlfSBpcyBhIG1lc3NhZ2UgcmVwcmVzZW50YXRpb24sIGlmIGNhbGxlZCBhcwotXG1ldGhvZHtpdGVyaXRlbXMoKX0gb3IgcmV0dXJuIGEgbGlzdCBvZiBzdWNoIHBhaXJzIGlmIGNhbGxlZCBhcwotXG1ldGhvZHtpdGVtcygpfS4gVGhlIG1lc3NhZ2VzIGFyZSByZXByZXNlbnRlZCBhcyBpbnN0YW5jZXMgb2YgdGhlIGFwcHJvcHJpYXRlCi1mb3JtYXQtc3BlY2lmaWMgXGNsYXNze01lc3NhZ2V9IHN1YmNsYXNzIHVubGVzcyBhIGN1c3RvbSBtZXNzYWdlIGZhY3Rvcnkgd2FzCi1zcGVjaWZpZWQgd2hlbiB0aGUgXGNsYXNze01haWxib3h9IGluc3RhbmNlIHdhcyBpbml0aWFsaXplZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2dldH17a2V5XG9wdGlvbmFseywgZGVmYXVsdD1Ob25lfX0KLVxtZXRob2RsaW5le19fZ2V0aXRlbV9ffXtrZXl9Ci1SZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWVzc2FnZSBjb3JyZXNwb25kaW5nIHRvIFx2YXJ7a2V5fS4gSWYgbm8gc3VjaAotbWVzc2FnZSBleGlzdHMsIFx2YXJ7ZGVmYXVsdH0gaXMgcmV0dXJuZWQgaWYgdGhlIG1ldGhvZCB3YXMgY2FsbGVkIGFzCi1cbWV0aG9ke2dldCgpfSBhbmQgYSBcZXhjZXB0aW9ue0tleUVycm9yfSBleGNlcHRpb24gaXMgcmFpc2VkIGlmIHRoZSBtZXRob2Qgd2FzCi1jYWxsZWQgYXMgXG1ldGhvZHtfX2dldGl0ZW1fXygpfS4gVGhlIG1lc3NhZ2UgaXMgcmVwcmVzZW50ZWQgYXMgYW4gaW5zdGFuY2Ugb2YKLXRoZSBhcHByb3ByaWF0ZSBmb3JtYXQtc3BlY2lmaWMgXGNsYXNze01lc3NhZ2V9IHN1YmNsYXNzIHVubGVzcyBhIGN1c3RvbQotbWVzc2FnZSBmYWN0b3J5IHdhcyBzcGVjaWZpZWQgd2hlbiB0aGUgXGNsYXNze01haWxib3h9IGluc3RhbmNlIHdhcwotaW5pdGlhbGl6ZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtnZXRfbWVzc2FnZX17a2V5fQotUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1lc3NhZ2UgY29ycmVzcG9uZGluZyB0byBcdmFye2tleX0gYXMgYW4KLWluc3RhbmNlIG9mIHRoZSBhcHByb3ByaWF0ZSBmb3JtYXQtc3BlY2lmaWMgXGNsYXNze01lc3NhZ2V9IHN1YmNsYXNzLCBvciByYWlzZQotYSBcZXhjZXB0aW9ue0tleUVycm9yfSBleGNlcHRpb24gaWYgbm8gc3VjaCBtZXNzYWdlIGV4aXN0cy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2dldF9zdHJpbmd9e2tleX0KLVJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWVzc2FnZSBjb3JyZXNwb25kaW5nIHRvIFx2YXJ7a2V5fSwgb3IKLXJhaXNlIGEgXGV4Y2VwdGlvbntLZXlFcnJvcn0gZXhjZXB0aW9uIGlmIG5vIHN1Y2ggbWVzc2FnZSBleGlzdHMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtnZXRfZmlsZX17a2V5fQotUmV0dXJuIGEgZmlsZS1saWtlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXNzYWdlIGNvcnJlc3BvbmRpbmcgdG8gXHZhcntrZXl9LAotb3IgcmFpc2UgYSBcZXhjZXB0aW9ue0tleUVycm9yfSBleGNlcHRpb24gaWYgbm8gc3VjaCBtZXNzYWdlIGV4aXN0cy4gVGhlCi1maWxlLWxpa2Ugb2JqZWN0IGJlaGF2ZXMgYXMgaWYgb3BlbiBpbiBiaW5hcnkgbW9kZS4gVGhpcyBmaWxlIHNob3VsZCBiZSBjbG9zZWQKLW9uY2UgaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KLQotXG5vdGV7VW5saWtlIG90aGVyIHJlcHJlc2VudGF0aW9ucyBvZiBtZXNzYWdlcywgZmlsZS1saWtlIHJlcHJlc2VudGF0aW9ucyBhcmUKLW5vdCBuZWNlc3NhcmlseSBpbmRlcGVuZGVudCBvZiB0aGUgXGNsYXNze01haWxib3h9IGluc3RhbmNlIHRoYXQgY3JlYXRlZCB0aGVtCi1vciBvZiB0aGUgdW5kZXJseWluZyBtYWlsYm94LiBNb3JlIHNwZWNpZmljIGRvY3VtZW50YXRpb24gaXMgcHJvdmlkZWQgYnkgZWFjaAotc3ViY2xhc3MufQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317aGFzX2tleX17a2V5fQotXG1ldGhvZGxpbmV7X19jb250YWluc19ffXtrZXl9Ci1SZXR1cm4gXGNvZGV7VHJ1ZX0gaWYgXHZhcntrZXl9IGNvcnJlc3BvbmRzIHRvIGEgbWVzc2FnZSwgXGNvZGV7RmFsc2V9Ci1vdGhlcndpc2UuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtfX2xlbl9ffXt9Ci1SZXR1cm4gYSBjb3VudCBvZiBtZXNzYWdlcyBpbiB0aGUgbWFpbGJveC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2NsZWFyfXt9Ci1EZWxldGUgYWxsIG1lc3NhZ2VzIGZyb20gdGhlIG1haWxib3guCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtwb3B9e2tleVxvcHRpb25hbHssIGRlZmF1bHR9fQotUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1lc3NhZ2UgY29ycmVzcG9uZGluZyB0byBcdmFye2tleX0gYW5kIGRlbGV0ZQotdGhlIG1lc3NhZ2UuIElmIG5vIHN1Y2ggbWVzc2FnZSBleGlzdHMsIHJldHVybiBcdmFye2RlZmF1bHR9IGlmIGl0IHdhcyBzdXBwbGllZAotb3IgZWxzZSByYWlzZSBhIFxleGNlcHRpb257S2V5RXJyb3J9IGV4Y2VwdGlvbi4gVGhlIG1lc3NhZ2UgaXMgcmVwcmVzZW50ZWQgYXMKLWFuIGluc3RhbmNlIG9mIHRoZSBhcHByb3ByaWF0ZSBmb3JtYXQtc3BlY2lmaWMgXGNsYXNze01lc3NhZ2V9IHN1YmNsYXNzIHVubGVzcwotYSBjdXN0b20gbWVzc2FnZSBmYWN0b3J5IHdhcyBzcGVjaWZpZWQgd2hlbiB0aGUgXGNsYXNze01haWxib3h9IGluc3RhbmNlIHdhcwotaW5pdGlhbGl6ZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtwb3BpdGVtfXt9Ci1SZXR1cm4gYW4gYXJiaXRyYXJ5IChcdmFye2tleX0sIFx2YXJ7bWVzc2FnZX0pIHBhaXIsIHdoZXJlIFx2YXJ7a2V5fSBpcyBhIGtleQotYW5kIFx2YXJ7bWVzc2FnZX0gaXMgYSBtZXNzYWdlIHJlcHJlc2VudGF0aW9uLCBhbmQgZGVsZXRlIHRoZSBjb3JyZXNwb25kaW5nCi1tZXNzYWdlLiBJZiB0aGUgbWFpbGJveCBpcyBlbXB0eSwgcmFpc2UgYSBcZXhjZXB0aW9ue0tleUVycm9yfSBleGNlcHRpb24uIFRoZQotbWVzc2FnZSBpcyByZXByZXNlbnRlZCBhcyBhbiBpbnN0YW5jZSBvZiB0aGUgYXBwcm9wcmlhdGUgZm9ybWF0LXNwZWNpZmljCi1cY2xhc3N7TWVzc2FnZX0gc3ViY2xhc3MgdW5sZXNzIGEgY3VzdG9tIG1lc3NhZ2UgZmFjdG9yeSB3YXMgc3BlY2lmaWVkIHdoZW4gdGhlCi1cY2xhc3N7TWFpbGJveH0gaW5zdGFuY2Ugd2FzIGluaXRpYWxpemVkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317dXBkYXRlfXthcmd9Ci1QYXJhbWV0ZXIgXHZhcnthcmd9IHNob3VsZCBiZSBhIFx2YXJ7a2V5fS10by1cdmFye21lc3NhZ2V9IG1hcHBpbmcgb3IgYW4KLWl0ZXJhYmxlIG9mIChcdmFye2tleX0sIFx2YXJ7bWVzc2FnZX0pIHBhaXJzLiBVcGRhdGVzIHRoZSBtYWlsYm94IHNvIHRoYXQsIGZvcgotZWFjaCBnaXZlbiBcdmFye2tleX0gYW5kIFx2YXJ7bWVzc2FnZX0sIHRoZSBtZXNzYWdlIGNvcnJlc3BvbmRpbmcgdG8gXHZhcntrZXl9Ci1pcyBzZXQgdG8gXHZhcnttZXNzYWdlfSBhcyBpZiBieSB1c2luZyBcbWV0aG9ke19fc2V0aXRlbV9fKCl9LiBBcyB3aXRoCi1cbWV0aG9ke19fc2V0aXRlbV9fKCl9LCBlYWNoIFx2YXJ7a2V5fSBtdXN0IGFscmVhZHkgY29ycmVzcG9uZCB0byBhIG1lc3NhZ2UgaW4KLXRoZSBtYWlsYm94IG9yIGVsc2UgYSBcZXhjZXB0aW9ue0tleUVycm9yfSBleGNlcHRpb24gd2lsbCBiZSByYWlzZWQsIHNvIGluCi1nZW5lcmFsIGl0IGlzIGluY29ycmVjdCBmb3IgXHZhcnthcmd9IHRvIGJlIGEgXGNsYXNze01haWxib3h9IGluc3RhbmNlLgotXG5vdGV7VW5saWtlIHdpdGggZGljdGlvbmFyaWVzLCBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgbm90IHN1cHBvcnRlZC59Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtmbHVzaH17fQotV3JpdGUgYW55IHBlbmRpbmcgY2hhbmdlcyB0byB0aGUgZmlsZXN5c3RlbS4gRm9yIHNvbWUgXGNsYXNze01haWxib3h9Ci1zdWJjbGFzc2VzLCBjaGFuZ2VzIGFyZSBhbHdheXMgd3JpdHRlbiBpbW1lZGlhdGVseSBhbmQgXG1ldGhvZHtmbHVzaCgpfSBkb2VzCi1ub3RoaW5nLCBidXQgeW91IHNob3VsZCBzdGlsbCBtYWtlIGEgaGFiaXQgb2YgY2FsbGluZyB0aGlzIG1ldGhvZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2xvY2t9e30KLUFjcXVpcmUgYW4gZXhjbHVzaXZlIGFkdmlzb3J5IGxvY2sgb24gdGhlIG1haWxib3ggc28gdGhhdCBvdGhlciBwcm9jZXNzZXMga25vdwotbm90IHRvIG1vZGlmeSBpdC4gQW4gXGV4Y2VwdGlvbntFeHRlcm5hbENsYXNoRXJyb3J9IGlzIHJhaXNlZCBpZiB0aGUgbG9jayBpcwotbm90IGF2YWlsYWJsZS4gVGhlIHBhcnRpY3VsYXIgbG9ja2luZyBtZWNoYW5pc21zIHVzZWQgZGVwZW5kIHVwb24gdGhlIG1haWxib3gKLWZvcm1hdC4gIFlvdSBzaG91bGQgXGVtcGh7YWx3YXlzfSBsb2NrIHRoZSBtYWlsYm94IGJlZm9yZSBtYWtpbmcgYW55IAotbW9kaWZpY2F0aW9ucyB0byBpdHMgY29udGVudHMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXt1bmxvY2t9e30KLVJlbGVhc2UgdGhlIGxvY2sgb24gdGhlIG1haWxib3gsIGlmIGFueS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2Nsb3NlfXt9Ci1GbHVzaCB0aGUgbWFpbGJveCwgdW5sb2NrIGl0IGlmIG5lY2Vzc2FyeSwgYW5kIGNsb3NlIGFueSBvcGVuIGZpbGVzLiBGb3Igc29tZQotXGNsYXNze01haWxib3h9IHN1YmNsYXNzZXMsIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cc3Vic3Vic2VjdGlvbntcY2xhc3N7TWFpbGRpcn19Ci1cbGFiZWx7bWFpbGJveC1tYWlsZGlyfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtNYWlsZGlyfXtkaXJuYW1lXG9wdGlvbmFseywgZmFjdG9yeT1yZmM4MjIuTWVzc2FnZVxvcHRpb25hbHssCi1jcmVhdGU9VHJ1ZX19fQotQSBzdWJjbGFzcyBvZiBcY2xhc3N7TWFpbGJveH0gZm9yIG1haWxib3hlcyBpbiBNYWlsZGlyIGZvcm1hdC4gUGFyYW1ldGVyCi1cdmFye2ZhY3Rvcnl9IGlzIGEgY2FsbGFibGUgb2JqZWN0IHRoYXQgYWNjZXB0cyBhIGZpbGUtbGlrZSBtZXNzYWdlCi1yZXByZXNlbnRhdGlvbiAod2hpY2ggYmVoYXZlcyBhcyBpZiBvcGVuZWQgaW4gYmluYXJ5IG1vZGUpIGFuZCByZXR1cm5zIGEgY3VzdG9tCi1yZXByZXNlbnRhdGlvbi4gSWYgXHZhcntmYWN0b3J5fSBpcyBcY29kZXtOb25lfSwgXGNsYXNze01haWxkaXJNZXNzYWdlfSBpcyB1c2VkCi1hcyB0aGUgZGVmYXVsdCBtZXNzYWdlIHJlcHJlc2VudGF0aW9uLiBJZiBcdmFye2NyZWF0ZX0gaXMgXGNvZGV7VHJ1ZX0sIHRoZQotbWFpbGJveCBpcyBjcmVhdGVkIGlmIGl0IGRvZXMgbm90IGV4aXN0LgotCi1JdCBpcyBmb3IgaGlzdG9yaWNhbCByZWFzb25zIHRoYXQgXHZhcntmYWN0b3J5fSBkZWZhdWx0cyB0bwotXGNsYXNze3JmYzgyMi5NZXNzYWdlfSBhbmQgdGhhdCBcdmFye2Rpcm5hbWV9IGlzIG5hbWVkIGFzIHN1Y2ggcmF0aGVyIHRoYW4KLVx2YXJ7cGF0aH0uIEZvciBhIFxjbGFzc3tNYWlsZGlyfSBpbnN0YW5jZSB0aGF0IGJlaGF2ZXMgbGlrZSBpbnN0YW5jZXMgb2Ygb3RoZXIKLVxjbGFzc3tNYWlsYm94fSBzdWJjbGFzc2VzLCBzZXQgXHZhcntmYWN0b3J5fSB0byBcY29kZXtOb25lfS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1NYWlsZGlyIGlzIGEgZGlyZWN0b3J5LWJhc2VkIG1haWxib3ggZm9ybWF0IGludmVudGVkIGZvciB0aGUgcW1haWwgbWFpbAotdHJhbnNmZXIgYWdlbnQgYW5kIG5vdyB3aWRlbHkgc3VwcG9ydGVkIGJ5IG90aGVyIHByb2dyYW1zLiBNZXNzYWdlcyBpbiBhCi1NYWlsZGlyIG1haWxib3ggYXJlIHN0b3JlZCBpbiBzZXBhcmF0ZSBmaWxlcyB3aXRoaW4gYSBjb21tb24gZGlyZWN0b3J5Ci1zdHJ1Y3R1cmUuIFRoaXMgZGVzaWduIGFsbG93cyBNYWlsZGlyIG1haWxib3hlcyB0byBiZSBhY2Nlc3NlZCBhbmQgbW9kaWZpZWQgYnkKLW11bHRpcGxlIHVucmVsYXRlZCBwcm9ncmFtcyB3aXRob3V0IGRhdGEgY29ycnVwdGlvbiwgc28gZmlsZSBsb2NraW5nIGlzCi11bm5lY2Vzc2FyeS4KLQotTWFpbGRpciBtYWlsYm94ZXMgY29udGFpbiB0aHJlZSBzdWJkaXJlY3RvcmllcywgbmFtZWx5OiBcZmlsZXt0bXB9LCBcZmlsZXtuZXd9LAotYW5kIFxmaWxle2N1cn0uIE1lc3NhZ2VzIGFyZSBjcmVhdGVkIG1vbWVudGFyaWx5IGluIHRoZSBcZmlsZXt0bXB9IHN1YmRpcmVjdG9yeQotYW5kIHRoZW4gbW92ZWQgdG8gdGhlIFxmaWxle25ld30gc3ViZGlyZWN0b3J5IHRvIGZpbmFsaXplIGRlbGl2ZXJ5LiBBIG1haWwgdXNlcgotYWdlbnQgbWF5IHN1YnNlcXVlbnRseSBtb3ZlIHRoZSBtZXNzYWdlIHRvIHRoZSBcZmlsZXtjdXJ9IHN1YmRpcmVjdG9yeSBhbmQKLXN0b3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0ZSBvZiB0aGUgbWVzc2FnZSBpbiBhIHNwZWNpYWwgImluZm8iIHNlY3Rpb24KLWFwcGVuZGVkIHRvIGl0cyBmaWxlIG5hbWUuCi0KLUZvbGRlcnMgb2YgdGhlIHN0eWxlIGludHJvZHVjZWQgYnkgdGhlIENvdXJpZXIgbWFpbCB0cmFuc2ZlciBhZ2VudCBhcmUgYWxzbwotc3VwcG9ydGVkLiBBbnkgc3ViZGlyZWN0b3J5IG9mIHRoZSBtYWluIG1haWxib3ggaXMgY29uc2lkZXJlZCBhIGZvbGRlciBpZgotXGNoYXJhY3RlcnsufSBpcyB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIGl0cyBuYW1lLiBGb2xkZXIgbmFtZXMgYXJlIHJlcHJlc2VudGVkCi1ieSBcY2xhc3N7TWFpbGRpcn0gd2l0aG91dCB0aGUgbGVhZGluZyBcY2hhcmFjdGVyey59LiBFYWNoIGZvbGRlciBpcyBpdHNlbGYgYQotTWFpbGRpciBtYWlsYm94IGJ1dCBzaG91bGQgbm90IGNvbnRhaW4gb3RoZXIgZm9sZGVycy4gSW5zdGVhZCwgYSBsb2dpY2FsCi1uZXN0aW5nIGlzIGluZGljYXRlZCB1c2luZyBcY2hhcmFjdGVyey59IHRvIGRlbGltaXQgbGV2ZWxzLCBlLmcuLAotIkFyY2hpdmVkLjIwMDUuMDciLgotCi1cYmVnaW57bm90aWNlfQotVGhlIE1haWxkaXIgc3BlY2lmaWNhdGlvbiByZXF1aXJlcyB0aGUgdXNlIG9mIGEgY29sb24gKFxjaGFyYWN0ZXJ7On0pIGluCi1jZXJ0YWluIG1lc3NhZ2UgZmlsZSBuYW1lcy4gSG93ZXZlciwgc29tZSBvcGVyYXRpbmcgc3lzdGVtcyBkbyBub3QgcGVybWl0IHRoaXMKLWNoYXJhY3RlciBpbiBmaWxlIG5hbWVzLCBJZiB5b3Ugd2lzaCB0byB1c2UgYSBNYWlsZGlyLWxpa2UgZm9ybWF0IG9uIHN1Y2ggYW4KLW9wZXJhdGluZyBzeXN0ZW0sIHlvdSBzaG91bGQgc3BlY2lmeSBhbm90aGVyIGNoYXJhY3RlciB0byB1c2UgaW5zdGVhZC4gVGhlCi1leGNsYW1hdGlvbiBwb2ludCAoXGNoYXJhY3RlcnshfSkgaXMgYSBwb3B1bGFyIGNob2ljZS4gRm9yIGV4YW1wbGU6Ci1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgbWFpbGJveAotbWFpbGJveC5NYWlsZGlyLmNvbG9uID0gJyEnCi1cZW5ke3ZlcmJhdGltfQotVGhlIFxtZW1iZXJ7Y29sb259IGF0dHJpYnV0ZSBtYXkgYWxzbyBiZSBzZXQgb24gYSBwZXItaW5zdGFuY2UgYmFzaXMuCi1cZW5ke25vdGljZX0KLQotXGNsYXNze01haWxkaXJ9IGluc3RhbmNlcyBoYXZlIGFsbCBvZiB0aGUgbWV0aG9kcyBvZiBcY2xhc3N7TWFpbGJveH0gaW4KLWFkZGl0aW9uIHRvIHRoZSBmb2xsb3dpbmc6Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtsaXN0X2ZvbGRlcnN9e30KLVJldHVybiBhIGxpc3Qgb2YgdGhlIG5hbWVzIG9mIGFsbCBmb2xkZXJzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Z2V0X2ZvbGRlcn17Zm9sZGVyfQotUmV0dXJuIGEgXGNsYXNze01haWxkaXJ9IGluc3RhbmNlIHJlcHJlc2VudGluZyB0aGUgZm9sZGVyIHdob3NlIG5hbWUgaXMKLVx2YXJ7Zm9sZGVyfS4gQSBcZXhjZXB0aW9ue05vU3VjaE1haWxib3hFcnJvcn0gZXhjZXB0aW9uIGlzIHJhaXNlZCBpZiB0aGUKLWZvbGRlciBkb2VzIG5vdCBleGlzdC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2FkZF9mb2xkZXJ9e2ZvbGRlcn0KLUNyZWF0ZSBhIGZvbGRlciB3aG9zZSBuYW1lIGlzIFx2YXJ7Zm9sZGVyfSBhbmQgcmV0dXJuIGEgXGNsYXNze01haWxkaXJ9Ci1pbnN0YW5jZSByZXByZXNlbnRpbmcgaXQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtyZW1vdmVfZm9sZGVyfXtmb2xkZXJ9Ci1EZWxldGUgdGhlIGZvbGRlciB3aG9zZSBuYW1lIGlzIFx2YXJ7Zm9sZGVyfS4gSWYgdGhlIGZvbGRlciBjb250YWlucyBhbnkKLW1lc3NhZ2VzLCBhIFxleGNlcHRpb257Tm90RW1wdHlFcnJvcn0gZXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkIGFuZCB0aGUgZm9sZGVyCi13aWxsIG5vdCBiZSBkZWxldGVkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Y2xlYW59e30KLURlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgZnJvbSB0aGUgbWFpbGJveCB0aGF0IGhhdmUgbm90IGJlZW4gYWNjZXNzZWQgaW4gdGhlCi1sYXN0IDM2IGhvdXJzLiBUaGUgTWFpbGRpciBzcGVjaWZpY2F0aW9uIHNheXMgdGhhdCBtYWlsLXJlYWRpbmcgcHJvZ3JhbXMKLXNob3VsZCBkbyB0aGlzIG9jY2FzaW9uYWxseS4KLVxlbmR7bWV0aG9kZGVzY30KLQotU29tZSBcY2xhc3N7TWFpbGJveH0gbWV0aG9kcyBpbXBsZW1lbnRlZCBieSBcY2xhc3N7TWFpbGRpcn0gZGVzZXJ2ZSBzcGVjaWFsCi1yZW1hcmtzOgotCi1cYmVnaW57bWV0aG9kZGVzY317YWRkfXttZXNzYWdlfQotXG1ldGhvZGxpbmVbTWFpbGRpcl17X19zZXRpdGVtX199e2tleSwgbWVzc2FnZX0KLVxtZXRob2RsaW5lW01haWxkaXJde3VwZGF0ZX17YXJnfQotXHdhcm5pbmd7VGhlc2UgbWV0aG9kcyBnZW5lcmF0ZSB1bmlxdWUgZmlsZSBuYW1lcyBiYXNlZCB1cG9uIHRoZSBjdXJyZW50Ci1wcm9jZXNzIElELiBXaGVuIHVzaW5nIG11bHRpcGxlIHRocmVhZHMsIHVuZGV0ZWN0ZWQgbmFtZSBjbGFzaGVzIG1heSBvY2N1ciBhbmQKLWNhdXNlIGNvcnJ1cHRpb24gb2YgdGhlIG1haWxib3ggdW5sZXNzIHRocmVhZHMgYXJlIGNvb3JkaW5hdGVkIHRvIGF2b2lkIHVzaW5nCi10aGVzZSBtZXRob2RzIHRvIG1hbmlwdWxhdGUgdGhlIHNhbWUgbWFpbGJveCBzaW11bHRhbmVvdXNseS59Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtmbHVzaH17fQotQWxsIGNoYW5nZXMgdG8gTWFpbGRpciBtYWlsYm94ZXMgYXJlIGltbWVkaWF0ZWx5IGFwcGxpZWQsIHNvIHRoaXMgbWV0aG9kIGRvZXMKLW5vdGhpbmcuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtsb2NrfXt9Ci1cbWV0aG9kbGluZXt1bmxvY2t9e30KLU1haWxkaXIgbWFpbGJveGVzIGRvIG5vdCBzdXBwb3J0IChvciByZXF1aXJlKSBsb2NraW5nLCBzbyB0aGVzZSBtZXRob2RzIGRvCi1ub3RoaW5nLiAKLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2Nsb3NlfXt9Ci1cY2xhc3N7TWFpbGRpcn0gaW5zdGFuY2VzIGRvIG5vdCBrZWVwIGFueSBvcGVuIGZpbGVzIGFuZCB0aGUgdW5kZXJseWluZwotbWFpbGJveGVzIGRvIG5vdCBzdXBwb3J0IGxvY2tpbmcsIHNvIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2dldF9maWxlfXtrZXl9Ci1EZXBlbmRpbmcgdXBvbiB0aGUgaG9zdCBwbGF0Zm9ybSwgaXQgbWF5IG5vdCBiZSBwb3NzaWJsZSB0byBtb2RpZnkgb3IgcmVtb3ZlCi10aGUgdW5kZXJseWluZyBtZXNzYWdlIHdoaWxlIHRoZSByZXR1cm5lZCBmaWxlIHJlbWFpbnMgb3Blbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue3NlZWFsc299Ci0gICAgXHNlZWxpbmt7aHR0cDovL3d3dy5xbWFpbC5vcmcvbWFuL21hbjUvbWFpbGRpci5odG1sfXttYWlsZGlyIG1hbiBwYWdlIGZyb20KLSAgICBxbWFpbH17VGhlIG9yaWdpbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGZvcm1hdC59Ci0gICAgXHNlZWxpbmt7aHR0cDovL2NyLnlwLnRvL3Byb3RvL21haWxkaXIuaHRtbH17VXNpbmcgbWFpbGRpciBmb3JtYXR9e05vdGVzCi0gICAgb24gTWFpbGRpciBieSBpdHMgaW52ZW50b3IuIEluY2x1ZGVzIGFuIHVwZGF0ZWQgbmFtZS1jcmVhdGlvbiBzY2hlbWUgYW5kCi0gICAgZGV0YWlscyBvbiAiaW5mbyIgc2VtYW50aWNzLn0KLSAgICBcc2VlbGlua3todHRwOi8vd3d3LmNvdXJpZXItbXRhLm9yZy8/bWFpbGRpci5odG1sfXttYWlsZGlyIG1hbiBwYWdlIGZyb20KLSAgICBDb3VyaWVyfXtBbm90aGVyIHNwZWNpZmljYXRpb24gb2YgdGhlIGZvcm1hdC4gRGVzY3JpYmVzIGEgY29tbW9uIGV4dGVuc2lvbgotICAgIGZvciBzdXBwb3J0aW5nIGZvbGRlcnMufQotXGVuZHtzZWVhbHNvfQotCi1cc3Vic3Vic2VjdGlvbntcY2xhc3N7bWJveH19Ci1cbGFiZWx7bWFpbGJveC1tYm94fQotCi1cYmVnaW57Y2xhc3NkZXNjfXttYm94fXtwYXRoXG9wdGlvbmFseywgZmFjdG9yeT1Ob25lXG9wdGlvbmFseywgY3JlYXRlPVRydWV9fX0KLUEgc3ViY2xhc3Mgb2YgXGNsYXNze01haWxib3h9IGZvciBtYWlsYm94ZXMgaW4gbWJveCBmb3JtYXQuIFBhcmFtZXRlcgotXHZhcntmYWN0b3J5fSBpcyBhIGNhbGxhYmxlIG9iamVjdCB0aGF0IGFjY2VwdHMgYSBmaWxlLWxpa2UgbWVzc2FnZQotcmVwcmVzZW50YXRpb24gKHdoaWNoIGJlaGF2ZXMgYXMgaWYgb3BlbmVkIGluIGJpbmFyeSBtb2RlKSBhbmQgcmV0dXJucyBhIGN1c3RvbQotcmVwcmVzZW50YXRpb24uIElmIFx2YXJ7ZmFjdG9yeX0gaXMgXGNvZGV7Tm9uZX0sIFxjbGFzc3ttYm94TWVzc2FnZX0gaXMgdXNlZCBhcwotdGhlIGRlZmF1bHQgbWVzc2FnZSByZXByZXNlbnRhdGlvbi4gSWYgXHZhcntjcmVhdGV9IGlzIFxjb2Rle1RydWV9LCB0aGUgbWFpbGJveAotaXMgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLVxlbmR7Y2xhc3NkZXNjfQotCi1UaGUgbWJveCBmb3JtYXQgaXMgdGhlIGNsYXNzaWMgZm9ybWF0IGZvciBzdG9yaW5nIG1haWwgb24gXFVOSVh7fSBzeXN0ZW1zLiBBbGwKLW1lc3NhZ2VzIGluIGFuIG1ib3ggbWFpbGJveCBhcmUgc3RvcmVkIGluIGEgc2luZ2xlIGZpbGUgd2l0aCB0aGUgYmVnaW5uaW5nIG9mCi1lYWNoIG1lc3NhZ2UgaW5kaWNhdGVkIGJ5IGEgbGluZSB3aG9zZSBmaXJzdCBmaXZlIGNoYXJhY3RlcnMgYXJlICJGcm9tfiIuCi0KLVNldmVyYWwgdmFyaWF0aW9ucyBvZiB0aGUgbWJveCBmb3JtYXQgZXhpc3QgdG8gYWRkcmVzcyBwZXJjZWl2ZWQgc2hvcnRjb21pbmdzCi1pbiB0aGUgb3JpZ2luYWwuIEluIHRoZSBpbnRlcmVzdCBvZiBjb21wYXRpYmlsaXR5LCBcY2xhc3N7bWJveH0gaW1wbGVtZW50cyB0aGUKLW9yaWdpbmFsIGZvcm1hdCwgd2hpY2ggaXMgc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIFxkZm57bWJveG99LiBUaGlzIG1lYW5zIHRoYXQKLXRoZSBcbWFpbGhlYWRlcntDb250ZW50LUxlbmd0aH0gaGVhZGVyLCBpZiBwcmVzZW50LCBpcyBpZ25vcmVkIGFuZCB0aGF0IGFueQotb2NjdXJyZW5jZXMgb2YgIkZyb21+IiBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZSBpbiBhIG1lc3NhZ2UgYm9keSBhcmUKLXRyYW5zZm9ybWVkIHRvICI+RnJvbX4iIHdoZW4gc3RvcmluZyB0aGUgbWVzc2FnZSwgYWx0aG91Z2ggb2NjdXJlbmNlcyBvZgotIj5Gcm9tfiIgYXJlIG5vdCB0cmFuc2Zvcm1lZCB0byAiRnJvbX4iIHdoZW4gcmVhZGluZyB0aGUgbWVzc2FnZS4KLQotU29tZSBcY2xhc3N7TWFpbGJveH0gbWV0aG9kcyBpbXBsZW1lbnRlZCBieSBcY2xhc3N7bWJveH0gZGVzZXJ2ZSBzcGVjaWFsCi1yZW1hcmtzOgotCi1cYmVnaW57bWV0aG9kZGVzY317Z2V0X2ZpbGV9e2tleX0KLVVzaW5nIHRoZSBmaWxlIGFmdGVyIGNhbGxpbmcgXG1ldGhvZHtmbHVzaCgpfSBvciBcbWV0aG9ke2Nsb3NlKCl9IG9uIHRoZQotXGNsYXNze21ib3h9IGluc3RhbmNlIG1heSB5aWVsZCB1bnByZWRpY3RhYmxlIHJlc3VsdHMgb3IgcmFpc2UgYW4gZXhjZXB0aW9uLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317bG9ja317fQotXG1ldGhvZGxpbmV7dW5sb2NrfXt9Ci1UaHJlZSBsb2NraW5nIG1lY2hhbmlzbXMgYXJlIHVzZWQtLS1kb3QgbG9ja2luZyBhbmQsIGlmIGF2YWlsYWJsZSwgdGhlCi1cY2Z1bmN0aW9ue2Zsb2NrKCl9IGFuZCBcY2Z1bmN0aW9ue2xvY2tmKCl9IHN5c3RlbSBjYWxscy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue3NlZWFsc299Ci0gICAgXHNlZWxpbmt7aHR0cDovL3d3dy5xbWFpbC5vcmcvbWFuL21hbjUvbWJveC5odG1sfXttYm94IG1hbiBwYWdlIGZyb20KLSAgICBxbWFpbH17QSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBmb3JtYXQgYW5kIGl0cyB2YXJpYXRpb25zLn0KLSAgICBcc2VlbGlua3todHRwOi8vd3d3LnRpbi5vcmcvYmluL21hbi5jZ2k/c2VjdGlvbj01XCZ0b3BpYz1tYm94fXttYm94IG1hbgotICAgIHBhZ2UgZnJvbSB0aW59e0Fub3RoZXIgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZm9ybWF0LCB3aXRoIGRldGFpbHMgb24KLSAgICBsb2NraW5nLn0KLSAgICBcc2VlbGlua3todHRwOi8vaG9tZS5uZXRzY2FwZS5jb20vZW5nL21vemlsbGEvMi4wL3JlbG5vdGVzL2RlbW8vY29udGVudC1sZW5ndGguaHRtbH0KLSAgICB7Q29uZmlndXJpbmcgTmV0c2NhcGUgTWFpbCBvbiBcVU5JWHt9OiBXaHkgVGhlIENvbnRlbnQtTGVuZ3RoIEZvcm1hdCBpcwotICAgIEJhZH17QW4gYXJndW1lbnQgZm9yIHVzaW5nIHRoZSBvcmlnaW5hbCBtYm94IGZvcm1hdCByYXRoZXIgdGhhbiBhCi0gICAgdmFyaWF0aW9uLn0KLSAgICBcc2VlbGlua3todHRwOi8vaG9tZXBhZ2VzLnRlc2NvLm5ldC4vXHRpbGRle31KLmRlQm95bmVQb2xsYXJkL0ZHQS9tYWlsLW1ib3gtZm9ybWF0cy5odG1sfQotICAgIHsibWJveCIgaXMgYSBmYW1pbHkgb2Ygc2V2ZXJhbCBtdXR1YWxseSBpbmNvbXBhdGlibGUgbWFpbGJveCBmb3JtYXRzfXtBCi0gICAgaGlzdG9yeSBvZiBtYm94IHZhcmlhdGlvbnMufQotXGVuZHtzZWVhbHNvfQotCi1cc3Vic3Vic2VjdGlvbntcY2xhc3N7TUh9fQotXGxhYmVse21haWxib3gtbWh9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e01IfXtwYXRoXG9wdGlvbmFseywgZmFjdG9yeT1Ob25lXG9wdGlvbmFseywgY3JlYXRlPVRydWV9fX0KLUEgc3ViY2xhc3Mgb2YgXGNsYXNze01haWxib3h9IGZvciBtYWlsYm94ZXMgaW4gTUggZm9ybWF0LiBQYXJhbWV0ZXIKLVx2YXJ7ZmFjdG9yeX0gaXMgYSBjYWxsYWJsZSBvYmplY3QgdGhhdCBhY2NlcHRzIGEgZmlsZS1saWtlIG1lc3NhZ2UKLXJlcHJlc2VudGF0aW9uICh3aGljaCBiZWhhdmVzIGFzIGlmIG9wZW5lZCBpbiBiaW5hcnkgbW9kZSkgYW5kIHJldHVybnMgYSBjdXN0b20KLXJlcHJlc2VudGF0aW9uLiBJZiBcdmFye2ZhY3Rvcnl9IGlzIFxjb2Rle05vbmV9LCBcY2xhc3N7TUhNZXNzYWdlfSBpcyB1c2VkIGFzCi10aGUgZGVmYXVsdCBtZXNzYWdlIHJlcHJlc2VudGF0aW9uLiBJZiBcdmFye2NyZWF0ZX0gaXMgXGNvZGV7VHJ1ZX0sIHRoZSBtYWlsYm94Ci1pcyBjcmVhdGVkIGlmIGl0IGRvZXMgbm90IGV4aXN0LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLU1IIGlzIGEgZGlyZWN0b3J5LWJhc2VkIG1haWxib3ggZm9ybWF0IGludmVudGVkIGZvciB0aGUgTUggTWVzc2FnZSBIYW5kbGluZwotU3lzdGVtLCBhIG1haWwgdXNlciBhZ2VudC4gRWFjaCBtZXNzYWdlIGluIGFuIE1IIG1haWxib3ggcmVzaWRlcyBpbiBpdHMgb3duCi1maWxlLiBBbiBNSCBtYWlsYm94IG1heSBjb250YWluIG90aGVyIE1IIG1haWxib3hlcyAoY2FsbGVkIFxkZm57Zm9sZGVyc30pIGluCi1hZGRpdGlvbiB0byBtZXNzYWdlcy4gRm9sZGVycyBtYXkgYmUgbmVzdGVkIGluZGVmaW5pdGVseS4gTUggbWFpbGJveGVzIGFsc28KLXN1cHBvcnQgXGRmbntzZXF1ZW5jZXN9LCB3aGljaCBhcmUgbmFtZWQgbGlzdHMgdXNlZCB0byBsb2dpY2FsbHkgZ3JvdXAgbWVzc2FnZXMKLXdpdGhvdXQgbW92aW5nIHRoZW0gdG8gc3ViLWZvbGRlcnMuIFNlcXVlbmNlcyBhcmUgZGVmaW5lZCBpbiBhIGZpbGUgY2FsbGVkCi1cZmlsZXsubWhfc2VxdWVuY2VzfSBpbiBlYWNoIGZvbGRlci4KLQotVGhlIFxjbGFzc3tNSH0gY2xhc3MgbWFuaXB1bGF0ZXMgTUggbWFpbGJveGVzLCBidXQgaXQgZG9lcyBub3QgYXR0ZW1wdCB0bwotZW11bGF0ZSBhbGwgb2YgXHByb2dyYW17bWh9J3MgYmVoYXZpb3JzLiBJbiBwYXJ0aWN1bGFyLCBpdCBkb2VzIG5vdCBtb2RpZnkgYW5kCi1pcyBub3QgYWZmZWN0ZWQgYnkgdGhlIFxmaWxle2NvbnRleHR9IG9yIFxmaWxley5taF9wcm9maWxlfSBmaWxlcyB0aGF0IGFyZSB1c2VkCi1ieSBccHJvZ3JhbXttaH0gdG8gc3RvcmUgaXRzIHN0YXRlIGFuZCBjb25maWd1cmF0aW9uLgotCi1cY2xhc3N7TUh9IGluc3RhbmNlcyBoYXZlIGFsbCBvZiB0aGUgbWV0aG9kcyBvZiBcY2xhc3N7TWFpbGJveH0gaW4gYWRkaXRpb24gdG8KLXRoZSBmb2xsb3dpbmc6Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtsaXN0X2ZvbGRlcnN9e30KLVJldHVybiBhIGxpc3Qgb2YgdGhlIG5hbWVzIG9mIGFsbCBmb2xkZXJzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Z2V0X2ZvbGRlcn17Zm9sZGVyfQotUmV0dXJuIGFuIFxjbGFzc3tNSH0gaW5zdGFuY2UgcmVwcmVzZW50aW5nIHRoZSBmb2xkZXIgd2hvc2UgbmFtZSBpcwotXHZhcntmb2xkZXJ9LiBBIFxleGNlcHRpb257Tm9TdWNoTWFpbGJveEVycm9yfSBleGNlcHRpb24gaXMgcmFpc2VkIGlmIHRoZQotZm9sZGVyIGRvZXMgbm90IGV4aXN0LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317YWRkX2ZvbGRlcn17Zm9sZGVyfQotQ3JlYXRlIGEgZm9sZGVyIHdob3NlIG5hbWUgaXMgXHZhcntmb2xkZXJ9IGFuZCByZXR1cm4gYW4gXGNsYXNze01IfSBpbnN0YW5jZQotcmVwcmVzZW50aW5nIGl0LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317cmVtb3ZlX2ZvbGRlcn17Zm9sZGVyfQotRGVsZXRlIHRoZSBmb2xkZXIgd2hvc2UgbmFtZSBpcyBcdmFye2ZvbGRlcn0uIElmIHRoZSBmb2xkZXIgY29udGFpbnMgYW55Ci1tZXNzYWdlcywgYSBcZXhjZXB0aW9ue05vdEVtcHR5RXJyb3J9IGV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNlZCBhbmQgdGhlIGZvbGRlcgotd2lsbCBub3QgYmUgZGVsZXRlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2dldF9zZXF1ZW5jZXN9e30KLVJldHVybiBhIGRpY3Rpb25hcnkgb2Ygc2VxdWVuY2UgbmFtZXMgbWFwcGVkIHRvIGtleSBsaXN0cy4gSWYgdGhlcmUgYXJlIG5vCi1zZXF1ZW5jZXMsIHRoZSBlbXB0eSBkaWN0aW9uYXJ5IGlzIHJldHVybmVkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317c2V0X3NlcXVlbmNlc317c2VxdWVuY2VzfQotUmUtZGVmaW5lIHRoZSBzZXF1ZW5jZXMgdGhhdCBleGlzdCBpbiB0aGUgbWFpbGJveCBiYXNlZCB1cG9uIFx2YXJ7c2VxdWVuY2VzfSwgYQotZGljdGlvbmFyeSBvZiBuYW1lcyBtYXBwZWQgdG8ga2V5IGxpc3RzLCBsaWtlIHJldHVybmVkIGJ5Ci1cbWV0aG9ke2dldF9zZXF1ZW5jZXMoKX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtwYWNrfXt9Ci1SZW5hbWUgbWVzc2FnZXMgaW4gdGhlIG1haWxib3ggYXMgbmVjZXNzYXJ5IHRvIGVsaW1pbmF0ZSBnYXBzIGluIG51bWJlcmluZy4KLUVudHJpZXMgaW4gdGhlIHNlcXVlbmNlcyBsaXN0IGFyZSB1cGRhdGVkIGNvcnJlc3BvbmRpbmdseS4gXG5vdGV7QWxyZWFkeS1pc3N1ZWQKLWtleXMgYXJlIGludmFsaWRhdGVkIGJ5IHRoaXMgb3BlcmF0aW9uIGFuZCBzaG91bGQgbm90IGJlIHN1YnNlcXVlbnRseSB1c2VkLn0KLVxlbmR7bWV0aG9kZGVzY30KLQotU29tZSBcY2xhc3N7TWFpbGJveH0gbWV0aG9kcyBpbXBsZW1lbnRlZCBieSBcY2xhc3N7TUh9IGRlc2VydmUgc3BlY2lhbCByZW1hcmtzOgotCi1cYmVnaW57bWV0aG9kZGVzY317cmVtb3ZlfXtrZXl9Ci1cbWV0aG9kbGluZXtfX2RlbGl0ZW1fX317a2V5fQotXG1ldGhvZGxpbmV7ZGlzY2FyZH17a2V5fQotVGhlc2UgbWV0aG9kcyBpbW1lZGlhdGVseSBkZWxldGUgdGhlIG1lc3NhZ2UuIFRoZSBNSCBjb252ZW50aW9uIG9mIG1hcmtpbmcgYQotbWVzc2FnZSBmb3IgZGVsZXRpb24gYnkgcHJlcGVuZGluZyBhIGNvbW1hIHRvIGl0cyBuYW1lIGlzIG5vdCB1c2VkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317bG9ja317fQotXG1ldGhvZGxpbmV7dW5sb2NrfXt9Ci1UaHJlZSBsb2NraW5nIG1lY2hhbmlzbXMgYXJlIHVzZWQtLS1kb3QgbG9ja2luZyBhbmQsIGlmIGF2YWlsYWJsZSwgdGhlCi1cY2Z1bmN0aW9ue2Zsb2NrKCl9IGFuZCBcY2Z1bmN0aW9ue2xvY2tmKCl9IHN5c3RlbSBjYWxscy4gRm9yIE1IIG1haWxib3hlcywKLWxvY2tpbmcgdGhlIG1haWxib3ggbWVhbnMgbG9ja2luZyB0aGUgXGZpbGV7Lm1oX3NlcXVlbmNlc30gZmlsZSBhbmQsIG9ubHkgZm9yCi10aGUgZHVyYXRpb24gb2YgYW55IG9wZXJhdGlvbnMgdGhhdCBhZmZlY3QgdGhlbSwgbG9ja2luZyBpbmRpdmlkdWFsIG1lc3NhZ2UKLWZpbGVzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Z2V0X2ZpbGV9e2tleX0KLURlcGVuZGluZyB1cG9uIHRoZSBob3N0IHBsYXRmb3JtLCBpdCBtYXkgbm90IGJlIHBvc3NpYmxlIHRvIHJlbW92ZSB0aGUKLXVuZGVybHlpbmcgbWVzc2FnZSB3aGlsZSB0aGUgcmV0dXJuZWQgZmlsZSByZW1haW5zIG9wZW4uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtmbHVzaH17fQotQWxsIGNoYW5nZXMgdG8gTUggbWFpbGJveGVzIGFyZSBpbW1lZGlhdGVseSBhcHBsaWVkLCBzbyB0aGlzIG1ldGhvZCBkb2VzCi1ub3RoaW5nLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Y2xvc2V9e30KLVxjbGFzc3tNSH0gaW5zdGFuY2VzIGRvIG5vdCBrZWVwIGFueSBvcGVuIGZpbGVzLCBzbyB0aGlzIG1ldGhvZCBpcyBlcXVpdmVsYW50Ci10byBcbWV0aG9ke3VubG9jaygpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue3NlZWFsc299Ci1cc2VlbGlua3todHRwOi8vd3d3Lm5vbmdudS5vcmcvbm1oL317bm1oIC0gTWVzc2FnZSBIYW5kbGluZyBTeXN0ZW19e0hvbWUgcGFnZQotb2YgXHByb2dyYW17bm1ofSwgYW4gdXBkYXRlZCB2ZXJzaW9uIG9mIHRoZSBvcmlnaW5hbCBccHJvZ3JhbXttaH0ufQotXHNlZWxpbmt7aHR0cDovL3d3dy5pY3MudWNpLmVkdS9cdGlsZGV7fW1oL2Jvb2svfXtNSCBcJiBubWg6IEVtYWlsIGZvciBVc2VycyBcJgotUHJvZ3JhbW1lcnN9e0EgR1BMLWxpY2Vuc2VkIGJvb2sgb24gXHByb2dyYW17bWh9IGFuZCBccHJvZ3JhbXtubWh9LCB3aXRoIHNvbWUKLWluZm9ybWF0aW9uIG9uIHRoZSBtYWlsYm94IGZvcm1hdC59Ci1cZW5ke3NlZWFsc299Ci0KLVxzdWJzdWJzZWN0aW9ue1xjbGFzc3tCYWJ5bH19Ci1cbGFiZWx7bWFpbGJveC1iYWJ5bH0KLQotXGJlZ2lue2NsYXNzZGVzY317QmFieWx9e3BhdGhcb3B0aW9uYWx7LCBmYWN0b3J5PU5vbmVcb3B0aW9uYWx7LCBjcmVhdGU9VHJ1ZX19fQotQSBzdWJjbGFzcyBvZiBcY2xhc3N7TWFpbGJveH0gZm9yIG1haWxib3hlcyBpbiBCYWJ5bCBmb3JtYXQuIFBhcmFtZXRlcgotXHZhcntmYWN0b3J5fSBpcyBhIGNhbGxhYmxlIG9iamVjdCB0aGF0IGFjY2VwdHMgYSBmaWxlLWxpa2UgbWVzc2FnZQotcmVwcmVzZW50YXRpb24gKHdoaWNoIGJlaGF2ZXMgYXMgaWYgb3BlbmVkIGluIGJpbmFyeSBtb2RlKSBhbmQgcmV0dXJucyBhIGN1c3RvbQotcmVwcmVzZW50YXRpb24uIElmIFx2YXJ7ZmFjdG9yeX0gaXMgXGNvZGV7Tm9uZX0sIFxjbGFzc3tCYWJ5bE1lc3NhZ2V9IGlzIHVzZWQKLWFzIHRoZSBkZWZhdWx0IG1lc3NhZ2UgcmVwcmVzZW50YXRpb24uIElmIFx2YXJ7Y3JlYXRlfSBpcyBcY29kZXtUcnVlfSwgdGhlCi1tYWlsYm94IGlzIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QgZXhpc3QuCi1cZW5ke2NsYXNzZGVzY30KLQotQmFieWwgaXMgYSBzaW5nbGUtZmlsZSBtYWlsYm94IGZvcm1hdCB1c2VkIGJ5IHRoZSBSbWFpbCBtYWlsIHVzZXIgYWdlbnQKLWluY2x1ZGVkIHdpdGggRW1hY3MuIFRoZSBiZWdpbm5pbmcgb2YgYSBtZXNzYWdlIGlzIGluZGljYXRlZCBieSBhIGxpbmUKLWNvbnRhaW5pbmcgdGhlIHR3byBjaGFyYWN0ZXJzIENvbnRyb2wtVW5kZXJzY29yZQotKFxjaGFyYWN0ZXJ7XHRleHRiYWNrc2xhc2gwMzd9KSBhbmQgQ29udHJvbC1MIChcY2hhcmFjdGVye1x0ZXh0YmFja3NsYXNoMDE0fSkuCi1UaGUgZW5kIG9mIGEgbWVzc2FnZSBpcyBpbmRpY2F0ZWQgYnkgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IG1lc3NhZ2Ugb3IsIGluIHRoZQotY2FzZSBvZiB0aGUgbGFzdCBtZXNzYWdlLCBhIGxpbmUgY29udGFpbmluZyBhIENvbnRyb2wtVW5kZXJzY29yZQotKFxjaGFyYWN0ZXJ7XHRleHRiYWNrc2xhc2gwMzd9KSBjaGFyYWN0ZXIuCi0KLU1lc3NhZ2VzIGluIGEgQmFieWwgbWFpbGJveCBoYXZlIHR3byBzZXRzIG9mIGhlYWRlcnMsIG9yaWdpbmFsIGhlYWRlcnMgYW5kCi1zby1jYWxsZWQgdmlzaWJsZSBoZWFkZXJzLiBWaXNpYmxlIGhlYWRlcnMgYXJlIHR5cGljYWxseSBhIHN1YnNldCBvZiB0aGUKLW9yaWdpbmFsIGhlYWRlcnMgdGhhdCBoYXZlIGJlZW4gcmVmb3JtYXR0ZWQgb3IgYWJyaWRnZWQgdG8gYmUgbW9yZSBhdHRyYWN0aXZlLgotRWFjaCBtZXNzYWdlIGluIGEgQmFieWwgbWFpbGJveCBhbHNvIGhhcyBhbiBhY2NvbXBhbnlpbmcgbGlzdCBvZiBcZGZue2xhYmVsc30sCi1vciBzaG9ydCBzdHJpbmdzIHRoYXQgcmVjb3JkIGV4dHJhIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtZXNzYWdlLCBhbmQgYSBsaXN0IG9mCi1hbGwgdXNlci1kZWZpbmVkIGxhYmVscyBmb3VuZCBpbiB0aGUgbWFpbGJveCBpcyBrZXB0IGluIHRoZSBCYWJ5bCBvcHRpb25zCi1zZWN0aW9uLgotCi1cY2xhc3N7QmFieWx9IGluc3RhbmNlcyBoYXZlIGFsbCBvZiB0aGUgbWV0aG9kcyBvZiBcY2xhc3N7TWFpbGJveH0gaW4gYWRkaXRpb24KLXRvIHRoZSBmb2xsb3dpbmc6Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtnZXRfbGFiZWxzfXt9Ci1SZXR1cm4gYSBsaXN0IG9mIHRoZSBuYW1lcyBvZiBhbGwgdXNlci1kZWZpbmVkIGxhYmVscyB1c2VkIGluIHRoZSBtYWlsYm94LgotXG5vdGV7VGhlIGFjdHVhbCBtZXNzYWdlcyBhcmUgaW5zcGVjdGVkIHRvIGRldGVybWluZSB3aGljaCBsYWJlbHMgZXhpc3QgaW4gdGhlCi1tYWlsYm94IHJhdGhlciB0aGFuIGNvbnN1bHRpbmcgdGhlIGxpc3Qgb2YgbGFiZWxzIGluIHRoZSBCYWJ5bCBvcHRpb25zIHNlY3Rpb24sCi1idXQgdGhlIEJhYnlsIHNlY3Rpb24gaXMgdXBkYXRlZCB3aGVuZXZlciB0aGUgbWFpbGJveCBpcyBtb2RpZmllZC59Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVNvbWUgXGNsYXNze01haWxib3h9IG1ldGhvZHMgaW1wbGVtZW50ZWQgYnkgXGNsYXNze0JhYnlsfSBkZXNlcnZlIHNwZWNpYWwKLXJlbWFya3M6Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtnZXRfZmlsZX17a2V5fQotSW4gQmFieWwgbWFpbGJveGVzLCB0aGUgaGVhZGVycyBvZiBhIG1lc3NhZ2UgYXJlIG5vdCBzdG9yZWQgY29udGlndW91c2x5IHdpdGgKLXRoZSBib2R5IG9mIHRoZSBtZXNzYWdlLiBUbyBnZW5lcmF0ZSBhIGZpbGUtbGlrZSByZXByZXNlbnRhdGlvbiwgdGhlIGhlYWRlcnMKLWFuZCBib2R5IGFyZSBjb3BpZWQgdG9nZXRoZXIgaW50byBhIFxjbGFzc3tTdHJpbmdJT30gaW5zdGFuY2UgKGZyb20gdGhlCi1cbW9kdWxle1N0cmluZ0lPfSBtb2R1bGUpLCB3aGljaCBoYXMgYW4gQVBJIGlkZW50aWNhbCB0byB0aGF0IG9mIGEgZmlsZS4gQXMgYQotcmVzdWx0LCB0aGUgZmlsZS1saWtlIG9iamVjdCBpcyB0cnVseSBpbmRlcGVuZGVudCBvZiB0aGUgdW5kZXJseWluZyBtYWlsYm94IGJ1dAotZG9lcyBub3Qgc2F2ZSBtZW1vcnkgY29tcGFyZWQgdG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtsb2NrfXt9Ci1cbWV0aG9kbGluZXt1bmxvY2t9e30KLVRocmVlIGxvY2tpbmcgbWVjaGFuaXNtcyBhcmUgdXNlZC0tLWRvdCBsb2NraW5nIGFuZCwgaWYgYXZhaWxhYmxlLCB0aGUKLVxjZnVuY3Rpb257ZmxvY2soKX0gYW5kIFxjZnVuY3Rpb257bG9ja2YoKX0gc3lzdGVtIGNhbGxzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57c2VlYWxzb30KLVxzZWVsaW5re2h0dHA6Ly9xdWltYnkuZ251cy5vcmcvbm90ZXMvQkFCWUx9e0Zvcm1hdCBvZiBWZXJzaW9uIDUgQmFieWwgRmlsZXN9e0EKLXNwZWNpZmljYXRpb24gb2YgdGhlIEJhYnlsIGZvcm1hdC59Ci1cc2VlbGlua3todHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZW1hY3MvbWFudWFsL2h0bWxfbm9kZS9SbWFpbC5odG1sfXtSZWFkaW5nCi1NYWlsIHdpdGggUm1haWx9e1RoZSBSbWFpbCBtYW51YWwsIHdpdGggc29tZSBpbmZvcm1hdGlvbiBvbiBCYWJ5bCBzZW1hbnRpY3MufQotXGVuZHtzZWVhbHNvfQotCi1cc3Vic3Vic2VjdGlvbntcY2xhc3N7TU1ERn19Ci1cbGFiZWx7bWFpbGJveC1tbWRmfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtNTURGfXtwYXRoXG9wdGlvbmFseywgZmFjdG9yeT1Ob25lXG9wdGlvbmFseywgY3JlYXRlPVRydWV9fX0KLUEgc3ViY2xhc3Mgb2YgXGNsYXNze01haWxib3h9IGZvciBtYWlsYm94ZXMgaW4gTU1ERiBmb3JtYXQuIFBhcmFtZXRlcgotXHZhcntmYWN0b3J5fSBpcyBhIGNhbGxhYmxlIG9iamVjdCB0aGF0IGFjY2VwdHMgYSBmaWxlLWxpa2UgbWVzc2FnZQotcmVwcmVzZW50YXRpb24gKHdoaWNoIGJlaGF2ZXMgYXMgaWYgb3BlbmVkIGluIGJpbmFyeSBtb2RlKSBhbmQgcmV0dXJucyBhIGN1c3RvbQotcmVwcmVzZW50YXRpb24uIElmIFx2YXJ7ZmFjdG9yeX0gaXMgXGNvZGV7Tm9uZX0sIFxjbGFzc3tNTURGTWVzc2FnZX0gaXMgdXNlZCBhcwotdGhlIGRlZmF1bHQgbWVzc2FnZSByZXByZXNlbnRhdGlvbi4gSWYgXHZhcntjcmVhdGV9IGlzIFxjb2Rle1RydWV9LCB0aGUgbWFpbGJveAotaXMgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLVxlbmR7Y2xhc3NkZXNjfQotCi1NTURGIGlzIGEgc2luZ2xlLWZpbGUgbWFpbGJveCBmb3JtYXQgaW52ZW50ZWQgZm9yIHRoZSBNdWx0aWNoYW5uZWwgTWVtb3JhbmR1bQotRGlzdHJpYnV0aW9uIEZhY2lsaXR5LCBhIG1haWwgdHJhbnNmZXIgYWdlbnQuIEVhY2ggbWVzc2FnZSBpcyBpbiB0aGUgc2FtZSBmb3JtCi1hcyBhbiBtYm94IG1lc3NhZ2UgYnV0IGlzIGJyYWNrZXRlZCBiZWZvcmUgYW5kIGFmdGVyIGJ5IGxpbmVzIGNvbnRhaW5pbmcgZm91cgotQ29udHJvbC1BIChcY2hhcmFjdGVye1x0ZXh0YmFja3NsYXNoMDAxfSkgY2hhcmFjdGVycy4gQXMgd2l0aCB0aGUgbWJveCBmb3JtYXQsCi10aGUgYmVnaW5uaW5nIG9mIGVhY2ggbWVzc2FnZSBpcyBpbmRpY2F0ZWQgYnkgYSBsaW5lIHdob3NlIGZpcnN0IGZpdmUKLWNoYXJhY3RlcnMgYXJlICJGcm9tfiIsIGJ1dCBhZGRpdGlvbmFsIG9jY3VycmVuY2VzIG9mICJGcm9tfiIgYXJlIG5vdAotdHJhbnNmb3JtZWQgdG8gIj5Gcm9tfiIgd2hlbiBzdG9yaW5nIG1lc3NhZ2VzIGJlY2F1c2UgdGhlIGV4dHJhIG1lc3NhZ2UKLXNlcGFyYXRvciBsaW5lcyBwcmV2ZW50IG1pc3Rha2luZyBzdWNoIG9jY3VycmVuY2VzIGZvciB0aGUgc3RhcnRzIG9mIHN1YnNlcXVlbnQKLW1lc3NhZ2VzLgotCi1Tb21lIFxjbGFzc3tNYWlsYm94fSBtZXRob2RzIGltcGxlbWVudGVkIGJ5IFxjbGFzc3tNTURGfSBkZXNlcnZlIHNwZWNpYWwKLXJlbWFya3M6Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtnZXRfZmlsZX17a2V5fQotVXNpbmcgdGhlIGZpbGUgYWZ0ZXIgY2FsbGluZyBcbWV0aG9ke2ZsdXNoKCl9IG9yIFxtZXRob2R7Y2xvc2UoKX0gb24gdGhlCi1cY2xhc3N7TU1ERn0gaW5zdGFuY2UgbWF5IHlpZWxkIHVucHJlZGljdGFibGUgcmVzdWx0cyBvciByYWlzZSBhbiBleGNlcHRpb24uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtsb2NrfXt9Ci1cbWV0aG9kbGluZXt1bmxvY2t9e30KLVRocmVlIGxvY2tpbmcgbWVjaGFuaXNtcyBhcmUgdXNlZC0tLWRvdCBsb2NraW5nIGFuZCwgaWYgYXZhaWxhYmxlLCB0aGUKLVxjZnVuY3Rpb257ZmxvY2soKX0gYW5kIFxjZnVuY3Rpb257bG9ja2YoKX0gc3lzdGVtIGNhbGxzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57c2VlYWxzb30KLVxzZWVsaW5re2h0dHA6Ly93d3cudGluLm9yZy9iaW4vbWFuLmNnaT9zZWN0aW9uPTVcJnRvcGljPW1tZGZ9e21tZGYgbWFuIHBhZ2UKLWZyb20gdGlufXtBIHNwZWNpZmljYXRpb24gb2YgTU1ERiBmb3JtYXQgZnJvbSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aW4sIGEKLW5ld3NyZWFkZXIufQotXHNlZWxpbmt7aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NTURGfXtNTURGfXtBIFdpa2lwZWRpYSBhcnRpY2xlCi1kZXNjcmliaW5nIHRoZSBNdWx0aWNoYW5uZWwgTWVtb3JhbmR1bSBEaXN0cmlidXRpb24gRmFjaWxpdHkufQotXGVuZHtzZWVhbHNvfQotCi1cc3Vic2VjdGlvbntcY2xhc3N7TWVzc2FnZX0gb2JqZWN0c30KLVxsYWJlbHttYWlsYm94LW1lc3NhZ2Utb2JqZWN0c30KLQotXGJlZ2lue2NsYXNzZGVzY317TWVzc2FnZX17XG9wdGlvbmFse21lc3NhZ2V9fQotQSBzdWJjbGFzcyBvZiB0aGUgXG1vZHVsZXtlbWFpbC5NZXNzYWdlfSBtb2R1bGUncyBcY2xhc3N7TWVzc2FnZX0uIFN1YmNsYXNzZXMKLW9mIFxjbGFzc3ttYWlsYm94Lk1lc3NhZ2V9IGFkZCBtYWlsYm94LWZvcm1hdC1zcGVjaWZpYyBzdGF0ZSBhbmQgYmVoYXZpb3IuCi0KLUlmIFx2YXJ7bWVzc2FnZX0gaXMgb21pdHRlZCwgdGhlIG5ldyBpbnN0YW5jZSBpcyBjcmVhdGVkIGluIGEgZGVmYXVsdCwgZW1wdHkKLXN0YXRlLiBJZiBcdmFye21lc3NhZ2V9IGlzIGFuIFxjbGFzc3tlbWFpbC5NZXNzYWdlLk1lc3NhZ2V9IGluc3RhbmNlLCBpdHMKLWNvbnRlbnRzIGFyZSBjb3BpZWQ7IGZ1cnRoZXJtb3JlLCBhbnkgZm9ybWF0LXNwZWNpZmljIGluZm9ybWF0aW9uIGlzIGNvbnZlcnRlZAotaW5zb2ZhciBhcyBwb3NzaWJsZSBpZiBcdmFye21lc3NhZ2V9IGlzIGEgXGNsYXNze01lc3NhZ2V9IGluc3RhbmNlLiBJZgotXHZhcnttZXNzYWdlfSBpcyBhIHN0cmluZyBvciBhIGZpbGUsIGl0IHNob3VsZCBjb250YWluIGFuIFxyZmN7MjgyMn0tY29tcGxpYW50Ci1tZXNzYWdlLCB3aGljaCBpcyByZWFkIGFuZCBwYXJzZWQuCi1cZW5ke2NsYXNzZGVzY30KLQotVGhlIGZvcm1hdC1zcGVjaWZpYyBzdGF0ZSBhbmQgYmVoYXZpb3JzIG9mZmVyZWQgYnkgc3ViY2xhc3NlcyB2YXJ5LCBidXQgaW4KLWdlbmVyYWwgaXQgaXMgb25seSB0aGUgcHJvcGVydGllcyB0aGF0IGFyZSBub3Qgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIG1haWxib3gKLXRoYXQgYXJlIHN1cHBvcnRlZCAoYWx0aG91Z2ggcHJlc3VtYWJseSB0aGUgcHJvcGVydGllcyBhcmUgc3BlY2lmaWMgdG8gYQotcGFydGljdWxhciBtYWlsYm94IGZvcm1hdCkuIEZvciBleGFtcGxlLCBmaWxlIG9mZnNldHMgZm9yIHNpbmdsZS1maWxlIG1haWxib3gKLWZvcm1hdHMgYW5kIGZpbGUgbmFtZXMgZm9yIGRpcmVjdG9yeS1iYXNlZCBtYWlsYm94IGZvcm1hdHMgYXJlIG5vdCByZXRhaW5lZCwKLWJlY2F1c2UgdGhleSBhcmUgb25seSBhcHBsaWNhYmxlIHRvIHRoZSBvcmlnaW5hbCBtYWlsYm94LiBCdXQgc3RhdGUgc3VjaCBhcwotd2hldGhlciBhIG1lc3NhZ2UgaGFzIGJlZW4gcmVhZCBieSB0aGUgdXNlciBvciBtYXJrZWQgYXMgaW1wb3J0YW50IGlzIHJldGFpbmVkLAotYmVjYXVzZSBpdCBhcHBsaWVzIHRvIHRoZSBtZXNzYWdlIGl0c2VsZi4KLQotVGhlcmUgaXMgbm8gcmVxdWlyZW1lbnQgdGhhdCBcY2xhc3N7TWVzc2FnZX0gaW5zdGFuY2VzIGJlIHVzZWQgdG8gcmVwcmVzZW50Ci1tZXNzYWdlcyByZXRyaWV2ZWQgdXNpbmcgXGNsYXNze01haWxib3h9IGluc3RhbmNlcy4gSW4gc29tZSBzaXR1YXRpb25zLCB0aGUKLXRpbWUgYW5kIG1lbW9yeSByZXF1aXJlZCB0byBnZW5lcmF0ZSBcY2xhc3N7TWVzc2FnZX0gcmVwcmVzZW50YXRpb25zIG1pZ2h0IG5vdAotbm90IGFjY2VwdGFibGUuIEZvciBzdWNoIHNpdHVhdGlvbnMsIFxjbGFzc3tNYWlsYm94fSBpbnN0YW5jZXMgYWxzbyBvZmZlcgotc3RyaW5nIGFuZCBmaWxlLWxpa2UgcmVwcmVzZW50YXRpb25zLCBhbmQgYSBjdXN0b20gbWVzc2FnZSBmYWN0b3J5IG1heSBiZQotc3BlY2lmaWVkIHdoZW4gYSBcY2xhc3N7TWFpbGJveH0gaW5zdGFuY2UgaXMgaW5pdGlhbGl6ZWQuIAotCi1cc3Vic3Vic2VjdGlvbntcY2xhc3N7TWFpbGRpck1lc3NhZ2V9fQotXGxhYmVse21haWxib3gtbWFpbGRpcm1lc3NhZ2V9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e01haWxkaXJNZXNzYWdlfXtcb3B0aW9uYWx7bWVzc2FnZX19Ci1BIG1lc3NhZ2Ugd2l0aCBNYWlsZGlyLXNwZWNpZmljIGJlaGF2aW9ycy4gUGFyYW1ldGVyIFx2YXJ7bWVzc2FnZX0KLWhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIHdpdGggdGhlIFxjbGFzc3tNZXNzYWdlfSBjb25zdHJ1Y3Rvci4KLVxlbmR7Y2xhc3NkZXNjfQotCi1UeXBpY2FsbHksIGEgbWFpbCB1c2VyIGFnZW50IGFwcGxpY2F0aW9uIG1vdmVzIGFsbCBvZiB0aGUgbWVzc2FnZXMgaW4gdGhlCi1cZmlsZXtuZXd9IHN1YmRpcmVjdG9yeSB0byB0aGUgXGZpbGV7Y3VyfSBzdWJkaXJlY3RvcnkgYWZ0ZXIgdGhlIGZpcnN0IHRpbWUgdGhlCi11c2VyIG9wZW5zIGFuZCBjbG9zZXMgdGhlIG1haWxib3gsIHJlY29yZGluZyB0aGF0IHRoZSBtZXNzYWdlcyBhcmUgb2xkIHdoZXRoZXIKLW9yIG5vdCB0aGV5J3ZlIGFjdHVhbGx5IGJlZW4gcmVhZC4gRWFjaCBtZXNzYWdlIGluIFxmaWxle2N1cn0gaGFzIGFuICJpbmZvIgotc2VjdGlvbiBhZGRlZCB0byBpdHMgZmlsZSBuYW1lIHRvIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IGl0cyBzdGF0ZS4gKFNvbWUgbWFpbAotcmVhZGVycyBtYXkgYWxzbyBhZGQgYW4gImluZm8iIHNlY3Rpb24gdG8gbWVzc2FnZXMgaW4gXGZpbGV7bmV3fS4pIFRoZSAiaW5mbyIKLXNlY3Rpb24gbWF5IHRha2Ugb25lIG9mIHR3byBmb3JtczogaXQgbWF5IGNvbnRhaW4gIjIsIiBmb2xsb3dlZCBieSBhIGxpc3Qgb2YKLXN0YW5kYXJkaXplZCBmbGFncyAoZS5nLiwgIjIsRlIiKSBvciBpdCBtYXkgY29udGFpbiAiMSwiIGZvbGxvd2VkIGJ5IHNvLWNhbGxlZAotZXhwZXJpbWVudGFsIGluZm9ybWF0aW9uLiBTdGFuZGFyZCBmbGFncyBmb3IgTWFpbGRpciBtZXNzYWdlcyBhcmUgYXMgZm9sbG93czoKLQotXGJlZ2lue3RhYmxlaWlpfXtsfGx8bH17dGV4dHJtfXtGbGFnfXtNZWFuaW5nfXtFeHBsYW5hdGlvbn0KLVxsaW5laWlpe0R9e0RyYWZ0fXtVbmRlciBjb21wb3NpdGlvbn0KLVxsaW5laWlpe0Z9e0ZsYWdnZWR9e01hcmtlZCBhcyBpbXBvcnRhbnR9Ci1cbGluZWlpaXtQfXtQYXNzZWR9e0ZvcndhcmRlZCwgcmVzZW50LCBvciBib3VuY2VkfQotXGxpbmVpaWl7Un17UmVwbGllZH17UmVwbGllZCB0b30KLVxsaW5laWlpe1N9e1NlZW59e1JlYWR9Ci1cbGluZWlpaXtUfXtUcmFzaGVkfXtNYXJrZWQgZm9yIHN1YnNlcXVlbnQgZGVsZXRpb259Ci1cZW5ke3RhYmxlaWlpfQotCi1cY2xhc3N7TWFpbGRpck1lc3NhZ2V9IGluc3RhbmNlcyBvZmZlciB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtnZXRfc3ViZGlyfXt9Ci1SZXR1cm4gZWl0aGVyICJuZXciIChpZiB0aGUgbWVzc2FnZSBzaG91bGQgYmUgc3RvcmVkIGluIHRoZSBcZmlsZXtuZXd9Ci1zdWJkaXJlY3RvcnkpIG9yICJjdXIiIChpZiB0aGUgbWVzc2FnZSBzaG91bGQgYmUgc3RvcmVkIGluIHRoZSBcZmlsZXtjdXJ9Ci1zdWJkaXJlY3RvcnkpLiBcbm90ZXtBIG1lc3NhZ2UgaXMgdHlwaWNhbGx5IG1vdmVkIGZyb20gXGZpbGV7bmV3fSB0byBcZmlsZXtjdXJ9Ci1hZnRlciBpdHMgbWFpbGJveCBoYXMgYmVlbiBhY2Nlc3NlZCwgd2hldGhlciBvciBub3QgdGhlIG1lc3NhZ2UgaXMgaGFzIGJlZW4KLXJlYWQuIEEgbWVzc2FnZSBcY29kZXttc2d9IGhhcyBiZWVuIHJlYWQgaWYgXGNvZGV7IlMiIG5vdCBpbiBtc2cuZ2V0X2ZsYWdzKCl9Ci1pcyBcY29kZXtUcnVlfS59Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtzZXRfc3ViZGlyfXtzdWJkaXJ9Ci1TZXQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgbWVzc2FnZSBzaG91bGQgYmUgc3RvcmVkIGluLiBQYXJhbWV0ZXIgXHZhcntzdWJkaXJ9Ci1tdXN0IGJlIGVpdGhlciAibmV3IiBvciAiY3VyIi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2dldF9mbGFnc317fQotUmV0dXJuIGEgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIGZsYWdzIHRoYXQgYXJlIGN1cnJlbnRseSBzZXQuIElmIHRoZSBtZXNzYWdlCi1jb21wbGllcyB3aXRoIHRoZSBzdGFuZGFyZCBNYWlsZGlyIGZvcm1hdCwgdGhlIHJlc3VsdCBpcyB0aGUgY29uY2F0ZW5hdGlvbiBpbgotYWxwaGFiZXRpY2FsIG9yZGVyIG9mIHplcm8gb3Igb25lIG9jY3VycmVuY2Ugb2YgZWFjaCBvZiBcY2hhcmFjdGVye0R9LAotXGNoYXJhY3RlcntGfSwgXGNoYXJhY3RlcntQfSwgXGNoYXJhY3RlcntSfSwgXGNoYXJhY3RlcntTfSwgYW5kIFxjaGFyYWN0ZXJ7VH0uCi1UaGUgZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGlmIG5vIGZsYWdzIGFyZSBzZXQgb3IgaWYgImluZm8iIGNvbnRhaW5zCi1leHBlcmltZW50YWwgc2VtYW50aWNzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317c2V0X2ZsYWdzfXtmbGFnc30KLVNldCB0aGUgZmxhZ3Mgc3BlY2lmaWVkIGJ5IFx2YXJ7ZmxhZ3N9IGFuZCB1bnNldCBhbGwgb3RoZXJzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317YWRkX2ZsYWd9e2ZsYWd9Ci1TZXQgdGhlIGZsYWcocykgc3BlY2lmaWVkIGJ5IFx2YXJ7ZmxhZ30gd2l0aG91dCBjaGFuZ2luZyBvdGhlciBmbGFncy4gVG8gYWRkCi1tb3JlIHRoYW4gb25lIGZsYWcgYXQgYSB0aW1lLCBcdmFye2ZsYWd9IG1heSBiZSBhIHN0cmluZyBvZiBtb3JlIHRoYW4gb25lCi1jaGFyYWN0ZXIuIFRoZSBjdXJyZW50ICJpbmZvIiBpcyBvdmVyd3JpdHRlbiB3aGV0aGVyIG9yIG5vdCBpdCBjb250YWlucwotZXhwZXJpbWVudGFsIGluZm9ybWF0aW9uIHJhdGhlciB0aGFuCi1mbGFncy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3JlbW92ZV9mbGFnfXtmbGFnfQotVW5zZXQgdGhlIGZsYWcocykgc3BlY2lmaWVkIGJ5IFx2YXJ7ZmxhZ30gd2l0aG91dCBjaGFuZ2luZyBvdGhlciBmbGFncy4gVG8KLXJlbW92ZSBtb3JlIHRoYW4gb25lIGZsYWcgYXQgYSB0aW1lLCBcdmFye2ZsYWd9IG1heWJlIGEgc3RyaW5nIG9mIG1vcmUgdGhhbiBvbmUKLWNoYXJhY3Rlci4gSWYgImluZm8iIGNvbnRhaW5zIGV4cGVyaW1lbnRhbCBpbmZvcm1hdGlvbiByYXRoZXIgdGhhbiBmbGFncywgdGhlCi1jdXJyZW50ICJpbmZvIiBpcyBub3QgbW9kaWZpZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtnZXRfZGF0ZX17fQotUmV0dXJuIHRoZSBkZWxpdmVyeSBkYXRlIG9mIHRoZSBtZXNzYWdlIGFzIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIHJlcHJlc2VudGluZwotc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2guCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtzZXRfZGF0ZX17ZGF0ZX0KLVNldCB0aGUgZGVsaXZlcnkgZGF0ZSBvZiB0aGUgbWVzc2FnZSB0byBcdmFye2RhdGV9LCBhIGZsb2F0aW5nLXBvaW50IG51bWJlcgotcmVwcmVzZW50aW5nIHNlY29uZHMgc2luY2UgdGhlIGVwb2NoLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Z2V0X2luZm99e30KLVJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSAiaW5mbyIgZm9yIGEgbWVzc2FnZS4gVGhpcyBpcyB1c2VmdWwgZm9yCi1hY2Nlc3NpbmcgYW5kIG1vZGlmeWluZyAiaW5mbyIgdGhhdCBpcyBleHBlcmltZW50YWwgKGkuZS4sIG5vdCBhIGxpc3Qgb2YKLWZsYWdzKS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3NldF9pbmZvfXtpbmZvfQotU2V0ICJpbmZvIiB0byBcdmFye2luZm99LCB3aGljaCBzaG91bGQgYmUgYSBzdHJpbmcuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVdoZW4gYSBcY2xhc3N7TWFpbGRpck1lc3NhZ2V9IGluc3RhbmNlIGlzIGNyZWF0ZWQgYmFzZWQgdXBvbiBhbgotXGNsYXNze21ib3hNZXNzYWdlfSBvciBcY2xhc3N7TU1ERk1lc3NhZ2V9IGluc3RhbmNlLCB0aGUgXG1haWxoZWFkZXJ7U3RhdHVzfQotYW5kIFxtYWlsaGVhZGVye1gtU3RhdHVzfSBoZWFkZXJzIGFyZSBvbWl0dGVkIGFuZCB0aGUgZm9sbG93aW5nIGNvbnZlcnNpb25zCi10YWtlIHBsYWNlOgotCi1cYmVnaW57dGFibGVpaX17bHxsfXt0ZXh0cm19Ci0gICAge1Jlc3VsdGluZyBzdGF0ZX17XGNsYXNze21ib3hNZXNzYWdlfSBvciBcY2xhc3N7TU1ERk1lc3NhZ2V9IHN0YXRlfQotXGxpbmVpaXsiY3VyIiBzdWJkaXJlY3Rvcnl9e08gZmxhZ30KLVxsaW5laWl7RiBmbGFnfXtGIGZsYWd9Ci1cbGluZWlpe1IgZmxhZ317QSBmbGFnfQotXGxpbmVpaXtTIGZsYWd9e1IgZmxhZ30KLVxsaW5laWl7VCBmbGFnfXtEIGZsYWd9Ci1cZW5ke3RhYmxlaWl9Ci0KLVdoZW4gYSBcY2xhc3N7TWFpbGRpck1lc3NhZ2V9IGluc3RhbmNlIGlzIGNyZWF0ZWQgYmFzZWQgdXBvbiBhbgotXGNsYXNze01ITWVzc2FnZX0gaW5zdGFuY2UsIHRoZSBmb2xsb3dpbmcgY29udmVyc2lvbnMgdGFrZSBwbGFjZToKLQotXGJlZ2lue3RhYmxlaWl9e2x8bH17dGV4dHJtfQotICAgIHtSZXN1bHRpbmcgc3RhdGV9e1xjbGFzc3tNSE1lc3NhZ2V9IHN0YXRlfQotXGxpbmVpaXsiY3VyIiBzdWJkaXJlY3Rvcnl9eyJ1bnNlZW4iIHNlcXVlbmNlfQotXGxpbmVpaXsiY3VyIiBzdWJkaXJlY3RvcnkgYW5kIFMgZmxhZ317bm8gInVuc2VlbiIgc2VxdWVuY2V9Ci1cbGluZWlpe0YgZmxhZ317ImZsYWdnZWQiIHNlcXVlbmNlfQotXGxpbmVpaXtSIGZsYWd9eyJyZXBsaWVkIiBzZXF1ZW5jZX0KLVxlbmR7dGFibGVpaX0KLQotV2hlbiBhIFxjbGFzc3tNYWlsZGlyTWVzc2FnZX0gaW5zdGFuY2UgaXMgY3JlYXRlZCBiYXNlZCB1cG9uIGEKLVxjbGFzc3tCYWJ5bE1lc3NhZ2V9IGluc3RhbmNlLCB0aGUgZm9sbG93aW5nIGNvbnZlcnNpb25zIHRha2UgcGxhY2U6Ci0KLVxiZWdpbnt0YWJsZWlpfXtsfGx9e3RleHRybX0KLSAgICB7UmVzdWx0aW5nIHN0YXRlfXtcY2xhc3N7QmFieWxNZXNzYWdlfSBzdGF0ZX0KLVxsaW5laWl7ImN1ciIgc3ViZGlyZWN0b3J5fXsidW5zZWVuIiBsYWJlbH0KLVxsaW5laWl7ImN1ciIgc3ViZGlyZWN0b3J5IGFuZCBTIGZsYWd9e25vICJ1bnNlZW4iIGxhYmVsfQotXGxpbmVpaXtQIGZsYWd9eyJmb3J3YXJkZWQiIG9yICJyZXNlbnQiIGxhYmVsfQotXGxpbmVpaXtSIGZsYWd9eyJhbnN3ZXJlZCIgbGFiZWx9Ci1cbGluZWlpe1QgZmxhZ317ImRlbGV0ZWQiIGxhYmVsfQotXGVuZHt0YWJsZWlpfQotCi1cc3Vic3Vic2VjdGlvbntcY2xhc3N7bWJveE1lc3NhZ2V9fQotXGxhYmVse21haWxib3gtbWJveG1lc3NhZ2V9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e21ib3hNZXNzYWdlfXtcb3B0aW9uYWx7bWVzc2FnZX19Ci1BIG1lc3NhZ2Ugd2l0aCBtYm94LXNwZWNpZmljIGJlaGF2aW9ycy4gUGFyYW1ldGVyIFx2YXJ7bWVzc2FnZX0gaGFzIHRoZSBzYW1lCi1tZWFuaW5nIGFzIHdpdGggdGhlIFxjbGFzc3tNZXNzYWdlfSBjb25zdHJ1Y3Rvci4KLVxlbmR7Y2xhc3NkZXNjfQotCi1NZXNzYWdlcyBpbiBhbiBtYm94IG1haWxib3ggYXJlIHN0b3JlZCB0b2dldGhlciBpbiBhIHNpbmdsZSBmaWxlLiBUaGUgc2VuZGVyJ3MKLWVudmVsb3BlIGFkZHJlc3MgYW5kIHRoZSB0aW1lIG9mIGRlbGl2ZXJ5IGFyZSB0eXBpY2FsbHkgc3RvcmVkIGluIGEgbGluZQotYmVnaW5uaW5nIHdpdGggIkZyb21+IiB0aGF0IGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIHN0YXJ0IG9mIGEgbWVzc2FnZSwgdGhvdWdoCi10aGVyZSBpcyBjb25zaWRlcmFibGUgdmFyaWF0aW9uIGluIHRoZSBleGFjdCBmb3JtYXQgb2YgdGhpcyBkYXRhIGFtb25nIG1ib3gKLWltcGxlbWVudGF0aW9ucy4gRmxhZ3MgdGhhdCBpbmRpY2F0ZSB0aGUgc3RhdGUgb2YgdGhlIG1lc3NhZ2UsIHN1Y2ggYXMgd2hldGhlcgotaXQgaGFzIGJlZW4gcmVhZCBvciBtYXJrZWQgYXMgaW1wb3J0YW50LCBhcmUgdHlwaWNhbGx5IHN0b3JlZCBpbgotXG1haWxoZWFkZXJ7U3RhdHVzfSBhbmQgXG1haWxoZWFkZXJ7WC1TdGF0dXN9IGhlYWRlcnMuCi0KLUNvbnZlbnRpb25hbCBmbGFncyBmb3IgbWJveCBtZXNzYWdlcyBhcmUgYXMgZm9sbG93czoKLQotXGJlZ2lue3RhYmxlaWlpfXtsfGx8bH17dGV4dHJtfXtGbGFnfXtNZWFuaW5nfXtFeHBsYW5hdGlvbn0KLVxsaW5laWlpe1J9e1JlYWR9e1JlYWR9Ci1cbGluZWlpaXtPfXtPbGR9e1ByZXZpb3VzbHkgZGV0ZWN0ZWQgYnkgTVVBfQotXGxpbmVpaWl7RH17RGVsZXRlZH17TWFya2VkIGZvciBzdWJzZXF1ZW50IGRlbGV0aW9ufQotXGxpbmVpaWl7Rn17RmxhZ2dlZH17TWFya2VkIGFzIGltcG9ydGFudH0KLVxsaW5laWlpe0F9e0Fuc3dlcmVkfXtSZXBsaWVkIHRvfQotXGVuZHt0YWJsZWlpaX0KLQotVGhlICJSIiBhbmQgIk8iIGZsYWdzIGFyZSBzdG9yZWQgaW4gdGhlIFxtYWlsaGVhZGVye1N0YXR1c30gaGVhZGVyLCBhbmQgdGhlCi0iRCIsICJGIiwgYW5kICJBIiBmbGFncyBhcmUgc3RvcmVkIGluIHRoZSBcbWFpbGhlYWRlcntYLVN0YXR1c30gaGVhZGVyLiBUaGUKLWZsYWdzIGFuZCBoZWFkZXJzIHR5cGljYWxseSBhcHBlYXIgaW4gdGhlIG9yZGVyIG1lbnRpb25lZC4KLQotXGNsYXNze21ib3hNZXNzYWdlfSBpbnN0YW5jZXMgb2ZmZXIgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotCi1cYmVnaW57bWV0aG9kZGVzY317Z2V0X2Zyb219e30KLVJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlICJGcm9tfiIgbGluZSB0aGF0IG1hcmtzIHRoZSBzdGFydCBvZiB0aGUKLW1lc3NhZ2UgaW4gYW4gbWJveCBtYWlsYm94LiBUaGUgbGVhZGluZyAiRnJvbX4iIGFuZCB0aGUgdHJhaWxpbmcgbmV3bGluZSBhcmUKLWV4Y2x1ZGVkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317c2V0X2Zyb219e2Zyb21fXG9wdGlvbmFseywgdGltZV89Tm9uZX19Ci1TZXQgdGhlICJGcm9tfiIgbGluZSB0byBcdmFye2Zyb21ffSwgd2hpY2ggc2hvdWxkIGJlIHNwZWNpZmllZCB3aXRob3V0IGEKLWxlYWRpbmcgIkZyb21+IiBvciB0cmFpbGluZyBuZXdsaW5lLiBGb3IgY29udmVuaWVuY2UsIFx2YXJ7dGltZV99IG1heSBiZQotc3BlY2lmaWVkIGFuZCB3aWxsIGJlIGZvcm1hdHRlZCBhcHByb3ByaWF0ZWx5IGFuZCBhcHBlbmRlZCB0byBcdmFye2Zyb21ffS4gSWYKLVx2YXJ7dGltZV99IGlzIHNwZWNpZmllZCwgaXQgc2hvdWxkIGJlIGEgXGNsYXNze3N0cnVjdF90aW1lfSBpbnN0YW5jZSwgYSB0dXBsZQotc3VpdGFibGUgZm9yIHBhc3NpbmcgdG8gXG1ldGhvZHt0aW1lLnN0cmZ0aW1lKCl9LCBvciBcY29kZXtUcnVlfSAodG8gdXNlCi1cbWV0aG9ke3RpbWUuZ210aW1lKCl9KS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2dldF9mbGFnc317fQotUmV0dXJuIGEgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIGZsYWdzIHRoYXQgYXJlIGN1cnJlbnRseSBzZXQuIElmIHRoZSBtZXNzYWdlCi1jb21wbGllcyB3aXRoIHRoZSBjb252ZW50aW9uYWwgZm9ybWF0LCB0aGUgcmVzdWx0IGlzIHRoZSBjb25jYXRlbmF0aW9uIGluIHRoZQotZm9sbG93aW5nIG9yZGVyIG9mIHplcm8gb3Igb25lIG9jY3VycmVuY2Ugb2YgZWFjaCBvZiBcY2hhcmFjdGVye1J9LAotXGNoYXJhY3RlcntPfSwgXGNoYXJhY3RlcntEfSwgXGNoYXJhY3RlcntGfSwgYW5kIFxjaGFyYWN0ZXJ7QX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtzZXRfZmxhZ3N9e2ZsYWdzfQotU2V0IHRoZSBmbGFncyBzcGVjaWZpZWQgYnkgXHZhcntmbGFnc30gYW5kIHVuc2V0IGFsbCBvdGhlcnMuIFBhcmFtZXRlcgotXHZhcntmbGFnc30gc2hvdWxkIGJlIHRoZSBjb25jYXRlbmF0aW9uIGluIGFueSBvcmRlciBvZiB6ZXJvIG9yIG1vcmUKLW9jY3VycmVuY2VzIG9mIGVhY2ggb2YgXGNoYXJhY3RlcntSfSwgXGNoYXJhY3RlcntPfSwgXGNoYXJhY3RlcntEfSwKLVxjaGFyYWN0ZXJ7Rn0sIGFuZCBcY2hhcmFjdGVye0F9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317YWRkX2ZsYWd9e2ZsYWd9Ci1TZXQgdGhlIGZsYWcocykgc3BlY2lmaWVkIGJ5IFx2YXJ7ZmxhZ30gd2l0aG91dCBjaGFuZ2luZyBvdGhlciBmbGFncy4gVG8gYWRkCi1tb3JlIHRoYW4gb25lIGZsYWcgYXQgYSB0aW1lLCBcdmFye2ZsYWd9IG1heSBiZSBhIHN0cmluZyBvZiBtb3JlIHRoYW4gb25lCi1jaGFyYWN0ZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtyZW1vdmVfZmxhZ317ZmxhZ30KLVVuc2V0IHRoZSBmbGFnKHMpIHNwZWNpZmllZCBieSBcdmFye2ZsYWd9IHdpdGhvdXQgY2hhbmdpbmcgb3RoZXIgZmxhZ3MuIFRvCi1yZW1vdmUgbW9yZSB0aGFuIG9uZSBmbGFnIGF0IGEgdGltZSwgXHZhcntmbGFnfSBtYXliZSBhIHN0cmluZyBvZiBtb3JlIHRoYW4gb25lCi1jaGFyYWN0ZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVdoZW4gYW4gXGNsYXNze21ib3hNZXNzYWdlfSBpbnN0YW5jZSBpcyBjcmVhdGVkIGJhc2VkIHVwb24gYQotXGNsYXNze01haWxkaXJNZXNzYWdlfSBpbnN0YW5jZSwgYSAiRnJvbX4iIGxpbmUgaXMgZ2VuZXJhdGVkIGJhc2VkIHVwb24gdGhlCi1cY2xhc3N7TWFpbGRpck1lc3NhZ2V9IGluc3RhbmNlJ3MgZGVsaXZlcnkgZGF0ZSwgYW5kIHRoZSBmb2xsb3dpbmcgY29udmVyc2lvbnMKLXRha2UgcGxhY2U6Ci0KLVxiZWdpbnt0YWJsZWlpfXtsfGx9e3RleHRybX0KLSAgICB7UmVzdWx0aW5nIHN0YXRlfXtcY2xhc3N7TWFpbGRpck1lc3NhZ2V9IHN0YXRlfQotXGxpbmVpaXtSIGZsYWd9e1MgZmxhZ30KLVxsaW5laWl7TyBmbGFnfXsiY3VyIiBzdWJkaXJlY3Rvcnl9Ci1cbGluZWlpe0QgZmxhZ317VCBmbGFnfQotXGxpbmVpaXtGIGZsYWd9e0YgZmxhZ30KLVxsaW5laWl7QSBmbGFnfXtSIGZsYWd9Ci1cZW5ke3RhYmxlaWl9Ci0KLVdoZW4gYW4gXGNsYXNze21ib3hNZXNzYWdlfSBpbnN0YW5jZSBpcyBjcmVhdGVkIGJhc2VkIHVwb24gYW4gXGNsYXNze01ITWVzc2FnZX0KLWluc3RhbmNlLCB0aGUgZm9sbG93aW5nIGNvbnZlcnNpb25zIHRha2UgcGxhY2U6Ci0KLVxiZWdpbnt0YWJsZWlpfXtsfGx9e3RleHRybX0KLSAgICB7UmVzdWx0aW5nIHN0YXRlfXtcY2xhc3N7TUhNZXNzYWdlfSBzdGF0ZX0KLVxsaW5laWl7UiBmbGFnIGFuZCBPIGZsYWd9e25vICJ1bnNlZW4iIHNlcXVlbmNlfQotXGxpbmVpaXtPIGZsYWd9eyJ1bnNlZW4iIHNlcXVlbmNlfQotXGxpbmVpaXtGIGZsYWd9eyJmbGFnZ2VkIiBzZXF1ZW5jZX0KLVxsaW5laWl7QSBmbGFnfXsicmVwbGllZCIgc2VxdWVuY2V9Ci1cZW5ke3RhYmxlaWl9Ci0KLVdoZW4gYW4gXGNsYXNze21ib3hNZXNzYWdlfSBpbnN0YW5jZSBpcyBjcmVhdGVkIGJhc2VkIHVwb24gYQotXGNsYXNze0JhYnlsTWVzc2FnZX0gaW5zdGFuY2UsIHRoZSBmb2xsb3dpbmcgY29udmVyc2lvbnMgdGFrZSBwbGFjZToKLQotXGJlZ2lue3RhYmxlaWl9e2x8bH17dGV4dHJtfQotICAgIHtSZXN1bHRpbmcgc3RhdGV9e1xjbGFzc3tCYWJ5bE1lc3NhZ2V9IHN0YXRlfQotXGxpbmVpaXtSIGZsYWcgYW5kIE8gZmxhZ317bm8gInVuc2VlbiIgbGFiZWx9Ci1cbGluZWlpe08gZmxhZ317InVuc2VlbiIgbGFiZWx9Ci1cbGluZWlpe0QgZmxhZ317ImRlbGV0ZWQiIGxhYmVsfQotXGxpbmVpaXtBIGZsYWd9eyJhbnN3ZXJlZCIgbGFiZWx9Ci1cZW5ke3RhYmxlaWl9Ci0KLVdoZW4gYSBcY2xhc3N7TWVzc2FnZX0gaW5zdGFuY2UgaXMgY3JlYXRlZCBiYXNlZCB1cG9uIGFuIFxjbGFzc3tNTURGTWVzc2FnZX0KLWluc3RhbmNlLCB0aGUgIkZyb21+IiBsaW5lIGlzIGNvcGllZCBhbmQgYWxsIGZsYWdzIGRpcmVjdGx5IGNvcnJlc3BvbmQ6Ci0KLVxiZWdpbnt0YWJsZWlpfXtsfGx9e3RleHRybX0KLSAgICB7UmVzdWx0aW5nIHN0YXRlfXtcY2xhc3N7TU1ERk1lc3NhZ2V9IHN0YXRlfQotXGxpbmVpaXtSIGZsYWd9e1IgZmxhZ30KLVxsaW5laWl7TyBmbGFnfXtPIGZsYWd9Ci1cbGluZWlpe0QgZmxhZ317RCBmbGFnfQotXGxpbmVpaXtGIGZsYWd9e0YgZmxhZ30KLVxsaW5laWl7QSBmbGFnfXtBIGZsYWd9Ci1cZW5ke3RhYmxlaWl9Ci0KLVxzdWJzdWJzZWN0aW9ue1xjbGFzc3tNSE1lc3NhZ2V9fQotXGxhYmVse21haWxib3gtbWhtZXNzYWdlfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtNSE1lc3NhZ2V9e1xvcHRpb25hbHttZXNzYWdlfX0KLUEgbWVzc2FnZSB3aXRoIE1ILXNwZWNpZmljIGJlaGF2aW9ycy4gUGFyYW1ldGVyIFx2YXJ7bWVzc2FnZX0gaGFzIHRoZSBzYW1lCi1tZWFuaW5nIGFzIHdpdGggdGhlIFxjbGFzc3tNZXNzYWdlfSBjb25zdHJ1Y3Rvci4KLVxlbmR7Y2xhc3NkZXNjfQotCi1NSCBtZXNzYWdlcyBkbyBub3Qgc3VwcG9ydCBtYXJrcyBvciBmbGFncyBpbiB0aGUgdHJhZGl0aW9uYWwgc2Vuc2UsIGJ1dCB0aGV5IGRvCi1zdXBwb3J0IHNlcXVlbmNlcywgd2hpY2ggYXJlIGxvZ2ljYWwgZ3JvdXBpbmdzIG9mIGFyYml0cmFyeSBtZXNzYWdlcy4gU29tZSBtYWlsCi1yZWFkaW5nIHByb2dyYW1zIChhbHRob3VnaCBub3QgdGhlIHN0YW5kYXJkIFxwcm9ncmFte21ofSBhbmQgXHByb2dyYW17bm1ofSkgdXNlCi1zZXF1ZW5jZXMgaW4gbXVjaCB0aGUgc2FtZSB3YXkgZmxhZ3MgYXJlIHVzZWQgd2l0aCBvdGhlciBmb3JtYXRzLCBhcyBmb2xsb3dzOgotCi1cYmVnaW57dGFibGVpaX17bHxsfXt0ZXh0cm19e1NlcXVlbmNlfXtFeHBsYW5hdGlvbn0KLVxsaW5laWl7dW5zZWVufXtOb3QgcmVhZCwgYnV0IHByZXZpb3VzbHkgZGV0ZWN0ZWQgYnkgTVVBfQotXGxpbmVpaXtyZXBsaWVkfXtSZXBsaWVkIHRvfQotXGxpbmVpaXtmbGFnZ2VkfXtNYXJrZWQgYXMgaW1wb3J0YW50fQotXGVuZHt0YWJsZWlpfQotCi1cY2xhc3N7TUhNZXNzYWdlfSBpbnN0YW5jZXMgb2ZmZXIgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotCi1cYmVnaW57bWV0aG9kZGVzY317Z2V0X3NlcXVlbmNlc317fQotUmV0dXJuIGEgbGlzdCBvZiB0aGUgbmFtZXMgb2Ygc2VxdWVuY2VzIHRoYXQgaW5jbHVkZSB0aGlzIG1lc3NhZ2UuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtzZXRfc2VxdWVuY2VzfXtzZXF1ZW5jZXN9Ci1TZXQgdGhlIGxpc3Qgb2Ygc2VxdWVuY2VzIHRoYXQgaW5jbHVkZSB0aGlzIG1lc3NhZ2UuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXthZGRfc2VxdWVuY2V9e3NlcXVlbmNlfQotQWRkIFx2YXJ7c2VxdWVuY2V9IHRvIHRoZSBsaXN0IG9mIHNlcXVlbmNlcyB0aGF0IGluY2x1ZGUgdGhpcyBtZXNzYWdlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317cmVtb3ZlX3NlcXVlbmNlfXtzZXF1ZW5jZX0KLVJlbW92ZSBcdmFye3NlcXVlbmNlfSBmcm9tIHRoZSBsaXN0IG9mIHNlcXVlbmNlcyB0aGF0IGluY2x1ZGUgdGhpcyBtZXNzYWdlLgotXGVuZHttZXRob2RkZXNjfQotCi1XaGVuIGFuIFxjbGFzc3tNSE1lc3NhZ2V9IGluc3RhbmNlIGlzIGNyZWF0ZWQgYmFzZWQgdXBvbiBhCi1cY2xhc3N7TWFpbGRpck1lc3NhZ2V9IGluc3RhbmNlLCB0aGUgZm9sbG93aW5nIGNvbnZlcnNpb25zIHRha2UgcGxhY2U6Ci0KLVxiZWdpbnt0YWJsZWlpfXtsfGx9e3RleHRybX0KLSAgICB7UmVzdWx0aW5nIHN0YXRlfXtcY2xhc3N7TWFpbGRpck1lc3NhZ2V9IHN0YXRlfQotXGxpbmVpaXsidW5zZWVuIiBzZXF1ZW5jZX17bm8gUyBmbGFnfQotXGxpbmVpaXsicmVwbGllZCIgc2VxdWVuY2V9e1IgZmxhZ30KLVxsaW5laWl7ImZsYWdnZWQiIHNlcXVlbmNlfXtGIGZsYWd9Ci1cZW5ke3RhYmxlaWl9Ci0KLVdoZW4gYW4gXGNsYXNze01ITWVzc2FnZX0gaW5zdGFuY2UgaXMgY3JlYXRlZCBiYXNlZCB1cG9uIGFuIFxjbGFzc3ttYm94TWVzc2FnZX0KLW9yIFxjbGFzc3tNTURGTWVzc2FnZX0gaW5zdGFuY2UsIHRoZSBcbWFpbGhlYWRlcntTdGF0dXN9IGFuZAotXG1haWxoZWFkZXJ7WC1TdGF0dXN9IGhlYWRlcnMgYXJlIG9taXR0ZWQgYW5kIHRoZSBmb2xsb3dpbmcgY29udmVyc2lvbnMgdGFrZQotcGxhY2U6Ci0KLVxiZWdpbnt0YWJsZWlpfXtsfGx9e3RleHRybX0KLSAgICB7UmVzdWx0aW5nIHN0YXRlfXtcY2xhc3N7bWJveE1lc3NhZ2V9IG9yIFxjbGFzc3tNTURGTWVzc2FnZX0gc3RhdGV9Ci1cbGluZWlpeyJ1bnNlZW4iIHNlcXVlbmNlfXtubyBSIGZsYWd9Ci1cbGluZWlpeyJyZXBsaWVkIiBzZXF1ZW5jZX17QSBmbGFnfQotXGxpbmVpaXsiZmxhZ2dlZCIgc2VxdWVuY2V9e0YgZmxhZ30KLVxlbmR7dGFibGVpaX0KLQotV2hlbiBhbiBcY2xhc3N7TUhNZXNzYWdlfSBpbnN0YW5jZSBpcyBjcmVhdGVkIGJhc2VkIHVwb24gYSBcY2xhc3N7QmFieWxNZXNzYWdlfQotaW5zdGFuY2UsIHRoZSBmb2xsb3dpbmcgY29udmVyc2lvbnMgdGFrZSBwbGFjZToKLQotXGJlZ2lue3RhYmxlaWl9e2x8bH17dGV4dHJtfQotICAgIHtSZXN1bHRpbmcgc3RhdGV9e1xjbGFzc3tCYWJ5bE1lc3NhZ2V9IHN0YXRlfQotXGxpbmVpaXsidW5zZWVuIiBzZXF1ZW5jZX17InVuc2VlbiIgbGFiZWx9Ci1cbGluZWlpeyJyZXBsaWVkIiBzZXF1ZW5jZX17ImFuc3dlcmVkIiBsYWJlbH0KLVxlbmR7dGFibGVpaX0KLQotXHN1YnN1YnNlY3Rpb257XGNsYXNze0JhYnlsTWVzc2FnZX19Ci1cbGFiZWx7bWFpbGJveC1iYWJ5bG1lc3NhZ2V9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0JhYnlsTWVzc2FnZX17XG9wdGlvbmFse21lc3NhZ2V9fQotQSBtZXNzYWdlIHdpdGggQmFieWwtc3BlY2lmaWMgYmVoYXZpb3JzLiBQYXJhbWV0ZXIgXHZhcnttZXNzYWdlfSBoYXMgdGhlIHNhbWUKLW1lYW5pbmcgYXMgd2l0aCB0aGUgXGNsYXNze01lc3NhZ2V9IGNvbnN0cnVjdG9yLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLUNlcnRhaW4gbWVzc2FnZSBsYWJlbHMsIGNhbGxlZCBcZGZue2F0dHJpYnV0ZXN9LCBhcmUgZGVmaW5lZCBieSBjb252ZW50aW9uIHRvCi1oYXZlIHNwZWNpYWwgbWVhbmluZ3MuIFRoZSBhdHRyaWJ1dGVzIGFyZSBhcyBmb2xsb3dzOgotCi1cYmVnaW57dGFibGVpaX17bHxsfXt0ZXh0cm19e0xhYmVsfXtFeHBsYW5hdGlvbn0KLVxsaW5laWl7dW5zZWVufXtOb3QgcmVhZCwgYnV0IHByZXZpb3VzbHkgZGV0ZWN0ZWQgYnkgTVVBfQotXGxpbmVpaXtkZWxldGVkfXtNYXJrZWQgZm9yIHN1YnNlcXVlbnQgZGVsZXRpb259Ci1cbGluZWlpe2ZpbGVkfXtDb3BpZWQgdG8gYW5vdGhlciBmaWxlIG9yIG1haWxib3h9Ci1cbGluZWlpe2Fuc3dlcmVkfXtSZXBsaWVkIHRvfQotXGxpbmVpaXtmb3J3YXJkZWR9e0ZvcndhcmRlZH0KLVxsaW5laWl7ZWRpdGVkfXtNb2RpZmllZCBieSB0aGUgdXNlcn0KLVxsaW5laWl7cmVzZW50fXtSZXNlbnR9Ci1cZW5ke3RhYmxlaWl9Ci0KLUJ5IGRlZmF1bHQsIFJtYWlsIGRpc3BsYXlzIG9ubHkKLXZpc2libGUgaGVhZGVycy4gVGhlIFxjbGFzc3tCYWJ5bE1lc3NhZ2V9IGNsYXNzLCB0aG91Z2gsIHVzZXMgdGhlIG9yaWdpbmFsCi1oZWFkZXJzIGJlY2F1c2UgdGhleSBhcmUgbW9yZSBjb21wbGV0ZS4gVmlzaWJsZSBoZWFkZXJzIG1heSBiZSBhY2Nlc3NlZAotZXhwbGljaXRseSBpZiBkZXNpcmVkLgotCi1cY2xhc3N7QmFieWxNZXNzYWdlfSBpbnN0YW5jZXMgb2ZmZXIgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotCi1cYmVnaW57bWV0aG9kZGVzY317Z2V0X2xhYmVsc317fQotUmV0dXJuIGEgbGlzdCBvZiBsYWJlbHMgb24gdGhlIG1lc3NhZ2UuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtzZXRfbGFiZWxzfXtsYWJlbHN9Ci1TZXQgdGhlIGxpc3Qgb2YgbGFiZWxzIG9uIHRoZSBtZXNzYWdlIHRvIFx2YXJ7bGFiZWxzfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2FkZF9sYWJlbH17bGFiZWx9Ci1BZGQgXHZhcntsYWJlbH0gdG8gdGhlIGxpc3Qgb2YgbGFiZWxzIG9uIHRoZSBtZXNzYWdlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317cmVtb3ZlX2xhYmVsfXtsYWJlbH0KLVJlbW92ZSBcdmFye2xhYmVsfSBmcm9tIHRoZSBsaXN0IG9mIGxhYmVscyBvbiB0aGUgbWVzc2FnZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2dldF92aXNpYmxlfXt9Ci1SZXR1cm4gYW4gXGNsYXNze01lc3NhZ2V9IGluc3RhbmNlIHdob3NlIGhlYWRlcnMgYXJlIHRoZSBtZXNzYWdlJ3MgdmlzaWJsZQotaGVhZGVycyBhbmQgd2hvc2UgYm9keSBpcyBlbXB0eS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3NldF92aXNpYmxlfXt2aXNpYmxlfQotU2V0IHRoZSBtZXNzYWdlJ3MgdmlzaWJsZSBoZWFkZXJzIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBoZWFkZXJzIGluCi1cdmFye21lc3NhZ2V9LiBQYXJhbWV0ZXIgXHZhcnt2aXNpYmxlfSBzaG91bGQgYmUgYSBcY2xhc3N7TWVzc2FnZX0gaW5zdGFuY2UsIGFuCi1cY2xhc3N7ZW1haWwuTWVzc2FnZS5NZXNzYWdlfSBpbnN0YW5jZSwgYSBzdHJpbmcsIG9yIGEgZmlsZS1saWtlIG9iamVjdCAod2hpY2gKLXNob3VsZCBiZSBvcGVuIGluIHRleHQgbW9kZSkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXt1cGRhdGVfdmlzaWJsZX17fQotV2hlbiBhIFxjbGFzc3tCYWJ5bE1lc3NhZ2V9IGluc3RhbmNlJ3Mgb3JpZ2luYWwgaGVhZGVycyBhcmUgbW9kaWZpZWQsIHRoZQotdmlzaWJsZSBoZWFkZXJzIGFyZSBub3QgYXV0b21hdGljYWxseSBtb2RpZmllZCB0byBjb3JyZXNwb25kLiBUaGlzIG1ldGhvZAotdXBkYXRlcyB0aGUgdmlzaWJsZSBoZWFkZXJzIGFzIGZvbGxvd3M6IGVhY2ggdmlzaWJsZSBoZWFkZXIgd2l0aCBhCi1jb3JyZXNwb25kaW5nIG9yaWdpbmFsIGhlYWRlciBpcyBzZXQgdG8gdGhlIHZhbHVlIG9mIHRoZSBvcmlnaW5hbCBoZWFkZXIsIGVhY2gKLXZpc2libGUgaGVhZGVyIHdpdGhvdXQgYSBjb3JyZXNwb25kaW5nIG9yaWdpbmFsIGhlYWRlciBpcyByZW1vdmVkLCBhbmQgYW55IG9mCi1cbWFpbGhlYWRlcntEYXRlfSwgXG1haWxoZWFkZXJ7RnJvbX0sIFxtYWlsaGVhZGVye1JlcGx5LVRvfSwgXG1haWxoZWFkZXJ7VG99LAotXG1haWxoZWFkZXJ7Q0N9LCBhbmQgXG1haWxoZWFkZXJ7U3ViamVjdH0gdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwKLWhlYWRlcnMgYnV0IG5vdCB0aGUgdmlzaWJsZSBoZWFkZXJzIGFyZSBhZGRlZCB0byB0aGUgdmlzaWJsZSBoZWFkZXJzLgotXGVuZHttZXRob2RkZXNjfQotCi1XaGVuIGEgXGNsYXNze0JhYnlsTWVzc2FnZX0gaW5zdGFuY2UgaXMgY3JlYXRlZCBiYXNlZCB1cG9uIGEKLVxjbGFzc3tNYWlsZGlyTWVzc2FnZX0gaW5zdGFuY2UsIHRoZSBmb2xsb3dpbmcgY29udmVyc2lvbnMgdGFrZSBwbGFjZToKLQotXGJlZ2lue3RhYmxlaWl9e2x8bH17dGV4dHJtfQotICAgIHtSZXN1bHRpbmcgc3RhdGV9e1xjbGFzc3tNYWlsZGlyTWVzc2FnZX0gc3RhdGV9Ci1cbGluZWlpeyJ1bnNlZW4iIGxhYmVsfXtubyBTIGZsYWd9Ci1cbGluZWlpeyJkZWxldGVkIiBsYWJlbH17VCBmbGFnfQotXGxpbmVpaXsiYW5zd2VyZWQiIGxhYmVsfXtSIGZsYWd9Ci1cbGluZWlpeyJmb3J3YXJkZWQiIGxhYmVsfXtQIGZsYWd9Ci1cZW5ke3RhYmxlaWl9Ci0KLVdoZW4gYSBcY2xhc3N7QmFieWxNZXNzYWdlfSBpbnN0YW5jZSBpcyBjcmVhdGVkIGJhc2VkIHVwb24gYW4KLVxjbGFzc3ttYm94TWVzc2FnZX0gb3IgXGNsYXNze01NREZNZXNzYWdlfSBpbnN0YW5jZSwgdGhlIFxtYWlsaGVhZGVye1N0YXR1c30KLWFuZCBcbWFpbGhlYWRlcntYLVN0YXR1c30gaGVhZGVycyBhcmUgb21pdHRlZCBhbmQgdGhlIGZvbGxvd2luZyBjb252ZXJzaW9ucwotdGFrZSBwbGFjZToKLQotXGJlZ2lue3RhYmxlaWl9e2x8bH17dGV4dHJtfQotICAgIHtSZXN1bHRpbmcgc3RhdGV9e1xjbGFzc3ttYm94TWVzc2FnZX0gb3IgXGNsYXNze01NREZNZXNzYWdlfSBzdGF0ZX0KLVxsaW5laWl7InVuc2VlbiIgbGFiZWx9e25vIFIgZmxhZ30KLVxsaW5laWl7ImRlbGV0ZWQiIGxhYmVsfXtEIGZsYWd9Ci1cbGluZWlpeyJhbnN3ZXJlZCIgbGFiZWx9e0EgZmxhZ30KLVxlbmR7dGFibGVpaX0KLQotV2hlbiBhIFxjbGFzc3tCYWJ5bE1lc3NhZ2V9IGluc3RhbmNlIGlzIGNyZWF0ZWQgYmFzZWQgdXBvbiBhbiBcY2xhc3N7TUhNZXNzYWdlfQotaW5zdGFuY2UsIHRoZSBmb2xsb3dpbmcgY29udmVyc2lvbnMgdGFrZSBwbGFjZToKLQotXGJlZ2lue3RhYmxlaWl9e2x8bH17dGV4dHJtfQotICAgIHtSZXN1bHRpbmcgc3RhdGV9e1xjbGFzc3tNSE1lc3NhZ2V9IHN0YXRlfQotXGxpbmVpaXsidW5zZWVuIiBsYWJlbH17InVuc2VlbiIgc2VxdWVuY2V9Ci1cbGluZWlpeyJhbnN3ZXJlZCIgbGFiZWx9eyJyZXBsaWVkIiBzZXF1ZW5jZX0KLVxlbmR7dGFibGVpaX0KLQotXHN1YnN1YnNlY3Rpb257XGNsYXNze01NREZNZXNzYWdlfX0KLVxsYWJlbHttYWlsYm94LW1tZGZtZXNzYWdlfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtNTURGTWVzc2FnZX17XG9wdGlvbmFse21lc3NhZ2V9fQotQSBtZXNzYWdlIHdpdGggTU1ERi1zcGVjaWZpYyBiZWhhdmlvcnMuIFBhcmFtZXRlciBcdmFye21lc3NhZ2V9IGhhcyB0aGUgc2FtZQotbWVhbmluZyBhcyB3aXRoIHRoZSBcY2xhc3N7TWVzc2FnZX0gY29uc3RydWN0b3IuCi1cZW5ke2NsYXNzZGVzY30KLQotQXMgd2l0aCBtZXNzYWdlIGluIGFuIG1ib3ggbWFpbGJveCwgTU1ERiBtZXNzYWdlcyBhcmUgc3RvcmVkIHdpdGggdGhlIHNlbmRlcidzCi1hZGRyZXNzIGFuZCB0aGUgZGVsaXZlcnkgZGF0ZSBpbiBhbiBpbml0aWFsIGxpbmUgYmVnaW5uaW5nIHdpdGggIkZyb20gIi4KLUxpa2V3aXNlLCBmbGFncyB0aGF0IGluZGljYXRlIHRoZSBzdGF0ZSBvZiB0aGUgbWVzc2FnZSBhcmUgdHlwaWNhbGx5IHN0b3JlZCBpbgotXG1haWxoZWFkZXJ7U3RhdHVzfSBhbmQgXG1haWxoZWFkZXJ7WC1TdGF0dXN9IGhlYWRlcnMuCi0KLUNvbnZlbnRpb25hbCBmbGFncyBmb3IgTU1ERiBtZXNzYWdlcyBhcmUgaWRlbnRpY2FsIHRvIHRob3NlIG9mIG1ib3ggbWVzc2FnZSBhbmQKLWFyZSBhcyBmb2xsb3dzOgotCi1cYmVnaW57dGFibGVpaWl9e2x8bHxsfXt0ZXh0cm19e0ZsYWd9e01lYW5pbmd9e0V4cGxhbmF0aW9ufQotXGxpbmVpaWl7Un17UmVhZH17UmVhZH0KLVxsaW5laWlpe099e09sZH17UHJldmlvdXNseSBkZXRlY3RlZCBieSBNVUF9Ci1cbGluZWlpaXtEfXtEZWxldGVkfXtNYXJrZWQgZm9yIHN1YnNlcXVlbnQgZGVsZXRpb259Ci1cbGluZWlpaXtGfXtGbGFnZ2VkfXtNYXJrZWQgYXMgaW1wb3J0YW50fQotXGxpbmVpaWl7QX17QW5zd2VyZWR9e1JlcGxpZWQgdG99Ci1cZW5ke3RhYmxlaWlpfQotCi1UaGUgIlIiIGFuZCAiTyIgZmxhZ3MgYXJlIHN0b3JlZCBpbiB0aGUgXG1haWxoZWFkZXJ7U3RhdHVzfSBoZWFkZXIsIGFuZCB0aGUKLSJEIiwgIkYiLCBhbmQgIkEiIGZsYWdzIGFyZSBzdG9yZWQgaW4gdGhlIFxtYWlsaGVhZGVye1gtU3RhdHVzfSBoZWFkZXIuIFRoZQotZmxhZ3MgYW5kIGhlYWRlcnMgdHlwaWNhbGx5IGFwcGVhciBpbiB0aGUgb3JkZXIgbWVudGlvbmVkLgotCi1cY2xhc3N7TU1ERk1lc3NhZ2V9IGluc3RhbmNlcyBvZmZlciB0aGUgZm9sbG93aW5nIG1ldGhvZHMsIHdoaWNoIGFyZSBpZGVudGljYWwKLXRvIHRob3NlIG9mZmVyZWQgYnkgXGNsYXNze21ib3hNZXNzYWdlfToKLQotXGJlZ2lue21ldGhvZGRlc2N9e2dldF9mcm9tfXt9Ci1SZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSAiRnJvbX4iIGxpbmUgdGhhdCBtYXJrcyB0aGUgc3RhcnQgb2YgdGhlCi1tZXNzYWdlIGluIGFuIG1ib3ggbWFpbGJveC4gVGhlIGxlYWRpbmcgIkZyb21+IiBhbmQgdGhlIHRyYWlsaW5nIG5ld2xpbmUgYXJlCi1leGNsdWRlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3NldF9mcm9tfXtmcm9tX1xvcHRpb25hbHssIHRpbWVfPU5vbmV9fQotU2V0IHRoZSAiRnJvbX4iIGxpbmUgdG8gXHZhcntmcm9tX30sIHdoaWNoIHNob3VsZCBiZSBzcGVjaWZpZWQgd2l0aG91dCBhCi1sZWFkaW5nICJGcm9tfiIgb3IgdHJhaWxpbmcgbmV3bGluZS4gRm9yIGNvbnZlbmllbmNlLCBcdmFye3RpbWVffSBtYXkgYmUKLXNwZWNpZmllZCBhbmQgd2lsbCBiZSBmb3JtYXR0ZWQgYXBwcm9wcmlhdGVseSBhbmQgYXBwZW5kZWQgdG8gXHZhcntmcm9tX30uIElmCi1cdmFye3RpbWVffSBpcyBzcGVjaWZpZWQsIGl0IHNob3VsZCBiZSBhIFxjbGFzc3tzdHJ1Y3RfdGltZX0gaW5zdGFuY2UsIGEgdHVwbGUKLXN1aXRhYmxlIGZvciBwYXNzaW5nIHRvIFxtZXRob2R7dGltZS5zdHJmdGltZSgpfSwgb3IgXGNvZGV7VHJ1ZX0gKHRvIHVzZQotXG1ldGhvZHt0aW1lLmdtdGltZSgpfSkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtnZXRfZmxhZ3N9e30KLVJldHVybiBhIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBmbGFncyB0aGF0IGFyZSBjdXJyZW50bHkgc2V0LiBJZiB0aGUgbWVzc2FnZQotY29tcGxpZXMgd2l0aCB0aGUgY29udmVudGlvbmFsIGZvcm1hdCwgdGhlIHJlc3VsdCBpcyB0aGUgY29uY2F0ZW5hdGlvbiBpbiB0aGUKLWZvbGxvd2luZyBvcmRlciBvZiB6ZXJvIG9yIG9uZSBvY2N1cnJlbmNlIG9mIGVhY2ggb2YgXGNoYXJhY3RlcntSfSwKLVxjaGFyYWN0ZXJ7T30sIFxjaGFyYWN0ZXJ7RH0sIFxjaGFyYWN0ZXJ7Rn0sIGFuZCBcY2hhcmFjdGVye0F9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317c2V0X2ZsYWdzfXtmbGFnc30KLVNldCB0aGUgZmxhZ3Mgc3BlY2lmaWVkIGJ5IFx2YXJ7ZmxhZ3N9IGFuZCB1bnNldCBhbGwgb3RoZXJzLiBQYXJhbWV0ZXIKLVx2YXJ7ZmxhZ3N9IHNob3VsZCBiZSB0aGUgY29uY2F0ZW5hdGlvbiBpbiBhbnkgb3JkZXIgb2YgemVybyBvciBtb3JlCi1vY2N1cnJlbmNlcyBvZiBlYWNoIG9mIFxjaGFyYWN0ZXJ7Un0sIFxjaGFyYWN0ZXJ7T30sIFxjaGFyYWN0ZXJ7RH0sCi1cY2hhcmFjdGVye0Z9LCBhbmQgXGNoYXJhY3RlcntBfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2FkZF9mbGFnfXtmbGFnfQotU2V0IHRoZSBmbGFnKHMpIHNwZWNpZmllZCBieSBcdmFye2ZsYWd9IHdpdGhvdXQgY2hhbmdpbmcgb3RoZXIgZmxhZ3MuIFRvIGFkZAotbW9yZSB0aGFuIG9uZSBmbGFnIGF0IGEgdGltZSwgXHZhcntmbGFnfSBtYXkgYmUgYSBzdHJpbmcgb2YgbW9yZSB0aGFuIG9uZQotY2hhcmFjdGVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317cmVtb3ZlX2ZsYWd9e2ZsYWd9Ci1VbnNldCB0aGUgZmxhZyhzKSBzcGVjaWZpZWQgYnkgXHZhcntmbGFnfSB3aXRob3V0IGNoYW5naW5nIG90aGVyIGZsYWdzLiBUbwotcmVtb3ZlIG1vcmUgdGhhbiBvbmUgZmxhZyBhdCBhIHRpbWUsIFx2YXJ7ZmxhZ30gbWF5YmUgYSBzdHJpbmcgb2YgbW9yZSB0aGFuIG9uZQotY2hhcmFjdGVyLgotXGVuZHttZXRob2RkZXNjfQotCi1XaGVuIGFuIFxjbGFzc3tNTURGTWVzc2FnZX0gaW5zdGFuY2UgaXMgY3JlYXRlZCBiYXNlZCB1cG9uIGEKLVxjbGFzc3tNYWlsZGlyTWVzc2FnZX0gaW5zdGFuY2UsIGEgIkZyb21+IiBsaW5lIGlzIGdlbmVyYXRlZCBiYXNlZCB1cG9uIHRoZQotXGNsYXNze01haWxkaXJNZXNzYWdlfSBpbnN0YW5jZSdzIGRlbGl2ZXJ5IGRhdGUsIGFuZCB0aGUgZm9sbG93aW5nIGNvbnZlcnNpb25zCi10YWtlIHBsYWNlOgotCi1cYmVnaW57dGFibGVpaX17bHxsfXt0ZXh0cm19Ci0gICAge1Jlc3VsdGluZyBzdGF0ZX17XGNsYXNze01haWxkaXJNZXNzYWdlfSBzdGF0ZX0KLVxsaW5laWl7UiBmbGFnfXtTIGZsYWd9Ci1cbGluZWlpe08gZmxhZ317ImN1ciIgc3ViZGlyZWN0b3J5fQotXGxpbmVpaXtEIGZsYWd9e1QgZmxhZ30KLVxsaW5laWl7RiBmbGFnfXtGIGZsYWd9Ci1cbGluZWlpe0EgZmxhZ317UiBmbGFnfQotXGVuZHt0YWJsZWlpfQotCi1XaGVuIGFuIFxjbGFzc3tNTURGTWVzc2FnZX0gaW5zdGFuY2UgaXMgY3JlYXRlZCBiYXNlZCB1cG9uIGFuIFxjbGFzc3tNSE1lc3NhZ2V9Ci1pbnN0YW5jZSwgdGhlIGZvbGxvd2luZyBjb252ZXJzaW9ucyB0YWtlIHBsYWNlOgotCi1cYmVnaW57dGFibGVpaX17bHxsfXt0ZXh0cm19Ci0gICAge1Jlc3VsdGluZyBzdGF0ZX17XGNsYXNze01ITWVzc2FnZX0gc3RhdGV9Ci1cbGluZWlpe1IgZmxhZyBhbmQgTyBmbGFnfXtubyAidW5zZWVuIiBzZXF1ZW5jZX0KLVxsaW5laWl7TyBmbGFnfXsidW5zZWVuIiBzZXF1ZW5jZX0KLVxsaW5laWl7RiBmbGFnfXsiZmxhZ2dlZCIgc2VxdWVuY2V9Ci1cbGluZWlpe0EgZmxhZ317InJlcGxpZWQiIHNlcXVlbmNlfQotXGVuZHt0YWJsZWlpfQotCi1XaGVuIGFuIFxjbGFzc3tNTURGTWVzc2FnZX0gaW5zdGFuY2UgaXMgY3JlYXRlZCBiYXNlZCB1cG9uIGEKLVxjbGFzc3tCYWJ5bE1lc3NhZ2V9IGluc3RhbmNlLCB0aGUgZm9sbG93aW5nIGNvbnZlcnNpb25zIHRha2UgcGxhY2U6Ci0KLVxiZWdpbnt0YWJsZWlpfXtsfGx9e3RleHRybX0KLSAgICB7UmVzdWx0aW5nIHN0YXRlfXtcY2xhc3N7QmFieWxNZXNzYWdlfSBzdGF0ZX0KLVxsaW5laWl7UiBmbGFnIGFuZCBPIGZsYWd9e25vICJ1bnNlZW4iIGxhYmVsfQotXGxpbmVpaXtPIGZsYWd9eyJ1bnNlZW4iIGxhYmVsfQotXGxpbmVpaXtEIGZsYWd9eyJkZWxldGVkIiBsYWJlbH0KLVxsaW5laWl7QSBmbGFnfXsiYW5zd2VyZWQiIGxhYmVsfQotXGVuZHt0YWJsZWlpfQotCi1XaGVuIGFuIFxjbGFzc3tNTURGTWVzc2FnZX0gaW5zdGFuY2UgaXMgY3JlYXRlZCBiYXNlZCB1cG9uIGFuCi1cY2xhc3N7bWJveE1lc3NhZ2V9IGluc3RhbmNlLCB0aGUgIkZyb21+IiBsaW5lIGlzIGNvcGllZCBhbmQgYWxsIGZsYWdzIGRpcmVjdGx5Ci1jb3JyZXNwb25kOgotCi1cYmVnaW57dGFibGVpaX17bHxsfXt0ZXh0cm19Ci0gICAge1Jlc3VsdGluZyBzdGF0ZX17XGNsYXNze21ib3hNZXNzYWdlfSBzdGF0ZX0KLVxsaW5laWl7UiBmbGFnfXtSIGZsYWd9Ci1cbGluZWlpe08gZmxhZ317TyBmbGFnfQotXGxpbmVpaXtEIGZsYWd9e0QgZmxhZ30KLVxsaW5laWl7RiBmbGFnfXtGIGZsYWd9Ci1cbGluZWlpe0EgZmxhZ317QSBmbGFnfQotXGVuZHt0YWJsZWlpfQotCi1cc3Vic2VjdGlvbntFeGNlcHRpb25zfQotCi1UaGUgZm9sbG93aW5nIGV4Y2VwdGlvbiBjbGFzc2VzIGFyZSBkZWZpbmVkIGluIHRoZSBcbW9kdWxle21haWxib3h9IG1vZHVsZToKLQotXGJlZ2lue2NsYXNzZGVzY317RXJyb3J9e30KLVRoZSBiYXNlZCBjbGFzcyBmb3IgYWxsIG90aGVyIG1vZHVsZS1zcGVjaWZpYyBleGNlcHRpb25zLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e05vU3VjaE1haWxib3hFcnJvcn17fQotUmFpc2VkIHdoZW4gYSBtYWlsYm94IGlzIGV4cGVjdGVkIGJ1dCBpcyBub3QgZm91bmQsIHN1Y2ggYXMgd2hlbiBpbnN0YW50aWF0aW5nCi1hIFxjbGFzc3tNYWlsYm94fSBzdWJjbGFzcyB3aXRoIGEgcGF0aCB0aGF0IGRvZXMgbm90IGV4aXN0IChhbmQgd2l0aCB0aGUKLVx2YXJ7Y3JlYXRlfSBwYXJhbWV0ZXIgc2V0IHRvIFxjb2Rle0ZhbHNlfSksIG9yIHdoZW4gb3BlbmluZyBhIGZvbGRlciB0aGF0IGRvZXMKLW5vdCBleGlzdC4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtOb3RFbXB0eUVycm9yRXJyb3J9e30KLVJhaXNlZCB3aGVuIGEgbWFpbGJveCBpcyBub3QgZW1wdHkgYnV0IGlzIGV4cGVjdGVkIHRvIGJlLCBzdWNoIGFzIHdoZW4gZGVsZXRpbmcKLWEgZm9sZGVyIHRoYXQgY29udGFpbnMgbWVzc2FnZXMuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317RXh0ZXJuYWxDbGFzaEVycm9yfXt9Ci1SYWlzZWQgd2hlbiBzb21lIG1haWxib3gtcmVsYXRlZCBjb25kaXRpb24gYmV5b25kIHRoZSBjb250cm9sIG9mIHRoZSBwcm9ncmFtCi1jYXVzZXMgaXQgdG8gYmUgdW5hYmxlIHRvIHByb2NlZWQsIHN1Y2ggYXMgd2hlbiBmYWlsaW5nIHRvIGFjcXVpcmUgYSBsb2NrIHRoYXQKLWFub3RoZXIgcHJvZ3JhbSBhbHJlYWR5IGhvbGRzIGEgbG9jaywgb3Igd2hlbiBhIHVuaXF1ZWx5LWdlbmVyYXRlZCBmaWxlIG5hbWUKLWFscmVhZHkgZXhpc3RzLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0Zvcm1hdEVycm9yfXt9Ci1SYWlzZWQgd2hlbiB0aGUgZGF0YSBpbiBhIGZpbGUgY2Fubm90IGJlIHBhcnNlZCwgc3VjaCBhcyB3aGVuIGFuIFxjbGFzc3tNSH0KLWluc3RhbmNlIGF0dGVtcHRzIHRvIHJlYWQgYSBjb3JydXB0ZWQgXGZpbGV7Lm1oX3NlcXVlbmNlc30gZmlsZS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cc3Vic2VjdGlvbntEZXByZWNhdGVkIGNsYXNzZXMgYW5kIG1ldGhvZHN9Ci1cbGFiZWx7bWFpbGJveC1kZXByZWNhdGVkfQotCi1PbGRlciB2ZXJzaW9ucyBvZiB0aGUgXG1vZHVsZXttYWlsYm94fSBtb2R1bGUgZG8gbm90IHN1cHBvcnQgbW9kaWZpY2F0aW9uIG9mCi1tYWlsYm94ZXMsIHN1Y2ggYXMgYWRkaW5nIG9yIHJlbW92aW5nIG1lc3NhZ2UsIGFuZCBkbyBub3QgcHJvdmlkZSBjbGFzc2VzIHRvCi1yZXByZXNlbnQgZm9ybWF0LXNwZWNpZmljIG1lc3NhZ2UgcHJvcGVydGllcy4gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZQotb2xkZXIgbWFpbGJveCBjbGFzc2VzIGFyZSBzdGlsbCBhdmFpbGFibGUsIGJ1dCB0aGUgbmV3ZXIgY2xhc3NlcyBzaG91bGQgYmUgdXNlZAotaW4gcHJlZmVyZW5jZSB0byB0aGVtLgotCi1PbGRlciBtYWlsYm94IG9iamVjdHMgc3VwcG9ydCBvbmx5IGl0ZXJhdGlvbiBhbmQgcHJvdmlkZSBhIHNpbmdsZSBwdWJsaWMKLW1ldGhvZDoKLQotXGJlZ2lue21ldGhvZGRlc2N9W29sZG1haWxib3hde25leHR9e30KLVJldHVybiB0aGUgbmV4dCBtZXNzYWdlIGluIHRoZSBtYWlsYm94LCBjcmVhdGVkIHdpdGggdGhlIG9wdGlvbmFsIFx2YXJ7ZmFjdG9yeX0KLWFyZ3VtZW50IHBhc3NlZCBpbnRvIHRoZSBtYWlsYm94IG9iamVjdCdzIGNvbnN0cnVjdG9yLiBCeSBkZWZhdWx0IHRoaXMgaXMgYW4KLVxjbGFzc3tyZmM4MjIuTWVzc2FnZX0gb2JqZWN0IChzZWUgdGhlIFxyZWZtb2R1bGV7cmZjODIyfSBtb2R1bGUpLiAgRGVwZW5kaW5nCi1vbiB0aGUgbWFpbGJveCBpbXBsZW1lbnRhdGlvbiB0aGUgXHZhcntmcH0gYXR0cmlidXRlIG9mIHRoaXMgb2JqZWN0IG1heSBiZSBhCi10cnVlIGZpbGUgb2JqZWN0IG9yIGEgY2xhc3MgaW5zdGFuY2Ugc2ltdWxhdGluZyBhIGZpbGUgb2JqZWN0LCB0YWtpbmcgY2FyZSBvZgotdGhpbmdzIGxpa2UgbWVzc2FnZSBib3VuZGFyaWVzIGlmIG11bHRpcGxlIG1haWwgbWVzc2FnZXMgYXJlIGNvbnRhaW5lZCBpbiBhCi1zaW5nbGUgZmlsZSwgZXRjLiAgSWYgbm8gbW9yZSBtZXNzYWdlcyBhcmUgYXZhaWxhYmxlLCB0aGlzIG1ldGhvZCByZXR1cm5zCi1cY29kZXtOb25lfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotTW9zdCBvZiB0aGUgb2xkZXIgbWFpbGJveCBjbGFzc2VzIGhhdmUgbmFtZXMgdGhhdCBkaWZmZXIgZnJvbSB0aGUgY3VycmVudAotbWFpbGJveCBjbGFzcyBuYW1lcywgZXhjZXB0IGZvciBcY2xhc3N7TWFpbGRpcn0uIEZvciB0aGlzIHJlYXNvbiwgdGhlIG5ldwotXGNsYXNze01haWxkaXJ9IGNsYXNzIGRlZmluZXMgYSBcbWV0aG9ke25leHQoKX0gbWV0aG9kIGFuZCBpdHMgY29uc3RydWN0b3IKLWRpZmZlcnMgc2xpZ2h0bHkgZnJvbSB0aG9zZSBvZiB0aGUgb3RoZXIgbmV3IG1haWxib3ggY2xhc3Nlcy4KLQotVGhlIG9sZGVyIG1haWxib3ggY2xhc3NlcyB3aG9zZSBuYW1lcyBhcmUgbm90IHRoZSBzYW1lIGFzIHRoZWlyIG5ld2VyCi1jb3VudGVycGFydHMgYXJlIGFzIGZvbGxvd3M6Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1VuaXhNYWlsYm94fXtmcFxvcHRpb25hbHssIGZhY3Rvcnl9fQotQWNjZXNzIHRvIGEgY2xhc3NpYyBcVU5JWC1zdHlsZSBtYWlsYm94LCB3aGVyZSBhbGwgbWVzc2FnZXMgYXJlCi1jb250YWluZWQgaW4gYSBzaW5nbGUgZmlsZSBhbmQgc2VwYXJhdGVkIGJ5IFxzYW1we0Zyb20gfQotKGEuay5hLlwgXHNhbXB7RnJvbV99KSBsaW5lcy4gIFRoZSBmaWxlIG9iamVjdCBcdmFye2ZwfSBwb2ludHMgdG8gdGhlCi1tYWlsYm94IGZpbGUuICBUaGUgb3B0aW9uYWwgXHZhcntmYWN0b3J5fSBwYXJhbWV0ZXIgaXMgYSBjYWxsYWJsZSB0aGF0Ci1zaG91bGQgY3JlYXRlIG5ldyBtZXNzYWdlIG9iamVjdHMuICBcdmFye2ZhY3Rvcnl9IGlzIGNhbGxlZCB3aXRoIG9uZQotYXJndW1lbnQsIFx2YXJ7ZnB9IGJ5IHRoZSBcbWV0aG9ke25leHQoKX0gbWV0aG9kIG9mIHRoZSBtYWlsYm94Ci1vYmplY3QuICBUaGUgZGVmYXVsdCBpcyB0aGUgXGNsYXNze3JmYzgyMi5NZXNzYWdlfSBjbGFzcyAoc2VlIHRoZQotXHJlZm1vZHVsZXtyZmM4MjJ9IG1vZHVsZSAtLSBhbmQgdGhlIG5vdGUgYmVsb3cpLgotCi1cYmVnaW57bm90aWNlfQotICBGb3IgcmVhc29ucyBvZiB0aGlzIG1vZHVsZSdzIGludGVybmFsIGltcGxlbWVudGF0aW9uLCB5b3Ugd2lsbAotICBwcm9iYWJseSB3YW50IHRvIG9wZW4gdGhlIFx2YXJ7ZnB9IG9iamVjdCBpbiBiaW5hcnkgbW9kZS4gIFRoaXMgaXMKLSAgZXNwZWNpYWxseSBpbXBvcnRhbnQgb24gV2luZG93cy4KLVxlbmR7bm90aWNlfQotCi1Gb3IgbWF4aW11bSBwb3J0YWJpbGl0eSwgbWVzc2FnZXMgaW4gYSBcVU5JWC1zdHlsZSBtYWlsYm94IGFyZQotc2VwYXJhdGVkIGJ5IGFueSBsaW5lIHRoYXQgYmVnaW5zIGV4YWN0bHkgd2l0aCB0aGUgc3RyaW5nIFxjb2RleydGcm9tCi0nfSAobm90ZSB0aGUgdHJhaWxpbmcgc3BhY2UpIGlmIHByZWNlZGVkIGJ5IGV4YWN0bHkgdHdvIG5ld2xpbmVzLgotQmVjYXVzZSBvZiB0aGUgd2lkZS1yYW5nZSBvZiB2YXJpYXRpb25zIGluIHByYWN0aWNlLCBub3RoaW5nIGVsc2Ugb24KLXRoZSBcc2FtcHtGcm9tX30gbGluZSBzaG91bGQgYmUgY29uc2lkZXJlZC4gIEhvd2V2ZXIsIHRoZSBjdXJyZW50Ci1pbXBsZW1lbnRhdGlvbiBkb2Vzbid0IGNoZWNrIGZvciB0aGUgbGVhZGluZyB0d28gbmV3bGluZXMuICBUaGlzIGlzCi11c3VhbGx5IGZpbmUgZm9yIG1vc3QgYXBwbGljYXRpb25zLgotCi1UaGUgXGNsYXNze1VuaXhNYWlsYm94fSBjbGFzcyBpbXBsZW1lbnRzIGEgbW9yZSBzdHJpY3QgdmVyc2lvbiBvZgotXHNhbXB7RnJvbV99IGxpbmUgY2hlY2tpbmcsIHVzaW5nIGEgcmVndWxhciBleHByZXNzaW9uIHRoYXQgdXN1YWxseSBjb3JyZWN0bHkKLW1hdGNoZWQgXHNhbXB7RnJvbV99IGRlbGltaXRlcnMuICBJdCBjb25zaWRlcnMgZGVsaW1pdGVyIGxpbmUgdG8gYmUgc2VwYXJhdGVkCi1ieSBcc2FtcHtGcm9tIFx2YXJ7bmFtZX0gXHZhcnt0aW1lfX0gbGluZXMuICBGb3IgbWF4aW11bSBwb3J0YWJpbGl0eSwKLXVzZSB0aGUgXGNsYXNze1BvcnRhYmxlVW5peE1haWxib3h9IGNsYXNzIGluc3RlYWQuICBUaGlzIGNsYXNzIGlzCi1pZGVudGljYWwgdG8gXGNsYXNze1VuaXhNYWlsYm94fSBleGNlcHQgdGhhdCBpbmRpdmlkdWFsIG1lc3NhZ2VzIGFyZQotc2VwYXJhdGVkIGJ5IG9ubHkgXHNhbXB7RnJvbSB9IGxpbmVzLgotCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlCi1cY2l0ZXRpdGxlW2h0dHA6Ly9ob21lLm5ldHNjYXBlLmNvbS9lbmcvbW96aWxsYS8yLjAvcmVsbm90ZXMvZGVtby9jb250ZW50LWxlbmd0aC5odG1sXXtDb25maWd1cmluZwotTmV0c2NhcGUgTWFpbCBvbiBcVU5JWDogV2h5IHRoZSBDb250ZW50LUxlbmd0aCBGb3JtYXQgaXMgQmFkfS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtQb3J0YWJsZVVuaXhNYWlsYm94fXtmcFxvcHRpb25hbHssIGZhY3Rvcnl9fQotQSBsZXNzLXN0cmljdCB2ZXJzaW9uIG9mIFxjbGFzc3tVbml4TWFpbGJveH0sIHdoaWNoIGNvbnNpZGVycyBvbmx5IHRoZQotXHNhbXB7RnJvbSB9IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgc2VwYXJhdGluZyBtZXNzYWdlcy4gIFRoZQotYGBcdmFye25hbWV9IFx2YXJ7dGltZX0nJyBwb3J0aW9uIG9mIHRoZSBGcm9tIGxpbmUgaXMgaWdub3JlZCwgdG8KLXByb3RlY3QgYWdhaW5zdCBzb21lIHZhcmlhdGlvbnMgdGhhdCBhcmUgb2JzZXJ2ZWQgaW4gcHJhY3RpY2UuICBUaGlzCi13b3JrcyBzaW5jZSBsaW5lcyBpbiB0aGUgbWVzc2FnZSB3aGljaCBiZWdpbiB3aXRoIFxjb2RleydGcm9tICd9IGFyZQotcXVvdGVkIGJ5IG1haWwgaGFuZGxpbmcgc29mdHdhcmUgYXQgZGVsaXZlcnktdGltZS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtNbWRmTWFpbGJveH17ZnBcb3B0aW9uYWx7LCBmYWN0b3J5fX0KLUFjY2VzcyBhbiBNTURGLXN0eWxlIG1haWxib3gsIHdoZXJlIGFsbCBtZXNzYWdlcyBhcmUgY29udGFpbmVkCi1pbiBhIHNpbmdsZSBmaWxlIGFuZCBzZXBhcmF0ZWQgYnkgbGluZXMgY29uc2lzdGluZyBvZiA0IGNvbnRyb2wtQQotY2hhcmFjdGVycy4gIFRoZSBmaWxlIG9iamVjdCBcdmFye2ZwfSBwb2ludHMgdG8gdGhlIG1haWxib3ggZmlsZS4KLU9wdGlvbmFsIFx2YXJ7ZmFjdG9yeX0gaXMgYXMgd2l0aCB0aGUgXGNsYXNze1VuaXhNYWlsYm94fSBjbGFzcy4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtNSE1haWxib3h9e2Rpcm5hbWVcb3B0aW9uYWx7LCBmYWN0b3J5fX0KLUFjY2VzcyBhbiBNSCBtYWlsYm94LCBhIGRpcmVjdG9yeSB3aXRoIGVhY2ggbWVzc2FnZSBpbiBhIHNlcGFyYXRlCi1maWxlIHdpdGggYSBudW1lcmljIG5hbWUuCi1UaGUgbmFtZSBvZiB0aGUgbWFpbGJveCBkaXJlY3RvcnkgaXMgcGFzc2VkIGluIFx2YXJ7ZGlybmFtZX0uCi1cdmFye2ZhY3Rvcnl9IGlzIGFzIHdpdGggdGhlIFxjbGFzc3tVbml4TWFpbGJveH0gY2xhc3MuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317QmFieWxNYWlsYm94fXtmcFxvcHRpb25hbHssIGZhY3Rvcnl9fQotQWNjZXNzIGEgQmFieWwgbWFpbGJveCwgd2hpY2ggaXMgc2ltaWxhciB0byBhbiBNTURGIG1haWxib3guICBJbgotQmFieWwgZm9ybWF0LCBlYWNoIG1lc3NhZ2UgaGFzIHR3byBzZXRzIG9mIGhlYWRlcnMsIHRoZQotXGVtcGh7b3JpZ2luYWx9IGhlYWRlcnMgYW5kIHRoZSBcZW1waHt2aXNpYmxlfSBoZWFkZXJzLiAgVGhlIG9yaWdpbmFsCi1oZWFkZXJzIGFwcGVhciBiZWZvcmUgYSBsaW5lIGNvbnRhaW5pbmcgb25seSBcY29kZXsnKioqIEVPT0ggKioqJ30KLShFbmQtT2YtT3JpZ2luYWwtSGVhZGVycykgYW5kIHRoZSB2aXNpYmxlIGhlYWRlcnMgYXBwZWFyIGFmdGVyIHRoZQotXGNvZGV7RU9PSH0gbGluZS4gIEJhYnlsLWNvbXBsaWFudCBtYWlsIHJlYWRlcnMgd2lsbCBzaG93IHlvdSBvbmx5IHRoZQotdmlzaWJsZSBoZWFkZXJzLCBhbmQgXGNsYXNze0JhYnlsTWFpbGJveH0gb2JqZWN0cyB3aWxsIHJldHVybiBtZXNzYWdlcwotY29udGFpbmluZyBvbmx5IHRoZSB2aXNpYmxlIGhlYWRlcnMuICBZb3UnbGwgaGF2ZSB0byBkbyB5b3VyIG93bgotcGFyc2luZyBvZiB0aGUgbWFpbGJveCBmaWxlIHRvIGdldCBhdCB0aGUgb3JpZ2luYWwgaGVhZGVycy4gIE1haWwKLW1lc3NhZ2VzIHN0YXJ0IHdpdGggdGhlIEVPT0ggbGluZSBhbmQgZW5kIHdpdGggYSBsaW5lIGNvbnRhaW5pbmcgb25seQotXGNvZGV7J1xle30wMzdcZXt9MDE0J30uICBcdmFye2ZhY3Rvcnl9IGlzIGFzIHdpdGggdGhlCi1cY2xhc3N7VW5peE1haWxib3h9IGNsYXNzLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLUlmIHlvdSB3aXNoIHRvIHVzZSB0aGUgb2xkZXIgbWFpbGJveCBjbGFzc2VzIHdpdGggdGhlIFxtb2R1bGV7ZW1haWx9IG1vZHVsZQotcmF0aGVyIHRoYW4gdGhlIGRlcHJlY2F0ZWQgXG1vZHVsZXtyZmM4MjJ9IG1vZHVsZSwgeW91IGNhbiBkbyBzbyBhcyBmb2xsb3dzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgZW1haWwKLWltcG9ydCBlbWFpbC5FcnJvcnMKLWltcG9ydCBtYWlsYm94Ci0KLWRlZiBtc2dmYWN0b3J5KGZwKToKLSAgICB0cnk6Ci0gICAgICAgIHJldHVybiBlbWFpbC5tZXNzYWdlX2Zyb21fZmlsZShmcCkKLSAgICBleGNlcHQgZW1haWwuRXJyb3JzLk1lc3NhZ2VQYXJzZUVycm9yOgotICAgICAgICAjIERvbid0IHJldHVybiBOb25lIHNpbmNlIHRoYXQgd2lsbAotICAgICAgICAjIHN0b3AgdGhlIG1haWxib3ggaXRlcmF0b3IKLSAgICAgICAgcmV0dXJuICcnCi0KLW1ib3ggPSBtYWlsYm94LlVuaXhNYWlsYm94KGZwLCBtc2dmYWN0b3J5KQotXGVuZHt2ZXJiYXRpbX0KLQotQWx0ZXJuYXRpdmVseSwgaWYgeW91IGtub3cgeW91ciBtYWlsYm94IGNvbnRhaW5zIG9ubHkgd2VsbC1mb3JtZWQgTUlNRQotbWVzc2FnZXMsIHlvdSBjYW4gc2ltcGxpZnkgdGhpcyB0bzoKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IGVtYWlsCi1pbXBvcnQgbWFpbGJveAotCi1tYm94ID0gbWFpbGJveC5Vbml4TWFpbGJveChmcCwgZW1haWwubWVzc2FnZV9mcm9tX2ZpbGUpCi1cZW5ke3ZlcmJhdGltfQotCi1cc3Vic2VjdGlvbntFeGFtcGxlc30KLVxsYWJlbHttYWlsYm94LWV4YW1wbGVzfQotCi1BIHNpbXBsZSBleGFtcGxlIG9mIHByaW50aW5nIHRoZSBzdWJqZWN0cyBvZiBhbGwgbWVzc2FnZXMgaW4gYSBtYWlsYm94IHRoYXQKLXNlZW0gaW50ZXJlc3Rpbmc6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCBtYWlsYm94Ci1mb3IgbWVzc2FnZSBpbiBtYWlsYm94Lm1ib3goJ34vbWJveCcpOgotICAgIHN1YmplY3QgPSBtZXNzYWdlWydzdWJqZWN0J10gICAgICAgIyBDb3VsZCBwb3NzaWJseSBiZSBOb25lLgotICAgIGlmIHN1YmplY3QgYW5kICdweXRob24nIGluIHN1YmplY3QubG93ZXIoKToKLSAgICAgICAgcHJpbnQgc3ViamVjdAotXGVuZHt2ZXJiYXRpbX0KLQotVG8gY29weSBhbGwgbWFpbCBmcm9tIGEgQmFieWwgbWFpbGJveCB0byBhbiBNSCBtYWlsYm94LCBjb252ZXJ0aW5nIGFsbAotb2YgdGhlIGZvcm1hdC1zcGVjaWZpYyBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCBtYWlsYm94Ci1kZXN0aW5hdGlvbiA9IG1haWxib3guTUgoJ34vTWFpbCcpCi1kZXN0aW5hdGlvbi5sb2NrKCkKLWZvciBtZXNzYWdlIGluIG1haWxib3guQmFieWwoJ34vUk1BSUwnKToKLSAgICBkZXN0aW5hdGlvbi5hZGQoTUhNZXNzYWdlKG1lc3NhZ2UpKQotZGVzdGluYXRpb24uZmx1c2goKQotZGVzdGluYXRpb24udW5sb2NrKCkKLVxlbmR7dmVyYmF0aW19Ci0KLVRoaXMgZXhhbXBsZSBzb3J0cyBtYWlsIGZyb20gc2V2ZXJhbCBtYWlsaW5nIGxpc3RzIGludG8gZGlmZmVyZW50Ci1tYWlsYm94ZXMsIGJlaW5nIGNhcmVmdWwgdG8gYXZvaWQgbWFpbCBjb3JydXB0aW9uIGR1ZSB0byBjb25jdXJyZW50Ci1tb2RpZmljYXRpb24gYnkgb3RoZXIgcHJvZ3JhbXMsIG1haWwgbG9zcyBkdWUgdG8gaW50ZXJydXB0aW9uIG9mIHRoZQotcHJvZ3JhbSwgb3IgcHJlbWF0dXJlIHRlcm1pbmF0aW9uIGR1ZSB0byBtYWxmb3JtZWQgbWVzc2FnZXMgaW4gdGhlCi1tYWlsYm94OgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgbWFpbGJveAotaW1wb3J0IGVtYWlsLkVycm9ycwotCi1saXN0X25hbWVzID0gKCdweXRob24tbGlzdCcsICdweXRob24tZGV2JywgJ3B5dGhvbi1idWdzJykKLQotYm94ZXMgPSBkaWN0KChuYW1lLCBtYWlsYm94Lm1ib3goJ34vZW1haWwvJXMnICUgbmFtZSkpIGZvciBuYW1lIGluIGxpc3RfbmFtZXMpCi1pbmJveCA9IG1haWxib3guTWFpbGRpcignfi9NYWlsZGlyJywgZmFjdG9yeT1Ob25lKQotCi1mb3Iga2V5IGluIGluYm94Lml0ZXJrZXlzKCk6Ci0gICAgdHJ5OgotICAgICAgICBtZXNzYWdlID0gaW5ib3hba2V5XQotICAgIGV4Y2VwdCBlbWFpbC5FcnJvcnMuTWVzc2FnZVBhcnNlRXJyb3I6Ci0gICAgICAgIGNvbnRpbnVlICAgICAgICAgICAgICAgICMgVGhlIG1lc3NhZ2UgaXMgbWFsZm9ybWVkLiBKdXN0IGxlYXZlIGl0LgotCi0gICAgZm9yIG5hbWUgaW4gbGlzdF9uYW1lczoKLSAgICAgICAgbGlzdF9pZCA9IG1lc3NhZ2VbJ2xpc3QtaWQnXQotICAgICAgICBpZiBsaXN0X2lkIGFuZCBuYW1lIGluIGxpc3RfaWQ6Ci0gICAgICAgICAgICAjIEdldCBtYWlsYm94IHRvIHVzZQotICAgICAgICAgICAgYm94ID0gYm94ZXNbbmFtZV0KLQotICAgICAgICAgICAgIyBXcml0ZSBjb3B5IHRvIGRpc2sgYmVmb3JlIHJlbW92aW5nIG9yaWdpbmFsLgotICAgICAgICAgICAgIyBJZiB0aGVyZSdzIGEgY3Jhc2gsIHlvdSBtaWdodCBkdXBsaWNhdGUgYSBtZXNzYWdlLCBidXQKLSAgICAgICAgICAgICMgdGhhdCdzIGJldHRlciB0aGFuIGxvc2luZyBhIG1lc3NhZ2UgY29tcGxldGVseS4KLSAgICAgICAgICAgIGJveC5sb2NrKCkKLSAgICAgICAgICAgIGJveC5hZGQobWVzc2FnZSkKLSAgICAgICAgICAgIGJveC5mbHVzaCgpICAgICAgICAgCi0gICAgICAgICAgICBib3gudW5sb2NrKCkKLQotICAgICAgICAgICAgIyBSZW1vdmUgb3JpZ2luYWwgbWVzc2FnZQotICAgICAgICAgICAgaW5ib3gubG9jaygpCi0gICAgICAgICAgICBpbmJveC5kaXNjYXJkKGtleSkKLSAgICAgICAgICAgIGluYm94LmZsdXNoKCkKLSAgICAgICAgICAgIGluYm94LnVubG9jaygpCi0gICAgICAgICAgICBicmVhayAgICAgICAgICAgICAgICMgRm91bmQgZGVzdGluYXRpb24sIHNvIHN0b3AgbG9va2luZy4KLQotZm9yIGJveCBpbiBib3hlcy5pdGVydmFsdWVzKCk6Ci0gICAgYm94LmNsb3NlKCkKLVxlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYm1haWxjYXAudGV4IGIvRG9jL2xpYi9saWJtYWlsY2FwLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIyMWJiMy4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYm1haWxjYXAudGV4CisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXttYWlsY2FwfSAtLS0KLSAgICAgICAgIE1haWxjYXAgZmlsZSBoYW5kbGluZy59Ci1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17bWFpbGNhcH0KLQotXG1vZHVsZXN5bm9wc2lze01haWxjYXAgZmlsZSBoYW5kbGluZy59Ci0KLQotTWFpbGNhcCBmaWxlcyBhcmUgdXNlZCB0byBjb25maWd1cmUgaG93IE1JTUUtYXdhcmUgYXBwbGljYXRpb25zIHN1Y2gKLWFzIG1haWwgcmVhZGVycyBhbmQgV2ViIGJyb3dzZXJzIHJlYWN0IHRvIGZpbGVzIHdpdGggZGlmZmVyZW50IE1JTUUKLXR5cGVzLiAoVGhlIG5hbWUgYGBtYWlsY2FwJycgaXMgZGVyaXZlZCBmcm9tIHRoZSBwaHJhc2UgYGBtYWlsCi1jYXBhYmlsaXR5JycuKSAgRm9yIGV4YW1wbGUsIGEgbWFpbGNhcCBmaWxlIG1pZ2h0IGNvbnRhaW4gYSBsaW5lIGxpa2UKLVxzYW1we3ZpZGVvL21wZWc7IHhtcGVnIFwlc30uICBUaGVuLCBpZiB0aGUgdXNlciBlbmNvdW50ZXJzIGFuIGVtYWlsCi1tZXNzYWdlIG9yIFdlYiBkb2N1bWVudCB3aXRoIHRoZSBNSU1FIHR5cGUgXG1pbWV0eXBle3ZpZGVvL21wZWd9LAotXHNhbXB7XCVzfSB3aWxsIGJlIHJlcGxhY2VkIGJ5IGEgZmlsZW5hbWUgKHVzdWFsbHkgb25lIGJlbG9uZ2luZyB0byBhCi10ZW1wb3JhcnkgZmlsZSkgYW5kIHRoZSBccHJvZ3JhbXt4bXBlZ30gcHJvZ3JhbSBjYW4gYmUgYXV0b21hdGljYWxseQotc3RhcnRlZCB0byB2aWV3IHRoZSBmaWxlLgotCi1UaGUgbWFpbGNhcCBmb3JtYXQgaXMgZG9jdW1lbnRlZCBpbiBccmZjezE1MjR9LCBgYEEgVXNlciBBZ2VudAotQ29uZmlndXJhdGlvbiBNZWNoYW5pc20gRm9yIE11bHRpbWVkaWEgTWFpbCBGb3JtYXQgSW5mb3JtYXRpb24sJycgYnV0Ci1pcyBub3QgYW4gSW50ZXJuZXQgc3RhbmRhcmQuICBIb3dldmVyLCBtYWlsY2FwIGZpbGVzIGFyZSBzdXBwb3J0ZWQgb24KLW1vc3QgXFVOSVh7fSBzeXN0ZW1zLgotCi1cYmVnaW57ZnVuY2Rlc2N9e2ZpbmRtYXRjaH17Y2FwcywgTUlNRXR5cGUlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG9wdGlvbmFseywga2V5XG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZVxvcHRpb25hbHssIHBsaXN0fX19fQotUmV0dXJuIGEgMi10dXBsZTsgdGhlIGZpcnN0IGVsZW1lbnQgaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgY29tbWFuZAotbGluZSB0byBiZSBleGVjdXRlZAotKHdoaWNoIGNhbiBiZSBwYXNzZWQgdG8gXGZ1bmN0aW9ue29zLnN5c3RlbSgpfSksIGFuZCB0aGUgc2Vjb25kIGVsZW1lbnQgaXMKLXRoZSBtYWlsY2FwIGVudHJ5IGZvciBhIGdpdmVuIE1JTUUgdHlwZS4gIElmIG5vIG1hdGNoaW5nIE1JTUUKLXR5cGUgY2FuIGJlIGZvdW5kLCBcY29kZXsoTm9uZSwgTm9uZSl9IGlzIHJldHVybmVkLgotCi1cdmFye2tleX0gaXMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGRlc2lyZWQsIHdoaWNoIHJlcHJlc2VudHMgdGhlIHR5cGUKLW9mIGFjdGl2aXR5IHRvIGJlIHBlcmZvcm1lZDsgdGhlIGRlZmF1bHQgdmFsdWUgaXMgJ3ZpZXcnLCBzaW5jZSBpbiB0aGUgCi1tb3N0IGNvbW1vbiBjYXNlIHlvdSBzaW1wbHkgd2FudCB0byB2aWV3IHRoZSBib2R5IG9mIHRoZSBNSU1FLXR5cGVkCi1kYXRhLiAgT3RoZXIgcG9zc2libGUgdmFsdWVzIG1pZ2h0IGJlICdjb21wb3NlJyBhbmQgJ2VkaXQnLCBpZiB5b3UKLXdhbnRlZCB0byBjcmVhdGUgYSBuZXcgYm9keSBvZiB0aGUgZ2l2ZW4gTUlNRSB0eXBlIG9yIGFsdGVyIHRoZQotZXhpc3RpbmcgYm9keSBkYXRhLiAgU2VlIFxyZmN7MTUyNH0gZm9yIGEgY29tcGxldGUgbGlzdCBvZiB0aGVzZQotZmllbGRzLgotCi1cdmFye2ZpbGVuYW1lfSBpcyB0aGUgZmlsZW5hbWUgdG8gYmUgc3Vic3RpdHV0ZWQgZm9yIFxzYW1we1wlc30gaW4gdGhlCi1jb21tYW5kIGxpbmU7IHRoZSBkZWZhdWx0IHZhbHVlIGlzCi1cY29kZXsnL2Rldi9udWxsJ30gd2hpY2ggaXMgYWxtb3N0IGNlcnRhaW5seSBub3Qgd2hhdCB5b3Ugd2FudCwgc28KLXVzdWFsbHkgeW91J2xsIG92ZXJyaWRlIGl0IGJ5IHNwZWNpZnlpbmcgYSBmaWxlbmFtZS4KLQotXHZhcntwbGlzdH0gY2FuIGJlIGEgbGlzdCBjb250YWluaW5nIG5hbWVkIHBhcmFtZXRlcnM7IHRoZSBkZWZhdWx0Ci12YWx1ZSBpcyBzaW1wbHkgYW4gZW1wdHkgbGlzdC4gIEVhY2ggZW50cnkgaW4gdGhlIGxpc3QgbXVzdCBiZSBhCi1zdHJpbmcgY29udGFpbmluZyB0aGUgcGFyYW1ldGVyIG5hbWUsIGFuIGVxdWFscyBzaWduIChcY2hhcmFjdGVyez19KSwKLWFuZCB0aGUgcGFyYW1ldGVyJ3MgdmFsdWUuICBNYWlsY2FwIGVudHJpZXMgY2FuIGNvbnRhaW4gCi1uYW1lZCBwYXJhbWV0ZXJzIGxpa2UgXGNvZGV7XCVce2Zvb1x9fSwgd2hpY2ggd2lsbCBiZSByZXBsYWNlZCBieSB0aGUKLXZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIgbmFtZWQgJ2ZvbycuICBGb3IgZXhhbXBsZSwgaWYgdGhlIGNvbW1hbmQgbGluZQotXHNhbXB7c2hvd3BhcnRpYWwgXCVce2lkXH1cIFwlXHtudW1iZXJcfVwgXCVce3RvdGFsXH19Ci13YXMgaW4gYSBtYWlsY2FwIGZpbGUsIGFuZCBcdmFye3BsaXN0fSB3YXMgc2V0IHRvIFxjb2Rle1snaWQ9MScsCi0nbnVtYmVyPTInLCAndG90YWw9MyddfSwgdGhlIHJlc3VsdGluZyBjb21tYW5kIGxpbmUgd291bGQgYmUgCi1cY29kZXsnc2hvd3BhcnRpYWwgMSAyIDMnfS4gIAotCi1JbiBhIG1haWxjYXAgZmlsZSwgdGhlIGBgdGVzdCcnIGZpZWxkIGNhbiBvcHRpb25hbGx5IGJlIHNwZWNpZmllZCB0bwotdGVzdCBzb21lIGV4dGVybmFsIGNvbmRpdGlvbiAoc3VjaCBhcyB0aGUgbWFjaGluZSBhcmNoaXRlY3R1cmUsIG9yIHRoZQotd2luZG93IHN5c3RlbSBpbiB1c2UpIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGUgbWFpbGNhcCBsaW5lCi1hcHBsaWVzLiAgXGZ1bmN0aW9ue2ZpbmRtYXRjaCgpfSB3aWxsIGF1dG9tYXRpY2FsbHkgY2hlY2sgc3VjaAotY29uZGl0aW9ucyBhbmQgc2tpcCB0aGUgZW50cnkgaWYgdGhlIGNoZWNrIGZhaWxzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRjYXBzfXt9Ci1SZXR1cm5zIGEgZGljdGlvbmFyeSBtYXBwaW5nIE1JTUUgdHlwZXMgdG8gYSBsaXN0IG9mIG1haWxjYXAgZmlsZQotZW50cmllcy4gVGhpcyBkaWN0aW9uYXJ5IG11c3QgYmUgcGFzc2VkIHRvIHRoZSBcZnVuY3Rpb257ZmluZG1hdGNoKCl9Ci1mdW5jdGlvbi4gIEFuIGVudHJ5IGlzIHN0b3JlZCBhcyBhIGxpc3Qgb2YgZGljdGlvbmFyaWVzLCBidXQgaXQKLXNob3VsZG4ndCBiZSBuZWNlc3NhcnkgdG8ga25vdyB0aGUgZGV0YWlscyBvZiB0aGlzIHJlcHJlc2VudGF0aW9uLgotCi1UaGUgaW5mb3JtYXRpb24gaXMgZGVyaXZlZCBmcm9tIGFsbCBvZiB0aGUgbWFpbGNhcCBmaWxlcyBmb3VuZCBvbiB0aGUKLXN5c3RlbS4gU2V0dGluZ3MgaW4gdGhlIHVzZXIncyBtYWlsY2FwIGZpbGUgXGZpbGV7XCRIT01FLy5tYWlsY2FwfQotd2lsbCBvdmVycmlkZSBzZXR0aW5ncyBpbiB0aGUgc3lzdGVtIG1haWxjYXAgZmlsZXMKLVxmaWxley9ldGMvbWFpbGNhcH0sIFxmaWxley91c3IvZXRjL21haWxjYXB9LCBhbmQKLVxmaWxley91c3IvbG9jYWwvZXRjL21haWxjYXB9LgotXGVuZHtmdW5jZGVzY30KLQotQW4gZXhhbXBsZSB1c2FnZToKLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgbWFpbGNhcAotPj4+IGQ9bWFpbGNhcC5nZXRjYXBzKCkKLT4+PiBtYWlsY2FwLmZpbmRtYXRjaChkLCAndmlkZW8vbXBlZycsIGZpbGVuYW1lPScvdG1wL3RtcDEyMjMnKQotKCd4bXBlZyAvdG1wL3RtcDEyMjMnLCB7J3ZpZXcnOiAneG1wZWcgJXMnfSkKLVxlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYm1haW4udGV4IGIvRG9jL2xpYi9saWJtYWluLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBjNzQyNi4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYm1haW4udGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtfX21haW5fX30gLS0tCi0gICAgICAgICBUb3AtbGV2ZWwgc2NyaXB0IGVudmlyb25tZW50fQotCi1cZGVjbGFyZW1vZHVsZVttYWluXXtidWlsdGlufXtfX21haW5fX30KLVxtb2R1bGVzeW5vcHNpc3tUaGUgZW52aXJvbm1lbnQgd2hlcmUgdGhlIHRvcC1sZXZlbCBzY3JpcHQgaXMgcnVuLn0KLQotVGhpcyBtb2R1bGUgcmVwcmVzZW50cyB0aGUgKG90aGVyd2lzZSBhbm9ueW1vdXMpIHNjb3BlIGluIHdoaWNoIHRoZQotaW50ZXJwcmV0ZXIncyBtYWluIHByb2dyYW0gZXhlY3V0ZXMgLS0tIGNvbW1hbmRzIHJlYWQgZWl0aGVyIGZyb20KLXN0YW5kYXJkIGlucHV0LCBmcm9tIGEgc2NyaXB0IGZpbGUsIG9yIGZyb20gYW4gaW50ZXJhY3RpdmUgcHJvbXB0LiAgSXQKLWlzIHRoaXMgZW52aXJvbm1lbnQgaW4gd2hpY2ggdGhlIGlkaW9tYXRpYyBgYGNvbmRpdGlvbmFsIHNjcmlwdCcnCi1zdGFuemEgY2F1c2VzIGEgc2NyaXB0IHRvIHJ1bjoKLQotXGJlZ2lue3ZlcmJhdGltfQotaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgICBtYWluKCkKLVxlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYm1hcnNoYWwudGV4IGIvRG9jL2xpYi9saWJtYXJzaGFsLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNmZjM5Mi4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYm1hcnNoYWwudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7bWFyc2hhbH0gLS0tCi0gICAgICAgICBJbnRlcm5hbCBQeXRob24gb2JqZWN0IHNlcmlhbGl6YXRpb259Ci0KLVxkZWNsYXJlbW9kdWxle2J1aWx0aW59e21hcnNoYWx9Ci1cbW9kdWxlc3lub3BzaXN7Q29udmVydCBQeXRob24gb2JqZWN0cyB0byBzdHJlYW1zIG9mIGJ5dGVzIGFuZCBiYWNrCi0gICAgICAgICAgICAgICAgKHdpdGggZGlmZmVyZW50IGNvbnN0cmFpbnRzKS59Ci0KLQotVGhpcyBtb2R1bGUgY29udGFpbnMgZnVuY3Rpb25zIHRoYXQgY2FuIHJlYWQgYW5kIHdyaXRlIFB5dGhvbgotdmFsdWVzIGluIGEgYmluYXJ5IGZvcm1hdC4gIFRoZSBmb3JtYXQgaXMgc3BlY2lmaWMgdG8gUHl0aG9uLCBidXQKLWluZGVwZW5kZW50IG9mIG1hY2hpbmUgYXJjaGl0ZWN0dXJlIGlzc3VlcyAoZS5nLiwgeW91IGNhbiB3cml0ZSBhCi1QeXRob24gdmFsdWUgdG8gYSBmaWxlIG9uIGEgUEMsIHRyYW5zcG9ydCB0aGUgZmlsZSB0byBhIFN1biwgYW5kIHJlYWQKLWl0IGJhY2sgdGhlcmUpLiAgRGV0YWlscyBvZiB0aGUgZm9ybWF0IGFyZSB1bmRvY3VtZW50ZWQgb24gcHVycG9zZTsKLWl0IG1heSBjaGFuZ2UgYmV0d2VlbiBQeXRob24gdmVyc2lvbnMgKGFsdGhvdWdoIGl0IHJhcmVseQotZG9lcykuXGZvb3Rub3Rle1RoZSBuYW1lIG9mIHRoaXMgbW9kdWxlIHN0ZW1zIGZyb20gYSBiaXQgb2YKLSAgdGVybWlub2xvZ3kgdXNlZCBieSB0aGUgZGVzaWduZXJzIG9mIE1vZHVsYS0zIChhbW9uZ3N0IG90aGVycyksIHdobwotICB1c2UgdGhlIHRlcm0gYGBtYXJzaGFsbGluZycnIGZvciBzaGlwcGluZyBvZiBkYXRhIGFyb3VuZCBpbiBhCi0gIHNlbGYtY29udGFpbmVkIGZvcm0uIFN0cmljdGx5IHNwZWFraW5nLCBgYHRvIG1hcnNoYWwnJyBtZWFucyB0bwotICBjb252ZXJ0IHNvbWUgZGF0YSBmcm9tIGludGVybmFsIHRvIGV4dGVybmFsIGZvcm0gKGluIGFuIFJQQyBidWZmZXIgZm9yCi0gIGluc3RhbmNlKSBhbmQgYGB1bm1hcnNoYWxsaW5nJycgZm9yIHRoZSByZXZlcnNlIHByb2Nlc3MufQotCi1UaGlzIGlzIG5vdCBhIGdlbmVyYWwgYGBwZXJzaXN0ZW5jZScnIG1vZHVsZS4gIEZvciBnZW5lcmFsIHBlcnNpc3RlbmNlCi1hbmQgdHJhbnNmZXIgb2YgUHl0aG9uIG9iamVjdHMgdGhyb3VnaCBSUEMgY2FsbHMsIHNlZSB0aGUgbW9kdWxlcwotXHJlZm1vZHVsZXtwaWNrbGV9IGFuZCBccmVmbW9kdWxle3NoZWx2ZX0uICBUaGUgXG1vZHVsZXttYXJzaGFsfSBtb2R1bGUgZXhpc3RzCi1tYWlubHkgdG8gc3VwcG9ydCByZWFkaW5nIGFuZCB3cml0aW5nIHRoZSBgYHBzZXVkby1jb21waWxlZCcnIGNvZGUgZm9yCi1QeXRob24gbW9kdWxlcyBvZiBcZmlsZXsucHljfSBmaWxlcy4gIFRoZXJlZm9yZSwgdGhlIFB5dGhvbgotbWFpbnRhaW5lcnMgcmVzZXJ2ZSB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoZSBtYXJzaGFsIGZvcm1hdCBpbiBiYWNrd2FyZAotaW5jb21wYXRpYmxlIHdheXMgc2hvdWxkIHRoZSBuZWVkIGFyaXNlLiAgSWYgeW91J3JlIHNlcmlhbGl6aW5nIGFuZAotZGUtc2VyaWFsaXppbmcgUHl0aG9uIG9iamVjdHMsIHVzZSB0aGUgXG1vZHVsZXtwaWNrbGV9IG1vZHVsZSBpbnN0ZWFkLiAgCi1ccmVmc3Rtb2RpbmRleHtwaWNrbGV9Ci1ccmVmc3Rtb2RpbmRleHtzaGVsdmV9Ci1cb2JpbmRleHtjb2RlfQotCi1cYmVnaW57bm90aWNlfVt3YXJuaW5nXQotVGhlIFxtb2R1bGV7bWFyc2hhbH0gbW9kdWxlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzZWN1cmUgYWdhaW5zdAotZXJyb25lb3VzIG9yIG1hbGljaW91c2x5IGNvbnN0cnVjdGVkIGRhdGEuICBOZXZlciB1bm1hcnNoYWwgZGF0YQotcmVjZWl2ZWQgZnJvbSBhbiB1bnRydXN0ZWQgb3IgdW5hdXRoZW50aWNhdGVkIHNvdXJjZS4KLVxlbmR7bm90aWNlfQotCi1Ob3QgYWxsIFB5dGhvbiBvYmplY3QgdHlwZXMgYXJlIHN1cHBvcnRlZDsgaW4gZ2VuZXJhbCwgb25seSBvYmplY3RzCi13aG9zZSB2YWx1ZSBpcyBpbmRlcGVuZGVudCBmcm9tIGEgcGFydGljdWxhciBpbnZvY2F0aW9uIG9mIFB5dGhvbiBjYW4KLWJlIHdyaXR0ZW4gYW5kIHJlYWQgYnkgdGhpcyBtb2R1bGUuICBUaGUgZm9sbG93aW5nIHR5cGVzIGFyZSBzdXBwb3J0ZWQ6Ci1cY29kZXtOb25lfSwgaW50ZWdlcnMsIGxvbmcgaW50ZWdlcnMsIGZsb2F0aW5nIHBvaW50IG51bWJlcnMsCi1zdHJpbmdzLCBVbmljb2RlIG9iamVjdHMsIHR1cGxlcywgbGlzdHMsIGRpY3Rpb25hcmllcywgYW5kIGNvZGUKLW9iamVjdHMsIHdoZXJlIGl0IHNob3VsZCBiZSB1bmRlcnN0b29kIHRoYXQgdHVwbGVzLCBsaXN0cyBhbmQKLWRpY3Rpb25hcmllcyBhcmUgb25seSBzdXBwb3J0ZWQgYXMgbG9uZyBhcyB0aGUgdmFsdWVzIGNvbnRhaW5lZAotdGhlcmVpbiBhcmUgdGhlbXNlbHZlcyBzdXBwb3J0ZWQ7IGFuZCByZWN1cnNpdmUgbGlzdHMgYW5kIGRpY3Rpb25hcmllcwotc2hvdWxkIG5vdCBiZSB3cml0dGVuICh0aGV5IHdpbGwgY2F1c2UgaW5maW5pdGUgbG9vcHMpLgotCi1cc3Ryb25ne0NhdmVhdDp9IE9uIG1hY2hpbmVzIHdoZXJlIEMncyBcY29kZXtsb25nIGludH0gdHlwZSBoYXMgbW9yZSB0aGFuCi0zMiBiaXRzIChzdWNoIGFzIHRoZSBERUMgQWxwaGEpLCBpdCBpcyBwb3NzaWJsZSB0byBjcmVhdGUgcGxhaW4gUHl0aG9uCi1pbnRlZ2VycyB0aGF0IGFyZSBsb25nZXIgdGhhbiAzMiBiaXRzLgotSWYgc3VjaCBhbiBpbnRlZ2VyIGlzIG1hcnNoYWxlZCBhbmQgcmVhZCBiYWNrIGluIG9uIGEgbWFjaGluZSB3aGVyZQotQydzIFxjb2Rle2xvbmcgaW50fSB0eXBlIGhhcyBvbmx5IDMyIGJpdHMsIGEgUHl0aG9uIGxvbmcgaW50ZWdlciBvYmplY3QKLWlzIHJldHVybmVkIGluc3RlYWQuICBXaGlsZSBvZiBhIGRpZmZlcmVudCB0eXBlLCB0aGUgbnVtZXJpYyB2YWx1ZSBpcwotdGhlIHNhbWUuICAoVGhpcyBiZWhhdmlvciBpcyBuZXcgaW4gUHl0aG9uIDIuMi4gIEluIGVhcmxpZXIgdmVyc2lvbnMsCi1hbGwgYnV0IHRoZSBsZWFzdC1zaWduaWZpY2FudCAzMiBiaXRzIG9mIHRoZSB2YWx1ZSB3ZXJlIGxvc3QsIGFuZCBhCi13YXJuaW5nIG1lc3NhZ2Ugd2FzIHByaW50ZWQuKQotCi1UaGVyZSBhcmUgZnVuY3Rpb25zIHRoYXQgcmVhZC93cml0ZSBmaWxlcyBhcyB3ZWxsIGFzIGZ1bmN0aW9ucwotb3BlcmF0aW5nIG9uIHN0cmluZ3MuCi0KLVRoZSBtb2R1bGUgZGVmaW5lcyB0aGVzZSBmdW5jdGlvbnM6Ci0KLVxiZWdpbntmdW5jZGVzY317ZHVtcH17dmFsdWUsIGZpbGVcb3B0aW9uYWx7LCB2ZXJzaW9ufX0KLSAgV3JpdGUgdGhlIHZhbHVlIG9uIHRoZSBvcGVuIGZpbGUuICBUaGUgdmFsdWUgbXVzdCBiZSBhIHN1cHBvcnRlZAotICB0eXBlLiAgVGhlIGZpbGUgbXVzdCBiZSBhbiBvcGVuIGZpbGUgb2JqZWN0IHN1Y2ggYXMKLSAgXGNvZGV7c3lzLnN0ZG91dH0gb3IgcmV0dXJuZWQgYnkgXGZ1bmN0aW9ue29wZW4oKX0gb3IKLSAgXGZ1bmN0aW9ue3Bvc2l4LnBvcGVuKCl9LiAgSXQgbXVzdCBiZSBvcGVuZWQgaW4gYmluYXJ5IG1vZGUKLSAgKFxjb2Rleyd3Yid9IG9yIFxjb2Rleyd3K2InfSkuCi0KLSAgSWYgdGhlIHZhbHVlIGhhcyAob3IgY29udGFpbnMgYW4gb2JqZWN0IHRoYXQgaGFzKSBhbiB1bnN1cHBvcnRlZCB0eXBlLAotICBhIFxleGNlcHRpb257VmFsdWVFcnJvcn0gZXhjZXB0aW9uIGlzIHJhaXNlZCAtLS0gYnV0IGdhcmJhZ2UgZGF0YQotICB3aWxsIGFsc28gYmUgd3JpdHRlbiB0byB0aGUgZmlsZS4gIFRoZSBvYmplY3Qgd2lsbCBub3QgYmUgcHJvcGVybHkKLSAgcmVhZCBiYWNrIGJ5IFxmdW5jdGlvbntsb2FkKCl9LgotCi0gIFx2ZXJzaW9uYWRkZWRbVGhlIFx2YXJ7dmVyc2lvbn0gYXJndW1lbnQgaW5kaWNhdGVzIHRoZSBkYXRhCi0gIGZvcm1hdCB0aGF0IFxjb2Rle2R1bXB9IHNob3VsZCB1c2UgKHNlZSBiZWxvdyldezIuNH0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bG9hZH17ZmlsZX0KLSAgUmVhZCBvbmUgdmFsdWUgZnJvbSB0aGUgb3BlbiBmaWxlIGFuZCByZXR1cm4gaXQuICBJZiBubyB2YWxpZCB2YWx1ZQotICBpcyByZWFkLCByYWlzZSBcZXhjZXB0aW9ue0VPRkVycm9yfSwgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSBvcgotICBcZXhjZXB0aW9ue1R5cGVFcnJvcn0uICBUaGUgZmlsZSBtdXN0IGJlIGFuIG9wZW4gZmlsZSBvYmplY3Qgb3BlbmVkCi0gIGluIGJpbmFyeSBtb2RlIChcY29kZXsncmInfSBvciBcY29kZXsncitiJ30pLgotCi0gIFx3YXJuaW5ne0lmIGFuIG9iamVjdCBjb250YWluaW5nIGFuIHVuc3VwcG9ydGVkIHR5cGUgd2FzCi0gIG1hcnNoYWxsZWQgd2l0aCBcZnVuY3Rpb257ZHVtcCgpfSwgXGZ1bmN0aW9ue2xvYWQoKX0gd2lsbCBzdWJzdGl0dXRlCi0gIFxjb2Rle05vbmV9IGZvciB0aGUgdW5tYXJzaGFsbGFibGUgdHlwZS59Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2R1bXBzfXt2YWx1ZVxvcHRpb25hbHssIHZlcnNpb259fQotICBSZXR1cm4gdGhlIHN0cmluZyB0aGF0IHdvdWxkIGJlIHdyaXR0ZW4gdG8gYSBmaWxlIGJ5Ci0gIFxjb2Rle2R1bXAoXHZhcnt2YWx1ZX0sIFx2YXJ7ZmlsZX0pfS4gIFRoZSB2YWx1ZSBtdXN0IGJlIGEgc3VwcG9ydGVkCi0gIHR5cGUuICBSYWlzZSBhIFxleGNlcHRpb257VmFsdWVFcnJvcn0gZXhjZXB0aW9uIGlmIHZhbHVlIGhhcyAob3IKLSAgY29udGFpbnMgYW4gb2JqZWN0IHRoYXQgaGFzKSBhbiB1bnN1cHBvcnRlZCB0eXBlLgotCi0gIFx2ZXJzaW9uYWRkZWRbVGhlIFx2YXJ7dmVyc2lvbn0gYXJndW1lbnQgaW5kaWNhdGVzIHRoZSBkYXRhCi0gIGZvcm1hdCB0aGF0IFxjb2Rle2R1bXBzfSBzaG91bGQgdXNlIChzZWUgYmVsb3cpXXsyLjR9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2xvYWRzfXtzdHJpbmd9Ci0gIENvbnZlcnQgdGhlIHN0cmluZyB0byBhIHZhbHVlLiAgSWYgbm8gdmFsaWQgdmFsdWUgaXMgZm91bmQsIHJhaXNlCi0gIFxleGNlcHRpb257RU9GRXJyb3J9LCBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IG9yCi0gIFxleGNlcHRpb257VHlwZUVycm9yfS4gIEV4dHJhIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgaWdub3JlZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLUluIGFkZGl0aW9uLCB0aGUgZm9sbG93aW5nIGNvbnN0YW50cyBhcmUgZGVmaW5lZDoKLQotXGJlZ2lue2RhdGFkZXNjfXt2ZXJzaW9ufQotICBJbmRpY2F0ZXMgdGhlIGZvcm1hdCB0aGF0IHRoZSBtb2R1bGUgdXNlcy4gVmVyc2lvbiAwIGlzIHRoZQotICBoaXN0b3JpY2FsIGZvcm1hdCwgdmVyc2lvbiAxIChhZGRlZCBpbiBQeXRob24gMi40KSBzaGFyZXMgaW50ZXJuZWQKLSAgc3RyaW5ncyBhbmQgdmVyc2lvbiAyIChhZGRlZCBpbiBQeXRob24gMi41KSB1c2VzIGEgYmluYXJ5IGZvcm1hdCBmb3IKLSAgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gVGhlIGN1cnJlbnQgdmVyc2lvbiBpcyAyLgotCi0gIFx2ZXJzaW9uYWRkZWR7Mi40fQotXGVuZHtkYXRhZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlibWF0aC50ZXggYi9Eb2MvbGliL2xpYm1hdGgudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTJmOGY5Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlibWF0aC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXttYXRofSAtLS0KLSAgICAgICAgIE1hdGhlbWF0aWNhbCBmdW5jdGlvbnN9Ci0KLVxkZWNsYXJlbW9kdWxle2J1aWx0aW59e21hdGh9Ci1cbW9kdWxlc3lub3BzaXN7TWF0aGVtYXRpY2FsIGZ1bmN0aW9ucyAoXGZ1bmN0aW9ue3NpbigpfSBldGMuKS59Ci0KLVRoaXMgbW9kdWxlIGlzIGFsd2F5cyBhdmFpbGFibGUuICBJdCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlCi1tYXRoZW1hdGljYWwgZnVuY3Rpb25zIGRlZmluZWQgYnkgdGhlIEMgc3RhbmRhcmQuCi0KLVRoZXNlIGZ1bmN0aW9ucyBjYW5ub3QgYmUgdXNlZCB3aXRoIGNvbXBsZXggbnVtYmVyczsgdXNlIHRoZSBmdW5jdGlvbnMKLW9mIHRoZSBzYW1lIG5hbWUgZnJvbSB0aGUgXHJlZm1vZHVsZXtjbWF0aH0gbW9kdWxlIGlmIHlvdSByZXF1aXJlCi1zdXBwb3J0IGZvciBjb21wbGV4IG51bWJlcnMuICBUaGUgZGlzdGluY3Rpb24gYmV0d2VlbiBmdW5jdGlvbnMgd2hpY2gKLXN1cHBvcnQgY29tcGxleCBudW1iZXJzIGFuZCB0aG9zZSB3aGljaCBkb24ndCBpcyBtYWRlIHNpbmNlIG1vc3QgdXNlcnMKLWRvIG5vdCB3YW50IHRvIGxlYXJuIHF1aXRlIGFzIG11Y2ggbWF0aGVtYXRpY3MgYXMgcmVxdWlyZWQgdG8KLXVuZGVyc3RhbmQgY29tcGxleCBudW1iZXJzLiAgUmVjZWl2aW5nIGFuIGV4Y2VwdGlvbiBpbnN0ZWFkIG9mIGEKLWNvbXBsZXggcmVzdWx0IGFsbG93cyBlYXJsaWVyIGRldGVjdGlvbiBvZiB0aGUgdW5leHBlY3RlZCBjb21wbGV4Ci1udW1iZXIgdXNlZCBhcyBhIHBhcmFtZXRlciwgc28gdGhhdCB0aGUgcHJvZ3JhbW1lciBjYW4gZGV0ZXJtaW5lIGhvdwotYW5kIHdoeSBpdCB3YXMgZ2VuZXJhdGVkIGluIHRoZSBmaXJzdCBwbGFjZS4KLQotVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHByb3ZpZGVkIGJ5IHRoaXMgbW9kdWxlLiAgRXhjZXB0Ci13aGVuIGV4cGxpY2l0bHkgbm90ZWQgb3RoZXJ3aXNlLCBhbGwgcmV0dXJuIHZhbHVlcyBhcmUgZmxvYXRzLgotCi1OdW1iZXItdGhlb3JldGljIGFuZCByZXByZXNlbnRhdGlvbiBmdW5jdGlvbnM6Ci0KLVxiZWdpbntmdW5jZGVzY317Y2VpbH17eH0KLVJldHVybiB0aGUgY2VpbGluZyBvZiBcdmFye3h9IGFzIGEgZmxvYXQsIHRoZSBzbWFsbGVzdCBpbnRlZ2VyIHZhbHVlCi1ncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gXHZhcnt4fS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZmFic317eH0KLVJldHVybiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgXHZhcnt4fS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Zmxvb3J9e3h9Ci1SZXR1cm4gdGhlIGZsb29yIG9mIFx2YXJ7eH0gYXMgYSBmbG9hdCwgdGhlIGxhcmdlc3QgaW50ZWdlciB2YWx1ZQotbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFx2YXJ7eH0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2Ztb2R9e3gsIHl9Ci1SZXR1cm4gXGNvZGV7Zm1vZChcdmFye3h9LCBcdmFye3l9KX0sIGFzIGRlZmluZWQgYnkgdGhlIHBsYXRmb3JtIEMgbGlicmFyeS4KLU5vdGUgdGhhdCB0aGUgUHl0aG9uIGV4cHJlc3Npb24gXGNvZGV7XHZhcnt4fSBcJVwgXHZhcnt5fX0gbWF5IG5vdCByZXR1cm4KLXRoZSBzYW1lIHJlc3VsdC4gIFRoZSBpbnRlbnQgb2YgdGhlIEMgc3RhbmRhcmQgaXMgdGhhdAotXGNvZGV7Zm1vZChcdmFye3h9LCBcdmFye3l9KX0gYmUgZXhhY3RseSAobWF0aGVtYXRpY2FsbHk7IHRvIGluZmluaXRlCi1wcmVjaXNpb24pIGVxdWFsIHRvIFxjb2Rle1x2YXJ7eH0gLSBcdmFye259Klx2YXJ7eX19IGZvciBzb21lIGludGVnZXIKLVx2YXJ7bn0gc3VjaCB0aGF0IHRoZSByZXN1bHQgaGFzIHRoZSBzYW1lIHNpZ24gYXMgXHZhcnt4fSBhbmQKLW1hZ25pdHVkZSBsZXNzIHRoYW4gXGNvZGV7YWJzKFx2YXJ7eX0pfS4gIFB5dGhvbidzCi1cY29kZXtcdmFye3h9IFwlXCBcdmFye3l9fSByZXR1cm5zIGEgcmVzdWx0IHdpdGggdGhlIHNpZ24gb2YKLVx2YXJ7eX0gaW5zdGVhZCwgYW5kIG1heSBub3QgYmUgZXhhY3RseSBjb21wdXRhYmxlIGZvciBmbG9hdCBhcmd1bWVudHMuCi1Gb3IgZXhhbXBsZSwgXGNvZGV7Zm1vZCgtMWUtMTAwLCAxZTEwMCl9IGlzIFxjb2Rley0xZS0xMDB9LCBidXQgdGhlCi1yZXN1bHQgb2YgUHl0aG9uJ3MgXGNvZGV7LTFlLTEwMCBcJVwgMWUxMDB9IGlzIFxjb2RlezFlMTAwLTFlLTEwMH0sIHdoaWNoCi1jYW5ub3QgYmUgcmVwcmVzZW50ZWQgZXhhY3RseSBhcyBhIGZsb2F0LCBhbmQgcm91bmRzIHRvIHRoZSBzdXJwcmlzaW5nCi1cY29kZXsxZTEwMH0uICBGb3IgdGhpcyByZWFzb24sIGZ1bmN0aW9uIFxmdW5jdGlvbntmbW9kKCl9IGlzIGdlbmVyYWxseQotcHJlZmVycmVkIHdoZW4gd29ya2luZyB3aXRoIGZsb2F0cywgd2hpbGUgUHl0aG9uJ3MKLVxjb2Rle1x2YXJ7eH0gXCVcIFx2YXJ7eX19IGlzIHByZWZlcnJlZCB3aGVuIHdvcmtpbmcgd2l0aCBpbnRlZ2Vycy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZnJleHB9e3h9Ci1SZXR1cm4gdGhlIG1hbnRpc3NhIGFuZCBleHBvbmVudCBvZiBcdmFye3h9IGFzIHRoZSBwYWlyCi1cY29kZXsoXHZhcnttfSwgXHZhcntlfSl9LiAgXHZhcnttfSBpcyBhIGZsb2F0IGFuZCBcdmFye2V9IGlzIGFuCi1pbnRlZ2VyIHN1Y2ggdGhhdCBcY29kZXtcdmFye3h9ID09IFx2YXJ7bX0gKiAyKipcdmFye2V9fSBleGFjdGx5LgotSWYgXHZhcnt4fSBpcyB6ZXJvLCByZXR1cm5zIFxjb2RleygwLjAsIDApfSwgb3RoZXJ3aXNlCi1cY29kZXswLjUgPD0gYWJzKFx2YXJ7bX0pIDwgMX0uICBUaGlzIGlzIHVzZWQgdG8gInBpY2sgYXBhcnQiIHRoZQotaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgYSBmbG9hdCBpbiBhIHBvcnRhYmxlIHdheS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bGRleHB9e3gsIGl9Ci1SZXR1cm4gXGNvZGV7XHZhcnt4fSAqICgyKipcdmFye2l9KX0uICBUaGlzIGlzIGVzc2VudGlhbGx5IHRoZSBpbnZlcnNlIG9mCi1mdW5jdGlvbiBcZnVuY3Rpb257ZnJleHAoKX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e21vZGZ9e3h9Ci1SZXR1cm4gdGhlIGZyYWN0aW9uYWwgYW5kIGludGVnZXIgcGFydHMgb2YgXHZhcnt4fS4gIEJvdGggcmVzdWx0cwotY2FycnkgdGhlIHNpZ24gb2YgXHZhcnt4fSwgYW5kIGJvdGggYXJlIGZsb2F0cy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLU5vdGUgdGhhdCBcZnVuY3Rpb257ZnJleHAoKX0gYW5kIFxmdW5jdGlvbnttb2RmKCl9IGhhdmUgYSBkaWZmZXJlbnQKLWNhbGwvcmV0dXJuIHBhdHRlcm4gdGhhbiB0aGVpciBDIGVxdWl2YWxlbnRzOiB0aGV5IHRha2UgYSBzaW5nbGUKLWFyZ3VtZW50IGFuZCByZXR1cm4gYSBwYWlyIG9mIHZhbHVlcywgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIHRoZWlyCi1zZWNvbmQgcmV0dXJuIHZhbHVlIHRocm91Z2ggYW4gYG91dHB1dCBwYXJhbWV0ZXInICh0aGVyZSBpcyBubyBzdWNoCi10aGluZyBpbiBQeXRob24pLgotCi1Gb3IgdGhlIFxmdW5jdGlvbntjZWlsKCl9LCBcZnVuY3Rpb257Zmxvb3IoKX0sIGFuZCBcZnVuY3Rpb257bW9kZigpfQotZnVuY3Rpb25zLCBub3RlIHRoYXQgXGVtcGh7YWxsfSBmbG9hdGluZy1wb2ludCBudW1iZXJzIG9mIHN1ZmZpY2llbnRseQotbGFyZ2UgbWFnbml0dWRlIGFyZSBleGFjdCBpbnRlZ2Vycy4gIFB5dGhvbiBmbG9hdHMgdHlwaWNhbGx5IGNhcnJ5IG5vIG1vcmUKLXRoYW4gNTMgYml0cyBvZiBwcmVjaXNpb24gKHRoZSBzYW1lIGFzIHRoZSBwbGF0Zm9ybSBDIGRvdWJsZSB0eXBlKSwgaW4KLXdoaWNoIGNhc2UgYW55IGZsb2F0IFx2YXJ7eH0gd2l0aCBcY29kZXthYnMoXHZhcnt4fSkgPj0gMioqNTJ9Ci1uZWNlc3NhcmlseSBoYXMgbm8gZnJhY3Rpb25hbCBiaXRzLgotCi0KLVBvd2VyIGFuZCBsb2dhcml0aG1pYyBmdW5jdGlvbnM6Ci0KLVxiZWdpbntmdW5jZGVzY317ZXhwfXt4fQotUmV0dXJuIFxjb2Rle2UqKlx2YXJ7eH19LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtsb2d9e3hcb3B0aW9uYWx7LCBiYXNlfX0KLVJldHVybiB0aGUgbG9nYXJpdGhtIG9mIFx2YXJ7eH0gdG8gdGhlIGdpdmVuIFx2YXJ7YmFzZX0uCi1JZiB0aGUgXHZhcntiYXNlfSBpcyBub3Qgc3BlY2lmaWVkLCByZXR1cm4gdGhlIG5hdHVyYWwgbG9nYXJpdGhtIG9mIFx2YXJ7eH0KLSh0aGF0IGlzLCB0aGUgbG9nYXJpdGhtIHRvIGJhc2UgXGVtcGh7ZX0pLgotXHZlcnNpb25jaGFuZ2VkW1x2YXJ7YmFzZX0gYXJndW1lbnQgYWRkZWRdezIuM30KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bG9nMTB9e3h9Ci1SZXR1cm4gdGhlIGJhc2UtMTAgbG9nYXJpdGhtIG9mIFx2YXJ7eH0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3Bvd317eCwgeX0KLVJldHVybiBcY29kZXtcdmFye3h9KipcdmFye3l9fS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c3FydH17eH0KLVJldHVybiB0aGUgc3F1YXJlIHJvb3Qgb2YgXHZhcnt4fS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVRyaWdvbm9tZXRyaWMgZnVuY3Rpb25zOgotCi1cYmVnaW57ZnVuY2Rlc2N9e2Fjb3N9e3h9Ci1SZXR1cm4gdGhlIGFyYyBjb3NpbmUgb2YgXHZhcnt4fSwgaW4gcmFkaWFucy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317YXNpbn17eH0KLVJldHVybiB0aGUgYXJjIHNpbmUgb2YgXHZhcnt4fSwgaW4gcmFkaWFucy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317YXRhbn17eH0KLVJldHVybiB0aGUgYXJjIHRhbmdlbnQgb2YgXHZhcnt4fSwgaW4gcmFkaWFucy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317YXRhbjJ9e3ksIHh9Ci1SZXR1cm4gXGNvZGV7YXRhbihcdmFye3l9IC8gXHZhcnt4fSl9LCBpbiByYWRpYW5zLgotVGhlIHJlc3VsdCBpcyBiZXR3ZWVuIFxjb2Rley1waX0gYW5kIFxjb2Rle3BpfS4KLVRoZSB2ZWN0b3IgaW4gdGhlIHBsYW5lIGZyb20gdGhlIG9yaWdpbiB0byBwb2ludCBcY29kZXsoXHZhcnt4fSwgXHZhcnt5fSl9Ci1tYWtlcyB0aGlzIGFuZ2xlIHdpdGggdGhlIHBvc2l0aXZlIFggYXhpcy4KLVRoZSBwb2ludCBvZiBcZnVuY3Rpb257YXRhbjIoKX0gaXMgdGhhdCB0aGUgc2lnbnMgb2YgYm90aCBpbnB1dHMgYXJlCi1rbm93biB0byBpdCwgc28gaXQgY2FuIGNvbXB1dGUgdGhlIGNvcnJlY3QgcXVhZHJhbnQgZm9yIHRoZSBhbmdsZS4KLUZvciBleGFtcGxlLCBcY29kZXthdGFuKDF9KSBhbmQgXGNvZGV7YXRhbjIoMSwgMSl9IGFyZSBib3RoIFxjb2Rle3BpLzR9LAotYnV0IFxjb2Rle2F0YW4yKC0xLCAtMSl9IGlzIFxjb2Rley0zKnBpLzR9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtjb3N9e3h9Ci1SZXR1cm4gdGhlIGNvc2luZSBvZiBcdmFye3h9IHJhZGlhbnMuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2h5cG90fXt4LCB5fQotUmV0dXJuIHRoZSBFdWNsaWRlYW4gbm9ybSwgXGNvZGV7c3FydChcdmFye3h9Klx2YXJ7eH0gKyBcdmFye3l9Klx2YXJ7eX0pfS4KLVRoaXMgaXMgdGhlIGxlbmd0aCBvZiB0aGUgdmVjdG9yIGZyb20gdGhlIG9yaWdpbiB0byBwb2ludAotXGNvZGV7KFx2YXJ7eH0sIFx2YXJ7eX0pfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c2lufXt4fQotUmV0dXJuIHRoZSBzaW5lIG9mIFx2YXJ7eH0gcmFkaWFucy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dGFufXt4fQotUmV0dXJuIHRoZSB0YW5nZW50IG9mIFx2YXJ7eH0gcmFkaWFucy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLUFuZ3VsYXIgY29udmVyc2lvbjoKLQotXGJlZ2lue2Z1bmNkZXNjfXtkZWdyZWVzfXt4fQotQ29udmVydHMgYW5nbGUgXHZhcnt4fSBmcm9tIHJhZGlhbnMgdG8gZGVncmVlcy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cmFkaWFuc317eH0KLUNvbnZlcnRzIGFuZ2xlIFx2YXJ7eH0gZnJvbSBkZWdyZWVzIHRvIHJhZGlhbnMuCi1cZW5ke2Z1bmNkZXNjfQotCi1IeXBlcmJvbGljIGZ1bmN0aW9uczoKLQotXGJlZ2lue2Z1bmNkZXNjfXtjb3NofXt4fQotUmV0dXJuIHRoZSBoeXBlcmJvbGljIGNvc2luZSBvZiBcdmFye3h9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzaW5ofXt4fQotUmV0dXJuIHRoZSBoeXBlcmJvbGljIHNpbmUgb2YgXHZhcnt4fS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dGFuaH17eH0KLVJldHVybiB0aGUgaHlwZXJib2xpYyB0YW5nZW50IG9mIFx2YXJ7eH0uCi1cZW5ke2Z1bmNkZXNjfQotCi1UaGUgbW9kdWxlIGFsc28gZGVmaW5lcyB0d28gbWF0aGVtYXRpY2FsIGNvbnN0YW50czoKLQotXGJlZ2lue2RhdGFkZXNjfXtwaX0KLVRoZSBtYXRoZW1hdGljYWwgY29uc3RhbnQgXGVtcGh7cGl9LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtlfQotVGhlIG1hdGhlbWF0aWNhbCBjb25zdGFudCBcZW1waHtlfS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntub3RpY2V9Ci0gIFRoZSBcbW9kdWxle21hdGh9IG1vZHVsZSBjb25zaXN0cyBtb3N0bHkgb2YgdGhpbiB3cmFwcGVycyBhcm91bmQKLSAgdGhlIHBsYXRmb3JtIEMgbWF0aCBsaWJyYXJ5IGZ1bmN0aW9ucy4gIEJlaGF2aW9yIGluIGV4Y2VwdGlvbmFsIGNhc2VzIGlzCi0gIGxvb3NlbHkgc3BlY2lmaWVkIGJ5IHRoZSBDIHN0YW5kYXJkcywgYW5kIFB5dGhvbiBpbmhlcml0cyBtdWNoIG9mIGl0cwotICBtYXRoLWZ1bmN0aW9uIGVycm9yLXJlcG9ydGluZyBiZWhhdmlvciBmcm9tIHRoZSBwbGF0Zm9ybSBDCi0gIGltcGxlbWVudGF0aW9uLiAgQXMgYSByZXN1bHQsCi0gIHRoZSBzcGVjaWZpYyBleGNlcHRpb25zIHJhaXNlZCBpbiBlcnJvciBjYXNlcyAoYW5kIGV2ZW4gd2hldGhlciBzb21lCi0gIGFyZ3VtZW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSBleGNlcHRpb25hbCBhdCBhbGwpIGFyZSBub3QgZGVmaW5lZCBpbiBhbnkKLSAgdXNlZnVsIGNyb3NzLXBsYXRmb3JtIG9yIGNyb3NzLXJlbGVhc2Ugd2F5LiAgRm9yIGV4YW1wbGUsIHdoZXRoZXIKLSAgXGNvZGV7bWF0aC5sb2coMCl9IHJldHVybnMgXGNvZGV7LUluZn0gb3IgcmFpc2VzIFxleGNlcHRpb257VmFsdWVFcnJvcn0gb3IKLSAgXGV4Y2VwdGlvbntPdmVyZmxvd0Vycm9yfSBpc24ndCBkZWZpbmVkLCBhbmQgaW4KLSAgY2FzZXMgd2hlcmUgXGNvZGV7bWF0aC5sb2coMCl9IHJhaXNlcyBcZXhjZXB0aW9ue092ZXJmbG93RXJyb3J9LAotICBcY29kZXttYXRoLmxvZygwTCl9IG1heSByYWlzZSBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IGluc3RlYWQuCi1cZW5ke25vdGljZX0KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWVtb2R1bGV7Y21hdGh9e0NvbXBsZXggbnVtYmVyIHZlcnNpb25zIG9mIG1hbnkgb2YgdGhlc2UgZnVuY3Rpb25zLn0KLVxlbmR7c2VlYWxzb30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlibWhsaWIudGV4IGIvRG9jL2xpYi9saWJtaGxpYi50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNzA2NjMuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJtaGxpYi50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXttaGxpYn0gLS0tCi0gICAgICAgICBBY2Nlc3MgdG8gTUggbWFpbGJveGVzfQotCi0lIExhVGVYJ2l6ZWQgZnJvbSB0aGUgY29tbWVudHMgaW4gdGhlIG1vZHVsZSBieSBTa2lwIE1vbnRhbmFybwotJSA8c2tpcEBtb2phbS5jb20+LgotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17bWhsaWJ9Ci1cbW9kdWxlc3lub3BzaXN7TWFuaXB1bGF0ZSBNSCBtYWlsYm94ZXMgZnJvbSBQeXRob24ufQotCi0KLVRoZSBcbW9kdWxle21obGlifSBtb2R1bGUgcHJvdmlkZXMgYSBQeXRob24gaW50ZXJmYWNlIHRvIE1IIGZvbGRlcnMgYW5kCi10aGVpciBjb250ZW50cy4KLQotVGhlIG1vZHVsZSBjb250YWlucyB0aHJlZSBiYXNpYyBjbGFzc2VzLCBcY2xhc3N7TUh9LCB3aGljaCByZXByZXNlbnRzIGEKLXBhcnRpY3VsYXIgY29sbGVjdGlvbiBvZiBmb2xkZXJzLCBcY2xhc3N7Rm9sZGVyfSwgd2hpY2ggcmVwcmVzZW50cyBhIHNpbmdsZQotZm9sZGVyLCBhbmQgXGNsYXNze01lc3NhZ2V9LCB3aGljaCByZXByZXNlbnRzIGEgc2luZ2xlIG1lc3NhZ2UuCi0KLQotXGJlZ2lue2NsYXNzZGVzY317TUh9e1xvcHRpb25hbHtwYXRoXG9wdGlvbmFseywgcHJvZmlsZX19fQotXGNsYXNze01IfSByZXByZXNlbnRzIGEgY29sbGVjdGlvbiBvZiBNSCBmb2xkZXJzLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0ZvbGRlcn17bWgsIG5hbWV9Ci1UaGUgXGNsYXNze0ZvbGRlcn0gY2xhc3MgcmVwcmVzZW50cyBhIHNpbmdsZSBmb2xkZXIgYW5kIGl0cyBtZXNzYWdlcy4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtNZXNzYWdlfXtmb2xkZXIsIG51bWJlclxvcHRpb25hbHssIG5hbWV9fQotXGNsYXNze01lc3NhZ2V9IG9iamVjdHMgcmVwcmVzZW50IGluZGl2aWR1YWwgbWVzc2FnZXMgaW4gYSBmb2xkZXIuICBUaGUKLU1lc3NhZ2UgY2xhc3MgaXMgZGVyaXZlZCBmcm9tIFxjbGFzc3ttaW1ldG9vbHMuTWVzc2FnZX0uCi1cZW5ke2NsYXNzZGVzY30KLQotCi1cc3Vic2VjdGlvbntNSCBPYmplY3RzIFxsYWJlbHttaC1vYmplY3RzfX0KLQotXGNsYXNze01IfSBpbnN0YW5jZXMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0KLQotXGJlZ2lue21ldGhvZGRlc2N9W01IXXtlcnJvcn17Zm9ybWF0XG9wdGlvbmFseywgLi4ufX0KLVByaW50IGFuIGVycm9yIG1lc3NhZ2UgLS0gY2FuIGJlIG92ZXJyaWRkZW4uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtNSF17Z2V0cHJvZmlsZX17a2V5fQotUmV0dXJuIGEgcHJvZmlsZSBlbnRyeSAoXGNvZGV7Tm9uZX0gaWYgbm90IHNldCkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtNSF17Z2V0cGF0aH17fQotUmV0dXJuIHRoZSBtYWlsYm94IHBhdGhuYW1lLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTUhde2dldGNvbnRleHR9e30KLVJldHVybiB0aGUgY3VycmVudCBmb2xkZXIgbmFtZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W01IXXtzZXRjb250ZXh0fXtuYW1lfQotU2V0IHRoZSBjdXJyZW50IGZvbGRlciBuYW1lLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTUhde2xpc3Rmb2xkZXJzfXt9Ci1SZXR1cm4gYSBsaXN0IG9mIHRvcC1sZXZlbCBmb2xkZXJzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTUhde2xpc3RhbGxmb2xkZXJzfXt9Ci1SZXR1cm4gYSBsaXN0IG9mIGFsbCBmb2xkZXJzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTUhde2xpc3RzdWJmb2xkZXJzfXtuYW1lfQotUmV0dXJuIGEgbGlzdCBvZiBkaXJlY3Qgc3ViZm9sZGVycyBvZiB0aGUgZ2l2ZW4gZm9sZGVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTUhde2xpc3RhbGxzdWJmb2xkZXJzfXtuYW1lfQotUmV0dXJuIGEgbGlzdCBvZiBhbGwgc3ViZm9sZGVycyBvZiB0aGUgZ2l2ZW4gZm9sZGVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTUhde21ha2Vmb2xkZXJ9e25hbWV9Ci1DcmVhdGUgYSBuZXcgZm9sZGVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTUhde2RlbGV0ZWZvbGRlcn17bmFtZX0KLURlbGV0ZSBhIGZvbGRlciAtLSBtdXN0IGhhdmUgbm8gc3ViZm9sZGVycy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W01IXXtvcGVuZm9sZGVyfXtuYW1lfQotUmV0dXJuIGEgbmV3IG9wZW4gZm9sZGVyIG9iamVjdC4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi0KLVxzdWJzZWN0aW9ue0ZvbGRlciBPYmplY3RzIFxsYWJlbHttaC1mb2xkZXItb2JqZWN0c319Ci0KLVxjbGFzc3tGb2xkZXJ9IGluc3RhbmNlcyByZXByZXNlbnQgb3BlbiBmb2xkZXJzIGFuZCBoYXZlIHRoZSBmb2xsb3dpbmcKLW1ldGhvZHM6Ci0KLQotXGJlZ2lue21ldGhvZGRlc2N9W0ZvbGRlcl17ZXJyb3J9e2Zvcm1hdFxvcHRpb25hbHssIC4uLn19Ci1QcmludCBhbiBlcnJvciBtZXNzYWdlIC0tIGNhbiBiZSBvdmVycmlkZGVuLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRm9sZGVyXXtnZXRmdWxsbmFtZX17fQotUmV0dXJuIHRoZSBmb2xkZXIncyBmdWxsIHBhdGhuYW1lLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRm9sZGVyXXtnZXRzZXF1ZW5jZXNmaWxlbmFtZX17fQotUmV0dXJuIHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBmb2xkZXIncyBzZXF1ZW5jZXMgZmlsZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0ZvbGRlcl17Z2V0bWVzc2FnZWZpbGVuYW1lfXtufQotUmV0dXJuIHRoZSBmdWxsIHBhdGhuYW1lIG9mIG1lc3NhZ2UgXHZhcntufSBvZiB0aGUgZm9sZGVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRm9sZGVyXXtsaXN0bWVzc2FnZXN9e30KLVJldHVybiBhIGxpc3Qgb2YgbWVzc2FnZXMgaW4gdGhlIGZvbGRlciAoYXMgbnVtYmVycykuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtGb2xkZXJde2dldGN1cnJlbnR9e30KLVJldHVybiB0aGUgY3VycmVudCBtZXNzYWdlIG51bWJlci4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0ZvbGRlcl17c2V0Y3VycmVudH17bn0KLVNldCB0aGUgY3VycmVudCBtZXNzYWdlIG51bWJlciB0byBcdmFye259LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRm9sZGVyXXtwYXJzZXNlcXVlbmNlfXtzZXF9Ci1QYXJzZSBtc2dzIHN5bnRheCBpbnRvIGxpc3Qgb2YgbWVzc2FnZXMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtGb2xkZXJde2dldGxhc3R9e30KLUdldCBsYXN0IG1lc3NhZ2UsIG9yIFxjb2RlezB9IGlmIG5vIG1lc3NhZ2VzIGFyZSBpbiB0aGUgZm9sZGVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRm9sZGVyXXtzZXRsYXN0fXtufQotU2V0IGxhc3QgbWVzc2FnZSAoaW50ZXJuYWwgdXNlIG9ubHkpLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRm9sZGVyXXtnZXRzZXF1ZW5jZXN9e30KLVJldHVybiBkaWN0aW9uYXJ5IG9mIHNlcXVlbmNlcyBpbiBmb2xkZXIuICBUaGUgc2VxdWVuY2UgbmFtZXMgYXJlIHVzZWQgCi1hcyBrZXlzLCBhbmQgdGhlIHZhbHVlcyBhcmUgdGhlIGxpc3RzIG9mIG1lc3NhZ2UgbnVtYmVycyBpbiB0aGUKLXNlcXVlbmNlcy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0ZvbGRlcl17cHV0c2VxdWVuY2VzfXtkaWN0fQotUmV0dXJuIGRpY3Rpb25hcnkgb2Ygc2VxdWVuY2VzIGluIGZvbGRlciB7bmFtZTogbGlzdH0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtGb2xkZXJde3JlbW92ZW1lc3NhZ2VzfXtsaXN0fQotUmVtb3ZlIG1lc3NhZ2VzIGluIGxpc3QgZnJvbSBmb2xkZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtGb2xkZXJde3JlZmlsZW1lc3NhZ2VzfXtsaXN0LCB0b2ZvbGRlcn0KLU1vdmUgbWVzc2FnZXMgaW4gbGlzdCB0byBvdGhlciBmb2xkZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtGb2xkZXJde21vdmVtZXNzYWdlfXtuLCB0b2ZvbGRlciwgdG9ufQotTW92ZSBvbmUgbWVzc2FnZSB0byBhIGdpdmVuIGRlc3RpbmF0aW9uIGluIGFub3RoZXIgZm9sZGVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRm9sZGVyXXtjb3B5bWVzc2FnZX17biwgdG9mb2xkZXIsIHRvbn0KLUNvcHkgb25lIG1lc3NhZ2UgdG8gYSBnaXZlbiBkZXN0aW5hdGlvbiBpbiBhbm90aGVyIGZvbGRlci4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cc3Vic2VjdGlvbntNZXNzYWdlIE9iamVjdHMgXGxhYmVse21oLW1lc3NhZ2Utb2JqZWN0c319Ci0KLVRoZSBcY2xhc3N7TWVzc2FnZX0gY2xhc3MgYWRkcyBvbmUgbWV0aG9kIHRvIHRob3NlIG9mCi1cY2xhc3N7bWltZXRvb2xzLk1lc3NhZ2V9OgotCi1cYmVnaW57bWV0aG9kZGVzY31bTWVzc2FnZV17b3Blbm1lc3NhZ2V9e259Ci1SZXR1cm4gYSBuZXcgb3BlbiBtZXNzYWdlIG9iamVjdCAoY29zdHMgYSBmaWxlIGRlc2NyaXB0b3IpLgotXGVuZHttZXRob2RkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJtaW1ldG9vbHMudGV4IGIvRG9jL2xpYi9saWJtaW1ldG9vbHMudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTRiZDRiLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlibWltZXRvb2xzLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle21pbWV0b29sc30gLS0tCi0gICAgICAgICBUb29scyBmb3IgcGFyc2luZyBNSU1FIG1lc3NhZ2VzfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17bWltZXRvb2xzfQotXG1vZHVsZXN5bm9wc2lze1Rvb2xzIGZvciBwYXJzaW5nIE1JTUUtc3R5bGUgbWVzc2FnZSBib2RpZXMufQotCi1cZGVwcmVjYXRlZHsyLjN9e1RoZSBccmVmbW9kdWxle2VtYWlsfSBwYWNrYWdlIHNob3VsZCBiZSB1c2VkIGluCi0gICAgICAgICAgICAgICAgIHByZWZlcmVuY2UgdG8gdGhlIFxtb2R1bGV7bWltZXRvb2xzfSBtb2R1bGUuICBUaGlzCi0gICAgICAgICAgICAgICAgIG1vZHVsZSBpcyBwcmVzZW50IG9ubHkgdG8gbWFpbnRhaW4gYmFja3dhcmQKLSAgICAgICAgICAgICAgICAgY29tcGF0aWJpbGl0eS59Ci0KLVRoaXMgbW9kdWxlIGRlZmluZXMgYSBzdWJjbGFzcyBvZiB0aGUKLVxyZWZtb2R1bGV7cmZjODIyfVxyZWZzdG1vZGluZGV4e3JmYzgyMn0gbW9kdWxlJ3MKLVxjbGFzc3tNZXNzYWdlfSBjbGFzcyBhbmQgYSBudW1iZXIgb2YgdXRpbGl0eSBmdW5jdGlvbnMgdGhhdCBhcmUKLXVzZWZ1bCBmb3IgdGhlIG1hbmlwdWxhdGlvbiBmb3IgTUlNRSBtdWx0aXBhcnQgb3IgZW5jb2RlZCBtZXNzYWdlLgotCi1JdCBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgaXRlbXM6Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e01lc3NhZ2V9e2ZwXG9wdGlvbmFseywgc2Vla2FibGV9fQotUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBcY2xhc3N7TWVzc2FnZX0gY2xhc3MuICBUaGlzIGlzIGEKLXN1YmNsYXNzIG9mIHRoZSBcY2xhc3N7cmZjODIyLk1lc3NhZ2V9IGNsYXNzLCB3aXRoIHNvbWUgYWRkaXRpb25hbAotbWV0aG9kcyAoc2VlIGJlbG93KS4gIFRoZSBcdmFye3NlZWthYmxlfSBhcmd1bWVudCBoYXMgdGhlIHNhbWUgbWVhbmluZwotYXMgZm9yIFxjbGFzc3tyZmM4MjIuTWVzc2FnZX0uCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtjaG9vc2VfYm91bmRhcnl9e30KLVJldHVybiBhIHVuaXF1ZSBzdHJpbmcgdGhhdCBoYXMgYSBoaWdoIGxpa2VsaWhvb2Qgb2YgYmVpbmcgdXNhYmxlIGFzIGEKLXBhcnQgYm91bmRhcnkuICBUaGUgc3RyaW5nIGhhcyB0aGUgZm9ybQotXGNvZGV7J1x2YXJ7aG9zdGlwYWRkcn0uXHZhcnt1aWR9Llx2YXJ7cGlkfS5cdmFye3RpbWVzdGFtcH0uXHZhcntyYW5kb219J30uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2RlY29kZX17aW5wdXQsIG91dHB1dCwgZW5jb2Rpbmd9Ci1SZWFkIGRhdGEgZW5jb2RlZCB1c2luZyB0aGUgYWxsb3dlZCBNSU1FIFx2YXJ7ZW5jb2Rpbmd9IGZyb20gb3BlbiBmaWxlCi1vYmplY3QgXHZhcntpbnB1dH0gYW5kIHdyaXRlIHRoZSBkZWNvZGVkIGRhdGEgdG8gb3BlbiBmaWxlIG9iamVjdAotXHZhcntvdXRwdXR9LiAgVmFsaWQgdmFsdWVzIGZvciBcdmFye2VuY29kaW5nfSBpbmNsdWRlCi1cY29kZXsnYmFzZTY0J30sIFxjb2RleydxdW90ZWQtcHJpbnRhYmxlJ30sIFxjb2Rleyd1dWVuY29kZSd9LAotXGNvZGV7J3gtdXVlbmNvZGUnfSwgXGNvZGV7J3V1ZSd9LCBcY29kZXsneC11dWUnfSwgXGNvZGV7JzdiaXQnfSwgYW5kIAotXGNvZGV7JzhiaXQnfS4gIERlY29kaW5nIG1lc3NhZ2VzIGVuY29kZWQgaW4gXGNvZGV7JzdiaXQnfSBvciBcY29kZXsnOGJpdCd9Ci1oYXMgbm8gZWZmZWN0LiAgVGhlIGlucHV0IGlzIHNpbXBseSBjb3BpZWQgdG8gdGhlIG91dHB1dC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZW5jb2RlfXtpbnB1dCwgb3V0cHV0LCBlbmNvZGluZ30KLVJlYWQgZGF0YSBmcm9tIG9wZW4gZmlsZSBvYmplY3QgXHZhcntpbnB1dH0gYW5kIHdyaXRlIGl0IGVuY29kZWQgdXNpbmcKLXRoZSBhbGxvd2VkIE1JTUUgXHZhcntlbmNvZGluZ30gdG8gb3BlbiBmaWxlIG9iamVjdCBcdmFye291dHB1dH0uCi1WYWxpZCB2YWx1ZXMgZm9yIFx2YXJ7ZW5jb2Rpbmd9IGFyZSB0aGUgc2FtZSBhcyBmb3IgXG1ldGhvZHtkZWNvZGUoKX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2NvcHlsaXRlcmFsfXtpbnB1dCwgb3V0cHV0fQotUmVhZCBsaW5lcyBmcm9tIG9wZW4gZmlsZSBcdmFye2lucHV0fSB1bnRpbCBcRU9Ge30gYW5kIHdyaXRlIHRoZW0gdG8KLW9wZW4gZmlsZSBcdmFye291dHB1dH0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2NvcHliaW5hcnl9e2lucHV0LCBvdXRwdXR9Ci1SZWFkIGJsb2NrcyB1bnRpbCBcRU9Ge30gZnJvbSBvcGVuIGZpbGUgXHZhcntpbnB1dH0gYW5kIHdyaXRlIHRoZW0gdG8KLW9wZW4gZmlsZSBcdmFye291dHB1dH0uICBUaGUgYmxvY2sgc2l6ZSBpcyBjdXJyZW50bHkgZml4ZWQgYXQgODE5Mi4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWVtb2R1bGV7ZW1haWx9e0NvbXByZWhlbnNpdmUgZW1haWwgaGFuZGxpbmcgcGFja2FnZTsgc3VwZXJzZWRlcwotICAgICAgICAgICAgICAgICAgICB0aGUgXG1vZHVsZXttaW1ldG9vbHN9IG1vZHVsZS59Ci0gIFxzZWVtb2R1bGV7cmZjODIyfXtQcm92aWRlcyB0aGUgYmFzZSBjbGFzcyBmb3IKLSAgICAgICAgICAgICAgICAgICAgIFxjbGFzc3ttaW1ldG9vbHMuTWVzc2FnZX0ufQotICBcc2VlbW9kdWxle211bHRpZmlsZX17U3VwcG9ydCBmb3IgcmVhZGluZyBmaWxlcyB3aGljaCBjb250YWluCi0gICAgICAgICAgICAgICAgICAgICAgICBkaXN0aW5jdCBwYXJ0cywgc3VjaCBhcyBNSU1FIGRhdGEufQotICBcc2VldXJse2h0dHA6Ly93d3cuY3MudXUubmwvd2Fpcy9odG1sL25hLWRpci9tYWlsL21pbWUtZmFxLy5odG1sfXsKLSAgICAgICAgICBUaGUgTUlNRSBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucyBkb2N1bWVudC4gIEZvciBhbgotICAgICAgICAgIG92ZXJ2aWV3IG9mIE1JTUUsIHNlZSB0aGUgYW5zd2VyIHRvIHF1ZXN0aW9uIDEuMSBpbiBQYXJ0IDEKLSAgICAgICAgICBvZiB0aGlzIGRvY3VtZW50Ln0KLVxlbmR7c2VlYWxzb30KLQotCi1cc3Vic2VjdGlvbntBZGRpdGlvbmFsIE1ldGhvZHMgb2YgTWVzc2FnZSBPYmplY3RzCi0gICAgICAgICAgICBcbGFiZWx7bWltZXRvb2xzLW1lc3NhZ2Utb2JqZWN0c319Ci0KLVRoZSBcY2xhc3N7TWVzc2FnZX0gY2xhc3MgZGVmaW5lcyB0aGUgZm9sbG93aW5nIG1ldGhvZHMgaW4KLWFkZGl0aW9uIHRvIHRoZSBcY2xhc3N7cmZjODIyLk1lc3NhZ2V9IG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtNZXNzYWdlXXtnZXRwbGlzdH17fQotUmV0dXJuIHRoZSBwYXJhbWV0ZXIgbGlzdCBvZiB0aGUgXG1haWxoZWFkZXJ7Q29udGVudC1UeXBlfSBoZWFkZXIuCi1UaGlzIGlzIGEgbGlzdCBvZiBzdHJpbmdzLiAgRm9yIHBhcmFtZXRlcnMgb2YgdGhlIGZvcm0KLVxzYW1we1x2YXJ7a2V5fT1cdmFye3ZhbHVlfX0sIFx2YXJ7a2V5fSBpcyBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZSBidXQKLVx2YXJ7dmFsdWV9IGlzIG5vdC4gIEZvciBleGFtcGxlLCBpZiB0aGUgbWVzc2FnZSBjb250YWlucyB0aGUgaGVhZGVyCi1cc2FtcHtDb250ZW50LXR5cGU6IHRleHQvaHRtbDsgc3BhbT0xOyBTcGFtPTI7IFNwYW19IHRoZW4KLVxtZXRob2R7Z2V0cGxpc3QoKX0gd2lsbCByZXR1cm4gdGhlIFB5dGhvbiBsaXN0IFxjb2Rle1snc3BhbT0xJywKLSdzcGFtPTInLCAnU3BhbSddfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W01lc3NhZ2Vde2dldHBhcmFtfXtuYW1lfQotUmV0dXJuIHRoZSBcdmFye3ZhbHVlfSBvZiB0aGUgZmlyc3QgcGFyYW1ldGVyIChhcyByZXR1cm5lZCBieQotXG1ldGhvZHtnZXRwbGlzdCgpfSkgb2YgdGhlIGZvcm0gXHNhbXB7XHZhcntuYW1lfT1cdmFye3ZhbHVlfX0gZm9yIHRoZQotZ2l2ZW4gXHZhcntuYW1lfS4gIElmIFx2YXJ7dmFsdWV9IGlzIHN1cnJvdW5kZWQgYnkgcXVvdGVzIG9mIHRoZSBmb3JtCi1gXGNvZGV7PH0uLi5cY29kZXs+fScgb3IgYFxjb2RleyJ9Li4uXGNvZGV7In0nLCB0aGVzZSBhcmUgcmVtb3ZlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W01lc3NhZ2Vde2dldGVuY29kaW5nfXt9Ci1SZXR1cm4gdGhlIGVuY29kaW5nIHNwZWNpZmllZCBpbiB0aGUKLVxtYWlsaGVhZGVye0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmd9IG1lc3NhZ2UgaGVhZGVyLiAgSWYgbm8gc3VjaAotaGVhZGVyIGV4aXN0cywgcmV0dXJuIFxjb2Rleyc3Yml0J30uICBUaGUgZW5jb2RpbmcgaXMgY29udmVydGVkIHRvCi1sb3dlciBjYXNlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTWVzc2FnZV17Z2V0dHlwZX17fQotUmV0dXJuIHRoZSBtZXNzYWdlIHR5cGUgKG9mIHRoZSBmb3JtIFxzYW1we1x2YXJ7dHlwZX0vXHZhcntzdWJ0eXBlfX0pCi1hcyBzcGVjaWZpZWQgaW4gdGhlIFxtYWlsaGVhZGVye0NvbnRlbnQtVHlwZX0gaGVhZGVyLiAgSWYgbm8gc3VjaAotaGVhZGVyIGV4aXN0cywgcmV0dXJuIFxjb2Rleyd0ZXh0L3BsYWluJ30uICBUaGUgdHlwZSBpcyBjb252ZXJ0ZWQgdG8KLWxvd2VyIGNhc2UuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtNZXNzYWdlXXtnZXRtYWludHlwZX17fQotUmV0dXJuIHRoZSBtYWluIHR5cGUgYXMgc3BlY2lmaWVkIGluIHRoZSBcbWFpbGhlYWRlcntDb250ZW50LVR5cGV9Ci1oZWFkZXIuICBJZiBubyBzdWNoIGhlYWRlciBleGlzdHMsIHJldHVybiBcY29kZXsndGV4dCd9LiAgVGhlIG1haW4KLXR5cGUgaXMgY29udmVydGVkIHRvIGxvd2VyIGNhc2UuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtNZXNzYWdlXXtnZXRzdWJ0eXBlfXt9Ci1SZXR1cm4gdGhlIHN1YnR5cGUgYXMgc3BlY2lmaWVkIGluIHRoZSBcbWFpbGhlYWRlcntDb250ZW50LVR5cGV9Ci1oZWFkZXIuICBJZiBubyBzdWNoIGhlYWRlciBleGlzdHMsIHJldHVybiBcY29kZXsncGxhaW4nfS4gIFRoZSBzdWJ0eXBlCi1pcyBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4KLVxlbmR7bWV0aG9kZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlibWltZXR5cGVzLnRleCBiL0RvYy9saWIvbGlibWltZXR5cGVzLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY5OWYwOC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYm1pbWV0eXBlcy50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXttaW1ldHlwZXN9IC0tLQotICAgICAgICAgTWFwIGZpbGVuYW1lcyB0byBNSU1FIHR5cGVzfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17bWltZXR5cGVzfQotXG1vZHVsZXN5bm9wc2lze01hcHBpbmcgb2YgZmlsZW5hbWUgZXh0ZW5zaW9ucyB0byBNSU1FIHR5cGVzLn0KLVxzZWN0aW9uYXV0aG9ye0ZyZWQgTC4gRHJha2UsIEpyLn17ZmRyYWtlQGFjbS5vcmd9Ci0KLQotXGluZGV4aWl7TUlNRX17Y29udGVudCB0eXBlfQotCi1UaGUgXG1vZHVsZXttaW1ldHlwZXN9IG1vZHVsZSBjb252ZXJ0cyBiZXR3ZWVuIGEgZmlsZW5hbWUgb3IgVVJMIGFuZAotdGhlIE1JTUUgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGVuYW1lIGV4dGVuc2lvbi4gIENvbnZlcnNpb25zIGFyZQotcHJvdmlkZWQgZnJvbSBmaWxlbmFtZSB0byBNSU1FIHR5cGUgYW5kIGZyb20gTUlNRSB0eXBlIHRvIGZpbGVuYW1lCi1leHRlbnNpb247IGVuY29kaW5ncyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgdGhlIGxhdHRlciBjb252ZXJzaW9uLgotCi1UaGUgbW9kdWxlIHByb3ZpZGVzIG9uZSBjbGFzcyBhbmQgYSBudW1iZXIgb2YgY29udmVuaWVuY2UgZnVuY3Rpb25zLgotVGhlIGZ1bmN0aW9ucyBhcmUgdGhlIG5vcm1hbCBpbnRlcmZhY2UgdG8gdGhpcyBtb2R1bGUsIGJ1dCBzb21lCi1hcHBsaWNhdGlvbnMgbWF5IGJlIGludGVyZXN0ZWQgaW4gdGhlIGNsYXNzIGFzIHdlbGwuCi0KLVRoZSBmdW5jdGlvbnMgZGVzY3JpYmVkIGJlbG93IHByb3ZpZGUgdGhlIHByaW1hcnkgaW50ZXJmYWNlIGZvciB0aGlzCi1tb2R1bGUuICBJZiB0aGUgbW9kdWxlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCwgdGhleSB3aWxsIGNhbGwKLVxmdW5jdGlvbntpbml0KCl9IGlmIHRoZXkgcmVseSBvbiB0aGUgaW5mb3JtYXRpb24gXGZ1bmN0aW9ue2luaXQoKX0KLXNldHMgdXAuCi0KLQotXGJlZ2lue2Z1bmNkZXNjfXtndWVzc190eXBlfXtmaWxlbmFtZVxvcHRpb25hbHssIHN0cmljdH19Ci1HdWVzcyB0aGUgdHlwZSBvZiBhIGZpbGUgYmFzZWQgb24gaXRzIGZpbGVuYW1lIG9yIFVSTCwgZ2l2ZW4gYnkKLVx2YXJ7ZmlsZW5hbWV9LiAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIHR1cGxlIFxjb2RleyhcdmFye3R5cGV9LAotXHZhcntlbmNvZGluZ30pfSB3aGVyZSBcdmFye3R5cGV9IGlzIFxjb2Rle05vbmV9IGlmIHRoZSB0eXBlIGNhbid0IGJlCi1ndWVzc2VkIChtaXNzaW5nIG9yIHVua25vd24gc3VmZml4KSBvciBhIHN0cmluZyBvZiB0aGUgZm9ybQotXGNvZGV7J1x2YXJ7dHlwZX0vXHZhcntzdWJ0eXBlfSd9LCB1c2FibGUgZm9yIGEgTUlNRQotXG1haWxoZWFkZXJ7Y29udGVudC10eXBlfSBoZWFkZXJcaW5kZXhpaXtNSU1FfXtoZWFkZXJzfS4KLQotXHZhcntlbmNvZGluZ30gaXMgXGNvZGV7Tm9uZX0gZm9yIG5vIGVuY29kaW5nIG9yIHRoZSBuYW1lIG9mIHRoZQotcHJvZ3JhbSB1c2VkIHRvIGVuY29kZSAoZS5nLiBccHJvZ3JhbXtjb21wcmVzc30gb3IgXHByb2dyYW17Z3ppcH0pLgotVGhlIGVuY29kaW5nIGlzIHN1aXRhYmxlIGZvciB1c2UgYXMgYSBcbWFpbGhlYWRlcntDb250ZW50LUVuY29kaW5nfQotaGVhZGVyLCBcZW1waHtub3R9IGFzIGEgXG1haWxoZWFkZXJ7Q29udGVudC1UcmFuc2Zlci1FbmNvZGluZ30gaGVhZGVyLgotVGhlIG1hcHBpbmdzIGFyZSB0YWJsZSBkcml2ZW4uICBFbmNvZGluZyBzdWZmaXhlcyBhcmUgY2FzZSBzZW5zaXRpdmU7Ci10eXBlIHN1ZmZpeGVzIGFyZSBmaXJzdCB0cmllZCBjYXNlIHNlbnNpdGl2ZWx5LCB0aGVuIGNhc2UKLWluc2Vuc2l0aXZlbHkuCi0KLU9wdGlvbmFsIFx2YXJ7c3RyaWN0fSBpcyBhIGZsYWcgc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBsaXN0IG9mIGtub3duCi1NSU1FIHR5cGVzIGlzIGxpbWl0ZWQgdG8gb25seSB0aGUgb2ZmaWNpYWwgdHlwZXMgXHVsaW5re3JlZ2lzdGVyZWQKLXdpdGggSUFOQX17aHR0cDovL3d3dy5pc2kuZWR1L2luLW5vdGVzL2lhbmEvYXNzaWdubWVudHMvbWVkaWEtdHlwZXN9Ci1hcmUgcmVjb2duaXplZC4gIFdoZW4gXHZhcntzdHJpY3R9IGlzIHRydWUgKHRoZSBkZWZhdWx0KSwgb25seSB0aGUKLUlBTkEgdHlwZXMgYXJlIHN1cHBvcnRlZDsgd2hlbiBcdmFye3N0cmljdH0gaXMgZmFsc2UsIHNvbWUgYWRkaXRpb25hbAotbm9uLXN0YW5kYXJkIGJ1dCBjb21tb25seSB1c2VkIE1JTUUgdHlwZXMgYXJlIGFsc28gcmVjb2duaXplZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z3Vlc3NfYWxsX2V4dGVuc2lvbnN9e3R5cGVcb3B0aW9uYWx7LCBzdHJpY3R9fQotR3Vlc3MgdGhlIGV4dGVuc2lvbnMgZm9yIGEgZmlsZSBiYXNlZCBvbiBpdHMgTUlNRSB0eXBlLCBnaXZlbiBieQotXHZhcnt0eXBlfS4KLVRoZSByZXR1cm4gdmFsdWUgaXMgYSBsaXN0IG9mIHN0cmluZ3MgZ2l2aW5nIGFsbCBwb3NzaWJsZSBmaWxlbmFtZSBleHRlbnNpb25zLAotaW5jbHVkaW5nIHRoZSBsZWFkaW5nIGRvdCAoXGNoYXJhY3RlcnsufSkuICBUaGUgZXh0ZW5zaW9ucyBhcmUgbm90IGd1YXJhbnRlZWQKLXRvIGhhdmUgYmVlbiBhc3NvY2lhdGVkIHdpdGggYW55IHBhcnRpY3VsYXIgZGF0YSBzdHJlYW0sIGJ1dCB3b3VsZCBiZSBtYXBwZWQKLXRvIHRoZSBNSU1FIHR5cGUgXHZhcnt0eXBlfSBieSBcZnVuY3Rpb257Z3Vlc3NfdHlwZSgpfS4KLQotT3B0aW9uYWwgXHZhcntzdHJpY3R9IGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIHdpdGggdGhlCi1cZnVuY3Rpb257Z3Vlc3NfdHlwZSgpfSBmdW5jdGlvbi4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue2Z1bmNkZXNjfXtndWVzc19leHRlbnNpb259e3R5cGVcb3B0aW9uYWx7LCBzdHJpY3R9fQotR3Vlc3MgdGhlIGV4dGVuc2lvbiBmb3IgYSBmaWxlIGJhc2VkIG9uIGl0cyBNSU1FIHR5cGUsIGdpdmVuIGJ5Ci1cdmFye3R5cGV9LgotVGhlIHJldHVybiB2YWx1ZSBpcyBhIHN0cmluZyBnaXZpbmcgYSBmaWxlbmFtZSBleHRlbnNpb24sIGluY2x1ZGluZyB0aGUKLWxlYWRpbmcgZG90IChcY2hhcmFjdGVyey59KS4gIFRoZSBleHRlbnNpb24gaXMgbm90IGd1YXJhbnRlZWQgdG8gaGF2ZSBiZWVuCi1hc3NvY2lhdGVkIHdpdGggYW55IHBhcnRpY3VsYXIgZGF0YSBzdHJlYW0sIGJ1dCB3b3VsZCBiZSBtYXBwZWQgdG8gdGhlIAotTUlNRSB0eXBlIFx2YXJ7dHlwZX0gYnkgXGZ1bmN0aW9ue2d1ZXNzX3R5cGUoKX0uICBJZiBubyBleHRlbnNpb24gY2FuCi1iZSBndWVzc2VkIGZvciBcdmFye3R5cGV9LCBcY29kZXtOb25lfSBpcyByZXR1cm5lZC4KLQotT3B0aW9uYWwgXHZhcntzdHJpY3R9IGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIHdpdGggdGhlCi1cZnVuY3Rpb257Z3Vlc3NfdHlwZSgpfSBmdW5jdGlvbi4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotU29tZSBhZGRpdGlvbmFsIGZ1bmN0aW9ucyBhbmQgZGF0YSBpdGVtcyBhcmUgYXZhaWxhYmxlIGZvciBjb250cm9sbGluZwotdGhlIGJlaGF2aW9yIG9mIHRoZSBtb2R1bGUuCi0KLQotXGJlZ2lue2Z1bmNkZXNjfXtpbml0fXtcb3B0aW9uYWx7ZmlsZXN9fQotSW5pdGlhbGl6ZSB0aGUgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzLiAgSWYgZ2l2ZW4sIFx2YXJ7ZmlsZXN9IG11c3QKLWJlIGEgc2VxdWVuY2Ugb2YgZmlsZSBuYW1lcyB3aGljaCBzaG91bGQgYmUgdXNlZCB0byBhdWdtZW50IHRoZQotZGVmYXVsdCB0eXBlIG1hcC4gIElmIG9taXR0ZWQsIHRoZSBmaWxlIG5hbWVzIHRvIHVzZSBhcmUgdGFrZW4gZnJvbQotXGNvbnN0YW50e2tub3duZmlsZXN9LiAgRWFjaCBmaWxlIG5hbWVkIGluIFx2YXJ7ZmlsZXN9IG9yCi1cY29uc3RhbnR7a25vd25maWxlc30gdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRob3NlIG5hbWVkIGJlZm9yZSBpdC4KLUNhbGxpbmcgXGZ1bmN0aW9ue2luaXQoKX0gcmVwZWF0ZWRseSBpcyBhbGxvd2VkLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtyZWFkX21pbWVfdHlwZXN9e2ZpbGVuYW1lfQotTG9hZCB0aGUgdHlwZSBtYXAgZ2l2ZW4gaW4gdGhlIGZpbGUgXHZhcntmaWxlbmFtZX0sIGlmIGl0IGV4aXN0cy4gIFRoZSAKLXR5cGUgbWFwIGlzIHJldHVybmVkIGFzIGEgZGljdGlvbmFyeSBtYXBwaW5nIGZpbGVuYW1lIGV4dGVuc2lvbnMsCi1pbmNsdWRpbmcgdGhlIGxlYWRpbmcgZG90IChcY2hhcmFjdGVyey59KSwgdG8gc3RyaW5ncyBvZiB0aGUgZm9ybQotXGNvZGV7J1x2YXJ7dHlwZX0vXHZhcntzdWJ0eXBlfSd9LiAgSWYgdGhlIGZpbGUgXHZhcntmaWxlbmFtZX0gZG9lcwotbm90IGV4aXN0IG9yIGNhbm5vdCBiZSByZWFkLCBcY29kZXtOb25lfSBpcyByZXR1cm5lZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue2Z1bmNkZXNjfXthZGRfdHlwZX17dHlwZSwgZXh0XG9wdGlvbmFseywgc3RyaWN0fX0KLUFkZCBhIG1hcHBpbmcgZnJvbSB0aGUgbWltZXR5cGUgXHZhcnt0eXBlfSB0byB0aGUgZXh0ZW5zaW9uIFx2YXJ7ZXh0fS4KLVdoZW4gdGhlIGV4dGVuc2lvbiBpcyBhbHJlYWR5IGtub3duLCB0aGUgbmV3IHR5cGUgd2lsbCByZXBsYWNlIHRoZSBvbGQKLW9uZS4gV2hlbiB0aGUgdHlwZSBpcyBhbHJlYWR5IGtub3duIHRoZSBleHRlbnNpb24gd2lsbCBiZSBhZGRlZAotdG8gdGhlIGxpc3Qgb2Yga25vd24gZXh0ZW5zaW9ucy4KLQotV2hlbiBcdmFye3N0cmljdH0gaXMgdGhlIG1hcHBpbmcgd2lsbCBhZGRlZCB0byB0aGUgb2ZmaWNpYWwKLU1JTUUgdHlwZXMsIG90aGVyd2lzZSB0byB0aGUgbm9uLXN0YW5kYXJkIG9uZXMuCi1cZW5ke2Z1bmNkZXNjfQotCi0KLVxiZWdpbntkYXRhZGVzY317aW5pdGVkfQotRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoZSBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmVzIGhhdmUgYmVlbgotaW5pdGlhbGl6ZWQuICBUaGlzIGlzIHNldCB0byB0cnVlIGJ5IFxmdW5jdGlvbntpbml0KCl9LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtrbm93bmZpbGVzfQotTGlzdCBvZiB0eXBlIG1hcCBmaWxlIG5hbWVzIGNvbW1vbmx5IGluc3RhbGxlZC4gIFRoZXNlIGZpbGVzIGFyZQotdHlwaWNhbGx5IG5hbWVkIFxmaWxle21pbWUudHlwZXN9IGFuZCBhcmUgaW5zdGFsbGVkIGluIGRpZmZlcmVudAotbG9jYXRpb25zIGJ5IGRpZmZlcmVudCBwYWNrYWdlcy5caW5kZXh7ZmlsZSFtaW1lLnR5cGVzfQotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtzdWZmaXhfbWFwfQotRGljdGlvbmFyeSBtYXBwaW5nIHN1ZmZpeGVzIHRvIHN1ZmZpeGVzLiAgVGhpcyBpcyB1c2VkIHRvIGFsbG93Ci1yZWNvZ25pdGlvbiBvZiBlbmNvZGVkIGZpbGVzIGZvciB3aGljaCB0aGUgZW5jb2RpbmcgYW5kIHRoZSB0eXBlIGFyZQotaW5kaWNhdGVkIGJ5IHRoZSBzYW1lIGV4dGVuc2lvbi4gIEZvciBleGFtcGxlLCB0aGUgXGZpbGV7LnRnen0KLWV4dGVuc2lvbiBpcyBtYXBwZWQgdG8gXGZpbGV7LnRhci5nen0gdG8gYWxsb3cgdGhlIGVuY29kaW5nIGFuZCB0eXBlCi10byBiZSByZWNvZ25pemVkIHNlcGFyYXRlbHkuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e2VuY29kaW5nc19tYXB9Ci1EaWN0aW9uYXJ5IG1hcHBpbmcgZmlsZW5hbWUgZXh0ZW5zaW9ucyB0byBlbmNvZGluZyB0eXBlcy4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317dHlwZXNfbWFwfQotRGljdGlvbmFyeSBtYXBwaW5nIGZpbGVuYW1lIGV4dGVuc2lvbnMgdG8gTUlNRSB0eXBlcy4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317Y29tbW9uX3R5cGVzfQotRGljdGlvbmFyeSBtYXBwaW5nIGZpbGVuYW1lIGV4dGVuc2lvbnMgdG8gbm9uLXN0YW5kYXJkLCBidXQgY29tbW9ubHkKLWZvdW5kIE1JTUUgdHlwZXMuCi1cZW5ke2RhdGFkZXNjfQotCi0KLVRoZSBcY2xhc3N7TWltZVR5cGVzfSBjbGFzcyBtYXkgYmUgdXNlZnVsIGZvciBhcHBsaWNhdGlvbnMgd2hpY2ggbWF5Ci13YW50IG1vcmUgdGhhbiBvbmUgTUlNRS10eXBlIGRhdGFiYXNlOgotCi1cYmVnaW57Y2xhc3NkZXNjfXtNaW1lVHlwZXN9e1xvcHRpb25hbHtmaWxlbmFtZXN9fQotICBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBNSU1FLXR5cGVzIGRhdGFiYXNlLiAgQnkgZGVmYXVsdCwgaXQKLSAgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBzYW1lIGRhdGFiYXNlIGFzIHRoZSByZXN0IG9mIHRoaXMgbW9kdWxlLgotICBUaGUgaW5pdGlhbCBkYXRhYmFzZSBpcyBhIGNvcHkgb2YgdGhhdCBwcm92aWRlZCBieSB0aGUgbW9kdWxlLCBhbmQKLSAgbWF5IGJlIGV4dGVuZGVkIGJ5IGxvYWRpbmcgYWRkaXRpb25hbCBcZmlsZXttaW1lLnR5cGVzfS1zdHlsZSBmaWxlcwotICBpbnRvIHRoZSBkYXRhYmFzZSB1c2luZyB0aGUgXG1ldGhvZHtyZWFkKCl9IG9yIFxtZXRob2R7cmVhZGZwKCl9Ci0gIG1ldGhvZHMuICBUaGUgbWFwcGluZyBkaWN0aW9uYXJpZXMgbWF5IGFsc28gYmUgY2xlYXJlZCBiZWZvcmUKLSAgbG9hZGluZyBhZGRpdGlvbmFsIGRhdGEgaWYgdGhlIGRlZmF1bHQgZGF0YSBpcyBub3QgZGVzaXJlZC4KLQotICBUaGUgb3B0aW9uYWwgXHZhcntmaWxlbmFtZXN9IHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byBjYXVzZQotICBhZGRpdGlvbmFsIGZpbGVzIHRvIGJlIGxvYWRlZCBgYG9uIHRvcCcnIG9mIHRoZSBkZWZhdWx0IGRhdGFiYXNlLgotCi0gIFx2ZXJzaW9uYWRkZWR7Mi4yfQotXGVuZHtjbGFzc2Rlc2N9Ci0KLUFuIGV4YW1wbGUgdXNhZ2Ugb2YgdGhlIG1vZHVsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGltcG9ydCBtaW1ldHlwZXMKLT4+PiBtaW1ldHlwZXMuaW5pdCgpCi0+Pj4gbWltZXR5cGVzLmtub3duZmlsZXMKLVsnL2V0Yy9taW1lLnR5cGVzJywgJy9ldGMvaHR0cGQvbWltZS50eXBlcycsIC4uLiBdCi0+Pj4gbWltZXR5cGVzLnN1ZmZpeF9tYXBbJy50Z3onXQotJy50YXIuZ3onCi0+Pj4gbWltZXR5cGVzLmVuY29kaW5nc19tYXBbJy5neiddCi0nZ3ppcCcKLT4+PiBtaW1ldHlwZXMudHlwZXNfbWFwWycudGd6J10KLSdhcHBsaWNhdGlvbi94LXRhci1neicKLVxlbmR7dmVyYmF0aW19Ci0KLVxzdWJzZWN0aW9ue01pbWVUeXBlcyBPYmplY3RzIFxsYWJlbHttaW1ldHlwZXMtb2JqZWN0c319Ci0KLVxjbGFzc3tNaW1lVHlwZXN9IGluc3RhbmNlcyBwcm92aWRlIGFuIGludGVyZmFjZSB3aGljaCBpcyB2ZXJ5IGxpa2UKLXRoYXQgb2YgdGhlIFxyZWZtb2R1bGV7bWltZXR5cGVzfSBtb2R1bGUuCi0KLVxiZWdpbnttZW1iZXJkZXNjfVtNaW1lVHlwZXNde3N1ZmZpeF9tYXB9Ci0gIERpY3Rpb25hcnkgbWFwcGluZyBzdWZmaXhlcyB0byBzdWZmaXhlcy4gIFRoaXMgaXMgdXNlZCB0byBhbGxvdwotICByZWNvZ25pdGlvbiBvZiBlbmNvZGVkIGZpbGVzIGZvciB3aGljaCB0aGUgZW5jb2RpbmcgYW5kIHRoZSB0eXBlIGFyZQotICBpbmRpY2F0ZWQgYnkgdGhlIHNhbWUgZXh0ZW5zaW9uLiAgRm9yIGV4YW1wbGUsIHRoZSBcZmlsZXsudGd6fQotICBleHRlbnNpb24gaXMgbWFwcGVkIHRvIFxmaWxley50YXIuZ3p9IHRvIGFsbG93IHRoZSBlbmNvZGluZyBhbmQgdHlwZQotICB0byBiZSByZWNvZ25pemVkIHNlcGFyYXRlbHkuICBUaGlzIGlzIGluaXRpYWxseSBhIGNvcHkgb2YgdGhlIGdsb2JhbAotICBcY29kZXtzdWZmaXhfbWFwfSBkZWZpbmVkIGluIHRoZSBtb2R1bGUuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtNaW1lVHlwZXNde2VuY29kaW5nc19tYXB9Ci0gIERpY3Rpb25hcnkgbWFwcGluZyBmaWxlbmFtZSBleHRlbnNpb25zIHRvIGVuY29kaW5nIHR5cGVzLiAgVGhpcyBpcwotICBpbml0aWFsbHkgYSBjb3B5IG9mIHRoZSBnbG9iYWwgXGNvZGV7ZW5jb2RpbmdzX21hcH0gZGVmaW5lZCBpbiB0aGUKLSAgbW9kdWxlLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bTWltZVR5cGVzXXt0eXBlc19tYXB9Ci0gIERpY3Rpb25hcnkgbWFwcGluZyBmaWxlbmFtZSBleHRlbnNpb25zIHRvIE1JTUUgdHlwZXMuICBUaGlzIGlzCi0gIGluaXRpYWxseSBhIGNvcHkgb2YgdGhlIGdsb2JhbCBcY29kZXt0eXBlc19tYXB9IGRlZmluZWQgaW4gdGhlCi0gIG1vZHVsZS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W01pbWVUeXBlc117Y29tbW9uX3R5cGVzfQotICBEaWN0aW9uYXJ5IG1hcHBpbmcgZmlsZW5hbWUgZXh0ZW5zaW9ucyB0byBub24tc3RhbmRhcmQsIGJ1dCBjb21tb25seQotICBmb3VuZCBNSU1FIHR5cGVzLiAgVGhpcyBpcyBpbml0aWFsbHkgYSBjb3B5IG9mIHRoZSBnbG9iYWwKLSAgXGNvZGV7Y29tbW9uX3R5cGVzfSBkZWZpbmVkIGluIHRoZSBtb2R1bGUuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtNaW1lVHlwZXNde2d1ZXNzX2V4dGVuc2lvbn17dHlwZVxvcHRpb25hbHssIHN0cmljdH19Ci0gIFNpbWlsYXIgdG8gdGhlIFxmdW5jdGlvbntndWVzc19leHRlbnNpb24oKX0gZnVuY3Rpb24sIHVzaW5nIHRoZQotICB0YWJsZXMgc3RvcmVkIGFzIHBhcnQgb2YgdGhlIG9iamVjdC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W01pbWVUeXBlc117Z3Vlc3NfdHlwZX17dXJsXG9wdGlvbmFseywgc3RyaWN0fX0KLSAgU2ltaWxhciB0byB0aGUgXGZ1bmN0aW9ue2d1ZXNzX3R5cGUoKX0gZnVuY3Rpb24sIHVzaW5nIHRoZSB0YWJsZXMKLSAgc3RvcmVkIGFzIHBhcnQgb2YgdGhlIG9iamVjdC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W01pbWVUeXBlc117cmVhZH17cGF0aH0KLSAgTG9hZCBNSU1FIGluZm9ybWF0aW9uIGZyb20gYSBmaWxlIG5hbWVkIFx2YXJ7cGF0aH0uICBUaGlzIHVzZXMKLSAgXG1ldGhvZHtyZWFkZnAoKX0gdG8gcGFyc2UgdGhlIGZpbGUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtNaW1lVHlwZXNde3JlYWRmcH17ZmlsZX0KLSAgTG9hZCBNSU1FIHR5cGUgaW5mb3JtYXRpb24gZnJvbSBhbiBvcGVuIGZpbGUuICBUaGUgZmlsZSBtdXN0IGhhdmUKLSAgdGhlIGZvcm1hdCBvZiB0aGUgc3RhbmRhcmQgXGZpbGV7bWltZS50eXBlc30gZmlsZXMuCi1cZW5ke21ldGhvZGRlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYm1pc2MudGV4IGIvRG9jL2xpYi9saWJtaXNjLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY3OWVkYS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYm1pc2MudGV4CisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1cY2hhcHRlcntNaXNjZWxsYW5lb3VzIFNlcnZpY2VzfQotXGxhYmVse21pc2N9Ci0KLVRoZSBtb2R1bGVzIGRlc2NyaWJlZCBpbiB0aGlzIGNoYXB0ZXIgcHJvdmlkZSBtaXNjZWxsYW5lb3VzIHNlcnZpY2VzCi10aGF0IGFyZSBhdmFpbGFibGUgaW4gYWxsIFB5dGhvbiB2ZXJzaW9ucy4gIEhlcmUncyBhbiBvdmVydmlldzoKLQotXGxvY2FsbW9kdWxldGFibGUKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlibW0udGV4IGIvRG9jL2xpYi9saWJtbS50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYzE0YjQuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJtbS50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVxjaGFwdGVye011bHRpbWVkaWEgU2VydmljZXN9Ci1cbGFiZWx7bW1lZGlhfQotCi1UaGUgbW9kdWxlcyBkZXNjcmliZWQgaW4gdGhpcyBjaGFwdGVyIGltcGxlbWVudCB2YXJpb3VzIGFsZ29yaXRobXMgb3IKLWludGVyZmFjZXMgdGhhdCBhcmUgbWFpbmx5IHVzZWZ1bCBmb3IgbXVsdGltZWRpYSBhcHBsaWNhdGlvbnMuICBUaGV5Ci1hcmUgYXZhaWxhYmxlIGF0IHRoZSBkaXNjcmV0aW9uIG9mIHRoZSBpbnN0YWxsYXRpb24uICBIZXJlJ3MgYW4gb3ZlcnZpZXc6Ci0KLVxsb2NhbG1vZHVsZXRhYmxlCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYm1tYXAudGV4IGIvRG9jL2xpYi9saWJtbWFwLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ1YWVlYS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYm1tYXAudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7bW1hcH0gLS0tCi1NZW1vcnktbWFwcGVkIGZpbGUgc3VwcG9ydH0KLQotXGRlY2xhcmVtb2R1bGV7YnVpbHRpbn17bW1hcH0KLVxtb2R1bGVzeW5vcHNpc3tJbnRlcmZhY2UgdG8gbWVtb3J5LW1hcHBlZCBmaWxlcyBmb3IgXFVOSVhcIGFuZCBXaW5kb3dzLn0KLQotTWVtb3J5LW1hcHBlZCBmaWxlIG9iamVjdHMgYmVoYXZlIGxpa2UgYm90aCBzdHJpbmdzIGFuZCBsaWtlCi1maWxlIG9iamVjdHMuICBVbmxpa2Ugbm9ybWFsIHN0cmluZyBvYmplY3RzLCBob3dldmVyLCB0aGVzZSBhcmUKLW11dGFibGUuICBZb3UgY2FuIHVzZSBtbWFwIG9iamVjdHMgaW4gbW9zdCBwbGFjZXMgd2hlcmUgc3RyaW5ncwotYXJlIGV4cGVjdGVkOyBmb3IgZXhhbXBsZSwgeW91IGNhbiB1c2UgdGhlIFxtb2R1bGV7cmV9IG1vZHVsZSB0bwotc2VhcmNoIHRocm91Z2ggYSBtZW1vcnktbWFwcGVkIGZpbGUuICBTaW5jZSB0aGV5J3JlIG11dGFibGUsIHlvdSBjYW4KLWNoYW5nZSBhIHNpbmdsZSBjaGFyYWN0ZXIgYnkgZG9pbmcgXGNvZGV7b2JqW1x2YXJ7aW5kZXh9XSA9ICdhJ30sIG9yCi1jaGFuZ2UgYSBzdWJzdHJpbmcgYnkgYXNzaWduaW5nIHRvIGEgc2xpY2U6Ci1cY29kZXtvYmpbXHZhcntpMX06XHZhcntpMn1dID0gJy4uLid9LiAgWW91IGNhbiBhbHNvIHJlYWQgYW5kIHdyaXRlCi1kYXRhIHN0YXJ0aW5nIGF0IHRoZSBjdXJyZW50IGZpbGUgcG9zaXRpb24sIGFuZCBcbWV0aG9ke3NlZWsoKX0KLXRocm91Z2ggdGhlIGZpbGUgdG8gZGlmZmVyZW50IHBvc2l0aW9ucy4KLQotQSBtZW1vcnktbWFwcGVkIGZpbGUgaXMgY3JlYXRlZCBieSB0aGUgXGZ1bmN0aW9ue21tYXAoKX0gZnVuY3Rpb24sCi13aGljaCBpcyBkaWZmZXJlbnQgb24gXFVOSVh7fSBhbmQgb24gV2luZG93cy4gIEluIGVpdGhlciBjYXNlIHlvdSBtdXN0Ci1wcm92aWRlIGEgZmlsZSBkZXNjcmlwdG9yIGZvciBhIGZpbGUgb3BlbmVkIGZvciB1cGRhdGUuCi1JZiB5b3Ugd2lzaCB0byBtYXAgYW4gZXhpc3RpbmcgUHl0aG9uIGZpbGUgb2JqZWN0LCB1c2UgaXRzCi1cbWV0aG9ke2ZpbGVubygpfSBtZXRob2QgdG8gb2J0YWluIHRoZSBjb3JyZWN0IHZhbHVlIGZvciB0aGUKLVx2YXJ7ZmlsZW5vfSBwYXJhbWV0ZXIuICBPdGhlcndpc2UsIHlvdSBjYW4gb3BlbiB0aGUgZmlsZSB1c2luZyB0aGUKLVxmdW5jdGlvbntvcy5vcGVuKCl9IGZ1bmN0aW9uLCB3aGljaCByZXR1cm5zIGEgZmlsZSBkZXNjcmlwdG9yCi1kaXJlY3RseSAodGhlIGZpbGUgc3RpbGwgbmVlZHMgdG8gYmUgY2xvc2VkIHdoZW4gZG9uZSkuCi0KLUZvciBib3RoIHRoZSBcVU5JWHt9IGFuZCBXaW5kb3dzIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiwKLVx2YXJ7YWNjZXNzfSBtYXkgYmUgc3BlY2lmaWVkIGFzIGFuIG9wdGlvbmFsIGtleXdvcmQgcGFyYW1ldGVyLgotXHZhcnthY2Nlc3N9IGFjY2VwdHMgb25lIG9mIHRocmVlIHZhbHVlczogXGNvbnN0YW50e0FDQ0VTU19SRUFEfSwKLVxjb25zdGFudHtBQ0NFU1NfV1JJVEV9LCBvciBcY29uc3RhbnR7QUNDRVNTX0NPUFl9IHRvIHNwZWNpZnkKLXJlYWRvbmx5LCB3cml0ZS10aHJvdWdoIG9yIGNvcHktb24td3JpdGUgbWVtb3J5IHJlc3BlY3RpdmVseS4KLVx2YXJ7YWNjZXNzfSBjYW4gYmUgdXNlZCBvbiBib3RoIFxVTklYe30gYW5kIFdpbmRvd3MuICBJZgotXHZhcnthY2Nlc3N9IGlzIG5vdCBzcGVjaWZpZWQsIFdpbmRvd3MgbW1hcCByZXR1cm5zIGEgd3JpdGUtdGhyb3VnaAotbWFwcGluZy4gIFRoZSBpbml0aWFsIG1lbW9yeSB2YWx1ZXMgZm9yIGFsbCB0aHJlZSBhY2Nlc3MgdHlwZXMgYXJlCi10YWtlbiBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsZS4gIEFzc2lnbm1lbnQgdG8gYW4KLVxjb25zdGFudHtBQ0NFU1NfUkVBRH0gbWVtb3J5IG1hcCByYWlzZXMgYSBcZXhjZXB0aW9ue1R5cGVFcnJvcn0KLWV4Y2VwdGlvbi4gIEFzc2lnbm1lbnQgdG8gYW4gXGNvbnN0YW50e0FDQ0VTU19XUklURX0gbWVtb3J5IG1hcAotYWZmZWN0cyBib3RoIG1lbW9yeSBhbmQgdGhlIHVuZGVybHlpbmcgZmlsZS4gIEFzc2lnbm1lbnQgdG8gYW4KLVxjb25zdGFudHtBQ0NFU1NfQ09QWX0gbWVtb3J5IG1hcCBhZmZlY3RzIG1lbW9yeSBidXQgZG9lcyBub3QgdXBkYXRlCi10aGUgdW5kZXJseWluZyBmaWxlLiAgXHZlcnNpb25jaGFuZ2VkW1RvIG1hcCBhbm9ueW1vdXMgbWVtb3J5LAotLTEgc2hvdWxkIGJlIHBhc3NlZCBhcyB0aGUgZmlsZW5vIGFsb25nIHdpdGggdGhlIGxlbmd0aF17Mi41fQotCi1cYmVnaW57ZnVuY2Rlc2N9e21tYXB9e2ZpbGVubywgbGVuZ3RoXG9wdGlvbmFseywgdGFnbmFtZVxvcHRpb25hbHssIGFjY2Vzc319fQotICBcc3Ryb25neyhXaW5kb3dzIHZlcnNpb24pfSBNYXBzIFx2YXJ7bGVuZ3RofSBieXRlcyBmcm9tIHRoZSBmaWxlCi0gIHNwZWNpZmllZCBieSB0aGUgZmlsZSBoYW5kbGUgXHZhcntmaWxlbm99LCBhbmQgcmV0dXJucyBhIG1tYXAKLSAgb2JqZWN0LiAgSWYgXHZhcntsZW5ndGh9IGlzIGxhcmdlciB0aGFuIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGZpbGUsCi0gIHRoZSBmaWxlIGlzIGV4dGVuZGVkIHRvIGNvbnRhaW4gXHZhcntsZW5ndGh9IGJ5dGVzLiAgSWYgXHZhcntsZW5ndGh9Ci0gIGlzIFxjb2RlezB9LCB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIG1hcCBpcyB0aGUgY3VycmVudCBzaXplCi0gIG9mIHRoZSBmaWxlLCBleGNlcHQgdGhhdCBpZiB0aGUgZmlsZSBpcyBlbXB0eSBXaW5kb3dzIHJhaXNlcyBhbgotICBleGNlcHRpb24gKHlvdSBjYW5ub3QgY3JlYXRlIGFuIGVtcHR5IG1hcHBpbmcgb24gV2luZG93cykuCi0KLSAgXHZhcnt0YWduYW1lfSwgaWYgc3BlY2lmaWVkIGFuZCBub3QgXGNvZGV7Tm9uZX0sIGlzIGEgc3RyaW5nIGdpdmluZwotICBhIHRhZyBuYW1lIGZvciB0aGUgbWFwcGluZy4gIFdpbmRvd3MgYWxsb3dzIHlvdSB0byBoYXZlIG1hbnkKLSAgZGlmZmVyZW50IG1hcHBpbmdzIGFnYWluc3QgdGhlIHNhbWUgZmlsZS4gIElmIHlvdSBzcGVjaWZ5IHRoZSBuYW1lCi0gIG9mIGFuIGV4aXN0aW5nIHRhZywgdGhhdCB0YWcgaXMgb3BlbmVkLCBvdGhlcndpc2UgYSBuZXcgdGFnIG9mIHRoaXMKLSAgbmFtZSBpcyBjcmVhdGVkLiAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgb21pdHRlZCBvciBcY29kZXtOb25lfSwgdGhlCi0gIG1hcHBpbmcgaXMgY3JlYXRlZCB3aXRob3V0IGEgbmFtZS4gIEF2b2lkaW5nIHRoZSB1c2Ugb2YgdGhlIHRhZwotICBwYXJhbWV0ZXIgd2lsbCBhc3Npc3QgaW4ga2VlcGluZyB5b3VyIGNvZGUgcG9ydGFibGUgYmV0d2VlbiBcVU5JWHt9Ci0gIGFuZCBXaW5kb3dzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjbml9e21tYXB9e2ZpbGVubywgbGVuZ3RoXG9wdGlvbmFseywgZmxhZ3Ncb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgIHByb3Rcb3B0aW9uYWx7LCBhY2Nlc3N9fX19Ci0gIFxzdHJvbmd7KFxVTklYe30gdmVyc2lvbil9IE1hcHMgXHZhcntsZW5ndGh9IGJ5dGVzIGZyb20gdGhlIGZpbGUKLSAgc3BlY2lmaWVkIGJ5IHRoZSBmaWxlIGRlc2NyaXB0b3IgXHZhcntmaWxlbm99LCBhbmQgcmV0dXJucyBhIG1tYXAKLSAgb2JqZWN0LiAgSWYgXHZhcntsZW5ndGh9IGlzIFxjb2RlezB9LCB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIG1hcAotICB3aWxsIGJlIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGZpbGUgd2hlbiBcZnVuY3Rpb257bW1hcCgpfSBpcwotICBjYWxsZWQuCi0gIAotICBcdmFye2ZsYWdzfSBzcGVjaWZpZXMgdGhlIG5hdHVyZSBvZiB0aGUgbWFwcGluZy4KLSAgXGNvbnN0YW50e01BUF9QUklWQVRFfSBjcmVhdGVzIGEgcHJpdmF0ZSBjb3B5LW9uLXdyaXRlIG1hcHBpbmcsIHNvCi0gIGNoYW5nZXMgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBtbWFwIG9iamVjdCB3aWxsIGJlIHByaXZhdGUgdG8gdGhpcwotICBwcm9jZXNzLCBhbmQgXGNvbnN0YW50e01BUF9TSEFSRUR9IGNyZWF0ZXMgYSBtYXBwaW5nIHRoYXQncyBzaGFyZWQKLSAgd2l0aCBhbGwgb3RoZXIgcHJvY2Vzc2VzIG1hcHBpbmcgdGhlIHNhbWUgYXJlYXMgb2YgdGhlIGZpbGUuICBUaGUKLSAgZGVmYXVsdCB2YWx1ZSBpcyBcY29uc3RhbnR7TUFQX1NIQVJFRH0uCi0KLSAgXHZhcntwcm90fSwgaWYgc3BlY2lmaWVkLCBnaXZlcyB0aGUgZGVzaXJlZCBtZW1vcnkgcHJvdGVjdGlvbjsgdGhlCi0gIHR3byBtb3N0IHVzZWZ1bCB2YWx1ZXMgYXJlIFxjb25zdGFudHtQUk9UX1JFQUR9IGFuZAotICBcY29uc3RhbnR7UFJPVF9XUklURX0sIHRvIHNwZWNpZnkgdGhhdCB0aGUgcGFnZXMgbWF5IGJlIHJlYWQgb3IKLSAgd3JpdHRlbi4gIFx2YXJ7cHJvdH0gZGVmYXVsdHMgdG8gXGNvbnN0YW50e1BST1RfUkVBRCB8IFBST1RfV1JJVEV9LgotCi0gIFx2YXJ7YWNjZXNzfSBtYXkgYmUgc3BlY2lmaWVkIGluIGxpZXUgb2YgXHZhcntmbGFnc30gYW5kIFx2YXJ7cHJvdH0KLSAgYXMgYW4gb3B0aW9uYWwga2V5d29yZCBwYXJhbWV0ZXIuICBJdCBpcyBhbiBlcnJvciB0byBzcGVjaWZ5IGJvdGgKLSAgXHZhcntmbGFnc30sIFx2YXJ7cHJvdH0gYW5kIFx2YXJ7YWNjZXNzfS4gIFNlZSB0aGUgZGVzY3JpcHRpb24gb2YKLSAgXHZhcnthY2Nlc3N9IGFib3ZlIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gdXNlIHRoaXMgcGFyYW1ldGVyLgotXGVuZHtmdW5jZGVzY25pfQotCi0KLU1lbW9yeS1tYXBwZWQgZmlsZSBvYmplY3RzIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotCi0KLVxiZWdpbnttZXRob2RkZXNjfVttbWFwXXtjbG9zZX17fQotICBDbG9zZSB0aGUgZmlsZS4gIFN1YnNlcXVlbnQgY2FsbHMgdG8gb3RoZXIgbWV0aG9kcyBvZiB0aGUgb2JqZWN0Ci0gIHdpbGwgcmVzdWx0IGluIGFuIGV4Y2VwdGlvbiBiZWluZyByYWlzZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVttbWFwXXtmaW5kfXtzdHJpbmdcb3B0aW9uYWx7LCBzdGFydH19Ci0gIFJldHVybnMgdGhlIGxvd2VzdCBpbmRleCBpbiB0aGUgb2JqZWN0IHdoZXJlIHRoZSBzdWJzdHJpbmcKLSAgXHZhcntzdHJpbmd9IGlzIGZvdW5kLiAgUmV0dXJucyBcY29kZXstMX0gb24gZmFpbHVyZS4gIFx2YXJ7c3RhcnR9Ci0gIGlzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgc2VhcmNoIGJlZ2lucywgYW5kIGRlZmF1bHRzIHRvIHplcm8uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVttbWFwXXtmbHVzaH17XG9wdGlvbmFse29mZnNldCwgc2l6ZX19Ci0gIEZsdXNoZXMgY2hhbmdlcyBtYWRlIHRvIHRoZSBpbi1tZW1vcnkgY29weSBvZiBhIGZpbGUgYmFjayB0byBkaXNrLgotICBXaXRob3V0IHVzZSBvZiB0aGlzIGNhbGwgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgY2hhbmdlcyBhcmUKLSAgd3JpdHRlbiBiYWNrIGJlZm9yZSB0aGUgb2JqZWN0IGlzIGRlc3Ryb3llZC4gIElmIFx2YXJ7b2Zmc2V0fSBhbmQKLSAgXHZhcntzaXplfSBhcmUgc3BlY2lmaWVkLCBvbmx5IGNoYW5nZXMgdG8gdGhlIGdpdmVuIHJhbmdlIG9mIGJ5dGVzCi0gIHdpbGwgYmUgZmx1c2hlZCB0byBkaXNrOyBvdGhlcndpc2UsIHRoZSB3aG9sZSBleHRlbnQgb2YgdGhlIG1hcHBpbmcKLSAgaXMgZmx1c2hlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W21tYXBde21vdmV9e1x2YXJ7ZGVzdH0sIFx2YXJ7c3JjfSwgXHZhcntjb3VudH19Ci0gIENvcHkgdGhlIFx2YXJ7Y291bnR9IGJ5dGVzIHN0YXJ0aW5nIGF0IG9mZnNldCBcdmFye3NyY30gdG8gdGhlCi0gIGRlc3RpbmF0aW9uIGluZGV4IFx2YXJ7ZGVzdH0uICBJZiB0aGUgbW1hcCB3YXMgY3JlYXRlZCB3aXRoCi0gIFxjb25zdGFudHtBQ0NFU1NfUkVBRH0sIHRoZW4gY2FsbHMgdG8gbW92ZSB3aWxsIHRocm93IGEKLSAgXGV4Y2VwdGlvbntUeXBlRXJyb3J9IGV4Y2VwdGlvbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W21tYXBde3JlYWR9e1x2YXJ7bnVtfX0KLSAgUmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgdXAgdG8gXHZhcntudW19IGJ5dGVzIHN0YXJ0aW5nIGZyb20gdGhlCi0gIGN1cnJlbnQgZmlsZSBwb3NpdGlvbjsgdGhlIGZpbGUgcG9zaXRpb24gaXMgdXBkYXRlZCB0byBwb2ludCBhZnRlciB0aGUKLSAgYnl0ZXMgdGhhdCB3ZXJlIHJldHVybmVkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bbW1hcF17cmVhZF9ieXRlfXt9Ci0gIFJldHVybnMgYSBzdHJpbmcgb2YgbGVuZ3RoIDEgY29udGFpbmluZyB0aGUgY2hhcmFjdGVyIGF0IHRoZSBjdXJyZW50Ci0gIGZpbGUgcG9zaXRpb24sIGFuZCBhZHZhbmNlcyB0aGUgZmlsZSBwb3NpdGlvbiBieSAxLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bbW1hcF17cmVhZGxpbmV9e30KLSAgUmV0dXJucyBhIHNpbmdsZSBsaW5lLCBzdGFydGluZyBhdCB0aGUgY3VycmVudCBmaWxlIHBvc2l0aW9uIGFuZCB1cCB0bwotICB0aGUgbmV4dCBuZXdsaW5lLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bbW1hcF17cmVzaXplfXtcdmFye25ld3NpemV9fQotICBSZXNpemVzIHRoZSBtYXAgYW5kIHRoZSB1bmRlcmx5aW5nIGZpbGUsIGlmIGFueS4KLSAgSWYgdGhlIG1tYXAgd2FzIGNyZWF0ZWQgd2l0aCBcY29uc3RhbnR7QUNDRVNTX1JFQUR9IG9yCi0gIFxjb25zdGFudHtBQ0NFU1NfQ09QWX0sIHJlc2l6aW5nIHRoZSBtYXAgd2lsbCB0aHJvdyBhIFxleGNlcHRpb257VHlwZUVycm9yfSBleGNlcHRpb24uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVttbWFwXXtzZWVrfXtwb3Ncb3B0aW9uYWx7LCB3aGVuY2V9fQotICBTZXQgdGhlIGZpbGUncyBjdXJyZW50IHBvc2l0aW9uLiAgXHZhcnt3aGVuY2V9IGFyZ3VtZW50IGlzIG9wdGlvbmFsCi0gIGFuZCBkZWZhdWx0cyB0byBcY29kZXtvcy5TRUVLX1NFVH0gb3IgXGNvZGV7MH0gKGFic29sdXRlIGZpbGUKLSAgcG9zaXRpb25pbmcpOyBvdGhlciB2YWx1ZXMgYXJlIFxjb2Rle29zLlNFRUtfQ1VSfSBvciBcY29kZXsxfSAoc2VlawotICByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBwb3NpdGlvbikgYW5kIFxjb2Rle29zLlNFRUtfRU5EfSBvciBcY29kZXsyfQotICAoc2VlayByZWxhdGl2ZSB0byB0aGUgZmlsZSdzIGVuZCkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVttbWFwXXtzaXplfXt9Ci0gIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBmaWxlLCB3aGljaCBjYW4gYmUgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb2YKLSAgdGhlIG1lbW9yeS1tYXBwZWQgYXJlYS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W21tYXBde3RlbGx9e30KLSAgUmV0dXJucyB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgZmlsZSBwb2ludGVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bbW1hcF17d3JpdGV9e1x2YXJ7c3RyaW5nfX0KLSAgV3JpdGUgdGhlIGJ5dGVzIGluIFx2YXJ7c3RyaW5nfSBpbnRvIG1lbW9yeSBhdCB0aGUgY3VycmVudCBwb3NpdGlvbgotICBvZiB0aGUgZmlsZSBwb2ludGVyOyB0aGUgZmlsZSBwb3NpdGlvbiBpcyB1cGRhdGVkIHRvIHBvaW50IGFmdGVyIHRoZQotICBieXRlcyB0aGF0IHdlcmUgd3JpdHRlbi4gSWYgdGhlIG1tYXAgd2FzIGNyZWF0ZWQgd2l0aAotICBcY29uc3RhbnR7QUNDRVNTX1JFQUR9LCB0aGVuIHdyaXRpbmcgdG8gaXQgd2lsbCB0aHJvdyBhCi0gIFxleGNlcHRpb257VHlwZUVycm9yfSBleGNlcHRpb24uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVttbWFwXXt3cml0ZV9ieXRlfXtcdmFye2J5dGV9fQotICBXcml0ZSB0aGUgc2luZ2xlLWNoYXJhY3RlciBzdHJpbmcgXHZhcntieXRlfSBpbnRvIG1lbW9yeSBhdCB0aGUKLSAgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgZmlsZSBwb2ludGVyOyB0aGUgZmlsZSBwb3NpdGlvbiBpcyBhZHZhbmNlZAotICBieSBcY29kZXsxfS4gSWYgdGhlIG1tYXAgd2FzIGNyZWF0ZWQgd2l0aCBcY29uc3RhbnR7QUNDRVNTX1JFQUR9LAotICB0aGVuIHdyaXRpbmcgdG8gaXQgd2lsbCB0aHJvdyBhIFxleGNlcHRpb257VHlwZUVycm9yfSBleGNlcHRpb24uCi1cZW5ke21ldGhvZGRlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYm1vZHVsZWZpbmRlci50ZXggYi9Eb2MvbGliL2xpYm1vZHVsZWZpbmRlci50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYjllOGUuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJtb2R1bGVmaW5kZXIudGV4CisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXttb2R1bGVmaW5kZXJ9IC0tLQotICAgICAgICAgRmluZCBtb2R1bGVzIHVzZWQgYnkgYSBzY3JpcHR9Ci1cc2VjdGlvbmF1dGhvcntBLk0uIEt1Y2hsaW5nfXthbWtAYW1rLmNhfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17bW9kdWxlZmluZGVyfQotXG1vZHVsZXN5bm9wc2lze0ZpbmQgbW9kdWxlcyB1c2VkIGJ5IGEgc2NyaXB0Ln0KLQotXHZlcnNpb25hZGRlZHsyLjN9Ci0KLVRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgXGNsYXNze01vZHVsZUZpbmRlcn0gY2xhc3MgdGhhdCBjYW4gYmUgdXNlZCB0bwotZGV0ZXJtaW5lIHRoZSBzZXQgb2YgbW9kdWxlcyBpbXBvcnRlZCBieSBhIHNjcmlwdC4KLVxjb2Rle21vZHVsZWZpbmRlci5weX0gY2FuIGFsc28gYmUgcnVuIGFzIGEgc2NyaXB0LCBnaXZpbmcgdGhlCi1maWxlbmFtZSBvZiBhIFB5dGhvbiBzY3JpcHQgYXMgaXRzIGFyZ3VtZW50LCBhZnRlciB3aGljaCBhIHJlcG9ydCBvZgotdGhlIGltcG9ydGVkIG1vZHVsZXMgd2lsbCBiZSBwcmludGVkLgotCi1cYmVnaW57ZnVuY2Rlc2N9e0FkZFBhY2thZ2VQYXRofXtwa2dfbmFtZSwgcGF0aH0KLVJlY29yZCB0aGF0IHRoZSBwYWNrYWdlIG5hbWVkIFx2YXJ7cGtnX25hbWV9IGNhbiBiZSBmb3VuZCBpbiB0aGUgc3BlY2lmaWVkIFx2YXJ7cGF0aH0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e1JlcGxhY2VQYWNrYWdlfXtvbGRuYW1lLCBuZXduYW1lfQotQWxsb3dzIHNwZWNpZnlpbmcgdGhhdCB0aGUgbW9kdWxlIG5hbWVkIFx2YXJ7b2xkbmFtZX0gaXMgaW4gZmFjdAotdGhlIHBhY2thZ2UgbmFtZWQgXHZhcntuZXduYW1lfS4gIFRoZSBtb3N0IGNvbW1vbiB1c2FnZSB3b3VsZCBiZSAKLXRvIGhhbmRsZSBob3cgdGhlIFxtb2R1bGV7X3htbHBsdXN9IHBhY2thZ2UgcmVwbGFjZXMgdGhlIFxtb2R1bGV7eG1sfQotcGFja2FnZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e01vZHVsZUZpbmRlcn17XG9wdGlvbmFse3BhdGg9Tm9uZSwgZGVidWc9MCwgZXhjbHVkZXM9W10sIHJlcGxhY2VfcGF0aHM9W119fQotCi1UaGlzIGNsYXNzIHByb3ZpZGVzIFxtZXRob2R7cnVuX3NjcmlwdCgpfSBhbmQgXG1ldGhvZHtyZXBvcnQoKX0KLW1ldGhvZHMgdG8gZGV0ZXJtaW5lIHRoZSBzZXQgb2YgbW9kdWxlcyBpbXBvcnRlZCBieSBhIHNjcmlwdC4KLVx2YXJ7cGF0aH0gY2FuIGJlIGEgbGlzdCBvZiBkaXJlY3RvcmllcyB0byBzZWFyY2ggZm9yIG1vZHVsZXM7IGlmIG5vdAotc3BlY2lmaWVkLCBcY29kZXtzeXMucGF0aH0gaXMgdXNlZC4gCi1cdmFye2RlYnVnfSBzZXRzIHRoZSBkZWJ1Z2dpbmcgbGV2ZWw7IGhpZ2hlciB2YWx1ZXMgbWFrZSB0aGUgY2xhc3MgcHJpbnQgCi1kZWJ1Z2dpbmcgbWVzc2FnZXMgYWJvdXQgd2hhdCBpdCdzIGRvaW5nLgotXHZhcntleGNsdWRlc30gaXMgYSBsaXN0IG9mIG1vZHVsZSBuYW1lcyB0byBleGNsdWRlIGZyb20gdGhlIGFuYWx5c2lzLgotXHZhcntyZXBsYWNlX3BhdGhzfSBpcyBhIGxpc3Qgb2YgXGNvZGV7KFx2YXJ7b2xkcGF0aH0sIFx2YXJ7bmV3cGF0aH0pfQotdHVwbGVzIHRoYXQgd2lsbCBiZSByZXBsYWNlZCBpbiBtb2R1bGUgcGF0aHMuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W01vZHVsZUZpbmRlcl17cmVwb3J0fXt9Ci1QcmludCBhIHJlcG9ydCB0byBzdGFuZGFyZCBvdXRwdXQgdGhhdCBsaXN0cyB0aGUgbW9kdWxlcyBpbXBvcnRlZCBieSB0aGUgc2NyaXB0Ci1hbmQgdGhlaXIKLXBhdGhzLCBhcyB3ZWxsIGFzIG1vZHVsZXMgdGhhdCBhcmUgbWlzc2luZyBvciBzZWVtIHRvIGJlIG1pc3NpbmcuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtNb2R1bGVGaW5kZXJde3J1bl9zY3JpcHR9e3BhdGhuYW1lfQotQW5hbHl6ZSB0aGUgY29udGVudHMgb2YgdGhlIFx2YXJ7cGF0aG5hbWV9IGZpbGUsIHdoaWNoIG11c3QgY29udGFpbiAKLVB5dGhvbiBjb2RlLgotXGVuZHttZXRob2RkZXNjfQotIAotCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYm1zaWxpYi50ZXggYi9Eb2MvbGliL2xpYm1zaWxpYi50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NTEwM2EuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJtc2lsaWIudGV4CisrKyAvZGV2L251bGwKQEAgLTEsNDg1ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7bXNpbGlifSAtLS0KLSAgICAgICAgIFJlYWQgYW5kIHdyaXRlIE1pY3Jvc29mdCBJbnN0YWxsZXIgZmlsZXN9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXttc2lsaWJ9Ci0gIFxwbGF0Zm9ybXtXaW5kb3dzfQotXG1vZHVsZXN5bm9wc2lze0NyZWF0aW9uIG9mIE1pY3Jvc29mdCBJbnN0YWxsZXIgZmlsZXMsIGFuZCBDQUIgZmlsZXMufQotXG1vZHVsZWF1dGhvcntNYXJ0aW4gdi4gTFwib3dpc317bWFydGluQHYubG9ld2lzLmRlfQotXHNlY3Rpb25hdXRob3J7TWFydGluIHYuIExcIm93aXN9e21hcnRpbkB2LmxvZXdpcy5kZX0KLQotXGluZGV4e21zaX0KLQotXHZlcnNpb25hZGRlZHsyLjV9Ci0KLVRoZSBcbW9kdWxle21zaWxpYn0gc3VwcG9ydHMgdGhlIGNyZWF0aW9uIG9mIE1pY3Jvc29mdCBJbnN0YWxsZXIKLShcY29kZXsubXNpfSkgZmlsZXMuICBCZWNhdXNlIHRoZXNlIGZpbGVzIG9mdGVuIGNvbnRhaW4gYW4gZW1iZWRkZWQKLWBgY2FiaW5ldCcnIGZpbGUgKFxjb2Rley5jYWJ9KSwgaXQgYWxzbyBleHBvc2VzIGFuIEFQSSB0byBjcmVhdGUKLUNBQiBmaWxlcy4gU3VwcG9ydCBmb3IgcmVhZGluZyBcY29kZXsuY2FifSBmaWxlcyBpcyBjdXJyZW50bHkgbm90Ci1pbXBsZW1lbnRlZDsgcmVhZCBzdXBwb3J0IGZvciB0aGUgXGNvZGV7Lm1zaX0gZGF0YWJhc2UgaXMgcG9zc2libGUuCi0KLVRoaXMgcGFja2FnZSBhaW1zIHRvIHByb3ZpZGUgY29tcGxldGUgYWNjZXNzIHRvIGFsbCB0YWJsZXMgaW4gYW4KLVxjb2Rley5tc2l9IGZpbGUsIHRoZXJlZm9yZSwgaXQgaXMgYSBmYWlybHkgbG93LWxldmVsIEFQSS4gVHdvCi1wcmltYXJ5IGFwcGxpY2F0aW9ucyBvZiB0aGlzIHBhY2thZ2UgYXJlIHRoZSBcbW9kdWxle2Rpc3R1dGlsc30KLWNvbW1hbmQgXGNvZGV7YmRpc3RfbXNpfSwgYW5kIHRoZSBjcmVhdGlvbiBvZiBQeXRob24gaW5zdGFsbGVyCi1wYWNrYWdlIGl0c2VsZiAoYWx0aG91Z2ggdGhhdCBjdXJyZW50bHkgdXNlcyBhIGRpZmZlcmVudCB2ZXJzaW9uCi1vZiBcY29kZXttc2lsaWJ9KS4KLQotVGhlIHBhY2thZ2UgY29udGVudHMgY2FuIGJlIHJvdWdobHkgc3BsaXQgaW50byBmb3VyIHBhcnRzOgotbG93LWxldmVsIENBQiByb3V0aW5lcywgbG93LWxldmVsIE1TSSByb3V0aW5lcywgaGlnaGVyLWxldmVsCi1NU0kgcm91dGluZXMsIGFuZCBzdGFuZGFyZCB0YWJsZSBzdHJ1Y3R1cmVzLgotCi1cYmVnaW57ZnVuY2Rlc2N9e0ZDSUNyZWF0ZX17Y2FibmFtZSwgZmlsZXN9Ci0gIENyZWF0ZSBhIG5ldyBDQUIgZmlsZSBuYW1lZCBcdmFye2NhYm5hbWV9LiBcdmFye2ZpbGVzfSBtdXN0Ci0gIGJlIGEgbGlzdCBvZiB0dXBsZXMsIGVhY2ggY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgZmlsZSBvbgotICBkaXNrLCBhbmQgdGhlIG5hbWUgb2YgdGhlIGZpbGUgaW5zaWRlIHRoZSBDQUIgZmlsZS4KLQotICBUaGUgZmlsZXMgYXJlIGFkZGVkIHRvIHRoZSBDQUIgZmlsZSBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIKLSAgaW4gdGhlIGxpc3QuIEFsbCBmaWxlcyBhcmUgYWRkZWQgaW50byBhIHNpbmdsZSBDQUIgZmlsZSwKLSAgdXNpbmcgdGhlIE1TWklQIGNvbXByZXNzaW9uIGFsZ29yaXRobS4KLQotICBDYWxsYmFja3MgdG8gUHl0aG9uIGZvciB0aGUgdmFyaW91cyBzdGVwcyBvZiBNU0kgY3JlYXRpb24KLSAgYXJlIGN1cnJlbnRseSBub3QgZXhwb3NlZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317VVVJRENyZWF0ZX17fQotICBSZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG5ldyB1bmlxdWUgaWRlbnRpZmllci4KLSAgVGhpcyB3cmFwcyB0aGUgV2luZG93cyBBUEkgZnVuY3Rpb25zIFxjZnVuY3Rpb257VXVpZENyZWF0ZX0gYW5kCi0gIFxjZnVuY3Rpb257VXVpZFRvU3RyaW5nfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317T3BlbkRhdGFiYXNlfXtwYXRoLCBwZXJzaXN0fQotICBSZXR1cm4gYSBuZXcgZGF0YWJhc2Ugb2JqZWN0IGJ5IGNhbGxpbmcgTXNpT3BlbkRhdGFiYXNlLiAgCi0gIFx2YXJ7cGF0aH0gaXMgdGhlIGZpbGUgbmFtZSBvZiB0aGUKLSAgTVNJIGZpbGU7IFx2YXJ7cGVyc2lzdH0gY2FuIGJlIG9uZSBvZiB0aGUgY29uc3RhbnRzIAotICBcY29kZXtNU0lEQk9QRU5fQ1JFQVRFRElSRUNUfSwgXGNvZGV7TVNJREJPUEVOX0NSRUFURX0sCi0gIFxjb2Rle01TSURCT1BFTl9ESVJFQ1R9LCBcY29kZXtNU0lEQk9QRU5fUkVBRE9OTFl9LCBvcgotICBcY29kZXtNU0lEQk9QRU5fVFJBTlNBQ1R9LCBhbmQgbWF5IGluY2x1ZGUgdGhlIGZsYWcKLSAgXGNvZGV7TVNJREJPUEVOX1BBVENIRklMRX0uIFNlZSB0aGUgTWljcm9zb2Z0IGRvY3VtZW50YXRpb24gZm9yCi0gIHRoZSBtZWFuaW5nIG9mIHRoZXNlIGZsYWdzOyBkZXBlbmRpbmcgb24gdGhlIGZsYWdzLAotICBhbiBleGlzdGluZyBkYXRhYmFzZSBpcyBvcGVuZWQsIG9yIGEgbmV3IG9uZSBjcmVhdGVkLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtDcmVhdGVSZWNvcmR9e2NvdW50fQotICBSZXR1cm4gYSBuZXcgcmVjb3JkIG9iamVjdCBieSBjYWxsaW5nIFxjZnVuY3Rpb257TVNJQ3JlYXRlUmVjb3JkfS4KLSAgXHZhcntjb3VudH0gaXMgdGhlIG51bWJlciBvZiBmaWVsZHMgb2YgdGhlIHJlY29yZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aW5pdF9kYXRhYmFzZX17bmFtZSwgc2NoZW1hLCBQcm9kdWN0TmFtZSwgUHJvZHVjdENvZGUsIFByb2R1Y3RWZXJzaW9uLCBNYW51ZmFjdHVyZXJ9Ci0gIENyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IGRhdGFiYXNlIFx2YXJ7bmFtZX0sIGluaXRpYWxpemUgaXQgCi0gIHdpdGggXHZhcntzY2hlbWF9LCAgYW5kIHNldCB0aGUgcHJvcGVydGllcyBcdmFye1Byb2R1Y3ROYW1lfSwKLSAgXHZhcntQcm9kdWN0Q29kZX0sIFx2YXJ7UHJvZHVjdFZlcnNpb259LCBhbmQgXHZhcntNYW51ZmFjdHVyZXJ9LgotCi0gIFx2YXJ7c2NoZW1hfSBtdXN0IGJlIGEgbW9kdWxlIG9iamVjdCBjb250YWluaW5nIFxjb2Rle3RhYmxlc30gYW5kCi0gIFxjb2Rle19WYWxpZGF0aW9uX3JlY29yZHN9IGF0dHJpYnV0ZXM7IHR5cGljYWxseSwKLSAgXG1vZHVsZXttc2lsaWIuc2NoZW1hfSBzaG91bGQgYmUgdXNlZC4KLQotICBUaGUgZGF0YWJhc2Ugd2lsbCBjb250YWluIGp1c3QgdGhlIHNjaGVtYSBhbmQgdGhlIHZhbGlkYXRpb24KLSAgcmVjb3JkcyB3aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317YWRkX2RhdGF9e2RhdGFiYXNlLCByZWNvcmRzfQotICBBZGQgYWxsIFx2YXJ7cmVjb3Jkc30gdG8gXHZhcntkYXRhYmFzZX0uICBcdmFye3JlY29yZHN9IHNob3VsZAotICBiZSBhIGxpc3Qgb2YgdHVwbGVzLCBlYWNoIG9uZSBjb250YWluaW5nIGFsbCBmaWVsZHMgb2YgYSByZWNvcmQKLSAgYWNjb3JkaW5nIHRvIHRoZSBzY2hlbWEgb2YgdGhlIHRhYmxlLiAgRm9yIG9wdGlvbmFsIGZpZWxkcywKLSAgXGNvZGV7Tm9uZX0gY2FuIGJlIHBhc3NlZC4KLQotICBGaWVsZCB2YWx1ZXMgY2FuIGJlIGludCBvciBsb25nIG51bWJlcnMsIHN0cmluZ3MsIG9yIGluc3RhbmNlcwotICBvZiB0aGUgQmluYXJ5IGNsYXNzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317QmluYXJ5fXtmaWxlbmFtZX0KLSAgUmVwcmVzZW50cyBlbnRyaWVzIGluIHRoZSBCaW5hcnkgdGFibGU7IGluc2VydGluZyBzdWNoCi0gIGFuIG9iamVjdCB1c2luZyBcZnVuY3Rpb257YWRkX2RhdGF9IHJlYWRzIHRoZSBmaWxlIG5hbWVkCi0gIFx2YXJ7ZmlsZW5hbWV9IGludG8gdGhlIHRhYmxlLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317YWRkX3RhYmxlc317ZGF0YWJhc2UsIG1vZHVsZX0KLSAgQWRkIGFsbCB0YWJsZSBjb250ZW50IGZyb20gXHZhcnttb2R1bGV9IHRvIFx2YXJ7ZGF0YWJhc2V9LgotICBcdmFye21vZHVsZX0gbXVzdCBjb250YWluIGFuIGF0dHJpYnV0ZSBcdmFye3RhYmxlc30KLSAgbGlzdGluZyBhbGwgdGFibGVzIGZvciB3aGljaCBjb250ZW50IHNob3VsZCBiZSBhZGRlZCwKLSAgYW5kIG9uZSBhdHRyaWJ1dGUgcGVyIHRhYmxlIHRoYXQgaGFzIHRoZSBhY3R1YWwgY29udGVudC4KLQotICBUaGlzIGlzIHR5cGljYWxseSB1c2VkIHRvIGluc3RhbGwgdGhlIHNlcXVlbmNlIHRhYmxlcy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317YWRkX3N0cmVhbX17ZGF0YWJhc2UsIG5hbWUsIHBhdGh9Ci0gIEFkZCB0aGUgZmlsZSBcdmFye3BhdGh9IGludG8gdGhlIFxjb2Rle19TdHJlYW19IHRhYmxlCi0gIG9mIFx2YXJ7ZGF0YWJhc2V9LCB3aXRoIHRoZSBzdHJlYW0gbmFtZSBcdmFye25hbWV9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZW5fdXVpZH17fQotICBSZXR1cm4gYSBuZXcgVVVJRCwgaW4gdGhlIGZvcm1hdCB0aGF0IE1TSSB0eXBpY2FsbHkKLSAgcmVxdWlyZXMgKGkuZS4gaW4gY3VybHkgYnJhY2VzLCBhbmQgd2l0aCBhbGwgaGV4ZGlnaXRzCi0gIGluIHVwcGVyLWNhc2UpLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWV0aXRsZVtodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvZGVmYXVsdC5hc3A/dXJsPS9saWJyYXJ5L2VuLXVzL2Rldm5vdGVzL3dpbnByb2cvZmNpY3JlYXRlLmFzcF17RkNJQ3JlYXRlRmlsZX17fQotICBcc2VldGl0bGVbaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2RlZmF1bHQuYXNwP3VybD0vbGlicmFyeS9lbi11cy9ycGMvcnBjL3V1aWRjcmVhdGUuYXNwXXtVdWlkQ3JlYXRlfXt9Ci0gIFxzZWV0aXRsZVtodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvZGVmYXVsdC5hc3A/dXJsPS9saWJyYXJ5L2VuLXVzL3JwYy9ycGMvdXVpZHRvc3RyaW5nLmFzcF17VXVpZFRvU3RyaW5nfXt9Ci1cZW5ke3NlZWFsc299Ci0KLVxzdWJzZWN0aW9ue0RhdGFiYXNlIE9iamVjdHNcbGFiZWx7ZGF0YWJhc2Utb2JqZWN0c319Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtEYXRhYmFzZV17T3BlblZpZXd9e3NxbH0KLSAgUmV0dXJuIGEgdmlldyBvYmplY3QsIGJ5IGNhbGxpbmcgXGNmdW5jdGlvbntNU0lEYXRhYmFzZU9wZW5WaWV3fS4KLSAgXHZhcntzcWx9IGlzIHRoZSBTUUwgc3RhdGVtZW50IHRvIGV4ZWN1dGUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtEYXRhYmFzZV17Q29tbWl0fXt9Ci0gIENvbW1pdCB0aGUgY2hhbmdlcyBwZW5kaW5nIGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLAotICBieSBjYWxsaW5nIFxjZnVuY3Rpb257TVNJRGF0YWJhc2VDb21taXR9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRGF0YWJhc2Vde0dldFN1bW1hcnlJbmZvcm1hdGlvbn17Y291bnR9Ci0gIFJldHVybiBhIG5ldyBzdW1tYXJ5IGluZm9ybWF0aW9uIG9iamVjdCwgYnkgY2FsbGluZwotICBcY2Z1bmN0aW9ue01zaUdldFN1bW1hcnlJbmZvcm1hdGlvbn0uICBcdmFye2NvdW50fSBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YKLSAgdXBkYXRlZCB2YWx1ZXMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbntzZWVhbHNvfQotICBcc2VldGl0bGVbaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2RlZmF1bHQuYXNwP3VybD0vbGlicmFyeS9lbi11cy9tc2kvc2V0dXAvbXNpb3BlbnZpZXcuYXNwXXtNU0lPcGVuVmlld317fQotICBcc2VldGl0bGVbaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2RlZmF1bHQuYXNwP3VybD0vbGlicmFyeS9lbi11cy9tc2kvc2V0dXAvbXNpZGF0YWJhc2Vjb21taXQuYXNwXXtNU0lEYXRhYmFzZUNvbW1pdH17fQotICBcc2VldGl0bGVbaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2RlZmF1bHQuYXNwP3VybD0vbGlicmFyeS9lbi11cy9tc2kvc2V0dXAvbXNpZ2V0c3VtbWFyeWluZm9ybWF0aW9uLmFzcF17TVNJR2V0U3VtbWFyeUluZm9ybWF0aW9ufXt9Ci1cZW5ke3NlZWFsc299Ci0KLVxzdWJzZWN0aW9ue1ZpZXcgT2JqZWN0c1xsYWJlbHt2aWV3LW9iamVjdHN9fQotCi1cYmVnaW57bWV0aG9kZGVzY31bVmlld117RXhlY3V0ZX17XG9wdGlvbmFse3BhcmFtcz1Ob25lfX0KLSAgRXhlY3V0ZSB0aGUgU1FMIHF1ZXJ5IG9mIHRoZSB2aWV3LCB0aHJvdWdoIFxjZnVuY3Rpb257TVNJVmlld0V4ZWN1dGV9LgotICBcdmFye3BhcmFtc30gaXMgYW4gb3B0aW9uYWwgcmVjb3JkIGRlc2NyaWJpbmcgYWN0dWFsIHZhbHVlcwotICBvZiB0aGUgcGFyYW1ldGVyIHRva2VucyBpbiB0aGUgcXVlcnkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtWaWV3XXtHZXRDb2x1bW5JbmZvfXtraW5kfQotICBSZXR1cm4gYSByZWNvcmQgZGVzY3JpYmluZyB0aGUgY29sdW1ucyBvZiB0aGUgdmlldywgdGhyb3VnaAotICBjYWxsaW5nIFxjZnVuY3Rpb257TXNpVmlld0dldENvbHVtbkluZm99LiBcdmFye2tpbmR9IGNhbiBiZSBlaXRoZXIKLSAgXGNvZGV7TVNJQ09MSU5GT19OQU1FU30gb3IgXGNvZGV7TVNJQ09MSU5GT19UWVBFU30uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtWaWV3XXtGZXRjaH17fQotICBSZXR1cm4gYSByZXN1bHQgcmVjb3JkIG9mIHRoZSBxdWVyeSwgdGhyb3VnaCBjYWxsaW5nCi0gIFxjZnVuY3Rpb257TXNpVmlld0ZldGNofS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1ZpZXdde01vZGlmeX17a2luZCwgZGF0YX0KLSAgTW9kaWZ5IHRoZSB2aWV3LCBieSBjYWxsaW5nIFxjZnVuY3Rpb257TXNpVmlld01vZGlmeX0uIFx2YXJ7a2luZH0KLSAgY2FuIGJlIG9uZSBvZiAgXGNvZGV7TVNJTU9ESUZZX1NFRUt9LCBcY29kZXtNU0lNT0RJRllfUkVGUkVTSH0sCi0gIFxjb2Rle01TSU1PRElGWV9JTlNFUlR9LCBcY29kZXtNU0lNT0RJRllfVVBEQVRFfSwgXGNvZGV7TVNJTU9ESUZZX0FTU0lHTn0sCi0gIFxjb2Rle01TSU1PRElGWV9SRVBMQUNFfSwgXGNvZGV7TVNJTU9ESUZZX01FUkdFfSwgXGNvZGV7TVNJTU9ESUZZX0RFTEVURX0sCi0gIFxjb2Rle01TSU1PRElGWV9JTlNFUlRfVEVNUE9SQVJZfSwgXGNvZGV7TVNJTU9ESUZZX1ZBTElEQVRFfSwKLSAgXGNvZGV7TVNJTU9ESUZZX1ZBTElEQVRFX05FV30sIFxjb2Rle01TSU1PRElGWV9WQUxJREFURV9GSUVMRH0sIG9yCi0gIFxjb2Rle01TSU1PRElGWV9WQUxJREFURV9ERUxFVEV9LgotCi0gIFx2YXJ7ZGF0YX0gbXVzdCBiZSBhIHJlY29yZCBkZXNjcmliaW5nIHRoZSBuZXcgZGF0YS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1ZpZXdde0Nsb3NlfXt9Ci0gIENsb3NlIHRoZSB2aWV3LCB0aHJvdWdoIFxjZnVuY3Rpb257TXNpVmlld0Nsb3NlfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWV0aXRsZVtodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvZGVmYXVsdC5hc3A/dXJsPS9saWJyYXJ5L2VuLXVzL21zaS9zZXR1cC9tc2l2aWV3ZXhlY3V0ZS5hc3Bde01zaVZpZXdFeGVjdXRlfXt9Ci0gIFxzZWV0aXRsZVtodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvZGVmYXVsdC5hc3A/dXJsPS9saWJyYXJ5L2VuLXVzL21zaS9zZXR1cC9tc2l2aWV3Z2V0Y29sdW1uaW5mby5hc3Bde01TSVZpZXdHZXRDb2x1bW5JbmZvfXt9Ci0gIFxzZWV0aXRsZVtodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvZGVmYXVsdC5hc3A/dXJsPS9saWJyYXJ5L2VuLXVzL21zaS9zZXR1cC9tc2l2aWV3ZmV0Y2guYXNwXXtNc2lWaWV3RmV0Y2h9e30KLSAgXHNlZXRpdGxlW2h0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9kZWZhdWx0LmFzcD91cmw9L2xpYnJhcnkvZW4tdXMvbXNpL3NldHVwL21zaXZpZXdtb2RpZnkuYXNwXXtNc2lWaWV3TW9kaWZ5fXt9Ci0gIFxzZWV0aXRsZVtodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvZGVmYXVsdC5hc3A/dXJsPS9saWJyYXJ5L2VuLXVzL21zaS9zZXR1cC9tc2l2aWV3Y2xvc2UuYXNwXXtNc2lWaWV3Q2xvc2V9e30KLVxlbmR7c2VlYWxzb30KLQotXHN1YnNlY3Rpb257U3VtbWFyeSBJbmZvcm1hdGlvbiBPYmplY3RzXGxhYmVse3N1bW1hcnktb2JqZWN0c319Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtTdW1tYXJ5SW5mb3JtYXRpb25de0dldFByb3BlcnR5fXtmaWVsZH0KLSAgUmV0dXJuIGEgcHJvcGVydHkgb2YgdGhlIHN1bW1hcnksIHRocm91Z2ggXGNmdW5jdGlvbntNc2lTdW1tYXJ5SW5mb0dldFByb3BlcnR5fS4KLSAgXHZhcntmaWVsZH0gaXMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LCBhbmQgY2FuIGJlIG9uZSBvZiB0aGUKLSAgY29uc3RhbnRzCi0gIFxjb2Rle1BJRF9DT0RFUEFHRX0sIFxjb2Rle1BJRF9USVRMRX0sIFxjb2Rle1BJRF9TVUJKRUNUfSwKLSAgXGNvZGV7UElEX0FVVEhPUn0sIFxjb2Rle1BJRF9LRVlXT1JEU30sIFxjb2Rle1BJRF9DT01NRU5UU30sCi0gIFxjb2Rle1BJRF9URU1QTEFURX0sIFxjb2Rle1BJRF9MQVNUQVVUSE9SfSwgXGNvZGV7UElEX1JFVk5VTUJFUn0sCi0gIFxjb2Rle1BJRF9MQVNUUFJJTlRFRH0sIFxjb2Rle1BJRF9DUkVBVEVfRFRNfSwgXGNvZGV7UElEX0xBU1RTQVZFX0RUTX0sCi0gIFxjb2Rle1BJRF9QQUdFQ09VTlR9LCBcY29kZXtQSURfV09SRENPVU5UfSwgXGNvZGV7UElEX0NIQVJDT1VOVH0sCi0gIFxjb2Rle1BJRF9BUFBOQU1FfSwgb3IgXGNvZGV7UElEX1NFQ1VSSVRZfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1N1bW1hcnlJbmZvcm1hdGlvbl17R2V0UHJvcGVydHlDb3VudH17fQotICBSZXR1cm4gdGhlIG51bWJlciBvZiBzdW1tYXJ5IHByb3BlcnRpZXMsIHRocm91Z2gKLSAgXGNmdW5jdGlvbntNc2lTdW1tYXJ5SW5mb0dldFByb3BlcnR5Q291bnR9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bU3VtbWFyeUluZm9ybWF0aW9uXXtTZXRQcm9wZXJ0eX17ZmllbGQsIHZhbHVlfQotICBTZXQgYSBwcm9wZXJ0eSB0aHJvdWdoIFxjZnVuY3Rpb257TXNpU3VtbWFyeUluZm9TZXRQcm9wZXJ0eX0uIFx2YXJ7ZmllbGR9Ci0gIGNhbiBoYXZlIHRoZSBzYW1lIHZhbHVlcyBhcyBpbiBcbWV0aG9ke0dldFByb3BlcnR5fSwgXHZhcnt2YWx1ZX0KLSAgaXMgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuIFBvc3NpYmxlIHZhbHVlIHR5cGVzIGFyZSBpbnRlZ2VyCi0gIGFuZCBzdHJpbmcuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtTdW1tYXJ5SW5mb3JtYXRpb25de1BlcnNpc3R9e30KLSAgV3JpdGUgdGhlIG1vZGlmaWVkIHByb3BlcnRpZXMgdG8gdGhlIHN1bW1hcnkgaW5mb3JtYXRpb24gc3RyZWFtLAotICB1c2luZyBcY2Z1bmN0aW9ue01zaVN1bW1hcnlJbmZvUGVyc2lzdH0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbntzZWVhbHNvfQotICBcc2VldGl0bGVbaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2RlZmF1bHQuYXNwP3VybD0vbGlicmFyeS9lbi11cy9tc2kvc2V0dXAvbXNpc3VtbWFyeWluZm9nZXRwcm9wZXJ0eS5hc3Bde01zaVN1bW1hcnlJbmZvR2V0UHJvcGVydHl9e30KLSAgXHNlZXRpdGxlW2h0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9kZWZhdWx0LmFzcD91cmw9L2xpYnJhcnkvZW4tdXMvbXNpL3NldHVwL21zaXN1bW1hcnlpbmZvZ2V0cHJvcGVydHljb3VudC5hc3Bde01zaVN1bW1hcnlJbmZvR2V0UHJvcGVydHlDb3VudH17fQotICBcc2VldGl0bGVbaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2RlZmF1bHQuYXNwP3VybD0vbGlicmFyeS9lbi11cy9tc2kvc2V0dXAvbXNpc3VtbWFyeWluZm9zZXRwcm9wZXJ0eS5hc3Bde01zaVN1bW1hcnlJbmZvU2V0UHJvcGVydHl9e30KLSAgXHNlZXRpdGxlW2h0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9kZWZhdWx0LmFzcD91cmw9L2xpYnJhcnkvZW4tdXMvbXNpL3NldHVwL21zaXN1bW1hcnlpbmZvcGVyc2lzdC5hc3Bde01zaVN1bW1hcnlJbmZvUGVyc2lzdH17fQotXGVuZHtzZWVhbHNvfQotCi1cc3Vic2VjdGlvbntSZWNvcmQgT2JqZWN0c1xsYWJlbHtyZWNvcmQtb2JqZWN0c319Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtSZWNvcmRde0dldEZpZWxkQ291bnR9e30KLSAgUmV0dXJuIHRoZSBudW1iZXIgb2YgZmllbGRzIG9mIHRoZSByZWNvcmQsIHRocm91Z2ggXGNmdW5jdGlvbntNc2lSZWNvcmRHZXRGaWVsZENvdW50fS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1JlY29yZF17U2V0U3RyaW5nfXtmaWVsZCwgdmFsdWV9Ci0gIFNldCBcdmFye2ZpZWxkfSB0byBcdmFye3ZhbHVlfSB0aHJvdWdoIFxjZnVuY3Rpb257TXNpUmVjb3JkU2V0U3RyaW5nfS4KLSAgXHZhcntmaWVsZH0gbXVzdCBiZSBhbiBpbnRlZ2VyOyBcdmFye3ZhbHVlfSBhIHN0cmluZy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1JlY29yZF17U2V0U3RyZWFtfXtmaWVsZCwgdmFsdWV9Ci0gIFNldCBcdmFye2ZpZWxkfSB0byB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgbmFtZWQgXHZhcnt2YWx1ZX0sCi0gIHRocm91Z2ggXGNmdW5jdGlvbntNc2lSZWNvcmRTZXRTdHJlYW19LgotICBcdmFye2ZpZWxkfSBtdXN0IGJlIGFuIGludGVnZXI7IFx2YXJ7dmFsdWV9IGEgc3RyaW5nLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUmVjb3JkXXtTZXRJbnRlZ2VyfXtmaWVsZCwgdmFsdWV9Ci0gIFNldCBcdmFye2ZpZWxkfSB0byBcdmFye3ZhbHVlfSB0aHJvdWdoIFxjZnVuY3Rpb257TXNpUmVjb3JkU2V0SW50ZWdlcn0uCi0gIEJvdGggXHZhcntmaWVsZH0gYW5kIFx2YXJ7dmFsdWV9IG11c3QgYmUgYW4gaW50ZWdlci4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1JlY29yZF17Q2xlYXJEYXRhfXt9Ci0gIFNldCBhbGwgZmllbGRzIG9mIHRoZSByZWNvcmQgdG8gMCwgdGhyb3VnaCBcY2Z1bmN0aW9ue01zaVJlY29yZENsZWFyRGF0YX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbntzZWVhbHNvfQotICBcc2VldGl0bGVbaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2RlZmF1bHQuYXNwP3VybD0vbGlicmFyeS9lbi11cy9tc2kvc2V0dXAvbXNpcmVjb3JkZ2V0ZmllbGRjb3VudC5hc3Bde01zaVJlY29yZEdldEZpZWxkQ291bnR9e30KLSAgXHNlZXRpdGxlW2h0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9kZWZhdWx0LmFzcD91cmw9L2xpYnJhcnkvZW4tdXMvbXNpL3NldHVwL21zaXJlY29yZHNldHN0cmluZy5hc3Bde01zaVJlY29yZFNldFN0cmluZ317fQotICBcc2VldGl0bGVbaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2RlZmF1bHQuYXNwP3VybD0vbGlicmFyeS9lbi11cy9tc2kvc2V0dXAvbXNpcmVjb3Jkc2V0c3RyZWFtLmFzcF17TXNpUmVjb3JkU2V0U3RyZWFtfXt9Ci0gIFxzZWV0aXRsZVtodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvZGVmYXVsdC5hc3A/dXJsPS9saWJyYXJ5L2VuLXVzL21zaS9zZXR1cC9tc2lyZWNvcmRzZXRpbnRlZ2VyLmFzcF17TXNpUmVjb3JkU2V0SW50ZWdlcn17fQotICBcc2VldGl0bGVbaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2RlZmF1bHQuYXNwP3VybD0vbGlicmFyeS9lbi11cy9tc2kvc2V0dXAvbXNpcmVjb3JkY2xlYXIuYXNwXXtNc2lSZWNvcmRDbGVhcn17fQotXGVuZHtzZWVhbHNvfQotCi1cc3Vic2VjdGlvbntFcnJvcnNcbGFiZWx7bXNpLWVycm9yc319Ci0KLUFsbCB3cmFwcGVycyBhcm91bmQgTVNJIGZ1bmN0aW9ucyByYWlzZSBcZXhjZXB0aW9ue01zaUVycm9yfTsKLXRoZSBzdHJpbmcgaW5zaWRlIHRoZSBleGNlcHRpb24gd2lsbCBjb250YWluIG1vcmUgZGV0YWlsLgotCi1cc3Vic2VjdGlvbntDQUIgT2JqZWN0c1xsYWJlbHtjYWJ9fQotCi1cYmVnaW57Y2xhc3NkZXNjfXtDQUJ9e25hbWV9Ci0gIFRoZSBjbGFzcyBcY2xhc3N7Q0FCfSByZXByZXNlbnRzIGEgQ0FCIGZpbGUuIER1cmluZyBNU0kgY29uc3RydWN0aW9uLAotICBmaWxlcyB3aWxsIGJlIGFkZGVkIHNpbXVsdGFuZW91c2x5IHRvIHRoZSBcY29kZXtGaWxlc30gdGFibGUsIGFuZAotICB0byBhIENBQiBmaWxlLiBUaGVuLCB3aGVuIGFsbCBmaWxlcyBoYXZlIGJlZW4gYWRkZWQsIHRoZSBDQUIgZmlsZQotICBjYW4gYmUgd3JpdHRlbiwgdGhlbiBhZGRlZCB0byB0aGUgTVNJIGZpbGUuCi0KLSAgXHZhcntuYW1lfSBpcyB0aGUgbmFtZSBvZiB0aGUgQ0FCIGZpbGUgaW4gdGhlIE1TSSBmaWxlLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDQUJde2FwcGVuZH17ZnVsbCwgZmlsZSwgbG9naWNhbH0KLSAgQWRkIHRoZSBmaWxlIHdpdGggdGhlIHBhdGhuYW1lIFx2YXJ7ZnVsbH0gdG8gdGhlIENBQiBmaWxlLAotICB1bmRlciB0aGUgbmFtZSBcdmFye2xvZ2ljYWx9LiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgZmlsZQotICBuYW1lZCBcdmFye2xvZ2ljYWx9LCBhIG5ldyBmaWxlIG5hbWUgaXMgY3JlYXRlZC4KLQotICBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaWxlIGluIHRoZSBDQUIgZmlsZSwgYW5kIHRoZQotICBuZXcgbmFtZSBvZiB0aGUgZmlsZSBpbnNpZGUgdGhlIENBQiBmaWxlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ0FCXXtjb21taXR9e2RhdGFiYXNlfQotICBHZW5lcmF0ZSBhIENBQiBmaWxlLCBhZGQgaXQgYXMgYSBzdHJlYW0gdG8gdGhlIE1TSSBmaWxlLAotICBwdXQgaXQgaW50byB0aGUgXGNvZGV7TWVkaWF9IHRhYmxlLCBhbmQgcmVtb3ZlIHRoZSBnZW5lcmF0ZWQKLSAgZmlsZSBmcm9tIHRoZSBkaXNrLgotXGVuZHttZXRob2RkZXNjfQotCi1cc3Vic2VjdGlvbntEaXJlY3RvcnkgT2JqZWN0c1xsYWJlbHttc2ktZGlyZWN0b3J5fX0KLQotXGJlZ2lue2NsYXNzZGVzY317RGlyZWN0b3J5fXtkYXRhYmFzZSwgY2FiLCBiYXNlZGlyLCBwaHlzaWNhbCwgCi0gICAgICAgICAgICAgICAgICBsb2dpY2FsLCBkZWZhdWx0LCBjb21wb25lbnQsIFxvcHRpb25hbHtjb21wb25lbnRmbGFnc319Ci0gIENyZWF0ZSBhIG5ldyBkaXJlY3RvcnkgaW4gdGhlIERpcmVjdG9yeSB0YWJsZS4gVGhlcmUgaXMgYSBjdXJyZW50Ci0gIGNvbXBvbmVudCBhdCBlYWNoIHBvaW50IGluIHRpbWUgZm9yIHRoZSBkaXJlY3RvcnksIHdoaWNoIGlzIGVpdGhlcgotICBleHBsaWNpdGx5IGNyZWF0ZWQgdGhyb3VnaCBcbWV0aG9ke3N0YXJ0X2NvbXBvbmVudH0sIG9yIGltcGxpY2l0bHkgd2hlbiBmaWxlcwotICBhcmUgYWRkZWQgZm9yIHRoZSBmaXJzdCB0aW1lLiBGaWxlcyBhcmUgYWRkZWQgaW50byB0aGUgY3VycmVudAotICBjb21wb25lbnQsIGFuZCBpbnRvIHRoZSBjYWIgZmlsZS4gIFRvIGNyZWF0ZSBhIGRpcmVjdG9yeSwgYSBiYXNlCi0gIGRpcmVjdG9yeSBvYmplY3QgbmVlZHMgdG8gYmUgc3BlY2lmaWVkIChjYW4gYmUgXGNvZGV7Tm9uZX0pLCB0aGUgcGF0aCB0bwotICB0aGUgcGh5c2ljYWwgZGlyZWN0b3J5LCBhbmQgYSBsb2dpY2FsIGRpcmVjdG9yeSBuYW1lLiAgXHZhcntkZWZhdWx0fQotICBzcGVjaWZpZXMgdGhlIERlZmF1bHREaXIgc2xvdCBpbiB0aGUgZGlyZWN0b3J5IHRhYmxlLiBcdmFye2NvbXBvbmVudGZsYWdzfQotICBzcGVjaWZpZXMgdGhlIGRlZmF1bHQgZmxhZ3MgdGhhdCBuZXcgY29tcG9uZW50cyBnZXQuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0RpcmVjdG9yeV17c3RhcnRfY29tcG9uZW50fXtcb3B0aW9uYWx7Y29tcG9uZW50XG9wdGlvbmFseywKLSAgICAgIGZlYXR1cmVcb3B0aW9uYWx7LCBmbGFnc1xvcHRpb25hbHssIGtleWZpbGVcb3B0aW9uYWx7LCB1dWlkfX19fX19Ci0gIEFkZCBhbiBlbnRyeSB0byB0aGUgQ29tcG9uZW50IHRhYmxlLCBhbmQgbWFrZSB0aGlzIGNvbXBvbmVudCB0aGUKLSAgY3VycmVudCBjb21wb25lbnQgZm9yIHRoaXMgZGlyZWN0b3J5LiBJZiBubyBjb21wb25lbnQgbmFtZSBpcyBnaXZlbiwgdGhlCi0gIGRpcmVjdG9yeSBuYW1lIGlzIHVzZWQuIElmIG5vIFx2YXJ7ZmVhdHVyZX0gaXMgZ2l2ZW4sIHRoZSBjdXJyZW50IGZlYXR1cmUKLSAgaXMgdXNlZC4gSWYgbm8gXHZhcntmbGFnc30gYXJlIGdpdmVuLCB0aGUgZGlyZWN0b3J5J3MgZGVmYXVsdCBmbGFncyBhcmUKLSAgdXNlZC4gSWYgbm8gXHZhcntrZXlmaWxlfSBpcyBnaXZlbiwgdGhlIEtleVBhdGggaXMgbGVmdCBudWxsIGluIHRoZQotICBDb21wb25lbnQgdGFibGUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtEaXJlY3Rvcnlde2FkZF9maWxlfXtmaWxlXG9wdGlvbmFseywgc3JjXG9wdGlvbmFseywKLSAgICAgIHZlcnNpb25cb3B0aW9uYWx7LCBsYW5ndWFnZX19fX0KLSAgQWRkIGEgZmlsZSB0byB0aGUgY3VycmVudCBjb21wb25lbnQgb2YgdGhlIGRpcmVjdG9yeSwgc3RhcnRpbmcgYSBuZXcKLSAgb25lIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgY29tcG9uZW50LiBCeSBkZWZhdWx0LCB0aGUgZmlsZSBuYW1lCi0gIGluIHRoZSBzb3VyY2UgYW5kIHRoZSBmaWxlIHRhYmxlIHdpbGwgYmUgaWRlbnRpY2FsLiBJZiB0aGUgXHZhcntzcmN9IGZpbGUKLSAgaXMgc3BlY2lmaWVkLCBpdCBpcyBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB0aGUgY3VycmVudAotICBkaXJlY3RvcnkuIE9wdGlvbmFsbHksIGEgXHZhcnt2ZXJzaW9ufSBhbmQgYSBcdmFye2xhbmd1YWdlfSBjYW4gYmUgc3BlY2lmaWVkIGZvcgotICB0aGUgZW50cnkgaW4gdGhlIEZpbGUgdGFibGUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtEaXJlY3Rvcnlde2dsb2J9e3BhdHRlcm5cb3B0aW9uYWx7LCBleGNsdWRlfX0KLSAgQWRkIGEgbGlzdCBvZiBmaWxlcyB0byB0aGUgY3VycmVudCBjb21wb25lbnQgYXMgc3BlY2lmaWVkIGluIHRoZSBnbG9iCi0gIHBhdHRlcm4uIEluZGl2aWR1YWwgZmlsZXMgY2FuIGJlIGV4Y2x1ZGVkIGluIHRoZSBcdmFye2V4Y2x1ZGV9IGxpc3QuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtEaXJlY3Rvcnlde3JlbW92ZV9weWN9e30KLSAgUmVtb3ZlIFxjb2Rley5weWN9L1xjb2Rley5weW99IGZpbGVzIG9uIHVuaW5zdGFsbC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWV0aXRsZVtodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvZW4tdXMvbXNpL3NldHVwL2RpcmVjdG9yeV90YWJsZS5hc3Bde0RpcmVjdG9yeSBUYWJsZX17fQotICBcc2VldGl0bGVbaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2VuLXVzL21zaS9zZXR1cC9maWxlX3RhYmxlLmFzcF17RmlsZSBUYWJsZX17fQotICBcc2VldGl0bGVbaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2VuLXVzL21zaS9zZXR1cC9jb21wb25lbnRfdGFibGUuYXNwXXtDb21wb25lbnQgVGFibGV9e30KLSAgXHNlZXRpdGxlW2h0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9lbi11cy9tc2kvc2V0dXAvZmVhdHVyZWNvbXBvbmVudHNfdGFibGUuYXNwXXtGZWF0dXJlQ29tcG9uZW50cyBUYWJsZX17fQotXGVuZHtzZWVhbHNvfQotCi0KLVxzdWJzZWN0aW9ue0ZlYXR1cmVzXGxhYmVse2ZlYXR1cmVzfX0KLQotXGJlZ2lue2NsYXNzZGVzY317RmVhdHVyZX17ZGF0YWJhc2UsIGlkLCB0aXRsZSwgZGVzYywgZGlzcGxheVxvcHRpb25hbHssCi0gICAgbGV2ZWw9MVxvcHRpb25hbHssIHBhcmVudFxvcHRpb25hbHssIGRpcmVjdG9yeVxvcHRpb25hbHssIAotICAgIGF0dHJpYnV0ZXM9MH19fX19Ci0KLSAgQWRkIGEgbmV3IHJlY29yZCB0byB0aGUgXGNvZGV7RmVhdHVyZX0gdGFibGUsIHVzaW5nIHRoZSB2YWx1ZXMKLSAgXHZhcntpZH0sIFx2YXJ7cGFyZW50LmlkfSwgXHZhcnt0aXRsZX0sIFx2YXJ7ZGVzY30sIFx2YXJ7ZGlzcGxheX0sCi0gIFx2YXJ7bGV2ZWx9LCBcdmFye2RpcmVjdG9yeX0sIGFuZCBcdmFye2F0dHJpYnV0ZXN9LiBUaGUgcmVzdWx0aW5nCi0gIGZlYXR1cmUgb2JqZWN0IGNhbiBiZSBwYXNzZWQgdG8gdGhlIFxtZXRob2R7c3RhcnRfY29tcG9uZW50fSBtZXRob2QKLSAgb2YgXGNsYXNze0RpcmVjdG9yeX0uCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0ZlYXR1cmVde3NldF9jdXJyZW50fXt9Ci0gIE1ha2UgdGhpcyBmZWF0dXJlIHRoZSBjdXJyZW50IGZlYXR1cmUgb2YgXG1vZHVsZXttc2lsaWJ9LgotICBOZXcgY29tcG9uZW50cyBhcmUgYXV0b21hdGljYWxseSBhZGRlZCB0byB0aGUgZGVmYXVsdCBmZWF0dXJlLAotICB1bmxlc3MgYSBmZWF0dXJlIGlzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZXRpdGxlW2h0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9lbi11cy9tc2kvc2V0dXAvZmVhdHVyZV90YWJsZS5hc3Bde0ZlYXR1cmUgVGFibGV9e30KLVxlbmR7c2VlYWxzb30KLQotXHN1YnNlY3Rpb257R1VJIGNsYXNzZXNcbGFiZWx7bXNpLWd1aX19Ci0KLVxtb2R1bGV7bXNpbGlifSBwcm92aWRlcyBzZXZlcmFsIGNsYXNzZXMgdGhhdCB3cmFwIHRoZSBHVUkgdGFibGVzIGluCi1hbiBNU0kgZGF0YWJhc2UuIEhvd2V2ZXIsIG5vIHN0YW5kYXJkIHVzZXIgaW50ZXJmYWNlIGlzIHByb3ZpZGVkOyB1c2UKLVxtb2R1bGV7YmRpc3RfbXNpfSB0byBjcmVhdGUgTVNJIGZpbGVzIHdpdGggYSB1c2VyLWludGVyZmFjZSBmb3IKLWluc3RhbGxpbmcgUHl0aG9uIHBhY2thZ2VzLgotCi1cYmVnaW57Y2xhc3NkZXNjfXtDb250cm9sfXtkbGcsIG5hbWV9Ci0gIEJhc2UgY2xhc3Mgb2YgdGhlIGRpYWxvZyBjb250cm9scy4gXHZhcntkbGd9IGlzIHRoZSBkaWFsb2cgb2JqZWN0Ci0gIHRoZSBjb250cm9sIGJlbG9uZ3MgdG8sIGFuZCBcdmFye25hbWV9IGlzIHRoZSBjb250cm9sJ3MgbmFtZS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29udHJvbF17ZXZlbnR9e2V2ZW50LCBhcmd1bWVudFxvcHRpb25hbHssIAotICAgY29uZGl0aW9uID0gYGAxJydcb3B0aW9uYWx7LCBvcmRlcmluZ319fQotCi0gIE1ha2UgYW4gZW50cnkgaW50byB0aGUgXGNvZGV7Q29udHJvbEV2ZW50fSB0YWJsZSBmb3IgdGhpcyBjb250cm9sLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29udHJvbF17bWFwcGluZ317ZXZlbnQsIGF0dHJpYnV0ZX0KLSAgTWFrZSBhbiBlbnRyeSBpbnRvIHRoZSBcY29kZXtFdmVudE1hcHBpbmd9IHRhYmxlIGZvciB0aGlzIGNvbnRyb2wuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb250cm9sXXtjb25kaXRpb259e2FjdGlvbiwgY29uZGl0aW9ufQotICBNYWtlIGFuIGVudHJ5IGludG8gdGhlIFxjb2Rle0NvbnRyb2xDb25kaXRpb259IHRhYmxlIGZvciB0aGlzIGNvbnRyb2wuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLQotXGJlZ2lue2NsYXNzZGVzY317UmFkaW9CdXR0b25Hcm91cH17ZGxnLCBuYW1lLCBwcm9wZXJ0eX0KLSAgQ3JlYXRlIGEgcmFkaW8gYnV0dG9uIGNvbnRyb2wgbmFtZWQgXHZhcntuYW1lfS4gXHZhcntwcm9wZXJ0eX0KLSAgaXMgdGhlIGluc3RhbGxlciBwcm9wZXJ0eSB0aGF0IGdldHMgc2V0IHdoZW4gYSByYWRpbyBidXR0b24KLSAgaXMgc2VsZWN0ZWQuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1JhZGlvQnV0dG9uR3JvdXBde2FkZH17bmFtZSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgdGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG9wdGlvbmFseywgdmFsdWV9fQotICBBZGQgYSByYWRpbyBidXR0b24gbmFtZWQgXHZhcntuYW1lfSB0byB0aGUgZ3JvdXAsIGF0IHRoZQotICBjb29yZGluYXRlcyBcdmFye3h9LCBcdmFye3l9LCBcdmFye3dpZHRofSwgXHZhcntoZWlnaHR9LCBhbmQKLSAgd2l0aCB0aGUgbGFiZWwgXHZhcnt0ZXh0fS4gSWYgXHZhcnt2YWx1ZX0gaXMgb21pdHRlZCwgaXQKLSAgZGVmYXVsdHMgdG8gXHZhcntuYW1lfS4KLVxlbmR7bWV0aG9kZGVzY30KLSAgICAgICAgICAgCi1cYmVnaW57Y2xhc3NkZXNjfXtEaWFsb2d9e2RiLCBuYW1lLCB4LCB5LCB3LCBoLCBhdHRyLCB0aXRsZSwgZmlyc3QsIAotICAgIGRlZmF1bHQsIGNhbmNlbH0KLSAgUmV0dXJuIGEgbmV3IFxjbGFzc3tEaWFsb2d9IG9iamVjdC4gQW4gZW50cnkgaW4gdGhlIFxjb2Rle0RpYWxvZ30gdGFibGUKLSAgaXMgbWFkZSwgd2l0aCB0aGUgc3BlY2lmaWVkIGNvb3JkaW5hdGVzLCBkaWFsb2cgYXR0cmlidXRlcywgdGl0bGUsCi0gIG5hbWUgb2YgdGhlIGZpcnN0LCBkZWZhdWx0LCBhbmQgY2FuY2VsIGNvbnRyb2xzLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtEaWFsb2dde2NvbnRyb2x9e25hbWUsIHR5cGUsIHgsIHksIHdpZHRoLCBoZWlnaHQsIAotICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcywgcHJvcGVydHksIHRleHQsIGNvbnRyb2xfbmV4dCwgaGVscH0KLSAgUmV0dXJuIGEgbmV3IFxjbGFzc3tDb250cm9sfSBvYmplY3QuIEFuIGVudHJ5IGluIHRoZSBcY29kZXtDb250cm9sfSB0YWJsZQotICBpcyBtYWRlIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgotCi0gIFRoaXMgaXMgYSBnZW5lcmljIG1ldGhvZDsgZm9yIHNwZWNpZmljIHR5cGVzLCBzcGVjaWFsaXplZCBtZXRob2RzCi0gIGFyZSBwcm92aWRlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cYmVnaW57bWV0aG9kZGVzY31bRGlhbG9nXXt0ZXh0fXtuYW1lLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBhdHRyaWJ1dGVzLCB0ZXh0fQotICBBZGQgYW5kIHJldHVybiBhIFxjb2Rle1RleHR9IGNvbnRyb2wuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtEaWFsb2dde2JpdG1hcH17bmFtZSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgdGV4dH0KLSAgQWRkIGFuZCByZXR1cm4gYSBcY29kZXtCaXRtYXB9IGNvbnRyb2wuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtEaWFsb2dde2xpbmV9e25hbWUsIHgsIHksIHdpZHRoLCBoZWlnaHR9Ci0gIEFkZCBhbmQgcmV0dXJuIGEgXGNvZGV7TGluZX0gY29udHJvbC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0RpYWxvZ117cHVzaGJ1dHRvbn17bmFtZSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgYXR0cmlidXRlcywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LCBuZXh0X2NvbnRyb2x9Ci0gIEFkZCBhbmQgcmV0dXJuIGEgXGNvZGV7UHVzaEJ1dHRvbn0gY29udHJvbC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0RpYWxvZ117cmFkaW9ncm91cH17bmFtZSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLCBwcm9wZXJ0eSwgdGV4dCwgbmV4dF9jb250cm9sfQotICBBZGQgYW5kIHJldHVybiBhIFxjb2Rle1JhZGlvQnV0dG9uR3JvdXB9IGNvbnRyb2wuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtEaWFsb2dde2NoZWNrYm94fXtuYW1lLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMsIHByb3BlcnR5LCB0ZXh0LCBuZXh0X2NvbnRyb2x9Ci0gIEFkZCBhbmQgcmV0dXJuIGEgXGNvZGV7Q2hlY2tCb3h9IGNvbnRyb2wuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbntzZWVhbHNvfQotICBcc2VldGl0bGVbaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2VuLXVzL21zaS9zZXR1cC9kaWFsb2dfdGFibGUuYXNwXXtEaWFsb2cgVGFibGV9e30KLSAgXHNlZXRpdGxlW2h0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9lbi11cy9tc2kvc2V0dXAvY29udHJvbF90YWJsZS5hc3Bde0NvbnRyb2wgVGFibGV9e30KLSAgXHNlZXRpdGxlW2h0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9lbi11cy9tc2kvc2V0dXAvY29udHJvbHMuYXNwXXtDb250cm9sIFR5cGVzfXt9Ci0gIFxzZWV0aXRsZVtodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvZW4tdXMvbXNpL3NldHVwL2NvbnRyb2xjb25kaXRpb25fdGFibGUuYXNwXXtDb250cm9sQ29uZGl0aW9uIFRhYmxlfXt9Ci0gIFxzZWV0aXRsZVtodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvZW4tdXMvbXNpL3NldHVwL2NvbnRyb2xldmVudF90YWJsZS5hc3Bde0NvbnRyb2xFdmVudCBUYWJsZX17fQotICBcc2VldGl0bGVbaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2VuLXVzL21zaS9zZXR1cC9ldmVudG1hcHBpbmdfdGFibGUuYXNwXXtFdmVudE1hcHBpbmcgVGFibGV9e30KLSAgXHNlZXRpdGxlW2h0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9lbi11cy9tc2kvc2V0dXAvcmFkaW9idXR0b25fdGFibGUuYXNwXXtSYWRpb0J1dHRvbiBUYWJsZX17fQotXGVuZHtzZWVhbHNvfQotCi1cc3Vic2VjdGlvbntQcmVjb21wdXRlZCB0YWJsZXNcbGFiZWx7bXNpLXRhYmxlc319Ci0KLVxtb2R1bGV7bXNpbGlifSBwcm92aWRlcyBhIGZldyBzdWJwYWNrYWdlcyB0aGF0IGNvbnRhaW4KLW9ubHkgc2NoZW1hIGFuZCB0YWJsZSBkZWZpbml0aW9ucy4gQ3VycmVudGx5LCB0aGVzZSBkZWZpbml0aW9ucwotYXJlIGJhc2VkIG9uIE1TSSB2ZXJzaW9uIDIuMC4KLQotXGJlZ2lue2RhdGFkZXNjfXtzY2hlbWF9Ci0gIFRoaXMgaXMgdGhlIHN0YW5kYXJkIE1TSSBzY2hlbWEgZm9yIE1TSSAyLjAsIHdpdGggdGhlCi0gIFx2YXJ7dGFibGVzfSB2YXJpYWJsZSBwcm92aWRpbmcgYSBsaXN0IG9mIHRhYmxlIGRlZmluaXRpb25zLAotICBhbmQgXHZhcntfVmFsaWRhdGlvbl9yZWNvcmRzfSBwcm92aWRpbmcgdGhlIGRhdGEgZm9yCi0gIE1TSSB2YWxpZGF0aW9uLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtzZXF1ZW5jZX0KLSAgVGhpcyBtb2R1bGUgY29udGFpbnMgdGFibGUgY29udGVudHMgZm9yIHRoZSBzdGFuZGFyZCBzZXF1ZW5jZQotICB0YWJsZXM6IFx2YXJ7QWRtaW5FeGVjdXRlU2VxdWVuY2V9LCBcdmFye0FkbWluVUlTZXF1ZW5jZX0sCi0gIFx2YXJ7QWR2dEV4ZWN1dGVTZXF1ZW5jZX0sIFx2YXJ7SW5zdGFsbEV4ZWN1dGVTZXF1ZW5jZX0sIGFuZAotICBcdmFye0luc3RhbGxVSVNlcXVlbmNlfS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317dGV4dH0KLSAgVGhpcyBtb2R1bGUgY29udGFpbnMgZGVmaW5pdGlvbnMgZm9yIHRoZSBVSVRleHQgYW5kIEFjdGlvblRleHQKLSAgdGFibGVzLCBmb3IgdGhlIHN0YW5kYXJkIGluc3RhbGxlciBhY3Rpb25zLgotXGVuZHtkYXRhZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlibXN2Y3J0LnRleCBiL0RvYy9saWIvbGlibXN2Y3J0LnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U0Y2U1YS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYm1zdmNydC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXttc3ZjcnR9IC0tCi0gICAgICAgICBVc2VmdWwgcm91dGluZXMgZnJvbSB0aGUgTVMgVlxDcHBcIHJ1bnRpbWV9Ci0KLVxkZWNsYXJlbW9kdWxle2J1aWx0aW59e21zdmNydH0KLSAgXHBsYXRmb3Jte1dpbmRvd3N9Ci1cbW9kdWxlc3lub3BzaXN7TWlzY2VsbGFuZW91cyB1c2VmdWwgcm91dGluZXMgZnJvbSB0aGUgTVMgVlxDcHBcIHJ1bnRpbWUufQotXHNlY3Rpb25hdXRob3J7RnJlZCBMLiBEcmFrZSwgSnIufXtmZHJha2VAYWNtLm9yZ30KLQotCi1UaGVzZSBmdW5jdGlvbnMgcHJvdmlkZSBhY2Nlc3MgdG8gc29tZSB1c2VmdWwgY2FwYWJpbGl0aWVzIG9uIFdpbmRvd3MKLXBsYXRmb3Jtcy4gIFNvbWUgaGlnaGVyLWxldmVsIG1vZHVsZXMgdXNlIHRoZXNlIGZ1bmN0aW9ucyB0byBidWlsZCB0aGUgCi1XaW5kb3dzIGltcGxlbWVudGF0aW9ucyBvZiB0aGVpciBzZXJ2aWNlcy4gIEZvciBleGFtcGxlLCB0aGUKLVxyZWZtb2R1bGV7Z2V0cGFzc30gbW9kdWxlIHVzZXMgdGhpcyBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlCi1cZnVuY3Rpb257Z2V0cGFzcygpfSBmdW5jdGlvbi4KLQotRnVydGhlciBkb2N1bWVudGF0aW9uIG9uIHRoZXNlIGZ1bmN0aW9ucyBjYW4gYmUgZm91bmQgaW4gdGhlIFBsYXRmb3JtCi1BUEkgZG9jdW1lbnRhdGlvbi4KLQotCi1cc3Vic2VjdGlvbntGaWxlIE9wZXJhdGlvbnMgXGxhYmVse21zdmNydC1maWxlc319Ci0KLVxiZWdpbntmdW5jZGVzY317bG9ja2luZ317ZmQsIG1vZGUsIG5ieXRlc30KLSAgTG9jayBwYXJ0IG9mIGEgZmlsZSBiYXNlZCBvbiBmaWxlIGRlc2NyaXB0b3IgXHZhcntmZH0gZnJvbSB0aGUgQwotICBydW50aW1lLiAgUmFpc2VzIFxleGNlcHRpb257SU9FcnJvcn0gb24gZmFpbHVyZS4gIFRoZSBsb2NrZWQgcmVnaW9uCi0gIG9mIHRoZSBmaWxlIGV4dGVuZHMgZnJvbSB0aGUgY3VycmVudCBmaWxlIHBvc2l0aW9uIGZvciBcdmFye25ieXRlc30KLSAgYnl0ZXMsIGFuZCBtYXkgY29udGludWUgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGZpbGUuICBcdmFye21vZGV9IG11c3QKLSAgYmUgb25lIG9mIHRoZSBcY29uc3RhbnR7TEtfXHZhcnsqfX0gY29uc3RhbnRzIGxpc3RlZCBiZWxvdy4KLSAgTXVsdGlwbGUgcmVnaW9ucyBpbiBhIGZpbGUgbWF5IGJlIGxvY2tlZCBhdCB0aGUgc2FtZSB0aW1lLCBidXQgbWF5Ci0gIG5vdCBvdmVybGFwLiAgQWRqYWNlbnQgcmVnaW9ucyBhcmUgbm90IG1lcmdlZDsgdGhleSBtdXN0IGJlIHVubG9ja2VkCi0gIGluZGl2aWR1YWxseS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317TEtfTE9DS30KLVxkYXRhbGluZXtMS19STENLfQotICBMb2NrcyB0aGUgc3BlY2lmaWVkIGJ5dGVzLiBJZiB0aGUgYnl0ZXMgY2Fubm90IGJlIGxvY2tlZCwgdGhlCi0gIHByb2dyYW0gaW1tZWRpYXRlbHkgdHJpZXMgYWdhaW4gYWZ0ZXIgMSBzZWNvbmQuICBJZiwgYWZ0ZXIgMTAKLSAgYXR0ZW1wdHMsIHRoZSBieXRlcyBjYW5ub3QgYmUgbG9ja2VkLCBcZXhjZXB0aW9ue0lPRXJyb3J9IGlzCi0gIHJhaXNlZC4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317TEtfTkJMQ0t9Ci1cZGF0YWxpbmV7TEtfTkJSTENLfQotICBMb2NrcyB0aGUgc3BlY2lmaWVkIGJ5dGVzLiBJZiB0aGUgYnl0ZXMgY2Fubm90IGJlIGxvY2tlZCwKLSAgXGV4Y2VwdGlvbntJT0Vycm9yfSBpcyByYWlzZWQuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e0xLX1VOTENLfQotICBVbmxvY2tzIHRoZSBzcGVjaWZpZWQgYnl0ZXMsIHdoaWNoIG11c3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgbG9ja2VkLiAKLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c2V0bW9kZX17ZmQsIGZsYWdzfQotICBTZXQgdGhlIGxpbmUtZW5kIHRyYW5zbGF0aW9uIG1vZGUgZm9yIHRoZSBmaWxlIGRlc2NyaXB0b3IgXHZhcntmZH0uCi0gIFRvIHNldCBpdCB0byB0ZXh0IG1vZGUsIFx2YXJ7ZmxhZ3N9IHNob3VsZCBiZSBcY29uc3RhbnR7b3MuT19URVhUfTsKLSAgZm9yIGJpbmFyeSwgaXQgc2hvdWxkIGJlIFxjb25zdGFudHtvcy5PX0JJTkFSWX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e29wZW5fb3NmaGFuZGxlfXtoYW5kbGUsIGZsYWdzfQotICBDcmVhdGUgYSBDIHJ1bnRpbWUgZmlsZSBkZXNjcmlwdG9yIGZyb20gdGhlIGZpbGUgaGFuZGxlCi0gIFx2YXJ7aGFuZGxlfS4gIFRoZSBcdmFye2ZsYWdzfSBwYXJhbWV0ZXIgc2hvdWxkIGJlIGEgYml0LXdpc2UgT1Igb2YKLSAgXGNvbnN0YW50e29zLk9fQVBQRU5EfSwgXGNvbnN0YW50e29zLk9fUkRPTkxZfSwgYW5kCi0gIFxjb25zdGFudHtvcy5PX1RFWFR9LiAgVGhlIHJldHVybmVkIGZpbGUgZGVzY3JpcHRvciBtYXkgYmUgdXNlZCBhcyBhCi0gIHBhcmFtZXRlciB0byBcZnVuY3Rpb257b3MuZmRvcGVuKCl9IHRvIGNyZWF0ZSBhIGZpbGUgb2JqZWN0LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRfb3NmaGFuZGxlfXtmZH0KLSAgUmV0dXJuIHRoZSBmaWxlIGhhbmRsZSBmb3IgdGhlIGZpbGUgZGVzY3JpcHRvciBcdmFye2ZkfS4gIFJhaXNlcwotICBcZXhjZXB0aW9ue0lPRXJyb3J9IGlmIFx2YXJ7ZmR9IGlzIG5vdCByZWNvZ25pemVkLgotXGVuZHtmdW5jZGVzY30KLQotCi1cc3Vic2VjdGlvbntDb25zb2xlIEkvTyBcbGFiZWx7bXN2Y3J0LWNvbnNvbGV9fQotCi1cYmVnaW57ZnVuY2Rlc2N9e2tiaGl0fXt9Ci0gIFJldHVybiB0cnVlIGlmIGEga2V5cHJlc3MgaXMgd2FpdGluZyB0byBiZSByZWFkLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRjaH17fQotICBSZWFkIGEga2V5cHJlc3MgYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIGNoYXJhY3Rlci4gIE5vdGhpbmcgaXMKLSAgZWNob2VkIHRvIHRoZSBjb25zb2xlLiAgVGhpcyBjYWxsIHdpbGwgYmxvY2sgaWYgYSBrZXlwcmVzcyBpcyBub3QKLSAgYWxyZWFkeSBhdmFpbGFibGUsIGJ1dCB3aWxsIG5vdCB3YWl0IGZvciBca2Jke0VudGVyfSB0byBiZSBwcmVzc2VkLgotICBJZiB0aGUgcHJlc3NlZCBrZXkgd2FzIGEgc3BlY2lhbCBmdW5jdGlvbiBrZXksIHRoaXMgd2lsbCByZXR1cm4KLSAgXGNvZGV7J1xlMDAwJ30gb3IgXGNvZGV7J1xlIHhlMCd9OyB0aGUgbmV4dCBjYWxsIHdpbGwgcmV0dXJuIHRoZQotICBrZXljb2RlLiAgVGhlIFxrYmR7Q29udHJvbC1DfSBrZXlwcmVzcyBjYW5ub3QgYmUgcmVhZCB3aXRoIHRoaXMKLSAgZnVuY3Rpb24uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldGNoZX17fQotICBTaW1pbGFyIHRvIFxmdW5jdGlvbntnZXRjaCgpfSwgYnV0IHRoZSBrZXlwcmVzcyB3aWxsIGJlIGVjaG9lZCBpZiBpdCAKLSAgcmVwcmVzZW50cyBhIHByaW50YWJsZSBjaGFyYWN0ZXIuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3B1dGNofXtjaGFyfQotICBQcmludCB0aGUgY2hhcmFjdGVyIFx2YXJ7Y2hhcn0gdG8gdGhlIGNvbnNvbGUgd2l0aG91dCBidWZmZXJpbmcuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3VuZ2V0Y2h9e2NoYXJ9Ci0gIENhdXNlIHRoZSBjaGFyYWN0ZXIgXHZhcntjaGFyfSB0byBiZSBgYHB1c2hlZCBiYWNrJycgaW50byB0aGUKLSAgY29uc29sZSBidWZmZXI7IGl0IHdpbGwgYmUgdGhlIG5leHQgY2hhcmFjdGVyIHJlYWQgYnkKLSAgXGZ1bmN0aW9ue2dldGNoKCl9IG9yIFxmdW5jdGlvbntnZXRjaGUoKX0uCi1cZW5ke2Z1bmNkZXNjfQotCi0KLVxzdWJzZWN0aW9ue090aGVyIEZ1bmN0aW9ucyBcbGFiZWx7bXN2Y3J0LW90aGVyfX0KLQotXGJlZ2lue2Z1bmNkZXNjfXtoZWFwbWlufXt9Ci0gIEZvcmNlIHRoZSBcY2Z1bmN0aW9ue21hbGxvYygpfSBoZWFwIHRvIGNsZWFuIGl0c2VsZiB1cCBhbmQgcmV0dXJuCi0gIHVudXNlZCBibG9ja3MgdG8gdGhlIG9wZXJhdGluZyBzeXN0ZW0uICBUaGlzIG9ubHkgd29ya3Mgb24gV2luZG93cwotICBOVC4gIE9uIGZhaWx1cmUsIHRoaXMgcmFpc2VzIFxleGNlcHRpb257SU9FcnJvcn0uCi1cZW5ke2Z1bmNkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJtdWx0aWZpbGUudGV4IGIvRG9jL2xpYi9saWJtdWx0aWZpbGUudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2YwYWY3Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlibXVsdGlmaWxlLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle211bHRpZmlsZX0gLS0tCi0gICAgICAgICBTdXBwb3J0IGZvciBmaWxlcyBjb250YWluaW5nIGRpc3RpbmN0IHBhcnRzfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17bXVsdGlmaWxlfQotXG1vZHVsZXN5bm9wc2lze1N1cHBvcnQgZm9yIHJlYWRpbmcgZmlsZXMgd2hpY2ggY29udGFpbiBkaXN0aW5jdAotICAgICAgICAgICAgICAgIHBhcnRzLCBzdWNoIGFzIHNvbWUgTUlNRSBkYXRhLn0KLVxzZWN0aW9uYXV0aG9ye0VyaWMgUy4gUmF5bW9uZH17ZXNyQHNuYXJrLnRoeXJzdXMuY29tfQotCi1cZGVwcmVjYXRlZHsyLjV9e1RoZSBccmVmbW9kdWxle2VtYWlsfSBwYWNrYWdlIHNob3VsZCBiZSB1c2VkIGluCi0gICAgICAgICAgICAgICAgIHByZWZlcmVuY2UgdG8gdGhlIFxtb2R1bGV7bXVsdGlmaWxlfSBtb2R1bGUuCi0gICAgICAgICAgICAgICAgIFRoaXMgbW9kdWxlIGlzIHByZXNlbnQgb25seSB0byBtYWludGFpbiBiYWNrd2FyZAotICAgICAgICAgICAgICAgICBjb21wYXRpYmlsaXR5Ln0KLQotVGhlIFxjbGFzc3tNdWx0aUZpbGV9IG9iamVjdCBlbmFibGVzIHlvdSB0byB0cmVhdCBzZWN0aW9ucyBvZiBhIHRleHQKLWZpbGUgYXMgZmlsZS1saWtlIGlucHV0IG9iamVjdHMsIHdpdGggXGNvZGV7Jyd9IGJlaW5nIHJldHVybmVkIGJ5Ci1cbWV0aG9ke3JlYWRsaW5lKCl9IHdoZW4gYSBnaXZlbiBkZWxpbWl0ZXIgcGF0dGVybiBpcyBlbmNvdW50ZXJlZC4gIFRoZQotZGVmYXVsdHMgb2YgdGhpcyBjbGFzcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBpdCB1c2VmdWwgZm9yIHBhcnNpbmcKLU1JTUUgbXVsdGlwYXJ0IG1lc3NhZ2VzLCBidXQgYnkgc3ViY2xhc3NpbmcgaXQgYW5kIG92ZXJyaWRpbmcgbWV0aG9kcyAKLWl0IGNhbiBiZSBlYXNpbHkgYWRhcHRlZCBmb3IgbW9yZSBnZW5lcmFsIHVzZS4KLQotXGJlZ2lue2NsYXNzZGVzY317TXVsdGlGaWxlfXtmcFxvcHRpb25hbHssIHNlZWthYmxlfX0KLUNyZWF0ZSBhIG11bHRpLWZpbGUuICBZb3UgbXVzdCBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzIHdpdGggYW4gaW5wdXQKLW9iamVjdCBhcmd1bWVudCBmb3IgdGhlIFxjbGFzc3tNdWx0aUZpbGV9IGluc3RhbmNlIHRvIGdldCBsaW5lcyBmcm9tLAotc3VjaCBhcyBhIGZpbGUgb2JqZWN0IHJldHVybmVkIGJ5IFxmdW5jdGlvbntvcGVuKCl9LgotCi1cY2xhc3N7TXVsdGlGaWxlfSBvbmx5IGV2ZXIgbG9va3MgYXQgdGhlIGlucHV0IG9iamVjdCdzCi1cbWV0aG9ke3JlYWRsaW5lKCl9LCBcbWV0aG9ke3NlZWsoKX0gYW5kIFxtZXRob2R7dGVsbCgpfSBtZXRob2RzLCBhbmQKLXRoZSBsYXR0ZXIgdHdvIGFyZSBvbmx5IG5lZWRlZCBpZiB5b3Ugd2FudCByYW5kb20gYWNjZXNzIHRvIHRoZQotaW5kaXZpZHVhbCBNSU1FIHBhcnRzLiBUbyB1c2UgXGNsYXNze011bHRpRmlsZX0gb24gYSBub24tc2Vla2FibGUKLXN0cmVhbSBvYmplY3QsIHNldCB0aGUgb3B0aW9uYWwgXHZhcntzZWVrYWJsZX0gYXJndW1lbnQgdG8gZmFsc2U7IHRoaXMKLXdpbGwgcHJldmVudCB1c2luZyB0aGUgaW5wdXQgb2JqZWN0J3MgXG1ldGhvZHtzZWVrKCl9IGFuZAotXG1ldGhvZHt0ZWxsKCl9IG1ldGhvZHMuCi1cZW5ke2NsYXNzZGVzY30KLQotSXQgd2lsbCBiZSB1c2VmdWwgdG8ga25vdyB0aGF0IGluIFxjbGFzc3tNdWx0aUZpbGV9J3MgdmlldyBvZiB0aGUgd29ybGQsIHRleHQKLWlzIGNvbXBvc2VkIG9mIHRocmVlIGtpbmRzIG9mIGxpbmVzOiBkYXRhLCBzZWN0aW9uLWRpdmlkZXJzLCBhbmQKLWVuZC1tYXJrZXJzLiAgTXVsdGlGaWxlIGlzIGRlc2lnbmVkIHRvIHN1cHBvcnQgcGFyc2luZyBvZgotbWVzc2FnZXMgdGhhdCBtYXkgaGF2ZSBtdWx0aXBsZSBuZXN0ZWQgbWVzc2FnZSBwYXJ0cywgZWFjaCB3aXRoIGl0cwotb3duIHBhdHRlcm4gZm9yIHNlY3Rpb24tZGl2aWRlciBhbmQgZW5kLW1hcmtlciBsaW5lcy4KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWVtb2R1bGV7ZW1haWx9e0NvbXByZWhlbnNpdmUgZW1haWwgaGFuZGxpbmcgcGFja2FnZTsgc3VwZXJzZWRlcwotICAgICAgICAgICAgICAgICAgICB0aGUgXG1vZHVsZXttdWx0aWZpbGV9IG1vZHVsZS59Ci1cZW5ke3NlZWFsc299Ci0KLQotXHN1YnNlY3Rpb257TXVsdGlGaWxlIE9iamVjdHMgXGxhYmVse011bHRpRmlsZS1vYmplY3RzfX0KLQotQSBcY2xhc3N7TXVsdGlGaWxlfSBpbnN0YW5jZSBoYXMgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotCi1cYmVnaW57bWV0aG9kZGVzY31bTXVsdGlGaWxlXXtyZWFkbGluZX17c3RyfQotUmVhZCBhIGxpbmUuICBJZiB0aGUgbGluZSBpcyBkYXRhIChub3QgYSBzZWN0aW9uLWRpdmlkZXIgb3IgZW5kLW1hcmtlcgotb3IgcmVhbCBFT0YpIHJldHVybiBpdC4gIElmIHRoZSBsaW5lIG1hdGNoZXMgdGhlIG1vc3QtcmVjZW50bHktc3RhY2tlZAotYm91bmRhcnksIHJldHVybiBcY29kZXsnJ30gYW5kIHNldCBcY29kZXtzZWxmLmxhc3R9IHRvIDEgb3IgMCBhY2NvcmRpbmcgYXMKLXRoZSBtYXRjaCBpcyBvciBpcyBub3QgYW4gZW5kLW1hcmtlci4gIElmIHRoZSBsaW5lIG1hdGNoZXMgYW55IG90aGVyCi1zdGFja2VkIGJvdW5kYXJ5LCByYWlzZSBhbiBlcnJvci4gIE9uIGVuY291bnRlcmluZyBlbmQtb2YtZmlsZSBvbiB0aGUKLXVuZGVybHlpbmcgc3RyZWFtIG9iamVjdCwgdGhlIG1ldGhvZCByYWlzZXMgXGV4Y2VwdGlvbntFcnJvcn0gdW5sZXNzCi1hbGwgYm91bmRhcmllcyBoYXZlIGJlZW4gcG9wcGVkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTXVsdGlGaWxlXXtyZWFkbGluZXN9e3N0cn0KLVJldHVybiBhbGwgbGluZXMgcmVtYWluaW5nIGluIHRoaXMgcGFydCBhcyBhIGxpc3Qgb2Ygc3RyaW5ncy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W011bHRpRmlsZV17cmVhZH17fQotUmVhZCBhbGwgbGluZXMsIHVwIHRvIHRoZSBuZXh0IHNlY3Rpb24uICBSZXR1cm4gdGhlbSBhcyBhIHNpbmdsZQotKG11bHRpbGluZSkgc3RyaW5nLiAgTm90ZSB0aGF0IHRoaXMgZG9lc24ndCB0YWtlIGEgc2l6ZSBhcmd1bWVudCEKLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W011bHRpRmlsZV17c2Vla317cG9zXG9wdGlvbmFseywgd2hlbmNlfX0KLVNlZWsuICBTZWVrIGluZGljZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBzZWN0aW9uLgotVGhlIFx2YXJ7cG9zfSBhbmQgXHZhcnt3aGVuY2V9IGFyZ3VtZW50cyBhcmUgaW50ZXJwcmV0ZWQgYXMgZm9yIGEgZmlsZQotc2Vlay4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W011bHRpRmlsZV17dGVsbH17fQotUmV0dXJuIHRoZSBmaWxlIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBzZWN0aW9uLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTXVsdGlGaWxlXXtuZXh0fXt9Ci1Ta2lwIGxpbmVzIHRvIHRoZSBuZXh0IHNlY3Rpb24gKHRoYXQgaXMsIHJlYWQgbGluZXMgdW50aWwgYQotc2VjdGlvbi1kaXZpZGVyIG9yIGVuZC1tYXJrZXIgaGFzIGJlZW4gY29uc3VtZWQpLiAgUmV0dXJuIHRydWUgaWYKLXRoZXJlIGlzIHN1Y2ggYSBzZWN0aW9uLCBmYWxzZSBpZiBhbiBlbmQtbWFya2VyIGlzIHNlZW4uICBSZS1lbmFibGUKLXRoZSBtb3N0LXJlY2VudGx5LXB1c2hlZCBib3VuZGFyeS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W011bHRpRmlsZV17aXNfZGF0YX17c3RyfQotUmV0dXJuIHRydWUgaWYgXHZhcntzdHJ9IGlzIGRhdGEgYW5kIGZhbHNlIGlmIGl0IG1pZ2h0IGJlIGEgc2VjdGlvbgotYm91bmRhcnkuICBBcyB3cml0dGVuLCBpdCB0ZXN0cyBmb3IgYSBwcmVmaXggb3RoZXIgdGhhbiBcY29kZXsnLX1cY29kZXstJ30gYXQKLXN0YXJ0IG9mIGxpbmUgKHdoaWNoIGFsbCBNSU1FIGJvdW5kYXJpZXMgaGF2ZSkgYnV0IGl0IGlzIGRlY2xhcmVkIHNvCi1pdCBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBkZXJpdmVkIGNsYXNzZXMuCi0KLU5vdGUgdGhhdCB0aGlzIHRlc3QgaXMgdXNlZCBpbnRlbmRlZCBhcyBhIGZhc3QgZ3VhcmQgZm9yIHRoZSByZWFsCi1ib3VuZGFyeSB0ZXN0czsgaWYgaXQgYWx3YXlzIHJldHVybnMgZmFsc2UgaXQgd2lsbCBtZXJlbHkgc2xvdwotcHJvY2Vzc2luZywgbm90IGNhdXNlIGl0IHRvIGZhaWwuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtNdWx0aUZpbGVde3B1c2h9e3N0cn0KLVB1c2ggYSBib3VuZGFyeSBzdHJpbmcuICBXaGVuIGEgZGVjb3JhdGVkIHZlcnNpb24gb2YgdGhpcyBib3VuZGFyeSAKLWlzIGZvdW5kIGFzIGFuIGlucHV0IGxpbmUsIGl0IHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYSBzZWN0aW9uLWRpdmlkZXIgCi1vciBlbmQtbWFya2VyIChkZXBlbmRpbmcgb24gdGhlIGRlY29yYXRpb24sIHNlZSBccmZjezIwNDV9KS4gIEFsbCBzdWJzZXF1ZW50Ci1yZWFkcyB3aWxsIHJldHVybiB0aGUgZW1wdHkgc3RyaW5nIHRvIGluZGljYXRlIGVuZC1vZi1maWxlLCB1bnRpbCBhCi1jYWxsIHRvIFxtZXRob2R7cG9wKCl9IHJlbW92ZXMgdGhlIGJvdW5kYXJ5IGEgb3IgXG1ldGhvZHtuZXh0KCl9IGNhbGwKLXJlZW5hYmxlcyBpdC4KLQotSXQgaXMgcG9zc2libGUgdG8gcHVzaCBtb3JlIHRoYW4gb25lIGJvdW5kYXJ5LiAgRW5jb3VudGVyaW5nIHRoZQotbW9zdC1yZWNlbnRseS1wdXNoZWQgYm91bmRhcnkgd2lsbCByZXR1cm4gRU9GOyBlbmNvdW50ZXJpbmcgYW55IG90aGVyCi1ib3VuZGFyeSB3aWxsIHJhaXNlIGFuIGVycm9yLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTXVsdGlGaWxlXXtwb3B9e30KLVBvcCBhIHNlY3Rpb24gYm91bmRhcnkuICBUaGlzIGJvdW5kYXJ5IHdpbGwgbm8gbG9uZ2VyIGJlIGludGVycHJldGVkCi1hcyBFT0YuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtNdWx0aUZpbGVde3NlY3Rpb25fZGl2aWRlcn17c3RyfQotVHVybiBhIGJvdW5kYXJ5IGludG8gYSBzZWN0aW9uLWRpdmlkZXIgbGluZS4gIEJ5IGRlZmF1bHQsIHRoaXMKLW1ldGhvZCBwcmVwZW5kcyBcY29kZXsnLX1cY29kZXstJ30gKHdoaWNoIE1JTUUgc2VjdGlvbiBib3VuZGFyaWVzIGhhdmUpIGJ1dAotaXQgaXMgZGVjbGFyZWQgc28gaXQgY2FuIGJlIG92ZXJyaWRkZW4gaW4gZGVyaXZlZCBjbGFzc2VzLiAgVGhpcwotbWV0aG9kIG5lZWQgbm90IGFwcGVuZCBMRiBvciBDUi1MRiwgYXMgY29tcGFyaXNvbiB3aXRoIHRoZSByZXN1bHQKLWlnbm9yZXMgdHJhaWxpbmcgd2hpdGVzcGFjZS4gCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtNdWx0aUZpbGVde2VuZF9tYXJrZXJ9e3N0cn0KLVR1cm4gYSBib3VuZGFyeSBzdHJpbmcgaW50byBhbiBlbmQtbWFya2VyIGxpbmUuICBCeSBkZWZhdWx0LCB0aGlzCi1tZXRob2QgcHJlcGVuZHMgXGNvZGV7Jy19XGNvZGV7LSd9IGFuZCBhcHBlbmRzIFxjb2RleyctfVxjb2Rley0nfSAobGlrZSBhCi1NSU1FLW11bHRpcGFydCBlbmQtb2YtbWVzc2FnZSBtYXJrZXIpIGJ1dCBpdCBpcyBkZWNsYXJlZCBzbyBpdCBjYW4gYmUKLW92ZXJyaWRkZW4gaW4gZGVyaXZlZCBjbGFzc2VzLiAgVGhpcyBtZXRob2QgbmVlZCBub3QgYXBwZW5kIExGIG9yCi1DUi1MRiwgYXMgY29tcGFyaXNvbiB3aXRoIHRoZSByZXN1bHQgaWdub3JlcyB0cmFpbGluZyB3aGl0ZXNwYWNlLgotXGVuZHttZXRob2RkZXNjfQotCi1GaW5hbGx5LCBcY2xhc3N7TXVsdGlGaWxlfSBpbnN0YW5jZXMgaGF2ZSB0d28gcHVibGljIGluc3RhbmNlIHZhcmlhYmxlczoKLQotXGJlZ2lue21lbWJlcmRlc2N9W011bHRpRmlsZV17bGV2ZWx9Ci1OZXN0aW5nIGRlcHRoIG9mIHRoZSBjdXJyZW50IHBhcnQuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtNdWx0aUZpbGVde2xhc3R9Ci1UcnVlIGlmIHRoZSBsYXN0IGVuZC1vZi1maWxlIHdhcyBmb3IgYW4gZW5kLW9mLW1lc3NhZ2UgbWFya2VyLiAKLVxlbmR7bWVtYmVyZGVzY30KLQotCi1cc3Vic2VjdGlvbntcY2xhc3N7TXVsdGlGaWxlfSBFeGFtcGxlIFxsYWJlbHttdWx0aWZpbGUtZXhhbXBsZX19Ci1cc2VjdGlvbmF1dGhvcntTa2lwIE1vbnRhbmFyb317c2tpcEBtb2phbS5jb219Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCBtaW1ldG9vbHMKLWltcG9ydCBtdWx0aWZpbGUKLWltcG9ydCBTdHJpbmdJTwotCi1kZWYgZXh0cmFjdF9taW1lX3BhcnRfbWF0Y2hpbmcoc3RyZWFtLCBtaW1ldHlwZSk6Ci0gICAgIiIiUmV0dXJuIHRoZSBmaXJzdCBlbGVtZW50IGluIGEgbXVsdGlwYXJ0IE1JTUUgbWVzc2FnZSBvbiBzdHJlYW0KLSAgICBtYXRjaGluZyBtaW1ldHlwZS4iIiIKLQotICAgIG1zZyA9IG1pbWV0b29scy5NZXNzYWdlKHN0cmVhbSkKLSAgICBtc2d0eXBlID0gbXNnLmdldHR5cGUoKQotICAgIHBhcmFtcyA9IG1zZy5nZXRwbGlzdCgpCi0KLSAgICBkYXRhID0gU3RyaW5nSU8uU3RyaW5nSU8oKQotICAgIGlmIG1zZ3R5cGVbOjEwXSA9PSAibXVsdGlwYXJ0LyI6Ci0KLSAgICAgICAgZmlsZSA9IG11bHRpZmlsZS5NdWx0aUZpbGUoc3RyZWFtKQotICAgICAgICBmaWxlLnB1c2gobXNnLmdldHBhcmFtKCJib3VuZGFyeSIpKQotICAgICAgICB3aGlsZSBmaWxlLm5leHQoKToKLSAgICAgICAgICAgIHN1Ym1zZyA9IG1pbWV0b29scy5NZXNzYWdlKGZpbGUpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgZGF0YSA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKLSAgICAgICAgICAgICAgICBtaW1ldG9vbHMuZGVjb2RlKGZpbGUsIGRhdGEsIHN1Ym1zZy5nZXRlbmNvZGluZygpKQotICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIGlmIHN1Ym1zZy5nZXR0eXBlKCkgPT0gbWltZXR5cGU6Ci0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgZmlsZS5wb3AoKQotICAgIHJldHVybiBkYXRhLmdldHZhbHVlKCkKLVxlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYm11dGV4LnRleCBiL0RvYy9saWIvbGlibXV0ZXgudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzM1Yzk2Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlibXV0ZXgudGV4CisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXttdXRleH0gLS0tCi0gICAgICAgICBNdXR1YWwgZXhjbHVzaW9uIHN1cHBvcnR9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXttdXRleH0KLVxzZWN0aW9uYXV0aG9ye01vc2hlIFphZGthfXttb3NoZXpAemFka2Euc2l0ZS5jby5pbH0KLVxtb2R1bGVzeW5vcHNpc3tMb2NrIGFuZCBxdWV1ZSBmb3IgbXV0dWFsIGV4Y2x1c2lvbi59Ci0KLVRoZSBcbW9kdWxle211dGV4fSBtb2R1bGUgZGVmaW5lcyBhIGNsYXNzIHRoYXQgYWxsb3dzIG11dHVhbC1leGNsdXNpb24KLXZpYSBhY3F1aXJpbmcgYW5kIHJlbGVhc2luZyBsb2Nrcy4gSXQgZG9lcyBub3QgcmVxdWlyZSAob3IgaW1wbHkpCi10aHJlYWRpbmcgb3IgbXVsdGktdGFza2luZywgdGhvdWdoIGl0IGNvdWxkIGJlIHVzZWZ1bCBmb3IKLXRob3NlIHB1cnBvc2VzLgotCi1UaGUgXG1vZHVsZXttdXRleH0gbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBjbGFzczoKLQotXGJlZ2lue2NsYXNzZGVzY317bXV0ZXh9e30KLUNyZWF0ZSBhIG5ldyAodW5sb2NrZWQpIG11dGV4LgotCi1BIG11dGV4IGhhcyB0d28gcGllY2VzIG9mIHN0YXRlIC0tLSBhIGBgbG9ja2VkJycgYml0IGFuZCBhIHF1ZXVlLgotV2hlbiB0aGUgbXV0ZXggaXMgbm90IGxvY2tlZCwgdGhlIHF1ZXVlIGlzIGVtcHR5LgotT3RoZXJ3aXNlLCB0aGUgcXVldWUgY29udGFpbnMgemVybyBvciBtb3JlIAotXGNvZGV7KFx2YXJ7ZnVuY3Rpb259LCBcdmFye2FyZ3VtZW50fSl9IHBhaXJzCi1yZXByZXNlbnRpbmcgZnVuY3Rpb25zIChvciBtZXRob2RzKSB3YWl0aW5nIHRvIGFjcXVpcmUgdGhlIGxvY2suCi1XaGVuIHRoZSBtdXRleCBpcyB1bmxvY2tlZCB3aGlsZSB0aGUgcXVldWUgaXMgbm90IGVtcHR5LAotdGhlIGZpcnN0IHF1ZXVlIGVudHJ5IGlzIHJlbW92ZWQgYW5kIGl0cyAKLVxjb2Rle1x2YXJ7ZnVuY3Rpb259KFx2YXJ7YXJndW1lbnR9KX0gcGFpciBjYWxsZWQsCi1pbXBseWluZyBpdCBub3cgaGFzIHRoZSBsb2NrLgotCi1PZiBjb3Vyc2UsIG5vIG11bHRpLXRocmVhZGluZyBpcyBpbXBsaWVkIC0tIGhlbmNlIHRoZSBmdW5ueSBpbnRlcmZhY2UKLWZvciBcbWV0aG9ke2xvY2soKX0sIHdoZXJlIGEgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgdGhlIGxvY2sgaXMKLWFjcXVpcmVkLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLQotXHN1YnNlY3Rpb257TXV0ZXggT2JqZWN0cyBcbGFiZWx7bXV0ZXgtb2JqZWN0c319Ci0KLVxjbGFzc3ttdXRleH0gb2JqZWN0cyBoYXZlIGZvbGxvd2luZyBtZXRob2RzOgotCi1cYmVnaW57bWV0aG9kZGVzY31bbXV0ZXhde3Rlc3R9e30KLUNoZWNrIHdoZXRoZXIgdGhlIG11dGV4IGlzIGxvY2tlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W211dGV4XXt0ZXN0YW5kc2V0fXt9Ci1gYEF0b21pYycnIHRlc3QtYW5kLXNldCwgZ3JhYiB0aGUgbG9jayBpZiBpdCBpcyBub3Qgc2V0LAotYW5kIHJldHVybiBcY29kZXtUcnVlfSwgb3RoZXJ3aXNlLCByZXR1cm4gXGNvZGV7RmFsc2V9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bbXV0ZXhde2xvY2t9e2Z1bmN0aW9uLCBhcmd1bWVudH0KLUV4ZWN1dGUgXGNvZGV7XHZhcntmdW5jdGlvbn0oXHZhcnthcmd1bWVudH0pfSwgdW5sZXNzIHRoZSBtdXRleCBpcyBsb2NrZWQuCi1JbiB0aGUgY2FzZSBpdCBpcyBsb2NrZWQsIHBsYWNlIHRoZSBmdW5jdGlvbiBhbmQgYXJndW1lbnQgb24gdGhlIHF1ZXVlLgotU2VlIFxtZXRob2R7dW5sb2NrfSBmb3IgZXhwbGFuYXRpb24gb2Ygd2hlbgotXGNvZGV7XHZhcntmdW5jdGlvbn0oXHZhcnthcmd1bWVudH0pfSBpcyBleGVjdXRlZCBpbiB0aGF0IGNhc2UuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVttdXRleF17dW5sb2NrfXt9Ci1VbmxvY2sgdGhlIG11dGV4IGlmIHF1ZXVlIGlzIGVtcHR5LCBvdGhlcndpc2UgZXhlY3V0ZSB0aGUgZmlyc3QgZWxlbWVudAotaW4gdGhlIHF1ZXVlLgotXGVuZHttZXRob2RkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJuZXRyYy50ZXggYi9Eb2MvbGliL2xpYm5ldHJjLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg2N2IzNC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYm5ldHJjLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7bmV0cmN9IC0tLQotICAgICAgICAgbmV0cmMgZmlsZSBwcm9jZXNzaW5nfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17bmV0cmN9Ci0lIE5vdGUgdGhlIFxwcm90ZWN0IG5lZWRlZCBmb3IgXGZpbGUuLi4gOy0oCi1cbW9kdWxlc3lub3BzaXN7TG9hZGluZyBvZiBccHJvdGVjdFxmaWxley5uZXRyY30gZmlsZXMufQotXG1vZHVsZWF1dGhvcntFcmljIFMuIFJheW1vbmR9e2VzckBzbmFyay50aHlyc3VzLmNvbX0KLVxzZWN0aW9uYXV0aG9ye0VyaWMgUy4gUmF5bW9uZH17ZXNyQHNuYXJrLnRoeXJzdXMuY29tfQotCi0KLVx2ZXJzaW9uYWRkZWR7MS41LjJ9Ci0KLVRoZSBcY2xhc3N7bmV0cmN9IGNsYXNzIHBhcnNlcyBhbmQgZW5jYXBzdWxhdGVzIHRoZSBuZXRyYyBmaWxlIGZvcm1hdAotdXNlZCBieSB0aGUgXFVOSVh7fSBccHJvZ3JhbXtmdHB9IHByb2dyYW0gYW5kIG90aGVyIEZUUCBjbGllbnRzLgotCi1cYmVnaW57Y2xhc3NkZXNjfXtuZXRyY317XG9wdGlvbmFse2ZpbGV9fQotQSBcY2xhc3N7bmV0cmN9IGluc3RhbmNlIG9yIHN1YmNsYXNzIGluc3RhbmNlIGVuY2Fwc3VsYXRlcyBkYXRhIGZyb20gCi1hIG5ldHJjIGZpbGUuICBUaGUgaW5pdGlhbGl6YXRpb24gYXJndW1lbnQsIGlmIHByZXNlbnQsIHNwZWNpZmllcyB0aGUKLWZpbGUgdG8gcGFyc2UuICBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgdGhlIGZpbGUgXGZpbGV7Lm5ldHJjfSBpbiB0aGUKLXVzZXIncyBob21lIGRpcmVjdG9yeSB3aWxsIGJlIHJlYWQuICBQYXJzZSBlcnJvcnMgd2lsbCByYWlzZQotXGV4Y2VwdGlvbntOZXRyY1BhcnNlRXJyb3J9IHdpdGggZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBpbmNsdWRpbmcgdGhlCi1maWxlIG5hbWUsIGxpbmUgbnVtYmVyLCBhbmQgdGVybWluYXRpbmcgdG9rZW4uCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e05ldHJjUGFyc2VFcnJvcn0KLUV4Y2VwdGlvbiByYWlzZWQgYnkgdGhlIFxjbGFzc3tuZXRyY30gY2xhc3Mgd2hlbiBzeW50YWN0aWNhbCBlcnJvcnMKLWFyZSBlbmNvdW50ZXJlZCBpbiBzb3VyY2UgdGV4dC4gIEluc3RhbmNlcyBvZiB0aGlzIGV4Y2VwdGlvbiBwcm92aWRlCi10aHJlZSBpbnRlcmVzdGluZyBhdHRyaWJ1dGVzOiAgXG1lbWJlcnttc2d9IGlzIGEgdGV4dHVhbCBleHBsYW5hdGlvbgotb2YgdGhlIGVycm9yLCBcbWVtYmVye2ZpbGVuYW1lfSBpcyB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUsIGFuZAotXG1lbWJlcntsaW5lbm99IGdpdmVzIHRoZSBsaW5lIG51bWJlciBvbiB3aGljaCB0aGUgZXJyb3Igd2FzIGZvdW5kLgotXGVuZHtleGNkZXNjfQotCi0KLVxzdWJzZWN0aW9ue25ldHJjIE9iamVjdHMgXGxhYmVse25ldHJjLW9iamVjdHN9fQotCi1BIFxjbGFzc3tuZXRyY30gaW5zdGFuY2UgaGFzIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLQotXGJlZ2lue21ldGhvZGRlc2N9W25ldHJjXXthdXRoZW50aWNhdG9yc317aG9zdH0KLVJldHVybiBhIDMtdHVwbGUgXGNvZGV7KFx2YXJ7bG9naW59LCBcdmFye2FjY291bnR9LCBcdmFye3Bhc3N3b3JkfSl9Ci1vZiBhdXRoZW50aWNhdG9ycyBmb3IgXHZhcntob3N0fS4gIElmIHRoZSBuZXRyYyBmaWxlIGRpZCBub3QKLWNvbnRhaW4gYW4gZW50cnkgZm9yIHRoZSBnaXZlbiBob3N0LCByZXR1cm4gdGhlIHR1cGxlIGFzc29jaWF0ZWQgd2l0aAotdGhlIGBkZWZhdWx0JyBlbnRyeS4gIElmIG5laXRoZXIgbWF0Y2hpbmcgaG9zdCBub3IgZGVmYXVsdCBlbnRyeSBpcwotYXZhaWxhYmxlLCByZXR1cm4gXGNvZGV7Tm9uZX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtuZXRyY117X19yZXByX199e30KLUR1bXAgdGhlIGNsYXNzIGRhdGEgYXMgYSBzdHJpbmcgaW4gdGhlIGZvcm1hdCBvZiBhIG5ldHJjIGZpbGUuCi0oVGhpcyBkaXNjYXJkcyBjb21tZW50cyBhbmQgbWF5IHJlb3JkZXIgdGhlIGVudHJpZXMuKQotXGVuZHttZXRob2RkZXNjfQotCi1JbnN0YW5jZXMgb2YgXGNsYXNze25ldHJjfSBoYXZlIHB1YmxpYyBpbnN0YW5jZSB2YXJpYWJsZXM6Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtuZXRyY117aG9zdHN9Ci1EaWN0aW9uYXJ5IG1hcHBpbmcgaG9zdCBuYW1lcyB0byBcY29kZXsoXHZhcntsb2dpbn0sIFx2YXJ7YWNjb3VudH0sCi1cdmFye3Bhc3N3b3JkfSl9IHR1cGxlcy4gIFRoZSBgZGVmYXVsdCcgZW50cnksIGlmIGFueSwgaXMgcmVwcmVzZW50ZWQKLWFzIGEgcHNldWRvLWhvc3QgYnkgdGhhdCBuYW1lLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bbmV0cmNde21hY3Jvc30KLURpY3Rpb25hcnkgbWFwcGluZyBtYWNybyBuYW1lcyB0byBzdHJpbmcgbGlzdHMuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxub3Rle1Bhc3N3b3JkcyBhcmUgbGltaXRlZCB0byBhIHN1YnNldCBvZiB0aGUgQVNDSUkgY2hhcmFjdGVyIHNldC4KLVZlcnNpb25zIG9mIHRoaXMgbW9kdWxlIHByaW9yIHRvIDIuMyB3ZXJlIGV4dHJlbWVseSBsaW1pdGVkLiAgU3RhcnRpbmcgd2l0aAotMi4zLCBhbGwgQVNDSUkgcHVuY3R1YXRpb24gaXMgYWxsb3dlZCBpbiBwYXNzd29yZHMuICBIb3dldmVyLCBub3RlIHRoYXQKLXdoaXRlc3BhY2UgYW5kIG5vbi1wcmludGFibGUgY2hhcmFjdGVycyBhcmUgbm90IGFsbG93ZWQgaW4gcGFzc3dvcmRzLiAgVGhpcwotaXMgYSBsaW1pdGF0aW9uIG9mIHRoZSB3YXkgdGhlIC5uZXRyYyBmaWxlIGlzIHBhcnNlZCBhbmQgbWF5IGJlIHJlbW92ZWQgaW4KLXRoZSBmdXR1cmUufQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJuZXcudGV4IGIvRG9jL2xpYi9saWJuZXcudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODE2MmRjLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlibmV3LnRleAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7bmV3fSAtLS0KLSAgICAgICAgIENyZWF0aW9uIG9mIHJ1bnRpbWUgaW50ZXJuYWwgb2JqZWN0c30KLQotXGRlY2xhcmVtb2R1bGV7YnVpbHRpbn17bmV3fQotXHNlY3Rpb25hdXRob3J7TW9zaGUgWmFka2F9e21vc2hlekB6YWRrYS5zaXRlLmNvLmlsfQotXG1vZHVsZXN5bm9wc2lze0ludGVyZmFjZSB0byB0aGUgY3JlYXRpb24gb2YgcnVudGltZSBpbXBsZW1lbnRhdGlvbiBvYmplY3RzLn0KLQotCi1UaGUgXG1vZHVsZXtuZXd9IG1vZHVsZSBhbGxvd3MgYW4gaW50ZXJmYWNlIHRvIHRoZSBpbnRlcnByZXRlciBvYmplY3QKLWNyZWF0aW9uIGZ1bmN0aW9ucy4gVGhpcyBpcyBmb3IgdXNlIHByaW1hcmlseSBpbiBtYXJzaGFsLXR5cGUgZnVuY3Rpb25zLAotd2hlbiBhIG5ldyBvYmplY3QgbmVlZHMgdG8gYmUgY3JlYXRlZCBgYG1hZ2ljYWxseScnIGFuZCBub3QgYnkgdXNpbmcgdGhlCi1yZWd1bGFyIGNyZWF0aW9uIGZ1bmN0aW9ucy4gVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBsb3ctbGV2ZWwgaW50ZXJmYWNlCi10byB0aGUgaW50ZXJwcmV0ZXIsIHNvIGNhcmUgbXVzdCBiZSBleGVyY2lzZWQgd2hlbiB1c2luZyB0aGlzIG1vZHVsZS4KLUl0IGlzIHBvc3NpYmxlIHRvIHN1cHBseSBub24tc2Vuc2ljYWwgYXJndW1lbnRzIHdoaWNoIGNyYXNoIHRoZQotaW50ZXJwcmV0ZXIgd2hlbiB0aGUgb2JqZWN0IGlzIHVzZWQuCi0KLVRoZSBcbW9kdWxle25ld30gbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6Ci0KLVxiZWdpbntmdW5jZGVzY317aW5zdGFuY2VtZXRob2R9e2Z1bmN0aW9uLCBpbnN0YW5jZSwgY2xhc3N9Ci1UaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgbWV0aG9kIG9iamVjdCwgYm91bmQgdG8gXHZhcntpbnN0YW5jZX0sIG9yCi11bmJvdW5kIGlmIFx2YXJ7aW5zdGFuY2V9IGlzIFxjb2Rle05vbmV9LiAgXHZhcntmdW5jdGlvbn0gbXVzdCBiZQotY2FsbGFibGUuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2Z1bmN0aW9ufXtjb2RlLCBnbG9iYWxzXG9wdGlvbmFseywgbmFtZVxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdkZWZzXG9wdGlvbmFseywgY2xvc3VyZX19fX0KLVJldHVybnMgYSAoUHl0aG9uKSBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbiBjb2RlIGFuZCBnbG9iYWxzLiBJZgotXHZhcntuYW1lfSBpcyBnaXZlbiwgaXQgbXVzdCBiZSBhIHN0cmluZyBvciBcY29kZXtOb25lfS4gIElmIGl0IGlzIGEKLXN0cmluZywgdGhlIGZ1bmN0aW9uIHdpbGwgaGF2ZSB0aGUgZ2l2ZW4gbmFtZSwgb3RoZXJ3aXNlIHRoZSBmdW5jdGlvbgotbmFtZSB3aWxsIGJlIHRha2VuIGZyb20gXGNvZGV7XHZhcntjb2RlfS5jb19uYW1lfS4gIElmCi1cdmFye2FyZ2RlZnN9IGlzIGdpdmVuLCBpdCBtdXN0IGJlIGEgdHVwbGUgYW5kIHdpbGwgYmUgdXNlZCB0bwotZGV0ZXJtaW5lIHRoZSBkZWZhdWx0IHZhbHVlcyBvZiBwYXJhbWV0ZXJzLiAgSWYgXHZhcntjbG9zdXJlfSBpcyBnaXZlbiwKLWl0IG11c3QgYmUgXGNvZGV7Tm9uZX0gb3IgYSB0dXBsZSBvZiBjZWxsIG9iamVjdHMgY29udGFpbmluZyBvYmplY3RzCi10byBiaW5kIHRvIHRoZSBuYW1lcyBpbiBcY29kZXtcdmFye2NvZGV9LmNvX2ZyZWV2YXJzfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y29kZX17YXJnY291bnQsIG5sb2NhbHMsIHN0YWNrc2l6ZSwgZmxhZ3MsIGNvZGVzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50cywgbmFtZXMsIHZhcm5hbWVzLCBmaWxlbmFtZSwgbmFtZSwgZmlyc3RsaW5lbm8sCi0gICAgICAgICAgICAgICAgICAgICAgIGxub3RhYn0KLVRoaXMgZnVuY3Rpb24gaXMgYW4gaW50ZXJmYWNlIHRvIHRoZSBcY2Z1bmN0aW9ue1B5Q29kZV9OZXcoKX0gQwotZnVuY3Rpb24uCi0lWFhYIFRoaXMgaXMgc3RpbGwgdW5kb2N1bWVudGVkISEhISEhISEhISEKLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bW9kdWxlfXtuYW1lWywgZG9jXX0KLVRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG5ldyBtb2R1bGUgb2JqZWN0IHdpdGggbmFtZSBcdmFye25hbWV9LgotXHZhcntuYW1lfSBtdXN0IGJlIGEgc3RyaW5nLgotVGhlIG9wdGlvbmFsIFx2YXJ7ZG9jfSBhcmd1bWVudCBjYW4gaGF2ZSBhbnkgdHlwZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y2xhc3NvYmp9e25hbWUsIGJhc2VjbGFzc2VzLCBkaWN0fQotVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgbmV3IGNsYXNzIG9iamVjdCwgd2l0aCBuYW1lIFx2YXJ7bmFtZX0sIGRlcml2ZWQKLWZyb20gXHZhcntiYXNlY2xhc3Nlc30gKHdoaWNoIHNob3VsZCBiZSBhIHR1cGxlIG9mIGNsYXNzZXMpIGFuZCB3aXRoCi1uYW1lc3BhY2UgXHZhcntkaWN0fS4KLVxlbmR7ZnVuY2Rlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYm5pLnRleCBiL0RvYy9saWIvbGlibmkudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTJiM2VlLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlibmkudGV4CisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtuaX0gLS0tCi0gICAgICAgICBOb25lfQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e25pfQotCi1cbW9kdWxlc3lub3BzaXN7Tm9uZX0KLQotCi1cc3Ryb25ne1dhcm5pbmc6IFRoaXMgbW9kdWxlIGlzIG9ic29sZXRlLn0gIEFzIG9mIFB5dGhvbiAxLjVhNCwKLXBhY2thZ2Ugc3VwcG9ydCAod2l0aCBkaWZmZXJlbnQgc2VtYW50aWNzIGZvciBcY29kZXtfX2luaXRfX30gYW5kIG5vCi1zdXBwb3J0IGZvciBcY29kZXtfX2RvbWFpbl9ffSBvciBcY29kZXtfX30pIGlzIGJ1aWx0IGluIHRoZQotaW50ZXJwcmV0ZXIuICBUaGUgbmkgbW9kdWxlIGlzIHJldGFpbmVkIG9ubHkgZm9yIGJhY2t3YXJkCi1jb21wYXRpYmlsaXR5LiAgQXMgb2YgUHl0aG9uIDEuNWIyLCBpdCBoYXMgYmVlbiByZW5hbWVkIHRvIFxjb2Rle25pMX07IAotaWYgeW91IHJlYWxseSBuZWVkIGl0LCB5b3UgY2FuIHVzZSBcY29kZXtpbXBvcnQgbmkxfSwgYnV0IHRoZQotcmVjb21tZW5kZWQgYXBwcm9hY2ggaXMgdG8gcmVseSBvbiB0aGUgYnVpbHQtaW4gcGFja2FnZSBzdXBwb3J0LAotY29udmVydGluZyBleGlzdGluZyBwYWNrYWdlcyBpZiBuZWVkZWQuICBOb3RlIHRoYXQgbWl4aW5nIFxjb2Rle25pfQotYW5kIHRoZSBidWlsdC1pbiBwYWNrYWdlIHN1cHBvcnQgZG9lc24ndCB3b3JrOiBvbmNlIHlvdSBpbXBvcnQKLVxjb2Rle25pfSwgYWxsIHBhY2thZ2VzIHVzZSBpdC4KLQotVGhlIFxjb2Rle25pfSBtb2R1bGUgZGVmaW5lcyBhIG5ldyBpbXBvcnRpbmcgc2NoZW1lLCB3aGljaCBzdXBwb3J0cwotcGFja2FnZXMgY29udGFpbmluZyBzZXZlcmFsIFB5dGhvbiBtb2R1bGVzLiAgVG8gZW5hYmxlIHBhY2thZ2UKLXN1cHBvcnQsIGV4ZWN1dGUgXGNvZGV7aW1wb3J0IG5pfSBiZWZvcmUgaW1wb3J0aW5nIGFueSBwYWNrYWdlcy4gIEltcG9ydGluZwotdGhpcyBtb2R1bGUgYXV0b21hdGljYWxseSBpbnN0YWxscyB0aGUgcmVsZXZhbnQgaW1wb3J0IGhvb2tzLiAgVGhlcmUKLWFyZSBubyBwdWJsaWNseS11c2FibGUgZnVuY3Rpb25zIG9yIHZhcmlhYmxlcyBpbiB0aGUgXGNvZGV7bml9IG1vZHVsZS4KLQotVG8gY3JlYXRlIGEgcGFja2FnZSBuYW1lZCBcY29kZXtzcGFtfSBjb250YWluaW5nIHN1Yi1tb2R1bGVzIFxjb2Rle2hhbX0sIFxjb2Rle2JhY29ufSBhbmQKLVxjb2Rle2VnZ3N9LCBjcmVhdGUgYSBkaXJlY3RvcnkgXGZpbGV7c3BhbX0gc29tZXdoZXJlIG9uIFB5dGhvbidzIG1vZHVsZSBzZWFyY2gKLXBhdGgsIGFzIGdpdmVuIGluIFxjb2Rle3N5cy5wYXRofS4gIFRoZW4sIGNyZWF0ZSBmaWxlcyBjYWxsZWQgXGZpbGV7aGFtLnB5fSwgXGZpbGV7YmFjb24ucHl9IGFuZAotXGZpbGV7ZWdncy5weX0gaW5zaWRlIFxmaWxle3NwYW19LgotCi1UbyBpbXBvcnQgbW9kdWxlIFxjb2Rle2hhbX0gZnJvbSBwYWNrYWdlIFxjb2Rle3NwYW19IGFuZCB1c2UgZnVuY3Rpb24KLVxjb2Rle2hhbW5lZ2dzKCl9IGZyb20gdGhhdCBtb2R1bGUsIHlvdSBjYW4gdXNlIGFueSBvZiB0aGUgZm9sbG93aW5nCi1wb3NzaWJpbGl0aWVzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgc3BhbS5oYW0JCSMgKm5vdCogImltcG9ydCBzcGFtIiAhISEKLXNwYW0uaGFtLmhhbW5lZ2dzKCkKLVxlbmR7dmVyYmF0aW19Ci0lCi1cYmVnaW57dmVyYmF0aW19Ci1mcm9tIHNwYW0gaW1wb3J0IGhhbQotaGFtLmhhbW5lZ2dzKCkKLVxlbmR7dmVyYmF0aW19Ci0lCi1cYmVnaW57dmVyYmF0aW19Ci1mcm9tIHNwYW0uaGFtIGltcG9ydCBoYW1uZWdncwotaGFtbmVnZ3MoKQotXGVuZHt2ZXJiYXRpbX0KLSUKLVxjb2Rle2ltcG9ydCBzcGFtfSBjcmVhdGVzIGFuCi1lbXB0eSBwYWNrYWdlIG5hbWVkIFxjb2Rle3NwYW19IGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LCBidXQgaXQgZG9lcwotXGVtcGh7bm90fSBhdXRvbWF0aWNhbGx5IGltcG9ydCBcY29kZXtzcGFtfSdzIHN1Ym1vZHVsZXMuICAKLVRoZSBvbmx5IHN1Ym1vZHVsZSB0aGF0IGlzIGd1YXJhbnRlZWQgdG8gYmUgaW1wb3J0ZWQgaXMKLVxjb2Rle3NwYW0uX19pbml0X199LCBpZiBpdCBleGlzdHM7IGl0IHdvdWxkIGJlIGluIGEgZmlsZSBuYW1lZAotXGZpbGV7X19pbml0X18ucHl9IGluIHRoZSBcZmlsZXtzcGFtfSBkaXJlY3RvcnkuICBOb3RlIHRoYXQKLVxjb2Rle3NwYW0uX19pbml0X199IGlzIGEgc3VibW9kdWxlIG9mIHBhY2thZ2Ugc3BhbS4gIEl0IGNhbiByZWZlciB0bwotc3BhbSdzIG5hbWVzcGFjZSBhcyBcY29kZXtfX30gKHR3byB1bmRlcnNjb3Jlcyk6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLV9fLnNwYW1faW5pdGVkID0gMQkJIyBTZXQgYSBwYWNrYWdlLWxldmVsIHZhcmlhYmxlCi1cZW5ke3ZlcmJhdGltfQotJQotQWRkaXRpb25hbCBpbml0aWFsaXphdGlvbiBjb2RlIChzZXR0aW5nIHVwIHZhcmlhYmxlcywgaW1wb3J0aW5nIG90aGVyCi1zdWJtb2R1bGVzKSBjYW4gYmUgcGVyZm9ybWVkIGluIFxmaWxle3NwYW0vX19pbml0X18ucHl9LgpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJuaXMudGV4IGIvRG9jL2xpYi9saWJuaXMudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTRhY2I1Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlibmlzLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7bmlzfSAtLS0KLSAgICAgICAgIEludGVyZmFjZSB0byBTdW4ncyBOSVMgKFllbGxvdyBQYWdlcyl9Ci0KLVxkZWNsYXJlbW9kdWxle2V4dGVuc2lvbn17bmlzfQotICBccGxhdGZvcm17VW5peH0KLVxtb2R1bGVhdXRob3J7RnJlZCBHYW5zZXZsZXN9e0ZyZWQuR2Fuc2V2bGVzQGNzLnV0d2VudGUubmx9Ci1cc2VjdGlvbmF1dGhvcntNb3NoZSBaYWRrYX17bW9zaGV6QHphZGthLnNpdGUuY28uaWx9Ci1cbW9kdWxlc3lub3BzaXN7SW50ZXJmYWNlIHRvIFN1bidzIE5JUyAoWWVsbG93IFBhZ2VzKSBsaWJyYXJ5Ln0KLQotVGhlIFxtb2R1bGV7bmlzfSBtb2R1bGUgZ2l2ZXMgYSB0aGluIHdyYXBwZXIgYXJvdW5kIHRoZSBOSVMgbGlicmFyeSwgdXNlZnVsCi1mb3IgY2VudHJhbCBhZG1pbmlzdHJhdGlvbiBvZiBzZXZlcmFsIGhvc3RzLgotCi1CZWNhdXNlIE5JUyBleGlzdHMgb25seSBvbiBcVU5JWHt9IHN5c3RlbXMsIHRoaXMgbW9kdWxlIGlzCi1vbmx5IGF2YWlsYWJsZSBmb3IgXFVOSVguCi0KLVRoZSBcbW9kdWxle25pc30gbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6Ci0KLVxiZWdpbntmdW5jZGVzY317bWF0Y2h9e2tleSwgbWFwbmFtZVssIGRvbWFpbj1kZWZhdWx0X2RvbWFpbl19Ci1SZXR1cm4gdGhlIG1hdGNoIGZvciBcdmFye2tleX0gaW4gbWFwIFx2YXJ7bWFwbmFtZX0sIG9yIHJhaXNlIGFuCi1lcnJvciAoXGV4Y2VwdGlvbntuaXMuZXJyb3J9KSBpZiB0aGVyZSBpcyBub25lLgotQm90aCBzaG91bGQgYmUgc3RyaW5ncywgXHZhcntrZXl9IGlzIDgtYml0IGNsZWFuLgotUmV0dXJuIHZhbHVlIGlzIGFuIGFyYml0cmFyeSBhcnJheSBvZiBieXRlcyAobWF5IGNvbnRhaW4gXGNvZGV7TlVMTH0KLWFuZCBvdGhlciBqb3lzKS4KLQotTm90ZSB0aGF0IFx2YXJ7bWFwbmFtZX0gaXMgZmlyc3QgY2hlY2tlZCBpZiBpdCBpcyBhbiBhbGlhcyB0byBhbm90aGVyCi1uYW1lLgotCi1cdmVyc2lvbmNoYW5nZWRbVGhlIFx2YXJ7ZG9tYWlufSBhcmd1bWVudCBhbGxvd3MgdG8gb3ZlcnJpZGUKLXRoZSBOSVMgZG9tYWluIHVzZWQgZm9yIHRoZSBsb29rdXAuIElmIHVuc3BlY2lmaWVkLCBsb29rdXAgaXMgaW4gdGhlCi1kZWZhdWx0IE5JUyBkb21haW5dezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y2F0fXttYXBuYW1lWywgZG9tYWluPWRlZmF1bHRfZG9tYWluXX0KLVJldHVybiBhIGRpY3Rpb25hcnkgbWFwcGluZyBcdmFye2tleX0gdG8gXHZhcnt2YWx1ZX0gc3VjaCB0aGF0Ci1cY29kZXttYXRjaChcdmFye2tleX0sIFx2YXJ7bWFwbmFtZX0pPT1cdmFye3ZhbHVlfX0uCi1Ob3RlIHRoYXQgYm90aCBrZXlzIGFuZCB2YWx1ZXMgb2YgdGhlIGRpY3Rpb25hcnkgYXJlIGFyYml0cmFyeQotYXJyYXlzIG9mIGJ5dGVzLgotCi1Ob3RlIHRoYXQgXHZhcnttYXBuYW1lfSBpcyBmaXJzdCBjaGVja2VkIGlmIGl0IGlzIGFuIGFsaWFzIHRvIGFub3RoZXIKLW5hbWUuCi0KLVx2ZXJzaW9uY2hhbmdlZFtUaGUgXHZhcntkb21haW59IGFyZ3VtZW50IGFsbG93cyB0byBvdmVycmlkZQotdGhlIE5JUyBkb21haW4gdXNlZCBmb3IgdGhlIGxvb2t1cC4gSWYgdW5zcGVjaWZpZWQsIGxvb2t1cCBpcyBpbiB0aGUKLWRlZmF1bHQgTklTIGRvbWFpbl17Mi41fQotXGVuZHtmdW5jZGVzY30KLQotIFxiZWdpbntmdW5jZGVzY317bWFwc317W2RvbWFpbj1kZWZhdWx0X2RvbWFpbl19Ci1SZXR1cm4gYSBsaXN0IG9mIGFsbCB2YWxpZCBtYXBzLgotCi1cdmVyc2lvbmNoYW5nZWRbVGhlIFx2YXJ7ZG9tYWlufSBhcmd1bWVudCBhbGxvd3MgdG8gb3ZlcnJpZGUKLXRoZSBOSVMgZG9tYWluIHVzZWQgZm9yIHRoZSBsb29rdXAuIElmIHVuc3BlY2lmaWVkLCBsb29rdXAgaXMgaW4gdGhlCi1kZWZhdWx0IE5JUyBkb21haW5dezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLSBcYmVnaW57ZnVuY2Rlc2N9e2dldF9kZWZhdWx0X2RvbWFpbn17fQotUmV0dXJuIHRoZSBzeXN0ZW0gZGVmYXVsdCBOSVMgZG9tYWluLiBcdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVRoZSBcbW9kdWxle25pc30gbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBleGNlcHRpb246Ci0KLVxiZWdpbntleGNkZXNjfXtlcnJvcn0KLUFuIGVycm9yIHJhaXNlZCB3aGVuIGEgTklTIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZS4KLVxlbmR7ZXhjZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlibm50cGxpYi50ZXggYi9Eb2MvbGliL2xpYm5udHBsaWIudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjIzNmY0Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlibm50cGxpYi50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwzNTUgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtubnRwbGlifSAtLS0KLSAgICAgICAgIE5OVFAgcHJvdG9jb2wgY2xpZW50fQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17bm50cGxpYn0KLVxtb2R1bGVzeW5vcHNpc3tOTlRQIHByb3RvY29sIGNsaWVudCAocmVxdWlyZXMgc29ja2V0cykufQotCi1caW5kZXhpaXtOTlRQfXtwcm90b2NvbH0KLVxpbmRleHtOZXR3b3JrIE5ld3MgVHJhbnNmZXIgUHJvdG9jb2x9Ci0KLVRoaXMgbW9kdWxlIGRlZmluZXMgdGhlIGNsYXNzIFxjbGFzc3tOTlRQfSB3aGljaCBpbXBsZW1lbnRzIHRoZSBjbGllbnQKLXNpZGUgb2YgdGhlIE5OVFAgcHJvdG9jb2wuICBJdCBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgYSBuZXdzIHJlYWRlcgotb3IgcG9zdGVyLCBvciBhdXRvbWF0ZWQgbmV3cyBwcm9jZXNzb3JzLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gTk5UUAotKE5ldHdvcmsgTmV3cyBUcmFuc2ZlciBQcm90b2NvbCksIHNlZSBJbnRlcm5ldCBccmZjezk3N30uCi0KLUhlcmUgYXJlIHR3byBzbWFsbCBleGFtcGxlcyBvZiBob3cgaXQgY2FuIGJlIHVzZWQuICBUbyBsaXN0IHNvbWUKLXN0YXRpc3RpY3MgYWJvdXQgYSBuZXdzZ3JvdXAgYW5kIHByaW50IHRoZSBzdWJqZWN0cyBvZiB0aGUgbGFzdCAxMAotYXJ0aWNsZXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBzID0gTk5UUCgnbmV3cy5jd2kubmwnKQotPj4+IHJlc3AsIGNvdW50LCBmaXJzdCwgbGFzdCwgbmFtZSA9IHMuZ3JvdXAoJ2NvbXAubGFuZy5weXRob24nKQotPj4+IHByaW50ICdHcm91cCcsIG5hbWUsICdoYXMnLCBjb3VudCwgJ2FydGljbGVzLCByYW5nZScsIGZpcnN0LCAndG8nLCBsYXN0Ci1Hcm91cCBjb21wLmxhbmcucHl0aG9uIGhhcyA1OSBhcnRpY2xlcywgcmFuZ2UgMzc0MiB0byAzODAzCi0+Pj4gcmVzcCwgc3VicyA9IHMueGhkcignc3ViamVjdCcsIGZpcnN0ICsgJy0nICsgbGFzdCkKLT4+PiBmb3IgaWQsIHN1YiBpbiBzdWJzWy0xMDpdOiBwcmludCBpZCwgc3ViCi0uLi4gCi0zNzkyIFJlOiBSZW1vdmluZyBlbGVtZW50cyBmcm9tIGEgbGlzdCB3aGlsZSBpdGVyYXRpbmcuLi4KLTM3OTMgUmU6IFdobyBsaWtlcyBJbmZvIGZpbGVzPwotMzc5NCBFbWFjcyBhbmQgZG9jIHN0cmluZ3MKLTM3OTUgYSBmZXcgcXVlc3Rpb25zIGFib3V0IHRoZSBNYWMgaW1wbGVtZW50YXRpb24KLTM3OTYgUmU6IGV4ZWN1dGFibGUgcHl0aG9uIHNjcmlwdHMKLTM3OTcgUmU6IGV4ZWN1dGFibGUgcHl0aG9uIHNjcmlwdHMKLTM3OTggUmU6IGEgZmV3IHF1ZXN0aW9ucyBhYm91dCB0aGUgTWFjIGltcGxlbWVudGF0aW9uIAotMzc5OSBSZTogUFJPUE9TQUw6IEEgR2VuZXJpYyBQeXRob24gT2JqZWN0IEludGVyZmFjZSBmb3IgUHl0aG9uIEMgTW9kdWxlcwotMzgwMiBSZTogZXhlY3V0YWJsZSBweXRob24gc2NyaXB0cyAKLTM4MDMgUmU6IFxQT1NJWHt9IHdhaXQgYW5kIFNJR0NITEQKLT4+PiBzLnF1aXQoKQotJzIwNSBuZXdzLmN3aS5ubCBjbG9zaW5nIGNvbm5lY3Rpb24uICBHb29kYnllLicKLVxlbmR7dmVyYmF0aW19Ci0KLVRvIHBvc3QgYW4gYXJ0aWNsZSBmcm9tIGEgZmlsZSAodGhpcyBhc3N1bWVzIHRoYXQgdGhlIGFydGljbGUgaGFzCi12YWxpZCBoZWFkZXJzKToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHMgPSBOTlRQKCduZXdzLmN3aS5ubCcpCi0+Pj4gZiA9IG9wZW4oJy90bXAvYXJ0aWNsZScpCi0+Pj4gcy5wb3N0KGYpCi0nMjQwIEFydGljbGUgcG9zdGVkIHN1Y2Nlc3NmdWxseS4nCi0+Pj4gcy5xdWl0KCkKLScyMDUgbmV3cy5jd2kubmwgY2xvc2luZyBjb25uZWN0aW9uLiAgR29vZGJ5ZS4nCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgbW9kdWxlIGl0c2VsZiBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgaXRlbXM6Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e05OVFB9e2hvc3Rcb3B0aW9uYWx7LCBwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICBcb3B0aW9uYWx7LCB1c2VyXG9wdGlvbmFseywgcGFzc3dvcmQKLQkJCVxvcHRpb25hbHssIHJlYWRlcm1vZGV9Ci0JCQlcb3B0aW9uYWx7LCB1c2VuZXRyY319fX19Ci1SZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFxjbGFzc3tOTlRQfSBjbGFzcywgcmVwcmVzZW50aW5nIGEKLWNvbm5lY3Rpb24gdG8gdGhlIE5OVFAgc2VydmVyIHJ1bm5pbmcgb24gaG9zdCBcdmFye2hvc3R9LCBsaXN0ZW5pbmcgYXQKLXBvcnQgXHZhcntwb3J0fS4gIFRoZSBkZWZhdWx0IFx2YXJ7cG9ydH0gaXMgMTE5LiAgSWYgdGhlIG9wdGlvbmFsCi1cdmFye3VzZXJ9IGFuZCBcdmFye3Bhc3N3b3JkfSBhcmUgcHJvdmlkZWQsIAotb3IgaWYgc3VpdGFibGUgY3JlZGVudGlhbHMgYXJlIHByZXNlbnQgaW4gXGZpbGV7fi8ubmV0cmN9IGFuZCB0aGUKLW9wdGlvbmFsIGZsYWcgXHZhcnt1c2VuZXRyY30gaXMgdHJ1ZSAodGhlIGRlZmF1bHQpLAotdGhlIFxzYW1we0FVVEhJTkZPIFVTRVJ9IGFuZCBcc2FtcHtBVVRISU5GTyBQQVNTfSBjb21tYW5kcyBhcmUgdXNlZCB0bwotaWRlbnRpZnkgYW5kIGF1dGhlbnRpY2F0ZSB0aGUgdXNlciB0byB0aGUgc2VydmVyLiAgSWYgdGhlIG9wdGlvbmFsCi1mbGFnIFx2YXJ7cmVhZGVybW9kZX0gaXMgdHJ1ZSwgdGhlbiBhIFxzYW1we21vZGUgcmVhZGVyfSBjb21tYW5kIGlzCi1zZW50IGJlZm9yZSBhdXRoZW50aWNhdGlvbiBpcyBwZXJmb3JtZWQuICBSZWFkZXIgbW9kZSBpcyBzb21ldGltZXMKLW5lY2Vzc2FyeSBpZiB5b3UgYXJlIGNvbm5lY3RpbmcgdG8gYW4gTk5UUCBzZXJ2ZXIgb24gdGhlIGxvY2FsIG1hY2hpbmUKLWFuZCBpbnRlbmQgdG8gY2FsbCByZWFkZXItc3BlY2lmaWMgY29tbWFuZHMsIHN1Y2ggYXMgXHNhbXB7Z3JvdXB9LiAgSWYKLXlvdSBnZXQgdW5leHBlY3RlZCBcZXhjZXB0aW9ue05OVFBQZXJtYW5lbnRFcnJvcn1zLCB5b3UgbWlnaHQgbmVlZCB0byBzZXQKLVx2YXJ7cmVhZGVybW9kZX0uICBcdmFye3JlYWRlcm1vZGV9IGRlZmF1bHRzIHRvIFxjb2Rle05vbmV9LgotXHZhcnt1c2VuZXRyY30gZGVmYXVsdHMgdG8gXGNvZGV7VHJ1ZX0uCi0KLVx2ZXJzaW9uY2hhbmdlZFtcdmFye3VzZW5ldHJjfSBhcmd1bWVudCBhZGRlZF17Mi40fQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtOTlRQRXJyb3J9Ci1EZXJpdmVkIGZyb20gdGhlIHN0YW5kYXJkIGV4Y2VwdGlvbiBcZXhjZXB0aW9ue0V4Y2VwdGlvbn0sIHRoaXMgaXMgdGhlCi1iYXNlIGNsYXNzIGZvciBhbGwgZXhjZXB0aW9ucyByYWlzZWQgYnkgdGhlIFxtb2R1bGV7bm50cGxpYn0gbW9kdWxlLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317Tk5UUFJlcGx5RXJyb3J9Ci1FeGNlcHRpb24gcmFpc2VkIHdoZW4gYW4gdW5leHBlY3RlZCByZXBseSBpcyByZWNlaXZlZCBmcm9tIHRoZQotc2VydmVyLiAgRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCB0aGUgZXhjZXB0aW9uIFxjb2Rle2Vycm9yX3JlcGx5fQotaXMgZXF1aXZhbGVudCB0byB0aGlzIGNsYXNzLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317Tk5UUFRlbXBvcmFyeUVycm9yfQotRXhjZXB0aW9uIHJhaXNlZCB3aGVuIGFuIGVycm9yIGNvZGUgaW4gdGhlIHJhbmdlIDQwMC0tNDk5IGlzCi1yZWNlaXZlZC4gIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdGhlIGV4Y2VwdGlvbgotXGNvZGV7ZXJyb3JfdGVtcH0gaXMgZXF1aXZhbGVudCB0byB0aGlzIGNsYXNzLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317Tk5UUFBlcm1hbmVudEVycm9yfQotRXhjZXB0aW9uIHJhaXNlZCB3aGVuIGFuIGVycm9yIGNvZGUgaW4gdGhlIHJhbmdlIDUwMC0tNTk5IGlzCi1yZWNlaXZlZC4gIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdGhlIGV4Y2VwdGlvbgotXGNvZGV7ZXJyb3JfcGVybX0gaXMgZXF1aXZhbGVudCB0byB0aGlzIGNsYXNzLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317Tk5UUFByb3RvY29sRXJyb3J9Ci1FeGNlcHRpb24gcmFpc2VkIHdoZW4gYSByZXBseSBpcyByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXIgdGhhdCBkb2VzCi1ub3QgYmVnaW4gd2l0aCBhIGRpZ2l0IGluIHRoZSByYW5nZSAxLS01LiAgRm9yIGJhY2t3YXJkcwotY29tcGF0aWJpbGl0eSwgdGhlIGV4Y2VwdGlvbiBcY29kZXtlcnJvcl9wcm90b30gaXMgZXF1aXZhbGVudCB0byB0aGlzCi1jbGFzcy4KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e05OVFBEYXRhRXJyb3J9Ci1FeGNlcHRpb24gcmFpc2VkIHdoZW4gdGhlcmUgaXMgc29tZSBlcnJvciBpbiB0aGUgcmVzcG9uc2UgZGF0YS4gIEZvcgotYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHRoZSBleGNlcHRpb24gXGNvZGV7ZXJyb3JfZGF0YX0gaXMKLWVxdWl2YWxlbnQgdG8gdGhpcyBjbGFzcy4KLVxlbmR7ZXhjZGVzY30KLQotCi1cc3Vic2VjdGlvbntOTlRQIE9iamVjdHMgXGxhYmVse25udHAtb2JqZWN0c319Ci0KLU5OVFAgaW5zdGFuY2VzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzLiAgVGhlIFx2YXJ7cmVzcG9uc2V9IHRoYXQgaXMKLXJldHVybmVkIGFzIHRoZSBmaXJzdCBpdGVtIGluIHRoZSByZXR1cm4gdHVwbGUgb2YgYWxtb3N0IGFsbCBtZXRob2RzCi1pcyB0aGUgc2VydmVyJ3MgcmVzcG9uc2U6IGEgc3RyaW5nIGJlZ2lubmluZyB3aXRoIGEgdGhyZWUtZGlnaXQgY29kZS4KLUlmIHRoZSBzZXJ2ZXIncyByZXNwb25zZSBpbmRpY2F0ZXMgYW4gZXJyb3IsIHRoZSBtZXRob2QgcmFpc2VzIG9uZSBvZgotdGhlIGFib3ZlIGV4Y2VwdGlvbnMuCi0KLQotXGJlZ2lue21ldGhvZGRlc2N9W05OVFBde2dldHdlbGNvbWV9e30KLVJldHVybiB0aGUgd2VsY29tZSBtZXNzYWdlIHNlbnQgYnkgdGhlIHNlcnZlciBpbiByZXBseSB0byB0aGUgaW5pdGlhbAotY29ubmVjdGlvbi4gIChUaGlzIG1lc3NhZ2Ugc29tZXRpbWVzIGNvbnRhaW5zIGRpc2NsYWltZXJzIG9yIGhlbHAKLWluZm9ybWF0aW9uIHRoYXQgbWF5IGJlIHJlbGV2YW50IHRvIHRoZSB1c2VyLikKLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W05OVFBde3NldF9kZWJ1Z2xldmVsfXtsZXZlbH0KLVNldCB0aGUgaW5zdGFuY2UncyBkZWJ1Z2dpbmcgbGV2ZWwuICBUaGlzIGNvbnRyb2xzIHRoZSBhbW91bnQgb2YKLWRlYnVnZ2luZyBvdXRwdXQgcHJpbnRlZC4gIFRoZSBkZWZhdWx0LCBcY29kZXswfSwgcHJvZHVjZXMgbm8gZGVidWdnaW5nCi1vdXRwdXQuICBBIHZhbHVlIG9mIFxjb2RlezF9IHByb2R1Y2VzIGEgbW9kZXJhdGUgYW1vdW50IG9mIGRlYnVnZ2luZwotb3V0cHV0LCBnZW5lcmFsbHkgYSBzaW5nbGUgbGluZSBwZXIgcmVxdWVzdCBvciByZXNwb25zZS4gIEEgdmFsdWUgb2YKLVxjb2RlezJ9IG9yIGhpZ2hlciBwcm9kdWNlcyB0aGUgbWF4aW11bSBhbW91bnQgb2YgZGVidWdnaW5nIG91dHB1dCwKLWxvZ2dpbmcgZWFjaCBsaW5lIHNlbnQgYW5kIHJlY2VpdmVkIG9uIHRoZSBjb25uZWN0aW9uIChpbmNsdWRpbmcKLW1lc3NhZ2UgdGV4dCkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtOTlRQXXtuZXdncm91cHN9e2RhdGUsIHRpbWUsIFxvcHRpb25hbHtmaWxlfX0KLVNlbmQgYSBcc2FtcHtORVdHUk9VUFN9IGNvbW1hbmQuICBUaGUgXHZhcntkYXRlfSBhcmd1bWVudCBzaG91bGQgYmUgYQotc3RyaW5nIG9mIHRoZSBmb3JtIFxjb2RleydcdmFye3l5fVx2YXJ7bW19XHZhcntkZH0nfSBpbmRpY2F0aW5nIHRoZQotZGF0ZSwgYW5kIFx2YXJ7dGltZX0gc2hvdWxkIGJlIGEgc3RyaW5nIG9mIHRoZSBmb3JtCi1cY29kZXsnXHZhcntoaH1cdmFye21tfVx2YXJ7c3N9J30gaW5kaWNhdGluZyB0aGUgdGltZS4gIFJldHVybiBhIHBhaXIKLVxjb2RleyhcdmFye3Jlc3BvbnNlfSwgXHZhcntncm91cHN9KX0gd2hlcmUgXHZhcntncm91cHN9IGlzIGEgbGlzdCBvZgotZ3JvdXAgbmFtZXMgdGhhdCBhcmUgbmV3IHNpbmNlIHRoZSBnaXZlbiBkYXRlIGFuZCB0aW1lLgotSWYgdGhlIFx2YXJ7ZmlsZX0gcGFyYW1ldGVyIGlzIHN1cHBsaWVkLCB0aGVuIHRoZSBvdXRwdXQgb2YgdGhlIAotXHNhbXB7TkVXR1JPVVBTfSBjb21tYW5kIGlzIHN0b3JlZCBpbiBhIGZpbGUuICBJZiBcdmFye2ZpbGV9IGlzIGEgc3RyaW5nLCAKLXRoZW4gdGhlIG1ldGhvZCB3aWxsIG9wZW4gYSBmaWxlIG9iamVjdCB3aXRoIHRoYXQgbmFtZSwgd3JpdGUgdG8gaXQgCi10aGVuIGNsb3NlIGl0LiAgSWYgXHZhcntmaWxlfSBpcyBhIGZpbGUgb2JqZWN0LCB0aGVuIGl0IHdpbGwgc3RhcnQKLWNhbGxpbmcgXG1ldGhvZHt3cml0ZSgpfSBvbiBpdCB0byBzdG9yZSB0aGUgbGluZXMgb2YgdGhlIGNvbW1hbmQgb3V0cHV0LgotSWYgXHZhcntmaWxlfSBpcyBzdXBwbGllZCwgdGhlbiB0aGUgcmV0dXJuZWQgXHZhcntsaXN0fSBpcyBhbiBlbXB0eSBsaXN0LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTk5UUF17bmV3bmV3c317Z3JvdXAsIGRhdGUsIHRpbWUsIFxvcHRpb25hbHtmaWxlfX0KLVNlbmQgYSBcc2FtcHtORVdORVdTfSBjb21tYW5kLiAgSGVyZSwgXHZhcntncm91cH0gaXMgYSBncm91cCBuYW1lIG9yCi1cY29kZXsnKid9LCBhbmQgXHZhcntkYXRlfSBhbmQgXHZhcnt0aW1lfSBoYXZlIHRoZSBzYW1lIG1lYW5pbmcgYXMgZm9yCi1cbWV0aG9ke25ld2dyb3VwcygpfS4gIFJldHVybiBhIHBhaXIgXGNvZGV7KFx2YXJ7cmVzcG9uc2V9LAotXHZhcnthcnRpY2xlc30pfSB3aGVyZSBcdmFye2FydGljbGVzfSBpcyBhIGxpc3Qgb2YgbWVzc2FnZSBpZHMuCi1JZiB0aGUgXHZhcntmaWxlfSBwYXJhbWV0ZXIgaXMgc3VwcGxpZWQsIHRoZW4gdGhlIG91dHB1dCBvZiB0aGUgCi1cc2FtcHtORVdORVdTfSBjb21tYW5kIGlzIHN0b3JlZCBpbiBhIGZpbGUuICBJZiBcdmFye2ZpbGV9IGlzIGEgc3RyaW5nLCAKLXRoZW4gdGhlIG1ldGhvZCB3aWxsIG9wZW4gYSBmaWxlIG9iamVjdCB3aXRoIHRoYXQgbmFtZSwgd3JpdGUgdG8gaXQgCi10aGVuIGNsb3NlIGl0LiAgSWYgXHZhcntmaWxlfSBpcyBhIGZpbGUgb2JqZWN0LCB0aGVuIGl0IHdpbGwgc3RhcnQKLWNhbGxpbmcgXG1ldGhvZHt3cml0ZSgpfSBvbiBpdCB0byBzdG9yZSB0aGUgbGluZXMgb2YgdGhlIGNvbW1hbmQgb3V0cHV0LgotSWYgXHZhcntmaWxlfSBpcyBzdXBwbGllZCwgdGhlbiB0aGUgcmV0dXJuZWQgXHZhcntsaXN0fSBpcyBhbiBlbXB0eSBsaXN0LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTk5UUF17bGlzdH17XG9wdGlvbmFse2ZpbGV9fQotU2VuZCBhIFxzYW1we0xJU1R9IGNvbW1hbmQuICBSZXR1cm4gYSBwYWlyIFxjb2RleyhcdmFye3Jlc3BvbnNlfSwKLVx2YXJ7bGlzdH0pfSB3aGVyZSBcdmFye2xpc3R9IGlzIGEgbGlzdCBvZiB0dXBsZXMuICBFYWNoIHR1cGxlIGhhcyB0aGUKLWZvcm0gXGNvZGV7KFx2YXJ7Z3JvdXB9LCBcdmFye2xhc3R9LCBcdmFye2ZpcnN0fSwgXHZhcntmbGFnfSl9LCB3aGVyZQotXHZhcntncm91cH0gaXMgYSBncm91cCBuYW1lLCBcdmFye2xhc3R9IGFuZCBcdmFye2ZpcnN0fSBhcmUgdGhlIGxhc3QKLWFuZCBmaXJzdCBhcnRpY2xlIG51bWJlcnMgKGFzIHN0cmluZ3MpLCBhbmQgXHZhcntmbGFnfSBpcwotXGNvZGV7J3knfSBpZiBwb3N0aW5nIGlzIGFsbG93ZWQsIFxjb2RleyduJ30gaWYgbm90LCBhbmQgXGNvZGV7J20nfSBpZgotdGhlIG5ld3Nncm91cCBpcyBtb2RlcmF0ZWQuICAoTm90ZSB0aGUgb3JkZXJpbmc6IFx2YXJ7bGFzdH0sCi1cdmFye2ZpcnN0fS4pCi1JZiB0aGUgXHZhcntmaWxlfSBwYXJhbWV0ZXIgaXMgc3VwcGxpZWQsIHRoZW4gdGhlIG91dHB1dCBvZiB0aGUgCi1cc2FtcHtMSVNUfSBjb21tYW5kIGlzIHN0b3JlZCBpbiBhIGZpbGUuICBJZiBcdmFye2ZpbGV9IGlzIGEgc3RyaW5nLCAKLXRoZW4gdGhlIG1ldGhvZCB3aWxsIG9wZW4gYSBmaWxlIG9iamVjdCB3aXRoIHRoYXQgbmFtZSwgd3JpdGUgdG8gaXQgCi10aGVuIGNsb3NlIGl0LiAgSWYgXHZhcntmaWxlfSBpcyBhIGZpbGUgb2JqZWN0LCB0aGVuIGl0IHdpbGwgc3RhcnQKLWNhbGxpbmcgXG1ldGhvZHt3cml0ZSgpfSBvbiBpdCB0byBzdG9yZSB0aGUgbGluZXMgb2YgdGhlIGNvbW1hbmQgb3V0cHV0LgotSWYgXHZhcntmaWxlfSBpcyBzdXBwbGllZCwgdGhlbiB0aGUgcmV0dXJuZWQgXHZhcntsaXN0fSBpcyBhbiBlbXB0eSBsaXN0LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTk5UUF17ZGVzY3JpcHRpb25zfXtncm91cHBhdHRlcm59Ci1TZW5kIGEgXHNhbXB7TElTVCBORVdTR1JPVVBTfSBjb21tYW5kLCB3aGVyZSBcdmFye2dyb3VwcGF0dGVybn0gaXMgYSB3aWxkbWF0Ci1zdHJpbmcgYXMgc3BlY2lmaWVkIGluIFJGQzI5ODAgKGl0J3MgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgRE9TIG9yIFVOSVgKLXNoZWxsIHdpbGRjYXJkIHN0cmluZ3MpLiAgUmV0dXJuIGEgcGFpciBcY29kZXsoXHZhcntyZXNwb25zZX0sCi1cdmFye2xpc3R9KX0sIHdoZXJlIFx2YXJ7bGlzdH0gaXMgYSBsaXN0IG9mIHR1cGxlcyBjb250YWluaW5nCi1cY29kZXsoXHZhcntuYW1lfSwgXHZhcnt0aXRsZX0pfS4KLQotXHZlcnNpb25hZGRlZHsyLjR9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtOTlRQXXtkZXNjcmlwdGlvbn17Z3JvdXB9Ci1HZXQgYSBkZXNjcmlwdGlvbiBmb3IgYSBzaW5nbGUgZ3JvdXAgXHZhcntncm91cH0uICBJZiBtb3JlIHRoYW4gb25lIGdyb3VwCi1tYXRjaGVzIChpZiAnZ3JvdXAnIGlzIGEgcmVhbCB3aWxkbWF0IHN0cmluZyksIHJldHVybiB0aGUgZmlyc3QgbWF0Y2guICAKLUlmIG5vIGdyb3VwIG1hdGNoZXMsIHJldHVybiBhbiBlbXB0eSBzdHJpbmcuCi0KLVRoaXMgZWxpZGVzIHRoZSByZXNwb25zZSBjb2RlIGZyb20gdGhlIHNlcnZlci4gIElmIHRoZSByZXNwb25zZSBjb2RlIGlzCi1uZWVkZWQsIHVzZSBcbWV0aG9ke2Rlc2NyaXB0aW9ucygpfS4KLQotXHZlcnNpb25hZGRlZHsyLjR9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtOTlRQXXtncm91cH17bmFtZX0KLVNlbmQgYSBcc2FtcHtHUk9VUH0gY29tbWFuZCwgd2hlcmUgXHZhcntuYW1lfSBpcyB0aGUgZ3JvdXAgbmFtZS4KLVJldHVybiBhIHR1cGxlIFxjb2RleyhcdmFye3Jlc3BvbnNlfSwgXHZhcntjb3VudH0sIFx2YXJ7Zmlyc3R9LAotXHZhcntsYXN0fSwgXHZhcntuYW1lfSl9IHdoZXJlIFx2YXJ7Y291bnR9IGlzIHRoZSAoZXN0aW1hdGVkKSBudW1iZXIKLW9mIGFydGljbGVzIGluIHRoZSBncm91cCwgXHZhcntmaXJzdH0gaXMgdGhlIGZpcnN0IGFydGljbGUgbnVtYmVyIGluCi10aGUgZ3JvdXAsIFx2YXJ7bGFzdH0gaXMgdGhlIGxhc3QgYXJ0aWNsZSBudW1iZXIgaW4gdGhlIGdyb3VwLCBhbmQKLVx2YXJ7bmFtZX0gaXMgdGhlIGdyb3VwIG5hbWUuICBUaGUgbnVtYmVycyBhcmUgcmV0dXJuZWQgYXMgc3RyaW5ncy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W05OVFBde2hlbHB9e1xvcHRpb25hbHtmaWxlfX0KLVNlbmQgYSBcc2FtcHtIRUxQfSBjb21tYW5kLiAgUmV0dXJuIGEgcGFpciBcY29kZXsoXHZhcntyZXNwb25zZX0sCi1cdmFye2xpc3R9KX0gd2hlcmUgXHZhcntsaXN0fSBpcyBhIGxpc3Qgb2YgaGVscCBzdHJpbmdzLgotSWYgdGhlIFx2YXJ7ZmlsZX0gcGFyYW1ldGVyIGlzIHN1cHBsaWVkLCB0aGVuIHRoZSBvdXRwdXQgb2YgdGhlIAotXHNhbXB7SEVMUH0gY29tbWFuZCBpcyBzdG9yZWQgaW4gYSBmaWxlLiAgSWYgXHZhcntmaWxlfSBpcyBhIHN0cmluZywgCi10aGVuIHRoZSBtZXRob2Qgd2lsbCBvcGVuIGEgZmlsZSBvYmplY3Qgd2l0aCB0aGF0IG5hbWUsIHdyaXRlIHRvIGl0IAotdGhlbiBjbG9zZSBpdC4gIElmIFx2YXJ7ZmlsZX0gaXMgYSBmaWxlIG9iamVjdCwgdGhlbiBpdCB3aWxsIHN0YXJ0Ci1jYWxsaW5nIFxtZXRob2R7d3JpdGUoKX0gb24gaXQgdG8gc3RvcmUgdGhlIGxpbmVzIG9mIHRoZSBjb21tYW5kIG91dHB1dC4KLUlmIFx2YXJ7ZmlsZX0gaXMgc3VwcGxpZWQsIHRoZW4gdGhlIHJldHVybmVkIFx2YXJ7bGlzdH0gaXMgYW4gZW1wdHkgbGlzdC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W05OVFBde3N0YXR9e2lkfQotU2VuZCBhIFxzYW1we1NUQVR9IGNvbW1hbmQsIHdoZXJlIFx2YXJ7aWR9IGlzIHRoZSBtZXNzYWdlIGlkIChlbmNsb3NlZAotaW4gXGNoYXJhY3Rlcns8fSBhbmQgXGNoYXJhY3Rlcns+fSkgb3IgYW4gYXJ0aWNsZSBudW1iZXIgKGFzIGEgc3RyaW5nKS4KLVJldHVybiBhIHRyaXBsZSBcY29kZXsoXHZhcntyZXNwb25zZX0sIFx2YXJ7bnVtYmVyfSwgXHZhcntpZH0pfSB3aGVyZQotXHZhcntudW1iZXJ9IGlzIHRoZSBhcnRpY2xlIG51bWJlciAoYXMgYSBzdHJpbmcpIGFuZCBcdmFye2lkfSBpcyB0aGUKLW1lc3NhZ2UgaWQgIChlbmNsb3NlZCBpbiBcY2hhcmFjdGVyezx9IGFuZCBcY2hhcmFjdGVyez59KS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W05OVFBde25leHR9e30KLVNlbmQgYSBcc2FtcHtORVhUfSBjb21tYW5kLiAgUmV0dXJuIGFzIGZvciBcbWV0aG9ke3N0YXQoKX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtOTlRQXXtsYXN0fXt9Ci1TZW5kIGEgXHNhbXB7TEFTVH0gY29tbWFuZC4gIFJldHVybiBhcyBmb3IgXG1ldGhvZHtzdGF0KCl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTk5UUF17aGVhZH17aWR9Ci1TZW5kIGEgXHNhbXB7SEVBRH0gY29tbWFuZCwgd2hlcmUgXHZhcntpZH0gaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgZm9yCi1cbWV0aG9ke3N0YXQoKX0uICBSZXR1cm4gYSB0dXBsZQotXGNvZGV7KFx2YXJ7cmVzcG9uc2V9LCBcdmFye251bWJlcn0sIFx2YXJ7aWR9LCBcdmFye2xpc3R9KX0KLXdoZXJlIHRoZSBmaXJzdCB0aHJlZSBhcmUgdGhlIHNhbWUgYXMgZm9yIFxtZXRob2R7c3RhdCgpfSwKLWFuZCBcdmFye2xpc3R9IGlzIGEgbGlzdCBvZiB0aGUgYXJ0aWNsZSdzIGhlYWRlcnMgKGFuIHVuaW50ZXJwcmV0ZWQKLWxpc3Qgb2YgbGluZXMsIHdpdGhvdXQgdHJhaWxpbmcgbmV3bGluZXMpLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTk5UUF17Ym9keX17aWQsXG9wdGlvbmFse2ZpbGV9fQotU2VuZCBhIFxzYW1we0JPRFl9IGNvbW1hbmQsIHdoZXJlIFx2YXJ7aWR9IGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIGZvcgotXG1ldGhvZHtzdGF0KCl9LiAgSWYgdGhlIFx2YXJ7ZmlsZX0gcGFyYW1ldGVyIGlzIHN1cHBsaWVkLCB0aGVuCi10aGUgYm9keSBpcyBzdG9yZWQgaW4gYSBmaWxlLiAgSWYgXHZhcntmaWxlfSBpcyBhIHN0cmluZywgdGhlbgotdGhlIG1ldGhvZCB3aWxsIG9wZW4gYSBmaWxlIG9iamVjdCB3aXRoIHRoYXQgbmFtZSwgd3JpdGUgdG8gaXQgdGhlbiBjbG9zZSBpdC4KLUlmIFx2YXJ7ZmlsZX0gaXMgYSBmaWxlIG9iamVjdCwgdGhlbiBpdCB3aWxsIHN0YXJ0IGNhbGxpbmcKLVxtZXRob2R7d3JpdGUoKX0gb24gaXQgdG8gc3RvcmUgdGhlIGxpbmVzIG9mIHRoZSBib2R5LgotUmV0dXJuIGFzIGZvciBcbWV0aG9ke2hlYWQoKX0uICBJZiBcdmFye2ZpbGV9IGlzIHN1cHBsaWVkLCB0aGVuCi10aGUgcmV0dXJuZWQgXHZhcntsaXN0fSBpcyBhbiBlbXB0eSBsaXN0LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTk5UUF17YXJ0aWNsZX17aWR9Ci1TZW5kIGFuIFxzYW1we0FSVElDTEV9IGNvbW1hbmQsIHdoZXJlIFx2YXJ7aWR9IGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzCi1mb3IgXG1ldGhvZHtzdGF0KCl9LiAgUmV0dXJuIGFzIGZvciBcbWV0aG9ke2hlYWQoKX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtOTlRQXXtzbGF2ZX17fQotU2VuZCBhIFxzYW1we1NMQVZFfSBjb21tYW5kLiAgUmV0dXJuIHRoZSBzZXJ2ZXIncyBcdmFye3Jlc3BvbnNlfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W05OVFBde3hoZHJ9e2hlYWRlciwgc3RyaW5nLCBcb3B0aW9uYWx7ZmlsZX19Ci1TZW5kIGFuIFxzYW1we1hIRFJ9IGNvbW1hbmQuICBUaGlzIGNvbW1hbmQgaXMgbm90IGRlZmluZWQgaW4gdGhlIFJGQwotYnV0IGlzIGEgY29tbW9uIGV4dGVuc2lvbi4gIFRoZSBcdmFye2hlYWRlcn0gYXJndW1lbnQgaXMgYSBoZWFkZXIKLWtleXdvcmQsIGUuZy4gXGNvZGV7J3N1YmplY3QnfS4gIFRoZSBcdmFye3N0cmluZ30gYXJndW1lbnQgc2hvdWxkIGhhdmUKLXRoZSBmb3JtIFxjb2RleydcdmFye2ZpcnN0fS1cdmFye2xhc3R9J30gd2hlcmUgXHZhcntmaXJzdH0gYW5kCi1cdmFye2xhc3R9IGFyZSB0aGUgZmlyc3QgYW5kIGxhc3QgYXJ0aWNsZSBudW1iZXJzIHRvIHNlYXJjaC4gIFJldHVybiBhCi1wYWlyIFxjb2RleyhcdmFye3Jlc3BvbnNlfSwgXHZhcntsaXN0fSl9LCB3aGVyZSBcdmFye2xpc3R9IGlzIGEgbGlzdCBvZgotcGFpcnMgXGNvZGV7KFx2YXJ7aWR9LCBcdmFye3RleHR9KX0sIHdoZXJlIFx2YXJ7aWR9IGlzIGFuIGFydGljbGUgbnVtYmVyCi0oYXMgYSBzdHJpbmcpIGFuZCBcdmFye3RleHR9IGlzIHRoZSB0ZXh0IG9mIHRoZSByZXF1ZXN0ZWQgaGVhZGVyIGZvcgotdGhhdCBhcnRpY2xlLgotSWYgdGhlIFx2YXJ7ZmlsZX0gcGFyYW1ldGVyIGlzIHN1cHBsaWVkLCB0aGVuIHRoZSBvdXRwdXQgb2YgdGhlIAotXHNhbXB7WEhEUn0gY29tbWFuZCBpcyBzdG9yZWQgaW4gYSBmaWxlLiAgSWYgXHZhcntmaWxlfSBpcyBhIHN0cmluZywgCi10aGVuIHRoZSBtZXRob2Qgd2lsbCBvcGVuIGEgZmlsZSBvYmplY3Qgd2l0aCB0aGF0IG5hbWUsIHdyaXRlIHRvIGl0IAotdGhlbiBjbG9zZSBpdC4gIElmIFx2YXJ7ZmlsZX0gaXMgYSBmaWxlIG9iamVjdCwgdGhlbiBpdCB3aWxsIHN0YXJ0Ci1jYWxsaW5nIFxtZXRob2R7d3JpdGUoKX0gb24gaXQgdG8gc3RvcmUgdGhlIGxpbmVzIG9mIHRoZSBjb21tYW5kIG91dHB1dC4KLUlmIFx2YXJ7ZmlsZX0gaXMgc3VwcGxpZWQsIHRoZW4gdGhlIHJldHVybmVkIFx2YXJ7bGlzdH0gaXMgYW4gZW1wdHkgbGlzdC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W05OVFBde3Bvc3R9e2ZpbGV9Ci1Qb3N0IGFuIGFydGljbGUgdXNpbmcgdGhlIFxzYW1we1BPU1R9IGNvbW1hbmQuICBUaGUgXHZhcntmaWxlfQotYXJndW1lbnQgaXMgYW4gb3BlbiBmaWxlIG9iamVjdCB3aGljaCBpcyByZWFkIHVudGlsIEVPRiB1c2luZyBpdHMKLVxtZXRob2R7cmVhZGxpbmUoKX0gbWV0aG9kLiAgSXQgc2hvdWxkIGJlIGEgd2VsbC1mb3JtZWQgbmV3cyBhcnRpY2xlLAotaW5jbHVkaW5nIHRoZSByZXF1aXJlZCBoZWFkZXJzLiAgVGhlIFxtZXRob2R7cG9zdCgpfSBtZXRob2QKLWF1dG9tYXRpY2FsbHkgZXNjYXBlcyBsaW5lcyBiZWdpbm5pbmcgd2l0aCBcc2FtcHsufS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W05OVFBde2loYXZlfXtpZCwgZmlsZX0KLVNlbmQgYW4gXHNhbXB7SUhBVkV9IGNvbW1hbmQuIFx2YXJ7aWR9IGlzIGEgbWVzc2FnZSBpZCAoZW5jbG9zZWQgaW4gCi1cY2hhcmFjdGVyezx9IGFuZCBcY2hhcmFjdGVyez59KS4KLUlmIHRoZSByZXNwb25zZSBpcyBub3QgYW4gZXJyb3IsIHRyZWF0Ci1cdmFye2ZpbGV9IGV4YWN0bHkgYXMgZm9yIHRoZSBcbWV0aG9ke3Bvc3QoKX0gbWV0aG9kLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTk5UUF17ZGF0ZX17fQotUmV0dXJuIGEgdHJpcGxlIFxjb2RleyhcdmFye3Jlc3BvbnNlfSwgXHZhcntkYXRlfSwgXHZhcnt0aW1lfSl9LAotY29udGFpbmluZyB0aGUgY3VycmVudCBkYXRlIGFuZCB0aW1lIGluIGEgZm9ybSBzdWl0YWJsZSBmb3IgdGhlCi1cbWV0aG9ke25ld25ld3MoKX0gYW5kIFxtZXRob2R7bmV3Z3JvdXBzKCl9IG1ldGhvZHMuCi1UaGlzIGlzIGFuIG9wdGlvbmFsIE5OVFAgZXh0ZW5zaW9uLCBhbmQgbWF5IG5vdCBiZSBzdXBwb3J0ZWQgYnkgYWxsCi1zZXJ2ZXJzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTk5UUF17eGd0aXRsZX17bmFtZSwgXG9wdGlvbmFse2ZpbGV9fQotUHJvY2VzcyBhbiBcc2FtcHtYR1RJVExFfSBjb21tYW5kLCByZXR1cm5pbmcgYSBwYWlyIFxjb2RleyhcdmFye3Jlc3BvbnNlfSwKLVx2YXJ7bGlzdH0pfSwgd2hlcmUgXHZhcntsaXN0fSBpcyBhIGxpc3Qgb2YgdHVwbGVzIGNvbnRhaW5pbmcKLVxjb2RleyhcdmFye25hbWV9LCBcdmFye3RpdGxlfSl9LgotJSBYWFggaHVoPyAgU2hvdWxkIHRoYXQgYmUgbmFtZSwgZGVzY3JpcHRpb24/Ci1JZiB0aGUgXHZhcntmaWxlfSBwYXJhbWV0ZXIgaXMgc3VwcGxpZWQsIHRoZW4gdGhlIG91dHB1dCBvZiB0aGUgCi1cc2FtcHtYR1RJVExFfSBjb21tYW5kIGlzIHN0b3JlZCBpbiBhIGZpbGUuICBJZiBcdmFye2ZpbGV9IGlzIGEgc3RyaW5nLCAKLXRoZW4gdGhlIG1ldGhvZCB3aWxsIG9wZW4gYSBmaWxlIG9iamVjdCB3aXRoIHRoYXQgbmFtZSwgd3JpdGUgdG8gaXQgCi10aGVuIGNsb3NlIGl0LiAgSWYgXHZhcntmaWxlfSBpcyBhIGZpbGUgb2JqZWN0LCB0aGVuIGl0IHdpbGwgc3RhcnQKLWNhbGxpbmcgXG1ldGhvZHt3cml0ZSgpfSBvbiBpdCB0byBzdG9yZSB0aGUgbGluZXMgb2YgdGhlIGNvbW1hbmQgb3V0cHV0LgotSWYgXHZhcntmaWxlfSBpcyBzdXBwbGllZCwgdGhlbiB0aGUgcmV0dXJuZWQgXHZhcntsaXN0fSBpcyBhbiBlbXB0eSBsaXN0LgotVGhpcyBpcyBhbiBvcHRpb25hbCBOTlRQIGV4dGVuc2lvbiwgYW5kIG1heSBub3QgYmUgc3VwcG9ydGVkIGJ5IGFsbAotc2VydmVycy4KLQotUkZDMjk4MCBzYXlzIGBgSXQgaXMgc3VnZ2VzdGVkIHRoYXQgdGhpcyBleHRlbnNpb24gYmUgZGVwcmVjYXRlZCcnLiAgVXNlCi1cbWV0aG9ke2Rlc2NyaXB0aW9ucygpfSBvciBcbWV0aG9ke2Rlc2NyaXB0aW9uKCl9IGluc3RlYWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtOTlRQXXt4b3Zlcn17c3RhcnQsIGVuZCwgXG9wdGlvbmFse2ZpbGV9fQotUmV0dXJuIGEgcGFpciBcY29kZXsoXHZhcntyZXNwfSwgXHZhcntsaXN0fSl9LiAgXHZhcntsaXN0fSBpcyBhIGxpc3QKLW9mIHR1cGxlcywgb25lIGZvciBlYWNoIGFydGljbGUgaW4gdGhlIHJhbmdlIGRlbGltaXRlZCBieSB0aGUgXHZhcntzdGFydH0KLWFuZCBcdmFye2VuZH0gYXJ0aWNsZSBudW1iZXJzLiAgRWFjaCB0dXBsZSBpcyBvZiB0aGUgZm9ybQotXGNvZGV7KFx2YXJ7YXJ0aWNsZSBudW1iZXJ9LCBcdmFye3N1YmplY3R9LCBcdmFye3Bvc3Rlcn0sIFx2YXJ7ZGF0ZX0sCi1cdmFye2lkfSwgXHZhcntyZWZlcmVuY2VzfSwgXHZhcntzaXplfSwgXHZhcntsaW5lc30pfS4KLUlmIHRoZSBcdmFye2ZpbGV9IHBhcmFtZXRlciBpcyBzdXBwbGllZCwgdGhlbiB0aGUgb3V0cHV0IG9mIHRoZSAKLVxzYW1we1hPVkVSfSBjb21tYW5kIGlzIHN0b3JlZCBpbiBhIGZpbGUuICBJZiBcdmFye2ZpbGV9IGlzIGEgc3RyaW5nLCAKLXRoZW4gdGhlIG1ldGhvZCB3aWxsIG9wZW4gYSBmaWxlIG9iamVjdCB3aXRoIHRoYXQgbmFtZSwgd3JpdGUgdG8gaXQgCi10aGVuIGNsb3NlIGl0LiAgSWYgXHZhcntmaWxlfSBpcyBhIGZpbGUgb2JqZWN0LCB0aGVuIGl0IHdpbGwgc3RhcnQKLWNhbGxpbmcgXG1ldGhvZHt3cml0ZSgpfSBvbiBpdCB0byBzdG9yZSB0aGUgbGluZXMgb2YgdGhlIGNvbW1hbmQgb3V0cHV0LgotSWYgXHZhcntmaWxlfSBpcyBzdXBwbGllZCwgdGhlbiB0aGUgcmV0dXJuZWQgXHZhcntsaXN0fSBpcyBhbiBlbXB0eSBsaXN0LgotVGhpcyBpcyBhbiBvcHRpb25hbCBOTlRQIGV4dGVuc2lvbiwgYW5kIG1heSBub3QgYmUgc3VwcG9ydGVkIGJ5IGFsbAotc2VydmVycy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W05OVFBde3hwYXRofXtpZH0KLVJldHVybiBhIHBhaXIgXGNvZGV7KFx2YXJ7cmVzcH0sIFx2YXJ7cGF0aH0pfSwgd2hlcmUgXHZhcntwYXRofSBpcyB0aGUKLWRpcmVjdG9yeSBwYXRoIHRvIHRoZSBhcnRpY2xlIHdpdGggbWVzc2FnZSBJRCBcdmFye2lkfS4gIFRoaXMgaXMgYW4KLW9wdGlvbmFsIE5OVFAgZXh0ZW5zaW9uLCBhbmQgbWF5IG5vdCBiZSBzdXBwb3J0ZWQgYnkgYWxsIHNlcnZlcnMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtOTlRQXXtxdWl0fXt9Ci1TZW5kIGEgXHNhbXB7UVVJVH0gY29tbWFuZCBhbmQgY2xvc2UgdGhlIGNvbm5lY3Rpb24uICBPbmNlIHRoaXMgbWV0aG9kCi1oYXMgYmVlbiBjYWxsZWQsIG5vIG90aGVyIG1ldGhvZHMgb2YgdGhlIE5OVFAgb2JqZWN0IHNob3VsZCBiZSBjYWxsZWQuCi1cZW5ke21ldGhvZGRlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYm9ianMudGV4IGIvRG9jL2xpYi9saWJvYmpzLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M3ZDc5OC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYm9ianMudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotXGNoYXB0ZXJ7QnVpbHQtaW4gT2JqZWN0cyBcbGFiZWx7YnVpbHRpbn19Ci0KLU5hbWVzIGZvciBidWlsdC1pbiBleGNlcHRpb25zIGFuZCBmdW5jdGlvbnMgYW5kIGEgbnVtYmVyIG9mIGNvbnN0YW50cyBhcmUKLWZvdW5kIGluIGEgc2VwYXJhdGUgCi1zeW1ib2wgdGFibGUuICBUaGlzIHRhYmxlIGlzIHNlYXJjaGVkIGxhc3Qgd2hlbiB0aGUgaW50ZXJwcmV0ZXIgbG9va3MKLXVwIHRoZSBtZWFuaW5nIG9mIGEgbmFtZSwgc28gbG9jYWwgYW5kIGdsb2JhbAotdXNlci1kZWZpbmVkIG5hbWVzIGNhbiBvdmVycmlkZSBidWlsdC1pbiBuYW1lcy4gIEJ1aWx0LWluIHR5cGVzIGFyZQotZGVzY3JpYmVkIHRvZ2V0aGVyIGhlcmUgZm9yIGVhc3kgcmVmZXJlbmNlLlxmb290bm90ZXsKLQlNb3N0IGRlc2NyaXB0aW9ucyBzb3JlbHkgbGFjayBleHBsYW5hdGlvbnMgb2YgdGhlIGV4Y2VwdGlvbnMKLQl0aGF0IG1heSBiZSByYWlzZWQgLS0tIHRoaXMgd2lsbCBiZSBmaXhlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mCi0JdGhpcyBtYW51YWwufQotXGluZGV4aWl7YnVpbHQtaW59e3R5cGVzfQotXGluZGV4aWl7YnVpbHQtaW59e2V4Y2VwdGlvbnN9Ci1caW5kZXhpaXtidWlsdC1pbn17ZnVuY3Rpb25zfQotXGluZGV4aWl7YnVpbHQtaW59e2NvbnN0YW50c30KLVxpbmRleHtzeW1ib2wgdGFibGV9Ci0KLVRoZSB0YWJsZXMgaW4gdGhpcyBjaGFwdGVyIGRvY3VtZW50IHRoZSBwcmlvcml0aWVzIG9mIG9wZXJhdG9ycyBieQotbGlzdGluZyB0aGVtIGluIG9yZGVyIG9mIGFzY2VuZGluZyBwcmlvcml0eSAod2l0aGluIGEgdGFibGUpIGFuZAotZ3JvdXBpbmcgb3BlcmF0b3JzIHRoYXQgaGF2ZSB0aGUgc2FtZSBwcmlvcml0eSBpbiB0aGUgc2FtZSBib3guCi1CaW5hcnkgb3BlcmF0b3JzIG9mIHRoZSBzYW1lIHByaW9yaXR5IGdyb3VwIGZyb20gbGVmdCB0byByaWdodC4KLShVbmFyeSBvcGVyYXRvcnMgZ3JvdXAgZnJvbSByaWdodCB0byBsZWZ0LCBidXQgdGhlcmUgeW91IGhhdmUgbm8gcmVhbAotY2hvaWNlLikgIFNlZSBjaGFwdGVyIDUgb2YgdGhlIFxjaXRldGl0bGVbLi4vcmVmL3JlZi5odG1sXXtQeXRob24KLVJlZmVyZW5jZSBNYW51YWx9IGZvciB0aGUgY29tcGxldGUgcGljdHVyZSBvbiBvcGVyYXRvciBwcmlvcml0aWVzLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJvcGVyYXRvci50ZXggYi9Eb2MvbGliL2xpYm9wZXJhdG9yLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY3YzJhYi4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYm9wZXJhdG9yLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDUzMCArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle29wZXJhdG9yfSAtLS0KLSAgICAgICAgIFN0YW5kYXJkIG9wZXJhdG9ycyBhcyBmdW5jdGlvbnMufQotXGRlY2xhcmVtb2R1bGV7YnVpbHRpbn17b3BlcmF0b3J9Ci1cc2VjdGlvbmF1dGhvcntTa2lwIE1vbnRhbmFyb317c2tpcEBhdXRvbWF0cml4LmNvbX0KLQotXG1vZHVsZXN5bm9wc2lze0FsbCBQeXRob24ncyBzdGFuZGFyZCBvcGVyYXRvcnMgYXMgYnVpbHQtaW4gZnVuY3Rpb25zLn0KLQotCi1UaGUgXG1vZHVsZXtvcGVyYXRvcn0gbW9kdWxlIGV4cG9ydHMgYSBzZXQgb2YgZnVuY3Rpb25zIGltcGxlbWVudGVkIGluIEMKLWNvcnJlc3BvbmRpbmcgdG8gdGhlIGludHJpbnNpYyBvcGVyYXRvcnMgb2YgUHl0aG9uLiAgRm9yIGV4YW1wbGUsCi1cY29kZXtvcGVyYXRvci5hZGQoeCwgeSl9IGlzIGVxdWl2YWxlbnQgdG8gdGhlIGV4cHJlc3Npb24gXGNvZGV7eCt5fS4gIFRoZQotZnVuY3Rpb24gbmFtZXMgYXJlIHRob3NlIHVzZWQgZm9yIHNwZWNpYWwgY2xhc3MgbWV0aG9kczsgdmFyaWFudHMgd2l0aG91dAotbGVhZGluZyBhbmQgdHJhaWxpbmcgXHNhbXB7X199IGFyZSBhbHNvIHByb3ZpZGVkIGZvciBjb252ZW5pZW5jZS4KLQotVGhlIGZ1bmN0aW9ucyBmYWxsIGludG8gY2F0ZWdvcmllcyB0aGF0IHBlcmZvcm0gb2JqZWN0IGNvbXBhcmlzb25zLAotbG9naWNhbCBvcGVyYXRpb25zLCBtYXRoZW1hdGljYWwgb3BlcmF0aW9ucywgc2VxdWVuY2Ugb3BlcmF0aW9ucywgYW5kCi1hYnN0cmFjdCB0eXBlIHRlc3RzLgotCi1UaGUgb2JqZWN0IGNvbXBhcmlzb24gZnVuY3Rpb25zIGFyZSB1c2VmdWwgZm9yIGFsbCBvYmplY3RzLCBhbmQgYXJlCi1uYW1lZCBhZnRlciB0aGUgcmljaCBjb21wYXJpc29uIG9wZXJhdG9ycyB0aGV5IHN1cHBvcnQ6Ci0KLVxiZWdpbntmdW5jZGVzY317bHR9e2EsIGJ9Ci1cZnVuY2xpbmV7bGV9e2EsIGJ9Ci1cZnVuY2xpbmV7ZXF9e2EsIGJ9Ci1cZnVuY2xpbmV7bmV9e2EsIGJ9Ci1cZnVuY2xpbmV7Z2V9e2EsIGJ9Ci1cZnVuY2xpbmV7Z3R9e2EsIGJ9Ci1cZnVuY2xpbmV7X19sdF9ffXthLCBifQotXGZ1bmNsaW5le19fbGVfX317YSwgYn0KLVxmdW5jbGluZXtfX2VxX199e2EsIGJ9Ci1cZnVuY2xpbmV7X19uZV9ffXthLCBifQotXGZ1bmNsaW5le19fZ2VfX317YSwgYn0KLVxmdW5jbGluZXtfX2d0X199e2EsIGJ9Ci1QZXJmb3JtIGBgcmljaCBjb21wYXJpc29ucycnIGJldHdlZW4gXHZhcnthfSBhbmQgXHZhcntifS4gU3BlY2lmaWNhbGx5LAotXGNvZGV7bHQoXHZhcnthfSwgXHZhcntifSl9IGlzIGVxdWl2YWxlbnQgdG8gXGNvZGV7XHZhcnthfSA8IFx2YXJ7Yn19LAotXGNvZGV7bGUoXHZhcnthfSwgXHZhcntifSl9IGlzIGVxdWl2YWxlbnQgdG8gXGNvZGV7XHZhcnthfSA8PSBcdmFye2J9fSwKLVxjb2Rle2VxKFx2YXJ7YX0sIFx2YXJ7Yn0pfSBpcyBlcXVpdmFsZW50IHRvIFxjb2Rle1x2YXJ7YX0gPT0gXHZhcntifX0sCi1cY29kZXtuZShcdmFye2F9LCBcdmFye2J9KX0gaXMgZXF1aXZhbGVudCB0byBcY29kZXtcdmFye2F9ICE9IFx2YXJ7Yn19LAotXGNvZGV7Z3QoXHZhcnthfSwgXHZhcntifSl9IGlzIGVxdWl2YWxlbnQgdG8gXGNvZGV7XHZhcnthfSA+IFx2YXJ7Yn19Ci1hbmQKLVxjb2Rle2dlKFx2YXJ7YX0sIFx2YXJ7Yn0pfSBpcyBlcXVpdmFsZW50IHRvIFxjb2Rle1x2YXJ7YX0gPj0gXHZhcntifX0uCi1Ob3RlIHRoYXQgdW5saWtlIHRoZSBidWlsdC1pbiBcZnVuY3Rpb257Y21wKCl9LCB0aGVzZSBmdW5jdGlvbnMgY2FuCi1yZXR1cm4gYW55IHZhbHVlLCB3aGljaCBtYXkgb3IgbWF5IG5vdCBiZSBpbnRlcnByZXRhYmxlIGFzIGEgQm9vbGVhbgotdmFsdWUuICBTZWUgdGhlIFxjaXRldGl0bGVbLi4vcmVmL3JlZi5odG1sXXtQeXRob24gUmVmZXJlbmNlIE1hbnVhbH0KLWZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHJpY2ggY29tcGFyaXNvbnMuCi1cdmVyc2lvbmFkZGVkezIuMn0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotVGhlIGxvZ2ljYWwgb3BlcmF0aW9ucyBhcmUgYWxzbyBnZW5lcmFsbHkgYXBwbGljYWJsZSB0byBhbGwgb2JqZWN0cywKLWFuZCBzdXBwb3J0IHRydXRoIHRlc3RzLCBpZGVudGl0eSB0ZXN0cywgYW5kIGJvb2xlYW4gb3BlcmF0aW9uczoKLQotXGJlZ2lue2Z1bmNkZXNjfXtub3RffXtvfQotXGZ1bmNsaW5le19fbm90X199e299Ci1SZXR1cm4gdGhlIG91dGNvbWUgb2YgXGtleXdvcmR7bm90fSBcdmFye299LiAgKE5vdGUgdGhhdCB0aGVyZSBpcyBubwotXG1ldGhvZHtfX25vdF9fKCl9IG1ldGhvZCBmb3Igb2JqZWN0IGluc3RhbmNlczsgb25seSB0aGUgaW50ZXJwcmV0ZXIKLWNvcmUgZGVmaW5lcyB0aGlzIG9wZXJhdGlvbi4gIFRoZSByZXN1bHQgaXMgYWZmZWN0ZWQgYnkgdGhlCi1cbWV0aG9ke19fYm9vbF9fKCl9IGFuZCBcbWV0aG9ke19fbGVuX18oKX0gbWV0aG9kcy4pCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3RydXRofXtvfQotUmV0dXJuIFxjb25zdGFudHtUcnVlfSBpZiBcdmFye299IGlzIHRydWUsIGFuZCBcY29uc3RhbnR7RmFsc2V9Ci1vdGhlcndpc2UuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdXNpbmcgdGhlIFxjbGFzc3tib29sfQotY29uc3RydWN0b3IuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2lzX317YSwgYn0KLVJldHVybiBcY29kZXtcdmFye2F9IGlzIFx2YXJ7Yn19LiAgVGVzdHMgb2JqZWN0IGlkZW50aXR5LgotXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2lzX25vdH17YSwgYn0KLVJldHVybiBcY29kZXtcdmFye2F9IGlzIG5vdCBcdmFye2J9fS4gIFRlc3RzIG9iamVjdCBpZGVudGl0eS4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtmdW5jZGVzY30KLQotCi1UaGUgbWF0aGVtYXRpY2FsIGFuZCBiaXR3aXNlIG9wZXJhdGlvbnMgYXJlIHRoZSBtb3N0IG51bWVyb3VzOgotCi1cYmVnaW57ZnVuY2Rlc2N9e2Fic317b30KLVxmdW5jbGluZXtfX2Fic19ffXtvfQotUmV0dXJuIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBcdmFye299LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXthZGR9e2EsIGJ9Ci1cZnVuY2xpbmV7X19hZGRfX317YSwgYn0KLVJldHVybiBcdmFye2F9IFxjb2Rleyt9IFx2YXJ7Yn0sIGZvciBcdmFye2F9IGFuZCBcdmFye2J9IG51bWJlcnMuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2FuZF99e2EsIGJ9Ci1cZnVuY2xpbmV7X19hbmRfX317YSwgYn0KLVJldHVybiB0aGUgYml0d2lzZSBhbmQgb2YgXHZhcnthfSBhbmQgXHZhcntifS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZGl2fXthLCBifQotXGZ1bmNsaW5le19fZGl2X199e2EsIGJ9Ci1SZXR1cm4gXHZhcnthfSBcY29kZXsvfSBcdmFye2J9IHdoZW4gXGNvZGV7X19mdXR1cmVfXy5kaXZpc2lvbn0gaXMgbm90Ci1pbiBlZmZlY3QuICBUaGlzIGlzIGFsc28ga25vd24gYXMgYGBjbGFzc2ljJycgZGl2aXNpb24uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2Zsb29yZGl2fXthLCBifQotXGZ1bmNsaW5le19fZmxvb3JkaXZfX317YSwgYn0KLVJldHVybiBcdmFye2F9IFxjb2Rley8vfSBcdmFye2J9LgotXHZlcnNpb25hZGRlZHsyLjJ9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2ludn17b30KLVxmdW5jbGluZXtpbnZlcnR9e299Ci1cZnVuY2xpbmV7X19pbnZfX317b30KLVxmdW5jbGluZXtfX2ludmVydF9ffXtvfQotUmV0dXJuIHRoZSBiaXR3aXNlIGludmVyc2Ugb2YgdGhlIG51bWJlciBcdmFye299LiAgVGhpcyBpcyBlcXVpdmFsZW50Ci10byBcY29kZXtcdGV4dGFzY2lpdGlsZGV9XHZhcntvfS4gIFRoZSBuYW1lcyBcZnVuY3Rpb257aW52ZXJ0KCl9IGFuZAotXGZ1bmN0aW9ue19faW52ZXJ0X18oKX0gd2VyZSBhZGRlZCBpbiBQeXRob24gMi4wLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtsc2hpZnR9e2EsIGJ9Ci1cZnVuY2xpbmV7X19sc2hpZnRfX317YSwgYn0KLVJldHVybiBcdmFye2F9IHNoaWZ0ZWQgbGVmdCBieSBcdmFye2J9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXttb2R9e2EsIGJ9Ci1cZnVuY2xpbmV7X19tb2RfX317YSwgYn0KLVJldHVybiBcdmFye2F9IFxjb2Rle1wlfSBcdmFye2J9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXttdWx9e2EsIGJ9Ci1cZnVuY2xpbmV7X19tdWxfX317YSwgYn0KLVJldHVybiBcdmFye2F9IFxjb2Rleyp9IFx2YXJ7Yn0sIGZvciBcdmFye2F9IGFuZCBcdmFye2J9IG51bWJlcnMuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e25lZ317b30KLVxmdW5jbGluZXtfX25lZ19ffXtvfQotUmV0dXJuIFx2YXJ7b30gbmVnYXRlZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317b3JffXthLCBifQotXGZ1bmNsaW5le19fb3JfX317YSwgYn0KLVJldHVybiB0aGUgYml0d2lzZSBvciBvZiBcdmFye2F9IGFuZCBcdmFye2J9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtwb3N9e299Ci1cZnVuY2xpbmV7X19wb3NfX317b30KLVJldHVybiBcdmFye299IHBvc2l0aXZlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtwb3d9e2EsIGJ9Ci1cZnVuY2xpbmV7X19wb3dfX317YSwgYn0KLVJldHVybiBcdmFye2F9IFxjb2RleyoqfSBcdmFye2J9LCBmb3IgXHZhcnthfSBhbmQgXHZhcntifSBudW1iZXJzLgotXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3JzaGlmdH17YSwgYn0KLVxmdW5jbGluZXtfX3JzaGlmdF9ffXthLCBifQotUmV0dXJuIFx2YXJ7YX0gc2hpZnRlZCByaWdodCBieSBcdmFye2J9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzdWJ9e2EsIGJ9Ci1cZnVuY2xpbmV7X19zdWJfX317YSwgYn0KLVJldHVybiBcdmFye2F9IFxjb2Rley19IFx2YXJ7Yn0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3RydWVkaXZ9e2EsIGJ9Ci1cZnVuY2xpbmV7X190cnVlZGl2X199e2EsIGJ9Ci1SZXR1cm4gXHZhcnthfSBcY29kZXsvfSBcdmFye2J9IHdoZW4gXGNvZGV7X19mdXR1cmVfXy5kaXZpc2lvbn0gaXMgaW4KLWVmZmVjdC4gIFRoaXMgaXMgYWxzbyBrbm93biBhcyBgYHRydWUnJyBkaXZpc2lvbi4KLVx2ZXJzaW9uYWRkZWR7Mi4yfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt4b3J9e2EsIGJ9Ci1cZnVuY2xpbmV7X194b3JfX317YSwgYn0KLVJldHVybiB0aGUgYml0d2lzZSBleGNsdXNpdmUgb3Igb2YgXHZhcnthfSBhbmQgXHZhcntifS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aW5kZXh9e2F9Ci1cZnVuY2xpbmV7X19pbmRleF9ffXthfQotUmV0dXJuIFx2YXJ7YX0gY29udmVydGVkIHRvIGFuIGludGVnZXIuICBFcXVpdmFsZW50IHRvIFx2YXJ7YX1cY29kZXsuX19pbmRleF9fKCl9LgotXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke2Z1bmNkZXNjfQotCi1PcGVyYXRpb25zIHdoaWNoIHdvcmsgd2l0aCBzZXF1ZW5jZXMgaW5jbHVkZToKLQotXGJlZ2lue2Z1bmNkZXNjfXtjb25jYXR9e2EsIGJ9Ci1cZnVuY2xpbmV7X19jb25jYXRfX317YSwgYn0KLVJldHVybiBcdmFye2F9IFxjb2Rleyt9IFx2YXJ7Yn0gZm9yIFx2YXJ7YX0gYW5kIFx2YXJ7Yn0gc2VxdWVuY2VzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtjb250YWluc317YSwgYn0KLVxmdW5jbGluZXtfX2NvbnRhaW5zX199e2EsIGJ9Ci1SZXR1cm4gdGhlIG91dGNvbWUgb2YgdGhlIHRlc3QgXHZhcntifSBcY29kZXtpbn0gXHZhcnthfS4KLU5vdGUgdGhlIHJldmVyc2VkIG9wZXJhbmRzLiAgVGhlIG5hbWUgXGZ1bmN0aW9ue19fY29udGFpbnNfXygpfSB3YXMKLWFkZGVkIGluIFB5dGhvbiAyLjAuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2NvdW50T2Z9e2EsIGJ9Ci1SZXR1cm4gdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiBcdmFye2J9IGluIFx2YXJ7YX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2RlbGl0ZW19e2EsIGJ9Ci1cZnVuY2xpbmV7X19kZWxpdGVtX199e2EsIGJ9Ci1SZW1vdmUgdGhlIHZhbHVlIG9mIFx2YXJ7YX0gYXQgaW5kZXggXHZhcntifS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZGVsc2xpY2V9e2EsIGIsIGN9Ci1cZnVuY2xpbmV7X19kZWxzbGljZV9ffXthLCBiLCBjfQotRGVsZXRlIHRoZSBzbGljZSBvZiBcdmFye2F9IGZyb20gaW5kZXggXHZhcntifSB0byBpbmRleCBcdmFye2N9XGNvZGV7LTF9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRpdGVtfXthLCBifQotXGZ1bmNsaW5le19fZ2V0aXRlbV9ffXthLCBifQotUmV0dXJuIHRoZSB2YWx1ZSBvZiBcdmFye2F9IGF0IGluZGV4IFx2YXJ7Yn0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldHNsaWNlfXthLCBiLCBjfQotXGZ1bmNsaW5le19fZ2V0c2xpY2VfX317YSwgYiwgY30KLVJldHVybiB0aGUgc2xpY2Ugb2YgXHZhcnthfSBmcm9tIGluZGV4IFx2YXJ7Yn0gdG8gaW5kZXggXHZhcntjfVxjb2Rley0xfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aW5kZXhPZn17YSwgYn0KLVJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9mIG9jY3VycmVuY2Ugb2YgXHZhcntifSBpbiBcdmFye2F9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtyZXBlYXR9e2EsIGJ9Ci1cZnVuY2xpbmV7X19yZXBlYXRfX317YSwgYn0KLVJldHVybiBcdmFye2F9IFxjb2Rleyp9IFx2YXJ7Yn0gd2hlcmUgXHZhcnthfSBpcyBhIHNlcXVlbmNlIGFuZAotXHZhcntifSBpcyBhbiBpbnRlZ2VyLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzZXF1ZW5jZUluY2x1ZGVzfXtcdW5zcGVjaWZpZWR9Ci1cZGVwcmVjYXRlZHsyLjB9e1VzZSBcZnVuY3Rpb257Y29udGFpbnMoKX0gaW5zdGVhZC59Ci1BbGlhcyBmb3IgXGZ1bmN0aW9ue2NvbnRhaW5zKCl9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzZXRpdGVtfXthLCBiLCBjfQotXGZ1bmNsaW5le19fc2V0aXRlbV9ffXthLCBiLCBjfQotU2V0IHRoZSB2YWx1ZSBvZiBcdmFye2F9IGF0IGluZGV4IFx2YXJ7Yn0gdG8gXHZhcntjfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c2V0c2xpY2V9e2EsIGIsIGMsIHZ9Ci1cZnVuY2xpbmV7X19zZXRzbGljZV9ffXthLCBiLCBjLCB2fQotU2V0IHRoZSBzbGljZSBvZiBcdmFye2F9IGZyb20gaW5kZXggXHZhcntifSB0byBpbmRleCBcdmFye2N9XGNvZGV7LTF9IHRvIHRoZQotc2VxdWVuY2UgXHZhcnt2fS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotTWFueSBvcGVyYXRpb25zIGhhdmUgYW4gYGBpbi1wbGFjZScnIHZlcnNpb24uICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucwotcHJvdmlkZSBhIG1vcmUgcHJpbWl0aXZlIGFjY2VzcyB0byBpbi1wbGFjZSBvcGVyYXRvcnMgdGhhbiB0aGUgdXN1YWwKLXN5bnRheCBkb2VzOyBmb3IgZXhhbXBsZSwgdGhlIHN0YXRlbWVudCBcY29kZXt4ICs9IHl9IGlzIGVxdWl2YWxlbnQgdG8KLVxjb2Rle3ggPSBvcGVyYXRvci5pYWRkKHgsIHkpfS4gIEFub3RoZXIgd2F5IHRvIHB1dCBpdCBpcyB0byBzYXkgdGhhdAotXGNvZGV7eiA9IG9wZXJhdG9yLmlhZGQoeCwgeSl9IGlzIGVxdWl2YWxlbnQgdG8gdGhlIGNvbXBvdW5kIHN0YXRlbWVudAotXGNvZGV7eiA9IHg7IHogKz0geX0uCi0KLVxiZWdpbntmdW5jZGVzY317aWFkZH17YSwgYn0KLVxmdW5jbGluZXtfX2lhZGRfX317YSwgYn0KLVxjb2Rle2EgPSBpYWRkKGEsIGIpfSBpcyBlcXVpdmFsZW50IHRvIFxjb2Rle2EgKz0gYn0uCi1cdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aWFuZH17YSwgYn0KLVxmdW5jbGluZXtfX2lhbmRfX317YSwgYn0KLVxjb2Rle2EgPSBpYW5kKGEsIGIpfSBpcyBlcXVpdmFsZW50IHRvIFxjb2Rle2EgXCY9IGJ9LgotXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2ljb25jYXR9e2EsIGJ9Ci1cZnVuY2xpbmV7X19pY29uY2F0X199e2EsIGJ9Ci1cY29kZXthID0gaWNvbmNhdChhLCBiKX0gaXMgZXF1aXZhbGVudCB0byBcY29kZXthICs9IGJ9IGZvciBcdmFye2F9Ci1hbmQgXHZhcntifSBzZXF1ZW5jZXMuCi1cdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aWRpdn17YSwgYn0KLVxmdW5jbGluZXtfX2lkaXZfX317YSwgYn0KLVxjb2Rle2EgPSBpZGl2KGEsIGIpfSBpcyBlcXVpdmFsZW50IHRvIFxjb2Rle2EgLz0gYn0gd2hlbgotXGNvZGV7X19mdXR1cmVfXy5kaXZpc2lvbn0gaXMgbm90IGluIGVmZmVjdC4KLVx2ZXJzaW9uYWRkZWR7Mi41fQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpZmxvb3JkaXZ9e2EsIGJ9Ci1cZnVuY2xpbmV7X19pZmxvb3JkaXZfX317YSwgYn0KLVxjb2Rle2EgPSBpZmxvb3JkaXYoYSwgYil9IGlzIGVxdWl2YWxlbnQgdG8gXGNvZGV7YSAvLz0gYn0uCi1cdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aWxzaGlmdH17YSwgYn0KLVxmdW5jbGluZXtfX2lsc2hpZnRfX317YSwgYn0KLVxjb2Rle2EgPSBpbHNoaWZ0KGEsIGIpfSBpcyBlcXVpdmFsZW50IHRvIFxjb2Rle2EgPH1cY29kZXs8PSBifS4KLVx2ZXJzaW9uYWRkZWR7Mi41fQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpbW9kfXthLCBifQotXGZ1bmNsaW5le19faW1vZF9ffXthLCBifQotXGNvZGV7YSA9IGltb2QoYSwgYil9IGlzIGVxdWl2YWxlbnQgdG8gXGNvZGV7YSBcJT0gYn0uCi1cdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aW11bH17YSwgYn0KLVxmdW5jbGluZXtfX2ltdWxfX317YSwgYn0KLVxjb2Rle2EgPSBpbXVsKGEsIGIpfSBpcyBlcXVpdmFsZW50IHRvIFxjb2Rle2EgKj0gYn0uCi1cdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aW9yfXthLCBifQotXGZ1bmNsaW5le19faW9yX199e2EsIGJ9Ci1cY29kZXthID0gaW9yKGEsIGIpfSBpcyBlcXVpdmFsZW50IHRvIFxjb2Rle2EgfD0gYn0uCi1cdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aXBvd317YSwgYn0KLVxmdW5jbGluZXtfX2lwb3dfX317YSwgYn0KLVxjb2Rle2EgPSBpcG93KGEsIGIpfSBpcyBlcXVpdmFsZW50IHRvIFxjb2Rle2EgKio9IGJ9LgotXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2lyZXBlYXR9e2EsIGJ9Ci1cZnVuY2xpbmV7X19pcmVwZWF0X199e2EsIGJ9Ci1cY29kZXthID0gaXJlcGVhdChhLCBiKX0gaXMgZXF1aXZhbGVudCB0byBcY29kZXthICo9IGJ9IHdoZXJlCi1cdmFye2F9IGlzIGEgc2VxdWVuY2UgYW5kIFx2YXJ7Yn0gaXMgYW4gaW50ZWdlci4KLVx2ZXJzaW9uYWRkZWR7Mi41fQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpcnNoaWZ0fXthLCBifQotXGZ1bmNsaW5le19faXJzaGlmdF9ffXthLCBifQotXGNvZGV7YSA9IGlyc2hpZnQoYSwgYil9IGlzIGVxdWl2YWxlbnQgdG8gXGNvZGV7YSA+Pj0gYn0uCi1cdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aXN1Yn17YSwgYn0KLVxmdW5jbGluZXtfX2lzdWJfX317YSwgYn0KLVxjb2Rle2EgPSBpc3ViKGEsIGIpfSBpcyBlcXVpdmFsZW50IHRvIFxjb2Rle2EgLT0gYn0uCi1cdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aXRydWVkaXZ9e2EsIGJ9Ci1cZnVuY2xpbmV7X19pdHJ1ZWRpdl9ffXthLCBifQotXGNvZGV7YSA9IGl0cnVlZGl2KGEsIGIpfSBpcyBlcXVpdmFsZW50IHRvIFxjb2Rle2EgLz0gYn0gd2hlbgotXGNvZGV7X19mdXR1cmVfXy5kaXZpc2lvbn0gaXMgaW4gZWZmZWN0LgotXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2l4b3J9e2EsIGJ9Ci1cZnVuY2xpbmV7X19peG9yX199e2EsIGJ9Ci1cY29kZXthID0gaXhvcihhLCBiKX0gaXMgZXF1aXZhbGVudCB0byBcY29kZXthIFx0ZXh0YXNjaWljaXJjdW09IGJ9LgotXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke2Z1bmNkZXNjfQotCi0KLVRoZSBcbW9kdWxle29wZXJhdG9yfSBtb2R1bGUgYWxzbyBkZWZpbmVzIGEgZmV3IHByZWRpY2F0ZXMgdG8gdGVzdCB0aGUKLXR5cGUgb2Ygb2JqZWN0cy4gIFxub3Rle0JlIGNhcmVmdWwgbm90IHRvIG1pc2ludGVycHJldCB0aGUKLXJlc3VsdHMgb2YgdGhlc2UgZnVuY3Rpb25zOyBvbmx5IFxmdW5jdGlvbntpc0NhbGxhYmxlKCl9IGhhcyBhbnkKLW1lYXN1cmUgb2YgcmVsaWFiaWxpdHkgd2l0aCBpbnN0YW5jZSBvYmplY3RzLiAgRm9yIGV4YW1wbGU6fQotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gY2xhc3MgQzoKLS4uLiAgICAgcGFzcwotLi4uIAotPj4+IGltcG9ydCBvcGVyYXRvcgotPj4+IG8gPSBDKCkKLT4+PiBvcGVyYXRvci5pc01hcHBpbmdUeXBlKG8pCi1UcnVlCi1cZW5ke3ZlcmJhdGltfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2lzQ2FsbGFibGV9e299Ci1cZGVwcmVjYXRlZHsyLjB9e1VzZSB0aGUgXGZ1bmN0aW9ue2NhbGxhYmxlKCl9IGJ1aWx0LWluIGZ1bmN0aW9uIGluc3RlYWQufQotUmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgXHZhcntvfSBjYW4gYmUgY2FsbGVkIGxpa2UgYSBmdW5jdGlvbiwKLW90aGVyd2lzZSBpdCByZXR1cm5zIGZhbHNlLiAgVHJ1ZSBpcyByZXR1cm5lZCBmb3IgZnVuY3Rpb25zLCBib3VuZCBhbmQKLXVuYm91bmQgbWV0aG9kcywgY2xhc3Mgb2JqZWN0cywgYW5kIGluc3RhbmNlIG9iamVjdHMgd2hpY2ggc3VwcG9ydCB0aGUKLVxtZXRob2R7X19jYWxsX18oKX0gbWV0aG9kLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpc01hcHBpbmdUeXBlfXtvfQotUmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgXHZhcntvfSBzdXBwb3J0cyB0aGUgbWFwcGluZyBpbnRlcmZhY2UuCi1UaGlzIGlzIHRydWUgZm9yIGRpY3Rpb25hcmllcyBhbmQgYWxsIGluc3RhbmNlIG9iamVjdHMgZGVmaW5pbmcKLVxtZXRob2R7X19nZXRpdGVtX199LgotXHdhcm5pbmd7VGhlcmUgaXMgbm8gcmVsaWFibGUgd2F5IHRvIHRlc3QgaWYgYW4gaW5zdGFuY2UKLXN1cHBvcnRzIHRoZSBjb21wbGV0ZSBtYXBwaW5nIHByb3RvY29sIHNpbmNlIHRoZSBpbnRlcmZhY2UgaXRzZWxmIGlzCi1pbGwtZGVmaW5lZC4gIFRoaXMgbWFrZXMgdGhpcyB0ZXN0IGxlc3MgdXNlZnVsIHRoYW4gaXQgb3RoZXJ3aXNlIG1pZ2h0Ci1iZS59Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2lzTnVtYmVyVHlwZX17b30KLVJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IFx2YXJ7b30gcmVwcmVzZW50cyBhIG51bWJlci4gIFRoaXMgaXMgdHJ1ZQotZm9yIGFsbCBudW1lcmljIHR5cGVzIGltcGxlbWVudGVkIGluIEMuCi1cd2FybmluZ3tUaGVyZSBpcyBubyByZWxpYWJsZSB3YXkgdG8gdGVzdCBpZiBhbiBpbnN0YW5jZQotc3VwcG9ydHMgdGhlIGNvbXBsZXRlIG51bWVyaWMgaW50ZXJmYWNlIHNpbmNlIHRoZSBpbnRlcmZhY2UgaXRzZWxmIGlzCi1pbGwtZGVmaW5lZC4gIFRoaXMgbWFrZXMgdGhpcyB0ZXN0IGxlc3MgdXNlZnVsIHRoYW4gaXQgb3RoZXJ3aXNlIG1pZ2h0Ci1iZS59Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2lzU2VxdWVuY2VUeXBlfXtvfQotUmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgXHZhcntvfSBzdXBwb3J0cyB0aGUgc2VxdWVuY2UgcHJvdG9jb2wuCi1UaGlzIHJldHVybnMgdHJ1ZSBmb3IgYWxsIG9iamVjdHMgd2hpY2ggZGVmaW5lIHNlcXVlbmNlIG1ldGhvZHMgaW4gQywKLWFuZCBmb3IgYWxsIGluc3RhbmNlIG9iamVjdHMgZGVmaW5pbmcgXG1ldGhvZHtfX2dldGl0ZW1fX30uCi1cd2FybmluZ3tUaGVyZSBpcyBubyByZWxpYWJsZQotd2F5IHRvIHRlc3QgaWYgYW4gaW5zdGFuY2Ugc3VwcG9ydHMgdGhlIGNvbXBsZXRlIHNlcXVlbmNlIGludGVyZmFjZQotc2luY2UgdGhlIGludGVyZmFjZSBpdHNlbGYgaXMgaWxsLWRlZmluZWQuICBUaGlzIG1ha2VzIHRoaXMgdGVzdCBsZXNzCi11c2VmdWwgdGhhbiBpdCBvdGhlcndpc2UgbWlnaHQgYmUufQotXGVuZHtmdW5jZGVzY30KLQotCi1FeGFtcGxlOiBCdWlsZCBhIGRpY3Rpb25hcnkgdGhhdCBtYXBzIHRoZSBvcmRpbmFscyBmcm9tIFxjb2RlezB9IHRvCi1cY29kZXsyNTV9IHRvIHRoZWlyIGNoYXJhY3RlciBlcXVpdmFsZW50cy4KLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGltcG9ydCBvcGVyYXRvcgotPj4+IGQgPSB7fQotPj4+IGtleXMgPSByYW5nZSgyNTYpCi0+Pj4gdmFscyA9IG1hcChjaHIsIGtleXMpCi0+Pj4gbWFwKG9wZXJhdG9yLnNldGl0ZW0sIFtkXSpsZW4oa2V5cyksIGtleXMsIHZhbHMpCi1cZW5ke3ZlcmJhdGltfQotCi0KLVRoZSBcbW9kdWxle29wZXJhdG9yfSBtb2R1bGUgYWxzbyBkZWZpbmVzIHRvb2xzIGZvciBnZW5lcmFsaXplZCBhdHRyaWJ1dGUKLWFuZCBpdGVtIGxvb2t1cHMuICBUaGVzZSBhcmUgdXNlZnVsIGZvciBtYWtpbmcgZmFzdCBmaWVsZCBleHRyYWN0b3JzCi1hcyBhcmd1bWVudHMgZm9yIFxmdW5jdGlvbnttYXAoKX0sIFxmdW5jdGlvbntzb3J0ZWQoKX0sCi1cbWV0aG9ke2l0ZXJ0b29scy5ncm91cGJ5KCl9LCBvciBvdGhlciBmdW5jdGlvbnMgdGhhdCBleHBlY3QgYQotZnVuY3Rpb24gYXJndW1lbnQuCi0KLVxiZWdpbntmdW5jZGVzY317YXR0cmdldHRlcn17YXR0clxvcHRpb25hbHssIGFyZ3MuLi59fQotUmV0dXJuIGEgY2FsbGFibGUgb2JqZWN0IHRoYXQgZmV0Y2hlcyBcdmFye2F0dHJ9IGZyb20gaXRzIG9wZXJhbmQuCi1JZiBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSBpcyByZXF1ZXN0ZWQsIHJldHVybnMgYSB0dXBsZSBvZiBhdHRyaWJ1dGVzLgotQWZ0ZXIsIFxzYW1we2Y9YXR0cmdldHRlcignbmFtZScpfSwgdGhlIGNhbGwgXHNhbXB7ZihiKX0gcmV0dXJucwotXHNhbXB7Yi5uYW1lfS4gIEFmdGVyLCBcc2FtcHtmPWF0dHJnZXR0ZXIoJ25hbWUnLCAnZGF0ZScpfSwgdGhlIGNhbGwKLVxzYW1we2YoYil9IHJldHVybnMgXHNhbXB7KGIubmFtZSwgYi5kYXRlKX0uIAotXHZlcnNpb25hZGRlZHsyLjR9Ci1cdmVyc2lvbmNoYW5nZWRbQWRkZWQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgYXR0cmlidXRlc117Mi41fQotXGVuZHtmdW5jZGVzY30KLSAgICAKLVxiZWdpbntmdW5jZGVzY317aXRlbWdldHRlcn17aXRlbVxvcHRpb25hbHssIGFyZ3MuLi59fQotUmV0dXJuIGEgY2FsbGFibGUgb2JqZWN0IHRoYXQgZmV0Y2hlcyBcdmFye2l0ZW19IGZyb20gaXRzIG9wZXJhbmQuCi1JZiBtb3JlIHRoYW4gb25lIGl0ZW0gaXMgcmVxdWVzdGVkLCByZXR1cm5zIGEgdHVwbGUgb2YgaXRlbXMuCi1BZnRlciwgXHNhbXB7Zj1pdGVtZ2V0dGVyKDIpfSwgdGhlIGNhbGwgXHNhbXB7ZihiKX0gcmV0dXJucwotXHNhbXB7YlsyXX0uCi1BZnRlciwgXHNhbXB7Zj1pdGVtZ2V0dGVyKDIsNSwzKX0sIHRoZSBjYWxsIFxzYW1we2YoYil9IHJldHVybnMKLVxzYW1weyhiWzJdLCBiWzVdLCBiWzNdKX0uCQkKLVx2ZXJzaW9uYWRkZWR7Mi40fQotXHZlcnNpb25jaGFuZ2VkW0FkZGVkIHN1cHBvcnQgZm9yIG11bHRpcGxlIGl0ZW0gZXh0cmFjdGlvbl17Mi41fQkJCi1cZW5ke2Z1bmNkZXNjfQotCi1FeGFtcGxlczoKLSAgICAgICAgICAgICAgICAKLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBmcm9tIG9wZXJhdG9yIGltcG9ydCBpdGVtZ2V0dGVyCi0+Pj4gaW52ZW50b3J5ID0gWygnYXBwbGUnLCAzKSwgKCdiYW5hbmEnLCAyKSwgKCdwZWFyJywgNSksICgnb3JhbmdlJywgMSldCi0+Pj4gZ2V0Y291bnQgPSBpdGVtZ2V0dGVyKDEpCi0+Pj4gbWFwKGdldGNvdW50LCBpbnZlbnRvcnkpCi1bMywgMiwgNSwgMV0KLT4+PiBzb3J0ZWQoaW52ZW50b3J5LCBrZXk9Z2V0Y291bnQpCi1bKCdvcmFuZ2UnLCAxKSwgKCdiYW5hbmEnLCAyKSwgKCdhcHBsZScsIDMpLCAoJ3BlYXInLCA1KV0KLVxlbmR7dmVyYmF0aW19Ci0gICAgICAgICAgICAgICAgCi0KLVxzdWJzZWN0aW9ue01hcHBpbmcgT3BlcmF0b3JzIHRvIEZ1bmN0aW9ucyBcbGFiZWx7b3BlcmF0b3ItbWFwfX0KLQotVGhpcyB0YWJsZSBzaG93cyBob3cgYWJzdHJhY3Qgb3BlcmF0aW9ucyBjb3JyZXNwb25kIHRvIG9wZXJhdG9yCi1zeW1ib2xzIGluIHRoZSBQeXRob24gc3ludGF4IGFuZCB0aGUgZnVuY3Rpb25zIGluIHRoZQotXHJlZm1vZHVsZXtvcGVyYXRvcn0gbW9kdWxlLgotCi0KLVxiZWdpbnt0YWJsZWlpaX17bHxjfGx9e3RleHRybX17T3BlcmF0aW9ufXtTeW50YXh9e0Z1bmN0aW9ufQotICBcbGluZWlpaXtBZGRpdGlvbn17XGNvZGV7XHZhcnthfSArIFx2YXJ7Yn19fQotICAgICAgICAgIHtcY29kZXthZGQoXHZhcnthfSwgXHZhcntifSl9fQotICBcbGluZWlpaXtDb25jYXRlbmF0aW9ufXtcY29kZXtcdmFye3NlcTF9ICsgXHZhcntzZXEyfX19Ci0gICAgICAgICAge1xjb2Rle2NvbmNhdChcdmFye3NlcTF9LCBcdmFye3NlcTJ9KX19Ci0gIFxsaW5laWlpe0NvbnRhaW5tZW50IFRlc3R9e1xjb2Rle1x2YXJ7b30gaW4gXHZhcntzZXF9fX0KLSAgICAgICAgICB7XGNvZGV7Y29udGFpbnMoXHZhcntzZXF9LCBcdmFye299KX19Ci0gIFxsaW5laWlpe0RpdmlzaW9ufXtcY29kZXtcdmFye2F9IC8gXHZhcntifX19Ci0gICAgICAgICAge1xjb2Rle2RpdihcdmFye2F9LCBcdmFye2J9KSBcI30gd2l0aG91dCBcY29kZXtfX2Z1dHVyZV9fLmRpdmlzaW9ufX0KLSAgXGxpbmVpaWl7RGl2aXNpb259e1xjb2Rle1x2YXJ7YX0gLyBcdmFye2J9fX0KLSAgICAgICAgICB7XGNvZGV7dHJ1ZWRpdihcdmFye2F9LCBcdmFye2J9KSBcI30gd2l0aCBcY29kZXtfX2Z1dHVyZV9fLmRpdmlzaW9ufX0KLSAgXGxpbmVpaWl7RGl2aXNpb259e1xjb2Rle1x2YXJ7YX0gLy8gXHZhcntifX19Ci0gICAgICAgICAge1xjb2Rle2Zsb29yZGl2KFx2YXJ7YX0sIFx2YXJ7Yn0pfX0KLSAgXGxpbmVpaWl7Qml0d2lzZSBBbmR9e1xjb2Rle1x2YXJ7YX0gXCZcIFx2YXJ7Yn19fQotICAgICAgICAgIHtcY29kZXthbmRfKFx2YXJ7YX0sIFx2YXJ7Yn0pfX0KLSAgXGxpbmVpaWl7Qml0d2lzZSBFeGNsdXNpdmUgT3J9e1xjb2Rle1x2YXJ7YX0gXF5cIFx2YXJ7Yn19fQotICAgICAgICAgIHtcY29kZXt4b3IoXHZhcnthfSwgXHZhcntifSl9fQotICBcbGluZWlpaXtCaXR3aXNlIEludmVyc2lvbn17XGNvZGV7XH57fSBcdmFye2F9fX0KLSAgICAgICAgICB7XGNvZGV7aW52ZXJ0KFx2YXJ7YX0pfX0KLSAgXGxpbmVpaWl7Qml0d2lzZSBPcn17XGNvZGV7XHZhcnthfSB8IFx2YXJ7Yn19fQotICAgICAgICAgIHtcY29kZXtvcl8oXHZhcnthfSwgXHZhcntifSl9fQotICBcbGluZWlpaXtFeHBvbmVudGlhdGlvbn17XGNvZGV7XHZhcnthfSAqKiBcdmFye2J9fX0KLSAgICAgICAgICB7XGNvZGV7cG93KFx2YXJ7YX0sIFx2YXJ7Yn0pfX0KLSAgXGxpbmVpaWl7SWRlbnRpdHl9e1xjb2Rle1x2YXJ7YX0gaXMgXHZhcntifX19Ci0gICAgICAgICAge1xjb2Rle2lzXyhcdmFye2F9LCBcdmFye2J9KX19Ci0gIFxsaW5laWlpe0lkZW50aXR5fXtcY29kZXtcdmFye2F9IGlzIG5vdCBcdmFye2J9fX0KLSAgICAgICAgICB7XGNvZGV7aXNfbm90KFx2YXJ7YX0sIFx2YXJ7Yn0pfX0KLSAgXGxpbmVpaWl7SW5kZXhlZCBBc3NpZ25tZW50fXtcY29kZXtcdmFye299W1x2YXJ7a31dID0gXHZhcnt2fX19Ci0gICAgICAgICAge1xjb2Rle3NldGl0ZW0oXHZhcntvfSwgXHZhcntrfSwgXHZhcnt2fSl9fQotICBcbGluZWlpaXtJbmRleGVkIERlbGV0aW9ufXtcY29kZXtkZWwgXHZhcntvfVtcdmFye2t9XX19Ci0gICAgICAgICAge1xjb2Rle2RlbGl0ZW0oXHZhcntvfSwgXHZhcntrfSl9fQotICBcbGluZWlpaXtJbmRleGluZ317XGNvZGV7XHZhcntvfVtcdmFye2t9XX19Ci0gICAgICAgICAge1xjb2Rle2dldGl0ZW0oXHZhcntvfSwgXHZhcntrfSl9fQotICBcbGluZWlpaXtMZWZ0IFNoaWZ0fXtcY29kZXtcdmFye2F9IDxcY29kZXs8fSBcdmFye2J9fX0KLSAgICAgICAgICB7XGNvZGV7bHNoaWZ0KFx2YXJ7YX0sIFx2YXJ7Yn0pfX0KLSAgXGxpbmVpaWl7TW9kdWxvfXtcY29kZXtcdmFye2F9IFwlXCBcdmFye2J9fX0KLSAgICAgICAgICB7XGNvZGV7bW9kKFx2YXJ7YX0sIFx2YXJ7Yn0pfX0KLSAgXGxpbmVpaWl7TXVsdGlwbGljYXRpb259e1xjb2Rle1x2YXJ7YX0gKiBcdmFye2J9fX0KLSAgICAgICAgICB7XGNvZGV7bXVsKFx2YXJ7YX0sIFx2YXJ7Yn0pfX0KLSAgXGxpbmVpaWl7TmVnYXRpb24gKEFyaXRobWV0aWMpfXtcY29kZXstIFx2YXJ7YX19fQotICAgICAgICAgIHtcY29kZXtuZWcoXHZhcnthfSl9fQotICBcbGluZWlpaXtOZWdhdGlvbiAoTG9naWNhbCl9e1xjb2Rle25vdCBcdmFye2F9fX0KLSAgICAgICAgICB7XGNvZGV7bm90XyhcdmFye2F9KX19Ci0gIFxsaW5laWlpe1JpZ2h0IFNoaWZ0fXtcY29kZXtcdmFye2F9ID4+IFx2YXJ7Yn19fQotICAgICAgICAgIHtcY29kZXtyc2hpZnQoXHZhcnthfSwgXHZhcntifSl9fQotICBcbGluZWlpaXtTZXF1ZW5jZSBSZXBpdGl0aW9ufXtcY29kZXtcdmFye3NlcX0gKiBcdmFye2l9fX0KLSAgICAgICAgICB7XGNvZGV7cmVwZWF0KFx2YXJ7c2VxfSwgXHZhcntpfSl9fQotICBcbGluZWlpaXtTbGljZSBBc3NpZ25tZW50fXtcY29kZXtcdmFye3NlcX1bXHZhcntpfTpcdmFye2p9XX0gPSBcdmFye3ZhbHVlc319Ci0gICAgICAgICAge1xjb2Rle3NldHNsaWNlKFx2YXJ7c2VxfSwgXHZhcntpfSwgXHZhcntqfSwgXHZhcnt2YWx1ZXN9KX19Ci0gIFxsaW5laWlpe1NsaWNlIERlbGV0aW9ufXtcY29kZXtkZWwgXHZhcntzZXF9W1x2YXJ7aX06XHZhcntqfV19fQotICAgICAgICAgIHtcY29kZXtkZWxzbGljZShcdmFye3NlcX0sIFx2YXJ7aX0sIFx2YXJ7an0pfX0KLSAgXGxpbmVpaWl7U2xpY2luZ317XGNvZGV7XHZhcntzZXF9W1x2YXJ7aX06XHZhcntqfV19fQotICAgICAgICAgIHtcY29kZXtnZXRzbGljZShcdmFye3NlcX0sIFx2YXJ7aX0sIFx2YXJ7an0pfX0KLSAgXGxpbmVpaWl7U3RyaW5nIEZvcm1hdHRpbmd9e1xjb2Rle1x2YXJ7c30gXCVcIFx2YXJ7b319fQotICAgICAgICAgIHtcY29kZXttb2QoXHZhcntzfSwgXHZhcntvfSl9fQotICBcbGluZWlpaXtTdWJ0cmFjdGlvbn17XGNvZGV7XHZhcnthfSAtIFx2YXJ7Yn19fQotICAgICAgICAgIHtcY29kZXtzdWIoXHZhcnthfSwgXHZhcntifSl9fQotICBcbGluZWlpaXtUcnV0aCBUZXN0fXtcY29kZXtcdmFye299fX0KLSAgICAgICAgICB7XGNvZGV7dHJ1dGgoXHZhcntvfSl9fQotICBcbGluZWlpaXtPcmRlcmluZ317XGNvZGV7XHZhcnthfSA8IFx2YXJ7Yn19fQotICAgICAgICAgIHtcY29kZXtsdChcdmFye2F9LCBcdmFye2J9KX19Ci0gIFxsaW5laWlpe09yZGVyaW5nfXtcY29kZXtcdmFye2F9IDw9IFx2YXJ7Yn19fQotICAgICAgICAgIHtcY29kZXtsZShcdmFye2F9LCBcdmFye2J9KX19Ci0gIFxsaW5laWlpe0VxdWFsaXR5fXtcY29kZXtcdmFye2F9ID09IFx2YXJ7Yn19fQotICAgICAgICAgIHtcY29kZXtlcShcdmFye2F9LCBcdmFye2J9KX19Ci0gIFxsaW5laWlpe0RpZmZlcmVuY2V9e1xjb2Rle1x2YXJ7YX0gIT0gXHZhcntifX19Ci0gICAgICAgICAge1xjb2Rle25lKFx2YXJ7YX0sIFx2YXJ7Yn0pfX0KLSAgXGxpbmVpaWl7T3JkZXJpbmd9e1xjb2Rle1x2YXJ7YX0gPj0gXHZhcntifX19Ci0gICAgICAgICAge1xjb2Rle2dlKFx2YXJ7YX0sIFx2YXJ7Yn0pfX0KLSAgXGxpbmVpaWl7T3JkZXJpbmd9e1xjb2Rle1x2YXJ7YX0gPiBcdmFye2J9fX0KLSAgICAgICAgICB7XGNvZGV7Z3QoXHZhcnthfSwgXHZhcntifSl9fQotXGVuZHt0YWJsZWlpaX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlib3B0cGFyc2UudGV4IGIvRG9jL2xpYi9saWJvcHRwYXJzZS50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNDkxOWIuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJvcHRwYXJzZS50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxODg4ICswLDAgQEAKLSUgVEhJUyBGSUxFIElTIEFVVE8tR0VORVJBVEVEISAgRE8gTk9UIEVESVQhCi0lIChZb3VyIGNoYW5nZXMgd2lsbCBiZSBsb3N0IHRoZSBuZXh0IHRpbWUgaXQgaXMgZ2VuZXJhdGVkLikKLVxzZWN0aW9ue1xtb2R1bGV7b3B0cGFyc2V9IC0tLSBNb3JlIHBvd2VyZnVsIGNvbW1hbmQgbGluZSBvcHRpb24gcGFyc2VyfQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e29wdHBhcnNlfQotXG1vZHVsZWF1dGhvcntHcmVnIFdhcmR9e2d3YXJkQHB5dGhvbi5uZXR9Ci1cbW9kdWxlc3lub3BzaXN7TW9yZSBjb252ZW5pZW50LCBmbGV4aWJsZSwgYW5kIHBvd2VyZnVsIGNvbW1hbmQtbGluZSBwYXJzaW5nIGxpYnJhcnkufQotXHZlcnNpb25hZGRlZHsyLjN9Ci1cc2VjdGlvbmF1dGhvcntHcmVnIFdhcmR9e2d3YXJkQHB5dGhvbi5uZXR9Ci0lIEFuIGludHJvIGJsdXJiIHVzZWQgb25seSB3aGVuIGdlbmVyYXRpbmcgTGFUZVggZG9jcyBmb3IgdGhlIFB5dGhvbgotJSBtYW51YWwgKGJhc2VkIG9uIFJFQURNRS50eHQpLiAKLQotXGNvZGV7b3B0cGFyc2V9IGlzIGEgbW9yZSBjb252ZW5pZW50LCBmbGV4aWJsZSwgYW5kIHBvd2VyZnVsIGxpYnJhcnkgZm9yCi1wYXJzaW5nIGNvbW1hbmQtbGluZSBvcHRpb25zIHRoYW4gXGNvZGV7Z2V0b3B0fS4gIFxjb2Rle29wdHBhcnNlfSB1c2VzIGEgbW9yZQotZGVjbGFyYXRpdmUgc3R5bGUgb2YgY29tbWFuZC1saW5lIHBhcnNpbmc6IHlvdSBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YKLVxjbGFzc3tPcHRpb25QYXJzZXJ9LCBwb3B1bGF0ZSBpdCB3aXRoIG9wdGlvbnMsIGFuZCBwYXJzZSB0aGUgY29tbWFuZCBsaW5lLgotXGNvZGV7b3B0cGFyc2V9IGFsbG93cyB1c2VycyB0byBzcGVjaWZ5IG9wdGlvbnMgaW4gdGhlIGNvbnZlbnRpb25hbCBHTlUvUE9TSVgKLXN5bnRheCwgYW5kIGFkZGl0aW9uYWxseSBnZW5lcmF0ZXMgdXNhZ2UgYW5kIGhlbHAgbWVzc2FnZXMgZm9yIHlvdS4KLQotSGVyZSdzIGFuIGV4YW1wbGUgb2YgdXNpbmcgXGNvZGV7b3B0cGFyc2V9IGluIGEgc2ltcGxlIHNjcmlwdDoKLVxiZWdpbnt2ZXJiYXRpbX0KLWZyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgotWy4uLl0KLXBhcnNlciA9IE9wdGlvblBhcnNlcigpCi1wYXJzZXIuYWRkX29wdGlvbigiLWYiLCAiLS1maWxlIiwgZGVzdD0iZmlsZW5hbWUiLAotICAgICAgICAgICAgICAgICAgaGVscD0id3JpdGUgcmVwb3J0IHRvIEZJTEUiLCBtZXRhdmFyPSJGSUxFIikKLXBhcnNlci5hZGRfb3B0aW9uKCItcSIsICItLXF1aWV0IiwKLSAgICAgICAgICAgICAgICAgIGFjdGlvbj0ic3RvcmVfZmFsc2UiLCBkZXN0PSJ2ZXJib3NlIiwgZGVmYXVsdD1UcnVlLAotICAgICAgICAgICAgICAgICAgaGVscD0iZG9uJ3QgcHJpbnQgc3RhdHVzIG1lc3NhZ2VzIHRvIHN0ZG91dCIpCi0KLShvcHRpb25zLCBhcmdzKSA9IHBhcnNlci5wYXJzZV9hcmdzKCkKLVxlbmR7dmVyYmF0aW19Ci0KLVdpdGggdGhlc2UgZmV3IGxpbmVzIG9mIGNvZGUsIHVzZXJzIG9mIHlvdXIgc2NyaXB0IGNhbiBub3cgZG8gdGhlCi1gYHVzdWFsIHRoaW5nJycgb24gdGhlIGNvbW1hbmQtbGluZSwgZm9yIGV4YW1wbGU6Ci1cYmVnaW57dmVyYmF0aW19Ci08eW91cnNjcmlwdD4gLS1maWxlPW91dGZpbGUgLXEKLVxlbmR7dmVyYmF0aW19Ci0KLUFzIGl0IHBhcnNlcyB0aGUgY29tbWFuZCBsaW5lLCBcY29kZXtvcHRwYXJzZX0gc2V0cyBhdHRyaWJ1dGVzIG9mIHRoZQotXGNvZGV7b3B0aW9uc30gb2JqZWN0IHJldHVybmVkIGJ5IFxtZXRob2R7cGFyc2V7XF99YXJncygpfSBiYXNlZCBvbiB1c2VyLXN1cHBsaWVkCi1jb21tYW5kLWxpbmUgdmFsdWVzLiAgV2hlbiBcbWV0aG9ke3BhcnNle1xffWFyZ3MoKX0gcmV0dXJucyBmcm9tIHBhcnNpbmcgdGhpcwotY29tbWFuZCBsaW5lLCBcY29kZXtvcHRpb25zLmZpbGVuYW1lfSB3aWxsIGJlIFxjb2RleyJvdXRmaWxlIn0gYW5kCi1cY29kZXtvcHRpb25zLnZlcmJvc2V9IHdpbGwgYmUgXGNvZGV7RmFsc2V9LiAgXGNvZGV7b3B0cGFyc2V9IHN1cHBvcnRzIGJvdGggbG9uZwotYW5kIHNob3J0IG9wdGlvbnMsIGFsbG93cyBzaG9ydCBvcHRpb25zIHRvIGJlIG1lcmdlZCB0b2dldGhlciwgYW5kCi1hbGxvd3Mgb3B0aW9ucyB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlaXIgYXJndW1lbnRzIGluIGEgdmFyaWV0eSBvZgotd2F5cy4gIFRodXMsIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBsaW5lcyBhcmUgYWxsIGVxdWl2YWxlbnQgdG8gdGhlIGFib3ZlCi1leGFtcGxlOgotXGJlZ2lue3ZlcmJhdGltfQotPHlvdXJzY3JpcHQ+IC1mIG91dGZpbGUgLS1xdWlldAotPHlvdXJzY3JpcHQ+IC0tcXVpZXQgLS1maWxlIG91dGZpbGUKLTx5b3Vyc2NyaXB0PiAtcSAtZm91dGZpbGUKLTx5b3Vyc2NyaXB0PiAtcWZvdXRmaWxlCi1cZW5ke3ZlcmJhdGltfQotCi1BZGRpdGlvbmFsbHksIHVzZXJzIGNhbiBydW4gb25lIG9mCi1cYmVnaW57dmVyYmF0aW19Ci08eW91cnNjcmlwdD4gLWgKLTx5b3Vyc2NyaXB0PiAtLWhlbHAKLVxlbmR7dmVyYmF0aW19Ci0KLWFuZCBcY29kZXtvcHRwYXJzZX0gd2lsbCBwcmludCBvdXQgYSBicmllZiBzdW1tYXJ5IG9mIHlvdXIgc2NyaXB0J3MKLW9wdGlvbnM6Ci1cYmVnaW57dmVyYmF0aW19Ci11c2FnZTogPHlvdXJzY3JpcHQ+IFtvcHRpb25zXQotCi1vcHRpb25zOgotICAtaCwgLS1oZWxwICAgICAgICAgICAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAotICAtZiBGSUxFLCAtLWZpbGU9RklMRSAgd3JpdGUgcmVwb3J0IHRvIEZJTEUKLSAgLXEsIC0tcXVpZXQgICAgICAgICAgIGRvbid0IHByaW50IHN0YXR1cyBtZXNzYWdlcyB0byBzdGRvdXQKLVxlbmR7dmVyYmF0aW19Ci0KLXdoZXJlIHRoZSB2YWx1ZSBvZiBcZW1waHt5b3Vyc2NyaXB0fSBpcyBkZXRlcm1pbmVkIGF0IHJ1bnRpbWUgKG5vcm1hbGx5Ci1mcm9tIFxjb2Rle3N5cy5hcmd2e1t9MF19KS4KLSUgJElkOiBpbnRyby50eHQgNDEzIDIwMDQtMDktMjggMDA6NTk6MTNaIGdyZWcgJCAKLQotCi1cc3Vic2VjdGlvbntCYWNrZ3JvdW5kXGxhYmVse29wdHBhcnNlLWJhY2tncm91bmR9fQotCi1cbW9kdWxle29wdHBhcnNlfSB3YXMgZXhwbGljaXRseSBkZXNpZ25lZCB0byBlbmNvdXJhZ2UgdGhlIGNyZWF0aW9uIG9mIHByb2dyYW1zIHdpdGgKLXN0cmFpZ2h0Zm9yd2FyZCwgY29udmVudGlvbmFsIGNvbW1hbmQtbGluZSBpbnRlcmZhY2VzLiAgVG8gdGhhdCBlbmQsIGl0Ci1zdXBwb3J0cyBvbmx5IHRoZSBtb3N0IGNvbW1vbiBjb21tYW5kLWxpbmUgc3ludGF4IGFuZCBzZW1hbnRpY3MKLWNvbnZlbnRpb25hbGx5IHVzZWQgdW5kZXIgXFVOSVh7fS4gIElmIHlvdSBhcmUgdW5mYW1pbGlhciB3aXRoIHRoZXNlCi1jb252ZW50aW9ucywgcmVhZCB0aGlzIHNlY3Rpb24gdG8gYWNxdWFpbnQgeW91cnNlbGYgd2l0aCB0aGVtLgotCi0KLVxzdWJzdWJzZWN0aW9ue1Rlcm1pbm9sb2d5XGxhYmVse29wdHBhcnNlLXRlcm1pbm9sb2d5fX0KLVxiZWdpbntkZXNjcmlwdGlvbn0KLVxpdGVtW2FyZ3VtZW50XQotYSBzdHJpbmcgZW50ZXJlZCBvbiB0aGUgY29tbWFuZC1saW5lLCBhbmQgcGFzc2VkIGJ5IHRoZSBzaGVsbCB0bwotXGNvZGV7ZXhlY2woKX0gb3IgXGNvZGV7ZXhlY3YoKX0uICBJbiBQeXRob24sIGFyZ3VtZW50cyBhcmUgZWxlbWVudHMgb2YKLVxjb2Rle3N5cy5hcmd2e1t9MTpdfSAoXGNvZGV7c3lzLmFyZ3Z7W30wXX0gaXMgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gYmVpbmcKLWV4ZWN1dGVkKS4gIFxVTklYe30gc2hlbGxzIGFsc28gdXNlIHRoZSB0ZXJtIGBgd29yZCcnLgotCi1JdCBpcyBvY2Nhc2lvbmFsbHkgZGVzaXJhYmxlIHRvIHN1YnN0aXR1dGUgYW4gYXJndW1lbnQgbGlzdCBvdGhlcgotdGhhbiBcY29kZXtzeXMuYXJndntbfTE6XX0sIHNvIHlvdSBzaG91bGQgcmVhZCBgYGFyZ3VtZW50JycgYXMgYGBhbiBlbGVtZW50IG9mCi1cY29kZXtzeXMuYXJndntbfTE6XX0sIG9yIG9mIHNvbWUgb3RoZXIgbGlzdCBwcm92aWRlZCBhcyBhIHN1YnN0aXR1dGUgZm9yCi1cY29kZXtzeXMuYXJndntbfTE6XX0nJy4KLVxpdGVtW29wdGlvbiAgIF0KLWFuIGFyZ3VtZW50IHVzZWQgdG8gc3VwcGx5IGV4dHJhIGluZm9ybWF0aW9uIHRvIGd1aWRlIG9yIGN1c3RvbWl6ZSB0aGUKLWV4ZWN1dGlvbiBvZiBhIHByb2dyYW0uICBUaGVyZSBhcmUgbWFueSBkaWZmZXJlbnQgc3ludGF4ZXMgZm9yCi1vcHRpb25zOyB0aGUgdHJhZGl0aW9uYWwgXFVOSVh7fSBzeW50YXggaXMgYSBoeXBoZW4gKGBgLScnKSBmb2xsb3dlZCBieSBhCi1zaW5nbGUgbGV0dGVyLCBlLmcuIFxjb2RleyIteCJ9IG9yIFxjb2RleyItRiJ9LiAgQWxzbywgdHJhZGl0aW9uYWwgXFVOSVh7fQotc3ludGF4IGFsbG93cyBtdWx0aXBsZSBvcHRpb25zIHRvIGJlIG1lcmdlZCBpbnRvIGEgc2luZ2xlIGFyZ3VtZW50LAotZS5nLiAgXGNvZGV7Ii14IC1GIn0gaXMgZXF1aXZhbGVudCB0byBcY29kZXsiLXhGIn0uICBUaGUgR05VIHByb2plY3QKLWludHJvZHVjZWQgXGNvZGV7Ii17fS0ifSBmb2xsb3dlZCBieSBhIHNlcmllcyBvZiBoeXBoZW4tc2VwYXJhdGVkIHdvcmRzLAotZS5nLiBcY29kZXsiLXt9LWZpbGUifSBvciBcY29kZXsiLXt9LWRyeS1ydW4ifS4gIFRoZXNlIGFyZSB0aGUgb25seSB0d28gb3B0aW9uCi1zeW50YXhlcyBwcm92aWRlZCBieSBcbW9kdWxle29wdHBhcnNlfS4KLQotU29tZSBvdGhlciBvcHRpb24gc3ludGF4ZXMgdGhhdCB0aGUgd29ybGQgaGFzIHNlZW4gaW5jbHVkZToKLVxiZWdpbntpdGVtaXplfQotXGl0ZW0ge30gCi1hIGh5cGhlbiBmb2xsb3dlZCBieSBhIGZldyBsZXR0ZXJzLCBlLmcuIFxjb2RleyItcGYifSAodGhpcyBpcwotXGVtcGh7bm90fSB0aGUgc2FtZSBhcyBtdWx0aXBsZSBvcHRpb25zIG1lcmdlZCBpbnRvIGEgc2luZ2xlIGFyZ3VtZW50KQotCi1caXRlbSB7fSAKLWEgaHlwaGVuIGZvbGxvd2VkIGJ5IGEgd2hvbGUgd29yZCwgZS5nLiBcY29kZXsiLWZpbGUifSAodGhpcyBpcwotdGVjaG5pY2FsbHkgZXF1aXZhbGVudCB0byB0aGUgcHJldmlvdXMgc3ludGF4LCBidXQgdGhleSBhcmVuJ3QKLXVzdWFsbHkgc2VlbiBpbiB0aGUgc2FtZSBwcm9ncmFtKQotCi1caXRlbSB7fSAKLWEgcGx1cyBzaWduIGZvbGxvd2VkIGJ5IGEgc2luZ2xlIGxldHRlciwgb3IgYSBmZXcgbGV0dGVycywKLW9yIGEgd29yZCwgZS5nLiBcY29kZXsiK2YifSwgXGNvZGV7IityZ2IifQotCi1caXRlbSB7fSAKLWEgc2xhc2ggZm9sbG93ZWQgYnkgYSBsZXR0ZXIsIG9yIGEgZmV3IGxldHRlcnMsIG9yIGEgd29yZCwgZS5nLgotXGNvZGV7Ii9mIn0sIFxjb2RleyIvZmlsZSJ9Ci0KLVxlbmR7aXRlbWl6ZX0KLQotVGhlc2Ugb3B0aW9uIHN5bnRheGVzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IFxtb2R1bGV7b3B0cGFyc2V9LCBhbmQgdGhleSBuZXZlciB3aWxsCi1iZS4gIFRoaXMgaXMgZGVsaWJlcmF0ZTogdGhlIGZpcnN0IHRocmVlIGFyZSBub24tc3RhbmRhcmQgb24gYW55Ci1lbnZpcm9ubWVudCwgYW5kIHRoZSBsYXN0IG9ubHkgbWFrZXMgc2Vuc2UgaWYgeW91J3JlIGV4Y2x1c2l2ZWx5Ci10YXJnZXRpbmcgVk1TLCBNUy1ET1MsIGFuZC9vciBXaW5kb3dzLgotXGl0ZW1bb3B0aW9uIGFyZ3VtZW50XQotYW4gYXJndW1lbnQgdGhhdCBmb2xsb3dzIGFuIG9wdGlvbiwgaXMgY2xvc2VseSBhc3NvY2lhdGVkIHdpdGggdGhhdAotb3B0aW9uLCBhbmQgaXMgY29uc3VtZWQgZnJvbSB0aGUgYXJndW1lbnQgbGlzdCB3aGVuIHRoYXQgb3B0aW9uIGlzLgotV2l0aCBcbW9kdWxle29wdHBhcnNlfSwgb3B0aW9uIGFyZ3VtZW50cyBtYXkgZWl0aGVyIGJlIGluIGEgc2VwYXJhdGUgYXJndW1lbnQKLWZyb20gdGhlaXIgb3B0aW9uOgotXGJlZ2lue3ZlcmJhdGltfQotLWYgZm9vCi0tLWZpbGUgZm9vCi1cZW5ke3ZlcmJhdGltfQotCi1vciBpbmNsdWRlZCBpbiB0aGUgc2FtZSBhcmd1bWVudDoKLVxiZWdpbnt2ZXJiYXRpbX0KLS1mZm9vCi0tLWZpbGU9Zm9vCi1cZW5ke3ZlcmJhdGltfQotCi1UeXBpY2FsbHksIGEgZ2l2ZW4gb3B0aW9uIGVpdGhlciB0YWtlcyBhbiBhcmd1bWVudCBvciBpdCBkb2Vzbid0LgotTG90cyBvZiBwZW9wbGUgd2FudCBhbiBgYG9wdGlvbmFsIG9wdGlvbiBhcmd1bWVudHMnJyBmZWF0dXJlLCBtZWFuaW5nCi10aGF0IHNvbWUgb3B0aW9ucyB3aWxsIHRha2UgYW4gYXJndW1lbnQgaWYgdGhleSBzZWUgaXQsIGFuZCB3b24ndCBpZgotdGhleSBkb24ndC4gIFRoaXMgaXMgc29tZXdoYXQgY29udHJvdmVyc2lhbCwgYmVjYXVzZSBpdCBtYWtlcyBwYXJzaW5nCi1hbWJpZ3VvdXM6IGlmIFxjb2RleyItYSJ9IHRha2VzIGFuIG9wdGlvbmFsIGFyZ3VtZW50IGFuZCBcY29kZXsiLWIifSBpcwotYW5vdGhlciBvcHRpb24gZW50aXJlbHksIGhvdyBkbyB3ZSBpbnRlcnByZXQgXGNvZGV7Ii1hYiJ9PyAgQmVjYXVzZSBvZgotdGhpcyBhbWJpZ3VpdHksIFxtb2R1bGV7b3B0cGFyc2V9IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgotXGl0ZW1bcG9zaXRpb25hbCBhcmd1bWVudF0KLXNvbWV0aGluZyBsZWZ0b3ZlciBpbiB0aGUgYXJndW1lbnQgbGlzdCBhZnRlciBvcHRpb25zIGhhdmUgYmVlbgotcGFyc2VkLCBpLmUuIGFmdGVyIG9wdGlvbnMgYW5kIHRoZWlyIGFyZ3VtZW50cyBoYXZlIGJlZW4gcGFyc2VkIGFuZAotcmVtb3ZlZCBmcm9tIHRoZSBhcmd1bWVudCBsaXN0LgotXGl0ZW1bcmVxdWlyZWQgb3B0aW9uXQotYW4gb3B0aW9uIHRoYXQgbXVzdCBiZSBzdXBwbGllZCBvbiB0aGUgY29tbWFuZC1saW5lOyBub3RlIHRoYXQgdGhlCi1waHJhc2UgYGByZXF1aXJlZCBvcHRpb24nJyBpcyBzZWxmLWNvbnRyYWRpY3RvcnkgaW4gRW5nbGlzaC4gIFxtb2R1bGV7b3B0cGFyc2V9Ci1kb2Vzbid0IHByZXZlbnQgeW91IGZyb20gaW1wbGVtZW50aW5nIHJlcXVpcmVkIG9wdGlvbnMsIGJ1dCBkb2Vzbid0Ci1naXZlIHlvdSBtdWNoIGhlbHAgYXQgaXQgZWl0aGVyLiAgU2VlIFxjb2Rle2V4YW1wbGVzL3JlcXVpcmVke1xffTEucHl9IGFuZAotXGNvZGV7ZXhhbXBsZXMvcmVxdWlyZWR7XF99Mi5weX0gaW4gdGhlIFxtb2R1bGV7b3B0cGFyc2V9IHNvdXJjZSBkaXN0cmlidXRpb24gZm9yIHR3bwotd2F5cyB0byBpbXBsZW1lbnQgcmVxdWlyZWQgb3B0aW9ucyB3aXRoIFxtb2R1bGV7b3B0cGFyc2V9LgotXGVuZHtkZXNjcmlwdGlvbn0KLQotRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoaXMgaHlwb3RoZXRpY2FsIGNvbW1hbmQtbGluZToKLVxiZWdpbnt2ZXJiYXRpbX0KLXByb2cgLXYgLS1yZXBvcnQgL3RtcC9yZXBvcnQudHh0IGZvbyBiYXIKLVxlbmR7dmVyYmF0aW19Ci0KLVxjb2RleyItdiJ9IGFuZCBcY29kZXsiLXt9LXJlcG9ydCJ9IGFyZSBib3RoIG9wdGlvbnMuICBBc3N1bWluZyB0aGF0Ci1cbG9uZ3Byb2dyYW1vcHR7cmVwb3J0fSB0YWtlcyBvbmUgYXJndW1lbnQsIFxjb2RleyIvdG1wL3JlcG9ydC50eHQifSBpcyBhbiBvcHRpb24KLWFyZ3VtZW50LiAgXGNvZGV7ImZvbyJ9IGFuZCBcY29kZXsiYmFyIn0gYXJlIHBvc2l0aW9uYWwgYXJndW1lbnRzLgotCi0KLVxzdWJzdWJzZWN0aW9ue1doYXQgYXJlIG9wdGlvbnMgZm9yP1xsYWJlbHtvcHRwYXJzZS13aGF0LW9wdGlvbnMtZm9yfX0KLQotT3B0aW9ucyBhcmUgdXNlZCB0byBwcm92aWRlIGV4dHJhIGluZm9ybWF0aW9uIHRvIHR1bmUgb3IgY3VzdG9taXplIHRoZQotZXhlY3V0aW9uIG9mIGEgcHJvZ3JhbS4gIEluIGNhc2UgaXQgd2Fzbid0IGNsZWFyLCBvcHRpb25zIGFyZSB1c3VhbGx5Ci1cZW1waHtvcHRpb25hbH0uICBBIHByb2dyYW0gc2hvdWxkIGJlIGFibGUgdG8gcnVuIGp1c3QgZmluZSB3aXRoIG5vIG9wdGlvbnMKLXdoYXRzb2V2ZXIuICAoUGljayBhIHJhbmRvbSBwcm9ncmFtIGZyb20gdGhlIFxVTklYe30gb3IgR05VIHRvb2xzZXRzLiAgQ2FuCi1pdCBydW4gd2l0aG91dCBhbnkgb3B0aW9ucyBhdCBhbGwgYW5kIHN0aWxsIG1ha2Ugc2Vuc2U/ICBUaGUgbWFpbgotZXhjZXB0aW9ucyBhcmUgXGNvZGV7ZmluZH0sIFxjb2Rle3Rhcn0sIGFuZCBcY29kZXtkZH17LS0tfWFsbCBvZiB3aGljaCBhcmUgbXV0YW50Ci1vZGRiYWxscyB0aGF0IGhhdmUgYmVlbiByaWdodGx5IGNyaXRpY2l6ZWQgZm9yIHRoZWlyIG5vbi1zdGFuZGFyZCBzeW50YXgKLWFuZCBjb25mdXNpbmcgaW50ZXJmYWNlcy4pCi0KLUxvdHMgb2YgcGVvcGxlIHdhbnQgdGhlaXIgcHJvZ3JhbXMgdG8gaGF2ZSBgYHJlcXVpcmVkIG9wdGlvbnMnJy4gIFRoaW5rCi1hYm91dCBpdC4gIElmIGl0J3MgcmVxdWlyZWQsIHRoZW4gaXQncyBcZW1waHtub3Qgb3B0aW9uYWx9ISAgSWYgdGhlcmUgaXMgYQotcGllY2Ugb2YgaW5mb3JtYXRpb24gdGhhdCB5b3VyIHByb2dyYW0gYWJzb2x1dGVseSByZXF1aXJlcyBpbiBvcmRlciB0bwotcnVuIHN1Y2Nlc3NmdWxseSwgdGhhdCdzIHdoYXQgcG9zaXRpb25hbCBhcmd1bWVudHMgYXJlIGZvci4KLQotQXMgYW4gZXhhbXBsZSBvZiBnb29kIGNvbW1hbmQtbGluZSBpbnRlcmZhY2UgZGVzaWduLCBjb25zaWRlciB0aGUgaHVtYmxlCi1cY29kZXtjcH0gdXRpbGl0eSwgZm9yIGNvcHlpbmcgZmlsZXMuICBJdCBkb2Vzbid0IG1ha2UgbXVjaCBzZW5zZSB0byB0cnkgdG8KLWNvcHkgZmlsZXMgd2l0aG91dCBzdXBwbHlpbmcgYSBkZXN0aW5hdGlvbiBhbmQgYXQgbGVhc3Qgb25lIHNvdXJjZS4KLUhlbmNlLCBcY29kZXtjcH0gZmFpbHMgaWYgeW91IHJ1biBpdCB3aXRoIG5vIGFyZ3VtZW50cy4gIEhvd2V2ZXIsIGl0IGhhcyBhCi1mbGV4aWJsZSwgdXNlZnVsIHN5bnRheCB0aGF0IGRvZXMgbm90IHJlcXVpcmUgYW55IG9wdGlvbnMgYXQgYWxsOgotXGJlZ2lue3ZlcmJhdGltfQotY3AgU09VUkNFIERFU1QKLWNwIFNPVVJDRSAuLi4gREVTVC1ESVIKLVxlbmR7dmVyYmF0aW19Ci0KLVlvdSBjYW4gZ2V0IHByZXR0eSBmYXIgd2l0aCBqdXN0IHRoYXQuICBNb3N0IFxjb2Rle2NwfSBpbXBsZW1lbnRhdGlvbnMKLXByb3ZpZGUgYSBidW5jaCBvZiBvcHRpb25zIHRvIHR3ZWFrIGV4YWN0bHkgaG93IHRoZSBmaWxlcyBhcmUgY29waWVkOgoteW91IGNhbiBwcmVzZXJ2ZSBtb2RlIGFuZCBtb2RpZmljYXRpb24gdGltZSwgYXZvaWQgZm9sbG93aW5nIHN5bWxpbmtzLAotYXNrIGJlZm9yZSBjbG9iYmVyaW5nIGV4aXN0aW5nIGZpbGVzLCBldGMuICBCdXQgbm9uZSBvZiB0aGlzIGRpc3RyYWN0cwotZnJvbSB0aGUgY29yZSBtaXNzaW9uIG9mIFxjb2Rle2NwfSwgd2hpY2ggaXMgdG8gY29weSBlaXRoZXIgb25lIGZpbGUgdG8KLWFub3RoZXIsIG9yIHNldmVyYWwgZmlsZXMgdG8gYW5vdGhlciBkaXJlY3RvcnkuCi0KLQotXHN1YnN1YnNlY3Rpb257V2hhdCBhcmUgcG9zaXRpb25hbCBhcmd1bWVudHMgZm9yP1xsYWJlbHtvcHRwYXJzZS13aGF0LXBvc2l0aW9uYWwtYXJndW1lbnRzLWZvcn19Ci0KLVBvc2l0aW9uYWwgYXJndW1lbnRzIGFyZSBmb3IgdGhvc2UgcGllY2VzIG9mIGluZm9ybWF0aW9uIHRoYXQgeW91cgotcHJvZ3JhbSBhYnNvbHV0ZWx5LCBwb3NpdGl2ZWx5IHJlcXVpcmVzIHRvIHJ1bi4KLQotQSBnb29kIHVzZXIgaW50ZXJmYWNlIHNob3VsZCBoYXZlIGFzIGZldyBhYnNvbHV0ZSByZXF1aXJlbWVudHMgYXMKLXBvc3NpYmxlLiAgSWYgeW91ciBwcm9ncmFtIHJlcXVpcmVzIDE3IGRpc3RpbmN0IHBpZWNlcyBvZiBpbmZvcm1hdGlvbiBpbgotb3JkZXIgdG8gcnVuIHN1Y2Nlc3NmdWxseSwgaXQgZG9lc24ndCBtdWNoIG1hdHRlciBcZW1waHtob3d9IHlvdSBnZXQgdGhhdAotaW5mb3JtYXRpb24gZnJvbSB0aGUgdXNlcnstLS19bW9zdCBwZW9wbGUgd2lsbCBnaXZlIHVwIGFuZCB3YWxrIGF3YXkKLWJlZm9yZSB0aGV5IHN1Y2Nlc3NmdWxseSBydW4gdGhlIHByb2dyYW0uICBUaGlzIGFwcGxpZXMgd2hldGhlciB0aGUgdXNlcgotaW50ZXJmYWNlIGlzIGEgY29tbWFuZC1saW5lLCBhIGNvbmZpZ3VyYXRpb24gZmlsZSwgb3IgYSBHVUk6IGlmIHlvdSBtYWtlCi10aGF0IG1hbnkgZGVtYW5kcyBvbiB5b3VyIHVzZXJzLCBtb3N0IG9mIHRoZW0gd2lsbCBzaW1wbHkgZ2l2ZSB1cC4KLQotSW4gc2hvcnQsIHRyeSB0byBtaW5pbWl6ZSB0aGUgYW1vdW50IG9mIGluZm9ybWF0aW9uIHRoYXQgdXNlcnMgYXJlCi1hYnNvbHV0ZWx5IHJlcXVpcmVkIHRvIHN1cHBseXstLS19dXNlIHNlbnNpYmxlIGRlZmF1bHRzIHdoZW5ldmVyCi1wb3NzaWJsZS4gIE9mIGNvdXJzZSwgeW91IGFsc28gd2FudCB0byBtYWtlIHlvdXIgcHJvZ3JhbXMgcmVhc29uYWJseQotZmxleGlibGUuICBUaGF0J3Mgd2hhdCBvcHRpb25zIGFyZSBmb3IuICBBZ2FpbiwgaXQgZG9lc24ndCBtYXR0ZXIgaWYKLXRoZXkgYXJlIGVudHJpZXMgaW4gYSBjb25maWcgZmlsZSwgd2lkZ2V0cyBpbiB0aGUgYGBQcmVmZXJlbmNlcycnIGRpYWxvZwotb2YgYSBHVUksIG9yIGNvbW1hbmQtbGluZSBvcHRpb25zey0tLX10aGUgbW9yZSBvcHRpb25zIHlvdSBpbXBsZW1lbnQsIHRoZQotbW9yZSBmbGV4aWJsZSB5b3VyIHByb2dyYW0gaXMsIGFuZCB0aGUgbW9yZSBjb21wbGljYXRlZCBpdHMKLWltcGxlbWVudGF0aW9uIGJlY29tZXMuICBUb28gbXVjaCBmbGV4aWJpbGl0eSBoYXMgZHJhd2JhY2tzIGFzIHdlbGwsIG9mCi1jb3Vyc2U7IHRvbyBtYW55IG9wdGlvbnMgY2FuIG92ZXJ3aGVsbSB1c2VycyBhbmQgbWFrZSB5b3VyIGNvZGUgbXVjaAotaGFyZGVyIHRvIG1haW50YWluLgotJSAkSWQ6IHRhby50eHQgNDEzIDIwMDQtMDktMjggMDA6NTk6MTNaIGdyZWcgJCAKLQotCi1cc3Vic2VjdGlvbntUdXRvcmlhbFxsYWJlbHtvcHRwYXJzZS10dXRvcmlhbH19Ci0KLVdoaWxlIFxtb2R1bGV7b3B0cGFyc2V9IGlzIHF1aXRlIGZsZXhpYmxlIGFuZCBwb3dlcmZ1bCwgaXQncyBhbHNvIHN0cmFpZ2h0Zm9yd2FyZCB0bwotdXNlIGluIG1vc3QgY2FzZXMuICBUaGlzIHNlY3Rpb24gY292ZXJzIHRoZSBjb2RlIHBhdHRlcm5zIHRoYXQgYXJlCi1jb21tb24gdG8gYW55IFxtb2R1bGV7b3B0cGFyc2V9LWJhc2VkIHByb2dyYW0uCi0KLUZpcnN0LCB5b3UgbmVlZCB0byBpbXBvcnQgdGhlIE9wdGlvblBhcnNlciBjbGFzczsgdGhlbiwgZWFybHkgaW4gdGhlCi1tYWluIHByb2dyYW0sIGNyZWF0ZSBhbiBPcHRpb25QYXJzZXIgaW5zdGFuY2U6Ci1cYmVnaW57dmVyYmF0aW19Ci1mcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXIKLVsuLi5dCi1wYXJzZXIgPSBPcHRpb25QYXJzZXIoKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlbiB5b3UgY2FuIHN0YXJ0IGRlZmluaW5nIG9wdGlvbnMuICBUaGUgYmFzaWMgc3ludGF4IGlzOgotXGJlZ2lue3ZlcmJhdGltfQotcGFyc2VyLmFkZF9vcHRpb24ob3B0X3N0ciwgLi4uLAotICAgICAgICAgICAgICAgICAgYXR0cj12YWx1ZSwgLi4uKQotXGVuZHt2ZXJiYXRpbX0KLQotRWFjaCBvcHRpb24gaGFzIG9uZSBvciBtb3JlIG9wdGlvbiBzdHJpbmdzLCBzdWNoIGFzIFxjb2RleyItZiJ9IG9yCi1cY29kZXsiLXt9LWZpbGUifSwgYW5kIHNldmVyYWwgb3B0aW9uIGF0dHJpYnV0ZXMgdGhhdCB0ZWxsIFxtb2R1bGV7b3B0cGFyc2V9IHdoYXQgdG8KLWV4cGVjdCBhbmQgd2hhdCB0byBkbyB3aGVuIGl0IGVuY291bnRlcnMgdGhhdCBvcHRpb24gb24gdGhlIGNvbW1hbmQKLWxpbmUuCi0KLVR5cGljYWxseSwgZWFjaCBvcHRpb24gd2lsbCBoYXZlIG9uZSBzaG9ydCBvcHRpb24gc3RyaW5nIGFuZCBvbmUgbG9uZwotb3B0aW9uIHN0cmluZywgZS5nLjoKLVxiZWdpbnt2ZXJiYXRpbX0KLXBhcnNlci5hZGRfb3B0aW9uKCItZiIsICItLWZpbGUiLCAuLi4pCi1cZW5ke3ZlcmJhdGltfQotCi1Zb3UncmUgZnJlZSB0byBkZWZpbmUgYXMgbWFueSBzaG9ydCBvcHRpb24gc3RyaW5ncyBhbmQgYXMgbWFueSBsb25nCi1vcHRpb24gc3RyaW5ncyBhcyB5b3UgbGlrZSAoaW5jbHVkaW5nIHplcm8pLCBhcyBsb25nIGFzIHRoZXJlIGlzIGF0Ci1sZWFzdCBvbmUgb3B0aW9uIHN0cmluZyBvdmVyYWxsLgotCi1UaGUgb3B0aW9uIHN0cmluZ3MgcGFzc2VkIHRvIFxtZXRob2R7YWRke1xffW9wdGlvbigpfSBhcmUgZWZmZWN0aXZlbHkgbGFiZWxzIGZvcgotdGhlIG9wdGlvbiBkZWZpbmVkIGJ5IHRoYXQgY2FsbC4gIEZvciBicmV2aXR5LCB3ZSB3aWxsIGZyZXF1ZW50bHkgcmVmZXIKLXRvIFxlbXBoe2VuY291bnRlcmluZyBhbiBvcHRpb259IG9uIHRoZSBjb21tYW5kIGxpbmU7IGluIHJlYWxpdHksIFxtb2R1bGV7b3B0cGFyc2V9Ci1lbmNvdW50ZXJzIFxlbXBoe29wdGlvbiBzdHJpbmdzfSBhbmQgbG9va3MgdXAgb3B0aW9ucyBmcm9tIHRoZW0uCi0KLU9uY2UgYWxsIG9mIHlvdXIgb3B0aW9ucyBhcmUgZGVmaW5lZCwgaW5zdHJ1Y3QgXG1vZHVsZXtvcHRwYXJzZX0gdG8gcGFyc2UgeW91cgotcHJvZ3JhbSdzIGNvbW1hbmQgbGluZToKLVxiZWdpbnt2ZXJiYXRpbX0KLShvcHRpb25zLCBhcmdzKSA9IHBhcnNlci5wYXJzZV9hcmdzKCkKLVxlbmR7dmVyYmF0aW19Ci0KLShJZiB5b3UgbGlrZSwgeW91IGNhbiBwYXNzIGEgY3VzdG9tIGFyZ3VtZW50IGxpc3QgdG8gXG1ldGhvZHtwYXJzZXtcX31hcmdzKCl9LAotYnV0IHRoYXQncyByYXJlbHkgbmVjZXNzYXJ5OiBieSBkZWZhdWx0IGl0IHVzZXMgXGNvZGV7c3lzLmFyZ3Z7W30xOl19LikKLQotXG1ldGhvZHtwYXJzZXtcX31hcmdzKCl9IHJldHVybnMgdHdvIHZhbHVlczoKLVxiZWdpbntpdGVtaXplfQotXGl0ZW0ge30gCi1cY29kZXtvcHRpb25zfSwgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdmFsdWVzIGZvciBhbGwgb2YgeW91ciBvcHRpb25zey0tLX1lLmcuIGlmIFxjb2RleyIte30tZmlsZSJ9IHRha2VzIGEgc2luZ2xlIHN0cmluZyBhcmd1bWVudCwgdGhlbgotXGNvZGV7b3B0aW9ucy5maWxlfSB3aWxsIGJlIHRoZSBmaWxlbmFtZSBzdXBwbGllZCBieSB0aGUgdXNlciwgb3IKLVxjb2Rle05vbmV9IGlmIHRoZSB1c2VyIGRpZCBub3Qgc3VwcGx5IHRoYXQgb3B0aW9uCi0KLVxpdGVtIHt9IAotXGNvZGV7YXJnc30sIHRoZSBsaXN0IG9mIHBvc2l0aW9uYWwgYXJndW1lbnRzIGxlZnRvdmVyIGFmdGVyIHBhcnNpbmcKLW9wdGlvbnMKLQotXGVuZHtpdGVtaXplfQotCi1UaGlzIHR1dG9yaWFsIHNlY3Rpb24gb25seSBjb3ZlcnMgdGhlIGZvdXIgbW9zdCBpbXBvcnRhbnQgb3B0aW9uCi1hdHRyaWJ1dGVzOiBcbWVtYmVye2FjdGlvbn0sIFxtZW1iZXJ7dHlwZX0sIFxtZW1iZXJ7ZGVzdH0gKGRlc3RpbmF0aW9uKSwgYW5kIFxtZW1iZXJ7aGVscH0uCi1PZiB0aGVzZSwgXG1lbWJlcnthY3Rpb259IGlzIHRoZSBtb3N0IGZ1bmRhbWVudGFsLgotCi0KLVxzdWJzdWJzZWN0aW9ue1VuZGVyc3RhbmRpbmcgb3B0aW9uIGFjdGlvbnNcbGFiZWx7b3B0cGFyc2UtdW5kZXJzdGFuZGluZy1vcHRpb24tYWN0aW9uc319Ci0KLUFjdGlvbnMgdGVsbCBcbW9kdWxle29wdHBhcnNlfSB3aGF0IHRvIGRvIHdoZW4gaXQgZW5jb3VudGVycyBhbiBvcHRpb24gb24gdGhlCi1jb21tYW5kIGxpbmUuICBUaGVyZSBpcyBhIGZpeGVkIHNldCBvZiBhY3Rpb25zIGhhcmQtY29kZWQgaW50byBcbW9kdWxle29wdHBhcnNlfTsKLWFkZGluZyBuZXcgYWN0aW9ucyBpcyBhbiBhZHZhbmNlZCB0b3BpYyBjb3ZlcmVkIGluIHNlY3Rpb25+XHJlZntvcHRwYXJzZS1leHRlbmRpbmctb3B0cGFyc2V9LCBFeHRlbmRpbmcgXG1vZHVsZXtvcHRwYXJzZX0uCi1Nb3N0IGFjdGlvbnMgdGVsbCBcbW9kdWxle29wdHBhcnNlfSB0byBzdG9yZSBhIHZhbHVlIGluIHNvbWUgdmFyaWFibGV7LS0tfWZvcgotZXhhbXBsZSwgdGFrZSBhIHN0cmluZyBmcm9tIHRoZSBjb21tYW5kIGxpbmUgYW5kIHN0b3JlIGl0IGluIGFuCi1hdHRyaWJ1dGUgb2YgXGNvZGV7b3B0aW9uc30uCi0KLUlmIHlvdSBkb24ndCBzcGVjaWZ5IGFuIG9wdGlvbiBhY3Rpb24sIFxtb2R1bGV7b3B0cGFyc2V9IGRlZmF1bHRzIHRvIFxjb2Rle3N0b3JlfS4KLQotCi1cc3Vic3Vic2VjdGlvbntUaGUgc3RvcmUgYWN0aW9uXGxhYmVse29wdHBhcnNlLXN0b3JlLWFjdGlvbn19Ci0KLVRoZSBtb3N0IGNvbW1vbiBvcHRpb24gYWN0aW9uIGlzIFxjb2Rle3N0b3JlfSwgd2hpY2ggdGVsbHMgXG1vZHVsZXtvcHRwYXJzZX0gdG8gdGFrZQotdGhlIG5leHQgYXJndW1lbnQgKG9yIHRoZSByZW1haW5kZXIgb2YgdGhlIGN1cnJlbnQgYXJndW1lbnQpLCBlbnN1cmUKLXRoYXQgaXQgaXMgb2YgdGhlIGNvcnJlY3QgdHlwZSwgYW5kIHN0b3JlIGl0IHRvIHlvdXIgY2hvc2VuIGRlc3RpbmF0aW9uLgotCi1Gb3IgZXhhbXBsZToKLVxiZWdpbnt2ZXJiYXRpbX0KLXBhcnNlci5hZGRfb3B0aW9uKCItZiIsICItLWZpbGUiLAotICAgICAgICAgICAgICAgICAgYWN0aW9uPSJzdG9yZSIsIHR5cGU9InN0cmluZyIsIGRlc3Q9ImZpbGVuYW1lIikKLVxlbmR7dmVyYmF0aW19Ci0KLU5vdyBsZXQncyBtYWtlIHVwIGEgZmFrZSBjb21tYW5kIGxpbmUgYW5kIGFzayBcbW9kdWxle29wdHBhcnNlfSB0byBwYXJzZSBpdDoKLVxiZWdpbnt2ZXJiYXRpbX0KLWFyZ3MgPSBbIi1mIiwgImZvby50eHQiXQotKG9wdGlvbnMsIGFyZ3MpID0gcGFyc2VyLnBhcnNlX2FyZ3MoYXJncykKLVxlbmR7dmVyYmF0aW19Ci0KLVdoZW4gXG1vZHVsZXtvcHRwYXJzZX0gc2VlcyB0aGUgb3B0aW9uIHN0cmluZyBcY29kZXsiLWYifSwgaXQgY29uc3VtZXMgdGhlIG5leHQKLWFyZ3VtZW50LCBcY29kZXsiZm9vLnR4dCJ9LCBhbmQgc3RvcmVzIGl0IGluIFxjb2Rle29wdGlvbnMuZmlsZW5hbWV9LiAgU28sCi1hZnRlciB0aGlzIGNhbGwgdG8gXG1ldGhvZHtwYXJzZXtcX31hcmdzKCl9LCBcY29kZXtvcHRpb25zLmZpbGVuYW1lfSBpcwotXGNvZGV7ImZvby50eHQifS4KLQotU29tZSBvdGhlciBvcHRpb24gdHlwZXMgc3VwcG9ydGVkIGJ5IFxtb2R1bGV7b3B0cGFyc2V9IGFyZSBcY29kZXtpbnR9IGFuZCBcY29kZXtmbG9hdH0uCi1IZXJlJ3MgYW4gb3B0aW9uIHRoYXQgZXhwZWN0cyBhbiBpbnRlZ2VyIGFyZ3VtZW50OgotXGJlZ2lue3ZlcmJhdGltfQotcGFyc2VyLmFkZF9vcHRpb24oIi1uIiwgdHlwZT0iaW50IiwgZGVzdD0ibnVtIikKLVxlbmR7dmVyYmF0aW19Ci0KLU5vdGUgdGhhdCB0aGlzIG9wdGlvbiBoYXMgbm8gbG9uZyBvcHRpb24gc3RyaW5nLCB3aGljaCBpcyBwZXJmZWN0bHkKLWFjY2VwdGFibGUuICBBbHNvLCB0aGVyZSdzIG5vIGV4cGxpY2l0IGFjdGlvbiwgc2luY2UgdGhlIGRlZmF1bHQgaXMKLVxjb2Rle3N0b3JlfS4KLQotTGV0J3MgcGFyc2UgYW5vdGhlciBmYWtlIGNvbW1hbmQtbGluZS4gIFRoaXMgdGltZSwgd2UnbGwgamFtIHRoZSBvcHRpb24KLWFyZ3VtZW50IHJpZ2h0IHVwIGFnYWluc3QgdGhlIG9wdGlvbjogc2luY2UgXGNvZGV7Ii1uNDIifSAob25lIGFyZ3VtZW50KSBpcwotZXF1aXZhbGVudCB0byBcY29kZXsiLW4gNDIifSAodHdvIGFyZ3VtZW50cyksIHRoZSBjb2RlCi1cYmVnaW57dmVyYmF0aW19Ci0ob3B0aW9ucywgYXJncykgPSBwYXJzZXIucGFyc2VfYXJncyhbIi1uNDIiXSkKLXByaW50IG9wdGlvbnMubnVtCi1cZW5ke3ZlcmJhdGltfQotCi13aWxsIHByaW50IFxjb2RleyI0MiJ9LgotCi1JZiB5b3UgZG9uJ3Qgc3BlY2lmeSBhIHR5cGUsIFxtb2R1bGV7b3B0cGFyc2V9IGFzc3VtZXMgXGNvZGV7c3RyaW5nfS4gIENvbWJpbmVkIHdpdGggdGhlCi1mYWN0IHRoYXQgdGhlIGRlZmF1bHQgYWN0aW9uIGlzIFxjb2Rle3N0b3JlfSwgdGhhdCBtZWFucyBvdXIgZmlyc3QgZXhhbXBsZQotY2FuIGJlIGEgbG90IHNob3J0ZXI6Ci1cYmVnaW57dmVyYmF0aW19Ci1wYXJzZXIuYWRkX29wdGlvbigiLWYiLCAiLS1maWxlIiwgZGVzdD0iZmlsZW5hbWUiKQotXGVuZHt2ZXJiYXRpbX0KLQotSWYgeW91IGRvbid0IHN1cHBseSBhIGRlc3RpbmF0aW9uLCBcbW9kdWxle29wdHBhcnNlfSBmaWd1cmVzIG91dCBhIHNlbnNpYmxlIGRlZmF1bHQKLWZyb20gdGhlIG9wdGlvbiBzdHJpbmdzOiBpZiB0aGUgZmlyc3QgbG9uZyBvcHRpb24gc3RyaW5nIGlzCi1cY29kZXsiLXt9LWZvby1iYXIifSwgdGhlbiB0aGUgZGVmYXVsdCBkZXN0aW5hdGlvbiBpcyBcY29kZXtmb297XF99YmFyfS4gIElmIHRoZXJlCi1hcmUgbm8gbG9uZyBvcHRpb24gc3RyaW5ncywgXG1vZHVsZXtvcHRwYXJzZX0gbG9va3MgYXQgdGhlIGZpcnN0IHNob3J0IG9wdGlvbgotc3RyaW5nOiB0aGUgZGVmYXVsdCBkZXN0aW5hdGlvbiBmb3IgXGNvZGV7Ii1mIn0gaXMgXGNvZGV7Zn0uCi0KLVxtb2R1bGV7b3B0cGFyc2V9IGFsc28gaW5jbHVkZXMgYnVpbHQtaW4gXGNvZGV7bG9uZ30gYW5kIFxjb2Rle2NvbXBsZXh9IHR5cGVzLiAgQWRkaW5nCi10eXBlcyBpcyBjb3ZlcmVkIGluIHNlY3Rpb25+XHJlZntvcHRwYXJzZS1leHRlbmRpbmctb3B0cGFyc2V9LCBFeHRlbmRpbmcgXG1vZHVsZXtvcHRwYXJzZX0uCi0KLQotXHN1YnN1YnNlY3Rpb257SGFuZGxpbmcgYm9vbGVhbiAoZmxhZykgb3B0aW9uc1xsYWJlbHtvcHRwYXJzZS1oYW5kbGluZy1ib29sZWFuLW9wdGlvbnN9fQotCi1GbGFnIG9wdGlvbnN7LS0tfXNldCBhIHZhcmlhYmxlIHRvIHRydWUgb3IgZmFsc2Ugd2hlbiBhIHBhcnRpY3VsYXIgb3B0aW9uCi1pcyBzZWVuey0tLX1hcmUgcXVpdGUgY29tbW9uLiAgXG1vZHVsZXtvcHRwYXJzZX0gc3VwcG9ydHMgdGhlbSB3aXRoIHR3byBzZXBhcmF0ZQotYWN0aW9ucywgXGNvZGV7c3RvcmV7XF99dHJ1ZX0gYW5kIFxjb2Rle3N0b3Jle1xffWZhbHNlfS4gIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgaGF2ZSBhCi1cY29kZXt2ZXJib3NlfSBmbGFnIHRoYXQgaXMgdHVybmVkIG9uIHdpdGggXGNvZGV7Ii12In0gYW5kIG9mZiB3aXRoIFxjb2RleyItcSJ9OgotXGJlZ2lue3ZlcmJhdGltfQotcGFyc2VyLmFkZF9vcHRpb24oIi12IiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0idmVyYm9zZSIpCi1wYXJzZXIuYWRkX29wdGlvbigiLXEiLCBhY3Rpb249InN0b3JlX2ZhbHNlIiwgZGVzdD0idmVyYm9zZSIpCi1cZW5ke3ZlcmJhdGltfQotCi1IZXJlIHdlIGhhdmUgdHdvIGRpZmZlcmVudCBvcHRpb25zIHdpdGggdGhlIHNhbWUgZGVzdGluYXRpb24sIHdoaWNoIGlzCi1wZXJmZWN0bHkgT0suICAoSXQganVzdCBtZWFucyB5b3UgaGF2ZSB0byBiZSBhIGJpdCBjYXJlZnVsIHdoZW4gc2V0dGluZwotZGVmYXVsdCB2YWx1ZXN7LS0tfXNlZSBiZWxvdy4pCi0KLVdoZW4gXG1vZHVsZXtvcHRwYXJzZX0gZW5jb3VudGVycyBcY29kZXsiLXYifSBvbiB0aGUgY29tbWFuZCBsaW5lLCBpdCBzZXRzCi1cY29kZXtvcHRpb25zLnZlcmJvc2V9IHRvIFxjb2Rle1RydWV9OyB3aGVuIGl0IGVuY291bnRlcnMgXGNvZGV7Ii1xIn0sCi1cY29kZXtvcHRpb25zLnZlcmJvc2V9IGlzIHNldCB0byBcY29kZXtGYWxzZX0uCi0KLQotXHN1YnN1YnNlY3Rpb257T3RoZXIgYWN0aW9uc1xsYWJlbHtvcHRwYXJzZS1vdGhlci1hY3Rpb25zfX0KLQotU29tZSBvdGhlciBhY3Rpb25zIHN1cHBvcnRlZCBieSBcbW9kdWxle29wdHBhcnNlfSBhcmU6Ci1cYmVnaW57ZGVzY3JpcHRpb259Ci1caXRlbVtcY29kZXtzdG9yZXtcX31jb25zdH1dCi1zdG9yZSBhIGNvbnN0YW50IHZhbHVlCi1caXRlbVtcY29kZXthcHBlbmR9XQotYXBwZW5kIHRoaXMgb3B0aW9uJ3MgYXJndW1lbnQgdG8gYSBsaXN0Ci1caXRlbVtcY29kZXtjb3VudH1dCi1pbmNyZW1lbnQgYSBjb3VudGVyIGJ5IG9uZQotXGl0ZW1bXGNvZGV7Y2FsbGJhY2t9XQotY2FsbCBhIHNwZWNpZmllZCBmdW5jdGlvbgotXGVuZHtkZXNjcmlwdGlvbn0KLQotVGhlc2UgYXJlIGNvdmVyZWQgaW4gc2VjdGlvbn5ccmVme29wdHBhcnNlLXJlZmVyZW5jZS1ndWlkZX0sIFJlZmVyZW5jZSBHdWlkZSBhbmQgc2VjdGlvbn5ccmVme29wdHBhcnNlLW9wdGlvbi1jYWxsYmFja3N9LCBPcHRpb24gQ2FsbGJhY2tzLgotCi0KLVxzdWJzdWJzZWN0aW9ue0RlZmF1bHQgdmFsdWVzXGxhYmVse29wdHBhcnNlLWRlZmF1bHQtdmFsdWVzfX0KLQotQWxsIG9mIHRoZSBhYm92ZSBleGFtcGxlcyBpbnZvbHZlIHNldHRpbmcgc29tZSB2YXJpYWJsZSAodGhlCi1gYGRlc3RpbmF0aW9uJycpIHdoZW4gY2VydGFpbiBjb21tYW5kLWxpbmUgb3B0aW9ucyBhcmUgc2Vlbi4gIFdoYXQgaGFwcGVucwotaWYgdGhvc2Ugb3B0aW9ucyBhcmUgbmV2ZXIgc2Vlbj8gIFNpbmNlIHdlIGRpZG4ndCBzdXBwbHkgYW55IGRlZmF1bHRzLAotdGhleSBhcmUgYWxsIHNldCB0byBcY29kZXtOb25lfS4gIFRoaXMgaXMgdXN1YWxseSBmaW5lLCBidXQgc29tZXRpbWVzIHlvdQotd2FudCBtb3JlIGNvbnRyb2wuICBcbW9kdWxle29wdHBhcnNlfSBsZXRzIHlvdSBzdXBwbHkgYSBkZWZhdWx0IHZhbHVlIGZvciBlYWNoCi1kZXN0aW5hdGlvbiwgd2hpY2ggaXMgYXNzaWduZWQgYmVmb3JlIHRoZSBjb21tYW5kIGxpbmUgaXMgcGFyc2VkLgotCi1GaXJzdCwgY29uc2lkZXIgdGhlIHZlcmJvc2UvcXVpZXQgZXhhbXBsZS4gIElmIHdlIHdhbnQgXG1vZHVsZXtvcHRwYXJzZX0gdG8gc2V0Ci1cY29kZXt2ZXJib3NlfSB0byBcY29kZXtUcnVlfSB1bmxlc3MgXGNvZGV7Ii1xIn0gaXMgc2VlbiwgdGhlbiB3ZSBjYW4gZG8gdGhpczoKLVxiZWdpbnt2ZXJiYXRpbX0KLXBhcnNlci5hZGRfb3B0aW9uKCItdiIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9InZlcmJvc2UiLCBkZWZhdWx0PVRydWUpCi1wYXJzZXIuYWRkX29wdGlvbigiLXEiLCBhY3Rpb249InN0b3JlX2ZhbHNlIiwgZGVzdD0idmVyYm9zZSIpCi1cZW5ke3ZlcmJhdGltfQotCi1TaW5jZSBkZWZhdWx0IHZhbHVlcyBhcHBseSB0byB0aGUgXGVtcGh7ZGVzdGluYXRpb259IHJhdGhlciB0aGFuIHRvIGFueQotcGFydGljdWxhciBvcHRpb24sIGFuZCB0aGVzZSB0d28gb3B0aW9ucyBoYXBwZW4gdG8gaGF2ZSB0aGUgc2FtZQotZGVzdGluYXRpb24sIHRoaXMgaXMgZXhhY3RseSBlcXVpdmFsZW50OgotXGJlZ2lue3ZlcmJhdGltfQotcGFyc2VyLmFkZF9vcHRpb24oIi12IiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0idmVyYm9zZSIpCi1wYXJzZXIuYWRkX29wdGlvbigiLXEiLCBhY3Rpb249InN0b3JlX2ZhbHNlIiwgZGVzdD0idmVyYm9zZSIsIGRlZmF1bHQ9VHJ1ZSkKLVxlbmR7dmVyYmF0aW19Ci0KLUNvbnNpZGVyIHRoaXM6Ci1cYmVnaW57dmVyYmF0aW19Ci1wYXJzZXIuYWRkX29wdGlvbigiLXYiLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJ2ZXJib3NlIiwgZGVmYXVsdD1GYWxzZSkKLXBhcnNlci5hZGRfb3B0aW9uKCItcSIsIGFjdGlvbj0ic3RvcmVfZmFsc2UiLCBkZXN0PSJ2ZXJib3NlIiwgZGVmYXVsdD1UcnVlKQotXGVuZHt2ZXJiYXRpbX0KLQotQWdhaW4sIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBcY29kZXt2ZXJib3NlfSB3aWxsIGJlIFxjb2Rle1RydWV9OiB0aGUgbGFzdAotZGVmYXVsdCB2YWx1ZSBzdXBwbGllZCBmb3IgYW55IHBhcnRpY3VsYXIgZGVzdGluYXRpb24gaXMgdGhlIG9uZSB0aGF0Ci1jb3VudHMuCi0KLUEgY2xlYXJlciB3YXkgdG8gc3BlY2lmeSBkZWZhdWx0IHZhbHVlcyBpcyB0aGUgXG1ldGhvZHtzZXR7XF99ZGVmYXVsdHMoKX0KLW1ldGhvZCBvZiBPcHRpb25QYXJzZXIsIHdoaWNoIHlvdSBjYW4gY2FsbCBhdCBhbnkgdGltZSBiZWZvcmUgY2FsbGluZwotXG1ldGhvZHtwYXJzZXtcX31hcmdzKCl9OgotXGJlZ2lue3ZlcmJhdGltfQotcGFyc2VyLnNldF9kZWZhdWx0cyh2ZXJib3NlPVRydWUpCi1wYXJzZXIuYWRkX29wdGlvbiguLi4pCi0ob3B0aW9ucywgYXJncykgPSBwYXJzZXIucGFyc2VfYXJncygpCi1cZW5ke3ZlcmJhdGltfQotCi1BcyBiZWZvcmUsIHRoZSBsYXN0IHZhbHVlIHNwZWNpZmllZCBmb3IgYSBnaXZlbiBvcHRpb24gZGVzdGluYXRpb24gaXMKLXRoZSBvbmUgdGhhdCBjb3VudHMuICBGb3IgY2xhcml0eSwgdHJ5IHRvIHVzZSBvbmUgbWV0aG9kIG9yIHRoZSBvdGhlciBvZgotc2V0dGluZyBkZWZhdWx0IHZhbHVlcywgbm90IGJvdGguCi0KLQotXHN1YnN1YnNlY3Rpb257R2VuZXJhdGluZyBoZWxwXGxhYmVse29wdHBhcnNlLWdlbmVyYXRpbmctaGVscH19Ci0KLVxtb2R1bGV7b3B0cGFyc2V9J3MgYWJpbGl0eSB0byBnZW5lcmF0ZSBoZWxwIGFuZCB1c2FnZSB0ZXh0IGF1dG9tYXRpY2FsbHkgaXMgdXNlZnVsCi1mb3IgY3JlYXRpbmcgdXNlci1mcmllbmRseSBjb21tYW5kLWxpbmUgaW50ZXJmYWNlcy4gIEFsbCB5b3UgaGF2ZSB0byBkbwotaXMgc3VwcGx5IGEgXG1lbWJlcntoZWxwfSB2YWx1ZSBmb3IgZWFjaCBvcHRpb24sIGFuZCBvcHRpb25hbGx5IGEgc2hvcnQgdXNhZ2UKLW1lc3NhZ2UgZm9yIHlvdXIgd2hvbGUgcHJvZ3JhbS4gIEhlcmUncyBhbiBPcHRpb25QYXJzZXIgcG9wdWxhdGVkIHdpdGgKLXVzZXItZnJpZW5kbHkgKGRvY3VtZW50ZWQpIG9wdGlvbnM6Ci1cYmVnaW57dmVyYmF0aW19Ci11c2FnZSA9ICJ1c2FnZTogJXByb2cgW29wdGlvbnNdIGFyZzEgYXJnMiIKLXBhcnNlciA9IE9wdGlvblBhcnNlcih1c2FnZT11c2FnZSkKLXBhcnNlci5hZGRfb3B0aW9uKCItdiIsICItLXZlcmJvc2UiLAotICAgICAgICAgICAgICAgICAgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0idmVyYm9zZSIsIGRlZmF1bHQ9VHJ1ZSwKLSAgICAgICAgICAgICAgICAgIGhlbHA9Im1ha2UgbG90cyBvZiBub2lzZSBbZGVmYXVsdF0iKQotcGFyc2VyLmFkZF9vcHRpb24oIi1xIiwgIi0tcXVpZXQiLAotICAgICAgICAgICAgICAgICAgYWN0aW9uPSJzdG9yZV9mYWxzZSIsIGRlc3Q9InZlcmJvc2UiLCAKLSAgICAgICAgICAgICAgICAgIGhlbHA9ImJlIHZld3d5IHF1aWV0IChJJ20gaHVudGluZyB3YWJiaXRzKSIpCi1wYXJzZXIuYWRkX29wdGlvbigiLWYiLCAiLS1maWxlbmFtZSIsCi0gICAgICAgICAgICAgICAgICBtZXRhdmFyPSJGSUxFIiwgaGVscD0id3JpdGUgb3V0cHV0IHRvIEZJTEUiKSwKLXBhcnNlci5hZGRfb3B0aW9uKCItbSIsICItLW1vZGUiLAotICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iaW50ZXJtZWRpYXRlIiwKLSAgICAgICAgICAgICAgICAgIGhlbHA9ImludGVyYWN0aW9uIG1vZGU6IG5vdmljZSwgaW50ZXJtZWRpYXRlLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICJvciBleHBlcnQgW2RlZmF1bHQ6ICVkZWZhdWx0XSIpCi1cZW5ke3ZlcmJhdGltfQotCi1JZiBcbW9kdWxle29wdHBhcnNlfSBlbmNvdW50ZXJzIGVpdGhlciBcY29kZXsiLWgifSBvciBcY29kZXsiLXt9LWhlbHAifSBvbiB0aGUgY29tbWFuZC1saW5lLAotb3IgaWYgeW91IGp1c3QgY2FsbCBcbWV0aG9ke3BhcnNlci5wcmludHtcX31oZWxwKCl9LCBpdCBwcmludHMgdGhlIGZvbGxvd2luZyB0bwotc3RhbmRhcmQgb3V0cHV0OgotXGJlZ2lue3ZlcmJhdGltfQotdXNhZ2U6IDx5b3Vyc2NyaXB0PiBbb3B0aW9uc10gYXJnMSBhcmcyCi0KLW9wdGlvbnM6Ci0gIC1oLCAtLWhlbHAgICAgICAgICAgICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0Ci0gIC12LCAtLXZlcmJvc2UgICAgICAgICBtYWtlIGxvdHMgb2Ygbm9pc2UgW2RlZmF1bHRdCi0gIC1xLCAtLXF1aWV0ICAgICAgICAgICBiZSB2ZXd3eSBxdWlldCAoSSdtIGh1bnRpbmcgd2FiYml0cykKLSAgLWYgRklMRSwgLS1maWxlbmFtZT1GSUxFCi0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZSBvdXRwdXQgdG8gRklMRQotICAtbSBNT0RFLCAtLW1vZGU9TU9ERSAgaW50ZXJhY3Rpb24gbW9kZTogbm92aWNlLCBpbnRlcm1lZGlhdGUsIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICBleHBlcnQgW2RlZmF1bHQ6IGludGVybWVkaWF0ZV0KLVxlbmR7dmVyYmF0aW19Ci0KLShJZiB0aGUgaGVscCBvdXRwdXQgaXMgdHJpZ2dlcmVkIGJ5IGEgaGVscCBvcHRpb24sIFxtb2R1bGV7b3B0cGFyc2V9IGV4aXRzIGFmdGVyCi1wcmludGluZyB0aGUgaGVscCB0ZXh0LikKLQotVGhlcmUncyBhIGxvdCBnb2luZyBvbiBoZXJlIHRvIGhlbHAgXG1vZHVsZXtvcHRwYXJzZX0gZ2VuZXJhdGUgdGhlIGJlc3QgcG9zc2libGUKLWhlbHAgbWVzc2FnZToKLVxiZWdpbntpdGVtaXplfQotXGl0ZW0ge30gCi10aGUgc2NyaXB0IGRlZmluZXMgaXRzIG93biB1c2FnZSBtZXNzYWdlOgotXGJlZ2lue3ZlcmJhdGltfQotdXNhZ2UgPSAidXNhZ2U6ICVwcm9nIFtvcHRpb25zXSBhcmcxIGFyZzIiCi1cZW5ke3ZlcmJhdGltfQotCi1cbW9kdWxle29wdHBhcnNlfSBleHBhbmRzIFxjb2RleyJ7XCV9cHJvZyJ9IGluIHRoZSB1c2FnZSBzdHJpbmcgdG8gdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQKLXByb2dyYW0sIGkuZS4gXGNvZGV7b3MucGF0aC5iYXNlbmFtZShzeXMuYXJndntbfTBdKX0uICBUaGUgZXhwYW5kZWQgc3RyaW5nCi1pcyB0aGVuIHByaW50ZWQgYmVmb3JlIHRoZSBkZXRhaWxlZCBvcHRpb24gaGVscC4KLQotSWYgeW91IGRvbid0IHN1cHBseSBhIHVzYWdlIHN0cmluZywgXG1vZHVsZXtvcHRwYXJzZX0gdXNlcyBhIGJsYW5kIGJ1dCBzZW5zaWJsZQotZGVmYXVsdDogXGNvZGV7InVzYWdlOiB7XCV9cHJvZyB7W31vcHRpb25zXSJ9LCB3aGljaCBpcyBmaW5lIGlmIHlvdXIgc2NyaXB0Ci1kb2Vzbid0IHRha2UgYW55IHBvc2l0aW9uYWwgYXJndW1lbnRzLgotCi1caXRlbSB7fSAKLWV2ZXJ5IG9wdGlvbiBkZWZpbmVzIGEgaGVscCBzdHJpbmcsIGFuZCBkb2Vzbid0IHdvcnJ5IGFib3V0IGxpbmUtCi13cmFwcGluZ3stLS19XG1vZHVsZXtvcHRwYXJzZX0gdGFrZXMgY2FyZSBvZiB3cmFwcGluZyBsaW5lcyBhbmQgbWFraW5nIHRoZQotaGVscCBvdXRwdXQgbG9vayBnb29kLgotCi1caXRlbSB7fSAKLW9wdGlvbnMgdGhhdCB0YWtlIGEgdmFsdWUgaW5kaWNhdGUgdGhpcyBmYWN0IGluIHRoZWlyCi1hdXRvbWF0aWNhbGx5LWdlbmVyYXRlZCBoZWxwIG1lc3NhZ2UsIGUuZy4gZm9yIHRoZSBgYG1vZGUnJyBvcHRpb246Ci1cYmVnaW57dmVyYmF0aW19Ci0tbSBNT0RFLCAtLW1vZGU9TU9ERQotXGVuZHt2ZXJiYXRpbX0KLQotSGVyZSwgYGBNT0RFJycgaXMgY2FsbGVkIHRoZSBtZXRhLXZhcmlhYmxlOiBpdCBzdGFuZHMgZm9yIHRoZSBhcmd1bWVudAotdGhhdCB0aGUgdXNlciBpcyBleHBlY3RlZCB0byBzdXBwbHkgdG8gXHByb2dyYW1vcHR7LW19L1xsb25ncHJvZ3JhbW9wdHttb2RlfS4gIEJ5IGRlZmF1bHQsCi1cbW9kdWxle29wdHBhcnNlfSBjb252ZXJ0cyB0aGUgZGVzdGluYXRpb24gdmFyaWFibGUgbmFtZSB0byB1cHBlcmNhc2UgYW5kIHVzZXMKLXRoYXQgZm9yIHRoZSBtZXRhLXZhcmlhYmxlLiAgU29tZXRpbWVzLCB0aGF0J3Mgbm90IHdoYXQgeW91IHdhbnR7LS0tfWZvciBleGFtcGxlLCB0aGUgXGxvbmdwcm9ncmFtb3B0e2ZpbGVuYW1lfSBvcHRpb24gZXhwbGljaXRseSBzZXRzCi1cY29kZXttZXRhdmFyPSJGSUxFIn0sIHJlc3VsdGluZyBpbiB0aGlzIGF1dG9tYXRpY2FsbHktZ2VuZXJhdGVkIG9wdGlvbgotZGVzY3JpcHRpb246Ci1cYmVnaW57dmVyYmF0aW19Ci0tZiBGSUxFLCAtLWZpbGVuYW1lPUZJTEUKLVxlbmR7dmVyYmF0aW19Ci0KLVRoaXMgaXMgaW1wb3J0YW50IGZvciBtb3JlIHRoYW4ganVzdCBzYXZpbmcgc3BhY2UsIHRob3VnaDogdGhlCi1tYW51YWxseSB3cml0dGVuIGhlbHAgdGV4dCB1c2VzIHRoZSBtZXRhLXZhcmlhYmxlIGBgRklMRScnIHRvIGNsdWUgdGhlCi11c2VyIGluIHRoYXQgdGhlcmUncyBhIGNvbm5lY3Rpb24gYmV0d2VlbiB0aGUgc2VtaS1mb3JtYWwgc3ludGF4IGBgLWYKLUZJTEUnJyBhbmQgdGhlIGluZm9ybWFsIHNlbWFudGljIGRlc2NyaXB0aW9uIGBgd3JpdGUgb3V0cHV0IHRvIEZJTEUnJy4KLVRoaXMgaXMgYSBzaW1wbGUgYnV0IGVmZmVjdGl2ZSB3YXkgdG8gbWFrZSB5b3VyIGhlbHAgdGV4dCBhIGxvdAotY2xlYXJlciBhbmQgbW9yZSB1c2VmdWwgZm9yIGVuZCB1c2Vycy4KLQotXGl0ZW0ge30gCi1vcHRpb25zIHRoYXQgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgY2FuIGluY2x1ZGUgXGNvZGV7e1wlfWRlZmF1bHR9IGluCi10aGUgaGVscCBzdHJpbmd7LS0tfVxtb2R1bGV7b3B0cGFyc2V9IHdpbGwgcmVwbGFjZSBpdCB3aXRoIFxmdW5jdGlvbntzdHIoKX0gb2YgdGhlCi1vcHRpb24ncyBkZWZhdWx0IHZhbHVlLiAgSWYgYW4gb3B0aW9uIGhhcyBubyBkZWZhdWx0IHZhbHVlIChvciB0aGUKLWRlZmF1bHQgdmFsdWUgaXMgXGNvZGV7Tm9uZX0pLCBcY29kZXt7XCV9ZGVmYXVsdH0gZXhwYW5kcyB0byBcY29kZXtub25lfS4KLQotXGVuZHtpdGVtaXplfQotCi0KLVxzdWJzdWJzZWN0aW9ue1ByaW50aW5nIGEgdmVyc2lvbiBzdHJpbmdcbGFiZWx7b3B0cGFyc2UtcHJpbnRpbmctdmVyc2lvbi1zdHJpbmd9fQotCi1TaW1pbGFyIHRvIHRoZSBicmllZiB1c2FnZSBzdHJpbmcsIFxtb2R1bGV7b3B0cGFyc2V9IGNhbiBhbHNvIHByaW50IGEgdmVyc2lvbiBzdHJpbmcKLWZvciB5b3VyIHByb2dyYW0uICBZb3UgaGF2ZSB0byBzdXBwbHkgdGhlIHN0cmluZyBhcyB0aGUgXGNvZGV7dmVyc2lvbn0KLWFyZ3VtZW50IHRvIE9wdGlvblBhcnNlcjoKLVxiZWdpbnt2ZXJiYXRpbX0KLXBhcnNlciA9IE9wdGlvblBhcnNlcih1c2FnZT0iJXByb2cgWy1mXSBbLXFdIiwgdmVyc2lvbj0iJXByb2cgMS4wIikKLVxlbmR7dmVyYmF0aW19Ci0KLVxjb2RleyJ7XCV9cHJvZyJ9IGlzIGV4cGFuZGVkIGp1c3QgbGlrZSBpdCBpcyBpbiBcY29kZXt1c2FnZX0uICBBcGFydAotZnJvbSB0aGF0LCBcY29kZXt2ZXJzaW9ufSBjYW4gY29udGFpbiBhbnl0aGluZyB5b3UgbGlrZS4gIFdoZW4geW91IHN1cHBseQotaXQsIFxtb2R1bGV7b3B0cGFyc2V9IGF1dG9tYXRpY2FsbHkgYWRkcyBhIFxjb2RleyIte30tdmVyc2lvbiJ9IG9wdGlvbiB0byB5b3VyIHBhcnNlci4KLUlmIGl0IGVuY291bnRlcnMgdGhpcyBvcHRpb24gb24gdGhlIGNvbW1hbmQgbGluZSwgaXQgZXhwYW5kcyB5b3VyCi1cY29kZXt2ZXJzaW9ufSBzdHJpbmcgKGJ5IHJlcGxhY2luZyBcY29kZXsie1wlfXByb2cifSksIHByaW50cyBpdCB0byBzdGRvdXQsIGFuZAotZXhpdHMuCi0KLUZvciBleGFtcGxlLCBpZiB5b3VyIHNjcmlwdCBpcyBjYWxsZWQgXGNvZGV7L3Vzci9iaW4vZm9vfToKLVxiZWdpbnt2ZXJiYXRpbX0KLSQgL3Vzci9iaW4vZm9vIC0tdmVyc2lvbgotZm9vIDEuMAotXGVuZHt2ZXJiYXRpbX0KLQotCi1cc3Vic3Vic2VjdGlvbntIb3cgXG1vZHVsZXtvcHRwYXJzZX0gaGFuZGxlcyBlcnJvcnNcbGFiZWx7b3B0cGFyc2UtaG93LW9wdHBhcnNlLWhhbmRsZXMtZXJyb3JzfX0KLQotVGhlcmUgYXJlIHR3byBicm9hZCBjbGFzc2VzIG9mIGVycm9ycyB0aGF0IFxtb2R1bGV7b3B0cGFyc2V9IGhhcyB0byB3b3JyeSBhYm91dDoKLXByb2dyYW1tZXIgZXJyb3JzIGFuZCB1c2VyIGVycm9ycy4gIFByb2dyYW1tZXIgZXJyb3JzIGFyZSB1c3VhbGx5Ci1lcnJvbmVvdXMgY2FsbHMgdG8gXGNvZGV7cGFyc2VyLmFkZHtcX31vcHRpb24oKX0sIGUuZy4gaW52YWxpZCBvcHRpb24gc3RyaW5ncywKLXVua25vd24gb3B0aW9uIGF0dHJpYnV0ZXMsIG1pc3Npbmcgb3B0aW9uIGF0dHJpYnV0ZXMsIGV0Yy4gIFRoZXNlIGFyZQotZGVhbHQgd2l0aCBpbiB0aGUgdXN1YWwgd2F5OiByYWlzZSBhbiBleGNlcHRpb24gKGVpdGhlcgotXGNvZGV7b3B0cGFyc2UuT3B0aW9uRXJyb3J9IG9yIFxjb2Rle1R5cGVFcnJvcn0pIGFuZCBsZXQgdGhlIHByb2dyYW0gY3Jhc2guCi0KLUhhbmRsaW5nIHVzZXIgZXJyb3JzIGlzIG11Y2ggbW9yZSBpbXBvcnRhbnQsIHNpbmNlIHRoZXkgYXJlIGd1YXJhbnRlZWQKLXRvIGhhcHBlbiBubyBtYXR0ZXIgaG93IHN0YWJsZSB5b3VyIGNvZGUgaXMuICBcbW9kdWxle29wdHBhcnNlfSBjYW4gYXV0b21hdGljYWxseQotZGV0ZWN0IHNvbWUgdXNlciBlcnJvcnMsIHN1Y2ggYXMgYmFkIG9wdGlvbiBhcmd1bWVudHMgKHBhc3NpbmcgXGNvZGV7Ii1uCi00eCJ9IHdoZXJlIFxwcm9ncmFtb3B0ey1ufSB0YWtlcyBhbiBpbnRlZ2VyIGFyZ3VtZW50KSwgbWlzc2luZyBhcmd1bWVudHMKLShcY29kZXsiLW4ifSBhdCB0aGUgZW5kIG9mIHRoZSBjb21tYW5kIGxpbmUsIHdoZXJlIFxwcm9ncmFtb3B0ey1ufSB0YWtlcyBhbiBhcmd1bWVudAotb2YgYW55IHR5cGUpLiAgQWxzbywgeW91IGNhbiBjYWxsIFxjb2Rle3BhcnNlci5lcnJvcigpfSB0byBzaWduYWwgYW4KLWFwcGxpY2F0aW9uLWRlZmluZWQgZXJyb3IgY29uZGl0aW9uOgotXGJlZ2lue3ZlcmJhdGltfQotKG9wdGlvbnMsIGFyZ3MpID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQotWy4uLl0KLWlmIG9wdGlvbnMuYSBhbmQgb3B0aW9ucy5iOgotICAgIHBhcnNlci5lcnJvcigib3B0aW9ucyAtYSBhbmQgLWIgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSIpCi1cZW5ke3ZlcmJhdGltfQotCi1JbiBlaXRoZXIgY2FzZSwgXG1vZHVsZXtvcHRwYXJzZX0gaGFuZGxlcyB0aGUgZXJyb3IgdGhlIHNhbWUgd2F5OiBpdCBwcmludHMgdGhlCi1wcm9ncmFtJ3MgdXNhZ2UgbWVzc2FnZSBhbmQgYW4gZXJyb3IgbWVzc2FnZSB0byBzdGFuZGFyZCBlcnJvciBhbmQKLWV4aXRzIHdpdGggZXJyb3Igc3RhdHVzIDIuCi0KLUNvbnNpZGVyIHRoZSBmaXJzdCBleGFtcGxlIGFib3ZlLCB3aGVyZSB0aGUgdXNlciBwYXNzZXMgXGNvZGV7IjR4In0gdG8gYW4KLW9wdGlvbiB0aGF0IHRha2VzIGFuIGludGVnZXI6Ci1cYmVnaW57dmVyYmF0aW19Ci0kIC91c3IvYmluL2ZvbyAtbiA0eAotdXNhZ2U6IGZvbyBbb3B0aW9uc10KLQotZm9vOiBlcnJvcjogb3B0aW9uIC1uOiBpbnZhbGlkIGludGVnZXIgdmFsdWU6ICc0eCcKLVxlbmR7dmVyYmF0aW19Ci0KLU9yLCB3aGVyZSB0aGUgdXNlciBmYWlscyB0byBwYXNzIGEgdmFsdWUgYXQgYWxsOgotXGJlZ2lue3ZlcmJhdGltfQotJCAvdXNyL2Jpbi9mb28gLW4KLXVzYWdlOiBmb28gW29wdGlvbnNdCi0KLWZvbzogZXJyb3I6IC1uIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudAotXGVuZHt2ZXJiYXRpbX0KLQotXG1vZHVsZXtvcHRwYXJzZX0tZ2VuZXJhdGVkIGVycm9yIG1lc3NhZ2VzIHRha2UgY2FyZSBhbHdheXMgdG8gbWVudGlvbiB0aGUgb3B0aW9uCi1pbnZvbHZlZCBpbiB0aGUgZXJyb3I7IGJlIHN1cmUgdG8gZG8gdGhlIHNhbWUgd2hlbiBjYWxsaW5nCi1cY29kZXtwYXJzZXIuZXJyb3IoKX0gZnJvbSB5b3VyIGFwcGxpY2F0aW9uIGNvZGUuCi0KLUlmIFxtb2R1bGV7b3B0cGFyc2V9J3MgZGVmYXVsdCBlcnJvci1oYW5kbGluZyBiZWhhdmlvdXIgZG9lcyBub3Qgc3VpdGUgeW91ciBuZWVkcywKLXlvdSdsbCBuZWVkIHRvIHN1YmNsYXNzIE9wdGlvblBhcnNlciBhbmQgb3ZlcnJpZGUgXGNvZGV7ZXhpdCgpfSBhbmQvb3IKLVxtZXRob2R7ZXJyb3IoKX0uCi0KLQotXHN1YnN1YnNlY3Rpb257UHV0dGluZyBpdCBhbGwgdG9nZXRoZXJcbGFiZWx7b3B0cGFyc2UtcHV0dGluZy1pdC1hbGwtdG9nZXRoZXJ9fQotCi1IZXJlJ3Mgd2hhdCBcbW9kdWxle29wdHBhcnNlfS1iYXNlZCBzY3JpcHRzIHVzdWFsbHkgbG9vayBsaWtlOgotXGJlZ2lue3ZlcmJhdGltfQotZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uUGFyc2VyCi1bLi4uXQotZGVmIG1haW4oKToKLSAgICB1c2FnZSA9ICJ1c2FnZTogJXByb2cgW29wdGlvbnNdIGFyZyIKLSAgICBwYXJzZXIgPSBPcHRpb25QYXJzZXIodXNhZ2UpCi0gICAgcGFyc2VyLmFkZF9vcHRpb24oIi1mIiwgIi0tZmlsZSIsIGRlc3Q9ImZpbGVuYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJyZWFkIGRhdGEgZnJvbSBGSUxFTkFNRSIpCi0gICAgcGFyc2VyLmFkZF9vcHRpb24oIi12IiwgIi0tdmVyYm9zZSIsCi0gICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0idmVyYm9zZSIpCi0gICAgcGFyc2VyLmFkZF9vcHRpb24oIi1xIiwgIi0tcXVpZXQiLAotICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0ic3RvcmVfZmFsc2UiLCBkZXN0PSJ2ZXJib3NlIikKLSAgICBbLi4uXQotICAgIChvcHRpb25zLCBhcmdzKSA9IHBhcnNlci5wYXJzZV9hcmdzKCkKLSAgICBpZiBsZW4oYXJncykgIT0gMToKLSAgICAgICAgcGFyc2VyLmVycm9yKCJpbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cyIpCi0gICAgaWYgb3B0aW9ucy52ZXJib3NlOgotICAgICAgICBwcmludCAicmVhZGluZyAlcy4uLiIgJSBvcHRpb25zLmZpbGVuYW1lCi0gICAgWy4uLl0KLQotaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgICBtYWluKCkKLVxlbmR7dmVyYmF0aW19Ci0lICRJZDogdHV0b3JpYWwudHh0IDUxNSAyMDA2LTA2LTEwIDE1OjM3OjQ1WiBnd2FyZCAkIAotCi0KLVxzdWJzZWN0aW9ue1JlZmVyZW5jZSBHdWlkZVxsYWJlbHtvcHRwYXJzZS1yZWZlcmVuY2UtZ3VpZGV9fQotCi0KLVxzdWJzdWJzZWN0aW9ue0NyZWF0aW5nIHRoZSBwYXJzZXJcbGFiZWx7b3B0cGFyc2UtY3JlYXRpbmctcGFyc2VyfX0KLQotVGhlIGZpcnN0IHN0ZXAgaW4gdXNpbmcgXG1vZHVsZXtvcHRwYXJzZX0gaXMgdG8gY3JlYXRlIGFuIE9wdGlvblBhcnNlciBpbnN0YW5jZToKLVxiZWdpbnt2ZXJiYXRpbX0KLXBhcnNlciA9IE9wdGlvblBhcnNlciguLi4pCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgT3B0aW9uUGFyc2VyIGNvbnN0cnVjdG9yIGhhcyBubyByZXF1aXJlZCBhcmd1bWVudHMsIGJ1dCBhIG51bWJlciBvZgotb3B0aW9uYWwga2V5d29yZCBhcmd1bWVudHMuICBZb3Ugc2hvdWxkIGFsd2F5cyBwYXNzIHRoZW0gYXMga2V5d29yZAotYXJndW1lbnRzLCBpLmUuIGRvIG5vdCByZWx5IG9uIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgYXJndW1lbnRzIGFyZQotZGVjbGFyZWQuCi1cYmVnaW57cXVvdGV9Ci1cYmVnaW57ZGVzY3JpcHRpb259Ci1caXRlbVtcY29kZXt1c2FnZX0gKGRlZmF1bHQ6IFxjb2RleyJ7XCV9cHJvZyB7W31vcHRpb25zXSJ9KV0KLVRoZSB1c2FnZSBzdW1tYXJ5IHRvIHByaW50IHdoZW4geW91ciBwcm9ncmFtIGlzIHJ1biBpbmNvcnJlY3RseSBvcgotd2l0aCBhIGhlbHAgb3B0aW9uLiAgV2hlbiBcbW9kdWxle29wdHBhcnNlfSBwcmludHMgdGhlIHVzYWdlIHN0cmluZywgaXQgZXhwYW5kcwotXGNvZGV7e1wlfXByb2d9IHRvIFxjb2Rle29zLnBhdGguYmFzZW5hbWUoc3lzLmFyZ3Z7W30wXSl9IChvciB0byBcY29kZXtwcm9nfSBpZgoteW91IHBhc3NlZCB0aGF0IGtleXdvcmQgYXJndW1lbnQpLiAgVG8gc3VwcHJlc3MgYSB1c2FnZSBtZXNzYWdlLAotcGFzcyB0aGUgc3BlY2lhbCB2YWx1ZSBcY29kZXtvcHRwYXJzZS5TVVBQUkVTU3tcX31VU0FHRX0uCi1caXRlbVtcY29kZXtvcHRpb257XF99bGlzdH0gKGRlZmF1bHQ6IFxjb2Rle3tbfV19KV0KLUEgbGlzdCBvZiBPcHRpb24gb2JqZWN0cyB0byBwb3B1bGF0ZSB0aGUgcGFyc2VyIHdpdGguICBUaGUgb3B0aW9ucwotaW4gXGNvZGV7b3B0aW9ue1xffWxpc3R9IGFyZSBhZGRlZCBhZnRlciBhbnkgb3B0aW9ucyBpbgotXGNvZGV7c3RhbmRhcmR7XF99b3B0aW9ue1xffWxpc3R9IChhIGNsYXNzIGF0dHJpYnV0ZSB0aGF0IG1heSBiZSBzZXQgYnkKLU9wdGlvblBhcnNlciBzdWJjbGFzc2VzKSwgYnV0IGJlZm9yZSBhbnkgdmVyc2lvbiBvciBoZWxwIG9wdGlvbnMuCi1EZXByZWNhdGVkOyB1c2UgXG1ldGhvZHthZGR7XF99b3B0aW9uKCl9IGFmdGVyIGNyZWF0aW5nIHRoZSBwYXJzZXIgaW5zdGVhZC4KLVxpdGVtW1xjb2Rle29wdGlvbntcX31jbGFzc30gKGRlZmF1bHQ6IG9wdHBhcnNlLk9wdGlvbildCi1DbGFzcyB0byB1c2Ugd2hlbiBhZGRpbmcgb3B0aW9ucyB0byB0aGUgcGFyc2VyIGluIFxtZXRob2R7YWRke1xffW9wdGlvbigpfS4KLVxpdGVtW1xjb2Rle3ZlcnNpb259IChkZWZhdWx0OiBcY29kZXtOb25lfSldCi1BIHZlcnNpb24gc3RyaW5nIHRvIHByaW50IHdoZW4gdGhlIHVzZXIgc3VwcGxpZXMgYSB2ZXJzaW9uIG9wdGlvbi4KLUlmIHlvdSBzdXBwbHkgYSB0cnVlIHZhbHVlIGZvciBcY29kZXt2ZXJzaW9ufSwgXG1vZHVsZXtvcHRwYXJzZX0gYXV0b21hdGljYWxseSBhZGRzCi1hIHZlcnNpb24gb3B0aW9uIHdpdGggdGhlIHNpbmdsZSBvcHRpb24gc3RyaW5nIFxjb2RleyIte30tdmVyc2lvbiJ9LiAgVGhlCi1zdWJzdHJpbmcgXGNvZGV7IntcJX1wcm9nIn0gaXMgZXhwYW5kZWQgdGhlIHNhbWUgYXMgZm9yIFxjb2Rle3VzYWdlfS4KLVxpdGVtW1xjb2Rle2NvbmZsaWN0e1xffWhhbmRsZXJ9IChkZWZhdWx0OiBcY29kZXsiZXJyb3IifSldCi1TcGVjaWZpZXMgd2hhdCB0byBkbyB3aGVuIG9wdGlvbnMgd2l0aCBjb25mbGljdGluZyBvcHRpb24gc3RyaW5ncwotYXJlIGFkZGVkIHRvIHRoZSBwYXJzZXI7IHNlZSBzZWN0aW9uflxyZWZ7b3B0cGFyc2UtY29uZmxpY3RzLWJldHdlZW4tb3B0aW9uc30sIENvbmZsaWN0cyBiZXR3ZWVuIG9wdGlvbnMuCi1caXRlbVtcY29kZXtkZXNjcmlwdGlvbn0gKGRlZmF1bHQ6IFxjb2Rle05vbmV9KV0KLUEgcGFyYWdyYXBoIG9mIHRleHQgZ2l2aW5nIGEgYnJpZWYgb3ZlcnZpZXcgb2YgeW91ciBwcm9ncmFtLiAgXG1vZHVsZXtvcHRwYXJzZX0KLXJlZm9ybWF0cyB0aGlzIHBhcmFncmFwaCB0byBmaXQgdGhlIGN1cnJlbnQgdGVybWluYWwgd2lkdGggYW5kCi1wcmludHMgaXQgd2hlbiB0aGUgdXNlciByZXF1ZXN0cyBoZWxwIChhZnRlciBcY29kZXt1c2FnZX0sIGJ1dCBiZWZvcmUKLXRoZSBsaXN0IG9mIG9wdGlvbnMpLgotXGl0ZW1bXGNvZGV7Zm9ybWF0dGVyfSAoZGVmYXVsdDogYSBuZXcgSW5kZW50ZWRIZWxwRm9ybWF0dGVyKV0KLUFuIGluc3RhbmNlIG9mIG9wdHBhcnNlLkhlbHBGb3JtYXR0ZXIgdGhhdCB3aWxsIGJlIHVzZWQgZm9yCi1wcmludGluZyBoZWxwIHRleHQuICBcbW9kdWxle29wdHBhcnNlfSBwcm92aWRlcyB0d28gY29uY3JldGUgY2xhc3NlcyBmb3IgdGhpcwotcHVycG9zZTogSW5kZW50ZWRIZWxwRm9ybWF0dGVyIGFuZCBUaXRsZWRIZWxwRm9ybWF0dGVyLgotXGl0ZW1bXGNvZGV7YWRke1xffWhlbHB7XF99b3B0aW9ufSAoZGVmYXVsdDogXGNvZGV7VHJ1ZX0pXQotSWYgdHJ1ZSwgXG1vZHVsZXtvcHRwYXJzZX0gd2lsbCBhZGQgYSBoZWxwIG9wdGlvbiAod2l0aCBvcHRpb24gc3RyaW5ncyBcY29kZXsiLWgifQotYW5kIFxjb2RleyIte30taGVscCJ9KSB0byB0aGUgcGFyc2VyLgotXGl0ZW1bXGNvZGV7cHJvZ31dCi1UaGUgc3RyaW5nIHRvIHVzZSB3aGVuIGV4cGFuZGluZyBcY29kZXsie1wlfXByb2cifSBpbiBcY29kZXt1c2FnZX0gYW5kCi1cY29kZXt2ZXJzaW9ufSBpbnN0ZWFkIG9mIFxjb2Rle29zLnBhdGguYmFzZW5hbWUoc3lzLmFyZ3Z7W30wXSl9LgotXGVuZHtkZXNjcmlwdGlvbn0KLVxlbmR7cXVvdGV9Ci0KLQotXHN1YnN1YnNlY3Rpb257UG9wdWxhdGluZyB0aGUgcGFyc2VyXGxhYmVse29wdHBhcnNlLXBvcHVsYXRpbmctcGFyc2VyfX0KLQotVGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byBwb3B1bGF0ZSB0aGUgcGFyc2VyIHdpdGggb3B0aW9ucy4gIFRoZQotcHJlZmVycmVkIHdheSBpcyBieSB1c2luZyBcY29kZXtPcHRpb25QYXJzZXIuYWRke1xffW9wdGlvbigpfSwgYXMgc2hvd24gaW4KLXNlY3Rpb25+XHJlZntvcHRwYXJzZS10dXRvcmlhbH0sIHRoZSB0dXRvcmlhbC4gIFxtZXRob2R7YWRke1xffW9wdGlvbigpfSBjYW4gYmUgY2FsbGVkIGluIG9uZSBvZiB0d28KLXdheXM6Ci1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtIHt9IAotcGFzcyBpdCBhbiBPcHRpb24gaW5zdGFuY2UgKGFzIHJldHVybmVkIGJ5IFxmdW5jdGlvbnttYWtle1xffW9wdGlvbigpfSkKLQotXGl0ZW0ge30gCi1wYXNzIGl0IGFueSBjb21iaW5hdGlvbiBvZiBwb3NpdGlvbmFsIGFuZCBrZXl3b3JkIGFyZ3VtZW50cyB0aGF0IGFyZQotYWNjZXB0YWJsZSB0byBcZnVuY3Rpb257bWFrZXtcX31vcHRpb24oKX0gKGkuZS4sIHRvIHRoZSBPcHRpb24gY29uc3RydWN0b3IpLAotYW5kIGl0IHdpbGwgY3JlYXRlIHRoZSBPcHRpb24gaW5zdGFuY2UgZm9yIHlvdQotCi1cZW5ke2l0ZW1pemV9Ci0KLVRoZSBvdGhlciBhbHRlcm5hdGl2ZSBpcyB0byBwYXNzIGEgbGlzdCBvZiBwcmUtY29uc3RydWN0ZWQgT3B0aW9uCi1pbnN0YW5jZXMgdG8gdGhlIE9wdGlvblBhcnNlciBjb25zdHJ1Y3RvciwgYXMgaW46Ci1cYmVnaW57dmVyYmF0aW19Ci1vcHRpb25fbGlzdCA9IFsKLSAgICBtYWtlX29wdGlvbigiLWYiLCAiLS1maWxlbmFtZSIsCi0gICAgICAgICAgICAgICAgYWN0aW9uPSJzdG9yZSIsIHR5cGU9InN0cmluZyIsIGRlc3Q9ImZpbGVuYW1lIiksCi0gICAgbWFrZV9vcHRpb24oIi1xIiwgIi0tcXVpZXQiLAotICAgICAgICAgICAgICAgIGFjdGlvbj0ic3RvcmVfZmFsc2UiLCBkZXN0PSJ2ZXJib3NlIiksCi0gICAgXQotcGFyc2VyID0gT3B0aW9uUGFyc2VyKG9wdGlvbl9saXN0PW9wdGlvbl9saXN0KQotXGVuZHt2ZXJiYXRpbX0KLQotKFxmdW5jdGlvbnttYWtle1xffW9wdGlvbigpfSBpcyBhIGZhY3RvcnkgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIE9wdGlvbiBpbnN0YW5jZXM7Ci1jdXJyZW50bHkgaXQgaXMgYW4gYWxpYXMgZm9yIHRoZSBPcHRpb24gY29uc3RydWN0b3IuICBBIGZ1dHVyZSB2ZXJzaW9uCi1vZiBcbW9kdWxle29wdHBhcnNlfSBtYXkgc3BsaXQgT3B0aW9uIGludG8gc2V2ZXJhbCBjbGFzc2VzLCBhbmQgXGZ1bmN0aW9ue21ha2V7XF99b3B0aW9uKCl9Ci13aWxsIHBpY2sgdGhlIHJpZ2h0IGNsYXNzIHRvIGluc3RhbnRpYXRlLiAgRG8gbm90IGluc3RhbnRpYXRlIE9wdGlvbgotZGlyZWN0bHkuKQotCi0KLVxzdWJzdWJzZWN0aW9ue0RlZmluaW5nIG9wdGlvbnNcbGFiZWx7b3B0cGFyc2UtZGVmaW5pbmctb3B0aW9uc319Ci0KLUVhY2ggT3B0aW9uIGluc3RhbmNlIHJlcHJlc2VudHMgYSBzZXQgb2Ygc3lub255bW91cyBjb21tYW5kLWxpbmUgb3B0aW9uCi1zdHJpbmdzLCBlLmcuIFxwcm9ncmFtb3B0ey1mfSBhbmQgXGxvbmdwcm9ncmFtb3B0e2ZpbGV9LiAgWW91IGNhbgotc3BlY2lmeSBhbnkgbnVtYmVyIG9mIHNob3J0IG9yIGxvbmcgb3B0aW9uIHN0cmluZ3MsIGJ1dCB5b3UgbXVzdCBzcGVjaWZ5Ci1hdCBsZWFzdCBvbmUgb3ZlcmFsbCBvcHRpb24gc3RyaW5nLgotCi1UaGUgY2Fub25pY2FsIHdheSB0byBjcmVhdGUgYW4gT3B0aW9uIGluc3RhbmNlIGlzIHdpdGggdGhlCi1cbWV0aG9ke2FkZHtcX31vcHRpb24oKX0gbWV0aG9kIG9mIFxjbGFzc3tPcHRpb25QYXJzZXJ9OgotXGJlZ2lue3ZlcmJhdGltfQotcGFyc2VyLmFkZF9vcHRpb24ob3B0X3N0clssIC4uLl0sIGF0dHI9dmFsdWUsIC4uLikKLVxlbmR7dmVyYmF0aW19Ci0KLVRvIGRlZmluZSBhbiBvcHRpb24gd2l0aCBvbmx5IGEgc2hvcnQgb3B0aW9uIHN0cmluZzoKLVxiZWdpbnt2ZXJiYXRpbX0KLXBhcnNlci5hZGRfb3B0aW9uKCItZiIsIGF0dHI9dmFsdWUsIC4uLikKLVxlbmR7dmVyYmF0aW19Ci0KLUFuZCB0byBkZWZpbmUgYW4gb3B0aW9uIHdpdGggb25seSBhIGxvbmcgb3B0aW9uIHN0cmluZzoKLVxiZWdpbnt2ZXJiYXRpbX0KLXBhcnNlci5hZGRfb3B0aW9uKCItLWZvbyIsIGF0dHI9dmFsdWUsIC4uLikKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBrZXl3b3JkIGFyZ3VtZW50cyBkZWZpbmUgYXR0cmlidXRlcyBvZiB0aGUgbmV3IE9wdGlvbiBvYmplY3QuICBUaGUKLW1vc3QgaW1wb3J0YW50IG9wdGlvbiBhdHRyaWJ1dGUgaXMgXG1lbWJlcnthY3Rpb259LCBhbmQgaXQgbGFyZ2VseSBkZXRlcm1pbmVzCi13aGljaCBvdGhlciBhdHRyaWJ1dGVzIGFyZSByZWxldmFudCBvciByZXF1aXJlZC4gIElmIHlvdSBwYXNzIGlycmVsZXZhbnQKLW9wdGlvbiBhdHRyaWJ1dGVzLCBvciBmYWlsIHRvIHBhc3MgcmVxdWlyZWQgb25lcywgXG1vZHVsZXtvcHRwYXJzZX0gcmFpc2VzIGFuCi1PcHRpb25FcnJvciBleGNlcHRpb24gZXhwbGFpbmluZyB5b3VyIG1pc3Rha2UuCi0KLUFuIG9wdGlvbnMncyBcZW1waHthY3Rpb259IGRldGVybWluZXMgd2hhdCBcbW9kdWxle29wdHBhcnNlfSBkb2VzIHdoZW4gaXQgZW5jb3VudGVycyB0aGlzCi1vcHRpb24gb24gdGhlIGNvbW1hbmQtbGluZS4gIFRoZSBzdGFuZGFyZCBvcHRpb24gYWN0aW9ucyBoYXJkLWNvZGVkIGludG8KLVxtb2R1bGV7b3B0cGFyc2V9IGFyZToKLVxiZWdpbntkZXNjcmlwdGlvbn0KLVxpdGVtW1xjb2Rle3N0b3JlfV0KLXN0b3JlIHRoaXMgb3B0aW9uJ3MgYXJndW1lbnQgKGRlZmF1bHQpCi1caXRlbVtcY29kZXtzdG9yZXtcX31jb25zdH1dCi1zdG9yZSBhIGNvbnN0YW50IHZhbHVlCi1caXRlbVtcY29kZXtzdG9yZXtcX310cnVlfV0KLXN0b3JlIGEgdHJ1ZSB2YWx1ZQotXGl0ZW1bXGNvZGV7c3RvcmV7XF99ZmFsc2V9XQotc3RvcmUgYSBmYWxzZSB2YWx1ZQotXGl0ZW1bXGNvZGV7YXBwZW5kfV0KLWFwcGVuZCB0aGlzIG9wdGlvbidzIGFyZ3VtZW50IHRvIGEgbGlzdAotXGl0ZW1bXGNvZGV7YXBwZW5ke1xffWNvbnN0fV0KLWFwcGVuZCBhIGNvbnN0YW50IHZhbHVlIHRvIGEgbGlzdAotXGl0ZW1bXGNvZGV7Y291bnR9XQotaW5jcmVtZW50IGEgY291bnRlciBieSBvbmUKLVxpdGVtW1xjb2Rle2NhbGxiYWNrfV0KLWNhbGwgYSBzcGVjaWZpZWQgZnVuY3Rpb24KLVxpdGVtW1xtZW1iZXJ7aGVscH1dCi1wcmludCBhIHVzYWdlIG1lc3NhZ2UgaW5jbHVkaW5nIGFsbCBvcHRpb25zIGFuZCB0aGUKLWRvY3VtZW50YXRpb24gZm9yIHRoZW0KLVxlbmR7ZGVzY3JpcHRpb259Ci0KLShJZiB5b3UgZG9uJ3Qgc3VwcGx5IGFuIGFjdGlvbiwgdGhlIGRlZmF1bHQgaXMgXGNvZGV7c3RvcmV9LiAgRm9yIHRoaXMKLWFjdGlvbiwgeW91IG1heSBhbHNvIHN1cHBseSBcbWVtYmVye3R5cGV9IGFuZCBcbWVtYmVye2Rlc3R9IG9wdGlvbiBhdHRyaWJ1dGVzOyBzZWUKLWJlbG93LikKLQotQXMgeW91IGNhbiBzZWUsIG1vc3QgYWN0aW9ucyBpbnZvbHZlIHN0b3Jpbmcgb3IgdXBkYXRpbmcgYSB2YWx1ZQotc29tZXdoZXJlLiAgXG1vZHVsZXtvcHRwYXJzZX0gYWx3YXlzIGNyZWF0ZXMgYSBzcGVjaWFsIG9iamVjdCBmb3IgdGhpcywKLWNvbnZlbnRpb25hbGx5IGNhbGxlZCBcY29kZXtvcHRpb25zfSAoaXQgaGFwcGVucyB0byBiZSBhbiBpbnN0YW5jZSBvZgotXGNvZGV7b3B0cGFyc2UuVmFsdWVzfSkuICBPcHRpb24gYXJndW1lbnRzIChhbmQgdmFyaW91cyBvdGhlciB2YWx1ZXMpIGFyZQotc3RvcmVkIGFzIGF0dHJpYnV0ZXMgb2YgdGhpcyBvYmplY3QsIGFjY29yZGluZyB0byB0aGUgXG1lbWJlcntkZXN0fQotKGRlc3RpbmF0aW9uKSBvcHRpb24gYXR0cmlidXRlLgotCi1Gb3IgZXhhbXBsZSwgd2hlbiB5b3UgY2FsbAotXGJlZ2lue3ZlcmJhdGltfQotcGFyc2VyLnBhcnNlX2FyZ3MoKQotXGVuZHt2ZXJiYXRpbX0KLQotb25lIG9mIHRoZSBmaXJzdCB0aGluZ3MgXG1vZHVsZXtvcHRwYXJzZX0gZG9lcyBpcyBjcmVhdGUgdGhlIFxjb2Rle29wdGlvbnN9IG9iamVjdDoKLVxiZWdpbnt2ZXJiYXRpbX0KLW9wdGlvbnMgPSBWYWx1ZXMoKQotXGVuZHt2ZXJiYXRpbX0KLQotSWYgb25lIG9mIHRoZSBvcHRpb25zIGluIHRoaXMgcGFyc2VyIGlzIGRlZmluZWQgd2l0aAotXGJlZ2lue3ZlcmJhdGltfQotcGFyc2VyLmFkZF9vcHRpb24oIi1mIiwgIi0tZmlsZSIsIGFjdGlvbj0ic3RvcmUiLCB0eXBlPSJzdHJpbmciLCBkZXN0PSJmaWxlbmFtZSIpCi1cZW5ke3ZlcmJhdGltfQotCi1hbmQgdGhlIGNvbW1hbmQtbGluZSBiZWluZyBwYXJzZWQgaW5jbHVkZXMgYW55IG9mIHRoZSBmb2xsb3dpbmc6Ci1cYmVnaW57dmVyYmF0aW19Ci0tZmZvbwotLWYgZm9vCi0tLWZpbGU9Zm9vCi0tLWZpbGUgZm9vCi1cZW5ke3ZlcmJhdGltfQotCi10aGVuIFxtb2R1bGV7b3B0cGFyc2V9LCBvbiBzZWVpbmcgdGhpcyBvcHRpb24sIHdpbGwgZG8gdGhlIGVxdWl2YWxlbnQgb2YKLVxiZWdpbnt2ZXJiYXRpbX0KLW9wdGlvbnMuZmlsZW5hbWUgPSAiZm9vIgotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIFxtZW1iZXJ7dHlwZX0gYW5kIFxtZW1iZXJ7ZGVzdH0gb3B0aW9uIGF0dHJpYnV0ZXMgYXJlIGFsbW9zdCBhcyBpbXBvcnRhbnQgYXMKLVxtZW1iZXJ7YWN0aW9ufSwgYnV0IFxtZW1iZXJ7YWN0aW9ufSBpcyB0aGUgb25seSBvbmUgdGhhdCBtYWtlcyBzZW5zZSBmb3IgXGVtcGh7YWxsfQotb3B0aW9ucy4KLQotCi1cc3Vic3Vic2VjdGlvbntTdGFuZGFyZCBvcHRpb24gYWN0aW9uc1xsYWJlbHtvcHRwYXJzZS1zdGFuZGFyZC1vcHRpb24tYWN0aW9uc319Ci0KLVRoZSB2YXJpb3VzIG9wdGlvbiBhY3Rpb25zIGFsbCBoYXZlIHNsaWdodGx5IGRpZmZlcmVudCByZXF1aXJlbWVudHMgYW5kCi1lZmZlY3RzLiAgTW9zdCBhY3Rpb25zIGhhdmUgc2V2ZXJhbCByZWxldmFudCBvcHRpb24gYXR0cmlidXRlcyB3aGljaCB5b3UKLW1heSBzcGVjaWZ5IHRvIGd1aWRlIFxtb2R1bGV7b3B0cGFyc2V9J3MgYmVoYXZpb3VyOyBhIGZldyBoYXZlIHJlcXVpcmVkIGF0dHJpYnV0ZXMsCi13aGljaCB5b3UgbXVzdCBzcGVjaWZ5IGZvciBhbnkgb3B0aW9uIHVzaW5nIHRoYXQgYWN0aW9uLgotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSB7fSAKLVxjb2Rle3N0b3JlfSB7W31yZWxldmFudDogXG1lbWJlcnt0eXBlfSwgXG1lbWJlcntkZXN0fSwgXGNvZGV7bmFyZ3N9LCBcY29kZXtjaG9pY2VzfV0KLQotVGhlIG9wdGlvbiBtdXN0IGJlIGZvbGxvd2VkIGJ5IGFuIGFyZ3VtZW50LCB3aGljaCBpcwotY29udmVydGVkIHRvIGEgdmFsdWUgYWNjb3JkaW5nIHRvIFxtZW1iZXJ7dHlwZX0gYW5kIHN0b3JlZCBpbgotXG1lbWJlcntkZXN0fS4gIElmIFxjb2Rle25hcmdzfSB7XHRleHRncmVhdGVyfSAxLCBtdWx0aXBsZSBhcmd1bWVudHMgd2lsbCBiZSBjb25zdW1lZAotZnJvbSB0aGUgY29tbWFuZCBsaW5lOyBhbGwgd2lsbCBiZSBjb252ZXJ0ZWQgYWNjb3JkaW5nIHRvCi1cbWVtYmVye3R5cGV9IGFuZCBzdG9yZWQgdG8gXG1lbWJlcntkZXN0fSBhcyBhIHR1cGxlLiAgU2VlIHRoZSBgYE9wdGlvbgotdHlwZXMnJyBzZWN0aW9uIGJlbG93LgotCi1JZiBcY29kZXtjaG9pY2VzfSBpcyBzdXBwbGllZCAoYSBsaXN0IG9yIHR1cGxlIG9mIHN0cmluZ3MpLCB0aGUgdHlwZQotZGVmYXVsdHMgdG8gXGNvZGV7Y2hvaWNlfS4KLQotSWYgXG1lbWJlcnt0eXBlfSBpcyBub3Qgc3VwcGxpZWQsIGl0IGRlZmF1bHRzIHRvIFxjb2Rle3N0cmluZ30uCi0KLUlmIFxtZW1iZXJ7ZGVzdH0gaXMgbm90IHN1cHBsaWVkLCBcbW9kdWxle29wdHBhcnNlfSBkZXJpdmVzIGEgZGVzdGluYXRpb24gZnJvbSB0aGUKLWZpcnN0IGxvbmcgb3B0aW9uIHN0cmluZyAoZS5nLiwgXGNvZGV7Ii17fS1mb28tYmFyIn0gaW1wbGllcyBcY29kZXtmb297XF99YmFyfSkuCi1JZiB0aGVyZSBhcmUgbm8gbG9uZyBvcHRpb24gc3RyaW5ncywgXG1vZHVsZXtvcHRwYXJzZX0gZGVyaXZlcyBhIGRlc3RpbmF0aW9uIGZyb20KLXRoZSBmaXJzdCBzaG9ydCBvcHRpb24gc3RyaW5nIChlLmcuLCBcY29kZXsiLWYifSBpbXBsaWVzIFxjb2Rle2Z9KS4KLQotRXhhbXBsZToKLVxiZWdpbnt2ZXJiYXRpbX0KLXBhcnNlci5hZGRfb3B0aW9uKCItZiIpCi1wYXJzZXIuYWRkX29wdGlvbigiLXAiLCB0eXBlPSJmbG9hdCIsIG5hcmdzPTMsIGRlc3Q9InBvaW50IikKLVxlbmR7dmVyYmF0aW19Ci0KLUFzIGl0IHBhcnNlcyB0aGUgY29tbWFuZCBsaW5lCi1cYmVnaW57dmVyYmF0aW19Ci0tZiBmb28udHh0IC1wIDEgLTMuNSA0IC1mYmFyLnR4dAotXGVuZHt2ZXJiYXRpbX0KLQotXG1vZHVsZXtvcHRwYXJzZX0gd2lsbCBzZXQKLVxiZWdpbnt2ZXJiYXRpbX0KLW9wdGlvbnMuZiA9ICJmb28udHh0Igotb3B0aW9ucy5wb2ludCA9ICgxLjAsIC0zLjUsIDQuMCkKLW9wdGlvbnMuZiA9ICJiYXIudHh0IgotXGVuZHt2ZXJiYXRpbX0KLQotXGl0ZW0ge30gCi1cY29kZXtzdG9yZXtcX31jb25zdH0ge1t9cmVxdWlyZWQ6IFxjb2Rle2NvbnN0fTsgcmVsZXZhbnQ6IFxtZW1iZXJ7ZGVzdH1dCi0KLVRoZSB2YWx1ZSBcY29kZXtjb25zdH0gaXMgc3RvcmVkIGluIFxtZW1iZXJ7ZGVzdH0uCi0KLUV4YW1wbGU6Ci1cYmVnaW57dmVyYmF0aW19Ci1wYXJzZXIuYWRkX29wdGlvbigiLXEiLCAiLS1xdWlldCIsCi0gICAgICAgICAgICAgICAgICBhY3Rpb249InN0b3JlX2NvbnN0IiwgY29uc3Q9MCwgZGVzdD0idmVyYm9zZSIpCi1wYXJzZXIuYWRkX29wdGlvbigiLXYiLCAiLS12ZXJib3NlIiwKLSAgICAgICAgICAgICAgICAgIGFjdGlvbj0ic3RvcmVfY29uc3QiLCBjb25zdD0xLCBkZXN0PSJ2ZXJib3NlIikKLXBhcnNlci5hZGRfb3B0aW9uKCItLW5vaXN5IiwKLSAgICAgICAgICAgICAgICAgIGFjdGlvbj0ic3RvcmVfY29uc3QiLCBjb25zdD0yLCBkZXN0PSJ2ZXJib3NlIikKLVxlbmR7dmVyYmF0aW19Ci0KLUlmIFxjb2RleyIte30tbm9pc3kifSBpcyBzZWVuLCBcbW9kdWxle29wdHBhcnNlfSB3aWxsIHNldAotXGJlZ2lue3ZlcmJhdGltfQotb3B0aW9ucy52ZXJib3NlID0gMgotXGVuZHt2ZXJiYXRpbX0KLQotXGl0ZW0ge30gCi1cY29kZXtzdG9yZXtcX310cnVlfSB7W31yZWxldmFudDogXG1lbWJlcntkZXN0fV0KLQotQSBzcGVjaWFsIGNhc2Ugb2YgXGNvZGV7c3RvcmV7XF99Y29uc3R9IHRoYXQgc3RvcmVzIGEgdHJ1ZSB2YWx1ZQotdG8gXG1lbWJlcntkZXN0fS4KLQotXGl0ZW0ge30gCi1cY29kZXtzdG9yZXtcX31mYWxzZX0ge1t9cmVsZXZhbnQ6IFxtZW1iZXJ7ZGVzdH1dCi0KLUxpa2UgXGNvZGV7c3RvcmV7XF99dHJ1ZX0sIGJ1dCBzdG9yZXMgYSBmYWxzZSB2YWx1ZS4KLQotRXhhbXBsZToKLVxiZWdpbnt2ZXJiYXRpbX0KLXBhcnNlci5hZGRfb3B0aW9uKCItLWNsb2JiZXIiLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJjbG9iYmVyIikKLXBhcnNlci5hZGRfb3B0aW9uKCItLW5vLWNsb2JiZXIiLCBhY3Rpb249InN0b3JlX2ZhbHNlIiwgZGVzdD0iY2xvYmJlciIpCi1cZW5ke3ZlcmJhdGltfQotCi1caXRlbSB7fSAKLVxjb2Rle2FwcGVuZH0ge1t9cmVsZXZhbnQ6IFxtZW1iZXJ7dHlwZX0sIFxtZW1iZXJ7ZGVzdH0sIFxjb2Rle25hcmdzfSwgXGNvZGV7Y2hvaWNlc31dCi0KLVRoZSBvcHRpb24gbXVzdCBiZSBmb2xsb3dlZCBieSBhbiBhcmd1bWVudCwgd2hpY2ggaXMgYXBwZW5kZWQgdG8gdGhlCi1saXN0IGluIFxtZW1iZXJ7ZGVzdH0uICBJZiBubyBkZWZhdWx0IHZhbHVlIGZvciBcbWVtYmVye2Rlc3R9IGlzIHN1cHBsaWVkLCBhbgotZW1wdHkgbGlzdCBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgd2hlbiBcbW9kdWxle29wdHBhcnNlfSBmaXJzdCBlbmNvdW50ZXJzIHRoaXMKLW9wdGlvbiBvbiB0aGUgY29tbWFuZC1saW5lLiAgSWYgXGNvZGV7bmFyZ3N9IHtcdGV4dGdyZWF0ZXJ9IDEsIG11bHRpcGxlIGFyZ3VtZW50cyBhcmUKLWNvbnN1bWVkLCBhbmQgYSB0dXBsZSBvZiBsZW5ndGggXGNvZGV7bmFyZ3N9IGlzIGFwcGVuZGVkIHRvIFxtZW1iZXJ7ZGVzdH0uCi0KLVRoZSBkZWZhdWx0cyBmb3IgXG1lbWJlcnt0eXBlfSBhbmQgXG1lbWJlcntkZXN0fSBhcmUgdGhlIHNhbWUgYXMgZm9yIHRoZQotXGNvZGV7c3RvcmV9IGFjdGlvbi4KLQotRXhhbXBsZToKLVxiZWdpbnt2ZXJiYXRpbX0KLXBhcnNlci5hZGRfb3B0aW9uKCItdCIsICItLXRyYWNrcyIsIGFjdGlvbj0iYXBwZW5kIiwgdHlwZT0iaW50IikKLVxlbmR7dmVyYmF0aW19Ci0KLUlmIFxjb2RleyItdDMifSBpcyBzZWVuIG9uIHRoZSBjb21tYW5kLWxpbmUsIFxtb2R1bGV7b3B0cGFyc2V9IGRvZXMgdGhlIGVxdWl2YWxlbnQgb2Y6Ci1cYmVnaW57dmVyYmF0aW19Ci1vcHRpb25zLnRyYWNrcyA9IFtdCi1vcHRpb25zLnRyYWNrcy5hcHBlbmQoaW50KCIzIikpCi1cZW5ke3ZlcmJhdGltfQotCi1JZiwgYSBsaXR0bGUgbGF0ZXIgb24sIFxjb2RleyIte30tdHJhY2tzPTQifSBpcyBzZWVuLCBpdCBkb2VzOgotXGJlZ2lue3ZlcmJhdGltfQotb3B0aW9ucy50cmFja3MuYXBwZW5kKGludCgiNCIpKQotXGVuZHt2ZXJiYXRpbX0KLQotXGl0ZW0ge30gCi1cY29kZXthcHBlbmR7XF99Y29uc3R9IHtbfXJlcXVpcmVkOiBcY29kZXtjb25zdH07IHJlbGV2YW50OiBcbWVtYmVye2Rlc3R9XQotCi1MaWtlIFxjb2Rle3N0b3Jle1xffWNvbnN0fSwgYnV0IHRoZSB2YWx1ZSBcY29kZXtjb25zdH0gaXMgYXBwZW5kZWQgdG8gXG1lbWJlcntkZXN0fTsKLWFzIHdpdGggXGNvZGV7YXBwZW5kfSwgXG1lbWJlcntkZXN0fSBkZWZhdWx0cyB0byBcY29kZXtOb25lfSwgYW5kIGFuIGFuIGVtcHR5IGxpc3QgaXMKLWF1dG9tYXRpY2FsbHkgY3JlYXRlZCB0aGUgZmlyc3QgdGltZSB0aGUgb3B0aW9uIGlzIGVuY291bnRlcmVkLgotCi1caXRlbSB7fSAKLVxjb2Rle2NvdW50fSB7W31yZWxldmFudDogXG1lbWJlcntkZXN0fV0KLQotSW5jcmVtZW50IHRoZSBpbnRlZ2VyIHN0b3JlZCBhdCBcbWVtYmVye2Rlc3R9LiAgSWYgbm8gZGVmYXVsdCB2YWx1ZSBpcwotc3VwcGxpZWQsIFxtZW1iZXJ7ZGVzdH0gaXMgc2V0IHRvIHplcm8gYmVmb3JlIGJlaW5nIGluY3JlbWVudGVkIHRoZSBmaXJzdAotdGltZS4KLQotRXhhbXBsZToKLVxiZWdpbnt2ZXJiYXRpbX0KLXBhcnNlci5hZGRfb3B0aW9uKCItdiIsIGFjdGlvbj0iY291bnQiLCBkZXN0PSJ2ZXJib3NpdHkiKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGZpcnN0IHRpbWUgXGNvZGV7Ii12In0gaXMgc2VlbiBvbiB0aGUgY29tbWFuZCBsaW5lLCBcbW9kdWxle29wdHBhcnNlfSBkb2VzIHRoZQotZXF1aXZhbGVudCBvZjoKLVxiZWdpbnt2ZXJiYXRpbX0KLW9wdGlvbnMudmVyYm9zaXR5ID0gMAotb3B0aW9ucy52ZXJib3NpdHkgKz0gMQotXGVuZHt2ZXJiYXRpbX0KLQotRXZlcnkgc3Vic2VxdWVudCBvY2N1cnJlbmNlIG9mIFxjb2RleyItdiJ9IHJlc3VsdHMgaW4KLVxiZWdpbnt2ZXJiYXRpbX0KLW9wdGlvbnMudmVyYm9zaXR5ICs9IDEKLVxlbmR7dmVyYmF0aW19Ci0KLVxpdGVtIHt9IAotXGNvZGV7Y2FsbGJhY2t9IHtbfXJlcXVpcmVkOiBcY29kZXtjYWxsYmFja307Ci1yZWxldmFudDogXG1lbWJlcnt0eXBlfSwgXGNvZGV7bmFyZ3N9LCBcY29kZXtjYWxsYmFja3tcX31hcmdzfSwgXGNvZGV7Y2FsbGJhY2t7XF99a3dhcmdzfV0KLQotQ2FsbCB0aGUgZnVuY3Rpb24gc3BlY2lmaWVkIGJ5IFxjb2Rle2NhbGxiYWNrfSwgd2hpY2ggaXMgY2FsbGVkIGFzCi1cYmVnaW57dmVyYmF0aW19Ci1mdW5jKG9wdGlvbiwgb3B0X3N0ciwgdmFsdWUsIHBhcnNlciwgKmFyZ3MsICoqa3dhcmdzKQotXGVuZHt2ZXJiYXRpbX0KLQotU2VlIHNlY3Rpb25+XHJlZntvcHRwYXJzZS1vcHRpb24tY2FsbGJhY2tzfSwgT3B0aW9uIENhbGxiYWNrcyBmb3IgbW9yZSBkZXRhaWwuCi0KLVxpdGVtIHt9IAotXG1lbWJlcntoZWxwfQotCi1QcmludHMgYSBjb21wbGV0ZSBoZWxwIG1lc3NhZ2UgZm9yIGFsbCB0aGUgb3B0aW9ucyBpbiB0aGUKLWN1cnJlbnQgb3B0aW9uIHBhcnNlci4gIFRoZSBoZWxwIG1lc3NhZ2UgaXMgY29uc3RydWN0ZWQgZnJvbQotdGhlIFxjb2Rle3VzYWdlfSBzdHJpbmcgcGFzc2VkIHRvIE9wdGlvblBhcnNlcidzIGNvbnN0cnVjdG9yIGFuZAotdGhlIFxtZW1iZXJ7aGVscH0gc3RyaW5nIHBhc3NlZCB0byBldmVyeSBvcHRpb24uCi0KLUlmIG5vIFxtZW1iZXJ7aGVscH0gc3RyaW5nIGlzIHN1cHBsaWVkIGZvciBhbiBvcHRpb24sIGl0IHdpbGwgc3RpbGwgYmUKLWxpc3RlZCBpbiB0aGUgaGVscCBtZXNzYWdlLiAgVG8gb21pdCBhbiBvcHRpb24gZW50aXJlbHksIHVzZQotdGhlIHNwZWNpYWwgdmFsdWUgXGNvZGV7b3B0cGFyc2UuU1VQUFJFU1N7XF99SEVMUH0uCi0KLVxtb2R1bGV7b3B0cGFyc2V9IGF1dG9tYXRpY2FsbHkgYWRkcyBhIFxtZW1iZXJ7aGVscH0gb3B0aW9uIHRvIGFsbCBPcHRpb25QYXJzZXJzLCBzbwoteW91IGRvIG5vdCBub3JtYWxseSBuZWVkIHRvIGNyZWF0ZSBvbmUuCi0KLUV4YW1wbGU6Ci1cYmVnaW57dmVyYmF0aW19Ci1mcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXIsIFNVUFBSRVNTX0hFTFAKLQotcGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKLXBhcnNlci5hZGRfb3B0aW9uKCItaCIsICItLWhlbHAiLCBhY3Rpb249ImhlbHAiKSwKLXBhcnNlci5hZGRfb3B0aW9uKCItdiIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9InZlcmJvc2UiLAotICAgICAgICAgICAgICAgICAgaGVscD0iQmUgbW9kZXJhdGVseSB2ZXJib3NlIikKLXBhcnNlci5hZGRfb3B0aW9uKCItLWZpbGUiLCBkZXN0PSJmaWxlbmFtZSIsCi0gICAgICAgICAgICAgICAgICBoZWxwPSJJbnB1dCBmaWxlIHRvIHJlYWQgZGF0YSBmcm9tIiksCi1wYXJzZXIuYWRkX29wdGlvbigiLS1zZWNyZXQiLCBoZWxwPVNVUFBSRVNTX0hFTFApCi1cZW5ke3ZlcmJhdGltfQotCi1JZiBcbW9kdWxle29wdHBhcnNlfSBzZWVzIGVpdGhlciBcY29kZXsiLWgifSBvciBcY29kZXsiLXt9LWhlbHAifSBvbiB0aGUgY29tbWFuZCBsaW5lLCBpdAotd2lsbCBwcmludCBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nIGhlbHAgbWVzc2FnZSB0byBzdGRvdXQKLShhc3N1bWluZyBcY29kZXtzeXMuYXJndntbfTBdfSBpcyBcY29kZXsiZm9vLnB5In0pOgotXGJlZ2lue3ZlcmJhdGltfQotdXNhZ2U6IGZvby5weSBbb3B0aW9uc10KLQotb3B0aW9uczoKLSAgLWgsIC0taGVscCAgICAgICAgU2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAotICAtdiAgICAgICAgICAgICAgICBCZSBtb2RlcmF0ZWx5IHZlcmJvc2UKLSAgLS1maWxlPUZJTEVOQU1FICAgSW5wdXQgZmlsZSB0byByZWFkIGRhdGEgZnJvbQotXGVuZHt2ZXJiYXRpbX0KLQotQWZ0ZXIgcHJpbnRpbmcgdGhlIGhlbHAgbWVzc2FnZSwgXG1vZHVsZXtvcHRwYXJzZX0gdGVybWluYXRlcyB5b3VyIHByb2Nlc3MKLXdpdGggXGNvZGV7c3lzLmV4aXQoMCl9LgotCi1caXRlbSB7fSAKLVxjb2Rle3ZlcnNpb259Ci0KLVByaW50cyB0aGUgdmVyc2lvbiBudW1iZXIgc3VwcGxpZWQgdG8gdGhlIE9wdGlvblBhcnNlciB0byBzdGRvdXQgYW5kCi1leGl0cy4gIFRoZSB2ZXJzaW9uIG51bWJlciBpcyBhY3R1YWxseSBmb3JtYXR0ZWQgYW5kIHByaW50ZWQgYnkgdGhlCi1cY29kZXtwcmludHtcX312ZXJzaW9uKCl9IG1ldGhvZCBvZiBPcHRpb25QYXJzZXIuICBHZW5lcmFsbHkgb25seSByZWxldmFudAotaWYgdGhlIFxjb2Rle3ZlcnNpb259IGFyZ3VtZW50IGlzIHN1cHBsaWVkIHRvIHRoZSBPcHRpb25QYXJzZXIKLWNvbnN0cnVjdG9yLiAgQXMgd2l0aCBcbWVtYmVye2hlbHB9IG9wdGlvbnMsIHlvdSB3aWxsIHJhcmVseSBjcmVhdGUKLVxjb2Rle3ZlcnNpb259IG9wdGlvbnMsIHNpbmNlIFxtb2R1bGV7b3B0cGFyc2V9IGF1dG9tYXRpY2FsbHkgYWRkcyB0aGVtIHdoZW4gbmVlZGVkLgotCi1cZW5ke2l0ZW1pemV9Ci0KLQotXHN1YnN1YnNlY3Rpb257T3B0aW9uIGF0dHJpYnV0ZXNcbGFiZWx7b3B0cGFyc2Utb3B0aW9uLWF0dHJpYnV0ZXN9fQotCi1UaGUgZm9sbG93aW5nIG9wdGlvbiBhdHRyaWJ1dGVzIG1heSBiZSBwYXNzZWQgYXMga2V5d29yZCBhcmd1bWVudHMKLXRvIFxjb2Rle3BhcnNlci5hZGR7XF99b3B0aW9uKCl9LiAgSWYgeW91IHBhc3MgYW4gb3B0aW9uIGF0dHJpYnV0ZQotdGhhdCBpcyBub3QgcmVsZXZhbnQgdG8gYSBwYXJ0aWN1bGFyIG9wdGlvbiwgb3IgZmFpbCB0byBwYXNzIGEgcmVxdWlyZWQKLW9wdGlvbiBhdHRyaWJ1dGUsIFxtb2R1bGV7b3B0cGFyc2V9IHJhaXNlcyBPcHRpb25FcnJvci4KLVxiZWdpbntpdGVtaXplfQotXGl0ZW0ge30gCi1cbWVtYmVye2FjdGlvbn0gKGRlZmF1bHQ6IFxjb2RleyJzdG9yZSJ9KQotCi1EZXRlcm1pbmVzIFxtb2R1bGV7b3B0cGFyc2V9J3MgYmVoYXZpb3VyIHdoZW4gdGhpcyBvcHRpb24gaXMgc2VlbiBvbiB0aGUgY29tbWFuZAotbGluZTsgdGhlIGF2YWlsYWJsZSBvcHRpb25zIGFyZSBkb2N1bWVudGVkIGFib3ZlLgotCi1caXRlbSB7fSAKLVxtZW1iZXJ7dHlwZX0gKGRlZmF1bHQ6IFxjb2RleyJzdHJpbmcifSkKLQotVGhlIGFyZ3VtZW50IHR5cGUgZXhwZWN0ZWQgYnkgdGhpcyBvcHRpb24gKGUuZy4sIFxjb2RleyJzdHJpbmcifSBvcgotXGNvZGV7ImludCJ9KTsgdGhlIGF2YWlsYWJsZSBvcHRpb24gdHlwZXMgYXJlIGRvY3VtZW50ZWQgYmVsb3cuCi0KLVxpdGVtIHt9IAotXG1lbWJlcntkZXN0fSAoZGVmYXVsdDogZGVyaXZlZCBmcm9tIG9wdGlvbiBzdHJpbmdzKQotCi1JZiB0aGUgb3B0aW9uJ3MgYWN0aW9uIGltcGxpZXMgd3JpdGluZyBvciBtb2RpZnlpbmcgYSB2YWx1ZSBzb21ld2hlcmUsCi10aGlzIHRlbGxzIFxtb2R1bGV7b3B0cGFyc2V9IHdoZXJlIHRvIHdyaXRlIGl0OiBcbWVtYmVye2Rlc3R9IG5hbWVzIGFuIGF0dHJpYnV0ZSBvZiB0aGUKLVxjb2Rle29wdGlvbnN9IG9iamVjdCB0aGF0IFxtb2R1bGV7b3B0cGFyc2V9IGJ1aWxkcyBhcyBpdCBwYXJzZXMgdGhlIGNvbW1hbmQgbGluZS4KLQotXGl0ZW0ge30gCi1cY29kZXtkZWZhdWx0fSAoZGVwcmVjYXRlZCkKLQotVGhlIHZhbHVlIHRvIHVzZSBmb3IgdGhpcyBvcHRpb24ncyBkZXN0aW5hdGlvbiBpZiB0aGUgb3B0aW9uIGlzIG5vdAotc2VlbiBvbiB0aGUgY29tbWFuZCBsaW5lLiAgRGVwcmVjYXRlZDsgdXNlIFxjb2Rle3BhcnNlci5zZXR7XF99ZGVmYXVsdHMoKX0KLWluc3RlYWQuCi0KLVxpdGVtIHt9IAotXGNvZGV7bmFyZ3N9IChkZWZhdWx0OiAxKQotCi1Ib3cgbWFueSBhcmd1bWVudHMgb2YgdHlwZSBcbWVtYmVye3R5cGV9IHNob3VsZCBiZSBjb25zdW1lZCB3aGVuIHRoaXMKLW9wdGlvbiBpcyBzZWVuLiAgSWYge1x0ZXh0Z3JlYXRlcn0gMSwgXG1vZHVsZXtvcHRwYXJzZX0gd2lsbCBzdG9yZSBhIHR1cGxlIG9mIHZhbHVlcyB0bwotXG1lbWJlcntkZXN0fS4KLQotXGl0ZW0ge30gCi1cY29kZXtjb25zdH0KLQotRm9yIGFjdGlvbnMgdGhhdCBzdG9yZSBhIGNvbnN0YW50IHZhbHVlLCB0aGUgY29uc3RhbnQgdmFsdWUgdG8gc3RvcmUuCi0KLVxpdGVtIHt9IAotXGNvZGV7Y2hvaWNlc30KLQotRm9yIG9wdGlvbnMgb2YgdHlwZSBcY29kZXsiY2hvaWNlIn0sIHRoZSBsaXN0IG9mIHN0cmluZ3MgdGhlIHVzZXIKLW1heSBjaG9vc2UgZnJvbS4KLQotXGl0ZW0ge30gCi1cY29kZXtjYWxsYmFja30KLQotRm9yIG9wdGlvbnMgd2l0aCBhY3Rpb24gXGNvZGV7ImNhbGxiYWNrIn0sIHRoZSBjYWxsYWJsZSB0byBjYWxsIHdoZW4gdGhpcwotb3B0aW9uIGlzIHNlZW4uICBTZWUgc2VjdGlvbn5ccmVme29wdHBhcnNlLW9wdGlvbi1jYWxsYmFja3N9LCBPcHRpb24gQ2FsbGJhY2tzIGZvciBkZXRhaWwgb24gdGhlIGFyZ3VtZW50cwotcGFzc2VkIHRvIFxjb2Rle2NhbGxhYmxlfS4KLQotXGl0ZW0ge30gCi1cY29kZXtjYWxsYmFja3tcX31hcmdzfSwgXGNvZGV7Y2FsbGJhY2t7XF99a3dhcmdzfQotCi1BZGRpdGlvbmFsIHBvc2l0aW9uYWwgYW5kIGtleXdvcmQgYXJndW1lbnRzIHRvIHBhc3MgdG8gXGNvZGV7Y2FsbGJhY2t9Ci1hZnRlciB0aGUgZm91ciBzdGFuZGFyZCBjYWxsYmFjayBhcmd1bWVudHMuCi0KLVxpdGVtIHt9IAotXG1lbWJlcntoZWxwfQotCi1IZWxwIHRleHQgdG8gcHJpbnQgZm9yIHRoaXMgb3B0aW9uIHdoZW4gbGlzdGluZyBhbGwgYXZhaWxhYmxlIG9wdGlvbnMKLWFmdGVyIHRoZSB1c2VyIHN1cHBsaWVzIGEgXG1lbWJlcntoZWxwfSBvcHRpb24gKHN1Y2ggYXMgXGNvZGV7Ii17fS1oZWxwIn0pLgotSWYgbm8gaGVscCB0ZXh0IGlzIHN1cHBsaWVkLCB0aGUgb3B0aW9uIHdpbGwgYmUgbGlzdGVkIHdpdGhvdXQgaGVscAotdGV4dC4gIFRvIGhpZGUgdGhpcyBvcHRpb24sIHVzZSB0aGUgc3BlY2lhbCB2YWx1ZSBcY29kZXtTVVBQUkVTU3tcX31IRUxQfS4KLQotXGl0ZW0ge30gCi1cY29kZXttZXRhdmFyfSAoZGVmYXVsdDogZGVyaXZlZCBmcm9tIG9wdGlvbiBzdHJpbmdzKQotCi1TdGFuZC1pbiBmb3IgdGhlIG9wdGlvbiBhcmd1bWVudChzKSB0byB1c2Ugd2hlbiBwcmludGluZyBoZWxwIHRleHQuCi1TZWUgc2VjdGlvbn5ccmVme29wdHBhcnNlLXR1dG9yaWFsfSwgdGhlIHR1dG9yaWFsIGZvciBhbiBleGFtcGxlLgotCi1cZW5ke2l0ZW1pemV9Ci0KLQotXHN1YnN1YnNlY3Rpb257U3RhbmRhcmQgb3B0aW9uIHR5cGVzXGxhYmVse29wdHBhcnNlLXN0YW5kYXJkLW9wdGlvbi10eXBlc319Ci0KLVxtb2R1bGV7b3B0cGFyc2V9IGhhcyBzaXggYnVpbHQtaW4gb3B0aW9uIHR5cGVzOiBcY29kZXtzdHJpbmd9LCBcY29kZXtpbnR9LCBcY29kZXtsb25nfSwKLVxjb2Rle2Nob2ljZX0sIFxjb2Rle2Zsb2F0fSBhbmQgXGNvZGV7Y29tcGxleH0uICBJZiB5b3UgbmVlZCB0byBhZGQgbmV3IG9wdGlvbgotdHlwZXMsIHNlZSBzZWN0aW9uflxyZWZ7b3B0cGFyc2UtZXh0ZW5kaW5nLW9wdHBhcnNlfSwgRXh0ZW5kaW5nIFxtb2R1bGV7b3B0cGFyc2V9LgotCi1Bcmd1bWVudHMgdG8gc3RyaW5nIG9wdGlvbnMgYXJlIG5vdCBjaGVja2VkIG9yIGNvbnZlcnRlZCBpbiBhbnkgd2F5OiB0aGUKLXRleHQgb24gdGhlIGNvbW1hbmQgbGluZSBpcyBzdG9yZWQgaW4gdGhlIGRlc3RpbmF0aW9uIChvciBwYXNzZWQgdG8gdGhlCi1jYWxsYmFjaykgYXMtaXMuCi0KLUludGVnZXIgYXJndW1lbnRzICh0eXBlIFxjb2Rle2ludH0gb3IgXGNvZGV7bG9uZ30pIGFyZSBwYXJzZWQgYXMgZm9sbG93czoKLVxiZWdpbntxdW90ZX0KLVxiZWdpbntpdGVtaXplfQotXGl0ZW0ge30gCi1pZiB0aGUgbnVtYmVyIHN0YXJ0cyB3aXRoIFxjb2RlezB4fSwgaXQgaXMgcGFyc2VkIGFzIGEgaGV4YWRlY2ltYWwgbnVtYmVyCi0KLVxpdGVtIHt9IAotaWYgdGhlIG51bWJlciBzdGFydHMgd2l0aCBcY29kZXswfSwgaXQgaXMgcGFyc2VkIGFzIGFuIG9jdGFsIG51bWJlcgotCi1caXRlbSB7fSAKLWlmIHRoZSBudW1iZXIgc3RhcnRzIHdpdGggXGNvZGV7MGJ9LCBpcyBpcyBwYXJzZWQgYXMgYSBiaW5hcnkgbnVtYmVyCi0KLVxpdGVtIHt9IAotb3RoZXJ3aXNlLCB0aGUgbnVtYmVyIGlzIHBhcnNlZCBhcyBhIGRlY2ltYWwgbnVtYmVyCi0KLVxlbmR7aXRlbWl6ZX0KLVxlbmR7cXVvdGV9Ci0KLVRoZSBjb252ZXJzaW9uIGlzIGRvbmUgYnkgY2FsbGluZyBlaXRoZXIgXGNvZGV7aW50KCl9IG9yIFxjb2Rle2xvbmcoKX0gd2l0aAotdGhlIGFwcHJvcHJpYXRlIGJhc2UgKDIsIDgsIDEwLCBvciAxNikuICBJZiB0aGlzIGZhaWxzLCBzbyB3aWxsIFxtb2R1bGV7b3B0cGFyc2V9LAotYWx0aG91Z2ggd2l0aCBhIG1vcmUgdXNlZnVsIGVycm9yIG1lc3NhZ2UuCi0KLVxjb2Rle2Zsb2F0fSBhbmQgXGNvZGV7Y29tcGxleH0gb3B0aW9uIGFyZ3VtZW50cyBhcmUgY29udmVydGVkIGRpcmVjdGx5IHdpdGgKLVxjb2Rle2Zsb2F0KCl9IGFuZCBcY29kZXtjb21wbGV4KCl9LCB3aXRoIHNpbWlsYXIgZXJyb3ItaGFuZGxpbmcuCi0KLVxjb2Rle2Nob2ljZX0gb3B0aW9ucyBhcmUgYSBzdWJ0eXBlIG9mIFxjb2Rle3N0cmluZ30gb3B0aW9ucy4gIFRoZSBcY29kZXtjaG9pY2VzfQotb3B0aW9uIGF0dHJpYnV0ZSAoYSBzZXF1ZW5jZSBvZiBzdHJpbmdzKSBkZWZpbmVzIHRoZSBzZXQgb2YgYWxsb3dlZAotb3B0aW9uIGFyZ3VtZW50cy4gIFxjb2Rle29wdHBhcnNlLmNoZWNre1xffWNob2ljZSgpfSBjb21wYXJlcwotdXNlci1zdXBwbGllZCBvcHRpb24gYXJndW1lbnRzIGFnYWluc3QgdGhpcyBtYXN0ZXIgbGlzdCBhbmQgcmFpc2VzCi1PcHRpb25WYWx1ZUVycm9yIGlmIGFuIGludmFsaWQgc3RyaW5nIGlzIGdpdmVuLgotCi0KLVxzdWJzdWJzZWN0aW9ue1BhcnNpbmcgYXJndW1lbnRzXGxhYmVse29wdHBhcnNlLXBhcnNpbmctYXJndW1lbnRzfX0KLQotVGhlIHdob2xlIHBvaW50IG9mIGNyZWF0aW5nIGFuZCBwb3B1bGF0aW5nIGFuIE9wdGlvblBhcnNlciBpcyB0byBjYWxsCi1pdHMgXG1ldGhvZHtwYXJzZXtcX31hcmdzKCl9IG1ldGhvZDoKLVxiZWdpbnt2ZXJiYXRpbX0KLShvcHRpb25zLCBhcmdzKSA9IHBhcnNlci5wYXJzZV9hcmdzKGFyZ3M9Tm9uZSwgdmFsdWVzPU5vbmUpCi1cZW5ke3ZlcmJhdGltfQotCi13aGVyZSB0aGUgaW5wdXQgcGFyYW1ldGVycyBhcmUKLVxiZWdpbntkZXNjcmlwdGlvbn0KLVxpdGVtW1xjb2Rle2FyZ3N9XQotdGhlIGxpc3Qgb2YgYXJndW1lbnRzIHRvIHByb2Nlc3MgKGRlZmF1bHQ6IFxjb2Rle3N5cy5hcmd2e1t9MTpdfSkKLVxpdGVtW1xjb2Rle3ZhbHVlc31dCi1vYmplY3QgdG8gc3RvcmUgb3B0aW9uIGFyZ3VtZW50cyBpbiAoZGVmYXVsdDogYSBuZXcgaW5zdGFuY2Ugb2YKLW9wdHBhcnNlLlZhbHVlcykKLVxlbmR7ZGVzY3JpcHRpb259Ci0KLWFuZCB0aGUgcmV0dXJuIHZhbHVlcyBhcmUKLVxiZWdpbntkZXNjcmlwdGlvbn0KLVxpdGVtW1xjb2Rle29wdGlvbnN9XQotdGhlIHNhbWUgb2JqZWN0IHRoYXQgd2FzIHBhc3NlZCBpbiBhcyBcY29kZXtvcHRpb25zfSwgb3IgdGhlCi1vcHRwYXJzZS5WYWx1ZXMgaW5zdGFuY2UgY3JlYXRlZCBieSBcbW9kdWxle29wdHBhcnNlfQotXGl0ZW1bXGNvZGV7YXJnc31dCi10aGUgbGVmdG92ZXIgcG9zaXRpb25hbCBhcmd1bWVudHMgYWZ0ZXIgYWxsIG9wdGlvbnMgaGF2ZSBiZWVuCi1wcm9jZXNzZWQKLVxlbmR7ZGVzY3JpcHRpb259Ci0KLVRoZSBtb3N0IGNvbW1vbiB1c2FnZSBpcyB0byBzdXBwbHkgbmVpdGhlciBrZXl3b3JkIGFyZ3VtZW50LiAgSWYgeW91Ci1zdXBwbHkgXGNvZGV7b3B0aW9uc30sIGl0IHdpbGwgYmUgbW9kaWZpZWQgd2l0aCByZXBlYXRlZCBcY29kZXtzZXRhdHRyKCl9Ci1jYWxscyAocm91Z2hseSBvbmUgZm9yIGV2ZXJ5IG9wdGlvbiBhcmd1bWVudCBzdG9yZWQgdG8gYW4gb3B0aW9uCi1kZXN0aW5hdGlvbikgYW5kIHJldHVybmVkIGJ5IFxtZXRob2R7cGFyc2V7XF99YXJncygpfS4KLQotSWYgXG1ldGhvZHtwYXJzZXtcX31hcmdzKCl9IGVuY291bnRlcnMgYW55IGVycm9ycyBpbiB0aGUgYXJndW1lbnQgbGlzdCwgaXQgY2FsbHMKLXRoZSBPcHRpb25QYXJzZXIncyBcbWV0aG9ke2Vycm9yKCl9IG1ldGhvZCB3aXRoIGFuIGFwcHJvcHJpYXRlIGVuZC11c2VyIGVycm9yCi1tZXNzYWdlLiAgVGhpcyB1bHRpbWF0ZWx5IHRlcm1pbmF0ZXMgeW91ciBwcm9jZXNzIHdpdGggYW4gZXhpdCBzdGF0dXMgb2YKLTIgKHRoZSB0cmFkaXRpb25hbCBcVU5JWHt9IGV4aXQgc3RhdHVzIGZvciBjb21tYW5kLWxpbmUgZXJyb3JzKS4KLQotCi1cc3Vic3Vic2VjdGlvbntRdWVyeWluZyBhbmQgbWFuaXB1bGF0aW5nIHlvdXIgb3B0aW9uIHBhcnNlclxsYWJlbHtvcHRwYXJzZS1xdWVyeWluZy1tYW5pcHVsYXRpbmctb3B0aW9uLXBhcnNlcn19Ci0KLVNvbWV0aW1lcywgaXQncyB1c2VmdWwgdG8gcG9rZSBhcm91bmQgeW91ciBvcHRpb24gcGFyc2VyIGFuZCBzZWUgd2hhdCdzCi10aGVyZS4gIE9wdGlvblBhcnNlciBwcm92aWRlcyBhIGNvdXBsZSBvZiBtZXRob2RzIHRvIGhlbHAgeW91IG91dDoKLVxiZWdpbntkZXNjcmlwdGlvbn0KLVxpdGVtW1xjb2Rle2hhc3tcX31vcHRpb24ob3B0e1xffXN0cil9XQotUmV0dXJuIHRydWUgaWYgdGhlIE9wdGlvblBhcnNlciBoYXMgYW4gb3B0aW9uIHdpdGggCi1vcHRpb24gc3RyaW5nIFxjb2Rle29wdHtcX31zdHJ9IChlLmcuLCBcY29kZXsiLXEifSBvciBcY29kZXsiLXt9LXZlcmJvc2UifSkuCi1caXRlbVtcY29kZXtnZXR7XF99b3B0aW9uKG9wdHtcX31zdHIpfV0KLVJldHVybnMgdGhlIE9wdGlvbiBpbnN0YW5jZSB3aXRoIHRoZSBvcHRpb24gc3RyaW5nIFxjb2Rle29wdHtcX31zdHJ9LCBvcgotXGNvZGV7Tm9uZX0gaWYgbm8gb3B0aW9ucyBoYXZlIHRoYXQgb3B0aW9uIHN0cmluZy4KLVxpdGVtW1xjb2Rle3JlbW92ZXtcX31vcHRpb24ob3B0e1xffXN0cil9XQotSWYgdGhlIE9wdGlvblBhcnNlciBoYXMgYW4gb3B0aW9uIGNvcnJlc3BvbmRpbmcgdG8gXGNvZGV7b3B0e1xffXN0cn0sCi10aGF0IG9wdGlvbiBpcyByZW1vdmVkLiAgSWYgdGhhdCBvcHRpb24gcHJvdmlkZWQgYW55IG90aGVyCi1vcHRpb24gc3RyaW5ncywgYWxsIG9mIHRob3NlIG9wdGlvbiBzdHJpbmdzIGJlY29tZSBpbnZhbGlkLgotSWYgXGNvZGV7b3B0e1xffXN0cn0gZG9lcyBub3Qgb2NjdXIgaW4gYW55IG9wdGlvbiBiZWxvbmdpbmcgdG8gdGhpcwotT3B0aW9uUGFyc2VyLCByYWlzZXMgVmFsdWVFcnJvci4KLVxlbmR7ZGVzY3JpcHRpb259Ci0KLQotXHN1YnN1YnNlY3Rpb257Q29uZmxpY3RzIGJldHdlZW4gb3B0aW9uc1xsYWJlbHtvcHRwYXJzZS1jb25mbGljdHMtYmV0d2Vlbi1vcHRpb25zfX0KLQotSWYgeW91J3JlIG5vdCBjYXJlZnVsLCBpdCdzIGVhc3kgdG8gZGVmaW5lIG9wdGlvbnMgd2l0aCBjb25mbGljdGluZwotb3B0aW9uIHN0cmluZ3M6Ci1cYmVnaW57dmVyYmF0aW19Ci1wYXJzZXIuYWRkX29wdGlvbigiLW4iLCAiLS1kcnktcnVuIiwgLi4uKQotWy4uLl0KLXBhcnNlci5hZGRfb3B0aW9uKCItbiIsICItLW5vaXN5IiwgLi4uKQotXGVuZHt2ZXJiYXRpbX0KLQotKFRoaXMgaXMgcGFydGljdWxhcmx5IHRydWUgaWYgeW91J3ZlIGRlZmluZWQgeW91ciBvd24gT3B0aW9uUGFyc2VyCi1zdWJjbGFzcyB3aXRoIHNvbWUgc3RhbmRhcmQgb3B0aW9ucy4pCi0KLUV2ZXJ5IHRpbWUgeW91IGFkZCBhbiBvcHRpb24sIFxtb2R1bGV7b3B0cGFyc2V9IGNoZWNrcyBmb3IgY29uZmxpY3RzIHdpdGggZXhpc3RpbmcKLW9wdGlvbnMuICBJZiBpdCBmaW5kcyBhbnksIGl0IGludm9rZXMgdGhlIGN1cnJlbnQgY29uZmxpY3QtaGFuZGxpbmcKLW1lY2hhbmlzbS4gIFlvdSBjYW4gc2V0IHRoZSBjb25mbGljdC1oYW5kbGluZyBtZWNoYW5pc20gZWl0aGVyIGluIHRoZQotY29uc3RydWN0b3I6Ci1cYmVnaW57dmVyYmF0aW19Ci1wYXJzZXIgPSBPcHRpb25QYXJzZXIoLi4uLCBjb25mbGljdF9oYW5kbGVyPWhhbmRsZXIpCi1cZW5ke3ZlcmJhdGltfQotCi1vciB3aXRoIGEgc2VwYXJhdGUgY2FsbDoKLVxiZWdpbnt2ZXJiYXRpbX0KLXBhcnNlci5zZXRfY29uZmxpY3RfaGFuZGxlcihoYW5kbGVyKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGF2YWlsYWJsZSBjb25mbGljdCBoYW5kbGVycyBhcmU6Ci1cYmVnaW57cXVvdGV9Ci1cYmVnaW57ZGVzY3JpcHRpb259Ci1caXRlbVtcY29kZXtlcnJvcn0gKGRlZmF1bHQpXQotYXNzdW1lIG9wdGlvbiBjb25mbGljdHMgYXJlIGEgcHJvZ3JhbW1pbmcgZXJyb3IgYW5kIHJhaXNlIAotT3B0aW9uQ29uZmxpY3RFcnJvcgotXGl0ZW1bXGNvZGV7cmVzb2x2ZX1dCi1yZXNvbHZlIG9wdGlvbiBjb25mbGljdHMgaW50ZWxsaWdlbnRseSAoc2VlIGJlbG93KQotXGVuZHtkZXNjcmlwdGlvbn0KLVxlbmR7cXVvdGV9Ci0KLUFzIGFuIGV4YW1wbGUsIGxldCdzIGRlZmluZSBhbiBPcHRpb25QYXJzZXIgdGhhdCByZXNvbHZlcyBjb25mbGljdHMKLWludGVsbGlnZW50bHkgYW5kIGFkZCBjb25mbGljdGluZyBvcHRpb25zIHRvIGl0OgotXGJlZ2lue3ZlcmJhdGltfQotcGFyc2VyID0gT3B0aW9uUGFyc2VyKGNvbmZsaWN0X2hhbmRsZXI9InJlc29sdmUiKQotcGFyc2VyLmFkZF9vcHRpb24oIi1uIiwgIi0tZHJ5LXJ1biIsIC4uLiwgaGVscD0iZG8gbm8gaGFybSIpCi1wYXJzZXIuYWRkX29wdGlvbigiLW4iLCAiLS1ub2lzeSIsIC4uLiwgaGVscD0iYmUgbm9pc3kiKQotXGVuZHt2ZXJiYXRpbX0KLQotQXQgdGhpcyBwb2ludCwgXG1vZHVsZXtvcHRwYXJzZX0gZGV0ZWN0cyB0aGF0IGEgcHJldmlvdXNseS1hZGRlZCBvcHRpb24gaXMgYWxyZWFkeQotdXNpbmcgdGhlIFxjb2RleyItbiJ9IG9wdGlvbiBzdHJpbmcuICBTaW5jZSBcY29kZXtjb25mbGljdHtcX31oYW5kbGVyfSBpcwotXGNvZGV7InJlc29sdmUifSwgaXQgcmVzb2x2ZXMgdGhlIHNpdHVhdGlvbiBieSByZW1vdmluZyBcY29kZXsiLW4ifSBmcm9tIHRoZQotZWFybGllciBvcHRpb24ncyBsaXN0IG9mIG9wdGlvbiBzdHJpbmdzLiAgTm93IFxjb2RleyIte30tZHJ5LXJ1biJ9IGlzIHRoZQotb25seSB3YXkgZm9yIHRoZSB1c2VyIHRvIGFjdGl2YXRlIHRoYXQgb3B0aW9uLiAgSWYgdGhlIHVzZXIgYXNrcyBmb3IKLWhlbHAsIHRoZSBoZWxwIG1lc3NhZ2Ugd2lsbCByZWZsZWN0IHRoYXQ6Ci1cYmVnaW57dmVyYmF0aW19Ci1vcHRpb25zOgotICAtLWRyeS1ydW4gICAgIGRvIG5vIGhhcm0KLSAgWy4uLl0KLSAgLW4sIC0tbm9pc3kgICBiZSBub2lzeQotXGVuZHt2ZXJiYXRpbX0KLQotSXQncyBwb3NzaWJsZSB0byB3aGl0dGxlIGF3YXkgdGhlIG9wdGlvbiBzdHJpbmdzIGZvciBhIHByZXZpb3VzbHktYWRkZWQKLW9wdGlvbiB1bnRpbCB0aGVyZSBhcmUgbm9uZSBsZWZ0LCBhbmQgdGhlIHVzZXIgaGFzIG5vIHdheSBvZiBpbnZva2luZwotdGhhdCBvcHRpb24gZnJvbSB0aGUgY29tbWFuZC1saW5lLiAgSW4gdGhhdCBjYXNlLCBcbW9kdWxle29wdHBhcnNlfSByZW1vdmVzIHRoYXQKLW9wdGlvbiBjb21wbGV0ZWx5LCBzbyBpdCBkb2Vzbid0IHNob3cgdXAgaW4gaGVscCB0ZXh0IG9yIGFueXdoZXJlIGVsc2UuCi1DYXJyeWluZyBvbiB3aXRoIG91ciBleGlzdGluZyBPcHRpb25QYXJzZXI6Ci1cYmVnaW57dmVyYmF0aW19Ci1wYXJzZXIuYWRkX29wdGlvbigiLS1kcnktcnVuIiwgLi4uLCBoZWxwPSJuZXcgZHJ5LXJ1biBvcHRpb24iKQotXGVuZHt2ZXJiYXRpbX0KLQotQXQgdGhpcyBwb2ludCwgdGhlIG9yaWdpbmFsIFxwcm9ncmFtb3B0ey1uLy17fS1kcnktcnVufSBvcHRpb24gaXMgbm8gbG9uZ2VyCi1hY2Nlc3NpYmxlLCBzbyBcbW9kdWxle29wdHBhcnNlfSByZW1vdmVzIGl0LCBsZWF2aW5nIHRoaXMgaGVscCB0ZXh0OgotXGJlZ2lue3ZlcmJhdGltfQotb3B0aW9uczoKLSAgWy4uLl0KLSAgLW4sIC0tbm9pc3kgICBiZSBub2lzeQotICAtLWRyeS1ydW4gICAgIG5ldyBkcnktcnVuIG9wdGlvbgotXGVuZHt2ZXJiYXRpbX0KLQotCi1cc3Vic3Vic2VjdGlvbntDbGVhbnVwXGxhYmVse29wdHBhcnNlLWNsZWFudXB9fQotCi1PcHRpb25QYXJzZXIgaW5zdGFuY2VzIGhhdmUgc2V2ZXJhbCBjeWNsaWMgcmVmZXJlbmNlcy4gIFRoaXMgc2hvdWxkIG5vdAotYmUgYSBwcm9ibGVtIGZvciBQeXRob24ncyBnYXJiYWdlIGNvbGxlY3RvciwgYnV0IHlvdSBtYXkgd2lzaCB0byBicmVhawotdGhlIGN5Y2xpYyByZWZlcmVuY2VzIGV4cGxpY2l0bHkgYnkgY2FsbGluZyBcY29kZXtkZXN0cm95KCl9IG9uIHlvdXIKLU9wdGlvblBhcnNlciBvbmNlIHlvdSBhcmUgZG9uZSB3aXRoIGl0LiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGluCi1sb25nLXJ1bm5pbmcgYXBwbGljYXRpb25zIHdoZXJlIGxhcmdlIG9iamVjdCBncmFwaHMgYXJlIHJlYWNoYWJsZSBmcm9tCi15b3VyIE9wdGlvblBhcnNlci4KLQotCi1cc3Vic3Vic2VjdGlvbntPdGhlciBtZXRob2RzXGxhYmVse29wdHBhcnNlLW90aGVyLW1ldGhvZHN9fQotCi1PcHRpb25QYXJzZXIgc3VwcG9ydHMgc2V2ZXJhbCBvdGhlciBwdWJsaWMgbWV0aG9kczoKLVxiZWdpbntpdGVtaXplfQotXGl0ZW0ge30gCi1cY29kZXtzZXR7XF99dXNhZ2UodXNhZ2UpfQotCi1TZXQgdGhlIHVzYWdlIHN0cmluZyBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIGRlc2NyaWJlZCBhYm92ZSBmb3IgdGhlCi1cY29kZXt1c2FnZX0gY29uc3RydWN0b3Iga2V5d29yZCBhcmd1bWVudC4gIFBhc3NpbmcgXGNvZGV7Tm9uZX0gc2V0cyB0aGUKLWRlZmF1bHQgdXNhZ2Ugc3RyaW5nOyB1c2UgXGNvZGV7U1VQUFJFU1N7XF99VVNBR0V9IHRvIHN1cHByZXNzIGEgdXNhZ2UKLW1lc3NhZ2UuCi0KLVxpdGVtIHt9IAotXGNvZGV7ZW5hYmxle1xffWludGVyc3BlcnNlZHtcX31hcmdzKCl9LCBcY29kZXtkaXNhYmxle1xffWludGVyc3BlcnNlZHtcX31hcmdzKCl9Ci0KLUVuYWJsZS9kaXNhYmxlIHBvc2l0aW9uYWwgYXJndW1lbnRzIGludGVyc3BlcnNlZCB3aXRoIG9wdGlvbnMsIHNpbWlsYXIKLXRvIEdOVSBnZXRvcHQgKGVuYWJsZWQgYnkgZGVmYXVsdCkuICBGb3IgZXhhbXBsZSwgaWYgXGNvZGV7Ii1hIn0gYW5kCi1cY29kZXsiLWIifSBhcmUgYm90aCBzaW1wbGUgb3B0aW9ucyB0aGF0IHRha2Ugbm8gYXJndW1lbnRzLCBcbW9kdWxle29wdHBhcnNlfQotbm9ybWFsbHkgYWNjZXB0cyB0aGlzIHN5bnRheDoKLVxiZWdpbnt2ZXJiYXRpbX0KLXByb2cgLWEgYXJnMSAtYiBhcmcyCi1cZW5ke3ZlcmJhdGltfQotCi1hbmQgdHJlYXRzIGl0IGFzIGVxdWl2YWxlbnQgdG8KLVxiZWdpbnt2ZXJiYXRpbX0KLXByb2cgLWEgLWIgYXJnMSBhcmcyCi1cZW5ke3ZlcmJhdGltfQotCi1UbyBkaXNhYmxlIHRoaXMgZmVhdHVyZSwgY2FsbCBcY29kZXtkaXNhYmxle1xffWludGVyc3BlcnNlZHtcX31hcmdzKCl9LiAgVGhpcwotcmVzdG9yZXMgdHJhZGl0aW9uYWwgXFVOSVh7fSBzeW50YXgsIHdoZXJlIG9wdGlvbiBwYXJzaW5nIHN0b3BzIHdpdGggdGhlCi1maXJzdCBub24tb3B0aW9uIGFyZ3VtZW50LgotCi1caXRlbSB7fSAKLVxjb2Rle3NldHtcX31kZWZhdWx0cyhkZXN0PXZhbHVlLCAuLi4pfQotCi1TZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIHNldmVyYWwgb3B0aW9uIGRlc3RpbmF0aW9ucyBhdCBvbmNlLiAgVXNpbmcKLVxtZXRob2R7c2V0e1xffWRlZmF1bHRzKCl9IGlzIHRoZSBwcmVmZXJyZWQgd2F5IHRvIHNldCBkZWZhdWx0IHZhbHVlcyBmb3IKLW9wdGlvbnMsIHNpbmNlIG11bHRpcGxlIG9wdGlvbnMgY2FuIHNoYXJlIHRoZSBzYW1lIGRlc3RpbmF0aW9uLiAgRm9yCi1leGFtcGxlLCBpZiBzZXZlcmFsIGBgbW9kZScnIG9wdGlvbnMgYWxsIHNldCB0aGUgc2FtZSBkZXN0aW5hdGlvbiwgYW55Ci1vbmUgb2YgdGhlbSBjYW4gc2V0IHRoZSBkZWZhdWx0LCBhbmQgdGhlIGxhc3Qgb25lIHdpbnM6Ci1cYmVnaW57dmVyYmF0aW19Ci1wYXJzZXIuYWRkX29wdGlvbigiLS1hZHZhbmNlZCIsIGFjdGlvbj0ic3RvcmVfY29uc3QiLAotICAgICAgICAgICAgICAgICAgZGVzdD0ibW9kZSIsIGNvbnN0PSJhZHZhbmNlZCIsCi0gICAgICAgICAgICAgICAgICBkZWZhdWx0PSJub3ZpY2UiKSAgICAjIG92ZXJyaWRkZW4gYmVsb3cKLXBhcnNlci5hZGRfb3B0aW9uKCItLW5vdmljZSIsIGFjdGlvbj0ic3RvcmVfY29uc3QiLAotICAgICAgICAgICAgICAgICAgZGVzdD0ibW9kZSIsIGNvbnN0PSJub3ZpY2UiLAotICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iYWR2YW5jZWQiKSAgIyBvdmVycmlkZXMgYWJvdmUgc2V0dGluZwotXGVuZHt2ZXJiYXRpbX0KLQotVG8gYXZvaWQgdGhpcyBjb25mdXNpb24sIHVzZSBcbWV0aG9ke3NldHtcX31kZWZhdWx0cygpfToKLVxiZWdpbnt2ZXJiYXRpbX0KLXBhcnNlci5zZXRfZGVmYXVsdHMobW9kZT0iYWR2YW5jZWQiKQotcGFyc2VyLmFkZF9vcHRpb24oIi0tYWR2YW5jZWQiLCBhY3Rpb249InN0b3JlX2NvbnN0IiwKLSAgICAgICAgICAgICAgICAgIGRlc3Q9Im1vZGUiLCBjb25zdD0iYWR2YW5jZWQiKQotcGFyc2VyLmFkZF9vcHRpb24oIi0tbm92aWNlIiwgYWN0aW9uPSJzdG9yZV9jb25zdCIsCi0gICAgICAgICAgICAgICAgICBkZXN0PSJtb2RlIiwgY29uc3Q9Im5vdmljZSIpCi1cZW5ke3ZlcmJhdGltfQotCi1cZW5ke2l0ZW1pemV9Ci0lICRJZDogcmVmZXJlbmNlLnR4dCA1MTkgMjAwNi0wNi0xMSAxNDozOToxMVogZ3dhcmQgJCAKLQotCi1cc3Vic2VjdGlvbntPcHRpb24gQ2FsbGJhY2tzXGxhYmVse29wdHBhcnNlLW9wdGlvbi1jYWxsYmFja3N9fQotCi1XaGVuIFxtb2R1bGV7b3B0cGFyc2V9J3MgYnVpbHQtaW4gYWN0aW9ucyBhbmQgdHlwZXMgYXJlbid0IHF1aXRlIGVub3VnaCBmb3IgeW91cgotbmVlZHMsIHlvdSBoYXZlIHR3byBjaG9pY2VzOiBleHRlbmQgXG1vZHVsZXtvcHRwYXJzZX0gb3IgZGVmaW5lIGEgY2FsbGJhY2sgb3B0aW9uLgotRXh0ZW5kaW5nIFxtb2R1bGV7b3B0cGFyc2V9IGlzIG1vcmUgZ2VuZXJhbCwgYnV0IG92ZXJraWxsIGZvciBhIGxvdCBvZiBzaW1wbGUKLWNhc2VzLiAgUXVpdGUgb2Z0ZW4gYSBzaW1wbGUgY2FsbGJhY2sgaXMgYWxsIHlvdSBuZWVkLgotCi1UaGVyZSBhcmUgdHdvIHN0ZXBzIHRvIGRlZmluaW5nIGEgY2FsbGJhY2sgb3B0aW9uOgotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSB7fSAKLWRlZmluZSB0aGUgb3B0aW9uIGl0c2VsZiB1c2luZyB0aGUgXGNvZGV7Y2FsbGJhY2t9IGFjdGlvbgotCi1caXRlbSB7fSAKLXdyaXRlIHRoZSBjYWxsYmFjazsgdGhpcyBpcyBhIGZ1bmN0aW9uIChvciBtZXRob2QpIHRoYXQKLXRha2VzIGF0IGxlYXN0IGZvdXIgYXJndW1lbnRzLCBhcyBkZXNjcmliZWQgYmVsb3cKLQotXGVuZHtpdGVtaXplfQotCi0KLVxzdWJzdWJzZWN0aW9ue0RlZmluaW5nIGEgY2FsbGJhY2sgb3B0aW9uXGxhYmVse29wdHBhcnNlLWRlZmluaW5nLWNhbGxiYWNrLW9wdGlvbn19Ci0KLUFzIGFsd2F5cywgdGhlIGVhc2llc3Qgd2F5IHRvIGRlZmluZSBhIGNhbGxiYWNrIG9wdGlvbiBpcyBieSB1c2luZyB0aGUKLVxjb2Rle3BhcnNlci5hZGR7XF99b3B0aW9uKCl9IG1ldGhvZC4gIEFwYXJ0IGZyb20gXG1lbWJlcnthY3Rpb259LCB0aGUgb25seSBvcHRpb24KLWF0dHJpYnV0ZSB5b3UgbXVzdCBzcGVjaWZ5IGlzIFxjb2Rle2NhbGxiYWNrfSwgdGhlIGZ1bmN0aW9uIHRvIGNhbGw6Ci1cYmVnaW57dmVyYmF0aW19Ci1wYXJzZXIuYWRkX29wdGlvbigiLWMiLCBhY3Rpb249ImNhbGxiYWNrIiwgY2FsbGJhY2s9bXlfY2FsbGJhY2spCi1cZW5ke3ZlcmJhdGltfQotCi1cY29kZXtjYWxsYmFja30gaXMgYSBmdW5jdGlvbiAob3Igb3RoZXIgY2FsbGFibGUgb2JqZWN0KSwgc28geW91IG11c3QgaGF2ZQotYWxyZWFkeSBkZWZpbmVkIFxjb2Rle215e1xffWNhbGxiYWNrKCl9IHdoZW4geW91IGNyZWF0ZSB0aGlzIGNhbGxiYWNrIG9wdGlvbi4KLUluIHRoaXMgc2ltcGxlIGNhc2UsIFxtb2R1bGV7b3B0cGFyc2V9IGRvZXNuJ3QgZXZlbiBrbm93IGlmIFxwcm9ncmFtb3B0ey1jfSB0YWtlcyBhbnkKLWFyZ3VtZW50cywgd2hpY2ggdXN1YWxseSBtZWFucyB0aGF0IHRoZSBvcHRpb24gdGFrZXMgbm8gYXJndW1lbnRzey0tLX10aGUKLW1lcmUgcHJlc2VuY2Ugb2YgXHByb2dyYW1vcHR7LWN9IG9uIHRoZSBjb21tYW5kLWxpbmUgaXMgYWxsIGl0IG5lZWRzIHRvIGtub3cuICBJbgotc29tZSBjaXJjdW1zdGFuY2VzLCB0aG91Z2gsIHlvdSBtaWdodCB3YW50IHlvdXIgY2FsbGJhY2sgdG8gY29uc3VtZSBhbgotYXJiaXRyYXJ5IG51bWJlciBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzLiAgVGhpcyBpcyB3aGVyZSB3cml0aW5nCi1jYWxsYmFja3MgZ2V0cyB0cmlja3k7IGl0J3MgY292ZXJlZCBsYXRlciBpbiB0aGlzIHNlY3Rpb24uCi0KLVxtb2R1bGV7b3B0cGFyc2V9IGFsd2F5cyBwYXNzZXMgZm91ciBwYXJ0aWN1bGFyIGFyZ3VtZW50cyB0byB5b3VyIGNhbGxiYWNrLCBhbmQgaXQKLXdpbGwgb25seSBwYXNzIGFkZGl0aW9uYWwgYXJndW1lbnRzIGlmIHlvdSBzcGVjaWZ5IHRoZW0gdmlhCi1cY29kZXtjYWxsYmFja3tcX31hcmdzfSBhbmQgXGNvZGV7Y2FsbGJhY2t7XF99a3dhcmdzfS4gIFRodXMsIHRoZSBtaW5pbWFsIGNhbGxiYWNrCi1mdW5jdGlvbiBzaWduYXR1cmUgaXM6Ci1cYmVnaW57dmVyYmF0aW19Ci1kZWYgbXlfY2FsbGJhY2sob3B0aW9uLCBvcHQsIHZhbHVlLCBwYXJzZXIpOgotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGZvdXIgYXJndW1lbnRzIHRvIGEgY2FsbGJhY2sgYXJlIGRlc2NyaWJlZCBiZWxvdy4KLQotVGhlcmUgYXJlIHNldmVyYWwgb3RoZXIgb3B0aW9uIGF0dHJpYnV0ZXMgdGhhdCB5b3UgY2FuIHN1cHBseSB3aGVuIHlvdQotZGVmaW5lIGEgY2FsbGJhY2sgb3B0aW9uOgotXGJlZ2lue2Rlc2NyaXB0aW9ufQotXGl0ZW1bXG1lbWJlcnt0eXBlfV0KLWhhcyBpdHMgdXN1YWwgbWVhbmluZzogYXMgd2l0aCB0aGUgXGNvZGV7c3RvcmV9IG9yIFxjb2Rle2FwcGVuZH0gYWN0aW9ucywKLWl0IGluc3RydWN0cyBcbW9kdWxle29wdHBhcnNlfSB0byBjb25zdW1lIG9uZSBhcmd1bWVudCBhbmQgY29udmVydCBpdCB0bwotXG1lbWJlcnt0eXBlfS4gIFJhdGhlciB0aGFuIHN0b3JpbmcgdGhlIGNvbnZlcnRlZCB2YWx1ZShzKSBhbnl3aGVyZSwKLXRob3VnaCwgXG1vZHVsZXtvcHRwYXJzZX0gcGFzc2VzIGl0IHRvIHlvdXIgY2FsbGJhY2sgZnVuY3Rpb24uCi1caXRlbVtcY29kZXtuYXJnc31dCi1hbHNvIGhhcyBpdHMgdXN1YWwgbWVhbmluZzogaWYgaXQgaXMgc3VwcGxpZWQgYW5kIHtcdGV4dGdyZWF0ZXJ9IDEsIFxtb2R1bGV7b3B0cGFyc2V9IHdpbGwKLWNvbnN1bWUgXGNvZGV7bmFyZ3N9IGFyZ3VtZW50cywgZWFjaCBvZiB3aGljaCBtdXN0IGJlIGNvbnZlcnRpYmxlIHRvCi1cbWVtYmVye3R5cGV9LiAgSXQgdGhlbiBwYXNzZXMgYSB0dXBsZSBvZiBjb252ZXJ0ZWQgdmFsdWVzIHRvIHlvdXIKLWNhbGxiYWNrLgotXGl0ZW1bXGNvZGV7Y2FsbGJhY2t7XF99YXJnc31dCi1hIHR1cGxlIG9mIGV4dHJhIHBvc2l0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNhbGxiYWNrCi1caXRlbVtcY29kZXtjYWxsYmFja3tcX31rd2FyZ3N9XQotYSBkaWN0aW9uYXJ5IG9mIGV4dHJhIGtleXdvcmQgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNhbGxiYWNrCi1cZW5ke2Rlc2NyaXB0aW9ufQotCi0KLVxzdWJzdWJzZWN0aW9ue0hvdyBjYWxsYmFja3MgYXJlIGNhbGxlZFxsYWJlbHtvcHRwYXJzZS1ob3ctY2FsbGJhY2tzLWNhbGxlZH19Ci0KLUFsbCBjYWxsYmFja3MgYXJlIGNhbGxlZCBhcyBmb2xsb3dzOgotXGJlZ2lue3ZlcmJhdGltfQotZnVuYyhvcHRpb24sIG9wdF9zdHIsIHZhbHVlLCBwYXJzZXIsICphcmdzLCAqKmt3YXJncykKLVxlbmR7dmVyYmF0aW19Ci0KLXdoZXJlCi1cYmVnaW57ZGVzY3JpcHRpb259Ci1caXRlbVtcY29kZXtvcHRpb259XQotaXMgdGhlIE9wdGlvbiBpbnN0YW5jZSB0aGF0J3MgY2FsbGluZyB0aGUgY2FsbGJhY2sKLVxpdGVtW1xjb2Rle29wdHtcX31zdHJ9XQotaXMgdGhlIG9wdGlvbiBzdHJpbmcgc2VlbiBvbiB0aGUgY29tbWFuZC1saW5lIHRoYXQncyB0cmlnZ2VyaW5nIHRoZQotY2FsbGJhY2suICAoSWYgYW4gYWJicmV2aWF0ZWQgbG9uZyBvcHRpb24gd2FzIHVzZWQsIFxjb2Rle29wdHtcX31zdHJ9IHdpbGwKLWJlIHRoZSBmdWxsLCBjYW5vbmljYWwgb3B0aW9uIHN0cmluZ3stLS19ZS5nLiBpZiB0aGUgdXNlciBwdXRzCi1cY29kZXsiLXt9LWZvbyJ9IG9uIHRoZSBjb21tYW5kLWxpbmUgYXMgYW4gYWJicmV2aWF0aW9uIGZvcgotXGNvZGV7Ii17fS1mb29iYXIifSwgdGhlbiBcY29kZXtvcHR7XF99c3RyfSB3aWxsIGJlIFxjb2RleyIte30tZm9vYmFyIn0uKQotXGl0ZW1bXGNvZGV7dmFsdWV9XQotaXMgdGhlIGFyZ3VtZW50IHRvIHRoaXMgb3B0aW9uIHNlZW4gb24gdGhlIGNvbW1hbmQtbGluZS4gIFxtb2R1bGV7b3B0cGFyc2V9IHdpbGwKLW9ubHkgZXhwZWN0IGFuIGFyZ3VtZW50IGlmIFxtZW1iZXJ7dHlwZX0gaXMgc2V0OyB0aGUgdHlwZSBvZiBcY29kZXt2YWx1ZX0KLXdpbGwgYmUgdGhlIHR5cGUgaW1wbGllZCBieSB0aGUgb3B0aW9uJ3MgdHlwZS4gIElmIFxtZW1iZXJ7dHlwZX0gZm9yIHRoaXMKLW9wdGlvbiBpcyBcY29kZXtOb25lfSAobm8gYXJndW1lbnQgZXhwZWN0ZWQpLCB0aGVuIFxjb2Rle3ZhbHVlfSB3aWxsIGJlCi1cY29kZXtOb25lfS4gIElmIFxjb2Rle25hcmdzfSB7XHRleHRncmVhdGVyfSAxLCBcY29kZXt2YWx1ZX0gd2lsbCBiZSBhIHR1cGxlIG9mIHZhbHVlcyBvZgotdGhlIGFwcHJvcHJpYXRlIHR5cGUuCi1caXRlbVtcY29kZXtwYXJzZXJ9XQotaXMgdGhlIE9wdGlvblBhcnNlciBpbnN0YW5jZSBkcml2aW5nIHRoZSB3aG9sZSB0aGluZywgbWFpbmx5Ci11c2VmdWwgYmVjYXVzZSB5b3UgY2FuIGFjY2VzcyBzb21lIG90aGVyIGludGVyZXN0aW5nIGRhdGEgdGhyb3VnaAotaXRzIGluc3RhbmNlIGF0dHJpYnV0ZXM6Ci1cYmVnaW57ZGVzY3JpcHRpb259Ci1caXRlbVtcY29kZXtwYXJzZXIubGFyZ3N9XQotdGhlIGN1cnJlbnQgbGlzdCBvZiBsZWZ0b3ZlciBhcmd1bWVudHMsIGllLiBhcmd1bWVudHMgdGhhdCBoYXZlCi1iZWVuIGNvbnN1bWVkIGJ1dCBhcmUgbmVpdGhlciBvcHRpb25zIG5vciBvcHRpb24gYXJndW1lbnRzLgotRmVlbCBmcmVlIHRvIG1vZGlmeSBcY29kZXtwYXJzZXIubGFyZ3N9LCBlLmcuIGJ5IGFkZGluZyBtb3JlCi1hcmd1bWVudHMgdG8gaXQuICAoVGhpcyBsaXN0IHdpbGwgYmVjb21lIFxjb2Rle2FyZ3N9LCB0aGUgc2Vjb25kCi1yZXR1cm4gdmFsdWUgb2YgXG1ldGhvZHtwYXJzZXtcX31hcmdzKCl9LikKLVxpdGVtW1xjb2Rle3BhcnNlci5yYXJnc31dCi10aGUgY3VycmVudCBsaXN0IG9mIHJlbWFpbmluZyBhcmd1bWVudHMsIGllLiB3aXRoIFxjb2Rle29wdHtcX31zdHJ9IGFuZAotXGNvZGV7dmFsdWV9IChpZiBhcHBsaWNhYmxlKSByZW1vdmVkLCBhbmQgb25seSB0aGUgYXJndW1lbnRzCi1mb2xsb3dpbmcgdGhlbSBzdGlsbCB0aGVyZS4gIEZlZWwgZnJlZSB0byBtb2RpZnkKLVxjb2Rle3BhcnNlci5yYXJnc30sIGUuZy4gYnkgY29uc3VtaW5nIG1vcmUgYXJndW1lbnRzLgotXGl0ZW1bXGNvZGV7cGFyc2VyLnZhbHVlc31dCi10aGUgb2JqZWN0IHdoZXJlIG9wdGlvbiB2YWx1ZXMgYXJlIGJ5IGRlZmF1bHQgc3RvcmVkIChhbgotaW5zdGFuY2Ugb2Ygb3B0cGFyc2UuT3B0aW9uVmFsdWVzKS4gIFRoaXMgbGV0cyBjYWxsYmFja3MgdXNlIHRoZQotc2FtZSBtZWNoYW5pc20gYXMgdGhlIHJlc3Qgb2YgXG1vZHVsZXtvcHRwYXJzZX0gZm9yIHN0b3Jpbmcgb3B0aW9uIHZhbHVlczsKLXlvdSBkb24ndCBuZWVkIHRvIG1lc3MgYXJvdW5kIHdpdGggZ2xvYmFscyBvciBjbG9zdXJlcy4gIFlvdSBjYW4KLWFsc28gYWNjZXNzIG9yIG1vZGlmeSB0aGUgdmFsdWUocykgb2YgYW55IG9wdGlvbnMgYWxyZWFkeQotZW5jb3VudGVyZWQgb24gdGhlIGNvbW1hbmQtbGluZS4KLVxlbmR7ZGVzY3JpcHRpb259Ci1caXRlbVtcY29kZXthcmdzfV0KLWlzIGEgdHVwbGUgb2YgYXJiaXRyYXJ5IHBvc2l0aW9uYWwgYXJndW1lbnRzIHN1cHBsaWVkIHZpYSB0aGUKLVxjb2Rle2NhbGxiYWNre1xffWFyZ3N9IG9wdGlvbiBhdHRyaWJ1dGUuCi1caXRlbVtcY29kZXtrd2FyZ3N9XQotaXMgYSBkaWN0aW9uYXJ5IG9mIGFyYml0cmFyeSBrZXl3b3JkIGFyZ3VtZW50cyBzdXBwbGllZCB2aWEKLVxjb2Rle2NhbGxiYWNre1xffWt3YXJnc30uCi1cZW5ke2Rlc2NyaXB0aW9ufQotCi0KLVxzdWJzdWJzZWN0aW9ue1JhaXNpbmcgZXJyb3JzIGluIGEgY2FsbGJhY2tcbGFiZWx7b3B0cGFyc2UtcmFpc2luZy1lcnJvcnMtaW4tY2FsbGJhY2t9fQotCi1UaGUgY2FsbGJhY2sgZnVuY3Rpb24gc2hvdWxkIHJhaXNlIE9wdGlvblZhbHVlRXJyb3IgaWYgdGhlcmUgYXJlIGFueQotcHJvYmxlbXMgd2l0aCB0aGUgb3B0aW9uIG9yIGl0cyBhcmd1bWVudChzKS4gIFxtb2R1bGV7b3B0cGFyc2V9IGNhdGNoZXMgdGhpcyBhbmQKLXRlcm1pbmF0ZXMgdGhlIHByb2dyYW0sIHByaW50aW5nIHRoZSBlcnJvciBtZXNzYWdlIHlvdSBzdXBwbHkgdG8KLXN0ZGVyci4gIFlvdXIgbWVzc2FnZSBzaG91bGQgYmUgY2xlYXIsIGNvbmNpc2UsIGFjY3VyYXRlLCBhbmQgbWVudGlvbgotdGhlIG9wdGlvbiBhdCBmYXVsdC4gIE90aGVyd2lzZSwgdGhlIHVzZXIgd2lsbCBoYXZlIGEgaGFyZCB0aW1lCi1maWd1cmluZyBvdXQgd2hhdCBoZSBkaWQgd3JvbmcuCi0KLQotXHN1YnN1YnNlY3Rpb257Q2FsbGJhY2sgZXhhbXBsZSAxOiB0cml2aWFsIGNhbGxiYWNrXGxhYmVse29wdHBhcnNlLWNhbGxiYWNrLWV4YW1wbGUtMX19Ci0KLUhlcmUncyBhbiBleGFtcGxlIG9mIGEgY2FsbGJhY2sgb3B0aW9uIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzLCBhbmQKLXNpbXBseSByZWNvcmRzIHRoYXQgdGhlIG9wdGlvbiB3YXMgc2VlbjoKLVxiZWdpbnt2ZXJiYXRpbX0KLWRlZiByZWNvcmRfZm9vX3NlZW4ob3B0aW9uLCBvcHRfc3RyLCB2YWx1ZSwgcGFyc2VyKToKLSAgICBwYXJzZXIuc2F3X2ZvbyA9IFRydWUKLQotcGFyc2VyLmFkZF9vcHRpb24oIi0tZm9vIiwgYWN0aW9uPSJjYWxsYmFjayIsIGNhbGxiYWNrPXJlY29yZF9mb29fc2VlbikKLVxlbmR7dmVyYmF0aW19Ci0KLU9mIGNvdXJzZSwgeW91IGNvdWxkIGRvIHRoYXQgd2l0aCB0aGUgXGNvZGV7c3RvcmV7XF99dHJ1ZX0gYWN0aW9uLgotCi0KLVxzdWJzdWJzZWN0aW9ue0NhbGxiYWNrIGV4YW1wbGUgMjogY2hlY2sgb3B0aW9uIG9yZGVyXGxhYmVse29wdHBhcnNlLWNhbGxiYWNrLWV4YW1wbGUtMn19Ci0KLUhlcmUncyBhIHNsaWdodGx5IG1vcmUgaW50ZXJlc3RpbmcgZXhhbXBsZTogcmVjb3JkIHRoZSBmYWN0IHRoYXQKLVxjb2RleyItYSJ9IGlzIHNlZW4sIGJ1dCBibG93IHVwIGlmIGl0IGNvbWVzIGFmdGVyIFxjb2RleyItYiJ9IGluIHRoZQotY29tbWFuZC1saW5lLgotXGJlZ2lue3ZlcmJhdGltfQotZGVmIGNoZWNrX29yZGVyKG9wdGlvbiwgb3B0X3N0ciwgdmFsdWUsIHBhcnNlcik6Ci0gICAgaWYgcGFyc2VyLnZhbHVlcy5iOgotICAgICAgICByYWlzZSBPcHRpb25WYWx1ZUVycm9yKCJjYW4ndCB1c2UgLWEgYWZ0ZXIgLWIiKQotICAgIHBhcnNlci52YWx1ZXMuYSA9IDEKLVsuLi5dCi1wYXJzZXIuYWRkX29wdGlvbigiLWEiLCBhY3Rpb249ImNhbGxiYWNrIiwgY2FsbGJhY2s9Y2hlY2tfb3JkZXIpCi1wYXJzZXIuYWRkX29wdGlvbigiLWIiLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJiIikKLVxlbmR7dmVyYmF0aW19Ci0KLQotXHN1YnN1YnNlY3Rpb257Q2FsbGJhY2sgZXhhbXBsZSAzOiBjaGVjayBvcHRpb24gb3JkZXIgKGdlbmVyYWxpemVkKVxsYWJlbHtvcHRwYXJzZS1jYWxsYmFjay1leGFtcGxlLTN9fQotCi1JZiB5b3Ugd2FudCB0byByZS11c2UgdGhpcyBjYWxsYmFjayBmb3Igc2V2ZXJhbCBzaW1pbGFyIG9wdGlvbnMgKHNldCBhCi1mbGFnLCBidXQgYmxvdyB1cCBpZiBcY29kZXsiLWIifSBoYXMgYWxyZWFkeSBiZWVuIHNlZW4pLCBpdCBuZWVkcyBhIGJpdCBvZgotd29yazogdGhlIGVycm9yIG1lc3NhZ2UgYW5kIHRoZSBmbGFnIHRoYXQgaXQgc2V0cyBtdXN0IGJlCi1nZW5lcmFsaXplZC4KLVxiZWdpbnt2ZXJiYXRpbX0KLWRlZiBjaGVja19vcmRlcihvcHRpb24sIG9wdF9zdHIsIHZhbHVlLCBwYXJzZXIpOgotICAgIGlmIHBhcnNlci52YWx1ZXMuYjoKLSAgICAgICAgcmFpc2UgT3B0aW9uVmFsdWVFcnJvcigiY2FuJ3QgdXNlICVzIGFmdGVyIC1iIiAlIG9wdF9zdHIpCi0gICAgc2V0YXR0cihwYXJzZXIudmFsdWVzLCBvcHRpb24uZGVzdCwgMSkKLVsuLi5dCi1wYXJzZXIuYWRkX29wdGlvbigiLWEiLCBhY3Rpb249ImNhbGxiYWNrIiwgY2FsbGJhY2s9Y2hlY2tfb3JkZXIsIGRlc3Q9J2EnKQotcGFyc2VyLmFkZF9vcHRpb24oIi1iIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0iYiIpCi1wYXJzZXIuYWRkX29wdGlvbigiLWMiLCBhY3Rpb249ImNhbGxiYWNrIiwgY2FsbGJhY2s9Y2hlY2tfb3JkZXIsIGRlc3Q9J2MnKQotXGVuZHt2ZXJiYXRpbX0KLQotCi1cc3Vic3Vic2VjdGlvbntDYWxsYmFjayBleGFtcGxlIDQ6IGNoZWNrIGFyYml0cmFyeSBjb25kaXRpb25cbGFiZWx7b3B0cGFyc2UtY2FsbGJhY2stZXhhbXBsZS00fX0KLQotT2YgY291cnNlLCB5b3UgY291bGQgcHV0IGFueSBjb25kaXRpb24gaW4gdGhlcmV7LS0tfXlvdSdyZSBub3QgbGltaXRlZAotdG8gY2hlY2tpbmcgdGhlIHZhbHVlcyBvZiBhbHJlYWR5LWRlZmluZWQgb3B0aW9ucy4gIEZvciBleGFtcGxlLCBpZgoteW91IGhhdmUgb3B0aW9ucyB0aGF0IHNob3VsZCBub3QgYmUgY2FsbGVkIHdoZW4gdGhlIG1vb24gaXMgZnVsbCwgYWxsCi15b3UgaGF2ZSB0byBkbyBpcyB0aGlzOgotXGJlZ2lue3ZlcmJhdGltfQotZGVmIGNoZWNrX21vb24ob3B0aW9uLCBvcHRfc3RyLCB2YWx1ZSwgcGFyc2VyKToKLSAgICBpZiBpc19tb29uX2Z1bGwoKToKLSAgICAgICAgcmFpc2UgT3B0aW9uVmFsdWVFcnJvcigiJXMgb3B0aW9uIGludmFsaWQgd2hlbiBtb29uIGlzIGZ1bGwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSBvcHRfc3RyKQotICAgIHNldGF0dHIocGFyc2VyLnZhbHVlcywgb3B0aW9uLmRlc3QsIDEpCi1bLi4uXQotcGFyc2VyLmFkZF9vcHRpb24oIi0tZm9vIiwKLSAgICAgICAgICAgICAgICAgIGFjdGlvbj0iY2FsbGJhY2siLCBjYWxsYmFjaz1jaGVja19tb29uLCBkZXN0PSJmb28iKQotXGVuZHt2ZXJiYXRpbX0KLQotKFRoZSBkZWZpbml0aW9uIG9mIFxjb2Rle2lze1xffW1vb257XF99ZnVsbCgpfSBpcyBsZWZ0IGFzIGFuIGV4ZXJjaXNlIGZvciB0aGUKLXJlYWRlci4pCi0KLQotXHN1YnN1YnNlY3Rpb257Q2FsbGJhY2sgZXhhbXBsZSA1OiBmaXhlZCBhcmd1bWVudHNcbGFiZWx7b3B0cGFyc2UtY2FsbGJhY2stZXhhbXBsZS01fX0KLQotVGhpbmdzIGdldCBzbGlnaHRseSBtb3JlIGludGVyZXN0aW5nIHdoZW4geW91IGRlZmluZSBjYWxsYmFjayBvcHRpb25zCi10aGF0IHRha2UgYSBmaXhlZCBudW1iZXIgb2YgYXJndW1lbnRzLiAgU3BlY2lmeWluZyB0aGF0IGEgY2FsbGJhY2sKLW9wdGlvbiB0YWtlcyBhcmd1bWVudHMgaXMgc2ltaWxhciB0byBkZWZpbmluZyBhIFxjb2Rle3N0b3JlfSBvciBcY29kZXthcHBlbmR9Ci1vcHRpb246IGlmIHlvdSBkZWZpbmUgXG1lbWJlcnt0eXBlfSwgdGhlbiB0aGUgb3B0aW9uIHRha2VzIG9uZSBhcmd1bWVudCB0aGF0Ci1tdXN0IGJlIGNvbnZlcnRpYmxlIHRvIHRoYXQgdHlwZTsgaWYgeW91IGZ1cnRoZXIgZGVmaW5lIFxjb2Rle25hcmdzfSwgdGhlbgotdGhlIG9wdGlvbiB0YWtlcyBcY29kZXtuYXJnc30gYXJndW1lbnRzLgotCi1IZXJlJ3MgYW4gZXhhbXBsZSB0aGF0IGp1c3QgZW11bGF0ZXMgdGhlIHN0YW5kYXJkIFxjb2Rle3N0b3JlfSBhY3Rpb246Ci1cYmVnaW57dmVyYmF0aW19Ci1kZWYgc3RvcmVfdmFsdWUob3B0aW9uLCBvcHRfc3RyLCB2YWx1ZSwgcGFyc2VyKToKLSAgICBzZXRhdHRyKHBhcnNlci52YWx1ZXMsIG9wdGlvbi5kZXN0LCB2YWx1ZSkKLVsuLi5dCi1wYXJzZXIuYWRkX29wdGlvbigiLS1mb28iLAotICAgICAgICAgICAgICAgICAgYWN0aW9uPSJjYWxsYmFjayIsIGNhbGxiYWNrPXN0b3JlX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgdHlwZT0iaW50IiwgbmFyZ3M9MywgZGVzdD0iZm9vIikKLVxlbmR7dmVyYmF0aW19Ci0KLU5vdGUgdGhhdCBcbW9kdWxle29wdHBhcnNlfSB0YWtlcyBjYXJlIG9mIGNvbnN1bWluZyAzIGFyZ3VtZW50cyBhbmQgY29udmVydGluZyB0aGVtCi10byBpbnRlZ2VycyBmb3IgeW91OyBhbGwgeW91IGhhdmUgdG8gZG8gaXMgc3RvcmUgdGhlbS4gIChPciB3aGF0ZXZlcjsKLW9idmlvdXNseSB5b3UgZG9uJ3QgbmVlZCBhIGNhbGxiYWNrIGZvciB0aGlzIGV4YW1wbGUuKQotCi0KLVxzdWJzdWJzZWN0aW9ue0NhbGxiYWNrIGV4YW1wbGUgNjogdmFyaWFibGUgYXJndW1lbnRzXGxhYmVse29wdHBhcnNlLWNhbGxiYWNrLWV4YW1wbGUtNn19Ci0KLVRoaW5ncyBnZXQgaGFpcnkgd2hlbiB5b3Ugd2FudCBhbiBvcHRpb24gdG8gdGFrZSBhIHZhcmlhYmxlIG51bWJlciBvZgotYXJndW1lbnRzLiAgRm9yIHRoaXMgY2FzZSwgeW91IG11c3Qgd3JpdGUgYSBjYWxsYmFjaywgYXMgXG1vZHVsZXtvcHRwYXJzZX0gZG9lc24ndAotcHJvdmlkZSBhbnkgYnVpbHQtaW4gY2FwYWJpbGl0aWVzIGZvciBpdC4gIEFuZCB5b3UgaGF2ZSB0byBkZWFsIHdpdGgKLWNlcnRhaW4gaW50cmljYWNpZXMgb2YgY29udmVudGlvbmFsIFxVTklYe30gY29tbWFuZC1saW5lIHBhcnNpbmcgdGhhdCBcbW9kdWxle29wdHBhcnNlfQotbm9ybWFsbHkgaGFuZGxlcyBmb3IgeW91LiAgSW4gcGFydGljdWxhciwgY2FsbGJhY2tzIHNob3VsZCBpbXBsZW1lbnQKLXRoZSBjb252ZW50aW9uYWwgcnVsZXMgZm9yIGJhcmUgXGNvZGV7Ii17fS0ifSBhbmQgXGNvZGV7Ii0ifSBhcmd1bWVudHM6Ci1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtIHt9IAotZWl0aGVyIFxjb2RleyIte30tIn0gb3IgXGNvZGV7Ii0ifSBjYW4gYmUgb3B0aW9uIGFyZ3VtZW50cwotCi1caXRlbSB7fSAKLWJhcmUgXGNvZGV7Ii17fS0ifSAoaWYgbm90IHRoZSBhcmd1bWVudCB0byBzb21lIG9wdGlvbik6IGhhbHQgY29tbWFuZC1saW5lCi1wcm9jZXNzaW5nIGFuZCBkaXNjYXJkIHRoZSBcY29kZXsiLXt9LSJ9Ci0KLVxpdGVtIHt9IAotYmFyZSBcY29kZXsiLSJ9IChpZiBub3QgdGhlIGFyZ3VtZW50IHRvIHNvbWUgb3B0aW9uKTogaGFsdCBjb21tYW5kLWxpbmUKLXByb2Nlc3NpbmcgYnV0IGtlZXAgdGhlIFxjb2RleyItIn0gKGFwcGVuZCBpdCB0byBcY29kZXtwYXJzZXIubGFyZ3N9KQotCi1cZW5ke2l0ZW1pemV9Ci0KLUlmIHlvdSB3YW50IGFuIG9wdGlvbiB0aGF0IHRha2VzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cywgdGhlcmUKLWFyZSBzZXZlcmFsIHN1YnRsZSwgdHJpY2t5IGlzc3VlcyB0byB3b3JyeSBhYm91dC4gIFRoZSBleGFjdAotaW1wbGVtZW50YXRpb24geW91IGNob29zZSB3aWxsIGJlIGJhc2VkIG9uIHdoaWNoIHRyYWRlLW9mZnMgeW91J3JlCi13aWxsaW5nIHRvIG1ha2UgZm9yIHlvdXIgYXBwbGljYXRpb24gKHdoaWNoIGlzIHdoeSBcbW9kdWxle29wdHBhcnNlfSBkb2Vzbid0IHN1cHBvcnQKLXRoaXMgc29ydCBvZiB0aGluZyBkaXJlY3RseSkuCi0KLU5ldmVydGhlbGVzcywgaGVyZSdzIGEgc3RhYiBhdCBhIGNhbGxiYWNrIGZvciBhbiBvcHRpb24gd2l0aCB2YXJpYWJsZQotYXJndW1lbnRzOgotXGJlZ2lue3ZlcmJhdGltfQotZGVmIHZhcmFyZ19jYWxsYmFjayhvcHRpb24sIG9wdF9zdHIsIHZhbHVlLCBwYXJzZXIpOgotICAgIGFzc2VydCB2YWx1ZSBpcyBOb25lCi0gICAgZG9uZSA9IDAKLSAgICB2YWx1ZSA9IFtdCi0gICAgcmFyZ3MgPSBwYXJzZXIucmFyZ3MKLSAgICB3aGlsZSByYXJnczoKLSAgICAgICAgYXJnID0gcmFyZ3NbMF0KLQotICAgICAgICAjIFN0b3AgaWYgd2UgaGl0IGFuIGFyZyBsaWtlICItLWZvbyIsICItYSIsICItZngiLCAiLS1maWxlPWYiLAotICAgICAgICAjIGV0Yy4gIE5vdGUgdGhhdCB0aGlzIGFsc28gc3RvcHMgb24gIi0zIiBvciAiLTMuMCIsIHNvIGlmCi0gICAgICAgICMgeW91ciBvcHRpb24gdGFrZXMgbnVtZXJpYyB2YWx1ZXMsIHlvdSB3aWxsIG5lZWQgdG8gaGFuZGxlCi0gICAgICAgICMgdGhpcy4KLSAgICAgICAgaWYgKChhcmdbOjJdID09ICItLSIgYW5kIGxlbihhcmcpID4gMikgb3IKLSAgICAgICAgICAgIChhcmdbOjFdID09ICItIiBhbmQgbGVuKGFyZykgPiAxIGFuZCBhcmdbMV0gIT0gIi0iKSk6Ci0gICAgICAgICAgICBicmVhawotICAgICAgICBlbHNlOgotICAgICAgICAgICAgdmFsdWUuYXBwZW5kKGFyZykKLSAgICAgICAgICAgIGRlbCByYXJnc1swXQotCi0gICAgIHNldGF0dHIocGFyc2VyLnZhbHVlcywgb3B0aW9uLmRlc3QsIHZhbHVlKQotCi1bLi4uXQotcGFyc2VyLmFkZF9vcHRpb24oIi1jIiwgIi0tY2FsbGJhY2siLAotICAgICAgICAgICAgICAgICAgYWN0aW9uPSJjYWxsYmFjayIsIGNhbGxiYWNrPXZhcmFyZ3MpCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgbWFpbiB3ZWFrbmVzcyB3aXRoIHRoaXMgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbiBpcyB0aGF0IG5lZ2F0aXZlCi1udW1iZXJzIGluIHRoZSBhcmd1bWVudHMgZm9sbG93aW5nIFxjb2RleyItYyJ9IHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMKLWZ1cnRoZXIgb3B0aW9ucyAocHJvYmFibHkgY2F1c2luZyBhbiBlcnJvciksIHJhdGhlciB0aGFuIGFzIGFyZ3VtZW50cyB0bwotXGNvZGV7Ii1jIn0uICBGaXhpbmcgdGhpcyBpcyBsZWZ0IGFzIGFuIGV4ZXJjaXNlIGZvciB0aGUgcmVhZGVyLgotJSAkSWQ6IGNhbGxiYWNrcy50eHQgNDE1IDIwMDQtMDktMzAgMDI6MjY6MTdaIGdyZWcgJCAKLQotCi1cc3Vic2VjdGlvbntFeHRlbmRpbmcgXG1vZHVsZXtvcHRwYXJzZX1cbGFiZWx7b3B0cGFyc2UtZXh0ZW5kaW5nLW9wdHBhcnNlfX0KLQotU2luY2UgdGhlIHR3byBtYWpvciBjb250cm9sbGluZyBmYWN0b3JzIGluIGhvdyBcbW9kdWxle29wdHBhcnNlfSBpbnRlcnByZXRzCi1jb21tYW5kLWxpbmUgb3B0aW9ucyBhcmUgdGhlIGFjdGlvbiBhbmQgdHlwZSBvZiBlYWNoIG9wdGlvbiwgdGhlIG1vc3QKLWxpa2VseSBkaXJlY3Rpb24gb2YgZXh0ZW5zaW9uIGlzIHRvIGFkZCBuZXcgYWN0aW9ucyBhbmQgbmV3IHR5cGVzLgotCi0KLVxzdWJzdWJzZWN0aW9ue0FkZGluZyBuZXcgdHlwZXNcbGFiZWx7b3B0cGFyc2UtYWRkaW5nLW5ldy10eXBlc319Ci0KLVRvIGFkZCBuZXcgdHlwZXMsIHlvdSBuZWVkIHRvIGRlZmluZSB5b3VyIG93biBzdWJjbGFzcyBvZiBcbW9kdWxle29wdHBhcnNlfSdzIE9wdGlvbgotY2xhc3MuICBUaGlzIGNsYXNzIGhhcyBhIGNvdXBsZSBvZiBhdHRyaWJ1dGVzIHRoYXQgZGVmaW5lIFxtb2R1bGV7b3B0cGFyc2V9J3MgdHlwZXM6Ci1cbWVtYmVye1RZUEVTfSBhbmQgXG1lbWJlcntUWVBFe1xffUNIRUNLRVJ9LgotCi1cbWVtYmVye1RZUEVTfSBpcyBhIHR1cGxlIG9mIHR5cGUgbmFtZXM7IGluIHlvdXIgc3ViY2xhc3MsIHNpbXBseSBkZWZpbmUgYSBuZXcKLXR1cGxlIFxtZW1iZXJ7VFlQRVN9IHRoYXQgYnVpbGRzIG9uIHRoZSBzdGFuZGFyZCBvbmUuCi0KLVxtZW1iZXJ7VFlQRXtcX31DSEVDS0VSfSBpcyBhIGRpY3Rpb25hcnkgbWFwcGluZyB0eXBlIG5hbWVzIHRvIHR5cGUtY2hlY2tpbmcKLWZ1bmN0aW9ucy4gIEEgdHlwZS1jaGVja2luZyBmdW5jdGlvbiBoYXMgdGhlIGZvbGxvd2luZyBzaWduYXR1cmU6Ci1cYmVnaW57dmVyYmF0aW19Ci1kZWYgY2hlY2tfbXl0eXBlKG9wdGlvbiwgb3B0LCB2YWx1ZSkKLVxlbmR7dmVyYmF0aW19Ci0KLXdoZXJlIFxjb2Rle29wdGlvbn0gaXMgYW4gXGNsYXNze09wdGlvbn0gaW5zdGFuY2UsIFxjb2Rle29wdH0gaXMgYW4gb3B0aW9uIHN0cmluZwotKGUuZy4sIFxjb2RleyItZiJ9KSwgYW5kIFxjb2Rle3ZhbHVlfSBpcyB0aGUgc3RyaW5nIGZyb20gdGhlIGNvbW1hbmQgbGluZSB0aGF0Ci1tdXN0IGJlIGNoZWNrZWQgYW5kIGNvbnZlcnRlZCB0byB5b3VyIGRlc2lyZWQgdHlwZS4gIFxjb2Rle2NoZWNre1xffW15dHlwZSgpfQotc2hvdWxkIHJldHVybiBhbiBvYmplY3Qgb2YgdGhlIGh5cG90aGV0aWNhbCB0eXBlIFxjb2Rle215dHlwZX0uICBUaGUgdmFsdWUKLXJldHVybmVkIGJ5IGEgdHlwZS1jaGVja2luZyBmdW5jdGlvbiB3aWxsIHdpbmQgdXAgaW4gdGhlIE9wdGlvblZhbHVlcwotaW5zdGFuY2UgcmV0dXJuZWQgYnkgXG1ldGhvZHtPcHRpb25QYXJzZXIucGFyc2V7XF99YXJncygpfSwgb3IgYmUgcGFzc2VkIHRvIGEKLWNhbGxiYWNrIGFzIHRoZSBcY29kZXt2YWx1ZX0gcGFyYW1ldGVyLgotCi1Zb3VyIHR5cGUtY2hlY2tpbmcgZnVuY3Rpb24gc2hvdWxkIHJhaXNlIE9wdGlvblZhbHVlRXJyb3IgaWYgaXQKLWVuY291bnRlcnMgYW55IHByb2JsZW1zLiAgT3B0aW9uVmFsdWVFcnJvciB0YWtlcyBhIHNpbmdsZSBzdHJpbmcKLWFyZ3VtZW50LCB3aGljaCBpcyBwYXNzZWQgYXMtaXMgdG8gT3B0aW9uUGFyc2VyJ3MgXG1ldGhvZHtlcnJvcigpfSBtZXRob2QsCi13aGljaCBpbiB0dXJuIHByZXBlbmRzIHRoZSBwcm9ncmFtIG5hbWUgYW5kIHRoZSBzdHJpbmcgXGNvZGV7ImVycm9yOiJ9IGFuZAotcHJpbnRzIGV2ZXJ5dGhpbmcgdG8gc3RkZXJyIGJlZm9yZSB0ZXJtaW5hdGluZyB0aGUgcHJvY2Vzcy4KLQotSGVyZSdzIGEgc2lsbHkgZXhhbXBsZSB0aGF0IGRlbW9uc3RyYXRlcyBhZGRpbmcgYSBcY29kZXtjb21wbGV4fSBvcHRpb24KLXR5cGUgdG8gcGFyc2UgUHl0aG9uLXN0eWxlIGNvbXBsZXggbnVtYmVycyBvbiB0aGUgY29tbWFuZCBsaW5lLiAgKFRoaXMKLWlzIGV2ZW4gc2lsbGllciB0aGFuIGl0IHVzZWQgdG8gYmUsIGJlY2F1c2UgXG1vZHVsZXtvcHRwYXJzZX0gMS4zIGFkZGVkIGJ1aWx0LWluCi1zdXBwb3J0IGZvciBjb21wbGV4IG51bWJlcnMsIGJ1dCBuZXZlciBtaW5kLikKLQotRmlyc3QsIHRoZSBuZWNlc3NhcnkgaW1wb3J0czoKLVxiZWdpbnt2ZXJiYXRpbX0KLWZyb20gY29weSBpbXBvcnQgY29weQotZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uLCBPcHRpb25WYWx1ZUVycm9yCi1cZW5ke3ZlcmJhdGltfQotCi1Zb3UgbmVlZCB0byBkZWZpbmUgeW91ciB0eXBlLWNoZWNrZXIgZmlyc3QsIHNpbmNlIGl0J3MgcmVmZXJyZWQgdG8gbGF0ZXIKLShpbiB0aGUgXG1lbWJlcntUWVBFe1xffUNIRUNLRVJ9IGNsYXNzIGF0dHJpYnV0ZSBvZiB5b3VyIE9wdGlvbiBzdWJjbGFzcyk6Ci1cYmVnaW57dmVyYmF0aW19Ci1kZWYgY2hlY2tfY29tcGxleChvcHRpb24sIG9wdCwgdmFsdWUpOgotICAgIHRyeToKLSAgICAgICAgcmV0dXJuIGNvbXBsZXgodmFsdWUpCi0gICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgIHJhaXNlIE9wdGlvblZhbHVlRXJyb3IoCi0gICAgICAgICAgICAib3B0aW9uICVzOiBpbnZhbGlkIGNvbXBsZXggdmFsdWU6ICVyIiAlIChvcHQsIHZhbHVlKSkKLVxlbmR7dmVyYmF0aW19Ci0KLUZpbmFsbHksIHRoZSBPcHRpb24gc3ViY2xhc3M6Ci1cYmVnaW57dmVyYmF0aW19Ci1jbGFzcyBNeU9wdGlvbiAoT3B0aW9uKToKLSAgICBUWVBFUyA9IE9wdGlvbi5UWVBFUyArICgiY29tcGxleCIsKQotICAgIFRZUEVfQ0hFQ0tFUiA9IGNvcHkoT3B0aW9uLlRZUEVfQ0hFQ0tFUikKLSAgICBUWVBFX0NIRUNLRVJbImNvbXBsZXgiXSA9IGNoZWNrX2NvbXBsZXgKLVxlbmR7dmVyYmF0aW19Ci0KLShJZiB3ZSBkaWRuJ3QgbWFrZSBhIFxmdW5jdGlvbntjb3B5KCl9IG9mIFxtZW1iZXJ7T3B0aW9uLlRZUEV7XF99Q0hFQ0tFUn0sIHdlIHdvdWxkIGVuZAotdXAgbW9kaWZ5aW5nIHRoZSBcbWVtYmVye1RZUEV7XF99Q0hFQ0tFUn0gYXR0cmlidXRlIG9mIFxtb2R1bGV7b3B0cGFyc2V9J3MgT3B0aW9uIGNsYXNzLgotVGhpcyBiZWluZyBQeXRob24sIG5vdGhpbmcgc3RvcHMgeW91IGZyb20gZG9pbmcgdGhhdCBleGNlcHQgZ29vZCBtYW5uZXJzCi1hbmQgY29tbW9uIHNlbnNlLikKLQotVGhhdCdzIGl0ISAgTm93IHlvdSBjYW4gd3JpdGUgYSBzY3JpcHQgdGhhdCB1c2VzIHRoZSBuZXcgb3B0aW9uIHR5cGUKLWp1c3QgbGlrZSBhbnkgb3RoZXIgXG1vZHVsZXtvcHRwYXJzZX0tYmFzZWQgc2NyaXB0LCBleGNlcHQgeW91IGhhdmUgdG8gaW5zdHJ1Y3QgeW91cgotT3B0aW9uUGFyc2VyIHRvIHVzZSBNeU9wdGlvbiBpbnN0ZWFkIG9mIE9wdGlvbjoKLVxiZWdpbnt2ZXJiYXRpbX0KLXBhcnNlciA9IE9wdGlvblBhcnNlcihvcHRpb25fY2xhc3M9TXlPcHRpb24pCi1wYXJzZXIuYWRkX29wdGlvbigiLWMiLCB0eXBlPSJjb21wbGV4IikKLVxlbmR7dmVyYmF0aW19Ci0KLUFsdGVybmF0ZWx5LCB5b3UgY2FuIGJ1aWxkIHlvdXIgb3duIG9wdGlvbiBsaXN0IGFuZCBwYXNzIGl0IHRvCi1PcHRpb25QYXJzZXI7IGlmIHlvdSBkb24ndCB1c2UgXG1ldGhvZHthZGR7XF99b3B0aW9uKCl9IGluIHRoZSBhYm92ZSB3YXksIHlvdQotZG9uJ3QgbmVlZCB0byB0ZWxsIE9wdGlvblBhcnNlciB3aGljaCBvcHRpb24gY2xhc3MgdG8gdXNlOgotXGJlZ2lue3ZlcmJhdGltfQotb3B0aW9uX2xpc3QgPSBbTXlPcHRpb24oIi1jIiwgYWN0aW9uPSJzdG9yZSIsIHR5cGU9ImNvbXBsZXgiLCBkZXN0PSJjIildCi1wYXJzZXIgPSBPcHRpb25QYXJzZXIob3B0aW9uX2xpc3Q9b3B0aW9uX2xpc3QpCi1cZW5ke3ZlcmJhdGltfQotCi0KLVxzdWJzdWJzZWN0aW9ue0FkZGluZyBuZXcgYWN0aW9uc1xsYWJlbHtvcHRwYXJzZS1hZGRpbmctbmV3LWFjdGlvbnN9fQotCi1BZGRpbmcgbmV3IGFjdGlvbnMgaXMgYSBiaXQgdHJpY2tpZXIsIGJlY2F1c2UgeW91IGhhdmUgdG8gdW5kZXJzdGFuZAotdGhhdCBcbW9kdWxle29wdHBhcnNlfSBoYXMgYSBjb3VwbGUgb2YgY2xhc3NpZmljYXRpb25zIGZvciBhY3Rpb25zOgotXGJlZ2lue2Rlc2NyaXB0aW9ufQotXGl0ZW1bYGBzdG9yZScnIGFjdGlvbnNdCi1hY3Rpb25zIHRoYXQgcmVzdWx0IGluIFxtb2R1bGV7b3B0cGFyc2V9IHN0b3JpbmcgYSB2YWx1ZSB0byBhbiBhdHRyaWJ1dGUgb2YgdGhlCi1jdXJyZW50IE9wdGlvblZhbHVlcyBpbnN0YW5jZTsgdGhlc2Ugb3B0aW9ucyByZXF1aXJlIGEgXG1lbWJlcntkZXN0fQotYXR0cmlidXRlIHRvIGJlIHN1cHBsaWVkIHRvIHRoZSBPcHRpb24gY29uc3RydWN0b3IKLVxpdGVtW2BgdHlwZWQnJyBhY3Rpb25zXQotYWN0aW9ucyB0aGF0IHRha2UgYSB2YWx1ZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUgYW5kIGV4cGVjdCBpdCB0byBiZQotb2YgYSBjZXJ0YWluIHR5cGU7IG9yIHJhdGhlciwgYSBzdHJpbmcgdGhhdCBjYW4gYmUgY29udmVydGVkIHRvIGEKLWNlcnRhaW4gdHlwZS4gIFRoZXNlIG9wdGlvbnMgcmVxdWlyZSBhIFxtZW1iZXJ7dHlwZX0gYXR0cmlidXRlIHRvIHRoZQotT3B0aW9uIGNvbnN0cnVjdG9yLgotXGVuZHtkZXNjcmlwdGlvbn0KLQotVGhlc2UgYXJlIG92ZXJsYXBwaW5nIHNldHM6IHNvbWUgZGVmYXVsdCBgYHN0b3JlJycgYWN0aW9ucyBhcmUgXGNvZGV7c3RvcmV9LAotXGNvZGV7c3RvcmV7XF99Y29uc3R9LCBcY29kZXthcHBlbmR9LCBhbmQgXGNvZGV7Y291bnR9LCB3aGlsZSB0aGUgZGVmYXVsdCBgYHR5cGVkJycKLWFjdGlvbnMgYXJlIFxjb2Rle3N0b3JlfSwgXGNvZGV7YXBwZW5kfSwgYW5kIFxjb2Rle2NhbGxiYWNrfS4KLQotV2hlbiB5b3UgYWRkIGFuIGFjdGlvbiwgeW91IG5lZWQgdG8gY2F0ZWdvcml6ZSBpdCBieSBsaXN0aW5nIGl0IGluIGF0Ci1sZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjbGFzcyBhdHRyaWJ1dGVzIG9mIE9wdGlvbiAoYWxsIGFyZSBsaXN0cyBvZgotc3RyaW5ncyk6Ci1cYmVnaW57ZGVzY3JpcHRpb259Ci1caXRlbVtcbWVtYmVye0FDVElPTlN9XQotYWxsIGFjdGlvbnMgbXVzdCBiZSBsaXN0ZWQgaW4gQUNUSU9OUwotXGl0ZW1bXG1lbWJlcntTVE9SRXtcX31BQ1RJT05TfV0KLWBgc3RvcmUnJyBhY3Rpb25zIGFyZSBhZGRpdGlvbmFsbHkgbGlzdGVkIGhlcmUKLVxpdGVtW1xtZW1iZXJ7VFlQRUR7XF99QUNUSU9OU31dCi1gYHR5cGVkJycgYWN0aW9ucyBhcmUgYWRkaXRpb25hbGx5IGxpc3RlZCBoZXJlCi1caXRlbVtcY29kZXtBTFdBWVN7XF99VFlQRUR7XF99QUNUSU9OU31dCi1hY3Rpb25zIHRoYXQgYWx3YXlzIHRha2UgYSB0eXBlIChpLmUuIHdob3NlIG9wdGlvbnMgYWx3YXlzIHRha2UgYQotdmFsdWUpIGFyZSBhZGRpdGlvbmFsbHkgbGlzdGVkIGhlcmUuICBUaGUgb25seSBlZmZlY3Qgb2YgdGhpcyBpcwotdGhhdCBcbW9kdWxle29wdHBhcnNlfSBhc3NpZ25zIHRoZSBkZWZhdWx0IHR5cGUsIFxjb2Rle3N0cmluZ30sIHRvIG9wdGlvbnMgd2l0aCBubwotZXhwbGljaXQgdHlwZSB3aG9zZSBhY3Rpb24gaXMgbGlzdGVkIGluIFxjb2Rle0FMV0FZU3tcX31UWVBFRHtcX31BQ1RJT05TfS4KLVxlbmR7ZGVzY3JpcHRpb259Ci0KLUluIG9yZGVyIHRvIGFjdHVhbGx5IGltcGxlbWVudCB5b3VyIG5ldyBhY3Rpb24sIHlvdSBtdXN0IG92ZXJyaWRlCi1PcHRpb24ncyBcbWV0aG9ke3Rha2V7XF99YWN0aW9uKCl9IG1ldGhvZCBhbmQgYWRkIGEgY2FzZSB0aGF0IHJlY29nbml6ZXMgeW91cgotYWN0aW9uLgotCi1Gb3IgZXhhbXBsZSwgbGV0J3MgYWRkIGFuIFxjb2Rle2V4dGVuZH0gYWN0aW9uLiAgVGhpcyBpcyBzaW1pbGFyIHRvIHRoZQotc3RhbmRhcmQgXGNvZGV7YXBwZW5kfSBhY3Rpb24sIGJ1dCBpbnN0ZWFkIG9mIHRha2luZyBhIHNpbmdsZSB2YWx1ZSBmcm9tCi10aGUgY29tbWFuZC1saW5lIGFuZCBhcHBlbmRpbmcgaXQgdG8gYW4gZXhpc3RpbmcgbGlzdCwgXGNvZGV7ZXh0ZW5kfSB3aWxsCi10YWtlIG11bHRpcGxlIHZhbHVlcyBpbiBhIHNpbmdsZSBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nLCBhbmQgZXh0ZW5kIGFuCi1leGlzdGluZyBsaXN0IHdpdGggdGhlbS4gIFRoYXQgaXMsIGlmIFxjb2RleyIte30tbmFtZXMifSBpcyBhbiBcY29kZXtleHRlbmR9Ci1vcHRpb24gb2YgdHlwZSBcY29kZXtzdHJpbmd9LCB0aGUgY29tbWFuZCBsaW5lCi1cYmVnaW57dmVyYmF0aW19Ci0tLW5hbWVzPWZvbyxiYXIgLS1uYW1lcyBibGFoIC0tbmFtZXMgZGluZyxkb25nCi1cZW5ke3ZlcmJhdGltfQotCi13b3VsZCByZXN1bHQgaW4gYSBsaXN0Ci1cYmVnaW57dmVyYmF0aW19Ci1bImZvbyIsICJiYXIiLCAiYmxhaCIsICJkaW5nIiwgImRvbmciXQotXGVuZHt2ZXJiYXRpbX0KLQotQWdhaW4gd2UgZGVmaW5lIGEgc3ViY2xhc3Mgb2YgT3B0aW9uOgotXGJlZ2lue3ZlcmJhdGltfQotY2xhc3MgTXlPcHRpb24gKE9wdGlvbik6Ci0KLSAgICBBQ1RJT05TID0gT3B0aW9uLkFDVElPTlMgKyAoImV4dGVuZCIsKQotICAgIFNUT1JFX0FDVElPTlMgPSBPcHRpb24uU1RPUkVfQUNUSU9OUyArICgiZXh0ZW5kIiwpCi0gICAgVFlQRURfQUNUSU9OUyA9IE9wdGlvbi5UWVBFRF9BQ1RJT05TICsgKCJleHRlbmQiLCkKLSAgICBBTFdBWVNfVFlQRURfQUNUSU9OUyA9IE9wdGlvbi5BTFdBWVNfVFlQRURfQUNUSU9OUyArICgiZXh0ZW5kIiwpCi0KLSAgICBkZWYgdGFrZV9hY3Rpb24oc2VsZiwgYWN0aW9uLCBkZXN0LCBvcHQsIHZhbHVlLCB2YWx1ZXMsIHBhcnNlcik6Ci0gICAgICAgIGlmIGFjdGlvbiA9PSAiZXh0ZW5kIjoKLSAgICAgICAgICAgIGx2YWx1ZSA9IHZhbHVlLnNwbGl0KCIsIikKLSAgICAgICAgICAgIHZhbHVlcy5lbnN1cmVfdmFsdWUoZGVzdCwgW10pLmV4dGVuZChsdmFsdWUpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBPcHRpb24udGFrZV9hY3Rpb24oCi0gICAgICAgICAgICAgICAgc2VsZiwgYWN0aW9uLCBkZXN0LCBvcHQsIHZhbHVlLCB2YWx1ZXMsIHBhcnNlcikKLVxlbmR7dmVyYmF0aW19Ci0KLUZlYXR1cmVzIG9mIG5vdGU6Ci1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtIHt9IAotXGNvZGV7ZXh0ZW5kfSBib3RoIGV4cGVjdHMgYSB2YWx1ZSBvbiB0aGUgY29tbWFuZC1saW5lIGFuZCBzdG9yZXMgdGhhdAotdmFsdWUgc29tZXdoZXJlLCBzbyBpdCBnb2VzIGluIGJvdGggXG1lbWJlcntTVE9SRXtcX31BQ1RJT05TfSBhbmQKLVxtZW1iZXJ7VFlQRUR7XF99QUNUSU9OU30KLQotXGl0ZW0ge30gCi10byBlbnN1cmUgdGhhdCBcbW9kdWxle29wdHBhcnNlfSBhc3NpZ25zIHRoZSBkZWZhdWx0IHR5cGUgb2YgXGNvZGV7c3RyaW5nfSB0bwotXGNvZGV7ZXh0ZW5kfSBhY3Rpb25zLCB3ZSBwdXQgdGhlIFxjb2Rle2V4dGVuZH0gYWN0aW9uIGluCi1cY29kZXtBTFdBWVN7XF99VFlQRUR7XF99QUNUSU9OU30gYXMgd2VsbAotCi1caXRlbSB7fSAKLVxtZXRob2R7TXlPcHRpb24udGFrZXtcX31hY3Rpb24oKX0gaW1wbGVtZW50cyBqdXN0IHRoaXMgb25lIG5ldyBhY3Rpb24sIGFuZAotcGFzc2VzIGNvbnRyb2wgYmFjayB0byBcbWV0aG9ke09wdGlvbi50YWtle1xffWFjdGlvbigpfSBmb3IgdGhlIHN0YW5kYXJkCi1cbW9kdWxle29wdHBhcnNlfSBhY3Rpb25zCi0KLVxpdGVtIHt9IAotXGNvZGV7dmFsdWVzfSBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgb3B0cGFyc2V7XF99cGFyc2VyLlZhbHVlcyBjbGFzcywKLXdoaWNoIHByb3ZpZGVzIHRoZSB2ZXJ5IHVzZWZ1bCBcbWV0aG9ke2Vuc3VyZXtcX312YWx1ZSgpfSBtZXRob2QuCi1cbWV0aG9ke2Vuc3VyZXtcX312YWx1ZSgpfSBpcyBlc3NlbnRpYWxseSBcZnVuY3Rpb257Z2V0YXR0cigpfSB3aXRoIGEgc2FmZXR5IHZhbHZlOwotaXQgaXMgY2FsbGVkIGFzCi1cYmVnaW57dmVyYmF0aW19Ci12YWx1ZXMuZW5zdXJlX3ZhbHVlKGF0dHIsIHZhbHVlKQotXGVuZHt2ZXJiYXRpbX0KLQotSWYgdGhlIFxjb2Rle2F0dHJ9IGF0dHJpYnV0ZSBvZiBcY29kZXt2YWx1ZXN9IGRvZXNuJ3QgZXhpc3Qgb3IgaXMgTm9uZSwgdGhlbgotZW5zdXJle1xffXZhbHVlKCkgZmlyc3Qgc2V0cyBpdCB0byBcY29kZXt2YWx1ZX0sIGFuZCB0aGVuIHJldHVybnMgJ3ZhbHVlLgotVGhpcyBpcyB2ZXJ5IGhhbmR5IGZvciBhY3Rpb25zIGxpa2UgXGNvZGV7ZXh0ZW5kfSwgXGNvZGV7YXBwZW5kfSwgYW5kCi1cY29kZXtjb3VudH0sIGFsbCBvZiB3aGljaCBhY2N1bXVsYXRlIGRhdGEgaW4gYSB2YXJpYWJsZSBhbmQgZXhwZWN0IHRoYXQKLXZhcmlhYmxlIHRvIGJlIG9mIGEgY2VydGFpbiB0eXBlIChhIGxpc3QgZm9yIHRoZSBmaXJzdCB0d28sIGFuIGludGVnZXIKLWZvciB0aGUgbGF0dGVyKS4gIFVzaW5nIFxtZXRob2R7ZW5zdXJle1xffXZhbHVlKCl9IG1lYW5zIHRoYXQgc2NyaXB0cyB1c2luZwoteW91ciBhY3Rpb24gZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzZXR0aW5nIGEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlCi1vcHRpb24gZGVzdGluYXRpb25zIGluIHF1ZXN0aW9uOyB0aGV5IGNhbiBqdXN0IGxlYXZlIHRoZSBkZWZhdWx0IGFzCi1Ob25lIGFuZCBcbWV0aG9ke2Vuc3VyZXtcX312YWx1ZSgpfSB3aWxsIHRha2UgY2FyZSBvZiBnZXR0aW5nIGl0IHJpZ2h0IHdoZW4KLWl0J3MgbmVlZGVkLgotCi1cZW5ke2l0ZW1pemV9Ci0lICRJZDogZXh0ZW5kaW5nLnR4dCA1MTcgMjAwNi0wNi0xMCAxNjoxODoxMVogZ3dhcmQgJCAKLQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJvcy50ZXggYi9Eb2MvbGliL2xpYm9zLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI2ZTlmYS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYm9zLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDE5ODAgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtvc30gLS0tCi0gICAgICAgICBNaXNjZWxsYW5lb3VzIG9wZXJhdGluZyBzeXN0ZW0gaW50ZXJmYWNlc30KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e29zfQotXG1vZHVsZXN5bm9wc2lze01pc2NlbGxhbmVvdXMgb3BlcmF0aW5nIHN5c3RlbSBpbnRlcmZhY2VzLn0KLQotCi1UaGlzIG1vZHVsZSBwcm92aWRlcyBhIG1vcmUgcG9ydGFibGUgd2F5IG9mIHVzaW5nIG9wZXJhdGluZyBzeXN0ZW0KLWRlcGVuZGVudCBmdW5jdGlvbmFsaXR5IHRoYW4gaW1wb3J0aW5nIGEgb3BlcmF0aW5nIHN5c3RlbSBkZXBlbmRlbnQKLWJ1aWx0LWluIG1vZHVsZSBsaWtlIFxyZWZtb2R1bGV7cG9zaXh9IG9yIFxtb2R1bGV7bnR9LgotCi1UaGlzIG1vZHVsZSBzZWFyY2hlcyBmb3IgYW4gb3BlcmF0aW5nIHN5c3RlbSBkZXBlbmRlbnQgYnVpbHQtaW4gbW9kdWxlIGxpa2UKLVxtb2R1bGV7bWFjfSBvciBccmVmbW9kdWxle3Bvc2l4fSBhbmQgZXhwb3J0cyB0aGUgc2FtZSBmdW5jdGlvbnMgYW5kIGRhdGEKLWFzIGZvdW5kIHRoZXJlLiAgVGhlIGRlc2lnbiBvZiBhbGwgUHl0aG9uJ3MgYnVpbHQtaW4gb3BlcmF0aW5nIHN5c3RlbSBkZXBlbmRlbnQKLW1vZHVsZXMgaXMgc3VjaCB0aGF0IGFzIGxvbmcgYXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBpcyBhdmFpbGFibGUsCi1pdCB1c2VzIHRoZSBzYW1lIGludGVyZmFjZTsgZm9yIGV4YW1wbGUsIHRoZSBmdW5jdGlvbgotXGNvZGV7b3Muc3RhdChcdmFye3BhdGh9KX0gcmV0dXJucyBzdGF0IGluZm9ybWF0aW9uIGFib3V0IFx2YXJ7cGF0aH0gaW4KLXRoZSBzYW1lIGZvcm1hdCAod2hpY2ggaGFwcGVucyB0byBoYXZlIG9yaWdpbmF0ZWQgd2l0aCB0aGUKLVxQT1NJWHt9IGludGVyZmFjZSkuCi0KLUV4dGVuc2lvbnMgcGVjdWxpYXIgdG8gYSBwYXJ0aWN1bGFyIG9wZXJhdGluZyBzeXN0ZW0gYXJlIGFsc28KLWF2YWlsYWJsZSB0aHJvdWdoIHRoZSBcbW9kdWxle29zfSBtb2R1bGUsIGJ1dCB1c2luZyB0aGVtIGlzIG9mIGNvdXJzZSBhCi10aHJlYXQgdG8gcG9ydGFiaWxpdHkhCi0KLU5vdGUgdGhhdCBhZnRlciB0aGUgZmlyc3QgdGltZSBcbW9kdWxle29zfSBpcyBpbXBvcnRlZCwgdGhlcmUgaXMKLVxlbXBoe25vfSBwZXJmb3JtYW5jZSBwZW5hbHR5IGluIHVzaW5nIGZ1bmN0aW9ucyBmcm9tIFxtb2R1bGV7b3N9Ci1pbnN0ZWFkIG9mIGRpcmVjdGx5IGZyb20gdGhlIG9wZXJhdGluZyBzeXN0ZW0gZGVwZW5kZW50IGJ1aWx0LWluIG1vZHVsZSwKLXNvIHRoZXJlIHNob3VsZCBiZSBcZW1waHtub30gcmVhc29uIG5vdCB0byB1c2UgXG1vZHVsZXtvc30hCi0KLQotJSBGcmFuayBTdGFqYW5vIDxmc3RhamFub0B1ay5yZXNlYXJjaC5hdHQuY29tPiBjb21wbGFpbmVkIHRoYXQgaXQKLSUgd2Fzbid0IGNsZWFyIHRoYXQgdGhlIGVudHJpZXMgZGVzY3JpYmVkIGluIHRoZSBzdWJzZWN0aW9ucyB3ZXJlIGFsbAotJSBhdmFpbGFibGUgYXQgdGhlIG1vZHVsZSBsZXZlbCAobW9zdCB1c2VzIG9mIHN1YnNlY3Rpb25zIGFyZQotJSBkaWZmZXJlbnQpOyBJIHRoaW5rIHRoaXMgaXMgb25seSBhIHByb2JsZW0gZm9yIHRoZSBIVE1MIHZlcnNpb24sCi0lIHdoZXJlIHRoZSByZWxhdGlvbnNoaXAgbWF5IG5vdCBiZSBhcyBjbGVhci4KLSUKLVxpZmh0bWwKLVRoZSBcbW9kdWxle29zfSBtb2R1bGUgY29udGFpbnMgbWFueSBmdW5jdGlvbnMgYW5kIGRhdGEgdmFsdWVzLgotVGhlIGl0ZW1zIGJlbG93IGFuZCBpbiB0aGUgZm9sbG93aW5nIHN1Yi1zZWN0aW9ucyBhcmUgYWxsIGF2YWlsYWJsZQotZGlyZWN0bHkgZnJvbSB0aGUgXG1vZHVsZXtvc30gbW9kdWxlLgotXGZpCi0KLQotXGJlZ2lue2V4Y2Rlc2N9e2Vycm9yfQotVGhpcyBleGNlcHRpb24gaXMgcmFpc2VkIHdoZW4gYSBmdW5jdGlvbiByZXR1cm5zIGEgc3lzdGVtLXJlbGF0ZWQKLWVycm9yIChub3QgZm9yIGlsbGVnYWwgYXJndW1lbnQgdHlwZXMgb3Igb3RoZXIgaW5jaWRlbnRhbCBlcnJvcnMpLgotVGhpcyBpcyBhbHNvIGtub3duIGFzIHRoZSBidWlsdC1pbiBleGNlcHRpb24gXGV4Y2VwdGlvbntPU0Vycm9yfS4gIFRoZQotYWNjb21wYW55aW5nIHZhbHVlIGlzIGEgcGFpciBjb250YWluaW5nIHRoZSBudW1lcmljIGVycm9yIGNvZGUgZnJvbQotXGNkYXRhe2Vycm5vfSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgc3RyaW5nLCBhcyB3b3VsZCBiZSBwcmludGVkIGJ5IHRoZQotQyBmdW5jdGlvbiBcY2Z1bmN0aW9ue3BlcnJvcigpfS4gIFNlZSB0aGUgbW9kdWxlCi1ccmVmbW9kdWxle2Vycm5vfVxyZWZiaW1vZGluZGV4e2Vycm5vfSwgd2hpY2ggY29udGFpbnMgbmFtZXMgZm9yIHRoZQotZXJyb3IgY29kZXMgZGVmaW5lZCBieSB0aGUgdW5kZXJseWluZyBvcGVyYXRpbmcgc3lzdGVtLgotCi1XaGVuIGV4Y2VwdGlvbnMgYXJlIGNsYXNzZXMsIHRoaXMgZXhjZXB0aW9uIGNhcnJpZXMgdHdvIGF0dHJpYnV0ZXMsCi1cbWVtYmVye2Vycm5vfSBhbmQgXG1lbWJlcntzdHJlcnJvcn0uICBUaGUgZmlyc3QgaG9sZHMgdGhlIHZhbHVlIG9mCi10aGUgQyBcY2RhdGF7ZXJybm99IHZhcmlhYmxlLCBhbmQgdGhlIGxhdHRlciBob2xkcyB0aGUgY29ycmVzcG9uZGluZwotZXJyb3IgbWVzc2FnZSBmcm9tIFxjZnVuY3Rpb257c3RyZXJyb3IoKX0uICBGb3IgZXhjZXB0aW9ucyB0aGF0Ci1pbnZvbHZlIGEgZmlsZSBzeXN0ZW0gcGF0aCAoc3VjaCBhcyBcZnVuY3Rpb257Y2hkaXIoKX0gb3IKLVxmdW5jdGlvbnt1bmxpbmsoKX0pLCB0aGUgZXhjZXB0aW9uIGluc3RhbmNlIHdpbGwgY29udGFpbiBhIHRoaXJkCi1hdHRyaWJ1dGUsIFxtZW1iZXJ7ZmlsZW5hbWV9LCB3aGljaCBpcyB0aGUgZmlsZSBuYW1lIHBhc3NlZCB0byB0aGUKLWZ1bmN0aW9uLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e25hbWV9Ci1UaGUgbmFtZSBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBkZXBlbmRlbnQgbW9kdWxlIGltcG9ydGVkLiAgVGhlCi1mb2xsb3dpbmcgbmFtZXMgaGF2ZSBjdXJyZW50bHkgYmVlbiByZWdpc3RlcmVkOiBcY29kZXsncG9zaXgnfSwKLVxjb2RleydudCd9LCBcY29kZXsnbWFjJ30sIFxjb2RleydvczInfSwgXGNvZGV7J2NlJ30sCi1cY29kZXsnamF2YSd9LCBcY29kZXsncmlzY29zJ30uCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e3BhdGh9Ci1UaGUgY29ycmVzcG9uZGluZyBvcGVyYXRpbmcgc3lzdGVtIGRlcGVuZGVudCBzdGFuZGFyZCBtb2R1bGUgZm9yIHBhdGhuYW1lCi1vcGVyYXRpb25zLCBzdWNoIGFzIFxtb2R1bGV7cG9zaXhwYXRofSBvciBcbW9kdWxle21hY3BhdGh9LiAgVGh1cywKLWdpdmVuIHRoZSBwcm9wZXIgaW1wb3J0cywgXGNvZGV7b3MucGF0aC5zcGxpdChcdmFye2ZpbGV9KX0gaXMKLWVxdWl2YWxlbnQgdG8gYnV0IG1vcmUgcG9ydGFibGUgdGhhbgotXGNvZGV7cG9zaXhwYXRoLnNwbGl0KFx2YXJ7ZmlsZX0pfS4gIE5vdGUgdGhhdCB0aGlzIGlzIGFsc28gYW4KLWltcG9ydGFibGUgbW9kdWxlOiBpdCBtYXkgYmUgaW1wb3J0ZWQgZGlyZWN0bHkgYXMKLVxyZWZtb2R1bGV7b3MucGF0aH0uCi1cZW5ke2RhdGFkZXNjfQotCi0KLQotXHN1YnNlY3Rpb257UHJvY2VzcyBQYXJhbWV0ZXJzIFxsYWJlbHtvcy1wcm9jaW5mb319Ci0KLVRoZXNlIGZ1bmN0aW9ucyBhbmQgZGF0YSBpdGVtcyBwcm92aWRlIGluZm9ybWF0aW9uIGFuZCBvcGVyYXRlIG9uIHRoZQotY3VycmVudCBwcm9jZXNzIGFuZCB1c2VyLgotCi1cYmVnaW57ZGF0YWRlc2N9e2Vudmlyb259Ci1BIG1hcHBpbmcgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc3RyaW5nIGVudmlyb25tZW50LiBGb3IgZXhhbXBsZSwKLVxjb2Rle2Vudmlyb25bJ0hPTUUnXX0gaXMgdGhlIHBhdGhuYW1lIG9mIHlvdXIgaG9tZSBkaXJlY3RvcnkgKG9uIHNvbWUKLXBsYXRmb3JtcyksIGFuZCBpcyBlcXVpdmFsZW50IHRvIFxjb2Rle2dldGVudigiSE9NRSIpfSBpbiBDLgotCi1UaGlzIG1hcHBpbmcgaXMgY2FwdHVyZWQgdGhlIGZpcnN0IHRpbWUgdGhlIFxtb2R1bGV7b3N9IG1vZHVsZSBpcwotaW1wb3J0ZWQsIHR5cGljYWxseSBkdXJpbmcgUHl0aG9uIHN0YXJ0dXAgYXMgcGFydCBvZiBwcm9jZXNzaW5nCi1cZmlsZXtzaXRlLnB5fS4gIENoYW5nZXMgdG8gdGhlIGVudmlyb25tZW50IG1hZGUgYWZ0ZXIgdGhpcyB0aW1lIGFyZQotbm90IHJlZmxlY3RlZCBpbiBcY29kZXtvcy5lbnZpcm9ufSwgZXhjZXB0IGZvciBjaGFuZ2VzIG1hZGUgYnkgbW9kaWZ5aW5nCi1cY29kZXtvcy5lbnZpcm9ufSBkaXJlY3RseS4KLQotSWYgdGhlIHBsYXRmb3JtIHN1cHBvcnRzIHRoZSBcZnVuY3Rpb257cHV0ZW52KCl9IGZ1bmN0aW9uLCB0aGlzCi1tYXBwaW5nIG1heSBiZSB1c2VkIHRvIG1vZGlmeSB0aGUgZW52aXJvbm1lbnQgYXMgd2VsbCBhcyBxdWVyeSB0aGUKLWVudmlyb25tZW50LiAgXGZ1bmN0aW9ue3B1dGVudigpfSB3aWxsIGJlIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4KLXRoZSBtYXBwaW5nIGlzIG1vZGlmaWVkLgotXG5vdGV7Q2FsbGluZyBcZnVuY3Rpb257cHV0ZW52KCl9IGRpcmVjdGx5IGRvZXMgbm90IGNoYW5nZQotXGNvZGV7b3MuZW52aXJvbn0sIHNvIGl0J3MgYmV0dGVyIHRvIG1vZGlmeSBcY29kZXtvcy5lbnZpcm9ufS59Ci1cbm90ZXtPbiBzb21lIHBsYXRmb3JtcywgaW5jbHVkaW5nIEZyZWVCU0QgYW5kIE1hYyBPUyBYLCBzZXR0aW5nCi1cY29kZXtlbnZpcm9ufSBtYXkgY2F1c2UgbWVtb3J5IGxlYWtzLiAgUmVmZXIgdG8gdGhlIHN5c3RlbSBkb2N1bWVudGF0aW9uCi1mb3IgXGNmdW5jdGlvbntwdXRlbnYoKX0ufQotCi1JZiBcZnVuY3Rpb257cHV0ZW52KCl9IGlzIG5vdCBwcm92aWRlZCwgYSBtb2RpZmllZCBjb3B5IG9mIHRoaXMgbWFwcGluZyAKLW1heSBiZSBwYXNzZWQgdG8gdGhlIGFwcHJvcHJpYXRlIHByb2Nlc3MtY3JlYXRpb24gZnVuY3Rpb25zIHRvIGNhdXNlIAotY2hpbGQgcHJvY2Vzc2VzIHRvIHVzZSBhIG1vZGlmaWVkIGVudmlyb25tZW50LgotCi1JZiB0aGUgcGxhdGZvcm0gc3VwcG9ydHMgdGhlIFxmdW5jdGlvbnt1bnNldGVudigpfSBmdW5jdGlvbiwgeW91IGNhbiAKLWRlbGV0ZSBpdGVtcyBpbiB0aGlzIG1hcHBpbmcgdG8gdW5zZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzLgotXGZ1bmN0aW9ue3Vuc2V0ZW52KCl9IHdpbGwgYmUgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhbiBpdGVtIGlzCi1kZWxldGVkIGZyb20gXGNvZGV7b3MuZW52aXJvbn0uCi0KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY25pfXtjaGRpcn17cGF0aH0KLVxmdW5jbGluZW5pe2ZjaGRpcn17ZmR9Ci1cZnVuY2xpbmVuaXtnZXRjd2R9e30KLVRoZXNlIGZ1bmN0aW9ucyBhcmUgZGVzY3JpYmVkIGluIGBgRmlsZXMgYW5kIERpcmVjdG9yaWVzJycgKHNlY3Rpb24KLVxyZWZ7b3MtZmlsZS1kaXJ9KS4KLVxlbmR7ZnVuY2Rlc2NuaX0KLQotXGJlZ2lue2Z1bmNkZXNjfXtjdGVybWlkfXt9Ci1SZXR1cm4gdGhlIGZpbGVuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNvbnRyb2xsaW5nIHRlcm1pbmFsIG9mIHRoZQotcHJvY2Vzcy4KLUF2YWlsYWJpbGl0eTogXFVOSVguCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldGVnaWR9e30KLVJldHVybiB0aGUgZWZmZWN0aXZlIGdyb3VwIGlkIG9mIHRoZSBjdXJyZW50IHByb2Nlc3MuICBUaGlzCi1jb3JyZXNwb25kcyB0byB0aGUgYHNldCBpZCcgYml0IG9uIHRoZSBmaWxlIGJlaW5nIGV4ZWN1dGVkIGluIHRoZQotY3VycmVudCBwcm9jZXNzLgotQXZhaWxhYmlsaXR5OiBcVU5JWC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0ZXVpZH17fQotXGluZGV4e3VzZXIhZWZmZWN0aXZlIGlkfQotUmV0dXJuIHRoZSBjdXJyZW50IHByb2Nlc3MnIGVmZmVjdGl2ZSB1c2VyIGlkLgotQXZhaWxhYmlsaXR5OiBcVU5JWC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0Z2lkfXt9Ci1caW5kZXh7cHJvY2VzcyFncm91cH0KLVJldHVybiB0aGUgcmVhbCBncm91cCBpZCBvZiB0aGUgY3VycmVudCBwcm9jZXNzLgotQXZhaWxhYmlsaXR5OiBcVU5JWC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0Z3JvdXBzfXt9Ci1SZXR1cm4gbGlzdCBvZiBzdXBwbGVtZW50YWwgZ3JvdXAgaWRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudAotcHJvY2Vzcy4KLUF2YWlsYWJpbGl0eTogXFVOSVguCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldGxvZ2lufXt9Ci1SZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHVzZXIgbG9nZ2VkIGluIG9uIHRoZSBjb250cm9sbGluZyB0ZXJtaW5hbCBvZgotdGhlIHByb2Nlc3MuICBGb3IgbW9zdCBwdXJwb3NlcywgaXQgaXMgbW9yZSB1c2VmdWwgdG8gdXNlIHRoZQotZW52aXJvbm1lbnQgdmFyaWFibGUgXGVudnZhcntMT0dOQU1FfSB0byBmaW5kIG91dCB3aG8gdGhlIHVzZXIgaXMsCi1vciBcY29kZXtwd2QuZ2V0cHd1aWQob3MuZ2V0dWlkKCkpWzBdfSB0byBnZXQgdGhlIGxvZ2luIG5hbWUKLW9mIHRoZSBjdXJyZW50bHkgZWZmZWN0aXZlIHVzZXIgSUQuCi1BdmFpbGFiaWxpdHk6IFxVTklYLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRwZ2lkfXtwaWR9Ci1SZXR1cm4gdGhlIHByb2Nlc3MgZ3JvdXAgaWQgb2YgdGhlIHByb2Nlc3Mgd2l0aCBwcm9jZXNzIGlkIFx2YXJ7cGlkfS4KLUlmIFx2YXJ7cGlkfSBpcyAwLCB0aGUgcHJvY2VzcyBncm91cCBpZCBvZiB0aGUgY3VycmVudCBwcm9jZXNzIGlzCi1yZXR1cm5lZC4gQXZhaWxhYmlsaXR5OiBcVU5JWC4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRwZ3JwfXt9Ci1caW5kZXh7cHJvY2VzcyFncm91cH0KLVJldHVybiB0aGUgaWQgb2YgdGhlIGN1cnJlbnQgcHJvY2VzcyBncm91cC4KLUF2YWlsYWJpbGl0eTogXFVOSVguCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldHBpZH17fQotXGluZGV4e3Byb2Nlc3MhaWR9Ci1SZXR1cm4gdGhlIGN1cnJlbnQgcHJvY2VzcyBpZC4KLUF2YWlsYWJpbGl0eTogXFVOSVgsIFdpbmRvd3MuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldHBwaWR9e30KLVxpbmRleHtwcm9jZXNzIWlkIG9mIHBhcmVudH0KLVJldHVybiB0aGUgcGFyZW50J3MgcHJvY2VzcyBpZC4KLUF2YWlsYWJpbGl0eTogXFVOSVguCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldHVpZH17fQotXGluZGV4e3VzZXIhaWR9Ci1SZXR1cm4gdGhlIGN1cnJlbnQgcHJvY2VzcycgdXNlciBpZC4KLUF2YWlsYWJpbGl0eTogXFVOSVguCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldGVudn17dmFybmFtZVxvcHRpb25hbHssIHZhbHVlfX0KLVJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFx2YXJ7dmFybmFtZX0gaWYgaXQKLWV4aXN0cywgb3IgXHZhcnt2YWx1ZX0gaWYgaXQgZG9lc24ndC4gIFx2YXJ7dmFsdWV9IGRlZmF1bHRzIHRvCi1cY29kZXtOb25lfS4KLUF2YWlsYWJpbGl0eTogbW9zdCBmbGF2b3JzIG9mIFxVTklYLCBXaW5kb3dzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtwdXRlbnZ9e3Zhcm5hbWUsIHZhbHVlfQotXGluZGV4e2Vudmlyb25tZW50IHZhcmlhYmxlcyFzZXR0aW5nfQotU2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lZCBcdmFye3Zhcm5hbWV9IHRvIHRoZSBzdHJpbmcKLVx2YXJ7dmFsdWV9LiAgU3VjaCBjaGFuZ2VzIHRvIHRoZSBlbnZpcm9ubWVudCBhZmZlY3Qgc3VicHJvY2Vzc2VzCi1zdGFydGVkIHdpdGggXGZ1bmN0aW9ue29zLnN5c3RlbSgpfSwgXGZ1bmN0aW9ue3BvcGVuKCl9IG9yCi1cZnVuY3Rpb257Zm9yaygpfSBhbmQgXGZ1bmN0aW9ue2V4ZWN2KCl9LgotQXZhaWxhYmlsaXR5OiBtb3N0IGZsYXZvcnMgb2YgXFVOSVgsIFdpbmRvd3MuCi0KLVxub3Rle09uIHNvbWUgcGxhdGZvcm1zLCBpbmNsdWRpbmcgRnJlZUJTRCBhbmQgTWFjIE9TIFgsCi1zZXR0aW5nIFxjb2Rle2Vudmlyb259IG1heSBjYXVzZSBtZW1vcnkgbGVha3MuCi1SZWZlciB0byB0aGUgc3lzdGVtIGRvY3VtZW50YXRpb24gZm9yIHB1dGVudi59Ci0KLVdoZW4gXGZ1bmN0aW9ue3B1dGVudigpfSBpcwotc3VwcG9ydGVkLCBhc3NpZ25tZW50cyB0byBpdGVtcyBpbiBcY29kZXtvcy5lbnZpcm9ufSBhcmUgYXV0b21hdGljYWxseQotdHJhbnNsYXRlZCBpbnRvIGNvcnJlc3BvbmRpbmcgY2FsbHMgdG8gXGZ1bmN0aW9ue3B1dGVudigpfTsgaG93ZXZlciwKLWNhbGxzIHRvIFxmdW5jdGlvbntwdXRlbnYoKX0gZG9uJ3QgdXBkYXRlIFxjb2Rle29zLmVudmlyb259LCBzbyBpdCBpcwotYWN0dWFsbHkgcHJlZmVyYWJsZSB0byBhc3NpZ24gdG8gaXRlbXMgb2YgXGNvZGV7b3MuZW52aXJvbn0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NldGVnaWR9e2VnaWR9Ci1TZXQgdGhlIGN1cnJlbnQgcHJvY2VzcydzIGVmZmVjdGl2ZSBncm91cCBpZC4KLUF2YWlsYWJpbGl0eTogXFVOSVguCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NldGV1aWR9e2V1aWR9Ci1TZXQgdGhlIGN1cnJlbnQgcHJvY2VzcydzIGVmZmVjdGl2ZSB1c2VyIGlkLgotQXZhaWxhYmlsaXR5OiBcVU5JWC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c2V0Z2lkfXtnaWR9Ci1TZXQgdGhlIGN1cnJlbnQgcHJvY2VzcycgZ3JvdXAgaWQuCi1BdmFpbGFiaWxpdHk6IFxVTklYLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzZXRncm91cHN9e2dyb3Vwc30KLVNldCB0aGUgbGlzdCBvZiBzdXBwbGVtZW50YWwgZ3JvdXAgaWRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudAotcHJvY2VzcyB0byBcdmFye2dyb3Vwc30uIFx2YXJ7Z3JvdXBzfSBtdXN0IGJlIGEgc2VxdWVuY2UsIGFuZCBlYWNoCi1lbGVtZW50IG11c3QgYmUgYW4gaW50ZWdlciBpZGVudGlmeWluZyBhIGdyb3VwLiBUaGlzIG9wZXJhdGlvbiBpcwotdHlwaWNhbCBhdmFpbGFibGUgb25seSB0byB0aGUgc3VwZXJ1c2VyLgotQXZhaWxhYmlsaXR5OiBcVU5JWC4KLVx2ZXJzaW9uYWRkZWR7Mi4yfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzZXRwZ3JwfXt9Ci1DYWxscyB0aGUgc3lzdGVtIGNhbGwgXGNmdW5jdGlvbntzZXRwZ3JwKCl9IG9yIFxjZnVuY3Rpb257c2V0cGdycCgwLAotMCl9IGRlcGVuZGluZyBvbiB3aGljaCB2ZXJzaW9uIGlzIGltcGxlbWVudGVkIChpZiBhbnkpLiAgU2VlIHRoZQotXFVOSVh7fSBtYW51YWwgZm9yIHRoZSBzZW1hbnRpY3MuCi1BdmFpbGFiaWxpdHk6IFxVTklYLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzZXRwZ2lkfXtwaWQsIHBncnB9IENhbGxzIHRoZSBzeXN0ZW0gY2FsbAotXGNmdW5jdGlvbntzZXRwZ2lkKCl9IHRvIHNldCB0aGUgcHJvY2VzcyBncm91cCBpZCBvZiB0aGUgcHJvY2VzcyB3aXRoCi1pZCBcdmFye3BpZH0gdG8gdGhlIHByb2Nlc3MgZ3JvdXAgd2l0aCBpZCBcdmFye3BncnB9LiAgU2VlIHRoZSBcVU5JWHt9Ci1tYW51YWwgZm9yIHRoZSBzZW1hbnRpY3MuCi1BdmFpbGFiaWxpdHk6IFxVTklYLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzZXRyZXVpZH17cnVpZCwgZXVpZH0KLVNldCB0aGUgY3VycmVudCBwcm9jZXNzJ3MgcmVhbCBhbmQgZWZmZWN0aXZlIHVzZXIgaWRzLgotQXZhaWxhYmlsaXR5OiBcVU5JWC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c2V0cmVnaWR9e3JnaWQsIGVnaWR9Ci1TZXQgdGhlIGN1cnJlbnQgcHJvY2VzcydzIHJlYWwgYW5kIGVmZmVjdGl2ZSBncm91cCBpZHMuCi1BdmFpbGFiaWxpdHk6IFxVTklYLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRzaWR9e3BpZH0KLUNhbGxzIHRoZSBzeXN0ZW0gY2FsbCBcY2Z1bmN0aW9ue2dldHNpZCgpfS4gIFNlZSB0aGUgXFVOSVh7fSBtYW51YWwKLWZvciB0aGUgc2VtYW50aWNzLgotQXZhaWxhYmlsaXR5OiBcVU5JWC4gXHZlcnNpb25hZGRlZHsyLjR9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NldHNpZH17fQotQ2FsbHMgdGhlIHN5c3RlbSBjYWxsIFxjZnVuY3Rpb257c2V0c2lkKCl9LiAgU2VlIHRoZSBcVU5JWHt9IG1hbnVhbAotZm9yIHRoZSBzZW1hbnRpY3MuCi1BdmFpbGFiaWxpdHk6IFxVTklYLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzZXR1aWR9e3VpZH0KLVxpbmRleHt1c2VyIWlkLCBzZXR0aW5nfQotU2V0IHRoZSBjdXJyZW50IHByb2Nlc3MnIHVzZXIgaWQuCi1BdmFpbGFiaWxpdHk6IFxVTklYLgotXGVuZHtmdW5jZGVzY30KLQotJSBwbGFjZWQgaW4gdGhpcyBzZWN0aW9uIHNpbmNlIGl0IHJlbGF0ZXMgdG8gZXJybm8uLi4uIGEgbGl0dGxlIHdlYWsKLVxiZWdpbntmdW5jZGVzY317c3RyZXJyb3J9e2NvZGV9Ci1SZXR1cm4gdGhlIGVycm9yIG1lc3NhZ2UgY29ycmVzcG9uZGluZyB0byB0aGUgZXJyb3IgY29kZSBpbgotXHZhcntjb2RlfS4KLUF2YWlsYWJpbGl0eTogXFVOSVgsIFdpbmRvd3MuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3VtYXNrfXttYXNrfQotU2V0IHRoZSBjdXJyZW50IG51bWVyaWMgdW1hc2sgYW5kIHJldHVybnMgdGhlIHByZXZpb3VzIHVtYXNrLgotQXZhaWxhYmlsaXR5OiBcVU5JWCwgV2luZG93cy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dW5hbWV9e30KLVJldHVybiBhIDUtdHVwbGUgY29udGFpbmluZyBpbmZvcm1hdGlvbiBpZGVudGlmeWluZyB0aGUgY3VycmVudAotb3BlcmF0aW5nIHN5c3RlbS4gIFRoZSB0dXBsZSBjb250YWlucyA1IHN0cmluZ3M6Ci1cY29kZXsoXHZhcntzeXNuYW1lfSwgXHZhcntub2RlbmFtZX0sIFx2YXJ7cmVsZWFzZX0sIFx2YXJ7dmVyc2lvbn0sCi1cdmFye21hY2hpbmV9KX0uICBTb21lIHN5c3RlbXMgdHJ1bmNhdGUgdGhlIG5vZGVuYW1lIHRvIDgKLWNoYXJhY3RlcnMgb3IgdG8gdGhlIGxlYWRpbmcgY29tcG9uZW50OyBhIGJldHRlciB3YXkgdG8gZ2V0IHRoZQotaG9zdG5hbWUgaXMgXGZ1bmN0aW9ue3NvY2tldC5nZXRob3N0bmFtZSgpfQotXHdpdGhzdWJpdGVteyhpbiBtb2R1bGUgc29ja2V0KX17XHR0aW5kZXh7Z2V0aG9zdG5hbWUoKX19Ci1vciBldmVuCi1cd2l0aHN1Yml0ZW17KGluIG1vZHVsZSBzb2NrZXQpfXtcdHRpbmRleHtnZXRob3N0YnlhZGRyKCl9fQotXGNvZGV7c29ja2V0LmdldGhvc3RieWFkZHIoc29ja2V0LmdldGhvc3RuYW1lKCkpfS4KLUF2YWlsYWJpbGl0eTogcmVjZW50IGZsYXZvcnMgb2YgXFVOSVguCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3Vuc2V0ZW52fXt2YXJuYW1lfQotXGluZGV4e2Vudmlyb25tZW50IHZhcmlhYmxlcyFkZWxldGluZ30KLVVuc2V0IChkZWxldGUpIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lZCBcdmFye3Zhcm5hbWV9LiBTdWNoCi1jaGFuZ2VzIHRvIHRoZSBlbnZpcm9ubWVudCBhZmZlY3Qgc3VicHJvY2Vzc2VzIHN0YXJ0ZWQgd2l0aAotXGZ1bmN0aW9ue29zLnN5c3RlbSgpfSwgXGZ1bmN0aW9ue3BvcGVuKCl9IG9yIFxmdW5jdGlvbntmb3JrKCl9IGFuZAotXGZ1bmN0aW9ue2V4ZWN2KCl9LiBBdmFpbGFiaWxpdHk6IG1vc3QgZmxhdm9ycyBvZiBcVU5JWCwgV2luZG93cy4KLQotV2hlbiBcZnVuY3Rpb257dW5zZXRlbnYoKX0gaXMKLXN1cHBvcnRlZCwgZGVsZXRpb24gb2YgaXRlbXMgaW4gXGNvZGV7b3MuZW52aXJvbn0gaXMgYXV0b21hdGljYWxseQotdHJhbnNsYXRlZCBpbnRvIGEgY29ycmVzcG9uZGluZyBjYWxsIHRvIFxmdW5jdGlvbnt1bnNldGVudigpfTsgaG93ZXZlciwKLWNhbGxzIHRvIFxmdW5jdGlvbnt1bnNldGVudigpfSBkb24ndCB1cGRhdGUgXGNvZGV7b3MuZW52aXJvbn0sIHNvIGl0IGlzCi1hY3R1YWxseSBwcmVmZXJhYmxlIHRvIGRlbGV0ZSBpdGVtcyBvZiBcY29kZXtvcy5lbnZpcm9ufS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxzdWJzZWN0aW9ue0ZpbGUgT2JqZWN0IENyZWF0aW9uIFxsYWJlbHtvcy1uZXdzdHJlYW1zfX0KLQotVGhlc2UgZnVuY3Rpb25zIGNyZWF0ZSBuZXcgZmlsZSBvYmplY3RzLgotCi0KLVxiZWdpbntmdW5jZGVzY317ZmRvcGVufXtmZFxvcHRpb25hbHssIG1vZGVcb3B0aW9uYWx7LCBidWZzaXplfX19Ci1SZXR1cm4gYW4gb3BlbiBmaWxlIG9iamVjdCBjb25uZWN0ZWQgdG8gdGhlIGZpbGUgZGVzY3JpcHRvciBcdmFye2ZkfS4KLVxpbmRleHtJL08gY29udHJvbCFidWZmZXJpbmd9Ci1UaGUgXHZhcnttb2RlfSBhbmQgXHZhcntidWZzaXplfSBhcmd1bWVudHMgaGF2ZSB0aGUgc2FtZSBtZWFuaW5nIGFzCi10aGUgY29ycmVzcG9uZGluZyBhcmd1bWVudHMgdG8gdGhlIGJ1aWx0LWluIFxmdW5jdGlvbntvcGVuKCl9Ci1mdW5jdGlvbi4KLUF2YWlsYWJpbGl0eTogTWFjaW50b3NoLCBcVU5JWCwgV2luZG93cy4KLQotXHZlcnNpb25jaGFuZ2VkW1doZW4gc3BlY2lmaWVkLCB0aGUgXHZhcnttb2RlfSBhcmd1bWVudCBtdXN0IG5vdyBzdGFydAotICB3aXRoIG9uZSBvZiB0aGUgbGV0dGVycyBcY2hhcmFjdGVye3J9LCBcY2hhcmFjdGVye3d9LCBvciBcY2hhcmFjdGVye2F9LAotICBvdGhlcndpc2UgYSBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IGlzIHJhaXNlZF17Mi4zfQotXHZlcnNpb25jaGFuZ2VkW09uIFxVTklYLCB3aGVuIHRoZSBcdmFye21vZGV9IGFyZ3VtZW50IHN0YXJ0cyB3aXRoCi0gIFxjaGFyYWN0ZXJ7YX0sIHRoZSBcdmFye09fQVBQRU5EfSBmbGFnIGlzIHNldCBvbiB0aGUgZmlsZSBkZXNjcmlwdG9yCi0gICh3aGljaCB0aGUgXGNmdW5jdGlvbntmZG9wZW4oKX0gaW1wbGVtZW50YXRpb24gYWxyZWFkeSBkb2VzIG9uIG1vc3QKLSAgcGxhdGZvcm1zKV17Mi41fQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtwb3Blbn17Y29tbWFuZFxvcHRpb25hbHssIG1vZGVcb3B0aW9uYWx7LCBidWZzaXplfX19Ci1PcGVuIGEgcGlwZSB0byBvciBmcm9tIFx2YXJ7Y29tbWFuZH0uICBUaGUgcmV0dXJuIHZhbHVlIGlzIGFuIG9wZW4KLWZpbGUgb2JqZWN0IGNvbm5lY3RlZCB0byB0aGUgcGlwZSwgd2hpY2ggY2FuIGJlIHJlYWQgb3Igd3JpdHRlbgotZGVwZW5kaW5nIG9uIHdoZXRoZXIgXHZhcnttb2RlfSBpcyBcY29kZXsncid9IChkZWZhdWx0KSBvciBcY29kZXsndyd9LgotVGhlIFx2YXJ7YnVmc2l6ZX0gYXJndW1lbnQgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgdGhlIGNvcnJlc3BvbmRpbmcKLWFyZ3VtZW50IHRvIHRoZSBidWlsdC1pbiBcZnVuY3Rpb257b3BlbigpfSBmdW5jdGlvbi4gIFRoZSBleGl0IHN0YXR1cyBvZgotdGhlIGNvbW1hbmQgKGVuY29kZWQgaW4gdGhlIGZvcm1hdCBzcGVjaWZpZWQgZm9yIFxmdW5jdGlvbnt3YWl0KCl9KSBpcwotYXZhaWxhYmxlIGFzIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIFxtZXRob2R7Y2xvc2UoKX0gbWV0aG9kIG9mIHRoZSBmaWxlCi1vYmplY3QsIGV4Y2VwdCB0aGF0IHdoZW4gdGhlIGV4aXQgc3RhdHVzIGlzIHplcm8gKHRlcm1pbmF0aW9uIHdpdGhvdXQKLWVycm9ycyksIFxjb2Rle05vbmV9IGlzIHJldHVybmVkLgotQXZhaWxhYmlsaXR5OiBNYWNpbnRvc2gsIFxVTklYLCBXaW5kb3dzLgotCi1cZGVwcmVjYXRlZHsyLjZ9e1RoaXMgZnVuY3Rpb24gaXMgb2Jzb2xldGUuICBVc2UgdGhlCi0gICAgICAgICAgICAgICAgIFxtb2R1bGV7c3VicHJvY2Vzc30gbW9kdWxlLn0KLQotXHZlcnNpb25jaGFuZ2VkW1RoaXMgZnVuY3Rpb24gd29ya2VkIHVucmVsaWFibHkgdW5kZXIgV2luZG93cyBpbgotICBlYXJsaWVyIHZlcnNpb25zIG9mIFB5dGhvbi4gIFRoaXMgd2FzIGR1ZSB0byB0aGUgdXNlIG9mIHRoZQotICBcY2Z1bmN0aW9ue19wb3BlbigpfSBmdW5jdGlvbiBmcm9tIHRoZSBsaWJyYXJpZXMgcHJvdmlkZWQgd2l0aAotICBXaW5kb3dzLiAgTmV3ZXIgdmVyc2lvbnMgb2YgUHl0aG9uIGRvIG5vdCB1c2UgdGhlIGJyb2tlbgotICBpbXBsZW1lbnRhdGlvbiBmcm9tIHRoZSBXaW5kb3dzIGxpYnJhcmllc117Mi4wfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt0bXBmaWxlfXt9Ci1SZXR1cm4gYSBuZXcgZmlsZSBvYmplY3Qgb3BlbmVkIGluIHVwZGF0ZSBtb2RlIChcc2FtcHt3K2J9KS4gIFRoZSBmaWxlCi1oYXMgbm8gZGlyZWN0b3J5IGVudHJpZXMgYXNzb2NpYXRlZCB3aXRoIGl0IGFuZCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkKLWRlbGV0ZWQgb25jZSB0aGVyZSBhcmUgbm8gZmlsZSBkZXNjcmlwdG9ycyBmb3IgdGhlIGZpbGUuCi1BdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgXFVOSVgsIFdpbmRvd3MuCi1cZW5ke2Z1bmNkZXNjfQotCi0KLVxzdWJzZWN0aW9ue0ZpbGUgRGVzY3JpcHRvciBPcGVyYXRpb25zIFxsYWJlbHtvcy1mZC1vcHN9fQotCi1UaGVzZSBmdW5jdGlvbnMgb3BlcmF0ZSBvbiBJL08gc3RyZWFtcyByZWZlcmVuY2VkIHVzaW5nIGZpbGUKLWRlc2NyaXB0b3JzLiAgCi0KLUZpbGUgZGVzY3JpcHRvcnMgYXJlIHNtYWxsIGludGVnZXJzIGNvcnJlc3BvbmRpbmcgdG8gYSBmaWxlIHRoYXQgaGFzCi1iZWVuIG9wZW5lZCBieSB0aGUgY3VycmVudCBwcm9jZXNzLiAgRm9yIGV4YW1wbGUsIHN0YW5kYXJkIGlucHV0IGlzCi11c3VhbGx5IGZpbGUgZGVzY3JpcHRvciAwLCBzdGFuZGFyZCBvdXRwdXQgaXMgMSwgYW5kIHN0YW5kYXJkIGVycm9yIGlzCi0yLiAgRnVydGhlciBmaWxlcyBvcGVuZWQgYnkgYSBwcm9jZXNzIHdpbGwgdGhlbiBiZSBhc3NpZ25lZCAzLCA0LCA1LAotYW5kIHNvIGZvcnRoLiAgVGhlIG5hbWUgYGBmaWxlIGRlc2NyaXB0b3InJyBpcyBzbGlnaHRseSBkZWNlcHRpdmU7IG9uCi17XFVOSVh9IHBsYXRmb3Jtcywgc29ja2V0cyBhbmQgcGlwZXMgYXJlIGFsc28gcmVmZXJlbmNlZCBieSBmaWxlIGRlc2NyaXB0b3JzLgotCi0KLVxiZWdpbntmdW5jZGVzY317Y2xvc2V9e2ZkfQotQ2xvc2UgZmlsZSBkZXNjcmlwdG9yIFx2YXJ7ZmR9LgotQXZhaWxhYmlsaXR5OiBNYWNpbnRvc2gsIFxVTklYLCBXaW5kb3dzLgotCi1cYmVnaW57bm90aWNlfQotVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCBmb3IgbG93LWxldmVsIEkvTyBhbmQgbXVzdCBiZSBhcHBsaWVkCi10byBhIGZpbGUgZGVzY3JpcHRvciBhcyByZXR1cm5lZCBieSBcZnVuY3Rpb257b3BlbigpfSBvcgotXGZ1bmN0aW9ue3BpcGUoKX0uICBUbyBjbG9zZSBhIGBgZmlsZSBvYmplY3QnJyByZXR1cm5lZCBieSB0aGUKLWJ1aWx0LWluIGZ1bmN0aW9uIFxmdW5jdGlvbntvcGVuKCl9IG9yIGJ5IFxmdW5jdGlvbntwb3BlbigpfSBvcgotXGZ1bmN0aW9ue2Zkb3BlbigpfSwgdXNlIGl0cyBcbWV0aG9ke2Nsb3NlKCl9IG1ldGhvZC4KLVxlbmR7bm90aWNlfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtkdXB9e2ZkfQotUmV0dXJuIGEgZHVwbGljYXRlIG9mIGZpbGUgZGVzY3JpcHRvciBcdmFye2ZkfS4KLUF2YWlsYWJpbGl0eTogTWFjaW50b3NoLCBcVU5JWCwgV2luZG93cy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZHVwMn17ZmQsIGZkMn0KLUR1cGxpY2F0ZSBmaWxlIGRlc2NyaXB0b3IgXHZhcntmZH0gdG8gXHZhcntmZDJ9LCBjbG9zaW5nIHRoZSBsYXR0ZXIKLWZpcnN0IGlmIG5lY2Vzc2FyeS4KLUF2YWlsYWJpbGl0eTogTWFjaW50b3NoLCBcVU5JWCwgV2luZG93cy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZmRhdGFzeW5jfXtmZH0KLUZvcmNlIHdyaXRlIG9mIGZpbGUgd2l0aCBmaWxlZGVzY3JpcHRvciBcdmFye2ZkfSB0byBkaXNrLgotRG9lcyBub3QgZm9yY2UgdXBkYXRlIG9mIG1ldGFkYXRhLgotQXZhaWxhYmlsaXR5OiBcVU5JWC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZnBhdGhjb25mfXtmZCwgbmFtZX0KLVJldHVybiBzeXN0ZW0gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiByZWxldmFudCB0byBhbiBvcGVuIGZpbGUuCi1cdmFye25hbWV9IHNwZWNpZmllcyB0aGUgY29uZmlndXJhdGlvbiB2YWx1ZSB0byByZXRyaWV2ZTsgaXQgbWF5IGJlIGEKLXN0cmluZyB3aGljaCBpcyB0aGUgbmFtZSBvZiBhIGRlZmluZWQgc3lzdGVtIHZhbHVlOyB0aGVzZSBuYW1lcyBhcmUKLXNwZWNpZmllZCBpbiBhIG51bWJlciBvZiBzdGFuZGFyZHMgKFxQT1NJWC4xLCBcVU5JWHt9IDk1LCBcVU5JWHt9IDk4LCBhbmQKLW90aGVycykuICBTb21lIHBsYXRmb3JtcyBkZWZpbmUgYWRkaXRpb25hbCBuYW1lcyBhcyB3ZWxsLiAgVGhlIG5hbWVzCi1rbm93biB0byB0aGUgaG9zdCBvcGVyYXRpbmcgc3lzdGVtIGFyZSBnaXZlbiBpbiB0aGUKLVxjb2Rle3BhdGhjb25mX25hbWVzfSBkaWN0aW9uYXJ5LiAgRm9yIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIG5vdAotaW5jbHVkZWQgaW4gdGhhdCBtYXBwaW5nLCBwYXNzaW5nIGFuIGludGVnZXIgZm9yIFx2YXJ7bmFtZX0gaXMgYWxzbwotYWNjZXB0ZWQuCi1BdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgXFVOSVguCi0KLUlmIFx2YXJ7bmFtZX0gaXMgYSBzdHJpbmcgYW5kIGlzIG5vdCBrbm93biwgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSBpcwotcmFpc2VkLiAgSWYgYSBzcGVjaWZpYyB2YWx1ZSBmb3IgXHZhcntuYW1lfSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZQotaG9zdCBzeXN0ZW0sIGV2ZW4gaWYgaXQgaXMgaW5jbHVkZWQgaW4gXGNvZGV7cGF0aGNvbmZfbmFtZXN9LCBhbgotXGV4Y2VwdGlvbntPU0Vycm9yfSBpcyByYWlzZWQgd2l0aCBcY29uc3RhbnR7ZXJybm8uRUlOVkFMfSBmb3IgdGhlCi1lcnJvciBudW1iZXIuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2ZzdGF0fXtmZH0KLVJldHVybiBzdGF0dXMgZm9yIGZpbGUgZGVzY3JpcHRvciBcdmFye2ZkfSwgbGlrZSBcZnVuY3Rpb257c3RhdCgpfS4KLUF2YWlsYWJpbGl0eTogTWFjaW50b3NoLCBcVU5JWCwgV2luZG93cy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZnN0YXR2ZnN9e2ZkfQotUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmaWxlc3lzdGVtIGNvbnRhaW5pbmcgdGhlIGZpbGUgYXNzb2NpYXRlZAotd2l0aCBmaWxlIGRlc2NyaXB0b3IgXHZhcntmZH0sIGxpa2UgXGZ1bmN0aW9ue3N0YXR2ZnMoKX0uCi1BdmFpbGFiaWxpdHk6IFxVTklYLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtmc3luY317ZmR9Ci1Gb3JjZSB3cml0ZSBvZiBmaWxlIHdpdGggZmlsZWRlc2NyaXB0b3IgXHZhcntmZH0gdG8gZGlzay4gIE9uIFxVTklYLAotdGhpcyBjYWxscyB0aGUgbmF0aXZlIFxjZnVuY3Rpb257ZnN5bmMoKX0gZnVuY3Rpb247IG9uIFdpbmRvd3MsIHRoZQotTVMgXGNmdW5jdGlvbntfY29tbWl0KCl9IGZ1bmN0aW9uLgotCi1JZiB5b3UncmUgc3RhcnRpbmcgd2l0aCBhIFB5dGhvbiBmaWxlIG9iamVjdCBcdmFye2Z9LCBmaXJzdCBkbwotXGNvZGV7XHZhcntmfS5mbHVzaCgpfSwgYW5kIHRoZW4gZG8gXGNvZGV7b3MuZnN5bmMoXHZhcntmfS5maWxlbm8oKSl9LAotdG8gZW5zdXJlIHRoYXQgYWxsIGludGVybmFsIGJ1ZmZlcnMgYXNzb2NpYXRlZCB3aXRoIFx2YXJ7Zn0gYXJlIHdyaXR0ZW4KLXRvIGRpc2suCi1BdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgXFVOSVgsIGFuZCBXaW5kb3dzIHN0YXJ0aW5nIGluIDIuMi4zLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtmdHJ1bmNhdGV9e2ZkLCBsZW5ndGh9Ci1UcnVuY2F0ZSB0aGUgZmlsZSBjb3JyZXNwb25kaW5nIHRvIGZpbGUgZGVzY3JpcHRvciBcdmFye2ZkfSwKLXNvIHRoYXQgaXQgaXMgYXQgbW9zdCBcdmFye2xlbmd0aH0gYnl0ZXMgaW4gc2l6ZS4KLUF2YWlsYWJpbGl0eTogTWFjaW50b3NoLCBcVU5JWC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aXNhdHR5fXtmZH0KLVJldHVybiBcY29kZXtUcnVlfSBpZiB0aGUgZmlsZSBkZXNjcmlwdG9yIFx2YXJ7ZmR9IGlzIG9wZW4gYW5kCi1jb25uZWN0ZWQgdG8gYSB0dHkoLWxpa2UpIGRldmljZSwgZWxzZSBcY29kZXtGYWxzZX0uCi1BdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgXFVOSVguCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2xzZWVrfXtmZCwgcG9zLCBob3d9Ci1TZXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgZmlsZSBkZXNjcmlwdG9yIFx2YXJ7ZmR9IHRvIHBvc2l0aW9uCi1cdmFye3Bvc30sIG1vZGlmaWVkIGJ5IFx2YXJ7aG93fTogXGNvZGV7MH0gdG8gc2V0IHRoZSBwb3NpdGlvbgotcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZTsgXGNvZGV7MX0gdG8gc2V0IGl0IHJlbGF0aXZlIHRvCi10aGUgY3VycmVudCBwb3NpdGlvbjsgXGNvZGV7Mn0gdG8gc2V0IGl0IHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlCi1maWxlLgotQXZhaWxhYmlsaXR5OiBNYWNpbnRvc2gsIFxVTklYLCBXaW5kb3dzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtvcGVufXtmaWxlLCBmbGFnc1xvcHRpb25hbHssIG1vZGV9fQotT3BlbiB0aGUgZmlsZSBcdmFye2ZpbGV9IGFuZCBzZXQgdmFyaW91cyBmbGFncyBhY2NvcmRpbmcgdG8KLVx2YXJ7ZmxhZ3N9IGFuZCBwb3NzaWJseSBpdHMgbW9kZSBhY2NvcmRpbmcgdG8gXHZhcnttb2RlfS4KLVRoZSBkZWZhdWx0IFx2YXJ7bW9kZX0gaXMgXGNvZGV7MDc3N30gKG9jdGFsKSwgYW5kIHRoZSBjdXJyZW50IHVtYXNrCi12YWx1ZSBpcyBmaXJzdCBtYXNrZWQgb3V0LiAgUmV0dXJuIHRoZSBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSBuZXdseQotb3BlbmVkIGZpbGUuCi1BdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgXFVOSVgsIFdpbmRvd3MuCi0KLUZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBmbGFnIGFuZCBtb2RlIHZhbHVlcywgc2VlIHRoZSBDIHJ1bi10aW1lCi1kb2N1bWVudGF0aW9uOyBmbGFnIGNvbnN0YW50cyAobGlrZSBcY29uc3RhbnR7T19SRE9OTFl9IGFuZAotXGNvbnN0YW50e09fV1JPTkxZfSkgYXJlIGRlZmluZWQgaW4gdGhpcyBtb2R1bGUgdG9vIChzZWUgYmVsb3cpLgotCi1cYmVnaW57bm90aWNlfQotVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCBmb3IgbG93LWxldmVsIEkvTy4gIEZvciBub3JtYWwgdXNhZ2UsCi11c2UgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIFxmdW5jdGlvbntvcGVuKCl9LCB3aGljaCByZXR1cm5zIGEgYGBmaWxlCi1vYmplY3QnJyB3aXRoIFxtZXRob2R7cmVhZCgpfSBhbmQgXG1ldGhvZHt3cml0ZSgpfSBtZXRob2RzIChhbmQgbWFueQotbW9yZSkuICBUbyB3cmFwIGEgZmlsZSBkZXNjcmlwdG9yIGluIGEgYGBmaWxlIG9iamVjdCcnLCB1c2UKLVxmdW5jdGlvbntmZG9wZW4oKX0uCi1cZW5ke25vdGljZX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317b3BlbnB0eX17fQotT3BlbiBhIG5ldyBwc2V1ZG8tdGVybWluYWwgcGFpci4gUmV0dXJuIGEgcGFpciBvZiBmaWxlIGRlc2NyaXB0b3JzCi1cY29kZXsoXHZhcnttYXN0ZXJ9LCBcdmFye3NsYXZlfSl9IGZvciB0aGUgcHR5IGFuZCB0aGUgdHR5LAotcmVzcGVjdGl2ZWx5LiBGb3IgYSAoc2xpZ2h0bHkpIG1vcmUgcG9ydGFibGUgYXBwcm9hY2gsIHVzZSB0aGUKLVxyZWZtb2R1bGV7cHR5fVxyZWZzdG1vZGluZGV4e3B0eX0gbW9kdWxlLgotQXZhaWxhYmlsaXR5OiBNYWNpbnRvc2gsIFNvbWUgZmxhdm9ycyBvZiBcVU5JWC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cGlwZX17fQotQ3JlYXRlIGEgcGlwZS4gIFJldHVybiBhIHBhaXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBcY29kZXsoXHZhcntyfSwKLVx2YXJ7d30pfSB1c2FibGUgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcsIHJlc3BlY3RpdmVseS4KLUF2YWlsYWJpbGl0eTogTWFjaW50b3NoLCBcVU5JWCwgV2luZG93cy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cmVhZH17ZmQsIG59Ci1SZWFkIGF0IG1vc3QgXHZhcntufSBieXRlcyBmcm9tIGZpbGUgZGVzY3JpcHRvciBcdmFye2ZkfS4KLVJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSBieXRlcyByZWFkLiAgSWYgdGhlIGVuZCBvZiB0aGUgZmlsZQotcmVmZXJyZWQgdG8gYnkgXHZhcntmZH0gaGFzIGJlZW4gcmVhY2hlZCwgYW4gZW1wdHkgc3RyaW5nIGlzCi1yZXR1cm5lZC4KLUF2YWlsYWJpbGl0eTogTWFjaW50b3NoLCBcVU5JWCwgV2luZG93cy4KLQotXGJlZ2lue25vdGljZX0KLVRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgZm9yIGxvdy1sZXZlbCBJL08gYW5kIG11c3QgYmUgYXBwbGllZAotdG8gYSBmaWxlIGRlc2NyaXB0b3IgYXMgcmV0dXJuZWQgYnkgXGZ1bmN0aW9ue29wZW4oKX0gb3IKLVxmdW5jdGlvbntwaXBlKCl9LiAgVG8gcmVhZCBhIGBgZmlsZSBvYmplY3QnJyByZXR1cm5lZCBieSB0aGUKLWJ1aWx0LWluIGZ1bmN0aW9uIFxmdW5jdGlvbntvcGVuKCl9IG9yIGJ5IFxmdW5jdGlvbntwb3BlbigpfSBvcgotXGZ1bmN0aW9ue2Zkb3BlbigpfSwgb3IgXGNvZGV7c3lzLnN0ZGlufSwgdXNlIGl0cwotXG1ldGhvZHtyZWFkKCl9IG9yIFxtZXRob2R7cmVhZGxpbmUoKX0gbWV0aG9kcy4KLVxlbmR7bm90aWNlfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt0Y2dldHBncnB9e2ZkfQotUmV0dXJuIHRoZSBwcm9jZXNzIGdyb3VwIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGVybWluYWwgZ2l2ZW4gYnkKLVx2YXJ7ZmR9IChhbiBvcGVuIGZpbGUgZGVzY3JpcHRvciBhcyByZXR1cm5lZCBieSBcZnVuY3Rpb257b3BlbigpfSkuCi1BdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgXFVOSVguCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3Rjc2V0cGdycH17ZmQsIHBnfQotU2V0IHRoZSBwcm9jZXNzIGdyb3VwIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGVybWluYWwgZ2l2ZW4gYnkKLVx2YXJ7ZmR9IChhbiBvcGVuIGZpbGUgZGVzY3JpcHRvciBhcyByZXR1cm5lZCBieSBcZnVuY3Rpb257b3BlbigpfSkKLXRvIFx2YXJ7cGd9LgotQXZhaWxhYmlsaXR5OiBNYWNpbnRvc2gsIFxVTklYLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt0dHluYW1lfXtmZH0KLVJldHVybiBhIHN0cmluZyB3aGljaCBzcGVjaWZpZXMgdGhlIHRlcm1pbmFsIGRldmljZSBhc3NvY2lhdGVkIHdpdGgKLWZpbGUtZGVzY3JpcHRvciBcdmFye2ZkfS4gIElmIFx2YXJ7ZmR9IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSB0ZXJtaW5hbAotZGV2aWNlLCBhbiBleGNlcHRpb24gaXMgcmFpc2VkLgotQXZhaWxhYmlsaXR5Ok1hY2ludG9zaCwgIFxVTklYLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt3cml0ZX17ZmQsIHN0cn0KLVdyaXRlIHRoZSBzdHJpbmcgXHZhcntzdHJ9IHRvIGZpbGUgZGVzY3JpcHRvciBcdmFye2ZkfS4KLVJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4uCi1BdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgXFVOSVgsIFdpbmRvd3MuCi0KLVxiZWdpbntub3RpY2V9Ci1UaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIGZvciBsb3ctbGV2ZWwgSS9PIGFuZCBtdXN0IGJlIGFwcGxpZWQKLXRvIGEgZmlsZSBkZXNjcmlwdG9yIGFzIHJldHVybmVkIGJ5IFxmdW5jdGlvbntvcGVuKCl9IG9yCi1cZnVuY3Rpb257cGlwZSgpfS4gIFRvIHdyaXRlIGEgYGBmaWxlIG9iamVjdCcnIHJldHVybmVkIGJ5IHRoZQotYnVpbHQtaW4gZnVuY3Rpb24gXGZ1bmN0aW9ue29wZW4oKX0gb3IgYnkgXGZ1bmN0aW9ue3BvcGVuKCl9IG9yCi1cZnVuY3Rpb257ZmRvcGVuKCl9LCBvciBcY29kZXtzeXMuc3Rkb3V0fSBvciBcY29kZXtzeXMuc3RkZXJyfSwgdXNlCi1pdHMgXG1ldGhvZHt3cml0ZSgpfSBtZXRob2QuCi1cZW5ke25vdGljZX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotVGhlIGZvbGxvd2luZyBkYXRhIGl0ZW1zIGFyZSBhdmFpbGFibGUgZm9yIHVzZSBpbiBjb25zdHJ1Y3RpbmcgdGhlCi1cdmFye2ZsYWdzfSBwYXJhbWV0ZXIgdG8gdGhlIFxmdW5jdGlvbntvcGVuKCl9IGZ1bmN0aW9uLiAgU29tZSBpdGVtcyB3aWxsCi1ub3QgYmUgYXZhaWxhYmxlIG9uIGFsbCBwbGF0Zm9ybXMuICBGb3IgZGVzY3JpcHRpb25zIG9mIHRoZWlyIGF2YWlsYWJpbGl0eQotYW5kIHVzZSwgY29uc3VsdCBcbWFucGFnZXtvcGVufXsyfS4KLQotXGJlZ2lue2RhdGFkZXNjfXtPX1JET05MWX0KLVxkYXRhbGluZXtPX1dST05MWX0KLVxkYXRhbGluZXtPX1JEV1J9Ci1cZGF0YWxpbmV7T19BUFBFTkR9Ci1cZGF0YWxpbmV7T19DUkVBVH0KLVxkYXRhbGluZXtPX0VYQ0x9Ci1cZGF0YWxpbmV7T19UUlVOQ30KLU9wdGlvbnMgZm9yIHRoZSBcdmFye2ZsYWd9IGFyZ3VtZW50IHRvIHRoZSBcZnVuY3Rpb257b3BlbigpfSBmdW5jdGlvbi4KLVRoZXNlIGNhbiBiZSBiaXQtd2lzZSBPUidkIHRvZ2V0aGVyLgotQXZhaWxhYmlsaXR5OiBNYWNpbnRvc2gsIFxVTklYLCBXaW5kb3dzLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtPX0RTWU5DfQotXGRhdGFsaW5le09fUlNZTkN9Ci1cZGF0YWxpbmV7T19TWU5DfQotXGRhdGFsaW5le09fTkRFTEFZfQotXGRhdGFsaW5le09fTk9OQkxPQ0t9Ci1cZGF0YWxpbmV7T19OT0NUVFl9Ci1cZGF0YWxpbmV7T19TSExPQ0t9Ci1cZGF0YWxpbmV7T19FWExPQ0t9Ci1Nb3JlIG9wdGlvbnMgZm9yIHRoZSBcdmFye2ZsYWd9IGFyZ3VtZW50IHRvIHRoZSBcZnVuY3Rpb257b3BlbigpfSBmdW5jdGlvbi4KLUF2YWlsYWJpbGl0eTogTWFjaW50b3NoLCBcVU5JWC4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317T19CSU5BUll9Ci1PcHRpb24gZm9yIHRoZSBcdmFye2ZsYWd9IGFyZ3VtZW50IHRvIHRoZSBcZnVuY3Rpb257b3BlbigpfSBmdW5jdGlvbi4KLVRoaXMgY2FuIGJlIGJpdC13aXNlIE9SJ2QgdG9nZXRoZXIgd2l0aCB0aG9zZSBsaXN0ZWQgYWJvdmUuCi1BdmFpbGFiaWxpdHk6IFdpbmRvd3MuCi0lIFhYWCBuZWVkIHRvIGNoZWNrIG9uIHRoZSBhdmFpbGFiaWxpdHkgb2YgdGhpcyBvbmUuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e09fTk9JTkhFUklUfQotXGRhdGFsaW5le09fU0hPUlRfTElWRUR9Ci1cZGF0YWxpbmV7T19URU1QT1JBUll9Ci1cZGF0YWxpbmV7T19SQU5ET019Ci1cZGF0YWxpbmV7T19TRVFVRU5USUFMfQotXGRhdGFsaW5le09fVEVYVH0KLU9wdGlvbnMgZm9yIHRoZSBcdmFye2ZsYWd9IGFyZ3VtZW50IHRvIHRoZSBcZnVuY3Rpb257b3BlbigpfSBmdW5jdGlvbi4KLVRoZXNlIGNhbiBiZSBiaXQtd2lzZSBPUidkIHRvZ2V0aGVyLgotQXZhaWxhYmlsaXR5OiBXaW5kb3dzLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtTRUVLX1NFVH0KLVxkYXRhbGluZXtTRUVLX0NVUn0KLVxkYXRhbGluZXtTRUVLX0VORH0KLVBhcmFtZXRlcnMgdG8gdGhlIFxmdW5jdGlvbntsc2VlaygpfSBmdW5jdGlvbi4KLVRoZWlyIHZhbHVlcyBhcmUgMCwgMSwgYW5kIDIsIHJlc3BlY3RpdmVseS4KLUF2YWlsYWJpbGl0eTogV2luZG93cywgTWFjaW50b3NoLCBcVU5JWC4KLVx2ZXJzaW9uYWRkZWR7Mi41fQotXGVuZHtkYXRhZGVzY30KLQotXHN1YnNlY3Rpb257RmlsZXMgYW5kIERpcmVjdG9yaWVzIFxsYWJlbHtvcy1maWxlLWRpcn19Ci0KLVxiZWdpbntmdW5jZGVzY317YWNjZXNzfXtwYXRoLCBtb2RlfQotVXNlIHRoZSByZWFsIHVpZC9naWQgdG8gdGVzdCBmb3IgYWNjZXNzIHRvIFx2YXJ7cGF0aH0uICBOb3RlIHRoYXQgbW9zdAotb3BlcmF0aW9ucyB3aWxsIHVzZSB0aGUgZWZmZWN0aXZlIHVpZC9naWQsIHRoZXJlZm9yZSB0aGlzIHJvdXRpbmUgY2FuCi1iZSB1c2VkIGluIGEgc3VpZC9zZ2lkIGVudmlyb25tZW50IHRvIHRlc3QgaWYgdGhlIGludm9raW5nIHVzZXIgaGFzIHRoZQotc3BlY2lmaWVkIGFjY2VzcyB0byBcdmFye3BhdGh9LiAgXHZhcnttb2RlfSBzaG91bGQgYmUgXGNvbnN0YW50e0ZfT0t9Ci10byB0ZXN0IHRoZSBleGlzdGVuY2Ugb2YgXHZhcntwYXRofSwgb3IgaXQgY2FuIGJlIHRoZSBpbmNsdXNpdmUgT1Igb2YKLW9uZSBvciBtb3JlIG9mIFxjb25zdGFudHtSX09LfSwgXGNvbnN0YW50e1dfT0t9LCBhbmQgXGNvbnN0YW50e1hfT0t9IHRvCi10ZXN0IHBlcm1pc3Npb25zLiAgUmV0dXJuIFxjb25zdGFudHtUcnVlfSBpZiBhY2Nlc3MgaXMgYWxsb3dlZCwKLVxjb25zdGFudHtGYWxzZX0gaWYgbm90LgotU2VlIHRoZSBcVU5JWHt9IG1hbiBwYWdlIFxtYW5wYWdle2FjY2Vzc317Mn0gZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1BdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgXFVOSVgsIFdpbmRvd3MuCi0KLVxub3Rle1VzaW5nIFxmdW5jdGlvbnthY2Nlc3MoKX0gdG8gY2hlY2sgaWYgYSB1c2VyIGlzIGF1dGhvcml6ZWQgdG8gZS5nLgotb3BlbiBhIGZpbGUgYmVmb3JlIGFjdHVhbGx5IGRvaW5nIHNvIHVzaW5nIFxmdW5jdGlvbntvcGVuKCl9IGNyZWF0ZXMgYSAKLXNlY3VyaXR5IGhvbGUsIGJlY2F1c2UgdGhlIHVzZXIgbWlnaHQgZXhwbG9pdCB0aGUgc2hvcnQgdGltZSBpbnRlcnZhbCAKLWJldHdlZW4gY2hlY2tpbmcgYW5kIG9wZW5pbmcgdGhlIGZpbGUgdG8gbWFuaXB1bGF0ZSBpdC59Ci0KLVxub3Rle0kvTyBvcGVyYXRpb25zIG1heSBmYWlsIGV2ZW4gd2hlbiBcZnVuY3Rpb257YWNjZXNzKCl9Ci1pbmRpY2F0ZXMgdGhhdCB0aGV5IHdvdWxkIHN1Y2NlZWQsIHBhcnRpY3VsYXJseSBmb3Igb3BlcmF0aW9ucwotb24gbmV0d29yayBmaWxlc3lzdGVtcyB3aGljaCBtYXkgaGF2ZSBwZXJtaXNzaW9ucyBzZW1hbnRpY3MKLWJleW9uZCB0aGUgdXN1YWwgXFBPU0lYe30gcGVybWlzc2lvbi1iaXQgbW9kZWwufQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtGX09LfQotICBWYWx1ZSB0byBwYXNzIGFzIHRoZSBcdmFye21vZGV9IHBhcmFtZXRlciBvZiBcZnVuY3Rpb257YWNjZXNzKCl9IHRvCi0gIHRlc3QgdGhlIGV4aXN0ZW5jZSBvZiBcdmFye3BhdGh9LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtSX09LfQotICBWYWx1ZSB0byBpbmNsdWRlIGluIHRoZSBcdmFye21vZGV9IHBhcmFtZXRlciBvZiBcZnVuY3Rpb257YWNjZXNzKCl9Ci0gIHRvIHRlc3QgdGhlIHJlYWRhYmlsaXR5IG9mIFx2YXJ7cGF0aH0uCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1dfT0t9Ci0gIFZhbHVlIHRvIGluY2x1ZGUgaW4gdGhlIFx2YXJ7bW9kZX0gcGFyYW1ldGVyIG9mIFxmdW5jdGlvbnthY2Nlc3MoKX0KLSAgdG8gdGVzdCB0aGUgd3JpdGFiaWxpdHkgb2YgXHZhcntwYXRofS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317WF9PS30KLSAgVmFsdWUgdG8gaW5jbHVkZSBpbiB0aGUgXHZhcnttb2RlfSBwYXJhbWV0ZXIgb2YgXGZ1bmN0aW9ue2FjY2VzcygpfQotICB0byBkZXRlcm1pbmUgaWYgXHZhcntwYXRofSBjYW4gYmUgZXhlY3V0ZWQuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2NoZGlyfXtwYXRofQotXGluZGV4e2RpcmVjdG9yeSFjaGFuZ2luZ30KLUNoYW5nZSB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSB0byBcdmFye3BhdGh9LgotQXZhaWxhYmlsaXR5OiBNYWNpbnRvc2gsIFxVTklYLCBXaW5kb3dzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtmY2hkaXJ9e2ZkfQotQ2hhbmdlIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSBkaXJlY3RvcnkgcmVwcmVzZW50ZWQgYnkKLXRoZSBmaWxlIGRlc2NyaXB0b3IgXHZhcntmZH0uICBUaGUgZGVzY3JpcHRvciBtdXN0IHJlZmVyIHRvIGFuIG9wZW5lZAotZGlyZWN0b3J5LCBub3QgYW4gb3BlbiBmaWxlLgotQXZhaWxhYmlsaXR5OiBcVU5JWC4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRjd2R9e30KLVJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCi1BdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgXFVOSVgsIFdpbmRvd3MuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldGN3ZHV9e30KLVJldHVybiBhIFVuaWNvZGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KLUF2YWlsYWJpbGl0eTogTWFjaW50b3NoLCBcVU5JWCwgV2luZG93cy4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtjaGZsYWdzfXtwYXRoLCBmbGFnc30KLVNldCB0aGUgZmxhZ3Mgb2YgXHZhcntwYXRofSB0byB0aGUgbnVtZXJpYyBcdmFye2ZsYWdzfS4KLVx2YXJ7ZmxhZ3N9IG1heSB0YWtlIGEgY29tYmluYXRpb24gKGJpdHdpc2UgT1IpIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzCi0oYXMgZGVmaW5lZCBpbiB0aGUgXG1vZHVsZXtzdGF0fSBtb2R1bGUpOgotXGJlZ2lue2l0ZW1pemV9Ci0gIFxpdGVtIFxjb2Rle1VGX05PRFVNUH0KLSAgXGl0ZW0gXGNvZGV7VUZfSU1NVVRBQkxFfQotICBcaXRlbSBcY29kZXtVRl9BUFBFTkR9Ci0gIFxpdGVtIFxjb2Rle1VGX09QQVFVRX0KLSAgXGl0ZW0gXGNvZGV7VUZfTk9VTkxJTkt9Ci0gIFxpdGVtIFxjb2Rle1NGX0FSQ0hJVkVEfQotICBcaXRlbSBcY29kZXtTRl9JTU1VVEFCTEV9Ci0gIFxpdGVtIFxjb2Rle1NGX0FQUEVORH0KLSAgXGl0ZW0gXGNvZGV7U0ZfTk9VTkxJTkt9Ci0gIFxpdGVtIFxjb2Rle1NGX1NOQVBTSE9UfQotXGVuZHtpdGVtaXplfQotQXZhaWxhYmlsaXR5OiBNYWNpbnRvc2gsIFxVTklYLgotXHZlcnNpb25hZGRlZHsyLjZ9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2Nocm9vdH17cGF0aH0KLUNoYW5nZSB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIGN1cnJlbnQgcHJvY2VzcyB0byBcdmFye3BhdGh9LgotQXZhaWxhYmlsaXR5OiBNYWNpbnRvc2gsIFxVTklYLgotXHZlcnNpb25hZGRlZHsyLjJ9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2NobW9kfXtwYXRoLCBtb2RlfQotQ2hhbmdlIHRoZSBtb2RlIG9mIFx2YXJ7cGF0aH0gdG8gdGhlIG51bWVyaWMgXHZhcnttb2RlfS4KLVx2YXJ7bW9kZX0gbWF5IHRha2Ugb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzCi0oYXMgZGVmaW5lZCBpbiB0aGUgXG1vZHVsZXtzdGF0fSBtb2R1bGUpIG9yIGJpdHdpc2Ugb3ItZWQKLWNvbWJpbmF0aW9ucyBvZiB0aGVtOgotXGJlZ2lue2l0ZW1pemV9Ci0gIFxpdGVtIFxjb2Rle1NfSVNVSUR9Ci0gIFxpdGVtIFxjb2Rle1NfSVNHSUR9Ci0gIFxpdGVtIFxjb2Rle1NfRU5GTVR9Ci0gIFxpdGVtIFxjb2Rle1NfSVNWVFh9Ci0gIFxpdGVtIFxjb2Rle1NfSVJFQUR9Ci0gIFxpdGVtIFxjb2Rle1NfSVdSSVRFfQotICBcaXRlbSBcY29kZXtTX0lFWEVDfQotICBcaXRlbSBcY29kZXtTX0lSV1hVfQotICBcaXRlbSBcY29kZXtTX0lSVVNSfQotICBcaXRlbSBcY29kZXtTX0lXVVNSfQotICBcaXRlbSBcY29kZXtTX0lYVVNSfQotICBcaXRlbSBcY29kZXtTX0lSV1hHfQotICBcaXRlbSBcY29kZXtTX0lSR1JQfQotICBcaXRlbSBcY29kZXtTX0lXR1JQfQotICBcaXRlbSBcY29kZXtTX0lYR1JQfQotICBcaXRlbSBcY29kZXtTX0lSV1hPfQotICBcaXRlbSBcY29kZXtTX0lST1RIfQotICBcaXRlbSBcY29kZXtTX0lXT1RIfQotICBcaXRlbSBcY29kZXtTX0lYT1RIfQotXGVuZHtpdGVtaXplfQotQXZhaWxhYmlsaXR5OiBNYWNpbnRvc2gsIFxVTklYLCBXaW5kb3dzLgotCi1cbm90ZXtBbHRob3VnaCBXaW5kb3dzIHN1cHBvcnRzIFxmdW5jdGlvbntjaG1vZCgpfSwgeW91IGNhbiBvbmx5IAotc2V0IHRoZSBmaWxlJ3MgcmVhZC1vbmx5IGZsYWcgd2l0aCBpdCAodmlhIHRoZSBcY29kZXtTX0lXUklURX0gCi1hbmQgXGNvZGV7U19JUkVBRH0gY29uc3RhbnRzIG9yIGEgY29ycmVzcG9uZGluZyBpbnRlZ2VyIHZhbHVlKS4gCi1BbGwgb3RoZXIgYml0cyBhcmUgaWdub3JlZC59Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2Nob3dufXtwYXRoLCB1aWQsIGdpZH0KLUNoYW5nZSB0aGUgb3duZXIgYW5kIGdyb3VwIGlkIG9mIFx2YXJ7cGF0aH0gdG8gdGhlIG51bWVyaWMgXHZhcnt1aWR9Ci1hbmQgXHZhcntnaWR9LiBUbyBsZWF2ZSBvbmUgb2YgdGhlIGlkcyB1bmNoYW5nZWQsIHNldCBpdCB0byAtMS4KLUF2YWlsYWJpbGl0eTogTWFjaW50b3NoLCBcVU5JWC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bGNoZmxhZ3N9e3BhdGgsIGZsYWdzfQotU2V0IHRoZSBmbGFncyBvZiBcdmFye3BhdGh9IHRvIHRoZSBudW1lcmljIFx2YXJ7ZmxhZ3N9LCBsaWtlCi1cZnVuY3Rpb257Y2hmbGFncygpfSwgYnV0IGRvIG5vdCBmb2xsb3cgc3ltYm9saWMgbGlua3MuCi1BdmFpbGFiaWxpdHk6IFxVTklYLgotXHZlcnNpb25hZGRlZHsyLjZ9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2xjaG93bn17cGF0aCwgdWlkLCBnaWR9Ci1DaGFuZ2UgdGhlIG93bmVyIGFuZCBncm91cCBpZCBvZiBcdmFye3BhdGh9IHRvIHRoZSBudW1lcmljIFx2YXJ7dWlkfQotYW5kIGdpZC4gVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBmb2xsb3cgc3ltYm9saWMgbGlua3MuCi1BdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgXFVOSVguCi1cdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bGlua317c3JjLCBkc3R9Ci1DcmVhdGUgYSBoYXJkIGxpbmsgcG9pbnRpbmcgdG8gXHZhcntzcmN9IG5hbWVkIFx2YXJ7ZHN0fS4KLUF2YWlsYWJpbGl0eTogTWFjaW50b3NoLCBcVU5JWC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bGlzdGRpcn17cGF0aH0KLVJldHVybiBhIGxpc3QgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgdGhlIGVudHJpZXMgaW4gdGhlIGRpcmVjdG9yeS4KLVRoZSBsaXN0IGlzIGluIGFyYml0cmFyeSBvcmRlci4gIEl0IGRvZXMgbm90IGluY2x1ZGUgdGhlIHNwZWNpYWwKLWVudHJpZXMgXGNvZGV7Jy4nfSBhbmQgXGNvZGV7Jy4uJ30gZXZlbiBpZiB0aGV5IGFyZSBwcmVzZW50IGluIHRoZQotZGlyZWN0b3J5LgotQXZhaWxhYmlsaXR5OiBNYWNpbnRvc2gsIFxVTklYLCBXaW5kb3dzLgotCi1cdmVyc2lvbmNoYW5nZWRbT24gV2luZG93cyBOVC8yay9YUCBhbmQgXFVOSVgsIGlmIFx2YXJ7cGF0aH0gaXMgYSBVbmljb2RlCi1vYmplY3QsIHRoZSByZXN1bHQgd2lsbCBiZSBhIGxpc3Qgb2YgVW5pY29kZSBvYmplY3RzXXsyLjN9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2xzdGF0fXtwYXRofQotTGlrZSBcZnVuY3Rpb257c3RhdCgpfSwgYnV0IGRvIG5vdCBmb2xsb3cgc3ltYm9saWMgbGlua3MuCi1BdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgXFVOSVguCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e21rZmlmb317cGF0aFxvcHRpb25hbHssIG1vZGV9fQotQ3JlYXRlIGEgRklGTyAoYSBuYW1lZCBwaXBlKSBuYW1lZCBcdmFye3BhdGh9IHdpdGggbnVtZXJpYyBtb2RlCi1cdmFye21vZGV9LiAgVGhlIGRlZmF1bHQgXHZhcnttb2RlfSBpcyBcY29kZXswNjY2fSAob2N0YWwpLiAgVGhlIGN1cnJlbnQKLXVtYXNrIHZhbHVlIGlzIGZpcnN0IG1hc2tlZCBvdXQgZnJvbSB0aGUgbW9kZS4KLUF2YWlsYWJpbGl0eTogTWFjaW50b3NoLCBcVU5JWC4KLQotRklGT3MgYXJlIHBpcGVzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGxpa2UgcmVndWxhciBmaWxlcy4gIEZJRk9zIGV4aXN0Ci11bnRpbCB0aGV5IGFyZSBkZWxldGVkIChmb3IgZXhhbXBsZSB3aXRoIFxmdW5jdGlvbntvcy51bmxpbmsoKX0pLgotR2VuZXJhbGx5LCBGSUZPcyBhcmUgdXNlZCBhcyByZW5kZXp2b3VzIGJldHdlZW4gYGBjbGllbnQnJyBhbmQKLWBgc2VydmVyJycgdHlwZSBwcm9jZXNzZXM6IHRoZSBzZXJ2ZXIgb3BlbnMgdGhlIEZJRk8gZm9yIHJlYWRpbmcsIGFuZAotdGhlIGNsaWVudCBvcGVucyBpdCBmb3Igd3JpdGluZy4gIE5vdGUgdGhhdCBcZnVuY3Rpb257bWtmaWZvKCl9Ci1kb2Vzbid0IG9wZW4gdGhlIEZJRk8gLS0tIGl0IGp1c3QgY3JlYXRlcyB0aGUgcmVuZGV6dm91cyBwb2ludC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bWtub2R9e2ZpbGVuYW1lXG9wdGlvbmFseywgbW9kZT0wNjAwLCBkZXZpY2V9fQotQ3JlYXRlIGEgZmlsZXN5c3RlbSBub2RlIChmaWxlLCBkZXZpY2Ugc3BlY2lhbCBmaWxlIG9yIG5hbWVkIHBpcGUpCi1uYW1lZCBcdmFye2ZpbGVuYW1lfS4gXHZhcnttb2RlfSBzcGVjaWZpZXMgYm90aCB0aGUgcGVybWlzc2lvbnMgdG8gdXNlIGFuZAotdGhlIHR5cGUgb2Ygbm9kZSB0byBiZSBjcmVhdGVkLCBiZWluZyBjb21iaW5lZCAoYml0d2lzZSBPUikgd2l0aCBvbmUKLW9mIFNfSUZSRUcsIFNfSUZDSFIsIFNfSUZCTEssIGFuZCBTX0lGSUZPICh0aG9zZSBjb25zdGFudHMgYXJlCi1hdmFpbGFibGUgaW4gXG1vZHVsZXtzdGF0fSkuIEZvciBTX0lGQ0hSIGFuZCBTX0lGQkxLLCBcdmFye2RldmljZX0KLWRlZmluZXMgdGhlIG5ld2x5IGNyZWF0ZWQgZGV2aWNlIHNwZWNpYWwgZmlsZSAocHJvYmFibHkgdXNpbmcKLVxmdW5jdGlvbntvcy5tYWtlZGV2KCl9KSwgb3RoZXJ3aXNlIGl0IGlzIGlnbm9yZWQuCi1cdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bWFqb3J9e2RldmljZX0KLUV4dHJhY3RzIHRoZSBkZXZpY2UgbWFqb3IgbnVtYmVyIGZyb20gYSByYXcgZGV2aWNlIG51bWJlciAodXN1YWxseQotdGhlIFxtZW1iZXJ7c3RfZGV2fSBvciBcbWVtYmVye3N0X3JkZXZ9IGZpZWxkIGZyb20gXGN0eXBle3N0YXR9KS4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXttaW5vcn17ZGV2aWNlfQotRXh0cmFjdHMgdGhlIGRldmljZSBtaW5vciBudW1iZXIgZnJvbSBhIHJhdyBkZXZpY2UgbnVtYmVyICh1c3VhbGx5Ci10aGUgXG1lbWJlcntzdF9kZXZ9IG9yIFxtZW1iZXJ7c3RfcmRldn0gZmllbGQgZnJvbSBcY3R5cGV7c3RhdH0pLgotXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e21ha2VkZXZ9e21ham9yLCBtaW5vcn0KLUNvbXBvc2VzIGEgcmF3IGRldmljZSBudW1iZXIgZnJvbSB0aGUgbWFqb3IgYW5kIG1pbm9yIGRldmljZSBudW1iZXJzLgotXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e21rZGlyfXtwYXRoXG9wdGlvbmFseywgbW9kZX19Ci1DcmVhdGUgYSBkaXJlY3RvcnkgbmFtZWQgXHZhcntwYXRofSB3aXRoIG51bWVyaWMgbW9kZSBcdmFye21vZGV9LgotVGhlIGRlZmF1bHQgXHZhcnttb2RlfSBpcyBcY29kZXswNzc3fSAob2N0YWwpLiAgT24gc29tZSBzeXN0ZW1zLAotXHZhcnttb2RlfSBpcyBpZ25vcmVkLiAgV2hlcmUgaXQgaXMgdXNlZCwgdGhlIGN1cnJlbnQgdW1hc2sgdmFsdWUgaXMKLWZpcnN0IG1hc2tlZCBvdXQuCi1BdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgXFVOSVgsIFdpbmRvd3MuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e21ha2VkaXJzfXtwYXRoXG9wdGlvbmFseywgbW9kZX19Ci1SZWN1cnNpdmUgZGlyZWN0b3J5IGNyZWF0aW9uIGZ1bmN0aW9uLlxpbmRleHtkaXJlY3RvcnkhY3JlYXRpbmd9Ci1caW5kZXh7VU5DIHBhdGhzIWFuZCBcZnVuY3Rpb257b3MubWFrZWRpcnMoKX19Ci1MaWtlIFxmdW5jdGlvbntta2RpcigpfSwKLWJ1dCBtYWtlcyBhbGwgaW50ZXJtZWRpYXRlLWxldmVsIGRpcmVjdG9yaWVzIG5lZWRlZCB0byBjb250YWluIHRoZQotbGVhZiBkaXJlY3RvcnkuICBUaHJvd3MgYW4gXGV4Y2VwdGlvbntlcnJvcn0gZXhjZXB0aW9uIGlmIHRoZSBsZWFmCi1kaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMgb3IgY2Fubm90IGJlIGNyZWF0ZWQuICBUaGUgZGVmYXVsdCBcdmFye21vZGV9Ci1pcyBcY29kZXswNzc3fSAob2N0YWwpLiAgT24gc29tZSBzeXN0ZW1zLCBcdmFye21vZGV9IGlzIGlnbm9yZWQuCi1XaGVyZSBpdCBpcyB1c2VkLCB0aGUgY3VycmVudCB1bWFzayB2YWx1ZSBpcyBmaXJzdCBtYXNrZWQgb3V0LgotXG5vdGV7XGZ1bmN0aW9ue21ha2VkaXJzKCl9IHdpbGwgYmVjb21lIGNvbmZ1c2VkIGlmIHRoZSBwYXRoIGVsZW1lbnRzCi10byBjcmVhdGUgaW5jbHVkZSBcdmFye29zLnBhcmRpcn0ufQotXHZlcnNpb25hZGRlZHsxLjUuMn0KLVx2ZXJzaW9uY2hhbmdlZFtUaGlzIGZ1bmN0aW9uIG5vdyBoYW5kbGVzIFVOQyBwYXRocyBjb3JyZWN0bHldezIuM30KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cGF0aGNvbmZ9e3BhdGgsIG5hbWV9Ci1SZXR1cm4gc3lzdGVtIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gcmVsZXZhbnQgdG8gYSBuYW1lZCBmaWxlLgotXHZhcntuYW1lfSBzcGVjaWZpZXMgdGhlIGNvbmZpZ3VyYXRpb24gdmFsdWUgdG8gcmV0cmlldmU7IGl0IG1heSBiZSBhCi1zdHJpbmcgd2hpY2ggaXMgdGhlIG5hbWUgb2YgYSBkZWZpbmVkIHN5c3RlbSB2YWx1ZTsgdGhlc2UgbmFtZXMgYXJlCi1zcGVjaWZpZWQgaW4gYSBudW1iZXIgb2Ygc3RhbmRhcmRzIChcUE9TSVguMSwgXFVOSVh7fSA5NSwgXFVOSVh7fSA5OCwgYW5kCi1vdGhlcnMpLiAgU29tZSBwbGF0Zm9ybXMgZGVmaW5lIGFkZGl0aW9uYWwgbmFtZXMgYXMgd2VsbC4gIFRoZSBuYW1lcwota25vd24gdG8gdGhlIGhvc3Qgb3BlcmF0aW5nIHN5c3RlbSBhcmUgZ2l2ZW4gaW4gdGhlCi1cY29kZXtwYXRoY29uZl9uYW1lc30gZGljdGlvbmFyeS4gIEZvciBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBub3QKLWluY2x1ZGVkIGluIHRoYXQgbWFwcGluZywgcGFzc2luZyBhbiBpbnRlZ2VyIGZvciBcdmFye25hbWV9IGlzIGFsc28KLWFjY2VwdGVkLgotQXZhaWxhYmlsaXR5OiBNYWNpbnRvc2gsIFxVTklYLgotCi1JZiBcdmFye25hbWV9IGlzIGEgc3RyaW5nIGFuZCBpcyBub3Qga25vd24sIFxleGNlcHRpb257VmFsdWVFcnJvcn0gaXMKLXJhaXNlZC4gIElmIGEgc3BlY2lmaWMgdmFsdWUgZm9yIFx2YXJ7bmFtZX0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUKLWhvc3Qgc3lzdGVtLCBldmVuIGlmIGl0IGlzIGluY2x1ZGVkIGluIFxjb2Rle3BhdGhjb25mX25hbWVzfSwgYW4KLVxleGNlcHRpb257T1NFcnJvcn0gaXMgcmFpc2VkIHdpdGggXGNvbnN0YW50e2Vycm5vLkVJTlZBTH0gZm9yIHRoZQotZXJyb3IgbnVtYmVyLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtwYXRoY29uZl9uYW1lc30KLURpY3Rpb25hcnkgbWFwcGluZyBuYW1lcyBhY2NlcHRlZCBieSBcZnVuY3Rpb257cGF0aGNvbmYoKX0gYW5kCi1cZnVuY3Rpb257ZnBhdGhjb25mKCl9IHRvIHRoZSBpbnRlZ2VyIHZhbHVlcyBkZWZpbmVkIGZvciB0aG9zZSBuYW1lcwotYnkgdGhlIGhvc3Qgb3BlcmF0aW5nIHN5c3RlbS4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBzZXQKLW9mIG5hbWVzIGtub3duIHRvIHRoZSBzeXN0ZW0uCi1BdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgXFVOSVguCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3JlYWRsaW5rfXtwYXRofQotUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcGF0aCB0byB3aGljaCB0aGUgc3ltYm9saWMgbGluawotcG9pbnRzLiAgVGhlIHJlc3VsdCBtYXkgYmUgZWl0aGVyIGFuIGFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGhuYW1lOyBpZgotaXQgaXMgcmVsYXRpdmUsIGl0IG1heSBiZSBjb252ZXJ0ZWQgdG8gYW4gYWJzb2x1dGUgcGF0aG5hbWUgdXNpbmcKLVxjb2Rle29zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoXHZhcntwYXRofSksIFx2YXJ7cmVzdWx0fSl9LgotXHZlcnNpb25jaGFuZ2VkIFtJZiB0aGUgXHZhcntwYXRofSBpcyBhIFVuaWNvZGUgb2JqZWN0IHRoZSByZXN1bHQgd2lsbCBhbHNvCi1iZSBhIFVuaWNvZGUgb2JqZWN0XXsyLjZ9Ci1BdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgXFVOSVguCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3JlbW92ZX17cGF0aH0KLVJlbW92ZSB0aGUgZmlsZSBcdmFye3BhdGh9LiAgSWYgXHZhcntwYXRofSBpcyBhIGRpcmVjdG9yeSwKLVxleGNlcHRpb257T1NFcnJvcn0gaXMgcmFpc2VkOyBzZWUgXGZ1bmN0aW9ue3JtZGlyKCl9IGJlbG93IHRvIHJlbW92ZQotYSBkaXJlY3RvcnkuICBUaGlzIGlzIGlkZW50aWNhbCB0byB0aGUgXGZ1bmN0aW9ue3VubGluaygpfSBmdW5jdGlvbgotZG9jdW1lbnRlZCBiZWxvdy4gIE9uIFdpbmRvd3MsIGF0dGVtcHRpbmcgdG8gcmVtb3ZlIGEgZmlsZSB0aGF0IGlzIGluCi11c2UgY2F1c2VzIGFuIGV4Y2VwdGlvbiB0byBiZSByYWlzZWQ7IG9uIFxVTklYLCB0aGUgZGlyZWN0b3J5IGVudHJ5IGlzCi1yZW1vdmVkIGJ1dCB0aGUgc3RvcmFnZSBhbGxvY2F0ZWQgdG8gdGhlIGZpbGUgaXMgbm90IG1hZGUgYXZhaWxhYmxlCi11bnRpbCB0aGUgb3JpZ2luYWwgZmlsZSBpcyBubyBsb25nZXIgaW4gdXNlLgotQXZhaWxhYmlsaXR5OiBNYWNpbnRvc2gsIFxVTklYLCBXaW5kb3dzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtyZW1vdmVkaXJzfXtwYXRofQotXGluZGV4e2RpcmVjdG9yeSFkZWxldGluZ30KLVJlbW92ZXMgZGlyZWN0b3JpZXMgcmVjdXJzaXZlbHkuICBXb3JrcyBsaWtlCi1cZnVuY3Rpb257cm1kaXIoKX0gZXhjZXB0IHRoYXQsIGlmIHRoZSBsZWFmIGRpcmVjdG9yeSBpcwotc3VjY2Vzc2Z1bGx5IHJlbW92ZWQsIFxmdW5jdGlvbntyZW1vdmVkaXJzKCl9IAotdHJpZXMgdG8gc3VjY2Vzc2l2ZWx5IHJlbW92ZSBldmVyeSBwYXJlbnQgZGlyZWN0b3J5IG1lbnRpb25lZCBpbiAKLVx2YXJ7cGF0aH0gdW50aWwgYW4gZXJyb3IgaXMgcmFpc2VkICh3aGljaCBpcyBpZ25vcmVkLCBiZWNhdXNlCi1pdCBnZW5lcmFsbHkgbWVhbnMgdGhhdCBhIHBhcmVudCBkaXJlY3RvcnkgaXMgbm90IGVtcHR5KS4KLUZvciBleGFtcGxlLCBcc2FtcHtvcy5yZW1vdmVkaXJzKCdmb28vYmFyL2JheicpfSB3aWxsIGZpcnN0IHJlbW92ZQotdGhlIGRpcmVjdG9yeSBcc2FtcHsnZm9vL2Jhci9iYXonfSwgYW5kIHRoZW4gcmVtb3ZlIFxzYW1weydmb28vYmFyJ30KLWFuZCBcc2FtcHsnZm9vJ30gaWYgdGhleSBhcmUgZW1wdHkuCi1SYWlzZXMgXGV4Y2VwdGlvbntPU0Vycm9yfSBpZiB0aGUgbGVhZiBkaXJlY3RvcnkgY291bGQgbm90IGJlIAotc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuCi1cdmVyc2lvbmFkZGVkezEuNS4yfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtyZW5hbWV9e3NyYywgZHN0fQotUmVuYW1lIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSBcdmFye3NyY30gdG8gXHZhcntkc3R9LiAgSWYgXHZhcntkc3R9IGlzCi1hIGRpcmVjdG9yeSwgXGV4Y2VwdGlvbntPU0Vycm9yfSB3aWxsIGJlIHJhaXNlZC4gIE9uIFxVTklYLCBpZgotXHZhcntkc3R9IGV4aXN0cyBhbmQgaXMgYSBmaWxlLCBpdCB3aWxsIGJlIHJlbW92ZWQgc2lsZW50bHkgaWYgdGhlCi11c2VyIGhhcyBwZXJtaXNzaW9uLiAgVGhlIG9wZXJhdGlvbiBtYXkgZmFpbCBvbiBzb21lIFxVTklYe30gZmxhdm9ycwotaWYgXHZhcntzcmN9IGFuZCBcdmFye2RzdH0gYXJlIG9uIGRpZmZlcmVudCBmaWxlc3lzdGVtcy4gIElmCi1zdWNjZXNzZnVsLCB0aGUgcmVuYW1pbmcgd2lsbCBiZSBhbiBhdG9taWMgb3BlcmF0aW9uICh0aGlzIGlzIGEKLVxQT1NJWHt9IHJlcXVpcmVtZW50KS4gIE9uIFdpbmRvd3MsIGlmIFx2YXJ7ZHN0fSBhbHJlYWR5IGV4aXN0cywKLVxleGNlcHRpb257T1NFcnJvcn0gd2lsbCBiZSByYWlzZWQgZXZlbiBpZiBpdCBpcyBhIGZpbGU7IHRoZXJlIG1heSBiZQotbm8gd2F5IHRvIGltcGxlbWVudCBhbiBhdG9taWMgcmVuYW1lIHdoZW4gXHZhcntkc3R9IG5hbWVzIGFuIGV4aXN0aW5nCi1maWxlLgotQXZhaWxhYmlsaXR5OiBNYWNpbnRvc2gsIFxVTklYLCBXaW5kb3dzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtyZW5hbWVzfXtvbGQsIG5ld30KLVJlY3Vyc2l2ZSBkaXJlY3Rvcnkgb3IgZmlsZSByZW5hbWluZyBmdW5jdGlvbi4KLVdvcmtzIGxpa2UgXGZ1bmN0aW9ue3JlbmFtZSgpfSwgZXhjZXB0IGNyZWF0aW9uIG9mIGFueSBpbnRlcm1lZGlhdGUKLWRpcmVjdG9yaWVzIG5lZWRlZCB0byBtYWtlIHRoZSBuZXcgcGF0aG5hbWUgZ29vZCBpcyBhdHRlbXB0ZWQgZmlyc3QuCi1BZnRlciB0aGUgcmVuYW1lLCBkaXJlY3RvcmllcyBjb3JyZXNwb25kaW5nIHRvIHJpZ2h0bW9zdCBwYXRoIHNlZ21lbnRzCi1vZiB0aGUgb2xkIG5hbWUgd2lsbCBiZSBwcnVuZWQgYXdheSB1c2luZyBcZnVuY3Rpb257cmVtb3ZlZGlycygpfS4KLVx2ZXJzaW9uYWRkZWR7MS41LjJ9Ci0KLVxiZWdpbntub3RpY2V9Ci1UaGlzIGZ1bmN0aW9uIGNhbiBmYWlsIHdpdGggdGhlIG5ldyBkaXJlY3Rvcnkgc3RydWN0dXJlIG1hZGUgaWYKLXlvdSBsYWNrIHBlcm1pc3Npb25zIG5lZWRlZCB0byByZW1vdmUgdGhlIGxlYWYgZGlyZWN0b3J5IG9yIGZpbGUuCi1cZW5ke25vdGljZX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cm1kaXJ9e3BhdGh9Ci1SZW1vdmUgdGhlIGRpcmVjdG9yeSBcdmFye3BhdGh9LgotQXZhaWxhYmlsaXR5OiBNYWNpbnRvc2gsIFxVTklYLCBXaW5kb3dzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzdGF0fXtwYXRofQotUGVyZm9ybSBhIFxjZnVuY3Rpb257c3RhdCgpfSBzeXN0ZW0gY2FsbCBvbiB0aGUgZ2l2ZW4gcGF0aC4gIFRoZQotcmV0dXJuIHZhbHVlIGlzIGFuIG9iamVjdCB3aG9zZSBhdHRyaWJ1dGVzIGNvcnJlc3BvbmQgdG8gdGhlIG1lbWJlcnMgb2YKLXRoZSBcY3R5cGV7c3RhdH0gc3RydWN0dXJlLCBuYW1lbHk6Ci1cbWVtYmVye3N0X21vZGV9IChwcm90ZWN0aW9uIGJpdHMpLAotXG1lbWJlcntzdF9pbm99IChpbm9kZSBudW1iZXIpLAotXG1lbWJlcntzdF9kZXZ9IChkZXZpY2UpLAotXG1lbWJlcntzdF9ubGlua30gKG51bWJlciBvZiBoYXJkIGxpbmtzKSwKLVxtZW1iZXJ7c3RfdWlkfSAodXNlciBJRCBvZiBvd25lciksCi1cbWVtYmVye3N0X2dpZH0gKGdyb3VwIElEIG9mIG93bmVyKSwKLVxtZW1iZXJ7c3Rfc2l6ZX0gKHNpemUgb2YgZmlsZSwgaW4gYnl0ZXMpLAotXG1lbWJlcntzdF9hdGltZX0gKHRpbWUgb2YgbW9zdCByZWNlbnQgYWNjZXNzKSwKLVxtZW1iZXJ7c3RfbXRpbWV9ICh0aW1lIG9mIG1vc3QgcmVjZW50IGNvbnRlbnQgbW9kaWZpY2F0aW9uKSwKLVxtZW1iZXJ7c3RfY3RpbWV9Ci0ocGxhdGZvcm0gZGVwZW5kZW50OyB0aW1lIG9mIG1vc3QgcmVjZW50IG1ldGFkYXRhIGNoYW5nZSBvbiBcVU5JWCwgb3IKLXRoZSB0aW1lIG9mIGNyZWF0aW9uIG9uIFdpbmRvd3MpOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gaW1wb3J0IG9zCi0+Pj4gc3RhdGluZm8gPSBvcy5zdGF0KCdzb21lZmlsZS50eHQnKQotPj4+IHN0YXRpbmZvCi0oMzMxODgsIDQyMjUxMUwsIDc2OUwsIDEsIDEwMzIsIDEwMCwgOTI2TCwgMTEwNTAyMjY5OCwxMTA1MDIyNzMyLCAxMTA1MDIyNzMyKQotPj4+IHN0YXRpbmZvLnN0X3NpemUKLTkyNkwKLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotXHZlcnNpb25jaGFuZ2VkIFtJZiBcZnVuY3Rpb257c3RhdF9mbG9hdF90aW1lc30gcmV0dXJucyB0cnVlLCB0aGUgdGltZQotdmFsdWVzIGFyZSBmbG9hdHMsIG1lYXN1cmluZyBzZWNvbmRzLiBGcmFjdGlvbnMgb2YgYSBzZWNvbmQgbWF5IGJlCi1yZXBvcnRlZCBpZiB0aGUgc3lzdGVtIHN1cHBvcnRzIHRoYXQuIE9uIE1hYyBPUywgdGhlIHRpbWVzIGFyZSBhbHdheXMKLWZsb2F0cy4gU2VlIFxmdW5jdGlvbntzdGF0X2Zsb2F0X3RpbWVzfSBmb3IgZnVydGhlciBkaXNjdXNzaW9uXXsyLjN9Ci0KLU9uIHNvbWUgXFVOSVh7fSBzeXN0ZW1zIChzdWNoIGFzIExpbnV4KSwgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIG1heQotYWxzbyBiZSBhdmFpbGFibGU6Ci1cbWVtYmVye3N0X2Jsb2Nrc30gKG51bWJlciBvZiBibG9ja3MgYWxsb2NhdGVkIGZvciBmaWxlKSwKLVxtZW1iZXJ7c3RfYmxrc2l6ZX0gKGZpbGVzeXN0ZW0gYmxvY2tzaXplKSwKLVxtZW1iZXJ7c3RfcmRldn0gKHR5cGUgb2YgZGV2aWNlIGlmIGFuIGlub2RlIGRldmljZSkuCi1cbWVtYmVye3N0X2ZsYWdzfSAodXNlciBkZWZpbmVkIGZsYWdzIGZvciBmaWxlKS4KLQotT24gb3RoZXIgXFVOSVh7fSBzeXN0ZW1zIChzdWNoIGFzIEZyZWVCU0QpLCB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMKLW1heSBiZSBhdmFpbGFibGUgKGJ1dCBtYXkgYmUgb25seSBmaWxsZWQgb3V0IGlmIHJvb3QgdHJpZXMgdG8KLXVzZSB0aGVtKToKLVxtZW1iZXJ7c3RfZ2VufSAoZmlsZSBnZW5lcmF0aW9uIG51bWJlciksCi1cbWVtYmVye3N0X2JpcnRodGltZX0gKHRpbWUgb2YgZmlsZSBjcmVhdGlvbikuCi0KLU9uIE1hYyBPUyBzeXN0ZW1zLCB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgbWF5IGFsc28gYmUgYXZhaWxhYmxlOgotXG1lbWJlcntzdF9yc2l6ZX0sCi1cbWVtYmVye3N0X2NyZWF0b3J9LAotXG1lbWJlcntzdF90eXBlfS4KLQotT24gUklTQ09TIHN5c3RlbXMsIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgYWxzbyBhdmFpbGFibGU6Ci1cbWVtYmVye3N0X2Z0eXBlfSAoZmlsZSB0eXBlKSwKLVxtZW1iZXJ7c3RfYXR0cnN9IChhdHRyaWJ1dGVzKSwKLVxtZW1iZXJ7c3Rfb2J0eXBlfSAob2JqZWN0IHR5cGUpLgotCi1Gb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhlIHJldHVybiB2YWx1ZSBvZiBcZnVuY3Rpb257c3RhdCgpfSBpcwotYWxzbyBhY2Nlc3NpYmxlIGFzIGEgdHVwbGUgb2YgYXQgbGVhc3QgMTAgaW50ZWdlcnMgZ2l2aW5nIHRoZSBtb3N0Ci1pbXBvcnRhbnQgKGFuZCBwb3J0YWJsZSkgbWVtYmVycyBvZiB0aGUgXGN0eXBle3N0YXR9IHN0cnVjdHVyZSwgaW4gdGhlCi1vcmRlcgotXG1lbWJlcntzdF9tb2RlfSwKLVxtZW1iZXJ7c3RfaW5vfSwKLVxtZW1iZXJ7c3RfZGV2fSwKLVxtZW1iZXJ7c3Rfbmxpbmt9LAotXG1lbWJlcntzdF91aWR9LAotXG1lbWJlcntzdF9naWR9LAotXG1lbWJlcntzdF9zaXplfSwKLVxtZW1iZXJ7c3RfYXRpbWV9LAotXG1lbWJlcntzdF9tdGltZX0sCi1cbWVtYmVye3N0X2N0aW1lfS4KLU1vcmUgaXRlbXMgbWF5IGJlIGFkZGVkIGF0IHRoZSBlbmQgYnkgc29tZSBpbXBsZW1lbnRhdGlvbnMuCi1UaGUgc3RhbmRhcmQgbW9kdWxlIFxyZWZtb2R1bGV7c3RhdH1ccmVmc3Rtb2RpbmRleHtzdGF0fSBkZWZpbmVzCi1mdW5jdGlvbnMgYW5kIGNvbnN0YW50cyB0aGF0IGFyZSB1c2VmdWwgZm9yIGV4dHJhY3RpbmcgaW5mb3JtYXRpb24KLWZyb20gYSBcY3R5cGV7c3RhdH0gc3RydWN0dXJlLgotKE9uIFdpbmRvd3MsIHNvbWUgaXRlbXMgYXJlIGZpbGxlZCB3aXRoIGR1bW15IHZhbHVlcy4pCi0KLVxub3Rle1RoZSBleGFjdCBtZWFuaW5nIGFuZCByZXNvbHV0aW9uIG9mIHRoZSBcbWVtYmVye3N0X2F0aW1lfSwKLSBcbWVtYmVye3N0X210aW1lfSwgYW5kIFxtZW1iZXJ7c3RfY3RpbWV9IG1lbWJlcnMgZGVwZW5kcyBvbiB0aGUKLSBvcGVyYXRpbmcgc3lzdGVtIGFuZCB0aGUgZmlsZSBzeXN0ZW0uICBGb3IgZXhhbXBsZSwgb24gV2luZG93cyBzeXN0ZW1zCi0gdXNpbmcgdGhlIEZBVCBvciBGQVQzMiBmaWxlIHN5c3RlbXMsIFxtZW1iZXJ7c3RfbXRpbWV9IGhhcyAyLXNlY29uZAotIHJlc29sdXRpb24sIGFuZCBcbWVtYmVye3N0X2F0aW1lfSBoYXMgb25seSAxLWRheSByZXNvbHV0aW9uLiAgU2VlCi0geW91ciBvcGVyYXRpbmcgc3lzdGVtIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMufQotCi1BdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgXFVOSVgsIFdpbmRvd3MuCi0KLVx2ZXJzaW9uY2hhbmdlZAotW0FkZGVkIGFjY2VzcyB0byB2YWx1ZXMgYXMgYXR0cmlidXRlcyBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0XXsyLjJ9Ci1cdmVyc2lvbmNoYW5nZWRbQWRkZWQgc3RfZ2VuLCBzdF9iaXJ0aHRpbWVdezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c3RhdF9mbG9hdF90aW1lc317XG9wdGlvbmFse25ld3ZhbHVlfX0KLURldGVybWluZSB3aGV0aGVyIFxjbGFzc3tzdGF0X3Jlc3VsdH0gcmVwcmVzZW50cyB0aW1lIHN0YW1wcyBhcyBmbG9hdAotb2JqZWN0cy4gIElmIFx2YXJ7bmV3dmFsdWV9IGlzIFxjb2Rle1RydWV9LCBmdXR1cmUgY2FsbHMgdG8gXGZ1bmN0aW9ue3N0YXQoKX0KLXJldHVybiBmbG9hdHMsIGlmIGl0IGlzIFxjb2Rle0ZhbHNlfSwgZnV0dXJlIGNhbGxzIHJldHVybiBpbnRzLgotSWYgXHZhcntuZXd2YWx1ZX0gaXMgb21pdHRlZCwgcmV0dXJuIHRoZSBjdXJyZW50IHNldHRpbmcuCi0KLUZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgUHl0aG9uIHZlcnNpb25zLCBhY2Nlc3NpbmcKLVxjbGFzc3tzdGF0X3Jlc3VsdH0gYXMgYSB0dXBsZSBhbHdheXMgcmV0dXJucyBpbnRlZ2Vycy4KLQotXHZlcnNpb25jaGFuZ2VkW1B5dGhvbiBub3cgcmV0dXJucyBmbG9hdCB2YWx1ZXMgYnkgZGVmYXVsdC4gQXBwbGljYXRpb25zCi13aGljaCBkbyBub3Qgd29yayBjb3JyZWN0bHkgd2l0aCBmbG9hdGluZyBwb2ludCB0aW1lIHN0YW1wcyBjYW4gdXNlCi10aGlzIGZ1bmN0aW9uIHRvIHJlc3RvcmUgdGhlIG9sZCBiZWhhdmlvdXJdezIuNX0KLQotVGhlIHJlc29sdXRpb24gb2YgdGhlIHRpbWVzdGFtcHMgKHRoYXQgaXMgdGhlIHNtYWxsZXN0IHBvc3NpYmxlIGZyYWN0aW9uKQotZGVwZW5kcyBvbiB0aGUgc3lzdGVtLiBTb21lIHN5c3RlbXMgb25seSBzdXBwb3J0IHNlY29uZCByZXNvbHV0aW9uOwotb24gdGhlc2Ugc3lzdGVtcywgdGhlIGZyYWN0aW9uIHdpbGwgYWx3YXlzIGJlIHplcm8uCi0KLUl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhpcyBzZXR0aW5nIGlzIG9ubHkgY2hhbmdlZCBhdCBwcm9ncmFtIHN0YXJ0dXAKLXRpbWUgaW4gdGhlIFx2YXJ7X19tYWluX199IG1vZHVsZTsgbGlicmFyaWVzIHNob3VsZCBuZXZlciBjaGFuZ2UgdGhpcwotc2V0dGluZy4gSWYgYW4gYXBwbGljYXRpb24gdXNlcyBhIGxpYnJhcnkgdGhhdCB3b3JrcyBpbmNvcnJlY3RseSBpZgotZmxvYXRpbmcgcG9pbnQgdGltZSBzdGFtcHMgYXJlIHByb2Nlc3NlZCwgdGhpcyBhcHBsaWNhdGlvbiBzaG91bGQgdHVybgotdGhlIGZlYXR1cmUgb2ZmIHVudGlsIHRoZSBsaWJyYXJ5IGhhcyBiZWVuIGNvcnJlY3RlZC4KLQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzdGF0dmZzfXtwYXRofQotUGVyZm9ybSBhIFxjZnVuY3Rpb257c3RhdHZmcygpfSBzeXN0ZW0gY2FsbCBvbiB0aGUgZ2l2ZW4gcGF0aC4gIFRoZQotcmV0dXJuIHZhbHVlIGlzIGFuIG9iamVjdCB3aG9zZSBhdHRyaWJ1dGVzIGRlc2NyaWJlIHRoZSBmaWxlc3lzdGVtIG9uCi10aGUgZ2l2ZW4gcGF0aCwgYW5kIGNvcnJlc3BvbmQgdG8gdGhlIG1lbWJlcnMgb2YgdGhlCi1cY3R5cGV7c3RhdHZmc30gc3RydWN0dXJlLCBuYW1lbHk6Ci1cbWVtYmVye2ZfYnNpemV9LAotXG1lbWJlcntmX2Zyc2l6ZX0sCi1cbWVtYmVye2ZfYmxvY2tzfSwKLVxtZW1iZXJ7Zl9iZnJlZX0sCi1cbWVtYmVye2ZfYmF2YWlsfSwKLVxtZW1iZXJ7Zl9maWxlc30sCi1cbWVtYmVye2ZfZmZyZWV9LAotXG1lbWJlcntmX2ZhdmFpbH0sCi1cbWVtYmVye2ZfZmxhZ30sCi1cbWVtYmVye2ZfbmFtZW1heH0uCi1BdmFpbGFiaWxpdHk6IFxVTklYLgotCi1Gb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhlIHJldHVybiB2YWx1ZSBpcyBhbHNvIGFjY2Vzc2libGUgYXMgYQotdHVwbGUgd2hvc2UgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIGF0dHJpYnV0ZXMsIGluIHRoZSBvcmRlciBnaXZlbiBhYm92ZS4KLVRoZSBzdGFuZGFyZCBtb2R1bGUgXHJlZm1vZHVsZXtzdGF0dmZzfVxyZWZzdG1vZGluZGV4e3N0YXR2ZnN9Ci1kZWZpbmVzIGNvbnN0YW50cyB0aGF0IGFyZSB1c2VmdWwgZm9yIGV4dHJhY3RpbmcgaW5mb3JtYXRpb24KLWZyb20gYSBcY3R5cGV7c3RhdHZmc30gc3RydWN0dXJlIHdoZW4gYWNjZXNzaW5nIGl0IGFzIGEgc2VxdWVuY2U7IHRoaXMKLXJlbWFpbnMgdXNlZnVsIHdoZW4gd3JpdGluZyBjb2RlIHRoYXQgbmVlZHMgdG8gd29yayB3aXRoIHZlcnNpb25zIG9mCi1QeXRob24gdGhhdCBkb24ndCBzdXBwb3J0IGFjY2Vzc2luZyB0aGUgZmllbGRzIGFzIGF0dHJpYnV0ZXMuCi0KLVx2ZXJzaW9uY2hhbmdlZAotW0FkZGVkIGFjY2VzcyB0byB2YWx1ZXMgYXMgYXR0cmlidXRlcyBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0XXsyLjJ9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3N5bWxpbmt9e3NyYywgZHN0fQotQ3JlYXRlIGEgc3ltYm9saWMgbGluayBwb2ludGluZyB0byBcdmFye3NyY30gbmFtZWQgXHZhcntkc3R9LgotQXZhaWxhYmlsaXR5OiBcVU5JWC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dGVtcG5hbX17XG9wdGlvbmFse2RpclxvcHRpb25hbHssIHByZWZpeH19fQotUmV0dXJuIGEgdW5pcXVlIHBhdGggbmFtZSB0aGF0IGlzIHJlYXNvbmFibGUgZm9yIGNyZWF0aW5nIGEgdGVtcG9yYXJ5Ci1maWxlLiAgVGhpcyB3aWxsIGJlIGFuIGFic29sdXRlIHBhdGggdGhhdCBuYW1lcyBhIHBvdGVudGlhbCBkaXJlY3RvcnkKLWVudHJ5IGluIHRoZSBkaXJlY3RvcnkgXHZhcntkaXJ9IG9yIGEgY29tbW9uIGxvY2F0aW9uIGZvciB0ZW1wb3JhcnkKLWZpbGVzIGlmIFx2YXJ7ZGlyfSBpcyBvbWl0dGVkIG9yIFxjb2Rle05vbmV9LiAgSWYgZ2l2ZW4gYW5kIG5vdAotXGNvZGV7Tm9uZX0sIFx2YXJ7cHJlZml4fSBpcyB1c2VkIHRvIHByb3ZpZGUgYSBzaG9ydCBwcmVmaXggdG8gdGhlCi1maWxlbmFtZS4gIEFwcGxpY2F0aW9ucyBhcmUgcmVzcG9uc2libGUgZm9yIHByb3Blcmx5IGNyZWF0aW5nIGFuZAotbWFuYWdpbmcgZmlsZXMgY3JlYXRlZCB1c2luZyBwYXRocyByZXR1cm5lZCBieSBcZnVuY3Rpb257dGVtcG5hbSgpfTsKLW5vIGF1dG9tYXRpYyBjbGVhbnVwIGlzIHByb3ZpZGVkLgotT24gXFVOSVgsIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBcZW52dmFye1RNUERJUn0gb3ZlcnJpZGVzCi1cdmFye2Rpcn0sIHdoaWxlIG9uIFdpbmRvd3MgdGhlIFxlbnZ2YXJ7VE1QfSBpcyB1c2VkLiAgVGhlIHNwZWNpZmljCi1iZWhhdmlvciBvZiB0aGlzIGZ1bmN0aW9uIGRlcGVuZHMgb24gdGhlIEMgbGlicmFyeSBpbXBsZW1lbnRhdGlvbjsKLXNvbWUgYXNwZWN0cyBhcmUgdW5kZXJzcGVjaWZpZWQgaW4gc3lzdGVtIGRvY3VtZW50YXRpb24uCi1cd2FybmluZ3tVc2Ugb2YgXGZ1bmN0aW9ue3RlbXBuYW0oKX0gaXMgdnVsbmVyYWJsZSB0byBzeW1saW5rIGF0dGFja3M7Ci1jb25zaWRlciB1c2luZyBcZnVuY3Rpb257dG1wZmlsZSgpfSAoc2VjdGlvbiBccmVme29zLW5ld3N0cmVhbXN9KQotaW5zdGVhZC59ICBBdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgXFVOSVgsIFdpbmRvd3MuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3RtcG5hbX17fQotUmV0dXJuIGEgdW5pcXVlIHBhdGggbmFtZSB0aGF0IGlzIHJlYXNvbmFibGUgZm9yIGNyZWF0aW5nIGEgdGVtcG9yYXJ5Ci1maWxlLiAgVGhpcyB3aWxsIGJlIGFuIGFic29sdXRlIHBhdGggdGhhdCBuYW1lcyBhIHBvdGVudGlhbCBkaXJlY3RvcnkKLWVudHJ5IGluIGEgY29tbW9uIGxvY2F0aW9uIGZvciB0ZW1wb3JhcnkgZmlsZXMuICBBcHBsaWNhdGlvbnMgYXJlCi1yZXNwb25zaWJsZSBmb3IgcHJvcGVybHkgY3JlYXRpbmcgYW5kIG1hbmFnaW5nIGZpbGVzIGNyZWF0ZWQgdXNpbmcKLXBhdGhzIHJldHVybmVkIGJ5IFxmdW5jdGlvbnt0bXBuYW0oKX07IG5vIGF1dG9tYXRpYyBjbGVhbnVwIGlzCi1wcm92aWRlZC4KLVx3YXJuaW5ne1VzZSBvZiBcZnVuY3Rpb257dG1wbmFtKCl9IGlzIHZ1bG5lcmFibGUgdG8gc3ltbGluayBhdHRhY2tzOwotY29uc2lkZXIgdXNpbmcgXGZ1bmN0aW9ue3RtcGZpbGUoKX0gKHNlY3Rpb24gXHJlZntvcy1uZXdzdHJlYW1zfSkKLWluc3RlYWQufSAgQXZhaWxhYmlsaXR5OiBcVU5JWCwgV2luZG93cy4gIFRoaXMgZnVuY3Rpb24gcHJvYmFibHkKLXNob3VsZG4ndCBiZSB1c2VkIG9uIFdpbmRvd3MsIHRob3VnaDogTWljcm9zb2Z0J3MgaW1wbGVtZW50YXRpb24gb2YKLVxmdW5jdGlvbnt0bXBuYW0oKX0gYWx3YXlzIGNyZWF0ZXMgYSBuYW1lIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUKLWN1cnJlbnQgZHJpdmUsIGFuZCB0aGF0J3MgZ2VuZXJhbGx5IGEgcG9vciBsb2NhdGlvbiBmb3IgYSB0ZW1wIGZpbGUKLShkZXBlbmRpbmcgb24gcHJpdmlsZWdlcywgeW91IG1heSBub3QgZXZlbiBiZSBhYmxlIHRvIG9wZW4gYSBmaWxlCi11c2luZyB0aGlzIG5hbWUpLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtUTVBfTUFYfQotVGhlIG1heGltdW0gbnVtYmVyIG9mIHVuaXF1ZSBuYW1lcyB0aGF0IFxmdW5jdGlvbnt0bXBuYW0oKX0gd2lsbAotZ2VuZXJhdGUgYmVmb3JlIHJldXNpbmcgbmFtZXMuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3VubGlua317cGF0aH0KLVJlbW92ZSB0aGUgZmlsZSBcdmFye3BhdGh9LiAgVGhpcyBpcyB0aGUgc2FtZSBmdW5jdGlvbiBhcwotXGZ1bmN0aW9ue3JlbW92ZSgpfTsgdGhlIFxmdW5jdGlvbnt1bmxpbmsoKX0gbmFtZSBpcyBpdHMgdHJhZGl0aW9uYWwKLVxVTklYe30gbmFtZS4KLUF2YWlsYWJpbGl0eTogTWFjaW50b3NoLCBcVU5JWCwgV2luZG93cy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dXRpbWV9e3BhdGgsIHRpbWVzfQotU2V0IHRoZSBhY2Nlc3MgYW5kIG1vZGlmaWVkIHRpbWVzIG9mIHRoZSBmaWxlIHNwZWNpZmllZCBieSBcdmFye3BhdGh9LgotSWYgXHZhcnt0aW1lc30gaXMgXGNvZGV7Tm9uZX0sIHRoZW4gdGhlIGZpbGUncyBhY2Nlc3MgYW5kIG1vZGlmaWVkCi10aW1lcyBhcmUgc2V0IHRvIHRoZSBjdXJyZW50IHRpbWUuICBPdGhlcndpc2UsIFx2YXJ7dGltZXN9IG11c3QgYmUgYQotMi10dXBsZSBvZiBudW1iZXJzLCBvZiB0aGUgZm9ybSBcY29kZXsoXHZhcnthdGltZX0sIFx2YXJ7bXRpbWV9KX0KLXdoaWNoIGlzIHVzZWQgdG8gc2V0IHRoZSBhY2Nlc3MgYW5kIG1vZGlmaWVkIHRpbWVzLCByZXNwZWN0aXZlbHkuCi1XaGV0aGVyIGEgZGlyZWN0b3J5IGNhbiBiZSBnaXZlbiBmb3IgXHZhcntwYXRofSBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlCi1vcGVyYXRpbmcgc3lzdGVtIGltcGxlbWVudHMgZGlyZWN0b3JpZXMgYXMgZmlsZXMgKGZvciBleGFtcGxlLCBXaW5kb3dzCi1kb2VzIG5vdCkuICBOb3RlIHRoYXQgdGhlIGV4YWN0IHRpbWVzIHlvdSBzZXQgaGVyZSBtYXkgbm90IGJlIHJldHVybmVkCi1ieSBhIHN1YnNlcXVlbnQgXGZ1bmN0aW9ue3N0YXQoKX0gY2FsbCwgZGVwZW5kaW5nIG9uIHRoZSByZXNvbHV0aW9uCi13aXRoIHdoaWNoIHlvdXIgb3BlcmF0aW5nIHN5c3RlbSByZWNvcmRzIGFjY2VzcyBhbmQgbW9kaWZpY2F0aW9uIHRpbWVzOwotc2VlIFxmdW5jdGlvbntzdGF0KCl9LgotXHZlcnNpb25jaGFuZ2VkW0FkZGVkIHN1cHBvcnQgZm9yIFxjb2Rle05vbmV9IGZvciBcdmFye3RpbWVzfV17Mi4wfQotQXZhaWxhYmlsaXR5OiBNYWNpbnRvc2gsIFxVTklYLCBXaW5kb3dzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt3YWxrfXt0b3Bcb3B0aW9uYWx7LCB0b3Bkb3duXGNvZGV7PVRydWV9Ci0gICAgICAgICAgICAgICAgICAgICAgIFxvcHRpb25hbHssIG9uZXJyb3JcY29kZXs9Tm9uZX1cb3B0aW9uYWx7LAotCQkgICAgICAgZm9sbG93bGlua3NcY29kZXs9RmFsc2V9fX19fQotXGluZGV4e2RpcmVjdG9yeSF3YWxraW5nfQotXGluZGV4e2RpcmVjdG9yeSF0cmF2ZXJzYWx9Ci1cZnVuY3Rpb257d2FsaygpfSBnZW5lcmF0ZXMgdGhlIGZpbGUgbmFtZXMgaW4gYSBkaXJlY3RvcnkgdHJlZSwgYnkKLXdhbGtpbmcgdGhlIHRyZWUgZWl0aGVyIHRvcCBkb3duIG9yIGJvdHRvbSB1cC4KLUZvciBlYWNoIGRpcmVjdG9yeSBpbiB0aGUgdHJlZSByb290ZWQgYXQgZGlyZWN0b3J5IFx2YXJ7dG9wfSAoaW5jbHVkaW5nCi1cdmFye3RvcH0gaXRzZWxmKSwgaXQgeWllbGRzIGEgMy10dXBsZQotXGNvZGV7KFx2YXJ7ZGlycGF0aH0sIFx2YXJ7ZGlybmFtZXN9LCBcdmFye2ZpbGVuYW1lc30pfS4KLQotXHZhcntkaXJwYXRofSBpcyBhIHN0cmluZywgdGhlIHBhdGggdG8gdGhlIGRpcmVjdG9yeS4gIFx2YXJ7ZGlybmFtZXN9IGlzCi1hIGxpc3Qgb2YgdGhlIG5hbWVzIG9mIHRoZSBzdWJkaXJlY3RvcmllcyBpbiBcdmFye2RpcnBhdGh9Ci0oZXhjbHVkaW5nIFxjb2RleycuJ30gYW5kIFxjb2RleycuLid9KS4gIFx2YXJ7ZmlsZW5hbWVzfSBpcyBhIGxpc3Qgb2YKLXRoZSBuYW1lcyBvZiB0aGUgbm9uLWRpcmVjdG9yeSBmaWxlcyBpbiBcdmFye2RpcnBhdGh9LiAgTm90ZSB0aGF0IHRoZQotbmFtZXMgaW4gdGhlIGxpc3RzIGNvbnRhaW4gbm8gcGF0aCBjb21wb25lbnRzLiAgVG8gZ2V0IGEgZnVsbAotcGF0aCAod2hpY2ggYmVnaW5zIHdpdGggXHZhcnt0b3B9KSB0byBhIGZpbGUgb3IgZGlyZWN0b3J5IGluCi1cdmFye2RpcnBhdGh9LCBkbyBcY29kZXtvcy5wYXRoLmpvaW4oXHZhcntkaXJwYXRofSwgXHZhcntuYW1lfSl9LgotCi1JZiBvcHRpb25hbCBhcmd1bWVudCBcdmFye3RvcGRvd259IGlzIHRydWUgb3Igbm90IHNwZWNpZmllZCwgdGhlIHRyaXBsZQotZm9yIGEgZGlyZWN0b3J5IGlzIGdlbmVyYXRlZCBiZWZvcmUgdGhlIHRyaXBsZXMgZm9yIGFueSBvZiBpdHMKLXN1YmRpcmVjdG9yaWVzIChkaXJlY3RvcmllcyBhcmUgZ2VuZXJhdGVkIHRvcCBkb3duKS4gIElmIFx2YXJ7dG9wZG93bn0gaXMKLWZhbHNlLCB0aGUgdHJpcGxlIGZvciBhIGRpcmVjdG9yeSBpcyBnZW5lcmF0ZWQgYWZ0ZXIgdGhlIHRyaXBsZXMgZm9yIGFsbAotb2YgaXRzIHN1YmRpcmVjdG9yaWVzIChkaXJlY3RvcmllcyBhcmUgZ2VuZXJhdGVkIGJvdHRvbSB1cCkuCi0KLVdoZW4gXHZhcnt0b3Bkb3dufSBpcyB0cnVlLCB0aGUgY2FsbGVyIGNhbiBtb2RpZnkgdGhlIFx2YXJ7ZGlybmFtZXN9IGxpc3QKLWluLXBsYWNlIChwZXJoYXBzIHVzaW5nIFxrZXl3b3Jke2RlbH0gb3Igc2xpY2UgYXNzaWdubWVudCksIGFuZAotXGZ1bmN0aW9ue3dhbGsoKX0gd2lsbCBvbmx5IHJlY3Vyc2UgaW50byB0aGUgc3ViZGlyZWN0b3JpZXMgd2hvc2UgbmFtZXMKLXJlbWFpbiBpbiBcdmFye2Rpcm5hbWVzfTsgdGhpcyBjYW4gYmUgdXNlZCB0byBwcnVuZSB0aGUgc2VhcmNoLAotaW1wb3NlIGEgc3BlY2lmaWMgb3JkZXIgb2YgdmlzaXRpbmcsIG9yIGV2ZW4gdG8gaW5mb3JtIFxmdW5jdGlvbnt3YWxrKCl9Ci1hYm91dCBkaXJlY3RvcmllcyB0aGUgY2FsbGVyIGNyZWF0ZXMgb3IgcmVuYW1lcyBiZWZvcmUgaXQgcmVzdW1lcwotXGZ1bmN0aW9ue3dhbGsoKX0gYWdhaW4uICBNb2RpZnlpbmcgXHZhcntkaXJuYW1lc30gd2hlbiBcdmFye3RvcGRvd259IGlzCi1mYWxzZSBpcyBpbmVmZmVjdGl2ZSwgYmVjYXVzZSBpbiBib3R0b20tdXAgbW9kZSB0aGUgZGlyZWN0b3JpZXMgaW4KLVx2YXJ7ZGlybmFtZXN9IGFyZSBnZW5lcmF0ZWQgYmVmb3JlIFx2YXJ7ZGlycGF0aH0gaXRzZWxmIGlzIGdlbmVyYXRlZC4KLQotQnkgZGVmYXVsdCBlcnJvcnMgZnJvbSB0aGUgXGNvZGV7b3MubGlzdGRpcigpfSBjYWxsIGFyZSBpZ25vcmVkLiAgSWYKLW9wdGlvbmFsIGFyZ3VtZW50IFx2YXJ7b25lcnJvcn0gaXMgc3BlY2lmaWVkLCBpdCBzaG91bGQgYmUgYSBmdW5jdGlvbjsKLWl0IHdpbGwgYmUgY2FsbGVkIHdpdGggb25lIGFyZ3VtZW50LCBhbiBcZXhjZXB0aW9ue09TRXJyb3J9IGluc3RhbmNlLiAgSXQgY2FuCi1yZXBvcnQgdGhlIGVycm9yIHRvIGNvbnRpbnVlIHdpdGggdGhlIHdhbGssIG9yIHJhaXNlIHRoZSBleGNlcHRpb24KLXRvIGFib3J0IHRoZSB3YWxrLiAgTm90ZSB0aGF0IHRoZSBmaWxlbmFtZSBpcyBhdmFpbGFibGUgYXMgdGhlCi1cY29kZXtmaWxlbmFtZX0gYXR0cmlidXRlIG9mIHRoZSBleGNlcHRpb24gb2JqZWN0LgotCi1CeSBkZWZhdWx0LCBcZnVuY3Rpb257d2FsaygpfSB3aWxsIG5vdCB3YWxrIGRvd24gaW50byBzeW1ib2xpYyBsaW5rcyB0aGF0Ci1yZXNvbHZlIHRvIGRpcmVjdG9yaWVzLiBTZXQgXHZhcntmb2xsb3dsaW5rc30gdG8gVHJ1ZSB0byB2aXNpdCBkaXJlY3RvcmllcwotcG9pbnRlZCB0byBieSBzeW1saW5rcywgb24gc3lzdGVtcyB0aGF0IHN1cHBvcnQgdGhlbS4KLQotXHZlcnNpb25hZGRlZFtUaGUgXHZhcntmb2xsb3dsaW5rc30gcGFyYW1ldGVyXXsyLjZ9Ci0KLVxiZWdpbntub3RpY2V9Ci1CZSBhd2FyZSB0aGF0IHNldHRpbmcgXHZhcntmb2xsb3dsaW5rc30gdG8gdHJ1ZSBjYW4gbGVhZCB0byBpbmZpbml0ZSByZWN1cnNpb24KLWlmIGEgbGluayBwb2ludHMgdG8gYSBwYXJlbnQgZGlyZWN0b3J5IG9mIGl0c2VsZi4gXGZ1bmN0aW9ue3dhbGsoKX0gZG9lcyBub3QKLWtlZXAgdHJhY2sgb2YgdGhlIGRpcmVjdG9yaWVzIGl0IHZpc2l0ZWQgYWxyZWFkeS4KLVxlbmR7bm90aWNlfQotCi1cYmVnaW57bm90aWNlfQotSWYgeW91IHBhc3MgYSByZWxhdGl2ZSBwYXRobmFtZSwgZG9uJ3QgY2hhbmdlIHRoZSBjdXJyZW50IHdvcmtpbmcKLWRpcmVjdG9yeSBiZXR3ZWVuIHJlc3VtcHRpb25zIG9mIFxmdW5jdGlvbnt3YWxrKCl9LiAgXGZ1bmN0aW9ue3dhbGsoKX0KLW5ldmVyIGNoYW5nZXMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBhbmQgYXNzdW1lcyB0aGF0IGl0cyBjYWxsZXIKLWRvZXNuJ3QgZWl0aGVyLgotXGVuZHtub3RpY2V9Ci0KLVRoaXMgZXhhbXBsZSBkaXNwbGF5cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRha2VuIGJ5IG5vbi1kaXJlY3RvcnkgZmlsZXMKLWluIGVhY2ggZGlyZWN0b3J5IHVuZGVyIHRoZSBzdGFydGluZyBkaXJlY3RvcnksIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3QKLWxvb2sgdW5kZXIgYW55IENWUyBzdWJkaXJlY3Rvcnk6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCBvcwotZnJvbSBvcy5wYXRoIGltcG9ydCBqb2luLCBnZXRzaXplCi1mb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsaygncHl0aG9uL0xpYi9lbWFpbCcpOgotICAgIHByaW50IHJvb3QsICJjb25zdW1lcyIsCi0gICAgcHJpbnQgc3VtKGdldHNpemUoam9pbihyb290LCBuYW1lKSkgZm9yIG5hbWUgaW4gZmlsZXMpLAotICAgIHByaW50ICJieXRlcyBpbiIsIGxlbihmaWxlcyksICJub24tZGlyZWN0b3J5IGZpbGVzIgotICAgIGlmICdDVlMnIGluIGRpcnM6Ci0gICAgICAgIGRpcnMucmVtb3ZlKCdDVlMnKSAgIyBkb24ndCB2aXNpdCBDVlMgZGlyZWN0b3JpZXMKLVxlbmR7dmVyYmF0aW19Ci0KLUluIHRoZSBuZXh0IGV4YW1wbGUsIHdhbGtpbmcgdGhlIHRyZWUgYm90dG9tIHVwIGlzIGVzc2VudGlhbDoKLVxmdW5jdGlvbntybWRpcigpfSBkb2Vzbid0IGFsbG93IGRlbGV0aW5nIGEgZGlyZWN0b3J5IGJlZm9yZSB0aGUKLWRpcmVjdG9yeSBpcyBlbXB0eToKLQotXGJlZ2lue3ZlcmJhdGltfQotIyBEZWxldGUgZXZlcnl0aGluZyByZWFjaGFibGUgZnJvbSB0aGUgZGlyZWN0b3J5IG5hbWVkIGluICd0b3AnLAotIyBhc3N1bWluZyB0aGVyZSBhcmUgbm8gc3ltYm9saWMgbGlua3MuCi0jIENBVVRJT046ICBUaGlzIGlzIGRhbmdlcm91cyEgIEZvciBleGFtcGxlLCBpZiB0b3AgPT0gJy8nLCBpdAotIyBjb3VsZCBkZWxldGUgYWxsIHlvdXIgZGlzayBmaWxlcy4KLWltcG9ydCBvcwotZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsodG9wLCB0b3Bkb3duPUZhbHNlKToKLSAgICBmb3IgbmFtZSBpbiBmaWxlczoKLSAgICAgICAgb3MucmVtb3ZlKG9zLnBhdGguam9pbihyb290LCBuYW1lKSkKLSAgICBmb3IgbmFtZSBpbiBkaXJzOgotICAgICAgICBvcy5ybWRpcihvcy5wYXRoLmpvaW4ocm9vdCwgbmFtZSkpCi1cZW5ke3ZlcmJhdGltfQotCi1cdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxzdWJzZWN0aW9ue1Byb2Nlc3MgTWFuYWdlbWVudCBcbGFiZWx7b3MtcHJvY2Vzc319Ci0KLVRoZXNlIGZ1bmN0aW9ucyBtYXkgYmUgdXNlZCB0byBjcmVhdGUgYW5kIG1hbmFnZSBwcm9jZXNzZXMuCi0KLVRoZSB2YXJpb3VzIFxmdW5jdGlvbntleGVjKigpfSBmdW5jdGlvbnMgdGFrZSBhIGxpc3Qgb2YgYXJndW1lbnRzIGZvcgotdGhlIG5ldyBwcm9ncmFtIGxvYWRlZCBpbnRvIHRoZSBwcm9jZXNzLiAgSW4gZWFjaCBjYXNlLCB0aGUgZmlyc3Qgb2YKLXRoZXNlIGFyZ3VtZW50cyBpcyBwYXNzZWQgdG8gdGhlIG5ldyBwcm9ncmFtIGFzIGl0cyBvd24gbmFtZSByYXRoZXIKLXRoYW4gYXMgYW4gYXJndW1lbnQgYSB1c2VyIG1heSBoYXZlIHR5cGVkIG9uIGEgY29tbWFuZCBsaW5lLiAgRm9yIHRoZQotQyBwcm9ncmFtbWVyLCB0aGlzIGlzIHRoZSBcY29kZXthcmd2WzBdfSBwYXNzZWQgdG8gYSBwcm9ncmFtJ3MKLVxjZnVuY3Rpb257bWFpbigpfS4gIEZvciBleGFtcGxlLCBcc2FtcHtvcy5leGVjdignL2Jpbi9lY2hvJywgWydmb28nLAotJ2JhciddKX0gd2lsbCBvbmx5IHByaW50IFxzYW1we2Jhcn0gb24gc3RhbmRhcmQgb3V0cHV0OyBcc2FtcHtmb299Ci13aWxsIHNlZW0gdG8gYmUgaWdub3JlZC4KLQotCi1cYmVnaW57ZnVuY2Rlc2N9e2Fib3J0fXt9Ci1HZW5lcmF0ZSBhIFxjb25zdGFudHtTSUdBQlJUfSBzaWduYWwgdG8gdGhlIGN1cnJlbnQgcHJvY2Vzcy4gIE9uCi1cVU5JWCwgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcHJvZHVjZSBhIGNvcmUgZHVtcDsgb24gV2luZG93cywgdGhlCi1wcm9jZXNzIGltbWVkaWF0ZWx5IHJldHVybnMgYW4gZXhpdCBjb2RlIG9mIFxjb2RlezN9LiAgQmUgYXdhcmUgdGhhdAotcHJvZ3JhbXMgd2hpY2ggdXNlIFxmdW5jdGlvbntzaWduYWwuc2lnbmFsKCl9IHRvIHJlZ2lzdGVyIGEgaGFuZGxlcgotZm9yIFxjb25zdGFudHtTSUdBQlJUfSB3aWxsIGJlaGF2ZSBkaWZmZXJlbnRseS4KLUF2YWlsYWJpbGl0eTogTWFjaW50b3NoLCBcVU5JWCwgV2luZG93cy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZXhlY2x9e3BhdGgsIGFyZzAsIGFyZzEsIFxtb3JlYXJnc30KLVxmdW5jbGluZXtleGVjbGV9e3BhdGgsIGFyZzAsIGFyZzEsIFxtb3JlYXJncywgZW52fQotXGZ1bmNsaW5le2V4ZWNscH17ZmlsZSwgYXJnMCwgYXJnMSwgXG1vcmVhcmdzfQotXGZ1bmNsaW5le2V4ZWNscGV9e2ZpbGUsIGFyZzAsIGFyZzEsIFxtb3JlYXJncywgZW52fQotXGZ1bmNsaW5le2V4ZWN2fXtwYXRoLCBhcmdzfQotXGZ1bmNsaW5le2V4ZWN2ZX17cGF0aCwgYXJncywgZW52fQotXGZ1bmNsaW5le2V4ZWN2cH17ZmlsZSwgYXJnc30KLVxmdW5jbGluZXtleGVjdnBlfXtmaWxlLCBhcmdzLCBlbnZ9Ci1UaGVzZSBmdW5jdGlvbnMgYWxsIGV4ZWN1dGUgYSBuZXcgcHJvZ3JhbSwgcmVwbGFjaW5nIHRoZSBjdXJyZW50Ci1wcm9jZXNzOyB0aGV5IGRvIG5vdCByZXR1cm4uICBPbiBcVU5JWCwgdGhlIG5ldyBleGVjdXRhYmxlIGlzIGxvYWRlZAotaW50byB0aGUgY3VycmVudCBwcm9jZXNzLCBhbmQgd2lsbCBoYXZlIHRoZSBzYW1lIHByb2Nlc3MgSUQgYXMgdGhlCi1jYWxsZXIuICBFcnJvcnMgd2lsbCBiZSByZXBvcnRlZCBhcyBcZXhjZXB0aW9ue09TRXJyb3J9IGV4Y2VwdGlvbnMuCi0KLVRoZSBcY2hhcmFjdGVye2x9IGFuZCBcY2hhcmFjdGVye3Z9IHZhcmlhbnRzIG9mIHRoZQotXGZ1bmN0aW9ue2V4ZWMqKCl9IGZ1bmN0aW9ucyBkaWZmZXIgaW4gaG93IGNvbW1hbmQtbGluZSBhcmd1bWVudHMgYXJlCi1wYXNzZWQuICBUaGUgXGNoYXJhY3RlcntsfSB2YXJpYW50cyBhcmUgcGVyaGFwcyB0aGUgZWFzaWVzdCB0byB3b3JrCi13aXRoIGlmIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBpcyBmaXhlZCB3aGVuIHRoZSBjb2RlIGlzIHdyaXR0ZW47Ci10aGUgaW5kaXZpZHVhbCBwYXJhbWV0ZXJzIHNpbXBseSBiZWNvbWUgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHRvIHRoZQotXGZ1bmN0aW9ue2V4ZWNsKigpfSBmdW5jdGlvbnMuICBUaGUgXGNoYXJhY3Rlcnt2fSB2YXJpYW50cyBhcmUgZ29vZAotd2hlbiB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgaXMgdmFyaWFibGUsIHdpdGggdGhlIGFyZ3VtZW50cyBiZWluZwotcGFzc2VkIGluIGEgbGlzdCBvciB0dXBsZSBhcyB0aGUgXHZhcnthcmdzfSBwYXJhbWV0ZXIuICBJbiBlaXRoZXIKLWNhc2UsIHRoZSBhcmd1bWVudHMgdG8gdGhlIGNoaWxkIHByb2Nlc3Mgc2hvdWxkIHN0YXJ0IHdpdGggdGhlIG5hbWUgb2YKLXRoZSBjb21tYW5kIGJlaW5nIHJ1biwgYnV0IHRoaXMgaXMgbm90IGVuZm9yY2VkLgotCi1UaGUgdmFyaWFudHMgd2hpY2ggaW5jbHVkZSBhIFxjaGFyYWN0ZXJ7cH0gbmVhciB0aGUgZW5kCi0oXGZ1bmN0aW9ue2V4ZWNscCgpfSwgXGZ1bmN0aW9ue2V4ZWNscGUoKX0sIFxmdW5jdGlvbntleGVjdnAoKX0sCi1hbmQgXGZ1bmN0aW9ue2V4ZWN2cGUoKX0pIHdpbGwgdXNlIHRoZSBcZW52dmFye1BBVEh9IGVudmlyb25tZW50Ci12YXJpYWJsZSB0byBsb2NhdGUgdGhlIHByb2dyYW0gXHZhcntmaWxlfS4gIFdoZW4gdGhlIGVudmlyb25tZW50IGlzCi1iZWluZyByZXBsYWNlZCAodXNpbmcgb25lIG9mIHRoZSBcZnVuY3Rpb257ZXhlYyplKCl9IHZhcmlhbnRzLAotZGlzY3Vzc2VkIGluIHRoZSBuZXh0IHBhcmFncmFwaCksIHRoZQotbmV3IGVudmlyb25tZW50IGlzIHVzZWQgYXMgdGhlIHNvdXJjZSBvZiB0aGUgXGVudnZhcntQQVRIfSB2YXJpYWJsZS4KLVRoZSBvdGhlciB2YXJpYW50cywgXGZ1bmN0aW9ue2V4ZWNsKCl9LCBcZnVuY3Rpb257ZXhlY2xlKCl9LAotXGZ1bmN0aW9ue2V4ZWN2KCl9LCBhbmQgXGZ1bmN0aW9ue2V4ZWN2ZSgpfSwgd2lsbCBub3QgdXNlIHRoZQotXGVudnZhcntQQVRIfSB2YXJpYWJsZSB0byBsb2NhdGUgdGhlIGV4ZWN1dGFibGU7IFx2YXJ7cGF0aH0gbXVzdAotY29udGFpbiBhbiBhcHByb3ByaWF0ZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBwYXRoLgotCi1Gb3IgXGZ1bmN0aW9ue2V4ZWNsZSgpfSwgXGZ1bmN0aW9ue2V4ZWNscGUoKX0sIFxmdW5jdGlvbntleGVjdmUoKX0sCi1hbmQgXGZ1bmN0aW9ue2V4ZWN2cGUoKX0gKG5vdGUgdGhhdCB0aGVzZSBhbGwgZW5kIGluIFxjaGFyYWN0ZXJ7ZX0pLAotdGhlIFx2YXJ7ZW52fSBwYXJhbWV0ZXIgbXVzdCBiZSBhIG1hcHBpbmcgd2hpY2ggaXMgdXNlZCB0byBkZWZpbmUgdGhlCi1lbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHRoZSBuZXcgcHJvY2VzczsgdGhlIFxmdW5jdGlvbntleGVjbCgpfSwKLVxmdW5jdGlvbntleGVjbHAoKX0sIFxmdW5jdGlvbntleGVjdigpfSwgYW5kIFxmdW5jdGlvbntleGVjdnAoKX0KLWFsbCBjYXVzZSB0aGUgbmV3IHByb2Nlc3MgdG8gaW5oZXJpdCB0aGUgZW52aXJvbm1lbnQgb2YgdGhlIGN1cnJlbnQKLXByb2Nlc3MuCi1BdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgXFVOSVgsIFdpbmRvd3MuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e19leGl0fXtufQotRXhpdCB0byB0aGUgc3lzdGVtIHdpdGggc3RhdHVzIFx2YXJ7bn0sIHdpdGhvdXQgY2FsbGluZyBjbGVhbnVwCi1oYW5kbGVycywgZmx1c2hpbmcgc3RkaW8gYnVmZmVycywgZXRjLgotQXZhaWxhYmlsaXR5OiBNYWNpbnRvc2gsIFxVTklYLCBXaW5kb3dzLgotCi1cYmVnaW57bm90aWNlfQotVGhlIHN0YW5kYXJkIHdheSB0byBleGl0IGlzIFxjb2Rle3N5cy5leGl0KFx2YXJ7bn0pfS4KLVxmdW5jdGlvbntfZXhpdCgpfSBzaG91bGQgbm9ybWFsbHkgb25seSBiZSB1c2VkIGluIHRoZSBjaGlsZCBwcm9jZXNzCi1hZnRlciBhIFxmdW5jdGlvbntmb3JrKCl9LgotXGVuZHtub3RpY2V9Ci1cZW5ke2Z1bmNkZXNjfQotCi1UaGUgZm9sbG93aW5nIGV4aXQgY29kZXMgYXJlIGEgZGVmaW5lZCwgYW5kIGNhbiBiZSB1c2VkIHdpdGgKLVxmdW5jdGlvbntfZXhpdCgpfSwgYWx0aG91Z2ggdGhleSBhcmUgbm90IHJlcXVpcmVkLiAgVGhlc2UgYXJlCi10eXBpY2FsbHkgdXNlZCBmb3Igc3lzdGVtIHByb2dyYW1zIHdyaXR0ZW4gaW4gUHl0aG9uLCBzdWNoIGFzIGEKLW1haWwgc2VydmVyJ3MgZXh0ZXJuYWwgY29tbWFuZCBkZWxpdmVyeSBwcm9ncmFtLgotXG5vdGV7U29tZSBvZiB0aGVzZSBtYXkgbm90IGJlIGF2YWlsYWJsZSBvbiBhbGwgXFVOSVh7fSBwbGF0Zm9ybXMsCi1zaW5jZSB0aGVyZSBpcyBzb21lIHZhcmlhdGlvbi4gIFRoZXNlIGNvbnN0YW50cyBhcmUgZGVmaW5lZCB3aGVyZSB0aGV5Ci1hcmUgZGVmaW5lZCBieSB0aGUgdW5kZXJseWluZyBwbGF0Zm9ybS59Ci0KLVxiZWdpbntkYXRhZGVzY317RVhfT0t9Ci1FeGl0IGNvZGUgdGhhdCBtZWFucyBubyBlcnJvciBvY2N1cnJlZC4KLUF2YWlsYWJpbGl0eTogTWFjaW50b3NoLCBcVU5JWC4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtFWF9VU0FHRX0KLUV4aXQgY29kZSB0aGF0IG1lYW5zIHRoZSBjb21tYW5kIHdhcyB1c2VkIGluY29ycmVjdGx5LCBzdWNoIGFzIHdoZW4KLXRoZSB3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIGFyZSBnaXZlbi4KLUF2YWlsYWJpbGl0eTogTWFjaW50b3NoLCBcVU5JWC4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtFWF9EQVRBRVJSfQotRXhpdCBjb2RlIHRoYXQgbWVhbnMgdGhlIGlucHV0IGRhdGEgd2FzIGluY29ycmVjdC4KLUF2YWlsYWJpbGl0eTogTWFjaW50b3NoLCBcVU5JWC4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtFWF9OT0lOUFVUfQotRXhpdCBjb2RlIHRoYXQgbWVhbnMgYW4gaW5wdXQgZmlsZSBkaWQgbm90IGV4aXN0IG9yIHdhcyBub3QgcmVhZGFibGUuCi1BdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgXFVOSVguCi1cdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317RVhfTk9VU0VSfQotRXhpdCBjb2RlIHRoYXQgbWVhbnMgYSBzcGVjaWZpZWQgdXNlciBkaWQgbm90IGV4aXN0LgotQXZhaWxhYmlsaXR5OiBNYWNpbnRvc2gsIFxVTklYLgotXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e0VYX05PSE9TVH0KLUV4aXQgY29kZSB0aGF0IG1lYW5zIGEgc3BlY2lmaWVkIGhvc3QgZGlkIG5vdCBleGlzdC4KLUF2YWlsYWJpbGl0eTogTWFjaW50b3NoLCBcVU5JWC4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtFWF9VTkFWQUlMQUJMRX0KLUV4aXQgY29kZSB0aGF0IG1lYW5zIHRoYXQgYSByZXF1aXJlZCBzZXJ2aWNlIGlzIHVuYXZhaWxhYmxlLgotQXZhaWxhYmlsaXR5OiBNYWNpbnRvc2gsIFxVTklYLgotXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e0VYX1NPRlRXQVJFfQotRXhpdCBjb2RlIHRoYXQgbWVhbnMgYW4gaW50ZXJuYWwgc29mdHdhcmUgZXJyb3Igd2FzIGRldGVjdGVkLgotQXZhaWxhYmlsaXR5OiBNYWNpbnRvc2gsIFxVTklYLgotXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e0VYX09TRVJSfQotRXhpdCBjb2RlIHRoYXQgbWVhbnMgYW4gb3BlcmF0aW5nIHN5c3RlbSBlcnJvciB3YXMgZGV0ZWN0ZWQsIHN1Y2ggYXMKLXRoZSBpbmFiaWxpdHkgdG8gZm9yayBvciBjcmVhdGUgYSBwaXBlLgotQXZhaWxhYmlsaXR5OiBNYWNpbnRvc2gsIFxVTklYLgotXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e0VYX09TRklMRX0KLUV4aXQgY29kZSB0aGF0IG1lYW5zIHNvbWUgc3lzdGVtIGZpbGUgZGlkIG5vdCBleGlzdCwgY291bGQgbm90IGJlCi1vcGVuZWQsIG9yIGhhZCBzb21lIG90aGVyIGtpbmQgb2YgZXJyb3IuCi1BdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgXFVOSVguCi1cdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317RVhfQ0FOVENSRUFUfQotRXhpdCBjb2RlIHRoYXQgbWVhbnMgYSB1c2VyIHNwZWNpZmllZCBvdXRwdXQgZmlsZSBjb3VsZCBub3QgYmUgY3JlYXRlZC4KLUF2YWlsYWJpbGl0eTogTWFjaW50b3NoLCBcVU5JWC4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtFWF9JT0VSUn0KLUV4aXQgY29kZSB0aGF0IG1lYW5zIHRoYXQgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgZG9pbmcgSS9PIG9uIHNvbWUgZmlsZS4KLUF2YWlsYWJpbGl0eTogTWFjaW50b3NoLCBcVU5JWC4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtFWF9URU1QRkFJTH0KLUV4aXQgY29kZSB0aGF0IG1lYW5zIGEgdGVtcG9yYXJ5IGZhaWx1cmUgb2NjdXJyZWQuICBUaGlzIGluZGljYXRlcwotc29tZXRoaW5nIHRoYXQgbWF5IG5vdCByZWFsbHkgYmUgYW4gZXJyb3IsIHN1Y2ggYXMgYSBuZXR3b3JrCi1jb25uZWN0aW9uIHRoYXQgY291bGRuJ3QgYmUgbWFkZSBkdXJpbmcgYSByZXRyeWFibGUgb3BlcmF0aW9uLgotQXZhaWxhYmlsaXR5OiBNYWNpbnRvc2gsIFxVTklYLgotXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e0VYX1BST1RPQ09MfQotRXhpdCBjb2RlIHRoYXQgbWVhbnMgdGhhdCBhIHByb3RvY29sIGV4Y2hhbmdlIHdhcyBpbGxlZ2FsLCBpbnZhbGlkLCBvcgotbm90IHVuZGVyc3Rvb2QuCi1BdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgXFVOSVguCi1cdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317RVhfTk9QRVJNfQotRXhpdCBjb2RlIHRoYXQgbWVhbnMgdGhhdCB0aGVyZSB3ZXJlIGluc3VmZmljaWVudCBwZXJtaXNzaW9ucyB0bwotcGVyZm9ybSB0aGUgb3BlcmF0aW9uIChidXQgbm90IGludGVuZGVkIGZvciBmaWxlIHN5c3RlbSBwcm9ibGVtcykuCi1BdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgXFVOSVguCi1cdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317RVhfQ09ORklHfQotRXhpdCBjb2RlIHRoYXQgbWVhbnMgdGhhdCBzb21lIGtpbmQgb2YgY29uZmlndXJhdGlvbiBlcnJvciBvY2N1cnJlZC4KLUF2YWlsYWJpbGl0eTogTWFjaW50b3NoLCBcVU5JWC4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtFWF9OT1RGT1VORH0KLUV4aXQgY29kZSB0aGF0IG1lYW5zIHNvbWV0aGluZyBsaWtlIGBgYW4gZW50cnkgd2FzIG5vdCBmb3VuZCcnLgotQXZhaWxhYmlsaXR5OiBNYWNpbnRvc2gsIFxVTklYLgotXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2Zvcmt9e30KLUZvcmsgYSBjaGlsZCBwcm9jZXNzLiAgUmV0dXJuIFxjb2RlezB9IGluIHRoZSBjaGlsZCwgdGhlIGNoaWxkJ3MKLXByb2Nlc3MgaWQgaW4gdGhlIHBhcmVudC4KLUF2YWlsYWJpbGl0eTogTWFjaW50b3NoLCBcVU5JWC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Zm9ya3B0eX17fQotRm9yayBhIGNoaWxkIHByb2Nlc3MsIHVzaW5nIGEgbmV3IHBzZXVkby10ZXJtaW5hbCBhcyB0aGUgY2hpbGQncwotY29udHJvbGxpbmcgdGVybWluYWwuIFJldHVybiBhIHBhaXIgb2YgXGNvZGV7KFx2YXJ7cGlkfSwgXHZhcntmZH0pfSwKLXdoZXJlIFx2YXJ7cGlkfSBpcyBcY29kZXswfSBpbiB0aGUgY2hpbGQsIHRoZSBuZXcgY2hpbGQncyBwcm9jZXNzIGlkCi1pbiB0aGUgcGFyZW50LCBhbmQgXHZhcntmZH0gaXMgdGhlIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgbWFzdGVyIGVuZAotb2YgdGhlIHBzZXVkby10ZXJtaW5hbC4gIEZvciBhIG1vcmUgcG9ydGFibGUgYXBwcm9hY2gsIHVzZSB0aGUKLVxyZWZtb2R1bGV7cHR5fSBtb2R1bGUuCi1BdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgU29tZSBmbGF2b3JzIG9mIFxVTklYLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtraWxsfXtwaWQsIHNpZ30KLVxpbmRleHtwcm9jZXNzIWtpbGxpbmd9Ci1caW5kZXh7cHJvY2VzcyFzaWduYWxsaW5nfQotU2VuZCBzaWduYWwgXHZhcntzaWd9IHRvIHRoZSBwcm9jZXNzIFx2YXJ7cGlkfS4gIENvbnN0YW50cyBmb3IgdGhlCi1zcGVjaWZpYyBzaWduYWxzIGF2YWlsYWJsZSBvbiB0aGUgaG9zdCBwbGF0Zm9ybSBhcmUgZGVmaW5lZCBpbiB0aGUKLVxyZWZtb2R1bGV7c2lnbmFsfSBtb2R1bGUuCi1BdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgXFVOSVguCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2tpbGxwZ317cGdpZCwgc2lnfQotXGluZGV4e3Byb2Nlc3Mha2lsbGluZ30KLVxpbmRleHtwcm9jZXNzIXNpZ25hbGxpbmd9Ci1TZW5kIHRoZSBzaWduYWwgXHZhcntzaWd9IHRvIHRoZSBwcm9jZXNzIGdyb3VwIFx2YXJ7cGdpZH0uCi1BdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgXFVOSVguCi1cdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bmljZX17aW5jcmVtZW50fQotQWRkIFx2YXJ7aW5jcmVtZW50fSB0byB0aGUgcHJvY2VzcydzIGBgbmljZW5lc3MnJy4gIFJldHVybiB0aGUgbmV3Ci1uaWNlbmVzcy4KLUF2YWlsYWJpbGl0eTogTWFjaW50b3NoLCBcVU5JWC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cGxvY2t9e29wfQotTG9jayBwcm9ncmFtIHNlZ21lbnRzIGludG8gbWVtb3J5LiAgVGhlIHZhbHVlIG9mIFx2YXJ7b3B9Ci0oZGVmaW5lZCBpbiBcY29kZXs8c3lzL2xvY2suaD59KSBkZXRlcm1pbmVzIHdoaWNoIHNlZ21lbnRzIGFyZSBsb2NrZWQuCi1BdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgXFVOSVguCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2NuaX17cG9wZW59e1x1bnNwZWNpZmllZH0KLVJ1biBjaGlsZCBwcm9jZXNzZXMsIHJldHVybmluZyBvcGVuZWQgcGlwZXMgZm9yIGNvbW11bmljYXRpb25zLiAgVGhlc2UKLWZ1bmN0aW9ucyBhcmUgZGVzY3JpYmVkIGluIHNlY3Rpb24gXHJlZntvcy1uZXdzdHJlYW1zfS4KLVxlbmR7ZnVuY2Rlc2NuaX0KLQotXGJlZ2lue2Z1bmNkZXNjfXtzcGF3bmx9e21vZGUsIHBhdGgsIFxtb3JlYXJnc30KLVxmdW5jbGluZXtzcGF3bmxlfXttb2RlLCBwYXRoLCBcbW9yZWFyZ3MsIGVudn0KLVxmdW5jbGluZXtzcGF3bmxwfXttb2RlLCBmaWxlLCBcbW9yZWFyZ3N9Ci1cZnVuY2xpbmV7c3Bhd25scGV9e21vZGUsIGZpbGUsIFxtb3JlYXJncywgZW52fQotXGZ1bmNsaW5le3NwYXdudn17bW9kZSwgcGF0aCwgYXJnc30KLVxmdW5jbGluZXtzcGF3bnZlfXttb2RlLCBwYXRoLCBhcmdzLCBlbnZ9Ci1cZnVuY2xpbmV7c3Bhd252cH17bW9kZSwgZmlsZSwgYXJnc30KLVxmdW5jbGluZXtzcGF3bnZwZX17bW9kZSwgZmlsZSwgYXJncywgZW52fQotRXhlY3V0ZSB0aGUgcHJvZ3JhbSBcdmFye3BhdGh9IGluIGEgbmV3IHByb2Nlc3MuICAKLQotKE5vdGUgdGhhdCB0aGUgXG1vZHVsZXtzdWJwcm9jZXNzfSBtb2R1bGUgcHJvdmlkZXMgbW9yZSBwb3dlcmZ1bAotZmFjaWxpdGllcyBmb3Igc3Bhd25pbmcgbmV3IHByb2Nlc3NlcyBhbmQgcmV0cmlldmluZyB0aGVpciByZXN1bHRzOwotdXNpbmcgdGhhdCBtb2R1bGUgaXMgcHJlZmVyYWJsZSB0byB1c2luZyB0aGVzZSBmdW5jdGlvbnMuKQotCi1JZiBcdmFye21vZGV9IGlzCi1cY29uc3RhbnR7UF9OT1dBSVR9LCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHByb2Nlc3MgSUQgb2YgdGhlIG5ldwotcHJvY2VzczsgaWYgXHZhcnttb2RlfSBpcyBcY29uc3RhbnR7UF9XQUlUfSwgcmV0dXJucyB0aGUgcHJvY2VzcydzCi1leGl0IGNvZGUgaWYgaXQgZXhpdHMgbm9ybWFsbHksIG9yIFxjb2Rley1cdmFye3NpZ25hbH19LCB3aGVyZQotXHZhcntzaWduYWx9IGlzIHRoZSBzaWduYWwgdGhhdCBraWxsZWQgdGhlIHByb2Nlc3MuICBPbiBXaW5kb3dzLCB0aGUKLXByb2Nlc3MgSUQgd2lsbCBhY3R1YWxseSBiZSB0aGUgcHJvY2VzcyBoYW5kbGUsIHNvIGNhbiBiZSB1c2VkIHdpdGgKLXRoZSBcZnVuY3Rpb257d2FpdHBpZCgpfSBmdW5jdGlvbi4KLQotVGhlIFxjaGFyYWN0ZXJ7bH0gYW5kIFxjaGFyYWN0ZXJ7dn0gdmFyaWFudHMgb2YgdGhlCi1cZnVuY3Rpb257c3Bhd24qKCl9IGZ1bmN0aW9ucyBkaWZmZXIgaW4gaG93IGNvbW1hbmQtbGluZSBhcmd1bWVudHMgYXJlCi1wYXNzZWQuICBUaGUgXGNoYXJhY3RlcntsfSB2YXJpYW50cyBhcmUgcGVyaGFwcyB0aGUgZWFzaWVzdCB0byB3b3JrCi13aXRoIGlmIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBpcyBmaXhlZCB3aGVuIHRoZSBjb2RlIGlzIHdyaXR0ZW47Ci10aGUgaW5kaXZpZHVhbCBwYXJhbWV0ZXJzIHNpbXBseSBiZWNvbWUgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHRvIHRoZQotXGZ1bmN0aW9ue3NwYXdubCooKX0gZnVuY3Rpb25zLiAgVGhlIFxjaGFyYWN0ZXJ7dn0gdmFyaWFudHMgYXJlIGdvb2QKLXdoZW4gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGlzIHZhcmlhYmxlLCB3aXRoIHRoZSBhcmd1bWVudHMgYmVpbmcKLXBhc3NlZCBpbiBhIGxpc3Qgb3IgdHVwbGUgYXMgdGhlIFx2YXJ7YXJnc30gcGFyYW1ldGVyLiAgSW4gZWl0aGVyCi1jYXNlLCB0aGUgYXJndW1lbnRzIHRvIHRoZSBjaGlsZCBwcm9jZXNzIG11c3Qgc3RhcnQgd2l0aCB0aGUgbmFtZSBvZgotdGhlIGNvbW1hbmQgYmVpbmcgcnVuLgotCi1UaGUgdmFyaWFudHMgd2hpY2ggaW5jbHVkZSBhIHNlY29uZCBcY2hhcmFjdGVye3B9IG5lYXIgdGhlIGVuZAotKFxmdW5jdGlvbntzcGF3bmxwKCl9LCBcZnVuY3Rpb257c3Bhd25scGUoKX0sIFxmdW5jdGlvbntzcGF3bnZwKCl9LAotYW5kIFxmdW5jdGlvbntzcGF3bnZwZSgpfSkgd2lsbCB1c2UgdGhlIFxlbnZ2YXJ7UEFUSH0gZW52aXJvbm1lbnQKLXZhcmlhYmxlIHRvIGxvY2F0ZSB0aGUgcHJvZ3JhbSBcdmFye2ZpbGV9LiAgV2hlbiB0aGUgZW52aXJvbm1lbnQgaXMKLWJlaW5nIHJlcGxhY2VkICh1c2luZyBvbmUgb2YgdGhlIFxmdW5jdGlvbntzcGF3biplKCl9IHZhcmlhbnRzLAotZGlzY3Vzc2VkIGluIHRoZSBuZXh0IHBhcmFncmFwaCksIHRoZSBuZXcgZW52aXJvbm1lbnQgaXMgdXNlZCBhcyB0aGUKLXNvdXJjZSBvZiB0aGUgXGVudnZhcntQQVRIfSB2YXJpYWJsZS4gIFRoZSBvdGhlciB2YXJpYW50cywKLVxmdW5jdGlvbntzcGF3bmwoKX0sIFxmdW5jdGlvbntzcGF3bmxlKCl9LCBcZnVuY3Rpb257c3Bhd252KCl9LCBhbmQKLVxmdW5jdGlvbntzcGF3bnZlKCl9LCB3aWxsIG5vdCB1c2UgdGhlIFxlbnZ2YXJ7UEFUSH0gdmFyaWFibGUgdG8KLWxvY2F0ZSB0aGUgZXhlY3V0YWJsZTsgXHZhcntwYXRofSBtdXN0IGNvbnRhaW4gYW4gYXBwcm9wcmlhdGUgYWJzb2x1dGUKLW9yIHJlbGF0aXZlIHBhdGguCi0KLUZvciBcZnVuY3Rpb257c3Bhd25sZSgpfSwgXGZ1bmN0aW9ue3NwYXdubHBlKCl9LCBcZnVuY3Rpb257c3Bhd252ZSgpfSwKLWFuZCBcZnVuY3Rpb257c3Bhd252cGUoKX0gKG5vdGUgdGhhdCB0aGVzZSBhbGwgZW5kIGluIFxjaGFyYWN0ZXJ7ZX0pLAotdGhlIFx2YXJ7ZW52fSBwYXJhbWV0ZXIgbXVzdCBiZSBhIG1hcHBpbmcgd2hpY2ggaXMgdXNlZCB0byBkZWZpbmUgdGhlCi1lbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHRoZSBuZXcgcHJvY2VzczsgdGhlIFxmdW5jdGlvbntzcGF3bmwoKX0sCi1cZnVuY3Rpb257c3Bhd25scCgpfSwgXGZ1bmN0aW9ue3NwYXdudigpfSwgYW5kIFxmdW5jdGlvbntzcGF3bnZwKCl9Ci1hbGwgY2F1c2UgdGhlIG5ldyBwcm9jZXNzIHRvIGluaGVyaXQgdGhlIGVudmlyb25tZW50IG9mIHRoZSBjdXJyZW50Ci1wcm9jZXNzLgotCi1BcyBhbiBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNhbGxzIHRvIFxmdW5jdGlvbntzcGF3bmxwKCl9IGFuZAotXGZ1bmN0aW9ue3NwYXdudnBlKCl9IGFyZSBlcXVpdmFsZW50OgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgb3MKLW9zLnNwYXdubHAob3MuUF9XQUlULCAnY3AnLCAnY3AnLCAnaW5kZXguaHRtbCcsICcvZGV2L251bGwnKQotCi1MID0gWydjcCcsICdpbmRleC5odG1sJywgJy9kZXYvbnVsbCddCi1vcy5zcGF3bnZwZShvcy5QX1dBSVQsICdjcCcsIEwsIG9zLmVudmlyb24pCi1cZW5ke3ZlcmJhdGltfQotCi1BdmFpbGFiaWxpdHk6IFxVTklYLCBXaW5kb3dzLiAgXGZ1bmN0aW9ue3NwYXdubHAoKX0sCi1cZnVuY3Rpb257c3Bhd25scGUoKX0sIFxmdW5jdGlvbntzcGF3bnZwKCl9IGFuZCBcZnVuY3Rpb257c3Bhd252cGUoKX0KLWFyZSBub3QgYXZhaWxhYmxlIG9uIFdpbmRvd3MuCi1cdmVyc2lvbmFkZGVkezEuNn0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317UF9OT1dBSVR9Ci1cZGF0YWxpbmV7UF9OT1dBSVRPfQotUG9zc2libGUgdmFsdWVzIGZvciB0aGUgXHZhcnttb2RlfSBwYXJhbWV0ZXIgdG8gdGhlIFxmdW5jdGlvbntzcGF3biooKX0KLWZhbWlseSBvZiBmdW5jdGlvbnMuICBJZiBlaXRoZXIgb2YgdGhlc2UgdmFsdWVzIGlzIGdpdmVuLCB0aGUKLVxmdW5jdGlvbntzcGF3biooKX0gZnVuY3Rpb25zIHdpbGwgcmV0dXJuIGFzIHNvb24gYXMgdGhlIG5ldyBwcm9jZXNzCi1oYXMgYmVlbiBjcmVhdGVkLCB3aXRoIHRoZSBwcm9jZXNzIElEIGFzIHRoZSByZXR1cm4gdmFsdWUuCi1BdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgXFVOSVgsIFdpbmRvd3MuCi1cdmVyc2lvbmFkZGVkezEuNn0KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317UF9XQUlUfQotUG9zc2libGUgdmFsdWUgZm9yIHRoZSBcdmFye21vZGV9IHBhcmFtZXRlciB0byB0aGUgXGZ1bmN0aW9ue3NwYXduKigpfQotZmFtaWx5IG9mIGZ1bmN0aW9ucy4gIElmIHRoaXMgaXMgZ2l2ZW4gYXMgXHZhcnttb2RlfSwgdGhlCi1cZnVuY3Rpb257c3Bhd24qKCl9IGZ1bmN0aW9ucyB3aWxsIG5vdCByZXR1cm4gdW50aWwgdGhlIG5ldyBwcm9jZXNzCi1oYXMgcnVuIHRvIGNvbXBsZXRpb24gYW5kIHdpbGwgcmV0dXJuIHRoZSBleGl0IGNvZGUgb2YgdGhlIHByb2Nlc3MgdGhlCi1ydW4gaXMgc3VjY2Vzc2Z1bCwgb3IgXGNvZGV7LVx2YXJ7c2lnbmFsfX0gaWYgYSBzaWduYWwga2lsbHMgdGhlCi1wcm9jZXNzLgotQXZhaWxhYmlsaXR5OiBNYWNpbnRvc2gsIFxVTklYLCBXaW5kb3dzLgotXHZlcnNpb25hZGRlZHsxLjZ9Ci1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1BfREVUQUNIfQotXGRhdGFsaW5le1BfT1ZFUkxBWX0KLVBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIFx2YXJ7bW9kZX0gcGFyYW1ldGVyIHRvIHRoZQotXGZ1bmN0aW9ue3NwYXduKigpfSBmYW1pbHkgb2YgZnVuY3Rpb25zLiAgVGhlc2UgYXJlIGxlc3MgcG9ydGFibGUgdGhhbgotdGhvc2UgbGlzdGVkIGFib3ZlLgotXGNvbnN0YW50e1BfREVUQUNIfSBpcyBzaW1pbGFyIHRvIFxjb25zdGFudHtQX05PV0FJVH0sIGJ1dCB0aGUgbmV3Ci1wcm9jZXNzIGlzIGRldGFjaGVkIGZyb20gdGhlIGNvbnNvbGUgb2YgdGhlIGNhbGxpbmcgcHJvY2Vzcy4KLUlmIFxjb25zdGFudHtQX09WRVJMQVl9IGlzIHVzZWQsIHRoZSBjdXJyZW50IHByb2Nlc3Mgd2lsbCBiZSByZXBsYWNlZDsKLXRoZSBcZnVuY3Rpb257c3Bhd24qKCl9IGZ1bmN0aW9uIHdpbGwgbm90IHJldHVybi4KLUF2YWlsYWJpbGl0eTogV2luZG93cy4KLVx2ZXJzaW9uYWRkZWR7MS42fQotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzdGFydGZpbGV9e3BhdGhcb3B0aW9uYWx7LCBvcGVyYXRpb259fQotU3RhcnQgYSBmaWxlIHdpdGggaXRzIGFzc29jaWF0ZWQgYXBwbGljYXRpb24uCi0KLVdoZW4gXHZhcntvcGVyYXRpb259IGlzIG5vdCBzcGVjaWZpZWQgb3IgXGNvZGV7J29wZW4nfSwgdGhpcyBhY3RzIGxpa2UKLWRvdWJsZS1jbGlja2luZyB0aGUgZmlsZSBpbiBXaW5kb3dzIEV4cGxvcmVyLCBvciBnaXZpbmcgdGhlIGZpbGUgbmFtZQotYXMgYW4gYXJndW1lbnQgdG8gdGhlIFxwcm9ncmFte3N0YXJ0fSBjb21tYW5kIGZyb20gdGhlIGludGVyYWN0aXZlCi1jb21tYW5kIHNoZWxsOiB0aGUgZmlsZSBpcyBvcGVuZWQgd2l0aCB3aGF0ZXZlciBhcHBsaWNhdGlvbiAoaWYgYW55KQotaXRzIGV4dGVuc2lvbiBpcyBhc3NvY2lhdGVkLgotCi1XaGVuIGFub3RoZXIgXHZhcntvcGVyYXRpb259IGlzIGdpdmVuLCBpdCBtdXN0IGJlIGEgYGBjb21tYW5kIHZlcmInJwotdGhhdCBzcGVjaWZpZXMgd2hhdCBzaG91bGQgYmUgZG9uZSB3aXRoIHRoZSBmaWxlLgotQ29tbW9uIHZlcmJzIGRvY3VtZW50ZWQgYnkgTWljcm9zb2Z0IGFyZSBcY29kZXsncHJpbnQnfSBhbmQgCi1cY29kZXsnZWRpdCd9ICh0byBiZSB1c2VkIG9uIGZpbGVzKSBhcyB3ZWxsIGFzIFxjb2RleydleHBsb3JlJ30gYW5kCi1cY29kZXsnZmluZCd9ICh0byBiZSB1c2VkIG9uIGRpcmVjdG9yaWVzKS4KLQotXGZ1bmN0aW9ue3N0YXJ0ZmlsZSgpfSByZXR1cm5zIGFzIHNvb24gYXMgdGhlIGFzc29jaWF0ZWQgYXBwbGljYXRpb24KLWlzIGxhdW5jaGVkLiAgVGhlcmUgaXMgbm8gb3B0aW9uIHRvIHdhaXQgZm9yIHRoZSBhcHBsaWNhdGlvbiB0byBjbG9zZSwKLWFuZCBubyB3YXkgdG8gcmV0cmlldmUgdGhlIGFwcGxpY2F0aW9uJ3MgZXhpdCBzdGF0dXMuICBUaGUgXHZhcntwYXRofQotcGFyYW1ldGVyIGlzIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIElmIHlvdSB3YW50IHRvIHVzZSBhbgotYWJzb2x1dGUgcGF0aCwgbWFrZSBzdXJlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgbm90IGEgc2xhc2gKLShcY2hhcmFjdGVyey99KTsgdGhlIHVuZGVybHlpbmcgV2luMzIgXGNmdW5jdGlvbntTaGVsbEV4ZWN1dGUoKX0KLWZ1bmN0aW9uIGRvZXNuJ3Qgd29yayBpZiBpdCBpcy4gIFVzZSB0aGUgXGZ1bmN0aW9ue29zLnBhdGgubm9ybXBhdGgoKX0KLWZ1bmN0aW9uIHRvIGVuc3VyZSB0aGF0IHRoZSBwYXRoIGlzIHByb3Blcmx5IGVuY29kZWQgZm9yIFdpbjMyLgotQXZhaWxhYmlsaXR5OiBXaW5kb3dzLgotXHZlcnNpb25hZGRlZHsyLjB9Ci1cdmVyc2lvbmFkZGVkW1RoZSBcdmFye29wZXJhdGlvbn0gcGFyYW1ldGVyXXsyLjV9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3N5c3RlbX17Y29tbWFuZH0KLUV4ZWN1dGUgdGhlIGNvbW1hbmQgKGEgc3RyaW5nKSBpbiBhIHN1YnNoZWxsLiAgVGhpcyBpcyBpbXBsZW1lbnRlZCBieQotY2FsbGluZyB0aGUgU3RhbmRhcmQgQyBmdW5jdGlvbiBcY2Z1bmN0aW9ue3N5c3RlbSgpfSwgYW5kIGhhcyB0aGUKLXNhbWUgbGltaXRhdGlvbnMuICBDaGFuZ2VzIHRvIFxjb2Rle3Bvc2l4LmVudmlyb259LCBcY29kZXtzeXMuc3RkaW59LAotZXRjLlwgYXJlIG5vdCByZWZsZWN0ZWQgaW4gdGhlIGVudmlyb25tZW50IG9mIHRoZSBleGVjdXRlZCBjb21tYW5kLgotCi1PbiBcVU5JWCwgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgZXhpdCBzdGF0dXMgb2YgdGhlIHByb2Nlc3MgZW5jb2RlZCBpbiB0aGUKLWZvcm1hdCBzcGVjaWZpZWQgZm9yIFxmdW5jdGlvbnt3YWl0KCl9LiAgTm90ZSB0aGF0IFxQT1NJWHt9IGRvZXMgbm90Ci1zcGVjaWZ5IHRoZSBtZWFuaW5nIG9mIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIEMgXGNmdW5jdGlvbntzeXN0ZW0oKX0KLWZ1bmN0aW9uLCBzbyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBQeXRob24gZnVuY3Rpb24gaXMgc3lzdGVtLWRlcGVuZGVudC4KLQotT24gV2luZG93cywgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGF0IHJldHVybmVkIGJ5IHRoZSBzeXN0ZW0gc2hlbGwgYWZ0ZXIKLXJ1bm5pbmcgXHZhcntjb21tYW5kfSwgZ2l2ZW4gYnkgdGhlIFdpbmRvd3MgZW52aXJvbm1lbnQgdmFyaWFibGUKLVxlbnZ2YXJ7Q09NU1BFQ306IG9uIFxwcm9ncmFte2NvbW1hbmQuY29tfSBzeXN0ZW1zIChXaW5kb3dzIDk1LCA5OCBhbmQgTUUpCi10aGlzIGlzIGFsd2F5cyBcY29kZXswfTsgb24gXHByb2dyYW17Y21kLmV4ZX0gc3lzdGVtcyAoV2luZG93cyBOVCwgMjAwMAotYW5kIFhQKSB0aGlzIGlzIHRoZSBleGl0IHN0YXR1cyBvZiB0aGUgY29tbWFuZCBydW47IG9uIHN5c3RlbXMgdXNpbmcKLWEgbm9uLW5hdGl2ZSBzaGVsbCwgY29uc3VsdCB5b3VyIHNoZWxsIGRvY3VtZW50YXRpb24uCi0KLUF2YWlsYWJpbGl0eTogTWFjaW50b3NoLCBcVU5JWCwgV2luZG93cy4KLQotVGhlIFxtb2R1bGV7c3VicHJvY2Vzc30gbW9kdWxlIHByb3ZpZGVzIG1vcmUgcG93ZXJmdWwgZmFjaWxpdGllcyBmb3IKLXNwYXduaW5nIG5ldyBwcm9jZXNzZXMgYW5kIHJldHJpZXZpbmcgdGhlaXIgcmVzdWx0czsgdXNpbmcgdGhhdCBtb2R1bGUKLWlzIHByZWZlcmFibGUgdG8gdXNpbmcgdGhpcyBmdW5jdGlvbi4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dGltZXN9e30KLVJldHVybiBhIDUtdHVwbGUgb2YgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBpbmRpY2F0aW5nIGFjY3VtdWxhdGVkCi0ocHJvY2Vzc29yIG9yIG90aGVyKQotdGltZXMsIGluIHNlY29uZHMuICBUaGUgaXRlbXMgYXJlOiB1c2VyIHRpbWUsIHN5c3RlbSB0aW1lLCBjaGlsZHJlbidzCi11c2VyIHRpbWUsIGNoaWxkcmVuJ3Mgc3lzdGVtIHRpbWUsIGFuZCBlbGFwc2VkIHJlYWwgdGltZSBzaW5jZSBhIGZpeGVkCi1wb2ludCBpbiB0aGUgcGFzdCwgaW4gdGhhdCBvcmRlci4gIFNlZSB0aGUgXFVOSVh7fSBtYW51YWwgcGFnZQotXG1hbnBhZ2V7dGltZXN9ezJ9IG9yIHRoZSBjb3JyZXNwb25kaW5nIFdpbmRvd3MgUGxhdGZvcm0gQVBJCi1kb2N1bWVudGF0aW9uLgotQXZhaWxhYmlsaXR5OiBNYWNpbnRvc2gsIFxVTklYLCBXaW5kb3dzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt3YWl0fXt9Ci1XYWl0IGZvciBjb21wbGV0aW9uIG9mIGEgY2hpbGQgcHJvY2VzcywgYW5kIHJldHVybiBhIHR1cGxlIGNvbnRhaW5pbmcKLWl0cyBwaWQgYW5kIGV4aXQgc3RhdHVzIGluZGljYXRpb246IGEgMTYtYml0IG51bWJlciwgd2hvc2UgbG93IGJ5dGUgaXMKLXRoZSBzaWduYWwgbnVtYmVyIHRoYXQga2lsbGVkIHRoZSBwcm9jZXNzLCBhbmQgd2hvc2UgaGlnaCBieXRlIGlzIHRoZQotZXhpdCBzdGF0dXMgKGlmIHRoZSBzaWduYWwgbnVtYmVyIGlzIHplcm8pOyB0aGUgaGlnaCBiaXQgb2YgdGhlIGxvdwotYnl0ZSBpcyBzZXQgaWYgYSBjb3JlIGZpbGUgd2FzIHByb2R1Y2VkLgotQXZhaWxhYmlsaXR5OiBNYWNpbnRvc2gsIFxVTklYLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt3YWl0cGlkfXtwaWQsIG9wdGlvbnN9Ci1UaGUgZGV0YWlscyBvZiB0aGlzIGZ1bmN0aW9uIGRpZmZlciBvbiBcVU5JWHt9IGFuZCBXaW5kb3dzLgotCi1PbiBcVU5JWDoKLVdhaXQgZm9yIGNvbXBsZXRpb24gb2YgYSBjaGlsZCBwcm9jZXNzIGdpdmVuIGJ5IHByb2Nlc3MgaWQgXHZhcntwaWR9LAotYW5kIHJldHVybiBhIHR1cGxlIGNvbnRhaW5pbmcgaXRzIHByb2Nlc3MgaWQgYW5kIGV4aXQgc3RhdHVzCi1pbmRpY2F0aW9uIChlbmNvZGVkIGFzIGZvciBcZnVuY3Rpb257d2FpdCgpfSkuICBUaGUgc2VtYW50aWNzIG9mIHRoZQotY2FsbCBhcmUgYWZmZWN0ZWQgYnkgdGhlIHZhbHVlIG9mIHRoZSBpbnRlZ2VyIFx2YXJ7b3B0aW9uc30sIHdoaWNoCi1zaG91bGQgYmUgXGNvZGV7MH0gZm9yIG5vcm1hbCBvcGVyYXRpb24uCi0KLUlmIFx2YXJ7cGlkfSBpcyBncmVhdGVyIHRoYW4gXGNvZGV7MH0sIFxmdW5jdGlvbnt3YWl0cGlkKCl9IHJlcXVlc3RzCi1zdGF0dXMgaW5mb3JtYXRpb24gZm9yIHRoYXQgc3BlY2lmaWMgcHJvY2Vzcy4gIElmIFx2YXJ7cGlkfSBpcwotXGNvZGV7MH0sIHRoZSByZXF1ZXN0IGlzIGZvciB0aGUgc3RhdHVzIG9mIGFueSBjaGlsZCBpbiB0aGUgcHJvY2VzcwotZ3JvdXAgb2YgdGhlIGN1cnJlbnQgcHJvY2Vzcy4gIElmIFx2YXJ7cGlkfSBpcyBcY29kZXstMX0sIHRoZSByZXF1ZXN0Ci1wZXJ0YWlucyB0byBhbnkgY2hpbGQgb2YgdGhlIGN1cnJlbnQgcHJvY2Vzcy4gIElmIFx2YXJ7cGlkfSBpcyBsZXNzCi10aGFuIFxjb2Rley0xfSwgc3RhdHVzIGlzIHJlcXVlc3RlZCBmb3IgYW55IHByb2Nlc3MgaW4gdGhlIHByb2Nlc3MKLWdyb3VwIFxjb2Rley1cdmFye3BpZH19ICh0aGUgYWJzb2x1dGUgdmFsdWUgb2YgXHZhcntwaWR9KS4KLQotT24gV2luZG93czoKLVdhaXQgZm9yIGNvbXBsZXRpb24gb2YgYSBwcm9jZXNzIGdpdmVuIGJ5IHByb2Nlc3MgaGFuZGxlIFx2YXJ7cGlkfSwKLWFuZCByZXR1cm4gYSB0dXBsZSBjb250YWluaW5nIFx2YXJ7cGlkfSwKLWFuZCBpdHMgZXhpdCBzdGF0dXMgc2hpZnRlZCBsZWZ0IGJ5IDggYml0cyAoc2hpZnRpbmcgbWFrZXMgY3Jvc3MtcGxhdGZvcm0KLXVzZSBvZiB0aGUgZnVuY3Rpb24gZWFzaWVyKS4KLUEgXHZhcntwaWR9IGxlc3MgdGhhbiBvciBlcXVhbCB0byBcY29kZXswfSBoYXMgbm8gc3BlY2lhbCBtZWFuaW5nIG9uCi1XaW5kb3dzLCBhbmQgcmFpc2VzIGFuIGV4Y2VwdGlvbi4KLVRoZSB2YWx1ZSBvZiBpbnRlZ2VyIFx2YXJ7b3B0aW9uc30gaGFzIG5vIGVmZmVjdC4KLVx2YXJ7cGlkfSBjYW4gcmVmZXIgdG8gYW55IHByb2Nlc3Mgd2hvc2UgaWQgaXMga25vd24sIG5vdCBuZWNlc3NhcmlseSBhCi1jaGlsZCBwcm9jZXNzLgotVGhlIFxmdW5jdGlvbntzcGF3bigpfSBmdW5jdGlvbnMgY2FsbGVkIHdpdGggXGNvbnN0YW50e1BfTk9XQUlUfQotcmV0dXJuIHN1aXRhYmxlIHByb2Nlc3MgaGFuZGxlcy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317d2FpdDN9e1xvcHRpb25hbHtvcHRpb25zfX0KLVNpbWlsYXIgdG8gXGZ1bmN0aW9ue3dhaXRwaWQoKX0sIGV4Y2VwdCBubyBwcm9jZXNzIGlkIGFyZ3VtZW50IGlzIGdpdmVuIGFuZAotYSAzLWVsZW1lbnQgdHVwbGUgY29udGFpbmluZyB0aGUgY2hpbGQncyBwcm9jZXNzIGlkLCBleGl0IHN0YXR1cyBpbmRpY2F0aW9uLAotYW5kIHJlc291cmNlIHVzYWdlIGluZm9ybWF0aW9uIGlzIHJldHVybmVkLiAgUmVmZXIgdG8KLVxtb2R1bGV7cmVzb3VyY2V9LlxmdW5jdGlvbntnZXRydXNhZ2UoKX0KLWZvciBkZXRhaWxzIG9uIHJlc291cmNlIHVzYWdlIGluZm9ybWF0aW9uLiAgVGhlIG9wdGlvbiBhcmd1bWVudCBpcyB0aGUgc2FtZQotYXMgdGhhdCBwcm92aWRlZCB0byBcZnVuY3Rpb257d2FpdHBpZCgpfSBhbmQgXGZ1bmN0aW9ue3dhaXQ0KCl9LgotQXZhaWxhYmlsaXR5OiBcVU5JWC4KLVx2ZXJzaW9uYWRkZWR7Mi41fQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt3YWl0NH17cGlkLCBvcHRpb25zfQotU2ltaWxhciB0byBcZnVuY3Rpb257d2FpdHBpZCgpfSwgZXhjZXB0IGEgMy1lbGVtZW50IHR1cGxlLCBjb250YWluaW5nIHRoZQotY2hpbGQncyBwcm9jZXNzIGlkLCBleGl0IHN0YXR1cyBpbmRpY2F0aW9uLCBhbmQgcmVzb3VyY2UgdXNhZ2UgaW5mb3JtYXRpb24KLWlzIHJldHVybmVkLiAgUmVmZXIgdG8gXG1vZHVsZXtyZXNvdXJjZX0uXGZ1bmN0aW9ue2dldHJ1c2FnZSgpfSBmb3IgZGV0YWlscwotb24gcmVzb3VyY2UgdXNhZ2UgaW5mb3JtYXRpb24uICBUaGUgYXJndW1lbnRzIHRvIFxmdW5jdGlvbnt3YWl0NCgpfSBhcmUKLXRoZSBzYW1lIGFzIHRob3NlIHByb3ZpZGVkIHRvIFxmdW5jdGlvbnt3YWl0cGlkKCl9LgotQXZhaWxhYmlsaXR5OiBcVU5JWC4KLVx2ZXJzaW9uYWRkZWR7Mi41fQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtXTk9IQU5HfQotVGhlIG9wdGlvbiBmb3IgXGZ1bmN0aW9ue3dhaXRwaWQoKX0gdG8gcmV0dXJuIGltbWVkaWF0ZWx5IGlmIG5vIGNoaWxkCi1wcm9jZXNzIHN0YXR1cyBpcyBhdmFpbGFibGUgaW1tZWRpYXRlbHkuIFRoZSBmdW5jdGlvbiByZXR1cm5zCi1cY29kZXsoMCwgMCl9IGluIHRoaXMgY2FzZS4KLUF2YWlsYWJpbGl0eTogTWFjaW50b3NoLCBcVU5JWC4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317V0NPTlRJTlVFRH0KLVRoaXMgb3B0aW9uIGNhdXNlcyBjaGlsZCBwcm9jZXNzZXMgdG8gYmUgcmVwb3J0ZWQgaWYgdGhleSBoYXZlIGJlZW4KLWNvbnRpbnVlZCBmcm9tIGEgam9iIGNvbnRyb2wgc3RvcCBzaW5jZSB0aGVpciBzdGF0dXMgd2FzIGxhc3QKLXJlcG9ydGVkLgotQXZhaWxhYmlsaXR5OiBTb21lIFxVTklYe30gc3lzdGVtcy4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtXVU5UUkFDRUR9Ci1UaGlzIG9wdGlvbiBjYXVzZXMgY2hpbGQgcHJvY2Vzc2VzIHRvIGJlIHJlcG9ydGVkIGlmIHRoZXkgaGF2ZSBiZWVuCi1zdG9wcGVkIGJ1dCB0aGVpciBjdXJyZW50IHN0YXRlIGhhcyBub3QgYmVlbiByZXBvcnRlZCBzaW5jZSB0aGV5IHdlcmUKLXN0b3BwZWQuCi1BdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgXFVOSVguCi1cdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7ZGF0YWRlc2N9Ci0KLVRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHRha2UgYSBwcm9jZXNzIHN0YXR1cyBjb2RlIGFzIHJldHVybmVkIGJ5Ci1cZnVuY3Rpb257c3lzdGVtKCl9LCBcZnVuY3Rpb257d2FpdCgpfSwgb3IgXGZ1bmN0aW9ue3dhaXRwaWQoKX0gYXMgYQotcGFyYW1ldGVyLiAgVGhleSBtYXkgYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGRpc3Bvc2l0aW9uIG9mIGEKLXByb2Nlc3MuCi0KLVxiZWdpbntmdW5jZGVzY317V0NPUkVEVU1QfXtzdGF0dXN9Ci1SZXR1cm5zIFxjb2Rle1RydWV9IGlmIGEgY29yZSBkdW1wIHdhcyBnZW5lcmF0ZWQgZm9yIHRoZSBwcm9jZXNzLAotb3RoZXJ3aXNlIGl0IHJldHVybnMgXGNvZGV7RmFsc2V9LgotQXZhaWxhYmlsaXR5OiBNYWNpbnRvc2gsIFxVTklYLgotXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e1dJRkNPTlRJTlVFRH17c3RhdHVzfQotUmV0dXJucyBcY29kZXtUcnVlfSBpZiB0aGUgcHJvY2VzcyBoYXMgYmVlbiBjb250aW51ZWQgZnJvbSBhIGpvYgotY29udHJvbCBzdG9wLCBvdGhlcndpc2UgaXQgcmV0dXJucyBcY29kZXtGYWxzZX0uCi1BdmFpbGFiaWxpdHk6IFxVTklYLgotXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e1dJRlNUT1BQRUR9e3N0YXR1c30KLVJldHVybnMgXGNvZGV7VHJ1ZX0gaWYgdGhlIHByb2Nlc3MgaGFzIGJlZW4gc3RvcHBlZCwgb3RoZXJ3aXNlIGl0Ci1yZXR1cm5zIFxjb2Rle0ZhbHNlfS4KLUF2YWlsYWJpbGl0eTogXFVOSVguCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e1dJRlNJR05BTEVEfXtzdGF0dXN9Ci1SZXR1cm5zIFxjb2Rle1RydWV9IGlmIHRoZSBwcm9jZXNzIGV4aXRlZCBkdWUgdG8gYSBzaWduYWwsIG90aGVyd2lzZQotaXQgcmV0dXJucyBcY29kZXtGYWxzZX0uCi1BdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgXFVOSVguCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e1dJRkVYSVRFRH17c3RhdHVzfQotUmV0dXJucyBcY29kZXtUcnVlfSBpZiB0aGUgcHJvY2VzcyBleGl0ZWQgdXNpbmcgdGhlIFxtYW5wYWdle2V4aXR9ezJ9Ci1zeXN0ZW0gY2FsbCwgb3RoZXJ3aXNlIGl0IHJldHVybnMgXGNvZGV7RmFsc2V9LgotQXZhaWxhYmlsaXR5OiBNYWNpbnRvc2gsIFxVTklYLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtXRVhJVFNUQVRVU317c3RhdHVzfQotSWYgXGNvZGV7V0lGRVhJVEVEKFx2YXJ7c3RhdHVzfSl9IGlzIHRydWUsIHJldHVybiB0aGUgaW50ZWdlcgotcGFyYW1ldGVyIHRvIHRoZSBcbWFucGFnZXtleGl0fXsyfSBzeXN0ZW0gY2FsbC4gIE90aGVyd2lzZSwgdGhlIHJldHVybgotdmFsdWUgaXMgbWVhbmluZ2xlc3MuCi1BdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgXFVOSVguCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e1dTVE9QU0lHfXtzdGF0dXN9Ci1SZXR1cm4gdGhlIHNpZ25hbCB3aGljaCBjYXVzZWQgdGhlIHByb2Nlc3MgdG8gc3RvcC4KLUF2YWlsYWJpbGl0eTogTWFjaW50b3NoLCBcVU5JWC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317V1RFUk1TSUd9e3N0YXR1c30KLVJldHVybiB0aGUgc2lnbmFsIHdoaWNoIGNhdXNlZCB0aGUgcHJvY2VzcyB0byBleGl0LgotQXZhaWxhYmlsaXR5OiBNYWNpbnRvc2gsIFxVTklYLgotXGVuZHtmdW5jZGVzY30KLQotCi1cc3Vic2VjdGlvbntNaXNjZWxsYW5lb3VzIFN5c3RlbSBJbmZvcm1hdGlvbiBcbGFiZWx7b3MtcGF0aH19Ci0KLQotXGJlZ2lue2Z1bmNkZXNjfXtjb25mc3RyfXtuYW1lfQotUmV0dXJuIHN0cmluZy12YWx1ZWQgc3lzdGVtIGNvbmZpZ3VyYXRpb24gdmFsdWVzLgotXHZhcntuYW1lfSBzcGVjaWZpZXMgdGhlIGNvbmZpZ3VyYXRpb24gdmFsdWUgdG8gcmV0cmlldmU7IGl0IG1heSBiZSBhCi1zdHJpbmcgd2hpY2ggaXMgdGhlIG5hbWUgb2YgYSBkZWZpbmVkIHN5c3RlbSB2YWx1ZTsgdGhlc2UgbmFtZXMgYXJlCi1zcGVjaWZpZWQgaW4gYSBudW1iZXIgb2Ygc3RhbmRhcmRzIChcUE9TSVgsIFxVTklYe30gOTUsIFxVTklYe30gOTgsIGFuZAotb3RoZXJzKS4gIFNvbWUgcGxhdGZvcm1zIGRlZmluZSBhZGRpdGlvbmFsIG5hbWVzIGFzIHdlbGwuICBUaGUgbmFtZXMKLWtub3duIHRvIHRoZSBob3N0IG9wZXJhdGluZyBzeXN0ZW0gYXJlIGdpdmVuIGFzIHRoZSBrZXlzIG9mIHRoZQotXGNvZGV7Y29uZnN0cl9uYW1lc30gZGljdGlvbmFyeS4gIEZvciBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBub3QKLWluY2x1ZGVkIGluIHRoYXQgbWFwcGluZywgcGFzc2luZyBhbiBpbnRlZ2VyIGZvciBcdmFye25hbWV9IGlzIGFsc28KLWFjY2VwdGVkLgotQXZhaWxhYmlsaXR5OiBNYWNpbnRvc2gsIFxVTklYLgotCi1JZiB0aGUgY29uZmlndXJhdGlvbiB2YWx1ZSBzcGVjaWZpZWQgYnkgXHZhcntuYW1lfSBpc24ndCBkZWZpbmVkLAotXGNvZGV7Tm9uZX0gaXMgcmV0dXJuZWQuCi0KLUlmIFx2YXJ7bmFtZX0gaXMgYSBzdHJpbmcgYW5kIGlzIG5vdCBrbm93biwgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSBpcwotcmFpc2VkLiAgSWYgYSBzcGVjaWZpYyB2YWx1ZSBmb3IgXHZhcntuYW1lfSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZQotaG9zdCBzeXN0ZW0sIGV2ZW4gaWYgaXQgaXMgaW5jbHVkZWQgaW4gXGNvZGV7Y29uZnN0cl9uYW1lc30sIGFuCi1cZXhjZXB0aW9ue09TRXJyb3J9IGlzIHJhaXNlZCB3aXRoIFxjb25zdGFudHtlcnJuby5FSU5WQUx9IGZvciB0aGUKLWVycm9yIG51bWJlci4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317Y29uZnN0cl9uYW1lc30KLURpY3Rpb25hcnkgbWFwcGluZyBuYW1lcyBhY2NlcHRlZCBieSBcZnVuY3Rpb257Y29uZnN0cigpfSB0byB0aGUKLWludGVnZXIgdmFsdWVzIGRlZmluZWQgZm9yIHRob3NlIG5hbWVzIGJ5IHRoZSBob3N0IG9wZXJhdGluZyBzeXN0ZW0uCi1UaGlzIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgc2V0IG9mIG5hbWVzIGtub3duIHRvIHRoZSBzeXN0ZW0uCi1BdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgXFVOSVguCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldGxvYWRhdmd9e30KLVJldHVybiB0aGUgbnVtYmVyIG9mIHByb2Nlc3NlcyBpbiB0aGUgc3lzdGVtIHJ1biBxdWV1ZSBhdmVyYWdlZCBvdmVyCi10aGUgbGFzdCAxLCA1LCBhbmQgMTUgbWludXRlcyBvciByYWlzZXMgXGV4Y2VwdGlvbntPU0Vycm9yfSBpZiB0aGUgbG9hZCAKLWF2ZXJhZ2Ugd2FzIHVub2J0YWluYWJsZS4KLQotXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3N5c2NvbmZ9e25hbWV9Ci1SZXR1cm4gaW50ZWdlci12YWx1ZWQgc3lzdGVtIGNvbmZpZ3VyYXRpb24gdmFsdWVzLgotSWYgdGhlIGNvbmZpZ3VyYXRpb24gdmFsdWUgc3BlY2lmaWVkIGJ5IFx2YXJ7bmFtZX0gaXNuJ3QgZGVmaW5lZCwKLVxjb2Rley0xfSBpcyByZXR1cm5lZC4gIFRoZSBjb21tZW50cyByZWdhcmRpbmcgdGhlIFx2YXJ7bmFtZX0KLXBhcmFtZXRlciBmb3IgXGZ1bmN0aW9ue2NvbmZzdHIoKX0gYXBwbHkgaGVyZSBhcyB3ZWxsOyB0aGUgZGljdGlvbmFyeQotdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiB0aGUga25vd24gbmFtZXMgaXMgZ2l2ZW4gYnkKLVxjb2Rle3N5c2NvbmZfbmFtZXN9LgotQXZhaWxhYmlsaXR5OiBNYWNpbnRvc2gsIFxVTklYLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtzeXNjb25mX25hbWVzfQotRGljdGlvbmFyeSBtYXBwaW5nIG5hbWVzIGFjY2VwdGVkIGJ5IFxmdW5jdGlvbntzeXNjb25mKCl9IHRvIHRoZQotaW50ZWdlciB2YWx1ZXMgZGVmaW5lZCBmb3IgdGhvc2UgbmFtZXMgYnkgdGhlIGhvc3Qgb3BlcmF0aW5nIHN5c3RlbS4KLVRoaXMgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBzZXQgb2YgbmFtZXMga25vd24gdG8gdGhlIHN5c3RlbS4KLUF2YWlsYWJpbGl0eTogTWFjaW50b3NoLCBcVU5JWC4KLVxlbmR7ZGF0YWRlc2N9Ci0KLQotVGhlIGZvbGxvdyBkYXRhIHZhbHVlcyBhcmUgdXNlZCB0byBzdXBwb3J0IHBhdGggbWFuaXB1bGF0aW9uCi1vcGVyYXRpb25zLiAgVGhlc2UgYXJlIGRlZmluZWQgZm9yIGFsbCBwbGF0Zm9ybXMuCi0KLUhpZ2hlci1sZXZlbCBvcGVyYXRpb25zIG9uIHBhdGhuYW1lcyBhcmUgZGVmaW5lZCBpbiB0aGUKLVxyZWZtb2R1bGV7b3MucGF0aH0gbW9kdWxlLgotCi0KLVxiZWdpbntkYXRhZGVzY317Y3VyZGlyfQotVGhlIGNvbnN0YW50IHN0cmluZyB1c2VkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtIHRvIHJlZmVyIHRvIHRoZSBjdXJyZW50Ci1kaXJlY3RvcnkuCi1Gb3IgZXhhbXBsZTogXGNvZGV7Jy4nfSBmb3IgXFBPU0lYe30gb3IgXGNvZGV7JzonfSBmb3IgTWFjIE9TIDkuCi1BbHNvIGF2YWlsYWJsZSB2aWEgXG1vZHVsZXtvcy5wYXRofS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317cGFyZGlyfQotVGhlIGNvbnN0YW50IHN0cmluZyB1c2VkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtIHRvIHJlZmVyIHRvIHRoZSBwYXJlbnQKLWRpcmVjdG9yeS4KLUZvciBleGFtcGxlOiBcY29kZXsnLi4nfSBmb3IgXFBPU0lYe30gb3IgXGNvZGV7Jzo6J30gZm9yIE1hYyBPUyA5LgotQWxzbyBhdmFpbGFibGUgdmlhIFxtb2R1bGV7b3MucGF0aH0uCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e3NlcH0KLVRoZSBjaGFyYWN0ZXIgdXNlZCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0byBzZXBhcmF0ZSBwYXRobmFtZSBjb21wb25lbnRzLAotZm9yIGV4YW1wbGUsIFxjaGFyYWN0ZXJ7L30gZm9yIFxQT1NJWHt9IG9yIFxjaGFyYWN0ZXJ7On0gZm9yCi1NYWMgT1MgOS4gIE5vdGUgdGhhdCBrbm93aW5nIHRoaXMgaXMgbm90IHN1ZmZpY2llbnQgdG8gYmUgYWJsZSB0bwotcGFyc2Ugb3IgY29uY2F0ZW5hdGUgcGF0aG5hbWVzIC0tLSB1c2UgXGZ1bmN0aW9ue29zLnBhdGguc3BsaXQoKX0gYW5kCi1cZnVuY3Rpb257b3MucGF0aC5qb2luKCl9IC0tLSBidXQgaXQgaXMgb2NjYXNpb25hbGx5IHVzZWZ1bC4KLUFsc28gYXZhaWxhYmxlIHZpYSBcbW9kdWxle29zLnBhdGh9LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXthbHRzZXB9Ci1BbiBhbHRlcm5hdGl2ZSBjaGFyYWN0ZXIgdXNlZCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0byBzZXBhcmF0ZSBwYXRobmFtZQotY29tcG9uZW50cywgb3IgXGNvZGV7Tm9uZX0gaWYgb25seSBvbmUgc2VwYXJhdG9yIGNoYXJhY3RlciBleGlzdHMuICBUaGlzIGlzCi1zZXQgdG8gXGNoYXJhY3RlcnsvfSBvbiBXaW5kb3dzIHN5c3RlbXMgd2hlcmUgXGNvZGV7c2VwfSBpcyBhCi1iYWNrc2xhc2guCi1BbHNvIGF2YWlsYWJsZSB2aWEgXG1vZHVsZXtvcy5wYXRofS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317ZXh0c2VwfQotVGhlIGNoYXJhY3RlciB3aGljaCBzZXBhcmF0ZXMgdGhlIGJhc2UgZmlsZW5hbWUgZnJvbSB0aGUgZXh0ZW5zaW9uOwotZm9yIGV4YW1wbGUsIHRoZSBcY2hhcmFjdGVyey59IGluIFxmaWxle29zLnB5fS4KLUFsc28gYXZhaWxhYmxlIHZpYSBcbW9kdWxle29zLnBhdGh9LgotXHZlcnNpb25hZGRlZHsyLjJ9Ci1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e3BhdGhzZXB9Ci1UaGUgY2hhcmFjdGVyIGNvbnZlbnRpb25hbGx5IHVzZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0gdG8gc2VwYXJhdGUKLXNlYXJjaCBwYXRoIGNvbXBvbmVudHMgKGFzIGluIFxlbnZ2YXJ7UEFUSH0pLCBzdWNoIGFzIFxjaGFyYWN0ZXJ7On0gZm9yCi1cUE9TSVh7fSBvciBcY2hhcmFjdGVyezt9IGZvciBXaW5kb3dzLgotQWxzbyBhdmFpbGFibGUgdmlhIFxtb2R1bGV7b3MucGF0aH0uCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e2RlZnBhdGh9Ci1UaGUgZGVmYXVsdCBzZWFyY2ggcGF0aCB1c2VkIGJ5IFxmdW5jdGlvbntleGVjKnAqKCl9IGFuZAotXGZ1bmN0aW9ue3NwYXduKnAqKCl9IGlmIHRoZSBlbnZpcm9ubWVudCBkb2Vzbid0IGhhdmUgYSBcY29kZXsnUEFUSCd9Ci1rZXkuCi1BbHNvIGF2YWlsYWJsZSB2aWEgXG1vZHVsZXtvcy5wYXRofS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317bGluZXNlcH0KLVRoZSBzdHJpbmcgdXNlZCB0byBzZXBhcmF0ZSAob3IsIHJhdGhlciwgdGVybWluYXRlKSBsaW5lcyBvbiB0aGUKLWN1cnJlbnQgcGxhdGZvcm0uICBUaGlzIG1heSBiZSBhIHNpbmdsZSBjaGFyYWN0ZXIsIHN1Y2ggYXMgCi1cY29kZXsnXGUgbid9IGZvciBcUE9TSVh7fSBvciBcY29kZXsnXGUgcid9IGZvciBNYWMgT1MsIG9yIG11bHRpcGxlIAotY2hhcmFjdGVycywgZm9yIGV4YW1wbGUsIFxjb2RleydcZSByXGUgbid9IGZvciBXaW5kb3dzLgotRG8gbm90IHVzZSBcdmFye29zLmxpbmVzZXB9IGFzIGEgbGluZSB0ZXJtaW5hdG9yIHdoZW4gd3JpdGluZyBmaWxlcyAKLW9wZW5lZCBpbiB0ZXh0IG1vZGUgKHRoZSBkZWZhdWx0KTsgdXNlIGEgc2luZ2xlIFxjb2RleydcZSBuJ30gaW5zdGVhZCwgCi1vbiBhbGwgcGxhdGZvcm1zLiAKLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317ZGV2bnVsbH0KLVRoZSBmaWxlIHBhdGggb2YgdGhlIG51bGwgZGV2aWNlLgotRm9yIGV4YW1wbGU6IFxjb2RleycvZGV2L251bGwnfSBmb3IgXFBPU0lYe30gb3IgXGNvZGV7J0RldjpOdWwnfSBmb3IKLU1hYyBPUyA5LgotQWxzbyBhdmFpbGFibGUgdmlhIFxtb2R1bGV7b3MucGF0aH0uCi1cdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7ZGF0YWRlc2N9Ci0KLQotXHN1YnNlY3Rpb257TWlzY2VsbGFuZW91cyBGdW5jdGlvbnMgXGxhYmVse29zLW1pc2NmdW5jfX0KLQotXGJlZ2lue2Z1bmNkZXNjfXt1cmFuZG9tfXtufQotUmV0dXJuIGEgc3RyaW5nIG9mIFx2YXJ7bn0gcmFuZG9tIGJ5dGVzIHN1aXRhYmxlIGZvciBjcnlwdG9ncmFwaGljIHVzZS4KLQotVGhpcyBmdW5jdGlvbiByZXR1cm5zIHJhbmRvbSBieXRlcyBmcm9tIGFuIE9TLXNwZWNpZmljCi1yYW5kb21uZXNzIHNvdXJjZS4gIFRoZSByZXR1cm5lZCBkYXRhIHNob3VsZCBiZSB1bnByZWRpY3RhYmxlIGVub3VnaCBmb3IKLWNyeXB0b2dyYXBoaWMgYXBwbGljYXRpb25zLCB0aG91Z2ggaXRzIGV4YWN0IHF1YWxpdHkgZGVwZW5kcyBvbiB0aGUgT1MKLWltcGxlbWVudGF0aW9uLiAgT24gYSBVTklYLWxpa2Ugc3lzdGVtIHRoaXMgd2lsbCBxdWVyeSAvZGV2L3VyYW5kb20sIGFuZAotb24gV2luZG93cyBpdCB3aWxsIHVzZSBDcnlwdEdlblJhbmRvbS4gIElmIGEgcmFuZG9tbmVzcyBzb3VyY2UgaXMgbm90Ci1mb3VuZCwgXGV4Y2VwdGlvbntOb3RJbXBsZW1lbnRlZEVycm9yfSB3aWxsIGJlIHJhaXNlZC4KLVx2ZXJzaW9uYWRkZWR7Mi40fQotXGVuZHtmdW5jZGVzY30KLQotCi0KLQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJvc3NhdWRpb2Rldi50ZXggYi9Eb2MvbGliL2xpYm9zc2F1ZGlvZGV2LnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMxOWFhZi4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYm9zc2F1ZGlvZGV2LnRleAorKysgL2Rldi9udWxsCkBAIC0xLDQwMSArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle29zc2F1ZGlvZGV2fSAtLS0KLSAgICAgICAgIEFjY2VzcyB0byBPU1MtY29tcGF0aWJsZSBhdWRpbyBkZXZpY2VzfQotCi1cZGVjbGFyZW1vZHVsZXtidWlsdGlufXtvc3NhdWRpb2Rldn0KLVxwbGF0Zm9ybXtMaW51eCwgRnJlZUJTRH0KLVxtb2R1bGVzeW5vcHNpc3tBY2Nlc3MgdG8gT1NTLWNvbXBhdGlibGUgYXVkaW8gZGV2aWNlcy59Ci0KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotCi1UaGlzIG1vZHVsZSBhbGxvd3MgeW91IHRvIGFjY2VzcyB0aGUgT1NTIChPcGVuIFNvdW5kIFN5c3RlbSkgYXVkaW8KLWludGVyZmFjZS4gIE9TUyBpcyBhdmFpbGFibGUgZm9yIGEgd2lkZSByYW5nZSBvZiBvcGVuLXNvdXJjZSBhbmQKLWNvbW1lcmNpYWwgVW5pY2VzLCBhbmQgaXMgdGhlIHN0YW5kYXJkIGF1ZGlvIGludGVyZmFjZSBmb3IgTGludXggYW5kCi1yZWNlbnQgdmVyc2lvbnMgb2YgRnJlZUJTRC4KLQotJSBUaGluZ3Mgd2lsbCBnZXQgbW9yZSBjb21wbGljYXRlZCBmb3IgZnV0dXJlIExpbnV4IHZlcnNpb25zLCBzaW5jZQotJSBBTFNBIGlzIGluIHRoZSBzdGFuZGFyZCBrZXJuZWwgYXMgb2YgMi41LnguICBQcmVzdW1hYmx5IGlmIHlvdQotJSB1c2UgQUxTQSwgeW91J2xsIGhhdmUgdG8gbWFrZSBzdXJlIGl0cyBPU1MgY29tcGF0aWJpbGl0eSBsYXllcgotJSBpcyBhY3RpdmUgdG8gdXNlIG9zc2F1ZGlvZGV2LCBidXQgeW91J3JlIGdvbm5hIG5lZWQgaXQgZm9yIHRoZSB2YXN0Ci0lIG1ham9yaXR5IG9mIExpbnV4IGF1ZGlvIGFwcHMgYW55d2F5cy4gIAotJQotJSBTb3VuZHMgbGlrZSB0aGluZ3MgYXJlIGFsc28gY29tcGxpY2F0ZWQgZm9yIG90aGVyIEJTRHMuICBJbiByZXNwb25zZQotJSB0byBteSBweXRob24tZGV2IHF1ZXJ5LCBUaG9tYXMgV291dGVycyBzYWlkOgotJQotJSA+IExpa2V3aXNlLCBnb29nbGluZyBzaG93cyBPcGVuQlNEIGFsc28gdXNlcyBPU1MvRnJlZSAtLSB0aGUgY29tbWVyY2lhbAotJSA+IE9TUyBpbnN0YWxsYXRpb24gbWFudWFsIHRlbGxzIHlvdSB0byByZW1vdmUgcmVmZXJlbmNlcyB0byBPU1MvRnJlZSBmcm9tIHRoZQotJSA+IGtlcm5lbCA6KQotJQotJSBidXQgQWxla3NhbmRlciBQaW90cm93c2sgYWN0dWFsbHkgaGFzIGFuIE9wZW5CU0QgYm94LCBhbmQgaGUgcXVvdGVzCi0lIGZyb20gaXRzIDxzb3VuZGNhcmQuaD46Ci0lID4gICogV0FSTklORyEgIFdBUk5JTkchCi0lID4gICogVGhpcyBpcyBhbiBPU1MgKExpbnV4KSBhdWRpbyBlbXVsYXRvci4KLSUgPiAgKiBVc2UgdGhlIE5hdGl2ZSBOZXRCU0QgQVBJIGZvciBkZXZlbG9waW5nIG5ldyBjb2RlLCBhbmQgdGhpcwotJSA+ICAqIG9ubHkgZm9yIGNvbXBpbGluZyBMaW51eCBwcm9ncmFtcy4KLSUKLSUgVGhlcmUncyBhbHNvIGFuIG9zc2F1ZGlvIG1hbnBhZ2Ugb24gT3BlbkJTRCB0aGF0IGV4cGxhaW5zIHRoaW5ncwotJSBmdXJ0aGVyLiAgUHJlc3VtYWJseSBOZXRCU0QgYW5kIE9wZW5CU0QgaGF2ZSBhIGRpZmZlcmVudCBzdGFuZGFyZAotJSBhdWRpbyBpbnRlcmZhY2UuICBUaGF0J3MgdGhlIGdyZWF0IHRoaW5nIGFib3V0IHN0YW5kYXJkcywgdGhlcmUgYXJlIHNvCi0lIG1hbnkgdG8gY2hvb3NlIGZyb20gLi4uIDstKSAgCi0lCi0lIFRoaXMgcHJvYmFibHkgYWxsIHdhcnJhbnRzIGEgZm9vdG5vdGUgb3IgdHdvLCBidXQgSSBkb24ndCB1bmRlcnN0YW5kCi0lIHRoaW5ncyB3ZWxsIGVub3VnaCByaWdodCBub3cgdG8gd3JpdGUgaXQhICAgLS1HUFcKLQotXGJlZ2lue3NlZWFsc299Ci1cc2VldGl0bGVbaHR0cDovL3d3dy5vcGVuc291bmQuY29tL3BndWlkZS9vc3MucGRmXQotICAgICAgICAge09wZW4gU291bmQgU3lzdGVtIFByb2dyYW1tZXIncyBHdWlkZX0ge3RoZSBvZmZpY2lhbAotICAgICAgICAgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIE9TUyBDIEFQSX0KLVxzZWV0ZXh0e1RoZSBtb2R1bGUgZGVmaW5lcyBhIGxhcmdlIG51bWJlciBvZiBjb25zdGFudHMgc3VwcGxpZWQgYnkKLSAgICAgICAgIHRoZSBPU1MgZGV2aWNlIGRyaXZlcjsgc2VlIFxjb2RlezxzeXMvc291bmRjYXJkLmg+fSBvbiBlaXRoZXIKLSAgICAgICAgIExpbnV4IG9yIEZyZWVCU0QgZm9yIGEgbGlzdGluZyAufQotXGVuZHtzZWVhbHNvfQotCi1cbW9kdWxle29zc2F1ZGlvZGV2fSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnM6Ci0KLVxiZWdpbntleGNkZXNjfXtPU1NBdWRpb0Vycm9yfQotVGhpcyBleGNlcHRpb24gaXMgcmFpc2VkIG9uIGNlcnRhaW4gZXJyb3JzLiAgVGhlIGFyZ3VtZW50IGlzIGEgc3RyaW5nCi1kZXNjcmliaW5nIHdoYXQgd2VudCB3cm9uZy4KLQotKElmIFxtb2R1bGV7b3NzYXVkaW9kZXZ9IHJlY2VpdmVzIGFuIGVycm9yIGZyb20gYSBzeXN0ZW0gY2FsbCBzdWNoIGFzCi1cY2Z1bmN0aW9ue29wZW4oKX0sIFxjZnVuY3Rpb257d3JpdGUoKX0sIG9yIFxjZnVuY3Rpb257aW9jdGwoKX0sIGl0Ci1yYWlzZXMgXGV4Y2VwdGlvbntJT0Vycm9yfS4gIEVycm9ycyBkZXRlY3RlZCBkaXJlY3RseSBieQotXG1vZHVsZXtvc3NhdWRpb2Rldn0gcmVzdWx0IGluIFxleGNlcHRpb257T1NTQXVkaW9FcnJvcn0uKQotCi0oRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCB0aGUgZXhjZXB0aW9uIGNsYXNzIGlzIGFsc28gYXZhaWxhYmxlIGFzCi1cY29kZXtvc3NhdWRpb2Rldi5lcnJvcn0uKQotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e29wZW59e1xvcHRpb25hbHtkZXZpY2UsIH1tb2RlfQotT3BlbiBhbiBhdWRpbyBkZXZpY2UgYW5kIHJldHVybiBhbiBPU1MgYXVkaW8gZGV2aWNlIG9iamVjdC4gIFRoaXMKLW9iamVjdCBzdXBwb3J0cyBtYW55IGZpbGUtbGlrZSBtZXRob2RzLCBzdWNoIGFzIFxtZXRob2R7cmVhZCgpfSwKLVxtZXRob2R7d3JpdGUoKX0sIGFuZCBcbWV0aG9ke2ZpbGVubygpfSAoYWx0aG91Z2ggdGhlcmUgYXJlIHN1YnRsZQotZGlmZmVyZW5jZXMgYmV0d2VlbiBjb252ZW50aW9uYWwgXFVOSVh7fSByZWFkL3dyaXRlIHNlbWFudGljcyBhbmQgdGhvc2Ugb2YKLU9TUyBhdWRpbyBkZXZpY2VzKS4gIEl0IGFsc28gc3VwcG9ydHMgYSBudW1iZXIgb2YgYXVkaW8tc3BlY2lmaWMKLW1ldGhvZHM7IHNlZSBiZWxvdyBmb3IgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWV0aG9kcy4KLQotXHZhcntkZXZpY2V9IGlzIHRoZSBhdWRpbyBkZXZpY2UgZmlsZW5hbWUgdG8gdXNlLiAgSWYgaXQgaXMgbm90Ci1zcGVjaWZpZWQsIHRoaXMgbW9kdWxlIGZpcnN0IGxvb2tzIGluIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotXGVudnZhcntBVURJT0RFVn0gZm9yIGEgZGV2aWNlIHRvIHVzZS4gIElmIG5vdCBmb3VuZCwgaXQgZmFsbHMgYmFjayB0bwotXGZpbGV7L2Rldi9kc3B9LgotCi1cdmFye21vZGV9IGlzIG9uZSBvZiBcY29kZXsncid9IGZvciByZWFkLW9ubHkgKHJlY29yZCkgYWNjZXNzLAotXGNvZGV7J3cnfSBmb3Igd3JpdGUtb25seSAocGxheWJhY2spIGFjY2VzcyBhbmQgXGNvZGV7J3J3J30gZm9yIGJvdGguCi1TaW5jZSBtYW55IHNvdW5kIGNhcmRzIG9ubHkgYWxsb3cgb25lIHByb2Nlc3MgdG8gaGF2ZSB0aGUgcmVjb3JkZXIgb3IKLXBsYXllciBvcGVuIGF0IGEgdGltZSwgaXQgaXMgYSBnb29kIGlkZWEgdG8gb3BlbiB0aGUgZGV2aWNlIG9ubHkgZm9yIHRoZQotYWN0aXZpdHkgbmVlZGVkLiAgRnVydGhlciwgc29tZSBzb3VuZCBjYXJkcyBhcmUgaGFsZi1kdXBsZXg6IHRoZXkgY2FuIGJlCi1vcGVuZWQgZm9yIHJlYWRpbmcgb3Igd3JpdGluZywgYnV0IG5vdCBib3RoIGF0IG9uY2UuCi0KLU5vdGUgdGhlIHVudXN1YWwgY2FsbGluZyBzeW50YXg6IHRoZSBcZW1waHtmaXJzdH0gYXJndW1lbnQgaXMgb3B0aW9uYWwsCi1hbmQgdGhlIHNlY29uZCBpcyByZXF1aXJlZC4gIFRoaXMgaXMgYSBoaXN0b3JpY2FsIGFydGlmYWN0IGZvcgotY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBvbGRlciBcbW9kdWxle2xpbnV4YXVkaW9kZXZ9IG1vZHVsZSB3aGljaAotXG1vZHVsZXtvc3NhdWRpb2Rldn0gc3VwZXJzZWRlcy4gICUgWFhYIGl0IG1pZ2h0IGFsc28gYmUgbW90aXZhdGVkCi0lIGJ5IG15IHVuZm91bmRlZC1idXQtc3RpbGwtcG9zc2libHktdHJ1ZSBiZWxpZWYgdGhhdCB0aGUgZGVmYXVsdAotJSBhdWRpbyBkZXZpY2UgdmFyaWVzIHVucHJlZGljdGFibHkgYWNyb3NzIG9wZXJhdGluZyBzeXN0ZW1zLiAgLUdXCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e29wZW5taXhlcn17XG9wdGlvbmFse2RldmljZX19Ci1PcGVuIGEgbWl4ZXIgZGV2aWNlIGFuZCByZXR1cm4gYW4gT1NTIG1peGVyIGRldmljZSBvYmplY3QuICAKLVx2YXJ7ZGV2aWNlfSBpcyB0aGUgbWl4ZXIgZGV2aWNlIGZpbGVuYW1lIHRvIHVzZS4gIElmIGl0IGlzCi1ub3Qgc3BlY2lmaWVkLCB0aGlzIG1vZHVsZSBmaXJzdCBsb29rcyBpbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLVxlbnZ2YXJ7TUlYRVJERVZ9IGZvciBhIGRldmljZSB0byB1c2UuICBJZiBub3QgZm91bmQsIGl0IGZhbGxzIGJhY2sgdG8KLVxmaWxley9kZXYvbWl4ZXJ9LgotCi1cZW5ke2Z1bmNkZXNjfQotCi1cc3Vic2VjdGlvbntBdWRpbyBEZXZpY2UgT2JqZWN0cyBcbGFiZWx7b3NzYXVkaW8tZGV2aWNlLW9iamVjdHN9fQotCi1CZWZvcmUgeW91IGNhbiB3cml0ZSB0byBvciByZWFkIGZyb20gYW4gYXVkaW8gZGV2aWNlLCB5b3UgbXVzdCBjYWxsCi10aHJlZSBtZXRob2RzIGluIHRoZSBjb3JyZWN0IG9yZGVyOgotXGJlZ2lue2VudW1lcmF0ZX0KLVxpdGVtIFxtZXRob2R7c2V0Zm10KCl9IHRvIHNldCB0aGUgb3V0cHV0IGZvcm1hdAotXGl0ZW0gXG1ldGhvZHtjaGFubmVscygpfSB0byBzZXQgdGhlIG51bWJlciBvZiBjaGFubmVscwotXGl0ZW0gXG1ldGhvZHtzcGVlZCgpfSB0byBzZXQgdGhlIHNhbXBsZSByYXRlCi1cZW5ke2VudW1lcmF0ZX0KLUFsdGVybmF0ZWx5LCB5b3UgY2FuIHVzZSB0aGUgXG1ldGhvZHtzZXRwYXJhbWV0ZXJzKCl9IG1ldGhvZCB0byBzZXQgYWxsCi10aHJlZSBhdWRpbyBwYXJhbWV0ZXJzIGF0IG9uY2UuICBUaGlzIGlzIG1vcmUgY29udmVuaWVudCwgYnV0IG1heSBub3QgYmUKLWFzIGZsZXhpYmxlIGluIGFsbCBjYXNlcy4KLQotVGhlIGF1ZGlvIGRldmljZSBvYmplY3RzIHJldHVybmVkIGJ5IFxmdW5jdGlvbntvcGVuKCl9IGRlZmluZSB0aGUKLWZvbGxvd2luZyBtZXRob2RzIGFuZCAocmVhZC1vbmx5KSBhdHRyaWJ1dGVzOgotCi1cYmVnaW57bWV0aG9kZGVzY31bYXVkaW8gZGV2aWNlXXtjbG9zZX17fQotRXhwbGljaXRseSBjbG9zZSB0aGUgYXVkaW8gZGV2aWNlLiAgV2hlbiB5b3UgYXJlIGRvbmUgd3JpdGluZyB0byBvcgotcmVhZGluZyBmcm9tIGFuIGF1ZGlvIGRldmljZSwgeW91IHNob3VsZCBleHBsaWNpdGx5IGNsb3NlIGl0LiAgQSBjbG9zZWQKLWRldmljZSBjYW5ub3QgYmUgdXNlZCBhZ2Fpbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2F1ZGlvIGRldmljZV17ZmlsZW5vfXt9Ci1SZXR1cm4gdGhlIGZpbGUgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggdGhlIGRldmljZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2F1ZGlvIGRldmljZV17cmVhZH17c2l6ZX0KLVJlYWQgXHZhcntzaXplfSBieXRlcyBmcm9tIHRoZSBhdWRpbyBpbnB1dCBhbmQgcmV0dXJuIHRoZW0gYXMgYSBQeXRob24KLXN0cmluZy4gIFVubGlrZSBtb3N0IFxVTklYe30gZGV2aWNlIGRyaXZlcnMsIE9TUyBhdWRpbyBkZXZpY2VzIGluCi1ibG9ja2luZyBtb2RlICh0aGUgZGVmYXVsdCkgd2lsbCBibG9jayBcZnVuY3Rpb257cmVhZCgpfSB1bnRpbCB0aGUKLWVudGlyZSByZXF1ZXN0ZWQgYW1vdW50IG9mIGRhdGEgaXMgYXZhaWxhYmxlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bYXVkaW8gZGV2aWNlXXt3cml0ZX17ZGF0YX0KLVdyaXRlIHRoZSBQeXRob24gc3RyaW5nIFx2YXJ7ZGF0YX0gdG8gdGhlIGF1ZGlvIGRldmljZSBhbmQgcmV0dXJuIHRoZQotbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uICBJZiB0aGUgYXVkaW8gZGV2aWNlIGlzIGluIGJsb2NraW5nIG1vZGUgKHRoZQotZGVmYXVsdCksIHRoZSBlbnRpcmUgc3RyaW5nIGlzIGFsd2F5cyB3cml0dGVuIChhZ2FpbiwgdGhpcyBpcyBkaWZmZXJlbnQKLWZyb20gdXN1YWwgXFVOSVh7fSBkZXZpY2Ugc2VtYW50aWNzKS4gIElmIHRoZSBkZXZpY2UgaXMgaW4gbm9uLWJsb2NraW5nCi1tb2RlLCBzb21lIGRhdGEgbWF5IG5vdCBiZSB3cml0dGVuLS0tc2VlIFxtZXRob2R7d3JpdGVhbGwoKX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVthdWRpbyBkZXZpY2Vde3dyaXRlYWxsfXtkYXRhfQotV3JpdGUgdGhlIGVudGlyZSBQeXRob24gc3RyaW5nIFx2YXJ7ZGF0YX0gdG8gdGhlIGF1ZGlvIGRldmljZTogd2FpdHMKLXVudGlsIHRoZSBhdWRpbyBkZXZpY2UgaXMgYWJsZSB0byBhY2NlcHQgZGF0YSwgd3JpdGVzIGFzIG11Y2ggZGF0YSBhcyBpdAotd2lsbCBhY2NlcHQsIGFuZCByZXBlYXRzIHVudGlsIFx2YXJ7ZGF0YX0gaGFzIGJlZW4gY29tcGxldGVseSB3cml0dGVuLgotSWYgdGhlIGRldmljZSBpcyBpbiBibG9ja2luZyBtb2RlICh0aGUgZGVmYXVsdCksIHRoaXMgaGFzIHRoZSBzYW1lCi1lZmZlY3QgYXMgXG1ldGhvZHt3cml0ZSgpfTsgXG1ldGhvZHt3cml0ZWFsbCgpfSBpcyBvbmx5IHVzZWZ1bCBpbgotbm9uLWJsb2NraW5nIG1vZGUuICBIYXMgbm8gcmV0dXJuIHZhbHVlLCBzaW5jZSB0aGUgYW1vdW50IG9mIGRhdGEKLXdyaXR0ZW4gaXMgYWx3YXlzIGVxdWFsIHRvIHRoZSBhbW91bnQgb2YgZGF0YSBzdXBwbGllZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotVGhlIGZvbGxvd2luZyBtZXRob2RzIGVhY2ggbWFwIHRvIGV4YWN0bHkgb25lCi1cZnVuY3Rpb257aW9jdGwoKX0gc3lzdGVtIGNhbGwuICBUaGUgY29ycmVzcG9uZGVuY2UgaXMgb2J2aW91czogZm9yCi1leGFtcGxlLCBcbWV0aG9ke3NldGZtdCgpfSBjb3JyZXNwb25kcyB0byB0aGUgXGNvZGV7U05EQ1RMX0RTUF9TRVRGTVR9Ci1pb2N0bCwgYW5kIFxtZXRob2R7c3luYygpfSB0byBcY29kZXtTTkRDVExfRFNQX1NZTkN9ICh0aGlzIGNhbiBiZSB1c2VmdWwKLXdoZW4gY29uc3VsdGluZyB0aGUgT1NTIGRvY3VtZW50YXRpb24pLiAgSWYgdGhlIHVuZGVybHlpbmcKLVxmdW5jdGlvbntpb2N0bCgpfSBmYWlscywgdGhleSBhbGwgcmFpc2UgXGV4Y2VwdGlvbntJT0Vycm9yfS4KLQotXGJlZ2lue21ldGhvZGRlc2N9W2F1ZGlvIGRldmljZV17bm9uYmxvY2t9e30KLVB1dCB0aGUgZGV2aWNlIGludG8gbm9uLWJsb2NraW5nIG1vZGUuICBPbmNlIGluIG5vbi1ibG9ja2luZyBtb2RlLCB0aGVyZQotaXMgbm8gd2F5IHRvIHJldHVybiBpdCB0byBibG9ja2luZyBtb2RlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bYXVkaW8gZGV2aWNlXXtnZXRmbXRzfXt9Ci1SZXR1cm4gYSBiaXRtYXNrIG9mIHRoZSBhdWRpbyBvdXRwdXQgZm9ybWF0cyBzdXBwb3J0ZWQgYnkgdGhlCi1zb3VuZGNhcmQuICBTb21lIG9mIHRoZSBmb3JtYXRzIHN1cHBvcnRlZCBieSBPU1MgYXJlOgotCi1cYmVnaW57dGFibGVpaX17bHxsfXtjb25zdGFudH17Rm9ybWF0fXtEZXNjcmlwdGlvbn0KLVxsaW5laWl7QUZNVF9NVV9MQVd9Ci0gICAgICAge2EgbG9nYXJpdGhtaWMgZW5jb2RpbmcgKHVzZWQgYnkgU3VuIFxjb2Rley5hdX0gZmlsZXMgYW5kCi0gICAgICAgIFxmaWxlbnF7L2Rldi9hdWRpb30pfQotXGxpbmVpaXtBRk1UX0FfTEFXfQotICAgICAgIHthIGxvZ2FyaXRobWljIGVuY29kaW5nfQotXGxpbmVpaXtBRk1UX0lNQV9BRFBDTX0KLSAgICAgICB7YSA0OjEgY29tcHJlc3NlZCBmb3JtYXQgZGVmaW5lZCBieSB0aGUgSW50ZXJhY3RpdmUgTXVsdGltZWRpYQotICAgICAgICBBc3NvY2lhdGlvbn0gCi1cbGluZWlpe0FGTVRfVTh9Ci0gICAgICAge1Vuc2lnbmVkLCA4LWJpdCBhdWRpb30KLVxsaW5laWl7QUZNVF9TMTZfTEV9Ci0gICAgICAge1NpZ25lZCwgMTYtYml0IGF1ZGlvLCBsaXR0bGUtZW5kaWFuIGJ5dGUgb3JkZXIgKGFzIHVzZWQgYnkKLSAgICAgICAgSW50ZWwgcHJvY2Vzc29ycyl9Ci1cbGluZWlpe0FGTVRfUzE2X0JFfQotICAgICAgIHtTaWduZWQsIDE2LWJpdCBhdWRpbywgYmlnLWVuZGlhbiBieXRlIG9yZGVyIChhcyB1c2VkIGJ5IDY4aywKLSAgICAgICAgUG93ZXJQQywgU3BhcmMpfQotXGxpbmVpaXtBRk1UX1M4fQotICAgICAgIHtTaWduZWQsIDggYml0IGF1ZGlvfQotXGxpbmVpaXtBRk1UX1UxNl9MRX0KLSAgICAgICB7VW5zaWduZWQsIDE2LWJpdCBsaXR0bGUtZW5kaWFuIGF1ZGlvfQotXGxpbmVpaXtBRk1UX1UxNl9CRX0KLSAgICAgICB7VW5zaWduZWQsIDE2LWJpdCBiaWctZW5kaWFuIGF1ZGlvfQotXGVuZHt0YWJsZWlpfQotQ29uc3VsdCB0aGUgT1NTIGRvY3VtZW50YXRpb24gZm9yIGEgZnVsbCBsaXN0IG9mIGF1ZGlvIGZvcm1hdHMsIGFuZCBub3RlCi10aGF0IG1vc3QgZGV2aWNlcyBzdXBwb3J0IG9ubHkgYSBzdWJzZXQgb2YgdGhlc2UgZm9ybWF0cy4gIFNvbWUgb2xkZXIKLWRldmljZXMgb25seSBzdXBwb3J0IFxjb25zdGFudHtBRk1UX1U4fTsgdGhlIG1vc3QgY29tbW9uIGZvcm1hdCB1c2VkCi10b2RheSBpcyBcY29uc3RhbnR7QUZNVF9TMTZfTEV9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bYXVkaW8gZGV2aWNlXXtzZXRmbXR9e2Zvcm1hdH0KLVRyeSB0byBzZXQgdGhlIGN1cnJlbnQgYXVkaW8gZm9ybWF0IHRvIFx2YXJ7Zm9ybWF0fS0tLXNlZQotXG1ldGhvZHtnZXRmbXRzKCl9IGZvciBhIGxpc3QuICBSZXR1cm5zIHRoZSBhdWRpbyBmb3JtYXQgdGhhdCB0aGUgZGV2aWNlCi13YXMgc2V0IHRvLCB3aGljaCBtYXkgbm90IGJlIHRoZSByZXF1ZXN0ZWQgZm9ybWF0LiAgTWF5IGFsc28gYmUgdXNlZCB0bwotcmV0dXJuIHRoZSBjdXJyZW50IGF1ZGlvIGZvcm1hdC0tLWRvIHRoaXMgYnkgcGFzc2luZyBhbiBgYGF1ZGlvIGZvcm1hdCcnCi1vZgotXGNvbnN0YW50e0FGTVRfUVVFUll9LiAgCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVthdWRpbyBkZXZpY2Vde2NoYW5uZWxzfXtuY2hhbm5lbHN9Ci1TZXQgdGhlIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgdG8gXHZhcntuY2hhbm5lbHN9LiAgQSB2YWx1ZSBvZiAxCi1pbmRpY2F0ZXMgbW9ub3Bob25pYyBzb3VuZCwgMiBzdGVyZW9waG9uaWMuICBTb21lIGRldmljZXMgbWF5IGhhdmUgbW9yZQotdGhhbiAyIGNoYW5uZWxzLCBhbmQgc29tZSBoaWdoLWVuZCBkZXZpY2VzIG1heSBub3Qgc3VwcG9ydCBtb25vLgotUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIHRoZSBkZXZpY2Ugd2FzIHNldCB0by4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2F1ZGlvIGRldmljZV17c3BlZWR9e3NhbXBsZXJhdGV9Ci1UcnkgdG8gc2V0IHRoZSBhdWRpbyBzYW1wbGluZyByYXRlIHRvIFx2YXJ7c2FtcGxlcmF0ZX0gc2FtcGxlcyBwZXIKLXNlY29uZC4gIFJldHVybnMgdGhlIHJhdGUgYWN0dWFsbHkgc2V0LiAgTW9zdCBzb3VuZCBkZXZpY2VzIGRvbid0Ci1zdXBwb3J0IGFyYml0cmFyeSBzYW1wbGluZyByYXRlcy4gIENvbW1vbiByYXRlcyBhcmU6Ci1cYmVnaW57dGFibGVpaX17bHxsfXt0ZXh0cm19e1JhdGV9e0Rlc2NyaXB0aW9ufQotXGxpbmVpaXs4MDAwfXtkZWZhdWx0IHJhdGUgZm9yIFxmaWxlbnF7L2Rldi9hdWRpb319Ci1cbGluZWlpezExMDI1fXtzcGVlY2ggcmVjb3JkaW5nfQotXGxpbmVpaXsyMjA1MH17fQotXGxpbmVpaXs0NDEwMH17Q0QgcXVhbGl0eSBhdWRpbyAoYXQgMTYgYml0cy9zYW1wbGUgYW5kIDIgY2hhbm5lbHMpfQotXGxpbmVpaXs5NjAwMH17RFZEIHF1YWxpdHkgYXVkaW8gKGF0IDI0IGJpdHMvc2FtcGxlKX0KLVxlbmR7dGFibGVpaX0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2F1ZGlvIGRldmljZV17c3luY317fQotV2FpdCB1bnRpbCB0aGUgc291bmQgZGV2aWNlIGhhcyBwbGF5ZWQgZXZlcnkgYnl0ZSBpbiBpdHMgYnVmZmVyLiAgKFRoaXMKLWhhcHBlbnMgaW1wbGljaXRseSB3aGVuIHRoZSBkZXZpY2UgaXMgY2xvc2VkLikgIFRoZSBPU1MgZG9jdW1lbnRhdGlvbgotcmVjb21tZW5kcyBjbG9zaW5nIGFuZCByZS1vcGVuaW5nIHRoZSBkZXZpY2UgcmF0aGVyIHRoYW4gdXNpbmcKLVxtZXRob2R7c3luYygpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2F1ZGlvIGRldmljZV17cmVzZXR9e30KLUltbWVkaWF0ZWx5IHN0b3AgcGxheWluZyBvciByZWNvcmRpbmcgYW5kIHJldHVybiB0aGUgZGV2aWNlIHRvIGEKLXN0YXRlIHdoZXJlIGl0IGNhbiBhY2NlcHQgY29tbWFuZHMuICBUaGUgT1NTIGRvY3VtZW50YXRpb24gcmVjb21tZW5kcwotY2xvc2luZyBhbmQgcmUtb3BlbmluZyB0aGUgZGV2aWNlIGFmdGVyIGNhbGxpbmcgXG1ldGhvZHtyZXNldCgpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2F1ZGlvIGRldmljZV17cG9zdH17fQotVGVsbCB0aGUgZHJpdmVyIHRoYXQgdGhlcmUgaXMgbGlrZWx5IHRvIGJlIGEgcGF1c2UgaW4gdGhlIG91dHB1dCwgbWFraW5nCi1pdCBwb3NzaWJsZSBmb3IgdGhlIGRldmljZSB0byBoYW5kbGUgdGhlIHBhdXNlIG1vcmUgaW50ZWxsaWdlbnRseS4gIFlvdQotbWlnaHQgdXNlIHRoaXMgYWZ0ZXIgcGxheWluZyBhIHNwb3Qgc291bmQgZWZmZWN0LCBiZWZvcmUgd2FpdGluZyBmb3IKLXVzZXIgaW5wdXQsIG9yIGJlZm9yZSBkb2luZyBkaXNrIEkvTy4KLVxlbmR7bWV0aG9kZGVzY30KLQotVGhlIGZvbGxvd2luZyBjb252ZW5pZW5jZSBtZXRob2RzIGNvbWJpbmUgc2V2ZXJhbCBpb2N0bHMsIG9yIG9uZSBpb2N0bAotYW5kIHNvbWUgc2ltcGxlIGNhbGN1bGF0aW9ucy4KLQotXGJlZ2lue21ldGhvZGRlc2N9W2F1ZGlvIGRldmljZV17c2V0cGFyYW1ldGVyc30KLSAge2Zvcm1hdCwgbmNoYW5uZWxzLCBzYW1wbGVyYXRlIFxvcHRpb25hbHssIHN0cmljdD1GYWxzZX19Ci0KLVNldCB0aGUga2V5IGF1ZGlvIHNhbXBsaW5nIHBhcmFtZXRlcnMtLS1zYW1wbGUgZm9ybWF0LCBudW1iZXIgb2YKLWNoYW5uZWxzLCBhbmQgc2FtcGxpbmcgcmF0ZS0tLWluIG9uZSBtZXRob2QgY2FsbC4gIFx2YXJ7Zm9ybWF0fSwgCi1cdmFye25jaGFubmVsc30sIGFuZCBcdmFye3NhbXBsZXJhdGV9IHNob3VsZCBiZSBhcyBzcGVjaWZpZWQgaW4gdGhlCi1cbWV0aG9ke3NldGZtdCgpfSwgXG1ldGhvZHtjaGFubmVscygpfSwgYW5kIFxtZXRob2R7c3BlZWQoKX0gCi1tZXRob2RzLiAgSWYgXHZhcntzdHJpY3R9IGlzIHRydWUsIFxtZXRob2R7c2V0cGFyYW1ldGVycygpfSBjaGVja3MgdG8KLXNlZSBpZiBlYWNoIHBhcmFtZXRlciB3YXMgYWN0dWFsbHkgc2V0IHRvIHRoZSByZXF1ZXN0ZWQgdmFsdWUsIGFuZAotcmFpc2VzIFxleGNlcHRpb257T1NTQXVkaW9FcnJvcn0gaWYgbm90LiAgUmV0dXJucyBhIHR1cGxlIChcdmFye2Zvcm1hdH0sCi1cdmFye25jaGFubmVsc30sIFx2YXJ7c2FtcGxlcmF0ZX0pIGluZGljYXRpbmcgdGhlIHBhcmFtZXRlciB2YWx1ZXMgdGhhdAotd2VyZSBhY3R1YWxseSBzZXQgYnkgdGhlIGRldmljZSBkcml2ZXIgKGkuZS4sIHRoZSBzYW1lIGFzIHRoZSByZXR1cm4KLXZhbHVlcyBvZiBcbWV0aG9ke3NldGZtdCgpfSwgXG1ldGhvZHtjaGFubmVscygpfSwgYW5kIFxtZXRob2R7c3BlZWQoKX0pLgotCi1Gb3IgZXhhbXBsZSwKLVxiZWdpbnt2ZXJiYXRpbX0KLSAgKGZtdCwgY2hhbm5lbHMsIHJhdGUpID0gZHNwLnNldHBhcmFtZXRlcnMoZm10LCBjaGFubmVscywgcmF0ZSkKLVxlbmR7dmVyYmF0aW19Ci1pcyBlcXVpdmFsZW50IHRvCi1cYmVnaW57dmVyYmF0aW19Ci0gIGZtdCA9IGRzcC5zZXRmbXQoZm10KQotICBjaGFubmVscyA9IGRzcC5jaGFubmVscyhjaGFubmVscykKLSAgcmF0ZSA9IGRzcC5yYXRlKGNoYW5uZWxzKQotXGVuZHt2ZXJiYXRpbX0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2F1ZGlvIGRldmljZV17YnVmc2l6ZX17fQotUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgaGFyZHdhcmUgYnVmZmVyLCBpbiBzYW1wbGVzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bYXVkaW8gZGV2aWNlXXtvYnVmY291bnR9e30KLVJldHVybnMgdGhlIG51bWJlciBvZiBzYW1wbGVzIHRoYXQgYXJlIGluIHRoZSBoYXJkd2FyZSBidWZmZXIgeWV0IHRvIGJlCi1wbGF5ZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVthdWRpbyBkZXZpY2Vde29idWZmcmVlfXt9Ci1SZXR1cm5zIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0aGF0IGNvdWxkIGJlIHF1ZXVlZCBpbnRvIHRoZSBoYXJkd2FyZQotYnVmZmVyIHRvIGJlIHBsYXllZCB3aXRob3V0IGJsb2NraW5nLgotXGVuZHttZXRob2RkZXNjfQotCi1BdWRpbyBkZXZpY2Ugb2JqZWN0cyBhbHNvIHN1cHBvcnQgc2V2ZXJhbCByZWFkLW9ubHkgYXR0cmlidXRlczoKLQotXGJlZ2lue21lbWJlcmRlc2N9W2F1ZGlvIGRldmljZV17Y2xvc2VkfXt9Ci1Cb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZGV2aWNlIGhhcyBiZWVuIGNsb3NlZC4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W2F1ZGlvIGRldmljZV17bmFtZX17fQotU3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIGRldmljZSBmaWxlLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bYXVkaW8gZGV2aWNlXXttb2RlfXt9Ci1UaGUgSS9PIG1vZGUgZm9yIHRoZSBmaWxlLCBlaXRoZXIgXGNvZGV7InIifSwgXGNvZGV7InJ3In0sIG9yIFxjb2RleyJ3In0uCi1cZW5ke21lbWJlcmRlc2N9Ci0KLQotXHN1YnNlY3Rpb257TWl4ZXIgRGV2aWNlIE9iamVjdHMgXGxhYmVse21peGVyLWRldmljZS1vYmplY3RzfX0KLQotVGhlIG1peGVyIG9iamVjdCBwcm92aWRlcyB0d28gZmlsZS1saWtlIG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVttaXhlciBkZXZpY2Vde2Nsb3NlfXt9Ci1UaGlzIG1ldGhvZCBjbG9zZXMgdGhlIG9wZW4gbWl4ZXIgZGV2aWNlIGZpbGUuICBBbnkgZnVydGhlciBhdHRlbXB0cyB0bwotdXNlIHRoZSBtaXhlciBhZnRlciB0aGlzIGZpbGUgaXMgY2xvc2VkIHdpbGwgcmFpc2UgYW4gXGV4Y2VwdGlvbntJT0Vycm9yfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W21peGVyIGRldmljZV17ZmlsZW5vfXt9Ci1SZXR1cm5zIHRoZSBmaWxlIGhhbmRsZSBudW1iZXIgb2YgdGhlIG9wZW4gbWl4ZXIgZGV2aWNlIGZpbGUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVRoZSByZW1haW5pbmcgbWV0aG9kcyBhcmUgc3BlY2lmaWMgdG8gYXVkaW8gbWl4aW5nOgotCi1cYmVnaW57bWV0aG9kZGVzY31bbWl4ZXIgZGV2aWNlXXtjb250cm9sc317fQotVGhpcyBtZXRob2QgcmV0dXJucyBhIGJpdG1hc2sgc3BlY2lmeWluZyB0aGUgYXZhaWxhYmxlIG1peGVyIGNvbnRyb2xzCi0oYGBDb250cm9sJycgYmVpbmcgYSBzcGVjaWZpYyBtaXhhYmxlIGBgY2hhbm5lbCcnLCBzdWNoIGFzCi1cY29uc3RhbnR7U09VTkRfTUlYRVJfUENNfSBvciBcY29uc3RhbnR7U09VTkRfTUlYRVJfU1lOVEh9KS4gIFRoaXMKLWJpdG1hc2sgaW5kaWNhdGVzIGEgc3Vic2V0IG9mIGFsbCBhdmFpbGFibGUgbWl4ZXIgY29udHJvbHMtLS10aGUKLVxjb25zdGFudHtTT1VORF9NSVhFUl8qfSBjb25zdGFudHMgZGVmaW5lZCBhdCBtb2R1bGUgbGV2ZWwuICBUbyBkZXRlcm1pbmUgaWYsCi1mb3IgZXhhbXBsZSwgdGhlIGN1cnJlbnQgbWl4ZXIgb2JqZWN0IHN1cHBvcnRzIGEgUENNIG1peGVyLCB1c2UgdGhlCi1mb2xsb3dpbmcgUHl0aG9uIGNvZGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLW1peGVyPW9zc2F1ZGlvZGV2Lm9wZW5taXhlcigpCi1pZiBtaXhlci5jb250cm9scygpICYgKDEgPDwgb3NzYXVkaW9kZXYuU09VTkRfTUlYRVJfUENNKToKLSAgICAjIFBDTSBpcyBzdXBwb3J0ZWQKLSAgICAuLi4gY29kZSAuLi4KLVxlbmR7dmVyYmF0aW19Ci0KLUZvciBtb3N0IHB1cnBvc2VzLCB0aGUgXGNvbnN0YW50e1NPVU5EX01JWEVSX1ZPTFVNRX0gKG1hc3RlciB2b2x1bWUpIGFuZAotXGNvbnN0YW50e1NPVU5EX01JWEVSX1BDTX0gY29udHJvbHMgc2hvdWxkIHN1ZmZpY2UtLS1idXQgY29kZSB0aGF0IHVzZXMgdGhlCi1taXhlciBzaG91bGQgYmUgZmxleGlibGUgd2hlbiBpdCBjb21lcyB0byBjaG9vc2luZyBtaXhlciBjb250cm9scy4gIE9uCi10aGUgR3JhdmlzIFVsdHJhc291bmQsIGZvciBleGFtcGxlLCBcY29uc3RhbnR7U09VTkRfTUlYRVJfVk9MVU1FfSBkb2VzIG5vdAotZXhpc3QuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVttaXhlciBkZXZpY2Vde3N0ZXJlb2NvbnRyb2xzfXt9Ci1SZXR1cm5zIGEgYml0bWFzayBpbmRpY2F0aW5nIHN0ZXJlbyBtaXhlciBjb250cm9scy4gIElmIGEgYml0IGlzIHNldCwKLXRoZSBjb3JyZXNwb25kaW5nIGNvbnRyb2wgaXMgc3RlcmVvOyBpZiBpdCBpcyB1bnNldCwgdGhlIGNvbnRyb2wgaXMKLWVpdGhlciBtb25vcGhvbmljIG9yIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIG1peGVyICh1c2UgaW4gY29tYmluYXRpb24gd2l0aAotXG1ldGhvZHtjb250cm9scygpfSB0byBkZXRlcm1pbmUgd2hpY2gpLgotCi1TZWUgdGhlIGNvZGUgZXhhbXBsZSBmb3IgdGhlIFxtZXRob2R7Y29udHJvbHMoKX0gZnVuY3Rpb24gZm9yIGFuIGV4YW1wbGUKLW9mIGdldHRpbmcgZGF0YSBmcm9tIGEgYml0bWFzay4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W21peGVyIGRldmljZV17cmVjY29udHJvbHN9e30KLVJldHVybnMgYSBiaXRtYXNrIHNwZWNpZnlpbmcgdGhlIG1peGVyIGNvbnRyb2xzIHRoYXQgbWF5IGJlIHVzZWQgdG8KLXJlY29yZC4gIFNlZSB0aGUgY29kZSBleGFtcGxlIGZvciBcbWV0aG9ke2NvbnRyb2xzKCl9IGZvciBhbiBleGFtcGxlIG9mCi1yZWFkaW5nIGZyb20gYSBiaXRtYXNrLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bbWl4ZXIgZGV2aWNlXXtnZXR9e2NvbnRyb2x9Ci1SZXR1cm5zIHRoZSB2b2x1bWUgb2YgYSBnaXZlbiBtaXhlciBjb250cm9sLiAgVGhlIHJldHVybmVkIHZvbHVtZSBpcyBhCi0yLXR1cGxlIFxjb2RleyhsZWZ0X3ZvbHVtZSxyaWdodF92b2x1bWUpfS4gIFZvbHVtZXMgYXJlIHNwZWNpZmllZCBhcwotbnVtYmVycyBmcm9tIDAgKHNpbGVudCkgdG8gMTAwIChmdWxsIHZvbHVtZSkuICBJZiB0aGUgY29udHJvbCBpcwotbW9ub3Bob25pYywgYSAyLXR1cGxlIGlzIHN0aWxsIHJldHVybmVkLCBidXQgYm90aCB2b2x1bWVzIGFyZQotdGhlIHNhbWUuCi0KLVJhaXNlcyBcZXhjZXB0aW9ue09TU0F1ZGlvRXJyb3J9IGlmIGFuIGludmFsaWQgY29udHJvbCB3YXMgaXMgc3BlY2lmaWVkLAotb3IgXGV4Y2VwdGlvbntJT0Vycm9yfSBpZiBhbiB1bnN1cHBvcnRlZCBjb250cm9sIGlzIHNwZWNpZmllZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W21peGVyIGRldmljZV17c2V0fXtjb250cm9sLCAobGVmdCwgcmlnaHQpfQotU2V0cyB0aGUgdm9sdW1lIGZvciBhIGdpdmVuIG1peGVyIGNvbnRyb2wgdG8gXGNvZGV7KGxlZnQscmlnaHQpfS4KLVxjb2Rle2xlZnR9IGFuZCBcY29kZXtyaWdodH0gbXVzdCBiZSBpbnRzIGFuZCBiZXR3ZWVuIDAgKHNpbGVudCkgYW5kIDEwMAotKGZ1bGwgdm9sdW1lKS4gIE9uIHN1Y2Nlc3MsIHRoZSBuZXcgdm9sdW1lIGlzIHJldHVybmVkIGFzIGEgMi10dXBsZS4KLU5vdGUgdGhhdCB0aGlzIG1heSBub3QgYmUgZXhhY3RseSB0aGUgc2FtZSBhcyB0aGUgdm9sdW1lIHNwZWNpZmllZCwKLWJlY2F1c2Ugb2YgdGhlIGxpbWl0ZWQgcmVzb2x1dGlvbiBvZiBzb21lIHNvdW5kY2FyZCdzIG1peGVycy4KLQotUmFpc2VzIFxleGNlcHRpb257T1NTQXVkaW9FcnJvcn0gaWYgYW4gaW52YWxpZCBtaXhlciBjb250cm9sIHdhcwotc3BlY2lmaWVkLCBvciBpZiB0aGUgc3BlY2lmaWVkIHZvbHVtZXMgd2VyZSBvdXQtb2YtcmFuZ2UuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVttaXhlciBkZXZpY2Vde2dldF9yZWNzcmN9e30KLVRoaXMgbWV0aG9kIHJldHVybnMgYSBiaXRtYXNrIGluZGljYXRpbmcgd2hpY2ggY29udHJvbChzKSBhcmUKLWN1cnJlbnRseSBiZWluZyB1c2VkIGFzIGEgcmVjb3JkaW5nIHNvdXJjZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W21peGVyIGRldmljZV17c2V0X3JlY3NyY317Yml0bWFza30KLUNhbGwgdGhpcyBmdW5jdGlvbiB0byBzcGVjaWZ5IGEgcmVjb3JkaW5nIHNvdXJjZS4gIFJldHVybnMgYSBiaXRtYXNrCi1pbmRpY2F0aW5nIHRoZSBuZXcgcmVjb3JkaW5nIHNvdXJjZSAob3Igc291cmNlcykgaWYgc3VjY2Vzc2Z1bDsgcmFpc2VzCi1cZXhjZXB0aW9ue0lPRXJyb3J9IGlmIGFuIGludmFsaWQgc291cmNlIHdhcyBzcGVjaWZpZWQuICBUbyBzZXQgdGhlIGN1cnJlbnQKLXJlY29yZGluZyBzb3VyY2UgdG8gdGhlIG1pY3JvcGhvbmUgaW5wdXQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLW1peGVyLnNldHJlY3NyYyAoMSA8PCBvc3NhdWRpb2Rldi5TT1VORF9NSVhFUl9NSUMpCi1cZW5ke3ZlcmJhdGltfQotXGVuZHttZXRob2RkZXNjfQotCi0KLQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJwYXJzZXIudGV4IGIvRG9jL2xpYi9saWJwYXJzZXIudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTkzNjI0Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlicGFyc2VyLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDcxMiArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3BhcnNlcn0gLS0tCi0gICAgICAgICBBY2Nlc3MgUHl0aG9uIHBhcnNlIHRyZWVzfQotCi0lIENvcHlyaWdodCAxOTk1IFZpcmdpbmlhIFBvbHl0ZWNobmljIEluc3RpdHV0ZSBhbmQgU3RhdGUgVW5pdmVyc2l0eQotJSBhbmQgRnJlZCBMLiBEcmFrZSwgSnIuICBUaGlzIGNvcHlyaWdodCBub3RpY2UgbXVzdCBiZSBkaXN0cmlidXRlZCBvbgotJSBhbGwgY29waWVzLCBidXQgdGhpcyBkb2N1bWVudCBvdGhlcndpc2UgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQKLSUgb2YgdGhlIFB5dGhvbiBkaXN0cmlidXRpb24uICBObyBmZWUgbWF5IGJlIGNoYXJnZWQgZm9yIHRoaXMgZG9jdW1lbnQKLSUgaW4gYW55IHJlcHJlc2VudGF0aW9uLCBlaXRoZXIgb24gcGFwZXIgb3IgZWxlY3Ryb25pY2FsbHkuICBUaGlzCi0lIHJlc3RyaWN0aW9uIGRvZXMgbm90IGFmZmVjdCBvdGhlciBlbGVtZW50cyBpbiBhIGRpc3RyaWJ1dGVkIHBhY2thZ2UKLSUgaW4gYW55IHdheS4KLQotXGRlY2xhcmVtb2R1bGV7YnVpbHRpbn17cGFyc2VyfQotXG1vZHVsZXN5bm9wc2lze0FjY2VzcyBwYXJzZSB0cmVlcyBmb3IgUHl0aG9uIHNvdXJjZSBjb2RlLn0KLVxtb2R1bGVhdXRob3J7RnJlZCBMLiBEcmFrZSwgSnIufXtmZHJha2VAYWNtLm9yZ30KLVxzZWN0aW9uYXV0aG9ye0ZyZWQgTC4gRHJha2UsIEpyLn17ZmRyYWtlQGFjbS5vcmd9Ci0KLQotXGluZGV4e3BhcnNpbmchUHl0aG9uIHNvdXJjZSBjb2RlfQotCi1UaGUgXG1vZHVsZXtwYXJzZXJ9IG1vZHVsZSBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gUHl0aG9uJ3MgaW50ZXJuYWwKLXBhcnNlciBhbmQgYnl0ZS1jb2RlIGNvbXBpbGVyLiAgVGhlIHByaW1hcnkgcHVycG9zZSBmb3IgdGhpcyBpbnRlcmZhY2UKLWlzIHRvIGFsbG93IFB5dGhvbiBjb2RlIHRvIGVkaXQgdGhlIHBhcnNlIHRyZWUgb2YgYSBQeXRob24gZXhwcmVzc2lvbgotYW5kIGNyZWF0ZSBleGVjdXRhYmxlIGNvZGUgZnJvbSB0aGlzLiAgVGhpcyBpcyBiZXR0ZXIgdGhhbiB0cnlpbmcKLXRvIHBhcnNlIGFuZCBtb2RpZnkgYW4gYXJiaXRyYXJ5IFB5dGhvbiBjb2RlIGZyYWdtZW50IGFzIGEgc3RyaW5nCi1iZWNhdXNlIHBhcnNpbmcgaXMgcGVyZm9ybWVkIGluIGEgbWFubmVyIGlkZW50aWNhbCB0byB0aGUgY29kZQotZm9ybWluZyB0aGUgYXBwbGljYXRpb24uICBJdCBpcyBhbHNvIGZhc3Rlci4KLQotVGhlcmUgYXJlIGEgZmV3IHRoaW5ncyB0byBub3RlIGFib3V0IHRoaXMgbW9kdWxlIHdoaWNoIGFyZSBpbXBvcnRhbnQKLXRvIG1ha2luZyB1c2Ugb2YgdGhlIGRhdGEgc3RydWN0dXJlcyBjcmVhdGVkLiAgVGhpcyBpcyBub3QgYSB0dXRvcmlhbAotb24gZWRpdGluZyB0aGUgcGFyc2UgdHJlZXMgZm9yIFB5dGhvbiBjb2RlLCBidXQgc29tZSBleGFtcGxlcyBvZiB1c2luZwotdGhlIFxtb2R1bGV7cGFyc2VyfSBtb2R1bGUgYXJlIHByZXNlbnRlZC4KLQotTW9zdCBpbXBvcnRhbnRseSwgYSBnb29kIHVuZGVyc3RhbmRpbmcgb2YgdGhlIFB5dGhvbiBncmFtbWFyIHByb2Nlc3NlZAotYnkgdGhlIGludGVybmFsIHBhcnNlciBpcyByZXF1aXJlZC4gIEZvciBmdWxsIGluZm9ybWF0aW9uIG9uIHRoZQotbGFuZ3VhZ2Ugc3ludGF4LCByZWZlciB0byB0aGUgXGNpdGV0aXRsZVsuLi9yZWYvcmVmLmh0bWxde1B5dGhvbgotTGFuZ3VhZ2UgUmVmZXJlbmNlfS4gIFRoZSBwYXJzZXIgaXRzZWxmIGlzIGNyZWF0ZWQgZnJvbSBhIGdyYW1tYXIKLXNwZWNpZmljYXRpb24gZGVmaW5lZCBpbiB0aGUgZmlsZSBcZmlsZXtHcmFtbWFyL0dyYW1tYXJ9IGluIHRoZQotc3RhbmRhcmQgUHl0aG9uIGRpc3RyaWJ1dGlvbi4gIFRoZSBwYXJzZSB0cmVlcyBzdG9yZWQgaW4gdGhlIEFTVAotb2JqZWN0cyBjcmVhdGVkIGJ5IHRoaXMgbW9kdWxlIGFyZSB0aGUgYWN0dWFsIG91dHB1dCBmcm9tIHRoZSBpbnRlcm5hbAotcGFyc2VyIHdoZW4gY3JlYXRlZCBieSB0aGUgXGZ1bmN0aW9ue2V4cHIoKX0gb3IgXGZ1bmN0aW9ue3N1aXRlKCl9Ci1mdW5jdGlvbnMsIGRlc2NyaWJlZCBiZWxvdy4gIFRoZSBBU1Qgb2JqZWN0cyBjcmVhdGVkIGJ5Ci1cZnVuY3Rpb257c2VxdWVuY2UyYXN0KCl9IGZhaXRoZnVsbHkgc2ltdWxhdGUgdGhvc2Ugc3RydWN0dXJlcy4gIEJlCi1hd2FyZSB0aGF0IHRoZSB2YWx1ZXMgb2YgdGhlIHNlcXVlbmNlcyB3aGljaCBhcmUgY29uc2lkZXJlZAotYGBjb3JyZWN0Jycgd2lsbCB2YXJ5IGZyb20gb25lIHZlcnNpb24gb2YgUHl0aG9uIHRvIGFub3RoZXIgYXMgdGhlCi1mb3JtYWwgZ3JhbW1hciBmb3IgdGhlIGxhbmd1YWdlIGlzIHJldmlzZWQuICBIb3dldmVyLCB0cmFuc3BvcnRpbmcKLWNvZGUgZnJvbSBvbmUgUHl0aG9uIHZlcnNpb24gdG8gYW5vdGhlciBhcyBzb3VyY2UgdGV4dCB3aWxsIGFsd2F5cwotYWxsb3cgY29ycmVjdCBwYXJzZSB0cmVlcyB0byBiZSBjcmVhdGVkIGluIHRoZSB0YXJnZXQgdmVyc2lvbiwgd2l0aAotdGhlIG9ubHkgcmVzdHJpY3Rpb24gYmVpbmcgdGhhdCBtaWdyYXRpbmcgdG8gYW4gb2xkZXIgdmVyc2lvbiBvZiB0aGUKLWludGVycHJldGVyIHdpbGwgbm90IHN1cHBvcnQgbW9yZSByZWNlbnQgbGFuZ3VhZ2UgY29uc3RydWN0cy4gIFRoZQotcGFyc2UgdHJlZXMgYXJlIG5vdCB0eXBpY2FsbHkgY29tcGF0aWJsZSBmcm9tIG9uZSB2ZXJzaW9uIHRvIGFub3RoZXIsCi13aGVyZWFzIHNvdXJjZSBjb2RlIGhhcyBhbHdheXMgYmVlbiBmb3J3YXJkLWNvbXBhdGlibGUuCi0KLUVhY2ggZWxlbWVudCBvZiB0aGUgc2VxdWVuY2VzIHJldHVybmVkIGJ5IFxmdW5jdGlvbnthc3QybGlzdCgpfSBvcgotXGZ1bmN0aW9ue2FzdDJ0dXBsZSgpfSBoYXMgYSBzaW1wbGUgZm9ybS4gIFNlcXVlbmNlcyByZXByZXNlbnRpbmcKLW5vbi10ZXJtaW5hbCBlbGVtZW50cyBpbiB0aGUgZ3JhbW1hciBhbHdheXMgaGF2ZSBhIGxlbmd0aCBncmVhdGVyIHRoYW4KLW9uZS4gIFRoZSBmaXJzdCBlbGVtZW50IGlzIGFuIGludGVnZXIgd2hpY2ggaWRlbnRpZmllcyBhIHByb2R1Y3Rpb24gaW4KLXRoZSBncmFtbWFyLiAgVGhlc2UgaW50ZWdlcnMgYXJlIGdpdmVuIHN5bWJvbGljIG5hbWVzIGluIHRoZSBDIGhlYWRlcgotZmlsZSBcZmlsZXtJbmNsdWRlL2dyYW1pbml0Lmh9IGFuZCB0aGUgUHl0aG9uIG1vZHVsZQotXHJlZm1vZHVsZXtzeW1ib2x9LiAgRWFjaCBhZGRpdGlvbmFsIGVsZW1lbnQgb2YgdGhlIHNlcXVlbmNlIHJlcHJlc2VudHMKLWEgY29tcG9uZW50IG9mIHRoZSBwcm9kdWN0aW9uIGFzIHJlY29nbml6ZWQgaW4gdGhlIGlucHV0IHN0cmluZzogdGhlc2UKLWFyZSBhbHdheXMgc2VxdWVuY2VzIHdoaWNoIGhhdmUgdGhlIHNhbWUgZm9ybSBhcyB0aGUgcGFyZW50LiAgQW4KLWltcG9ydGFudCBhc3BlY3Qgb2YgdGhpcyBzdHJ1Y3R1cmUgd2hpY2ggc2hvdWxkIGJlIG5vdGVkIGlzIHRoYXQKLWtleXdvcmRzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHBhcmVudCBub2RlIHR5cGUsIHN1Y2ggYXMgdGhlIGtleXdvcmQKLVxrZXl3b3Jke2lmfSBpbiBhbiBcY29uc3RhbnR7aWZfc3RtdH0sIGFyZSBpbmNsdWRlZCBpbiB0aGUgbm9kZSB0cmVlIHdpdGhvdXQKLWFueSBzcGVjaWFsIHRyZWF0bWVudC4gIEZvciBleGFtcGxlLCB0aGUgXGtleXdvcmR7aWZ9IGtleXdvcmQgaXMKLXJlcHJlc2VudGVkIGJ5IHRoZSB0dXBsZSBcY29kZXsoMSwgJ2lmJyl9LCB3aGVyZSBcY29kZXsxfSBpcyB0aGUKLW51bWVyaWMgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGFsbCBcY29uc3RhbnR7TkFNRX0gdG9rZW5zLCBpbmNsdWRpbmcKLXZhcmlhYmxlIGFuZCBmdW5jdGlvbiBuYW1lcyBkZWZpbmVkIGJ5IHRoZSB1c2VyLiAgSW4gYW4gYWx0ZXJuYXRlIGZvcm0KLXJldHVybmVkIHdoZW4gbGluZSBudW1iZXIgaW5mb3JtYXRpb24gaXMgcmVxdWVzdGVkLCB0aGUgc2FtZSB0b2tlbgotbWlnaHQgYmUgcmVwcmVzZW50ZWQgYXMgXGNvZGV7KDEsICdpZicsIDEyKX0sIHdoZXJlIHRoZSBcY29kZXsxMn0KLXJlcHJlc2VudHMgdGhlIGxpbmUgbnVtYmVyIGF0IHdoaWNoIHRoZSB0ZXJtaW5hbCBzeW1ib2wgd2FzIGZvdW5kLgotCi1UZXJtaW5hbCBlbGVtZW50cyBhcmUgcmVwcmVzZW50ZWQgaW4gbXVjaCB0aGUgc2FtZSB3YXksIGJ1dCB3aXRob3V0Ci1hbnkgY2hpbGQgZWxlbWVudHMgYW5kIHRoZSBhZGRpdGlvbiBvZiB0aGUgc291cmNlIHRleHQgd2hpY2ggd2FzCi1pZGVudGlmaWVkLiAgVGhlIGV4YW1wbGUgb2YgdGhlIFxrZXl3b3Jke2lmfSBrZXl3b3JkIGFib3ZlIGlzCi1yZXByZXNlbnRhdGl2ZS4gIFRoZSB2YXJpb3VzIHR5cGVzIG9mIHRlcm1pbmFsIHN5bWJvbHMgYXJlIGRlZmluZWQgaW4KLXRoZSBDIGhlYWRlciBmaWxlIFxmaWxle0luY2x1ZGUvdG9rZW4uaH0gYW5kIHRoZSBQeXRob24gbW9kdWxlCi1ccmVmbW9kdWxle3Rva2VufS4KLQotVGhlIEFTVCBvYmplY3RzIGFyZSBub3QgcmVxdWlyZWQgdG8gc3VwcG9ydCB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGlzCi1tb2R1bGUsIGJ1dCBhcmUgcHJvdmlkZWQgZm9yIHRocmVlIHB1cnBvc2VzOiB0byBhbGxvdyBhbiBhcHBsaWNhdGlvbgotdG8gYW1vcnRpemUgdGhlIGNvc3Qgb2YgcHJvY2Vzc2luZyBjb21wbGV4IHBhcnNlIHRyZWVzLCB0byBwcm92aWRlIGEKLXBhcnNlIHRyZWUgcmVwcmVzZW50YXRpb24gd2hpY2ggY29uc2VydmVzIG1lbW9yeSBzcGFjZSB3aGVuIGNvbXBhcmVkCi10byB0aGUgUHl0aG9uIGxpc3Qgb3IgdHVwbGUgcmVwcmVzZW50YXRpb24sIGFuZCB0byBlYXNlIHRoZSBjcmVhdGlvbgotb2YgYWRkaXRpb25hbCBtb2R1bGVzIGluIEMgd2hpY2ggbWFuaXB1bGF0ZSBwYXJzZSB0cmVlcy4gIEEgc2ltcGxlCi1gYHdyYXBwZXInJyBjbGFzcyBtYXkgYmUgY3JlYXRlZCBpbiBQeXRob24gdG8gaGlkZSB0aGUgdXNlIG9mIEFTVAotb2JqZWN0cy4KLQotVGhlIFxtb2R1bGV7cGFyc2VyfSBtb2R1bGUgZGVmaW5lcyBmdW5jdGlvbnMgZm9yIGEgZmV3IGRpc3RpbmN0Ci1wdXJwb3Nlcy4gIFRoZSBtb3N0IGltcG9ydGFudCBwdXJwb3NlcyBhcmUgdG8gY3JlYXRlIEFTVCBvYmplY3RzIGFuZAotdG8gY29udmVydCBBU1Qgb2JqZWN0cyB0byBvdGhlciByZXByZXNlbnRhdGlvbnMgc3VjaCBhcyBwYXJzZSB0cmVlcwotYW5kIGNvbXBpbGVkIGNvZGUgb2JqZWN0cywgYnV0IHRoZXJlIGFyZSBhbHNvIGZ1bmN0aW9ucyB3aGljaCBzZXJ2ZSB0bwotcXVlcnkgdGhlIHR5cGUgb2YgcGFyc2UgdHJlZSByZXByZXNlbnRlZCBieSBhbiBBU1Qgb2JqZWN0LgotCi0KLVxiZWdpbntzZWVhbHNvfQotICBcc2VlbW9kdWxle3N5bWJvbH17VXNlZnVsIGNvbnN0YW50cyByZXByZXNlbnRpbmcgaW50ZXJuYWwgbm9kZXMgb2YKLSAgICAgICAgICAgICAgICAgICAgIHRoZSBwYXJzZSB0cmVlLn0KLSAgXHNlZW1vZHVsZXt0b2tlbn17VXNlZnVsIGNvbnN0YW50cyByZXByZXNlbnRpbmcgbGVhZiBub2RlcyBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgcGFyc2UgdHJlZSBhbmQgZnVuY3Rpb25zIGZvciB0ZXN0aW5nIG5vZGUgdmFsdWVzLn0KLVxlbmR7c2VlYWxzb30KLQotCi1cc3Vic2VjdGlvbntDcmVhdGluZyBBU1QgT2JqZWN0cyBcbGFiZWx7Q3JlYXRpbmcgQVNUc319Ci0KLUFTVCBvYmplY3RzIG1heSBiZSBjcmVhdGVkIGZyb20gc291cmNlIGNvZGUgb3IgZnJvbSBhIHBhcnNlIHRyZWUuCi1XaGVuIGNyZWF0aW5nIGFuIEFTVCBvYmplY3QgZnJvbSBzb3VyY2UsIGRpZmZlcmVudCBmdW5jdGlvbnMgYXJlIHVzZWQKLXRvIGNyZWF0ZSB0aGUgXGNvZGV7J2V2YWwnfSBhbmQgXGNvZGV7J2V4ZWMnfSBmb3Jtcy4KLQotXGJlZ2lue2Z1bmNkZXNjfXtleHByfXtzb3VyY2V9Ci1UaGUgXGZ1bmN0aW9ue2V4cHIoKX0gZnVuY3Rpb24gcGFyc2VzIHRoZSBwYXJhbWV0ZXIgXHZhcntzb3VyY2V9Ci1hcyBpZiBpdCB3ZXJlIGFuIGlucHV0IHRvIFxzYW1we2NvbXBpbGUoXHZhcntzb3VyY2V9LCAnZmlsZS5weScsCi0nZXZhbCcpfS4gIElmIHRoZSBwYXJzZSBzdWNjZWVkcywgYW4gQVNUIG9iamVjdCBpcyBjcmVhdGVkIHRvIGhvbGQgdGhlCi1pbnRlcm5hbCBwYXJzZSB0cmVlIHJlcHJlc2VudGF0aW9uLCBvdGhlcndpc2UgYW4gYXBwcm9wcmlhdGUgZXhjZXB0aW9uCi1pcyB0aHJvd24uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3N1aXRlfXtzb3VyY2V9Ci1UaGUgXGZ1bmN0aW9ue3N1aXRlKCl9IGZ1bmN0aW9uIHBhcnNlcyB0aGUgcGFyYW1ldGVyIFx2YXJ7c291cmNlfQotYXMgaWYgaXQgd2VyZSBhbiBpbnB1dCB0byBcc2FtcHtjb21waWxlKFx2YXJ7c291cmNlfSwgJ2ZpbGUucHknLAotJ2V4ZWMnKX0uICBJZiB0aGUgcGFyc2Ugc3VjY2VlZHMsIGFuIEFTVCBvYmplY3QgaXMgY3JlYXRlZCB0byBob2xkIHRoZQotaW50ZXJuYWwgcGFyc2UgdHJlZSByZXByZXNlbnRhdGlvbiwgb3RoZXJ3aXNlIGFuIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbgotaXMgdGhyb3duLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzZXF1ZW5jZTJhc3R9e3NlcXVlbmNlfQotVGhpcyBmdW5jdGlvbiBhY2NlcHRzIGEgcGFyc2UgdHJlZSByZXByZXNlbnRlZCBhcyBhIHNlcXVlbmNlIGFuZAotYnVpbGRzIGFuIGludGVybmFsIHJlcHJlc2VudGF0aW9uIGlmIHBvc3NpYmxlLiAgSWYgaXQgY2FuIHZhbGlkYXRlCi10aGF0IHRoZSB0cmVlIGNvbmZvcm1zIHRvIHRoZSBQeXRob24gZ3JhbW1hciBhbmQgYWxsIG5vZGVzIGFyZSB2YWxpZAotbm9kZSB0eXBlcyBpbiB0aGUgaG9zdCB2ZXJzaW9uIG9mIFB5dGhvbiwgYW4gQVNUIG9iamVjdCBpcyBjcmVhdGVkCi1mcm9tIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBhbmQgcmV0dXJuZWQgdG8gdGhlIGNhbGxlZC4gIElmIHRoZXJlCi1pcyBhIHByb2JsZW0gY3JlYXRpbmcgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uLCBvciBpZiB0aGUgdHJlZQotY2Fubm90IGJlIHZhbGlkYXRlZCwgYSBcZXhjZXB0aW9ue1BhcnNlckVycm9yfSBleGNlcHRpb24gaXMgdGhyb3duLiAgQW4gQVNUCi1vYmplY3QgY3JlYXRlZCB0aGlzIHdheSBzaG91bGQgbm90IGJlIGFzc3VtZWQgdG8gY29tcGlsZSBjb3JyZWN0bHk7Ci1ub3JtYWwgZXhjZXB0aW9ucyB0aHJvd24gYnkgY29tcGlsYXRpb24gbWF5IHN0aWxsIGJlIGluaXRpYXRlZCB3aGVuCi10aGUgQVNUIG9iamVjdCBpcyBwYXNzZWQgdG8gXGZ1bmN0aW9ue2NvbXBpbGVhc3QoKX0uICBUaGlzIG1heSBpbmRpY2F0ZQotcHJvYmxlbXMgbm90IHJlbGF0ZWQgdG8gc3ludGF4IChzdWNoIGFzIGEgXGV4Y2VwdGlvbntNZW1vcnlFcnJvcn0KLWV4Y2VwdGlvbiksIGJ1dCBtYXkgYWxzbyBiZSBkdWUgdG8gY29uc3RydWN0cyBzdWNoIGFzIHRoZSByZXN1bHQgb2YKLXBhcnNpbmcgXGNvZGV7ZGVsIGYoMCl9LCB3aGljaCBlc2NhcGVzIHRoZSBQeXRob24gcGFyc2VyIGJ1dCBpcwotY2hlY2tlZCBieSB0aGUgYnl0ZWNvZGUgY29tcGlsZXIuCi0KLVNlcXVlbmNlcyByZXByZXNlbnRpbmcgdGVybWluYWwgdG9rZW5zIG1heSBiZSByZXByZXNlbnRlZCBhcyBlaXRoZXIKLXR3by1lbGVtZW50IGxpc3RzIG9mIHRoZSBmb3JtIFxjb2RleygxLCAnbmFtZScpfSBvciBhcyB0aHJlZS1lbGVtZW50Ci1saXN0cyBvZiB0aGUgZm9ybSBcY29kZXsoMSwgJ25hbWUnLCA1Nil9LiAgSWYgdGhlIHRoaXJkIGVsZW1lbnQgaXMKLXByZXNlbnQsIGl0IGlzIGFzc3VtZWQgdG8gYmUgYSB2YWxpZCBsaW5lIG51bWJlci4gIFRoZSBsaW5lIG51bWJlcgotbWF5IGJlIHNwZWNpZmllZCBmb3IgYW55IHN1YnNldCBvZiB0aGUgdGVybWluYWwgc3ltYm9scyBpbiB0aGUgaW5wdXQKLXRyZWUuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3R1cGxlMmFzdH17c2VxdWVuY2V9Ci1UaGlzIGlzIHRoZSBzYW1lIGZ1bmN0aW9uIGFzIFxmdW5jdGlvbntzZXF1ZW5jZTJhc3QoKX0uICBUaGlzIGVudHJ5IHBvaW50Ci1pcyBtYWludGFpbmVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotXGVuZHtmdW5jZGVzY30KLQotCi1cc3Vic2VjdGlvbntDb252ZXJ0aW5nIEFTVCBPYmplY3RzIFxsYWJlbHtDb252ZXJ0aW5nIEFTVHN9fQotCi1BU1Qgb2JqZWN0cywgcmVnYXJkbGVzcyBvZiB0aGUgaW5wdXQgdXNlZCB0byBjcmVhdGUgdGhlbSwgbWF5IGJlCi1jb252ZXJ0ZWQgdG8gcGFyc2UgdHJlZXMgcmVwcmVzZW50ZWQgYXMgbGlzdC0gb3IgdHVwbGUtIHRyZWVzLCBvciBtYXkKLWJlIGNvbXBpbGVkIGludG8gZXhlY3V0YWJsZSBjb2RlIG9iamVjdHMuICBQYXJzZSB0cmVlcyBtYXkgYmUKLWV4dHJhY3RlZCB3aXRoIG9yIHdpdGhvdXQgbGluZSBudW1iZXJpbmcgaW5mb3JtYXRpb24uCi0KLVxiZWdpbntmdW5jZGVzY317YXN0Mmxpc3R9e2FzdFxvcHRpb25hbHssIGxpbmVfaW5mb319Ci1UaGlzIGZ1bmN0aW9uIGFjY2VwdHMgYW4gQVNUIG9iamVjdCBmcm9tIHRoZSBjYWxsZXIgaW4KLVx2YXJ7YXN0fSBhbmQgcmV0dXJucyBhIFB5dGhvbiBsaXN0IHJlcHJlc2VudGluZyB0aGUKLWVxdWl2YWxlbnQgcGFyc2UgdHJlZS4gIFRoZSByZXN1bHRpbmcgbGlzdCByZXByZXNlbnRhdGlvbiBjYW4gYmUgdXNlZAotZm9yIGluc3BlY3Rpb24gb3IgdGhlIGNyZWF0aW9uIG9mIGEgbmV3IHBhcnNlIHRyZWUgaW4gbGlzdCBmb3JtLiAgVGhpcwotZnVuY3Rpb24gZG9lcyBub3QgZmFpbCBzbyBsb25nIGFzIG1lbW9yeSBpcyBhdmFpbGFibGUgdG8gYnVpbGQgdGhlCi1saXN0IHJlcHJlc2VudGF0aW9uLiAgSWYgdGhlIHBhcnNlIHRyZWUgd2lsbCBvbmx5IGJlIHVzZWQgZm9yCi1pbnNwZWN0aW9uLCBcZnVuY3Rpb257YXN0MnR1cGxlKCl9IHNob3VsZCBiZSB1c2VkIGluc3RlYWQgdG8gcmVkdWNlIG1lbW9yeQotY29uc3VtcHRpb24gYW5kIGZyYWdtZW50YXRpb24uICBXaGVuIHRoZSBsaXN0IHJlcHJlc2VudGF0aW9uIGlzCi1yZXF1aXJlZCwgdGhpcyBmdW5jdGlvbiBpcyBzaWduaWZpY2FudGx5IGZhc3RlciB0aGFuIHJldHJpZXZpbmcgYQotdHVwbGUgcmVwcmVzZW50YXRpb24gYW5kIGNvbnZlcnRpbmcgdGhhdCB0byBuZXN0ZWQgbGlzdHMuCi0KLUlmIFx2YXJ7bGluZV9pbmZvfSBpcyB0cnVlLCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiB3aWxsIGJlCi1pbmNsdWRlZCBmb3IgYWxsIHRlcm1pbmFsIHRva2VucyBhcyBhIHRoaXJkIGVsZW1lbnQgb2YgdGhlIGxpc3QKLXJlcHJlc2VudGluZyB0aGUgdG9rZW4uICBOb3RlIHRoYXQgdGhlIGxpbmUgbnVtYmVyIHByb3ZpZGVkIHNwZWNpZmllcwotdGhlIGxpbmUgb24gd2hpY2ggdGhlIHRva2VuIFxlbXBoe2VuZHN9LiAgVGhpcyBpbmZvcm1hdGlvbiBpcwotb21pdHRlZCBpZiB0aGUgZmxhZyBpcyBmYWxzZSBvciBvbWl0dGVkLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXthc3QydHVwbGV9e2FzdFxvcHRpb25hbHssIGxpbmVfaW5mb319Ci1UaGlzIGZ1bmN0aW9uIGFjY2VwdHMgYW4gQVNUIG9iamVjdCBmcm9tIHRoZSBjYWxsZXIgaW4KLVx2YXJ7YXN0fSBhbmQgcmV0dXJucyBhIFB5dGhvbiB0dXBsZSByZXByZXNlbnRpbmcgdGhlCi1lcXVpdmFsZW50IHBhcnNlIHRyZWUuICBPdGhlciB0aGFuIHJldHVybmluZyBhIHR1cGxlIGluc3RlYWQgb2YgYQotbGlzdCwgdGhpcyBmdW5jdGlvbiBpcyBpZGVudGljYWwgdG8gXGZ1bmN0aW9ue2FzdDJsaXN0KCl9LgotCi1JZiBcdmFye2xpbmVfaW5mb30gaXMgdHJ1ZSwgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gd2lsbCBiZQotaW5jbHVkZWQgZm9yIGFsbCB0ZXJtaW5hbCB0b2tlbnMgYXMgYSB0aGlyZCBlbGVtZW50IG9mIHRoZSBsaXN0Ci1yZXByZXNlbnRpbmcgdGhlIHRva2VuLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBvbWl0dGVkIGlmIHRoZSBmbGFnIGlzCi1mYWxzZSBvciBvbWl0dGVkLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtjb21waWxlYXN0fXthc3Rcb3B0aW9uYWx7LCBmaWxlbmFtZVxjb2RleyA9ICc8YXN0Pid9fX0KLVRoZSBQeXRob24gYnl0ZSBjb21waWxlciBjYW4gYmUgaW52b2tlZCBvbiBhbiBBU1Qgb2JqZWN0IHRvIHByb2R1Y2UKLWNvZGUgb2JqZWN0cyB3aGljaCBjYW4gYmUgdXNlZCBhcyBwYXJ0IG9mIGEgY2FsbCB0byB0aGUgYnVpbHQtaW4KLVxmdW5jdGlvbntleGVjKCl9XGJpZnVuY2luZGV4e2V4ZWN9IG9yIFxmdW5jdGlvbntldmFsKCl9Ci1cYmlmdW5jaW5kZXh7ZXZhbH0gZnVuY3Rpb25zLgotVGhpcyBmdW5jdGlvbiBwcm92aWRlcyB0aGUgaW50ZXJmYWNlIHRvIHRoZSBjb21waWxlciwgcGFzc2luZyB0aGUKLWludGVybmFsIHBhcnNlIHRyZWUgZnJvbSBcdmFye2FzdH0gdG8gdGhlIHBhcnNlciwgdXNpbmcgdGhlCi1zb3VyY2UgZmlsZSBuYW1lIHNwZWNpZmllZCBieSB0aGUgXHZhcntmaWxlbmFtZX0gcGFyYW1ldGVyLgotVGhlIGRlZmF1bHQgdmFsdWUgc3VwcGxpZWQgZm9yIFx2YXJ7ZmlsZW5hbWV9IGluZGljYXRlcyB0aGF0Ci10aGUgc291cmNlIHdhcyBhbiBBU1Qgb2JqZWN0LgotCi1Db21waWxpbmcgYW4gQVNUIG9iamVjdCBtYXkgcmVzdWx0IGluIGV4Y2VwdGlvbnMgcmVsYXRlZCB0bwotY29tcGlsYXRpb247IGFuIGV4YW1wbGUgd291bGQgYmUgYSBcZXhjZXB0aW9ue1N5bnRheEVycm9yfSBjYXVzZWQgYnkgdGhlCi1wYXJzZSB0cmVlIGZvciBcY29kZXtkZWwgZigwKX06IHRoaXMgc3RhdGVtZW50IGlzIGNvbnNpZGVyZWQgbGVnYWwKLXdpdGhpbiB0aGUgZm9ybWFsIGdyYW1tYXIgZm9yIFB5dGhvbiBidXQgaXMgbm90IGEgbGVnYWwgbGFuZ3VhZ2UKLWNvbnN0cnVjdC4gIFRoZSBcZXhjZXB0aW9ue1N5bnRheEVycm9yfSByYWlzZWQgZm9yIHRoaXMgY29uZGl0aW9uIGlzCi1hY3R1YWxseSBnZW5lcmF0ZWQgYnkgdGhlIFB5dGhvbiBieXRlLWNvbXBpbGVyIG5vcm1hbGx5LCB3aGljaCBpcyB3aHkKLWl0IGNhbiBiZSByYWlzZWQgYXQgdGhpcyBwb2ludCBieSB0aGUgXG1vZHVsZXtwYXJzZXJ9IG1vZHVsZS4gIE1vc3QKLWNhdXNlcyBvZiBjb21waWxhdGlvbiBmYWlsdXJlIGNhbiBiZSBkaWFnbm9zZWQgcHJvZ3JhbW1hdGljYWxseSBieQotaW5zcGVjdGlvbiBvZiB0aGUgcGFyc2UgdHJlZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotXHN1YnNlY3Rpb257UXVlcmllcyBvbiBBU1QgT2JqZWN0cyBcbGFiZWx7UXVlcnlpbmcgQVNUc319Ci0KLVR3byBmdW5jdGlvbnMgYXJlIHByb3ZpZGVkIHdoaWNoIGFsbG93IGFuIGFwcGxpY2F0aW9uIHRvIGRldGVybWluZSBpZgotYW4gQVNUIHdhcyBjcmVhdGVkIGFzIGFuIGV4cHJlc3Npb24gb3IgYSBzdWl0ZS4gIE5laXRoZXIgb2YgdGhlc2UKLWZ1bmN0aW9ucyBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYgYW4gQVNUIHdhcyBjcmVhdGVkIGZyb20gc291cmNlCi1jb2RlIHZpYSBcZnVuY3Rpb257ZXhwcigpfSBvciBcZnVuY3Rpb257c3VpdGUoKX0gb3IgZnJvbSBhIHBhcnNlIHRyZWUKLXZpYSBcZnVuY3Rpb257c2VxdWVuY2UyYXN0KCl9LgotCi1cYmVnaW57ZnVuY2Rlc2N9e2lzZXhwcn17YXN0fQotV2hlbiBcdmFye2FzdH0gcmVwcmVzZW50cyBhbiBcY29kZXsnZXZhbCd9IGZvcm0sIHRoaXMgZnVuY3Rpb24KLXJldHVybnMgdHJ1ZSwgb3RoZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuICBUaGlzIGlzIHVzZWZ1bCwgc2luY2UgY29kZQotb2JqZWN0cyBub3JtYWxseSBjYW5ub3QgYmUgcXVlcmllZCBmb3IgdGhpcyBpbmZvcm1hdGlvbiB1c2luZyBleGlzdGluZwotYnVpbHQtaW4gZnVuY3Rpb25zLiAgTm90ZSB0aGF0IHRoZSBjb2RlIG9iamVjdHMgY3JlYXRlZCBieQotXGZ1bmN0aW9ue2NvbXBpbGVhc3QoKX0gY2Fubm90IGJlIHF1ZXJpZWQgbGlrZSB0aGlzIGVpdGhlciwgYW5kIGFyZQotaWRlbnRpY2FsIHRvIHRob3NlIGNyZWF0ZWQgYnkgdGhlIGJ1aWx0LWluCi1cZnVuY3Rpb257Y29tcGlsZSgpfVxiaWZ1bmNpbmRleHtjb21waWxlfSBmdW5jdGlvbi4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue2Z1bmNkZXNjfXtpc3N1aXRlfXthc3R9Ci1UaGlzIGZ1bmN0aW9uIG1pcnJvcnMgXGZ1bmN0aW9ue2lzZXhwcigpfSBpbiB0aGF0IGl0IHJlcG9ydHMgd2hldGhlciBhbgotQVNUIG9iamVjdCByZXByZXNlbnRzIGFuIFxjb2RleydleGVjJ30gZm9ybSwgY29tbW9ubHkga25vd24gYXMgYQotYGBzdWl0ZS4nJyAgSXQgaXMgbm90IHNhZmUgdG8gYXNzdW1lIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50Ci10byBcc2FtcHtub3QgaXNleHByKFx2YXJ7YXN0fSl9LCBhcyBhZGRpdGlvbmFsIHN5bnRhY3RpYyBmcmFnbWVudHMgbWF5Ci1iZSBzdXBwb3J0ZWQgaW4gdGhlIGZ1dHVyZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotXHN1YnNlY3Rpb257RXhjZXB0aW9ucyBhbmQgRXJyb3IgSGFuZGxpbmcgXGxhYmVse0FTVCBFcnJvcnN9fQotCi1UaGUgcGFyc2VyIG1vZHVsZSBkZWZpbmVzIGEgc2luZ2xlIGV4Y2VwdGlvbiwgYnV0IG1heSBhbHNvIHBhc3Mgb3RoZXIKLWJ1aWx0LWluIGV4Y2VwdGlvbnMgZnJvbSBvdGhlciBwb3J0aW9ucyBvZiB0aGUgUHl0aG9uIHJ1bnRpbWUKLWVudmlyb25tZW50LiAgU2VlIGVhY2ggZnVuY3Rpb24gZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleGNlcHRpb25zCi1pdCBjYW4gcmFpc2UuCi0KLVxiZWdpbntleGNkZXNjfXtQYXJzZXJFcnJvcn0KLUV4Y2VwdGlvbiByYWlzZWQgd2hlbiBhIGZhaWx1cmUgb2NjdXJzIHdpdGhpbiB0aGUgcGFyc2VyIG1vZHVsZS4gIFRoaXMKLWlzIGdlbmVyYWxseSBwcm9kdWNlZCBmb3IgdmFsaWRhdGlvbiBmYWlsdXJlcyByYXRoZXIgdGhhbiB0aGUgYnVpbHQgaW4KLVxleGNlcHRpb257U3ludGF4RXJyb3J9IHRocm93biBkdXJpbmcgbm9ybWFsIHBhcnNpbmcuCi1UaGUgZXhjZXB0aW9uIGFyZ3VtZW50IGlzIGVpdGhlciBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSByZWFzb24gb2YgdGhlCi1mYWlsdXJlIG9yIGEgdHVwbGUgY29udGFpbmluZyBhIHNlcXVlbmNlIGNhdXNpbmcgdGhlIGZhaWx1cmUgZnJvbSBhIHBhcnNlCi10cmVlIHBhc3NlZCB0byBcZnVuY3Rpb257c2VxdWVuY2UyYXN0KCl9IGFuZCBhbiBleHBsYW5hdG9yeSBzdHJpbmcuICBDYWxscyB0bwotXGZ1bmN0aW9ue3NlcXVlbmNlMmFzdCgpfSBuZWVkIHRvIGJlIGFibGUgdG8gaGFuZGxlIGVpdGhlciB0eXBlIG9mIGV4Y2VwdGlvbiwKLXdoaWxlIGNhbGxzIHRvIG90aGVyIGZ1bmN0aW9ucyBpbiB0aGUgbW9kdWxlIHdpbGwgb25seSBuZWVkIHRvIGJlCi1hd2FyZSBvZiB0aGUgc2ltcGxlIHN0cmluZyB2YWx1ZXMuCi1cZW5ke2V4Y2Rlc2N9Ci0KLU5vdGUgdGhhdCB0aGUgZnVuY3Rpb25zIFxmdW5jdGlvbntjb21waWxlYXN0KCl9LCBcZnVuY3Rpb257ZXhwcigpfSwgYW5kCi1cZnVuY3Rpb257c3VpdGUoKX0gbWF5IHRocm93IGV4Y2VwdGlvbnMgd2hpY2ggYXJlIG5vcm1hbGx5IHRocm93biBieSB0aGUKLXBhcnNpbmcgYW5kIGNvbXBpbGF0aW9uIHByb2Nlc3MuICBUaGVzZSBpbmNsdWRlIHRoZSBidWlsdCBpbgotZXhjZXB0aW9ucyBcZXhjZXB0aW9ue01lbW9yeUVycm9yfSwgXGV4Y2VwdGlvbntPdmVyZmxvd0Vycm9yfSwKLVxleGNlcHRpb257U3ludGF4RXJyb3J9LCBhbmQgXGV4Y2VwdGlvbntTeXN0ZW1FcnJvcn0uICBJbiB0aGVzZSBjYXNlcywgdGhlc2UKLWV4Y2VwdGlvbnMgY2FycnkgYWxsIHRoZSBtZWFuaW5nIG5vcm1hbGx5IGFzc29jaWF0ZWQgd2l0aCB0aGVtLiAgUmVmZXIKLXRvIHRoZSBkZXNjcmlwdGlvbnMgb2YgZWFjaCBmdW5jdGlvbiBmb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24uCi0KLQotXHN1YnNlY3Rpb257QVNUIE9iamVjdHMgXGxhYmVse0FTVCBPYmplY3RzfX0KLQotT3JkZXJlZCBhbmQgZXF1YWxpdHkgY29tcGFyaXNvbnMgYXJlIHN1cHBvcnRlZCBiZXR3ZWVuIEFTVCBvYmplY3RzLgotUGlja2xpbmcgb2YgQVNUIG9iamVjdHMgKHVzaW5nIHRoZSBccmVmbW9kdWxle3BpY2tsZX0gbW9kdWxlKSBpcyBhbHNvCi1zdXBwb3J0ZWQuCi0KLVxiZWdpbntkYXRhZGVzY317QVNUVHlwZX0KLVRoZSB0eXBlIG9mIHRoZSBvYmplY3RzIHJldHVybmVkIGJ5IFxmdW5jdGlvbntleHByKCl9LAotXGZ1bmN0aW9ue3N1aXRlKCl9IGFuZCBcZnVuY3Rpb257c2VxdWVuY2UyYXN0KCl9LgotXGVuZHtkYXRhZGVzY30KLQotCi1BU1Qgb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLQotCi1cYmVnaW57bWV0aG9kZGVzY31bQVNUXXtjb21waWxlfXtcb3B0aW9uYWx7ZmlsZW5hbWV9fQotU2FtZSBhcyBcY29kZXtjb21waWxlYXN0KFx2YXJ7YXN0fSwgXHZhcntmaWxlbmFtZX0pfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0FTVF17aXNleHByfXt9Ci1TYW1lIGFzIFxjb2Rle2lzZXhwcihcdmFye2FzdH0pfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0FTVF17aXNzdWl0ZX17fQotU2FtZSBhcyBcY29kZXtpc3N1aXRlKFx2YXJ7YXN0fSl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQVNUXXt0b2xpc3R9e1xvcHRpb25hbHtsaW5lX2luZm99fQotU2FtZSBhcyBcY29kZXthc3QybGlzdChcdmFye2FzdH0sIFx2YXJ7bGluZV9pbmZvfSl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQVNUXXt0b3R1cGxlfXtcb3B0aW9uYWx7bGluZV9pbmZvfX0KLVNhbWUgYXMgXGNvZGV7YXN0MnR1cGxlKFx2YXJ7YXN0fSwgXHZhcntsaW5lX2luZm99KX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLQotXHN1YnNlY3Rpb257RXhhbXBsZXMgXGxhYmVse0FTVCBFeGFtcGxlc319Ci0KLVRoZSBwYXJzZXIgbW9kdWxlcyBhbGxvd3Mgb3BlcmF0aW9ucyB0byBiZSBwZXJmb3JtZWQgb24gdGhlIHBhcnNlIHRyZWUKLW9mIFB5dGhvbiBzb3VyY2UgY29kZSBiZWZvcmUgdGhlIGJ5dGVjb2RlIGlzIGdlbmVyYXRlZCwgYW5kIHByb3ZpZGVzCi1mb3IgaW5zcGVjdGlvbiBvZiB0aGUgcGFyc2UgdHJlZSBmb3IgaW5mb3JtYXRpb24gZ2F0aGVyaW5nIHB1cnBvc2VzLgotVHdvIGV4YW1wbGVzIGFyZSBwcmVzZW50ZWQuICBUaGUgc2ltcGxlIGV4YW1wbGUgZGVtb25zdHJhdGVzIGVtdWxhdGlvbgotb2YgdGhlIFxmdW5jdGlvbntjb21waWxlKCl9XGJpZnVuY2luZGV4e2NvbXBpbGV9IGJ1aWx0LWluIGZ1bmN0aW9uIGFuZAotdGhlIGNvbXBsZXggZXhhbXBsZSBzaG93cyB0aGUgdXNlIG9mIGEgcGFyc2UgdHJlZSBmb3IgaW5mb3JtYXRpb24KLWRpc2NvdmVyeS4KLQotXHN1YnN1YnNlY3Rpb257RW11bGF0aW9uIG9mIFxmdW5jdGlvbntjb21waWxlKCl9fQotCi1XaGlsZSBtYW55IHVzZWZ1bCBvcGVyYXRpb25zIG1heSB0YWtlIHBsYWNlIGJldHdlZW4gcGFyc2luZyBhbmQKLWJ5dGVjb2RlIGdlbmVyYXRpb24sIHRoZSBzaW1wbGVzdCBvcGVyYXRpb24gaXMgdG8gZG8gbm90aGluZy4gIEZvcgotdGhpcyBwdXJwb3NlLCB1c2luZyB0aGUgXG1vZHVsZXtwYXJzZXJ9IG1vZHVsZSB0byBwcm9kdWNlIGFuCi1pbnRlcm1lZGlhdGUgZGF0YSBzdHJ1Y3R1cmUgaXMgZXF1aXZhbGVudCB0byB0aGUgY29kZQotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gY29kZSA9IGNvbXBpbGUoJ2EgKyA1JywgJ2ZpbGUucHknLCAnZXZhbCcpCi0+Pj4gYSA9IDUKLT4+PiBldmFsKGNvZGUpCi0xMAotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGVxdWl2YWxlbnQgb3BlcmF0aW9uIHVzaW5nIHRoZSBcbW9kdWxle3BhcnNlcn0gbW9kdWxlIGlzIHNvbWV3aGF0Ci1sb25nZXIsIGFuZCBhbGxvd3MgdGhlIGludGVybWVkaWF0ZSBpbnRlcm5hbCBwYXJzZSB0cmVlIHRvIGJlIHJldGFpbmVkCi1hcyBhbiBBU1Qgb2JqZWN0OgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gaW1wb3J0IHBhcnNlcgotPj4+IGFzdCA9IHBhcnNlci5leHByKCdhICsgNScpCi0+Pj4gY29kZSA9IGFzdC5jb21waWxlKCdmaWxlLnB5JykKLT4+PiBhID0gNQotPj4+IGV2YWwoY29kZSkKLTEwCi1cZW5ke3ZlcmJhdGltfQotCi1BbiBhcHBsaWNhdGlvbiB3aGljaCBuZWVkcyBib3RoIEFTVCBhbmQgY29kZSBvYmplY3RzIGNhbiBwYWNrYWdlIHRoaXMKLWNvZGUgaW50byByZWFkaWx5IGF2YWlsYWJsZSBmdW5jdGlvbnM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCBwYXJzZXIKLQotZGVmIGxvYWRfc3VpdGUoc291cmNlX3N0cmluZyk6Ci0gICAgYXN0ID0gcGFyc2VyLnN1aXRlKHNvdXJjZV9zdHJpbmcpCi0gICAgcmV0dXJuIGFzdCwgYXN0LmNvbXBpbGUoKQotCi1kZWYgbG9hZF9leHByZXNzaW9uKHNvdXJjZV9zdHJpbmcpOgotICAgIGFzdCA9IHBhcnNlci5leHByKHNvdXJjZV9zdHJpbmcpCi0gICAgcmV0dXJuIGFzdCwgYXN0LmNvbXBpbGUoKQotXGVuZHt2ZXJiYXRpbX0KLQotXHN1YnN1YnNlY3Rpb257SW5mb3JtYXRpb24gRGlzY292ZXJ5fQotCi1Tb21lIGFwcGxpY2F0aW9ucyBiZW5lZml0IGZyb20gZGlyZWN0IGFjY2VzcyB0byB0aGUgcGFyc2UgdHJlZS4gIFRoZQotcmVtYWluZGVyIG9mIHRoaXMgc2VjdGlvbiBkZW1vbnN0cmF0ZXMgaG93IHRoZSBwYXJzZSB0cmVlIHByb3ZpZGVzCi1hY2Nlc3MgdG8gbW9kdWxlIGRvY3VtZW50YXRpb24gZGVmaW5lZCBpbgotZG9jc3RyaW5nc1xpbmRleHtzdHJpbmchZG9jdW1lbnRhdGlvbn1caW5kZXh7ZG9jc3RyaW5nc30gd2l0aG91dAotcmVxdWlyaW5nIHRoYXQgdGhlIGNvZGUgYmVpbmcgZXhhbWluZWQgYmUgbG9hZGVkIGludG8gYSBydW5uaW5nCi1pbnRlcnByZXRlciB2aWEgXGtleXdvcmR7aW1wb3J0fS4gIFRoaXMgY2FuIGJlIHZlcnkgdXNlZnVsIGZvcgotcGVyZm9ybWluZyBhbmFseXNlcyBvZiB1bnRydXN0ZWQgY29kZS4KLQotR2VuZXJhbGx5LCB0aGUgZXhhbXBsZSB3aWxsIGRlbW9uc3RyYXRlIGhvdyB0aGUgcGFyc2UgdHJlZSBtYXkgYmUKLXRyYXZlcnNlZCB0byBkaXN0aWxsIGludGVyZXN0aW5nIGluZm9ybWF0aW9uLiAgVHdvIGZ1bmN0aW9ucyBhbmQgYSBzZXQKLW9mIGNsYXNzZXMgYXJlIGRldmVsb3BlZCB3aGljaCBwcm92aWRlIHByb2dyYW1tYXRpYyBhY2Nlc3MgdG8gaGlnaAotbGV2ZWwgZnVuY3Rpb24gYW5kIGNsYXNzIGRlZmluaXRpb25zIHByb3ZpZGVkIGJ5IGEgbW9kdWxlLiAgVGhlCi1jbGFzc2VzIGV4dHJhY3QgaW5mb3JtYXRpb24gZnJvbSB0aGUgcGFyc2UgdHJlZSBhbmQgcHJvdmlkZSBhY2Nlc3MgdG8KLXRoZSBpbmZvcm1hdGlvbiBhdCBhIHVzZWZ1bCBzZW1hbnRpYyBsZXZlbCwgb25lIGZ1bmN0aW9uIHByb3ZpZGVzIGEKLXNpbXBsZSBsb3ctbGV2ZWwgcGF0dGVybiBtYXRjaGluZyBjYXBhYmlsaXR5LCBhbmQgdGhlIG90aGVyIGZ1bmN0aW9uCi1kZWZpbmVzIGEgaGlnaC1sZXZlbCBpbnRlcmZhY2UgdG8gdGhlIGNsYXNzZXMgYnkgaGFuZGxpbmcgZmlsZQotb3BlcmF0aW9ucyBvbiBiZWhhbGYgb2YgdGhlIGNhbGxlci4gIEFsbCBzb3VyY2UgZmlsZXMgbWVudGlvbmVkIGhlcmUKLXdoaWNoIGFyZSBub3QgcGFydCBvZiB0aGUgUHl0aG9uIGluc3RhbGxhdGlvbiBhcmUgbG9jYXRlZCBpbiB0aGUKLVxmaWxle0RlbW8vcGFyc2VyL30gZGlyZWN0b3J5IG9mIHRoZSBkaXN0cmlidXRpb24uCi0KLVRoZSBkeW5hbWljIG5hdHVyZSBvZiBQeXRob24gYWxsb3dzIHRoZSBwcm9ncmFtbWVyIGEgZ3JlYXQgZGVhbCBvZgotZmxleGliaWxpdHksIGJ1dCBtb3N0IG1vZHVsZXMgbmVlZCBvbmx5IGEgbGltaXRlZCBtZWFzdXJlIG9mIHRoaXMgd2hlbgotZGVmaW5pbmcgY2xhc3NlcywgZnVuY3Rpb25zLCBhbmQgbWV0aG9kcy4gIEluIHRoaXMgZXhhbXBsZSwgdGhlIG9ubHkKLWRlZmluaXRpb25zIHRoYXQgd2lsbCBiZSBjb25zaWRlcmVkIGFyZSB0aG9zZSB3aGljaCBhcmUgZGVmaW5lZCBpbiB0aGUKLXRvcCBsZXZlbCBvZiB0aGVpciBjb250ZXh0LCBlLmcuLCBhIGZ1bmN0aW9uIGRlZmluZWQgYnkgYSBca2V5d29yZHtkZWZ9Ci1zdGF0ZW1lbnQgYXQgY29sdW1uIHplcm8gb2YgYSBtb2R1bGUsIGJ1dCBub3QgYSBmdW5jdGlvbiBkZWZpbmVkCi13aXRoaW4gYSBicmFuY2ggb2YgYW4gXGtleXdvcmR7aWZ9IC4uLiBca2V5d29yZHtlbHNlfSBjb25zdHJ1Y3QsIHRob3VnaAotdGhlcmUgYXJlIHNvbWUgZ29vZCByZWFzb25zIGZvciBkb2luZyBzbyBpbiBzb21lIHNpdHVhdGlvbnMuICBOZXN0aW5nCi1vZiBkZWZpbml0aW9ucyB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlIGNvZGUgZGV2ZWxvcGVkIGluIHRoZSBleGFtcGxlLgotCi1UbyBjb25zdHJ1Y3QgdGhlIHVwcGVyLWxldmVsIGV4dHJhY3Rpb24gbWV0aG9kcywgd2UgbmVlZCB0byBrbm93IHdoYXQKLXRoZSBwYXJzZSB0cmVlIHN0cnVjdHVyZSBsb29rcyBsaWtlIGFuZCBob3cgbXVjaCBvZiBpdCB3ZSBhY3R1YWxseQotbmVlZCB0byBiZSBjb25jZXJuZWQgYWJvdXQuICBQeXRob24gdXNlcyBhIG1vZGVyYXRlbHkgZGVlcCBwYXJzZSB0cmVlCi1zbyB0aGVyZSBhcmUgYSBsYXJnZSBudW1iZXIgb2YgaW50ZXJtZWRpYXRlIG5vZGVzLiAgSXQgaXMgaW1wb3J0YW50IHRvCi1yZWFkIGFuZCB1bmRlcnN0YW5kIHRoZSBmb3JtYWwgZ3JhbW1hciB1c2VkIGJ5IFB5dGhvbi4gIFRoaXMgaXMKLXNwZWNpZmllZCBpbiB0aGUgZmlsZSBcZmlsZXtHcmFtbWFyL0dyYW1tYXJ9IGluIHRoZSBkaXN0cmlidXRpb24uCi1Db25zaWRlciB0aGUgc2ltcGxlc3QgY2FzZSBvZiBpbnRlcmVzdCB3aGVuIHNlYXJjaGluZyBmb3IgZG9jc3RyaW5nczoKLWEgbW9kdWxlIGNvbnNpc3Rpbmcgb2YgYSBkb2NzdHJpbmcgYW5kIG5vdGhpbmcgZWxzZS4gIChTZWUgZmlsZQotXGZpbGV7ZG9jc3RyaW5nLnB5fS4pCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLSIiIlNvbWUgZG9jdW1lbnRhdGlvbi4KLSIiIgotXGVuZHt2ZXJiYXRpbX0KLQotVXNpbmcgdGhlIGludGVycHJldGVyIHRvIHRha2UgYSBsb29rIGF0IHRoZSBwYXJzZSB0cmVlLCB3ZSBmaW5kIGEKLWJld2lsZGVyaW5nIG1hc3Mgb2YgbnVtYmVycyBhbmQgcGFyZW50aGVzZXMsIHdpdGggdGhlIGRvY3VtZW50YXRpb24KLWJ1cmllZCBkZWVwIGluIG5lc3RlZCB0dXBsZXMuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgcGFyc2VyCi0+Pj4gaW1wb3J0IHBwcmludAotPj4+IGFzdCA9IHBhcnNlci5zdWl0ZShvcGVuKCdkb2NzdHJpbmcucHknKS5yZWFkKCkpCi0+Pj4gdHVwID0gYXN0LnRvdHVwbGUoKQotPj4+IHBwcmludC5wcHJpbnQodHVwKQotKDI1NywKLSAoMjY0LAotICAoMjY1LAotICAgKDI2NiwKLSAgICAoMjY3LAotICAgICAoMzA3LAotICAgICAgKDI4NywKLSAgICAgICAoMjg4LAotICAgICAgICAoMjg5LAotICAgICAgICAgKDI5MCwKLSAgICAgICAgICAoMjkyLAotICAgICAgICAgICAoMjkzLAotICAgICAgICAgICAgKDI5NCwKLSAgICAgICAgICAgICAoMjk1LAotICAgICAgICAgICAgICAoMjk2LAotICAgICAgICAgICAgICAgKDI5NywKLSAgICAgICAgICAgICAgICAoMjk4LAotICAgICAgICAgICAgICAgICAoMjk5LAotICAgICAgICAgICAgICAgICAgKDMwMCwgKDMsICciIiJTb21lIGRvY3VtZW50YXRpb24uXG4iIiInKSkpKSkpKSkpKSkpKSkpKSksCi0gICAoNCwgJycpKSksCi0gKDQsICcnKSwKLSAoMCwgJycpKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIG51bWJlcnMgYXQgdGhlIGZpcnN0IGVsZW1lbnQgb2YgZWFjaCBub2RlIGluIHRoZSB0cmVlIGFyZSB0aGUgbm9kZQotdHlwZXM7IHRoZXkgbWFwIGRpcmVjdGx5IHRvIHRlcm1pbmFsIGFuZCBub24tdGVybWluYWwgc3ltYm9scyBpbiB0aGUKLWdyYW1tYXIuICBVbmZvcnR1bmF0ZWx5LCB0aGV5IGFyZSByZXByZXNlbnRlZCBhcyBpbnRlZ2VycyBpbiB0aGUKLWludGVybmFsIHJlcHJlc2VudGF0aW9uLCBhbmQgdGhlIFB5dGhvbiBzdHJ1Y3R1cmVzIGdlbmVyYXRlZCBkbyBub3QKLWNoYW5nZSB0aGF0LiAgSG93ZXZlciwgdGhlIFxyZWZtb2R1bGV7c3ltYm9sfSBhbmQgXHJlZm1vZHVsZXt0b2tlbn0gbW9kdWxlcwotcHJvdmlkZSBzeW1ib2xpYyBuYW1lcyBmb3IgdGhlIG5vZGUgdHlwZXMgYW5kIGRpY3Rpb25hcmllcyB3aGljaCBtYXAKLWZyb20gdGhlIGludGVnZXJzIHRvIHRoZSBzeW1ib2xpYyBuYW1lcyBmb3IgdGhlIG5vZGUgdHlwZXMuCi0KLUluIHRoZSBvdXRwdXQgcHJlc2VudGVkIGFib3ZlLCB0aGUgb3V0ZXJtb3N0IHR1cGxlIGNvbnRhaW5zIGZvdXIKLWVsZW1lbnRzOiB0aGUgaW50ZWdlciBcY29kZXsyNTd9IGFuZCB0aHJlZSBhZGRpdGlvbmFsIHR1cGxlcy4gIE5vZGUKLXR5cGUgXGNvZGV7MjU3fSBoYXMgdGhlIHN5bWJvbGljIG5hbWUgXGNvbnN0YW50e2ZpbGVfaW5wdXR9LiAgRWFjaCBvZgotdGhlc2UgaW5uZXIgdHVwbGVzIGNvbnRhaW5zIGFuIGludGVnZXIgYXMgdGhlIGZpcnN0IGVsZW1lbnQ7IHRoZXNlCi1pbnRlZ2VycywgXGNvZGV7MjY0fSwgXGNvZGV7NH0sIGFuZCBcY29kZXswfSwgcmVwcmVzZW50IHRoZSBub2RlIHR5cGVzCi1cY29uc3RhbnR7c3RtdH0sIFxjb25zdGFudHtORVdMSU5FfSwgYW5kIFxjb25zdGFudHtFTkRNQVJLRVJ9LAotcmVzcGVjdGl2ZWx5LgotTm90ZSB0aGF0IHRoZXNlIHZhbHVlcyBtYXkgY2hhbmdlIGRlcGVuZGluZyBvbiB0aGUgdmVyc2lvbiBvZiBQeXRob24KLXlvdSBhcmUgdXNpbmc7IGNvbnN1bHQgXGZpbGV7c3ltYm9sLnB5fSBhbmQgXGZpbGV7dG9rZW4ucHl9IGZvcgotZGV0YWlscyBvZiB0aGUgbWFwcGluZy4gIEl0IHNob3VsZCBiZSBmYWlybHkgY2xlYXIgdGhhdCB0aGUgb3V0ZXJtb3N0Ci1ub2RlIGlzIHJlbGF0ZWQgcHJpbWFyaWx5IHRvIHRoZSBpbnB1dCBzb3VyY2UgcmF0aGVyIHRoYW4gdGhlIGNvbnRlbnRzCi1vZiB0aGUgZmlsZSwgYW5kIG1heSBiZSBkaXNyZWdhcmRlZCBmb3IgdGhlIG1vbWVudC4gIFRoZSBcY29uc3RhbnR7c3RtdH0KLW5vZGUgaXMgbXVjaCBtb3JlIGludGVyZXN0aW5nLiAgSW4gcGFydGljdWxhciwgYWxsIGRvY3N0cmluZ3MgYXJlCi1mb3VuZCBpbiBzdWJ0cmVlcyB3aGljaCBhcmUgZm9ybWVkIGV4YWN0bHkgYXMgdGhpcyBub2RlIGlzIGZvcm1lZCwKLXdpdGggdGhlIG9ubHkgZGlmZmVyZW5jZSBiZWluZyB0aGUgc3RyaW5nIGl0c2VsZi4gIFRoZSBhc3NvY2lhdGlvbgotYmV0d2VlbiB0aGUgZG9jc3RyaW5nIGluIGEgc2ltaWxhciB0cmVlIGFuZCB0aGUgZGVmaW5lZCBlbnRpdHkgKGNsYXNzLAotZnVuY3Rpb24sIG9yIG1vZHVsZSkgd2hpY2ggaXQgZGVzY3JpYmVzIGlzIGdpdmVuIGJ5IHRoZSBwb3NpdGlvbiBvZgotdGhlIGRvY3N0cmluZyBzdWJ0cmVlIHdpdGhpbiB0aGUgdHJlZSBkZWZpbmluZyB0aGUgZGVzY3JpYmVkCi1zdHJ1Y3R1cmUuCi0KLUJ5IHJlcGxhY2luZyB0aGUgYWN0dWFsIGRvY3N0cmluZyB3aXRoIHNvbWV0aGluZyB0byBzaWduaWZ5IGEgdmFyaWFibGUKLWNvbXBvbmVudCBvZiB0aGUgdHJlZSwgd2UgYWxsb3cgYSBzaW1wbGUgcGF0dGVybiBtYXRjaGluZyBhcHByb2FjaCB0bwotY2hlY2sgYW55IGdpdmVuIHN1YnRyZWUgZm9yIGVxdWl2YWxlbmNlIHRvIHRoZSBnZW5lcmFsIHBhdHRlcm4gZm9yCi1kb2NzdHJpbmdzLiAgU2luY2UgdGhlIGV4YW1wbGUgZGVtb25zdHJhdGVzIGluZm9ybWF0aW9uIGV4dHJhY3Rpb24sIHdlCi1jYW4gc2FmZWx5IHJlcXVpcmUgdGhhdCB0aGUgdHJlZSBiZSBpbiB0dXBsZSBmb3JtIHJhdGhlciB0aGFuIGxpc3QKLWZvcm0sIGFsbG93aW5nIGEgc2ltcGxlIHZhcmlhYmxlIHJlcHJlc2VudGF0aW9uIHRvIGJlCi1cY29kZXtbJ3ZhcmlhYmxlX25hbWUnXX0uICBBIHNpbXBsZSByZWN1cnNpdmUgZnVuY3Rpb24gY2FuIGltcGxlbWVudAotdGhlIHBhdHRlcm4gbWF0Y2hpbmcsIHJldHVybmluZyBhIEJvb2xlYW4gYW5kIGEgZGljdGlvbmFyeSBvZiB2YXJpYWJsZQotbmFtZSB0byB2YWx1ZSBtYXBwaW5ncy4gIChTZWUgZmlsZSBcZmlsZXtleGFtcGxlLnB5fS4pCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLWZyb20gdHlwZXMgaW1wb3J0IExpc3RUeXBlLCBUdXBsZVR5cGUKLQotZGVmIG1hdGNoKHBhdHRlcm4sIGRhdGEsIHZhcnM9Tm9uZSk6Ci0gICAgaWYgdmFycyBpcyBOb25lOgotICAgICAgICB2YXJzID0ge30KLSAgICBpZiB0eXBlKHBhdHRlcm4pIGlzIExpc3RUeXBlOgotICAgICAgICB2YXJzW3BhdHRlcm5bMF1dID0gZGF0YQotICAgICAgICByZXR1cm4gMSwgdmFycwotICAgIGlmIHR5cGUocGF0dGVybikgaXMgbm90IFR1cGxlVHlwZToKLSAgICAgICAgcmV0dXJuIChwYXR0ZXJuID09IGRhdGEpLCB2YXJzCi0gICAgaWYgbGVuKGRhdGEpICE9IGxlbihwYXR0ZXJuKToKLSAgICAgICAgcmV0dXJuIDAsIHZhcnMKLSAgICBmb3IgcGF0dGVybiwgZGF0YSBpbiBtYXAoTm9uZSwgcGF0dGVybiwgZGF0YSk6Ci0gICAgICAgIHNhbWUsIHZhcnMgPSBtYXRjaChwYXR0ZXJuLCBkYXRhLCB2YXJzKQotICAgICAgICBpZiBub3Qgc2FtZToKLSAgICAgICAgICAgIGJyZWFrCi0gICAgcmV0dXJuIHNhbWUsIHZhcnMKLVxlbmR7dmVyYmF0aW19Ci0KLVVzaW5nIHRoaXMgc2ltcGxlIHJlcHJlc2VudGF0aW9uIGZvciBzeW50YWN0aWMgdmFyaWFibGVzIGFuZCB0aGUgc3ltYm9saWMKLW5vZGUgdHlwZXMsIHRoZSBwYXR0ZXJuIGZvciB0aGUgY2FuZGlkYXRlIGRvY3N0cmluZyBzdWJ0cmVlcyBiZWNvbWVzCi1mYWlybHkgcmVhZGFibGUuICAoU2VlIGZpbGUgXGZpbGV7ZXhhbXBsZS5weX0uKQotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgc3ltYm9sCi1pbXBvcnQgdG9rZW4KLQotRE9DU1RSSU5HX1NUTVRfUEFUVEVSTiA9ICgKLSAgICBzeW1ib2wuc3RtdCwKLSAgICAoc3ltYm9sLnNpbXBsZV9zdG10LAotICAgICAoc3ltYm9sLnNtYWxsX3N0bXQsCi0gICAgICAoc3ltYm9sLmV4cHJfc3RtdCwKLSAgICAgICAoc3ltYm9sLnRlc3RsaXN0LAotICAgICAgICAoc3ltYm9sLnRlc3QsCi0gICAgICAgICAoc3ltYm9sLmFuZF90ZXN0LAotICAgICAgICAgIChzeW1ib2wubm90X3Rlc3QsCi0gICAgICAgICAgIChzeW1ib2wuY29tcGFyaXNvbiwKLSAgICAgICAgICAgIChzeW1ib2wuZXhwciwKLSAgICAgICAgICAgICAoc3ltYm9sLnhvcl9leHByLAotICAgICAgICAgICAgICAoc3ltYm9sLmFuZF9leHByLAotICAgICAgICAgICAgICAgKHN5bWJvbC5zaGlmdF9leHByLAotICAgICAgICAgICAgICAgIChzeW1ib2wuYXJpdGhfZXhwciwKLSAgICAgICAgICAgICAgICAgKHN5bWJvbC50ZXJtLAotICAgICAgICAgICAgICAgICAgKHN5bWJvbC5mYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgKHN5bWJvbC5wb3dlciwKLSAgICAgICAgICAgICAgICAgICAgKHN5bWJvbC5hdG9tLAotICAgICAgICAgICAgICAgICAgICAgKHRva2VuLlNUUklORywgWydkb2NzdHJpbmcnXSkKLSAgICAgICAgICAgICAgICAgICAgICkpKSkpKSkpKSkpKSkpKSksCi0gICAgICh0b2tlbi5ORVdMSU5FLCAnJykKLSAgICAgKSkKLVxlbmR7dmVyYmF0aW19Ci0KLVVzaW5nIHRoZSBcZnVuY3Rpb257bWF0Y2goKX0gZnVuY3Rpb24gd2l0aCB0aGlzIHBhdHRlcm4sIGV4dHJhY3RpbmcgdGhlCi1tb2R1bGUgZG9jc3RyaW5nIGZyb20gdGhlIHBhcnNlIHRyZWUgY3JlYXRlZCBwcmV2aW91c2x5IGlzIGVhc3k6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBmb3VuZCwgdmFycyA9IG1hdGNoKERPQ1NUUklOR19TVE1UX1BBVFRFUk4sIHR1cFsxXSkKLT4+PiBmb3VuZAotMQotPj4+IHZhcnMKLXsnZG9jc3RyaW5nJzogJyIiIlNvbWUgZG9jdW1lbnRhdGlvbi5cbiIiIid9Ci1cZW5ke3ZlcmJhdGltfQotCi1PbmNlIHNwZWNpZmljIGRhdGEgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGEgbG9jYXRpb24gd2hlcmUgaXQgaXMKLWV4cGVjdGVkLCB0aGUgcXVlc3Rpb24gb2Ygd2hlcmUgaW5mb3JtYXRpb24gY2FuIGJlIGV4cGVjdGVkCi1uZWVkcyB0byBiZSBhbnN3ZXJlZC4gIFdoZW4gZGVhbGluZyB3aXRoIGRvY3N0cmluZ3MsIHRoZSBhbnN3ZXIgaXMKLWZhaXJseSBzaW1wbGU6IHRoZSBkb2NzdHJpbmcgaXMgdGhlIGZpcnN0IFxjb25zdGFudHtzdG10fSBub2RlIGluIGEgY29kZQotYmxvY2sgKFxjb25zdGFudHtmaWxlX2lucHV0fSBvciBcY29uc3RhbnR7c3VpdGV9IG5vZGUgdHlwZXMpLiAgQSBtb2R1bGUKLWNvbnNpc3RzIG9mIGEgc2luZ2xlIFxjb25zdGFudHtmaWxlX2lucHV0fSBub2RlLCBhbmQgY2xhc3MgYW5kIGZ1bmN0aW9uCi1kZWZpbml0aW9ucyBlYWNoIGNvbnRhaW4gZXhhY3RseSBvbmUgXGNvbnN0YW50e3N1aXRlfSBub2RlLiAgQ2xhc3NlcyBhbmQKLWZ1bmN0aW9ucyBhcmUgcmVhZGlseSBpZGVudGlmaWVkIGFzIHN1YnRyZWVzIG9mIGNvZGUgYmxvY2sgbm9kZXMgd2hpY2gKLXN0YXJ0IHdpdGggXGNvZGV7KHN0bXQsIChjb21wb3VuZF9zdG10LCAoY2xhc3NkZWYsIC4uLn0gb3IKLVxjb2RleyhzdG10LCAoY29tcG91bmRfc3RtdCwgKGZ1bmNkZWYsIC4uLn0uICBOb3RlIHRoYXQgdGhlc2Ugc3VidHJlZXMKLWNhbm5vdCBiZSBtYXRjaGVkIGJ5IFxmdW5jdGlvbnttYXRjaCgpfSBzaW5jZSBpdCBkb2VzIG5vdCBzdXBwb3J0IG11bHRpcGxlCi1zaWJsaW5nIG5vZGVzIHRvIG1hdGNoIHdpdGhvdXQgcmVnYXJkIHRvIG51bWJlci4gIEEgbW9yZSBlbGFib3JhdGUKLW1hdGNoaW5nIGZ1bmN0aW9uIGNvdWxkIGJlIHVzZWQgdG8gb3ZlcmNvbWUgdGhpcyBsaW1pdGF0aW9uLCBidXQgdGhpcwotaXMgc3VmZmljaWVudCBmb3IgdGhlIGV4YW1wbGUuCi0KLUdpdmVuIHRoZSBhYmlsaXR5IHRvIGRldGVybWluZSB3aGV0aGVyIGEgc3RhdGVtZW50IG1pZ2h0IGJlIGEKLWRvY3N0cmluZyBhbmQgZXh0cmFjdCB0aGUgYWN0dWFsIHN0cmluZyBmcm9tIHRoZSBzdGF0ZW1lbnQsIHNvbWUgd29yawotbmVlZHMgdG8gYmUgcGVyZm9ybWVkIHRvIHdhbGsgdGhlIHBhcnNlIHRyZWUgZm9yIGFuIGVudGlyZSBtb2R1bGUgYW5kCi1leHRyYWN0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBuYW1lcyBkZWZpbmVkIGluIGVhY2ggY29udGV4dCBvZiB0aGUKLW1vZHVsZSBhbmQgYXNzb2NpYXRlIGFueSBkb2NzdHJpbmdzIHdpdGggdGhlIG5hbWVzLiAgVGhlIGNvZGUgdG8KLXBlcmZvcm0gdGhpcyB3b3JrIGlzIG5vdCBjb21wbGljYXRlZCwgYnV0IGJlYXJzIHNvbWUgZXhwbGFuYXRpb24uCi0KLVRoZSBwdWJsaWMgaW50ZXJmYWNlIHRvIHRoZSBjbGFzc2VzIGlzIHN0cmFpZ2h0Zm9yd2FyZCBhbmQgc2hvdWxkCi1wcm9iYWJseSBiZSBzb21ld2hhdCBtb3JlIGZsZXhpYmxlLiAgRWFjaCBgYG1ham9yJycgYmxvY2sgb2YgdGhlCi1tb2R1bGUgaXMgZGVzY3JpYmVkIGJ5IGFuIG9iamVjdCBwcm92aWRpbmcgc2V2ZXJhbCBtZXRob2RzIGZvciBpbnF1aXJ5Ci1hbmQgYSBjb25zdHJ1Y3RvciB3aGljaCBhY2NlcHRzIGF0IGxlYXN0IHRoZSBzdWJ0cmVlIG9mIHRoZSBjb21wbGV0ZQotcGFyc2UgdHJlZSB3aGljaCBpdCByZXByZXNlbnRzLiAgVGhlIFxjbGFzc3tNb2R1bGVJbmZvfSBjb25zdHJ1Y3RvcgotYWNjZXB0cyBhbiBvcHRpb25hbCBcdmFye25hbWV9IHBhcmFtZXRlciBzaW5jZSBpdCBjYW5ub3QKLW90aGVyd2lzZSBkZXRlcm1pbmUgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZS4KLQotVGhlIHB1YmxpYyBjbGFzc2VzIGluY2x1ZGUgXGNsYXNze0NsYXNzSW5mb30sIFxjbGFzc3tGdW5jdGlvbkluZm99LAotYW5kIFxjbGFzc3tNb2R1bGVJbmZvfS4gIEFsbCBvYmplY3RzIHByb3ZpZGUgdGhlCi1tZXRob2RzIFxtZXRob2R7Z2V0X25hbWUoKX0sIFxtZXRob2R7Z2V0X2RvY3N0cmluZygpfSwKLVxtZXRob2R7Z2V0X2NsYXNzX25hbWVzKCl9LCBhbmQgXG1ldGhvZHtnZXRfY2xhc3NfaW5mbygpfS4gIFRoZQotXGNsYXNze0NsYXNzSW5mb30gb2JqZWN0cyBzdXBwb3J0IFxtZXRob2R7Z2V0X21ldGhvZF9uYW1lcygpfSBhbmQKLVxtZXRob2R7Z2V0X21ldGhvZF9pbmZvKCl9IHdoaWxlIHRoZSBvdGhlciBjbGFzc2VzIHByb3ZpZGUKLVxtZXRob2R7Z2V0X2Z1bmN0aW9uX25hbWVzKCl9IGFuZCBcbWV0aG9ke2dldF9mdW5jdGlvbl9pbmZvKCl9LgotCi1XaXRoaW4gZWFjaCBvZiB0aGUgZm9ybXMgb2YgY29kZSBibG9jayB0aGF0IHRoZSBwdWJsaWMgY2xhc3NlcwotcmVwcmVzZW50LCBtb3N0IG9mIHRoZSByZXF1aXJlZCBpbmZvcm1hdGlvbiBpcyBpbiB0aGUgc2FtZSBmb3JtIGFuZCBpcwotYWNjZXNzZWQgaW4gdGhlIHNhbWUgd2F5LCB3aXRoIGNsYXNzZXMgaGF2aW5nIHRoZSBkaXN0aW5jdGlvbiB0aGF0Ci1mdW5jdGlvbnMgZGVmaW5lZCBhdCB0aGUgdG9wIGxldmVsIGFyZSByZWZlcnJlZCB0byBhcyBgYG1ldGhvZHMuJycKLVNpbmNlIHRoZSBkaWZmZXJlbmNlIGluIG5vbWVuY2xhdHVyZSByZWZsZWN0cyBhIHJlYWwgc2VtYW50aWMKLWRpc3RpbmN0aW9uIGZyb20gZnVuY3Rpb25zIGRlZmluZWQgb3V0c2lkZSBvZiBhIGNsYXNzLCB0aGUKLWltcGxlbWVudGF0aW9uIG5lZWRzIHRvIG1haW50YWluIHRoZSBkaXN0aW5jdGlvbi4KLUhlbmNlLCBtb3N0IG9mIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBwdWJsaWMgY2xhc3NlcyBjYW4gYmUKLWltcGxlbWVudGVkIGluIGEgY29tbW9uIGJhc2UgY2xhc3MsIFxjbGFzc3tTdWl0ZUluZm9CYXNlfSwgd2l0aCB0aGUKLWFjY2Vzc29ycyBmb3IgZnVuY3Rpb24gYW5kIG1ldGhvZCBpbmZvcm1hdGlvbiBwcm92aWRlZCBlbHNld2hlcmUuCi1Ob3RlIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgY2xhc3Mgd2hpY2ggcmVwcmVzZW50cyBmdW5jdGlvbiBhbmQgbWV0aG9kCi1pbmZvcm1hdGlvbjsgdGhpcyBwYXJhbGxlbHMgdGhlIHVzZSBvZiB0aGUgXGtleXdvcmR7ZGVmfSBzdGF0ZW1lbnQgdG8KLWRlZmluZSBib3RoIHR5cGVzIG9mIGVsZW1lbnRzLgotCi1Nb3N0IG9mIHRoZSBhY2Nlc3NvciBmdW5jdGlvbnMgYXJlIGRlY2xhcmVkIGluIFxjbGFzc3tTdWl0ZUluZm9CYXNlfQotYW5kIGRvIG5vdCBuZWVkIHRvIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlcy4gIE1vcmUgaW1wb3J0YW50bHksIHRoZQotZXh0cmFjdGlvbiBvZiBtb3N0IGluZm9ybWF0aW9uIGZyb20gYSBwYXJzZSB0cmVlIGlzIGhhbmRsZWQgdGhyb3VnaCBhCi1tZXRob2QgY2FsbGVkIGJ5IHRoZSBcY2xhc3N7U3VpdGVJbmZvQmFzZX0gY29uc3RydWN0b3IuICBUaGUgZXhhbXBsZQotY29kZSBmb3IgbW9zdCBvZiB0aGUgY2xhc3NlcyBpcyBjbGVhciB3aGVuIHJlYWQgYWxvbmdzaWRlIHRoZSBmb3JtYWwKLWdyYW1tYXIsIGJ1dCB0aGUgbWV0aG9kIHdoaWNoIHJlY3Vyc2l2ZWx5IGNyZWF0ZXMgbmV3IGluZm9ybWF0aW9uCi1vYmplY3RzIHJlcXVpcmVzIGZ1cnRoZXIgZXhhbWluYXRpb24uICBIZXJlIGlzIHRoZSByZWxldmFudCBwYXJ0IG9mCi10aGUgXGNsYXNze1N1aXRlSW5mb0Jhc2V9IGRlZmluaXRpb24gZnJvbSBcZmlsZXtleGFtcGxlLnB5fToKLQotXGJlZ2lue3ZlcmJhdGltfQotY2xhc3MgU3VpdGVJbmZvQmFzZToKLSAgICBfZG9jc3RyaW5nID0gJycKLSAgICBfbmFtZSA9ICcnCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgdHJlZSA9IE5vbmUpOgotICAgICAgICBzZWxmLl9jbGFzc19pbmZvID0ge30KLSAgICAgICAgc2VsZi5fZnVuY3Rpb25faW5mbyA9IHt9Ci0gICAgICAgIGlmIHRyZWU6Ci0gICAgICAgICAgICBzZWxmLl9leHRyYWN0X2luZm8odHJlZSkKLQotICAgIGRlZiBfZXh0cmFjdF9pbmZvKHNlbGYsIHRyZWUpOgotICAgICAgICAjIGV4dHJhY3QgZG9jc3RyaW5nCi0gICAgICAgIGlmIGxlbih0cmVlKSA9PSAyOgotICAgICAgICAgICAgZm91bmQsIHZhcnMgPSBtYXRjaChET0NTVFJJTkdfU1RNVF9QQVRURVJOWzFdLCB0cmVlWzFdKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgZm91bmQsIHZhcnMgPSBtYXRjaChET0NTVFJJTkdfU1RNVF9QQVRURVJOLCB0cmVlWzNdKQotICAgICAgICBpZiBmb3VuZDoKLSAgICAgICAgICAgIHNlbGYuX2RvY3N0cmluZyA9IGV2YWwodmFyc1snZG9jc3RyaW5nJ10pCi0gICAgICAgICMgZGlzY292ZXIgaW5uZXIgZGVmaW5pdGlvbnMKLSAgICAgICAgZm9yIG5vZGUgaW4gdHJlZVsxOl06Ci0gICAgICAgICAgICBmb3VuZCwgdmFycyA9IG1hdGNoKENPTVBPVU5EX1NUTVRfUEFUVEVSTiwgbm9kZSkKLSAgICAgICAgICAgIGlmIGZvdW5kOgotICAgICAgICAgICAgICAgIGNzdG10ID0gdmFyc1snY29tcG91bmQnXQotICAgICAgICAgICAgICAgIGlmIGNzdG10WzBdID09IHN5bWJvbC5mdW5jZGVmOgotICAgICAgICAgICAgICAgICAgICBuYW1lID0gY3N0bXRbMl1bMV0KLSAgICAgICAgICAgICAgICAgICAgc2VsZi5fZnVuY3Rpb25faW5mb1tuYW1lXSA9IEZ1bmN0aW9uSW5mbyhjc3RtdCkKLSAgICAgICAgICAgICAgICBlbGlmIGNzdG10WzBdID09IHN5bWJvbC5jbGFzc2RlZjoKLSAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGNzdG10WzJdWzFdCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuX2NsYXNzX2luZm9bbmFtZV0gPSBDbGFzc0luZm8oY3N0bXQpCi1cZW5ke3ZlcmJhdGltfQotCi1BZnRlciBpbml0aWFsaXppbmcgc29tZSBpbnRlcm5hbCBzdGF0ZSwgdGhlIGNvbnN0cnVjdG9yIGNhbGxzIHRoZQotXG1ldGhvZHtfZXh0cmFjdF9pbmZvKCl9IG1ldGhvZC4gIFRoaXMgbWV0aG9kIHBlcmZvcm1zIHRoZSBidWxrIG9mIHRoZQotaW5mb3JtYXRpb24gZXh0cmFjdGlvbiB3aGljaCB0YWtlcyBwbGFjZSBpbiB0aGUgZW50aXJlIGV4YW1wbGUuICBUaGUKLWV4dHJhY3Rpb24gaGFzIHR3byBkaXN0aW5jdCBwaGFzZXM6IHRoZSBsb2NhdGlvbiBvZiB0aGUgZG9jc3RyaW5nIGZvcgotdGhlIHBhcnNlIHRyZWUgcGFzc2VkIGluLCBhbmQgdGhlIGRpc2NvdmVyeSBvZiBhZGRpdGlvbmFsIGRlZmluaXRpb25zCi13aXRoaW4gdGhlIGNvZGUgYmxvY2sgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcnNlIHRyZWUuCi0KLVRoZSBpbml0aWFsIFxrZXl3b3Jke2lmfSB0ZXN0IGRldGVybWluZXMgd2hldGhlciB0aGUgbmVzdGVkIHN1aXRlIGlzIG9mCi10aGUgYGBzaG9ydCBmb3JtJycgb3IgdGhlIGBgbG9uZyBmb3JtLicnICBUaGUgc2hvcnQgZm9ybSBpcyB1c2VkIHdoZW4KLXRoZSBjb2RlIGJsb2NrIGlzIG9uIHRoZSBzYW1lIGxpbmUgYXMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGNvZGUKLWJsb2NrLCBhcyBpbgotCi1cYmVnaW57dmVyYmF0aW19Ci1kZWYgc3F1YXJlKHgpOiAiU3F1YXJlIGFuIGFyZ3VtZW50LiI7IHJldHVybiB4ICoqIDIKLVxlbmR7dmVyYmF0aW19Ci0KLXdoaWxlIHRoZSBsb25nIGZvcm0gdXNlcyBhbiBpbmRlbnRlZCBibG9jayBhbmQgYWxsb3dzIG5lc3RlZAotZGVmaW5pdGlvbnM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWRlZiBtYWtlX3Bvd2VyKGV4cCk6Ci0gICAgIk1ha2UgYSBmdW5jdGlvbiB0aGF0IHJhaXNlcyBhbiBhcmd1bWVudCB0byB0aGUgZXhwb25lbnQgYGV4cCcuIgotICAgIGRlZiByYWlzZXIoeCwgeT1leHApOgotICAgICAgICByZXR1cm4geCAqKiB5Ci0gICAgcmV0dXJuIHJhaXNlcgotXGVuZHt2ZXJiYXRpbX0KLQotV2hlbiB0aGUgc2hvcnQgZm9ybSBpcyB1c2VkLCB0aGUgY29kZSBibG9jayBtYXkgY29udGFpbiBhIGRvY3N0cmluZyBhcwotdGhlIGZpcnN0LCBhbmQgcG9zc2libHkgb25seSwgXGNvbnN0YW50e3NtYWxsX3N0bXR9IGVsZW1lbnQuICBUaGUKLWV4dHJhY3Rpb24gb2Ygc3VjaCBhIGRvY3N0cmluZyBpcyBzbGlnaHRseSBkaWZmZXJlbnQgYW5kIHJlcXVpcmVzIG9ubHkKLWEgcG9ydGlvbiBvZiB0aGUgY29tcGxldGUgcGF0dGVybiB1c2VkIGluIHRoZSBtb3JlIGNvbW1vbiBjYXNlLiAgQXMKLWltcGxlbWVudGVkLCB0aGUgZG9jc3RyaW5nIHdpbGwgb25seSBiZSBmb3VuZCBpZiB0aGVyZSBpcyBvbmx5Ci1vbmUgXGNvbnN0YW50e3NtYWxsX3N0bXR9IG5vZGUgaW4gdGhlIFxjb25zdGFudHtzaW1wbGVfc3RtdH0gbm9kZS4KLVNpbmNlIG1vc3QgZnVuY3Rpb25zIGFuZCBtZXRob2RzIHdoaWNoIHVzZSB0aGUgc2hvcnQgZm9ybSBkbyBub3QKLXByb3ZpZGUgYSBkb2NzdHJpbmcsIHRoaXMgbWF5IGJlIGNvbnNpZGVyZWQgc3VmZmljaWVudC4gIFRoZQotZXh0cmFjdGlvbiBvZiB0aGUgZG9jc3RyaW5nIHByb2NlZWRzIHVzaW5nIHRoZSBcZnVuY3Rpb257bWF0Y2goKX0gZnVuY3Rpb24KLWFzIGRlc2NyaWJlZCBhYm92ZSwgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgZG9jc3RyaW5nIGlzIHN0b3JlZCBhcyBhbgotYXR0cmlidXRlIG9mIHRoZSBcY2xhc3N7U3VpdGVJbmZvQmFzZX0gb2JqZWN0LgotCi1BZnRlciBkb2NzdHJpbmcgZXh0cmFjdGlvbiwgYSBzaW1wbGUgZGVmaW5pdGlvbiBkaXNjb3ZlcnkKLWFsZ29yaXRobSBvcGVyYXRlcyBvbiB0aGUgXGNvbnN0YW50e3N0bXR9IG5vZGVzIG9mIHRoZQotXGNvbnN0YW50e3N1aXRlfSBub2RlLiAgVGhlIHNwZWNpYWwgY2FzZSBvZiB0aGUgc2hvcnQgZm9ybSBpcyBub3QKLXRlc3RlZDsgc2luY2UgdGhlcmUgYXJlIG5vIFxjb25zdGFudHtzdG10fSBub2RlcyBpbiB0aGUgc2hvcnQgZm9ybSwKLXRoZSBhbGdvcml0aG0gd2lsbCBzaWxlbnRseSBza2lwIHRoZSBzaW5nbGUgXGNvbnN0YW50e3NpbXBsZV9zdG10fQotbm9kZSBhbmQgY29ycmVjdGx5IG5vdCBkaXNjb3ZlciBhbnkgbmVzdGVkIGRlZmluaXRpb25zLgotCi1FYWNoIHN0YXRlbWVudCBpbiB0aGUgY29kZSBibG9jayBpcyBjYXRlZ29yaXplZCBhcwotYSBjbGFzcyBkZWZpbml0aW9uLCBmdW5jdGlvbiBvciBtZXRob2QgZGVmaW5pdGlvbiwgb3IKLXNvbWV0aGluZyBlbHNlLiAgRm9yIHRoZSBkZWZpbml0aW9uIHN0YXRlbWVudHMsIHRoZSBuYW1lIG9mIHRoZQotZWxlbWVudCBkZWZpbmVkIGlzIGV4dHJhY3RlZCBhbmQgYSByZXByZXNlbnRhdGlvbiBvYmplY3QKLWFwcHJvcHJpYXRlIHRvIHRoZSBkZWZpbml0aW9uIGlzIGNyZWF0ZWQgd2l0aCB0aGUgZGVmaW5pbmcgc3VidHJlZQotcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBjb25zdHJ1Y3Rvci4gIFRoZSByZXByZXNlbnRhdGlvbiBvYmplY3RzCi1hcmUgc3RvcmVkIGluIGluc3RhbmNlIHZhcmlhYmxlcyBhbmQgbWF5IGJlIHJldHJpZXZlZCBieSBuYW1lIHVzaW5nCi10aGUgYXBwcm9wcmlhdGUgYWNjZXNzb3IgbWV0aG9kcy4KLQotVGhlIHB1YmxpYyBjbGFzc2VzIHByb3ZpZGUgYW55IGFjY2Vzc29ycyByZXF1aXJlZCB3aGljaCBhcmUgbW9yZQotc3BlY2lmaWMgdGhhbiB0aG9zZSBwcm92aWRlZCBieSB0aGUgXGNsYXNze1N1aXRlSW5mb0Jhc2V9IGNsYXNzLCBidXQKLXRoZSByZWFsIGV4dHJhY3Rpb24gYWxnb3JpdGhtIHJlbWFpbnMgY29tbW9uIHRvIGFsbCBmb3JtcyBvZiBjb2RlCi1ibG9ja3MuICBBIGhpZ2gtbGV2ZWwgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZXh0cmFjdCB0aGUgY29tcGxldGUgc2V0Ci1vZiBpbmZvcm1hdGlvbiBmcm9tIGEgc291cmNlIGZpbGUuICAoU2VlIGZpbGUgXGZpbGV7ZXhhbXBsZS5weX0uKQotCi1cYmVnaW57dmVyYmF0aW19Ci1kZWYgZ2V0X2RvY3MoZmlsZU5hbWUpOgotICAgIGltcG9ydCBvcwotICAgIGltcG9ydCBwYXJzZXIKLQotICAgIHNvdXJjZSA9IG9wZW4oZmlsZU5hbWUpLnJlYWQoKQotICAgIGJhc2VuYW1lID0gb3MucGF0aC5iYXNlbmFtZShvcy5wYXRoLnNwbGl0ZXh0KGZpbGVOYW1lKVswXSkKLSAgICBhc3QgPSBwYXJzZXIuc3VpdGUoc291cmNlKQotICAgIHJldHVybiBNb2R1bGVJbmZvKGFzdC50b3R1cGxlKCksIGJhc2VuYW1lKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhpcyBwcm92aWRlcyBhbiBlYXN5LXRvLXVzZSBpbnRlcmZhY2UgdG8gdGhlIGRvY3VtZW50YXRpb24gb2YgYQotbW9kdWxlLiAgSWYgaW5mb3JtYXRpb24gaXMgcmVxdWlyZWQgd2hpY2ggaXMgbm90IGV4dHJhY3RlZCBieSB0aGUgY29kZQotb2YgdGhpcyBleGFtcGxlLCB0aGUgY29kZSBtYXkgYmUgZXh0ZW5kZWQgYXQgY2xlYXJseSBkZWZpbmVkIHBvaW50cyB0bwotcHJvdmlkZSBhZGRpdGlvbmFsIGNhcGFiaWxpdGllcy4KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlicGRiLnRleCBiL0RvYy9saWIvbGlicGRiLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVlNzc4Yy4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnBkYi50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw0NjQgKzAsMCBAQAotXGNoYXB0ZXJ7VGhlIFB5dGhvbiBEZWJ1Z2dlciBcbGFiZWx7ZGVidWdnZXJ9fQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17cGRifQotXG1vZHVsZXN5bm9wc2lze1RoZSBQeXRob24gZGVidWdnZXIgZm9yIGludGVyYWN0aXZlIGludGVycHJldGVycy59Ci0KLQotVGhlIG1vZHVsZSBcbW9kdWxle3BkYn0gZGVmaW5lcyBhbiBpbnRlcmFjdGl2ZSBzb3VyY2UgY29kZQotZGVidWdnZXJcaW5kZXh7ZGVidWdnaW5nfSBmb3IgUHl0aG9uIHByb2dyYW1zLiAgSXQgc3VwcG9ydHMgc2V0dGluZwotKGNvbmRpdGlvbmFsKSBicmVha3BvaW50cyBhbmQgc2luZ2xlIHN0ZXBwaW5nIGF0IHRoZSBzb3VyY2UgbGluZQotbGV2ZWwsIGluc3BlY3Rpb24gb2Ygc3RhY2sgZnJhbWVzLCBzb3VyY2UgY29kZSBsaXN0aW5nLCBhbmQgZXZhbHVhdGlvbgotb2YgYXJiaXRyYXJ5IFB5dGhvbiBjb2RlIGluIHRoZSBjb250ZXh0IG9mIGFueSBzdGFjayBmcmFtZS4gIEl0IGFsc28KLXN1cHBvcnRzIHBvc3QtbW9ydGVtIGRlYnVnZ2luZyBhbmQgY2FuIGJlIGNhbGxlZCB1bmRlciBwcm9ncmFtCi1jb250cm9sLgotCi1UaGUgZGVidWdnZXIgaXMgZXh0ZW5zaWJsZSAtLS0gaXQgaXMgYWN0dWFsbHkgZGVmaW5lZCBhcyB0aGUgY2xhc3MKLVxjbGFzc3tQZGJ9XHdpdGhzdWJpdGVteyhjbGFzcyBpbiBwZGIpfXtcdHRpbmRleHtQZGJ9fS4KLVRoaXMgaXMgY3VycmVudGx5IHVuZG9jdW1lbnRlZCBidXQgZWFzaWx5IHVuZGVyc3Rvb2QgYnkgcmVhZGluZyB0aGUKLXNvdXJjZS4gIFRoZSBleHRlbnNpb24gaW50ZXJmYWNlIHVzZXMgdGhlIG1vZHVsZXMKLVxtb2R1bGV7YmRifVxyZWZzdG1vZGluZGV4e2JkYn0gKHVuZG9jdW1lbnRlZCkgYW5kCi1ccmVmbW9kdWxle2NtZH1ccmVmc3Rtb2RpbmRleHtjbWR9LgotCi1UaGUgZGVidWdnZXIncyBwcm9tcHQgaXMgXHNhbXB7KFBkYikgfS4KLVR5cGljYWwgdXNhZ2UgdG8gcnVuIGEgcHJvZ3JhbSB1bmRlciBjb250cm9sIG9mIHRoZSBkZWJ1Z2dlciBpczoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGltcG9ydCBwZGIKLT4+PiBpbXBvcnQgbXltb2R1bGUKLT4+PiBwZGIucnVuKCdteW1vZHVsZS50ZXN0KCknKQotPiA8c3RyaW5nPigwKT8oKQotKFBkYikgY29udGludWUKLT4gPHN0cmluZz4oMSk/KCkKLShQZGIpIGNvbnRpbnVlCi1OYW1lRXJyb3I6ICdzcGFtJwotPiA8c3RyaW5nPigxKT8oKQotKFBkYikgCi1cZW5ke3ZlcmJhdGltfQotCi1cZmlsZXtwZGIucHl9IGNhbiBhbHNvIGJlIGludm9rZWQgYXMKLWEgc2NyaXB0IHRvIGRlYnVnIG90aGVyIHNjcmlwdHMuICBGb3IgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotcHl0aG9uIC1tIHBkYiBteXNjcmlwdC5weQotXGVuZHt2ZXJiYXRpbX0KLQotV2hlbiBpbnZva2VkIGFzIGEgc2NyaXB0LCBwZGIgd2lsbCBhdXRvbWF0aWNhbGx5IGVudGVyIHBvc3QtbW9ydGVtIGRlYnVnZ2luZwotaWYgdGhlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQgZXhpdHMgYWJub3JtYWxseS4gQWZ0ZXIgcG9zdC1tb3J0ZW0gZGVidWdnaW5nCi0ob3IgYWZ0ZXIgbm9ybWFsIGV4aXQgb2YgdGhlIHByb2dyYW0pLCBwZGIgd2lsbCByZXN0YXJ0IHRoZSBwcm9ncmFtLgotQXV0b21hdGljIHJlc3RhcnRpbmcgcHJlc2VydmVzIHBkYidzIHN0YXRlIChzdWNoIGFzIGJyZWFrcG9pbnRzKSBhbmQgaW4gbW9zdAotY2FzZXMgaXMgbW9yZSB1c2VmdWwgdGhhbiBxdWl0dGluZyB0aGUgZGVidWdnZXIgdXBvbiBwcm9ncmFtJ3MgZXhpdC4KLVx2ZXJzaW9uYWRkZWRbUmVzdGFydGluZyBwb3N0LW1vcnRlbSBiZWhhdmlvciBhZGRlZF17Mi40fQotCi1UeXBpY2FsIHVzYWdlIHRvIGluc3BlY3QgYSBjcmFzaGVkIHByb2dyYW0gaXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgcGRiCi0+Pj4gaW1wb3J0IG15bW9kdWxlCi0+Pj4gbXltb2R1bGUudGVzdCgpCi1UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KLSAgRmlsZSAiLi9teW1vZHVsZS5weSIsIGxpbmUgNCwgaW4gdGVzdAotICAgIHRlc3QyKCkKLSAgRmlsZSAiLi9teW1vZHVsZS5weSIsIGxpbmUgMywgaW4gdGVzdDIKLSAgICBwcmludCBzcGFtCi1OYW1lRXJyb3I6IHNwYW0KLT4+PiBwZGIucG0oKQotPiAuL215bW9kdWxlLnB5KDMpdGVzdDIoKQotLT4gcHJpbnQgc3BhbQotKFBkYikgCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM7IGVhY2ggZW50ZXJzIHRoZSBkZWJ1Z2dlcgotaW4gYSBzbGlnaHRseSBkaWZmZXJlbnQgd2F5OgotCi1cYmVnaW57ZnVuY2Rlc2N9e3J1bn17c3RhdGVtZW50XG9wdGlvbmFseywgZ2xvYmFsc1xvcHRpb25hbHssIGxvY2Fsc319fQotRXhlY3V0ZSB0aGUgXHZhcntzdGF0ZW1lbnR9IChnaXZlbiBhcyBhIHN0cmluZykgdW5kZXIgZGVidWdnZXIKLWNvbnRyb2wuICBUaGUgZGVidWdnZXIgcHJvbXB0IGFwcGVhcnMgYmVmb3JlIGFueSBjb2RlIGlzIGV4ZWN1dGVkOyB5b3UKLWNhbiBzZXQgYnJlYWtwb2ludHMgYW5kIHR5cGUgXHNhbXB7Y29udGludWV9LCBvciB5b3UgY2FuIHN0ZXAgdGhyb3VnaAotdGhlIHN0YXRlbWVudCB1c2luZyBcc2FtcHtzdGVwfSBvciBcc2FtcHtuZXh0fSAoYWxsIHRoZXNlIGNvbW1hbmRzIGFyZQotZXhwbGFpbmVkIGJlbG93KS4gIFRoZSBvcHRpb25hbCBcdmFye2dsb2JhbHN9IGFuZCBcdmFye2xvY2Fsc30KLWFyZ3VtZW50cyBzcGVjaWZ5IHRoZSBlbnZpcm9ubWVudCBpbiB3aGljaCB0aGUgY29kZSBpcyBleGVjdXRlZDsgYnkKLWRlZmF1bHQgdGhlIGRpY3Rpb25hcnkgb2YgdGhlIG1vZHVsZSBccmVmbW9kdWxlW21haW5de19fbWFpbl9ffSBpcwotdXNlZC4gIChTZWUgdGhlIGV4cGxhbmF0aW9uIG9mIHRoZSBidWlsdC1pbiBcZnVuY3Rpb257ZXhlYygpfSBvcgotXGZ1bmN0aW9ue2V2YWwoKX0gZnVuY3Rpb25zLikKLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cnVuZXZhbH17ZXhwcmVzc2lvblxvcHRpb25hbHssIGdsb2JhbHNcb3B0aW9uYWx7LCBsb2NhbHN9fX0KLUV2YWx1YXRlIHRoZSBcdmFye2V4cHJlc3Npb259IChnaXZlbiBhcyBhIHN0cmluZykgdW5kZXIgZGVidWdnZXIKLWNvbnRyb2wuICBXaGVuIFxmdW5jdGlvbntydW5ldmFsKCl9IHJldHVybnMsIGl0IHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZQotZXhwcmVzc2lvbi4gIE90aGVyd2lzZSB0aGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8KLVxmdW5jdGlvbntydW4oKX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3J1bmNhbGx9e2Z1bmN0aW9uXG9wdGlvbmFseywgYXJndW1lbnQsIC4uLn19Ci1DYWxsIHRoZSBcdmFye2Z1bmN0aW9ufSAoYSBmdW5jdGlvbiBvciBtZXRob2Qgb2JqZWN0LCBub3QgYSBzdHJpbmcpCi13aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuICBXaGVuIFxmdW5jdGlvbntydW5jYWxsKCl9IHJldHVybnMsIGl0IHJldHVybnMKLXdoYXRldmVyIHRoZSBmdW5jdGlvbiBjYWxsIHJldHVybmVkLiAgVGhlIGRlYnVnZ2VyIHByb21wdCBhcHBlYXJzIGFzCi1zb29uIGFzIHRoZSBmdW5jdGlvbiBpcyBlbnRlcmVkLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzZXRfdHJhY2V9e30KLUVudGVyIHRoZSBkZWJ1Z2dlciBhdCB0aGUgY2FsbGluZyBzdGFjayBmcmFtZS4gIFRoaXMgaXMgdXNlZnVsIHRvCi1oYXJkLWNvZGUgYSBicmVha3BvaW50IGF0IGEgZ2l2ZW4gcG9pbnQgaW4gYSBwcm9ncmFtLCBldmVuIGlmIHRoZSBjb2RlCi1pcyBub3Qgb3RoZXJ3aXNlIGJlaW5nIGRlYnVnZ2VkIChlLmcuIHdoZW4gYW4gYXNzZXJ0aW9uIGZhaWxzKS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cG9zdF9tb3J0ZW19e3RyYWNlYmFja30KLUVudGVyIHBvc3QtbW9ydGVtIGRlYnVnZ2luZyBvZiB0aGUgZ2l2ZW4gXHZhcnt0cmFjZWJhY2t9IG9iamVjdC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cG19e30KLUVudGVyIHBvc3QtbW9ydGVtIGRlYnVnZ2luZyBvZiB0aGUgdHJhY2ViYWNrIGZvdW5kIGluCi1cY29kZXtzeXMubGFzdF90cmFjZWJhY2t9LgotXGVuZHtmdW5jZGVzY30KLQotCi1cc2VjdGlvbntEZWJ1Z2dlciBDb21tYW5kcyBcbGFiZWx7ZGVidWdnZXItY29tbWFuZHN9fQotCi1UaGUgZGVidWdnZXIgcmVjb2duaXplcyB0aGUgZm9sbG93aW5nIGNvbW1hbmRzLiAgTW9zdCBjb21tYW5kcyBjYW4gYmUKLWFiYnJldmlhdGVkIHRvIG9uZSBvciB0d28gbGV0dGVyczsgZS5nLiBcc2FtcHtoKGVscCl9IG1lYW5zIHRoYXQKLWVpdGhlciBcc2FtcHtofSBvciBcc2FtcHtoZWxwfSBjYW4gYmUgdXNlZCB0byBlbnRlciB0aGUgaGVscAotY29tbWFuZCAoYnV0IG5vdCBcc2FtcHtoZX0gb3IgXHNhbXB7aGVsfSwgbm9yIFxzYW1we0h9IG9yCi1cc2FtcHtIZWxwfSBvciBcc2FtcHtIRUxQfSkuICBBcmd1bWVudHMgdG8gY29tbWFuZHMgbXVzdCBiZQotc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UgKHNwYWNlcyBvciB0YWJzKS4gIE9wdGlvbmFsIGFyZ3VtZW50cyBhcmUKLWVuY2xvc2VkIGluIHNxdWFyZSBicmFja2V0cyAoXHNhbXB7W119KSBpbiB0aGUgY29tbWFuZCBzeW50YXg7IHRoZQotc3F1YXJlIGJyYWNrZXRzIG11c3Qgbm90IGJlIHR5cGVkLiAgQWx0ZXJuYXRpdmVzIGluIHRoZSBjb21tYW5kIHN5bnRheAotYXJlIHNlcGFyYXRlZCBieSBhIHZlcnRpY2FsIGJhciAoXHNhbXB7fH0pLgotCi1FbnRlcmluZyBhIGJsYW5rIGxpbmUgcmVwZWF0cyB0aGUgbGFzdCBjb21tYW5kIGVudGVyZWQuICBFeGNlcHRpb246IGlmCi10aGUgbGFzdCBjb21tYW5kIHdhcyBhIFxzYW1we2xpc3R9IGNvbW1hbmQsIHRoZSBuZXh0IDExIGxpbmVzIGFyZQotbGlzdGVkLgotCi1Db21tYW5kcyB0aGF0IHRoZSBkZWJ1Z2dlciBkb2Vzbid0IHJlY29nbml6ZSBhcmUgYXNzdW1lZCB0byBiZSBQeXRob24KLXN0YXRlbWVudHMgYW5kIGFyZSBleGVjdXRlZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcHJvZ3JhbSBiZWluZwotZGVidWdnZWQuICBQeXRob24gc3RhdGVtZW50cyBjYW4gYWxzbyBiZSBwcmVmaXhlZCB3aXRoIGFuIGV4Y2xhbWF0aW9uCi1wb2ludCAoXHNhbXB7IX0pLiAgVGhpcyBpcyBhIHBvd2VyZnVsIHdheSB0byBpbnNwZWN0IHRoZSBwcm9ncmFtCi1iZWluZyBkZWJ1Z2dlZDsgaXQgaXMgZXZlbiBwb3NzaWJsZSB0byBjaGFuZ2UgYSB2YXJpYWJsZSBvciBjYWxsIGEKLWZ1bmN0aW9uLiAgV2hlbiBhbgotZXhjZXB0aW9uIG9jY3VycyBpbiBzdWNoIGEgc3RhdGVtZW50LCB0aGUgZXhjZXB0aW9uIG5hbWUgaXMgcHJpbnRlZAotYnV0IHRoZSBkZWJ1Z2dlcidzIHN0YXRlIGlzIG5vdCBjaGFuZ2VkLgotCi1NdWx0aXBsZSBjb21tYW5kcyBtYXkgYmUgZW50ZXJlZCBvbiBhIHNpbmdsZSBsaW5lLCBzZXBhcmF0ZWQgYnkKLVxzYW1wezs7fS4gIChBIHNpbmdsZSBcc2FtcHs7fSBpcyBub3QgdXNlZCBhcyBpdCBpcwotdGhlIHNlcGFyYXRvciBmb3IgbXVsdGlwbGUgY29tbWFuZHMgaW4gYSBsaW5lIHRoYXQgaXMgcGFzc2VkIHRvCi10aGUgUHl0aG9uIHBhcnNlci4pCi1ObyBpbnRlbGxpZ2VuY2UgaXMgYXBwbGllZCB0byBzZXBhcmF0aW5nIHRoZSBjb21tYW5kczsKLXRoZSBpbnB1dCBpcyBzcGxpdCBhdCB0aGUgZmlyc3QgXHNhbXB7Ozt9IHBhaXIsIGV2ZW4gaWYgaXQgaXMgaW4KLXRoZSBtaWRkbGUgb2YgYSBxdW90ZWQgc3RyaW5nLgotCi1UaGUgZGVidWdnZXIgc3VwcG9ydHMgYWxpYXNlcy4gIEFsaWFzZXMgY2FuIGhhdmUgcGFyYW1ldGVycyB3aGljaAotYWxsb3dzIG9uZSBhIGNlcnRhaW4gbGV2ZWwgb2YgYWRhcHRhYmlsaXR5IHRvIHRoZSBjb250ZXh0IHVuZGVyCi1leGFtaW5hdGlvbi4KLQotSWYgYSBmaWxlIFxmaWxley5wZGJyY30KLVxpbmRleGlpey5wZGJyY317ZmlsZX1caW5kZXhpaWl7ZGVidWdnZXJ9e2NvbmZpZ3VyYXRpb259e2ZpbGV9Ci1leGlzdHMgaW4gdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeSBvciBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksIGl0IGlzCi1yZWFkIGluIGFuZCBleGVjdXRlZCBhcyBpZiBpdCBoYWQgYmVlbiB0eXBlZCBhdCB0aGUgZGVidWdnZXIgcHJvbXB0LgotVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBhbGlhc2VzLiAgSWYgYm90aCBmaWxlcyBleGlzdCwgdGhlIG9uZQotaW4gdGhlIGhvbWUgZGlyZWN0b3J5IGlzIHJlYWQgZmlyc3QgYW5kIGFsaWFzZXMgZGVmaW5lZCB0aGVyZSBjYW4gYmUKLW92ZXJyaWRkZW4gYnkgdGhlIGxvY2FsIGZpbGUuCi0KLVxiZWdpbntkZXNjcmlwdGlvbn0KLQotXGl0ZW1baChlbHApIFxvcHRpb25hbHtcdmFye2NvbW1hbmR9fV0KLQotV2l0aG91dCBhcmd1bWVudCwgcHJpbnQgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGNvbW1hbmRzLiAgV2l0aCBhCi1cdmFye2NvbW1hbmR9IGFzIGFyZ3VtZW50LCBwcmludCBoZWxwIGFib3V0IHRoYXQgY29tbWFuZC4gIFxzYW1we2hlbHAKLXBkYn0gZGlzcGxheXMgdGhlIGZ1bGwgZG9jdW1lbnRhdGlvbiBmaWxlOyBpZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLVxlbnZ2YXJ7UEFHRVJ9IGlzIGRlZmluZWQsIHRoZSBmaWxlIGlzIHBpcGVkIHRocm91Z2ggdGhhdCBjb21tYW5kCi1pbnN0ZWFkLiAgU2luY2UgdGhlIFx2YXJ7Y29tbWFuZH0gYXJndW1lbnQgbXVzdCBiZSBhbiBpZGVudGlmaWVyLAotXHNhbXB7aGVscCBleGVjfSBtdXN0IGJlIGVudGVyZWQgdG8gZ2V0IGhlbHAgb24gdGhlIFxzYW1weyF9IGNvbW1hbmQuCi0KLVxpdGVtW3coaGVyZSldCi0KLVByaW50IGEgc3RhY2sgdHJhY2UsIHdpdGggdGhlIG1vc3QgcmVjZW50IGZyYW1lIGF0IHRoZSBib3R0b20uICBBbgotYXJyb3cgaW5kaWNhdGVzIHRoZSBjdXJyZW50IGZyYW1lLCB3aGljaCBkZXRlcm1pbmVzIHRoZSBjb250ZXh0IG9mCi1tb3N0IGNvbW1hbmRzLgotCi1caXRlbVtkKG93bildCi0KLU1vdmUgdGhlIGN1cnJlbnQgZnJhbWUgb25lIGxldmVsIGRvd24gaW4gdGhlIHN0YWNrIHRyYWNlCi0odG8gYSBuZXdlciBmcmFtZSkuCi0KLVxpdGVtW3UocCldCi0KLU1vdmUgdGhlIGN1cnJlbnQgZnJhbWUgb25lIGxldmVsIHVwIGluIHRoZSBzdGFjayB0cmFjZQotKHRvIGFuIG9sZGVyIGZyYW1lKS4KLQotXGl0ZW1bYihyZWFrKSBcb3B0aW9uYWx7XG9wdGlvbmFse1x2YXJ7ZmlsZW5hbWV9On1cdmFye2xpbmVub31cY29kZXtcTGFyZ2V7fH19XHZhcntmdW5jdGlvbn1cb3B0aW9uYWx7LCBcdmFye2NvbmRpdGlvbn19fV0KLQotV2l0aCBhIFx2YXJ7bGluZW5vfSBhcmd1bWVudCwgc2V0IGEgYnJlYWsgdGhlcmUgaW4gdGhlIGN1cnJlbnQKLWZpbGUuICBXaXRoIGEgXHZhcntmdW5jdGlvbn0gYXJndW1lbnQsIHNldCBhIGJyZWFrIGF0IHRoZSBmaXJzdAotZXhlY3V0YWJsZSBzdGF0ZW1lbnQgd2l0aGluIHRoYXQgZnVuY3Rpb24uCi1UaGUgbGluZSBudW1iZXIgbWF5IGJlIHByZWZpeGVkIHdpdGggYSBmaWxlbmFtZSBhbmQgYSBjb2xvbiwKLXRvIHNwZWNpZnkgYSBicmVha3BvaW50IGluIGFub3RoZXIgZmlsZSAocHJvYmFibHkgb25lIHRoYXQKLWhhc24ndCBiZWVuIGxvYWRlZCB5ZXQpLiAgVGhlIGZpbGUgaXMgc2VhcmNoZWQgb24gXGNvZGV7c3lzLnBhdGh9LgotTm90ZSB0aGF0IGVhY2ggYnJlYWtwb2ludCBpcyBhc3NpZ25lZCBhIG51bWJlciB0byB3aGljaCBhbGwgdGhlIG90aGVyCi1icmVha3BvaW50IGNvbW1hbmRzIHJlZmVyLgotCi1JZiBhIHNlY29uZCBhcmd1bWVudCBpcyBwcmVzZW50LCBpdCBpcyBhbiBleHByZXNzaW9uIHdoaWNoIG11c3QKLWV2YWx1YXRlIHRvIHRydWUgYmVmb3JlIHRoZSBicmVha3BvaW50IGlzIGhvbm9yZWQuCi0KLVdpdGhvdXQgYXJndW1lbnQsIGxpc3QgYWxsIGJyZWFrcywgaW5jbHVkaW5nIGZvciBlYWNoIGJyZWFrcG9pbnQsCi10aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgYnJlYWtwb2ludCBoYXMgYmVlbiBoaXQsIHRoZSBjdXJyZW50Ci1pZ25vcmUgY291bnQsIGFuZCB0aGUgYXNzb2NpYXRlZCBjb25kaXRpb24gaWYgYW55LgotCi1caXRlbVt0YnJlYWsgXG9wdGlvbmFse1xvcHRpb25hbHtcdmFye2ZpbGVuYW1lfTp9XHZhcntsaW5lbm99XGNvZGV7XExhcmdle3x9fVx2YXJ7ZnVuY3Rpb259XG9wdGlvbmFseywgXHZhcntjb25kaXRpb259fX1dCi0KLVRlbXBvcmFyeSBicmVha3BvaW50LCB3aGljaCBpcyByZW1vdmVkIGF1dG9tYXRpY2FsbHkgd2hlbiBpdCBpcwotZmlyc3QgaGl0LiAgVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgYnJlYWsuCi0KLVxpdGVtW2NsKGVhcikgXG9wdGlvbmFse1x2YXJ7YnBudW1iZXJ9IFxvcHRpb25hbHtcdmFye2JwbnVtYmVyIC4uLn19fV0KLQotV2l0aCBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGJyZWFrcG9pbnQgbnVtYmVycywgY2xlYXIgdGhvc2UKLWJyZWFrcG9pbnRzLiAgV2l0aG91dCBhcmd1bWVudCwgY2xlYXIgYWxsIGJyZWFrcyAoYnV0IGZpcnN0Ci1hc2sgY29uZmlybWF0aW9uKS4KLQotXGl0ZW1bZGlzYWJsZSBcb3B0aW9uYWx7XHZhcnticG51bWJlcn0gXG9wdGlvbmFse1x2YXJ7YnBudW1iZXIgLi4ufX19XQotCi1EaXNhYmxlcyB0aGUgYnJlYWtwb2ludHMgZ2l2ZW4gYXMgYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZgotYnJlYWtwb2ludCBudW1iZXJzLiAgRGlzYWJsaW5nIGEgYnJlYWtwb2ludCBtZWFucyBpdCBjYW5ub3QgY2F1c2UKLXRoZSBwcm9ncmFtIHRvIHN0b3AgZXhlY3V0aW9uLCBidXQgdW5saWtlIGNsZWFyaW5nIGEgYnJlYWtwb2ludCwgaXQKLXJlbWFpbnMgaW4gdGhlIGxpc3Qgb2YgYnJlYWtwb2ludHMgYW5kIGNhbiBiZSAocmUtKWVuYWJsZWQuCi0KLVxpdGVtW2VuYWJsZSBcb3B0aW9uYWx7XHZhcnticG51bWJlcn0gXG9wdGlvbmFse1x2YXJ7YnBudW1iZXIgLi4ufX19XQotCi1FbmFibGVzIHRoZSBicmVha3BvaW50cyBzcGVjaWZpZWQuCi0KLVxpdGVtW2lnbm9yZSBcdmFye2JwbnVtYmVyfSBcb3B0aW9uYWx7XHZhcntjb3VudH19XQotCi1TZXRzIHRoZSBpZ25vcmUgY291bnQgZm9yIHRoZSBnaXZlbiBicmVha3BvaW50IG51bWJlci4gIElmCi1jb3VudCBpcyBvbWl0dGVkLCB0aGUgaWdub3JlIGNvdW50IGlzIHNldCB0byAwLiAgQSBicmVha3BvaW50Ci1iZWNvbWVzIGFjdGl2ZSB3aGVuIHRoZSBpZ25vcmUgY291bnQgaXMgemVyby4gIFdoZW4gbm9uLXplcm8sCi10aGUgY291bnQgaXMgZGVjcmVtZW50ZWQgZWFjaCB0aW1lIHRoZSBicmVha3BvaW50IGlzIHJlYWNoZWQKLWFuZCB0aGUgYnJlYWtwb2ludCBpcyBub3QgZGlzYWJsZWQgYW5kIGFueSBhc3NvY2lhdGVkIGNvbmRpdGlvbgotZXZhbHVhdGVzIHRvIHRydWUuCi0KLVxpdGVtW2NvbmRpdGlvbiBcdmFye2JwbnVtYmVyfSBcb3B0aW9uYWx7XHZhcntjb25kaXRpb259fV0KLQotQ29uZGl0aW9uIGlzIGFuIGV4cHJlc3Npb24gd2hpY2ggbXVzdCBldmFsdWF0ZSB0byB0cnVlIGJlZm9yZQotdGhlIGJyZWFrcG9pbnQgaXMgaG9ub3JlZC4gIElmIGNvbmRpdGlvbiBpcyBhYnNlbnQsIGFueSBleGlzdGluZwotY29uZGl0aW9uIGlzIHJlbW92ZWQ7IGkuZS4sIHRoZSBicmVha3BvaW50IGlzIG1hZGUgdW5jb25kaXRpb25hbC4KLQotXGl0ZW1bY29tbWFuZHMgXG9wdGlvbmFse1x2YXJ7YnBudW1iZXJ9fV0KLQotU3BlY2lmeSBhIGxpc3Qgb2YgY29tbWFuZHMgZm9yIGJyZWFrcG9pbnQgbnVtYmVyIFx2YXJ7YnBudW1iZXJ9LiAgVGhlCi1jb21tYW5kcyB0aGVtc2VsdmVzIGFwcGVhciBvbiB0aGUgZm9sbG93aW5nIGxpbmVzLiAgVHlwZSBhIGxpbmUKLWNvbnRhaW5pbmcganVzdCAnZW5kJyB0byB0ZXJtaW5hdGUgdGhlIGNvbW1hbmRzLiBBbiBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0oUGRiKSBjb21tYW5kcyAxCi0oY29tKSBwcmludCBzb21lX3ZhcmlhYmxlCi0oY29tKSBlbmQKLShQZGIpCi1cZW5ke3ZlcmJhdGltfQotCi1UbyByZW1vdmUgYWxsIGNvbW1hbmRzIGZyb20gYSBicmVha3BvaW50LCB0eXBlIGNvbW1hbmRzIGFuZAotZm9sbG93IGl0IGltbWVkaWF0ZWx5IHdpdGggIGVuZDsgdGhhdCBpcywgZ2l2ZSBubyBjb21tYW5kcy4KLQotV2l0aCBubyBcdmFye2JwbnVtYmVyfSBhcmd1bWVudCwgY29tbWFuZHMgcmVmZXJzIHRvIHRoZSBsYXN0Ci1icmVha3BvaW50IHNldC4KLQotWW91IGNhbiB1c2UgYnJlYWtwb2ludCBjb21tYW5kcyB0byBzdGFydCB5b3VyIHByb2dyYW0gdXAgYWdhaW4uCi1TaW1wbHkgdXNlIHRoZSBjb250aW51ZSBjb21tYW5kLCBvciBzdGVwLCBvciBhbnkgb3RoZXIKLWNvbW1hbmQgdGhhdCByZXN1bWVzIGV4ZWN1dGlvbi4KLQotU3BlY2lmeWluZyBhbnkgY29tbWFuZCByZXN1bWluZyBleGVjdXRpb24gKGN1cnJlbnRseSBjb250aW51ZSwKLXN0ZXAsIG5leHQsIHJldHVybiwganVtcCwgcXVpdCBhbmQgdGhlaXIgYWJicmV2aWF0aW9ucykgdGVybWluYXRlcwotdGhlIGNvbW1hbmQgbGlzdCAoYXMgaWYgdGhhdCBjb21tYW5kIHdhcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBlbmQpLgotVGhpcyBpcyBiZWNhdXNlIGFueSB0aW1lIHlvdSByZXN1bWUgZXhlY3V0aW9uCi0oZXZlbiB3aXRoIGEgc2ltcGxlIG5leHQgb3Igc3RlcCksIHlvdSBtYXkgZW5jb3VudGVywrcKLWFub3RoZXIgYnJlYWtwb2ludC0td2hpY2ggY291bGQgaGF2ZSBpdHMgb3duIGNvbW1hbmQgbGlzdCwgbGVhZGluZyB0bwotYW1iaWd1aXRpZXMgYWJvdXQgd2hpY2ggbGlzdCB0byBleGVjdXRlLgotCi0gICBJZiB5b3UgdXNlIHRoZSAnc2lsZW50JyBjb21tYW5kIGluIHRoZSBjb21tYW5kIGxpc3QsIHRoZQotdXN1YWwgbWVzc2FnZSBhYm91dCBzdG9wcGluZyBhdCBhIGJyZWFrcG9pbnQgaXMgbm90IHByaW50ZWQuICBUaGlzIG1heQotYmUgZGVzaXJhYmxlIGZvciBicmVha3BvaW50cyB0aGF0IGFyZSB0byBwcmludCBhIHNwZWNpZmljIG1lc3NhZ2UgYW5kCi10aGVuIGNvbnRpbnVlLiAgSWYgbm9uZSBvZiB0aGUgb3RoZXIgY29tbWFuZHMgcHJpbnQgYW55dGhpbmcsIHlvdQotc2VlIG5vIHNpZ24gdGhhdCB0aGUgYnJlYWtwb2ludCB3YXMgcmVhY2hlZC4KLQotXHZlcnNpb25hZGRlZHsyLjV9Ci0KLVxpdGVtW3ModGVwKV0KLQotRXhlY3V0ZSB0aGUgY3VycmVudCBsaW5lLCBzdG9wIGF0IHRoZSBmaXJzdCBwb3NzaWJsZSBvY2Nhc2lvbgotKGVpdGhlciBpbiBhIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIG9yIG9uIHRoZSBuZXh0IGxpbmUgaW4gdGhlCi1jdXJyZW50IGZ1bmN0aW9uKS4KLQotXGl0ZW1bbihleHQpXQotCi1Db250aW51ZSBleGVjdXRpb24gdW50aWwgdGhlIG5leHQgbGluZSBpbiB0aGUgY3VycmVudCBmdW5jdGlvbgotaXMgcmVhY2hlZCBvciBpdCByZXR1cm5zLiAgKFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gXHNhbXB7bmV4dH0gYW5kCi1cc2FtcHtzdGVwfSBpcyB0aGF0IFxzYW1we3N0ZXB9IHN0b3BzIGluc2lkZSBhIGNhbGxlZCBmdW5jdGlvbiwgd2hpbGUKLVxzYW1we25leHR9IGV4ZWN1dGVzIGNhbGxlZCBmdW5jdGlvbnMgYXQgKG5lYXJseSkgZnVsbCBzcGVlZCwgb25seQotc3RvcHBpbmcgYXQgdGhlIG5leHQgbGluZSBpbiB0aGUgY3VycmVudCBmdW5jdGlvbi4pCi0KLVxpdGVtW3IoZXR1cm4pXQotCi1Db250aW51ZSBleGVjdXRpb24gdW50aWwgdGhlIGN1cnJlbnQgZnVuY3Rpb24gcmV0dXJucy4KLQotXGl0ZW1bYyhvbnQoaW51ZSkpXQotCi1Db250aW51ZSBleGVjdXRpb24sIG9ubHkgc3RvcCB3aGVuIGEgYnJlYWtwb2ludCBpcyBlbmNvdW50ZXJlZC4KLQotXGl0ZW1baih1bXApIFx2YXJ7bGluZW5vfV0KLQotU2V0IHRoZSBuZXh0IGxpbmUgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkLiAgT25seSBhdmFpbGFibGUgaW4gdGhlCi1ib3R0b20tbW9zdCBmcmFtZS4gIFRoaXMgbGV0cyB5b3UganVtcCBiYWNrIGFuZCBleGVjdXRlIGNvZGUKLWFnYWluLCBvciBqdW1wIGZvcndhcmQgdG8gc2tpcCBjb2RlIHRoYXQgeW91IGRvbid0IHdhbnQgdG8gcnVuLgotCi1JdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBub3QgYWxsIGp1bXBzIGFyZSBhbGxvd2VkIC0tLSBmb3IgaW5zdGFuY2UgaXQKLWlzIG5vdCBwb3NzaWJsZSB0byBqdW1wIGludG8gdGhlIG1pZGRsZSBvZiBhIFxrZXl3b3Jke2Zvcn0gbG9vcCBvciBvdXQKLW9mIGEgXGtleXdvcmR7ZmluYWxseX0gY2xhdXNlLgotCi1caXRlbVtsKGlzdCkgXG9wdGlvbmFse1x2YXJ7Zmlyc3R9XG9wdGlvbmFseywgXHZhcntsYXN0fX19XQotCi1MaXN0IHNvdXJjZSBjb2RlIGZvciB0aGUgY3VycmVudCBmaWxlLiAgV2l0aG91dCBhcmd1bWVudHMsIGxpc3QgMTEKLWxpbmVzIGFyb3VuZCB0aGUgY3VycmVudCBsaW5lIG9yIGNvbnRpbnVlIHRoZSBwcmV2aW91cyBsaXN0aW5nLiAgV2l0aAotb25lIGFyZ3VtZW50LCBsaXN0IDExIGxpbmVzIGFyb3VuZCBhdCB0aGF0IGxpbmUuICBXaXRoIHR3byBhcmd1bWVudHMsCi1saXN0IHRoZSBnaXZlbiByYW5nZTsgaWYgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBsZXNzIHRoYW4gdGhlIGZpcnN0LAotaXQgaXMgaW50ZXJwcmV0ZWQgYXMgYSBjb3VudC4KLQotXGl0ZW1bYShyZ3MpXQotCi1QcmludCB0aGUgYXJndW1lbnQgbGlzdCBvZiB0aGUgY3VycmVudCBmdW5jdGlvbi4KLQotXGl0ZW1bcCBcdmFye2V4cHJlc3Npb259XQotCi1FdmFsdWF0ZSB0aGUgXHZhcntleHByZXNzaW9ufSBpbiB0aGUgY3VycmVudCBjb250ZXh0IGFuZCBwcmludCBpdHMKLXZhbHVlLiAgXG5vdGV7XHNhbXB7cHJpbnR9IGNhbiBhbHNvIGJlIHVzZWQsIGJ1dCBpcyBub3QgYSBkZWJ1Z2dlcgotY29tbWFuZCAtLS0gdGhpcyBleGVjdXRlcyB0aGUgUHl0aG9uIFxrZXl3b3Jke3ByaW50fSBzdGF0ZW1lbnQufQotCi1caXRlbVtwcCBcdmFye2V4cHJlc3Npb259XQotCi1MaWtlIHRoZSBcc2FtcHtwfSBjb21tYW5kLCBleGNlcHQgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIGlzCi1wcmV0dHktcHJpbnRlZCB1c2luZyB0aGUgXG1vZHVsZXtwcHJpbnR9IG1vZHVsZS4KLQotXGl0ZW1bYWxpYXMgXG9wdGlvbmFse1x2YXJ7bmFtZX0gXG9wdGlvbmFse2NvbW1hbmR9fV0KLQotQ3JlYXRlcyBhbiBhbGlhcyBjYWxsZWQgXHZhcntuYW1lfSB0aGF0IGV4ZWN1dGVzIFx2YXJ7Y29tbWFuZH0uICBUaGUKLWNvbW1hbmQgbXVzdCBcZW1waHtub3R9IGJlIGVuY2xvc2VkIGluIHF1b3Rlcy4gIFJlcGxhY2VhYmxlIHBhcmFtZXRlcnMKLWNhbiBiZSBpbmRpY2F0ZWQgYnkgXHNhbXB7XCUxfSwgXHNhbXB7XCUyfSwgYW5kIHNvIG9uLCB3aGlsZSBcc2FtcHtcJSp9IGlzCi1yZXBsYWNlZCBieSBhbGwgdGhlIHBhcmFtZXRlcnMuICBJZiBubyBjb21tYW5kIGlzIGdpdmVuLCB0aGUgY3VycmVudAotYWxpYXMgZm9yIFx2YXJ7bmFtZX0gaXMgc2hvd24uIElmIG5vIGFyZ3VtZW50cyBhcmUgZ2l2ZW4sIGFsbAotYWxpYXNlcyBhcmUgbGlzdGVkLgotCi1BbGlhc2VzIG1heSBiZSBuZXN0ZWQgYW5kIGNhbiBjb250YWluIGFueXRoaW5nIHRoYXQgY2FuIGJlCi1sZWdhbGx5IHR5cGVkIGF0IHRoZSBwZGIgcHJvbXB0LiAgTm90ZSB0aGF0IGludGVybmFsIHBkYiBjb21tYW5kcwotXGVtcGh7Y2FufSBiZSBvdmVycmlkZGVuIGJ5IGFsaWFzZXMuICBTdWNoIGEgY29tbWFuZCBpcwotdGhlbiBoaWRkZW4gdW50aWwgdGhlIGFsaWFzIGlzIHJlbW92ZWQuICBBbGlhc2luZyBpcyByZWN1cnNpdmVseQotYXBwbGllZCB0byB0aGUgZmlyc3Qgd29yZCBvZiB0aGUgY29tbWFuZCBsaW5lOyBhbGwgb3RoZXIgd29yZHMKLWluIHRoZSBsaW5lIGFyZSBsZWZ0IGFsb25lLgotCi1BcyBhbiBleGFtcGxlLCBoZXJlIGFyZSB0d28gdXNlZnVsIGFsaWFzZXMgKGVzcGVjaWFsbHkgd2hlbiBwbGFjZWQKLWluIHRoZSBcZmlsZXsucGRicmN9IGZpbGUpOgotCi1cYmVnaW57dmVyYmF0aW19Ci0jUHJpbnQgaW5zdGFuY2UgdmFyaWFibGVzICh1c2FnZSAicGkgY2xhc3NJbnN0IikKLWFsaWFzIHBpIGZvciBrIGluICUxLl9fZGljdF9fLmtleXMoKTogcHJpbnQgIiUxLiIsaywiPSIsJTEuX19kaWN0X19ba10KLSNQcmludCBpbnN0YW5jZSB2YXJpYWJsZXMgaW4gc2VsZgotYWxpYXMgcHMgcGkgc2VsZgotXGVuZHt2ZXJiYXRpbX0KLSAgICAgICAgICAgICAgICAKLVxpdGVtW3VuYWxpYXMgXHZhcntuYW1lfV0KLQotRGVsZXRlcyB0aGUgc3BlY2lmaWVkIGFsaWFzLgotCi1caXRlbVtcb3B0aW9uYWx7IX1cdmFye3N0YXRlbWVudH1dCi0KLUV4ZWN1dGUgdGhlIChvbmUtbGluZSkgXHZhcntzdGF0ZW1lbnR9IGluIHRoZSBjb250ZXh0IG9mCi10aGUgY3VycmVudCBzdGFjayBmcmFtZS4KLVRoZSBleGNsYW1hdGlvbiBwb2ludCBjYW4gYmUgb21pdHRlZCB1bmxlc3MgdGhlIGZpcnN0IHdvcmQKLW9mIHRoZSBzdGF0ZW1lbnQgcmVzZW1ibGVzIGEgZGVidWdnZXIgY29tbWFuZC4KLVRvIHNldCBhIGdsb2JhbCB2YXJpYWJsZSwgeW91IGNhbiBwcmVmaXggdGhlIGFzc2lnbm1lbnQKLWNvbW1hbmQgd2l0aCBhIFxzYW1we2dsb2JhbH0gY29tbWFuZCBvbiB0aGUgc2FtZSBsaW5lLCBlLmcuOgotCi1cYmVnaW57dmVyYmF0aW19Ci0oUGRiKSBnbG9iYWwgbGlzdF9vcHRpb25zOyBsaXN0X29wdGlvbnMgPSBbJy1sJ10KLShQZGIpCi1cZW5ke3ZlcmJhdGltfQotCi1caXRlbVtydW4gXG9wdGlvbmFse1x2YXJ7YXJnc30gLi4ufV0KLVJlc3RhcnQgdGhlIGRlYnVnZ2VkIHB5dGhvbiBwcm9ncmFtLiBJZiBhbiBhcmd1bWVudCBpcyBzdXBwbGllZCwgaXQgaXMKLXNwbGl0dGVkIHdpdGggInNobGV4IiBhbmQgdGhlIHJlc3VsdCBpcyB1c2VkIGFzIHRoZSBuZXcgc3lzLmFyZ3YuCi1IaXN0b3J5LCBicmVha3BvaW50cywgYWN0aW9ucyBhbmQgZGVidWdnZXIgb3B0aW9ucyBhcmUgcHJlc2VydmVkLgotInJlc3RhcnQiIGlzIGFuIGFsaWFzIGZvciAicnVuIi4KLQotXHZlcnNpb25hZGRlZHsyLjZ9Ci0KLVxpdGVtW3EodWl0KV0KLQotUXVpdCBmcm9tIHRoZSBkZWJ1Z2dlci4KLVRoZSBwcm9ncmFtIGJlaW5nIGV4ZWN1dGVkIGlzIGFib3J0ZWQuCi0KLVxlbmR7ZGVzY3JpcHRpb259Ci0KLVxzZWN0aW9ue0hvdyBJdCBXb3JrcyBcbGFiZWx7ZGVidWdnZXItaG9va3N9fQotCi1Tb21lIGNoYW5nZXMgd2VyZSBtYWRlIHRvIHRoZSBpbnRlcnByZXRlcjoKLQotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSBcY29kZXtzeXMuc2V0dHJhY2UoXHZhcntmdW5jfSl9IHNldHMgdGhlIGdsb2JhbCB0cmFjZSBmdW5jdGlvbgotXGl0ZW0gdGhlcmUgY2FuIGFsc28gYSBsb2NhbCB0cmFjZSBmdW5jdGlvbiAoc2VlIGxhdGVyKQotXGVuZHtpdGVtaXplfQotCi1UcmFjZSBmdW5jdGlvbnMgaGF2ZSB0aHJlZSBhcmd1bWVudHM6IFx2YXJ7ZnJhbWV9LCBcdmFye2V2ZW50fSwgYW5kCi1cdmFye2FyZ30uIFx2YXJ7ZnJhbWV9IGlzIHRoZSBjdXJyZW50IHN0YWNrIGZyYW1lLiAgXHZhcntldmVudH0gaXMgYQotc3RyaW5nOiBcY29kZXsnY2FsbCd9LCBcY29kZXsnbGluZSd9LCBcY29kZXsncmV0dXJuJ30sIFxjb2RleydleGNlcHRpb24nfSwKLSBcY29kZXsnY19jYWxsJ30sIFxjb2RleydjX3JldHVybid9LCBvciBcY29kZXsnY19leGNlcHRpb24nfS4gXHZhcnthcmd9Ci0gZGVwZW5kcyBvbiB0aGUgZXZlbnQgdHlwZS4KLQotVGhlIGdsb2JhbCB0cmFjZSBmdW5jdGlvbiBpcyBpbnZva2VkICh3aXRoIFx2YXJ7ZXZlbnR9IHNldCB0bwotXGNvZGV7J2NhbGwnfSkgd2hlbmV2ZXIgYSBuZXcgbG9jYWwgc2NvcGUgaXMgZW50ZXJlZDsgaXQgc2hvdWxkIHJldHVybgotYSByZWZlcmVuY2UgdG8gdGhlIGxvY2FsIHRyYWNlIGZ1bmN0aW9uIHRvIGJlIHVzZWQgdGhhdCBzY29wZSwgb3IKLVxjb2Rle05vbmV9IGlmIHRoZSBzY29wZSBzaG91bGRuJ3QgYmUgdHJhY2VkLgotCi1UaGUgbG9jYWwgdHJhY2UgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBhIHJlZmVyZW5jZSB0byBpdHNlbGYgKG9yIHRvCi1hbm90aGVyIGZ1bmN0aW9uIGZvciBmdXJ0aGVyIHRyYWNpbmcgaW4gdGhhdCBzY29wZSksIG9yIFxjb2Rle05vbmV9IHRvCi10dXJuIG9mZiB0cmFjaW5nIGluIHRoYXQgc2NvcGUuCi0KLUluc3RhbmNlIG1ldGhvZHMgYXJlIGFjY2VwdGVkIChhbmQgdmVyeSB1c2VmdWwhKSBhcyB0cmFjZSBmdW5jdGlvbnMuCi0KLVRoZSBldmVudHMgaGF2ZSB0aGUgZm9sbG93aW5nIG1lYW5pbmc6Ci0KLVxiZWdpbntkZXNjcmlwdGlvbn0KLQotXGl0ZW1bXGNvZGV7J2NhbGwnfV0KLUEgZnVuY3Rpb24gaXMgY2FsbGVkIChvciBzb21lIG90aGVyIGNvZGUgYmxvY2sgZW50ZXJlZCkuICBUaGUgZ2xvYmFsCi10cmFjZSBmdW5jdGlvbiBpcyBjYWxsZWQ7IFx2YXJ7YXJnfSBpcyBcY29kZXtOb25lfTsKLXRoZSByZXR1cm4gdmFsdWUgc3BlY2lmaWVzIHRoZSBsb2NhbCB0cmFjZSBmdW5jdGlvbi4KLQotXGl0ZW1bXGNvZGV7J2xpbmUnfV0KLVRoZSBpbnRlcnByZXRlciBpcyBhYm91dCB0byBleGVjdXRlIGEgbmV3IGxpbmUgb2YgY29kZSAoc29tZXRpbWVzCi1tdWx0aXBsZSBsaW5lIGV2ZW50cyBvbiBvbmUgbGluZSBleGlzdCkuICBUaGUgbG9jYWwgdHJhY2UgZnVuY3Rpb24gaXMKLWNhbGxlZDsgXHZhcnthcmd9IGlzIFxjb2Rle05vbmV9OyB0aGUgcmV0dXJuIHZhbHVlIHNwZWNpZmllcyB0aGUgbmV3Ci1sb2NhbCB0cmFjZSBmdW5jdGlvbi4KLQotXGl0ZW1bXGNvZGV7J3JldHVybid9XQotQSBmdW5jdGlvbiAob3Igb3RoZXIgY29kZSBibG9jaykgaXMgYWJvdXQgdG8gcmV0dXJuLiAgVGhlIGxvY2FsIHRyYWNlCi1mdW5jdGlvbiBpcyBjYWxsZWQ7IFx2YXJ7YXJnfSBpcyB0aGUgdmFsdWUgdGhhdCB3aWxsIGJlIHJldHVybmVkLiAgVGhlCi10cmFjZSBmdW5jdGlvbidzIHJldHVybiB2YWx1ZSBpcyBpZ25vcmVkLgotCi1caXRlbVtcY29kZXsnZXhjZXB0aW9uJ31dCi1BbiBleGNlcHRpb24gaGFzIG9jY3VycmVkLiAgVGhlIGxvY2FsIHRyYWNlIGZ1bmN0aW9uIGlzIGNhbGxlZDsKLVx2YXJ7YXJnfSBpcyBhIHRyaXBsZSBcY29kZXsoXHZhcntleGNlcHRpb259LCBcdmFye3ZhbHVlfSwKLVx2YXJ7dHJhY2ViYWNrfSl9OyB0aGUgcmV0dXJuIHZhbHVlIHNwZWNpZmllcyB0aGUgbmV3IGxvY2FsIHRyYWNlCi1mdW5jdGlvbi4KLQotXGl0ZW1bXGNvZGV7J2NfY2FsbCd9XQotQSBDIGZ1bmN0aW9uIGlzIGFib3V0IHRvIGJlIGNhbGxlZC4gIFRoaXMgbWF5IGJlIGFuIGV4dGVuc2lvbiBmdW5jdGlvbgotb3IgYSBidWlsdGluLiAgXHZhcnthcmd9IGlzIHRoZSBDIGZ1bmN0aW9uIG9iamVjdC4KLQotXGl0ZW1bXGNvZGV7J2NfcmV0dXJuJ31dCi1BIEMgZnVuY3Rpb24gaGFzIHJldHVybmVkLiBcdmFye2FyZ30gaXMgXGNvZGV7Tm9uZX0uCi0KLVxpdGVtW1xjb2RleydjX2V4Y2VwdGlvbid9XQotQSBDIGZ1bmN0aW9uIGhhcyB0aHJvd24gYW4gZXhjZXB0aW9uLiAgXHZhcnthcmd9IGlzIFxjb2Rle05vbmV9LgotCi1cZW5ke2Rlc2NyaXB0aW9ufQotCi1Ob3RlIHRoYXQgYXMgYW4gZXhjZXB0aW9uIGlzIHByb3BhZ2F0ZWQgZG93biB0aGUgY2hhaW4gb2YgY2FsbGVycywgYW4KLVxjb2RleydleGNlcHRpb24nfSBldmVudCBpcyBnZW5lcmF0ZWQgYXQgZWFjaCBsZXZlbC4KLQotRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gY29kZSBhbmQgZnJhbWUgb2JqZWN0cywgcmVmZXIgdG8gdGhlCi1cY2l0ZXRpdGxlWy4uL3JlZi9yZWYuaHRtbF17UHl0aG9uIFJlZmVyZW5jZSBNYW51YWx9LgpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJwaWNrbGUudGV4IGIvRG9jL2xpYi9saWJwaWNrbGUudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzRjZDk4Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlicGlja2xlLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDg4OCArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3BpY2tsZX0gLS0tIFB5dGhvbiBvYmplY3Qgc2VyaWFsaXphdGlvbn0KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e3BpY2tsZX0KLVxtb2R1bGVzeW5vcHNpc3tDb252ZXJ0IFB5dGhvbiBvYmplY3RzIHRvIHN0cmVhbXMgb2YgYnl0ZXMgYW5kIGJhY2sufQotJSBTdWJzdGFudGlhbCBpbXByb3ZlbWVudHMgYnkgSmltIEtlcnIgPGpia2VyckBzci5ocC5jb20+LgotJSBSZXdyaXR0ZW4gYnkgQmFycnkgV2Fyc2F3IDxiYXJyeUB6b3BlLmNvbT4KLQotXGluZGV4e3BlcnNpc3RlbmNlfQotXGluZGV4aWl7cGVyc2lzdGVudH17b2JqZWN0c30KLVxpbmRleGlpe3NlcmlhbGl6aW5nfXtvYmplY3RzfQotXGluZGV4aWl7bWFyc2hhbGxpbmd9e29iamVjdHN9Ci1caW5kZXhpaXtmbGF0dGVuaW5nfXtvYmplY3RzfQotXGluZGV4aWl7cGlja2xpbmd9e29iamVjdHN9Ci0KLVRoZSBcbW9kdWxle3BpY2tsZX0gbW9kdWxlIGltcGxlbWVudHMgYSBmdW5kYW1lbnRhbCwgYnV0IHBvd2VyZnVsCi1hbGdvcml0aG0gZm9yIHNlcmlhbGl6aW5nIGFuZCBkZS1zZXJpYWxpemluZyBhIFB5dGhvbiBvYmplY3QKLXN0cnVjdHVyZS4gIGBgUGlja2xpbmcnJyBpcyB0aGUgcHJvY2VzcyB3aGVyZWJ5IGEgUHl0aG9uIG9iamVjdAotaGllcmFyY2h5IGlzIGNvbnZlcnRlZCBpbnRvIGEgYnl0ZSBzdHJlYW0sIGFuZCBgYHVucGlja2xpbmcnJyBpcyB0aGUKLWludmVyc2Ugb3BlcmF0aW9uLCB3aGVyZWJ5IGEgYnl0ZSBzdHJlYW0gaXMgY29udmVydGVkIGJhY2sgaW50byBhbgotb2JqZWN0IGhpZXJhcmNoeS4gIFBpY2tsaW5nIChhbmQgdW5waWNrbGluZykgaXMgYWx0ZXJuYXRpdmVseSBrbm93biBhcwotYGBzZXJpYWxpemF0aW9uJycsIGBgbWFyc2hhbGxpbmcsJydcZm9vdG5vdGV7RG9uJ3QgY29uZnVzZSB0aGlzIHdpdGgKLXRoZSBccmVmbW9kdWxle21hcnNoYWx9IG1vZHVsZX0gb3IgYGBmbGF0dGVuaW5nJycsCi1ob3dldmVyLCB0byBhdm9pZCBjb25mdXNpb24sIHRoZSB0ZXJtcyB1c2VkIGhlcmUgYXJlIGBgcGlja2xpbmcnJyBhbmQKLWBgdW5waWNrbGluZycnLgotCi1UaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGJvdGggdGhlIFxtb2R1bGV7cGlja2xlfSBtb2R1bGUgYW5kIHRoZSAKLVxyZWZtb2R1bGV7Y1BpY2tsZX0gbW9kdWxlLgotCi1cc3Vic2VjdGlvbntSZWxhdGlvbnNoaXAgdG8gb3RoZXIgUHl0aG9uIG1vZHVsZXN9Ci0KLVRoZSBcbW9kdWxle3BpY2tsZX0gbW9kdWxlIGhhcyBhbiBvcHRpbWl6ZWQgY291c2luIGNhbGxlZCB0aGUKLVxtb2R1bGV7Y1BpY2tsZX0gbW9kdWxlLiAgQXMgaXRzIG5hbWUgaW1wbGllcywgXG1vZHVsZXtjUGlja2xlfSBpcwotd3JpdHRlbiBpbiBDLCBzbyBpdCBjYW4gYmUgdXAgdG8gMTAwMCB0aW1lcyBmYXN0ZXIgdGhhbgotXG1vZHVsZXtwaWNrbGV9LiAgSG93ZXZlciBpdCBkb2VzIG5vdCBzdXBwb3J0IHN1YmNsYXNzaW5nIG9mIHRoZQotXGZ1bmN0aW9ue1BpY2tsZXIoKX0gYW5kIFxmdW5jdGlvbntVbnBpY2tsZXIoKX0gY2xhc3NlcywgYmVjYXVzZSBpbgotXG1vZHVsZXtjUGlja2xlfSB0aGVzZSBhcmUgZnVuY3Rpb25zLCBub3QgY2xhc3Nlcy4gIE1vc3QgYXBwbGljYXRpb25zCi1oYXZlIG5vIG5lZWQgZm9yIHRoaXMgZnVuY3Rpb25hbGl0eSwgYW5kIGNhbiBiZW5lZml0IGZyb20gdGhlIGltcHJvdmVkCi1wZXJmb3JtYW5jZSBvZiBcbW9kdWxle2NQaWNrbGV9LiAgT3RoZXIgdGhhbiB0aGF0LCB0aGUgaW50ZXJmYWNlcyBvZgotdGhlIHR3byBtb2R1bGVzIGFyZSBuZWFybHkgaWRlbnRpY2FsOyB0aGUgY29tbW9uIGludGVyZmFjZSBpcwotZGVzY3JpYmVkIGluIHRoaXMgbWFudWFsIGFuZCBkaWZmZXJlbmNlcyBhcmUgcG9pbnRlZCBvdXQgd2hlcmUKLW5lY2Vzc2FyeS4gIEluIHRoZSBmb2xsb3dpbmcgZGlzY3Vzc2lvbnMsIHdlIHVzZSB0aGUgdGVybSBgYHBpY2tsZScnCi10byBjb2xsZWN0aXZlbHkgZGVzY3JpYmUgdGhlIFxtb2R1bGV7cGlja2xlfSBhbmQKLVxtb2R1bGV7Y1BpY2tsZX0gbW9kdWxlcy4KLQotVGhlIGRhdGEgc3RyZWFtcyB0aGUgdHdvIG1vZHVsZXMgcHJvZHVjZSBhcmUgZ3VhcmFudGVlZCB0byBiZQotaW50ZXJjaGFuZ2VhYmxlLgotCi1QeXRob24gaGFzIGEgbW9yZSBwcmltaXRpdmUgc2VyaWFsaXphdGlvbiBtb2R1bGUgY2FsbGVkCi1ccmVmbW9kdWxle21hcnNoYWx9LCBidXQgaW4gZ2VuZXJhbAotXG1vZHVsZXtwaWNrbGV9IHNob3VsZCBhbHdheXMgYmUgdGhlIHByZWZlcnJlZCB3YXkgdG8gc2VyaWFsaXplIFB5dGhvbgotb2JqZWN0cy4gIFxtb2R1bGV7bWFyc2hhbH0gZXhpc3RzIHByaW1hcmlseSB0byBzdXBwb3J0IFB5dGhvbidzCi1cZmlsZXsucHljfSBmaWxlcy4KLQotVGhlIFxtb2R1bGV7cGlja2xlfSBtb2R1bGUgZGlmZmVycyBmcm9tIFxyZWZtb2R1bGV7bWFyc2hhbH0gc2V2ZXJhbAotc2lnbmlmaWNhbnQgd2F5czoKLQotXGJlZ2lue2l0ZW1pemV9Ci0KLVxpdGVtIFRoZSBcbW9kdWxle3BpY2tsZX0gbW9kdWxlIGtlZXBzIHRyYWNrIG9mIHRoZSBvYmplY3RzIGl0IGhhcwotICAgICAgYWxyZWFkeSBzZXJpYWxpemVkLCBzbyB0aGF0IGxhdGVyIHJlZmVyZW5jZXMgdG8gdGhlIHNhbWUgb2JqZWN0Ci0gICAgICB3b24ndCBiZSBzZXJpYWxpemVkIGFnYWluLiAgXG1vZHVsZXttYXJzaGFsfSBkb2Vzbid0IGRvIHRoaXMuCi0KLSAgICAgIFRoaXMgaGFzIGltcGxpY2F0aW9ucyBib3RoIGZvciByZWN1cnNpdmUgb2JqZWN0cyBhbmQgb2JqZWN0Ci0gICAgICBzaGFyaW5nLiAgUmVjdXJzaXZlIG9iamVjdHMgYXJlIG9iamVjdHMgdGhhdCBjb250YWluIHJlZmVyZW5jZXMKLSAgICAgIHRvIHRoZW1zZWx2ZXMuICBUaGVzZSBhcmUgbm90IGhhbmRsZWQgYnkgbWFyc2hhbCwgYW5kIGluIGZhY3QsCi0gICAgICBhdHRlbXB0aW5nIHRvIG1hcnNoYWwgcmVjdXJzaXZlIG9iamVjdHMgd2lsbCBjcmFzaCB5b3VyIFB5dGhvbgotICAgICAgaW50ZXJwcmV0ZXIuICBPYmplY3Qgc2hhcmluZyBoYXBwZW5zIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlCi0gICAgICByZWZlcmVuY2VzIHRvIHRoZSBzYW1lIG9iamVjdCBpbiBkaWZmZXJlbnQgcGxhY2VzIGluIHRoZSBvYmplY3QKLSAgICAgIGhpZXJhcmNoeSBiZWluZyBzZXJpYWxpemVkLiAgXG1vZHVsZXtwaWNrbGV9IHN0b3JlcyBzdWNoIG9iamVjdHMKLSAgICAgIG9ubHkgb25jZSwgYW5kIGVuc3VyZXMgdGhhdCBhbGwgb3RoZXIgcmVmZXJlbmNlcyBwb2ludCB0byB0aGUKLSAgICAgIG1hc3RlciBjb3B5LiAgU2hhcmVkIG9iamVjdHMgcmVtYWluIHNoYXJlZCwgd2hpY2ggY2FuIGJlIHZlcnkKLSAgICAgIGltcG9ydGFudCBmb3IgbXV0YWJsZSBvYmplY3RzLgotCi1caXRlbSBcbW9kdWxle21hcnNoYWx9IGNhbm5vdCBiZSB1c2VkIHRvIHNlcmlhbGl6ZSB1c2VyLWRlZmluZWQKLSAgICAgIGNsYXNzZXMgYW5kIHRoZWlyIGluc3RhbmNlcy4gIFxtb2R1bGV7cGlja2xlfSBjYW4gc2F2ZSBhbmQKLSAgICAgIHJlc3RvcmUgY2xhc3MgaW5zdGFuY2VzIHRyYW5zcGFyZW50bHksIGhvd2V2ZXIgdGhlIGNsYXNzCi0gICAgICBkZWZpbml0aW9uIG11c3QgYmUgaW1wb3J0YWJsZSBhbmQgbGl2ZSBpbiB0aGUgc2FtZSBtb2R1bGUgYXMKLSAgICAgIHdoZW4gdGhlIG9iamVjdCB3YXMgc3RvcmVkLgotCi1caXRlbSBUaGUgXG1vZHVsZXttYXJzaGFsfSBzZXJpYWxpemF0aW9uIGZvcm1hdCBpcyBub3QgZ3VhcmFudGVlZCB0bwotICAgICAgYmUgcG9ydGFibGUgYWNyb3NzIFB5dGhvbiB2ZXJzaW9ucy4gIEJlY2F1c2UgaXRzIHByaW1hcnkgam9iIGluCi0gICAgICBsaWZlIGlzIHRvIHN1cHBvcnQgXGZpbGV7LnB5Y30gZmlsZXMsIHRoZSBQeXRob24gaW1wbGVtZW50ZXJzCi0gICAgICByZXNlcnZlIHRoZSByaWdodCB0byBjaGFuZ2UgdGhlIHNlcmlhbGl6YXRpb24gZm9ybWF0IGluCi0gICAgICBub24tYmFja3dhcmRzIGNvbXBhdGlibGUgd2F5cyBzaG91bGQgdGhlIG5lZWQgYXJpc2UuICBUaGUKLSAgICAgIFxtb2R1bGV7cGlja2xlfSBzZXJpYWxpemF0aW9uIGZvcm1hdCBpcyBndWFyYW50ZWVkIHRvIGJlCi0gICAgICBiYWNrd2FyZHMgY29tcGF0aWJsZSBhY3Jvc3MgUHl0aG9uIHJlbGVhc2VzLgotCi1cZW5ke2l0ZW1pemV9Ci0KLVxiZWdpbntub3RpY2V9W3dhcm5pbmddCi1UaGUgXG1vZHVsZXtwaWNrbGV9IG1vZHVsZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc2VjdXJlIGFnYWluc3QKLWVycm9uZW91cyBvciBtYWxpY2lvdXNseSBjb25zdHJ1Y3RlZCBkYXRhLiAgTmV2ZXIgdW5waWNrbGUgZGF0YQotcmVjZWl2ZWQgZnJvbSBhbiB1bnRydXN0ZWQgb3IgdW5hdXRoZW50aWNhdGVkIHNvdXJjZS4KLVxlbmR7bm90aWNlfQotCi1Ob3RlIHRoYXQgc2VyaWFsaXphdGlvbiBpcyBhIG1vcmUgcHJpbWl0aXZlIG5vdGlvbiB0aGFuIHBlcnNpc3RlbmNlOwotYWx0aG91Z2gKLVxtb2R1bGV7cGlja2xlfSByZWFkcyBhbmQgd3JpdGVzIGZpbGUgb2JqZWN0cywgaXQgZG9lcyBub3QgaGFuZGxlIHRoZQotaXNzdWUgb2YgbmFtaW5nIHBlcnNpc3RlbnQgb2JqZWN0cywgbm9yIHRoZSAoZXZlbiBtb3JlIGNvbXBsaWNhdGVkKQotaXNzdWUgb2YgY29uY3VycmVudCBhY2Nlc3MgdG8gcGVyc2lzdGVudCBvYmplY3RzLiAgVGhlIFxtb2R1bGV7cGlja2xlfQotbW9kdWxlIGNhbiB0cmFuc2Zvcm0gYSBjb21wbGV4IG9iamVjdCBpbnRvIGEgYnl0ZSBzdHJlYW0gYW5kIGl0IGNhbgotdHJhbnNmb3JtIHRoZSBieXRlIHN0cmVhbSBpbnRvIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIGludGVybmFsCi1zdHJ1Y3R1cmUuICBQZXJoYXBzIHRoZSBtb3N0IG9idmlvdXMgdGhpbmcgdG8gZG8gd2l0aCB0aGVzZSBieXRlCi1zdHJlYW1zIGlzIHRvIHdyaXRlIHRoZW0gb250byBhIGZpbGUsIGJ1dCBpdCBpcyBhbHNvIGNvbmNlaXZhYmxlIHRvCi1zZW5kIHRoZW0gYWNyb3NzIGEgbmV0d29yayBvciBzdG9yZSB0aGVtIGluIGEgZGF0YWJhc2UuICBUaGUgbW9kdWxlCi1ccmVmbW9kdWxle3NoZWx2ZX0gcHJvdmlkZXMgYSBzaW1wbGUgaW50ZXJmYWNlCi10byBwaWNrbGUgYW5kIHVucGlja2xlIG9iamVjdHMgb24gREJNLXN0eWxlIGRhdGFiYXNlIGZpbGVzLgotCi1cc3Vic2VjdGlvbntEYXRhIHN0cmVhbSBmb3JtYXR9Ci0KLVRoZSBkYXRhIGZvcm1hdCB1c2VkIGJ5IFxtb2R1bGV7cGlja2xlfSBpcyBQeXRob24tc3BlY2lmaWMuICBUaGlzIGhhcwotdGhlIGFkdmFudGFnZSB0aGF0IHRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgaW1wb3NlZCBieSBleHRlcm5hbAotc3RhbmRhcmRzIHN1Y2ggYXMgWERSXGluZGV4e1hEUn1caW5kZXh7RXh0ZXJuYWwgRGF0YSBSZXByZXNlbnRhdGlvbn0KLSh3aGljaCBjYW4ndCByZXByZXNlbnQgcG9pbnRlciBzaGFyaW5nKTsgaG93ZXZlciBpdCBtZWFucyB0aGF0Ci1ub24tUHl0aG9uIHByb2dyYW1zIG1heSBub3QgYmUgYWJsZSB0byByZWNvbnN0cnVjdCBwaWNrbGVkIFB5dGhvbgotb2JqZWN0cy4KLQotQnkgZGVmYXVsdCwgdGhlIFxtb2R1bGV7cGlja2xlfSBkYXRhIGZvcm1hdCB1c2VzIGEgcHJpbnRhYmxlIFxBU0NJSXt9Ci1yZXByZXNlbnRhdGlvbi4gIFRoaXMgaXMgc2xpZ2h0bHkgbW9yZSB2b2x1bWlub3VzIHRoYW4gYSBiaW5hcnkKLXJlcHJlc2VudGF0aW9uLiAgVGhlIGJpZyBhZHZhbnRhZ2Ugb2YgdXNpbmcgcHJpbnRhYmxlIFxBU0NJSXt9IChhbmQgb2YKLXNvbWUgb3RoZXIgY2hhcmFjdGVyaXN0aWNzIG9mIFxtb2R1bGV7cGlja2xlfSdzIHJlcHJlc2VudGF0aW9uKSBpcyB0aGF0Ci1mb3IgZGVidWdnaW5nIG9yIHJlY292ZXJ5IHB1cnBvc2VzIGl0IGlzIHBvc3NpYmxlIGZvciBhIGh1bWFuIHRvIHJlYWQKLXRoZSBwaWNrbGVkIGZpbGUgd2l0aCBhIHN0YW5kYXJkIHRleHQgZWRpdG9yLgotCi1UaGVyZSBhcmUgY3VycmVudGx5IDMgZGlmZmVyZW50IHByb3RvY29scyB3aGljaCBjYW4gYmUgdXNlZCBmb3IgcGlja2xpbmcuCi0KLVxiZWdpbntpdGVtaXplfQotCi1caXRlbSBQcm90b2NvbCB2ZXJzaW9uIDAgaXMgdGhlIG9yaWdpbmFsIEFTQ0lJIHByb3RvY29sIGFuZCBpcyBiYWNrd2FyZHMKLWNvbXBhdGlibGUgd2l0aCBlYXJsaWVyIHZlcnNpb25zIG9mIFB5dGhvbi4KLQotXGl0ZW0gUHJvdG9jb2wgdmVyc2lvbiAxIGlzIHRoZSBvbGQgYmluYXJ5IGZvcm1hdCB3aGljaCBpcyBhbHNvIGNvbXBhdGlibGUKLXdpdGggZWFybGllciB2ZXJzaW9ucyBvZiBQeXRob24uCi0KLVxpdGVtIFByb3RvY29sIHZlcnNpb24gMiB3YXMgaW50cm9kdWNlZCBpbiBQeXRob24gMi4zLiAgSXQgcHJvdmlkZXMKLW11Y2ggbW9yZSBlZmZpY2llbnQgcGlja2xpbmcgb2YgbmV3LXN0eWxlIGNsYXNzZXMuCi0KLVxlbmR7aXRlbWl6ZX0KLQotUmVmZXIgdG8gUEVQIDMwNyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotSWYgYSBcdmFye3Byb3RvY29sfSBpcyBub3Qgc3BlY2lmaWVkLCBwcm90b2NvbCAwIGlzIHVzZWQuCi1JZiBcdmFye3Byb3RvY29sfSBpcyBzcGVjaWZpZWQgYXMgYSBuZWdhdGl2ZSB2YWx1ZQotb3IgXGNvbnN0YW50e0hJR0hFU1RfUFJPVE9DT0x9LAotdGhlIGhpZ2hlc3QgcHJvdG9jb2wgdmVyc2lvbiBhdmFpbGFibGUgd2lsbCBiZSB1c2VkLgotCi1cdmVyc2lvbmNoYW5nZWRbSW50cm9kdWNlZCB0aGUgXHZhcntwcm90b2NvbH0gcGFyYW1ldGVyXXsyLjN9Ci0KLUEgYmluYXJ5IGZvcm1hdCwgd2hpY2ggaXMgc2xpZ2h0bHkgbW9yZSBlZmZpY2llbnQsIGNhbiBiZSBjaG9zZW4gYnkKLXNwZWNpZnlpbmcgYSBcdmFye3Byb3RvY29sfSB2ZXJzaW9uID49IDEuCi0KLVxzdWJzZWN0aW9ue1VzYWdlfQotCi1UbyBzZXJpYWxpemUgYW4gb2JqZWN0IGhpZXJhcmNoeSwgeW91IGZpcnN0IGNyZWF0ZSBhIHBpY2tsZXIsIHRoZW4geW91Ci1jYWxsIHRoZSBwaWNrbGVyJ3MgXG1ldGhvZHtkdW1wKCl9IG1ldGhvZC4gIFRvIGRlLXNlcmlhbGl6ZSBhIGRhdGEKLXN0cmVhbSwgeW91IGZpcnN0IGNyZWF0ZSBhbiB1bnBpY2tsZXIsIHRoZW4geW91IGNhbGwgdGhlIHVucGlja2xlcidzCi1cbWV0aG9ke2xvYWQoKX0gbWV0aG9kLiAgVGhlIFxtb2R1bGV7cGlja2xlfSBtb2R1bGUgcHJvdmlkZXMgdGhlCi1mb2xsb3dpbmcgY29uc3RhbnQ6Ci0KLVxiZWdpbntkYXRhZGVzY317SElHSEVTVF9QUk9UT0NPTH0KLVRoZSBoaWdoZXN0IHByb3RvY29sIHZlcnNpb24gYXZhaWxhYmxlLiAgVGhpcyB2YWx1ZSBjYW4gYmUgcGFzc2VkCi1hcyBhIFx2YXJ7cHJvdG9jb2x9IHZhbHVlLgotXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke2RhdGFkZXNjfQotCi1cbm90ZXtCZSBzdXJlIHRvIGFsd2F5cyBvcGVuIHBpY2tsZSBmaWxlcyBjcmVhdGVkIHdpdGggcHJvdG9jb2xzID49IDEgaW4KLSAgICAgIGJpbmFyeSBtb2RlLiBGb3IgdGhlIG9sZCBBU0NJSS1iYXNlZCBwaWNrbGUgcHJvdG9jb2wgMCB5b3UgY2FuIHVzZQotICAgICAgZWl0aGVyIHRleHQgbW9kZSBvciBiaW5hcnkgbW9kZSBhcyBsb25nIGFzIHlvdSBzdGF5IGNvbnNpc3RlbnQuCi0gICAgICAKLSAgICAgIEEgcGlja2xlIGZpbGUgd3JpdHRlbiB3aXRoIHByb3RvY29sIDAgaW4gYmluYXJ5IG1vZGUgd2lsbCBjb250YWluCi0gICAgICBsb25lIGxpbmVmZWVkcyBhcyBsaW5lIHRlcm1pbmF0b3JzIGFuZCB0aGVyZWZvcmUgd2lsbCBsb29rIGBgZnVubnknJwotICAgICAgd2hlbiB2aWV3ZWQgaW4gTm90ZXBhZCBvciBvdGhlciBlZGl0b3JzIHdoaWNoIGRvIG5vdCBzdXBwb3J0IHRoaXMKLSAgICAgIGZvcm1hdC59Ci0KLVRoZSBcbW9kdWxle3BpY2tsZX0gbW9kdWxlIHByb3ZpZGVzIHRoZQotZm9sbG93aW5nIGZ1bmN0aW9ucyB0byBtYWtlIHRoZSBwaWNrbGluZyBwcm9jZXNzIG1vcmUgY29udmVuaWVudDoKLQotXGJlZ2lue2Z1bmNkZXNjfXtkdW1wfXtvYmosIGZpbGVcb3B0aW9uYWx7LCBwcm90b2NvbH19Ci1Xcml0ZSBhIHBpY2tsZWQgcmVwcmVzZW50YXRpb24gb2YgXHZhcntvYmp9IHRvIHRoZSBvcGVuIGZpbGUgb2JqZWN0Ci1cdmFye2ZpbGV9LiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvCi1cY29kZXtQaWNrbGVyKFx2YXJ7ZmlsZX0sIFx2YXJ7cHJvdG9jb2x9KS5kdW1wKFx2YXJ7b2JqfSl9LgotCi1JZiB0aGUgXHZhcntwcm90b2NvbH0gcGFyYW1ldGVyIGlzIG9taXR0ZWQsIHByb3RvY29sIDAgaXMgdXNlZC4KLUlmIFx2YXJ7cHJvdG9jb2x9IGlzIHNwZWNpZmllZCBhcyBhIG5lZ2F0aXZlIHZhbHVlCi1vciBcY29uc3RhbnR7SElHSEVTVF9QUk9UT0NPTH0sCi10aGUgaGlnaGVzdCBwcm90b2NvbCB2ZXJzaW9uIHdpbGwgYmUgdXNlZC4KLQotXHZlcnNpb25jaGFuZ2VkW0ludHJvZHVjZWQgdGhlIFx2YXJ7cHJvdG9jb2x9IHBhcmFtZXRlcl17Mi4zfQotCi1cdmFye2ZpbGV9IG11c3QgaGF2ZSBhIFxtZXRob2R7d3JpdGUoKX0gbWV0aG9kIHRoYXQgYWNjZXB0cyBhIHNpbmdsZQotc3RyaW5nIGFyZ3VtZW50LiAgSXQgY2FuIHRodXMgYmUgYSBmaWxlIG9iamVjdCBvcGVuZWQgZm9yIHdyaXRpbmcsIGEKLVxyZWZtb2R1bGV7U3RyaW5nSU99IG9iamVjdCwgb3IgYW55IG90aGVyIGN1c3RvbQotb2JqZWN0IHRoYXQgbWVldHMgdGhpcyBpbnRlcmZhY2UuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2xvYWR9e2ZpbGV9Ci1SZWFkIGEgc3RyaW5nIGZyb20gdGhlIG9wZW4gZmlsZSBvYmplY3QgXHZhcntmaWxlfSBhbmQgaW50ZXJwcmV0IGl0IGFzCi1hIHBpY2tsZSBkYXRhIHN0cmVhbSwgcmVjb25zdHJ1Y3RpbmcgYW5kIHJldHVybmluZyB0aGUgb3JpZ2luYWwgb2JqZWN0Ci1oaWVyYXJjaHkuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gXGNvZGV7VW5waWNrbGVyKFx2YXJ7ZmlsZX0pLmxvYWQoKX0uCi0KLVx2YXJ7ZmlsZX0gbXVzdCBoYXZlIHR3byBtZXRob2RzLCBhIFxtZXRob2R7cmVhZCgpfSBtZXRob2QgdGhhdCB0YWtlcwotYW4gaW50ZWdlciBhcmd1bWVudCwgYW5kIGEgXG1ldGhvZHtyZWFkbGluZSgpfSBtZXRob2QgdGhhdCByZXF1aXJlcyBubwotYXJndW1lbnRzLiAgQm90aCBtZXRob2RzIHNob3VsZCByZXR1cm4gYSBzdHJpbmcuICBUaHVzIFx2YXJ7ZmlsZX0gY2FuCi1iZSBhIGZpbGUgb2JqZWN0IG9wZW5lZCBmb3IgcmVhZGluZywgYQotXG1vZHVsZXtTdHJpbmdJT30gb2JqZWN0LCBvciBhbnkgb3RoZXIgY3VzdG9tCi1vYmplY3QgdGhhdCBtZWV0cyB0aGlzIGludGVyZmFjZS4KLQotVGhpcyBmdW5jdGlvbiBhdXRvbWF0aWNhbGx5IGRldGVybWluZXMgd2hldGhlciB0aGUgZGF0YSBzdHJlYW0gd2FzCi13cml0dGVuIGluIGJpbmFyeSBtb2RlIG9yIG5vdC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZHVtcHN9e29ialxvcHRpb25hbHssIHByb3RvY29sfX0KLVJldHVybiB0aGUgcGlja2xlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0IGFzIGEgc3RyaW5nLCBpbnN0ZWFkCi1vZiB3cml0aW5nIGl0IHRvIGEgZmlsZS4KLQotSWYgdGhlIFx2YXJ7cHJvdG9jb2x9IHBhcmFtZXRlciBpcyBvbWl0dGVkLCBwcm90b2NvbCAwIGlzIHVzZWQuCi1JZiBcdmFye3Byb3RvY29sfSBpcyBzcGVjaWZpZWQgYXMgYSBuZWdhdGl2ZSB2YWx1ZQotb3IgXGNvbnN0YW50e0hJR0hFU1RfUFJPVE9DT0x9LAotdGhlIGhpZ2hlc3QgcHJvdG9jb2wgdmVyc2lvbiB3aWxsIGJlIHVzZWQuCi0KLVx2ZXJzaW9uY2hhbmdlZFtUaGUgXHZhcntwcm90b2NvbH0gcGFyYW1ldGVyIHdhcyBhZGRlZF17Mi4zfQotCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2xvYWRzfXtzdHJpbmd9Ci1SZWFkIGEgcGlja2xlZCBvYmplY3QgaGllcmFyY2h5IGZyb20gYSBzdHJpbmcuICBDaGFyYWN0ZXJzIGluIHRoZQotc3RyaW5nIHBhc3QgdGhlIHBpY2tsZWQgb2JqZWN0J3MgcmVwcmVzZW50YXRpb24gYXJlIGlnbm9yZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1UaGUgXG1vZHVsZXtwaWNrbGV9IG1vZHVsZSBhbHNvIGRlZmluZXMgdGhyZWUgZXhjZXB0aW9uczoKLQotXGJlZ2lue2V4Y2Rlc2N9e1BpY2tsZUVycm9yfQotQSBjb21tb24gYmFzZSBjbGFzcyBmb3IgdGhlIG90aGVyIGV4Y2VwdGlvbnMgZGVmaW5lZCBiZWxvdy4gIFRoaXMKLWluaGVyaXRzIGZyb20gXGV4Y2VwdGlvbntFeGNlcHRpb259LgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317UGlja2xpbmdFcnJvcn0KLVRoaXMgZXhjZXB0aW9uIGlzIHJhaXNlZCB3aGVuIGFuIHVucGlja2xhYmxlIG9iamVjdCBpcyBwYXNzZWQgdG8KLXRoZSBcbWV0aG9ke2R1bXAoKX0gbWV0aG9kLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317VW5waWNrbGluZ0Vycm9yfQotVGhpcyBleGNlcHRpb24gaXMgcmFpc2VkIHdoZW4gdGhlcmUgaXMgYSBwcm9ibGVtIHVucGlja2xpbmcgYW4gb2JqZWN0LgotTm90ZSB0aGF0IG90aGVyIGV4Y2VwdGlvbnMgbWF5IGFsc28gYmUgcmFpc2VkIGR1cmluZyB1bnBpY2tsaW5nLAotaW5jbHVkaW5nIChidXQgbm90IG5lY2Vzc2FyaWx5IGxpbWl0ZWQgdG8pIFxleGNlcHRpb257QXR0cmlidXRlRXJyb3J9LAotXGV4Y2VwdGlvbntFT0ZFcnJvcn0sIFxleGNlcHRpb257SW1wb3J0RXJyb3J9LCBhbmQgXGV4Y2VwdGlvbntJbmRleEVycm9yfS4KLVxlbmR7ZXhjZGVzY30KLQotVGhlIFxtb2R1bGV7cGlja2xlfSBtb2R1bGUgYWxzbyBleHBvcnRzIHR3byBjYWxsYWJsZXNcZm9vdG5vdGV7SW4gdGhlCi1cbW9kdWxle3BpY2tsZX0gbW9kdWxlIHRoZXNlIGNhbGxhYmxlcyBhcmUgY2xhc3Nlcywgd2hpY2ggeW91IGNvdWxkCi1zdWJjbGFzcyB0byBjdXN0b21pemUgdGhlIGJlaGF2aW9yLiAgSG93ZXZlciwgaW4gdGhlIFxyZWZtb2R1bGV7Y1BpY2tsZX0KLW1vZHVsZSB0aGVzZSBjYWxsYWJsZXMgYXJlIGZhY3RvcnkgZnVuY3Rpb25zIGFuZCBzbyBjYW5ub3QgYmUKLXN1YmNsYXNzZWQuICBPbmUgY29tbW9uIHJlYXNvbiB0byBzdWJjbGFzcyBpcyB0byBjb250cm9sIHdoYXQKLW9iamVjdHMgY2FuIGFjdHVhbGx5IGJlIHVucGlja2xlZC4gIFNlZSBzZWN0aW9uflxyZWZ7cGlja2xlLXN1Yn0gZm9yCi1tb3JlIGRldGFpbHMufSwgXGNsYXNze1BpY2tsZXJ9IGFuZCBcY2xhc3N7VW5waWNrbGVyfToKLQotXGJlZ2lue2NsYXNzZGVzY317UGlja2xlcn17ZmlsZVxvcHRpb25hbHssIHByb3RvY29sfX0KLVRoaXMgdGFrZXMgYSBmaWxlLWxpa2Ugb2JqZWN0IHRvIHdoaWNoIGl0IHdpbGwgd3JpdGUgYSBwaWNrbGUgZGF0YQotc3RyZWFtLiAgCi0KLUlmIHRoZSBcdmFye3Byb3RvY29sfSBwYXJhbWV0ZXIgaXMgb21pdHRlZCwgcHJvdG9jb2wgMCBpcyB1c2VkLgotSWYgXHZhcntwcm90b2NvbH0gaXMgc3BlY2lmaWVkIGFzIGEgbmVnYXRpdmUgdmFsdWUsCi10aGUgaGlnaGVzdCBwcm90b2NvbCB2ZXJzaW9uIHdpbGwgYmUgdXNlZC4KLQotXHZlcnNpb25jaGFuZ2VkW0ludHJvZHVjZWQgdGhlIFx2YXJ7cHJvdG9jb2x9IHBhcmFtZXRlcl17Mi4zfQotCi1cdmFye2ZpbGV9IG11c3QgaGF2ZSBhIFxtZXRob2R7d3JpdGUoKX0gbWV0aG9kIHRoYXQgYWNjZXB0cyBhIHNpbmdsZQotc3RyaW5nIGFyZ3VtZW50LiAgSXQgY2FuIHRodXMgYmUgYW4gb3BlbiBmaWxlIG9iamVjdCwgYQotXG1vZHVsZXtTdHJpbmdJT30gb2JqZWN0LCBvciBhbnkgb3RoZXIgY3VzdG9tCi1vYmplY3QgdGhhdCBtZWV0cyB0aGlzIGludGVyZmFjZS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cY2xhc3N7UGlja2xlcn0gb2JqZWN0cyBkZWZpbmUgb25lIChvciB0d28pIHB1YmxpYyBtZXRob2RzOgotCi1cYmVnaW57bWV0aG9kZGVzY31bUGlja2xlcl17ZHVtcH17b2JqfQotV3JpdGUgYSBwaWNrbGVkIHJlcHJlc2VudGF0aW9uIG9mIFx2YXJ7b2JqfSB0byB0aGUgb3BlbiBmaWxlIG9iamVjdAotZ2l2ZW4gaW4gdGhlIGNvbnN0cnVjdG9yLiAgRWl0aGVyIHRoZSBiaW5hcnkgb3IgXEFTQ0lJe30gZm9ybWF0IHdpbGwKLWJlIHVzZWQsIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgdGhlIFx2YXJ7cHJvdG9jb2x9IGFyZ3VtZW50IHBhc3NlZCB0byB0aGUKLWNvbnN0cnVjdG9yLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUGlja2xlcl17Y2xlYXJfbWVtb317fQotQ2xlYXJzIHRoZSBwaWNrbGVyJ3MgYGBtZW1vJycuICBUaGUgbWVtbyBpcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgdGhhdAotcmVtZW1iZXJzIHdoaWNoIG9iamVjdHMgdGhlIHBpY2tsZXIgaGFzIGFscmVhZHkgc2Vlbiwgc28gdGhhdCBzaGFyZWQKLW9yIHJlY3Vyc2l2ZSBvYmplY3RzIHBpY2tsZWQgYnkgcmVmZXJlbmNlIGFuZCBub3QgYnkgdmFsdWUuICBUaGlzCi1tZXRob2QgaXMgdXNlZnVsIHdoZW4gcmUtdXNpbmcgcGlja2xlcnMuCi0KLVxiZWdpbntub3RpY2V9Ci1QcmlvciB0byBQeXRob24gMi4zLCBcbWV0aG9ke2NsZWFyX21lbW8oKX0gd2FzIG9ubHkgYXZhaWxhYmxlIG9uIHRoZQotcGlja2xlcnMgY3JlYXRlZCBieSBccmVmbW9kdWxle2NQaWNrbGV9LiAgSW4gdGhlIFxtb2R1bGV7cGlja2xlfSBtb2R1bGUsCi1waWNrbGVycyBoYXZlIGFuIGluc3RhbmNlIHZhcmlhYmxlIGNhbGxlZCBcbWVtYmVye21lbW99IHdoaWNoIGlzIGEKLVB5dGhvbiBkaWN0aW9uYXJ5LiAgU28gdG8gY2xlYXIgdGhlIG1lbW8gZm9yIGEgXG1vZHVsZXtwaWNrbGV9IG1vZHVsZQotcGlja2xlciwgeW91IGNvdWxkIGRvIHRoZSBmb2xsb3dpbmc6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLW15cGlja2xlci5tZW1vLmNsZWFyKCkKLVxlbmR7dmVyYmF0aW19Ci0KLUNvZGUgdGhhdCBkb2VzIG5vdCBuZWVkIHRvIHN1cHBvcnQgb2xkZXIgdmVyc2lvbnMgb2YgUHl0aG9uIHNob3VsZAotc2ltcGx5IHVzZSBcbWV0aG9ke2NsZWFyX21lbW8oKX0uCi1cZW5ke25vdGljZX0KLVxlbmR7bWV0aG9kZGVzY30KLQotSXQgaXMgcG9zc2libGUgdG8gbWFrZSBtdWx0aXBsZSBjYWxscyB0byB0aGUgXG1ldGhvZHtkdW1wKCl9IG1ldGhvZCBvZgotdGhlIHNhbWUgXGNsYXNze1BpY2tsZXJ9IGluc3RhbmNlLiAgVGhlc2UgbXVzdCB0aGVuIGJlIG1hdGNoZWQgdG8gdGhlCi1zYW1lIG51bWJlciBvZiBjYWxscyB0byB0aGUgXG1ldGhvZHtsb2FkKCl9IG1ldGhvZCBvZiB0aGUKLWNvcnJlc3BvbmRpbmcgXGNsYXNze1VucGlja2xlcn0gaW5zdGFuY2UuICBJZiB0aGUgc2FtZSBvYmplY3QgaXMKLXBpY2tsZWQgYnkgbXVsdGlwbGUgXG1ldGhvZHtkdW1wKCl9IGNhbGxzLCB0aGUgXG1ldGhvZHtsb2FkKCl9IHdpbGwKLWFsbCB5aWVsZCByZWZlcmVuY2VzIHRvIHRoZSBzYW1lIG9iamVjdC5cZm9vdG5vdGV7XGVtcGh7V2FybmluZ306IHRoaXMKLWlzIGludGVuZGVkIGZvciBwaWNrbGluZyBtdWx0aXBsZSBvYmplY3RzIHdpdGhvdXQgaW50ZXJ2ZW5pbmcKLW1vZGlmaWNhdGlvbnMgdG8gdGhlIG9iamVjdHMgb3IgdGhlaXIgcGFydHMuICBJZiB5b3UgbW9kaWZ5IGFuIG9iamVjdAotYW5kIHRoZW4gcGlja2xlIGl0IGFnYWluIHVzaW5nIHRoZSBzYW1lIFxjbGFzc3tQaWNrbGVyfSBpbnN0YW5jZSwgdGhlCi1vYmplY3QgaXMgbm90IHBpY2tsZWQgYWdhaW4gLS0tIGEgcmVmZXJlbmNlIHRvIGl0IGlzIHBpY2tsZWQgYW5kIHRoZQotXGNsYXNze1VucGlja2xlcn0gd2lsbCByZXR1cm4gdGhlIG9sZCB2YWx1ZSwgbm90IHRoZSBtb2RpZmllZCBvbmUuCi1UaGVyZSBhcmUgdHdvIHByb2JsZW1zIGhlcmU6ICgxKSBkZXRlY3RpbmcgY2hhbmdlcywgYW5kICgyKQotbWFyc2hhbGxpbmcgYSBtaW5pbWFsIHNldCBvZiBjaGFuZ2VzLiAgR2FyYmFnZSBDb2xsZWN0aW9uIG1heSBhbHNvCi1iZWNvbWUgYSBwcm9ibGVtIGhlcmUufQotCi1cY2xhc3N7VW5waWNrbGVyfSBvYmplY3RzIGFyZSBkZWZpbmVkIGFzOgotCi1cYmVnaW57Y2xhc3NkZXNjfXtVbnBpY2tsZXJ9e2ZpbGV9Ci1UaGlzIHRha2VzIGEgZmlsZS1saWtlIG9iamVjdCBmcm9tIHdoaWNoIGl0IHdpbGwgcmVhZCBhIHBpY2tsZSBkYXRhCi1zdHJlYW0uICBUaGlzIGNsYXNzIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkYXRhIHN0cmVhbQotd2FzIHdyaXR0ZW4gaW4gYmluYXJ5IG1vZGUgb3Igbm90LCBzbyBpdCBkb2VzIG5vdCBuZWVkIGEgZmxhZyBhcyBpbgotdGhlIFxjbGFzc3tQaWNrbGVyfSBmYWN0b3J5LgotCi1cdmFye2ZpbGV9IG11c3QgaGF2ZSB0d28gbWV0aG9kcywgYSBcbWV0aG9ke3JlYWQoKX0gbWV0aG9kIHRoYXQgdGFrZXMKLWFuIGludGVnZXIgYXJndW1lbnQsIGFuZCBhIFxtZXRob2R7cmVhZGxpbmUoKX0gbWV0aG9kIHRoYXQgcmVxdWlyZXMgbm8KLWFyZ3VtZW50cy4gIEJvdGggbWV0aG9kcyBzaG91bGQgcmV0dXJuIGEgc3RyaW5nLiAgVGh1cyBcdmFye2ZpbGV9IGNhbgotYmUgYSBmaWxlIG9iamVjdCBvcGVuZWQgZm9yIHJlYWRpbmcsIGEKLVxtb2R1bGV7U3RyaW5nSU99IG9iamVjdCwgb3IgYW55IG90aGVyIGN1c3RvbQotb2JqZWN0IHRoYXQgbWVldHMgdGhpcyBpbnRlcmZhY2UuCi1cZW5ke2NsYXNzZGVzY30KLQotXGNsYXNze1VucGlja2xlcn0gb2JqZWN0cyBoYXZlIG9uZSAob3IgdHdvKSBwdWJsaWMgbWV0aG9kczoKLQotXGJlZ2lue21ldGhvZGRlc2N9W1VucGlja2xlcl17bG9hZH17fQotUmVhZCBhIHBpY2tsZWQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZyb20gdGhlIG9wZW4gZmlsZSBvYmplY3QgZ2l2ZW4KLWluIHRoZSBjb25zdHJ1Y3RvciwgYW5kIHJldHVybiB0aGUgcmVjb25zdGl0dXRlZCBvYmplY3QgaGllcmFyY2h5Ci1zcGVjaWZpZWQgdGhlcmVpbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1VucGlja2xlcl17bm9sb2FkfXt9Ci1UaGlzIGlzIGp1c3QgbGlrZSBcbWV0aG9ke2xvYWQoKX0gZXhjZXB0IHRoYXQgaXQgZG9lc24ndCBhY3R1YWxseQotY3JlYXRlIGFueSBvYmplY3RzLiAgVGhpcyBpcyB1c2VmdWwgcHJpbWFyaWx5IGZvciBmaW5kaW5nIHdoYXQncwotY2FsbGVkIGBgcGVyc2lzdGVudCBpZHMnJyB0aGF0IG1heSBiZSByZWZlcmVuY2VkIGluIGEgcGlja2xlIGRhdGEKLXN0cmVhbS4gIFNlZSBzZWN0aW9uflxyZWZ7cGlja2xlLXByb3RvY29sfSBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzLgotCi1cc3Ryb25ne05vdGU6fSB0aGUgXG1ldGhvZHtub2xvYWQoKX0gbWV0aG9kIGlzIGN1cnJlbnRseSBvbmx5Ci1hdmFpbGFibGUgb24gXGNsYXNze1VucGlja2xlcn0gb2JqZWN0cyBjcmVhdGVkIHdpdGggdGhlCi1cbW9kdWxle2NQaWNrbGV9IG1vZHVsZS4gIFxtb2R1bGV7cGlja2xlfSBtb2R1bGUgXGNsYXNze1VucGlja2xlcn1zIGRvCi1ub3QgaGF2ZSB0aGUgXG1ldGhvZHtub2xvYWQoKX0gbWV0aG9kLgotXGVuZHttZXRob2RkZXNjfQotCi1cc3Vic2VjdGlvbntXaGF0IGNhbiBiZSBwaWNrbGVkIGFuZCB1bnBpY2tsZWQ/fQotCi1UaGUgZm9sbG93aW5nIHR5cGVzIGNhbiBiZSBwaWNrbGVkOgotCi1cYmVnaW57aXRlbWl6ZX0KLQotXGl0ZW0gXGNvZGV7Tm9uZX0sIFxjb2Rle1RydWV9LCBhbmQgXGNvZGV7RmFsc2V9Ci0KLVxpdGVtIGludGVnZXJzLCBsb25nIGludGVnZXJzLCBmbG9hdGluZyBwb2ludCBudW1iZXJzLCBjb21wbGV4IG51bWJlcnMKLQotXGl0ZW0gbm9ybWFsIGFuZCBVbmljb2RlIHN0cmluZ3MKLQotXGl0ZW0gdHVwbGVzLCBsaXN0cywgc2V0cywgYW5kIGRpY3Rpb25hcmllcyBjb250YWluaW5nIG9ubHkgcGlja2xhYmxlIG9iamVjdHMKLQotXGl0ZW0gZnVuY3Rpb25zIGRlZmluZWQgYXQgdGhlIHRvcCBsZXZlbCBvZiBhIG1vZHVsZQotCi1caXRlbSBidWlsdC1pbiBmdW5jdGlvbnMgZGVmaW5lZCBhdCB0aGUgdG9wIGxldmVsIG9mIGEgbW9kdWxlCi0KLVxpdGVtIGNsYXNzZXMgdGhhdCBhcmUgZGVmaW5lZCBhdCB0aGUgdG9wIGxldmVsIG9mIGEgbW9kdWxlCi0KLVxpdGVtIGluc3RhbmNlcyBvZiBzdWNoIGNsYXNzZXMgd2hvc2UgXG1lbWJlcntfX2RpY3RfX30gb3IKLVxtZXRob2R7X19zZXRzdGF0ZV9fKCl9IGlzIHBpY2tsYWJsZSAgKHNlZQotc2VjdGlvbn5ccmVme3BpY2tsZS1wcm90b2NvbH0gZm9yIGRldGFpbHMpCi0KLVxlbmR7aXRlbWl6ZX0KLQotQXR0ZW1wdHMgdG8gcGlja2xlIHVucGlja2xhYmxlIG9iamVjdHMgd2lsbCByYWlzZSB0aGUKLVxleGNlcHRpb257UGlja2xpbmdFcnJvcn0gZXhjZXB0aW9uOyB3aGVuIHRoaXMgaGFwcGVucywgYW4gdW5zcGVjaWZpZWQKLW51bWJlciBvZiBieXRlcyBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbiB0byB0aGUgdW5kZXJseWluZyBmaWxlLgotVHJ5aW5nIHRvIHBpY2tsZSBhIGhpZ2hseSByZWN1cnNpdmUgZGF0YSBzdHJ1Y3R1cmUgbWF5IGV4Y2VlZCB0aGUKLW1heGltdW0gcmVjdXJzaW9uIGRlcHRoLCBhIFxleGNlcHRpb257UnVudGltZUVycm9yfSB3aWxsIGJlIHJhaXNlZAotaW4gdGhpcyBjYXNlLiBZb3UgY2FuIGNhcmVmdWxseSByYWlzZSB0aGlzIGxpbWl0IHdpdGggCi1cZnVuY3Rpb257c3lzLnNldHJlY3Vyc2lvbmxpbWl0KCl9LgotCi1Ob3RlIHRoYXQgZnVuY3Rpb25zIChidWlsdC1pbiBhbmQgdXNlci1kZWZpbmVkKSBhcmUgcGlja2xlZCBieSBgYGZ1bGx5Ci1xdWFsaWZpZWQnJyBuYW1lIHJlZmVyZW5jZSwgbm90IGJ5IHZhbHVlLiAgVGhpcyBtZWFucyB0aGF0IG9ubHkgdGhlCi1mdW5jdGlvbiBuYW1lIGlzIHBpY2tsZWQsIGFsb25nIHdpdGggdGhlIG5hbWUgb2YgbW9kdWxlIHRoZSBmdW5jdGlvbgotaXMgZGVmaW5lZCBpbi4gIE5laXRoZXIgdGhlIGZ1bmN0aW9uJ3MgY29kZSwgbm9yIGFueSBvZiBpdHMgZnVuY3Rpb24KLWF0dHJpYnV0ZXMgYXJlIHBpY2tsZWQuICBUaHVzIHRoZSBkZWZpbmluZyBtb2R1bGUgbXVzdCBiZSBpbXBvcnRhYmxlCi1pbiB0aGUgdW5waWNrbGluZyBlbnZpcm9ubWVudCwgYW5kIHRoZSBtb2R1bGUgbXVzdCBjb250YWluIHRoZSBuYW1lZAotb2JqZWN0LCBvdGhlcndpc2UgYW4gZXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkLlxmb290bm90ZXtUaGUgZXhjZXB0aW9uCi1yYWlzZWQgd2lsbCBsaWtlbHkgYmUgYW4gXGV4Y2VwdGlvbntJbXBvcnRFcnJvcn0gb3IgYW4KLVxleGNlcHRpb257QXR0cmlidXRlRXJyb3J9IGJ1dCBpdCBjb3VsZCBiZSBzb21ldGhpbmcgZWxzZS59Ci0KLVNpbWlsYXJseSwgY2xhc3NlcyBhcmUgcGlja2xlZCBieSBuYW1lZCByZWZlcmVuY2UsIHNvIHRoZSBzYW1lCi1yZXN0cmljdGlvbnMgaW4gdGhlIHVucGlja2xpbmcgZW52aXJvbm1lbnQgYXBwbHkuICBOb3RlIHRoYXQgbm9uZSBvZgotdGhlIGNsYXNzJ3MgY29kZSBvciBkYXRhIGlzIHBpY2tsZWQsIHNvIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSB0aGUKLWNsYXNzIGF0dHJpYnV0ZSBcY29kZXthdHRyfSBpcyBub3QgcmVzdG9yZWQgaW4gdGhlIHVucGlja2xpbmcKLWVudmlyb25tZW50OgotCi1cYmVnaW57dmVyYmF0aW19Ci1jbGFzcyBGb286Ci0gICAgYXR0ciA9ICdhIGNsYXNzIGF0dHInCi0KLXBpY2tsZXN0cmluZyA9IHBpY2tsZS5kdW1wcyhGb28pCi1cZW5ke3ZlcmJhdGltfQotCi1UaGVzZSByZXN0cmljdGlvbnMgYXJlIHdoeSBwaWNrbGFibGUgZnVuY3Rpb25zIGFuZCBjbGFzc2VzIG11c3QgYmUKLWRlZmluZWQgaW4gdGhlIHRvcCBsZXZlbCBvZiBhIG1vZHVsZS4KLQotU2ltaWxhcmx5LCB3aGVuIGNsYXNzIGluc3RhbmNlcyBhcmUgcGlja2xlZCwgdGhlaXIgY2xhc3MncyBjb2RlIGFuZAotZGF0YSBhcmUgbm90IHBpY2tsZWQgYWxvbmcgd2l0aCB0aGVtLiAgT25seSB0aGUgaW5zdGFuY2UgZGF0YSBhcmUKLXBpY2tsZWQuICBUaGlzIGlzIGRvbmUgb24gcHVycG9zZSwgc28geW91IGNhbiBmaXggYnVncyBpbiBhIGNsYXNzIG9yCi1hZGQgbWV0aG9kcyB0byB0aGUgY2xhc3MgYW5kIHN0aWxsIGxvYWQgb2JqZWN0cyB0aGF0IHdlcmUgY3JlYXRlZCB3aXRoCi1hbiBlYXJsaWVyIHZlcnNpb24gb2YgdGhlIGNsYXNzLiAgSWYgeW91IHBsYW4gdG8gaGF2ZSBsb25nLWxpdmVkCi1vYmplY3RzIHRoYXQgd2lsbCBzZWUgbWFueSB2ZXJzaW9ucyBvZiBhIGNsYXNzLCBpdCBtYXkgYmUgd29ydGh3aGlsZQotdG8gcHV0IGEgdmVyc2lvbiBudW1iZXIgaW4gdGhlIG9iamVjdHMgc28gdGhhdCBzdWl0YWJsZSBjb252ZXJzaW9ucwotY2FuIGJlIG1hZGUgYnkgdGhlIGNsYXNzJ3MgXG1ldGhvZHtfX3NldHN0YXRlX18oKX0gbWV0aG9kLgotCi1cc3Vic2VjdGlvbntUaGUgcGlja2xlIHByb3RvY29sCi1cbGFiZWx7cGlja2xlLXByb3RvY29sfX1cc2V0aW5kZXhzdWJpdGVteyhwaWNrbGUgcHJvdG9jb2wpfQotCi1UaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBgYHBpY2tsaW5nIHByb3RvY29sJycgdGhhdCBkZWZpbmVzIHRoZQotaW50ZXJmYWNlIGJldHdlZW4gdGhlIHBpY2tsZXIvdW5waWNrbGVyIGFuZCB0aGUgb2JqZWN0cyB0aGF0IGFyZSBiZWluZwotc2VyaWFsaXplZC4gIFRoaXMgcHJvdG9jb2wgcHJvdmlkZXMgYSBzdGFuZGFyZCB3YXkgZm9yIHlvdSB0byBkZWZpbmUsCi1jdXN0b21pemUsIGFuZCBjb250cm9sIGhvdyB5b3VyIG9iamVjdHMgYXJlIHNlcmlhbGl6ZWQgYW5kCi1kZS1zZXJpYWxpemVkLiAgVGhlIGRlc2NyaXB0aW9uIGluIHRoaXMgc2VjdGlvbiBkb2Vzbid0IGNvdmVyIHNwZWNpZmljCi1jdXN0b21pemF0aW9ucyB0aGF0IHlvdSBjYW4gZW1wbG95IHRvIG1ha2UgdGhlIHVucGlja2xpbmcgZW52aXJvbm1lbnQKLXNsaWdodGx5IHNhZmVyIGZyb20gdW50cnVzdGVkIHBpY2tsZSBkYXRhIHN0cmVhbXM7IHNlZSBzZWN0aW9uflxyZWZ7cGlja2xlLXN1Yn0KLWZvciBtb3JlIGRldGFpbHMuCi0KLVxzdWJzdWJzZWN0aW9ue1BpY2tsaW5nIGFuZCB1bnBpY2tsaW5nIG5vcm1hbCBjbGFzcwotICAgIGluc3RhbmNlc1xsYWJlbHtwaWNrbGUtaW5zdH19Ci0KLVdoZW4gYSBwaWNrbGVkIGNsYXNzIGluc3RhbmNlIGlzIHVucGlja2xlZCwgaXRzIFxtZXRob2R7X19pbml0X18oKX0KLW1ldGhvZCBpcyBub3JtYWxseSBcZW1waHtub3R9IGludm9rZWQuICBJZiBpdCBpcyBkZXNpcmFibGUgdGhhdCB0aGUKLVxtZXRob2R7X19pbml0X18oKX0gbWV0aG9kIGJlIGNhbGxlZCBvbiB1bnBpY2tsaW5nLCBhbiBvbGQtc3R5bGUgY2xhc3MKLWNhbiBkZWZpbmUgYSBtZXRob2QgXG1ldGhvZHtfX2dldGluaXRhcmdzX18oKX0sIHdoaWNoIHNob3VsZCByZXR1cm4gYQotXGVtcGh7dHVwbGV9IGNvbnRhaW5pbmcgdGhlIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIGNsYXNzCi1jb25zdHJ1Y3RvciAoXG1ldGhvZHtfX2luaXRfXygpfSBmb3IgZXhhbXBsZSkuICBUaGUKLVxtZXRob2R7X19nZXRpbml0YXJnc19fKCl9IG1ldGhvZCBpcyBjYWxsZWQgYXQKLXBpY2tsZSB0aW1lOyB0aGUgdHVwbGUgaXQgcmV0dXJucyBpcyBpbmNvcnBvcmF0ZWQgaW4gdGhlIHBpY2tsZSBmb3IKLXRoZSBpbnN0YW5jZS4KLVx3aXRoc3ViaXRlbXsoY29weSBwcm90b2NvbCl9e1x0dGluZGV4e19fZ2V0aW5pdGFyZ3NfXygpfX0KLVx3aXRoc3ViaXRlbXsoaW5zdGFuY2UgY29uc3RydWN0b3IpfXtcdHRpbmRleHtfX2luaXRfXygpfX0KLQotXHdpdGhzdWJpdGVteyhjb3B5IHByb3RvY29sKX17XHR0aW5kZXh7X19nZXRuZXdhcmdzX18oKX19Ci0KLU5ldy1zdHlsZSB0eXBlcyBjYW4gcHJvdmlkZSBhIFxtZXRob2R7X19nZXRuZXdhcmdzX18oKX0gbWV0aG9kIHRoYXQgaXMKLXVzZWQgZm9yIHByb3RvY29sIDIuICBJbXBsZW1lbnRpbmcgdGhpcyBtZXRob2QgaXMgbmVlZGVkIGlmIHRoZSB0eXBlCi1lc3RhYmxpc2hlcyBzb21lIGludGVybmFsIGludmFyaWFudHMgd2hlbiB0aGUgaW5zdGFuY2UgaXMgY3JlYXRlZCwgb3IKLWlmIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBpcyBhZmZlY3RlZCBieSB0aGUgdmFsdWVzIHBhc3NlZCB0byB0aGUKLVxtZXRob2R7X19uZXdfXygpfSBtZXRob2QgZm9yIHRoZSB0eXBlIChhcyBpdCBpcyBmb3IgdHVwbGVzIGFuZAotc3RyaW5ncykuICBJbnN0YW5jZXMgb2YgYSBuZXctc3R5bGUgdHlwZSBcY2xhc3N7Q30gYXJlIGNyZWF0ZWQgdXNpbmcKLQotXGJlZ2lue2FsbHR0fQotb2JqID0gQy5fX25ld19fKEMsICpcdmFye2FyZ3N9KQotXGVuZHthbGx0dH0KLQotd2hlcmUgXHZhcnthcmdzfSBpcyB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgXG1ldGhvZHtfX2dldG5ld2FyZ3NfXygpfSBvbgotdGhlIG9yaWdpbmFsIG9iamVjdDsgaWYgdGhlcmUgaXMgbm8gXG1ldGhvZHtfX2dldG5ld2FyZ3NfXygpfSwgYW4KLWVtcHR5IHR1cGxlIGlzIGFzc3VtZWQuCi0KLVx3aXRoc3ViaXRlbXsoY29weSBwcm90b2NvbCl9ewotICBcdHRpbmRleHtfX2dldHN0YXRlX18oKX1cdHRpbmRleHtfX3NldHN0YXRlX18oKX19Ci1cd2l0aHN1Yml0ZW17KGluc3RhbmNlIGF0dHJpYnV0ZSl9ewotICBcdHRpbmRleHtfX2RpY3RfX319Ci0KLUNsYXNzZXMgY2FuIGZ1cnRoZXIgaW5mbHVlbmNlIGhvdyB0aGVpciBpbnN0YW5jZXMgYXJlIHBpY2tsZWQ7IGlmIHRoZQotY2xhc3MgZGVmaW5lcyB0aGUgbWV0aG9kIFxtZXRob2R7X19nZXRzdGF0ZV9fKCl9LCBpdCBpcyBjYWxsZWQgYW5kIHRoZQotcmV0dXJuIHN0YXRlIGlzIHBpY2tsZWQgYXMgdGhlIGNvbnRlbnRzIGZvciB0aGUgaW5zdGFuY2UsIGluc3RlYWQgb2YKLXRoZSBjb250ZW50cyBvZiB0aGUgaW5zdGFuY2UncyBkaWN0aW9uYXJ5LiAgSWYgdGhlcmUgaXMgbm8KLVxtZXRob2R7X19nZXRzdGF0ZV9fKCl9IG1ldGhvZCwgdGhlIGluc3RhbmNlJ3MgXG1lbWJlcntfX2RpY3RfX30gaXMKLXBpY2tsZWQuCi0KLVVwb24gdW5waWNrbGluZywgaWYgdGhlIGNsYXNzIGFsc28gZGVmaW5lcyB0aGUgbWV0aG9kCi1cbWV0aG9ke19fc2V0c3RhdGVfXygpfSwgaXQgaXMgY2FsbGVkIHdpdGggdGhlIHVucGlja2xlZAotc3RhdGUuXGZvb3Rub3Rle1RoZXNlIG1ldGhvZHMgY2FuIGFsc28gYmUgdXNlZCB0byBpbXBsZW1lbnQgY29weWluZwotY2xhc3MgaW5zdGFuY2VzLn0gIElmIHRoZXJlIGlzIG5vIFxtZXRob2R7X19zZXRzdGF0ZV9fKCl9IG1ldGhvZCwgdGhlCi1waWNrbGVkIHN0YXRlIG11c3QgYmUgYSBkaWN0aW9uYXJ5IGFuZCBpdHMgaXRlbXMgYXJlIGFzc2lnbmVkIHRvIHRoZQotbmV3IGluc3RhbmNlJ3MgZGljdGlvbmFyeS4gIElmIGEgY2xhc3MgZGVmaW5lcyBib3RoCi1cbWV0aG9ke19fZ2V0c3RhdGVfXygpfSBhbmQgXG1ldGhvZHtfX3NldHN0YXRlX18oKX0sIHRoZSBzdGF0ZSBvYmplY3QKLW5lZWRuJ3QgYmUgYSBkaWN0aW9uYXJ5IGFuZCB0aGVzZSBtZXRob2RzIGNhbiBkbyB3aGF0IHRoZXkKLXdhbnQuXGZvb3Rub3Rle1RoaXMgcHJvdG9jb2wgaXMgYWxzbyB1c2VkIGJ5IHRoZSBzaGFsbG93IGFuZCBkZWVwCi1jb3B5aW5nIG9wZXJhdGlvbnMgZGVmaW5lZCBpbiB0aGUKLVxyZWZtb2R1bGV7Y29weX0gbW9kdWxlLn0KLQotXGJlZ2lue25vdGljZX1bd2FybmluZ10KLSAgRm9yIG5ldy1zdHlsZSBjbGFzc2VzLCBpZiBcbWV0aG9ke19fZ2V0c3RhdGVfXygpfSByZXR1cm5zIGEgZmFsc2UKLSAgdmFsdWUsIHRoZSBcbWV0aG9ke19fc2V0c3RhdGVfXygpfSBtZXRob2Qgd2lsbCBub3QgYmUgY2FsbGVkLgotXGVuZHtub3RpY2V9Ci0KLQotXHN1YnN1YnNlY3Rpb257UGlja2xpbmcgYW5kIHVucGlja2xpbmcgZXh0ZW5zaW9uIHR5cGVzfQotCi1XaGVuIHRoZSBcY2xhc3N7UGlja2xlcn0gZW5jb3VudGVycyBhbiBvYmplY3Qgb2YgYSB0eXBlIGl0IGtub3dzCi1ub3RoaW5nIGFib3V0IC0tLSBzdWNoIGFzIGFuIGV4dGVuc2lvbiB0eXBlIC0tLSBpdCBsb29rcyBpbiB0d28gcGxhY2VzCi1mb3IgYSBoaW50IG9mIGhvdyB0byBwaWNrbGUgaXQuICBPbmUgYWx0ZXJuYXRpdmUgaXMgZm9yIHRoZSBvYmplY3QgdG8KLWltcGxlbWVudCBhIFxtZXRob2R7X19yZWR1Y2VfXygpfSBtZXRob2QuICBJZiBwcm92aWRlZCwgYXQgcGlja2xpbmcKLXRpbWUgXG1ldGhvZHtfX3JlZHVjZV9fKCl9IHdpbGwgYmUgY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzLCBhbmQgaXQKLW11c3QgcmV0dXJuIGVpdGhlciBhIHN0cmluZyBvciBhIHR1cGxlLgotCi1JZiBhIHN0cmluZyBpcyByZXR1cm5lZCwgaXQgbmFtZXMgYSBnbG9iYWwgdmFyaWFibGUgd2hvc2UgY29udGVudHMgYXJlCi1waWNrbGVkIGFzIG5vcm1hbC4gIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgXG1ldGhvZHtfX3JlZHVjZV9ffSBzaG91bGQKLWJlIHRoZSBvYmplY3QncyBsb2NhbCBuYW1lIHJlbGF0aXZlIHRvIGl0cyBtb2R1bGU7IHRoZSBwaWNrbGUgbW9kdWxlCi1zZWFyY2hlcyB0aGUgbW9kdWxlIG5hbWVzcGFjZSB0byBkZXRlcm1pbmUgdGhlIG9iamVjdCdzIG1vZHVsZS4KLQotV2hlbiBhIHR1cGxlIGlzIHJldHVybmVkLCBpdCBtdXN0IGJlIGJldHdlZW4gdHdvIGFuZCBmaXZlIGVsZW1lbnRzCi1sb25nLiBPcHRpb25hbCBlbGVtZW50cyBjYW4gZWl0aGVyIGJlIG9taXR0ZWQsIG9yIFxjb2Rle05vbmV9IGNhbiBiZSBwcm92aWRlZCAKLWFzIHRoZWlyIHZhbHVlLiAgVGhlIHNlbWFudGljcyBvZiBlYWNoIGVsZW1lbnQgYXJlOgotCi1cYmVnaW57aXRlbWl6ZX0KLQotXGl0ZW0gQSBjYWxsYWJsZSBvYmplY3QgdGhhdCB3aWxsIGJlIGNhbGxlZCB0byBjcmVhdGUgdGhlIGluaXRpYWwKLXZlcnNpb24gb2YgdGhlIG9iamVjdC4gIFRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIHR1cGxlIHdpbGwgcHJvdmlkZQotYXJndW1lbnRzIGZvciB0aGlzIGNhbGxhYmxlLCBhbmQgbGF0ZXIgZWxlbWVudHMgcHJvdmlkZSBhZGRpdGlvbmFsCi1zdGF0ZSBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgc3Vic2VxdWVudGx5IGJlIHVzZWQgdG8gZnVsbHkgcmVjb25zdHJ1Y3QKLXRoZSBwaWNrbGVkIGRhdGEuCi0KLUluIHRoZSB1bnBpY2tsaW5nIGVudmlyb25tZW50IHRoaXMgb2JqZWN0IG11c3QgYmUgZWl0aGVyIGEgY2xhc3MsIGEKLWNhbGxhYmxlIHJlZ2lzdGVyZWQgYXMgYSBgYHNhZmUgY29uc3RydWN0b3InJyAoc2VlIGJlbG93KSwgb3IgaXQgbXVzdAotaGF2ZSBhbiBhdHRyaWJ1dGUgXG1lbWJlcntfX3NhZmVfZm9yX3VucGlja2xpbmdfX30gd2l0aCBhIHRydWUgdmFsdWUuCi1PdGhlcndpc2UsIGFuIFxleGNlcHRpb257VW5waWNrbGluZ0Vycm9yfSB3aWxsIGJlIHJhaXNlZCBpbiB0aGUKLXVucGlja2xpbmcgZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgYXMgdXN1YWwsIHRoZSBjYWxsYWJsZSBpdHNlbGYgaXMKLXBpY2tsZWQgYnkgbmFtZS4KLQotXGl0ZW0gQSB0dXBsZSBvZiBhcmd1bWVudHMgZm9yIHRoZSBjYWxsYWJsZSBvYmplY3QuCi1cdmVyc2lvbmNoYW5nZWRbRm9ybWVybHksIHRoaXMgYXJndW1lbnQgY291bGQgYWxzbyBiZSBcY29kZXtOb25lfV17Mi41fQotCi1caXRlbSBPcHRpb25hbGx5LCB0aGUgb2JqZWN0J3Mgc3RhdGUsIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvCi0gICAgICB0aGUgb2JqZWN0J3MgXG1ldGhvZHtfX3NldHN0YXRlX18oKX0gbWV0aG9kIGFzIGRlc2NyaWJlZCBpbgotICAgICAgc2VjdGlvbn5ccmVme3BpY2tsZS1pbnN0fS4gIElmIHRoZSBvYmplY3QgaGFzIG5vCi0gICAgICBcbWV0aG9ke19fc2V0c3RhdGVfXygpfSBtZXRob2QsIHRoZW4sIGFzIGFib3ZlLCB0aGUgdmFsdWUgbXVzdAotICAgICAgYmUgYSBkaWN0aW9uYXJ5IGFuZCBpdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBvYmplY3QncwotICAgICAgXG1lbWJlcntfX2RpY3RfX30uCi0KLVxpdGVtIE9wdGlvbmFsbHksIGFuIGl0ZXJhdG9yIChhbmQgbm90IGEgc2VxdWVuY2UpIHlpZWxkaW5nIHN1Y2Nlc3NpdmUKLWxpc3QgaXRlbXMuICBUaGVzZSBsaXN0IGl0ZW1zIHdpbGwgYmUgcGlja2xlZCwgYW5kIGFwcGVuZGVkIHRvIHRoZQotb2JqZWN0IHVzaW5nIGVpdGhlciBcY29kZXtvYmouYXBwZW5kKFx2YXJ7aXRlbX0pfSBvcgotXGNvZGV7b2JqLmV4dGVuZChcdmFye2xpc3Rfb2ZfaXRlbXN9KX0uICBUaGlzIGlzIHByaW1hcmlseSB1c2VkIGZvcgotbGlzdCBzdWJjbGFzc2VzLCBidXQgbWF5IGJlIHVzZWQgYnkgb3RoZXIgY2xhc3NlcyBhcyBsb25nIGFzIHRoZXkgaGF2ZQotXG1ldGhvZHthcHBlbmQoKX0gYW5kIFxtZXRob2R7ZXh0ZW5kKCl9IG1ldGhvZHMgd2l0aCB0aGUgYXBwcm9wcmlhdGUKLXNpZ25hdHVyZS4gIChXaGV0aGVyIFxtZXRob2R7YXBwZW5kKCl9IG9yIFxtZXRob2R7ZXh0ZW5kKCl9IGlzIHVzZWQKLWRlcGVuZHMgb24gd2hpY2ggcGlja2xlIHByb3RvY29sIHZlcnNpb24gaXMgdXNlZCBhcyB3ZWxsIGFzIHRoZSBudW1iZXIKLW9mIGl0ZW1zIHRvIGFwcGVuZCwgc28gYm90aCBtdXN0IGJlIHN1cHBvcnRlZC4pCi0KLVxpdGVtIE9wdGlvbmFsbHksIGFuIGl0ZXJhdG9yIChub3QgYSBzZXF1ZW5jZSkKLXlpZWxkaW5nIHN1Y2Nlc3NpdmUgZGljdGlvbmFyeSBpdGVtcywgd2hpY2ggc2hvdWxkIGJlIHR1cGxlcyBvZiB0aGUKLWZvcm0gXGNvZGV7KFx2YXJ7a2V5fSwgXHZhcnt2YWx1ZX0pfS4gIFRoZXNlIGl0ZW1zIHdpbGwgYmUgcGlja2xlZAotYW5kIHN0b3JlZCB0byB0aGUgb2JqZWN0IHVzaW5nIFxjb2Rle29ialtcdmFye2tleX1dID0gXHZhcnt2YWx1ZX19LgotVGhpcyBpcyBwcmltYXJpbHkgdXNlZCBmb3IgZGljdGlvbmFyeSBzdWJjbGFzc2VzLCBidXQgbWF5IGJlIHVzZWQgYnkKLW90aGVyIGNsYXNzZXMgYXMgbG9uZyBhcyB0aGV5IGltcGxlbWVudCBcbWV0aG9ke19fc2V0aXRlbV9ffS4KLQotXGVuZHtpdGVtaXplfQotCi1JdCBpcyBzb21ldGltZXMgdXNlZnVsIHRvIGtub3cgdGhlIHByb3RvY29sIHZlcnNpb24gd2hlbiBpbXBsZW1lbnRpbmcKLVxtZXRob2R7X19yZWR1Y2VfX30uICBUaGlzIGNhbiBiZSBkb25lIGJ5IGltcGxlbWVudGluZyBhIG1ldGhvZCBuYW1lZAotXG1ldGhvZHtfX3JlZHVjZV9leF9ffSBpbnN0ZWFkIG9mIFxtZXRob2R7X19yZWR1Y2VfX30uCi1cbWV0aG9ke19fcmVkdWNlX2V4X199LCB3aGVuIGl0IGV4aXN0cywgaXMgY2FsbGVkIGluIHByZWZlcmVuY2Ugb3ZlcgotXG1ldGhvZHtfX3JlZHVjZV9ffSAoeW91IG1heSBzdGlsbCBwcm92aWRlIFxtZXRob2R7X19yZWR1Y2VfX30gZm9yCi1iYWNrd2FyZHMgY29tcGF0aWJpbGl0eSkuICBUaGUgXG1ldGhvZHtfX3JlZHVjZV9leF9ffSBtZXRob2Qgd2lsbCBiZQotY2FsbGVkIHdpdGggYSBzaW5nbGUgaW50ZWdlciBhcmd1bWVudCwgdGhlIHByb3RvY29sIHZlcnNpb24uCi0KLVRoZSBcY2xhc3N7b2JqZWN0fSBjbGFzcyBpbXBsZW1lbnRzIGJvdGggXG1ldGhvZHtfX3JlZHVjZV9ffSBhbmQKLVxtZXRob2R7X19yZWR1Y2VfZXhfX307IGhvd2V2ZXIsIGlmIGEgc3ViY2xhc3Mgb3ZlcnJpZGVzCi1cbWV0aG9ke19fcmVkdWNlX199IGJ1dCBub3QgXG1ldGhvZHtfX3JlZHVjZV9leF9ffSwgdGhlCi1cbWV0aG9ke19fcmVkdWNlX2V4X199IGltcGxlbWVudGF0aW9uIGRldGVjdHMgdGhpcyBhbmQgY2FsbHMKLVxtZXRob2R7X19yZWR1Y2VfX30uCi0KLUFuIGFsdGVybmF0aXZlIHRvIGltcGxlbWVudGluZyBhIFxtZXRob2R7X19yZWR1Y2VfXygpfSBtZXRob2Qgb24gdGhlCi1vYmplY3QgdG8gYmUgcGlja2xlZCwgaXMgdG8gcmVnaXN0ZXIgdGhlIGNhbGxhYmxlIHdpdGggdGhlCi1ccmVmbW9kdWxlW2NvcHlyZWdde2NvcHlfcmVnfSBtb2R1bGUuICBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIHdheQotZm9yIHByb2dyYW1zIHRvIHJlZ2lzdGVyIGBgcmVkdWN0aW9uIGZ1bmN0aW9ucycnIGFuZCBjb25zdHJ1Y3RvcnMgZm9yCi11c2VyLWRlZmluZWQgdHlwZXMuICAgUmVkdWN0aW9uIGZ1bmN0aW9ucyBoYXZlIHRoZSBzYW1lIHNlbWFudGljcyBhbmQKLWludGVyZmFjZSBhcyB0aGUgXG1ldGhvZHtfX3JlZHVjZV9fKCl9IG1ldGhvZCBkZXNjcmliZWQgYWJvdmUsIGV4Y2VwdAotdGhhdCB0aGV5IGFyZSBjYWxsZWQgd2l0aCBhIHNpbmdsZSBhcmd1bWVudCwgdGhlIG9iamVjdCB0byBiZSBwaWNrbGVkLgotCi1UaGUgcmVnaXN0ZXJlZCBjb25zdHJ1Y3RvciBpcyBkZWVtZWQgYSBgYHNhZmUgY29uc3RydWN0b3InJyBmb3IgcHVycG9zZXMKLW9mIHVucGlja2xpbmcgYXMgZGVzY3JpYmVkIGFib3ZlLgotCi0KLVxzdWJzdWJzZWN0aW9ue1BpY2tsaW5nIGFuZCB1bnBpY2tsaW5nIGV4dGVybmFsIG9iamVjdHN9Ci0KLUZvciB0aGUgYmVuZWZpdCBvZiBvYmplY3QgcGVyc2lzdGVuY2UsIHRoZSBcbW9kdWxle3BpY2tsZX0gbW9kdWxlCi1zdXBwb3J0cyB0aGUgbm90aW9uIG9mIGEgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCBvdXRzaWRlIHRoZSBwaWNrbGVkCi1kYXRhIHN0cmVhbS4gIFN1Y2ggb2JqZWN0cyBhcmUgcmVmZXJlbmNlZCBieSBhIGBgcGVyc2lzdGVudCBpZCcnLAotd2hpY2ggaXMganVzdCBhbiBhcmJpdHJhcnkgc3RyaW5nIG9mIHByaW50YWJsZSBcQVNDSUl7fSBjaGFyYWN0ZXJzLgotVGhlIHJlc29sdXRpb24gb2Ygc3VjaCBuYW1lcyBpcyBub3QgZGVmaW5lZCBieSB0aGUgXG1vZHVsZXtwaWNrbGV9Ci1tb2R1bGU7IGl0IHdpbGwgZGVsZWdhdGUgdGhpcyByZXNvbHV0aW9uIHRvIHVzZXIgZGVmaW5lZCBmdW5jdGlvbnMgb24KLXRoZSBwaWNrbGVyIGFuZCB1bnBpY2tsZXIuXGZvb3Rub3Rle1RoZSBhY3R1YWwgbWVjaGFuaXNtIGZvcgotYXNzb2NpYXRpbmcgdGhlc2UgdXNlciBkZWZpbmVkIGZ1bmN0aW9ucyBpcyBzbGlnaHRseSBkaWZmZXJlbnQgZm9yCi1cbW9kdWxle3BpY2tsZX0gYW5kIFxtb2R1bGV7Y1BpY2tsZX0uICBUaGUgZGVzY3JpcHRpb24gZ2l2ZW4gaGVyZQotd29ya3MgdGhlIHNhbWUgZm9yIGJvdGggaW1wbGVtZW50YXRpb25zLiAgVXNlcnMgb2YgdGhlIFxtb2R1bGV7cGlja2xlfQotbW9kdWxlIGNvdWxkIGFsc28gdXNlIHN1YmNsYXNzaW5nIHRvIGVmZmVjdCB0aGUgc2FtZSByZXN1bHRzLAotb3ZlcnJpZGluZyB0aGUgXG1ldGhvZHtwZXJzaXN0ZW50X2lkKCl9IGFuZCBcbWV0aG9ke3BlcnNpc3RlbnRfbG9hZCgpfQotbWV0aG9kcyBpbiB0aGUgZGVyaXZlZCBjbGFzc2VzLn0KLQotVG8gZGVmaW5lIGV4dGVybmFsIHBlcnNpc3RlbnQgaWQgcmVzb2x1dGlvbiwgeW91IG5lZWQgdG8gc2V0IHRoZQotXG1lbWJlcntwZXJzaXN0ZW50X2lkfSBhdHRyaWJ1dGUgb2YgdGhlIHBpY2tsZXIgb2JqZWN0IGFuZCB0aGUKLVxtZW1iZXJ7cGVyc2lzdGVudF9sb2FkfSBhdHRyaWJ1dGUgb2YgdGhlIHVucGlja2xlciBvYmplY3QuCi0KLVRvIHBpY2tsZSBvYmplY3RzIHRoYXQgaGF2ZSBhbiBleHRlcm5hbCBwZXJzaXN0ZW50IGlkLCB0aGUgcGlja2xlcgotbXVzdCBoYXZlIGEgY3VzdG9tIFxmdW5jdGlvbntwZXJzaXN0ZW50X2lkKCl9IG1ldGhvZCB0aGF0IHRha2VzIGFuCi1vYmplY3QgYXMgYW4gYXJndW1lbnQgYW5kIHJldHVybnMgZWl0aGVyIFxjb2Rle05vbmV9IG9yIHRoZSBwZXJzaXN0ZW50Ci1pZCBmb3IgdGhhdCBvYmplY3QuICBXaGVuIFxjb2Rle05vbmV9IGlzIHJldHVybmVkLCB0aGUgcGlja2xlciBzaW1wbHkKLXBpY2tsZXMgdGhlIG9iamVjdCBhcyBub3JtYWwuICBXaGVuIGEgcGVyc2lzdGVudCBpZCBzdHJpbmcgaXMKLXJldHVybmVkLCB0aGUgcGlja2xlciB3aWxsIHBpY2tsZSB0aGF0IHN0cmluZywgYWxvbmcgd2l0aCBhIG1hcmtlcgotc28gdGhhdCB0aGUgdW5waWNrbGVyIHdpbGwgcmVjb2duaXplIHRoZSBzdHJpbmcgYXMgYSBwZXJzaXN0ZW50IGlkLgotCi1UbyB1bnBpY2tsZSBleHRlcm5hbCBvYmplY3RzLCB0aGUgdW5waWNrbGVyIG11c3QgaGF2ZSBhIGN1c3RvbQotXGZ1bmN0aW9ue3BlcnNpc3RlbnRfbG9hZCgpfSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgcGVyc2lzdGVudCBpZAotc3RyaW5nIGFuZCByZXR1cm5zIHRoZSByZWZlcmVuY2VkIG9iamVjdC4KLQotSGVyZSdzIGEgc2lsbHkgZXhhbXBsZSB0aGF0IFxlbXBoe21pZ2h0fSBzaGVkIG1vcmUgbGlnaHQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCBwaWNrbGUKLWZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwotCi1zcmMgPSBTdHJpbmdJTygpCi1wID0gcGlja2xlLlBpY2tsZXIoc3JjKQotCi1kZWYgcGVyc2lzdGVudF9pZChvYmopOgotICAgIGlmIGhhc2F0dHIob2JqLCAneCcpOgotICAgICAgICByZXR1cm4gJ3RoZSB2YWx1ZSAlZCcgJSBvYmoueAotICAgIGVsc2U6Ci0gICAgICAgIHJldHVybiBOb25lCi0KLXAucGVyc2lzdGVudF9pZCA9IHBlcnNpc3RlbnRfaWQKLQotY2xhc3MgSW50ZWdlcjoKLSAgICBkZWYgX19pbml0X18oc2VsZiwgeCk6Ci0gICAgICAgIHNlbGYueCA9IHgKLSAgICBkZWYgX19zdHJfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuICdNeSBuYW1lIGlzIGludGVnZXIgJWQnICUgc2VsZi54Ci0KLWkgPSBJbnRlZ2VyKDcpCi1wcmludCBpCi1wLmR1bXAoaSkKLQotZGF0YXN0cmVhbSA9IHNyYy5nZXR2YWx1ZSgpCi1wcmludCByZXByKGRhdGFzdHJlYW0pCi1kc3QgPSBTdHJpbmdJTyhkYXRhc3RyZWFtKQotCi11cCA9IHBpY2tsZS5VbnBpY2tsZXIoZHN0KQotCi1jbGFzcyBGYW5jeUludGVnZXIoSW50ZWdlcik6Ci0gICAgZGVmIF9fc3RyX18oc2VsZik6Ci0gICAgICAgIHJldHVybiAnSSBhbSB0aGUgaW50ZWdlciAlZCcgJSBzZWxmLngKLQotZGVmIHBlcnNpc3RlbnRfbG9hZChwZXJzaWQpOgotICAgIGlmIHBlcnNpZC5zdGFydHN3aXRoKCd0aGUgdmFsdWUgJyk6Ci0gICAgICAgIHZhbHVlID0gaW50KHBlcnNpZC5zcGxpdCgpWzJdKQotICAgICAgICByZXR1cm4gRmFuY3lJbnRlZ2VyKHZhbHVlKQotICAgIGVsc2U6Ci0gICAgICAgIHJhaXNlIHBpY2tsZS5VbnBpY2tsaW5nRXJyb3IsICdJbnZhbGlkIHBlcnNpc3RlbnQgaWQnCi0KLXVwLnBlcnNpc3RlbnRfbG9hZCA9IHBlcnNpc3RlbnRfbG9hZAotCi1qID0gdXAubG9hZCgpCi1wcmludCBqCi1cZW5ke3ZlcmJhdGltfQotCi1JbiB0aGUgXG1vZHVsZXtjUGlja2xlfSBtb2R1bGUsIHRoZSB1bnBpY2tsZXIncwotXG1lbWJlcntwZXJzaXN0ZW50X2xvYWR9IGF0dHJpYnV0ZSBjYW4gYWxzbyBiZSBzZXQgdG8gYSBQeXRob24KLWxpc3QsIGluIHdoaWNoIGNhc2UsIHdoZW4gdGhlIHVucGlja2xlciByZWFjaGVzIGEgcGVyc2lzdGVudCBpZCwgdGhlCi1wZXJzaXN0ZW50IGlkIHN0cmluZyB3aWxsIHNpbXBseSBiZSBhcHBlbmRlZCB0byB0aGlzIGxpc3QuICBUaGlzCi1mdW5jdGlvbmFsaXR5IGV4aXN0cyBzbyB0aGF0IGEgcGlja2xlIGRhdGEgc3RyZWFtIGNhbiBiZSBgYHNuaWZmZWQnJwotZm9yIG9iamVjdCByZWZlcmVuY2VzIHdpdGhvdXQgYWN0dWFsbHkgaW5zdGFudGlhdGluZyBhbGwgdGhlIG9iamVjdHMKLWluIGEgcGlja2xlLlxmb290bm90ZXtXZSdsbCBsZWF2ZSB5b3Ugd2l0aCB0aGUgaW1hZ2Ugb2YgR3VpZG8gYW5kIEppbQotc2l0dGluZyBhcm91bmQgc25pZmZpbmcgcGlja2xlcyBpbiB0aGVpciBsaXZpbmcgcm9vbXMufSAgU2V0dGluZwotXG1lbWJlcntwZXJzaXN0ZW50X2xvYWR9IHRvIGEgbGlzdCBpcyB1c3VhbGx5IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aAotdGhlIFxtZXRob2R7bm9sb2FkKCl9IG1ldGhvZCBvbiB0aGUgVW5waWNrbGVyLgotCi0lIEJBVzogQm90aCBwaWNrbGUgYW5kIGNQaWNrbGUgc3VwcG9ydCBzb21ldGhpbmcgY2FsbGVkCi0lIGluc3RfcGVyc2lzdGVudF9pZCgpIHdoaWNoIGFwcGVhcnMgdG8gZ2l2ZSB1bmtub3duIHR5cGVzIGEgc2Vjb25kCi0lIHNob3QgYXQgcHJvZHVjaW5nIGEgcGVyc2lzdGVudCBpZC4gIFNpbmNlIEppbSBGdWx0b24gY2FuJ3QgcmVtZW1iZXIKLSUgd2h5IGl0IHdhcyBhZGRlZCBvciB3aGF0IGl0J3MgZm9yLCBJJ20gbGVhdmluZyBpdCB1bmRvY3VtZW50ZWQuCi0KLVxzdWJzZWN0aW9ue1N1YmNsYXNzaW5nIFVucGlja2xlcnMgXGxhYmVse3BpY2tsZS1zdWJ9fQotCi1CeSBkZWZhdWx0LCB1bnBpY2tsaW5nIHdpbGwgaW1wb3J0IGFueSBjbGFzcyB0aGF0IGl0IGZpbmRzIGluIHRoZQotcGlja2xlIGRhdGEuICBZb3UgY2FuIGNvbnRyb2wgZXhhY3RseSB3aGF0IGdldHMgdW5waWNrbGVkIGFuZCB3aGF0Ci1nZXRzIGNhbGxlZCBieSBjdXN0b21pemluZyB5b3VyIHVucGlja2xlci4gIFVuZm9ydHVuYXRlbHksIGV4YWN0bHkgaG93Ci15b3UgZG8gdGhpcyBpcyBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIHdoZXRoZXIgeW91J3JlIHVzaW5nCi1cbW9kdWxle3BpY2tsZX0gb3IgXG1vZHVsZXtjUGlja2xlfS5cZm9vdG5vdGV7QSB3b3JkIG9mIGNhdXRpb246IHRoZQotbWVjaGFuaXNtcyBkZXNjcmliZWQgaGVyZSB1c2UgaW50ZXJuYWwgYXR0cmlidXRlcyBhbmQgbWV0aG9kcywgd2hpY2gKLWFyZSBzdWJqZWN0IHRvIGNoYW5nZSBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgUHl0aG9uLiAgV2UgaW50ZW5kIHRvCi1zb21lZGF5IHByb3ZpZGUgYSBjb21tb24gaW50ZXJmYWNlIGZvciBjb250cm9sbGluZyB0aGlzIGJlaGF2aW9yLAotd2hpY2ggd2lsbCB3b3JrIGluIGVpdGhlciBcbW9kdWxle3BpY2tsZX0gb3IgXG1vZHVsZXtjUGlja2xlfS59Ci0KLUluIHRoZSBcbW9kdWxle3BpY2tsZX0gbW9kdWxlLCB5b3UgbmVlZCB0byBkZXJpdmUgYSBzdWJjbGFzcyBmcm9tCi1cY2xhc3N7VW5waWNrbGVyfSwgb3ZlcnJpZGluZyB0aGUgXG1ldGhvZHtsb2FkX2dsb2JhbCgpfQotbWV0aG9kLiAgXG1ldGhvZHtsb2FkX2dsb2JhbCgpfSBzaG91bGQgcmVhZCB0d28gbGluZXMgZnJvbSB0aGUgcGlja2xlCi1kYXRhIHN0cmVhbSB3aGVyZSB0aGUgZmlyc3QgbGluZSB3aWxsIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKLWNvbnRhaW5pbmcgdGhlIGNsYXNzIGFuZCB0aGUgc2Vjb25kIGxpbmUgd2lsbCBiZSB0aGUgbmFtZSBvZiB0aGUKLWluc3RhbmNlJ3MgY2xhc3MuICBJdCB0aGVuIGxvb2tzIHVwIHRoZSBjbGFzcywgcG9zc2libHkgaW1wb3J0aW5nIHRoZQotbW9kdWxlIGFuZCBkaWdnaW5nIG91dCB0aGUgYXR0cmlidXRlLCB0aGVuIGl0IGFwcGVuZHMgd2hhdCBpdCBmaW5kcyB0bwotdGhlIHVucGlja2xlcidzIHN0YWNrLiAgTGF0ZXIgb24sIHRoaXMgY2xhc3Mgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUKLVxtZW1iZXJ7X19jbGFzc19ffSBhdHRyaWJ1dGUgb2YgYW4gZW1wdHkgY2xhc3MsIGFzIGEgd2F5IG9mIG1hZ2ljYWxseQotY3JlYXRpbmcgYW4gaW5zdGFuY2Ugd2l0aG91dCBjYWxsaW5nIGl0cyBjbGFzcydzIFxtZXRob2R7X19pbml0X18oKX0uCi1Zb3VyIGpvYiAoc2hvdWxkIHlvdSBjaG9vc2UgdG8gYWNjZXB0IGl0KSwgd291bGQgYmUgdG8gaGF2ZQotXG1ldGhvZHtsb2FkX2dsb2JhbCgpfSBwdXNoIG9udG8gdGhlIHVucGlja2xlcidzIHN0YWNrLCBhIGtub3duIHNhZmUKLXZlcnNpb24gb2YgYW55IGNsYXNzIHlvdSBkZWVtIHNhZmUgdG8gdW5waWNrbGUuICBJdCBpcyB1cCB0byB5b3UgdG8KLXByb2R1Y2Ugc3VjaCBhIGNsYXNzLiAgT3IgeW91IGNvdWxkIHJhaXNlIGFuIGVycm9yIGlmIHlvdSB3YW50IHRvCi1kaXNhbGxvdyBhbGwgdW5waWNrbGluZyBvZiBpbnN0YW5jZXMuICBJZiB0aGlzIHNvdW5kcyBsaWtlIGEgaGFjaywKLXlvdSdyZSByaWdodC4gIFJlZmVyIHRvIHRoZSBzb3VyY2UgY29kZSB0byBtYWtlIHRoaXMgd29yay4KLQotVGhpbmdzIGFyZSBhIGxpdHRsZSBjbGVhbmVyIHdpdGggXG1vZHVsZXtjUGlja2xlfSwgYnV0IG5vdCBieSBtdWNoLgotVG8gY29udHJvbCB3aGF0IGdldHMgdW5waWNrbGVkLCB5b3UgY2FuIHNldCB0aGUgdW5waWNrbGVyJ3MKLVxtZW1iZXJ7ZmluZF9nbG9iYWx9IGF0dHJpYnV0ZSB0byBhIGZ1bmN0aW9uIG9yIFxjb2Rle05vbmV9LiAgSWYgaXQgaXMKLVxjb2Rle05vbmV9IHRoZW4gYW55IGF0dGVtcHRzIHRvIHVucGlja2xlIGluc3RhbmNlcyB3aWxsIHJhaXNlIGFuCi1cZXhjZXB0aW9ue1VucGlja2xpbmdFcnJvcn0uICBJZiBpdCBpcyBhIGZ1bmN0aW9uLAotdGhlbiBpdCBzaG91bGQgYWNjZXB0IGEgbW9kdWxlIG5hbWUgYW5kIGEgY2xhc3MgbmFtZSwgYW5kIHJldHVybiB0aGUKLWNvcnJlc3BvbmRpbmcgY2xhc3Mgb2JqZWN0LiAgSXQgaXMgcmVzcG9uc2libGUgZm9yIGxvb2tpbmcgdXAgdGhlCi1jbGFzcyBhbmQgcGVyZm9ybWluZyBhbnkgbmVjZXNzYXJ5IGltcG9ydHMsIGFuZCBpdCBtYXkgcmFpc2UgYW4KLWVycm9yIHRvIHByZXZlbnQgaW5zdGFuY2VzIG9mIHRoZSBjbGFzcyBmcm9tIGJlaW5nIHVucGlja2xlZC4KLQotVGhlIG1vcmFsIG9mIHRoZSBzdG9yeSBpcyB0aGF0IHlvdSBzaG91bGQgYmUgcmVhbGx5IGNhcmVmdWwgYWJvdXQgdGhlCi1zb3VyY2Ugb2YgdGhlIHN0cmluZ3MgeW91ciBhcHBsaWNhdGlvbiB1bnBpY2tsZXMuCi0KLVxzdWJzZWN0aW9ue0V4YW1wbGUgXGxhYmVse3BpY2tsZS1leGFtcGxlfX0KLQotRm9yIHRoZSBzaW1wbGVzdCBjb2RlLCB1c2UgdGhlIFxmdW5jdGlvbntkdW1wKCl9IGFuZCBcZnVuY3Rpb257bG9hZCgpfQotZnVuY3Rpb25zLiAgTm90ZSB0aGF0IGEgc2VsZi1yZWZlcmVuY2luZyBsaXN0IGlzIHBpY2tsZWQgYW5kIHJlc3RvcmVkCi1jb3JyZWN0bHkuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCBwaWNrbGUKLQotZGF0YTEgPSB7J2EnOiBbMSwgMi4wLCAzLCA0KzZqXSwKLSAgICAgICAgICdiJzogKCdzdHJpbmcnLCB1J1VuaWNvZGUgc3RyaW5nJyksCi0gICAgICAgICAnYyc6IE5vbmV9Ci0KLXNlbGZyZWZfbGlzdCA9IFsxLCAyLCAzXQotc2VsZnJlZl9saXN0LmFwcGVuZChzZWxmcmVmX2xpc3QpCi0KLW91dHB1dCA9IG9wZW4oJ2RhdGEucGtsJywgJ3diJykKLQotIyBQaWNrbGUgZGljdGlvbmFyeSB1c2luZyBwcm90b2NvbCAwLgotcGlja2xlLmR1bXAoZGF0YTEsIG91dHB1dCkKLQotIyBQaWNrbGUgdGhlIGxpc3QgdXNpbmcgdGhlIGhpZ2hlc3QgcHJvdG9jb2wgYXZhaWxhYmxlLgotcGlja2xlLmR1bXAoc2VsZnJlZl9saXN0LCBvdXRwdXQsIC0xKQotCi1vdXRwdXQuY2xvc2UoKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGZvbGxvd2luZyBleGFtcGxlIHJlYWRzIHRoZSByZXN1bHRpbmcgcGlja2xlZCBkYXRhLiAgV2hlbiByZWFkaW5nCi1hIHBpY2tsZS1jb250YWluaW5nIGZpbGUsIHlvdSBzaG91bGQgb3BlbiB0aGUgZmlsZSBpbiBiaW5hcnkgbW9kZQotYmVjYXVzZSB5b3UgY2FuJ3QgYmUgc3VyZSBpZiB0aGUgQVNDSUkgb3IgYmluYXJ5IGZvcm1hdCB3YXMgdXNlZC4KLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IHBwcmludCwgcGlja2xlCi0KLXBrbF9maWxlID0gb3BlbignZGF0YS5wa2wnLCAncmInKQotCi1kYXRhMSA9IHBpY2tsZS5sb2FkKHBrbF9maWxlKQotcHByaW50LnBwcmludChkYXRhMSkKLQotZGF0YTIgPSBwaWNrbGUubG9hZChwa2xfZmlsZSkKLXBwcmludC5wcHJpbnQoZGF0YTIpCi0KLXBrbF9maWxlLmNsb3NlKCkKLVxlbmR7dmVyYmF0aW19Ci0KLUhlcmUncyBhIGxhcmdlciBleGFtcGxlIHRoYXQgc2hvd3MgaG93IHRvIG1vZGlmeSBwaWNrbGluZyBiZWhhdmlvciBmb3IgYQotY2xhc3MuICBUaGUgXGNsYXNze1RleHRSZWFkZXJ9IGNsYXNzIG9wZW5zIGEgdGV4dCBmaWxlLCBhbmQgcmV0dXJucwotdGhlIGxpbmUgbnVtYmVyIGFuZCBsaW5lIGNvbnRlbnRzIGVhY2ggdGltZSBpdHMgXG1ldGhvZHtyZWFkbGluZSgpfQotbWV0aG9kIGlzIGNhbGxlZC4gSWYgYSBcY2xhc3N7VGV4dFJlYWRlcn0gaW5zdGFuY2UgaXMgcGlja2xlZCwgYWxsCi1hdHRyaWJ1dGVzIFxlbXBoe2V4Y2VwdH0gdGhlIGZpbGUgb2JqZWN0IG1lbWJlciBhcmUgc2F2ZWQuIFdoZW4gdGhlCi1pbnN0YW5jZSBpcyB1bnBpY2tsZWQsIHRoZSBmaWxlIGlzIHJlb3BlbmVkLCBhbmQgcmVhZGluZyByZXN1bWVzIGZyb20KLXRoZSBsYXN0IGxvY2F0aW9uLiBUaGUgXG1ldGhvZHtfX3NldHN0YXRlX18oKX0gYW5kCi1cbWV0aG9ke19fZ2V0c3RhdGVfXygpfSBtZXRob2RzIGFyZSB1c2VkIHRvIGltcGxlbWVudCB0aGlzIGJlaGF2aW9yLgotCi1cYmVnaW57dmVyYmF0aW19Ci1jbGFzcyBUZXh0UmVhZGVyOgotICAgICIiIlByaW50IGFuZCBudW1iZXIgbGluZXMgaW4gYSB0ZXh0IGZpbGUuIiIiCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGUpOgotICAgICAgICBzZWxmLmZpbGUgPSBmaWxlCi0gICAgICAgIHNlbGYuZmggPSBvcGVuKGZpbGUpCi0gICAgICAgIHNlbGYubGluZW5vID0gMAotCi0gICAgZGVmIHJlYWRsaW5lKHNlbGYpOgotICAgICAgICBzZWxmLmxpbmVubyA9IHNlbGYubGluZW5vICsgMQotICAgICAgICBsaW5lID0gc2VsZi5maC5yZWFkbGluZSgpCi0gICAgICAgIGlmIG5vdCBsaW5lOgotICAgICAgICAgICAgcmV0dXJuIE5vbmUKLSAgICAgICAgaWYgbGluZS5lbmRzd2l0aCgiXG4iKToKLSAgICAgICAgICAgIGxpbmUgPSBsaW5lWzotMV0KLSAgICAgICAgcmV0dXJuICIlZDogJXMiICUgKHNlbGYubGluZW5vLCBsaW5lKQotCi0gICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKLSAgICAgICAgb2RpY3QgPSBzZWxmLl9fZGljdF9fLmNvcHkoKSAjIGNvcHkgdGhlIGRpY3Qgc2luY2Ugd2UgY2hhbmdlIGl0Ci0gICAgICAgIGRlbCBvZGljdFsnZmgnXSAgICAgICAgICAgICAgIyByZW1vdmUgZmlsZWhhbmRsZSBlbnRyeQotICAgICAgICByZXR1cm4gb2RpY3QKLQotICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgZGljdCk6Ci0gICAgICAgIGZoID0gb3BlbihkaWN0WydmaWxlJ10pICAgICAgIyByZW9wZW4gZmlsZQotICAgICAgICBjb3VudCA9IGRpY3RbJ2xpbmVubyddICAgICAgICMgcmVhZCBmcm9tIGZpbGUuLi4KLSAgICAgICAgd2hpbGUgY291bnQ6ICAgICAgICAgICAgICAgICAjIHVudGlsIGxpbmUgY291bnQgaXMgcmVzdG9yZWQKLSAgICAgICAgICAgIGZoLnJlYWRsaW5lKCkKLSAgICAgICAgICAgIGNvdW50ID0gY291bnQgLSAxCi0gICAgICAgIHNlbGYuX19kaWN0X18udXBkYXRlKGRpY3QpICAgIyB1cGRhdGUgYXR0cmlidXRlcwotICAgICAgICBzZWxmLmZoID0gZmggICAgICAgICAgICAgICAgICMgc2F2ZSB0aGUgZmlsZSBvYmplY3QKLVxlbmR7dmVyYmF0aW19Ci0KLUEgc2FtcGxlIHVzYWdlIG1pZ2h0IGJlIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgVGV4dFJlYWRlcgotPj4+IG9iaiA9IFRleHRSZWFkZXIuVGV4dFJlYWRlcigiVGV4dFJlYWRlci5weSIpCi0+Pj4gb2JqLnJlYWRsaW5lKCkKLScxOiAjIS91c3IvbG9jYWwvYmluL3B5dGhvbicKLT4+PiAjIChtb3JlIGludm9jYXRpb25zIG9mIG9iai5yZWFkbGluZSgpIGhlcmUpCi0uLi4gb2JqLnJlYWRsaW5lKCkKLSc3OiBjbGFzcyBUZXh0UmVhZGVyOicKLT4+PiBpbXBvcnQgcGlja2xlCi0+Pj4gcGlja2xlLmR1bXAob2JqLG9wZW4oJ3NhdmUucCcsICd3YicpKQotXGVuZHt2ZXJiYXRpbX0KLQotSWYgeW91IHdhbnQgdG8gc2VlIHRoYXQgXHJlZm1vZHVsZXtwaWNrbGV9IHdvcmtzIGFjcm9zcyBQeXRob24KLXByb2Nlc3Nlcywgc3RhcnQgYW5vdGhlciBQeXRob24gc2Vzc2lvbiwgYmVmb3JlIGNvbnRpbnVpbmcuICBXaGF0Ci1mb2xsb3dzIGNhbiBoYXBwZW4gZnJvbSBlaXRoZXIgdGhlIHNhbWUgcHJvY2VzcyBvciBhIG5ldyBwcm9jZXNzLgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gaW1wb3J0IHBpY2tsZQotPj4+IHJlYWRlciA9IHBpY2tsZS5sb2FkKG9wZW4oJ3NhdmUucCcsICdyYicpKQotPj4+IHJlYWRlci5yZWFkbGluZSgpCi0nODogICAgICJQcmludCBhbmQgbnVtYmVyIGxpbmVzIGluIGEgdGV4dCBmaWxlLiInCi1cZW5ke3ZlcmJhdGltfQotCi0KLVxiZWdpbntzZWVhbHNvfQotICBcc2VlbW9kdWxlW2NvcHlyZWdde2NvcHlfcmVnfXtQaWNrbGUgaW50ZXJmYWNlIGNvbnN0cnVjdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJhdGlvbiBmb3IgZXh0ZW5zaW9uIHR5cGVzLn0KLQotICBcc2VlbW9kdWxle3NoZWx2ZX17SW5kZXhlZCBkYXRhYmFzZXMgb2Ygb2JqZWN0czsgdXNlcyBcbW9kdWxle3BpY2tsZX0ufQotCi0gIFxzZWVtb2R1bGV7Y29weX17U2hhbGxvdyBhbmQgZGVlcCBvYmplY3QgY29weWluZy59Ci0KLSAgXHNlZW1vZHVsZXttYXJzaGFsfXtIaWdoLXBlcmZvcm1hbmNlIHNlcmlhbGl6YXRpb24gb2YgYnVpbHQtaW4gdHlwZXMufQotXGVuZHtzZWVhbHNvfQotCi0KLVxzZWN0aW9ue1xtb2R1bGV7Y1BpY2tsZX0gLS0tIEEgZmFzdGVyIFxtb2R1bGV7cGlja2xlfX0KLQotXGRlY2xhcmVtb2R1bGV7YnVpbHRpbn17Y1BpY2tsZX0KLVxtb2R1bGVzeW5vcHNpc3tGYXN0ZXIgdmVyc2lvbiBvZiBccmVmbW9kdWxle3BpY2tsZX0sIGJ1dCBub3Qgc3ViY2xhc3NhYmxlLn0KLVxtb2R1bGVhdXRob3J7SmltIEZ1bHRvbn17amltQHpvcGUuY29tfQotXHNlY3Rpb25hdXRob3J7RnJlZCBMLiBEcmFrZSwgSnIufXtmZHJha2VAYWNtLm9yZ30KLQotVGhlIFxtb2R1bGV7Y1BpY2tsZX0gbW9kdWxlIHN1cHBvcnRzIHNlcmlhbGl6YXRpb24gYW5kCi1kZS1zZXJpYWxpemF0aW9uIG9mIFB5dGhvbiBvYmplY3RzLCBwcm92aWRpbmcgYW4gaW50ZXJmYWNlIGFuZAotZnVuY3Rpb25hbGl0eSBuZWFybHkgaWRlbnRpY2FsIHRvIHRoZQotXHJlZm1vZHVsZXtwaWNrbGV9XHJlZnN0bW9kaW5kZXh7cGlja2xlfSBtb2R1bGUuICBUaGVyZSBhcmUgc2V2ZXJhbAotZGlmZmVyZW5jZXMsIHRoZSBtb3N0IGltcG9ydGFudCBiZWluZyBwZXJmb3JtYW5jZSBhbmQgc3ViY2xhc3NhYmlsaXR5LgotCi1GaXJzdCwgXG1vZHVsZXtjUGlja2xlfSBjYW4gYmUgdXAgdG8gMTAwMCB0aW1lcyBmYXN0ZXIgdGhhbgotXG1vZHVsZXtwaWNrbGV9IGJlY2F1c2UgdGhlIGZvcm1lciBpcyBpbXBsZW1lbnRlZCBpbiBDLiAgU2Vjb25kLCBpbgotdGhlIFxtb2R1bGV7Y1BpY2tsZX0gbW9kdWxlIHRoZSBjYWxsYWJsZXMgXGZ1bmN0aW9ue1BpY2tsZXIoKX0gYW5kCi1cZnVuY3Rpb257VW5waWNrbGVyKCl9IGFyZSBmdW5jdGlvbnMsIG5vdCBjbGFzc2VzLiAgVGhpcyBtZWFucyB0aGF0Ci15b3UgY2Fubm90IHVzZSB0aGVtIHRvIGRlcml2ZSBjdXN0b20gcGlja2xpbmcgYW5kIHVucGlja2xpbmcKLXN1YmNsYXNzZXMuICBNb3N0IGFwcGxpY2F0aW9ucyBoYXZlIG5vIG5lZWQgZm9yIHRoaXMgZnVuY3Rpb25hbGl0eSBhbmQKLXNob3VsZCBiZW5lZml0IGZyb20gdGhlIGdyZWF0bHkgaW1wcm92ZWQgcGVyZm9ybWFuY2Ugb2YgdGhlCi1cbW9kdWxle2NQaWNrbGV9IG1vZHVsZS4KLQotVGhlIHBpY2tsZSBkYXRhIHN0cmVhbSBwcm9kdWNlZCBieSBcbW9kdWxle3BpY2tsZX0gYW5kCi1cbW9kdWxle2NQaWNrbGV9IGFyZSBpZGVudGljYWwsIHNvIGl0IGlzIHBvc3NpYmxlIHRvIHVzZQotXG1vZHVsZXtwaWNrbGV9IGFuZCBcbW9kdWxle2NQaWNrbGV9IGludGVyY2hhbmdlYWJseSB3aXRoIGV4aXN0aW5nCi1waWNrbGVzLlxmb290bm90ZXtTaW5jZSB0aGUgcGlja2xlIGRhdGEgZm9ybWF0IGlzIGFjdHVhbGx5IGEgdGlueQotc3RhY2stb3JpZW50ZWQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UsIGFuZCBzb21lIGZyZWVkb20gaXMgdGFrZW4gaW4gdGhlCi1lbmNvZGluZ3Mgb2YgY2VydGFpbiBvYmplY3RzLCBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSB0d28gbW9kdWxlcwotcHJvZHVjZSBkaWZmZXJlbnQgZGF0YSBzdHJlYW1zIGZvciB0aGUgc2FtZSBpbnB1dCBvYmplY3RzLiAgSG93ZXZlciBpdAotaXMgZ3VhcmFudGVlZCB0aGF0IHRoZXkgd2lsbCBhbHdheXMgYmUgYWJsZSB0byByZWFkIGVhY2ggb3RoZXIncwotZGF0YSBzdHJlYW1zLn0KLQotVGhlcmUgYXJlIGFkZGl0aW9uYWwgbWlub3IgZGlmZmVyZW5jZXMgaW4gQVBJIGJldHdlZW4gXG1vZHVsZXtjUGlja2xlfQotYW5kIFxtb2R1bGV7cGlja2xlfSwgaG93ZXZlciBmb3IgbW9zdCBhcHBsaWNhdGlvbnMsIHRoZXkgYXJlCi1pbnRlcmNoYW5nZWFibGUuICBNb3JlIGRvY3VtZW50YXRpb24gaXMgcHJvdmlkZWQgaW4gdGhlCi1cbW9kdWxle3BpY2tsZX0gbW9kdWxlIGRvY3VtZW50YXRpb24sIHdoaWNoCi1pbmNsdWRlcyBhIGxpc3Qgb2YgdGhlIGRvY3VtZW50ZWQgZGlmZmVyZW5jZXMuCi0KLQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJwaWNrbGV0b29scy50ZXggYi9Eb2MvbGliL2xpYnBpY2tsZXRvb2xzLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY2MzYyNi4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnBpY2tsZXRvb2xzLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7cGlja2xldG9vbHN9IC0tLSBUb29scyBmb3IgcGlja2xlIGRldmVsb3BlcnMufQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17cGlja2xldG9vbHN9Ci1cbW9kdWxlc3lub3BzaXN7Q29udGFpbnMgZXh0ZW5zaXZlIGNvbW1lbnRzIGFib3V0IHRoZSBwaWNrbGUgcHJvdG9jb2xzIGFuZCBwaWNrbGUtbWFjaGluZSBvcGNvZGVzLCBhcyB3ZWxsIGFzIHNvbWUgdXNlZnVsIGZ1bmN0aW9ucy59Ci0KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotCi1UaGlzIG1vZHVsZSBjb250YWlucyB2YXJpb3VzIGNvbnN0YW50cyByZWxhdGluZyB0byB0aGUgaW50aW1hdGUKLWRldGFpbHMgb2YgdGhlIFxyZWZtb2R1bGV7cGlja2xlfSBtb2R1bGUsIHNvbWUgbGVuZ3RoeSBjb21tZW50cyBhYm91dAotdGhlIGltcGxlbWVudGF0aW9uLCBhbmQgYSBmZXcgdXNlZnVsIGZ1bmN0aW9ucyBmb3IgYW5hbHl6aW5nIHBpY2tsZWQKLWRhdGEuICBUaGUgY29udGVudHMgb2YgdGhpcyBtb2R1bGUgYXJlIHVzZWZ1bCBmb3IgUHl0aG9uIGNvcmUKLWRldmVsb3BlcnMgd2hvIGFyZSB3b3JraW5nIG9uIHRoZSBcbW9kdWxle3BpY2tsZX0gYW5kIFxtb2R1bGV7Y1BpY2tsZX0KLWltcGxlbWVudGF0aW9uczsgb3JkaW5hcnkgdXNlcnMgb2YgdGhlIFxtb2R1bGV7cGlja2xlfSBtb2R1bGUgcHJvYmFibHkKLXdvbid0IGZpbmQgdGhlIFxtb2R1bGV7cGlja2xldG9vbHN9IG1vZHVsZSByZWxldmFudC4KLQotXGJlZ2lue2Z1bmNkZXNjfXtkaXN9e3BpY2tsZVxvcHRpb25hbHssIG91dD1Ob25lLCBtZW1vPU5vbmUsIGluZGVudGxldmVsPTR9fQotT3V0cHV0cyBhIHN5bWJvbGljIGRpc2Fzc2VtYmx5IG9mIHRoZSBwaWNrbGUgdG8gdGhlIGZpbGUtbGlrZSBvYmplY3QKLVx2YXJ7b3V0fSwgZGVmYXVsdGluZyB0byBcY29kZXtzeXMuc3Rkb3V0fS4gIFx2YXJ7cGlja2xlfSBjYW4gYmUgYQotc3RyaW5nIG9yIGEgZmlsZS1saWtlIG9iamVjdC4gIFx2YXJ7bWVtb30gY2FuIGJlIGEgUHl0aG9uIGRpY3Rpb25hcnkKLXRoYXQgd2lsbCBiZSB1c2VkIGFzIHRoZSBwaWNrbGUncyBtZW1vOyBpdCBjYW4gYmUgdXNlZCB0byBwZXJmb3JtCi1kaXNhc3NlbWJsaWVzIGFjcm9zcyBtdWx0aXBsZSBwaWNrbGVzIGNyZWF0ZWQgYnkgdGhlIHNhbWUgcGlja2xlci4KLVN1Y2Nlc3NpdmUgbGV2ZWxzLCBpbmRpY2F0ZWQgYnkgXGNvZGV7TUFSS30gb3Bjb2RlcyBpbiB0aGUgc3RyZWFtLCBhcmUKLWluZGVudGVkIGJ5IFx2YXJ7aW5kZW50bGV2ZWx9IHNwYWNlcy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2Vub3BzfXtwaWNrbGV9Ci1Qcm92aWRlcyBhbiBpdGVyYXRvciBvdmVyIGFsbCBvZiB0aGUgb3Bjb2RlcyBpbiBhIHBpY2tsZSwgcmV0dXJuaW5nIGEKLXNlcXVlbmNlIG9mIFxjb2RleyhcdmFye29wY29kZX0sIFx2YXJ7YXJnfSwgXHZhcntwb3N9KX0gdHJpcGxlcy4KLVx2YXJ7b3Bjb2RlfSBpcyBhbiBpbnN0YW5jZSBvZiBhbiBcY2xhc3N7T3Bjb2RlSW5mb30gY2xhc3M7IFx2YXJ7YXJnfSAKLWlzIHRoZSBkZWNvZGVkIHZhbHVlLCBhcyBhIFB5dGhvbiBvYmplY3QsIG9mIHRoZSBvcGNvZGUncyBhcmd1bWVudDsgCi1cdmFye3Bvc30gaXMgdGhlIHBvc2l0aW9uIGF0IHdoaWNoIHRoaXMgb3Bjb2RlIGlzIGxvY2F0ZWQuCi1cdmFye3BpY2tsZX0gY2FuIGJlIGEgc3RyaW5nIG9yIGEgZmlsZS1saWtlIG9iamVjdC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlicGlwZXMudGV4IGIvRG9jL2xpYi9saWJwaXBlcy50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMjVmYjUuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJwaXBlcy50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3BpcGVzfSAtLS0KLSAgICAgICAgIEludGVyZmFjZSB0byBzaGVsbCBwaXBlbGluZXN9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtwaXBlc30KLSAgXHBsYXRmb3Jte1VuaXh9Ci1cc2VjdGlvbmF1dGhvcntNb3NoZSBaYWRrYX17bW9zaGV6QHphZGthLnNpdGUuY28uaWx9Ci1cbW9kdWxlc3lub3BzaXN7QSBQeXRob24gaW50ZXJmYWNlIHRvIFxVTklYXCBzaGVsbCBwaXBlbGluZXMufQotCi0KLVRoZSBcbW9kdWxle3BpcGVzfSBtb2R1bGUgZGVmaW5lcyBhIGNsYXNzIHRvIGFic3RyYWN0IHRoZSBjb25jZXB0IG9mCi1hIFxlbXBoe3BpcGVsaW5lfSAtLS0gYSBzZXF1ZW5jZSBvZiBjb252ZXJ0ZXJzIGZyb20gb25lIGZpbGUgdG8gCi1hbm90aGVyLgotCi1CZWNhdXNlIHRoZSBtb2R1bGUgdXNlcyBccHJvZ3JhbXsvYmluL3NofSBjb21tYW5kIGxpbmVzLCBhIFxQT1NJWHt9IG9yCi1jb21wYXRpYmxlIHNoZWxsIGZvciBcZnVuY3Rpb257b3Muc3lzdGVtKCl9IGFuZCBcZnVuY3Rpb257b3MucG9wZW4oKX0KLWlzIHJlcXVpcmVkLgotCi1UaGUgXG1vZHVsZXtwaXBlc30gbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBjbGFzczoKLQotXGJlZ2lue2NsYXNzZGVzY317VGVtcGxhdGV9e30KLUFuIGFic3RyYWN0aW9uIG9mIGEgcGlwZWxpbmUuCi1cZW5ke2NsYXNzZGVzY30KLQotRXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGltcG9ydCBwaXBlcwotPj4+IHQ9cGlwZXMuVGVtcGxhdGUoKQotPj4+IHQuYXBwZW5kKCd0ciBhLXogQS1aJywgJy0tJykKLT4+PiBmPXQub3BlbignL3RtcC8xJywgJ3cnKQotPj4+IGYud3JpdGUoJ2hlbGxvIHdvcmxkJykKLT4+PiBmLmNsb3NlKCkKLT4+PiBvcGVuKCcvdG1wLzEnKS5yZWFkKCkKLSdIRUxMTyBXT1JMRCcKLVxlbmR7dmVyYmF0aW19Ci0KLQotXHN1YnNlY3Rpb257VGVtcGxhdGUgT2JqZWN0cyBcbGFiZWx7dGVtcGxhdGUtb2JqZWN0c319Ci0KLVRlbXBsYXRlIG9iamVjdHMgZm9sbG93aW5nIG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtUZW1wbGF0ZV17cmVzZXR9e30KLVJlc3RvcmUgYSBwaXBlbGluZSB0ZW1wbGF0ZSB0byBpdHMgaW5pdGlhbCBzdGF0ZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1RlbXBsYXRlXXtjbG9uZX17fQotUmV0dXJuIGEgbmV3LCBlcXVpdmFsZW50LCBwaXBlbGluZSB0ZW1wbGF0ZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1RlbXBsYXRlXXtkZWJ1Z317ZmxhZ30KLUlmIFx2YXJ7ZmxhZ30gaXMgdHJ1ZSwgdHVybiBkZWJ1Z2dpbmcgb24uIE90aGVyd2lzZSwgdHVybiBkZWJ1Z2dpbmcKLW9mZi4gV2hlbiBkZWJ1Z2dpbmcgaXMgb24sIGNvbW1hbmRzIHRvIGJlIGV4ZWN1dGVkIGFyZSBwcmludGVkLCBhbmQKLXRoZSBzaGVsbCBpcyBnaXZlbiBcY29kZXtzZXQgLXh9IGNvbW1hbmQgdG8gYmUgbW9yZSB2ZXJib3NlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bVGVtcGxhdGVde2FwcGVuZH17Y21kLCBraW5kfQotQXBwZW5kIGEgbmV3IGFjdGlvbiBhdCB0aGUgZW5kLiBUaGUgXHZhcntjbWR9IHZhcmlhYmxlIG11c3QgYmUgYSB2YWxpZAotYm91cm5lIHNoZWxsIGNvbW1hbmQuIFRoZSBcdmFye2tpbmR9IHZhcmlhYmxlIGNvbnNpc3RzIG9mIHR3byBsZXR0ZXJzLgotCi1UaGUgZmlyc3QgbGV0dGVyIGNhbiBiZSBlaXRoZXIgb2YgXGNvZGV7Jy0nfSAod2hpY2ggbWVhbnMgdGhlIGNvbW1hbmQKLXJlYWRzIGl0cyBzdGFuZGFyZCBpbnB1dCksIFxjb2RleydmJ30gKHdoaWNoIG1lYW5zIHRoZSBjb21tYW5kcyByZWFkcwotYSBnaXZlbiBmaWxlIG9uIHRoZSBjb21tYW5kIGxpbmUpIG9yIFxjb2RleycuJ30gKHdoaWNoIG1lYW5zIHRoZSBjb21tYW5kcwotcmVhZHMgbm8gaW5wdXQsIGFuZCBoZW5jZSBtdXN0IGJlIGZpcnN0LikKLQotU2ltaWxhcmx5LCB0aGUgc2Vjb25kIGxldHRlciBjYW4gYmUgZWl0aGVyIG9mIFxjb2RleyctJ30gKHdoaWNoIG1lYW5zIAotdGhlIGNvbW1hbmQgd3JpdGVzIHRvIHN0YW5kYXJkIG91dHB1dCksIFxjb2RleydmJ30gKHdoaWNoIG1lYW5zIHRoZSAKLWNvbW1hbmQgd3JpdGVzIGEgZmlsZSBvbiB0aGUgY29tbWFuZCBsaW5lKSBvciBcY29kZXsnLid9ICh3aGljaCBtZWFucwotdGhlIGNvbW1hbmQgZG9lcyBub3Qgd3JpdGUgYW55dGhpbmcsIGFuZCBoZW5jZSBtdXN0IGJlIGxhc3QuKQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bVGVtcGxhdGVde3ByZXBlbmR9e2NtZCwga2luZH0KLUFkZCBhIG5ldyBhY3Rpb24gYXQgdGhlIGJlZ2lubmluZy4gU2VlIFxtZXRob2R7YXBwZW5kKCl9IGZvciBleHBsYW5hdGlvbnMKLW9mIHRoZSBhcmd1bWVudHMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtUZW1wbGF0ZV17b3Blbn17ZmlsZSwgbW9kZX0KLVJldHVybiBhIGZpbGUtbGlrZSBvYmplY3QsIG9wZW4gdG8gXHZhcntmaWxlfSwgYnV0IHJlYWQgZnJvbSBvcgotd3JpdHRlbiB0byBieSB0aGUgcGlwZWxpbmUuICBOb3RlIHRoYXQgb25seSBvbmUgb2YgXGNvZGV7J3InfSwKLVxjb2Rleyd3J30gbWF5IGJlIGdpdmVuLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bVGVtcGxhdGVde2NvcHl9e2luZmlsZSwgb3V0ZmlsZX0KLUNvcHkgXHZhcntpbmZpbGV9IHRvIFx2YXJ7b3V0ZmlsZX0gdGhyb3VnaCB0aGUgcGlwZS4KLVxlbmR7bWV0aG9kZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlicGtndXRpbC50ZXggYi9Eb2MvbGliL2xpYnBrZ3V0aWwudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjg2ZjAwLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlicGtndXRpbC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3BrZ3V0aWx9IC0tLQotICAgICAgICAgUGFja2FnZSBleHRlbnNpb24gdXRpbGl0eX0KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e3BrZ3V0aWx9Ci1cbW9kdWxlc3lub3BzaXN7VXRpbGl0aWVzIHRvIHN1cHBvcnQgZXh0ZW5zaW9uIG9mIHBhY2thZ2VzLn0KLQotXHZlcnNpb25hZGRlZHsyLjN9Ci0KLVRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgc2luZ2xlIGZ1bmN0aW9uOgotCi1cYmVnaW57ZnVuY2Rlc2N9e2V4dGVuZF9wYXRofXtwYXRoLCBuYW1lfQotICBFeHRlbmQgdGhlIHNlYXJjaCBwYXRoIGZvciB0aGUgbW9kdWxlcyB3aGljaCBjb21wcmlzZSBhIHBhY2thZ2UuCi0gIEludGVuZGVkIHVzZSBpcyB0byBwbGFjZSB0aGUgZm9sbG93aW5nIGNvZGUgaW4gYSBwYWNrYWdlJ3MKLSAgXGZpbGV7X19pbml0X18ucHl9OgotCi1cYmVnaW57dmVyYmF0aW19Ci1mcm9tIHBrZ3V0aWwgaW1wb3J0IGV4dGVuZF9wYXRoCi1fX3BhdGhfXyA9IGV4dGVuZF9wYXRoKF9fcGF0aF9fLCBfX25hbWVfXykKLVxlbmR7dmVyYmF0aW19Ci0KLSAgVGhpcyB3aWxsIGFkZCB0byB0aGUgcGFja2FnZSdzIFxjb2Rle19fcGF0aF9ffSBhbGwgc3ViZGlyZWN0b3JpZXMgb2YKLSAgZGlyZWN0b3JpZXMgb24gXGNvZGV7c3lzLnBhdGh9IG5hbWVkIGFmdGVyIHRoZSBwYWNrYWdlLiAgVGhpcyBpcwotICB1c2VmdWwgaWYgb25lIHdhbnRzIHRvIGRpc3RyaWJ1dGUgZGlmZmVyZW50IHBhcnRzIG9mIGEgc2luZ2xlCi0gIGxvZ2ljYWwgcGFja2FnZSBhcyBtdWx0aXBsZSBkaXJlY3Rvcmllcy4KLQotICBJdCBhbHNvIGxvb2tzIGZvciBcZmlsZXsqLnBrZ30gZmlsZXMgYmVnaW5uaW5nIHdoZXJlIFxjb2Rleyp9Ci0gIG1hdGNoZXMgdGhlIFx2YXJ7bmFtZX0gYXJndW1lbnQuICBUaGlzIGZlYXR1cmUgaXMgc2ltaWxhciB0bwotICBcZmlsZXsqLnB0aH0gZmlsZXMgKHNlZSB0aGUgXHJlZm1vZHVsZXtzaXRlfSBtb2R1bGUgZm9yIG1vcmUKLSAgaW5mb3JtYXRpb24pLCBleGNlcHQgdGhhdCBpdCBkb2Vzbid0IHNwZWNpYWwtY2FzZSBsaW5lcyBzdGFydGluZwotICB3aXRoIFxjb2Rle2ltcG9ydH0uICBBIFxmaWxleyoucGtnfSBmaWxlIGlzIHRydXN0ZWQgYXQgZmFjZSB2YWx1ZToKLSAgYXBhcnQgZnJvbSBjaGVja2luZyBmb3IgZHVwbGljYXRlcywgYWxsIGVudHJpZXMgZm91bmQgaW4gYQotICBcZmlsZXsqLnBrZ30gZmlsZSBhcmUgYWRkZWQgdG8gdGhlIHBhdGgsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5Ci0gIGV4aXN0IG9uIHRoZSBmaWxlc3lzdGVtLiAgKFRoaXMgaXMgYSBmZWF0dXJlLikKLQotICBJZiB0aGUgaW5wdXQgcGF0aCBpcyBub3QgYSBsaXN0IChhcyBpcyB0aGUgY2FzZSBmb3IgZnJvemVuCi0gIHBhY2thZ2VzKSBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuICBUaGUgaW5wdXQgcGF0aCBpcyBub3QKLSAgbW9kaWZpZWQ7IGFuIGV4dGVuZGVkIGNvcHkgaXMgcmV0dXJuZWQuICBJdGVtcyBhcmUgb25seSBhcHBlbmRlZAotICB0byB0aGUgY29weSBhdCB0aGUgZW5kLgotCi0gIEl0IGlzIGFzc3VtZWQgdGhhdCBcY29kZXtzeXMucGF0aH0gaXMgYSBzZXF1ZW5jZS4gIEl0ZW1zIG9mCi0gIFxjb2Rle3N5cy5wYXRofSB0aGF0IGFyZSBub3QgKFVuaWNvZGUgb3IgOC1iaXQpIHN0cmluZ3MgcmVmZXJyaW5nIHRvCi0gIGV4aXN0aW5nIGRpcmVjdG9yaWVzIGFyZSBpZ25vcmVkLiAgVW5pY29kZSBpdGVtcyBvbiBcY29kZXtzeXMucGF0aH0KLSAgdGhhdCBjYXVzZSBlcnJvcnMgd2hlbiB1c2VkIGFzIGZpbGVuYW1lcyBtYXkgY2F1c2UgdGhpcyBmdW5jdGlvbiB0bwotICByYWlzZSBhbiBleGNlcHRpb24gKGluIGxpbmUgd2l0aCBcZnVuY3Rpb257b3MucGF0aC5pc2RpcigpfSBiZWhhdmlvcikuCi1cZW5ke2Z1bmNkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJwbGF0Zm9ybS50ZXggYi9Eb2MvbGliL2xpYnBsYXRmb3JtLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJmMTkxMy4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnBsYXRmb3JtLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3BsYXRmb3JtfSAtLS0gCi0gICBBY2Nlc3MgdG8gdW5kZXJseWluZyBwbGF0Zm9ybSdzIGlkZW50aWZ5aW5nIGRhdGEufQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17cGxhdGZvcm19Ci1cbW9kdWxlc3lub3BzaXN7UmV0cmlldmVzIGFzIG11Y2ggcGxhdGZvcm0gaWRlbnRpZnlpbmcgZGF0YSBhcyBwb3NzaWJsZS59Ci1cbW9kdWxlYXV0aG9ye01hcmMtQW5kcmUgTGVtYnVyZ317bWFsQGVnZW5peC5jb219Ci1cc2VjdGlvbmF1dGhvcntCam9ybiBQZXR0ZXJzZW59e2JwZXR0ZXJzZW5AY29ycC5mYWlyaXNhYWMuY29tfQotCi1cdmVyc2lvbmFkZGVkezIuM30KLQotXGJlZ2lue25vdGljZX0KLSAgU3BlY2lmaWMgcGxhdGZvcm1zIGxpc3RlZCBhbHBoYWJldGljYWxseSwgd2l0aCBMaW51eCBpbmNsdWRlZCBpbiB0aGUKLSAgXFVOSVh7fSBzZWN0aW9uLgotXGVuZHtub3RpY2V9Ci0KLVxzdWJzZWN0aW9ue0Nyb3NzIFBsYXRmb3JtfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2FyY2hpdGVjdHVyZX17ZXhlY3V0YWJsZT1zeXMuZXhlY3V0YWJsZSwgYml0cz0nJywgbGlua2FnZT0nJ30KLSAgUXVlcmllcyB0aGUgZ2l2ZW4gZXhlY3V0YWJsZSAoZGVmYXVsdHMgdG8gdGhlIFB5dGhvbiBpbnRlcnByZXRlcgotICBiaW5hcnkpIGZvciB2YXJpb3VzIGFyY2hpdGVjdHVyZSBpbmZvcm1hdGlvbi4KLQotICBSZXR1cm5zIGEgdHVwbGUgXGNvZGV7KGJpdHMsIGxpbmthZ2UpfSB3aGljaCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0Ci0gIHRoZSBiaXQgYXJjaGl0ZWN0dXJlIGFuZCB0aGUgbGlua2FnZSBmb3JtYXQgdXNlZCBmb3IgdGhlCi0gIGV4ZWN1dGFibGUuIEJvdGggdmFsdWVzIGFyZSByZXR1cm5lZCBhcyBzdHJpbmdzLgotCi0gIFZhbHVlcyB0aGF0IGNhbm5vdCBiZSBkZXRlcm1pbmVkIGFyZSByZXR1cm5lZCBhcyBnaXZlbiBieSB0aGUKLSAgcGFyYW1ldGVyIHByZXNldHMuIElmIGJpdHMgaXMgZ2l2ZW4gYXMgXGNvZGV7Jyd9LCB0aGUKLSAgXGNmdW5jdGlvbntzaXplb2YocG9pbnRlcil9Ci0gIChvciBcY2Z1bmN0aW9ue3NpemVvZihsb25nKX0gb24gUHl0aG9uIHZlcnNpb24gPCAxLjUuMikgaXMgdXNlZCBhcwotICBpbmRpY2F0b3IgZm9yIHRoZSBzdXBwb3J0ZWQgcG9pbnRlciBzaXplLgotCi0gIFRoZSBmdW5jdGlvbiByZWxpZXMgb24gdGhlIHN5c3RlbSdzIFxmaWxle2ZpbGV9IGNvbW1hbmQgdG8gZG8gdGhlCi0gIGFjdHVhbCB3b3JrLiBUaGlzIGlzIGF2YWlsYWJsZSBvbiBtb3N0IGlmIG5vdCBhbGwgXFVOSVh7fSAKLSAgcGxhdGZvcm1zIGFuZCBzb21lIG5vbi1cVU5JWHt9IHBsYXRmb3JtcyBhbmQgdGhlbiBvbmx5IGlmIHRoZQotICBleGVjdXRhYmxlIHBvaW50cyB0byB0aGUgUHl0aG9uIGludGVycHJldGVyLiAgUmVhc29uYWJsZSBkZWZhdWx0cwotICBhcmUgdXNlZCB3aGVuIHRoZSBhYm92ZSBuZWVkcyBhcmUgbm90IG1ldC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bWFjaGluZX17fQotICBSZXR1cm5zIHRoZSBtYWNoaW5lIHR5cGUsIGUuZy4gXGNvZGV7J2kzODYnfS4KLSAgQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGlmIHRoZSB2YWx1ZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bm9kZX17fQotICBSZXR1cm5zIHRoZSBjb21wdXRlcidzIG5ldHdvcmsgbmFtZSAobWF5IG5vdCBiZSBmdWxseSBxdWFsaWZpZWQhKS4KLSAgQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGlmIHRoZSB2YWx1ZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cGxhdGZvcm19e2FsaWFzZWQ9MCwgdGVyc2U9MH0KLSAgUmV0dXJucyBhIHNpbmdsZSBzdHJpbmcgaWRlbnRpZnlpbmcgdGhlIHVuZGVybHlpbmcgcGxhdGZvcm0KLSAgd2l0aCBhcyBtdWNoIHVzZWZ1bCBpbmZvcm1hdGlvbiBhcyBwb3NzaWJsZS4KLQotICBUaGUgb3V0cHV0IGlzIGludGVuZGVkIHRvIGJlIFxlbXBoe2h1bWFuIHJlYWRhYmxlfSByYXRoZXIgdGhhbgotICBtYWNoaW5lIHBhcnNlYWJsZS4gSXQgbWF5IGxvb2sgZGlmZmVyZW50IG9uIGRpZmZlcmVudCBwbGF0Zm9ybXMgYW5kCi0gIHRoaXMgaXMgaW50ZW5kZWQuCi0KLSAgSWYgXHZhcnthbGlhc2VkfSBpcyB0cnVlLCB0aGUgZnVuY3Rpb24gd2lsbCB1c2UgYWxpYXNlcyBmb3IgdmFyaW91cwotICBwbGF0Zm9ybXMgdGhhdCByZXBvcnQgc3lzdGVtIG5hbWVzIHdoaWNoIGRpZmZlciBmcm9tIHRoZWlyIGNvbW1vbgotICBuYW1lcywgZm9yIGV4YW1wbGUgU3VuT1Mgd2lsbCBiZSByZXBvcnRlZCBhcyBTb2xhcmlzLiAgVGhlCi0gIFxmdW5jdGlvbntzeXN0ZW1fYWxpYXMoKX0gZnVuY3Rpb24gaXMgdXNlZCB0byBpbXBsZW1lbnQgdGhpcy4KLQotICBTZXR0aW5nIFx2YXJ7dGVyc2V9IHRvIHRydWUgY2F1c2VzIHRoZSBmdW5jdGlvbiB0byByZXR1cm4gb25seSB0aGUKLSAgYWJzb2x1dGUgbWluaW11bSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gaWRlbnRpZnkgdGhlIHBsYXRmb3JtLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtwcm9jZXNzb3J9e30KLSAgUmV0dXJucyB0aGUgKHJlYWwpIHByb2Nlc3NvciBuYW1lLCBlLmcuIFxjb2RleydhbWRrNid9LgotCi0gIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBpZiB0aGUgdmFsdWUgY2Fubm90IGJlIGRldGVybWluZWQuIE5vdGUKLSAgdGhhdCBtYW55IHBsYXRmb3JtcyBkbyBub3QgcHJvdmlkZSB0aGlzIGluZm9ybWF0aW9uIG9yIHNpbXBseSByZXR1cm4KLSAgdGhlIHNhbWUgdmFsdWUgYXMgZm9yIFxmdW5jdGlvbnttYWNoaW5lKCl9LiAgTmV0QlNEIGRvZXMgdGhpcy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cHl0aG9uX2J1aWxkfXt9Ci0gIFJldHVybnMgYSB0dXBsZSBcY29kZXsoXHZhcntidWlsZG5vfSwgXHZhcntidWlsZGRhdGV9KX0gc3RhdGluZyB0aGUKLSAgUHl0aG9uIGJ1aWxkIG51bWJlciBhbmQgZGF0ZSBhcyBzdHJpbmdzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtweXRob25fY29tcGlsZXJ9e30KLSAgUmV0dXJucyBhIHN0cmluZyBpZGVudGlmeWluZyB0aGUgY29tcGlsZXIgdXNlZCBmb3IgY29tcGlsaW5nIFB5dGhvbi4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cHl0aG9uX2JyYW5jaH17fQotICBSZXR1cm5zIGEgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24gU0NNIGJyYW5jaC4KLSAgXHZlcnNpb25hZGRlZHsyLjZ9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3B5dGhvbl9pbXBsZW1lbnRhdGlvbn17fQotICBSZXR1cm5zIGEgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24uCi0gIFBvc3NpYmxlIHJldHVybiB2YWx1ZXMgYXJlOiAnQ1B5dGhvbicsICdJcm9uUHl0aG9uJywgJ0p5dGhvbicKLSAgXHZlcnNpb25hZGRlZHsyLjZ9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3B5dGhvbl9yZXZpc2lvbn17fQotICBSZXR1cm5zIGEgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24gU0NNIHJldmlzaW9uLgotICBcdmVyc2lvbmFkZGVkezIuNn0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cHl0aG9uX3ZlcnNpb259e30KLSAgUmV0dXJucyB0aGUgUHl0aG9uIHZlcnNpb24gYXMgc3RyaW5nIFxjb2RleydtYWpvci5taW5vci5wYXRjaGxldmVsJ30KLQotICBOb3RlIHRoYXQgdW5saWtlIHRoZSBQeXRob24gXGNvZGV7c3lzLnZlcnNpb259LCB0aGUgcmV0dXJuZWQgdmFsdWUKLSAgd2lsbCBhbHdheXMgaW5jbHVkZSB0aGUgcGF0Y2hsZXZlbCAoaXQgZGVmYXVsdHMgdG8gMCkuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3B5dGhvbl92ZXJzaW9uX3R1cGxlfXt9Ci0gIFJldHVybnMgdGhlIFB5dGhvbiB2ZXJzaW9uIGFzIHR1cGxlIFxjb2RleyhcdmFye21ham9yfSwgXHZhcnttaW5vcn0sCi0gIFx2YXJ7cGF0Y2hsZXZlbH0pfSBvZiBzdHJpbmdzLgotCi0gIE5vdGUgdGhhdCB1bmxpa2UgdGhlIFB5dGhvbiBcY29kZXtzeXMudmVyc2lvbn0sIHRoZSByZXR1cm5lZCB2YWx1ZQotICB3aWxsIGFsd2F5cyBpbmNsdWRlIHRoZSBwYXRjaGxldmVsIChpdCBkZWZhdWx0cyB0byBcY29kZXsnMCd9KS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cmVsZWFzZX17fQotICBSZXR1cm5zIHRoZSBzeXN0ZW0ncyByZWxlYXNlLCBlLmcuIFxjb2RleycyLjIuMCd9IG9yIFxjb2RleydOVCd9Ci0gIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBpZiB0aGUgdmFsdWUgY2Fubm90IGJlIGRldGVybWluZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3N5c3RlbX17fQotICBSZXR1cm5zIHRoZSBzeXN0ZW0vT1MgbmFtZSwgZS5nLiBcY29kZXsnTGludXgnfSwgXGNvZGV7J1dpbmRvd3MnfSwKLSAgb3IgXGNvZGV7J0phdmEnfS4KLSAgQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGlmIHRoZSB2YWx1ZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c3lzdGVtX2FsaWFzfXtzeXN0ZW0sIHJlbGVhc2UsIHZlcnNpb259Ci0gIFJldHVybnMgXGNvZGV7KFx2YXJ7c3lzdGVtfSwgXHZhcntyZWxlYXNlfSwgXHZhcnt2ZXJzaW9ufSl9IGFsaWFzZWQKLSAgdG8gY29tbW9uIG1hcmtldGluZyBuYW1lcyB1c2VkIGZvciBzb21lIHN5c3RlbXMuICBJdCBhbHNvIGRvZXMgc29tZQotICByZW9yZGVyaW5nIG9mIHRoZSBpbmZvcm1hdGlvbiBpbiBzb21lIGNhc2VzIHdoZXJlIGl0IHdvdWxkIG90aGVyd2lzZQotICBjYXVzZSBjb25mdXNpb24uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3ZlcnNpb259e30KLSAgUmV0dXJucyB0aGUgc3lzdGVtJ3MgcmVsZWFzZSB2ZXJzaW9uLCBlLmcuIFxjb2RleydcIzMgb24gZGVnYXMnfS4KLSAgQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGlmIHRoZSB2YWx1ZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dW5hbWV9e30KLSAgRmFpcmx5IHBvcnRhYmxlIHVuYW1lIGludGVyZmFjZS4gUmV0dXJucyBhIHR1cGxlIG9mIHN0cmluZ3MKLSAgXGNvZGV7KFx2YXJ7c3lzdGVtfSwgXHZhcntub2RlfSwgXHZhcntyZWxlYXNlfSwgXHZhcnt2ZXJzaW9ufSwKLSAgXHZhcnttYWNoaW5lfSwgXHZhcntwcm9jZXNzb3J9KX0gaWRlbnRpZnlpbmcgdGhlIHVuZGVybHlpbmcKLSAgcGxhdGZvcm0uCi0KLSAgTm90ZSB0aGF0IHVubGlrZSB0aGUgXGZ1bmN0aW9ue29zLnVuYW1lKCl9IGZ1bmN0aW9uIHRoaXMgYWxzbyByZXR1cm5zCi0gIHBvc3NpYmxlIHByb2Nlc3NvciBpbmZvcm1hdGlvbiBhcyBhZGRpdGlvbmFsIHR1cGxlIGVudHJ5LgotCi0gIEVudHJpZXMgd2hpY2ggY2Fubm90IGJlIGRldGVybWluZWQgYXJlIHNldCB0byBcY29kZXsnJ30uCi1cZW5ke2Z1bmNkZXNjfQotCi0KLVxzdWJzZWN0aW9ue0phdmEgUGxhdGZvcm19Ci0KLVxiZWdpbntmdW5jZGVzY317amF2YV92ZXJ9e3JlbGVhc2U9JycsIHZlbmRvcj0nJywgdm1pbmZvPSgnJywnJywnJyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvc2luZm89KCcnLCcnLCcnKX0KLSAgVmVyc2lvbiBpbnRlcmZhY2UgZm9yIEpQeXRob24uCi0KLSAgUmV0dXJucyBhIHR1cGxlIFxjb2RleyhcdmFye3JlbGVhc2V9LCBcdmFye3ZlbmRvcn0sIFx2YXJ7dm1pbmZvfSwKLSAgXHZhcntvc2luZm99KX0gd2l0aCBcdmFye3ZtaW5mb30gYmVpbmcgYSB0dXBsZSBcY29kZXsoXHZhcnt2bV9uYW1lfSwKLSAgXHZhcnt2bV9yZWxlYXNlfSwgXHZhcnt2bV92ZW5kb3J9KX0gYW5kIFx2YXJ7b3NpbmZvfSBiZWluZyBhIHR1cGxlCi0gIFxjb2RleyhcdmFye29zX25hbWV9LCBcdmFye29zX3ZlcnNpb259LCBcdmFye29zX2FyY2h9KX0uCi0gIFZhbHVlcyB3aGljaCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBhcmUgc2V0IHRvIHRoZSBkZWZhdWx0cwotICBnaXZlbiBhcyBwYXJhbWV0ZXJzICh3aGljaCBhbGwgZGVmYXVsdCB0byBcY29kZXsnJ30pLgotXGVuZHtmdW5jZGVzY30KLQotCi1cc3Vic2VjdGlvbntXaW5kb3dzIFBsYXRmb3JtfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3dpbjMyX3Zlcn17cmVsZWFzZT0nJywgdmVyc2lvbj0nJywgY3NkPScnLCBwdHlwZT0nJ30KLSAgR2V0IGFkZGl0aW9uYWwgdmVyc2lvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBXaW5kb3dzIFJlZ2lzdHJ5Ci0gIGFuZCByZXR1cm4gYSB0dXBsZSBcY29kZXsoXHZhcnt2ZXJzaW9ufSwgXHZhcntjc2R9LCBcdmFye3B0eXBlfSl9Ci0gIHJlZmVycmluZyB0byB2ZXJzaW9uIG51bWJlciwgQ1NEIGxldmVsIGFuZCBPUyB0eXBlIChtdWx0aS9zaW5nbGUKLSAgcHJvY2Vzc29yKS4KLQotICBBcyBhIGhpbnQ6IFx2YXJ7cHR5cGV9IGlzIFxjb2RleydVbmlwcm9jZXNzb3IgRnJlZSd9IG9uIHNpbmdsZQotICBwcm9jZXNzb3IgTlQgbWFjaGluZXMgYW5kIFxjb2RleydNdWx0aXByb2Nlc3NvciBGcmVlJ30gb24gbXVsdGkKLSAgcHJvY2Vzc29yIG1hY2hpbmVzLiBUaGUgXGVtcGh7J0ZyZWUnfSByZWZlcnMgdG8gdGhlIE9TIHZlcnNpb24gYmVpbmcKLSAgZnJlZSBvZiBkZWJ1Z2dpbmcgY29kZS4gSXQgY291bGQgYWxzbyBzdGF0ZSBcZW1waHsnQ2hlY2tlZCd9IHdoaWNoCi0gIG1lYW5zIHRoZSBPUyB2ZXJzaW9uIHVzZXMgZGVidWdnaW5nIGNvZGUsIGkuZS4gY29kZSB0aGF0Ci0gIGNoZWNrcyBhcmd1bWVudHMsIHJhbmdlcywgZXRjLgotCi0gIFxiZWdpbntub3RpY2V9W25vdGVdCi0gICAgVGhpcyBmdW5jdGlvbiBvbmx5IHdvcmtzIGlmIE1hcmsgSGFtbW9uZCdzIFxtb2R1bGV7d2luMzJhbGx9Ci0gICAgcGFja2FnZSBpcyBpbnN0YWxsZWQgYW5kIChvYnZpb3VzbHkpIG9ubHkgcnVucyBvbiBXaW4zMgotICAgIGNvbXBhdGlibGUgcGxhdGZvcm1zLgotICBcZW5ke25vdGljZX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxzdWJzdWJzZWN0aW9ue1dpbjk1Lzk4IHNwZWNpZmljfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3BvcGVufXtjbWQsIG1vZGU9J3InLCBidWZzaXplPU5vbmV9Ci0gIFBvcnRhYmxlIFxmdW5jdGlvbntwb3BlbigpfSBpbnRlcmZhY2UuICBGaW5kIGEgd29ya2luZyBwb3BlbgotICBpbXBsZW1lbnRhdGlvbiBwcmVmZXJyaW5nIFxmdW5jdGlvbnt3aW4zMnBpcGUucG9wZW4oKX0uICBPbiBXaW5kb3dzCi0gIE5ULCBcZnVuY3Rpb257d2luMzJwaXBlLnBvcGVuKCl9IHNob3VsZCB3b3JrOyBvbiBXaW5kb3dzIDl4IGl0IGhhbmdzCi0gIGR1ZSB0byBidWdzIGluIHRoZSBNUyBDIGxpYnJhcnkuCi0gICUgVGhpcyBLbm93bGVkZ2VCYXNlIGFydGljbGUgYXBwZWFycyB0byBiZSBtaXNzaW5nLi4uCi0gICVTZWUgYWxzbyBcdWxpbmt7TVMgS25vd2xlZGdlQmFzZSBhcnRpY2xlIFExNTA5NTZ9e30uCi1cZW5ke2Z1bmNkZXNjfQotCi0KLVxzdWJzZWN0aW9ue01hYyBPUyBQbGF0Zm9ybX0KLQotXGJlZ2lue2Z1bmNkZXNjfXttYWNfdmVyfXtyZWxlYXNlPScnLCB2ZXJzaW9uaW5mbz0oJycsJycsJycpLCBtYWNoaW5lPScnfQotICBHZXQgTWFjIE9TIHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIHJldHVybiBpdCBhcyB0dXBsZQotICBcY29kZXsoXHZhcntyZWxlYXNlfSwgXHZhcnt2ZXJzaW9uaW5mb30sIFx2YXJ7bWFjaGluZX0pfSB3aXRoCi0gIFx2YXJ7dmVyc2lvbmluZm99IGJlaW5nIGEgdHVwbGUgXGNvZGV7KFx2YXJ7dmVyc2lvbn0sCi0gIFx2YXJ7ZGV2X3N0YWdlfSwgXHZhcntub25fcmVsZWFzZV92ZXJzaW9ufSl9LgotCi0gIEVudHJpZXMgd2hpY2ggY2Fubm90IGJlIGRldGVybWluZWQgYXJlIHNldCB0byBcY29kZXsnJ30uICBBbGwgdHVwbGUKLSAgZW50cmllcyBhcmUgc3RyaW5ncy4KLQotICBEb2N1bWVudGF0aW9uIGZvciB0aGUgdW5kZXJseWluZyBcY2Z1bmN0aW9ue2dlc3RhbHQoKX0gQVBJIGlzCi0gIGF2YWlsYWJsZSBvbmxpbmUgYXQgXHVybHtodHRwOi8vd3d3LnJnYXJvcy5ubC9nZXN0YWx0L30uCi1cZW5ke2Z1bmNkZXNjfQotCi0KLVxzdWJzZWN0aW9ue1xVTklYe30gUGxhdGZvcm1zfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2Rpc3R9e2Rpc3RuYW1lPScnLCB2ZXJzaW9uPScnLCBpZD0nJywKLSAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkX2Rpc3RzPSgnU3VTRScsJ2RlYmlhbicsJ3JlZGhhdCcsJ21hbmRyYWtlJyl9Ci0gIFRyaWVzIHRvIGRldGVybWluZSB0aGUgbmFtZSBvZiB0aGUgT1MgZGlzdHJpYnV0aW9uIG5hbWUKLSAgUmV0dXJucyBhIHR1cGxlIFxjb2RleyhcdmFye2Rpc3RuYW1lfSwgXHZhcnt2ZXJzaW9ufSwgXHZhcntpZH0pfQotICB3aGljaCBkZWZhdWx0cyB0byB0aGUgYXJncyBnaXZlbiBhcyBwYXJhbWV0ZXJzLgotXGVuZHtmdW5jZGVzY30KLQotJSBEb2N1bWVudCBsaW51eF9kaXN0cmlidXRpb24oKT8KLQotXGJlZ2lue2Z1bmNkZXNjfXtsaWJjX3Zlcn17ZXhlY3V0YWJsZT1zeXMuZXhlY3V0YWJsZSwgbGliPScnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj0nJywgY2h1bmtzaXplPTIwNDh9Ci0gIFRyaWVzIHRvIGRldGVybWluZSB0aGUgbGliYyB2ZXJzaW9uIGFnYWluc3Qgd2hpY2ggdGhlIGZpbGUKLSAgZXhlY3V0YWJsZSAoZGVmYXVsdHMgdG8gdGhlIFB5dGhvbiBpbnRlcnByZXRlcikgaXMgbGlua2VkLiAgUmV0dXJucwotICBhIHR1cGxlIG9mIHN0cmluZ3MgXGNvZGV7KFx2YXJ7bGlifSwgXHZhcnt2ZXJzaW9ufSl9IHdoaWNoIGRlZmF1bHQKLSAgdG8gdGhlIGdpdmVuIHBhcmFtZXRlcnMgaW4gY2FzZSB0aGUgbG9va3VwIGZhaWxzLgotCi0gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGhhcyBpbnRpbWF0ZSBrbm93bGVkZ2Ugb2YgaG93IGRpZmZlcmVudAotICBsaWJjIHZlcnNpb25zIGFkZCBzeW1ib2xzIHRvIHRoZSBleGVjdXRhYmxlIGlzIHByb2JhYmx5IG9ubHkKLSAgdXNlYWJsZSBmb3IgZXhlY3V0YWJsZXMgY29tcGlsZWQgdXNpbmcgXHByb2dyYW17Z2NjfS4KLQotICBUaGUgZmlsZSBpcyByZWFkIGFuZCBzY2FubmVkIGluIGNodW5rcyBvZiBcdmFye2NodW5rc2l6ZX0gYnl0ZXMuCi1cZW5ke2Z1bmNkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJwb3BsaWIudGV4IGIvRG9jL2xpYi9saWJwb3BsaWIudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2E1YmJkLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlicG9wbGliLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3BvcGxpYn0gLS0tCi0gICAgICAgICBQT1AzIHByb3RvY29sIGNsaWVudH0KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e3BvcGxpYn0KLVxtb2R1bGVzeW5vcHNpc3tQT1AzIHByb3RvY29sIGNsaWVudCAocmVxdWlyZXMgc29ja2V0cykufQotCi0lQnkgQW5kcmV3IFQuIENzaWxsYWcKLSVFdmVuIHRob3VnaCBJIHB1dCBpdCBpbnRvIExhVGVYLCBJIGNhbm5vdCByZWFsbHkgY2xhaW0gdGhhdCBJIHdyb3RlCi0laXQgc2luY2UgSSBqdXN0IHN0b2xlIG1vc3Qgb2YgaXQgZnJvbSB0aGUgcG9wbGliLnB5IHNvdXJjZSBjb2RlIGFuZAotJXRoZSBpbWFwbGliIGBgY2hhcHRlcicnLgotJVJldmlzZWQgYnkgRVNSLCBKYW51YXJ5IDIwMDAKLQotXGluZGV4aWl7UE9QM317cHJvdG9jb2x9Ci0KLVRoaXMgbW9kdWxlIGRlZmluZXMgYSBjbGFzcywgXGNsYXNze1BPUDN9LCB3aGljaCBlbmNhcHN1bGF0ZXMgYQotY29ubmVjdGlvbiB0byBhIFBPUDMgc2VydmVyIGFuZCBpbXBsZW1lbnRzIHRoZSBwcm90b2NvbCBhcyBkZWZpbmVkIGluCi1ccmZjezE3MjV9LiAgVGhlIFxjbGFzc3tQT1AzfSBjbGFzcyBzdXBwb3J0cyBib3RoIHRoZSBtaW5pbWFsIGFuZAotb3B0aW9uYWwgY29tbWFuZCBzZXRzLiBBZGRpdGlvbmFsbHksIHRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgY2xhc3MKLVxjbGFzc3tQT1AzX1NTTH0sIHdoaWNoIHByb3ZpZGVzIHN1cHBvcnQgZm9yIGNvbm5lY3RpbmcgdG8gUE9QMwotc2VydmVycyB0aGF0IHVzZSBTU0wgYXMgYW4gdW5kZXJseWluZyBwcm90b2NvbCBsYXllci4KLQotCi1Ob3RlIHRoYXQgUE9QMywgdGhvdWdoIHdpZGVseSBzdXBwb3J0ZWQsIGlzIG9ic29sZXNjZW50LiAgVGhlCi1pbXBsZW1lbnRhdGlvbiBxdWFsaXR5IG9mIFBPUDMgc2VydmVycyB2YXJpZXMgd2lkZWx5LCBhbmQgdG9vIG1hbnkgYXJlCi1xdWl0ZSBwb29yLiBJZiB5b3VyIG1haWxzZXJ2ZXIgc3VwcG9ydHMgSU1BUCwgeW91IHdvdWxkIGJlIGJldHRlciBvZmYKLXVzaW5nIHRoZSBcY2xhc3N7XHJlZm1vZHVsZXtpbWFwbGlifS5JTUFQNH0gY2xhc3MsIGFzIElNQVAKLXNlcnZlcnMgdGVuZCB0byBiZSBiZXR0ZXIgaW1wbGVtZW50ZWQuCi0KLUEgc2luZ2xlIGNsYXNzIGlzIHByb3ZpZGVkIGJ5IHRoZSBcbW9kdWxle3BvcGxpYn0gbW9kdWxlOgotCi1cYmVnaW57Y2xhc3NkZXNjfXtQT1AzfXtob3N0XG9wdGlvbmFseywgcG9ydFxvcHRpb25hbHssIHRpbWVvdXR9fX0KLVRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgYWN0dWFsIFBPUDMgcHJvdG9jb2wuICBUaGUgY29ubmVjdGlvbiBpcwotY3JlYXRlZCB3aGVuIHRoZSBpbnN0YW5jZSBpcyBpbml0aWFsaXplZC4KLUlmIFx2YXJ7cG9ydH0gaXMgb21pdHRlZCwgdGhlIHN0YW5kYXJkIFBPUDMgcG9ydCAoMTEwKSBpcyB1c2VkLgotVGhlIG9wdGlvbmFsIFx2YXJ7dGltZW91dH0gcGFyYW1ldGVyIHNwZWNpZmllcyBhIHRpbWVvdXQgaW4gc2Vjb25kcyBmb3IgdGhlCi1jb25uZWN0aW9uIGF0dGVtcHQgKGlmIG5vdCBzcGVjaWZpZWQsIG9yIHBhc3NlZCBhcyBOb25lLCB0aGUgZ2xvYmFsIGRlZmF1bHQKLXRpbWVvdXQgc2V0dGluZyB3aWxsIGJlIHVzZWQpLgotCi1cdmVyc2lvbmNoYW5nZWRbXHZhcnt0aW1lb3V0fSB3YXMgYWRkZWRdezIuNn0KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtQT1AzX1NTTH17aG9zdFxvcHRpb25hbHssIHBvcnRcb3B0aW9uYWx7LCBrZXlmaWxlXG9wdGlvbmFseywgY2VydGZpbGV9fX19Ci1UaGlzIGlzIGEgc3ViY2xhc3Mgb2YgXGNsYXNze1BPUDN9IHRoYXQgY29ubmVjdHMgdG8gdGhlIHNlcnZlciBvdmVyIGFuCi1TU0wgZW5jcnlwdGVkIHNvY2tldC4gIElmIFx2YXJ7cG9ydH0gaXMgbm90IHNwZWNpZmllZCwgOTk1LCB0aGUKLXN0YW5kYXJkIFBPUDMtb3Zlci1TU0wgcG9ydCBpcyB1c2VkLiAgXHZhcntrZXlmaWxlfSBhbmQgXHZhcntjZXJ0ZmlsZX0KLWFyZSBhbHNvIG9wdGlvbmFsIC0gdGhleSBjYW4gY29udGFpbiBhIFBFTSBmb3JtYXR0ZWQgcHJpdmF0ZSBrZXkgYW5kCi1jZXJ0aWZpY2F0ZSBjaGFpbiBmaWxlIGZvciB0aGUgU1NMIGNvbm5lY3Rpb24uCi0KLVx2ZXJzaW9uYWRkZWR7Mi40fQotXGVuZHtjbGFzc2Rlc2N9Ci0KLU9uZSBleGNlcHRpb24gaXMgZGVmaW5lZCBhcyBhbiBhdHRyaWJ1dGUgb2YgdGhlIFxtb2R1bGV7cG9wbGlifSBtb2R1bGU6Ci0KLVxiZWdpbntleGNkZXNjfXtlcnJvcl9wcm90b30KLUV4Y2VwdGlvbiByYWlzZWQgb24gYW55IGVycm9ycyBmcm9tIHRoaXMgbW9kdWxlIChlcnJvcnMgZnJvbQotXG1vZHVsZXtzb2NrZXR9IG1vZHVsZSBhcmUgbm90IGNhdWdodCkuIFRoZSByZWFzb24gZm9yIHRoZSBleGNlcHRpb24KLWlzIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IgYXMgYSBzdHJpbmcuCi1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntzZWVhbHNvfQotICBcc2VlbW9kdWxle2ltYXBsaWJ9e1RoZSBzdGFuZGFyZCBQeXRob24gSU1BUCBtb2R1bGUufQotICBcc2VldGl0bGVbaHR0cDovL3d3dy5jYXRiLm9yZy9cfnt9ZXNyL2ZldGNobWFpbC9mZXRjaG1haWwtRkFRLmh0bWxdCi0gICAgICAgIHtGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucyBBYm91dCBGZXRjaG1haWx9Ci0gICAgICAgIHtUaGUgRkFRIGZvciB0aGUgXHByb2dyYW17ZmV0Y2htYWlsfSBQT1AvSU1BUCBjbGllbnQgY29sbGVjdHMKLSAgICAgICAgIGluZm9ybWF0aW9uIG9uIFBPUDMgc2VydmVyIHZhcmlhdGlvbnMgYW5kIFJGQyBub25jb21wbGlhbmNlCi0gICAgICAgICB0aGF0IG1heSBiZSB1c2VmdWwgaWYgeW91IG5lZWQgdG8gd3JpdGUgYW4gYXBwbGljYXRpb24gYmFzZWQKLSAgICAgICAgIG9uIHRoZSBQT1AgcHJvdG9jb2wufQotXGVuZHtzZWVhbHNvfQotCi0KLVxzdWJzZWN0aW9ue1BPUDMgT2JqZWN0cyBcbGFiZWx7cG9wMy1vYmplY3RzfX0KLQotQWxsIFBPUDMgY29tbWFuZHMgYXJlIHJlcHJlc2VudGVkIGJ5IG1ldGhvZHMgb2YgdGhlIHNhbWUgbmFtZSwKLWluIGxvd2VyLWNhc2U7IG1vc3QgcmV0dXJuIHRoZSByZXNwb25zZSB0ZXh0IHNlbnQgYnkgdGhlIHNlcnZlci4KLQotQW4gXGNsYXNze1BPUDN9IGluc3RhbmNlIGhhcyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0KLQotXGJlZ2lue21ldGhvZGRlc2N9W1BPUDNde3NldF9kZWJ1Z2xldmVsfXtsZXZlbH0KLVNldCB0aGUgaW5zdGFuY2UncyBkZWJ1Z2dpbmcgbGV2ZWwuICBUaGlzIGNvbnRyb2xzIHRoZSBhbW91bnQgb2YKLWRlYnVnZ2luZyBvdXRwdXQgcHJpbnRlZC4gIFRoZSBkZWZhdWx0LCBcY29kZXswfSwgcHJvZHVjZXMgbm8KLWRlYnVnZ2luZyBvdXRwdXQuICBBIHZhbHVlIG9mIFxjb2RlezF9IHByb2R1Y2VzIGEgbW9kZXJhdGUgYW1vdW50IG9mCi1kZWJ1Z2dpbmcgb3V0cHV0LCBnZW5lcmFsbHkgYSBzaW5nbGUgbGluZSBwZXIgcmVxdWVzdC4gIEEgdmFsdWUgb2YKLVxjb2RlezJ9IG9yIGhpZ2hlciBwcm9kdWNlcyB0aGUgbWF4aW11bSBhbW91bnQgb2YgZGVidWdnaW5nIG91dHB1dCwKLWxvZ2dpbmcgZWFjaCBsaW5lIHNlbnQgYW5kIHJlY2VpdmVkIG9uIHRoZSBjb250cm9sIGNvbm5lY3Rpb24uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtQT1AzXXtnZXR3ZWxjb21lfXt9Ci1SZXR1cm5zIHRoZSBncmVldGluZyBzdHJpbmcgc2VudCBieSB0aGUgUE9QMyBzZXJ2ZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtQT1AzXXt1c2VyfXt1c2VybmFtZX0KLVNlbmQgdXNlciBjb21tYW5kLCByZXNwb25zZSBzaG91bGQgaW5kaWNhdGUgdGhhdCBhIHBhc3N3b3JkIGlzIHJlcXVpcmVkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUE9QM117cGFzc199e3Bhc3N3b3JkfQotU2VuZCBwYXNzd29yZCwgcmVzcG9uc2UgaW5jbHVkZXMgbWVzc2FnZSBjb3VudCBhbmQgbWFpbGJveCBzaXplLgotTm90ZTogdGhlIG1haWxib3ggb24gdGhlIHNlcnZlciBpcyBsb2NrZWQgdW50aWwgXG1ldGhvZHtxdWl0KCl9IGlzCi1jYWxsZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtQT1AzXXthcG9wfXt1c2VyLCBzZWNyZXR9Ci1Vc2UgdGhlIG1vcmUgc2VjdXJlIEFQT1AgYXV0aGVudGljYXRpb24gdG8gbG9nIGludG8gdGhlIFBPUDMgc2VydmVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUE9QM117cnBvcH17dXNlcn0KLVVzZSBSUE9QIGF1dGhlbnRpY2F0aW9uIChzaW1pbGFyIHRvIFVOSVggci1jb21tYW5kcykgdG8gbG9nIGludG8gUE9QMyBzZXJ2ZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtQT1AzXXtzdGF0fXt9Ci1HZXQgbWFpbGJveCBzdGF0dXMuICBUaGUgcmVzdWx0IGlzIGEgdHVwbGUgb2YgMiBpbnRlZ2VyczoKLVxjb2RleyhcdmFye21lc3NhZ2UgY291bnR9LCBcdmFye21haWxib3ggc2l6ZX0pfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1BPUDNde2xpc3R9e1xvcHRpb25hbHt3aGljaH19Ci1SZXF1ZXN0IG1lc3NhZ2UgbGlzdCwgcmVzdWx0IGlzIGluIHRoZSBmb3JtCi1cY29kZXsoXHZhcntyZXNwb25zZX0sIFsnbWVzZ19udW0gb2N0ZXRzJywgLi4uXSwgXHZhcntvY3RldHN9KX0uCi1JZiBcdmFye3doaWNofSBpcyBzZXQsIGl0IGlzIHRoZSBtZXNzYWdlIHRvIGxpc3QuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtQT1AzXXtyZXRyfXt3aGljaH0KLVJldHJpZXZlIHdob2xlIG1lc3NhZ2UgbnVtYmVyIFx2YXJ7d2hpY2h9LCBhbmQgc2V0IGl0cyBzZWVuIGZsYWcuCi1SZXN1bHQgaXMgaW4gZm9ybSAgXGNvZGV7KFx2YXJ7cmVzcG9uc2V9LCBbJ2xpbmUnLCAuLi5dLCBcdmFye29jdGV0c30pfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1BPUDNde2RlbGV9e3doaWNofQotRmxhZyBtZXNzYWdlIG51bWJlciBcdmFye3doaWNofSBmb3IgZGVsZXRpb24uICBPbiBtb3N0IHNlcnZlcnMKLWRlbGV0aW9ucyBhcmUgbm90IGFjdHVhbGx5IHBlcmZvcm1lZCB1bnRpbCBRVUlUICh0aGUgbWFqb3IgZXhjZXB0aW9uIGlzCi1FdWRvcmEgUVBPUCwgd2hpY2ggZGVsaWJlcmF0ZWx5IHZpb2xhdGVzIHRoZSBSRkNzIGJ5IGRvaW5nIHBlbmRpbmcKLWRlbGV0ZXMgb24gYW55IGRpc2Nvbm5lY3QpLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUE9QM117cnNldH17fQotUmVtb3ZlIGFueSBkZWxldGlvbiBtYXJrcyBmb3IgdGhlIG1haWxib3guCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtQT1AzXXtub29wfXt9Ci1EbyBub3RoaW5nLiAgTWlnaHQgYmUgdXNlZCBhcyBhIGtlZXAtYWxpdmUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtQT1AzXXtxdWl0fXt9Ci1TaWdub2ZmOiAgY29tbWl0IGNoYW5nZXMsIHVubG9jayBtYWlsYm94LCBkcm9wIGNvbm5lY3Rpb24uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtQT1AzXXt0b3B9e3doaWNoLCBob3dtdWNofQotUmV0cmlldmVzIHRoZSBtZXNzYWdlIGhlYWRlciBwbHVzIFx2YXJ7aG93bXVjaH0gbGluZXMgb2YgdGhlIG1lc3NhZ2UKLWFmdGVyIHRoZSBoZWFkZXIgb2YgbWVzc2FnZSBudW1iZXIgXHZhcnt3aGljaH0uIFJlc3VsdCBpcyBpbiBmb3JtCi1cY29kZXsoXHZhcntyZXNwb25zZX0sIFsnbGluZScsIC4uLl0sIFx2YXJ7b2N0ZXRzfSl9LgotCi1UaGUgUE9QMyBUT1AgY29tbWFuZCB0aGlzIG1ldGhvZCB1c2VzLCB1bmxpa2UgdGhlIFJFVFIgY29tbWFuZCwKLWRvZXNuJ3Qgc2V0IHRoZSBtZXNzYWdlJ3Mgc2VlbiBmbGFnOyB1bmZvcnR1bmF0ZWx5LCBUT1AgaXMgcG9vcmx5Ci1zcGVjaWZpZWQgaW4gdGhlIFJGQ3MgYW5kIGlzIGZyZXF1ZW50bHkgYnJva2VuIGluIG9mZi1icmFuZCBzZXJ2ZXJzLgotVGVzdCB0aGlzIG1ldGhvZCBieSBoYW5kIGFnYWluc3QgdGhlIFBPUDMgc2VydmVycyB5b3Ugd2lsbCB1c2UgYmVmb3JlCi10cnVzdGluZyBpdC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1BPUDNde3VpZGx9e1xvcHRpb25hbHt3aGljaH19Ci1SZXR1cm4gbWVzc2FnZSBkaWdlc3QgKHVuaXF1ZSBpZCkgbGlzdC4KLUlmIFx2YXJ7d2hpY2h9IGlzIHNwZWNpZmllZCwgcmVzdWx0IGNvbnRhaW5zIHRoZSB1bmlxdWUgaWQgZm9yIHRoYXQKLW1lc3NhZ2UgaW4gdGhlIGZvcm0gXGNvZGV7J1x2YXJ7cmVzcG9uc2V9XCBcdmFye21lc2dudW19XCBcdmFye3VpZH19LAotb3RoZXJ3aXNlIHJlc3VsdCBpcyBsaXN0IFxjb2RleyhcdmFye3Jlc3BvbnNlfSwgWydtZXNnbnVtIHVpZCcsIC4uLl0sCi1cdmFye29jdGV0c30pfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotSW5zdGFuY2VzIG9mIFxjbGFzc3tQT1AzX1NTTH0gaGF2ZSBubyBhZGRpdGlvbmFsIG1ldGhvZHMuIFRoZQotaW50ZXJmYWNlIG9mIHRoaXMgc3ViY2xhc3MgaXMgaWRlbnRpY2FsIHRvIGl0cyBwYXJlbnQuCi0KLQotXHN1YnNlY3Rpb257UE9QMyBFeGFtcGxlIFxsYWJlbHtwb3AzLWV4YW1wbGV9fQotCi1IZXJlIGlzIGEgbWluaW1hbCBleGFtcGxlICh3aXRob3V0IGVycm9yIGNoZWNraW5nKSB0aGF0IG9wZW5zIGEKLW1haWxib3ggYW5kIHJldHJpZXZlcyBhbmQgcHJpbnRzIGFsbCBtZXNzYWdlczoKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IGdldHBhc3MsIHBvcGxpYgotCi1NID0gcG9wbGliLlBPUDMoJ2xvY2FsaG9zdCcpCi1NLnVzZXIoZ2V0cGFzcy5nZXR1c2VyKCkpCi1NLnBhc3NfKGdldHBhc3MuZ2V0cGFzcygpKQotbnVtTWVzc2FnZXMgPSBsZW4oTS5saXN0KClbMV0pCi1mb3IgaSBpbiByYW5nZShudW1NZXNzYWdlcyk6Ci0gICAgZm9yIGogaW4gTS5yZXRyKGkrMSlbMV06Ci0gICAgICAgIHByaW50IGoKLVxlbmR7dmVyYmF0aW19Ci0KLUF0IHRoZSBlbmQgb2YgdGhlIG1vZHVsZSwgdGhlcmUgaXMgYSB0ZXN0IHNlY3Rpb24gdGhhdCBjb250YWlucyBhIG1vcmUKLWV4dGVuc2l2ZSBleGFtcGxlIG9mIHVzYWdlLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJwb3NpeC50ZXggYi9Eb2MvbGliL2xpYnBvc2l4LnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVlNmMwZC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnBvc2l4LnRleAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7cG9zaXh9IC0tLQotICAgICAgICAgVGhlIG1vc3QgY29tbW9uIFxQT1NJWHt9IHN5c3RlbSBjYWxsc30KLQotXGRlY2xhcmVtb2R1bGV7YnVpbHRpbn17cG9zaXh9Ci0gIFxwbGF0Zm9ybXtVbml4fQotXG1vZHVsZXN5bm9wc2lze1RoZSBtb3N0IGNvbW1vbiBcUE9TSVhcIHN5c3RlbSBjYWxscyAobm9ybWFsbHkgdXNlZAotICAgICAgICAgICAgICAgIHZpYSBtb2R1bGUgXHJlZm1vZHVsZXtvc30pLn0KLQotCi1UaGlzIG1vZHVsZSBwcm92aWRlcyBhY2Nlc3MgdG8gb3BlcmF0aW5nIHN5c3RlbSBmdW5jdGlvbmFsaXR5IHRoYXQgaXMKLXN0YW5kYXJkaXplZCBieSB0aGUgQyBTdGFuZGFyZCBhbmQgdGhlIFxQT1NJWHt9IHN0YW5kYXJkIChhIHRoaW5seQotZGlzZ3Vpc2VkIFxVTklYe30gaW50ZXJmYWNlKS4KLQotXHN0cm9uZ3tEbyBub3QgaW1wb3J0IHRoaXMgbW9kdWxlIGRpcmVjdGx5Ln0gIEluc3RlYWQsIGltcG9ydCB0aGUKLW1vZHVsZSBccmVmbW9kdWxle29zfSwgd2hpY2ggcHJvdmlkZXMgYSBcZW1waHtwb3J0YWJsZX0gdmVyc2lvbiBvZiB0aGlzCi1pbnRlcmZhY2UuICBPbiBcVU5JWCwgdGhlIFxyZWZtb2R1bGV7b3N9IG1vZHVsZSBwcm92aWRlcyBhIHN1cGVyc2V0IG9mCi10aGUgXG1vZHVsZXtwb3NpeH0gaW50ZXJmYWNlLiAgT24gbm9uLVxVTklYe30gb3BlcmF0aW5nIHN5c3RlbXMgdGhlCi1cbW9kdWxle3Bvc2l4fSBtb2R1bGUgaXMgbm90IGF2YWlsYWJsZSwgYnV0IGEgc3Vic2V0IGlzIGFsd2F5cwotYXZhaWxhYmxlIHRocm91Z2ggdGhlIFxyZWZtb2R1bGV7b3N9IGludGVyZmFjZS4gIE9uY2UgXHJlZm1vZHVsZXtvc30gaXMKLWltcG9ydGVkLCB0aGVyZSBpcyBcZW1waHtub30gcGVyZm9ybWFuY2UgcGVuYWx0eSBpbiB1c2luZyBpdCBpbnN0ZWFkCi1vZiBcbW9kdWxle3Bvc2l4fS4gIEluIGFkZGl0aW9uLCBccmVmbW9kdWxle29zfVxyZWZzdG1vZGluZGV4e29zfQotcHJvdmlkZXMgc29tZSBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHksIHN1Y2ggYXMgYXV0b21hdGljYWxseSBjYWxsaW5nCi1cZnVuY3Rpb257cHV0ZW52KCl9IHdoZW4gYW4gZW50cnkgaW4gXGNvZGV7b3MuZW52aXJvbn0gaXMgY2hhbmdlZC4KLQotVGhlIGRlc2NyaXB0aW9ucyBiZWxvdyBhcmUgdmVyeSB0ZXJzZTsgcmVmZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcKLVxVTklYe30gbWFudWFsIChvciBcUE9TSVh7fSBkb2N1bWVudGF0aW9uKSBlbnRyeSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLUFyZ3VtZW50cyBjYWxsZWQgXHZhcntwYXRofSByZWZlciB0byBhIHBhdGhuYW1lIGdpdmVuIGFzIGEgc3RyaW5nLgotCi1FcnJvcnMgYXJlIHJlcG9ydGVkIGFzIGV4Y2VwdGlvbnM7IHRoZSB1c3VhbCBleGNlcHRpb25zIGFyZSBnaXZlbiBmb3IKLXR5cGUgZXJyb3JzLCB3aGlsZSBlcnJvcnMgcmVwb3J0ZWQgYnkgdGhlIHN5c3RlbSBjYWxscyByYWlzZQotXGV4Y2VwdGlvbntlcnJvcn0gKGEgc3lub255bSBmb3IgdGhlIHN0YW5kYXJkIGV4Y2VwdGlvbgotXGV4Y2VwdGlvbntPU0Vycm9yfSksIGRlc2NyaWJlZCBiZWxvdy4KLQotCi1cc3Vic2VjdGlvbntMYXJnZSBGaWxlIFN1cHBvcnQgXGxhYmVse3Bvc2l4LWxhcmdlLWZpbGVzfX0KLVxzZWN0aW9uYXV0aG9ye1N0ZXZlIENsaWZ0fXtjbGlmdEBtYWlsLmFuYWNhcGEubmV0fQotXGluZGV4e2xhcmdlIGZpbGVzfQotXGluZGV4e2ZpbGUhbGFyZ2UgZmlsZXN9Ci0KLQotU2V2ZXJhbCBvcGVyYXRpbmcgc3lzdGVtcyAoaW5jbHVkaW5nIEFJWCwgSFBVWCwgSXJpeCBhbmQgU29sYXJpcykKLXByb3ZpZGUgc3VwcG9ydCBmb3IgZmlsZXMgdGhhdCBhcmUgbGFyZ2VyIHRoYW4gMiBHYiBmcm9tIGEgQwotcHJvZ3JhbW1pbmcgbW9kZWwgd2hlcmUgXGN0eXBle2ludH0gYW5kIFxjdHlwZXtsb25nfSBhcmUgMzItYml0Ci12YWx1ZXMuIFRoaXMgaXMgdHlwaWNhbGx5IGFjY29tcGxpc2hlZCBieSBkZWZpbmluZyB0aGUgcmVsZXZhbnQgc2l6ZQotYW5kIG9mZnNldCB0eXBlcyBhcyA2NC1iaXQgdmFsdWVzLiBTdWNoIGZpbGVzIGFyZSBzb21ldGltZXMgcmVmZXJyZWQKLXRvIGFzIFxkZm57bGFyZ2UgZmlsZXN9LgotCi1MYXJnZSBmaWxlIHN1cHBvcnQgaXMgZW5hYmxlZCBpbiBQeXRob24gd2hlbiB0aGUgc2l6ZSBvZiBhbgotXGN0eXBle29mZl90fSBpcyBsYXJnZXIgdGhhbiBhIFxjdHlwZXtsb25nfSBhbmQgdGhlIFxjdHlwZXtsb25nIGxvbmd9Ci10eXBlIGlzIGF2YWlsYWJsZSBhbmQgaXMgYXQgbGVhc3QgYXMgbGFyZ2UgYXMgYW4gXGN0eXBle29mZl90fS4gUHl0aG9uCi1sb25ncyBhcmUgdGhlbiB1c2VkIHRvIHJlcHJlc2VudCBmaWxlIHNpemVzLCBvZmZzZXRzIGFuZCBvdGhlciB2YWx1ZXMKLXRoYXQgY2FuIGV4Y2VlZCB0aGUgcmFuZ2Ugb2YgYSBQeXRob24gaW50LiBJdCBtYXkgYmUgbmVjZXNzYXJ5IHRvCi1jb25maWd1cmUgYW5kIGNvbXBpbGUgUHl0aG9uIHdpdGggY2VydGFpbiBjb21waWxlciBmbGFncyB0byBlbmFibGUKLXRoaXMgbW9kZS4gRm9yIGV4YW1wbGUsIGl0IGlzIGVuYWJsZWQgYnkgZGVmYXVsdCB3aXRoIHJlY2VudCB2ZXJzaW9ucwotb2YgSXJpeCwgYnV0IHdpdGggU29sYXJpcyAyLjYgYW5kIDIuNyB5b3UgbmVlZCB0byBkbyBzb21ldGhpbmcgbGlrZToKLQotXGJlZ2lue3ZlcmJhdGltfQotQ0ZMQUdTPSJgZ2V0Y29uZiBMRlNfQ0ZMQUdTYCIgT1BUPSItZyAtTzIgJENGTEFHUyIgXAotICAgICAgICAuL2NvbmZpZ3VyZQotXGVuZHt2ZXJiYXRpbX0gJSAkIDwtLSBib3cgdG8gZm9udC1sb2NrCi0KLU9uIGxhcmdlLWZpbGUtY2FwYWJsZSBMaW51eCBzeXN0ZW1zLCB0aGlzIG1pZ2h0IHdvcms6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLUNGTEFHUz0nLURfTEFSR0VGSUxFNjRfU09VUkNFIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQnIE9QVD0iLWcgLU8yICRDRkxBR1MiIFwKLSAgICAgICAgLi9jb25maWd1cmUKLVxlbmR7dmVyYmF0aW19ICUgJCA8LS0gYm93IHRvIGZvbnQtbG9jawotCi0KLVxzdWJzZWN0aW9ue01vZHVsZSBDb250ZW50cyBcbGFiZWx7cG9zaXgtY29udGVudHN9fQotCi0KLU1vZHVsZSBcbW9kdWxle3Bvc2l4fSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZGF0YSBpdGVtOgotCi1cYmVnaW57ZGF0YWRlc2N9e2Vudmlyb259Ci1BIGRpY3Rpb25hcnkgcmVwcmVzZW50aW5nIHRoZSBzdHJpbmcgZW52aXJvbm1lbnQgYXQgdGhlIHRpbWUgdGhlCi1pbnRlcnByZXRlciB3YXMgc3RhcnRlZC4gRm9yIGV4YW1wbGUsIFxjb2Rle2Vudmlyb25bJ0hPTUUnXX0gaXMgdGhlCi1wYXRobmFtZSBvZiB5b3VyIGhvbWUgZGlyZWN0b3J5LCBlcXVpdmFsZW50IHRvCi1cY29kZXtnZXRlbnYoIkhPTUUiKX0gaW4gQy4KLQotTW9kaWZ5aW5nIHRoaXMgZGljdGlvbmFyeSBkb2VzIG5vdCBhZmZlY3QgdGhlIHN0cmluZyBlbnZpcm9ubWVudAotcGFzc2VkIG9uIGJ5IFxmdW5jdGlvbntleGVjdigpfSwgXGZ1bmN0aW9ue3BvcGVuKCl9IG9yCi1cZnVuY3Rpb257c3lzdGVtKCl9OyBpZiB5b3UgbmVlZCB0byBjaGFuZ2UgdGhlIGVudmlyb25tZW50LCBwYXNzCi1cY29kZXtlbnZpcm9ufSB0byBcZnVuY3Rpb257ZXhlY3ZlKCl9IG9yIGFkZCB2YXJpYWJsZSBhc3NpZ25tZW50cyBhbmQKLWV4cG9ydCBzdGF0ZW1lbnRzIHRvIHRoZSBjb21tYW5kIHN0cmluZyBmb3IgXGZ1bmN0aW9ue3N5c3RlbSgpfSBvcgotXGZ1bmN0aW9ue3BvcGVuKCl9LgotCi1cbm90ZXtUaGUgXHJlZm1vZHVsZXtvc30gbW9kdWxlIHByb3ZpZGVzIGFuIGFsdGVybmF0ZQotaW1wbGVtZW50YXRpb24gb2YgXGNvZGV7ZW52aXJvbn0gd2hpY2ggdXBkYXRlcyB0aGUgZW52aXJvbm1lbnQgb24KLW1vZGlmaWNhdGlvbi4gIE5vdGUgYWxzbyB0aGF0IHVwZGF0aW5nIFxjb2Rle29zLmVudmlyb259IHdpbGwgcmVuZGVyCi10aGlzIGRpY3Rpb25hcnkgb2Jzb2xldGUuICBVc2Ugb2YgdGhlIFxyZWZtb2R1bGV7b3N9IG1vZHVsZSB2ZXJzaW9uIG9mCi10aGlzIGlzIHJlY29tbWVuZGVkIG92ZXIgZGlyZWN0IGFjY2VzcyB0byB0aGUgXG1vZHVsZXtwb3NpeH0gbW9kdWxlLn0KLVxlbmR7ZGF0YWRlc2N9Ci0KLUFkZGl0aW9uYWwgY29udGVudHMgb2YgdGhpcyBtb2R1bGUgc2hvdWxkIG9ubHkgYmUgYWNjZXNzZWQgdmlhIHRoZQotXHJlZm1vZHVsZXtvc30gbW9kdWxlOyByZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhhdCBtb2R1bGUgZm9yCi1mdXJ0aGVyIGluZm9ybWF0aW9uLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJwb3NpeHBhdGgudGV4IGIvRG9jL2xpYi9saWJwb3NpeHBhdGgudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Njg0ZmEwLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlicG9zaXhwYXRoLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDMwMCArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle29zLnBhdGh9IC0tLQotICAgICAgICAgQ29tbW9uIHBhdGhuYW1lIG1hbmlwdWxhdGlvbnN9Ci1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17b3MucGF0aH0KLQotXG1vZHVsZXN5bm9wc2lze0NvbW1vbiBwYXRobmFtZSBtYW5pcHVsYXRpb25zLn0KLQotVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBzb21lIHVzZWZ1bCBmdW5jdGlvbnMgb24gcGF0aG5hbWVzLgotXGluZGV4e3BhdGghb3BlcmF0aW9uc30KLQotXHdhcm5pbmd7T24gV2luZG93cywgbWFueSBvZiB0aGVzZSBmdW5jdGlvbnMgZG8gbm90IHByb3Blcmx5Ci1zdXBwb3J0IFVOQyBwYXRobmFtZXMuICBcZnVuY3Rpb257c3BsaXR1bmMoKX0gYW5kIFxmdW5jdGlvbntpc21vdW50KCl9Ci1kbyBoYW5kbGUgdGhlbSBjb3JyZWN0bHkufQotCi0KLVxiZWdpbntmdW5jZGVzY317YWJzcGF0aH17cGF0aH0KLVJldHVybiBhIG5vcm1hbGl6ZWQgYWJzb2x1dGl6ZWQgdmVyc2lvbiBvZiB0aGUgcGF0aG5hbWUgXHZhcntwYXRofS4KLU9uIG1vc3QgcGxhdGZvcm1zLCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8KLVxjb2Rle25vcm1wYXRoKGpvaW4ob3MuZ2V0Y3dkKCksIFx2YXJ7cGF0aH0pKX0uCi1cdmVyc2lvbmFkZGVkezEuNS4yfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtiYXNlbmFtZX17cGF0aH0KLVJldHVybiB0aGUgYmFzZSBuYW1lIG9mIHBhdGhuYW1lIFx2YXJ7cGF0aH0uICBUaGlzIGlzIHRoZSBzZWNvbmQgaGFsZgotb2YgdGhlIHBhaXIgcmV0dXJuZWQgYnkgXGNvZGV7c3BsaXQoXHZhcntwYXRofSl9LiAgTm90ZSB0aGF0IHRoZQotcmVzdWx0IG9mIHRoaXMgZnVuY3Rpb24gaXMgZGlmZmVyZW50IGZyb20gdGhlCi1cVU5JWHt9IFxwcm9ncmFte2Jhc2VuYW1lfSBwcm9ncmFtOyB3aGVyZSBccHJvZ3JhbXtiYXNlbmFtZX0gZm9yCi1cY29kZXsnL2Zvby9iYXIvJ30gcmV0dXJucyBcY29kZXsnYmFyJ30sIHRoZSBcZnVuY3Rpb257YmFzZW5hbWUoKX0KLWZ1bmN0aW9uIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nIChcY29kZXsnJ30pLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtjb21tb25wcmVmaXh9e2xpc3R9Ci1SZXR1cm4gdGhlIGxvbmdlc3QgcGF0aCBwcmVmaXggKHRha2VuIGNoYXJhY3Rlci1ieS1jaGFyYWN0ZXIpIHRoYXQgaXMgYQotcHJlZml4IG9mIGFsbCBwYXRocyBpbiAKLVx2YXJ7bGlzdH0uICBJZiBcdmFye2xpc3R9IGlzIGVtcHR5LCByZXR1cm4gdGhlIGVtcHR5IHN0cmluZwotKFxjb2RleycnfSkuICBOb3RlIHRoYXQgdGhpcyBtYXkgcmV0dXJuIGludmFsaWQgcGF0aHMgYmVjYXVzZSBpdCB3b3JrcyBhCi1jaGFyYWN0ZXIgYXQgYSB0aW1lLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtkaXJuYW1lfXtwYXRofQotUmV0dXJuIHRoZSBkaXJlY3RvcnkgbmFtZSBvZiBwYXRobmFtZSBcdmFye3BhdGh9LiAgVGhpcyBpcyB0aGUgZmlyc3QKLWhhbGYgb2YgdGhlIHBhaXIgcmV0dXJuZWQgYnkgXGNvZGV7c3BsaXQoXHZhcntwYXRofSl9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtleGlzdHN9e3BhdGh9Ci1SZXR1cm4gXGNvZGV7VHJ1ZX0gaWYgXHZhcntwYXRofSByZWZlcnMgdG8gYW4gZXhpc3RpbmcgcGF0aC4gIFJldHVybnMKLVxjb2Rle0ZhbHNlfSBmb3IgYnJva2VuIHN5bWJvbGljIGxpbmtzLiBPbiBzb21lIHBsYXRmb3JtcywgdGhpcwotZnVuY3Rpb24gbWF5IHJldHVybiBcY29kZXtGYWxzZX0gaWYgcGVybWlzc2lvbiBpcyBub3QgZ3JhbnRlZCB0bwotZXhlY3V0ZSBcZnVuY3Rpb257b3Muc3RhdCgpfSBvbiB0aGUgcmVxdWVzdGVkIGZpbGUsIGV2ZW4gaWYgdGhlCi1cdmFye3BhdGh9IHBoeXNpY2FsbHkgZXhpc3RzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtsZXhpc3RzfXtwYXRofQotUmV0dXJuIFxjb2Rle1RydWV9IGlmIFx2YXJ7cGF0aH0gcmVmZXJzIHRvIGFuIGV4aXN0aW5nIHBhdGguCi1SZXR1cm5zIFxjb2Rle1RydWV9IGZvciBicm9rZW4gc3ltYm9saWMgbGlua3MuICAKLUVxdWl2YWxlbnQgdG8gXGZ1bmN0aW9ue2V4aXN0cygpfSBvbiBwbGF0Zm9ybXMgbGFja2luZwotXGZ1bmN0aW9ue29zLmxzdGF0KCl9LgotXHZlcnNpb25hZGRlZHsyLjR9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2V4cGFuZHVzZXJ9e3BhdGh9Ci1PbiBcVU5JWHt9IGFuZCBXaW5kb3dzLCByZXR1cm4gdGhlIGFyZ3VtZW50IHdpdGggYW4gaW5pdGlhbCBjb21wb25lbnQgb2YKLVxzYW1we1x+fSBvciBcc2FtcHtcflx2YXJ7dXNlcn19IHJlcGxhY2VkIGJ5IHRoYXQgXHZhcnt1c2VyfSdzIGhvbWUgZGlyZWN0b3J5LgotCi1PbiBcVU5JWCwgYW4gaW5pdGlhbCBcc2FtcHtcfn0gaXMgcmVwbGFjZWQgYnkgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi1cZW52dmFye0hPTUV9IGlmIGl0IGlzIHNldDsgb3RoZXJ3aXNlIHRoZSBjdXJyZW50IHVzZXIncyBob21lIGRpcmVjdG9yeQotaXMgbG9va2VkIHVwIGluIHRoZSBwYXNzd29yZCBkaXJlY3RvcnkgdGhyb3VnaCB0aGUgYnVpbHQtaW4gbW9kdWxlCi1ccmVmbW9kdWxle3B3ZH1ccmVmYmltb2RpbmRleHtwd2R9LgotQW4gaW5pdGlhbCBcc2FtcHtcflx2YXJ7dXNlcn19IGlzIGxvb2tlZCB1cCBkaXJlY3RseSBpbiB0aGUKLXBhc3N3b3JkIGRpcmVjdG9yeS4KLQotT24gV2luZG93cywgXGVudnZhcntIT01FfSBhbmQgXGVudnZhcntVU0VSUFJPRklMRX0gd2lsbCBiZSB1c2VkIGlmIHNldCwKLW90aGVyd2lzZSBhIGNvbWJpbmF0aW9uIG9mIFxlbnZ2YXJ7SE9NRVBBVEh9IGFuZCBcZW52dmFye0hPTUVEUklWRX0gd2lsbCBiZQotdXNlZC4gIEFuIGluaXRpYWwgXHNhbXB7XH5cdmFye3VzZXJ9fSBpcyBoYW5kbGVkIGJ5IHN0cmlwcGluZyB0aGUgbGFzdAotZGlyZWN0b3J5IGNvbXBvbmVudCBmcm9tIHRoZSBjcmVhdGVkIHVzZXIgcGF0aCBkZXJpdmVkIGFib3ZlLgotCi1JZiB0aGUgZXhwYW5zaW9uIGZhaWxzIG9yIGlmIHRoZQotcGF0aCBkb2VzIG5vdCBiZWdpbiB3aXRoIGEgdGlsZGUsIHRoZSBwYXRoIGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZXhwYW5kdmFyc317cGF0aH0KLVJldHVybiB0aGUgYXJndW1lbnQgd2l0aCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZXhwYW5kZWQuICBTdWJzdHJpbmdzCi1vZiB0aGUgZm9ybSBcc2FtcHtcJFx2YXJ7bmFtZX19IG9yIFxzYW1we1wkXHtcdmFye25hbWV9XH19IGFyZQotcmVwbGFjZWQgYnkgdGhlIHZhbHVlIG9mIGVudmlyb25tZW50IHZhcmlhYmxlIFx2YXJ7bmFtZX0uICBNYWxmb3JtZWQKLXZhcmlhYmxlIG5hbWVzIGFuZCByZWZlcmVuY2VzIHRvIG5vbi1leGlzdGluZyB2YXJpYWJsZXMgYXJlIGxlZnQKLXVuY2hhbmdlZC4KLQotT24gV2luZG93cywgXHNhbXB7XCVcdmFye25hbWV9XCV9IGV4cGFuc2lvbnMgYXJlIHN1cHBvcnRlZCBpbiBhZGRpdGlvbiB0bwotXHNhbXB7XCRcdmFye25hbWV9fSBhbmQgXHNhbXB7XCRce1x2YXJ7bmFtZX1cfX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldGF0aW1lfXtwYXRofQotUmV0dXJuIHRoZSB0aW1lIG9mIGxhc3QgYWNjZXNzIG9mIFx2YXJ7cGF0aH0uICBUaGUgcmV0dXJuCi12YWx1ZSBpcyBhIG51bWJlciBnaXZpbmcgdGhlIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaCAoc2VlIHRoZSAKLVxyZWZtb2R1bGV7dGltZX0gbW9kdWxlKS4gIFJhaXNlIFxleGNlcHRpb257b3MuZXJyb3J9IGlmIHRoZSBmaWxlIGRvZXMKLW5vdCBleGlzdCBvciBpcyBpbmFjY2Vzc2libGUuCi1cdmVyc2lvbmFkZGVkezEuNS4yfQotXHZlcnNpb25jaGFuZ2VkW0lmIFxmdW5jdGlvbntvcy5zdGF0X2Zsb2F0X3RpbWVzKCl9IHJldHVybnMgVHJ1ZSwgdGhlIHJlc3VsdCBpcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlcl17Mi4zfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRtdGltZX17cGF0aH0KLVJldHVybiB0aGUgdGltZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiBvZiBcdmFye3BhdGh9LiAgVGhlIHJldHVybgotdmFsdWUgaXMgYSBudW1iZXIgZ2l2aW5nIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2ggKHNlZSB0aGUgCi1ccmVmbW9kdWxle3RpbWV9IG1vZHVsZSkuICBSYWlzZSBcZXhjZXB0aW9ue29zLmVycm9yfSBpZiB0aGUgZmlsZSBkb2VzCi1ub3QgZXhpc3Qgb3IgaXMgaW5hY2Nlc3NpYmxlLgotXHZlcnNpb25hZGRlZHsxLjUuMn0KLVx2ZXJzaW9uY2hhbmdlZFtJZiBcZnVuY3Rpb257b3Muc3RhdF9mbG9hdF90aW1lcygpfSByZXR1cm5zIFRydWUsIHRoZSByZXN1bHQgaXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXJdezIuM30KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0Y3RpbWV9e3BhdGh9Ci1SZXR1cm4gdGhlIHN5c3RlbSdzIGN0aW1lIHdoaWNoLCBvbiBzb21lIHN5c3RlbXMgKGxpa2UgXFVOSVgpIGlzIHRoZQotdGltZSBvZiB0aGUgbGFzdCBjaGFuZ2UsIGFuZCwgb24gb3RoZXJzIChsaWtlIFdpbmRvd3MpLCBpcyB0aGUKLWNyZWF0aW9uIHRpbWUgZm9yIFx2YXJ7cGF0aH0uICBUaGUgcmV0dXJuCi12YWx1ZSBpcyBhIG51bWJlciBnaXZpbmcgdGhlIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaCAoc2VlIHRoZSAKLVxyZWZtb2R1bGV7dGltZX0gbW9kdWxlKS4gIFJhaXNlIFxleGNlcHRpb257b3MuZXJyb3J9IGlmIHRoZSBmaWxlIGRvZXMKLW5vdCBleGlzdCBvciBpcyBpbmFjY2Vzc2libGUuCi1cdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0c2l6ZX17cGF0aH0KLVJldHVybiB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIFx2YXJ7cGF0aH0uICBSYWlzZQotXGV4Y2VwdGlvbntvcy5lcnJvcn0gaWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3Qgb3IgaXMgaW5hY2Nlc3NpYmxlLgotXHZlcnNpb25hZGRlZHsxLjUuMn0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aXNhYnN9e3BhdGh9Ci1SZXR1cm4gXGNvZGV7VHJ1ZX0gaWYgXHZhcntwYXRofSBpcyBhbiBhYnNvbHV0ZSBwYXRobmFtZSAoYmVnaW5zIHdpdGggYQotc2xhc2gpLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpc2ZpbGV9e3BhdGh9Ci1SZXR1cm4gXGNvZGV7VHJ1ZX0gaWYgXHZhcntwYXRofSBpcyBhbiBleGlzdGluZyByZWd1bGFyIGZpbGUuICBUaGlzIGZvbGxvd3MKLXN5bWJvbGljIGxpbmtzLCBzbyBib3RoIFxmdW5jdGlvbntpc2xpbmsoKX0gYW5kIFxmdW5jdGlvbntpc2ZpbGUoKX0KLWNhbiBiZSB0cnVlIGZvciB0aGUgc2FtZSBwYXRoLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpc2Rpcn17cGF0aH0KLVJldHVybiBcY29kZXtUcnVlfSBpZiBcdmFye3BhdGh9IGlzIGFuIGV4aXN0aW5nIGRpcmVjdG9yeS4gIFRoaXMgZm9sbG93cwotc3ltYm9saWMgbGlua3MsIHNvIGJvdGggXGZ1bmN0aW9ue2lzbGluaygpfSBhbmQgXGZ1bmN0aW9ue2lzZGlyKCl9IGNhbgotYmUgdHJ1ZSBmb3IgdGhlIHNhbWUgcGF0aC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aXNsaW5rfXtwYXRofQotUmV0dXJuIFxjb2Rle1RydWV9IGlmIFx2YXJ7cGF0aH0gcmVmZXJzIHRvIGEgZGlyZWN0b3J5IGVudHJ5IHRoYXQgaXMgYQotc3ltYm9saWMgbGluay4gIEFsd2F5cyBcY29kZXtGYWxzZX0gaWYgc3ltYm9saWMgbGlua3MgYXJlIG5vdCBzdXBwb3J0ZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2lzbW91bnR9e3BhdGh9Ci1SZXR1cm4gXGNvZGV7VHJ1ZX0gaWYgcGF0aG5hbWUgXHZhcntwYXRofSBpcyBhIFxkZm57bW91bnQgcG9pbnR9OiBhIHBvaW50IGluCi1hIGZpbGUgc3lzdGVtIHdoZXJlIGEgZGlmZmVyZW50IGZpbGUgc3lzdGVtIGhhcyBiZWVuIG1vdW50ZWQuICBUaGUKLWZ1bmN0aW9uIGNoZWNrcyB3aGV0aGVyIFx2YXJ7cGF0aH0ncyBwYXJlbnQsIFxmaWxle1x2YXJ7cGF0aH0vLi59LCBpcwotb24gYSBkaWZmZXJlbnQgZGV2aWNlIHRoYW4gXHZhcntwYXRofSwgb3Igd2hldGhlciBcZmlsZXtcdmFye3BhdGh9Ly4ufQotYW5kIFx2YXJ7cGF0aH0gcG9pbnQgdG8gdGhlIHNhbWUgaS1ub2RlIG9uIHRoZSBzYW1lIGRldmljZSAtLS0gdGhpcwotc2hvdWxkIGRldGVjdCBtb3VudCBwb2ludHMgZm9yIGFsbCBcVU5JWHt9IGFuZCBcUE9TSVh7fSB2YXJpYW50cy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317am9pbn17cGF0aDFcb3B0aW9uYWx7LCBwYXRoMlxvcHRpb25hbHssIC4uLn19fQotSm9pbiBvbmUgb3IgbW9yZSBwYXRoIGNvbXBvbmVudHMgaW50ZWxsaWdlbnRseS4gIElmIGFueSBjb21wb25lbnQgaXMKLWFuIGFic29sdXRlIHBhdGgsIGFsbCBwcmV2aW91cyBjb21wb25lbnRzIChvbiBXaW5kb3dzLCBpbmNsdWRpbmcgdGhlCi1wcmV2aW91cyBkcml2ZSBsZXR0ZXIsIGlmIHRoZXJlIHdhcyBvbmUpIGFyZSB0aHJvd24gYXdheSwgYW5kIGpvaW5pbmcKLWNvbnRpbnVlcy4gIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgXHZhcntwYXRoMX0sIGFuZAotb3B0aW9uYWxseSBcdmFye3BhdGgyfSwgZXRjLiwgd2l0aCBleGFjdGx5IG9uZSBkaXJlY3Rvcnkgc2VwYXJhdG9yCi0oXGNvZGV7b3Muc2VwfSkgaW5zZXJ0ZWQgYmV0d2VlbiBjb21wb25lbnRzLCB1bmxlc3MgXHZhcntwYXRoMn0gaXMKLWVtcHR5LiAgTm90ZSB0aGF0IG9uIFdpbmRvd3MsIHNpbmNlIHRoZXJlIGlzIGEgY3VycmVudCBkaXJlY3RvcnkgZm9yCi1lYWNoIGRyaXZlLCBcZnVuY3Rpb257b3MucGF0aC5qb2luKCJjOiIsICJmb28iKX0gcmVwcmVzZW50cyBhIHBhdGgKLXJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBvbiBkcml2ZSBcZmlsZXtDOn0gKFxmaWxle2M6Zm9vfSksIG5vdAotXGZpbGV7YzpcdGV4dGJhY2tzbGFzaFx0ZXh0YmFja3NsYXNoIGZvb30uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e25vcm1jYXNlfXtwYXRofQotTm9ybWFsaXplIHRoZSBjYXNlIG9mIGEgcGF0aG5hbWUuICBPbiBcVU5JWCwgdGhpcyByZXR1cm5zIHRoZSBwYXRoCi11bmNoYW5nZWQ7IG9uIGNhc2UtaW5zZW5zaXRpdmUgZmlsZXN5c3RlbXMsIGl0IGNvbnZlcnRzIHRoZSBwYXRoIHRvCi1sb3dlcmNhc2UuICBPbiBXaW5kb3dzLCBpdCBhbHNvIGNvbnZlcnRzIGZvcndhcmQgc2xhc2hlcyB0byBiYWNrd2FyZAotc2xhc2hlcy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bm9ybXBhdGh9e3BhdGh9Ci1Ob3JtYWxpemUgYSBwYXRobmFtZS4gIFRoaXMgY29sbGFwc2VzIHJlZHVuZGFudCBzZXBhcmF0b3JzIGFuZAotdXAtbGV2ZWwgcmVmZXJlbmNlcyBzbyB0aGF0IFxjb2Rle0EvL0J9LCBcY29kZXtBLy4vQn0gYW5kCi1cY29kZXtBL2Zvby8uLi9CfSBhbGwgYmVjb21lIFxjb2Rle0EvQn0uICBJdCBkb2VzIG5vdCBub3JtYWxpemUgdGhlCi1jYXNlICh1c2UgXGZ1bmN0aW9ue25vcm1jYXNlKCl9IGZvciB0aGF0KS4gIE9uIFdpbmRvd3MsIGl0IGNvbnZlcnRzCi1mb3J3YXJkIHNsYXNoZXMgdG8gYmFja3dhcmQgc2xhc2hlcy4gSXQgc2hvdWxkIGJlIHVuZGVyc3Rvb2QgdGhhdCB0aGlzIG1heQotY2hhbmdlIHRoZSBtZWFuaW5nIG9mIHRoZSBwYXRoIGlmIGl0IGNvbnRhaW5zIHN5bWJvbGljIGxpbmtzISAKLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cmVhbHBhdGh9e3BhdGh9Ci1SZXR1cm4gdGhlIGNhbm9uaWNhbCBwYXRoIG9mIHRoZSBzcGVjaWZpZWQgZmlsZW5hbWUsIGVsaW1pbmF0aW5nIGFueQotc3ltYm9saWMgbGlua3MgZW5jb3VudGVyZWQgaW4gdGhlIHBhdGggKGlmIHRoZXkgYXJlIHN1cHBvcnRlZCBieSB0aGUKLW9wZXJhdGluZyBzeXN0ZW0pLgotXHZlcnNpb25hZGRlZHsyLjJ9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3JlbHBhdGh9e3BhdGhcb3B0aW9uYWx7LCBzdGFydH19Ci1SZXR1cm4gYSByZWxhdGl2ZSBmaWxlcGF0aCB0byBcdmFye3BhdGh9IGVpdGhlciBmcm9tIHRoZSBjdXJyZW50Ci1kaXJlY3Rvcnkgb3IgZnJvbSBhbiBvcHRpb25hbCBcdmFye3N0YXJ0fSBwb2ludC4KLQotXHZhcntzdGFydH0gZGVmYXVsdHMgdG8gXG1lbWJlcntvcy5jdXJkaXJ9LgotQXZhaWxhYmlsaXR5OiAgV2luZG93cywgXFVOSVguCi1cdmVyc2lvbmFkZGVkezIuNn0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c2FtZWZpbGV9e3BhdGgxLCBwYXRoMn0KLVJldHVybiBcY29kZXtUcnVlfSBpZiBib3RoIHBhdGhuYW1lIGFyZ3VtZW50cyByZWZlciB0byB0aGUgc2FtZSBmaWxlIG9yCi1kaXJlY3RvcnkgKGFzIGluZGljYXRlZCBieSBkZXZpY2UgbnVtYmVyIGFuZCBpLW5vZGUgbnVtYmVyKS4KLVJhaXNlIGFuIGV4Y2VwdGlvbiBpZiBhIFxmdW5jdGlvbntvcy5zdGF0KCl9IGNhbGwgb24gZWl0aGVyIHBhdGhuYW1lCi1mYWlscy4KLUF2YWlsYWJpbGl0eTogIE1hY2ludG9zaCwgXFVOSVguCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NhbWVvcGVuZmlsZX17ZnAxLCBmcDJ9Ci1SZXR1cm4gXGNvZGV7VHJ1ZX0gaWYgdGhlIGZpbGUgZGVzY3JpcHRvcnMgXHZhcntmcDF9IGFuZCBcdmFye2ZwMn0gcmVmZXIKLXRvIHRoZSBzYW1lIGZpbGUuCi1BdmFpbGFiaWxpdHk6ICBNYWNpbnRvc2gsIFxVTklYLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzYW1lc3RhdH17c3RhdDEsIHN0YXQyfQotUmV0dXJuIFxjb2Rle1RydWV9IGlmIHRoZSBzdGF0IHR1cGxlcyBcdmFye3N0YXQxfSBhbmQgXHZhcntzdGF0Mn0gcmVmZXIgdG8KLXRoZSBzYW1lIGZpbGUuICBUaGVzZSBzdHJ1Y3R1cmVzIG1heSBoYXZlIGJlZW4gcmV0dXJuZWQgYnkKLVxmdW5jdGlvbntmc3RhdCgpfSwgXGZ1bmN0aW9ue2xzdGF0KCl9LCBvciBcZnVuY3Rpb257c3RhdCgpfS4gIFRoaXMKLWZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIHVuZGVybHlpbmcgY29tcGFyaXNvbiB1c2VkIGJ5Ci1cZnVuY3Rpb257c2FtZWZpbGUoKX0gYW5kIFxmdW5jdGlvbntzYW1lb3BlbmZpbGUoKX0uCi1BdmFpbGFiaWxpdHk6ICBNYWNpbnRvc2gsIFxVTklYLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzcGxpdH17cGF0aH0KLVNwbGl0IHRoZSBwYXRobmFtZSBcdmFye3BhdGh9IGludG8gYSBwYWlyLCBcY29kZXsoXHZhcntoZWFkfSwKLVx2YXJ7dGFpbH0pfSB3aGVyZSBcdmFye3RhaWx9IGlzIHRoZSBsYXN0IHBhdGhuYW1lIGNvbXBvbmVudCBhbmQKLVx2YXJ7aGVhZH0gaXMgZXZlcnl0aGluZyBsZWFkaW5nIHVwIHRvIHRoYXQuICBUaGUgXHZhcnt0YWlsfSBwYXJ0IHdpbGwKLW5ldmVyIGNvbnRhaW4gYSBzbGFzaDsgaWYgXHZhcntwYXRofSBlbmRzIGluIGEgc2xhc2gsIFx2YXJ7dGFpbH0gd2lsbAotYmUgZW1wdHkuICBJZiB0aGVyZSBpcyBubyBzbGFzaCBpbiBcdmFye3BhdGh9LCBcdmFye2hlYWR9IHdpbGwgYmUKLWVtcHR5LiAgSWYgXHZhcntwYXRofSBpcyBlbXB0eSwgYm90aCBcdmFye2hlYWR9IGFuZCBcdmFye3RhaWx9IGFyZQotZW1wdHkuICBUcmFpbGluZyBzbGFzaGVzIGFyZSBzdHJpcHBlZCBmcm9tIFx2YXJ7aGVhZH0gdW5sZXNzIGl0IGlzIHRoZQotcm9vdCAob25lIG9yIG1vcmUgc2xhc2hlcyBvbmx5KS4gIEluIG5lYXJseSBhbGwgY2FzZXMsCi1cY29kZXtqb2luKFx2YXJ7aGVhZH0sIFx2YXJ7dGFpbH0pfSBlcXVhbHMgXHZhcntwYXRofSAodGhlIG9ubHkKLWV4Y2VwdGlvbiBiZWluZyB3aGVuIHRoZXJlIHdlcmUgbXVsdGlwbGUgc2xhc2hlcyBzZXBhcmF0aW5nIFx2YXJ7aGVhZH0KLWZyb20gXHZhcnt0YWlsfSkuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NwbGl0ZHJpdmV9e3BhdGh9Ci1TcGxpdCB0aGUgcGF0aG5hbWUgXHZhcntwYXRofSBpbnRvIGEgcGFpciBcY29kZXsoXHZhcntkcml2ZX0sCi1cdmFye3RhaWx9KX0gd2hlcmUgXHZhcntkcml2ZX0gaXMgZWl0aGVyIGEgZHJpdmUgc3BlY2lmaWNhdGlvbiBvciB0aGUKLWVtcHR5IHN0cmluZy4gIE9uIHN5c3RlbXMgd2hpY2ggZG8gbm90IHVzZSBkcml2ZSBzcGVjaWZpY2F0aW9ucywKLVx2YXJ7ZHJpdmV9IHdpbGwgYWx3YXlzIGJlIHRoZSBlbXB0eSBzdHJpbmcuICBJbiBhbGwgY2FzZXMsCi1cY29kZXtcdmFye2RyaXZlfSArIFx2YXJ7dGFpbH19IHdpbGwgYmUgdGhlIHNhbWUgYXMgXHZhcntwYXRofS4KLVx2ZXJzaW9uYWRkZWR7MS4zfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzcGxpdGV4dH17cGF0aH0KLVNwbGl0IHRoZSBwYXRobmFtZSBcdmFye3BhdGh9IGludG8gYSBwYWlyIFxjb2RleyhcdmFye3Jvb3R9LCBcdmFye2V4dH0pfSAKLXN1Y2ggdGhhdCBcY29kZXtcdmFye3Jvb3R9ICsgXHZhcntleHR9ID09IFx2YXJ7cGF0aH19LAotYW5kIFx2YXJ7ZXh0fSBpcyBlbXB0eSBvciBiZWdpbnMgd2l0aCBhIHBlcmlvZCBhbmQgY29udGFpbnMKLWF0IG1vc3Qgb25lIHBlcmlvZC4gTGVhZGluZyBwZXJpb2RzIG9uIHRoZSBiYXNlbmFtZSBhcmUgCi1pZ25vcmVkOyBcY29kZXtcdmFye3NwbGl0ZXh0fS4oJy5jc2hyYycpfSByZXR1cm5zIAotXGNvZGV7KCcuY3NocmMnLCAnJyl9LgotCi1cdmVyc2lvbmNoYW5nZWRbRWFybGllciB2ZXJzaW9ucyBjb3VsZCBwcm9kdWNlIGFuIGVtcHR5IHJvb3Qgd2hlbgotdGhlIG9ubHkgcGVyaW9kIHdhcyB0aGUgZmlyc3QgY2hhcmFjdGVyXXsyLjZ9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NwbGl0dW5jfXtwYXRofQotU3BsaXQgdGhlIHBhdGhuYW1lIFx2YXJ7cGF0aH0gaW50byBhIHBhaXIgXGNvZGV7KFx2YXJ7dW5jfSwgXHZhcntyZXN0fSl9Ci1zbyB0aGF0IFx2YXJ7dW5jfSBpcyB0aGUgVU5DIG1vdW50IHBvaW50IChzdWNoIGFzIFxjb2Rle3InXGVcZSBob3N0XGUgbW91bnQnfSksCi1pZiBwcmVzZW50LCBhbmQgXHZhcntyZXN0fSB0aGUgcmVzdCBvZiB0aGUgcGF0aCAoc3VjaCBhcyAKLVxjb2Rle3InXGUgcGF0aFxlIGZpbGUuZXh0J30pLiAgRm9yIHBhdGhzIGNvbnRhaW5pbmcgZHJpdmUgbGV0dGVycywgXHZhcnt1bmN9Ci13aWxsIGFsd2F5cyBiZSB0aGUgZW1wdHkgc3RyaW5nLgotQXZhaWxhYmlsaXR5OiAgV2luZG93cy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317d2Fsa317cGF0aCwgdmlzaXQsIGFyZ30KLUNhbGxzIHRoZSBmdW5jdGlvbiBcdmFye3Zpc2l0fSB3aXRoIGFyZ3VtZW50cwotXGNvZGV7KFx2YXJ7YXJnfSwgXHZhcntkaXJuYW1lfSwgXHZhcntuYW1lc30pfSBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gdGhlCi1kaXJlY3RvcnkgdHJlZSByb290ZWQgYXQgXHZhcntwYXRofSAoaW5jbHVkaW5nIFx2YXJ7cGF0aH0gaXRzZWxmLCBpZiBpdAotaXMgYSBkaXJlY3RvcnkpLiAgVGhlIGFyZ3VtZW50IFx2YXJ7ZGlybmFtZX0gc3BlY2lmaWVzIHRoZSB2aXNpdGVkCi1kaXJlY3RvcnksIHRoZSBhcmd1bWVudCBcdmFye25hbWVzfSBsaXN0cyB0aGUgZmlsZXMgaW4gdGhlIGRpcmVjdG9yeQotKGdvdHRlbiBmcm9tIFxjb2Rle29zLmxpc3RkaXIoXHZhcntkaXJuYW1lfSl9KS4KLVRoZSBcdmFye3Zpc2l0fSBmdW5jdGlvbiBtYXkgbW9kaWZ5IFx2YXJ7bmFtZXN9IHRvCi1pbmZsdWVuY2UgdGhlIHNldCBvZiBkaXJlY3RvcmllcyB2aXNpdGVkIGJlbG93IFx2YXJ7ZGlybmFtZX0sIGUuZy4gdG8KLWF2b2lkIHZpc2l0aW5nIGNlcnRhaW4gcGFydHMgb2YgdGhlIHRyZWUuICAoVGhlIG9iamVjdCByZWZlcnJlZCB0byBieQotXHZhcntuYW1lc30gbXVzdCBiZSBtb2RpZmllZCBpbiBwbGFjZSwgdXNpbmcgXGtleXdvcmR7ZGVsfSBvciBzbGljZQotYXNzaWdubWVudC4pCi0KLVxiZWdpbntub3RpY2V9Ci1TeW1ib2xpYyBsaW5rcyB0byBkaXJlY3RvcmllcyBhcmUgbm90IHRyZWF0ZWQgYXMgc3ViZGlyZWN0b3JpZXMsIGFuZAotdGhhdCBcZnVuY3Rpb257d2FsaygpfSB0aGVyZWZvcmUgd2lsbCBub3QgdmlzaXQgdGhlbS4gVG8gdmlzaXQgbGlua2VkCi1kaXJlY3RvcmllcyB5b3UgbXVzdCBpZGVudGlmeSB0aGVtIHdpdGgKLVxjb2Rle29zLnBhdGguaXNsaW5rKFx2YXJ7ZmlsZX0pfSBhbmQKLVxjb2Rle29zLnBhdGguaXNkaXIoXHZhcntmaWxlfSl9LCBhbmQgaW52b2tlIFxmdW5jdGlvbnt3YWxrKCl9IGFzCi1uZWNlc3NhcnkuCi1cZW5ke25vdGljZX0KLQotXG5vdGV7VGhlIG5ld2VyIFxmdW5jdGlvbntccmVmbW9kdWxle29zfS53YWxrKCl9IGdlbmVyYXRvciBzdXBwbGllcwotICAgICAgc2ltaWxhciBmdW5jdGlvbmFsaXR5IGFuZCBjYW4gYmUgZWFzaWVyIHRvIHVzZS59Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e3N1cHBvcnRzX3VuaWNvZGVfZmlsZW5hbWVzfQotVHJ1ZSBpZiBhcmJpdHJhcnkgVW5pY29kZSBzdHJpbmdzIGNhbiBiZSB1c2VkIGFzIGZpbGUgbmFtZXMgKHdpdGhpbgotbGltaXRhdGlvbnMgaW1wb3NlZCBieSB0aGUgZmlsZSBzeXN0ZW0pLCBhbmQgaWYKLVxmdW5jdGlvbntvcy5saXN0ZGlyKCl9IHJldHVybnMgVW5pY29kZSBzdHJpbmdzIGZvciBhIFVuaWNvZGUKLWFyZ3VtZW50LgotXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke2RhdGFkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJwcHJpbnQudGV4IGIvRG9jL2xpYi9saWJwcHJpbnQudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTM1YjQ0Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlicHByaW50LnRleAorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3BwcmludH0gLS0tCi0gICAgICAgICBEYXRhIHByZXR0eSBwcmludGVyfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17cHByaW50fQotXG1vZHVsZXN5bm9wc2lze0RhdGEgcHJldHR5IHByaW50ZXIufQotXG1vZHVsZWF1dGhvcntGcmVkIEwuIERyYWtlLCBKci59e2ZkcmFrZUBhY20ub3JnfQotXHNlY3Rpb25hdXRob3J7RnJlZCBMLiBEcmFrZSwgSnIufXtmZHJha2VAYWNtLm9yZ30KLQotCi1UaGUgXG1vZHVsZXtwcHJpbnR9IG1vZHVsZSBwcm92aWRlcyBhIGNhcGFiaWxpdHkgdG8gYGBwcmV0dHktcHJpbnQnJwotYXJiaXRyYXJ5IFB5dGhvbiBkYXRhIHN0cnVjdHVyZXMgaW4gYSBmb3JtIHdoaWNoIGNhbiBiZSB1c2VkIGFzIGlucHV0Ci10byB0aGUgaW50ZXJwcmV0ZXIuICBJZiB0aGUgZm9ybWF0dGVkIHN0cnVjdHVyZXMgaW5jbHVkZSBvYmplY3RzIHdoaWNoCi1hcmUgbm90IGZ1bmRhbWVudGFsIFB5dGhvbiB0eXBlcywgdGhlIHJlcHJlc2VudGF0aW9uIG1heSBub3QgYmUKLWxvYWRhYmxlLiAgVGhpcyBtYXkgYmUgdGhlIGNhc2UgaWYgb2JqZWN0cyBzdWNoIGFzIGZpbGVzLCBzb2NrZXRzLAotY2xhc3Nlcywgb3IgaW5zdGFuY2VzIGFyZSBpbmNsdWRlZCwgYXMgd2VsbCBhcyBtYW55IG90aGVyIGJ1aWx0aW4KLW9iamVjdHMgd2hpY2ggYXJlIG5vdCByZXByZXNlbnRhYmxlIGFzIFB5dGhvbiBjb25zdGFudHMuCi0KLVRoZSBmb3JtYXR0ZWQgcmVwcmVzZW50YXRpb24ga2VlcHMgb2JqZWN0cyBvbiBhIHNpbmdsZSBsaW5lIGlmIGl0IGNhbiwKLWFuZCBicmVha3MgdGhlbSBvbnRvIG11bHRpcGxlIGxpbmVzIGlmIHRoZXkgZG9uJ3QgZml0IHdpdGhpbiB0aGUKLWFsbG93ZWQgd2lkdGguICBDb25zdHJ1Y3QgXGNsYXNze1ByZXR0eVByaW50ZXJ9IG9iamVjdHMgZXhwbGljaXRseSBpZgoteW91IG5lZWQgdG8gYWRqdXN0IHRoZSB3aWR0aCBjb25zdHJhaW50LgotCi1cdmVyc2lvbmNoYW5nZWRbRGljdGlvbmFyaWVzIGFyZSBzb3J0ZWQgYnkga2V5IGJlZm9yZSB0aGUgZGlzcGxheSBpcwotY29tcHV0ZWQ7IGJlZm9yZSAyLjUsIGEgZGljdGlvbmFyeSB3YXMgc29ydGVkIG9ubHkgaWYgaXRzIGRpc3BsYXkKLXJlcXVpcmVkIG1vcmUgdGhhbiBvbmUgbGluZSwgYWx0aG91Z2ggdGhhdCB3YXNuJ3QgZG9jdW1lbnRlZF17Mi41fQotCi1UaGUgXG1vZHVsZXtwcHJpbnR9IG1vZHVsZSBkZWZpbmVzIG9uZSBjbGFzczoKLQotCi0lIEZpcnN0IHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzczoKLQotXGJlZ2lue2NsYXNzZGVzY317UHJldHR5UHJpbnRlcn17Li4ufQotQ29uc3RydWN0IGEgXGNsYXNze1ByZXR0eVByaW50ZXJ9IGluc3RhbmNlLiAgVGhpcyBjb25zdHJ1Y3RvcgotdW5kZXJzdGFuZHMgc2V2ZXJhbCBrZXl3b3JkIHBhcmFtZXRlcnMuICBBbiBvdXRwdXQgc3RyZWFtIG1heSBiZSBzZXQKLXVzaW5nIHRoZSBcdmFye3N0cmVhbX0ga2V5d29yZDsgdGhlIG9ubHkgbWV0aG9kIHVzZWQgb24gdGhlIHN0cmVhbQotb2JqZWN0IGlzIHRoZSBmaWxlIHByb3RvY29sJ3MgXG1ldGhvZHt3cml0ZSgpfSBtZXRob2QuICBJZiBub3QKLXNwZWNpZmllZCwgdGhlIFxjbGFzc3tQcmV0dHlQcmludGVyfSBhZG9wdHMgXGNvZGV7c3lzLnN0ZG91dH0uICBUaHJlZQotYWRkaXRpb25hbCBwYXJhbWV0ZXJzIG1heSBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGZvcm1hdHRlZAotcmVwcmVzZW50YXRpb24uICBUaGUga2V5d29yZHMgYXJlIFx2YXJ7aW5kZW50fSwgXHZhcntkZXB0aH0sIGFuZAotXHZhcnt3aWR0aH0uICBUaGUgYW1vdW50IG9mIGluZGVudGF0aW9uIGFkZGVkIGZvciBlYWNoIHJlY3Vyc2l2ZSBsZXZlbAotaXMgc3BlY2lmaWVkIGJ5IFx2YXJ7aW5kZW50fTsgdGhlIGRlZmF1bHQgaXMgb25lLiAgT3RoZXIgdmFsdWVzIGNhbgotY2F1c2Ugb3V0cHV0IHRvIGxvb2sgYSBsaXR0bGUgb2RkLCBidXQgY2FuIG1ha2UgbmVzdGluZyBlYXNpZXIgdG8KLXNwb3QuICBUaGUgbnVtYmVyIG9mIGxldmVscyB3aGljaCBtYXkgYmUgcHJpbnRlZCBpcyBjb250cm9sbGVkIGJ5Ci1cdmFye2RlcHRofTsgaWYgdGhlIGRhdGEgc3RydWN0dXJlIGJlaW5nIHByaW50ZWQgaXMgdG9vIGRlZXAsIHRoZSBuZXh0Ci1jb250YWluZWQgbGV2ZWwgaXMgcmVwbGFjZWQgYnkgXHNhbXB7Li4ufS4gIEJ5IGRlZmF1bHQsIHRoZXJlIGlzIG5vCi1jb25zdHJhaW50IG9uIHRoZSBkZXB0aCBvZiB0aGUgb2JqZWN0cyBiZWluZyBmb3JtYXR0ZWQuICBUaGUgZGVzaXJlZAotb3V0cHV0IHdpZHRoIGlzIGNvbnN0cmFpbmVkIHVzaW5nIHRoZSBcdmFye3dpZHRofSBwYXJhbWV0ZXI7IHRoZQotZGVmYXVsdCBpcyBlaWdodHkgY2hhcmFjdGVycy4gIElmIGEgc3RydWN0dXJlIGNhbm5vdCBiZSBmb3JtYXR0ZWQKLXdpdGhpbiB0aGUgY29uc3RyYWluZWQgd2lkdGgsIGEgYmVzdCBlZmZvcnQgd2lsbCBiZSBtYWRlLgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gaW1wb3J0IHBwcmludCwgc3lzCi0+Pj4gc3R1ZmYgPSBzeXMucGF0aFs6XQotPj4+IHN0dWZmLmluc2VydCgwLCBzdHVmZls6XSkKLT4+PiBwcCA9IHBwcmludC5QcmV0dHlQcmludGVyKGluZGVudD00KQotPj4+IHBwLnBwcmludChzdHVmZikKLVsgICBbICAgJycsCi0gICAgICAgICcvdXNyL2xvY2FsL2xpYi9weXRob24xLjUnLAotICAgICAgICAnL3Vzci9sb2NhbC9saWIvcHl0aG9uMS41L3Rlc3QnLAotICAgICAgICAnL3Vzci9sb2NhbC9saWIvcHl0aG9uMS41L3N1bm9zNScsCi0gICAgICAgICcvdXNyL2xvY2FsL2xpYi9weXRob24xLjUvc2hhcmVkbW9kdWxlcycsCi0gICAgICAgICcvdXNyL2xvY2FsL2xpYi9weXRob24xLjUvdGtpbnRlciddLAotICAgICcnLAotICAgICcvdXNyL2xvY2FsL2xpYi9weXRob24xLjUnLAotICAgICcvdXNyL2xvY2FsL2xpYi9weXRob24xLjUvdGVzdCcsCi0gICAgJy91c3IvbG9jYWwvbGliL3B5dGhvbjEuNS9zdW5vczUnLAotICAgICcvdXNyL2xvY2FsL2xpYi9weXRob24xLjUvc2hhcmVkbW9kdWxlcycsCi0gICAgJy91c3IvbG9jYWwvbGliL3B5dGhvbjEuNS90a2ludGVyJ10KLT4+PgotPj4+IGltcG9ydCBwYXJzZXIKLT4+PiB0dXAgPSBwYXJzZXIuYXN0MnR1cGxlKAotLi4uICAgICBwYXJzZXIuc3VpdGUob3BlbigncHByaW50LnB5JykucmVhZCgpKSlbMV1bMV1bMV0KLT4+PiBwcCA9IHBwcmludC5QcmV0dHlQcmludGVyKGRlcHRoPTYpCi0+Pj4gcHAucHByaW50KHR1cCkKLSgyNjYsICgyNjcsICgzMDcsICgyODcsICgyODgsICguLi4pKSkpKSkKLVxlbmR7dmVyYmF0aW19Ci1cZW5ke2NsYXNzZGVzY30KLQotCi0lIE5vdyB0aGUgZGVyaXZhdGl2ZSBmdW5jdGlvbnM6Ci0KLVRoZSBcY2xhc3N7UHJldHR5UHJpbnRlcn0gY2xhc3Mgc3VwcG9ydHMgc2V2ZXJhbCBkZXJpdmF0aXZlIGZ1bmN0aW9uczoKLQotXGJlZ2lue2Z1bmNkZXNjfXtwZm9ybWF0fXtvYmplY3Rcb3B0aW9uYWx7LCBpbmRlbnRcb3B0aW9uYWx7LAotd2lkdGhcb3B0aW9uYWx7LCBkZXB0aH19fX0KLVJldHVybiB0aGUgZm9ybWF0dGVkIHJlcHJlc2VudGF0aW9uIG9mIFx2YXJ7b2JqZWN0fSBhcyBhIHN0cmluZy4gIFx2YXJ7aW5kZW50fSwKLVx2YXJ7d2lkdGh9IGFuZCBcdmFye2RlcHRofSB3aWxsIGJlIHBhc3NlZCB0byB0aGUgXGNsYXNze1ByZXR0eVByaW50ZXJ9Ci1jb25zdHJ1Y3RvciBhcyBmb3JtYXR0aW5nIHBhcmFtZXRlcnMuCi1cdmVyc2lvbmNoYW5nZWRbVGhlIHBhcmFtZXRlcnMgXHZhcntpbmRlbnR9LCBcdmFye3dpZHRofSBhbmQgXHZhcntkZXB0aH0KLXdlcmUgYWRkZWRdezIuNH0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cHByaW50fXtvYmplY3Rcb3B0aW9uYWx7LCBzdHJlYW1cb3B0aW9uYWx7LAotaW5kZW50XG9wdGlvbmFseywgd2lkdGhcb3B0aW9uYWx7LCBkZXB0aH19fX19Ci1QcmludHMgdGhlIGZvcm1hdHRlZCByZXByZXNlbnRhdGlvbiBvZiBcdmFye29iamVjdH0gb24gXHZhcntzdHJlYW19LAotZm9sbG93ZWQgYnkgYSBuZXdsaW5lLiAgSWYgXHZhcntzdHJlYW19IGlzIG9taXR0ZWQsIFxjb2Rle3N5cy5zdGRvdXR9Ci1pcyB1c2VkLiAgVGhpcyBtYXkgYmUgdXNlZCBpbiB0aGUgaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIgaW5zdGVhZCBvZiBhCi1ca2V5d29yZHtwcmludH0gc3RhdGVtZW50IGZvciBpbnNwZWN0aW5nIHZhbHVlcy4gICAgXHZhcntpbmRlbnR9LAotXHZhcnt3aWR0aH0gYW5kIFx2YXJ7ZGVwdGh9IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBcY2xhc3N7UHJldHR5UHJpbnRlcn0KLWNvbnN0cnVjdG9yIGFzIGZvcm1hdHRpbmcgcGFyYW1ldGVycy4KLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHN0dWZmID0gc3lzLnBhdGhbOl0KLT4+PiBzdHVmZi5pbnNlcnQoMCwgc3R1ZmYpCi0+Pj4gcHByaW50LnBwcmludChzdHVmZikKLVs8UmVjdXJzaW9uIG9uIGxpc3Qgd2l0aCBpZD04Njk0NDA+LAotICcnLAotICcvdXNyL2xvY2FsL2xpYi9weXRob24xLjUnLAotICcvdXNyL2xvY2FsL2xpYi9weXRob24xLjUvdGVzdCcsCi0gJy91c3IvbG9jYWwvbGliL3B5dGhvbjEuNS9zdW5vczUnLAotICcvdXNyL2xvY2FsL2xpYi9weXRob24xLjUvc2hhcmVkbW9kdWxlcycsCi0gJy91c3IvbG9jYWwvbGliL3B5dGhvbjEuNS90a2ludGVyJ10KLVxlbmR7dmVyYmF0aW19Ci1cdmVyc2lvbmNoYW5nZWRbVGhlIHBhcmFtZXRlcnMgXHZhcntpbmRlbnR9LCBcdmFye3dpZHRofSBhbmQgXHZhcntkZXB0aH0KLXdlcmUgYWRkZWRdezIuNH0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aXNyZWFkYWJsZX17b2JqZWN0fQotRGV0ZXJtaW5lIGlmIHRoZSBmb3JtYXR0ZWQgcmVwcmVzZW50YXRpb24gb2YgXHZhcntvYmplY3R9IGlzCi1gYHJlYWRhYmxlLCcnIG9yIGNhbiBiZSB1c2VkIHRvIHJlY29uc3RydWN0IHRoZSB2YWx1ZSB1c2luZwotXGZ1bmN0aW9ue2V2YWwoKX1cYmlmdW5jaW5kZXh7ZXZhbH0uICBUaGlzIGFsd2F5cyByZXR1cm5zIFxjb2Rle0ZhbHNlfSBmb3IKLXJlY3Vyc2l2ZSBvYmplY3RzLgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gcHByaW50LmlzcmVhZGFibGUoc3R1ZmYpCi1GYWxzZQotXGVuZHt2ZXJiYXRpbX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aXNyZWN1cnNpdmV9e29iamVjdH0KLURldGVybWluZSBpZiBcdmFye29iamVjdH0gcmVxdWlyZXMgYSByZWN1cnNpdmUgcmVwcmVzZW50YXRpb24uCi1cZW5ke2Z1bmNkZXNjfQotCi0KLU9uZSBtb3JlIHN1cHBvcnQgZnVuY3Rpb24gaXMgYWxzbyBkZWZpbmVkOgotCi1cYmVnaW57ZnVuY2Rlc2N9e3NhZmVyZXByfXtvYmplY3R9Ci1SZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgXHZhcntvYmplY3R9LCBwcm90ZWN0ZWQgYWdhaW5zdAotcmVjdXJzaXZlIGRhdGEgc3RydWN0dXJlcy4gIElmIHRoZSByZXByZXNlbnRhdGlvbiBvZiBcdmFye29iamVjdH0KLWV4cG9zZXMgYSByZWN1cnNpdmUgZW50cnksIHRoZSByZWN1cnNpdmUgcmVmZXJlbmNlIHdpbGwgYmUgcmVwcmVzZW50ZWQKLWFzIFxzYW1wezxSZWN1cnNpb24gb24gXHZhcnt0eXBlbmFtZX0gd2l0aCBpZD1cdmFye251bWJlcn0+fS4gIFRoZQotcmVwcmVzZW50YXRpb24gaXMgbm90IG90aGVyd2lzZSBmb3JtYXR0ZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi0lIFRoaXMgZXhhbXBsZSBpcyBvdXRzaWRlIHRoZSB7ZnVuY2Rlc2N9IHRvIGtlZXAgaXQgZnJvbSBydW5uaW5nIG92ZXIKLSUgdGhlIHJpZ2h0IG1hcmdpbi4KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBwcHJpbnQuc2FmZXJlcHIoc3R1ZmYpCi0iWzxSZWN1cnNpb24gb24gbGlzdCB3aXRoIGlkPTY4Mjk2OD4sICcnLCAnL3Vzci9sb2NhbC9saWIvcHl0aG9uMS41JywgJy91c3IvbG9jYQotbC9saWIvcHl0aG9uMS41L3Rlc3QnLCAnL3Vzci9sb2NhbC9saWIvcHl0aG9uMS41L3N1bm9zNScsICcvdXNyL2xvY2FsL2xpYi9weXRob24KLTEuNS9zaGFyZWRtb2R1bGVzJywgJy91c3IvbG9jYWwvbGliL3B5dGhvbjEuNS90a2ludGVyJ10iCi1cZW5ke3ZlcmJhdGltfQotCi0KLVxzdWJzZWN0aW9ue1ByZXR0eVByaW50ZXIgT2JqZWN0c30KLVxsYWJlbHtQcmV0dHlQcmludGVyIE9iamVjdHN9Ci0KLVxjbGFzc3tQcmV0dHlQcmludGVyfSBpbnN0YW5jZXMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0KLQotXGJlZ2lue21ldGhvZGRlc2N9W1ByZXR0eVByaW50ZXJde3Bmb3JtYXR9e29iamVjdH0KLVJldHVybiB0aGUgZm9ybWF0dGVkIHJlcHJlc2VudGF0aW9uIG9mIFx2YXJ7b2JqZWN0fS4gIFRoaXMgdGFrZXMgaW50bwotYWNjb3VudCB0aGUgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIFxjbGFzc3tQcmV0dHlQcmludGVyfSBjb25zdHJ1Y3Rvci4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1ByZXR0eVByaW50ZXJde3BwcmludH17b2JqZWN0fQotUHJpbnQgdGhlIGZvcm1hdHRlZCByZXByZXNlbnRhdGlvbiBvZiBcdmFye29iamVjdH0gb24gdGhlIGNvbmZpZ3VyZWQKLXN0cmVhbSwgZm9sbG93ZWQgYnkgYSBuZXdsaW5lLgotXGVuZHttZXRob2RkZXNjfQotCi1UaGUgZm9sbG93aW5nIG1ldGhvZHMgcHJvdmlkZSB0aGUgaW1wbGVtZW50YXRpb25zIGZvciB0aGUKLWNvcnJlc3BvbmRpbmcgZnVuY3Rpb25zIG9mIHRoZSBzYW1lIG5hbWVzLiAgVXNpbmcgdGhlc2UgbWV0aG9kcyBvbiBhbgotaW5zdGFuY2UgaXMgc2xpZ2h0bHkgbW9yZSBlZmZpY2llbnQgc2luY2UgbmV3IFxjbGFzc3tQcmV0dHlQcmludGVyfQotb2JqZWN0cyBkb24ndCBuZWVkIHRvIGJlIGNyZWF0ZWQuCi0KLVxiZWdpbnttZXRob2RkZXNjfVtQcmV0dHlQcmludGVyXXtpc3JlYWRhYmxlfXtvYmplY3R9Ci1EZXRlcm1pbmUgaWYgdGhlIGZvcm1hdHRlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0IGlzCi1gYHJlYWRhYmxlLCcnIG9yIGNhbiBiZSB1c2VkIHRvIHJlY29uc3RydWN0IHRoZSB2YWx1ZSB1c2luZwotXGZ1bmN0aW9ue2V2YWwoKX1cYmlmdW5jaW5kZXh7ZXZhbH0uICBOb3RlIHRoYXQgdGhpcyByZXR1cm5zIFxjb2Rle0ZhbHNlfSBmb3IKLXJlY3Vyc2l2ZSBvYmplY3RzLiAgSWYgdGhlIFx2YXJ7ZGVwdGh9IHBhcmFtZXRlciBvZiB0aGUKLVxjbGFzc3tQcmV0dHlQcmludGVyfSBpcyBzZXQgYW5kIHRoZSBvYmplY3QgaXMgZGVlcGVyIHRoYW4gYWxsb3dlZCwKLXRoaXMgcmV0dXJucyBcY29kZXtGYWxzZX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtQcmV0dHlQcmludGVyXXtpc3JlY3Vyc2l2ZX17b2JqZWN0fQotRGV0ZXJtaW5lIGlmIHRoZSBvYmplY3QgcmVxdWlyZXMgYSByZWN1cnNpdmUgcmVwcmVzZW50YXRpb24uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGFzIGEgaG9vayB0byBhbGxvdyBzdWJjbGFzc2VzIHRvIG1vZGlmeSB0aGUKLXdheSBvYmplY3RzIGFyZSBjb252ZXJ0ZWQgdG8gc3RyaW5ncy4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHVzZXMKLXRoZSBpbnRlcm5hbHMgb2YgdGhlIFxmdW5jdGlvbntzYWZlcmVwcigpfSBpbXBsZW1lbnRhdGlvbi4KLQotXGJlZ2lue21ldGhvZGRlc2N9W1ByZXR0eVByaW50ZXJde2Zvcm1hdH17b2JqZWN0LCBjb250ZXh0LCBtYXhsZXZlbHMsIGxldmVsfQotUmV0dXJucyB0aHJlZSB2YWx1ZXM6IHRoZSBmb3JtYXR0ZWQgdmVyc2lvbiBvZiBcdmFye29iamVjdH0gYXMgYQotc3RyaW5nLCBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSByZXN1bHQgaXMgcmVhZGFibGUsIGFuZCBhIGZsYWcKLWluZGljYXRpbmcgd2hldGhlciByZWN1cnNpb24gd2FzIGRldGVjdGVkLiAgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZQotb2JqZWN0IHRvIGJlIHByZXNlbnRlZC4gIFRoZSBzZWNvbmQgaXMgYSBkaWN0aW9uYXJ5IHdoaWNoIGNvbnRhaW5zIHRoZQotXGZ1bmN0aW9ue2lkKCl9IG9mIG9iamVjdHMgdGhhdCBhcmUgcGFydCBvZiB0aGUgY3VycmVudCBwcmVzZW50YXRpb24KLWNvbnRleHQgKGRpcmVjdCBhbmQgaW5kaXJlY3QgY29udGFpbmVycyBmb3IgXHZhcntvYmplY3R9IHRoYXQgYXJlCi1hZmZlY3RpbmcgdGhlIHByZXNlbnRhdGlvbikgYXMgdGhlIGtleXM7IGlmIGFuIG9iamVjdCBuZWVkcyB0byBiZQotcHJlc2VudGVkIHdoaWNoIGlzIGFscmVhZHkgcmVwcmVzZW50ZWQgaW4gXHZhcntjb250ZXh0fSwgdGhlIHRoaXJkCi1yZXR1cm4gdmFsdWUgc2hvdWxkIGJlIFxjb2Rle1RydWV9LiAgUmVjdXJzaXZlIGNhbGxzIHRvIHRoZSBcbWV0aG9ke2Zvcm1hdCgpfQotbWV0aG9kIHNob3VsZCBhZGQgYWRkaXRpb25hbCBlbnRyaWVzIGZvciBjb250YWluZXJzIHRvIHRoaXMKLWRpY3Rpb25hcnkuICBUaGUgdGhpcmQgYXJndW1lbnQsIFx2YXJ7bWF4bGV2ZWxzfSwgZ2l2ZXMgdGhlIHJlcXVlc3RlZAotbGltaXQgdG8gcmVjdXJzaW9uOyB0aGlzIHdpbGwgYmUgXGNvZGV7MH0gaWYgdGhlcmUgaXMgbm8gcmVxdWVzdGVkCi1saW1pdC4gIFRoaXMgYXJndW1lbnQgc2hvdWxkIGJlIHBhc3NlZCB1bm1vZGlmaWVkIHRvIHJlY3Vyc2l2ZSBjYWxscy4KLVRoZSBmb3VydGggYXJndW1lbnQsIFx2YXJ7bGV2ZWx9LCBnaXZlcyB0aGUgY3VycmVudCBsZXZlbDsgcmVjdXJzaXZlCi1jYWxscyBzaG91bGQgYmUgcGFzc2VkIGEgdmFsdWUgbGVzcyB0aGFuIHRoYXQgb2YgdGhlIGN1cnJlbnQgY2FsbC4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHttZXRob2RkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJwcm9maWxlLnRleCBiL0RvYy9saWIvbGlicHJvZmlsZS50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5YTE2OGMuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJwcm9maWxlLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDcyMiArMCwwIEBACi1cY2hhcHRlcntUaGUgUHl0aG9uIFByb2ZpbGVycyBcbGFiZWx7cHJvZmlsZX19Ci0KLVxzZWN0aW9uYXV0aG9ye0phbWVzIFJvc2tpbmR9e30KLQotQ29weXJpZ2h0IFxjb3B5cmlnaHR7fSAxOTk0LCBieSBJbmZvU2VlayBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KLVxpbmRleHtJbmZvU2VlayBDb3Jwb3JhdGlvbn0KLQotV3JpdHRlbiBieSBKYW1lcyBSb3NraW5kLlxmb290bm90ZXsKLSAgVXBkYXRlZCBhbmQgY29udmVydGVkIHRvIFxMYVRlWFwgYnkgR3VpZG8gdmFuIFJvc3N1bS4KLSAgRnVydGhlciB1cGRhdGVkIGJ5IEFybWluIFJpZ28gdG8gaW50ZWdyYXRlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgbmV3Ci0gIFxtb2R1bGV7Y1Byb2ZpbGV9IG1vZHVsZSBvZiBQeXRob24gMi41Ln0KLQotUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBQeXRob24gc29mdHdhcmUKLWFuZCBpdHMgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSAoc3ViamVjdCB0byB0aGUKLXJlc3RyaWN0aW9uIGluIHRoZSBmb2xsb3dpbmcgc2VudGVuY2UpIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLAotcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZAotdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLXN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgSW5mb1NlZWsgbm90IGJlIHVzZWQgaW4KLWFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKLXdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoaXMgcGVybWlzc2lvbiBpcwotZXhwbGljaXRseSByZXN0cmljdGVkIHRvIHRoZSBjb3B5aW5nIGFuZCBtb2RpZmljYXRpb24gb2YgdGhlIHNvZnR3YXJlCi10byByZW1haW4gaW4gUHl0aG9uLCBjb21waWxlZCBQeXRob24sIG9yIG90aGVyIGxhbmd1YWdlcyAoc3VjaCBhcyBDKQotd2hlcmVpbiB0aGUgbW9kaWZpZWQgb3IgZGVyaXZlZCBjb2RlIGlzIGV4Y2x1c2l2ZWx5IGltcG9ydGVkIGludG8gYQotUHl0aG9uIG1vZHVsZS4KLQotSU5GT1NFRUsgQ09SUE9SQVRJT04gRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMKLVNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi1GSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBJTkZPU0VFSyBDT1JQT1JBVElPTiBCRSBMSUFCTEUgRk9SIEFOWQotU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIKLVJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GCi1DT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi1DT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotCi0KLVRoZSBwcm9maWxlciB3YXMgd3JpdHRlbiBhZnRlciBvbmx5IHByb2dyYW1taW5nIGluIFB5dGhvbiBmb3IgMyB3ZWVrcy4KLUFzIGEgcmVzdWx0LCBpdCBpcyBwcm9iYWJseSBjbHVtc3kgY29kZSwgYnV0IEkgZG9uJ3Qga25vdyBmb3Igc3VyZSB5ZXQKLSdjYXVzZSBJJ20gYSBiZWdpbm5lciA6LSkuICBJIGRpZCB3b3JrIGhhcmQgdG8gbWFrZSB0aGUgY29kZSBydW4gZmFzdCwKLXNvIHRoYXQgcHJvZmlsaW5nIHdvdWxkIGJlIGEgcmVhc29uYWJsZSB0aGluZyB0byBkby4gIEkgdHJpZWQgbm90IHRvCi1yZXBlYXQgY29kZSBmcmFnbWVudHMsIGJ1dCBJJ20gc3VyZSBJIGRpZCBzb21lIHN0dWZmIGluIHJlYWxseSBhd2t3YXJkCi13YXlzIGF0IHRpbWVzLiAgUGxlYXNlIHNlbmQgc3VnZ2VzdGlvbnMgZm9yIGltcHJvdmVtZW50cyB0bzoKLVxlbWFpbHtqYXJAbmV0c2NhcGUuY29tfS4gIEkgd29uJ3QgcHJvbWlzZSBcZW1waHthbnl9IHN1cHBvcnQuICAuLi5idXQKLUknZCBhcHByZWNpYXRlIHRoZSBmZWVkYmFjay4KLQotCi1cc2VjdGlvbntJbnRyb2R1Y3Rpb24gdG8gdGhlIHByb2ZpbGVyc30KLVxub2RlbmFtZXtQcm9maWxlciBJbnRyb2R1Y3Rpb259Ci0KLUEgXGRmbntwcm9maWxlcn0gaXMgYSBwcm9ncmFtIHRoYXQgZGVzY3JpYmVzIHRoZSBydW4gdGltZSBwZXJmb3JtYW5jZQotb2YgYSBwcm9ncmFtLCBwcm92aWRpbmcgYSB2YXJpZXR5IG9mIHN0YXRpc3RpY3MuICBUaGlzIGRvY3VtZW50YXRpb24KLWRlc2NyaWJlcyB0aGUgcHJvZmlsZXIgZnVuY3Rpb25hbGl0eSBwcm92aWRlZCBpbiB0aGUgbW9kdWxlcwotXG1vZHVsZXtwcm9maWxlfSBhbmQgXG1vZHVsZXtwc3RhdHN9LiAgVGhpcyBwcm9maWxlciBwcm92aWRlcwotXGRmbntkZXRlcm1pbmlzdGljIHByb2ZpbGluZ30gb2YgYW55IFB5dGhvbiBwcm9ncmFtcy4gIEl0IGFsc28KLXByb3ZpZGVzIGEgc2VyaWVzIG9mIHJlcG9ydCBnZW5lcmF0aW9uIHRvb2xzIHRvIGFsbG93IHVzZXJzIHRvIHJhcGlkbHkKLWV4YW1pbmUgdGhlIHJlc3VsdHMgb2YgYSBwcm9maWxlIG9wZXJhdGlvbi4KLVxpbmRleHtkZXRlcm1pbmlzdGljIHByb2ZpbGluZ30KLVxpbmRleHtwcm9maWxpbmcsIGRldGVybWluaXN0aWN9Ci0KLVRoZSBQeXRob24gc3RhbmRhcmQgbGlicmFyeSBwcm92aWRlcyB0aHJlZSBkaWZmZXJlbnQgcHJvZmlsZXJzOgotCi1cYmVnaW57ZW51bWVyYXRlfQotXGl0ZW0gXG1vZHVsZXtwcm9maWxlfSwgYSBwdXJlIFB5dGhvbiBtb2R1bGUsIGRlc2NyaWJlZCBpbiB0aGUgc2VxdWVsLgotICBDb3B5cmlnaHQgXGNvcHlyaWdodHt9IDE5OTQsIGJ5IEluZm9TZWVrIENvcnBvcmF0aW9uLgotICBcdmVyc2lvbmNoYW5nZWRbYWxzbyByZXBvcnRzIHRoZSB0aW1lIHNwZW50IGluIGNhbGxzIHRvIGJ1aWx0LWluCi0gIGZ1bmN0aW9ucyBhbmQgbWV0aG9kc117Mi40fQotCi1caXRlbSBcbW9kdWxle2NQcm9maWxlfSwgYSBtb2R1bGUgd3JpdHRlbiBpbiBDLCB3aXRoIGEgcmVhc29uYWJsZQotICBvdmVyaGVhZCB0aGF0IG1ha2VzIGl0IHN1aXRhYmxlIGZvciBwcm9maWxpbmcgbG9uZy1ydW5uaW5nIHByb2dyYW1zLgotICBCYXNlZCBvbiBcbW9kdWxle2xzcHJvZn0sIGNvbnRyaWJ1dGVkIGJ5IEJyZXR0IFJvc2VuIGFuZCBUZWQgQ3pvdHRlci4KLSAgXHZlcnNpb25hZGRlZHsyLjV9Ci0KLVxpdGVtIFxtb2R1bGV7aG90c2hvdH0sIGEgQyBtb2R1bGUgZm9jdXNpbmcgb24gbWluaW1pemluZyB0aGUgb3ZlcmhlYWQKLSAgd2hpbGUgcHJvZmlsaW5nLCBhdCB0aGUgZXhwZW5zZSBvZiBsb25nIGRhdGEgcG9zdC1wcm9jZXNzaW5nIHRpbWVzLgotICBcdmVyc2lvbmNoYW5nZWRbdGhlIHJlc3VsdHMgc2hvdWxkIGJlIG1vcmUgbWVhbmluZ2Z1bCB0aGFuIGluIHRoZQotICBwYXN0OiB0aGUgdGltaW5nIGNvcmUgY29udGFpbmVkIGEgY3JpdGljYWwgYnVnXXsyLjV9Ci1cZW5ke2VudW1lcmF0ZX0KLQotVGhlIFxtb2R1bGV7cHJvZmlsZX0gYW5kIFxtb2R1bGV7Y1Byb2ZpbGV9IG1vZHVsZXMgZXhwb3J0IHRoZSBzYW1lCi1pbnRlcmZhY2UsIHNvIHRoZXkgYXJlIG1vc3RseSBpbnRlcmNoYW5nZWFibGVzOyBcbW9kdWxle2NQcm9maWxlfSBoYXMgYQotbXVjaCBsb3dlciBvdmVyaGVhZCBidXQgaXMgbm90IHNvIGZhciBhcyB3ZWxsLXRlc3RlZCBhbmQgbWlnaHQgbm90IGJlCi1hdmFpbGFibGUgb24gYWxsIHN5c3RlbXMuICBcbW9kdWxle2NQcm9maWxlfSBpcyByZWFsbHkgYSBjb21wYXRpYmlsaXR5Ci1sYXllciBvbiB0b3Agb2YgdGhlIGludGVybmFsIFxtb2R1bGV7X2xzcHJvZn0gbW9kdWxlLiAgVGhlCi1cbW9kdWxle2hvdHNob3R9IG1vZHVsZSBpcyByZXNlcnZlZCB0byBzcGVjaWFsaXplZCB1c2FnZXMuCi0KLSVcc2VjdGlvbntIb3cgSXMgVGhpcyBQcm9maWxlciBEaWZmZXJlbnQgRnJvbSBUaGUgT2xkIFByb2ZpbGVyP30KLSVcbm9kZW5hbWV7UHJvZmlsZXIgQ2hhbmdlc30KLSUKLSUoVGhpcyBzZWN0aW9uIGlzIG9mIGhpc3RvcmljYWwgaW1wb3J0YW5jZSBvbmx5OyB0aGUgb2xkIHByb2ZpbGVyCi0lZGlzY3Vzc2VkIGhlcmUgd2FzIGxhc3Qgc2VlbiBpbiBQeXRob24gMS4xLikKLSUKLSVUaGUgYmlnIGNoYW5nZXMgZnJvbSBvbGQgcHJvZmlsaW5nIG1vZHVsZSBhcmUgdGhhdCB5b3UgZ2V0IG1vcmUKLSVpbmZvcm1hdGlvbiwgYW5kIHlvdSBwYXkgbGVzcyBDUFUgdGltZS4gIEl0J3Mgbm90IGEgdHJhZGUtb2ZmLCBpdCdzIGEKLSV0cmFkZS11cC4KLSUKLSVUbyBiZSBzcGVjaWZpYzoKLSUKLSVcYmVnaW57ZGVzY3JpcHRpb259Ci0lCi0lXGl0ZW1bQnVncyByZW1vdmVkOl0KLSVMb2NhbCBzdGFjayBmcmFtZSBpcyBubyBsb25nZXIgbW9sZXN0ZWQsIGV4ZWN1dGlvbiB0aW1lIGlzIG5vdyBjaGFyZ2VkCi0ldG8gY29ycmVjdCBmdW5jdGlvbnMuCi0lCi0lXGl0ZW1bQWNjdXJhY3kgaW5jcmVhc2VkOl0KLSVQcm9maWxlciBleGVjdXRpb24gdGltZSBpcyBubyBsb25nZXIgY2hhcmdlZCB0byB1c2VyJ3MgY29kZSwKLSVjYWxpYnJhdGlvbiBmb3IgcGxhdGZvcm0gaXMgc3VwcG9ydGVkLCBmaWxlIHJlYWRzIGFyZSBub3QgZG9uZSBcZW1waHtieX0KLSVwcm9maWxlciBcZW1waHtkdXJpbmd9IHByb2ZpbGluZyAoYW5kIGNoYXJnZWQgdG8gdXNlcidzIGNvZGUhKS4KLSUKLSVcaXRlbVtTcGVlZCBpbmNyZWFzZWQ6XQotJU92ZXJoZWFkIENQVSBjb3N0IHdhcyByZWR1Y2VkIGJ5IG1vcmUgdGhhbiBhIGZhY3RvciBvZiB0d28gKHBlcmhhcHMgYQotJWZhY3RvciBvZiBmaXZlKSwgbGlnaHR3ZWlnaHQgcHJvZmlsZXIgbW9kdWxlIGlzIGFsbCB0aGF0IG11c3QgYmUKLSVsb2FkZWQsIGFuZCB0aGUgcmVwb3J0IGdlbmVyYXRpbmcgbW9kdWxlIChcbW9kdWxle3BzdGF0c30pIGlzIG5vdCBuZWVkZWQKLSVkdXJpbmcgcHJvZmlsaW5nLgotJQotJVxpdGVtW1JlY3Vyc2l2ZSBmdW5jdGlvbnMgc3VwcG9ydDpdCi0lQ3VtdWxhdGl2ZSB0aW1lcyBpbiByZWN1cnNpdmUgZnVuY3Rpb25zIGFyZSBjb3JyZWN0bHkgY2FsY3VsYXRlZDsKLSVyZWN1cnNpdmUgZW50cmllcyBhcmUgY291bnRlZC4KLSUKLSVcaXRlbVtMYXJnZSBncm93dGggaW4gcmVwb3J0IGdlbmVyYXRpbmcgVUk6XQotJURpc3RpbmN0IHByb2ZpbGVzIHJ1bnMgY2FuIGJlIGFkZGVkIHRvZ2V0aGVyIGZvcm1pbmcgYSBjb21wcmVoZW5zaXZlCi0lcmVwb3J0OyBmdW5jdGlvbnMgdGhhdCBpbXBvcnQgc3RhdGlzdGljcyB0YWtlIGFyYml0cmFyeSBsaXN0cyBvZgotJWZpbGVzOyBzb3J0aW5nIGNyaXRlcmlhIGlzIG5vdyBiYXNlZCBvbiBrZXl3b3JkcyAoaW5zdGVhZCBvZiA0IGludGVnZXIKLSVvcHRpb25zKTsgcmVwb3J0cyBzaG93cyB3aGF0IGZ1bmN0aW9ucyB3ZXJlIHByb2ZpbGVkIGFzIHdlbGwgYXMgd2hhdAotJXByb2ZpbGUgZmlsZSB3YXMgcmVmZXJlbmNlZDsgb3V0cHV0IGZvcm1hdCBoYXMgYmVlbiBpbXByb3ZlZC4KLSUKLSVcZW5ke2Rlc2NyaXB0aW9ufQotCi0KLVxzZWN0aW9ue0luc3RhbnQgVXNlcidzIE1hbnVhbCBcbGFiZWx7cHJvZmlsZS1pbnN0YW50fX0KLQotVGhpcyBzZWN0aW9uIGlzIHByb3ZpZGVkIGZvciB1c2VycyB0aGF0IGBgZG9uJ3Qgd2FudCB0byByZWFkIHRoZQotbWFudWFsLicnIEl0IHByb3ZpZGVzIGEgdmVyeSBicmllZiBvdmVydmlldywgYW5kIGFsbG93cyBhIHVzZXIgdG8KLXJhcGlkbHkgcGVyZm9ybSBwcm9maWxpbmcgb24gYW4gZXhpc3RpbmcgYXBwbGljYXRpb24uCi0KLVRvIHByb2ZpbGUgYW4gYXBwbGljYXRpb24gd2l0aCBhIG1haW4gZW50cnkgcG9pbnQgb2YgXGZ1bmN0aW9ue2ZvbygpfSwKLXlvdSB3b3VsZCBhZGQgdGhlIGZvbGxvd2luZyB0byB5b3VyIG1vZHVsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IGNQcm9maWxlCi1jUHJvZmlsZS5ydW4oJ2ZvbygpJykKLVxlbmR7dmVyYmF0aW19Ci0KLShVc2UgXG1vZHVsZXtwcm9maWxlfSBpbnN0ZWFkIG9mIFxtb2R1bGV7Y1Byb2ZpbGV9IGlmIHRoZSBsYXR0ZXIgaXMgbm90Ci1hdmFpbGFibGUgb24geW91ciBzeXN0ZW0uKQotCi1UaGUgYWJvdmUgYWN0aW9uIHdvdWxkIGNhdXNlIFxmdW5jdGlvbntmb28oKX0gdG8gYmUgcnVuLCBhbmQgYSBzZXJpZXMgb2YKLWluZm9ybWF0aXZlIGxpbmVzICh0aGUgcHJvZmlsZSkgdG8gYmUgcHJpbnRlZC4gIFRoZSBhYm92ZSBhcHByb2FjaCBpcwotbW9zdCB1c2VmdWwgd2hlbiB3b3JraW5nIHdpdGggdGhlIGludGVycHJldGVyLiAgSWYgeW91IHdvdWxkIGxpa2UgdG8KLXNhdmUgdGhlIHJlc3VsdHMgb2YgYSBwcm9maWxlIGludG8gYSBmaWxlIGZvciBsYXRlciBleGFtaW5hdGlvbiwgeW91Ci1jYW4gc3VwcGx5IGEgZmlsZSBuYW1lIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gdGhlIFxmdW5jdGlvbntydW4oKX0KLWZ1bmN0aW9uOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgY1Byb2ZpbGUKLWNQcm9maWxlLnJ1bignZm9vKCknLCAnZm9vcHJvZicpCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgZmlsZSBcZmlsZXtjUHJvZmlsZS5weX0gY2FuIGFsc28gYmUgaW52b2tlZCBhcwotYSBzY3JpcHQgdG8gcHJvZmlsZSBhbm90aGVyIHNjcmlwdC4gIEZvciBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1weXRob24gLW0gY1Byb2ZpbGUgbXlzY3JpcHQucHkKLVxlbmR7dmVyYmF0aW19Ci0KLVxmaWxle2NQcm9maWxlLnB5fSBhY2NlcHRzIHR3byBvcHRpb25hbCBhcmd1bWVudHMgb24gdGhlIGNvbW1hbmQgbGluZToKLQotXGJlZ2lue3ZlcmJhdGltfQotY1Byb2ZpbGUucHkgWy1vIG91dHB1dF9maWxlXSBbLXMgc29ydF9vcmRlcl0KLVxlbmR7dmVyYmF0aW19Ci0KLVxwcm9ncmFtb3B0ey1zfSBvbmx5IGFwcGxpZXMgdG8gc3RhbmRhcmQgb3V0cHV0IChccHJvZ3JhbW9wdHstb30gaXMKLW5vdCBzdXBwbGllZCkuICBMb29rIGluIHRoZSBcY2xhc3N7U3RhdHN9IGRvY3VtZW50YXRpb24gZm9yIHZhbGlkIHNvcnQKLXZhbHVlcy4KLQotV2hlbiB5b3Ugd2lzaCB0byByZXZpZXcgdGhlIHByb2ZpbGUsIHlvdSBzaG91bGQgdXNlIHRoZSBtZXRob2RzIGluIHRoZQotXG1vZHVsZXtwc3RhdHN9IG1vZHVsZS4gIFR5cGljYWxseSB5b3Ugd291bGQgbG9hZCB0aGUgc3RhdGlzdGljcyBkYXRhIGFzCi1mb2xsb3dzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgcHN0YXRzCi1wID0gcHN0YXRzLlN0YXRzKCdmb29wcm9mJykKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBjbGFzcyBcY2xhc3N7U3RhdHN9ICh0aGUgYWJvdmUgY29kZSBqdXN0IGNyZWF0ZWQgYW4gaW5zdGFuY2Ugb2YKLXRoaXMgY2xhc3MpIGhhcyBhIHZhcmlldHkgb2YgbWV0aG9kcyBmb3IgbWFuaXB1bGF0aW5nIGFuZCBwcmludGluZyB0aGUKLWRhdGEgdGhhdCB3YXMganVzdCByZWFkIGludG8gXGNvZGV7cH0uICBXaGVuIHlvdSByYW4KLVxmdW5jdGlvbntjUHJvZmlsZS5ydW4oKX0gYWJvdmUsIHdoYXQgd2FzIHByaW50ZWQgd2FzIHRoZSByZXN1bHQgb2YgdGhyZWUKLW1ldGhvZCBjYWxsczoKLQotXGJlZ2lue3ZlcmJhdGltfQotcC5zdHJpcF9kaXJzKCkuc29ydF9zdGF0cygtMSkucHJpbnRfc3RhdHMoKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGZpcnN0IG1ldGhvZCByZW1vdmVkIHRoZSBleHRyYW5lb3VzIHBhdGggZnJvbSBhbGwgdGhlIG1vZHVsZQotbmFtZXMuIFRoZSBzZWNvbmQgbWV0aG9kIHNvcnRlZCBhbGwgdGhlIGVudHJpZXMgYWNjb3JkaW5nIHRvIHRoZQotc3RhbmRhcmQgbW9kdWxlL2xpbmUvbmFtZSBzdHJpbmcgdGhhdCBpcyBwcmludGVkLgotJSh0aGlzIGlzIHRvIGNvbXBseSB3aXRoIHRoZSBzZW1hbnRpY3Mgb2YgdGhlIG9sZCBwcm9maWxlcikuCi1UaGUgdGhpcmQgbWV0aG9kIHByaW50ZWQgb3V0Ci1hbGwgdGhlIHN0YXRpc3RpY3MuICBZb3UgbWlnaHQgdHJ5IHRoZSBmb2xsb3dpbmcgc29ydCBjYWxsczoKLQotXGJlZ2lue3ZlcmJhdGltfQotcC5zb3J0X3N0YXRzKCduYW1lJykKLXAucHJpbnRfc3RhdHMoKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGZpcnN0IGNhbGwgd2lsbCBhY3R1YWxseSBzb3J0IHRoZSBsaXN0IGJ5IGZ1bmN0aW9uIG5hbWUsIGFuZCB0aGUKLXNlY29uZCBjYWxsIHdpbGwgcHJpbnQgb3V0IHRoZSBzdGF0aXN0aWNzLiAgVGhlIGZvbGxvd2luZyBhcmUgc29tZQotaW50ZXJlc3RpbmcgY2FsbHMgdG8gZXhwZXJpbWVudCB3aXRoOgotCi1cYmVnaW57dmVyYmF0aW19Ci1wLnNvcnRfc3RhdHMoJ2N1bXVsYXRpdmUnKS5wcmludF9zdGF0cygxMCkKLVxlbmR7dmVyYmF0aW19Ci0KLVRoaXMgc29ydHMgdGhlIHByb2ZpbGUgYnkgY3VtdWxhdGl2ZSB0aW1lIGluIGEgZnVuY3Rpb24sIGFuZCB0aGVuIG9ubHkKLXByaW50cyB0aGUgdGVuIG1vc3Qgc2lnbmlmaWNhbnQgbGluZXMuICBJZiB5b3Ugd2FudCB0byB1bmRlcnN0YW5kIHdoYXQKLWFsZ29yaXRobXMgYXJlIHRha2luZyB0aW1lLCB0aGUgYWJvdmUgbGluZSBpcyB3aGF0IHlvdSB3b3VsZCB1c2UuCi0KLUlmIHlvdSB3ZXJlIGxvb2tpbmcgdG8gc2VlIHdoYXQgZnVuY3Rpb25zIHdlcmUgbG9vcGluZyBhIGxvdCwgYW5kCi10YWtpbmcgYSBsb3Qgb2YgdGltZSwgeW91IHdvdWxkIGRvOgotCi1cYmVnaW57dmVyYmF0aW19Ci1wLnNvcnRfc3RhdHMoJ3RpbWUnKS5wcmludF9zdGF0cygxMCkKLVxlbmR7dmVyYmF0aW19Ci0KLXRvIHNvcnQgYWNjb3JkaW5nIHRvIHRpbWUgc3BlbnQgd2l0aGluIGVhY2ggZnVuY3Rpb24sIGFuZCB0aGVuIHByaW50Ci10aGUgc3RhdGlzdGljcyBmb3IgdGhlIHRvcCB0ZW4gZnVuY3Rpb25zLgotCi1Zb3UgbWlnaHQgYWxzbyB0cnk6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXAuc29ydF9zdGF0cygnZmlsZScpLnByaW50X3N0YXRzKCdfX2luaXRfXycpCi1cZW5ke3ZlcmJhdGltfQotCi1UaGlzIHdpbGwgc29ydCBhbGwgdGhlIHN0YXRpc3RpY3MgYnkgZmlsZSBuYW1lLCBhbmQgdGhlbiBwcmludCBvdXQKLXN0YXRpc3RpY3MgZm9yIG9ubHkgdGhlIGNsYXNzIGluaXQgbWV0aG9kcyAoc2luY2UgdGhleSBhcmUgc3BlbGxlZAotd2l0aCBcY29kZXtfX2luaXRfX30gaW4gdGhlbSkuICBBcyBvbmUgZmluYWwgZXhhbXBsZSwgeW91IGNvdWxkIHRyeToKLQotXGJlZ2lue3ZlcmJhdGltfQotcC5zb3J0X3N0YXRzKCd0aW1lJywgJ2N1bScpLnByaW50X3N0YXRzKC41LCAnaW5pdCcpCi1cZW5ke3ZlcmJhdGltfQotCi1UaGlzIGxpbmUgc29ydHMgc3RhdGlzdGljcyB3aXRoIGEgcHJpbWFyeSBrZXkgb2YgdGltZSwgYW5kIGEgc2Vjb25kYXJ5Ci1rZXkgb2YgY3VtdWxhdGl2ZSB0aW1lLCBhbmQgdGhlbiBwcmludHMgb3V0IHNvbWUgb2YgdGhlIHN0YXRpc3RpY3MuCi1UbyBiZSBzcGVjaWZpYywgdGhlIGxpc3QgaXMgZmlyc3QgY3VsbGVkIGRvd24gdG8gNTBcJSAocmU6IFxzYW1wey41fSkKLW9mIGl0cyBvcmlnaW5hbCBzaXplLCB0aGVuIG9ubHkgbGluZXMgY29udGFpbmluZyBcY29kZXtpbml0fSBhcmUKLW1haW50YWluZWQsIGFuZCB0aGF0IHN1Yi1zdWItbGlzdCBpcyBwcmludGVkLgotCi1JZiB5b3Ugd29uZGVyZWQgd2hhdCBmdW5jdGlvbnMgY2FsbGVkIHRoZSBhYm92ZSBmdW5jdGlvbnMsIHlvdSBjb3VsZAotbm93IChcY29kZXtwfSBpcyBzdGlsbCBzb3J0ZWQgYWNjb3JkaW5nIHRvIHRoZSBsYXN0IGNyaXRlcmlhKSBkbzoKLQotXGJlZ2lue3ZlcmJhdGltfQotcC5wcmludF9jYWxsZXJzKC41LCAnaW5pdCcpCi1cZW5ke3ZlcmJhdGltfQotCi1hbmQgeW91IHdvdWxkIGdldCBhIGxpc3Qgb2YgY2FsbGVycyBmb3IgZWFjaCBvZiB0aGUgbGlzdGVkIGZ1bmN0aW9ucy4KLQotSWYgeW91IHdhbnQgbW9yZSBmdW5jdGlvbmFsaXR5LCB5b3UncmUgZ29pbmcgdG8gaGF2ZSB0byByZWFkIHRoZQotbWFudWFsLCBvciBndWVzcyB3aGF0IHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGRvOgotCi1cYmVnaW57dmVyYmF0aW19Ci1wLnByaW50X2NhbGxlZXMoKQotcC5hZGQoJ2Zvb3Byb2YnKQotXGVuZHt2ZXJiYXRpbX0KLQotSW52b2tlZCBhcyBhIHNjcmlwdCwgdGhlIFxtb2R1bGV7cHN0YXRzfSBtb2R1bGUgaXMgYSBzdGF0aXN0aWNzCi1icm93c2VyIGZvciByZWFkaW5nIGFuZCBleGFtaW5pbmcgcHJvZmlsZSBkdW1wcy4gIEl0IGhhcyBhIHNpbXBsZQotbGluZS1vcmllbnRlZCBpbnRlcmZhY2UgKGltcGxlbWVudGVkIHVzaW5nIFxyZWZtb2R1bGV7Y21kfSkgYW5kCi1pbnRlcmFjdGl2ZSBoZWxwLgotCi1cc2VjdGlvbntXaGF0IElzIERldGVybWluaXN0aWMgUHJvZmlsaW5nP30KLVxub2RlbmFtZXtEZXRlcm1pbmlzdGljIFByb2ZpbGluZ30KLQotXGRmbntEZXRlcm1pbmlzdGljIHByb2ZpbGluZ30gaXMgbWVhbnQgdG8gcmVmbGVjdCB0aGUgZmFjdCB0aGF0IGFsbAotXGVtcGh7ZnVuY3Rpb24gY2FsbH0sIFxlbXBoe2Z1bmN0aW9uIHJldHVybn0sIGFuZCBcZW1waHtleGNlcHRpb259IGV2ZW50cwotYXJlIG1vbml0b3JlZCwgYW5kIHByZWNpc2UgdGltaW5ncyBhcmUgbWFkZSBmb3IgdGhlIGludGVydmFscyBiZXR3ZWVuCi10aGVzZSBldmVudHMgKGR1cmluZyB3aGljaCB0aW1lIHRoZSB1c2VyJ3MgY29kZSBpcyBleGVjdXRpbmcpLiAgSW4KLWNvbnRyYXN0LCBcZGZue3N0YXRpc3RpY2FsIHByb2ZpbGluZ30gKHdoaWNoIGlzIG5vdCBkb25lIGJ5IHRoaXMKLW1vZHVsZSkgcmFuZG9tbHkgc2FtcGxlcyB0aGUgZWZmZWN0aXZlIGluc3RydWN0aW9uIHBvaW50ZXIsIGFuZAotZGVkdWNlcyB3aGVyZSB0aW1lIGlzIGJlaW5nIHNwZW50LiAgVGhlIGxhdHRlciB0ZWNobmlxdWUgdHJhZGl0aW9uYWxseQotaW52b2x2ZXMgbGVzcyBvdmVyaGVhZCAoYXMgdGhlIGNvZGUgZG9lcyBub3QgbmVlZCB0byBiZSBpbnN0cnVtZW50ZWQpLAotYnV0IHByb3ZpZGVzIG9ubHkgcmVsYXRpdmUgaW5kaWNhdGlvbnMgb2Ygd2hlcmUgdGltZSBpcyBiZWluZyBzcGVudC4KLQotSW4gUHl0aG9uLCBzaW5jZSB0aGVyZSBpcyBhbiBpbnRlcnByZXRlciBhY3RpdmUgZHVyaW5nIGV4ZWN1dGlvbiwgdGhlCi1wcmVzZW5jZSBvZiBpbnN0cnVtZW50ZWQgY29kZSBpcyBub3QgcmVxdWlyZWQgdG8gZG8gZGV0ZXJtaW5pc3RpYwotcHJvZmlsaW5nLiAgUHl0aG9uIGF1dG9tYXRpY2FsbHkgcHJvdmlkZXMgYSBcZGZue2hvb2t9IChvcHRpb25hbAotY2FsbGJhY2spIGZvciBlYWNoIGV2ZW50LiAgSW4gYWRkaXRpb24sIHRoZSBpbnRlcnByZXRlZCBuYXR1cmUgb2YKLVB5dGhvbiB0ZW5kcyB0byBhZGQgc28gbXVjaCBvdmVyaGVhZCB0byBleGVjdXRpb24sIHRoYXQgZGV0ZXJtaW5pc3RpYwotcHJvZmlsaW5nIHRlbmRzIHRvIG9ubHkgYWRkIHNtYWxsIHByb2Nlc3Npbmcgb3ZlcmhlYWQgaW4gdHlwaWNhbAotYXBwbGljYXRpb25zLiAgVGhlIHJlc3VsdCBpcyB0aGF0IGRldGVybWluaXN0aWMgcHJvZmlsaW5nIGlzIG5vdCB0aGF0Ci1leHBlbnNpdmUsIHlldCBwcm92aWRlcyBleHRlbnNpdmUgcnVuIHRpbWUgc3RhdGlzdGljcyBhYm91dCB0aGUKLWV4ZWN1dGlvbiBvZiBhIFB5dGhvbiBwcm9ncmFtLgotCi1DYWxsIGNvdW50IHN0YXRpc3RpY3MgY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgYnVncyBpbiBjb2RlIChzdXJwcmlzaW5nCi1jb3VudHMpLCBhbmQgdG8gaWRlbnRpZnkgcG9zc2libGUgaW5saW5lLWV4cGFuc2lvbiBwb2ludHMgKGhpZ2ggY2FsbAotY291bnRzKS4gIEludGVybmFsIHRpbWUgc3RhdGlzdGljcyBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSBgYGhvdAotbG9vcHMnJyB0aGF0IHNob3VsZCBiZSBjYXJlZnVsbHkgb3B0aW1pemVkLiAgQ3VtdWxhdGl2ZSB0aW1lCi1zdGF0aXN0aWNzIHNob3VsZCBiZSB1c2VkIHRvIGlkZW50aWZ5IGhpZ2ggbGV2ZWwgZXJyb3JzIGluIHRoZQotc2VsZWN0aW9uIG9mIGFsZ29yaXRobXMuICBOb3RlIHRoYXQgdGhlIHVudXN1YWwgaGFuZGxpbmcgb2YgY3VtdWxhdGl2ZQotdGltZXMgaW4gdGhpcyBwcm9maWxlciBhbGxvd3Mgc3RhdGlzdGljcyBmb3IgcmVjdXJzaXZlIGltcGxlbWVudGF0aW9ucwotb2YgYWxnb3JpdGhtcyB0byBiZSBkaXJlY3RseSBjb21wYXJlZCB0byBpdGVyYXRpdmUgaW1wbGVtZW50YXRpb25zLgotCi0KLVxzZWN0aW9ue1JlZmVyZW5jZSBNYW51YWwgLS0gXG1vZHVsZXtwcm9maWxlfSBhbmQgXG1vZHVsZXtjUHJvZmlsZX19Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtwcm9maWxlfQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2NQcm9maWxlfQotXG1vZHVsZXN5bm9wc2lze1B5dGhvbiBwcm9maWxlcn0KLQotCi0KLVRoZSBwcmltYXJ5IGVudHJ5IHBvaW50IGZvciB0aGUgcHJvZmlsZXIgaXMgdGhlIGdsb2JhbCBmdW5jdGlvbgotXGZ1bmN0aW9ue3Byb2ZpbGUucnVuKCl9IChyZXNwLiBcZnVuY3Rpb257Y1Byb2ZpbGUucnVuKCl9KS4KLUl0IGlzIHR5cGljYWxseSB1c2VkIHRvIGNyZWF0ZSBhbnkgcHJvZmlsZQotaW5mb3JtYXRpb24uICBUaGUgcmVwb3J0cyBhcmUgZm9ybWF0dGVkIGFuZCBwcmludGVkIHVzaW5nIG1ldGhvZHMgb2YKLXRoZSBjbGFzcyBcY2xhc3N7cHN0YXRzLlN0YXRzfS4gIFRoZSBmb2xsb3dpbmcgaXMgYSBkZXNjcmlwdGlvbiBvZiBhbGwKLW9mIHRoZXNlIHN0YW5kYXJkIGVudHJ5IHBvaW50cyBhbmQgZnVuY3Rpb25zLiAgRm9yIGEgbW9yZSBpbi1kZXB0aAotdmlldyBvZiBzb21lIG9mIHRoZSBjb2RlLCBjb25zaWRlciByZWFkaW5nIHRoZSBsYXRlciBzZWN0aW9uIG9uCi1Qcm9maWxlciBFeHRlbnNpb25zLCB3aGljaCBpbmNsdWRlcyBkaXNjdXNzaW9uIG9mIGhvdyB0byBkZXJpdmUKLWBgYmV0dGVyJycgcHJvZmlsZXJzIGZyb20gdGhlIGNsYXNzZXMgcHJlc2VudGVkLCBvciByZWFkaW5nIHRoZSBzb3VyY2UKLWNvZGUgZm9yIHRoZXNlIG1vZHVsZXMuCi0KLVxiZWdpbntmdW5jZGVzY317cnVufXtjb21tYW5kXG9wdGlvbmFseywgZmlsZW5hbWV9fQotCi1UaGlzIGZ1bmN0aW9uIHRha2VzIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0aGUKLVxmdW5jdGlvbntleGVjKCl9IGZ1bmN0aW9uLCBhbmQgYW4gb3B0aW9uYWwgZmlsZSBuYW1lLiAgSW4gYWxsIGNhc2VzIHRoaXMKLXJvdXRpbmUgYXR0ZW1wdHMgdG8gXGZ1bmN0aW9ue2V4ZWMoKX0gaXRzIGZpcnN0IGFyZ3VtZW50LCBhbmQgZ2F0aGVyIHByb2ZpbGluZwotc3RhdGlzdGljcyBmcm9tIHRoZSBleGVjdXRpb24uIElmIG5vIGZpbGUgbmFtZSBpcyBwcmVzZW50LCB0aGVuIHRoaXMKLWZ1bmN0aW9uIGF1dG9tYXRpY2FsbHkgcHJpbnRzIGEgc2ltcGxlIHByb2ZpbGluZyByZXBvcnQsIHNvcnRlZCBieSB0aGUKLXN0YW5kYXJkIG5hbWUgc3RyaW5nIChmaWxlL2xpbmUvZnVuY3Rpb24tbmFtZSkgdGhhdCBpcyBwcmVzZW50ZWQgaW4KLWVhY2ggbGluZS4gIFRoZSBmb2xsb3dpbmcgaXMgYSB0eXBpY2FsIG91dHB1dCBmcm9tIHN1Y2ggYSBjYWxsOgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgICAyNzA2IGZ1bmN0aW9uIGNhbGxzICgyMDA0IHByaW1pdGl2ZSBjYWxscykgaW4gNC41MDQgQ1BVIHNlY29uZHMKLQotT3JkZXJlZCBieTogc3RhbmRhcmQgbmFtZQotCi1uY2FsbHMgIHRvdHRpbWUgIHBlcmNhbGwgIGN1bXRpbWUgIHBlcmNhbGwgZmlsZW5hbWU6bGluZW5vKGZ1bmN0aW9uKQotICAgICAyICAgIDAuMDA2ICAgIDAuMDAzICAgIDAuOTUzICAgIDAuNDc3IHBvYmplY3QucHk6NzUoc2F2ZV9vYmplY3RzKQotICA0My8zICAgIDAuNTMzICAgIDAuMDEyICAgIDAuNzQ5ICAgIDAuMjUwIHBvYmplY3QucHk6OTkoZXZhbHVhdGUpCi0gLi4uCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgZmlyc3QgbGluZSBpbmRpY2F0ZXMgdGhhdCAyNzA2IGNhbGxzIHdlcmUKLW1vbml0b3JlZC4gIE9mIHRob3NlIGNhbGxzLCAyMDA0IHdlcmUgXGRmbntwcmltaXRpdmV9LiAgV2UgZGVmaW5lCi1cZGZue3ByaW1pdGl2ZX0gdG8gbWVhbiB0aGF0IHRoZSBjYWxsIHdhcyBub3QgaW5kdWNlZCB2aWEgcmVjdXJzaW9uLgotVGhlIG5leHQgbGluZTogXGNvZGV7T3JkZXJlZCBieTpcIHN0YW5kYXJkIG5hbWV9LCBpbmRpY2F0ZXMgdGhhdAotdGhlIHRleHQgc3RyaW5nIGluIHRoZSBmYXIgcmlnaHQgY29sdW1uIHdhcyB1c2VkIHRvIHNvcnQgdGhlIG91dHB1dC4KLVRoZSBjb2x1bW4gaGVhZGluZ3MgaW5jbHVkZToKLQotXGJlZ2lue2Rlc2NyaXB0aW9ufQotCi1caXRlbVtuY2FsbHMgXQotZm9yIHRoZSBudW1iZXIgb2YgY2FsbHMsCi0KLVxpdGVtW3RvdHRpbWUgXQotZm9yIHRoZSB0b3RhbCB0aW1lIHNwZW50IGluIHRoZSBnaXZlbiBmdW5jdGlvbiAoYW5kIGV4Y2x1ZGluZyB0aW1lCi1tYWRlIGluIGNhbGxzIHRvIHN1Yi1mdW5jdGlvbnMpLAotCi1caXRlbVtwZXJjYWxsIF0KLWlzIHRoZSBxdW90aWVudCBvZiBcY29kZXt0b3R0aW1lfSBkaXZpZGVkIGJ5IFxjb2Rle25jYWxsc30KLQotXGl0ZW1bY3VtdGltZSBdCi1pcyB0aGUgdG90YWwgdGltZSBzcGVudCBpbiB0aGlzIGFuZCBhbGwgc3ViZnVuY3Rpb25zIChmcm9tIGludm9jYXRpb24KLXRpbGwgZXhpdCkuIFRoaXMgZmlndXJlIGlzIGFjY3VyYXRlIFxlbXBoe2V2ZW59IGZvciByZWN1cnNpdmUKLWZ1bmN0aW9ucy4KLQotXGl0ZW1bcGVyY2FsbCBdCi1pcyB0aGUgcXVvdGllbnQgb2YgXGNvZGV7Y3VtdGltZX0gZGl2aWRlZCBieSBwcmltaXRpdmUgY2FsbHMKLQotXGl0ZW1bZmlsZW5hbWU6bGluZW5vKGZ1bmN0aW9uKSBdCi1wcm92aWRlcyB0aGUgcmVzcGVjdGl2ZSBkYXRhIG9mIGVhY2ggZnVuY3Rpb24KLQotXGVuZHtkZXNjcmlwdGlvbn0KLQotV2hlbiB0aGVyZSBhcmUgdHdvIG51bWJlcnMgaW4gdGhlIGZpcnN0IGNvbHVtbiAoZm9yIGV4YW1wbGUsCi1cc2FtcHs0My8zfSksIHRoZW4gdGhlIGxhdHRlciBpcyB0aGUgbnVtYmVyIG9mIHByaW1pdGl2ZSBjYWxscywgYW5kCi10aGUgZm9ybWVyIGlzIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGNhbGxzLiAgTm90ZSB0aGF0IHdoZW4gdGhlIGZ1bmN0aW9uCi1kb2VzIG5vdCByZWN1cnNlLCB0aGVzZSB0d28gdmFsdWVzIGFyZSB0aGUgc2FtZSwgYW5kIG9ubHkgdGhlIHNpbmdsZQotZmlndXJlIGlzIHByaW50ZWQuCi0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cnVuY3R4fXtjb21tYW5kLCBnbG9iYWxzLCBsb2NhbHNcb3B0aW9uYWx7LCBmaWxlbmFtZX19Ci1UaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gXGZ1bmN0aW9ue3J1bigpfSwgd2l0aCBhZGRlZAotYXJndW1lbnRzIHRvIHN1cHBseSB0aGUgZ2xvYmFscyBhbmQgbG9jYWxzIGRpY3Rpb25hcmllcyBmb3IgdGhlCi1cdmFye2NvbW1hbmR9IHN0cmluZy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLUFuYWx5c2lzIG9mIHRoZSBwcm9maWxlciBkYXRhIGlzIGRvbmUgdXNpbmcgdGhlIFxjbGFzc3tTdGF0c30gY2xhc3MuCi0KLVxub3Rle1RoZSBcY2xhc3N7U3RhdHN9IGNsYXNzIGlzIGRlZmluZWQgaW4gdGhlIFxtb2R1bGV7cHN0YXRzfSBtb2R1bGUufQotCi0lIG5vdyBzd2l0Y2ggbW9kdWxlcy4uLi4KLSUgKFRoaXMgXHN0bW9kaW5kZXggdXNlIG1heSBiZSBoYXJkIHRvIGNoYW5nZSA7LSggKQotXHN0bW9kaW5kZXh7cHN0YXRzfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtTdGF0c317ZmlsZW5hbWVcb3B0aW9uYWx7LCBzdHJlYW09c3lzLnN0ZG91dFxvcHRpb25hbHssIFxtb3JlYXJnc319fQotVGhpcyBjbGFzcyBjb25zdHJ1Y3RvciBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIGEgYGBzdGF0aXN0aWNzIG9iamVjdCcnCi1mcm9tIGEgXHZhcntmaWxlbmFtZX0gKG9yIHNldCBvZiBmaWxlbmFtZXMpLiAgXGNsYXNze1N0YXRzfSBvYmplY3RzIGFyZQotbWFuaXB1bGF0ZWQgYnkgbWV0aG9kcywgaW4gb3JkZXIgdG8gcHJpbnQgdXNlZnVsIHJlcG9ydHMuICBZb3UgbWF5IHNwZWNpZnkKLWFuIGFsdGVybmF0ZSBvdXRwdXQgc3RyZWFtIGJ5IGdpdmluZyB0aGUga2V5d29yZCBhcmd1bWVudCwgXGNvZGV7c3RyZWFtfS4KLQotVGhlIGZpbGUgc2VsZWN0ZWQgYnkgdGhlIGFib3ZlIGNvbnN0cnVjdG9yIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgYnkgdGhlCi1jb3JyZXNwb25kaW5nIHZlcnNpb24gb2YgXG1vZHVsZXtwcm9maWxlfSBvciBcbW9kdWxle2NQcm9maWxlfS4gIFRvIGJlCi1zcGVjaWZpYywgdGhlcmUgaXMgXGVtcGh7bm99IGZpbGUgY29tcGF0aWJpbGl0eSBndWFyYW50ZWVkIHdpdGggZnV0dXJlCi12ZXJzaW9ucyBvZiB0aGlzIHByb2ZpbGVyLCBhbmQgdGhlcmUgaXMgbm8gY29tcGF0aWJpbGl0eSB3aXRoIGZpbGVzIHByb2R1Y2VkCi1ieSBvdGhlciBwcm9maWxlcnMuCi0lKHN1Y2ggYXMgdGhlIG9sZCBzeXN0ZW0gcHJvZmlsZXIpLgotCi1JZiBzZXZlcmFsIGZpbGVzIGFyZSBwcm92aWRlZCwgYWxsIHRoZSBzdGF0aXN0aWNzIGZvciBpZGVudGljYWwKLWZ1bmN0aW9ucyB3aWxsIGJlIGNvYWxlc2NlZCwgc28gdGhhdCBhbiBvdmVyYWxsIHZpZXcgb2Ygc2V2ZXJhbAotcHJvY2Vzc2VzIGNhbiBiZSBjb25zaWRlcmVkIGluIGEgc2luZ2xlIHJlcG9ydC4gIElmIGFkZGl0aW9uYWwgZmlsZXMKLW5lZWQgdG8gYmUgY29tYmluZWQgd2l0aCBkYXRhIGluIGFuIGV4aXN0aW5nIFxjbGFzc3tTdGF0c30gb2JqZWN0LCB0aGUKLVxtZXRob2R7YWRkKCl9IG1ldGhvZCBjYW4gYmUgdXNlZC4KLQotXHZlcnNpb25jaGFuZ2VkW1RoZSBcdmFye3N0cmVhbX0gcGFyYW1ldGVyIHdhcyBhZGRlZF17Mi41fQotXGVuZHtjbGFzc2Rlc2N9Ci0KLQotXHN1YnNlY3Rpb257VGhlIFxjbGFzc3tTdGF0c30gQ2xhc3MgXGxhYmVse3Byb2ZpbGUtc3RhdHN9fQotCi1cY2xhc3N7U3RhdHN9IG9iamVjdHMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtTdGF0c117c3RyaXBfZGlyc317fQotVGhpcyBtZXRob2QgZm9yIHRoZSBcY2xhc3N7U3RhdHN9IGNsYXNzIHJlbW92ZXMgYWxsIGxlYWRpbmcgcGF0aAotaW5mb3JtYXRpb24gZnJvbSBmaWxlIG5hbWVzLiAgSXQgaXMgdmVyeSB1c2VmdWwgaW4gcmVkdWNpbmcgdGhlIHNpemUKLW9mIHRoZSBwcmludG91dCB0byBmaXQgd2l0aGluIChjbG9zZSB0bykgODAgY29sdW1ucy4gIFRoaXMgbWV0aG9kCi1tb2RpZmllcyB0aGUgb2JqZWN0LCBhbmQgdGhlIHN0cmlwcGVkIGluZm9ybWF0aW9uIGlzIGxvc3QuICBBZnRlcgotcGVyZm9ybWluZyBhIHN0cmlwIG9wZXJhdGlvbiwgdGhlIG9iamVjdCBpcyBjb25zaWRlcmVkIHRvIGhhdmUgaXRzCi1lbnRyaWVzIGluIGEgYGByYW5kb20nJyBvcmRlciwgYXMgaXQgd2FzIGp1c3QgYWZ0ZXIgb2JqZWN0Ci1pbml0aWFsaXphdGlvbiBhbmQgbG9hZGluZy4gIElmIFxtZXRob2R7c3RyaXBfZGlycygpfSBjYXVzZXMgdHdvCi1mdW5jdGlvbiBuYW1lcyB0byBiZSBpbmRpc3Rpbmd1aXNoYWJsZSAodGhleSBhcmUgb24gdGhlIHNhbWUKLWxpbmUgb2YgdGhlIHNhbWUgZmlsZW5hbWUsIGFuZCBoYXZlIHRoZSBzYW1lIGZ1bmN0aW9uIG5hbWUpLCB0aGVuIHRoZQotc3RhdGlzdGljcyBmb3IgdGhlc2UgdHdvIGVudHJpZXMgYXJlIGFjY3VtdWxhdGVkIGludG8gYSBzaW5nbGUgZW50cnkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLQotXGJlZ2lue21ldGhvZGRlc2N9W1N0YXRzXXthZGR9e2ZpbGVuYW1lXG9wdGlvbmFseywgXG1vcmVhcmdzfX0KLVRoaXMgbWV0aG9kIG9mIHRoZSBcY2xhc3N7U3RhdHN9IGNsYXNzIGFjY3VtdWxhdGVzIGFkZGl0aW9uYWwKLXByb2ZpbGluZyBpbmZvcm1hdGlvbiBpbnRvIHRoZSBjdXJyZW50IHByb2ZpbGluZyBvYmplY3QuICBJdHMKLWFyZ3VtZW50cyBzaG91bGQgcmVmZXIgdG8gZmlsZW5hbWVzIGNyZWF0ZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcKLXZlcnNpb24gb2YgXGZ1bmN0aW9ue3Byb2ZpbGUucnVuKCl9IG9yIFxmdW5jdGlvbntjUHJvZmlsZS5ydW4oKX0uCi1TdGF0aXN0aWNzIGZvciBpZGVudGljYWxseSBuYW1lZAotKHJlOiBmaWxlLCBsaW5lLCBuYW1lKSBmdW5jdGlvbnMgYXJlIGF1dG9tYXRpY2FsbHkgYWNjdW11bGF0ZWQgaW50bwotc2luZ2xlIGZ1bmN0aW9uIHN0YXRpc3RpY3MuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtTdGF0c117ZHVtcF9zdGF0c317ZmlsZW5hbWV9Ci1TYXZlIHRoZSBkYXRhIGxvYWRlZCBpbnRvIHRoZSBcY2xhc3N7U3RhdHN9IG9iamVjdCB0byBhIGZpbGUgbmFtZWQKLVx2YXJ7ZmlsZW5hbWV9LiAgVGhlIGZpbGUgaXMgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdCBleGlzdCwgYW5kIGlzCi1vdmVyd3JpdHRlbiBpZiBpdCBhbHJlYWR5IGV4aXN0cy4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgbWV0aG9kIG9mCi10aGUgc2FtZSBuYW1lIG9uIHRoZSBcY2xhc3N7cHJvZmlsZS5Qcm9maWxlfSBhbmQKLVxjbGFzc3tjUHJvZmlsZS5Qcm9maWxlfSBjbGFzc2VzLgotXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtTdGF0c117c29ydF9zdGF0c317a2V5XG9wdGlvbmFseywgXG1vcmVhcmdzfX0KLVRoaXMgbWV0aG9kIG1vZGlmaWVzIHRoZSBcY2xhc3N7U3RhdHN9IG9iamVjdCBieSBzb3J0aW5nIGl0IGFjY29yZGluZwotdG8gdGhlIHN1cHBsaWVkIGNyaXRlcmlhLiAgVGhlIGFyZ3VtZW50IGlzIHR5cGljYWxseSBhIHN0cmluZwotaWRlbnRpZnlpbmcgdGhlIGJhc2lzIG9mIGEgc29ydCAoZXhhbXBsZTogXGNvZGV7J3RpbWUnfSBvcgotXGNvZGV7J25hbWUnfSkuCi0KLVdoZW4gbW9yZSB0aGFuIG9uZSBrZXkgaXMgcHJvdmlkZWQsIHRoZW4gYWRkaXRpb25hbCBrZXlzIGFyZSB1c2VkIGFzCi1zZWNvbmRhcnkgY3JpdGVyaWEgd2hlbiB0aGVyZSBpcyBlcXVhbGl0eSBpbiBhbGwga2V5cyBzZWxlY3RlZAotYmVmb3JlIHRoZW0uICBGb3IgZXhhbXBsZSwgXGNvZGV7c29ydF9zdGF0cygnbmFtZScsICdmaWxlJyl9IHdpbGwgc29ydAotYWxsIHRoZSBlbnRyaWVzIGFjY29yZGluZyB0byB0aGVpciBmdW5jdGlvbiBuYW1lLCBhbmQgcmVzb2x2ZSBhbGwgdGllcwotKGlkZW50aWNhbCBmdW5jdGlvbiBuYW1lcykgYnkgc29ydGluZyBieSBmaWxlIG5hbWUuCi0KLUFiYnJldmlhdGlvbnMgY2FuIGJlIHVzZWQgZm9yIGFueSBrZXkgbmFtZXMsIGFzIGxvbmcgYXMgdGhlCi1hYmJyZXZpYXRpb24gaXMgdW5hbWJpZ3VvdXMuICBUaGUgZm9sbG93aW5nIGFyZSB0aGUga2V5cyBjdXJyZW50bHkKLWRlZmluZWQ6Ci0KLVxiZWdpbnt0YWJsZWlpfXtsfGx9e2NvZGV9e1ZhbGlkIEFyZ317TWVhbmluZ30KLSAgXGxpbmVpaXsnY2FsbHMnfXtjYWxsIGNvdW50fQotICBcbGluZWlpeydjdW11bGF0aXZlJ317Y3VtdWxhdGl2ZSB0aW1lfQotICBcbGluZWlpeydmaWxlJ317ZmlsZSBuYW1lfQotICBcbGluZWlpeydtb2R1bGUnfXtmaWxlIG5hbWV9Ci0gIFxsaW5laWl7J3BjYWxscyd9e3ByaW1pdGl2ZSBjYWxsIGNvdW50fQotICBcbGluZWlpeydsaW5lJ317bGluZSBudW1iZXJ9Ci0gIFxsaW5laWl7J25hbWUnfXtmdW5jdGlvbiBuYW1lfQotICBcbGluZWlpeyduZmwnfXtuYW1lL2ZpbGUvbGluZX0KLSAgXGxpbmVpaXsnc3RkbmFtZSd9e3N0YW5kYXJkIG5hbWV9Ci0gIFxsaW5laWl7J3RpbWUnfXtpbnRlcm5hbCB0aW1lfQotXGVuZHt0YWJsZWlpfQotCi1Ob3RlIHRoYXQgYWxsIHNvcnRzIG9uIHN0YXRpc3RpY3MgYXJlIGluIGRlc2NlbmRpbmcgb3JkZXIgKHBsYWNpbmcKLW1vc3QgdGltZSBjb25zdW1pbmcgaXRlbXMgZmlyc3QpLCB3aGVyZSBhcyBuYW1lLCBmaWxlLCBhbmQgbGluZSBudW1iZXIKLXNlYXJjaGVzIGFyZSBpbiBhc2NlbmRpbmcgb3JkZXIgKGFscGhhYmV0aWNhbCkuIFRoZSBzdWJ0bGUKLWRpc3RpbmN0aW9uIGJldHdlZW4gXGNvZGV7J25mbCd9IGFuZCBcY29kZXsnc3RkbmFtZSd9IGlzIHRoYXQgdGhlCi1zdGFuZGFyZCBuYW1lIGlzIGEgc29ydCBvZiB0aGUgbmFtZSBhcyBwcmludGVkLCB3aGljaCBtZWFucyB0aGF0IHRoZQotZW1iZWRkZWQgbGluZSBudW1iZXJzIGdldCBjb21wYXJlZCBpbiBhbiBvZGQgd2F5LiAgRm9yIGV4YW1wbGUsIGxpbmVzCi0zLCAyMCwgYW5kIDQwIHdvdWxkIChpZiB0aGUgZmlsZSBuYW1lcyB3ZXJlIHRoZSBzYW1lKSBhcHBlYXIgaW4gdGhlCi1zdHJpbmcgb3JkZXIgMjAsIDMgYW5kIDQwLiAgSW4gY29udHJhc3QsIFxjb2RleyduZmwnfSBkb2VzIGEgbnVtZXJpYwotY29tcGFyZSBvZiB0aGUgbGluZSBudW1iZXJzLiAgSW4gZmFjdCwgXGNvZGV7c29ydF9zdGF0cygnbmZsJyl9IGlzIHRoZQotc2FtZSBhcyBcY29kZXtzb3J0X3N0YXRzKCduYW1lJywgJ2ZpbGUnLCAnbGluZScpfS4KLQotJUZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZCBwcm9maWxlciwKLUZvciBiYWNrd2FyZC1jb21wYXRpYmlsaXR5IHJlYXNvbnMsIHRoZSBudW1lcmljIGFyZ3VtZW50cwotXGNvZGV7LTF9LCBcY29kZXswfSwgXGNvZGV7MX0sIGFuZCBcY29kZXsyfSBhcmUgcGVybWl0dGVkLiAgVGhleSBhcmUKLWludGVycHJldGVkIGFzIFxjb2RleydzdGRuYW1lJ30sIFxjb2RleydjYWxscyd9LCBcY29kZXsndGltZSd9LCBhbmQKLVxjb2RleydjdW11bGF0aXZlJ30gcmVzcGVjdGl2ZWx5LiAgSWYgdGhpcyBvbGQgc3R5bGUgZm9ybWF0IChudW1lcmljKQotaXMgdXNlZCwgb25seSBvbmUgc29ydCBrZXkgKHRoZSBudW1lcmljIGtleSkgd2lsbCBiZSB1c2VkLCBhbmQKLWFkZGl0aW9uYWwgYXJndW1lbnRzIHdpbGwgYmUgc2lsZW50bHkgaWdub3JlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cYmVnaW57bWV0aG9kZGVzY31bU3RhdHNde3JldmVyc2Vfb3JkZXJ9e30KLVRoaXMgbWV0aG9kIGZvciB0aGUgXGNsYXNze1N0YXRzfSBjbGFzcyByZXZlcnNlcyB0aGUgb3JkZXJpbmcgb2YgdGhlIGJhc2ljCi1saXN0IHdpdGhpbiB0aGUgb2JqZWN0LiAgJVRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIHByaW1hcmlseSBmb3IKLSVjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZCBwcm9maWxlci4KLU5vdGUgdGhhdCBieSBkZWZhdWx0IGFzY2VuZGluZyB2cyBkZXNjZW5kaW5nIG9yZGVyIGlzIHByb3Blcmx5IHNlbGVjdGVkCi1iYXNlZCBvbiB0aGUgc29ydCBrZXkgb2YgY2hvaWNlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bU3RhdHNde3ByaW50X3N0YXRzfXtcb3B0aW9uYWx7cmVzdHJpY3Rpb24sIFxtb3JlYXJnc319Ci1UaGlzIG1ldGhvZCBmb3IgdGhlIFxjbGFzc3tTdGF0c30gY2xhc3MgcHJpbnRzIG91dCBhIHJlcG9ydCBhcyBkZXNjcmliZWQKLWluIHRoZSBcZnVuY3Rpb257cHJvZmlsZS5ydW4oKX0gZGVmaW5pdGlvbi4KLQotVGhlIG9yZGVyIG9mIHRoZSBwcmludGluZyBpcyBiYXNlZCBvbiB0aGUgbGFzdCBcbWV0aG9ke3NvcnRfc3RhdHMoKX0KLW9wZXJhdGlvbiBkb25lIG9uIHRoZSBvYmplY3QgKHN1YmplY3QgdG8gY2F2ZWF0cyBpbiBcbWV0aG9ke2FkZCgpfSBhbmQKLVxtZXRob2R7c3RyaXBfZGlycygpfSkuCi0KLVRoZSBhcmd1bWVudHMgcHJvdmlkZWQgKGlmIGFueSkgY2FuIGJlIHVzZWQgdG8gbGltaXQgdGhlIGxpc3QgZG93biB0bwotdGhlIHNpZ25pZmljYW50IGVudHJpZXMuICBJbml0aWFsbHksIHRoZSBsaXN0IGlzIHRha2VuIHRvIGJlIHRoZQotY29tcGxldGUgc2V0IG9mIHByb2ZpbGVkIGZ1bmN0aW9ucy4gIEVhY2ggcmVzdHJpY3Rpb24gaXMgZWl0aGVyIGFuCi1pbnRlZ2VyICh0byBzZWxlY3QgYSBjb3VudCBvZiBsaW5lcyksIG9yIGEgZGVjaW1hbCBmcmFjdGlvbiBiZXR3ZWVuCi0wLjAgYW5kIDEuMCBpbmNsdXNpdmUgKHRvIHNlbGVjdCBhIHBlcmNlbnRhZ2Ugb2YgbGluZXMpLCBvciBhIHJlZ3VsYXIKLWV4cHJlc3Npb24gKHRvIHBhdHRlcm4gbWF0Y2ggdGhlIHN0YW5kYXJkIG5hbWUgdGhhdCBpcyBwcmludGVkOyBhcyBvZgotUHl0aG9uIDEuNWIxLCB0aGlzIHVzZXMgdGhlIFBlcmwtc3R5bGUgcmVndWxhciBleHByZXNzaW9uIHN5bnRheAotZGVmaW5lZCBieSB0aGUgXHJlZm1vZHVsZXtyZX0gbW9kdWxlKS4gIElmIHNldmVyYWwgcmVzdHJpY3Rpb25zIGFyZQotcHJvdmlkZWQsIHRoZW4gdGhleSBhcmUgYXBwbGllZCBzZXF1ZW50aWFsbHkuICBGb3IgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotcHJpbnRfc3RhdHMoLjEsICdmb286JykKLVxlbmR7dmVyYmF0aW19Ci0KLXdvdWxkIGZpcnN0IGxpbWl0IHRoZSBwcmludGluZyB0byBmaXJzdCAxMFwlIG9mIGxpc3QsIGFuZCB0aGVuIG9ubHkKLXByaW50IGZ1bmN0aW9ucyB0aGF0IHdlcmUgcGFydCBvZiBmaWxlbmFtZSBcZmlsZXsuKmZvbzp9LiAgSW4KLWNvbnRyYXN0LCB0aGUgY29tbWFuZDoKLQotXGJlZ2lue3ZlcmJhdGltfQotcHJpbnRfc3RhdHMoJ2ZvbzonLCAuMSkKLVxlbmR7dmVyYmF0aW19Ci0KLXdvdWxkIGxpbWl0IHRoZSBsaXN0IHRvIGFsbCBmdW5jdGlvbnMgaGF2aW5nIGZpbGUgbmFtZXMgXGZpbGV7Lipmb286fSwKLWFuZCB0aGVuIHByb2NlZWQgdG8gb25seSBwcmludCB0aGUgZmlyc3QgMTBcJSBvZiB0aGVtLgotXGVuZHttZXRob2RkZXNjfQotCi0KLVxiZWdpbnttZXRob2RkZXNjfVtTdGF0c117cHJpbnRfY2FsbGVyc317XG9wdGlvbmFse3Jlc3RyaWN0aW9uLCBcbW9yZWFyZ3N9fQotVGhpcyBtZXRob2QgZm9yIHRoZSBcY2xhc3N7U3RhdHN9IGNsYXNzIHByaW50cyBhIGxpc3Qgb2YgYWxsIGZ1bmN0aW9ucwotdGhhdCBjYWxsZWQgZWFjaCBmdW5jdGlvbiBpbiB0aGUgcHJvZmlsZWQgZGF0YWJhc2UuICBUaGUgb3JkZXJpbmcgaXMKLWlkZW50aWNhbCB0byB0aGF0IHByb3ZpZGVkIGJ5IFxtZXRob2R7cHJpbnRfc3RhdHMoKX0sIGFuZCB0aGUgZGVmaW5pdGlvbgotb2YgdGhlIHJlc3RyaWN0aW5nIGFyZ3VtZW50IGlzIGFsc28gaWRlbnRpY2FsLiAgRWFjaCBjYWxsZXIgaXMgcmVwb3J0ZWQgb24KLWl0cyBvd24gbGluZS4gIFRoZSBmb3JtYXQgZGlmZmVycyBzbGlnaHRseSBkZXBlbmRpbmcgb24gdGhlIHByb2ZpbGVyIHRoYXQKLXByb2R1Y2VkIHRoZSBzdGF0czoKLQotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSBXaXRoIFxtb2R1bGV7cHJvZmlsZX0sIGEgbnVtYmVyIGlzIHNob3duIGluIHBhcmVudGhlc2VzIGFmdGVyIGVhY2gKLSAgY2FsbGVyIHRvIHNob3cgaG93IG1hbnkgdGltZXMgdGhpcyBzcGVjaWZpYyBjYWxsIHdhcyBtYWRlLiAgRm9yCi0gIGNvbnZlbmllbmNlLCBhIHNlY29uZCBub24tcGFyZW50aGVzaXplZCBudW1iZXIgcmVwZWF0cyB0aGUgY3VtdWxhdGl2ZQotICB0aW1lIHNwZW50IGluIHRoZSBmdW5jdGlvbiBhdCB0aGUgcmlnaHQuCi0KLVxpdGVtIFdpdGggXG1vZHVsZXtjUHJvZmlsZX0sIGVhY2ggY2FsbGVyIGlzIHByZWNlZWRlZCBieSB0aHJlZSBudW1iZXJzOgotICB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgc3BlY2lmaWMgY2FsbCB3YXMgbWFkZSwgYW5kIHRoZSB0b3RhbCBhbmQKLSAgY3VtdWxhdGl2ZSB0aW1lcyBzcGVudCBpbiB0aGUgY3VycmVudCBmdW5jdGlvbiB3aGlsZSBpdCB3YXMgaW52b2tlZCBieQotICB0aGlzIHNwZWNpZmljIGNhbGxlci4KLVxlbmR7aXRlbWl6ZX0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1N0YXRzXXtwcmludF9jYWxsZWVzfXtcb3B0aW9uYWx7cmVzdHJpY3Rpb24sIFxtb3JlYXJnc319Ci1UaGlzIG1ldGhvZCBmb3IgdGhlIFxjbGFzc3tTdGF0c30gY2xhc3MgcHJpbnRzIGEgbGlzdCBvZiBhbGwgZnVuY3Rpb24KLXRoYXQgd2VyZSBjYWxsZWQgYnkgdGhlIGluZGljYXRlZCBmdW5jdGlvbi4gIEFzaWRlIGZyb20gdGhpcyByZXZlcnNhbAotb2YgZGlyZWN0aW9uIG9mIGNhbGxzIChyZTogY2FsbGVkIHZzIHdhcyBjYWxsZWQgYnkpLCB0aGUgYXJndW1lbnRzIGFuZAotb3JkZXJpbmcgYXJlIGlkZW50aWNhbCB0byB0aGUgXG1ldGhvZHtwcmludF9jYWxsZXJzKCl9IG1ldGhvZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cc2VjdGlvbntMaW1pdGF0aW9ucyBcbGFiZWx7cHJvZmlsZS1saW1pdHN9fQotCi1PbmUgbGltaXRhdGlvbiBoYXMgdG8gZG8gd2l0aCBhY2N1cmFjeSBvZiB0aW1pbmcgaW5mb3JtYXRpb24uCi1UaGVyZSBpcyBhIGZ1bmRhbWVudGFsIHByb2JsZW0gd2l0aCBkZXRlcm1pbmlzdGljIHByb2ZpbGVycyBpbnZvbHZpbmcKLWFjY3VyYWN5LiAgVGhlIG1vc3Qgb2J2aW91cyByZXN0cmljdGlvbiBpcyB0aGF0IHRoZSB1bmRlcmx5aW5nIGBgY2xvY2snJwotaXMgb25seSB0aWNraW5nIGF0IGEgcmF0ZSAodHlwaWNhbGx5KSBvZiBhYm91dCAuMDAxIHNlY29uZHMuICBIZW5jZSBubwotbWVhc3VyZW1lbnRzIHdpbGwgYmUgbW9yZSBhY2N1cmF0ZSB0aGFuIHRoZSB1bmRlcmx5aW5nIGNsb2NrLiAgSWYKLWVub3VnaCBtZWFzdXJlbWVudHMgYXJlIHRha2VuLCB0aGVuIHRoZSBgYGVycm9yJycgd2lsbCB0ZW5kIHRvIGF2ZXJhZ2UKLW91dC4gVW5mb3J0dW5hdGVseSwgcmVtb3ZpbmcgdGhpcyBmaXJzdCBlcnJvciBpbmR1Y2VzIGEgc2Vjb25kIHNvdXJjZQotb2YgZXJyb3IuCi0KLVRoZSBzZWNvbmQgcHJvYmxlbSBpcyB0aGF0IGl0IGBgdGFrZXMgYSB3aGlsZScnIGZyb20gd2hlbiBhbiBldmVudCBpcwotZGlzcGF0Y2hlZCB1bnRpbCB0aGUgcHJvZmlsZXIncyBjYWxsIHRvIGdldCB0aGUgdGltZSBhY3R1YWxseQotXGVtcGh7Z2V0c30gdGhlIHN0YXRlIG9mIHRoZSBjbG9jay4gIFNpbWlsYXJseSwgdGhlcmUgaXMgYSBjZXJ0YWluIGxhZwotd2hlbiBleGl0aW5nIHRoZSBwcm9maWxlciBldmVudCBoYW5kbGVyIGZyb20gdGhlIHRpbWUgdGhhdCB0aGUgY2xvY2sncwotdmFsdWUgd2FzIG9idGFpbmVkIChhbmQgdGhlbiBzcXVpcnJlbGVkIGF3YXkpLCB1bnRpbCB0aGUgdXNlcidzIGNvZGUKLWlzIG9uY2UgYWdhaW4gZXhlY3V0aW5nLiAgQXMgYSByZXN1bHQsIGZ1bmN0aW9ucyB0aGF0IGFyZSBjYWxsZWQgbWFueQotdGltZXMsIG9yIGNhbGwgbWFueSBmdW5jdGlvbnMsIHdpbGwgdHlwaWNhbGx5IGFjY3VtdWxhdGUgdGhpcyBlcnJvci4KLVRoZSBlcnJvciB0aGF0IGFjY3VtdWxhdGVzIGluIHRoaXMgZmFzaGlvbiBpcyB0eXBpY2FsbHkgbGVzcyB0aGFuIHRoZQotYWNjdXJhY3kgb2YgdGhlIGNsb2NrIChsZXNzIHRoYW4gb25lIGNsb2NrIHRpY2spLCBidXQgaXQKLVxlbXBoe2Nhbn0gYWNjdW11bGF0ZSBhbmQgYmVjb21lIHZlcnkgc2lnbmlmaWNhbnQuCi0KLVRoZSBwcm9ibGVtIGlzIG1vcmUgaW1wb3J0YW50IHdpdGggXG1vZHVsZXtwcm9maWxlfSB0aGFuIHdpdGggdGhlCi1sb3dlci1vdmVyaGVhZCBcbW9kdWxle2NQcm9maWxlfS4gIEZvciB0aGlzIHJlYXNvbiwgXG1vZHVsZXtwcm9maWxlfQotcHJvdmlkZXMgYSBtZWFucyBvZiBjYWxpYnJhdGluZyBpdHNlbGYgZm9yIGEgZ2l2ZW4gcGxhdGZvcm0gc28gdGhhdAotdGhpcyBlcnJvciBjYW4gYmUgcHJvYmFiaWxpc3RpY2FsbHkgKG9uIHRoZSBhdmVyYWdlKSByZW1vdmVkLgotQWZ0ZXIgdGhlIHByb2ZpbGVyIGlzIGNhbGlicmF0ZWQsIGl0IHdpbGwgYmUgbW9yZSBhY2N1cmF0ZSAoaW4gYSBsZWFzdAotc3F1YXJlIHNlbnNlKSwgYnV0IGl0IHdpbGwgc29tZXRpbWVzIHByb2R1Y2UgbmVnYXRpdmUgbnVtYmVycyAod2hlbgotY2FsbCBjb3VudHMgYXJlIGV4Y2VwdGlvbmFsbHkgbG93LCBhbmQgdGhlIGdvZHMgb2YgcHJvYmFiaWxpdHkgd29yawotYWdhaW5zdCB5b3UgOi0pLiApICBEbyBcZW1waHtub3R9IGJlIGFsYXJtZWQgYnkgbmVnYXRpdmUgbnVtYmVycyBpbgotdGhlIHByb2ZpbGUuICBUaGV5IHNob3VsZCBcZW1waHtvbmx5fSBhcHBlYXIgaWYgeW91IGhhdmUgY2FsaWJyYXRlZAoteW91ciBwcm9maWxlciwgYW5kIHRoZSByZXN1bHRzIGFyZSBhY3R1YWxseSBiZXR0ZXIgdGhhbiB3aXRob3V0Ci1jYWxpYnJhdGlvbi4KLQotCi1cc2VjdGlvbntDYWxpYnJhdGlvbiBcbGFiZWx7cHJvZmlsZS1jYWxpYnJhdGlvbn19Ci0KLVRoZSBwcm9maWxlciBvZiB0aGUgXG1vZHVsZXtwcm9maWxlfSBtb2R1bGUgc3VidHJhY3RzIGEgY29uc3RhbnQgZnJvbSBlYWNoCi1ldmVudCBoYW5kbGluZyB0aW1lIHRvIGNvbXBlbnNhdGUgZm9yIHRoZSBvdmVyaGVhZCBvZiBjYWxsaW5nIHRoZSB0aW1lCi1mdW5jdGlvbiwgYW5kIHNvY2tpbmcgYXdheSB0aGUgcmVzdWx0cy4gIEJ5IGRlZmF1bHQsIHRoZSBjb25zdGFudCBpcyAwLgotVGhlIGZvbGxvd2luZyBwcm9jZWR1cmUgY2FuCi1iZSB1c2VkIHRvIG9idGFpbiBhIGJldHRlciBjb25zdGFudCBmb3IgYSBnaXZlbiBwbGF0Zm9ybSAoc2VlIGRpc2N1c3Npb24KLWluIHNlY3Rpb24gTGltaXRhdGlvbnMgYWJvdmUpLgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgcHJvZmlsZQotcHIgPSBwcm9maWxlLlByb2ZpbGUoKQotZm9yIGkgaW4gcmFuZ2UoNSk6Ci0gICAgcHJpbnQgcHIuY2FsaWJyYXRlKDEwMDAwKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIG1ldGhvZCBleGVjdXRlcyB0aGUgbnVtYmVyIG9mIFB5dGhvbiBjYWxscyBnaXZlbiBieSB0aGUgYXJndW1lbnQsCi1kaXJlY3RseSBhbmQgYWdhaW4gdW5kZXIgdGhlIHByb2ZpbGVyLCBtZWFzdXJpbmcgdGhlIHRpbWUgZm9yIGJvdGguCi1JdCB0aGVuIGNvbXB1dGVzIHRoZSBoaWRkZW4gb3ZlcmhlYWQgcGVyIHByb2ZpbGVyIGV2ZW50LCBhbmQgcmV0dXJucwotdGhhdCBhcyBhIGZsb2F0LiAgRm9yIGV4YW1wbGUsIG9uIGFuIDgwMCBNSHogUGVudGl1bSBydW5uaW5nCi1XaW5kb3dzIDIwMDAsIGFuZCB1c2luZyBQeXRob24ncyB0aW1lLmNsb2NrKCkgYXMgdGhlIHRpbWVyLAotdGhlIG1hZ2ljYWwgbnVtYmVyIGlzIGFib3V0IDEyLjVlLTYuCi0KLVRoZSBvYmplY3Qgb2YgdGhpcyBleGVyY2lzZSBpcyB0byBnZXQgYSBmYWlybHkgY29uc2lzdGVudCByZXN1bHQuCi1JZiB5b3VyIGNvbXB1dGVyIGlzIFxlbXBoe3Zlcnl9IGZhc3QsIG9yIHlvdXIgdGltZXIgZnVuY3Rpb24gaGFzIHBvb3IKLXJlc29sdXRpb24sIHlvdSBtaWdodCBoYXZlIHRvIHBhc3MgMTAwMDAwLCBvciBldmVuIDEwMDAwMDAsIHRvIGdldAotY29uc2lzdGVudCByZXN1bHRzLgotCi1XaGVuIHlvdSBoYXZlIGEgY29uc2lzdGVudCBhbnN3ZXIsCi10aGVyZSBhcmUgdGhyZWUgd2F5cyB5b3UgY2FuIHVzZSBpdDpcZm9vdG5vdGV7UHJpb3IgdG8gUHl0aG9uIDIuMiwgaXQKLSAgd2FzIG5lY2Vzc2FyeSB0byBlZGl0IHRoZSBwcm9maWxlciBzb3VyY2UgY29kZSB0byBlbWJlZCB0aGUgYmlhcyBhcwotICBhIGxpdGVyYWwgbnVtYmVyLiAgWW91IHN0aWxsIGNhbiwgYnV0IHRoYXQgbWV0aG9kIGlzIG5vIGxvbmdlcgotICBkZXNjcmliZWQsIGJlY2F1c2Ugbm8gbG9uZ2VyIG5lZWRlZC59Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCBwcm9maWxlCi0KLSMgMS4gQXBwbHkgY29tcHV0ZWQgYmlhcyB0byBhbGwgUHJvZmlsZSBpbnN0YW5jZXMgY3JlYXRlZCBoZXJlYWZ0ZXIuCi1wcm9maWxlLlByb2ZpbGUuYmlhcyA9IHlvdXJfY29tcHV0ZWRfYmlhcwotCi0jIDIuIEFwcGx5IGNvbXB1dGVkIGJpYXMgdG8gYSBzcGVjaWZpYyBQcm9maWxlIGluc3RhbmNlLgotcHIgPSBwcm9maWxlLlByb2ZpbGUoKQotcHIuYmlhcyA9IHlvdXJfY29tcHV0ZWRfYmlhcwotCi0jIDMuIFNwZWNpZnkgY29tcHV0ZWQgYmlhcyBpbiBpbnN0YW5jZSBjb25zdHJ1Y3Rvci4KLXByID0gcHJvZmlsZS5Qcm9maWxlKGJpYXM9eW91cl9jb21wdXRlZF9iaWFzKQotXGVuZHt2ZXJiYXRpbX0KLQotSWYgeW91IGhhdmUgYSBjaG9pY2UsIHlvdSBhcmUgYmV0dGVyIG9mZiBjaG9vc2luZyBhIHNtYWxsZXIgY29uc3RhbnQsIGFuZAotdGhlbiB5b3VyIHJlc3VsdHMgd2lsbCBgYGxlc3Mgb2Z0ZW4nJyBzaG93IHVwIGFzIG5lZ2F0aXZlIGluIHByb2ZpbGUKLXN0YXRpc3RpY3MuCi0KLQotXHNlY3Rpb257RXh0ZW5zaW9ucyAtLS0gRGVyaXZpbmcgQmV0dGVyIFByb2ZpbGVyc30KLVxub2RlbmFtZXtQcm9maWxlciBFeHRlbnNpb25zfQotCi1UaGUgXGNsYXNze1Byb2ZpbGV9IGNsYXNzIG9mIGJvdGggbW9kdWxlcywgXG1vZHVsZXtwcm9maWxlfSBhbmQKLVxtb2R1bGV7Y1Byb2ZpbGV9LCB3ZXJlIHdyaXR0ZW4gc28gdGhhdAotZGVyaXZlZCBjbGFzc2VzIGNvdWxkIGJlIGRldmVsb3BlZCB0byBleHRlbmQgdGhlIHByb2ZpbGVyLiAgVGhlIGRldGFpbHMKLWFyZSBub3QgZGVzY3JpYmVkIGhlcmUsIGFzIGRvaW5nIHRoaXMgc3VjY2Vzc2Z1bGx5IHJlcXVpcmVzIGFuIGV4cGVydAotdW5kZXJzdGFuZGluZyBvZiBob3cgdGhlIFxjbGFzc3tQcm9maWxlfSBjbGFzcyB3b3JrcyBpbnRlcm5hbGx5LiAgU3R1ZHkKLXRoZSBzb3VyY2UgY29kZSBvZiB0aGUgbW9kdWxlIGNhcmVmdWxseSBpZiB5b3Ugd2FudCB0bwotcHVyc3VlIHRoaXMuCi0KLUlmIGFsbCB5b3Ugd2FudCB0byBkbyBpcyBjaGFuZ2UgaG93IGN1cnJlbnQgdGltZSBpcyBkZXRlcm1pbmVkIChmb3IKLWV4YW1wbGUsIHRvIGZvcmNlIHVzZSBvZiB3YWxsLWNsb2NrIHRpbWUgb3IgZWxhcHNlZCBwcm9jZXNzIHRpbWUpLAotcGFzcyB0aGUgdGltaW5nIGZ1bmN0aW9uIHlvdSB3YW50IHRvIHRoZSBcY2xhc3N7UHJvZmlsZX0gY2xhc3MKLWNvbnN0cnVjdG9yOgotCi1cYmVnaW57dmVyYmF0aW19Ci1wciA9IHByb2ZpbGUuUHJvZmlsZSh5b3VyX3RpbWVfZnVuYykKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSByZXN1bHRpbmcgcHJvZmlsZXIgd2lsbCB0aGVuIGNhbGwgXGZ1bmN0aW9ue3lvdXJfdGltZV9mdW5jKCl9LgotCi1cYmVnaW57ZGVzY3JpcHRpb259Ci1caXRlbVtcY2xhc3N7cHJvZmlsZS5Qcm9maWxlfV0KLVxmdW5jdGlvbnt5b3VyX3RpbWVfZnVuYygpfSBzaG91bGQgcmV0dXJuIGEgc2luZ2xlIG51bWJlciwgb3IgYSBsaXN0IG9mCi1udW1iZXJzIHdob3NlIHN1bSBpcyB0aGUgY3VycmVudCB0aW1lIChsaWtlIHdoYXQgXGZ1bmN0aW9ue29zLnRpbWVzKCl9Ci1yZXR1cm5zKS4gIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgc2luZ2xlIHRpbWUgbnVtYmVyLCBvciB0aGUgbGlzdCBvZgotcmV0dXJuZWQgbnVtYmVycyBoYXMgbGVuZ3RoIDIsIHRoZW4geW91IHdpbGwgZ2V0IGFuIGVzcGVjaWFsbHkgZmFzdAotdmVyc2lvbiBvZiB0aGUgZGlzcGF0Y2ggcm91dGluZS4KLQotQmUgd2FybmVkIHRoYXQgeW91IHNob3VsZCBjYWxpYnJhdGUgdGhlIHByb2ZpbGVyIGNsYXNzIGZvciB0aGUKLXRpbWVyIGZ1bmN0aW9uIHRoYXQgeW91IGNob29zZS4gIEZvciBtb3N0IG1hY2hpbmVzLCBhIHRpbWVyIHRoYXQKLXJldHVybnMgYSBsb25lIGludGVnZXIgdmFsdWUgd2lsbCBwcm92aWRlIHRoZSBiZXN0IHJlc3VsdHMgaW4gdGVybXMgb2YKLWxvdyBvdmVyaGVhZCBkdXJpbmcgcHJvZmlsaW5nLiAgKFxmdW5jdGlvbntvcy50aW1lcygpfSBpcwotXGVtcGh7cHJldHR5fSBiYWQsIGFzIGl0IHJldHVybnMgYSB0dXBsZSBvZiBmbG9hdGluZyBwb2ludCB2YWx1ZXMpLiAgSWYKLXlvdSB3YW50IHRvIHN1YnN0aXR1dGUgYSBiZXR0ZXIgdGltZXIgaW4gdGhlIGNsZWFuZXN0IGZhc2hpb24sCi1kZXJpdmUgYSBjbGFzcyBhbmQgaGFyZHdpcmUgYSByZXBsYWNlbWVudCBkaXNwYXRjaCBtZXRob2QgdGhhdCBiZXN0Ci1oYW5kbGVzIHlvdXIgdGltZXIgY2FsbCwgYWxvbmcgd2l0aCB0aGUgYXBwcm9wcmlhdGUgY2FsaWJyYXRpb24KLWNvbnN0YW50LgotCi1caXRlbVtcY2xhc3N7Y1Byb2ZpbGUuUHJvZmlsZX1dCi1cZnVuY3Rpb257eW91cl90aW1lX2Z1bmMoKX0gc2hvdWxkIHJldHVybiBhIHNpbmdsZSBudW1iZXIuICBJZiBpdCByZXR1cm5zCi1wbGFpbiBpbnRlZ2VycywgeW91IGNhbiBhbHNvIGludm9rZSB0aGUgY2xhc3MgY29uc3RydWN0b3Igd2l0aCBhIHNlY29uZAotYXJndW1lbnQgc3BlY2lmeWluZyB0aGUgcmVhbCBkdXJhdGlvbiBvZiBvbmUgdW5pdCBvZiB0aW1lLiAgRm9yIGV4YW1wbGUsCi1pZiBcZnVuY3Rpb257eW91cl9pbnRlZ2VyX3RpbWVfZnVuYygpfSByZXR1cm5zIHRpbWVzIG1lYXN1cmVkIGluIHRob3VzYW5kcwotb2Ygc2Vjb25kcywgeW91IHdvdWxkIGNvbnN0dWN0IHRoZSBcY2xhc3N7UHJvZmlsZX0gaW5zdGFuY2UgYXMgZm9sbG93czoKLQotXGJlZ2lue3ZlcmJhdGltfQotcHIgPSBwcm9maWxlLlByb2ZpbGUoeW91cl9pbnRlZ2VyX3RpbWVfZnVuYywgMC4wMDEpCi1cZW5ke3ZlcmJhdGltfQotCi1BcyB0aGUgXG1vZHVsZXtjUHJvZmlsZS5Qcm9maWxlfSBjbGFzcyBjYW5ub3QgYmUgY2FsaWJyYXRlZCwgY3VzdG9tCi10aW1lciBmdW5jdGlvbnMgc2hvdWxkIGJlIHVzZWQgd2l0aCBjYXJlIGFuZCBzaG91bGQgYmUgYXMgZmFzdCBhcwotcG9zc2libGUuICBGb3IgdGhlIGJlc3QgcmVzdWx0cyB3aXRoIGEgY3VzdG9tIHRpbWVyLCBpdCBtaWdodCBiZQotbmVjZXNzYXJ5IHRvIGhhcmQtY29kZSBpdCBpbiB0aGUgQyBzb3VyY2Ugb2YgdGhlIGludGVybmFsCi1cbW9kdWxle19sc3Byb2Z9IG1vZHVsZS4KLQotXGVuZHtkZXNjcmlwdGlvbn0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlicHR5LnRleCBiL0RvYy9saWIvbGlicHR5LnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRiNzUwMy4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnB0eS50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3B0eX0gLS0tCi0gICAgICAgICBQc2V1ZG8tdGVybWluYWwgdXRpbGl0aWVzfQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e3B0eX0KLSAgXHBsYXRmb3Jte0lSSVgsIExpbnV4fQotXG1vZHVsZXN5bm9wc2lze1BzZXVkby1UZXJtaW5hbCBIYW5kbGluZyBmb3IgU0dJIGFuZCBMaW51eC59Ci1cbW9kdWxlYXV0aG9ye1N0ZWVuIEx1bWhvbHR9e30KLVxzZWN0aW9uYXV0aG9ye01vc2hlIFphZGthfXttb3NoZXpAemFka2Euc2l0ZS5jby5pbH0KLQotCi1UaGUgXG1vZHVsZXtwdHl9IG1vZHVsZSBkZWZpbmVzIG9wZXJhdGlvbnMgZm9yIGhhbmRsaW5nIHRoZQotcHNldWRvLXRlcm1pbmFsIGNvbmNlcHQ6IHN0YXJ0aW5nIGFub3RoZXIgcHJvY2VzcyBhbmQgYmVpbmcgYWJsZSB0bwotd3JpdGUgdG8gYW5kIHJlYWQgZnJvbSBpdHMgY29udHJvbGxpbmcgdGVybWluYWwgcHJvZ3JhbW1hdGljYWxseS4KLQotQmVjYXVzZSBwc2V1ZG8tdGVybWluYWwgaGFuZGxpbmcgaXMgaGlnaGx5IHBsYXRmb3JtIGRlcGVuZGFudCwgdGhlcmUKLWlzIGNvZGUgdG8gZG8gaXQgb25seSBmb3IgU0dJIGFuZCBMaW51eC4gKFRoZSBMaW51eCBjb2RlIGlzIHN1cHBvc2VkCi10byB3b3JrIG9uIG90aGVyIHBsYXRmb3JtcywgYnV0IGhhc24ndCBiZWVuIHRlc3RlZCB5ZXQuKQotCi1UaGUgXG1vZHVsZXtwdHl9IG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgotCi1cYmVnaW57ZnVuY2Rlc2N9e2Zvcmt9e30KLUZvcmsuIENvbm5lY3QgdGhlIGNoaWxkJ3MgY29udHJvbGxpbmcgdGVybWluYWwgdG8gYSBwc2V1ZG8tdGVybWluYWwuCi1SZXR1cm4gdmFsdWUgaXMgXGNvZGV7KFx2YXJ7cGlkfSwgXHZhcntmZH0pfS4gTm90ZSB0aGF0IHRoZSBjaGlsZCAKLWdldHMgXHZhcntwaWR9IDAsIGFuZCB0aGUgXHZhcntmZH0gaXMgXGVtcGh7aW52YWxpZH0uIFRoZSBwYXJlbnQncwotcmV0dXJuIHZhbHVlIGlzIHRoZSBcdmFye3BpZH0gb2YgdGhlIGNoaWxkLCBhbmQgXHZhcntmZH0gaXMgYSBmaWxlCi1kZXNjcmlwdG9yIGNvbm5lY3RlZCB0byB0aGUgY2hpbGQncyBjb250cm9sbGluZyB0ZXJtaW5hbCAoYW5kIGFsc28KLXRvIHRoZSBjaGlsZCdzIHN0YW5kYXJkIGlucHV0IGFuZCBvdXRwdXQpLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtvcGVucHR5fXt9Ci1PcGVuIGEgbmV3IHBzZXVkby10ZXJtaW5hbCBwYWlyLCB1c2luZyBcZnVuY3Rpb257b3Mub3BlbnB0eSgpfSBpZgotcG9zc2libGUsIG9yIGVtdWxhdGlvbiBjb2RlIGZvciBTR0kgYW5kIGdlbmVyaWMgXFVOSVh7fSBzeXN0ZW1zLgotUmV0dXJuIGEgcGFpciBvZiBmaWxlIGRlc2NyaXB0b3JzIFxjb2RleyhcdmFye21hc3Rlcn0sIFx2YXJ7c2xhdmV9KX0sCi1mb3IgdGhlIG1hc3RlciBhbmQgdGhlIHNsYXZlIGVuZCwgcmVzcGVjdGl2ZWx5LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzcGF3bn17YXJndlxvcHRpb25hbHssIG1hc3Rlcl9yZWFkXG9wdGlvbmFseywgc3RkaW5fcmVhZH19fQotU3Bhd24gYSBwcm9jZXNzLCBhbmQgY29ubmVjdCBpdHMgY29udHJvbGxpbmcgdGVybWluYWwgd2l0aCB0aGUgY3VycmVudCAKLXByb2Nlc3MncyBzdGFuZGFyZCBpby4gVGhpcyBpcyBvZnRlbiB1c2VkIHRvIGJhZmZsZSBwcm9ncmFtcyB3aGljaAotaW5zaXN0IG9uIHJlYWRpbmcgZnJvbSB0aGUgY29udHJvbGxpbmcgdGVybWluYWwuCi0KLVRoZSBmdW5jdGlvbnMgXHZhcnttYXN0ZXJfcmVhZH0gYW5kIFx2YXJ7c3RkaW5fcmVhZH0gc2hvdWxkIGJlCi1mdW5jdGlvbnMgd2hpY2ggcmVhZCBmcm9tIGEgZmlsZS1kZXNjcmlwdG9yLiBUaGUgZGVmYXVsdHMgdHJ5IHRvIHJlYWQKLTEwMjQgYnl0ZXMgZWFjaCB0aW1lIHRoZXkgYXJlIGNhbGxlZC4KLVxlbmR7ZnVuY2Rlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnB3ZC50ZXggYi9Eb2MvbGliL2xpYnB3ZC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNzRkMjYuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJwd2QudGV4CisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtwd2R9IC0tLQotICAgICAgICAgVGhlIHBhc3N3b3JkIGRhdGFiYXNlfQotCi1cZGVjbGFyZW1vZHVsZXtidWlsdGlufXtwd2R9Ci0gIFxwbGF0Zm9ybXtVbml4fQotXG1vZHVsZXN5bm9wc2lze1RoZSBwYXNzd29yZCBkYXRhYmFzZSAoXGZ1bmN0aW9ue2dldHB3bmFtKCl9IGFuZCBmcmllbmRzKS59Ci0KLVRoaXMgbW9kdWxlIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgXFVOSVh7fSB1c2VyIGFjY291bnQgYW5kIHBhc3N3b3JkCi1kYXRhYmFzZS4gIEl0IGlzIGF2YWlsYWJsZSBvbiBhbGwgXFVOSVh7fSB2ZXJzaW9ucy4KLQotUGFzc3dvcmQgZGF0YWJhc2UgZW50cmllcyBhcmUgcmVwb3J0ZWQgYXMgYSB0dXBsZS1saWtlIG9iamVjdCwgd2hvc2UKLWF0dHJpYnV0ZXMgY29ycmVzcG9uZCB0byB0aGUgbWVtYmVycyBvZiB0aGUgXGNvZGV7cGFzc3dkfSBzdHJ1Y3R1cmUKLShBdHRyaWJ1dGUgZmllbGQgYmVsb3csIHNlZSBcY29kZXs8cHdkLmg+fSk6Ci0KLVxiZWdpbnt0YWJsZWlpaX17cnxsfGx9e3RleHRybX17SW5kZXh9e0F0dHJpYnV0ZX17TWVhbmluZ30KLSAgXGxpbmVpaWl7MH17XGNvZGV7cHdfbmFtZX19e0xvZ2luIG5hbWV9Ci0gIFxsaW5laWlpezF9e1xjb2Rle3B3X3Bhc3N3ZH19e09wdGlvbmFsIGVuY3J5cHRlZCBwYXNzd29yZH0KLSAgXGxpbmVpaWl7Mn17XGNvZGV7cHdfdWlkfX17TnVtZXJpY2FsIHVzZXIgSUR9Ci0gIFxsaW5laWlpezN9e1xjb2Rle3B3X2dpZH19e051bWVyaWNhbCBncm91cCBJRH0KLSAgXGxpbmVpaWl7NH17XGNvZGV7cHdfZ2Vjb3N9fXtVc2VyIG5hbWUgb3IgY29tbWVudCBmaWVsZH0KLSAgXGxpbmVpaWl7NX17XGNvZGV7cHdfZGlyfX17VXNlciBob21lIGRpcmVjdG9yeX0KLSAgXGxpbmVpaWl7Nn17XGNvZGV7cHdfc2hlbGx9fXtVc2VyIGNvbW1hbmQgaW50ZXJwcmV0ZXJ9Ci1cZW5ke3RhYmxlaWlpfQotCi1UaGUgdWlkIGFuZCBnaWQgaXRlbXMgYXJlIGludGVnZXJzLCBhbGwgb3RoZXJzIGFyZSBzdHJpbmdzLgotXGV4Y2VwdGlvbntLZXlFcnJvcn0gaXMgcmFpc2VkIGlmIHRoZSBlbnRyeSBhc2tlZCBmb3IgY2Fubm90IGJlIGZvdW5kLgotCi1cbm90ZXtJbiB0cmFkaXRpb25hbCBcVU5JWHt9IHRoZSBmaWVsZCBcY29kZXtwd19wYXNzd2R9IHVzdWFsbHkKLWNvbnRhaW5zIGEgcGFzc3dvcmQgZW5jcnlwdGVkIHdpdGggYSBERVMgZGVyaXZlZCBhbGdvcml0aG0gKHNlZSBtb2R1bGUKLVxyZWZtb2R1bGV7Y3J5cHR9XHJlZmJpbW9kaW5kZXh7Y3J5cHR9KS4gIEhvd2V2ZXIgbW9zdCBtb2Rlcm4gdW5pY2VzIAotdXNlIGEgc28tY2FsbGVkIFxlbXBoe3NoYWRvdyBwYXNzd29yZH0gc3lzdGVtLiAgT24gdGhvc2UgdW5pY2VzIHRoZQotXHZhcntwd19wYXNzd2R9IGZpZWxkIG9ubHkgY29udGFpbnMgYW4gYXN0ZXJpc2sgKFxjb2RleycqJ30pIG9yIHRoZSAKLWxldHRlciBcY2hhcmFjdGVye3h9IHdoZXJlIHRoZSBlbmNyeXB0ZWQgcGFzc3dvcmQgaXMgc3RvcmVkIGluIGEgZmlsZQotXGZpbGV7L2V0Yy9zaGFkb3d9IHdoaWNoIGlzIG5vdCB3b3JsZCByZWFkYWJsZS4gIFdoZXRoZXIgdGhlIFx2YXJ7cHdfcGFzc3dkfQotZmllbGQgY29udGFpbnMgYW55dGhpbmcgdXNlZnVsIGlzIHN5c3RlbS1kZXBlbmRlbnQuICBJZiBhdmFpbGFibGUsIHRoZQotXG1vZHVsZXtzcHdkfSBtb2R1bGUgc2hvdWxkIGJlIHVzZWQgd2hlcmUgYWNjZXNzIHRvIHRoZSBlbmNyeXB0ZWQgcGFzc3dvcmQKLWlzIHJlcXVpcmVkLn0KLQotSXQgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGl0ZW1zOgotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldHB3dWlkfXt1aWR9Ci1SZXR1cm4gdGhlIHBhc3N3b3JkIGRhdGFiYXNlIGVudHJ5IGZvciB0aGUgZ2l2ZW4gbnVtZXJpYyB1c2VyIElELgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRwd25hbX17bmFtZX0KLVJldHVybiB0aGUgcGFzc3dvcmQgZGF0YWJhc2UgZW50cnkgZm9yIHRoZSBnaXZlbiB1c2VyIG5hbWUuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldHB3YWxsfXt9Ci1SZXR1cm4gYSBsaXN0IG9mIGFsbCBhdmFpbGFibGUgcGFzc3dvcmQgZGF0YWJhc2UgZW50cmllcywgaW4gYXJiaXRyYXJ5IG9yZGVyLgotXGVuZHtmdW5jZGVzY30KLQotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZW1vZHVsZXtncnB9e0FuIGludGVyZmFjZSB0byB0aGUgZ3JvdXAgZGF0YWJhc2UsIHNpbWlsYXIgdG8gdGhpcy59Ci0gIFxzZWVtb2R1bGV7c3B3ZH17QW4gaW50ZXJmYWNlIHRvIHRoZSBzaGFkb3cgcGFzc3dvcmQgZGF0YWJhc2UsIHNpbWlsYXIgdG8gdGhpcy59Ci1cZW5ke3NlZWFsc299CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnB5Y2xici50ZXggYi9Eb2MvbGliL2xpYnB5Y2xici50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZWRiOWUuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJweWNsYnIudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7cHljbGJyfSAtLS0KLSAgICAgICAgIFB5dGhvbiBjbGFzcyBicm93c2VyIHN1cHBvcnR9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtweWNsYnJ9Ci1cbW9kdWxlc3lub3BzaXN7U3VwcG9ydHMgaW5mb3JtYXRpb24gZXh0cmFjdGlvbiBmb3IgYSBQeXRob24gY2xhc3MKLSAgICAgICAgICAgICAgICBicm93c2VyLn0KLVxzZWN0aW9uYXV0aG9ye0ZyZWQgTC4gRHJha2UsIEpyLn17ZmRyYWtlQGFjbS5vcmd9Ci0KLQotVGhlIFxtb2R1bGV7cHljbGJyfSBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgc29tZSBsaW1pdGVkIGluZm9ybWF0aW9uCi1hYm91dCB0aGUgY2xhc3NlcywgbWV0aG9kcyBhbmQgdG9wLWxldmVsIGZ1bmN0aW9ucwotZGVmaW5lZCBpbiBhIG1vZHVsZS4gIFRoZSBpbmZvcm1hdGlvbgotcHJvdmlkZWQgaXMgc3VmZmljaWVudCB0byBpbXBsZW1lbnQgYSB0cmFkaXRpb25hbCB0aHJlZS1wYW5lIGNsYXNzCi1icm93c2VyLiAgVGhlIGluZm9ybWF0aW9uIGlzIGV4dHJhY3RlZCBmcm9tIHRoZSBzb3VyY2UgY29kZSByYXRoZXIKLXRoYW4gYnkgaW1wb3J0aW5nIHRoZSBtb2R1bGUsIHNvIHRoaXMgbW9kdWxlIGlzIHNhZmUgdG8gdXNlIHdpdGgKLXVudHJ1c3RlZCBzb3VyY2UgY29kZS4gIFRoaXMgcmVzdHJpY3Rpb24gbWFrZXMgaXQgaW1wb3NzaWJsZSB0byB1c2UKLXRoaXMgbW9kdWxlIHdpdGggbW9kdWxlcyBub3QgaW1wbGVtZW50ZWQgaW4gUHl0aG9uLCBpbmNsdWRpbmcgbWFueQotc3RhbmRhcmQgYW5kIG9wdGlvbmFsIGV4dGVuc2lvbiBtb2R1bGVzLgotCi0KLVxiZWdpbntmdW5jZGVzY317cmVhZG1vZHVsZX17bW9kdWxlXG9wdGlvbmFseywgcGF0aH19Ci0gICUgVGhlICdpbnBhY2thZ2UnIHBhcmFtZXRlciBhcHBlYXJzIHRvIGJlIGZvciBpbnRlcm5hbCB1c2Ugb25seS4uLi4KLSAgUmVhZCBhIG1vZHVsZSBhbmQgcmV0dXJuIGEgZGljdGlvbmFyeSBtYXBwaW5nIGNsYXNzIG5hbWVzIHRvIGNsYXNzCi0gIGRlc2NyaXB0b3Igb2JqZWN0cy4gIFRoZSBwYXJhbWV0ZXIgXHZhcnttb2R1bGV9IHNob3VsZCBiZSB0aGUgbmFtZQotICBvZiBhIG1vZHVsZSBhcyBhIHN0cmluZzsgaXQgbWF5IGJlIHRoZSBuYW1lIG9mIGEgbW9kdWxlIHdpdGhpbiBhCi0gIHBhY2thZ2UuICBUaGUgXHZhcntwYXRofSBwYXJhbWV0ZXIgc2hvdWxkIGJlIGEgc2VxdWVuY2UsIGFuZCBpcyB1c2VkCi0gIHRvIGF1Z21lbnQgdGhlIHZhbHVlIG9mIFxjb2Rle3N5cy5wYXRofSwgd2hpY2ggaXMgdXNlZCB0byBsb2NhdGUKLSAgbW9kdWxlIHNvdXJjZSBjb2RlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtyZWFkbW9kdWxlX2V4fXttb2R1bGVcb3B0aW9uYWx7LCBwYXRofX0KLSAgJSBUaGUgJ2lucGFja2FnZScgcGFyYW1ldGVyIGFwcGVhcnMgdG8gYmUgZm9yIGludGVybmFsIHVzZSBvbmx5Li4uLgotICBMaWtlIFxmdW5jdGlvbntyZWFkbW9kdWxlKCl9LCBidXQgdGhlIHJldHVybmVkIGRpY3Rpb25hcnksIGluIGFkZGl0aW9uCi0gIHRvIG1hcHBpbmcgY2xhc3MgbmFtZXMgdG8gY2xhc3MgZGVzY3JpcHRvciBvYmplY3RzLCBhbHNvIG1hcHMKLSAgdG9wLWxldmVsIGZ1bmN0aW9uIG5hbWVzIHRvIGZ1bmN0aW9uIGRlc2NyaXB0b3Igb2JqZWN0cy4gIE1vcmVvdmVyLCBpZgotICB0aGUgbW9kdWxlIGJlaW5nIHJlYWQgaXMgYSBwYWNrYWdlLCB0aGUga2V5IFxjb2RleydfX3BhdGhfXyd9IGluIHRoZQotICByZXR1cm5lZCBkaWN0aW9uYXJ5IGhhcyBhcyBpdHMgdmFsdWUgYSBsaXN0IHdoaWNoIGNvbnRhaW5zIHRoZSBwYWNrYWdlCi0gIHNlYXJjaCBwYXRoLgotXGVuZHtmdW5jZGVzY30KLQotCi1cc3Vic2VjdGlvbntDbGFzcyBEZXNjcmlwdG9yIE9iamVjdHMgXGxhYmVse3B5Y2xici1jbGFzcy1vYmplY3RzfX0KLQotVGhlIGNsYXNzIGRlc2NyaXB0b3Igb2JqZWN0cyB1c2VkIGFzIHZhbHVlcyBpbiB0aGUgZGljdGlvbmFyeSByZXR1cm5lZAotYnkgXGZ1bmN0aW9ue3JlYWRtb2R1bGUoKX0gYW5kIFxmdW5jdGlvbntyZWFkbW9kdWxlX2V4KCl9Ci1wcm92aWRlIHRoZSBmb2xsb3dpbmcgZGF0YSBtZW1iZXJzOgotCi0KLVxiZWdpbnttZW1iZXJkZXNjfVtjbGFzcyBkZXNjcmlwdG9yXXttb2R1bGV9Ci0gIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgZGVmaW5pbmcgdGhlIGNsYXNzIGRlc2NyaWJlZCBieSB0aGUgY2xhc3MKLSAgZGVzY3JpcHRvci4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W2NsYXNzIGRlc2NyaXB0b3Jde25hbWV9Ci0gIFRoZSBuYW1lIG9mIHRoZSBjbGFzcy4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W2NsYXNzIGRlc2NyaXB0b3Jde3N1cGVyfQotICBBIGxpc3Qgb2YgY2xhc3MgZGVzY3JpcHRvcnMgd2hpY2ggZGVzY3JpYmUgdGhlIGltbWVkaWF0ZSBiYXNlCi0gIGNsYXNzZXMgb2YgdGhlIGNsYXNzIGJlaW5nIGRlc2NyaWJlZC4gIENsYXNzZXMgd2hpY2ggYXJlIG5hbWVkIGFzCi0gIHN1cGVyY2xhc3NlcyBidXQgd2hpY2ggYXJlIG5vdCBkaXNjb3ZlcmFibGUgYnkKLSAgXGZ1bmN0aW9ue3JlYWRtb2R1bGUoKX0gYXJlIGxpc3RlZCBhcyBhIHN0cmluZyB3aXRoIHRoZSBjbGFzcyBuYW1lCi0gIGluc3RlYWQgb2YgY2xhc3MgZGVzY3JpcHRvcnMuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtjbGFzcyBkZXNjcmlwdG9yXXttZXRob2RzfQotICBBIGRpY3Rpb25hcnkgbWFwcGluZyBtZXRob2QgbmFtZXMgdG8gbGluZSBudW1iZXJzLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bY2xhc3MgZGVzY3JpcHRvcl17ZmlsZX0KLSAgTmFtZSBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBcY29kZXtjbGFzc30gc3RhdGVtZW50IGRlZmluaW5nIHRoZSBjbGFzcy4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W2NsYXNzIGRlc2NyaXB0b3Jde2xpbmVub30KLSAgVGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBcY29kZXtjbGFzc30gc3RhdGVtZW50IHdpdGhpbiB0aGUgZmlsZSBuYW1lZCBieQotICBcbWVtYmVye2ZpbGV9LgotXGVuZHttZW1iZXJkZXNjfQotCi1cc3Vic2VjdGlvbntGdW5jdGlvbiBEZXNjcmlwdG9yIE9iamVjdHMgXGxhYmVse3B5Y2xici1mdW5jdGlvbi1vYmplY3RzfX0KLQotVGhlIGZ1bmN0aW9uIGRlc2NyaXB0b3Igb2JqZWN0cyB1c2VkIGFzIHZhbHVlcyBpbiB0aGUgZGljdGlvbmFyeSByZXR1cm5lZAotYnkgXGZ1bmN0aW9ue3JlYWRtb2R1bGVfZXgoKX0gcHJvdmlkZSB0aGUgZm9sbG93aW5nIGRhdGEgbWVtYmVyczoKLQotCi1cYmVnaW57bWVtYmVyZGVzY31bZnVuY3Rpb24gZGVzY3JpcHRvcl17bW9kdWxlfQotICBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIGRlZmluaW5nIHRoZSBmdW5jdGlvbiBkZXNjcmliZWQgYnkgdGhlIGZ1bmN0aW9uCi0gIGRlc2NyaXB0b3IuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtmdW5jdGlvbiBkZXNjcmlwdG9yXXtuYW1lfQotICBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtmdW5jdGlvbiBkZXNjcmlwdG9yXXtmaWxlfQotICBOYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIFxjb2Rle2RlZn0gc3RhdGVtZW50IGRlZmluaW5nIHRoZSBmdW5jdGlvbi4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W2Z1bmN0aW9uIGRlc2NyaXB0b3Jde2xpbmVub30KLSAgVGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBcY29kZXtkZWZ9IHN0YXRlbWVudCB3aXRoaW4gdGhlIGZpbGUgbmFtZWQgYnkKLSAgXG1lbWJlcntmaWxlfS4KLVxlbmR7bWVtYmVyZGVzY30KLQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJweWNvbXBpbGUudGV4IGIvRG9jL2xpYi9saWJweWNvbXBpbGUudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWYwYWFhLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlicHljb21waWxlLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7cHlfY29tcGlsZX0gLS0tCi0gICAgICAgICBDb21waWxlIFB5dGhvbiBzb3VyY2UgZmlsZXN9Ci0KLSUgRG9jdW1lbnRhdGlvbiBiYXNlZCBvbiBtb2R1bGUgZG9jc3RyaW5ncywgYnkgRnJlZCBMLiBEcmFrZSwgSnIuCi0lIDxmZHJha2VAYWNtLm9yZz4KLQotXGRlY2xhcmVtb2R1bGVbcHljb21waWxlXXtzdGFuZGFyZH17cHlfY29tcGlsZX0KLQotXG1vZHVsZXN5bm9wc2lze0NvbXBpbGUgUHl0aG9uIHNvdXJjZSBmaWxlcyB0byBieXRlLWNvZGUgZmlsZXMufQotCi0KLVxpbmRleGlpe2ZpbGV9e2J5dGUtY29kZX0KLVRoZSBcbW9kdWxle3B5X2NvbXBpbGV9IG1vZHVsZSBwcm92aWRlcyBhIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGEKLWJ5dGUtY29kZSBmaWxlIGZyb20gYSBzb3VyY2UgZmlsZSwgYW5kIGFub3RoZXIgZnVuY3Rpb24gdXNlZCB3aGVuIHRoZQotbW9kdWxlIHNvdXJjZSBmaWxlIGlzIGludm9rZWQgYXMgYSBzY3JpcHQuCi0KLVRob3VnaCBub3Qgb2Z0ZW4gbmVlZGVkLCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VmdWwgd2hlbiBpbnN0YWxsaW5nCi1tb2R1bGVzIGZvciBzaGFyZWQgdXNlLCBlc3BlY2lhbGx5IGlmIHNvbWUgb2YgdGhlIHVzZXJzIG1heSBub3QgaGF2ZQotcGVybWlzc2lvbiB0byB3cml0ZSB0aGUgYnl0ZS1jb2RlIGNhY2hlIGZpbGVzIGluIHRoZSBkaXJlY3RvcnkKLWNvbnRhaW5pbmcgdGhlIHNvdXJjZSBjb2RlLgotCi1cYmVnaW57ZXhjZGVzY317UHlDb21waWxlRXJyb3J9Ci1FeGNlcHRpb24gcmFpc2VkIHdoZW4gYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGF0dGVtcHRpbmcgdG8gY29tcGlsZSB0aGUgZmlsZS4KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtjb21waWxlfXtmaWxlXG9wdGlvbmFseywgY2ZpbGVcb3B0aW9uYWx7LCBkZmlsZVxvcHRpb25hbHssIGRvcmFpc2V9fX19Ci0gIENvbXBpbGUgYSBzb3VyY2UgZmlsZSB0byBieXRlLWNvZGUgYW5kIHdyaXRlIG91dCB0aGUgYnl0ZS1jb2RlIGNhY2hlIAotICBmaWxlLiAgVGhlIHNvdXJjZSBjb2RlIGlzIGxvYWRlZCBmcm9tIHRoZSBmaWxlIG5hbWUgXHZhcntmaWxlfS4gIFRoZSAKLSAgYnl0ZS1jb2RlIGlzIHdyaXR0ZW4gdG8gXHZhcntjZmlsZX0sIHdoaWNoIGRlZmF1bHRzIHRvIFx2YXJ7ZmlsZX0KLSAgXGNvZGV7K30gXGNvZGV7J2MnfSAoXGNvZGV7J28nfSBpZiBvcHRpbWl6YXRpb24gaXMgZW5hYmxlZCBpbiB0aGUKLSAgY3VycmVudCBpbnRlcnByZXRlcikuICBJZiBcdmFye2RmaWxlfSBpcyBzcGVjaWZpZWQsIGl0IGlzIHVzZWQgYXMKLSAgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIGluIGVycm9yIG1lc3NhZ2VzIGluc3RlYWQgb2YgXHZhcntmaWxlfS4gCi0gIElmIFx2YXJ7ZG9yYWlzZX0gaXMgdHJ1ZSwgYSBcZXhjZXB0aW9ue1B5Q29tcGlsZUVycm9yfSBpcyByYWlzZWQgd2hlbgotICBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZCB3aGlsZSBjb21waWxpbmcgXHZhcntmaWxlfS4gSWYgXHZhcntkb3JhaXNlfQotICBpcyBmYWxzZSAodGhlIGRlZmF1bHQpLCBhbiBlcnJvciBzdHJpbmcgaXMgd3JpdHRlbiB0byBcY29kZXtzeXMuc3RkZXJyfSwKLSAgYnV0IG5vIGV4Y2VwdGlvbiBpcyByYWlzZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e21haW59e1xvcHRpb25hbHthcmdzfX0KLSAgQ29tcGlsZSBzZXZlcmFsIHNvdXJjZSBmaWxlcy4gIFRoZSBmaWxlcyBuYW1lZCBpbiBcdmFye2FyZ3N9IChvciBvbgotICB0aGUgY29tbWFuZCBsaW5lLCBpZiBcdmFye2FyZ3N9IGlzIG5vdCBzcGVjaWZpZWQpIGFyZSBjb21waWxlZCBhbmQKLSAgdGhlIHJlc3VsdGluZyBieXRlY29kZSBpcyBjYWNoZWQgaW4gdGhlIG5vcm1hbCBtYW5uZXIuICBUaGlzCi0gIGZ1bmN0aW9uIGRvZXMgbm90IHNlYXJjaCBhIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgdG8gbG9jYXRlIHNvdXJjZQotICBmaWxlczsgaXQgb25seSBjb21waWxlcyBmaWxlcyBuYW1lZCBleHBsaWNpdGx5LgotXGVuZHtmdW5jZGVzY30KLQotV2hlbiB0aGlzIG1vZHVsZSBpcyBydW4gYXMgYSBzY3JpcHQsIHRoZSBcZnVuY3Rpb257bWFpbigpfSBpcyB1c2VkIHRvCi1jb21waWxlIGFsbCB0aGUgZmlsZXMgbmFtZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWVtb2R1bGV7Y29tcGlsZWFsbH17VXRpbGl0aWVzIHRvIGNvbXBpbGUgYWxsIFB5dGhvbiBzb3VyY2UgZmlsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbiBhIGRpcmVjdG9yeSB0cmVlLn0KLVxlbmR7c2VlYWxzb30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlicHlkb2MudGV4IGIvRG9jL2xpYi9saWJweWRvYy50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNzRkZjYuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJweWRvYy50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3B5ZG9jfSAtLS0KLSAgICAgICAgIERvY3VtZW50YXRpb24gZ2VuZXJhdG9yIGFuZCBvbmxpbmUgaGVscCBzeXN0ZW19Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtweWRvY30KLVxtb2R1bGVzeW5vcHNpc3tEb2N1bWVudGF0aW9uIGdlbmVyYXRvciBhbmQgb25saW5lIGhlbHAgc3lzdGVtLn0KLVxtb2R1bGVhdXRob3J7S2EtUGluZyBZZWV9e3BpbmdAbGZ3Lm9yZ30KLVxzZWN0aW9uYXV0aG9ye0thLVBpbmcgWWVlfXtwaW5nQGxmdy5vcmd9Ci0KLVx2ZXJzaW9uYWRkZWR7Mi4xfQotXGluZGV4e2RvY3VtZW50YXRpb24hZ2VuZXJhdGlvbn0KLVxpbmRleHtkb2N1bWVudGF0aW9uIW9ubGluZX0KLVxpbmRleHtoZWxwIW9ubGluZX0KLQotVGhlIFxtb2R1bGV7cHlkb2N9IG1vZHVsZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlcyBkb2N1bWVudGF0aW9uIGZyb20KLVB5dGhvbiBtb2R1bGVzLiAgVGhlIGRvY3VtZW50YXRpb24gY2FuIGJlIHByZXNlbnRlZCBhcyBwYWdlcyBvZiB0ZXh0Ci1vbiB0aGUgY29uc29sZSwgc2VydmVkIHRvIGEgV2ViIGJyb3dzZXIsIG9yIHNhdmVkIHRvIEhUTUwgZmlsZXMuCi0KLVRoZSBidWlsdC1pbiBmdW5jdGlvbiBcZnVuY3Rpb257aGVscCgpfSBpbnZva2VzIHRoZSBvbmxpbmUgaGVscCBzeXN0ZW0KLWluIHRoZSBpbnRlcmFjdGl2ZSBpbnRlcnByZXRlciwgd2hpY2ggdXNlcyBcbW9kdWxle3B5ZG9jfSB0byBnZW5lcmF0ZQotaXRzIGRvY3VtZW50YXRpb24gYXMgdGV4dCBvbiB0aGUgY29uc29sZS4gIFRoZSBzYW1lIHRleHQgZG9jdW1lbnRhdGlvbgotY2FuIGFsc28gYmUgdmlld2VkIGZyb20gb3V0c2lkZSB0aGUgUHl0aG9uIGludGVycHJldGVyIGJ5IHJ1bm5pbmcKLVxwcm9ncmFte3B5ZG9jfSBhcyBhIHNjcmlwdCBhdCB0aGUgb3BlcmF0aW5nIHN5c3RlbSdzIGNvbW1hbmQgcHJvbXB0LgotRm9yIGV4YW1wbGUsIHJ1bm5pbmcKLQotXGJlZ2lue3ZlcmJhdGltfQotcHlkb2Mgc3lzCi1cZW5ke3ZlcmJhdGltfQotCi1hdCBhIHNoZWxsIHByb21wdCB3aWxsIGRpc3BsYXkgZG9jdW1lbnRhdGlvbiBvbiB0aGUgXHJlZm1vZHVsZXtzeXN9Ci1tb2R1bGUsIGluIGEgc3R5bGUgc2ltaWxhciB0byB0aGUgbWFudWFsIHBhZ2VzIHNob3duIGJ5IHRoZSBcVU5JWHt9Ci1ccHJvZ3JhbXttYW59IGNvbW1hbmQuICBUaGUgYXJndW1lbnQgdG8gXHByb2dyYW17cHlkb2N9IGNhbiBiZSB0aGUgbmFtZQotb2YgYSBmdW5jdGlvbiwgbW9kdWxlLCBvciBwYWNrYWdlLCBvciBhIGRvdHRlZCByZWZlcmVuY2UgdG8gYSBjbGFzcywKLW1ldGhvZCwgb3IgZnVuY3Rpb24gd2l0aGluIGEgbW9kdWxlIG9yIG1vZHVsZSBpbiBhIHBhY2thZ2UuICBJZiB0aGUKLWFyZ3VtZW50IHRvIFxwcm9ncmFte3B5ZG9jfSBsb29rcyBsaWtlIGEgcGF0aCAodGhhdCBpcywgaXQgY29udGFpbnMgdGhlCi1wYXRoIHNlcGFyYXRvciBmb3IgeW91ciBvcGVyYXRpbmcgc3lzdGVtLCBzdWNoIGFzIGEgc2xhc2ggaW4gXFVOSVgpLAotYW5kIHJlZmVycyB0byBhbiBleGlzdGluZyBQeXRob24gc291cmNlIGZpbGUsIHRoZW4gZG9jdW1lbnRhdGlvbiBpcwotcHJvZHVjZWQgZm9yIHRoYXQgZmlsZS4KLQotU3BlY2lmeWluZyBhIFxwcm9ncmFtb3B0ey13fSBmbGFnIGJlZm9yZSB0aGUgYXJndW1lbnQgd2lsbCBjYXVzZSBIVE1MCi1kb2N1bWVudGF0aW9uIHRvIGJlIHdyaXR0ZW4gb3V0IHRvIGEgZmlsZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksCi1pbnN0ZWFkIG9mIGRpc3BsYXlpbmcgdGV4dCBvbiB0aGUgY29uc29sZS4KLQotU3BlY2lmeWluZyBhIFxwcm9ncmFtb3B0ey1rfSBmbGFnIGJlZm9yZSB0aGUgYXJndW1lbnQgd2lsbCBzZWFyY2ggdGhlCi1zeW5vcHNpcyBsaW5lcyBvZiBhbGwgYXZhaWxhYmxlIG1vZHVsZXMgZm9yIHRoZSBrZXl3b3JkIGdpdmVuIGFzIHRoZQotYXJndW1lbnQsIGFnYWluIGluIGEgbWFubmVyIHNpbWlsYXIgdG8gdGhlIFxVTklYe30gXHByb2dyYW17bWFufQotY29tbWFuZC4gIFRoZSBzeW5vcHNpcyBsaW5lIG9mIGEgbW9kdWxlIGlzIHRoZSBmaXJzdCBsaW5lIG9mIGl0cwotZG9jdW1lbnRhdGlvbiBzdHJpbmcuCi0KLVlvdSBjYW4gYWxzbyB1c2UgXHByb2dyYW17cHlkb2N9IHRvIHN0YXJ0IGFuIEhUVFAgc2VydmVyIG9uIHRoZSBsb2NhbAotbWFjaGluZSB0aGF0IHdpbGwgc2VydmUgZG9jdW1lbnRhdGlvbiB0byB2aXNpdGluZyBXZWIgYnJvd3NlcnMuCi1ccHJvZ3JhbXtweWRvY30gXHByb2dyYW1vcHR7LXAgMTIzNH0gd2lsbCBzdGFydCBhIEhUVFAgc2VydmVyIG9uIHBvcnQKLTEyMzQsIGFsbG93aW5nIHlvdSB0byBicm93c2UgdGhlIGRvY3VtZW50YXRpb24gYXQKLVxjb2Rle2h0dHA6Ly9sb2NhbGhvc3Q6MTIzNC99IGluIHlvdXIgcHJlZmVycmVkIFdlYiBicm93c2VyLgotXHByb2dyYW17cHlkb2N9IFxwcm9ncmFtb3B0ey1nfSB3aWxsIHN0YXJ0IHRoZSBzZXJ2ZXIgYW5kIGFkZGl0aW9uYWxseQotYnJpbmcgdXAgYSBzbWFsbCBccmVmbW9kdWxle1RraW50ZXJ9LWJhc2VkIGdyYXBoaWNhbCBpbnRlcmZhY2UgdG8gaGVscAoteW91IHNlYXJjaCBmb3IgZG9jdW1lbnRhdGlvbiBwYWdlcy4KLQotV2hlbiBccHJvZ3JhbXtweWRvY30gZ2VuZXJhdGVzIGRvY3VtZW50YXRpb24sIGl0IHVzZXMgdGhlIGN1cnJlbnQKLWVudmlyb25tZW50IGFuZCBwYXRoIHRvIGxvY2F0ZSBtb2R1bGVzLiAgVGh1cywgaW52b2tpbmcKLVxwcm9ncmFte3B5ZG9jfSBccHJvZ3JhbW9wdHtzcGFtfSBkb2N1bWVudHMgcHJlY2lzZWx5IHRoZSB2ZXJzaW9uIG9mCi10aGUgbW9kdWxlIHlvdSB3b3VsZCBnZXQgaWYgeW91IHN0YXJ0ZWQgdGhlIFB5dGhvbiBpbnRlcnByZXRlciBhbmQKLXR5cGVkIFxzYW1we2ltcG9ydCBzcGFtfS4KLQotTW9kdWxlIGRvY3MgZm9yIGNvcmUgbW9kdWxlcyBhcmUgYXNzdW1lZCB0byByZXNpZGUgaW4KLXt9XHVybHtodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jL2N1cnJlbnQvbGliL30uICBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIGJ5Ci1zZXR0aW5nIHRoZSBcZW52dmFye1BZVEhPTkRPQ1N9IGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGEgZGlmZmVyZW50IFVSTCBvcgotdG8gYSBsb2NhbCBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgTGlicmFyeSBSZWZlcmVuY2UgTWFudWFsIHBhZ2VzLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJweWV4cGF0LnRleCBiL0RvYy9saWIvbGlicHlleHBhdC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMGJmNmEuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJweWV4cGF0LnRleAorKysgL2Rldi9udWxsCkBAIC0xLDc2NiArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3htbC5wYXJzZXJzLmV4cGF0fSAtLS0KLSAgICAgICAgIEZhc3QgWE1MIHBhcnNpbmcgdXNpbmcgRXhwYXR9Ci0KLSUgTWFya3VwIG5vdGVzOgotJQotJSBNYW55IG9mIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBYTUxQYXJzZXIgb2JqZWN0cyBhcmUgY2FsbGJhY2tzLgotJSBTaW5jZSBzaWduYXR1cmUgaW5mb3JtYXRpb24gbXVzdCBiZSBwcmVzZW50ZWQsIHRoZXNlIGFyZSBkZXNjcmliZWQKLSUgdXNpbmcgdGhlIG1ldGhvZGRlc2MgZW52aXJvbm1lbnQuICBTaW5jZSB0aGV5IGFyZSBhdHRyaWJ1dGVzIHdoaWNoCi0lIGFyZSBzZXQgYnkgY2xpZW50IGNvZGUsIGluLXRleHQgcmVmZXJlbmNlcyB0byB0aGVzZSBhdHRyaWJ1dGVzCi0lIHNob3VsZCBiZSBtYXJrZWQgdXNpbmcgdGhlIFxtZW1iZXIgbWFjcm8gYW5kIHNob3VsZCBub3QgaW5jbHVkZSB0aGUKLSUgcGFyZW50aGVzZXMgdXNlZCB3aGVuIG1hcmtpbmcgZnVuY3Rpb25zIGFuZCBtZXRob2RzLgotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17eG1sLnBhcnNlcnMuZXhwYXR9Ci1cbW9kdWxlc3lub3BzaXN7QW4gaW50ZXJmYWNlIHRvIHRoZSBFeHBhdCBub24tdmFsaWRhdGluZyBYTUwgcGFyc2VyLn0KLVxtb2R1bGVhdXRob3J7UGF1bCBQcmVzY29kfXtwYXVsQHByZXNjb2QubmV0fQotCi1cdmVyc2lvbmFkZGVkezIuMH0KLQotVGhlIFxtb2R1bGV7eG1sLnBhcnNlcnMuZXhwYXR9IG1vZHVsZSBpcyBhIFB5dGhvbiBpbnRlcmZhY2UgdG8gdGhlCi1FeHBhdFxpbmRleHtFeHBhdH0gbm9uLXZhbGlkYXRpbmcgWE1MIHBhcnNlci4KLVRoZSBtb2R1bGUgcHJvdmlkZXMgYSBzaW5nbGUgZXh0ZW5zaW9uIHR5cGUsIFxjbGFzc3t4bWxwYXJzZXJ9LCB0aGF0Ci1yZXByZXNlbnRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGFuIFhNTCBwYXJzZXIuICBBZnRlciBhbgotXGNsYXNze3htbHBhcnNlcn0gb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWQsIHZhcmlvdXMgYXR0cmlidXRlcyBvZiB0aGUgb2JqZWN0IAotY2FuIGJlIHNldCB0byBoYW5kbGVyIGZ1bmN0aW9ucy4gIFdoZW4gYW4gWE1MIGRvY3VtZW50IGlzIHRoZW4gZmVkIHRvCi10aGUgcGFyc2VyLCB0aGUgaGFuZGxlciBmdW5jdGlvbnMgYXJlIGNhbGxlZCBmb3IgdGhlIGNoYXJhY3RlciBkYXRhCi1hbmQgbWFya3VwIGluIHRoZSBYTUwgZG9jdW1lbnQuCi0KLVRoaXMgbW9kdWxlIHVzZXMgdGhlIFxtb2R1bGV7cHlleHBhdH1ccmVmYmltb2RpbmRleHtweWV4cGF0fSBtb2R1bGUgdG8KLXByb3ZpZGUgYWNjZXNzIHRvIHRoZSBFeHBhdCBwYXJzZXIuICBEaXJlY3QgdXNlIG9mIHRoZQotXG1vZHVsZXtweWV4cGF0fSBtb2R1bGUgaXMgZGVwcmVjYXRlZC4KLQotVGhpcyBtb2R1bGUgcHJvdmlkZXMgb25lIGV4Y2VwdGlvbiBhbmQgb25lIHR5cGUgb2JqZWN0OgotCi1cYmVnaW57ZXhjZGVzY317RXhwYXRFcnJvcn0KLSAgVGhlIGV4Y2VwdGlvbiByYWlzZWQgd2hlbiBFeHBhdCByZXBvcnRzIGFuIGVycm9yLiAgU2VlIHNlY3Rpb24KLSAgXHJlZntleHBhdGVycm9yLW9iamVjdHN9LCBgYEV4cGF0RXJyb3IgRXhjZXB0aW9ucywnJyBmb3IgbW9yZQotICBpbmZvcm1hdGlvbiBvbiBpbnRlcnByZXRpbmcgRXhwYXQgZXJyb3JzLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317ZXJyb3J9Ci0gIEFsaWFzIGZvciBcZXhjZXB0aW9ue0V4cGF0RXJyb3J9LgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1hNTFBhcnNlclR5cGV9Ci0gIFRoZSB0eXBlIG9mIHRoZSByZXR1cm4gdmFsdWVzIGZyb20gdGhlIFxmdW5jdGlvbntQYXJzZXJDcmVhdGUoKX0KLSAgZnVuY3Rpb24uCi1cZW5ke2RhdGFkZXNjfQotCi0KLVRoZSBcbW9kdWxle3htbC5wYXJzZXJzLmV4cGF0fSBtb2R1bGUgY29udGFpbnMgdHdvIGZ1bmN0aW9uczoKLQotXGJlZ2lue2Z1bmNkZXNjfXtFcnJvclN0cmluZ317ZXJybm99Ci1SZXR1cm5zIGFuIGV4cGxhbmF0b3J5IHN0cmluZyBmb3IgYSBnaXZlbiBlcnJvciBudW1iZXIgXHZhcntlcnJub30uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e1BhcnNlckNyZWF0ZX17XG9wdGlvbmFse2VuY29kaW5nXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2Vfc2VwYXJhdG9yfX19Ci1DcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IFxjbGFzc3t4bWxwYXJzZXJ9IG9iamVjdC4gIAotXHZhcntlbmNvZGluZ30sIGlmIHNwZWNpZmllZCwgbXVzdCBiZSBhIHN0cmluZyBuYW1pbmcgdGhlIGVuY29kaW5nIAotdXNlZCBieSB0aGUgWE1MIGRhdGEuICBFeHBhdCBkb2Vzbid0IHN1cHBvcnQgYXMgbWFueSBlbmNvZGluZ3MgYXMKLVB5dGhvbiBkb2VzLCBhbmQgaXRzIHJlcGVydG9pcmUgb2YgZW5jb2RpbmdzIGNhbid0IGJlIGV4dGVuZGVkOyBpdAotc3VwcG9ydHMgVVRGLTgsIFVURi0xNiwgSVNPLTg4NTktMSAoTGF0aW4xKSwgYW5kIEFTQ0lJLiAgSWYKLVx2YXJ7ZW5jb2Rpbmd9IGlzIGdpdmVuIGl0IHdpbGwgb3ZlcnJpZGUgdGhlIGltcGxpY2l0IG9yIGV4cGxpY2l0Ci1lbmNvZGluZyBvZiB0aGUgZG9jdW1lbnQuCi0KLUV4cGF0IGNhbiBvcHRpb25hbGx5IGRvIFhNTCBuYW1lc3BhY2UgcHJvY2Vzc2luZyBmb3IgeW91LCBlbmFibGVkIGJ5Ci1wcm92aWRpbmcgYSB2YWx1ZSBmb3IgXHZhcntuYW1lc3BhY2Vfc2VwYXJhdG9yfS4gIFRoZSB2YWx1ZSBtdXN0IGJlIGEKLW9uZS1jaGFyYWN0ZXIgc3RyaW5nOyBhIFxleGNlcHRpb257VmFsdWVFcnJvcn0gd2lsbCBiZSByYWlzZWQgaWYgdGhlCi1zdHJpbmcgaGFzIGFuIGlsbGVnYWwgbGVuZ3RoIChcY29kZXtOb25lfSBpcyBjb25zaWRlcmVkIHRoZSBzYW1lIGFzCi1vbWlzc2lvbikuICBXaGVuIG5hbWVzcGFjZSBwcm9jZXNzaW5nIGlzIGVuYWJsZWQsIGVsZW1lbnQgdHlwZSBuYW1lcwotYW5kIGF0dHJpYnV0ZSBuYW1lcyB0aGF0IGJlbG9uZyB0byBhIG5hbWVzcGFjZSB3aWxsIGJlIGV4cGFuZGVkLiAgVGhlCi1lbGVtZW50IG5hbWUgcGFzc2VkIHRvIHRoZSBlbGVtZW50IGhhbmRsZXJzCi1cbWVtYmVye1N0YXJ0RWxlbWVudEhhbmRsZXJ9IGFuZCBcbWVtYmVye0VuZEVsZW1lbnRIYW5kbGVyfQotd2lsbCBiZSB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgbmFtZXNwYWNlIFVSSSwgdGhlIG5hbWVzcGFjZQotc2VwYXJhdG9yIGNoYXJhY3RlciwgYW5kIHRoZSBsb2NhbCBwYXJ0IG9mIHRoZSBuYW1lLiAgSWYgdGhlIG5hbWVzcGFjZQotc2VwYXJhdG9yIGlzIGEgemVybyBieXRlIChcY29kZXtjaHIoMCl9KSB0aGVuIHRoZSBuYW1lc3BhY2UgVVJJIGFuZAotdGhlIGxvY2FsIHBhcnQgd2lsbCBiZSBjb25jYXRlbmF0ZWQgd2l0aG91dCBhbnkgc2VwYXJhdG9yLgotCi1Gb3IgZXhhbXBsZSwgaWYgXHZhcntuYW1lc3BhY2Vfc2VwYXJhdG9yfSBpcyBzZXQgdG8gYSBzcGFjZSBjaGFyYWN0ZXIKLShcY2hhcmFjdGVyeyB9KSBhbmQgdGhlIGZvbGxvd2luZyBkb2N1bWVudCBpcyBwYXJzZWQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPHJvb3QgeG1sbnMgICAgPSAiaHR0cDovL2RlZmF1bHQtbmFtZXNwYWNlLm9yZy8iCi0gICAgICB4bWxuczpweSA9ICJodHRwOi8vd3d3LnB5dGhvbi5vcmcvbnMvIj4KLSAgPHB5OmVsZW0xIC8+Ci0gIDxlbGVtMiB4bWxucz0iIiAvPgotPC9yb290PgotXGVuZHt2ZXJiYXRpbX0KLQotXG1lbWJlcntTdGFydEVsZW1lbnRIYW5kbGVyfSB3aWxsIHJlY2VpdmUgdGhlIGZvbGxvd2luZyBzdHJpbmdzCi1mb3IgZWFjaCBlbGVtZW50OgotCi1cYmVnaW57dmVyYmF0aW19Ci1odHRwOi8vZGVmYXVsdC1uYW1lc3BhY2Uub3JnLyByb290Ci1odHRwOi8vd3d3LnB5dGhvbi5vcmcvbnMvIGVsZW0xCi1lbGVtMgotXGVuZHt2ZXJiYXRpbX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWV0aXRsZVtodHRwOi8vd3d3LmxpYmV4cGF0Lm9yZy9de1RoZSBFeHBhdCBYTUwgUGFyc2VyfQotICAgICAgICAgICB7SG9tZSBwYWdlIG9mIHRoZSBFeHBhdCBwcm9qZWN0Ln0KLVxlbmR7c2VlYWxzb30KLQotCi1cc3Vic2VjdGlvbntYTUxQYXJzZXIgT2JqZWN0cyBcbGFiZWx7eG1scGFyc2VyLW9iamVjdHN9fQotCi1cY2xhc3N7eG1scGFyc2VyfSBvYmplY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotCi1cYmVnaW57bWV0aG9kZGVzY31beG1scGFyc2VyXXtQYXJzZX17ZGF0YVxvcHRpb25hbHssIGlzZmluYWx9fQotUGFyc2VzIHRoZSBjb250ZW50cyBvZiB0aGUgc3RyaW5nIFx2YXJ7ZGF0YX0sIGNhbGxpbmcgdGhlIGFwcHJvcHJpYXRlCi1oYW5kbGVyIGZ1bmN0aW9ucyB0byBwcm9jZXNzIHRoZSBwYXJzZWQgZGF0YS4gIFx2YXJ7aXNmaW5hbH0gbXVzdCBiZQotdHJ1ZSBvbiB0aGUgZmluYWwgY2FsbCB0byB0aGlzIG1ldGhvZC4gIFx2YXJ7ZGF0YX0gY2FuIGJlIHRoZSBlbXB0eQotc3RyaW5nIGF0IGFueSB0aW1lLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31beG1scGFyc2VyXXtQYXJzZUZpbGV9e2ZpbGV9Ci1QYXJzZSBYTUwgZGF0YSByZWFkaW5nIGZyb20gdGhlIG9iamVjdCBcdmFye2ZpbGV9LiAgXHZhcntmaWxlfSBvbmx5Ci1uZWVkcyB0byBwcm92aWRlIHRoZSBcbWV0aG9ke3JlYWQoXHZhcntuYnl0ZXN9KX0gbWV0aG9kLCByZXR1cm5pbmcgdGhlCi1lbXB0eSBzdHJpbmcgd2hlbiB0aGVyZSdzIG5vIG1vcmUgZGF0YS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3htbHBhcnNlcl17U2V0QmFzZX17YmFzZX0KLVNldHMgdGhlIGJhc2UgdG8gYmUgdXNlZCBmb3IgcmVzb2x2aW5nIHJlbGF0aXZlIFVSSXMgaW4gc3lzdGVtCi1pZGVudGlmaWVycyBpbiBkZWNsYXJhdGlvbnMuICBSZXNvbHZpbmcgcmVsYXRpdmUgaWRlbnRpZmllcnMgaXMgbGVmdAotdG8gdGhlIGFwcGxpY2F0aW9uOiB0aGlzIHZhbHVlIHdpbGwgYmUgcGFzc2VkIHRocm91Z2ggYXMgdGhlCi1cdmFye2Jhc2V9IGFyZ3VtZW50IHRvIHRoZSBcZnVuY3Rpb257RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyfSwKLVxmdW5jdGlvbntOb3RhdGlvbkRlY2xIYW5kbGVyfSwgYW5kCi1cZnVuY3Rpb257VW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlcn0gZnVuY3Rpb25zLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31beG1scGFyc2VyXXtHZXRCYXNlfXt9Ci1SZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGJhc2Ugc2V0IGJ5IGEgcHJldmlvdXMgY2FsbCB0bwotXG1ldGhvZHtTZXRCYXNlKCl9LCBvciBcY29kZXtOb25lfSBpZiAKLVxtZXRob2R7U2V0QmFzZSgpfSBoYXNuJ3QgYmVlbiBjYWxsZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt4bWxwYXJzZXJde0dldElucHV0Q29udGV4dH17fQotUmV0dXJucyB0aGUgaW5wdXQgZGF0YSB0aGF0IGdlbmVyYXRlZCB0aGUgY3VycmVudCBldmVudCBhcyBhIHN0cmluZy4KLVRoZSBkYXRhIGlzIGluIHRoZSBlbmNvZGluZyBvZiB0aGUgZW50aXR5IHdoaWNoIGNvbnRhaW5zIHRoZSB0ZXh0LgotV2hlbiBjYWxsZWQgd2hpbGUgYW4gZXZlbnQgaGFuZGxlciBpcyBub3QgYWN0aXZlLCB0aGUgcmV0dXJuIHZhbHVlIGlzCi1cY29kZXtOb25lfS4KLVx2ZXJzaW9uYWRkZWR7Mi4xfQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31beG1scGFyc2VyXXtFeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZX17Y29udGV4dFxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmd9fQotQ3JlYXRlIGEgYGBjaGlsZCcnIHBhcnNlciB3aGljaCBjYW4gYmUgdXNlZCB0byBwYXJzZSBhbiBleHRlcm5hbAotcGFyc2VkIGVudGl0eSByZWZlcnJlZCB0byBieSBjb250ZW50IHBhcnNlZCBieSB0aGUgcGFyZW50IHBhcnNlci4gIFRoZQotXHZhcntjb250ZXh0fSBwYXJhbWV0ZXIgc2hvdWxkIGJlIHRoZSBzdHJpbmcgcGFzc2VkIHRvIHRoZQotXG1ldGhvZHtFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIoKX0gaGFuZGxlciBmdW5jdGlvbiwgZGVzY3JpYmVkIGJlbG93LgotVGhlIGNoaWxkIHBhcnNlciBpcyBjcmVhdGVkIHdpdGggdGhlIFxtZW1iZXJ7b3JkZXJlZF9hdHRyaWJ1dGVzfQotYW5kIFxtZW1iZXJ7c3BlY2lmaWVkX2F0dHJpYnV0ZXN9IHNldCB0byB0aGUKLXZhbHVlcyBvZiB0aGlzIHBhcnNlci4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3htbHBhcnNlcl17VXNlRm9yZWlnbkRURH17XG9wdGlvbmFse2ZsYWd9fQotQ2FsbGluZyB0aGlzIHdpdGggYSB0cnVlIHZhbHVlIGZvciBcdmFye2ZsYWd9ICh0aGUgZGVmYXVsdCkgd2lsbCBjYXVzZQotRXhwYXQgdG8gY2FsbCB0aGUgXG1lbWJlcntFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXJ9IHdpdGgKLVxjb25zdGFudHtOb25lfSBmb3IgYWxsIGFyZ3VtZW50cyB0byBhbGxvdyBhbiBhbHRlcm5hdGUgRFREIHRvIGJlCi1sb2FkZWQuICBJZiB0aGUgZG9jdW1lbnQgZG9lcyBub3QgY29udGFpbiBhIGRvY3VtZW50IHR5cGUgZGVjbGFyYXRpb24sCi10aGUgXG1lbWJlcntFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXJ9IHdpbGwgc3RpbGwgYmUgY2FsbGVkLCBidXQgdGhlCi1cbWVtYmVye1N0YXJ0RG9jdHlwZURlY2xIYW5kbGVyfSBhbmQgXG1lbWJlcntFbmREb2N0eXBlRGVjbEhhbmRsZXJ9Ci13aWxsIG5vdCBiZSBjYWxsZWQuCi0KLVBhc3NpbmcgYSBmYWxzZSB2YWx1ZSBmb3IgXHZhcntmbGFnfSB3aWxsIGNhbmNlbCBhIHByZXZpb3VzIGNhbGwgdGhhdAotcGFzc2VkIGEgdHJ1ZSB2YWx1ZSwgYnV0IG90aGVyd2lzZSBoYXMgbm8gZWZmZWN0LgotCi1UaGlzIG1ldGhvZCBjYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlIHRoZSBcbWV0aG9ke1BhcnNlKCl9IG9yCi1cbWV0aG9ke1BhcnNlRmlsZSgpfSBtZXRob2RzIGFyZSBjYWxsZWQ7IGNhbGxpbmcgaXQgYWZ0ZXIgZWl0aGVyIG9mCi10aG9zZSBoYXZlIGJlZW4gY2FsbGVkIGNhdXNlcyBcZXhjZXB0aW9ue0V4cGF0RXJyb3J9IHRvIGJlIHJhaXNlZCB3aXRoCi10aGUgXG1lbWJlcntjb2RlfSBhdHRyaWJ1dGUgc2V0IHRvCi1cY29uc3RhbnR7ZXJyb3JzLlhNTF9FUlJPUl9DQU5UX0NIQU5HRV9GRUFUVVJFX09OQ0VfUEFSU0lOR30uCi0KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHttZXRob2RkZXNjfQotCi0KLVxjbGFzc3t4bWxwYXJzZXJ9IG9iamVjdHMgaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVt4bWxwYXJzZXJde2J1ZmZlcl9zaXplfQotVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciB1c2VkIHdoZW4gXG1lbWJlcntidWZmZXJfdGV4dH0gaXMgdHJ1ZS4gIFRoaXMKLXZhbHVlIGNhbm5vdCBiZSBjaGFuZ2VkIGF0IHRoaXMgdGltZS4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31beG1scGFyc2VyXXtidWZmZXJfdGV4dH0KLVNldHRpbmcgdGhpcyB0byB0cnVlIGNhdXNlcyB0aGUgXGNsYXNze3htbHBhcnNlcn0gb2JqZWN0IHRvIGJ1ZmZlcgotdGV4dHVhbCBjb250ZW50IHJldHVybmVkIGJ5IEV4cGF0IHRvIGF2b2lkIG11bHRpcGxlIGNhbGxzIHRvIHRoZQotXG1ldGhvZHtDaGFyYWN0ZXJEYXRhSGFuZGxlcigpfSBjYWxsYmFjayB3aGVuZXZlciBwb3NzaWJsZS4gIFRoaXMgY2FuCi1pbXByb3ZlIHBlcmZvcm1hbmNlIHN1YnN0YW50aWFsbHkgc2luY2UgRXhwYXQgbm9ybWFsbHkgYnJlYWtzCi1jaGFyYWN0ZXIgZGF0YSBpbnRvIGNodW5rcyBhdCBldmVyeSBsaW5lIGVuZGluZy4gIFRoaXMgYXR0cmlidXRlIGlzCi1mYWxzZSBieSBkZWZhdWx0LCBhbmQgbWF5IGJlIGNoYW5nZWQgYXQgYW55IHRpbWUuCi1cdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W3htbHBhcnNlcl17YnVmZmVyX3VzZWR9Ci1JZiBcbWVtYmVye2J1ZmZlcl90ZXh0fSBpcyBlbmFibGVkLCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHN0b3JlZCBpbiB0aGUKLWJ1ZmZlci4gIFRoZXNlIGJ5dGVzIHJlcHJlc2VudCBVVEYtOCBlbmNvZGVkIHRleHQuICBUaGlzIGF0dHJpYnV0ZSBoYXMKLW5vIG1lYW5pbmdmdWwgaW50ZXJwcmV0YXRpb24gd2hlbiBcbWVtYmVye2J1ZmZlcl90ZXh0fSBpcyBmYWxzZS4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31beG1scGFyc2VyXXtvcmRlcmVkX2F0dHJpYnV0ZXN9Ci1TZXR0aW5nIHRoaXMgYXR0cmlidXRlIHRvIGEgbm9uLXplcm8gaW50ZWdlciBjYXVzZXMgdGhlIGF0dHJpYnV0ZXMgdG8KLWJlIHJlcG9ydGVkIGFzIGEgbGlzdCByYXRoZXIgdGhhbiBhIGRpY3Rpb25hcnkuICBUaGUgYXR0cmlidXRlcyBhcmUKLXByZXNlbnRlZCBpbiB0aGUgb3JkZXIgZm91bmQgaW4gdGhlIGRvY3VtZW50IHRleHQuICBGb3IgZWFjaAotYXR0cmlidXRlLCB0d28gbGlzdCBlbnRyaWVzIGFyZSBwcmVzZW50ZWQ6IHRoZSBhdHRyaWJ1dGUgbmFtZSBhbmQgdGhlCi1hdHRyaWJ1dGUgdmFsdWUuICAoT2xkZXIgdmVyc2lvbnMgb2YgdGhpcyBtb2R1bGUgYWxzbyB1c2VkIHRoaXMKLWZvcm1hdC4pICBCeSBkZWZhdWx0LCB0aGlzIGF0dHJpYnV0ZSBpcyBmYWxzZTsgaXQgbWF5IGJlIGNoYW5nZWQgYXQKLWFueSB0aW1lLgotXHZlcnNpb25hZGRlZHsyLjF9Ci1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVt4bWxwYXJzZXJde3NwZWNpZmllZF9hdHRyaWJ1dGVzfQotSWYgc2V0IHRvIGEgbm9uLXplcm8gaW50ZWdlciwgdGhlIHBhcnNlciB3aWxsIHJlcG9ydCBvbmx5IHRob3NlCi1hdHRyaWJ1dGVzIHdoaWNoIHdlcmUgc3BlY2lmaWVkIGluIHRoZSBkb2N1bWVudCBpbnN0YW5jZSBhbmQgbm90IHRob3NlCi13aGljaCB3ZXJlIGRlcml2ZWQgZnJvbSBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLiAgQXBwbGljYXRpb25zIHdoaWNoCi1zZXQgdGhpcyBuZWVkIHRvIGJlIGVzcGVjaWFsbHkgY2FyZWZ1bCB0byB1c2Ugd2hhdCBhZGRpdGlvbmFsCi1pbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgZnJvbSB0aGUgZGVjbGFyYXRpb25zIGFzIG5lZWRlZCB0byBjb21wbHkKLXdpdGggdGhlIHN0YW5kYXJkcyBmb3IgdGhlIGJlaGF2aW9yIG9mIFhNTCBwcm9jZXNzb3JzLiAgQnkgZGVmYXVsdCwKLXRoaXMgYXR0cmlidXRlIGlzIGZhbHNlOyBpdCBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgdGltZS4KLVx2ZXJzaW9uYWRkZWR7Mi4xfQotXGVuZHttZW1iZXJkZXNjfQotCi1UaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgY29udGFpbiB2YWx1ZXMgcmVsYXRpbmcgdG8gdGhlIG1vc3QgcmVjZW50Ci1lcnJvciBlbmNvdW50ZXJlZCBieSBhbiBcY2xhc3N7eG1scGFyc2VyfSBvYmplY3QsIGFuZCB3aWxsIG9ubHkgaGF2ZQotY29ycmVjdCB2YWx1ZXMgb25jZSBhIGNhbGwgdG8gXG1ldGhvZHtQYXJzZSgpfSBvciBcbWV0aG9ke1BhcnNlRmlsZSgpfQotaGFzIHJhaXNlZCBhIFxleGNlcHRpb257eG1sLnBhcnNlcnMuZXhwYXQuRXhwYXRFcnJvcn0gZXhjZXB0aW9uLgotCi1cYmVnaW57bWVtYmVyZGVzY31beG1scGFyc2VyXXtFcnJvckJ5dGVJbmRleH0gCi1CeXRlIGluZGV4IGF0IHdoaWNoIGFuIGVycm9yIG9jY3VycmVkLgotXGVuZHttZW1iZXJkZXNjfSAKLQotXGJlZ2lue21lbWJlcmRlc2N9W3htbHBhcnNlcl17RXJyb3JDb2RlfSAKLU51bWVyaWMgY29kZSBzcGVjaWZ5aW5nIHRoZSBwcm9ibGVtLiAgVGhpcyB2YWx1ZSBjYW4gYmUgcGFzc2VkIHRvIHRoZQotXGZ1bmN0aW9ue0Vycm9yU3RyaW5nKCl9IGZ1bmN0aW9uLCBvciBjb21wYXJlZCB0byBvbmUgb2YgdGhlIGNvbnN0YW50cwotZGVmaW5lZCBpbiB0aGUgXGNvZGV7ZXJyb3JzfSBvYmplY3QuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVt4bWxwYXJzZXJde0Vycm9yQ29sdW1uTnVtYmVyfSAKLUNvbHVtbiBudW1iZXIgYXQgd2hpY2ggYW4gZXJyb3Igb2NjdXJyZWQuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVt4bWxwYXJzZXJde0Vycm9yTGluZU51bWJlcn0KLUxpbmUgbnVtYmVyIGF0IHdoaWNoIGFuIGVycm9yIG9jY3VycmVkLgotXGVuZHttZW1iZXJkZXNjfQotCi1UaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgY29udGFpbiB2YWx1ZXMgcmVsYXRpbmcgdG8gdGhlIGN1cnJlbnQgcGFyc2UKLWxvY2F0aW9uIGluIGFuIFxjbGFzc3t4bWxwYXJzZXJ9IG9iamVjdC4gIER1cmluZyBhIGNhbGxiYWNrIHJlcG9ydGluZwotYSBwYXJzZSBldmVudCB0aGV5IGluZGljYXRlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlyc3Qgb2YgdGhlIHNlcXVlbmNlCi1vZiBjaGFyYWN0ZXJzIHRoYXQgZ2VuZXJhdGVkIHRoZSBldmVudC4gIFdoZW4gY2FsbGVkIG91dHNpZGUgb2YgYQotY2FsbGJhY2ssIHRoZSBwb3NpdGlvbiBpbmRpY2F0ZWQgd2lsbCBiZSBqdXN0IHBhc3QgdGhlIGxhc3QgcGFyc2UKLWV2ZW50IChyZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlcmUgd2FzIGFuIGFzc29jaWF0ZWQgY2FsbGJhY2spLgotXHZlcnNpb25hZGRlZHsyLjR9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVt4bWxwYXJzZXJde0N1cnJlbnRCeXRlSW5kZXh9IAotQ3VycmVudCBieXRlIGluZGV4IGluIHRoZSBwYXJzZXIgaW5wdXQuCi1cZW5ke21lbWJlcmRlc2N9IAotCi1cYmVnaW57bWVtYmVyZGVzY31beG1scGFyc2VyXXtDdXJyZW50Q29sdW1uTnVtYmVyfSAKLUN1cnJlbnQgY29sdW1uIG51bWJlciBpbiB0aGUgcGFyc2VyIGlucHV0LgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31beG1scGFyc2VyXXtDdXJyZW50TGluZU51bWJlcn0KLUN1cnJlbnQgbGluZSBudW1iZXIgaW4gdGhlIHBhcnNlciBpbnB1dC4KLVxlbmR7bWVtYmVyZGVzY30KLQotSGVyZSBpcyB0aGUgbGlzdCBvZiBoYW5kbGVycyB0aGF0IGNhbiBiZSBzZXQuICBUbyBzZXQgYSBoYW5kbGVyIG9uIGFuCi1cY2xhc3N7eG1scGFyc2VyfSBvYmplY3QgXHZhcntvfSwgdXNlCi1cY29kZXtcdmFye299Llx2YXJ7aGFuZGxlcm5hbWV9ID0gXHZhcntmdW5jfX0uICBcdmFye2hhbmRsZXJuYW1lfSBtdXN0Ci1iZSB0YWtlbiBmcm9tIHRoZSBmb2xsb3dpbmcgbGlzdCwgYW5kIFx2YXJ7ZnVuY30gbXVzdCBiZSBhIGNhbGxhYmxlCi1vYmplY3QgYWNjZXB0aW5nIHRoZSBjb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMuICBUaGUgYXJndW1lbnRzIGFyZQotYWxsIHN0cmluZ3MsIHVubGVzcyBvdGhlcndpc2Ugc3RhdGVkLgotCi1cYmVnaW57bWV0aG9kZGVzY31beG1scGFyc2VyXXtYbWxEZWNsSGFuZGxlcn17dmVyc2lvbiwgZW5jb2RpbmcsIHN0YW5kYWxvbmV9Ci1DYWxsZWQgd2hlbiB0aGUgWE1MIGRlY2xhcmF0aW9uIGlzIHBhcnNlZC4gIFRoZSBYTUwgZGVjbGFyYXRpb24gaXMgdGhlCi0ob3B0aW9uYWwpIGRlY2xhcmF0aW9uIG9mIHRoZSBhcHBsaWNhYmxlIHZlcnNpb24gb2YgdGhlIFhNTAotcmVjb21tZW5kYXRpb24sIHRoZSBlbmNvZGluZyBvZiB0aGUgZG9jdW1lbnQgdGV4dCwgYW5kIGFuIG9wdGlvbmFsCi1gYHN0YW5kYWxvbmUnJyBkZWNsYXJhdGlvbi4gIFx2YXJ7dmVyc2lvbn0gYW5kIFx2YXJ7ZW5jb2Rpbmd9IHdpbGwgYmUKLXN0cmluZ3MsIGFuZCBcdmFye3N0YW5kYWxvbmV9IHdpbGwgYmUgXGNvZGV7MX0gaWYgdGhlIGRvY3VtZW50IGlzCi1kZWNsYXJlZCBzdGFuZGFsb25lLCBcY29kZXswfSBpZiBpdCBpcyBkZWNsYXJlZCBub3QgdG8gYmUgc3RhbmRhbG9uZSwKLW9yIFxjb2Rley0xfSBpZiB0aGUgc3RhbmRhbG9uZSBjbGF1c2Ugd2FzIG9taXR0ZWQuCi1UaGlzIGlzIG9ubHkgYXZhaWxhYmxlIHdpdGggRXhwYXQgdmVyc2lvbiAxLjk1LjAgb3IgbmV3ZXIuCi1cdmVyc2lvbmFkZGVkezIuMX0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3htbHBhcnNlcl17U3RhcnREb2N0eXBlRGVjbEhhbmRsZXJ9e2RvY3R5cGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbUlkLCBwdWJsaWNJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNfaW50ZXJuYWxfc3Vic2V0fQotQ2FsbGVkIHdoZW4gRXhwYXQgYmVnaW5zIHBhcnNpbmcgdGhlIGRvY3VtZW50IHR5cGUgZGVjbGFyYXRpb24KLShcY29kZXs8IURPQ1RZUEUgXGxkb3RzfSkuICBUaGUgXHZhcntkb2N0eXBlTmFtZX0gaXMgcHJvdmlkZWQgZXhhY3RseQotYXMgcHJlc2VudGVkLiAgVGhlIFx2YXJ7c3lzdGVtSWR9IGFuZCBcdmFye3B1YmxpY0lkfSBwYXJhbWV0ZXJzIGdpdmUKLXRoZSBzeXN0ZW0gYW5kIHB1YmxpYyBpZGVudGlmaWVycyBpZiBzcGVjaWZpZWQsIG9yIFxjb2Rle05vbmV9IGlmCi1vbWl0dGVkLiAgXHZhcntoYXNfaW50ZXJuYWxfc3Vic2V0fSB3aWxsIGJlIHRydWUgaWYgdGhlIGRvY3VtZW50Ci1jb250YWlucyBhbmQgaW50ZXJuYWwgZG9jdW1lbnQgZGVjbGFyYXRpb24gc3Vic2V0LgotVGhpcyByZXF1aXJlcyBFeHBhdCB2ZXJzaW9uIDEuMiBvciBuZXdlci4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3htbHBhcnNlcl17RW5kRG9jdHlwZURlY2xIYW5kbGVyfXt9Ci1DYWxsZWQgd2hlbiBFeHBhdCBpcyBkb25lIHBhcnNpbmcgdGhlIGRvY3VtZW50IHR5cGUgZGVjbGFyYXRpb24uCi1UaGlzIHJlcXVpcmVzIEV4cGF0IHZlcnNpb24gMS4yIG9yIG5ld2VyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31beG1scGFyc2VyXXtFbGVtZW50RGVjbEhhbmRsZXJ9e25hbWUsIG1vZGVsfQotQ2FsbGVkIG9uY2UgZm9yIGVhY2ggZWxlbWVudCB0eXBlIGRlY2xhcmF0aW9uLiAgXHZhcntuYW1lfSBpcyB0aGUgbmFtZQotb2YgdGhlIGVsZW1lbnQgdHlwZSwgYW5kIFx2YXJ7bW9kZWx9IGlzIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlCi1jb250ZW50IG1vZGVsLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31beG1scGFyc2VyXXtBdHRsaXN0RGVjbEhhbmRsZXJ9e2VsbmFtZSwgYXR0bmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgZGVmYXVsdCwgcmVxdWlyZWR9Ci1DYWxsZWQgZm9yIGVhY2ggZGVjbGFyZWQgYXR0cmlidXRlIGZvciBhbiBlbGVtZW50IHR5cGUuICBJZiBhbgotYXR0cmlidXRlIGxpc3QgZGVjbGFyYXRpb24gZGVjbGFyZXMgdGhyZWUgYXR0cmlidXRlcywgdGhpcyBoYW5kbGVyIGlzCi1jYWxsZWQgdGhyZWUgdGltZXMsIG9uY2UgZm9yIGVhY2ggYXR0cmlidXRlLiAgXHZhcntlbG5hbWV9IGlzIHRoZSBuYW1lCi1vZiB0aGUgZWxlbWVudCB0byB3aGljaCB0aGUgZGVjbGFyYXRpb24gYXBwbGllcyBhbmQgXHZhcnthdHRuYW1lfSBpcwotdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBkZWNsYXJlZC4gIFRoZSBhdHRyaWJ1dGUgdHlwZSBpcyBhIHN0cmluZwotcGFzc2VkIGFzIFx2YXJ7dHlwZX07IHRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlIFxjb2RleydDREFUQSd9LAotXGNvZGV7J0lEJ30sIFxjb2RleydJRFJFRid9LCAuLi4KLVx2YXJ7ZGVmYXVsdH0gZ2l2ZXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUgdXNlZCB3aGVuIHRoZQotYXR0cmlidXRlIGlzIG5vdCBzcGVjaWZpZWQgYnkgdGhlIGRvY3VtZW50IGluc3RhbmNlLCBvciBcY29kZXtOb25lfSBpZgotdGhlcmUgaXMgbm8gZGVmYXVsdCB2YWx1ZSAoXGNvZGV7XCNJTVBMSUVEfSB2YWx1ZXMpLiAgSWYgdGhlIGF0dHJpYnV0ZQotaXMgcmVxdWlyZWQgdG8gYmUgZ2l2ZW4gaW4gdGhlIGRvY3VtZW50IGluc3RhbmNlLCBcdmFye3JlcXVpcmVkfSB3aWxsCi1iZSB0cnVlLgotVGhpcyByZXF1aXJlcyBFeHBhdCB2ZXJzaW9uIDEuOTUuMCBvciBuZXdlci4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3htbHBhcnNlcl17U3RhcnRFbGVtZW50SGFuZGxlcn17bmFtZSwgYXR0cmlidXRlc30KLUNhbGxlZCBmb3IgdGhlIHN0YXJ0IG9mIGV2ZXJ5IGVsZW1lbnQuICBcdmFye25hbWV9IGlzIGEgc3RyaW5nCi1jb250YWluaW5nIHRoZSBlbGVtZW50IG5hbWUsIGFuZCBcdmFye2F0dHJpYnV0ZXN9IGlzIGEgZGljdGlvbmFyeQotbWFwcGluZyBhdHRyaWJ1dGUgbmFtZXMgdG8gdGhlaXIgdmFsdWVzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31beG1scGFyc2VyXXtFbmRFbGVtZW50SGFuZGxlcn17bmFtZX0KLUNhbGxlZCBmb3IgdGhlIGVuZCBvZiBldmVyeSBlbGVtZW50LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31beG1scGFyc2VyXXtQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyfXt0YXJnZXQsIGRhdGF9Ci1DYWxsZWQgZm9yIGV2ZXJ5IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt4bWxwYXJzZXJde0NoYXJhY3RlckRhdGFIYW5kbGVyfXtkYXRhfQotQ2FsbGVkIGZvciBjaGFyYWN0ZXIgZGF0YS4gIFRoaXMgd2lsbCBiZSBjYWxsZWQgZm9yIG5vcm1hbCBjaGFyYWN0ZXIKLWRhdGEsIENEQVRBIG1hcmtlZCBjb250ZW50LCBhbmQgaWdub3JhYmxlIHdoaXRlc3BhY2UuICBBcHBsaWNhdGlvbnMKLXdoaWNoIG11c3QgZGlzdGluZ3Vpc2ggdGhlc2UgY2FzZXMgY2FuIHVzZSB0aGUKLVxtZW1iZXJ7U3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyfSwgXG1lbWJlcntFbmRDZGF0YVNlY3Rpb25IYW5kbGVyfSwKLWFuZCBcbWVtYmVye0VsZW1lbnREZWNsSGFuZGxlcn0gY2FsbGJhY2tzIHRvIGNvbGxlY3QgdGhlIHJlcXVpcmVkCi1pbmZvcm1hdGlvbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3htbHBhcnNlcl17VW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlcn17ZW50aXR5TmFtZSwgYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbUlkLCBwdWJsaWNJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGF0aW9uTmFtZX0KLUNhbGxlZCBmb3IgdW5wYXJzZWQgKE5EQVRBKSBlbnRpdHkgZGVjbGFyYXRpb25zLiAgVGhpcyBpcyBvbmx5IHByZXNlbnQKLWZvciB2ZXJzaW9uIDEuMiBvZiB0aGUgRXhwYXQgbGlicmFyeTsgZm9yIG1vcmUgcmVjZW50IHZlcnNpb25zLCB1c2UKLVxtZW1iZXJ7RW50aXR5RGVjbEhhbmRsZXJ9IGluc3RlYWQuICAoVGhlIHVuZGVybHlpbmcgZnVuY3Rpb24gaW4gdGhlCi1FeHBhdCBsaWJyYXJ5IGhhcyBiZWVuIGRlY2xhcmVkIG9ic29sZXRlLikKLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3htbHBhcnNlcl17RW50aXR5RGVjbEhhbmRsZXJ9e2VudGl0eU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfcGFyYW1ldGVyX2VudGl0eSwgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwgc3lzdGVtSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90YXRpb25OYW1lfQotQ2FsbGVkIGZvciBhbGwgZW50aXR5IGRlY2xhcmF0aW9ucy4gIEZvciBwYXJhbWV0ZXIgYW5kIGludGVybmFsCi1lbnRpdGllcywgXHZhcnt2YWx1ZX0gd2lsbCBiZSBhIHN0cmluZyBnaXZpbmcgdGhlIGRlY2xhcmVkIGNvbnRlbnRzCi1vZiB0aGUgZW50aXR5OyB0aGlzIHdpbGwgYmUgXGNvZGV7Tm9uZX0gZm9yIGV4dGVybmFsIGVudGl0aWVzLiAgVGhlCi1cdmFye25vdGF0aW9uTmFtZX0gcGFyYW1ldGVyIHdpbGwgYmUgXGNvZGV7Tm9uZX0gZm9yIHBhcnNlZCBlbnRpdGllcywKLWFuZCB0aGUgbmFtZSBvZiB0aGUgbm90YXRpb24gZm9yIHVucGFyc2VkIGVudGl0aWVzLgotXHZhcntpc19wYXJhbWV0ZXJfZW50aXR5fSB3aWxsIGJlIHRydWUgaWYgdGhlIGVudGl0eSBpcyBhIHBhcmFtZXRlcgotZW50aXR5IG9yIGZhbHNlIGZvciBnZW5lcmFsIGVudGl0aWVzIChtb3N0IGFwcGxpY2F0aW9ucyBvbmx5IG5lZWQgdG8KLWJlIGNvbmNlcm5lZCB3aXRoIGdlbmVyYWwgZW50aXRpZXMpLgotVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBzdGFydGluZyB3aXRoIHZlcnNpb24gMS45NS4wIG9mIHRoZSBFeHBhdAotbGlicmFyeS4KLVx2ZXJzaW9uYWRkZWR7Mi4xfQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31beG1scGFyc2VyXXtOb3RhdGlvbkRlY2xIYW5kbGVyfXtub3RhdGlvbk5hbWUsIGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCwgcHVibGljSWR9Ci1DYWxsZWQgZm9yIG5vdGF0aW9uIGRlY2xhcmF0aW9ucy4gIFx2YXJ7bm90YXRpb25OYW1lfSwgXHZhcntiYXNlfSwgYW5kCi1cdmFye3N5c3RlbUlkfSwgYW5kIFx2YXJ7cHVibGljSWR9IGFyZSBzdHJpbmdzIGlmIGdpdmVuLiAgSWYgdGhlCi1wdWJsaWMgaWRlbnRpZmllciBpcyBvbWl0dGVkLCBcdmFye3B1YmxpY0lkfSB3aWxsIGJlIFxjb2Rle05vbmV9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31beG1scGFyc2VyXXtTdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyfXtwcmVmaXgsIHVyaX0KLUNhbGxlZCB3aGVuIGFuIGVsZW1lbnQgY29udGFpbnMgYSBuYW1lc3BhY2UgZGVjbGFyYXRpb24uICBOYW1lc3BhY2UKLWRlY2xhcmF0aW9ucyBhcmUgcHJvY2Vzc2VkIGJlZm9yZSB0aGUgXG1lbWJlcntTdGFydEVsZW1lbnRIYW5kbGVyfSBpcwotY2FsbGVkIGZvciB0aGUgZWxlbWVudCBvbiB3aGljaCBkZWNsYXJhdGlvbnMgYXJlIHBsYWNlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3htbHBhcnNlcl17RW5kTmFtZXNwYWNlRGVjbEhhbmRsZXJ9e3ByZWZpeH0KLUNhbGxlZCB3aGVuIHRoZSBjbG9zaW5nIHRhZyBpcyByZWFjaGVkIGZvciBhbiBlbGVtZW50IAotdGhhdCBjb250YWluZWQgYSBuYW1lc3BhY2UgZGVjbGFyYXRpb24uICBUaGlzIGlzIGNhbGxlZCBvbmNlIGZvciBlYWNoCi1uYW1lc3BhY2UgZGVjbGFyYXRpb24gb24gdGhlIGVsZW1lbnQgaW4gdGhlIHJldmVyc2Ugb2YgdGhlIG9yZGVyIGZvcgotd2hpY2ggdGhlIFxtZW1iZXJ7U3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlcn0gd2FzIGNhbGxlZCB0byBpbmRpY2F0ZQotdGhlIHN0YXJ0IG9mIGVhY2ggbmFtZXNwYWNlIGRlY2xhcmF0aW9uJ3Mgc2NvcGUuICBDYWxscyB0byB0aGlzCi1oYW5kbGVyIGFyZSBtYWRlIGFmdGVyIHRoZSBjb3JyZXNwb25kaW5nIFxtZW1iZXJ7RW5kRWxlbWVudEhhbmRsZXJ9Ci1mb3IgdGhlIGVuZCBvZiB0aGUgZWxlbWVudC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3htbHBhcnNlcl17Q29tbWVudEhhbmRsZXJ9e2RhdGF9Ci1DYWxsZWQgZm9yIGNvbW1lbnRzLiAgXHZhcntkYXRhfSBpcyB0aGUgdGV4dCBvZiB0aGUgY29tbWVudCwgZXhjbHVkaW5nCi10aGUgbGVhZGluZyBgXGNvZGV7PCEtfVxjb2Rley19JyBhbmQgdHJhaWxpbmcgYFxjb2Rley19XGNvZGV7LT59Jy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3htbHBhcnNlcl17U3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyfXt9Ci1DYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIGEgQ0RBVEEgc2VjdGlvbi4gIFRoaXMgYW5kCi1cbWVtYmVye0VuZENkYXRhU2VjdGlvbkhhbmRsZXJ9IGFyZSBuZWVkZWQgdG8gYmUgYWJsZSB0byBpZGVudGlmeQotdGhlIHN5bnRhY3RpY2FsIHN0YXJ0IGFuZCBlbmQgZm9yIENEQVRBIHNlY3Rpb25zLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31beG1scGFyc2VyXXtFbmRDZGF0YVNlY3Rpb25IYW5kbGVyfXt9Ci1DYWxsZWQgYXQgdGhlIGVuZCBvZiBhIENEQVRBIHNlY3Rpb24uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt4bWxwYXJzZXJde0RlZmF1bHRIYW5kbGVyfXtkYXRhfQotQ2FsbGVkIGZvciBhbnkgY2hhcmFjdGVycyBpbiB0aGUgWE1MIGRvY3VtZW50IGZvcgotd2hpY2ggbm8gYXBwbGljYWJsZSBoYW5kbGVyIGhhcyBiZWVuIHNwZWNpZmllZC4gIFRoaXMgbWVhbnMKLWNoYXJhY3RlcnMgdGhhdCBhcmUgcGFydCBvZiBhIGNvbnN0cnVjdCB3aGljaCBjb3VsZCBiZSByZXBvcnRlZCwgYnV0Ci1mb3Igd2hpY2ggbm8gaGFuZGxlciBoYXMgYmVlbiBzdXBwbGllZC4gCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVt4bWxwYXJzZXJde0RlZmF1bHRIYW5kbGVyRXhwYW5kfXtkYXRhfQotVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgXGZ1bmN0aW9ue0RlZmF1bHRIYW5kbGVyfSwgCi1idXQgZG9lc24ndCBpbmhpYml0IGV4cGFuc2lvbiBvZiBpbnRlcm5hbCBlbnRpdGllcy4KLVRoZSBlbnRpdHkgcmVmZXJlbmNlIHdpbGwgbm90IGJlIHBhc3NlZCB0byB0aGUgZGVmYXVsdCBoYW5kbGVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31beG1scGFyc2VyXXtOb3RTdGFuZGFsb25lSGFuZGxlcn17fSBDYWxsZWQgaWYgdGhlCi1YTUwgZG9jdW1lbnQgaGFzbid0IGJlZW4gZGVjbGFyZWQgYXMgYmVpbmcgYSBzdGFuZGFsb25lIGRvY3VtZW50LgotVGhpcyBoYXBwZW5zIHdoZW4gdGhlcmUgaXMgYW4gZXh0ZXJuYWwgc3Vic2V0IG9yIGEgcmVmZXJlbmNlIHRvIGEKLXBhcmFtZXRlciBlbnRpdHksIGJ1dCB0aGUgWE1MIGRlY2xhcmF0aW9uIGRvZXMgbm90IHNldCBzdGFuZGFsb25lIHRvCi1cY29kZXt5ZXN9IGluIGFuIFhNTCBkZWNsYXJhdGlvbi4gIElmIHRoaXMgaGFuZGxlciByZXR1cm5zIFxjb2RlezB9LAotdGhlbiB0aGUgcGFyc2VyIHdpbGwgdGhyb3cgYW4gXGNvbnN0YW50e1hNTF9FUlJPUl9OT1RfU1RBTkRBTE9ORX0KLWVycm9yLiAgSWYgdGhpcyBoYW5kbGVyIGlzIG5vdCBzZXQsIG5vIGV4Y2VwdGlvbiBpcyByYWlzZWQgYnkgdGhlCi1wYXJzZXIgZm9yIHRoaXMgY29uZGl0aW9uLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31beG1scGFyc2VyXXtFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXJ9e2NvbnRleHQsIGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbUlkLCBwdWJsaWNJZH0KLUNhbGxlZCBmb3IgcmVmZXJlbmNlcyB0byBleHRlcm5hbCBlbnRpdGllcy4gIFx2YXJ7YmFzZX0gaXMgdGhlIGN1cnJlbnQKLWJhc2UsIGFzIHNldCBieSBhIHByZXZpb3VzIGNhbGwgdG8gXG1ldGhvZHtTZXRCYXNlKCl9LiAgVGhlIHB1YmxpYyBhbmQKLXN5c3RlbSBpZGVudGlmaWVycywgXHZhcntzeXN0ZW1JZH0gYW5kIFx2YXJ7cHVibGljSWR9LCBhcmUgc3RyaW5ncyBpZgotZ2l2ZW47IGlmIHRoZSBwdWJsaWMgaWRlbnRpZmllciBpcyBub3QgZ2l2ZW4sIFx2YXJ7cHVibGljSWR9IHdpbGwgYmUKLVxjb2Rle05vbmV9LiAgVGhlIFx2YXJ7Y29udGV4dH0gdmFsdWUgaXMgb3BhcXVlIGFuZCBzaG91bGQgb25seSBiZQotdXNlZCBhcyBkZXNjcmliZWQgYmVsb3cuCi0KLUZvciBleHRlcm5hbCBlbnRpdGllcyB0byBiZSBwYXJzZWQsIHRoaXMgaGFuZGxlciBtdXN0IGJlIGltcGxlbWVudGVkLgotSXQgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSBzdWItcGFyc2VyIHVzaW5nCi1cY29kZXtFeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZShcdmFye2NvbnRleHR9KX0sIGluaXRpYWxpemluZyBpdCB3aXRoCi10aGUgYXBwcm9wcmlhdGUgY2FsbGJhY2tzLCBhbmQgcGFyc2luZyB0aGUgZW50aXR5LiAgVGhpcyBoYW5kbGVyCi1zaG91bGQgcmV0dXJuIGFuIGludGVnZXI7IGlmIGl0IHJldHVybnMgXGNvZGV7MH0sIHRoZSBwYXJzZXIgd2lsbAotdGhyb3cgYW4gXGNvbnN0YW50e1hNTF9FUlJPUl9FWFRFUk5BTF9FTlRJVFlfSEFORExJTkd9IGVycm9yLAotb3RoZXJ3aXNlIHBhcnNpbmcgd2lsbCBjb250aW51ZS4KLQotSWYgdGhpcyBoYW5kbGVyIGlzIG5vdCBwcm92aWRlZCwgZXh0ZXJuYWwgZW50aXRpZXMgYXJlIHJlcG9ydGVkIGJ5IHRoZQotXG1lbWJlcntEZWZhdWx0SGFuZGxlcn0gY2FsbGJhY2ssIGlmIHByb3ZpZGVkLgotXGVuZHttZXRob2RkZXNjfQotCi0KLVxzdWJzZWN0aW9ue0V4cGF0RXJyb3IgRXhjZXB0aW9ucyBcbGFiZWx7ZXhwYXRlcnJvci1vYmplY3RzfX0KLVxzZWN0aW9uYXV0aG9ye0ZyZWQgTC4gRHJha2UsIEpyLn17ZmRyYWtlQGFjbS5vcmd9Ci0KLVxleGNlcHRpb257RXhwYXRFcnJvcn0gZXhjZXB0aW9ucyBoYXZlIGEgbnVtYmVyIG9mIGludGVyZXN0aW5nCi1hdHRyaWJ1dGVzOgotCi1cYmVnaW57bWVtYmVyZGVzY31bRXhwYXRFcnJvcl17Y29kZX0KLSAgRXhwYXQncyBpbnRlcm5hbCBlcnJvciBudW1iZXIgZm9yIHRoZSBzcGVjaWZpYyBlcnJvci4gIFRoaXMgd2lsbAotICBtYXRjaCBvbmUgb2YgdGhlIGNvbnN0YW50cyBkZWZpbmVkIGluIHRoZSBcY29kZXtlcnJvcnN9IG9iamVjdCBmcm9tCi0gIHRoaXMgbW9kdWxlLgotICBcdmVyc2lvbmFkZGVkezIuMX0KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W0V4cGF0RXJyb3Jde2xpbmVub30KLSAgTGluZSBudW1iZXIgb24gd2hpY2ggdGhlIGVycm9yIHdhcyBkZXRlY3RlZC4gIFRoZSBmaXJzdCBsaW5lIGlzCi0gIG51bWJlcmVkIFxjb2RlezF9LgotICBcdmVyc2lvbmFkZGVkezIuMX0KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W0V4cGF0RXJyb3Jde29mZnNldH0KLSAgQ2hhcmFjdGVyIG9mZnNldCBpbnRvIHRoZSBsaW5lIHdoZXJlIHRoZSBlcnJvciBvY2N1cnJlZC4gIFRoZSBmaXJzdAotICBjb2x1bW4gaXMgbnVtYmVyZWQgXGNvZGV7MH0uCi0gIFx2ZXJzaW9uYWRkZWR7Mi4xfQotXGVuZHttZW1iZXJkZXNjfQotCi0KLVxzdWJzZWN0aW9ue0V4YW1wbGUgXGxhYmVse2V4cGF0LWV4YW1wbGV9fQotCi1UaGUgZm9sbG93aW5nIHByb2dyYW0gZGVmaW5lcyB0aHJlZSBoYW5kbGVycyB0aGF0IGp1c3QgcHJpbnQgb3V0IHRoZWlyCi1hcmd1bWVudHMuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCB4bWwucGFyc2Vycy5leHBhdAotCi0jIDMgaGFuZGxlciBmdW5jdGlvbnMKLWRlZiBzdGFydF9lbGVtZW50KG5hbWUsIGF0dHJzKToKLSAgICBwcmludCAnU3RhcnQgZWxlbWVudDonLCBuYW1lLCBhdHRycwotZGVmIGVuZF9lbGVtZW50KG5hbWUpOgotICAgIHByaW50ICdFbmQgZWxlbWVudDonLCBuYW1lCi1kZWYgY2hhcl9kYXRhKGRhdGEpOgotICAgIHByaW50ICdDaGFyYWN0ZXIgZGF0YTonLCByZXByKGRhdGEpCi0KLXAgPSB4bWwucGFyc2Vycy5leHBhdC5QYXJzZXJDcmVhdGUoKQotCi1wLlN0YXJ0RWxlbWVudEhhbmRsZXIgPSBzdGFydF9lbGVtZW50Ci1wLkVuZEVsZW1lbnRIYW5kbGVyID0gZW5kX2VsZW1lbnQKLXAuQ2hhcmFjdGVyRGF0YUhhbmRsZXIgPSBjaGFyX2RhdGEKLQotcC5QYXJzZSgiIiI8P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTxwYXJlbnQgaWQ9InRvcCI+PGNoaWxkMSBuYW1lPSJwYXVsIj5UZXh0IGdvZXMgaGVyZTwvY2hpbGQxPgotPGNoaWxkMiBuYW1lPSJmcmVkIj5Nb3JlIHRleHQ8L2NoaWxkMj4KLTwvcGFyZW50PiIiIiwgMSkKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBvdXRwdXQgZnJvbSB0aGlzIHByb2dyYW0gaXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLVN0YXJ0IGVsZW1lbnQ6IHBhcmVudCB7J2lkJzogJ3RvcCd9Ci1TdGFydCBlbGVtZW50OiBjaGlsZDEgeyduYW1lJzogJ3BhdWwnfQotQ2hhcmFjdGVyIGRhdGE6ICdUZXh0IGdvZXMgaGVyZScKLUVuZCBlbGVtZW50OiBjaGlsZDEKLUNoYXJhY3RlciBkYXRhOiAnXG4nCi1TdGFydCBlbGVtZW50OiBjaGlsZDIgeyduYW1lJzogJ2ZyZWQnfQotQ2hhcmFjdGVyIGRhdGE6ICdNb3JlIHRleHQnCi1FbmQgZWxlbWVudDogY2hpbGQyCi1DaGFyYWN0ZXIgZGF0YTogJ1xuJwotRW5kIGVsZW1lbnQ6IHBhcmVudAotXGVuZHt2ZXJiYXRpbX0KLQotCi1cc3Vic2VjdGlvbntDb250ZW50IE1vZGVsIERlc2NyaXB0aW9ucyBcbGFiZWx7ZXhwYXQtY29udGVudC1tb2RlbHN9fQotXHNlY3Rpb25hdXRob3J7RnJlZCBMLiBEcmFrZSwgSnIufXtmZHJha2VAYWNtLm9yZ30KLQotQ29udGVudCBtb2R1bGVzIGFyZSBkZXNjcmliZWQgdXNpbmcgbmVzdGVkIHR1cGxlcy4gIEVhY2ggdHVwbGUKLWNvbnRhaW5zIGZvdXIgdmFsdWVzOiB0aGUgdHlwZSwgdGhlIHF1YW50aWZpZXIsIHRoZSBuYW1lLCBhbmQgYSB0dXBsZQotb2YgY2hpbGRyZW4uICBDaGlsZHJlbiBhcmUgc2ltcGx5IGFkZGl0aW9uYWwgY29udGVudCBtb2R1bGUKLWRlc2NyaXB0aW9ucy4KLQotVGhlIHZhbHVlcyBvZiB0aGUgZmlyc3QgdHdvIGZpZWxkcyBhcmUgY29uc3RhbnRzIGRlZmluZWQgaW4gdGhlCi1cY29kZXttb2RlbH0gb2JqZWN0IG9mIHRoZSBcbW9kdWxle3htbC5wYXJzZXJzLmV4cGF0fSBtb2R1bGUuICBUaGVzZQotY29uc3RhbnRzIGNhbiBiZSBjb2xsZWN0ZWQgaW4gdHdvIGdyb3VwczogdGhlIG1vZGVsIHR5cGUgZ3JvdXAgYW5kIHRoZQotcXVhbnRpZmllciBncm91cC4KLQotVGhlIGNvbnN0YW50cyBpbiB0aGUgbW9kZWwgdHlwZSBncm91cCBhcmU6Ci0KLVxiZWdpbntkYXRhZGVzY25pfXtYTUxfQ1RZUEVfQU5ZfQotVGhlIGVsZW1lbnQgbmFtZWQgYnkgdGhlIG1vZGVsIG5hbWUgd2FzIGRlY2xhcmVkIHRvIGhhdmUgYSBjb250ZW50Ci1tb2RlbCBvZiBcY29kZXtBTll9LgotXGVuZHtkYXRhZGVzY25pfQotCi1cYmVnaW57ZGF0YWRlc2NuaX17WE1MX0NUWVBFX0NIT0lDRX0KLVRoZSBuYW1lZCBlbGVtZW50IGFsbG93cyBhIGNob2ljZSBmcm9tIGEgbnVtYmVyIG9mIG9wdGlvbnM7IHRoaXMgaXMKLXVzZWQgZm9yIGNvbnRlbnQgbW9kZWxzIHN1Y2ggYXMgXGNvZGV7KEEgfCBCIHwgQyl9LgotXGVuZHtkYXRhZGVzY25pfQotCi1cYmVnaW57ZGF0YWRlc2NuaX17WE1MX0NUWVBFX0VNUFRZfQotRWxlbWVudHMgd2hpY2ggYXJlIGRlY2xhcmVkIHRvIGJlIFxjb2Rle0VNUFRZfSBoYXZlIHRoaXMgbW9kZWwgdHlwZS4KLVxlbmR7ZGF0YWRlc2NuaX0KLQotXGJlZ2lue2RhdGFkZXNjbml9e1hNTF9DVFlQRV9NSVhFRH0KLVxlbmR7ZGF0YWRlc2NuaX0KLQotXGJlZ2lue2RhdGFkZXNjbml9e1hNTF9DVFlQRV9OQU1FfQotXGVuZHtkYXRhZGVzY25pfQotCi1cYmVnaW57ZGF0YWRlc2NuaX17WE1MX0NUWVBFX1NFUX0KLU1vZGVscyB3aGljaCByZXByZXNlbnQgYSBzZXJpZXMgb2YgbW9kZWxzIHdoaWNoIGZvbGxvdyBvbmUgYWZ0ZXIgdGhlCi1vdGhlciBhcmUgaW5kaWNhdGVkIHdpdGggdGhpcyBtb2RlbCB0eXBlLiAgVGhpcyBpcyB1c2VkIGZvciBtb2RlbHMKLXN1Y2ggYXMgXGNvZGV7KEEsIEIsIEMpfS4KLVxlbmR7ZGF0YWRlc2NuaX0KLQotCi1UaGUgY29uc3RhbnRzIGluIHRoZSBxdWFudGlmaWVyIGdyb3VwIGFyZToKLQotXGJlZ2lue2RhdGFkZXNjbml9e1hNTF9DUVVBTlRfTk9ORX0KLU5vIG1vZGlmaWVyIGlzIGdpdmVuLCBzbyBpdCBjYW4gYXBwZWFyIGV4YWN0bHkgb25jZSwgYXMgZm9yIFxjb2Rle0F9LgotXGVuZHtkYXRhZGVzY25pfQotCi1cYmVnaW57ZGF0YWRlc2NuaX17WE1MX0NRVUFOVF9PUFR9Ci1UaGUgbW9kZWwgaXMgb3B0aW9uYWw6IGl0IGNhbiBhcHBlYXIgb25jZSBvciBub3QgYXQgYWxsLCBhcyBmb3IKLVxjb2Rle0E/fS4KLVxlbmR7ZGF0YWRlc2NuaX0KLQotXGJlZ2lue2RhdGFkZXNjbml9e1hNTF9DUVVBTlRfUExVU30KLVRoZSBtb2RlbCBtdXN0IG9jY3VyIG9uZSBvciBtb3JlIHRpbWVzIChsaWtlIFxjb2Rle0ErfSkuCi1cZW5ke2RhdGFkZXNjbml9Ci0KLVxiZWdpbntkYXRhZGVzY25pfXtYTUxfQ1FVQU5UX1JFUH0KLVRoZSBtb2RlbCBtdXN0IG9jY3VyIHplcm8gb3IgbW9yZSB0aW1lcywgYXMgZm9yIFxjb2Rle0EqfS4KLVxlbmR7ZGF0YWRlc2NuaX0KLQotCi1cc3Vic2VjdGlvbntFeHBhdCBlcnJvciBjb25zdGFudHMgXGxhYmVse2V4cGF0LWVycm9yc319Ci0KLVRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIGFyZSBwcm92aWRlZCBpbiB0aGUgXGNvZGV7ZXJyb3JzfSBvYmplY3Qgb2YKLXRoZSBccmVmbW9kdWxle3htbC5wYXJzZXJzLmV4cGF0fSBtb2R1bGUuICBUaGVzZSBjb25zdGFudHMgYXJlIHVzZWZ1bAotaW4gaW50ZXJwcmV0aW5nIHNvbWUgb2YgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIFxleGNlcHRpb257RXhwYXRFcnJvcn0KLWV4Y2VwdGlvbiBvYmplY3RzIHJhaXNlZCB3aGVuIGFuIGVycm9yIGhhcyBvY2N1cnJlZC4KLQotVGhlIFxjb2Rle2Vycm9yc30gb2JqZWN0IGhhcyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6Ci0KLVxiZWdpbntkYXRhZGVzY25pfXtYTUxfRVJST1JfQVNZTkNfRU5USVRZfQotXGVuZHtkYXRhZGVzY25pfQotCi1cYmVnaW57ZGF0YWRlc2NuaX17WE1MX0VSUk9SX0FUVFJJQlVURV9FWFRFUk5BTF9FTlRJVFlfUkVGfQotQW4gZW50aXR5IHJlZmVyZW5jZSBpbiBhbiBhdHRyaWJ1dGUgdmFsdWUgcmVmZXJyZWQgdG8gYW4gZXh0ZXJuYWwKLWVudGl0eSBpbnN0ZWFkIG9mIGFuIGludGVybmFsIGVudGl0eS4KLVxlbmR7ZGF0YWRlc2NuaX0KLQotXGJlZ2lue2RhdGFkZXNjbml9e1hNTF9FUlJPUl9CQURfQ0hBUl9SRUZ9Ci1BIGNoYXJhY3RlciByZWZlcmVuY2UgcmVmZXJyZWQgdG8gYSBjaGFyYWN0ZXIgd2hpY2ggaXMgaWxsZWdhbCBpbiBYTUwKLShmb3IgZXhhbXBsZSwgY2hhcmFjdGVyIFxjb2RlezB9LCBvciBgXGNvZGV7XCZcIzA7fScpLgotXGVuZHtkYXRhZGVzY25pfQotCi1cYmVnaW57ZGF0YWRlc2NuaX17WE1MX0VSUk9SX0JJTkFSWV9FTlRJVFlfUkVGfQotQW4gZW50aXR5IHJlZmVyZW5jZSByZWZlcnJlZCB0byBhbiBlbnRpdHkgd2hpY2ggd2FzIGRlY2xhcmVkIHdpdGggYQotbm90YXRpb24sIHNvIGNhbm5vdCBiZSBwYXJzZWQuCi1cZW5ke2RhdGFkZXNjbml9Ci0KLVxiZWdpbntkYXRhZGVzY25pfXtYTUxfRVJST1JfRFVQTElDQVRFX0FUVFJJQlVURX0KLUFuIGF0dHJpYnV0ZSB3YXMgdXNlZCBtb3JlIHRoYW4gb25jZSBpbiBhIHN0YXJ0IHRhZy4KLVxlbmR7ZGF0YWRlc2NuaX0KLQotXGJlZ2lue2RhdGFkZXNjbml9e1hNTF9FUlJPUl9JTkNPUlJFQ1RfRU5DT0RJTkd9Ci1cZW5ke2RhdGFkZXNjbml9Ci0KLVxiZWdpbntkYXRhZGVzY25pfXtYTUxfRVJST1JfSU5WQUxJRF9UT0tFTn0KLVJhaXNlZCB3aGVuIGFuIGlucHV0IGJ5dGUgY291bGQgbm90IHByb3Blcmx5IGJlIGFzc2lnbmVkIHRvIGEKLWNoYXJhY3RlcjsgZm9yIGV4YW1wbGUsIGEgTlVMIGJ5dGUgKHZhbHVlIFxjb2RlezB9KSBpbiBhIFVURi04IGlucHV0Ci1zdHJlYW0uCi1cZW5ke2RhdGFkZXNjbml9Ci0KLVxiZWdpbntkYXRhZGVzY25pfXtYTUxfRVJST1JfSlVOS19BRlRFUl9ET0NfRUxFTUVOVH0KLVNvbWV0aGluZyBvdGhlciB0aGFuIHdoaXRlc3BhY2Ugb2NjdXJyZWQgYWZ0ZXIgdGhlIGRvY3VtZW50IGVsZW1lbnQuCi1cZW5ke2RhdGFkZXNjbml9Ci0KLVxiZWdpbntkYXRhZGVzY25pfXtYTUxfRVJST1JfTUlTUExBQ0VEX1hNTF9QSX0KLUFuIFhNTCBkZWNsYXJhdGlvbiB3YXMgZm91bmQgc29tZXdoZXJlIG90aGVyIHRoYW4gdGhlIHN0YXJ0IG9mIHRoZQotaW5wdXQgZGF0YS4KLVxlbmR7ZGF0YWRlc2NuaX0KLQotXGJlZ2lue2RhdGFkZXNjbml9e1hNTF9FUlJPUl9OT19FTEVNRU5UU30KLVRoZSBkb2N1bWVudCBjb250YWlucyBubyBlbGVtZW50cyAoWE1MIHJlcXVpcmVzIGFsbCBkb2N1bWVudHMgdG8KLWNvbnRhaW4gZXhhY3RseSBvbmUgdG9wLWxldmVsIGVsZW1lbnQpLi4KLVxlbmR7ZGF0YWRlc2NuaX0KLQotXGJlZ2lue2RhdGFkZXNjbml9e1hNTF9FUlJPUl9OT19NRU1PUll9Ci1FeHBhdCB3YXMgbm90IGFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGludGVybmFsbHkuCi1cZW5ke2RhdGFkZXNjbml9Ci0KLVxiZWdpbntkYXRhZGVzY25pfXtYTUxfRVJST1JfUEFSQU1fRU5USVRZX1JFRn0KLUEgcGFyYW1ldGVyIGVudGl0eSByZWZlcmVuY2Ugd2FzIGZvdW5kIHdoZXJlIGl0IHdhcyBub3QgYWxsb3dlZC4KLVxlbmR7ZGF0YWRlc2NuaX0KLQotXGJlZ2lue2RhdGFkZXNjbml9e1hNTF9FUlJPUl9QQVJUSUFMX0NIQVJ9Ci1BbiBpbmNvbXBsZXRlIGNoYXJhY3RlciB3YXMgZm91bmQgaW4gdGhlIGlucHV0LgotXGVuZHtkYXRhZGVzY25pfQotCi1cYmVnaW57ZGF0YWRlc2NuaX17WE1MX0VSUk9SX1JFQ1VSU0lWRV9FTlRJVFlfUkVGfQotQW4gZW50aXR5IHJlZmVyZW5jZSBjb250YWluZWQgYW5vdGhlciByZWZlcmVuY2UgdG8gdGhlIHNhbWUgZW50aXR5OwotcG9zc2libHkgdmlhIGEgZGlmZmVyZW50IG5hbWUsIGFuZCBwb3NzaWJseSBpbmRpcmVjdGx5LgotXGVuZHtkYXRhZGVzY25pfQotCi1cYmVnaW57ZGF0YWRlc2NuaX17WE1MX0VSUk9SX1NZTlRBWH0KLVNvbWUgdW5zcGVjaWZpZWQgc3ludGF4IGVycm9yIHdhcyBlbmNvdW50ZXJlZC4KLVxlbmR7ZGF0YWRlc2NuaX0KLQotXGJlZ2lue2RhdGFkZXNjbml9e1hNTF9FUlJPUl9UQUdfTUlTTUFUQ0h9Ci1BbiBlbmQgdGFnIGRpZCBub3QgbWF0Y2ggdGhlIGlubmVybW9zdCBvcGVuIHN0YXJ0IHRhZy4KLVxlbmR7ZGF0YWRlc2NuaX0KLQotXGJlZ2lue2RhdGFkZXNjbml9e1hNTF9FUlJPUl9VTkNMT1NFRF9UT0tFTn0KLVNvbWUgdG9rZW4gKHN1Y2ggYXMgYSBzdGFydCB0YWcpIHdhcyBub3QgY2xvc2VkIGJlZm9yZSB0aGUgZW5kIG9mIHRoZQotc3RyZWFtIG9yIHRoZSBuZXh0IHRva2VuIHdhcyBlbmNvdW50ZXJlZC4KLVxlbmR7ZGF0YWRlc2NuaX0KLQotXGJlZ2lue2RhdGFkZXNjbml9e1hNTF9FUlJPUl9VTkRFRklORURfRU5USVRZfQotQSByZWZlcmVuY2Ugd2FzIG1hZGUgdG8gYSBlbnRpdHkgd2hpY2ggd2FzIG5vdCBkZWZpbmVkLgotXGVuZHtkYXRhZGVzY25pfQotCi1cYmVnaW57ZGF0YWRlc2NuaX17WE1MX0VSUk9SX1VOS05PV05fRU5DT0RJTkd9Ci1UaGUgZG9jdW1lbnQgZW5jb2RpbmcgaXMgbm90IHN1cHBvcnRlZCBieSBFeHBhdC4KLVxlbmR7ZGF0YWRlc2NuaX0KLQotXGJlZ2lue2RhdGFkZXNjbml9e1hNTF9FUlJPUl9VTkNMT1NFRF9DREFUQV9TRUNUSU9OfQotQSBDREFUQSBtYXJrZWQgc2VjdGlvbiB3YXMgbm90IGNsb3NlZC4KLVxlbmR7ZGF0YWRlc2NuaX0KLQotXGJlZ2lue2RhdGFkZXNjbml9e1hNTF9FUlJPUl9FWFRFUk5BTF9FTlRJVFlfSEFORExJTkd9Ci1cZW5ke2RhdGFkZXNjbml9Ci0KLVxiZWdpbntkYXRhZGVzY25pfXtYTUxfRVJST1JfTk9UX1NUQU5EQUxPTkV9Ci1UaGUgcGFyc2VyIGRldGVybWluZWQgdGhhdCB0aGUgZG9jdW1lbnQgd2FzIG5vdCBgYHN0YW5kYWxvbmUnJyB0aG91Z2gKLWl0IGRlY2xhcmVkIGl0c2VsZiB0byBiZSBpbiB0aGUgWE1MIGRlY2xhcmF0aW9uLCBhbmQgdGhlCi1cbWVtYmVye05vdFN0YW5kYWxvbmVIYW5kbGVyfSB3YXMgc2V0IGFuZCByZXR1cm5lZCBcY29kZXswfS4KLVxlbmR7ZGF0YWRlc2NuaX0KLQotXGJlZ2lue2RhdGFkZXNjbml9e1hNTF9FUlJPUl9VTkVYUEVDVEVEX1NUQVRFfQotXGVuZHtkYXRhZGVzY25pfQotCi1cYmVnaW57ZGF0YWRlc2NuaX17WE1MX0VSUk9SX0VOVElUWV9ERUNMQVJFRF9JTl9QRX0KLVxlbmR7ZGF0YWRlc2NuaX0KLQotXGJlZ2lue2RhdGFkZXNjbml9e1hNTF9FUlJPUl9GRUFUVVJFX1JFUVVJUkVTX1hNTF9EVER9Ci1BbiBvcGVyYXRpb24gd2FzIHJlcXVlc3RlZCB0aGF0IHJlcXVpcmVzIERURCBzdXBwb3J0IHRvIGJlIGNvbXBpbGVkCi1pbiwgYnV0IEV4cGF0IHdhcyBjb25maWd1cmVkIHdpdGhvdXQgRFREIHN1cHBvcnQuICBUaGlzIHNob3VsZCBuZXZlcgotYmUgcmVwb3J0ZWQgYnkgYSBzdGFuZGFyZCBidWlsZCBvZiB0aGUgXG1vZHVsZXt4bWwucGFyc2Vycy5leHBhdH0KLW1vZHVsZS4KLVxlbmR7ZGF0YWRlc2NuaX0KLQotXGJlZ2lue2RhdGFkZXNjbml9e1hNTF9FUlJPUl9DQU5UX0NIQU5HRV9GRUFUVVJFX09OQ0VfUEFSU0lOR30KLUEgYmVoYXZpb3JhbCBjaGFuZ2Ugd2FzIHJlcXVlc3RlZCBhZnRlciBwYXJzaW5nIHN0YXJ0ZWQgdGhhdCBjYW4gb25seQotYmUgY2hhbmdlZCBiZWZvcmUgcGFyc2luZyBoYXMgc3RhcnRlZC4gIFRoaXMgaXMgKGN1cnJlbnRseSkgb25seQotcmFpc2VkIGJ5IFxtZXRob2R7VXNlRm9yZWlnbkRURCgpfS4KLVxlbmR7ZGF0YWRlc2NuaX0KLQotXGJlZ2lue2RhdGFkZXNjbml9e1hNTF9FUlJPUl9VTkJPVU5EX1BSRUZJWH0KLUFuIHVuZGVjbGFyZWQgcHJlZml4IHdhcyBmb3VuZCB3aGVuIG5hbWVzcGFjZSBwcm9jZXNzaW5nIHdhcyBlbmFibGVkLgotXGVuZHtkYXRhZGVzY25pfQotCi1cYmVnaW57ZGF0YWRlc2NuaX17WE1MX0VSUk9SX1VOREVDTEFSSU5HX1BSRUZJWH0KLVRoZSBkb2N1bWVudCBhdHRlbXB0ZWQgdG8gcmVtb3ZlIHRoZSBuYW1lc3BhY2UgZGVjbGFyYXRpb24gYXNzb2NpYXRlZAotd2l0aCBhIHByZWZpeC4KLVxlbmR7ZGF0YWRlc2NuaX0KLQotXGJlZ2lue2RhdGFkZXNjbml9e1hNTF9FUlJPUl9JTkNPTVBMRVRFX1BFfQotQSBwYXJhbWV0ZXIgZW50aXR5IGNvbnRhaW5lZCBpbmNvbXBsZXRlIG1hcmt1cC4KLVxlbmR7ZGF0YWRlc2NuaX0KLQotXGJlZ2lue2RhdGFkZXNjbml9e1hNTF9FUlJPUl9YTUxfREVDTH0KLVRoZSBkb2N1bWVudCBjb250YWluZWQgbm8gZG9jdW1lbnQgZWxlbWVudCBhdCBhbGwuCi1cZW5ke2RhdGFkZXNjbml9Ci0KLVxiZWdpbntkYXRhZGVzY25pfXtYTUxfRVJST1JfVEVYVF9ERUNMfQotVGhlcmUgd2FzIGFuIGVycm9yIHBhcnNpbmcgYSB0ZXh0IGRlY2xhcmF0aW9uIGluIGFuIGV4dGVybmFsIGVudGl0eS4KLVxlbmR7ZGF0YWRlc2NuaX0KLQotXGJlZ2lue2RhdGFkZXNjbml9e1hNTF9FUlJPUl9QVUJMSUNJRH0KLUNoYXJhY3RlcnMgd2VyZSBmb3VuZCBpbiB0aGUgcHVibGljIGlkIHRoYXQgYXJlIG5vdCBhbGxvd2VkLgotXGVuZHtkYXRhZGVzY25pfQotCi1cYmVnaW57ZGF0YWRlc2NuaX17WE1MX0VSUk9SX1NVU1BFTkRFRH0KLVRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uIHdhcyBtYWRlIG9uIGEgc3VzcGVuZGVkIHBhcnNlciwgYnV0IGlzbid0Ci1hbGxvd2VkLiAgVGhpcyBpbmNsdWRlcyBhdHRlbXB0cyB0byBwcm92aWRlIGFkZGl0aW9uYWwgaW5wdXQgb3IgdG8KLXN0b3AgdGhlIHBhcnNlci4KLVxlbmR7ZGF0YWRlc2NuaX0KLQotXGJlZ2lue2RhdGFkZXNjbml9e1hNTF9FUlJPUl9OT1RfU1VTUEVOREVEfQotQW4gYXR0ZW1wdCB0byByZXN1bWUgdGhlIHBhcnNlciB3YXMgbWFkZSB3aGVuIHRoZSBwYXJzZXIgaGFkIG5vdCBiZWVuCi1zdXNwZW5kZWQuCi1cZW5ke2RhdGFkZXNjbml9Ci0KLVxiZWdpbntkYXRhZGVzY25pfXtYTUxfRVJST1JfQUJPUlRFRH0KLVRoaXMgc2hvdWxkIG5vdCBiZSByZXBvcnRlZCB0byBQeXRob24gYXBwbGljYXRpb25zLgotXGVuZHtkYXRhZGVzY25pfQotCi1cYmVnaW57ZGF0YWRlc2NuaX17WE1MX0VSUk9SX0ZJTklTSEVEfQotVGhlIHJlcXVlc3RlZCBvcGVyYXRpb24gd2FzIG1hZGUgb24gYSBwYXJzZXIgd2hpY2ggd2FzIGZpbmlzaGVkCi1wYXJzaW5nIGlucHV0LCBidXQgaXNuJ3QgYWxsb3dlZC4gIFRoaXMgaW5jbHVkZXMgYXR0ZW1wdHMgdG8gcHJvdmlkZQotYWRkaXRpb25hbCBpbnB1dCBvciB0byBzdG9wIHRoZSBwYXJzZXIuCi1cZW5ke2RhdGFkZXNjbml9Ci0KLVxiZWdpbntkYXRhZGVzY25pfXtYTUxfRVJST1JfU1VTUEVORF9QRX0KLVxlbmR7ZGF0YWRlc2NuaX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlicHl0aG9uLnRleCBiL0RvYy9saWIvbGlicHl0aG9uLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQxYzM4Ni4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnB5dGhvbi50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVxjaGFwdGVye1B5dGhvbiBSdW50aW1lIFNlcnZpY2VzCi0gICAgICAgICBcbGFiZWx7cHl0aG9ufX0KLQotVGhlIG1vZHVsZXMgZGVzY3JpYmVkIGluIHRoaXMgY2hhcHRlciBwcm92aWRlIGEgd2lkZSByYW5nZSBvZiBzZXJ2aWNlcwotcmVsYXRlZCB0byB0aGUgUHl0aG9uIGludGVycHJldGVyIGFuZCBpdHMgaW50ZXJhY3Rpb24gd2l0aCBpdHMKLWVudmlyb25tZW50LiAgSGVyZSdzIGFuIG92ZXJ2aWV3OgotCi1cbG9jYWxtb2R1bGV0YWJsZQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJxdWV1ZS50ZXggYi9Eb2MvbGliL2xpYnF1ZXVlLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkxYTkxMC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnF1ZXVlLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0KLVxzZWN0aW9ue1xtb2R1bGV7UXVldWV9IC0tLQotICAgICAgICAgQSBzeW5jaHJvbml6ZWQgcXVldWUgY2xhc3N9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtRdWV1ZX0KLVxtb2R1bGVzeW5vcHNpc3tBIHN5bmNocm9uaXplZCBxdWV1ZSBjbGFzcy59Ci0KLQotVGhlIFxtb2R1bGV7UXVldWV9IG1vZHVsZSBpbXBsZW1lbnRzIGEgbXVsdGktcHJvZHVjZXIsIG11bHRpLWNvbnN1bWVyCi1GSUZPIHF1ZXVlLiAgSXQgaXMgZXNwZWNpYWxseSB1c2VmdWwgaW4gdGhyZWFkcyBwcm9ncmFtbWluZyB3aGVuCi1pbmZvcm1hdGlvbiBtdXN0IGJlIGV4Y2hhbmdlZCBzYWZlbHkgYmV0d2VlbiBtdWx0aXBsZSB0aHJlYWRzLiAgVGhlCi1cY2xhc3N7UXVldWV9IGNsYXNzIGluIHRoaXMgbW9kdWxlIGltcGxlbWVudHMgYWxsIHRoZSByZXF1aXJlZCBsb2NraW5nCi1zZW1hbnRpY3MuICBJdCBkZXBlbmRzIG9uIHRoZSBhdmFpbGFiaWxpdHkgb2YgdGhyZWFkIHN1cHBvcnQgaW4KLVB5dGhvbi4KLQotVGhlIFxtb2R1bGV7UXVldWV9IG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgY2xhc3MgYW5kIGV4Y2VwdGlvbjoKLQotCi1cYmVnaW57Y2xhc3NkZXNjfXtRdWV1ZX17bWF4c2l6ZX0KLUNvbnN0cnVjdG9yIGZvciB0aGUgY2xhc3MuICBcdmFye21heHNpemV9IGlzIGFuIGludGVnZXIgdGhhdCBzZXRzIHRoZQotdXBwZXJib3VuZCBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGl0ZW1zIHRoYXQgY2FuIGJlIHBsYWNlZCBpbiB0aGUKLXF1ZXVlLiAgSW5zZXJ0aW9uIHdpbGwgYmxvY2sgb25jZSB0aGlzIHNpemUgaGFzIGJlZW4gcmVhY2hlZCwgdW50aWwKLXF1ZXVlIGl0ZW1zIGFyZSBjb25zdW1lZC4gIElmIFx2YXJ7bWF4c2l6ZX0gaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvCi16ZXJvLCB0aGUgcXVldWUgc2l6ZSBpcyBpbmZpbml0ZS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317RW1wdHl9Ci1FeGNlcHRpb24gcmFpc2VkIHdoZW4gbm9uLWJsb2NraW5nIFxtZXRob2R7Z2V0KCl9IChvcgotXG1ldGhvZHtnZXRfbm93YWl0KCl9KSBpcyBjYWxsZWQgb24gYSBcY2xhc3N7UXVldWV9IG9iamVjdCB3aGljaCBpcwotZW1wdHkuCi1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtGdWxsfQotRXhjZXB0aW9uIHJhaXNlZCB3aGVuIG5vbi1ibG9ja2luZyBcbWV0aG9ke3B1dCgpfSAob3IKLVxtZXRob2R7cHV0X25vd2FpdCgpfSkgaXMgY2FsbGVkIG9uIGEgXGNsYXNze1F1ZXVlfSBvYmplY3Qgd2hpY2ggaXMKLWZ1bGwuCi1cZW5ke2V4Y2Rlc2N9Ci0KLVxzdWJzZWN0aW9ue1F1ZXVlIE9iamVjdHN9Ci1cbGFiZWx7UXVldWVPYmplY3RzfQotCi1DbGFzcyBcY2xhc3N7UXVldWV9IGltcGxlbWVudHMgcXVldWUgb2JqZWN0cyBhbmQgaGFzIHRoZSBtZXRob2RzCi1kZXNjcmliZWQgYmVsb3cuICBUaGlzIGNsYXNzIGNhbiBiZSBkZXJpdmVkIGZyb20gaW4gb3JkZXIgdG8gaW1wbGVtZW50Ci1vdGhlciBxdWV1ZSBvcmdhbml6YXRpb25zIChlLmcuIHN0YWNrKSBidXQgdGhlIGluaGVyaXRhYmxlIGludGVyZmFjZQotaXMgbm90IGRlc2NyaWJlZCBoZXJlLiAgU2VlIHRoZSBzb3VyY2UgY29kZSBmb3IgZGV0YWlscy4gIFRoZSBwdWJsaWMKLW1ldGhvZHMgYXJlOgotCi1cYmVnaW57bWV0aG9kZGVzY31bUXVldWVde3FzaXplfXt9Ci1SZXR1cm4gdGhlIGFwcHJveGltYXRlIHNpemUgb2YgdGhlIHF1ZXVlLiAgQmVjYXVzZSBvZiBtdWx0aXRocmVhZGluZwotc2VtYW50aWNzLCB0aGlzIG51bWJlciBpcyBub3QgcmVsaWFibGUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtRdWV1ZV17ZW1wdHl9e30KLVJldHVybiBcY29kZXtUcnVlfSBpZiB0aGUgcXVldWUgaXMgZW1wdHksIFxjb2Rle0ZhbHNlfSBvdGhlcndpc2UuCi1CZWNhdXNlIG9mIG11bHRpdGhyZWFkaW5nIHNlbWFudGljcywgdGhpcyBpcyBub3QgcmVsaWFibGUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtRdWV1ZV17ZnVsbH17fQotUmV0dXJuIFxjb2Rle1RydWV9IGlmIHRoZSBxdWV1ZSBpcyBmdWxsLCBcY29kZXtGYWxzZX0gb3RoZXJ3aXNlLgotQmVjYXVzZSBvZiBtdWx0aXRocmVhZGluZyBzZW1hbnRpY3MsIHRoaXMgaXMgbm90IHJlbGlhYmxlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUXVldWVde3B1dH17aXRlbVxvcHRpb25hbHssIGJsb2NrXG9wdGlvbmFseywgdGltZW91dH19fQotUHV0IFx2YXJ7aXRlbX0gaW50byB0aGUgcXVldWUuIElmIG9wdGlvbmFsIGFyZ3MgXHZhcntibG9ja30gaXMgdHJ1ZQotYW5kIFx2YXJ7dGltZW91dH0gaXMgTm9uZSAodGhlIGRlZmF1bHQpLCBibG9jayBpZiBuZWNlc3NhcnkgdW50aWwgYQotZnJlZSBzbG90IGlzIGF2YWlsYWJsZS4gSWYgXHZhcnt0aW1lb3V0fSBpcyBhIHBvc2l0aXZlIG51bWJlciwgaXQKLWJsb2NrcyBhdCBtb3N0IFx2YXJ7dGltZW91dH0gc2Vjb25kcyBhbmQgcmFpc2VzIHRoZSBcZXhjZXB0aW9ue0Z1bGx9Ci1leGNlcHRpb24gaWYgbm8gZnJlZSBzbG90IHdhcyBhdmFpbGFibGUgd2l0aGluIHRoYXQgdGltZS4KLU90aGVyd2lzZSAoXHZhcntibG9ja30gaXMgZmFsc2UpLCBwdXQgYW4gaXRlbSBvbiB0aGUgcXVldWUgaWYgYSBmcmVlCi1zbG90IGlzIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSwgZWxzZSByYWlzZSB0aGUgXGV4Y2VwdGlvbntGdWxsfQotZXhjZXB0aW9uIChcdmFye3RpbWVvdXR9IGlzIGlnbm9yZWQgaW4gdGhhdCBjYXNlKS4KLQotXHZlcnNpb25hZGRlZFt0aGUgdGltZW91dCBwYXJhbWV0ZXJdezIuM30KLQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUXVldWVde3B1dF9ub3dhaXR9e2l0ZW19Ci1FcXVpdmFsZW50IHRvIFxjb2Rle3B1dChcdmFye2l0ZW19LCBGYWxzZSl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUXVldWVde2dldH17XG9wdGlvbmFse2Jsb2NrXG9wdGlvbmFseywgdGltZW91dH19fQotUmVtb3ZlIGFuZCByZXR1cm4gYW4gaXRlbSBmcm9tIHRoZSBxdWV1ZS4gSWYgb3B0aW9uYWwgYXJncwotXHZhcntibG9ja30gaXMgdHJ1ZSBhbmQgXHZhcnt0aW1lb3V0fSBpcyBOb25lICh0aGUgZGVmYXVsdCksCi1ibG9jayBpZiBuZWNlc3NhcnkgdW50aWwgYW4gaXRlbSBpcyBhdmFpbGFibGUuIElmIFx2YXJ7dGltZW91dH0gaXMKLWEgcG9zaXRpdmUgbnVtYmVyLCBpdCBibG9ja3MgYXQgbW9zdCBcdmFye3RpbWVvdXR9IHNlY29uZHMgYW5kIHJhaXNlcwotdGhlIFxleGNlcHRpb257RW1wdHl9IGV4Y2VwdGlvbiBpZiBubyBpdGVtIHdhcyBhdmFpbGFibGUgd2l0aGluIHRoYXQKLXRpbWUuIE90aGVyd2lzZSAoXHZhcntibG9ja30gaXMgZmFsc2UpLCByZXR1cm4gYW4gaXRlbSBpZiBvbmUgaXMKLWltbWVkaWF0ZWx5IGF2YWlsYWJsZSwgZWxzZSByYWlzZSB0aGUgXGV4Y2VwdGlvbntFbXB0eX0gZXhjZXB0aW9uCi0oXHZhcnt0aW1lb3V0fSBpcyBpZ25vcmVkIGluIHRoYXQgY2FzZSkuCi0KLVx2ZXJzaW9uYWRkZWRbdGhlIHRpbWVvdXQgcGFyYW1ldGVyXXsyLjN9Ci0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1F1ZXVlXXtnZXRfbm93YWl0fXt9Ci1FcXVpdmFsZW50IHRvIFxjb2Rle2dldChGYWxzZSl9LgotXGVuZHttZXRob2RkZXNjfQotCi1Ud28gbWV0aG9kcyBhcmUgb2ZmZXJlZCB0byBzdXBwb3J0IHRyYWNraW5nIHdoZXRoZXIgZW5xdWV1ZWQgdGFza3MgaGF2ZQotYmVlbiBmdWxseSBwcm9jZXNzZWQgYnkgZGFlbW9uIGNvbnN1bWVyIHRocmVhZHMuCi0KLVxiZWdpbnttZXRob2RkZXNjfVtRdWV1ZV17dGFza19kb25lfXt9Ci1JbmRpY2F0ZSB0aGF0IGEgZm9ybWVybHkgZW5xdWV1ZWQgdGFzayBpcyBjb21wbGV0ZS4gIFVzZWQgYnkgcXVldWUgY29uc3VtZXIKLXRocmVhZHMuICBGb3IgZWFjaCBcbWV0aG9ke2dldCgpfSB1c2VkIHRvIGZldGNoIGEgdGFzaywgYSBzdWJzZXF1ZW50IGNhbGwgdG8KLVxtZXRob2R7dGFza19kb25lKCl9IHRlbGxzIHRoZSBxdWV1ZSB0aGF0IHRoZSBwcm9jZXNzaW5nIG9uIHRoZSB0YXNrIGlzIGNvbXBsZXRlLgotCi1JZiBhIFxtZXRob2R7am9pbigpfSBpcyBjdXJyZW50bHkgYmxvY2tpbmcsIGl0IHdpbGwgcmVzdW1lIHdoZW4gYWxsIGl0ZW1zCi1oYXZlIGJlZW4gcHJvY2Vzc2VkIChtZWFuaW5nIHRoYXQgYSBcbWV0aG9ke3Rhc2tfZG9uZSgpfSBjYWxsIHdhcyByZWNlaXZlZAotZm9yIGV2ZXJ5IGl0ZW0gdGhhdCBoYWQgYmVlbiBcbWV0aG9ke3B1dCgpfSBpbnRvIHRoZSBxdWV1ZSkuCi0KLVJhaXNlcyBhIFxleGNlcHRpb257VmFsdWVFcnJvcn0gaWYgY2FsbGVkIG1vcmUgdGltZXMgdGhhbiB0aGVyZSB3ZXJlIGl0ZW1zCi1wbGFjZWQgaW4gdGhlIHF1ZXVlLgotXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtRdWV1ZV17am9pbn17fQotQmxvY2tzIHVudGlsIGFsbCBpdGVtcyBpbiB0aGUgcXVldWUgaGF2ZSBiZWVuIGdvdHRlbiBhbmQgcHJvY2Vzc2VkLgotCi1UaGUgY291bnQgb2YgdW5maW5pc2hlZCB0YXNrcyBnb2VzIHVwIHdoZW5ldmVyIGFuIGl0ZW0gaXMgYWRkZWQgdG8gdGhlCi1xdWV1ZS4gVGhlIGNvdW50IGdvZXMgZG93biB3aGVuZXZlciBhIGNvbnN1bWVyIHRocmVhZCBjYWxscyBcbWV0aG9ke3Rhc2tfZG9uZSgpfQotdG8gaW5kaWNhdGUgdGhhdCB0aGUgaXRlbSB3YXMgcmV0cmlldmVkIGFuZCBhbGwgd29yayBvbiBpdCBpcyBjb21wbGV0ZS4KLVdoZW4gdGhlIGNvdW50IG9mIHVuZmluaXNoZWQgdGFza3MgZHJvcHMgdG8gemVybywgam9pbigpIHVuYmxvY2tzLgotXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLUV4YW1wbGUgb2YgaG93IHRvIHdhaXQgZm9yIGVucXVldWVkIHRhc2tzIHRvIGJlIGNvbXBsZXRlZDoKLQotXGJlZ2lue3ZlcmJhdGltfQotICAgIGRlZiB3b3JrZXIoKTogCi0gICAgICAgIHdoaWxlIFRydWU6IAotICAgICAgICAgICAgaXRlbSA9IHEuZ2V0KCkgCi0gICAgICAgICAgICBkb193b3JrKGl0ZW0pIAotICAgICAgICAgICAgcS50YXNrX2RvbmUoKSAKLQotICAgIHEgPSBRdWV1ZSgpIAotICAgIGZvciBpIGluIHJhbmdlKG51bV93b3JrZXJfdGhyZWFkcyk6IAotICAgICAgICAgdCA9IFRocmVhZCh0YXJnZXQ9d29ya2VyKQotICAgICAgICAgdC5zZXREYWVtb24oVHJ1ZSkKLSAgICAgICAgIHQuc3RhcnQoKSAKLQotICAgIGZvciBpdGVtIGluIHNvdXJjZSgpOgotICAgICAgICBxLnB1dChpdGVtKSAKLQotICAgIHEuam9pbigpICAgICAgICMgYmxvY2sgdW50aWwgYWxsIHRhc2tzIGFyZSBkb25lCi1cZW5ke3ZlcmJhdGltfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJxdW9wcmkudGV4IGIvRG9jL2xpYi9saWJxdW9wcmkudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTc4OTViLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlicXVvcHJpLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7cXVvcHJpfSAtLS0KLSAgICAgICAgIEVuY29kZSBhbmQgZGVjb2RlIE1JTUUgcXVvdGVkLXByaW50YWJsZSBkYXRhfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17cXVvcHJpfQotXG1vZHVsZXN5bm9wc2lze0VuY29kZSBhbmQgZGVjb2RlIGZpbGVzIHVzaW5nIHRoZSBNSU1FCi0gICAgICAgICAgICAgICAgcXVvdGVkLXByaW50YWJsZSBlbmNvZGluZy59Ci0KLQotVGhpcyBtb2R1bGUgcGVyZm9ybXMgcXVvdGVkLXByaW50YWJsZSB0cmFuc3BvcnQgZW5jb2RpbmcgYW5kIGRlY29kaW5nLAotYXMgZGVmaW5lZCBpbiBccmZjezE1MjF9OiBgYE1JTUUgKE11bHRpcHVycG9zZSBJbnRlcm5ldCBNYWlsCi1FeHRlbnNpb25zKSBQYXJ0IE9uZTogTWVjaGFuaXNtcyBmb3IgU3BlY2lmeWluZyBhbmQgRGVzY3JpYmluZyB0aGUKLUZvcm1hdCBvZiBJbnRlcm5ldCBNZXNzYWdlIEJvZGllcycnLiAgVGhlIHF1b3RlZC1wcmludGFibGUgZW5jb2RpbmcgaXMKLWRlc2lnbmVkIGZvciBkYXRhIHdoZXJlIHRoZXJlIGFyZSByZWxhdGl2ZWx5IGZldyBub25wcmludGFibGUKLWNoYXJhY3RlcnM7IHRoZSBiYXNlNjQgZW5jb2Rpbmcgc2NoZW1lIGF2YWlsYWJsZSB2aWEgdGhlCi1ccmVmbW9kdWxle2Jhc2U2NH0gbW9kdWxlIGlzIG1vcmUgY29tcGFjdCBpZiB0aGVyZSBhcmUgbWFueSBzdWNoCi1jaGFyYWN0ZXJzLCBhcyB3aGVuIHNlbmRpbmcgYSBncmFwaGljcyBmaWxlLgotXGluZGV4aWl7cXVvdGVkLXByaW50YWJsZX17ZW5jb2Rpbmd9Ci1caW5kZXh7TUlNRSFxdW90ZWQtcHJpbnRhYmxlIGVuY29kaW5nfQotCi0KLVxiZWdpbntmdW5jZGVzY317ZGVjb2RlfXtpbnB1dCwgb3V0cHV0XG9wdGlvbmFseyxoZWFkZXJ9fQotRGVjb2RlIHRoZSBjb250ZW50cyBvZiB0aGUgXHZhcntpbnB1dH0gZmlsZSBhbmQgd3JpdGUgdGhlIHJlc3VsdGluZwotZGVjb2RlZCBiaW5hcnkgZGF0YSB0byB0aGUgXHZhcntvdXRwdXR9IGZpbGUuCi1cdmFye2lucHV0fSBhbmQgXHZhcntvdXRwdXR9IG11c3QgZWl0aGVyIGJlIGZpbGUgb2JqZWN0cyBvciBvYmplY3RzIHRoYXQKLW1pbWljIHRoZSBmaWxlIG9iamVjdCBpbnRlcmZhY2UuIFx2YXJ7aW5wdXR9IHdpbGwgYmUgcmVhZCB1bnRpbAotXGNvZGV7XHZhcntpbnB1dH0ucmVhZGxpbmUoKX0gcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuCi1JZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgXHZhcntoZWFkZXJ9IGlzIHByZXNlbnQgYW5kIHRydWUsIHVuZGVyc2NvcmUKLXdpbGwgYmUgZGVjb2RlZCBhcyBzcGFjZS4gVGhpcyBpcyB1c2VkIHRvIGRlY29kZQotYGBRJyctZW5jb2RlZCBoZWFkZXJzIGFzIGRlc2NyaWJlZCBpbiBccmZjezE1MjJ9OiBgYE1JTUUgKE11bHRpcHVycG9zZSBJbnRlcm5ldCBNYWlsIEV4dGVuc2lvbnMpCi1QYXJ0IFR3bzogTWVzc2FnZSBIZWFkZXIgRXh0ZW5zaW9ucyBmb3IgTm9uLUFTQ0lJIFRleHQnJy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZW5jb2RlfXtpbnB1dCwgb3V0cHV0LCBxdW90ZXRhYnN9Ci1FbmNvZGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBcdmFye2lucHV0fSBmaWxlIGFuZCB3cml0ZSB0aGUgcmVzdWx0aW5nCi1xdW90ZWQtcHJpbnRhYmxlIGRhdGEgdG8gdGhlIFx2YXJ7b3V0cHV0fSBmaWxlLgotXHZhcntpbnB1dH0gYW5kIFx2YXJ7b3V0cHV0fSBtdXN0IGVpdGhlciBiZSBmaWxlIG9iamVjdHMgb3Igb2JqZWN0cyB0aGF0Ci1taW1pYyB0aGUgZmlsZSBvYmplY3QgaW50ZXJmYWNlLiBcdmFye2lucHV0fSB3aWxsIGJlIHJlYWQgdW50aWwKLVxjb2Rle1x2YXJ7aW5wdXR9LnJlYWRsaW5lKCl9IHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLgotXHZhcntxdW90ZXRhYnN9IGlzIGEgZmxhZyB3aGljaCBjb250cm9scyB3aGV0aGVyIHRvIGVuY29kZSBlbWJlZGRlZAotc3BhY2VzIGFuZCB0YWJzOyB3aGVuIHRydWUgaXQgZW5jb2RlcyBzdWNoIGVtYmVkZGVkIHdoaXRlc3BhY2UsIGFuZAotd2hlbiBmYWxzZSBpdCBsZWF2ZXMgdGhlbSB1bmVuY29kZWQuICBOb3RlIHRoYXQgc3BhY2VzIGFuZCB0YWJzCi1hcHBlYXJpbmcgYXQgdGhlIGVuZCBvZiBsaW5lcyBhcmUgYWx3YXlzIGVuY29kZWQsIGFzIHBlciBccmZjezE1MjF9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtkZWNvZGVzdHJpbmd9e3Ncb3B0aW9uYWx7LGhlYWRlcn19Ci1MaWtlIFxmdW5jdGlvbntkZWNvZGUoKX0sIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYSBzb3VyY2Ugc3RyaW5nIGFuZAotcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBkZWNvZGVkIHN0cmluZy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZW5jb2Rlc3RyaW5nfXtzXG9wdGlvbmFseywgcXVvdGV0YWJzfX0KLUxpa2UgXGZ1bmN0aW9ue2VuY29kZSgpfSwgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBhIHNvdXJjZSBzdHJpbmcgYW5kCi1yZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGVuY29kZWQgc3RyaW5nLiAgXHZhcntxdW90ZXRhYnN9IGlzIG9wdGlvbmFsCi0oZGVmYXVsdGluZyB0byAwKSwgYW5kIGlzIHBhc3NlZCBzdHJhaWdodCB0aHJvdWdoIHRvCi1cZnVuY3Rpb257ZW5jb2RlKCl9LgotXGVuZHtmdW5jZGVzY30KLQotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZW1vZHVsZXttaW1pZnl9e0dlbmVyYWwgdXRpbGl0aWVzIGZvciBwcm9jZXNzaW5nIG9mIE1JTUUgbWVzc2FnZXMufQotICBcc2VlbW9kdWxle2Jhc2U2NH17RW5jb2RlIGFuZCBkZWNvZGUgTUlNRSBiYXNlNjQgZGF0YX0KLVxlbmR7c2VlYWxzb30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlicmFuZG9tLnRleCBiL0RvYy9saWIvbGlicmFuZG9tLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTliZDVhYy4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnJhbmRvbS50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwzMDkgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtyYW5kb219IC0tLQotICAgICAgICAgR2VuZXJhdGUgcHNldWRvLXJhbmRvbSBudW1iZXJzfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17cmFuZG9tfQotXG1vZHVsZXN5bm9wc2lze0dlbmVyYXRlIHBzZXVkby1yYW5kb20gbnVtYmVycyB3aXRoIHZhcmlvdXMgY29tbW9uCi0gICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9ucy59Ci0KLQotVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBwc2V1ZG8tcmFuZG9tIG51bWJlciBnZW5lcmF0b3JzIGZvciB2YXJpb3VzCi1kaXN0cmlidXRpb25zLgotCi1Gb3IgaW50ZWdlcnMsIHVuaWZvcm0gc2VsZWN0aW9uIGZyb20gYSByYW5nZS4KLUZvciBzZXF1ZW5jZXMsIHVuaWZvcm0gc2VsZWN0aW9uIG9mIGEgcmFuZG9tIGVsZW1lbnQsIGEgZnVuY3Rpb24gdG8KLWdlbmVyYXRlIGEgcmFuZG9tIHBlcm11dGF0aW9uIG9mIGEgbGlzdCBpbi1wbGFjZSwgYW5kIGEgZnVuY3Rpb24gZm9yCi1yYW5kb20gc2FtcGxpbmcgd2l0aG91dCByZXBsYWNlbWVudC4KLQotT24gdGhlIHJlYWwgbGluZSwgdGhlcmUgYXJlIGZ1bmN0aW9ucyB0byBjb21wdXRlIHVuaWZvcm0sIG5vcm1hbCAoR2F1c3NpYW4pLAotbG9nbm9ybWFsLCBuZWdhdGl2ZSBleHBvbmVudGlhbCwgZ2FtbWEsIGFuZCBiZXRhIGRpc3RyaWJ1dGlvbnMuCi1Gb3IgZ2VuZXJhdGluZyBkaXN0cmlidXRpb25zIG9mIGFuZ2xlcywgdGhlIHZvbiBNaXNlcyBkaXN0cmlidXRpb24KLWlzIGF2YWlsYWJsZS4KLQotQWxtb3N0IGFsbCBtb2R1bGUgZnVuY3Rpb25zIGRlcGVuZCBvbiB0aGUgYmFzaWMgZnVuY3Rpb24KLVxmdW5jdGlvbntyYW5kb20oKX0sIHdoaWNoIGdlbmVyYXRlcyBhIHJhbmRvbSBmbG9hdCB1bmlmb3JtbHkgaW4KLXRoZSBzZW1pLW9wZW4gcmFuZ2UgWzAuMCwgMS4wKS4gIFB5dGhvbiB1c2VzIHRoZSBNZXJzZW5uZSBUd2lzdGVyIGFzCi10aGUgY29yZSBnZW5lcmF0b3IuICBJdCBwcm9kdWNlcyA1My1iaXQgcHJlY2lzaW9uIGZsb2F0cyBhbmQgaGFzIGEKLXBlcmlvZCBvZiAyKioxOTkzNy0xLiAgVGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gaW4gQwotaXMgYm90aCBmYXN0IGFuZCB0aHJlYWRzYWZlLiAgVGhlIE1lcnNlbm5lIFR3aXN0ZXIgaXMgb25lIG9mIHRoZSBtb3N0Ci1leHRlbnNpdmVseSB0ZXN0ZWQgcmFuZG9tIG51bWJlciBnZW5lcmF0b3JzIGluIGV4aXN0ZW5jZS4gIEhvd2V2ZXIsIGJlaW5nCi1jb21wbGV0ZWx5IGRldGVybWluaXN0aWMsIGl0IGlzIG5vdCBzdWl0YWJsZSBmb3IgYWxsIHB1cnBvc2VzLCBhbmQgaXMKLWNvbXBsZXRlbHkgdW5zdWl0YWJsZSBmb3IgY3J5cHRvZ3JhcGhpYyBwdXJwb3Nlcy4KLQotVGhlIGZ1bmN0aW9ucyBzdXBwbGllZCBieSB0aGlzIG1vZHVsZSBhcmUgYWN0dWFsbHkgYm91bmQgbWV0aG9kcyBvZiBhCi1oaWRkZW4gaW5zdGFuY2Ugb2YgdGhlIFxjbGFzc3tyYW5kb20uUmFuZG9tfSBjbGFzcy4gIFlvdSBjYW4KLWluc3RhbnRpYXRlIHlvdXIgb3duIGluc3RhbmNlcyBvZiBcY2xhc3N7UmFuZG9tfSB0byBnZXQgZ2VuZXJhdG9ycwotdGhhdCBkb24ndCBzaGFyZSBzdGF0ZS4gIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgZm9yIG11bHRpLXRocmVhZGVkCi1wcm9ncmFtcywgY3JlYXRpbmcgYSBkaWZmZXJlbnQgaW5zdGFuY2Ugb2YgXGNsYXNze1JhbmRvbX0gZm9yIGVhY2gKLXRocmVhZCwgYW5kIHVzaW5nIHRoZSBcbWV0aG9ke2p1bXBhaGVhZCgpfSBtZXRob2QgdG8gbWFrZSBpdCBsaWtlbHkgdGhhdCB0aGUKLWdlbmVyYXRlZCBzZXF1ZW5jZXMgc2VlbiBieSBlYWNoIHRocmVhZCBkb24ndCBvdmVybGFwLgotCi1DbGFzcyBcY2xhc3N7UmFuZG9tfSBjYW4gYWxzbyBiZSBzdWJjbGFzc2VkIGlmIHlvdSB3YW50IHRvIHVzZSBhCi1kaWZmZXJlbnQgYmFzaWMgZ2VuZXJhdG9yIG9mIHlvdXIgb3duIGRldmlzaW5nOiBpbiB0aGF0IGNhc2UsIG92ZXJyaWRlCi10aGUgXG1ldGhvZHtyYW5kb20oKX0sIFxtZXRob2R7c2VlZCgpfSwgXG1ldGhvZHtnZXRzdGF0ZSgpfSwKLVxtZXRob2R7c2V0c3RhdGUoKX0gYW5kIFxtZXRob2R7anVtcGFoZWFkKCl9IG1ldGhvZHMuCi1PcHRpb25hbGx5LCBhIG5ldyBnZW5lcmF0b3IgY2FuIHN1cHBseSBhIFxtZXRob2R7Z2V0cmFuZG9tYml0cygpfQotbWV0aG9kIC0tLSB0aGlzIGFsbG93cyBcbWV0aG9ke3JhbmRyYW5nZSgpfSB0byBwcm9kdWNlIHNlbGVjdGlvbnMKLW92ZXIgYW4gYXJiaXRyYXJpbHkgbGFyZ2UgcmFuZ2UuCi1cdmVyc2lvbmFkZGVkW3RoZSBcbWV0aG9ke2dldHJhbmRvbWJpdHMoKX0gbWV0aG9kXXsyLjR9Ci0KLUFzIGFuIGV4YW1wbGUgb2Ygc3ViY2xhc3NpbmcsIHRoZSBcbW9kdWxle3JhbmRvbX0gbW9kdWxlIHByb3ZpZGVzCi10aGUgXGNsYXNze1dpY2htYW5uSGlsbH0gY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGFuIGFsdGVybmF0aXZlIGdlbmVyYXRvcgotaW4gcHVyZSBQeXRob24uICBUaGUgY2xhc3MgcHJvdmlkZXMgYSBiYWNrd2FyZCBjb21wYXRpYmxlIHdheSB0bwotcmVwcm9kdWNlIHJlc3VsdHMgZnJvbSBlYXJsaWVyIHZlcnNpb25zIG9mIFB5dGhvbiwgd2hpY2ggdXNlZCB0aGUKLVdpY2htYW5uLUhpbGwgYWxnb3JpdGhtIGFzIHRoZSBjb3JlIGdlbmVyYXRvci4gIE5vdGUgdGhhdCB0aGlzIFdpY2htYW5uLUhpbGwKLWdlbmVyYXRvciBjYW4gbm8gbG9uZ2VyIGJlIHJlY29tbWVuZGVkOiAgaXRzIHBlcmlvZCBpcyB0b28gc2hvcnQgYnkKLWNvbnRlbXBvcmFyeSBzdGFuZGFyZHMsIGFuZCB0aGUgc2VxdWVuY2UgZ2VuZXJhdGVkIGlzIGtub3duIHRvIGZhaWwgc29tZQotc3RyaW5nZW50IHJhbmRvbW5lc3MgdGVzdHMuICBTZWUgdGhlIHJlZmVyZW5jZXMgYmVsb3cgZm9yIGEgcmVjZW50Ci12YXJpYW50IHRoYXQgcmVwYWlycyB0aGVzZSBmbGF3cy4KLVx2ZXJzaW9uY2hhbmdlZFtTdWJzdGl0dXRlZCBNZXJzZW5uZVR3aXN0ZXIgZm9yIFdpY2htYW5uLUhpbGxdezIuM30KLQotCi1Cb29ra2VlcGluZyBmdW5jdGlvbnM6Ci0KLVxiZWdpbntmdW5jZGVzY317c2VlZH17XG9wdGlvbmFse3h9fQotICBJbml0aWFsaXplIHRoZSBiYXNpYyByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KLSAgT3B0aW9uYWwgYXJndW1lbnQgXHZhcnt4fSBjYW4gYmUgYW55IGhhc2hhYmxlIG9iamVjdC4KLSAgSWYgXHZhcnt4fSBpcyBvbWl0dGVkIG9yIFxjb2Rle05vbmV9LCBjdXJyZW50IHN5c3RlbSB0aW1lIGlzIHVzZWQ7Ci0gIGN1cnJlbnQgc3lzdGVtIHRpbWUgaXMgYWxzbyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGdlbmVyYXRvciB3aGVuIHRoZQotICBtb2R1bGUgaXMgZmlyc3QgaW1wb3J0ZWQuICBJZiByYW5kb21uZXNzIHNvdXJjZXMgYXJlIHByb3ZpZGVkIGJ5IHRoZQotICBvcGVyYXRpbmcgc3lzdGVtLCB0aGV5IGFyZSB1c2VkIGluc3RlYWQgb2YgdGhlIHN5c3RlbSB0aW1lIChzZWUgdGhlCi0gIFxmdW5jdGlvbntvcy51cmFuZG9tKCl9Ci0gIGZ1bmN0aW9uIGZvciBkZXRhaWxzIG9uIGF2YWlsYWJpbGl0eSkuICBcdmVyc2lvbmNoYW5nZWRbZm9ybWVybHksCi0gIG9wZXJhdGluZyBzeXN0ZW0gcmVzb3VyY2VzIHdlcmUgbm90IHVzZWRdezIuNH0KLSAgSWYgXHZhcnt4fSBpcyBub3QgXGNvZGV7Tm9uZX0gb3IgYW4gaW50IG9yIGxvbmcsCi0gIFxjb2Rle2hhc2goXHZhcnt4fSl9IGlzIHVzZWQgaW5zdGVhZC4KLSAgSWYgXHZhcnt4fSBpcyBhbiBpbnQgb3IgbG9uZywgXHZhcnt4fSBpcyB1c2VkIGRpcmVjdGx5LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRzdGF0ZX17fQotICBSZXR1cm4gYW4gb2JqZWN0IGNhcHR1cmluZyB0aGUgY3VycmVudCBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUKLSAgZ2VuZXJhdG9yLiAgVGhpcyBvYmplY3QgY2FuIGJlIHBhc3NlZCB0byBcZnVuY3Rpb257c2V0c3RhdGUoKX0gdG8KLSAgcmVzdG9yZSB0aGUgc3RhdGUuCi0gIFx2ZXJzaW9uYWRkZWR7Mi4xfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzZXRzdGF0ZX17c3RhdGV9Ci0gIFx2YXJ7c3RhdGV9IHNob3VsZCBoYXZlIGJlZW4gb2J0YWluZWQgZnJvbSBhIHByZXZpb3VzIGNhbGwgdG8KLSAgXGZ1bmN0aW9ue2dldHN0YXRlKCl9LCBhbmQgXGZ1bmN0aW9ue3NldHN0YXRlKCl9IHJlc3RvcmVzIHRoZQotICBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgZ2VuZXJhdG9yIHRvIHdoYXQgaXQgd2FzIGF0IHRoZSB0aW1lCi0gIFxmdW5jdGlvbntzZXRzdGF0ZSgpfSB3YXMgY2FsbGVkLgotICBcdmVyc2lvbmFkZGVkezIuMX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317anVtcGFoZWFkfXtufQotICBDaGFuZ2UgdGhlIGludGVybmFsIHN0YXRlIHRvIG9uZSBkaWZmZXJlbnQgZnJvbSBhbmQgbGlrZWx5IGZhciBhd2F5IGZyb20KLSAgdGhlIGN1cnJlbnQgc3RhdGUuICBcdmFye259IGlzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgd2hpY2ggaXMgdXNlZCB0bwotICBzY3JhbWJsZSB0aGUgY3VycmVudCBzdGF0ZSB2ZWN0b3IuICBUaGlzIGlzIG1vc3QgdXNlZnVsIGluIG11bHRpLXRocmVhZGVkCi0gIHByb2dyYW1zLCBpbiBjb25qdWN0aW9uIHdpdGggbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBcY2xhc3N7UmFuZG9tfQotICBjbGFzczogXG1ldGhvZHtzZXRzdGF0ZSgpfSBvciBcbWV0aG9ke3NlZWQoKX0gY2FuIGJlIHVzZWQgdG8gZm9yY2UgYWxsCi0gIGluc3RhbmNlcyBpbnRvIHRoZSBzYW1lIGludGVybmFsIHN0YXRlLCBhbmQgdGhlbiBcbWV0aG9ke2p1bXBhaGVhZCgpfQotICBjYW4gYmUgdXNlZCB0byBmb3JjZSB0aGUgaW5zdGFuY2VzJyBzdGF0ZXMgZmFyIGFwYXJ0LgotICBcdmVyc2lvbmFkZGVkezIuMX0KLSAgXHZlcnNpb25jaGFuZ2VkW0luc3RlYWQgb2YganVtcGluZyB0byBhIHNwZWNpZmljIHN0YXRlLCBcdmFye259IHN0ZXBzCi0gIGFoZWFkLCBcbWV0aG9ke2p1bXBhaGVhZChcdmFye259KX0ganVtcHMgdG8gYW5vdGhlciBzdGF0ZSBsaWtlbHkgdG8gYmUKLSAgc2VwYXJhdGVkIGJ5IG1hbnkgc3RlcHNdezIuM30KLSBcZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldHJhbmRiaXRzfXtrfQotICBSZXR1cm5zIGEgcHl0aG9uIFxjbGFzc3tsb25nfSBpbnQgd2l0aCBcdmFye2t9IHJhbmRvbSBiaXRzLgotICBUaGlzIG1ldGhvZCBpcyBzdXBwbGllZCB3aXRoIHRoZSBNZXJzZW5uZVR3aXN0ZXIgZ2VuZXJhdG9yIGFuZCBzb21lCi0gIG90aGVyIGdlbmVyYXRvcnMgbWF5IGFsc28gcHJvdmlkZSBpdCBhcyBhbiBvcHRpb25hbCBwYXJ0IG9mIHRoZSBBUEkuCi0gIFdoZW4gYXZhaWxhYmxlLCBcbWV0aG9ke2dldHJhbmRiaXRzKCl9IGVuYWJsZXMgXG1ldGhvZHtyYW5kcmFuZ2UoKX0KLSAgdG8gaGFuZGxlIGFyYml0cmFyaWx5IGxhcmdlIHJhbmdlcy4KLSAgXHZlcnNpb25hZGRlZHsyLjR9Ci1cZW5ke2Z1bmNkZXNjfQotCi1GdW5jdGlvbnMgZm9yIGludGVnZXJzOgotCi1cYmVnaW57ZnVuY2Rlc2N9e3JhbmRyYW5nZX17XG9wdGlvbmFse3N0YXJ0LH0gc3RvcFxvcHRpb25hbHssIHN0ZXB9fQotICBSZXR1cm4gYSByYW5kb21seSBzZWxlY3RlZCBlbGVtZW50IGZyb20gXGNvZGV7cmFuZ2UoXHZhcntzdGFydH0sCi0gIFx2YXJ7c3RvcH0sIFx2YXJ7c3RlcH0pfS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0bwotICBcY29kZXtjaG9pY2UocmFuZ2UoXHZhcntzdGFydH0sIFx2YXJ7c3RvcH0sIFx2YXJ7c3RlcH0pKX0sCi0gIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IGJ1aWxkIGEgcmFuZ2Ugb2JqZWN0LgotICBcdmVyc2lvbmFkZGVkezEuNS4yfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtyYW5kaW50fXthLCBifQotICBSZXR1cm4gYSByYW5kb20gaW50ZWdlciBcdmFye059IHN1Y2ggdGhhdAotICBcY29kZXtcdmFye2F9IDw9IFx2YXJ7Tn0gPD0gXHZhcntifX0uCi1cZW5ke2Z1bmNkZXNjfQotCi0KLUZ1bmN0aW9ucyBmb3Igc2VxdWVuY2VzOgotCi1cYmVnaW57ZnVuY2Rlc2N9e2Nob2ljZX17c2VxfQotICBSZXR1cm4gYSByYW5kb20gZWxlbWVudCBmcm9tIHRoZSBub24tZW1wdHkgc2VxdWVuY2UgXHZhcntzZXF9LgotICBJZiBcdmFye3NlcX0gaXMgZW1wdHksIHJhaXNlcyBcZXhjZXB0aW9ue0luZGV4RXJyb3J9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzaHVmZmxlfXt4XG9wdGlvbmFseywgcmFuZG9tfX0KLSAgU2h1ZmZsZSB0aGUgc2VxdWVuY2UgXHZhcnt4fSBpbiBwbGFjZS4KLSAgVGhlIG9wdGlvbmFsIGFyZ3VtZW50IFx2YXJ7cmFuZG9tfSBpcyBhIDAtYXJndW1lbnQgZnVuY3Rpb24KLSAgcmV0dXJuaW5nIGEgcmFuZG9tIGZsb2F0IGluIFswLjAsIDEuMCk7IGJ5IGRlZmF1bHQsIHRoaXMgaXMgdGhlCi0gIGZ1bmN0aW9uIFxmdW5jdGlvbntyYW5kb20oKX0uCi0KLSAgTm90ZSB0aGF0IGZvciBldmVuIHJhdGhlciBzbWFsbCBcY29kZXtsZW4oXHZhcnt4fSl9LCB0aGUgdG90YWwKLSAgbnVtYmVyIG9mIHBlcm11dGF0aW9ucyBvZiBcdmFye3h9IGlzIGxhcmdlciB0aGFuIHRoZSBwZXJpb2Qgb2YgbW9zdAotICByYW5kb20gbnVtYmVyIGdlbmVyYXRvcnM7IHRoaXMgaW1wbGllcyB0aGF0IG1vc3QgcGVybXV0YXRpb25zIG9mIGEKLSAgbG9uZyBzZXF1ZW5jZSBjYW4gbmV2ZXIgYmUgZ2VuZXJhdGVkLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzYW1wbGV9e3BvcHVsYXRpb24sIGt9Ci0gIFJldHVybiBhIFx2YXJ7a30gbGVuZ3RoIGxpc3Qgb2YgdW5pcXVlIGVsZW1lbnRzIGNob3NlbiBmcm9tIHRoZQotICBwb3B1bGF0aW9uIHNlcXVlbmNlLiAgVXNlZCBmb3IgcmFuZG9tIHNhbXBsaW5nIHdpdGhvdXQgcmVwbGFjZW1lbnQuCi0gIFx2ZXJzaW9uYWRkZWR7Mi4zfQotCi0gIFJldHVybnMgYSBuZXcgbGlzdCBjb250YWluaW5nIGVsZW1lbnRzIGZyb20gdGhlIHBvcHVsYXRpb24gd2hpbGUKLSAgbGVhdmluZyB0aGUgb3JpZ2luYWwgcG9wdWxhdGlvbiB1bmNoYW5nZWQuICBUaGUgcmVzdWx0aW5nIGxpc3QgaXMKLSAgaW4gc2VsZWN0aW9uIG9yZGVyIHNvIHRoYXQgYWxsIHN1Yi1zbGljZXMgd2lsbCBhbHNvIGJlIHZhbGlkIHJhbmRvbQotICBzYW1wbGVzLiAgVGhpcyBhbGxvd3MgcmFmZmxlIHdpbm5lcnMgKHRoZSBzYW1wbGUpIHRvIGJlIHBhcnRpdGlvbmVkCi0gIGludG8gZ3JhbmQgcHJpemUgYW5kIHNlY29uZCBwbGFjZSB3aW5uZXJzICh0aGUgc3Vic2xpY2VzKS4KLQotICBNZW1iZXJzIG9mIHRoZSBwb3B1bGF0aW9uIG5lZWQgbm90IGJlIGhhc2hhYmxlIG9yIHVuaXF1ZS4gIElmIHRoZQotICBwb3B1bGF0aW9uIGNvbnRhaW5zIHJlcGVhdHMsIHRoZW4gZWFjaCBvY2N1cnJlbmNlIGlzIGEgcG9zc2libGUKLSAgc2VsZWN0aW9uIGluIHRoZSBzYW1wbGUuCi0KLSAgVG8gY2hvb3NlIGEgc2FtcGxlIGZyb20gYSByYW5nZSBvZiBpbnRlZ2VycywgdXNlIGFuIFxmdW5jdGlvbntyYW5nZSgpfQotICBvYmplY3QgYXMgYW4gYXJndW1lbnQuICBUaGlzIGlzIGVzcGVjaWFsbHkgZmFzdCBhbmQgc3BhY2UgZWZmaWNpZW50IGZvcgotICBzYW1wbGluZyBmcm9tIGEgbGFyZ2UgcG9wdWxhdGlvbjogIFxjb2Rle3NhbXBsZShyYW5nZSgxMDAwMDAwMCksIDYwKX0uCi1cZW5ke2Z1bmNkZXNjfQotCi0KLVRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGdlbmVyYXRlIHNwZWNpZmljIHJlYWwtdmFsdWVkIGRpc3RyaWJ1dGlvbnMuCi1GdW5jdGlvbiBwYXJhbWV0ZXJzIGFyZSBuYW1lZCBhZnRlciB0aGUgY29ycmVzcG9uZGluZyB2YXJpYWJsZXMgaW4gdGhlCi1kaXN0cmlidXRpb24ncyBlcXVhdGlvbiwgYXMgdXNlZCBpbiBjb21tb24gbWF0aGVtYXRpY2FsIHByYWN0aWNlOyBtb3N0IG9mCi10aGVzZSBlcXVhdGlvbnMgY2FuIGJlIGZvdW5kIGluIGFueSBzdGF0aXN0aWNzIHRleHQuCi0KLVxiZWdpbntmdW5jZGVzY317cmFuZG9tfXt9Ci0gIFJldHVybiB0aGUgbmV4dCByYW5kb20gZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGluIHRoZSByYW5nZSBbMC4wLCAxLjApLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt1bmlmb3JtfXthLCBifQotICBSZXR1cm4gYSByYW5kb20gcmVhbCBudW1iZXIgXHZhcntOfSBzdWNoIHRoYXQKLSAgXGNvZGV7XHZhcnthfSA8PSBcdmFye059IDwgXHZhcntifX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2JldGF2YXJpYXRlfXthbHBoYSwgYmV0YX0KLSAgQmV0YSBkaXN0cmlidXRpb24uICBDb25kaXRpb25zIG9uIHRoZSBwYXJhbWV0ZXJzIGFyZQotICBcY29kZXtcdmFye2FscGhhfSA+IDB9IGFuZCBcY29kZXtcdmFye2JldGF9ID4gMH0uCi0gIFJldHVybmVkIHZhbHVlcyByYW5nZSBiZXR3ZWVuIDAgYW5kIDEuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2V4cG92YXJpYXRlfXtsYW1iZH0KLSAgRXhwb25lbnRpYWwgZGlzdHJpYnV0aW9uLiAgXHZhcntsYW1iZH0gaXMgMS4wIGRpdmlkZWQgYnkgdGhlIGRlc2lyZWQKLSAgbWVhbi4gIChUaGUgcGFyYW1ldGVyIHdvdWxkIGJlIGNhbGxlZCBgYGxhbWJkYScnLCBidXQgdGhhdCBpcyBhCi0gIHJlc2VydmVkIHdvcmQgaW4gUHl0aG9uLikgIFJldHVybmVkIHZhbHVlcyByYW5nZSBmcm9tIDAgdG8KLSAgcG9zaXRpdmUgaW5maW5pdHkuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dhbW1hdmFyaWF0ZX17YWxwaGEsIGJldGF9Ci0gIEdhbW1hIGRpc3RyaWJ1dGlvbi4gIChcZW1waHtOb3R9IHRoZSBnYW1tYSBmdW5jdGlvbiEpICBDb25kaXRpb25zIG9uCi0gIHRoZSBwYXJhbWV0ZXJzIGFyZSBcY29kZXtcdmFye2FscGhhfSA+IDB9IGFuZCBcY29kZXtcdmFye2JldGF9ID4gMH0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dhdXNzfXttdSwgc2lnbWF9Ci0gIEdhdXNzaWFuIGRpc3RyaWJ1dGlvbi4gIFx2YXJ7bXV9IGlzIHRoZSBtZWFuLCBhbmQgXHZhcntzaWdtYX0gaXMgdGhlCi0gIHN0YW5kYXJkIGRldmlhdGlvbi4gIFRoaXMgaXMgc2xpZ2h0bHkgZmFzdGVyIHRoYW4gdGhlCi0gIFxmdW5jdGlvbntub3JtYWx2YXJpYXRlKCl9IGZ1bmN0aW9uIGRlZmluZWQgYmVsb3cuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2xvZ25vcm12YXJpYXRlfXttdSwgc2lnbWF9Ci0gIExvZyBub3JtYWwgZGlzdHJpYnV0aW9uLiAgSWYgeW91IHRha2UgdGhlIG5hdHVyYWwgbG9nYXJpdGhtIG9mIHRoaXMKLSAgZGlzdHJpYnV0aW9uLCB5b3UnbGwgZ2V0IGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiB3aXRoIG1lYW4gXHZhcnttdX0KLSAgYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBcdmFye3NpZ21hfS4gIFx2YXJ7bXV9IGNhbiBoYXZlIGFueSB2YWx1ZSwKLSAgYW5kIFx2YXJ7c2lnbWF9IG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e25vcm1hbHZhcmlhdGV9e211LCBzaWdtYX0KLSAgTm9ybWFsIGRpc3RyaWJ1dGlvbi4gIFx2YXJ7bXV9IGlzIHRoZSBtZWFuLCBhbmQgXHZhcntzaWdtYX0gaXMgdGhlCi0gIHN0YW5kYXJkIGRldmlhdGlvbi4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dm9ubWlzZXN2YXJpYXRlfXttdSwga2FwcGF9Ci0gIFx2YXJ7bXV9IGlzIHRoZSBtZWFuIGFuZ2xlLCBleHByZXNzZWQgaW4gcmFkaWFucyBiZXR3ZWVuIDAgYW5kCi0gIDIqXGVtcGh7cGl9LCBhbmQgXHZhcntrYXBwYX0gaXMgdGhlIGNvbmNlbnRyYXRpb24gcGFyYW1ldGVyLCB3aGljaAotICBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB6ZXJvLiAgSWYgXHZhcntrYXBwYX0gaXMgZXF1YWwgdG8KLSAgemVybywgdGhpcyBkaXN0cmlidXRpb24gcmVkdWNlcyB0byBhIHVuaWZvcm0gcmFuZG9tIGFuZ2xlIG92ZXIgdGhlCi0gIHJhbmdlIDAgdG8gMipcZW1waHtwaX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3BhcmV0b3ZhcmlhdGV9e2FscGhhfQotICBQYXJldG8gZGlzdHJpYnV0aW9uLiAgXHZhcnthbHBoYX0gaXMgdGhlIHNoYXBlIHBhcmFtZXRlci4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317d2VpYnVsbHZhcmlhdGV9e2FscGhhLCBiZXRhfQotICBXZWlidWxsIGRpc3RyaWJ1dGlvbi4gIFx2YXJ7YWxwaGF9IGlzIHRoZSBzY2FsZSBwYXJhbWV0ZXIgYW5kCi0gIFx2YXJ7YmV0YX0gaXMgdGhlIHNoYXBlIHBhcmFtZXRlci4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLUFsdGVybmF0aXZlIEdlbmVyYXRvcnM6Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1dpY2htYW5uSGlsbH17XG9wdGlvbmFse3NlZWR9fQotQ2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBXaWNobWFubi1IaWxsIGFsZ29yaXRobSBhcyB0aGUgY29yZSBnZW5lcmF0b3IuCi1IYXMgYWxsIG9mIHRoZSBzYW1lIG1ldGhvZHMgYXMgXGNsYXNze1JhbmRvbX0gcGx1cyB0aGUgXG1ldGhvZHt3aHNlZWQoKX0KLW1ldGhvZCBkZXNjcmliZWQgYmVsb3cuICBCZWNhdXNlIHRoaXMgY2xhc3MgaXMgaW1wbGVtZW50ZWQgaW4gcHVyZQotUHl0aG9uLCBpdCBpcyBub3QgdGhyZWFkc2FmZSBhbmQgbWF5IHJlcXVpcmUgbG9ja3MgYmV0d2VlbiBjYWxscy4gIFRoZQotcGVyaW9kIG9mIHRoZSBnZW5lcmF0b3IgaXMgNiw5NTMsNjA3LDg3MSw2NDQgd2hpY2ggaXMgc21hbGwgZW5vdWdoIHRvCi1yZXF1aXJlIGNhcmUgdGhhdCB0d28gaW5kZXBlbmRlbnQgcmFuZG9tIHNlcXVlbmNlcyBkbyBub3Qgb3ZlcmxhcC4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3doc2VlZH17XG9wdGlvbmFse3h9fQotICBUaGlzIGlzIG9ic29sZXRlLCBzdXBwbGllZCBmb3IgYml0LWxldmVsIGNvbXBhdGliaWxpdHkgd2l0aCB2ZXJzaW9ucwotICBvZiBQeXRob24gcHJpb3IgdG8gMi4xLgotICBTZWUgXGZ1bmN0aW9ue3NlZWQoKX0gZm9yIGRldGFpbHMuICBcZnVuY3Rpb257d2hzZWVkKCl9IGRvZXMgbm90IGd1YXJhbnRlZQotICB0aGF0IGRpc3RpbmN0IGludGVnZXIgYXJndW1lbnRzIHlpZWxkIGRpc3RpbmN0IGludGVybmFsIHN0YXRlcywgYW5kIGNhbgotICB5aWVsZCBubyBtb3JlIHRoYW4gYWJvdXQgMioqMjQgZGlzdGluY3QgaW50ZXJuYWwgc3RhdGVzIGluIGFsbC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1N5c3RlbVJhbmRvbX17XG9wdGlvbmFse3NlZWR9fQotQ2xhc3MgdGhhdCB1c2VzIHRoZSBcZnVuY3Rpb257b3MudXJhbmRvbSgpfSBmdW5jdGlvbiBmb3IgZ2VuZXJhdGluZwotcmFuZG9tIG51bWJlcnMgZnJvbSBzb3VyY2VzIHByb3ZpZGVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtLgotTm90IGF2YWlsYWJsZSBvbiBhbGwgc3lzdGVtcy4KLURvZXMgbm90IHJlbHkgb24gc29mdHdhcmUgc3RhdGUgYW5kIHNlcXVlbmNlcyBhcmUgbm90IHJlcHJvZHVjaWJsZS4KLUFjY29yZGluZ2x5LCB0aGUgXG1ldGhvZHtzZWVkKCl9IGFuZCBcbWV0aG9ke2p1bXBhaGVhZCgpfSBtZXRob2RzCi1oYXZlIG5vIGVmZmVjdCBhbmQgYXJlIGlnbm9yZWQuICBUaGUgXG1ldGhvZHtnZXRzdGF0ZSgpfSBhbmQKLVxtZXRob2R7c2V0c3RhdGUoKX0gbWV0aG9kcyByYWlzZSBcZXhjZXB0aW9ue05vdEltcGxlbWVudGVkRXJyb3J9IGlmCi1jYWxsZWQuCi1cdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7Y2xhc3NkZXNjfQotCi1FeGFtcGxlcyBvZiBiYXNpYyB1c2FnZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHJhbmRvbS5yYW5kb20oKSAgICAgICAgIyBSYW5kb20gZmxvYXQgeCwgMC4wIDw9IHggPCAxLjAKLTAuMzc0NDQ4ODcxNzU2NDY2NDYKLT4+PiByYW5kb20udW5pZm9ybSgxLCAxMCkgICMgUmFuZG9tIGZsb2F0IHgsIDEuMCA8PSB4IDwgMTAuMAotMS4xODAwMTQ2MDczMTE3NTIzCi0+Pj4gcmFuZG9tLnJhbmRpbnQoMSwgMTApICAjIEludGVnZXIgZnJvbSAxIHRvIDEwLCBlbmRwb2ludHMgaW5jbHVkZWQKLTcKLT4+PiByYW5kb20ucmFuZHJhbmdlKDAsIDEwMSwgMikgICMgRXZlbiBpbnRlZ2VyIGZyb20gMCB0byAxMDAKLTI2Ci0+Pj4gcmFuZG9tLmNob2ljZSgnYWJjZGVmZ2hpaicpICAjIENob29zZSBhIHJhbmRvbSBlbGVtZW50Ci0nYycKLQotPj4+IGl0ZW1zID0gWzEsIDIsIDMsIDQsIDUsIDYsIDddCi0+Pj4gcmFuZG9tLnNodWZmbGUoaXRlbXMpCi0+Pj4gaXRlbXMKLVs3LCAzLCAyLCA1LCA2LCA0LCAxXQotCi0+Pj4gcmFuZG9tLnNhbXBsZShbMSwgMiwgMywgNCwgNV0sICAzKSAgIyBDaG9vc2UgMyBlbGVtZW50cwotWzQsIDEsIDVdCi0KLVxlbmR7dmVyYmF0aW19Ci0KLVxiZWdpbntzZWVhbHNvfQotICBcc2VldGV4dHtNLiBNYXRzdW1vdG8gYW5kIFQuIE5pc2hpbXVyYSwgYGBNZXJzZW5uZSBUd2lzdGVyOiBBCi0JICAgNjIzLWRpbWVuc2lvbmFsbHkgZXF1aWRpc3RyaWJ1dGVkIHVuaWZvcm0gcHNldWRvcmFuZG9tCi0JICAgbnVtYmVyIGdlbmVyYXRvcicnLAotCSAgIFxjaXRldGl0bGV7QUNNIFRyYW5zYWN0aW9ucyBvbiBNb2RlbGluZyBhbmQgQ29tcHV0ZXIgU2ltdWxhdGlvbn0KLQkgICBWb2wuIDgsIE5vLiAxLCBKYW51YXJ5IHBwLjMtMzAgMTk5OC59Ci0KLSAgXHNlZXRleHR7V2ljaG1hbm4sIEIuIEEuIFwmIEhpbGwsIEkuIEQuLCBgYEFsZ29yaXRobSBBUyAxODM6Ci0gICAgICAgICAgIEFuIGVmZmljaWVudCBhbmQgcG9ydGFibGUgcHNldWRvLXJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yJycsCi0gICAgICAgICAgIFxjaXRldGl0bGV7QXBwbGllZCBTdGF0aXN0aWNzfSAzMSAoMTk4MikgMTg4LTE5MC59Ci0KLSAgXHNlZXVybHtodHRwOi8vd3d3Lm5wbC5jby51ay9zc2ZtL2Rvd25sb2FkL2Fic3RyYWN0cy5odG1sXCMxOTZ9e0EgbW9kZXJuCi0gICAgICAgICAgdmFyaWF0aW9uIG9mIHRoZSBXaWNobWFubi1IaWxsIGdlbmVyYXRvciB0aGF0IGdyZWF0bHkgaW5jcmVhc2VzCi0gICAgICAgICAgdGhlIHBlcmlvZCwgYW5kIHBhc3NlcyBub3ctc3RhbmRhcmQgc3RhdGlzdGljYWwgdGVzdHMgdGhhdCB0aGUKLSAgICAgICAgICBvcmlnaW5hbCBnZW5lcmF0b3IgZmFpbGVkLn0KLVxlbmR7c2VlYWxzb30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlicmUudGV4IGIvRG9jL2xpYi9saWJyZS50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYjhiNTEuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJyZS50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw5NTQgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtyZX0gLS0tCi0gICAgICAgICBSZWd1bGFyIGV4cHJlc3Npb24gb3BlcmF0aW9uc30KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtyZX0KLVxtb2R1bGVhdXRob3J7RnJlZHJpayBMdW5kaH17ZnJlZHJpa0BweXRob253YXJlLmNvbX0KLVxzZWN0aW9uYXV0aG9ye0FuZHJldyBNLiBLdWNobGluZ317YW1rQGFtay5jYX0KLQotCi1cbW9kdWxlc3lub3BzaXN7UmVndWxhciBleHByZXNzaW9uIHNlYXJjaCBhbmQgbWF0Y2ggb3BlcmF0aW9ucyB3aXRoIGEKLSAgICAgICAgICAgICAgICBQZXJsLXN0eWxlIGV4cHJlc3Npb24gc3ludGF4Ln0KLQotCi1UaGlzIG1vZHVsZSBwcm92aWRlcyByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgb3BlcmF0aW9ucyBzaW1pbGFyIHRvCi10aG9zZSBmb3VuZCBpbiBQZXJsLiAgUmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gc3RyaW5ncyBtYXkgbm90Ci1jb250YWluIG51bGwgYnl0ZXMsIGJ1dCBjYW4gc3BlY2lmeSB0aGUgbnVsbCBieXRlIHVzaW5nIHRoZQotXGNvZGV7XGVcdmFye251bWJlcn19IG5vdGF0aW9uLiAgQm90aCBwYXR0ZXJucyBhbmQgc3RyaW5ncyB0byBiZQotc2VhcmNoZWQgY2FuIGJlIFVuaWNvZGUgc3RyaW5ncyBhcyB3ZWxsIGFzIDgtYml0IHN0cmluZ3MuICBUaGUKLVxtb2R1bGV7cmV9IG1vZHVsZSBpcyBhbHdheXMgYXZhaWxhYmxlLgotCi1SZWd1bGFyIGV4cHJlc3Npb25zIHVzZSB0aGUgYmFja3NsYXNoIGNoYXJhY3RlciAoXGNoYXJhY3RlcntcZX0pIHRvCi1pbmRpY2F0ZSBzcGVjaWFsIGZvcm1zIG9yIHRvIGFsbG93IHNwZWNpYWwgY2hhcmFjdGVycyB0byBiZSB1c2VkCi13aXRob3V0IGludm9raW5nIHRoZWlyIHNwZWNpYWwgbWVhbmluZy4gIFRoaXMgY29sbGlkZXMgd2l0aCBQeXRob24ncwotdXNhZ2Ugb2YgdGhlIHNhbWUgY2hhcmFjdGVyIGZvciB0aGUgc2FtZSBwdXJwb3NlIGluIHN0cmluZyBsaXRlcmFsczsKLWZvciBleGFtcGxlLCB0byBtYXRjaCBhIGxpdGVyYWwgYmFja3NsYXNoLCBvbmUgbWlnaHQgaGF2ZSB0byB3cml0ZQotXGNvZGV7J1xlXGVcZVxlJ30gYXMgdGhlIHBhdHRlcm4gc3RyaW5nLCBiZWNhdXNlIHRoZSByZWd1bGFyIGV4cHJlc3Npb24KLW11c3QgYmUgXHNhbXB7XGVcZX0sIGFuZCBlYWNoIGJhY2tzbGFzaCBtdXN0IGJlIGV4cHJlc3NlZCBhcwotXHNhbXB7XGVcZX0gaW5zaWRlIGEgcmVndWxhciBQeXRob24gc3RyaW5nIGxpdGVyYWwuCi0KLVRoZSBzb2x1dGlvbiBpcyB0byB1c2UgUHl0aG9uJ3MgcmF3IHN0cmluZyBub3RhdGlvbiBmb3IgcmVndWxhcgotZXhwcmVzc2lvbiBwYXR0ZXJuczsgYmFja3NsYXNoZXMgYXJlIG5vdCBoYW5kbGVkIGluIGFueSBzcGVjaWFsIHdheSBpbgotYSBzdHJpbmcgbGl0ZXJhbCBwcmVmaXhlZCB3aXRoIFxjaGFyYWN0ZXJ7cn0uICBTbyBcY29kZXtyIlxlIG4ifSBpcyBhCi10d28tY2hhcmFjdGVyIHN0cmluZyBjb250YWluaW5nIFxjaGFyYWN0ZXJ7XGV9IGFuZCBcY2hhcmFjdGVye259LAotd2hpbGUgXGNvZGV7IlxlIG4ifSBpcyBhIG9uZS1jaGFyYWN0ZXIgc3RyaW5nIGNvbnRhaW5pbmcgYSBuZXdsaW5lLgotVXN1YWxseSBwYXR0ZXJucyB3aWxsIGJlIGV4cHJlc3NlZCBpbiBQeXRob24gY29kZSB1c2luZyB0aGlzIHJhdwotc3RyaW5nIG5vdGF0aW9uLgotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZXRpdGxle01hc3RlcmluZyBSZWd1bGFyIEV4cHJlc3Npb25zfXtCb29rIG9uIHJlZ3VsYXIgZXhwcmVzc2lvbnMKLSAgICAgICAgICAgIGJ5IEplZmZyZXkgRnJpZWRsLCBwdWJsaXNoZWQgYnkgTydSZWlsbHkuICBUaGUgc2Vjb25kIAotICAgICAgICAgICAgZWRpdGlvbiBvZiB0aGUgYm9vayBubyBsb25nZXIgY292ZXJzIFB5dGhvbiBhdCBhbGwsIAotICAgICAgICAgICAgYnV0IHRoZSBmaXJzdCBlZGl0aW9uIGNvdmVyZWQgd3JpdGluZyBnb29kIHJlZ3VsYXIgZXhwcmVzc2lvbgotICAgICAgICAgICAgcGF0dGVybnMgaW4gZ3JlYXQgZGV0YWlsLn0KLVxlbmR7c2VlYWxzb30KLQotCi1cc3Vic2VjdGlvbntSZWd1bGFyIEV4cHJlc3Npb24gU3ludGF4IFxsYWJlbHtyZS1zeW50YXh9fQotCi1BIHJlZ3VsYXIgZXhwcmVzc2lvbiAob3IgUkUpIHNwZWNpZmllcyBhIHNldCBvZiBzdHJpbmdzIHRoYXQgbWF0Y2hlcwotaXQ7IHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBtb2R1bGUgbGV0IHlvdSBjaGVjayBpZiBhIHBhcnRpY3VsYXIgc3RyaW5nCi1tYXRjaGVzIGEgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIChvciBpZiBhIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvbgotbWF0Y2hlcyBhIHBhcnRpY3VsYXIgc3RyaW5nLCB3aGljaCBjb21lcyBkb3duIHRvIHRoZSBzYW1lIHRoaW5nKS4KLQotUmVndWxhciBleHByZXNzaW9ucyBjYW4gYmUgY29uY2F0ZW5hdGVkIHRvIGZvcm0gbmV3IHJlZ3VsYXIKLWV4cHJlc3Npb25zOyBpZiBcZW1waHtBfSBhbmQgXGVtcGh7Qn0gYXJlIGJvdGggcmVndWxhciBleHByZXNzaW9ucywKLXRoZW4gXGVtcGh7QUJ9IGlzIGFsc28gYSByZWd1bGFyIGV4cHJlc3Npb24uICBJbiBnZW5lcmFsLCBpZiBhIHN0cmluZwotXGVtcGh7cH0gbWF0Y2hlcyBcZW1waHtBfSBhbmQgYW5vdGhlciBzdHJpbmcgXGVtcGh7cX0gbWF0Y2hlcyBcZW1waHtCfSwKLXRoZSBzdHJpbmcgXGVtcGh7cHF9IHdpbGwgbWF0Y2ggQUIuICBUaGlzIGhvbGRzIHVubGVzcyBcZW1waHtBfSBvcgotXGVtcGh7Qn0gY29udGFpbiBsb3cgcHJlY2VkZW5jZSBvcGVyYXRpb25zOyBib3VuZGFyeSBjb25kaXRpb25zIGJldHdlZW4KLVxlbXBoe0F9IGFuZCBcZW1waHtCfTsgb3IgaGF2ZSBudW1iZXJlZCBncm91cCByZWZlcmVuY2VzLiAgVGh1cywgY29tcGxleAotZXhwcmVzc2lvbnMgY2FuIGVhc2lseSBiZSBjb25zdHJ1Y3RlZCBmcm9tIHNpbXBsZXIgcHJpbWl0aXZlCi1leHByZXNzaW9ucyBsaWtlIHRoZSBvbmVzIGRlc2NyaWJlZCBoZXJlLiAgRm9yIGRldGFpbHMgb2YgdGhlIHRoZW9yeQotYW5kIGltcGxlbWVudGF0aW9uIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIGNvbnN1bHQgdGhlIEZyaWVkbCBib29rCi1yZWZlcmVuY2VkIGFib3ZlLCBvciBhbG1vc3QgYW55IHRleHRib29rIGFib3V0IGNvbXBpbGVyIGNvbnN0cnVjdGlvbi4KLQotQSBicmllZiBleHBsYW5hdGlvbiBvZiB0aGUgZm9ybWF0IG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMgZm9sbG93cy4gIEZvcgotZnVydGhlciBpbmZvcm1hdGlvbiBhbmQgYSBnZW50bGVyIHByZXNlbnRhdGlvbiwgY29uc3VsdCB0aGUgUmVndWxhcgotRXhwcmVzc2lvbiBIT1dUTywgYWNjZXNzaWJsZSBmcm9tIFx1cmx7aHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9ob3d0by99LgotCi1SZWd1bGFyIGV4cHJlc3Npb25zIGNhbiBjb250YWluIGJvdGggc3BlY2lhbCBhbmQgb3JkaW5hcnkgY2hhcmFjdGVycy4KLU1vc3Qgb3JkaW5hcnkgY2hhcmFjdGVycywgbGlrZSBcY2hhcmFjdGVye0F9LCBcY2hhcmFjdGVye2F9LCBvcgotXGNoYXJhY3RlcnswfSwgYXJlIHRoZSBzaW1wbGVzdCByZWd1bGFyIGV4cHJlc3Npb25zOyB0aGV5IHNpbXBseSBtYXRjaAotdGhlbXNlbHZlcy4gIFlvdSBjYW4gY29uY2F0ZW5hdGUgb3JkaW5hcnkgY2hhcmFjdGVycywgc28gXHJlZ2V4cHtsYXN0fQotbWF0Y2hlcyB0aGUgc3RyaW5nIFxjb2RleydsYXN0J30uICAoSW4gdGhlIHJlc3Qgb2YgdGhpcyBzZWN0aW9uLCB3ZSdsbAotd3JpdGUgUkUncyBpbiBccmVnZXhwe3RoaXMgc3BlY2lhbCBzdHlsZX0sIHVzdWFsbHkgd2l0aG91dCBxdW90ZXMsIGFuZAotc3RyaW5ncyB0byBiZSBtYXRjaGVkIFxjb2RleydpbiBzaW5nbGUgcXVvdGVzJ30uKQotCi1Tb21lIGNoYXJhY3RlcnMsIGxpa2UgXGNoYXJhY3Rlcnt8fSBvciBcY2hhcmFjdGVyeyh9LCBhcmUgc3BlY2lhbC4KLVNwZWNpYWwgY2hhcmFjdGVycyBlaXRoZXIgc3RhbmQgZm9yIGNsYXNzZXMgb2Ygb3JkaW5hcnkgY2hhcmFjdGVycywgb3IKLWFmZmVjdCBob3cgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJvdW5kIHRoZW0gYXJlIGludGVycHJldGVkLgotCi1UaGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGFyZToKLSUKLVxiZWdpbntkZXNjcmlwdGlvbn0KLQotXGl0ZW1bXGNoYXJhY3RlcnsufV0gKERvdC4pICBJbiB0aGUgZGVmYXVsdCBtb2RlLCB0aGlzIG1hdGNoZXMgYW55Ci1jaGFyYWN0ZXIgZXhjZXB0IGEgbmV3bGluZS4gIElmIHRoZSBcY29uc3RhbnR7RE9UQUxMfSBmbGFnIGhhcyBiZWVuCi1zcGVjaWZpZWQsIHRoaXMgbWF0Y2hlcyBhbnkgY2hhcmFjdGVyIGluY2x1ZGluZyBhIG5ld2xpbmUuCi0KLVxpdGVtW1xjaGFyYWN0ZXJ7XHRleHRhc2NpaWNpcmN1bX1dIChDYXJldC4pICBNYXRjaGVzIHRoZSBzdGFydCBvZiB0aGUKLXN0cmluZywgYW5kIGluIFxjb25zdGFudHtNVUxUSUxJTkV9IG1vZGUgYWxzbyBtYXRjaGVzIGltbWVkaWF0ZWx5Ci1hZnRlciBlYWNoIG5ld2xpbmUuCi0KLVxpdGVtW1xjaGFyYWN0ZXJ7XCR9XSBNYXRjaGVzIHRoZSBlbmQgb2YgdGhlIHN0cmluZyBvciBqdXN0IGJlZm9yZSB0aGUKLW5ld2xpbmUgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLCBhbmQgaW4gXGNvbnN0YW50e01VTFRJTElORX0gbW9kZQotYWxzbyBtYXRjaGVzIGJlZm9yZSBhIG5ld2xpbmUuICBccmVnZXhwe2Zvb30gbWF0Y2hlcyBib3RoICdmb28nIGFuZAotJ2Zvb2JhcicsIHdoaWxlIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gXHJlZ2V4cHtmb29cJH0gbWF0Y2hlcyBvbmx5Ci0nZm9vJy4gIE1vcmUgaW50ZXJlc3RpbmdseSwgc2VhcmNoaW5nIGZvciBccmVnZXhwe2Zvby5cJH0gaW4KLSdmb28xXHRleHRiYWNrc2xhc2ggbmZvbzJcdGV4dGJhY2tzbGFzaCBuJyBtYXRjaGVzICdmb28yJyBub3JtYWxseSwKLWJ1dCAnZm9vMScgaW4gXGNvbnN0YW50e01VTFRJTElORX0gbW9kZS4KLQotXGl0ZW1bXGNoYXJhY3RlcnsqfV0gQ2F1c2VzIHRoZSByZXN1bHRpbmcgUkUgdG8KLW1hdGNoIDAgb3IgbW9yZSByZXBldGl0aW9ucyBvZiB0aGUgcHJlY2VkaW5nIFJFLCBhcyBtYW55IHJlcGV0aXRpb25zCi1hcyBhcmUgcG9zc2libGUuICBccmVnZXhwe2FiKn0gd2lsbAotbWF0Y2ggJ2EnLCAnYWInLCBvciAnYScgZm9sbG93ZWQgYnkgYW55IG51bWJlciBvZiAnYidzLgotCi1caXRlbVtcY2hhcmFjdGVyeyt9XSBDYXVzZXMgdGhlCi1yZXN1bHRpbmcgUkUgdG8gbWF0Y2ggMSBvciBtb3JlIHJlcGV0aXRpb25zIG9mIHRoZSBwcmVjZWRpbmcgUkUuCi1ccmVnZXhwe2FiK30gd2lsbCBtYXRjaCAnYScgZm9sbG93ZWQgYnkgYW55IG5vbi16ZXJvIG51bWJlciBvZiAnYidzOyBpdAotd2lsbCBub3QgbWF0Y2gganVzdCAnYScuCi0KLVxpdGVtW1xjaGFyYWN0ZXJ7P31dIENhdXNlcyB0aGUgcmVzdWx0aW5nIFJFIHRvCi1tYXRjaCAwIG9yIDEgcmVwZXRpdGlvbnMgb2YgdGhlIHByZWNlZGluZyBSRS4gIFxyZWdleHB7YWI/fSB3aWxsCi1tYXRjaCBlaXRoZXIgJ2EnIG9yICdhYicuCi0KLVxpdGVtW1xjb2Rleyo/fSwgXGNvZGV7Kz99LCBcY29kZXs/P31dIFRoZSBcY2hhcmFjdGVyeyp9LAotXGNoYXJhY3RlcnsrfSwgYW5kIFxjaGFyYWN0ZXJ7P30gcXVhbGlmaWVycyBhcmUgYWxsIFxkZm57Z3JlZWR5fTsgdGhleQotbWF0Y2ggYXMgbXVjaCB0ZXh0IGFzIHBvc3NpYmxlLiAgU29tZXRpbWVzIHRoaXMgYmVoYXZpb3VyIGlzbid0Ci1kZXNpcmVkOyBpZiB0aGUgUkUgXHJlZ2V4cHs8Lio+fSBpcyBtYXRjaGVkIGFnYWluc3QKLVxjb2Rleyc8SDE+dGl0bGU8L0gxPid9LCBpdCB3aWxsIG1hdGNoIHRoZSBlbnRpcmUgc3RyaW5nLCBhbmQgbm90IGp1c3QKLVxjb2Rleyc8SDE+J30uICBBZGRpbmcgXGNoYXJhY3Rlcns/fSBhZnRlciB0aGUgcXVhbGlmaWVyIG1ha2VzIGl0Ci1wZXJmb3JtIHRoZSBtYXRjaCBpbiBcZGZue25vbi1ncmVlZHl9IG9yIFxkZm57bWluaW1hbH0gZmFzaGlvbjsgYXMKLVxlbXBoe2Zld30gY2hhcmFjdGVycyBhcyBwb3NzaWJsZSB3aWxsIGJlIG1hdGNoZWQuICBVc2luZyBccmVnZXhwey4qP30KLWluIHRoZSBwcmV2aW91cyBleHByZXNzaW9uIHdpbGwgbWF0Y2ggb25seSBcY29kZXsnPEgxPid9LgotCi1caXRlbVtcY29kZXtce1x2YXJ7bX1cfX1dCi1TcGVjaWZpZXMgdGhhdCBleGFjdGx5IFx2YXJ7bX0gY29waWVzIG9mIHRoZSBwcmV2aW91cyBSRSBzaG91bGQgYmUKLW1hdGNoZWQ7IGZld2VyIG1hdGNoZXMgY2F1c2UgdGhlIGVudGlyZSBSRSBub3QgdG8gbWF0Y2guICBGb3IgZXhhbXBsZSwKLVxyZWdleHB7YVx7Nlx9fSB3aWxsIG1hdGNoIGV4YWN0bHkgc2l4IFxjaGFyYWN0ZXJ7YX0gY2hhcmFjdGVycywgYnV0Ci1ub3QgZml2ZS4KLQotXGl0ZW1bXGNvZGV7XHtcdmFye219LFx2YXJ7bn1cfX1dIENhdXNlcyB0aGUgcmVzdWx0aW5nIFJFIHRvIG1hdGNoIGZyb20KLVx2YXJ7bX0gdG8gXHZhcntufSByZXBldGl0aW9ucyBvZiB0aGUgcHJlY2VkaW5nIFJFLCBhdHRlbXB0aW5nIHRvCi1tYXRjaCBhcyBtYW55IHJlcGV0aXRpb25zIGFzIHBvc3NpYmxlLiAgRm9yIGV4YW1wbGUsIFxyZWdleHB7YVx7Myw1XH19Ci13aWxsIG1hdGNoIGZyb20gMyB0byA1IFxjaGFyYWN0ZXJ7YX0gY2hhcmFjdGVycy4gIE9taXR0aW5nIFx2YXJ7bX0KLXNwZWNpZmllcyBhIGxvd2VyIGJvdW5kIG9mIHplcm8sIAotYW5kIG9taXR0aW5nIFx2YXJ7bn0gc3BlY2lmaWVzIGFuIGluZmluaXRlIHVwcGVyIGJvdW5kLiAgQXMgYW4KLWV4YW1wbGUsIFxyZWdleHB7YVx7NCxcfWJ9IHdpbGwgbWF0Y2ggXGNvZGV7YWFhYWJ9IG9yIGEgdGhvdXNhbmQKLVxjaGFyYWN0ZXJ7YX0gY2hhcmFjdGVycyBmb2xsb3dlZCBieSBhIFxjb2Rle2J9LCBidXQgbm90IFxjb2Rle2FhYWJ9LgotVGhlIGNvbW1hIG1heSBub3QgYmUgb21pdHRlZCBvciB0aGUgbW9kaWZpZXIgd291bGQgYmUgY29uZnVzZWQgd2l0aAotdGhlIHByZXZpb3VzbHkgZGVzY3JpYmVkIGZvcm0uCi0KLVxpdGVtW1xjb2Rle1x7XHZhcnttfSxcdmFye259XH0/fV0gQ2F1c2VzIHRoZSByZXN1bHRpbmcgUkUgdG8KLW1hdGNoIGZyb20gXHZhcnttfSB0byBcdmFye259IHJlcGV0aXRpb25zIG9mIHRoZSBwcmVjZWRpbmcgUkUsCi1hdHRlbXB0aW5nIHRvIG1hdGNoIGFzIFxlbXBoe2Zld30gcmVwZXRpdGlvbnMgYXMgcG9zc2libGUuICBUaGlzIGlzCi10aGUgbm9uLWdyZWVkeSB2ZXJzaW9uIG9mIHRoZSBwcmV2aW91cyBxdWFsaWZpZXIuICBGb3IgZXhhbXBsZSwgb24gdGhlCi02LWNoYXJhY3RlciBzdHJpbmcgXGNvZGV7J2FhYWFhYSd9LCBccmVnZXhwe2FcezMsNVx9fSB3aWxsIG1hdGNoIDUKLVxjaGFyYWN0ZXJ7YX0gY2hhcmFjdGVycywgd2hpbGUgXHJlZ2V4cHthXHszLDVcfT99IHdpbGwgb25seSBtYXRjaCAzCi1jaGFyYWN0ZXJzLgotCi1caXRlbVtcY2hhcmFjdGVye1xlfV0gRWl0aGVyIGVzY2FwZXMgc3BlY2lhbCBjaGFyYWN0ZXJzIChwZXJtaXR0aW5nCi15b3UgdG8gbWF0Y2ggY2hhcmFjdGVycyBsaWtlIFxjaGFyYWN0ZXJ7Kn0sIFxjaGFyYWN0ZXJ7P30sIGFuZCBzbwotZm9ydGgpLCBvciBzaWduYWxzIGEgc3BlY2lhbCBzZXF1ZW5jZTsgc3BlY2lhbCBzZXF1ZW5jZXMgYXJlIGRpc2N1c3NlZAotYmVsb3cuCi0KLUlmIHlvdSdyZSBub3QgdXNpbmcgYSByYXcgc3RyaW5nIHRvCi1leHByZXNzIHRoZSBwYXR0ZXJuLCByZW1lbWJlciB0aGF0IFB5dGhvbiBhbHNvIHVzZXMgdGhlCi1iYWNrc2xhc2ggYXMgYW4gZXNjYXBlIHNlcXVlbmNlIGluIHN0cmluZyBsaXRlcmFsczsgaWYgdGhlIGVzY2FwZQotc2VxdWVuY2UgaXNuJ3QgcmVjb2duaXplZCBieSBQeXRob24ncyBwYXJzZXIsIHRoZSBiYWNrc2xhc2ggYW5kCi1zdWJzZXF1ZW50IGNoYXJhY3RlciBhcmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdGluZyBzdHJpbmcuICBIb3dldmVyLAotaWYgUHl0aG9uIHdvdWxkIHJlY29nbml6ZSB0aGUgcmVzdWx0aW5nIHNlcXVlbmNlLCB0aGUgYmFja3NsYXNoIHNob3VsZAotYmUgcmVwZWF0ZWQgdHdpY2UuICBUaGlzIGlzIGNvbXBsaWNhdGVkIGFuZCBoYXJkIHRvIHVuZGVyc3RhbmQsIHNvCi1pdCdzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSB1c2UgcmF3IHN0cmluZ3MgZm9yIGFsbCBidXQgdGhlCi1zaW1wbGVzdCBleHByZXNzaW9ucy4KLQotXGl0ZW1bXGNvZGV7W119XSBVc2VkIHRvIGluZGljYXRlIGEgc2V0IG9mIGNoYXJhY3RlcnMuICBDaGFyYWN0ZXJzIGNhbgotYmUgbGlzdGVkIGluZGl2aWR1YWxseSwgb3IgYSByYW5nZSBvZiBjaGFyYWN0ZXJzIGNhbiBiZSBpbmRpY2F0ZWQgYnkKLWdpdmluZyB0d28gY2hhcmFjdGVycyBhbmQgc2VwYXJhdGluZyB0aGVtIGJ5IGEgXGNoYXJhY3RlcnstfS4gIFNwZWNpYWwKLWNoYXJhY3RlcnMgYXJlIG5vdCBhY3RpdmUgaW5zaWRlIHNldHMuICBGb3IgZXhhbXBsZSwgXHJlZ2V4cHtbYWttXCRdfQotd2lsbCBtYXRjaCBhbnkgb2YgdGhlIGNoYXJhY3RlcnMgXGNoYXJhY3RlcnthfSwgXGNoYXJhY3RlcntrfSwKLVxjaGFyYWN0ZXJ7bX0sIG9yIFxjaGFyYWN0ZXJ7XCR9OyBccmVnZXhwe1thLXpdfQotd2lsbCBtYXRjaCBhbnkgbG93ZXJjYXNlIGxldHRlciwgYW5kIFxjb2Rle1thLXpBLVowLTldfSBtYXRjaGVzIGFueQotbGV0dGVyIG9yIGRpZ2l0LiAgQ2hhcmFjdGVyIGNsYXNzZXMgc3VjaCBhcyBcY29kZXtcZSB3fSBvciBcY29kZXtcZSBTfQotKGRlZmluZWQgYmVsb3cpIGFyZSBhbHNvIGFjY2VwdGFibGUgaW5zaWRlIGEgcmFuZ2UuICBJZiB5b3Ugd2FudCB0bwotaW5jbHVkZSBhIFxjaGFyYWN0ZXJ7XX0gb3IgYSBcY2hhcmFjdGVyey19IGluc2lkZSBhIHNldCwgcHJlY2VkZSBpdCB3aXRoIGEKLWJhY2tzbGFzaCwgb3IgcGxhY2UgaXQgYXMgdGhlIGZpcnN0IGNoYXJhY3Rlci4gIFRoZQotcGF0dGVybiBccmVnZXhwe1tdXX0gd2lsbCBtYXRjaCBcY29kZXsnXSd9LCBmb3IgZXhhbXBsZS4KLQotWW91IGNhbiBtYXRjaCB0aGUgY2hhcmFjdGVycyBub3Qgd2l0aGluIGEgcmFuZ2UgYnkgXGRmbntjb21wbGVtZW50aW5nfQotdGhlIHNldC4gIFRoaXMgaXMgaW5kaWNhdGVkIGJ5IGluY2x1ZGluZyBhCi1cY2hhcmFjdGVye1x0ZXh0YXNjaWljaXJjdW19IGFzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHNldDsKLVxjaGFyYWN0ZXJ7XHRleHRhc2NpaWNpcmN1bX0gZWxzZXdoZXJlIHdpbGwgc2ltcGx5IG1hdGNoIHRoZQotXGNoYXJhY3RlcntcdGV4dGFzY2lpY2lyY3VtfSBjaGFyYWN0ZXIuICBGb3IgZXhhbXBsZSwKLVxyZWdleHB7W3tcdGV4dGFzY2lpY2lyY3VtfTVdfSB3aWxsIG1hdGNoCi1hbnkgY2hhcmFjdGVyIGV4Y2VwdCBcY2hhcmFjdGVyezV9LCBhbmQKLVxyZWdleHB7W1x0ZXh0YXNjaWljaXJjdW1cY29kZXtcdGV4dGFzY2lpY2lyY3VtfV19IHdpbGwgbWF0Y2ggYW55IGNoYXJhY3RlcgotZXhjZXB0IFxjaGFyYWN0ZXJ7XHRleHRhc2NpaWNpcmN1bX0uCi0KLVxpdGVtW1xjaGFyYWN0ZXJ7fH1dXGNvZGV7QXxCfSwgd2hlcmUgQSBhbmQgQiBjYW4gYmUgYXJiaXRyYXJ5IFJFcywKLWNyZWF0ZXMgYSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCB3aWxsIG1hdGNoIGVpdGhlciBBIG9yIEIuICBBbgotYXJiaXRyYXJ5IG51bWJlciBvZiBSRXMgY2FuIGJlIHNlcGFyYXRlZCBieSB0aGUgXGNoYXJhY3Rlcnt8fSBpbiB0aGlzCi13YXkuICBUaGlzIGNhbiBiZSB1c2VkIGluc2lkZSBncm91cHMgKHNlZSBiZWxvdykgYXMgd2VsbC4gIEFzIHRoZSB0YXJnZXQKLXN0cmluZyBpcyBzY2FubmVkLCBSRXMgc2VwYXJhdGVkIGJ5IFxjaGFyYWN0ZXJ7fH0gYXJlIHRyaWVkIGZyb20gbGVmdCB0bwotcmlnaHQuIFdoZW4gb25lIHBhdHRlcm4gY29tcGxldGVseSBtYXRjaGVzLCB0aGF0IGJyYW5jaCBpcyBhY2NlcHRlZC4KLVRoaXMgbWVhbnMgdGhhdCBvbmNlIFxjb2Rle0F9IG1hdGNoZXMsIFxjb2Rle0J9IHdpbGwgbm90IGJlIHRlc3RlZCBmdXJ0aGVyLAotZXZlbiBpZiBpdCB3b3VsZCBwcm9kdWNlIGEgbG9uZ2VyIG92ZXJhbGwgbWF0Y2guICBJbiBvdGhlciB3b3JkcywgdGhlCi1cY2hhcmFjdGVye3x9IG9wZXJhdG9yIGlzIG5ldmVyIGdyZWVkeS4gIFRvIG1hdGNoIGEgbGl0ZXJhbCBcY2hhcmFjdGVye3x9LAotdXNlIFxyZWdleHB7XGV8fSwgb3IgZW5jbG9zZSBpdCBpbnNpZGUgYSBjaGFyYWN0ZXIgY2xhc3MsIGFzIGluIFxyZWdleHB7W3xdfS4KLQotXGl0ZW1bXGNvZGV7KC4uLil9XSBNYXRjaGVzIHdoYXRldmVyIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBpbnNpZGUgdGhlCi1wYXJlbnRoZXNlcywgYW5kIGluZGljYXRlcyB0aGUgc3RhcnQgYW5kIGVuZCBvZiBhIGdyb3VwOyB0aGUgY29udGVudHMKLW9mIGEgZ3JvdXAgY2FuIGJlIHJldHJpZXZlZCBhZnRlciBhIG1hdGNoIGhhcyBiZWVuIHBlcmZvcm1lZCwgYW5kIGNhbgotYmUgbWF0Y2hlZCBsYXRlciBpbiB0aGUgc3RyaW5nIHdpdGggdGhlIFxyZWdleHB7XGUgXHZhcntudW1iZXJ9fSBzcGVjaWFsCi1zZXF1ZW5jZSwgZGVzY3JpYmVkIGJlbG93LiAgVG8gbWF0Y2ggdGhlIGxpdGVyYWxzIFxjaGFyYWN0ZXJ7KH0gb3IKLVxjaGFyYWN0ZXJ7KX0sIHVzZSBccmVnZXhwe1xlKH0gb3IgXHJlZ2V4cHtcZSl9LCBvciBlbmNsb3NlIHRoZW0KLWluc2lkZSBhIGNoYXJhY3RlciBjbGFzczogXHJlZ2V4cHtbKF0gWyldfS4KLQotXGl0ZW1bXGNvZGV7KD8uLi4pfV0gVGhpcyBpcyBhbiBleHRlbnNpb24gbm90YXRpb24gKGEgXGNoYXJhY3Rlcns/fQotZm9sbG93aW5nIGEgXGNoYXJhY3RlcnsofSBpcyBub3QgbWVhbmluZ2Z1bCBvdGhlcndpc2UpLiAgVGhlIGZpcnN0Ci1jaGFyYWN0ZXIgYWZ0ZXIgdGhlIFxjaGFyYWN0ZXJ7P30KLWRldGVybWluZXMgd2hhdCB0aGUgbWVhbmluZyBhbmQgZnVydGhlciBzeW50YXggb2YgdGhlIGNvbnN0cnVjdCBpcy4KLUV4dGVuc2lvbnMgdXN1YWxseSBkbyBub3QgY3JlYXRlIGEgbmV3IGdyb3VwOwotXHJlZ2V4cHsoP1A8XHZhcntuYW1lfT4uLi4pfSBpcyB0aGUgb25seSBleGNlcHRpb24gdG8gdGhpcyBydWxlLgotRm9sbG93aW5nIGFyZSB0aGUgY3VycmVudGx5IHN1cHBvcnRlZCBleHRlbnNpb25zLgotCi1caXRlbVtcY29kZXsoP2lMbXN1eCl9XSAoT25lIG9yIG1vcmUgbGV0dGVycyBmcm9tIHRoZSBzZXQgXGNoYXJhY3RlcntpfSwKLVxjaGFyYWN0ZXJ7TH0sIFxjaGFyYWN0ZXJ7bX0sIFxjaGFyYWN0ZXJ7c30sIFxjaGFyYWN0ZXJ7dX0sCi1cY2hhcmFjdGVye3h9LikgIFRoZSBncm91cCBtYXRjaGVzIHRoZSBlbXB0eSBzdHJpbmc7IHRoZSBsZXR0ZXJzIHNldAotdGhlIGNvcnJlc3BvbmRpbmcgZmxhZ3MgKFxjb25zdGFudHtyZS5JfSwgXGNvbnN0YW50e3JlLkx9LAotXGNvbnN0YW50e3JlLk19LCBcY29uc3RhbnR7cmUuU30sIFxjb25zdGFudHtyZS5VfSwgXGNvbnN0YW50e3JlLlh9KQotZm9yIHRoZSBlbnRpcmUgcmVndWxhciBleHByZXNzaW9uLiAgVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdpc2ggdG8KLWluY2x1ZGUgdGhlIGZsYWdzIGFzIHBhcnQgb2YgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiwgaW5zdGVhZCBvZgotcGFzc2luZyBhIFx2YXJ7ZmxhZ30gYXJndW1lbnQgdG8gdGhlIFxmdW5jdGlvbntjb21waWxlKCl9IGZ1bmN0aW9uLgotCi1Ob3RlIHRoYXQgdGhlIFxyZWdleHB7KD94KX0gZmxhZyBjaGFuZ2VzIGhvdyB0aGUgZXhwcmVzc2lvbiBpcyBwYXJzZWQuCi1JdCBzaG91bGQgYmUgdXNlZCBmaXJzdCBpbiB0aGUgZXhwcmVzc2lvbiBzdHJpbmcsIG9yIGFmdGVyIG9uZSBvciBtb3JlCi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMuICBJZiB0aGVyZSBhcmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyBiZWZvcmUKLXRoZSBmbGFnLCB0aGUgcmVzdWx0cyBhcmUgdW5kZWZpbmVkLgotCi1caXRlbVtcY29kZXsoPzouLi4pfV0gQSBub24tZ3JvdXBpbmcgdmVyc2lvbiBvZiByZWd1bGFyIHBhcmVudGhlc2VzLgotTWF0Y2hlcyB3aGF0ZXZlciByZWd1bGFyIGV4cHJlc3Npb24gaXMgaW5zaWRlIHRoZSBwYXJlbnRoZXNlcywgYnV0IHRoZQotc3Vic3RyaW5nIG1hdGNoZWQgYnkgdGhlCi1ncm91cCBcZW1waHtjYW5ub3R9IGJlIHJldHJpZXZlZCBhZnRlciBwZXJmb3JtaW5nIGEgbWF0Y2ggb3IKLXJlZmVyZW5jZWQgbGF0ZXIgaW4gdGhlIHBhdHRlcm4uCi0KLVxpdGVtW1xjb2Rleyg/UDxcdmFye25hbWV9Pi4uLil9XSBTaW1pbGFyIHRvIHJlZ3VsYXIgcGFyZW50aGVzZXMsIGJ1dAotdGhlIHN1YnN0cmluZyBtYXRjaGVkIGJ5IHRoZSBncm91cCBpcyBhY2Nlc3NpYmxlIHZpYSB0aGUgc3ltYm9saWMgZ3JvdXAKLW5hbWUgXHZhcntuYW1lfS4gIEdyb3VwIG5hbWVzIG11c3QgYmUgdmFsaWQgUHl0aG9uIGlkZW50aWZpZXJzLCBhbmQKLWVhY2ggZ3JvdXAgbmFtZSBtdXN0IGJlIGRlZmluZWQgb25seSBvbmNlIHdpdGhpbiBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4gIEEKLXN5bWJvbGljIGdyb3VwIGlzIGFsc28gYSBudW1iZXJlZCBncm91cCwganVzdCBhcyBpZiB0aGUgZ3JvdXAgd2VyZSBub3QKLW5hbWVkLiAgU28gdGhlIGdyb3VwIG5hbWVkICdpZCcgaW4gdGhlIGV4YW1wbGUgYWJvdmUgY2FuIGFsc28gYmUKLXJlZmVyZW5jZWQgYXMgdGhlIG51bWJlcmVkIGdyb3VwIDEuCi0KLUZvciBleGFtcGxlLCBpZiB0aGUgcGF0dGVybiBpcwotXHJlZ2V4cHsoP1A8aWQ+W2EtekEtWl9dXGUgdyopfSwgdGhlIGdyb3VwIGNhbiBiZSByZWZlcmVuY2VkIGJ5IGl0cwotbmFtZSBpbiBhcmd1bWVudHMgdG8gbWV0aG9kcyBvZiBtYXRjaCBvYmplY3RzLCBzdWNoIGFzCi1cY29kZXttLmdyb3VwKCdpZCcpfSBvciBcY29kZXttLmVuZCgnaWQnKX0sIGFuZCBhbHNvIGJ5IG5hbWUgaW4KLXBhdHRlcm4gdGV4dCAoZm9yIGV4YW1wbGUsIFxyZWdleHB7KD9QPWlkKX0pIGFuZCByZXBsYWNlbWVudCB0ZXh0Ci0oc3VjaCBhcyBcY29kZXtcZSBnPGlkPn0pLgotCi1caXRlbVtcY29kZXsoP1A9XHZhcntuYW1lfSl9XSBNYXRjaGVzIHdoYXRldmVyIHRleHQgd2FzIG1hdGNoZWQgYnkgdGhlCi1lYXJsaWVyIGdyb3VwIG5hbWVkIFx2YXJ7bmFtZX0uCi0KLVxpdGVtW1xjb2Rleyg/XCMuLi4pfV0gQSBjb21tZW50OyB0aGUgY29udGVudHMgb2YgdGhlIHBhcmVudGhlc2VzIGFyZQotc2ltcGx5IGlnbm9yZWQuCi0KLVxpdGVtW1xjb2Rleyg/PS4uLil9XSBNYXRjaGVzIGlmIFxyZWdleHB7Li4ufSBtYXRjaGVzIG5leHQsIGJ1dCBkb2Vzbid0Ci1jb25zdW1lIGFueSBvZiB0aGUgc3RyaW5nLiAgVGhpcyBpcyBjYWxsZWQgYSBsb29rYWhlYWQgYXNzZXJ0aW9uLiAgRm9yCi1leGFtcGxlLCBccmVnZXhwe0lzYWFjICg/PUFzaW1vdil9IHdpbGwgbWF0Y2ggXGNvZGV7J0lzYWFjfid9IG9ubHkgaWYgaXQncwotZm9sbG93ZWQgYnkgXGNvZGV7J0FzaW1vdid9LgotCi1caXRlbVtcY29kZXsoPyEuLi4pfV0gTWF0Y2hlcyBpZiBccmVnZXhwey4uLn0gZG9lc24ndCBtYXRjaCBuZXh0LiAgVGhpcwotaXMgYSBuZWdhdGl2ZSBsb29rYWhlYWQgYXNzZXJ0aW9uLiAgRm9yIGV4YW1wbGUsCi1ccmVnZXhwe0lzYWFjICg/IUFzaW1vdil9IHdpbGwgbWF0Y2ggXGNvZGV7J0lzYWFjfid9IG9ubHkgaWYgaXQncyBcZW1waHtub3R9Ci1mb2xsb3dlZCBieSBcY29kZXsnQXNpbW92J30uCi0KLVxpdGVtW1xjb2Rleyg/PD0uLi4pfV0gTWF0Y2hlcyBpZiB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgc3RyaW5nCi1pcyBwcmVjZWRlZCBieSBhIG1hdGNoIGZvciBccmVnZXhwey4uLn0gdGhhdCBlbmRzIGF0IHRoZSBjdXJyZW50Ci1wb3NpdGlvbi4gIFRoaXMgaXMgY2FsbGVkIGEgXGRmbntwb3NpdGl2ZSBsb29rYmVoaW5kIGFzc2VydGlvbn0uCi1ccmVnZXhweyg/PD1hYmMpZGVmfSB3aWxsIGZpbmQgYSBtYXRjaCBpbiBcc2FtcHthYmNkZWZ9LCBzaW5jZSB0aGUKLWxvb2tiZWhpbmQgd2lsbCBiYWNrIHVwIDMgY2hhcmFjdGVycyBhbmQgY2hlY2sgaWYgdGhlIGNvbnRhaW5lZAotcGF0dGVybiBtYXRjaGVzLiAgVGhlIGNvbnRhaW5lZCBwYXR0ZXJuIG11c3Qgb25seSBtYXRjaCBzdHJpbmdzIG9mCi1zb21lIGZpeGVkIGxlbmd0aCwgbWVhbmluZyB0aGF0IFxyZWdleHB7YWJjfSBvciBccmVnZXhwe2F8Yn0gYXJlCi1hbGxvd2VkLCBidXQgXHJlZ2V4cHthKn0gYW5kIFxyZWdleHB7YVx7Myw0XH19IGFyZSBub3QuICBOb3RlIHRoYXQKLXBhdHRlcm5zIHdoaWNoIHN0YXJ0IHdpdGggcG9zaXRpdmUgbG9va2JlaGluZCBhc3NlcnRpb25zIHdpbGwgbmV2ZXIKLW1hdGNoIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZyBiZWluZyBzZWFyY2hlZDsgeW91IHdpbGwgbW9zdAotbGlrZWx5IHdhbnQgdG8gdXNlIHRoZSBcZnVuY3Rpb257c2VhcmNoKCl9IGZ1bmN0aW9uIHJhdGhlciB0aGFuIHRoZQotXGZ1bmN0aW9ue21hdGNoKCl9IGZ1bmN0aW9uOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gaW1wb3J0IHJlCi0+Pj4gbSA9IHJlLnNlYXJjaCgnKD88PWFiYylkZWYnLCAnYWJjZGVmJykKLT4+PiBtLmdyb3VwKDApCi0nZGVmJwotXGVuZHt2ZXJiYXRpbX0KLQotVGhpcyBleGFtcGxlIGxvb2tzIGZvciBhIHdvcmQgZm9sbG93aW5nIGEgaHlwaGVuOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gbSA9IHJlLnNlYXJjaCgnKD88PS0pXHcrJywgJ3NwYW0tZWdnJykKLT4+PiBtLmdyb3VwKDApCi0nZWdnJwotXGVuZHt2ZXJiYXRpbX0KLQotXGl0ZW1bXGNvZGV7KD88IS4uLil9XSBNYXRjaGVzIGlmIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBzdHJpbmcKLWlzIG5vdCBwcmVjZWRlZCBieSBhIG1hdGNoIGZvciBccmVnZXhwey4uLn0uICBUaGlzIGlzIGNhbGxlZCBhCi1cZGZue25lZ2F0aXZlIGxvb2tiZWhpbmQgYXNzZXJ0aW9ufS4gIFNpbWlsYXIgdG8gcG9zaXRpdmUgbG9va2JlaGluZAotYXNzZXJ0aW9ucywgdGhlIGNvbnRhaW5lZCBwYXR0ZXJuIG11c3Qgb25seSBtYXRjaCBzdHJpbmdzIG9mIHNvbWUKLWZpeGVkIGxlbmd0aC4gIFBhdHRlcm5zIHdoaWNoIHN0YXJ0IHdpdGggbmVnYXRpdmUgbG9va2JlaGluZAotYXNzZXJ0aW9ucyBtYXkgbWF0Y2ggYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nIGJlaW5nIHNlYXJjaGVkLgotCi1caXRlbVtcY29kZXsoPyhcdmFye2lkL25hbWV9KXllcy1wYXR0ZXJufG5vLXBhdHRlcm4pfV0gV2lsbCB0cnkgdG8gbWF0Y2gKLXdpdGggXHJlZ2V4cHt5ZXMtcGF0dGVybn0gaWYgdGhlIGdyb3VwIHdpdGggZ2l2ZW4gXHZhcntpZH0gb3IgXHZhcntuYW1lfQotZXhpc3RzLCBhbmQgd2l0aCBccmVnZXhwe25vLXBhdHRlcm59IGlmIGl0IGRvZXNuJ3QuIFxyZWdleHB7fG5vLXBhdHRlcm59Ci1pcyBvcHRpb25hbCBhbmQgY2FuIGJlIG9taXR0ZWQuIEZvciBleGFtcGxlLCAKLVxyZWdleHB7KDwpPyhcZSB3K0BcZSB3Kyg/OlxlIC5cZSB3KykrKSg/KDEpPil9IGlzIGEgcG9vciBlbWFpbCBtYXRjaGluZwotcGF0dGVybiwgd2hpY2ggd2lsbCBtYXRjaCB3aXRoIFxjb2Rleyc8dXNlckBob3N0LmNvbT4nfSBhcyB3ZWxsIGFzCi1cY29kZXsndXNlckBob3N0LmNvbSd9LCBidXQgbm90IHdpdGggXGNvZGV7Jzx1c2VyQGhvc3QuY29tJ30uCi1cdmVyc2lvbmFkZGVkezIuNH0KLQotXGVuZHtkZXNjcmlwdGlvbn0KLQotVGhlIHNwZWNpYWwgc2VxdWVuY2VzIGNvbnNpc3Qgb2YgXGNoYXJhY3RlcntcZX0gYW5kIGEgY2hhcmFjdGVyIGZyb20gdGhlCi1saXN0IGJlbG93LiAgSWYgdGhlIG9yZGluYXJ5IGNoYXJhY3RlciBpcyBub3Qgb24gdGhlIGxpc3QsIHRoZW4gdGhlCi1yZXN1bHRpbmcgUkUgd2lsbCBtYXRjaCB0aGUgc2Vjb25kIGNoYXJhY3Rlci4gIEZvciBleGFtcGxlLAotXHJlZ2V4cHtcZVwkfSBtYXRjaGVzIHRoZSBjaGFyYWN0ZXIgXGNoYXJhY3RlcntcJH0uCi0lCi1cYmVnaW57ZGVzY3JpcHRpb259Ci0KLVxpdGVtW1xjb2Rle1xlIFx2YXJ7bnVtYmVyfX1dIE1hdGNoZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBncm91cCBvZiB0aGUKLXNhbWUgbnVtYmVyLiAgR3JvdXBzIGFyZSBudW1iZXJlZCBzdGFydGluZyBmcm9tIDEuICBGb3IgZXhhbXBsZSwKLVxyZWdleHB7KC4rKSBcZSAxfSBtYXRjaGVzIFxjb2Rleyd0aGUgdGhlJ30gb3IgXGNvZGV7JzU1IDU1J30sIGJ1dCBub3QKLVxjb2Rleyd0aGUgZW5kJ30gKG5vdGUKLXRoZSBzcGFjZSBhZnRlciB0aGUgZ3JvdXApLiAgVGhpcyBzcGVjaWFsIHNlcXVlbmNlIGNhbiBvbmx5IGJlIHVzZWQgdG8KLW1hdGNoIG9uZSBvZiB0aGUgZmlyc3QgOTkgZ3JvdXBzLiAgSWYgdGhlIGZpcnN0IGRpZ2l0IG9mIFx2YXJ7bnVtYmVyfQotaXMgMCwgb3IgXHZhcntudW1iZXJ9IGlzIDMgb2N0YWwgZGlnaXRzIGxvbmcsIGl0IHdpbGwgbm90IGJlIGludGVycHJldGVkCi1hcyBhIGdyb3VwIG1hdGNoLCBidXQgYXMgdGhlIGNoYXJhY3RlciB3aXRoIG9jdGFsIHZhbHVlIFx2YXJ7bnVtYmVyfS4KLUluc2lkZSB0aGUgXGNoYXJhY3RlcntbfSBhbmQgXGNoYXJhY3RlcntdfSBvZiBhIGNoYXJhY3RlciBjbGFzcywgYWxsIG51bWVyaWMKLWVzY2FwZXMgYXJlIHRyZWF0ZWQgYXMgY2hhcmFjdGVycy4KLQotXGl0ZW1bXGNvZGV7XGUgQX1dIE1hdGNoZXMgb25seSBhdCB0aGUgc3RhcnQgb2YgdGhlIHN0cmluZy4KLQotXGl0ZW1bXGNvZGV7XGUgYn1dIE1hdGNoZXMgdGhlIGVtcHR5IHN0cmluZywgYnV0IG9ubHkgYXQgdGhlCi1iZWdpbm5pbmcgb3IgZW5kIG9mIGEgd29yZC4gIEEgd29yZCBpcyBkZWZpbmVkIGFzIGEgc2VxdWVuY2Ugb2YKLWFscGhhbnVtZXJpYyBvciB1bmRlcnNjb3JlIGNoYXJhY3RlcnMsIHNvIHRoZSBlbmQgb2YgYSB3b3JkIGlzIGluZGljYXRlZCBieQotd2hpdGVzcGFjZSBvciBhIG5vbi1hbHBoYW51bWVyaWMsIG5vbi11bmRlcnNjb3JlIGNoYXJhY3Rlci4gIE5vdGUgdGhhdCAKLXt9XGNvZGV7XGUgYn0gaXMgZGVmaW5lZCBhcyB0aGUgYm91bmRhcnkgYmV0d2VlbiBcY29kZXtcZSB3fSBhbmQgXGNvZGV7XGUKLVd9LCBzbyB0aGUgcHJlY2lzZSBzZXQgb2YgY2hhcmFjdGVycyBkZWVtZWQgdG8gYmUgYWxwaGFudW1lcmljIGRlcGVuZHMgb24gdGhlCi12YWx1ZXMgb2YgdGhlIFxjb2Rle1VOSUNPREV9IGFuZCBcY29kZXtMT0NBTEV9IGZsYWdzLiAgSW5zaWRlIGEgY2hhcmFjdGVyCi1yYW5nZSwgXHJlZ2V4cHtcZSBifSByZXByZXNlbnRzIHRoZSBiYWNrc3BhY2UgY2hhcmFjdGVyLCBmb3IgY29tcGF0aWJpbGl0eQotd2l0aCBQeXRob24ncyBzdHJpbmcgbGl0ZXJhbHMuCi0KLVxpdGVtW1xjb2Rle1xlIEJ9XSBNYXRjaGVzIHRoZSBlbXB0eSBzdHJpbmcsIGJ1dCBvbmx5IHdoZW4gaXQgaXMgXGVtcGh7bm90fQotYXQgdGhlIGJlZ2lubmluZyBvciBlbmQgb2YgYSB3b3JkLiAgVGhpcyBpcyBqdXN0IHRoZSBvcHBvc2l0ZSBvZiB7fVxjb2Rle1xlCi1ifSwgc28gaXMgYWxzbyBzdWJqZWN0IHRvIHRoZSBzZXR0aW5ncyBvZiBcY29kZXtMT0NBTEV9IGFuZCBcY29kZXtVTklDT0RFfS4KLQotXGl0ZW1bXGNvZGV7XGUgZH1dV2hlbiB0aGUgXGNvbnN0YW50e1VOSUNPREV9IGZsYWcgaXMgbm90IHNwZWNpZmllZCwgbWF0Y2hlcwotYW55IGRlY2ltYWwgZGlnaXQ7IHRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgc2V0IFxyZWdleHB7WzAtOV19LiAKLVdpdGggXGNvbnN0YW50e1VOSUNPREV9LCBpdCB3aWxsIG1hdGNoIHdoYXRldmVyIGlzIGNsYXNzaWZpZWQgYXMgYSBkaWdpdAotaW4gdGhlIFVuaWNvZGUgY2hhcmFjdGVyIHByb3BlcnRpZXMgZGF0YWJhc2UuCi0KLVxpdGVtW1xjb2Rle1xlIER9XVdoZW4gdGhlIFxjb25zdGFudHtVTklDT0RFfSBmbGFnIGlzIG5vdCBzcGVjaWZpZWQsIG1hdGNoZXMKLWFueSBub24tZGlnaXQgY2hhcmFjdGVyOyB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIHNldCAKLVxyZWdleHB7W3tcdGV4dGFzY2lpY2lyY3VtfTAtOV19LiAgV2l0aCBcY29uc3RhbnR7VU5JQ09ERX0sIGl0IHdpbGwgbWF0Y2ggCi1hbnl0aGluZyBvdGhlciB0aGFuIGNoYXJhY3RlciBtYXJrZWQgYXMgZGlnaXRzIGluIHRoZSBVbmljb2RlIGNoYXJhY3RlciAKLXByb3BlcnRpZXMgZGF0YWJhc2UuCi0KLVxpdGVtW1xjb2Rle1xlIHN9XVdoZW4gdGhlIFxjb25zdGFudHtMT0NBTEV9IGFuZCBcY29uc3RhbnR7VU5JQ09ERX0KLWZsYWdzIGFyZSBub3Qgc3BlY2lmaWVkLCBtYXRjaGVzIGFueSB3aGl0ZXNwYWNlIGNoYXJhY3RlcjsgdGhpcyBpcwotZXF1aXZhbGVudCB0byB0aGUgc2V0IFxyZWdleHB7WyBcZSB0XGUgblxlIHJcZSBmXGUgdl19LgotV2l0aCBcY29uc3RhbnR7TE9DQUxFfSwgaXQgd2lsbCBtYXRjaCB0aGlzIHNldCBwbHVzIHdoYXRldmVyIGNoYXJhY3RlcnMKLWFyZSBkZWZpbmVkIGFzIHNwYWNlIGZvciB0aGUgY3VycmVudCBsb2NhbGUuIElmIFxjb25zdGFudHtVTklDT0RFfSBpcyBzZXQsCi10aGlzIHdpbGwgbWF0Y2ggdGhlIGNoYXJhY3RlcnMgXHJlZ2V4cHtbIFxlIHRcZSBuXGUgclxlIGZcZSB2XX0gcGx1cwotd2hhdGV2ZXIgaXMgY2xhc3NpZmllZCBhcyBzcGFjZSBpbiB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgcHJvcGVydGllcwotZGF0YWJhc2UuCi0KLVxpdGVtW1xjb2Rle1xlIFN9XVdoZW4gdGhlIFxjb25zdGFudHtMT0NBTEV9IGFuZCBcY29uc3RhbnR7VU5JQ09ERX0KLWZsYWdzIGFyZSBub3Qgc3BlY2lmaWVkLCBtYXRjaGVzIGFueSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXI7IHRoaXMgaXMKLWVxdWl2YWxlbnQgdG8gdGhlIHNldCBccmVnZXhwe1tcdGV4dGFzY2lpY2lyY3VtXCBcZSB0XGUgblxlIHJcZSBmXGUgdl19Ci1XaXRoIFxjb25zdGFudHtMT0NBTEV9LCBpdCB3aWxsIG1hdGNoIGFueSBjaGFyYWN0ZXIgbm90IGluIHRoaXMgc2V0LAotYW5kIG5vdCBkZWZpbmVkIGFzIHNwYWNlIGluIHRoZSBjdXJyZW50IGxvY2FsZS4gSWYgXGNvbnN0YW50e1VOSUNPREV9Ci1pcyBzZXQsIHRoaXMgd2lsbCBtYXRjaCBhbnl0aGluZyBvdGhlciB0aGFuIFxyZWdleHB7WyBcZSB0XGUgblxlIHJcZSBmXGUgdl19Ci1hbmQgY2hhcmFjdGVycyBtYXJrZWQgYXMgc3BhY2UgaW4gdGhlIFVuaWNvZGUgY2hhcmFjdGVyIHByb3BlcnRpZXMgZGF0YWJhc2UuCi0KLVxpdGVtW1xjb2Rle1xlIHd9XVdoZW4gdGhlIFxjb25zdGFudHtMT0NBTEV9IGFuZCBcY29uc3RhbnR7VU5JQ09ERX0KLWZsYWdzIGFyZSBub3Qgc3BlY2lmaWVkLCBtYXRjaGVzIGFueSBhbHBoYW51bWVyaWMgY2hhcmFjdGVyIGFuZCB0aGUKLXVuZGVyc2NvcmU7IHRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgc2V0Ci1ccmVnZXhwe1thLXpBLVowLTlfXX0uICBXaXRoIFxjb25zdGFudHtMT0NBTEV9LCBpdCB3aWxsIG1hdGNoIHRoZSBzZXQKLVxyZWdleHB7WzAtOV9dfSBwbHVzIHdoYXRldmVyIGNoYXJhY3RlcnMgYXJlIGRlZmluZWQgYXMgYWxwaGFudW1lcmljIGZvcgotdGhlIGN1cnJlbnQgbG9jYWxlLiAgSWYgXGNvbnN0YW50e1VOSUNPREV9IGlzIHNldCwgdGhpcyB3aWxsIG1hdGNoIHRoZQotY2hhcmFjdGVycyBccmVnZXhwe1swLTlfXX0gcGx1cyB3aGF0ZXZlciBpcyBjbGFzc2lmaWVkIGFzIGFscGhhbnVtZXJpYwotaW4gdGhlIFVuaWNvZGUgY2hhcmFjdGVyIHByb3BlcnRpZXMgZGF0YWJhc2UuCi0KLVxpdGVtW1xjb2Rle1xlIFd9XVdoZW4gdGhlIFxjb25zdGFudHtMT0NBTEV9IGFuZCBcY29uc3RhbnR7VU5JQ09ERX0KLWZsYWdzIGFyZSBub3Qgc3BlY2lmaWVkLCBtYXRjaGVzIGFueSBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcjsgdGhpcwotaXMgZXF1aXZhbGVudCB0byB0aGUgc2V0IFxyZWdleHB7W3tcdGV4dGFzY2lpY2lyY3VtfWEtekEtWjAtOV9dfS4gICBXaXRoCi1cY29uc3RhbnR7TE9DQUxFfSwgaXQgd2lsbCBtYXRjaCBhbnkgY2hhcmFjdGVyIG5vdCBpbiB0aGUgc2V0Ci1ccmVnZXhwe1swLTlfXX0sIGFuZCBub3QgZGVmaW5lZCBhcyBhbHBoYW51bWVyaWMgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4KLUlmIFxjb25zdGFudHtVTklDT0RFfSBpcyBzZXQsIHRoaXMgd2lsbCBtYXRjaCBhbnl0aGluZyBvdGhlciB0aGFuCi1ccmVnZXhwe1swLTlfXX0gYW5kIGNoYXJhY3RlcnMgbWFya2VkIGFzIGFscGhhbnVtZXJpYyBpbiB0aGUgVW5pY29kZQotY2hhcmFjdGVyIHByb3BlcnRpZXMgZGF0YWJhc2UuCi0KLVxpdGVtW1xjb2Rle1xlIFp9XU1hdGNoZXMgb25seSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCi0KLVxlbmR7ZGVzY3JpcHRpb259Ci0KLU1vc3Qgb2YgdGhlIHN0YW5kYXJkIGVzY2FwZXMgc3VwcG9ydGVkIGJ5IFB5dGhvbiBzdHJpbmcgbGl0ZXJhbHMgYXJlCi1hbHNvIGFjY2VwdGVkIGJ5IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gcGFyc2VyOgotCi1cYmVnaW57dmVyYmF0aW19Ci1cYSAgICAgIFxiICAgICAgXGYgICAgICBcbgotXHIgICAgICBcdCAgICAgIFx2ICAgICAgXHgKLVxcCi1cZW5ke3ZlcmJhdGltfQotCi1PY3RhbCBlc2NhcGVzIGFyZSBpbmNsdWRlZCBpbiBhIGxpbWl0ZWQgZm9ybTogSWYgdGhlIGZpcnN0IGRpZ2l0IGlzIGEKLTAsIG9yIGlmIHRoZXJlIGFyZSB0aHJlZSBvY3RhbCBkaWdpdHMsIGl0IGlzIGNvbnNpZGVyZWQgYW4gb2N0YWwKLWVzY2FwZS4gT3RoZXJ3aXNlLCBpdCBpcyBhIGdyb3VwIHJlZmVyZW5jZS4gIEFzIGZvciBzdHJpbmcgbGl0ZXJhbHMsCi1vY3RhbCBlc2NhcGVzIGFyZSBhbHdheXMgYXQgbW9zdCB0aHJlZSBkaWdpdHMgaW4gbGVuZ3RoLgotCi0KLSUgTm90ZSB0aGUgbGFjayBvZiBhIHBlcmlvZCBpbiB0aGUgc2VjdGlvbiB0aXRsZTsgaXQgY2F1c2VzIHByb2JsZW1zCi0lIHdpdGggcmVhZGVycyBvZiB0aGUgR05VIGluZm8gdmVyc2lvbi4gIFNlZSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvc2YvNTgxNDE0LgotXHN1YnNlY3Rpb257TWF0Y2hpbmcgdnMgU2VhcmNoaW5nIFxsYWJlbHttYXRjaGluZy1zZWFyY2hpbmd9fQotXHNlY3Rpb25hdXRob3J7RnJlZCBMLiBEcmFrZSwgSnIufXtmZHJha2VAYWNtLm9yZ30KLQotUHl0aG9uIG9mZmVycyB0d28gZGlmZmVyZW50IHByaW1pdGl2ZSBvcGVyYXRpb25zIGJhc2VkIG9uIHJlZ3VsYXIKLWV4cHJlc3Npb25zOiBtYXRjaCBhbmQgc2VhcmNoLiAgSWYgeW91IGFyZSBhY2N1c3RvbWVkIHRvIFBlcmwncwotc2VtYW50aWNzLCB0aGUgc2VhcmNoIG9wZXJhdGlvbiBpcyB3aGF0IHlvdSdyZSBsb29raW5nIGZvci4gIFNlZSB0aGUKLVxmdW5jdGlvbntzZWFyY2goKX0gZnVuY3Rpb24gYW5kIGNvcnJlc3BvbmRpbmcgbWV0aG9kIG9mIGNvbXBpbGVkCi1yZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0cy4KLQotTm90ZSB0aGF0IG1hdGNoIG1heSBkaWZmZXIgZnJvbSBzZWFyY2ggdXNpbmcgYSByZWd1bGFyIGV4cHJlc3Npb24KLWJlZ2lubmluZyB3aXRoIFxjaGFyYWN0ZXJ7XHRleHRhc2NpaWNpcmN1bX06Ci1cY2hhcmFjdGVye1x0ZXh0YXNjaWljaXJjdW19IG1hdGNoZXMgb25seSBhdCB0aGUKLXN0YXJ0IG9mIHRoZSBzdHJpbmcsIG9yIGluIFxjb25zdGFudHtNVUxUSUxJTkV9IG1vZGUgYWxzbyBpbW1lZGlhdGVseQotZm9sbG93aW5nIGEgbmV3bGluZS4gIFRoZSBgYG1hdGNoJycgb3BlcmF0aW9uIHN1Y2NlZWRzIG9ubHkgaWYgdGhlCi1wYXR0ZXJuIG1hdGNoZXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzdHJpbmcgcmVnYXJkbGVzcyBvZiBtb2RlLCBvciBhdAotdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGdpdmVuIGJ5IHRoZSBvcHRpb25hbCBcdmFye3Bvc30gYXJndW1lbnQKLXJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhIG5ld2xpbmUgcHJlY2VkZXMgaXQuCi0KLSUgRXhhbXBsZXMgZnJvbSBUaW0gUGV0ZXJzOgotXGJlZ2lue3ZlcmJhdGltfQotcmUuY29tcGlsZSgiYSIpLm1hdGNoKCJiYSIsIDEpICAgICAgICAgICAjIHN1Y2NlZWRzCi1yZS5jb21waWxlKCJeYSIpLnNlYXJjaCgiYmEiLCAxKSAgICAgICAgICMgZmFpbHM7ICdhJyBub3QgYXQgc3RhcnQKLXJlLmNvbXBpbGUoIl5hIikuc2VhcmNoKCJcbmEiLCAxKSAgICAgICAgIyBmYWlsczsgJ2EnIG5vdCBhdCBzdGFydAotcmUuY29tcGlsZSgiXmEiLCByZS5NKS5zZWFyY2goIlxuYSIsIDEpICAjIHN1Y2NlZWRzCi1yZS5jb21waWxlKCJeYSIsIHJlLk0pLnNlYXJjaCgiYmEiLCAxKSAgICMgZmFpbHM7IG5vIHByZWNlZGluZyBcbgotXGVuZHt2ZXJiYXRpbX0KLQotCi1cc3Vic2VjdGlvbntNb2R1bGUgQ29udGVudHN9Ci1cbm9kZW5hbWV7Q29udGVudHMgb2YgTW9kdWxlIHJlfQotCi1UaGUgbW9kdWxlIGRlZmluZXMgc2V2ZXJhbCBmdW5jdGlvbnMsIGNvbnN0YW50cywgYW5kIGFuIGV4Y2VwdGlvbi4gU29tZSBvZiB0aGUKLWZ1bmN0aW9ucyBhcmUgc2ltcGxpZmllZCB2ZXJzaW9ucyBvZiB0aGUgZnVsbCBmZWF0dXJlZCBtZXRob2RzIGZvciBjb21waWxlZAotcmVndWxhciBleHByZXNzaW9ucy4gIE1vc3Qgbm9uLXRyaXZpYWwgYXBwbGljYXRpb25zIGFsd2F5cyB1c2UgdGhlIGNvbXBpbGVkCi1mb3JtLgotCi1cYmVnaW57ZnVuY2Rlc2N9e2NvbXBpbGV9e3BhdHRlcm5cb3B0aW9uYWx7LCBmbGFnc319Ci0gIENvbXBpbGUgYSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiBpbnRvIGEgcmVndWxhciBleHByZXNzaW9uCi0gIG9iamVjdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIG1hdGNoaW5nIHVzaW5nIGl0cyBcZnVuY3Rpb257bWF0Y2goKX0gYW5kCi0gIFxmdW5jdGlvbntzZWFyY2goKX0gbWV0aG9kcywgZGVzY3JpYmVkIGJlbG93LgotCi0gIFRoZSBleHByZXNzaW9uJ3MgYmVoYXZpb3VyIGNhbiBiZSBtb2RpZmllZCBieSBzcGVjaWZ5aW5nIGEKLSAgXHZhcntmbGFnc30gdmFsdWUuICBWYWx1ZXMgY2FuIGJlIGFueSBvZiB0aGUgZm9sbG93aW5nIHZhcmlhYmxlcywKLSAgY29tYmluZWQgdXNpbmcgYml0d2lzZSBPUiAodGhlIFxjb2Rle3x9IG9wZXJhdG9yKS4KLQotVGhlIHNlcXVlbmNlCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLXByb2cgPSByZS5jb21waWxlKHBhdCkKLXJlc3VsdCA9IHByb2cubWF0Y2goc3RyKQotXGVuZHt2ZXJiYXRpbX0KLQotaXMgZXF1aXZhbGVudCB0bwotCi1cYmVnaW57dmVyYmF0aW19Ci1yZXN1bHQgPSByZS5tYXRjaChwYXQsIHN0cikKLVxlbmR7dmVyYmF0aW19Ci0KLWJ1dCB0aGUgdmVyc2lvbiB1c2luZyBcZnVuY3Rpb257Y29tcGlsZSgpfSBpcyBtb3JlIGVmZmljaWVudCB3aGVuIHRoZQotZXhwcmVzc2lvbiB3aWxsIGJlIHVzZWQgc2V2ZXJhbCB0aW1lcyBpbiBhIHNpbmdsZSBwcm9ncmFtLgotJShUaGUgY29tcGlsZWQgdmVyc2lvbiBvZiB0aGUgbGFzdCBwYXR0ZXJuIHBhc3NlZCB0bwotJVxmdW5jdGlvbntyZS5tYXRjaCgpfSBvciBcZnVuY3Rpb257cmUuc2VhcmNoKCl9IGlzIGNhY2hlZCwgc28KLSVwcm9ncmFtcyB0aGF0IHVzZSBvbmx5IGEgc2luZ2xlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhdCBhIHRpbWUgbmVlZG4ndAotJXdvcnJ5IGFib3V0IGNvbXBpbGluZyByZWd1bGFyIGV4cHJlc3Npb25zLikKLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317SX0KLVxkYXRhbGluZXtJR05PUkVDQVNFfQotUGVyZm9ybSBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nOyBleHByZXNzaW9ucyBsaWtlIFxyZWdleHB7W0EtWl19Ci13aWxsIG1hdGNoIGxvd2VyY2FzZSBsZXR0ZXJzLCB0b28uICBUaGlzIGlzIG5vdCBhZmZlY3RlZCBieSB0aGUKLWN1cnJlbnQgbG9jYWxlLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtMfQotXGRhdGFsaW5le0xPQ0FMRX0KLU1ha2UgXHJlZ2V4cHtcZSB3fSwgXHJlZ2V4cHtcZSBXfSwgXHJlZ2V4cHtcZSBifSwgXHJlZ2V4cHtcZSBCfSwKLVxyZWdleHB7XGUgc30gYW5kIFxyZWdleHB7XGUgU30gZGVwZW5kZW50IG9uIHRoZSBjdXJyZW50IGxvY2FsZS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317TX0KLVxkYXRhbGluZXtNVUxUSUxJTkV9Ci1XaGVuIHNwZWNpZmllZCwgdGhlIHBhdHRlcm4gY2hhcmFjdGVyIFxjaGFyYWN0ZXJ7XHRleHRhc2NpaWNpcmN1bX0KLW1hdGNoZXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nIGFuZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2gKLWxpbmUgKGltbWVkaWF0ZWx5IGZvbGxvd2luZyBlYWNoIG5ld2xpbmUpOyBhbmQgdGhlIHBhdHRlcm4gY2hhcmFjdGVyCi1cY2hhcmFjdGVye1wkfSBtYXRjaGVzIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZyBhbmQgYXQgdGhlIGVuZCBvZiBlYWNoCi1saW5lIChpbW1lZGlhdGVseSBwcmVjZWRpbmcgZWFjaCBuZXdsaW5lKS4gIEJ5IGRlZmF1bHQsCi1cY2hhcmFjdGVye1x0ZXh0YXNjaWljaXJjdW19IG1hdGNoZXMgb25seSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotc3RyaW5nLCBhbmQgXGNoYXJhY3RlcntcJH0gb25seSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgYW5kCi1pbW1lZGlhdGVseSBiZWZvcmUgdGhlIG5ld2xpbmUgKGlmIGFueSkgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtTfQotXGRhdGFsaW5le0RPVEFMTH0KLU1ha2UgdGhlIFxjaGFyYWN0ZXJ7Ln0gc3BlY2lhbCBjaGFyYWN0ZXIgbWF0Y2ggYW55IGNoYXJhY3RlciBhdCBhbGwsCi1pbmNsdWRpbmcgYSBuZXdsaW5lOyB3aXRob3V0IHRoaXMgZmxhZywgXGNoYXJhY3RlcnsufSB3aWxsIG1hdGNoCi1hbnl0aGluZyBcZW1waHtleGNlcHR9IGEgbmV3bGluZS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317VX0KLVxkYXRhbGluZXtVTklDT0RFfQotTWFrZSBccmVnZXhwe1xlIHd9LCBccmVnZXhwe1xlIFd9LCBccmVnZXhwe1xlIGJ9LCBccmVnZXhwe1xlIEJ9LAotXHJlZ2V4cHtcZSBkfSwgXHJlZ2V4cHtcZSBEfSwgXHJlZ2V4cHtcZSBzfSBhbmQgXHJlZ2V4cHtcZSBTfQotZGVwZW5kZW50IG9uIHRoZSBVbmljb2RlIGNoYXJhY3RlciBwcm9wZXJ0aWVzIGRhdGFiYXNlLgotXHZlcnNpb25hZGRlZHsyLjB9Ci1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1h9Ci1cZGF0YWxpbmV7VkVSQk9TRX0KLVRoaXMgZmxhZyBhbGxvd3MgeW91IHRvIHdyaXRlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdGhhdCBsb29rIG5pY2VyLgotV2hpdGVzcGFjZSB3aXRoaW4gdGhlIHBhdHRlcm4gaXMgaWdub3JlZCwKLWV4Y2VwdCB3aGVuIGluIGEgY2hhcmFjdGVyIGNsYXNzIG9yIHByZWNlZGVkIGJ5IGFuIHVuZXNjYXBlZAotYmFja3NsYXNoLCBhbmQsIHdoZW4gYSBsaW5lIGNvbnRhaW5zIGEgXGNoYXJhY3RlcntcI30gbmVpdGhlciBpbiBhCi1jaGFyYWN0ZXIgY2xhc3Mgb3IgcHJlY2VkZWQgYnkgYW4gdW5lc2NhcGVkIGJhY2tzbGFzaCwgYWxsIGNoYXJhY3RlcnMKLWZyb20gdGhlIGxlZnRtb3N0IHN1Y2ggXGNoYXJhY3RlcntcI30gdGhyb3VnaCB0aGUgZW5kIG9mIHRoZSBsaW5lIGFyZQotaWdub3JlZC4KLSUgWFhYIHNob3VsZCBhZGQgYW4gZXhhbXBsZSBoZXJlCi1cZW5ke2RhdGFkZXNjfQotCi0KLVxiZWdpbntmdW5jZGVzY317c2VhcmNofXtwYXR0ZXJuLCBzdHJpbmdcb3B0aW9uYWx7LCBmbGFnc319Ci0gIFNjYW4gdGhyb3VnaCBcdmFye3N0cmluZ30gbG9va2luZyBmb3IgYSBsb2NhdGlvbiB3aGVyZSB0aGUgcmVndWxhcgotICBleHByZXNzaW9uIFx2YXJ7cGF0dGVybn0gcHJvZHVjZXMgYSBtYXRjaCwgYW5kIHJldHVybiBhCi0gIGNvcnJlc3BvbmRpbmcgXGNsYXNze01hdGNoT2JqZWN0fSBpbnN0YW5jZS4KLSAgUmV0dXJuIFxjb2Rle05vbmV9IGlmIG5vCi0gIHBvc2l0aW9uIGluIHRoZSBzdHJpbmcgbWF0Y2hlcyB0aGUgcGF0dGVybjsgbm90ZSB0aGF0IHRoaXMgaXMKLSAgZGlmZmVyZW50IGZyb20gZmluZGluZyBhIHplcm8tbGVuZ3RoIG1hdGNoIGF0IHNvbWUgcG9pbnQgaW4gdGhlIHN0cmluZy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bWF0Y2h9e3BhdHRlcm4sIHN0cmluZ1xvcHRpb25hbHssIGZsYWdzfX0KLSAgSWYgemVybyBvciBtb3JlIGNoYXJhY3RlcnMgYXQgdGhlIGJlZ2lubmluZyBvZiBcdmFye3N0cmluZ30gbWF0Y2gKLSAgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBcdmFye3BhdHRlcm59LCByZXR1cm4gYSBjb3JyZXNwb25kaW5nCi0gIFxjbGFzc3tNYXRjaE9iamVjdH0gaW5zdGFuY2UuICBSZXR1cm4gXGNvZGV7Tm9uZX0gaWYgdGhlIHN0cmluZyBkb2VzIG5vdAotICBtYXRjaCB0aGUgcGF0dGVybjsgbm90ZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50IGZyb20gYSB6ZXJvLWxlbmd0aAotICBtYXRjaC4KLQotICBcbm90ZXtJZiB5b3Ugd2FudCB0byBsb2NhdGUgYSBtYXRjaCBhbnl3aGVyZSBpbgotICBcdmFye3N0cmluZ30sIHVzZSBcbWV0aG9ke3NlYXJjaCgpfSBpbnN0ZWFkLn0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c3BsaXR9e3BhdHRlcm4sIHN0cmluZ1xvcHRpb25hbHssIG1heHNwbGl0XGNvZGV7ID0gMH19fQotICBTcGxpdCBcdmFye3N0cmluZ30gYnkgdGhlIG9jY3VycmVuY2VzIG9mIFx2YXJ7cGF0dGVybn0uICBJZgotICBjYXB0dXJpbmcgcGFyZW50aGVzZXMgYXJlIHVzZWQgaW4gXHZhcntwYXR0ZXJufSwgdGhlbiB0aGUgdGV4dCBvZiBhbGwKLSAgZ3JvdXBzIGluIHRoZSBwYXR0ZXJuIGFyZSBhbHNvIHJldHVybmVkIGFzIHBhcnQgb2YgdGhlIHJlc3VsdGluZyBsaXN0LgotICBJZiBcdmFye21heHNwbGl0fSBpcyBub256ZXJvLCBhdCBtb3N0IFx2YXJ7bWF4c3BsaXR9IHNwbGl0cwotICBvY2N1ciwgYW5kIHRoZSByZW1haW5kZXIgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZCBhcyB0aGUgZmluYWwKLSAgZWxlbWVudCBvZiB0aGUgbGlzdC4gIChJbmNvbXBhdGliaWxpdHkgbm90ZTogaW4gdGhlIG9yaWdpbmFsIFB5dGhvbgotICAxLjUgcmVsZWFzZSwgXHZhcnttYXhzcGxpdH0gd2FzIGlnbm9yZWQuICBUaGlzIGhhcyBiZWVuIGZpeGVkIGluCi0gIGxhdGVyIHJlbGVhc2VzLikKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHJlLnNwbGl0KCdcVysnLCAnV29yZHMsIHdvcmRzLCB3b3Jkcy4nKQotWydXb3JkcycsICd3b3JkcycsICd3b3JkcycsICcnXQotPj4+IHJlLnNwbGl0KCcoXFcrKScsICdXb3Jkcywgd29yZHMsIHdvcmRzLicpCi1bJ1dvcmRzJywgJywgJywgJ3dvcmRzJywgJywgJywgJ3dvcmRzJywgJy4nLCAnJ10KLT4+PiByZS5zcGxpdCgnXFcrJywgJ1dvcmRzLCB3b3Jkcywgd29yZHMuJywgMSkKLVsnV29yZHMnLCAnd29yZHMsIHdvcmRzLiddCi1cZW5ke3ZlcmJhdGltfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtmaW5kYWxsfXtwYXR0ZXJuLCBzdHJpbmdcb3B0aW9uYWx7LCBmbGFnc319Ci0gIFJldHVybiBhIGxpc3Qgb2YgYWxsIG5vbi1vdmVybGFwcGluZyBtYXRjaGVzIG9mIFx2YXJ7cGF0dGVybn0gaW4KLSAgXHZhcntzdHJpbmd9LiAgSWYgb25lIG9yIG1vcmUgZ3JvdXBzIGFyZSBwcmVzZW50IGluIHRoZSBwYXR0ZXJuLAotICByZXR1cm4gYSBsaXN0IG9mIGdyb3VwczsgdGhpcyB3aWxsIGJlIGEgbGlzdCBvZiB0dXBsZXMgaWYgdGhlCi0gIHBhdHRlcm4gaGFzIG1vcmUgdGhhbiBvbmUgZ3JvdXAuICBFbXB0eSBtYXRjaGVzIGFyZSBpbmNsdWRlZCBpbiB0aGUKLSAgcmVzdWx0IHVubGVzcyB0aGV5IHRvdWNoIHRoZSBiZWdpbm5pbmcgb2YgYW5vdGhlciBtYXRjaC4KLSAgXHZlcnNpb25hZGRlZHsxLjUuMn0KLSAgXHZlcnNpb25jaGFuZ2VkW0FkZGVkIHRoZSBvcHRpb25hbCBmbGFncyBhcmd1bWVudF17Mi40fQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtmaW5kaXRlcn17cGF0dGVybiwgc3RyaW5nXG9wdGlvbmFseywgZmxhZ3N9fQotICBSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciBhbGwgbm9uLW92ZXJsYXBwaW5nIG1hdGNoZXMgZm9yIHRoZSBSRQotICBcdmFye3BhdHRlcm59IGluIFx2YXJ7c3RyaW5nfS4gIEZvciBlYWNoIG1hdGNoLCB0aGUgaXRlcmF0b3IgcmV0dXJucwotICBhIG1hdGNoIG9iamVjdC4gIEVtcHR5IG1hdGNoZXMgYXJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHQgdW5sZXNzIHRoZXkKLSAgdG91Y2ggdGhlIGJlZ2lubmluZyBvZiBhbm90aGVyIG1hdGNoLgotICBcdmVyc2lvbmFkZGVkezIuMn0KLSAgXHZlcnNpb25jaGFuZ2VkW0FkZGVkIHRoZSBvcHRpb25hbCBmbGFncyBhcmd1bWVudF17Mi40fQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzdWJ9e3BhdHRlcm4sIHJlcGwsIHN0cmluZ1xvcHRpb25hbHssIGNvdW50fX0KLSAgUmV0dXJuIHRoZSBzdHJpbmcgb2J0YWluZWQgYnkgcmVwbGFjaW5nIHRoZSBsZWZ0bW9zdCBub24tb3ZlcmxhcHBpbmcKLSAgb2NjdXJyZW5jZXMgb2YgXHZhcntwYXR0ZXJufSBpbiBcdmFye3N0cmluZ30gYnkgdGhlIHJlcGxhY2VtZW50Ci0gIFx2YXJ7cmVwbH0uICBJZiB0aGUgcGF0dGVybiBpc24ndCBmb3VuZCwgXHZhcntzdHJpbmd9IGlzIHJldHVybmVkCi0gIHVuY2hhbmdlZC4gIFx2YXJ7cmVwbH0gY2FuIGJlIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb247IGlmIGl0IGlzIGEKLSAgc3RyaW5nLCBhbnkgYmFja3NsYXNoIGVzY2FwZXMgaW4gaXQgYXJlIHByb2Nlc3NlZC4gIFRoYXQgaXMsCi0gIFxzYW1we1xlIG59IGlzIGNvbnZlcnRlZCB0byBhIHNpbmdsZSBuZXdsaW5lIGNoYXJhY3RlciwgXHNhbXB7XGUgcn0KLSAgaXMgY29udmVydGVkIHRvIGEgbGluZWZlZWQsIGFuZCBzbyBmb3J0aC4gIFVua25vd24gZXNjYXBlcyBzdWNoIGFzCi0gIFxzYW1we1xlIGp9IGFyZSBsZWZ0IGFsb25lLiAgQmFja3JlZmVyZW5jZXMsIHN1Y2ggYXMgXHNhbXB7XGU2fSwgYXJlCi0gIHJlcGxhY2VkIHdpdGggdGhlIHN1YnN0cmluZyBtYXRjaGVkIGJ5IGdyb3VwIDYgaW4gdGhlIHBhdHRlcm4uICBGb3IKLSAgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHJlLnN1YihyJ2RlZlxzKyhbYS16QS1aX11bYS16QS1aXzAtOV0qKVxzKlwoXHMqXCk6JywKLS4uLiAgICAgICAgcidzdGF0aWMgUHlPYmplY3QqXG5weV9cMSh2b2lkKVxueycsCi0uLi4gICAgICAgICdkZWYgbXlmdW5jKCk6JykKLSdzdGF0aWMgUHlPYmplY3QqXG5weV9teWZ1bmModm9pZClcbnsnCi1cZW5ke3ZlcmJhdGltfQotCi0gIElmIFx2YXJ7cmVwbH0gaXMgYSBmdW5jdGlvbiwgaXQgaXMgY2FsbGVkIGZvciBldmVyeSBub24tb3ZlcmxhcHBpbmcKLSAgb2NjdXJyZW5jZSBvZiBcdmFye3BhdHRlcm59LiAgVGhlIGZ1bmN0aW9uIHRha2VzIGEgc2luZ2xlIG1hdGNoCi0gIG9iamVjdCBhcmd1bWVudCwgYW5kIHJldHVybnMgdGhlIHJlcGxhY2VtZW50IHN0cmluZy4gIEZvciBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZGVmIGRhc2hyZXBsKG1hdGNob2JqKToKLS4uLiAgICAgaWYgbWF0Y2hvYmouZ3JvdXAoMCkgPT0gJy0nOiByZXR1cm4gJyAnCi0uLi4gICAgIGVsc2U6IHJldHVybiAnLScKLT4+PiByZS5zdWIoJy17MSwyfScsIGRhc2hyZXBsLCAncHJvLS0tLWdyYW0tZmlsZXMnKQotJ3Byby0tZ3JhbSBmaWxlcycKLVxlbmR7dmVyYmF0aW19Ci0KLSAgVGhlIHBhdHRlcm4gbWF5IGJlIGEgc3RyaW5nIG9yIGFuIFJFIG9iamVjdDsgaWYgeW91IG5lZWQgdG8gc3BlY2lmeQotICByZWd1bGFyIGV4cHJlc3Npb24gZmxhZ3MsIHlvdSBtdXN0IHVzZSBhIFJFIG9iamVjdCwgb3IgdXNlIGVtYmVkZGVkCi0gIG1vZGlmaWVycyBpbiBhIHBhdHRlcm47IGZvciBleGFtcGxlLCBcc2FtcHtzdWIoIig/aSliKyIsICJ4IiwgImJiYmIKLSAgQkJCQiIpfSByZXR1cm5zIFxjb2Rleyd4IHgnfS4KLQotICBUaGUgb3B0aW9uYWwgYXJndW1lbnQgXHZhcntjb3VudH0gaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHBhdHRlcm4KLSAgb2NjdXJyZW5jZXMgdG8gYmUgcmVwbGFjZWQ7IFx2YXJ7Y291bnR9IG11c3QgYmUgYSBub24tbmVnYXRpdmUKLSAgaW50ZWdlci4gIElmIG9taXR0ZWQgb3IgemVybywgYWxsIG9jY3VycmVuY2VzIHdpbGwgYmUgcmVwbGFjZWQuCi0gIEVtcHR5IG1hdGNoZXMgZm9yIHRoZSBwYXR0ZXJuIGFyZSByZXBsYWNlZCBvbmx5IHdoZW4gbm90IGFkamFjZW50IHRvCi0gIGEgcHJldmlvdXMgbWF0Y2gsIHNvIFxzYW1we3N1YigneConLCAnLScsICdhYmMnKX0gcmV0dXJucwotICBcY29kZXsnLWEtYi1jLSd9LgotCi0gIEluIGFkZGl0aW9uIHRvIGNoYXJhY3RlciBlc2NhcGVzIGFuZCBiYWNrcmVmZXJlbmNlcyBhcyBkZXNjcmliZWQKLSAgYWJvdmUsIFxzYW1we1xlIGc8bmFtZT59IHdpbGwgdXNlIHRoZSBzdWJzdHJpbmcgbWF0Y2hlZCBieSB0aGUgZ3JvdXAKLSAgbmFtZWQgXHNhbXB7bmFtZX0sIGFzIGRlZmluZWQgYnkgdGhlIFxyZWdleHB7KD9QPG5hbWU+Li4uKX0gc3ludGF4LgotICBcc2FtcHtcZSBnPG51bWJlcj59IHVzZXMgdGhlIGNvcnJlc3BvbmRpbmcgZ3JvdXAgbnVtYmVyOwotICBcc2FtcHtcZSBnPDI+fSBpcyB0aGVyZWZvcmUgZXF1aXZhbGVudCB0byBcc2FtcHtcZSAyfSwgYnV0IGlzbid0Ci0gIGFtYmlndW91cyBpbiBhIHJlcGxhY2VtZW50IHN1Y2ggYXMgXHNhbXB7XGUgZzwyPjB9LiAgXHNhbXB7XGUgMjB9Ci0gIHdvdWxkIGJlIGludGVycHJldGVkIGFzIGEgcmVmZXJlbmNlIHRvIGdyb3VwIDIwLCBub3QgYSByZWZlcmVuY2UgdG8KLSAgZ3JvdXAgMiBmb2xsb3dlZCBieSB0aGUgbGl0ZXJhbCBjaGFyYWN0ZXIgXGNoYXJhY3RlcnswfS4gIFRoZQotICBiYWNrcmVmZXJlbmNlIFxzYW1we1xlIGc8MD59IHN1YnN0aXR1dGVzIGluIHRoZSBlbnRpcmUgc3Vic3RyaW5nCi0gIG1hdGNoZWQgYnkgdGhlIFJFLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzdWJufXtwYXR0ZXJuLCByZXBsLCBzdHJpbmdcb3B0aW9uYWx7LCBjb3VudH19Ci0gIFBlcmZvcm0gdGhlIHNhbWUgb3BlcmF0aW9uIGFzIFxmdW5jdGlvbntzdWIoKX0sIGJ1dCByZXR1cm4gYSB0dXBsZQotICBcY29kZXsoXHZhcntuZXdfc3RyaW5nfSwgXHZhcntudW1iZXJfb2Zfc3Vic19tYWRlfSl9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtlc2NhcGV9e3N0cmluZ30KLSAgUmV0dXJuIFx2YXJ7c3RyaW5nfSB3aXRoIGFsbCBub24tYWxwaGFudW1lcmljcyBiYWNrc2xhc2hlZDsgdGhpcyBpcwotICB1c2VmdWwgaWYgeW91IHdhbnQgdG8gbWF0Y2ggYW4gYXJiaXRyYXJ5IGxpdGVyYWwgc3RyaW5nIHRoYXQgbWF5IGhhdmUKLSAgcmVndWxhciBleHByZXNzaW9uIG1ldGFjaGFyYWN0ZXJzIGluIGl0LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e2Vycm9yfQotICBFeGNlcHRpb24gcmFpc2VkIHdoZW4gYSBzdHJpbmcgcGFzc2VkIHRvIG9uZSBvZiB0aGUgZnVuY3Rpb25zIGhlcmUKLSAgaXMgbm90IGEgdmFsaWQgcmVndWxhciBleHByZXNzaW9uIChmb3IgZXhhbXBsZSwgaXQgbWlnaHQgY29udGFpbgotICB1bm1hdGNoZWQgcGFyZW50aGVzZXMpIG9yIHdoZW4gc29tZSBvdGhlciBlcnJvciBvY2N1cnMgZHVyaW5nCi0gIGNvbXBpbGF0aW9uIG9yIG1hdGNoaW5nLiAgSXQgaXMgbmV2ZXIgYW4gZXJyb3IgaWYgYSBzdHJpbmcgY29udGFpbnMKLSAgbm8gbWF0Y2ggZm9yIGEgcGF0dGVybi4KLVxlbmR7ZXhjZGVzY30KLQotCi1cc3Vic2VjdGlvbntSZWd1bGFyIEV4cHJlc3Npb24gT2JqZWN0cyBcbGFiZWx7cmUtb2JqZWN0c319Ci0KLUNvbXBpbGVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3RzIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBtZXRob2RzIGFuZAotYXR0cmlidXRlczoKLQotXGJlZ2lue21ldGhvZGRlc2N9W1JlZ2V4T2JqZWN0XXttYXRjaH17c3RyaW5nXG9wdGlvbmFseywgcG9zXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvc319fQotICBJZiB6ZXJvIG9yIG1vcmUgY2hhcmFjdGVycyBhdCB0aGUgYmVnaW5uaW5nIG9mIFx2YXJ7c3RyaW5nfSBtYXRjaAotICB0aGlzIHJlZ3VsYXIgZXhwcmVzc2lvbiwgcmV0dXJuIGEgY29ycmVzcG9uZGluZwotICBcY2xhc3N7TWF0Y2hPYmplY3R9IGluc3RhbmNlLiAgUmV0dXJuIFxjb2Rle05vbmV9IGlmIHRoZSBzdHJpbmcgZG9lcyBub3QKLSAgbWF0Y2ggdGhlIHBhdHRlcm47IG5vdGUgdGhhdCB0aGlzIGlzIGRpZmZlcmVudCBmcm9tIGEgemVyby1sZW5ndGgKLSAgbWF0Y2guCi0KLSAgXG5vdGV7SWYgeW91IHdhbnQgdG8gbG9jYXRlIGEgbWF0Y2ggYW55d2hlcmUgaW4KLSAgXHZhcntzdHJpbmd9LCB1c2UgXG1ldGhvZHtzZWFyY2goKX0gaW5zdGVhZC59Ci0KLSAgVGhlIG9wdGlvbmFsIHNlY29uZCBwYXJhbWV0ZXIgXHZhcntwb3N9IGdpdmVzIGFuIGluZGV4IGluIHRoZSBzdHJpbmcKLSAgd2hlcmUgdGhlIHNlYXJjaCBpcyB0byBzdGFydDsgaXQgZGVmYXVsdHMgdG8gXGNvZGV7MH0uICBUaGlzIGlzIG5vdAotICBjb21wbGV0ZWx5IGVxdWl2YWxlbnQgdG8gc2xpY2luZyB0aGUgc3RyaW5nOyB0aGUKLSAgXGNvZGV7J1x0ZXh0YXNjaWljaXJjdW0nfSBwYXR0ZXJuCi0gIGNoYXJhY3RlciBtYXRjaGVzIGF0IHRoZSByZWFsIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nIGFuZCBhdCBwb3NpdGlvbnMKLSAganVzdCBhZnRlciBhIG5ld2xpbmUsIGJ1dCBub3QgbmVjZXNzYXJpbHkgYXQgdGhlIGluZGV4IHdoZXJlIHRoZSBzZWFyY2gKLSAgaXMgdG8gc3RhcnQuCi0KLSAgVGhlIG9wdGlvbmFsIHBhcmFtZXRlciBcdmFye2VuZHBvc30gbGltaXRzIGhvdyBmYXIgdGhlIHN0cmluZyB3aWxsCi0gIGJlIHNlYXJjaGVkOyBpdCB3aWxsIGJlIGFzIGlmIHRoZSBzdHJpbmcgaXMgXHZhcntlbmRwb3N9IGNoYXJhY3RlcnMKLSAgbG9uZywgc28gb25seSB0aGUgY2hhcmFjdGVycyBmcm9tIFx2YXJ7cG9zfSB0byBcY29kZXtcdmFye2VuZHBvc30gLQotICAxfSB3aWxsIGJlIHNlYXJjaGVkIGZvciBhIG1hdGNoLiAgSWYgXHZhcntlbmRwb3N9IGlzIGxlc3MgdGhhbgotICBcdmFye3Bvc30sIG5vIG1hdGNoIHdpbGwgYmUgZm91bmQsIG90aGVyd2lzZSwgaWYgXHZhcntyeH0gaXMgYQotICBjb21waWxlZCByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0LAotICBcY29kZXtcdmFye3J4fS5tYXRjaChcdmFye3N0cmluZ30sIDAsIDUwKX0gaXMgZXF1aXZhbGVudCB0bwotICBcY29kZXtcdmFye3J4fS5tYXRjaChcdmFye3N0cmluZ31bOjUwXSwgMCl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUmVnZXhPYmplY3Rde3NlYXJjaH17c3RyaW5nXG9wdGlvbmFseywgcG9zXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb3N9fX0KLSAgU2NhbiB0aHJvdWdoIFx2YXJ7c3RyaW5nfSBsb29raW5nIGZvciBhIGxvY2F0aW9uIHdoZXJlIHRoaXMgcmVndWxhcgotICBleHByZXNzaW9uIHByb2R1Y2VzIGEgbWF0Y2gsIGFuZCByZXR1cm4gYQotICBjb3JyZXNwb25kaW5nIFxjbGFzc3tNYXRjaE9iamVjdH0gaW5zdGFuY2UuICBSZXR1cm4gXGNvZGV7Tm9uZX0gaWYgbm8KLSAgcG9zaXRpb24gaW4gdGhlIHN0cmluZyBtYXRjaGVzIHRoZSBwYXR0ZXJuOyBub3RlIHRoYXQgdGhpcyBpcwotICBkaWZmZXJlbnQgZnJvbSBmaW5kaW5nIGEgemVyby1sZW5ndGggbWF0Y2ggYXQgc29tZSBwb2ludCBpbiB0aGUgc3RyaW5nLgotCi0gIFRoZSBvcHRpb25hbCBcdmFye3Bvc30gYW5kIFx2YXJ7ZW5kcG9zfSBwYXJhbWV0ZXJzIGhhdmUgdGhlIHNhbWUKLSAgbWVhbmluZyBhcyBmb3IgdGhlIFxtZXRob2R7bWF0Y2goKX0gbWV0aG9kLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUmVnZXhPYmplY3Rde3NwbGl0fXtzdHJpbmdcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4c3BsaXRcY29kZXsgPSAwfX19Ci1JZGVudGljYWwgdG8gdGhlIFxmdW5jdGlvbntzcGxpdCgpfSBmdW5jdGlvbiwgdXNpbmcgdGhlIGNvbXBpbGVkIHBhdHRlcm4uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtSZWdleE9iamVjdF17ZmluZGFsbH17c3RyaW5nXG9wdGlvbmFseywgcG9zXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb3N9fX0KLUlkZW50aWNhbCB0byB0aGUgXGZ1bmN0aW9ue2ZpbmRhbGwoKX0gZnVuY3Rpb24sIHVzaW5nIHRoZSBjb21waWxlZCBwYXR0ZXJuLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUmVnZXhPYmplY3Rde2ZpbmRpdGVyfXtzdHJpbmdcb3B0aW9uYWx7LCBwb3Ncb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvc319fQotSWRlbnRpY2FsIHRvIHRoZSBcZnVuY3Rpb257ZmluZGl0ZXIoKX0gZnVuY3Rpb24sIHVzaW5nIHRoZSBjb21waWxlZCBwYXR0ZXJuLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUmVnZXhPYmplY3Rde3N1Yn17cmVwbCwgc3RyaW5nXG9wdGlvbmFseywgY291bnRcY29kZXsgPSAwfX19Ci1JZGVudGljYWwgdG8gdGhlIFxmdW5jdGlvbntzdWIoKX0gZnVuY3Rpb24sIHVzaW5nIHRoZSBjb21waWxlZCBwYXR0ZXJuLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUmVnZXhPYmplY3Rde3N1Ym59e3JlcGwsIHN0cmluZ1xvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50XGNvZGV7ID0gMH19fQotSWRlbnRpY2FsIHRvIHRoZSBcZnVuY3Rpb257c3VibigpfSBmdW5jdGlvbiwgdXNpbmcgdGhlIGNvbXBpbGVkIHBhdHRlcm4uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLQotXGJlZ2lue21lbWJlcmRlc2N9W1JlZ2V4T2JqZWN0XXtmbGFnc30KLVRoZSBmbGFncyBhcmd1bWVudCB1c2VkIHdoZW4gdGhlIFJFIG9iamVjdCB3YXMgY29tcGlsZWQsIG9yCi1cY29kZXswfSBpZiBubyBmbGFncyB3ZXJlIHByb3ZpZGVkLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bUmVnZXhPYmplY3Rde2dyb3VwaW5kZXh9Ci1BIGRpY3Rpb25hcnkgbWFwcGluZyBhbnkgc3ltYm9saWMgZ3JvdXAgbmFtZXMgZGVmaW5lZCBieQotXHJlZ2V4cHsoP1A8XHZhcntpZH0+KX0gdG8gZ3JvdXAgbnVtYmVycy4gIFRoZSBkaWN0aW9uYXJ5IGlzIGVtcHR5IGlmIG5vCi1zeW1ib2xpYyBncm91cHMgd2VyZSB1c2VkIGluIHRoZSBwYXR0ZXJuLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bUmVnZXhPYmplY3Rde3BhdHRlcm59Ci1UaGUgcGF0dGVybiBzdHJpbmcgZnJvbSB3aGljaCB0aGUgUkUgb2JqZWN0IHdhcyBjb21waWxlZC4KLVxlbmR7bWVtYmVyZGVzY30KLQotCi1cc3Vic2VjdGlvbntNYXRjaCBPYmplY3RzIFxsYWJlbHttYXRjaC1vYmplY3RzfX0KLQotXGNsYXNze01hdGNoT2JqZWN0fSBpbnN0YW5jZXMgc3VwcG9ydCB0aGUgZm9sbG93aW5nIG1ldGhvZHMgYW5kCi1hdHRyaWJ1dGVzOgotCi1cYmVnaW57bWV0aG9kZGVzY31bTWF0Y2hPYmplY3Rde2V4cGFuZH17dGVtcGxhdGV9Ci0gUmV0dXJuIHRoZSBzdHJpbmcgb2J0YWluZWQgYnkgZG9pbmcgYmFja3NsYXNoIHN1YnN0aXR1dGlvbiBvbiB0aGUKLXRlbXBsYXRlIHN0cmluZyBcdmFye3RlbXBsYXRlfSwgYXMgZG9uZSBieSB0aGUgXG1ldGhvZHtzdWIoKX0gbWV0aG9kLgotRXNjYXBlcyBzdWNoIGFzIFxzYW1we1xlIG59IGFyZSBjb252ZXJ0ZWQgdG8gdGhlIGFwcHJvcHJpYXRlCi1jaGFyYWN0ZXJzLCBhbmQgbnVtZXJpYyBiYWNrcmVmZXJlbmNlcyAoXHNhbXB7XGUgMX0sIFxzYW1we1xlIDJ9KSBhbmQKLW5hbWVkIGJhY2tyZWZlcmVuY2VzIChcc2FtcHtcZSBnPDE+fSwgXHNhbXB7XGUgZzxuYW1lPn0pIGFyZSByZXBsYWNlZAotYnkgdGhlIGNvbnRlbnRzIG9mIHRoZSBjb3JyZXNwb25kaW5nIGdyb3VwLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTWF0Y2hPYmplY3Rde2dyb3VwfXtcb3B0aW9uYWx7Z3JvdXAxLCBcbW9yZWFyZ3N9fQotUmV0dXJucyBvbmUgb3IgbW9yZSBzdWJncm91cHMgb2YgdGhlIG1hdGNoLiAgSWYgdGhlcmUgaXMgYSBzaW5nbGUKLWFyZ3VtZW50LCB0aGUgcmVzdWx0IGlzIGEgc2luZ2xlIHN0cmluZzsgaWYgdGhlcmUgYXJlCi1tdWx0aXBsZSBhcmd1bWVudHMsIHRoZSByZXN1bHQgaXMgYSB0dXBsZSB3aXRoIG9uZSBpdGVtIHBlciBhcmd1bWVudC4KLVdpdGhvdXQgYXJndW1lbnRzLCBcdmFye2dyb3VwMX0gZGVmYXVsdHMgdG8gemVybyAodGhlIHdob2xlIG1hdGNoCi1pcyByZXR1cm5lZCkuCi1JZiBhIFx2YXJ7Z3JvdXBOfSBhcmd1bWVudCBpcyB6ZXJvLCB0aGUgY29ycmVzcG9uZGluZyByZXR1cm4gdmFsdWUgaXMgdGhlCi1lbnRpcmUgbWF0Y2hpbmcgc3RyaW5nOyBpZiBpdCBpcyBpbiB0aGUgaW5jbHVzaXZlIHJhbmdlIFsxLi45OV0sIGl0IGlzCi10aGUgc3RyaW5nIG1hdGNoaW5nIHRoZSBjb3JyZXNwb25kaW5nIHBhcmVudGhlc2l6ZWQgZ3JvdXAuICBJZiBhCi1ncm91cCBudW1iZXIgaXMgbmVnYXRpdmUgb3IgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBncm91cHMgZGVmaW5lZAotaW4gdGhlIHBhdHRlcm4sIGFuIFxleGNlcHRpb257SW5kZXhFcnJvcn0gZXhjZXB0aW9uIGlzIHJhaXNlZC4KLUlmIGEgZ3JvdXAgaXMgY29udGFpbmVkIGluIGEgcGFydCBvZiB0aGUgcGF0dGVybiB0aGF0IGRpZCBub3QgbWF0Y2gsCi10aGUgY29ycmVzcG9uZGluZyByZXN1bHQgaXMgXGNvZGV7Tm9uZX0uICBJZiBhIGdyb3VwIGlzIGNvbnRhaW5lZCBpbiBhCi1wYXJ0IG9mIHRoZSBwYXR0ZXJuIHRoYXQgbWF0Y2hlZCBtdWx0aXBsZSB0aW1lcywgdGhlIGxhc3QgbWF0Y2ggaXMKLXJldHVybmVkLgotCi1JZiB0aGUgcmVndWxhciBleHByZXNzaW9uIHVzZXMgdGhlIFxyZWdleHB7KD9QPFx2YXJ7bmFtZX0+Li4uKX0gc3ludGF4LAotdGhlIFx2YXJ7Z3JvdXBOfSBhcmd1bWVudHMgbWF5IGFsc28gYmUgc3RyaW5ncyBpZGVudGlmeWluZyBncm91cHMgYnkKLXRoZWlyIGdyb3VwIG5hbWUuICBJZiBhIHN0cmluZyBhcmd1bWVudCBpcyBub3QgdXNlZCBhcyBhIGdyb3VwIG5hbWUgaW4KLXRoZSBwYXR0ZXJuLCBhbiBcZXhjZXB0aW9ue0luZGV4RXJyb3J9IGV4Y2VwdGlvbiBpcyByYWlzZWQuCi0KLUEgbW9kZXJhdGVseSBjb21wbGljYXRlZCBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1tID0gcmUubWF0Y2gociIoP1A8aW50PlxkKylcLihcZCopIiwgJzMuMTQnKQotXGVuZHt2ZXJiYXRpbX0KLQotQWZ0ZXIgcGVyZm9ybWluZyB0aGlzIG1hdGNoLCBcY29kZXttLmdyb3VwKDEpfSBpcyBcY29kZXsnMyd9LCBhcyBpcwotXGNvZGV7bS5ncm91cCgnaW50Jyl9LCBhbmQgXGNvZGV7bS5ncm91cCgyKX0gaXMgXGNvZGV7JzE0J30uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtNYXRjaE9iamVjdF17Z3JvdXBzfXtcb3B0aW9uYWx7ZGVmYXVsdH19Ci1SZXR1cm4gYSB0dXBsZSBjb250YWluaW5nIGFsbCB0aGUgc3ViZ3JvdXBzIG9mIHRoZSBtYXRjaCwgZnJvbSAxIHVwIHRvCi1ob3dldmVyIG1hbnkgZ3JvdXBzIGFyZSBpbiB0aGUgcGF0dGVybi4gIFRoZSBcdmFye2RlZmF1bHR9IGFyZ3VtZW50IGlzCi11c2VkIGZvciBncm91cHMgdGhhdCBkaWQgbm90IHBhcnRpY2lwYXRlIGluIHRoZSBtYXRjaDsgaXQgZGVmYXVsdHMgdG8KLVxjb2Rle05vbmV9LiAgKEluY29tcGF0aWJpbGl0eSBub3RlOiBpbiB0aGUgb3JpZ2luYWwgUHl0aG9uIDEuNQotcmVsZWFzZSwgaWYgdGhlIHR1cGxlIHdhcyBvbmUgZWxlbWVudCBsb25nLCBhIHN0cmluZyB3b3VsZCBiZSByZXR1cm5lZAotaW5zdGVhZC4gIEluIGxhdGVyIHZlcnNpb25zIChmcm9tIDEuNS4xIG9uKSwgYSBzaW5nbGV0b24gdHVwbGUgaXMKLXJldHVybmVkIGluIHN1Y2ggY2FzZXMuKQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTWF0Y2hPYmplY3Rde2dyb3VwZGljdH17XG9wdGlvbmFse2RlZmF1bHR9fQotUmV0dXJuIGEgZGljdGlvbmFyeSBjb250YWluaW5nIGFsbCB0aGUgXGVtcGh7bmFtZWR9IHN1Ymdyb3VwcyBvZiB0aGUKLW1hdGNoLCBrZXllZCBieSB0aGUgc3ViZ3JvdXAgbmFtZS4gIFRoZSBcdmFye2RlZmF1bHR9IGFyZ3VtZW50IGlzCi11c2VkIGZvciBncm91cHMgdGhhdCBkaWQgbm90IHBhcnRpY2lwYXRlIGluIHRoZSBtYXRjaDsgaXQgZGVmYXVsdHMgdG8KLVxjb2Rle05vbmV9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTWF0Y2hPYmplY3Rde3N0YXJ0fXtcb3B0aW9uYWx7Z3JvdXB9fQotXG1ldGhvZGxpbmVbTWF0Y2hPYmplY3Rde2VuZH17XG9wdGlvbmFse2dyb3VwfX0KLVJldHVybiB0aGUgaW5kaWNlcyBvZiB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgc3Vic3RyaW5nCi1tYXRjaGVkIGJ5IFx2YXJ7Z3JvdXB9OyBcdmFye2dyb3VwfSBkZWZhdWx0cyB0byB6ZXJvIChtZWFuaW5nIHRoZSB3aG9sZQotbWF0Y2hlZCBzdWJzdHJpbmcpLgotUmV0dXJuIFxjb2Rley0xfSBpZiBcdmFye2dyb3VwfSBleGlzdHMgYnV0Ci1kaWQgbm90IGNvbnRyaWJ1dGUgdG8gdGhlIG1hdGNoLiAgRm9yIGEgbWF0Y2ggb2JqZWN0Ci1cdmFye219LCBhbmQgYSBncm91cCBcdmFye2d9IHRoYXQgZGlkIGNvbnRyaWJ1dGUgdG8gdGhlIG1hdGNoLCB0aGUKLXN1YnN0cmluZyBtYXRjaGVkIGJ5IGdyb3VwIFx2YXJ7Z30gKGVxdWl2YWxlbnQgdG8KLVxjb2Rle1x2YXJ7bX0uZ3JvdXAoXHZhcntnfSl9KSBpcwotCi1cYmVnaW57dmVyYmF0aW19Ci1tLnN0cmluZ1ttLnN0YXJ0KGcpOm0uZW5kKGcpXQotXGVuZHt2ZXJiYXRpbX0KLQotTm90ZSB0aGF0Ci1cY29kZXttLnN0YXJ0KFx2YXJ7Z3JvdXB9KX0gd2lsbCBlcXVhbCBcY29kZXttLmVuZChcdmFye2dyb3VwfSl9IGlmCi1cdmFye2dyb3VwfSBtYXRjaGVkIGEgbnVsbCBzdHJpbmcuICBGb3IgZXhhbXBsZSwgYWZ0ZXIgXGNvZGV7XHZhcnttfSA9Ci1yZS5zZWFyY2goJ2IoYz8pJywgJ2NiYScpfSwgXGNvZGV7XHZhcnttfS5zdGFydCgwKX0gaXMgMSwKLVxjb2Rle1x2YXJ7bX0uZW5kKDApfSBpcyAyLCBcY29kZXtcdmFye219LnN0YXJ0KDEpfSBhbmQKLVxjb2Rle1x2YXJ7bX0uZW5kKDEpfSBhcmUgYm90aCAyLCBhbmQgXGNvZGV7XHZhcnttfS5zdGFydCgyKX0gcmFpc2VzCi1hbiBcZXhjZXB0aW9ue0luZGV4RXJyb3J9IGV4Y2VwdGlvbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W01hdGNoT2JqZWN0XXtzcGFufXtcb3B0aW9uYWx7Z3JvdXB9fQotRm9yIFxjbGFzc3tNYXRjaE9iamVjdH0gXHZhcnttfSwgcmV0dXJuIHRoZSAyLXR1cGxlCi1cY29kZXsoXHZhcnttfS5zdGFydChcdmFye2dyb3VwfSksIFx2YXJ7bX0uZW5kKFx2YXJ7Z3JvdXB9KSl9LgotTm90ZSB0aGF0IGlmIFx2YXJ7Z3JvdXB9IGRpZCBub3QgY29udHJpYnV0ZSB0byB0aGUgbWF0Y2gsIHRoaXMgaXMKLVxjb2RleygtMSwgLTEpfS4gIEFnYWluLCBcdmFye2dyb3VwfSBkZWZhdWx0cyB0byB6ZXJvLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bTWF0Y2hPYmplY3Rde3Bvc30KLVRoZSB2YWx1ZSBvZiBcdmFye3Bvc30gd2hpY2ggd2FzIHBhc3NlZCB0byB0aGUgXGZ1bmN0aW9ue3NlYXJjaCgpfSBvcgotXGZ1bmN0aW9ue21hdGNoKCl9IG1ldGhvZCBvZiB0aGUgXGNsYXNze1JlZ2V4T2JqZWN0fS4gIFRoaXMgaXMgdGhlCi1pbmRleCBpbnRvIHRoZSBzdHJpbmcgYXQgd2hpY2ggdGhlIFJFIGVuZ2luZSBzdGFydGVkIGxvb2tpbmcgZm9yIGEKLW1hdGNoLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bTWF0Y2hPYmplY3Rde2VuZHBvc30KLVRoZSB2YWx1ZSBvZiBcdmFye2VuZHBvc30gd2hpY2ggd2FzIHBhc3NlZCB0byB0aGUgXGZ1bmN0aW9ue3NlYXJjaCgpfQotb3IgXGZ1bmN0aW9ue21hdGNoKCl9IG1ldGhvZCBvZiB0aGUgXGNsYXNze1JlZ2V4T2JqZWN0fS4gIFRoaXMgaXMgdGhlCi1pbmRleCBpbnRvIHRoZSBzdHJpbmcgYmV5b25kIHdoaWNoIHRoZSBSRSBlbmdpbmUgd2lsbCBub3QgZ28uCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtNYXRjaE9iamVjdF17bGFzdGluZGV4fQotVGhlIGludGVnZXIgaW5kZXggb2YgdGhlIGxhc3QgbWF0Y2hlZCBjYXB0dXJpbmcgZ3JvdXAsIG9yIFxjb2Rle05vbmV9Ci1pZiBubyBncm91cCB3YXMgbWF0Y2hlZCBhdCBhbGwuIEZvciBleGFtcGxlLCB0aGUgZXhwcmVzc2lvbnMKLVxyZWdleHB7KGEpYn0sIFxyZWdleHB7KChhKShiKSl9LCBhbmQgXHJlZ2V4cHsoKGFiKSl9IHdpbGwgaGF2ZQotXGNvZGV7bGFzdGluZGV4ID09IDF9IGlmIGFwcGxpZWQgdG8gdGhlIHN0cmluZyBcY29kZXsnYWInfSwKLXdoaWxlIHRoZSBleHByZXNzaW9uIFxyZWdleHB7KGEpKGIpfSB3aWxsIGhhdmUgXGNvZGV7bGFzdGluZGV4ID09IDJ9LAotaWYgYXBwbGllZCB0byB0aGUgc2FtZSBzdHJpbmcuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtNYXRjaE9iamVjdF17bGFzdGdyb3VwfQotVGhlIG5hbWUgb2YgdGhlIGxhc3QgbWF0Y2hlZCBjYXB0dXJpbmcgZ3JvdXAsIG9yIFxjb2Rle05vbmV9IGlmIHRoZQotZ3JvdXAgZGlkbid0IGhhdmUgYSBuYW1lLCBvciBpZiBubyBncm91cCB3YXMgbWF0Y2hlZCBhdCBhbGwuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtNYXRjaE9iamVjdF17cmV9Ci1UaGUgcmVndWxhciBleHByZXNzaW9uIG9iamVjdCB3aG9zZSBcbWV0aG9ke21hdGNoKCl9IG9yCi1cbWV0aG9ke3NlYXJjaCgpfSBtZXRob2QgcHJvZHVjZWQgdGhpcyBcY2xhc3N7TWF0Y2hPYmplY3R9IGluc3RhbmNlLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bTWF0Y2hPYmplY3Rde3N0cmluZ30KLVRoZSBzdHJpbmcgcGFzc2VkIHRvIFxmdW5jdGlvbnttYXRjaCgpfSBvciBcZnVuY3Rpb257c2VhcmNoKCl9LgotXGVuZHttZW1iZXJkZXNjfQotCi1cc3Vic2VjdGlvbntFeGFtcGxlc30KLQotXGxlZnRsaW5le1xzdHJvbmd7U2ltdWxhdGluZyBcY2Z1bmN0aW9ue3NjYW5mKCl9fX0KLQotUHl0aG9uIGRvZXMgbm90IGN1cnJlbnRseSBoYXZlIGFuIGVxdWl2YWxlbnQgdG8gXGNmdW5jdGlvbntzY2FuZigpfS4KLVx0dGluZGV4e3NjYW5mKCl9Ci1SZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBnZW5lcmFsbHkgbW9yZSBwb3dlcmZ1bCwgdGhvdWdoIGFsc28gbW9yZQotdmVyYm9zZSwgdGhhbiBcY2Z1bmN0aW9ue3NjYW5mKCl9IGZvcm1hdCBzdHJpbmdzLiAgVGhlIHRhYmxlIGJlbG93Ci1vZmZlcnMgc29tZSBtb3JlLW9yLWxlc3MgZXF1aXZhbGVudCBtYXBwaW5ncyBiZXR3ZWVuCi1cY2Z1bmN0aW9ue3NjYW5mKCl9IGZvcm1hdCB0b2tlbnMgYW5kIHJlZ3VsYXIgZXhwcmVzc2lvbnMuCi0KLVxiZWdpbnt0YWJsZWlpfXtsfGx9e3RleHRybX17XGNmdW5jdGlvbntzY2FuZigpfSBUb2tlbn17UmVndWxhciBFeHByZXNzaW9ufQotICBcbGluZWlpe1xjb2Rle1wlY319Ci0gICAgICAgICB7XHJlZ2V4cHsufX0KLSAgXGxpbmVpaXtcY29kZXtcJTVjfX0KLSAgICAgICAgIHtccmVnZXhwey5cezVcfX19Ci0gIFxsaW5laWl7XGNvZGV7XCVkfX0KLSAgICAgICAgIHtccmVnZXhwe1stK10/XGUgZCt9fQotICBcbGluZWlpe1xjb2Rle1wlZX0sIFxjb2Rle1wlRX0sIFxjb2Rle1wlZn0sIFxjb2Rle1wlZ319Ci0gICAgICAgICB7XHJlZ2V4cHtbLStdPyhcZSBkKyhcZS5cZSBkKik/fFxlLlxlIGQrKShbZUVdWy0rXT9cZSBkKyk/fX0KLSAgXGxpbmVpaXtcY29kZXtcJWl9fQotICAgICAgICAge1xyZWdleHB7Wy0rXT8oMFt4WF1bXGUgZEEtRmEtZl0rfDBbMC03XSp8XGUgZCspfX0KLSAgXGxpbmVpaXtcY29kZXtcJW99fQotICAgICAgICAge1xyZWdleHB7MFswLTddKn19Ci0gIFxsaW5laWl7XGNvZGV7XCVzfX0KLSAgICAgICAgIHtccmVnZXhwe1xlIFMrfX0KLSAgXGxpbmVpaXtcY29kZXtcJXV9fQotICAgICAgICAge1xyZWdleHB7XGUgZCt9fQotICBcbGluZWlpe1xjb2Rle1wleH0sIFxjb2Rle1wlWH19Ci0gICAgICAgICB7XHJlZ2V4cHswW3hYXVtcZSBkQS1GYS1mXSt9fQotXGVuZHt0YWJsZWlpfQotCi1UbyBleHRyYWN0IHRoZSBmaWxlbmFtZSBhbmQgbnVtYmVycyBmcm9tIGEgc3RyaW5nIGxpa2UKLQotXGJlZ2lue3ZlcmJhdGltfQotICAgIC91c3Ivc2Jpbi9zZW5kbWFpbCAtIDAgZXJyb3JzLCA0IHdhcm5pbmdzCi1cZW5ke3ZlcmJhdGltfQotCi15b3Ugd291bGQgdXNlIGEgXGNmdW5jdGlvbntzY2FuZigpfSBmb3JtYXQgbGlrZQotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgJXMgLSAlZCBlcnJvcnMsICVkIHdhcm5pbmdzCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgZXF1aXZhbGVudCByZWd1bGFyIGV4cHJlc3Npb24gd291bGQgYmUKLQotXGJlZ2lue3ZlcmJhdGltfQotICAgIChcUyspIC0gKFxkKykgZXJyb3JzLCAoXGQrKSB3YXJuaW5ncwotXGVuZHt2ZXJiYXRpbX0KLQotXGxlZnRsaW5le1xzdHJvbmd7QXZvaWRpbmcgcmVjdXJzaW9ufX0KLQotSWYgeW91IGNyZWF0ZSByZWd1bGFyIGV4cHJlc3Npb25zIHRoYXQgcmVxdWlyZSB0aGUgZW5naW5lIHRvIHBlcmZvcm0gYQotbG90IG9mIHJlY3Vyc2lvbiwgeW91IG1heSBlbmNvdW50ZXIgYSBcZXhjZXB0aW9ue1J1bnRpbWVFcnJvcn0gZXhjZXB0aW9uIHdpdGgKLXRoZSBtZXNzYWdlIFxjb2Rle21heGltdW0gcmVjdXJzaW9uIGxpbWl0fSBleGNlZWRlZC4gRm9yIGV4YW1wbGUsCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgcmUKLT4+PiBzID0gJ0JlZ2luICcgKyAxMDAwKidhIHZlcnkgbG9uZyBzdHJpbmcgJyArICdlbmQnCi0+Pj4gcmUubWF0Y2goJ0JlZ2luIChcd3wgKSo/IGVuZCcsIHMpLmVuZCgpCi1UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KLSAgRmlsZSAiL3Vzci9sb2NhbC9saWIvcHl0aG9uMi41L3JlLnB5IiwgbGluZSAxMzIsIGluIG1hdGNoCi0gICAgcmV0dXJuIF9jb21waWxlKHBhdHRlcm4sIGZsYWdzKS5tYXRjaChzdHJpbmcpCi1SdW50aW1lRXJyb3I6IG1heGltdW0gcmVjdXJzaW9uIGxpbWl0IGV4Y2VlZGVkCi1cZW5ke3ZlcmJhdGltfQotCi1Zb3UgY2FuIG9mdGVuIHJlc3RydWN0dXJlIHlvdXIgcmVndWxhciBleHByZXNzaW9uIHRvIGF2b2lkIHJlY3Vyc2lvbi4KLQotU3RhcnRpbmcgd2l0aCBQeXRob24gMi4zLCBzaW1wbGUgdXNlcyBvZiB0aGUgXHJlZ2V4cHsqP30gcGF0dGVybiBhcmUKLXNwZWNpYWwtY2FzZWQgdG8gYXZvaWQgcmVjdXJzaW9uLiAgVGh1cywgdGhlIGFib3ZlIHJlZ3VsYXIgZXhwcmVzc2lvbgotY2FuIGF2b2lkIHJlY3Vyc2lvbiBieSBiZWluZyByZWNhc3QgYXMKLVxyZWdleHB7QmVnaW4gW2EtekEtWjAtOV8gXSo/ZW5kfS4gIEFzIGEgZnVydGhlciBiZW5lZml0LCBzdWNoIHJlZ3VsYXIKLWV4cHJlc3Npb25zIHdpbGwgcnVuIGZhc3RlciB0aGFuIHRoZWlyIHJlY3Vyc2l2ZSBlcXVpdmFsZW50cy4KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlicmVhZGxpbmUudGV4IGIvRG9jL2xpYi9saWJyZWFkbGluZS50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYzM3YjYuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJyZWFkbGluZS50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtyZWFkbGluZX0gLS0tCi0gICAgICAgICBHTlUgcmVhZGxpbmUgaW50ZXJmYWNlfQotCi1cZGVjbGFyZW1vZHVsZXtidWlsdGlufXtyZWFkbGluZX0KLSAgXHBsYXRmb3Jte1VuaXh9Ci1cc2VjdGlvbmF1dGhvcntTa2lwIE1vbnRhbmFyb317c2tpcEBtb2phbS5jb219Ci1cbW9kdWxlc3lub3BzaXN7R05VIHJlYWRsaW5lIHN1cHBvcnQgZm9yIFB5dGhvbi59Ci0KLQotVGhlIFxtb2R1bGV7cmVhZGxpbmV9IG1vZHVsZSBkZWZpbmVzIGEgbnVtYmVyIG9mIGZ1bmN0aW9ucyB0bwotZmFjaWxpdGF0ZSBjb21wbGV0aW9uIGFuZCByZWFkaW5nL3dyaXRpbmcgb2YgaGlzdG9yeSBmaWxlcyBmcm9tIHRoZQotUHl0aG9uIGludGVycHJldGVyLiAgVGhpcyBtb2R1bGUgY2FuIGJlIHVzZWQgZGlyZWN0bHkgb3IgdmlhIHRoZQotXHJlZm1vZHVsZXtybGNvbXBsZXRlcn0gbW9kdWxlLiAgU2V0dGluZ3MgbWFkZSB1c2luZyAKLXRoaXMgbW9kdWxlIGFmZmVjdCB0aGUgYmVoYXZpb3VyIG9mIGJvdGggdGhlIGludGVycHJldGVyJ3MgaW50ZXJhY3RpdmUgcHJvbXB0IAotYW5kIHRoZSBwcm9tcHRzIG9mZmVyZWQgYnkgdGhlIFxmdW5jdGlvbntyYXdfaW5wdXQoKX0gYW5kIFxmdW5jdGlvbntpbnB1dCgpfQotYnVpbHQtaW4gZnVuY3Rpb25zLgotCi1UaGUgXG1vZHVsZXtyZWFkbGluZX0gbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6Ci0KLQotXGJlZ2lue2Z1bmNkZXNjfXtwYXJzZV9hbmRfYmluZH17c3RyaW5nfQotUGFyc2UgYW5kIGV4ZWN1dGUgc2luZ2xlIGxpbmUgb2YgYSByZWFkbGluZSBpbml0IGZpbGUuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldF9saW5lX2J1ZmZlcn17fQotUmV0dXJuIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBsaW5lIGJ1ZmZlci4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aW5zZXJ0X3RleHR9e3N0cmluZ30KLUluc2VydCB0ZXh0IGludG8gdGhlIGNvbW1hbmQgbGluZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cmVhZF9pbml0X2ZpbGV9e1xvcHRpb25hbHtmaWxlbmFtZX19Ci1QYXJzZSBhIHJlYWRsaW5lIGluaXRpYWxpemF0aW9uIGZpbGUuCi1UaGUgZGVmYXVsdCBmaWxlbmFtZSBpcyB0aGUgbGFzdCBmaWxlbmFtZSB1c2VkLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtyZWFkX2hpc3RvcnlfZmlsZX17XG9wdGlvbmFse2ZpbGVuYW1lfX0KLUxvYWQgYSByZWFkbGluZSBoaXN0b3J5IGZpbGUuCi1UaGUgZGVmYXVsdCBmaWxlbmFtZSBpcyBcZmlsZXtcfnt9Ly5oaXN0b3J5fS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317d3JpdGVfaGlzdG9yeV9maWxlfXtcb3B0aW9uYWx7ZmlsZW5hbWV9fQotU2F2ZSBhIHJlYWRsaW5lIGhpc3RvcnkgZmlsZS4KLVRoZSBkZWZhdWx0IGZpbGVuYW1lIGlzIFxmaWxle1x+e30vLmhpc3Rvcnl9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtjbGVhcl9oaXN0b3J5fXt9Ci1DbGVhciB0aGUgY3VycmVudCBoaXN0b3J5LiAgKE5vdGU6IHRoaXMgZnVuY3Rpb24gaXMgbm90IGF2YWlsYWJsZSBpZgotdGhlIGluc3RhbGxlZCB2ZXJzaW9uIG9mIEdOVSByZWFkbGluZSBkb2Vzbid0IHN1cHBvcnQgaXQuKQotXHZlcnNpb25hZGRlZHsyLjR9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldF9oaXN0b3J5X2xlbmd0aH17fQotUmV0dXJuIHRoZSBkZXNpcmVkIGxlbmd0aCBvZiB0aGUgaGlzdG9yeSBmaWxlLiAgTmVnYXRpdmUgdmFsdWVzIGltcGx5Ci11bmxpbWl0ZWQgaGlzdG9yeSBmaWxlIHNpemUuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NldF9oaXN0b3J5X2xlbmd0aH17bGVuZ3RofQotU2V0IHRoZSBudW1iZXIgb2YgbGluZXMgdG8gc2F2ZSBpbiB0aGUgaGlzdG9yeSBmaWxlLgotXGZ1bmN0aW9ue3dyaXRlX2hpc3RvcnlfZmlsZSgpfSB1c2VzIHRoaXMgdmFsdWUgdG8gdHJ1bmNhdGUgdGhlCi1oaXN0b3J5IGZpbGUgd2hlbiBzYXZpbmcuICBOZWdhdGl2ZSB2YWx1ZXMgaW1wbHkgdW5saW1pdGVkIGhpc3RvcnkKLWZpbGUgc2l6ZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0X2N1cnJlbnRfaGlzdG9yeV9sZW5ndGh9e30KLVJldHVybiB0aGUgbnVtYmVyIG9mIGxpbmVzIGN1cnJlbnRseSBpbiB0aGUgaGlzdG9yeS4gIChUaGlzIGlzIGRpZmZlcmVudAotZnJvbSBcZnVuY3Rpb257Z2V0X2hpc3RvcnlfbGVuZ3RoKCl9LCB3aGljaCByZXR1cm5zIHRoZSBtYXhpbXVtIG51bWJlciBvZgotbGluZXMgdGhhdCB3aWxsIGJlIHdyaXR0ZW4gdG8gYSBoaXN0b3J5IGZpbGUuKSAgXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldF9oaXN0b3J5X2l0ZW19e2luZGV4fQotUmV0dXJuIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIGhpc3RvcnkgaXRlbSBhdCBcdmFye2luZGV4fS4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtyZW1vdmVfaGlzdG9yeV9pdGVtfXtwb3N9Ci1SZW1vdmUgaGlzdG9yeSBpdGVtIHNwZWNpZmllZCBieSBpdHMgcG9zaXRpb24gZnJvbSB0aGUgaGlzdG9yeS4KLVx2ZXJzaW9uYWRkZWR7Mi40fQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtyZXBsYWNlX2hpc3RvcnlfaXRlbX17cG9zLCBsaW5lfQotUmVwbGFjZSBoaXN0b3J5IGl0ZW0gc3BlY2lmaWVkIGJ5IGl0cyBwb3NpdGlvbiB3aXRoIHRoZSBnaXZlbiBsaW5lLgotXHZlcnNpb25hZGRlZHsyLjR9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3JlZGlzcGxheX17fQotQ2hhbmdlIHdoYXQncyBkaXNwbGF5ZWQgb24gdGhlIHNjcmVlbiB0byByZWZsZWN0IHRoZSBjdXJyZW50IGNvbnRlbnRzCi1vZiB0aGUgbGluZSBidWZmZXIuICBcdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c2V0X3N0YXJ0dXBfaG9va317XG9wdGlvbmFse2Z1bmN0aW9ufX0KLVNldCBvciByZW1vdmUgdGhlIHN0YXJ0dXBfaG9vayBmdW5jdGlvbi4gIElmIFx2YXJ7ZnVuY3Rpb259IGlzIHNwZWNpZmllZCwKLWl0IHdpbGwgYmUgdXNlZCBhcyB0aGUgbmV3IHN0YXJ0dXBfaG9vayBmdW5jdGlvbjsgaWYgb21pdHRlZCBvcgotXGNvZGV7Tm9uZX0sIGFueSBob29rIGZ1bmN0aW9uIGFscmVhZHkgaW5zdGFsbGVkIGlzIHJlbW92ZWQuICBUaGUKLXN0YXJ0dXBfaG9vayBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBubyBhcmd1bWVudHMganVzdAotYmVmb3JlIHJlYWRsaW5lIHByaW50cyB0aGUgZmlyc3QgcHJvbXB0LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzZXRfcHJlX2lucHV0X2hvb2t9e1xvcHRpb25hbHtmdW5jdGlvbn19Ci1TZXQgb3IgcmVtb3ZlIHRoZSBwcmVfaW5wdXRfaG9vayBmdW5jdGlvbi4gIElmIFx2YXJ7ZnVuY3Rpb259IGlzIHNwZWNpZmllZCwKLWl0IHdpbGwgYmUgdXNlZCBhcyB0aGUgbmV3IHByZV9pbnB1dF9ob29rIGZ1bmN0aW9uOyBpZiBvbWl0dGVkIG9yCi1cY29kZXtOb25lfSwgYW55IGhvb2sgZnVuY3Rpb24gYWxyZWFkeSBpbnN0YWxsZWQgaXMgcmVtb3ZlZC4gIFRoZQotcHJlX2lucHV0X2hvb2sgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzIGFmdGVyIHRoZSBmaXJzdCBwcm9tcHQKLWhhcyBiZWVuIHByaW50ZWQgYW5kIGp1c3QgYmVmb3JlIHJlYWRsaW5lIHN0YXJ0cyByZWFkaW5nIGlucHV0IGNoYXJhY3RlcnMuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NldF9jb21wbGV0ZXJ9e1xvcHRpb25hbHtmdW5jdGlvbn19Ci1TZXQgb3IgcmVtb3ZlIHRoZSBjb21wbGV0ZXIgZnVuY3Rpb24uICBJZiBcdmFye2Z1bmN0aW9ufSBpcyBzcGVjaWZpZWQsCi1pdCB3aWxsIGJlIHVzZWQgYXMgdGhlIG5ldyBjb21wbGV0ZXIgZnVuY3Rpb247IGlmIG9taXR0ZWQgb3IKLVxjb2Rle05vbmV9LCBhbnkgY29tcGxldGVyIGZ1bmN0aW9uIGFscmVhZHkgaW5zdGFsbGVkIGlzIHJlbW92ZWQuICBUaGUKLWNvbXBsZXRlciBmdW5jdGlvbiBpcyBjYWxsZWQgYXMgXGNvZGV7XHZhcntmdW5jdGlvbn0oXHZhcnt0ZXh0fSwKLVx2YXJ7c3RhdGV9KX0sIGZvciBcdmFye3N0YXRlfSBpbiBcY29kZXswfSwgXGNvZGV7MX0sIFxjb2RlezJ9LCAuLi4sCi11bnRpbCBpdCByZXR1cm5zIGEgbm9uLXN0cmluZyB2YWx1ZS4gIEl0IHNob3VsZCByZXR1cm4gdGhlIG5leHQKLXBvc3NpYmxlIGNvbXBsZXRpb24gc3RhcnRpbmcgd2l0aCBcdmFye3RleHR9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRfY29tcGxldGVyfXt9Ci1HZXQgdGhlIGNvbXBsZXRlciBmdW5jdGlvbiwgb3IgXGNvZGV7Tm9uZX0gaWYgbm8gY29tcGxldGVyIGZ1bmN0aW9uCi1oYXMgYmVlbiBzZXQuICBcdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0X2JlZ2lkeH17fQotR2V0IHRoZSBiZWdpbm5pbmcgaW5kZXggb2YgdGhlIHJlYWRsaW5lIHRhYi1jb21wbGV0aW9uIHNjb3BlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRfZW5kaWR4fXt9Ci1HZXQgdGhlIGVuZGluZyBpbmRleCBvZiB0aGUgcmVhZGxpbmUgdGFiLWNvbXBsZXRpb24gc2NvcGUuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NldF9jb21wbGV0ZXJfZGVsaW1zfXtzdHJpbmd9Ci1TZXQgdGhlIHJlYWRsaW5lIHdvcmQgZGVsaW1pdGVycyBmb3IgdGFiLWNvbXBsZXRpb24uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldF9jb21wbGV0ZXJfZGVsaW1zfXt9Ci1HZXQgdGhlIHJlYWRsaW5lIHdvcmQgZGVsaW1pdGVycyBmb3IgdGFiLWNvbXBsZXRpb24uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2FkZF9oaXN0b3J5fXtsaW5lfQotQXBwZW5kIGEgbGluZSB0byB0aGUgaGlzdG9yeSBidWZmZXIsIGFzIGlmIGl0IHdhcyB0aGUgbGFzdCBsaW5lIHR5cGVkLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWVtb2R1bGV7cmxjb21wbGV0ZXJ9e0NvbXBsZXRpb24gb2YgUHl0aG9uIGlkZW50aWZpZXJzIGF0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmFjdGl2ZSBwcm9tcHQufQotXGVuZHtzZWVhbHNvfQotCi0KLVxzdWJzZWN0aW9ue0V4YW1wbGUgXGxhYmVse3JlYWRsaW5lLWV4YW1wbGV9fQotCi1UaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byB1c2UgdGhlCi1cbW9kdWxle3JlYWRsaW5lfSBtb2R1bGUncyBoaXN0b3J5IHJlYWRpbmcgYW5kIHdyaXRpbmcgZnVuY3Rpb25zIHRvCi1hdXRvbWF0aWNhbGx5IGxvYWQgYW5kIHNhdmUgYSBoaXN0b3J5IGZpbGUgbmFtZWQgXGZpbGV7LnB5aGlzdH0gZnJvbQotdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeS4gIFRoZSBjb2RlIGJlbG93IHdvdWxkIG5vcm1hbGx5IGJlIGV4ZWN1dGVkCi1hdXRvbWF0aWNhbGx5IGR1cmluZyBpbnRlcmFjdGl2ZSBzZXNzaW9ucyBmcm9tIHRoZSB1c2VyJ3MKLVxlbnZ2YXJ7UFlUSE9OU1RBUlRVUH0gZmlsZS4KLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IG9zCi1oaXN0ZmlsZSA9IG9zLnBhdGguam9pbihvcy5lbnZpcm9uWyJIT01FIl0sICIucHloaXN0IikKLXRyeToKLSAgICByZWFkbGluZS5yZWFkX2hpc3RvcnlfZmlsZShoaXN0ZmlsZSkKLWV4Y2VwdCBJT0Vycm9yOgotICAgIHBhc3MKLWltcG9ydCBhdGV4aXQKLWF0ZXhpdC5yZWdpc3RlcihyZWFkbGluZS53cml0ZV9oaXN0b3J5X2ZpbGUsIGhpc3RmaWxlKQotZGVsIG9zLCBoaXN0ZmlsZQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGZvbGxvd2luZyBleGFtcGxlIGV4dGVuZHMgdGhlIFxjbGFzc3tjb2RlLkludGVyYWN0aXZlQ29uc29sZX0gY2xhc3MgdG8KLXN1cHBvcnQgaGlzdG9yeSBzYXZlL3Jlc3RvcmUuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCBjb2RlCi1pbXBvcnQgcmVhZGxpbmUKLWltcG9ydCBhdGV4aXQKLWltcG9ydCBvcwotCi1jbGFzcyBIaXN0b3J5Q29uc29sZShjb2RlLkludGVyYWN0aXZlQ29uc29sZSk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGxvY2Fscz1Ob25lLCBmaWxlbmFtZT0iPGNvbnNvbGU+IiwKLSAgICAgICAgICAgICAgICAgaGlzdGZpbGU9b3MucGF0aC5leHBhbmR1c2VyKCJ+Ly5jb25zb2xlLWhpc3RvcnkiKSk6Ci0gICAgICAgIGNvZGUuSW50ZXJhY3RpdmVDb25zb2xlLl9faW5pdF9fKHNlbGYpCi0gICAgICAgIHNlbGYuaW5pdF9oaXN0b3J5KGhpc3RmaWxlKQotCi0gICAgZGVmIGluaXRfaGlzdG9yeShzZWxmLCBoaXN0ZmlsZSk6Ci0gICAgICAgIHJlYWRsaW5lLnBhcnNlX2FuZF9iaW5kKCJ0YWI6IGNvbXBsZXRlIikKLSAgICAgICAgaWYgaGFzYXR0cihyZWFkbGluZSwgInJlYWRfaGlzdG9yeV9maWxlIik6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgcmVhZGxpbmUucmVhZF9oaXN0b3J5X2ZpbGUoaGlzdGZpbGUpCi0gICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKLSAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICBhdGV4aXQucmVnaXN0ZXIoc2VsZi5zYXZlX2hpc3RvcnksIGhpc3RmaWxlKQotCi0gICAgZGVmIHNhdmVfaGlzdG9yeShzZWxmLCBoaXN0ZmlsZSk6Ci0gICAgICAgIHJlYWRsaW5lLndyaXRlX2hpc3RvcnlfZmlsZShoaXN0ZmlsZSkKLVxlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnJlcHIudGV4IGIvRG9jL2xpYi9saWJyZXByLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg3NjQ0OC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnJlcHIudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7cmVwcn0gLS0tCi0gICAgICAgICBBbHRlcm5hdGUgXGZ1bmN0aW9ue3JlcHIoKX0gaW1wbGVtZW50YXRpb259Ci0KLVxzZWN0aW9uYXV0aG9ye0ZyZWQgTC4gRHJha2UsIEpyLn17ZmRyYWtlQGFjbS5vcmd9Ci1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17cmVwcn0KLVxtb2R1bGVzeW5vcHNpc3tBbHRlcm5hdGUgXGZ1bmN0aW9ue3JlcHIoKX0gaW1wbGVtZW50YXRpb24gd2l0aCBzaXplIGxpbWl0cy59Ci0KLQotVGhlIFxtb2R1bGV7cmVwcn0gbW9kdWxlIHByb3ZpZGVzIGEgbWVhbnMgZm9yIHByb2R1Y2luZyBvYmplY3QKLXJlcHJlc2VudGF0aW9ucyB3aXRoIGxpbWl0cyBvbiB0aGUgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZ3MuCi1UaGlzIGlzIHVzZWQgaW4gdGhlIFB5dGhvbiBkZWJ1Z2dlciBhbmQgbWF5IGJlIHVzZWZ1bCBpbiBvdGhlcgotY29udGV4dHMgYXMgd2VsbC4KLQotVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBjbGFzcywgYW4gaW5zdGFuY2UsIGFuZCBhIGZ1bmN0aW9uOgotCi0KLVxiZWdpbntjbGFzc2Rlc2N9e1JlcHJ9e30KLSAgQ2xhc3Mgd2hpY2ggcHJvdmlkZXMgZm9ybWF0dGluZyBzZXJ2aWNlcyB1c2VmdWwgaW4gaW1wbGVtZW50aW5nCi0gIGZ1bmN0aW9ucyBzaW1pbGFyIHRvIHRoZSBidWlsdC1pbiBcZnVuY3Rpb257cmVwcigpfTsgc2l6ZSBsaW1pdHMgZm9yIAotICBkaWZmZXJlbnQgb2JqZWN0IHR5cGVzIGFyZSBhZGRlZCB0byBhdm9pZCB0aGUgZ2VuZXJhdGlvbiBvZgotICByZXByZXNlbnRhdGlvbnMgd2hpY2ggYXJlIGV4Y2Vzc2l2ZWx5IGxvbmcuCi1cZW5ke2NsYXNzZGVzY30KLQotCi1cYmVnaW57ZGF0YWRlc2N9e2FSZXByfQotICBUaGlzIGlzIGFuIGluc3RhbmNlIG9mIFxjbGFzc3tSZXByfSB3aGljaCBpcyB1c2VkIHRvIHByb3ZpZGUgdGhlCi0gIFxmdW5jdGlvbntyZXByKCl9IGZ1bmN0aW9uIGRlc2NyaWJlZCBiZWxvdy4gIENoYW5naW5nIHRoZSBhdHRyaWJ1dGVzCi0gIG9mIHRoaXMgb2JqZWN0IHdpbGwgYWZmZWN0IHRoZSBzaXplIGxpbWl0cyB1c2VkIGJ5IFxmdW5jdGlvbntyZXByKCl9Ci0gIGFuZCB0aGUgUHl0aG9uIGRlYnVnZ2VyLgotXGVuZHtkYXRhZGVzY30KLQotCi1cYmVnaW57ZnVuY2Rlc2N9e3JlcHJ9e29ian0KLSAgVGhpcyBpcyB0aGUgXG1ldGhvZHtyZXByKCl9IG1ldGhvZCBvZiBcY29kZXthUmVwcn0uICBJdCByZXR1cm5zIGEKLSAgc3RyaW5nIHNpbWlsYXIgdG8gdGhhdCByZXR1cm5lZCBieSB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gb2YgdGhlIHNhbWUgCi0gIG5hbWUsIGJ1dCB3aXRoIGxpbWl0cyBvbiBtb3N0IHNpemVzLgotXGVuZHtmdW5jZGVzY30KLQotCi1cc3Vic2VjdGlvbntSZXByIE9iamVjdHMgXGxhYmVse1JlcHItb2JqZWN0c319Ci0KLVxjbGFzc3tSZXByfSBpbnN0YW5jZXMgcHJvdmlkZSBzZXZlcmFsIG1lbWJlcnMgd2hpY2ggY2FuIGJlIHVzZWQgdG8KLXByb3ZpZGUgc2l6ZSBsaW1pdHMgZm9yIHRoZSByZXByZXNlbnRhdGlvbnMgb2YgZGlmZmVyZW50IG9iamVjdCB0eXBlcywgCi1hbmQgbWV0aG9kcyB3aGljaCBmb3JtYXQgc3BlY2lmaWMgb2JqZWN0IHR5cGVzLgotCi0KLVxiZWdpbnttZW1iZXJkZXNjfVtSZXByXXttYXhsZXZlbH0KLSAgRGVwdGggbGltaXQgb24gdGhlIGNyZWF0aW9uIG9mIHJlY3Vyc2l2ZSByZXByZXNlbnRhdGlvbnMuICBUaGUKLSAgZGVmYXVsdCBpcyBcY29kZXs2fS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W1JlcHJde21heGRpY3R9Ci1cbWVtYmVybGluZVtSZXByXXttYXhsaXN0fQotXG1lbWJlcmxpbmVbUmVwcl17bWF4dHVwbGV9Ci1cbWVtYmVybGluZVtSZXByXXttYXhzZXR9Ci1cbWVtYmVybGluZVtSZXByXXttYXhmcm96ZW5zZXR9Ci1cbWVtYmVybGluZVtSZXByXXttYXhkZXF1ZX0KLVxtZW1iZXJsaW5lW1JlcHJde21heGFycmF5fQotICBMaW1pdHMgb24gdGhlIG51bWJlciBvZiBlbnRyaWVzIHJlcHJlc2VudGVkIGZvciB0aGUgbmFtZWQgb2JqZWN0Ci0gIHR5cGUuICBUaGUgZGVmYXVsdCBpcyBcY29kZXs0fSBmb3IgXG1lbWJlcnttYXhkaWN0fSwgXGNvZGV7NX0gZm9yCi0gIFxtZW1iZXJ7bWF4YXJyYXl9LCBhbmQgIFxjb2RlezZ9IGZvciB0aGUgb3RoZXJzLgotICBcdmVyc2lvbmFkZGVkW1xtZW1iZXJ7bWF4c2V0fSwgXG1lbWJlcnttYXhmcm96ZW5zZXR9LAotICBhbmQgXG1lbWJlcntzZXR9XXsyLjR9LgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bUmVwcl17bWF4bG9uZ30KLSAgTWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgcmVwcmVzZW50YXRpb24gZm9yIGEgbG9uZwotICBpbnRlZ2VyLiAgRGlnaXRzIGFyZSBkcm9wcGVkIGZyb20gdGhlIG1pZGRsZS4gIFRoZSBkZWZhdWx0IGlzCi0gIFxjb2RlezQwfS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W1JlcHJde21heHN0cmluZ30KLSAgTGltaXQgb24gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUKLSAgc3RyaW5nLiAgTm90ZSB0aGF0IHRoZSBgYG5vcm1hbCcnIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzdHJpbmcgaXMKLSAgdXNlZCBhcyB0aGUgY2hhcmFjdGVyIHNvdXJjZTogaWYgZXNjYXBlIHNlcXVlbmNlcyBhcmUgbmVlZGVkIGluIHRoZQotICByZXByZXNlbnRhdGlvbiwgdGhlc2UgbWF5IGJlIG1hbmdsZWQgd2hlbiB0aGUgcmVwcmVzZW50YXRpb24gaXMKLSAgc2hvcnRlbmVkLiAgVGhlIGRlZmF1bHQgaXMgXGNvZGV7MzB9LgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bUmVwcl17bWF4b3RoZXJ9Ci0gIFRoaXMgbGltaXQgaXMgdXNlZCB0byBjb250cm9sIHRoZSBzaXplIG9mIG9iamVjdCB0eXBlcyBmb3Igd2hpY2ggbm8KLSAgc3BlY2lmaWMgZm9ybWF0dGluZyBtZXRob2QgaXMgYXZhaWxhYmxlIG9uIHRoZSBcY2xhc3N7UmVwcn0gb2JqZWN0LgotICBJdCBpcyBhcHBsaWVkIGluIGEgc2ltaWxhciBtYW5uZXIgYXMgXG1lbWJlcnttYXhzdHJpbmd9LiAgVGhlCi0gIGRlZmF1bHQgaXMgXGNvZGV7MjB9LgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUmVwcl17cmVwcn17b2JqfQotICBUaGUgZXF1aXZhbGVudCB0byB0aGUgYnVpbHQtaW4gXGZ1bmN0aW9ue3JlcHIoKX0gdGhhdCB1c2VzIHRoZQotICBmb3JtYXR0aW5nIGltcG9zZWQgYnkgdGhlIGluc3RhbmNlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUmVwcl17cmVwcjF9e29iaiwgbGV2ZWx9Ci0gIFJlY3Vyc2l2ZSBpbXBsZW1lbnRhdGlvbiB1c2VkIGJ5IFxtZXRob2R7cmVwcigpfS4gIFRoaXMgdXNlcyB0aGUKLSAgdHlwZSBvZiBcdmFye29ian0gdG8gZGV0ZXJtaW5lIHdoaWNoIGZvcm1hdHRpbmcgbWV0aG9kIHRvIGNhbGwsCi0gIHBhc3NpbmcgaXQgXHZhcntvYmp9IGFuZCBcdmFye2xldmVsfS4gIFRoZSB0eXBlLXNwZWNpZmljIG1ldGhvZHMKLSAgc2hvdWxkIGNhbGwgXG1ldGhvZHtyZXByMSgpfSB0byBwZXJmb3JtIHJlY3Vyc2l2ZSBmb3JtYXR0aW5nLCB3aXRoCi0gIFxjb2Rle1x2YXJ7bGV2ZWx9IC0gMX0gZm9yIHRoZSB2YWx1ZSBvZiBcdmFye2xldmVsfSBpbiB0aGUgcmVjdXJzaXZlIAotICBjYWxsLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY25pfVtSZXByXXtyZXByX1x2YXJ7dHlwZX19e29iaiwgbGV2ZWx9Ci0gIEZvcm1hdHRpbmcgbWV0aG9kcyBmb3Igc3BlY2lmaWMgdHlwZXMgYXJlIGltcGxlbWVudGVkIGFzIG1ldGhvZHMKLSAgd2l0aCBhIG5hbWUgYmFzZWQgb24gdGhlIHR5cGUgbmFtZS4gIEluIHRoZSBtZXRob2QgbmFtZSwgXHZhcnt0eXBlfQotICBpcyByZXBsYWNlZCBieQotICBcY29kZXtzdHJpbmcuam9pbihzdHJpbmcuc3BsaXQodHlwZShcdmFye29ian0pLl9fbmFtZV9fLCAnXycpKX0uCi0gIERpc3BhdGNoIHRvIHRoZXNlIG1ldGhvZHMgaXMgaGFuZGxlZCBieSBcbWV0aG9ke3JlcHIxKCl9LgotICBUeXBlLXNwZWNpZmljIG1ldGhvZHMgd2hpY2ggbmVlZCB0byByZWN1cnNpdmVseSBmb3JtYXQgYSB2YWx1ZQotICBzaG91bGQgY2FsbCBcc2FtcHtzZWxmLnJlcHIxKFx2YXJ7c3Vib2JqfSwgXHZhcntsZXZlbH0gLSAxKX0uCi1cZW5ke21ldGhvZGRlc2NuaX0KLQotCi1cc3Vic2VjdGlvbntTdWJjbGFzc2luZyBSZXByIE9iamVjdHMgXGxhYmVse3N1YmNsYXNzaW5nLXJlcHJzfX0KLQotVGhlIHVzZSBvZiBkeW5hbWljIGRpc3BhdGNoaW5nIGJ5IFxtZXRob2R7UmVwci5yZXByMSgpfSBhbGxvd3MKLXN1YmNsYXNzZXMgb2YgXGNsYXNze1JlcHJ9IHRvIGFkZCBzdXBwb3J0IGZvciBhZGRpdGlvbmFsIGJ1aWx0LWluCi1vYmplY3QgdHlwZXMgb3IgdG8gbW9kaWZ5IHRoZSBoYW5kbGluZyBvZiB0eXBlcyBhbHJlYWR5IHN1cHBvcnRlZC4KLVRoaXMgZXhhbXBsZSBzaG93cyBob3cgc3BlY2lhbCBzdXBwb3J0IGZvciBmaWxlIG9iamVjdHMgY291bGQgYmUKLWFkZGVkOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgcmVwcgotaW1wb3J0IHN5cwotCi1jbGFzcyBNeVJlcHIocmVwci5SZXByKToKLSAgICBkZWYgcmVwcl9maWxlKHNlbGYsIG9iaiwgbGV2ZWwpOgotICAgICAgICBpZiBvYmoubmFtZSBpbiBbJzxzdGRpbj4nLCAnPHN0ZG91dD4nLCAnPHN0ZGVycj4nXToKLSAgICAgICAgICAgIHJldHVybiBvYmoubmFtZQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIGBvYmpgCi0KLWFSZXByID0gTXlSZXByKCkKLXByaW50IGFSZXByLnJlcHIoc3lzLnN0ZGluKSAgICAgICAgICAjIHByaW50cyAnPHN0ZGluPicKLVxlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnJlc291cmNlLnRleCBiL0RvYy9saWIvbGlicmVzb3VyY2UudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTEwMmI4Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlicmVzb3VyY2UudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7cmVzb3VyY2V9IC0tLQotICAgICAgICAgUmVzb3VyY2UgdXNhZ2UgaW5mb3JtYXRpb259Ci0KLVxkZWNsYXJlbW9kdWxle2J1aWx0aW59e3Jlc291cmNlfQotICBccGxhdGZvcm17VW5peH0KLVxtb2R1bGVzeW5vcHNpc3tBbiBpbnRlcmZhY2UgdG8gcHJvdmlkZSByZXNvdXJjZSB1c2FnZSBpbmZvcm1hdGlvbiBvbgotICB0aGUgY3VycmVudCBwcm9jZXNzLn0KLVxtb2R1bGVhdXRob3J7SmVyZW15IEh5bHRvbn17amVyZW15QGFsdW0ubWl0LmVkdX0KLVxzZWN0aW9uYXV0aG9ye0plcmVteSBIeWx0b259e2plcmVteUBhbHVtLm1pdC5lZHV9Ci0KLQotVGhpcyBtb2R1bGUgcHJvdmlkZXMgYmFzaWMgbWVjaGFuaXNtcyBmb3IgbWVhc3VyaW5nIGFuZCBjb250cm9sbGluZwotc3lzdGVtIHJlc291cmNlcyB1dGlsaXplZCBieSBhIHByb2dyYW0uCi0KLVN5bWJvbGljIGNvbnN0YW50cyBhcmUgdXNlZCB0byBzcGVjaWZ5IHBhcnRpY3VsYXIgc3lzdGVtIHJlc291cmNlcyBhbmQKLXRvIHJlcXVlc3QgdXNhZ2UgaW5mb3JtYXRpb24gYWJvdXQgZWl0aGVyIHRoZSBjdXJyZW50IHByb2Nlc3Mgb3IgaXRzCi1jaGlsZHJlbi4KLQotQSBzaW5nbGUgZXhjZXB0aW9uIGlzIGRlZmluZWQgZm9yIGVycm9yczoKLQotCi1cYmVnaW57ZXhjZGVzY317ZXJyb3J9Ci0gIFRoZSBmdW5jdGlvbnMgZGVzY3JpYmVkIGJlbG93IG1heSByYWlzZSB0aGlzIGVycm9yIGlmIHRoZSB1bmRlcmx5aW5nCi0gIHN5c3RlbSBjYWxsIGZhaWx1cmVzIHVuZXhwZWN0ZWRseS4KLVxlbmR7ZXhjZGVzY30KLQotXHN1YnNlY3Rpb257UmVzb3VyY2UgTGltaXRzfQotCi1SZXNvdXJjZXMgdXNhZ2UgY2FuIGJlIGxpbWl0ZWQgdXNpbmcgdGhlIFxmdW5jdGlvbntzZXRybGltaXQoKX0gZnVuY3Rpb24KLWRlc2NyaWJlZCBiZWxvdy4gRWFjaCByZXNvdXJjZSBpcyBjb250cm9sbGVkIGJ5IGEgcGFpciBvZiBsaW1pdHM6IGEKLXNvZnQgbGltaXQgYW5kIGEgaGFyZCBsaW1pdC4gVGhlIHNvZnQgbGltaXQgaXMgdGhlIGN1cnJlbnQgbGltaXQsIGFuZAotbWF5IGJlIGxvd2VyZWQgb3IgcmFpc2VkIGJ5IGEgcHJvY2VzcyBvdmVyIHRpbWUuIFRoZSBzb2Z0IGxpbWl0IGNhbgotbmV2ZXIgZXhjZWVkIHRoZSBoYXJkIGxpbWl0LiBUaGUgaGFyZCBsaW1pdCBjYW4gYmUgbG93ZXJlZCB0byBhbnkKLXZhbHVlIGdyZWF0ZXIgdGhhbiB0aGUgc29mdCBsaW1pdCwgYnV0IG5vdCByYWlzZWQuIChPbmx5IHByb2Nlc3NlcyB3aXRoCi10aGUgZWZmZWN0aXZlIFVJRCBvZiB0aGUgc3VwZXItdXNlciBjYW4gcmFpc2UgYSBoYXJkIGxpbWl0LikKLQotVGhlIHNwZWNpZmljIHJlc291cmNlcyB0aGF0IGNhbiBiZSBsaW1pdGVkIGFyZSBzeXN0ZW0gZGVwZW5kZW50LiBUaGV5Ci1hcmUgZGVzY3JpYmVkIGluIHRoZSBcbWFucGFnZXtnZXRybGltaXR9ezJ9IG1hbiBwYWdlLiAgVGhlIHJlc291cmNlcwotbGlzdGVkIGJlbG93IGFyZSBzdXBwb3J0ZWQgd2hlbiB0aGUgdW5kZXJseWluZyBvcGVyYXRpbmcgc3lzdGVtCi1zdXBwb3J0cyB0aGVtOyByZXNvdXJjZXMgd2hpY2ggY2Fubm90IGJlIGNoZWNrZWQgb3IgY29udHJvbGxlZCBieSB0aGUKLW9wZXJhdGluZyBzeXN0ZW0gYXJlIG5vdCBkZWZpbmVkIGluIHRoaXMgbW9kdWxlIGZvciB0aG9zZSBwbGF0Zm9ybXMuCi0KLVxiZWdpbntmdW5jZGVzY317Z2V0cmxpbWl0fXtyZXNvdXJjZX0KLSAgUmV0dXJucyBhIHR1cGxlIFxjb2RleyhcdmFye3NvZnR9LCBcdmFye2hhcmR9KX0gd2l0aCB0aGUgY3VycmVudAotICBzb2Z0IGFuZCBoYXJkIGxpbWl0cyBvZiBcdmFye3Jlc291cmNlfS4gUmFpc2VzIFxleGNlcHRpb257VmFsdWVFcnJvcn0gaWYKLSAgYW4gaW52YWxpZCByZXNvdXJjZSBpcyBzcGVjaWZpZWQsIG9yIFxleGNlcHRpb257ZXJyb3J9IGlmIHRoZQotICB1bmRlcmx5aW5nIHN5c3RlbSBjYWxsIGZhaWxzIHVuZXhwZWN0ZWRseS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c2V0cmxpbWl0fXtyZXNvdXJjZSwgbGltaXRzfQotICBTZXRzIG5ldyBsaW1pdHMgb2YgY29uc3VtcHRpb24gb2YgXHZhcntyZXNvdXJjZX0uIFRoZSBcdmFye2xpbWl0c30KLSAgYXJndW1lbnQgbXVzdCBiZSBhIHR1cGxlIFxjb2RleyhcdmFye3NvZnR9LCBcdmFye2hhcmR9KX0gb2YgdHdvCi0gIGludGVnZXJzIGRlc2NyaWJpbmcgdGhlIG5ldyBsaW1pdHMuIEEgdmFsdWUgb2YgXGNvZGV7LTF9IGNhbiBiZSB1c2VkIHRvCi0gIHNwZWNpZnkgdGhlIG1heGltdW0gcG9zc2libGUgdXBwZXIgbGltaXQuCi0KLSAgUmFpc2VzIFxleGNlcHRpb257VmFsdWVFcnJvcn0gaWYgYW4gaW52YWxpZCByZXNvdXJjZSBpcyBzcGVjaWZpZWQsCi0gIGlmIHRoZSBuZXcgc29mdCBsaW1pdCBleGNlZWRzIHRoZSBoYXJkIGxpbWl0LCBvciBpZiBhIHByb2Nlc3MgdHJpZXMKLSAgdG8gcmFpc2UgaXRzIGhhcmQgbGltaXQgKHVubGVzcyB0aGUgcHJvY2VzcyBoYXMgYW4gZWZmZWN0aXZlIFVJRCBvZgotICBzdXBlci11c2VyKS4gIENhbiBhbHNvIHJhaXNlIFxleGNlcHRpb257ZXJyb3J9IGlmIHRoZSB1bmRlcmx5aW5nCi0gIHN5c3RlbSBjYWxsIGZhaWxzLgotXGVuZHtmdW5jZGVzY30KLQotVGhlc2Ugc3ltYm9scyBkZWZpbmUgcmVzb3VyY2VzIHdob3NlIGNvbnN1bXB0aW9uIGNhbiBiZSBjb250cm9sbGVkCi11c2luZyB0aGUgXGZ1bmN0aW9ue3NldHJsaW1pdCgpfSBhbmQgXGZ1bmN0aW9ue2dldHJsaW1pdCgpfSBmdW5jdGlvbnMKLWRlc2NyaWJlZCBiZWxvdy4gVGhlIHZhbHVlcyBvZiB0aGVzZSBzeW1ib2xzIGFyZSBleGFjdGx5IHRoZSBjb25zdGFudHMKLXVzZWQgYnkgXEN7fSBwcm9ncmFtcy4KLQotVGhlIFxVTklYe30gbWFuIHBhZ2UgZm9yIFxtYW5wYWdle2dldHJsaW1pdH17Mn0gbGlzdHMgdGhlIGF2YWlsYWJsZQotcmVzb3VyY2VzLiAgTm90ZSB0aGF0IG5vdCBhbGwgc3lzdGVtcyB1c2UgdGhlIHNhbWUgc3ltYm9sIG9yIHNhbWUKLXZhbHVlIHRvIGRlbm90ZSB0aGUgc2FtZSByZXNvdXJjZS4gIFRoaXMgbW9kdWxlIGRvZXMgbm90IGF0dGVtcHQgdG8KLW1hc2sgcGxhdGZvcm0gZGlmZmVyZW5jZXMgLS0tIHN5bWJvbHMgbm90IGRlZmluZWQgZm9yIGEgcGxhdGZvcm0gd2lsbAotbm90IGJlIGF2YWlsYWJsZSBmcm9tIHRoaXMgbW9kdWxlIG9uIHRoYXQgcGxhdGZvcm0uCi0KLVxiZWdpbntkYXRhZGVzY317UkxJTUlUX0NPUkV9Ci0gIFRoZSBtYXhpbXVtIHNpemUgKGluIGJ5dGVzKSBvZiBhIGNvcmUgZmlsZSB0aGF0IHRoZSBjdXJyZW50IHByb2Nlc3MKLSAgY2FuIGNyZWF0ZS4gIFRoaXMgbWF5IHJlc3VsdCBpbiB0aGUgY3JlYXRpb24gb2YgYSBwYXJ0aWFsIGNvcmUgZmlsZQotICBpZiBhIGxhcmdlciBjb3JlIHdvdWxkIGJlIHJlcXVpcmVkIHRvIGNvbnRhaW4gdGhlIGVudGlyZSBwcm9jZXNzCi0gIGltYWdlLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtSTElNSVRfQ1BVfQotICBUaGUgbWF4aW11bSBhbW91bnQgb2YgcHJvY2Vzc29yIHRpbWUgKGluIHNlY29uZHMpIHRoYXQgYSBwcm9jZXNzIGNhbgotICB1c2UuIElmIHRoaXMgbGltaXQgaXMgZXhjZWVkZWQsIGEgXGNvbnN0YW50e1NJR1hDUFV9IHNpZ25hbCBpcyBzZW50IHRvCi0gIHRoZSBwcm9jZXNzLiAoU2VlIHRoZSBccmVmbW9kdWxle3NpZ25hbH0gbW9kdWxlIGRvY3VtZW50YXRpb24gZm9yCi0gIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBjYXRjaCB0aGlzIHNpZ25hbCBhbmQgZG8gc29tZXRoaW5nIHVzZWZ1bCwKLSAgZS5nLiBmbHVzaCBvcGVuIGZpbGVzIHRvIGRpc2suKQotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtSTElNSVRfRlNJWkV9Ci0gIFRoZSBtYXhpbXVtIHNpemUgb2YgYSBmaWxlIHdoaWNoIHRoZSBwcm9jZXNzIG1heSBjcmVhdGUuICBUaGlzIG9ubHkKLSAgYWZmZWN0cyB0aGUgc3RhY2sgb2YgdGhlIG1haW4gdGhyZWFkIGluIGEgbXVsdGktdGhyZWFkZWQgcHJvY2Vzcy4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317UkxJTUlUX0RBVEF9Ci0gIFRoZSBtYXhpbXVtIHNpemUgKGluIGJ5dGVzKSBvZiB0aGUgcHJvY2VzcydzIGhlYXAuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1JMSU1JVF9TVEFDS30KLSAgVGhlIG1heGltdW0gc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSBjYWxsIHN0YWNrIGZvciB0aGUgY3VycmVudAotICBwcm9jZXNzLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtSTElNSVRfUlNTfQotICBUaGUgbWF4aW11bSByZXNpZGVudCBzZXQgc2l6ZSB0aGF0IHNob3VsZCBiZSBtYWRlIGF2YWlsYWJsZSB0byB0aGUKLSAgcHJvY2Vzcy4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317UkxJTUlUX05QUk9DfQotICBUaGUgbWF4aW11bSBudW1iZXIgb2YgcHJvY2Vzc2VzIHRoZSBjdXJyZW50IHByb2Nlc3MgbWF5IGNyZWF0ZS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317UkxJTUlUX05PRklMRX0KLSAgVGhlIG1heGltdW0gbnVtYmVyIG9mIG9wZW4gZmlsZSBkZXNjcmlwdG9ycyBmb3IgdGhlIGN1cnJlbnQKLSAgcHJvY2Vzcy4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317UkxJTUlUX09GSUxFfQotICBUaGUgQlNEIG5hbWUgZm9yIFxjb25zdGFudHtSTElNSVRfTk9GSUxFfS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317UkxJTUlUX01FTUxPQ0t9Ci0gIFRoZSBtYXhpbXVtIGFkZHJlc3Mgc3BhY2Ugd2hpY2ggbWF5IGJlIGxvY2tlZCBpbiBtZW1vcnkuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1JMSU1JVF9WTUVNfQotICBUaGUgbGFyZ2VzdCBhcmVhIG9mIG1hcHBlZCBtZW1vcnkgd2hpY2ggdGhlIHByb2Nlc3MgbWF5IG9jY3VweS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317UkxJTUlUX0FTfQotICBUaGUgbWF4aW11bSBhcmVhIChpbiBieXRlcykgb2YgYWRkcmVzcyBzcGFjZSB3aGljaCBtYXkgYmUgdGFrZW4gYnkKLSAgdGhlIHByb2Nlc3MuCi1cZW5ke2RhdGFkZXNjfQotCi1cc3Vic2VjdGlvbntSZXNvdXJjZSBVc2FnZX0KLQotVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIHJldHJpZXZlIHJlc291cmNlIHVzYWdlIGluZm9ybWF0aW9uOgotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldHJ1c2FnZX17d2hvfQotICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gb2JqZWN0IHRoYXQgZGVzY3JpYmVzIHRoZSByZXNvdXJjZXMKLSAgY29uc3VtZWQgYnkgZWl0aGVyIHRoZSBjdXJyZW50IHByb2Nlc3Mgb3IgaXRzIGNoaWxkcmVuLCBhcyBzcGVjaWZpZWQKLSAgYnkgdGhlIFx2YXJ7d2hvfSBwYXJhbWV0ZXIuICBUaGUgXHZhcnt3aG99IHBhcmFtZXRlciBzaG91bGQgYmUKLSAgc3BlY2lmaWVkIHVzaW5nIG9uZSBvZiB0aGUgXGNvbnN0YW50e1JVU0FHRV8qfSBjb25zdGFudHMgZGVzY3JpYmVkCi0gIGJlbG93LgotCi0gIFRoZSBmaWVsZHMgb2YgdGhlIHJldHVybiB2YWx1ZSBlYWNoIGRlc2NyaWJlIGhvdyBhIHBhcnRpY3VsYXIgc3lzdGVtCi0gIHJlc291cmNlIGhhcyBiZWVuIHVzZWQsIGUuZy4gYW1vdW50IG9mIHRpbWUgc3BlbnQgcnVubmluZyBpcyB1c2VyIG1vZGUKLSAgb3IgbnVtYmVyIG9mIHRpbWVzIHRoZSBwcm9jZXNzIHdhcyBzd2FwcGVkIG91dCBvZiBtYWluIG1lbW9yeS4gU29tZQotICB2YWx1ZXMgYXJlIGRlcGVuZGVudCBvbiB0aGUgY2xvY2sgdGljayBpbnRlcm5hbCwgZS5nLiB0aGUgYW1vdW50IG9mCi0gIG1lbW9yeSB0aGUgcHJvY2VzcyBpcyB1c2luZy4KLQotICBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhlIHJldHVybiB2YWx1ZSBpcyBhbHNvIGFjY2Vzc2libGUgYXMKLSAgYSB0dXBsZSBvZiAxNiBlbGVtZW50cy4KLQotICBUaGUgZmllbGRzIFxtZW1iZXJ7cnVfdXRpbWV9IGFuZCBcbWVtYmVye3J1X3N0aW1lfSBvZiB0aGUgcmV0dXJuIHZhbHVlCi0gIGFyZSBmbG9hdGluZyBwb2ludCB2YWx1ZXMgcmVwcmVzZW50aW5nIHRoZSBhbW91bnQgb2YgdGltZSBzcGVudAotICBleGVjdXRpbmcgaW4gdXNlciBtb2RlIGFuZCB0aGUgYW1vdW50IG9mIHRpbWUgc3BlbnQgZXhlY3V0aW5nIGluIHN5c3RlbQotICBtb2RlLCByZXNwZWN0aXZlbHkuIFRoZSByZW1haW5pbmcgdmFsdWVzIGFyZSBpbnRlZ2Vycy4gQ29uc3VsdCB0aGUKLSAgXG1hbnBhZ2V7Z2V0cnVzYWdlfXsyfSBtYW4gcGFnZSBmb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlc2UKLSAgdmFsdWVzLiBBIGJyaWVmIHN1bW1hcnkgaXMgcHJlc2VudGVkIGhlcmU6Ci0KLVxiZWdpbnt0YWJsZWlpaX17cnxsfGx9e2NvZGV9e0luZGV4fXtGaWVsZH17UmVzb3VyY2V9Ci0gIFxsaW5laWlpezB9e1xtZW1iZXJ7cnVfdXRpbWV9fXt0aW1lIGluIHVzZXIgbW9kZSAoZmxvYXQpfQotICBcbGluZWlpaXsxfXtcbWVtYmVye3J1X3N0aW1lfX17dGltZSBpbiBzeXN0ZW0gbW9kZSAoZmxvYXQpfQotICBcbGluZWlpaXsyfXtcbWVtYmVye3J1X21heHJzc319e21heGltdW0gcmVzaWRlbnQgc2V0IHNpemV9Ci0gIFxsaW5laWlpezN9e1xtZW1iZXJ7cnVfaXhyc3N9fXtzaGFyZWQgbWVtb3J5IHNpemV9Ci0gIFxsaW5laWlpezR9e1xtZW1iZXJ7cnVfaWRyc3N9fXt1bnNoYXJlZCBtZW1vcnkgc2l6ZX0KLSAgXGxpbmVpaWl7NX17XG1lbWJlcntydV9pc3Jzc319e3Vuc2hhcmVkIHN0YWNrIHNpemV9Ci0gIFxsaW5laWlpezZ9e1xtZW1iZXJ7cnVfbWluZmx0fX17cGFnZSBmYXVsdHMgbm90IHJlcXVpcmluZyBJL099Ci0gIFxsaW5laWlpezd9e1xtZW1iZXJ7cnVfbWFqZmx0fX17cGFnZSBmYXVsdHMgcmVxdWlyaW5nIEkvT30KLSAgXGxpbmVpaWl7OH17XG1lbWJlcntydV9uc3dhcH19e251bWJlciBvZiBzd2FwIG91dHN9Ci0gIFxsaW5laWlpezl9e1xtZW1iZXJ7cnVfaW5ibG9ja319e2Jsb2NrIGlucHV0IG9wZXJhdGlvbnN9Ci0gIFxsaW5laWlpezEwfXtcbWVtYmVye3J1X291YmxvY2t9fXtibG9jayBvdXRwdXQgb3BlcmF0aW9uc30KLSAgXGxpbmVpaWl7MTF9e1xtZW1iZXJ7cnVfbXNnc25kfX17bWVzc2FnZXMgc2VudH0KLSAgXGxpbmVpaWl7MTJ9e1xtZW1iZXJ7cnVfbXNncmN2fX17bWVzc2FnZXMgcmVjZWl2ZWR9Ci0gIFxsaW5laWlpezEzfXtcbWVtYmVye3J1X25zaWduYWxzfX17c2lnbmFscyByZWNlaXZlZH0KLSAgXGxpbmVpaWl7MTR9e1xtZW1iZXJ7cnVfbnZjc3d9fXt2b2x1bnRhcnkgY29udGV4dCBzd2l0Y2hlc30KLSAgXGxpbmVpaWl7MTV9e1xtZW1iZXJ7cnVfbml2Y3N3fX17aW52b2x1bnRhcnkgY29udGV4dCBzd2l0Y2hlc30KLVxlbmR7dGFibGVpaWl9Ci0KLSAgVGhpcyBmdW5jdGlvbiB3aWxsIHJhaXNlIGEgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSBpZiBhbiBpbnZhbGlkCi0gIFx2YXJ7d2hvfSBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkLiBJdCBtYXkgYWxzbyByYWlzZQotICBcZXhjZXB0aW9ue2Vycm9yfSBleGNlcHRpb24gaW4gdW51c3VhbCBjaXJjdW1zdGFuY2VzLgotCi0gIFx2ZXJzaW9uY2hhbmdlZFtBZGRlZCBhY2Nlc3MgdG8gdmFsdWVzIGFzIGF0dHJpYnV0ZXMgb2YgdGhlCi0gIHJldHVybmVkIG9iamVjdF17Mi4zfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRwYWdlc2l6ZX17fQotICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBzeXN0ZW0gcGFnZS4gKFRoaXMgbmVlZCBub3QgYmUgdGhlCi0gIHNhbWUgYXMgdGhlIGhhcmR3YXJlIHBhZ2Ugc2l6ZS4pIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGZvcgotICBkZXRlcm1pbmluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIG1lbW9yeSBhIHByb2Nlc3MgaXMgdXNpbmcuIFRoZQotICB0aGlyZCBlbGVtZW50IG9mIHRoZSB0dXBsZSByZXR1cm5lZCBieSBcZnVuY3Rpb257Z2V0cnVzYWdlKCl9IGRlc2NyaWJlcwotICBtZW1vcnkgdXNhZ2UgaW4gcGFnZXM7IG11bHRpcGx5aW5nIGJ5IHBhZ2Ugc2l6ZSBwcm9kdWNlcyBudW1iZXIgb2YKLSAgYnl0ZXMuIAotXGVuZHtmdW5jZGVzY30KLQotVGhlIGZvbGxvd2luZyBcY29uc3RhbnR7UlVTQUdFXyp9IHN5bWJvbHMgYXJlIHBhc3NlZCB0byB0aGUKLVxmdW5jdGlvbntnZXRydXNhZ2UoKX0gZnVuY3Rpb24gdG8gc3BlY2lmeSB3aGljaCBwcm9jZXNzZXMgaW5mb3JtYXRpb24KLXNob3VsZCBiZSBwcm92aWRlZCBmb3IuCi0KLVxiZWdpbntkYXRhZGVzY317UlVTQUdFX1NFTEZ9Ci0gIFxjb25zdGFudHtSVVNBR0VfU0VMRn0gc2hvdWxkIGJlIHVzZWQgdG8KLSAgcmVxdWVzdCBpbmZvcm1hdGlvbiBwZXJ0YWluaW5nIG9ubHkgdG8gdGhlIHByb2Nlc3MgaXRzZWxmLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtSVVNBR0VfQ0hJTERSRU59Ci0gIFBhc3MgdG8gXGZ1bmN0aW9ue2dldHJ1c2FnZSgpfSB0byByZXF1ZXN0IHJlc291cmNlIGluZm9ybWF0aW9uIGZvcgotICBjaGlsZCBwcm9jZXNzZXMgb2YgdGhlIGNhbGxpbmcgcHJvY2Vzcy4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317UlVTQUdFX0JPVEh9Ci0gIFBhc3MgdG8gXGZ1bmN0aW9ue2dldHJ1c2FnZSgpfSB0byByZXF1ZXN0IHJlc291cmNlcyBjb25zdW1lZCBieSBib3RoCi0gIHRoZSBjdXJyZW50IHByb2Nlc3MgYW5kIGNoaWxkIHByb2Nlc3Nlcy4gIE1heSBub3QgYmUgYXZhaWxhYmxlIG9uIGFsbAotICBzeXN0ZW1zLgotXGVuZHtkYXRhZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlicmZjODIyLnRleCBiL0RvYy9saWIvbGlicmZjODIyLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU5ZTZhZC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnJmYzgyMi50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwzMzYgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtyZmM4MjJ9IC0tLQotICAgICAgICAgUGFyc2UgUkZDIDI4MjIgbWFpbCBoZWFkZXJzfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17cmZjODIyfQotXG1vZHVsZXN5bm9wc2lze1BhcnNlIFxyZmN7MjgyMn0gc3R5bGUgbWFpbCBtZXNzYWdlcy59Ci0KLVxkZXByZWNhdGVkezIuM317VGhlIFxyZWZtb2R1bGV7ZW1haWx9IHBhY2thZ2Ugc2hvdWxkIGJlIHVzZWQgaW4KLSAgICAgICAgICAgICAgICAgcHJlZmVyZW5jZSB0byB0aGUgXG1vZHVsZXtyZmM4MjJ9IG1vZHVsZS4gIFRoaXMKLSAgICAgICAgICAgICAgICAgbW9kdWxlIGlzIHByZXNlbnQgb25seSB0byBtYWludGFpbiBiYWNrd2FyZAotICAgICAgICAgICAgICAgICBjb21wYXRpYmlsaXR5Ln0KLQotVGhpcyBtb2R1bGUgZGVmaW5lcyBhIGNsYXNzLCBcY2xhc3N7TWVzc2FnZX0sIHdoaWNoIHJlcHJlc2VudHMgYW4KLWBgZW1haWwgbWVzc2FnZScnIGFzIGRlZmluZWQgYnkgdGhlIEludGVybmV0IHN0YW5kYXJkCi1ccmZjezI4MjJ9Llxmb290bm90ZXtUaGlzIG1vZHVsZSBvcmlnaW5hbGx5IGNvbmZvcm1lZCB0byBccmZjezgyMn0sCi1oZW5jZSB0aGUgbmFtZS4gIFNpbmNlIHRoZW4sIFxyZmN7MjgyMn0gaGFzIGJlZW4gcmVsZWFzZWQgYXMgYW4KLXVwZGF0ZSB0byBccmZjezgyMn0uICBUaGlzIG1vZHVsZSBzaG91bGQgYmUgY29uc2lkZXJlZAotXHJmY3syODIyfS1jb25mb3JtYW50LCBlc3BlY2lhbGx5IGluIGNhc2VzIHdoZXJlIHRoZQotc3ludGF4IG9yIHNlbWFudGljcyBoYXZlIGNoYW5nZWQgc2luY2UgXHJmY3s4MjJ9Ln0gIFN1Y2ggbWVzc2FnZXMKLWNvbnNpc3Qgb2YgYSBjb2xsZWN0aW9uIG9mIG1lc3NhZ2UgaGVhZGVycywgYW5kIGEgbWVzc2FnZSBib2R5LiAgVGhpcwotbW9kdWxlIGFsc28gZGVmaW5lcyBhIGhlbHBlciBjbGFzcwotXGNsYXNze0FkZHJlc3NMaXN0fSBmb3IgcGFyc2luZyBccmZjezI4MjJ9IGFkZHJlc3Nlcy4gIFBsZWFzZSByZWZlciB0bwotdGhlIFJGQyBmb3IgaW5mb3JtYXRpb24gb24gdGhlIHNwZWNpZmljIHN5bnRheCBvZiBccmZjezI4MjJ9IG1lc3NhZ2VzLgotCi1UaGUgXHJlZm1vZHVsZXttYWlsYm94fVxyZWZzdG1vZGluZGV4e21haWxib3h9IG1vZHVsZSBwcm92aWRlcyBjbGFzc2VzIAotdG8gcmVhZCBtYWlsYm94ZXMgcHJvZHVjZWQgYnkgdmFyaW91cyBlbmQtdXNlciBtYWlsIHByb2dyYW1zLgotCi1cYmVnaW57Y2xhc3NkZXNjfXtNZXNzYWdlfXtmaWxlXG9wdGlvbmFseywgc2Vla2FibGV9fQotQSBcY2xhc3N7TWVzc2FnZX0gaW5zdGFuY2UgaXMgaW5zdGFudGlhdGVkIHdpdGggYW4gaW5wdXQgb2JqZWN0IGFzCi1wYXJhbWV0ZXIuICBNZXNzYWdlIHJlbGllcyBvbmx5IG9uIHRoZSBpbnB1dCBvYmplY3QgaGF2aW5nIGEKLVxtZXRob2R7cmVhZGxpbmUoKX0gbWV0aG9kOyBpbiBwYXJ0aWN1bGFyLCBvcmRpbmFyeSBmaWxlIG9iamVjdHMKLXF1YWxpZnkuICBJbnN0YW50aWF0aW9uIHJlYWRzIGhlYWRlcnMgZnJvbSB0aGUgaW5wdXQgb2JqZWN0IHVwIHRvIGEKLWRlbGltaXRlciBsaW5lIChub3JtYWxseSBhIGJsYW5rIGxpbmUpIGFuZCBzdG9yZXMgdGhlbSBpbiB0aGUKLWluc3RhbmNlLiAgVGhlIG1lc3NhZ2UgYm9keSwgZm9sbG93aW5nIHRoZSBoZWFkZXJzLCBpcyBub3QgY29uc3VtZWQuCi0KLVRoaXMgY2xhc3MgY2FuIHdvcmsgd2l0aCBhbnkgaW5wdXQgb2JqZWN0IHRoYXQgc3VwcG9ydHMgYQotXG1ldGhvZHtyZWFkbGluZSgpfSBtZXRob2QuICBJZiB0aGUgaW5wdXQgb2JqZWN0IGhhcyBzZWVrIGFuZCB0ZWxsCi1jYXBhYmlsaXR5LCB0aGUgXG1ldGhvZHtyZXdpbmRib2R5KCl9IG1ldGhvZCB3aWxsIHdvcms7IGFsc28sIGlsbGVnYWwKLWxpbmVzIHdpbGwgYmUgcHVzaGVkIGJhY2sgb250byB0aGUgaW5wdXQgc3RyZWFtLiAgSWYgdGhlIGlucHV0IG9iamVjdAotbGFja3Mgc2VlayBidXQgaGFzIGFuIFxtZXRob2R7dW5yZWFkKCl9IG1ldGhvZCB0aGF0IGNhbiBwdXNoIGJhY2sgYQotbGluZSBvZiBpbnB1dCwgXGNsYXNze01lc3NhZ2V9IHdpbGwgdXNlIHRoYXQgdG8gcHVzaCBiYWNrIGlsbGVnYWwKLWxpbmVzLiAgVGh1cyB0aGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIHBhcnNlIG1lc3NhZ2VzIGNvbWluZyBmcm9tIGEKLWJ1ZmZlcmVkIHN0cmVhbS4KLQotVGhlIG9wdGlvbmFsIFx2YXJ7c2Vla2FibGV9IGFyZ3VtZW50IGlzIHByb3ZpZGVkIGFzIGEgd29ya2Fyb3VuZCBmb3IKLWNlcnRhaW4gc3RkaW8gbGlicmFyaWVzIGluIHdoaWNoIFxjZnVuY3Rpb257dGVsbCgpfSBkaXNjYXJkcyBidWZmZXJlZAotZGF0YSBiZWZvcmUgZGlzY292ZXJpbmcgdGhhdCB0aGUgXGNmdW5jdGlvbntsc2VlaygpfSBzeXN0ZW0gY2FsbAotZG9lc24ndCB3b3JrLiAgRm9yIG1heGltdW0gcG9ydGFiaWxpdHksIHlvdSBzaG91bGQgc2V0IHRoZSBzZWVrYWJsZQotYXJndW1lbnQgdG8gemVybyB0byBwcmV2ZW50IHRoYXQgaW5pdGlhbCBcbWV0aG9ke3RlbGwoKX0gd2hlbiBwYXNzaW5nCi1pbiBhbiB1bnNlZWthYmxlIG9iamVjdCBzdWNoIGFzIGEgZmlsZSBvYmplY3QgY3JlYXRlZCBmcm9tIGEgc29ja2V0Ci1vYmplY3QuCi0KLUlucHV0IGxpbmVzIGFzIHJlYWQgZnJvbSB0aGUgZmlsZSBtYXkgZWl0aGVyIGJlIHRlcm1pbmF0ZWQgYnkgQ1ItTEYgb3IKLWJ5IGEgc2luZ2xlIGxpbmVmZWVkOyBhIHRlcm1pbmF0aW5nIENSLUxGIGlzIHJlcGxhY2VkIGJ5IGEgc2luZ2xlCi1saW5lZmVlZCBiZWZvcmUgdGhlIGxpbmUgaXMgc3RvcmVkLgotCi1BbGwgaGVhZGVyIG1hdGNoaW5nIGlzIGRvbmUgaW5kZXBlbmRlbnQgb2YgdXBwZXIgb3IgbG93ZXIgY2FzZTsKLWUuZy5cIFxjb2Rle1x2YXJ7bX1bJ0Zyb20nXX0sIFxjb2Rle1x2YXJ7bX1bJ2Zyb20nXX0gYW5kCi1cY29kZXtcdmFye219WydGUk9NJ119IGFsbCB5aWVsZCB0aGUgc2FtZSByZXN1bHQuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317QWRkcmVzc0xpc3R9e2ZpZWxkfQotWW91IG1heSBpbnN0YW50aWF0ZSB0aGUgXGNsYXNze0FkZHJlc3NMaXN0fSBoZWxwZXIgY2xhc3MgdXNpbmcgYSBzaW5nbGUKLXN0cmluZyBwYXJhbWV0ZXIsIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgXHJmY3syODIyfSBhZGRyZXNzZXMgdG8gYmUKLXBhcnNlZC4gIChUaGUgcGFyYW1ldGVyIFxjb2Rle05vbmV9IHlpZWxkcyBhbiBlbXB0eSBsaXN0LikKLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3F1b3RlfXtzdHJ9Ci1SZXR1cm4gYSBuZXcgc3RyaW5nIHdpdGggYmFja3NsYXNoZXMgaW4gXHZhcntzdHJ9IHJlcGxhY2VkIGJ5IHR3bwotYmFja3NsYXNoZXMgYW5kIGRvdWJsZSBxdW90ZXMgcmVwbGFjZWQgYnkgYmFja3NsYXNoLWRvdWJsZSBxdW90ZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dW5xdW90ZX17c3RyfQotUmV0dXJuIGEgbmV3IHN0cmluZyB3aGljaCBpcyBhbiBcZW1waHt1bnF1b3RlZH0gdmVyc2lvbiBvZiBcdmFye3N0cn0uCi1JZiBcdmFye3N0cn0gZW5kcyBhbmQgYmVnaW5zIHdpdGggZG91YmxlIHF1b3RlcywgdGhleSBhcmUgc3RyaXBwZWQKLW9mZi4gIExpa2V3aXNlIGlmIFx2YXJ7c3RyfSBlbmRzIGFuZCBiZWdpbnMgd2l0aCBhbmdsZSBicmFja2V0cywgdGhleQotYXJlIHN0cmlwcGVkIG9mZi4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cGFyc2VhZGRyfXthZGRyZXNzfQotUGFyc2UgXHZhcnthZGRyZXNzfSwgd2hpY2ggc2hvdWxkIGJlIHRoZSB2YWx1ZSBvZiBzb21lCi1hZGRyZXNzLWNvbnRhaW5pbmcgZmllbGQgc3VjaCBhcyBcbWFpbGhlYWRlcntUb30gb3IgXG1haWxoZWFkZXJ7Q2N9LAotaW50byBpdHMgY29uc3RpdHVlbnQgYGByZWFsbmFtZScnIGFuZCBgYGVtYWlsIGFkZHJlc3MnJyBwYXJ0cy4KLVJldHVybnMgYSB0dXBsZSBvZiB0aGF0IGluZm9ybWF0aW9uLCB1bmxlc3MgdGhlIHBhcnNlIGZhaWxzLCBpbiB3aGljaAotY2FzZSBhIDItdHVwbGUgXGNvZGV7KE5vbmUsIE5vbmUpfSBpcyByZXR1cm5lZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZHVtcF9hZGRyZXNzX3BhaXJ9e3BhaXJ9Ci1UaGUgaW52ZXJzZSBvZiBcbWV0aG9ke3BhcnNlYWRkcigpfSwgdGhpcyB0YWtlcyBhIDItdHVwbGUgb2YgdGhlIGZvcm0KLVxjb2RleyhcdmFye3JlYWxuYW1lfSwgXHZhcntlbWFpbF9hZGRyZXNzfSl9IGFuZCByZXR1cm5zIHRoZSBzdHJpbmcKLXZhbHVlIHN1aXRhYmxlIGZvciBhIFxtYWlsaGVhZGVye1RvfSBvciBcbWFpbGhlYWRlcntDY30gaGVhZGVyLiAgSWYKLXRoZSBmaXJzdCBlbGVtZW50IG9mIFx2YXJ7cGFpcn0gaXMgZmFsc2UsIHRoZW4gdGhlIHNlY29uZCBlbGVtZW50IGlzCi1yZXR1cm5lZCB1bm1vZGlmaWVkLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtwYXJzZWRhdGV9e2RhdGV9Ci1BdHRlbXB0cyB0byBwYXJzZSBhIGRhdGUgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBpbiBccmZjezI4MjJ9LgotaG93ZXZlciwgc29tZSBtYWlsZXJzIGRvbid0IGZvbGxvdyB0aGF0IGZvcm1hdCBhcyBzcGVjaWZpZWQsIHNvCi1cZnVuY3Rpb257cGFyc2VkYXRlKCl9IHRyaWVzIHRvIGd1ZXNzIGNvcnJlY3RseSBpbiBzdWNoIGNhc2VzLiAKLVx2YXJ7ZGF0ZX0gaXMgYSBzdHJpbmcgY29udGFpbmluZyBhbiBccmZjezI4MjJ9IGRhdGUsIHN1Y2ggYXMgCi1cY29kZXsnTW9uLCAyMCBOb3YgMTk5NSAxOToxMjowOCAtMDUwMCd9LiAgSWYgaXQgc3VjY2VlZHMgaW4gcGFyc2luZwotdGhlIGRhdGUsIFxmdW5jdGlvbntwYXJzZWRhdGUoKX0gcmV0dXJucyBhIDktdHVwbGUgdGhhdCBjYW4gYmUgcGFzc2VkCi1kaXJlY3RseSB0byBcZnVuY3Rpb257dGltZS5ta3RpbWUoKX07IG90aGVyd2lzZSBcY29kZXtOb25lfSB3aWxsIGJlCi1yZXR1cm5lZC4gIE5vdGUgdGhhdCBpbmRleGVzIDYsIDcsIGFuZCA4IG9mIHRoZSByZXN1bHQgdHVwbGUgYXJlIG5vdAotdXNhYmxlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtwYXJzZWRhdGVfdHp9e2RhdGV9Ci1QZXJmb3JtcyB0aGUgc2FtZSBmdW5jdGlvbiBhcyBcZnVuY3Rpb257cGFyc2VkYXRlKCl9LCBidXQgcmV0dXJucwotZWl0aGVyIFxjb2Rle05vbmV9IG9yIGEgMTAtdHVwbGU7IHRoZSBmaXJzdCA5IGVsZW1lbnRzIG1ha2UgdXAgYSB0dXBsZQotdGhhdCBjYW4gYmUgcGFzc2VkIGRpcmVjdGx5IHRvIFxmdW5jdGlvbnt0aW1lLm1rdGltZSgpfSwgYW5kIHRoZSB0ZW50aAotaXMgdGhlIG9mZnNldCBvZiB0aGUgZGF0ZSdzIHRpbWV6b25lIGZyb20gVVRDICh3aGljaCBpcyB0aGUgb2ZmaWNpYWwKLXRlcm0gZm9yIEdyZWVud2ljaCBNZWFuIFRpbWUpLiAgKE5vdGUgdGhhdCB0aGUgc2lnbiBvZiB0aGUgdGltZXpvbmUKLW9mZnNldCBpcyB0aGUgb3Bwb3NpdGUgb2YgdGhlIHNpZ24gb2YgdGhlIFxjb2Rle3RpbWUudGltZXpvbmV9Ci12YXJpYWJsZSBmb3IgdGhlIHNhbWUgdGltZXpvbmU7IHRoZSBsYXR0ZXIgdmFyaWFibGUgZm9sbG93cyB0aGUKLVxQT1NJWHt9IHN0YW5kYXJkIHdoaWxlIHRoaXMgbW9kdWxlIGZvbGxvd3MgXHJmY3syODIyfS4pICBJZiB0aGUgaW5wdXQKLXN0cmluZyBoYXMgbm8gdGltZXpvbmUsIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIHR1cGxlIHJldHVybmVkIGlzCi1cY29kZXtOb25lfS4gIE5vdGUgdGhhdCBpbmRleGVzIDYsIDcsIGFuZCA4IG9mIHRoZSByZXN1bHQgdHVwbGUgYXJlIG5vdAotdXNhYmxlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtta3RpbWVfdHp9e3R1cGxlfQotVHVybiBhIDEwLXR1cGxlIGFzIHJldHVybmVkIGJ5IFxmdW5jdGlvbntwYXJzZWRhdGVfdHooKX0gaW50byBhIFVUQwotdGltZXN0YW1wLiAgSWYgdGhlIHRpbWV6b25lIGl0ZW0gaW4gdGhlIHR1cGxlIGlzIFxjb2Rle05vbmV9LCBhc3N1bWUKLWxvY2FsIHRpbWUuICBNaW5vciBkZWZpY2llbmN5OiB0aGlzIGZpcnN0IGludGVycHJldHMgdGhlIGZpcnN0IDgKLWVsZW1lbnRzIGFzIGEgbG9jYWwgdGltZSBhbmQgdGhlbiBjb21wZW5zYXRlcyBmb3IgdGhlIHRpbWV6b25lCi1kaWZmZXJlbmNlOyB0aGlzIG1heSB5aWVsZCBhIHNsaWdodCBlcnJvciBhcm91bmQgZGF5bGlnaHQgc2F2aW5ncyB0aW1lCi1zd2l0Y2ggZGF0ZXMuICBOb3QgZW5vdWdoIHRvIHdvcnJ5IGFib3V0IGZvciBjb21tb24gdXNlLgotXGVuZHtmdW5jZGVzY30KLQotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZW1vZHVsZXtlbWFpbH17Q29tcHJlaGVuc2l2ZSBlbWFpbCBoYW5kbGluZyBwYWNrYWdlOyBzdXBlcnNlZGVzCi0gICAgICAgICAgICAgICAgICAgIHRoZSBcbW9kdWxle3JmYzgyMn0gbW9kdWxlLn0KLSAgXHNlZW1vZHVsZXttYWlsYm94fXtDbGFzc2VzIHRvIHJlYWQgdmFyaW91cyBtYWlsYm94IGZvcm1hdHMgcHJvZHVjZWQgCi0gICAgICAgICAgICAgICAgICAgICAgYnkgZW5kLXVzZXIgbWFpbCBwcm9ncmFtcy59Ci0gIFxzZWVtb2R1bGV7bWltZXRvb2xzfXtTdWJjbGFzcyBvZiBcY2xhc3N7cmZjODIyLk1lc3NhZ2V9IHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXMgTUlNRSBlbmNvZGVkIG1lc3NhZ2VzLn0gCi1cZW5ke3NlZWFsc299Ci0KLQotXHN1YnNlY3Rpb257TWVzc2FnZSBPYmplY3RzIFxsYWJlbHttZXNzYWdlLW9iamVjdHN9fQotCi1BIFxjbGFzc3tNZXNzYWdlfSBpbnN0YW5jZSBoYXMgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotCi1cYmVnaW57bWV0aG9kZGVzY31bTWVzc2FnZV17cmV3aW5kYm9keX17fQotU2VlayB0byB0aGUgc3RhcnQgb2YgdGhlIG1lc3NhZ2UgYm9keS4gIFRoaXMgb25seSB3b3JrcyBpZiB0aGUgZmlsZQotb2JqZWN0IGlzIHNlZWthYmxlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTWVzc2FnZV17aXNoZWFkZXJ9e2xpbmV9Ci1SZXR1cm5zIGEgbGluZSdzIGNhbm9uaWNhbGl6ZWQgZmllbGRuYW1lICh0aGUgZGljdGlvbmFyeSBrZXkgdGhhdCB3aWxsCi1iZSB1c2VkIHRvIGluZGV4IGl0KSBpZiB0aGUgbGluZSBpcyBhIGxlZ2FsIFxyZmN7MjgyMn0gaGVhZGVyOyBvdGhlcndpc2UKLXJldHVybnMgXGNvZGV7Tm9uZX0gKGltcGx5aW5nIHRoYXQgcGFyc2luZyBzaG91bGQgc3RvcCBoZXJlIGFuZCB0aGUKLWxpbmUgYmUgcHVzaGVkIGJhY2sgb24gdGhlIGlucHV0IHN0cmVhbSkuICBJdCBpcyBzb21ldGltZXMgdXNlZnVsIHRvCi1vdmVycmlkZSB0aGlzIG1ldGhvZCBpbiBhIHN1YmNsYXNzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTWVzc2FnZV17aXNsYXN0fXtsaW5lfQotUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGxpbmUgaXMgYSBkZWxpbWl0ZXIgb24gd2hpY2ggTWVzc2FnZSBzaG91bGQKLXN0b3AuICBUaGUgZGVsaW1pdGVyIGxpbmUgaXMgY29uc3VtZWQsIGFuZCB0aGUgZmlsZSBvYmplY3QncyByZWFkCi1sb2NhdGlvbiBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5IGFmdGVyIGl0LiAgQnkgZGVmYXVsdCB0aGlzIG1ldGhvZCBqdXN0Ci1jaGVja3MgdGhhdCB0aGUgbGluZSBpcyBibGFuaywgYnV0IHlvdSBjYW4gb3ZlcnJpZGUgaXQgaW4gYSBzdWJjbGFzcy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W01lc3NhZ2Vde2lzY29tbWVudH17bGluZX0KLVJldHVybiBcY29kZXtUcnVlfSBpZiB0aGUgZ2l2ZW4gbGluZSBzaG91bGQgYmUgaWdub3JlZCBlbnRpcmVseSwganVzdCBza2lwcGVkLgotQnkgZGVmYXVsdCB0aGlzIGlzIGEgc3R1YiB0aGF0IGFsd2F5cyByZXR1cm5zIFxjb2Rle0ZhbHNlfSwgYnV0IHlvdSBjYW4KLW92ZXJyaWRlIGl0IGluIGEgc3ViY2xhc3MuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtNZXNzYWdlXXtnZXRhbGxtYXRjaGluZ2hlYWRlcnN9e25hbWV9Ci1SZXR1cm4gYSBsaXN0IG9mIGxpbmVzIGNvbnNpc3Rpbmcgb2YgYWxsIGhlYWRlcnMgbWF0Y2hpbmcKLVx2YXJ7bmFtZX0sIGlmIGFueS4gIEVhY2ggcGh5c2ljYWwgbGluZSwgd2hldGhlciBpdCBpcyBhIGNvbnRpbnVhdGlvbgotbGluZSBvciBub3QsIGlzIGEgc2VwYXJhdGUgbGlzdCBpdGVtLiAgUmV0dXJuIHRoZSBlbXB0eSBsaXN0IGlmIG5vCi1oZWFkZXIgbWF0Y2hlcyBcdmFye25hbWV9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTWVzc2FnZV17Z2V0Zmlyc3RtYXRjaGluZ2hlYWRlcn17bmFtZX0KLVJldHVybiBhIGxpc3Qgb2YgbGluZXMgY29tcHJpc2luZyB0aGUgZmlyc3QgaGVhZGVyIG1hdGNoaW5nCi1cdmFye25hbWV9LCBhbmQgaXRzIGNvbnRpbnVhdGlvbiBsaW5lKHMpLCBpZiBhbnkuICBSZXR1cm4KLVxjb2Rle05vbmV9IGlmIHRoZXJlIGlzIG5vIGhlYWRlciBtYXRjaGluZyBcdmFye25hbWV9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTWVzc2FnZV17Z2V0cmF3aGVhZGVyfXtuYW1lfQotUmV0dXJuIGEgc2luZ2xlIHN0cmluZyBjb25zaXN0aW5nIG9mIHRoZSB0ZXh0IGFmdGVyIHRoZSBjb2xvbiBpbiB0aGUKLWZpcnN0IGhlYWRlciBtYXRjaGluZyBcdmFye25hbWV9LiAgVGhpcyBpbmNsdWRlcyBsZWFkaW5nIHdoaXRlc3BhY2UsCi10aGUgdHJhaWxpbmcgbGluZWZlZWQsIGFuZCBpbnRlcm5hbCBsaW5lZmVlZHMgYW5kIHdoaXRlc3BhY2UgaWYgdGhlcmUKLWFueSBjb250aW51YXRpb24gbGluZShzKSB3ZXJlIHByZXNlbnQuICBSZXR1cm4gXGNvZGV7Tm9uZX0gaWYgdGhlcmUgaXMKLW5vIGhlYWRlciBtYXRjaGluZyBcdmFye25hbWV9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTWVzc2FnZV17Z2V0aGVhZGVyfXtuYW1lXG9wdGlvbmFseywgZGVmYXVsdH19Ci1MaWtlIFxjb2Rle2dldHJhd2hlYWRlcihcdmFye25hbWV9KX0sIGJ1dCBzdHJpcCBsZWFkaW5nIGFuZCB0cmFpbGluZwotd2hpdGVzcGFjZS4gIEludGVybmFsIHdoaXRlc3BhY2UgaXMgbm90IHN0cmlwcGVkLiAgVGhlIG9wdGlvbmFsCi1cdmFye2RlZmF1bHR9IGFyZ3VtZW50IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgZGVmYXVsdCB0bwotYmUgcmV0dXJuZWQgd2hlbiB0aGVyZSBpcyBubyBoZWFkZXIgbWF0Y2hpbmcgXHZhcntuYW1lfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W01lc3NhZ2Vde2dldH17bmFtZVxvcHRpb25hbHssIGRlZmF1bHR9fQotQW4gYWxpYXMgZm9yIFxtZXRob2R7Z2V0aGVhZGVyKCl9LCB0byBtYWtlIHRoZSBpbnRlcmZhY2UgbW9yZSBjb21wYXRpYmxlIAotd2l0aCByZWd1bGFyIGRpY3Rpb25hcmllcy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W01lc3NhZ2Vde2dldGFkZHJ9e25hbWV9Ci1SZXR1cm4gYSBwYWlyIFxjb2RleyhcdmFye2Z1bGwgbmFtZX0sIFx2YXJ7ZW1haWwgYWRkcmVzc30pfSBwYXJzZWQKLWZyb20gdGhlIHN0cmluZyByZXR1cm5lZCBieSBcY29kZXtnZXRoZWFkZXIoXHZhcntuYW1lfSl9LiAgSWYgbm8KLWhlYWRlciBtYXRjaGluZyBcdmFye25hbWV9IGV4aXN0cywgcmV0dXJuIFxjb2RleyhOb25lLCBOb25lKX07Ci1vdGhlcndpc2UgYm90aCB0aGUgZnVsbCBuYW1lIGFuZCB0aGUgYWRkcmVzcyBhcmUgKHBvc3NpYmx5IGVtcHR5KQotc3RyaW5ncy4KLQotRXhhbXBsZTogSWYgXHZhcnttfSdzIGZpcnN0IFxtYWlsaGVhZGVye0Zyb219IGhlYWRlciBjb250YWlucyB0aGUKLXN0cmluZyBcY29kZXsnamFja0Bjd2kubmwgKEphY2sgSmFuc2VuKSd9LCB0aGVuCi1cY29kZXttLmdldGFkZHIoJ0Zyb20nKX0gd2lsbCB5aWVsZCB0aGUgcGFpcgotXGNvZGV7KCdKYWNrIEphbnNlbicsICdqYWNrQGN3aS5ubCcpfS4KLUlmIHRoZSBoZWFkZXIgY29udGFpbmVkCi1cY29kZXsnSmFjayBKYW5zZW4gPGphY2tAY3dpLm5sPid9IGluc3RlYWQsIGl0IHdvdWxkIHlpZWxkIHRoZQotZXhhY3Qgc2FtZSByZXN1bHQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtNZXNzYWdlXXtnZXRhZGRybGlzdH17bmFtZX0KLVRoaXMgaXMgc2ltaWxhciB0byBcY29kZXtnZXRhZGRyKFx2YXJ7bGlzdH0pfSwgYnV0IHBhcnNlcyBhIGhlYWRlcgotY29udGFpbmluZyBhIGxpc3Qgb2YgZW1haWwgYWRkcmVzc2VzIChlLmcuXCBhIFxtYWlsaGVhZGVye1RvfSBoZWFkZXIpIGFuZAotcmV0dXJucyBhIGxpc3Qgb2YgXGNvZGV7KFx2YXJ7ZnVsbCBuYW1lfSwgXHZhcntlbWFpbCBhZGRyZXNzfSl9IHBhaXJzCi0oZXZlbiBpZiB0aGVyZSB3YXMgb25seSBvbmUgYWRkcmVzcyBpbiB0aGUgaGVhZGVyKS4gIElmIHRoZXJlIGlzIG5vCi1oZWFkZXIgbWF0Y2hpbmcgXHZhcntuYW1lfSwgcmV0dXJuIGFuIGVtcHR5IGxpc3QuCi0KLUlmIG11bHRpcGxlIGhlYWRlcnMgZXhpc3QgdGhhdCBtYXRjaCB0aGUgbmFtZWQgaGVhZGVyIChlLmcuIGlmIHRoZXJlCi1hcmUgc2V2ZXJhbCBcbWFpbGhlYWRlcntDY30gaGVhZGVycyksIGFsbCBhcmUgcGFyc2VkIGZvciBhZGRyZXNzZXMuCi1BbnkgY29udGludWF0aW9uIGxpbmVzIHRoZSBuYW1lZCBoZWFkZXJzIGNvbnRhaW4gYXJlIGFsc28gcGFyc2VkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTWVzc2FnZV17Z2V0ZGF0ZX17bmFtZX0KLVJldHJpZXZlIGEgaGVhZGVyIHVzaW5nIFxtZXRob2R7Z2V0aGVhZGVyKCl9IGFuZCBwYXJzZSBpdCBpbnRvIGEgOS10dXBsZQotY29tcGF0aWJsZSB3aXRoIFxmdW5jdGlvbnt0aW1lLm1rdGltZSgpfTsgbm90ZSB0aGF0IGZpZWxkcyA2LCA3LCBhbmQgOCAKLWFyZSBub3QgdXNhYmxlLiAgSWYgdGhlcmUgaXMgbm8gaGVhZGVyIG1hdGNoaW5nCi1cdmFye25hbWV9LCBvciBpdCBpcyB1bnBhcnNhYmxlLCByZXR1cm4gXGNvZGV7Tm9uZX0uCi0KLURhdGUgcGFyc2luZyBhcHBlYXJzIHRvIGJlIGEgYmxhY2sgYXJ0LCBhbmQgbm90IGFsbCBtYWlsZXJzIGFkaGVyZSB0bwotdGhlIHN0YW5kYXJkLiAgV2hpbGUgaXQgaGFzIGJlZW4gdGVzdGVkIGFuZCBmb3VuZCBjb3JyZWN0IG9uIGEgbGFyZ2UKLWNvbGxlY3Rpb24gb2YgZW1haWwgZnJvbSBtYW55IHNvdXJjZXMsIGl0IGlzIHN0aWxsIHBvc3NpYmxlIHRoYXQgdGhpcwotZnVuY3Rpb24gbWF5IG9jY2FzaW9uYWxseSB5aWVsZCBhbiBpbmNvcnJlY3QgcmVzdWx0LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTWVzc2FnZV17Z2V0ZGF0ZV90en17bmFtZX0KLVJldHJpZXZlIGEgaGVhZGVyIHVzaW5nIFxtZXRob2R7Z2V0aGVhZGVyKCl9IGFuZCBwYXJzZSBpdCBpbnRvIGEKLTEwLXR1cGxlOyB0aGUgZmlyc3QgOSBlbGVtZW50cyB3aWxsIG1ha2UgYSB0dXBsZSBjb21wYXRpYmxlIHdpdGgKLVxmdW5jdGlvbnt0aW1lLm1rdGltZSgpfSwgYW5kIHRoZSAxMHRoIGlzIGEgbnVtYmVyIGdpdmluZyB0aGUgb2Zmc2V0Ci1vZiB0aGUgZGF0ZSdzIHRpbWV6b25lIGZyb20gVVRDLiAgTm90ZSB0aGF0IGZpZWxkcyA2LCA3LCBhbmQgOCAKLWFyZSBub3QgdXNhYmxlLiAgU2ltaWxhcmx5IHRvIFxtZXRob2R7Z2V0ZGF0ZSgpfSwgaWYKLXRoZXJlIGlzIG5vIGhlYWRlciBtYXRjaGluZyBcdmFye25hbWV9LCBvciBpdCBpcyB1bnBhcnNhYmxlLCByZXR1cm4KLVxjb2Rle05vbmV9LiAKLVxlbmR7bWV0aG9kZGVzY30KLQotXGNsYXNze01lc3NhZ2V9IGluc3RhbmNlcyBhbHNvIHN1cHBvcnQgYSBsaW1pdGVkIG1hcHBpbmcgaW50ZXJmYWNlLgotSW4gcGFydGljdWxhcjogXGNvZGV7XHZhcnttfVtuYW1lXX0gaXMgbGlrZQotXGNvZGV7XHZhcnttfS5nZXRoZWFkZXIobmFtZSl9IGJ1dCByYWlzZXMgXGV4Y2VwdGlvbntLZXlFcnJvcn0gaWYKLXRoZXJlIGlzIG5vIG1hdGNoaW5nIGhlYWRlcjsgYW5kIFxjb2Rle2xlbihcdmFye219KX0sCi1cY29kZXtcdmFye219LmdldChcdmFye25hbWV9XG9wdGlvbmFseywgXHZhcntkZWZhdWx0fX0pfSwKLVxjb2Rle1x2YXJ7bX0uaGFzX2tleShcdmFye25hbWV9KX0sIFxjb2Rle1x2YXJ7bX0ua2V5cygpfSwKLVxjb2Rle1x2YXJ7bX0udmFsdWVzKCl9IFxjb2Rle1x2YXJ7bX0uaXRlbXMoKX0sIGFuZAotXGNvZGV7XHZhcnttfS5zZXRkZWZhdWx0KFx2YXJ7bmFtZX1cb3B0aW9uYWx7LCBcdmFye2RlZmF1bHR9fSl9IGFjdCBhcwotZXhwZWN0ZWQsIHdpdGggdGhlIG9uZSBkaWZmZXJlbmNlIHRoYXQgXG1ldGhvZHtzZXRkZWZhdWx0KCl9IHVzZXMKLWFuIGVtcHR5IHN0cmluZyBhcyB0aGUgZGVmYXVsdCB2YWx1ZS4gIFxjbGFzc3tNZXNzYWdlfSBpbnN0YW5jZXMKLWFsc28gc3VwcG9ydCB0aGUgbWFwcGluZyB3cml0YWJsZSBpbnRlcmZhY2UgXGNvZGV7XHZhcnttfVtuYW1lXSA9Ci12YWx1ZX0gYW5kIFxjb2Rle2RlbCBcdmFye219W25hbWVdfS4gIFxjbGFzc3tNZXNzYWdlfSBvYmplY3RzIGRvIG5vdAotc3VwcG9ydCB0aGUgXG1ldGhvZHtjbGVhcigpfSwgXG1ldGhvZHtjb3B5KCl9LCBcbWV0aG9ke3BvcGl0ZW0oKX0sIG9yCi1cbWV0aG9ke3VwZGF0ZSgpfSBtZXRob2RzIG9mIHRoZSBtYXBwaW5nIGludGVyZmFjZS4gIChTdXBwb3J0IGZvcgotXG1ldGhvZHtnZXQoKX0gYW5kIFxtZXRob2R7c2V0ZGVmYXVsdCgpfSB3YXMgb25seSBhZGRlZCBpbiBQeXRob24KLTIuMi4pCi0KLUZpbmFsbHksIFxjbGFzc3tNZXNzYWdlfSBpbnN0YW5jZXMgaGF2ZSBzb21lIHB1YmxpYyBpbnN0YW5jZSB2YXJpYWJsZXM6Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtNZXNzYWdlXXtoZWFkZXJzfQotQSBsaXN0IGNvbnRhaW5pbmcgdGhlIGVudGlyZSBzZXQgb2YgaGVhZGVyIGxpbmVzLCBpbiB0aGUgb3JkZXIgaW4KLXdoaWNoIHRoZXkgd2VyZSByZWFkIChleGNlcHQgdGhhdCBzZXRpdGVtIGNhbGxzIG1heSBkaXN0dXJiIHRoaXMKLW9yZGVyKS4gRWFjaCBsaW5lIGNvbnRhaW5zIGEgdHJhaWxpbmcgbmV3bGluZS4gIFRoZQotYmxhbmsgbGluZSB0ZXJtaW5hdGluZyB0aGUgaGVhZGVycyBpcyBub3QgY29udGFpbmVkIGluIHRoZSBsaXN0LgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bTWVzc2FnZV17ZnB9Ci1UaGUgZmlsZSBvciBmaWxlLWxpa2Ugb2JqZWN0IHBhc3NlZCBhdCBpbnN0YW50aWF0aW9uIHRpbWUuICBUaGlzIGNhbgotYmUgdXNlZCB0byByZWFkIHRoZSBtZXNzYWdlIGNvbnRlbnQuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtNZXNzYWdlXXt1bml4ZnJvbX0KLVRoZSBcVU5JWHt9IFxzYW1we0Zyb21+fSBsaW5lLCBpZiB0aGUgbWVzc2FnZSBoYWQgb25lLCBvciBhbiBlbXB0eQotc3RyaW5nLiAgVGhpcyBpcyBuZWVkZWQgdG8gcmVnZW5lcmF0ZSB0aGUgbWVzc2FnZSBpbiBzb21lIGNvbnRleHRzLAotc3VjaCBhcyBhbiBcY29kZXttYm94fS1zdHlsZSBtYWlsYm94IGZpbGUuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLQotXHN1YnNlY3Rpb257QWRkcmVzc0xpc3QgT2JqZWN0cyBcbGFiZWx7YWRkcmVzc2xpc3Qtb2JqZWN0c319Ci0KLUFuIFxjbGFzc3tBZGRyZXNzTGlzdH0gaW5zdGFuY2UgaGFzIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLQotXGJlZ2lue21ldGhvZGRlc2N9W0FkZHJlc3NMaXN0XXtfX2xlbl9ffXt9Ci1SZXR1cm4gdGhlIG51bWJlciBvZiBhZGRyZXNzZXMgaW4gdGhlIGFkZHJlc3MgbGlzdC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0FkZHJlc3NMaXN0XXtfX3N0cl9ffXt9Ci1SZXR1cm4gYSBjYW5vbmljYWxpemVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWRkcmVzcyBsaXN0LgotQWRkcmVzc2VzIGFyZSByZW5kZXJlZCBpbiAibmFtZSIgPGhvc3RAZG9tYWluPiBmb3JtLCBjb21tYS1zZXBhcmF0ZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtBZGRyZXNzTGlzdF17X19hZGRfX317YWxpc3R9Ci1SZXR1cm4gYSBuZXcgXGNsYXNze0FkZHJlc3NMaXN0fSBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIGFsbCBhZGRyZXNzZXMKLWluIGJvdGggXGNsYXNze0FkZHJlc3NMaXN0fSBvcGVyYW5kcywgd2l0aCBkdXBsaWNhdGVzIHJlbW92ZWQgKHNldAotdW5pb24pLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQWRkcmVzc0xpc3Rde19faWFkZF9ffXthbGlzdH0KLUluLXBsYWNlIHZlcnNpb24gb2YgXG1ldGhvZHtfX2FkZF9fKCl9OyB0dXJucyB0aGlzIFxjbGFzc3tBZGRyZXNzTGlzdH0KLWluc3RhbmNlIGludG8gdGhlIHVuaW9uIG9mIGl0c2VsZiBhbmQgdGhlIHJpZ2h0LWhhbmQgaW5zdGFuY2UsCi1cdmFye2FsaXN0fS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0FkZHJlc3NMaXN0XXtfX3N1Yl9ffXthbGlzdH0KLVJldHVybiBhIG5ldyBcY2xhc3N7QWRkcmVzc0xpc3R9IGluc3RhbmNlIHRoYXQgY29udGFpbnMgZXZlcnkgYWRkcmVzcwotaW4gdGhlIGxlZnQtaGFuZCBcY2xhc3N7QWRkcmVzc0xpc3R9IG9wZXJhbmQgdGhhdCBpcyBub3QgcHJlc2VudCBpbgotdGhlIHJpZ2h0LWhhbmQgYWRkcmVzcyBvcGVyYW5kIChzZXQgZGlmZmVyZW5jZSkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtBZGRyZXNzTGlzdF17X19pc3ViX199e2FsaXN0fQotSW4tcGxhY2UgdmVyc2lvbiBvZiBcbWV0aG9ke19fc3ViX18oKX0sIHJlbW92aW5nIGFkZHJlc3NlcyBpbiB0aGlzCi1saXN0IHdoaWNoIGFyZSBhbHNvIGluIFx2YXJ7YWxpc3R9LgotXGVuZHttZXRob2RkZXNjfQotCi0KLUZpbmFsbHksIFxjbGFzc3tBZGRyZXNzTGlzdH0gaW5zdGFuY2VzIGhhdmUgb25lIHB1YmxpYyBpbnN0YW5jZSB2YXJpYWJsZToKLQotXGJlZ2lue21lbWJlcmRlc2N9W0FkZHJlc3NMaXN0XXthZGRyZXNzbGlzdH0KLUEgbGlzdCBvZiB0dXBsZSBzdHJpbmcgcGFpcnMsIG9uZSBwZXIgYWRkcmVzcy4gIEluIGVhY2ggbWVtYmVyLCB0aGUKLWZpcnN0IGlzIHRoZSBjYW5vbmljYWxpemVkIG5hbWUgcGFydCwgdGhlIHNlY29uZCBpcyB0aGUKLWFjdHVhbCByb3V0ZS1hZGRyZXNzIChcY2hhcmFjdGVye0B9LXNlcGFyYXRlZCB1c2VybmFtZS1ob3N0LmRvbWFpbgotcGFpcikuCi1cZW5ke21lbWJlcmRlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnJsY29tcGxldGVyLnRleCBiL0RvYy9saWIvbGlicmxjb21wbGV0ZXIudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjJhYzU5Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlicmxjb21wbGV0ZXIudGV4CisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtybGNvbXBsZXRlcn0gLS0tCi0gICAgICAgICBDb21wbGV0aW9uIGZ1bmN0aW9uIGZvciBHTlUgcmVhZGxpbmV9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtybGNvbXBsZXRlcn0KLVxzZWN0aW9uYXV0aG9ye01vc2hlIFphZGthfXttb3NoZXpAemFka2Euc2l0ZS5jby5pbH0KLVxtb2R1bGVzeW5vcHNpc3tQeXRob24gaWRlbnRpZmllciBjb21wbGV0aW9uLCBzdWl0YWJsZSBmb3IgdGhlIEdOVSByZWFkbGluZSBsaWJyYXJ5Ln0KLQotVGhlIFxtb2R1bGV7cmxjb21wbGV0ZXJ9IG1vZHVsZSBkZWZpbmVzIGEgY29tcGxldGlvbiBmdW5jdGlvbiBzdWl0YWJsZSBmb3IKLXRoZSBccmVmbW9kdWxle3JlYWRsaW5lfSBtb2R1bGUgYnkgY29tcGxldGluZyB2YWxpZCBQeXRob24gaWRlbnRpZmllcnMKLWFuZCBrZXl3b3Jkcy4KLQotV2hlbiB0aGlzIG1vZHVsZSBpcyBpbXBvcnRlZCBvbiBhIFxVTklYXCBwbGF0Zm9ybSB3aXRoIHRoZSBcbW9kdWxle3JlYWRsaW5lfQotbW9kdWxlIGF2YWlsYWJsZSwgYW4gaW5zdGFuY2Ugb2YgdGhlIFxjbGFzc3tDb21wbGV0ZXJ9IGNsYXNzIGlzIGF1dG9tYXRpY2FsbHkKLWNyZWF0ZWQgYW5kIGl0cyBcbWV0aG9ke2NvbXBsZXRlfSBtZXRob2QgaXMgc2V0IGFzIHRoZSBcbW9kdWxle3JlYWRsaW5lfQotY29tcGxldGVyLgotCi1FeGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gaW1wb3J0IHJsY29tcGxldGVyCi0+Pj4gaW1wb3J0IHJlYWRsaW5lCi0+Pj4gcmVhZGxpbmUucGFyc2VfYW5kX2JpbmQoInRhYjogY29tcGxldGUiKQotPj4+IHJlYWRsaW5lLiA8VEFCIFBSRVNTRUQ+Ci1yZWFkbGluZS5fX2RvY19fICAgICAgICAgIHJlYWRsaW5lLmdldF9saW5lX2J1ZmZlciAgcmVhZGxpbmUucmVhZF9pbml0X2ZpbGUKLXJlYWRsaW5lLl9fZmlsZV9fICAgICAgICAgcmVhZGxpbmUuaW5zZXJ0X3RleHQgICAgICByZWFkbGluZS5zZXRfY29tcGxldGVyCi1yZWFkbGluZS5fX25hbWVfXyAgICAgICAgIHJlYWRsaW5lLnBhcnNlX2FuZF9iaW5kCi0+Pj4gcmVhZGxpbmUuCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgXG1vZHVsZXtybGNvbXBsZXRlcn0gbW9kdWxlIGlzIGRlc2lnbmVkIGZvciB1c2Ugd2l0aCBQeXRob24ncwotaW50ZXJhY3RpdmUgbW9kZS4gIEEgdXNlciBjYW4gYWRkIHRoZSBmb2xsb3dpbmcgbGluZXMgdG8gaGlzIG9yIGhlcgotaW5pdGlhbGl6YXRpb24gZmlsZSAoaWRlbnRpZmllZCBieSB0aGUgXGVudnZhcntQWVRIT05TVEFSVFVQfQotZW52aXJvbm1lbnQgdmFyaWFibGUpIHRvIGdldCBhdXRvbWF0aWMgXGtiZHtUYWJ9IGNvbXBsZXRpb246Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXRyeToKLSAgICBpbXBvcnQgcmVhZGxpbmUKLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICBwcmludCAiTW9kdWxlIHJlYWRsaW5lIG5vdCBhdmFpbGFibGUuIgotZWxzZToKLSAgICBpbXBvcnQgcmxjb21wbGV0ZXIKLSAgICByZWFkbGluZS5wYXJzZV9hbmRfYmluZCgidGFiOiBjb21wbGV0ZSIpCi1cZW5ke3ZlcmJhdGltfQotCi0KLU9uIHBsYXRmb3JtcyB3aXRob3V0IFxtb2R1bGV7cmVhZGxpbmV9LCB0aGUgXGNsYXNze0NvbXBsZXRlcn0gY2xhc3MgZGVmaW5lZAotYnkgdGhpcyBtb2R1bGUgY2FuIHN0aWxsIGJlIHVzZWQgZm9yIGN1c3RvbSBwdXJwb3Nlcy4KLQotXHN1YnNlY3Rpb257Q29tcGxldGVyIE9iamVjdHMgXGxhYmVse2NvbXBsZXRlci1vYmplY3RzfX0KLQotQ29tcGxldGVyIG9iamVjdHMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZDoKLQotXGJlZ2lue21ldGhvZGRlc2N9W0NvbXBsZXRlcl17Y29tcGxldGV9e3RleHQsIHN0YXRlfQotUmV0dXJuIHRoZSBcdmFye3N0YXRlfXRoIGNvbXBsZXRpb24gZm9yIFx2YXJ7dGV4dH0uCi0KLUlmIGNhbGxlZCBmb3IgXHZhcnt0ZXh0fSB0aGF0IGRvZXNuJ3QgaW5jbHVkZSBhIHBlcmlvZCBjaGFyYWN0ZXIKLShcY2hhcmFjdGVyey59KSwgaXQgd2lsbCBjb21wbGV0ZSBmcm9tIG5hbWVzIGN1cnJlbnRseSBkZWZpbmVkIGluCi1ccmVmbW9kdWxlW21haW5de19fbWFpbl9ffSwgXHJlZm1vZHVsZVtidWlsdGluXXtfX2J1aWx0aW5fX30gYW5kCi1rZXl3b3JkcyAoYXMgZGVmaW5lZCBieSB0aGUgXHJlZm1vZHVsZXtrZXl3b3JkfSBtb2R1bGUpLgotCi1JZiBjYWxsZWQgZm9yIGEgZG90dGVkIG5hbWUsIGl0IHdpbGwgdHJ5IHRvIGV2YWx1YXRlIGFueXRoaW5nIHdpdGhvdXQKLW9idmlvdXMgc2lkZS1lZmZlY3RzIChmdW5jdGlvbnMgd2lsbCBub3QgYmUgZXZhbHVhdGVkLCBidXQgaXQKLWNhbiBnZW5lcmF0ZSBjYWxscyB0byBcbWV0aG9ke19fZ2V0YXR0cl9fKCl9KSB1cCB0byB0aGUgbGFzdCBwYXJ0LCBhbmQKLWZpbmQgbWF0Y2hlcyBmb3IgdGhlIHJlc3QgdmlhIHRoZSBcZnVuY3Rpb257ZGlyKCl9IGZ1bmN0aW9uLgotXGVuZHttZXRob2RkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJyb2JvdHBhcnNlci50ZXggYi9Eb2MvbGliL2xpYnJvYm90cGFyc2VyLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVhYzUyOC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnJvYm90cGFyc2VyLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7cm9ib3RwYXJzZXJ9IC0tLSAKLSAgICAgICAgIFBhcnNlciBmb3Igcm9ib3RzLnR4dH0KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e3JvYm90cGFyc2VyfQotXG1vZHVsZXN5bm9wc2lze0xvYWRzIGEgXHByb3RlY3RcZmlsZXtyb2JvdHMudHh0fSBmaWxlIGFuZAotICAgICAgICAgICAgICAgIGFuc3dlcnMgcXVlc3Rpb25zIGFib3V0IGZldGNoYWJpbGl0eSBvZiBvdGhlciBVUkxzLn0KLVxzZWN0aW9uYXV0aG9ye1NraXAgTW9udGFuYXJvfXtza2lwQG1vamFtLmNvbX0KLQotXGluZGV4e1dXV30KLVxpbmRleHtXb3JsZCBXaWRlIFdlYn0KLVxpbmRleHtVUkx9Ci1caW5kZXh7cm9ib3RzLnR4dH0KLQotVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBzaW5nbGUgY2xhc3MsIFxjbGFzc3tSb2JvdEZpbGVQYXJzZXJ9LCB3aGljaCBhbnN3ZXJzCi1xdWVzdGlvbnMgYWJvdXQgd2hldGhlciBvciBub3QgYSBwYXJ0aWN1bGFyIHVzZXIgYWdlbnQgY2FuIGZldGNoIGEgVVJMIG9uCi10aGUgV2ViIHNpdGUgdGhhdCBwdWJsaXNoZWQgdGhlIFxmaWxle3JvYm90cy50eHR9IGZpbGUuICBGb3IgbW9yZSBkZXRhaWxzIG9uIAotdGhlIHN0cnVjdHVyZSBvZiBcZmlsZXtyb2JvdHMudHh0fSBmaWxlcywgc2VlCi1cdXJse2h0dHA6Ly93d3cucm9ib3RzdHh0Lm9yZy93Yy9ub3JvYm90cy5odG1sfS4gCi0KLVxiZWdpbntjbGFzc2Rlc2N9e1JvYm90RmlsZVBhcnNlcn17fQotCi1UaGlzIGNsYXNzIHByb3ZpZGVzIGEgc2V0IG9mIG1ldGhvZHMgdG8gcmVhZCwgcGFyc2UgYW5kIGFuc3dlciBxdWVzdGlvbnMKLWFib3V0IGEgc2luZ2xlIFxmaWxle3JvYm90cy50eHR9IGZpbGUuCi0KLVxiZWdpbnttZXRob2RkZXNjfXtzZXRfdXJsfXt1cmx9Ci1TZXRzIHRoZSBVUkwgcmVmZXJyaW5nIHRvIGEgXGZpbGV7cm9ib3RzLnR4dH0gZmlsZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3JlYWR9e30KLVJlYWRzIHRoZSBcZmlsZXtyb2JvdHMudHh0fSBVUkwgYW5kIGZlZWRzIGl0IHRvIHRoZSBwYXJzZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtwYXJzZX17bGluZXN9Ci1QYXJzZXMgdGhlIGxpbmVzIGFyZ3VtZW50LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Y2FuX2ZldGNofXt1c2VyYWdlbnQsIHVybH0KLVJldHVybnMgXGNvZGV7VHJ1ZX0gaWYgdGhlIFx2YXJ7dXNlcmFnZW50fSBpcyBhbGxvd2VkIHRvIGZldGNoIHRoZSBcdmFye3VybH0KLWFjY29yZGluZyB0byB0aGUgcnVsZXMgY29udGFpbmVkIGluIHRoZSBwYXJzZWQgXGZpbGV7cm9ib3RzLnR4dH0gZmlsZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e210aW1lfXt9Ci1SZXR1cm5zIHRoZSB0aW1lIHRoZSBcY29kZXtyb2JvdHMudHh0fSBmaWxlIHdhcyBsYXN0IGZldGNoZWQuICBUaGlzIGlzCi11c2VmdWwgZm9yIGxvbmctcnVubmluZyB3ZWIgc3BpZGVycyB0aGF0IG5lZWQgdG8gY2hlY2sgZm9yIG5ldwotXGNvZGV7cm9ib3RzLnR4dH0gZmlsZXMgcGVyaW9kaWNhbGx5LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317bW9kaWZpZWR9e30KLVNldHMgdGhlIHRpbWUgdGhlIFxjb2Rle3JvYm90cy50eHR9IGZpbGUgd2FzIGxhc3QgZmV0Y2hlZCB0byB0aGUgY3VycmVudAotdGltZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgYmFzaWMgdXNlIG9mIHRoZSBSb2JvdEZpbGVQYXJzZXIgY2xhc3MuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgcm9ib3RwYXJzZXIKLT4+PiBycCA9IHJvYm90cGFyc2VyLlJvYm90RmlsZVBhcnNlcigpCi0+Pj4gcnAuc2V0X3VybCgiaHR0cDovL3d3dy5tdXNpLWNhbC5jb20vcm9ib3RzLnR4dCIpCi0+Pj4gcnAucmVhZCgpCi0+Pj4gcnAuY2FuX2ZldGNoKCIqIiwgImh0dHA6Ly93d3cubXVzaS1jYWwuY29tL2NnaS1iaW4vc2VhcmNoP2NpdHk9U2FuK0ZyYW5jaXNjbyIpCi1GYWxzZQotPj4+IHJwLmNhbl9mZXRjaCgiKiIsICJodHRwOi8vd3d3Lm11c2ktY2FsLmNvbS8iKQotVHJ1ZQotXGVuZHt2ZXJiYXRpbX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlicnVucHkudGV4IGIvRG9jL2xpYi9saWJydW5weS50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNzA3Y2EuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJydW5weS50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3J1bnB5fSAtLS0KLSAgICAgICAgIExvY2F0aW5nIGFuZCBleGVjdXRpbmcgUHl0aG9uIG1vZHVsZXMufQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17cnVucHl9CQklIHN0YW5kYXJkIGxpYnJhcnksIGluIFB5dGhvbgotCi1cbW9kdWxlYXV0aG9ye05pY2sgQ29naGxhbn17bmNvZ2hsYW5AZ21haWwuY29tfQotCi1cbW9kdWxlc3lub3BzaXN7TG9jYXRlIGFuZCBleGVjdXRlIFB5dGhvbiBtb2R1bGVzIGFzIHNjcmlwdHN9Ci0KLVx2ZXJzaW9uYWRkZWR7Mi41fQotCi1UaGUgXG1vZHVsZXtydW5weX0gbW9kdWxlIGlzIHVzZWQgdG8gbG9jYXRlIGFuZCBydW4gUHl0aG9uIG1vZHVsZXMKLXdpdGhvdXQgaW1wb3J0aW5nIHRoZW0gZmlyc3QuIEl0cyBtYWluIHVzZSBpcyB0byBpbXBsZW1lbnQgdGhlCi1ccHJvZ3JhbW9wdHstbX0gY29tbWFuZCBsaW5lIHN3aXRjaCB0aGF0IGFsbG93cyBzY3JpcHRzIHRvIGJlIGxvY2F0ZWQKLXVzaW5nIHRoZSBQeXRob24gbW9kdWxlIG5hbWVzcGFjZSByYXRoZXIgdGhhbiB0aGUgZmlsZXN5c3RlbS4KLQotV2hlbiBleGVjdXRlZCBhcyBhIHNjcmlwdCwgdGhlIG1vZHVsZSBlZmZlY3RpdmVseSBvcGVyYXRlcyBhcyBmb2xsb3dzOgotXGJlZ2lue3ZlcmJhdGltfQotICAgIGRlbCBzeXMuYXJndlswXSAgIyBSZW1vdmUgdGhlIHJ1bnB5IG1vZHVsZSBmcm9tIHRoZSBhcmd1bWVudHMKLSAgICBydW5fbW9kdWxlKHN5cy5hcmd2WzBdLCBydW5fbmFtZT0iX19tYWluX18iLCBhbHRlcl9zeXM9VHJ1ZSkKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBcbW9kdWxle3J1bnB5fSBtb2R1bGUgcHJvdmlkZXMgYSBzaW5nbGUgZnVuY3Rpb246Ci0KLVxiZWdpbntmdW5jZGVzY317cnVuX21vZHVsZX17bW9kX25hbWVcb3B0aW9uYWx7LCBpbml0X2dsb2JhbHN9Ci1cb3B0aW9uYWx7LCBydW5fbmFtZX1cb3B0aW9uYWx7LCBhbHRlcl9zeXN9fQotRXhlY3V0ZSB0aGUgY29kZSBvZiB0aGUgc3BlY2lmaWVkIG1vZHVsZSBhbmQgcmV0dXJuIHRoZSByZXN1bHRpbmcKLW1vZHVsZSBnbG9iYWxzIGRpY3Rpb25hcnkuIFRoZSBtb2R1bGUncyBjb2RlIGlzIGZpcnN0IGxvY2F0ZWQgdXNpbmcKLXRoZSBzdGFuZGFyZCBpbXBvcnQgbWVjaGFuaXNtIChyZWZlciB0byBQRVAgMzAyIGZvciBkZXRhaWxzKSBhbmQKLXRoZW4gZXhlY3V0ZWQgaW4gYSBmcmVzaCBtb2R1bGUgbmFtZXNwYWNlLgotCi1UaGUgb3B0aW9uYWwgZGljdGlvbmFyeSBhcmd1bWVudCBcdmFye2luaXRfZ2xvYmFsc30gbWF5IGJlIHVzZWQgdG8KLXByZS1wb3B1bGF0ZSB0aGUgZ2xvYmFscyBkaWN0aW9uYXJ5IGJlZm9yZSB0aGUgY29kZSBpcyBleGVjdXRlZC4KLVRoZSBzdXBwbGllZCBkaWN0aW9uYXJ5IHdpbGwgbm90IGJlIG1vZGlmaWVkLiBJZiBhbnkgb2YgdGhlIHNwZWNpYWwKLWdsb2JhbCB2YXJpYWJsZXMgYmVsb3cgYXJlIGRlZmluZWQgaW4gdGhlIHN1cHBsaWVkIGRpY3Rpb25hcnksIHRob3NlCi1kZWZpbml0aW9ucyBhcmUgb3ZlcnJpZGRlbiBieSB0aGUgXGNvZGV7cnVuX21vZHVsZX0gZnVuY3Rpb24uCi0KLVRoZSBzcGVjaWFsIGdsb2JhbCB2YXJpYWJsZXMgXGNvZGV7X19uYW1lX199LCBcY29kZXtfX2ZpbGVfX30sCi1cY29kZXtfX2xvYWRlcl9ffSBhbmQgXGNvZGV7X19idWlsdGluc19ffSBhcmUgc2V0IGluIHRoZSBnbG9iYWxzCi1kaWN0aW9uYXJ5IGJlZm9yZSB0aGUgbW9kdWxlIGNvZGUgaXMgZXhlY3V0ZWQuCi0KLVxjb2Rle19fbmFtZV9ffSBpcyBzZXQgdG8gXHZhcntydW5fbmFtZX0gaWYgdGhpcyBvcHRpb25hbCBhcmd1bWVudCBpcwotc3VwcGxpZWQsIGFuZCB0aGUgXHZhcnttb2RfbmFtZX0gYXJndW1lbnQgb3RoZXJ3aXNlLgotCi1cY29kZXtfX2xvYWRlcl9ffSBpcyBzZXQgdG8gdGhlIFBFUCAzMDIgbW9kdWxlIGxvYWRlciB1c2VkIHRvIHJldHJpZXZlCi10aGUgY29kZSBmb3IgdGhlIG1vZHVsZSAoVGhpcyBsb2FkZXIgbWF5IGJlIGEgd3JhcHBlciBhcm91bmQgdGhlCi1zdGFuZGFyZCBpbXBvcnQgbWVjaGFuaXNtKS4KLQotXGNvZGV7X19maWxlX199IGlzIHNldCB0byB0aGUgbmFtZSBwcm92aWRlZCBieSB0aGUgbW9kdWxlIGxvYWRlci4gSWYKLXRoZSBsb2FkZXIgZG9lcyBub3QgbWFrZSBmaWxlbmFtZSBpbmZvcm1hdGlvbiBhdmFpbGFibGUsIHRoaXMKLXZhcmlhYmxlIGlzIHNldCB0byBcY29kZXtOb25lfS4KLQotXGNvZGV7X19idWlsdGluc19ffSBpcyBhdXRvbWF0aWNhbGx5IGluaXRpYWxpc2VkIHdpdGggYSByZWZlcmVuY2UgdG8KLXRoZSB0b3AgbGV2ZWwgbmFtZXNwYWNlIG9mIHRoZSBcbW9kdWxle19fYnVpbHRpbl9ffSBtb2R1bGUuCi0KLUlmIHRoZSBhcmd1bWVudCBcdmFye2FsdGVyX3N5c30gaXMgc3VwcGxpZWQgYW5kIGV2YWx1YXRlcyB0bwotXGNvZGV7VHJ1ZX0sIHRoZW4gXGNvZGV7c3lzLmFyZ3ZbMF19IGlzIHVwZGF0ZWQgd2l0aCB0aGUgdmFsdWUgb2YKLVxjb2Rle19fZmlsZV9ffSBhbmQgXGNvZGV7c3lzLm1vZHVsZXNbX19uYW1lX19dfSBpcyB1cGRhdGVkIHdpdGggYQotbmV3IG1vZHVsZSBvYmplY3QgZm9yIHRoZSBtb2R1bGUgYmVpbmcgZXhlY3V0ZWQuIE5vdGUgdGhhdCBuZWl0aGVyCi1cY29kZXtzeXMuYXJndlswXX0gbm9yIFxjb2Rle3N5cy5tb2R1bGVzW19fbmFtZV9fXX0gYXJlIHJlc3RvcmVkIHRvCi10aGVpciBvcmlnaW5hbCB2YWx1ZXMgYmVmb3JlIHRoZSBmdW5jdGlvbiByZXR1cm5zIC0gaWYgY2xpZW50IGNvZGUKLW5lZWRzIHRoZXNlIHZhbHVlcyBwcmVzZXJ2ZWQsIGl0IG11c3QgZWl0aGVyIHNhdmUgdGhlbSBleHBsaWNpdGx5IG9yCi1lbHNlIGF2b2lkIGVuYWJsaW5nIHRoZSBhdXRvbWF0aWMgYWx0ZXJhdGlvbnMgdG8gXG1vZHVsZXtzeXN9LgotCi1Ob3RlIHRoYXQgdGhpcyBtYW5pcHVsYXRpb24gb2YgXG1vZHVsZXtzeXN9IGlzIG5vdCB0aHJlYWQtc2FmZS4gT3RoZXIKLXRocmVhZHMgbWF5IHNlZSB0aGUgcGFydGlhbGx5IGluaXRpYWxpc2VkIG1vZHVsZSwgYXMgd2VsbCBhcyB0aGUKLWFsdGVyZWQgbGlzdCBvZiBhcmd1bWVudHMuIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlIFxtb2R1bGV7c3lzfQotbW9kdWxlIGJlIGxlZnQgYWxvbmUgd2hlbiBpbnZva2luZyB0aGlzIGZ1bmN0aW9uIGZyb20gdGhyZWFkZWQgY29kZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntzZWVhbHNvfQotCi1cc2VlcGVwezMzOH17RXhlY3V0aW5nIG1vZHVsZXMgYXMgc2NyaXB0c317UEVQIHdyaXR0ZW4gYW5kIAotaW1wbGVtZW50ZWQgYnkgTmljayBDb2dobGFuLn0KLQotXGVuZHtzZWVhbHNvfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJzY2hlZC50ZXggYi9Eb2MvbGliL2xpYnNjaGVkLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzViYWI3ZS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnNjaGVkLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7c2NoZWR9IC0tLQotICAgICAgICAgRXZlbnQgc2NoZWR1bGVyfQotCi0lIExhVGVYZWQgYW5kIGVuaGFuY2VkIGZyb20gY29tbWVudHMgaW4gZmlsZQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17c2NoZWR9Ci1cc2VjdGlvbmF1dGhvcntNb3NoZSBaYWRrYX17bW9zaGV6QHphZGthLnNpdGUuY28uaWx9Ci1cbW9kdWxlc3lub3BzaXN7R2VuZXJhbCBwdXJwb3NlIGV2ZW50IHNjaGVkdWxlci59Ci0KLVRoZSBcbW9kdWxle3NjaGVkfSBtb2R1bGUgZGVmaW5lcyBhIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgYSBnZW5lcmFsCi1wdXJwb3NlIGV2ZW50IHNjaGVkdWxlcjpcaW5kZXh7ZXZlbnQgc2NoZWR1bGluZ30KLQotXGJlZ2lue2NsYXNzZGVzY317c2NoZWR1bGVyfXt0aW1lZnVuYywgZGVsYXlmdW5jfQotVGhlIFxjbGFzc3tzY2hlZHVsZXJ9IGNsYXNzIGRlZmluZXMgYSBnZW5lcmljIGludGVyZmFjZSB0byBzY2hlZHVsaW5nCi1ldmVudHMuIEl0IG5lZWRzIHR3byBmdW5jdGlvbnMgdG8gYWN0dWFsbHkgZGVhbCB3aXRoIHRoZSBgYG91dHNpZGUgd29ybGQnJwotLS0tIFx2YXJ7dGltZWZ1bmN9IHNob3VsZCBiZSBjYWxsYWJsZSB3aXRob3V0IGFyZ3VtZW50cywgYW5kIHJldHVybiAKLWEgbnVtYmVyICh0aGUgYGB0aW1lJycsIGluIGFueSB1bml0cyB3aGF0c29ldmVyKS4gIFRoZSBcdmFye2RlbGF5ZnVuY30KLWZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsYWJsZSB3aXRoIG9uZSBhcmd1bWVudCwgY29tcGF0aWJsZSB3aXRoIHRoZSBvdXRwdXQKLW9mIFx2YXJ7dGltZWZ1bmN9LCBhbmQgc2hvdWxkIGRlbGF5IHRoYXQgbWFueSB0aW1lIHVuaXRzLgotXHZhcntkZWxheWZ1bmN9IHdpbGwgYWxzbyBiZSBjYWxsZWQgd2l0aCB0aGUgYXJndW1lbnQgXGNvZGV7MH0gYWZ0ZXIKLWVhY2ggZXZlbnQgaXMgcnVuIHRvIGFsbG93IG90aGVyIHRocmVhZHMgYW4gb3Bwb3J0dW5pdHkgdG8gcnVuIGluCi1tdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbnMuCi1cZW5ke2NsYXNzZGVzY30KLQotRXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGltcG9ydCBzY2hlZCwgdGltZQotPj4+IHM9c2NoZWQuc2NoZWR1bGVyKHRpbWUudGltZSwgdGltZS5zbGVlcCkKLT4+PiBkZWYgcHJpbnRfdGltZSgpOiBwcmludCAiRnJvbSBwcmludF90aW1lIiwgdGltZS50aW1lKCkKLS4uLgotPj4+IGRlZiBwcmludF9zb21lX3RpbWVzKCk6Ci0uLi4gICAgIHByaW50IHRpbWUudGltZSgpCi0uLi4gICAgIHMuZW50ZXIoNSwgMSwgcHJpbnRfdGltZSwgKCkpCi0uLi4gICAgIHMuZW50ZXIoMTAsIDEsIHByaW50X3RpbWUsICgpKQotLi4uICAgICBzLnJ1bigpCi0uLi4gICAgIHByaW50IHRpbWUudGltZSgpCi0uLi4KLT4+PiBwcmludF9zb21lX3RpbWVzKCkKLTkzMDM0MzY5MC4yNTcKLUZyb20gcHJpbnRfdGltZSA5MzAzNDM2OTUuMjc0Ci1Gcm9tIHByaW50X3RpbWUgOTMwMzQzNzAwLjI3MwotOTMwMzQzNzAwLjI3NgotXGVuZHt2ZXJiYXRpbX0KLQotCi1cc3Vic2VjdGlvbntTY2hlZHVsZXIgT2JqZWN0cyBcbGFiZWx7c2NoZWR1bGVyLW9iamVjdHN9fQotCi1cY2xhc3N7c2NoZWR1bGVyfSBpbnN0YW5jZXMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtzY2hlZHVsZXJde2VudGVyYWJzfXt0aW1lLCBwcmlvcml0eSwgYWN0aW9uLCBhcmd1bWVudH0KLVNjaGVkdWxlIGEgbmV3IGV2ZW50LiBUaGUgXHZhcnt0aW1lfSBhcmd1bWVudCBzaG91bGQgYmUgYSBudW1lcmljIHR5cGUKLWNvbXBhdGlibGUgd2l0aCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBcdmFye3RpbWVmdW5jfSBmdW5jdGlvbiBwYXNzZWQgCi10byB0aGUgY29uc3RydWN0b3IuIEV2ZW50cyBzY2hlZHVsZWQgZm9yCi10aGUgc2FtZSBcdmFye3RpbWV9IHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlIG9yZGVyIG9mIHRoZWlyCi1cdmFye3ByaW9yaXR5fS4KLQotRXhlY3V0aW5nIHRoZSBldmVudCBtZWFucyBleGVjdXRpbmcKLVxjb2Rle1x2YXJ7YWN0aW9ufSgqXHZhcnthcmd1bWVudH0pfS4gIFx2YXJ7YXJndW1lbnR9IG11c3QgYmUgYQotc2VxdWVuY2UgaG9sZGluZyB0aGUgcGFyYW1ldGVycyBmb3IgXHZhcnthY3Rpb259LgotCi1SZXR1cm4gdmFsdWUgaXMgYW4gZXZlbnQgd2hpY2ggbWF5IGJlIHVzZWQgZm9yIGxhdGVyIGNhbmNlbGxhdGlvbiBvZgotdGhlIGV2ZW50IChzZWUgXG1ldGhvZHtjYW5jZWwoKX0pLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bc2NoZWR1bGVyXXtlbnRlcn17ZGVsYXksIHByaW9yaXR5LCBhY3Rpb24sIGFyZ3VtZW50fQotU2NoZWR1bGUgYW4gZXZlbnQgZm9yIFx2YXJ7ZGVsYXl9IG1vcmUgdGltZSB1bml0cy4gT3RoZXIgdGhlbiB0aGUKLXJlbGF0aXZlIHRpbWUsIHRoZSBvdGhlciBhcmd1bWVudHMsIHRoZSBlZmZlY3QgYW5kIHRoZSByZXR1cm4gdmFsdWUKLWFyZSB0aGUgc2FtZSBhcyB0aG9zZSBmb3IgXG1ldGhvZHtlbnRlcmFicygpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3NjaGVkdWxlcl17Y2FuY2VsfXtldmVudH0KLVJlbW92ZSB0aGUgZXZlbnQgZnJvbSB0aGUgcXVldWUuIElmIFx2YXJ7ZXZlbnR9IGlzIG5vdCBhbiBldmVudAotY3VycmVudGx5IGluIHRoZSBxdWV1ZSwgdGhpcyBtZXRob2Qgd2lsbCByYWlzZSBhCi1cZXhjZXB0aW9ue1J1bnRpbWVFcnJvcn0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtzY2hlZHVsZXJde2VtcHR5fXt9Ci1SZXR1cm4gdHJ1ZSBpZiB0aGUgZXZlbnQgcXVldWUgaXMgZW1wdHkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtzY2hlZHVsZXJde3J1bn17fQotUnVuIGFsbCBzY2hlZHVsZWQgZXZlbnRzLiBUaGlzIGZ1bmN0aW9uIHdpbGwgd2FpdCAKLSh1c2luZyB0aGUgXGZ1bmN0aW9ue2RlbGF5ZnVuY30gZnVuY3Rpb24gcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvcikKLWZvciB0aGUgbmV4dCBldmVudCwgdGhlbiBleGVjdXRlIGl0IGFuZCBzbyBvbiB1bnRpbCB0aGVyZSBhcmUgbm8gbW9yZQotc2NoZWR1bGVkIGV2ZW50cy4KLQotRWl0aGVyIFx2YXJ7YWN0aW9ufSBvciBcdmFye2RlbGF5ZnVuY30gY2FuIHJhaXNlIGFuIGV4Y2VwdGlvbi4gIEluCi1laXRoZXIgY2FzZSwgdGhlIHNjaGVkdWxlciB3aWxsIG1haW50YWluIGEgY29uc2lzdGVudCBzdGF0ZSBhbmQKLXByb3BhZ2F0ZSB0aGUgZXhjZXB0aW9uLiAgSWYgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZCBieSBcdmFye2FjdGlvbn0sCi10aGUgZXZlbnQgd2lsbCBub3QgYmUgYXR0ZW1wdGVkIGluIGZ1dHVyZSBjYWxscyB0byBcbWV0aG9ke3J1bigpfS4KLQotSWYgYSBzZXF1ZW5jZSBvZiBldmVudHMgdGFrZXMgbG9uZ2VyIHRvIHJ1biB0aGFuIHRoZSB0aW1lIGF2YWlsYWJsZQotYmVmb3JlIHRoZSBuZXh0IGV2ZW50LCB0aGUgc2NoZWR1bGVyIHdpbGwgc2ltcGx5IGZhbGwgYmVoaW5kLiAgTm8KLWV2ZW50cyB3aWxsIGJlIGRyb3BwZWQ7IHRoZSBjYWxsaW5nIGNvZGUgaXMgcmVzcG9uc2libGUgZm9yIGNhbmNlbGluZyAKLWV2ZW50cyB3aGljaCBhcmUgbm8gbG9uZ2VyIHBlcnRpbmVudC4KLVxlbmR7bWV0aG9kZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic2VsZWN0LnRleCBiL0RvYy9saWIvbGlic2VsZWN0LnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk1ODNkNC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnNlbGVjdC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtzZWxlY3R9IC0tLQotICAgICAgICAgV2FpdGluZyBmb3IgSS9PIGNvbXBsZXRpb259Ci0KLVxkZWNsYXJlbW9kdWxle2J1aWx0aW59e3NlbGVjdH0KLVxtb2R1bGVzeW5vcHNpc3tXYWl0IGZvciBJL08gY29tcGxldGlvbiBvbiBtdWx0aXBsZSBzdHJlYW1zLn0KLQotCi1UaGlzIG1vZHVsZSBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIFxjZnVuY3Rpb257c2VsZWN0KCl9Ci1hbmQgXGNmdW5jdGlvbntwb2xsKCl9IGZ1bmN0aW9ucwotYXZhaWxhYmxlIGluIG1vc3Qgb3BlcmF0aW5nIHN5c3RlbXMuICBOb3RlIHRoYXQgb24gV2luZG93cywgaXQgb25seQotd29ya3MgZm9yIHNvY2tldHM7IG9uIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zLCBpdCBhbHNvIHdvcmtzIGZvciBvdGhlcgotZmlsZSB0eXBlcyAoaW4gcGFydGljdWxhciwgb24gXFVOSVgsIGl0IHdvcmtzIG9uIHBpcGVzKS4gIEl0IGNhbm5vdAotYmUgdXNlZCBvbiByZWd1bGFyIGZpbGVzIHRvIGRldGVybWluZSB3aGV0aGVyIGEgZmlsZSBoYXMgZ3Jvd24gc2luY2UKLWl0IHdhcyBsYXN0IHJlYWQuCi0KLVRoZSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nOgotCi1cYmVnaW57ZXhjZGVzY317ZXJyb3J9Ci1UaGUgZXhjZXB0aW9uIHJhaXNlZCB3aGVuIGFuIGVycm9yIG9jY3Vycy4gIFRoZSBhY2NvbXBhbnlpbmcgdmFsdWUgaXMKLWEgcGFpciBjb250YWluaW5nIHRoZSBudW1lcmljIGVycm9yIGNvZGUgZnJvbSBcY2RhdGF7ZXJybm99IGFuZCB0aGUKLWNvcnJlc3BvbmRpbmcgc3RyaW5nLCBhcyB3b3VsZCBiZSBwcmludGVkIGJ5IHRoZSBcQ3t9IGZ1bmN0aW9uCi1cY2Z1bmN0aW9ue3BlcnJvcigpfS4KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtwb2xsfXt9Ci0oTm90IHN1cHBvcnRlZCBieSBhbGwgb3BlcmF0aW5nIHN5c3RlbXMuKSAgUmV0dXJucyBhIHBvbGxpbmcgb2JqZWN0LAotd2hpY2ggc3VwcG9ydHMgcmVnaXN0ZXJpbmcgYW5kIHVucmVnaXN0ZXJpbmcgZmlsZSBkZXNjcmlwdG9ycywgYW5kCi10aGVuIHBvbGxpbmcgdGhlbSBmb3IgSS9PIGV2ZW50czsKLXNlZSBzZWN0aW9uflxyZWZ7cG9sbC1vYmplY3RzfSBiZWxvdyBmb3IgdGhlIG1ldGhvZHMgc3VwcG9ydGVkIGJ5Ci1wb2xsaW5nIG9iamVjdHMuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NlbGVjdH17aXd0ZCwgb3d0ZCwgZXd0ZFxvcHRpb25hbHssIHRpbWVvdXR9fQotVGhpcyBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCBpbnRlcmZhY2UgdG8gdGhlIFxVTklYe30gXGNmdW5jdGlvbntzZWxlY3QoKX0KLXN5c3RlbSBjYWxsLiAgVGhlIGZpcnN0IHRocmVlIGFyZ3VtZW50cyBhcmUgc2VxdWVuY2VzIG9mIGB3YWl0YWJsZQotb2JqZWN0cyc6IGVpdGhlciBpbnRlZ2VycyByZXByZXNlbnRpbmcgZmlsZSBkZXNjcmlwdG9ycyBvcgotb2JqZWN0cyB3aXRoIGEgcGFyYW1ldGVybGVzcyBtZXRob2QgbmFtZWQgXG1ldGhvZHtmaWxlbm8oKX0gcmV0dXJuaW5nCi1zdWNoIGFuIGludGVnZXIuICBUaGUgdGhyZWUgc2VxdWVuY2VzIG9mIHdhaXRhYmxlIG9iamVjdHMgYXJlIGZvciBpbnB1dCwKLW91dHB1dCBhbmQgYGV4Y2VwdGlvbmFsIGNvbmRpdGlvbnMnLCByZXNwZWN0aXZlbHkuICBFbXB0eSBzZXF1ZW5jZXMgYXJlCi1hbGxvd2VkLCBidXQgYWNjZXB0YW5jZSBvZiB0aHJlZSBlbXB0eSBzZXF1ZW5jZXMgaXMgcGxhdGZvcm0tZGVwZW5kZW50LgotKEl0IGlzIGtub3duIHRvIHdvcmsgb24gXFVOSVh7fSBidXQgbm90IG9uIFdpbmRvd3MuKSAgVGhlIG9wdGlvbmFsCi1cdmFye3RpbWVvdXR9IGFyZ3VtZW50IHNwZWNpZmllcyBhIHRpbWUtb3V0IGFzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyCi1pbiBzZWNvbmRzLiAgV2hlbiB0aGUgXHZhcnt0aW1lb3V0fSBhcmd1bWVudCBpcyBvbWl0dGVkIHRoZSBmdW5jdGlvbgotYmxvY2tzIHVudGlsIGF0IGxlYXN0IG9uZSBmaWxlIGRlc2NyaXB0b3IgaXMgcmVhZHkuICBBIHRpbWUtb3V0IHZhbHVlCi1vZiB6ZXJvIHNwZWNpZmllcyBhIHBvbGwgYW5kIG5ldmVyIGJsb2Nrcy4KLQotVGhlIHJldHVybiB2YWx1ZSBpcyBhIHRyaXBsZSBvZiBsaXN0cyBvZiBvYmplY3RzIHRoYXQgYXJlIHJlYWR5Ogotc3Vic2V0cyBvZiB0aGUgZmlyc3QgdGhyZWUgYXJndW1lbnRzLiAgV2hlbiB0aGUgdGltZS1vdXQgaXMgcmVhY2hlZAotd2l0aG91dCBhIGZpbGUgZGVzY3JpcHRvciBiZWNvbWluZyByZWFkeSwgdGhyZWUgZW1wdHkgbGlzdHMgYXJlCi1yZXR1cm5lZC4KLQotQW1vbmcgdGhlIGFjY2VwdGFibGUgb2JqZWN0IHR5cGVzIGluIHRoZSBzZXF1ZW5jZXMgYXJlIFB5dGhvbiBmaWxlCi1vYmplY3RzIChlLmcuIFxjb2Rle3N5cy5zdGRpbn0sIG9yIG9iamVjdHMgcmV0dXJuZWQgYnkKLVxmdW5jdGlvbntvcGVuKCl9IG9yIFxmdW5jdGlvbntvcy5wb3BlbigpfSksIHNvY2tldCBvYmplY3RzCi1yZXR1cm5lZCBieSBcZnVuY3Rpb257c29ja2V0LnNvY2tldCgpfS4lCi1cd2l0aHN1Yml0ZW17KGluIG1vZHVsZSBzb2NrZXQpfXtcdHRpbmRleHtzb2NrZXQoKX19Ci1cd2l0aHN1Yml0ZW17KGluIG1vZHVsZSBvcyl9e1x0dGluZGV4e3BvcGVuKCl9fQotWW91IG1heSBhbHNvIGRlZmluZSBhIFxkZm57d3JhcHBlcn0gY2xhc3MgeW91cnNlbGYsIGFzIGxvbmcgYXMgaXQgaGFzCi1hbiBhcHByb3ByaWF0ZSBcbWV0aG9ke2ZpbGVubygpfSBtZXRob2QgKHRoYXQgcmVhbGx5IHJldHVybnMgYSBmaWxlCi1kZXNjcmlwdG9yLCBub3QganVzdCBhIHJhbmRvbSBpbnRlZ2VyKS4KLVxub3Rle0ZpbGUgb2JqZWN0cyBvbiBXaW5kb3dzIGFyZSBub3QgYWNjZXB0YWJsZSwgYnV0IHNvY2tldHMKLWFyZS5caW5kZXh7V2luU29ja30gIE9uIFdpbmRvd3MsIHRoZSB1bmRlcmx5aW5nIFxjZnVuY3Rpb257c2VsZWN0KCl9Ci1mdW5jdGlvbiBpcyBwcm92aWRlZCBieSB0aGUgV2luU29jayBsaWJyYXJ5LCBhbmQgZG9lcyBub3QgaGFuZGxlIGZpbGUKLWRlc2NyaXB0b3JzIHRoYXQgZG9uJ3Qgb3JpZ2luYXRlIGZyb20gV2luU29jay59Ci1cZW5ke2Z1bmNkZXNjfQotCi1cc3Vic2VjdGlvbntQb2xsaW5nIE9iamVjdHMKLSAgICAgICAgICAgIFxsYWJlbHtwb2xsLW9iamVjdHN9fQotCi1UaGUgXGNmdW5jdGlvbntwb2xsKCl9IHN5c3RlbSBjYWxsLCBzdXBwb3J0ZWQgb24gbW9zdCBcVU5JWHt9IHN5c3RlbXMsCi1wcm92aWRlcyBiZXR0ZXIgc2NhbGFiaWxpdHkgZm9yIG5ldHdvcmsgc2VydmVycyB0aGF0IHNlcnZpY2UgbWFueSwKLW1hbnkgY2xpZW50cyBhdCB0aGUgc2FtZSB0aW1lLgotXGNmdW5jdGlvbntwb2xsKCl9IHNjYWxlcyBiZXR0ZXIgYmVjYXVzZSB0aGUgc3lzdGVtIGNhbGwgb25seQotcmVxdWlyZXMgbGlzdGluZyB0aGUgZmlsZSBkZXNjcmlwdG9ycyBvZiBpbnRlcmVzdCwgd2hpbGUgXGNmdW5jdGlvbntzZWxlY3QoKX0KLWJ1aWxkcyBhIGJpdG1hcCwgdHVybnMgb24gYml0cyBmb3IgdGhlIGZkcyBvZiBpbnRlcmVzdCwgYW5kIHRoZW4KLWFmdGVyd2FyZCB0aGUgd2hvbGUgYml0bWFwIGhhcyB0byBiZSBsaW5lYXJseSBzY2FubmVkIGFnYWluLgotXGNmdW5jdGlvbntzZWxlY3QoKX0gaXMgTyhoaWdoZXN0IGZpbGUgZGVzY3JpcHRvciksIHdoaWxlCi1cY2Z1bmN0aW9ue3BvbGwoKX0gaXMgTyhudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycykuCi0KLVxiZWdpbnttZXRob2RkZXNjfVtwb2xsXXtyZWdpc3Rlcn17ZmRcb3B0aW9uYWx7LCBldmVudG1hc2t9fQotUmVnaXN0ZXIgYSBmaWxlIGRlc2NyaXB0b3Igd2l0aCB0aGUgcG9sbGluZyBvYmplY3QuICBGdXR1cmUgY2FsbHMgdG8KLXRoZSBcbWV0aG9ke3BvbGwoKX0gbWV0aG9kIHdpbGwgdGhlbiBjaGVjayB3aGV0aGVyIHRoZSBmaWxlIGRlc2NyaXB0b3IKLWhhcyBhbnkgcGVuZGluZyBJL08gZXZlbnRzLiAgXHZhcntmZH0gY2FuIGJlIGVpdGhlciBhbiBpbnRlZ2VyLCBvciBhbgotb2JqZWN0IHdpdGggYSBcbWV0aG9ke2ZpbGVubygpfSBtZXRob2QgdGhhdCByZXR1cm5zIGFuIGludGVnZXIuICBGaWxlCi1vYmplY3RzIGltcGxlbWVudAotXG1ldGhvZHtmaWxlbm8oKX0sIHNvIHRoZXkgY2FuIGFsc28gYmUgdXNlZCBhcyB0aGUgYXJndW1lbnQuCi0KLVx2YXJ7ZXZlbnRtYXNrfSBpcyBhbiBvcHRpb25hbCBiaXRtYXNrIGRlc2NyaWJpbmcgdGhlIHR5cGUgb2YgZXZlbnRzIHlvdQotd2FudCB0byBjaGVjayBmb3IsIGFuZCBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgY29uc3RhbnRzCi1cY29uc3RhbnR7UE9MTElOfSwgXGNvbnN0YW50e1BPTExQUkl9LCBhbmQgXGNvbnN0YW50e1BPTExPVVR9LAotZGVzY3JpYmVkIGluIHRoZSB0YWJsZSBiZWxvdy4gIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHZhbHVlCi11c2VkIHdpbGwgY2hlY2sgZm9yIGFsbCAzIHR5cGVzIG9mIGV2ZW50cy4KLQotXGJlZ2lue3RhYmxlaWl9e2x8bH17Y29uc3RhbnR9e0NvbnN0YW50fXtNZWFuaW5nfQotICBcbGluZWlpe1BPTExJTn17VGhlcmUgaXMgZGF0YSB0byByZWFkfQotICBcbGluZWlpe1BPTExQUkl9e1RoZXJlIGlzIHVyZ2VudCBkYXRhIHRvIHJlYWR9Ci0gIFxsaW5laWl7UE9MTE9VVH17UmVhZHkgZm9yIG91dHB1dDogd3JpdGluZyB3aWxsIG5vdCBibG9ja30KLSAgXGxpbmVpaXtQT0xMRVJSfXtFcnJvciBjb25kaXRpb24gb2Ygc29tZSBzb3J0fQotICBcbGluZWlpe1BPTExIVVB9e0h1bmcgdXB9Ci0gIFxsaW5laWl7UE9MTE5WQUx9e0ludmFsaWQgcmVxdWVzdDogZGVzY3JpcHRvciBub3Qgb3Blbn0KLVxlbmR7dGFibGVpaX0KLQotUmVnaXN0ZXJpbmcgYSBmaWxlIGRlc2NyaXB0b3IgdGhhdCdzIGFscmVhZHkgcmVnaXN0ZXJlZCBpcyBub3QgYW4KLWVycm9yLCBhbmQgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyByZWdpc3RlcmluZyB0aGUgZGVzY3JpcHRvciBleGFjdGx5Ci1vbmNlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bcG9sbF17dW5yZWdpc3Rlcn17ZmR9Ci1SZW1vdmUgYSBmaWxlIGRlc2NyaXB0b3IgYmVpbmcgdHJhY2tlZCBieSBhIHBvbGxpbmcgb2JqZWN0LiAgSnVzdCBsaWtlCi10aGUgXG1ldGhvZHtyZWdpc3RlcigpfSBtZXRob2QsIFx2YXJ7ZmR9IGNhbiBiZSBhbiBpbnRlZ2VyIG9yIGFuCi1vYmplY3Qgd2l0aCBhIFxtZXRob2R7ZmlsZW5vKCl9IG1ldGhvZCB0aGF0IHJldHVybnMgYW4gaW50ZWdlci4KLQotQXR0ZW1wdGluZyB0byByZW1vdmUgYSBmaWxlIGRlc2NyaXB0b3IgdGhhdCB3YXMgbmV2ZXIgcmVnaXN0ZXJlZAotY2F1c2VzIGEgXGV4Y2VwdGlvbntLZXlFcnJvcn0gZXhjZXB0aW9uIHRvIGJlIHJhaXNlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3BvbGxde3BvbGx9e1xvcHRpb25hbHt0aW1lb3V0fX0KLVBvbGxzIHRoZSBzZXQgb2YgcmVnaXN0ZXJlZCBmaWxlIGRlc2NyaXB0b3JzLCBhbmQgcmV0dXJucyBhCi1wb3NzaWJseS1lbXB0eSBsaXN0IGNvbnRhaW5pbmcgXGNvZGV7KFx2YXJ7ZmR9LCBcdmFye2V2ZW50fSl9IDItdHVwbGVzCi1mb3IgdGhlIGRlc2NyaXB0b3JzIHRoYXQgaGF2ZSBldmVudHMgb3IgZXJyb3JzIHRvIHJlcG9ydC4KLVx2YXJ7ZmR9IGlzIHRoZSBmaWxlIGRlc2NyaXB0b3IsIGFuZCBcdmFye2V2ZW50fSBpcyBhIGJpdG1hc2sKLXdpdGggYml0cyBzZXQgZm9yIHRoZSByZXBvcnRlZCBldmVudHMgZm9yIHRoYXQgZGVzY3JpcHRvcgotLS0tIFxjb25zdGFudHtQT0xMSU59IGZvciB3YWl0aW5nIGlucHV0LAotXGNvbnN0YW50e1BPTExPVVR9IHRvIGluZGljYXRlIHRoYXQgdGhlIGRlc2NyaXB0b3IgY2FuIGJlIHdyaXR0ZW4gdG8sIGFuZAotc28gZm9ydGguCi1BbiBlbXB0eSBsaXN0IGluZGljYXRlcyB0aGF0IHRoZSBjYWxsIHRpbWVkIG91dCBhbmQgbm8gZmlsZQotZGVzY3JpcHRvcnMgaGFkIGFueSBldmVudHMgdG8gcmVwb3J0LgotSWYgXHZhcnt0aW1lb3V0fSBpcyBnaXZlbiwgaXQgc3BlY2lmaWVzIHRoZSBsZW5ndGggb2YgdGltZSBpbgotbWlsbGlzZWNvbmRzIHdoaWNoIHRoZSBzeXN0ZW0gd2lsbCB3YWl0IGZvciBldmVudHMgYmVmb3JlIHJldHVybmluZy4KLUlmIFx2YXJ7dGltZW91dH0gaXMgb21pdHRlZCwgbmVnYXRpdmUsIG9yIFxjb25zdGFudHtOb25lfSwgdGhlIGNhbGwgd2lsbAotYmxvY2sgdW50aWwgdGhlcmUgaXMgYW4gZXZlbnQgZm9yIHRoaXMgcG9sbCBvYmplY3QuCi1cZW5ke21ldGhvZGRlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnNnbWxsaWIudGV4IGIvRG9jL2xpYi9saWJzZ21sbGliLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZlMGQ2My4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnNnbWxsaWIudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7c2dtbGxpYn0gLS0tCi0gICAgICAgICBTaW1wbGUgU0dNTCBwYXJzZXJ9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtzZ21sbGlifQotXG1vZHVsZXN5bm9wc2lze09ubHkgYXMgbXVjaCBvZiBhbiBTR01MIHBhcnNlciBhcyBuZWVkZWQgdG8gcGFyc2UgSFRNTC59Ci0KLVxpbmRleHtTR01MfQotCi1UaGlzIG1vZHVsZSBkZWZpbmVzIGEgY2xhc3MgXGNsYXNze1NHTUxQYXJzZXJ9IHdoaWNoIHNlcnZlcyBhcyB0aGUKLWJhc2lzIGZvciBwYXJzaW5nIHRleHQgZmlsZXMgZm9ybWF0dGVkIGluIFNHTUwgKFN0YW5kYXJkIEdlbmVyYWxpemVkCi1NYXJrLXVwIExhbmd1YWdlKS4gIEluIGZhY3QsIGl0IGRvZXMgbm90IHByb3ZpZGUgYSBmdWxsIFNHTUwgcGFyc2VyCi0tLS0gaXQgb25seSBwYXJzZXMgU0dNTCBpbnNvZmFyIGFzIGl0IGlzIHVzZWQgYnkgSFRNTCwgYW5kIHRoZSBtb2R1bGUKLW9ubHkgZXhpc3RzIGFzIGEgYmFzZSBmb3IgdGhlIFxyZWZtb2R1bGV7aHRtbGxpYn0gbW9kdWxlLiAgQW5vdGhlcgotSFRNTCBwYXJzZXIgd2hpY2ggc3VwcG9ydHMgWEhUTUwgYW5kIG9mZmVycyBhIHNvbWV3aGF0IGRpZmZlcmVudAotaW50ZXJmYWNlIGlzIGF2YWlsYWJsZSBpbiB0aGUgXHJlZm1vZHVsZXtIVE1MUGFyc2VyfSBtb2R1bGUuCi0KLVxiZWdpbntjbGFzc2Rlc2N9e1NHTUxQYXJzZXJ9e30KLVRoZSBcY2xhc3N7U0dNTFBhcnNlcn0gY2xhc3MgaXMgaW5zdGFudGlhdGVkIHdpdGhvdXQgYXJndW1lbnRzLgotVGhlIHBhcnNlciBpcyBoYXJkY29kZWQgdG8gcmVjb2duaXplIHRoZSBmb2xsb3dpbmcKLWNvbnN0cnVjdHM6Ci0KLVxiZWdpbntpdGVtaXplfQotXGl0ZW0KLU9wZW5pbmcgYW5kIGNsb3NpbmcgdGFncyBvZiB0aGUgZm9ybQotXHNhbXB7PFx2YXJ7dGFnfSBcdmFye2F0dHJ9PSJcdmFye3ZhbHVlfSIgLi4uPn0gYW5kCi1cc2FtcHs8L1x2YXJ7dGFnfT59LCByZXNwZWN0aXZlbHkuCi0KLVxpdGVtCi1OdW1lcmljIGNoYXJhY3RlciByZWZlcmVuY2VzIG9mIHRoZSBmb3JtIFxzYW1we1wmXCNcdmFye25hbWV9O30uCi0KLVxpdGVtCi1FbnRpdHkgcmVmZXJlbmNlcyBvZiB0aGUgZm9ybSBcc2FtcHtcJlx2YXJ7bmFtZX07fS4KLQotXGl0ZW0KLVNHTUwgY29tbWVudHMgb2YgdGhlIGZvcm0gXHNhbXB7PCEtLVx2YXJ7dGV4dH0tLT59LiAgTm90ZSB0aGF0Ci1zcGFjZXMsIHRhYnMsIGFuZCBuZXdsaW5lcyBhcmUgYWxsb3dlZCBiZXR3ZWVuIHRoZSB0cmFpbGluZwotXHNhbXB7Pn0gYW5kIHRoZSBpbW1lZGlhdGVseSBwcmVjZWRpbmcgXHNhbXB7LS19LgotCi1cZW5ke2l0ZW1pemV9Ci1cZW5ke2NsYXNzZGVzY30KLQotQSBzaW5nbGUgZXhjZXB0aW9uIGlzIGRlZmluZWQgYXMgd2VsbDoKLQotXGJlZ2lue2V4Y2Rlc2N9e1NHTUxQYXJzZUVycm9yfQotRXhjZXB0aW9uIHJhaXNlZCBieSB0aGUgXGNsYXNze1NHTUxQYXJzZXJ9IGNsYXNzIHdoZW4gaXQgZW5jb3VudGVycyBhbgotZXJyb3Igd2hpbGUgcGFyc2luZy4KLVx2ZXJzaW9uYWRkZWR7Mi4xfQotXGVuZHtleGNkZXNjfQotCi0KLVxjbGFzc3tTR01MUGFyc2VyfSBpbnN0YW5jZXMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0KLQotXGJlZ2lue21ldGhvZGRlc2N9e3Jlc2V0fXt9Ci1SZXNldCB0aGUgaW5zdGFuY2UuICBMb3NlcyBhbGwgdW5wcm9jZXNzZWQgZGF0YS4gIFRoaXMgaXMgY2FsbGVkCi1pbXBsaWNpdGx5IGF0IGluc3RhbnRpYXRpb24gdGltZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3NldG5vbW9yZXRhZ3N9e30KLVN0b3AgcHJvY2Vzc2luZyB0YWdzLiAgVHJlYXQgYWxsIGZvbGxvd2luZyBpbnB1dCBhcyBsaXRlcmFsIGlucHV0Ci0oQ0RBVEEpLiAgKFRoaXMgaXMgb25seSBwcm92aWRlZCBzbyB0aGUgSFRNTCB0YWcKLVxjb2RlezxQTEFJTlRFWFQ+fSBjYW4gYmUgaW1wbGVtZW50ZWQuKQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317c2V0bGl0ZXJhbH17fQotRW50ZXIgbGl0ZXJhbCBtb2RlIChDREFUQSBtb2RlKS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2ZlZWR9e2RhdGF9Ci1GZWVkIHNvbWUgdGV4dCB0byB0aGUgcGFyc2VyLiAgSXQgaXMgcHJvY2Vzc2VkIGluc29mYXIgYXMgaXQgY29uc2lzdHMKLW9mIGNvbXBsZXRlIGVsZW1lbnRzOyBpbmNvbXBsZXRlIGRhdGEgaXMgYnVmZmVyZWQgdW50aWwgbW9yZSBkYXRhIGlzCi1mZWQgb3IgXG1ldGhvZHtjbG9zZSgpfSBpcyBjYWxsZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtjbG9zZX17fQotRm9yY2UgcHJvY2Vzc2luZyBvZiBhbGwgYnVmZmVyZWQgZGF0YSBhcyBpZiBpdCB3ZXJlIGZvbGxvd2VkIGJ5IGFuCi1lbmQtb2YtZmlsZSBtYXJrLiAgVGhpcyBtZXRob2QgbWF5IGJlIHJlZGVmaW5lZCBieSBhIGRlcml2ZWQgY2xhc3MgdG8KLWRlZmluZSBhZGRpdGlvbmFsIHByb2Nlc3NpbmcgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQsIGJ1dCB0aGUKLXJlZGVmaW5lZCB2ZXJzaW9uIHNob3VsZCBhbHdheXMgY2FsbCBcbWV0aG9ke2Nsb3NlKCl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Z2V0X3N0YXJ0dGFnX3RleHR9e30KLVJldHVybiB0aGUgdGV4dCBvZiB0aGUgbW9zdCByZWNlbnRseSBvcGVuZWQgc3RhcnQgdGFnLiAgVGhpcyBzaG91bGQKLW5vdCBub3JtYWxseSBiZSBuZWVkZWQgZm9yIHN0cnVjdHVyZWQgcHJvY2Vzc2luZywgYnV0IG1heSBiZSB1c2VmdWwgaW4KLWRlYWxpbmcgd2l0aCBIVE1MIGBgYXMgZGVwbG95ZWQnJyBvciBmb3IgcmUtZ2VuZXJhdGluZyBpbnB1dCB3aXRoCi1taW5pbWFsIGNoYW5nZXMgKHdoaXRlc3BhY2UgYmV0d2VlbiBhdHRyaWJ1dGVzIGNhbiBiZSBwcmVzZXJ2ZWQsCi1ldGMuKS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2hhbmRsZV9zdGFydHRhZ317dGFnLCBtZXRob2QsIGF0dHJpYnV0ZXN9Ci1UaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gaGFuZGxlIHN0YXJ0IHRhZ3MgZm9yIHdoaWNoIGVpdGhlciBhCi1cbWV0aG9ke3N0YXJ0X1x2YXJ7dGFnfSgpfSBvciBcbWV0aG9ke2RvX1x2YXJ7dGFnfSgpfSBtZXRob2QgaGFzIGJlZW4KLWRlZmluZWQuICBUaGUgXHZhcnt0YWd9IGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSB0YWcgY29udmVydGVkIHRvCi1sb3dlciBjYXNlLCBhbmQgdGhlIFx2YXJ7bWV0aG9kfSBhcmd1bWVudCBpcyB0aGUgYm91bmQgbWV0aG9kIHdoaWNoCi1zaG91bGQgYmUgdXNlZCB0byBzdXBwb3J0IHNlbWFudGljIGludGVycHJldGF0aW9uIG9mIHRoZSBzdGFydCB0YWcuCi1UaGUgXHZhcnthdHRyaWJ1dGVzfSBhcmd1bWVudCBpcyBhIGxpc3Qgb2YgXGNvZGV7KFx2YXJ7bmFtZX0sCi1cdmFye3ZhbHVlfSl9IHBhaXJzIGNvbnRhaW5pbmcgdGhlIGF0dHJpYnV0ZXMgZm91bmQgaW5zaWRlIHRoZSB0YWcncwotXGNvZGV7PD59IGJyYWNrZXRzLgotCi1UaGUgXHZhcntuYW1lfSBoYXMgYmVlbiB0cmFuc2xhdGVkIHRvIGxvd2VyIGNhc2UuCi1Eb3VibGUgcXVvdGVzIGFuZCBiYWNrc2xhc2hlcyBpbiB0aGUgXHZhcnt2YWx1ZX0gaGF2ZSBiZWVuIGludGVycHJldGVkLAotYXMgd2VsbCBhcyBrbm93biBjaGFyYWN0ZXIgcmVmZXJlbmNlcyBhbmQga25vd24gZW50aXR5IHJlZmVyZW5jZXMKLXRlcm1pbmF0ZWQgYnkgYSBzZW1pY29sb24gKG5vcm1hbGx5LCBlbnRpdHkgcmVmZXJlbmNlcyBjYW4gYmUgdGVybWluYXRlZAotYnkgYW55IG5vbi1hbHBoYW51bWVyaWNhbCBjaGFyYWN0ZXIsIGJ1dCB0aGlzIHdvdWxkIGJyZWFrIHRoZSB2ZXJ5Ci1jb21tb24gY2FzZSBvZiBcY29kZXs8QSBIUkVGPSJ1cmw/c3BhbT0xXCZlZ2dzPTIiPn0gd2hlbiBcY29kZXtlZ2dzfQotaXMgYSB2YWxpZCBlbnRpdHkgbmFtZSkuCi0KLUZvciBpbnN0YW5jZSwgZm9yIHRoZSB0YWcgXGNvZGV7PEEgSFJFRj0iaHR0cDovL3d3dy5jd2kubmwvIj59LCB0aGlzCi1tZXRob2Qgd291bGQgYmUgY2FsbGVkIGFzIFxzYW1we3Vua25vd25fc3RhcnR0YWcoJ2EnLCBbKCdocmVmJywKLSdodHRwOi8vd3d3LmN3aS5ubC8nKV0pfS4gIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIHNpbXBseSBjYWxscwotXHZhcnttZXRob2R9IHdpdGggXHZhcnthdHRyaWJ1dGVzfSBhcyB0aGUgb25seSBhcmd1bWVudC4KLVx2ZXJzaW9uYWRkZWRbSGFuZGxpbmcgb2YgZW50aXR5IGFuZCBjaGFyYWN0ZXIgcmVmZXJlbmNlcyB3aXRoaW4KLSAgICAgICAgICAgICAgYXR0cmlidXRlIHZhbHVlc117Mi41fQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317aGFuZGxlX2VuZHRhZ317dGFnLCBtZXRob2R9Ci1UaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gaGFuZGxlIGVuZHRhZ3MgZm9yIHdoaWNoIGFuCi1cbWV0aG9ke2VuZF9cdmFye3RhZ30oKX0gbWV0aG9kIGhhcyBiZWVuIGRlZmluZWQuICBUaGUKLVx2YXJ7dGFnfSBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiB0aGUgdGFnIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlLCBhbmQKLXRoZSBcdmFye21ldGhvZH0gYXJndW1lbnQgaXMgdGhlIGJvdW5kIG1ldGhvZCB3aGljaCBzaG91bGQgYmUgdXNlZCB0bwotc3VwcG9ydCBzZW1hbnRpYyBpbnRlcnByZXRhdGlvbiBvZiB0aGUgZW5kIHRhZy4gIElmIG5vCi1cbWV0aG9ke2VuZF9cdmFye3RhZ30oKX0gbWV0aG9kIGlzIGRlZmluZWQgZm9yIHRoZSBjbG9zaW5nIGVsZW1lbnQsCi10aGlzIGhhbmRsZXIgaXMgbm90IGNhbGxlZC4gIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIHNpbXBseSBjYWxscwotXHZhcnttZXRob2R9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317aGFuZGxlX2RhdGF9e2RhdGF9Ci1UaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gcHJvY2VzcyBhcmJpdHJhcnkgZGF0YS4gIEl0IGlzIGludGVuZGVkIHRvIGJlCi1vdmVycmlkZGVuIGJ5IGEgZGVyaXZlZCBjbGFzczsgdGhlIGJhc2UgY2xhc3MgaW1wbGVtZW50YXRpb24gZG9lcwotbm90aGluZy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2hhbmRsZV9jaGFycmVmfXtyZWZ9Ci1UaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gcHJvY2VzcyBhIGNoYXJhY3RlciByZWZlcmVuY2Ugb2YgdGhlIGZvcm0KLVxzYW1we1wmXCNcdmFye3JlZn07fS4gIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIHVzZXMKLVxtZXRob2R7Y29udmVydF9jaGFycmVmKCl9IHRvIGNvbnZlcnQgdGhlIHJlZmVyZW5jZSB0byBhIHN0cmluZy4gIElmCi10aGF0IG1ldGhvZCByZXR1cm5zIGEgc3RyaW5nLCBpdCBpcyBwYXNzZWQgdG8gXG1ldGhvZHtoYW5kbGVfZGF0YSgpfSwKLW90aGVyd2lzZSBcbWV0aG9ke3Vua25vd25fY2hhcnJlZihcdmFye3JlZn0pfSBpcyBjYWxsZWQgdG8gaGFuZGxlIHRoZQotZXJyb3IuCi1cdmVyc2lvbmNoYW5nZWRbVXNlIFxtZXRob2R7Y29udmVydF9jaGFycmVmKCl9IGluc3RlYWQgb2YgaGFyZC1jb2RpbmcKLXRoZSBjb252ZXJzaW9uXXsyLjV9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtjb252ZXJ0X2NoYXJyZWZ9e3JlZn0KLUNvbnZlcnQgYSBjaGFyYWN0ZXIgcmVmZXJlbmNlIHRvIGEgc3RyaW5nLCBvciBcY29kZXtOb25lfS4gIFx2YXJ7cmVmfQotaXMgdGhlIHJlZmVyZW5jZSBwYXNzZWQgaW4gYXMgYSBzdHJpbmcuICBJbiB0aGUgYmFzZSBpbXBsZW1lbnRhdGlvbiwKLVx2YXJ7cmVmfSBtdXN0IGJlIGEgZGVjaW1hbCBudW1iZXIgaW4gdGhlIHJhbmdlIDAtMjU1LiAgSXQgY29udmVydHMKLXRoZSBjb2RlIHBvaW50IGZvdW5kIHVzaW5nIHRoZSBcbWV0aG9ke2NvbnZlcnRfY29kZXBvaW50KCl9IG1ldGhvZC4KLUlmIFx2YXJ7cmVmfSBpcyBpbnZhbGlkIG9yIG91dCBvZiByYW5nZSwgdGhpcyBtZXRob2QgcmV0dXJucwotXGNvZGV7Tm9uZX0uICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGRlZmF1bHQKLVxtZXRob2R7aGFuZGxlX2NoYXJyZWYoKX0gaW1wbGVtZW50YXRpb24gYW5kIGJ5IHRoZSBhdHRyaWJ1dGUgdmFsdWUKLXBhcnNlci4KLVx2ZXJzaW9uYWRkZWR7Mi41fQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Y29udmVydF9jb2RlcG9pbnR9e2NvZGVwb2ludH0KLUNvbnZlcnQgYSBjb2RlcG9pbnQgdG8gYSBcY2xhc3N7c3RyfSB2YWx1ZS4gIEVuY29kaW5ncyBjYW4gYmUgaGFuZGxlZAotaGVyZSBpZiBhcHByb3ByaWF0ZSwgdGhvdWdoIHRoZSByZXN0IG9mIFxtb2R1bGV7c2dtbGxpYn0gaXMgb2JsaXZpb3VzCi1vbiB0aGlzIG1hdHRlci4KLVx2ZXJzaW9uYWRkZWR7Mi41fQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317aGFuZGxlX2VudGl0eXJlZn17cmVmfQotVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIHByb2Nlc3MgYSBnZW5lcmFsIGVudGl0eSByZWZlcmVuY2Ugb2YgdGhlCi1mb3JtIFxzYW1we1wmXHZhcntyZWZ9O30gd2hlcmUgXHZhcntyZWZ9IGlzIGFuIGdlbmVyYWwgZW50aXR5Ci1yZWZlcmVuY2UuICBJdCBjb252ZXJ0cyBcdmFye3JlZn0gYnkgcGFzc2luZyBpdCB0bwotXG1ldGhvZHtjb252ZXJ0X2VudGl0eXJlZigpfS4gIElmIGEgdHJhbnNsYXRpb24gaXMgcmV0dXJuZWQsIGl0Ci1jYWxscyB0aGUgbWV0aG9kIFxtZXRob2R7aGFuZGxlX2RhdGEoKX0gd2l0aCB0aGUgdHJhbnNsYXRpb247Ci1vdGhlcndpc2UsIGl0IGNhbGxzIHRoZSBtZXRob2QgXGNvZGV7dW5rbm93bl9lbnRpdHlyZWYoXHZhcntyZWZ9KX0uCi1UaGUgZGVmYXVsdCBcbWVtYmVye2VudGl0eWRlZnN9IGRlZmluZXMgdHJhbnNsYXRpb25zIGZvcgotXGNvZGV7XCZhbXA7fSwgXGNvZGV7XCZhcG9zfSwgXGNvZGV7XCZndDt9LCBcY29kZXtcJmx0O30sIGFuZAotXGNvZGV7XCZxdW90O30uCi1cdmVyc2lvbmNoYW5nZWRbVXNlIFxtZXRob2R7Y29udmVydF9lbnRpdHlyZWYoKX0gaW5zdGVhZCBvZiBoYXJkLWNvZGluZwotdGhlIGNvbnZlcnNpb25dezIuNX0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2NvbnZlcnRfZW50aXR5cmVmfXtyZWZ9Ci1Db252ZXJ0IGEgbmFtZWQgZW50aXR5IHJlZmVyZW5jZSB0byBhIFxjbGFzc3tzdHJ9IHZhbHVlLCBvcgotXGNvZGV7Tm9uZX0uICBUaGUgcmVzdWx0aW5nIHZhbHVlIHdpbGwgbm90IGJlIHBhcnNlZC4gIFx2YXJ7cmVmfSB3aWxsCi1iZSBvbmx5IHRoZSBuYW1lIG9mIHRoZSBlbnRpdHkuICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBsb29rcyBmb3IKLVx2YXJ7cmVmfSBpbiB0aGUgaW5zdGFuY2UgKG9yIGNsYXNzKSB2YXJpYWJsZSBcbWVtYmVye2VudGl0eWRlZnN9Ci13aGljaCBzaG91bGQgYmUgYSBtYXBwaW5nIGZyb20gZW50aXR5IG5hbWVzIHRvIGNvcnJlc3BvbmRpbmcKLXRyYW5zbGF0aW9ucy4gIElmIG5vIHRyYW5zbGF0aW9uIGlzIGF2YWlsYWJsZSBmb3IgXHZhcntyZWZ9LCB0aGlzCi1tZXRob2QgcmV0dXJucyBcY29kZXtOb25lfS4gIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgZGVmYXVsdAotXG1ldGhvZHtoYW5kbGVfZW50aXR5cmVmKCl9IGltcGxlbWVudGF0aW9uIGFuZCBieSB0aGUgYXR0cmlidXRlIHZhbHVlCi1wYXJzZXIuCi1cdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2hhbmRsZV9jb21tZW50fXtjb21tZW50fQotVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYSBjb21tZW50IGlzIGVuY291bnRlcmVkLiAgVGhlCi1cdmFye2NvbW1lbnR9IGFyZ3VtZW50IGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHRleHQgYmV0d2VlbiB0aGUKLVxzYW1wezwhLS19IGFuZCBcc2FtcHstLT59IGRlbGltaXRlcnMsIGJ1dCBub3QgdGhlIGRlbGltaXRlcnMKLXRoZW1zZWx2ZXMuICBGb3IgZXhhbXBsZSwgdGhlIGNvbW1lbnQgXHNhbXB7PCEtLXRleHQtLT59IHdpbGwKLWNhdXNlIHRoaXMgbWV0aG9kIHRvIGJlIGNhbGxlZCB3aXRoIHRoZSBhcmd1bWVudCBcY29kZXsndGV4dCd9LiAgVGhlCi1kZWZhdWx0IG1ldGhvZCBkb2VzIG5vdGhpbmcuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtoYW5kbGVfZGVjbH17ZGF0YX0KLU1ldGhvZCBjYWxsZWQgd2hlbiBhbiBTR01MIGRlY2xhcmF0aW9uIGlzIHJlYWQgYnkgdGhlIHBhcnNlci4gIEluCi1wcmFjdGljZSwgdGhlIFxjb2Rle0RPQ1RZUEV9IGRlY2xhcmF0aW9uIGlzIHRoZSBvbmx5IHRoaW5nIG9ic2VydmVkIGluCi1IVE1MLCBidXQgdGhlIHBhcnNlciBkb2VzIG5vdCBkaXNjcmltaW5hdGUgYW1vbmcgZGlmZmVyZW50IChvciBicm9rZW4pCi1kZWNsYXJhdGlvbnMuICBJbnRlcm5hbCBzdWJzZXRzIGluIGEgXGNvZGV7RE9DVFlQRX0gZGVjbGFyYXRpb24gYXJlCi1ub3Qgc3VwcG9ydGVkLiAgVGhlIFx2YXJ7ZGF0YX0gcGFyYW1ldGVyIHdpbGwgYmUgdGhlIGVudGlyZSBjb250ZW50cwotb2YgdGhlIGRlY2xhcmF0aW9uIGluc2lkZSB0aGUgXGNvZGV7PCF9Li4uXGNvZGV7Pn0gbWFya3VwLiAgVGhlCi1kZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3JlcG9ydF91bmJhbGFuY2VkfXt0YWd9Ci1UaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhbiBlbmQgdGFnIGlzIGZvdW5kIHdoaWNoIGRvZXMgbm90Ci1jb3JyZXNwb25kIHRvIGFueSBvcGVuIGVsZW1lbnQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXt1bmtub3duX3N0YXJ0dGFnfXt0YWcsIGF0dHJpYnV0ZXN9Ci1UaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gcHJvY2VzcyBhbiB1bmtub3duIHN0YXJ0IHRhZy4gIEl0IGlzIGludGVuZGVkCi10byBiZSBvdmVycmlkZGVuIGJ5IGEgZGVyaXZlZCBjbGFzczsgdGhlIGJhc2UgY2xhc3MgaW1wbGVtZW50YXRpb24KLWRvZXMgbm90aGluZy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3Vua25vd25fZW5kdGFnfXt0YWd9Ci1UaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gcHJvY2VzcyBhbiB1bmtub3duIGVuZCB0YWcuICBJdCBpcyBpbnRlbmRlZAotdG8gYmUgb3ZlcnJpZGRlbiBieSBhIGRlcml2ZWQgY2xhc3M7IHRoZSBiYXNlIGNsYXNzIGltcGxlbWVudGF0aW9uCi1kb2VzIG5vdGhpbmcuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXt1bmtub3duX2NoYXJyZWZ9e3JlZn0KLVRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBwcm9jZXNzIHVucmVzb2x2YWJsZSBudW1lcmljIGNoYXJhY3RlcgotcmVmZXJlbmNlcy4gIFJlZmVyIHRvIFxtZXRob2R7aGFuZGxlX2NoYXJyZWYoKX0gdG8gZGV0ZXJtaW5lIHdoYXQgaXMKLWhhbmRsZWQgYnkgZGVmYXVsdC4gIEl0IGlzIGludGVuZGVkIHRvIGJlIG92ZXJyaWRkZW4gYnkgYSBkZXJpdmVkCi1jbGFzczsgdGhlIGJhc2UgY2xhc3MgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317dW5rbm93bl9lbnRpdHlyZWZ9e3JlZn0KLVRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBwcm9jZXNzIGFuIHVua25vd24gZW50aXR5IHJlZmVyZW5jZS4gIEl0IGlzCi1pbnRlbmRlZCB0byBiZSBvdmVycmlkZGVuIGJ5IGEgZGVyaXZlZCBjbGFzczsgdGhlIGJhc2UgY2xhc3MKLWltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KLVxlbmR7bWV0aG9kZGVzY30KLQotQXBhcnQgZnJvbSBvdmVycmlkaW5nIG9yIGV4dGVuZGluZyB0aGUgbWV0aG9kcyBsaXN0ZWQgYWJvdmUsIGRlcml2ZWQKLWNsYXNzZXMgbWF5IGFsc28gZGVmaW5lIG1ldGhvZHMgb2YgdGhlIGZvbGxvd2luZyBmb3JtIHRvIGRlZmluZQotcHJvY2Vzc2luZyBvZiBzcGVjaWZpYyB0YWdzLiAgVGFnIG5hbWVzIGluIHRoZSBpbnB1dCBzdHJlYW0gYXJlIGNhc2UKLWluZGVwZW5kZW50OyB0aGUgXHZhcnt0YWd9IG9jY3VycmluZyBpbiBtZXRob2QgbmFtZXMgbXVzdCBiZSBpbiBsb3dlcgotY2FzZToKLQotXGJlZ2lue21ldGhvZGRlc2NuaX17c3RhcnRfXHZhcnt0YWd9fXthdHRyaWJ1dGVzfQotVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIHByb2Nlc3MgYW4gb3BlbmluZyB0YWcgXHZhcnt0YWd9LiAgSXQgaGFzCi1wcmVmZXJlbmNlIG92ZXIgXG1ldGhvZHtkb19cdmFye3RhZ30oKX0uICBUaGUKLVx2YXJ7YXR0cmlidXRlc30gYXJndW1lbnQgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgZGVzY3JpYmVkIGZvcgotXG1ldGhvZHtoYW5kbGVfc3RhcnR0YWcoKX0gYWJvdmUuCi1cZW5ke21ldGhvZGRlc2NuaX0KLQotXGJlZ2lue21ldGhvZGRlc2NuaX17ZG9fXHZhcnt0YWd9fXthdHRyaWJ1dGVzfQotVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIHByb2Nlc3MgYW4gb3BlbmluZyB0YWcgXHZhcnt0YWd9IAotZm9yIHdoaWNoIG5vIFxtZXRob2R7c3RhcnRfXHZhcnt0YWd9fSBtZXRob2QgaXMgZGVmaW5lZC4gIAotVGhlIFx2YXJ7YXR0cmlidXRlc30gYXJndW1lbnQKLWhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIGRlc2NyaWJlZCBmb3IgXG1ldGhvZHtoYW5kbGVfc3RhcnR0YWcoKX0gYWJvdmUuCi1cZW5ke21ldGhvZGRlc2NuaX0KLQotXGJlZ2lue21ldGhvZGRlc2NuaX17ZW5kX1x2YXJ7dGFnfX17fQotVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIHByb2Nlc3MgYSBjbG9zaW5nIHRhZyBcdmFye3RhZ30uCi1cZW5ke21ldGhvZGRlc2NuaX0KLQotTm90ZSB0aGF0IHRoZSBwYXJzZXIgbWFpbnRhaW5zIGEgc3RhY2sgb2Ygb3BlbiBlbGVtZW50cyBmb3Igd2hpY2ggbm8KLWVuZCB0YWcgaGFzIGJlZW4gZm91bmQgeWV0LiAgT25seSB0YWdzIHByb2Nlc3NlZCBieQotXG1ldGhvZHtzdGFydF9cdmFye3RhZ30oKX0gYXJlIHB1c2hlZCBvbiB0aGlzIHN0YWNrLiAgRGVmaW5pdGlvbiBvZiBhbgotXG1ldGhvZHtlbmRfXHZhcnt0YWd9KCl9IG1ldGhvZCBpcyBvcHRpb25hbCBmb3IgdGhlc2UgdGFncy4gIEZvciB0YWdzCi1wcm9jZXNzZWQgYnkgXG1ldGhvZHtkb19cdmFye3RhZ30oKX0gb3IgYnkgXG1ldGhvZHt1bmtub3duX3RhZygpfSwgbm8KLVxtZXRob2R7ZW5kX1x2YXJ7dGFnfSgpfSBtZXRob2QgbXVzdCBiZSBkZWZpbmVkOyBpZiBkZWZpbmVkLCBpdCB3aWxsCi1ub3QgYmUgdXNlZC4gIElmIGJvdGggXG1ldGhvZHtzdGFydF9cdmFye3RhZ30oKX0gYW5kCi1cbWV0aG9ke2RvX1x2YXJ7dGFnfSgpfSBtZXRob2RzIGV4aXN0IGZvciBhIHRhZywgdGhlCi1cbWV0aG9ke3N0YXJ0X1x2YXJ7dGFnfSgpfSBtZXRob2QgdGFrZXMgcHJlY2VkZW5jZS4KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic2hlbHZlLnRleCBiL0RvYy9saWIvbGlic2hlbHZlLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNhMzU3Ni4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnNoZWx2ZS50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtzaGVsdmV9IC0tLQotICAgICAgICAgUHl0aG9uIG9iamVjdCBwZXJzaXN0ZW5jZX0KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e3NoZWx2ZX0KLVxtb2R1bGVzeW5vcHNpc3tQeXRob24gb2JqZWN0IHBlcnNpc3RlbmNlLn0KLQotCi1BIGBgc2hlbGYnJyBpcyBhIHBlcnNpc3RlbnQsIGRpY3Rpb25hcnktbGlrZSBvYmplY3QuICBUaGUgZGlmZmVyZW5jZQotd2l0aCBgYGRibScnIGRhdGFiYXNlcyBpcyB0aGF0IHRoZSB2YWx1ZXMgKG5vdCB0aGUga2V5cyEpIGluIGEgc2hlbGYKLWNhbiBiZSBlc3NlbnRpYWxseSBhcmJpdHJhcnkgUHl0aG9uIG9iamVjdHMgLS0tIGFueXRoaW5nIHRoYXQgdGhlCi1ccmVmbW9kdWxle3BpY2tsZX0gbW9kdWxlIGNhbiBoYW5kbGUuICBUaGlzIGluY2x1ZGVzIG1vc3QgY2xhc3MKLWluc3RhbmNlcywgcmVjdXJzaXZlIGRhdGEgdHlwZXMsIGFuZCBvYmplY3RzIGNvbnRhaW5pbmcgbG90cyBvZiBzaGFyZWQgCi1zdWItb2JqZWN0cy4gIFRoZSBrZXlzIGFyZSBvcmRpbmFyeSBzdHJpbmdzLgotXHJlZnN0bW9kaW5kZXh7cGlja2xlfQotCi1cYmVnaW57ZnVuY2Rlc2N9e29wZW59e2ZpbGVuYW1lXG9wdGlvbmFseyxmbGFnPSdjJ1xvcHRpb25hbHsscHJvdG9jb2w9XGNvZGV7Tm9uZX1cb3B0aW9uYWx7LHdyaXRlYmFjaz1cY29kZXtGYWxzZX19fX19Ci1PcGVuIGEgcGVyc2lzdGVudCBkaWN0aW9uYXJ5LiAgVGhlIGZpbGVuYW1lIHNwZWNpZmllZCBpcyB0aGUgYmFzZSBmaWxlbmFtZQotZm9yIHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlLiAgQXMgYSBzaWRlLWVmZmVjdCwgYW4gZXh0ZW5zaW9uIG1heSBiZSBhZGRlZCB0bwotdGhlIGZpbGVuYW1lIGFuZCBtb3JlIHRoYW4gb25lIGZpbGUgbWF5IGJlIGNyZWF0ZWQuICBCeSBkZWZhdWx0LCB0aGUKLXVuZGVybHlpbmcgZGF0YWJhc2UgZmlsZSBpcyBvcGVuZWQgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuICBUaGUgb3B0aW9uYWwKLXt9XHZhcntmbGFnfSBwYXJhbWV0ZXIgaGFzIHRoZSBzYW1lIGludGVycHJldGF0aW9uIGFzIHRoZSBcdmFye2ZsYWd9Ci1wYXJhbWV0ZXIgb2YgXGZ1bmN0aW9ue2FueWRibS5vcGVufS4gIAotCi1CeSBkZWZhdWx0LCB2ZXJzaW9uIDAgcGlja2xlcyBhcmUgdXNlZCB0byBzZXJpYWxpemUgdmFsdWVzLiAKLVRoZSB2ZXJzaW9uIG9mIHRoZSBwaWNrbGUgcHJvdG9jb2wgY2FuIGJlIHNwZWNpZmllZCB3aXRoIHRoZQotXHZhcntwcm90b2NvbH0gcGFyYW1ldGVyLiBcdmVyc2lvbmNoYW5nZWRbVGhlIFx2YXJ7cHJvdG9jb2x9Ci1wYXJhbWV0ZXIgd2FzIGFkZGVkXXsyLjN9Ci0KLUJ5IGRlZmF1bHQsIG11dGF0aW9ucyB0byBwZXJzaXN0ZW50LWRpY3Rpb25hcnkgbXV0YWJsZSBlbnRyaWVzIGFyZSBub3QKLWF1dG9tYXRpY2FsbHkgd3JpdHRlbiBiYWNrLiAgSWYgdGhlIG9wdGlvbmFsIFx2YXJ7d3JpdGViYWNrfSBwYXJhbWV0ZXIKLWlzIHNldCB0byB7fVx2YXJ7VHJ1ZX0sIGFsbCBlbnRyaWVzIGFjY2Vzc2VkIGFyZSBjYWNoZWQgaW4gbWVtb3J5LCBhbmQKLXdyaXR0ZW4gYmFjayBhdCBjbG9zZSB0aW1lOyB0aGlzIGNhbiBtYWtlIGl0IGhhbmRpZXIgdG8gbXV0YXRlIG11dGFibGUKLWVudHJpZXMgaW4gdGhlIHBlcnNpc3RlbnQgZGljdGlvbmFyeSwgYnV0LCBpZiBtYW55IGVudHJpZXMgYXJlCi1hY2Nlc3NlZCwgaXQgY2FuIGNvbnN1bWUgdmFzdCBhbW91bnRzIG9mIG1lbW9yeSBmb3IgdGhlIGNhY2hlLCBhbmQgaXQKLWNhbiBtYWtlIHRoZSBjbG9zZSBvcGVyYXRpb24gdmVyeSBzbG93IHNpbmNlIGFsbCBhY2Nlc3NlZCBlbnRyaWVzIGFyZQotd3JpdHRlbiBiYWNrICh0aGVyZSBpcyBubyB3YXkgdG8gZGV0ZXJtaW5lIHdoaWNoIGFjY2Vzc2VkIGVudHJpZXMgYXJlCi1tdXRhYmxlLCBub3Igd2hpY2ggb25lcyB3ZXJlIGFjdHVhbGx5IG11dGF0ZWQpLgotCi1cZW5ke2Z1bmNkZXNjfQotCi1TaGVsdmUgb2JqZWN0cyBzdXBwb3J0IGFsbCBtZXRob2RzIHN1cHBvcnRlZCBieSBkaWN0aW9uYXJpZXMuICBUaGlzIGVhc2VzCi10aGUgdHJhbnNpdGlvbiBmcm9tIGRpY3Rpb25hcnkgYmFzZWQgc2NyaXB0cyB0byB0aG9zZSByZXF1aXJpbmcgcGVyc2lzdGVudAotc3RvcmFnZS4KLQotT25lIGFkZGl0aW9uYWwgbWV0aG9kIGlzIHN1cHBvcnRlZDoKLVxiZWdpbnttZXRob2RkZXNjfVtTaGVsZl17c3luY317fQotV3JpdGUgYmFjayBhbGwgZW50cmllcyBpbiB0aGUgY2FjaGUgaWYgdGhlIHNoZWxmIHdhcyBvcGVuZWQgd2l0aAotXHZhcnt3cml0ZWJhY2t9IHNldCB0byBcdmFye1RydWV9LiBBbHNvIGVtcHR5IHRoZSBjYWNoZSBhbmQgc3luY2hyb25pemUKLXRoZSBwZXJzaXN0ZW50IGRpY3Rpb25hcnkgb24gZGlzaywgaWYgZmVhc2libGUuICBUaGlzIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5Ci13aGVuIHRoZSBzaGVsZiBpcyBjbG9zZWQgd2l0aCBcbWV0aG9ke2Nsb3NlKCl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cc3Vic2VjdGlvbntSZXN0cmljdGlvbnN9Ci0KLVxiZWdpbntpdGVtaXplfQotCi1caXRlbQotVGhlIGNob2ljZSBvZiB3aGljaCBkYXRhYmFzZSBwYWNrYWdlIHdpbGwgYmUgdXNlZAotKHN1Y2ggYXMgXHJlZm1vZHVsZXtkYm19LCBccmVmbW9kdWxle2dkYm19IG9yIFxyZWZtb2R1bGV7YnNkZGJ9KSBkZXBlbmRzIG9uCi13aGljaCBpbnRlcmZhY2UgaXMgYXZhaWxhYmxlLiAgVGhlcmVmb3JlIGl0IGlzIG5vdCBzYWZlIHRvIG9wZW4gdGhlIGRhdGFiYXNlCi1kaXJlY3RseSB1c2luZyBccmVmbW9kdWxle2RibX0uICBUaGUgZGF0YWJhc2UgaXMgYWxzbyAodW5mb3J0dW5hdGVseSkgc3ViamVjdAotdG8gdGhlIGxpbWl0YXRpb25zIG9mIFxyZWZtb2R1bGV7ZGJtfSwgaWYgaXQgaXMgdXNlZCAtLS0gdGhpcyBtZWFucwotdGhhdCAodGhlIHBpY2tsZWQgcmVwcmVzZW50YXRpb24gb2YpIHRoZSBvYmplY3RzIHN0b3JlZCBpbiB0aGUKLWRhdGFiYXNlIHNob3VsZCBiZSBmYWlybHkgc21hbGwsIGFuZCBpbiByYXJlIGNhc2VzIGtleSBjb2xsaXNpb25zIG1heQotY2F1c2UgdGhlIGRhdGFiYXNlIHRvIHJlZnVzZSB1cGRhdGVzLgotXHJlZmJpbW9kaW5kZXh7ZGJtfQotXHJlZmJpbW9kaW5kZXh7Z2RibX0KLVxyZWZiaW1vZGluZGV4e2JzZGRifQotCi1caXRlbQotRGVwZW5kaW5nIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiwgY2xvc2luZyBhIHBlcnNpc3RlbnQgZGljdGlvbmFyeSBtYXkKLW9yIG1heSBub3QgYmUgbmVjZXNzYXJ5IHRvIGZsdXNoIGNoYW5nZXMgdG8gZGlzay4gIFRoZSBcbWV0aG9ke19fZGVsX199Ci1tZXRob2Qgb2YgdGhlIFxjbGFzc3tTaGVsZn0gY2xhc3MgY2FsbHMgdGhlIFxtZXRob2R7Y2xvc2V9IG1ldGhvZCwgc28gdGhlCi1wcm9ncmFtbWVyIGdlbmVyYWxseSBuZWVkIG5vdCBkbyB0aGlzIGV4cGxpY2l0bHkuCi0KLVxpdGVtCi1UaGUgXG1vZHVsZXtzaGVsdmV9IG1vZHVsZSBkb2VzIG5vdCBzdXBwb3J0IFxlbXBoe2NvbmN1cnJlbnR9IHJlYWQvd3JpdGUKLWFjY2VzcyB0byBzaGVsdmVkIG9iamVjdHMuICAoTXVsdGlwbGUgc2ltdWx0YW5lb3VzIHJlYWQgYWNjZXNzZXMgYXJlCi1zYWZlLikgIFdoZW4gYSBwcm9ncmFtIGhhcyBhIHNoZWxmIG9wZW4gZm9yIHdyaXRpbmcsIG5vIG90aGVyIHByb2dyYW0KLXNob3VsZCBoYXZlIGl0IG9wZW4gZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4gIFxVTklYe30gZmlsZSBsb2NraW5nIGNhbgotYmUgdXNlZCB0byBzb2x2ZSB0aGlzLCBidXQgdGhpcyBkaWZmZXJzIGFjcm9zcyBcVU5JWHt9IHZlcnNpb25zIGFuZAotcmVxdWlyZXMga25vd2xlZGdlIGFib3V0IHRoZSBkYXRhYmFzZSBpbXBsZW1lbnRhdGlvbiB1c2VkLgotCi1cZW5ke2l0ZW1pemV9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1NoZWxmfXtkaWN0XG9wdGlvbmFseywgcHJvdG9jb2w9Tm9uZVxvcHRpb25hbHssIHdyaXRlYmFjaz1GYWxzZX19fQotQSBzdWJjbGFzcyBvZiBcY2xhc3N7VXNlckRpY3QuRGljdE1peGlufSB3aGljaCBzdG9yZXMgcGlja2xlZCB2YWx1ZXMgaW4gdGhlCi1cdmFye2RpY3R9IG9iamVjdC4gIAotCi1CeSBkZWZhdWx0LCB2ZXJzaW9uIDAgcGlja2xlcyBhcmUgdXNlZCB0byBzZXJpYWxpemUgdmFsdWVzLiAgVGhlCi12ZXJzaW9uIG9mIHRoZSBwaWNrbGUgcHJvdG9jb2wgY2FuIGJlIHNwZWNpZmllZCB3aXRoIHRoZQotXHZhcntwcm90b2NvbH0gcGFyYW1ldGVyLiBTZWUgdGhlIFxtb2R1bGV7cGlja2xlfSBkb2N1bWVudGF0aW9uIGZvciBhCi1kaXNjdXNzaW9uIG9mIHRoZSBwaWNrbGUgcHJvdG9jb2xzLiBcdmVyc2lvbmNoYW5nZWRbVGhlIFx2YXJ7cHJvdG9jb2x9Ci1wYXJhbWV0ZXIgd2FzIGFkZGVkXXsyLjN9Ci0KLUlmIHRoZSBcdmFye3dyaXRlYmFja30gcGFyYW1ldGVyIGlzIFxjb2Rle1RydWV9LCB0aGUgb2JqZWN0IHdpbGwgaG9sZCBhCi1jYWNoZSBvZiBhbGwgZW50cmllcyBhY2Nlc3NlZCBhbmQgd3JpdGUgdGhlbSBiYWNrIHRvIHRoZSBcdmFye2RpY3R9IGF0Ci1zeW5jIGFuZCBjbG9zZSB0aW1lcy4gIFRoaXMgYWxsb3dzIG5hdHVyYWwgb3BlcmF0aW9ucyBvbiBtdXRhYmxlIGVudHJpZXMsCi1idXQgY2FuIGNvbnN1bWUgbXVjaCBtb3JlIG1lbW9yeSBhbmQgbWFrZSBzeW5jIGFuZCBjbG9zZSB0YWtlIGEgbG9uZyB0aW1lLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0JzZERiU2hlbGZ9e2RpY3Rcb3B0aW9uYWx7LCBwcm90b2NvbD1Ob25lXG9wdGlvbmFseywgd3JpdGViYWNrPUZhbHNlfX19Ci0KLUEgc3ViY2xhc3Mgb2YgXGNsYXNze1NoZWxmfSB3aGljaCBleHBvc2VzIFxtZXRob2R7Zmlyc3R9LAotXG1ldGhvZHtuZXh0fSwgXG1ldGhvZHtwcmV2aW91c30sIFxtZXRob2R7bGFzdH0gYW5kCi1cbWV0aG9ke3NldF9sb2NhdGlvbn0gd2hpY2ggYXJlIGF2YWlsYWJsZSBpbiB0aGUgXG1vZHVsZXtic2RkYn0gbW9kdWxlCi1idXQgbm90IGluIG90aGVyIGRhdGFiYXNlIG1vZHVsZXMuICBUaGUgXHZhcntkaWN0fSBvYmplY3QgcGFzc2VkIHRvCi10aGUgY29uc3RydWN0b3IgbXVzdCBzdXBwb3J0IHRob3NlIG1ldGhvZHMuICBUaGlzIGlzIGdlbmVyYWxseQotYWNjb21wbGlzaGVkIGJ5IGNhbGxpbmcgb25lIG9mIFxmdW5jdGlvbntic2RkYi5oYXNob3Blbn0sCi1cZnVuY3Rpb257YnNkZGIuYnRvcGVufSBvciBcZnVuY3Rpb257YnNkZGIucm5vcGVufS4gIFRoZSBvcHRpb25hbAotXHZhcntwcm90b2NvbH0gYW5kIFx2YXJ7d3JpdGViYWNrfSBwYXJhbWV0ZXJzIGhhdmUgdGhlCi1zYW1lIGludGVycHJldGF0aW9uIGFzIGZvciB0aGUgXGNsYXNze1NoZWxmfSBjbGFzcy4KLQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0RiZmlsZW5hbWVTaGVsZn17ZmlsZW5hbWVcb3B0aW9uYWx7LCBmbGFnPSdjJ1xvcHRpb25hbHssIHByb3RvY29sPU5vbmVcb3B0aW9uYWx7LCB3cml0ZWJhY2s9RmFsc2V9fX19Ci0KLUEgc3ViY2xhc3Mgb2YgXGNsYXNze1NoZWxmfSB3aGljaCBhY2NlcHRzIGEgXHZhcntmaWxlbmFtZX0gaW5zdGVhZCBvZgotYSBkaWN0LWxpa2Ugb2JqZWN0LiAgVGhlIHVuZGVybHlpbmcgZmlsZSB3aWxsIGJlIG9wZW5lZCB1c2luZwote31cZnVuY3Rpb257YW55ZGJtLm9wZW59LiAgQnkgZGVmYXVsdCwgdGhlIGZpbGUgd2lsbCBiZSBjcmVhdGVkIGFuZAotb3BlbmVkIGZvciBib3RoIHJlYWQgYW5kIHdyaXRlLiAgVGhlIG9wdGlvbmFsIFx2YXJ7ZmxhZ30gcGFyYW1ldGVyIGhhcwotdGhlIHNhbWUgaW50ZXJwcmV0YXRpb24gYXMgZm9yIHRoZSBcZnVuY3Rpb257b3Blbn0gZnVuY3Rpb24uICBUaGUKLW9wdGlvbmFsIFx2YXJ7cHJvdG9jb2x9IGFuZCBcdmFye3dyaXRlYmFja30gcGFyYW1ldGVycwotaGF2ZSB0aGUgc2FtZSBpbnRlcnByZXRhdGlvbiBhcyBmb3IgdGhlIFxjbGFzc3tTaGVsZn0gY2xhc3MuCi0gCi1cZW5ke2NsYXNzZGVzY30KLQotXHN1YnNlY3Rpb257RXhhbXBsZX0KLQotVG8gc3VtbWFyaXplIHRoZSBpbnRlcmZhY2UgKFxjb2Rle2tleX0gaXMgYSBzdHJpbmcsIFxjb2Rle2RhdGF9IGlzIGFuCi1hcmJpdHJhcnkgb2JqZWN0KToKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IHNoZWx2ZQotCi1kID0gc2hlbHZlLm9wZW4oZmlsZW5hbWUpICMgb3BlbiAtLSBmaWxlIG1heSBnZXQgc3VmZml4IGFkZGVkIGJ5IGxvdy1sZXZlbAotICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxpYnJhcnkKLQotZFtrZXldID0gZGF0YSAgICMgc3RvcmUgZGF0YSBhdCBrZXkgKG92ZXJ3cml0ZXMgb2xkIGRhdGEgaWYKLSAgICAgICAgICAgICAgICAjIHVzaW5nIGFuIGV4aXN0aW5nIGtleSkKLWRhdGEgPSBkW2tleV0gICAjIHJldHJpZXZlIGEgQ09QWSBvZiBkYXRhIGF0IGtleSAocmFpc2UgS2V5RXJyb3IgaWYgbm8KLSAgICAgICAgICAgICAgICAjIHN1Y2gga2V5KQotZGVsIGRba2V5XSAgICAgICMgZGVsZXRlIGRhdGEgc3RvcmVkIGF0IGtleSAocmFpc2VzIEtleUVycm9yCi0gICAgICAgICAgICAgICAgIyBpZiBubyBzdWNoIGtleSkKLWZsYWcgPSBkLmhhc19rZXkoa2V5KSAgICMgdHJ1ZSBpZiB0aGUga2V5IGV4aXN0cwota2xpc3QgPSBkLmtleXMoKSAjIGEgbGlzdCBvZiBhbGwgZXhpc3Rpbmcga2V5cyAoc2xvdyEpCi0KLSMgYXMgZCB3YXMgb3BlbmVkIFdJVEhPVVQgd3JpdGViYWNrPVRydWUsIGJld2FyZToKLWRbJ3h4J10gPSByYW5nZSg0KSAgIyB0aGlzIHdvcmtzIGFzIGV4cGVjdGVkLCBidXQuLi4KLWRbJ3h4J10uYXBwZW5kKDUpICAgIyAqdGhpcyBkb2Vzbid0ISogLS0gZFsneHgnXSBpcyBTVElMTCByYW5nZSg0KSEhIQotCi0jIGhhdmluZyBvcGVuZWQgZCB3aXRob3V0IHdyaXRlYmFjaz1UcnVlLCB5b3UgbmVlZCB0byBjb2RlIGNhcmVmdWxseToKLXRlbXAgPSBkWyd4eCddICAgICAgIyBleHRyYWN0cyB0aGUgY29weQotdGVtcC5hcHBlbmQoNSkgICAgICAjIG11dGF0ZXMgdGhlIGNvcHkKLWRbJ3h4J10gPSB0ZW1wICAgICAgIyBzdG9yZXMgdGhlIGNvcHkgcmlnaHQgYmFjaywgdG8gcGVyc2lzdCBpdAotCi0jIG9yLCBkPXNoZWx2ZS5vcGVuKGZpbGVuYW1lLHdyaXRlYmFjaz1UcnVlKSB3b3VsZCBsZXQgeW91IGp1c3QgY29kZQotIyBkWyd4eCddLmFwcGVuZCg1KSBhbmQgaGF2ZSBpdCB3b3JrIGFzIGV4cGVjdGVkLCBCVVQgaXQgd291bGQgYWxzbwotIyBjb25zdW1lIG1vcmUgbWVtb3J5IGFuZCBtYWtlIHRoZSBkLmNsb3NlKCkgb3BlcmF0aW9uIHNsb3dlci4KLQotZC5jbG9zZSgpICAgICAgICMgY2xvc2UgaXQKLVxlbmR7dmVyYmF0aW19Ci0KLVxiZWdpbntzZWVhbHNvfQotICBcc2VlbW9kdWxle2FueWRibX17R2VuZXJpYyBpbnRlcmZhY2UgdG8gXGNvZGV7ZGJtfS1zdHlsZSBkYXRhYmFzZXMufQotICBcc2VlbW9kdWxle2JzZGRifXtCU0QgXGNvZGV7ZGJ9IGRhdGFiYXNlIGludGVyZmFjZS59Ci0gIFxzZWVtb2R1bGV7ZGJoYXNofXtUaGluIGxheWVyIGFyb3VuZCB0aGUgXG1vZHVsZXtic2RkYn0gd2hpY2ggcHJvdmlkZXMgYW4KLSAgXGZ1bmN0aW9ue29wZW59IGZ1bmN0aW9uIGxpa2UgdGhlIG90aGVyIGRhdGFiYXNlIG1vZHVsZXMufQotICBcc2VlbW9kdWxle2RibX17U3RhbmRhcmQgXFVOSVh7fSBkYXRhYmFzZSBpbnRlcmZhY2UufQotICBcc2VlbW9kdWxle2R1bWJkYm19e1BvcnRhYmxlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBcY29kZXtkYm19IGludGVyZmFjZS59Ci0gIFxzZWVtb2R1bGV7Z2RibX17R05VIGRhdGFiYXNlIGludGVyZmFjZSwgYmFzZWQgb24gdGhlIFxjb2Rle2RibX0gaW50ZXJmYWNlLn0KLSAgXHNlZW1vZHVsZXtwaWNrbGV9e09iamVjdCBzZXJpYWxpemF0aW9uIHVzZWQgYnkgXG1vZHVsZXtzaGVsdmV9Ln0KLSAgXHNlZW1vZHVsZXtjUGlja2xlfXtIaWdoLXBlcmZvcm1hbmNlIHZlcnNpb24gb2YgXHJlZm1vZHVsZXtwaWNrbGV9Ln0KLVxlbmR7c2VlYWxzb30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic2hsZXgudGV4IGIvRG9jL2xpYi9saWJzaGxleC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMGFlOWYuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJzaGxleC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtzaGxleH0gLS0tCi0gICAgICAgICBTaW1wbGUgbGV4aWNhbCBhbmFseXNpc30KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e3NobGV4fQotXG1vZHVsZXN5bm9wc2lze1NpbXBsZSBsZXhpY2FsIGFuYWx5c2lzIGZvciBcVU5JWFwgc2hlbGwtbGlrZSBsYW5ndWFnZXMufQotXG1vZHVsZWF1dGhvcntFcmljIFMuIFJheW1vbmR9e2VzckBzbmFyay50aHlyc3VzLmNvbX0KLVxtb2R1bGVhdXRob3J7R3VzdGF2byBOaWVtZXllcn17bmllbWV5ZXJAY29uZWN0aXZhLmNvbX0KLVxzZWN0aW9uYXV0aG9ye0VyaWMgUy4gUmF5bW9uZH17ZXNyQHNuYXJrLnRoeXJzdXMuY29tfQotXHNlY3Rpb25hdXRob3J7R3VzdGF2byBOaWVtZXllcn17bmllbWV5ZXJAY29uZWN0aXZhLmNvbX0KLQotXHZlcnNpb25hZGRlZHsxLjUuMn0KLQotVGhlIFxjbGFzc3tzaGxleH0gY2xhc3MgbWFrZXMgaXQgZWFzeSB0byB3cml0ZSBsZXhpY2FsIGFuYWx5emVycyBmb3IKLXNpbXBsZSBzeW50YXhlcyByZXNlbWJsaW5nIHRoYXQgb2YgdGhlIFxVTklYe30gc2hlbGwuICBUaGlzIHdpbGwgb2Z0ZW4KLWJlIHVzZWZ1bCBmb3Igd3JpdGluZyBtaW5pbGFuZ3VhZ2VzLCAoZm9yIGV4YW1wbGUsIGluIHJ1biBjb250cm9sCi1maWxlcyBmb3IgUHl0aG9uIGFwcGxpY2F0aW9ucykgb3IgZm9yIHBhcnNpbmcgcXVvdGVkIHN0cmluZ3MuCi0KLVxub3Rle1RoZSBcbW9kdWxle3NobGV4fSBtb2R1bGUgY3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnQgVW5pY29kZSBpbnB1dC59Ci0KLVRoZSBcbW9kdWxle3NobGV4fSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKLQotXGJlZ2lue2Z1bmNkZXNjfXtzcGxpdH17c1xvcHRpb25hbHssIGNvbW1lbnRzXG9wdGlvbmFseywgcG9zaXh9fX0KLVNwbGl0IHRoZSBzdHJpbmcgXHZhcntzfSB1c2luZyBzaGVsbC1saWtlIHN5bnRheC4gSWYgXHZhcntjb21tZW50c30gaXMKLVxjb25zdGFudHtGYWxzZX0gKHRoZSBkZWZhdWx0KSwgdGhlIHBhcnNpbmcgb2YgY29tbWVudHMgaW4gdGhlIGdpdmVuCi1zdHJpbmcgd2lsbCBiZSBkaXNhYmxlZCAoc2V0dGluZyB0aGUgXG1lbWJlcntjb21tZW50ZXJzfSBtZW1iZXIgb2YgdGhlCi1cY2xhc3N7c2hsZXh9IGluc3RhbmNlIHRvIHRoZSBlbXB0eSBzdHJpbmcpLiAgVGhpcyBmdW5jdGlvbiBvcGVyYXRlcwotaW4gXFBPU0lYe30gbW9kZSBieSBkZWZhdWx0LCBidXQgdXNlcyBub24tXFBPU0lYe30gbW9kZSBpZiB0aGUKLVx2YXJ7cG9zaXh9IGFyZ3VtZW50IGlzIGZhbHNlLgotXHZlcnNpb25hZGRlZHsyLjN9Ci1cdmVyc2lvbmNoYW5nZWRbQWRkZWQgdGhlIFx2YXJ7cG9zaXh9IHBhcmFtZXRlcl17Mi42fQotXG5vdGV7U2luY2UgdGhlIFxmdW5jdGlvbntzcGxpdCgpfSBmdW5jdGlvbiBpbnN0YW50aWF0ZXMgYSBcY2xhc3N7c2hsZXh9Ci0gICAgICBpbnN0YW5jZSwgcGFzc2luZyBcY29kZXtOb25lfSBmb3IgXHZhcntzfSB3aWxsIHJlYWQgdGhlIHN0cmluZwotICAgICAgdG8gc3BsaXQgZnJvbSBzdGFuZGFyZCBpbnB1dC59Ci1cZW5ke2Z1bmNkZXNjfQotCi1UaGUgXG1vZHVsZXtzaGxleH0gbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBjbGFzczoKLQotXGJlZ2lue2NsYXNzZGVzY317c2hsZXh9e1xvcHRpb25hbHtpbnN0cmVhbVxvcHRpb25hbHssCi0JCQkgaW5maWxlXG9wdGlvbmFseywgcG9zaXh9fX19Ci1BIFxjbGFzc3tzaGxleH0gaW5zdGFuY2Ugb3Igc3ViY2xhc3MgaW5zdGFuY2UgaXMgYSBsZXhpY2FsIGFuYWx5emVyCi1vYmplY3QuICBUaGUgaW5pdGlhbGl6YXRpb24gYXJndW1lbnQsIGlmIHByZXNlbnQsIHNwZWNpZmllcyB3aGVyZSB0bwotcmVhZCBjaGFyYWN0ZXJzIGZyb20uIEl0IG11c3QgYmUgYSBmaWxlLS9zdHJlYW0tbGlrZSBvYmplY3Qgd2l0aAotXG1ldGhvZHtyZWFkKCl9IGFuZCBcbWV0aG9ke3JlYWRsaW5lKCl9IG1ldGhvZHMsIG9yIGEgc3RyaW5nIChzdHJpbmdzCi1hcmUgYWNjZXB0ZWQgc2luY2UgUHl0aG9uIDIuMykuIElmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCBpbnB1dCB3aWxsIGJlCi10YWtlbiBmcm9tIFxjb2Rle3N5cy5zdGRpbn0uICBUaGUgc2Vjb25kIG9wdGlvbmFsIGFyZ3VtZW50IGlzIGEgZmlsZW5hbWUKLXN0cmluZywgd2hpY2ggc2V0cyB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgXG1lbWJlcntpbmZpbGV9IG1lbWJlci4gIElmCi10aGUgXHZhcntpbnN0cmVhbX0gYXJndW1lbnQgaXMgb21pdHRlZCBvciBlcXVhbCB0byBcY29kZXtzeXMuc3RkaW59LAotdGhpcyBzZWNvbmQgYXJndW1lbnQgZGVmYXVsdHMgdG8gYGBzdGRpbicnLiAgVGhlIFx2YXJ7cG9zaXh9IGFyZ3VtZW50Ci13YXMgaW50cm9kdWNlZCBpbiBQeXRob24gMi4zLCBhbmQgZGVmaW5lcyB0aGUgb3BlcmF0aW9uYWwgbW9kZS4gIFdoZW4KLVx2YXJ7cG9zaXh9IGlzIG5vdCB0cnVlIChkZWZhdWx0KSwgdGhlIFxjbGFzc3tzaGxleH0gaW5zdGFuY2Ugd2lsbAotb3BlcmF0ZSBpbiBjb21wYXRpYmlsaXR5IG1vZGUuICBXaGVuIG9wZXJhdGluZyBpbiBcUE9TSVh7fSBtb2RlLAotXGNsYXNze3NobGV4fSB3aWxsIHRyeSB0byBiZSBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byB0aGUgXFBPU0lYe30gc2hlbGwKLXBhcnNpbmcgcnVsZXMuICBTZWUgc2VjdGlvbn5ccmVme3NobGV4LW9iamVjdHN9LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntzZWVhbHNvfQotICBcc2VlbW9kdWxle0NvbmZpZ1BhcnNlcn17UGFyc2VyIGZvciBjb25maWd1cmF0aW9uIGZpbGVzIHNpbWlsYXIgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5kb3dzIFxmaWxley5pbml9IGZpbGVzLn0KLVxlbmR7c2VlYWxzb30KLQotCi1cc3Vic2VjdGlvbntzaGxleCBPYmplY3RzIFxsYWJlbHtzaGxleC1vYmplY3RzfX0KLQotQSBcY2xhc3N7c2hsZXh9IGluc3RhbmNlIGhhcyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtzaGxleF17Z2V0X3Rva2VufXt9Ci1SZXR1cm4gYSB0b2tlbi4gIElmIHRva2VucyBoYXZlIGJlZW4gc3RhY2tlZCB1c2luZwotXG1ldGhvZHtwdXNoX3Rva2VuKCl9LCBwb3AgYSB0b2tlbiBvZmYgdGhlIHN0YWNrLiAgT3RoZXJ3aXNlLCByZWFkIG9uZQotZnJvbSB0aGUgaW5wdXQgc3RyZWFtLiAgSWYgcmVhZGluZyBlbmNvdW50ZXJzIGFuIGltbWVkaWF0ZQotZW5kLW9mLWZpbGUsIFxtZW1iZXJ7c2VsZi5lb2Z9IGlzIHJldHVybmVkICh0aGUgZW1wdHkgc3RyaW5nIChcY29kZXsnJ30pCi1pbiBub24tXFBPU0lYe30gbW9kZSwgYW5kIFxjb2Rle05vbmV9IGluIFxQT1NJWHt9IG1vZGUpLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bc2hsZXhde3B1c2hfdG9rZW59e3N0cn0KLVB1c2ggdGhlIGFyZ3VtZW50IG9udG8gdGhlIHRva2VuIHN0YWNrLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bc2hsZXhde3JlYWRfdG9rZW59e30KLVJlYWQgYSByYXcgdG9rZW4uICBJZ25vcmUgdGhlIHB1c2hiYWNrIHN0YWNrLCBhbmQgZG8gbm90IGludGVycHJldCBzb3VyY2UKLXJlcXVlc3RzLiAgKFRoaXMgaXMgbm90IG9yZGluYXJpbHkgYSB1c2VmdWwgZW50cnkgcG9pbnQsIGFuZCBpcwotZG9jdW1lbnRlZCBoZXJlIG9ubHkgZm9yIHRoZSBzYWtlIG9mIGNvbXBsZXRlbmVzcy4pCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtzaGxleF17c291cmNlaG9va317ZmlsZW5hbWV9Ci1XaGVuIFxjbGFzc3tzaGxleH0gZGV0ZWN0cyBhIHNvdXJjZSByZXF1ZXN0IChzZWUKLVxtZW1iZXJ7c291cmNlfSBiZWxvdykgdGhpcyBtZXRob2QgaXMgZ2l2ZW4gdGhlIGZvbGxvd2luZyB0b2tlbiBhcwotYXJndW1lbnQsIGFuZCBleHBlY3RlZCB0byByZXR1cm4gYSB0dXBsZSBjb25zaXN0aW5nIG9mIGEgZmlsZW5hbWUgYW5kCi1hbiBvcGVuIGZpbGUtbGlrZSBvYmplY3QuCi0KLU5vcm1hbGx5LCB0aGlzIG1ldGhvZCBmaXJzdCBzdHJpcHMgYW55IHF1b3RlcyBvZmYgdGhlIGFyZ3VtZW50LiAgSWYKLXRoZSByZXN1bHQgaXMgYW4gYWJzb2x1dGUgcGF0aG5hbWUsIG9yIHRoZXJlIHdhcyBubyBwcmV2aW91cyBzb3VyY2UKLXJlcXVlc3QgaW4gZWZmZWN0LCBvciB0aGUgcHJldmlvdXMgc291cmNlIHdhcyBhIHN0cmVhbQotKHN1Y2ggYXMgXGNvZGV7c3lzLnN0ZGlufSksIHRoZSByZXN1bHQgaXMgbGVmdCBhbG9uZS4gIE90aGVyd2lzZSwgaWYgdGhlCi1yZXN1bHQgaXMgYSByZWxhdGl2ZSBwYXRobmFtZSwgdGhlIGRpcmVjdG9yeSBwYXJ0IG9mIHRoZSBuYW1lIG9mIHRoZQotZmlsZSBpbW1lZGlhdGVseSBiZWZvcmUgaXQgb24gdGhlIHNvdXJjZSBpbmNsdXNpb24gc3RhY2sgaXMgcHJlcGVuZGVkCi0odGhpcyBiZWhhdmlvciBpcyBsaWtlIHRoZSB3YXkgdGhlIEMgcHJlcHJvY2Vzc29yIGhhbmRsZXMKLVxjb2Rle1wjaW5jbHVkZSAiZmlsZS5oIn0pLgotCi1UaGUgcmVzdWx0IG9mIHRoZSBtYW5pcHVsYXRpb25zIGlzIHRyZWF0ZWQgYXMgYSBmaWxlbmFtZSwgYW5kIHJldHVybmVkCi1hcyB0aGUgZmlyc3QgY29tcG9uZW50IG9mIHRoZSB0dXBsZSwgd2l0aAotXGZ1bmN0aW9ue29wZW4oKX0gY2FsbGVkIG9uIGl0IHRvIHlpZWxkIHRoZSBzZWNvbmQgY29tcG9uZW50LiAoTm90ZToKLXRoaXMgaXMgdGhlIHJldmVyc2Ugb2YgdGhlIG9yZGVyIG9mIGFyZ3VtZW50cyBpbiBpbnN0YW5jZSBpbml0aWFsaXphdGlvbiEpCi0KLVRoaXMgaG9vayBpcyBleHBvc2VkIHNvIHRoYXQgeW91IGNhbiB1c2UgaXQgdG8gaW1wbGVtZW50IGRpcmVjdG9yeQotc2VhcmNoIHBhdGhzLCBhZGRpdGlvbiBvZiBmaWxlIGV4dGVuc2lvbnMsIGFuZCBvdGhlciBuYW1lc3BhY2UgaGFja3MuCi1UaGVyZSBpcyBubyBjb3JyZXNwb25kaW5nIGBjbG9zZScgaG9vaywgYnV0IGEgc2hsZXggaW5zdGFuY2Ugd2lsbCBjYWxsCi10aGUgXG1ldGhvZHtjbG9zZSgpfSBtZXRob2Qgb2YgdGhlIHNvdXJjZWQgaW5wdXQgc3RyZWFtIHdoZW4gaXQKLXJldHVybnMgXEVPRi4KLQotRm9yIG1vcmUgZXhwbGljaXQgY29udHJvbCBvZiBzb3VyY2Ugc3RhY2tpbmcsIHVzZSB0aGUKLVxtZXRob2R7cHVzaF9zb3VyY2UoKX0gYW5kIFxtZXRob2R7cG9wX3NvdXJjZSgpfSBtZXRob2RzLiAKLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3NobGV4XXtwdXNoX3NvdXJjZX17c3RyZWFtXG9wdGlvbmFseywgZmlsZW5hbWV9fQotUHVzaCBhbiBpbnB1dCBzb3VyY2Ugc3RyZWFtIG9udG8gdGhlIGlucHV0IHN0YWNrLiAgSWYgdGhlIGZpbGVuYW1lCi1hcmd1bWVudCBpcyBzcGVjaWZpZWQgaXQgd2lsbCBsYXRlciBiZSBhdmFpbGFibGUgZm9yIHVzZSBpbiBlcnJvcgotbWVzc2FnZXMuICBUaGlzIGlzIHRoZSBzYW1lIG1ldGhvZCB1c2VkIGludGVybmFsbHkgYnkgdGhlCi1cbWV0aG9ke3NvdXJjZWhvb2t9IG1ldGhvZC4KLVx2ZXJzaW9uYWRkZWR7Mi4xfQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bc2hsZXhde3BvcF9zb3VyY2V9e30KLVBvcCB0aGUgbGFzdC1wdXNoZWQgaW5wdXQgc291cmNlIGZyb20gdGhlIGlucHV0IHN0YWNrLgotVGhpcyBpcyB0aGUgc2FtZSBtZXRob2QgdXNlZCBpbnRlcm5hbGx5IHdoZW4gdGhlIGxleGVyIHJlYWNoZXMKLVxFT0Z7fSBvbiBhIHN0YWNrZWQgaW5wdXQgc3RyZWFtLgotXHZlcnNpb25hZGRlZHsyLjF9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtzaGxleF17ZXJyb3JfbGVhZGVyfXtcb3B0aW9uYWx7ZmlsZVxvcHRpb25hbHssIGxpbmV9fX0KLVRoaXMgbWV0aG9kIGdlbmVyYXRlcyBhbiBlcnJvciBtZXNzYWdlIGxlYWRlciBpbiB0aGUgZm9ybWF0IG9mIGEKLVxVTklYe30gQyBjb21waWxlciBlcnJvciBsYWJlbDsgdGhlIGZvcm1hdCBpcyBcY29kZXsnIlwlcyIsIGxpbmUgXCVkOiAnfSwKLXdoZXJlIHRoZSBcc2FtcHtcJXN9IGlzIHJlcGxhY2VkIHdpdGggdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgc291cmNlCi1maWxlIGFuZCB0aGUgXHNhbXB7XCVkfSB3aXRoIHRoZSBjdXJyZW50IGlucHV0IGxpbmUgbnVtYmVyICh0aGUKLW9wdGlvbmFsIGFyZ3VtZW50cyBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGVzZSkuCi0KLVRoaXMgY29udmVuaWVuY2UgaXMgcHJvdmlkZWQgdG8gZW5jb3VyYWdlIFxtb2R1bGV7c2hsZXh9IHVzZXJzIHRvCi1nZW5lcmF0ZSBlcnJvciBtZXNzYWdlcyBpbiB0aGUgc3RhbmRhcmQsIHBhcnNlYWJsZSBmb3JtYXQgdW5kZXJzdG9vZAotYnkgRW1hY3MgYW5kIG90aGVyIFxVTklYe30gdG9vbHMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLUluc3RhbmNlcyBvZiBcY2xhc3N7c2hsZXh9IHN1YmNsYXNzZXMgaGF2ZSBzb21lIHB1YmxpYyBpbnN0YW5jZQotdmFyaWFibGVzIHdoaWNoIGVpdGhlciBjb250cm9sIGxleGljYWwgYW5hbHlzaXMgb3IgY2FuIGJlIHVzZWQgZm9yCi1kZWJ1Z2dpbmc6Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtzaGxleF17Y29tbWVudGVyc30KLVRoZSBzdHJpbmcgb2YgY2hhcmFjdGVycyB0aGF0IGFyZSByZWNvZ25pemVkIGFzIGNvbW1lbnQgYmVnaW5uZXJzLgotQWxsIGNoYXJhY3RlcnMgZnJvbSB0aGUgY29tbWVudCBiZWdpbm5lciB0byBlbmQgb2YgbGluZSBhcmUgaWdub3JlZC4KLUluY2x1ZGVzIGp1c3QgXGNoYXJhY3RlcntcI30gYnkgZGVmYXVsdC4gICAKLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W3NobGV4XXt3b3JkY2hhcnN9Ci1UaGUgc3RyaW5nIG9mIGNoYXJhY3RlcnMgdGhhdCB3aWxsIGFjY3VtdWxhdGUgaW50byBtdWx0aS1jaGFyYWN0ZXIKLXRva2Vucy4gIEJ5IGRlZmF1bHQsIGluY2x1ZGVzIGFsbCBcQVNDSUl7fSBhbHBoYW51bWVyaWNzIGFuZAotdW5kZXJzY29yZS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W3NobGV4XXt3aGl0ZXNwYWNlfQotQ2hhcmFjdGVycyB0aGF0IHdpbGwgYmUgY29uc2lkZXJlZCB3aGl0ZXNwYWNlIGFuZCBza2lwcGVkLiAgV2hpdGVzcGFjZQotYm91bmRzIHRva2Vucy4gIEJ5IGRlZmF1bHQsIGluY2x1ZGVzIHNwYWNlLCB0YWIsIGxpbmVmZWVkIGFuZAotY2FycmlhZ2UtcmV0dXJuLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bc2hsZXhde2VzY2FwZX0KLUNoYXJhY3RlcnMgdGhhdCB3aWxsIGJlIGNvbnNpZGVyZWQgYXMgZXNjYXBlLiBUaGlzIHdpbGwgYmUgb25seSB1c2VkCi1pbiBcUE9TSVh7fSBtb2RlLCBhbmQgaW5jbHVkZXMganVzdCBcY2hhcmFjdGVye1x0ZXh0YmFja3NsYXNofSBieSBkZWZhdWx0LgotXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtzaGxleF17cXVvdGVzfQotQ2hhcmFjdGVycyB0aGF0IHdpbGwgYmUgY29uc2lkZXJlZCBzdHJpbmcgcXVvdGVzLiAgVGhlIHRva2VuCi1hY2N1bXVsYXRlcyB1bnRpbCB0aGUgc2FtZSBxdW90ZSBpcyBlbmNvdW50ZXJlZCBhZ2FpbiAodGh1cywgZGlmZmVyZW50Ci1xdW90ZSB0eXBlcyBwcm90ZWN0IGVhY2ggb3RoZXIgYXMgaW4gdGhlIHNoZWxsLikgIEJ5IGRlZmF1bHQsIGluY2x1ZGVzCi1cQVNDSUl7fSBzaW5nbGUgYW5kIGRvdWJsZSBxdW90ZXMuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtzaGxleF17ZXNjYXBlZHF1b3Rlc30KLUNoYXJhY3RlcnMgaW4gXG1lbWJlcntxdW90ZXN9IHRoYXQgd2lsbCBpbnRlcnByZXQgZXNjYXBlIGNoYXJhY3RlcnMKLWRlZmluZWQgaW4gXG1lbWJlcntlc2NhcGV9LiAgVGhpcyBpcyBvbmx5IHVzZWQgaW4gXFBPU0lYe30gbW9kZSwgYW5kCi1pbmNsdWRlcyBqdXN0IFxjaGFyYWN0ZXJ7In0gYnkgZGVmYXVsdC4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bc2hsZXhde3doaXRlc3BhY2Vfc3BsaXR9Ci1JZiBcY29kZXtUcnVlfSwgdG9rZW5zIHdpbGwgb25seSBiZSBzcGxpdCBpbiB3aGl0ZXNwYWNlcy4gVGhpcyBpcyB1c2VmdWwsIGZvcgotZXhhbXBsZSwgZm9yIHBhcnNpbmcgY29tbWFuZCBsaW5lcyB3aXRoIFxjbGFzc3tzaGxleH0sIGdldHRpbmcgdG9rZW5zCi1pbiBhIHNpbWlsYXIgd2F5IHRvIHNoZWxsIGFyZ3VtZW50cy4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bc2hsZXhde2luZmlsZX0KLVRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGlucHV0IGZpbGUsIGFzIGluaXRpYWxseSBzZXQgYXQgY2xhc3MKLWluc3RhbnRpYXRpb24gdGltZSBvciBzdGFja2VkIGJ5IGxhdGVyIHNvdXJjZSByZXF1ZXN0cy4gIEl0IG1heQotYmUgdXNlZnVsIHRvIGV4YW1pbmUgdGhpcyB3aGVuIGNvbnN0cnVjdGluZyBlcnJvciBtZXNzYWdlcy4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W3NobGV4XXtpbnN0cmVhbX0KLVRoZSBpbnB1dCBzdHJlYW0gZnJvbSB3aGljaCB0aGlzIFxjbGFzc3tzaGxleH0gaW5zdGFuY2UgaXMgcmVhZGluZwotY2hhcmFjdGVycy4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W3NobGV4XXtzb3VyY2V9Ci1UaGlzIG1lbWJlciBpcyBcY29kZXtOb25lfSBieSBkZWZhdWx0LiAgSWYgeW91IGFzc2lnbiBhIHN0cmluZyB0byBpdCwKLXRoYXQgc3RyaW5nIHdpbGwgYmUgcmVjb2duaXplZCBhcyBhIGxleGljYWwtbGV2ZWwgaW5jbHVzaW9uIHJlcXVlc3QKLXNpbWlsYXIgdG8gdGhlIFxzYW1we3NvdXJjZX0ga2V5d29yZCBpbiB2YXJpb3VzIHNoZWxscy4gIFRoYXQgaXMsIHRoZQotaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRva2VuIHdpbGwgb3BlbmVkIGFzIGEgZmlsZW5hbWUgYW5kIGlucHV0IHRha2VuCi1mcm9tIHRoYXQgc3RyZWFtIHVudGlsIFxFT0YsIGF0IHdoaWNoIHBvaW50IHRoZSBcbWV0aG9ke2Nsb3NlKCl9Ci1tZXRob2Qgb2YgdGhhdCBzdHJlYW0gd2lsbCBiZSBjYWxsZWQgYW5kIHRoZSBpbnB1dCBzb3VyY2Ugd2lsbCBhZ2FpbgotYmVjb21lIHRoZSBvcmlnaW5hbCBpbnB1dCBzdHJlYW0uIFNvdXJjZSByZXF1ZXN0cyBtYXkgYmUgc3RhY2tlZCBhbnkKLW51bWJlciBvZiBsZXZlbHMgZGVlcC4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W3NobGV4XXtkZWJ1Z30KLUlmIHRoaXMgbWVtYmVyIGlzIG51bWVyaWMgYW5kIFxjb2RlezF9IG9yIG1vcmUsIGEgXGNsYXNze3NobGV4fQotaW5zdGFuY2Ugd2lsbCBwcmludCB2ZXJib3NlIHByb2dyZXNzIG91dHB1dCBvbiBpdHMgYmVoYXZpb3IuICBJZiB5b3UKLW5lZWQgdG8gdXNlIHRoaXMsIHlvdSBjYW4gcmVhZCB0aGUgbW9kdWxlIHNvdXJjZSBjb2RlIHRvIGxlYXJuIHRoZQotZGV0YWlscy4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W3NobGV4XXtsaW5lbm99Ci1Tb3VyY2UgbGluZSBudW1iZXIgKGNvdW50IG9mIG5ld2xpbmVzIHNlZW4gc28gZmFyIHBsdXMgb25lKS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W3NobGV4XXt0b2tlbn0KLVRoZSB0b2tlbiBidWZmZXIuICBJdCBtYXkgYmUgdXNlZnVsIHRvIGV4YW1pbmUgdGhpcyB3aGVuIGNhdGNoaW5nCi1leGNlcHRpb25zLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bc2hsZXhde2VvZn0KLVRva2VuIHVzZWQgdG8gZGV0ZXJtaW5lIGVuZCBvZiBmaWxlLiBUaGlzIHdpbGwgYmUgc2V0IHRvIHRoZSBlbXB0eQotc3RyaW5nIChcY29kZXsnJ30pLCBpbiBub24tXFBPU0lYe30gbW9kZSwgYW5kIHRvIFxjb2Rle05vbmV9IGluCi1cUE9TSVh7fSBtb2RlLgotXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke21lbWJlcmRlc2N9Ci0KLVxzdWJzZWN0aW9ue1BhcnNpbmcgUnVsZXNcbGFiZWx7c2hsZXgtcGFyc2luZy1ydWxlc319Ci0KLVdoZW4gb3BlcmF0aW5nIGluIG5vbi1cUE9TSVh7fSBtb2RlLCBcY2xhc3N7c2hsZXh9IHdpbGwgdHJ5IHRvIG9iZXkgdG8KLXRoZSBmb2xsb3dpbmcgcnVsZXMuCi0KLVxiZWdpbntpdGVtaXplfQotXGl0ZW0gUXVvdGUgY2hhcmFjdGVycyBhcmUgbm90IHJlY29nbml6ZWQgd2l0aGluIHdvcmRzCi0gICAgICAoXGNvZGV7RG8iTm90IlNlcGFyYXRlfSBpcyBwYXJzZWQgYXMgdGhlIHNpbmdsZSB3b3JkCi0gICAgICBcY29kZXtEbyJOb3QiU2VwYXJhdGV9KTsKLVxpdGVtIEVzY2FwZSBjaGFyYWN0ZXJzIGFyZSBub3QgcmVjb2duaXplZDsKLVxpdGVtIEVuY2xvc2luZyBjaGFyYWN0ZXJzIGluIHF1b3RlcyBwcmVzZXJ2ZSB0aGUgbGl0ZXJhbCB2YWx1ZSBvZgotICAgICAgYWxsIGNoYXJhY3RlcnMgd2l0aGluIHRoZSBxdW90ZXM7Ci1caXRlbSBDbG9zaW5nIHF1b3RlcyBzZXBhcmF0ZSB3b3JkcyAoXGNvZGV7IkRvIlNlcGFyYXRlfSBpcyBwYXJzZWQKLSAgICAgIGFzIFxjb2RleyJEbyJ9IGFuZCBcY29kZXtTZXBhcmF0ZX0pOwotXGl0ZW0gSWYgXG1lbWJlcnt3aGl0ZXNwYWNlX3NwbGl0fSBpcyBcY29kZXtGYWxzZX0sIGFueSBjaGFyYWN0ZXIgbm90Ci0gICAgICBkZWNsYXJlZCB0byBiZSBhIHdvcmQgY2hhcmFjdGVyLCB3aGl0ZXNwYWNlLCBvciBhIHF1b3RlIHdpbGwgYmUKLSAgICAgIHJldHVybmVkIGFzIGEgc2luZ2xlLWNoYXJhY3RlciB0b2tlbi4gSWYgaXQgaXMgXGNvZGV7VHJ1ZX0sCi0gICAgICBcY2xhc3N7c2hsZXh9IHdpbGwgb25seSBzcGxpdCB3b3JkcyBpbiB3aGl0ZXNwYWNlczsKLVxpdGVtIEVPRiBpcyBzaWduYWxlZCB3aXRoIGFuIGVtcHR5IHN0cmluZyAoXGNvZGV7Jyd9KTsKLVxpdGVtIEl0J3Mgbm90IHBvc3NpYmxlIHRvIHBhcnNlIGVtcHR5IHN0cmluZ3MsIGV2ZW4gaWYgcXVvdGVkLgotXGVuZHtpdGVtaXplfQotCi1XaGVuIG9wZXJhdGluZyBpbiBcUE9TSVh7fSBtb2RlLCBcY2xhc3N7c2hsZXh9IHdpbGwgdHJ5IHRvIG9iZXkgdG8gdGhlCi1mb2xsb3dpbmcgcGFyc2luZyBydWxlcy4KLQotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSBRdW90ZXMgYXJlIHN0cmlwcGVkIG91dCwgYW5kIGRvIG5vdCBzZXBhcmF0ZSB3b3JkcwotICAgICAgKFxjb2RleyJEbyJOb3QiU2VwYXJhdGUifSBpcyBwYXJzZWQgYXMgdGhlIHNpbmdsZSB3b3JkCi0gICAgICBcY29kZXtEb05vdFNlcGFyYXRlfSk7Ci1caXRlbSBOb24tcXVvdGVkIGVzY2FwZSBjaGFyYWN0ZXJzIChlLmcuIFxjaGFyYWN0ZXJ7XHRleHRiYWNrc2xhc2h9KQotICAgICAgcHJlc2VydmUgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIG5leHQgY2hhcmFjdGVyIHRoYXQgZm9sbG93czsKLVxpdGVtIEVuY2xvc2luZyBjaGFyYWN0ZXJzIGluIHF1b3RlcyB3aGljaCBhcmUgbm90IHBhcnQgb2YKLSAgICAgIFxtZW1iZXJ7ZXNjYXBlZHF1b3Rlc30gKGUuZy4gXGNoYXJhY3RlcnsnfSkgcHJlc2VydmUgdGhlIGxpdGVyYWwKLSAgICAgIHZhbHVlIG9mIGFsbCBjaGFyYWN0ZXJzIHdpdGhpbiB0aGUgcXVvdGVzOwotXGl0ZW0gRW5jbG9zaW5nIGNoYXJhY3RlcnMgaW4gcXVvdGVzIHdoaWNoIGFyZSBwYXJ0IG9mCi0gICAgICBcbWVtYmVye2VzY2FwZWRxdW90ZXN9IChlLmcuIFxjaGFyYWN0ZXJ7In0pIHByZXNlcnZlcyB0aGUgbGl0ZXJhbAotICAgICAgdmFsdWUgb2YgYWxsIGNoYXJhY3RlcnMgd2l0aGluIHRoZSBxdW90ZXMsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZgotICAgICAgdGhlIGNoYXJhY3RlcnMgbWVudGlvbmVkIGluIFxtZW1iZXJ7ZXNjYXBlfS4gVGhlIGVzY2FwZSBjaGFyYWN0ZXJzCi0gICAgICByZXRhaW4gaXRzIHNwZWNpYWwgbWVhbmluZyBvbmx5IHdoZW4gZm9sbG93ZWQgYnkgdGhlIHF1b3RlIGluIHVzZSwKLSAgICAgIG9yIHRoZSBlc2NhcGUgY2hhcmFjdGVyIGl0c2VsZi4gT3RoZXJ3aXNlIHRoZSBlc2NhcGUgY2hhcmFjdGVyCi0gICAgICB3aWxsIGJlIGNvbnNpZGVyZWQgYSBub3JtYWwgY2hhcmFjdGVyLgotXGl0ZW0gRU9GIGlzIHNpZ25hbGVkIHdpdGggYSBcY29uc3RhbnR7Tm9uZX0gdmFsdWU7Ci1caXRlbSBRdW90ZWQgZW1wdHkgc3RyaW5ncyAoXGNvZGV7Jyd9KSBhcmUgYWxsb3dlZDsKLVxlbmR7aXRlbWl6ZX0KLQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJzaHV0aWwudGV4IGIvRG9jL2xpYi9saWJzaHV0aWwudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWNiYTU0Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlic2h1dGlsLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3NodXRpbH0gLS0tCi0gICAgICAgICBIaWdoLWxldmVsIGZpbGUgb3BlcmF0aW9uc30KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e3NodXRpbH0KLVxtb2R1bGVzeW5vcHNpc3tIaWdoLWxldmVsIGZpbGUgb3BlcmF0aW9ucywgaW5jbHVkaW5nIGNvcHlpbmcufQotXHNlY3Rpb25hdXRob3J7RnJlZCBMLiBEcmFrZSwgSnIufXtmZHJha2VAYWNtLm9yZ30KLSUgcGFydGx5IGJhc2VkIG9uIHRoZSBkb2NzdHJpbmdzCi0KLQotVGhlIFxtb2R1bGV7c2h1dGlsfSBtb2R1bGUgb2ZmZXJzIGEgbnVtYmVyIG9mIGhpZ2gtbGV2ZWwgb3BlcmF0aW9ucyBvbgotZmlsZXMgYW5kIGNvbGxlY3Rpb25zIG9mIGZpbGVzLiAgSW4gcGFydGljdWxhciwgZnVuY3Rpb25zIGFyZSBwcm92aWRlZCAKLXdoaWNoIHN1cHBvcnQgZmlsZSBjb3B5aW5nIGFuZCByZW1vdmFsLgotXGluZGV4e2ZpbGUhY29weWluZ30KLVxpbmRleHtjb3B5aW5nIGZpbGVzfQotCi1cc3Ryb25ne0NhdmVhdDp9ICBPbiBNYWNPUywgdGhlIHJlc291cmNlIGZvcmsgYW5kIG90aGVyIG1ldGFkYXRhIGFyZQotbm90IHVzZWQuICBGb3IgZmlsZSBjb3BpZXMsIHRoaXMgbWVhbnMgdGhhdCByZXNvdXJjZXMgd2lsbCBiZSBsb3N0IGFuZCAKLWZpbGUgdHlwZSBhbmQgY3JlYXRvciBjb2RlcyB3aWxsIG5vdCBiZSBjb3JyZWN0LgotCi0KLVxiZWdpbntmdW5jZGVzY317Y29weWZpbGV9e3NyYywgZHN0fQotICBDb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBuYW1lZCBcdmFye3NyY30gdG8gYSBmaWxlIG5hbWVkCi0gIFx2YXJ7ZHN0fS4gIFRoZSBkZXN0aW5hdGlvbiBsb2NhdGlvbiBtdXN0IGJlIHdyaXRhYmxlOyBvdGhlcndpc2UsIAotICBhbiBcZXhjZXB0aW9ue0lPRXJyb3J9IGV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNlZC4KLSAgSWYgXHZhcntkc3R9IGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsIGJlIHJlcGxhY2VkLiAgCi0gIFNwZWNpYWwgZmlsZXMgc3VjaCBhcyBjaGFyYWN0ZXIgb3IgYmxvY2sgZGV2aWNlcwotICBhbmQgcGlwZXMgY2Fubm90IGJlIGNvcGllZCB3aXRoIHRoaXMgZnVuY3Rpb24uICBcdmFye3NyY30gYW5kCi0gIFx2YXJ7ZHN0fSBhcmUgcGF0aCBuYW1lcyBnaXZlbiBhcyBzdHJpbmdzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtjb3B5ZmlsZW9ian17ZnNyYywgZmRzdFxvcHRpb25hbHssIGxlbmd0aH19Ci0gIENvcHkgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlLWxpa2Ugb2JqZWN0IFx2YXJ7ZnNyY30gdG8gdGhlCi0gIGZpbGUtbGlrZSBvYmplY3QgXHZhcntmZHN0fS4gIFRoZSBpbnRlZ2VyIFx2YXJ7bGVuZ3RofSwgaWYgZ2l2ZW4sCi0gIGlzIHRoZSBidWZmZXIgc2l6ZS4gSW4gcGFydGljdWxhciwgYSBuZWdhdGl2ZSBcdmFye2xlbmd0aH0gdmFsdWUKLSAgbWVhbnMgdG8gY29weSB0aGUgZGF0YSB3aXRob3V0IGxvb3Bpbmcgb3ZlciB0aGUgc291cmNlIGRhdGEgaW4KLSAgY2h1bmtzOyBieSBkZWZhdWx0IHRoZSBkYXRhIGlzIHJlYWQgaW4gY2h1bmtzIHRvIGF2b2lkIHVuY29udHJvbGxlZAotICBtZW1vcnkgY29uc3VtcHRpb24uIE5vdGUgdGhhdCBpZiB0aGUgY3VycmVudCBmaWxlIHBvc2l0aW9uIG9mIHRoZQotICBcdmFye2ZzcmN9IG9iamVjdCBpcyBub3QgMCwgb25seSB0aGUgY29udGVudHMgZnJvbSB0aGUgY3VycmVudCBmaWxlCi0gIHBvc2l0aW9uIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgd2lsbCBiZSBjb3BpZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2NvcHltb2RlfXtzcmMsIGRzdH0KLSAgQ29weSB0aGUgcGVybWlzc2lvbiBiaXRzIGZyb20gXHZhcntzcmN9IHRvIFx2YXJ7ZHN0fS4gIFRoZSBmaWxlCi0gIGNvbnRlbnRzLCBvd25lciwgYW5kIGdyb3VwIGFyZSB1bmFmZmVjdGVkLiAgXHZhcntzcmN9IGFuZCBcdmFye2RzdH0KLSAgYXJlIHBhdGggbmFtZXMgZ2l2ZW4gYXMgc3RyaW5ncy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y29weXN0YXR9e3NyYywgZHN0fQotICBDb3B5IHRoZSBwZXJtaXNzaW9uIGJpdHMsIGxhc3QgYWNjZXNzIHRpbWUsIGxhc3QgbW9kaWZpY2F0aW9uIHRpbWUsCi0gIGFuZCBmbGFncyBmcm9tIFx2YXJ7c3JjfSB0byBcdmFye2RzdH0uICBUaGUgZmlsZSBjb250ZW50cywgb3duZXIsIGFuZAotICBncm91cCBhcmUgdW5hZmZlY3RlZC4gIFx2YXJ7c3JjfSBhbmQgXHZhcntkc3R9IGFyZSBwYXRoIG5hbWVzIGdpdmVuCi0gIGFzIHN0cmluZ3MuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2NvcHl9e3NyYywgZHN0fQotICBDb3B5IHRoZSBmaWxlIFx2YXJ7c3JjfSB0byB0aGUgZmlsZSBvciBkaXJlY3RvcnkgXHZhcntkc3R9LiAgSWYKLSAgXHZhcntkc3R9IGlzIGEgZGlyZWN0b3J5LCBhIGZpbGUgd2l0aCB0aGUgc2FtZSBiYXNlbmFtZSBhcyBcdmFye3NyY30gCi0gIGlzIGNyZWF0ZWQgKG9yIG92ZXJ3cml0dGVuKSBpbiB0aGUgZGlyZWN0b3J5IHNwZWNpZmllZC4gIFBlcm1pc3Npb24KLSAgYml0cyBhcmUgY29waWVkLiAgXHZhcntzcmN9IGFuZCBcdmFye2RzdH0gYXJlIHBhdGggbmFtZXMgZ2l2ZW4gYXMKLSAgc3RyaW5ncy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y29weTJ9e3NyYywgZHN0fQotICBTaW1pbGFyIHRvIFxmdW5jdGlvbntjb3B5KCl9LCBidXQgbGFzdCBhY2Nlc3MgdGltZSBhbmQgbGFzdAotICBtb2RpZmljYXRpb24gdGltZSBhcmUgY29waWVkIGFzIHdlbGwuICBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlCi0gIFxVTklYe30gY29tbWFuZCBccHJvZ3JhbXtjcH0gXHByb2dyYW1vcHR7LXB9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtjb3B5dHJlZX17c3JjLCBkc3Rcb3B0aW9uYWx7LCBzeW1saW5rc319Ci0gIFJlY3Vyc2l2ZWx5IGNvcHkgYW4gZW50aXJlIGRpcmVjdG9yeSB0cmVlIHJvb3RlZCBhdCBcdmFye3NyY30uICBUaGUKLSAgZGVzdGluYXRpb24gZGlyZWN0b3J5LCBuYW1lZCBieSBcdmFye2RzdH0sIG11c3Qgbm90IGFscmVhZHkgZXhpc3Q7Ci0gIGl0IHdpbGwgYmUgY3JlYXRlZCBhcyB3ZWxsIGFzIG1pc3NpbmcgcGFyZW50IGRpcmVjdG9yaWVzLgotICBQZXJtaXNzaW9ucyBhbmQgdGltZXMgb2YgZGlyZWN0b3JpZXMgYXJlIGNvcGllZCB3aXRoIFxmdW5jdGlvbntjb3B5c3RhdCgpfSwKLSAgaW5kaXZpZHVhbCBmaWxlcyBhcmUgY29waWVkIHVzaW5nIFxmdW5jdGlvbntjb3B5MigpfS4gIAotICBJZiBcdmFye3N5bWxpbmtzfSBpcyB0cnVlLCBzeW1ib2xpYyBsaW5rcyBpbgotICB0aGUgc291cmNlIHRyZWUgYXJlIHJlcHJlc2VudGVkIGFzIHN5bWJvbGljIGxpbmtzIGluIHRoZSBuZXcgdHJlZTsKLSAgaWYgZmFsc2Ugb3Igb21pdHRlZCwgdGhlIGNvbnRlbnRzIG9mIHRoZSBsaW5rZWQgZmlsZXMgYXJlIGNvcGllZCB0bwotICB0aGUgbmV3IHRyZWUuICBJZiBleGNlcHRpb24ocykgb2NjdXIsIGFuIFxleGNlcHRpb257RXJyb3J9IGlzIHJhaXNlZAotICB3aXRoIGEgbGlzdCBvZiByZWFzb25zLgotCi0gIFRoZSBzb3VyY2UgY29kZSBmb3IgdGhpcyBzaG91bGQgYmUgY29uc2lkZXJlZCBhbiBleGFtcGxlIHJhdGhlciB0aGFuIAotICBhIHRvb2wuCi0KLSAgXHZlcnNpb25jaGFuZ2VkW1xleGNlcHRpb257RXJyb3J9IGlzIHJhaXNlZCBpZiBhbnkgZXhjZXB0aW9ucyBvY2N1ciBkdXJpbmcKLSAgICAgICAgICAgICAgICAgIGNvcHlpbmcsIHJhdGhlciB0aGFuIHByaW50aW5nIGEgbWVzc2FnZV17Mi4zfQotCi0gIFx2ZXJzaW9uY2hhbmdlZFtDcmVhdGUgaW50ZXJtZWRpYXRlIGRpcmVjdG9yaWVzIG5lZWRlZCB0byBjcmVhdGUgXHZhcntkc3R9LAotICAgICAgICAgICAgICAgICAgcmF0aGVyIHRoYW4gcmFpc2luZyBhbiBlcnJvci4gQ29weSBwZXJtaXNzaW9ucyBhbmQgdGltZXMgb2YKLQkJICBkaXJlY3RvcmllcyB1c2luZyBcZnVuY3Rpb257Y29weXN0YXQoKX1dezIuNX0KLQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtybXRyZWV9e3BhdGhcb3B0aW9uYWx7LCBpZ25vcmVfZXJyb3JzXG9wdGlvbmFseywgb25lcnJvcn19fQotICBcaW5kZXh7ZGlyZWN0b3J5IWRlbGV0aW5nfQotICBEZWxldGUgYW4gZW50aXJlIGRpcmVjdG9yeSB0cmVlIChcdmFye3BhdGh9IG11c3QgcG9pbnQgdG8gYSBkaXJlY3RvcnkpLgotICBJZiBcdmFye2lnbm9yZV9lcnJvcnN9IGlzIHRydWUsIGVycm9ycyByZXN1bHRpbmcgZnJvbSBmYWlsZWQgcmVtb3ZhbHMKLSAgd2lsbCBiZSBpZ25vcmVkOyBpZiBmYWxzZSBvciBvbWl0dGVkLCBzdWNoIGVycm9ycyBhcmUgaGFuZGxlZCBieQotICBjYWxsaW5nIGEgaGFuZGxlciBzcGVjaWZpZWQgYnkgXHZhcntvbmVycm9yfSBvciwgaWYgdGhhdCBpcyBvbWl0dGVkLAotICB0aGV5IHJhaXNlIGFuIGV4Y2VwdGlvbi4KLQotICBJZiBcdmFye29uZXJyb3J9IGlzIHByb3ZpZGVkLCBpdCBtdXN0IGJlIGEgY2FsbGFibGUgdGhhdCBhY2NlcHRzCi0gIHRocmVlIHBhcmFtZXRlcnM6IFx2YXJ7ZnVuY3Rpb259LCBcdmFye3BhdGh9LCBhbmQgXHZhcntleGNpbmZvfS4KLSAgVGhlIGZpcnN0IHBhcmFtZXRlciwgXHZhcntmdW5jdGlvbn0sIGlzIHRoZSBmdW5jdGlvbiB3aGljaCByYWlzZWQKLSAgdGhlIGV4Y2VwdGlvbjsgaXQgd2lsbCBiZSBcZnVuY3Rpb257b3MubGlzdGRpcigpfSwgXGZ1bmN0aW9ue29zLnJlbW92ZSgpfSBvcgotICBcZnVuY3Rpb257b3Mucm1kaXIoKX0uICBUaGUgc2Vjb25kIHBhcmFtZXRlciwgXHZhcntwYXRofSwgd2lsbCBiZQotICB0aGUgcGF0aCBuYW1lIHBhc3NlZCB0byBcdmFye2Z1bmN0aW9ufS4gIFRoZSB0aGlyZCBwYXJhbWV0ZXIsCi0gIFx2YXJ7ZXhjaW5mb30sIHdpbGwgYmUgdGhlIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbiByZXR1cm4gYnkKLSAgXGZ1bmN0aW9ue3N5cy5leGNfaW5mbygpfS4gIEV4Y2VwdGlvbnMgcmFpc2VkIGJ5IFx2YXJ7b25lcnJvcn0gd2lsbAotICBub3QgYmUgY2F1Z2h0LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXttb3ZlfXtzcmMsIGRzdH0KLVJlY3Vyc2l2ZWx5IG1vdmUgYSBmaWxlIG9yIGRpcmVjdG9yeSB0byBhbm90aGVyIGxvY2F0aW9uLgotCi1JZiB0aGUgZGVzdGluYXRpb24gaXMgb24gb3VyIGN1cnJlbnQgZmlsZXN5c3RlbSwgdGhlbiBzaW1wbHkgdXNlCi1yZW5hbWUuICBPdGhlcndpc2UsIGNvcHkgc3JjIHRvIHRoZSBkc3QgYW5kIHRoZW4gcmVtb3ZlIHNyYy4KLQotXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317RXJyb3J9Ci1UaGlzIGV4Y2VwdGlvbiBjb2xsZWN0cyBleGNlcHRpb25zIHRoYXQgcmFpc2VkIGR1cmluZyBhIG11bHQtZmlsZQotb3BlcmF0aW9uLiBGb3IgXGZ1bmN0aW9ue2NvcHl0cmVlfSwgdGhlIGV4Y2VwdGlvbiBhcmd1bWVudCBpcyBhCi1saXN0IG9mIDMtdHVwbGVzIChcdmFye3NyY25hbWV9LCBcdmFye2RzdG5hbWV9LCBcdmFye2V4Y2VwdGlvbn0pLgotCi1cdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7ZXhjZGVzY30KLQotXHN1YnNlY3Rpb257RXhhbXBsZSBcbGFiZWx7c2h1dGlsLWV4YW1wbGV9fQotCi1UaGlzIGV4YW1wbGUgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBcZnVuY3Rpb257Y29weXRyZWUoKX0KLWZ1bmN0aW9uLCBkZXNjcmliZWQgYWJvdmUsIHdpdGggdGhlIGRvY3N0cmluZyBvbWl0dGVkLiAgSXQKLWRlbW9uc3RyYXRlcyBtYW55IG9mIHRoZSBvdGhlciBmdW5jdGlvbnMgcHJvdmlkZWQgYnkgdGhpcyBtb2R1bGUuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLWRlZiBjb3B5dHJlZShzcmMsIGRzdCwgc3ltbGlua3M9MCk6Ci0gICAgbmFtZXMgPSBvcy5saXN0ZGlyKHNyYykKLSAgICBvcy5ta2Rpcihkc3QpCi0gICAgZm9yIG5hbWUgaW4gbmFtZXM6Ci0gICAgICAgIHNyY25hbWUgPSBvcy5wYXRoLmpvaW4oc3JjLCBuYW1lKQotICAgICAgICBkc3RuYW1lID0gb3MucGF0aC5qb2luKGRzdCwgbmFtZSkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgaWYgc3ltbGlua3MgYW5kIG9zLnBhdGguaXNsaW5rKHNyY25hbWUpOgotICAgICAgICAgICAgICAgIGxpbmt0byA9IG9zLnJlYWRsaW5rKHNyY25hbWUpCi0gICAgICAgICAgICAgICAgb3Muc3ltbGluayhsaW5rdG8sIGRzdG5hbWUpCi0gICAgICAgICAgICBlbGlmIG9zLnBhdGguaXNkaXIoc3JjbmFtZSk6Ci0gICAgICAgICAgICAgICAgY29weXRyZWUoc3JjbmFtZSwgZHN0bmFtZSwgc3ltbGlua3MpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGNvcHkyKHNyY25hbWUsIGRzdG5hbWUpCi0gICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgb3MuZXJyb3IpIGFzIHdoeToKLSAgICAgICAgICAgIHByaW50ICJDYW4ndCBjb3B5ICVzIHRvICVzOiAlcyIgJSAoYHNyY25hbWVgLCBgZHN0bmFtZWAsIHN0cih3aHkpKQotXGVuZHt2ZXJiYXRpbX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic2lnbmFsLnRleCBiL0RvYy9saWIvbGlic2lnbmFsLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk4YWE5MC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnNpZ25hbC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtzaWduYWx9IC0tLQotICAgICAgICAgU2V0IGhhbmRsZXJzIGZvciBhc3luY2hyb25vdXMgZXZlbnRzfQotCi1cZGVjbGFyZW1vZHVsZXtidWlsdGlufXtzaWduYWx9Ci1cbW9kdWxlc3lub3BzaXN7U2V0IGhhbmRsZXJzIGZvciBhc3luY2hyb25vdXMgZXZlbnRzLn0KLQotCi1UaGlzIG1vZHVsZSBwcm92aWRlcyBtZWNoYW5pc21zIHRvIHVzZSBzaWduYWwgaGFuZGxlcnMgaW4gUHl0aG9uLgotU29tZSBnZW5lcmFsIHJ1bGVzIGZvciB3b3JraW5nIHdpdGggc2lnbmFscyBhbmQgdGhlaXIgaGFuZGxlcnM6Ci0KLVxiZWdpbntpdGVtaXplfQotCi1caXRlbQotQSBoYW5kbGVyIGZvciBhIHBhcnRpY3VsYXIgc2lnbmFsLCBvbmNlIHNldCwgcmVtYWlucyBpbnN0YWxsZWQgdW50aWwKLWl0IGlzIGV4cGxpY2l0bHkgcmVzZXQgKFB5dGhvbiBlbXVsYXRlcyB0aGUgQlNEIHN0eWxlIGludGVyZmFjZQotcmVnYXJkbGVzcyBvZiB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiksIHdpdGggdGhlIGV4Y2VwdGlvbiBvZgotdGhlIGhhbmRsZXIgZm9yIFxjb25zdGFudHtTSUdDSExEfSwgd2hpY2ggZm9sbG93cyB0aGUgdW5kZXJseWluZwotaW1wbGVtZW50YXRpb24uCi0KLVxpdGVtCi1UaGVyZSBpcyBubyB3YXkgdG8gYGBibG9jaycnIHNpZ25hbHMgdGVtcG9yYXJpbHkgZnJvbSBjcml0aWNhbAotc2VjdGlvbnMgKHNpbmNlIHRoaXMgaXMgbm90IHN1cHBvcnRlZCBieSBhbGwgXFVOSVh7fSBmbGF2b3JzKS4KLQotXGl0ZW0KLUFsdGhvdWdoIFB5dGhvbiBzaWduYWwgaGFuZGxlcnMgYXJlIGNhbGxlZCBhc3luY2hyb25vdXNseSBhcyBmYXIgYXMKLXRoZSBQeXRob24gdXNlciBpcyBjb25jZXJuZWQsIHRoZXkgY2FuIG9ubHkgb2NjdXIgYmV0d2VlbiB0aGUKLWBgYXRvbWljJycgaW5zdHJ1Y3Rpb25zIG9mIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIuICBUaGlzIG1lYW5zIHRoYXQKLXNpZ25hbHMgYXJyaXZpbmcgZHVyaW5nIGxvbmcgY2FsY3VsYXRpb25zIGltcGxlbWVudGVkIHB1cmVseSBpbiBDCi0oc3VjaCBhcyByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hlcyBvbiBsYXJnZSBib2RpZXMgb2YgdGV4dCkgbWF5IGJlCi1kZWxheWVkIGZvciBhbiBhcmJpdHJhcnkgYW1vdW50IG9mIHRpbWUuCi0KLVxpdGVtCi1XaGVuIGEgc2lnbmFsIGFycml2ZXMgZHVyaW5nIGFuIEkvTyBvcGVyYXRpb24sIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlCi1JL08gb3BlcmF0aW9uIHJhaXNlcyBhbiBleGNlcHRpb24gYWZ0ZXIgdGhlIHNpZ25hbCBoYW5kbGVyIHJldHVybnMuCi1UaGlzIGlzIGRlcGVuZGVudCBvbiB0aGUgdW5kZXJseWluZyBcVU5JWHt9IHN5c3RlbSdzIHNlbWFudGljcyByZWdhcmRpbmcKLWludGVycnVwdGVkIHN5c3RlbSBjYWxscy4KLQotXGl0ZW0KLUJlY2F1c2UgdGhlIFxDe30gc2lnbmFsIGhhbmRsZXIgYWx3YXlzIHJldHVybnMsIGl0IG1ha2VzIGxpdHRsZSBzZW5zZSB0bwotY2F0Y2ggc3luY2hyb25vdXMgZXJyb3JzIGxpa2UgXGNvbnN0YW50e1NJR0ZQRX0gb3IgXGNvbnN0YW50e1NJR1NFR1Z9LgotCi1caXRlbQotUHl0aG9uIGluc3RhbGxzIGEgc21hbGwgbnVtYmVyIG9mIHNpZ25hbCBoYW5kbGVycyBieSBkZWZhdWx0OgotXGNvbnN0YW50e1NJR1BJUEV9IGlzIGlnbm9yZWQgKHNvIHdyaXRlIGVycm9ycyBvbiBwaXBlcyBhbmQgc29ja2V0cyBjYW4gYmUKLXJlcG9ydGVkIGFzIG9yZGluYXJ5IFB5dGhvbiBleGNlcHRpb25zKSBhbmQgXGNvbnN0YW50e1NJR0lOVH0gaXMgdHJhbnNsYXRlZAotaW50byBhIFxleGNlcHRpb257S2V5Ym9hcmRJbnRlcnJ1cHR9IGV4Y2VwdGlvbi4gIEFsbCBvZiB0aGVzZSBjYW4gYmUKLW92ZXJyaWRkZW4uCi0KLVxpdGVtCi1Tb21lIGNhcmUgbXVzdCBiZSB0YWtlbiBpZiBib3RoIHNpZ25hbHMgYW5kIHRocmVhZHMgYXJlIHVzZWQgaW4gdGhlCi1zYW1lIHByb2dyYW0uICBUaGUgZnVuZGFtZW50YWwgdGhpbmcgdG8gcmVtZW1iZXIgaW4gdXNpbmcgc2lnbmFscyBhbmQKLXRocmVhZHMgc2ltdWx0YW5lb3VzbHkgaXM6XCBhbHdheXMgcGVyZm9ybSBcZnVuY3Rpb257c2lnbmFsKCl9IG9wZXJhdGlvbnMKLWluIHRoZSBtYWluIHRocmVhZCBvZiBleGVjdXRpb24uICBBbnkgdGhyZWFkIGNhbiBwZXJmb3JtIGFuCi1cZnVuY3Rpb257YWxhcm0oKX0sIFxmdW5jdGlvbntnZXRzaWduYWwoKX0sIG9yIFxmdW5jdGlvbntwYXVzZSgpfTsKLW9ubHkgdGhlIG1haW4gdGhyZWFkIGNhbiBzZXQgYSBuZXcgc2lnbmFsIGhhbmRsZXIsIGFuZCB0aGUgbWFpbiB0aHJlYWQKLXdpbGwgYmUgdGhlIG9ubHkgb25lIHRvIHJlY2VpdmUgc2lnbmFscyAodGhpcyBpcyBlbmZvcmNlZCBieSB0aGUKLVB5dGhvbiBcbW9kdWxle3NpZ25hbH0gbW9kdWxlLCBldmVuIGlmIHRoZSB1bmRlcmx5aW5nIHRocmVhZAotaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgc2VuZGluZyBzaWduYWxzIHRvIGluZGl2aWR1YWwgdGhyZWFkcykuICBUaGlzCi1tZWFucyB0aGF0IHNpZ25hbHMgY2FuJ3QgYmUgdXNlZCBhcyBhIG1lYW5zIG9mIGludGVyLXRocmVhZAotY29tbXVuaWNhdGlvbi4gIFVzZSBsb2NrcyBpbnN0ZWFkLgotCi1cZW5ke2l0ZW1pemV9Ci0KLVRoZSB2YXJpYWJsZXMgZGVmaW5lZCBpbiB0aGUgXG1vZHVsZXtzaWduYWx9IG1vZHVsZSBhcmU6Ci0KLVxiZWdpbntkYXRhZGVzY317U0lHX0RGTH0KLSAgVGhpcyBpcyBvbmUgb2YgdHdvIHN0YW5kYXJkIHNpZ25hbCBoYW5kbGluZyBvcHRpb25zOyBpdCB3aWxsIHNpbXBseQotICBwZXJmb3JtIHRoZSBkZWZhdWx0IGZ1bmN0aW9uIGZvciB0aGUgc2lnbmFsLiAgRm9yIGV4YW1wbGUsIG9uIG1vc3QKLSAgc3lzdGVtcyB0aGUgZGVmYXVsdCBhY3Rpb24gZm9yIFxjb25zdGFudHtTSUdRVUlUfSBpcyB0byBkdW1wIGNvcmUKLSAgYW5kIGV4aXQsIHdoaWxlIHRoZSBkZWZhdWx0IGFjdGlvbiBmb3IgXGNvbnN0YW50e1NJR0NMRH0gaXMgdG8KLSAgc2ltcGx5IGlnbm9yZSBpdC4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317U0lHX0lHTn0KLSAgVGhpcyBpcyBhbm90aGVyIHN0YW5kYXJkIHNpZ25hbCBoYW5kbGVyLCB3aGljaCB3aWxsIHNpbXBseSBpZ25vcmUKLSAgdGhlIGdpdmVuIHNpZ25hbC4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317U0lHKn0KLSAgQWxsIHRoZSBzaWduYWwgbnVtYmVycyBhcmUgZGVmaW5lZCBzeW1ib2xpY2FsbHkuICBGb3IgZXhhbXBsZSwgdGhlCi0gIGhhbmd1cCBzaWduYWwgaXMgZGVmaW5lZCBhcyBcY29uc3RhbnR7c2lnbmFsLlNJR0hVUH07IHRoZSB2YXJpYWJsZSBuYW1lcwotICBhcmUgaWRlbnRpY2FsIHRvIHRoZSBuYW1lcyB1c2VkIGluIEMgcHJvZ3JhbXMsIGFzIGZvdW5kIGluCi0gIFxjb2RlezxzaWduYWwuaD59LgotICBUaGUgXFVOSVh7fSBtYW4gcGFnZSBmb3IgYFxjZnVuY3Rpb257c2lnbmFsKCl9JyBsaXN0cyB0aGUgZXhpc3RpbmcKLSAgc2lnbmFscyAob24gc29tZSBzeXN0ZW1zIHRoaXMgaXMgXG1hbnBhZ2V7c2lnbmFsfXsyfSwgb24gb3RoZXJzIHRoZQotICBsaXN0IGlzIGluIFxtYW5wYWdle3NpZ25hbH17N30pLgotICBOb3RlIHRoYXQgbm90IGFsbCBzeXN0ZW1zIGRlZmluZSB0aGUgc2FtZSBzZXQgb2Ygc2lnbmFsIG5hbWVzOyBvbmx5Ci0gIHRob3NlIG5hbWVzIGRlZmluZWQgYnkgdGhlIHN5c3RlbSBhcmUgZGVmaW5lZCBieSB0aGlzIG1vZHVsZS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317TlNJR30KLSAgT25lIG1vcmUgdGhhbiB0aGUgbnVtYmVyIG9mIHRoZSBoaWdoZXN0IHNpZ25hbCBudW1iZXIuCi1cZW5ke2RhdGFkZXNjfQotCi1UaGUgXG1vZHVsZXtzaWduYWx9IG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgotCi1cYmVnaW57ZnVuY2Rlc2N9e2FsYXJtfXt0aW1lfQotICBJZiBcdmFye3RpbWV9IGlzIG5vbi16ZXJvLCB0aGlzIGZ1bmN0aW9uIHJlcXVlc3RzIHRoYXQgYQotICBcY29uc3RhbnR7U0lHQUxSTX0gc2lnbmFsIGJlIHNlbnQgdG8gdGhlIHByb2Nlc3MgaW4gXHZhcnt0aW1lfSBzZWNvbmRzLgotICBBbnkgcHJldmlvdXNseSBzY2hlZHVsZWQgYWxhcm0gaXMgY2FuY2VsZWQgKG9ubHkgb25lIGFsYXJtIGNhbgotICBiZSBzY2hlZHVsZWQgYXQgYW55IHRpbWUpLiAgVGhlIHJldHVybmVkIHZhbHVlIGlzIHRoZW4gdGhlIG51bWJlciBvZgotICBzZWNvbmRzIGJlZm9yZSBhbnkgcHJldmlvdXNseSBzZXQgYWxhcm0gd2FzIHRvIGhhdmUgYmVlbiBkZWxpdmVyZWQuCi0gIElmIFx2YXJ7dGltZX0gaXMgemVybywgbm8gYWxhcm0gaXMgc2NoZWR1bGVkLCBhbmQgYW55IHNjaGVkdWxlZAotICBhbGFybSBpcyBjYW5jZWxlZC4gIElmIHRoZSByZXR1cm4gdmFsdWUKLSAgaXMgemVybywgbm8gYWxhcm0gaXMgY3VycmVudGx5IHNjaGVkdWxlZC4gIChTZWUgdGhlIFxVTklYe30gbWFuIHBhZ2UKLSAgXG1hbnBhZ2V7YWxhcm19ezJ9LikKLSAgQXZhaWxhYmlsaXR5OiBcVU5JWC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0c2lnbmFsfXtzaWduYWxudW19Ci0gIFJldHVybiB0aGUgY3VycmVudCBzaWduYWwgaGFuZGxlciBmb3IgdGhlIHNpZ25hbCBcdmFye3NpZ25hbG51bX0uCi0gIFRoZSByZXR1cm5lZCB2YWx1ZSBtYXkgYmUgYSBjYWxsYWJsZSBQeXRob24gb2JqZWN0LCBvciBvbmUgb2YgdGhlCi0gIHNwZWNpYWwgdmFsdWVzIFxjb25zdGFudHtzaWduYWwuU0lHX0lHTn0sIFxjb25zdGFudHtzaWduYWwuU0lHX0RGTH0gb3IKLSAgXGNvbnN0YW50e05vbmV9LiAgSGVyZSwgXGNvbnN0YW50e3NpZ25hbC5TSUdfSUdOfSBtZWFucyB0aGF0IHRoZQotICBzaWduYWwgd2FzIHByZXZpb3VzbHkgaWdub3JlZCwgXGNvbnN0YW50e3NpZ25hbC5TSUdfREZMfSBtZWFucyB0aGF0IHRoZQotICBkZWZhdWx0IHdheSBvZiBoYW5kbGluZyB0aGUgc2lnbmFsIHdhcyBwcmV2aW91c2x5IGluIHVzZSwgYW5kCi0gIFxjb2Rle05vbmV9IG1lYW5zIHRoYXQgdGhlIHByZXZpb3VzIHNpZ25hbCBoYW5kbGVyIHdhcyBub3QgaW5zdGFsbGVkCi0gIGZyb20gUHl0aG9uLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtwYXVzZX17fQotICBDYXVzZSB0aGUgcHJvY2VzcyB0byBzbGVlcCB1bnRpbCBhIHNpZ25hbCBpcyByZWNlaXZlZDsgdGhlCi0gIGFwcHJvcHJpYXRlIGhhbmRsZXIgd2lsbCB0aGVuIGJlIGNhbGxlZC4gIFJldHVybnMgbm90aGluZy4gIE5vdCBvbgotICBXaW5kb3dzLiAoU2VlIHRoZSBcVU5JWHt9IG1hbiBwYWdlIFxtYW5wYWdle3NpZ25hbH17Mn0uKQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzaWduYWx9e3NpZ25hbG51bSwgaGFuZGxlcn0KLSAgU2V0IHRoZSBoYW5kbGVyIGZvciBzaWduYWwgXHZhcntzaWduYWxudW19IHRvIHRoZSBmdW5jdGlvbgotICBcdmFye2hhbmRsZXJ9LiAgXHZhcntoYW5kbGVyfSBjYW4gYmUgYSBjYWxsYWJsZSBQeXRob24gb2JqZWN0Ci0gIHRha2luZyB0d28gYXJndW1lbnRzIChzZWUgYmVsb3cpLCBvcgotICBvbmUgb2YgdGhlIHNwZWNpYWwgdmFsdWVzIFxjb25zdGFudHtzaWduYWwuU0lHX0lHTn0gb3IKLSAgXGNvbnN0YW50e3NpZ25hbC5TSUdfREZMfS4gIFRoZSBwcmV2aW91cyBzaWduYWwgaGFuZGxlciB3aWxsIGJlIHJldHVybmVkCi0gIChzZWUgdGhlIGRlc2NyaXB0aW9uIG9mIFxmdW5jdGlvbntnZXRzaWduYWwoKX0gYWJvdmUpLiAgKFNlZSB0aGUKLSAgXFVOSVh7fSBtYW4gcGFnZSBcbWFucGFnZXtzaWduYWx9ezJ9LikKLQotICBXaGVuIHRocmVhZHMgYXJlIGVuYWJsZWQsIHRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlCi0gIG1haW4gdGhyZWFkOyBhdHRlbXB0aW5nIHRvIGNhbGwgaXQgZnJvbSBvdGhlciB0aHJlYWRzIHdpbGwgY2F1c2UgYQotICBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IGV4Y2VwdGlvbiB0byBiZSByYWlzZWQuCi0KLSAgVGhlIFx2YXJ7aGFuZGxlcn0gaXMgY2FsbGVkIHdpdGggdHdvIGFyZ3VtZW50czogdGhlIHNpZ25hbCBudW1iZXIKLSAgYW5kIHRoZSBjdXJyZW50IHN0YWNrIGZyYW1lIChcY29kZXtOb25lfSBvciBhIGZyYW1lIG9iamVjdDsKLSAgZm9yIGEgZGVzY3JpcHRpb24gb2YgZnJhbWUgb2JqZWN0cywgc2VlIHRoZSByZWZlcmVuY2UgbWFudWFsIHNlY3Rpb24KLSAgb24gdGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5IG9yIHNlZSB0aGUgYXR0cmlidXRlIGRlc2NyaXB0aW9ucyBpbgotICB0aGUgXHJlZm1vZHVsZXtpbnNwZWN0fSBtb2R1bGUpLgotXGVuZHtmdW5jZGVzY30KLQotXHN1YnNlY3Rpb257RXhhbXBsZX0KLVxub2RlbmFtZXtTaWduYWwgRXhhbXBsZX0KLQotSGVyZSBpcyBhIG1pbmltYWwgZXhhbXBsZSBwcm9ncmFtLiBJdCB1c2VzIHRoZSBcZnVuY3Rpb257YWxhcm0oKX0KLWZ1bmN0aW9uIHRvIGxpbWl0IHRoZSB0aW1lIHNwZW50IHdhaXRpbmcgdG8gb3BlbiBhIGZpbGU7IHRoaXMgaXMKLXVzZWZ1bCBpZiB0aGUgZmlsZSBpcyBmb3IgYSBzZXJpYWwgZGV2aWNlIHRoYXQgbWF5IG5vdCBiZSB0dXJuZWQgb24sCi13aGljaCB3b3VsZCBub3JtYWxseSBjYXVzZSB0aGUgXGZ1bmN0aW9ue29zLm9wZW4oKX0gdG8gaGFuZwotaW5kZWZpbml0ZWx5LiAgVGhlIHNvbHV0aW9uIGlzIHRvIHNldCBhIDUtc2Vjb25kIGFsYXJtIGJlZm9yZSBvcGVuaW5nCi10aGUgZmlsZTsgaWYgdGhlIG9wZXJhdGlvbiB0YWtlcyB0b28gbG9uZywgdGhlIGFsYXJtIHNpZ25hbCB3aWxsIGJlCi1zZW50LCBhbmQgdGhlIGhhbmRsZXIgcmFpc2VzIGFuIGV4Y2VwdGlvbi4KLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IHNpZ25hbCwgb3MKLQotZGVmIGhhbmRsZXIoc2lnbnVtLCBmcmFtZSk6Ci0gICAgcHJpbnQgJ1NpZ25hbCBoYW5kbGVyIGNhbGxlZCB3aXRoIHNpZ25hbCcsIHNpZ251bQotICAgIHJhaXNlIElPRXJyb3IsICJDb3VsZG4ndCBvcGVuIGRldmljZSEiCi0KLSMgU2V0IHRoZSBzaWduYWwgaGFuZGxlciBhbmQgYSA1LXNlY29uZCBhbGFybQotc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHQUxSTSwgaGFuZGxlcikKLXNpZ25hbC5hbGFybSg1KQotCi0jIFRoaXMgb3BlbigpIG1heSBoYW5nIGluZGVmaW5pdGVseQotZmQgPSBvcy5vcGVuKCcvZGV2L3R0eVMwJywgb3MuT19SRFdSKSAgCi0KLXNpZ25hbC5hbGFybSgwKSAgICAgICAgICAjIERpc2FibGUgdGhlIGFsYXJtCi1cZW5ke3ZlcmJhdGltfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJzaW1wbGVodHRwLnRleCBiL0RvYy9saWIvbGlic2ltcGxlaHR0cC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYjQwZWMuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJzaW1wbGVodHRwLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7U2ltcGxlSFRUUFNlcnZlcn0gLS0tCi0gICAgICAgICBTaW1wbGUgSFRUUCByZXF1ZXN0IGhhbmRsZXJ9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtTaW1wbGVIVFRQU2VydmVyfQotXHNlY3Rpb25hdXRob3J7TW9zaGUgWmFka2F9e21vc2hlekB6YWRrYS5zaXRlLmNvLmlsfQotXG1vZHVsZXN5bm9wc2lze1RoaXMgbW9kdWxlIHByb3ZpZGVzIGEgYmFzaWMgcmVxdWVzdCBoYW5kbGVyIGZvciBIVFRQCi0gICAgICAgICAgICAgICAgc2VydmVycy59Ci0KLQotVGhlIFxtb2R1bGV7U2ltcGxlSFRUUFNlcnZlcn0gbW9kdWxlIGRlZmluZXMgYSByZXF1ZXN0LWhhbmRsZXIgY2xhc3MsCi1pbnRlcmZhY2UtY29tcGF0aWJsZSB3aXRoIFxjbGFzc3tCYXNlSFRUUFNlcnZlci5CYXNlSFRUUFJlcXVlc3RIYW5kbGVyfSwKLXRoYXQgc2VydmVzIGZpbGVzIG9ubHkgZnJvbSBhIGJhc2UgZGlyZWN0b3J5LgotCi1UaGUgXG1vZHVsZXtTaW1wbGVIVFRQU2VydmVyfSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGNsYXNzOgotCi1cYmVnaW57Y2xhc3NkZXNjfXtTaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXJ9e3JlcXVlc3QsIGNsaWVudF9hZGRyZXNzLCBzZXJ2ZXJ9Ci1UaGlzIGNsYXNzIGlzIHVzZWQgdG8gc2VydmUgZmlsZXMgZnJvbSB0aGUgY3VycmVudCBkaXJlY3RvcnkgYW5kIGJlbG93LAotZGlyZWN0bHkgbWFwcGluZyB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZSB0byBIVFRQIHJlcXVlc3RzLgotCi1BIGxvdCBvZiB0aGUgd29yaywgc3VjaCBhcyBwYXJzaW5nIHRoZSByZXF1ZXN0LCBpcyBkb25lIGJ5IHRoZSBiYXNlCi1jbGFzcyBcY2xhc3N7QmFzZUhUVFBTZXJ2ZXIuQmFzZUhUVFBSZXF1ZXN0SGFuZGxlcn0uICBUaGlzIGNsYXNzCi1pbXBsZW1lbnRzIHRoZSBcZnVuY3Rpb257ZG9fR0VUKCl9IGFuZCBcZnVuY3Rpb257ZG9fSEVBRCgpfSBmdW5jdGlvbnMuCi1cZW5ke2NsYXNzZGVzY30KLQotVGhlIFxjbGFzc3tTaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXJ9IGRlZmluZXMgdGhlIGZvbGxvd2luZyBtZW1iZXIKLXZhcmlhYmxlczoKLQotXGJlZ2lue21lbWJlcmRlc2N9e3NlcnZlcl92ZXJzaW9ufQotVGhpcyB3aWxsIGJlIFxjb2RleyJTaW1wbGVIVFRQLyIgKyBfX3ZlcnNpb25fX30sIHdoZXJlIFxjb2Rle19fdmVyc2lvbl9ffQotaXMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY317ZXh0ZW5zaW9uc19tYXB9Ci1BIGRpY3Rpb25hcnkgbWFwcGluZyBzdWZmaXhlcyBpbnRvIE1JTUUgdHlwZXMuIFRoZSBkZWZhdWx0IGlzIHNpZ25pZmllZAotYnkgYW4gZW1wdHkgc3RyaW5nLCBhbmQgaXMgY29uc2lkZXJlZCB0byBiZSBcY29kZXthcHBsaWNhdGlvbi9vY3RldC1zdHJlYW19LgotVGhlIG1hcHBpbmcgaXMgdXNlZCBjYXNlLWluc2Vuc2l0aXZlbHksIGFuZCBzbyBzaG91bGQgY29udGFpbiBvbmx5Ci1sb3dlci1jYXNlZCBrZXlzLgotXGVuZHttZW1iZXJkZXNjfQotCi1UaGUgXGNsYXNze1NpbXBsZUhUVFBSZXF1ZXN0SGFuZGxlcn0gZGVmaW5lcyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtkb19IRUFEfXt9Ci1UaGlzIG1ldGhvZCBzZXJ2ZXMgdGhlIFxjb2RleydIRUFEJ30gcmVxdWVzdCB0eXBlOiBpdCBzZW5kcyB0aGUKLWhlYWRlcnMgaXQgd291bGQgc2VuZCBmb3IgdGhlIGVxdWl2YWxlbnQgXGNvZGV7R0VUfSByZXF1ZXN0LiBTZWUgdGhlCi1cbWV0aG9ke2RvX0dFVCgpfSBtZXRob2QgZm9yIGEgbW9yZSBjb21wbGV0ZSBleHBsYW5hdGlvbiBvZiB0aGUgcG9zc2libGUKLWhlYWRlcnMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtkb19HRVR9e30KLVRoZSByZXF1ZXN0IGlzIG1hcHBlZCB0byBhIGxvY2FsIGZpbGUgYnkgaW50ZXJwcmV0aW5nIHRoZSByZXF1ZXN0IGFzCi1hIHBhdGggcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCi0KLUlmIHRoZSByZXF1ZXN0IHdhcyBtYXBwZWQgdG8gYSBkaXJlY3RvcnksIHRoZSBkaXJlY3RvcnkgaXMgY2hlY2tlZCBmb3IKLWEgZmlsZSBuYW1lZCBcY29kZXtpbmRleC5odG1sfSBvciBcY29kZXtpbmRleC5odG19IChpbiB0aGF0IG9yZGVyKS4KLUlmIGZvdW5kLCB0aGUgZmlsZSdzIGNvbnRlbnRzIGFyZSByZXR1cm5lZDsgb3RoZXJ3aXNlIGEgZGlyZWN0b3J5Ci1saXN0aW5nIGlzIGdlbmVyYXRlZCBieSBjYWxsaW5nIHRoZSBcbWV0aG9ke2xpc3RfZGlyZWN0b3J5KCl9IG1ldGhvZC4KLVRoaXMgbWV0aG9kIHVzZXMgXGZ1bmN0aW9ue29zLmxpc3RkaXIoKX0gdG8gc2NhbiB0aGUgZGlyZWN0b3J5LCBhbmQKLXJldHVybnMgYSBcY29kZXs0MDR9IGVycm9yIHJlc3BvbnNlIGlmIHRoZSBcZnVuY3Rpb257bGlzdGRpcigpfSBmYWlscy4KLQotSWYgdGhlIHJlcXVlc3Qgd2FzIG1hcHBlZCB0byBhIGZpbGUsIGl0IGlzIG9wZW5lZCBhbmQgdGhlIGNvbnRlbnRzIGFyZQotcmV0dXJuZWQuICBBbnkgXGV4Y2VwdGlvbntJT0Vycm9yfSBleGNlcHRpb24gaW4gb3BlbmluZyB0aGUgcmVxdWVzdGVkCi1maWxlIGlzIG1hcHBlZCB0byBhIFxjb2RlezQwNH0sIFxjb2RleydGaWxlIG5vdCBmb3VuZCd9Ci1lcnJvci4gT3RoZXJ3aXNlLCB0aGUgY29udGVudCB0eXBlIGlzIGd1ZXNzZWQgYnkgY2FsbGluZyB0aGUKLVxtZXRob2R7Z3Vlc3NfdHlwZSgpfSBtZXRob2QsIHdoaWNoIGluIHR1cm4gdXNlcyB0aGUKLVx2YXJ7ZXh0ZW5zaW9uc19tYXB9IHZhcmlhYmxlLgotCi1BIFxjb2RleydDb250ZW50LXR5cGU6J30gaGVhZGVyIHdpdGggdGhlIGd1ZXNzZWQgY29udGVudCB0eXBlIGlzCi1vdXRwdXQsIGZvbGxvd2VkIGJ5IGEgXGNvZGV7J0NvbnRlbnQtTGVuZ3RoOid9IGhlYWRlciB3aXRoIHRoZSBmaWxlJ3MKLXNpemUgYW5kIGEgXGNvZGV7J0xhc3QtTW9kaWZpZWQ6J30gaGVhZGVyIHdpdGggdGhlIGZpbGUncyBtb2RpZmljYXRpb24KLXRpbWUuCi0KLVRoZW4gZm9sbG93cyBhIGJsYW5rIGxpbmUgc2lnbmlmeWluZyB0aGUgZW5kIG9mIHRoZSBoZWFkZXJzLAotYW5kIHRoZW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGFyZSBvdXRwdXQuIElmIHRoZSBmaWxlJ3MgTUlNRSB0eXBlCi1zdGFydHMgd2l0aCBcY29kZXt0ZXh0L30gdGhlIGZpbGUgaXMgb3BlbmVkIGluIHRleHQgbW9kZTsgb3RoZXJ3aXNlCi1iaW5hcnkgbW9kZSBpcyB1c2VkLgotCi1Gb3IgZXhhbXBsZSB1c2FnZSwgc2VlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgXGZ1bmN0aW9ue3Rlc3QoKX0KLWZ1bmN0aW9uLgotXHZlcnNpb25hZGRlZFtUaGUgXGNvZGV7J0xhc3QtTW9kaWZpZWQnfSBoZWFkZXJdezIuNX0KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZW1vZHVsZXtCYXNlSFRUUFNlcnZlcn17QmFzZSBjbGFzcyBpbXBsZW1lbnRhdGlvbiBmb3IgV2ViIHNlcnZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgcmVxdWVzdCBoYW5kbGVyLn0KLVxlbmR7c2VlYWxzb30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic2ltcGxleG1scnBjLnRleCBiL0RvYy9saWIvbGlic2ltcGxleG1scnBjLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1OTA1ZS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnNpbXBsZXhtbHJwYy50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtTaW1wbGVYTUxSUENTZXJ2ZXJ9IC0tLQotICAgICAgICAgQmFzaWMgWE1MLVJQQyBzZXJ2ZXJ9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtTaW1wbGVYTUxSUENTZXJ2ZXJ9Ci1cbW9kdWxlc3lub3BzaXN7QmFzaWMgWE1MLVJQQyBzZXJ2ZXIgaW1wbGVtZW50YXRpb24ufQotXG1vZHVsZWF1dGhvcntCcmlhbiBRdWlubGFufXticmlhbnFAYWN0aXZlc3RhdGUuY29tfQotXHNlY3Rpb25hdXRob3J7RnJlZCBMLiBEcmFrZSwgSnIufXtmZHJha2VAYWNtLm9yZ30KLQotXHZlcnNpb25hZGRlZHsyLjJ9Ci0KLVRoZSBcbW9kdWxle1NpbXBsZVhNTFJQQ1NlcnZlcn0gbW9kdWxlIHByb3ZpZGVzIGEgYmFzaWMgc2VydmVyCi1mcmFtZXdvcmsgZm9yIFhNTC1SUEMgc2VydmVycyB3cml0dGVuIGluIFB5dGhvbi4gIFNlcnZlcnMgY2FuIGVpdGhlcgotYmUgZnJlZSBzdGFuZGluZywgdXNpbmcgXGNsYXNze1NpbXBsZVhNTFJQQ1NlcnZlcn0sIG9yIGVtYmVkZGVkIGluIGEKLUNHSSBlbnZpcm9ubWVudCwgdXNpbmcgXGNsYXNze0NHSVhNTFJQQ1JlcXVlc3RIYW5kbGVyfS4KLQotXGJlZ2lue2NsYXNzZGVzY317U2ltcGxlWE1MUlBDU2VydmVyfXthZGRyXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhhbmRsZXJcb3B0aW9uYWx7LAotCQkJCQkgICAgICAgICAgICAgICAgICBsb2dSZXF1ZXN0c1xvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X25vbmVcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ319fX19Ci0KLSAgQ3JlYXRlIGEgbmV3IHNlcnZlciBpbnN0YW5jZS4gIFRoaXMgY2xhc3MKLSAgcHJvdmlkZXMgbWV0aG9kcyBmb3IgcmVnaXN0cmF0aW9uIG9mIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSBjYWxsZWQgYnkKLSAgdGhlIFhNTC1SUEMgcHJvdG9jb2wuICBUaGUgXHZhcntyZXF1ZXN0SGFuZGxlcn0gcGFyYW1ldGVyCi0gIHNob3VsZCBiZSBhIGZhY3RvcnkgZm9yIHJlcXVlc3QgaGFuZGxlciBpbnN0YW5jZXM7IGl0IGRlZmF1bHRzIHRvCi0gIFxjbGFzc3tTaW1wbGVYTUxSUENSZXF1ZXN0SGFuZGxlcn0uICBUaGUgXHZhcnthZGRyfSBhbmQKLSAgXHZhcntyZXF1ZXN0SGFuZGxlcn0gcGFyYW1ldGVycyBhcmUgcGFzc2VkIHRvIHRoZQotICBcY2xhc3N7XHJlZm1vZHVsZXtTb2NrZXRTZXJ2ZXJ9LlRDUFNlcnZlcn0gY29uc3RydWN0b3IuICBJZgotICBcdmFye2xvZ1JlcXVlc3RzfSBpcyB0cnVlICh0aGUgZGVmYXVsdCksIHJlcXVlc3RzIHdpbGwgYmUgbG9nZ2VkOwotICBzZXR0aW5nIHRoaXMgcGFyYW1ldGVyIHRvIGZhbHNlIHdpbGwgdHVybiBvZmYgbG9nZ2luZy4gIAotICBUaGUgXHZhcnthbGxvd19ub25lfSBhbmQgXHZhcntlbmNvZGluZ30gcGFyYW1ldGVycyBhcmUgcGFzc2VkIG9uIHRvIAotICBcbW9kdWxle3htbHJwY2xpYn0gYW5kIGNvbnRyb2wgdGhlIFhNTC1SUEMgcmVzcG9uc2VzIHRoYXQgd2lsbCBiZSByZXR1cm5lZCAKLSAgZnJvbSB0aGUgc2VydmVyLiBUaGUgXHZhcntiaW5kX2FuZF9hY3RpdmF0ZX0gcGFyYW1ldGVyIGNvbnRyb2xzIHdoZXRoZXIKLSAgXG1ldGhvZHtzZXJ2ZXJfYmluZCgpfSBhbmQgXG1ldGhvZHtzZXJ2ZXJfYWN0aXZhdGUoKX0gYXJlIGNhbGxlZCBpbW1lZGlhdGVseQotICBieSB0aGUgY29uc3RydWN0b3I7IGl0IGRlZmF1bHRzIHRvIHRydWUuIFNldHRpbmcgaXQgdG8gZmFsc2UgYWxsb3dzIGNvZGUgdG8KLSAgbWFuaXB1bGF0ZSB0aGUgXHZhcnthbGxvd19yZXVzZV9hZGRyZXNzfSBjbGFzcyB2YXJpYWJsZSBiZWZvcmUgdGhlIGFkZHJlc3MKLSAgaXMgYm91bmQuCi0gIFx2ZXJzaW9uY2hhbmdlZFtUaGUgXHZhcnthbGxvd19ub25lfSBhbmQgXHZhcntlbmNvZGluZ30gcGFyYW1ldGVycyB3ZXJlIGFkZGVkXXsyLjV9Ci0gIFx2ZXJzaW9uY2hhbmdlZFtUaGUgXHZhcntiaW5kX2FuZF9hY3RpdmF0ZX0gcGFyYW1ldGVyIHdhcyBhZGRlZF17Mi42fQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0NHSVhNTFJQQ1JlcXVlc3RIYW5kbGVyfXtcb3B0aW9uYWx7YWxsb3dfbm9uZVxvcHRpb25hbHssIGVuY29kaW5nfX19Ci0gIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSB0byBoYW5kbGUgWE1MLVJQQyByZXF1ZXN0cyBpbiBhIENHSQotICBlbnZpcm9ubWVudC4gCi0gIFRoZSBcdmFye2FsbG93X25vbmV9IGFuZCBcdmFye2VuY29kaW5nfSBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQgb24gdG8gCi0gIFxtb2R1bGV7eG1scnBjbGlifSBhbmQgY29udHJvbCB0aGUgWE1MLVJQQyByZXNwb25zZXMgdGhhdCB3aWxsIGJlIHJldHVybmVkIAotICBmcm9tIHRoZSBzZXJ2ZXIuCi0gIFx2ZXJzaW9uYWRkZWR7Mi4zfQotICBcdmVyc2lvbmNoYW5nZWRbVGhlIFx2YXJ7YWxsb3dfbm9uZX0gYW5kIFx2YXJ7ZW5jb2Rpbmd9IHBhcmFtZXRlcnMgd2VyZSBhZGRlZF17Mi41fQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1NpbXBsZVhNTFJQQ1JlcXVlc3RIYW5kbGVyfXt9Ci0gIENyZWF0ZSBhIG5ldyByZXF1ZXN0IGhhbmRsZXIgaW5zdGFuY2UuICBUaGlzIHJlcXVlc3QgaGFuZGxlcgotICBzdXBwb3J0cyBcY29kZXtQT1NUfSByZXF1ZXN0cyBhbmQgbW9kaWZpZXMgbG9nZ2luZyBzbyB0aGF0IHRoZQotICBcdmFye2xvZ1JlcXVlc3RzfSBwYXJhbWV0ZXIgdG8gdGhlIFxjbGFzc3tTaW1wbGVYTUxSUENTZXJ2ZXJ9Ci0gIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBpcyBob25vcmVkLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLQotXHN1YnNlY3Rpb257U2ltcGxlWE1MUlBDU2VydmVyIE9iamVjdHMgXGxhYmVse3NpbXBsZS14bWxycGMtc2VydmVyc319Ci0KLVRoZSBcY2xhc3N7U2ltcGxlWE1MUlBDU2VydmVyfSBjbGFzcyBpcyBiYXNlZCBvbgotXGNsYXNze1NvY2tldFNlcnZlci5UQ1BTZXJ2ZXJ9IGFuZCBwcm92aWRlcyBhIG1lYW5zIG9mIGNyZWF0aW5nCi1zaW1wbGUsIHN0YW5kIGFsb25lIFhNTC1SUEMgc2VydmVycy4KLQotXGJlZ2lue21ldGhvZGRlc2N9W1NpbXBsZVhNTFJQQ1NlcnZlcl17cmVnaXN0ZXJfZnVuY3Rpb259e2Z1bmN0aW9uXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lfX0KLSAgUmVnaXN0ZXIgYSBmdW5jdGlvbiB0aGF0IGNhbiByZXNwb25kIHRvIFhNTC1SUEMgcmVxdWVzdHMuICBJZgotICBcdmFye25hbWV9IGlzIGdpdmVuLCBpdCB3aWxsIGJlIHRoZSBtZXRob2QgbmFtZSBhc3NvY2lhdGVkIHdpdGgKLSAgXHZhcntmdW5jdGlvbn0sIG90aGVyd2lzZSBcY29kZXtcdmFye2Z1bmN0aW9ufS5fX25hbWVfX30gd2lsbCBiZQotICB1c2VkLiAgXHZhcntuYW1lfSBjYW4gYmUgZWl0aGVyIGEgbm9ybWFsIG9yIFVuaWNvZGUgc3RyaW5nLCBhbmQgbWF5Ci0gIGNvbnRhaW4gY2hhcmFjdGVycyBub3QgbGVnYWwgaW4gUHl0aG9uIGlkZW50aWZpZXJzLCBpbmNsdWRpbmcgdGhlCi0gIHBlcmlvZCBjaGFyYWN0ZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtTaW1wbGVYTUxSUENTZXJ2ZXJde3JlZ2lzdGVyX2luc3RhbmNlfXtpbnN0YW5jZVxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19kb3R0ZWRfbmFtZXN9fQotICBSZWdpc3RlciBhbiBvYmplY3Qgd2hpY2ggaXMgdXNlZCB0byBleHBvc2UgbWV0aG9kIG5hbWVzIHdoaWNoIGhhdmUKLSAgbm90IGJlZW4gcmVnaXN0ZXJlZCB1c2luZyBcbWV0aG9ke3JlZ2lzdGVyX2Z1bmN0aW9uKCl9LiAgSWYKLSAgXHZhcntpbnN0YW5jZX0gY29udGFpbnMgYSBcbWV0aG9ke19kaXNwYXRjaCgpfSBtZXRob2QsIGl0IGlzIGNhbGxlZAotICB3aXRoIHRoZSByZXF1ZXN0ZWQgbWV0aG9kIG5hbWUgYW5kIHRoZSBwYXJhbWV0ZXJzIGZyb20gdGhlIHJlcXVlc3QuICBJdHMKLSAgQVBJIGlzIFxjb2Rle2RlZiBcbWV0aG9ke19kaXNwYXRjaH0oc2VsZiwgbWV0aG9kLCBwYXJhbXMpfSAobm90ZSB0aGF0Ci0gIFx2YXJ7cGFyYW1zfSBkb2VzIG5vdCByZXByZXNlbnQgYSB2YXJpYWJsZSBhcmd1bWVudCBsaXN0KS4gIElmIGl0IGNhbGxzIGFuCi0gIHVuZGVybHlpbmcgZnVuY3Rpb24gdG8gcGVyZm9ybSBpdHMgdGFzaywgdGhhdCBmdW5jdGlvbiBpcyBjYWxsZWQgYXMKLSAgXGNvZGV7ZnVuYygqcGFyYW1zKX0sIGV4cGFuZGluZyB0aGUgcGFyYW1ldGVyIGxpc3QuCi0gIFRoZSByZXR1cm4gdmFsdWUgZnJvbSBcbWV0aG9ke19kaXNwYXRjaCgpfSBpcyByZXR1cm5lZCB0byB0aGUgY2xpZW50IGFzCi0gIHRoZSByZXN1bHQuICBJZgotICBcdmFye2luc3RhbmNlfSBkb2VzIG5vdCBoYXZlIGEgXG1ldGhvZHtfZGlzcGF0Y2goKX0gbWV0aG9kLCBpdCBpcwotICBzZWFyY2hlZCBmb3IgYW4gYXR0cmlidXRlIG1hdGNoaW5nIHRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgbWV0aG9kLgotCi0gIElmIHRoZSBvcHRpb25hbCBcdmFye2FsbG93X2RvdHRlZF9uYW1lc30gYXJndW1lbnQgaXMgdHJ1ZSBhbmQgdGhlCi0gIGluc3RhbmNlIGRvZXMgbm90IGhhdmUgYSBcbWV0aG9ke19kaXNwYXRjaCgpfSBtZXRob2QsIHRoZW4KLSAgaWYgdGhlIHJlcXVlc3RlZCBtZXRob2QgbmFtZSBjb250YWlucyBwZXJpb2RzLCBlYWNoIGNvbXBvbmVudCBvZiB0aGUKLSAgbWV0aG9kIG5hbWUgaXMgc2VhcmNoZWQgZm9yIGluZGl2aWR1YWxseSwgd2l0aCB0aGUgZWZmZWN0IHRoYXQgYQotICBzaW1wbGUgaGllcmFyY2hpY2FsIHNlYXJjaCBpcyBwZXJmb3JtZWQuICBUaGUgdmFsdWUgZm91bmQgZnJvbSB0aGlzCi0gIHNlYXJjaCBpcyB0aGVuIGNhbGxlZCB3aXRoIHRoZSBwYXJhbWV0ZXJzIGZyb20gdGhlIHJlcXVlc3QsIGFuZCB0aGUKLSAgcmV0dXJuIHZhbHVlIGlzIHBhc3NlZCBiYWNrIHRvIHRoZSBjbGllbnQuCi0KLSAgXGJlZ2lue25vdGljZX1bd2FybmluZ10KLSAgRW5hYmxpbmcgdGhlIFx2YXJ7YWxsb3dfZG90dGVkX25hbWVzfSBvcHRpb24gYWxsb3dzIGludHJ1ZGVycyB0byBhY2Nlc3MKLSAgeW91ciBtb2R1bGUncyBnbG9iYWwgdmFyaWFibGVzIGFuZCBtYXkgYWxsb3cgaW50cnVkZXJzIHRvIGV4ZWN1dGUKLSAgYXJiaXRyYXJ5IGNvZGUgb24geW91ciBtYWNoaW5lLiAgT25seSB1c2UgdGhpcyBvcHRpb24gb24gYSBzZWN1cmUsCi0gIGNsb3NlZCBuZXR3b3JrLgotICBcZW5ke25vdGljZX0KLQotICBcdmVyc2lvbmNoYW5nZWRbXHZhcnthbGxvd19kb3R0ZWRfbmFtZXN9IHdhcyBhZGRlZCB0byBwbHVnIGEgc2VjdXJpdHkgaG9sZTsKLSAgcHJpb3IgdmVyc2lvbnMgYXJlIGluc2VjdXJlXXsyLjMuNSwgMi40LjF9Ci0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1NpbXBsZVhNTFJQQ1NlcnZlcl17cmVnaXN0ZXJfaW50cm9zcGVjdGlvbl9mdW5jdGlvbnN9e30KLSAgUmVnaXN0ZXJzIHRoZSBYTUwtUlBDIGludHJvc3BlY3Rpb24gZnVuY3Rpb25zIFxjb2Rle3N5c3RlbS5saXN0TWV0aG9kc30sCi0gIFxjb2Rle3N5c3RlbS5tZXRob2RIZWxwfSBhbmQgXGNvZGV7c3lzdGVtLm1ldGhvZFNpZ25hdHVyZX0uIAotICBcdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1NpbXBsZVhNTFJQQ1NlcnZlcl17cmVnaXN0ZXJfbXVsdGljYWxsX2Z1bmN0aW9uc317fQotICBSZWdpc3RlcnMgdGhlIFhNTC1SUEMgbXVsdGljYWxsIGZ1bmN0aW9uIHN5c3RlbS5tdWx0aWNhbGwuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtTaW1wbGVYTUxSUENTZXJ2ZXJde3JwY19wYXRoc30KLUFuIGF0dHJpYnV0ZSB2YWx1ZSB0aGF0IG11c3QgYmUgYSB0dXBsZSBsaXN0aW5nIHZhbGlkIHBhdGggcG9ydGlvbnMgb2YKLXRoZSBVUkwgZm9yIHJlY2VpdmluZyBYTUwtUlBDIHJlcXVlc3RzLiAgUmVxdWVzdHMgcG9zdGVkIHRvIG90aGVyCi1wYXRocyB3aWxsIHJlc3VsdCBpbiBhIDQwNCBgYG5vIHN1Y2ggcGFnZScnIEhUVFAgZXJyb3IuICBJZiB0aGlzCi10dXBsZSBpcyBlbXB0eSwgYWxsIHBhdGhzIHdpbGwgYmUgY29uc2lkZXJlZCB2YWxpZC4KLVRoZSBkZWZhdWx0IHZhbHVlIGlzIFxjb2RleygnLycsICcvUlBDMicpfS4KLSAgXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke21lbWJlcmRlc2N9Ci0KLUV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWZyb20gU2ltcGxlWE1MUlBDU2VydmVyIGltcG9ydCBTaW1wbGVYTUxSUENTZXJ2ZXIKLQotIyBDcmVhdGUgc2VydmVyCi1zZXJ2ZXIgPSBTaW1wbGVYTUxSUENTZXJ2ZXIoKCJsb2NhbGhvc3QiLCA4MDAwKSkKLXNlcnZlci5yZWdpc3Rlcl9pbnRyb3NwZWN0aW9uX2Z1bmN0aW9ucygpCi0KLSMgUmVnaXN0ZXIgcG93KCkgZnVuY3Rpb247IHRoaXMgd2lsbCB1c2UgdGhlIHZhbHVlIG9mIAotIyBwb3cuX19uYW1lX18gYXMgdGhlIG5hbWUsIHdoaWNoIGlzIGp1c3QgJ3BvdycuCi1zZXJ2ZXIucmVnaXN0ZXJfZnVuY3Rpb24ocG93KQotCi0jIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdW5kZXIgYSBkaWZmZXJlbnQgbmFtZQotZGVmIGFkZGVyX2Z1bmN0aW9uKHgseSk6Ci0gICAgcmV0dXJuIHggKyB5Ci1zZXJ2ZXIucmVnaXN0ZXJfZnVuY3Rpb24oYWRkZXJfZnVuY3Rpb24sICdhZGQnKQotCi0jIFJlZ2lzdGVyIGFuIGluc3RhbmNlOyBhbGwgdGhlIG1ldGhvZHMgb2YgdGhlIGluc3RhbmNlIGFyZSAKLSMgcHVibGlzaGVkIGFzIFhNTC1SUEMgbWV0aG9kcyAoaW4gdGhpcyBjYXNlLCBqdXN0ICdkaXYnKS4KLWNsYXNzIE15RnVuY3M6Ci0gICAgZGVmIGRpdihzZWxmLCB4LCB5KTogCi0gICAgICAgIHJldHVybiB4IC8vIHkKLSAgICAKLXNlcnZlci5yZWdpc3Rlcl9pbnN0YW5jZShNeUZ1bmNzKCkpCi0KLSMgUnVuIHRoZSBzZXJ2ZXIncyBtYWluIGxvb3AKLXNlcnZlci5zZXJ2ZV9mb3JldmVyKCkKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBmb2xsb3dpbmcgY2xpZW50IGNvZGUgd2lsbCBjYWxsIHRoZSBtZXRob2RzIG1hZGUgYXZhaWxhYmxlIGJ5IAotdGhlIHByZWNlZGluZyBzZXJ2ZXI6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCB4bWxycGNsaWIKLQotcyA9IHhtbHJwY2xpYi5TZXJ2ZXIoJ2h0dHA6Ly9sb2NhbGhvc3Q6ODAwMCcpCi1wcmludCBzLnBvdygyLDMpICAjIFJldHVybnMgMioqMyA9IDgKLXByaW50IHMuYWRkKDIsMykgICMgUmV0dXJucyA1Ci1wcmludCBzLmRpdig1LDIpICAjIFJldHVybnMgNS8vMiA9IDIKLQotIyBQcmludCBsaXN0IG9mIGF2YWlsYWJsZSBtZXRob2RzCi1wcmludCBzLnN5c3RlbS5saXN0TWV0aG9kcygpCi1cZW5ke3ZlcmJhdGltfQotCi0KLVxzdWJzZWN0aW9ue0NHSVhNTFJQQ1JlcXVlc3RIYW5kbGVyfQotCi1UaGUgXGNsYXNze0NHSVhNTFJQQ1JlcXVlc3RIYW5kbGVyfSBjbGFzcyBjYW4gYmUgdXNlZCB0byAKLWhhbmRsZSBYTUwtUlBDIHJlcXVlc3RzIHNlbnQgdG8gUHl0aG9uIENHSSBzY3JpcHRzLgotCi1cYmVnaW57bWV0aG9kZGVzY31bQ0dJWE1MUlBDUmVxdWVzdEhhbmRsZXJde3JlZ2lzdGVyX2Z1bmN0aW9ufXtmdW5jdGlvblxvcHRpb25hbHssIG5hbWV9fQotUmVnaXN0ZXIgYSBmdW5jdGlvbiB0aGF0IGNhbiByZXNwb25kIHRvIFhNTC1SUEMgcmVxdWVzdHMuIElmIAotXHZhcntuYW1lfSBpcyBnaXZlbiwgaXQgd2lsbCBiZSB0aGUgbWV0aG9kIG5hbWUgYXNzb2NpYXRlZCB3aXRoIAotZnVuY3Rpb24sIG90aGVyd2lzZSBcdmFye2Z1bmN0aW9uLl9fbmFtZV9ffSB3aWxsIGJlIHVzZWQuIFx2YXJ7bmFtZX0KLWNhbiBiZSBlaXRoZXIgYSBub3JtYWwgb3IgVW5pY29kZSBzdHJpbmcsIGFuZCBtYXkgY29udGFpbiAKLWNoYXJhY3RlcnMgbm90IGxlZ2FsIGluIFB5dGhvbiBpZGVudGlmaWVycywgaW5jbHVkaW5nIHRoZSBwZXJpb2QKLWNoYXJhY3Rlci4gCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDR0lYTUxSUENSZXF1ZXN0SGFuZGxlcl17cmVnaXN0ZXJfaW5zdGFuY2V9e2luc3RhbmNlfQotUmVnaXN0ZXIgYW4gb2JqZWN0IHdoaWNoIGlzIHVzZWQgdG8gZXhwb3NlIG1ldGhvZCBuYW1lcyAKLXdoaWNoIGhhdmUgbm90IGJlZW4gcmVnaXN0ZXJlZCB1c2luZyBcbWV0aG9ke3JlZ2lzdGVyX2Z1bmN0aW9uKCl9LiBJZiAKLWluc3RhbmNlIGNvbnRhaW5zIGEgXG1ldGhvZHtfZGlzcGF0Y2goKX0gbWV0aG9kLCBpdCBpcyBjYWxsZWQgd2l0aCB0aGUgCi1yZXF1ZXN0ZWQgbWV0aG9kIG5hbWUgYW5kIHRoZSBwYXJhbWV0ZXJzIGZyb20gdGhlIAotcmVxdWVzdDsgdGhlIHJldHVybiB2YWx1ZSBpcyByZXR1cm5lZCB0byB0aGUgY2xpZW50IGFzIHRoZSByZXN1bHQuCi1JZiBpbnN0YW5jZSBkb2VzIG5vdCBoYXZlIGEgXG1ldGhvZHtfZGlzcGF0Y2goKX0gbWV0aG9kLCBpdCBpcyBzZWFyY2hlZCAKLWZvciBhbiBhdHRyaWJ1dGUgbWF0Y2hpbmcgdGhlIG5hbWUgb2YgdGhlIHJlcXVlc3RlZCBtZXRob2Q7IGlmIAotdGhlIHJlcXVlc3RlZCBtZXRob2QgbmFtZSBjb250YWlucyBwZXJpb2RzLCBlYWNoIAotY29tcG9uZW50IG9mIHRoZSBtZXRob2QgbmFtZSBpcyBzZWFyY2hlZCBmb3IgaW5kaXZpZHVhbGx5LCAKLXdpdGggdGhlIGVmZmVjdCB0aGF0IGEgc2ltcGxlIGhpZXJhcmNoaWNhbCBzZWFyY2ggaXMgcGVyZm9ybWVkLiAKLVRoZSB2YWx1ZSBmb3VuZCBmcm9tIHRoaXMgc2VhcmNoIGlzIHRoZW4gY2FsbGVkIHdpdGggdGhlIAotcGFyYW1ldGVycyBmcm9tIHRoZSByZXF1ZXN0LCBhbmQgdGhlIHJldHVybiB2YWx1ZSBpcyBwYXNzZWQgCi1iYWNrIHRvIHRoZSBjbGllbnQuIAotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ0dJWE1MUlBDUmVxdWVzdEhhbmRsZXJde3JlZ2lzdGVyX2ludHJvc3BlY3Rpb25fZnVuY3Rpb25zfXt9Ci1SZWdpc3RlciB0aGUgWE1MLVJQQyBpbnRyb3NwZWN0aW9uIGZ1bmN0aW9ucyAKLVxjb2Rle3N5c3RlbS5saXN0TWV0aG9kc30sIFxjb2Rle3N5c3RlbS5tZXRob2RIZWxwfSBhbmQgCi1cY29kZXtzeXN0ZW0ubWV0aG9kU2lnbmF0dXJlfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0NHSVhNTFJQQ1JlcXVlc3RIYW5kbGVyXXtyZWdpc3Rlcl9tdWx0aWNhbGxfZnVuY3Rpb25zfXt9Ci1SZWdpc3RlciB0aGUgWE1MLVJQQyBtdWx0aWNhbGwgZnVuY3Rpb24gXGNvZGV7c3lzdGVtLm11bHRpY2FsbH0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDR0lYTUxSUENSZXF1ZXN0SGFuZGxlcl17aGFuZGxlX3JlcXVlc3R9e1xvcHRpb25hbHtyZXF1ZXN0X3RleHQgPSBOb25lfX0KLUhhbmRsZSBhIFhNTC1SUEMgcmVxdWVzdC4gSWYgXHZhcntyZXF1ZXN0X3RleHR9IGlzIGdpdmVuLCBpdCAKLXNob3VsZCBiZSB0aGUgUE9TVCBkYXRhIHByb3ZpZGVkIGJ5IHRoZSBIVFRQIHNlcnZlciwgCi1vdGhlcndpc2UgdGhlIGNvbnRlbnRzIG9mIHN0ZGluIHdpbGwgYmUgdXNlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotRXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotY2xhc3MgTXlGdW5jczoKLSAgICBkZWYgZGl2KHNlbGYsIHgsIHkpIDogcmV0dXJuIHggLy8geQotCi0KLWhhbmRsZXIgPSBDR0lYTUxSUENSZXF1ZXN0SGFuZGxlcigpCi1oYW5kbGVyLnJlZ2lzdGVyX2Z1bmN0aW9uKHBvdykKLWhhbmRsZXIucmVnaXN0ZXJfZnVuY3Rpb24obGFtYmRhIHgseTogeCt5LCAnYWRkJykKLWhhbmRsZXIucmVnaXN0ZXJfaW50cm9zcGVjdGlvbl9mdW5jdGlvbnMoKQotaGFuZGxlci5yZWdpc3Rlcl9pbnN0YW5jZShNeUZ1bmNzKCkpCi1oYW5kbGVyLmhhbmRsZV9yZXF1ZXN0KCkKLVxlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnNpdGUudGV4IGIvRG9jL2xpYi9saWJzaXRlLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE4NThkMS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnNpdGUudGV4CisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtzaXRlfSAtLS0KLSAgICAgICAgIFNpdGUtc3BlY2lmaWMgY29uZmlndXJhdGlvbiBob29rfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17c2l0ZX0KLVxtb2R1bGVzeW5vcHNpc3tBIHN0YW5kYXJkIHdheSB0byByZWZlcmVuY2Ugc2l0ZS1zcGVjaWZpYyBtb2R1bGVzLn0KLQotCi1cc3Ryb25ne1RoaXMgbW9kdWxlIGlzIGF1dG9tYXRpY2FsbHkgaW1wb3J0ZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLn0KLVRoZSBhdXRvbWF0aWMgaW1wb3J0IGNhbiBiZSBzdXBwcmVzc2VkIHVzaW5nIHRoZSBpbnRlcnByZXRlcidzCi1ccHJvZ3JhbW9wdHstU30gb3B0aW9uLgotCi1JbXBvcnRpbmcgdGhpcyBtb2R1bGUgd2lsbCBhcHBlbmQgc2l0ZS1zcGVjaWZpYyBwYXRocyB0byB0aGUgbW9kdWxlCi1zZWFyY2ggcGF0aC4KLVxpbmRleGlpaXttb2R1bGV9e3NlYXJjaH17cGF0aH0KLQotSXQgc3RhcnRzIGJ5IGNvbnN0cnVjdGluZyB1cCB0byBmb3VyIGRpcmVjdG9yaWVzIGZyb20gYSBoZWFkIGFuZCBhCi10YWlsIHBhcnQuICBGb3IgdGhlIGhlYWQgcGFydCwgaXQgdXNlcyBcY29kZXtzeXMucHJlZml4fSBhbmQKLVxjb2Rle3N5cy5leGVjX3ByZWZpeH07IGVtcHR5IGhlYWRzIGFyZSBza2lwcGVkLiAgRm9yCi10aGUgdGFpbCBwYXJ0LCBpdCB1c2VzIHRoZSBlbXB0eSBzdHJpbmcgYW5kIHRoZW4KLVxmaWxle2xpYi9zaXRlLXBhY2thZ2VzfSAob24gV2luZG93cykgb3IKLVxmaWxle2xpYi9weXRob25cc2hvcnR2ZXJzaW9uL3NpdGUtcGFja2FnZXN9IGFuZCB0aGVuCi1cZmlsZXtsaWIvc2l0ZS1weXRob259IChvbiBcVU5JWHt9IGFuZCBNYWNpbnRvc2gpLiAgRm9yIGVhY2ggb2YgdGhlCi1kaXN0aW5jdCBoZWFkLXRhaWwgY29tYmluYXRpb25zLCBpdCBzZWVzIGlmIGl0IHJlZmVycyB0byBhbiBleGlzdGluZwotZGlyZWN0b3J5LCBhbmQgaWYgc28sIGFkZHMgaXQgdG8gXGNvZGV7c3lzLnBhdGh9IGFuZCBhbHNvIGluc3BlY3RzCi10aGUgbmV3bHkgYWRkZWQgcGF0aCBmb3IgY29uZmlndXJhdGlvbiBmaWxlcy4KLVxpbmRleGlpe3NpdGUtcHl0aG9ufXtkaXJlY3Rvcnl9Ci1caW5kZXhpaXtzaXRlLXBhY2thZ2VzfXtkaXJlY3Rvcnl9Ci0KLUEgcGF0aCBjb25maWd1cmF0aW9uIGZpbGUgaXMgYSBmaWxlIHdob3NlIG5hbWUgaGFzIHRoZSBmb3JtCi1cZmlsZXtcdmFye3BhY2thZ2V9LnB0aH0gYW5kIGV4aXN0cyBpbiBvbmUgb2YgdGhlIGZvdXIgZGlyZWN0b3JpZXMKLW1lbnRpb25lZCBhYm92ZTsgaXRzIGNvbnRlbnRzIGFyZSBhZGRpdGlvbmFsIGl0ZW1zIChvbmUgcGVyIGxpbmUpIHRvCi1iZSBhZGRlZCB0byBcY29kZXtzeXMucGF0aH0uICBOb24tZXhpc3RpbmcgaXRlbXMgYXJlIG5ldmVyIGFkZGVkIHRvCi1cY29kZXtzeXMucGF0aH0sIGJ1dCBubyBjaGVjayBpcyBtYWRlIHRoYXQgdGhlIGl0ZW0gcmVmZXJzIHRvIGEKLWRpcmVjdG9yeSAocmF0aGVyIHRoYW4gYSBmaWxlKS4gIE5vIGl0ZW0gaXMgYWRkZWQgdG8gXGNvZGV7c3lzLnBhdGh9Ci1tb3JlIHRoYW4gb25jZS4gIEJsYW5rIGxpbmVzIGFuZCBsaW5lcyBiZWdpbm5pbmcgd2l0aCBcY29kZXtcI30gYXJlCi1za2lwcGVkLiAgTGluZXMgc3RhcnRpbmcgd2l0aCBcY29kZXtpbXBvcnR9IChmb2xsb3dlZCBieSBzcGFjZSBvciB0YWIpCi1hcmUgZXhlY3V0ZWQuCi0KLVx2ZXJzaW9uY2hhbmdlZFtBIHNwYWNlIG9yIHRhYiBpcyBub3cgcmVxdWlyZWQgYWZ0ZXIgdGhlIGltcG9ydAota2V5d29yZF17Mi42fQotCi1caW5kZXh7cGFja2FnZX0KLVxpbmRleGlpaXtwYXRofXtjb25maWd1cmF0aW9ufXtmaWxlfQotCi1Gb3IgZXhhbXBsZSwgc3VwcG9zZSBcY29kZXtzeXMucHJlZml4fSBhbmQgXGNvZGV7c3lzLmV4ZWNfcHJlZml4fSBhcmUKLXNldCB0byBcZmlsZXsvdXNyL2xvY2FsfS4gIFRoZSBQeXRob24gXHZlcnNpb25cIGxpYnJhcnkgaXMgdGhlbgotaW5zdGFsbGVkIGluIFxmaWxley91c3IvbG9jYWwvbGliL3B5dGhvblxzaG9ydHZlcnNpb259ICh3aGVyZSBvbmx5IHRoZQotZmlyc3QgdGhyZWUgY2hhcmFjdGVycyBvZiBcY29kZXtzeXMudmVyc2lvbn0gYXJlIHVzZWQgdG8gZm9ybSB0aGUKLWluc3RhbGxhdGlvbiBwYXRoIG5hbWUpLiAgU3VwcG9zZSB0aGlzIGhhcyBhIHN1YmRpcmVjdG9yeQotXGZpbGV7L3Vzci9sb2NhbC9saWIvcHl0aG9uXHNob3J0dmVyc2lvbi9zaXRlLXBhY2thZ2VzfSB3aXRoIHRocmVlCi1zdWJzdWJkaXJlY3RvcmllcywgXGZpbGV7Zm9vfSwgXGZpbGV7YmFyfSBhbmQgXGZpbGV7c3BhbX0sIGFuZCB0d28KLXBhdGggY29uZmlndXJhdGlvbiBmaWxlcywgXGZpbGV7Zm9vLnB0aH0gYW5kIFxmaWxle2Jhci5wdGh9LiAgQXNzdW1lCi1cZmlsZXtmb28ucHRofSBjb250YWlucyB0aGUgZm9sbG93aW5nOgotCi1cYmVnaW57dmVyYmF0aW19Ci0jIGZvbyBwYWNrYWdlIGNvbmZpZ3VyYXRpb24KLQotZm9vCi1iYXIKLWJsZXRjaAotXGVuZHt2ZXJiYXRpbX0KLQotYW5kIFxmaWxle2Jhci5wdGh9IGNvbnRhaW5zOgotCi1cYmVnaW57dmVyYmF0aW19Ci0jIGJhciBwYWNrYWdlIGNvbmZpZ3VyYXRpb24KLQotYmFyCi1cZW5ke3ZlcmJhdGltfQotCi1UaGVuIHRoZSBmb2xsb3dpbmcgZGlyZWN0b3JpZXMgYXJlIGFkZGVkIHRvIFxjb2Rle3N5cy5wYXRofSwgaW4gdGhpcwotb3JkZXI6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLS91c3IvbG9jYWwvbGliL3B5dGhvbjIuMy9zaXRlLXBhY2thZ2VzL2JhcgotL3Vzci9sb2NhbC9saWIvcHl0aG9uMi4zL3NpdGUtcGFja2FnZXMvZm9vCi1cZW5ke3ZlcmJhdGltfQotCi1Ob3RlIHRoYXQgXGZpbGV7YmxldGNofSBpcyBvbWl0dGVkIGJlY2F1c2UgaXQgZG9lc24ndCBleGlzdDsgdGhlCi1cZmlsZXtiYXJ9IGRpcmVjdG9yeSBwcmVjZWRlcyB0aGUgXGZpbGV7Zm9vfSBkaXJlY3RvcnkgYmVjYXVzZQotXGZpbGV7YmFyLnB0aH0gY29tZXMgYWxwaGFiZXRpY2FsbHkgYmVmb3JlIFxmaWxle2Zvby5wdGh9OyBhbmQKLVxmaWxle3NwYW19IGlzIG9taXR0ZWQgYmVjYXVzZSBpdCBpcyBub3QgbWVudGlvbmVkIGluIGVpdGhlciBwYXRoCi1jb25maWd1cmF0aW9uIGZpbGUuCi0KLUFmdGVyIHRoZXNlIHBhdGggbWFuaXB1bGF0aW9ucywgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGltcG9ydCBhIG1vZHVsZQotbmFtZWQgXG1vZHVsZXtzaXRlY3VzdG9taXplfVxyZWZtb2RpbmRleHtzaXRlY3VzdG9taXplfSwgd2hpY2ggY2FuCi1wZXJmb3JtIGFyYml0cmFyeSBzaXRlLXNwZWNpZmljIGN1c3RvbWl6YXRpb25zLiAgSWYgdGhpcyBpbXBvcnQgZmFpbHMKLXdpdGggYW4gXGV4Y2VwdGlvbntJbXBvcnRFcnJvcn0gZXhjZXB0aW9uLCBpdCBpcyBzaWxlbnRseSBpZ25vcmVkLgotCi1Ob3RlIHRoYXQgZm9yIHNvbWUgbm9uLVxVTklYe30gc3lzdGVtcywgXGNvZGV7c3lzLnByZWZpeH0gYW5kCi1cY29kZXtzeXMuZXhlY19wcmVmaXh9IGFyZSBlbXB0eSwgYW5kIHRoZSBwYXRoIG1hbmlwdWxhdGlvbnMgYXJlCi1za2lwcGVkOyBob3dldmVyIHRoZSBpbXBvcnQgb2YKLVxtb2R1bGV7c2l0ZWN1c3RvbWl6ZX1ccmVmbW9kaW5kZXh7c2l0ZWN1c3RvbWl6ZX0gaXMgc3RpbGwgYXR0ZW1wdGVkLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJzbXRwZC50ZXggYi9Eb2MvbGliL2xpYnNtdHBkLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU3MDUwZC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnNtdHBkLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7c210cGR9IC0tLQotICAgICAgICAgU01UUCBTZXJ2ZXJ9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtzbXRwZH0KLQotXG1vZHVsZWF1dGhvcntCYXJyeSBXYXJzYXd9e2JhcnJ5QHpvcGUuY29tfQotXHNlY3Rpb25hdXRob3J7TW9zaGUgWmFka2F9e21vc2hlekBtb3NoZXoub3JnfQotCi1cbW9kdWxlc3lub3BzaXN7SW1wbGVtZW50IGEgZmxleGlibGUgU01UUCBzZXJ2ZXJ9Ci0KLVRoaXMgbW9kdWxlIG9mZmVycyBzZXZlcmFsIGNsYXNzZXMgdG8gaW1wbGVtZW50IFNNVFAgc2VydmVycy4gIE9uZSBpcwotYSBnZW5lcmljIGRvLW5vdGhpbmcgaW1wbGVtZW50YXRpb24sIHdoaWNoIGNhbiBiZSBvdmVycmlkZGVuLCB3aGlsZQotdGhlIG90aGVyIHR3byBvZmZlciBzcGVjaWZpYyBtYWlsLXNlbmRpbmcgc3RyYXRlZ2llcy4KLQotCi1cc3Vic2VjdGlvbntTTVRQU2VydmVyIE9iamVjdHN9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1NNVFBTZXJ2ZXJ9e2xvY2FsYWRkciwgcmVtb3RlYWRkcn0KLUNyZWF0ZSBhIG5ldyBcY2xhc3N7U01UUFNlcnZlcn0gb2JqZWN0LCB3aGljaCBiaW5kcyB0byBsb2NhbCBhZGRyZXNzCi1cdmFye2xvY2FsYWRkcn0uICBJdCB3aWxsIHRyZWF0IFx2YXJ7cmVtb3RlYWRkcn0gYXMgYW4gdXBzdHJlYW0gU01UUAotcmVsYXllci4gIEl0IGluaGVyaXRzIGZyb20gXGNsYXNze2FzeW5jb3JlLmRpc3BhdGNoZXJ9LCBhbmQgc28gd2lsbAotaW5zZXJ0IGl0c2VsZiBpbnRvIFxyZWZtb2R1bGV7YXN5bmNvcmV9J3MgZXZlbnQgbG9vcCBvbiBpbnN0YW50aWF0aW9uLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtTTVRQU2VydmVyXXtwcm9jZXNzX21lc3NhZ2V9e3BlZXIsIG1haWxmcm9tLCByY3B0dG9zLCBkYXRhfQotUmFpc2UgXGV4Y2VwdGlvbntOb3RJbXBsZW1lbnRlZEVycm9yfSBleGNlcHRpb24uIE92ZXJyaWRlIHRoaXMgaW4KLXN1YmNsYXNzZXMgdG8gZG8gc29tZXRoaW5nIHVzZWZ1bCB3aXRoIHRoaXMgbWVzc2FnZS4gV2hhdGV2ZXIgd2FzCi1wYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGFzIFx2YXJ7cmVtb3RlYWRkcn0gd2lsbCBiZSBhdmFpbGFibGUgYXMgdGhlCi1cbWVtYmVye19yZW1vdGVhZGRyfSBhdHRyaWJ1dGUuIFx2YXJ7cGVlcn0gaXMgdGhlIHJlbW90ZSBob3N0J3MgYWRkcmVzcywKLVx2YXJ7bWFpbGZyb219IGlzIHRoZSBlbnZlbG9wZSBvcmlnaW5hdG9yLCBcdmFye3JjcHR0b3N9IGFyZSB0aGUKLWVudmVsb3BlIHJlY2lwaWVudHMgYW5kIFx2YXJ7ZGF0YX0gaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgY29udGVudHMKLW9mIHRoZSBlLW1haWwgKHdoaWNoIHNob3VsZCBiZSBpbiBccmZjezI4MjJ9IGZvcm1hdCkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLQotXHN1YnNlY3Rpb257RGVidWdnaW5nU2VydmVyIE9iamVjdHN9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0RlYnVnZ2luZ1NlcnZlcn17bG9jYWxhZGRyLCByZW1vdGVhZGRyfQotQ3JlYXRlIGEgbmV3IGRlYnVnZ2luZyBzZXJ2ZXIuICBBcmd1bWVudHMgYXJlIGFzIHBlcgotXGNsYXNze1NNVFBTZXJ2ZXJ9LiAgTWVzc2FnZXMgd2lsbCBiZSBkaXNjYXJkZWQsIGFuZCBwcmludGVkIG9uCi1zdGRvdXQuCi1cZW5ke2NsYXNzZGVzY30KLQotCi1cc3Vic2VjdGlvbntQdXJlUHJveHkgT2JqZWN0c30KLQotXGJlZ2lue2NsYXNzZGVzY317UHVyZVByb3h5fXtsb2NhbGFkZHIsIHJlbW90ZWFkZHJ9Ci1DcmVhdGUgYSBuZXcgcHVyZSBwcm94eSBzZXJ2ZXIuIEFyZ3VtZW50cyBhcmUgYXMgcGVyIFxjbGFzc3tTTVRQU2VydmVyfS4KLUV2ZXJ5dGhpbmcgd2lsbCBiZSByZWxheWVkIHRvIFx2YXJ7cmVtb3RlYWRkcn0uICBOb3RlIHRoYXQgcnVubmluZwotdGhpcyBoYXMgYSBnb29kIGNoYW5jZSB0byBtYWtlIHlvdSBpbnRvIGFuIG9wZW4gcmVsYXksIHNvIHBsZWFzZSBiZQotY2FyZWZ1bC4KLVxlbmR7Y2xhc3NkZXNjfQotCi0KLVxzdWJzZWN0aW9ue01haWxtYW5Qcm94eSBPYmplY3RzfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtNYWlsbWFuUHJveHl9e2xvY2FsYWRkciwgcmVtb3RlYWRkcn0KLUNyZWF0ZSBhIG5ldyBwdXJlIHByb3h5IHNlcnZlci4gQXJndW1lbnRzIGFyZSBhcyBwZXIKLVxjbGFzc3tTTVRQU2VydmVyfS4gIEV2ZXJ5dGhpbmcgd2lsbCBiZSByZWxheWVkIHRvIFx2YXJ7cmVtb3RlYWRkcn0sCi11bmxlc3MgbG9jYWwgbWFpbG1hbiBjb25maWd1cmF0aW9ucyBrbm93cyBhYm91dCBhbiBhZGRyZXNzLCBpbiB3aGljaAotY2FzZSBpdCB3aWxsIGJlIGhhbmRsZWQgdmlhIG1haWxtYW4uICBOb3RlIHRoYXQgcnVubmluZyB0aGlzIGhhcyBhCi1nb29kIGNoYW5jZSB0byBtYWtlIHlvdSBpbnRvIGFuIG9wZW4gcmVsYXksIHNvIHBsZWFzZSBiZSBjYXJlZnVsLgotXGVuZHtjbGFzc2Rlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnNtdHBsaWIudGV4IGIvRG9jL2xpYi9saWJzbXRwbGliLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc4NjEwMi4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnNtdHBsaWIudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7c210cGxpYn0gLS0tCi0gICAgICAgICBTTVRQIHByb3RvY29sIGNsaWVudH0KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e3NtdHBsaWJ9Ci1cbW9kdWxlc3lub3BzaXN7U01UUCBwcm90b2NvbCBjbGllbnQgKHJlcXVpcmVzIHNvY2tldHMpLn0KLVxzZWN0aW9uYXV0aG9ye0VyaWMgUy4gUmF5bW9uZH17ZXNyQHNuYXJrLnRoeXJzdXMuY29tfQotCi1caW5kZXhpaXtTTVRQfXtwcm90b2NvbH0KLVxpbmRleHtTaW1wbGUgTWFpbCBUcmFuc2ZlciBQcm90b2NvbH0KLQotVGhlIFxtb2R1bGV7c210cGxpYn0gbW9kdWxlIGRlZmluZXMgYW4gU01UUCBjbGllbnQgc2Vzc2lvbiBvYmplY3QgdGhhdAotY2FuIGJlIHVzZWQgdG8gc2VuZCBtYWlsIHRvIGFueSBJbnRlcm5ldCBtYWNoaW5lIHdpdGggYW4gU01UUCBvciBFU01UUAotbGlzdGVuZXIgZGFlbW9uLiAgRm9yIGRldGFpbHMgb2YgU01UUCBhbmQgRVNNVFAgb3BlcmF0aW9uLCBjb25zdWx0Ci1ccmZjezgyMX0gKFxjaXRldGl0bGV7U2ltcGxlIE1haWwgVHJhbnNmZXIgUHJvdG9jb2x9KSBhbmQgXHJmY3sxODY5fQotKFxjaXRldGl0bGV7U01UUCBTZXJ2aWNlIEV4dGVuc2lvbnN9KS4KLQotXGJlZ2lue2NsYXNzZGVzY317U01UUH17XG9wdGlvbmFse2hvc3Rcb3B0aW9uYWx7LCBwb3J0XG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX2hvc3RuYW1lXG9wdGlvbmFseywgdGltZW91dH19fX19Ci1BIFxjbGFzc3tTTVRQfSBpbnN0YW5jZSBlbmNhcHN1bGF0ZXMgYW4gU01UUCBjb25uZWN0aW9uLiAgSXQgaGFzCi1tZXRob2RzIHRoYXQgc3VwcG9ydCBhIGZ1bGwgcmVwZXJ0b2lyZSBvZiBTTVRQIGFuZCBFU01UUAotb3BlcmF0aW9ucy4gSWYgdGhlIG9wdGlvbmFsIGhvc3QgYW5kIHBvcnQgcGFyYW1ldGVycyBhcmUgZ2l2ZW4sIHRoZQotU01UUCBcbWV0aG9ke2Nvbm5lY3QoKX0gbWV0aG9kIGlzIGNhbGxlZCB3aXRoIHRob3NlIHBhcmFtZXRlcnMgZHVyaW5nCi1pbml0aWFsaXphdGlvbi4gIEFuIFxleGNlcHRpb257U01UUENvbm5lY3RFcnJvcn0gaXMgcmFpc2VkIGlmIHRoZQotc3BlY2lmaWVkIGhvc3QgZG9lc24ndCByZXNwb25kIGNvcnJlY3RseS4KLVRoZSBvcHRpb25hbCBcdmFye3RpbWVvdXR9IHBhcmFtZXRlciBzcGVjaWZpZXMgYSB0aW1lb3V0IGluIHNlY29uZHMgZm9yIHRoZQotY29ubmVjdGlvbiBhdHRlbXB0IChpZiBub3Qgc3BlY2lmaWVkLCBvciBwYXNzZWQgYXMgTm9uZSwgdGhlIGdsb2JhbAotZGVmYXVsdCB0aW1lb3V0IHNldHRpbmcgd2lsbCBiZSB1c2VkKS4KLQotRm9yIG5vcm1hbCB1c2UsIHlvdSBzaG91bGQgb25seSByZXF1aXJlIHRoZSBpbml0aWFsaXphdGlvbi9jb25uZWN0LAotXG1ldGhvZHtzZW5kbWFpbCgpfSwgYW5kIFxtZXRob2R7cXVpdCgpfSBtZXRob2RzLiAgQW4gZXhhbXBsZSBpcwotaW5jbHVkZWQgYmVsb3cuCi0KLVx2ZXJzaW9uY2hhbmdlZFtcdmFye3RpbWVvdXR9IHdhcyBhZGRlZF17Mi42fQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1NNVFBfU1NMfXtcb3B0aW9uYWx7aG9zdFxvcHRpb25hbHssIHBvcnRcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfaG9zdG5hbWVcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAga2V5ZmlsZVxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICBjZXJ0ZmlsZVxvcHRpb25hbHssIHRpbWVvdXR9fX19fX19Ci1BIFxjbGFzc3tTTVRQX1NTTH0gaW5zdGFuY2UgYmVoYXZlcyBleGFjdGx5IHRoZSBzYW1lIGFzIGluc3RhbmNlcyBvZiBcY2xhc3N7U01UUH0uCi1cY2xhc3N7U01UUF9TU0x9IHNob3VsZCBiZSB1c2VkIGZvciBzaXR1YXRpb25zIHdoZXJlIFNTTCBpcyByZXF1aXJlZCBmcm9tIAotdGhlIGJlZ2lubmluZyBvZiB0aGUgY29ubmVjdGlvbiBhbmQgdXNpbmcgXG1ldGhvZHtzdGFydHRscygpfSBpcyBub3QgYXBwcm9wcmlhdGUuCi1JZiBcdmFye2hvc3R9IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBsb2NhbCBob3N0IGlzIHVzZWQuIElmIFx2YXJ7cG9ydH0gaXMKLW9taXR0ZWQsIHRoZSBzdGFuZGFyZCBTTVRQLW92ZXItU1NMIHBvcnQgKDQ2NSkgaXMgdXNlZC4gXHZhcntrZXlmaWxlfSBhbmQgXHZhcntjZXJ0ZmlsZX0KLWFyZSBhbHNvIG9wdGlvbmFsLCBhbmQgY2FuIGNvbnRhaW4gYSBQRU0gZm9ybWF0dGVkIHByaXZhdGUga2V5IGFuZAotY2VydGlmaWNhdGUgY2hhaW4gZmlsZSBmb3IgdGhlIFNTTCBjb25uZWN0aW9uLgotVGhlIG9wdGlvbmFsIFx2YXJ7dGltZW91dH0gcGFyYW1ldGVyIHNwZWNpZmllcyBhIHRpbWVvdXQgaW4gc2Vjb25kcyBmb3IgdGhlCi1jb25uZWN0aW9uIGF0dGVtcHQgKGlmIG5vdCBzcGVjaWZpZWQsIG9yIHBhc3NlZCBhcyBOb25lLCB0aGUgZ2xvYmFsCi1kZWZhdWx0IHRpbWVvdXQgc2V0dGluZyB3aWxsIGJlIHVzZWQpLgotCi1cdmVyc2lvbmNoYW5nZWRbXHZhcnt0aW1lb3V0fSB3YXMgYWRkZWRdezIuNn0KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtMTVRQfXtcb3B0aW9uYWx7aG9zdFxvcHRpb25hbHssIHBvcnRcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfaG9zdG5hbWV9fX19Ci0KLVRoZSBMTVRQIHByb3RvY29sLCB3aGljaCBpcyB2ZXJ5IHNpbWlsYXIgdG8gRVNNVFAsIGlzIGhlYXZpbHkgYmFzZWQKLW9uIHRoZSBzdGFuZGFyZCBTTVRQIGNsaWVudC4gSXQncyBjb21tb24gdG8gdXNlIFVuaXggc29ja2V0cyBmb3IgTE1UUCwKLXNvIG91ciBjb25uZWN0KCkgbWV0aG9kIG11c3Qgc3VwcG9ydCB0aGF0IGFzIHdlbGwgYXMgYSByZWd1bGFyCi1ob3N0OnBvcnQgc2VydmVyLiBUbyBzcGVjaWZ5IGEgVW5peCBzb2NrZXQsIHlvdSBtdXN0IHVzZSBhbiBhYnNvbHV0ZQotcGF0aCBmb3IgXHZhcntob3N0fSwgc3RhcnRpbmcgd2l0aCBhICcvJy4KLQotQXV0aGVudGljYXRpb24gaXMgc3VwcG9ydGVkLCB1c2luZyB0aGUgcmVndWxhciBTTVRQIG1lY2hhbmlzbS4gV2hlbgotdXNpbmcgYSBVbml4IHNvY2tldCwgTE1UUCBnZW5lcmFsbHkgZG9uJ3Qgc3VwcG9ydCBvciByZXF1aXJlIGFueQotYXV0aGVudGljYXRpb24sIGJ1dCB5b3VyIG1pbGVhZ2UgbWlnaHQgdmFyeS4KLQotXHZlcnNpb25hZGRlZHsyLjZ9Ci0KLVxlbmR7Y2xhc3NkZXNjfQotCi1BIG5pY2Ugc2VsZWN0aW9uIG9mIGV4Y2VwdGlvbnMgaXMgZGVmaW5lZCBhcyB3ZWxsOgotCi1cYmVnaW57ZXhjZGVzY317U01UUEV4Y2VwdGlvbn0KLSAgQmFzZSBleGNlcHRpb24gY2xhc3MgZm9yIGFsbCBleGNlcHRpb25zIHJhaXNlZCBieSB0aGlzIG1vZHVsZS4KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e1NNVFBTZXJ2ZXJEaXNjb25uZWN0ZWR9Ci0gIFRoaXMgZXhjZXB0aW9uIGlzIHJhaXNlZCB3aGVuIHRoZSBzZXJ2ZXIgdW5leHBlY3RlZGx5IGRpc2Nvbm5lY3RzLAotICBvciB3aGVuIGFuIGF0dGVtcHQgaXMgbWFkZSB0byB1c2UgdGhlIFxjbGFzc3tTTVRQfSBpbnN0YW5jZSBiZWZvcmUKLSAgY29ubmVjdGluZyBpdCB0byBhIHNlcnZlci4KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e1NNVFBSZXNwb25zZUV4Y2VwdGlvbn0KLSAgQmFzZSBjbGFzcyBmb3IgYWxsIGV4Y2VwdGlvbnMgdGhhdCBpbmNsdWRlIGFuIFNNVFAgZXJyb3IgY29kZS4KLSAgVGhlc2UgZXhjZXB0aW9ucyBhcmUgZ2VuZXJhdGVkIGluIHNvbWUgaW5zdGFuY2VzIHdoZW4gdGhlIFNNVFAKLSAgc2VydmVyIHJldHVybnMgYW4gZXJyb3IgY29kZS4gIFRoZSBlcnJvciBjb2RlIGlzIHN0b3JlZCBpbiB0aGUKLSAgXG1lbWJlcntzbXRwX2NvZGV9IGF0dHJpYnV0ZSBvZiB0aGUgZXJyb3IsIGFuZCB0aGUKLSAgXG1lbWJlcntzbXRwX2Vycm9yfSBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRoZSBlcnJvciBtZXNzYWdlLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317U01UUFNlbmRlclJlZnVzZWR9Ci0gIFNlbmRlciBhZGRyZXNzIHJlZnVzZWQuICBJbiBhZGRpdGlvbiB0byB0aGUgYXR0cmlidXRlcyBzZXQgYnkgb24gYWxsCi0gIFxleGNlcHRpb257U01UUFJlc3BvbnNlRXhjZXB0aW9ufSBleGNlcHRpb25zLCB0aGlzIHNldHMgYHNlbmRlcicgdG8KLSAgdGhlIHN0cmluZyB0aGF0IHRoZSBTTVRQIHNlcnZlciByZWZ1c2VkLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317U01UUFJlY2lwaWVudHNSZWZ1c2VkfQotICBBbGwgcmVjaXBpZW50IGFkZHJlc3NlcyByZWZ1c2VkLiAgVGhlIGVycm9ycyBmb3IgZWFjaCByZWNpcGllbnQgYXJlCi0gIGFjY2Vzc2libGUgdGhyb3VnaCB0aGUgYXR0cmlidXRlIFxtZW1iZXJ7cmVjaXBpZW50c30sIHdoaWNoIGlzIGEKLSAgZGljdGlvbmFyeSBvZiBleGFjdGx5IHRoZSBzYW1lIHNvcnQgYXMgXG1ldGhvZHtTTVRQLnNlbmRtYWlsKCl9Ci0gIHJldHVybnMuCi1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtTTVRQRGF0YUVycm9yfQotICBUaGUgU01UUCBzZXJ2ZXIgcmVmdXNlZCB0byBhY2NlcHQgdGhlIG1lc3NhZ2UgZGF0YS4KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e1NNVFBDb25uZWN0RXJyb3J9Ci0gIEVycm9yIG9jY3VycmVkIGR1cmluZyBlc3RhYmxpc2htZW50IG9mIGEgY29ubmVjdGlvbiAgd2l0aCB0aGUgc2VydmVyLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317U01UUEhlbG9FcnJvcn0KLSAgVGhlIHNlcnZlciByZWZ1c2VkIG91ciBcc2FtcHtIRUxPfSBtZXNzYWdlLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317U01UUEF1dGhlbnRpY2F0aW9uRXJyb3J9Ci0gIFNNVFAgYXV0aGVudGljYXRpb24gd2VudCB3cm9uZy4gIE1vc3QgcHJvYmFibHkgdGhlIHNlcnZlciBkaWRuJ3QgYWNjZXB0Ci0gIHRoZSB1c2VybmFtZS9wYXNzd29yZCBjb21iaW5hdGlvbiBwcm92aWRlZC4KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWVyZmN7ODIxfXtTaW1wbGUgTWFpbCBUcmFuc2ZlciBQcm90b2NvbH17UHJvdG9jb2wgZGVmaW5pdGlvbiBmb3IKLSAgICAgICAgICBTTVRQLiAgVGhpcyBkb2N1bWVudCBjb3ZlcnMgdGhlIG1vZGVsLCBvcGVyYXRpbmcgcHJvY2VkdXJlLAotICAgICAgICAgIGFuZCBwcm90b2NvbCBkZXRhaWxzIGZvciBTTVRQLn0KLSAgXHNlZXJmY3sxODY5fXtTTVRQIFNlcnZpY2UgRXh0ZW5zaW9uc317RGVmaW5pdGlvbiBvZiB0aGUgRVNNVFAKLSAgICAgICAgICBleHRlbnNpb25zIGZvciBTTVRQLiAgVGhpcyBkZXNjcmliZXMgYSBmcmFtZXdvcmsgZm9yCi0gICAgICAgICAgZXh0ZW5kaW5nIFNNVFAgd2l0aCBuZXcgY29tbWFuZHMsIHN1cHBvcnRpbmcgZHluYW1pYwotICAgICAgICAgIGRpc2NvdmVyeSBvZiB0aGUgY29tbWFuZHMgcHJvdmlkZWQgYnkgdGhlIHNlcnZlciwgYW5kCi0gICAgICAgICAgZGVmaW5lcyBhIGZldyBhZGRpdGlvbmFsIGNvbW1hbmRzLn0KLVxlbmR7c2VlYWxzb30KLQotCi1cc3Vic2VjdGlvbntTTVRQIE9iamVjdHMgXGxhYmVse1NNVFAtb2JqZWN0c319Ci0KLUFuIFxjbGFzc3tTTVRQfSBpbnN0YW5jZSBoYXMgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotCi1cYmVnaW57bWV0aG9kZGVzY31bU01UUF17c2V0X2RlYnVnbGV2ZWx9e2xldmVsfQotU2V0IHRoZSBkZWJ1ZyBvdXRwdXQgbGV2ZWwuICBBIHRydWUgdmFsdWUgZm9yIFx2YXJ7bGV2ZWx9IHJlc3VsdHMgaW4KLWRlYnVnIG1lc3NhZ2VzIGZvciBjb25uZWN0aW9uIGFuZCBmb3IgYWxsIG1lc3NhZ2VzIHNlbnQgdG8gYW5kCi1yZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtTTVRQXXtjb25uZWN0fXtcb3B0aW9uYWx7aG9zdFxvcHRpb25hbHssIHBvcnR9fX0KLUNvbm5lY3QgdG8gYSBob3N0IG9uIGEgZ2l2ZW4gcG9ydC4gIFRoZSBkZWZhdWx0cyBhcmUgdG8gY29ubmVjdCB0byB0aGUKLWxvY2FsIGhvc3QgYXQgdGhlIHN0YW5kYXJkIFNNVFAgcG9ydCAoMjUpLgotSWYgdGhlIGhvc3RuYW1lIGVuZHMgd2l0aCBhIGNvbG9uIChcY2hhcmFjdGVyezp9KSBmb2xsb3dlZCBieSBhCi1udW1iZXIsIHRoYXQgc3VmZml4IHdpbGwgYmUgc3RyaXBwZWQgb2ZmIGFuZCB0aGUgbnVtYmVyIGludGVycHJldGVkIGFzCi10aGUgcG9ydCBudW1iZXIgdG8gdXNlLgotVGhpcyBtZXRob2QgaXMgYXV0b21hdGljYWxseSBpbnZva2VkIGJ5IHRoZSBjb25zdHJ1Y3RvciBpZiBhCi1ob3N0IGlzIHNwZWNpZmllZCBkdXJpbmcgaW5zdGFudGlhdGlvbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1NNVFBde2RvY21kfXtjbWQsIFxvcHRpb25hbHssIGFyZ3N0cmluZ319Ci1TZW5kIGEgY29tbWFuZCBcdmFye2NtZH0gdG8gdGhlIHNlcnZlci4gIFRoZSBvcHRpb25hbCBhcmd1bWVudAotXHZhcnthcmdzdHJpbmd9IGlzIHNpbXBseSBjb25jYXRlbmF0ZWQgdG8gdGhlIGNvbW1hbmQsIHNlcGFyYXRlZCBieSBhCi1zcGFjZS4KLQotVGhpcyByZXR1cm5zIGEgMi10dXBsZSBjb21wb3NlZCBvZiBhIG51bWVyaWMgcmVzcG9uc2UgY29kZSBhbmQgdGhlCi1hY3R1YWwgcmVzcG9uc2UgbGluZSAobXVsdGlsaW5lIHJlc3BvbnNlcyBhcmUgam9pbmVkIGludG8gb25lIGxvbmcKLWxpbmUuKQotCi1JbiBub3JtYWwgb3BlcmF0aW9uIGl0IHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IHRvIGNhbGwgdGhpcyBtZXRob2QKLWV4cGxpY2l0bHkuICBJdCBpcyB1c2VkIHRvIGltcGxlbWVudCBvdGhlciBtZXRob2RzIGFuZCBtYXkgYmUgdXNlZnVsCi1mb3IgdGVzdGluZyBwcml2YXRlIGV4dGVuc2lvbnMuCi0KLUlmIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIgaXMgbG9zdCB3aGlsZSB3YWl0aW5nIGZvciB0aGUgcmVwbHksCi1cZXhjZXB0aW9ue1NNVFBTZXJ2ZXJEaXNjb25uZWN0ZWR9IHdpbGwgYmUgcmFpc2VkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bU01UUF17aGVsb317XG9wdGlvbmFse2hvc3RuYW1lfX0KLUlkZW50aWZ5IHlvdXJzZWxmIHRvIHRoZSBTTVRQIHNlcnZlciB1c2luZyBcc2FtcHtIRUxPfS4gIFRoZSBob3N0bmFtZQotYXJndW1lbnQgZGVmYXVsdHMgdG8gdGhlIGZ1bGx5IHF1YWxpZmllZCBkb21haW4gbmFtZSBvZiB0aGUgbG9jYWwKLWhvc3QuCi0KLUluIG5vcm1hbCBvcGVyYXRpb24gaXQgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgdG8gY2FsbCB0aGlzIG1ldGhvZAotZXhwbGljaXRseS4gIEl0IHdpbGwgYmUgaW1wbGljaXRseSBjYWxsZWQgYnkgdGhlIFxtZXRob2R7c2VuZG1haWwoKX0KLXdoZW4gbmVjZXNzYXJ5LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bU01UUF17ZWhsb317XG9wdGlvbmFse2hvc3RuYW1lfX0KLUlkZW50aWZ5IHlvdXJzZWxmIHRvIGFuIEVTTVRQIHNlcnZlciB1c2luZyBcc2FtcHtFSExPfS4gIFRoZSBob3N0bmFtZQotYXJndW1lbnQgZGVmYXVsdHMgdG8gdGhlIGZ1bGx5IHF1YWxpZmllZCBkb21haW4gbmFtZSBvZiB0aGUgbG9jYWwKLWhvc3QuICBFeGFtaW5lIHRoZSByZXNwb25zZSBmb3IgRVNNVFAgb3B0aW9uIGFuZCBzdG9yZSB0aGVtIGZvciB1c2UgYnkKLVxtZXRob2R7aGFzX2V4dG4oKX0uCi0KLVVubGVzcyB5b3Ugd2lzaCB0byB1c2UgXG1ldGhvZHtoYXNfZXh0bigpfSBiZWZvcmUgc2VuZGluZwotbWFpbCwgaXQgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgdG8gY2FsbCB0aGlzIG1ldGhvZCBleHBsaWNpdGx5LiAgSXQKLXdpbGwgYmUgaW1wbGljaXRseSBjYWxsZWQgYnkgXG1ldGhvZHtzZW5kbWFpbCgpfSB3aGVuIG5lY2Vzc2FyeS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1NNVFBde2hhc19leHRufXtuYW1lfQotUmV0dXJuIFxjb25zdGFudHtUcnVlfSBpZiBcdmFye25hbWV9IGlzIGluIHRoZSBzZXQgb2YgU01UUCBzZXJ2aWNlCi1leHRlbnNpb25zIHJldHVybmVkIGJ5IHRoZSBzZXJ2ZXIsIFxjb25zdGFudHtGYWxzZX0gb3RoZXJ3aXNlLgotQ2FzZSBpcyBpZ25vcmVkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bU01UUF17dmVyaWZ5fXthZGRyZXNzfQotQ2hlY2sgdGhlIHZhbGlkaXR5IG9mIGFuIGFkZHJlc3Mgb24gdGhpcyBzZXJ2ZXIgdXNpbmcgU01UUCBcc2FtcHtWUkZZfS4KLVJldHVybnMgYSB0dXBsZSBjb25zaXN0aW5nIG9mIGNvZGUgMjUwIGFuZCBhIGZ1bGwgXHJmY3s4MjJ9IGFkZHJlc3MKLShpbmNsdWRpbmcgaHVtYW4gbmFtZSkgaWYgdGhlIHVzZXIgYWRkcmVzcyBpcyB2YWxpZC4gT3RoZXJ3aXNlIHJldHVybnMKLWFuIFNNVFAgZXJyb3IgY29kZSBvZiA0MDAgb3IgZ3JlYXRlciBhbmQgYW4gZXJyb3Igc3RyaW5nLgotCi1cbm90ZXtNYW55IHNpdGVzIGRpc2FibGUgU01UUCBcc2FtcHtWUkZZfSBpbiBvcmRlciB0byBmb2lsIHNwYW1tZXJzLn0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1NNVFBde2xvZ2lufXt1c2VyLCBwYXNzd29yZH0KLUxvZyBpbiBvbiBhbiBTTVRQIHNlcnZlciB0aGF0IHJlcXVpcmVzIGF1dGhlbnRpY2F0aW9uLgotVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHVzZXJuYW1lIGFuZCB0aGUgcGFzc3dvcmQgdG8gYXV0aGVudGljYXRlIHdpdGguCi1JZiB0aGVyZSBoYXMgYmVlbiBubyBwcmV2aW91cyBcc2FtcHtFSExPfSBvciBcc2FtcHtIRUxPfSBjb21tYW5kIHRoaXMKLXNlc3Npb24sIHRoaXMgbWV0aG9kIHRyaWVzIEVTTVRQIFxzYW1we0VITE99IGZpcnN0LgotVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gbm9ybWFsbHkgaWYgdGhlIGF1dGhlbnRpY2F0aW9uIHdhcyBzdWNjZXNzZnVsLAotb3IgbWF5IHJhaXNlIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uczoKLQotXGJlZ2lue2Rlc2NyaXB0aW9ufQotICBcaXRlbVtcZXhjZXB0aW9ue1NNVFBIZWxvRXJyb3J9XQotICAgIFRoZSBzZXJ2ZXIgZGlkbid0IHJlcGx5IHByb3Blcmx5IHRvIHRoZSBcc2FtcHtIRUxPfSBncmVldGluZy4KLSAgXGl0ZW1bXGV4Y2VwdGlvbntTTVRQQXV0aGVudGljYXRpb25FcnJvcn1dCi0gICAgVGhlIHNlcnZlciBkaWRuJ3QgYWNjZXB0IHRoZSB1c2VybmFtZS9wYXNzd29yZCBjb21iaW5hdGlvbi4KLSAgXGl0ZW1bXGV4Y2VwdGlvbntTTVRQRXhjZXB0aW9ufV0KLSAgICBObyBzdWl0YWJsZSBhdXRoZW50aWNhdGlvbiBtZXRob2Qgd2FzIGZvdW5kLgotXGVuZHtkZXNjcmlwdGlvbn0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1NNVFBde3N0YXJ0dGxzfXtcb3B0aW9uYWx7a2V5ZmlsZVxvcHRpb25hbHssIGNlcnRmaWxlfX19Ci1QdXQgdGhlIFNNVFAgY29ubmVjdGlvbiBpbiBUTFMgKFRyYW5zcG9ydCBMYXllciBTZWN1cml0eSkgbW9kZS4gIEFsbAotU01UUCBjb21tYW5kcyB0aGF0IGZvbGxvdyB3aWxsIGJlIGVuY3J5cHRlZC4gIFlvdSBzaG91bGQgdGhlbiBjYWxsCi1cbWV0aG9ke2VobG8oKX0gYWdhaW4uCi0KLUlmIFx2YXJ7a2V5ZmlsZX0gYW5kIFx2YXJ7Y2VydGZpbGV9IGFyZSBwcm92aWRlZCwgdGhlc2UgYXJlIHBhc3NlZCB0bwotdGhlIFxyZWZtb2R1bGV7c29ja2V0fSBtb2R1bGUncyBcZnVuY3Rpb257c3NsKCl9IGZ1bmN0aW9uLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bU01UUF17c2VuZG1haWx9e2Zyb21fYWRkciwgdG9fYWRkcnMsIG1zZ1xvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haWxfb3B0aW9ucywgcmNwdF9vcHRpb25zfX0KLVNlbmQgbWFpbC4gIFRoZSByZXF1aXJlZCBhcmd1bWVudHMgYXJlIGFuIFxyZmN7ODIyfSBmcm9tLWFkZHJlc3MKLXN0cmluZywgYSBsaXN0IG9mIFxyZmN7ODIyfSB0by1hZGRyZXNzIHN0cmluZ3MgKGEgYmFyZSBzdHJpbmcgd2lsbCBiZQotdHJlYXRlZCBhcyBhIGxpc3Qgd2l0aCAxIGFkZHJlc3MpLCBhbmQgYSBtZXNzYWdlIHN0cmluZy4gIFRoZSBjYWxsZXIKLW1heSBwYXNzIGEgbGlzdCBvZiBFU01UUCBvcHRpb25zIChzdWNoIGFzIFxzYW1wezhiaXRtaW1lfSkgdG8gYmUgdXNlZAotaW4gXHNhbXB7TUFJTCBGUk9NfSBjb21tYW5kcyBhcyBcdmFye21haWxfb3B0aW9uc30uICBFU01UUCBvcHRpb25zCi0oc3VjaCBhcyBcc2FtcHtEU059IGNvbW1hbmRzKSB0aGF0IHNob3VsZCBiZSB1c2VkIHdpdGggYWxsIFxzYW1we1JDUFR9Ci1jb21tYW5kcyBjYW4gYmUgcGFzc2VkIGFzIFx2YXJ7cmNwdF9vcHRpb25zfS4gIChJZiB5b3UgbmVlZCB0byB1c2UKLWRpZmZlcmVudCBFU01UUCBvcHRpb25zIHRvIGRpZmZlcmVudCByZWNpcGllbnRzIHlvdSBoYXZlIHRvIHVzZSB0aGUKLWxvdy1sZXZlbCBtZXRob2RzIHN1Y2ggYXMgXG1ldGhvZHttYWlsfSwgXG1ldGhvZHtyY3B0fSBhbmQKLVxtZXRob2R7ZGF0YX0gdG8gc2VuZCB0aGUgbWVzc2FnZS4pCi0KLVxub3Rle1RoZSBcdmFye2Zyb21fYWRkcn0gYW5kIFx2YXJ7dG9fYWRkcnN9IHBhcmFtZXRlcnMgYXJlCi11c2VkIHRvIGNvbnN0cnVjdCB0aGUgbWVzc2FnZSBlbnZlbG9wZSB1c2VkIGJ5IHRoZSB0cmFuc3BvcnQgYWdlbnRzLgotVGhlIFxjbGFzc3tTTVRQfSBkb2VzIG5vdCBtb2RpZnkgdGhlIG1lc3NhZ2UgaGVhZGVycyBpbiBhbnkgd2F5Ln0KLQotSWYgdGhlcmUgaGFzIGJlZW4gbm8gcHJldmlvdXMgXHNhbXB7RUhMT30gb3IgXHNhbXB7SEVMT30gY29tbWFuZCB0aGlzCi1zZXNzaW9uLCB0aGlzIG1ldGhvZCB0cmllcyBFU01UUCBcc2FtcHtFSExPfSBmaXJzdC4gSWYgdGhlIHNlcnZlciBkb2VzCi1FU01UUCwgbWVzc2FnZSBzaXplIGFuZCBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgb3B0aW9ucyB3aWxsIGJlIHBhc3NlZAotdG8gaXQgKGlmIHRoZSBvcHRpb24gaXMgaW4gdGhlIGZlYXR1cmUgc2V0IHRoZSBzZXJ2ZXIgYWR2ZXJ0aXNlcykuICBJZgotXHNhbXB7RUhMT30gZmFpbHMsIFxzYW1we0hFTE99IHdpbGwgYmUgdHJpZWQgYW5kIEVTTVRQIG9wdGlvbnMKLXN1cHByZXNzZWQuCi0KLVRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIG5vcm1hbGx5IGlmIHRoZSBtYWlsIGlzIGFjY2VwdGVkIGZvciBhdCBsZWFzdAotb25lIHJlY2lwaWVudC4gT3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLiAgVGhhdCBpcywgaWYgdGhpcwotbWV0aG9kIGRvZXMgbm90IHRocm93IGFuIGV4Y2VwdGlvbiwgdGhlbiBzb21lb25lIHNob3VsZCBnZXQgeW91ciBtYWlsLgotSWYgdGhpcyBtZXRob2QgZG9lcyBub3QgdGhyb3cgYW4gZXhjZXB0aW9uLCBpdCByZXR1cm5zIGEgZGljdGlvbmFyeSwKLXdpdGggb25lIGVudHJ5IGZvciBlYWNoIHJlY2lwaWVudCB0aGF0IHdhcyByZWZ1c2VkLiAgRWFjaCBlbnRyeQotY29udGFpbnMgYSB0dXBsZSBvZiB0aGUgU01UUCBlcnJvciBjb2RlIGFuZCB0aGUgYWNjb21wYW55aW5nIGVycm9yCi1tZXNzYWdlIHNlbnQgYnkgdGhlIHNlcnZlci4KLQotVGhpcyBtZXRob2QgbWF5IHJhaXNlIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uczoKLQotXGJlZ2lue2Rlc2NyaXB0aW9ufQotXGl0ZW1bXGV4Y2VwdGlvbntTTVRQUmVjaXBpZW50c1JlZnVzZWR9XQotQWxsIHJlY2lwaWVudHMgd2VyZSByZWZ1c2VkLiAgTm9ib2R5IGdvdCB0aGUgbWFpbC4gIFRoZQotXG1lbWJlcntyZWNpcGllbnRzfSBhdHRyaWJ1dGUgb2YgdGhlIGV4Y2VwdGlvbiBvYmplY3QgaXMgYSBkaWN0aW9uYXJ5Ci13aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWZ1c2VkIHJlY2lwaWVudHMgKGxpa2UgdGhlIG9uZSByZXR1cm5lZAotd2hlbiBhdCBsZWFzdCBvbmUgcmVjaXBpZW50IHdhcyBhY2NlcHRlZCkuCi0KLVxpdGVtW1xleGNlcHRpb257U01UUEhlbG9FcnJvcn1dCi1UaGUgc2VydmVyIGRpZG4ndCByZXBseSBwcm9wZXJseSB0byB0aGUgXHNhbXB7SEVMT30gZ3JlZXRpbmcuCi0KLVxpdGVtW1xleGNlcHRpb257U01UUFNlbmRlclJlZnVzZWR9XQotVGhlIHNlcnZlciBkaWRuJ3QgYWNjZXB0IHRoZSBcdmFye2Zyb21fYWRkcn0uCi0KLVxpdGVtW1xleGNlcHRpb257U01UUERhdGFFcnJvcn1dCi1UaGUgc2VydmVyIHJlcGxpZWQgd2l0aCBhbiB1bmV4cGVjdGVkIGVycm9yIGNvZGUgKG90aGVyIHRoYW4gYSByZWZ1c2FsCi1vZiBhIHJlY2lwaWVudCkuCi1cZW5ke2Rlc2NyaXB0aW9ufQotCi1Vbmxlc3Mgb3RoZXJ3aXNlIG5vdGVkLCB0aGUgY29ubmVjdGlvbiB3aWxsIGJlIG9wZW4gZXZlbiBhZnRlcgotYW4gZXhjZXB0aW9uIGlzIHJhaXNlZC4KLQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bU01UUF17cXVpdH17fQotVGVybWluYXRlIHRoZSBTTVRQIHNlc3Npb24gYW5kIGNsb3NlIHRoZSBjb25uZWN0aW9uLgotXGVuZHttZXRob2RkZXNjfQotCi1Mb3ctbGV2ZWwgbWV0aG9kcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdGFuZGFyZCBTTVRQL0VTTVRQIGNvbW1hbmRzCi1cc2FtcHtIRUxQfSwgXHNhbXB7UlNFVH0sIFxzYW1we05PT1B9LCBcc2FtcHtNQUlMfSwgXHNhbXB7UkNQVH0sIGFuZAotXHNhbXB7REFUQX0gYXJlIGFsc28gc3VwcG9ydGVkLiAgTm9ybWFsbHkgdGhlc2UgZG8gbm90IG5lZWQgdG8gYmUKLWNhbGxlZCBkaXJlY3RseSwgc28gdGhleSBhcmUgbm90IGRvY3VtZW50ZWQgaGVyZS4gIEZvciBkZXRhaWxzLAotY29uc3VsdCB0aGUgbW9kdWxlIGNvZGUuCi0KLQotXHN1YnNlY3Rpb257U01UUCBFeGFtcGxlIFxsYWJlbHtTTVRQLWV4YW1wbGV9fQotCi1UaGlzIGV4YW1wbGUgcHJvbXB0cyB0aGUgdXNlciBmb3IgYWRkcmVzc2VzIG5lZWRlZCBpbiB0aGUgbWVzc2FnZQotZW52ZWxvcGUgKGBUbycgYW5kIGBGcm9tJyBhZGRyZXNzZXMpLCBhbmQgdGhlIG1lc3NhZ2UgdG8gYmUKLWRlbGl2ZXJlZC4gIE5vdGUgdGhhdCB0aGUgaGVhZGVycyB0byBiZSBpbmNsdWRlZCB3aXRoIHRoZSBtZXNzYWdlIG11c3QKLWJlIGluY2x1ZGVkIGluIHRoZSBtZXNzYWdlIGFzIGVudGVyZWQ7IHRoaXMgZXhhbXBsZSBkb2Vzbid0IGRvIGFueQotcHJvY2Vzc2luZyBvZiB0aGUgXHJmY3s4MjJ9IGhlYWRlcnMuICBJbiBwYXJ0aWN1bGFyLCB0aGUgYFRvJyBhbmQKLWBGcm9tJyBhZGRyZXNzZXMgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgbWVzc2FnZSBoZWFkZXJzIGV4cGxpY2l0bHkuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCBzbXRwbGliCi0KLWRlZiByYXdfaW5wdXQocHJvbXB0KToKLSAgICBpbXBvcnQgc3lzCi0gICAgc3lzLnN0ZG91dC53cml0ZShwcm9tcHQpCi0gICAgc3lzLnN0ZG91dC5mbHVzaCgpCi0gICAgcmV0dXJuIHN5cy5zdGRpbi5yZWFkbGluZSgpCi0KLWRlZiBwcm9tcHQocHJvbXB0KToKLSAgICByZXR1cm4gcmF3X2lucHV0KHByb21wdCkuc3RyaXAoKQotCi1mcm9tYWRkciA9IHByb21wdCgiRnJvbTogIikKLXRvYWRkcnMgID0gcHJvbXB0KCJUbzogIikuc3BsaXQoKQotcHJpbnQgIkVudGVyIG1lc3NhZ2UsIGVuZCB3aXRoIF5EIChVbml4KSBvciBeWiAoV2luZG93cyk6IgotCi0jIEFkZCB0aGUgRnJvbTogYW5kIFRvOiBoZWFkZXJzIGF0IHRoZSBzdGFydCEKLW1zZyA9ICgiRnJvbTogJXNcclxuVG86ICVzXHJcblxyXG4iCi0gICAgICAgJSAoZnJvbWFkZHIsICIsICIuam9pbih0b2FkZHJzKSkpCi13aGlsZSAxOgotICAgIHRyeToKLSAgICAgICAgbGluZSA9IHJhd19pbnB1dCgpCi0gICAgZXhjZXB0IEVPRkVycm9yOgotICAgICAgICBicmVhawotICAgIGlmIG5vdCBsaW5lOgotICAgICAgICBicmVhawotICAgIG1zZyA9IG1zZyArIGxpbmUKLQotcHJpbnQgIk1lc3NhZ2UgbGVuZ3RoIGlzICIgKyByZXByKGxlbihtc2cpKQotCi1zZXJ2ZXIgPSBzbXRwbGliLlNNVFAoJ2xvY2FsaG9zdCcpCi1zZXJ2ZXIuc2V0X2RlYnVnbGV2ZWwoMSkKLXNlcnZlci5zZW5kbWFpbChmcm9tYWRkciwgdG9hZGRycywgbXNnKQotc2VydmVyLnF1aXQoKQotXGVuZHt2ZXJiYXRpbX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic25kaGRyLnRleCBiL0RvYy9saWIvbGlic25kaGRyLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdmOGM2ZS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnNuZGhkci50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3NuZGhkcn0gLS0tCi0gICAgICAgICBEZXRlcm1pbmUgdHlwZSBvZiBzb3VuZCBmaWxlfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17c25kaGRyfQotXG1vZHVsZXN5bm9wc2lze0RldGVybWluZSB0eXBlIG9mIGEgc291bmQgZmlsZS59Ci1cc2VjdGlvbmF1dGhvcntGcmVkIEwuIERyYWtlLCBKci59e2ZkcmFrZUBhY20ub3JnfQotJSBCYXNlZCBvbiBjb21tZW50cyBpbiB0aGUgbW9kdWxlIHNvdXJjZSBmaWxlLgotCi0KLVRoZSBcbW9kdWxle3NuZGhkcn0gcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgd2hpY2ggYXR0ZW1wdCB0bwotZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIHNvdW5kIGRhdGEgd2hpY2ggaXMgaW4gYSBmaWxlLiAgV2hlbiB0aGVzZQotZnVuY3Rpb25zIGFyZSBhYmxlIHRvIGRldGVybWluZSB3aGF0IHR5cGUgb2Ygc291bmQgZGF0YSBpcyBzdG9yZWQgaW4gYQotZmlsZSwgdGhleSByZXR1cm4gYSB0dXBsZSBcY29kZXsoXHZhcnt0eXBlfSwgXHZhcntzYW1wbGluZ19yYXRlfSwKLVx2YXJ7Y2hhbm5lbHN9LCBcdmFye2ZyYW1lc30sIFx2YXJ7Yml0c19wZXJfc2FtcGxlfSl9LiAgVGhlIHZhbHVlIGZvcgotXHZhcnt0eXBlfSBpbmRpY2F0ZXMgdGhlIGRhdGEgdHlwZSBhbmQgd2lsbCBiZSBvbmUgb2YgdGhlIHN0cmluZ3MKLVxjb2RleydhaWZjJ30sIFxjb2RleydhaWZmJ30sIFxjb2RleydhdSd9LCBcY29kZXsnaGNvbSd9LAotXGNvZGV7J3NuZHInfSwgXGNvZGV7J3NuZHQnfSwgXGNvZGV7J3ZvYyd9LCBcY29kZXsnd2F2J30sCi1cY29kZXsnOHN2eCd9LCBcY29kZXsnc2InfSwgXGNvZGV7J3ViJ30sIG9yIFxjb2Rleyd1bCd9LiAgVGhlCi1cdmFye3NhbXBsaW5nX3JhdGV9IHdpbGwgYmUgZWl0aGVyIHRoZSBhY3R1YWwgdmFsdWUgb3IgXGNvZGV7MH0gaWYKLXVua25vd24gb3IgZGlmZmljdWx0IHRvIGRlY29kZS4gIFNpbWlsYXJseSwgXHZhcntjaGFubmVsc30gd2lsbCBiZQotZWl0aGVyIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgb3IgXGNvZGV7MH0gaWYgaXQgY2Fubm90IGJlIGRldGVybWluZWQKLW9yIGlmIHRoZSB2YWx1ZSBpcyBkaWZmaWN1bHQgdG8gZGVjb2RlLiAgVGhlIHZhbHVlIGZvciBcdmFye2ZyYW1lc30KLXdpbGwgYmUgZWl0aGVyIHRoZSBudW1iZXIgb2YgZnJhbWVzIG9yIFxjb2Rley0xfS4gIFRoZSBsYXN0IGl0ZW0gaW4KLXRoZSB0dXBsZSwgXHZhcntiaXRzX3Blcl9zYW1wbGV9LCB3aWxsIGVpdGhlciBiZSB0aGUgc2FtcGxlIHNpemUgaW4KLWJpdHMgb3IgXGNvZGV7J0EnfSBmb3IgQS1MQVdcaW5kZXh7QS1MQVd9IG9yIFxjb2RleydVJ30gZm9yCi11LUxBV1xpbmRleHt1LUxBV30uCi0KLQotXGJlZ2lue2Z1bmNkZXNjfXt3aGF0fXtmaWxlbmFtZX0KLSAgRGV0ZXJtaW5lcyB0aGUgdHlwZSBvZiBzb3VuZCBkYXRhIHN0b3JlZCBpbiB0aGUgZmlsZSBcdmFye2ZpbGVuYW1lfQotICB1c2luZyBcZnVuY3Rpb257d2hhdGhkcigpfS4gIElmIGl0IHN1Y2NlZWRzLCByZXR1cm5zIGEgdHVwbGUgYXMKLSAgZGVzY3JpYmVkIGFib3ZlLCBvdGhlcndpc2UgXGNvZGV7Tm9uZX0gaXMgcmV0dXJuZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi0KLVxiZWdpbntmdW5jZGVzY317d2hhdGhkcn17ZmlsZW5hbWV9Ci0gIERldGVybWluZXMgdGhlIHR5cGUgb2Ygc291bmQgZGF0YSBzdG9yZWQgaW4gYSBmaWxlIGJhc2VkIG9uIHRoZSBmaWxlIAotICBoZWFkZXIuICBUaGUgbmFtZSBvZiB0aGUgZmlsZSBpcyBnaXZlbiBieSBcdmFye2ZpbGVuYW1lfS4gIFRoaXMKLSAgZnVuY3Rpb24gcmV0dXJucyBhIHR1cGxlIGFzIGRlc2NyaWJlZCBhYm92ZSBvbiBzdWNjZXNzLCBvcgotICBcY29kZXtOb25lfS4KLVxlbmR7ZnVuY2Rlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnNvY2tldC50ZXggYi9Eb2MvbGliL2xpYnNvY2tldC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZmNlMjMuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJzb2NrZXQudGV4CisrKyAvZGV2L251bGwKQEAgLTEsOTIxICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7c29ja2V0fSAtLS0KLSAgICAgICAgIExvdy1sZXZlbCBuZXR3b3JraW5nIGludGVyZmFjZX0KLQotXGRlY2xhcmVtb2R1bGV7YnVpbHRpbn17c29ja2V0fQotXG1vZHVsZXN5bm9wc2lze0xvdy1sZXZlbCBuZXR3b3JraW5nIGludGVyZmFjZS59Ci0KLQotVGhpcyBtb2R1bGUgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBCU0QgXGVtcGh7c29ja2V0fSBpbnRlcmZhY2UuCi1JdCBpcyBhdmFpbGFibGUgb24gYWxsIG1vZGVybiBcVU5JWHt9IHN5c3RlbXMsIFdpbmRvd3MsIE1hY09TLCBCZU9TLAotT1MvMiwgYW5kIHByb2JhYmx5IGFkZGl0aW9uYWwgcGxhdGZvcm1zLiAgXG5vdGV7U29tZSBiZWhhdmlvciBtYXkgYmUKLXBsYXRmb3JtIGRlcGVuZGVudCwgc2luY2UgY2FsbHMgYXJlIG1hZGUgdG8gdGhlIG9wZXJhdGluZyBzeXN0ZW0gc29ja2V0IEFQSXMufQotCi1Gb3IgYW4gaW50cm9kdWN0aW9uIHRvIHNvY2tldCBwcm9ncmFtbWluZyAoaW4gQyksIHNlZSB0aGUgZm9sbG93aW5nCi1wYXBlcnM6IFxjaXRldGl0bGV7QW4gSW50cm9kdWN0b3J5IDQuM0JTRCBJbnRlcnByb2Nlc3MgQ29tbXVuaWNhdGlvbgotVHV0b3JpYWx9LCBieSBTdHVhcnQgU2VjaHJlc3QgYW5kIFxjaXRldGl0bGV7QW4gQWR2YW5jZWQgNC4zQlNECi1JbnRlcnByb2Nlc3MgQ29tbXVuaWNhdGlvbiBUdXRvcmlhbH0sIGJ5IFNhbXVlbCBKLiAgTGVmZmxlciBldCBhbCwKLWJvdGggaW4gdGhlIFxjaXRldGl0bGV7VU5JWCBQcm9ncmFtbWVyJ3MgTWFudWFsLCBTdXBwbGVtZW50YXJ5IERvY3VtZW50cyAxfQotKHNlY3Rpb25zIFBTMTo3IGFuZCBQUzE6OCkuICBUaGUgcGxhdGZvcm0tc3BlY2lmaWMgcmVmZXJlbmNlIG1hdGVyaWFsCi1mb3IgdGhlIHZhcmlvdXMgc29ja2V0LXJlbGF0ZWQgc3lzdGVtIGNhbGxzIGFyZSBhbHNvIGEgdmFsdWFibGUgc291cmNlCi1vZiBpbmZvcm1hdGlvbiBvbiB0aGUgZGV0YWlscyBvZiBzb2NrZXQgc2VtYW50aWNzLiAgRm9yIFxVTklYLCByZWZlcgotdG8gdGhlIG1hbnVhbCBwYWdlczsgZm9yIFdpbmRvd3MsIHNlZSB0aGUgV2luU29jayAob3IgV2luc29jayAyKQotc3BlY2lmaWNhdGlvbi4KLUZvciBJUHY2LXJlYWR5IEFQSXMsIHJlYWRlcnMgbWF5IHdhbnQgdG8gcmVmZXIgdG8gXHJmY3syNTUzfSB0aXRsZWQKLVxjaXRldGl0bGV7QmFzaWMgU29ja2V0IEludGVyZmFjZSBFeHRlbnNpb25zIGZvciBJUHY2fS4KLQotVGhlIFB5dGhvbiBpbnRlcmZhY2UgaXMgYSBzdHJhaWdodGZvcndhcmQgdHJhbnNsaXRlcmF0aW9uIG9mIHRoZQotXFVOSVh7fSBzeXN0ZW0gY2FsbCBhbmQgbGlicmFyeSBpbnRlcmZhY2UgZm9yIHNvY2tldHMgdG8gUHl0aG9uJ3MKLW9iamVjdC1vcmllbnRlZCBzdHlsZTogdGhlIFxmdW5jdGlvbntzb2NrZXQoKX0gZnVuY3Rpb24gcmV0dXJucyBhCi1cZGZue3NvY2tldCBvYmplY3R9XG9iaW5kZXh7c29ja2V0fSB3aG9zZSBtZXRob2RzIGltcGxlbWVudCB0aGUKLXZhcmlvdXMgc29ja2V0IHN5c3RlbSBjYWxscy4gIFBhcmFtZXRlciB0eXBlcyBhcmUgc29tZXdoYXQKLWhpZ2hlci1sZXZlbCB0aGFuIGluIHRoZSBDIGludGVyZmFjZTogYXMgd2l0aCBcbWV0aG9ke3JlYWQoKX0gYW5kCi1cbWV0aG9ke3dyaXRlKCl9IG9wZXJhdGlvbnMgb24gUHl0aG9uIGZpbGVzLCBidWZmZXIgYWxsb2NhdGlvbiBvbgotcmVjZWl2ZSBvcGVyYXRpb25zIGlzIGF1dG9tYXRpYywgYW5kIGJ1ZmZlciBsZW5ndGggaXMgaW1wbGljaXQgb24gc2VuZAotb3BlcmF0aW9ucy4KLQotU29ja2V0IGFkZHJlc3NlcyBhcmUgcmVwcmVzZW50ZWQgYXMgZm9sbG93czoKLUEgc2luZ2xlIHN0cmluZyBpcyB1c2VkIGZvciB0aGUgXGNvbnN0YW50e0FGX1VOSVh9IGFkZHJlc3MgZmFtaWx5LgotQSBwYWlyIFxjb2RleyhcdmFye2hvc3R9LCBcdmFye3BvcnR9KX0gaXMgdXNlZCBmb3IgdGhlCi1cY29uc3RhbnR7QUZfSU5FVH0gYWRkcmVzcyBmYW1pbHksIHdoZXJlIFx2YXJ7aG9zdH0gaXMgYSBzdHJpbmcKLXJlcHJlc2VudGluZyBlaXRoZXIgYSBob3N0bmFtZSBpbiBJbnRlcm5ldCBkb21haW4gbm90YXRpb24gbGlrZQotXGNvZGV7J2RhcmluZy5jd2kubmwnfSBvciBhbiBJUHY0IGFkZHJlc3MgbGlrZSBcY29kZXsnMTAwLjUwLjIwMC41J30sCi1hbmQgXHZhcntwb3J0fSBpcyBhbiBpbnRlZ3JhbCBwb3J0IG51bWJlci4KLUZvciBcY29uc3RhbnR7QUZfSU5FVDZ9IGFkZHJlc3MgZmFtaWx5LCBhIGZvdXItdHVwbGUKLVxjb2RleyhcdmFye2hvc3R9LCBcdmFye3BvcnR9LCBcdmFye2Zsb3dpbmZvfSwgXHZhcntzY29wZWlkfSl9IGlzCi11c2VkLCB3aGVyZSBcdmFye2Zsb3dpbmZvfSBhbmQgXHZhcntzY29wZWlkfSByZXByZXNlbnRzCi1cY29kZXtzaW42X2Zsb3dpbmZvfSBhbmQgXGNvZGV7c2luNl9zY29wZV9pZH0gbWVtYmVyIGluCi1cY29uc3RhbnR7c3RydWN0IHNvY2thZGRyX2luNn0gaW4gQy4KLUZvciBcbW9kdWxle3NvY2tldH0gbW9kdWxlIG1ldGhvZHMsIFx2YXJ7Zmxvd2luZm99IGFuZCBcdmFye3Njb3BlaWR9Ci1jYW4gYmUgb21pdHRlZCBqdXN0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBOb3RlLCBob3dldmVyLAotb21pc3Npb24gb2YgXHZhcntzY29wZWlkfSBjYW4gY2F1c2UgcHJvYmxlbXMgaW4gbWFuaXB1bGF0aW5nIHNjb3BlZAotSVB2NiBhZGRyZXNzZXMuIE90aGVyIGFkZHJlc3MgZmFtaWxpZXMgYXJlIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLgotVGhlIGFkZHJlc3MgZm9ybWF0IHJlcXVpcmVkIGJ5IGEgcGFydGljdWxhciBzb2NrZXQgb2JqZWN0IGlzCi1hdXRvbWF0aWNhbGx5IHNlbGVjdGVkIGJhc2VkIG9uIHRoZSBhZGRyZXNzIGZhbWlseSBzcGVjaWZpZWQgd2hlbiB0aGUKLXNvY2tldCBvYmplY3Qgd2FzIGNyZWF0ZWQuCi0KLUZvciBJUHY0IGFkZHJlc3NlcywgdHdvIHNwZWNpYWwgZm9ybXMgYXJlIGFjY2VwdGVkIGluc3RlYWQgb2YgYSBob3N0Ci1hZGRyZXNzOiB0aGUgZW1wdHkgc3RyaW5nIHJlcHJlc2VudHMgXGNvbnN0YW50e0lOQUREUl9BTll9LCBhbmQgdGhlIHN0cmluZwotXGNvZGV7Jzxicm9hZGNhc3Q+J30gcmVwcmVzZW50cyBcY29uc3RhbnR7SU5BRERSX0JST0FEQ0FTVH0uCi1UaGUgYmVoYXZpb3IgaXMgbm90IGF2YWlsYWJsZSBmb3IgSVB2NiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwKLXRoZXJlZm9yZSwgeW91IG1heSB3YW50IHRvIGF2b2lkIHRoZXNlIGlmIHlvdSBpbnRlbmQgdG8gc3VwcG9ydCBJUHY2IHdpdGgKLXlvdXIgUHl0aG9uIHByb2dyYW1zLgotCi1JZiB5b3UgdXNlIGEgaG9zdG5hbWUgaW4gdGhlIFx2YXJ7aG9zdH0gcG9ydGlvbiBvZiBJUHY0L3Y2IHNvY2tldAotYWRkcmVzcywgdGhlIHByb2dyYW0gbWF5IHNob3cgYSBub25kZXRlcm1pbmlzdGljIGJlaGF2aW9yLCBhcyBQeXRob24KLXVzZXMgdGhlIGZpcnN0IGFkZHJlc3MgcmV0dXJuZWQgZnJvbSB0aGUgRE5TIHJlc29sdXRpb24uICBUaGUgc29ja2V0Ci1hZGRyZXNzIHdpbGwgYmUgcmVzb2x2ZWQgZGlmZmVyZW50bHkgaW50byBhbiBhY3R1YWwgSVB2NC92NiBhZGRyZXNzLAotZGVwZW5kaW5nIG9uIHRoZSByZXN1bHRzIGZyb20gRE5TIHJlc29sdXRpb24gYW5kL29yIHRoZSBob3N0Ci1jb25maWd1cmF0aW9uLiAgRm9yIGRldGVybWluaXN0aWMgYmVoYXZpb3IgdXNlIGEgbnVtZXJpYyBhZGRyZXNzIGluCi1cdmFye2hvc3R9IHBvcnRpb24uCi0KLVx2ZXJzaW9uYWRkZWRbQUZfTkVUTElOSyBzb2NrZXRzIGFyZSByZXByZXNlbnRlZCBhcyAKLXBhaXJzIFxjb2Rle1x2YXJ7cGlkfSwgXHZhcntncm91cHN9fV17Mi41fQotCi1BbGwgZXJyb3JzIHJhaXNlIGV4Y2VwdGlvbnMuICBUaGUgbm9ybWFsIGV4Y2VwdGlvbnMgZm9yIGludmFsaWQKLWFyZ3VtZW50IHR5cGVzIGFuZCBvdXQtb2YtbWVtb3J5IGNvbmRpdGlvbnMgY2FuIGJlIHJhaXNlZDsgZXJyb3JzCi1yZWxhdGVkIHRvIHNvY2tldCBvciBhZGRyZXNzIHNlbWFudGljcyByYWlzZSB0aGUgZXJyb3IKLVxleGNlcHRpb257c29ja2V0LmVycm9yfS4KLQotTm9uLWJsb2NraW5nIG1vZGUgaXMgc3VwcG9ydGVkIHRocm91Z2gKLVxtZXRob2R7c2V0YmxvY2tpbmcoKX0uICBBIGdlbmVyYWxpemF0aW9uIG9mIHRoaXMgYmFzZWQgb24gdGltZW91dHMKLWlzIHN1cHBvcnRlZCB0aHJvdWdoIFxtZXRob2R7c2V0dGltZW91dCgpfS4KLQotVGhlIG1vZHVsZSBcbW9kdWxle3NvY2tldH0gZXhwb3J0cyB0aGUgZm9sbG93aW5nIGNvbnN0YW50cyBhbmQgZnVuY3Rpb25zOgotCi0KLVxiZWdpbntleGNkZXNjfXtlcnJvcn0KLVRoaXMgZXhjZXB0aW9uIGlzIHJhaXNlZCBmb3Igc29ja2V0LXJlbGF0ZWQgZXJyb3JzLgotVGhlIGFjY29tcGFueWluZyB2YWx1ZSBpcyBlaXRoZXIgYSBzdHJpbmcgdGVsbGluZyB3aGF0IHdlbnQgd3Jvbmcgb3IgYQotcGFpciBcY29kZXsoXHZhcntlcnJub30sIFx2YXJ7c3RyaW5nfSl9Ci1yZXByZXNlbnRpbmcgYW4gZXJyb3IgcmV0dXJuZWQgYnkgYSBzeXN0ZW0KLWNhbGwsIHNpbWlsYXIgdG8gdGhlIHZhbHVlIGFjY29tcGFueWluZyBcZXhjZXB0aW9ue29zLmVycm9yfS4KLVNlZSB0aGUgbW9kdWxlIFxyZWZtb2R1bGV7ZXJybm99XHJlZmJpbW9kaW5kZXh7ZXJybm99LCB3aGljaCBjb250YWlucwotbmFtZXMgZm9yIHRoZSBlcnJvciBjb2RlcyBkZWZpbmVkIGJ5IHRoZSB1bmRlcmx5aW5nIG9wZXJhdGluZyBzeXN0ZW0uCi1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtoZXJyb3J9Ci1UaGlzIGV4Y2VwdGlvbiBpcyByYWlzZWQgZm9yIGFkZHJlc3MtcmVsYXRlZCBlcnJvcnMsIGkuZS4gZm9yCi1mdW5jdGlvbnMgdGhhdCB1c2UgXHZhcntoX2Vycm5vfSBpbiB0aGUgQyBBUEksIGluY2x1ZGluZwotXGZ1bmN0aW9ue2dldGhvc3RieW5hbWVfZXgoKX0gYW5kIFxmdW5jdGlvbntnZXRob3N0YnlhZGRyKCl9LgotCi1UaGUgYWNjb21wYW55aW5nIHZhbHVlIGlzIGEgcGFpciBcY29kZXsoXHZhcntoX2Vycm5vfSwgXHZhcntzdHJpbmd9KX0KLXJlcHJlc2VudGluZyBhbiBlcnJvciByZXR1cm5lZCBieSBhIGxpYnJhcnkgY2FsbC4gXHZhcntzdHJpbmd9Ci1yZXByZXNlbnRzIHRoZSBkZXNjcmlwdGlvbiBvZiBcdmFye2hfZXJybm99LCBhcyByZXR1cm5lZCBieQotdGhlIFxjZnVuY3Rpb257aHN0cmVycm9yKCl9IEMgZnVuY3Rpb24uCi1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtnYWllcnJvcn0KLVRoaXMgZXhjZXB0aW9uIGlzIHJhaXNlZCBmb3IgYWRkcmVzcy1yZWxhdGVkIGVycm9ycywgZm9yCi1cZnVuY3Rpb257Z2V0YWRkcmluZm8oKX0gYW5kIFxmdW5jdGlvbntnZXRuYW1laW5mbygpfS4KLVRoZSBhY2NvbXBhbnlpbmcgdmFsdWUgaXMgYSBwYWlyIFxjb2RleyhcdmFye2Vycm9yfSwgXHZhcntzdHJpbmd9KX0KLXJlcHJlc2VudGluZyBhbiBlcnJvciByZXR1cm5lZCBieSBhIGxpYnJhcnkgY2FsbC4KLVx2YXJ7c3RyaW5nfSByZXByZXNlbnRzIHRoZSBkZXNjcmlwdGlvbiBvZiBcdmFye2Vycm9yfSwgYXMgcmV0dXJuZWQKLWJ5IHRoZSBcY2Z1bmN0aW9ue2dhaV9zdHJlcnJvcigpfSBDIGZ1bmN0aW9uLgotVGhlIFx2YXJ7ZXJyb3J9IHZhbHVlIHdpbGwgbWF0Y2ggb25lIG9mIHRoZSBcY29uc3RhbnR7RUFJXyp9IGNvbnN0YW50cwotZGVmaW5lZCBpbiB0aGlzIG1vZHVsZS4KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e3RpbWVvdXR9Ci1UaGlzIGV4Y2VwdGlvbiBpcyByYWlzZWQgd2hlbiBhIHRpbWVvdXQgb2NjdXJzIG9uIGEgc29ja2V0IHdoaWNoIGhhcwotaGFkIHRpbWVvdXRzIGVuYWJsZWQgdmlhIGEgcHJpb3IgY2FsbCB0byBcbWV0aG9ke3NldHRpbWVvdXQoKX0uICBUaGUKLWFjY29tcGFueWluZyB2YWx1ZSBpcyBhIHN0cmluZyB3aG9zZSB2YWx1ZSBpcyBjdXJyZW50bHkgYWx3YXlzIGBgdGltZWQKLW91dCcnLgotXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317QUZfVU5JWH0KLVxkYXRhbGluZXtBRl9JTkVUfQotXGRhdGFsaW5le0FGX0lORVQ2fQotVGhlc2UgY29uc3RhbnRzIHJlcHJlc2VudCB0aGUgYWRkcmVzcyAoYW5kIHByb3RvY29sKSBmYW1pbGllcywKLXVzZWQgZm9yIHRoZSBmaXJzdCBhcmd1bWVudCB0byBcZnVuY3Rpb257c29ja2V0KCl9LiAgSWYgdGhlCi1cY29uc3RhbnR7QUZfVU5JWH0gY29uc3RhbnQgaXMgbm90IGRlZmluZWQgdGhlbiB0aGlzIHByb3RvY29sIGlzCi11bnN1cHBvcnRlZC4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317U09DS19TVFJFQU19Ci1cZGF0YWxpbmV7U09DS19ER1JBTX0KLVxkYXRhbGluZXtTT0NLX1JBV30KLVxkYXRhbGluZXtTT0NLX1JETX0KLVxkYXRhbGluZXtTT0NLX1NFUVBBQ0tFVH0KLVRoZXNlIGNvbnN0YW50cyByZXByZXNlbnQgdGhlIHNvY2tldCB0eXBlcywKLXVzZWQgZm9yIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gXGZ1bmN0aW9ue3NvY2tldCgpfS4KLShPbmx5IFxjb25zdGFudHtTT0NLX1NUUkVBTX0gYW5kCi1cY29uc3RhbnR7U09DS19ER1JBTX0gYXBwZWFyIHRvIGJlIGdlbmVyYWxseSB1c2VmdWwuKQotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtTT18qfQotXGRhdGFsaW5le1NPTUFYQ09OTn0KLVxkYXRhbGluZXtNU0dfKn0KLVxkYXRhbGluZXtTT0xfKn0KLVxkYXRhbGluZXtJUFBST1RPXyp9Ci1cZGF0YWxpbmV7SVBQT1JUXyp9Ci1cZGF0YWxpbmV7SU5BRERSXyp9Ci1cZGF0YWxpbmV7SVBfKn0KLVxkYXRhbGluZXtJUFY2Xyp9Ci1cZGF0YWxpbmV7RUFJXyp9Ci1cZGF0YWxpbmV7QUlfKn0KLVxkYXRhbGluZXtOSV8qfQotXGRhdGFsaW5le1RDUF8qfQotTWFueSBjb25zdGFudHMgb2YgdGhlc2UgZm9ybXMsIGRvY3VtZW50ZWQgaW4gdGhlIFxVTklYe30gZG9jdW1lbnRhdGlvbiBvbgotc29ja2V0cyBhbmQvb3IgdGhlIElQIHByb3RvY29sLCBhcmUgYWxzbyBkZWZpbmVkIGluIHRoZSBzb2NrZXQgbW9kdWxlLgotVGhleSBhcmUgZ2VuZXJhbGx5IHVzZWQgaW4gYXJndW1lbnRzIHRvIHRoZSBcbWV0aG9ke3NldHNvY2tvcHQoKX0gYW5kCi1cbWV0aG9ke2dldHNvY2tvcHQoKX0gbWV0aG9kcyBvZiBzb2NrZXQgb2JqZWN0cy4gIEluIG1vc3QgY2FzZXMsIG9ubHkKLXRob3NlIHN5bWJvbHMgdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGUgXFVOSVh7fSBoZWFkZXIgZmlsZXMgYXJlIGRlZmluZWQ7Ci1mb3IgYSBmZXcgc3ltYm9scywgZGVmYXVsdCB2YWx1ZXMgYXJlIHByb3ZpZGVkLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtoYXNfaXB2Nn0KLVRoaXMgY29uc3RhbnQgY29udGFpbnMgYSBib29sZWFuIHZhbHVlIHdoaWNoIGluZGljYXRlcyBpZiBJUHY2IGlzCi1zdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybS4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtjcmVhdGVfY29ubmVjdGlvbn17YWRkcmVzc1xvcHRpb25hbHssIHRpbWVvdXR9fQotQ29ubmVjdHMgdG8gdGhlIFx2YXJ7YWRkcmVzc30gcmVjZWl2ZWQgKGFzIHVzdWFsLCBhIFxjb2Rleyhob3N0LCBwb3J0KX0KLXBhaXIpLCB3aXRoIGFuIG9wdGlvbmFsIHRpbWVvdXQgZm9yIHRoZSBjb25uZWN0aW9uLiAgU3BlY2lhbGx5IHVzZWZ1bCBmb3IKLWhpZ2hlci1sZXZlbCBwcm90b2NvbHMsIGl0IGlzIG5vdCBub3JtYWxseSB1c2VkIGRpcmVjdGx5IGZyb20KLWFwcGxpY2F0aW9uLWxldmVsIGNvZGUuICBQYXNzaW5nIHRoZSBvcHRpb25hbCBcdmFye3RpbWVvdXR9IHBhcmFtZXRlcgotd2lsbCBzZXQgdGhlIHRpbWVvdXQgb24gdGhlIHNvY2tldCBpbnN0YW5jZSAoaWYgaXQgaXMgbm90IGdpdmVuIG9yCi1cY29kZXtOb25lfSwgdGhlIGdsb2JhbCBkZWZhdWx0IHRpbWVvdXQgc2V0dGluZyBpcyB1c2VkKS4KLVx2ZXJzaW9uYWRkZWR7Mi42fQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRhZGRyaW5mb317aG9zdCwgcG9ydFxvcHRpb25hbHssIGZhbWlseVxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrdHlwZVxvcHRpb25hbHssIHByb3RvXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzfX19fX0KLVJlc29sdmVzIHRoZSBcdmFye2hvc3R9L1x2YXJ7cG9ydH0gYXJndW1lbnQsIGludG8gYSBzZXF1ZW5jZSBvZgotNS10dXBsZXMgdGhhdCBjb250YWluIGFsbCB0aGUgbmVjZXNzYXJ5IGFyZ3VtZW50IGZvciB0aGUgc29ja2V0cwotbWFuaXB1bGF0aW9uLiBcdmFye2hvc3R9IGlzIGEgZG9tYWluIG5hbWUsIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mCi1JUHY0L3Y2IGFkZHJlc3Mgb3IgXGNvZGV7Tm9uZX0uCi1cdmFye3BvcnR9IGlzIGEgc3RyaW5nIHNlcnZpY2UgbmFtZSAobGlrZSBcY29kZXsnaHR0cCd9KSwgYSBudW1lcmljCi1wb3J0IG51bWJlciBvciBcY29kZXtOb25lfS4KLQotVGhlIHJlc3Qgb2YgdGhlIGFyZ3VtZW50cyBhcmUgb3B0aW9uYWwgYW5kIG11c3QgYmUgbnVtZXJpYyBpZgotc3BlY2lmaWVkLiAgRm9yIFx2YXJ7aG9zdH0gYW5kIFx2YXJ7cG9ydH0sIGJ5IHBhc3NpbmcgZWl0aGVyIGFuIGVtcHR5Ci1zdHJpbmcgb3IgXGNvZGV7Tm9uZX0sIHlvdSBjYW4gcGFzcyBcY29kZXtOVUxMfSB0byB0aGUgQyBBUEkuICBUaGUKLVxmdW5jdGlvbntnZXRhZGRyaW5mbygpfSBmdW5jdGlvbiByZXR1cm5zIGEgbGlzdCBvZiA1LXR1cGxlcyB3aXRoCi10aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKLQotXGNvZGV7KFx2YXJ7ZmFtaWx5fSwgXHZhcntzb2NrdHlwZX0sIFx2YXJ7cHJvdG99LCBcdmFye2Nhbm9ubmFtZX0sCi0gICAgICBcdmFye3NvY2thZGRyfSl9Ci0KLVx2YXJ7ZmFtaWx5fSwgXHZhcntzb2NrdHlwZX0sIFx2YXJ7cHJvdG99IGFyZSBhbGwgaW50ZWdlciBhbmQgYXJlIG1lYW50IHRvCi1iZSBwYXNzZWQgdG8gdGhlIFxmdW5jdGlvbntzb2NrZXQoKX0gZnVuY3Rpb24uCi1cdmFye2Nhbm9ubmFtZX0gaXMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGUgXHZhcntob3N0fS4KLUl0IGNhbiBiZSBhIG51bWVyaWMgSVB2NC92NiBhZGRyZXNzIHdoZW4gXGNvbnN0YW50e0FJX0NBTk9OTkFNRX0gaXMgc3BlY2lmaWVkCi1mb3IgYSBudW1lcmljIFx2YXJ7aG9zdH0uCi1cdmFye3NvY2thZGRyfSBpcyBhIHR1cGxlIGRlc2NyaWJpbmcgYSBzb2NrZXQgYWRkcmVzcywgYXMgZGVzY3JpYmVkIGFib3ZlLgotU2VlIHRoZSBzb3VyY2UgZm9yIHRoZSBccmVmbW9kdWxle2h0dHBsaWJ9IGFuZCBvdGhlciBsaWJyYXJ5IG1vZHVsZXMKLWZvciBhIHR5cGljYWwgdXNhZ2Ugb2YgdGhlIGZ1bmN0aW9uLgotXHZlcnNpb25hZGRlZHsyLjJ9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldGZxZG59e1xvcHRpb25hbHtuYW1lfX0KLVJldHVybiBhIGZ1bGx5IHF1YWxpZmllZCBkb21haW4gbmFtZSBmb3IgXHZhcntuYW1lfS4KLUlmIFx2YXJ7bmFtZX0gaXMgb21pdHRlZCBvciBlbXB0eSwgaXQgaXMgaW50ZXJwcmV0ZWQgYXMgdGhlIGxvY2FsCi1ob3N0LiAgVG8gZmluZCB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUsIHRoZSBob3N0bmFtZSByZXR1cm5lZCBieQotXGZ1bmN0aW9ue2dldGhvc3RieWFkZHIoKX0gaXMgY2hlY2tlZCwgdGhlbiBhbGlhc2VzIGZvciB0aGUgaG9zdCwgaWYKLWF2YWlsYWJsZS4gIFRoZSBmaXJzdCBuYW1lIHdoaWNoIGluY2x1ZGVzIGEgcGVyaW9kIGlzIHNlbGVjdGVkLiAgSW4KLWNhc2Ugbm8gZnVsbHkgcXVhbGlmaWVkIGRvbWFpbiBuYW1lIGlzIGF2YWlsYWJsZSwgdGhlIGhvc3RuYW1lIGFzCi1yZXR1cm5lZCBieSBcZnVuY3Rpb257Z2V0aG9zdG5hbWUoKX0gaXMgcmV0dXJuZWQuCi1cdmVyc2lvbmFkZGVkezIuMH0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0aG9zdGJ5bmFtZX17aG9zdG5hbWV9Ci1UcmFuc2xhdGUgYSBob3N0IG5hbWUgdG8gSVB2NCBhZGRyZXNzIGZvcm1hdC4gIFRoZSBJUHY0IGFkZHJlc3MgaXMKLXJldHVybmVkIGFzIGEgc3RyaW5nLCBzdWNoIGFzICBcY29kZXsnMTAwLjUwLjIwMC41J30uICBJZiB0aGUgaG9zdCBuYW1lCi1pcyBhbiBJUHY0IGFkZHJlc3MgaXRzZWxmIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4gIFNlZQotXGZ1bmN0aW9ue2dldGhvc3RieW5hbWVfZXgoKX0gZm9yIGEgbW9yZSBjb21wbGV0ZSBpbnRlcmZhY2UuCi1cZnVuY3Rpb257Z2V0aG9zdGJ5bmFtZSgpfSBkb2VzIG5vdCBzdXBwb3J0IElQdjYgbmFtZSByZXNvbHV0aW9uLCBhbmQKLVxmdW5jdGlvbntnZXRhZGRyaW5mbygpfSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIGZvciBJUHY0L3Y2IGR1YWwgc3RhY2sgc3VwcG9ydC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0aG9zdGJ5bmFtZV9leH17aG9zdG5hbWV9Ci1UcmFuc2xhdGUgYSBob3N0IG5hbWUgdG8gSVB2NCBhZGRyZXNzIGZvcm1hdCwgZXh0ZW5kZWQgaW50ZXJmYWNlLgotUmV0dXJuIGEgdHJpcGxlIFxjb2RleyhcdmFye2hvc3RuYW1lfSwgXHZhcnthbGlhc2xpc3R9LAotXHZhcntpcGFkZHJsaXN0fSl9IHdoZXJlCi1cdmFye2hvc3RuYW1lfSBpcyB0aGUgcHJpbWFyeSBob3N0IG5hbWUgcmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4KLVx2YXJ7aXBfYWRkcmVzc30sIFx2YXJ7YWxpYXNsaXN0fSBpcyBhIChwb3NzaWJseSBlbXB0eSkgbGlzdCBvZgotYWx0ZXJuYXRpdmUgaG9zdCBuYW1lcyBmb3IgdGhlIHNhbWUgYWRkcmVzcywgYW5kIFx2YXJ7aXBhZGRybGlzdH0gaXMKLWEgbGlzdCBvZiBJUHY0IGFkZHJlc3NlcyBmb3IgdGhlIHNhbWUgaW50ZXJmYWNlIG9uIHRoZSBzYW1lCi1ob3N0IChvZnRlbiBidXQgbm90IGFsd2F5cyBhIHNpbmdsZSBhZGRyZXNzKS4KLVxmdW5jdGlvbntnZXRob3N0YnluYW1lX2V4KCl9IGRvZXMgbm90IHN1cHBvcnQgSVB2NiBuYW1lIHJlc29sdXRpb24sIGFuZAotXGZ1bmN0aW9ue2dldGFkZHJpbmZvKCl9IHNob3VsZCBiZSB1c2VkIGluc3RlYWQgZm9yIElQdjQvdjYgZHVhbCBzdGFjayBzdXBwb3J0LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRob3N0bmFtZX17fQotUmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGhvc3RuYW1lIG9mIHRoZSBtYWNoaW5lIHdoZXJlIAotdGhlIFB5dGhvbiBpbnRlcnByZXRlciBpcyBjdXJyZW50bHkgZXhlY3V0aW5nLgotSWYgeW91IHdhbnQgdG8ga25vdyB0aGUgY3VycmVudCBtYWNoaW5lJ3MgSVAgYWRkcmVzcywgeW91IG1heSB3YW50IHRvIHVzZQotXGNvZGV7Z2V0aG9zdGJ5bmFtZShnZXRob3N0bmFtZSgpKX0uCi1UaGlzIG9wZXJhdGlvbiBhc3N1bWVzIHRoYXQgdGhlcmUgaXMgYSB2YWxpZCBhZGRyZXNzLXRvLWhvc3QgbWFwcGluZyBmb3IKLXRoZSBob3N0LCBhbmQgdGhlIGFzc3VtcHRpb24gZG9lcyBub3QgYWx3YXlzIGhvbGQuCi1Ob3RlOiBcZnVuY3Rpb257Z2V0aG9zdG5hbWUoKX0gZG9lc24ndCBhbHdheXMgcmV0dXJuIHRoZSBmdWxseSBxdWFsaWZpZWQKLWRvbWFpbiBuYW1lOyB1c2UgXGNvZGV7Z2V0ZnFkbigpfQotKHNlZSBhYm92ZSkuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldGhvc3RieWFkZHJ9e2lwX2FkZHJlc3N9Ci1SZXR1cm4gYSB0cmlwbGUgXGNvZGV7KFx2YXJ7aG9zdG5hbWV9LCBcdmFye2FsaWFzbGlzdH0sCi1cdmFye2lwYWRkcmxpc3R9KX0gd2hlcmUgXHZhcntob3N0bmFtZX0gaXMgdGhlIHByaW1hcnkgaG9zdCBuYW1lCi1yZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBcdmFye2lwX2FkZHJlc3N9LCBcdmFye2FsaWFzbGlzdH0gaXMgYQotKHBvc3NpYmx5IGVtcHR5KSBsaXN0IG9mIGFsdGVybmF0aXZlIGhvc3QgbmFtZXMgZm9yIHRoZSBzYW1lIGFkZHJlc3MsCi1hbmQgXHZhcntpcGFkZHJsaXN0fSBpcyBhIGxpc3Qgb2YgSVB2NC92NiBhZGRyZXNzZXMgZm9yIHRoZSBzYW1lIGludGVyZmFjZQotb24gdGhlIHNhbWUgaG9zdCAobW9zdCBsaWtlbHkgY29udGFpbmluZyBvbmx5IGEgc2luZ2xlIGFkZHJlc3MpLgotVG8gZmluZCB0aGUgZnVsbHkgcXVhbGlmaWVkIGRvbWFpbiBuYW1lLCB1c2UgdGhlIGZ1bmN0aW9uCi1cZnVuY3Rpb257Z2V0ZnFkbigpfS4KLVxmdW5jdGlvbntnZXRob3N0YnlhZGRyfSBzdXBwb3J0cyBib3RoIElQdjQgYW5kIElQdjYuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldG5hbWVpbmZvfXtzb2NrYWRkciwgZmxhZ3N9Ci1UcmFuc2xhdGUgYSBzb2NrZXQgYWRkcmVzcyBcdmFye3NvY2thZGRyfSBpbnRvIGEgMi10dXBsZQotXGNvZGV7KFx2YXJ7aG9zdH0sIFx2YXJ7cG9ydH0pfS4KLURlcGVuZGluZyBvbiB0aGUgc2V0dGluZ3Mgb2YgXHZhcntmbGFnc30sIHRoZSByZXN1bHQgY2FuIGNvbnRhaW4gYQotZnVsbHktcXVhbGlmaWVkIGRvbWFpbiBuYW1lIG9yIG51bWVyaWMgYWRkcmVzcyByZXByZXNlbnRhdGlvbiBpbgotXHZhcntob3N0fS4gIFNpbWlsYXJseSwgXHZhcntwb3J0fSBjYW4gY29udGFpbiBhIHN0cmluZyBwb3J0IG5hbWUgb3IgYQotbnVtZXJpYyBwb3J0IG51bWJlci4KLVx2ZXJzaW9uYWRkZWR7Mi4yfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRwcm90b2J5bmFtZX17cHJvdG9jb2xuYW1lfQotVHJhbnNsYXRlIGFuIEludGVybmV0IHByb3RvY29sIG5hbWUgKGZvciBleGFtcGxlLCBcY29kZXsnaWNtcCd9KSB0byBhIGNvbnN0YW50Ci1zdWl0YWJsZSBmb3IgcGFzc2luZyBhcyB0aGUgKG9wdGlvbmFsKSB0aGlyZCBhcmd1bWVudCB0byB0aGUKLVxmdW5jdGlvbntzb2NrZXQoKX0gZnVuY3Rpb24uICBUaGlzIGlzIHVzdWFsbHkgb25seSBuZWVkZWQgZm9yIHNvY2tldHMKLW9wZW5lZCBpbiBgYHJhdycnIG1vZGUgKFxjb25zdGFudHtTT0NLX1JBV30pOyBmb3IgdGhlIG5vcm1hbCBzb2NrZXQKLW1vZGVzLCB0aGUgY29ycmVjdCBwcm90b2NvbCBpcyBjaG9zZW4gYXV0b21hdGljYWxseSBpZiB0aGUgcHJvdG9jb2wgaXMKLW9taXR0ZWQgb3IgemVyby4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0c2VydmJ5bmFtZX17c2VydmljZW5hbWVcb3B0aW9uYWx7LCBwcm90b2NvbG5hbWV9fQotVHJhbnNsYXRlIGFuIEludGVybmV0IHNlcnZpY2UgbmFtZSBhbmQgcHJvdG9jb2wgbmFtZSB0byBhIHBvcnQgbnVtYmVyCi1mb3IgdGhhdCBzZXJ2aWNlLiAgVGhlIG9wdGlvbmFsIHByb3RvY29sIG5hbWUsIGlmIGdpdmVuLCBzaG91bGQgYmUKLVxjb2Rleyd0Y3AnfSBvciBcY29kZXsndWRwJ30sIG90aGVyd2lzZSBhbnkgcHJvdG9jb2wgd2lsbCBtYXRjaC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0c2VydmJ5cG9ydH17cG9ydFxvcHRpb25hbHssIHByb3RvY29sbmFtZX19Ci1UcmFuc2xhdGUgYW4gSW50ZXJuZXQgcG9ydCBudW1iZXIgYW5kIHByb3RvY29sIG5hbWUgdG8gYSBzZXJ2aWNlIG5hbWUKLWZvciB0aGF0IHNlcnZpY2UuICBUaGUgb3B0aW9uYWwgcHJvdG9jb2wgbmFtZSwgaWYgZ2l2ZW4sIHNob3VsZCBiZQotXGNvZGV7J3RjcCd9IG9yIFxjb2Rleyd1ZHAnfSwgb3RoZXJ3aXNlIGFueSBwcm90b2NvbCB3aWxsIG1hdGNoLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzb2NrZXR9e1xvcHRpb25hbHtmYW1pbHlcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVcb3B0aW9uYWx7LCBwcm90b319fX0KLUNyZWF0ZSBhIG5ldyBzb2NrZXQgdXNpbmcgdGhlIGdpdmVuIGFkZHJlc3MgZmFtaWx5LCBzb2NrZXQgdHlwZSBhbmQKLXByb3RvY29sIG51bWJlci4gIFRoZSBhZGRyZXNzIGZhbWlseSBzaG91bGQgYmUgXGNvbnN0YW50e0FGX0lORVR9ICh0aGUKLWRlZmF1bHQpLCBcY29uc3RhbnR7QUZfSU5FVDZ9IG9yIFxjb25zdGFudHtBRl9VTklYfS4gIFRoZSBzb2NrZXQgdHlwZQotc2hvdWxkIGJlIFxjb25zdGFudHtTT0NLX1NUUkVBTX0gKHRoZSBkZWZhdWx0KSwgXGNvbnN0YW50e1NPQ0tfREdSQU19Ci1vciBwZXJoYXBzIG9uZSBvZiB0aGUgb3RoZXIgXHNhbXB7U09DS199IGNvbnN0YW50cy4gIFRoZSBwcm90b2NvbAotbnVtYmVyIGlzIHVzdWFsbHkgemVybyBhbmQgbWF5IGJlIG9taXR0ZWQgaW4gdGhhdCBjYXNlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzc2x9e3NvY2tcb3B0aW9uYWx7LCBrZXlmaWxlLCBjZXJ0ZmlsZX19Ci1Jbml0aWF0ZSBhIFNTTCBjb25uZWN0aW9uIG92ZXIgdGhlIHNvY2tldCBcdmFye3NvY2t9LiBcdmFye2tleWZpbGV9IGlzCi10aGUgbmFtZSBvZiBhIFBFTSBmb3JtYXR0ZWQgZmlsZSB0aGF0IGNvbnRhaW5zIHlvdXIgcHJpdmF0ZQota2V5LiBcdmFye2NlcnRmaWxlfSBpcyBhIFBFTSBmb3JtYXR0ZWQgY2VydGlmaWNhdGUgY2hhaW4gZmlsZS4gT24KLXN1Y2Nlc3MsIGEgbmV3IFxjbGFzc3tTU0xPYmplY3R9IGlzIHJldHVybmVkLgotCi1cd2FybmluZ3tUaGlzIGRvZXMgbm90IGRvIGFueSBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24hfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzb2NrZXRwYWlyfXtcb3B0aW9uYWx7ZmFtaWx5XG9wdGlvbmFseywgdHlwZVxvcHRpb25hbHssIHByb3RvfX19fQotQnVpbGQgYSBwYWlyIG9mIGNvbm5lY3RlZCBzb2NrZXQgb2JqZWN0cyB1c2luZyB0aGUgZ2l2ZW4gYWRkcmVzcwotZmFtaWx5LCBzb2NrZXQgdHlwZSwgYW5kIHByb3RvY29sIG51bWJlci4gIEFkZHJlc3MgZmFtaWx5LCBzb2NrZXQgdHlwZSwKLWFuZCBwcm90b2NvbCBudW1iZXIgYXJlIGFzIGZvciB0aGUgXGZ1bmN0aW9ue3NvY2tldCgpfSBmdW5jdGlvbiBhYm92ZS4KLVRoZSBkZWZhdWx0IGZhbWlseSBpcyBcY29uc3RhbnR7QUZfVU5JWH0gaWYgZGVmaW5lZCBvbiB0aGUgcGxhdGZvcm07Ci1vdGhlcndpc2UsIHRoZSBkZWZhdWx0IGlzIFxjb25zdGFudHtBRl9JTkVUfS4KLUF2YWlsYWJpbGl0eTogXFVOSVguICBcdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZnJvbWZkfXtmZCwgZmFtaWx5LCB0eXBlXG9wdGlvbmFseywgcHJvdG99fQotRHVwbGljYXRlIHRoZSBmaWxlIGRlc2NyaXB0b3IgXHZhcntmZH0gKGFuIGludGVnZXIgYXMgcmV0dXJuZWQgYnkgYSBmaWxlCi1vYmplY3QncyBcbWV0aG9ke2ZpbGVubygpfSBtZXRob2QpIGFuZCBidWlsZCBhIHNvY2tldCBvYmplY3QgZnJvbSB0aGUKLXJlc3VsdC4gIEFkZHJlc3MgZmFtaWx5LCBzb2NrZXQgdHlwZSBhbmQgcHJvdG9jb2wgbnVtYmVyIGFyZSBhcyBmb3IgdGhlCi1cZnVuY3Rpb257c29ja2V0KCl9IGZ1bmN0aW9uIGFib3ZlLgotVGhlIGZpbGUgZGVzY3JpcHRvciBzaG91bGQgcmVmZXIgdG8gYSBzb2NrZXQsIGJ1dCB0aGlzIGlzIG5vdAotY2hlY2tlZCAtLS0gc3Vic2VxdWVudCBvcGVyYXRpb25zIG9uIHRoZSBvYmplY3QgbWF5IGZhaWwgaWYgdGhlIGZpbGUKLWRlc2NyaXB0b3IgaXMgaW52YWxpZC4gIFRoaXMgZnVuY3Rpb24gaXMgcmFyZWx5IG5lZWRlZCwgYnV0IGNhbiBiZQotdXNlZCB0byBnZXQgb3Igc2V0IHNvY2tldCBvcHRpb25zIG9uIGEgc29ja2V0IHBhc3NlZCB0byBhIHByb2dyYW0gYXMKLXN0YW5kYXJkIGlucHV0IG9yIG91dHB1dCAoc3VjaCBhcyBhIHNlcnZlciBzdGFydGVkIGJ5IHRoZSBcVU5JWHt9IGluZXQKLWRhZW1vbikuICBUaGUgc29ja2V0IGlzIGFzc3VtZWQgdG8gYmUgaW4gYmxvY2tpbmcgbW9kZS4KLUF2YWlsYWJpbGl0eTogXFVOSVguCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e250b2hsfXt4fQotQ29udmVydCAzMi1iaXQgcG9zaXRpdmUgaW50ZWdlcnMgZnJvbSBuZXR3b3JrIHRvIGhvc3QgYnl0ZSBvcmRlci4gIE9uIG1hY2hpbmVzCi13aGVyZSB0aGUgaG9zdCBieXRlIG9yZGVyIGlzIHRoZSBzYW1lIGFzIG5ldHdvcmsgYnl0ZSBvcmRlciwgdGhpcyBpcyBhCi1uby1vcDsgb3RoZXJ3aXNlLCBpdCBwZXJmb3JtcyBhIDQtYnl0ZSBzd2FwIG9wZXJhdGlvbi4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bnRvaHN9e3h9Ci1Db252ZXJ0IDE2LWJpdCBwb3NpdGl2ZSBpbnRlZ2VycyBmcm9tIG5ldHdvcmsgdG8gaG9zdCBieXRlIG9yZGVyLiAgT24gbWFjaGluZXMKLXdoZXJlIHRoZSBob3N0IGJ5dGUgb3JkZXIgaXMgdGhlIHNhbWUgYXMgbmV0d29yayBieXRlIG9yZGVyLCB0aGlzIGlzIGEKLW5vLW9wOyBvdGhlcndpc2UsIGl0IHBlcmZvcm1zIGEgMi1ieXRlIHN3YXAgb3BlcmF0aW9uLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtodG9ubH17eH0KLUNvbnZlcnQgMzItYml0IHBvc2l0aXZlIGludGVnZXJzIGZyb20gaG9zdCB0byBuZXR3b3JrIGJ5dGUgb3JkZXIuICBPbiBtYWNoaW5lcwotd2hlcmUgdGhlIGhvc3QgYnl0ZSBvcmRlciBpcyB0aGUgc2FtZSBhcyBuZXR3b3JrIGJ5dGUgb3JkZXIsIHRoaXMgaXMgYQotbm8tb3A7IG90aGVyd2lzZSwgaXQgcGVyZm9ybXMgYSA0LWJ5dGUgc3dhcCBvcGVyYXRpb24uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2h0b25zfXt4fQotQ29udmVydCAxNi1iaXQgcG9zaXRpdmUgaW50ZWdlcnMgZnJvbSBob3N0IHRvIG5ldHdvcmsgYnl0ZSBvcmRlci4gIE9uIG1hY2hpbmVzCi13aGVyZSB0aGUgaG9zdCBieXRlIG9yZGVyIGlzIHRoZSBzYW1lIGFzIG5ldHdvcmsgYnl0ZSBvcmRlciwgdGhpcyBpcyBhCi1uby1vcDsgb3RoZXJ3aXNlLCBpdCBwZXJmb3JtcyBhIDItYnl0ZSBzd2FwIG9wZXJhdGlvbi4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aW5ldF9hdG9ufXtpcF9zdHJpbmd9Ci1Db252ZXJ0IGFuIElQdjQgYWRkcmVzcyBmcm9tIGRvdHRlZC1xdWFkIHN0cmluZyBmb3JtYXQgKGZvciBleGFtcGxlLAotJzEyMy40NS42Ny44OScpIHRvIDMyLWJpdCBwYWNrZWQgYmluYXJ5IGZvcm1hdCwgYXMgYSBzdHJpbmcgZm91cgotY2hhcmFjdGVycyBpbiBsZW5ndGguICBUaGlzIGlzIHVzZWZ1bCB3aGVuIGNvbnZlcnNpbmcgd2l0aCBhIHByb2dyYW0KLXRoYXQgdXNlcyB0aGUgc3RhbmRhcmQgQyBsaWJyYXJ5IGFuZCBuZWVkcyBvYmplY3RzIG9mIHR5cGUKLVxjdHlwZXtzdHJ1Y3QgaW5fYWRkcn0sIHdoaWNoIGlzIHRoZSBDIHR5cGUgZm9yIHRoZSAzMi1iaXQgcGFja2VkCi1iaW5hcnkgdGhpcyBmdW5jdGlvbiByZXR1cm5zLgotCi1JZiB0aGUgSVB2NCBhZGRyZXNzIHN0cmluZyBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiBpcyBpbnZhbGlkLAotXGV4Y2VwdGlvbntzb2NrZXQuZXJyb3J9IHdpbGwgYmUgcmFpc2VkLiBOb3RlIHRoYXQgZXhhY3RseSB3aGF0IGlzCi12YWxpZCBkZXBlbmRzIG9uIHRoZSB1bmRlcmx5aW5nIEMgaW1wbGVtZW50YXRpb24gb2YKLVxjZnVuY3Rpb257aW5ldF9hdG9uKCl9LgotCi1cZnVuY3Rpb257aW5ldF9hdG9uKCl9IGRvZXMgbm90IHN1cHBvcnQgSVB2NiwgYW5kCi1cZnVuY3Rpb257Z2V0bmFtZWluZm8oKX0gc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBmb3IgSVB2NC92NiBkdWFsIHN0YWNrCi1zdXBwb3J0LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpbmV0X250b2F9e3BhY2tlZF9pcH0KLUNvbnZlcnQgYSAzMi1iaXQgcGFja2VkIElQdjQgYWRkcmVzcyAoYSBzdHJpbmcgZm91ciBjaGFyYWN0ZXJzIGluCi1sZW5ndGgpIHRvIGl0cyBzdGFuZGFyZCBkb3R0ZWQtcXVhZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gKGZvcgotZXhhbXBsZSwgJzEyMy40NS42Ny44OScpLiAgVGhpcyBpcyB1c2VmdWwgd2hlbiBjb252ZXJzaW5nIHdpdGggYQotcHJvZ3JhbSB0aGF0IHVzZXMgdGhlIHN0YW5kYXJkIEMgbGlicmFyeSBhbmQgbmVlZHMgb2JqZWN0cyBvZiB0eXBlCi1cY3R5cGV7c3RydWN0IGluX2FkZHJ9LCB3aGljaCBpcyB0aGUgQyB0eXBlIGZvciB0aGUgMzItYml0IHBhY2tlZAotYmluYXJ5IGRhdGEgdGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBhbiBhcmd1bWVudC4KLQotSWYgdGhlIHN0cmluZyBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiBpcyBub3QgZXhhY3RseSA0IGJ5dGVzIGluCi1sZW5ndGgsIFxleGNlcHRpb257c29ja2V0LmVycm9yfSB3aWxsIGJlIHJhaXNlZC4KLVxmdW5jdGlvbntpbmV0X250b2EoKX0gZG9lcyBub3Qgc3VwcG9ydCBJUHY2LCBhbmQKLVxmdW5jdGlvbntnZXRuYW1laW5mbygpfSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIGZvciBJUHY0L3Y2IGR1YWwgc3RhY2sKLXN1cHBvcnQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2luZXRfcHRvbn17YWRkcmVzc19mYW1pbHksIGlwX3N0cmluZ30KLUNvbnZlcnQgYW4gSVAgYWRkcmVzcyBmcm9tIGl0cyBmYW1pbHktc3BlY2lmaWMgc3RyaW5nIGZvcm1hdCB0byBhIHBhY2tlZCwKLWJpbmFyeSBmb3JtYXQuCi1cZnVuY3Rpb257aW5ldF9wdG9uKCl9IGlzIHVzZWZ1bCB3aGVuIGEgbGlicmFyeSBvciBuZXR3b3JrIHByb3RvY29sIGNhbGxzIGZvcgotYW4gb2JqZWN0IG9mIHR5cGUgXGN0eXBle3N0cnVjdCBpbl9hZGRyfSAoc2ltaWxhciB0byBcZnVuY3Rpb257aW5ldF9hdG9uKCl9KQotb3IgXGN0eXBle3N0cnVjdCBpbjZfYWRkcn0uCi0KLVN1cHBvcnRlZCB2YWx1ZXMgZm9yIFx2YXJ7YWRkcmVzc19mYW1pbHl9IGFyZSBjdXJyZW50bHkKLVxjb25zdGFudHtBRl9JTkVUfSBhbmQgXGNvbnN0YW50e0FGX0lORVQ2fS4KLUlmIHRoZSBJUCBhZGRyZXNzIHN0cmluZyBcdmFye2lwX3N0cmluZ30gaXMgaW52YWxpZCwKLVxleGNlcHRpb257c29ja2V0LmVycm9yfSB3aWxsIGJlIHJhaXNlZC4gTm90ZSB0aGF0IGV4YWN0bHkgd2hhdCBpcyB2YWxpZAotZGVwZW5kcyBvbiBib3RoIHRoZSB2YWx1ZSBvZiBcdmFye2FkZHJlc3NfZmFtaWx5fSBhbmQgdGhlIHVuZGVybHlpbmcKLWltcGxlbWVudGF0aW9uIG9mIFxjZnVuY3Rpb257aW5ldF9wdG9uKCl9LgotCi1BdmFpbGFiaWxpdHk6IFxVTklYe30gKG1heWJlIG5vdCBhbGwgcGxhdGZvcm1zKS4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpbmV0X250b3B9e2FkZHJlc3NfZmFtaWx5LCBwYWNrZWRfaXB9Ci1Db252ZXJ0IGEgcGFja2VkIElQIGFkZHJlc3MgKGEgc3RyaW5nIG9mIHNvbWUgbnVtYmVyIG9mIGNoYXJhY3RlcnMpIHRvCi1pdHMgc3RhbmRhcmQsIGZhbWlseS1zcGVjaWZpYyBzdHJpbmcgcmVwcmVzZW50YXRpb24gKGZvciBleGFtcGxlLAotXGNvZGV7JzcuMTAuMC41J30gb3IgXGNvZGV7JzVhZWY6MmI6OjgnfSkKLVxmdW5jdGlvbntpbmV0X250b3AoKX0gaXMgdXNlZnVsIHdoZW4gYSBsaWJyYXJ5IG9yIG5ldHdvcmsgcHJvdG9jb2wgcmV0dXJucwotYW4gb2JqZWN0IG9mIHR5cGUgXGN0eXBle3N0cnVjdCBpbl9hZGRyfSAoc2ltaWxhciB0byBcZnVuY3Rpb257aW5ldF9udG9hKCl9KQotb3IgXGN0eXBle3N0cnVjdCBpbjZfYWRkcn0uCi0KLVN1cHBvcnRlZCB2YWx1ZXMgZm9yIFx2YXJ7YWRkcmVzc19mYW1pbHl9IGFyZSBjdXJyZW50bHkKLVxjb25zdGFudHtBRl9JTkVUfSBhbmQgXGNvbnN0YW50e0FGX0lORVQ2fS4KLUlmIHRoZSBzdHJpbmcgXHZhcntwYWNrZWRfaXB9IGlzIG5vdCB0aGUgY29ycmVjdCBsZW5ndGggZm9yIHRoZQotc3BlY2lmaWVkIGFkZHJlc3MgZmFtaWx5LCBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IHdpbGwgYmUgcmFpc2VkLiAgQQotXGV4Y2VwdGlvbntzb2NrZXQuZXJyb3J9IGlzIHJhaXNlZCBmb3IgZXJyb3JzIGZyb20gdGhlIGNhbGwgdG8KLVxmdW5jdGlvbntpbmV0X250b3AoKX0uCi0KLUF2YWlsYWJpbGl0eTogXFVOSVh7fSAobWF5YmUgbm90IGFsbCBwbGF0Zm9ybXMpLgotXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldGRlZmF1bHR0aW1lb3V0fXt9Ci1SZXR1cm4gdGhlIGRlZmF1bHQgdGltZW91dCBpbiBmbG9hdGluZyBzZWNvbmRzIGZvciBuZXcgc29ja2V0IG9iamVjdHMuCi1BIHZhbHVlIG9mIFxjb2Rle05vbmV9IGluZGljYXRlcyB0aGF0IG5ldyBzb2NrZXQgb2JqZWN0cyBoYXZlIG5vIHRpbWVvdXQuCi1XaGVuIHRoZSBzb2NrZXQgbW9kdWxlIGlzIGZpcnN0IGltcG9ydGVkLCB0aGUgZGVmYXVsdCBpcyBcY29kZXtOb25lfS4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzZXRkZWZhdWx0dGltZW91dH17dGltZW91dH0KLVNldCB0aGUgZGVmYXVsdCB0aW1lb3V0IGluIGZsb2F0aW5nIHNlY29uZHMgZm9yIG5ldyBzb2NrZXQgb2JqZWN0cy4KLUEgdmFsdWUgb2YgXGNvZGV7Tm9uZX0gaW5kaWNhdGVzIHRoYXQgbmV3IHNvY2tldCBvYmplY3RzIGhhdmUgbm8gdGltZW91dC4KLVdoZW4gdGhlIHNvY2tldCBtb2R1bGUgaXMgZmlyc3QgaW1wb3J0ZWQsIHRoZSBkZWZhdWx0IGlzIFxjb2Rle05vbmV9LgotXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1NvY2tldFR5cGV9Ci1UaGlzIGlzIGEgUHl0aG9uIHR5cGUgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc29ja2V0IG9iamVjdCB0eXBlLgotSXQgaXMgdGhlIHNhbWUgYXMgXGNvZGV7dHlwZShzb2NrZXQoLi4uKSl9LgotXGVuZHtkYXRhZGVzY30KLQotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZW1vZHVsZXtTb2NrZXRTZXJ2ZXJ9e0NsYXNzZXMgdGhhdCBzaW1wbGlmeSB3cml0aW5nIG5ldHdvcmsgc2VydmVycy59Ci1cZW5ke3NlZWFsc299Ci0KLQotXHN1YnNlY3Rpb257U29ja2V0IE9iamVjdHMgXGxhYmVse3NvY2tldC1vYmplY3RzfX0KLQotU29ja2V0IG9iamVjdHMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHMuICBFeGNlcHQgZm9yCi1cbWV0aG9ke21ha2VmaWxlKCl9IHRoZXNlIGNvcnJlc3BvbmQgdG8gXFVOSVh7fSBzeXN0ZW0gY2FsbHMKLWFwcGxpY2FibGUgdG8gc29ja2V0cy4KLQotXGJlZ2lue21ldGhvZGRlc2N9W3NvY2tldF17YWNjZXB0fXt9Ci1BY2NlcHQgYSBjb25uZWN0aW9uLgotVGhlIHNvY2tldCBtdXN0IGJlIGJvdW5kIHRvIGFuIGFkZHJlc3MgYW5kIGxpc3RlbmluZyBmb3IgY29ubmVjdGlvbnMuCi1UaGUgcmV0dXJuIHZhbHVlIGlzIGEgcGFpciBcY29kZXsoXHZhcntjb25ufSwgXHZhcnthZGRyZXNzfSl9Ci13aGVyZSBcdmFye2Nvbm59IGlzIGEgXGVtcGh7bmV3fSBzb2NrZXQgb2JqZWN0IHVzYWJsZSB0byBzZW5kIGFuZAotcmVjZWl2ZSBkYXRhIG9uIHRoZSBjb25uZWN0aW9uLCBhbmQgXHZhcnthZGRyZXNzfSBpcyB0aGUgYWRkcmVzcyBib3VuZAotdG8gdGhlIHNvY2tldCBvbiB0aGUgb3RoZXIgZW5kIG9mIHRoZSBjb25uZWN0aW9uLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bc29ja2V0XXtiaW5kfXthZGRyZXNzfQotQmluZCB0aGUgc29ja2V0IHRvIFx2YXJ7YWRkcmVzc30uICBUaGUgc29ja2V0IG11c3Qgbm90IGFscmVhZHkgYmUgYm91bmQuCi0oVGhlIGZvcm1hdCBvZiBcdmFye2FkZHJlc3N9IGRlcGVuZHMgb24gdGhlIGFkZHJlc3MgZmFtaWx5IC0tLSBzZWUKLWFib3ZlLikgIFxub3Rle1RoaXMgbWV0aG9kIGhhcyBoaXN0b3JpY2FsbHkgYWNjZXB0ZWQgYSBwYWlyCi1vZiBwYXJhbWV0ZXJzIGZvciBcY29uc3RhbnR7QUZfSU5FVH0gYWRkcmVzc2VzIGluc3RlYWQgb2Ygb25seSBhCi10dXBsZS4gIFRoaXMgd2FzIG5ldmVyIGludGVudGlvbmFsIGFuZCBpcyBubyBsb25nZXIgYXZhaWxhYmxlIGluCi1QeXRob24gMi4wIGFuZCBsYXRlci59Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtzb2NrZXRde2Nsb3NlfXt9Ci1DbG9zZSB0aGUgc29ja2V0LiAgQWxsIGZ1dHVyZSBvcGVyYXRpb25zIG9uIHRoZSBzb2NrZXQgb2JqZWN0IHdpbGwgZmFpbC4KLVRoZSByZW1vdGUgZW5kIHdpbGwgcmVjZWl2ZSBubyBtb3JlIGRhdGEgKGFmdGVyIHF1ZXVlZCBkYXRhIGlzIGZsdXNoZWQpLgotU29ja2V0cyBhcmUgYXV0b21hdGljYWxseSBjbG9zZWQgd2hlbiB0aGV5IGFyZSBnYXJiYWdlLWNvbGxlY3RlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3NvY2tldF17Y29ubmVjdH17YWRkcmVzc30KLUNvbm5lY3QgdG8gYSByZW1vdGUgc29ja2V0IGF0IFx2YXJ7YWRkcmVzc30uCi0oVGhlIGZvcm1hdCBvZiBcdmFye2FkZHJlc3N9IGRlcGVuZHMgb24gdGhlIGFkZHJlc3MgZmFtaWx5IC0tLSBzZWUKLWFib3ZlLikgIFxub3Rle1RoaXMgbWV0aG9kIGhhcyBoaXN0b3JpY2FsbHkgYWNjZXB0ZWQgYSBwYWlyCi1vZiBwYXJhbWV0ZXJzIGZvciBcY29uc3RhbnR7QUZfSU5FVH0gYWRkcmVzc2VzIGluc3RlYWQgb2Ygb25seSBhCi10dXBsZS4gIFRoaXMgd2FzIG5ldmVyIGludGVudGlvbmFsIGFuZCBpcyBubyBsb25nZXIgYXZhaWxhYmxlIGluCi1QeXRob24gMi4wIGFuZCBsYXRlci59Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtzb2NrZXRde2Nvbm5lY3RfZXh9e2FkZHJlc3N9Ci1MaWtlIFxjb2Rle2Nvbm5lY3QoXHZhcnthZGRyZXNzfSl9LCBidXQgcmV0dXJuIGFuIGVycm9yIGluZGljYXRvcgotaW5zdGVhZCBvZiByYWlzaW5nIGFuIGV4Y2VwdGlvbiBmb3IgZXJyb3JzIHJldHVybmVkIGJ5IHRoZSBDLWxldmVsCi1cY2Z1bmN0aW9ue2Nvbm5lY3QoKX0gY2FsbCAob3RoZXIgcHJvYmxlbXMsIHN1Y2ggYXMgYGBob3N0IG5vdCBmb3VuZCwnJwotY2FuIHN0aWxsIHJhaXNlIGV4Y2VwdGlvbnMpLiAgVGhlIGVycm9yIGluZGljYXRvciBpcyBcY29kZXswfSBpZiB0aGUKLW9wZXJhdGlvbiBzdWNjZWVkZWQsIG90aGVyd2lzZSB0aGUgdmFsdWUgb2YgdGhlIFxjZGF0YXtlcnJub30KLXZhcmlhYmxlLiAgVGhpcyBpcyB1c2VmdWwgdG8gc3VwcG9ydCwgZm9yIGV4YW1wbGUsIGFzeW5jaHJvbm91cyBjb25uZWN0cy4KLVxub3Rle1RoaXMgbWV0aG9kIGhhcyBoaXN0b3JpY2FsbHkgYWNjZXB0ZWQgYSBwYWlyIG9mCi1wYXJhbWV0ZXJzIGZvciBcY29uc3RhbnR7QUZfSU5FVH0gYWRkcmVzc2VzIGluc3RlYWQgb2Ygb25seSBhIHR1cGxlLgotVGhpcyB3YXMgbmV2ZXIgaW50ZW50aW9uYWwgYW5kIGlzIG5vIGxvbmdlciBhdmFpbGFibGUgaW4gUHl0aG9uCi0yLjAgYW5kIGxhdGVyLn0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3NvY2tldF17ZmlsZW5vfXt9Ci1SZXR1cm4gdGhlIHNvY2tldCdzIGZpbGUgZGVzY3JpcHRvciAoYSBzbWFsbCBpbnRlZ2VyKS4gIFRoaXMgaXMgdXNlZnVsCi13aXRoIFxmdW5jdGlvbntzZWxlY3Quc2VsZWN0KCl9LgotCi1VbmRlciBXaW5kb3dzIHRoZSBzbWFsbCBpbnRlZ2VyIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIGNhbm5vdCBiZSB1c2VkIHdoZXJlCi1hIGZpbGUgZGVzY3JpcHRvciBjYW4gYmUgdXNlZCAoc3VjaCBhcyBcZnVuY3Rpb257b3MuZmRvcGVuKCl9KS4gIFxVTklYe30gZG9lcwotbm90IGhhdmUgdGhpcyBsaW1pdGF0aW9uLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bc29ja2V0XXtnZXRwZWVybmFtZX17fQotUmV0dXJuIHRoZSByZW1vdGUgYWRkcmVzcyB0byB3aGljaCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZC4gIFRoaXMgaXMKLXVzZWZ1bCB0byBmaW5kIG91dCB0aGUgcG9ydCBudW1iZXIgb2YgYSByZW1vdGUgSVB2NC92NiBzb2NrZXQsIGZvciBpbnN0YW5jZS4KLShUaGUgZm9ybWF0IG9mIHRoZSBhZGRyZXNzIHJldHVybmVkIGRlcGVuZHMgb24gdGhlIGFkZHJlc3MgZmFtaWx5IC0tLQotc2VlIGFib3ZlLikgIE9uIHNvbWUgc3lzdGVtcyB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtzb2NrZXRde2dldHNvY2tuYW1lfXt9Ci1SZXR1cm4gdGhlIHNvY2tldCdzIG93biBhZGRyZXNzLiAgVGhpcyBpcyB1c2VmdWwgdG8gZmluZCBvdXQgdGhlIHBvcnQKLW51bWJlciBvZiBhbiBJUHY0L3Y2IHNvY2tldCwgZm9yIGluc3RhbmNlLgotKFRoZSBmb3JtYXQgb2YgdGhlIGFkZHJlc3MgcmV0dXJuZWQgZGVwZW5kcyBvbiB0aGUgYWRkcmVzcyBmYW1pbHkgLS0tCi1zZWUgYWJvdmUuKQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bc29ja2V0XXtnZXRzb2Nrb3B0fXtsZXZlbCwgb3B0bmFtZVxvcHRpb25hbHssIGJ1Zmxlbn19Ci1SZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBzb2NrZXQgb3B0aW9uIChzZWUgdGhlIFxVTklYe30gbWFuIHBhZ2UKLVxtYW5wYWdle2dldHNvY2tvcHR9ezJ9KS4gIFRoZSBuZWVkZWQgc3ltYm9saWMgY29uc3RhbnRzCi0oXGNvbnN0YW50e1NPXyp9IGV0Yy4pIGFyZSBkZWZpbmVkIGluIHRoaXMgbW9kdWxlLiAgSWYgXHZhcntidWZsZW59Ci1pcyBhYnNlbnQsIGFuIGludGVnZXIgb3B0aW9uIGlzIGFzc3VtZWQgYW5kIGl0cyBpbnRlZ2VyIHZhbHVlCi1pcyByZXR1cm5lZCBieSB0aGUgZnVuY3Rpb24uICBJZiBcdmFye2J1Zmxlbn0gaXMgcHJlc2VudCwgaXQgc3BlY2lmaWVzCi10aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIGJ1ZmZlciB1c2VkIHRvIHJlY2VpdmUgdGhlIG9wdGlvbiBpbiwgYW5kCi10aGlzIGJ1ZmZlciBpcyByZXR1cm5lZCBhcyBhIHN0cmluZy4gIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gZGVjb2RlCi10aGUgY29udGVudHMgb2YgdGhlIGJ1ZmZlciAoc2VlIHRoZSBvcHRpb25hbCBidWlsdC1pbiBtb2R1bGUKLVxyZWZtb2R1bGV7c3RydWN0fSBmb3IgYSB3YXkgdG8gZGVjb2RlIEMgc3RydWN0dXJlcyBlbmNvZGVkIGFzIHN0cmluZ3MpLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bc29ja2V0XXtsaXN0ZW59e2JhY2tsb2d9Ci1MaXN0ZW4gZm9yIGNvbm5lY3Rpb25zIG1hZGUgdG8gdGhlIHNvY2tldC4gIFRoZSBcdmFye2JhY2tsb2d9IGFyZ3VtZW50Ci1zcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHF1ZXVlZCBjb25uZWN0aW9ucyBhbmQgc2hvdWxkIGJlIGF0Ci1sZWFzdCAxOyB0aGUgbWF4aW11bSB2YWx1ZSBpcyBzeXN0ZW0tZGVwZW5kZW50ICh1c3VhbGx5IDUpLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bc29ja2V0XXttYWtlZmlsZX17XG9wdGlvbmFse21vZGVcb3B0aW9uYWx7LCBidWZzaXplfX19Ci1SZXR1cm4gYSBcZGZue2ZpbGUgb2JqZWN0fSBhc3NvY2lhdGVkIHdpdGggdGhlIHNvY2tldC4gIChGaWxlIG9iamVjdHMKLWFyZSBkZXNjcmliZWQgaW4gXHJlZntibHRpbi1maWxlLW9iamVjdHN9LCBgYEZpbGUgT2JqZWN0cy4nJykKLVRoZSBmaWxlIG9iamVjdCByZWZlcmVuY2VzIGEgXGNmdW5jdGlvbntkdXAoKX1wZWQgdmVyc2lvbiBvZiB0aGUKLXNvY2tldCBmaWxlIGRlc2NyaXB0b3IsIHNvIHRoZSBmaWxlIG9iamVjdCBhbmQgc29ja2V0IG9iamVjdCBtYXkgYmUKLWNsb3NlZCBvciBnYXJiYWdlLWNvbGxlY3RlZCBpbmRlcGVuZGVudGx5LgotVGhlIHNvY2tldCBtdXN0IGJlIGluIGJsb2NraW5nIG1vZGUgKGl0IGNhbiBub3QgaGF2ZSBhIHRpbWVvdXQpLgotXGluZGV4e0kvTyBjb250cm9sIWJ1ZmZlcmluZ31UaGUgb3B0aW9uYWwgXHZhcnttb2RlfQotYW5kIFx2YXJ7YnVmc2l6ZX0gYXJndW1lbnRzIGFyZSBpbnRlcnByZXRlZCB0aGUgc2FtZSB3YXkgYXMgYnkgdGhlCi1idWlsdC1pbiBcZnVuY3Rpb257ZmlsZSgpfSBmdW5jdGlvbjsgc2VlIGBgQnVpbHQtaW4gRnVuY3Rpb25zJycKLShzZWN0aW9uIFxyZWZ7YnVpbHQtaW4tZnVuY3N9KSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3NvY2tldF17cmVjdn17YnVmc2l6ZVxvcHRpb25hbHssIGZsYWdzfX0KLVJlY2VpdmUgZGF0YSBmcm9tIHRoZSBzb2NrZXQuICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgc3RyaW5nIHJlcHJlc2VudGluZwotdGhlIGRhdGEgcmVjZWl2ZWQuICBUaGUgbWF4aW11bSBhbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZAotYXQgb25jZSBpcyBzcGVjaWZpZWQgYnkgXHZhcntidWZzaXplfS4gIFNlZSB0aGUgXFVOSVh7fSBtYW51YWwgcGFnZQotXG1hbnBhZ2V7cmVjdn17Mn0gZm9yIHRoZSBtZWFuaW5nIG9mIHRoZSBvcHRpb25hbCBhcmd1bWVudAotXHZhcntmbGFnc307IGl0IGRlZmF1bHRzIHRvIHplcm8uCi1cbm90ZXtGb3IgYmVzdCBtYXRjaCB3aXRoIGhhcmR3YXJlIGFuZCBuZXR3b3JrIHJlYWxpdGllcywgdGhlIHZhbHVlIG9mIAotXHZhcntidWZzaXplfSBzaG91bGQgYmUgYSByZWxhdGl2ZWx5IHNtYWxsIHBvd2VyIG9mIDIsIGZvciBleGFtcGxlLCA0MDk2Ln0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3NvY2tldF17cmVjdmZyb219e2J1ZnNpemVcb3B0aW9uYWx7LCBmbGFnc319Ci1SZWNlaXZlIGRhdGEgZnJvbSB0aGUgc29ja2V0LiAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIHBhaXIKLVxjb2RleyhcdmFye3N0cmluZ30sIFx2YXJ7YWRkcmVzc30pfSB3aGVyZSBcdmFye3N0cmluZ30gaXMgYSBzdHJpbmcKLXJlcHJlc2VudGluZyB0aGUgZGF0YSByZWNlaXZlZCBhbmQgXHZhcnthZGRyZXNzfSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUKLXNvY2tldCBzZW5kaW5nIHRoZSBkYXRhLiAgU2VlIHRoZSBcVU5JWHt9IG1hbnVhbCBwYWdlCi1cbWFucGFnZXtyZWN2fXsyfSBmb3IgdGhlIG1lYW5pbmcgb2YgdGhlIG9wdGlvbmFsIGFyZ3VtZW50Ci1cdmFye2ZsYWdzfTsgaXQgZGVmYXVsdHMgdG8gemVyby4KLShUaGUgZm9ybWF0IG9mIFx2YXJ7YWRkcmVzc30gZGVwZW5kcyBvbiB0aGUgYWRkcmVzcyBmYW1pbHkgLS0tIHNlZSBhYm92ZS4pCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtzb2NrZXRde3JlY3Zmcm9tX2ludG99e2J1ZmZlclxvcHRpb25hbHssIG5ieXRlc1xvcHRpb25hbHssIGZsYWdzfX19Ci1SZWNlaXZlIGRhdGEgZnJvbSB0aGUgc29ja2V0LCB3cml0aW5nIGl0IGludG8gXHZhcntidWZmZXJ9IGluc3RlYWQgb2YgCi1jcmVhdGluZyBhIG5ldyBzdHJpbmcuICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgcGFpcgotXGNvZGV7KFx2YXJ7bmJ5dGVzfSwgXHZhcnthZGRyZXNzfSl9IHdoZXJlIFx2YXJ7bmJ5dGVzfSBpcyB0aGUgbnVtYmVyCi1vZiBieXRlcyByZWNlaXZlZCBhbmQgXHZhcnthZGRyZXNzfSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgc29ja2V0Ci1zZW5kaW5nIHRoZSBkYXRhLiAgU2VlIHRoZSBcVU5JWHt9IG1hbnVhbCBwYWdlCi1cbWFucGFnZXtyZWN2fXsyfSBmb3IgdGhlIG1lYW5pbmcgb2YgdGhlIG9wdGlvbmFsIGFyZ3VtZW50Ci1cdmFye2ZsYWdzfTsgaXQgZGVmYXVsdHMgdG8gemVyby4gIChUaGUgZm9ybWF0IG9mIFx2YXJ7YWRkcmVzc30KLWRlcGVuZHMgb24gdGhlIGFkZHJlc3MgZmFtaWx5IC0tLSBzZWUgYWJvdmUuKQotXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtzb2NrZXRde3JlY3ZfaW50b317YnVmZmVyXG9wdGlvbmFseywgbmJ5dGVzXG9wdGlvbmFseywgZmxhZ3N9fX0KLVJlY2VpdmUgdXAgdG8gXHZhcntuYnl0ZXN9IGJ5dGVzIGZyb20gdGhlIHNvY2tldCwKLXN0b3JpbmcgdGhlIGRhdGEgaW50byBhIGJ1ZmZlciByYXRoZXIgdGhhbiBjcmVhdGluZyBhIG5ldyBzdHJpbmcuICAgIAotSWYgXHZhcntuYnl0ZXN9IGlzIG5vdCBzcGVjaWZpZWQgKG9yIDApLCAKLXJlY2VpdmUgdXAgdG8gdGhlIHNpemUgYXZhaWxhYmxlIGluIHRoZSBnaXZlbiBidWZmZXIuCi1TZWUgdGhlIFxVTklYe30gbWFudWFsIHBhZ2UgXG1hbnBhZ2V7cmVjdn17Mn0gZm9yIHRoZSBtZWFuaW5nIG9mIHRoZQotb3B0aW9uYWwgYXJndW1lbnQgXHZhcntmbGFnc307IGl0IGRlZmF1bHRzIHRvIHplcm8uCi1cdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3NvY2tldF17c2VuZH17c3RyaW5nXG9wdGlvbmFseywgZmxhZ3N9fQotU2VuZCBkYXRhIHRvIHRoZSBzb2NrZXQuICBUaGUgc29ja2V0IG11c3QgYmUgY29ubmVjdGVkIHRvIGEgcmVtb3RlCi1zb2NrZXQuICBUaGUgb3B0aW9uYWwgXHZhcntmbGFnc30gYXJndW1lbnQgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgZm9yCi1cbWV0aG9ke3JlY3YoKX0gYWJvdmUuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgc2VudC4KLUFwcGxpY2F0aW9ucyBhcmUgcmVzcG9uc2libGUgZm9yIGNoZWNraW5nIHRoYXQgYWxsIGRhdGEgaGFzIGJlZW4gc2VudDsKLWlmIG9ubHkgc29tZSBvZiB0aGUgZGF0YSB3YXMgdHJhbnNtaXR0ZWQsIHRoZSBhcHBsaWNhdGlvbiBuZWVkcyB0bwotYXR0ZW1wdCBkZWxpdmVyeSBvZiB0aGUgcmVtYWluaW5nIGRhdGEuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtzb2NrZXRde3NlbmRhbGx9e3N0cmluZ1xvcHRpb25hbHssIGZsYWdzfX0KLVNlbmQgZGF0YSB0byB0aGUgc29ja2V0LiAgVGhlIHNvY2tldCBtdXN0IGJlIGNvbm5lY3RlZCB0byBhIHJlbW90ZQotc29ja2V0LiAgVGhlIG9wdGlvbmFsIFx2YXJ7ZmxhZ3N9IGFyZ3VtZW50IGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIGZvcgotXG1ldGhvZHtyZWN2KCl9IGFib3ZlLiAgVW5saWtlIFxtZXRob2R7c2VuZCgpfSwgdGhpcyBtZXRob2QgY29udGludWVzCi10byBzZW5kIGRhdGEgZnJvbSBcdmFye3N0cmluZ30gdW50aWwgZWl0aGVyIGFsbCBkYXRhIGhhcyBiZWVuIHNlbnQgb3IKLWFuIGVycm9yIG9jY3Vycy4gIFxjb2Rle05vbmV9IGlzIHJldHVybmVkIG9uIHN1Y2Nlc3MuICBPbiBlcnJvciwgYW4KLWV4Y2VwdGlvbiBpcyByYWlzZWQsIGFuZCB0aGVyZSBpcyBubyB3YXkgdG8gZGV0ZXJtaW5lIGhvdyBtdWNoIGRhdGEsCi1pZiBhbnksIHdhcyBzdWNjZXNzZnVsbHkgc2VudC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3NvY2tldF17c2VuZHRvfXtzdHJpbmdcb3B0aW9uYWx7LCBmbGFnc30sIGFkZHJlc3N9Ci1TZW5kIGRhdGEgdG8gdGhlIHNvY2tldC4gIFRoZSBzb2NrZXQgc2hvdWxkIG5vdCBiZSBjb25uZWN0ZWQgdG8gYQotcmVtb3RlIHNvY2tldCwgc2luY2UgdGhlIGRlc3RpbmF0aW9uIHNvY2tldCBpcyBzcGVjaWZpZWQgYnkKLVx2YXJ7YWRkcmVzc30uICBUaGUgb3B0aW9uYWwgXHZhcntmbGFnc30gYXJndW1lbnQgaGFzIHRoZSBzYW1lCi1tZWFuaW5nIGFzIGZvciBcbWV0aG9ke3JlY3YoKX0gYWJvdmUuICBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBzZW50LgotKFRoZSBmb3JtYXQgb2YgXHZhcnthZGRyZXNzfSBkZXBlbmRzIG9uIHRoZSBhZGRyZXNzIGZhbWlseSAtLS0gc2VlIGFib3ZlLikKLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3NvY2tldF17c2V0YmxvY2tpbmd9e2ZsYWd9Ci1TZXQgYmxvY2tpbmcgb3Igbm9uLWJsb2NraW5nIG1vZGUgb2YgdGhlIHNvY2tldDogaWYgXHZhcntmbGFnfSBpcyAwLAotdGhlIHNvY2tldCBpcyBzZXQgdG8gbm9uLWJsb2NraW5nLCBlbHNlIHRvIGJsb2NraW5nIG1vZGUuICBJbml0aWFsbHkKLWFsbCBzb2NrZXRzIGFyZSBpbiBibG9ja2luZyBtb2RlLiAgSW4gbm9uLWJsb2NraW5nIG1vZGUsIGlmIGEKLVxtZXRob2R7cmVjdigpfSBjYWxsIGRvZXNuJ3QgZmluZCBhbnkgZGF0YSwgb3IgaWYgYQotXG1ldGhvZHtzZW5kKCl9IGNhbGwgY2FuJ3QgaW1tZWRpYXRlbHkgZGlzcG9zZSBvZiB0aGUgZGF0YSwgYQotXGV4Y2VwdGlvbntlcnJvcn0gZXhjZXB0aW9uIGlzIHJhaXNlZDsgaW4gYmxvY2tpbmcgbW9kZSwgdGhlIGNhbGxzCi1ibG9jayB1bnRpbCB0aGV5IGNhbiBwcm9jZWVkLgotXGNvZGV7cy5zZXRibG9ja2luZygwKX0gaXMgZXF1aXZhbGVudCB0byBcY29kZXtzLnNldHRpbWVvdXQoMCl9OwotXGNvZGV7cy5zZXRibG9ja2luZygxKX0gaXMgZXF1aXZhbGVudCB0byBcY29kZXtzLnNldHRpbWVvdXQoTm9uZSl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bc29ja2V0XXtzZXR0aW1lb3V0fXt2YWx1ZX0KLVNldCBhIHRpbWVvdXQgb24gYmxvY2tpbmcgc29ja2V0IG9wZXJhdGlvbnMuICBUaGUgXHZhcnt2YWx1ZX0gYXJndW1lbnQKLWNhbiBiZSBhIG5vbm5lZ2F0aXZlIGZsb2F0IGV4cHJlc3Npbmcgc2Vjb25kcywgb3IgXGNvZGV7Tm9uZX0uCi1JZiBhIGZsb2F0IGlzCi1naXZlbiwgc3Vic2VxdWVudCBzb2NrZXQgb3BlcmF0aW9ucyB3aWxsIHJhaXNlIGFuIFxleGNlcHRpb257dGltZW91dH0KLWV4Y2VwdGlvbiBpZiB0aGUgdGltZW91dCBwZXJpb2QgXHZhcnt2YWx1ZX0gaGFzIGVsYXBzZWQgYmVmb3JlIHRoZQotb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQuICBTZXR0aW5nIGEgdGltZW91dCBvZiBcY29kZXtOb25lfSBkaXNhYmxlcwotdGltZW91dHMgb24gc29ja2V0IG9wZXJhdGlvbnMuCi1cY29kZXtzLnNldHRpbWVvdXQoMC4wKX0gaXMgZXF1aXZhbGVudCB0byBcY29kZXtzLnNldGJsb2NraW5nKDApfTsKLVxjb2Rle3Muc2V0dGltZW91dChOb25lKX0gaXMgZXF1aXZhbGVudCB0byBcY29kZXtzLnNldGJsb2NraW5nKDEpfS4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bc29ja2V0XXtnZXR0aW1lb3V0fXt9Ci1SZXR1cm4gdGhlIHRpbWVvdXQgaW4gZmxvYXRpbmcgc2Vjb25kcyBhc3NvY2lhdGVkIHdpdGggc29ja2V0Ci1vcGVyYXRpb25zLCBvciBcY29kZXtOb25lfSBpZiBubyB0aW1lb3V0IGlzIHNldC4gIFRoaXMgcmVmbGVjdHMKLXRoZSBsYXN0IGNhbGwgdG8gXG1ldGhvZHtzZXRibG9ja2luZygpfSBvciBcbWV0aG9ke3NldHRpbWVvdXQoKX0uCi1cdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7bWV0aG9kZGVzY30KLQotU29tZSBub3RlcyBvbiBzb2NrZXQgYmxvY2tpbmcgYW5kIHRpbWVvdXRzOiBBIHNvY2tldCBvYmplY3QgY2FuIGJlIGluCi1vbmUgb2YgdGhyZWUgbW9kZXM6IGJsb2NraW5nLCBub24tYmxvY2tpbmcsIG9yIHRpbWVvdXQuICBTb2NrZXRzIGFyZQotYWx3YXlzIGNyZWF0ZWQgaW4gYmxvY2tpbmcgbW9kZS4gIEluIGJsb2NraW5nIG1vZGUsIG9wZXJhdGlvbnMgYmxvY2sKLXVudGlsIGNvbXBsZXRlLiAgSW4gbm9uLWJsb2NraW5nIG1vZGUsIG9wZXJhdGlvbnMgZmFpbCAod2l0aCBhbiBlcnJvcgotdGhhdCBpcyB1bmZvcnR1bmF0ZWx5IHN5c3RlbS1kZXBlbmRlbnQpIGlmIHRoZXkgY2Fubm90IGJlIGNvbXBsZXRlZAotaW1tZWRpYXRlbHkuICBJbiB0aW1lb3V0IG1vZGUsIG9wZXJhdGlvbnMgZmFpbCBpZiB0aGV5IGNhbm5vdCBiZQotY29tcGxldGVkIHdpdGhpbiB0aGUgdGltZW91dCBzcGVjaWZpZWQgZm9yIHRoZSBzb2NrZXQuICBUaGUKLVxtZXRob2R7c2V0YmxvY2tpbmcoKX0gbWV0aG9kIGlzIHNpbXBseSBhIHNob3J0aGFuZCBmb3IgY2VydGFpbgotXG1ldGhvZHtzZXR0aW1lb3V0KCl9IGNhbGxzLgotCi1UaW1lb3V0IG1vZGUgaW50ZXJuYWxseSBzZXRzIHRoZSBzb2NrZXQgaW4gbm9uLWJsb2NraW5nIG1vZGUuICBUaGUKLWJsb2NraW5nIGFuZCB0aW1lb3V0IG1vZGVzIGFyZSBzaGFyZWQgYmV0d2VlbiBmaWxlIGRlc2NyaXB0b3JzIGFuZAotc29ja2V0IG9iamVjdHMgdGhhdCByZWZlciB0byB0aGUgc2FtZSBuZXR3b3JrIGVuZHBvaW50LiAgQSBjb25zZXF1ZW5jZQotb2YgdGhpcyBpcyB0aGF0IGZpbGUgb2JqZWN0cyByZXR1cm5lZCBieSB0aGUgXG1ldGhvZHttYWtlZmlsZSgpfQotbWV0aG9kIG11c3Qgb25seSBiZSB1c2VkIHdoZW4gdGhlIHNvY2tldCBpcyBpbiBibG9ja2luZyBtb2RlOyBpbgotdGltZW91dCBvciBub24tYmxvY2tpbmcgbW9kZSBmaWxlIG9wZXJhdGlvbnMgdGhhdCBjYW5ub3QgYmUgY29tcGxldGVkCi1pbW1lZGlhdGVseSB3aWxsIGZhaWwuCi0KLU5vdGUgdGhhdCB0aGUgXG1ldGhvZHtjb25uZWN0KCl9IG9wZXJhdGlvbiBpcyBzdWJqZWN0IHRvIHRoZSB0aW1lb3V0Ci1zZXR0aW5nLCBhbmQgaW4gZ2VuZXJhbCBpdCBpcyByZWNvbW1lbmRlZCB0byBjYWxsCi1cbWV0aG9ke3NldHRpbWVvdXQoKX0gYmVmb3JlIGNhbGxpbmcgXG1ldGhvZHtjb25uZWN0KCl9LgotCi1cYmVnaW57bWV0aG9kZGVzY31bc29ja2V0XXtzZXRzb2Nrb3B0fXtsZXZlbCwgb3B0bmFtZSwgdmFsdWV9Ci1TZXQgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBzb2NrZXQgb3B0aW9uIChzZWUgdGhlIFxVTklYe30gbWFudWFsIHBhZ2UKLVxtYW5wYWdle3NldHNvY2tvcHR9ezJ9KS4gIFRoZSBuZWVkZWQgc3ltYm9saWMgY29uc3RhbnRzIGFyZSBkZWZpbmVkIGluCi10aGUgXG1vZHVsZXtzb2NrZXR9IG1vZHVsZSAoXGNvbnN0YW50e1NPXyp9IGV0Yy4pLiAgVGhlIHZhbHVlIGNhbiBiZSBhbgotaW50ZWdlciBvciBhIHN0cmluZyByZXByZXNlbnRpbmcgYSBidWZmZXIuICBJbiB0aGUgbGF0dGVyIGNhc2UgaXQgaXMKLXVwIHRvIHRoZSBjYWxsZXIgdG8gZW5zdXJlIHRoYXQgdGhlIHN0cmluZyBjb250YWlucyB0aGUgcHJvcGVyIGJpdHMKLShzZWUgdGhlIG9wdGlvbmFsIGJ1aWx0LWluIG1vZHVsZQotXHJlZm1vZHVsZXtzdHJ1Y3R9XHJlZmJpbW9kaW5kZXh7c3RydWN0fSBmb3IgYSB3YXkgdG8gZW5jb2RlIEMKLXN0cnVjdHVyZXMgYXMgc3RyaW5ncykuIAotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bc29ja2V0XXtzaHV0ZG93bn17aG93fQotU2h1dCBkb3duIG9uZSBvciBib3RoIGhhbHZlcyBvZiB0aGUgY29ubmVjdGlvbi4gIElmIFx2YXJ7aG93fSBpcwotXGNvbnN0YW50e1NIVVRfUkR9LCBmdXJ0aGVyIHJlY2VpdmVzIGFyZSBkaXNhbGxvd2VkLiAgSWYgXHZhcntob3d9IGlzIFxjb25zdGFudHtTSFVUX1dSfSwKLWZ1cnRoZXIgc2VuZHMgYXJlIGRpc2FsbG93ZWQuICBJZiBcdmFye2hvd30gaXMgXGNvbnN0YW50e1NIVVRfUkRXUn0sIGZ1cnRoZXIgc2VuZHMKLWFuZCByZWNlaXZlcyBhcmUgZGlzYWxsb3dlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotTm90ZSB0aGF0IHRoZXJlIGFyZSBubyBtZXRob2RzIFxtZXRob2R7cmVhZCgpfSBvciBcbWV0aG9ke3dyaXRlKCl9OwotdXNlIFxtZXRob2R7cmVjdigpfSBhbmQgXG1ldGhvZHtzZW5kKCl9IHdpdGhvdXQgXHZhcntmbGFnc30gYXJndW1lbnQKLWluc3RlYWQuCi0KLQotU29ja2V0IG9iamVjdHMgYWxzbyBoYXZlIHRoZXNlIChyZWFkLW9ubHkpIGF0dHJpYnV0ZXMgdGhhdCBjb3JyZXNwb25kCi10byB0aGUgdmFsdWVzIGdpdmVuIHRvIHRoZSBcY2xhc3N7c29ja2V0fSBjb25zdHJ1Y3Rvci4KLQotXGJlZ2lue21lbWJlcmRlc2N9W3NvY2tldF17ZmFtaWx5fQotVGhlIHNvY2tldCBmYW1pbHkuCi1cdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W3NvY2tldF17dHlwZX0KLVRoZSBzb2NrZXQgdHlwZS4KLVx2ZXJzaW9uYWRkZWR7Mi41fQotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bc29ja2V0XXtwcm90b30KLVRoZSBzb2NrZXQgcHJvdG9jb2wuCi1cdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7bWVtYmVyZGVzY30KLQotCi1cc3Vic2VjdGlvbntTU0wgT2JqZWN0cyBcbGFiZWx7c3NsLW9iamVjdHN9fQotCi1TU0wgb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kcy4KLQotXGJlZ2lue21ldGhvZGRlc2N9W1NTTF17d3JpdGV9e3N9Ci1Xcml0ZXMgdGhlIHN0cmluZyBcdmFye3N9IHRvIHRoZSBvbiB0aGUgb2JqZWN0J3MgU1NMIGNvbm5lY3Rpb24uCi1UaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1NTTF17cmVhZH17XG9wdGlvbmFse259fQotSWYgXHZhcntufSBpcyBwcm92aWRlZCwgcmVhZCBcdmFye259IGJ5dGVzIGZyb20gdGhlIFNTTCBjb25uZWN0aW9uLCBvdGhlcndpc2UKLXJlYWQgdW50aWwgRU9GLiBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgc3RyaW5nIG9mIHRoZSBieXRlcyByZWFkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bU1NMXXtzZXJ2ZXJ9e30KLVJldHVybnMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgc2VydmVyJ3MgY2VydGlmaWNhdGUuCi1Vc2VmdWwgZm9yIGRlYnVnZ2luZyBwdXJwb3NlczsgZG8gbm90IHBhcnNlIHRoZSBjb250ZW50IG9mIHRoaXMgc3RyaW5nCi1iZWNhdXNlIGl0cyBmb3JtYXQgY2FuJ3QgYmUgcGFyc2VkIHVuYW1iaWd1b3VzbHkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtTU0xde2lzc3Vlcn17fQotUmV0dXJucyBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBpc3N1ZXIgb2YgdGhlIHNlcnZlcidzIGNlcnRpZmljYXRlLgotVXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXM7IGRvIG5vdCBwYXJzZSB0aGUgY29udGVudCBvZiB0aGlzIHN0cmluZwotYmVjYXVzZSBpdHMgZm9ybWF0IGNhbid0IGJlIHBhcnNlZCB1bmFtYmlndW91c2x5LgotXGVuZHttZXRob2RkZXNjfQotCi1cc3Vic2VjdGlvbntFeGFtcGxlIFxsYWJlbHtzb2NrZXQtZXhhbXBsZX19Ci0KLUhlcmUgYXJlIGZvdXIgbWluaW1hbCBleGFtcGxlIHByb2dyYW1zIHVzaW5nIHRoZSBUQ1AvSVAgcHJvdG9jb2w6XCBhCi1zZXJ2ZXIgdGhhdCBlY2hvZXMgYWxsIGRhdGEgdGhhdCBpdCByZWNlaXZlcyBiYWNrIChzZXJ2aWNpbmcgb25seSBvbmUKLWNsaWVudCksIGFuZCBhIGNsaWVudCB1c2luZyBpdC4gIE5vdGUgdGhhdCBhIHNlcnZlciBtdXN0IHBlcmZvcm0gdGhlCi1zZXF1ZW5jZSBcZnVuY3Rpb257c29ja2V0KCl9LCBcbWV0aG9ke2JpbmQoKX0sIFxtZXRob2R7bGlzdGVuKCl9LAotXG1ldGhvZHthY2NlcHQoKX0gKHBvc3NpYmx5IHJlcGVhdGluZyB0aGUgXG1ldGhvZHthY2NlcHQoKX0gdG8gc2VydmljZQotbW9yZSB0aGFuIG9uZSBjbGllbnQpLCB3aGlsZSBhIGNsaWVudCBvbmx5IG5lZWRzIHRoZSBzZXF1ZW5jZQotXGZ1bmN0aW9ue3NvY2tldCgpfSwgXG1ldGhvZHtjb25uZWN0KCl9LiAgQWxzbyBub3RlIHRoYXQgdGhlIHNlcnZlcgotZG9lcyBub3QgXG1ldGhvZHtzZW5kKCl9L1xtZXRob2R7cmVjdigpfSBvbiB0aGUgCi1zb2NrZXQgaXQgaXMgbGlzdGVuaW5nIG9uIGJ1dCBvbiB0aGUgbmV3IHNvY2tldCByZXR1cm5lZCBieQotXG1ldGhvZHthY2NlcHQoKX0uCi0KLVRoZSBmaXJzdCB0d28gZXhhbXBsZXMgc3VwcG9ydCBJUHY0IG9ubHkuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLSMgRWNobyBzZXJ2ZXIgcHJvZ3JhbQotaW1wb3J0IHNvY2tldAotCi1IT1NUID0gJycgICAgICAgICAgICAgICAgICMgU3ltYm9saWMgbmFtZSBtZWFuaW5nIHRoZSBsb2NhbCBob3N0Ci1QT1JUID0gNTAwMDcgICAgICAgICAgICAgICMgQXJiaXRyYXJ5IG5vbi1wcml2aWxlZ2VkIHBvcnQKLXMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCi1zLmJpbmQoKEhPU1QsIFBPUlQpKQotcy5saXN0ZW4oMSkKLWNvbm4sIGFkZHIgPSBzLmFjY2VwdCgpCi1wcmludCAnQ29ubmVjdGVkIGJ5JywgYWRkcgotd2hpbGUgMToKLSAgICBkYXRhID0gY29ubi5yZWN2KDEwMjQpCi0gICAgaWYgbm90IGRhdGE6IGJyZWFrCi0gICAgY29ubi5zZW5kKGRhdGEpCi1jb25uLmNsb3NlKCkKLVxlbmR7dmVyYmF0aW19Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSMgRWNobyBjbGllbnQgcHJvZ3JhbQotaW1wb3J0IHNvY2tldAotCi1IT1NUID0gJ2RhcmluZy5jd2kubmwnICAgICMgVGhlIHJlbW90ZSBob3N0Ci1QT1JUID0gNTAwMDcgICAgICAgICAgICAgICMgVGhlIHNhbWUgcG9ydCBhcyB1c2VkIGJ5IHRoZSBzZXJ2ZXIKLXMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCi1zLmNvbm5lY3QoKEhPU1QsIFBPUlQpKQotcy5zZW5kKCdIZWxsbywgd29ybGQnKQotZGF0YSA9IHMucmVjdigxMDI0KQotcy5jbG9zZSgpCi1wcmludCAnUmVjZWl2ZWQnLCByZXByKGRhdGEpCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgbmV4dCB0d28gZXhhbXBsZXMgYXJlIGlkZW50aWNhbCB0byB0aGUgYWJvdmUgdHdvLCBidXQgc3VwcG9ydCBib3RoCi1JUHY0IGFuZCBJUHY2LgotVGhlIHNlcnZlciBzaWRlIHdpbGwgbGlzdGVuIHRvIHRoZSBmaXJzdCBhZGRyZXNzIGZhbWlseSBhdmFpbGFibGUKLShpdCBzaG91bGQgbGlzdGVuIHRvIGJvdGggaW5zdGVhZCkuCi1PbiBtb3N0IG9mIElQdjYtcmVhZHkgc3lzdGVtcywgSVB2NiB3aWxsIHRha2UgcHJlY2VkZW5jZQotYW5kIHRoZSBzZXJ2ZXIgbWF5IG5vdCBhY2NlcHQgSVB2NCB0cmFmZmljLgotVGhlIGNsaWVudCBzaWRlIHdpbGwgdHJ5IHRvIGNvbm5lY3QgdG8gdGhlIGFsbCBhZGRyZXNzZXMgcmV0dXJuZWQgYXMgYSByZXN1bHQKLW9mIHRoZSBuYW1lIHJlc29sdXRpb24sIGFuZCBzZW5kcyB0cmFmZmljIHRvIHRoZSBmaXJzdCBvbmUgY29ubmVjdGVkCi1zdWNjZXNzZnVsbHkuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLSMgRWNobyBzZXJ2ZXIgcHJvZ3JhbQotaW1wb3J0IHNvY2tldAotaW1wb3J0IHN5cwotCi1IT1NUID0gJycgICAgICAgICAgICAgICAgICMgU3ltYm9saWMgbmFtZSBtZWFuaW5nIHRoZSBsb2NhbCBob3N0Ci1QT1JUID0gNTAwMDcgICAgICAgICAgICAgICMgQXJiaXRyYXJ5IG5vbi1wcml2aWxlZ2VkIHBvcnQKLXMgPSBOb25lCi1mb3IgcmVzIGluIHNvY2tldC5nZXRhZGRyaW5mbyhIT1NULCBQT1JULCBzb2NrZXQuQUZfVU5TUEVDLCBzb2NrZXQuU09DS19TVFJFQU0sIDAsIHNvY2tldC5BSV9QQVNTSVZFKToKLSAgICBhZiwgc29ja3R5cGUsIHByb3RvLCBjYW5vbm5hbWUsIHNhID0gcmVzCi0gICAgdHJ5OgotCXMgPSBzb2NrZXQuc29ja2V0KGFmLCBzb2NrdHlwZSwgcHJvdG8pCi0gICAgZXhjZXB0IHNvY2tldC5lcnJvciBhcyBtc2c6Ci0JcyA9IE5vbmUKLQljb250aW51ZQotICAgIHRyeToKLQlzLmJpbmQoc2EpCi0Jcy5saXN0ZW4oMSkKLSAgICBleGNlcHQgc29ja2V0LmVycm9yIGFzIG1zZzoKLQlzLmNsb3NlKCkKLQlzID0gTm9uZQotCWNvbnRpbnVlCi0gICAgYnJlYWsKLWlmIHMgaXMgTm9uZToKLSAgICBwcmludCAnY291bGQgbm90IG9wZW4gc29ja2V0JwotICAgIHN5cy5leGl0KDEpCi1jb25uLCBhZGRyID0gcy5hY2NlcHQoKQotcHJpbnQgJ0Nvbm5lY3RlZCBieScsIGFkZHIKLXdoaWxlIDE6Ci0gICAgZGF0YSA9IGNvbm4ucmVjdigxMDI0KQotICAgIGlmIG5vdCBkYXRhOiBicmVhawotICAgIGNvbm4uc2VuZChkYXRhKQotY29ubi5jbG9zZSgpCi1cZW5ke3ZlcmJhdGltfQotCi1cYmVnaW57dmVyYmF0aW19Ci0jIEVjaG8gY2xpZW50IHByb2dyYW0KLWltcG9ydCBzb2NrZXQKLWltcG9ydCBzeXMKLQotSE9TVCA9ICdkYXJpbmcuY3dpLm5sJyAgICAjIFRoZSByZW1vdGUgaG9zdAotUE9SVCA9IDUwMDA3ICAgICAgICAgICAgICAjIFRoZSBzYW1lIHBvcnQgYXMgdXNlZCBieSB0aGUgc2VydmVyCi1zID0gTm9uZQotZm9yIHJlcyBpbiBzb2NrZXQuZ2V0YWRkcmluZm8oSE9TVCwgUE9SVCwgc29ja2V0LkFGX1VOU1BFQywgc29ja2V0LlNPQ0tfU1RSRUFNKToKLSAgICBhZiwgc29ja3R5cGUsIHByb3RvLCBjYW5vbm5hbWUsIHNhID0gcmVzCi0gICAgdHJ5OgotCXMgPSBzb2NrZXQuc29ja2V0KGFmLCBzb2NrdHlwZSwgcHJvdG8pCi0gICAgZXhjZXB0IHNvY2tldC5lcnJvciBhcyBtc2c6Ci0JcyA9IE5vbmUKLQljb250aW51ZQotICAgIHRyeToKLQlzLmNvbm5lY3Qoc2EpCi0gICAgZXhjZXB0IHNvY2tldC5lcnJvciBhcyBtc2c6Ci0Jcy5jbG9zZSgpCi0JcyA9IE5vbmUKLQljb250aW51ZQotICAgIGJyZWFrCi1pZiBzIGlzIE5vbmU6Ci0gICAgcHJpbnQgJ2NvdWxkIG5vdCBvcGVuIHNvY2tldCcKLSAgICBzeXMuZXhpdCgxKQotcy5zZW5kKCdIZWxsbywgd29ybGQnKQotZGF0YSA9IHMucmVjdigxMDI0KQotcy5jbG9zZSgpCi1wcmludCAnUmVjZWl2ZWQnLCByZXByKGRhdGEpCi1cZW5ke3ZlcmJhdGltfQotCi1UaGlzIGV4YW1wbGUgY29ubmVjdHMgdG8gYW4gU1NMIHNlcnZlciwgcHJpbnRzIHRoZSAKLXNlcnZlciBhbmQgaXNzdWVyJ3MgZGlzdGluZ3Vpc2hlZCBuYW1lcywgc2VuZHMgc29tZSBieXRlcywKLWFuZCByZWFkcyBwYXJ0IG9mIHRoZSByZXNwb25zZToKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IHNvY2tldAotCi1zID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQotcy5jb25uZWN0KCgnd3d3LnZlcmlzaWduLmNvbScsIDQ0MykpCi0KLXNzbF9zb2NrID0gc29ja2V0LnNzbChzKQotCi1wcmludCByZXByKHNzbF9zb2NrLnNlcnZlcigpKQotcHJpbnQgcmVwcihzc2xfc29jay5pc3N1ZXIoKSkKLQotIyBTZXQgYSBzaW1wbGUgSFRUUCByZXF1ZXN0IC0tIHVzZSBodHRwbGliIGluIGFjdHVhbCBjb2RlLgotc3NsX3NvY2sud3JpdGUoIiIiR0VUIC8gSFRUUC8xLjBccgotSG9zdDogd3d3LnZlcmlzaWduLmNvbVxyXG5cclxuIiIiKQotCi0jIFJlYWQgYSBjaHVuayBvZiBkYXRhLiAgV2lsbCBub3QgbmVjZXNzYXJpbHkKLSMgcmVhZCBhbGwgdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHNlcnZlci4KLWRhdGEgPSBzc2xfc29jay5yZWFkKCkKLQotIyBOb3RlIHRoYXQgeW91IG5lZWQgdG8gY2xvc2UgdGhlIHVuZGVybHlpbmcgc29ja2V0LCBub3QgdGhlIFNTTCBvYmplY3QuCi1kZWwgc3NsX3NvY2sKLXMuY2xvc2UoKQotXGVuZHt2ZXJiYXRpbX0KLQotQXQgdGhpcyB3cml0aW5nLCB0aGlzIFNTTCBleGFtcGxlIHByaW50cyB0aGUgZm9sbG93aW5nIG91dHB1dCAobGluZQotYnJlYWtzIGluc2VydGVkIGZvciByZWFkYWJpbGl0eSk6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLScvQz1VUy9TVD1DYWxpZm9ybmlhL0w9TW91bnRhaW4gVmlldy8KLSBPPVZlcmlTaWduLCBJbmMuL09VPVByb2R1Y3Rpb24gU2VydmljZXMvCi0gT1U9VGVybXMgb2YgdXNlIGF0IHd3dy52ZXJpc2lnbi5jb20vcnBhIChjKTAwLwotIENOPXd3dy52ZXJpc2lnbi5jb20nCi0nL089VmVyaVNpZ24gVHJ1c3QgTmV0d29yay9PVT1WZXJpU2lnbiwgSW5jLi8KLSBPVT1WZXJpU2lnbiBJbnRlcm5hdGlvbmFsIFNlcnZlciBDQSAtIENsYXNzIDMvCi0gT1U9d3d3LnZlcmlzaWduLmNvbS9DUFMgSW5jb3JwLmJ5IFJlZi4gTElBQklMSVRZIExURC4oYyk5NyBWZXJpU2lnbicKLVxlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnNvY2tzdnIudGV4IGIvRG9jL2xpYi9saWJzb2Nrc3ZyLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdiMjhlYS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnNvY2tzdnIudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7U29ja2V0U2VydmVyfSAtLS0KLSAgICAgICAgIEEgZnJhbWV3b3JrIGZvciBuZXR3b3JrIHNlcnZlcnN9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtTb2NrZXRTZXJ2ZXJ9Ci1cbW9kdWxlc3lub3BzaXN7QSBmcmFtZXdvcmsgZm9yIG5ldHdvcmsgc2VydmVycy59Ci0KLQotVGhlIFxtb2R1bGV7U29ja2V0U2VydmVyfSBtb2R1bGUgc2ltcGxpZmllcyB0aGUgdGFzayBvZiB3cml0aW5nIG5ldHdvcmsKLXNlcnZlcnMuCi0KLVRoZXJlIGFyZSBmb3VyIGJhc2ljIHNlcnZlciBjbGFzc2VzOiBcY2xhc3N7VENQU2VydmVyfSB1c2VzIHRoZQotSW50ZXJuZXQgVENQIHByb3RvY29sLCB3aGljaCBwcm92aWRlcyBmb3IgY29udGludW91cyBzdHJlYW1zIG9mIGRhdGEKLWJldHdlZW4gdGhlIGNsaWVudCBhbmQgc2VydmVyLiAgXGNsYXNze1VEUFNlcnZlcn0gdXNlcyBkYXRhZ3JhbXMsIHdoaWNoCi1hcmUgZGlzY3JldGUgcGFja2V0cyBvZiBpbmZvcm1hdGlvbiB0aGF0IG1heSBhcnJpdmUgb3V0IG9mIG9yZGVyIG9yIGJlCi1sb3N0IHdoaWxlIGluIHRyYW5zaXQuICBUaGUgbW9yZSBpbmZyZXF1ZW50bHkgdXNlZAotXGNsYXNze1VuaXhTdHJlYW1TZXJ2ZXJ9IGFuZCBcY2xhc3N7VW5peERhdGFncmFtU2VydmVyfSBjbGFzc2VzIGFyZQotc2ltaWxhciwgYnV0IHVzZSBcVU5JWHt9IGRvbWFpbiBzb2NrZXRzOyB0aGV5J3JlIG5vdCBhdmFpbGFibGUgb24KLW5vbi1cVU5JWHt9IHBsYXRmb3Jtcy4gIEZvciBtb3JlIGRldGFpbHMgb24gbmV0d29yayBwcm9ncmFtbWluZywgY29uc3VsdAotYSBib29rIHN1Y2ggYXMgVy4gUmljaGFyZCBTdGV2ZW4ncyBcY2l0ZXRpdGxle1VOSVggTmV0d29yayBQcm9ncmFtbWluZ30KLW9yIFJhbHBoIERhdmlzJ3MgXGNpdGV0aXRsZXtXaW4zMiBOZXR3b3JrIFByb2dyYW1taW5nfS4KLQotVGhlc2UgZm91ciBjbGFzc2VzIHByb2Nlc3MgcmVxdWVzdHMgXGRmbntzeW5jaHJvbm91c2x5fTsgZWFjaCByZXF1ZXN0Ci1tdXN0IGJlIGNvbXBsZXRlZCBiZWZvcmUgdGhlIG5leHQgcmVxdWVzdCBjYW4gYmUgc3RhcnRlZC4gIFRoaXMgaXNuJ3QKLXN1aXRhYmxlIGlmIGVhY2ggcmVxdWVzdCB0YWtlcyBhIGxvbmcgdGltZSB0byBjb21wbGV0ZSwgYmVjYXVzZSBpdAotcmVxdWlyZXMgYSBsb3Qgb2YgY29tcHV0YXRpb24sIG9yIGJlY2F1c2UgaXQgcmV0dXJucyBhIGxvdCBvZiBkYXRhCi13aGljaCB0aGUgY2xpZW50IGlzIHNsb3cgdG8gcHJvY2Vzcy4gIFRoZSBzb2x1dGlvbiBpcyB0byBjcmVhdGUgYQotc2VwYXJhdGUgcHJvY2VzcyBvciB0aHJlYWQgdG8gaGFuZGxlIGVhY2ggcmVxdWVzdDsgdGhlCi1cY2xhc3N7Rm9ya2luZ01peElufSBhbmQgXGNsYXNze1RocmVhZGluZ01peElufSBtaXgtaW4gY2xhc3NlcyBjYW4gYmUKLXVzZWQgdG8gc3VwcG9ydCBhc3luY2hyb25vdXMgYmVoYXZpb3VyLgotCi1DcmVhdGluZyBhIHNlcnZlciByZXF1aXJlcyBzZXZlcmFsIHN0ZXBzLiAgRmlyc3QsIHlvdSBtdXN0IGNyZWF0ZSBhCi1yZXF1ZXN0IGhhbmRsZXIgY2xhc3MgYnkgc3ViY2xhc3NpbmcgdGhlIFxjbGFzc3tCYXNlUmVxdWVzdEhhbmRsZXJ9Ci1jbGFzcyBhbmQgb3ZlcnJpZGluZyBpdHMgXG1ldGhvZHtoYW5kbGUoKX0gbWV0aG9kOyB0aGlzIG1ldGhvZCB3aWxsCi1wcm9jZXNzIGluY29taW5nIHJlcXVlc3RzLiAgU2Vjb25kLCB5b3UgbXVzdCBpbnN0YW50aWF0ZSBvbmUgb2YgdGhlCi1zZXJ2ZXIgY2xhc3NlcywgcGFzc2luZyBpdCB0aGUgc2VydmVyJ3MgYWRkcmVzcyBhbmQgdGhlIHJlcXVlc3QKLWhhbmRsZXIgY2xhc3MuICBGaW5hbGx5LCBjYWxsIHRoZSBcbWV0aG9ke2hhbmRsZV9yZXF1ZXN0KCl9IG9yCi1cbWV0aG9ke3NlcnZlX2ZvcmV2ZXIoKX0gbWV0aG9kIG9mIHRoZSBzZXJ2ZXIgb2JqZWN0IHRvIHByb2Nlc3Mgb25lIG9yCi1tYW55IHJlcXVlc3RzLgotCi1XaGVuIGluaGVyaXRpbmcgZnJvbSBcY2xhc3N7VGhyZWFkaW5nTWl4SW59IGZvciB0aHJlYWRlZCBjb25uZWN0aW9uCi1iZWhhdmlvciwgeW91IHNob3VsZCBleHBsaWNpdGx5IGRlY2xhcmUgaG93IHlvdSB3YW50IHlvdXIgdGhyZWFkcwotdG8gYmVoYXZlIG9uIGFuIGFicnVwdCBzaHV0ZG93bi4gVGhlIFxjbGFzc3tUaHJlYWRpbmdNaXhJbn0gY2xhc3MKLWRlZmluZXMgYW4gYXR0cmlidXRlIFx2YXJ7ZGFlbW9uX3RocmVhZHN9LCB3aGljaCBpbmRpY2F0ZXMgd2hldGhlcgotb3Igbm90IHRoZSBzZXJ2ZXIgc2hvdWxkIHdhaXQgZm9yIHRocmVhZCB0ZXJtaW5hdGlvbi4gWW91IHNob3VsZAotc2V0IHRoZSBmbGFnIGV4cGxpY2l0bHkgaWYgeW91IHdvdWxkIGxpa2UgdGhyZWFkcyB0byBiZWhhdmUKLWF1dG9ub21vdXNseTsgdGhlIGRlZmF1bHQgaXMgXGNvbnN0YW50e0ZhbHNlfSwgbWVhbmluZyB0aGF0IFB5dGhvbgotd2lsbCBub3QgZXhpdCB1bnRpbCBhbGwgdGhyZWFkcyBjcmVhdGVkIGJ5IFxjbGFzc3tUaHJlYWRpbmdNaXhJbn0gaGF2ZQotZXhpdGVkLgotCi1TZXJ2ZXIgY2xhc3NlcyBoYXZlIHRoZSBzYW1lIGV4dGVybmFsIG1ldGhvZHMgYW5kIGF0dHJpYnV0ZXMsIG5vCi1tYXR0ZXIgd2hhdCBuZXR3b3JrIHByb3RvY29sIHRoZXkgdXNlOgotCi1cc2V0aW5kZXhzdWJpdGVteyhTb2NrZXRTZXJ2ZXIgcHJvdG9jb2wpfQotCi1cc3Vic2VjdGlvbntTZXJ2ZXIgQ3JlYXRpb24gTm90ZXN9Ci0KLVRoZXJlIGFyZSBmaXZlIGNsYXNzZXMgaW4gYW4gaW5oZXJpdGFuY2UgZGlhZ3JhbSwgZm91ciBvZiB3aGljaCByZXByZXNlbnQKLXN5bmNocm9ub3VzIHNlcnZlcnMgb2YgZm91ciB0eXBlczoKLQotXGJlZ2lue3ZlcmJhdGltfQotICAgICAgICArLS0tLS0tLS0tLS0tKwotICAgICAgICB8IEJhc2VTZXJ2ZXIgfAotICAgICAgICArLS0tLS0tLS0tLS0tKwotICAgICAgICAgICAgICB8Ci0gICAgICAgICAgICAgIHYKLSAgICAgICAgKy0tLS0tLS0tLS0tKyAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgICAgICAgfCBUQ1BTZXJ2ZXIgfC0tLS0tLS0+fCBVbml4U3RyZWFtU2VydmVyIHwKLSAgICAgICAgKy0tLS0tLS0tLS0tKyAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgICAgICAgICAgICAgfAotICAgICAgICAgICAgICB2Ci0gICAgICAgICstLS0tLS0tLS0tLSsgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgICAgICAgfCBVRFBTZXJ2ZXIgfC0tLS0tLS0+fCBVbml4RGF0YWdyYW1TZXJ2ZXIgfAotICAgICAgICArLS0tLS0tLS0tLS0rICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi1cZW5ke3ZlcmJhdGltfQotCi1Ob3RlIHRoYXQgXGNsYXNze1VuaXhEYXRhZ3JhbVNlcnZlcn0gZGVyaXZlcyBmcm9tIFxjbGFzc3tVRFBTZXJ2ZXJ9LCBub3QKLWZyb20gXGNsYXNze1VuaXhTdHJlYW1TZXJ2ZXJ9IC0tLSB0aGUgb25seSBkaWZmZXJlbmNlIGJldHdlZW4gYW4gSVAgYW5kIGEKLVxVTklYe30gc3RyZWFtIHNlcnZlciBpcyB0aGUgYWRkcmVzcyBmYW1pbHksIHdoaWNoIGlzIHNpbXBseSByZXBlYXRlZCBpbiBib3RoCi1cVU5JWHt9IHNlcnZlciBjbGFzc2VzLgotCi1Gb3JraW5nIGFuZCB0aHJlYWRpbmcgdmVyc2lvbnMgb2YgZWFjaCB0eXBlIG9mIHNlcnZlciBjYW4gYmUgY3JlYXRlZCB1c2luZwotdGhlIFxjbGFzc3tGb3JraW5nTWl4SW59IGFuZCBcY2xhc3N7VGhyZWFkaW5nTWl4SW59IG1peC1pbiBjbGFzc2VzLiAgRm9yCi1pbnN0YW5jZSwgYSB0aHJlYWRpbmcgVURQIHNlcnZlciBjbGFzcyBpcyBjcmVhdGVkIGFzIGZvbGxvd3M6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICBjbGFzcyBUaHJlYWRpbmdVRFBTZXJ2ZXIoVGhyZWFkaW5nTWl4SW4sIFVEUFNlcnZlcik6IHBhc3MKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBtaXgtaW4gY2xhc3MgbXVzdCBjb21lIGZpcnN0LCBzaW5jZSBpdCBvdmVycmlkZXMgYSBtZXRob2QgZGVmaW5lZCBpbgotXGNsYXNze1VEUFNlcnZlcn0uICBTZXR0aW5nIHRoZSB2YXJpb3VzIG1lbWJlciB2YXJpYWJsZXMgYWxzbyBjaGFuZ2VzIHRoZQotYmVoYXZpb3Igb2YgdGhlIHVuZGVybHlpbmcgc2VydmVyIG1lY2hhbmlzbS4KLQotVG8gaW1wbGVtZW50IGEgc2VydmljZSwgeW91IG11c3QgZGVyaXZlIGEgY2xhc3MgZnJvbQotXGNsYXNze0Jhc2VSZXF1ZXN0SGFuZGxlcn0gYW5kIHJlZGVmaW5lIGl0cyBcbWV0aG9ke2hhbmRsZSgpfSBtZXRob2QuICBZb3UKLWNhbiB0aGVuIHJ1biB2YXJpb3VzIHZlcnNpb25zIG9mIHRoZSBzZXJ2aWNlIGJ5IGNvbWJpbmluZyBvbmUgb2YgdGhlIHNlcnZlcgotY2xhc3NlcyB3aXRoIHlvdXIgcmVxdWVzdCBoYW5kbGVyIGNsYXNzLiAgVGhlIHJlcXVlc3QgaGFuZGxlciBjbGFzcyBtdXN0IGJlCi1kaWZmZXJlbnQgZm9yIGRhdGFncmFtIG9yIHN0cmVhbSBzZXJ2aWNlcy4gIFRoaXMgY2FuIGJlIGhpZGRlbiBieSB1c2luZyB0aGUKLWhhbmRsZXIgc3ViY2xhc3NlcyBcY2xhc3N7U3RyZWFtUmVxdWVzdEhhbmRsZXJ9IG9yIFxjbGFzc3tEYXRhZ3JhbVJlcXVlc3RIYW5kbGVyfS4KLQotT2YgY291cnNlLCB5b3Ugc3RpbGwgaGF2ZSB0byB1c2UgeW91ciBoZWFkISAgRm9yIGluc3RhbmNlLCBpdCBtYWtlcyBubyBzZW5zZQotdG8gdXNlIGEgZm9ya2luZyBzZXJ2ZXIgaWYgdGhlIHNlcnZpY2UgY29udGFpbnMgc3RhdGUgaW4gbWVtb3J5IHRoYXQgY2FuIGJlCi1tb2RpZmllZCBieSBkaWZmZXJlbnQgcmVxdWVzdHMsIHNpbmNlIHRoZSBtb2RpZmljYXRpb25zIGluIHRoZSBjaGlsZCBwcm9jZXNzCi13b3VsZCBuZXZlciByZWFjaCB0aGUgaW5pdGlhbCBzdGF0ZSBrZXB0IGluIHRoZSBwYXJlbnQgcHJvY2VzcyBhbmQgcGFzc2VkIHRvCi1lYWNoIGNoaWxkLiAgSW4gdGhpcyBjYXNlLCB5b3UgY2FuIHVzZSBhIHRocmVhZGluZyBzZXJ2ZXIsIGJ1dCB5b3Ugd2lsbAotcHJvYmFibHkgaGF2ZSB0byB1c2UgbG9ja3MgdG8gcHJvdGVjdCB0aGUgaW50ZWdyaXR5IG9mIHRoZSBzaGFyZWQgZGF0YS4KLQotT24gdGhlIG90aGVyIGhhbmQsIGlmIHlvdSBhcmUgYnVpbGRpbmcgYW4gSFRUUCBzZXJ2ZXIgd2hlcmUgYWxsIGRhdGEgaXMKLXN0b3JlZCBleHRlcm5hbGx5IChmb3IgaW5zdGFuY2UsIGluIHRoZSBmaWxlIHN5c3RlbSksIGEgc3luY2hyb25vdXMgY2xhc3MKLXdpbGwgZXNzZW50aWFsbHkgcmVuZGVyIHRoZSBzZXJ2aWNlICJkZWFmIiB3aGlsZSBvbmUgcmVxdWVzdCBpcyBiZWluZwotaGFuZGxlZCAtLSB3aGljaCBtYXkgYmUgZm9yIGEgdmVyeSBsb25nIHRpbWUgaWYgYSBjbGllbnQgaXMgc2xvdyB0byByZWNlaXZlCi1hbGwgdGhlIGRhdGEgaXQgaGFzIHJlcXVlc3RlZC4gIEhlcmUgYSB0aHJlYWRpbmcgb3IgZm9ya2luZyBzZXJ2ZXIgaXMKLWFwcHJvcHJpYXRlLgotCi1JbiBzb21lIGNhc2VzLCBpdCBtYXkgYmUgYXBwcm9wcmlhdGUgdG8gcHJvY2VzcyBwYXJ0IG9mIGEgcmVxdWVzdAotc3luY2hyb25vdXNseSwgYnV0IHRvIGZpbmlzaCBwcm9jZXNzaW5nIGluIGEgZm9ya2VkIGNoaWxkIGRlcGVuZGluZyBvbiB0aGUKLXJlcXVlc3QgZGF0YS4gIFRoaXMgY2FuIGJlIGltcGxlbWVudGVkIGJ5IHVzaW5nIGEgc3luY2hyb25vdXMgc2VydmVyIGFuZAotZG9pbmcgYW4gZXhwbGljaXQgZm9yayBpbiB0aGUgcmVxdWVzdCBoYW5kbGVyIGNsYXNzIFxtZXRob2R7aGFuZGxlKCl9Ci1tZXRob2QuCi0KLUFub3RoZXIgYXBwcm9hY2ggdG8gaGFuZGxpbmcgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHJlcXVlc3RzIGluIGFuCi1lbnZpcm9ubWVudCB0aGF0IHN1cHBvcnRzIG5laXRoZXIgdGhyZWFkcyBub3IgXGZ1bmN0aW9ue2ZvcmsoKX0gKG9yIHdoZXJlCi10aGVzZSBhcmUgdG9vIGV4cGVuc2l2ZSBvciBpbmFwcHJvcHJpYXRlIGZvciB0aGUgc2VydmljZSkgaXMgdG8gbWFpbnRhaW4gYW4KLWV4cGxpY2l0IHRhYmxlIG9mIHBhcnRpYWxseSBmaW5pc2hlZCByZXF1ZXN0cyBhbmQgdG8gdXNlIFxmdW5jdGlvbntzZWxlY3QoKX0KLXRvIGRlY2lkZSB3aGljaCByZXF1ZXN0IHRvIHdvcmsgb24gbmV4dCAob3Igd2hldGhlciB0byBoYW5kbGUgYSBuZXcgaW5jb21pbmcKLXJlcXVlc3QpLiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IGZvciBzdHJlYW0gc2VydmljZXMgd2hlcmUgZWFjaAotY2xpZW50IGNhbiBwb3RlbnRpYWxseSBiZSBjb25uZWN0ZWQgZm9yIGEgbG9uZyB0aW1lIChpZiB0aHJlYWRzIG9yCi1zdWJwcm9jZXNzZXMgY2Fubm90IGJlIHVzZWQpLgotCi0lWFhYIHNob3VsZCBkYXRhIGFuZCBtZXRob2RzIGJlIGludGVybWluZ2xlZCwgb3Igc2VwYXJhdGU/Ci0lIGhvdyBzaG91bGQgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gY2xhc3MgYW5kIGluc3RhbmNlIHZhcmlhYmxlcyBiZQotJSBkcmF3bj8KLQotXHN1YnNlY3Rpb257U2VydmVyIE9iamVjdHN9Ci0KLVxiZWdpbntmdW5jZGVzY317ZmlsZW5vfXt9Ci1SZXR1cm4gYW4gaW50ZWdlciBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSBzb2NrZXQgb24gd2hpY2ggdGhlIHNlcnZlcgotaXMgbGlzdGVuaW5nLiAgVGhpcyBmdW5jdGlvbiBpcyBtb3N0IGNvbW1vbmx5IHBhc3NlZCB0bwotXGZ1bmN0aW9ue3NlbGVjdC5zZWxlY3QoKX0sIHRvIGFsbG93IG1vbml0b3JpbmcgbXVsdGlwbGUgc2VydmVycyBpbiB0aGUKLXNhbWUgcHJvY2Vzcy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aGFuZGxlX3JlcXVlc3R9e30KLVByb2Nlc3MgYSBzaW5nbGUgcmVxdWVzdC4gIFRoaXMgZnVuY3Rpb24gY2FsbHMgdGhlIGZvbGxvd2luZyBtZXRob2RzCi1pbiBvcmRlcjogXG1ldGhvZHtnZXRfcmVxdWVzdCgpfSwgXG1ldGhvZHt2ZXJpZnlfcmVxdWVzdCgpfSwgYW5kCi1cbWV0aG9ke3Byb2Nlc3NfcmVxdWVzdCgpfS4gIElmIHRoZSB1c2VyLXByb3ZpZGVkIFxtZXRob2R7aGFuZGxlKCl9Ci1tZXRob2Qgb2YgdGhlIGhhbmRsZXIgY2xhc3MgcmFpc2VzIGFuIGV4Y2VwdGlvbiwgdGhlIHNlcnZlcidzCi1cbWV0aG9ke2hhbmRsZV9lcnJvcigpfSBtZXRob2Qgd2lsbCBiZSBjYWxsZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NlcnZlX2ZvcmV2ZXJ9e30KLUhhbmRsZSBhbiBpbmZpbml0ZSBudW1iZXIgb2YgcmVxdWVzdHMuICBUaGlzIHNpbXBseSBjYWxscwotXG1ldGhvZHtoYW5kbGVfcmVxdWVzdCgpfSBpbnNpZGUgYW4gaW5maW5pdGUgbG9vcC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317YWRkcmVzc19mYW1pbHl9Ci1UaGUgZmFtaWx5IG9mIHByb3RvY29scyB0byB3aGljaCB0aGUgc2VydmVyJ3Mgc29ja2V0IGJlbG9uZ3MuCi1cY29uc3RhbnR7c29ja2V0LkFGX0lORVR9IGFuZCBcY29uc3RhbnR7c29ja2V0LkFGX1VOSVh9IGFyZSB0d28KLXBvc3NpYmxlIHZhbHVlcy4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317UmVxdWVzdEhhbmRsZXJDbGFzc30KLVRoZSB1c2VyLXByb3ZpZGVkIHJlcXVlc3QgaGFuZGxlciBjbGFzczsgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcwotY3JlYXRlZCBmb3IgZWFjaCByZXF1ZXN0LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtzZXJ2ZXJfYWRkcmVzc30KLVRoZSBhZGRyZXNzIG9uIHdoaWNoIHRoZSBzZXJ2ZXIgaXMgbGlzdGVuaW5nLiAgVGhlIGZvcm1hdCBvZiBhZGRyZXNzZXMKLXZhcmllcyBkZXBlbmRpbmcgb24gdGhlIHByb3RvY29sIGZhbWlseTsgc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUKLXNvY2tldCBtb2R1bGUgZm9yIGRldGFpbHMuICBGb3IgSW50ZXJuZXQgcHJvdG9jb2xzLCB0aGlzIGlzIGEgdHVwbGUKLWNvbnRhaW5pbmcgYSBzdHJpbmcgZ2l2aW5nIHRoZSBhZGRyZXNzLCBhbmQgYW4gaW50ZWdlciBwb3J0IG51bWJlcjoKLVxjb2RleygnMTI3LjAuMC4xJywgODApfSwgZm9yIGV4YW1wbGUuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e3NvY2tldH0KLVRoZSBzb2NrZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBzZXJ2ZXIgd2lsbCBsaXN0ZW4gZm9yIGluY29taW5nIHJlcXVlc3RzLgotXGVuZHtkYXRhZGVzY30KLQotJSBYWFggc2hvdWxkIGNsYXNzIHZhcmlhYmxlcyBiZSBjb3ZlcmVkIGJlZm9yZSBpbnN0YW5jZSB2YXJpYWJsZXMsIG9yCi0lIHZpY2UgdmVyc2E/Ci0KLVRoZSBzZXJ2ZXIgY2xhc3NlcyBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgY2xhc3MgdmFyaWFibGVzOgotCi1cYmVnaW57ZGF0YWRlc2N9e2FsbG93X3JldXNlX2FkZHJlc3N9Ci1XaGV0aGVyIHRoZSBzZXJ2ZXIgd2lsbCBhbGxvdyB0aGUgcmV1c2Ugb2YgYW4gYWRkcmVzcy4gVGhpcyBkZWZhdWx0cwotdG8gXGNvbnN0YW50e0ZhbHNlfSwgYW5kIGNhbiBiZSBzZXQgaW4gc3ViY2xhc3NlcyB0byBjaGFuZ2UgdGhlIHBvbGljeS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317cmVxdWVzdF9xdWV1ZV9zaXplfQotVGhlIHNpemUgb2YgdGhlIHJlcXVlc3QgcXVldWUuICBJZiBpdCB0YWtlcyBhIGxvbmcgdGltZSB0byBwcm9jZXNzIGEKLXNpbmdsZSByZXF1ZXN0LCBhbnkgcmVxdWVzdHMgdGhhdCBhcnJpdmUgd2hpbGUgdGhlIHNlcnZlciBpcyBidXN5IGFyZQotcGxhY2VkIGludG8gYSBxdWV1ZSwgdXAgdG8gXG1lbWJlcntyZXF1ZXN0X3F1ZXVlX3NpemV9IHJlcXVlc3RzLiAgT25jZQotdGhlIHF1ZXVlIGlzIGZ1bGwsIGZ1cnRoZXIgcmVxdWVzdHMgZnJvbSBjbGllbnRzIHdpbGwgZ2V0IGEKLWBgQ29ubmVjdGlvbiBkZW5pZWQnJyBlcnJvci4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHVzdWFsbHkgNSwgYnV0IHRoaXMKLWNhbiBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e3NvY2tldF90eXBlfQotVGhlIHR5cGUgb2Ygc29ja2V0IHVzZWQgYnkgdGhlIHNlcnZlcjsgXGNvbnN0YW50e3NvY2tldC5TT0NLX1NUUkVBTX0KLWFuZCBcY29uc3RhbnR7c29ja2V0LlNPQ0tfREdSQU19IGFyZSB0d28gcG9zc2libGUgdmFsdWVzLgotXGVuZHtkYXRhZGVzY30KLQotVGhlcmUgYXJlIHZhcmlvdXMgc2VydmVyIG1ldGhvZHMgdGhhdCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzCi1vZiBiYXNlIHNlcnZlciBjbGFzc2VzIGxpa2UgXGNsYXNze1RDUFNlcnZlcn07IHRoZXNlIG1ldGhvZHMgYXJlbid0Ci11c2VmdWwgdG8gZXh0ZXJuYWwgdXNlcnMgb2YgdGhlIHNlcnZlciBvYmplY3QuCi0KLSUgc2hvdWxkIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZiB0aGVzZSBiZSBkb2N1bWVudGVkLCBvciBzaG91bGQKLSUgaXQgYmUgYXNzdW1lZCB0aGF0IHRoZSB1c2VyIHdpbGwgbG9vayBhdCBTb2NrZXRTZXJ2ZXIucHk/Ci0KLVxiZWdpbntmdW5jZGVzY317ZmluaXNoX3JlcXVlc3R9e30KLUFjdHVhbGx5IHByb2Nlc3NlcyB0aGUgcmVxdWVzdCBieSBpbnN0YW50aWF0aW5nCi1cbWVtYmVye1JlcXVlc3RIYW5kbGVyQ2xhc3N9IGFuZCBjYWxsaW5nIGl0cyBcbWV0aG9ke2hhbmRsZSgpfSBtZXRob2QuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldF9yZXF1ZXN0fXt9Ci1NdXN0IGFjY2VwdCBhIHJlcXVlc3QgZnJvbSB0aGUgc29ja2V0LCBhbmQgcmV0dXJuIGEgMi10dXBsZSBjb250YWluaW5nCi10aGUgXGVtcGh7bmV3fSBzb2NrZXQgb2JqZWN0IHRvIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUKLWNsaWVudCwgYW5kIHRoZSBjbGllbnQncyBhZGRyZXNzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtoYW5kbGVfZXJyb3J9e3JlcXVlc3QsIGNsaWVudF9hZGRyZXNzfQotVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaWYgdGhlIFxtZW1iZXJ7UmVxdWVzdEhhbmRsZXJDbGFzc30ncwotXG1ldGhvZHtoYW5kbGUoKX0gbWV0aG9kIHJhaXNlcyBhbiBleGNlcHRpb24uICBUaGUgZGVmYXVsdCBhY3Rpb24gaXMKLXRvIHByaW50IHRoZSB0cmFjZWJhY2sgdG8gc3RhbmRhcmQgb3V0cHV0IGFuZCBjb250aW51ZSBoYW5kbGluZwotZnVydGhlciByZXF1ZXN0cy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cHJvY2Vzc19yZXF1ZXN0fXtyZXF1ZXN0LCBjbGllbnRfYWRkcmVzc30KLUNhbGxzIFxtZXRob2R7ZmluaXNoX3JlcXVlc3QoKX0gdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZQotXG1lbWJlcntSZXF1ZXN0SGFuZGxlckNsYXNzfS4gIElmIGRlc2lyZWQsIHRoaXMgZnVuY3Rpb24gY2FuIGNyZWF0ZSBhCi1uZXcgcHJvY2VzcyBvciB0aHJlYWQgdG8gaGFuZGxlIHRoZSByZXF1ZXN0OyB0aGUgXGNsYXNze0ZvcmtpbmdNaXhJbn0KLWFuZCBcY2xhc3N7VGhyZWFkaW5nTWl4SW59IGNsYXNzZXMgZG8gdGhpcy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLSUgSXMgdGhlcmUgYW55IHBvaW50IGluIGRvY3VtZW50aW5nIHRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucz8KLSUgV2hhdCB3b3VsZCB0aGUgcHVycG9zZSBvZiBvdmVycmlkaW5nIHRoZW0gYmU6IGluaXRpYWxpemluZyBzZXJ2ZXIKLSUgaW5zdGFuY2UgdmFyaWFibGVzLCBhZGRpbmcgbmV3IG5ldHdvcmsgZmFtaWxpZXM/Ci0KLVxiZWdpbntmdW5jZGVzY317c2VydmVyX2FjdGl2YXRlfXt9Ci1DYWxsZWQgYnkgdGhlIHNlcnZlcidzIGNvbnN0cnVjdG9yIHRvIGFjdGl2YXRlIHRoZSBzZXJ2ZXIuICBUaGUgZGVmYXVsdAotYmVoYXZpb3IganVzdCBcbWV0aG9ke2xpc3Rlbn1zIHRvIHRoZSBzZXJ2ZXIncyBzb2NrZXQuCi1NYXkgYmUgb3ZlcnJpZGRlbi4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c2VydmVyX2JpbmR9e30KLUNhbGxlZCBieSB0aGUgc2VydmVyJ3MgY29uc3RydWN0b3IgdG8gYmluZCB0aGUgc29ja2V0IHRvIHRoZSBkZXNpcmVkCi1hZGRyZXNzLiAgTWF5IGJlIG92ZXJyaWRkZW4uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3ZlcmlmeV9yZXF1ZXN0fXtyZXF1ZXN0LCBjbGllbnRfYWRkcmVzc30KLU11c3QgcmV0dXJuIGEgQm9vbGVhbiB2YWx1ZTsgaWYgdGhlIHZhbHVlIGlzIFxjb25zdGFudHtUcnVlfSwgdGhlIHJlcXVlc3Qgd2lsbCBiZQotcHJvY2Vzc2VkLCBhbmQgaWYgaXQncyBcY29uc3RhbnR7RmFsc2V9LCB0aGUgcmVxdWVzdCB3aWxsIGJlIGRlbmllZC4KLVRoaXMgZnVuY3Rpb24gY2FuIGJlIG92ZXJyaWRkZW4gdG8gaW1wbGVtZW50IGFjY2VzcyBjb250cm9scyBmb3IgYSBzZXJ2ZXIuCi1UaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhbHdheXMgcmV0dXJucyBcY29uc3RhbnR7VHJ1ZX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cc3Vic2VjdGlvbntSZXF1ZXN0SGFuZGxlciBPYmplY3RzfQotCi1UaGUgcmVxdWVzdCBoYW5kbGVyIGNsYXNzIG11c3QgZGVmaW5lIGEgbmV3IFxtZXRob2R7aGFuZGxlKCl9IG1ldGhvZCwKLWFuZCBjYW4gb3ZlcnJpZGUgYW55IG9mIHRoZSBmb2xsb3dpbmcgbWV0aG9kcy4gIEEgbmV3IGluc3RhbmNlIGlzCi1jcmVhdGVkIGZvciBlYWNoIHJlcXVlc3QuCi0KLVxiZWdpbntmdW5jZGVzY317ZmluaXNofXt9Ci1DYWxsZWQgYWZ0ZXIgdGhlIFxtZXRob2R7aGFuZGxlKCl9IG1ldGhvZCB0byBwZXJmb3JtIGFueSBjbGVhbi11cAotYWN0aW9ucyByZXF1aXJlZC4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gIElmCi1cbWV0aG9ke3NldHVwKCl9IG9yIFxtZXRob2R7aGFuZGxlKCl9IHJhaXNlIGFuIGV4Y2VwdGlvbiwgdGhpcwotZnVuY3Rpb24gd2lsbCBub3QgYmUgY2FsbGVkLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtoYW5kbGV9e30KLVRoaXMgZnVuY3Rpb24gbXVzdCBkbyBhbGwgdGhlIHdvcmsgcmVxdWlyZWQgdG8gc2VydmljZSBhIHJlcXVlc3QuCi1UaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCi1TZXZlcmFsIGluc3RhbmNlIGF0dHJpYnV0ZXMgYXJlIGF2YWlsYWJsZSB0byBpdDsgdGhlIHJlcXVlc3QgaXMKLWF2YWlsYWJsZSBhcyBcbWVtYmVye3NlbGYucmVxdWVzdH07IHRoZSBjbGllbnQgYWRkcmVzcyBhcwotXG1lbWJlcntzZWxmLmNsaWVudF9hZGRyZXNzfTsgYW5kIHRoZSBzZXJ2ZXIgaW5zdGFuY2UgYXMKLVxtZW1iZXJ7c2VsZi5zZXJ2ZXJ9LCBpbiBjYXNlIGl0IG5lZWRzIGFjY2VzcyB0byBwZXItc2VydmVyCi1pbmZvcm1hdGlvbi4KLQotVGhlIHR5cGUgb2YgXG1lbWJlcntzZWxmLnJlcXVlc3R9IGlzIGRpZmZlcmVudCBmb3IgZGF0YWdyYW0gb3Igc3RyZWFtCi1zZXJ2aWNlcy4gIEZvciBzdHJlYW0gc2VydmljZXMsIFxtZW1iZXJ7c2VsZi5yZXF1ZXN0fSBpcyBhIHNvY2tldAotb2JqZWN0OyBmb3IgZGF0YWdyYW0gc2VydmljZXMsIFxtZW1iZXJ7c2VsZi5yZXF1ZXN0fSBpcyBhIHN0cmluZy4KLUhvd2V2ZXIsIHRoaXMgY2FuIGJlIGhpZGRlbiBieSB1c2luZyB0aGUgIHJlcXVlc3QgaGFuZGxlciBzdWJjbGFzc2VzCi1cY2xhc3N7U3RyZWFtUmVxdWVzdEhhbmRsZXJ9IG9yIFxjbGFzc3tEYXRhZ3JhbVJlcXVlc3RIYW5kbGVyfSwgd2hpY2gKLW92ZXJyaWRlIHRoZSBcbWV0aG9ke3NldHVwKCl9IGFuZCBcbWV0aG9ke2ZpbmlzaCgpfSBtZXRob2RzLCBhbmQKLXByb3ZpZGUgXG1lbWJlcntzZWxmLnJmaWxlfSBhbmQgXG1lbWJlcntzZWxmLndmaWxlfSBhdHRyaWJ1dGVzLgotXG1lbWJlcntzZWxmLnJmaWxlfSBhbmQgXG1lbWJlcntzZWxmLndmaWxlfSBjYW4gYmUgcmVhZCBvciB3cml0dGVuLAotcmVzcGVjdGl2ZWx5LCB0byBnZXQgdGhlIHJlcXVlc3QgZGF0YSBvciByZXR1cm4gZGF0YSB0byB0aGUgY2xpZW50LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzZXR1cH17fQotQ2FsbGVkIGJlZm9yZSB0aGUgXG1ldGhvZHtoYW5kbGUoKX0gbWV0aG9kIHRvIHBlcmZvcm0gYW55Ci1pbml0aWFsaXphdGlvbiBhY3Rpb25zIHJlcXVpcmVkLiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcwotbm90aGluZy4KLVxlbmR7ZnVuY2Rlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnNvbWVvcy50ZXggYi9Eb2MvbGliL2xpYnNvbWVvcy50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MGM1OTAuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJzb21lb3MudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotXGNoYXB0ZXJ7T3B0aW9uYWwgT3BlcmF0aW5nIFN5c3RlbSBTZXJ2aWNlc30KLVxsYWJlbHtzb21lb3N9Ci0KLVRoZSBtb2R1bGVzIGRlc2NyaWJlZCBpbiB0aGlzIGNoYXB0ZXIgcHJvdmlkZSBpbnRlcmZhY2VzIHRvIG9wZXJhdGluZwotc3lzdGVtIGZlYXR1cmVzIHRoYXQgYXJlIGF2YWlsYWJsZSBvbiBzZWxlY3RlZCBvcGVyYXRpbmcgc3lzdGVtcyBvbmx5LgotVGhlIGludGVyZmFjZXMgYXJlIGdlbmVyYWxseSBtb2RlbGVkIGFmdGVyIHRoZSBcVU5JWHt9IG9yIFxDe30KLWludGVyZmFjZXMgYnV0IHRoZXkgYXJlIGF2YWlsYWJsZSBvbiBzb21lIG90aGVyIHN5c3RlbXMgYXMgd2VsbAotKGUuZy4gV2luZG93cyBvciBOVCkuICBIZXJlJ3MgYW4gb3ZlcnZpZXc6Ci0KLVxsb2NhbG1vZHVsZXRhYmxlCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnNwd2QudGV4IGIvRG9jL2xpYi9saWJzcHdkLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYwZTZmMS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnNwd2QudGV4CisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtzcHdkfSAtLS0KLSAgICAgICAgIFRoZSBzaGFkb3cgcGFzc3dvcmQgZGF0YWJhc2V9Ci0KLVxkZWNsYXJlbW9kdWxle2J1aWx0aW59e3Nwd2R9Ci0gIFxwbGF0Zm9ybXtVbml4fQotXG1vZHVsZXN5bm9wc2lze1RoZSBzaGFkb3cgcGFzc3dvcmQgZGF0YWJhc2UgKFxmdW5jdGlvbntnZXRzcG5hbSgpfSBhbmQgZnJpZW5kcykufQotXHZlcnNpb25hZGRlZHsyLjV9Ci0KLVRoaXMgbW9kdWxlIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgXFVOSVh7fSBzaGFkb3cgcGFzc3dvcmQgZGF0YWJhc2UuCi1JdCBpcyBhdmFpbGFibGUgb24gdmFyaW91cyBcVU5JWHt9IHZlcnNpb25zLgotCi1Zb3UgbXVzdCBoYXZlIGVub3VnaCBwcml2aWxlZ2VzIHRvIGFjY2VzcyB0aGUgc2hhZG93IHBhc3N3b3JkIGRhdGFiYXNlCi0odGhpcyB1c3VhbGx5IG1lYW5zIHlvdSBoYXZlIHRvIGJlIHJvb3QpLgotCi1TaGFkb3cgcGFzc3dvcmQgZGF0YWJhc2UgZW50cmllcyBhcmUgcmVwb3J0ZWQgYXMgYSB0dXBsZS1saWtlIG9iamVjdCwgd2hvc2UKLWF0dHJpYnV0ZXMgY29ycmVzcG9uZCB0byB0aGUgbWVtYmVycyBvZiB0aGUgXGNvZGV7c3B3ZH0gc3RydWN0dXJlCi0oQXR0cmlidXRlIGZpZWxkIGJlbG93LCBzZWUgXGNvZGV7PHNoYWRvdy5oPn0pOgotCi1cYmVnaW57dGFibGVpaWl9e3J8bHxsfXt0ZXh0cm19e0luZGV4fXtBdHRyaWJ1dGV9e01lYW5pbmd9Ci0gIFxsaW5laWlpezB9e1xjb2Rle3NwX25hbX19e0xvZ2luIG5hbWV9Ci0gIFxsaW5laWlpezF9e1xjb2Rle3NwX3B3ZH19e0VuY3J5cHRlZCBwYXNzd29yZH0KLSAgXGxpbmVpaWl7Mn17XGNvZGV7c3BfbHN0Y2hnfX17RGF0ZSBvZiBsYXN0IGNoYW5nZX0KLSAgXGxpbmVpaWl7M317XGNvZGV7c3BfbWlufX17TWluaW1hbCBudW1iZXIgb2YgZGF5cyBiZXR3ZWVuIGNoYW5nZXN9Ci0gIFxsaW5laWlpezR9e1xjb2Rle3NwX21heH19e01heGltdW0gbnVtYmVyIG9mIGRheXMgYmV0d2VlbiBjaGFuZ2VzfQotICBcbGluZWlpaXs1fXtcY29kZXtzcF93YXJufX17TnVtYmVyIG9mIGRheXMgYmVmb3JlIHBhc3N3b3JkIGV4cGlyZXMgdG8gd2FybiB1c2VyIGFib3V0IGl0fQotICBcbGluZWlpaXs2fXtcY29kZXtzcF9pbmFjdH19e051bWJlciBvZiBkYXlzIGFmdGVyIHBhc3N3b3JkIGV4cGlyZXMgdW50aWwgYWNjb3VudCBpcyBibG9ja2VkfQotICBcbGluZWlpaXs3fXtcY29kZXtzcF9leHBpcmV9fXtOdW1iZXIgb2YgZGF5cyBzaW5jZSAxOTcwLTAxLTAxIHVudGlsIGFjY291bnQgaXMgZGlzYWJsZWR9Ci0gIFxsaW5laWlpezh9e1xjb2Rle3NwX2ZsYWd9fXtSZXNlcnZlZH0KLVxlbmR7dGFibGVpaWl9Ci0KLVRoZSBzcF9uYW0gYW5kIHNwX3B3ZCBpdGVtcyBhcmUgc3RyaW5ncywgYWxsIG90aGVycyBhcmUgaW50ZWdlcnMuCi1cZXhjZXB0aW9ue0tleUVycm9yfSBpcyByYWlzZWQgaWYgdGhlIGVudHJ5IGFza2VkIGZvciBjYW5ub3QgYmUgZm91bmQuCi0KLUl0IGRlZmluZXMgdGhlIGZvbGxvd2luZyBpdGVtczoKLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRzcG5hbX17bmFtZX0KLVJldHVybiB0aGUgc2hhZG93IHBhc3N3b3JkIGRhdGFiYXNlIGVudHJ5IGZvciB0aGUgZ2l2ZW4gdXNlciBuYW1lLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRzcGFsbH17fQotUmV0dXJuIGEgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIHNoYWRvdyBwYXNzd29yZCBkYXRhYmFzZSBlbnRyaWVzLCBpbiBhcmJpdHJhcnkgb3JkZXIuCi1cZW5ke2Z1bmNkZXNjfQotCi0KLVxiZWdpbntzZWVhbHNvfQotICBcc2VlbW9kdWxle2dycH17QW4gaW50ZXJmYWNlIHRvIHRoZSBncm91cCBkYXRhYmFzZSwgc2ltaWxhciB0byB0aGlzLn0KLSAgXHNlZW1vZHVsZXtwd2R9e0FuIGludGVyZmFjZSB0byB0aGUgbm9ybWFsIHBhc3N3b3JkIGRhdGFiYXNlLCBzaW1pbGFyIHRvIHRoaXMufQotXGVuZHtzZWVhbHNvfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJzcWxpdGUzLnRleCBiL0RvYy9saWIvbGlic3FsaXRlMy50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YTBlOTQuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJzcWxpdGUzLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDY0OCArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3NxbGl0ZTN9IC0tLQotICAgICAgICAgREItQVBJIDIuMCBpbnRlcmZhY2UgZm9yIFNRTGl0ZSBkYXRhYmFzZXN9Ci0KLVxkZWNsYXJlbW9kdWxle2J1aWx0aW59e3NxbGl0ZTN9Ci1cbW9kdWxlc3lub3BzaXN7QSBEQi1BUEkgMi4wIGltcGxlbWVudGF0aW9uIHVzaW5nIFNRTGl0ZSAzLngufQotXHNlY3Rpb25hdXRob3J7R2VyaGFyZCBIw6RyaW5nfXtnaEBnaGFlcmluZy5kZX0KLVx2ZXJzaW9uYWRkZWR7Mi41fQotCi1TUUxpdGUgaXMgYSBDIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBhIGxpZ2h0d2VpZ2h0IGRpc2stYmFzZWQgZGF0YWJhc2UKLXRoYXQgZG9lc24ndCByZXF1aXJlIGEgc2VwYXJhdGUgc2VydmVyIHByb2Nlc3MgYW5kIGFsbG93cyBhY2Nlc3NpbmcKLXRoZSBkYXRhYmFzZSB1c2luZyBhIG5vbnN0YW5kYXJkIHZhcmlhbnQgb2YgdGhlIFNRTCBxdWVyeSBsYW5ndWFnZS4KLVNvbWUgYXBwbGljYXRpb25zIGNhbiB1c2UgU1FMaXRlIGZvciBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UuICBJdCdzIGFsc28KLXBvc3NpYmxlIHRvIHByb3RvdHlwZSBhbiBhcHBsaWNhdGlvbiB1c2luZyBTUUxpdGUgYW5kIHRoZW4gcG9ydCB0aGUKLWNvZGUgdG8gYSBsYXJnZXIgZGF0YWJhc2Ugc3VjaCBhcyBQb3N0Z3JlU1FMIG9yIE9yYWNsZS4KLSAKLXB5c3FsaXRlIHdhcyB3cml0dGVuIGJ5IEdlcmhhcmQgSFwiYXJpbmcgYW5kIHByb3ZpZGVzIGEgU1FMIGludGVyZmFjZQotY29tcGxpYW50IHdpdGggdGhlIERCLUFQSSAyLjAgc3BlY2lmaWNhdGlvbiBkZXNjcmliZWQgYnkKLVxwZXB7MjQ5fS4gCi0KLVRvIHVzZSB0aGUgbW9kdWxlLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgYSBcY2xhc3N7Q29ubmVjdGlvbn0gb2JqZWN0Ci10aGF0IHJlcHJlc2VudHMgdGhlIGRhdGFiYXNlLiAgSGVyZSB0aGUgZGF0YSB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgCi1cZmlsZXsvdG1wL2V4YW1wbGV9IGZpbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWNvbm4gPSBzcWxpdGUzLmNvbm5lY3QoJy90bXAvZXhhbXBsZScpCi1cZW5ke3ZlcmJhdGltfQotCi1Zb3UgY2FuIGFsc28gc3VwcGx5IHRoZSBzcGVjaWFsIG5hbWUgXHNhbXB7Om1lbW9yeTp9IHRvIGNyZWF0ZQotYSBkYXRhYmFzZSBpbiBSQU0uCi0KLU9uY2UgeW91IGhhdmUgYSBcY2xhc3N7Q29ubmVjdGlvbn0sIHlvdSBjYW4gY3JlYXRlIGEgXGNsYXNze0N1cnNvcn0gCi1vYmplY3QgYW5kIGNhbGwgaXRzIFxtZXRob2R7ZXhlY3V0ZSgpfSBtZXRob2QgdG8gcGVyZm9ybSBTUUwgY29tbWFuZHM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWMgPSBjb25uLmN1cnNvcigpCi0KLSMgQ3JlYXRlIHRhYmxlCi1jLmV4ZWN1dGUoJycnY3JlYXRlIHRhYmxlIHN0b2NrcwotKGRhdGUgdGV4dCwgdHJhbnMgdGV4dCwgc3ltYm9sIHRleHQsCi0gcXR5IHJlYWwsIHByaWNlIHJlYWwpJycnKQotCi0jIEluc2VydCBhIHJvdyBvZiBkYXRhCi1jLmV4ZWN1dGUoIiIiaW5zZXJ0IGludG8gc3RvY2tzCi0gICAgICAgICAgdmFsdWVzICgnMjAwNi0wMS0wNScsJ0JVWScsJ1JIQVQnLDEwMCwzNS4xNCkiIiIpCi0KLSMgU2F2ZSAoY29tbWl0KSB0aGUgY2hhbmdlcwotY29ubi5jb21taXQoKQotCi0jIFdlIGNhbiBhbHNvIGNsb3NlIHRoZSBjdXJzb3IgaWYgd2UgYXJlIGRvbmUgd2l0aCBpdAotYy5jbG9zZSgpCi1cZW5ke3ZlcmJhdGltfSAgICAKLQotVXN1YWxseSB5b3VyIFNRTCBvcGVyYXRpb25zIHdpbGwgbmVlZCB0byB1c2UgdmFsdWVzIGZyb20gUHl0aG9uCi12YXJpYWJsZXMuICBZb3Ugc2hvdWxkbid0IGFzc2VtYmxlIHlvdXIgcXVlcnkgdXNpbmcgUHl0aG9uJ3Mgc3RyaW5nCi1vcGVyYXRpb25zIGJlY2F1c2UgZG9pbmcgc28gaXMgaW5zZWN1cmU7IGl0IG1ha2VzIHlvdXIgcHJvZ3JhbQotdnVsbmVyYWJsZSB0byBhbiBTUUwgaW5qZWN0aW9uIGF0dGFjay4gIAotCi1JbnN0ZWFkLCB1c2UgdGhlIERCLUFQSSdzIHBhcmFtZXRlciBzdWJzdGl0dXRpb24uICBQdXQgXHNhbXB7P30gYXMgYQotcGxhY2Vob2xkZXIgd2hlcmV2ZXIgeW91IHdhbnQgdG8gdXNlIGEgdmFsdWUsIGFuZCB0aGVuIHByb3ZpZGUgYSB0dXBsZQotb2YgdmFsdWVzIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gdGhlIGN1cnNvcidzIFxtZXRob2R7ZXhlY3V0ZSgpfQotbWV0aG9kLiAgKE90aGVyIGRhdGFiYXNlIG1vZHVsZXMgbWF5IHVzZSBhIGRpZmZlcmVudCBwbGFjZWhvbGRlciwKLXN1Y2ggYXMgXHNhbXB7XCVzfSBvciBcc2FtcHs6MX0uKSBGb3IgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfSAgICAKLSMgTmV2ZXIgZG8gdGhpcyAtLSBpbnNlY3VyZSEKLXN5bWJvbCA9ICdJQk0nCi1jLmV4ZWN1dGUoIi4uLiB3aGVyZSBzeW1ib2wgPSAnJXMnIiAlIHN5bWJvbCkKLQotIyBEbyB0aGlzIGluc3RlYWQKLXQgPSAoc3ltYm9sLCkKLWMuZXhlY3V0ZSgnc2VsZWN0ICogZnJvbSBzdG9ja3Mgd2hlcmUgc3ltYm9sPT8nLCB0KQotCi0jIExhcmdlciBleGFtcGxlCi1mb3IgdCBpbiAoKCcyMDA2LTAzLTI4JywgJ0JVWScsICdJQk0nLCAxMDAwLCA0NS4wMCksCi0gICAgICAgICAgKCcyMDA2LTA0LTA1JywgJ0JVWScsICdNU09GVCcsIDEwMDAsIDcyLjAwKSwKLSAgICAgICAgICAoJzIwMDYtMDQtMDYnLCAnU0VMTCcsICdJQk0nLCA1MDAsIDUzLjAwKSwKLSAgICAgICAgICk6Ci0gICAgYy5leGVjdXRlKCdpbnNlcnQgaW50byBzdG9ja3MgdmFsdWVzICg/LD8sPyw/LD8pJywgdCkKLVxlbmR7dmVyYmF0aW19Ci0KLVRvIHJldHJpZXZlIGRhdGEgYWZ0ZXIgZXhlY3V0aW5nIGEgU0VMRUNUIHN0YXRlbWVudCwgeW91IGNhbiBlaXRoZXIgCi10cmVhdCB0aGUgY3Vyc29yIGFzIGFuIGl0ZXJhdG9yLCBjYWxsIHRoZSBjdXJzb3IncyBcbWV0aG9ke2ZldGNob25lKCl9Ci1tZXRob2QgdG8gcmV0cmlldmUgYSBzaW5nbGUgbWF0Y2hpbmcgcm93LCAKLW9yIGNhbGwgXG1ldGhvZHtmZXRjaGFsbCgpfSB0byBnZXQgYSBsaXN0IG9mIHRoZSBtYXRjaGluZyByb3dzLgotCi1UaGlzIGV4YW1wbGUgdXNlcyB0aGUgaXRlcmF0b3IgZm9ybToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGMgPSBjb25uLmN1cnNvcigpCi0+Pj4gYy5leGVjdXRlKCdzZWxlY3QgKiBmcm9tIHN0b2NrcyBvcmRlciBieSBwcmljZScpCi0+Pj4gZm9yIHJvdyBpbiBjOgotLi4uICAgIHByaW50IHJvdwotLi4uCi0odScyMDA2LTAxLTA1JywgdSdCVVknLCB1J1JIQVQnLCAxMDAsIDM1LjE0MDAwMDAwMDAwMDAwMSkKLSh1JzIwMDYtMDMtMjgnLCB1J0JVWScsIHUnSUJNJywgMTAwMCwgNDUuMCkKLSh1JzIwMDYtMDQtMDYnLCB1J1NFTEwnLCB1J0lCTScsIDUwMCwgNTMuMCkKLSh1JzIwMDYtMDQtMDUnLCB1J0JVWScsIHUnTVNPRlQnLCAxMDAwLCA3Mi4wKQotPj4+Ci1cZW5ke3ZlcmJhdGltfQotCi1cYmVnaW57c2VlYWxzb30KLQotXHNlZXVybHtodHRwOi8vd3d3LnB5c3FsaXRlLm9yZ30KLXtUaGUgcHlzcWxpdGUgd2ViIHBhZ2UufQotCi1cc2VldXJse2h0dHA6Ly93d3cuc3FsaXRlLm9yZ30KLXtUaGUgU1FMaXRlIHdlYiBwYWdlOyB0aGUgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgdGhlIHN5bnRheCBhbmQgdGhlCi1hdmFpbGFibGUgZGF0YSB0eXBlcyBmb3IgdGhlIHN1cHBvcnRlZCBTUUwgZGlhbGVjdC59Ci0KLVxzZWVwZXB7MjQ5fXtEYXRhYmFzZSBBUEkgU3BlY2lmaWNhdGlvbiAyLjB9e1BFUCB3cml0dGVuIGJ5Ci1NYXJjLUFuZHJcJ2UgTGVtYnVyZy59Ci0KLVxlbmR7c2VlYWxzb30KLQotCi1cc3Vic2VjdGlvbntNb2R1bGUgZnVuY3Rpb25zIGFuZCBjb25zdGFudHNcbGFiZWx7c3FsaXRlMy1Nb2R1bGUtQ29udGVudHN9fQotCi1cYmVnaW57ZGF0YWRlc2N9e1BBUlNFX0RFQ0xUWVBFU30KLVRoaXMgY29uc3RhbnQgaXMgbWVhbnQgdG8gYmUgdXNlZCB3aXRoIHRoZSBcdmFye2RldGVjdF90eXBlc30gcGFyYW1ldGVyIG9mIHRoZQotXGZ1bmN0aW9ue2Nvbm5lY3R9IGZ1bmN0aW9uLgotCi1TZXR0aW5nIGl0IG1ha2VzIHRoZSBcbW9kdWxle3NxbGl0ZTN9IG1vZHVsZSBwYXJzZSB0aGUgZGVjbGFyZWQgdHlwZSBmb3IgZWFjaCBjb2x1bW4gaXQKLXJldHVybnMuICBJdCB3aWxsIHBhcnNlIG91dCB0aGUgZmlyc3Qgd29yZCBvZiB0aGUgZGVjbGFyZWQgdHlwZSwgaS4gZS4gZm9yCi0iaW50ZWdlciBwcmltYXJ5IGtleSIsIGl0IHdpbGwgcGFyc2Ugb3V0ICJpbnRlZ2VyIi4gVGhlbiBmb3IgdGhhdCBjb2x1bW4sIGl0Ci13aWxsIGxvb2sgaW50byB0aGUgY29udmVydGVycyBkaWN0aW9uYXJ5IGFuZCB1c2UgdGhlIGNvbnZlcnRlciBmdW5jdGlvbgotcmVnaXN0ZXJlZCBmb3IgdGhhdCB0eXBlIHRoZXJlLiAgQ29udmVydGVyIG5hbWVzIGFyZSBjYXNlLXNlbnNpdGl2ZSEKLVxlbmR7ZGF0YWRlc2N9Ci0KLQotXGJlZ2lue2RhdGFkZXNjfXtQQVJTRV9DT0xOQU1FU30KLVRoaXMgY29uc3RhbnQgaXMgbWVhbnQgdG8gYmUgdXNlZCB3aXRoIHRoZSBcdmFye2RldGVjdF90eXBlc30gcGFyYW1ldGVyIG9mIHRoZQotXGZ1bmN0aW9ue2Nvbm5lY3R9IGZ1bmN0aW9uLgotCi1TZXR0aW5nIHRoaXMgbWFrZXMgdGhlIFNRTGl0ZSBpbnRlcmZhY2UgcGFyc2UgdGhlIGNvbHVtbiBuYW1lIGZvciBlYWNoIGNvbHVtbgotaXQgcmV0dXJucy4gIEl0IHdpbGwgbG9vayBmb3IgYSBzdHJpbmcgZm9ybWVkIFtteXR5cGVdIGluIHRoZXJlLCBhbmQgdGhlbgotZGVjaWRlIHRoYXQgJ215dHlwZScgaXMgdGhlIHR5cGUgb2YgdGhlIGNvbHVtbi4gSXQgd2lsbCB0cnkgdG8gZmluZCBhbiBlbnRyeSBvZgotJ215dHlwZScgaW4gdGhlIGNvbnZlcnRlcnMgZGljdGlvbmFyeSBhbmQgdGhlbiB1c2UgdGhlIGNvbnZlcnRlciBmdW5jdGlvbiBmb3VuZAotdGhlcmUgdG8gcmV0dXJuIHRoZSB2YWx1ZS4gVGhlIGNvbHVtbiBuYW1lIGZvdW5kIGluIFxtZW1iZXJ7Y3Vyc29yLmRlc2NyaXB0aW9ufSBpcyBvbmx5Ci10aGUgZmlyc3Qgd29yZCBvZiB0aGUgY29sdW1uIG5hbWUsIGkuICBlLiBpZiB5b3UgdXNlIHNvbWV0aGluZyBsaWtlCi1cY29kZXsnYXMgInggW2RhdGV0aW1lXSInfSBpbiB5b3VyIFNRTCwgdGhlbiB3ZSB3aWxsIHBhcnNlIG91dCBldmVyeXRoaW5nIHVudGlsIHRoZQotZmlyc3QgYmxhbmsgZm9yIHRoZSBjb2x1bW4gbmFtZTogdGhlIGNvbHVtbiBuYW1lIHdvdWxkIHNpbXBseSBiZSAieCIuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2Nvbm5lY3R9e2RhdGFiYXNlXG9wdGlvbmFseywgdGltZW91dCwgaXNvbGF0aW9uX2xldmVsLCBkZXRlY3RfdHlwZXMsIGZhY3Rvcnl9fQotT3BlbnMgYSBjb25uZWN0aW9uIHRvIHRoZSBTUUxpdGUgZGF0YWJhc2UgZmlsZSBcdmFye2RhdGFiYXNlfS4gWW91IGNhbiB1c2UKLVxjb2RleyI6bWVtb3J5OiJ9IHRvIG9wZW4gYSBkYXRhYmFzZSBjb25uZWN0aW9uIHRvIGEgZGF0YWJhc2UgdGhhdCByZXNpZGVzIGluCi1SQU0gaW5zdGVhZCBvZiBvbiBkaXNrLgotCi1XaGVuIGEgZGF0YWJhc2UgaXMgYWNjZXNzZWQgYnkgbXVsdGlwbGUgY29ubmVjdGlvbnMsIGFuZCBvbmUgb2YgdGhlIHByb2Nlc3NlcwotbW9kaWZpZXMgdGhlIGRhdGFiYXNlLCB0aGUgU1FMaXRlIGRhdGFiYXNlIGlzIGxvY2tlZCB1bnRpbCB0aGF0IHRyYW5zYWN0aW9uIGlzCi1jb21taXR0ZWQuIFRoZSBcdmFye3RpbWVvdXR9IHBhcmFtZXRlciBzcGVjaWZpZXMgaG93IGxvbmcgdGhlIGNvbm5lY3Rpb24gc2hvdWxkCi13YWl0IGZvciB0aGUgbG9jayB0byBnbyBhd2F5IHVudGlsIHJhaXNpbmcgYW4gZXhjZXB0aW9uLiBUaGUgZGVmYXVsdCBmb3IgdGhlCi10aW1lb3V0IHBhcmFtZXRlciBpcyA1LjAgKGZpdmUgc2Vjb25kcykuIAotCi1Gb3IgdGhlIFx2YXJ7aXNvbGF0aW9uX2xldmVsfSBwYXJhbWV0ZXIsIHBsZWFzZSBzZWUgdGhlIFxtZW1iZXJ7aXNvbGF0aW9uX2xldmVsfQotcHJvcGVydHkgb2YgXGNsYXNze0Nvbm5lY3Rpb259IG9iamVjdHMgaW4gc2VjdGlvbn5ccmVme3NxbGl0ZTMtQ29ubmVjdGlvbi1Jc29sYXRpb25MZXZlbH0uCi0KLVNRTGl0ZSBuYXRpdmVseSBzdXBwb3J0cyBvbmx5IHRoZSB0eXBlcyBURVhULCBJTlRFR0VSLCBGTE9BVCwgQkxPQiBhbmQgTlVMTC4gSWYKLXlvdSB3YW50IHRvIHVzZSBvdGhlciB0eXBlcyB5b3UgbXVzdCBhZGQgc3VwcG9ydCBmb3IgdGhlbSB5b3Vyc2VsZi4KLVRoZSBcdmFye2RldGVjdF90eXBlc30gcGFyYW1ldGVyIGFuZCB0aGUgdXNpbmcgY3VzdG9tIFxzdHJvbmd7Y29udmVydGVyc30gcmVnaXN0ZXJlZCB3aXRoCi10aGUgbW9kdWxlLWxldmVsIFxmdW5jdGlvbntyZWdpc3Rlcl9jb252ZXJ0ZXJ9IGZ1bmN0aW9uIGFsbG93IHlvdSB0byBlYXNpbHkgZG8gdGhhdC4KLQotXHZhcntkZXRlY3RfdHlwZXN9IGRlZmF1bHRzIHRvIDAgKGkuIGUuIG9mZiwgbm8gdHlwZSBkZXRlY3Rpb24pLCB5b3UgY2FuIHNldCBpdAotdG8gYW55IGNvbWJpbmF0aW9uIG9mIFxjb25zdGFudHtQQVJTRV9ERUNMVFlQRVN9IGFuZCBcY29uc3RhbnR7UEFSU0VfQ09MTkFNRVN9IHRvIHR1cm4gdHlwZQotZGV0ZWN0aW9uIG9uLgotCi1CeSBkZWZhdWx0LCB0aGUgXG1vZHVsZXtzcWxpdGUzfSBtb2R1bGUgdXNlcyBpdHMgXGNsYXNze0Nvbm5lY3Rpb259IGNsYXNzIGZvciB0aGUKLWNvbm5lY3QgY2FsbC4gIFlvdSBjYW4sIGhvd2V2ZXIsIHN1YmNsYXNzIHRoZSBcY2xhc3N7Q29ubmVjdGlvbn0gY2xhc3MgYW5kIG1ha2UKLVxmdW5jdGlvbntjb25uZWN0fSB1c2UgeW91ciBjbGFzcyBpbnN0ZWFkIGJ5IHByb3ZpZGluZyB5b3VyIGNsYXNzIGZvciB0aGUKLVx2YXJ7ZmFjdG9yeX0gcGFyYW1ldGVyLgotCi1Db25zdWx0IHRoZSBzZWN0aW9uIFxyZWZ7c3FsaXRlMy1UeXBlc30gb2YgdGhpcyBtYW51YWwgZm9yIGRldGFpbHMuCi0KLVRoZSBcbW9kdWxle3NxbGl0ZTN9IG1vZHVsZSBpbnRlcm5hbGx5IHVzZXMgYSBzdGF0ZW1lbnQgY2FjaGUgdG8gYXZvaWQgU1FMIHBhcnNpbmcKLW92ZXJoZWFkLiBJZiB5b3Ugd2FudCB0byBleHBsaWNpdGx5IHNldCB0aGUgbnVtYmVyIG9mIHN0YXRlbWVudHMgdGhhdCBhcmUKLWNhY2hlZCBmb3IgdGhlIGNvbm5lY3Rpb24sIHlvdSBjYW4gc2V0IHRoZSBcdmFye2NhY2hlZF9zdGF0ZW1lbnRzfSBwYXJhbWV0ZXIuCi1UaGUgY3VycmVudGx5IGltcGxlbWVudGVkIGRlZmF1bHQgaXMgdG8gY2FjaGUgMTAwIHN0YXRlbWVudHMuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3JlZ2lzdGVyX2NvbnZlcnRlcn17dHlwZW5hbWUsIGNhbGxhYmxlfQotUmVnaXN0ZXJzIGEgY2FsbGFibGUgdG8gY29udmVydCBhIGJ5dGVzdHJpbmcgZnJvbSB0aGUgZGF0YWJhc2UgaW50byBhIGN1c3RvbQotUHl0aG9uIHR5cGUuIFRoZSBjYWxsYWJsZSB3aWxsIGJlIGludm9rZWQgZm9yIGFsbCBkYXRhYmFzZSB2YWx1ZXMgdGhhdCBhcmUgb2YKLXRoZSB0eXBlIFx2YXJ7dHlwZW5hbWV9LiBDb25mZXIgdGhlIHBhcmFtZXRlciBcdmFye2RldGVjdF90eXBlc30gb2YgdGhlCi1cZnVuY3Rpb257Y29ubmVjdH0gZnVuY3Rpb24gZm9yIGhvdyB0aGUgdHlwZSBkZXRlY3Rpb24gd29ya3MuIE5vdGUgdGhhdCB0aGUgY2FzZSBvZgotXHZhcnt0eXBlbmFtZX0gYW5kIHRoZSBuYW1lIG9mIHRoZSB0eXBlIGluIHlvdXIgcXVlcnkgbXVzdCBtYXRjaCEKLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cmVnaXN0ZXJfYWRhcHRlcn17dHlwZSwgY2FsbGFibGV9Ci1SZWdpc3RlcnMgYSBjYWxsYWJsZSB0byBjb252ZXJ0IHRoZSBjdXN0b20gUHl0aG9uIHR5cGUgXHZhcnt0eXBlfSBpbnRvIG9uZSBvZgotU1FMaXRlJ3Mgc3VwcG9ydGVkIHR5cGVzLiBUaGUgY2FsbGFibGUgXHZhcntjYWxsYWJsZX0gYWNjZXB0cyBhcyBzaW5nbGUKLXBhcmFtZXRlciB0aGUgUHl0aG9uIHZhbHVlLCBhbmQgbXVzdCByZXR1cm4gYSB2YWx1ZSBvZiB0aGUgZm9sbG93aW5nIHR5cGVzOgotaW50LCBsb25nLCBmbG9hdCwgc3RyIChVVEYtOCBlbmNvZGVkKSwgdW5pY29kZSBvciBidWZmZXIuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2NvbXBsZXRlX3N0YXRlbWVudH17c3FsfQotUmV0dXJucyBcY29uc3RhbnR7VHJ1ZX0gaWYgdGhlIHN0cmluZyBcdmFye3NxbH0gY29udGFpbnMgb25lIG9yIG1vcmUgY29tcGxldGUgU1FMCi1zdGF0ZW1lbnRzIHRlcm1pbmF0ZWQgYnkgc2VtaWNvbG9ucy4gSXQgZG9lcyBub3QgdmVyaWZ5IHRoYXQgdGhlIFNRTCBpcwotc3ludGFjdGljYWxseSBjb3JyZWN0LCBvbmx5IHRoYXQgdGhlcmUgYXJlIG5vIHVuY2xvc2VkIHN0cmluZyBsaXRlcmFscyBhbmQgdGhlCi1zdGF0ZW1lbnQgaXMgdGVybWluYXRlZCBieSBhIHNlbWljb2xvbi4KLQotVGhpcyBjYW4gYmUgdXNlZCB0byBidWlsZCBhIHNoZWxsIGZvciBTUUxpdGUsIGFzIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKLQotICAgIFx2ZXJiYXRpbWlucHV0e3NxbGl0ZTMvY29tcGxldGVfc3RhdGVtZW50LnB5fQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtlbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrc317ZmxhZ30KLUJ5IGRlZmF1bHQgeW91IHdpbGwgbm90IGdldCBhbnkgdHJhY2ViYWNrcyBpbiB1c2VyLWRlZmluZWQgZnVuY3Rpb25zLAotYWdncmVnYXRlcywgY29udmVydGVycywgYXV0aG9yaXplciBjYWxsYmFja3MgZXRjLiBJZiB5b3Ugd2FudCB0byBkZWJ1ZyB0aGVtLAoteW91IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCBcdmFye2ZsYWd9IGFzIFRydWUuIEFmdGVyd2FyZHMsIHlvdSB3aWxsIGdldAotdHJhY2ViYWNrcyBmcm9tIGNhbGxiYWNrcyBvbiBcY29kZXtzeXMuc3RkZXJyfS4gVXNlIFxjb25zdGFudHtGYWxzZX0gdG8gZGlzYWJsZQotdGhlIGZlYXR1cmUgYWdhaW4uCi1cZW5ke2Z1bmNkZXNjfQotCi1cc3Vic2VjdGlvbntDb25uZWN0aW9uIE9iamVjdHMgXGxhYmVse3NxbGl0ZTMtQ29ubmVjdGlvbi1PYmplY3RzfX0KLQotQSBcY2xhc3N7Q29ubmVjdGlvbn0gaW5zdGFuY2UgaGFzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhbmQgbWV0aG9kczoKLQotXGxhYmVse3NxbGl0ZTMtQ29ubmVjdGlvbi1Jc29sYXRpb25MZXZlbH0KLVxiZWdpbnttZW1iZXJkZXNjfVtDb25uZWN0aW9uXXtpc29sYXRpb25fbGV2ZWx9Ci0gIEdldCBvciBzZXQgdGhlIGN1cnJlbnQgaXNvbGF0aW9uIGxldmVsLiBOb25lIGZvciBhdXRvY29tbWl0IG1vZGUgb3Igb25lIG9mCi0gICJERUZFUlJFRCIsICJJTU1FRElBVEUiIG9yICJFWExVU0lWRSIuIFNlZSBgYENvbnRyb2xsaW5nIFRyYW5zYWN0aW9ucycnLCAKLSAgc2VjdGlvbn5ccmVme3NxbGl0ZTMtQ29udHJvbGxpbmctVHJhbnNhY3Rpb25zfSwgZm9yIGEgbW9yZSBkZXRhaWxlZCBleHBsYW5hdGlvbi4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de2N1cnNvcn17XG9wdGlvbmFse2N1cnNvckNsYXNzfX0KLSAgVGhlIGN1cnNvciBtZXRob2QgYWNjZXB0cyBhIHNpbmdsZSBvcHRpb25hbCBwYXJhbWV0ZXIgXHZhcntjdXJzb3JDbGFzc30uCi0gIElmIHN1cHBsaWVkLCB0aGlzIG11c3QgYmUgYSBjdXN0b20gY3Vyc29yIGNsYXNzIHRoYXQgZXh0ZW5kcyAKLSAgXGNsYXNze3NxbGl0ZTMuQ3Vyc29yfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de2V4ZWN1dGV9e3NxbCwgXG9wdGlvbmFse3BhcmFtZXRlcnN9fQotVGhpcyBpcyBhIG5vbnN0YW5kYXJkIHNob3J0Y3V0IHRoYXQgY3JlYXRlcyBhbiBpbnRlcm1lZGlhdGUgY3Vyc29yIG9iamVjdCBieQotY2FsbGluZyB0aGUgY3Vyc29yIG1ldGhvZCwgdGhlbiBjYWxscyB0aGUgY3Vyc29yJ3MgXG1ldGhvZHtleGVjdXRlfSBtZXRob2Qgd2l0aCB0aGUKLXBhcmFtZXRlcnMgZ2l2ZW4uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtleGVjdXRlbWFueX17c3FsLCBcb3B0aW9uYWx7cGFyYW1ldGVyc319Ci1UaGlzIGlzIGEgbm9uc3RhbmRhcmQgc2hvcnRjdXQgdGhhdCBjcmVhdGVzIGFuIGludGVybWVkaWF0ZSBjdXJzb3Igb2JqZWN0IGJ5Ci1jYWxsaW5nIHRoZSBjdXJzb3IgbWV0aG9kLCB0aGVuIGNhbGxzIHRoZSBjdXJzb3IncyBcbWV0aG9ke2V4ZWN1dGVtYW55fSBtZXRob2Qgd2l0aCB0aGUKLXBhcmFtZXRlcnMgZ2l2ZW4uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtleGVjdXRlc2NyaXB0fXtzcWxfc2NyaXB0fQotVGhpcyBpcyBhIG5vbnN0YW5kYXJkIHNob3J0Y3V0IHRoYXQgY3JlYXRlcyBhbiBpbnRlcm1lZGlhdGUgY3Vyc29yIG9iamVjdCBieQotY2FsbGluZyB0aGUgY3Vyc29yIG1ldGhvZCwgdGhlbiBjYWxscyB0aGUgY3Vyc29yJ3MgXG1ldGhvZHtleGVjdXRlc2NyaXB0fSBtZXRob2Qgd2l0aCB0aGUKLXBhcmFtZXRlcnMgZ2l2ZW4uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtjcmVhdGVfZnVuY3Rpb259e25hbWUsIG51bV9wYXJhbXMsIGZ1bmN9Ci0KLUNyZWF0ZXMgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24gdGhhdCB5b3UgY2FuIGxhdGVyIHVzZSBmcm9tIHdpdGhpbiBTUUwKLXN0YXRlbWVudHMgdW5kZXIgdGhlIGZ1bmN0aW9uIG5hbWUgXHZhcntuYW1lfS4gXHZhcntudW1fcGFyYW1zfSBpcyB0aGUgbnVtYmVyCi1vZiBwYXJhbWV0ZXJzIHRoZSBmdW5jdGlvbiBhY2NlcHRzLCBhbmQgXHZhcntmdW5jfSBpcyBhIFB5dGhvbiBjYWxsYWJsZSB0aGF0IGlzCi1jYWxsZWQgYXMgdGhlIFNRTCBmdW5jdGlvbi4KLQotVGhlIGZ1bmN0aW9uIGNhbiByZXR1cm4gYW55IG9mIHRoZSB0eXBlcyBzdXBwb3J0ZWQgYnkgU1FMaXRlOiB1bmljb2RlLCBzdHIsCi1pbnQsIGxvbmcsIGZsb2F0LCBidWZmZXIgYW5kIE5vbmUuCi0KLUV4YW1wbGU6Ci0KLSAgXHZlcmJhdGltaW5wdXR7c3FsaXRlMy9tZDVmdW5jLnB5fQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17Y3JlYXRlX2FnZ3JlZ2F0ZX17bmFtZSwgbnVtX3BhcmFtcywgYWdncmVnYXRlX2NsYXNzfQotCi1DcmVhdGVzIGEgdXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSBmdW5jdGlvbi4KLQotVGhlIGFnZ3JlZ2F0ZSBjbGFzcyBtdXN0IGltcGxlbWVudCBhIFxjb2Rle3N0ZXB9IG1ldGhvZCwgd2hpY2ggYWNjZXB0cyB0aGUKLW51bWJlciBvZiBwYXJhbWV0ZXJzIFx2YXJ7bnVtX3BhcmFtc30sIGFuZCBhIFxjb2Rle2ZpbmFsaXplfSBtZXRob2Qgd2hpY2gKLXdpbGwgcmV0dXJuIHRoZSBmaW5hbCByZXN1bHQgb2YgdGhlIGFnZ3JlZ2F0ZS4KLQotVGhlIFxjb2Rle2ZpbmFsaXplfSBtZXRob2QgY2FuIHJldHVybiBhbnkgb2YgdGhlIHR5cGVzIHN1cHBvcnRlZCBieSBTUUxpdGU6Ci11bmljb2RlLCBzdHIsIGludCwgbG9uZywgZmxvYXQsIGJ1ZmZlciBhbmQgTm9uZS4KLQotRXhhbXBsZToKLQotICBcdmVyYmF0aW1pbnB1dHtzcWxpdGUzL215c3VtYWdnci5weX0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de2NyZWF0ZV9jb2xsYXRpb259e25hbWUsIGNhbGxhYmxlfQotCi1DcmVhdGVzIGEgY29sbGF0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBcdmFye25hbWV9IGFuZCBcdmFye2NhbGxhYmxlfS4gVGhlCi1jYWxsYWJsZSB3aWxsIGJlIHBhc3NlZCB0d28gc3RyaW5nIGFyZ3VtZW50cy4gSXQgc2hvdWxkIHJldHVybiAtMSBpZiB0aGUgZmlyc3QKLWlzIG9yZGVyZWQgbG93ZXIgdGhhbiB0aGUgc2Vjb25kLCAwIGlmIHRoZXkgYXJlIG9yZGVyZWQgZXF1YWwgYW5kIDEgaWYgdGhlCi1maXJzdCBpcyBvcmRlcmVkIGhpZ2hlciB0aGFuIHRoZSBzZWNvbmQuICBOb3RlIHRoYXQgdGhpcyBjb250cm9scyBzb3J0aW5nCi0oT1JERVIgQlkgaW4gU1FMKSBzbyB5b3VyIGNvbXBhcmlzb25zIGRvbid0IGFmZmVjdCBvdGhlciBTUUwgb3BlcmF0aW9ucy4KLQotTm90ZSB0aGF0IHRoZSBjYWxsYWJsZSB3aWxsIGdldCBpdHMgcGFyYW1ldGVycyBhcyBQeXRob24gYnl0ZXN0cmluZ3MsIHdoaWNoCi13aWxsIG5vcm1hbGx5IGJlIGVuY29kZWQgaW4gVVRGLTguCi0KLVRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBhIGN1c3RvbSBjb2xsYXRpb24gdGhhdCBzb3J0cyAidGhlIHdyb25nIHdheSI6Ci0KLSAgXHZlcmJhdGltaW5wdXR7c3FsaXRlMy9jb2xsYXRpb25fcmV2ZXJzZS5weX0KLQotVG8gcmVtb3ZlIGEgY29sbGF0aW9uLCBjYWxsIFxjb2Rle2NyZWF0ZV9jb2xsYXRpb259IHdpdGggTm9uZSBhcyBjYWxsYWJsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJyZXZlcnNlIiwgTm9uZSkKLVxlbmR7dmVyYmF0aW19Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtpbnRlcnJ1cHR9e30KLQotWW91IGNhbiBjYWxsIHRoaXMgbWV0aG9kIGZyb20gYSBkaWZmZXJlbnQgdGhyZWFkIHRvIGFib3J0IGFueSBxdWVyaWVzIHRoYXQKLW1pZ2h0IGJlIGV4ZWN1dGluZyBvbiB0aGUgY29ubmVjdGlvbi4gVGhlIHF1ZXJ5IHdpbGwgdGhlbiBhYm9ydCBhbmQgdGhlIGNhbGxlcgotd2lsbCBnZXQgYW4gZXhjZXB0aW9uLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17c2V0X2F1dGhvcml6ZXJ9e2F1dGhvcml6ZXJfY2FsbGJhY2t9Ci0KLVRoaXMgcm91dGluZSByZWdpc3RlcnMgYSBjYWxsYmFjay4gVGhlIGNhbGxiYWNrIGlzIGludm9rZWQgZm9yIGVhY2ggYXR0ZW1wdCB0bwotYWNjZXNzIGEgY29sdW1uIG9mIGEgdGFibGUgaW4gdGhlIGRhdGFiYXNlLiBUaGUgY2FsbGJhY2sgc2hvdWxkIHJldHVybgotXGNvbnN0YW50e1NRTElURV9PS30gaWYgYWNjZXNzIGlzIGFsbG93ZWQsIFxjb25zdGFudHtTUUxJVEVfREVOWX0gaWYgdGhlIGVudGlyZQotU1FMIHN0YXRlbWVudCBzaG91bGQgYmUgYWJvcnRlZCB3aXRoIGFuIGVycm9yIGFuZCBcY29uc3RhbnR7U1FMSVRFX0lHTk9SRX0gaWYKLXRoZSBjb2x1bW4gc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBOVUxMIHZhbHVlLiBUaGVzZSBjb25zdGFudHMgYXJlIGF2YWlsYWJsZSBpbgotdGhlIFxtb2R1bGV7c3FsaXRlM30gbW9kdWxlLgotCi1UaGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGNhbGxiYWNrIHNpZ25pZmllcyB3aGF0IGtpbmQgb2Ygb3BlcmF0aW9uIGlzIHRvIGJlCi1hdXRob3JpemVkLiBUaGUgc2Vjb25kIGFuZCB0aGlyZCBhcmd1bWVudCB3aWxsIGJlIGFyZ3VtZW50cyBvciBcY29uc3RhbnR7Tm9uZX0KLWRlcGVuZGluZyBvbiB0aGUgZmlyc3QgYXJndW1lbnQuIFRoZSA0dGggYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YgdGhlIGRhdGFiYXNlCi0oIm1haW4iLCAidGVtcCIsIGV0Yy4pIGlmIGFwcGxpY2FibGUuIFRoZSA1dGggYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YgdGhlCi1pbm5lci1tb3N0IHRyaWdnZXIgb3IgdmlldyB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgYWNjZXNzIGF0dGVtcHQgb3IKLVxjb25zdGFudHtOb25lfSBpZiB0aGlzIGFjY2VzcyBhdHRlbXB0IGlzIGRpcmVjdGx5IGZyb20gaW5wdXQgU1FMIGNvZGUuCi0KLVBsZWFzZSBjb25zdWx0IHRoZSBTUUxpdGUgZG9jdW1lbnRhdGlvbiBhYm91dCB0aGUgcG9zc2libGUgdmFsdWVzIGZvciB0aGUgZmlyc3QKLWFyZ3VtZW50IGFuZCB0aGUgbWVhbmluZyBvZiB0aGUgc2Vjb25kIGFuZCB0aGlyZCBhcmd1bWVudCBkZXBlbmRpbmcgb24gdGhlCi1maXJzdCBvbmUuIEFsbCBuZWNlc3NhcnkgY29uc3RhbnRzIGFyZSBhdmFpbGFibGUgaW4gdGhlIFxtb2R1bGV7c3FsaXRlM30KLW1vZHVsZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W0Nvbm5lY3Rpb25de3Jvd19mYWN0b3J5fQotICBZb3UgY2FuIGNoYW5nZSB0aGlzIGF0dHJpYnV0ZSB0byBhIGNhbGxhYmxlIHRoYXQgYWNjZXB0cyB0aGUgY3Vyc29yIGFuZAotICB0aGUgb3JpZ2luYWwgcm93IGFzIGEgdHVwbGUgYW5kIHdpbGwgcmV0dXJuIHRoZSByZWFsIHJlc3VsdCByb3cuICBUaGlzCi0gIHdheSwgeW91IGNhbiBpbXBsZW1lbnQgbW9yZSBhZHZhbmNlZCB3YXlzIG9mIHJldHVybmluZyByZXN1bHRzLCBzdWNoIAotICBhcyByZXR1cm5pbmcgYW4gb2JqZWN0IHRoYXQgY2FuIGFsc28gYWNjZXNzIGNvbHVtbnMgYnkgbmFtZS4KLQotICBFeGFtcGxlOgotCi0gIFx2ZXJiYXRpbWlucHV0e3NxbGl0ZTMvcm93X2ZhY3RvcnkucHl9Ci0KLSAgSWYgcmV0dXJuaW5nIGEgdHVwbGUgZG9lc24ndCBzdWZmaWNlIGFuZCB5b3Ugd2FudCBuYW1lLWJhc2VkCi0gIGFjY2VzcyB0byBjb2x1bW5zLCB5b3Ugc2hvdWxkIGNvbnNpZGVyIHNldHRpbmcgXG1lbWJlcntyb3dfZmFjdG9yeX0gdG8gdGhlCi0gIGhpZ2hseS1vcHRpbWl6ZWQgXGNsYXNze3NxbGl0ZTMuUm93fSB0eXBlLiBcY2xhc3N7Um93fSBwcm92aWRlcyBib3RoCi0gIGluZGV4LWJhc2VkIGFuZCBjYXNlLWluc2Vuc2l0aXZlIG5hbWUtYmFzZWQgYWNjZXNzIHRvIGNvbHVtbnMgd2l0aCBhbG1vc3QKLSAgbm8gbWVtb3J5IG92ZXJoZWFkLiBJdCB3aWxsIHByb2JhYmx5IGJlIGJldHRlciB0aGFuIHlvdXIgb3duIGN1c3RvbSAKLSAgZGljdGlvbmFyeS1iYXNlZCBhcHByb2FjaCBvciBldmVuIGEgZGJfcm93IGJhc2VkIHNvbHV0aW9uLgotICAlIFhYWCB3aGF0J3MgYSBkYl9yb3ctYmFzZWQgc29sdXRpb24/Ci1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtDb25uZWN0aW9uXXt0ZXh0X2ZhY3Rvcnl9Ci0gIFVzaW5nIHRoaXMgYXR0cmlidXRlIHlvdSBjYW4gY29udHJvbCB3aGF0IG9iamVjdHMgYXJlIHJldHVybmVkIGZvciB0aGUKLSAgVEVYVCBkYXRhIHR5cGUuIEJ5IGRlZmF1bHQsIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBcY2xhc3N7dW5pY29kZX0gYW5kCi0gIHRoZSBcbW9kdWxle3NxbGl0ZTN9IG1vZHVsZSB3aWxsIHJldHVybiBVbmljb2RlIG9iamVjdHMgZm9yIFRFWFQuIElmIHlvdSB3YW50IHRvIHJldHVybgotICBieXRlc3RyaW5ncyBpbnN0ZWFkLCB5b3UgY2FuIHNldCBpdCB0byBcY2xhc3N7c3RyfS4KLQotICBGb3IgZWZmaWNpZW5jeSByZWFzb25zLCB0aGVyZSdzIGFsc28gYSB3YXkgdG8gcmV0dXJuIFVuaWNvZGUgb2JqZWN0cyBvbmx5Ci0gIGZvciBub24tQVNDSUkgZGF0YSwgYW5kIGJ5dGVzdHJpbmdzIG90aGVyd2lzZS4gVG8gYWN0aXZhdGUgaXQsIHNldCB0aGlzCi0gIGF0dHJpYnV0ZSB0byBcY29uc3RhbnR7c3FsaXRlMy5PcHRpbWl6ZWRVbmljb2RlfS4KLQotICBZb3UgY2FuIGFsc28gc2V0IGl0IHRvIGFueSBvdGhlciBjYWxsYWJsZSB0aGF0IGFjY2VwdHMgYSBzaW5nbGUgYnl0ZXN0cmluZwotICBwYXJhbWV0ZXIgYW5kIHJldHVybnMgdGhlIHJlc3VsdGluZyBvYmplY3QuCi0KLSAgU2VlIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjb2RlIGZvciBpbGx1c3RyYXRpb246Ci0KLSAgXHZlcmJhdGltaW5wdXR7c3FsaXRlMy90ZXh0X2ZhY3RvcnkucHl9Ci1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtDb25uZWN0aW9uXXt0b3RhbF9jaGFuZ2VzfQotICBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgZGF0YWJhc2Ugcm93cyB0aGF0IGhhdmUgYmVlbiBtb2RpZmllZCwgaW5zZXJ0ZWQsCi0gIG9yIGRlbGV0ZWQgc2luY2UgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gd2FzIG9wZW5lZC4KLVxlbmR7bWVtYmVyZGVzY30KLQotCi0KLQotCi1cc3Vic2VjdGlvbntDdXJzb3IgT2JqZWN0cyBcbGFiZWx7c3FsaXRlMy1DdXJzb3ItT2JqZWN0c319Ci0KLUEgXGNsYXNze0N1cnNvcn0gaW5zdGFuY2UgaGFzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhbmQgbWV0aG9kczoKLQotXGJlZ2lue21ldGhvZGRlc2N9W0N1cnNvcl17ZXhlY3V0ZX17c3FsLCBcb3B0aW9uYWx7cGFyYW1ldGVyc319Ci0KLUV4ZWN1dGVzIGEgU1FMIHN0YXRlbWVudC4gVGhlIFNRTCBzdGF0ZW1lbnQgbWF5IGJlIHBhcmFtZXRyaXplZCAoaS4gZS4KLXBsYWNlaG9sZGVycyBpbnN0ZWFkIG9mIFNRTCBsaXRlcmFscykuIFRoZSBcbW9kdWxle3NxbGl0ZTN9IG1vZHVsZSBzdXBwb3J0cyB0d28ga2luZHMgb2YKLXBsYWNlaG9sZGVyczogcXVlc3Rpb24gbWFya3MgKHFtYXJrIHN0eWxlKSBhbmQgbmFtZWQgcGxhY2Vob2xkZXJzIChuYW1lZAotc3R5bGUpLgotCi1UaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSBwYXJhbWV0ZXJzIHdpdGggcW1hcmsgc3R5bGU6Ci0KLSAgICBcdmVyYmF0aW1pbnB1dHtzcWxpdGUzL2V4ZWN1dGVfMS5weX0KLQotVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byB1c2UgdGhlIG5hbWVkIHN0eWxlOgotCi0gICAgXHZlcmJhdGltaW5wdXR7c3FsaXRlMy9leGVjdXRlXzIucHl9Ci0KLSAgICBcbWV0aG9ke2V4ZWN1dGUoKX0gd2lsbCBvbmx5IGV4ZWN1dGUgYSBzaW5nbGUgU1FMIHN0YXRlbWVudC4gSWYgeW91IHRyeSB0bwotICAgIGV4ZWN1dGUgbW9yZSB0aGFuIG9uZSBzdGF0ZW1lbnQgd2l0aCBpdCwgaXQgd2lsbCByYWlzZSBhIFdhcm5pbmcuIFVzZQotICAgIFxtZXRob2R7ZXhlY3V0ZXNjcmlwdCgpfSBpZiB5b3Ugd2FudCB0byBleGVjdXRlIG11bHRpcGxlIFNRTCBzdGF0ZW1lbnRzIHdpdGggb25lCi0gICAgY2FsbC4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ3Vyc29yXXtleGVjdXRlbWFueX17c3FsLCBzZXFfb2ZfcGFyYW1ldGVyc30KLUV4ZWN1dGVzIGEgU1FMIGNvbW1hbmQgYWdhaW5zdCBhbGwgcGFyYW1ldGVyIHNlcXVlbmNlcyBvciBtYXBwaW5ncyBmb3VuZCBpbiB0aGUKLXNlcXVlbmNlIFx2YXJ7c3FsfS4gVGhlIFxtb2R1bGV7c3FsaXRlM30gbW9kdWxlIGFsc28gYWxsb3dzCi11c2luZyBhbiBpdGVyYXRvciB5aWVsZGluZyBwYXJhbWV0ZXJzIGluc3RlYWQgb2YgYSBzZXF1ZW5jZS4KLQotXHZlcmJhdGltaW5wdXR7c3FsaXRlMy9leGVjdXRlbWFueV8xLnB5fQotCi1IZXJlJ3MgYSBzaG9ydGVyIGV4YW1wbGUgdXNpbmcgYSBnZW5lcmF0b3I6Ci0KLVx2ZXJiYXRpbWlucHV0e3NxbGl0ZTMvZXhlY3V0ZW1hbnlfMi5weX0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0N1cnNvcl17ZXhlY3V0ZXNjcmlwdH17c3FsX3NjcmlwdH0KLQotVGhpcyBpcyBhIG5vbnN0YW5kYXJkIGNvbnZlbmllbmNlIG1ldGhvZCBmb3IgZXhlY3V0aW5nIG11bHRpcGxlIFNRTCBzdGF0ZW1lbnRzCi1hdCBvbmNlLiBJdCBpc3N1ZXMgYSBDT01NSVQgc3RhdGVtZW50IGZpcnN0LCB0aGVuIGV4ZWN1dGVzIHRoZSBTUUwgc2NyaXB0IGl0Ci1nZXRzIGFzIGEgcGFyYW1ldGVyLgotCi1cdmFye3NxbF9zY3JpcHR9IGNhbiBiZSBhIGJ5dGVzdHJpbmcgb3IgYSBVbmljb2RlIHN0cmluZy4KLQotRXhhbXBsZToKLQotXHZlcmJhdGltaW5wdXR7c3FsaXRlMy9leGVjdXRlc2NyaXB0LnB5fQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bQ3Vyc29yXXtyb3djb3VudH0KLSAgQWx0aG91Z2ggdGhlIFxjbGFzc3tDdXJzb3J9IGNsYXNzIG9mIHRoZSBcbW9kdWxle3NxbGl0ZTN9IG1vZHVsZSBpbXBsZW1lbnRzIHRoaXMKLSAgYXR0cmlidXRlLCB0aGUgZGF0YWJhc2UgZW5naW5lJ3Mgb3duIHN1cHBvcnQgZm9yIHRoZSBkZXRlcm1pbmF0aW9uIG9mICJyb3dzCi0gIGFmZmVjdGVkIi8icm93cyBzZWxlY3RlZCIgaXMgcXVpcmt5LgotCi0gIEZvciBcY29kZXtTRUxFQ1R9IHN0YXRlbWVudHMsIFxtZW1iZXJ7cm93Y291bnR9IGlzIGFsd2F5cyBOb25lIGJlY2F1c2Ugd2UgY2Fubm90Ci0gIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIHJvd3MgYSBxdWVyeSBwcm9kdWNlZCB1bnRpbCBhbGwgcm93cyB3ZXJlIGZldGNoZWQuCi0KLSAgRm9yIFxjb2Rle0RFTEVURX0gc3RhdGVtZW50cywgU1FMaXRlIHJlcG9ydHMgXG1lbWJlcntyb3djb3VudH0gYXMgMCBpZiB5b3UgbWFrZSBhCi0gIFxjb2Rle0RFTEVURSBGUk9NIHRhYmxlfSB3aXRob3V0IGFueSBjb25kaXRpb24uCi0KLSAgRm9yIFxtZXRob2R7ZXhlY3V0ZW1hbnl9IHN0YXRlbWVudHMsIHRoZSBudW1iZXIgb2YgbW9kaWZpY2F0aW9ucyBhcmUgc3VtbWVkCi0gIHVwIGludG8gXG1lbWJlcntyb3djb3VudH0uCi0KLSAgQXMgcmVxdWlyZWQgYnkgdGhlIFB5dGhvbiBEQiBBUEkgU3BlYywgdGhlIFxtZW1iZXJ7cm93Y291bnR9IGF0dHJpYnV0ZSAiaXMgLTEKLSAgaW4gY2FzZSBubyBleGVjdXRlWFgoKSBoYXMgYmVlbiBwZXJmb3JtZWQgb24gdGhlIGN1cnNvciBvciB0aGUgcm93Y291bnQKLSAgb2YgdGhlIGxhc3Qgb3BlcmF0aW9uIGlzIG5vdCBkZXRlcm1pbmFibGUgYnkgdGhlIGludGVyZmFjZSIuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxzdWJzZWN0aW9ue1NRTGl0ZSBhbmQgUHl0aG9uIHR5cGVzXGxhYmVse3NxbGl0ZTMtVHlwZXN9fQotCi1cc3Vic3Vic2VjdGlvbntJbnRyb2R1Y3Rpb259Ci0KLVNRTGl0ZSBuYXRpdmVseSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHR5cGVzOiBOVUxMLCBJTlRFR0VSLCBSRUFMLCBURVhULCBCTE9CLgotCi1UaGUgZm9sbG93aW5nIFB5dGhvbiB0eXBlcyBjYW4gdGh1cyBiZSBzZW50IHRvIFNRTGl0ZSB3aXRob3V0IGFueSBwcm9ibGVtOgotCi1cYmVnaW57dGFibGVpaX0gIHtjfGx9e2NvZGV9e1B5dGhvbiB0eXBlfXtTUUxpdGUgdHlwZX0KLVxsaW5laWl7Tm9uZX17TlVMTH0KLVxsaW5laWl7aW50fXtJTlRFR0VSfQotXGxpbmVpaXtsb25nfXtJTlRFR0VSfQotXGxpbmVpaXtmbG9hdH17UkVBTH0KLVxsaW5laWl7c3RyIChVVEY4LWVuY29kZWQpfXtURVhUfQotXGxpbmVpaXt1bmljb2RlfXtURVhUfQotXGxpbmVpaXtidWZmZXJ9e0JMT0J9Ci1cZW5ke3RhYmxlaWl9Ci0KLVRoaXMgaXMgaG93IFNRTGl0ZSB0eXBlcyBhcmUgY29udmVydGVkIHRvIFB5dGhvbiB0eXBlcyBieSBkZWZhdWx0OgotCi1cYmVnaW57dGFibGVpaX0gIHtjfGx9e2NvZGV9e1NRTGl0ZSB0eXBlfXtQeXRob24gdHlwZX0KLVxsaW5laWl7TlVMTH17Tm9uZX0KLVxsaW5laWl7SU5URUdFUn17aW50IG9yIGxvbmcsIGRlcGVuZGluZyBvbiBzaXplfQotXGxpbmVpaXtSRUFMfXtmbG9hdH0KLVxsaW5laWl7VEVYVH17ZGVwZW5kcyBvbiB0ZXh0X2ZhY3RvcnksIHVuaWNvZGUgYnkgZGVmYXVsdH0KLVxsaW5laWl7QkxPQn17YnVmZmVyfQotXGVuZHt0YWJsZWlpfQotCi1UaGUgdHlwZSBzeXN0ZW0gb2YgdGhlIFxtb2R1bGV7c3FsaXRlM30gbW9kdWxlIGlzIGV4dGVuc2libGUgaW4gdHdvIHdheXM6IHlvdSBjYW4gc3RvcmUKLWFkZGl0aW9uYWwgUHl0aG9uIHR5cGVzIGluIGEgU1FMaXRlIGRhdGFiYXNlIHZpYSBvYmplY3QgYWRhcHRhdGlvbiwgYW5kIHlvdSBjYW4KLWxldCB0aGUgXG1vZHVsZXtzcWxpdGUzfSBtb2R1bGUgY29udmVydCBTUUxpdGUgdHlwZXMgdG8gZGlmZmVyZW50IFB5dGhvbiB0eXBlcyB2aWEKLWNvbnZlcnRlcnMuCi0KLVxzdWJzdWJzZWN0aW9ue1VzaW5nIGFkYXB0ZXJzIHRvIHN0b3JlIGFkZGl0aW9uYWwgUHl0aG9uIHR5cGVzIGluIFNRTGl0ZSBkYXRhYmFzZXN9Ci0KLUFzIGRlc2NyaWJlZCBiZWZvcmUsIFNRTGl0ZSBzdXBwb3J0cyBvbmx5IGEgbGltaXRlZCBzZXQgb2YgdHlwZXMgbmF0aXZlbHkuIFRvCi11c2Ugb3RoZXIgUHl0aG9uIHR5cGVzIHdpdGggU1FMaXRlLCB5b3UgbXVzdCBcc3Ryb25ne2FkYXB0fSB0aGVtIHRvIG9uZSBvZiB0aGUgc3FsaXRlMwotbW9kdWxlJ3Mgc3VwcG9ydGVkIHR5cGVzIGZvciBTUUxpdGU6IG9uZSBvZiBOb25lVHlwZSwgaW50LCBsb25nLCBmbG9hdCwKLXN0ciwgdW5pY29kZSwgYnVmZmVyLgotCi1UaGUgXG1vZHVsZXtzcWxpdGUzfSBtb2R1bGUgdXNlcyBQeXRob24gb2JqZWN0IGFkYXB0YXRpb24sIGFzIGRlc2NyaWJlZCBpbiBccGVwezI0Nn0gZm9yIHRoaXMuICBUaGUgcHJvdG9jb2wgdG8gdXNlIGlzIFxjbGFzc3tQcmVwYXJlUHJvdG9jb2x9LgotCi1UaGVyZSBhcmUgdHdvIHdheXMgdG8gZW5hYmxlIHRoZSBcbW9kdWxle3NxbGl0ZTN9IG1vZHVsZSB0byBhZGFwdCBhIGN1c3RvbSBQeXRob24gdHlwZQotdG8gb25lIG9mIHRoZSBzdXBwb3J0ZWQgb25lcy4KLQotXHBhcmFncmFwaHtMZXR0aW5nIHlvdXIgb2JqZWN0IGFkYXB0IGl0c2VsZn0KLQotVGhpcyBpcyBhIGdvb2QgYXBwcm9hY2ggaWYgeW91IHdyaXRlIHRoZSBjbGFzcyB5b3Vyc2VsZi4gTGV0J3Mgc3VwcG9zZSB5b3UgaGF2ZQotYSBjbGFzcyBsaWtlIHRoaXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWNsYXNzIFBvaW50KG9iamVjdCk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHgsIHkpOgotICAgICAgICBzZWxmLngsIHNlbGYueSA9IHgsIHkKLVxlbmR7dmVyYmF0aW19Ci0KLU5vdyB5b3Ugd2FudCB0byBzdG9yZSB0aGUgcG9pbnQgaW4gYSBzaW5nbGUgU1FMaXRlIGNvbHVtbi4gIEZpcnN0IHlvdSdsbCBoYXZlIHRvCi1jaG9vc2Ugb25lIG9mIHRoZSBzdXBwb3J0ZWQgdHlwZXMgZmlyc3QgdG8gYmUgdXNlZCBmb3IgcmVwcmVzZW50aW5nIHRoZSBwb2ludC4KLUxldCdzIGp1c3QgdXNlIHN0ciBhbmQgc2VwYXJhdGUgdGhlIGNvb3JkaW5hdGVzIHVzaW5nIGEgc2VtaWNvbG9uLiBUaGVuIHlvdQotbmVlZCB0byBnaXZlIHlvdXIgY2xhc3MgYSBtZXRob2QgXGNvZGV7X19jb25mb3JtX18oc2VsZiwgcHJvdG9jb2wpfSB3aGljaCBtdXN0Ci1yZXR1cm4gdGhlIGNvbnZlcnRlZCB2YWx1ZS4gVGhlIHBhcmFtZXRlciBcdmFye3Byb3RvY29sfSB3aWxsIGJlCi1cY2xhc3N7UHJlcGFyZVByb3RvY29sfS4KLQotXHZlcmJhdGltaW5wdXR7c3FsaXRlMy9hZGFwdGVyX3BvaW50XzEucHl9Ci0KLVxwYXJhZ3JhcGh7UmVnaXN0ZXJpbmcgYW4gYWRhcHRlciBjYWxsYWJsZX0KLQotVGhlIG90aGVyIHBvc3NpYmlsaXR5IGlzIHRvIGNyZWF0ZSBhIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgdGhlIHR5cGUgdG8gdGhlCi1zdHJpbmcgcmVwcmVzZW50YXRpb24gYW5kIHJlZ2lzdGVyIHRoZSBmdW5jdGlvbiB3aXRoIFxtZXRob2R7cmVnaXN0ZXJfYWRhcHRlcn0uCi0KLVxiZWdpbntub3RpY2V9Ci1UaGUgdHlwZS9jbGFzcyB0byBhZGFwdCBtdXN0IGJlIGEgbmV3LXN0eWxlIGNsYXNzLCBpLiBlLiBpdCBtdXN0IGhhdmUKLVxjbGFzc3tvYmplY3R9IGFzIG9uZSBvZiBpdHMgYmFzZXMuCi1cZW5ke25vdGljZX0KLQotICAgIFx2ZXJiYXRpbWlucHV0e3NxbGl0ZTMvYWRhcHRlcl9wb2ludF8yLnB5fQotCi1UaGUgXG1vZHVsZXtzcWxpdGUzfSBtb2R1bGUgaGFzIHR3byBkZWZhdWx0IGFkYXB0ZXJzIGZvciBQeXRob24ncyBidWlsdC1pbgotXGNsYXNze2RhdGV0aW1lLmRhdGV9IGFuZCBcY2xhc3N7ZGF0ZXRpbWUuZGF0ZXRpbWV9IHR5cGVzLiAgTm93IGxldCdzIHN1cHBvc2UKLXdlIHdhbnQgdG8gc3RvcmUgXGNsYXNze2RhdGV0aW1lLmRhdGV0aW1lfSBvYmplY3RzIG5vdCBpbiBJU08gcmVwcmVzZW50YXRpb24sCi1idXQgYXMgYSBcVU5JWHt9IHRpbWVzdGFtcC4KLQotICAgIFx2ZXJiYXRpbWlucHV0e3NxbGl0ZTMvYWRhcHRlcl9kYXRldGltZS5weX0KLQotXHN1YnN1YnNlY3Rpb257Q29udmVydGluZyBTUUxpdGUgdmFsdWVzIHRvIGN1c3RvbSBQeXRob24gdHlwZXN9Ci0KLVdyaXRpbmcgYW4gYWRhcHRlciBsZXRzIHlvdSBzZW5kIGN1c3RvbSBQeXRob24gdHlwZXMgdG8gU1FMaXRlLgotQnV0IHRvIG1ha2UgaXQgcmVhbGx5IHVzZWZ1bCB3ZSBuZWVkIHRvIG1ha2UgdGhlIFB5dGhvbiB0byBTUUxpdGUgdG8gUHl0aG9uCi1yb3VuZHRyaXAgd29yay4gIAotCi1FbnRlciBjb252ZXJ0ZXJzLgotCi1MZXQncyBnbyBiYWNrIHRvIHRoZSBcY2xhc3N7UG9pbnR9IGNsYXNzLiBXZSBzdG9yZWQgdGhlIHggYW5kIHkKLWNvb3JkaW5hdGVzIHNlcGFyYXRlZCB2aWEgc2VtaWNvbG9ucyBhcyBzdHJpbmdzIGluIFNRTGl0ZS4KLQotRmlyc3QsIHdlJ2xsIGRlZmluZSBhIGNvbnZlcnRlciBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgdGhlIHN0cmluZyBhcyBhCi1wYXJhbWV0ZXIgYW5kIGNvbnN0cnVjdHMgYSBcY2xhc3N7UG9pbnR9IG9iamVjdCBmcm9tIGl0LgotCi1cYmVnaW57bm90aWNlfQotQ29udmVydGVyIGZ1bmN0aW9ucyBcc3Ryb25ne2Fsd2F5c30gZ2V0IGNhbGxlZCB3aXRoIGEgc3RyaW5nLCBubyBtYXR0ZXIKLXVuZGVyIHdoaWNoIGRhdGEgdHlwZSB5b3Ugc2VudCB0aGUgdmFsdWUgdG8gU1FMaXRlLgotXGVuZHtub3RpY2V9Ci0KLVxiZWdpbntub3RpY2V9Ci1Db252ZXJ0ZXIgbmFtZXMgYXJlIGxvb2tlZCB1cCBpbiBhIGNhc2Utc2Vuc2l0aXZlIG1hbm5lci4KLVxlbmR7bm90aWNlfQotCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICBkZWYgY29udmVydF9wb2ludChzKToKLSAgICAgICAgeCwgeSA9IG1hcChmbG9hdCwgcy5zcGxpdCgiOyIpKQotICAgICAgICByZXR1cm4gUG9pbnQoeCwgeSkKLVxlbmR7dmVyYmF0aW19Ci0KLU5vdyB5b3UgbmVlZCB0byBtYWtlIHRoZSBcbW9kdWxle3NxbGl0ZTN9IG1vZHVsZSBrbm93IHRoYXQgd2hhdCB5b3Ugc2VsZWN0IGZyb20gdGhlCi1kYXRhYmFzZSBpcyBhY3R1YWxseSBhIHBvaW50LiBUaGVyZSBhcmUgdHdvIHdheXMgb2YgZG9pbmcgdGhpczoKLQotXGJlZ2lue2l0ZW1pemV9Ci0gXGl0ZW0gSW1wbGljaXRseSB2aWEgdGhlIGRlY2xhcmVkIHR5cGUKLSBcaXRlbSBFeHBsaWNpdGx5IHZpYSB0aGUgY29sdW1uIG5hbWUKLVxlbmR7aXRlbWl6ZX0KLQotQm90aCB3YXlzIGFyZSBkZXNjcmliZWQgaW4gYGBNb2R1bGUgQ29uc3RhbnRzJycsIHNlY3Rpb25+XHJlZntzcWxpdGUzLU1vZHVsZS1Db250ZW50c30sIGluCi10aGUgZW50cmllcyBmb3IgdGhlIGNvbnN0YW50cyBcY29uc3RhbnR7UEFSU0VfREVDTFRZUEVTfSBhbmQKLVxjb25zdGFudHtQQVJTRV9DT0xOQU1FU30uCi0KLQotVGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzIGJvdGggYXBwcm9hY2hlcy4KLQotICAgIFx2ZXJiYXRpbWlucHV0e3NxbGl0ZTMvY29udmVydGVyX3BvaW50LnB5fQotCi1cc3Vic3Vic2VjdGlvbntEZWZhdWx0IGFkYXB0ZXJzIGFuZCBjb252ZXJ0ZXJzfQotCi1UaGVyZSBhcmUgZGVmYXVsdCBhZGFwdGVycyBmb3IgdGhlIGRhdGUgYW5kIGRhdGV0aW1lIHR5cGVzIGluIHRoZSBkYXRldGltZQotbW9kdWxlLiBUaGV5IHdpbGwgYmUgc2VudCBhcyBJU08gZGF0ZXMvSVNPIHRpbWVzdGFtcHMgdG8gU1FMaXRlLgotCi1UaGUgZGVmYXVsdCBjb252ZXJ0ZXJzIGFyZSByZWdpc3RlcmVkIHVuZGVyIHRoZSBuYW1lICJkYXRlIiBmb3IgXGNsYXNze2RhdGV0aW1lLmRhdGV9Ci1hbmQgdW5kZXIgdGhlIG5hbWUgInRpbWVzdGFtcCIgZm9yIFxjbGFzc3tkYXRldGltZS5kYXRldGltZX0uCi0KLVRoaXMgd2F5LCB5b3UgY2FuIHVzZSBkYXRlL3RpbWVzdGFtcHMgZnJvbSBQeXRob24gd2l0aG91dCBhbnkgYWRkaXRpb25hbAotZmlkZGxpbmcgaW4gbW9zdCBjYXNlcy4gVGhlIGZvcm1hdCBvZiB0aGUgYWRhcHRlcnMgaXMgYWxzbyBjb21wYXRpYmxlIHdpdGggdGhlCi1leHBlcmltZW50YWwgU1FMaXRlIGRhdGUvdGltZSBmdW5jdGlvbnMuCi0KLVRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgdGhpcy4KLQotICAgIFx2ZXJiYXRpbWlucHV0e3NxbGl0ZTMvcHlzcWxpdGVfZGF0ZXRpbWUucHl9Ci0KLVxzdWJzZWN0aW9ue0NvbnRyb2xsaW5nIFRyYW5zYWN0aW9ucyBcbGFiZWx7c3FsaXRlMy1Db250cm9sbGluZy1UcmFuc2FjdGlvbnN9fQotCi1CeSBkZWZhdWx0LCB0aGUgXG1vZHVsZXtzcWxpdGUzfSBtb2R1bGUgb3BlbnMgdHJhbnNhY3Rpb25zIGltcGxpY2l0bHkgYmVmb3JlIGEgRGF0YSBNb2RpZmljYXRpb24gTGFuZ3VhZ2UgKERNTCkgCi1zdGF0ZW1lbnQgKGkuZS4gSU5TRVJUL1VQREFURS9ERUxFVEUvUkVQTEFDRSksIGFuZCBjb21taXRzIHRyYW5zYWN0aW9ucyBpbXBsaWNpdGx5Ci1iZWZvcmUgYSBub24tRE1MLCBub24tcXVlcnkgc3RhdGVtZW50IChpLiBlLiBhbnl0aGluZyBvdGhlciB0aGFuCi1TRUxFQ1QvSU5TRVJUL1VQREFURS9ERUxFVEUvUkVQTEFDRSkuCi0KLVNvIGlmIHlvdSBhcmUgd2l0aGluIGEgdHJhbnNhY3Rpb24gYW5kIGlzc3VlIGEgY29tbWFuZCBsaWtlIFxjb2Rle0NSRUFURSBUQUJMRQotLi4ufSwgXGNvZGV7VkFDVVVNfSwgXGNvZGV7UFJBR01BfSwgdGhlIFxtb2R1bGV7c3FsaXRlM30gbW9kdWxlIHdpbGwgY29tbWl0IGltcGxpY2l0bHkKLWJlZm9yZSBleGVjdXRpbmcgdGhhdCBjb21tYW5kLiBUaGVyZSBhcmUgdHdvIHJlYXNvbnMgZm9yIGRvaW5nIHRoYXQuIFRoZSBmaXJzdAotaXMgdGhhdCBzb21lIG9mIHRoZXNlIGNvbW1hbmRzIGRvbid0IHdvcmsgd2l0aGluIHRyYW5zYWN0aW9ucy4gVGhlIG90aGVyIHJlYXNvbgotaXMgdGhhdCBweXNxbGl0ZSBuZWVkcyB0byBrZWVwIHRyYWNrIG9mIHRoZSB0cmFuc2FjdGlvbiBzdGF0ZSAoaWYgYSB0cmFuc2FjdGlvbgotaXMgYWN0aXZlIG9yIG5vdCkuCi0KLVlvdSBjYW4gY29udHJvbCB3aGljaCBraW5kIG9mICJCRUdJTiIgc3RhdGVtZW50cyBweXNxbGl0ZSBpbXBsaWNpdGx5IGV4ZWN1dGVzCi0ob3Igbm9uZSBhdCBhbGwpIHZpYSB0aGUgXHZhcntpc29sYXRpb25fbGV2ZWx9IHBhcmFtZXRlciB0byB0aGUKLVxmdW5jdGlvbntjb25uZWN0fSBjYWxsLCBvciB2aWEgdGhlIFxtZW1iZXJ7aXNvbGF0aW9uX2xldmVsfSBwcm9wZXJ0eSBvZgotY29ubmVjdGlvbnMuCi0KLUlmIHlvdSB3YW50IFxzdHJvbmd7YXV0b2NvbW1pdCBtb2RlfSwgdGhlbiBzZXQgXG1lbWJlcntpc29sYXRpb25fbGV2ZWx9IHRvIE5vbmUuCi0KLU90aGVyd2lzZSBsZWF2ZSBpdCBhdCBpdHMgZGVmYXVsdCwgd2hpY2ggd2lsbCByZXN1bHQgaW4gYSBwbGFpbiAiQkVHSU4iCi1zdGF0ZW1lbnQsIG9yIHNldCBpdCB0byBvbmUgb2YgU1FMaXRlJ3Mgc3VwcG9ydGVkIGlzb2xhdGlvbiBsZXZlbHM6IERFRkVSUkVELAotSU1NRURJQVRFIG9yIEVYQ0xVU0lWRS4KLQotQXMgdGhlIFxtb2R1bGV7c3FsaXRlM30gbW9kdWxlIG5lZWRzIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHRyYW5zYWN0aW9uIHN0YXRlLCB5b3Ugc2hvdWxkCi1ub3QgdXNlIFxjb2Rle09SIFJPTExCQUNLfSBvciBcY29kZXtPTiBDT05GTElDVCBST0xMQkFDS30gaW4geW91ciBTUUwuIEluc3RlYWQsCi1jYXRjaCB0aGUgXGV4Y2VwdGlvbntJbnRlZ3JpdHlFcnJvcn0gYW5kIGNhbGwgdGhlIFxtZXRob2R7cm9sbGJhY2t9IG1ldGhvZCBvZgotdGhlIGNvbm5lY3Rpb24geW91cnNlbGYuCi0KLVxzdWJzZWN0aW9ue1VzaW5nIHB5c3FsaXRlIGVmZmljaWVudGx5fQotCi1cc3Vic3Vic2VjdGlvbntVc2luZyBzaG9ydGN1dCBtZXRob2RzfQotCi1Vc2luZyB0aGUgbm9uc3RhbmRhcmQgXG1ldGhvZHtleGVjdXRlfSwgXG1ldGhvZHtleGVjdXRlbWFueX0gYW5kCi1cbWV0aG9ke2V4ZWN1dGVzY3JpcHR9IG1ldGhvZHMgb2YgdGhlIFxjbGFzc3tDb25uZWN0aW9ufSBvYmplY3QsIHlvdXIgY29kZSBjYW4KLWJlIHdyaXR0ZW4gbW9yZSBjb25jaXNlbHkgYmVjYXVzZSB5b3UgZG9uJ3QgaGF2ZSB0byBjcmVhdGUgdGhlIChvZnRlbgotc3VwZXJmbHVvdXMpIFxjbGFzc3tDdXJzb3J9IG9iamVjdHMgZXhwbGljaXRseS4gSW5zdGVhZCwgdGhlIFxjbGFzc3tDdXJzb3J9Ci1vYmplY3RzIGFyZSBjcmVhdGVkIGltcGxpY2l0bHkgYW5kIHRoZXNlIHNob3J0Y3V0IG1ldGhvZHMgcmV0dXJuIHRoZSBjdXJzb3IKLW9iamVjdHMuIFRoaXMgd2F5LCB5b3UgY2FuIGV4ZWN1dGUgYSBTRUxFQ1Qgc3RhdGVtZW50IGFuZCBpdGVyYXRlCi1vdmVyIGl0IGRpcmVjdGx5IHVzaW5nIG9ubHkgYSBzaW5nbGUgY2FsbCBvbiB0aGUgXGNsYXNze0Nvbm5lY3Rpb259IG9iamVjdC4KLQotICAgIFx2ZXJiYXRpbWlucHV0e3NxbGl0ZTMvc2hvcnRjdXRfbWV0aG9kcy5weX0KLQotXHN1YnN1YnNlY3Rpb257QWNjZXNzaW5nIGNvbHVtbnMgYnkgbmFtZSBpbnN0ZWFkIG9mIGJ5IGluZGV4fQotCi1PbmUgdXNlZnVsIGZlYXR1cmUgb2YgdGhlIFxtb2R1bGV7c3FsaXRlM30gbW9kdWxlIGlzIHRoZSBidWlsdGluIFxjbGFzc3tzcWxpdGUzLlJvd30gY2xhc3MKLWRlc2lnbmVkIHRvIGJlIHVzZWQgYXMgYSByb3cgZmFjdG9yeS4KLQotUm93cyB3cmFwcGVkIHdpdGggdGhpcyBjbGFzcyBjYW4gYmUgYWNjZXNzZWQgYm90aCBieSBpbmRleCAobGlrZSB0dXBsZXMpIGFuZAotY2FzZS1pbnNlbnNpdGl2ZWx5IGJ5IG5hbWU6Ci0KLSAgICBcdmVyYmF0aW1pbnB1dHtzcWxpdGUzL3Jvd2NsYXNzLnB5fQotCi0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic3RhdC50ZXggYi9Eb2MvbGliL2xpYnN0YXQudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTM1M2YxLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlic3RhdC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtzdGF0fSAtLS0KLSAgICAgICAgIEludGVycHJldGluZyBcZnVuY3Rpb257c3RhdCgpfSByZXN1bHRzfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17c3RhdH0KLVxtb2R1bGVzeW5vcHNpc3tVdGlsaXRpZXMgZm9yIGludGVycHJldGluZyB0aGUgcmVzdWx0cyBvZgotICBcZnVuY3Rpb257b3Muc3RhdCgpfSwgXGZ1bmN0aW9ue29zLmxzdGF0KCl9IGFuZCBcZnVuY3Rpb257b3MuZnN0YXQoKX0ufQotXHNlY3Rpb25hdXRob3J7U2tpcCBNb250YW5hcm99e3NraXBAYXV0b21hdHJpeC5jb219Ci0KLQotVGhlIFxtb2R1bGV7c3RhdH0gbW9kdWxlIGRlZmluZXMgY29uc3RhbnRzIGFuZCBmdW5jdGlvbnMgZm9yCi1pbnRlcnByZXRpbmcgdGhlIHJlc3VsdHMgb2YgXGZ1bmN0aW9ue29zLnN0YXQoKX0sCi1cZnVuY3Rpb257b3MuZnN0YXQoKX0gYW5kIFxmdW5jdGlvbntvcy5sc3RhdCgpfSAoaWYgdGhleSBleGlzdCkuICBGb3IKLWNvbXBsZXRlIGRldGFpbHMgYWJvdXQgdGhlIFxjZnVuY3Rpb257c3RhdCgpfSwgXGNmdW5jdGlvbntmc3RhdCgpfSBhbmQKLVxjZnVuY3Rpb257bHN0YXQoKX0gY2FsbHMsIGNvbnN1bHQgdGhlIGRvY3VtZW50YXRpb24gZm9yIHlvdXIgc3lzdGVtLgotCi1UaGUgXG1vZHVsZXtzdGF0fSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyB0byB0ZXN0IGZvcgotc3BlY2lmaWMgZmlsZSB0eXBlczoKLQotCi1cYmVnaW57ZnVuY2Rlc2N9e1NfSVNESVJ9e21vZGV9Ci1SZXR1cm4gbm9uLXplcm8gaWYgdGhlIG1vZGUgaXMgZnJvbSBhIGRpcmVjdG9yeS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317U19JU0NIUn17bW9kZX0KLVJldHVybiBub24temVybyBpZiB0aGUgbW9kZSBpcyBmcm9tIGEgY2hhcmFjdGVyIHNwZWNpYWwgZGV2aWNlIGZpbGUuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e1NfSVNCTEt9e21vZGV9Ci1SZXR1cm4gbm9uLXplcm8gaWYgdGhlIG1vZGUgaXMgZnJvbSBhIGJsb2NrIHNwZWNpYWwgZGV2aWNlIGZpbGUuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e1NfSVNSRUd9e21vZGV9Ci1SZXR1cm4gbm9uLXplcm8gaWYgdGhlIG1vZGUgaXMgZnJvbSBhIHJlZ3VsYXIgZmlsZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317U19JU0ZJRk99e21vZGV9Ci1SZXR1cm4gbm9uLXplcm8gaWYgdGhlIG1vZGUgaXMgZnJvbSBhIEZJRk8gKG5hbWVkIHBpcGUpLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtTX0lTTE5LfXttb2RlfQotUmV0dXJuIG5vbi16ZXJvIGlmIHRoZSBtb2RlIGlzIGZyb20gYSBzeW1ib2xpYyBsaW5rLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtTX0lTU09DS317bW9kZX0KLVJldHVybiBub24temVybyBpZiB0aGUgbW9kZSBpcyBmcm9tIGEgc29ja2V0LgotXGVuZHtmdW5jZGVzY30KLQotVHdvIGFkZGl0aW9uYWwgZnVuY3Rpb25zIGFyZSBkZWZpbmVkIGZvciBtb3JlIGdlbmVyYWwgbWFuaXB1bGF0aW9uIG9mCi10aGUgZmlsZSdzIG1vZGU6Ci0KLVxiZWdpbntmdW5jZGVzY317U19JTU9ERX17bW9kZX0KLVJldHVybiB0aGUgcG9ydGlvbiBvZiB0aGUgZmlsZSdzIG1vZGUgdGhhdCBjYW4gYmUgc2V0IGJ5Ci1cZnVuY3Rpb257b3MuY2htb2QoKX0tLS10aGF0IGlzLCB0aGUgZmlsZSdzIHBlcm1pc3Npb24gYml0cywgcGx1cyB0aGUKLXN0aWNreSBiaXQsIHNldC1ncm91cC1pZCwgYW5kIHNldC11c2VyLWlkIGJpdHMgKG9uIHN5c3RlbXMgdGhhdCBzdXBwb3J0Ci10aGVtKS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317U19JRk1UfXttb2RlfQotUmV0dXJuIHRoZSBwb3J0aW9uIG9mIHRoZSBmaWxlJ3MgbW9kZSB0aGF0IGRlc2NyaWJlcyB0aGUgZmlsZSB0eXBlICh1c2VkCi1ieSB0aGUgXGZ1bmN0aW9ue1NfSVMqKCl9IGZ1bmN0aW9ucyBhYm92ZSkuCi1cZW5ke2Z1bmNkZXNjfQotCi1Ob3JtYWxseSwgeW91IHdvdWxkIHVzZSB0aGUgXGZ1bmN0aW9ue29zLnBhdGguaXMqKCl9IGZ1bmN0aW9ucyBmb3IKLXRlc3RpbmcgdGhlIHR5cGUgb2YgYSBmaWxlOyB0aGUgZnVuY3Rpb25zIGhlcmUgYXJlIHVzZWZ1bCB3aGVuIHlvdSBhcmUKLWRvaW5nIG11bHRpcGxlIHRlc3RzIG9mIHRoZSBzYW1lIGZpbGUgYW5kIHdpc2ggdG8gYXZvaWQgdGhlIG92ZXJoZWFkIG9mCi10aGUgXGNmdW5jdGlvbntzdGF0KCl9IHN5c3RlbSBjYWxsIGZvciBlYWNoIHRlc3QuICBUaGVzZSBhcmUgYWxzbwotdXNlZnVsIHdoZW4gY2hlY2tpbmcgZm9yIGluZm9ybWF0aW9uIGFib3V0IGEgZmlsZSB0aGF0IGlzbid0IGhhbmRsZWQKLWJ5IFxyZWZtb2R1bGV7b3MucGF0aH0sIGxpa2UgdGhlIHRlc3RzIGZvciBibG9jayBhbmQgY2hhcmFjdGVyCi1kZXZpY2VzLgotCi1BbGwgdGhlIHZhcmlhYmxlcyBiZWxvdyBhcmUgc2ltcGx5IHN5bWJvbGljIGluZGV4ZXMgaW50byB0aGUgMTAtdHVwbGUKLXJldHVybmVkIGJ5IFxmdW5jdGlvbntvcy5zdGF0KCl9LCBcZnVuY3Rpb257b3MuZnN0YXQoKX0gb3IKLVxmdW5jdGlvbntvcy5sc3RhdCgpfS4KLQotXGJlZ2lue2RhdGFkZXNjfXtTVF9NT0RFfQotSW5vZGUgcHJvdGVjdGlvbiBtb2RlLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtTVF9JTk99Ci1Jbm9kZSBudW1iZXIuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1NUX0RFVn0KLURldmljZSBpbm9kZSByZXNpZGVzIG9uLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtTVF9OTElOS30KLU51bWJlciBvZiBsaW5rcyB0byB0aGUgaW5vZGUuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1NUX1VJRH0KLVVzZXIgaWQgb2YgdGhlIG93bmVyLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtTVF9HSUR9Ci1Hcm91cCBpZCBvZiB0aGUgb3duZXIuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1NUX1NJWkV9Ci1TaXplIGluIGJ5dGVzIG9mIGEgcGxhaW4gZmlsZTsgYW1vdW50IG9mIGRhdGEgd2FpdGluZyBvbiBzb21lIHNwZWNpYWwKLWZpbGVzLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtTVF9BVElNRX0KLVRpbWUgb2YgbGFzdCBhY2Nlc3MuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1NUX01USU1FfQotVGltZSBvZiBsYXN0IG1vZGlmaWNhdGlvbi4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317U1RfQ1RJTUV9Ci1UaGUgYGBjdGltZScnIGFzIHJlcG9ydGVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgT24gc29tZSBzeXN0ZW1zCi0obGlrZSBcVU5JWCkgaXMgdGhlIHRpbWUgb2YgdGhlIGxhc3QgbWV0YWRhdGEgY2hhbmdlLCBhbmQsIG9uIG90aGVycwotKGxpa2UgV2luZG93cyksIGlzIHRoZSBjcmVhdGlvbiB0aW1lIChzZWUgcGxhdGZvcm0gZG9jdW1lbnRhdGlvbiBmb3IKLWRldGFpbHMpLgotXGVuZHtkYXRhZGVzY30KLQotVGhlIGludGVycHJldGF0aW9uIG9mIGBgZmlsZSBzaXplJycgY2hhbmdlcyBhY2NvcmRpbmcgdG8gdGhlIGZpbGUKLXR5cGUuICBGb3IgcGxhaW4gZmlsZXMgdGhpcyBpcyB0aGUgc2l6ZSBvZiB0aGUgZmlsZSBpbiBieXRlcy4gIEZvcgotRklGT3MgYW5kIHNvY2tldHMgdW5kZXIgbW9zdCBmbGF2b3JzIG9mIFxVTklYe30gKGluY2x1ZGluZyBMaW51eCBpbgotcGFydGljdWxhciksIHRoZSBgYHNpemUnJyBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdhaXRpbmcgdG8gYmUgcmVhZCBhdAotdGhlIHRpbWUgb2YgdGhlIGNhbGwgdG8gXGZ1bmN0aW9ue29zLnN0YXQoKX0sIFxmdW5jdGlvbntvcy5mc3RhdCgpfSwKLW9yIFxmdW5jdGlvbntvcy5sc3RhdCgpfTsgdGhpcyBjYW4gc29tZXRpbWVzIGJlIHVzZWZ1bCwgZXNwZWNpYWxseSBmb3IKLXBvbGxpbmcgb25lIG9mIHRoZXNlIHNwZWNpYWwgZmlsZXMgYWZ0ZXIgYSBub24tYmxvY2tpbmcgb3Blbi4gIFRoZQotbWVhbmluZyBvZiB0aGUgc2l6ZSBmaWVsZCBmb3Igb3RoZXIgY2hhcmFjdGVyIGFuZCBibG9jayBkZXZpY2VzIHZhcmllcwotbW9yZSwgZGVwZW5kaW5nIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdW5kZXJseWluZyBzeXN0ZW0gY2FsbC4KLQotRXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IG9zLCBzeXMKLWZyb20gc3RhdCBpbXBvcnQgKgotCi1kZWYgd2Fsa3RyZWUodG9wLCBjYWxsYmFjayk6Ci0gICAgJycncmVjdXJzaXZlbHkgZGVzY2VuZCB0aGUgZGlyZWN0b3J5IHRyZWUgcm9vdGVkIGF0IHRvcCwKLSAgICAgICBjYWxsaW5nIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgZWFjaCByZWd1bGFyIGZpbGUnJycKLQotICAgIGZvciBmIGluIG9zLmxpc3RkaXIodG9wKToKLSAgICAgICAgcGF0aG5hbWUgPSBvcy5wYXRoLmpvaW4odG9wLCBmKQotICAgICAgICBtb2RlID0gb3Muc3RhdChwYXRobmFtZSlbU1RfTU9ERV0KLSAgICAgICAgaWYgU19JU0RJUihtb2RlKToKLSAgICAgICAgICAgICMgSXQncyBhIGRpcmVjdG9yeSwgcmVjdXJzZSBpbnRvIGl0Ci0gICAgICAgICAgICB3YWxrdHJlZShwYXRobmFtZSwgY2FsbGJhY2spCi0gICAgICAgIGVsaWYgU19JU1JFRyhtb2RlKToKLSAgICAgICAgICAgICMgSXQncyBhIGZpbGUsIGNhbGwgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uCi0gICAgICAgICAgICBjYWxsYmFjayhwYXRobmFtZSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgICMgVW5rbm93biBmaWxlIHR5cGUsIHByaW50IGEgbWVzc2FnZQotICAgICAgICAgICAgcHJpbnQgJ1NraXBwaW5nICVzJyAlIHBhdGhuYW1lCi0KLWRlZiB2aXNpdGZpbGUoZmlsZSk6Ci0gICAgcHJpbnQgJ3Zpc2l0aW5nJywgZmlsZQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIHdhbGt0cmVlKHN5cy5hcmd2WzFdLCB2aXNpdGZpbGUpCi1cZW5ke3ZlcmJhdGltfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJzdGF0dmZzLnRleCBiL0RvYy9saWIvbGlic3RhdHZmcy50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYzg5MzMuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJzdGF0dmZzLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7c3RhdHZmc30gLS0tCi0gICAgICAgICBDb25zdGFudHMgdXNlZCB3aXRoIFxmdW5jdGlvbntvcy5zdGF0dmZzKCl9fQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17c3RhdHZmc30KLSUgTGFUZVgnZWQgZnJvbSBjb21tZW50cyBpbiBtb2R1bGUKLVxzZWN0aW9uYXV0aG9ye01vc2hlIFphZGthfXttb3NoZXpAemFka2Euc2l0ZS5jby5pbH0KLVxtb2R1bGVzeW5vcHNpc3tDb25zdGFudHMgZm9yIGludGVycHJldGluZyB0aGUgcmVzdWx0IG9mCi0gICAgICAgICAgICAgICAgXGZ1bmN0aW9ue29zLnN0YXR2ZnMoKX0ufQotCi1UaGUgXG1vZHVsZXtzdGF0dmZzfSBtb2R1bGUgZGVmaW5lcyBjb25zdGFudHMgc28gaW50ZXJwcmV0aW5nIHRoZSByZXN1bHQKLWlmIFxmdW5jdGlvbntvcy5zdGF0dmZzKCl9LCB3aGljaCByZXR1cm5zIGEgdHVwbGUsIGNhbiBiZSBtYWRlIHdpdGhvdXQKLXJlbWVtYmVyaW5nIGBgbWFnaWMgbnVtYmVycy4nJyAgRWFjaCBvZiB0aGUgY29uc3RhbnRzIGRlZmluZWQgaW4gdGhpcwotbW9kdWxlIGlzIHRoZSBcZW1waHtpbmRleH0gb2YgdGhlIGVudHJ5IGluIHRoZSB0dXBsZSByZXR1cm5lZCBieQotXGZ1bmN0aW9ue29zLnN0YXR2ZnMoKX0gdGhhdCBjb250YWlucyB0aGUgc3BlY2lmaWVkIGluZm9ybWF0aW9uLgotCi0KLVxiZWdpbntkYXRhZGVzY317Rl9CU0laRX0KLVByZWZlcnJlZCBmaWxlIHN5c3RlbSBibG9jayBzaXplLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtGX0ZSU0laRX0KLUZ1bmRhbWVudGFsIGZpbGUgc3lzdGVtIGJsb2NrIHNpemUuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e0ZfQkxPQ0tTfQotVG90YWwgbnVtYmVyIG9mIGJsb2NrcyBpbiB0aGUgZmlsZXN5c3RlbS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317Rl9CRlJFRX0KLVRvdGFsIG51bWJlciBvZiBmcmVlIGJsb2Nrcy4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317Rl9CQVZBSUx9Ci1GcmVlIGJsb2NrcyBhdmFpbGFibGUgdG8gbm9uLXN1cGVyIHVzZXIuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e0ZfRklMRVN9Ci1Ub3RhbCBudW1iZXIgb2YgZmlsZSBub2Rlcy4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317Rl9GRlJFRX0KLVRvdGFsIG51bWJlciBvZiBmcmVlIGZpbGUgbm9kZXMuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e0ZfRkFWQUlMfQotRnJlZSBub2RlcyBhdmFpbGFibGUgdG8gbm9uLXN1cGVyIHVzZXIuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e0ZfRkxBR30KLUZsYWdzLiBTeXN0ZW0gZGVwZW5kZW50OiBzZWUgXGNmdW5jdGlvbntzdGF0dmZzKCl9IG1hbiBwYWdlLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtGX05BTUVNQVh9Ci1NYXhpbXVtIGZpbGUgbmFtZSBsZW5ndGguCi1cZW5ke2RhdGFkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJzdGR0eXBlcy50ZXggYi9Eb2MvbGliL2xpYnN0ZHR5cGVzLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUwMzNmOS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnN0ZHR5cGVzLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDIwNzAgKzAsMCBAQAotXGNoYXB0ZXJ7QnVpbHQtaW4gVHlwZXMgXGxhYmVse3R5cGVzfX0KLQotVGhlIGZvbGxvd2luZyBzZWN0aW9ucyBkZXNjcmliZSB0aGUgc3RhbmRhcmQgdHlwZXMgdGhhdCBhcmUgYnVpbHQgaW50bwotdGhlIGludGVycHJldGVyLgotXG5vdGV7SGlzdG9yaWNhbGx5ICh1bnRpbCByZWxlYXNlIDIuMiksIFB5dGhvbidzIGJ1aWx0LWluIHR5cGVzIGhhdmUKLWRpZmZlcmVkIGZyb20gdXNlci1kZWZpbmVkIHR5cGVzIGJlY2F1c2UgaXQgd2FzIG5vdCBwb3NzaWJsZSB0byB1c2UKLXRoZSBidWlsdC1pbiB0eXBlcyBhcyB0aGUgYmFzaXMgZm9yIG9iamVjdC1vcmllbnRlZCBpbmhlcml0YW5jZS4KLVRoaXMgbGltaXRhdGlvbiBkb2VzIG5vdCBleGlzdCBhbnkgbG9uZ2VyLn0KLQotVGhlIHByaW5jaXBhbCBidWlsdC1pbiB0eXBlcyBhcmUgbnVtZXJpY3MsIHNlcXVlbmNlcywgbWFwcGluZ3MsIGZpbGVzLAotY2xhc3NlcywgaW5zdGFuY2VzIGFuZCBleGNlcHRpb25zLgotXGluZGV4aWl7YnVpbHQtaW59e3R5cGVzfQotCi1Tb21lIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZCBieSBzZXZlcmFsIG9iamVjdCB0eXBlczsgaW4gcGFydGljdWxhciwKLXByYWN0aWNhbGx5IGFsbCBvYmplY3RzIGNhbiBiZSBjb21wYXJlZCwgdGVzdGVkIGZvciB0cnV0aCB2YWx1ZSwKLWFuZCBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgKHdpdGgKLXRoZSBcZnVuY3Rpb257cmVwcigpfSBmdW5jdGlvbiBvciB0aGUgc2xpZ2h0bHkgZGlmZmVyZW50Ci1cZnVuY3Rpb257c3RyKCl9IGZ1bmN0aW9uKS4gIFRoZSBsYXR0ZXIKLWZ1bmN0aW9uIGlzIGltcGxpY2l0bHkgdXNlZCB3aGVuIGFuIG9iamVjdCBpcyB3cml0dGVuIGJ5IHRoZQotXGtleXdvcmR7cHJpbnR9XHN0aW5kZXh7cHJpbnR9IHN0YXRlbWVudC4KLShJbmZvcm1hdGlvbiBvbiB0aGUgXHVsaW5re1xrZXl3b3Jke3ByaW50fSBzdGF0ZW1lbnR9ey4uL3JlZi9wcmludC5odG1sfQotYW5kIG90aGVyIGxhbmd1YWdlIHN0YXRlbWVudHMgY2FuIGJlIGZvdW5kIGluIHRoZQotXGNpdGV0aXRsZVsuLi9yZWYvcmVmLmh0bWxde1B5dGhvbiBSZWZlcmVuY2UgTWFudWFsfSBhbmQgdGhlCi1cY2l0ZXRpdGxlWy4uL3R1dC90dXQuaHRtbF17UHl0aG9uIFR1dG9yaWFsfS4pCi0KLQotXHNlY3Rpb257VHJ1dGggVmFsdWUgVGVzdGluZ1xsYWJlbHt0cnV0aH19Ci0KLUFueSBvYmplY3QgY2FuIGJlIHRlc3RlZCBmb3IgdHJ1dGggdmFsdWUsIGZvciB1c2UgaW4gYW4gXGtleXdvcmR7aWZ9IG9yCi1ca2V5d29yZHt3aGlsZX0gY29uZGl0aW9uIG9yIGFzIG9wZXJhbmQgb2YgdGhlIEJvb2xlYW4gb3BlcmF0aW9ucyBiZWxvdy4KLVRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBjb25zaWRlcmVkIGZhbHNlOgotXHN0aW5kZXh7aWZ9Ci1cc3RpbmRleHt3aGlsZX0KLVxpbmRleGlpe3RydXRofXt2YWx1ZX0KLVxpbmRleGlpe0Jvb2xlYW59e29wZXJhdGlvbnN9Ci1caW5kZXh7ZmFsc2V9Ci0KLVxiZWdpbntpdGVtaXplfQotCi1caXRlbQlcY29kZXtOb25lfQotICAgICAgICBcd2l0aHN1Yml0ZW17KEJ1aWx0LWluIG9iamVjdCl9e1x0dGluZGV4e05vbmV9fQotCi1caXRlbQlcY29kZXtGYWxzZX0KLSAgICAgICAgXHdpdGhzdWJpdGVteyhCdWlsdC1pbiBvYmplY3QpfXtcdHRpbmRleHtGYWxzZX19Ci0KLVxpdGVtCXplcm8gb2YgYW55IG51bWVyaWMgdHlwZSwgZm9yIGV4YW1wbGUsIFxjb2RlezB9LCBcY29kZXswTH0sCi0gICAgICAgIFxjb2RlezAuMH0sIFxjb2RlezBqfS4KLQotXGl0ZW0JYW55IGVtcHR5IHNlcXVlbmNlLCBmb3IgZXhhbXBsZSwgXGNvZGV7Jyd9LCBcY29kZXsoKX0sIFxjb2Rle1tdfS4KLQotXGl0ZW0JYW55IGVtcHR5IG1hcHBpbmcsIGZvciBleGFtcGxlLCBcY29kZXtce1x9fS4KLQotXGl0ZW0JaW5zdGFuY2VzIG9mIHVzZXItZGVmaW5lZCBjbGFzc2VzLCBpZiB0aGUgY2xhc3MgZGVmaW5lcyBhCi0gICAgICAgIFxtZXRob2R7X19ib29sX18oKX0gb3IgXG1ldGhvZHtfX2xlbl9fKCl9IG1ldGhvZCwgd2hlbiB0aGF0Ci0gICAgICAgIG1ldGhvZCByZXR1cm5zIHRoZSBpbnRlZ2VyIHplcm8gb3IgXGNsYXNze2Jvb2x9IHZhbHVlCi0gICAgICAgIFxjb2Rle0ZhbHNlfS5cZm9vdG5vdGV7QWRkaXRpb25hbCAKLWluZm9ybWF0aW9uIG9uIHRoZXNlIHNwZWNpYWwgbWV0aG9kcyBtYXkgYmUgZm91bmQgaW4gdGhlCi1cY2l0ZXRpdGxlWy4uL3JlZi9yZWYuaHRtbF17UHl0aG9uIFJlZmVyZW5jZSBNYW51YWx9Ln0KLQotXGVuZHtpdGVtaXplfQotCi1BbGwgb3RoZXIgdmFsdWVzIGFyZSBjb25zaWRlcmVkIHRydWUgLS0tIHNvIG9iamVjdHMgb2YgbWFueSB0eXBlcyBhcmUKLWFsd2F5cyB0cnVlLgotXGluZGV4e3RydWV9Ci0KLU9wZXJhdGlvbnMgYW5kIGJ1aWx0LWluIGZ1bmN0aW9ucyB0aGF0IGhhdmUgYSBCb29sZWFuIHJlc3VsdCBhbHdheXMKLXJldHVybiBcY29kZXswfSBvciBcY29kZXtGYWxzZX0gZm9yIGZhbHNlIGFuZCBcY29kZXsxfSBvciBcY29kZXtUcnVlfQotZm9yIHRydWUsIHVubGVzcyBvdGhlcndpc2Ugc3RhdGVkLiAgKEltcG9ydGFudCBleGNlcHRpb246IHRoZSBCb29sZWFuCi1vcGVyYXRpb25zIFxzYW1we29yfVxvcGluZGV4e29yfSBhbmQgXHNhbXB7YW5kfVxvcGluZGV4e2FuZH0gYWx3YXlzCi1yZXR1cm4gb25lIG9mIHRoZWlyIG9wZXJhbmRzLikKLVxpbmRleHtGYWxzZX0KLVxpbmRleHtUcnVlfQotCi1cc2VjdGlvbntCb29sZWFuIE9wZXJhdGlvbnMgLS0tCi0JICAgIFxrZXl3b3Jke2FuZH0sIFxrZXl3b3Jke29yfSwgXGtleXdvcmR7bm90fQotCSAgICBcbGFiZWx7Ym9vbGVhbn19Ci0KLVRoZXNlIGFyZSB0aGUgQm9vbGVhbiBvcGVyYXRpb25zLCBvcmRlcmVkIGJ5IGFzY2VuZGluZyBwcmlvcml0eToKLVxpbmRleGlpe0Jvb2xlYW59e29wZXJhdGlvbnN9Ci0KLVxiZWdpbnt0YWJsZWlpaX17Y3xsfGN9e2NvZGV9e09wZXJhdGlvbn17UmVzdWx0fXtOb3Rlc30KLSAgXGxpbmVpaWl7XHZhcnt4fSBvciBcdmFye3l9fQotICAgICAgICAgIHtpZiBcdmFye3h9IGlzIGZhbHNlLCB0aGVuIFx2YXJ7eX0sIGVsc2UgXHZhcnt4fX17KDEpfQotICBcbGluZWlpaXtcdmFye3h9IGFuZCBcdmFye3l9fQotICAgICAgICAgIHtpZiBcdmFye3h9IGlzIGZhbHNlLCB0aGVuIFx2YXJ7eH0sIGVsc2UgXHZhcnt5fX17KDEpfQotICBcaGxpbmUKLSAgXGxpbmVpaWl7bm90IFx2YXJ7eH19Ci0gICAgICAgICAge2lmIFx2YXJ7eH0gaXMgZmFsc2UsIHRoZW4gXGNvZGV7VHJ1ZX0sIGVsc2UgXGNvZGV7RmFsc2V9fXsoMil9Ci1cZW5ke3RhYmxlaWlpfQotXG9waW5kZXh7YW5kfQotXG9waW5kZXh7b3J9Ci1cb3BpbmRleHtub3R9Ci0KLVxub2luZGVudAotTm90ZXM6Ci0KLVxiZWdpbntkZXNjcmlwdGlvbn0KLQotXGl0ZW1bKDEpXQotVGhlc2Ugb25seSBldmFsdWF0ZSB0aGVpciBzZWNvbmQgYXJndW1lbnQgaWYgbmVlZGVkIGZvciB0aGVpciBvdXRjb21lLgotCi1caXRlbVsoMildCi1cc2FtcHtub3R9IGhhcyBhIGxvd2VyIHByaW9yaXR5IHRoYW4gbm9uLUJvb2xlYW4gb3BlcmF0b3JzLCBzbwotXGNvZGV7bm90IFx2YXJ7YX0gPT0gXHZhcntifX0gaXMgaW50ZXJwcmV0ZWQgYXMgXGNvZGV7bm90IChcdmFye2F9ID09Ci1cdmFye2J9KX0sIGFuZCBcY29kZXtcdmFye2F9ID09IG5vdCBcdmFye2J9fSBpcyBhIHN5bnRheCBlcnJvci4KLQotXGVuZHtkZXNjcmlwdGlvbn0KLQotCi1cc2VjdGlvbntDb21wYXJpc29ucyBcbGFiZWx7Y29tcGFyaXNvbnN9fQotCi1Db21wYXJpc29uIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZCBieSBhbGwgb2JqZWN0cy4gIFRoZXkgYWxsIGhhdmUgdGhlCi1zYW1lIHByaW9yaXR5ICh3aGljaCBpcyBoaWdoZXIgdGhhbiB0aGF0IG9mIHRoZSBCb29sZWFuIG9wZXJhdGlvbnMpLgotQ29tcGFyaXNvbnMgY2FuIGJlIGNoYWluZWQgYXJiaXRyYXJpbHk7IGZvciBleGFtcGxlLCBcY29kZXtcdmFye3h9IDwKLVx2YXJ7eX0gPD0gXHZhcnt6fX0gaXMgZXF1aXZhbGVudCB0byBcY29kZXtcdmFye3h9IDwgXHZhcnt5fSBhbmQKLVx2YXJ7eX0gPD0gXHZhcnt6fX0sIGV4Y2VwdCB0aGF0IFx2YXJ7eX0gaXMgZXZhbHVhdGVkIG9ubHkgb25jZSAoYnV0Ci1pbiBib3RoIGNhc2VzIFx2YXJ7en0gaXMgbm90IGV2YWx1YXRlZCBhdCBhbGwgd2hlbiBcY29kZXtcdmFye3h9IDwKLVx2YXJ7eX19IGlzIGZvdW5kIHRvIGJlIGZhbHNlKS4KLVxpbmRleGlpe2NoYWluaW5nfXtjb21wYXJpc29uc30KLQotVGhpcyB0YWJsZSBzdW1tYXJpemVzIHRoZSBjb21wYXJpc29uIG9wZXJhdGlvbnM6Ci0KLVxiZWdpbnt0YWJsZWlpaX17Y3xsfGN9e2NvZGV9e09wZXJhdGlvbn17TWVhbmluZ317Tm90ZXN9Ci0gIFxsaW5laWlpezx9e3N0cmljdGx5IGxlc3MgdGhhbn17fQotICBcbGluZWlpaXs8PX17bGVzcyB0aGFuIG9yIGVxdWFsfXt9Ci0gIFxsaW5laWlpez59e3N0cmljdGx5IGdyZWF0ZXIgdGhhbn17fQotICBcbGluZWlpaXs+PX17Z3JlYXRlciB0aGFuIG9yIGVxdWFsfXt9Ci0gIFxsaW5laWlpez09fXtlcXVhbH17fQotICBcbGluZWlpaXshPX17bm90IGVxdWFsfXt9Ci0gIFxsaW5laWlpe2lzfXtvYmplY3QgaWRlbnRpdHl9e30KLSAgXGxpbmVpaWl7aXMgbm90fXtuZWdhdGVkIG9iamVjdCBpZGVudGl0eX17fQotXGVuZHt0YWJsZWlpaX0KLVxpbmRleGlpe29wZXJhdG9yfXtjb21wYXJpc29ufQotXG9waW5kZXh7PT19ICUgWFhYICpBbGwqIG90aGVycyBoYXZlIGZ1bm55IGNoYXJhY3RlcnMgPCAhID4KLVxvcGluZGV4e2lzfQotXG9waW5kZXh7aXMgbm90fQotCi1PYmplY3RzIG9mIGRpZmZlcmVudCB0eXBlcywgZXhjZXB0IGRpZmZlcmVudCBudW1lcmljIHR5cGVzIGFuZCBkaWZmZXJlbnQgc3RyaW5nIHR5cGVzLCBuZXZlcgotY29tcGFyZSBlcXVhbDsgc3VjaCBvYmplY3RzIGFyZSBvcmRlcmVkIGNvbnNpc3RlbnRseSBidXQgYXJiaXRyYXJpbHkKLShzbyB0aGF0IHNvcnRpbmcgYSBoZXRlcm9nZW5lb3VzIGFycmF5IHlpZWxkcyBhIGNvbnNpc3RlbnQgcmVzdWx0KS4KLUZ1cnRoZXJtb3JlLCBzb21lIHR5cGVzIChmb3IgZXhhbXBsZSwgZmlsZSBvYmplY3RzKSBzdXBwb3J0IG9ubHkgYQotZGVnZW5lcmF0ZSBub3Rpb24gb2YgY29tcGFyaXNvbiB3aGVyZSBhbnkgdHdvIG9iamVjdHMgb2YgdGhhdCB0eXBlIGFyZQotdW5lcXVhbC4gIEFnYWluLCBzdWNoIG9iamVjdHMgYXJlIG9yZGVyZWQgYXJiaXRyYXJpbHkgYnV0Ci1jb25zaXN0ZW50bHkuIFRoZSBcY29kZXs8fSwgXGNvZGV7PD19LCBcY29kZXs+fSBhbmQgXGNvZGV7Pj19Ci1vcGVyYXRvcnMgd2lsbCByYWlzZSBhIFxleGNlcHRpb257VHlwZUVycm9yfSBleGNlcHRpb24gd2hlbiBhbnkgb3BlcmFuZAotaXMgYSBjb21wbGV4IG51bWJlci4gCi1caW5kZXhpaXtvYmplY3R9e251bWVyaWN9Ci1caW5kZXhpaXtvYmplY3RzfXtjb21wYXJpbmd9Ci0KLUluc3RhbmNlcyBvZiBhIGNsYXNzIG5vcm1hbGx5IGNvbXBhcmUgYXMgbm9uLWVxdWFsIHVubGVzcyB0aGUgY2xhc3MKLVx3aXRoc3ViaXRlbXsoaW5zdGFuY2UgbWV0aG9kKX17XHR0aW5kZXh7X19jbXBfXygpfX0KLWRlZmluZXMgdGhlIFxtZXRob2R7X19jbXBfXygpfSBtZXRob2QuICBSZWZlciB0byB0aGUKLVxjaXRldGl0bGVbLi4vcmVmL2N1c3RvbWl6YXRpb24uaHRtbF17UHl0aG9uIFJlZmVyZW5jZSBNYW51YWx9IGZvcgotaW5mb3JtYXRpb24gb24gdGhlIHVzZSBvZiB0aGlzIG1ldGhvZCB0byBlZmZlY3Qgb2JqZWN0IGNvbXBhcmlzb25zLgotCi1cc3Ryb25ne0ltcGxlbWVudGF0aW9uIG5vdGU6fSBPYmplY3RzIG9mIGRpZmZlcmVudCB0eXBlcyBleGNlcHQKLW51bWJlcnMgYXJlIG9yZGVyZWQgYnkgdGhlaXIgdHlwZSBuYW1lczsgb2JqZWN0cyBvZiB0aGUgc2FtZSB0eXBlcwotdGhhdCBkb24ndCBzdXBwb3J0IHByb3BlciBjb21wYXJpc29uIGFyZSBvcmRlcmVkIGJ5IHRoZWlyIGFkZHJlc3MuCi0KLVR3byBtb3JlIG9wZXJhdGlvbnMgd2l0aCB0aGUgc2FtZSBzeW50YWN0aWMgcHJpb3JpdHksCi1cc2FtcHtpbn1cb3BpbmRleHtpbn0gYW5kIFxzYW1we25vdCBpbn1cb3BpbmRleHtub3QgaW59LCBhcmUgc3VwcG9ydGVkCi1vbmx5IGJ5IHNlcXVlbmNlIHR5cGVzIChiZWxvdykuCi0KLQotXHNlY3Rpb257TnVtZXJpYyBUeXBlcyAtLS0KLQkgICAgXGNsYXNze2ludH0sIFxjbGFzc3tmbG9hdH0sIFxjbGFzc3tsb25nfSwgXGNsYXNze2NvbXBsZXh9Ci0JICAgIFxsYWJlbHt0eXBlc251bWVyaWN9fQotCi1UaGVyZSBhcmUgZm91ciBkaXN0aW5jdCBudW1lcmljIHR5cGVzOiBcZGZue3BsYWluIGludGVnZXJzfSwKLVxkZm57bG9uZyBpbnRlZ2Vyc30sIAotXGRmbntmbG9hdGluZyBwb2ludCBudW1iZXJzfSwgYW5kIFxkZm57Y29tcGxleCBudW1iZXJzfS4KLUluIGFkZGl0aW9uLCBCb29sZWFucyBhcmUgYSBzdWJ0eXBlIG9mIHBsYWluIGludGVnZXJzLgotUGxhaW4gaW50ZWdlcnMgKGFsc28ganVzdCBjYWxsZWQgXGRmbntpbnRlZ2Vyc30pCi1hcmUgaW1wbGVtZW50ZWQgdXNpbmcgXGN0eXBle2xvbmd9IGluIEMsIHdoaWNoIGdpdmVzIHRoZW0gYXQgbGVhc3QgMzIKLWJpdHMgb2YgcHJlY2lzaW9uIChcY29kZXtzeXMubWF4aW50fSBpcyBhbHdheXMgc2V0IHRvIHRoZSBtYXhpbXVtCi1wbGFpbiBpbnRlZ2VyIHZhbHVlIGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybSwgdGhlIG1pbmltdW0gdmFsdWUgaXMgCi1cY29kZXstc3lzLm1heGludCAtIDF9KS4gIExvbmcgaW50ZWdlcnMgaGF2ZSB1bmxpbWl0ZWQgcHJlY2lzaW9uLgotRmxvYXRpbmcgcG9pbnQgbnVtYmVycyBhcmUgaW1wbGVtZW50ZWQgdXNpbmcgXGN0eXBle2RvdWJsZX0gaW4gQy4KLUFsbCBiZXRzIG9uIHRoZWlyIHByZWNpc2lvbiBhcmUgb2ZmIHVubGVzcyB5b3UgaGFwcGVuIHRvIGtub3cgdGhlCi1tYWNoaW5lIHlvdSBhcmUgd29ya2luZyB3aXRoLgotXG9iaW5kZXh7bnVtZXJpY30KLVxvYmluZGV4e0Jvb2xlYW59Ci1cb2JpbmRleHtpbnRlZ2VyfQotXG9iaW5kZXh7bG9uZyBpbnRlZ2VyfQotXG9iaW5kZXh7ZmxvYXRpbmcgcG9pbnR9Ci1cb2JpbmRleHtjb21wbGV4IG51bWJlcn0KLVxpbmRleGlpe0N9e2xhbmd1YWdlfQotCi1Db21wbGV4IG51bWJlcnMgaGF2ZSBhIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0LCB3aGljaCBhcmUgZWFjaAotaW1wbGVtZW50ZWQgdXNpbmcgXGN0eXBle2RvdWJsZX0gaW4gQy4gIFRvIGV4dHJhY3QgdGhlc2UgcGFydHMgZnJvbQotYSBjb21wbGV4IG51bWJlciBcdmFye3p9LCB1c2UgXGNvZGV7XHZhcnt6fS5yZWFsfSBhbmQgXGNvZGV7XHZhcnt6fS5pbWFnfS4KLQotTnVtYmVycyBhcmUgY3JlYXRlZCBieSBudW1lcmljIGxpdGVyYWxzIG9yIGFzIHRoZSByZXN1bHQgb2YgYnVpbHQtaW4KLWZ1bmN0aW9ucyBhbmQgb3BlcmF0b3JzLiAgVW5hZG9ybmVkIGludGVnZXIgbGl0ZXJhbHMgKGluY2x1ZGluZyBoZXgKLWFuZCBvY3RhbCBudW1iZXJzKSB5aWVsZCBwbGFpbiBpbnRlZ2VycyB1bmxlc3MgdGhlIHZhbHVlIHRoZXkgZGVub3RlCi1pcyB0b28gbGFyZ2UgdG8gYmUgcmVwcmVzZW50ZWQgYXMgYSBwbGFpbiBpbnRlZ2VyLCBpbiB3aGljaCBjYXNlCi10aGV5IHlpZWxkIGEgbG9uZyBpbnRlZ2VyLiAgSW50ZWdlciBsaXRlcmFscyB3aXRoIGFuCi1cY2hhcmFjdGVye0x9IG9yIFxjaGFyYWN0ZXJ7bH0gc3VmZml4IHlpZWxkIGxvbmcgaW50ZWdlcnMKLShcY2hhcmFjdGVye0x9IGlzIHByZWZlcnJlZCBiZWNhdXNlIFxzYW1wezFsfSBsb29rcyB0b28gbXVjaCBsaWtlCi1lbGV2ZW4hKS4gIE51bWVyaWMgbGl0ZXJhbHMgY29udGFpbmluZyBhIGRlY2ltYWwgcG9pbnQgb3IgYW4gZXhwb25lbnQKLXNpZ24geWllbGQgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gIEFwcGVuZGluZyBcY2hhcmFjdGVye2p9IG9yCi1cY2hhcmFjdGVye0p9IHRvIGEgbnVtZXJpYyBsaXRlcmFsIHlpZWxkcyBhIGNvbXBsZXggbnVtYmVyIHdpdGggYQotemVybyByZWFsIHBhcnQuIEEgY29tcGxleCBudW1lcmljIGxpdGVyYWwgaXMgdGhlIHN1bSBvZiBhIHJlYWwgYW5kCi1hbiBpbWFnaW5hcnkgcGFydC4KLVxpbmRleGlpe251bWVyaWN9e2xpdGVyYWxzfQotXGluZGV4aWl7aW50ZWdlcn17bGl0ZXJhbHN9Ci1caW5kZXhpaWl7bG9uZ317aW50ZWdlcn17bGl0ZXJhbHN9Ci1caW5kZXhpaXtmbG9hdGluZyBwb2ludH17bGl0ZXJhbHN9Ci1caW5kZXhpaXtjb21wbGV4IG51bWJlcn17bGl0ZXJhbHN9Ci1caW5kZXhpaXtoZXhhZGVjaW1hbH17bGl0ZXJhbHN9Ci1caW5kZXhpaXtvY3RhbH17bGl0ZXJhbHN9Ci0KLVB5dGhvbiBmdWxseSBzdXBwb3J0cyBtaXhlZCBhcml0aG1ldGljOiB3aGVuIGEgYmluYXJ5IGFyaXRobWV0aWMKLW9wZXJhdG9yIGhhcyBvcGVyYW5kcyBvZiBkaWZmZXJlbnQgbnVtZXJpYyB0eXBlcywgdGhlIG9wZXJhbmQgd2l0aCB0aGUKLWBgbmFycm93ZXInJyB0eXBlIGlzIHdpZGVuZWQgdG8gdGhhdCBvZiB0aGUgb3RoZXIsIHdoZXJlIHBsYWluCi1pbnRlZ2VyIGlzIG5hcnJvd2VyIHRoYW4gbG9uZyBpbnRlZ2VyIGlzIG5hcnJvd2VyIHRoYW4gZmxvYXRpbmcgcG9pbnQgaXMKLW5hcnJvd2VyIHRoYW4gY29tcGxleC4KLUNvbXBhcmlzb25zIGJldHdlZW4gbnVtYmVycyBvZiBtaXhlZCB0eXBlIHVzZSB0aGUgc2FtZSBydWxlLlxmb290bm90ZXsKLQlBcyBhIGNvbnNlcXVlbmNlLCB0aGUgbGlzdCBcY29kZXtbMSwgMl19IGlzIGNvbnNpZGVyZWQgZXF1YWwKLSAgICAgICAgdG8gXGNvZGV7WzEuMCwgMi4wXX0sIGFuZCBzaW1pbGFybHkgZm9yIHR1cGxlcy4KLX0gVGhlIGNvbnN0cnVjdG9ycyBcZnVuY3Rpb257aW50KCl9LCBcZnVuY3Rpb257bG9uZygpfSwgXGZ1bmN0aW9ue2Zsb2F0KCl9LAotYW5kIFxmdW5jdGlvbntjb21wbGV4KCl9IGNhbiBiZSB1c2VkCi10byBwcm9kdWNlIG51bWJlcnMgb2YgYSBzcGVjaWZpYyB0eXBlLgotXGluZGV4e2FyaXRobWV0aWN9Ci1cYmlmdW5jaW5kZXh7aW50fQotXGJpZnVuY2luZGV4e2xvbmd9Ci1cYmlmdW5jaW5kZXh7ZmxvYXR9Ci1cYmlmdW5jaW5kZXh7Y29tcGxleH0KLQotQWxsIG51bWVyaWMgdHlwZXMgKGV4Y2VwdCBjb21wbGV4KSBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucywKLXNvcnRlZCBieSBhc2NlbmRpbmcgcHJpb3JpdHkgKG9wZXJhdGlvbnMgaW4gdGhlIHNhbWUgYm94IGhhdmUgdGhlIHNhbWUKLXByaW9yaXR5OyBhbGwgbnVtZXJpYyBvcGVyYXRpb25zIGhhdmUgYSBoaWdoZXIgcHJpb3JpdHkgdGhhbgotY29tcGFyaXNvbiBvcGVyYXRpb25zKToKLQotXGJlZ2lue3RhYmxlaWlpfXtjfGx8Y317Y29kZX17T3BlcmF0aW9ufXtSZXN1bHR9e05vdGVzfQotICBcbGluZWlpaXtcdmFye3h9ICsgXHZhcnt5fX17c3VtIG9mIFx2YXJ7eH0gYW5kIFx2YXJ7eX19e30KLSAgXGxpbmVpaWl7XHZhcnt4fSAtIFx2YXJ7eX19e2RpZmZlcmVuY2Ugb2YgXHZhcnt4fSBhbmQgXHZhcnt5fX17fQotICBcaGxpbmUKLSAgXGxpbmVpaWl7XHZhcnt4fSAqIFx2YXJ7eX19e3Byb2R1Y3Qgb2YgXHZhcnt4fSBhbmQgXHZhcnt5fX17fQotICBcbGluZWlpaXtcdmFye3h9IC8gXHZhcnt5fX17cXVvdGllbnQgb2YgXHZhcnt4fSBhbmQgXHZhcnt5fX17KDEpfQotICBcbGluZWlpaXtcdmFye3h9IC8vIFx2YXJ7eX19eyhmbG9vcmVkKSBxdW90aWVudCBvZiBcdmFye3h9IGFuZCBcdmFye3l9fXsoNSl9Ci0gIFxsaW5laWlpe1x2YXJ7eH0gXCV7fSBcdmFye3l9fXtyZW1haW5kZXIgb2YgXGNvZGV7XHZhcnt4fSAvIFx2YXJ7eX19fXsoNCl9Ci0gIFxobGluZQotICBcbGluZWlpaXstXHZhcnt4fX17XHZhcnt4fSBuZWdhdGVkfXt9Ci0gIFxsaW5laWlpeytcdmFye3h9fXtcdmFye3h9IHVuY2hhbmdlZH17fQotICBcaGxpbmUKLSAgXGxpbmVpaWl7YWJzKFx2YXJ7eH0pfXthYnNvbHV0ZSB2YWx1ZSBvciBtYWduaXR1ZGUgb2YgXHZhcnt4fX17fQotICBcbGluZWlpaXtpbnQoXHZhcnt4fSl9e1x2YXJ7eH0gY29udmVydGVkIHRvIGludGVnZXJ9eygyKX0KLSAgXGxpbmVpaWl7bG9uZyhcdmFye3h9KX17XHZhcnt4fSBjb252ZXJ0ZWQgdG8gbG9uZyBpbnRlZ2VyfXsoMil9Ci0gIFxsaW5laWlpe2Zsb2F0KFx2YXJ7eH0pfXtcdmFye3h9IGNvbnZlcnRlZCB0byBmbG9hdGluZyBwb2ludH17fQotICBcbGluZWlpaXtjb21wbGV4KFx2YXJ7cmV9LFx2YXJ7aW19KX17YSBjb21wbGV4IG51bWJlciB3aXRoIHJlYWwgcGFydCBcdmFye3JlfSwgaW1hZ2luYXJ5IHBhcnQgXHZhcntpbX0uICBcdmFye2ltfSBkZWZhdWx0cyB0byB6ZXJvLn17fQotICBcbGluZWlpaXtcdmFye2N9LmNvbmp1Z2F0ZSgpfXtjb25qdWdhdGUgb2YgdGhlIGNvbXBsZXggbnVtYmVyIFx2YXJ7Y319e30KLSAgXGxpbmVpaWl7ZGl2bW9kKFx2YXJ7eH0sIFx2YXJ7eX0pfXt0aGUgcGFpciBcY29kZXsoXHZhcnt4fSAvLyBcdmFye3l9LCBcdmFye3h9IFwle30gXHZhcnt5fSl9fXsoMykoNCl9Ci0gIFxsaW5laWlpe3BvdyhcdmFye3h9LCBcdmFye3l9KX17XHZhcnt4fSB0byB0aGUgcG93ZXIgXHZhcnt5fX17fQotICBcbGluZWlpaXtcdmFye3h9ICoqIFx2YXJ7eX19e1x2YXJ7eH0gdG8gdGhlIHBvd2VyIFx2YXJ7eX19e30KLVxlbmR7dGFibGVpaWl9Ci1caW5kZXhpaWl7b3BlcmF0aW9ucyBvbn17bnVtZXJpY317dHlwZXN9Ci1cd2l0aHN1Yml0ZW17KGNvbXBsZXggbnVtYmVyIG1ldGhvZCl9e1x0dGluZGV4e2Nvbmp1Z2F0ZSgpfX0KLQotXG5vaW5kZW50Ci1Ob3RlczoKLVxiZWdpbntkZXNjcmlwdGlvbn0KLQotXGl0ZW1bKDEpXQotRm9yIChwbGFpbiBvciBsb25nKSBpbnRlZ2VyIGRpdmlzaW9uLCB0aGUgcmVzdWx0IGlzIGFuIGludGVnZXIuCi1UaGUgcmVzdWx0IGlzIGFsd2F5cyByb3VuZGVkIHRvd2FyZHMgbWludXMgaW5maW5pdHk6IDEvMiBpcyAwLAotKC0xKS8yIGlzIC0xLCAxLygtMikgaXMgLTEsIGFuZCAoLTEpLygtMikgaXMgMC4gIE5vdGUgdGhhdCB0aGUgcmVzdWx0Ci1pcyBhIGxvbmcgaW50ZWdlciBpZiBlaXRoZXIgb3BlcmFuZCBpcyBhIGxvbmcgaW50ZWdlciwgcmVnYXJkbGVzcyBvZgotdGhlIG51bWVyaWMgdmFsdWUuCi1caW5kZXhpaXtpbnRlZ2VyfXtkaXZpc2lvbn0KLVxpbmRleGlpaXtsb25nfXtpbnRlZ2VyfXtkaXZpc2lvbn0KLQotXGl0ZW1bKDIpXQotQ29udmVyc2lvbiBmcm9tIGZsb2F0aW5nIHBvaW50IHRvIChsb25nIG9yIHBsYWluKSBpbnRlZ2VyIG1heSByb3VuZCBvcgotdHJ1bmNhdGUgYXMgaW4gQzsgc2VlIGZ1bmN0aW9ucyBcZnVuY3Rpb257Zmxvb3IoKX0gYW5kCi1cZnVuY3Rpb257Y2VpbCgpfSBpbiB0aGUgXHJlZm1vZHVsZXttYXRofVxyZWZiaW1vZGluZGV4e21hdGh9IG1vZHVsZQotZm9yIHdlbGwtZGVmaW5lZCBjb252ZXJzaW9ucy4KLVx3aXRoc3ViaXRlbXsoaW4gbW9kdWxlIG1hdGgpfXtcdHRpbmRleHtmbG9vcigpfVx0dGluZGV4e2NlaWwoKX19Ci1caW5kZXhpaXtudW1lcmljfXtjb252ZXJzaW9uc30KLVxpbmRleGlpe0N9e2xhbmd1YWdlfQotCi1caXRlbVsoMyldCi1TZWUgc2VjdGlvbiBccmVme2J1aWx0LWluLWZ1bmNzfSwgYGBCdWlsdC1pbiBGdW5jdGlvbnMsJycgZm9yIGEgZnVsbAotZGVzY3JpcHRpb24uCi0KLVxpdGVtWyg0KV0KLUNvbXBsZXggZmxvb3IgZGl2aXNpb24gb3BlcmF0b3IsIG1vZHVsbyBvcGVyYXRvciwgYW5kIFxmdW5jdGlvbntkaXZtb2QoKX0uCi0KLVxkZXByZWNhdGVkezIuM317SW5zdGVhZCBjb252ZXJ0IHRvIGZsb2F0IHVzaW5nIFxmdW5jdGlvbnthYnMoKX0KLWlmIGFwcHJvcHJpYXRlLn0KLQotXGl0ZW1bKDUpXQotQWxzbyByZWZlcnJlZCB0byBhcyBpbnRlZ2VyIGRpdmlzaW9uLiAgVGhlIHJlc3VsdGFudCB2YWx1ZSBpcyBhIHdob2xlIGludGVnZXIsCi10aG91Z2ggdGhlIHJlc3VsdCdzIHR5cGUgaXMgbm90IG5lY2Vzc2FyaWx5IGludC4KLVxlbmR7ZGVzY3JpcHRpb259Ci0lIFhYWEpIIGV4Y2VwdGlvbnM6IG92ZXJmbG93ICh3aGVuPyB3aGF0IG9wZXJhdGlvbnM/KSB6ZXJvZGl2aXNpb24KLQotXHN1YnNlY3Rpb257Qml0LXN0cmluZyBPcGVyYXRpb25zIG9uIEludGVnZXIgVHlwZXMgXGxhYmVse2JpdHN0cmluZy1vcHN9fQotXG5vZGVuYW1le0JpdC1zdHJpbmcgT3BlcmF0aW9uc30KLQotUGxhaW4gYW5kIGxvbmcgaW50ZWdlciB0eXBlcyBzdXBwb3J0IGFkZGl0aW9uYWwgb3BlcmF0aW9ucyB0aGF0IG1ha2UKLXNlbnNlIG9ubHkgZm9yIGJpdC1zdHJpbmdzLiAgTmVnYXRpdmUgbnVtYmVycyBhcmUgdHJlYXRlZCBhcyB0aGVpciAyJ3MKLWNvbXBsZW1lbnQgdmFsdWUgKGZvciBsb25nIGludGVnZXJzLCB0aGlzIGFzc3VtZXMgYSBzdWZmaWNpZW50bHkgbGFyZ2UKLW51bWJlciBvZiBiaXRzIHRoYXQgbm8gb3ZlcmZsb3cgb2NjdXJzIGR1cmluZyB0aGUgb3BlcmF0aW9uKS4KLQotVGhlIHByaW9yaXRpZXMgb2YgdGhlIGJpbmFyeSBiaXQtd2lzZSBvcGVyYXRpb25zIGFyZSBhbGwgbG93ZXIgdGhhbgotdGhlIG51bWVyaWMgb3BlcmF0aW9ucyBhbmQgaGlnaGVyIHRoYW4gdGhlIGNvbXBhcmlzb25zOyB0aGUgdW5hcnkKLW9wZXJhdGlvbiBcc2FtcHtcfn0gaGFzIHRoZSBzYW1lIHByaW9yaXR5IGFzIHRoZSBvdGhlciB1bmFyeSBudW1lcmljCi1vcGVyYXRpb25zIChcc2FtcHsrfSBhbmQgXHNhbXB7LX0pLgotCi1UaGlzIHRhYmxlIGxpc3RzIHRoZSBiaXQtc3RyaW5nIG9wZXJhdGlvbnMgc29ydGVkIGluIGFzY2VuZGluZwotcHJpb3JpdHkgKG9wZXJhdGlvbnMgaW4gdGhlIHNhbWUgYm94IGhhdmUgdGhlIHNhbWUgcHJpb3JpdHkpOgotCi1cYmVnaW57dGFibGVpaWl9e2N8bHxjfXtjb2RlfXtPcGVyYXRpb259e1Jlc3VsdH17Tm90ZXN9Ci0gIFxsaW5laWlpe1x2YXJ7eH0gfCBcdmFye3l9fXtiaXR3aXNlIFxkZm57b3J9IG9mIFx2YXJ7eH0gYW5kIFx2YXJ7eX19e30KLSAgXGxpbmVpaWl7XHZhcnt4fSBcXnt9IFx2YXJ7eX19e2JpdHdpc2UgXGRmbntleGNsdXNpdmUgb3J9IG9mIFx2YXJ7eH0gYW5kIFx2YXJ7eX19e30KLSAgXGxpbmVpaWl7XHZhcnt4fSBcJnt9IFx2YXJ7eX19e2JpdHdpc2UgXGRmbnthbmR9IG9mIFx2YXJ7eH0gYW5kIFx2YXJ7eX19e30KLSAgJSBUaGUgZW1wdHkgZ3JvdXBzIGJlbG93IHByZXZlbnQgY29udmVyc2lvbiB0byBndWlsbGVtZXRzLgotICBcbGluZWlpaXtcdmFye3h9IDx7fTwgXHZhcntufX17XHZhcnt4fSBzaGlmdGVkIGxlZnQgYnkgXHZhcntufSBiaXRzfXsoMSksICgyKX0KLSAgXGxpbmVpaWl7XHZhcnt4fSA+e30+IFx2YXJ7bn19e1x2YXJ7eH0gc2hpZnRlZCByaWdodCBieSBcdmFye259IGJpdHN9eygxKSwgKDMpfQotICBcaGxpbmUKLSAgXGxpbmVpaWl7XH5cdmFye3h9fXt0aGUgYml0cyBvZiBcdmFye3h9IGludmVydGVkfXt9Ci1cZW5ke3RhYmxlaWlpfQotXGluZGV4aWlpe29wZXJhdGlvbnMgb259e2ludGVnZXJ9e3R5cGVzfQotXGluZGV4aWl7Yml0LXN0cmluZ317b3BlcmF0aW9uc30KLVxpbmRleGlpe3NoaWZ0aW5nfXtvcGVyYXRpb25zfQotXGluZGV4aWl7bWFza2luZ317b3BlcmF0aW9uc30KLQotXG5vaW5kZW50Ci1Ob3RlczoKLVxiZWdpbntkZXNjcmlwdGlvbn0KLVxpdGVtWygxKV0gTmVnYXRpdmUgc2hpZnQgY291bnRzIGFyZSBpbGxlZ2FsIGFuZCBjYXVzZSBhCi1cZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IHRvIGJlIHJhaXNlZC4KLVxpdGVtWygyKV0gQSBsZWZ0IHNoaWZ0IGJ5IFx2YXJ7bn0gYml0cyBpcyBlcXVpdmFsZW50IHRvCi1tdWx0aXBsaWNhdGlvbiBieSBcY29kZXtwb3coMiwgXHZhcntufSl9IHdpdGhvdXQgb3ZlcmZsb3cgY2hlY2suCi1caXRlbVsoMyldIEEgcmlnaHQgc2hpZnQgYnkgXHZhcntufSBiaXRzIGlzIGVxdWl2YWxlbnQgdG8KLWRpdmlzaW9uIGJ5IFxjb2Rle3BvdygyLCBcdmFye259KX0gd2l0aG91dCBvdmVyZmxvdyBjaGVjay4KLVxlbmR7ZGVzY3JpcHRpb259Ci0KLQotXHNlY3Rpb257SXRlcmF0b3IgVHlwZXMgXGxhYmVse3R5cGVpdGVyfX0KLQotXHZlcnNpb25hZGRlZHsyLjJ9Ci1caW5kZXh7aXRlcmF0b3IgcHJvdG9jb2x9Ci1caW5kZXh7cHJvdG9jb2whaXRlcmF0b3J9Ci1caW5kZXh7c2VxdWVuY2UhaXRlcmF0aW9ufQotXGluZGV4e2NvbnRhaW5lciFpdGVyYXRpb24gb3Zlcn0KLQotUHl0aG9uIHN1cHBvcnRzIGEgY29uY2VwdCBvZiBpdGVyYXRpb24gb3ZlciBjb250YWluZXJzLiAgVGhpcyBpcwotaW1wbGVtZW50ZWQgdXNpbmcgdHdvIGRpc3RpbmN0IG1ldGhvZHM7IHRoZXNlIGFyZSB1c2VkIHRvIGFsbG93Ci11c2VyLWRlZmluZWQgY2xhc3NlcyB0byBzdXBwb3J0IGl0ZXJhdGlvbi4gIFNlcXVlbmNlcywgZGVzY3JpYmVkIGJlbG93Ci1pbiBtb3JlIGRldGFpbCwgYWx3YXlzIHN1cHBvcnQgdGhlIGl0ZXJhdGlvbiBtZXRob2RzLgotCi1PbmUgbWV0aG9kIG5lZWRzIHRvIGJlIGRlZmluZWQgZm9yIGNvbnRhaW5lciBvYmplY3RzIHRvIHByb3ZpZGUKLWl0ZXJhdGlvbiBzdXBwb3J0OgotCi1cYmVnaW57bWV0aG9kZGVzY31bY29udGFpbmVyXXtfX2l0ZXJfX317fQotICBSZXR1cm4gYW4gaXRlcmF0b3Igb2JqZWN0LiAgVGhlIG9iamVjdCBpcyByZXF1aXJlZCB0byBzdXBwb3J0IHRoZQotICBpdGVyYXRvciBwcm90b2NvbCBkZXNjcmliZWQgYmVsb3cuICBJZiBhIGNvbnRhaW5lciBzdXBwb3J0cwotICBkaWZmZXJlbnQgdHlwZXMgb2YgaXRlcmF0aW9uLCBhZGRpdGlvbmFsIG1ldGhvZHMgY2FuIGJlIHByb3ZpZGVkIHRvCi0gIHNwZWNpZmljYWxseSByZXF1ZXN0IGl0ZXJhdG9ycyBmb3IgdGhvc2UgaXRlcmF0aW9uIHR5cGVzLiAgKEFuCi0gIGV4YW1wbGUgb2YgYW4gb2JqZWN0IHN1cHBvcnRpbmcgbXVsdGlwbGUgZm9ybXMgb2YgaXRlcmF0aW9uIHdvdWxkIGJlCi0gIGEgdHJlZSBzdHJ1Y3R1cmUgd2hpY2ggc3VwcG9ydHMgYm90aCBicmVhZHRoLWZpcnN0IGFuZCBkZXB0aC1maXJzdAotICB0cmF2ZXJzYWwuKSAgVGhpcyBtZXRob2QgY29ycmVzcG9uZHMgdG8gdGhlIFxtZW1iZXJ7dHBfaXRlcn0gc2xvdCBvZgotICB0aGUgdHlwZSBzdHJ1Y3R1cmUgZm9yIFB5dGhvbiBvYmplY3RzIGluIHRoZSBQeXRob24vQyBBUEkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVRoZSBpdGVyYXRvciBvYmplY3RzIHRoZW1zZWx2ZXMgYXJlIHJlcXVpcmVkIHRvIHN1cHBvcnQgdGhlIGZvbGxvd2luZwotdHdvIG1ldGhvZHMsIHdoaWNoIHRvZ2V0aGVyIGZvcm0gdGhlIFxkZm57aXRlcmF0b3IgcHJvdG9jb2x9OgotCi1cYmVnaW57bWV0aG9kZGVzY31baXRlcmF0b3Jde19faXRlcl9ffXt9Ci0gIFJldHVybiB0aGUgaXRlcmF0b3Igb2JqZWN0IGl0c2VsZi4gIFRoaXMgaXMgcmVxdWlyZWQgdG8gYWxsb3cgYm90aAotICBjb250YWluZXJzIGFuZCBpdGVyYXRvcnMgdG8gYmUgdXNlZCB3aXRoIHRoZSBca2V5d29yZHtmb3J9IGFuZAotICBca2V5d29yZHtpbn0gc3RhdGVtZW50cy4gIFRoaXMgbWV0aG9kIGNvcnJlc3BvbmRzIHRvIHRoZQotICBcbWVtYmVye3RwX2l0ZXJ9IHNsb3Qgb2YgdGhlIHR5cGUgc3RydWN0dXJlIGZvciBQeXRob24gb2JqZWN0cyBpbgotICB0aGUgUHl0aG9uL0MgQVBJLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31baXRlcmF0b3Jde25leHR9e30KLSAgUmV0dXJuIHRoZSBuZXh0IGl0ZW0gZnJvbSB0aGUgY29udGFpbmVyLiAgSWYgdGhlcmUgYXJlIG5vIGZ1cnRoZXIKLSAgaXRlbXMsIHJhaXNlIHRoZSBcZXhjZXB0aW9ue1N0b3BJdGVyYXRpb259IGV4Y2VwdGlvbi4gIFRoaXMgbWV0aG9kCi0gIGNvcnJlc3BvbmRzIHRvIHRoZSBcbWVtYmVye3RwX2l0ZXJuZXh0fSBzbG90IG9mIHRoZSB0eXBlIHN0cnVjdHVyZQotICBmb3IgUHl0aG9uIG9iamVjdHMgaW4gdGhlIFB5dGhvbi9DIEFQSS4KLVxlbmR7bWV0aG9kZGVzY30KLQotUHl0aG9uIGRlZmluZXMgc2V2ZXJhbCBpdGVyYXRvciBvYmplY3RzIHRvIHN1cHBvcnQgaXRlcmF0aW9uIG92ZXIKLWdlbmVyYWwgYW5kIHNwZWNpZmljIHNlcXVlbmNlIHR5cGVzLCBkaWN0aW9uYXJpZXMsIGFuZCBvdGhlciBtb3JlCi1zcGVjaWFsaXplZCBmb3Jtcy4gIFRoZSBzcGVjaWZpYyB0eXBlcyBhcmUgbm90IGltcG9ydGFudCBiZXlvbmQgdGhlaXIKLWltcGxlbWVudGF0aW9uIG9mIHRoZSBpdGVyYXRvciBwcm90b2NvbC4KLQotVGhlIGludGVudGlvbiBvZiB0aGUgcHJvdG9jb2wgaXMgdGhhdCBvbmNlIGFuIGl0ZXJhdG9yJ3MgXG1ldGhvZHtfX25leHRfXygpfQotbWV0aG9kIHJhaXNlcyBcZXhjZXB0aW9ue1N0b3BJdGVyYXRpb259LCBpdCB3aWxsIGNvbnRpbnVlIHRvIGRvIHNvIG9uIHN1YnNlcXVlbnQKLWNhbGxzLiAgSW1wbGVtZW50YXRpb25zIHRoYXQgZG8gbm90IG9iZXkgdGhpcyBwcm9wZXJ0eSBhcmUgZGVlbWVkIGJyb2tlbi4gIChUaGlzCi1jb25zdHJhaW50IHdhcyBhZGRlZCBpbiBQeXRob24gMi4zOyBpbiBQeXRob24gMi4yLCB2YXJpb3VzIGl0ZXJhdG9ycyBhcmUgYnJva2VuCi1hY2NvcmRpbmcgdG8gdGhpcyBydWxlLikKLQotUHl0aG9uJ3MgZ2VuZXJhdG9ycyBwcm92aWRlIGEgY29udmVuaWVudCB3YXkgdG8gaW1wbGVtZW50IHRoZSBpdGVyYXRvciBwcm90b2NvbC4KLUlmIGEgY29udGFpbmVyIG9iamVjdCdzIFxtZXRob2R7X19pdGVyX18oKX0gbWV0aG9kIGlzIGltcGxlbWVudGVkIGFzIGEKLWdlbmVyYXRvciwgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IHJldHVybiBhbiBpdGVyYXRvciBvYmplY3QgKHRlY2huaWNhbGx5LCBhCi1nZW5lcmF0b3Igb2JqZWN0KSBzdXBwbHlpbmcgdGhlIFxtZXRob2R7X19pdGVyX18oKX0gYW5kIFxtZXRob2R7X19uZXh0X18oKX0KLW1ldGhvZHMuCi0KLQotXHNlY3Rpb257U2VxdWVuY2UgVHlwZXMgLS0tCi0JICAgIFxjbGFzc3tzdHJ9LCBcY2xhc3N7dW5pY29kZX0sIFxjbGFzc3tsaXN0fSwKLQkgICAgXGNsYXNze3R1cGxlfSwgXGNsYXNze2J1ZmZlcn0sIFxjbGFzc3tyYW5nZX0KLQkgICAgXGxhYmVse3R5cGVzc2VxfX0KLQotVGhlcmUgYXJlIHNpeCBzZXF1ZW5jZSB0eXBlczogc3RyaW5ncywgVW5pY29kZSBzdHJpbmdzLCBsaXN0cywKLXR1cGxlcywgYnVmZmVycywgYW5kIHJhbmdlIG9iamVjdHMuCi0KLVN0cmluZyBsaXRlcmFscyBhcmUgd3JpdHRlbiBpbiBzaW5nbGUgb3IgZG91YmxlIHF1b3RlczoKLVxjb2Rleyd4eXp6eSd9LCBcY29kZXsiZnJvYm96eiJ9LiAgU2VlIGNoYXB0ZXIgMiBvZiB0aGUKLVxjaXRldGl0bGVbLi4vcmVmL3N0cmluZ3MuaHRtbF17UHl0aG9uIFJlZmVyZW5jZSBNYW51YWx9IGZvciBtb3JlIGFib3V0Ci1zdHJpbmcgbGl0ZXJhbHMuICBVbmljb2RlIHN0cmluZ3MgYXJlIG11Y2ggbGlrZSBzdHJpbmdzLCBidXQgYXJlCi1zcGVjaWZpZWQgaW4gdGhlIHN5bnRheCB1c2luZyBhIHByZWNlZGluZyBcY2hhcmFjdGVye3V9IGNoYXJhY3RlcjoKLVxjb2Rle3UnYWJjJ30sIFxjb2Rle3UiZGVmIn0uICBMaXN0cyBhcmUgY29uc3RydWN0ZWQgd2l0aCBzcXVhcmUgYnJhY2tldHMsCi1zZXBhcmF0aW5nIGl0ZW1zIHdpdGggY29tbWFzOiBcY29kZXtbYSwgYiwgY119LiAgVHVwbGVzIGFyZQotY29uc3RydWN0ZWQgYnkgdGhlIGNvbW1hIG9wZXJhdG9yIChub3Qgd2l0aGluIHNxdWFyZSBicmFja2V0cyksIHdpdGgKLW9yIHdpdGhvdXQgZW5jbG9zaW5nIHBhcmVudGhlc2VzLCBidXQgYW4gZW1wdHkgdHVwbGUgbXVzdCBoYXZlIHRoZQotZW5jbG9zaW5nIHBhcmVudGhlc2VzLCBzdWNoIGFzIFxjb2Rle2EsIGIsIGN9IG9yIFxjb2RleygpfS4gIEEgc2luZ2xlCi1pdGVtIHR1cGxlIG11c3QgaGF2ZSBhIHRyYWlsaW5nIGNvbW1hLCBzdWNoIGFzIFxjb2RleyhkLCl9LgotXG9iaW5kZXh7c2VxdWVuY2V9Ci1cb2JpbmRleHtzdHJpbmd9Ci1cb2JpbmRleHtVbmljb2RlfQotXG9iaW5kZXh7dHVwbGV9Ci1cb2JpbmRleHtsaXN0fQotCi1CdWZmZXIgb2JqZWN0cyBhcmUgbm90IGRpcmVjdGx5IHN1cHBvcnRlZCBieSBQeXRob24gc3ludGF4LCBidXQgY2FuIGJlCi1jcmVhdGVkIGJ5IGNhbGxpbmcgdGhlIGJ1aWx0aW4gZnVuY3Rpb24KLVxmdW5jdGlvbntidWZmZXIoKX0uXGJpZnVuY2luZGV4e2J1ZmZlcn0gIFRoZXkgZG9uJ3Qgc3VwcG9ydAotY29uY2F0ZW5hdGlvbiBvciByZXBldGl0aW9uLgotXG9iaW5kZXh7YnVmZmVyfQotCi1YcmFuZ2Ugb2JqZWN0cyBhcmUgc2ltaWxhciB0byBidWZmZXJzIGluIHRoYXQgdGhlcmUgaXMgbm8gc3BlY2lmaWMKLXN5bnRheCB0byBjcmVhdGUgdGhlbSwgYnV0IHRoZXkgYXJlIGNyZWF0ZWQgdXNpbmcgdGhlIFxmdW5jdGlvbntyYW5nZSgpfQotZnVuY3Rpb24uXGJpZnVuY2luZGV4e3JhbmdlfSAgVGhleSBkb24ndCBzdXBwb3J0IHNsaWNpbmcsCi1jb25jYXRlbmF0aW9uIG9yIHJlcGV0aXRpb24sIGFuZCB1c2luZyBcY29kZXtpbn0sIFxjb2Rle25vdCBpbn0sCi1cZnVuY3Rpb257bWluKCl9IG9yIFxmdW5jdGlvbnttYXgoKX0gb24gdGhlbSBpcyBpbmVmZmljaWVudC4KLVxvYmluZGV4e3JhbmdlfQotCi1Nb3N0IHNlcXVlbmNlIHR5cGVzIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBvcGVyYXRpb25zLiAgVGhlIFxzYW1we2lufSBhbmQKLVxzYW1we25vdCBpbn0gb3BlcmF0aW9ucyBoYXZlIHRoZSBzYW1lIHByaW9yaXRpZXMgYXMgdGhlIGNvbXBhcmlzb24KLW9wZXJhdGlvbnMuICBUaGUgXHNhbXB7K30gYW5kIFxzYW1weyp9IG9wZXJhdGlvbnMgaGF2ZSB0aGUgc2FtZQotcHJpb3JpdHkgYXMgdGhlIGNvcnJlc3BvbmRpbmcgbnVtZXJpYyBvcGVyYXRpb25zLlxmb290bm90ZXtUaGV5IG11c3QKLWhhdmUgc2luY2UgdGhlIHBhcnNlciBjYW4ndCB0ZWxsIHRoZSB0eXBlIG9mIHRoZSBvcGVyYW5kcy59Ci0KLVRoaXMgdGFibGUgbGlzdHMgdGhlIHNlcXVlbmNlIG9wZXJhdGlvbnMgc29ydGVkIGluIGFzY2VuZGluZyBwcmlvcml0eQotKG9wZXJhdGlvbnMgaW4gdGhlIHNhbWUgYm94IGhhdmUgdGhlIHNhbWUgcHJpb3JpdHkpLiAgSW4gdGhlIHRhYmxlLAotXHZhcntzfSBhbmQgXHZhcnt0fSBhcmUgc2VxdWVuY2VzIG9mIHRoZSBzYW1lIHR5cGU7IFx2YXJ7bn0sIFx2YXJ7aX0KLWFuZCBcdmFye2p9IGFyZSBpbnRlZ2VyczoKLQotXGJlZ2lue3RhYmxlaWlpfXtjfGx8Y317Y29kZX17T3BlcmF0aW9ufXtSZXN1bHR9e05vdGVzfQotICBcbGluZWlpaXtcdmFye3h9IGluIFx2YXJ7c319e1xjb2Rle1RydWV9IGlmIGFuIGl0ZW0gb2YgXHZhcntzfSBpcyBlcXVhbCB0byBcdmFye3h9LCBlbHNlIFxjb2Rle0ZhbHNlfX17KDEpfQotICBcbGluZWlpaXtcdmFye3h9IG5vdCBpbiBcdmFye3N9fXtcY29kZXtGYWxzZX0gaWYgYW4gaXRlbSBvZiBcdmFye3N9IGlzCi1lcXVhbCB0byBcdmFye3h9LCBlbHNlIFxjb2Rle1RydWV9fXsoMSl9Ci0gIFxobGluZQotICBcbGluZWlpaXtcdmFye3N9ICsgXHZhcnt0fX17dGhlIGNvbmNhdGVuYXRpb24gb2YgXHZhcntzfSBhbmQgXHZhcnt0fX17KDYpfQotICBcbGluZWlpaXtcdmFye3N9ICogXHZhcntufVx0ZXh0cm17LH0gXHZhcntufSAqIFx2YXJ7c319e1x2YXJ7bn0gc2hhbGxvdyBjb3BpZXMgb2YgXHZhcntzfSBjb25jYXRlbmF0ZWR9eygyKX0KLSAgXGhsaW5lCi0gIFxsaW5laWlpe1x2YXJ7c31bXHZhcntpfV19e1x2YXJ7aX0ndGggaXRlbSBvZiBcdmFye3N9LCBvcmlnaW4gMH17KDMpfQotICBcbGluZWlpaXtcdmFye3N9W1x2YXJ7aX06XHZhcntqfV19e3NsaWNlIG9mIFx2YXJ7c30gZnJvbSBcdmFye2l9IHRvIFx2YXJ7an19eygzKSwgKDQpfQotICBcbGluZWlpaXtcdmFye3N9W1x2YXJ7aX06XHZhcntqfTpcdmFye2t9XX17c2xpY2Ugb2YgXHZhcntzfSBmcm9tIFx2YXJ7aX0gdG8gXHZhcntqfSB3aXRoIHN0ZXAgXHZhcntrfX17KDMpLCAoNSl9Ci0gIFxobGluZQotICBcbGluZWlpaXtsZW4oXHZhcntzfSl9e2xlbmd0aCBvZiBcdmFye3N9fXt9Ci0gIFxsaW5laWlpe21pbihcdmFye3N9KX17c21hbGxlc3QgaXRlbSBvZiBcdmFye3N9fXt9Ci0gIFxsaW5laWlpe21heChcdmFye3N9KX17bGFyZ2VzdCBpdGVtIG9mIFx2YXJ7c319e30KLVxlbmR7dGFibGVpaWl9Ci1caW5kZXhpaWl7b3BlcmF0aW9ucyBvbn17c2VxdWVuY2V9e3R5cGVzfQotXGJpZnVuY2luZGV4e2xlbn0KLVxiaWZ1bmNpbmRleHttaW59Ci1cYmlmdW5jaW5kZXh7bWF4fQotXGluZGV4aWl7Y29uY2F0ZW5hdGlvbn17b3BlcmF0aW9ufQotXGluZGV4aWl7cmVwZXRpdGlvbn17b3BlcmF0aW9ufQotXGluZGV4aWl7c3Vic2NyaXB0fXtvcGVyYXRpb259Ci1caW5kZXhpaXtzbGljZX17b3BlcmF0aW9ufQotXGluZGV4aWl7ZXh0ZW5kZWQgc2xpY2V9e29wZXJhdGlvbn0KLVxvcGluZGV4e2lufQotXG9waW5kZXh7bm90IGlufQotCi1cbm9pbmRlbnQKLU5vdGVzOgotCi1cYmVnaW57ZGVzY3JpcHRpb259Ci1caXRlbVsoMSldIFdoZW4gXHZhcntzfSBpcyBhIHN0cmluZyBvciBVbmljb2RlIHN0cmluZyBvYmplY3QgdGhlCi1cY29kZXtpbn0gYW5kIFxjb2Rle25vdCBpbn0gb3BlcmF0aW9ucyBhY3QgbGlrZSBhIHN1YnN0cmluZyB0ZXN0LiAgSW4KLVB5dGhvbiB2ZXJzaW9ucyBiZWZvcmUgMi4zLCBcdmFye3h9IGhhZCB0byBiZSBhIHN0cmluZyBvZiBsZW5ndGggMS4KLUluIFB5dGhvbiAyLjMgYW5kIGJleW9uZCwgXHZhcnt4fSBtYXkgYmUgYSBzdHJpbmcgb2YgYW55IGxlbmd0aC4KLQotXGl0ZW1bKDIpXSBWYWx1ZXMgb2YgXHZhcntufSBsZXNzIHRoYW4gXGNvZGV7MH0gYXJlIHRyZWF0ZWQgYXMKLSAgXGNvZGV7MH0gKHdoaWNoIHlpZWxkcyBhbiBlbXB0eSBzZXF1ZW5jZSBvZiB0aGUgc2FtZSB0eXBlIGFzCi0gIFx2YXJ7c30pLiAgTm90ZSBhbHNvIHRoYXQgdGhlIGNvcGllcyBhcmUgc2hhbGxvdzsgbmVzdGVkIHN0cnVjdHVyZXMKLSAgYXJlIG5vdCBjb3BpZWQuICBUaGlzIG9mdGVuIGhhdW50cyBuZXcgUHl0aG9uIHByb2dyYW1tZXJzOyBjb25zaWRlcjoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGxpc3RzID0gW1tdXSAqIDMKLT4+PiBsaXN0cwotW1tdLCBbXSwgW11dCi0+Pj4gbGlzdHNbMF0uYXBwZW5kKDMpCi0+Pj4gbGlzdHMKLVtbM10sIFszXSwgWzNdXQotXGVuZHt2ZXJiYXRpbX0KLQotICBXaGF0IGhhcyBoYXBwZW5lZCBpcyB0aGF0IFxjb2Rle1tbXV19IGlzIGEgb25lLWVsZW1lbnQgbGlzdCBjb250YWluaW5nCi0gIGFuIGVtcHR5IGxpc3QsIHNvIGFsbCB0aHJlZSBlbGVtZW50cyBvZiBcY29kZXtbW11dICogM30gYXJlIChwb2ludGVycyB0bykKLSAgdGhpcyBzaW5nbGUgZW1wdHkgbGlzdC4gIE1vZGlmeWluZyBhbnkgb2YgdGhlIGVsZW1lbnRzIG9mIFxjb2Rle2xpc3RzfQotICBtb2RpZmllcyB0aGlzIHNpbmdsZSBsaXN0LiAgWW91IGNhbiBjcmVhdGUgYSBsaXN0IG9mIGRpZmZlcmVudCBsaXN0cyB0aGlzCi0gIHdheToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGxpc3RzID0gW1tdIGZvciBpIGluIHJhbmdlKDMpXQotPj4+IGxpc3RzWzBdLmFwcGVuZCgzKQotPj4+IGxpc3RzWzFdLmFwcGVuZCg1KQotPj4+IGxpc3RzWzJdLmFwcGVuZCg3KQotPj4+IGxpc3RzCi1bWzNdLCBbNV0sIFs3XV0KLVxlbmR7dmVyYmF0aW19Ci0KLVxpdGVtWygzKV0gSWYgXHZhcntpfSBvciBcdmFye2p9IGlzIG5lZ2F0aXZlLCB0aGUgaW5kZXggaXMgcmVsYXRpdmUgdG8KLSAgdGhlIGVuZCBvZiB0aGUgc3RyaW5nOiBcY29kZXtsZW4oXHZhcntzfSkgKyBcdmFye2l9fSBvcgotICBcY29kZXtsZW4oXHZhcntzfSkgKyBcdmFye2p9fSBpcyBzdWJzdGl0dXRlZC4gIEJ1dCBub3RlIHRoYXQgXGNvZGV7LTB9IGlzCi0gIHN0aWxsIFxjb2RlezB9LgotCi1caXRlbVsoNCldIFRoZSBzbGljZSBvZiBcdmFye3N9IGZyb20gXHZhcntpfSB0byBcdmFye2p9IGlzIGRlZmluZWQgYXMKLSAgdGhlIHNlcXVlbmNlIG9mIGl0ZW1zIHdpdGggaW5kZXggXHZhcntrfSBzdWNoIHRoYXQgXGNvZGV7XHZhcntpfSA8PQotICBcdmFye2t9IDwgXHZhcntqfX0uICBJZiBcdmFye2l9IG9yIFx2YXJ7an0gaXMgZ3JlYXRlciB0aGFuCi0gIFxjb2Rle2xlbihcdmFye3N9KX0sIHVzZSBcY29kZXtsZW4oXHZhcntzfSl9LiAgSWYgXHZhcntpfSBpcyBvbWl0dGVkCi0gIG9yIFxjb2Rle05vbmV9LCB1c2UgXGNvZGV7MH0uICBJZiBcdmFye2p9IGlzIG9taXR0ZWQgb3IgXGNvZGV7Tm9uZX0sCi0gIHVzZSBcY29kZXtsZW4oXHZhcntzfSl9LiAgSWYgXHZhcntpfSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gXHZhcntqfSwKLSAgdGhlIHNsaWNlIGlzIGVtcHR5LgotCi1caXRlbVsoNSldIFRoZSBzbGljZSBvZiBcdmFye3N9IGZyb20gXHZhcntpfSB0byBcdmFye2p9IHdpdGggc3RlcAotICBcdmFye2t9IGlzIGRlZmluZWQgYXMgdGhlIHNlcXVlbmNlIG9mIGl0ZW1zIHdpdGggaW5kZXggCi0gIFxjb2Rle1x2YXJ7eH0gPSBcdmFye2l9ICsgXHZhcntufSpcdmFye2t9fSBzdWNoIHRoYXQKLSAgJDAgXGxlcSBuIDwgXGZyYWN7ai1pfXtrfSQuICBJbiBvdGhlciB3b3JkcywgdGhlIGluZGljZXMKLSAgYXJlIFxjb2Rle2l9LCBcY29kZXtpK2t9LCBcY29kZXtpKzIqa30sIFxjb2Rle2krMyprfSBhbmQgc28gb24sIHN0b3BwaW5nIHdoZW4KLSAgXHZhcntqfSBpcyByZWFjaGVkIChidXQgbmV2ZXIgaW5jbHVkaW5nIFx2YXJ7an0pLiAgSWYgXHZhcntpfSBvciBcdmFye2p9Ci0gIGlzIGdyZWF0ZXIgdGhhbiBcY29kZXtsZW4oXHZhcntzfSl9LCB1c2UgXGNvZGV7bGVuKFx2YXJ7c30pfS4gIElmCi0gIFx2YXJ7aX0gb3IgXHZhcntqfSBhcmUgb21pdHRlZCBvciBcY29kZXtOb25lfSwgdGhleSBiZWNvbWUgYGBlbmQnJyB2YWx1ZXMKLSAgKHdoaWNoIGVuZCBkZXBlbmRzIG9uIHRoZSBzaWduIG9mIFx2YXJ7a30pLiAgTm90ZSwgXHZhcntrfSBjYW5ub3QKLSAgYmUgemVyby4gSWYgXHZhcntrfSBpcyBcY29kZXtOb25lfSwgaXQgaXMgdHJlYXRlZCBsaWtlIFxjb2RlezF9LgotCi1caXRlbVsoNildIElmIFx2YXJ7c30gYW5kIFx2YXJ7dH0gYXJlIGJvdGggc3RyaW5ncywgc29tZSBQeXRob24KLWltcGxlbWVudGF0aW9ucyBzdWNoIGFzIENQeXRob24gY2FuIHVzdWFsbHkgcGVyZm9ybSBhbiBpbi1wbGFjZSBvcHRpbWl6YXRpb24KLWZvciBhc3NpZ25tZW50cyBvZiB0aGUgZm9ybSBcY29kZXtcdmFye3N9PVx2YXJ7c30rXHZhcnt0fX0gb3IKLVxjb2Rle1x2YXJ7c30rPVx2YXJ7dH19LiAgV2hlbiBhcHBsaWNhYmxlLCB0aGlzIG9wdGltaXphdGlvbiBtYWtlcwotcXVhZHJhdGljIHJ1bi10aW1lIG11Y2ggbGVzcyBsaWtlbHkuICBUaGlzIG9wdGltaXphdGlvbiBpcyBib3RoIHZlcnNpb24KLWFuZCBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQuICBGb3IgcGVyZm9ybWFuY2Ugc2Vuc2l0aXZlIGNvZGUsIGl0IGlzCi1wcmVmZXJhYmxlIHRvIHVzZSB0aGUgXG1ldGhvZHtzdHIuam9pbigpfSBtZXRob2Qgd2hpY2ggYXNzdXJlcyBjb25zaXN0ZW50Ci1saW5lYXIgY29uY2F0ZW5hdGlvbiBwZXJmb3JtYW5jZSBhY3Jvc3MgdmVyc2lvbnMgYW5kIGltcGxlbWVudGF0aW9ucy4KLVx2ZXJzaW9uY2hhbmdlZFtGb3JtZXJseSwgc3RyaW5nIGNvbmNhdGVuYXRpb24gbmV2ZXIgb2NjdXJyZWQgaW4tcGxhY2VdezIuNH0KLQotXGVuZHtkZXNjcmlwdGlvbn0KLQotCi1cc3Vic2VjdGlvbntTdHJpbmcgTWV0aG9kcyBcbGFiZWx7c3RyaW5nLW1ldGhvZHN9fQotXGluZGV4aWl7c3RyaW5nfXttZXRob2RzfQotCi1UaGVzZSBhcmUgdGhlIHN0cmluZyBtZXRob2RzIHdoaWNoIGJvdGggOC1iaXQgc3RyaW5ncyBhbmQgVW5pY29kZQotb2JqZWN0cyBzdXBwb3J0OgotCi1cYmVnaW57bWV0aG9kZGVzY31bc3RyXXtjYXBpdGFsaXplfXt9Ci1SZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBvbmx5IGl0cyBmaXJzdCBjaGFyYWN0ZXIgY2FwaXRhbGl6ZWQuCi0KLUZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bc3RyXXtjZW50ZXJ9e3dpZHRoXG9wdGlvbmFseywgZmlsbGNoYXJ9fQotUmV0dXJuIGNlbnRlcmVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCBcdmFye3dpZHRofS4gUGFkZGluZyBpcyBkb25lCi11c2luZyB0aGUgc3BlY2lmaWVkIFx2YXJ7ZmlsbGNoYXJ9IChkZWZhdWx0IGlzIGEgc3BhY2UpLgotXHZlcnNpb25jaGFuZ2VkW1N1cHBvcnQgZm9yIHRoZSBcdmFye2ZpbGxjaGFyfSBhcmd1bWVudF17Mi40fQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bc3RyXXtjb3VudH17c3ViXG9wdGlvbmFseywgc3RhcnRcb3B0aW9uYWx7LCBlbmR9fX0KLVJldHVybiB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHN1YnN0cmluZyBcdmFye3N1Yn0gaW4gc3RyaW5nCi1TXGNvZGV7W1x2YXJ7c3RhcnR9Olx2YXJ7ZW5kfV19LiAgT3B0aW9uYWwgYXJndW1lbnRzIFx2YXJ7c3RhcnR9IGFuZAotXHZhcntlbmR9IGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3N0cl17ZGVjb2RlfXtcb3B0aW9uYWx7ZW5jb2Rpbmdcb3B0aW9uYWx7LCBlcnJvcnN9fX0KLURlY29kZXMgdGhlIHN0cmluZyB1c2luZyB0aGUgY29kZWMgcmVnaXN0ZXJlZCBmb3IgXHZhcntlbmNvZGluZ30uCi1cdmFye2VuY29kaW5nfSBkZWZhdWx0cyB0byB0aGUgZGVmYXVsdCBzdHJpbmcgZW5jb2RpbmcuICBcdmFye2Vycm9yc30KLW1heSBiZSBnaXZlbiB0byBzZXQgYSBkaWZmZXJlbnQgZXJyb3IgaGFuZGxpbmcgc2NoZW1lLiAgVGhlIGRlZmF1bHQgaXMKLVxjb2RleydzdHJpY3QnfSwgbWVhbmluZyB0aGF0IGVuY29kaW5nIGVycm9ycyByYWlzZQotXGV4Y2VwdGlvbntVbmljb2RlRXJyb3J9LiAgT3RoZXIgcG9zc2libGUgdmFsdWVzIGFyZSBcY29kZXsnaWdub3JlJ30sCi1cY29kZXsncmVwbGFjZSd9IGFuZCBhbnkgb3RoZXIgbmFtZSByZWdpc3RlcmVkIHZpYQotXGZ1bmN0aW9ue2NvZGVjcy5yZWdpc3Rlcl9lcnJvcn0sIHNlZSBzZWN0aW9uflxyZWZ7Y29kZWMtYmFzZS1jbGFzc2VzfS4KLVx2ZXJzaW9uYWRkZWR7Mi4yfQotXHZlcnNpb25jaGFuZ2VkW1N1cHBvcnQgZm9yIG90aGVyIGVycm9yIGhhbmRsaW5nIHNjaGVtZXMgYWRkZWRdezIuM30KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3N0cl17ZW5jb2RlfXtcb3B0aW9uYWx7ZW5jb2Rpbmdcb3B0aW9uYWx7LGVycm9yc319fQotUmV0dXJuIGFuIGVuY29kZWQgdmVyc2lvbiBvZiB0aGUgc3RyaW5nLiAgRGVmYXVsdCBlbmNvZGluZyBpcyB0aGUgY3VycmVudAotZGVmYXVsdCBzdHJpbmcgZW5jb2RpbmcuICBcdmFye2Vycm9yc30gbWF5IGJlIGdpdmVuIHRvIHNldCBhIGRpZmZlcmVudAotZXJyb3IgaGFuZGxpbmcgc2NoZW1lLiAgVGhlIGRlZmF1bHQgZm9yIFx2YXJ7ZXJyb3JzfSBpcwotXGNvZGV7J3N0cmljdCd9LCBtZWFuaW5nIHRoYXQgZW5jb2RpbmcgZXJyb3JzIHJhaXNlIGEKLVxleGNlcHRpb257VW5pY29kZUVycm9yfS4gIE90aGVyIHBvc3NpYmxlIHZhbHVlcyBhcmUgXGNvZGV7J2lnbm9yZSd9LAotXGNvZGV7J3JlcGxhY2UnfSwgXGNvZGV7J3htbGNoYXJyZWZyZXBsYWNlJ30sIFxjb2RleydiYWNrc2xhc2hyZXBsYWNlJ30KLWFuZCBhbnkgb3RoZXIgbmFtZSByZWdpc3RlcmVkIHZpYSBcZnVuY3Rpb257Y29kZWNzLnJlZ2lzdGVyX2Vycm9yfSwKLXNlZSBzZWN0aW9uflxyZWZ7Y29kZWMtYmFzZS1jbGFzc2VzfS4KLUZvciBhIGxpc3Qgb2YgcG9zc2libGUgZW5jb2RpbmdzLCBzZWUgc2VjdGlvbn5ccmVme3N0YW5kYXJkLWVuY29kaW5nc30uCi1cdmVyc2lvbmFkZGVkezIuMH0KLVx2ZXJzaW9uY2hhbmdlZFtTdXBwb3J0IGZvciBcY29kZXsneG1sY2hhcnJlZnJlcGxhY2UnfSBhbmQKLVxjb2RleydiYWNrc2xhc2hyZXBsYWNlJ30gYW5kIG90aGVyIGVycm9yIGhhbmRsaW5nIHNjaGVtZXMgYWRkZWRdezIuM30KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3N0cl17ZW5kc3dpdGh9e3N1ZmZpeFxvcHRpb25hbHssIHN0YXJ0XG9wdGlvbmFseywgZW5kfX19Ci1SZXR1cm4gXGNvZGV7VHJ1ZX0gaWYgdGhlIHN0cmluZyBlbmRzIHdpdGggdGhlIHNwZWNpZmllZCBcdmFye3N1ZmZpeH0sCi1vdGhlcndpc2UgcmV0dXJuIFxjb2Rle0ZhbHNlfS4gIFx2YXJ7c3VmZml4fSBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mCi1zdWZmaXhlcyB0byBsb29rIGZvci4gIFdpdGggb3B0aW9uYWwgXHZhcntzdGFydH0sIHRlc3QgYmVnaW5uaW5nIGF0Ci10aGF0IHBvc2l0aW9uLiAgV2l0aCBvcHRpb25hbCBcdmFye2VuZH0sIHN0b3AgY29tcGFyaW5nIGF0IHRoYXQgcG9zaXRpb24uCi0KLVx2ZXJzaW9uY2hhbmdlZFtBY2NlcHQgdHVwbGVzIGFzIFx2YXJ7c3VmZml4fV17Mi41fQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bc3RyXXtleHBhbmR0YWJzfXtcb3B0aW9uYWx7dGFic2l6ZX19Ci1SZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2hlcmUgYWxsIHRhYiBjaGFyYWN0ZXJzIGFyZSBleHBhbmRlZAotdXNpbmcgc3BhY2VzLiAgSWYgXHZhcnt0YWJzaXplfSBpcyBub3QgZ2l2ZW4sIGEgdGFiIHNpemUgb2YgXGNvZGV7OH0KLWNoYXJhY3RlcnMgaXMgYXNzdW1lZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3N0cl17ZmluZH17c3ViXG9wdGlvbmFseywgc3RhcnRcb3B0aW9uYWx7LCBlbmR9fX0KLVJldHVybiB0aGUgbG93ZXN0IGluZGV4IGluIHRoZSBzdHJpbmcgd2hlcmUgc3Vic3RyaW5nIFx2YXJ7c3VifSBpcwotZm91bmQsIHN1Y2ggdGhhdCBcdmFye3N1Yn0gaXMgY29udGFpbmVkIGluIHRoZSByYW5nZSBbXHZhcntzdGFydH0sCi1cdmFye2VuZH1dLiAgT3B0aW9uYWwgYXJndW1lbnRzIFx2YXJ7c3RhcnR9IGFuZCBcdmFye2VuZH0gYXJlCi1pbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi4gIFJldHVybiBcY29kZXstMX0gaWYgXHZhcntzdWJ9IGlzCi1ub3QgZm91bmQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtzdHJde2luZGV4fXtzdWJcb3B0aW9uYWx7LCBzdGFydFxvcHRpb25hbHssIGVuZH19fQotTGlrZSBcbWV0aG9ke2ZpbmQoKX0sIGJ1dCByYWlzZSBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IHdoZW4gdGhlCi1zdWJzdHJpbmcgaXMgbm90IGZvdW5kLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bc3RyXXtpc2FsbnVtfXt9Ci1SZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBhbHBoYW51bWVyaWMgYW5kIHRoZXJlCi1pcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuCi0KLUZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bc3RyXXtpc2FscGhhfXt9Ci1SZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBhbHBoYWJldGljIGFuZCB0aGVyZQotaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLgotCi1Gb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3N0cl17aXNkaWdpdH17fQotUmV0dXJuIHRydWUgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgZGlnaXRzIGFuZCB0aGVyZQotaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLgotCi1Gb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3N0cl17aXNpZGVudGlmaWVyfXt9Ci1SZXR1cm4gVHJ1ZSBpZiBTIGlzIGEgdmFsaWQgaWRlbnRpZmllciBhY2NvcmRpbmcKLXRvIHRoZSBsYW5ndWFnZSBkZWZpbml0aW9uLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bc3RyXXtpc2xvd2VyfXt9Ci1SZXR1cm4gdHJ1ZSBpZiBhbGwgY2FzZWQgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBsb3dlcmNhc2UgYW5kCi10aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2FzZWQgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuCi0KLUZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bc3RyXXtpc3NwYWNlfXt9Ci1SZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgb25seSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhbmQKLXRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS4KLQotRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtzdHJde2lzdGl0bGV9e30KLVJldHVybiB0cnVlIGlmIHRoZSBzdHJpbmcgaXMgYSB0aXRsZWNhc2VkIHN0cmluZyBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lCi1jaGFyYWN0ZXIsIGZvciBleGFtcGxlIHVwcGVyY2FzZSBjaGFyYWN0ZXJzIG1heSBvbmx5IGZvbGxvdyB1bmNhc2VkCi1jaGFyYWN0ZXJzIGFuZCBsb3dlcmNhc2UgY2hhcmFjdGVycyBvbmx5IGNhc2VkIG9uZXMuICBSZXR1cm4gZmFsc2UKLW90aGVyd2lzZS4KLQotRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtzdHJde2lzdXBwZXJ9e30KLVJldHVybiB0cnVlIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIHVwcGVyY2FzZSBhbmQKLXRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjYXNlZCBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS4KLQotRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtzdHJde2pvaW59e3NlcX0KLVJldHVybiBhIHN0cmluZyB3aGljaCBpcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgc3RyaW5ncyBpbiB0aGUKLXNlcXVlbmNlIFx2YXJ7c2VxfS4gIFRoZSBzZXBhcmF0b3IgYmV0d2VlbiBlbGVtZW50cyBpcyB0aGUgc3RyaW5nCi1wcm92aWRpbmcgdGhpcyBtZXRob2QuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtzdHJde2xqdXN0fXt3aWR0aFxvcHRpb25hbHssIGZpbGxjaGFyfX0KLVJldHVybiB0aGUgc3RyaW5nIGxlZnQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCBcdmFye3dpZHRofS4KLVBhZGRpbmcgaXMgZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkIFx2YXJ7ZmlsbGNoYXJ9IChkZWZhdWx0IGlzIGEKLXNwYWNlKS4gIFRoZSBvcmlnaW5hbCBzdHJpbmcgaXMgcmV0dXJuZWQgaWYKLVx2YXJ7d2lkdGh9IGlzIGxlc3MgdGhhbiBcY29kZXtsZW4oXHZhcntzfSl9LgotXHZlcnNpb25jaGFuZ2VkW1N1cHBvcnQgZm9yIHRoZSBcdmFye2ZpbGxjaGFyfSBhcmd1bWVudF17Mi40fQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bc3RyXXtsb3dlcn17fQotUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIGNvbnZlcnRlZCB0byBsb3dlcmNhc2UuCi0KLUZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bc3RyXXtsc3RyaXB9e1xvcHRpb25hbHtjaGFyc319Ci1SZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBsZWFkaW5nIGNoYXJhY3RlcnMgcmVtb3ZlZC4gIFRoZQotXHZhcntjaGFyc30gYXJndW1lbnQgaXMgYSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgc2V0IG9mIGNoYXJhY3RlcnMKLXRvIGJlIHJlbW92ZWQuICBJZiBvbWl0dGVkIG9yIFxjb2Rle05vbmV9LCB0aGUgXHZhcntjaGFyc30gYXJndW1lbnQKLWRlZmF1bHRzIHRvIHJlbW92aW5nIHdoaXRlc3BhY2UuICBUaGUgXHZhcntjaGFyc30gYXJndW1lbnQgaXMgbm90Ci1hIHByZWZpeDsgcmF0aGVyLCBhbGwgY29tYmluYXRpb25zIG9mIGl0cyB2YWx1ZXMgYXJlIHN0cmlwcGVkOgotXGJlZ2lue3ZlcmJhdGltfQotICAgID4+PiAnICAgc3BhY2lvdXMgICAnLmxzdHJpcCgpCi0gICAgJ3NwYWNpb3VzICAgJwotICAgID4+PiAnd3d3LmV4YW1wbGUuY29tJy5sc3RyaXAoJ2Ntb3d6LicpCi0gICAgJ2V4YW1wbGUuY29tJwotXGVuZHt2ZXJiYXRpbX0KLVx2ZXJzaW9uY2hhbmdlZFtTdXBwb3J0IGZvciB0aGUgXHZhcntjaGFyc30gYXJndW1lbnRdezIuMi4yfQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bc3RyXXtwYXJ0aXRpb259e3NlcH0KLVNwbGl0IHRoZSBzdHJpbmcgYXQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgXHZhcntzZXB9LCBhbmQgcmV0dXJuCi1hIDMtdHVwbGUgY29udGFpbmluZyB0aGUgcGFydCBiZWZvcmUgdGhlIHNlcGFyYXRvciwgdGhlIHNlcGFyYXRvcgotaXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgdGhlIHNlcGFyYXRvci4gIElmIHRoZSBzZXBhcmF0b3IgaXMgbm90Ci1mb3VuZCwgcmV0dXJuIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBzdHJpbmcgaXRzZWxmLCBmb2xsb3dlZCBieQotdHdvIGVtcHR5IHN0cmluZ3MuCi1cdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3N0cl17cmVwbGFjZX17b2xkLCBuZXdcb3B0aW9uYWx7LCBjb3VudH19Ci1SZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBhbGwgb2NjdXJyZW5jZXMgb2Ygc3Vic3RyaW5nCi1cdmFye29sZH0gcmVwbGFjZWQgYnkgXHZhcntuZXd9LiAgSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50Ci1cdmFye2NvdW50fSBpcyBnaXZlbiwgb25seSB0aGUgZmlyc3QgXHZhcntjb3VudH0gb2NjdXJyZW5jZXMgYXJlCi1yZXBsYWNlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3N0cl17cmZpbmR9e3N1YiBcb3B0aW9uYWx7LHN0YXJ0IFxvcHRpb25hbHssZW5kfX19Ci1SZXR1cm4gdGhlIGhpZ2hlc3QgaW5kZXggaW4gdGhlIHN0cmluZyB3aGVyZSBzdWJzdHJpbmcgXHZhcntzdWJ9IGlzCi1mb3VuZCwgc3VjaCB0aGF0IFx2YXJ7c3VifSBpcyBjb250YWluZWQgd2l0aGluIHNbc3RhcnQsZW5kXS4gIE9wdGlvbmFsCi1hcmd1bWVudHMgXHZhcntzdGFydH0gYW5kIFx2YXJ7ZW5kfSBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2UKLW5vdGF0aW9uLiAgUmV0dXJuIFxjb2Rley0xfSBvbiBmYWlsdXJlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bc3RyXXtyaW5kZXh9e3N1YlxvcHRpb25hbHssIHN0YXJ0XG9wdGlvbmFseywgZW5kfX19Ci1MaWtlIFxtZXRob2R7cmZpbmQoKX0gYnV0IHJhaXNlcyBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IHdoZW4gdGhlCi1zdWJzdHJpbmcgXHZhcntzdWJ9IGlzIG5vdCBmb3VuZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3N0cl17cmp1c3R9e3dpZHRoXG9wdGlvbmFseywgZmlsbGNoYXJ9fQotUmV0dXJuIHRoZSBzdHJpbmcgcmlnaHQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCBcdmFye3dpZHRofS4KLVBhZGRpbmcgaXMgZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkIFx2YXJ7ZmlsbGNoYXJ9IChkZWZhdWx0IGlzIGEgc3BhY2UpLgotVGhlIG9yaWdpbmFsIHN0cmluZyBpcyByZXR1cm5lZCBpZgotXHZhcnt3aWR0aH0gaXMgbGVzcyB0aGFuIFxjb2Rle2xlbihcdmFye3N9KX0uCi1cdmVyc2lvbmNoYW5nZWRbU3VwcG9ydCBmb3IgdGhlIFx2YXJ7ZmlsbGNoYXJ9IGFyZ3VtZW50XXsyLjR9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtzdHJde3JwYXJ0aXRpb259e3NlcH0KLVNwbGl0IHRoZSBzdHJpbmcgYXQgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBcdmFye3NlcH0sIGFuZCByZXR1cm4KLWEgMy10dXBsZSBjb250YWluaW5nIHRoZSBwYXJ0IGJlZm9yZSB0aGUgc2VwYXJhdG9yLCB0aGUgc2VwYXJhdG9yCi1pdHNlbGYsIGFuZCB0aGUgcGFydCBhZnRlciB0aGUgc2VwYXJhdG9yLiAgSWYgdGhlIHNlcGFyYXRvciBpcyBub3QKLWZvdW5kLCByZXR1cm4gYSAzLXR1cGxlIGNvbnRhaW5pbmcgdHdvIGVtcHR5IHN0cmluZ3MsIGZvbGxvd2VkIGJ5Ci10aGUgc3RyaW5nIGl0c2VsZi4KLVx2ZXJzaW9uYWRkZWR7Mi41fQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bc3RyXXtyc3BsaXR9e1xvcHRpb25hbHtzZXAgXG9wdGlvbmFseyxtYXhzcGxpdH19fQotUmV0dXJuIGEgbGlzdCBvZiB0aGUgd29yZHMgaW4gdGhlIHN0cmluZywgdXNpbmcgXHZhcntzZXB9IGFzIHRoZQotZGVsaW1pdGVyIHN0cmluZy4gIElmIFx2YXJ7bWF4c3BsaXR9IGlzIGdpdmVuLCBhdCBtb3N0IFx2YXJ7bWF4c3BsaXR9Ci1zcGxpdHMgYXJlIGRvbmUsIHRoZSBcZW1waHtyaWdodG1vc3R9IG9uZXMuICBJZiBcdmFye3NlcH0gaXMgbm90IHNwZWNpZmllZAotb3IgXGNvZGV7Tm9uZX0sIGFueSB3aGl0ZXNwYWNlIHN0cmluZyBpcyBhIHNlcGFyYXRvci4gIEV4Y2VwdCBmb3Igc3BsaXR0aW5nCi1mcm9tIHRoZSByaWdodCwgXG1ldGhvZHtyc3BsaXQoKX0gYmVoYXZlcyBsaWtlIFxtZXRob2R7c3BsaXQoKX0gd2hpY2gKLWlzIGRlc2NyaWJlZCBpbiBkZXRhaWwgYmVsb3cuCi1cdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3N0cl17cnN0cmlwfXtcb3B0aW9uYWx7Y2hhcnN9fQotUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggdHJhaWxpbmcgY2hhcmFjdGVycyByZW1vdmVkLiAgVGhlCi1cdmFye2NoYXJzfSBhcmd1bWVudCBpcyBhIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBzZXQgb2YgY2hhcmFjdGVycwotdG8gYmUgcmVtb3ZlZC4gIElmIG9taXR0ZWQgb3IgXGNvZGV7Tm9uZX0sIHRoZSBcdmFye2NoYXJzfSBhcmd1bWVudAotZGVmYXVsdHMgdG8gcmVtb3Zpbmcgd2hpdGVzcGFjZS4gIFRoZSBcdmFye2NoYXJzfSBhcmd1bWVudCBpcyBub3QKLWEgc3VmZml4OyByYXRoZXIsIGFsbCBjb21iaW5hdGlvbnMgb2YgaXRzIHZhbHVlcyBhcmUgc3RyaXBwZWQ6Ci1cYmVnaW57dmVyYmF0aW19Ci0gICAgPj4+ICcgICBzcGFjaW91cyAgICcucnN0cmlwKCkKLSAgICAnICAgc3BhY2lvdXMnCi0gICAgPj4+ICdtaXNzaXNzaXBwaScucnN0cmlwKCdpcHonKQotICAgICdtaXNzaXNzJwotXGVuZHt2ZXJiYXRpbX0KLVx2ZXJzaW9uY2hhbmdlZFtTdXBwb3J0IGZvciB0aGUgXHZhcntjaGFyc30gYXJndW1lbnRdezIuMi4yfQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bc3RyXXtzcGxpdH17XG9wdGlvbmFse3NlcCBcb3B0aW9uYWx7LG1heHNwbGl0fX19Ci1SZXR1cm4gYSBsaXN0IG9mIHRoZSB3b3JkcyBpbiB0aGUgc3RyaW5nLCB1c2luZyBcdmFye3NlcH0gYXMgdGhlCi1kZWxpbWl0ZXIgc3RyaW5nLiAgSWYgXHZhcnttYXhzcGxpdH0gaXMgZ2l2ZW4sIGF0IG1vc3QgXHZhcnttYXhzcGxpdH0KLXNwbGl0cyBhcmUgZG9uZS4gKHRodXMsIHRoZSBsaXN0IHdpbGwgaGF2ZSBhdCBtb3N0IFxjb2Rle1x2YXJ7bWF4c3BsaXR9KzF9Ci1lbGVtZW50cykuICBJZiBcdmFye21heHNwbGl0fSBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRoZXJlCi1pcyBubyBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHNwbGl0cyAoYWxsIHBvc3NpYmxlIHNwbGl0cyBhcmUgbWFkZSkuCi1Db25zZWN1dGl2ZSBkZWxpbWl0ZXJzIGFyZSBub3QgZ3JvdXBlZCB0b2dldGhlciBhbmQgYXJlCi1kZWVtZWQgdG8gZGVsaW1pdCBlbXB0eSBzdHJpbmdzIChmb3IgZXhhbXBsZSwgXHNhbXB7JzEsLDInLnNwbGl0KCcsJyl9Ci1yZXR1cm5zIFxzYW1we1snMScsICcnLCAnMiddfSkuICBUaGUgXHZhcntzZXB9IGFyZ3VtZW50IG1heSBjb25zaXN0IG9mCi1tdWx0aXBsZSBjaGFyYWN0ZXJzIChmb3IgZXhhbXBsZSwgXHNhbXB7JzEsIDIsIDMnLnNwbGl0KCcsICcpfSByZXR1cm5zCi1cc2FtcHtbJzEnLCAnMicsICczJ119KS4gIFNwbGl0dGluZyBhbiBlbXB0eSBzdHJpbmcgd2l0aCBhIHNwZWNpZmllZAotc2VwYXJhdG9yIHJldHVybnMgXHNhbXB7WycnXX0uCi0KLUlmIFx2YXJ7c2VwfSBpcyBub3Qgc3BlY2lmaWVkIG9yIGlzIFxjb2Rle05vbmV9LCBhIGRpZmZlcmVudCBzcGxpdHRpbmcKLWFsZ29yaXRobSBpcyBhcHBsaWVkLiAgRmlyc3QsIHdoaXRlc3BhY2UgY2hhcmFjdGVycyAoc3BhY2VzLCB0YWJzLAotbmV3bGluZXMsIHJldHVybnMsIGFuZCBmb3JtZmVlZHMpIGFyZSBzdHJpcHBlZCBmcm9tIGJvdGggZW5kcy4gIFRoZW4sCi13b3JkcyBhcmUgc2VwYXJhdGVkIGJ5IGFyYml0cmFyeSBsZW5ndGggc3RyaW5ncyBvZiB3aGl0ZXNwYWNlCi1jaGFyYWN0ZXJzLiBDb25zZWN1dGl2ZSB3aGl0ZXNwYWNlIGRlbGltaXRlcnMgYXJlIHRyZWF0ZWQgYXMgYSBzaW5nbGUKLWRlbGltaXRlciAoXHNhbXB7JzEgIDIgIDMnLnNwbGl0KCl9IHJldHVybnMgXHNhbXB7WycxJywgJzInLCAnMyddfSkuCi1TcGxpdHRpbmcgYW4gZW1wdHkgc3RyaW5nIG9yIGEgc3RyaW5nIGNvbnNpc3Rpbmcgb2YganVzdCB3aGl0ZXNwYWNlCi1yZXR1cm5zIGFuIGVtcHR5IGxpc3QuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtzdHJde3NwbGl0bGluZXN9e1xvcHRpb25hbHtrZWVwZW5kc319Ci1SZXR1cm4gYSBsaXN0IG9mIHRoZSBsaW5lcyBpbiB0aGUgc3RyaW5nLCBicmVha2luZyBhdCBsaW5lCi1ib3VuZGFyaWVzLiAgTGluZSBicmVha3MgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIGxpc3QgdW5sZXNzCi1cdmFye2tlZXBlbmRzfSBpcyBnaXZlbiBhbmQgdHJ1ZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3N0cl17c3RhcnRzd2l0aH17cHJlZml4XG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0XG9wdGlvbmFseywgZW5kfX19Ci1SZXR1cm4gXGNvZGV7VHJ1ZX0gaWYgc3RyaW5nIHN0YXJ0cyB3aXRoIHRoZSBcdmFye3ByZWZpeH0sIG90aGVyd2lzZQotcmV0dXJuIFxjb2Rle0ZhbHNlfS4gIFx2YXJ7cHJlZml4fSBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mCi1wcmVmaXhlcyB0byBsb29rIGZvci4gIFdpdGggb3B0aW9uYWwgXHZhcntzdGFydH0sIHRlc3Qgc3RyaW5nIGJlZ2lubmluZyBhdAotdGhhdCBwb3NpdGlvbi4gIFdpdGggb3B0aW9uYWwgXHZhcntlbmR9LCBzdG9wIGNvbXBhcmluZyBzdHJpbmcgYXQgdGhhdAotcG9zaXRpb24uCi0KLVx2ZXJzaW9uY2hhbmdlZFtBY2NlcHQgdHVwbGVzIGFzIFx2YXJ7cHJlZml4fV17Mi41fQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bc3RyXXtzdHJpcH17XG9wdGlvbmFse2NoYXJzfX0KLVJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIHRoZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBjaGFyYWN0ZXJzCi1yZW1vdmVkLiAgVGhlIFx2YXJ7Y2hhcnN9IGFyZ3VtZW50IGlzIGEgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIHNldCBvZgotY2hhcmFjdGVycyB0byBiZSByZW1vdmVkLiAgSWYgb21pdHRlZCBvciBcY29kZXtOb25lfSwgdGhlIFx2YXJ7Y2hhcnN9Ci1hcmd1bWVudCBkZWZhdWx0cyB0byByZW1vdmluZyB3aGl0ZXNwYWNlLiAgVGhlIFx2YXJ7Y2hhcnN9IGFyZ3VtZW50IGlzIG5vdAotYSBwcmVmaXggb3Igc3VmZml4OyByYXRoZXIsIGFsbCBjb21iaW5hdGlvbnMgb2YgaXRzIHZhbHVlcyBhcmUgc3RyaXBwZWQ6Ci1cYmVnaW57dmVyYmF0aW19Ci0gICAgPj4+ICcgICBzcGFjaW91cyAgICcuc3RyaXAoKQotICAgICdzcGFjaW91cycKLSAgICA+Pj4gJ3d3dy5leGFtcGxlLmNvbScuc3RyaXAoJ2Ntb3d6LicpCi0gICAgJ2V4YW1wbGUnCi1cZW5ke3ZlcmJhdGltfQotXHZlcnNpb25jaGFuZ2VkW1N1cHBvcnQgZm9yIHRoZSBcdmFye2NoYXJzfSBhcmd1bWVudF17Mi4yLjJ9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtzdHJde3N3YXBjYXNlfXt9Ci1SZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCB1cHBlcmNhc2UgY2hhcmFjdGVycyBjb252ZXJ0ZWQgdG8KLWxvd2VyY2FzZSBhbmQgdmljZSB2ZXJzYS4KLQotRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtzdHJde3RpdGxlfXt9Ci1SZXR1cm4gYSB0aXRsZWNhc2VkIHZlcnNpb24gb2YgdGhlIHN0cmluZzogd29yZHMgc3RhcnQgd2l0aCB1cHBlcmNhc2UKLWNoYXJhY3RlcnMsIGFsbCByZW1haW5pbmcgY2FzZWQgY2hhcmFjdGVycyBhcmUgbG93ZXJjYXNlLgotCi1Gb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3N0cl17dHJhbnNsYXRlfXt0YWJsZVxvcHRpb25hbHssIGRlbGV0ZWNoYXJzfX0KLVJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aGVyZSBhbGwgY2hhcmFjdGVycyBvY2N1cnJpbmcgaW4gdGhlCi1vcHRpb25hbCBhcmd1bWVudCBcdmFye2RlbGV0ZWNoYXJzfSBhcmUgcmVtb3ZlZCwgYW5kIHRoZSByZW1haW5pbmcKLWNoYXJhY3RlcnMgaGF2ZSBiZWVuIG1hcHBlZCB0aHJvdWdoIHRoZSBnaXZlbiB0cmFuc2xhdGlvbiB0YWJsZSwgd2hpY2gKLW11c3QgYmUgYSBzdHJpbmcgb2YgbGVuZ3RoIDI1Ni4KLQotWW91IGNhbiB1c2UgdGhlIFxmdW5jdGlvbnttYWtldHJhbnMoKX0gaGVscGVyIGZ1bmN0aW9uIGluIHRoZQotXHJlZm1vZHVsZXtzdHJpbmd9IG1vZHVsZSB0byBjcmVhdGUgYSB0cmFuc2xhdGlvbiB0YWJsZS4KLUZvciBzdHJpbmcgb2JqZWN0cywgc2V0IHRoZSBcdmFye3RhYmxlfSBhcmd1bWVudCB0byBcY29kZXtOb25lfQotZm9yIHRyYW5zbGF0aW9ucyB0aGF0IG9ubHkgZGVsZXRlIGNoYXJhY3RlcnM6Ci1cYmVnaW57dmVyYmF0aW19Ci0gICAgPj4+ICdyZWFkIHRoaXMgc2hvcnQgdGV4dCcudHJhbnNsYXRlKE5vbmUsICdhZWlvdScpCi0gICAgJ3JkIHRocyBzaHJ0IHR4dCcKLVxlbmR7dmVyYmF0aW19Ci1cdmVyc2lvbmFkZGVkW1N1cHBvcnQgZm9yIGEgXGNvZGV7Tm9uZX0gXHZhcnt0YWJsZX0gYXJndW1lbnRdezIuNn0KLQotRm9yIFVuaWNvZGUgb2JqZWN0cywgdGhlIFxtZXRob2R7dHJhbnNsYXRlKCl9IG1ldGhvZCBkb2VzIG5vdAotYWNjZXB0IHRoZSBvcHRpb25hbCBcdmFye2RlbGV0ZWNoYXJzfSBhcmd1bWVudC4gIEluc3RlYWQsIGl0Ci1yZXR1cm5zIGEgY29weSBvZiB0aGUgXHZhcntzfSB3aGVyZSBhbGwgY2hhcmFjdGVycyBoYXZlIGJlZW4gbWFwcGVkCi10aHJvdWdoIHRoZSBnaXZlbiB0cmFuc2xhdGlvbiB0YWJsZSB3aGljaCBtdXN0IGJlIGEgbWFwcGluZyBvZgotVW5pY29kZSBvcmRpbmFscyB0byBVbmljb2RlIG9yZGluYWxzLCBVbmljb2RlIHN0cmluZ3Mgb3IgXGNvZGV7Tm9uZX0uCi1Vbm1hcHBlZCBjaGFyYWN0ZXJzIGFyZSBsZWZ0IHVudG91Y2hlZC4gQ2hhcmFjdGVycyBtYXBwZWQgdG8gXGNvZGV7Tm9uZX0KLWFyZSBkZWxldGVkLiAgTm90ZSwgYSBtb3JlIGZsZXhpYmxlIGFwcHJvYWNoIGlzIHRvIGNyZWF0ZSBhIGN1c3RvbQotY2hhcmFjdGVyIG1hcHBpbmcgY29kZWMgdXNpbmcgdGhlIFxyZWZtb2R1bGV7Y29kZWNzfSBtb2R1bGUgKHNlZQotXG1vZHVsZXtlbmNvZGluZ3MuY3AxMjUxfSBmb3IgYW4gZXhhbXBsZSkuICAgICAgCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtzdHJde3VwcGVyfXt9Ci1SZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgY29udmVydGVkIHRvIHVwcGVyY2FzZS4KLQotRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtzdHJde3pmaWxsfXt3aWR0aH0KLVJldHVybiB0aGUgbnVtZXJpYyBzdHJpbmcgbGVmdCBmaWxsZWQgd2l0aCB6ZXJvcyBpbiBhIHN0cmluZwotb2YgbGVuZ3RoIFx2YXJ7d2lkdGh9LiBUaGUgb3JpZ2luYWwgc3RyaW5nIGlzIHJldHVybmVkIGlmCi1cdmFye3dpZHRofSBpcyBsZXNzIHRoYW4gXGNvZGV7bGVuKFx2YXJ7c30pfS4KLVx2ZXJzaW9uYWRkZWR7Mi4yLjJ9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLQotXHN1YnNlY3Rpb257U3RyaW5nIEZvcm1hdHRpbmcgT3BlcmF0aW9ucyBcbGFiZWx7dHlwZXNzZXEtc3RyaW5nc319Ci0KLVxpbmRleHtmb3JtYXR0aW5nLCBzdHJpbmcgKFwle30pfQotXGluZGV4e2ludGVycG9sYXRpb24sIHN0cmluZyAoXCV7fSl9Ci1caW5kZXh7c3RyaW5nIWZvcm1hdHRpbmd9Ci1caW5kZXh7c3RyaW5nIWludGVycG9sYXRpb259Ci1caW5kZXh7cHJpbnRmLXN0eWxlIGZvcm1hdHRpbmd9Ci1caW5kZXh7c3ByaW50Zi1zdHlsZSBmb3JtYXR0aW5nfQotXGluZGV4e1xwcm90ZWN0XCV7fSBmb3JtYXR0aW5nfQotXGluZGV4e1xwcm90ZWN0XCV7fSBpbnRlcnBvbGF0aW9ufQotCi1TdHJpbmcgYW5kIFVuaWNvZGUgb2JqZWN0cyBoYXZlIG9uZSB1bmlxdWUgYnVpbHQtaW4gb3BlcmF0aW9uOiB0aGUKLVxjb2Rle1wlfSBvcGVyYXRvciAobW9kdWxvKS4gIFRoaXMgaXMgYWxzbyBrbm93biBhcyB0aGUgc3RyaW5nCi1cZW1waHtmb3JtYXR0aW5nfSBvciBcZW1waHtpbnRlcnBvbGF0aW9ufSBvcGVyYXRvci4gIEdpdmVuCi1cY29kZXtcdmFye2Zvcm1hdH0gXCUgXHZhcnt2YWx1ZXN9fSAod2hlcmUgXHZhcntmb3JtYXR9IGlzIGEgc3RyaW5nIG9yCi1Vbmljb2RlIG9iamVjdCksIFxjb2Rle1wlfSBjb252ZXJzaW9uIHNwZWNpZmljYXRpb25zIGluIFx2YXJ7Zm9ybWF0fQotYXJlIHJlcGxhY2VkIHdpdGggemVybyBvciBtb3JlIGVsZW1lbnRzIG9mIFx2YXJ7dmFsdWVzfS4gIFRoZSBlZmZlY3QKLWlzIHNpbWlsYXIgdG8gdGhlIHVzaW5nIFxjZnVuY3Rpb257c3ByaW50ZigpfSBpbiB0aGUgQyBsYW5ndWFnZS4gIElmCi1cdmFye2Zvcm1hdH0gaXMgYSBVbmljb2RlIG9iamVjdCwgb3IgaWYgYW55IG9mIHRoZSBvYmplY3RzIGJlaW5nCi1jb252ZXJ0ZWQgdXNpbmcgdGhlIFxjb2Rle1wlc30gY29udmVyc2lvbiBhcmUgVW5pY29kZSBvYmplY3RzLCB0aGUKLXJlc3VsdCB3aWxsIGFsc28gYmUgYSBVbmljb2RlIG9iamVjdC4KLQotSWYgXHZhcntmb3JtYXR9IHJlcXVpcmVzIGEgc2luZ2xlIGFyZ3VtZW50LCBcdmFye3ZhbHVlc30gbWF5IGJlIGEKLXNpbmdsZSBub24tdHVwbGUgb2JqZWN0Llxmb290bm90ZXtUbyBmb3JtYXQgb25seSBhIHR1cGxlIHlvdQotc2hvdWxkIHRoZXJlZm9yZSBwcm92aWRlIGEgc2luZ2xldG9uIHR1cGxlIHdob3NlIG9ubHkgZWxlbWVudAotaXMgdGhlIHR1cGxlIHRvIGJlIGZvcm1hdHRlZC59ICBPdGhlcndpc2UsIFx2YXJ7dmFsdWVzfSBtdXN0IGJlIGEgdHVwbGUgd2l0aAotZXhhY3RseSB0aGUgbnVtYmVyIG9mIGl0ZW1zIHNwZWNpZmllZCBieSB0aGUgZm9ybWF0IHN0cmluZywgb3IgYQotc2luZ2xlIG1hcHBpbmcgb2JqZWN0IChmb3IgZXhhbXBsZSwgYSBkaWN0aW9uYXJ5KS4KLQotQSBjb252ZXJzaW9uIHNwZWNpZmllciBjb250YWlucyB0d28gb3IgbW9yZSBjaGFyYWN0ZXJzIGFuZCBoYXMgdGhlCi1mb2xsb3dpbmcgY29tcG9uZW50cywgd2hpY2ggbXVzdCBvY2N1ciBpbiB0aGlzIG9yZGVyOgotCi1cYmVnaW57ZW51bWVyYXRlfQotICBcaXRlbSAgVGhlIFxjaGFyYWN0ZXJ7XCV9IGNoYXJhY3Rlciwgd2hpY2ggbWFya3MgdGhlIHN0YXJ0IG9mIHRoZQotICAgICAgICAgc3BlY2lmaWVyLgotICBcaXRlbSAgTWFwcGluZyBrZXkgKG9wdGlvbmFsKSwgY29uc2lzdGluZyBvZiBhIHBhcmVudGhlc2lzZWQgc2VxdWVuY2UKLSAgICAgICAgIG9mIGNoYXJhY3RlcnMgKGZvciBleGFtcGxlLCBcY29kZXsoc29tZW5hbWUpfSkuCi0gIFxpdGVtICBDb252ZXJzaW9uIGZsYWdzIChvcHRpb25hbCksIHdoaWNoIGFmZmVjdCB0aGUgcmVzdWx0IG9mIHNvbWUKLSAgICAgICAgIGNvbnZlcnNpb24gdHlwZXMuCi0gIFxpdGVtICBNaW5pbXVtIGZpZWxkIHdpZHRoIChvcHRpb25hbCkuICBJZiBzcGVjaWZpZWQgYXMgYW4KLSAgICAgICAgIFxjaGFyYWN0ZXJ7Kn0gKGFzdGVyaXNrKSwgdGhlIGFjdHVhbCB3aWR0aCBpcyByZWFkIGZyb20gdGhlCi0gICAgICAgICBuZXh0IGVsZW1lbnQgb2YgdGhlIHR1cGxlIGluIFx2YXJ7dmFsdWVzfSwgYW5kIHRoZSBvYmplY3QgdG8KLSAgICAgICAgIGNvbnZlcnQgY29tZXMgYWZ0ZXIgdGhlIG1pbmltdW0gZmllbGQgd2lkdGggYW5kIG9wdGlvbmFsCi0gICAgICAgICBwcmVjaXNpb24uCi0gIFxpdGVtICBQcmVjaXNpb24gKG9wdGlvbmFsKSwgZ2l2ZW4gYXMgYSBcY2hhcmFjdGVyey59IChkb3QpIGZvbGxvd2VkCi0gICAgICAgICBieSB0aGUgcHJlY2lzaW9uLiAgSWYgc3BlY2lmaWVkIGFzIFxjaGFyYWN0ZXJ7Kn0gKGFuCi0gICAgICAgICBhc3RlcmlzayksIHRoZSBhY3R1YWwgd2lkdGggaXMgcmVhZCBmcm9tIHRoZSBuZXh0IGVsZW1lbnQgb2YKLSAgICAgICAgIHRoZSB0dXBsZSBpbiBcdmFye3ZhbHVlc30sIGFuZCB0aGUgdmFsdWUgdG8gY29udmVydCBjb21lcyBhZnRlcgotICAgICAgICAgdGhlIHByZWNpc2lvbi4KLSAgXGl0ZW0gIExlbmd0aCBtb2RpZmllciAob3B0aW9uYWwpLgotICBcaXRlbSAgQ29udmVyc2lvbiB0eXBlLgotXGVuZHtlbnVtZXJhdGV9Ci0KLVdoZW4gdGhlIHJpZ2h0IGFyZ3VtZW50IGlzIGEgZGljdGlvbmFyeSAob3Igb3RoZXIgbWFwcGluZyB0eXBlKSwgdGhlbgotdGhlIGZvcm1hdHMgaW4gdGhlIHN0cmluZyBcZW1waHttdXN0fSBpbmNsdWRlIGEgcGFyZW50aGVzaXNlZCBtYXBwaW5nIGtleSBpbnRvCi10aGF0IGRpY3Rpb25hcnkgaW5zZXJ0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIFxjaGFyYWN0ZXJ7XCV9Ci1jaGFyYWN0ZXIuIFRoZSBtYXBwaW5nIGtleSBzZWxlY3RzIHRoZSB2YWx1ZSB0byBiZSBmb3JtYXR0ZWQgZnJvbSB0aGUKLW1hcHBpbmcuICBGb3IgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHByaW50ICclKGxhbmd1YWdlKXMgaGFzICUoIykwM2QgcXVvdGUgdHlwZXMuJyAlIFwKLSAgICAgICAgICB7J2xhbmd1YWdlJzogIlB5dGhvbiIsICIjIjogMn0KLVB5dGhvbiBoYXMgMDAyIHF1b3RlIHR5cGVzLgotXGVuZHt2ZXJiYXRpbX0KLQotSW4gdGhpcyBjYXNlIG5vIFxjb2Rleyp9IHNwZWNpZmllcnMgbWF5IG9jY3VyIGluIGEgZm9ybWF0IChzaW5jZSB0aGV5Ci1yZXF1aXJlIGEgc2VxdWVudGlhbCBwYXJhbWV0ZXIgbGlzdCkuCi0KLVRoZSBjb252ZXJzaW9uIGZsYWcgY2hhcmFjdGVycyBhcmU6Ci0KLVxiZWdpbnt0YWJsZWlpfXtjfGx9e2NoYXJhY3Rlcn17RmxhZ317TWVhbmluZ30KLSAgXGxpbmVpaXtcI317VGhlIHZhbHVlIGNvbnZlcnNpb24gd2lsbCB1c2UgdGhlIGBgYWx0ZXJuYXRlIGZvcm0nJwotICAgICAgICAgICAgICAod2hlcmUgZGVmaW5lZCBiZWxvdykufQotICBcbGluZWlpezB9e1RoZSBjb252ZXJzaW9uIHdpbGwgYmUgemVybyBwYWRkZWQgZm9yIG51bWVyaWMgdmFsdWVzLn0KLSAgXGxpbmVpaXstfXtUaGUgY29udmVydGVkIHZhbHVlIGlzIGxlZnQgYWRqdXN0ZWQgKG92ZXJyaWRlcwotICAgICAgICAgICAgIHRoZSBcY2hhcmFjdGVyezB9IGNvbnZlcnNpb24gaWYgYm90aCBhcmUgZ2l2ZW4pLn0KLSAgXGxpbmVpaXt7fn19eyhhIHNwYWNlKSBBIGJsYW5rIHNob3VsZCBiZSBsZWZ0IGJlZm9yZSBhIHBvc2l0aXZlIG51bWJlcgotICAgICAgICAgICAgIChvciBlbXB0eSBzdHJpbmcpIHByb2R1Y2VkIGJ5IGEgc2lnbmVkIGNvbnZlcnNpb24ufQotICBcbGluZWlpeyt9e0Egc2lnbiBjaGFyYWN0ZXIgKFxjaGFyYWN0ZXJ7K30gb3IgXGNoYXJhY3RlcnstfSkgd2lsbAotICAgICAgICAgICAgIHByZWNlZGUgdGhlIGNvbnZlcnNpb24gKG92ZXJyaWRlcyBhICJzcGFjZSIgZmxhZykufQotXGVuZHt0YWJsZWlpfQotCi1BIGxlbmd0aCBtb2RpZmllciAoXGNvZGV7aH0sIFxjb2Rle2x9LCBvciBcY29kZXtMfSkgbWF5IGJlCi1wcmVzZW50LCBidXQgaXMgaWdub3JlZCBhcyBpdCBpcyBub3QgbmVjZXNzYXJ5IGZvciBQeXRob24uCi0KLVRoZSBjb252ZXJzaW9uIHR5cGVzIGFyZToKLQotXGJlZ2lue3RhYmxlaWlpfXtjfGx8Y317Y2hhcmFjdGVyfXtDb252ZXJzaW9ufXtNZWFuaW5nfXtOb3Rlc30KLSAgXGxpbmVpaWl7ZH17U2lnbmVkIGludGVnZXIgZGVjaW1hbC59e30KLSAgXGxpbmVpaWl7aX17U2lnbmVkIGludGVnZXIgZGVjaW1hbC59e30KLSAgXGxpbmVpaWl7b317VW5zaWduZWQgb2N0YWwufXsoMSl9Ci0gIFxsaW5laWlpe3V9e1Vuc2lnbmVkIGRlY2ltYWwufXt9Ci0gIFxsaW5laWlpe3h9e1Vuc2lnbmVkIGhleGFkZWNpbWFsIChsb3dlcmNhc2UpLn17KDIpfQotICBcbGluZWlpaXtYfXtVbnNpZ25lZCBoZXhhZGVjaW1hbCAodXBwZXJjYXNlKS59eygyKX0KLSAgXGxpbmVpaWl7ZX17RmxvYXRpbmcgcG9pbnQgZXhwb25lbnRpYWwgZm9ybWF0IChsb3dlcmNhc2UpLn17KDMpfQotICBcbGluZWlpaXtFfXtGbG9hdGluZyBwb2ludCBleHBvbmVudGlhbCBmb3JtYXQgKHVwcGVyY2FzZSkufXsoMyl9Ci0gIFxsaW5laWlpe2Z9e0Zsb2F0aW5nIHBvaW50IGRlY2ltYWwgZm9ybWF0Ln17KDMpfQotICBcbGluZWlpaXtGfXtGbG9hdGluZyBwb2ludCBkZWNpbWFsIGZvcm1hdC59eygzKX0KLSAgXGxpbmVpaWl7Z317RmxvYXRpbmcgcG9pbnQgZm9ybWF0LiBVc2VzIGV4cG9uZW50aWFsIGZvcm1hdAotICAgICAgICAgICAgICBpZiBleHBvbmVudCBpcyBncmVhdGVyIHRoYW4gLTQgb3IgbGVzcyB0aGFuIHByZWNpc2lvbiwKLSAgICAgICAgICAgICAgZGVjaW1hbCBmb3JtYXQgb3RoZXJ3aXNlLn17KDQpfQotICBcbGluZWlpaXtHfXtGbG9hdGluZyBwb2ludCBmb3JtYXQuIFVzZXMgZXhwb25lbnRpYWwgZm9ybWF0Ci0gICAgICAgICAgICAgIGlmIGV4cG9uZW50IGlzIGdyZWF0ZXIgdGhhbiAtNCBvciBsZXNzIHRoYW4gcHJlY2lzaW9uLAotICAgICAgICAgICAgICBkZWNpbWFsIGZvcm1hdCBvdGhlcndpc2UufXsoNCl9Ci0gIFxsaW5laWlpe2N9e1NpbmdsZSBjaGFyYWN0ZXIgKGFjY2VwdHMgaW50ZWdlciBvciBzaW5nbGUgY2hhcmFjdGVyCi0gICAgICAgICAgICAgIHN0cmluZykufXt9Ci0gIFxsaW5laWlpe3J9e1N0cmluZyAoY29udmVydHMgYW55IHB5dGhvbiBvYmplY3QgdXNpbmcKLSAgICAgICAgICAgICAgXGZ1bmN0aW9ue3JlcHIoKX0pLn17KDUpfQotICBcbGluZWlpaXtzfXtTdHJpbmcgKGNvbnZlcnRzIGFueSBweXRob24gb2JqZWN0IHVzaW5nCi0gICAgICAgICAgICAgIFxmdW5jdGlvbntzdHIoKX0pLn17KDYpfQotICBcbGluZWlpaXtcJX17Tm8gYXJndW1lbnQgaXMgY29udmVydGVkLCByZXN1bHRzIGluIGEgXGNoYXJhY3RlcntcJX0KLSAgICAgICAgICAgICAgIGNoYXJhY3RlciBpbiB0aGUgcmVzdWx0Ln17fQotXGVuZHt0YWJsZWlpaX0KLQotXG5vaW5kZW50Ci1Ob3RlczoKLVxiZWdpbntkZXNjcmlwdGlvbn0KLSAgXGl0ZW1bKDEpXQotICAgIFRoZSBhbHRlcm5hdGUgZm9ybSBjYXVzZXMgYSBsZWFkaW5nIHplcm8gKFxjaGFyYWN0ZXJ7MH0pIHRvIGJlCi0gICAgaW5zZXJ0ZWQgYmV0d2VlbiBsZWZ0LWhhbmQgcGFkZGluZyBhbmQgdGhlIGZvcm1hdHRpbmcgb2YgdGhlCi0gICAgbnVtYmVyIGlmIHRoZSBsZWFkaW5nIGNoYXJhY3RlciBvZiB0aGUgcmVzdWx0IGlzIG5vdCBhbHJlYWR5IGEKLSAgICB6ZXJvLgotICBcaXRlbVsoMildCi0gICAgVGhlIGFsdGVybmF0ZSBmb3JtIGNhdXNlcyBhIGxlYWRpbmcgXGNvZGV7JzB4J30gb3IgXGNvZGV7JzBYJ30KLSAgICAoZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIFxjaGFyYWN0ZXJ7eH0gb3IgXGNoYXJhY3RlcntYfSBmb3JtYXQKLSAgICB3YXMgdXNlZCkgdG8gYmUgaW5zZXJ0ZWQgYmV0d2VlbiBsZWZ0LWhhbmQgcGFkZGluZyBhbmQgdGhlCi0gICAgZm9ybWF0dGluZyBvZiB0aGUgbnVtYmVyIGlmIHRoZSBsZWFkaW5nIGNoYXJhY3RlciBvZiB0aGUgcmVzdWx0IGlzCi0gICAgbm90IGFscmVhZHkgYSB6ZXJvLgotICBcaXRlbVsoMyldCi0gICAgVGhlIGFsdGVybmF0ZSBmb3JtIGNhdXNlcyB0aGUgcmVzdWx0IHRvIGFsd2F5cyBjb250YWluIGEgZGVjaW1hbAotICAgIHBvaW50LCBldmVuIGlmIG5vIGRpZ2l0cyBmb2xsb3cgaXQuCi0KLSAgICBUaGUgcHJlY2lzaW9uIGRldGVybWluZXMgdGhlIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwKLSAgICBwb2ludCBhbmQgZGVmYXVsdHMgdG8gNi4KLSAgXGl0ZW1bKDQpXQotICAgIFRoZSBhbHRlcm5hdGUgZm9ybSBjYXVzZXMgdGhlIHJlc3VsdCB0byBhbHdheXMgY29udGFpbiBhIGRlY2ltYWwKLSAgICBwb2ludCwgYW5kIHRyYWlsaW5nIHplcm9lcyBhcmUgbm90IHJlbW92ZWQgYXMgdGhleSB3b3VsZAotICAgIG90aGVyd2lzZSBiZS4KLQotICAgIFRoZSBwcmVjaXNpb24gZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGRpZ2l0cyBiZWZvcmUKLSAgICBhbmQgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQgYW5kIGRlZmF1bHRzIHRvIDYuCi0gIFxpdGVtWyg1KV0KLSAgICBUaGUgXGNvZGV7XCVyfSBjb252ZXJzaW9uIHdhcyBhZGRlZCBpbiBQeXRob24gMi4wLgotCi0gICAgVGhlIHByZWNpc2lvbiBkZXRlcm1pbmVzIHRoZSBtYXhpbWFsIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVzZWQuCi0gIFxpdGVtWyg2KV0KLSAgICBJZiB0aGUgb2JqZWN0IG9yIGZvcm1hdCBwcm92aWRlZCBpcyBhIFxjbGFzc3t1bmljb2RlfSBzdHJpbmcsCi0gICAgdGhlIHJlc3VsdGluZyBzdHJpbmcgd2lsbCBhbHNvIGJlIFxjbGFzc3t1bmljb2RlfS4KLQotICAgIFRoZSBwcmVjaXNpb24gZGV0ZXJtaW5lcyB0aGUgbWF4aW1hbCBudW1iZXIgb2YgY2hhcmFjdGVycyB1c2VkLgotXGVuZHtkZXNjcmlwdGlvbn0KLQotJSBYWFggRXhhbXBsZXM/Ci0KLVNpbmNlIFB5dGhvbiBzdHJpbmdzIGhhdmUgYW4gZXhwbGljaXQgbGVuZ3RoLCBcY29kZXtcJXN9IGNvbnZlcnNpb25zCi1kbyBub3QgYXNzdW1lIHRoYXQgXGNvZGV7J1xlMCd9IGlzIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KLQotRm9yIHNhZmV0eSByZWFzb25zLCBmbG9hdGluZyBwb2ludCBwcmVjaXNpb25zIGFyZSBjbGlwcGVkIHRvIDUwOwotXGNvZGV7XCVmfSBjb252ZXJzaW9ucyBmb3IgbnVtYmVycyB3aG9zZSBhYnNvbHV0ZSB2YWx1ZSBpcyBvdmVyIDFlMjUKLWFyZSByZXBsYWNlZCBieSBcY29kZXtcJWd9IGNvbnZlcnNpb25zLlxmb290bm90ZXsKLSAgVGhlc2UgbnVtYmVycyBhcmUgZmFpcmx5IGFyYml0cmFyeS4gIFRoZXkgYXJlIGludGVuZGVkIHRvCi0gIGF2b2lkIHByaW50aW5nIGVuZGxlc3Mgc3RyaW5ncyBvZiBtZWFuaW5nbGVzcyBkaWdpdHMgd2l0aG91dCBoYW1wZXJpbmcKLSAgY29ycmVjdCB1c2UgYW5kIHdpdGhvdXQgaGF2aW5nIHRvIGtub3cgdGhlIGV4YWN0IHByZWNpc2lvbiBvZiBmbG9hdGluZwotICBwb2ludCB2YWx1ZXMgb24gYSBwYXJ0aWN1bGFyIG1hY2hpbmUuCi19ICBBbGwgb3RoZXIgZXJyb3JzIHJhaXNlIGV4Y2VwdGlvbnMuCi0KLUFkZGl0aW9uYWwgc3RyaW5nIG9wZXJhdGlvbnMgYXJlIGRlZmluZWQgaW4gc3RhbmRhcmQgbW9kdWxlcwotXHJlZm1vZHVsZXtzdHJpbmd9XHJlZnN0bW9kaW5kZXh7c3RyaW5nfVwgYW5kCi1ccmVmbW9kdWxle3JlfS5ccmVmc3Rtb2RpbmRleHtyZX0KLQotCi1cc3Vic2VjdGlvbntYUmFuZ2UgVHlwZSBcbGFiZWx7dHlwZXNzZXEtcmFuZ2V9fQotCi1UaGUgXGNsYXNze3JhbmdlfVxvYmluZGV4e3JhbmdlfSB0eXBlIGlzIGFuIGltbXV0YWJsZSBzZXF1ZW5jZSB3aGljaAotaXMgY29tbW9ubHkgdXNlZCBmb3IgbG9vcGluZy4gIFRoZSBhZHZhbnRhZ2Ugb2YgdGhlIFxjbGFzc3tyYW5nZX0KLXR5cGUgaXMgdGhhdCBhbiBcY2xhc3N7cmFuZ2V9IG9iamVjdCB3aWxsIGFsd2F5cyB0YWtlIHRoZSBzYW1lIGFtb3VudAotb2YgbWVtb3J5LCBubyBtYXR0ZXIgdGhlIHNpemUgb2YgdGhlIHJhbmdlIGl0IHJlcHJlc2VudHMuICBUaGVyZSBhcmUKLW5vIGNvbnNpc3RlbnQgcGVyZm9ybWFuY2UgYWR2YW50YWdlcy4KLQotWFJhbmdlIG9iamVjdHMgaGF2ZSB2ZXJ5IGxpdHRsZSBiZWhhdmlvcjogdGhleSBvbmx5IHN1cHBvcnQgaW5kZXhpbmcsCi1pdGVyYXRpb24sIGFuZCB0aGUgXGZ1bmN0aW9ue2xlbigpfSBmdW5jdGlvbi4KLQotCi1cc3Vic2VjdGlvbntNdXRhYmxlIFNlcXVlbmNlIFR5cGVzIFxsYWJlbHt0eXBlc3NlcS1tdXRhYmxlfX0KLQotTGlzdCBvYmplY3RzIHN1cHBvcnQgYWRkaXRpb25hbCBvcGVyYXRpb25zIHRoYXQgYWxsb3cgaW4tcGxhY2UKLW1vZGlmaWNhdGlvbiBvZiB0aGUgb2JqZWN0LgotT3RoZXIgbXV0YWJsZSBzZXF1ZW5jZSB0eXBlcyAod2hlbiBhZGRlZCB0byB0aGUgbGFuZ3VhZ2UpIHNob3VsZAotYWxzbyBzdXBwb3J0IHRoZXNlIG9wZXJhdGlvbnMuCi1TdHJpbmdzIGFuZCB0dXBsZXMgYXJlIGltbXV0YWJsZSBzZXF1ZW5jZSB0eXBlczogc3VjaCBvYmplY3RzIGNhbm5vdAotYmUgbW9kaWZpZWQgb25jZSBjcmVhdGVkLgotVGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIGFyZSBkZWZpbmVkIG9uIG11dGFibGUgc2VxdWVuY2UgdHlwZXMgKHdoZXJlCi1cdmFye3h9IGlzIGFuIGFyYml0cmFyeSBvYmplY3QpOgotXGluZGV4aWlpe211dGFibGV9e3NlcXVlbmNlfXt0eXBlc30KLVxvYmluZGV4e2xpc3R9Ci0KLVxiZWdpbnt0YWJsZWlpaX17Y3xsfGN9e2NvZGV9e09wZXJhdGlvbn17UmVzdWx0fXtOb3Rlc30KLSAgXGxpbmVpaWl7XHZhcntzfVtcdmFye2l9XSA9IFx2YXJ7eH19Ci0Je2l0ZW0gXHZhcntpfSBvZiBcdmFye3N9IGlzIHJlcGxhY2VkIGJ5IFx2YXJ7eH19e30KLSAgXGxpbmVpaWl7XHZhcntzfVtcdmFye2l9Olx2YXJ7an1dID0gXHZhcnt0fX0KLSAgCXtzbGljZSBvZiBcdmFye3N9IGZyb20gXHZhcntpfSB0byBcdmFye2p9IAotICAgICAgICAgaXMgcmVwbGFjZWQgYnkgdGhlIGNvbnRlbnRzIG9mIHRoZSBpdGVyYWJsZSBcdmFye3R9fXt9Ci0gIFxsaW5laWlpe2RlbCBcdmFye3N9W1x2YXJ7aX06XHZhcntqfV19Ci0Je3NhbWUgYXMgXGNvZGV7XHZhcntzfVtcdmFye2l9Olx2YXJ7an1dID0gW119fXt9Ci0gIFxsaW5laWlpe1x2YXJ7c31bXHZhcntpfTpcdmFye2p9Olx2YXJ7a31dID0gXHZhcnt0fX0KLSAgCXt0aGUgZWxlbWVudHMgb2YgXGNvZGV7XHZhcntzfVtcdmFye2l9Olx2YXJ7an06XHZhcntrfV19IGFyZSByZXBsYWNlZCBieSB0aG9zZSBvZiBcdmFye3R9fXsoMSl9Ci0gIFxsaW5laWlpe2RlbCBcdmFye3N9W1x2YXJ7aX06XHZhcntqfTpcdmFye2t9XX0KLQl7cmVtb3ZlcyB0aGUgZWxlbWVudHMgb2YgXGNvZGV7XHZhcntzfVtcdmFye2l9Olx2YXJ7an06XHZhcntrfV19IGZyb20gdGhlIGxpc3R9e30KLSAgXGxpbmVpaWl7XHZhcntzfS5hcHBlbmQoXHZhcnt4fSl9Ci0Je3NhbWUgYXMgXGNvZGV7XHZhcntzfVtsZW4oXHZhcntzfSk6bGVuKFx2YXJ7c30pXSA9IFtcdmFye3h9XX19eygyKX0KLSAgXGxpbmVpaWl7XHZhcntzfS5leHRlbmQoXHZhcnt4fSl9Ci0gICAgICAgIHtzYW1lIGFzIFxjb2Rle1x2YXJ7c31bbGVuKFx2YXJ7c30pOmxlbihcdmFye3N9KV0gPSBcdmFye3h9fX17KDMpfQotICBcbGluZWlpaXtcdmFye3N9LmNvdW50KFx2YXJ7eH0pfQotICAgIHtyZXR1cm4gbnVtYmVyIG9mIFx2YXJ7aX0ncyBmb3Igd2hpY2ggXGNvZGV7XHZhcntzfVtcdmFye2l9XSA9PSBcdmFye3h9fX17fQotICBcbGluZWlpaXtcdmFye3N9LmluZGV4KFx2YXJ7eH1cb3B0aW9uYWx7LCBcdmFye2l9XG9wdGlvbmFseywgXHZhcntqfX19KX0KLSAgICB7cmV0dXJuIHNtYWxsZXN0IFx2YXJ7a30gc3VjaCB0aGF0IFxjb2Rle1x2YXJ7c31bXHZhcntrfV0gPT0gXHZhcnt4fX0gYW5kCi0gICAgXGNvZGV7XHZhcntpfSA8PSBcdmFye2t9IDwgXHZhcntqfX19eyg0KX0KLSAgXGxpbmVpaWl7XHZhcntzfS5pbnNlcnQoXHZhcntpfSwgXHZhcnt4fSl9Ci0Je3NhbWUgYXMgXGNvZGV7XHZhcntzfVtcdmFye2l9Olx2YXJ7aX1dID0gW1x2YXJ7eH1dfX17KDUpfQotICBcbGluZWlpaXtcdmFye3N9LnBvcChcb3B0aW9uYWx7XHZhcntpfX0pfQotICAgIHtzYW1lIGFzIFxjb2Rle1x2YXJ7eH0gPSBcdmFye3N9W1x2YXJ7aX1dOyBkZWwgXHZhcntzfVtcdmFye2l9XTsgcmV0dXJuIFx2YXJ7eH19fXsoNil9Ci0gIFxsaW5laWlpe1x2YXJ7c30ucmVtb3ZlKFx2YXJ7eH0pfQotCXtzYW1lIGFzIFxjb2Rle2RlbCBcdmFye3N9W1x2YXJ7c30uaW5kZXgoXHZhcnt4fSldfX17KDQpfQotICBcbGluZWlpaXtcdmFye3N9LnJldmVyc2UoKX0KLQl7cmV2ZXJzZXMgdGhlIGl0ZW1zIG9mIFx2YXJ7c30gaW4gcGxhY2V9eyg3KX0KLSAgXGxpbmVpaWl7XHZhcntzfS5zb3J0KFxvcHRpb25hbHtcdmFye2NtcH1cb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgXHZhcntrZXl9XG9wdGlvbmFseywgXHZhcntyZXZlcnNlfX19fSl9Ci0Je3NvcnQgdGhlIGl0ZW1zIG9mIFx2YXJ7c30gaW4gcGxhY2V9eyg3KSwgKDgpLCAoOSksICgxMCl9Ci1cZW5ke3RhYmxlaWlpfQotXGluZGV4aXZ7b3BlcmF0aW9ucyBvbn17bXV0YWJsZX17c2VxdWVuY2V9e3R5cGVzfQotXGluZGV4aWlpe29wZXJhdGlvbnMgb259e3NlcXVlbmNlfXt0eXBlc30KLVxpbmRleGlpaXtvcGVyYXRpb25zIG9ufXtsaXN0fXt0eXBlfQotXGluZGV4aWl7c3Vic2NyaXB0fXthc3NpZ25tZW50fQotXGluZGV4aWl7c2xpY2V9e2Fzc2lnbm1lbnR9Ci1caW5kZXhpaXtleHRlbmRlZCBzbGljZX17YXNzaWdubWVudH0KLVxzdGluZGV4e2RlbH0KLVx3aXRoc3ViaXRlbXsobGlzdCBtZXRob2QpfXsKLSAgXHR0aW5kZXh7YXBwZW5kKCl9XHR0aW5kZXh7ZXh0ZW5kKCl9XHR0aW5kZXh7Y291bnQoKX1cdHRpbmRleHtpbmRleCgpfQotICBcdHRpbmRleHtpbnNlcnQoKX1cdHRpbmRleHtwb3AoKX1cdHRpbmRleHtyZW1vdmUoKX1cdHRpbmRleHtyZXZlcnNlKCl9Ci0gIFx0dGluZGV4e3NvcnQoKX19Ci1cbm9pbmRlbnQKLU5vdGVzOgotXGJlZ2lue2Rlc2NyaXB0aW9ufQotXGl0ZW1bKDEpXSBcdmFye3R9IG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNsaWNlIGl0IGlzIAotICByZXBsYWNpbmcuCi0KLVxpdGVtWygyKV0gVGhlIEMgaW1wbGVtZW50YXRpb24gb2YgUHl0aG9uIGhhcyBoaXN0b3JpY2FsbHkgYWNjZXB0ZWQKLSAgbXVsdGlwbGUgcGFyYW1ldGVycyBhbmQgaW1wbGljaXRseSBqb2luZWQgdGhlbSBpbnRvIGEgdHVwbGU7IHRoaXMKLSAgbm8gbG9uZ2VyIHdvcmtzIGluIFB5dGhvbiAyLjAuICBVc2Ugb2YgdGhpcyBtaXNmZWF0dXJlIGhhcyBiZWVuCi0gIGRlcHJlY2F0ZWQgc2luY2UgUHl0aG9uIDEuNC4KLQotXGl0ZW1bKDMpXSBcdmFye3h9IGNhbiBiZSBhbnkgaXRlcmFibGUgb2JqZWN0LgotCi1caXRlbVsoNCldIFJhaXNlcyBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IHdoZW4gXHZhcnt4fSBpcyBub3QgZm91bmQgaW4KLSAgXHZhcntzfS4gV2hlbiBhIG5lZ2F0aXZlIGluZGV4IGlzIHBhc3NlZCBhcyB0aGUgc2Vjb25kIG9yIHRoaXJkIHBhcmFtZXRlcgotICB0byB0aGUgXG1ldGhvZHtpbmRleCgpfSBtZXRob2QsIHRoZSBsaXN0IGxlbmd0aCBpcyBhZGRlZCwgYXMgZm9yIHNsaWNlCi0gIGluZGljZXMuICBJZiBpdCBpcyBzdGlsbCBuZWdhdGl2ZSwgaXQgaXMgdHJ1bmNhdGVkIHRvIHplcm8sIGFzIGZvcgotICBzbGljZSBpbmRpY2VzLiAgXHZlcnNpb25jaGFuZ2VkW1ByZXZpb3VzbHksIFxtZXRob2R7aW5kZXgoKX0gZGlkbid0Ci0gIGhhdmUgYXJndW1lbnRzIGZvciBzcGVjaWZ5aW5nIHN0YXJ0IGFuZCBzdG9wIHBvc2l0aW9uc117Mi4zfQotCi1caXRlbVsoNSldIFdoZW4gYSBuZWdhdGl2ZSBpbmRleCBpcyBwYXNzZWQgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciB0bwotICB0aGUgXG1ldGhvZHtpbnNlcnQoKX0gbWV0aG9kLCB0aGUgbGlzdCBsZW5ndGggaXMgYWRkZWQsIGFzIGZvciBzbGljZQotICBpbmRpY2VzLiAgSWYgaXQgaXMgc3RpbGwgbmVnYXRpdmUsIGl0IGlzIHRydW5jYXRlZCB0byB6ZXJvLCBhcyBmb3IKLSAgc2xpY2UgaW5kaWNlcy4gIFx2ZXJzaW9uY2hhbmdlZFtQcmV2aW91c2x5LCBhbGwgbmVnYXRpdmUgaW5kaWNlcwotICB3ZXJlIHRydW5jYXRlZCB0byB6ZXJvXXsyLjN9Ci0KLVxpdGVtWyg2KV0gVGhlIFxtZXRob2R7cG9wKCl9IG1ldGhvZCBpcyBvbmx5IHN1cHBvcnRlZCBieSB0aGUgbGlzdCBhbmQKLSAgYXJyYXkgdHlwZXMuICBUaGUgb3B0aW9uYWwgYXJndW1lbnQgXHZhcntpfSBkZWZhdWx0cyB0byBcY29kZXstMX0sCi0gIHNvIHRoYXQgYnkgZGVmYXVsdCB0aGUgbGFzdCBpdGVtIGlzIHJlbW92ZWQgYW5kIHJldHVybmVkLgotCi1caXRlbVsoNyldIFRoZSBcbWV0aG9ke3NvcnQoKX0gYW5kIFxtZXRob2R7cmV2ZXJzZSgpfSBtZXRob2RzIG1vZGlmeSB0aGUKLSAgbGlzdCBpbiBwbGFjZSBmb3IgZWNvbm9teSBvZiBzcGFjZSB3aGVuIHNvcnRpbmcgb3IgcmV2ZXJzaW5nIGEgbGFyZ2UKLSAgbGlzdC4gIFRvIHJlbWluZCB5b3UgdGhhdCB0aGV5IG9wZXJhdGUgYnkgc2lkZSBlZmZlY3QsIHRoZXkgZG9uJ3QgcmV0dXJuCi0gIHRoZSBzb3J0ZWQgb3IgcmV2ZXJzZWQgbGlzdC4KLQotXGl0ZW1bKDgpXSBUaGUgXG1ldGhvZHtzb3J0KCl9IG1ldGhvZCB0YWtlcyBvcHRpb25hbCBhcmd1bWVudHMgZm9yCi0gIGNvbnRyb2xsaW5nIHRoZSBjb21wYXJpc29ucy4KLQotICBcdmFye2NtcH0gc3BlY2lmaWVzIGEgY3VzdG9tIGNvbXBhcmlzb24gZnVuY3Rpb24gb2YgdHdvIGFyZ3VtZW50cwotICAgICAobGlzdCBpdGVtcykgd2hpY2ggc2hvdWxkIHJldHVybiBhIG5lZ2F0aXZlLCB6ZXJvIG9yIHBvc2l0aXZlIG51bWJlcgotICAgICBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgZmlyc3QgYXJndW1lbnQgaXMgY29uc2lkZXJlZCBzbWFsbGVyIHRoYW4sCi0gICAgIGVxdWFsIHRvLCBvciBsYXJnZXIgdGhhbiB0aGUgc2Vjb25kIGFyZ3VtZW50OgotICAgICBcc2FtcHtcdmFye2NtcH09XGtleXdvcmR7bGFtYmRhfSBcdmFye3h9LFx2YXJ7eX06Ci0gICAgIFxmdW5jdGlvbntjbXB9KHgubG93ZXIoKSwgeS5sb3dlcigpKX0KLSAgICAgCi0gIFx2YXJ7a2V5fSBzcGVjaWZpZXMgYSBmdW5jdGlvbiBvZiBvbmUgYXJndW1lbnQgdGhhdCBpcyB1c2VkIHRvCi0gICAgIGV4dHJhY3QgYSBjb21wYXJpc29uIGtleSBmcm9tIGVhY2ggbGlzdCBlbGVtZW50OgotICAgICBcc2FtcHtcdmFye2tleX09XGZ1bmN0aW9ue3N0ci5sb3dlcn19Ci0KLSAgXHZhcntyZXZlcnNlfSBpcyBhIGJvb2xlYW4gdmFsdWUuICBJZiBzZXQgdG8gXGNvZGV7VHJ1ZX0sIHRoZW4gdGhlCi0gICAgIGxpc3QgZWxlbWVudHMgYXJlIHNvcnRlZCBhcyBpZiBlYWNoIGNvbXBhcmlzb24gd2VyZSByZXZlcnNlZC4KLQotICBJbiBnZW5lcmFsLCB0aGUgXHZhcntrZXl9IGFuZCBcdmFye3JldmVyc2V9IGNvbnZlcnNpb24gcHJvY2Vzc2VzIGFyZQotICBtdWNoIGZhc3RlciB0aGFuIHNwZWNpZnlpbmcgYW4gZXF1aXZhbGVudCBcdmFye2NtcH0gZnVuY3Rpb24uICBUaGlzIGlzCi0gIGJlY2F1c2UgXHZhcntjbXB9IGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgZWFjaCBsaXN0IGVsZW1lbnQgd2hpbGUKLSAgXHZhcntrZXl9IGFuZCBcdmFye3JldmVyc2V9IHRvdWNoIGVhY2ggZWxlbWVudCBvbmx5IG9uY2UuCi0KLSAgXHZlcnNpb25jaGFuZ2VkW1N1cHBvcnQgZm9yIFxjb2Rle05vbmV9IGFzIGFuIGVxdWl2YWxlbnQgdG8gb21pdHRpbmcKLSAgXHZhcntjbXB9IHdhcyBhZGRlZF17Mi4zfQotCi0gIFx2ZXJzaW9uY2hhbmdlZFtTdXBwb3J0IGZvciBcdmFye2tleX0gYW5kIFx2YXJ7cmV2ZXJzZX0gd2FzIGFkZGVkXXsyLjR9Ci0KLVxpdGVtWyg5KV0gU3RhcnRpbmcgd2l0aCBQeXRob24gMi4zLCB0aGUgXG1ldGhvZHtzb3J0KCl9IG1ldGhvZCBpcwotICBndWFyYW50ZWVkIHRvIGJlIHN0YWJsZS4gIEEgc29ydCBpcyBzdGFibGUgaWYgaXQgZ3VhcmFudGVlcyBub3QgdG8KLSAgY2hhbmdlIHRoZSByZWxhdGl2ZSBvcmRlciBvZiBlbGVtZW50cyB0aGF0IGNvbXBhcmUgZXF1YWwgLS0tIHRoaXMgaXMKLSAgaGVscGZ1bCBmb3Igc29ydGluZyBpbiBtdWx0aXBsZSBwYXNzZXMgKGZvciBleGFtcGxlLCBzb3J0IGJ5Ci0gIGRlcGFydG1lbnQsIHRoZW4gYnkgc2FsYXJ5IGdyYWRlKS4KLQotXGl0ZW1bKDEwKV0gV2hpbGUgYSBsaXN0IGlzIGJlaW5nIHNvcnRlZCwgdGhlIGVmZmVjdCBvZiBhdHRlbXB0aW5nIHRvCi0gIG11dGF0ZSwgb3IgZXZlbiBpbnNwZWN0LCB0aGUgbGlzdCBpcyB1bmRlZmluZWQuICBUaGUgQwotICBpbXBsZW1lbnRhdGlvbiBvZiBQeXRob24gMi4zIGFuZCBuZXdlciBtYWtlcyB0aGUgbGlzdCBhcHBlYXIgZW1wdHkKLSAgZm9yIHRoZSBkdXJhdGlvbiwgYW5kIHJhaXNlcyBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IGlmIGl0IGNhbiBkZXRlY3QKLSAgdGhhdCB0aGUgbGlzdCBoYXMgYmVlbiBtdXRhdGVkIGR1cmluZyBhIHNvcnQuCi1cZW5ke2Rlc2NyaXB0aW9ufQotCi1cc2VjdGlvbntTZXQgVHlwZXMgLS0tCi0JICAgIFxjbGFzc3tzZXR9LCBcY2xhc3N7ZnJvemVuc2V0fQotCSAgICBcbGFiZWx7dHlwZXMtc2V0fX0KLVxvYmluZGV4e3NldH0KLQotQSBcZGZue3NldH0gb2JqZWN0IGlzIGFuIHVub3JkZXJlZCBjb2xsZWN0aW9uIG9mIGRpc3RpbmN0IGhhc2hhYmxlIG9iamVjdHMuCi1Db21tb24gdXNlcyBpbmNsdWRlIG1lbWJlcnNoaXAgdGVzdGluZywgcmVtb3ZpbmcgZHVwbGljYXRlcyBmcm9tIGEgc2VxdWVuY2UsCi1hbmQgY29tcHV0aW5nIG1hdGhlbWF0aWNhbCBvcGVyYXRpb25zIHN1Y2ggYXMgaW50ZXJzZWN0aW9uLCB1bmlvbiwgZGlmZmVyZW5jZSwKLWFuZCBzeW1tZXRyaWMgZGlmZmVyZW5jZS4KLVx2ZXJzaW9uYWRkZWR7Mi40fSAgICAgCi0KLUxpa2Ugb3RoZXIgY29sbGVjdGlvbnMsIHNldHMgc3VwcG9ydCBcY29kZXtcdmFye3h9IGluIFx2YXJ7c2V0fX0sCi1cY29kZXtsZW4oXHZhcntzZXR9KX0sIGFuZCBcY29kZXtmb3IgXHZhcnt4fSBpbiBcdmFye3NldH19LiAgQmVpbmcgYW4KLXVub3JkZXJlZCBjb2xsZWN0aW9uLCBzZXRzIGRvIG5vdCByZWNvcmQgZWxlbWVudCBwb3NpdGlvbiBvciBvcmRlciBvZgotaW5zZXJ0aW9uLiAgQWNjb3JkaW5nbHksIHNldHMgZG8gbm90IHN1cHBvcnQgaW5kZXhpbmcsIHNsaWNpbmcsIG9yCi1vdGhlciBzZXF1ZW5jZS1saWtlIGJlaGF2aW9yLiAgICAgCi0KLVRoZXJlIGFyZSBjdXJyZW50bHkgdHdvIGJ1aWx0aW4gc2V0IHR5cGVzLCBcY2xhc3N7c2V0fSBhbmQgXGNsYXNze2Zyb3plbnNldH0uCi1UaGUgXGNsYXNze3NldH0gdHlwZSBpcyBtdXRhYmxlIC0tLSB0aGUgY29udGVudHMgY2FuIGJlIGNoYW5nZWQgdXNpbmcgbWV0aG9kcwotbGlrZSBcbWV0aG9ke2FkZCgpfSBhbmQgXG1ldGhvZHtyZW1vdmUoKX0uICBTaW5jZSBpdCBpcyBtdXRhYmxlLCBpdCBoYXMgbm8KLWhhc2ggdmFsdWUgYW5kIGNhbm5vdCBiZSB1c2VkIGFzIGVpdGhlciBhIGRpY3Rpb25hcnkga2V5IG9yIGFzIGFuIGVsZW1lbnQgb2YKLWFub3RoZXIgc2V0LiAgVGhlIFxjbGFzc3tmcm96ZW5zZXR9IHR5cGUgaXMgaW1tdXRhYmxlIGFuZCBoYXNoYWJsZSAtLS0gaXRzCi1jb250ZW50cyBjYW5ub3QgYmUgYWx0ZXJlZCBhZnRlciBpcyBjcmVhdGVkOyBob3dldmVyLCBpdCBjYW4gYmUgdXNlZCBhcwotYSBkaWN0aW9uYXJ5IGtleSBvciBhcyBhbiBlbGVtZW50IG9mIGFub3RoZXIgc2V0LgotCi1JbnN0YW5jZXMgb2YgXGNsYXNze3NldH0gYW5kIFxjbGFzc3tmcm96ZW5zZXR9IHByb3ZpZGUgdGhlIGZvbGxvd2luZyBvcGVyYXRpb25zOgotCi1cYmVnaW57dGFibGVpaWl9e2N8Y3xsfXtjb2RlfXtPcGVyYXRpb259e0VxdWl2YWxlbnR9e1Jlc3VsdH0KLSAgXGxpbmVpaWl7bGVuKFx2YXJ7c30pfXt9e2NhcmRpbmFsaXR5IG9mIHNldCBcdmFye3N9fQotCi0gIFxobGluZQotICBcbGluZWlpaXtcdmFye3h9IGluIFx2YXJ7c319e30KLSAgICAgICAgIHt0ZXN0IFx2YXJ7eH0gZm9yIG1lbWJlcnNoaXAgaW4gXHZhcntzfX0KLSAgXGxpbmVpaWl7XHZhcnt4fSBub3QgaW4gXHZhcntzfX17fQotICAgICAgICAge3Rlc3QgXHZhcnt4fSBmb3Igbm9uLW1lbWJlcnNoaXAgaW4gXHZhcntzfX0KLSAgXGxpbmVpaWl7XHZhcntzfS5pc3N1YnNldChcdmFye3R9KX17XGNvZGV7XHZhcntzfSA8PSBcdmFye3R9fX0KLSAgICAgICAgIHt0ZXN0IHdoZXRoZXIgZXZlcnkgZWxlbWVudCBpbiBcdmFye3N9IGlzIGluIFx2YXJ7dH19Ci0gIFxsaW5laWlpe1x2YXJ7c30uaXNzdXBlcnNldChcdmFye3R9KX17XGNvZGV7XHZhcntzfSA+PSBcdmFye3R9fX0KLSAgICAgICAgIHt0ZXN0IHdoZXRoZXIgZXZlcnkgZWxlbWVudCBpbiBcdmFye3R9IGlzIGluIFx2YXJ7c319Ci0KLSAgXGhsaW5lCi0gIFxsaW5laWlpe1x2YXJ7c30udW5pb24oXHZhcnt0fSl9e1x2YXJ7c30gfCBcdmFye3R9fQotICAgICAgICAge25ldyBzZXQgd2l0aCBlbGVtZW50cyBmcm9tIGJvdGggXHZhcntzfSBhbmQgXHZhcnt0fX0KLSAgXGxpbmVpaWl7XHZhcntzfS5pbnRlcnNlY3Rpb24oXHZhcnt0fSl9e1x2YXJ7c30gXCZcIFx2YXJ7dH19Ci0gICAgICAgICB7bmV3IHNldCB3aXRoIGVsZW1lbnRzIGNvbW1vbiB0byBcdmFye3N9IGFuZCBcdmFye3R9fQotICBcbGluZWlpaXtcdmFye3N9LmRpZmZlcmVuY2UoXHZhcnt0fSl9e1x2YXJ7c30gLSBcdmFye3R9fQotICAgICAgICAge25ldyBzZXQgd2l0aCBlbGVtZW50cyBpbiBcdmFye3N9IGJ1dCBub3QgaW4gXHZhcnt0fX0KLSAgXGxpbmVpaWl7XHZhcntzfS5zeW1tZXRyaWNfZGlmZmVyZW5jZShcdmFye3R9KX17XHZhcntzfSBcXlwgXHZhcnt0fX0KLSAgICAgICAgIHtuZXcgc2V0IHdpdGggZWxlbWVudHMgaW4gZWl0aGVyIFx2YXJ7c30gb3IgXHZhcnt0fSBidXQgbm90IGJvdGh9Ci0gIFxsaW5laWlpe1x2YXJ7c30uY29weSgpfXt9Ci0gICAgICAgICB7bmV3IHNldCB3aXRoIGEgc2hhbGxvdyBjb3B5IG9mIFx2YXJ7c319Ci1cZW5ke3RhYmxlaWlpfQotCi1Ob3RlLCB0aGUgbm9uLW9wZXJhdG9yIHZlcnNpb25zIG9mIFxtZXRob2R7dW5pb24oKX0sIFxtZXRob2R7aW50ZXJzZWN0aW9uKCl9LAotXG1ldGhvZHtkaWZmZXJlbmNlKCl9LCBhbmQgXG1ldGhvZHtzeW1tZXRyaWNfZGlmZmVyZW5jZSgpfSwKLVxtZXRob2R7aXNzdWJzZXQoKX0sIGFuZCBcbWV0aG9ke2lzc3VwZXJzZXQoKX0gbWV0aG9kcyB3aWxsIGFjY2VwdCBhbnkKLWl0ZXJhYmxlIGFzIGFuIGFyZ3VtZW50LiAgSW4gY29udHJhc3QsIHRoZWlyIG9wZXJhdG9yIGJhc2VkIGNvdW50ZXJwYXJ0cwotcmVxdWlyZSB0aGVpciBhcmd1bWVudHMgdG8gYmUgc2V0cy4gIFRoaXMgcHJlY2x1ZGVzIGVycm9yLXByb25lIGNvbnN0cnVjdGlvbnMKLWxpa2UgXGNvZGV7c2V0KCdhYmMnKSBcJlwgJ2Nicyd9IGluIGZhdm9yIG9mIHRoZSBtb3JlIHJlYWRhYmxlCi1cY29kZXtzZXQoJ2FiYycpLmludGVyc2VjdGlvbignY2JzJyl9LgotCi1Cb3RoIFxjbGFzc3tzZXR9IGFuZCBcY2xhc3N7ZnJvemVuc2V0fSBzdXBwb3J0IHNldCB0byBzZXQgY29tcGFyaXNvbnMuCi1Ud28gc2V0cyBhcmUgZXF1YWwgaWYgYW5kIG9ubHkgaWYgZXZlcnkgZWxlbWVudCBvZiBlYWNoIHNldCBpcyBjb250YWluZWQgaW4KLXRoZSBvdGhlciAoZWFjaCBpcyBhIHN1YnNldCBvZiB0aGUgb3RoZXIpLgotQSBzZXQgaXMgbGVzcyB0aGFuIGFub3RoZXIgc2V0IGlmIGFuZCBvbmx5IGlmIHRoZSBmaXJzdCBzZXQgaXMgYSBwcm9wZXIKLXN1YnNldCBvZiB0aGUgc2Vjb25kIHNldCAoaXMgYSBzdWJzZXQsIGJ1dCBpcyBub3QgZXF1YWwpLgotQSBzZXQgaXMgZ3JlYXRlciB0aGFuIGFub3RoZXIgc2V0IGlmIGFuZCBvbmx5IGlmIHRoZSBmaXJzdCBzZXQgaXMgYSBwcm9wZXIKLXN1cGVyc2V0IG9mIHRoZSBzZWNvbmQgc2V0IChpcyBhIHN1cGVyc2V0LCBidXQgaXMgbm90IGVxdWFsKS4KLQotSW5zdGFuY2VzIG9mIFxjbGFzc3tzZXR9IGFyZSBjb21wYXJlZCB0byBpbnN0YW5jZXMgb2YgXGNsYXNze2Zyb3plbnNldH0gYmFzZWQKLW9uIHRoZWlyIG1lbWJlcnMuICBGb3IgZXhhbXBsZSwgXHNhbXB7c2V0KCdhYmMnKSA9PSBmcm96ZW5zZXQoJ2FiYycpfSByZXR1cm5zCi1cY29kZXtUcnVlfS4gICAgIAotCi1UaGUgc3Vic2V0IGFuZCBlcXVhbGl0eSBjb21wYXJpc29ucyBkbyBub3QgZ2VuZXJhbGl6ZSB0byBhIGNvbXBsZXRlCi1vcmRlcmluZyBmdW5jdGlvbi4gIEZvciBleGFtcGxlLCBhbnkgdHdvIGRpc2pvaW50IHNldHMgYXJlIG5vdCBlcXVhbCBhbmQKLWFyZSBub3Qgc3Vic2V0cyBvZiBlYWNoIG90aGVyLCBzbyBcZW1waHthbGx9IG9mIHRoZSBmb2xsb3dpbmcgcmV0dXJuCi1cY29kZXtGYWxzZX06ICBcY29kZXtcdmFye2F9PFx2YXJ7Yn19LCBcY29kZXtcdmFye2F9PT1cdmFye2J9fSwgb3IKLVxjb2Rle1x2YXJ7YX0+XHZhcntifX0uCi1BY2NvcmRpbmdseSwgc2V0cyBkbyBub3QgaW1wbGVtZW50IHRoZSBcbWV0aG9ke19fY21wX199IG1ldGhvZC4KLQotU2luY2Ugc2V0cyBvbmx5IGRlZmluZSBwYXJ0aWFsIG9yZGVyaW5nIChzdWJzZXQgcmVsYXRpb25zaGlwcyksIHRoZSBvdXRwdXQKLW9mIHRoZSBcbWV0aG9ke2xpc3Quc29ydCgpfSBtZXRob2QgaXMgdW5kZWZpbmVkIGZvciBsaXN0cyBvZiBzZXRzLgotCi1TZXQgZWxlbWVudHMgYXJlIGxpa2UgZGljdGlvbmFyeSBrZXlzOyB0aGV5IG5lZWQgdG8gZGVmaW5lIGJvdGgKLVxtZXRob2R7X19oYXNoX199IGFuZCBcbWV0aG9ke19fZXFfX30gbWV0aG9kcy4KLQotQmluYXJ5IG9wZXJhdGlvbnMgdGhhdCBtaXggXGNsYXNze3NldH0gaW5zdGFuY2VzIHdpdGggXGNsYXNze2Zyb3plbnNldH0KLXJldHVybiB0aGUgdHlwZSBvZiB0aGUgZmlyc3Qgb3BlcmFuZC4gIEZvciBleGFtcGxlOgotXHNhbXB7ZnJvemVuc2V0KCdhYicpIHwgc2V0KCdiYycpfSByZXR1cm5zIGFuIGluc3RhbmNlIG9mIFxjbGFzc3tmcm96ZW5zZXR9LgotCi1UaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzIG9wZXJhdGlvbnMgYXZhaWxhYmxlIGZvciBcY2xhc3N7c2V0fQotdGhhdCBkbyBub3QgYXBwbHkgdG8gaW1tdXRhYmxlIGluc3RhbmNlcyBvZiBcY2xhc3N7ZnJvemVuc2V0fToKLQotXGJlZ2lue3RhYmxlaWlpfXtjfGN8bH17Y29kZX17T3BlcmF0aW9ufXtFcXVpdmFsZW50fXtSZXN1bHR9Ci0gIFxsaW5laWlpe1x2YXJ7c30udXBkYXRlKFx2YXJ7dH0pfQotICAgICAgICAge1x2YXJ7c30gfD0gXHZhcnt0fX0KLSAgICAgICAgIHt1cGRhdGUgc2V0IFx2YXJ7c30sIGFkZGluZyBlbGVtZW50cyBmcm9tIFx2YXJ7dH19Ci0gIFxsaW5laWlpe1x2YXJ7c30uaW50ZXJzZWN0aW9uX3VwZGF0ZShcdmFye3R9KX0KLSAgICAgICAgIHtcdmFye3N9IFwmPSBcdmFye3R9fQotICAgICAgICAge3VwZGF0ZSBzZXQgXHZhcntzfSwga2VlcGluZyBvbmx5IGVsZW1lbnRzIGZvdW5kIGluIGJvdGggXHZhcntzfSBhbmQgXHZhcnt0fX0KLSAgXGxpbmVpaWl7XHZhcntzfS5kaWZmZXJlbmNlX3VwZGF0ZShcdmFye3R9KX0KLSAgICAgICAgIHtcdmFye3N9IC09IFx2YXJ7dH19Ci0gICAgICAgICB7dXBkYXRlIHNldCBcdmFye3N9LCByZW1vdmluZyBlbGVtZW50cyBmb3VuZCBpbiBcdmFye3R9fQotICBcbGluZWlpaXtcdmFye3N9LnN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZShcdmFye3R9KX0KLSAgICAgICAgIHtcdmFye3N9IFx0ZXh0YXNjaWljaXJjdW09IFx2YXJ7dH19Ci0gICAgICAgICB7dXBkYXRlIHNldCBcdmFye3N9LCBrZWVwaW5nIG9ubHkgZWxlbWVudHMgZm91bmQgaW4gZWl0aGVyIFx2YXJ7c30gb3IgXHZhcnt0fQotICAgICAgICAgIGJ1dCBub3QgaW4gYm90aH0KLQotICBcaGxpbmUKLSAgXGxpbmVpaWl7XHZhcntzfS5hZGQoXHZhcnt4fSl9e30KLSAgICAgICAgIHthZGQgZWxlbWVudCBcdmFye3h9IHRvIHNldCBcdmFye3N9fQotICBcbGluZWlpaXtcdmFye3N9LnJlbW92ZShcdmFye3h9KX17fQotICAgICAgICAge3JlbW92ZSBcdmFye3h9IGZyb20gc2V0IFx2YXJ7c307IHJhaXNlcyBcZXhjZXB0aW9ue0tleUVycm9yfQotCSAgaWYgbm90IHByZXNlbnR9Ci0gIFxsaW5laWlpe1x2YXJ7c30uZGlzY2FyZChcdmFye3h9KX17fQotICAgICAgICAge3JlbW92ZXMgXHZhcnt4fSBmcm9tIHNldCBcdmFye3N9IGlmIHByZXNlbnR9Ci0gIFxsaW5laWlpe1x2YXJ7c30ucG9wKCl9e30KLSAgICAgICAgIHtyZW1vdmUgYW5kIHJldHVybiBhbiBhcmJpdHJhcnkgZWxlbWVudCBmcm9tIFx2YXJ7c307IHJhaXNlcwotCSAgXGV4Y2VwdGlvbntLZXlFcnJvcn0gaWYgZW1wdHl9Ci0gIFxsaW5laWlpe1x2YXJ7c30uY2xlYXIoKX17fQotICAgICAgICAge3JlbW92ZSBhbGwgZWxlbWVudHMgZnJvbSBzZXQgXHZhcntzfX0KLVxlbmR7dGFibGVpaWl9Ci0KLU5vdGUsIHRoZSBub24tb3BlcmF0b3IgdmVyc2lvbnMgb2YgdGhlIFxtZXRob2R7dXBkYXRlKCl9LAotXG1ldGhvZHtpbnRlcnNlY3Rpb25fdXBkYXRlKCl9LCBcbWV0aG9ke2RpZmZlcmVuY2VfdXBkYXRlKCl9LCBhbmQKLVxtZXRob2R7c3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlKCl9IG1ldGhvZHMgd2lsbCBhY2NlcHQgYW55IGl0ZXJhYmxlCi1hcyBhbiBhcmd1bWVudC4KLSAgICAgCi0KLVxzZWN0aW9ue01hcHBpbmcgVHlwZXMgLS0tIFxjbGFzc3tkaWN0fSBcbGFiZWx7dHlwZXNtYXBwaW5nfX0KLVxvYmluZGV4e21hcHBpbmd9Ci1cb2JpbmRleHtkaWN0aW9uYXJ5fQotCi1BIFxkZm57bWFwcGluZ30gb2JqZWN0IG1hcHMgIGltbXV0YWJsZSB2YWx1ZXMgdG8KLWFyYml0cmFyeSBvYmplY3RzLiAgTWFwcGluZ3MgYXJlIG11dGFibGUgb2JqZWN0cy4gIFRoZXJlIGlzIGN1cnJlbnRseQotb25seSBvbmUgc3RhbmRhcmQgbWFwcGluZyB0eXBlLCB0aGUgXGRmbntkaWN0aW9uYXJ5fS4gIEEgZGljdGlvbmFyeSdzIGtleXMgYXJlCi1hbG1vc3QgYXJiaXRyYXJ5IHZhbHVlcy4gIE9ubHkgdmFsdWVzIGNvbnRhaW5pbmcgbGlzdHMsIGRpY3Rpb25hcmllcwotb3Igb3RoZXIgbXV0YWJsZSB0eXBlcyAodGhhdCBhcmUgY29tcGFyZWQgYnkgdmFsdWUgcmF0aGVyIHRoYW4gYnkKLW9iamVjdCBpZGVudGl0eSkgbWF5IG5vdCBiZSB1c2VkIGFzIGtleXMuCi1OdW1lcmljIHR5cGVzIHVzZWQgZm9yIGtleXMgb2JleSB0aGUgbm9ybWFsIHJ1bGVzIGZvciBudW1lcmljCi1jb21wYXJpc29uOiBpZiB0d28gbnVtYmVycyBjb21wYXJlIGVxdWFsIChzdWNoIGFzIFxjb2RlezF9IGFuZAotXGNvZGV7MS4wfSkgdGhlbiB0aGV5IGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB0byBpbmRleCB0aGUgc2FtZQotZGljdGlvbmFyeSBlbnRyeS4KLQotRGljdGlvbmFyaWVzIGFyZSBjcmVhdGVkIGJ5IHBsYWNpbmcgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZgotXGNvZGV7XHZhcntrZXl9OiBcdmFye3ZhbHVlfX0gcGFpcnMgd2l0aGluIGJyYWNlcywgZm9yIGV4YW1wbGU6Ci1cY29kZXtceydqYWNrJzogNDA5OCwgJ3Nqb2VyZCc6IDQxMjdcfX0gb3IKLVxjb2Rle1x7NDA5ODogJ2phY2snLCA0MTI3OiAnc2pvZXJkJ1x9fS4KLQotVGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIGFyZSBkZWZpbmVkIG9uIG1hcHBpbmdzICh3aGVyZSBcdmFye2F9IGFuZAotXHZhcntifSBhcmUgbWFwcGluZ3MsIFx2YXJ7a30gaXMgYSBrZXksIGFuZCBcdmFye3Z9IGFuZCBcdmFye3h9IGFyZQotYXJiaXRyYXJ5IG9iamVjdHMpOgotXGluZGV4aWlpe29wZXJhdGlvbnMgb259e21hcHBpbmd9e3R5cGVzfQotXGluZGV4aWlpe29wZXJhdGlvbnMgb259e2RpY3Rpb25hcnl9e3R5cGV9Ci1cc3RpbmRleHtkZWx9Ci1cYmlmdW5jaW5kZXh7bGVufQotXHdpdGhzdWJpdGVteyhkaWN0aW9uYXJ5IG1ldGhvZCl9ewotICBcdHRpbmRleHtjbGVhcigpfQotICBcdHRpbmRleHtjb3B5KCl9Ci0gIFx0dGluZGV4e2hhc19rZXkoKX0KLSAgXHR0aW5kZXh7ZnJvbWtleXMoKX0gICAgCi0gIFx0dGluZGV4e2l0ZW1zKCl9Ci0gIFx0dGluZGV4e2tleXMoKX0KLSAgXHR0aW5kZXh7dXBkYXRlKCl9Ci0gIFx0dGluZGV4e3ZhbHVlcygpfQotICBcdHRpbmRleHtnZXQoKX0KLSAgXHR0aW5kZXh7c2V0ZGVmYXVsdCgpfQotICBcdHRpbmRleHtwb3AoKX0KLSAgXHR0aW5kZXh7cG9waXRlbSgpfQotICBcdHRpbmRleHtpdGVyaXRlbXMoKX0KLSAgXHR0aW5kZXh7aXRlcmtleXMoKX0KLSAgXHR0aW5kZXh7aXRlcnZhbHVlcygpfX0KLQotXGJlZ2lue3RhYmxlaWlpfXtjfGx8Y317Y29kZX17T3BlcmF0aW9ufXtSZXN1bHR9e05vdGVzfQotICBcbGluZWlpaXtsZW4oXHZhcnthfSl9e3RoZSBudW1iZXIgb2YgaXRlbXMgaW4gXHZhcnthfX17fQotICBcbGluZWlpaXtcdmFye2F9W1x2YXJ7a31dfXt0aGUgaXRlbSBvZiBcdmFye2F9IHdpdGgga2V5IFx2YXJ7a319eygxKSwgKDEwKX0KLSAgXGxpbmVpaWl7XHZhcnthfVtcdmFye2t9XSA9IFx2YXJ7dn19Ci0gICAgICAgICAge3NldCBcY29kZXtcdmFye2F9W1x2YXJ7a31dfSB0byBcdmFye3Z9fQotICAgICAgICAgIHt9Ci0gIFxsaW5laWlpe2RlbCBcdmFye2F9W1x2YXJ7a31dfQotICAgICAgICAgIHtyZW1vdmUgXGNvZGV7XHZhcnthfVtcdmFye2t9XX0gZnJvbSBcdmFye2F9fQotICAgICAgICAgIHsoMSl9Ci0gIFxsaW5laWlpe1x2YXJ7YX0uY2xlYXIoKX17cmVtb3ZlIGFsbCBpdGVtcyBmcm9tIFxjb2Rle2F9fXt9Ci0gIFxsaW5laWlpe1x2YXJ7YX0uY29weSgpfXthIChzaGFsbG93KSBjb3B5IG9mIFxjb2Rle2F9fXt9Ci0gIFxsaW5laWlpe1x2YXJ7a30gaW4gXHZhcnthfX0KLSAgICAgICAgICB7XGNvZGV7VHJ1ZX0gaWYgXHZhcnthfSBoYXMgYSBrZXkgXHZhcntrfSwgZWxzZSBcY29kZXtGYWxzZX19Ci0gICAgICAgICAgeygyKX0KLSAgXGxpbmVpaWl7XHZhcntrfSBub3QgaW4gXHZhcnthfX0KLSAgICAgICAgICB7RXF1aXZhbGVudCB0byBcY29kZXtub3R9IFx2YXJ7a30gaW4gXHZhcnthfX0KLSAgICAgICAgICB7KDIpfQotICBcbGluZWlpaXtcdmFye2F9Lmhhc19rZXkoXHZhcntrfSl9Ci0gICAgICAgICAge0VxdWl2YWxlbnQgdG8gXHZhcntrfSBcY29kZXtpbn0gXHZhcnthfSwgdXNlIHRoYXQgZm9ybSBpbiBuZXcgY29kZX0KLSAgICAgICAgICB7fQotICBcbGluZWlpaXtcdmFye2F9Lml0ZW1zKCl9Ci0gICAgICAgICAge2EgY29weSBvZiBcdmFye2F9J3MgbGlzdCBvZiAoXHZhcntrZXl9LCBcdmFye3ZhbHVlfSkgcGFpcnN9Ci0gICAgICAgICAgeygzKX0KLSAgXGxpbmVpaWl7XHZhcnthfS5rZXlzKCl9e2EgY29weSBvZiBcdmFye2F9J3MgbGlzdCBvZiBrZXlzfXsoMyl9Ci0gIFxsaW5laWlpe1x2YXJ7YX0udXBkYXRlKFxvcHRpb25hbHtcdmFye2J9fSl9Ci0gICAgICAgICAge3VwZGF0ZXMgXHZhcnthfSB3aXRoIGtleS92YWx1ZSBwYWlycyBmcm9tIFx2YXJ7Yn0sIG92ZXJ3cml0aW5nCi0JICAgZXhpc3Rpbmcga2V5cywgcmV0dXJucyBcY29kZXtOb25lfX0KLSAgICAgICAgICB7KDkpfQotICBcbGluZWlpaXtcdmFye2F9LmZyb21rZXlzKFx2YXJ7c2VxfVxvcHRpb25hbHssIFx2YXJ7dmFsdWV9fSl9Ci0gICAgICAgICAge0NyZWF0ZXMgYSBuZXcgZGljdGlvbmFyeSB3aXRoIGtleXMgZnJvbSBcdmFye3NlcX0gYW5kIHZhbHVlcyBzZXQgdG8gXHZhcnt2YWx1ZX19Ci0gICAgICAgICAgeyg3KX0JCQkgICAKLSAgXGxpbmVpaWl7XHZhcnthfS52YWx1ZXMoKX17YSBjb3B5IG9mIFx2YXJ7YX0ncyBsaXN0IG9mIHZhbHVlc317KDMpfQotICBcbGluZWlpaXtcdmFye2F9LmdldChcdmFye2t9XG9wdGlvbmFseywgXHZhcnt4fX0pfQotICAgICAgICAgIHtcY29kZXtcdmFye2F9W1x2YXJ7a31dfSBpZiBcY29kZXtcdmFye2t9IGluIFx2YXJ7YX19LAotICAgICAgICAgICBlbHNlIFx2YXJ7eH19Ci0gICAgICAgICAgeyg0KX0KLSAgXGxpbmVpaWl7XHZhcnthfS5zZXRkZWZhdWx0KFx2YXJ7a31cb3B0aW9uYWx7LCBcdmFye3h9fSl9Ci0gICAgICAgICAge1xjb2Rle1x2YXJ7YX1bXHZhcntrfV19IGlmIFxjb2Rle1x2YXJ7a30gaW4gXHZhcnthfX0sCi0gICAgICAgICAgIGVsc2UgXHZhcnt4fSAoYWxzbyBzZXR0aW5nIGl0KX0KLSAgICAgICAgICB7KDUpfQotICBcbGluZWlpaXtcdmFye2F9LnBvcChcdmFye2t9XG9wdGlvbmFseywgXHZhcnt4fX0pfQotICAgICAgICAgIHtcY29kZXtcdmFye2F9W1x2YXJ7a31dfSBpZiBcY29kZXtcdmFye2t9IGluIFx2YXJ7YX19LAotICAgICAgICAgICBlbHNlIFx2YXJ7eH0gKGFuZCByZW1vdmUgayl9Ci0gICAgICAgICAgeyg4KX0KLSAgXGxpbmVpaWl7XHZhcnthfS5wb3BpdGVtKCl9Ci0gICAgICAgICAge3JlbW92ZSBhbmQgcmV0dXJuIGFuIGFyYml0cmFyeSAoXHZhcntrZXl9LCBcdmFye3ZhbHVlfSkgcGFpcn0KLSAgICAgICAgICB7KDYpfQotICBcbGluZWlpaXtcdmFye2F9Lml0ZXJpdGVtcygpfQotICAgICAgICAgIHtyZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciAoXHZhcntrZXl9LCBcdmFye3ZhbHVlfSkgcGFpcnN9Ci0gICAgICAgICAgeygyKSwgKDMpfQotICBcbGluZWlpaXtcdmFye2F9Lml0ZXJrZXlzKCl9Ci0gICAgICAgICAge3JldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBtYXBwaW5nJ3Mga2V5c30KLSAgICAgICAgICB7KDIpLCAoMyl9Ci0gIFxsaW5laWlpe1x2YXJ7YX0uaXRlcnZhbHVlcygpfQotICAgICAgICAgIHtyZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgbWFwcGluZydzIHZhbHVlc30KLSAgICAgICAgICB7KDIpLCAoMyl9Ci1cZW5ke3RhYmxlaWlpfQotCi1cbm9pbmRlbnQKLU5vdGVzOgotXGJlZ2lue2Rlc2NyaXB0aW9ufQotXGl0ZW1bKDEpXSBSYWlzZXMgYSBcZXhjZXB0aW9ue0tleUVycm9yfSBleGNlcHRpb24gaWYgXHZhcntrfSBpcyBub3QKLWluIHRoZSBtYXAuCi0KLVxpdGVtWygyKV0gXHZlcnNpb25hZGRlZHsyLjJ9Ci0KLVxpdGVtWygzKV0gS2V5cyBhbmQgdmFsdWVzIGFyZSBsaXN0ZWQgaW4gYW4gYXJiaXRyYXJ5IG9yZGVyIHdoaWNoIGlzCi1ub24tcmFuZG9tLCB2YXJpZXMgYWNyb3NzIFB5dGhvbiBpbXBsZW1lbnRhdGlvbnMsIGFuZCBkZXBlbmRzIG9uIHRoZQotZGljdGlvbmFyeSdzIGhpc3Rvcnkgb2YgaW5zZXJ0aW9ucyBhbmQgZGVsZXRpb25zLgotSWYgXG1ldGhvZHtpdGVtcygpfSwgXG1ldGhvZHtrZXlzKCl9LCBcbWV0aG9ke3ZhbHVlcygpfSwKLVxtZXRob2R7aXRlcml0ZW1zKCl9LCBcbWV0aG9ke2l0ZXJrZXlzKCl9LCBhbmQgXG1ldGhvZHtpdGVydmFsdWVzKCl9Ci1hcmUgY2FsbGVkIHdpdGggbm8gaW50ZXJ2ZW5pbmcgbW9kaWZpY2F0aW9ucyB0byB0aGUgZGljdGlvbmFyeSwgdGhlCi1saXN0cyB3aWxsIGRpcmVjdGx5IGNvcnJlc3BvbmQuICBUaGlzIGFsbG93cyB0aGUgY3JlYXRpb24gb2YKLVxjb2RleyhcdmFye3ZhbHVlfSwgXHZhcntrZXl9KX0gcGFpcnMgdXNpbmcgXGZ1bmN0aW9ue3ppcCgpfToKLVxzYW1we3BhaXJzID0gemlwKFx2YXJ7YX0udmFsdWVzKCksIFx2YXJ7YX0ua2V5cygpKX0uICBUaGUgc2FtZQotcmVsYXRpb25zaGlwIGhvbGRzIGZvciB0aGUgXG1ldGhvZHtpdGVya2V5cygpfSBhbmQKLVxtZXRob2R7aXRlcnZhbHVlcygpfSBtZXRob2RzOiBcc2FtcHtwYWlycyA9IHppcChcdmFye2F9Lml0ZXJ2YWx1ZXMoKSwKLVx2YXJ7YX0uaXRlcmtleXMoKSl9IHByb3ZpZGVzIHRoZSBzYW1lIHZhbHVlIGZvciBcY29kZXtwYWlyc30uCi1Bbm90aGVyIHdheSB0byBjcmVhdGUgdGhlIHNhbWUgbGlzdCBpcyBcc2FtcHtwYWlycyA9IFsodiwgaykgZm9yIChrLAotdikgaW4gXHZhcnthfS5pdGVyaXRlbXMoKV19LgotCi1caXRlbVsoNCldIE5ldmVyIHJhaXNlcyBhbiBleGNlcHRpb24gaWYgXHZhcntrfSBpcyBub3QgaW4gdGhlIG1hcCwKLWluc3RlYWQgaXQgcmV0dXJucyBcdmFye3h9LiAgXHZhcnt4fSBpcyBvcHRpb25hbDsgd2hlbiBcdmFye3h9IGlzIG5vdAotcHJvdmlkZWQgYW5kIFx2YXJ7a30gaXMgbm90IGluIHRoZSBtYXAsIFxjb2Rle05vbmV9IGlzIHJldHVybmVkLgotCi1caXRlbVsoNSldIFxmdW5jdGlvbntzZXRkZWZhdWx0KCl9IGlzIGxpa2UgXGZ1bmN0aW9ue2dldCgpfSwgZXhjZXB0Ci10aGF0IGlmIFx2YXJ7a30gaXMgbWlzc2luZywgXHZhcnt4fSBpcyBib3RoIHJldHVybmVkIGFuZCBpbnNlcnRlZCBpbnRvCi10aGUgZGljdGlvbmFyeSBhcyB0aGUgdmFsdWUgb2YgXHZhcntrfS4gXHZhcnt4fSBkZWZhdWx0cyB0byBcY29kZXtOb25lfS4KLQotXGl0ZW1bKDYpXSBcZnVuY3Rpb257cG9waXRlbSgpfSBpcyB1c2VmdWwgdG8gZGVzdHJ1Y3RpdmVseSBpdGVyYXRlCi1vdmVyIGEgZGljdGlvbmFyeSwgYXMgb2Z0ZW4gdXNlZCBpbiBzZXQgYWxnb3JpdGhtcy4gIElmIHRoZSBkaWN0aW9uYXJ5Ci1pcyBlbXB0eSwgY2FsbGluZyBcZnVuY3Rpb257cG9waXRlbSgpfSByYWlzZXMgYSBcZXhjZXB0aW9ue0tleUVycm9yfS4KLQotXGl0ZW1bKDcpXSBcZnVuY3Rpb257ZnJvbWtleXMoKX0gaXMgYSBjbGFzcyBtZXRob2QgdGhhdCByZXR1cm5zIGEKLW5ldyBkaWN0aW9uYXJ5LiBcdmFye3ZhbHVlfSBkZWZhdWx0cyB0byBcY29kZXtOb25lfS4gIFx2ZXJzaW9uYWRkZWR7Mi4zfQotCi1caXRlbVsoOCldIFxmdW5jdGlvbntwb3AoKX0gcmFpc2VzIGEgXGV4Y2VwdGlvbntLZXlFcnJvcn0gd2hlbiBubyBkZWZhdWx0Ci12YWx1ZSBpcyBnaXZlbiBhbmQgdGhlIGtleSBpcyBub3QgZm91bmQuICBcdmVyc2lvbmFkZGVkezIuM30KLQotXGl0ZW1bKDkpXSBcZnVuY3Rpb257dXBkYXRlKCl9IGFjY2VwdHMgZWl0aGVyIGFub3RoZXIgbWFwcGluZyBvYmplY3QKLW9yIGFuIGl0ZXJhYmxlIG9mIGtleS92YWx1ZSBwYWlycyAoYXMgYSB0dXBsZSBvciBvdGhlciBpdGVyYWJsZSBvZgotbGVuZ3RoIHR3bykuICBJZiBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgc3BlY2lmaWVkLCB0aGUgbWFwcGluZyBpcwotdGhlbiBpcyB1cGRhdGVkIHdpdGggdGhvc2Uga2V5L3ZhbHVlIHBhaXJzOgotXHNhbXB7ZC51cGRhdGUocmVkPTEsIGJsdWU9Mil9LgotXHZlcnNpb25jaGFuZ2VkW0FsbG93ZWQgdGhlIGFyZ3VtZW50IHRvIGJlIGFuIGl0ZXJhYmxlIG9mIGtleS92YWx1ZQotICAgICAgICAgICAgICAgIHBhaXJzIGFuZCBhbGxvd2VkIGtleXdvcmQgYXJndW1lbnRzXXsyLjR9Ci0KLVxpdGVtWygxMCldIElmIGEgc3ViY2xhc3Mgb2YgZGljdCBkZWZpbmVzIGEgbWV0aG9kIFxtZXRob2R7X19taXNzaW5nX199LAotaWYgdGhlIGtleSBcdmFye2t9IGlzIG5vdCBwcmVzZW50LCB0aGUgXHZhcnthfVtcdmFye2t9XSBvcGVyYXRpb24gY2FsbHMKLXRoYXQgbWV0aG9kIHdpdGggdGhlIGtleSBcdmFye2t9IGFzIGFyZ3VtZW50LiAgVGhlIFx2YXJ7YX1bXHZhcntrfV0KLW9wZXJhdGlvbiB0aGVuIHJldHVybnMgb3IgcmFpc2VzIHdoYXRldmVyIGlzIHJldHVybmVkIG9yIHJhaXNlZCBieSB0aGUKLVxmdW5jdGlvbntfX21pc3NpbmdfX30oXHZhcntrfSkgY2FsbCBpZiB0aGUga2V5IGlzIG5vdCBwcmVzZW50LgotTm8gb3RoZXIgb3BlcmF0aW9ucyBvciBtZXRob2RzIGludm9rZSBcbWV0aG9ke19fbWlzc2luZ19ffSgpLgotSWYgXG1ldGhvZHtfX21pc3NpbmdfX30gaXMgbm90IGRlZmluZWQsIFxleGNlcHRpb257S2V5RXJyb3J9IGlzIHJhaXNlZC4KLVxtZXRob2R7X19taXNzaW5nX199IG11c3QgYmUgYSBtZXRob2Q7IGl0IGNhbm5vdCBiZSBhbiBpbnN0YW5jZSB2YXJpYWJsZS4KLUZvciBhbiBleGFtcGxlLCBzZWUgXG1vZHVsZXtjb2xsZWN0aW9uc30uXGNsYXNze2RlZmF1bHRkaWN0fS4KLVx2ZXJzaW9uYWRkZWR7Mi41fQotCi1cZW5ke2Rlc2NyaXB0aW9ufQotCi1cc2VjdGlvbntGaWxlIE9iamVjdHMKLSAgICAgICAgICAgIFxsYWJlbHtibHRpbi1maWxlLW9iamVjdHN9fQotCi1GaWxlIG9iamVjdHNcb2JpbmRleHtmaWxlfSBhcmUgaW1wbGVtZW50ZWQgdXNpbmcgQydzIFxjb2Rle3N0ZGlvfQotcGFja2FnZSBhbmQgY2FuIGJlIGNyZWF0ZWQgd2l0aCB0aGUgYnVpbHQtaW4gY29uc3RydWN0b3IKLVxmdW5jdGlvbntmaWxlKCl9XGJpZnVuY2luZGV4e2ZpbGV9IGRlc2NyaWJlZCBpbiBzZWN0aW9uCi1ccmVme2J1aWx0LWluLWZ1bmNzfSwgYGBCdWlsdC1pbiBGdW5jdGlvbnMuJydcZm9vdG5vdGV7XGZ1bmN0aW9ue2ZpbGUoKX0KLWlzIG5ldyBpbiBQeXRob24gMi4yLiAgVGhlIG9sZGVyIGJ1aWx0LWluIFxmdW5jdGlvbntvcGVuKCl9IGlzIGFuCi1hbGlhcyBmb3IgXGZ1bmN0aW9ue2ZpbGUoKX0ufSAgRmlsZSBvYmplY3RzIGFyZSBhbHNvIHJldHVybmVkCi1ieSBzb21lIG90aGVyIGJ1aWx0LWluIGZ1bmN0aW9ucyBhbmQgbWV0aG9kcywgc3VjaCBhcwotXGZ1bmN0aW9ue29zLnBvcGVuKCl9IGFuZCBcZnVuY3Rpb257b3MuZmRvcGVuKCl9IGFuZCB0aGUKLVxtZXRob2R7bWFrZWZpbGUoKX0gbWV0aG9kIG9mIHNvY2tldCBvYmplY3RzLgotXHJlZnN0bW9kaW5kZXh7b3N9Ci1ccmVmYmltb2RpbmRleHtzb2NrZXR9Ci0KLVdoZW4gYSBmaWxlIG9wZXJhdGlvbiBmYWlscyBmb3IgYW4gSS9PLXJlbGF0ZWQgcmVhc29uLCB0aGUgZXhjZXB0aW9uCi1cZXhjZXB0aW9ue0lPRXJyb3J9IGlzIHJhaXNlZC4gIFRoaXMgaW5jbHVkZXMgc2l0dWF0aW9ucyB3aGVyZSB0aGUKLW9wZXJhdGlvbiBpcyBub3QgZGVmaW5lZCBmb3Igc29tZSByZWFzb24sIGxpa2UgXG1ldGhvZHtzZWVrKCl9IG9uIGEgdHR5Ci1kZXZpY2Ugb3Igd3JpdGluZyBhIGZpbGUgb3BlbmVkIGZvciByZWFkaW5nLgotCi1GaWxlcyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLQotCi1cYmVnaW57bWV0aG9kZGVzY31bZmlsZV17Y2xvc2V9e30KLSAgQ2xvc2UgdGhlIGZpbGUuICBBIGNsb3NlZCBmaWxlIGNhbm5vdCBiZSByZWFkIG9yIHdyaXR0ZW4gYW55IG1vcmUuCi0gIEFueSBvcGVyYXRpb24gd2hpY2ggcmVxdWlyZXMgdGhhdCB0aGUgZmlsZSBiZSBvcGVuIHdpbGwgcmFpc2UgYQotICBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IGFmdGVyIHRoZSBmaWxlIGhhcyBiZWVuIGNsb3NlZC4gIENhbGxpbmcKLSAgXG1ldGhvZHtjbG9zZSgpfSBtb3JlIHRoYW4gb25jZSBpcyBhbGxvd2VkLgotCi0gIEFzIG9mIFB5dGhvbiAyLjUsIHlvdSBjYW4gYXZvaWQgaGF2aW5nIHRvIGNhbGwgdGhpcyBtZXRob2QgZXhwbGljaXRseQotICBpZiB5b3UgdXNlIHRoZSBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQuICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZwotICBjb2RlIHdpbGwgYXV0b21hdGljYWxseSBjbG9zZSBcY29kZXtmfSB3aGVuIHRoZSBca2V5d29yZHt3aXRofSBibG9jawotICBpcyBleGl0ZWQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWZyb20gX19mdXR1cmVfXyBpbXBvcnQgd2l0aF9zdGF0ZW1lbnQKLQotd2l0aCBvcGVuKCJoZWxsby50eHQiKSBhcyBmOgotICAgIGZvciBsaW5lIGluIGY6Ci0gICAgICAgIHByaW50IGxpbmUKLVxlbmR7dmVyYmF0aW19Ci0KLSAgSW4gb2xkZXIgdmVyc2lvbnMgb2YgUHl0aG9uLCB5b3Ugd291bGQgaGF2ZSBuZWVkZWQgdG8gZG8gdGhpcyB0byBnZXQKLSAgdGhlIHNhbWUgZWZmZWN0OgotCi1cYmVnaW57dmVyYmF0aW19Ci1mID0gb3BlbigiaGVsbG8udHh0IikKLXRyeToKLSAgICBmb3IgbGluZSBpbiBmOgotICAgICAgICBwcmludCBsaW5lCi1maW5hbGx5OgotICAgIGYuY2xvc2UoKQotXGVuZHt2ZXJiYXRpbX0KLQotICBcbm90ZXtOb3QgYWxsIGBgZmlsZS1saWtlJycgdHlwZXMgaW4gUHl0aG9uIHN1cHBvcnQgdXNlIGFzIGEgY29udGV4dAotICBtYW5hZ2VyIGZvciB0aGUgXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50LiAgSWYgeW91ciBjb2RlIGlzIGludGVuZGVkIHRvCi0gIHdvcmsgd2l0aCBhbnkgZmlsZS1saWtlIG9iamVjdCwgeW91IGNhbiB1c2UgdGhlIFxmdW5jdGlvbntjbG9zaW5nKCl9Ci0gIGZ1bmN0aW9uIGluIHRoZSBcbW9kdWxle2NvbnRleHRsaWJ9IG1vZHVsZSBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBvYmplY3QKLSAgZGlyZWN0bHkuICBTZWUgc2VjdGlvbn5ccmVme2NvbnRleHQtY2xvc2luZ30gZm9yIGRldGFpbHMufQotICAKLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2ZpbGVde2ZsdXNofXt9Ci0gIEZsdXNoIHRoZSBpbnRlcm5hbCBidWZmZXIsIGxpa2UgXGNvZGV7c3RkaW99J3MKLSAgXGNmdW5jdGlvbntmZmx1c2goKX0uICBUaGlzIG1heSBiZSBhIG5vLW9wIG9uIHNvbWUgZmlsZS1saWtlCi0gIG9iamVjdHMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtmaWxlXXtmaWxlbm99e30KLSAgXGluZGV4e2ZpbGUgZGVzY3JpcHRvcn0KLSAgXGluZGV4e2Rlc2NyaXB0b3IsIGZpbGV9Ci0gIFJldHVybiB0aGUgaW50ZWdlciBgYGZpbGUgZGVzY3JpcHRvcicnIHRoYXQgaXMgdXNlZCBieSB0aGUKLSAgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiB0byByZXF1ZXN0IEkvTyBvcGVyYXRpb25zIGZyb20gdGhlCi0gIG9wZXJhdGluZyBzeXN0ZW0uICBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIG90aGVyLCBsb3dlciBsZXZlbAotICBpbnRlcmZhY2VzIHRoYXQgdXNlIGZpbGUgZGVzY3JpcHRvcnMsIHN1Y2ggYXMgdGhlCi0gIFxyZWZtb2R1bGV7ZmNudGx9XHJlZmJpbW9kaW5kZXh7ZmNudGx9IG1vZHVsZSBvcgotICBcZnVuY3Rpb257b3MucmVhZCgpfSBhbmQgZnJpZW5kcy4gIFxub3Rle0ZpbGUtbGlrZSBvYmplY3RzCi0gIHdoaWNoIGRvIG5vdCBoYXZlIGEgcmVhbCBmaWxlIGRlc2NyaXB0b3Igc2hvdWxkIFxlbXBoe25vdH0gcHJvdmlkZQotICB0aGlzIG1ldGhvZCF9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtmaWxlXXtpc2F0dHl9e30KLSAgUmV0dXJuIFxjb2Rle1RydWV9IGlmIHRoZSBmaWxlIGlzIGNvbm5lY3RlZCB0byBhIHR0eSgtbGlrZSkgZGV2aWNlLCBlbHNlCi0gIFxjb2Rle0ZhbHNlfS4gIFxub3Rle0lmIGEgZmlsZS1saWtlIG9iamVjdCBpcyBub3QgYXNzb2NpYXRlZAotICB3aXRoIGEgcmVhbCBmaWxlLCB0aGlzIG1ldGhvZCBzaG91bGQgXGVtcGh7bm90fSBiZSBpbXBsZW1lbnRlZC59Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtmaWxlXXtfX25leHRfX317fQotQSBmaWxlIG9iamVjdCBpcyBpdHMgb3duIGl0ZXJhdG9yLCBmb3IgZXhhbXBsZSBcY29kZXtpdGVyKFx2YXJ7Zn0pfSByZXR1cm5zCi1cdmFye2Z9ICh1bmxlc3MgXHZhcntmfSBpcyBjbG9zZWQpLiAgV2hlbiBhIGZpbGUgaXMgdXNlZCBhcyBhbgotaXRlcmF0b3IsIHR5cGljYWxseSBpbiBhIFxrZXl3b3Jke2Zvcn0gbG9vcCAoZm9yIGV4YW1wbGUsCi1cY29kZXtmb3IgbGluZSBpbiBmOiBwcmludCBsaW5lfSksIHRoZSBcbWV0aG9ke19fbmV4dF9fKCl9IG1ldGhvZCBpcwotY2FsbGVkIHJlcGVhdGVkbHkuICBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBuZXh0IGlucHV0IGxpbmUsIG9yIHJhaXNlcwotXGV4Y2VwdGlvbntTdG9wSXRlcmF0aW9ufSB3aGVuIFxFT0Z7fSBpcyBoaXQgd2hlbiB0aGUgZmlsZSBpcyBvcGVuIGZvcgotcmVhZGluZyAoYmVoYXZpb3IgaXMgdW5kZWZpbmVkIHdoZW4gdGhlIGZpbGUgaXMgb3BlbiBmb3Igd3JpdGluZykuICBJbgotb3JkZXIgdG8gbWFrZSBhIFxrZXl3b3Jke2Zvcn0gbG9vcCB0aGUgbW9zdCBlZmZpY2llbnQgd2F5IG9mIGxvb3BpbmcKLW92ZXIgdGhlIGxpbmVzIG9mIGEgZmlsZSAoYSB2ZXJ5IGNvbW1vbiBvcGVyYXRpb24pLCB0aGUKLVxtZXRob2R7X19uZXh0X18oKX0gbWV0aG9kIHVzZXMgYSBoaWRkZW4gcmVhZC1haGVhZCBidWZmZXIuICBBcyBhCi1jb25zZXF1ZW5jZSBvZiB1c2luZyBhIHJlYWQtYWhlYWQgYnVmZmVyLCBjb21iaW5pbmcgXG1ldGhvZHtfX25leHRfXygpfQotd2l0aCBvdGhlciBmaWxlIG1ldGhvZHMgKGxpa2UgXG1ldGhvZHtyZWFkbGluZSgpfSkgZG9lcyBub3Qgd29yawotcmlnaHQuICBIb3dldmVyLCB1c2luZyBcbWV0aG9ke3NlZWsoKX0gdG8gcmVwb3NpdGlvbiB0aGUgZmlsZSB0byBhbgotYWJzb2x1dGUgcG9zaXRpb24gd2lsbCBmbHVzaCB0aGUgcmVhZC1haGVhZCBidWZmZXIuCi1cdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2ZpbGVde3JlYWR9e1xvcHRpb25hbHtzaXplfX0KLSAgUmVhZCBhdCBtb3N0IFx2YXJ7c2l6ZX0gYnl0ZXMgZnJvbSB0aGUgZmlsZSAobGVzcyBpZiB0aGUgcmVhZCBoaXRzCi0gIFxFT0Z7fSBiZWZvcmUgb2J0YWluaW5nIFx2YXJ7c2l6ZX0gYnl0ZXMpLiAgSWYgdGhlIFx2YXJ7c2l6ZX0KLSAgYXJndW1lbnQgaXMgbmVnYXRpdmUgb3Igb21pdHRlZCwgcmVhZCBhbGwgZGF0YSB1bnRpbCBcRU9Ge30gaXMKLSAgcmVhY2hlZC4gIFRoZSBieXRlcyBhcmUgcmV0dXJuZWQgYXMgYSBzdHJpbmcgb2JqZWN0LiAgQW4gZW1wdHkKLSAgc3RyaW5nIGlzIHJldHVybmVkIHdoZW4gXEVPRnt9IGlzIGVuY291bnRlcmVkIGltbWVkaWF0ZWx5LiAgKEZvcgotICBjZXJ0YWluIGZpbGVzLCBsaWtlIHR0eXMsIGl0IG1ha2VzIHNlbnNlIHRvIGNvbnRpbnVlIHJlYWRpbmcgYWZ0ZXIKLSAgYW4gXEVPRnt9IGlzIGhpdC4pICBOb3RlIHRoYXQgdGhpcyBtZXRob2QgbWF5IGNhbGwgdGhlIHVuZGVybHlpbmcKLSAgQyBmdW5jdGlvbiBcY2Z1bmN0aW9ue2ZyZWFkKCl9IG1vcmUgdGhhbiBvbmNlIGluIGFuIGVmZm9ydCB0bwotICBhY3F1aXJlIGFzIGNsb3NlIHRvIFx2YXJ7c2l6ZX0gYnl0ZXMgYXMgcG9zc2libGUuIEFsc28gbm90ZSB0aGF0Ci0gIHdoZW4gaW4gbm9uLWJsb2NraW5nIG1vZGUsIGxlc3MgZGF0YSB0aGFuIHdoYXQgd2FzIHJlcXVlc3RlZCBtYXkKLSAgYmUgcmV0dXJuZWQsIGV2ZW4gaWYgbm8gXHZhcntzaXplfSBwYXJhbWV0ZXIgd2FzIGdpdmVuLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bZmlsZV17cmVhZGxpbmV9e1xvcHRpb25hbHtzaXplfX0KLSAgUmVhZCBvbmUgZW50aXJlIGxpbmUgZnJvbSB0aGUgZmlsZS4gIEEgdHJhaWxpbmcgbmV3bGluZSBjaGFyYWN0ZXIgaXMKLSAga2VwdCBpbiB0aGUgc3RyaW5nIChidXQgbWF5IGJlIGFic2VudCB3aGVuIGEgZmlsZSBlbmRzIHdpdGggYW4KLSAgaW5jb21wbGV0ZSBsaW5lKS5cZm9vdG5vdGV7Ci0JVGhlIGFkdmFudGFnZSBvZiBsZWF2aW5nIHRoZSBuZXdsaW5lIG9uIGlzIHRoYXQKLQlyZXR1cm5pbmcgYW4gZW1wdHkgc3RyaW5nIGlzIHRoZW4gYW4gdW5hbWJpZ3VvdXMgXEVPRnt9Ci0JaW5kaWNhdGlvbi4gIEl0IGlzIGFsc28gcG9zc2libGUgKGluIGNhc2VzIHdoZXJlIGl0IG1pZ2h0Ci0JbWF0dGVyLCBmb3IgZXhhbXBsZSwgaWYgeW91Ci0Jd2FudCB0byBtYWtlIGFuIGV4YWN0IGNvcHkgb2YgYSBmaWxlIHdoaWxlIHNjYW5uaW5nIGl0cyBsaW5lcykKLQl0byB0ZWxsIHdoZXRoZXIgdGhlIGxhc3QgbGluZSBvZiBhIGZpbGUgZW5kZWQgaW4gYSBuZXdsaW5lCi0Jb3Igbm90ICh5ZXMgdGhpcyBoYXBwZW5zISkuCi0gIH0gIElmIHRoZSBcdmFye3NpemV9IGFyZ3VtZW50IGlzIHByZXNlbnQgYW5kCi0gIG5vbi1uZWdhdGl2ZSwgaXQgaXMgYSBtYXhpbXVtIGJ5dGUgY291bnQgKGluY2x1ZGluZyB0aGUgdHJhaWxpbmcKLSAgbmV3bGluZSkgYW5kIGFuIGluY29tcGxldGUgbGluZSBtYXkgYmUgcmV0dXJuZWQuCi0gIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBcZW1waHtvbmx5fSB3aGVuIFxFT0Z7fSBpcyBlbmNvdW50ZXJlZAotICBpbW1lZGlhdGVseS4gIFxub3Rle1VubGlrZSBcY29kZXtzdGRpb30ncyBcY2Z1bmN0aW9ue2ZnZXRzKCl9LCB0aGUKLSAgcmV0dXJuZWQgc3RyaW5nIGNvbnRhaW5zIG51bGwgY2hhcmFjdGVycyAoXGNvZGV7J1xlIDAnfSkgaWYgdGhleQotICBvY2N1cnJlZCBpbiB0aGUgaW5wdXQufQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bZmlsZV17cmVhZGxpbmVzfXtcb3B0aW9uYWx7c2l6ZWhpbnR9fQotICBSZWFkIHVudGlsIFxFT0Z7fSB1c2luZyBcbWV0aG9ke3JlYWRsaW5lKCl9IGFuZCByZXR1cm4gYSBsaXN0IGNvbnRhaW5pbmcKLSAgdGhlIGxpbmVzIHRodXMgcmVhZC4gIElmIHRoZSBvcHRpb25hbCBcdmFye3NpemVoaW50fSBhcmd1bWVudCBpcwotICBwcmVzZW50LCBpbnN0ZWFkIG9mIHJlYWRpbmcgdXAgdG8gXEVPRiwgd2hvbGUgbGluZXMgdG90YWxsaW5nCi0gIGFwcHJveGltYXRlbHkgXHZhcntzaXplaGludH0gYnl0ZXMgKHBvc3NpYmx5IGFmdGVyIHJvdW5kaW5nIHVwIHRvIGFuCi0gIGludGVybmFsIGJ1ZmZlciBzaXplKSBhcmUgcmVhZC4gIE9iamVjdHMgaW1wbGVtZW50aW5nIGEgZmlsZS1saWtlCi0gIGludGVyZmFjZSBtYXkgY2hvb3NlIHRvIGlnbm9yZSBcdmFye3NpemVoaW50fSBpZiBpdCBjYW5ub3QgYmUKLSAgaW1wbGVtZW50ZWQsIG9yIGNhbm5vdCBiZSBpbXBsZW1lbnRlZCBlZmZpY2llbnRseS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2ZpbGVde3NlZWt9e29mZnNldFxvcHRpb25hbHssIHdoZW5jZX19Ci0gIFNldCB0aGUgZmlsZSdzIGN1cnJlbnQgcG9zaXRpb24sIGxpa2UgXGNvZGV7c3RkaW99J3MgXGNmdW5jdGlvbntmc2VlaygpfS4KLSAgVGhlIFx2YXJ7d2hlbmNlfSBhcmd1bWVudCBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gCi0gIFxjb2Rle29zLlNFRUtfU0VUfSBvciBcY29kZXswfQotICAoYWJzb2x1dGUgZmlsZSBwb3NpdGlvbmluZyk7IG90aGVyIHZhbHVlcyBhcmUgXGNvZGV7b3MuU0VFS19DVVJ9IG9yIFxjb2RlezF9Ci0gIChzZWVrCi0gIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uKSBhbmQgXGNvZGV7b3MuU0VFS19FTkR9IG9yIFxjb2RlezJ9IAotICAoc2VlayByZWxhdGl2ZSB0byB0aGUKLSAgZmlsZSdzIGVuZCkuICBUaGVyZSBpcyBubyByZXR1cm4gdmFsdWUuICBOb3RlIHRoYXQgaWYgdGhlIGZpbGUgaXMKLSAgb3BlbmVkIGZvciBhcHBlbmRpbmcgKG1vZGUgXGNvZGV7J2EnfSBvciBcY29kZXsnYSsnfSksIGFueQotICBcbWV0aG9ke3NlZWsoKX0gb3BlcmF0aW9ucyB3aWxsIGJlIHVuZG9uZSBhdCB0aGUgbmV4dCB3cml0ZS4gIElmIHRoZQotICBmaWxlIGlzIG9ubHkgb3BlbmVkIGZvciB3cml0aW5nIGluIGFwcGVuZCBtb2RlIChtb2RlIFxjb2RleydhJ30pLAotICB0aGlzIG1ldGhvZCBpcyBlc3NlbnRpYWxseSBhIG5vLW9wLCBidXQgaXQgcmVtYWlucyB1c2VmdWwgZm9yIGZpbGVzCi0gIG9wZW5lZCBpbiBhcHBlbmQgbW9kZSB3aXRoIHJlYWRpbmcgZW5hYmxlZCAobW9kZSBcY29kZXsnYSsnfSkuICBJZiB0aGUKLSAgZmlsZSBpcyBvcGVuZWQgaW4gdGV4dCBtb2RlICh3aXRob3V0IFxjb2RleydiJ30pLCBvbmx5IG9mZnNldHMgcmV0dXJuZWQKLSAgYnkgXG1ldGhvZHt0ZWxsKCl9IGFyZSBsZWdhbC4gIFVzZSBvZiBvdGhlciBvZmZzZXRzIGNhdXNlcyB1bmRlZmluZWQKLSAgYmVoYXZpb3IuCi0KLSAgTm90ZSB0aGF0IG5vdCBhbGwgZmlsZSBvYmplY3RzIGFyZSBzZWVrYWJsZS4KLSAgXHZlcnNpb25jaGFuZ2Vke1Bhc3NpbmcgZmxvYXQgdmFsdWVzIGFzIG9mZnNldCBoYXMgYmVlbiBkZXByZWNhdGVkfVsyLjZdCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtmaWxlXXt0ZWxsfXt9Ci0gIFJldHVybiB0aGUgZmlsZSdzIGN1cnJlbnQgcG9zaXRpb24sIGxpa2UgXGNvZGV7c3RkaW99J3MKLSAgXGNmdW5jdGlvbntmdGVsbCgpfS4KLQotICBcbm90ZXtPbiBXaW5kb3dzLCBcbWV0aG9ke3RlbGwoKX0gY2FuIHJldHVybiBpbGxlZ2FsIHZhbHVlcyAoYWZ0ZXIgYW4KLSAgXGNmdW5jdGlvbntmZ2V0cygpfSkgd2hlbiByZWFkaW5nIGZpbGVzIHdpdGggXFVOSVh7fS1zdHlsZSBsaW5lLWVuZGluZ3MuCi0gIFVzZSBiaW5hcnkgbW9kZSAoXGNvZGV7J3JiJ30pIHRvIGNpcmN1bXZlbnQgdGhpcyBwcm9ibGVtLn0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2ZpbGVde3RydW5jYXRlfXtcb3B0aW9uYWx7c2l6ZX19Ci0gIFRydW5jYXRlIHRoZSBmaWxlJ3Mgc2l6ZS4gIElmIHRoZSBvcHRpb25hbCBcdmFye3NpemV9IGFyZ3VtZW50IGlzCi0gIHByZXNlbnQsIHRoZSBmaWxlIGlzIHRydW5jYXRlZCB0byAoYXQgbW9zdCkgdGhhdCBzaXplLiAgVGhlIHNpemUKLSAgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24uICBUaGUgY3VycmVudCBmaWxlIHBvc2l0aW9uIGlzCi0gIG5vdCBjaGFuZ2VkLiAgTm90ZSB0aGF0IGlmIGEgc3BlY2lmaWVkIHNpemUgZXhjZWVkcyB0aGUgZmlsZSdzCi0gIGN1cnJlbnQgc2l6ZSwgdGhlIHJlc3VsdCBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQ6ICBwb3NzaWJpbGl0aWVzCi0gIGluY2x1ZGUgdGhhdCB0aGUgZmlsZSBtYXkgcmVtYWluIHVuY2hhbmdlZCwgaW5jcmVhc2UgdG8gdGhlIHNwZWNpZmllZAotICBzaXplIGFzIGlmIHplcm8tZmlsbGVkLCBvciBpbmNyZWFzZSB0byB0aGUgc3BlY2lmaWVkIHNpemUgd2l0aAotICB1bmRlZmluZWQgbmV3IGNvbnRlbnQuCi0gIEF2YWlsYWJpbGl0eTogIFdpbmRvd3MsIG1hbnkgXFVOSVh7fSB2YXJpYW50cy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2ZpbGVde3dyaXRlfXtzdHJ9Ci0gIFdyaXRlIGEgc3RyaW5nIHRvIHRoZSBmaWxlLiAgVGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlLiAgRHVlIHRvCi0gIGJ1ZmZlcmluZywgdGhlIHN0cmluZyBtYXkgbm90IGFjdHVhbGx5IHNob3cgdXAgaW4gdGhlIGZpbGUgdW50aWwKLSAgdGhlIFxtZXRob2R7Zmx1c2goKX0gb3IgXG1ldGhvZHtjbG9zZSgpfSBtZXRob2QgaXMgY2FsbGVkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bZmlsZV17d3JpdGVsaW5lc317c2VxdWVuY2V9Ci0gIFdyaXRlIGEgc2VxdWVuY2Ugb2Ygc3RyaW5ncyB0byB0aGUgZmlsZS4gIFRoZSBzZXF1ZW5jZSBjYW4gYmUgYW55Ci0gIGl0ZXJhYmxlIG9iamVjdCBwcm9kdWNpbmcgc3RyaW5ncywgdHlwaWNhbGx5IGEgbGlzdCBvZiBzdHJpbmdzLgotICBUaGVyZSBpcyBubyByZXR1cm4gdmFsdWUuCi0gIChUaGUgbmFtZSBpcyBpbnRlbmRlZCB0byBtYXRjaCBcbWV0aG9ke3JlYWRsaW5lcygpfTsKLSAgXG1ldGhvZHt3cml0ZWxpbmVzKCl9IGRvZXMgbm90IGFkZCBsaW5lIHNlcGFyYXRvcnMuKQotXGVuZHttZXRob2RkZXNjfQotCi0KLUZpbGVzIHN1cHBvcnQgdGhlIGl0ZXJhdG9yIHByb3RvY29sLiAgRWFjaCBpdGVyYXRpb24gcmV0dXJucyB0aGUgc2FtZQotcmVzdWx0IGFzIFxjb2Rle1x2YXJ7ZmlsZX0ucmVhZGxpbmUoKX0sIGFuZCBpdGVyYXRpb24gZW5kcyB3aGVuIHRoZQotXG1ldGhvZHtyZWFkbGluZSgpfSBtZXRob2QgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuCi0KLQotRmlsZSBvYmplY3RzIGFsc28gb2ZmZXIgYSBudW1iZXIgb2Ygb3RoZXIgaW50ZXJlc3RpbmcgYXR0cmlidXRlcy4KLVRoZXNlIGFyZSBub3QgcmVxdWlyZWQgZm9yIGZpbGUtbGlrZSBvYmplY3RzLCBidXQgc2hvdWxkIGJlCi1pbXBsZW1lbnRlZCBpZiB0aGV5IG1ha2Ugc2Vuc2UgZm9yIHRoZSBwYXJ0aWN1bGFyIG9iamVjdC4KLQotXGJlZ2lue21lbWJlcmRlc2N9W2ZpbGVde2Nsb3NlZH0KLWJvb2wgaW5kaWNhdGluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgZmlsZSBvYmplY3QuICBUaGlzIGlzIGEKLXJlYWQtb25seSBhdHRyaWJ1dGU7IHRoZSBcbWV0aG9ke2Nsb3NlKCl9IG1ldGhvZCBjaGFuZ2VzIHRoZSB2YWx1ZS4KLUl0IG1heSBub3QgYmUgYXZhaWxhYmxlIG9uIGFsbCBmaWxlLWxpa2Ugb2JqZWN0cy4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W2ZpbGVde2VuY29kaW5nfQotVGhlIGVuY29kaW5nIHRoYXQgdGhpcyBmaWxlIHVzZXMuIFdoZW4gVW5pY29kZSBzdHJpbmdzIGFyZSB3cml0dGVuCi10byBhIGZpbGUsIHRoZXkgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYnl0ZSBzdHJpbmdzIHVzaW5nIHRoaXMgZW5jb2RpbmcuCi1JbiBhZGRpdGlvbiwgd2hlbiB0aGUgZmlsZSBpcyBjb25uZWN0ZWQgdG8gYSB0ZXJtaW5hbCwgdGhlIGF0dHJpYnV0ZQotZ2l2ZXMgdGhlIGVuY29kaW5nIHRoYXQgdGhlIHRlcm1pbmFsIGlzIGxpa2VseSB0byB1c2UgKHRoYXQgCi1pbmZvcm1hdGlvbiBtaWdodCBiZSBpbmNvcnJlY3QgaWYgdGhlIHVzZXIgaGFzIG1pc2NvbmZpZ3VyZWQgdGhlIAotdGVybWluYWwpLiBUaGUgYXR0cmlidXRlIGlzIHJlYWQtb25seSBhbmQgbWF5IG5vdCBiZSBwcmVzZW50IG9uCi1hbGwgZmlsZS1saWtlIG9iamVjdHMuIEl0IG1heSBhbHNvIGJlIFxjb2Rle05vbmV9LCBpbiB3aGljaCBjYXNlCi10aGUgZmlsZSB1c2VzIHRoZSBzeXN0ZW0gZGVmYXVsdCBlbmNvZGluZyBmb3IgY29udmVydGluZyBVbmljb2RlCi1zdHJpbmdzLgotCi1cdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W2ZpbGVde21vZGV9Ci1UaGUgSS9PIG1vZGUgZm9yIHRoZSBmaWxlLiAgSWYgdGhlIGZpbGUgd2FzIGNyZWF0ZWQgdXNpbmcgdGhlCi1cZnVuY3Rpb257b3BlbigpfSBidWlsdC1pbiBmdW5jdGlvbiwgdGhpcyB3aWxsIGJlIHRoZSB2YWx1ZSBvZiB0aGUKLVx2YXJ7bW9kZX0gcGFyYW1ldGVyLiAgVGhpcyBpcyBhIHJlYWQtb25seSBhdHRyaWJ1dGUgYW5kIG1heSBub3QgYmUKLXByZXNlbnQgb24gYWxsIGZpbGUtbGlrZSBvYmplY3RzLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bZmlsZV17bmFtZX0KLUlmIHRoZSBmaWxlIG9iamVjdCB3YXMgY3JlYXRlZCB1c2luZyBcZnVuY3Rpb257b3BlbigpfSwgdGhlIG5hbWUgb2YKLXRoZSBmaWxlLiAgT3RoZXJ3aXNlLCBzb21lIHN0cmluZyB0aGF0IGluZGljYXRlcyB0aGUgc291cmNlIG9mIHRoZQotZmlsZSBvYmplY3QsIG9mIHRoZSBmb3JtIFxzYW1wezxcbWJveHtcbGRvdHN9Pn0uICBUaGlzIGlzIGEgcmVhZC1vbmx5Ci1hdHRyaWJ1dGUgYW5kIG1heSBub3QgYmUgcHJlc2VudCBvbiBhbGwgZmlsZS1saWtlIG9iamVjdHMuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtmaWxlXXtuZXdsaW5lc30KLUlmIFB5dGhvbiB3YXMgYnVpbHQgd2l0aCB0aGUgXGxvbmdwcm9ncmFtb3B0e3dpdGgtdW5pdmVyc2FsLW5ld2xpbmVzfQotb3B0aW9uIHRvIFxwcm9ncmFte2NvbmZpZ3VyZX0gKHRoZSBkZWZhdWx0KSB0aGlzIHJlYWQtb25seSBhdHRyaWJ1dGUKLWV4aXN0cywgYW5kIGZvciBmaWxlcyBvcGVuZWQgaW4KLXVuaXZlcnNhbCBuZXdsaW5lIHJlYWQgbW9kZSBpdCBrZWVwcyB0cmFjayBvZiB0aGUgdHlwZXMgb2YgbmV3bGluZXMKLWVuY291bnRlcmVkIHdoaWxlIHJlYWRpbmcgdGhlIGZpbGUuIFRoZSB2YWx1ZXMgaXQgY2FuIHRha2UgYXJlCi1cY29kZXsnXGUgcid9LCBcY29kZXsnXGUgbid9LCBcY29kZXsnXGUgclxlIG4nfSwgXGNvZGV7Tm9uZX0gKHVua25vd24sCi1ubyBuZXdsaW5lcyByZWFkIHlldCkgb3IgYSB0dXBsZSBjb250YWluaW5nIGFsbCB0aGUgbmV3bGluZQotdHlwZXMgc2VlbiwgdG8gaW5kaWNhdGUgdGhhdCBtdWx0aXBsZQotbmV3bGluZSBjb252ZW50aW9ucyB3ZXJlIGVuY291bnRlcmVkLiBGb3IgZmlsZXMgbm90IG9wZW5lZCBpbiB1bml2ZXJzYWwKLW5ld2xpbmUgcmVhZCBtb2RlIHRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSB3aWxsIGJlIFxjb2Rle05vbmV9LgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bZmlsZV17c29mdHNwYWNlfQotQm9vbGVhbiB0aGF0IGluZGljYXRlcyB3aGV0aGVyIGEgc3BhY2UgY2hhcmFjdGVyIG5lZWRzIHRvIGJlIHByaW50ZWQKLWJlZm9yZSBhbm90aGVyIHZhbHVlIHdoZW4gdXNpbmcgdGhlIFxrZXl3b3Jke3ByaW50fSBzdGF0ZW1lbnQuCi1DbGFzc2VzIHRoYXQgYXJlIHRyeWluZyB0byBzaW11bGF0ZSBhIGZpbGUgb2JqZWN0IHNob3VsZCBhbHNvIGhhdmUgYQotd3JpdGFibGUgXG1lbWJlcntzb2Z0c3BhY2V9IGF0dHJpYnV0ZSwgd2hpY2ggc2hvdWxkIGJlIGluaXRpYWxpemVkIHRvCi16ZXJvLiAgVGhpcyB3aWxsIGJlIGF1dG9tYXRpYyBmb3IgbW9zdCBjbGFzc2VzIGltcGxlbWVudGVkIGluIFB5dGhvbgotKGNhcmUgbWF5IGJlIG5lZWRlZCBmb3Igb2JqZWN0cyB0aGF0IG92ZXJyaWRlIGF0dHJpYnV0ZSBhY2Nlc3MpOyB0eXBlcwotaW1wbGVtZW50ZWQgaW4gQyB3aWxsIGhhdmUgdG8gcHJvdmlkZSBhIHdyaXRhYmxlCi1cbWVtYmVye3NvZnRzcGFjZX0gYXR0cmlidXRlLgotXG5vdGV7VGhpcyBhdHRyaWJ1dGUgaXMgbm90IHVzZWQgdG8gY29udHJvbCB0aGUKLVxrZXl3b3Jke3ByaW50fSBzdGF0ZW1lbnQsIGJ1dCB0byBhbGxvdyB0aGUgaW1wbGVtZW50YXRpb24gb2YKLVxrZXl3b3Jke3ByaW50fSB0byBrZWVwIHRyYWNrIG9mIGl0cyBpbnRlcm5hbCBzdGF0ZS59Ci1cZW5ke21lbWJlcmRlc2N9Ci0KLQotXHNlY3Rpb257Q29udGV4dCBNYW5hZ2VyIFR5cGVzIFxsYWJlbHt0eXBlY29udGV4dG1hbmFnZXJ9fQotCi1cdmVyc2lvbmFkZGVkezIuNX0KLVxpbmRleHtjb250ZXh0IG1hbmFnZXJ9Ci1caW5kZXh7Y29udGV4dCBtYW5hZ2VtZW50IHByb3RvY29sfQotXGluZGV4e3Byb3RvY29sIWNvbnRleHQgbWFuYWdlbWVudH0KLQotUHl0aG9uJ3MgXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50IHN1cHBvcnRzIHRoZSBjb25jZXB0IG9mIGEgcnVudGltZQotY29udGV4dCBkZWZpbmVkIGJ5IGEgY29udGV4dCBtYW5hZ2VyLiAgVGhpcyBpcyBpbXBsZW1lbnRlZCB1c2luZwotdHdvIHNlcGFyYXRlIG1ldGhvZHMgdGhhdCBhbGxvdyB1c2VyLWRlZmluZWQgY2xhc3NlcyB0byBkZWZpbmUKLWEgcnVudGltZSBjb250ZXh0IHRoYXQgaXMgZW50ZXJlZCBiZWZvcmUgdGhlIHN0YXRlbWVudCBib2R5IGlzCi1leGVjdXRlZCBhbmQgZXhpdGVkIHdoZW4gdGhlIHN0YXRlbWVudCBlbmRzLgotCi1UaGUgXGRmbntjb250ZXh0IG1hbmFnZW1lbnQgcHJvdG9jb2x9IGNvbnNpc3RzIG9mIGEgcGFpciBvZgotbWV0aG9kcyB0aGF0IG5lZWQgdG8gYmUgcHJvdmlkZWQgZm9yIGEgY29udGV4dCBtYW5hZ2VyIG9iamVjdCB0bwotZGVmaW5lIGEgcnVudGltZSBjb250ZXh0OgotCi1cYmVnaW57bWV0aG9kZGVzY31bY29udGV4dCBtYW5hZ2VyXXtfX2VudGVyX199e30KLSAgRW50ZXIgdGhlIHJ1bnRpbWUgY29udGV4dCBhbmQgcmV0dXJuIGVpdGhlciB0aGlzIG9iamVjdCBvciBhbm90aGVyCi0gIG9iamVjdCByZWxhdGVkIHRvIHRoZSBydW50aW1lIGNvbnRleHQuIFRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGlzCi0gIG1ldGhvZCBpcyBib3VuZCB0byB0aGUgaWRlbnRpZmllciBpbiB0aGUgXGtleXdvcmR7YXN9IGNsYXVzZSBvZgotICBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnRzIHVzaW5nIHRoaXMgY29udGV4dCBtYW5hZ2VyLgotCi0gIEFuIGV4YW1wbGUgb2YgYSBjb250ZXh0IG1hbmFnZXIgdGhhdCByZXR1cm5zIGl0c2VsZiBpcyBhIGZpbGUgb2JqZWN0LgotICBGaWxlIG9iamVjdHMgcmV0dXJuIHRoZW1zZWx2ZXMgZnJvbSBfX2VudGVyX18oKSB0byBhbGxvdwotICBcZnVuY3Rpb257b3BlbigpfSB0byBiZSB1c2VkIGFzIHRoZSBjb250ZXh0IGV4cHJlc3Npb24gaW4gYQotICBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQuCi0KLSAgQW4gZXhhbXBsZSBvZiBhIGNvbnRleHQgbWFuYWdlciB0aGF0IHJldHVybnMgYSByZWxhdGVkCi0gIG9iamVjdCBpcyB0aGUgb25lIHJldHVybmVkIGJ5IFxjb2Rle2RlY2ltYWwuQ29udGV4dC5nZXRfbWFuYWdlcigpfS4KLSAgVGhlc2UgbWFuYWdlcnMgc2V0IHRoZSBhY3RpdmUgZGVjaW1hbCBjb250ZXh0IHRvIGEgY29weSBvZiB0aGUKLSAgb3JpZ2luYWwgZGVjaW1hbCBjb250ZXh0IGFuZCB0aGVuIHJldHVybiB0aGUgY29weS4gVGhpcyBhbGxvd3MKLSAgY2hhbmdlcyB0byBiZSBtYWRlIHRvIHRoZSBjdXJyZW50IGRlY2ltYWwgY29udGV4dCBpbiB0aGUgYm9keSBvZgotICB0aGUgXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50IHdpdGhvdXQgYWZmZWN0aW5nIGNvZGUgb3V0c2lkZQotICB0aGUgXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bY29udGV4dCBtYW5hZ2VyXXtfX2V4aXRfX317ZXhjX3R5cGUsIGV4Y192YWwsIGV4Y190Yn0KLSAgRXhpdCB0aGUgcnVudGltZSBjb250ZXh0IGFuZCByZXR1cm4gYSBCb29sZWFuIGZsYWcgaW5kaWNhdGluZyBpZiBhbnkKLSAgZXhwZWN0aW9uIHRoYXQgb2NjdXJyZWQgc2hvdWxkIGJlIHN1cHByZXNzZWQuIElmIGFuIGV4Y2VwdGlvbgotICBvY2N1cnJlZCB3aGlsZSBleGVjdXRpbmcgdGhlIGJvZHkgb2YgdGhlIFxrZXl3b3Jke3dpdGh9IHN0YXRlbWVudCwgdGhlCi0gIGFyZ3VtZW50cyBjb250YWluIHRoZSBleGNlcHRpb24gdHlwZSwgdmFsdWUgYW5kIHRyYWNlYmFjayBpbmZvcm1hdGlvbi4KLSAgT3RoZXJ3aXNlLCBhbGwgdGhyZWUgYXJndW1lbnRzIGFyZSBcY29kZXtOb25lfS4KLQotICBSZXR1cm5pbmcgYSB0cnVlIHZhbHVlIGZyb20gdGhpcyBtZXRob2Qgd2lsbCBjYXVzZSB0aGUgXGtleXdvcmR7d2l0aH0KLSAgc3RhdGVtZW50IHRvIHN1cHByZXNzIHRoZSBleGNlcHRpb24gYW5kIGNvbnRpbnVlIGV4ZWN1dGlvbiB3aXRoIHRoZQotICBzdGF0ZW1lbnQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQuIE90aGVyd2lzZQotICB0aGUgZXhjZXB0aW9uIGNvbnRpbnVlcyBwcm9wYWdhdGluZyBhZnRlciB0aGlzIG1ldGhvZCBoYXMgZmluaXNoZWQKLSAgZXhlY3V0aW5nLiBFeGNlcHRpb25zIHRoYXQgb2NjdXIgZHVyaW5nIGV4ZWN1dGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsCi0gIHJlcGxhY2UgYW55IGV4Y2VwdGlvbiB0aGF0IG9jY3VycmVkIGluIHRoZSBib2R5IG9mIHRoZSBca2V5d29yZHt3aXRofQotICBzdGF0ZW1lbnQuCi0KLSAgVGhlIGV4Y2VwdGlvbiBwYXNzZWQgaW4gc2hvdWxkIG5ldmVyIGJlIHJlcmFpc2VkIGV4cGxpY2l0bHkgLSBpbnN0ZWFkLAotICB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGEgZmFsc2UgdmFsdWUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbWV0aG9kCi0gIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgYW5kIGRvZXMgbm90IHdhbnQgdG8gc3VwcHJlc3MgdGhlIHJhaXNlZAotICBleGNlcHRpb24uIFRoaXMgYWxsb3dzIGNvbnRleHQgbWFuYWdlbWVudCBjb2RlIChzdWNoIGFzCi0gIFxjb2Rle2NvbnRleHRsaWIubmVzdGVkfSkgdG8gZWFzaWx5IGRldGVjdCB3aGV0aGVyIG9yIG5vdCBhbgotICBcbWV0aG9ke19fZXhpdF9fKCl9IG1ldGhvZCBoYXMgYWN0dWFsbHkgZmFpbGVkLgotXGVuZHttZXRob2RkZXNjfQotCi1QeXRob24gZGVmaW5lcyBzZXZlcmFsIGNvbnRleHQgbWFuYWdlcnMgdG8gc3VwcG9ydCBlYXN5IHRocmVhZAotc3luY2hyb25pc2F0aW9uLCBwcm9tcHQgY2xvc3VyZSBvZiBmaWxlcyBvciBvdGhlciBvYmplY3RzLCBhbmQKLXNpbXBsZXIgbWFuaXB1bGF0aW9uIG9mIHRoZSBhY3RpdmUgZGVjaW1hbCBhcml0aG1ldGljCi1jb250ZXh0LiBUaGUgc3BlY2lmaWMgdHlwZXMgYXJlIG5vdCB0cmVhdGVkIHNwZWNpYWxseSBiZXlvbmQKLXRoZWlyIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb250ZXh0IG1hbmFnZW1lbnQgcHJvdG9jb2wuCi0KLVB5dGhvbidzIGdlbmVyYXRvcnMgYW5kIHRoZSBcY29kZXtjb250ZXh0bGliLmNvbnRleHRmYWN0b3J5fSBkZWNvcmF0b3IKLXByb3ZpZGUgYSBjb252ZW5pZW50IHdheSB0byBpbXBsZW1lbnQgdGhlc2UgcHJvdG9jb2xzLiAgSWYgYSBnZW5lcmF0b3IKLWZ1bmN0aW9uIGlzIGRlY29yYXRlZCB3aXRoIHRoZSBcY29kZXtjb250ZXh0bGliLmNvbnRleHRmYWN0b3J5fQotZGVjb3JhdG9yLCBpdCB3aWxsIHJldHVybiBhIGNvbnRleHQgbWFuYWdlciBpbXBsZW1lbnRpbmcgdGhlIG5lY2Vzc2FyeQotXG1ldGhvZHtfX2VudGVyX18oKX0gYW5kIFxtZXRob2R7X19leGl0X18oKX0gbWV0aG9kcywgcmF0aGVyIHRoYW4gdGhlCi1pdGVyYXRvciBwcm9kdWNlZCBieSBhbiB1bmRlY29yYXRlZCBnZW5lcmF0b3IgZnVuY3Rpb24uCi0KLU5vdGUgdGhhdCB0aGVyZSBpcyBubyBzcGVjaWZpYyBzbG90IGZvciBhbnkgb2YgdGhlc2UgbWV0aG9kcyBpbiB0aGUKLXR5cGUgc3RydWN0dXJlIGZvciBQeXRob24gb2JqZWN0cyBpbiB0aGUgUHl0aG9uL0MgQVBJLiBFeHRlbnNpb24KLXR5cGVzIHdhbnRpbmcgdG8gZGVmaW5lIHRoZXNlIG1ldGhvZHMgbXVzdCBwcm92aWRlIHRoZW0gYXMgYSBub3JtYWwKLVB5dGhvbiBhY2Nlc3NpYmxlIG1ldGhvZC4gQ29tcGFyZWQgdG8gdGhlIG92ZXJoZWFkIG9mIHNldHRpbmcgdXAgdGhlCi1ydW50aW1lIGNvbnRleHQsIHRoZSBvdmVyaGVhZCBvZiBhIHNpbmdsZSBjbGFzcyBkaWN0aW9uYXJ5IGxvb2t1cAotaXMgbmVnbGlnaWJsZS4KLQotCi1cc2VjdGlvbntPdGhlciBCdWlsdC1pbiBUeXBlcyBcbGFiZWx7dHlwZXNvdGhlcn19Ci0KLVRoZSBpbnRlcnByZXRlciBzdXBwb3J0cyBzZXZlcmFsIG90aGVyIGtpbmRzIG9mIG9iamVjdHMuCi1Nb3N0IG9mIHRoZXNlIHN1cHBvcnQgb25seSBvbmUgb3IgdHdvIG9wZXJhdGlvbnMuCi0KLQotXHN1YnNlY3Rpb257TW9kdWxlcyBcbGFiZWx7dHlwZXNtb2R1bGVzfX0KLQotVGhlIG9ubHkgc3BlY2lhbCBvcGVyYXRpb24gb24gYSBtb2R1bGUgaXMgYXR0cmlidXRlIGFjY2VzczoKLVxjb2Rle1x2YXJ7bX0uXHZhcntuYW1lfX0sIHdoZXJlIFx2YXJ7bX0gaXMgYSBtb2R1bGUgYW5kIFx2YXJ7bmFtZX0KLWFjY2Vzc2VzIGEgbmFtZSBkZWZpbmVkIGluIFx2YXJ7bX0ncyBzeW1ib2wgdGFibGUuICBNb2R1bGUgYXR0cmlidXRlcwotY2FuIGJlIGFzc2lnbmVkIHRvLiAgKE5vdGUgdGhhdCB0aGUgXGtleXdvcmR7aW1wb3J0fSBzdGF0ZW1lbnQgaXMgbm90LAotc3RyaWN0bHkgc3BlYWtpbmcsIGFuIG9wZXJhdGlvbiBvbiBhIG1vZHVsZSBvYmplY3Q7IFxjb2Rle2ltcG9ydAotXHZhcntmb299fSBkb2VzIG5vdCByZXF1aXJlIGEgbW9kdWxlIG9iamVjdCBuYW1lZCBcdmFye2Zvb30gdG8gZXhpc3QsCi1yYXRoZXIgaXQgcmVxdWlyZXMgYW4gKGV4dGVybmFsKSBcZW1waHtkZWZpbml0aW9ufSBmb3IgYSBtb2R1bGUgbmFtZWQKLVx2YXJ7Zm9vfSBzb21ld2hlcmUuKQotCi1BIHNwZWNpYWwgbWVtYmVyIG9mIGV2ZXJ5IG1vZHVsZSBpcyBcbWVtYmVye19fZGljdF9ffS4KLVRoaXMgaXMgdGhlIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgbW9kdWxlJ3Mgc3ltYm9sIHRhYmxlLgotTW9kaWZ5aW5nIHRoaXMgZGljdGlvbmFyeSB3aWxsIGFjdHVhbGx5IGNoYW5nZSB0aGUgbW9kdWxlJ3Mgc3ltYm9sCi10YWJsZSwgYnV0IGRpcmVjdCBhc3NpZ25tZW50IHRvIHRoZSBcbWVtYmVye19fZGljdF9ffSBhdHRyaWJ1dGUgaXMgbm90Ci1wb3NzaWJsZSAoeW91IGNhbiB3cml0ZSBcY29kZXtcdmFye219Ll9fZGljdF9fWydhJ10gPSAxfSwgd2hpY2gKLWRlZmluZXMgXGNvZGV7XHZhcnttfS5hfSB0byBiZSBcY29kZXsxfSwgYnV0IHlvdSBjYW4ndCB3cml0ZQotXGNvZGV7XHZhcnttfS5fX2RpY3RfXyA9IFx7XH19KS4gIE1vZGlmeWluZyBcbWVtYmVye19fZGljdF9ffSBkaXJlY3RseQotaXMgbm90IHJlY29tbWVuZGVkLgotCi1Nb2R1bGVzIGJ1aWx0IGludG8gdGhlIGludGVycHJldGVyIGFyZSB3cml0dGVuIGxpa2UgdGhpczoKLVxjb2Rlezxtb2R1bGUgJ3N5cycgKGJ1aWx0LWluKT59LiAgSWYgbG9hZGVkIGZyb20gYSBmaWxlLCB0aGV5IGFyZQotd3JpdHRlbiBhcyBcY29kZXs8bW9kdWxlICdvcycgZnJvbQotJy91c3IvbG9jYWwvbGliL3B5dGhvblxzaG9ydHZlcnNpb24vb3MucHljJz59LgotCi0KLVxzdWJzZWN0aW9ue0NsYXNzZXMgYW5kIENsYXNzIEluc3RhbmNlcyBcbGFiZWx7dHlwZXNvYmplY3RzfX0KLVxub2RlbmFtZXtDbGFzc2VzIGFuZCBJbnN0YW5jZXN9Ci0KLVNlZSBjaGFwdGVycyAzIGFuZCA3IG9mIHRoZSBcY2l0ZXRpdGxlWy4uL3JlZi9yZWYuaHRtbF17UHl0aG9uCi1SZWZlcmVuY2UgTWFudWFsfSBmb3IgdGhlc2UuCi0KLQotXHN1YnNlY3Rpb257RnVuY3Rpb25zIFxsYWJlbHt0eXBlc2Z1bmN0aW9uc319Ci0KLUZ1bmN0aW9uIG9iamVjdHMgYXJlIGNyZWF0ZWQgYnkgZnVuY3Rpb24gZGVmaW5pdGlvbnMuICBUaGUgb25seQotb3BlcmF0aW9uIG9uIGEgZnVuY3Rpb24gb2JqZWN0IGlzIHRvIGNhbGwgaXQ6Ci1cY29kZXtcdmFye2Z1bmN9KFx2YXJ7YXJndW1lbnQtbGlzdH0pfS4KLQotVGhlcmUgYXJlIHJlYWxseSB0d28gZmxhdm9ycyBvZiBmdW5jdGlvbiBvYmplY3RzOiBidWlsdC1pbiBmdW5jdGlvbnMKLWFuZCB1c2VyLWRlZmluZWQgZnVuY3Rpb25zLiAgQm90aCBzdXBwb3J0IHRoZSBzYW1lIG9wZXJhdGlvbiAodG8gY2FsbAotdGhlIGZ1bmN0aW9uKSwgYnV0IHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBkaWZmZXJlbnQsIGhlbmNlIHRoZQotZGlmZmVyZW50IG9iamVjdCB0eXBlcy4KLQotU2VlIHRoZSBcY2l0ZXRpdGxlWy4uL3JlZi9yZWYuaHRtbF17UHl0aG9uIFJlZmVyZW5jZSBNYW51YWx9IGZvciBtb3JlCi1pbmZvcm1hdGlvbi4KLQotXHN1YnNlY3Rpb257TWV0aG9kcyBcbGFiZWx7dHlwZXNtZXRob2RzfX0KLVxvYmluZGV4e21ldGhvZH0KLQotTWV0aG9kcyBhcmUgZnVuY3Rpb25zIHRoYXQgYXJlIGNhbGxlZCB1c2luZyB0aGUgYXR0cmlidXRlIG5vdGF0aW9uLgotVGhlcmUgYXJlIHR3byBmbGF2b3JzOiBidWlsdC1pbiBtZXRob2RzIChzdWNoIGFzIFxtZXRob2R7YXBwZW5kKCl9IG9uCi1saXN0cykgYW5kIGNsYXNzIGluc3RhbmNlIG1ldGhvZHMuICBCdWlsdC1pbiBtZXRob2RzIGFyZSBkZXNjcmliZWQKLXdpdGggdGhlIHR5cGVzIHRoYXQgc3VwcG9ydCB0aGVtLgotCi1UaGUgaW1wbGVtZW50YXRpb24gYWRkcyB0d28gc3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlcyB0byBjbGFzcwotaW5zdGFuY2UgbWV0aG9kczogXGNvZGV7XHZhcnttfS5pbV9zZWxmfSBpcyB0aGUgb2JqZWN0IG9uIHdoaWNoIHRoZQotbWV0aG9kIG9wZXJhdGVzLCBhbmQgXGNvZGV7XHZhcnttfS5pbV9mdW5jfSBpcyB0aGUgZnVuY3Rpb24KLWltcGxlbWVudGluZyB0aGUgbWV0aG9kLiAgQ2FsbGluZyBcY29kZXtcdmFye219KFx2YXJ7YXJnLTF9LAotXHZhcnthcmctMn0sIFx0ZXh0cm17XGxkb3RzfSwgXHZhcnthcmctbn0pfSBpcyBjb21wbGV0ZWx5IGVxdWl2YWxlbnQgdG8KLWNhbGxpbmcgXGNvZGV7XHZhcnttfS5pbV9mdW5jKFx2YXJ7bX0uaW1fc2VsZiwgXHZhcnthcmctMX0sCi1cdmFye2FyZy0yfSwgXHRleHRybXtcbGRvdHN9LCBcdmFye2FyZy1ufSl9LgotCi1DbGFzcyBpbnN0YW5jZSBtZXRob2RzIGFyZSBlaXRoZXIgXGVtcGh7Ym91bmR9IG9yIFxlbXBoe3VuYm91bmR9LAotcmVmZXJyaW5nIHRvIHdoZXRoZXIgdGhlIG1ldGhvZCB3YXMgYWNjZXNzZWQgdGhyb3VnaCBhbiBpbnN0YW5jZSBvciBhCi1jbGFzcywgcmVzcGVjdGl2ZWx5LiAgV2hlbiBhIG1ldGhvZCBpcyB1bmJvdW5kLCBpdHMgXGNvZGV7aW1fc2VsZn0KLWF0dHJpYnV0ZSB3aWxsIGJlIFxjb2Rle05vbmV9IGFuZCBpZiBjYWxsZWQsIGFuIGV4cGxpY2l0IFxjb2Rle3NlbGZ9Ci1vYmplY3QgbXVzdCBiZSBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LiAgSW4gdGhpcyBjYXNlLAotXGNvZGV7c2VsZn0gbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiB0aGUgdW5ib3VuZCBtZXRob2QncyBjbGFzcyAob3IgYQotc3ViY2xhc3Mgb2YgdGhhdCBjbGFzcyksIG90aGVyd2lzZSBhIFxleGNlcHRpb257VHlwZUVycm9yfSBpcyByYWlzZWQuCi0KLUxpa2UgZnVuY3Rpb24gb2JqZWN0cywgbWV0aG9kcyBvYmplY3RzIHN1cHBvcnQgZ2V0dGluZwotYXJiaXRyYXJ5IGF0dHJpYnV0ZXMuICBIb3dldmVyLCBzaW5jZSBtZXRob2QgYXR0cmlidXRlcyBhcmUgYWN0dWFsbHkKLXN0b3JlZCBvbiB0aGUgdW5kZXJseWluZyBmdW5jdGlvbiBvYmplY3QgKFxjb2Rle21ldGguaW1fZnVuY30pLAotc2V0dGluZyBtZXRob2QgYXR0cmlidXRlcyBvbiBlaXRoZXIgYm91bmQgb3IgdW5ib3VuZCBtZXRob2RzIGlzCi1kaXNhbGxvd2VkLiAgQXR0ZW1wdGluZyB0byBzZXQgYSBtZXRob2QgYXR0cmlidXRlIHJlc3VsdHMgaW4gYQotXGV4Y2VwdGlvbntUeXBlRXJyb3J9IGJlaW5nIHJhaXNlZC4gIEluIG9yZGVyIHRvIHNldCBhIG1ldGhvZCBhdHRyaWJ1dGUsCi15b3UgbmVlZCB0byBleHBsaWNpdGx5IHNldCBpdCBvbiB0aGUgdW5kZXJseWluZyBmdW5jdGlvbiBvYmplY3Q6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWNsYXNzIEM6Ci0gICAgZGVmIG1ldGhvZChzZWxmKToKLSAgICAgICAgcGFzcwotCi1jID0gQygpCi1jLm1ldGhvZC5pbV9mdW5jLndob2FtaSA9ICdteSBuYW1lIGlzIGMnCi1cZW5ke3ZlcmJhdGltfQotCi1TZWUgdGhlIFxjaXRldGl0bGVbLi4vcmVmL3JlZi5odG1sXXtQeXRob24gUmVmZXJlbmNlIE1hbnVhbH0gZm9yIG1vcmUKLWluZm9ybWF0aW9uLgotCi0KLVxzdWJzZWN0aW9ue0NvZGUgT2JqZWN0cyBcbGFiZWx7Ymx0aW4tY29kZS1vYmplY3RzfX0KLVxvYmluZGV4e2NvZGV9Ci0KLUNvZGUgb2JqZWN0cyBhcmUgdXNlZCBieSB0aGUgaW1wbGVtZW50YXRpb24gdG8gcmVwcmVzZW50Ci1gYHBzZXVkby1jb21waWxlZCcnIGV4ZWN1dGFibGUgUHl0aG9uIGNvZGUgc3VjaCBhcyBhIGZ1bmN0aW9uIGJvZHkuCi1UaGV5IGRpZmZlciBmcm9tIGZ1bmN0aW9uIG9iamVjdHMgYmVjYXVzZSB0aGV5IGRvbid0IGNvbnRhaW4gYQotcmVmZXJlbmNlIHRvIHRoZWlyIGdsb2JhbCBleGVjdXRpb24gZW52aXJvbm1lbnQuICBDb2RlIG9iamVjdHMgYXJlCi1yZXR1cm5lZCBieSB0aGUgYnVpbHQtaW4gXGZ1bmN0aW9ue2NvbXBpbGUoKX0gZnVuY3Rpb24gYW5kIGNhbiBiZQotZXh0cmFjdGVkIGZyb20gZnVuY3Rpb24gb2JqZWN0cyB0aHJvdWdoIHRoZWlyIFxtZW1iZXJ7X19jb2RlX199Ci1hdHRyaWJ1dGUuCi1cYmlmdW5jaW5kZXh7Y29tcGlsZX0KLVx3aXRoc3ViaXRlbXsoZnVuY3Rpb24gb2JqZWN0IGF0dHJpYnV0ZSl9e1x0dGluZGV4e19fY29kZV9ffX0KLQotQSBjb2RlIG9iamVjdCBjYW4gYmUgZXhlY3V0ZWQgb3IgZXZhbHVhdGVkIGJ5IHBhc3NpbmcgaXQgKGluc3RlYWQgb2YgYQotc291cmNlIHN0cmluZykgdG8gdGhlIFxmdW5jdGlvbntleGVjKCl9IG9yIFxmdW5jdGlvbntldmFsKCl9IAotYnVpbHQtaW4gZnVuY3Rpb25zLgotXGJpZnVuY2luZGV4e2V4ZWN9Ci1cYmlmdW5jaW5kZXh7ZXZhbH0KLQotU2VlIHRoZSBcY2l0ZXRpdGxlWy4uL3JlZi9yZWYuaHRtbF17UHl0aG9uIFJlZmVyZW5jZSBNYW51YWx9IGZvciBtb3JlCi1pbmZvcm1hdGlvbi4KLQotCi1cc3Vic2VjdGlvbntUeXBlIE9iamVjdHMgXGxhYmVse2JsdGluLXR5cGUtb2JqZWN0c319Ci0KLVR5cGUgb2JqZWN0cyByZXByZXNlbnQgdGhlIHZhcmlvdXMgb2JqZWN0IHR5cGVzLiAgQW4gb2JqZWN0J3MgdHlwZSBpcwotYWNjZXNzZWQgYnkgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIFxmdW5jdGlvbnt0eXBlKCl9LiAgVGhlcmUgYXJlIG5vIHNwZWNpYWwKLW9wZXJhdGlvbnMgb24gdHlwZXMuICBUaGUgc3RhbmRhcmQgbW9kdWxlIFxyZWZtb2R1bGV7dHlwZXN9IGRlZmluZXMgbmFtZXMKLWZvciBhbGwgc3RhbmRhcmQgYnVpbHQtaW4gdHlwZXMuCi1cYmlmdW5jaW5kZXh7dHlwZX0KLVxyZWZzdG1vZGluZGV4e3R5cGVzfQotCi1UeXBlcyBhcmUgd3JpdHRlbiBsaWtlIHRoaXM6IFxjb2Rlezx0eXBlICdpbnQnPn0uCi0KLQotXHN1YnNlY3Rpb257VGhlIE51bGwgT2JqZWN0IFxsYWJlbHtibHRpbi1udWxsLW9iamVjdH19Ci0KLVRoaXMgb2JqZWN0IGlzIHJldHVybmVkIGJ5IGZ1bmN0aW9ucyB0aGF0IGRvbid0IGV4cGxpY2l0bHkgcmV0dXJuIGEKLXZhbHVlLiAgSXQgc3VwcG9ydHMgbm8gc3BlY2lhbCBvcGVyYXRpb25zLiAgVGhlcmUgaXMgZXhhY3RseSBvbmUgbnVsbAotb2JqZWN0LCBuYW1lZCBcY29kZXtOb25lfSAoYSBidWlsdC1pbiBuYW1lKS4KLQotSXQgaXMgd3JpdHRlbiBhcyBcY29kZXtOb25lfS4KLQotCi1cc3Vic2VjdGlvbntUaGUgRWxsaXBzaXMgT2JqZWN0IFxsYWJlbHtibHRpbi1lbGxpcHNpcy1vYmplY3R9fQotCi1UaGlzIG9iamVjdCBpcyBtb3N0bHkgdXNlZCBieSBleHRlbmRlZCBzbGljZSBub3RhdGlvbiAoc2VlIHRoZQotXGNpdGV0aXRsZVsuLi9yZWYvcmVmLmh0bWxde1B5dGhvbiBSZWZlcmVuY2UgTWFudWFsfSkuICBJdCBzdXBwb3J0cyBubwotc3BlY2lhbCBvcGVyYXRpb25zLiAgVGhlcmUgaXMgZXhhY3RseSBvbmUgZWxsaXBzaXMgb2JqZWN0LCBuYW1lZAotXGNvbnN0YW50e0VsbGlwc2lzfSAoYSBidWlsdC1pbiBuYW1lKS4KLQotSXQgaXMgd3JpdHRlbiBhcyBcY29kZXtFbGxpcHNpc30gb3IgXGNvZGV7Li4ufS4KLQotXHN1YnNlY3Rpb257Qm9vbGVhbiBWYWx1ZXN9Ci0KLUJvb2xlYW4gdmFsdWVzIGFyZSB0aGUgdHdvIGNvbnN0YW50IG9iamVjdHMgXGNvZGV7RmFsc2V9IGFuZAotXGNvZGV7VHJ1ZX0uICBUaGV5IGFyZSB1c2VkIHRvIHJlcHJlc2VudCB0cnV0aCB2YWx1ZXMgKGFsdGhvdWdoIG90aGVyCi12YWx1ZXMgY2FuIGFsc28gYmUgY29uc2lkZXJlZCBmYWxzZSBvciB0cnVlKS4gIEluIG51bWVyaWMgY29udGV4dHMKLShmb3IgZXhhbXBsZSB3aGVuIHVzZWQgYXMgdGhlIGFyZ3VtZW50IHRvIGFuIGFyaXRobWV0aWMgb3BlcmF0b3IpLAotdGhleSBiZWhhdmUgbGlrZSB0aGUgaW50ZWdlcnMgMCBhbmQgMSwgcmVzcGVjdGl2ZWx5LiAgVGhlIGJ1aWx0LWluCi1mdW5jdGlvbiBcZnVuY3Rpb257Ym9vbCgpfSBjYW4gYmUgdXNlZCB0byBjYXN0IGFueSB2YWx1ZSB0byBhIEJvb2xlYW4sCi1pZiB0aGUgdmFsdWUgY2FuIGJlIGludGVycHJldGVkIGFzIGEgdHJ1dGggdmFsdWUgKHNlZSBzZWN0aW9uIFRydXRoCi1WYWx1ZSBUZXN0aW5nIGFib3ZlKS4KLQotVGhleSBhcmUgd3JpdHRlbiBhcyBcY29kZXtGYWxzZX0gYW5kIFxjb2Rle1RydWV9LCByZXNwZWN0aXZlbHkuCi1caW5kZXh7RmFsc2V9Ci1caW5kZXh7VHJ1ZX0KLVxpbmRleGlpe0Jvb2xlYW59e3ZhbHVlc30KLQotCi1cc3Vic2VjdGlvbntJbnRlcm5hbCBPYmplY3RzIFxsYWJlbHt0eXBlc2ludGVybmFsfX0KLQotU2VlIHRoZSBcY2l0ZXRpdGxlWy4uL3JlZi9yZWYuaHRtbF17UHl0aG9uIFJlZmVyZW5jZSBNYW51YWx9IGZvciB0aGlzCi1pbmZvcm1hdGlvbi4gIEl0IGRlc2NyaWJlcyBzdGFjayBmcmFtZSBvYmplY3RzLCB0cmFjZWJhY2sgb2JqZWN0cywgYW5kCi1zbGljZSBvYmplY3RzLgotCi0KLVxzZWN0aW9ue1NwZWNpYWwgQXR0cmlidXRlcyBcbGFiZWx7c3BlY2lhbGF0dHJzfX0KLQotVGhlIGltcGxlbWVudGF0aW9uIGFkZHMgYSBmZXcgc3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlcyB0byBzZXZlcmFsCi1vYmplY3QgdHlwZXMsIHdoZXJlIHRoZXkgYXJlIHJlbGV2YW50LiAgU29tZSBvZiB0aGVzZSBhcmUgbm90IHJlcG9ydGVkCi1ieSB0aGUgXGZ1bmN0aW9ue2RpcigpfSBidWlsdC1pbiBmdW5jdGlvbi4KLQotXGJlZ2lue21lbWJlcmRlc2N9W29iamVjdF17X19kaWN0X199Ci1BIGRpY3Rpb25hcnkgb3Igb3RoZXIgbWFwcGluZyBvYmplY3QgdXNlZCB0byBzdG9yZSBhbgotb2JqZWN0J3MgKHdyaXRhYmxlKSBhdHRyaWJ1dGVzLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31baW5zdGFuY2Vde19fY2xhc3NfX30KLVRoZSBjbGFzcyB0byB3aGljaCBhIGNsYXNzIGluc3RhbmNlIGJlbG9uZ3MuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtjbGFzc117X19iYXNlc19ffQotVGhlIHR1cGxlIG9mIGJhc2UgY2xhc3NlcyBvZiBhIGNsYXNzIG9iamVjdC4gIElmIHRoZXJlIGFyZSBubyBiYXNlCi1jbGFzc2VzLCB0aGlzIHdpbGwgYmUgYW4gZW1wdHkgdHVwbGUuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtjbGFzc117X19uYW1lX199Ci1UaGUgbmFtZSBvZiB0aGUgY2xhc3Mgb3IgdHlwZS4KLVxlbmR7bWVtYmVyZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic3RyaW5nLnRleCBiL0RvYy9saWIvbGlic3RyaW5nLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk0OGNiNy4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnN0cmluZy50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw0MjUgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtzdHJpbmd9IC0tLQotICAgICAgICAgQ29tbW9uIHN0cmluZyBvcGVyYXRpb25zfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17c3RyaW5nfQotXG1vZHVsZXN5bm9wc2lze0NvbW1vbiBzdHJpbmcgb3BlcmF0aW9ucy59Ci0KLVRoZSBcbW9kdWxle3N0cmluZ30gbW9kdWxlIGNvbnRhaW5zIGEgbnVtYmVyIG9mIHVzZWZ1bCBjb25zdGFudHMgYW5kIGNsYXNzZXMsCi1hcyB3ZWxsIGFzIHNvbWUgZGVwcmVjYXRlZCBsZWdhY3kgZnVuY3Rpb25zIHRoYXQgYXJlIGFsc28gYXZhaWxhYmxlIGFzIG1ldGhvZHMKLW9uIHN0cmluZ3MuICBTZWUgdGhlIG1vZHVsZSBccmVmbW9kdWxle3JlfVxyZWZzdG1vZGluZGV4e3JlfSBmb3Igc3RyaW5nCi1mdW5jdGlvbnMgYmFzZWQgb24gcmVndWxhciBleHByZXNzaW9ucy4KLQotXHN1YnNlY3Rpb257U3RyaW5nIGNvbnN0YW50c30KLQotVGhlIGNvbnN0YW50cyBkZWZpbmVkIGluIHRoaXMgbW9kdWxlIGFyZToKLQotXGJlZ2lue2RhdGFkZXNjfXthc2NpaVxfbGV0dGVyc30KLSAgVGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIFxjb25zdGFudHthc2NpaV9sb3dlcmNhc2V9IGFuZAotICBcY29uc3RhbnR7YXNjaWlfdXBwZXJjYXNlfSBjb25zdGFudHMgZGVzY3JpYmVkIGJlbG93LiAgVGhpcyB2YWx1ZSBpcwotICBub3QgbG9jYWxlLWRlcGVuZGVudC4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317YXNjaWlcX2xvd2VyY2FzZX0KLSAgVGhlIGxvd2VyY2FzZSBsZXR0ZXJzIFxjb2RleydhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eid9LiAgVGhpcwotICB2YWx1ZSBpcyBub3QgbG9jYWxlLWRlcGVuZGVudCBhbmQgd2lsbCBub3QgY2hhbmdlLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXthc2NpaVxfdXBwZXJjYXNlfQotICBUaGUgdXBwZXJjYXNlIGxldHRlcnMgXGNvZGV7J0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ30uICBUaGlzCi0gIHZhbHVlIGlzIG5vdCBsb2NhbGUtZGVwZW5kZW50IGFuZCB3aWxsIG5vdCBjaGFuZ2UuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e2RpZ2l0c30KLSAgVGhlIHN0cmluZyBcY29kZXsnMDEyMzQ1Njc4OSd9LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtoZXhkaWdpdHN9Ci0gIFRoZSBzdHJpbmcgXGNvZGV7JzAxMjM0NTY3ODlhYmNkZWZBQkNERUYnfS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317b2N0ZGlnaXRzfQotICBUaGUgc3RyaW5nIFxjb2RleycwMTIzNDU2Nyd9LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtwdW5jdHVhdGlvbn0KLSAgU3RyaW5nIG9mIFxBU0NJSXt9IGNoYXJhY3RlcnMgd2hpY2ggYXJlIGNvbnNpZGVyZWQgcHVuY3R1YXRpb24KLSAgY2hhcmFjdGVycyBpbiB0aGUgXHNhbXB7Q30gbG9jYWxlLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtwcmludGFibGV9Ci0gIFN0cmluZyBvZiBjaGFyYWN0ZXJzIHdoaWNoIGFyZSBjb25zaWRlcmVkIHByaW50YWJsZS4gIFRoaXMgaXMgYQotICBjb21iaW5hdGlvbiBvZiBcY29uc3RhbnR7ZGlnaXRzfSwgXGNvbnN0YW50e2xldHRlcnN9LAotICBcY29uc3RhbnR7cHVuY3R1YXRpb259LCBhbmQgXGNvbnN0YW50e3doaXRlc3BhY2V9LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXt3aGl0ZXNwYWNlfQotICBBIHN0cmluZyBjb250YWluaW5nIGFsbCBjaGFyYWN0ZXJzIHRoYXQgYXJlIGNvbnNpZGVyZWQgd2hpdGVzcGFjZS4KLSAgT24gbW9zdCBzeXN0ZW1zIHRoaXMgaW5jbHVkZXMgdGhlIGNoYXJhY3RlcnMgc3BhY2UsIHRhYiwgbGluZWZlZWQsCi0gIHJldHVybiwgZm9ybWZlZWQsIGFuZCB2ZXJ0aWNhbCB0YWIuICBEbyBub3QgY2hhbmdlIGl0cyBkZWZpbml0aW9uIC0tLQotICB0aGUgZWZmZWN0IG9uIHRoZSByb3V0aW5lcyBcZnVuY3Rpb257c3RyaXAoKX0gYW5kIFxmdW5jdGlvbntzcGxpdCgpfQotICBpcyB1bmRlZmluZWQuCi1cZW5ke2RhdGFkZXNjfQotCi1cc3Vic2VjdGlvbntUZW1wbGF0ZSBzdHJpbmdzfQotCi1UZW1wbGF0ZXMgcHJvdmlkZSBzaW1wbGVyIHN0cmluZyBzdWJzdGl0dXRpb25zIGFzIGRlc2NyaWJlZCBpbiBccGVwezI5Mn0uCi1JbnN0ZWFkIG9mIHRoZSBub3JtYWwgXHNhbXB7XCV9LWJhc2VkIHN1YnN0aXR1dGlvbnMsIFRlbXBsYXRlcyBzdXBwb3J0Ci1cc2FtcHtcJH0tYmFzZWQgc3Vic3RpdHV0aW9ucywgdXNpbmcgdGhlIGZvbGxvd2luZyBydWxlczoKLQotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSBcc2FtcHtcJFwkfSBpcyBhbiBlc2NhcGU7IGl0IGlzIHJlcGxhY2VkIHdpdGggYSBzaW5nbGUgXHNhbXB7XCR9LgotCi1caXRlbSBcc2FtcHtcJGlkZW50aWZpZXJ9IG5hbWVzIGEgc3Vic3RpdHV0aW9uIHBsYWNlaG9sZGVyIG1hdGNoaW5nIGEgbWFwcGluZwotICAgICAgIGtleSBvZiAiaWRlbnRpZmllciIuICBCeSBkZWZhdWx0LCAiaWRlbnRpZmllciIgbXVzdCBzcGVsbCBhIFB5dGhvbgotICAgICAgIGlkZW50aWZpZXIuICBUaGUgZmlyc3Qgbm9uLWlkZW50aWZpZXIgY2hhcmFjdGVyIGFmdGVyIHRoZSBcc2FtcHtcJH0KLSAgICAgICBjaGFyYWN0ZXIgdGVybWluYXRlcyB0aGlzIHBsYWNlaG9sZGVyIHNwZWNpZmljYXRpb24uCi0KLVxpdGVtIFxzYW1we1wkXHtpZGVudGlmaWVyXH19IGlzIGVxdWl2YWxlbnQgdG8gXHNhbXB7XCRpZGVudGlmaWVyfS4gIEl0IGlzCi0gICAgICByZXF1aXJlZCB3aGVuIHZhbGlkIGlkZW50aWZpZXIgY2hhcmFjdGVycyBmb2xsb3cgdGhlIHBsYWNlaG9sZGVyIGJ1dCBhcmUKLSAgICAgIG5vdCBwYXJ0IG9mIHRoZSBwbGFjZWhvbGRlciwgc3VjaCBhcyAiXCRce25vdW5cfWlmaWNhdGlvbiIuCi1cZW5ke2l0ZW1pemV9Ci0KLUFueSBvdGhlciBhcHBlYXJhbmNlIG9mIFxzYW1we1wkfSBpbiB0aGUgc3RyaW5nIHdpbGwgcmVzdWx0IGluIGEKLVxleGNlcHRpb257VmFsdWVFcnJvcn0gYmVpbmcgcmFpc2VkLgotCi1cdmVyc2lvbmFkZGVkezIuNH0KLQotVGhlIFxtb2R1bGV7c3RyaW5nfSBtb2R1bGUgcHJvdmlkZXMgYSBcY2xhc3N7VGVtcGxhdGV9IGNsYXNzIHRoYXQgaW1wbGVtZW50cwotdGhlc2UgcnVsZXMuICBUaGUgbWV0aG9kcyBvZiBcY2xhc3N7VGVtcGxhdGV9IGFyZToKLQotXGJlZ2lue2NsYXNzZGVzY317VGVtcGxhdGV9e3RlbXBsYXRlfQotVGhlIGNvbnN0cnVjdG9yIHRha2VzIGEgc2luZ2xlIGFyZ3VtZW50IHdoaWNoIGlzIHRoZSB0ZW1wbGF0ZSBzdHJpbmcuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1RlbXBsYXRlXXtzdWJzdGl0dXRlfXttYXBwaW5nXG9wdGlvbmFseywgKiprd3N9fQotUGVyZm9ybXMgdGhlIHRlbXBsYXRlIHN1YnN0aXR1dGlvbiwgcmV0dXJuaW5nIGEgbmV3IHN0cmluZy4gIFx2YXJ7bWFwcGluZ30gaXMKLWFueSBkaWN0aW9uYXJ5LWxpa2Ugb2JqZWN0IHdpdGgga2V5cyB0aGF0IG1hdGNoIHRoZSBwbGFjZWhvbGRlcnMgaW4gdGhlCi10ZW1wbGF0ZS4gIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gcHJvdmlkZSBrZXl3b3JkIGFyZ3VtZW50cywgd2hlcmUgdGhlCi1rZXl3b3JkcyBhcmUgdGhlIHBsYWNlaG9sZGVycy4gIFdoZW4gYm90aCBcdmFye21hcHBpbmd9IGFuZCBcdmFye2t3c30gYXJlCi1naXZlbiBhbmQgdGhlcmUgYXJlIGR1cGxpY2F0ZXMsIHRoZSBwbGFjZWhvbGRlcnMgZnJvbSBcdmFye2t3c30gdGFrZQotcHJlY2VkZW5jZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1RlbXBsYXRlXXtzYWZlX3N1YnN0aXR1dGV9e21hcHBpbmdcb3B0aW9uYWx7LCAqKmt3c319Ci1MaWtlIFxtZXRob2R7c3Vic3RpdHV0ZSgpfSwgZXhjZXB0IHRoYXQgaWYgcGxhY2Vob2xkZXJzIGFyZSBtaXNzaW5nIGZyb20KLVx2YXJ7bWFwcGluZ30gYW5kIFx2YXJ7a3dzfSwgaW5zdGVhZCBvZiByYWlzaW5nIGEgXGV4Y2VwdGlvbntLZXlFcnJvcn0KLWV4Y2VwdGlvbiwgdGhlIG9yaWdpbmFsIHBsYWNlaG9sZGVyIHdpbGwgYXBwZWFyIGluIHRoZSByZXN1bHRpbmcgc3RyaW5nCi1pbnRhY3QuICBBbHNvLCB1bmxpa2Ugd2l0aCBcbWV0aG9ke3N1YnN0aXR1dGUoKX0sIGFueSBvdGhlciBhcHBlYXJhbmNlcyBvZiB0aGUKLVxzYW1we1wkfSB3aWxsIHNpbXBseSByZXR1cm4gXHNhbXB7XCR9IGluc3RlYWQgb2YgcmFpc2luZwotXGV4Y2VwdGlvbntWYWx1ZUVycm9yfS4KLQotV2hpbGUgb3RoZXIgZXhjZXB0aW9ucyBtYXkgc3RpbGwgb2NjdXIsIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBgYHNhZmUnJyBiZWNhdXNlCi1zdWJzdGl0dXRpb25zIGFsd2F5cyB0cmllcyB0byByZXR1cm4gYSB1c2FibGUgc3RyaW5nIGluc3RlYWQgb2YgcmFpc2luZyBhbgotZXhjZXB0aW9uLiAgSW4gYW5vdGhlciBzZW5zZSwgXG1ldGhvZHtzYWZlX3N1YnN0aXR1dGUoKX0gbWF5IGJlIGFueXRoaW5nIG90aGVyCi10aGFuIHNhZmUsIHNpbmNlIGl0IHdpbGwgc2lsZW50bHkgaWdub3JlIG1hbGZvcm1lZCB0ZW1wbGF0ZXMgY29udGFpbmluZwotZGFuZ2xpbmcgZGVsaW1pdGVycywgdW5tYXRjaGVkIGJyYWNlcywgb3IgcGxhY2Vob2xkZXJzIHRoYXQgYXJlIG5vdCB2YWxpZAotUHl0aG9uIGlkZW50aWZpZXJzLgotXGVuZHttZXRob2RkZXNjfQotCi1cY2xhc3N7VGVtcGxhdGV9IGluc3RhbmNlcyBhbHNvIHByb3ZpZGUgb25lIHB1YmxpYyBkYXRhIGF0dHJpYnV0ZToKLQotXGJlZ2lue21lbWJlcmRlc2N9W3N0cmluZ117dGVtcGxhdGV9Ci1UaGlzIGlzIHRoZSBvYmplY3QgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvcidzIFx2YXJ7dGVtcGxhdGV9IGFyZ3VtZW50LiAgSW4KLWdlbmVyYWwsIHlvdSBzaG91bGRuJ3QgY2hhbmdlIGl0LCBidXQgcmVhZC1vbmx5IGFjY2VzcyBpcyBub3QgZW5mb3JjZWQuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLUhlcmUgaXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gdXNlIGEgVGVtcGxhdGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBmcm9tIHN0cmluZyBpbXBvcnQgVGVtcGxhdGUKLT4+PiBzID0gVGVtcGxhdGUoJyR3aG8gbGlrZXMgJHdoYXQnKQotPj4+IHMuc3Vic3RpdHV0ZSh3aG89J3RpbScsIHdoYXQ9J2t1bmcgcGFvJykKLSd0aW0gbGlrZXMga3VuZyBwYW8nCi0+Pj4gZCA9IGRpY3Qod2hvPSd0aW0nKQotPj4+IFRlbXBsYXRlKCdHaXZlICR3aG8gJDEwMCcpLnN1YnN0aXR1dGUoZCkKLVRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLVsuLi5dCi1WYWx1ZUVycm9yOiBJbnZhbGlkIHBsYWNlaG9sZGVyIGluIHN0cmluZzogbGluZSAxLCBjb2wgMTAKLT4+PiBUZW1wbGF0ZSgnJHdobyBsaWtlcyAkd2hhdCcpLnN1YnN0aXR1dGUoZCkKLVRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLVsuLi5dCi1LZXlFcnJvcjogJ3doYXQnCi0+Pj4gVGVtcGxhdGUoJyR3aG8gbGlrZXMgJHdoYXQnKS5zYWZlX3N1YnN0aXR1dGUoZCkKLSd0aW0gbGlrZXMgJHdoYXQnCi1cZW5ke3ZlcmJhdGltfQotCi1BZHZhbmNlZCB1c2FnZTogeW91IGNhbiBkZXJpdmUgc3ViY2xhc3NlcyBvZiBcY2xhc3N7VGVtcGxhdGV9IHRvIGN1c3RvbWl6ZSB0aGUKLXBsYWNlaG9sZGVyIHN5bnRheCwgZGVsaW1pdGVyIGNoYXJhY3Rlciwgb3IgdGhlIGVudGlyZSByZWd1bGFyIGV4cHJlc3Npb24gdXNlZAotdG8gcGFyc2UgdGVtcGxhdGUgc3RyaW5ncy4gIFRvIGRvIHRoaXMsIHlvdSBjYW4gb3ZlcnJpZGUgdGhlc2UgY2xhc3MKLWF0dHJpYnV0ZXM6Ci0KLVxiZWdpbntpdGVtaXplfQotXGl0ZW0gXHZhcntkZWxpbWl0ZXJ9IC0tIFRoaXMgaXMgdGhlIGxpdGVyYWwgc3RyaW5nIGRlc2NyaWJpbmcgYSBwbGFjZWhvbGRlcgotICAgICAgaW50cm9kdWNpbmcgZGVsaW1pdGVyLiAgVGhlIGRlZmF1bHQgdmFsdWUgXHNhbXB7XCR9LiAgTm90ZSB0aGF0IHRoaXMKLSAgICAgIHNob3VsZCBcZW1waHtub3R9IGJlIGEgcmVndWxhciBleHByZXNzaW9uLCBhcyB0aGUgaW1wbGVtZW50YXRpb24gd2lsbAotICAgICAgY2FsbCBcbWV0aG9ke3JlLmVzY2FwZSgpfSBvbiB0aGlzIHN0cmluZyBhcyBuZWVkZWQuCi1caXRlbSBcdmFye2lkcGF0dGVybn0gLS0gVGhpcyBpcyB0aGUgcmVndWxhciBleHByZXNzaW9uIGRlc2NyaWJpbmcgdGhlIHBhdHRlcm4KLSAgICAgIGZvciBub24tYnJhY2VkIHBsYWNlaG9sZGVycyAodGhlIGJyYWNlcyB3aWxsIGJlIGFkZGVkIGF1dG9tYXRpY2FsbHkgYXMKLSAgICAgIGFwcHJvcHJpYXRlKS4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24KLSAgICAgIFxzYW1we1tfYS16XVtfYS16MC05XSp9LgotXGVuZHtpdGVtaXplfQotCi1BbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHByb3ZpZGUgdGhlIGVudGlyZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiBieQotb3ZlcnJpZGluZyB0aGUgY2xhc3MgYXR0cmlidXRlIFx2YXJ7cGF0dGVybn0uICBJZiB5b3UgZG8gdGhpcywgdGhlIHZhbHVlIG11c3QKLWJlIGEgcmVndWxhciBleHByZXNzaW9uIG9iamVjdCB3aXRoIGZvdXIgbmFtZWQgY2FwdHVyaW5nIGdyb3Vwcy4gIFRoZQotY2FwdHVyaW5nIGdyb3VwcyBjb3JyZXNwb25kIHRvIHRoZSBydWxlcyBnaXZlbiBhYm92ZSwgYWxvbmcgd2l0aCB0aGUgaW52YWxpZAotcGxhY2Vob2xkZXIgcnVsZToKLQotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSBcdmFye2VzY2FwZWR9IC0tIFRoaXMgZ3JvdXAgbWF0Y2hlcyB0aGUgZXNjYXBlIHNlcXVlbmNlLAotICAgICAgZS5nLiBcc2FtcHtcJFwkfSwgaW4gdGhlIGRlZmF1bHQgcGF0dGVybi4KLVxpdGVtIFx2YXJ7bmFtZWR9IC0tIFRoaXMgZ3JvdXAgbWF0Y2hlcyB0aGUgdW5icmFjZWQgcGxhY2Vob2xkZXIgbmFtZTsgaXQKLSAgICAgIHNob3VsZCBub3QgaW5jbHVkZSB0aGUgZGVsaW1pdGVyIGluIGNhcHR1cmluZyBncm91cC4KLVxpdGVtIFx2YXJ7YnJhY2VkfSAtLSBUaGlzIGdyb3VwIG1hdGNoZXMgdGhlIGJyYWNlIGVuY2xvc2VkIHBsYWNlaG9sZGVyIG5hbWU7Ci0gICAgICBpdCBzaG91bGQgbm90IGluY2x1ZGUgZWl0aGVyIHRoZSBkZWxpbWl0ZXIgb3IgYnJhY2VzIGluIHRoZSBjYXB0dXJpbmcKLSAgICAgIGdyb3VwLgotXGl0ZW0gXHZhcntpbnZhbGlkfSAtLSBUaGlzIGdyb3VwIG1hdGNoZXMgYW55IG90aGVyIGRlbGltaXRlciBwYXR0ZXJuICh1c3VhbGx5Ci0gICAgICBhIHNpbmdsZSBkZWxpbWl0ZXIpLCBhbmQgaXQgc2hvdWxkIGFwcGVhciBsYXN0IGluIHRoZSByZWd1bGFyCi0gICAgICBleHByZXNzaW9uLgotXGVuZHtpdGVtaXplfQotCi1cc3Vic2VjdGlvbntTdHJpbmcgZnVuY3Rpb25zfQotCi1UaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlIHRvIG9wZXJhdGUgb24gc3RyaW5nIGFuZCBVbmljb2RlCi1vYmplY3RzLiAgVGhleSBhcmUgbm90IGF2YWlsYWJsZSBhcyBzdHJpbmcgbWV0aG9kcy4KLQotXGJlZ2lue2Z1bmNkZXNjfXtjYXB3b3Jkc317c30KLSAgU3BsaXQgdGhlIGFyZ3VtZW50IGludG8gd29yZHMgdXNpbmcgXGZ1bmN0aW9ue3NwbGl0KCl9LCBjYXBpdGFsaXplCi0gIGVhY2ggd29yZCB1c2luZyBcZnVuY3Rpb257Y2FwaXRhbGl6ZSgpfSwgYW5kIGpvaW4gdGhlIGNhcGl0YWxpemVkCi0gIHdvcmRzIHVzaW5nIFxmdW5jdGlvbntqb2luKCl9LiAgTm90ZSB0aGF0IHRoaXMgcmVwbGFjZXMgcnVucyBvZgotICB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgYnkgYSBzaW5nbGUgc3BhY2UsIGFuZCByZW1vdmVzIGxlYWRpbmcgYW5kCi0gIHRyYWlsaW5nIHdoaXRlc3BhY2UuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e21ha2V0cmFuc317ZnJvbSwgdG99Ci0gIFJldHVybiBhIHRyYW5zbGF0aW9uIHRhYmxlIHN1aXRhYmxlIGZvciBwYXNzaW5nIHRvCi0gIFxmdW5jdGlvbnt0cmFuc2xhdGUoKX0sIHRoYXQgd2lsbCBtYXAKLSAgZWFjaCBjaGFyYWN0ZXIgaW4gXHZhcntmcm9tfSBpbnRvIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIHNhbWUgcG9zaXRpb24KLSAgaW4gXHZhcnt0b307IFx2YXJ7ZnJvbX0gYW5kIFx2YXJ7dG99IG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGguCi0KLSAgXHdhcm5pbmd7RG9uJ3QgdXNlIHN0cmluZ3MgZGVyaXZlZCBmcm9tIFxjb25zdGFudHtsb3dlcmNhc2V9Ci0gIGFuZCBcY29uc3RhbnR7dXBwZXJjYXNlfSBhcyBhcmd1bWVudHM7IGluIHNvbWUgbG9jYWxlcywgdGhlc2UgZG9uJ3QgaGF2ZQotICB0aGUgc2FtZSBsZW5ndGguICBGb3IgY2FzZSBjb252ZXJzaW9ucywgYWx3YXlzIHVzZQotICBcZnVuY3Rpb257bG93ZXIoKX0gYW5kIFxmdW5jdGlvbnt1cHBlcigpfS59Ci1cZW5ke2Z1bmNkZXNjfQotCi1cc3Vic2VjdGlvbntEZXByZWNhdGVkIHN0cmluZyBmdW5jdGlvbnN9Ci0KLVRoZSBmb2xsb3dpbmcgbGlzdCBvZiBmdW5jdGlvbnMgYXJlIGFsc28gZGVmaW5lZCBhcyBtZXRob2RzIG9mIHN0cmluZyBhbmQKLVVuaWNvZGUgb2JqZWN0czsgc2VlIGBgU3RyaW5nIE1ldGhvZHMnJyAoc2VjdGlvbgotXHJlZntzdHJpbmctbWV0aG9kc30pIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRob3NlLiAgWW91IHNob3VsZCBjb25zaWRlcgotdGhlc2UgZnVuY3Rpb25zIGFzIGRlcHJlY2F0ZWQsIGFsdGhvdWdoIHRoZXkgd2lsbCBub3QgYmUgcmVtb3ZlZCB1bnRpbCBQeXRob24KLTMuMC4gIFRoZSBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGlzIG1vZHVsZSBhcmU6Ci0KLVxiZWdpbntmdW5jZGVzY317YXRvZn17c30KLSAgXGRlcHJlY2F0ZWR7Mi4wfXtVc2UgdGhlIFxmdW5jdGlvbntmbG9hdCgpfSBidWlsdC1pbiBmdW5jdGlvbi59Ci0gIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBmbG9hdGluZyBwb2ludCBudW1iZXIuICBUaGUgc3RyaW5nIG11c3QgaGF2ZQotICB0aGUgc3RhbmRhcmQgc3ludGF4IGZvciBhIGZsb2F0aW5nIHBvaW50IGxpdGVyYWwgaW4gUHl0aG9uLAotICBvcHRpb25hbGx5IHByZWNlZGVkIGJ5IGEgc2lnbiAoXHNhbXB7K30gb3IgXHNhbXB7LX0pLiAgTm90ZSB0aGF0Ci0gIHRoaXMgYmVoYXZlcyBpZGVudGljYWwgdG8gdGhlIGJ1aWx0LWluIGZ1bmN0aW9uCi0gIFxmdW5jdGlvbntmbG9hdCgpfVxiaWZ1bmNpbmRleHtmbG9hdH0gd2hlbiBwYXNzZWQgYSBzdHJpbmcuCi0KLSAgXG5vdGV7V2hlbiBwYXNzaW5nIGluIGEgc3RyaW5nLCB2YWx1ZXMgZm9yIE5hTlxpbmRleHtOYU59Ci0gIGFuZCBJbmZpbml0eVxpbmRleHtJbmZpbml0eX0gbWF5IGJlIHJldHVybmVkLCBkZXBlbmRpbmcgb24gdGhlCi0gIHVuZGVybHlpbmcgQyBsaWJyYXJ5LiAgVGhlIHNwZWNpZmljIHNldCBvZiBzdHJpbmdzIGFjY2VwdGVkIHdoaWNoCi0gIGNhdXNlIHRoZXNlIHZhbHVlcyB0byBiZSByZXR1cm5lZCBkZXBlbmRzIGVudGlyZWx5IG9uIHRoZSBDIGxpYnJhcnkKLSAgYW5kIGlzIGtub3duIHRvIHZhcnkufQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXthdG9pfXtzXG9wdGlvbmFseywgYmFzZX19Ci0gIFxkZXByZWNhdGVkezIuMH17VXNlIHRoZSBcZnVuY3Rpb257aW50KCl9IGJ1aWx0LWluIGZ1bmN0aW9uLn0KLSAgQ29udmVydCBzdHJpbmcgXHZhcntzfSB0byBhbiBpbnRlZ2VyIGluIHRoZSBnaXZlbiBcdmFye2Jhc2V9LiAgVGhlCi0gIHN0cmluZyBtdXN0IGNvbnNpc3Qgb2Ygb25lIG9yIG1vcmUgZGlnaXRzLCBvcHRpb25hbGx5IHByZWNlZGVkIGJ5IGEKLSAgc2lnbiAoXHNhbXB7K30gb3IgXHNhbXB7LX0pLiAgVGhlIFx2YXJ7YmFzZX0gZGVmYXVsdHMgdG8gMTAuICBJZiBpdAotICBpcyAwLCBhIGRlZmF1bHQgYmFzZSBpcyBjaG9zZW4gZGVwZW5kaW5nIG9uIHRoZSBsZWFkaW5nIGNoYXJhY3RlcnMKLSAgb2YgdGhlIHN0cmluZyAoYWZ0ZXIgc3RyaXBwaW5nIHRoZSBzaWduKTogXHNhbXB7MHh9IG9yIFxzYW1wezBYfQotICBtZWFucyAxNiwgXHNhbXB7MH0gbWVhbnMgOCwgYW55dGhpbmcgZWxzZSBtZWFucyAxMC4gIElmIFx2YXJ7YmFzZX0KLSAgaXMgMTYsIGEgbGVhZGluZyBcc2FtcHsweH0gb3IgXHNhbXB7MFh9IGlzIGFsd2F5cyBhY2NlcHRlZCwgdGhvdWdoCi0gIG5vdCByZXF1aXJlZC4gIFRoaXMgYmVoYXZlcyBpZGVudGljYWxseSB0byB0aGUgYnVpbHQtaW4gZnVuY3Rpb24KLSAgXGZ1bmN0aW9ue2ludCgpfSB3aGVuIHBhc3NlZCBhIHN0cmluZy4gIChBbHNvIG5vdGU6IGZvciBhIG1vcmUKLSAgZmxleGlibGUgaW50ZXJwcmV0YXRpb24gb2YgbnVtZXJpYyBsaXRlcmFscywgdXNlIHRoZSBidWlsdC1pbgotICBmdW5jdGlvbiBcZnVuY3Rpb257ZXZhbCgpfVxiaWZ1bmNpbmRleHtldmFsfS4pCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2F0b2x9e3Ncb3B0aW9uYWx7LCBiYXNlfX0KLSAgXGRlcHJlY2F0ZWR7Mi4wfXtVc2UgdGhlIFxmdW5jdGlvbntsb25nKCl9IGJ1aWx0LWluIGZ1bmN0aW9uLn0KLSAgQ29udmVydCBzdHJpbmcgXHZhcntzfSB0byBhIGxvbmcgaW50ZWdlciBpbiB0aGUgZ2l2ZW4gXHZhcntiYXNlfS4KLSAgVGhlIHN0cmluZyBtdXN0IGNvbnNpc3Qgb2Ygb25lIG9yIG1vcmUgZGlnaXRzLCBvcHRpb25hbGx5IHByZWNlZGVkCi0gIGJ5IGEgc2lnbiAoXHNhbXB7K30gb3IgXHNhbXB7LX0pLiAgVGhlIFx2YXJ7YmFzZX0gYXJndW1lbnQgaGFzIHRoZQotICBzYW1lIG1lYW5pbmcgYXMgZm9yIFxmdW5jdGlvbnthdG9pKCl9LiAgQSB0cmFpbGluZyBcc2FtcHtsfSBvcgotICBcc2FtcHtMfSBpcyBub3QgYWxsb3dlZCwgZXhjZXB0IGlmIHRoZSBiYXNlIGlzIDAuICBOb3RlIHRoYXQgd2hlbgotICBpbnZva2VkIHdpdGhvdXQgXHZhcntiYXNlfSBvciB3aXRoIFx2YXJ7YmFzZX0gc2V0IHRvIDEwLCB0aGlzCi0gIGJlaGF2ZXMgaWRlbnRpY2FsIHRvIHRoZSBidWlsdC1pbiBmdW5jdGlvbgotICBcZnVuY3Rpb257bG9uZygpfVxiaWZ1bmNpbmRleHtsb25nfSB3aGVuIHBhc3NlZCBhIHN0cmluZy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y2FwaXRhbGl6ZX17d29yZH0KLSAgUmV0dXJuIGEgY29weSBvZiBcdmFye3dvcmR9IHdpdGggb25seSBpdHMgZmlyc3QgY2hhcmFjdGVyIGNhcGl0YWxpemVkLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtleHBhbmR0YWJzfXtzXG9wdGlvbmFseywgdGFic2l6ZX19Ci0gIEV4cGFuZCB0YWJzIGluIGEgc3RyaW5nIHJlcGxhY2luZyB0aGVtIGJ5IG9uZSBvciBtb3JlIHNwYWNlcywKLSAgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGNvbHVtbiBhbmQgdGhlIGdpdmVuIHRhYiBzaXplLiAgVGhlIGNvbHVtbgotICBudW1iZXIgaXMgcmVzZXQgdG8gemVybyBhZnRlciBlYWNoIG5ld2xpbmUgb2NjdXJyaW5nIGluIHRoZSBzdHJpbmcuCi0gIFRoaXMgZG9lc24ndCB1bmRlcnN0YW5kIG90aGVyIG5vbi1wcmludGluZyBjaGFyYWN0ZXJzIG9yIGVzY2FwZQotICBzZXF1ZW5jZXMuICBUaGUgdGFiIHNpemUgZGVmYXVsdHMgdG8gOC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZmluZH17cywgc3ViXG9wdGlvbmFseywgc3RhcnRcb3B0aW9uYWx7LGVuZH19fQotICBSZXR1cm4gdGhlIGxvd2VzdCBpbmRleCBpbiBcdmFye3N9IHdoZXJlIHRoZSBzdWJzdHJpbmcgXHZhcntzdWJ9IGlzCi0gIGZvdW5kIHN1Y2ggdGhhdCBcdmFye3N1Yn0gaXMgd2hvbGx5IGNvbnRhaW5lZCBpbgotICBcY29kZXtcdmFye3N9W1x2YXJ7c3RhcnR9Olx2YXJ7ZW5kfV19LiAgUmV0dXJuIFxjb2Rley0xfSBvbiBmYWlsdXJlLgotICBEZWZhdWx0cyBmb3IgXHZhcntzdGFydH0gYW5kIFx2YXJ7ZW5kfSBhbmQgaW50ZXJwcmV0YXRpb24gb2YKLSAgbmVnYXRpdmUgdmFsdWVzIGlzIHRoZSBzYW1lIGFzIGZvciBzbGljZXMuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3JmaW5kfXtzLCBzdWJcb3B0aW9uYWx7LCBzdGFydFxvcHRpb25hbHssIGVuZH19fQotICBMaWtlIFxmdW5jdGlvbntmaW5kKCl9IGJ1dCBmaW5kIHRoZSBoaWdoZXN0IGluZGV4LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpbmRleH17cywgc3ViXG9wdGlvbmFseywgc3RhcnRcb3B0aW9uYWx7LCBlbmR9fX0KLSAgTGlrZSBcZnVuY3Rpb257ZmluZCgpfSBidXQgcmFpc2UgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSB3aGVuIHRoZQotICBzdWJzdHJpbmcgaXMgbm90IGZvdW5kLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtyaW5kZXh9e3MsIHN1YlxvcHRpb25hbHssIHN0YXJ0XG9wdGlvbmFseywgZW5kfX19Ci0gIExpa2UgXGZ1bmN0aW9ue3JmaW5kKCl9IGJ1dCByYWlzZSBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IHdoZW4gdGhlCi0gIHN1YnN0cmluZyBpcyBub3QgZm91bmQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2NvdW50fXtzLCBzdWJcb3B0aW9uYWx7LCBzdGFydFxvcHRpb25hbHssIGVuZH19fQotICBSZXR1cm4gdGhlIG51bWJlciBvZiAobm9uLW92ZXJsYXBwaW5nKSBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcKLSAgXHZhcntzdWJ9IGluIHN0cmluZyBcY29kZXtcdmFye3N9W1x2YXJ7c3RhcnR9Olx2YXJ7ZW5kfV19LgotICBEZWZhdWx0cyBmb3IgXHZhcntzdGFydH0gYW5kIFx2YXJ7ZW5kfSBhbmQgaW50ZXJwcmV0YXRpb24gb2YKLSAgbmVnYXRpdmUgdmFsdWVzIGFyZSB0aGUgc2FtZSBhcyBmb3Igc2xpY2VzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtsb3dlcn17c30KLSAgUmV0dXJuIGEgY29weSBvZiBcdmFye3N9LCBidXQgd2l0aCB1cHBlciBjYXNlIGxldHRlcnMgY29udmVydGVkIHRvCi0gIGxvd2VyIGNhc2UuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NwbGl0fXtzXG9wdGlvbmFseywgc2VwXG9wdGlvbmFseywgbWF4c3BsaXR9fX0KLSAgUmV0dXJuIGEgbGlzdCBvZiB0aGUgd29yZHMgb2YgdGhlIHN0cmluZyBcdmFye3N9LiAgSWYgdGhlIG9wdGlvbmFsCi0gIHNlY29uZCBhcmd1bWVudCBcdmFye3NlcH0gaXMgYWJzZW50IG9yIFxjb2Rle05vbmV9LCB0aGUgd29yZHMgYXJlCi0gIHNlcGFyYXRlZCBieSBhcmJpdHJhcnkgc3RyaW5ncyBvZiB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgKHNwYWNlLCB0YWIsIAotICBuZXdsaW5lLCByZXR1cm4sIGZvcm1mZWVkKS4gIElmIHRoZSBzZWNvbmQgYXJndW1lbnQgXHZhcntzZXB9IGlzCi0gIHByZXNlbnQgYW5kIG5vdCBcY29kZXtOb25lfSwgaXQgc3BlY2lmaWVzIGEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgdGhlIAotICB3b3JkIHNlcGFyYXRvci4gIFRoZSByZXR1cm5lZCBsaXN0IHdpbGwgdGhlbiBoYXZlIG9uZSBtb3JlIGl0ZW0KLSAgdGhhbiB0aGUgbnVtYmVyIG9mIG5vbi1vdmVybGFwcGluZyBvY2N1cnJlbmNlcyBvZiB0aGUgc2VwYXJhdG9yIGluCi0gIHRoZSBzdHJpbmcuICBUaGUgb3B0aW9uYWwgdGhpcmQgYXJndW1lbnQgXHZhcnttYXhzcGxpdH0gZGVmYXVsdHMgdG8KLSAgMC4gIElmIGl0IGlzIG5vbnplcm8sIGF0IG1vc3QgXHZhcnttYXhzcGxpdH0gbnVtYmVyIG9mIHNwbGl0cyBvY2N1ciwKLSAgYW5kIHRoZSByZW1haW5kZXIgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZCBhcyB0aGUgZmluYWwgZWxlbWVudCBvZgotICB0aGUgbGlzdCAodGh1cywgdGhlIGxpc3Qgd2lsbCBoYXZlIGF0IG1vc3QgXGNvZGV7XHZhcnttYXhzcGxpdH0rMX0KLSAgZWxlbWVudHMpLgotCi0gIFRoZSBiZWhhdmlvciBvZiBzcGxpdCBvbiBhbiBlbXB0eSBzdHJpbmcgZGVwZW5kcyBvbiB0aGUgdmFsdWUgb2YgXHZhcntzZXB9LgotICBJZiBcdmFye3NlcH0gaXMgbm90IHNwZWNpZmllZCwgb3Igc3BlY2lmaWVkIGFzIFxjb2Rle05vbmV9LCB0aGUgcmVzdWx0IHdpbGwKLSAgYmUgYW4gZW1wdHkgbGlzdC4gIElmIFx2YXJ7c2VwfSBpcyBzcGVjaWZpZWQgYXMgYW55IHN0cmluZywgdGhlIHJlc3VsdCB3aWxsCi0gIGJlIGEgbGlzdCBjb250YWluaW5nIG9uZSBlbGVtZW50IHdoaWNoIGlzIGFuIGVtcHR5IHN0cmluZy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cnNwbGl0fXtzXG9wdGlvbmFseywgc2VwXG9wdGlvbmFseywgbWF4c3BsaXR9fX0KLSAgUmV0dXJuIGEgbGlzdCBvZiB0aGUgd29yZHMgb2YgdGhlIHN0cmluZyBcdmFye3N9LCBzY2FubmluZyBcdmFye3N9Ci0gIGZyb20gdGhlIGVuZC4gIFRvIGFsbCBpbnRlbnRzIGFuZCBwdXJwb3NlcywgdGhlIHJlc3VsdGluZyBsaXN0IG9mCi0gIHdvcmRzIGlzIHRoZSBzYW1lIGFzIHJldHVybmVkIGJ5IFxmdW5jdGlvbntzcGxpdCgpfSwgZXhjZXB0IHdoZW4gdGhlCi0gIG9wdGlvbmFsIHRoaXJkIGFyZ3VtZW50IFx2YXJ7bWF4c3BsaXR9IGlzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGFuZAotICBub256ZXJvLiAgV2hlbiBcdmFye21heHNwbGl0fSBpcyBub256ZXJvLCBhdCBtb3N0IFx2YXJ7bWF4c3BsaXR9Ci0gIG51bWJlciBvZiBzcGxpdHMgLS0gdGhlIFxlbXBoe3JpZ2h0bW9zdH0gb25lcyAtLSBvY2N1ciwgYW5kIHRoZSByZW1haW5kZXIKLSAgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZCBhcyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdCAodGh1cywgdGhlCi0gIGxpc3Qgd2lsbCBoYXZlIGF0IG1vc3QgXGNvZGV7XHZhcnttYXhzcGxpdH0rMX0gZWxlbWVudHMpLgotICBcdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c3BsaXRmaWVsZHN9e3Ncb3B0aW9uYWx7LCBzZXBcb3B0aW9uYWx7LCBtYXhzcGxpdH19fQotICBUaGlzIGZ1bmN0aW9uIGJlaGF2ZXMgaWRlbnRpY2FsbHkgdG8gXGZ1bmN0aW9ue3NwbGl0KCl9LiAgKEluIHRoZQotICBwYXN0LCBcZnVuY3Rpb257c3BsaXQoKX0gd2FzIG9ubHkgdXNlZCB3aXRoIG9uZSBhcmd1bWVudCwgd2hpbGUKLSAgXGZ1bmN0aW9ue3NwbGl0ZmllbGRzKCl9IHdhcyBvbmx5IHVzZWQgd2l0aCB0d28gYXJndW1lbnRzLikKLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317am9pbn17d29yZHNcb3B0aW9uYWx7LCBzZXB9fQotICBDb25jYXRlbmF0ZSBhIGxpc3Qgb3IgdHVwbGUgb2Ygd29yZHMgd2l0aCBpbnRlcnZlbmluZyBvY2N1cnJlbmNlcyBvZiAKLSAgXHZhcntzZXB9LiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIFx2YXJ7c2VwfSBpcyBhIHNpbmdsZSBzcGFjZQotICBjaGFyYWN0ZXIuICBJdCBpcyBhbHdheXMgdHJ1ZSB0aGF0Ci0gIFxzYW1we3N0cmluZy5qb2luKHN0cmluZy5zcGxpdChcdmFye3N9LCBcdmFye3NlcH0pLCBcdmFye3NlcH0pfQotICBlcXVhbHMgXHZhcntzfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317am9pbmZpZWxkc317d29yZHNcb3B0aW9uYWx7LCBzZXB9fQotICBUaGlzIGZ1bmN0aW9uIGJlaGF2ZXMgaWRlbnRpY2FsbHkgdG8gXGZ1bmN0aW9ue2pvaW4oKX0uICAoSW4gdGhlIHBhc3QsIAotICBcZnVuY3Rpb257am9pbigpfSB3YXMgb25seSB1c2VkIHdpdGggb25lIGFyZ3VtZW50LCB3aGlsZQotICBcZnVuY3Rpb257am9pbmZpZWxkcygpfSB3YXMgb25seSB1c2VkIHdpdGggdHdvIGFyZ3VtZW50cy4pCi0gIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBcbWV0aG9ke2pvaW5maWVsZHMoKX0gbWV0aG9kIG9uIHN0cmluZwotICBvYmplY3RzOyB1c2UgdGhlIFxtZXRob2R7am9pbigpfSBtZXRob2QgaW5zdGVhZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bHN0cmlwfXtzXG9wdGlvbmFseywgY2hhcnN9fQotUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggbGVhZGluZyBjaGFyYWN0ZXJzIHJlbW92ZWQuICBJZgotXHZhcntjaGFyc30gaXMgb21pdHRlZCBvciBcY29kZXtOb25lfSwgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGFyZQotcmVtb3ZlZC4gIElmIGdpdmVuIGFuZCBub3QgXGNvZGV7Tm9uZX0sIFx2YXJ7Y2hhcnN9IG11c3QgYmUgYSBzdHJpbmc7Ci10aGUgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIHdpbGwgYmUgc3RyaXBwZWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mCi10aGUgc3RyaW5nIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbi4KLVx2ZXJzaW9uY2hhbmdlZFtUaGUgXHZhcntjaGFyc30gcGFyYW1ldGVyIHdhcyBhZGRlZC4gIFRoZSBcdmFye2NoYXJzfQotcGFyYW1ldGVyIGNhbm5vdCBiZSBwYXNzZWQgaW4gZWFybGllciAyLjIgdmVyc2lvbnNdezIuMi4zfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtyc3RyaXB9e3Ncb3B0aW9uYWx7LCBjaGFyc319Ci1SZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCB0cmFpbGluZyBjaGFyYWN0ZXJzIHJlbW92ZWQuICBJZgotXHZhcntjaGFyc30gaXMgb21pdHRlZCBvciBcY29kZXtOb25lfSwgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGFyZQotcmVtb3ZlZC4gIElmIGdpdmVuIGFuZCBub3QgXGNvZGV7Tm9uZX0sIFx2YXJ7Y2hhcnN9IG11c3QgYmUgYSBzdHJpbmc7Ci10aGUgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIHdpbGwgYmUgc3RyaXBwZWQgZnJvbSB0aGUgZW5kIG9mIHRoZQotc3RyaW5nIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbi4KLVx2ZXJzaW9uY2hhbmdlZFtUaGUgXHZhcntjaGFyc30gcGFyYW1ldGVyIHdhcyBhZGRlZC4gIFRoZSBcdmFye2NoYXJzfQotcGFyYW1ldGVyIGNhbm5vdCBiZSBwYXNzZWQgaW4gZWFybGllciAyLjIgdmVyc2lvbnNdezIuMi4zfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzdHJpcH17c1xvcHRpb25hbHssIGNoYXJzfX0KLVJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGNoYXJhY3RlcnMKLXJlbW92ZWQuICBJZiBcdmFye2NoYXJzfSBpcyBvbWl0dGVkIG9yIFxjb2Rle05vbmV9LCB3aGl0ZXNwYWNlCi1jaGFyYWN0ZXJzIGFyZSByZW1vdmVkLiAgSWYgZ2l2ZW4gYW5kIG5vdCBcY29kZXtOb25lfSwgXHZhcntjaGFyc30KLW11c3QgYmUgYSBzdHJpbmc7IHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgd2lsbCBiZSBzdHJpcHBlZCBmcm9tCi10aGUgYm90aCBlbmRzIG9mIHRoZSBzdHJpbmcgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uLgotXHZlcnNpb25jaGFuZ2VkW1RoZSBcdmFye2NoYXJzfSBwYXJhbWV0ZXIgd2FzIGFkZGVkLiAgVGhlIFx2YXJ7Y2hhcnN9Ci1wYXJhbWV0ZXIgY2Fubm90IGJlIHBhc3NlZCBpbiBlYXJsaWVyIDIuMiB2ZXJzaW9uc117Mi4yLjN9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3N3YXBjYXNlfXtzfQotICBSZXR1cm4gYSBjb3B5IG9mIFx2YXJ7c30sIGJ1dCB3aXRoIGxvd2VyIGNhc2UgbGV0dGVycwotICBjb252ZXJ0ZWQgdG8gdXBwZXIgY2FzZSBhbmQgdmljZSB2ZXJzYS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dHJhbnNsYXRlfXtzLCB0YWJsZVxvcHRpb25hbHssIGRlbGV0ZWNoYXJzfX0KLSAgRGVsZXRlIGFsbCBjaGFyYWN0ZXJzIGZyb20gXHZhcntzfSB0aGF0IGFyZSBpbiBcdmFye2RlbGV0ZWNoYXJzfSAoaWYgCi0gIHByZXNlbnQpLCBhbmQgdGhlbiB0cmFuc2xhdGUgdGhlIGNoYXJhY3RlcnMgdXNpbmcgXHZhcnt0YWJsZX0sIHdoaWNoIAotICBtdXN0IGJlIGEgMjU2LWNoYXJhY3RlciBzdHJpbmcgZ2l2aW5nIHRoZSB0cmFuc2xhdGlvbiBmb3IgZWFjaAotICBjaGFyYWN0ZXIgdmFsdWUsIGluZGV4ZWQgYnkgaXRzIG9yZGluYWwuICBJZiBcdmFye3RhYmxlfSBpcyBcY29kZXtOb25lfSwKLSAgdGhlbiBvbmx5IHRoZSBjaGFyYWN0ZXIgZGVsZXRpb24gc3RlcCBpcyBwZXJmb3JtZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3VwcGVyfXtzfQotICBSZXR1cm4gYSBjb3B5IG9mIFx2YXJ7c30sIGJ1dCB3aXRoIGxvd2VyIGNhc2UgbGV0dGVycyBjb252ZXJ0ZWQgdG8KLSAgdXBwZXIgY2FzZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bGp1c3R9e3MsIHdpZHRofQotXGZ1bmNsaW5le3JqdXN0fXtzLCB3aWR0aH0KLVxmdW5jbGluZXtjZW50ZXJ9e3MsIHdpZHRofQotICBUaGVzZSBmdW5jdGlvbnMgcmVzcGVjdGl2ZWx5IGxlZnQtanVzdGlmeSwgcmlnaHQtanVzdGlmeSBhbmQgY2VudGVyCi0gIGEgc3RyaW5nIGluIGEgZmllbGQgb2YgZ2l2ZW4gd2lkdGguICBUaGV5IHJldHVybiBhIHN0cmluZyB0aGF0IGlzIGF0Ci0gIGxlYXN0IFx2YXJ7d2lkdGh9IGNoYXJhY3RlcnMgd2lkZSwgY3JlYXRlZCBieSBwYWRkaW5nIHRoZSBzdHJpbmcKLSAgXHZhcntzfSB3aXRoIHNwYWNlcyB1bnRpbCB0aGUgZ2l2ZW4gd2lkdGggb24gdGhlIHJpZ2h0LCBsZWZ0IG9yIGJvdGgKLSAgc2lkZXMuICBUaGUgc3RyaW5nIGlzIG5ldmVyIHRydW5jYXRlZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317emZpbGx9e3MsIHdpZHRofQotICBQYWQgYSBudW1lcmljIHN0cmluZyBvbiB0aGUgbGVmdCB3aXRoIHplcm8gZGlnaXRzIHVudGlsIHRoZSBnaXZlbgotICB3aWR0aCBpcyByZWFjaGVkLiAgU3RyaW5ncyBzdGFydGluZyB3aXRoIGEgc2lnbiBhcmUgaGFuZGxlZAotICBjb3JyZWN0bHkuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3JlcGxhY2V9e3N0ciwgb2xkLCBuZXdcb3B0aW9uYWx7LCBtYXhyZXBsYWNlfX0KLSAgUmV0dXJuIGEgY29weSBvZiBzdHJpbmcgXHZhcntzdHJ9IHdpdGggYWxsIG9jY3VycmVuY2VzIG9mIHN1YnN0cmluZwotICBcdmFye29sZH0gcmVwbGFjZWQgYnkgXHZhcntuZXd9LiAgSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50Ci0gIFx2YXJ7bWF4cmVwbGFjZX0gaXMgZ2l2ZW4sIHRoZSBmaXJzdCBcdmFye21heHJlcGxhY2V9IG9jY3VycmVuY2VzIGFyZQotICByZXBsYWNlZC4KLVxlbmR7ZnVuY2Rlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnN0cmluZ2lvLnRleCBiL0RvYy9saWIvbGlic3RyaW5naW8udGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2ZmMGU0Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlic3RyaW5naW8udGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7U3RyaW5nSU99IC0tLQotICAgICAgICAgUmVhZCBhbmQgd3JpdGUgc3RyaW5ncyBhcyBmaWxlc30KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e1N0cmluZ0lPfQotXG1vZHVsZXN5bm9wc2lze1JlYWQgYW5kIHdyaXRlIHN0cmluZ3MgYXMgaWYgdGhleSB3ZXJlIGZpbGVzLn0KLQotCi1UaGlzIG1vZHVsZSBpbXBsZW1lbnRzIGEgZmlsZS1saWtlIGNsYXNzLCBcY2xhc3N7U3RyaW5nSU99LAotdGhhdCByZWFkcyBhbmQgd3JpdGVzIGEgc3RyaW5nIGJ1ZmZlciAoYWxzbyBrbm93biBhcyBcZW1waHttZW1vcnkKLWZpbGVzfSkuICBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIGZpbGUgb2JqZWN0cyBmb3Igb3BlcmF0aW9ucyAoc2VjdGlvbgotXHJlZntibHRpbi1maWxlLW9iamVjdHN9KS4KLQotXGJlZ2lue2NsYXNzZGVzY317U3RyaW5nSU99e1xvcHRpb25hbHtidWZmZXJ9fQotV2hlbiBhIFxjbGFzc3tTdHJpbmdJT30gb2JqZWN0IGlzIGNyZWF0ZWQsIGl0IGNhbiBiZSBpbml0aWFsaXplZAotdG8gYW4gZXhpc3Rpbmcgc3RyaW5nIGJ5IHBhc3NpbmcgdGhlIHN0cmluZyB0byB0aGUgY29uc3RydWN0b3IuCi1JZiBubyBzdHJpbmcgaXMgZ2l2ZW4sIHRoZSBcY2xhc3N7U3RyaW5nSU99IHdpbGwgc3RhcnQgZW1wdHkuCi1JbiBib3RoIGNhc2VzLCB0aGUgaW5pdGlhbCBmaWxlIHBvc2l0aW9uIHN0YXJ0cyBhdCB6ZXJvLgotCi1UaGUgXGNsYXNze1N0cmluZ0lPfSBvYmplY3QgY2FuIGFjY2VwdCBlaXRoZXIgVW5pY29kZSBvciA4LWJpdAotc3RyaW5ncywgYnV0IG1peGluZyB0aGUgdHdvIG1heSB0YWtlIHNvbWUgY2FyZS4gIElmIGJvdGggYXJlIHVzZWQsCi04LWJpdCBzdHJpbmdzIHRoYXQgY2Fubm90IGJlIGludGVycHJldGVkIGFzIDctYml0IFxBU0NJSXt9ICh0aGF0Ci11c2UgdGhlIDh0aCBiaXQpIHdpbGwgY2F1c2UgYSBcZXhjZXB0aW9ue1VuaWNvZGVFcnJvcn0gdG8gYmUgcmFpc2VkCi13aGVuIFxtZXRob2R7Z2V0dmFsdWUoKX0gaXMgY2FsbGVkLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVRoZSBmb2xsb3dpbmcgbWV0aG9kcyBvZiBcY2xhc3N7U3RyaW5nSU99IG9iamVjdHMgcmVxdWlyZSBzcGVjaWFsCi1tZW50aW9uOgotCi1cYmVnaW57bWV0aG9kZGVzY317Z2V0dmFsdWV9e30KLVJldHJpZXZlIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGBgZmlsZScnIGF0IGFueSB0aW1lIGJlZm9yZSB0aGUKLVxjbGFzc3tTdHJpbmdJT30gb2JqZWN0J3MgXG1ldGhvZHtjbG9zZSgpfSBtZXRob2QgaXMgY2FsbGVkLiAgU2VlIHRoZQotbm90ZSBhYm92ZSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgbWl4aW5nIFVuaWNvZGUgYW5kIDgtYml0IHN0cmluZ3M7Ci1zdWNoIG1peGluZyBjYW4gY2F1c2UgdGhpcyBtZXRob2QgdG8gcmFpc2UgXGV4Y2VwdGlvbntVbmljb2RlRXJyb3J9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Y2xvc2V9e30KLUZyZWUgdGhlIG1lbW9yeSBidWZmZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLUV4YW1wbGUgdXNhZ2U6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCBTdHJpbmdJTwotCi1vdXRwdXQgPSBTdHJpbmdJTy5TdHJpbmdJTygpCi1vdXRwdXQud3JpdGUoJ0ZpcnN0IGxpbmUuXG4nKQotcHJpbnQgPj5vdXRwdXQsICdTZWNvbmQgbGluZS4nCi0KLSMgUmV0cmlldmUgZmlsZSBjb250ZW50cyAtLSB0aGlzIHdpbGwgYmUKLSMgJ0ZpcnN0IGxpbmUuXG5TZWNvbmQgbGluZS5cbicKLWNvbnRlbnRzID0gb3V0cHV0LmdldHZhbHVlKCkKLQotIyBDbG9zZSBvYmplY3QgYW5kIGRpc2NhcmQgbWVtb3J5IGJ1ZmZlciAtLSAKLSMgLmdldHZhbHVlKCkgd2lsbCBub3cgcmFpc2UgYW4gZXhjZXB0aW9uLgotb3V0cHV0LmNsb3NlKCkKLVxlbmR7dmVyYmF0aW19Ci0KLQotXHNlY3Rpb257XG1vZHVsZXtjU3RyaW5nSU99IC0tLQotICAgICAgICAgRmFzdGVyIHZlcnNpb24gb2YgXG1vZHVsZXtTdHJpbmdJT319Ci0KLVxkZWNsYXJlbW9kdWxle2J1aWx0aW59e2NTdHJpbmdJT30KLVxtb2R1bGVzeW5vcHNpc3tGYXN0ZXIgdmVyc2lvbiBvZiBcbW9kdWxle1N0cmluZ0lPfSwgYnV0IG5vdAotICAgICAgICAgICAgICAgIHN1YmNsYXNzYWJsZS59Ci1cbW9kdWxlYXV0aG9ye0ppbSBGdWx0b259e2ppbUB6b3BlLmNvbX0KLVxzZWN0aW9uYXV0aG9ye0ZyZWQgTC4gRHJha2UsIEpyLn17ZmRyYWtlQGFjbS5vcmd9Ci0KLVRoZSBtb2R1bGUgXG1vZHVsZXtjU3RyaW5nSU99IHByb3ZpZGVzIGFuIGludGVyZmFjZSBzaW1pbGFyIHRvIHRoYXQgb2YKLXRoZSBccmVmbW9kdWxle1N0cmluZ0lPfSBtb2R1bGUuICBIZWF2eSB1c2Ugb2YgXGNsYXNze1N0cmluZ0lPLlN0cmluZ0lPfQotb2JqZWN0cyBjYW4gYmUgbWFkZSBtb3JlIGVmZmljaWVudCBieSB1c2luZyB0aGUgZnVuY3Rpb24KLVxmdW5jdGlvbntTdHJpbmdJTygpfSBmcm9tIHRoaXMgbW9kdWxlIGluc3RlYWQuCi0KLVNpbmNlIHRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgZmFjdG9yeSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIG9iamVjdHMgb2YKLWJ1aWx0LWluIHR5cGVzLCB0aGVyZSdzIG5vIHdheSB0byBidWlsZCB5b3VyIG93biB2ZXJzaW9uIHVzaW5nCi1zdWJjbGFzc2luZy4gIFVzZSB0aGUgb3JpZ2luYWwgXHJlZm1vZHVsZXtTdHJpbmdJT30gbW9kdWxlIGluIHRoYXQgY2FzZS4KLQotVW5saWtlIHRoZSBtZW1vcnkgZmlsZXMgaW1wbGVtZW50ZWQgYnkgdGhlIFxyZWZtb2R1bGV7U3RyaW5nSU99Ci1tb2R1bGUsIHRob3NlIHByb3ZpZGVkIGJ5IHRoaXMgbW9kdWxlIGFyZSBub3QgYWJsZSB0byBhY2NlcHQgVW5pY29kZQotc3RyaW5ncyB0aGF0IGNhbm5vdCBiZSBlbmNvZGVkIGFzIHBsYWluIFxBU0NJSXt9IHN0cmluZ3MuCi0KLUNhbGxpbmcgXGZ1bmN0aW9ue1N0cmluZ0lPKCl9IHdpdGggYSBVbmljb2RlIHN0cmluZyBwYXJhbWV0ZXIgcG9wdWxhdGVzCi10aGUgb2JqZWN0IHdpdGggdGhlIGJ1ZmZlciByZXByZXNlbnRhdGlvbiBvZiB0aGUgVW5pY29kZSBzdHJpbmcsIGluc3RlYWQgb2YKLWVuY29kaW5nIHRoZSBzdHJpbmcuCi0KLUFub3RoZXIgZGlmZmVyZW5jZSBmcm9tIHRoZSBccmVmbW9kdWxle1N0cmluZ0lPfSBtb2R1bGUgaXMgdGhhdCBjYWxsaW5nCi1cZnVuY3Rpb257U3RyaW5nSU8oKX0gd2l0aCBhIHN0cmluZyBwYXJhbWV0ZXIgY3JlYXRlcyBhIHJlYWQtb25seSBvYmplY3QuCi1Vbmxpa2UgYW4gb2JqZWN0IGNyZWF0ZWQgd2l0aG91dCBhIHN0cmluZyBwYXJhbWV0ZXIsIGl0IGRvZXMgbm90IGhhdmUKLXdyaXRlIG1ldGhvZHMuICBUaGVzZSBvYmplY3RzIGFyZSBub3QgZ2VuZXJhbGx5IHZpc2libGUuICBUaGV5IHR1cm4gdXAgaW4KLXRyYWNlYmFja3MgYXMgXGNsYXNze1N0cmluZ0l9IGFuZCBcY2xhc3N7U3RyaW5nT30uCi0KLVRoZSBmb2xsb3dpbmcgZGF0YSBvYmplY3RzIGFyZSBwcm92aWRlZCBhcyB3ZWxsOgotCi0KLVxiZWdpbntkYXRhZGVzY317SW5wdXRUeXBlfQotICBUaGUgdHlwZSBvYmplY3Qgb2YgdGhlIG9iamVjdHMgY3JlYXRlZCBieSBjYWxsaW5nCi0gIFxmdW5jdGlvbntTdHJpbmdJT30gd2l0aCBhIHN0cmluZyBwYXJhbWV0ZXIuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e091dHB1dFR5cGV9Ci0gIFRoZSB0eXBlIG9iamVjdCBvZiB0aGUgb2JqZWN0cyByZXR1cm5lZCBieSBjYWxsaW5nCi0gIFxmdW5jdGlvbntTdHJpbmdJT30gd2l0aCBubyBwYXJhbWV0ZXJzLgotXGVuZHtkYXRhZGVzY30KLQotCi1UaGVyZSBpcyBhIEMgQVBJIHRvIHRoZSBtb2R1bGUgYXMgd2VsbDsgcmVmZXIgdG8gdGhlIG1vZHVsZSBzb3VyY2UgZm9yIAotbW9yZSBpbmZvcm1hdGlvbi4KLQotRXhhbXBsZSB1c2FnZToKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IGNTdHJpbmdJTwotCi1vdXRwdXQgPSBjU3RyaW5nSU8uU3RyaW5nSU8oKQotb3V0cHV0LndyaXRlKCdGaXJzdCBsaW5lLlxuJykKLXByaW50ID4+b3V0cHV0LCAnU2Vjb25kIGxpbmUuJwotCi0jIFJldHJpZXZlIGZpbGUgY29udGVudHMgLS0gdGhpcyB3aWxsIGJlCi0jICdGaXJzdCBsaW5lLlxuU2Vjb25kIGxpbmUuXG4nCi1jb250ZW50cyA9IG91dHB1dC5nZXR2YWx1ZSgpCi0KLSMgQ2xvc2Ugb2JqZWN0IGFuZCBkaXNjYXJkIG1lbW9yeSBidWZmZXIgLS0gCi0jIC5nZXR2YWx1ZSgpIHdpbGwgbm93IHJhaXNlIGFuIGV4Y2VwdGlvbi4KLW91dHB1dC5jbG9zZSgpCi1cZW5ke3ZlcmJhdGltfQotCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnN0cmluZ3ByZXAudGV4IGIvRG9jL2xpYi9saWJzdHJpbmdwcmVwLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYxNDMxNC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnN0cmluZ3ByZXAudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7c3RyaW5ncHJlcH0gLS0tCi0gICAgICAgICBJbnRlcm5ldCBTdHJpbmcgUHJlcGFyYXRpb259Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtzdHJpbmdwcmVwfQotXG1vZHVsZXN5bm9wc2lze1N0cmluZyBwcmVwYXJhdGlvbiwgYXMgcGVyIFJGQyAzNDUzfQotXG1vZHVsZWF1dGhvcntNYXJ0aW4gdi4gTFwib3dpc317bWFydGluQHYubG9ld2lzLmRlfQotXHNlY3Rpb25hdXRob3J7TWFydGluIHYuIExcIm93aXN9e21hcnRpbkB2LmxvZXdpcy5kZX0KLQotXHZlcnNpb25hZGRlZHsyLjN9Ci0KLVdoZW4gaWRlbnRpZnlpbmcgdGhpbmdzIChzdWNoIGFzIGhvc3QgbmFtZXMpIGluIHRoZSBpbnRlcm5ldCwgaXQgaXMKLW9mdGVuIG5lY2Vzc2FyeSB0byBjb21wYXJlIHN1Y2ggaWRlbnRpZmljYXRpb25zIGZvcgotYGBlcXVhbGl0eScnLiBFeGFjdGx5IGhvdyB0aGlzIGNvbXBhcmlzb24gaXMgZXhlY3V0ZWQgbWF5IGRlcGVuZCBvbgotdGhlIGFwcGxpY2F0aW9uIGRvbWFpbiwgZS5nLiB3aGV0aGVyIGl0IHNob3VsZCBiZSBjYXNlLWluc2Vuc2l0aXZlIG9yCi1ub3QuIEl0IG1heSBiZSBhbHNvIG5lY2Vzc2FyeSB0byByZXN0cmljdCB0aGUgcG9zc2libGUKLWlkZW50aWZpY2F0aW9ucywgdG8gYWxsb3cgb25seSBpZGVudGlmaWNhdGlvbnMgY29uc2lzdGluZyBvZgotYGBwcmludGFibGUnJyBjaGFyYWN0ZXJzLgotCi1ccmZjezM0NTR9IGRlZmluZXMgYSBwcm9jZWR1cmUgZm9yIGBgcHJlcGFyaW5nJycgVW5pY29kZSBzdHJpbmdzIGluCi1pbnRlcm5ldCBwcm90b2NvbHMuIEJlZm9yZSBwYXNzaW5nIHN0cmluZ3Mgb250byB0aGUgd2lyZSwgdGhleSBhcmUKLXByb2Nlc3NlZCB3aXRoIHRoZSBwcmVwYXJhdGlvbiBwcm9jZWR1cmUsIGFmdGVyIHdoaWNoIHRoZXkgaGF2ZSBhCi1jZXJ0YWluIG5vcm1hbGl6ZWQgZm9ybS4gVGhlIFJGQyBkZWZpbmVzIGEgc2V0IG9mIHRhYmxlcywgd2hpY2ggY2FuIGJlCi1jb21iaW5lZCBpbnRvIHByb2ZpbGVzLiBFYWNoIHByb2ZpbGUgbXVzdCBkZWZpbmUgd2hpY2ggdGFibGVzIGl0IHVzZXMsCi1hbmQgd2hhdCBvdGhlciBvcHRpb25hbCBwYXJ0cyBvZiB0aGUgXGNvZGV7c3RyaW5ncHJlcH0gcHJvY2VkdXJlIGFyZQotcGFydCBvZiB0aGUgcHJvZmlsZS4gT25lIGV4YW1wbGUgb2YgYSBcY29kZXtzdHJpbmdwcmVwfSBwcm9maWxlIGlzCi1cY29kZXtuYW1lcHJlcH0sIHdoaWNoIGlzIHVzZWQgZm9yIGludGVybmF0aW9uYWxpemVkIGRvbWFpbiBuYW1lcy4KLQotVGhlIG1vZHVsZSBcbW9kdWxle3N0cmluZ3ByZXB9IG9ubHkgZXhwb3NlcyB0aGUgdGFibGVzIGZyb20gUkZDCi0zNDU0LiBBcyB0aGVzZSB0YWJsZXMgd291bGQgYmUgdmVyeSBsYXJnZSB0byByZXByZXNlbnQgdGhlbSBhcwotZGljdGlvbmFyaWVzIG9yIGxpc3RzLCB0aGUgbW9kdWxlIHVzZXMgdGhlIFVuaWNvZGUgY2hhcmFjdGVyIGRhdGFiYXNlCi1pbnRlcm5hbGx5LiBUaGUgbW9kdWxlIHNvdXJjZSBjb2RlIGl0c2VsZiB3YXMgZ2VuZXJhdGVkIHVzaW5nIHRoZQotXGNvZGV7bWtzdHJpbmdwcmVwLnB5fSB1dGlsaXR5LgotCi1BcyBhIHJlc3VsdCwgdGhlc2UgdGFibGVzIGFyZSBleHBvc2VkIGFzIGZ1bmN0aW9ucywgbm90IGFzIGRhdGEKLXN0cnVjdHVyZXMuIFRoZXJlIGFyZSB0d28ga2luZHMgb2YgdGFibGVzIGluIHRoZSBSRkM6IHNldHMgYW5kCi1tYXBwaW5ncy4gRm9yIGEgc2V0LCBcbW9kdWxle3N0cmluZ3ByZXB9IHByb3ZpZGVzIHRoZSBgYGNoYXJhY3RlcmlzdGljCi1mdW5jdGlvbicnLCBpLmUuIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgdGhlIHBhcmFtZXRlciBpcyBwYXJ0Ci1vZiB0aGUgc2V0LiBGb3IgbWFwcGluZ3MsIGl0IHByb3ZpZGVzIHRoZSBtYXBwaW5nIGZ1bmN0aW9uOiBnaXZlbiB0aGUKLWtleSwgaXQgcmV0dXJucyB0aGUgYXNzb2NpYXRlZCB2YWx1ZS4gQmVsb3cgaXMgYSBsaXN0IG9mIGFsbCBmdW5jdGlvbnMKLWF2YWlsYWJsZSBpbiB0aGUgbW9kdWxlLgotCi1cYmVnaW57ZnVuY2Rlc2N9e2luX3RhYmxlX2ExfXtjb2RlfQotRGV0ZXJtaW5lIHdoZXRoZXIgXHZhcntjb2RlfSBpcyBpbiB0YWJsZXtBLjF9IChVbmFzc2lnbmVkIGNvZGUgcG9pbnRzCi1pbiBVbmljb2RlIDMuMikuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2luX3RhYmxlX2IxfXtjb2RlfQotRGV0ZXJtaW5lIHdoZXRoZXIgXHZhcntjb2RlfSBpcyBpbiB0YWJsZXtCLjF9IChDb21tb25seSBtYXBwZWQgdG8KLW5vdGhpbmcpLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXttYXBfdGFibGVfYjJ9e2NvZGV9Ci1SZXR1cm4gdGhlIG1hcHBlZCB2YWx1ZSBmb3IgXHZhcntjb2RlfSBhY2NvcmRpbmcgdG8gdGFibGV7Qi4yfSAKLShNYXBwaW5nIGZvciBjYXNlLWZvbGRpbmcgdXNlZCB3aXRoIE5GS0MpLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXttYXBfdGFibGVfYjN9e2NvZGV9Ci1SZXR1cm4gdGhlIG1hcHBlZCB2YWx1ZSBmb3IgXHZhcntjb2RlfSBhY2NvcmRpbmcgdG8gdGFibGV7Qi4zfSAKLShNYXBwaW5nIGZvciBjYXNlLWZvbGRpbmcgdXNlZCB3aXRoIG5vIG5vcm1hbGl6YXRpb24pLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpbl90YWJsZV9jMTF9e2NvZGV9Ci1EZXRlcm1pbmUgd2hldGhlciBcdmFye2NvZGV9IGlzIGluIHRhYmxle0MuMS4xfSAKLShBU0NJSSBzcGFjZSBjaGFyYWN0ZXJzKS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aW5fdGFibGVfYzEyfXtjb2RlfQotRGV0ZXJtaW5lIHdoZXRoZXIgXHZhcntjb2RlfSBpcyBpbiB0YWJsZXtDLjEuMn0gCi0oTm9uLUFTQ0lJIHNwYWNlIGNoYXJhY3RlcnMpLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpbl90YWJsZV9jMTFfYzEyfXtjb2RlfQotRGV0ZXJtaW5lIHdoZXRoZXIgXHZhcntjb2RlfSBpcyBpbiB0YWJsZXtDLjF9IAotKFNwYWNlIGNoYXJhY3RlcnMsIHVuaW9uIG9mIEMuMS4xIGFuZCBDLjEuMikuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2luX3RhYmxlX2MyMX17Y29kZX0KLURldGVybWluZSB3aGV0aGVyIFx2YXJ7Y29kZX0gaXMgaW4gdGFibGV7Qy4yLjF9IAotKEFTQ0lJIGNvbnRyb2wgY2hhcmFjdGVycykuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2luX3RhYmxlX2MyMn17Y29kZX0KLURldGVybWluZSB3aGV0aGVyIFx2YXJ7Y29kZX0gaXMgaW4gdGFibGV7Qy4yLjJ9IAotKE5vbi1BU0NJSSBjb250cm9sIGNoYXJhY3RlcnMpLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpbl90YWJsZV9jMjFfYzIyfXtjb2RlfQotRGV0ZXJtaW5lIHdoZXRoZXIgXHZhcntjb2RlfSBpcyBpbiB0YWJsZXtDLjJ9IAotKENvbnRyb2wgY2hhcmFjdGVycywgdW5pb24gb2YgQy4yLjEgYW5kIEMuMi4yKS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aW5fdGFibGVfYzN9e2NvZGV9Ci1EZXRlcm1pbmUgd2hldGhlciBcdmFye2NvZGV9IGlzIGluIHRhYmxle0MuM30gCi0oUHJpdmF0ZSB1c2UpLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpbl90YWJsZV9jNH17Y29kZX0KLURldGVybWluZSB3aGV0aGVyIFx2YXJ7Y29kZX0gaXMgaW4gdGFibGV7Qy40fSAKLShOb24tY2hhcmFjdGVyIGNvZGUgcG9pbnRzKS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aW5fdGFibGVfYzV9e2NvZGV9Ci1EZXRlcm1pbmUgd2hldGhlciBcdmFye2NvZGV9IGlzIGluIHRhYmxle0MuNX0gCi0oU3Vycm9nYXRlIGNvZGVzKS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aW5fdGFibGVfYzZ9e2NvZGV9Ci1EZXRlcm1pbmUgd2hldGhlciBcdmFye2NvZGV9IGlzIGluIHRhYmxle0MuNn0gCi0oSW5hcHByb3ByaWF0ZSBmb3IgcGxhaW4gdGV4dCkuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2luX3RhYmxlX2M3fXtjb2RlfQotRGV0ZXJtaW5lIHdoZXRoZXIgXHZhcntjb2RlfSBpcyBpbiB0YWJsZXtDLjd9IAotKEluYXBwcm9wcmlhdGUgZm9yIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbikuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2luX3RhYmxlX2M4fXtjb2RlfQotRGV0ZXJtaW5lIHdoZXRoZXIgXHZhcntjb2RlfSBpcyBpbiB0YWJsZXtDLjh9IAotKENoYW5nZSBkaXNwbGF5IHByb3BlcnRpZXMgb3IgYXJlIGRlcHJlY2F0ZWQpLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpbl90YWJsZV9jOX17Y29kZX0KLURldGVybWluZSB3aGV0aGVyIFx2YXJ7Y29kZX0gaXMgaW4gdGFibGV7Qy45fSAKLShUYWdnaW5nIGNoYXJhY3RlcnMpLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpbl90YWJsZV9kMX17Y29kZX0KLURldGVybWluZSB3aGV0aGVyIFx2YXJ7Y29kZX0gaXMgaW4gdGFibGV7RC4xfSAKLShDaGFyYWN0ZXJzIHdpdGggYmlkaXJlY3Rpb25hbCBwcm9wZXJ0eSBgYFInJyBvciBgYEFMJycpLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpbl90YWJsZV9kMn17Y29kZX0KLURldGVybWluZSB3aGV0aGVyIFx2YXJ7Y29kZX0gaXMgaW4gdGFibGV7RC4yfSAKLShDaGFyYWN0ZXJzIHdpdGggYmlkaXJlY3Rpb25hbCBwcm9wZXJ0eSBgYEwnJykuCi1cZW5ke2Z1bmNkZXNjfQotCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnN0cmluZ3MudGV4IGIvRG9jL2xpYi9saWJzdHJpbmdzLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNhMzFmNC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnN0cmluZ3MudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotXGNoYXB0ZXJ7U3RyaW5nIFNlcnZpY2VzfQotXGxhYmVse3N0cmluZ3N9Ci0KLVRoZSBtb2R1bGVzIGRlc2NyaWJlZCBpbiB0aGlzIGNoYXB0ZXIgcHJvdmlkZSBhIHdpZGUgcmFuZ2Ugb2Ygc3RyaW5nCi1tYW5pcHVsYXRpb24gb3BlcmF0aW9ucy4gIEhlcmUncyBhbiBvdmVydmlldzoKLQotXGxvY2FsbW9kdWxldGFibGUKLQotSW5mb3JtYXRpb24gb24gdGhlIG1ldGhvZHMgb2Ygc3RyaW5nIG9iamVjdHMgY2FuIGJlIGZvdW5kIGluCi1zZWN0aW9uflxyZWZ7c3RyaW5nLW1ldGhvZHN9LCBgYFN0cmluZyBNZXRob2RzLicnCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnN0cnVjdC50ZXggYi9Eb2MvbGliL2xpYnN0cnVjdC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YzVjOWEuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJzdHJ1Y3QudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7c3RydWN0fSAtLS0KLSAgICAgICAgIEludGVycHJldCBzdHJpbmdzIGFzIHBhY2tlZCBiaW5hcnkgZGF0YX0KLVxkZWNsYXJlbW9kdWxle2J1aWx0aW59e3N0cnVjdH0KLQotXG1vZHVsZXN5bm9wc2lze0ludGVycHJldCBzdHJpbmdzIGFzIHBhY2tlZCBiaW5hcnkgZGF0YS59Ci0KLVxpbmRleGlpe0N9e3N0cnVjdHVyZXN9Ci1caW5kZXhpaWl7cGFja2luZ317YmluYXJ5fXtkYXRhfQotCi1UaGlzIG1vZHVsZSBwZXJmb3JtcyBjb252ZXJzaW9ucyBiZXR3ZWVuIFB5dGhvbiB2YWx1ZXMgYW5kIEMKLXN0cnVjdHMgcmVwcmVzZW50ZWQgYXMgUHl0aG9uIHN0cmluZ3MuICBJdCB1c2VzIFxkZm57Zm9ybWF0IHN0cmluZ3N9Ci0oZXhwbGFpbmVkIGJlbG93KSBhcyBjb21wYWN0IGRlc2NyaXB0aW9ucyBvZiB0aGUgbGF5LW91dCBvZiB0aGUgQwotc3RydWN0cyBhbmQgdGhlIGludGVuZGVkIGNvbnZlcnNpb24gdG8vZnJvbSBQeXRob24gdmFsdWVzLiAgVGhpcyBjYW4KLWJlIHVzZWQgaW4gaGFuZGxpbmcgYmluYXJ5IGRhdGEgc3RvcmVkIGluIGZpbGVzIG9yIGZyb20gbmV0d29yawotY29ubmVjdGlvbnMsIGFtb25nIG90aGVyIHNvdXJjZXMuCi0KLVRoZSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbiBhbmQgZnVuY3Rpb25zOgotCi0KLVxiZWdpbntleGNkZXNjfXtlcnJvcn0KLSAgRXhjZXB0aW9uIHJhaXNlZCBvbiB2YXJpb3VzIG9jY2FzaW9uczsgYXJndW1lbnQgaXMgYSBzdHJpbmcKLSAgZGVzY3JpYmluZyB3aGF0IGlzIHdyb25nLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3BhY2t9e2ZtdCwgdjEsIHYyLCBcdGV4dHJte1xsZG90c319Ci0gIFJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSB2YWx1ZXMKLSAgXGNvZGV7XHZhcnt2MX0sIFx2YXJ7djJ9LCBcdGV4dHJte1xsZG90c319IHBhY2tlZCBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuCi0gIGZvcm1hdC4gIFRoZSBhcmd1bWVudHMgbXVzdCBtYXRjaCB0aGUgdmFsdWVzIHJlcXVpcmVkIGJ5IHRoZSBmb3JtYXQKLSAgZXhhY3RseS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cGFja19pbnRvfXtmbXQsIGJ1ZmZlciwgb2Zmc2V0LCB2MSwgdjIsIFxtb3JlYXJnc30KLSAgUGFjayB0aGUgdmFsdWVzIFxjb2Rle1x2YXJ7djF9LCBcdmFye3YyfSwgXHRleHRybXtcbGRvdHN9fSBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuCi0gIGZvcm1hdCwgd3JpdGUgdGhlIHBhY2tlZCBieXRlcyBpbnRvIHRoZSB3cml0YWJsZSBcdmFye2J1ZmZlcn0gc3RhcnRpbmcgYXQKLSAgXHZhcntvZmZzZXR9LgotICBOb3RlIHRoYXQgdGhlIG9mZnNldCBpcyBub3QgYW4gb3B0aW9uYWwgYXJndW1lbnQuCi0KLSAgXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3VucGFja317Zm10LCBzdHJpbmd9Ci0gIFVucGFjayB0aGUgc3RyaW5nIChwcmVzdW1hYmx5IHBhY2tlZCBieSBcY29kZXtwYWNrKFx2YXJ7Zm10fSwKLSAgXHRleHRybXtcbGRvdHN9KX0pIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gZm9ybWF0LiAgVGhlIHJlc3VsdCBpcyBhCi0gIHR1cGxlIGV2ZW4gaWYgaXQgY29udGFpbnMgZXhhY3RseSBvbmUgaXRlbS4gIFRoZSBzdHJpbmcgbXVzdCBjb250YWluCi0gIGV4YWN0bHkgdGhlIGFtb3VudCBvZiBkYXRhIHJlcXVpcmVkIGJ5IHRoZSBmb3JtYXQKLSAgKFxjb2Rle2xlbihcdmFye3N0cmluZ30pfSBtdXN0IGVxdWFsIFxjb2Rle2NhbGNzaXplKFx2YXJ7Zm10fSl9KS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dW5wYWNrX2Zyb219e2ZtdCwgYnVmZmVyXG9wdGlvbmFseyxvZmZzZXQgXGNvZGV7PSAwfX19Ci0gIFVucGFjayB0aGUgXHZhcntidWZmZXJ9IGFjY29yZGluZyB0byB0dGhlIGdpdmVuIGZvcm1hdC4KLSAgVGhlIHJlc3VsdCBpcyBhIHR1cGxlIGV2ZW4gaWYgaXQgY29udGFpbnMgZXhhY3RseSBvbmUgaXRlbS4gVGhlCi0gIFx2YXJ7YnVmZmVyfSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgdGhlIGFtb3VudCBvZiBkYXRhIHJlcXVpcmVkIGJ5IHRoZQotICBmb3JtYXQgKFxjb2Rle2xlbihidWZmZXJbb2Zmc2V0Ol0pfSBtdXN0IGJlIGF0IGxlYXN0Ci0gIFxjb2Rle2NhbGNzaXplKFx2YXJ7Zm10fSl9KS4KLQotICBcdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y2FsY3NpemV9e2ZtdH0KLSAgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzdHJ1Y3QgKGFuZCBoZW5jZSBvZiB0aGUgc3RyaW5nKQotICBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBmb3JtYXQuCi1cZW5ke2Z1bmNkZXNjfQotCi1Gb3JtYXQgY2hhcmFjdGVycyBoYXZlIHRoZSBmb2xsb3dpbmcgbWVhbmluZzsgdGhlIGNvbnZlcnNpb24gYmV0d2VlbgotQyBhbmQgUHl0aG9uIHZhbHVlcyBzaG91bGQgYmUgb2J2aW91cyBnaXZlbiB0aGVpciB0eXBlczoKLQotXGJlZ2lue3RhYmxlaXZ9e2N8bHxsfGN9e3NhbXB9e0Zvcm1hdH17QyBUeXBlfXtQeXRob259e05vdGVzfQotICBcbGluZWl2e3h9e3BhZCBieXRlfXtubyB2YWx1ZX17fQotICBcbGluZWl2e2N9e1xjdHlwZXtjaGFyfX17c3RyaW5nIG9mIGxlbmd0aCAxfXt9Ci0gIFxsaW5laXZ7Yn17XGN0eXBle3NpZ25lZCBjaGFyfX17aW50ZWdlcn17fQotICBcbGluZWl2e0J9e1xjdHlwZXt1bnNpZ25lZCBjaGFyfX17aW50ZWdlcn17fQotICBcbGluZWl2e3R9e1xjdHlwZXtfQm9vbH19e2Jvb2x9eygxKX0KLSAgXGxpbmVpdntofXtcY3R5cGV7c2hvcnR9fXtpbnRlZ2VyfXt9Ci0gIFxsaW5laXZ7SH17XGN0eXBle3Vuc2lnbmVkIHNob3J0fX17aW50ZWdlcn17fQotICBcbGluZWl2e2l9e1xjdHlwZXtpbnR9fXtpbnRlZ2VyfXt9Ci0gIFxsaW5laXZ7SX17XGN0eXBle3Vuc2lnbmVkIGludH19e2xvbmd9e30KLSAgXGxpbmVpdntsfXtcY3R5cGV7bG9uZ319e2ludGVnZXJ9e30KLSAgXGxpbmVpdntMfXtcY3R5cGV7dW5zaWduZWQgbG9uZ319e2xvbmd9e30KLSAgXGxpbmVpdntxfXtcY3R5cGV7bG9uZyBsb25nfX17bG9uZ317KDIpfQotICBcbGluZWl2e1F9e1xjdHlwZXt1bnNpZ25lZCBsb25nIGxvbmd9fXtsb25nfXsoMil9Ci0gIFxsaW5laXZ7Zn17XGN0eXBle2Zsb2F0fX17ZmxvYXR9e30KLSAgXGxpbmVpdntkfXtcY3R5cGV7ZG91YmxlfX17ZmxvYXR9e30KLSAgXGxpbmVpdntzfXtcY3R5cGV7Y2hhcltdfX17c3RyaW5nfXt9Ci0gIFxsaW5laXZ7cH17XGN0eXBle2NoYXJbXX19e3N0cmluZ317fQotICBcbGluZWl2e1B9e1xjdHlwZXt2b2lkICp9fXtpbnRlZ2VyfXt9Ci1cZW5ke3RhYmxlaXZ9Ci0KLVxub2luZGVudAotTm90ZXM6Ci0KLVxiZWdpbntkZXNjcmlwdGlvbn0KLVxpdGVtWygxKV0KLSAgVGhlIFxjaGFyYWN0ZXJ7dH0gY29udmVyc2lvbiBjb2RlIGNvcnJlc3BvbmRzIHRvIHRoZSBcY3R5cGV7X0Jvb2x9IHR5cGUKLSAgZGVmaW5lZCBieSBDOTkuIElmIHRoaXMgdHlwZSBpcyBub3QgYXZhaWxhYmxlLCBpdCBpcyBzaW11bGF0ZWQgdXNpbmcgYQotICBcY3R5cGV7Y2hhcn0uIEluIHN0YW5kYXJkIG1vZGUsIGl0IGlzIGFsd2F5cyByZXByZXNlbnRlZCBieSBvbmUgYnl0ZS4KLSAgXHZlcnNpb25hZGRlZHsyLjZ9Ci1caXRlbVsoMildCi0gIFRoZSBcY2hhcmFjdGVye3F9IGFuZCBcY2hhcmFjdGVye1F9IGNvbnZlcnNpb24gY29kZXMgYXJlIGF2YWlsYWJsZSBpbgotICBuYXRpdmUgbW9kZSBvbmx5IGlmIHRoZSBwbGF0Zm9ybSBDIGNvbXBpbGVyIHN1cHBvcnRzIEMgXGN0eXBle2xvbmcgbG9uZ30sCi0gIG9yLCBvbiBXaW5kb3dzLCBcY3R5cGV7X19pbnQ2NH0uICBUaGV5IGFyZSBhbHdheXMgYXZhaWxhYmxlIGluIHN0YW5kYXJkCi0gIG1vZGVzLgotICBcdmVyc2lvbmFkZGVkezIuMn0KLVxlbmR7ZGVzY3JpcHRpb259Ci0KLQotQSBmb3JtYXQgY2hhcmFjdGVyIG1heSBiZSBwcmVjZWRlZCBieSBhbiBpbnRlZ3JhbCByZXBlYXQgY291bnQuICBGb3IKLWV4YW1wbGUsIHRoZSBmb3JtYXQgc3RyaW5nIFxjb2Rleyc0aCd9IG1lYW5zIGV4YWN0bHkgdGhlIHNhbWUgYXMKLVxjb2RleydoaGhoJ30uCi0KLVdoaXRlc3BhY2UgY2hhcmFjdGVycyBiZXR3ZWVuIGZvcm1hdHMgYXJlIGlnbm9yZWQ7IGEgY291bnQgYW5kIGl0cwotZm9ybWF0IG11c3Qgbm90IGNvbnRhaW4gd2hpdGVzcGFjZSB0aG91Z2guCi0KLUZvciB0aGUgXGNoYXJhY3RlcntzfSBmb3JtYXQgY2hhcmFjdGVyLCB0aGUgY291bnQgaXMgaW50ZXJwcmV0ZWQgYXMgdGhlCi1zaXplIG9mIHRoZSBzdHJpbmcsIG5vdCBhIHJlcGVhdCBjb3VudCBsaWtlIGZvciB0aGUgb3RoZXIgZm9ybWF0Ci1jaGFyYWN0ZXJzOyBmb3IgZXhhbXBsZSwgXGNvZGV7JzEwcyd9IG1lYW5zIGEgc2luZ2xlIDEwLWJ5dGUgc3RyaW5nLCB3aGlsZQotXGNvZGV7JzEwYyd9IG1lYW5zIDEwIGNoYXJhY3RlcnMuICBGb3IgcGFja2luZywgdGhlIHN0cmluZyBpcwotdHJ1bmNhdGVkIG9yIHBhZGRlZCB3aXRoIG51bGwgYnl0ZXMgYXMgYXBwcm9wcmlhdGUgdG8gbWFrZSBpdCBmaXQuCi1Gb3IgdW5wYWNraW5nLCB0aGUgcmVzdWx0aW5nIHN0cmluZyBhbHdheXMgaGFzIGV4YWN0bHkgdGhlIHNwZWNpZmllZAotbnVtYmVyIG9mIGJ5dGVzLiAgQXMgYSBzcGVjaWFsIGNhc2UsIFxjb2Rleycwcyd9IG1lYW5zIGEgc2luZ2xlLCBlbXB0eQotc3RyaW5nICh3aGlsZSBcY29kZXsnMGMnfSBtZWFucyAwIGNoYXJhY3RlcnMpLgotCi1UaGUgXGNoYXJhY3RlcntwfSBmb3JtYXQgY2hhcmFjdGVyIGVuY29kZXMgYSAiUGFzY2FsIHN0cmluZyIsIG1lYW5pbmcKLWEgc2hvcnQgdmFyaWFibGUtbGVuZ3RoIHN0cmluZyBzdG9yZWQgaW4gYSBmaXhlZCBudW1iZXIgb2YgYnl0ZXMuCi1UaGUgY291bnQgaXMgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyBzdG9yZWQuICBUaGUgZmlyc3QgYnl0ZSBzdG9yZWQgaXMKLXRoZSBsZW5ndGggb2YgdGhlIHN0cmluZywgb3IgMjU1LCB3aGljaGV2ZXIgaXMgc21hbGxlci4gIFRoZSBieXRlcwotb2YgdGhlIHN0cmluZyBmb2xsb3cuICBJZiB0aGUgc3RyaW5nIHBhc3NlZCBpbiB0byBcZnVuY3Rpb257cGFjaygpfSBpcyB0b28KLWxvbmcgKGxvbmdlciB0aGFuIHRoZSBjb3VudCBtaW51cyAxKSwgb25seSB0aGUgbGVhZGluZyBjb3VudC0xIGJ5dGVzIG9mIHRoZQotc3RyaW5nIGFyZSBzdG9yZWQuICBJZiB0aGUgc3RyaW5nIGlzIHNob3J0ZXIgdGhhbiBjb3VudC0xLCBpdCBpcyBwYWRkZWQKLXdpdGggbnVsbCBieXRlcyBzbyB0aGF0IGV4YWN0bHkgY291bnQgYnl0ZXMgaW4gYWxsIGFyZSB1c2VkLiAgTm90ZSB0aGF0Ci1mb3IgXGZ1bmN0aW9ue3VucGFjaygpfSwgdGhlIFxjaGFyYWN0ZXJ7cH0gZm9ybWF0IGNoYXJhY3RlciBjb25zdW1lcyBjb3VudAotYnl0ZXMsIGJ1dCB0aGF0IHRoZSBzdHJpbmcgcmV0dXJuZWQgY2FuIG5ldmVyIGNvbnRhaW4gbW9yZSB0aGFuIDI1NQotY2hhcmFjdGVycy4KLQotRm9yIHRoZSBcY2hhcmFjdGVye0l9LCBcY2hhcmFjdGVye0x9LCBcY2hhcmFjdGVye3F9IGFuZCBcY2hhcmFjdGVye1F9Ci1mb3JtYXQgY2hhcmFjdGVycywgdGhlIHJldHVybiB2YWx1ZSBpcyBhIFB5dGhvbiBsb25nIGludGVnZXIuCi0KLUZvciB0aGUgXGNoYXJhY3RlcntQfSBmb3JtYXQgY2hhcmFjdGVyLCB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgUHl0aG9uCi1pbnRlZ2VyIG9yIGxvbmcgaW50ZWdlciwgZGVwZW5kaW5nIG9uIHRoZSBzaXplIG5lZWRlZCB0byBob2xkIGEKLXBvaW50ZXIgd2hlbiBpdCBoYXMgYmVlbiBjYXN0IHRvIGFuIGludGVnZXIgdHlwZS4gIEEgXE5VTEx7fSBwb2ludGVyIHdpbGwKLWFsd2F5cyBiZSByZXR1cm5lZCBhcyB0aGUgUHl0aG9uIGludGVnZXIgXGNvZGV7MH0uIFdoZW4gcGFja2luZyBwb2ludGVyLXNpemVkCi12YWx1ZXMsIFB5dGhvbiBpbnRlZ2VyIG9yIGxvbmcgaW50ZWdlciBvYmplY3RzIG1heSBiZSB1c2VkLiAgRm9yCi1leGFtcGxlLCB0aGUgQWxwaGEgYW5kIE1lcmNlZCBwcm9jZXNzb3JzIHVzZSA2NC1iaXQgcG9pbnRlciB2YWx1ZXMsCi1tZWFuaW5nIGEgUHl0aG9uIGxvbmcgaW50ZWdlciB3aWxsIGJlIHVzZWQgdG8gaG9sZCB0aGUgcG9pbnRlcjsgb3RoZXIKLXBsYXRmb3JtcyB1c2UgMzItYml0IHBvaW50ZXJzIGFuZCB3aWxsIHVzZSBhIFB5dGhvbiBpbnRlZ2VyLgotCi1Gb3IgdGhlIFxjaGFyYWN0ZXJ7dH0gZm9ybWF0IGNoYXJhY3RlciwgdGhlIHJldHVybiB2YWx1ZSBpcyBlaXRoZXIKLVxjb25zdGFudHtUcnVlfSBvciBcY29uc3RhbnR7RmFsc2V9LiBXaGVuIHBhY2tpbmcsIHRoZSB0cnV0aCB2YWx1ZQotb2YgdGhlIGFyZ3VtZW50IG9iamVjdCBpcyB1c2VkLiBFaXRoZXIgMCBvciAxIGluIHRoZSBuYXRpdmUgb3Igc3RhbmRhcmQKLWJvb2wgcmVwcmVzZW50YXRpb24gd2lsbCBiZSBwYWNrZWQsIGFuZCBhbnkgbm9uLXplcm8gdmFsdWUgd2lsbCBiZSBUcnVlCi13aGVuIHVucGFja2luZy4KLQotQnkgZGVmYXVsdCwgQyBudW1iZXJzIGFyZSByZXByZXNlbnRlZCBpbiB0aGUgbWFjaGluZSdzIG5hdGl2ZSBmb3JtYXQKLWFuZCBieXRlIG9yZGVyLCBhbmQgcHJvcGVybHkgYWxpZ25lZCBieSBza2lwcGluZyBwYWQgYnl0ZXMgaWYKLW5lY2Vzc2FyeSAoYWNjb3JkaW5nIHRvIHRoZSBydWxlcyB1c2VkIGJ5IHRoZSBDIGNvbXBpbGVyKS4KLQotQWx0ZXJuYXRpdmVseSwgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgZm9ybWF0IHN0cmluZyBjYW4gYmUgdXNlZCB0bwotaW5kaWNhdGUgdGhlIGJ5dGUgb3JkZXIsIHNpemUgYW5kIGFsaWdubWVudCBvZiB0aGUgcGFja2VkIGRhdGEsCi1hY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyB0YWJsZToKLQotXGJlZ2lue3RhYmxlaWlpfXtjfGx8bH17c2FtcH17Q2hhcmFjdGVyfXtCeXRlIG9yZGVyfXtTaXplIGFuZCBhbGlnbm1lbnR9Ci0gIFxsaW5laWlpe0B9e25hdGl2ZX17bmF0aXZlfQotICBcbGluZWlpaXs9fXtuYXRpdmV9e3N0YW5kYXJkfQotICBcbGluZWlpaXs8fXtsaXR0bGUtZW5kaWFufXtzdGFuZGFyZH0KLSAgXGxpbmVpaWl7Pn17YmlnLWVuZGlhbn17c3RhbmRhcmR9Ci0gIFxsaW5laWlpeyF9e25ldHdvcmsgKD0gYmlnLWVuZGlhbil9e3N0YW5kYXJkfQotXGVuZHt0YWJsZWlpaX0KLQotSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyBub3Qgb25lIG9mIHRoZXNlLCBcY2hhcmFjdGVye0B9IGlzIGFzc3VtZWQuCi0KLU5hdGl2ZSBieXRlIG9yZGVyIGlzIGJpZy1lbmRpYW4gb3IgbGl0dGxlLWVuZGlhbiwgZGVwZW5kaW5nIG9uIHRoZQotaG9zdCBzeXN0ZW0uICBGb3IgZXhhbXBsZSwgTW90b3JvbGEgYW5kIFN1biBwcm9jZXNzb3JzIGFyZSBiaWctZW5kaWFuOwotSW50ZWwgYW5kIERFQyBwcm9jZXNzb3JzIGFyZSBsaXR0bGUtZW5kaWFuLgotCi1OYXRpdmUgc2l6ZSBhbmQgYWxpZ25tZW50IGFyZSBkZXRlcm1pbmVkIHVzaW5nIHRoZSBDIGNvbXBpbGVyJ3MKLVxrZXl3b3Jke3NpemVvZn0gZXhwcmVzc2lvbi4gIFRoaXMgaXMgYWx3YXlzIGNvbWJpbmVkIHdpdGggbmF0aXZlIGJ5dGUKLW9yZGVyLgotCi1TdGFuZGFyZCBzaXplIGFuZCBhbGlnbm1lbnQgYXJlIGFzIGZvbGxvd3M6IG5vIGFsaWdubWVudCBpcyByZXF1aXJlZAotZm9yIGFueSB0eXBlIChzbyB5b3UgaGF2ZSB0byB1c2UgcGFkIGJ5dGVzKTsKLVxjdHlwZXtzaG9ydH0gaXMgMiBieXRlczsKLVxjdHlwZXtpbnR9IGFuZCBcY3R5cGV7bG9uZ30gYXJlIDQgYnl0ZXM7Ci1cY3R5cGV7bG9uZyBsb25nfSAoXGN0eXBle19faW50NjR9IG9uIFdpbmRvd3MpIGlzIDggYnl0ZXM7Ci1cY3R5cGV7ZmxvYXR9IGFuZCBcY3R5cGV7ZG91YmxlfSBhcmUgMzItYml0IGFuZCA2NC1iaXQKLUlFRUUgZmxvYXRpbmcgcG9pbnQgbnVtYmVycywgcmVzcGVjdGl2ZWx5LgotXGN0eXBle19Cb29sfSBpcyAxIGJ5dGUuCi0KLU5vdGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBcY2hhcmFjdGVye0B9IGFuZCBcY2hhcmFjdGVyez19OiBib3RoIHVzZQotbmF0aXZlIGJ5dGUgb3JkZXIsIGJ1dCB0aGUgc2l6ZSBhbmQgYWxpZ25tZW50IG9mIHRoZSBsYXR0ZXIgaXMKLXN0YW5kYXJkaXplZC4KLQotVGhlIGZvcm0gXGNoYXJhY3RlcnshfSBpcyBhdmFpbGFibGUgZm9yIHRob3NlIHBvb3Igc291bHMgd2hvIGNsYWltIHRoZXkKLWNhbid0IHJlbWVtYmVyIHdoZXRoZXIgbmV0d29yayBieXRlIG9yZGVyIGlzIGJpZy1lbmRpYW4gb3IKLWxpdHRsZS1lbmRpYW4uCi0KLVRoZXJlIGlzIG5vIHdheSB0byBpbmRpY2F0ZSBub24tbmF0aXZlIGJ5dGUgb3JkZXIgKGZvcmNlCi1ieXRlLXN3YXBwaW5nKTsgdXNlIHRoZSBhcHByb3ByaWF0ZSBjaG9pY2Ugb2YgXGNoYXJhY3Rlcns8fSBvcgotXGNoYXJhY3Rlcns+fS4KLQotVGhlIFxjaGFyYWN0ZXJ7UH0gZm9ybWF0IGNoYXJhY3RlciBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgdGhlIG5hdGl2ZQotYnl0ZSBvcmRlcmluZyAoc2VsZWN0ZWQgYXMgdGhlIGRlZmF1bHQgb3Igd2l0aCB0aGUgXGNoYXJhY3RlcntAfSBieXRlCi1vcmRlciBjaGFyYWN0ZXIpLiBUaGUgYnl0ZSBvcmRlciBjaGFyYWN0ZXIgXGNoYXJhY3Rlcns9fSBjaG9vc2VzIHRvCi11c2UgbGl0dGxlLSBvciBiaWctZW5kaWFuIG9yZGVyaW5nIGJhc2VkIG9uIHRoZSBob3N0IHN5c3RlbS4gVGhlCi1zdHJ1Y3QgbW9kdWxlIGRvZXMgbm90IGludGVycHJldCB0aGlzIGFzIG5hdGl2ZSBvcmRlcmluZywgc28gdGhlCi1cY2hhcmFjdGVye1B9IGZvcm1hdCBpcyBub3QgYXZhaWxhYmxlLgotCi1FeGFtcGxlcyAoYWxsIHVzaW5nIG5hdGl2ZSBieXRlIG9yZGVyLCBzaXplIGFuZCBhbGlnbm1lbnQsIG9uIGEKLWJpZy1lbmRpYW4gbWFjaGluZSk6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBmcm9tIHN0cnVjdCBpbXBvcnQgKgotPj4+IHBhY2soJ2hobCcsIDEsIDIsIDMpCi0nXHgwMFx4MDFceDAwXHgwMlx4MDBceDAwXHgwMFx4MDMnCi0+Pj4gdW5wYWNrKCdoaGwnLCAnXHgwMFx4MDFceDAwXHgwMlx4MDBceDAwXHgwMFx4MDMnKQotKDEsIDIsIDMpCi0+Pj4gY2FsY3NpemUoJ2hobCcpCi04Ci1cZW5ke3ZlcmJhdGltfQotCi1IaW50OiB0byBhbGlnbiB0aGUgZW5kIG9mIGEgc3RydWN0dXJlIHRvIHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgb2YKLWEgcGFydGljdWxhciB0eXBlLCBlbmQgdGhlIGZvcm1hdCB3aXRoIHRoZSBjb2RlIGZvciB0aGF0IHR5cGUgd2l0aCBhCi1yZXBlYXQgY291bnQgb2YgemVyby4gIEZvciBleGFtcGxlLCB0aGUgZm9ybWF0IFxjb2RleydsbGgwbCd9Ci1zcGVjaWZpZXMgdHdvIHBhZCBieXRlcyBhdCB0aGUgZW5kLCBhc3N1bWluZyBsb25ncyBhcmUgYWxpZ25lZCBvbgotNC1ieXRlIGJvdW5kYXJpZXMuICBUaGlzIG9ubHkgd29ya3Mgd2hlbiBuYXRpdmUgc2l6ZSBhbmQgYWxpZ25tZW50IGFyZQotaW4gZWZmZWN0OyBzdGFuZGFyZCBzaXplIGFuZCBhbGlnbm1lbnQgZG9lcyBub3QgZW5mb3JjZSBhbnkgYWxpZ25tZW50LgotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZW1vZHVsZXthcnJheX17UGFja2VkIGJpbmFyeSBzdG9yYWdlIG9mIGhvbW9nZW5lb3VzIGRhdGEufQotICBcc2VlbW9kdWxle3hkcmxpYn17UGFja2luZyBhbmQgdW5wYWNraW5nIG9mIFhEUiBkYXRhLn0KLVxlbmR7c2VlYWxzb30KLQotXHN1YnNlY3Rpb257U3RydWN0IE9iamVjdHMgXGxhYmVse3N0cnVjdC1vYmplY3RzfX0KLQotVGhlIFxtb2R1bGV7c3RydWN0fSBtb2R1bGUgYWxzbyBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgdHlwZToKLQotXGJlZ2lue2NsYXNzZGVzY317U3RydWN0fXtmb3JtYXR9Ci0gIFJldHVybiBhIG5ldyBTdHJ1Y3Qgb2JqZWN0IHdoaWNoIHdyaXRlcyBhbmQgcmVhZHMgYmluYXJ5IGRhdGEgYWNjb3JkaW5nIHRvCi0gIHRoZSBmb3JtYXQgc3RyaW5nIFx2YXJ7Zm9ybWF0fS4gIENyZWF0aW5nIGEgU3RydWN0IG9iamVjdCBvbmNlIGFuZCBjYWxsaW5nCi0gIGl0cyBtZXRob2RzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gY2FsbGluZyB0aGUgXG1vZHVsZXtzdHJ1Y3R9IGZ1bmN0aW9ucwotICB3aXRoIHRoZSBzYW1lIGZvcm1hdCBzaW5jZSB0aGUgZm9ybWF0IHN0cmluZyBvbmx5IG5lZWRzIHRvIGJlIGNvbXBpbGVkIG9uY2UuCi0KLSBcdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7Y2xhc3NkZXNjfQotCi1Db21waWxlZCBTdHJ1Y3Qgb2JqZWN0cyBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhbmQgYXR0cmlidXRlczoKLQotXGJlZ2lue21ldGhvZGRlc2N9W1N0cnVjdF17cGFja317djEsIHYyLCBcbW9yZWFyZ3N9Ci0gIElkZW50aWNhbCB0byB0aGUgXGZ1bmN0aW9ue3BhY2soKX0gZnVuY3Rpb24sIHVzaW5nIHRoZSBjb21waWxlZCBmb3JtYXQuCi0gIChcY29kZXtsZW4ocmVzdWx0KX0gd2lsbCBlcXVhbCBcbWVtYmVye3NlbGYuc2l6ZX0uKQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bU3RydWN0XXtwYWNrX2ludG99e2J1ZmZlciwgb2Zmc2V0LCB2MSwgdjIsIFxtb3JlYXJnc30KLSAgSWRlbnRpY2FsIHRvIHRoZSBcZnVuY3Rpb257cGFja19pbnRvKCl9IGZ1bmN0aW9uLCB1c2luZyB0aGUgY29tcGlsZWQgZm9ybWF0LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bU3RydWN0XXt1bnBhY2t9e3N0cmluZ30KLSAgSWRlbnRpY2FsIHRvIHRoZSBcZnVuY3Rpb257dW5wYWNrKCl9IGZ1bmN0aW9uLCB1c2luZyB0aGUgY29tcGlsZWQgZm9ybWF0LgotICAoXGNvZGV7bGVuKHN0cmluZyl9IG11c3QgZXF1YWwgXG1lbWJlcntzZWxmLnNpemV9KS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1N0cnVjdF17dW5wYWNrX2Zyb219e2J1ZmZlclxvcHRpb25hbHssb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXGNvZGV7PSAwfX19Ci0gIElkZW50aWNhbCB0byB0aGUgXGZ1bmN0aW9ue3VucGFja19mcm9tKCl9IGZ1bmN0aW9uLCB1c2luZyB0aGUgY29tcGlsZWQgZm9ybWF0LgotICAoXGNvZGV7bGVuKGJ1ZmZlcltvZmZzZXQ6XSl9IG11c3QgYmUgYXQgbGVhc3QgXG1lbWJlcntzZWxmLnNpemV9KS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W1N0cnVjdF17Zm9ybWF0fQotICBUaGUgZm9ybWF0IHN0cmluZyB1c2VkIHRvIGNvbnN0cnVjdCB0aGlzIFN0cnVjdCBvYmplY3QuCi1cZW5ke21lbWJlcmRlc2N9Ci0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic3VicHJvY2Vzcy50ZXggYi9Eb2MvbGliL2xpYnN1YnByb2Nlc3MudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmE5YmI2Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlic3VicHJvY2Vzcy50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtzdWJwcm9jZXNzfSAtLS0gU3VicHJvY2VzcyBtYW5hZ2VtZW50fQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17c3VicHJvY2Vzc30KLVxtb2R1bGVzeW5vcHNpc3tTdWJwcm9jZXNzIG1hbmFnZW1lbnQufQotXG1vZHVsZWF1dGhvcntQZXRlciBcQUEgc3RyYW5kfXthc3RyYW5kQGx5c2F0b3IubGl1LnNlfQotXHNlY3Rpb25hdXRob3J7UGV0ZXIgXEFBIHN0cmFuZH17YXN0cmFuZEBseXNhdG9yLmxpdS5zZX0KLQotXHZlcnNpb25hZGRlZHsyLjR9Ci0KLVRoZSBcbW9kdWxle3N1YnByb2Nlc3N9IG1vZHVsZSBhbGxvd3MgeW91IHRvIHNwYXduIG5ldyBwcm9jZXNzZXMsCi1jb25uZWN0IHRvIHRoZWlyIGlucHV0L291dHB1dC9lcnJvciBwaXBlcywgYW5kIG9idGFpbiB0aGVpciByZXR1cm4KLWNvZGVzLiAgVGhpcyBtb2R1bGUgaW50ZW5kcyB0byByZXBsYWNlIHNldmVyYWwgb3RoZXIsIG9sZGVyIG1vZHVsZXMKLWFuZCBmdW5jdGlvbnMsIHN1Y2ggYXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLW9zLnN5c3RlbQotb3Muc3Bhd24qCi1jb21tYW5kcy4qCi1cZW5ke3ZlcmJhdGltfQotCi1JbmZvcm1hdGlvbiBhYm91dCBob3cgdGhlIFxtb2R1bGV7c3VicHJvY2Vzc30gbW9kdWxlIGNhbiBiZSB1c2VkIHRvCi1yZXBsYWNlIHRoZXNlIG1vZHVsZXMgYW5kIGZ1bmN0aW9ucyBjYW4gYmUgZm91bmQgaW4gdGhlIGZvbGxvd2luZwotc2VjdGlvbnMuCi0KLVxzdWJzZWN0aW9ue1VzaW5nIHRoZSBzdWJwcm9jZXNzIE1vZHVsZX0KLQotVGhpcyBtb2R1bGUgZGVmaW5lcyBvbmUgY2xhc3MgY2FsbGVkIFxjbGFzc3tQb3Blbn06Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1BvcGVufXthcmdzLCBidWZzaXplPTAsIGV4ZWN1dGFibGU9Tm9uZSwKLSAgICAgICAgICAgIHN0ZGluPU5vbmUsIHN0ZG91dD1Ob25lLCBzdGRlcnI9Tm9uZSwKLSAgICAgICAgICAgIHByZWV4ZWNfZm49Tm9uZSwgY2xvc2VfZmRzPUZhbHNlLCBzaGVsbD1GYWxzZSwKLSAgICAgICAgICAgIGN3ZD1Ob25lLCBlbnY9Tm9uZSwgdW5pdmVyc2FsX25ld2xpbmVzPUZhbHNlLAotICAgICAgICAgICAgc3RhcnR1cGluZm89Tm9uZSwgY3JlYXRpb25mbGFncz0wfQotCi1Bcmd1bWVudHMgYXJlOgotCi1cdmFye2FyZ3N9IHNob3VsZCBiZSBhIHN0cmluZywgb3IgYSBzZXF1ZW5jZSBvZiBwcm9ncmFtIGFyZ3VtZW50cy4gIFRoZQotcHJvZ3JhbSB0byBleGVjdXRlIGlzIG5vcm1hbGx5IHRoZSBmaXJzdCBpdGVtIGluIHRoZSBhcmdzIHNlcXVlbmNlIG9yCi1zdHJpbmcsIGJ1dCBjYW4gYmUgZXhwbGljaXRseSBzZXQgYnkgdXNpbmcgdGhlIGV4ZWN1dGFibGUgYXJndW1lbnQuCi0KLU9uIFxVTklYe30sIHdpdGggXHZhcntzaGVsbD1GYWxzZX0gKGRlZmF1bHQpOiBJbiB0aGlzIGNhc2UsIHRoZSBQb3BlbgotY2xhc3MgdXNlcyBcbWV0aG9ke29zLmV4ZWN2cCgpfSB0byBleGVjdXRlIHRoZSBjaGlsZCBwcm9ncmFtLgotXHZhcnthcmdzfSBzaG91bGQgbm9ybWFsbHkgYmUgYSBzZXF1ZW5jZS4gIEEgc3RyaW5nIHdpbGwgYmUgdHJlYXRlZCBhcyBhCi1zZXF1ZW5jZSB3aXRoIHRoZSBzdHJpbmcgYXMgdGhlIG9ubHkgaXRlbSAodGhlIHByb2dyYW0gdG8gZXhlY3V0ZSkuCi0KLU9uIFxVTklYe30sIHdpdGggXHZhcntzaGVsbD1UcnVlfTogSWYgYXJncyBpcyBhIHN0cmluZywgaXQgc3BlY2lmaWVzIHRoZQotY29tbWFuZCBzdHJpbmcgdG8gZXhlY3V0ZSB0aHJvdWdoIHRoZSBzaGVsbC4gIElmIFx2YXJ7YXJnc30gaXMgYQotc2VxdWVuY2UsIHRoZSBmaXJzdCBpdGVtIHNwZWNpZmllcyB0aGUgY29tbWFuZCBzdHJpbmcsIGFuZCBhbnkKLWFkZGl0aW9uYWwgaXRlbXMgd2lsbCBiZSB0cmVhdGVkIGFzIGFkZGl0aW9uYWwgc2hlbGwgYXJndW1lbnRzLgotCi1PbiBXaW5kb3dzOiB0aGUgXGNsYXNze1BvcGVufSBjbGFzcyB1c2VzIENyZWF0ZVByb2Nlc3MoKSB0byBleGVjdXRlCi10aGUgY2hpbGQgcHJvZ3JhbSwgd2hpY2ggb3BlcmF0ZXMgb24gc3RyaW5ncy4gIElmIFx2YXJ7YXJnc30gaXMgYQotc2VxdWVuY2UsIGl0IHdpbGwgYmUgY29udmVydGVkIHRvIGEgc3RyaW5nIHVzaW5nIHRoZQotXG1ldGhvZHtsaXN0MmNtZGxpbmV9IG1ldGhvZC4gIFBsZWFzZSBub3RlIHRoYXQgbm90IGFsbCBNUyBXaW5kb3dzCi1hcHBsaWNhdGlvbnMgaW50ZXJwcmV0IHRoZSBjb21tYW5kIGxpbmUgdGhlIHNhbWUgd2F5OgotXG1ldGhvZHtsaXN0MmNtZGxpbmV9IGlzIGRlc2lnbmVkIGZvciBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIHNhbWUKLXJ1bGVzIGFzIHRoZSBNUyBDIHJ1bnRpbWUuCi0KLVx2YXJ7YnVmc2l6ZX0sIGlmIGdpdmVuLCBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyB0aGUgY29ycmVzcG9uZGluZwotYXJndW1lbnQgdG8gdGhlIGJ1aWx0LWluIG9wZW4oKSBmdW5jdGlvbjogXGNvbnN0YW50ezB9IG1lYW5zIHVuYnVmZmVyZWQsCi1cY29uc3RhbnR7MX0gbWVhbnMgbGluZSBidWZmZXJlZCwgYW55IG90aGVyIHBvc2l0aXZlIHZhbHVlIG1lYW5zIHVzZSBhCi1idWZmZXIgb2YgKGFwcHJveGltYXRlbHkpIHRoYXQgc2l6ZS4gIEEgbmVnYXRpdmUgXHZhcntidWZzaXplfSBtZWFucyB0bwotdXNlIHRoZSBzeXN0ZW0gZGVmYXVsdCwgd2hpY2ggdXN1YWxseSBtZWFucyBmdWxseSBidWZmZXJlZC4gIFRoZSBkZWZhdWx0Ci12YWx1ZSBmb3IgXHZhcntidWZzaXplfSBpcyBcY29uc3RhbnR7MH0gKHVuYnVmZmVyZWQpLgotCi1UaGUgXHZhcntleGVjdXRhYmxlfSBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIHByb2dyYW0gdG8gZXhlY3V0ZS4gSXQgaXMKLXZlcnkgc2VsZG9tIG5lZWRlZDogVXN1YWxseSwgdGhlIHByb2dyYW0gdG8gZXhlY3V0ZSBpcyBkZWZpbmVkIGJ5IHRoZQotXHZhcnthcmdzfSBhcmd1bWVudC4gSWYgXGNvZGV7c2hlbGw9VHJ1ZX0sIHRoZSBcdmFye2V4ZWN1dGFibGV9Ci1hcmd1bWVudCBzcGVjaWZpZXMgd2hpY2ggc2hlbGwgdG8gdXNlLiBPbiBcVU5JWHt9LCB0aGUgZGVmYXVsdCBzaGVsbAotaXMgXGZpbGV7L2Jpbi9zaH0uICBPbiBXaW5kb3dzLCB0aGUgZGVmYXVsdCBzaGVsbCBpcyBzcGVjaWZpZWQgYnkgdGhlCi1cZW52dmFye0NPTVNQRUN9IGVudmlyb25tZW50IHZhcmlhYmxlLgotCi1cdmFye3N0ZGlufSwgXHZhcntzdGRvdXR9IGFuZCBcdmFye3N0ZGVycn0gc3BlY2lmeSB0aGUgZXhlY3V0ZWQKLXByb2dyYW1zJyBzdGFuZGFyZCBpbnB1dCwgc3RhbmRhcmQgb3V0cHV0IGFuZCBzdGFuZGFyZCBlcnJvciBmaWxlCi1oYW5kbGVzLCByZXNwZWN0aXZlbHkuICBWYWxpZCB2YWx1ZXMgYXJlIFxjb2Rle1BJUEV9LCBhbiBleGlzdGluZyBmaWxlCi1kZXNjcmlwdG9yIChhIHBvc2l0aXZlIGludGVnZXIpLCBhbiBleGlzdGluZyBmaWxlIG9iamVjdCwgYW5kCi1cY29kZXtOb25lfS4gIFxjb2Rle1BJUEV9IGluZGljYXRlcyB0aGF0IGEgbmV3IHBpcGUgdG8gdGhlIGNoaWxkCi1zaG91bGQgYmUgY3JlYXRlZC4gIFdpdGggXGNvZGV7Tm9uZX0sIG5vIHJlZGlyZWN0aW9uIHdpbGwgb2NjdXI7IHRoZQotY2hpbGQncyBmaWxlIGhhbmRsZXMgd2lsbCBiZSBpbmhlcml0ZWQgZnJvbSB0aGUgcGFyZW50LiAgQWRkaXRpb25hbGx5LAotXHZhcntzdGRlcnJ9IGNhbiBiZSBcY29kZXtTVERPVVR9LCB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgc3RkZXJyCi1kYXRhIGZyb20gdGhlIGFwcGxpY2F0aW9ucyBzaG91bGQgYmUgY2FwdHVyZWQgaW50byB0aGUgc2FtZSBmaWxlCi1oYW5kbGUgYXMgZm9yIHN0ZG91dC4KLQotSWYgXHZhcntwcmVleGVjX2ZufSBpcyBzZXQgdG8gYSBjYWxsYWJsZSBvYmplY3QsIHRoaXMgb2JqZWN0IHdpbGwgYmUKLWNhbGxlZCBpbiB0aGUgY2hpbGQgcHJvY2VzcyBqdXN0IGJlZm9yZSB0aGUgY2hpbGQgaXMgZXhlY3V0ZWQuCi0oXFVOSVh7fSBvbmx5KQotCi1JZiBcdmFye2Nsb3NlX2Zkc30gaXMgdHJ1ZSwgYWxsIGZpbGUgZGVzY3JpcHRvcnMgZXhjZXB0IFxjb25zdGFudHswfSwKLVxjb25zdGFudHsxfSBhbmQgXGNvbnN0YW50ezJ9IHdpbGwgYmUgY2xvc2VkIGJlZm9yZSB0aGUgY2hpbGQgcHJvY2VzcyBpcwotZXhlY3V0ZWQuIChcVU5JWHt9IG9ubHkpLiAgT3IsIG9uIFdpbmRvd3MsIGlmIFx2YXJ7Y2xvc2VfZmRzfSBpcyB0cnVlCi10aGVuIG5vIGhhbmRsZXMgd2lsbCBiZSBpbmhlcml0ZWQgYnkgdGhlIGNoaWxkIHByb2Nlc3MuICBOb3RlIHRoYXQgb24KLVdpbmRvd3MsIHlvdSBjYW5ub3Qgc2V0IFx2YXJ7Y2xvc2VfZmRzfSB0byB0cnVlIGFuZCBhbHNvIHJlZGlyZWN0IHRoZQotc3RhbmRhcmQgaGFuZGxlcyBieSBzZXR0aW5nIFx2YXJ7c3RkaW59LCBcdmFye3N0ZG91dH0gb3IgXHZhcntzdGRlcnJ9LgotCi1JZiBcdmFye3NoZWxsfSBpcyBcY29uc3RhbnR7VHJ1ZX0sIHRoZSBzcGVjaWZpZWQgY29tbWFuZCB3aWxsIGJlCi1leGVjdXRlZCB0aHJvdWdoIHRoZSBzaGVsbC4KLQotSWYgXHZhcntjd2R9IGlzIG5vdCBcY29kZXtOb25lfSwgdGhlIGNoaWxkJ3MgY3VycmVudCBkaXJlY3Rvcnkgd2lsbCBiZQotY2hhbmdlZCB0byBcdmFye2N3ZH0gYmVmb3JlIGl0IGlzIGV4ZWN1dGVkLiAgTm90ZSB0aGF0IHRoaXMgZGlyZWN0b3J5Ci1pcyBub3QgY29uc2lkZXJlZCB3aGVuIHNlYXJjaGluZyB0aGUgZXhlY3V0YWJsZSwgc28geW91IGNhbid0IHNwZWNpZnkKLXRoZSBwcm9ncmFtJ3MgcGF0aCByZWxhdGl2ZSB0byBcdmFye2N3ZH0uCi0KLUlmIFx2YXJ7ZW52fSBpcyBub3QgXGNvZGV7Tm9uZX0sIGl0IGRlZmluZXMgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcwotZm9yIHRoZSBuZXcgcHJvY2Vzcy4KLQotSWYgXHZhcnt1bml2ZXJzYWxfbmV3bGluZXN9IGlzIFxjb25zdGFudHtUcnVlfSwgdGhlIGZpbGUgb2JqZWN0cyBzdGRvdXQKLWFuZCBzdGRlcnIgYXJlIG9wZW5lZCBhcyB0ZXh0IGZpbGVzLCBidXQgbGluZXMgbWF5IGJlIHRlcm1pbmF0ZWQgYnkKLWFueSBvZiBcY29kZXsnXGUgbid9LCB0aGUgXFVOSVh7fSBlbmQtb2YtbGluZSBjb252ZW50aW9uLCBcY29kZXsnXGUgcid9LAotdGhlIE1hY2ludG9zaCBjb252ZW50aW9uIG9yIFxjb2RleydcZSByXGUgbid9LCB0aGUgV2luZG93cyBjb252ZW50aW9uLgotQWxsIG9mIHRoZXNlIGV4dGVybmFsIHJlcHJlc2VudGF0aW9ucyBhcmUgc2VlbiBhcyBcY29kZXsnXGUgbid9IGJ5IHRoZQotUHl0aG9uIHByb2dyYW0uICBcbm90ZXtUaGlzIGZlYXR1cmUgaXMgb25seSBhdmFpbGFibGUgaWYgUHl0aG9uIGlzIGJ1aWx0Ci13aXRoIHVuaXZlcnNhbCBuZXdsaW5lIHN1cHBvcnQgKHRoZSBkZWZhdWx0KS4gIEFsc28sIHRoZSBuZXdsaW5lcwotYXR0cmlidXRlIG9mIHRoZSBmaWxlIG9iamVjdHMgXG1lbWJlcntzdGRvdXR9LCBcbWVtYmVye3N0ZGlufSBhbmQKLVxtZW1iZXJ7c3RkZXJyfSBhcmUgbm90IHVwZGF0ZWQgYnkgdGhlIGNvbW11bmljYXRlKCkgbWV0aG9kLn0KLQotVGhlIFx2YXJ7c3RhcnR1cGluZm99IGFuZCBcdmFye2NyZWF0aW9uZmxhZ3N9LCBpZiBnaXZlbiwgd2lsbCBiZQotcGFzc2VkIHRvIHRoZSB1bmRlcmx5aW5nIENyZWF0ZVByb2Nlc3MoKSBmdW5jdGlvbi4gIFRoZXkgY2FuIHNwZWNpZnkKLXRoaW5ncyBzdWNoIGFzIGFwcGVhcmFuY2Ugb2YgdGhlIG1haW4gd2luZG93IGFuZCBwcmlvcml0eSBmb3IgdGhlIG5ldwotcHJvY2Vzcy4gIChXaW5kb3dzIG9ubHkpCi1cZW5ke2NsYXNzZGVzY30KLQotXHN1YnN1YnNlY3Rpb257Q29udmVuaWVuY2UgRnVuY3Rpb25zfQotCi1UaGlzIG1vZHVsZSBhbHNvIGRlZmluZXMgdHdvIHNob3J0Y3V0IGZ1bmN0aW9uczoKLQotXGJlZ2lue2Z1bmNkZXNjfXtjYWxsfXsqcG9wZW5hcmdzLCAqKmt3YXJnc30KLVJ1biBjb21tYW5kIHdpdGggYXJndW1lbnRzLiAgV2FpdCBmb3IgY29tbWFuZCB0byBjb21wbGV0ZSwgdGhlbgotcmV0dXJuIHRoZSBcbWVtYmVye3JldHVybmNvZGV9IGF0dHJpYnV0ZS4KLQotVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgZm9yIHRoZSBQb3BlbiBjb25zdHJ1Y3Rvci4gIEV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICByZXRjb2RlID0gY2FsbChbImxzIiwgIi1sIl0pCi1cZW5ke3ZlcmJhdGltfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtjaGVja19jYWxsfXsqcG9wZW5hcmdzLCAqKmt3YXJnc30KLVJ1biBjb21tYW5kIHdpdGggYXJndW1lbnRzLiAgV2FpdCBmb3IgY29tbWFuZCB0byBjb21wbGV0ZS4gSWYgdGhlIGV4aXQKLWNvZGUgd2FzIHplcm8gdGhlbiByZXR1cm4sIG90aGVyd2lzZSByYWlzZSBcZXhjZXB0aW9ue0NhbGxlZFByb2Nlc3NFcnJvci59Ci1UaGUgXGV4Y2VwdGlvbntDYWxsZWRQcm9jZXNzRXJyb3J9IG9iamVjdCB3aWxsIGhhdmUgdGhlIHJldHVybiBjb2RlIGluIHRoZQotXG1lbWJlcntyZXR1cm5jb2RlfSBhdHRyaWJ1dGUuCi0KLVRoZSBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIGZvciB0aGUgUG9wZW4gY29uc3RydWN0b3IuICBFeGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgY2hlY2tfY2FsbChbImxzIiwgIi1sIl0pCi1cZW5ke3ZlcmJhdGltfQotCi1cdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxzdWJzdWJzZWN0aW9ue0V4Y2VwdGlvbnN9Ci0KLUV4Y2VwdGlvbnMgcmFpc2VkIGluIHRoZSBjaGlsZCBwcm9jZXNzLCBiZWZvcmUgdGhlIG5ldyBwcm9ncmFtIGhhcwotc3RhcnRlZCB0byBleGVjdXRlLCB3aWxsIGJlIHJlLXJhaXNlZCBpbiB0aGUgcGFyZW50LiAgQWRkaXRpb25hbGx5LAotdGhlIGV4Y2VwdGlvbiBvYmplY3Qgd2lsbCBoYXZlIG9uZSBleHRyYSBhdHRyaWJ1dGUgY2FsbGVkCi1cbWVtYmVye2NoaWxkX3RyYWNlYmFja30sIHdoaWNoIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdHJhY2ViYWNrCi1pbmZvcm1hdGlvbiBmcm9tIHRoZSBjaGlsZHMgcG9pbnQgb2Ygdmlldy4KLQotVGhlIG1vc3QgY29tbW9uIGV4Y2VwdGlvbiByYWlzZWQgaXMgXGV4Y2VwdGlvbntPU0Vycm9yfS4gIFRoaXMgb2NjdXJzLAotZm9yIGV4YW1wbGUsIHdoZW4gdHJ5aW5nIHRvIGV4ZWN1dGUgYSBub24tZXhpc3RlbnQgZmlsZS4gIEFwcGxpY2F0aW9ucwotc2hvdWxkIHByZXBhcmUgZm9yIFxleGNlcHRpb257T1NFcnJvcn0gZXhjZXB0aW9ucy4KLQotQSBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IHdpbGwgYmUgcmFpc2VkIGlmIFxjbGFzc3tQb3Blbn0gaXMgY2FsbGVkCi13aXRoIGludmFsaWQgYXJndW1lbnRzLgotCi1jaGVja19jYWxsKCkgd2lsbCByYWlzZSBcZXhjZXB0aW9ue0NhbGxlZFByb2Nlc3NFcnJvcn0sIGlmIHRoZSBjYWxsZWQKLXByb2Nlc3MgcmV0dXJucyBhIG5vbi16ZXJvIHJldHVybiBjb2RlLgotCi0KLVxzdWJzdWJzZWN0aW9ue1NlY3VyaXR5fQotCi1Vbmxpa2Ugc29tZSBvdGhlciBwb3BlbiBmdW5jdGlvbnMsIHRoaXMgaW1wbGVtZW50YXRpb24gd2lsbCBuZXZlciBjYWxsCi0vYmluL3NoIGltcGxpY2l0bHkuICBUaGlzIG1lYW5zIHRoYXQgYWxsIGNoYXJhY3RlcnMsIGluY2x1ZGluZyBzaGVsbAotbWV0YWNoYXJhY3RlcnMsIGNhbiBzYWZlbHkgYmUgcGFzc2VkIHRvIGNoaWxkIHByb2Nlc3Nlcy4KLQotCi1cc3Vic2VjdGlvbntQb3BlbiBPYmplY3RzfQotCi1JbnN0YW5jZXMgb2YgdGhlIFxjbGFzc3tQb3Blbn0gY2xhc3MgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtQb3Blbl17cG9sbH17fQotQ2hlY2sgaWYgY2hpbGQgcHJvY2VzcyBoYXMgdGVybWluYXRlZC4gIFJldHVybnMgcmV0dXJuY29kZQotYXR0cmlidXRlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUG9wZW5de3dhaXR9e30KLVdhaXQgZm9yIGNoaWxkIHByb2Nlc3MgdG8gdGVybWluYXRlLiAgUmV0dXJucyByZXR1cm5jb2RlIGF0dHJpYnV0ZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1BvcGVuXXtjb21tdW5pY2F0ZX17aW5wdXQ9Tm9uZX0KLUludGVyYWN0IHdpdGggcHJvY2VzczogU2VuZCBkYXRhIHRvIHN0ZGluLiAgUmVhZCBkYXRhIGZyb20gc3Rkb3V0IGFuZAotc3RkZXJyLCB1bnRpbCBlbmQtb2YtZmlsZSBpcyByZWFjaGVkLiAgV2FpdCBmb3IgcHJvY2VzcyB0byB0ZXJtaW5hdGUuCi1UaGUgb3B0aW9uYWwgXHZhcntpbnB1dH0gYXJndW1lbnQgc2hvdWxkIGJlIGEgc3RyaW5nIHRvIGJlIHNlbnQgdG8gdGhlCi1jaGlsZCBwcm9jZXNzLCBvciBcY29kZXtOb25lfSwgaWYgbm8gZGF0YSBzaG91bGQgYmUgc2VudCB0byB0aGUgY2hpbGQuCi0KLWNvbW11bmljYXRlKCkgcmV0dXJucyBhIHR1cGxlIChzdGRvdXQsIHN0ZGVycikuCi0KLVxub3Rle1RoZSBkYXRhIHJlYWQgaXMgYnVmZmVyZWQgaW4gbWVtb3J5LCBzbyBkbyBub3QgdXNlIHRoaXMgbWV0aG9kCi1pZiB0aGUgZGF0YSBzaXplIGlzIGxhcmdlIG9yIHVubGltaXRlZC59Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgYWxzbyBhdmFpbGFibGU6Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtQb3Blbl17c3RkaW59Ci1JZiB0aGUgXHZhcntzdGRpbn0gYXJndW1lbnQgaXMgXGNvZGV7UElQRX0sIHRoaXMgYXR0cmlidXRlIGlzIGEgZmlsZQotb2JqZWN0IHRoYXQgcHJvdmlkZXMgaW5wdXQgdG8gdGhlIGNoaWxkIHByb2Nlc3MuICBPdGhlcndpc2UsIGl0IGlzCi1cY29kZXtOb25lfS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W1BvcGVuXXtzdGRvdXR9Ci1JZiB0aGUgXHZhcntzdGRvdXR9IGFyZ3VtZW50IGlzIFxjb2Rle1BJUEV9LCB0aGlzIGF0dHJpYnV0ZSBpcyBhIGZpbGUKLW9iamVjdCB0aGF0IHByb3ZpZGVzIG91dHB1dCBmcm9tIHRoZSBjaGlsZCBwcm9jZXNzLiAgT3RoZXJ3aXNlLCBpdCBpcwotXGNvZGV7Tm9uZX0uCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtQb3Blbl17c3RkZXJyfQotSWYgdGhlIFx2YXJ7c3RkZXJyfSBhcmd1bWVudCBpcyBcY29kZXtQSVBFfSwgdGhpcyBhdHRyaWJ1dGUgaXMgZmlsZQotb2JqZWN0IHRoYXQgcHJvdmlkZXMgZXJyb3Igb3V0cHV0IGZyb20gdGhlIGNoaWxkIHByb2Nlc3MuICBPdGhlcndpc2UsCi1pdCBpcyBcY29kZXtOb25lfS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W1BvcGVuXXtwaWR9Ci1UaGUgcHJvY2VzcyBJRCBvZiB0aGUgY2hpbGQgcHJvY2Vzcy4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W1BvcGVuXXtyZXR1cm5jb2RlfQotVGhlIGNoaWxkIHJldHVybiBjb2RlLiAgQSBcY29kZXtOb25lfSB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgcHJvY2VzcwotaGFzbid0IHRlcm1pbmF0ZWQgeWV0LiAgQSBuZWdhdGl2ZSB2YWx1ZSAtTiBpbmRpY2F0ZXMgdGhhdCB0aGUgY2hpbGQKLXdhcyB0ZXJtaW5hdGVkIGJ5IHNpZ25hbCBOIChcVU5JWHt9IG9ubHkpLgotXGVuZHttZW1iZXJkZXNjfQotCi0KLVxzdWJzZWN0aW9ue1JlcGxhY2luZyBPbGRlciBGdW5jdGlvbnMgd2l0aCB0aGUgc3VicHJvY2VzcyBNb2R1bGV9Ci0KLUluIHRoaXMgc2VjdGlvbiwgImEgPT0+IGIiIG1lYW5zIHRoYXQgYiBjYW4gYmUgdXNlZCBhcyBhIHJlcGxhY2VtZW50Ci1mb3IgYS4KLQotXG5vdGV7QWxsIGZ1bmN0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZmFpbCAobW9yZSBvciBsZXNzKSBzaWxlbnRseSBpZgotdGhlIGV4ZWN1dGVkIHByb2dyYW0gY2Fubm90IGJlIGZvdW5kOyB0aGlzIG1vZHVsZSByYWlzZXMgYW4KLVxleGNlcHRpb257T1NFcnJvcn0gZXhjZXB0aW9uLn0KLQotSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlcywgd2UgYXNzdW1lIHRoYXQgdGhlIHN1YnByb2Nlc3MgbW9kdWxlIGlzCi1pbXBvcnRlZCB3aXRoICJmcm9tIHN1YnByb2Nlc3MgaW1wb3J0ICoiLgotCi1cc3Vic3Vic2VjdGlvbntSZXBsYWNpbmcgL2Jpbi9zaCBzaGVsbCBiYWNrcXVvdGV9Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLW91dHB1dD1gbXljbWQgbXlhcmdgCi09PT4KLW91dHB1dCA9IFBvcGVuKFsibXljbWQiLCAibXlhcmciXSwgc3Rkb3V0PVBJUEUpLmNvbW11bmljYXRlKClbMF0KLVxlbmR7dmVyYmF0aW19Ci0KLVxzdWJzdWJzZWN0aW9ue1JlcGxhY2luZyBzaGVsbCBwaXBlIGxpbmV9Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLW91dHB1dD1gZG1lc2cgfCBncmVwIGhkYWAKLT09PgotcDEgPSBQb3BlbihbImRtZXNnIl0sIHN0ZG91dD1QSVBFKQotcDIgPSBQb3BlbihbImdyZXAiLCAiaGRhIl0sIHN0ZGluPXAxLnN0ZG91dCwgc3Rkb3V0PVBJUEUpCi1vdXRwdXQgPSBwMi5jb21tdW5pY2F0ZSgpWzBdCi1cZW5ke3ZlcmJhdGltfQotCi1cc3Vic3Vic2VjdGlvbntSZXBsYWNpbmcgb3Muc3lzdGVtKCl9Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXN0cyA9IG9zLnN5c3RlbSgibXljbWQiICsgIiBteWFyZyIpCi09PT4KLXAgPSBQb3BlbigibXljbWQiICsgIiBteWFyZyIsIHNoZWxsPVRydWUpCi1zdHMgPSBvcy53YWl0cGlkKHAucGlkLCAwKQotXGVuZHt2ZXJiYXRpbX0KLQotTm90ZXM6Ci0KLVxiZWdpbntpdGVtaXplfQotXGl0ZW0gQ2FsbGluZyB0aGUgcHJvZ3JhbSB0aHJvdWdoIHRoZSBzaGVsbCBpcyB1c3VhbGx5IG5vdCByZXF1aXJlZC4KLVxpdGVtIEl0J3MgZWFzaWVyIHRvIGxvb2sgYXQgdGhlIFxtZW1iZXJ7cmV0dXJuY29kZX0gYXR0cmlidXRlIHRoYW4KLSAgICAgIHRoZSBleGl0IHN0YXR1cy4KLVxlbmR7aXRlbWl6ZX0KLQotQSBtb3JlIHJlYWxpc3RpYyBleGFtcGxlIHdvdWxkIGxvb2sgbGlrZSB0aGlzOgotCi1cYmVnaW57dmVyYmF0aW19Ci10cnk6Ci0gICAgcmV0Y29kZSA9IGNhbGwoIm15Y21kIiArICIgbXlhcmciLCBzaGVsbD1UcnVlKQotICAgIGlmIHJldGNvZGUgPCAwOgotICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICJDaGlsZCB3YXMgdGVybWluYXRlZCBieSBzaWduYWwiLCAtcmV0Y29kZQotICAgIGVsc2U6Ci0gICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIkNoaWxkIHJldHVybmVkIiwgcmV0Y29kZQotZXhjZXB0IE9TRXJyb3IgYXMgZToKLSAgICBwcmludCA+PnN5cy5zdGRlcnIsICJFeGVjdXRpb24gZmFpbGVkOiIsIGUKLVxlbmR7dmVyYmF0aW19Ci0KLVxzdWJzdWJzZWN0aW9ue1JlcGxhY2luZyBvcy5zcGF3bip9Ci0KLVBfTk9XQUlUIGV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXBpZCA9IG9zLnNwYXdubHAob3MuUF9OT1dBSVQsICIvYmluL215Y21kIiwgIm15Y21kIiwgIm15YXJnIikKLT09PgotcGlkID0gUG9wZW4oWyIvYmluL215Y21kIiwgIm15YXJnIl0pLnBpZAotXGVuZHt2ZXJiYXRpbX0KLQotUF9XQUlUIGV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXJldGNvZGUgPSBvcy5zcGF3bmxwKG9zLlBfV0FJVCwgIi9iaW4vbXljbWQiLCAibXljbWQiLCAibXlhcmciKQotPT0+Ci1yZXRjb2RlID0gY2FsbChbIi9iaW4vbXljbWQiLCAibXlhcmciXSkKLVxlbmR7dmVyYmF0aW19Ci0KLVZlY3RvciBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1vcy5zcGF3bnZwKG9zLlBfTk9XQUlULCBwYXRoLCBhcmdzKQotPT0+Ci1Qb3BlbihbcGF0aF0gKyBhcmdzWzE6XSkKLVxlbmR7dmVyYmF0aW19Ci0KLUVudmlyb25tZW50IGV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLW9zLnNwYXdubHBlKG9zLlBfTk9XQUlULCAiL2Jpbi9teWNtZCIsICJteWNtZCIsICJteWFyZyIsIGVudikKLT09PgotUG9wZW4oWyIvYmluL215Y21kIiwgIm15YXJnIl0sIGVudj17IlBBVEgiOiAiL3Vzci9iaW4ifSkKLVxlbmR7dmVyYmF0aW19Ci0KLVxzdWJzdWJzZWN0aW9ue1JlcGxhY2luZyBvcy5wb3Blbip9Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXBpcGUgPSBvcy5wb3BlbihjbWQsIG1vZGU9J3InLCBidWZzaXplKQotPT0+Ci1waXBlID0gUG9wZW4oY21kLCBzaGVsbD1UcnVlLCBidWZzaXplPWJ1ZnNpemUsIHN0ZG91dD1QSVBFKS5zdGRvdXQKLVxlbmR7dmVyYmF0aW19Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXBpcGUgPSBvcy5wb3BlbihjbWQsIG1vZGU9J3cnLCBidWZzaXplKQotPT0+Ci1waXBlID0gUG9wZW4oY21kLCBzaGVsbD1UcnVlLCBidWZzaXplPWJ1ZnNpemUsIHN0ZGluPVBJUEUpLnN0ZGluCi1cZW5ke3ZlcmJhdGltfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJzdW5hdS50ZXggYi9Eb2MvbGliL2xpYnN1bmF1LnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1YmMzYi4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnN1bmF1LnRleAorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3N1bmF1fSAtLS0KLSAgICAgICAgIFJlYWQgYW5kIHdyaXRlIFN1biBBVSBmaWxlc30KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e3N1bmF1fQotXHNlY3Rpb25hdXRob3J7TW9zaGUgWmFka2F9e21vc2hlekB6YWRrYS5zaXRlLmNvLmlsfQotXG1vZHVsZXN5bm9wc2lze1Byb3ZpZGUgYW4gaW50ZXJmYWNlIHRvIHRoZSBTdW4gQVUgc291bmQgZm9ybWF0Ln0KLQotVGhlIFxtb2R1bGV7c3VuYXV9IG1vZHVsZSBwcm92aWRlcyBhIGNvbnZlbmllbnQgaW50ZXJmYWNlIHRvIHRoZSBTdW4KLUFVIHNvdW5kIGZvcm1hdC4gIE5vdGUgdGhhdCB0aGlzIG1vZHVsZSBpcyBpbnRlcmZhY2UtY29tcGF0aWJsZSB3aXRoCi10aGUgbW9kdWxlcyBccmVmbW9kdWxle2FpZmN9IGFuZCBccmVmbW9kdWxle3dhdmV9LgotCi1BbiBhdWRpbyBmaWxlIGNvbnNpc3RzIG9mIGEgaGVhZGVyIGZvbGxvd2VkIGJ5IHRoZSBkYXRhLiAgVGhlIGZpZWxkcwotb2YgdGhlIGhlYWRlciBhcmU6Ci0KLVxiZWdpbnt0YWJsZWlpfXtsfGx9e3RleHRybX17RmllbGR9e0NvbnRlbnRzfQotICBcbGluZWlpe21hZ2ljIHdvcmR9e1RoZSBmb3VyIGJ5dGVzIFxzYW1wey5zbmR9Ln0KLSAgXGxpbmVpaXtoZWFkZXIgc2l6ZX17U2l6ZSBvZiB0aGUgaGVhZGVyLCBpbmNsdWRpbmcgaW5mbywgaW4gYnl0ZXMufQotICBcbGluZWlpe2RhdGEgc2l6ZX17UGh5c2ljYWwgc2l6ZSBvZiB0aGUgZGF0YSwgaW4gYnl0ZXMufQotICBcbGluZWlpe2VuY29kaW5nfXtJbmRpY2F0ZXMgaG93IHRoZSBhdWRpbyBzYW1wbGVzIGFyZSBlbmNvZGVkLn0KLSAgXGxpbmVpaXtzYW1wbGUgcmF0ZX17VGhlIHNhbXBsaW5nIHJhdGUufQotICBcbGluZWlpe1wjIG9mIGNoYW5uZWxzfXtUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBzYW1wbGVzLn0KLSAgXGxpbmVpaXtpbmZvfXtcQVNDSUl7fSBzdHJpbmcgZ2l2aW5nIGEgZGVzY3JpcHRpb24gb2YgdGhlIGF1ZGlvCi0gICAgICAgICAgICAgICAgZmlsZSAocGFkZGVkIHdpdGggbnVsbCBieXRlcykufQotXGVuZHt0YWJsZWlpfQotCi1BcGFydCBmcm9tIHRoZSBpbmZvIGZpZWxkLCBhbGwgaGVhZGVyIGZpZWxkcyBhcmUgNCBieXRlcyBpbiBzaXplLgotVGhleSBhcmUgYWxsIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VycyBlbmNvZGVkIGluIGJpZy1lbmRpYW4gYnl0ZQotb3JkZXIuCi0KLQotVGhlIFxtb2R1bGV7c3VuYXV9IG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgotCi1cYmVnaW57ZnVuY2Rlc2N9e29wZW59e2ZpbGUsIG1vZGV9Ci1JZiBcdmFye2ZpbGV9IGlzIGEgc3RyaW5nLCBvcGVuIHRoZSBmaWxlIGJ5IHRoYXQgbmFtZSwgb3RoZXJ3aXNlIHRyZWF0IGl0Ci1hcyBhIHNlZWthYmxlIGZpbGUtbGlrZSBvYmplY3QuIFx2YXJ7bW9kZX0gY2FuIGJlIGFueSBvZgotXGJlZ2lue2Rlc2NyaXB0aW9ufQotCVxpdGVtW1xjb2RleydyJ31dIFJlYWQgb25seSBtb2RlLgotCVxpdGVtW1xjb2Rleyd3J31dIFdyaXRlIG9ubHkgbW9kZS4KLVxlbmR7ZGVzY3JpcHRpb259Ci1Ob3RlIHRoYXQgaXQgZG9lcyBub3QgYWxsb3cgcmVhZC93cml0ZSBmaWxlcy4KLQotQSBcdmFye21vZGV9IG9mIFxjb2RleydyJ30gcmV0dXJucyBhIFxjbGFzc3tBVV9yZWFkfQotb2JqZWN0LCB3aGlsZSBhIFx2YXJ7bW9kZX0gb2YgXGNvZGV7J3cnfSBvciBcY29kZXsnd2InfSByZXR1cm5zCi1hIFxjbGFzc3tBVV93cml0ZX0gb2JqZWN0LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtvcGVuZnB9e2ZpbGUsIG1vZGV9Ci1BIHN5bm9ueW0gZm9yIFxmdW5jdGlvbntvcGVufSwgbWFpbnRhaW5lZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCi1cZW5ke2Z1bmNkZXNjfQotCi1UaGUgXG1vZHVsZXtzdW5hdX0gbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBleGNlcHRpb246Ci0KLVxiZWdpbntleGNkZXNjfXtFcnJvcn0KLUFuIGVycm9yIHJhaXNlZCB3aGVuIHNvbWV0aGluZyBpcyBpbXBvc3NpYmxlIGJlY2F1c2Ugb2YgU3VuIEFVIHNwZWNzIG9yIAotaW1wbGVtZW50YXRpb24gZGVmaWNpZW5jeS4KLVxlbmR7ZXhjZGVzY30KLQotVGhlIFxtb2R1bGV7c3VuYXV9IG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZGF0YSBpdGVtczoKLQotXGJlZ2lue2RhdGFkZXNjfXtBVURJT19GSUxFX01BR0lDfQotQW4gaW50ZWdlciBldmVyeSB2YWxpZCBTdW4gQVUgZmlsZSBiZWdpbnMgd2l0aCwgc3RvcmVkIGluIGJpZy1lbmRpYW4KLWZvcm0uICBUaGlzIGlzIHRoZSBzdHJpbmcgXHNhbXB7LnNuZH0gaW50ZXJwcmV0ZWQgYXMgYW4gaW50ZWdlci4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317QVVESU9fRklMRV9FTkNPRElOR19NVUxBV184fQotXGRhdGFsaW5le0FVRElPX0ZJTEVfRU5DT0RJTkdfTElORUFSXzh9Ci1cZGF0YWxpbmV7QVVESU9fRklMRV9FTkNPRElOR19MSU5FQVJfMTZ9Ci1cZGF0YWxpbmV7QVVESU9fRklMRV9FTkNPRElOR19MSU5FQVJfMjR9Ci1cZGF0YWxpbmV7QVVESU9fRklMRV9FTkNPRElOR19MSU5FQVJfMzJ9Ci1cZGF0YWxpbmV7QVVESU9fRklMRV9FTkNPRElOR19BTEFXXzh9Ci1WYWx1ZXMgb2YgdGhlIGVuY29kaW5nIGZpZWxkIGZyb20gdGhlIEFVIGhlYWRlciB3aGljaCBhcmUgc3VwcG9ydGVkIGJ5Ci10aGlzIG1vZHVsZS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317QVVESU9fRklMRV9FTkNPRElOR19GTE9BVH0KLVxkYXRhbGluZXtBVURJT19GSUxFX0VOQ09ESU5HX0RPVUJMRX0KLVxkYXRhbGluZXtBVURJT19GSUxFX0VOQ09ESU5HX0FEUENNX0c3MjF9Ci1cZGF0YWxpbmV7QVVESU9fRklMRV9FTkNPRElOR19BRFBDTV9HNzIyfQotXGRhdGFsaW5le0FVRElPX0ZJTEVfRU5DT0RJTkdfQURQQ01fRzcyM18zfQotXGRhdGFsaW5le0FVRElPX0ZJTEVfRU5DT0RJTkdfQURQQ01fRzcyM181fQotQWRkaXRpb25hbCBrbm93biB2YWx1ZXMgb2YgdGhlIGVuY29kaW5nIGZpZWxkIGZyb20gdGhlIEFVIGhlYWRlciwgYnV0Ci13aGljaCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGlzIG1vZHVsZS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLQotXHN1YnNlY3Rpb257QVVfcmVhZCBPYmplY3RzIFxsYWJlbHthdS1yZWFkLW9iamVjdHN9fQotCi1BVV9yZWFkIG9iamVjdHMsIGFzIHJldHVybmVkIGJ5IFxmdW5jdGlvbntvcGVuKCl9IGFib3ZlLCBoYXZlIHRoZQotZm9sbG93aW5nIG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtBVV9yZWFkXXtjbG9zZX17fQotQ2xvc2UgdGhlIHN0cmVhbSwgYW5kIG1ha2UgdGhlIGluc3RhbmNlIHVudXNhYmxlLiAoVGhpcyBpcyAKLWNhbGxlZCBhdXRvbWF0aWNhbGx5IG9uIGRlbGV0aW9uLikKLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0FVX3JlYWRde2dldG5jaGFubmVsc317fQotUmV0dXJucyBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgKDEgZm9yIG1vbmUsIDIgZm9yIHN0ZXJlbykuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtBVV9yZWFkXXtnZXRzYW1wd2lkdGh9e30KLVJldHVybnMgc2FtcGxlIHdpZHRoIGluIGJ5dGVzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQVVfcmVhZF17Z2V0ZnJhbWVyYXRlfXt9Ci1SZXR1cm5zIHNhbXBsaW5nIGZyZXF1ZW5jeS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0FVX3JlYWRde2dldG5mcmFtZXN9e30KLVJldHVybnMgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0FVX3JlYWRde2dldGNvbXB0eXBlfXt9Ci1SZXR1cm5zIGNvbXByZXNzaW9uIHR5cGUuCi1TdXBwb3J0ZWQgY29tcHJlc3Npb24gdHlwZXMgYXJlIFxjb2RleydVTEFXJ30sIFxjb2RleydBTEFXJ30gYW5kIFxjb2RleydOT05FJ30uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtBVV9yZWFkXXtnZXRjb21wbmFtZX17fQotSHVtYW4tcmVhZGFibGUgdmVyc2lvbiBvZiBcbWV0aG9ke2dldGNvbXB0eXBlKCl9LiAKLVRoZSBzdXBwb3J0ZWQgdHlwZXMgaGF2ZSB0aGUgcmVzcGVjdGl2ZSBuYW1lcyBcY29kZXsnQ0NJVFQgRy43MTEKLXUtbGF3J30sIFxjb2RleydDQ0lUVCBHLjcxMSBBLWxhdyd9IGFuZCBcY29kZXsnbm90IGNvbXByZXNzZWQnfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0FVX3JlYWRde2dldHBhcmFtc317fQotUmV0dXJucyBhIHR1cGxlIFxjb2RleyhcdmFye25jaGFubmVsc30sIFx2YXJ7c2FtcHdpZHRofSwKLVx2YXJ7ZnJhbWVyYXRlfSwgXHZhcntuZnJhbWVzfSwgXHZhcntjb21wdHlwZX0sIFx2YXJ7Y29tcG5hbWV9KX0sCi1lcXVpdmFsZW50IHRvIG91dHB1dCBvZiB0aGUgXG1ldGhvZHtnZXQqKCl9IG1ldGhvZHMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtBVV9yZWFkXXtyZWFkZnJhbWVzfXtufQotUmVhZHMgYW5kIHJldHVybnMgYXQgbW9zdCBcdmFye259IGZyYW1lcyBvZiBhdWRpbywgYXMgYSBzdHJpbmcgb2YKLWJ5dGVzLiAgVGhlIGRhdGEgd2lsbCBiZSByZXR1cm5lZCBpbiBsaW5lYXIgZm9ybWF0LiAgSWYgdGhlIG9yaWdpbmFsCi1kYXRhIGlzIGluIHUtTEFXIGZvcm1hdCwgaXQgd2lsbCBiZSBjb252ZXJ0ZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtBVV9yZWFkXXtyZXdpbmR9e30KLVJld2luZCB0aGUgZmlsZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGF1ZGlvIHN0cmVhbS4KLVxlbmR7bWV0aG9kZGVzY30KLQotVGhlIGZvbGxvd2luZyB0d28gbWV0aG9kcyBkZWZpbmUgYSB0ZXJtIGBgcG9zaXRpb24nJyB3aGljaCBpcyBjb21wYXRpYmxlCi1iZXR3ZWVuIHRoZW0sIGFuZCBpcyBvdGhlcndpc2UgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50LgotCi1cYmVnaW57bWV0aG9kZGVzY31bQVVfcmVhZF17c2V0cG9zfXtwb3N9Ci1TZXQgdGhlIGZpbGUgcG9pbnRlciB0byB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLiAgT25seSB2YWx1ZXMgcmV0dXJuZWQKLWZyb20gXG1ldGhvZHt0ZWxsKCl9IHNob3VsZCBiZSB1c2VkIGZvciBcdmFye3Bvc30uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtBVV9yZWFkXXt0ZWxsfXt9Ci1SZXR1cm4gY3VycmVudCBmaWxlIHBvaW50ZXIgcG9zaXRpb24uICBOb3RlIHRoYXQgdGhlIHJldHVybmVkIHZhbHVlCi1oYXMgbm90aGluZyB0byBkbyB3aXRoIHRoZSBhY3R1YWwgcG9zaXRpb24gaW4gdGhlIGZpbGUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSAKLVxyZWZtb2R1bGV7YWlmY30sIGFuZCBkb24ndCBkbyBhbnl0aGluZyBpbnRlcmVzdGluZy4KLQotXGJlZ2lue21ldGhvZGRlc2N9W0FVX3JlYWRde2dldG1hcmtlcnN9e30KLVJldHVybnMgXGNvZGV7Tm9uZX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtBVV9yZWFkXXtnZXRtYXJrfXtpZH0KLVJhaXNlIGFuIGVycm9yLgotXGVuZHttZXRob2RkZXNjfQotCi0KLVxzdWJzZWN0aW9ue0FVX3dyaXRlIE9iamVjdHMgXGxhYmVse2F1LXdyaXRlLW9iamVjdHN9fQotCi1BVV93cml0ZSBvYmplY3RzLCBhcyByZXR1cm5lZCBieSBcZnVuY3Rpb257b3BlbigpfSBhYm92ZSwgaGF2ZSB0aGUKLWZvbGxvd2luZyBtZXRob2RzOgotCi1cYmVnaW57bWV0aG9kZGVzY31bQVVfd3JpdGVde3NldG5jaGFubmVsc317bn0KLVNldCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQVVfd3JpdGVde3NldHNhbXB3aWR0aH17bn0KLVNldCB0aGUgc2FtcGxlIHdpZHRoIChpbiBieXRlcy4pCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtBVV93cml0ZV17c2V0ZnJhbWVyYXRlfXtufQotU2V0IHRoZSBmcmFtZSByYXRlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQVVfd3JpdGVde3NldG5mcmFtZXN9e259Ci1TZXQgdGhlIG51bWJlciBvZiBmcmFtZXMuIFRoaXMgY2FuIGJlIGxhdGVyIGNoYW5nZWQsIHdoZW4gYW5kIGlmIG1vcmUgCi1mcmFtZXMgYXJlIHdyaXR0ZW4uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLQotXGJlZ2lue21ldGhvZGRlc2N9W0FVX3dyaXRlXXtzZXRjb21wdHlwZX17dHlwZSwgbmFtZX0KLVNldCB0aGUgY29tcHJlc3Npb24gdHlwZSBhbmQgZGVzY3JpcHRpb24uCi1Pbmx5IFxjb2RleydOT05FJ30gYW5kIFxjb2RleydVTEFXJ30gYXJlIHN1cHBvcnRlZCBvbiBvdXRwdXQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtBVV93cml0ZV17c2V0cGFyYW1zfXt0dXBsZX0KLVRoZSBcdmFye3R1cGxlfSBzaG91bGQgYmUgXGNvZGV7KFx2YXJ7bmNoYW5uZWxzfSwgXHZhcntzYW1wd2lkdGh9LAotXHZhcntmcmFtZXJhdGV9LCBcdmFye25mcmFtZXN9LCBcdmFye2NvbXB0eXBlfSwgXHZhcntjb21wbmFtZX0pfSwgd2l0aAotdmFsdWVzIHZhbGlkIGZvciB0aGUgXG1ldGhvZHtzZXQqKCl9IG1ldGhvZHMuICBTZXQgYWxsIHBhcmFtZXRlcnMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtBVV93cml0ZV17dGVsbH17fQotUmV0dXJuIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGZpbGUsIHdpdGggdGhlIHNhbWUgZGlzY2xhaW1lciBmb3IKLXRoZSBcbWV0aG9ke0FVX3JlYWQudGVsbCgpfSBhbmQgXG1ldGhvZHtBVV9yZWFkLnNldHBvcygpfSBtZXRob2RzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQVVfd3JpdGVde3dyaXRlZnJhbWVzcmF3fXtkYXRhfQotV3JpdGUgYXVkaW8gZnJhbWVzLCB3aXRob3V0IGNvcnJlY3RpbmcgXHZhcntuZnJhbWVzfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0FVX3dyaXRlXXt3cml0ZWZyYW1lc317ZGF0YX0KLVdyaXRlIGF1ZGlvIGZyYW1lcyBhbmQgbWFrZSBzdXJlIFx2YXJ7bmZyYW1lc30gaXMgY29ycmVjdC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0FVX3dyaXRlXXtjbG9zZX17fQotTWFrZSBzdXJlIFx2YXJ7bmZyYW1lc30gaXMgY29ycmVjdCwgYW5kIGNsb3NlIHRoZSBmaWxlLgotCi1UaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBkZWxldGlvbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotTm90ZSB0aGF0IGl0IGlzIGludmFsaWQgdG8gc2V0IGFueSBwYXJhbWV0ZXJzIGFmdGVyIGNhbGxpbmcgCi1cbWV0aG9ke3dyaXRlZnJhbWVzKCl9IG9yIFxtZXRob2R7d3JpdGVmcmFtZXNyYXcoKX0uIApkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJzeW1ib2wudGV4IGIvRG9jL2xpYi9saWJzeW1ib2wudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGNhYmViLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlic3ltYm9sLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7c3ltYm9sfSAtLS0KLSAgICAgICAgIENvbnN0YW50cyB1c2VkIHdpdGggUHl0aG9uIHBhcnNlIHRyZWVzfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17c3ltYm9sfQotXG1vZHVsZXN5bm9wc2lze0NvbnN0YW50cyByZXByZXNlbnRpbmcgaW50ZXJuYWwgbm9kZXMgb2YgdGhlIHBhcnNlIHRyZWUufQotXHNlY3Rpb25hdXRob3J7RnJlZCBMLiBEcmFrZSwgSnIufXtmZHJha2VAYWNtLm9yZ30KLQotCi1UaGlzIG1vZHVsZSBwcm92aWRlcyBjb25zdGFudHMgd2hpY2ggcmVwcmVzZW50IHRoZSBudW1lcmljIHZhbHVlcyBvZgotaW50ZXJuYWwgbm9kZXMgb2YgdGhlIHBhcnNlIHRyZWUuICBVbmxpa2UgbW9zdCBQeXRob24gY29uc3RhbnRzLCB0aGVzZQotdXNlIGxvd2VyLWNhc2UgbmFtZXMuICBSZWZlciB0byB0aGUgZmlsZSBcZmlsZXtHcmFtbWFyL0dyYW1tYXJ9IGluIHRoZQotUHl0aG9uIGRpc3RyaWJ1dGlvbiBmb3IgdGhlIGRlZmluaXRpb25zIG9mIHRoZSBuYW1lcyBpbiB0aGUgY29udGV4dCBvZgotdGhlIGxhbmd1YWdlIGdyYW1tYXIuICBUaGUgc3BlY2lmaWMgbnVtZXJpYyB2YWx1ZXMgd2hpY2ggdGhlIG5hbWVzIG1hcAotdG8gbWF5IGNoYW5nZSBiZXR3ZWVuIFB5dGhvbiB2ZXJzaW9ucy4KLQotVGhpcyBtb2R1bGUgYWxzbyBwcm92aWRlcyBvbmUgYWRkaXRpb25hbCBkYXRhIG9iamVjdDoKLQotCi1cYmVnaW57ZGF0YWRlc2N9e3N5bV9uYW1lfQotICBEaWN0aW9uYXJ5IG1hcHBpbmcgdGhlIG51bWVyaWMgdmFsdWVzIG9mIHRoZSBjb25zdGFudHMgZGVmaW5lZCBpbgotICB0aGlzIG1vZHVsZSBiYWNrIHRvIG5hbWUgc3RyaW5ncywgYWxsb3dpbmcgbW9yZSBodW1hbi1yZWFkYWJsZQotICByZXByZXNlbnRhdGlvbiBvZiBwYXJzZSB0cmVlcyB0byBiZSBnZW5lcmF0ZWQuCi1cZW5ke2RhdGFkZXNjfQotCi0KLVxiZWdpbntzZWVhbHNvfQotICBcc2VlbW9kdWxle3BhcnNlcn17VGhlIHNlY29uZCBleGFtcGxlIGZvciB0aGUgXHJlZm1vZHVsZXtwYXJzZXJ9Ci0gICAgICAgICAgICAgICAgICAgICBtb2R1bGUgc2hvd3MgaG93IHRvIHVzZSB0aGUgXG1vZHVsZXtzeW1ib2x9Ci0gICAgICAgICAgICAgICAgICAgICBtb2R1bGUufQotXGVuZHtzZWVhbHNvfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJzeXMudGV4IGIvRG9jL2xpYi9saWJzeXMudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWIzMjQ3Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlic3lzLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDU4MiArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3N5c30gLS0tCi0gICAgICAgICBTeXN0ZW0tc3BlY2lmaWMgcGFyYW1ldGVycyBhbmQgZnVuY3Rpb25zfQotCi1cZGVjbGFyZW1vZHVsZXtidWlsdGlufXtzeXN9Ci1cbW9kdWxlc3lub3BzaXN7QWNjZXNzIHN5c3RlbS1zcGVjaWZpYyBwYXJhbWV0ZXJzIGFuZCBmdW5jdGlvbnMufQotCi1UaGlzIG1vZHVsZSBwcm92aWRlcyBhY2Nlc3MgdG8gc29tZSB2YXJpYWJsZXMgdXNlZCBvciBtYWludGFpbmVkIGJ5IHRoZQotaW50ZXJwcmV0ZXIgYW5kIHRvIGZ1bmN0aW9ucyB0aGF0IGludGVyYWN0IHN0cm9uZ2x5IHdpdGggdGhlIGludGVycHJldGVyLgotSXQgaXMgYWx3YXlzIGF2YWlsYWJsZS4KLQotCi1cYmVnaW57ZGF0YWRlc2N9e2FyZ3Z9Ci0gIFRoZSBsaXN0IG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgcGFzc2VkIHRvIGEgUHl0aG9uIHNjcmlwdC4KLSAgXGNvZGV7YXJndlswXX0gaXMgdGhlIHNjcmlwdCBuYW1lIChpdCBpcyBvcGVyYXRpbmcgc3lzdGVtIGRlcGVuZGVudAotICB3aGV0aGVyIHRoaXMgaXMgYSBmdWxsIHBhdGhuYW1lIG9yIG5vdCkuICBJZiB0aGUgY29tbWFuZCB3YXMKLSAgZXhlY3V0ZWQgdXNpbmcgdGhlIFxwcm9ncmFtb3B0ey1jfSBjb21tYW5kIGxpbmUgb3B0aW9uIHRvIHRoZQotICBpbnRlcnByZXRlciwgXGNvZGV7YXJndlswXX0gaXMgc2V0IHRvIHRoZSBzdHJpbmcgXGNvZGV7Jy1jJ30uICBJZiBubwotICBzY3JpcHQgbmFtZSB3YXMgcGFzc2VkIHRvIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIsIFxjb2Rle2FyZ3ZbMF19IGlzCi0gIHRoZSBlbXB0eSBzdHJpbmcuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e2J5dGVvcmRlcn0KLSAgQW4gaW5kaWNhdG9yIG9mIHRoZSBuYXRpdmUgYnl0ZSBvcmRlci4gIFRoaXMgd2lsbCBoYXZlIHRoZSB2YWx1ZQotICBcY29kZXsnYmlnJ30gb24gYmlnLWVuZGlhbiAobW9zdC1zaWduaWZpY2FudCBieXRlIGZpcnN0KSBwbGF0Zm9ybXMsCi0gIGFuZCBcY29kZXsnbGl0dGxlJ30gb24gbGl0dGxlLWVuZGlhbiAobGVhc3Qtc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdCkKLSAgcGxhdGZvcm1zLgotICBcdmVyc2lvbmFkZGVkezIuMH0KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317c3VidmVyc2lvbn0KLSAgQSB0cmlwbGUgKHJlcG8sIGJyYW5jaCwgdmVyc2lvbikgcmVwcmVzZW50aW5nIHRoZSBTdWJ2ZXJzaW9uCi0gIGluZm9ybWF0aW9uIG9mIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIuCi0gIFx2YXJ7cmVwb30gaXMgdGhlIG5hbWUgb2YgdGhlIHJlcG9zaXRvcnksIFxjb2RleydDUHl0aG9uJ30uCi0gIFx2YXJ7YnJhbmNofSBpcyBhIHN0cmluZyBvZiBvbmUgb2YgdGhlIGZvcm1zIFxjb2Rleyd0cnVuayd9LAotICBcY29kZXsnYnJhbmNoZXMvbmFtZSd9IG9yIFxjb2Rleyd0YWdzL25hbWUnfS4KLSAgXHZhcnt2ZXJzaW9ufSBpcyB0aGUgb3V0cHV0IG9mIFxjb2Rle3N2bnZlcnNpb259LCBpZiB0aGUKLSAgaW50ZXJwcmV0ZXIgd2FzIGJ1aWx0IGZyb20gYSBTdWJ2ZXJzaW9uIGNoZWNrb3V0OyBpdCBjb250YWlucwotICB0aGUgcmV2aXNpb24gbnVtYmVyIChyYW5nZSkgYW5kIHBvc3NpYmx5IGEgdHJhaWxpbmcgJ00nIGlmCi0gIHRoZXJlIHdlcmUgbG9jYWwgbW9kaWZpY2F0aW9ucy4gSWYgdGhlIHRyZWUgd2FzIGV4cG9ydGVkCi0gIChvciBzdm52ZXJzaW9uIHdhcyBub3QgYXZhaWxhYmxlKSwgaXQgaXMgdGhlIHJldmlzaW9uIG9mCi0gIFxjb2Rle0luY2x1ZGUvcGF0Y2hsZXZlbC5ofSBpZiB0aGUgYnJhbmNoIGlzIGEgdGFnLiBPdGhlcndpc2UsCi0gIGl0IGlzIFxjb2Rle05vbmV9LgotICBcdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317YnVpbHRpbl9tb2R1bGVfbmFtZXN9Ci0gIEEgdHVwbGUgb2Ygc3RyaW5ncyBnaXZpbmcgdGhlIG5hbWVzIG9mIGFsbCBtb2R1bGVzIHRoYXQgYXJlIGNvbXBpbGVkCi0gIGludG8gdGhpcyBQeXRob24gaW50ZXJwcmV0ZXIuICAoVGhpcyBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIGluCi0gIGFueSBvdGhlciB3YXkgLS0tIFxjb2Rle21vZHVsZXMua2V5cygpfSBvbmx5IGxpc3RzIHRoZSBpbXBvcnRlZAotICBtb2R1bGVzLikKLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317Y29weXJpZ2h0fQotICBBIHN0cmluZyBjb250YWluaW5nIHRoZSBjb3B5cmlnaHQgcGVydGFpbmluZyB0byB0aGUgUHl0aG9uCi0gIGludGVycHJldGVyLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtfY3VycmVudF9mcmFtZXN9e30KLSAgUmV0dXJuIGEgZGljdGlvbmFyeSBtYXBwaW5nIGVhY2ggdGhyZWFkJ3MgaWRlbnRpZmllciB0byB0aGUgdG9wbW9zdCBzdGFjawotICBmcmFtZSBjdXJyZW50bHkgYWN0aXZlIGluIHRoYXQgdGhyZWFkIGF0IHRoZSB0aW1lIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuCi0gIE5vdGUgdGhhdCBmdW5jdGlvbnMgaW4gdGhlIFxyZWZtb2R1bGV7dHJhY2ViYWNrfSBtb2R1bGUgY2FuIGJ1aWxkIHRoZQotICBjYWxsIHN0YWNrIGdpdmVuIHN1Y2ggYSBmcmFtZS4KLQotICBUaGlzIGlzIG1vc3QgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgZGVhZGxvY2s6ICB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90Ci0gIHJlcXVpcmUgdGhlIGRlYWRsb2NrZWQgdGhyZWFkcycgY29vcGVyYXRpb24sIGFuZCBzdWNoIHRocmVhZHMnIGNhbGwgc3RhY2tzCi0gIGFyZSBmcm96ZW4gZm9yIGFzIGxvbmcgYXMgdGhleSByZW1haW4gZGVhZGxvY2tlZC4gIFRoZSBmcmFtZSByZXR1cm5lZAotICBmb3IgYSBub24tZGVhZGxvY2tlZCB0aHJlYWQgbWF5IGJlYXIgbm8gcmVsYXRpb25zaGlwIHRvIHRoYXQgdGhyZWFkJ3MKLSAgY3VycmVudCBhY3Rpdml0eSBieSB0aGUgdGltZSBjYWxsaW5nIGNvZGUgZXhhbWluZXMgdGhlIGZyYW1lLgotCi0gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQgZm9yIGludGVybmFsIGFuZCBzcGVjaWFsaXplZCBwdXJwb3NlcwotICBvbmx5LgotICBcdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317ZGxsaGFuZGxlfQotICBJbnRlZ2VyIHNwZWNpZnlpbmcgdGhlIGhhbmRsZSBvZiB0aGUgUHl0aG9uIERMTC4KLSAgQXZhaWxhYmlsaXR5OiBXaW5kb3dzLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtkaXNwbGF5aG9va317XHZhcnt2YWx1ZX19Ci0gIElmIFx2YXJ7dmFsdWV9IGlzIG5vdCBcY29kZXtOb25lfSwgdGhpcyBmdW5jdGlvbiBwcmludHMgaXQgdG8KLSAgXGNvZGV7c3lzLnN0ZG91dH0sIGFuZCBzYXZlcyBpdCBpbiBcY29kZXtfX2J1aWx0aW5fXy5ffS4KLQotICBcY29kZXtzeXMuZGlzcGxheWhvb2t9IGlzIGNhbGxlZCBvbiB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgYW4KLSAgZXhwcmVzc2lvbiBlbnRlcmVkIGluIGFuIGludGVyYWN0aXZlIFB5dGhvbiBzZXNzaW9uLiAgVGhlIGRpc3BsYXkgb2YKLSAgdGhlc2UgdmFsdWVzIGNhbiBiZSBjdXN0b21pemVkIGJ5IGFzc2lnbmluZyBhbm90aGVyIG9uZS1hcmd1bWVudAotICBmdW5jdGlvbiB0byBcY29kZXtzeXMuZGlzcGxheWhvb2t9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtleGNlcHRob29rfXtcdmFye3R5cGV9LCBcdmFye3ZhbHVlfSwgXHZhcnt0cmFjZWJhY2t9fQotICBUaGlzIGZ1bmN0aW9uIHByaW50cyBvdXQgYSBnaXZlbiB0cmFjZWJhY2sgYW5kIGV4Y2VwdGlvbiB0bwotICBcY29kZXtzeXMuc3RkZXJyfS4KLQotICBXaGVuIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQgYW5kIHVuY2F1Z2h0LCB0aGUgaW50ZXJwcmV0ZXIgY2FsbHMKLSAgXGNvZGV7c3lzLmV4Y2VwdGhvb2t9IHdpdGggdGhyZWUgYXJndW1lbnRzLCB0aGUgZXhjZXB0aW9uIGNsYXNzLAotICBleGNlcHRpb24gaW5zdGFuY2UsIGFuZCBhIHRyYWNlYmFjayBvYmplY3QuICBJbiBhbiBpbnRlcmFjdGl2ZQotICBzZXNzaW9uIHRoaXMgaGFwcGVucyBqdXN0IGJlZm9yZSBjb250cm9sIGlzIHJldHVybmVkIHRvIHRoZSBwcm9tcHQ7Ci0gIGluIGEgUHl0aG9uIHByb2dyYW0gdGhpcyBoYXBwZW5zIGp1c3QgYmVmb3JlIHRoZSBwcm9ncmFtIGV4aXRzLiAgVGhlCi0gIGhhbmRsaW5nIG9mIHN1Y2ggdG9wLWxldmVsIGV4Y2VwdGlvbnMgY2FuIGJlIGN1c3RvbWl6ZWQgYnkgYXNzaWduaW5nCi0gIGFub3RoZXIgdGhyZWUtYXJndW1lbnQgZnVuY3Rpb24gdG8gXGNvZGV7c3lzLmV4Y2VwdGhvb2t9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtfX2Rpc3BsYXlob29rX199Ci1cZGF0YWxpbmV7X19leGNlcHRob29rX199Ci0gIFRoZXNlIG9iamVjdHMgY29udGFpbiB0aGUgb3JpZ2luYWwgdmFsdWVzIG9mIFxjb2Rle2Rpc3BsYXlob29rfSBhbmQKLSAgXGNvZGV7ZXhjZXB0aG9va30gYXQgdGhlIHN0YXJ0IG9mIHRoZSBwcm9ncmFtLiAgVGhleSBhcmUgc2F2ZWQgc28KLSAgdGhhdCBcY29kZXtkaXNwbGF5aG9va30gYW5kIFxjb2Rle2V4Y2VwdGhvb2t9IGNhbiBiZSByZXN0b3JlZCBpbgotICBjYXNlIHRoZXkgaGFwcGVuIHRvIGdldCByZXBsYWNlZCB3aXRoIGJyb2tlbiBvYmplY3RzLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtleGNfaW5mb317fQotICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSB0dXBsZSBvZiB0aHJlZSB2YWx1ZXMgdGhhdCBnaXZlIGluZm9ybWF0aW9uCi0gIGFib3V0IHRoZSBleGNlcHRpb24gdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgaGFuZGxlZC4gIFRoZQotICBpbmZvcm1hdGlvbiByZXR1cm5lZCBpcyBzcGVjaWZpYyBib3RoIHRvIHRoZSBjdXJyZW50IHRocmVhZCBhbmQgdG8KLSAgdGhlIGN1cnJlbnQgc3RhY2sgZnJhbWUuICBJZiB0aGUgY3VycmVudCBzdGFjayBmcmFtZSBpcyBub3QgaGFuZGxpbmcKLSAgYW4gZXhjZXB0aW9uLCB0aGUgaW5mb3JtYXRpb24gaXMgdGFrZW4gZnJvbSB0aGUgY2FsbGluZyBzdGFjayBmcmFtZSwKLSAgb3IgaXRzIGNhbGxlciwgYW5kIHNvIG9uIHVudGlsIGEgc3RhY2sgZnJhbWUgaXMgZm91bmQgdGhhdCBpcwotICBoYW5kbGluZyBhbiBleGNlcHRpb24uICBIZXJlLCBgYGhhbmRsaW5nIGFuIGV4Y2VwdGlvbicnIGlzIGRlZmluZWQKLSAgYXMgYGBleGVjdXRpbmcgb3IgaGF2aW5nIGV4ZWN1dGVkIGFuIGV4Y2VwdCBjbGF1c2UuJycgIEZvciBhbnkgc3RhY2sKLSAgZnJhbWUsIG9ubHkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1vc3QgcmVjZW50bHkgaGFuZGxlZCBleGNlcHRpb24gaXMKLSAgYWNjZXNzaWJsZS4KLQotICBJZiBubyBleGNlcHRpb24gaXMgYmVpbmcgaGFuZGxlZCBhbnl3aGVyZSBvbiB0aGUgc3RhY2ssIGEgdHVwbGUKLSAgY29udGFpbmluZyB0aHJlZSBcY29kZXtOb25lfSB2YWx1ZXMgaXMgcmV0dXJuZWQuICBPdGhlcndpc2UsIHRoZQotICB2YWx1ZXMgcmV0dXJuZWQgYXJlIFxjb2RleyhcdmFye3R5cGV9LCBcdmFye3ZhbHVlfSwKLSAgXHZhcnt0cmFjZWJhY2t9KX0uICBUaGVpciBtZWFuaW5nIGlzOiBcdmFye3R5cGV9IGdldHMgdGhlIGV4Y2VwdGlvbgotICB0eXBlIG9mIHRoZSBleGNlcHRpb24gYmVpbmcgaGFuZGxlZCAoYSBjbGFzcyBvYmplY3QpOwotICBcdmFye3ZhbHVlfSBnZXRzIHRoZSBleGNlcHRpb24gcGFyYW1ldGVyIChpdHMgXGRmbnthc3NvY2lhdGVkIHZhbHVlfQotICBvciB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIFxrZXl3b3Jke3JhaXNlfSwgd2hpY2ggaXMgYWx3YXlzIGEgY2xhc3MKLSAgaW5zdGFuY2UgaWYgdGhlIGV4Y2VwdGlvbiB0eXBlIGlzIGEgY2xhc3Mgb2JqZWN0KTsgXHZhcnt0cmFjZWJhY2t9Ci0gIGdldHMgYSB0cmFjZWJhY2sgb2JqZWN0IChzZWUgdGhlIFJlZmVyZW5jZSBNYW51YWwpIHdoaWNoCi0gIGVuY2Fwc3VsYXRlcyB0aGUgY2FsbCBzdGFjayBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlIGV4Y2VwdGlvbgotICBvcmlnaW5hbGx5IG9jY3VycmVkLiAgXG9iaW5kZXh7dHJhY2ViYWNrfQotCi0gIFx3YXJuaW5ne0Fzc2lnbmluZyB0aGUgXHZhcnt0cmFjZWJhY2t9IHJldHVybiB2YWx1ZSB0byBhCi0gIGxvY2FsIHZhcmlhYmxlIGluIGEgZnVuY3Rpb24gdGhhdCBpcyBoYW5kbGluZyBhbiBleGNlcHRpb24gd2lsbAotICBjYXVzZSBhIGNpcmN1bGFyIHJlZmVyZW5jZS4gIFRoaXMgd2lsbCBwcmV2ZW50IGFueXRoaW5nIHJlZmVyZW5jZWQKLSAgYnkgYSBsb2NhbCB2YXJpYWJsZSBpbiB0aGUgc2FtZSBmdW5jdGlvbiBvciBieSB0aGUgdHJhY2ViYWNrIGZyb20KLSAgYmVpbmcgZ2FyYmFnZSBjb2xsZWN0ZWQuICBTaW5jZSBtb3N0IGZ1bmN0aW9ucyBkb24ndCBuZWVkIGFjY2VzcyB0bwotICB0aGUgdHJhY2ViYWNrLCB0aGUgYmVzdCBzb2x1dGlvbiBpcyB0byB1c2Ugc29tZXRoaW5nIGxpa2UKLSAgXGNvZGV7ZXhjdHlwZSwgdmFsdWUgPSBzeXMuZXhjX2luZm8oKVs6Ml19IHRvIGV4dHJhY3Qgb25seSB0aGUKLSAgZXhjZXB0aW9uIHR5cGUgYW5kIHZhbHVlLiAgSWYgeW91IGRvIG5lZWQgdGhlIHRyYWNlYmFjaywgbWFrZSBzdXJlCi0gIHRvIGRlbGV0ZSBpdCBhZnRlciB1c2UgKGJlc3QgZG9uZSB3aXRoIGEgXGtleXdvcmR7dHJ5fQotICAuLi4gXGtleXdvcmR7ZmluYWxseX0gc3RhdGVtZW50KSBvciB0byBjYWxsIFxmdW5jdGlvbntleGNfaW5mbygpfSBpbgotICBhIGZ1bmN0aW9uIHRoYXQgZG9lcyBub3QgaXRzZWxmIGhhbmRsZSBhbiBleGNlcHRpb24ufSBcbm90ZXtCZWdpbm5pbmcKLSAgd2l0aCBQeXRob24gMi4yLCBzdWNoIGN5Y2xlcyBhcmUgYXV0b21hdGljYWxseSByZWNsYWltZWQgd2hlbiBnYXJiYWdlCi0gIGNvbGxlY3Rpb24gaXMgZW5hYmxlZCBhbmQgdGhleSBiZWNvbWUgdW5yZWFjaGFibGUsIGJ1dCBpdCByZW1haW5zIG1vcmUKLSAgZWZmaWNpZW50IHRvIGF2b2lkIGNyZWF0aW5nIGN5Y2xlcy59Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e2V4ZWNfcHJlZml4fQotICBBIHN0cmluZyBnaXZpbmcgdGhlIHNpdGUtc3BlY2lmaWMgZGlyZWN0b3J5IHByZWZpeCB3aGVyZSB0aGUKLSAgcGxhdGZvcm0tZGVwZW5kZW50IFB5dGhvbiBmaWxlcyBhcmUgaW5zdGFsbGVkOyBieSBkZWZhdWx0LCB0aGlzIGlzCi0gIGFsc28gXGNvZGV7Jy91c3IvbG9jYWwnfS4gIFRoaXMgY2FuIGJlIHNldCBhdCBidWlsZCB0aW1lIHdpdGggdGhlCi0gIFxsb25ncHJvZ3JhbW9wdHtleGVjLXByZWZpeH0gYXJndW1lbnQgdG8gdGhlIFxwcm9ncmFte2NvbmZpZ3VyZX0KLSAgc2NyaXB0LiAgU3BlY2lmaWNhbGx5LCBhbGwgY29uZmlndXJhdGlvbiBmaWxlcyAoZS5nLiB0aGUKLSAgXGZpbGV7cHljb25maWcuaH0gaGVhZGVyIGZpbGUpIGFyZSBpbnN0YWxsZWQgaW4gdGhlIGRpcmVjdG9yeQotICBcY29kZXtleGVjX3ByZWZpeCArICcvbGliL3B5dGhvblx2YXJ7dmVyc2lvbn0vY29uZmlnJ30sIGFuZCBzaGFyZWQKLSAgbGlicmFyeSBtb2R1bGVzIGFyZSBpbnN0YWxsZWQgaW4gXGNvZGV7ZXhlY19wcmVmaXggKwotICAnL2xpYi9weXRob25cdmFye3ZlcnNpb259L2xpYi1keW5sb2FkJ30sIHdoZXJlIFx2YXJ7dmVyc2lvbn0gaXMKLSAgZXF1YWwgdG8gXGNvZGV7dmVyc2lvbls6M119LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtleGVjdXRhYmxlfQotICBBIHN0cmluZyBnaXZpbmcgdGhlIG5hbWUgb2YgdGhlIGV4ZWN1dGFibGUgYmluYXJ5IGZvciB0aGUgUHl0aG9uCi0gIGludGVycHJldGVyLCBvbiBzeXN0ZW1zIHdoZXJlIHRoaXMgbWFrZXMgc2Vuc2UuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2V4aXR9e1xvcHRpb25hbHthcmd9fQotICBFeGl0IGZyb20gUHl0aG9uLiAgVGhpcyBpcyBpbXBsZW1lbnRlZCBieSByYWlzaW5nIHRoZQotICBcZXhjZXB0aW9ue1N5c3RlbUV4aXR9IGV4Y2VwdGlvbiwgc28gY2xlYW51cCBhY3Rpb25zIHNwZWNpZmllZCBieQotICBmaW5hbGx5IGNsYXVzZXMgb2YgXGtleXdvcmR7dHJ5fSBzdGF0ZW1lbnRzIGFyZSBob25vcmVkLCBhbmQgaXQgaXMKLSAgcG9zc2libGUgdG8gaW50ZXJjZXB0IHRoZSBleGl0IGF0dGVtcHQgYXQgYW4gb3V0ZXIgbGV2ZWwuICBUaGUKLSAgb3B0aW9uYWwgYXJndW1lbnQgXHZhcnthcmd9IGNhbiBiZSBhbiBpbnRlZ2VyIGdpdmluZyB0aGUgZXhpdCBzdGF0dXMKLSAgKGRlZmF1bHRpbmcgdG8gemVybyksIG9yIGFub3RoZXIgdHlwZSBvZiBvYmplY3QuICBJZiBpdCBpcyBhbgotICBpbnRlZ2VyLCB6ZXJvIGlzIGNvbnNpZGVyZWQgYGBzdWNjZXNzZnVsIHRlcm1pbmF0aW9uJycgYW5kIGFueQotICBub256ZXJvIHZhbHVlIGlzIGNvbnNpZGVyZWQgYGBhYm5vcm1hbCB0ZXJtaW5hdGlvbicnIGJ5IHNoZWxscyBhbmQKLSAgdGhlIGxpa2UuICBNb3N0IHN5c3RlbXMgcmVxdWlyZSBpdCB0byBiZSBpbiB0aGUgcmFuZ2UgMC0xMjcsIGFuZAotICBwcm9kdWNlIHVuZGVmaW5lZCByZXN1bHRzIG90aGVyd2lzZS4gIFNvbWUgc3lzdGVtcyBoYXZlIGEgY29udmVudGlvbgotICBmb3IgYXNzaWduaW5nIHNwZWNpZmljIG1lYW5pbmdzIHRvIHNwZWNpZmljIGV4aXQgY29kZXMsIGJ1dCB0aGVzZQotICBhcmUgZ2VuZXJhbGx5IHVuZGVyZGV2ZWxvcGVkOyBcVU5JWHt9IHByb2dyYW1zIGdlbmVyYWxseSB1c2UgMiBmb3IKLSAgY29tbWFuZCBsaW5lIHN5bnRheCBlcnJvcnMgYW5kIDEgZm9yIGFsbCBvdGhlciBraW5kIG9mIGVycm9ycy4gIElmCi0gIGFub3RoZXIgdHlwZSBvZiBvYmplY3QgaXMgcGFzc2VkLCBcY29kZXtOb25lfSBpcyBlcXVpdmFsZW50IHRvCi0gIHBhc3NpbmcgemVybywgYW5kIGFueSBvdGhlciBvYmplY3QgaXMgcHJpbnRlZCB0byBcY29kZXtzeXMuc3RkZXJyfQotICBhbmQgcmVzdWx0cyBpbiBhbiBleGl0IGNvZGUgb2YgMS4gIEluIHBhcnRpY3VsYXIsCi0gIFxjb2Rle3N5cy5leGl0KCJzb21lIGVycm9yIG1lc3NhZ2UiKX0gaXMgYSBxdWljayB3YXkgdG8gZXhpdCBhCi0gIHByb2dyYW0gd2hlbiBhbiBlcnJvciBvY2N1cnMuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldGNoZWNraW50ZXJ2YWx9e30KLSAgUmV0dXJuIHRoZSBpbnRlcnByZXRlcidzIGBgY2hlY2sgaW50ZXJ2YWwnJzsKLSAgc2VlIFxmdW5jdGlvbntzZXRjaGVja2ludGVydmFsKCl9LgotICBcdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0ZGVmYXVsdGVuY29kaW5nfXt9Ci0gIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBkZWZhdWx0IHN0cmluZyBlbmNvZGluZyB1c2VkIGJ5IHRoZQotICBVbmljb2RlIGltcGxlbWVudGF0aW9uLgotICBcdmVyc2lvbmFkZGVkezIuMH0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0ZGxvcGVuZmxhZ3N9e30KLSAgUmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBmbGFncyB0aGF0IGFyZSB1c2VkIGZvcgotICBcY2Z1bmN0aW9ue2Rsb3BlbigpfSBjYWxscy4gVGhlIGZsYWcgY29uc3RhbnRzIGFyZSBkZWZpbmVkIGluIHRoZQotICBccmVmbW9kdWxle2RsfSBhbmQgXG1vZHVsZXtETEZDTn0gbW9kdWxlcy4KLSAgQXZhaWxhYmlsaXR5OiBcVU5JWC4KLSAgXHZlcnNpb25hZGRlZHsyLjJ9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldGZpbGVzeXN0ZW1lbmNvZGluZ317fQotICBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGVuY29kaW5nIHVzZWQgdG8gY29udmVydCBVbmljb2RlIGZpbGVuYW1lcwotICBpbnRvIHN5c3RlbSBmaWxlIG5hbWVzLCBvciBcY29kZXtOb25lfSBpZiB0aGUgc3lzdGVtIGRlZmF1bHQgZW5jb2RpbmcKLSAgaXMgdXNlZC4gVGhlIHJlc3VsdCB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBvcGVyYXRpbmcgc3lzdGVtOgotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSBPbiBXaW5kb3dzIDl4LCB0aGUgZW5jb2RpbmcgaXMgYGBtYmNzJycuCi1caXRlbSBPbiBNYWMgT1MgWCwgdGhlIGVuY29kaW5nIGlzIGBgdXRmLTgnJy4KLVxpdGVtIE9uIFxVTklYLCB0aGUgZW5jb2RpbmcgaXMgdGhlIHVzZXIncyBwcmVmZXJlbmNlCi0gICAgICBhY2NvcmRpbmcgdG8gdGhlIHJlc3VsdCBvZiBubF9sYW5naW5mbyhDT0RFU0VUKSwgb3IgXGNvbnN0YW50e05vbmV9Ci0gICAgICBpZiB0aGUgXGNvZGV7bmxfbGFuZ2luZm8oQ09ERVNFVCl9IGZhaWxlZC4KLVxpdGVtIE9uIFdpbmRvd3MgTlQrLCBmaWxlIG5hbWVzIGFyZSBVbmljb2RlIG5hdGl2ZWx5LCBzbyBubyBjb252ZXJzaW9uCi0gICAgICBpcyBwZXJmb3JtZWQuIFxmdW5jdGlvbntnZXRmaWxlc3lzdGVtZW5jb2RpbmcoKX0gc3RpbGwgcmV0dXJucwotICAgICAgXGNvZGV7J21iY3MnfSwgYXMgdGhpcyBpcyB0aGUgZW5jb2RpbmcgdGhhdCBhcHBsaWNhdGlvbnMgc2hvdWxkIHVzZQotICAgICAgd2hlbiB0aGV5IGV4cGxpY2l0bHkgd2FudCB0byBjb252ZXJ0IFVuaWNvZGUgc3RyaW5ncyB0byBieXRlIHN0cmluZ3MKLSAgICAgIHRoYXQgYXJlIGVxdWl2YWxlbnQgd2hlbiB1c2VkIGFzIGZpbGUgbmFtZXMuCi1cZW5ke2l0ZW1pemV9Ci0gIFx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRyZWZjb3VudH17b2JqZWN0fQotICBSZXR1cm4gdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgXHZhcntvYmplY3R9LiAgVGhlIGNvdW50IHJldHVybmVkCi0gIGlzIGdlbmVyYWxseSBvbmUgaGlnaGVyIHRoYW4geW91IG1pZ2h0IGV4cGVjdCwgYmVjYXVzZSBpdCBpbmNsdWRlcwotICB0aGUgKHRlbXBvcmFyeSkgcmVmZXJlbmNlIGFzIGFuIGFyZ3VtZW50IHRvCi0gIFxmdW5jdGlvbntnZXRyZWZjb3VudCgpfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0cmVjdXJzaW9ubGltaXR9e30KLSAgUmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSByZWN1cnNpb24gbGltaXQsIHRoZSBtYXhpbXVtIGRlcHRoCi0gIG9mIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgc3RhY2suICBUaGlzIGxpbWl0IHByZXZlbnRzIGluZmluaXRlCi0gIHJlY3Vyc2lvbiBmcm9tIGNhdXNpbmcgYW4gb3ZlcmZsb3cgb2YgdGhlIEMgc3RhY2sgYW5kIGNyYXNoaW5nCi0gIFB5dGhvbi4gIEl0IGNhbiBiZSBzZXQgYnkgXGZ1bmN0aW9ue3NldHJlY3Vyc2lvbmxpbWl0KCl9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtfZ2V0ZnJhbWV9e1xvcHRpb25hbHtkZXB0aH19Ci0gIFJldHVybiBhIGZyYW1lIG9iamVjdCBmcm9tIHRoZSBjYWxsIHN0YWNrLiAgSWYgb3B0aW9uYWwgaW50ZWdlcgotICBcdmFye2RlcHRofSBpcyBnaXZlbiwgcmV0dXJuIHRoZSBmcmFtZSBvYmplY3QgdGhhdCBtYW55IGNhbGxzIGJlbG93Ci0gIHRoZSB0b3Agb2YgdGhlIHN0YWNrLiAgSWYgdGhhdCBpcyBkZWVwZXIgdGhhbiB0aGUgY2FsbCBzdGFjaywKLSAgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSBpcyByYWlzZWQuICBUaGUgZGVmYXVsdCBmb3IgXHZhcntkZXB0aH0gaXMKLSAgemVybywgcmV0dXJuaW5nIHRoZSBmcmFtZSBhdCB0aGUgdG9wIG9mIHRoZSBjYWxsIHN0YWNrLgotCi0gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQgZm9yIGludGVybmFsIGFuZCBzcGVjaWFsaXplZCBwdXJwb3NlcwotICBvbmx5LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXR3aW5kb3dzdmVyc2lvbn17fQotICBSZXR1cm4gYSB0dXBsZSBjb250YWluaW5nIGZpdmUgY29tcG9uZW50cywgZGVzY3JpYmluZyB0aGUgV2luZG93cwotICB2ZXJzaW9uIGN1cnJlbnRseSBydW5uaW5nLiAgVGhlIGVsZW1lbnRzIGFyZSBcdmFye21ham9yfSwgXHZhcnttaW5vcn0sCi0gIFx2YXJ7YnVpbGR9LCBcdmFye3BsYXRmb3JtfSwgYW5kIFx2YXJ7dGV4dH0uICBcdmFye3RleHR9IGNvbnRhaW5zCi0gIGEgc3RyaW5nIHdoaWxlIGFsbCBvdGhlciB2YWx1ZXMgYXJlIGludGVnZXJzLgotCi0gIFx2YXJ7cGxhdGZvcm19IG1heSBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0KLSAgXGJlZ2lue3RhYmxlaWl9e2x8bH17Y29uc3RhbnR9e0NvbnN0YW50fXtQbGF0Zm9ybX0KLSAgICBcbGluZWlpezAgKFZFUl9QTEFURk9STV9XSU4zMnMpfSAgICAgICB7V2luMzJzIG9uIFdpbmRvd3MgMy4xfQotICAgIFxsaW5laWl7MSAoVkVSX1BMQVRGT1JNX1dJTjMyX1dJTkRPV1MpfXtXaW5kb3dzIDk1Lzk4L01FfQotICAgIFxsaW5laWl7MiAoVkVSX1BMQVRGT1JNX1dJTjMyX05UKX0gICAgIHtXaW5kb3dzIE5ULzIwMDAvWFB9Ci0gICAgXGxpbmVpaXszIChWRVJfUExBVEZPUk1fV0lOMzJfQ0UpfSAgICAge1dpbmRvd3MgQ0V9Ci0gIFxlbmR7dGFibGVpaX0KLQotICBUaGlzIGZ1bmN0aW9uIHdyYXBzIHRoZSBXaW4zMiBcY2Z1bmN0aW9ue0dldFZlcnNpb25FeCgpfSBmdW5jdGlvbjsKLSAgc2VlIHRoZSBNaWNyb3NvZnQgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGVzZQotICBmaWVsZHMuCi0KLSAgQXZhaWxhYmlsaXR5OiBXaW5kb3dzLgotICBcdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317aGV4dmVyc2lvbn0KLSAgVGhlIHZlcnNpb24gbnVtYmVyIGVuY29kZWQgYXMgYSBzaW5nbGUgaW50ZWdlci4gIFRoaXMgaXMgZ3VhcmFudGVlZAotICB0byBpbmNyZWFzZSB3aXRoIGVhY2ggdmVyc2lvbiwgaW5jbHVkaW5nIHByb3BlciBzdXBwb3J0IGZvcgotICBub24tcHJvZHVjdGlvbiByZWxlYXNlcy4gIEZvciBleGFtcGxlLCB0byB0ZXN0IHRoYXQgdGhlIFB5dGhvbgotICBpbnRlcnByZXRlciBpcyBhdCBsZWFzdCB2ZXJzaW9uIDEuNS4yLCB1c2U6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWlmIHN5cy5oZXh2ZXJzaW9uID49IDB4MDEwNTAyRjA6Ci0gICAgIyB1c2Ugc29tZSBhZHZhbmNlZCBmZWF0dXJlCi0gICAgLi4uCi1lbHNlOgotICAgICMgdXNlIGFuIGFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9uIG9yIHdhcm4gdGhlIHVzZXIKLSAgICAuLi4KLVxlbmR7dmVyYmF0aW19Ci0KLSAgVGhpcyBpcyBjYWxsZWQgXHNhbXB7aGV4dmVyc2lvbn0gc2luY2UgaXQgb25seSByZWFsbHkgbG9va3MKLSAgbWVhbmluZ2Z1bCB3aGVuIHZpZXdlZCBhcyB0aGUgcmVzdWx0IG9mIHBhc3NpbmcgaXQgdG8gdGhlIGJ1aWx0LWluCi0gIFxmdW5jdGlvbntoZXgoKX0gZnVuY3Rpb24uICBUaGUgXGNvZGV7dmVyc2lvbl9pbmZvfSB2YWx1ZSBtYXkgYmUKLSAgdXNlZCBmb3IgYSBtb3JlIGh1bWFuLWZyaWVuZGx5IGVuY29kaW5nIG9mIHRoZSBzYW1lIGluZm9ybWF0aW9uLgotICBcdmVyc2lvbmFkZGVkezEuNS4yfQotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpbnRlcm59e3N0cmluZ30KLSAgRW50ZXIgXHZhcntzdHJpbmd9IGluIHRoZSB0YWJsZSBvZiBgYGludGVybmVkJycgc3RyaW5ncyBhbmQgcmV0dXJuCi0gIHRoZSBpbnRlcm5lZCBzdHJpbmcgLS0gd2hpY2ggaXMgXHZhcntzdHJpbmd9IGl0c2VsZiBvciBhIGNvcHkuCi0gIEludGVybmluZyBzdHJpbmdzIGlzIHVzZWZ1bCB0byBnYWluIGEgbGl0dGxlIHBlcmZvcm1hbmNlIG9uCi0gIGRpY3Rpb25hcnkgbG9va3VwIC0tIGlmIHRoZSBrZXlzIGluIGEgZGljdGlvbmFyeSBhcmUgaW50ZXJuZWQsIGFuZAotICB0aGUgbG9va3VwIGtleSBpcyBpbnRlcm5lZCwgdGhlIGtleSBjb21wYXJpc29ucyAoYWZ0ZXIgaGFzaGluZykgY2FuCi0gIGJlIGRvbmUgYnkgYSBwb2ludGVyIGNvbXBhcmUgaW5zdGVhZCBvZiBhIHN0cmluZyBjb21wYXJlLiAgTm9ybWFsbHksCi0gIHRoZSBuYW1lcyB1c2VkIGluIFB5dGhvbiBwcm9ncmFtcyBhcmUgYXV0b21hdGljYWxseSBpbnRlcm5lZCwgYW5kCi0gIHRoZSBkaWN0aW9uYXJpZXMgdXNlZCB0byBob2xkIG1vZHVsZSwgY2xhc3Mgb3IgaW5zdGFuY2UgYXR0cmlidXRlcwotICBoYXZlIGludGVybmVkIGtleXMuICBcdmVyc2lvbmNoYW5nZWRbSW50ZXJuZWQgc3RyaW5ncyBhcmUgbm90Ci0gIGltbW9ydGFsIChsaWtlIHRoZXkgdXNlZCB0byBiZSBpbiBQeXRob24gMi4yIGFuZCBiZWZvcmUpOwotICB5b3UgbXVzdCBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSByZXR1cm4gdmFsdWUgb2YgXGZ1bmN0aW9ue2ludGVybigpfQotICBhcm91bmQgdG8gYmVuZWZpdCBmcm9tIGl0XXsyLjN9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e2xhc3RfdHlwZX0KLVxkYXRhbGluZXtsYXN0X3ZhbHVlfQotXGRhdGFsaW5le2xhc3RfdHJhY2ViYWNrfQotICBUaGVzZSB0aHJlZSB2YXJpYWJsZXMgYXJlIG5vdCBhbHdheXMgZGVmaW5lZDsgdGhleSBhcmUgc2V0IHdoZW4gYW4KLSAgZXhjZXB0aW9uIGlzIG5vdCBoYW5kbGVkIGFuZCB0aGUgaW50ZXJwcmV0ZXIgcHJpbnRzIGFuIGVycm9yIG1lc3NhZ2UKLSAgYW5kIGEgc3RhY2sgdHJhY2ViYWNrLiAgVGhlaXIgaW50ZW5kZWQgdXNlIGlzIHRvIGFsbG93IGFuCi0gIGludGVyYWN0aXZlIHVzZXIgdG8gaW1wb3J0IGEgZGVidWdnZXIgbW9kdWxlIGFuZCBlbmdhZ2UgaW4KLSAgcG9zdC1tb3J0ZW0gZGVidWdnaW5nIHdpdGhvdXQgaGF2aW5nIHRvIHJlLWV4ZWN1dGUgdGhlIGNvbW1hbmQgdGhhdAotICBjYXVzZWQgdGhlIGVycm9yLiAgKFR5cGljYWwgdXNlIGlzIFxzYW1we2ltcG9ydCBwZGI7IHBkYi5wbSgpfSB0bwotICBlbnRlciB0aGUgcG9zdC1tb3J0ZW0gZGVidWdnZXI7IHNlZSBjaGFwdGVyflxyZWZ7ZGVidWdnZXJ9LCBgYFRoZQotICBQeXRob24gRGVidWdnZXIsJycgZm9yIG1vcmUgaW5mb3JtYXRpb24uKQotCi0gIFRoZSBtZWFuaW5nIG9mIHRoZSB2YXJpYWJsZXMgaXMgdGhlIHNhbWUgYXMgdGhhdCBvZiB0aGUgcmV0dXJuCi0gIHZhbHVlcyBmcm9tIFxmdW5jdGlvbntleGNfaW5mbygpfSBhYm92ZS4gIChTaW5jZSB0aGVyZSBpcyBvbmx5IG9uZQotICBpbnRlcmFjdGl2ZSB0aHJlYWQsIHRocmVhZC1zYWZldHkgaXMgbm90IGEgY29uY2VybiBmb3IgdGhlc2UKLSAgdmFyaWFibGVzLCB1bmxpa2UgZm9yIFxjb2Rle2V4Y190eXBlfSBldGMuKQotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXttYXhpbnR9Ci0gIFRoZSBsYXJnZXN0IHBvc2l0aXZlIGludGVnZXIgc3VwcG9ydGVkIGJ5IFB5dGhvbidzIHJlZ3VsYXIgaW50ZWdlcgotICB0eXBlLiAgVGhpcyBpcyBhdCBsZWFzdCAyKiozMS0xLiAgVGhlIGxhcmdlc3QgbmVnYXRpdmUgaW50ZWdlciBpcwotICBcY29kZXstbWF4aW50LTF9IC0tLSB0aGUgYXN5bW1ldHJ5IHJlc3VsdHMgZnJvbSB0aGUgdXNlIG9mIDIncwotICBjb21wbGVtZW50IGJpbmFyeSBhcml0aG1ldGljLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXttYXh1bmljb2RlfQotICBBbiBpbnRlZ2VyIGdpdmluZyB0aGUgbGFyZ2VzdCBzdXBwb3J0ZWQgY29kZSBwb2ludCBmb3IgYSBVbmljb2RlCi0gIGNoYXJhY3Rlci4gIFRoZSB2YWx1ZSBvZiB0aGlzIGRlcGVuZHMgb24gdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9uCi0gIHRoYXQgc3BlY2lmaWVzIHdoZXRoZXIgVW5pY29kZSBjaGFyYWN0ZXJzIGFyZSBzdG9yZWQgYXMgVUNTLTIgb3IKLSAgVUNTLTQuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e21vZHVsZXN9Ci0gIFRoaXMgaXMgYSBkaWN0aW9uYXJ5IHRoYXQgbWFwcyBtb2R1bGUgbmFtZXMgdG8gbW9kdWxlcyB3aGljaCBoYXZlCi0gIGFscmVhZHkgYmVlbiBsb2FkZWQuICBUaGlzIGNhbiBiZSBtYW5pcHVsYXRlZCB0byBmb3JjZSByZWxvYWRpbmcgb2YKLSAgbW9kdWxlcyBhbmQgb3RoZXIgdHJpY2tzLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtwYXRofQotXGluZGV4aWlpe21vZHVsZX17c2VhcmNofXtwYXRofQotICBBIGxpc3Qgb2Ygc3RyaW5ncyB0aGF0IHNwZWNpZmllcyB0aGUgc2VhcmNoIHBhdGggZm9yIG1vZHVsZXMuCi0gIEluaXRpYWxpemVkIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFxlbnZ2YXJ7UFlUSE9OUEFUSH0sIHBsdXMgYW4KLSAgaW5zdGFsbGF0aW9uLWRlcGVuZGVudCBkZWZhdWx0LgotCi0gIEFzIGluaXRpYWxpemVkIHVwb24gcHJvZ3JhbSBzdGFydHVwLAotICB0aGUgZmlyc3QgaXRlbSBvZiB0aGlzIGxpc3QsIFxjb2Rle3BhdGhbMF19LCBpcyB0aGUgZGlyZWN0b3J5Ci0gIGNvbnRhaW5pbmcgdGhlIHNjcmlwdCB0aGF0IHdhcyB1c2VkIHRvIGludm9rZSB0aGUgUHl0aG9uCi0gIGludGVycHJldGVyLiAgSWYgdGhlIHNjcmlwdCBkaXJlY3RvcnkgaXMgbm90IGF2YWlsYWJsZSAoZS5nLiAgaWYgdGhlCi0gIGludGVycHJldGVyIGlzIGludm9rZWQgaW50ZXJhY3RpdmVseSBvciBpZiB0aGUgc2NyaXB0IGlzIHJlYWQgZnJvbQotICBzdGFuZGFyZCBpbnB1dCksIFxjb2Rle3BhdGhbMF19IGlzIHRoZSBlbXB0eSBzdHJpbmcsIHdoaWNoIGRpcmVjdHMKLSAgUHl0aG9uIHRvIHNlYXJjaCBtb2R1bGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBmaXJzdC4gIE5vdGljZQotICB0aGF0IHRoZSBzY3JpcHQgZGlyZWN0b3J5IGlzIGluc2VydGVkIFxlbXBoe2JlZm9yZX0gdGhlIGVudHJpZXMKLSAgaW5zZXJ0ZWQgYXMgYSByZXN1bHQgb2YgXGVudnZhcntQWVRIT05QQVRIfS4KLQotICBBIHByb2dyYW0gaXMgZnJlZSB0byBtb2RpZnkgdGhpcyBsaXN0IGZvciBpdHMgb3duIHB1cnBvc2VzLgotCi0gIFx2ZXJzaW9uY2hhbmdlZFtVbmljb2RlIHN0cmluZ3MgYXJlIG5vIGxvbmdlciBpZ25vcmVkXXsyLjN9Ci1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e3BsYXRmb3JtfQotICBUaGlzIHN0cmluZyBjb250YWlucyBhIHBsYXRmb3JtIGlkZW50aWZpZXIsIGUuZy4gXGNvZGV7J3N1bm9zNSd9IG9yCi0gIFxjb2RleydsaW51eDEnfS4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXBwZW5kIHBsYXRmb3JtLXNwZWNpZmljCi0gIGNvbXBvbmVudHMgdG8gXGNvZGV7cGF0aH0sIGZvciBpbnN0YW5jZS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317cHJlZml4fQotICBBIHN0cmluZyBnaXZpbmcgdGhlIHNpdGUtc3BlY2lmaWMgZGlyZWN0b3J5IHByZWZpeCB3aGVyZSB0aGUKLSAgcGxhdGZvcm0gaW5kZXBlbmRlbnQgUHl0aG9uIGZpbGVzIGFyZSBpbnN0YWxsZWQ7IGJ5IGRlZmF1bHQsIHRoaXMgaXMKLSAgdGhlIHN0cmluZyBcY29kZXsnL3Vzci9sb2NhbCd9LiAgVGhpcyBjYW4gYmUgc2V0IGF0IGJ1aWxkIHRpbWUgd2l0aAotICB0aGUgXGxvbmdwcm9ncmFtb3B0e3ByZWZpeH0gYXJndW1lbnQgdG8gdGhlIFxwcm9ncmFte2NvbmZpZ3VyZX0KLSAgc2NyaXB0LiAgVGhlIG1haW4gY29sbGVjdGlvbiBvZiBQeXRob24gbGlicmFyeSBtb2R1bGVzIGlzIGluc3RhbGxlZAotICBpbiB0aGUgZGlyZWN0b3J5IFxjb2Rle3ByZWZpeCArICcvbGliL3B5dGhvblx2YXJ7dmVyc2lvbn0nfSB3aGlsZQotICB0aGUgcGxhdGZvcm0gaW5kZXBlbmRlbnQgaGVhZGVyIGZpbGVzIChhbGwgZXhjZXB0IFxmaWxle3B5Y29uZmlnLmh9KQotICBhcmUgc3RvcmVkIGluIFxjb2Rle3ByZWZpeCArICcvaW5jbHVkZS9weXRob25cdmFye3ZlcnNpb259J30sIHdoZXJlCi0gIFx2YXJ7dmVyc2lvbn0gaXMgZXF1YWwgdG8gXGNvZGV7dmVyc2lvbls6M119LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtwczF9Ci1cZGF0YWxpbmV7cHMyfQotXGluZGV4e2ludGVycHJldGVyIHByb21wdHN9Ci1caW5kZXh7cHJvbXB0cywgaW50ZXJwcmV0ZXJ9Ci0gIFN0cmluZ3Mgc3BlY2lmeWluZyB0aGUgcHJpbWFyeSBhbmQgc2Vjb25kYXJ5IHByb21wdCBvZiB0aGUKLSAgaW50ZXJwcmV0ZXIuICBUaGVzZSBhcmUgb25seSBkZWZpbmVkIGlmIHRoZSBpbnRlcnByZXRlciBpcyBpbgotICBpbnRlcmFjdGl2ZSBtb2RlLiAgVGhlaXIgaW5pdGlhbCB2YWx1ZXMgaW4gdGhpcyBjYXNlIGFyZQotICBcY29kZXsnPj4+fid9IGFuZCBcY29kZXsnLi4ufid9LiAgSWYgYSBub24tc3RyaW5nIG9iamVjdCBpcwotICBhc3NpZ25lZCB0byBlaXRoZXIgdmFyaWFibGUsIGl0cyBcZnVuY3Rpb257c3RyKCl9IGlzIHJlLWV2YWx1YXRlZAotICBlYWNoIHRpbWUgdGhlIGludGVycHJldGVyIHByZXBhcmVzIHRvIHJlYWQgYSBuZXcgaW50ZXJhY3RpdmUKLSAgY29tbWFuZDsgdGhpcyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgYSBkeW5hbWljIHByb21wdC4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c2V0Y2hlY2tpbnRlcnZhbH17aW50ZXJ2YWx9Ci0gIFNldCB0aGUgaW50ZXJwcmV0ZXIncyBgYGNoZWNrIGludGVydmFsJycuICBUaGlzIGludGVnZXIgdmFsdWUKLSAgZGV0ZXJtaW5lcyBob3cgb2Z0ZW4gdGhlIGludGVycHJldGVyIGNoZWNrcyBmb3IgcGVyaW9kaWMgdGhpbmdzIHN1Y2gKLSAgYXMgdGhyZWFkIHN3aXRjaGVzIGFuZCBzaWduYWwgaGFuZGxlcnMuICBUaGUgZGVmYXVsdCBpcyBcY29kZXsxMDB9LAotICBtZWFuaW5nIHRoZSBjaGVjayBpcyBwZXJmb3JtZWQgZXZlcnkgMTAwIFB5dGhvbiB2aXJ0dWFsIGluc3RydWN0aW9ucy4KLSAgU2V0dGluZyBpdCB0byBhIGxhcmdlciB2YWx1ZSBtYXkgaW5jcmVhc2UgcGVyZm9ybWFuY2UgZm9yIHByb2dyYW1zCi0gIHVzaW5nIHRocmVhZHMuICBTZXR0aW5nIGl0IHRvIGEgdmFsdWUgXGNvZGV7PD19IDAgY2hlY2tzIGV2ZXJ5Ci0gIHZpcnR1YWwgaW5zdHJ1Y3Rpb24sIG1heGltaXppbmcgcmVzcG9uc2l2ZW5lc3MgYXMgd2VsbCBhcyBvdmVyaGVhZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c2V0ZGVmYXVsdGVuY29kaW5nfXtuYW1lfQotICBTZXQgdGhlIGN1cnJlbnQgZGVmYXVsdCBzdHJpbmcgZW5jb2RpbmcgdXNlZCBieSB0aGUgVW5pY29kZQotICBpbXBsZW1lbnRhdGlvbi4gIElmIFx2YXJ7bmFtZX0gZG9lcyBub3QgbWF0Y2ggYW55IGF2YWlsYWJsZQotICBlbmNvZGluZywgXGV4Y2VwdGlvbntMb29rdXBFcnJvcn0gaXMgcmFpc2VkLiAgVGhpcyBmdW5jdGlvbiBpcyBvbmx5Ci0gIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgdGhlIFxyZWZtb2R1bGV7c2l0ZX0gbW9kdWxlIGltcGxlbWVudGF0aW9uCi0gIGFuZCwgd2hlcmUgbmVlZGVkLCBieSBcbW9kdWxle3NpdGVjdXN0b21pemV9LiAgT25jZSB1c2VkIGJ5IHRoZQotICBccmVmbW9kdWxle3NpdGV9IG1vZHVsZSwgaXQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBcbW9kdWxle3N5c30KLSAgbW9kdWxlJ3MgbmFtZXNwYWNlLgotJSAgTm90ZSB0aGF0IFxyZWZtb2R1bGV7c2l0ZX0gaXMgbm90IGltcG9ydGVkIGlmCi0lICB0aGUgXHByb2dyYW1vcHR7LVN9IG9wdGlvbiBpcyBwYXNzZWQgdG8gdGhlIGludGVycHJldGVyLCBpbiB3aGljaAotJSAgY2FzZSB0aGlzIGZ1bmN0aW9uIHdpbGwgcmVtYWluIGF2YWlsYWJsZS4KLSAgXHZlcnNpb25hZGRlZHsyLjB9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NldGRsb3BlbmZsYWdzfXtufQotICBTZXQgdGhlIGZsYWdzIHVzZWQgYnkgdGhlIGludGVycHJldGVyIGZvciBcY2Z1bmN0aW9ue2Rsb3BlbigpfQotICBjYWxscywgc3VjaCBhcyB3aGVuIHRoZSBpbnRlcnByZXRlciBsb2FkcyBleHRlbnNpb24gbW9kdWxlcy4gIEFtb25nCi0gIG90aGVyIHRoaW5ncywgdGhpcyB3aWxsIGVuYWJsZSBhIGxhenkgcmVzb2x2aW5nIG9mIHN5bWJvbHMgd2hlbgotICBpbXBvcnRpbmcgYSBtb2R1bGUsIGlmIGNhbGxlZCBhcyBcY29kZXtzeXMuc2V0ZGxvcGVuZmxhZ3MoMCl9LiAgVG8KLSAgc2hhcmUgc3ltYm9scyBhY3Jvc3MgZXh0ZW5zaW9uIG1vZHVsZXMsIGNhbGwgYXMKLSAgXGNvZGV7c3lzLnNldGRsb3BlbmZsYWdzKGRsLlJUTERfTk9XIHwgZGwuUlRMRF9HTE9CQUwpfS4gIFN5bWJvbGljCi0gIG5hbWVzIGZvciB0aGUgZmxhZyBtb2R1bGVzIGNhbiBiZSBlaXRoZXIgZm91bmQgaW4gdGhlIFxyZWZtb2R1bGV7ZGx9Ci0gIG1vZHVsZSwgb3IgaW4gdGhlIFxtb2R1bGV7RExGQ059IG1vZHVsZS4gSWYgXG1vZHVsZXtETEZDTn0gaXMgbm90Ci0gIGF2YWlsYWJsZSwgaXQgY2FuIGJlIGdlbmVyYXRlZCBmcm9tIFxmaWxley91c3IvaW5jbHVkZS9kbGZjbi5ofQotICB1c2luZyB0aGUgXHByb2dyYW17aDJweX0gc2NyaXB0LgotICBBdmFpbGFiaWxpdHk6IFxVTklYLgotICBcdmVyc2lvbmFkZGVkezIuMn0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c2V0cHJvZmlsZX17cHJvZmlsZWZ1bmN9Ci0gIFNldCB0aGUgc3lzdGVtJ3MgcHJvZmlsZSBmdW5jdGlvbixcaW5kZXh7cHJvZmlsZSBmdW5jdGlvbn0gd2hpY2gKLSAgYWxsb3dzIHlvdSB0byBpbXBsZW1lbnQgYSBQeXRob24gc291cmNlIGNvZGUgcHJvZmlsZXIgaW4KLSAgUHl0aG9uLlxpbmRleHtwcm9maWxlcn0gIFNlZSBjaGFwdGVyflxyZWZ7cHJvZmlsZX0gZm9yIG1vcmUKLSAgaW5mb3JtYXRpb24gb24gdGhlIFB5dGhvbiBwcm9maWxlci4gIFRoZSBzeXN0ZW0ncyBwcm9maWxlIGZ1bmN0aW9uCi0gIGlzIGNhbGxlZCBzaW1pbGFybHkgdG8gdGhlIHN5c3RlbSdzIHRyYWNlIGZ1bmN0aW9uIChzZWUKLSAgXGZ1bmN0aW9ue3NldHRyYWNlKCl9KSwgYnV0IGl0IGlzbid0IGNhbGxlZCBmb3IgZWFjaCBleGVjdXRlZCBsaW5lCi0gIG9mIGNvZGUgKG9ubHkgb24gY2FsbCBhbmQgcmV0dXJuLCBidXQgdGhlIHJldHVybiBldmVudCBpcyByZXBvcnRlZAotICBldmVuIHdoZW4gYW4gZXhjZXB0aW9uIGhhcyBiZWVuIHNldCkuICBUaGUgZnVuY3Rpb24gaXMKLSAgdGhyZWFkLXNwZWNpZmljLCBidXQgdGhlcmUgaXMgbm8gd2F5IGZvciB0aGUgcHJvZmlsZXIgdG8ga25vdyBhYm91dAotICBjb250ZXh0IHN3aXRjaGVzIGJldHdlZW4gdGhyZWFkcywgc28gaXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byB1c2UKLSAgdGhpcyBpbiB0aGUgcHJlc2VuY2Ugb2YgbXVsdGlwbGUgdGhyZWFkcy4KLSAgQWxzbywgaXRzIHJldHVybiB2YWx1ZSBpcyBub3QgdXNlZCwgc28gaXQgY2FuIHNpbXBseSByZXR1cm4KLSAgXGNvZGV7Tm9uZX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NldHJlY3Vyc2lvbmxpbWl0fXtsaW1pdH0KLSAgU2V0IHRoZSBtYXhpbXVtIGRlcHRoIG9mIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgc3RhY2sgdG8KLSAgXHZhcntsaW1pdH0uICBUaGlzIGxpbWl0IHByZXZlbnRzIGluZmluaXRlIHJlY3Vyc2lvbiBmcm9tIGNhdXNpbmcgYW4KLSAgb3ZlcmZsb3cgb2YgdGhlIEMgc3RhY2sgYW5kIGNyYXNoaW5nIFB5dGhvbi4KLQotICBUaGUgaGlnaGVzdCBwb3NzaWJsZSBsaW1pdCBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQuICBBIHVzZXIgbWF5IG5lZWQKLSAgdG8gc2V0IHRoZSBsaW1pdCBoaWdoZXIgd2hlbiBzaGUgaGFzIGEgcHJvZ3JhbSB0aGF0IHJlcXVpcmVzIGRlZXAKLSAgcmVjdXJzaW9uIGFuZCBhIHBsYXRmb3JtIHRoYXQgc3VwcG9ydHMgYSBoaWdoZXIgbGltaXQuICBUaGlzIHNob3VsZAotICBiZSBkb25lIHdpdGggY2FyZSwgYmVjYXVzZSBhIHRvby1oaWdoIGxpbWl0IGNhbiBsZWFkIHRvIGEgY3Jhc2guCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NldHRyYWNlfXt0cmFjZWZ1bmN9Ci0gIFNldCB0aGUgc3lzdGVtJ3MgdHJhY2UgZnVuY3Rpb24sXGluZGV4e3RyYWNlIGZ1bmN0aW9ufSB3aGljaCBhbGxvd3MKLSAgeW91IHRvIGltcGxlbWVudCBhIFB5dGhvbiBzb3VyY2UgY29kZSBkZWJ1Z2dlciBpbiBQeXRob24uICBTZWUKLSAgc2VjdGlvbiBccmVme2RlYnVnZ2VyLWhvb2tzfSwgYGBIb3cgSXQgV29ya3MsJycgaW4gdGhlIGNoYXB0ZXIgb24KLSAgdGhlIFB5dGhvbiBkZWJ1Z2dlci5caW5kZXh7ZGVidWdnZXJ9ICBUaGUgZnVuY3Rpb24gaXMKLSAgdGhyZWFkLXNwZWNpZmljOyBmb3IgYSBkZWJ1Z2dlciB0byBzdXBwb3J0IG11bHRpcGxlIHRocmVhZHMsIGl0IG11c3QKLSAgYmUgcmVnaXN0ZXJlZCB1c2luZyBcZnVuY3Rpb257c2V0dHJhY2UoKX0gZm9yIGVhY2ggdGhyZWFkIGJlaW5nCi0gIGRlYnVnZ2VkLiAgXG5vdGV7VGhlIFxmdW5jdGlvbntzZXR0cmFjZSgpfSBmdW5jdGlvbiBpcyBpbnRlbmRlZCBvbmx5Ci0gIGZvciBpbXBsZW1lbnRpbmcgZGVidWdnZXJzLCBwcm9maWxlcnMsIGNvdmVyYWdlIHRvb2xzIGFuZCB0aGUgbGlrZS4KLSAgSXRzIGJlaGF2aW9yIGlzIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIHBsYXRmb3JtLCByYXRoZXIgdGhhbgotICBwYXJ0IG9mIHRoZSBsYW5ndWFnZSBkZWZpbml0aW9uLCBhbmQgdGh1cyBtYXkgbm90IGJlIGF2YWlsYWJsZSBpbgotICBhbGwgUHl0aG9uIGltcGxlbWVudGF0aW9ucy59Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NldHRzY2R1bXB9e29uX2ZsYWd9Ci0gIEFjdGl2YXRlIGR1bXBpbmcgb2YgVk0gbWVhc3VyZW1lbnRzIHVzaW5nIHRoZSBQZW50aXVtIHRpbWVzdGFtcAotICBjb3VudGVyLCBpZiBcdmFye29uX2ZsYWd9IGlzIHRydWUuIERlYWN0aXZhdGUgdGhlc2UgZHVtcHMgaWYKLSAgXHZhcntvbl9mbGFnfSBpcyBvZmYuIFRoZSBmdW5jdGlvbiBpcyBhdmFpbGFibGUgb25seSBpZiBQeXRob24KLSAgd2FzIGNvbXBpbGVkIHdpdGggXGxvbmdwcm9ncmFtb3B0e3dpdGgtdHNjfS4gVG8gdW5kZXJzdGFuZCB0aGUKLSAgb3V0cHV0IG9mIHRoaXMgZHVtcCwgcmVhZCBcZmlsZXtQeXRob24vY2V2YWwuY30gaW4gdGhlIFB5dGhvbgotICBzb3VyY2VzLgotICBcdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317c3RkaW59Ci1cZGF0YWxpbmV7c3Rkb3V0fQotXGRhdGFsaW5le3N0ZGVycn0KLSAgRmlsZSBvYmplY3RzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGludGVycHJldGVyJ3Mgc3RhbmRhcmQgaW5wdXQsCi0gIG91dHB1dCBhbmQgZXJyb3Igc3RyZWFtcy4gIFxjb2Rle3N0ZGlufSBpcyB1c2VkIGZvciBhbGwgaW50ZXJwcmV0ZXIKLSAgaW5wdXQgZXhjZXB0IGZvciBzY3JpcHRzLiAgXGNvZGV7c3Rkb3V0fSBpcwotICB1c2VkIGZvciB0aGUgb3V0cHV0IG9mIFxrZXl3b3Jke3ByaW50fSBhbmQgZXhwcmVzc2lvbiBzdGF0ZW1lbnRzLgotICBUaGUgaW50ZXJwcmV0ZXIncyBvd24gcHJvbXB0cyBhbmQgKGFsbW9zdCBhbGwgb2YpIGl0cyBlcnJvciBtZXNzYWdlcwotICBnbyB0byBcY29kZXtzdGRlcnJ9LiAgXGNvZGV7c3Rkb3V0fSBhbmQgXGNvZGV7c3RkZXJyfSBuZWVkbid0IGJlCi0gIGJ1aWx0LWluIGZpbGUgb2JqZWN0czogYW55IG9iamVjdCBpcyBhY2NlcHRhYmxlIGFzIGxvbmcgYXMgaXQgaGFzIGEKLSAgXG1ldGhvZHt3cml0ZSgpfSBtZXRob2QgdGhhdCB0YWtlcyBhIHN0cmluZyBhcmd1bWVudC4gIChDaGFuZ2luZwotICB0aGVzZSBvYmplY3RzIGRvZXNuJ3QgYWZmZWN0IHRoZSBzdGFuZGFyZCBJL08gc3RyZWFtcyBvZiBwcm9jZXNzZXMKLSAgZXhlY3V0ZWQgYnkgXGZ1bmN0aW9ue29zLnBvcGVuKCl9LCBcZnVuY3Rpb257b3Muc3lzdGVtKCl9IG9yIHRoZQotICBcZnVuY3Rpb257ZXhlYyooKX0gZmFtaWx5IG9mIGZ1bmN0aW9ucyBpbiB0aGUgXHJlZm1vZHVsZXtvc30KLSAgbW9kdWxlLikKLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317X19zdGRpbl9ffQotXGRhdGFsaW5le19fc3Rkb3V0X199Ci1cZGF0YWxpbmV7X19zdGRlcnJfX30KLSAgVGhlc2Ugb2JqZWN0cyBjb250YWluIHRoZSBvcmlnaW5hbCB2YWx1ZXMgb2YgXGNvZGV7c3RkaW59LAotICBcY29kZXtzdGRlcnJ9IGFuZCBcY29kZXtzdGRvdXR9IGF0IHRoZSBzdGFydCBvZiB0aGUgcHJvZ3JhbS4gIFRoZXkKLSAgYXJlIHVzZWQgZHVyaW5nIGZpbmFsaXphdGlvbiwgYW5kIGNvdWxkIGJlIHVzZWZ1bCB0byByZXN0b3JlIHRoZQotICBhY3R1YWwgZmlsZXMgdG8ga25vd24gd29ya2luZyBmaWxlIG9iamVjdHMgaW4gY2FzZSB0aGV5IGhhdmUgYmVlbgotICBvdmVyd3JpdHRlbiB3aXRoIGEgYnJva2VuIG9iamVjdC4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317dHJhY2ViYWNrbGltaXR9Ci0gIFdoZW4gdGhpcyB2YXJpYWJsZSBpcyBzZXQgdG8gYW4gaW50ZWdlciB2YWx1ZSwgaXQgZGV0ZXJtaW5lcyB0aGUKLSAgbWF4aW11bSBudW1iZXIgb2YgbGV2ZWxzIG9mIHRyYWNlYmFjayBpbmZvcm1hdGlvbiBwcmludGVkIHdoZW4gYW4KLSAgdW5oYW5kbGVkIGV4Y2VwdGlvbiBvY2N1cnMuICBUaGUgZGVmYXVsdCBpcyBcY29kZXsxMDAwfS4gIFdoZW4gc2V0Ci0gIHRvIFxjb2RlezB9IG9yIGxlc3MsIGFsbCB0cmFjZWJhY2sgaW5mb3JtYXRpb24gaXMgc3VwcHJlc3NlZCBhbmQKLSAgb25seSB0aGUgZXhjZXB0aW9uIHR5cGUgYW5kIHZhbHVlIGFyZSBwcmludGVkLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXt2ZXJzaW9ufQotICBBIHN0cmluZyBjb250YWluaW5nIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgUHl0aG9uIGludGVycHJldGVyCi0gIHBsdXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiB0aGUgYnVpbGQgbnVtYmVyIGFuZCBjb21waWxlciB1c2VkLgotICBJdCBoYXMgYSB2YWx1ZSBvZiB0aGUgZm9ybSBcY29kZXsnXHZhcnt2ZXJzaW9ufQotICAoXCNcdmFye2J1aWxkX251bWJlcn0sIFx2YXJ7YnVpbGRfZGF0ZX0sIFx2YXJ7YnVpbGRfdGltZX0pCi0gIFtcdmFye2NvbXBpbGVyfV0nfS4gIFRoZSBmaXJzdCB0aHJlZSBjaGFyYWN0ZXJzIGFyZSB1c2VkIHRvIGlkZW50aWZ5Ci0gIHRoZSB2ZXJzaW9uIGluIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMgKHdoZXJlIGFwcHJvcHJpYXRlIG9uCi0gIGVhY2ggcGxhdGZvcm0pLiAgQW4gZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGltcG9ydCBzeXMKLT4+PiBzeXMudmVyc2lvbgotJzEuNS4yICgjMCBBcHIgMTMgMTk5OSwgMTA6NTE6MTIpIFtNU0MgMzIgYml0IChJbnRlbCldJwotXGVuZHt2ZXJiYXRpbX0KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317YXBpX3ZlcnNpb259Ci0gIFRoZSBDIEFQSSB2ZXJzaW9uIGZvciB0aGlzIGludGVycHJldGVyLiAgUHJvZ3JhbW1lcnMgbWF5IGZpbmQgdGhpcyB1c2VmdWwKLSAgd2hlbiBkZWJ1Z2dpbmcgdmVyc2lvbiBjb25mbGljdHMgYmV0d2VlbiBQeXRob24gYW5kIGV4dGVuc2lvbgotICBtb2R1bGVzLiBcdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317dmVyc2lvbl9pbmZvfQotICBBIHR1cGxlIGNvbnRhaW5pbmcgdGhlIGZpdmUgY29tcG9uZW50cyBvZiB0aGUgdmVyc2lvbiBudW1iZXI6Ci0gIFx2YXJ7bWFqb3J9LCBcdmFye21pbm9yfSwgXHZhcnttaWNyb30sIFx2YXJ7cmVsZWFzZWxldmVsfSwgYW5kCi0gIFx2YXJ7c2VyaWFsfS4gIEFsbCB2YWx1ZXMgZXhjZXB0IFx2YXJ7cmVsZWFzZWxldmVsfSBhcmUgaW50ZWdlcnM7Ci0gIHRoZSByZWxlYXNlIGxldmVsIGlzIFxjb2RleydhbHBoYSd9LCBcY29kZXsnYmV0YSd9LAotICBcY29kZXsnY2FuZGlkYXRlJ30sIG9yIFxjb2RleydmaW5hbCd9LiAgVGhlIFxjb2Rle3ZlcnNpb25faW5mb30KLSAgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgUHl0aG9uIHZlcnNpb24gMi4wIGlzIFxjb2RleygyLCAwLCAwLAotICAnZmluYWwnLCAwKX0uCi0gIFx2ZXJzaW9uYWRkZWR7Mi4wfQotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXt3YXJub3B0aW9uc30KLSAgVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgb2YgdGhlIHdhcm5pbmdzIGZyYW1ld29yazsgZG8gbm90Ci0gIG1vZGlmeSB0aGlzIHZhbHVlLiAgUmVmZXIgdG8gdGhlIFxyZWZtb2R1bGV7d2FybmluZ3N9IG1vZHVsZSBmb3IKLSAgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgd2FybmluZ3MgZnJhbWV3b3JrLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXt3aW52ZXJ9Ci0gIFRoZSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIGZvcm0gcmVnaXN0cnkga2V5cyBvbiBXaW5kb3dzIHBsYXRmb3Jtcy4KLSAgVGhpcyBpcyBzdG9yZWQgYXMgc3RyaW5nIHJlc291cmNlIDEwMDAgaW4gdGhlIFB5dGhvbiBETEwuICBUaGUgdmFsdWUKLSAgaXMgbm9ybWFsbHkgdGhlIGZpcnN0IHRocmVlIGNoYXJhY3RlcnMgb2YgXGNvbnN0YW50e3ZlcnNpb259LiAgSXQgaXMKLSAgcHJvdmlkZWQgaW4gdGhlIFxtb2R1bGV7c3lzfSBtb2R1bGUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXM7Ci0gIG1vZGlmeWluZyB0aGlzIHZhbHVlIGhhcyBubyBlZmZlY3Qgb24gdGhlIHJlZ2lzdHJ5IGtleXMgdXNlZCBieQotICBQeXRob24uCi0gIEF2YWlsYWJpbGl0eTogV2luZG93cy4KLVxlbmR7ZGF0YWRlc2N9Ci0KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWVtb2R1bGV7c2l0ZX0KLSAgICB7VGhpcyBkZXNjcmliZXMgaG93IHRvIHVzZSAucHRoIGZpbGVzIHRvIGV4dGVuZCBcY29kZXtzeXMucGF0aH0ufQotXGVuZHtzZWVhbHNvfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJzeXNsb2cudGV4IGIvRG9jL2xpYi9saWJzeXNsb2cudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzU5Nzc2Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlic3lzbG9nLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7c3lzbG9nfSAtLS0KLSAgICAgICAgIFxVTklYe30gc3lzbG9nIGxpYnJhcnkgcm91dGluZXN9Ci0KLVxkZWNsYXJlbW9kdWxle2J1aWx0aW59e3N5c2xvZ30KLSAgXHBsYXRmb3Jte1VuaXh9Ci1cbW9kdWxlc3lub3BzaXN7QW4gaW50ZXJmYWNlIHRvIHRoZSBcVU5JWFwgc3lzbG9nIGxpYnJhcnkgcm91dGluZXMufQotCi0KLVRoaXMgbW9kdWxlIHByb3ZpZGVzIGFuIGludGVyZmFjZSB0byB0aGUgXFVOSVh7fSBcY29kZXtzeXNsb2d9IGxpYnJhcnkKLXJvdXRpbmVzLiAgUmVmZXIgdG8gdGhlIFxVTklYe30gbWFudWFsIHBhZ2VzIGZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uCi1vZiB0aGUgXGNvZGV7c3lzbG9nfSBmYWNpbGl0eS4KLQotVGhlIG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgotCi0KLVxiZWdpbntmdW5jZGVzY317c3lzbG9nfXtcb3B0aW9uYWx7cHJpb3JpdHksfSBtZXNzYWdlfQotU2VuZCB0aGUgc3RyaW5nIFx2YXJ7bWVzc2FnZX0gdG8gdGhlIHN5c3RlbSBsb2dnZXIuICBBIHRyYWlsaW5nCi1uZXdsaW5lIGlzIGFkZGVkIGlmIG5lY2Vzc2FyeS4gIEVhY2ggbWVzc2FnZSBpcyB0YWdnZWQgd2l0aCBhIHByaW9yaXR5Ci1jb21wb3NlZCBvZiBhIFx2YXJ7ZmFjaWxpdHl9IGFuZCBhIFx2YXJ7bGV2ZWx9LiAgVGhlIG9wdGlvbmFsCi1cdmFye3ByaW9yaXR5fSBhcmd1bWVudCwgd2hpY2ggZGVmYXVsdHMgdG8gXGNvbnN0YW50e0xPR19JTkZPfSwKLWRldGVybWluZXMgdGhlIG1lc3NhZ2UgcHJpb3JpdHkuICBJZiB0aGUgZmFjaWxpdHkgaXMgbm90IGVuY29kZWQgaW4KLVx2YXJ7cHJpb3JpdHl9IHVzaW5nIGxvZ2ljYWwtb3IgKFxjb2Rle0xPR19JTkZPIHwgTE9HX1VTRVJ9KSwgdGhlCi12YWx1ZSBnaXZlbiBpbiB0aGUgXGZ1bmN0aW9ue29wZW5sb2coKX0gY2FsbCBpcyB1c2VkLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtvcGVubG9nfXtpZGVudFxvcHRpb25hbHssIGxvZ29wdFxvcHRpb25hbHssIGZhY2lsaXR5fX19Ci1Mb2dnaW5nIG9wdGlvbnMgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdHMgY2FuIGJlIHNldCBieSBleHBsaWNpdGx5Ci1vcGVuaW5nIHRoZSBsb2cgZmlsZSB3aXRoIFxmdW5jdGlvbntvcGVubG9nKCl9IHByaW9yIHRvIGNhbGxpbmcKLVxmdW5jdGlvbntzeXNsb2coKX0uICBUaGUgZGVmYXVsdHMgYXJlICh1c3VhbGx5KSBcdmFye2lkZW50fSA9Ci1cY29kZXsnc3lzbG9nJ30sIFx2YXJ7bG9nb3B0fSA9IFxjb2RlezB9LCBcdmFye2ZhY2lsaXR5fSA9Ci1cY29uc3RhbnR7TE9HX1VTRVJ9LiAgVGhlIFx2YXJ7aWRlbnR9IGFyZ3VtZW50IGlzIGEgc3RyaW5nIHdoaWNoIGlzCi1wcmVwZW5kZWQgdG8gZXZlcnkgbWVzc2FnZS4gIFRoZSBvcHRpb25hbCBcdmFye2xvZ29wdH0gYXJndW1lbnQgaXMgYQotYml0IGZpZWxkIC0gc2VlIGJlbG93IGZvciBwb3NzaWJsZSB2YWx1ZXMgdG8gY29tYmluZS4gIFRoZSBvcHRpb25hbAotXHZhcntmYWNpbGl0eX0gYXJndW1lbnQgc2V0cyB0aGUgZGVmYXVsdCBmYWNpbGl0eSBmb3IgbWVzc2FnZXMgd2hpY2gKLWRvIG5vdCBoYXZlIGEgZmFjaWxpdHkgZXhwbGljaXRseSBlbmNvZGVkLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtjbG9zZWxvZ317fQotQ2xvc2UgdGhlIGxvZyBmaWxlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzZXRsb2dtYXNrfXttYXNrcHJpfQotU2V0IHRoZSBwcmlvcml0eSBtYXNrIHRvIFx2YXJ7bWFza3ByaX0gYW5kIHJldHVybiB0aGUKLXByZXZpb3VzIG1hc2sgdmFsdWUuICBDYWxscyB0byBcZnVuY3Rpb257c3lzbG9nKCl9IHdpdGggYSBwcmlvcml0eQotbGV2ZWwgbm90IHNldCBpbiBcdmFye21hc2twcml9IGFyZSBpZ25vcmVkLiAgVGhlIGRlZmF1bHQgaXMgdG8gbG9nIGFsbAotcHJpb3JpdGllcy4gIFRoZSBmdW5jdGlvbiBcY29kZXtMT0dfTUFTSyhcdmFye3ByaX0pfSBjYWxjdWxhdGVzIHRoZQotbWFzayBmb3IgdGhlIGluZGl2aWR1YWwgcHJpb3JpdHkgXHZhcntwcml9LiAgVGhlIGZ1bmN0aW9uCi1cY29kZXtMT0dfVVBUTyhcdmFye3ByaX0pfSBjYWxjdWxhdGVzIHRoZSBtYXNrIGZvciBhbGwgcHJpb3JpdGllcyB1cAotdG8gYW5kIGluY2x1ZGluZyBcdmFye3ByaX0uCi1cZW5ke2Z1bmNkZXNjfQotCi0KLVRoZSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGNvbnN0YW50czoKLQotXGJlZ2lue2Rlc2NyaXB0aW9ufQotCi1caXRlbVtQcmlvcml0eSBsZXZlbHMgKGhpZ2ggdG8gbG93KTpdCi0KLVxjb25zdGFudHtMT0dfRU1FUkd9LCBcY29uc3RhbnR7TE9HX0FMRVJUfSwgXGNvbnN0YW50e0xPR19DUklUfSwKLVxjb25zdGFudHtMT0dfRVJSfSwgXGNvbnN0YW50e0xPR19XQVJOSU5HfSwgXGNvbnN0YW50e0xPR19OT1RJQ0V9LAotXGNvbnN0YW50e0xPR19JTkZPfSwgXGNvbnN0YW50e0xPR19ERUJVR30uCi0KLVxpdGVtW0ZhY2lsaXRpZXM6XQotCi1cY29uc3RhbnR7TE9HX0tFUk59LCBcY29uc3RhbnR7TE9HX1VTRVJ9LCBcY29uc3RhbnR7TE9HX01BSUx9LAotXGNvbnN0YW50e0xPR19EQUVNT059LCBcY29uc3RhbnR7TE9HX0FVVEh9LCBcY29uc3RhbnR7TE9HX0xQUn0sCi1cY29uc3RhbnR7TE9HX05FV1N9LCBcY29uc3RhbnR7TE9HX1VVQ1B9LCBcY29uc3RhbnR7TE9HX0NST059IGFuZAotXGNvbnN0YW50e0xPR19MT0NBTDB9IHRvIFxjb25zdGFudHtMT0dfTE9DQUw3fS4KLQotXGl0ZW1bTG9nIG9wdGlvbnM6XQotCi1cY29uc3RhbnR7TE9HX1BJRH0sIFxjb25zdGFudHtMT0dfQ09OU30sIFxjb25zdGFudHtMT0dfTkRFTEFZfSwKLVxjb25zdGFudHtMT0dfTk9XQUlUfSBhbmQgXGNvbnN0YW50e0xPR19QRVJST1J9IGlmIGRlZmluZWQgaW4KLVxjb2RlezxzeXNsb2cuaD59LgotCi1cZW5ke2Rlc2NyaXB0aW9ufQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ0YWJuYW5ueS50ZXggYi9Eb2MvbGliL2xpYnRhYm5hbm55LnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJiOTM4NS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnRhYm5hbm55LnRleAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7dGFibmFubnl9IC0tLQotICAgICAgICAgRGV0ZWN0aW9uIG9mIGFtYmlndW91cyBpbmRlbnRhdGlvbn0KLQotJSBydWRpbWVudGFyeSBkb2N1bWVudGF0aW9uIGJhc2VkIG9uIG1vZHVsZSBjb21tZW50cywgYnkgUGV0ZXIgRnVuawotJSA8cGZAYXJ0Y29tLWdtYmguZGU+Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXt0YWJuYW5ueX0KLVxtb2R1bGVzeW5vcHNpc3tUb29sIGZvciBkZXRlY3Rpbmcgd2hpdGUgc3BhY2UgcmVsYXRlZCBwcm9ibGVtcwotICAgICAgICAgICAgICAgIGluIFB5dGhvbiBzb3VyY2UgZmlsZXMgaW4gYSBkaXJlY3RvcnkgdHJlZS59Ci1cbW9kdWxlYXV0aG9ye1RpbSBQZXRlcnN9e3RpbV9vbmVAdXNlcnMuc291cmNlZm9yZ2UubmV0fQotXHNlY3Rpb25hdXRob3J7UGV0ZXIgRnVua317cGZAYXJ0Y29tLWdtYmguZGV9Ci0KLUZvciB0aGUgdGltZSBiZWluZyB0aGlzIG1vZHVsZSBpcyBpbnRlbmRlZCB0byBiZSBjYWxsZWQgYXMgYSBzY3JpcHQuCi1Ib3dldmVyIGl0IGlzIHBvc3NpYmxlIHRvIGltcG9ydCBpdCBpbnRvIGFuIElERSBhbmQgdXNlIHRoZSBmdW5jdGlvbgotXGZ1bmN0aW9ue2NoZWNrKCl9IGRlc2NyaWJlZCBiZWxvdy4KLQotXHdhcm5pbmd7VGhlIEFQSSBwcm92aWRlZCBieSB0aGlzIG1vZHVsZSBpcyBsaWtlbHkgdG8gY2hhbmdlIAotaW4gZnV0dXJlIHJlbGVhc2VzOyBzdWNoIGNoYW5nZXMgbWF5IG5vdCBiZSBiYWNrd2FyZCBjb21wYXRpYmxlLn0KLQotXGJlZ2lue2Z1bmNkZXNjfXtjaGVja317ZmlsZV9vcl9kaXJ9Ci0gIElmIFx2YXJ7ZmlsZV9vcl9kaXJ9IGlzIGEgZGlyZWN0b3J5IGFuZCBub3QgYSBzeW1ib2xpYyBsaW5rLCB0aGVuCi0gIHJlY3Vyc2l2ZWx5IGRlc2NlbmQgdGhlIGRpcmVjdG9yeSB0cmVlIG5hbWVkIGJ5IFx2YXJ7ZmlsZV9vcl9kaXJ9LAotICBjaGVja2luZyBhbGwgXGZpbGV7LnB5fSBmaWxlcyBhbG9uZyB0aGUgd2F5LiAgSWYgXHZhcntmaWxlX29yX2Rpcn0KLSAgaXMgYW4gb3JkaW5hcnkgUHl0aG9uIHNvdXJjZSBmaWxlLCBpdCBpcyBjaGVja2VkIGZvciB3aGl0ZXNwYWNlCi0gIHJlbGF0ZWQgcHJvYmxlbXMuICBUaGUgZGlhZ25vc3RpYyBtZXNzYWdlcyBhcmUgd3JpdHRlbiB0byBzdGFuZGFyZAotICBvdXRwdXQgdXNpbmcgdGhlIHByaW50IHN0YXRlbWVudC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue2RhdGFkZXNjfXt2ZXJib3NlfQotICBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0byBwcmludCB2ZXJib3NlIG1lc3NhZ2VzLgotICBUaGlzIGlzIGluY3JlbWVudGVkIGJ5IHRoZSBcY29kZXstdn0gb3B0aW9uIGlmIGNhbGxlZCBhcyBhIHNjcmlwdC4KLVxlbmR7ZGF0YWRlc2N9Ci0KLQotXGJlZ2lue2RhdGFkZXNjfXtmaWxlbmFtZV9vbmx5fQotICBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0byBwcmludCBvbmx5IHRoZSBmaWxlbmFtZXMgb2YgZmlsZXMKLSAgY29udGFpbmluZyB3aGl0ZXNwYWNlIHJlbGF0ZWQgcHJvYmxlbXMuICBUaGlzIGlzIHNldCB0byB0cnVlIGJ5IHRoZQotICBcY29kZXstcX0gb3B0aW9uIGlmIGNhbGxlZCBhcyBhIHNjcmlwdC4KLVxlbmR7ZGF0YWRlc2N9Ci0KLQotXGJlZ2lue2V4Y2Rlc2N9e05hbm55TmFnfQotICBSYWlzZWQgYnkgXGZ1bmN0aW9ue3Rva2VuZWF0ZXIoKX0gaWYgZGV0ZWN0aW5nIGFuIGFtYmlndW91cyBpbmRlbnQuCi0gIENhcHR1cmVkIGFuZCBoYW5kbGVkIGluIFxmdW5jdGlvbntjaGVjaygpfS4KLVxlbmR7ZXhjZGVzY30KLQotCi1cYmVnaW57ZnVuY2Rlc2N9e3Rva2VuZWF0ZXJ9e3R5cGUsIHRva2VuLCBzdGFydCwgZW5kLCBsaW5lfQotICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgXGZ1bmN0aW9ue2NoZWNrKCl9IGFzIGEgY2FsbGJhY2sgcGFyYW1ldGVyIHRvCi0gIHRoZSBmdW5jdGlvbiBcZnVuY3Rpb257dG9rZW5pemUudG9rZW5pemUoKX0uCi1cZW5ke2Z1bmNkZXNjfQotCi0lIFhYWCBGSVhNRTogRG9jdW1lbnQgXGZ1bmN0aW9ue2VycnByaW50fSwKLSUgICAgXGZ1bmN0aW9ue2Zvcm1hdF93aXRuZXNzZXN9IFxjbGFzc3tXaGl0ZXNwYWNlfQotJSAgICBjaGVja19lcXVhbCwgaW5kZW50cwotJSAgICBcZnVuY3Rpb257cmVzZXRfZ2xvYmFsc30KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWVtb2R1bGV7dG9rZW5pemV9e0xleGljYWwgc2Nhbm5lciBmb3IgUHl0aG9uIHNvdXJjZSBjb2RlLn0KLSAgJSBYWFggbWF5IGJlIGFkZCBhIHJlZmVyZW5jZSB0byBJRExFPwotXGVuZHtzZWVhbHNvfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ0YXJmaWxlLnRleCBiL0RvYy9saWIvbGlidGFyZmlsZS50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZWEwNTEuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJ0YXJmaWxlLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDY2NCArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3RhcmZpbGV9IC0tLSBSZWFkIGFuZCB3cml0ZSB0YXIgYXJjaGl2ZSBmaWxlc30KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e3RhcmZpbGV9Ci1cbW9kdWxlc3lub3BzaXN7UmVhZCBhbmQgd3JpdGUgdGFyLWZvcm1hdCBhcmNoaXZlIGZpbGVzLn0KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotCi1cbW9kdWxlYXV0aG9ye0xhcnMgR3VzdFwiYWJlbH17bGFyc0BndXN0YWViZWwuZGV9Ci1cc2VjdGlvbmF1dGhvcntMYXJzIEd1c3RcImFiZWx9e2xhcnNAZ3VzdGFlYmVsLmRlfQotCi1UaGUgXG1vZHVsZXt0YXJmaWxlfSBtb2R1bGUgbWFrZXMgaXQgcG9zc2libGUgdG8gcmVhZCBhbmQgY3JlYXRlIHRhciBhcmNoaXZlcy4KLVNvbWUgZmFjdHMgYW5kIGZpZ3VyZXM6Ci0KLVxiZWdpbntpdGVtaXplfQotXGl0ZW0gcmVhZHMgYW5kIHdyaXRlcyBcbW9kdWxle2d6aXB9IGFuZCBcbW9kdWxle2J6aXAyfSBjb21wcmVzc2VkIGFyY2hpdmVzLgotXGl0ZW0gcmVhZC93cml0ZSBzdXBwb3J0IGZvciB0aGUgXFBPU0lYe30uMS0xOTg4ICh1c3RhcikgZm9ybWF0LgotXGl0ZW0gcmVhZC93cml0ZSBzdXBwb3J0IGZvciB0aGUgR05VIHRhciBmb3JtYXQgaW5jbHVkaW5nIFxlbXBoe2xvbmduYW1lfSBhbmQKLSAgICAgIFxlbXBoe2xvbmdsaW5rfSBleHRlbnNpb25zLCByZWFkLW9ubHkgc3VwcG9ydCBmb3IgdGhlIFxlbXBoe3NwYXJzZX0KLSAgICAgIGV4dGVuc2lvbi4KLVxpdGVtIHJlYWQvd3JpdGUgc3VwcG9ydCBmb3IgdGhlIFxQT1NJWHt9LjEtMjAwMSAocGF4KSBmb3JtYXQuCi0gICAgICBcdmVyc2lvbmFkZGVkezIuNn0KLVxpdGVtIGhhbmRsZXMgZGlyZWN0b3JpZXMsIHJlZ3VsYXIgZmlsZXMsIGhhcmRsaW5rcywgc3ltYm9saWMgbGlua3MsIGZpZm9zLAotICAgICAgY2hhcmFjdGVyIGRldmljZXMgYW5kIGJsb2NrIGRldmljZXMgYW5kIGlzIGFibGUgdG8gYWNxdWlyZSBhbmQKLSAgICAgIHJlc3RvcmUgZmlsZSBpbmZvcm1hdGlvbiBsaWtlIHRpbWVzdGFtcCwgYWNjZXNzIHBlcm1pc3Npb25zIGFuZCBvd25lci4KLVxpdGVtIGNhbiBoYW5kbGUgdGFwZSBkZXZpY2VzLgotXGVuZHtpdGVtaXplfQotCi1cYmVnaW57ZnVuY2Rlc2N9e29wZW59e25hbWVcb3B0aW9uYWx7LCBtb2RlXG9wdGlvbmFseywKLSAgICAgICAgZmlsZW9ialxvcHRpb25hbHssIGJ1ZnNpemV9fX0sICoqa3dhcmdzfQotICAgIFJldHVybiBhIFxjbGFzc3tUYXJGaWxlfSBvYmplY3QgZm9yIHRoZSBwYXRobmFtZSBcdmFye25hbWV9LgotICAgIEZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiBcY2xhc3N7VGFyRmlsZX0gb2JqZWN0cyBhbmQgdGhlIGtleXdvcmQKLSAgICBhcmd1bWVudHMgdGhhdCBhcmUgYWxsb3dlZCwgc2VlIFxjaXRldGl0bGV7VGFyRmlsZSBPYmplY3RzfQotICAgIChzZWN0aW9uIFxyZWZ7dGFyZmlsZS1vYmplY3RzfSkuCi0KLSAgICBcdmFye21vZGV9IGhhcyB0byBiZSBhIHN0cmluZyBvZiB0aGUgZm9ybSBcY29kZXsnZmlsZW1vZGVbOmNvbXByZXNzaW9uXSd9LAotICAgIGl0IGRlZmF1bHRzIHRvIFxjb2RleydyJ30uIEhlcmUgaXMgYSBmdWxsIGxpc3Qgb2YgbW9kZSBjb21iaW5hdGlvbnM6Ci0KLSAgICBcYmVnaW57dGFibGVpaX17Y3xsfXtjb2RlfXttb2RlfXthY3Rpb259Ci0gICAgXGxpbmVpaXsncicgb3IgJ3I6Kid9e09wZW4gZm9yIHJlYWRpbmcgd2l0aCB0cmFuc3BhcmVudCBjb21wcmVzc2lvbiAocmVjb21tZW5kZWQpLn0KLSAgICBcbGluZWlpeydyOid9e09wZW4gZm9yIHJlYWRpbmcgZXhjbHVzaXZlbHkgd2l0aG91dCBjb21wcmVzc2lvbi59Ci0gICAgXGxpbmVpaXsncjpneid9e09wZW4gZm9yIHJlYWRpbmcgd2l0aCBnemlwIGNvbXByZXNzaW9uLn0KLSAgICBcbGluZWlpeydyOmJ6Mid9e09wZW4gZm9yIHJlYWRpbmcgd2l0aCBiemlwMiBjb21wcmVzc2lvbi59Ci0gICAgXGxpbmVpaXsnYScgb3IgJ2E6J317T3BlbiBmb3IgYXBwZW5kaW5nIHdpdGggbm8gY29tcHJlc3Npb24uIFRoZSBmaWxlCi0gICAgICAgIGlzIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QgZXhpc3QufQotICAgIFxsaW5laWl7J3cnIG9yICd3Oid9e09wZW4gZm9yIHVuY29tcHJlc3NlZCB3cml0aW5nLn0KLSAgICBcbGluZWlpeyd3Omd6J317T3BlbiBmb3IgZ3ppcCBjb21wcmVzc2VkIHdyaXRpbmcufQotICAgIFxsaW5laWl7J3c6YnoyJ317T3BlbiBmb3IgYnppcDIgY29tcHJlc3NlZCB3cml0aW5nLn0KLSAgICBcZW5ke3RhYmxlaWl9Ci0KLSAgICBOb3RlIHRoYXQgXGNvZGV7J2E6Z3onfSBvciBcY29kZXsnYTpiejInfSBpcyBub3QgcG9zc2libGUuCi0gICAgSWYgXHZhcnttb2RlfSBpcyBub3Qgc3VpdGFibGUgdG8gb3BlbiBhIGNlcnRhaW4gKGNvbXByZXNzZWQpIGZpbGUgZm9yCi0gICAgcmVhZGluZywgXGV4Y2VwdGlvbntSZWFkRXJyb3J9IGlzIHJhaXNlZC4gVXNlIFx2YXJ7bW9kZX0gXGNvZGV7J3InfSB0bwotICAgIGF2b2lkIHRoaXMuICBJZiBhIGNvbXByZXNzaW9uIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkLAotICAgIFxleGNlcHRpb257Q29tcHJlc3Npb25FcnJvcn0gaXMgcmFpc2VkLgotCi0gICAgSWYgXHZhcntmaWxlb2JqfSBpcyBzcGVjaWZpZWQsIGl0IGlzIHVzZWQgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gYSBmaWxlCi0gICAgb2JqZWN0IG9wZW5lZCBmb3IgXHZhcntuYW1lfS4gSXQgaXMgc3VwcG9zZWQgdG8gYmUgYXQgcG9zaXRpb24gMC4KLQotICAgIEZvciBzcGVjaWFsIHB1cnBvc2VzLCB0aGVyZSBpcyBhIHNlY29uZCBmb3JtYXQgZm9yIFx2YXJ7bW9kZX06Ci0gICAgXGNvZGV7J2ZpbGVtb2RlfFtjb21wcmVzc2lvbl0nfS4gIFxmdW5jdGlvbntvcGVuKCl9IHdpbGwgcmV0dXJuIGEKLSAgICBcY2xhc3N7VGFyRmlsZX0gb2JqZWN0IHRoYXQgcHJvY2Vzc2VzIGl0cyBkYXRhIGFzIGEgc3RyZWFtIG9mCi0gICAgYmxvY2tzLiAgTm8gcmFuZG9tIHNlZWtpbmcgd2lsbCBiZSBkb25lIG9uIHRoZSBmaWxlLiBJZiBnaXZlbiwKLSAgICBcdmFye2ZpbGVvYmp9IG1heSBiZSBhbnkgb2JqZWN0IHRoYXQgaGFzIGEgXG1ldGhvZHtyZWFkKCl9IG9yCi0gICAgXG1ldGhvZHt3cml0ZSgpfSBtZXRob2QgKGRlcGVuZGluZyBvbiB0aGUgXHZhcnttb2RlfSkuCi0gICAgXHZhcntidWZzaXplfSBzcGVjaWZpZXMgdGhlIGJsb2Nrc2l6ZSBhbmQgZGVmYXVsdHMgdG8gXGNvZGV7MjAgKgotICAgIDUxMn0gYnl0ZXMuIFVzZSB0aGlzIHZhcmlhbnQgaW4gY29tYmluYXRpb24gd2l0aAotICAgIGUuZy4gXGNvZGV7c3lzLnN0ZGlufSwgYSBzb2NrZXQgZmlsZSBvYmplY3Qgb3IgYSB0YXBlIGRldmljZS4KLSAgICBIb3dldmVyLCBzdWNoIGEgXGNsYXNze1RhckZpbGV9IG9iamVjdCBpcyBsaW1pdGVkIGluIHRoYXQgaXQgZG9lcwotICAgIG5vdCBhbGxvdyB0byBiZSBhY2Nlc3NlZCByYW5kb21seSwgc2VlIGBgRXhhbXBsZXMnJwotICAgIChzZWN0aW9uflxyZWZ7dGFyLWV4YW1wbGVzfSkuICBUaGUgY3VycmVudGx5IHBvc3NpYmxlIG1vZGVzOgotCi0gICAgXGJlZ2lue3RhYmxlaWl9e2N8bH17Y29kZX17TW9kZX17QWN0aW9ufQotICAgIFxsaW5laWl7J3J8Kid9e09wZW4gYSBcZW1waHtzdHJlYW19IG9mIHRhciBibG9ja3MgZm9yIHJlYWRpbmcgd2l0aCB0cmFuc3BhcmVudCBjb21wcmVzc2lvbi59Ci0gICAgXGxpbmVpaXsncnwnfXtPcGVuIGEgXGVtcGh7c3RyZWFtfSBvZiB1bmNvbXByZXNzZWQgdGFyIGJsb2NrcyBmb3IgcmVhZGluZy59Ci0gICAgXGxpbmVpaXsncnxneid9e09wZW4gYSBnemlwIGNvbXByZXNzZWQgXGVtcGh7c3RyZWFtfSBmb3IgcmVhZGluZy59Ci0gICAgXGxpbmVpaXsncnxiejInfXtPcGVuIGEgYnppcDIgY29tcHJlc3NlZCBcZW1waHtzdHJlYW19IGZvciByZWFkaW5nLn0KLSAgICBcbGluZWlpeyd3fCd9e09wZW4gYW4gdW5jb21wcmVzc2VkIFxlbXBoe3N0cmVhbX0gZm9yIHdyaXRpbmcufQotICAgIFxsaW5laWl7J3d8Z3onfXtPcGVuIGFuIGd6aXAgY29tcHJlc3NlZCBcZW1waHtzdHJlYW19IGZvciB3cml0aW5nLn0KLSAgICBcbGluZWlpeyd3fGJ6Mid9e09wZW4gYW4gYnppcDIgY29tcHJlc3NlZCBcZW1waHtzdHJlYW19IGZvciB3cml0aW5nLn0KLSAgICBcZW5ke3RhYmxlaWl9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjKn17VGFyRmlsZX0KLSAgICBDbGFzcyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyB0YXIgYXJjaGl2ZXMuIERvIG5vdCB1c2UgdGhpcwotICAgIGNsYXNzIGRpcmVjdGx5LCBiZXR0ZXIgdXNlIFxmdW5jdGlvbntvcGVuKCl9IGluc3RlYWQuCi0gICAgU2VlIGBgVGFyRmlsZSBPYmplY3RzJycgKHNlY3Rpb25+XHJlZnt0YXJmaWxlLW9iamVjdHN9KS4KLVxlbmR7Y2xhc3NkZXNjKn0KLQotXGJlZ2lue2Z1bmNkZXNjfXtpc190YXJmaWxlfXtuYW1lfQotICAgIFJldHVybiBcY29uc3RhbnR7VHJ1ZX0gaWYgXHZhcntuYW1lfSBpcyBhIHRhciBhcmNoaXZlIGZpbGUsIHRoYXQKLSAgICB0aGUgXG1vZHVsZXt0YXJmaWxlfSBtb2R1bGUgY2FuIHJlYWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtUYXJGaWxlQ29tcGF0fXtmaWxlbmFtZVxvcHRpb25hbHssIG1vZGVcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb259fX0KLSAgICBDbGFzcyBmb3IgbGltaXRlZCBhY2Nlc3MgdG8gdGFyIGFyY2hpdmVzIHdpdGggYQotICAgIFxyZWZtb2R1bGV7emlwZmlsZX0tbGlrZSBpbnRlcmZhY2UuIFBsZWFzZSBjb25zdWx0IHRoZQotICAgIGRvY3VtZW50YXRpb24gb2YgdGhlIFxyZWZtb2R1bGV7emlwZmlsZX0gbW9kdWxlIGZvciBtb3JlIGRldGFpbHMuCi0gICAgXHZhcntjb21wcmVzc2lvbn0gbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25zdGFudHM6Ci0gICAgXGJlZ2lue2RhdGFkZXNjfXtUQVJfUExBSU59Ci0gICAgICAgIENvbnN0YW50IGZvciBhbiB1bmNvbXByZXNzZWQgdGFyIGFyY2hpdmUuCi0gICAgXGVuZHtkYXRhZGVzY30KLSAgICBcYmVnaW57ZGF0YWRlc2N9e1RBUl9HWklQUEVEfQotICAgICAgICBDb25zdGFudCBmb3IgYSBccmVmbW9kdWxle2d6aXB9IGNvbXByZXNzZWQgdGFyIGFyY2hpdmUuCi0gICAgXGVuZHtkYXRhZGVzY30KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317VGFyRXJyb3J9Ci0gICAgQmFzZSBjbGFzcyBmb3IgYWxsIFxtb2R1bGV7dGFyZmlsZX0gZXhjZXB0aW9ucy4KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e1JlYWRFcnJvcn0KLSAgICBJcyByYWlzZWQgd2hlbiBhIHRhciBhcmNoaXZlIGlzIG9wZW5lZCwgdGhhdCBlaXRoZXIgY2Fubm90IGJlIGhhbmRsZWQgYnkKLSAgICB0aGUgXG1vZHVsZXt0YXJmaWxlfSBtb2R1bGUgb3IgaXMgc29tZWhvdyBpbnZhbGlkLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317Q29tcHJlc3Npb25FcnJvcn0KLSAgICBJcyByYWlzZWQgd2hlbiBhIGNvbXByZXNzaW9uIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIG9yIHdoZW4gdGhlIGRhdGEKLSAgICBjYW5ub3QgYmUgZGVjb2RlZCBwcm9wZXJseS4KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e1N0cmVhbUVycm9yfQotICAgIElzIHJhaXNlZCBmb3IgdGhlIGxpbWl0YXRpb25zIHRoYXQgYXJlIHR5cGljYWwgZm9yIHN0cmVhbS1saWtlCi0gICAgXGNsYXNze1RhckZpbGV9IG9iamVjdHMuCi1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtFeHRyYWN0RXJyb3J9Ci0gICAgSXMgcmFpc2VkIGZvciBcZW1waHtub24tZmF0YWx9IGVycm9ycyB3aGVuIHVzaW5nIFxtZXRob2R7ZXh0cmFjdCgpfSwgYnV0Ci0gICAgb25seSBpZiBcbWVtYmVye1RhckZpbGUuZXJyb3JsZXZlbH1cY29kZXsgPT0gMn0uCi1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtIZWFkZXJFcnJvcn0KLSAgICBJcyByYWlzZWQgYnkgXG1ldGhvZHtmcm9tYnVmKCl9IGlmIHRoZSBidWZmZXIgaXQgZ2V0cyBpcyBpbnZhbGlkLgotICAgIFx2ZXJzaW9uYWRkZWR7Mi42fQotXGVuZHtleGNkZXNjfQotCi1FYWNoIG9mIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIGRlZmluZXMgYSB0YXIgYXJjaGl2ZSBmb3JtYXQgdGhhdCB0aGUKLVxtb2R1bGV7dGFyZmlsZX0gbW9kdWxlIGlzIGFibGUgdG8gY3JlYXRlLiBTZWUgc2VjdGlvbiBccmVme3Rhci1mb3JtYXRzfSBmb3IKLWRldGFpbHMuCi0KLVxiZWdpbntkYXRhZGVzY317VVNUQVJfRk9STUFUfQotICAgIFxQT1NJWHt9LjEtMTk4OCAodXN0YXIpIGZvcm1hdC4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317R05VX0ZPUk1BVH0KLSAgICBHTlUgdGFyIGZvcm1hdC4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317UEFYX0ZPUk1BVH0KLSAgICBcUE9TSVh7fS4xLTIwMDEgKHBheCkgZm9ybWF0LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtERUZBVUxUX0ZPUk1BVH0KLSAgICBUaGUgZGVmYXVsdCBmb3JtYXQgZm9yIGNyZWF0aW5nIGFyY2hpdmVzLiBUaGlzIGlzIGN1cnJlbnRseQotICAgIFxjb25zdGFudHtHTlVfRk9STUFUfS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntzZWVhbHNvfQotICAgIFxzZWVtb2R1bGV7emlwZmlsZX17RG9jdW1lbnRhdGlvbiBvZiB0aGUgXHJlZm1vZHVsZXt6aXBmaWxlfQotICAgIHN0YW5kYXJkIG1vZHVsZS59Ci0KLSAgICBcc2VldGl0bGVbaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL3Rhci9tYW51YWwvaHRtbF9ub2RlL3Rhcl8xMzQuaHRtbFwjU0VDMTM0XQotICAgIHtHTlUgdGFyIG1hbnVhbCwgQmFzaWMgVGFyIEZvcm1hdH17RG9jdW1lbnRhdGlvbiBmb3IgdGFyIGFyY2hpdmUgZmlsZXMsCi0gICAgaW5jbHVkaW5nIEdOVSB0YXIgZXh0ZW5zaW9ucy59Ci1cZW5ke3NlZWFsc299Ci0KLSUtLS0tLS0tLS0tLS0tLS0tLQotJSBUYXJGaWxlIE9iamVjdHMKLSUtLS0tLS0tLS0tLS0tLS0tLQotCi1cc3Vic2VjdGlvbntUYXJGaWxlIE9iamVjdHMgXGxhYmVse3RhcmZpbGUtb2JqZWN0c319Ci0KLVRoZSBcY2xhc3N7VGFyRmlsZX0gb2JqZWN0IHByb3ZpZGVzIGFuIGludGVyZmFjZSB0byBhIHRhciBhcmNoaXZlLiBBIHRhcgotYXJjaGl2ZSBpcyBhIHNlcXVlbmNlIG9mIGJsb2Nrcy4gQW4gYXJjaGl2ZSBtZW1iZXIgKGEgc3RvcmVkIGZpbGUpIGlzIG1hZGUgdXAKLW9mIGEgaGVhZGVyIGJsb2NrIGZvbGxvd2VkIGJ5IGRhdGEgYmxvY2tzLiBJdCBpcyBwb3NzaWJsZSB0byBzdG9yZSBhIGZpbGUgaW4gYQotdGFyIGFyY2hpdmUgc2V2ZXJhbCB0aW1lcy4gRWFjaCBhcmNoaXZlIG1lbWJlciBpcyByZXByZXNlbnRlZCBieSBhCi1cY2xhc3N7VGFySW5mb30gb2JqZWN0LCBzZWUgXGNpdGV0aXRsZXtUYXJJbmZvIE9iamVjdHN9IChzZWN0aW9uCi1ccmVme3RhcmluZm8tb2JqZWN0c30pIGZvciBkZXRhaWxzLgotCi1cYmVnaW57Y2xhc3NkZXNjfXtUYXJGaWxlfXtuYW1lPU5vbmUsIG1vZGU9J3InLCBmaWxlb2JqPU5vbmUsCi0gICAgICAgIGZvcm1hdD1ERUZBVUxUX0ZPUk1BVCwgdGFyaW5mbz1UYXJJbmZvLCBkZXJlZmVyZW5jZT1GYWxzZSwKLSAgICAgICAgaWdub3JlX3plcm9zPUZhbHNlLCBlbmNvZGluZz1Ob25lLCBlcnJvcnM9Tm9uZSwgcGF4X2hlYWRlcnM9Tm9uZSwKLSAgICAgICAgZGVidWc9MCwgZXJyb3JsZXZlbD0wfQotCi0gICAgQWxsIGZvbGxvd2luZyBhcmd1bWVudHMgYXJlIG9wdGlvbmFsIGFuZCBjYW4gYmUgYWNjZXNzZWQgYXMgaW5zdGFuY2UKLSAgICBhdHRyaWJ1dGVzIGFzIHdlbGwuCi0KLSAgICBcdmFye25hbWV9IGlzIHRoZSBwYXRobmFtZSBvZiB0aGUgYXJjaGl2ZS4gSXQgY2FuIGJlIG9taXR0ZWQgaWYKLSAgICBcdmFye2ZpbGVvYmp9IGlzIGdpdmVuLiBJbiB0aGlzIGNhc2UsIHRoZSBmaWxlIG9iamVjdCdzIFxtZW1iZXJ7bmFtZX0KLSAgICBhdHRyaWJ1dGUgaXMgdXNlZCBpZiBpdCBleGlzdHMuCi0KLSAgICBcdmFye21vZGV9IGlzIGVpdGhlciBcY29kZXsncid9IHRvIHJlYWQgZnJvbSBhbiBleGlzdGluZyBhcmNoaXZlLAotICAgIFxjb2RleydhJ30gdG8gYXBwZW5kIGRhdGEgdG8gYW4gZXhpc3RpbmcgZmlsZSBvciBcY29kZXsndyd9IHRvIGNyZWF0ZSBhIG5ldwotICAgIGZpbGUgb3ZlcndyaXRpbmcgYW4gZXhpc3Rpbmcgb25lLgotCi0gICAgSWYgXHZhcntmaWxlb2JqfSBpcyBnaXZlbiwgaXQgaXMgdXNlZCBmb3IgcmVhZGluZyBvciB3cml0aW5nIGRhdGEuCi0gICAgSWYgaXQgY2FuIGJlIGRldGVybWluZWQsIFx2YXJ7bW9kZX0gaXMgb3ZlcnJpZGRlbiBieSBcdmFye2ZpbGVvYmp9J3MgbW9kZS4KLSAgICBcdmFye2ZpbGVvYmp9IHdpbGwgYmUgdXNlZCBmcm9tIHBvc2l0aW9uIDAuCi0gICAgXGJlZ2lue25vdGljZX0KLSAgICAgICAgXHZhcntmaWxlb2JqfSBpcyBub3QgY2xvc2VkLCB3aGVuIFxjbGFzc3tUYXJGaWxlfSBpcyBjbG9zZWQuCi0gICAgXGVuZHtub3RpY2V9Ci0KLSAgICBcdmFye2Zvcm1hdH0gY29udHJvbHMgdGhlIGFyY2hpdmUgZm9ybWF0LiBJdCBtdXN0IGJlIG9uZSBvZiB0aGUgY29uc3RhbnRzCi0gICAgXGNvbnN0YW50e1VTVEFSX0ZPUk1BVH0sIFxjb25zdGFudHtHTlVfRk9STUFUfSBvciBcY29uc3RhbnR7UEFYX0ZPUk1BVH0KLSAgICB0aGF0IGFyZSBkZWZpbmVkIGF0IG1vZHVsZSBsZXZlbC4KLSAgICBcdmVyc2lvbmFkZGVkezIuNn0KLQotICAgIFRoZSBcdmFye3RhcmluZm99IGFyZ3VtZW50IGNhbiBiZSB1c2VkIHRvIHJlcGxhY2UgdGhlIGRlZmF1bHQKLSAgICBcY2xhc3N7VGFySW5mb30gY2xhc3Mgd2l0aCBhIGRpZmZlcmVudCBvbmUuCi0gICAgXHZlcnNpb25hZGRlZHsyLjZ9Ci0KLSAgICBJZiBcdmFye2RlcmVmZXJlbmNlfSBpcyBcY29kZXtGYWxzZX0sIGFkZCBzeW1ib2xpYyBhbmQgaGFyZCBsaW5rcyB0byB0aGUKLSAgICBhcmNoaXZlLiBJZiBpdCBpcyBcY29kZXtUcnVlfSwgYWRkIHRoZSBjb250ZW50IG9mIHRoZSB0YXJnZXQgZmlsZXMgdG8gdGhlCi0gICAgYXJjaGl2ZS4gVGhpcyBoYXMgbm8gZWZmZWN0IG9uIHN5c3RlbXMgdGhhdCBkbyBub3Qgc3VwcG9ydCBzeW1ib2xpYyBsaW5rcy4KLQotICAgIElmIFx2YXJ7aWdub3JlX3plcm9zfSBpcyBcY29kZXtGYWxzZX0sIHRyZWF0IGFuIGVtcHR5IGJsb2NrIGFzIHRoZSBlbmQgb2YKLSAgICB0aGUgYXJjaGl2ZS4gSWYgaXQgaXMgXHZhcntUcnVlfSwgc2tpcCBlbXB0eSAoYW5kIGludmFsaWQpIGJsb2NrcyBhbmQgdHJ5Ci0gICAgdG8gZ2V0IGFzIG1hbnkgbWVtYmVycyBhcyBwb3NzaWJsZS4gVGhpcyBpcyBvbmx5IHVzZWZ1bCBmb3IgcmVhZGluZwotICAgIGNvbmNhdGVuYXRlZCBvciBkYW1hZ2VkIGFyY2hpdmVzLgotCi0gICAgXHZhcntkZWJ1Z30gY2FuIGJlIHNldCBmcm9tIFxjb2RlezB9IChubyBkZWJ1ZyBtZXNzYWdlcykgdXAgdG8gXGNvZGV7M30KLSAgICAoYWxsIGRlYnVnIG1lc3NhZ2VzKS4gVGhlIG1lc3NhZ2VzIGFyZSB3cml0dGVuIHRvIFxjb2Rle3N5cy5zdGRlcnJ9LgotCi0gICAgSWYgXHZhcntlcnJvcmxldmVsfSBpcyBcY29kZXswfSwgYWxsIGVycm9ycyBhcmUgaWdub3JlZCB3aGVuIHVzaW5nCi0gICAgXG1ldGhvZHtleHRyYWN0KCl9LiAgTmV2ZXJ0aGVsZXNzLCB0aGV5IGFwcGVhciBhcyBlcnJvciBtZXNzYWdlcyBpbiB0aGUKLSAgICBkZWJ1ZyBvdXRwdXQsIHdoZW4gZGVidWdnaW5nIGlzIGVuYWJsZWQuICBJZiBcY29kZXsxfSwgYWxsIFxlbXBoe2ZhdGFsfQotICAgIGVycm9ycyBhcmUgcmFpc2VkIGFzIFxleGNlcHRpb257T1NFcnJvcn0gb3IgXGV4Y2VwdGlvbntJT0Vycm9yfSBleGNlcHRpb25zLgotICAgIElmIFxjb2RlezJ9LCBhbGwgXGVtcGh7bm9uLWZhdGFsfSBlcnJvcnMgYXJlIHJhaXNlZCBhcyBcZXhjZXB0aW9ue1RhckVycm9yfQotICAgIGV4Y2VwdGlvbnMgYXMgd2VsbC4KLQotICAgIFRoZSBcdmFye2VuY29kaW5nfSBhbmQgXHZhcntlcnJvcnN9IGFyZ3VtZW50cyBjb250cm9sIHRoZSB3YXkgc3RyaW5ncyBhcmUKLSAgICBjb252ZXJ0ZWQgdG8gdW5pY29kZSBvYmplY3RzIGFuZCB2aWNlIHZlcnNhLiBUaGUgZGVmYXVsdCBzZXR0aW5ncyB3aWxsIHdvcmsKLSAgICBmb3IgbW9zdCB1c2Vycy4gU2VlIHNlY3Rpb24gXHJlZnt0YXItdW5pY29kZX0gZm9yIGluLWRlcHRoIGluZm9ybWF0aW9uLgotICAgIFx2ZXJzaW9uYWRkZWR7Mi42fQotCi0gICAgVGhlIFx2YXJ7cGF4X2hlYWRlcnN9IGFyZ3VtZW50IGlzIGFuIG9wdGlvbmFsIGRpY3Rpb25hcnkgb2YgdW5pY29kZSBzdHJpbmdzCi0gICAgd2hpY2ggd2lsbCBiZSBhZGRlZCBhcyBhIHBheCBnbG9iYWwgaGVhZGVyIGlmIFx2YXJ7Zm9ybWF0fSBpcwotICAgIFxjb25zdGFudHtQQVhfRk9STUFUfS4KLSAgICBcdmVyc2lvbmFkZGVkezIuNn0KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317b3Blbn17Li4ufQotICAgIEFsdGVybmF0aXZlIGNvbnN0cnVjdG9yLiBUaGUgXGZ1bmN0aW9ue29wZW4oKX0gZnVuY3Rpb24gb24gbW9kdWxlIGxldmVsIGlzCi0gICAgYWN0dWFsbHkgYSBzaG9ydGN1dCB0byB0aGlzIGNsYXNzbWV0aG9kLiBTZWUgc2VjdGlvbn5ccmVme21vZHVsZS10YXJmaWxlfQotICAgIGZvciBkZXRhaWxzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Z2V0bWVtYmVyfXtuYW1lfQotICAgIFJldHVybiBhIFxjbGFzc3tUYXJJbmZvfSBvYmplY3QgZm9yIG1lbWJlciBcdmFye25hbWV9LiBJZiBcdmFye25hbWV9IGNhbgotICAgIG5vdCBiZSBmb3VuZCBpbiB0aGUgYXJjaGl2ZSwgXGV4Y2VwdGlvbntLZXlFcnJvcn0gaXMgcmFpc2VkLgotICAgIFxiZWdpbntub3RpY2V9Ci0gICAgICAgIElmIGEgbWVtYmVyIG9jY3VycyBtb3JlIHRoYW4gb25jZSBpbiB0aGUgYXJjaGl2ZSwgaXRzIGxhc3QKLSAgICAgICAgb2NjdXJyZW5jZSBpcyBhc3N1bWVkIHRvIGJlIHRoZSBtb3N0IHVwLXRvLWRhdGUgdmVyc2lvbi4KLSAgICBcZW5ke25vdGljZX0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2dldG1lbWJlcnN9e30KLSAgICBSZXR1cm4gdGhlIG1lbWJlcnMgb2YgdGhlIGFyY2hpdmUgYXMgYSBsaXN0IG9mIFxjbGFzc3tUYXJJbmZvfSBvYmplY3RzLgotICAgIFRoZSBsaXN0IGhhcyB0aGUgc2FtZSBvcmRlciBhcyB0aGUgbWVtYmVycyBpbiB0aGUgYXJjaGl2ZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2dldG5hbWVzfXt9Ci0gICAgUmV0dXJuIHRoZSBtZW1iZXJzIGFzIGEgbGlzdCBvZiB0aGVpciBuYW1lcy4gSXQgaGFzIHRoZSBzYW1lIG9yZGVyIGFzCi0gICAgdGhlIGxpc3QgcmV0dXJuZWQgYnkgXG1ldGhvZHtnZXRtZW1iZXJzKCl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317bGlzdH17dmVyYm9zZT1UcnVlfQotICAgIFByaW50IGEgdGFibGUgb2YgY29udGVudHMgdG8gXGNvZGV7c3lzLnN0ZG91dH0uIElmIFx2YXJ7dmVyYm9zZX0gaXMKLSAgICBcY29uc3RhbnR7RmFsc2V9LCBvbmx5IHRoZSBuYW1lcyBvZiB0aGUgbWVtYmVycyBhcmUgcHJpbnRlZC4gSWYgaXQgaXMKLSAgICBcY29uc3RhbnR7VHJ1ZX0sIG91dHB1dCBzaW1pbGFyIHRvIHRoYXQgb2YgXHByb2dyYW17bHMgLWx9IGlzIHByb2R1Y2VkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317bmV4dH17fQotICAgIFJldHVybiB0aGUgbmV4dCBtZW1iZXIgb2YgdGhlIGFyY2hpdmUgYXMgYSBcY2xhc3N7VGFySW5mb30gb2JqZWN0LCB3aGVuCi0gICAgXGNsYXNze1RhckZpbGV9IGlzIG9wZW5lZCBmb3IgcmVhZGluZy4gUmV0dXJuIFxjb2Rle05vbmV9IGlmIHRoZXJlIGlzIG5vCi0gICAgbW9yZSBhdmFpbGFibGUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtleHRyYWN0YWxsfXtcb3B0aW9uYWx7cGF0aFxvcHRpb25hbHssIG1lbWJlcnN9fX0KLSAgICBFeHRyYWN0IGFsbCBtZW1iZXJzIGZyb20gdGhlIGFyY2hpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkKLSAgICBvciBkaXJlY3RvcnkgXHZhcntwYXRofS4gSWYgb3B0aW9uYWwgXHZhcnttZW1iZXJzfSBpcyBnaXZlbiwgaXQgbXVzdCBiZQotICAgIGEgc3Vic2V0IG9mIHRoZSBsaXN0IHJldHVybmVkIGJ5IFxtZXRob2R7Z2V0bWVtYmVycygpfS4KLSAgICBEaXJlY3RvcnkgaW5mb3JtYXRpb24gbGlrZSBvd25lciwgbW9kaWZpY2F0aW9uIHRpbWUgYW5kIHBlcm1pc3Npb25zIGFyZQotICAgIHNldCBhZnRlciBhbGwgbWVtYmVycyBoYXZlIGJlZW4gZXh0cmFjdGVkLiBUaGlzIGlzIGRvbmUgdG8gd29yayBhcm91bmQgdHdvCi0gICAgcHJvYmxlbXM6IEEgZGlyZWN0b3J5J3MgbW9kaWZpY2F0aW9uIHRpbWUgaXMgcmVzZXQgZWFjaCB0aW1lIGEgZmlsZSBpcwotICAgIGNyZWF0ZWQgaW4gaXQuIEFuZCwgaWYgYSBkaXJlY3RvcnkncyBwZXJtaXNzaW9ucyBkbyBub3QgYWxsb3cgd3JpdGluZywKLSAgICBleHRyYWN0aW5nIGZpbGVzIHRvIGl0IHdpbGwgZmFpbC4KLSAgICBcdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2V4dHJhY3R9e21lbWJlclxvcHRpb25hbHssIHBhdGh9fQotICAgIEV4dHJhY3QgYSBtZW1iZXIgZnJvbSB0aGUgYXJjaGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwKLSAgICB1c2luZyBpdHMgZnVsbCBuYW1lLiBJdHMgZmlsZSBpbmZvcm1hdGlvbiBpcyBleHRyYWN0ZWQgYXMgYWNjdXJhdGVseSBhcwotICAgIHBvc3NpYmxlLgotICAgIFx2YXJ7bWVtYmVyfSBtYXkgYmUgYSBmaWxlbmFtZSBvciBhIFxjbGFzc3tUYXJJbmZvfSBvYmplY3QuCi0gICAgWW91IGNhbiBzcGVjaWZ5IGEgZGlmZmVyZW50IGRpcmVjdG9yeSB1c2luZyBcdmFye3BhdGh9LgotICAgIFxiZWdpbntub3RpY2V9Ci0gICAgQmVjYXVzZSB0aGUgXG1ldGhvZHtleHRyYWN0KCl9IG1ldGhvZCBhbGxvd3MgcmFuZG9tIGFjY2VzcyB0byBhIHRhcgotICAgIGFyY2hpdmUgdGhlcmUgYXJlIHNvbWUgaXNzdWVzIHlvdSBtdXN0IHRha2UgY2FyZSBvZiB5b3Vyc2VsZi4gU2VlIHRoZQotICAgIGRlc2NyaXB0aW9uIGZvciBcbWV0aG9ke2V4dHJhY3RhbGwoKX0gYWJvdmUuCi0gICAgXGVuZHtub3RpY2V9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtleHRyYWN0ZmlsZX17bWVtYmVyfQotICAgIEV4dHJhY3QgYSBtZW1iZXIgZnJvbSB0aGUgYXJjaGl2ZSBhcyBhIGZpbGUgb2JqZWN0LgotICAgIFx2YXJ7bWVtYmVyfSBtYXkgYmUgYSBmaWxlbmFtZSBvciBhIFxjbGFzc3tUYXJJbmZvfSBvYmplY3QuCi0gICAgSWYgXHZhcnttZW1iZXJ9IGlzIGEgcmVndWxhciBmaWxlLCBhIGZpbGUtbGlrZSBvYmplY3QgaXMgcmV0dXJuZWQuCi0gICAgSWYgXHZhcnttZW1iZXJ9IGlzIGEgbGluaywgYSBmaWxlLWxpa2Ugb2JqZWN0IGlzIGNvbnN0cnVjdGVkIGZyb20gdGhlCi0gICAgbGluaydzIHRhcmdldC4KLSAgICBJZiBcdmFye21lbWJlcn0gaXMgbm9uZSBvZiB0aGUgYWJvdmUsIFxjb2Rle05vbmV9IGlzIHJldHVybmVkLgotICAgIFxiZWdpbntub3RpY2V9Ci0gICAgICAgIFRoZSBmaWxlLWxpa2Ugb2JqZWN0IGlzIHJlYWQtb25seSBhbmQgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotICAgICAgICBcbWV0aG9ke3JlYWQoKX0sIFxtZXRob2R7cmVhZGxpbmUoKX0sIFxtZXRob2R7cmVhZGxpbmVzKCl9LAotICAgICAgICBcbWV0aG9ke3NlZWsoKX0sIFxtZXRob2R7dGVsbCgpfS4KLSAgICBcZW5ke25vdGljZX0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2FkZH17bmFtZVxvcHRpb25hbHssIGFyY25hbWVcb3B0aW9uYWx7LCByZWN1cnNpdmVcb3B0aW9uYWx7LCBleGNsdWRlfX19fQotICAgIEFkZCB0aGUgZmlsZSBcdmFye25hbWV9IHRvIHRoZSBhcmNoaXZlLiBcdmFye25hbWV9IG1heSBiZSBhbnkgdHlwZQotICAgIG9mIGZpbGUgKGRpcmVjdG9yeSwgZmlmbywgc3ltYm9saWMgbGluaywgZXRjLikuCi0gICAgSWYgZ2l2ZW4sIFx2YXJ7YXJjbmFtZX0gc3BlY2lmaWVzIGFuIGFsdGVybmF0aXZlIG5hbWUgZm9yIHRoZSBmaWxlIGluIHRoZQotICAgIGFyY2hpdmUuIERpcmVjdG9yaWVzIGFyZSBhZGRlZCByZWN1cnNpdmVseSBieSBkZWZhdWx0LgotICAgIFRoaXMgY2FuIGJlIGF2b2lkZWQgYnkgc2V0dGluZyBcdmFye3JlY3Vyc2l2ZX0gdG8gXGNvbnN0YW50e0ZhbHNlfS4KLSAgICBJZiBcdmFye2V4Y2x1ZGV9IGlzIGdpdmVuIGl0IG11c3QgYmUgYSBmdW5jdGlvbiB0aGF0IHRha2VzIG9uZSBmaWxlbmFtZQotICAgIGFyZ3VtZW50IGFuZCByZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZS4gRGVwZW5kaW5nIG9uIHRoaXMgdmFsdWUgdGhlCi0gICAgcmVzcGVjdGl2ZSBmaWxlIGlzIGVpdGhlciBleGNsdWRlZCAoXGNvbnN0YW50e1RydWV9KSBvciBhZGRlZAotICAgIChcY29uc3RhbnR7RmFsc2V9KS4KLSAgICBcdmVyc2lvbmNoYW5nZWRbQWRkZWQgdGhlIFx2YXJ7ZXhjbHVkZX0gcGFyYW1ldGVyXXsyLjZ9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXthZGRmaWxlfXt0YXJpbmZvXG9wdGlvbmFseywgZmlsZW9ian19Ci0gICAgQWRkIHRoZSBcY2xhc3N7VGFySW5mb30gb2JqZWN0IFx2YXJ7dGFyaW5mb30gdG8gdGhlIGFyY2hpdmUuCi0gICAgSWYgXHZhcntmaWxlb2JqfSBpcyBnaXZlbiwgXGNvZGV7XHZhcnt0YXJpbmZvfS5zaXplfSBieXRlcyBhcmUgcmVhZAotICAgIGZyb20gaXQgYW5kIGFkZGVkIHRvIHRoZSBhcmNoaXZlLiAgWW91IGNhbiBjcmVhdGUgXGNsYXNze1RhckluZm99IG9iamVjdHMKLSAgICB1c2luZyBcbWV0aG9ke2dldHRhcmluZm8oKX0uCi0gICAgXGJlZ2lue25vdGljZX0KLSAgICBPbiBXaW5kb3dzIHBsYXRmb3JtcywgXHZhcntmaWxlb2JqfSBzaG91bGQgYWx3YXlzIGJlIG9wZW5lZCB3aXRoIG1vZGUKLSAgICBcY29kZXsncmInfSB0byBhdm9pZCBpcnJpdGF0aW9uIGFib3V0IHRoZSBmaWxlIHNpemUuCi0gICAgXGVuZHtub3RpY2V9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtnZXR0YXJpbmZvfXtcb3B0aW9uYWx7bmFtZVxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJjbmFtZVxvcHRpb25hbHssIGZpbGVvYmp9fX19Ci0gICAgQ3JlYXRlIGEgXGNsYXNze1RhckluZm99IG9iamVjdCBmb3IgZWl0aGVyIHRoZSBmaWxlIFx2YXJ7bmFtZX0gb3IKLSAgICB0aGUgZmlsZSBvYmplY3QgXHZhcntmaWxlb2JqfSAodXNpbmcgXGZ1bmN0aW9ue29zLmZzdGF0KCl9IG9uIGl0cwotICAgIGZpbGUgZGVzY3JpcHRvcikuICBZb3UgY2FuIG1vZGlmeSBzb21lIG9mIHRoZSBcY2xhc3N7VGFySW5mb30ncwotICAgIGF0dHJpYnV0ZXMgYmVmb3JlIHlvdSBhZGQgaXQgdXNpbmcgXG1ldGhvZHthZGRmaWxlKCl9LiAgSWYgZ2l2ZW4sCi0gICAgXHZhcnthcmNuYW1lfSBzcGVjaWZpZXMgYW4gYWx0ZXJuYXRpdmUgbmFtZSBmb3IgdGhlIGZpbGUgaW4gdGhlCi0gICAgYXJjaGl2ZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2Nsb3NlfXt9Ci0gICAgQ2xvc2UgdGhlIFxjbGFzc3tUYXJGaWxlfS4gSW4gd3JpdGUgbW9kZSwgdHdvIGZpbmlzaGluZyB6ZXJvCi0gICAgYmxvY2tzIGFyZSBhcHBlbmRlZCB0byB0aGUgYXJjaGl2ZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9e3Bvc2l4fQotICAgIFNldHRpbmcgdGhpcyB0byBcY29uc3RhbnR7VHJ1ZX0gaXMgZXF1aXZhbGVudCB0byBzZXR0aW5nIHRoZQotICAgIFxtZW1iZXJ7Zm9ybWF0fSBhdHRyaWJ1dGUgdG8gXGNvbnN0YW50e1VTVEFSX0ZPUk1BVH0sCi0gICAgXGNvbnN0YW50e0ZhbHNlfSBpcyBlcXVpdmFsZW50IHRvIFxjb25zdGFudHtHTlVfRk9STUFUfS4KLSAgICBcdmVyc2lvbmNoYW5nZWRbXHZhcntwb3NpeH0gZGVmYXVsdHMgdG8gXGNvbnN0YW50e0ZhbHNlfV17Mi40fQotICAgIFxkZXByZWNhdGVkezIuNn17VXNlIHRoZSBcbWVtYmVye2Zvcm1hdH0gYXR0cmlidXRlIGluc3RlYWQufQotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY317cGF4X2hlYWRlcnN9Ci0gICAgQSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcga2V5LXZhbHVlIHBhaXJzIG9mIHBheCBnbG9iYWwgaGVhZGVycy4KLSAgICBcdmVyc2lvbmFkZGVkezIuNn0KLVxlbmR7bWVtYmVyZGVzY30KLQotJS0tLS0tLS0tLS0tLS0tLS0tCi0lIFRhckluZm8gT2JqZWN0cwotJS0tLS0tLS0tLS0tLS0tLS0tCi0KLVxzdWJzZWN0aW9ue1RhckluZm8gT2JqZWN0cyBcbGFiZWx7dGFyaW5mby1vYmplY3RzfX0KLQotQSBcY2xhc3N7VGFySW5mb30gb2JqZWN0IHJlcHJlc2VudHMgb25lIG1lbWJlciBpbiBhCi1cY2xhc3N7VGFyRmlsZX0uIEFzaWRlIGZyb20gc3RvcmluZyBhbGwgcmVxdWlyZWQgYXR0cmlidXRlcyBvZiBhIGZpbGUKLShsaWtlIGZpbGUgdHlwZSwgc2l6ZSwgdGltZSwgcGVybWlzc2lvbnMsIG93bmVyIGV0Yy4pLCBpdCBwcm92aWRlcwotc29tZSB1c2VmdWwgbWV0aG9kcyB0byBkZXRlcm1pbmUgaXRzIHR5cGUuIEl0IGRvZXMgXGVtcGh7bm90fSBjb250YWluCi10aGUgZmlsZSdzIGRhdGEgaXRzZWxmLgotCi1cY2xhc3N7VGFySW5mb30gb2JqZWN0cyBhcmUgcmV0dXJuZWQgYnkgXGNsYXNze1RhckZpbGV9J3MgbWV0aG9kcwotXG1ldGhvZHtnZXRtZW1iZXIoKX0sIFxtZXRob2R7Z2V0bWVtYmVycygpfSBhbmQgXG1ldGhvZHtnZXR0YXJpbmZvKCl9LgotCi1cYmVnaW57Y2xhc3NkZXNjfXtUYXJJbmZvfXtcb3B0aW9uYWx7bmFtZX19Ci0gICAgQ3JlYXRlIGEgXGNsYXNze1RhckluZm99IG9iamVjdC4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317ZnJvbWJ1Zn17YnVmfQotICAgIENyZWF0ZSBhbmQgcmV0dXJuIGEgXGNsYXNze1RhckluZm99IG9iamVjdCBmcm9tIHN0cmluZyBidWZmZXIgXHZhcntidWZ9LgotICAgIFx2ZXJzaW9uYWRkZWRbUmFpc2VzIFxleGNlcHRpb257SGVhZGVyRXJyb3J9IGlmIHRoZSBidWZmZXIgaXMKLSAgICBpbnZhbGlkLl17Mi42fQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317ZnJvbXRhcmZpbGV9e3RhcmZpbGV9Ci0gICAgUmVhZCB0aGUgbmV4dCBtZW1iZXIgZnJvbSB0aGUgXGNsYXNze1RhckZpbGV9IG9iamVjdCBcdmFye3RhcmZpbGV9IGFuZAotICAgIHJldHVybiBpdCBhcyBhIFxjbGFzc3tUYXJJbmZvfSBvYmplY3QuCi0gICAgXHZlcnNpb25hZGRlZHsyLjZ9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXt0b2J1Zn17XG9wdGlvbmFse2Zvcm1hdFxvcHRpb25hbHssIGVuY29kaW5nCi0gICAgICAgIFxvcHRpb25hbHssIGVycm9yc319fX0KLSAgICBDcmVhdGUgYSBzdHJpbmcgYnVmZmVyIGZyb20gYSBcY2xhc3N7VGFySW5mb30gb2JqZWN0LiBGb3IgaW5mb3JtYXRpb24KLSAgICBvbiB0aGUgYXJndW1lbnRzIHNlZSB0aGUgY29uc3RydWN0b3Igb2YgdGhlIFxjbGFzc3tUYXJGaWxlfSBjbGFzcy4KLSAgICBcdmVyc2lvbmNoYW5nZWRbVGhlIGFyZ3VtZW50cyB3ZXJlIGFkZGVkXXsyLjZ9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLUEgXGNvZGV7VGFySW5mb30gb2JqZWN0IGhhcyB0aGUgZm9sbG93aW5nIHB1YmxpYyBkYXRhIGF0dHJpYnV0ZXM6Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXtuYW1lfQotICAgIE5hbWUgb2YgdGhlIGFyY2hpdmUgbWVtYmVyLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY317c2l6ZX0KLSAgICBTaXplIGluIGJ5dGVzLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY317bXRpbWV9Ci0gICAgVGltZSBvZiBsYXN0IG1vZGlmaWNhdGlvbi4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9e21vZGV9Ci0gICAgUGVybWlzc2lvbiBiaXRzLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY317dHlwZX0KLSAgICBGaWxlIHR5cGUuICBcdmFye3R5cGV9IGlzIHVzdWFsbHkgb25lIG9mIHRoZXNlIGNvbnN0YW50czoKLSAgICBcY29uc3RhbnR7UkVHVFlQRX0sIFxjb25zdGFudHtBUkVHVFlQRX0sIFxjb25zdGFudHtMTktUWVBFfSwKLSAgICBcY29uc3RhbnR7U1lNVFlQRX0sIFxjb25zdGFudHtESVJUWVBFfSwgXGNvbnN0YW50e0ZJRk9UWVBFfSwKLSAgICBcY29uc3RhbnR7Q09OVFRZUEV9LCBcY29uc3RhbnR7Q0hSVFlQRX0sIFxjb25zdGFudHtCTEtUWVBFfSwKLSAgICBcY29uc3RhbnR7R05VVFlQRV9TUEFSU0V9LiAgVG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGEKLSAgICBcY2xhc3N7VGFySW5mb30gb2JqZWN0IG1vcmUgY29udmVuaWVudGx5LCB1c2UgdGhlIFxjb2Rle2lzXyooKX0KLSAgICBtZXRob2RzIGJlbG93LgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY317bGlua25hbWV9Ci0gICAgTmFtZSBvZiB0aGUgdGFyZ2V0IGZpbGUgbmFtZSwgd2hpY2ggaXMgb25seSBwcmVzZW50IGluCi0gICAgXGNsYXNze1RhckluZm99IG9iamVjdHMgb2YgdHlwZSBcY29uc3RhbnR7TE5LVFlQRX0gYW5kCi0gICAgXGNvbnN0YW50e1NZTVRZUEV9LgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY317dWlkfQotICAgIFVzZXIgSUQgb2YgdGhlIHVzZXIgd2hvIG9yaWdpbmFsbHkgc3RvcmVkIHRoaXMgbWVtYmVyLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY317Z2lkfQotICAgIEdyb3VwIElEIG9mIHRoZSB1c2VyIHdobyBvcmlnaW5hbGx5IHN0b3JlZCB0aGlzIG1lbWJlci4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9e3VuYW1lfQotICAgIFVzZXIgbmFtZS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9e2duYW1lfQotICAgIEdyb3VwIG5hbWUuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXtwYXhfaGVhZGVyc30KLSAgICBBIGRpY3Rpb25hcnkgY29udGFpbmluZyBrZXktdmFsdWUgcGFpcnMgb2YgYW4gYXNzb2NpYXRlZCBwYXgKLSAgICBleHRlbmRlZCBoZWFkZXIuCi0gICAgXHZlcnNpb25hZGRlZHsyLjZ9Ci1cZW5ke21lbWJlcmRlc2N9Ci0KLUEgXGNsYXNze1RhckluZm99IG9iamVjdCBhbHNvIHByb3ZpZGVzIHNvbWUgY29udmVuaWVudCBxdWVyeSBtZXRob2RzOgotCi1cYmVnaW57bWV0aG9kZGVzY317aXNmaWxlfXt9Ci0gICAgUmV0dXJuIFxjb25zdGFudHtUcnVlfSBpZiB0aGUgXGNsYXNze1RhcmluZm99IG9iamVjdCBpcyBhIHJlZ3VsYXIKLSAgICBmaWxlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317aXNyZWd9e30KLSAgICBTYW1lIGFzIFxtZXRob2R7aXNmaWxlKCl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317aXNkaXJ9e30KLSAgICBSZXR1cm4gXGNvbnN0YW50e1RydWV9IGlmIGl0IGlzIGEgZGlyZWN0b3J5LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317aXNzeW19e30KLSAgICBSZXR1cm4gXGNvbnN0YW50e1RydWV9IGlmIGl0IGlzIGEgc3ltYm9saWMgbGluay4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2lzbG5rfXt9Ci0gICAgUmV0dXJuIFxjb25zdGFudHtUcnVlfSBpZiBpdCBpcyBhIGhhcmQgbGluay4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2lzY2hyfXt9Ci0gICAgUmV0dXJuIFxjb25zdGFudHtUcnVlfSBpZiBpdCBpcyBhIGNoYXJhY3RlciBkZXZpY2UuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtpc2Jsa317fQotICAgIFJldHVybiBcY29uc3RhbnR7VHJ1ZX0gaWYgaXQgaXMgYSBibG9jayBkZXZpY2UuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtpc2ZpZm99e30KLSAgICBSZXR1cm4gXGNvbnN0YW50e1RydWV9IGlmIGl0IGlzIGEgRklGTy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2lzZGV2fXt9Ci0gICAgUmV0dXJuIFxjb25zdGFudHtUcnVlfSBpZiBpdCBpcyBvbmUgb2YgY2hhcmFjdGVyIGRldmljZSwgYmxvY2sKLSAgICBkZXZpY2Ugb3IgRklGTy4KLVxlbmR7bWV0aG9kZGVzY30KLQotJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSBFeGFtcGxlcwotJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1cc3Vic2VjdGlvbntFeGFtcGxlcyBcbGFiZWx7dGFyLWV4YW1wbGVzfX0KLQotSG93IHRvIGV4dHJhY3QgYW4gZW50aXJlIHRhciBhcmNoaXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5OgotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IHRhcmZpbGUKLXRhciA9IHRhcmZpbGUub3Blbigic2FtcGxlLnRhci5neiIpCi10YXIuZXh0cmFjdGFsbCgpCi10YXIuY2xvc2UoKQotXGVuZHt2ZXJiYXRpbX0KLQotSG93IHRvIGNyZWF0ZSBhbiB1bmNvbXByZXNzZWQgdGFyIGFyY2hpdmUgZnJvbSBhIGxpc3Qgb2YgZmlsZW5hbWVzOgotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IHRhcmZpbGUKLXRhciA9IHRhcmZpbGUub3Blbigic2FtcGxlLnRhciIsICJ3IikKLWZvciBuYW1lIGluIFsiZm9vIiwgImJhciIsICJxdXV4Il06Ci0gICAgdGFyLmFkZChuYW1lKQotdGFyLmNsb3NlKCkKLVxlbmR7dmVyYmF0aW19Ci0KLUhvdyB0byByZWFkIGEgZ3ppcCBjb21wcmVzc2VkIHRhciBhcmNoaXZlIGFuZCBkaXNwbGF5IHNvbWUgbWVtYmVyIGluZm9ybWF0aW9uOgotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IHRhcmZpbGUKLXRhciA9IHRhcmZpbGUub3Blbigic2FtcGxlLnRhci5neiIsICJyOmd6IikKLWZvciB0YXJpbmZvIGluIHRhcjoKLSAgICBwcmludCB0YXJpbmZvLm5hbWUsICJpcyIsIHRhcmluZm8uc2l6ZSwgImJ5dGVzIGluIHNpemUgYW5kIGlzIiwKLSAgICBpZiB0YXJpbmZvLmlzcmVnKCk6Ci0gICAgICAgIHByaW50ICJhIHJlZ3VsYXIgZmlsZS4iCi0gICAgZWxpZiB0YXJpbmZvLmlzZGlyKCk6Ci0gICAgICAgIHByaW50ICJhIGRpcmVjdG9yeS4iCi0gICAgZWxzZToKLSAgICAgICAgcHJpbnQgInNvbWV0aGluZyBlbHNlLiIKLXRhci5jbG9zZSgpCi1cZW5ke3ZlcmJhdGltfQotCi1Ib3cgdG8gY3JlYXRlIGEgdGFyIGFyY2hpdmUgd2l0aCBmYWtlZCBpbmZvcm1hdGlvbjoKLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCB0YXJmaWxlCi10YXIgPSB0YXJmaWxlLm9wZW4oInNhbXBsZS50YXIuZ3oiLCAidzpneiIpCi1mb3IgbmFtZSBpbiBuYW1lbGlzdDoKLSAgICB0YXJpbmZvID0gdGFyLmdldHRhcmluZm8obmFtZSwgImZha2Vwcm9qLTEuMC8iICsgbmFtZSkKLSAgICB0YXJpbmZvLnVpZCA9IDEyMwotICAgIHRhcmluZm8uZ2lkID0gNDU2Ci0gICAgdGFyaW5mby51bmFtZSA9ICJqb2huZG9lIgotICAgIHRhcmluZm8uZ25hbWUgPSAiZmFrZSIKLSAgICB0YXIuYWRkZmlsZSh0YXJpbmZvLCBmaWxlKG5hbWUpKQotdGFyLmNsb3NlKCkKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBcZW1waHtvbmx5fSB3YXkgdG8gZXh0cmFjdCBhbiB1bmNvbXByZXNzZWQgdGFyIHN0cmVhbSBmcm9tCi1cY29kZXtzeXMuc3RkaW59OgotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IHN5cwotaW1wb3J0IHRhcmZpbGUKLXRhciA9IHRhcmZpbGUub3Blbihtb2RlPSJyfCIsIGZpbGVvYmo9c3lzLnN0ZGluKQotZm9yIHRhcmluZm8gaW4gdGFyOgotICAgIHRhci5leHRyYWN0KHRhcmluZm8pCi10YXIuY2xvc2UoKQotXGVuZHt2ZXJiYXRpbX0KLQotJS0tLS0tLS0tLS0tLQotJSBUYXIgZm9ybWF0Ci0lLS0tLS0tLS0tLS0tCi0KLVxzdWJzZWN0aW9ue1N1cHBvcnRlZCB0YXIgZm9ybWF0cyBcbGFiZWx7dGFyLWZvcm1hdHN9fQotCi1UaGVyZSBhcmUgdGhyZWUgdGFyIGZvcm1hdHMgdGhhdCBjYW4gYmUgY3JlYXRlZCB3aXRoIHRoZSBcbW9kdWxle3RhcmZpbGV9Ci1tb2R1bGU6Ci0KLVxiZWdpbntpdGVtaXplfQotCi1caXRlbQotVGhlIFxQT1NJWHt9LjEtMTk4OCB1c3RhciBmb3JtYXQgKFxjb25zdGFudHtVU1RBUl9GT1JNQVR9KS4gSXQgc3VwcG9ydHMKLWZpbGVuYW1lcyB1cCB0byBhIGxlbmd0aCBvZiBhdCBiZXN0IDI1NiBjaGFyYWN0ZXJzIGFuZCBsaW5rbmFtZXMgdXAgdG8gMTAwCi1jaGFyYWN0ZXJzLiBUaGUgbWF4aW11bSBmaWxlIHNpemUgaXMgOCBnaWdhYnl0ZXMuIFRoaXMgaXMgYW4gb2xkIGFuZCBsaW1pdGVkCi1idXQgd2lkZWx5IHN1cHBvcnRlZCBmb3JtYXQuCi0KLVxpdGVtCi1UaGUgR05VIHRhciBmb3JtYXQgKFxjb25zdGFudHtHTlVfRk9STUFUfSkuIEl0IHN1cHBvcnRzIGxvbmcgZmlsZW5hbWVzIGFuZAotbGlua25hbWVzLCBmaWxlcyBiaWdnZXIgdGhhbiA4IGdpZ2FieXRlcyBhbmQgc3BhcnNlIGZpbGVzLiBJdCBpcyB0aGUgZGUgZmFjdG8KLXN0YW5kYXJkIG9uIEdOVS9MaW51eCBzeXN0ZW1zLiBcbW9kdWxle3RhcmZpbGV9IGZ1bGx5IHN1cHBvcnRzIHRoZSBHTlUgdGFyCi1leHRlbnNpb25zIGZvciBsb25nIG5hbWVzLCBzcGFyc2UgZmlsZSBzdXBwb3J0IGlzIHJlYWQtb25seS4KLQotXGl0ZW0KLVRoZSBcUE9TSVh7fS4xLTIwMDEgcGF4IGZvcm1hdCAoXGNvbnN0YW50e1BBWF9GT1JNQVR9KS4gSXQgaXMgdGhlIG1vc3QKLWZsZXhpYmxlIGZvcm1hdCB3aXRoIHZpcnR1YWxseSBubyBsaW1pdHMuIEl0IHN1cHBvcnRzIGxvbmcgZmlsZW5hbWVzIGFuZAotbGlua25hbWVzLCBsYXJnZSBmaWxlcyBhbmQgc3RvcmVzIHBhdGhuYW1lcyBpbiBhIHBvcnRhYmxlIHdheS4gSG93ZXZlciwgbm90Ci1hbGwgdGFyIGltcGxlbWVudGF0aW9ucyB0b2RheSBhcmUgYWJsZSB0byBoYW5kbGUgcGF4IGFyY2hpdmVzIHByb3Blcmx5LgotCi1UaGUgXGVtcGh7cGF4fSBmb3JtYXQgaXMgYW4gZXh0ZW5zaW9uIHRvIHRoZSBleGlzdGluZyBcZW1waHt1c3Rhcn0gZm9ybWF0LiBJdAotdXNlcyBleHRyYSBoZWFkZXJzIGZvciBpbmZvcm1hdGlvbiB0aGF0IGNhbm5vdCBiZSBzdG9yZWQgb3RoZXJ3aXNlLiBUaGVyZSBhcmUKLXR3byBmbGF2b3VycyBvZiBwYXggaGVhZGVyczogRXh0ZW5kZWQgaGVhZGVycyBvbmx5IGFmZmVjdCB0aGUgc3Vic2VxdWVudCBmaWxlCi1oZWFkZXIsIGdsb2JhbCBoZWFkZXJzIGFyZSB2YWxpZCBmb3IgdGhlIGNvbXBsZXRlIGFyY2hpdmUgYW5kIGFmZmVjdCBhbGwKLWZvbGxvd2luZyBmaWxlcy4gQWxsIHRoZSBkYXRhIGluIGEgcGF4IGhlYWRlciBpcyBlbmNvZGVkIGluIFxlbXBoe1VURi04fSBmb3IKLXBvcnRhYmlsaXR5IHJlYXNvbnMuCi0KLVxlbmR7aXRlbWl6ZX0KLQotVGhlcmUgYXJlIHNvbWUgbW9yZSB2YXJpYW50cyBvZiB0aGUgdGFyIGZvcm1hdCB3aGljaCBjYW4gYmUgcmVhZCwgYnV0IG5vdAotY3JlYXRlZDoKLQotXGJlZ2lue2l0ZW1pemV9Ci0KLVxpdGVtCi1UaGUgYW5jaWVudCBWNyBmb3JtYXQuIFRoaXMgaXMgdGhlIGZpcnN0IHRhciBmb3JtYXQgZnJvbSBcVU5JWHt9IFNldmVudGgKLUVkaXRpb24sIHN0b3Jpbmcgb25seSByZWd1bGFyIGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4gTmFtZXMgbXVzdCBub3QgYmUgbG9uZ2VyCi10aGFuIDEwMCBjaGFyYWN0ZXJzLCB0aGVyZSBpcyBubyB1c2VyL2dyb3VwIG5hbWUgaW5mb3JtYXRpb24uIFNvbWUgYXJjaGl2ZXMKLWhhdmUgbWlzY2FsY3VsYXRlZCBoZWFkZXIgY2hlY2tzdW1zIGluIGNhc2Ugb2YgZmllbGRzIHdpdGggbm9uLVxBU0NJSXt9Ci1jaGFyYWN0ZXJzLgotCi1caXRlbQotVGhlIFN1bk9TIHRhciBleHRlbmRlZCBmb3JtYXQuIFRoaXMgZm9ybWF0IGlzIGEgdmFyaWFudCBvZiB0aGUgXFBPU0lYe30uMS0yMDAxCi1wYXggZm9ybWF0LCBidXQgaXMgbm90IGNvbXBhdGlibGUuCi0KLVxlbmR7aXRlbWl6ZX0KLQotJS0tLS0tLS0tLS0tLS0tLS0KLSUgVW5pY29kZSBpc3N1ZXMKLSUtLS0tLS0tLS0tLS0tLS0tCi0KLVxzdWJzZWN0aW9ue1VuaWNvZGUgaXNzdWVzIFxsYWJlbHt0YXItdW5pY29kZX19Ci0KLVRoZSB0YXIgZm9ybWF0IHdhcyBvcmlnaW5hbGx5IGNvbmNlaXZlZCB0byBtYWtlIGJhY2t1cHMgb24gdGFwZSBkcml2ZXMgd2l0aCB0aGUKLW1haW4gZm9jdXMgb24gcHJlc2VydmluZyBmaWxlIHN5c3RlbSBpbmZvcm1hdGlvbi4gTm93YWRheXMgdGFyIGFyY2hpdmVzIGFyZQotY29tbW9ubHkgdXNlZCBmb3IgZmlsZSBkaXN0cmlidXRpb24gYW5kIGV4Y2hhbmdpbmcgYXJjaGl2ZXMgb3ZlciBuZXR3b3Jrcy4gT25lCi1wcm9ibGVtIG9mIHRoZSBvcmlnaW5hbCBmb3JtYXQgKHRoYXQgYWxsIG90aGVyIGZvcm1hdHMgYXJlIG1lcmVseSB2YXJpYW50cyBvZikKLWlzIHRoYXQgdGhlcmUgaXMgbm8gY29uY2VwdCBvZiBzdXBwb3J0aW5nIGRpZmZlcmVudCBjaGFyYWN0ZXIgZW5jb2RpbmdzLgotRm9yIGV4YW1wbGUsIGFuIG9yZGluYXJ5IHRhciBhcmNoaXZlIGNyZWF0ZWQgb24gYSBcZW1waHtVVEYtOH0gc3lzdGVtIGNhbm5vdCBiZQotcmVhZCBjb3JyZWN0bHkgb24gYSBcZW1waHtMYXRpbi0xfSBzeXN0ZW0gaWYgaXQgY29udGFpbnMgbm9uLVxBU0NJSXt9Ci1jaGFyYWN0ZXJzLiBOYW1lcyAoaS5lLiBmaWxlbmFtZXMsIGxpbmtuYW1lcywgdXNlci9ncm91cCBuYW1lcykgY29udGFpbmluZwotdGhlc2UgY2hhcmFjdGVycyB3aWxsIGFwcGVhciBkYW1hZ2VkLiAgVW5mb3J0dW5hdGVseSwgdGhlcmUgaXMgbm8gd2F5IHRvCi1hdXRvZGV0ZWN0IHRoZSBlbmNvZGluZyBvZiBhbiBhcmNoaXZlLgotCi1UaGUgcGF4IGZvcm1hdCB3YXMgZGVzaWduZWQgdG8gc29sdmUgdGhpcyBwcm9ibGVtLiBJdCBzdG9yZXMgbm9uLVxBU0NJSXt9IG5hbWVzCi11c2luZyB0aGUgdW5pdmVyc2FsIGNoYXJhY3RlciBlbmNvZGluZyBcZW1waHtVVEYtOH0uIFdoZW4gYSBwYXggYXJjaGl2ZSBpcwotcmVhZCwgdGhlc2UgXGVtcGh7VVRGLTh9IG5hbWVzIGFyZSBjb252ZXJ0ZWQgdG8gdGhlIGVuY29kaW5nIG9mIHRoZSBsb2NhbAotZmlsZSBzeXN0ZW0uCi0KLVRoZSBkZXRhaWxzIG9mIHVuaWNvZGUgY29udmVyc2lvbiBhcmUgY29udHJvbGxlZCBieSB0aGUgXHZhcntlbmNvZGluZ30gYW5kCi1cdmFye2Vycm9yc30ga2V5d29yZCBhcmd1bWVudHMgb2YgdGhlIFxjbGFzc3tUYXJGaWxlfSBjbGFzcy4KLQotVGhlIGRlZmF1bHQgdmFsdWUgZm9yIFx2YXJ7ZW5jb2Rpbmd9IGlzIHRoZSBsb2NhbCBjaGFyYWN0ZXIgZW5jb2RpbmcuIEl0IGlzCi1kZWR1Y2VkIGZyb20gXGZ1bmN0aW9ue3N5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKX0gYW5kCi1cZnVuY3Rpb257c3lzLmdldGRlZmF1bHRlbmNvZGluZygpfS4gSW4gcmVhZCBtb2RlLCBcdmFye2VuY29kaW5nfSBpcyB1c2VkCi1leGNsdXNpdmVseSB0byBjb252ZXJ0IHVuaWNvZGUgbmFtZXMgZnJvbSBhIHBheCBhcmNoaXZlIHRvIHN0cmluZ3MgaW4gdGhlIGxvY2FsCi1jaGFyYWN0ZXIgZW5jb2RpbmcuIEluIHdyaXRlIG1vZGUsIHRoZSB1c2Ugb2YgXHZhcntlbmNvZGluZ30gZGVwZW5kcyBvbiB0aGUKLWNob3NlbiBhcmNoaXZlIGZvcm1hdC4gSW4gY2FzZSBvZiBcY29uc3RhbnR7UEFYX0ZPUk1BVH0sIGlucHV0IG5hbWVzIHRoYXQKLWNvbnRhaW4gbm9uLVxBU0NJSXt9IGNoYXJhY3RlcnMgbmVlZCB0byBiZSBkZWNvZGVkIGJlZm9yZSBiZWluZyBzdG9yZWQgYXMKLVxlbXBoe1VURi04fSBzdHJpbmdzLiBUaGUgb3RoZXIgZm9ybWF0cyBkbyBub3QgbWFrZSB1c2Ugb2YgXHZhcntlbmNvZGluZ30KLXVubGVzcyB1bmljb2RlIG9iamVjdHMgYXJlIHVzZWQgYXMgaW5wdXQgbmFtZXMuIFRoZXNlIGFyZSBjb252ZXJ0ZWQgdG8KLTgtYml0IGNoYXJhY3RlciBzdHJpbmdzIGJlZm9yZSB0aGV5IGFyZSBhZGRlZCB0byB0aGUgYXJjaGl2ZS4KLQotVGhlIFx2YXJ7ZXJyb3JzfSBhcmd1bWVudCBkZWZpbmVzIGhvdyBjaGFyYWN0ZXJzIGFyZSB0cmVhdGVkIHRoYXQgY2Fubm90IGJlCi1jb252ZXJ0ZWQgdG8gb3IgZnJvbSBcdmFye2VuY29kaW5nfS4gUG9zc2libGUgdmFsdWVzIGFyZSBsaXN0ZWQgaW4gc2VjdGlvbgotXHJlZntjb2RlYy1iYXNlLWNsYXNzZXN9LiBJbiByZWFkIG1vZGUsIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgc2NoZW1lCi1cY29kZXsndXRmLTgnfSB3aGljaCBtZWFucyB0aGF0IGJhZCBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZCBieSB0aGVpcgotXGVtcGh7VVRGLTh9IHJlcHJlc2VudGF0aW9uLiBUaGlzIGlzIHRoZSBkZWZhdWx0IHNjaGVtZS4gSW4gd3JpdGUgbW9kZSB0aGUKLWRlZmF1bHQgdmFsdWUgZm9yIFx2YXJ7ZXJyb3JzfSBpcyBcY29kZXsnc3RyaWN0J30gdG8gZW5zdXJlIHRoYXQgbmFtZQotaW5mb3JtYXRpb24gaXMgbm90IGFsdGVyZWQgdW5ub3RpY2VkLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ0ZWxuZXRsaWIudGV4IGIvRG9jL2xpYi9saWJ0ZWxuZXRsaWIudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTM3ODhmLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlidGVsbmV0bGliLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3RlbG5ldGxpYn0gLS0tCi0gICAgICAgICBUZWxuZXQgY2xpZW50fQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17dGVsbmV0bGlifQotXG1vZHVsZXN5bm9wc2lze1RlbG5ldCBjbGllbnQgY2xhc3MufQotXHNlY3Rpb25hdXRob3J7U2tpcCBNb250YW5hcm99e3NraXBAbW9qYW0uY29tfQotCi1caW5kZXh7cHJvdG9jb2whVGVsbmV0fQotCi1UaGUgXG1vZHVsZXt0ZWxuZXRsaWJ9IG1vZHVsZSBwcm92aWRlcyBhIFxjbGFzc3tUZWxuZXR9IGNsYXNzIHRoYXQKLWltcGxlbWVudHMgdGhlIFRlbG5ldCBwcm90b2NvbC4gIFNlZSBccmZjezg1NH0gZm9yIGRldGFpbHMgYWJvdXQgdGhlCi1wcm90b2NvbC4gSW4gYWRkaXRpb24sIGl0IHByb3ZpZGVzIHN5bWJvbGljIGNvbnN0YW50cyBmb3IgdGhlIHByb3RvY29sCi1jaGFyYWN0ZXJzIChzZWUgYmVsb3cpLCBhbmQgZm9yIHRoZSB0ZWxuZXQgb3B0aW9ucy4gVGhlCi1zeW1ib2xpYyBuYW1lcyBvZiB0aGUgdGVsbmV0IG9wdGlvbnMgZm9sbG93IHRoZSBkZWZpbml0aW9ucyBpbgotXGNvZGV7YXJwYS90ZWxuZXQuaH0sIHdpdGggdGhlIGxlYWRpbmcgXGNvZGV7VEVMT1BUX30gcmVtb3ZlZC4gRm9yCi1zeW1ib2xpYyBuYW1lcyBvZiBvcHRpb25zIHdoaWNoIGFyZSB0cmFkaXRpb25hbGx5IG5vdCBpbmNsdWRlZCBpbgotXGNvZGV7YXJwYS90ZWxuZXQuaH0sIHNlZSB0aGUgbW9kdWxlIHNvdXJjZSBpdHNlbGYuCi0KLVRoZSBzeW1ib2xpYyBjb25zdGFudHMgZm9yIHRoZSB0ZWxuZXQgY29tbWFuZHMgYXJlOiBJQUMsIERPTlQsIERPLAotV09OVCwgV0lMTCwgU0UgKFN1Ym5lZ290aWF0aW9uIEVuZCksIE5PUCAoTm8gT3BlcmF0aW9uKSwgRE0gKERhdGEKLU1hcmspLCBCUksgKEJyZWFrKSwgSVAgKEludGVycnVwdCBwcm9jZXNzKSwgQU8gKEFib3J0IG91dHB1dCksIEFZVAotKEFyZSBZb3UgVGhlcmUpLCBFQyAoRXJhc2UgQ2hhcmFjdGVyKSwgRUwgKEVyYXNlIExpbmUpLCBHQSAoR28gQWhlYWQpLAotU0IgKFN1Ym5lZ290aWF0aW9uIEJlZ2luKS4KLQotCi1cYmVnaW57Y2xhc3NkZXNjfXtUZWxuZXR9e1xvcHRpb25hbHtob3N0XG9wdGlvbmFseywgcG9ydFxvcHRpb25hbHssIHRpbWVvdXR9fX19Ci1cY2xhc3N7VGVsbmV0fSByZXByZXNlbnRzIGEgY29ubmVjdGlvbiB0byBhIFRlbG5ldCBzZXJ2ZXIuIFRoZQotaW5zdGFuY2UgaXMgaW5pdGlhbGx5IG5vdCBjb25uZWN0ZWQgYnkgZGVmYXVsdDsgdGhlIFxtZXRob2R7b3BlbigpfQotbWV0aG9kIG11c3QgYmUgdXNlZCB0byBlc3RhYmxpc2ggYSBjb25uZWN0aW9uLiAgQWx0ZXJuYXRpdmVseSwgdGhlCi1ob3N0IG5hbWUgYW5kIG9wdGlvbmFsIHBvcnQgbnVtYmVyIGNhbiBiZSBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLAotdG8sIGluIHdoaWNoIGNhc2UgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciB3aWxsIGJlIGVzdGFibGlzaGVkCi1iZWZvcmUgdGhlIGNvbnN0cnVjdG9yIHJldHVybnMuCi1UaGUgb3B0aW9uYWwgXHZhcnt0aW1lb3V0fSBwYXJhbWV0ZXIgc3BlY2lmaWVzIGEgdGltZW91dCBpbiBzZWNvbmRzIGZvciB0aGUKLWNvbm5lY3Rpb24gYXR0ZW1wdCAoaWYgbm90IHNwZWNpZmllZCwgb3IgcGFzc2VkIGFzIE5vbmUsIHRoZSBnbG9iYWwgZGVmYXVsdAotdGltZW91dCBzZXR0aW5nIHdpbGwgYmUgdXNlZCkuCi0KLURvIG5vdCByZW9wZW4gYW4gYWxyZWFkeSBjb25uZWN0ZWQgaW5zdGFuY2UuCi0KLVRoaXMgY2xhc3MgaGFzIG1hbnkgXG1ldGhvZHtyZWFkXyooKX0gbWV0aG9kcy4gIE5vdGUgdGhhdCBzb21lIG9mIHRoZW0gCi1yYWlzZSBcZXhjZXB0aW9ue0VPRkVycm9yfSB3aGVuIHRoZSBlbmQgb2YgdGhlIGNvbm5lY3Rpb24gaXMgcmVhZCwKLWJlY2F1c2UgdGhleSBjYW4gcmV0dXJuIGFuIGVtcHR5IHN0cmluZyBmb3Igb3RoZXIgcmVhc29ucy4gIFNlZSB0aGUKLWluZGl2aWR1YWwgZGVzY3JpcHRpb25zIGJlbG93LgotXHZlcnNpb25jaGFuZ2VkW1x2YXJ7dGltZW91dH0gd2FzIGFkZGVkXXsyLjZ9Ci1cZW5ke2NsYXNzZGVzY30KLQotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZXJmY3s4NTR9e1RlbG5ldCBQcm90b2NvbCBTcGVjaWZpY2F0aW9ufXsKLSAgICAgICAgICBEZWZpbml0aW9uIG9mIHRoZSBUZWxuZXQgcHJvdG9jb2wufQotXGVuZHtzZWVhbHNvfQotCi0KLQotXHN1YnNlY3Rpb257VGVsbmV0IE9iamVjdHMgXGxhYmVse3RlbG5ldC1vYmplY3RzfX0KLQotXGNsYXNze1RlbG5ldH0gaW5zdGFuY2VzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotCi0KLVxiZWdpbnttZXRob2RkZXNjfVtUZWxuZXRde3JlYWRfdW50aWx9e2V4cGVjdGVkXG9wdGlvbmFseywgdGltZW91dH19Ci1SZWFkIHVudGlsIGEgZ2l2ZW4gc3RyaW5nLCBcdmFye2V4cGVjdGVkfSwgaXMgZW5jb3VudGVyZWQgb3IgdW50aWwKLVx2YXJ7dGltZW91dH0gc2Vjb25kcyBoYXZlIHBhc3NlZC4KLQotV2hlbiBubyBtYXRjaCBpcyBmb3VuZCwgcmV0dXJuIHdoYXRldmVyIGlzIGF2YWlsYWJsZSBpbnN0ZWFkLAotcG9zc2libHkgdGhlIGVtcHR5IHN0cmluZy4gIFJhaXNlIFxleGNlcHRpb257RU9GRXJyb3J9IGlmIHRoZSBjb25uZWN0aW9uCi1pcyBjbG9zZWQgYW5kIG5vIGNvb2tlZCBkYXRhIGlzIGF2YWlsYWJsZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1RlbG5ldF17cmVhZF9hbGx9e30KLVJlYWQgYWxsIGRhdGEgdW50aWwgXEVPRjsgYmxvY2sgdW50aWwgY29ubmVjdGlvbiBjbG9zZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtUZWxuZXRde3JlYWRfc29tZX17fQotUmVhZCBhdCBsZWFzdCBvbmUgYnl0ZSBvZiBjb29rZWQgZGF0YSB1bmxlc3MgXEVPRnt9IGlzIGhpdC4KLVJldHVybiBcY29kZXsnJ30gaWYgXEVPRnt9IGlzIGhpdC4gIEJsb2NrIGlmIG5vIGRhdGEgaXMgaW1tZWRpYXRlbHkKLWF2YWlsYWJsZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1RlbG5ldF17cmVhZF92ZXJ5X2VhZ2VyfXt9Ci1SZWFkIGV2ZXJ5dGhpbmcgdGhhdCBjYW4gYmUgd2l0aG91dCBibG9ja2luZyBpbiBJL08gKGVhZ2VyKS4KLQotUmFpc2UgXGV4Y2VwdGlvbntFT0ZFcnJvcn0gaWYgY29ubmVjdGlvbiBjbG9zZWQgYW5kIG5vIGNvb2tlZCBkYXRhCi1hdmFpbGFibGUuICBSZXR1cm4gXGNvZGV7Jyd9IGlmIG5vIGNvb2tlZCBkYXRhIGF2YWlsYWJsZSBvdGhlcndpc2UuCi1EbyBub3QgYmxvY2sgdW5sZXNzIGluIHRoZSBtaWRzdCBvZiBhbiBJQUMgc2VxdWVuY2UuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtUZWxuZXRde3JlYWRfZWFnZXJ9e30KLVJlYWQgcmVhZGlseSBhdmFpbGFibGUgZGF0YS4KLQotUmFpc2UgXGV4Y2VwdGlvbntFT0ZFcnJvcn0gaWYgY29ubmVjdGlvbiBjbG9zZWQgYW5kIG5vIGNvb2tlZCBkYXRhCi1hdmFpbGFibGUuICBSZXR1cm4gXGNvZGV7Jyd9IGlmIG5vIGNvb2tlZCBkYXRhIGF2YWlsYWJsZSBvdGhlcndpc2UuCi1EbyBub3QgYmxvY2sgdW5sZXNzIGluIHRoZSBtaWRzdCBvZiBhbiBJQUMgc2VxdWVuY2UuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtUZWxuZXRde3JlYWRfbGF6eX17fQotUHJvY2VzcyBhbmQgcmV0dXJuIGRhdGEgYWxyZWFkeSBpbiB0aGUgcXVldWVzIChsYXp5KS4KLQotUmFpc2UgXGV4Y2VwdGlvbntFT0ZFcnJvcn0gaWYgY29ubmVjdGlvbiBjbG9zZWQgYW5kIG5vIGRhdGEgYXZhaWxhYmxlLgotUmV0dXJuIFxjb2RleycnfSBpZiBubyBjb29rZWQgZGF0YSBhdmFpbGFibGUgb3RoZXJ3aXNlLiAgRG8gbm90IGJsb2NrCi11bmxlc3MgaW4gdGhlIG1pZHN0IG9mIGFuIElBQyBzZXF1ZW5jZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1RlbG5ldF17cmVhZF92ZXJ5X2xhenl9e30KLVJldHVybiBhbnkgZGF0YSBhdmFpbGFibGUgaW4gdGhlIGNvb2tlZCBxdWV1ZSAodmVyeSBsYXp5KS4KLQotUmFpc2UgXGV4Y2VwdGlvbntFT0ZFcnJvcn0gaWYgY29ubmVjdGlvbiBjbG9zZWQgYW5kIG5vIGRhdGEgYXZhaWxhYmxlLgotUmV0dXJuIFxjb2RleycnfSBpZiBubyBjb29rZWQgZGF0YSBhdmFpbGFibGUgb3RoZXJ3aXNlLiAgVGhpcyBtZXRob2QKLW5ldmVyIGJsb2Nrcy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1RlbG5ldF17cmVhZF9zYl9kYXRhfXt9Ci1SZXR1cm4gdGhlIGRhdGEgY29sbGVjdGVkIGJldHdlZW4gYSBTQi9TRSBwYWlyIChzdWJvcHRpb24gYmVnaW4vZW5kKS4KLVRoZSBjYWxsYmFjayBzaG91bGQgYWNjZXNzIHRoZXNlIGRhdGEgd2hlbiBpdCB3YXMgaW52b2tlZCB3aXRoIGEKLVxjb2Rle1NFfSBjb21tYW5kLiBUaGlzIG1ldGhvZCBuZXZlciBibG9ja3MuCi0KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bVGVsbmV0XXtvcGVufXtob3N0XG9wdGlvbmFseywgcG9ydFxvcHRpb25hbHssIHRpbWVvdXR9fX0KLUNvbm5lY3QgdG8gYSBob3N0LgotVGhlIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgcG9ydCBudW1iZXIsIHdoaWNoCi1kZWZhdWx0cyB0byB0aGUgc3RhbmRhcmQgVGVsbmV0IHBvcnQgKDIzKS4KLVRoZSBvcHRpb25hbCBcdmFye3RpbWVvdXR9IHBhcmFtZXRlciBzcGVjaWZpZXMgYSB0aW1lb3V0IGluIHNlY29uZHMgZm9yIHRoZQotY29ubmVjdGlvbiBhdHRlbXB0IChpZiBub3Qgc3BlY2lmaWVkLCBvciBwYXNzZWQgYXMgTm9uZSwgdGhlIGdsb2JhbCBkZWZhdWx0Ci10aW1lb3V0IHNldHRpbmcgd2lsbCBiZSB1c2VkKS4KLQotRG8gbm90IHRyeSB0byByZW9wZW4gYW4gYWxyZWFkeSBjb25uZWN0ZWQgaW5zdGFuY2UuCi1cdmVyc2lvbmNoYW5nZWRbXHZhcnt0aW1lb3V0fSB3YXMgYWRkZWRdezIuNn0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1RlbG5ldF17bXNnfXttc2dcb3B0aW9uYWx7LCAqYXJnc319Ci1QcmludCBhIGRlYnVnIG1lc3NhZ2Ugd2hlbiB0aGUgZGVidWcgbGV2ZWwgaXMgXGNvZGV7Pn0gMC4KLUlmIGV4dHJhIGFyZ3VtZW50cyBhcmUgcHJlc2VudCwgdGhleSBhcmUgc3Vic3RpdHV0ZWQgaW4gdGhlCi1tZXNzYWdlIHVzaW5nIHRoZSBzdGFuZGFyZCBzdHJpbmcgZm9ybWF0dGluZyBvcGVyYXRvci4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1RlbG5ldF17c2V0X2RlYnVnbGV2ZWx9e2RlYnVnbGV2ZWx9Ci1TZXQgdGhlIGRlYnVnIGxldmVsLiAgVGhlIGhpZ2hlciB0aGUgdmFsdWUgb2YgXHZhcntkZWJ1Z2xldmVsfSwgdGhlCi1tb3JlIGRlYnVnIG91dHB1dCB5b3UgZ2V0IChvbiBcY29kZXtzeXMuc3Rkb3V0fSkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtUZWxuZXRde2Nsb3NlfXt9Ci1DbG9zZSB0aGUgY29ubmVjdGlvbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1RlbG5ldF17Z2V0X3NvY2tldH17fQotUmV0dXJuIHRoZSBzb2NrZXQgb2JqZWN0IHVzZWQgaW50ZXJuYWxseS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1RlbG5ldF17ZmlsZW5vfXt9Ci1SZXR1cm4gdGhlIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgc29ja2V0IG9iamVjdCB1c2VkIGludGVybmFsbHkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtUZWxuZXRde3dyaXRlfXtidWZmZXJ9Ci1Xcml0ZSBhIHN0cmluZyB0byB0aGUgc29ja2V0LCBkb3VibGluZyBhbnkgSUFDIGNoYXJhY3RlcnMuCi1UaGlzIGNhbiBibG9jayBpZiB0aGUgY29ubmVjdGlvbiBpcyBibG9ja2VkLiAgTWF5IHJhaXNlCi1cZXhjZXB0aW9ue3NvY2tldC5lcnJvcn0gaWYgdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bVGVsbmV0XXtpbnRlcmFjdH17fQotSW50ZXJhY3Rpb24gZnVuY3Rpb24sIGVtdWxhdGVzIGEgdmVyeSBkdW1iIFRlbG5ldCBjbGllbnQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtUZWxuZXRde210X2ludGVyYWN0fXt9Ci1NdWx0aXRocmVhZGVkIHZlcnNpb24gb2YgXG1ldGhvZHtpbnRlcmFjdCgpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1RlbG5ldF17ZXhwZWN0fXtsaXN0XG9wdGlvbmFseywgdGltZW91dH19Ci1SZWFkIHVudGlsIG9uZSBmcm9tIGEgbGlzdCBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbnMgbWF0Y2hlcy4KLQotVGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEgbGlzdCBvZiByZWd1bGFyIGV4cHJlc3Npb25zLCBlaXRoZXIKLWNvbXBpbGVkIChcY2xhc3N7cmUuUmVnZXhPYmplY3R9IGluc3RhbmNlcykgb3IgdW5jb21waWxlZCAoc3RyaW5ncykuCi1UaGUgb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IGlzIGEgdGltZW91dCwgaW4gc2Vjb25kczsgdGhlIGRlZmF1bHQKLWlzIHRvIGJsb2NrIGluZGVmaW5pdGVseS4KLQotUmV0dXJuIGEgdHVwbGUgb2YgdGhyZWUgaXRlbXM6IHRoZSBpbmRleCBpbiB0aGUgbGlzdCBvZiB0aGUKLWZpcnN0IHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IG1hdGNoZXM7IHRoZSBtYXRjaCBvYmplY3QKLXJldHVybmVkOyBhbmQgdGhlIHRleHQgcmVhZCB1cCB0aWxsIGFuZCBpbmNsdWRpbmcgdGhlIG1hdGNoLgotCi1JZiBlbmQgb2YgZmlsZSBpcyBmb3VuZCBhbmQgbm8gdGV4dCB3YXMgcmVhZCwgcmFpc2UKLVxleGNlcHRpb257RU9GRXJyb3J9LiAgT3RoZXJ3aXNlLCB3aGVuIG5vdGhpbmcgbWF0Y2hlcywgcmV0dXJuCi1cY29kZXsoLTEsIE5vbmUsIFx2YXJ7dGV4dH0pfSB3aGVyZSBcdmFye3RleHR9IGlzIHRoZSB0ZXh0IHJlY2VpdmVkIHNvCi1mYXIgKG1heSBiZSB0aGUgZW1wdHkgc3RyaW5nIGlmIGEgdGltZW91dCBoYXBwZW5lZCkuCi0KLUlmIGEgcmVndWxhciBleHByZXNzaW9uIGVuZHMgd2l0aCBhIGdyZWVkeSBtYXRjaCAoc3VjaCBhcyBccmVnZXhwey4qfSkKLW9yIGlmIG1vcmUgdGhhbiBvbmUgZXhwcmVzc2lvbiBjYW4gbWF0Y2ggdGhlIHNhbWUgaW5wdXQsIHRoZQotcmVzdWx0cyBhcmUgaW5kZXRlcm1pbmlzdGljLCBhbmQgbWF5IGRlcGVuZCBvbiB0aGUgSS9PIHRpbWluZy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1RlbG5ldF17c2V0X29wdGlvbl9uZWdvdGlhdGlvbl9jYWxsYmFja317Y2FsbGJhY2t9Ci1FYWNoIHRpbWUgYSB0ZWxuZXQgb3B0aW9uIGlzIHJlYWQgb24gdGhlIGlucHV0IGZsb3csIHRoaXMKLVx2YXJ7Y2FsbGJhY2t9IChpZiBzZXQpIGlzIGNhbGxlZCB3aXRoIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyA6Ci1jYWxsYmFjayh0ZWxuZXQgc29ja2V0LCBjb21tYW5kIChETy9ET05UL1dJTEwvV09OVCksIG9wdGlvbikuICBObyBvdGhlcgotYWN0aW9uIGlzIGRvbmUgYWZ0ZXJ3YXJkcyBieSB0ZWxuZXRsaWIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLQotXHN1YnNlY3Rpb257VGVsbmV0IEV4YW1wbGUgXGxhYmVse3RlbG5ldC1leGFtcGxlfX0KLVxzZWN0aW9uYXV0aG9ye1BldGVyIEZ1bmt9e3BmQGFydGNvbS1nbWJoLmRlfQotCi1BIHNpbXBsZSBleGFtcGxlIGlsbHVzdHJhdGluZyB0eXBpY2FsIHVzZToKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IGdldHBhc3MKLWltcG9ydCBzeXMKLWltcG9ydCB0ZWxuZXRsaWIKLQotZGVmIHJhd19pbnB1dChwcm9tcHQpOgotICAgIHN5cy5zdGRvdXQud3JpdGUocHJvbXB0KQotICAgIHN5cy5zdGRvdXQuZmx1c2goKQotICAgIHJldHVybiBzeXMuc3RkaW4ucmVhZGxpbmUoKQotCi1IT1NUID0gImxvY2FsaG9zdCIKLXVzZXIgPSByYXdfaW5wdXQoIkVudGVyIHlvdXIgcmVtb3RlIGFjY291bnQ6ICIpCi1wYXNzd29yZCA9IGdldHBhc3MuZ2V0cGFzcygpCi0KLXRuID0gdGVsbmV0bGliLlRlbG5ldChIT1NUKQotCi10bi5yZWFkX3VudGlsKCJsb2dpbjogIikKLXRuLndyaXRlKHVzZXIgKyAiXG4iKQotaWYgcGFzc3dvcmQ6Ci0gICAgdG4ucmVhZF91bnRpbCgiUGFzc3dvcmQ6ICIpCi0gICAgdG4ud3JpdGUocGFzc3dvcmQgKyAiXG4iKQotCi10bi53cml0ZSgibHNcbiIpCi10bi53cml0ZSgiZXhpdFxuIikKLQotcHJpbnQgdG4ucmVhZF9hbGwoKQotXGVuZHt2ZXJiYXRpbX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlidGVtcGZpbGUudGV4IGIvRG9jL2xpYi9saWJ0ZW1wZmlsZS50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYzU1OWUuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJ0ZW1wZmlsZS50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXt0ZW1wZmlsZX0gLS0tCi0gICAgICAgICBHZW5lcmF0ZSB0ZW1wb3JhcnkgZmlsZXMgYW5kIGRpcmVjdG9yaWVzfQotXHNlY3Rpb25hdXRob3J7WmFjayBXZWluYmVyZ317emFja0Bjb2Rlc291cmNlcnkuY29tfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17dGVtcGZpbGV9Ci1cbW9kdWxlc3lub3BzaXN7R2VuZXJhdGUgdGVtcG9yYXJ5IGZpbGVzIGFuZCBkaXJlY3Rvcmllcy59Ci0KLVxpbmRleGlpe3RlbXBvcmFyeX17ZmlsZSBuYW1lfQotXGluZGV4aWl7dGVtcG9yYXJ5fXtmaWxlfQotCi1UaGlzIG1vZHVsZSBnZW5lcmF0ZXMgdGVtcG9yYXJ5IGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4gIEl0IHdvcmtzIG9uCi1hbGwgc3VwcG9ydGVkIHBsYXRmb3Jtcy4KLQotSW4gdmVyc2lvbiAyLjMgb2YgUHl0aG9uLCB0aGlzIG1vZHVsZSB3YXMgb3ZlcmhhdWxlZCBmb3IgZW5oYW5jZWQKLXNlY3VyaXR5LiAgSXQgbm93IHByb3ZpZGVzIHRocmVlIG5ldyBmdW5jdGlvbnMsCi1cZnVuY3Rpb257TmFtZWRUZW1wb3JhcnlGaWxlKCl9LCBcZnVuY3Rpb257bWtzdGVtcCgpfSwgYW5kCi1cZnVuY3Rpb257bWtkdGVtcCgpfSwgd2hpY2ggc2hvdWxkIGVsaW1pbmF0ZSBhbGwgcmVtYWluaW5nIG5lZWQgdG8gdXNlCi10aGUgaW5zZWN1cmUgXGZ1bmN0aW9ue21rdGVtcCgpfSBmdW5jdGlvbi4gIFRlbXBvcmFyeSBmaWxlIG5hbWVzIGNyZWF0ZWQKLWJ5IHRoaXMgbW9kdWxlIG5vIGxvbmdlciBjb250YWluIHRoZSBwcm9jZXNzIElEOyBpbnN0ZWFkIGEgc3RyaW5nIG9mCi1zaXggcmFuZG9tIGNoYXJhY3RlcnMgaXMgdXNlZC4KLQotQWxzbywgYWxsIHRoZSB1c2VyLWNhbGxhYmxlIGZ1bmN0aW9ucyBub3cgdGFrZSBhZGRpdGlvbmFsIGFyZ3VtZW50cwotd2hpY2ggYWxsb3cgZGlyZWN0IGNvbnRyb2wgb3ZlciB0aGUgbG9jYXRpb24gYW5kIG5hbWUgb2YgdGVtcG9yYXJ5Ci1maWxlcy4gIEl0IGlzIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gdXNlIHRoZSBnbG9iYWwgXHZhcnt0ZW1wZGlyfSBhbmQKLVx2YXJ7dGVtcGxhdGV9IHZhcmlhYmxlcy4gIFRvIG1haW50YWluIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZQotYXJndW1lbnQgb3JkZXIgaXMgc29tZXdoYXQgb2RkOyBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2Uga2V5d29yZAotYXJndW1lbnRzIGZvciBjbGFyaXR5LgotCi1UaGUgbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyB1c2VyLWNhbGxhYmxlIGZ1bmN0aW9uczoKLQotXGJlZ2lue2Z1bmNkZXNjfXtUZW1wb3JhcnlGaWxlfXtcb3B0aW9uYWx7bW9kZT1cY29kZXsndytiJ31cb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZzaXplPVxjb2Rley0xfVxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeFxvcHRpb25hbHssIHByZWZpeFxvcHRpb25hbHssIGRpcn19fX19fQotUmV0dXJuIGEgZmlsZSAob3IgZmlsZS1saWtlKSBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIHRlbXBvcmFyeQotc3RvcmFnZSBhcmVhLiAgVGhlIGZpbGUgaXMgY3JlYXRlZCB1c2luZyBcZnVuY3Rpb257bWtzdGVtcH0uIEl0IHdpbGwKLWJlIGRlc3Ryb3llZCBhcyBzb29uIGFzIGl0IGlzIGNsb3NlZCAoaW5jbHVkaW5nIGFuIGltcGxpY2l0IGNsb3NlIHdoZW4KLXRoZSBvYmplY3QgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQpLiAgVW5kZXIgXFVOSVgsIHRoZSBkaXJlY3RvcnkgZW50cnkKLWZvciB0aGUgZmlsZSBpcyByZW1vdmVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBmaWxlIGlzIGNyZWF0ZWQuICBPdGhlcgotcGxhdGZvcm1zIGRvIG5vdCBzdXBwb3J0IHRoaXM7IHlvdXIgY29kZSBzaG91bGQgbm90IHJlbHkgb24gYQotdGVtcG9yYXJ5IGZpbGUgY3JlYXRlZCB1c2luZyB0aGlzIGZ1bmN0aW9uIGhhdmluZyBvciBub3QgaGF2aW5nIGEKLXZpc2libGUgbmFtZSBpbiB0aGUgZmlsZSBzeXN0ZW0uCi0KLVRoZSBcdmFye21vZGV9IHBhcmFtZXRlciBkZWZhdWx0cyB0byBcY29kZXsndytiJ30gc28gdGhhdCB0aGUgZmlsZQotY3JlYXRlZCBjYW4gYmUgcmVhZCBhbmQgd3JpdHRlbiB3aXRob3V0IGJlaW5nIGNsb3NlZC4gIEJpbmFyeSBtb2RlIGlzCi11c2VkIHNvIHRoYXQgaXQgYmVoYXZlcyBjb25zaXN0ZW50bHkgb24gYWxsIHBsYXRmb3JtcyB3aXRob3V0IHJlZ2FyZAotZm9yIHRoZSBkYXRhIHRoYXQgaXMgc3RvcmVkLiAgXHZhcntidWZzaXplfSBkZWZhdWx0cyB0byBcY29kZXstMX0sCi1tZWFuaW5nIHRoYXQgdGhlIG9wZXJhdGluZyBzeXN0ZW0gZGVmYXVsdCBpcyB1c2VkLgotCi1UaGUgXHZhcntkaXJ9LCBcdmFye3ByZWZpeH0gYW5kIFx2YXJ7c3VmZml4fSBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQgdG8KLVxmdW5jdGlvbntta3N0ZW1wKCl9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtOYW1lZFRlbXBvcmFyeUZpbGV9e1xvcHRpb25hbHttb2RlPVxjb2Rleyd3K2InfVxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmc2l6ZT1cY29kZXstMX1cb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeFxvcHRpb25hbHssIHByZWZpeFxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyXG9wdGlvbmFseywgZGVsZXRlfX19fX19fQotVGhpcyBmdW5jdGlvbiBvcGVyYXRlcyBleGFjdGx5IGFzIFxmdW5jdGlvbntUZW1wb3JhcnlGaWxlKCl9IGRvZXMsCi1leGNlcHQgdGhhdCB0aGUgZmlsZSBpcyBndWFyYW50ZWVkIHRvIGhhdmUgYSB2aXNpYmxlIG5hbWUgaW4gdGhlIGZpbGUKLXN5c3RlbSAob24gXFVOSVgsIHRoZSBkaXJlY3RvcnkgZW50cnkgaXMgbm90IHVubGlua2VkKS4gIFRoYXQgbmFtZSBjYW4KLWJlIHJldHJpZXZlZCBmcm9tIHRoZSBcbWVtYmVye25hbWV9IG1lbWJlciBvZiB0aGUgZmlsZSBvYmplY3QuICBXaGV0aGVyCi10aGUgbmFtZSBjYW4gYmUgdXNlZCB0byBvcGVuIHRoZSBmaWxlIGEgc2Vjb25kIHRpbWUsIHdoaWxlIHRoZQotbmFtZWQgdGVtcG9yYXJ5IGZpbGUgaXMgc3RpbGwgb3BlbiwgdmFyaWVzIGFjcm9zcyBwbGF0Zm9ybXMgKGl0IGNhbgotYmUgc28gdXNlZCBvbiBcVU5JWDsgaXQgY2Fubm90IG9uIFdpbmRvd3MgTlQgb3IgbGF0ZXIpLgotSWYgXHZhcntkZWxldGV9IGlzIHRydWUgKHRoZSBkZWZhdWx0KSwgdGhlIGZpbGUgaXMgZGVsZXRlZCBhcyBzb29uIGFzCi1pdCBpcyBjbG9zZWQuCi1cdmVyc2lvbmFkZGVkezIuM30KLVx2ZXJzaW9uYWRkZWRbVGhlIFx2YXJ7ZGVsZXRlfSBwYXJhbWV0ZXJdezIuNn0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317U3Bvb2xlZFRlbXBvcmFyeUZpbGV9e1xvcHRpb25hbHttYXhcX3NpemU9XGNvZGV7MH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxvcHRpb25hbHttb2RlPVxjb2Rleyd3K2InfVxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnNpemU9XGNvZGV7LTF9XG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4XG9wdGlvbmFseywgcHJlZml4XG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyfX19fX19fQotVGhpcyBmdW5jdGlvbiBvcGVyYXRlcyBleGFjdGx5IGFzIFxmdW5jdGlvbntUZW1wb3JhcnlGaWxlKCl9IGRvZXMsCi1leGNlcHQgdGhhdCBkYXRhIGlzIHNwb29sZWQgaW4gbWVtb3J5IHVudGlsIHRoZSBmaWxlIHNpemUgZXhjZWVkcwotXHZhcnttYXhfc2l6ZX0sIG9yIHVudGlsIHRoZSBmaWxlJ3MgXGZ1bmN0aW9ue2ZpbGVubygpfSBtZXRob2QgaXMKLWNhbGxlZCwgYXQgd2hpY2ggcG9pbnQgdGhlIGNvbnRlbnRzIGFyZSB3cml0dGVuIHRvIGRpc2sgYW5kIG9wZXJhdGlvbgotcHJvY2VlZHMgYXMgd2l0aCBcZnVuY3Rpb257VGVtcG9yYXJ5RmlsZSgpfS4KLQotVGhlIHJlc3VsdGluZyBmaWxlIGhhcyBvbmUgYWRkaXRpb25hbCBtZXRob2QsIFxmdW5jdGlvbntyb2xsb3ZlcigpfSwKLXdoaWNoIGNhdXNlcyB0aGUgZmlsZSB0byByb2xsIG92ZXIgdG8gYW4gb24tZGlzayBmaWxlIHJlZ2FyZGxlc3Mgb2YKLWl0cyBzaXplLgotXHZlcnNpb25hZGRlZHsyLjZ9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e21rc3RlbXB9e1xvcHRpb25hbHtzdWZmaXhcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhcb3B0aW9uYWx7LCBkaXJcb3B0aW9uYWx7LCB0ZXh0fX19fX0KLUNyZWF0ZXMgYSB0ZW1wb3JhcnkgZmlsZSBpbiB0aGUgbW9zdCBzZWN1cmUgbWFubmVyIHBvc3NpYmxlLiAgVGhlcmUKLWFyZSBubyByYWNlIGNvbmRpdGlvbnMgaW4gdGhlIGZpbGUncyBjcmVhdGlvbiwgYXNzdW1pbmcgdGhhdCB0aGUKLXBsYXRmb3JtIHByb3Blcmx5IGltcGxlbWVudHMgdGhlIFxjb25zdGFudHtPX0VYQ0x9IGZsYWcgZm9yCi1cZnVuY3Rpb257b3Mub3BlbigpfS4gIFRoZSBmaWxlIGlzIHJlYWRhYmxlIGFuZCB3cml0YWJsZSBvbmx5IGJ5IHRoZQotY3JlYXRpbmcgdXNlciBJRC4gIElmIHRoZSBwbGF0Zm9ybSB1c2VzIHBlcm1pc3Npb24gYml0cyB0byBpbmRpY2F0ZQotd2hldGhlciBhIGZpbGUgaXMgZXhlY3V0YWJsZSwgdGhlIGZpbGUgaXMgZXhlY3V0YWJsZSBieSBubyBvbmUuICBUaGUKLWZpbGUgZGVzY3JpcHRvciBpcyBub3QgaW5oZXJpdGVkIGJ5IGNoaWxkIHByb2Nlc3Nlcy4KLQotVW5saWtlIFxmdW5jdGlvbntUZW1wb3JhcnlGaWxlKCl9LCB0aGUgdXNlciBvZiBcZnVuY3Rpb257bWtzdGVtcCgpfSBpcwotcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSB0ZW1wb3JhcnkgZmlsZSB3aGVuIGRvbmUgd2l0aCBpdC4KLQotSWYgXHZhcntzdWZmaXh9IGlzIHNwZWNpZmllZCwgdGhlIGZpbGUgbmFtZSB3aWxsIGVuZCB3aXRoIHRoYXQgc3VmZml4LAotb3RoZXJ3aXNlIHRoZXJlIHdpbGwgYmUgbm8gc3VmZml4LiAgXGZ1bmN0aW9ue21rc3RlbXAoKX0gZG9lcyBub3QgcHV0IGEKLWRvdCBiZXR3ZWVuIHRoZSBmaWxlIG5hbWUgYW5kIHRoZSBzdWZmaXg7IGlmIHlvdSBuZWVkIG9uZSwgcHV0IGl0IGF0Ci10aGUgYmVnaW5uaW5nIG9mIFx2YXJ7c3VmZml4fS4KLQotSWYgXHZhcntwcmVmaXh9IGlzIHNwZWNpZmllZCwgdGhlIGZpbGUgbmFtZSB3aWxsIGJlZ2luIHdpdGggdGhhdAotcHJlZml4OyBvdGhlcndpc2UsIGEgZGVmYXVsdCBwcmVmaXggaXMgdXNlZC4KLQotSWYgXHZhcntkaXJ9IGlzIHNwZWNpZmllZCwgdGhlIGZpbGUgd2lsbCBiZSBjcmVhdGVkIGluIHRoYXQgZGlyZWN0b3J5Owotb3RoZXJ3aXNlLCBhIGRlZmF1bHQgZGlyZWN0b3J5IGlzIHVzZWQuICBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXMgY2hvc2VuCi1mcm9tIGEgcGxhdGZvcm0tZGVwZW5kZW50IGxpc3QsIGJ1dCB0aGUgdXNlciBvZiB0aGUgYXBwbGljYXRpb24gY2FuIGNvbnRyb2wKLXRoZSBkaXJlY3RvcnkgbG9jYXRpb24gYnkgc2V0dGluZyB0aGUgXHZhcntUTVBESVJ9LCBcdmFye1RFTVB9IG9yIFx2YXJ7VE1QfQotZW52aXJvbm1lbnQgdmFyaWFibGVzLiAgVGhlcmUgaXMgdGh1cyBubyBndWFyYW50ZWUgdGhhdCB0aGUgZ2VuZXJhdGVkCi1maWxlbmFtZSB3aWxsIGhhdmUgYW55IG5pY2UgcHJvcGVydGllcywgc3VjaCBhcyBub3QgcmVxdWlyaW5nIHF1b3Rpbmcgd2hlbgotcGFzc2VkIHRvIGV4dGVybmFsIGNvbW1hbmRzIHZpYSBcY29kZXtvcy5wb3BlbigpfS4KLQotSWYgXHZhcnt0ZXh0fSBpcyBzcGVjaWZpZWQsIGl0IGluZGljYXRlcyB3aGV0aGVyIHRvIG9wZW4gdGhlIGZpbGUgaW4KLWJpbmFyeSBtb2RlICh0aGUgZGVmYXVsdCkgb3IgdGV4dCBtb2RlLiAgT24gc29tZSBwbGF0Zm9ybXMsIHRoaXMgbWFrZXMKLW5vIGRpZmZlcmVuY2UuCi0KLVxmdW5jdGlvbntta3N0ZW1wKCl9IHJldHVybnMgYSB0dXBsZSBjb250YWluaW5nIGFuIE9TLWxldmVsIGhhbmRsZSB0bwotYW4gb3BlbiBmaWxlIChhcyB3b3VsZCBiZSByZXR1cm5lZCBieSBcZnVuY3Rpb257b3Mub3BlbigpfSkgYW5kIHRoZQotYWJzb2x1dGUgcGF0aG5hbWUgb2YgdGhhdCBmaWxlLCBpbiB0aGF0IG9yZGVyLgotXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e21rZHRlbXB9e1xvcHRpb25hbHtzdWZmaXhcb3B0aW9uYWx7LCBwcmVmaXhcb3B0aW9uYWx7LCBkaXJ9fX19Ci1DcmVhdGVzIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiB0aGUgbW9zdCBzZWN1cmUgbWFubmVyIHBvc3NpYmxlLgotVGhlcmUgYXJlIG5vIHJhY2UgY29uZGl0aW9ucyBpbiB0aGUgZGlyZWN0b3J5J3MgY3JlYXRpb24uICBUaGUKLWRpcmVjdG9yeSBpcyByZWFkYWJsZSwgd3JpdGFibGUsIGFuZCBzZWFyY2hhYmxlIG9ubHkgYnkgdGhlCi1jcmVhdGluZyB1c2VyIElELgotCi1UaGUgdXNlciBvZiBcZnVuY3Rpb257bWtkdGVtcCgpfSBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlCi10ZW1wb3JhcnkgZGlyZWN0b3J5IGFuZCBpdHMgY29udGVudHMgd2hlbiBkb25lIHdpdGggaXQuCi0KLVRoZSBcdmFye3ByZWZpeH0sIFx2YXJ7c3VmZml4fSwgYW5kIFx2YXJ7ZGlyfSBhcmd1bWVudHMgYXJlIHRoZSBzYW1lCi1hcyBmb3IgXGZ1bmN0aW9ue21rc3RlbXAoKX0uCi0KLVxmdW5jdGlvbntta2R0ZW1wKCl9IHJldHVybnMgdGhlIGFic29sdXRlIHBhdGhuYW1lIG9mIHRoZSBuZXcgZGlyZWN0b3J5LgotXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e21rdGVtcH17XG9wdGlvbmFse3N1ZmZpeFxvcHRpb25hbHssIHByZWZpeFxvcHRpb25hbHssIGRpcn19fX0KLVxkZXByZWNhdGVkezIuM317VXNlIFxmdW5jdGlvbntta3N0ZW1wKCl9IGluc3RlYWQufQotUmV0dXJuIGFuIGFic29sdXRlIHBhdGhuYW1lIG9mIGEgZmlsZSB0aGF0IGRpZCBub3QgZXhpc3QgYXQgdGhlIHRpbWUKLXRoZSBjYWxsIGlzIG1hZGUuICBUaGUgXHZhcntwcmVmaXh9LCBcdmFye3N1ZmZpeH0sIGFuZCBcdmFye2Rpcn0KLWFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgZm9yIFxmdW5jdGlvbntta3N0ZW1wKCl9LgotCi1cd2FybmluZ3tVc2Ugb2YgdGhpcyBmdW5jdGlvbiBtYXkgaW50cm9kdWNlIGEgc2VjdXJpdHkgaG9sZSBpbiB5b3VyCi1wcm9ncmFtLiAgQnkgdGhlIHRpbWUgeW91IGdldCBhcm91bmQgdG8gZG9pbmcgYW55dGhpbmcgd2l0aCB0aGUgZmlsZQotbmFtZSBpdCByZXR1cm5zLCBzb21lb25lIGVsc2UgbWF5IGhhdmUgYmVhdGVuIHlvdSB0byB0aGUgcHVuY2gufQotXGVuZHtmdW5jZGVzY30KLQotVGhlIG1vZHVsZSB1c2VzIHR3byBnbG9iYWwgdmFyaWFibGVzIHRoYXQgdGVsbCBpdCBob3cgdG8gY29uc3RydWN0IGEKLXRlbXBvcmFyeSBuYW1lLiAgVGhleSBhcmUgaW5pdGlhbGl6ZWQgYXQgdGhlIGZpcnN0IGNhbGwgdG8gYW55IG9mIHRoZQotZnVuY3Rpb25zIGFib3ZlLiAgVGhlIGNhbGxlciBtYXkgY2hhbmdlIHRoZW0sIGJ1dCB0aGlzIGlzIGRpc2NvdXJhZ2VkOwotdXNlIHRoZSBhcHByb3ByaWF0ZSBmdW5jdGlvbiBhcmd1bWVudHMsIGluc3RlYWQuCi0KLVxiZWdpbntkYXRhZGVzY317dGVtcGRpcn0KLVdoZW4gc2V0IHRvIGEgdmFsdWUgb3RoZXIgdGhhbiBcY29kZXtOb25lfSwgdGhpcyB2YXJpYWJsZSBkZWZpbmVzIHRoZQotZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIFx2YXJ7ZGlyfSBhcmd1bWVudCB0byBhbGwgdGhlIGZ1bmN0aW9ucyBkZWZpbmVkCi1pbiB0aGlzIG1vZHVsZS4KLQotSWYgXGNvZGV7dGVtcGRpcn0gaXMgdW5zZXQgb3IgXGNvZGV7Tm9uZX0gYXQgYW55IGNhbGwgdG8gYW55IG9mIHRoZQotYWJvdmUgZnVuY3Rpb25zLCBQeXRob24gc2VhcmNoZXMgYSBzdGFuZGFyZCBsaXN0IG9mIGRpcmVjdG9yaWVzIGFuZAotc2V0cyBcdmFye3RlbXBkaXJ9IHRvIHRoZSBmaXJzdCBvbmUgd2hpY2ggdGhlIGNhbGxpbmcgdXNlciBjYW4gY3JlYXRlCi1maWxlcyBpbi4gIFRoZSBsaXN0IGlzOgotCi1cYmVnaW57ZW51bWVyYXRlfQotXGl0ZW0gVGhlIGRpcmVjdG9yeSBuYW1lZCBieSB0aGUgXGVudnZhcntUTVBESVJ9IGVudmlyb25tZW50IHZhcmlhYmxlLgotXGl0ZW0gVGhlIGRpcmVjdG9yeSBuYW1lZCBieSB0aGUgXGVudnZhcntURU1QfSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KLVxpdGVtIFRoZSBkaXJlY3RvcnkgbmFtZWQgYnkgdGhlIFxlbnZ2YXJ7VE1QfSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KLVxpdGVtIEEgcGxhdGZvcm0tc3BlY2lmaWMgbG9jYXRpb246Ci0gICAgXGJlZ2lue2l0ZW1pemV9Ci0gICAgXGl0ZW0gT24gUmlzY09TLCB0aGUgZGlyZWN0b3J5IG5hbWVkIGJ5IHRoZQotICAgICAgICAgIFxlbnZ2YXJ7V2ltcFwkU2NyYXBEaXJ9IGVudmlyb25tZW50IHZhcmlhYmxlLgotICAgIFxpdGVtIE9uIFdpbmRvd3MsIHRoZSBkaXJlY3RvcmllcwotICAgICAgICAgIFxmaWxle0M6JFxiYWNrc2xhc2gkVEVNUH0sCi0gICAgICAgICAgXGZpbGV7QzokXGJhY2tzbGFzaCRUTVB9LAotICAgICAgICAgIFxmaWxleyRcYmFja3NsYXNoJFRFTVB9LCBhbmQKLSAgICAgICAgICBcZmlsZXskXGJhY2tzbGFzaCRUTVB9LCBpbiB0aGF0IG9yZGVyLgotICAgIFxpdGVtIE9uIGFsbCBvdGhlciBwbGF0Zm9ybXMsIHRoZSBkaXJlY3RvcmllcwotICAgICAgICAgIFxmaWxley90bXB9LCBcZmlsZXsvdmFyL3RtcH0sIGFuZCBcZmlsZXsvdXNyL3RtcH0sIGluIHRoYXQgb3JkZXIuCi0gICAgXGVuZHtpdGVtaXplfQotXGl0ZW0gQXMgYSBsYXN0IHJlc29ydCwgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCi1cZW5ke2VudW1lcmF0ZX0KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0dGVtcGRpcn17fQotUmV0dXJuIHRoZSBkaXJlY3RvcnkgY3VycmVudGx5IHNlbGVjdGVkIHRvIGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZXMgaW4uCi1JZiBcY29kZXt0ZW1wZGlyfSBpcyBub3QgXGNvZGV7Tm9uZX0sIHRoaXMgc2ltcGx5IHJldHVybnMgaXRzIGNvbnRlbnRzOwotb3RoZXJ3aXNlLCB0aGUgc2VhcmNoIGRlc2NyaWJlZCBhYm92ZSBpcyBwZXJmb3JtZWQsIGFuZCB0aGUgcmVzdWx0Ci1yZXR1cm5lZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317dGVtcGxhdGV9Ci1cZGVwcmVjYXRlZHsyLjB9e1VzZSBcZnVuY3Rpb257Z2V0dGVtcHByZWZpeCgpfSBpbnN0ZWFkLn0KLVdoZW4gc2V0IHRvIGEgdmFsdWUgb3RoZXIgdGhhbiBcY29kZXtOb25lfSwgdGhpcyB2YXJpYWJsZSBkZWZpbmVzIHRoZQotcHJlZml4IG9mIHRoZSBmaW5hbCBjb21wb25lbnQgb2YgdGhlIGZpbGVuYW1lcyByZXR1cm5lZCBieQotXGZ1bmN0aW9ue21rdGVtcCgpfS4gIEEgc3RyaW5nIG9mIHNpeCByYW5kb20gbGV0dGVycyBhbmQgZGlnaXRzIGlzCi1hcHBlbmRlZCB0byB0aGUgcHJlZml4IHRvIG1ha2UgdGhlIGZpbGVuYW1lIHVuaXF1ZS4gIE9uIFdpbmRvd3MsCi10aGUgZGVmYXVsdCBwcmVmaXggaXMgXGZpbGV7XHRleHRhc2NpaXRpbGRle31UfTsgb24gYWxsIG90aGVyIHN5c3RlbXMKLWl0IGlzIFxmaWxle3RtcH0uCi0KLU9sZGVyIHZlcnNpb25zIG9mIHRoaXMgbW9kdWxlIHVzZWQgdG8gcmVxdWlyZSB0aGF0IFxjb2Rle3RlbXBsYXRlfSBiZQotc2V0IHRvIFxjb2Rle05vbmV9IGFmdGVyIGEgY2FsbCB0byBcZnVuY3Rpb257b3MuZm9yaygpfTsgdGhpcyBoYXMgbm90Ci1iZWVuIG5lY2Vzc2FyeSBzaW5jZSB2ZXJzaW9uIDEuNS4yLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXR0ZW1wcHJlZml4fXt9Ci1SZXR1cm4gdGhlIGZpbGVuYW1lIHByZWZpeCB1c2VkIHRvIGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZXMuICBUaGlzIGRvZXMKLW5vdCBjb250YWluIHRoZSBkaXJlY3RvcnkgY29tcG9uZW50LiAgVXNpbmcgdGhpcyBmdW5jdGlvbiBpcyBwcmVmZXJyZWQKLW92ZXIgcmVhZGluZyB0aGUgXHZhcnt0ZW1wbGF0ZX0gdmFyaWFibGUgZGlyZWN0bHkuCi1cdmVyc2lvbmFkZGVkezEuNS4yfQotXGVuZHtmdW5jZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlidGVybWlvcy50ZXggYi9Eb2MvbGliL2xpYnRlcm1pb3MudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGYzNDM4Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlidGVybWlvcy50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXt0ZXJtaW9zfSAtLS0KLSAgICAgICAgIFxQT1NJWHt9IHN0eWxlIHR0eSBjb250cm9sfQotCi1cZGVjbGFyZW1vZHVsZXtidWlsdGlufXt0ZXJtaW9zfQotICBccGxhdGZvcm17VW5peH0KLVxtb2R1bGVzeW5vcHNpc3tcUE9TSVhcIHN0eWxlIHR0eSBjb250cm9sLn0KLQotXGluZGV4aWl7XFBPU0lYfXtJL08gY29udHJvbH0KLVxpbmRleGlpe3R0eX17SS9PIGNvbnRyb2x9Ci0KLQotVGhpcyBtb2R1bGUgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIHRoZSBcUE9TSVh7fSBjYWxscyBmb3IgdHR5IEkvTwotY29udHJvbC4gIEZvciBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZXNlIGNhbGxzLCBzZWUgdGhlIFxQT1NJWHt9IG9yCi1cVU5JWHt9IG1hbnVhbCBwYWdlcy4gIEl0IGlzIG9ubHkgYXZhaWxhYmxlIGZvciB0aG9zZSBcVU5JWHt9IHZlcnNpb25zCi10aGF0IHN1cHBvcnQgXFBPU0lYe30gXGVtcGh7dGVybWlvc30gc3R5bGUgdHR5IEkvTyBjb250cm9sIChhbmQgdGhlbgotb25seSBpZiBjb25maWd1cmVkIGF0IGluc3RhbGxhdGlvbiB0aW1lKS4KLQotQWxsIGZ1bmN0aW9ucyBpbiB0aGlzIG1vZHVsZSB0YWtlIGEgZmlsZSBkZXNjcmlwdG9yIFx2YXJ7ZmR9IGFzIHRoZWlyCi1maXJzdCBhcmd1bWVudC4gIFRoaXMgY2FuIGJlIGFuIGludGVnZXIgZmlsZSBkZXNjcmlwdG9yLCBzdWNoIGFzCi1yZXR1cm5lZCBieSBcY29kZXtzeXMuc3RkaW4uZmlsZW5vKCl9LCBvciBhIGZpbGUgb2JqZWN0LCBzdWNoIGFzCi1cY29kZXtzeXMuc3RkaW59IGl0c2VsZi4KLQotVGhpcyBtb2R1bGUgYWxzbyBkZWZpbmVzIGFsbCB0aGUgY29uc3RhbnRzIG5lZWRlZCB0byB3b3JrIHdpdGggdGhlCi1mdW5jdGlvbnMgcHJvdmlkZWQgaGVyZTsgdGhlc2UgaGF2ZSB0aGUgc2FtZSBuYW1lIGFzIHRoZWlyCi1jb3VudGVycGFydHMgaW4gQy4gIFBsZWFzZSByZWZlciB0byB5b3VyIHN5c3RlbSBkb2N1bWVudGF0aW9uIGZvciBtb3JlCi1pbmZvcm1hdGlvbiBvbiB1c2luZyB0aGVzZSB0ZXJtaW5hbCBjb250cm9sIGludGVyZmFjZXMuCi0KLVRoZSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKLQotXGJlZ2lue2Z1bmNkZXNjfXt0Y2dldGF0dHJ9e2ZkfQotUmV0dXJuIGEgbGlzdCBjb250YWluaW5nIHRoZSB0dHkgYXR0cmlidXRlcyBmb3IgZmlsZSBkZXNjcmlwdG9yCi1cdmFye2ZkfSwgYXMgZm9sbG93czogXGNvZGV7W31cdmFye2lmbGFnfSwgXHZhcntvZmxhZ30sIFx2YXJ7Y2ZsYWd9LAotXHZhcntsZmxhZ30sIFx2YXJ7aXNwZWVkfSwgXHZhcntvc3BlZWR9LCBcdmFye2NjfVxjb2Rle119IHdoZXJlCi1cdmFye2NjfSBpcyBhIGxpc3Qgb2YgdGhlIHR0eSBzcGVjaWFsIGNoYXJhY3RlcnMgKGVhY2ggYSBzdHJpbmcgb2YKLWxlbmd0aCAxLCBleGNlcHQgdGhlIGl0ZW1zIHdpdGggaW5kaWNlcyBcY29uc3RhbnR7Vk1JTn0gYW5kCi1cY29uc3RhbnR7VlRJTUV9LCB3aGljaCBhcmUgaW50ZWdlcnMgd2hlbiB0aGVzZSBmaWVsZHMgYXJlCi1kZWZpbmVkKS4gIFRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgZmxhZ3MgYW5kIHRoZSBzcGVlZHMgYXMgd2VsbCBhcwotdGhlIGluZGV4aW5nIGluIHRoZSBcdmFye2NjfSBhcnJheSBtdXN0IGJlIGRvbmUgdXNpbmcgdGhlIHN5bWJvbGljCi1jb25zdGFudHMgZGVmaW5lZCBpbiB0aGUgXG1vZHVsZXt0ZXJtaW9zfQotbW9kdWxlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt0Y3NldGF0dHJ9e2ZkLCB3aGVuLCBhdHRyaWJ1dGVzfQotU2V0IHRoZSB0dHkgYXR0cmlidXRlcyBmb3IgZmlsZSBkZXNjcmlwdG9yIFx2YXJ7ZmR9IGZyb20gdGhlCi1cdmFye2F0dHJpYnV0ZXN9LCB3aGljaCBpcyBhIGxpc3QgbGlrZSB0aGUgb25lIHJldHVybmVkIGJ5Ci1cZnVuY3Rpb257dGNnZXRhdHRyKCl9LiAgVGhlIFx2YXJ7d2hlbn0gYXJndW1lbnQgZGV0ZXJtaW5lcyB3aGVuIHRoZQotYXR0cmlidXRlcyBhcmUgY2hhbmdlZDogXGNvbnN0YW50e1RDU0FOT1d9IHRvIGNoYW5nZSBpbW1lZGlhdGVseSwKLVxjb25zdGFudHtUQ1NBRFJBSU59IHRvIGNoYW5nZSBhZnRlciB0cmFuc21pdHRpbmcgYWxsIHF1ZXVlZCBvdXRwdXQsCi1vciBcY29uc3RhbnR7VENTQUZMVVNIfSB0byBjaGFuZ2UgYWZ0ZXIgdHJhbnNtaXR0aW5nIGFsbCBxdWV1ZWQKLW91dHB1dCBhbmQgZGlzY2FyZGluZyBhbGwgcXVldWVkIGlucHV0LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt0Y3NlbmRicmVha317ZmQsIGR1cmF0aW9ufQotU2VuZCBhIGJyZWFrIG9uIGZpbGUgZGVzY3JpcHRvciBcdmFye2ZkfS4gIEEgemVybyBcdmFye2R1cmF0aW9ufSBzZW5kcwotYSBicmVhayBmb3IgMC4yNS0tMC41IHNlY29uZHM7IGEgbm9uemVybyBcdmFye2R1cmF0aW9ufSBoYXMgYSBzeXN0ZW0KLWRlcGVuZGVudCBtZWFuaW5nLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt0Y2RyYWlufXtmZH0KLVdhaXQgdW50aWwgYWxsIG91dHB1dCB3cml0dGVuIHRvIGZpbGUgZGVzY3JpcHRvciBcdmFye2ZkfSBoYXMgYmVlbgotdHJhbnNtaXR0ZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3RjZmx1c2h9e2ZkLCBxdWV1ZX0KLURpc2NhcmQgcXVldWVkIGRhdGEgb24gZmlsZSBkZXNjcmlwdG9yIFx2YXJ7ZmR9LiAgVGhlIFx2YXJ7cXVldWV9Ci1zZWxlY3RvciBzcGVjaWZpZXMgd2hpY2ggcXVldWU6IFxjb25zdGFudHtUQ0lGTFVTSH0gZm9yIHRoZSBpbnB1dAotcXVldWUsIFxjb25zdGFudHtUQ09GTFVTSH0gZm9yIHRoZSBvdXRwdXQgcXVldWUsIG9yCi1cY29uc3RhbnR7VENJT0ZMVVNIfSBmb3IgYm90aCBxdWV1ZXMuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3RjZmxvd317ZmQsIGFjdGlvbn0KLVN1c3BlbmQgb3IgcmVzdW1lIGlucHV0IG9yIG91dHB1dCBvbiBmaWxlIGRlc2NyaXB0b3IgXHZhcntmZH0uICBUaGUKLVx2YXJ7YWN0aW9ufSBhcmd1bWVudCBjYW4gYmUgXGNvbnN0YW50e1RDT09GRn0gdG8gc3VzcGVuZCBvdXRwdXQsCi1cY29uc3RhbnR7VENPT059IHRvIHJlc3RhcnQgb3V0cHV0LCBcY29uc3RhbnR7VENJT0ZGfSB0byBzdXNwZW5kCi1pbnB1dCwgb3IgXGNvbnN0YW50e1RDSU9OfSB0byByZXN0YXJ0IGlucHV0LgotXGVuZHtmdW5jZGVzY30KLQotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZW1vZHVsZXt0dHl9e0NvbnZlbmllbmNlIGZ1bmN0aW9ucyBmb3IgY29tbW9uIHRlcm1pbmFsIGNvbnRyb2wKLSAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbnMufQotXGVuZHtzZWVhbHNvfQotCi0KLVxzdWJzZWN0aW9ue0V4YW1wbGV9Ci1cbm9kZW5hbWV7dGVybWlvcyBFeGFtcGxlfQotCi1IZXJlJ3MgYSBmdW5jdGlvbiB0aGF0IHByb21wdHMgZm9yIGEgcGFzc3dvcmQgd2l0aCBlY2hvaW5nIHR1cm5lZAotb2ZmLiAgTm90ZSB0aGUgdGVjaG5pcXVlIHVzaW5nIGEgc2VwYXJhdGUgXGZ1bmN0aW9ue3RjZ2V0YXR0cigpfSBjYWxsCi1hbmQgYSBca2V5d29yZHt0cnl9IC4uLiBca2V5d29yZHtmaW5hbGx5fSBzdGF0ZW1lbnQgdG8gZW5zdXJlIHRoYXQgdGhlCi1vbGQgdHR5IGF0dHJpYnV0ZXMgYXJlIHJlc3RvcmVkIGV4YWN0bHkgbm8gbWF0dGVyIHdoYXQgaGFwcGVuczoKLQotXGJlZ2lue3ZlcmJhdGltfQotZGVmIHJhd19pbnB1dChwcm9tcHQpOgotICAgIGltcG9ydCBzeXMKLSAgICBzeXMuc3Rkb3V0LndyaXRlKHByb21wdCkKLSAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKLSAgICByZXR1cm4gc3lzLnN0ZGluLnJlYWRsaW5lKCkKLQotZGVmIGdldHBhc3MocHJvbXB0ID0gIlBhc3N3b3JkOiAiKToKLSAgICBpbXBvcnQgdGVybWlvcywgc3lzCi0gICAgZmQgPSBzeXMuc3RkaW4uZmlsZW5vKCkKLSAgICBvbGQgPSB0ZXJtaW9zLnRjZ2V0YXR0cihmZCkKLSAgICBuZXcgPSB0ZXJtaW9zLnRjZ2V0YXR0cihmZCkKLSAgICBuZXdbM10gPSBuZXdbM10gJiB+dGVybWlvcy5FQ0hPICAgICAgICAgICMgbGZsYWdzCi0gICAgdHJ5OgotICAgICAgICB0ZXJtaW9zLnRjc2V0YXR0cihmZCwgdGVybWlvcy5UQ1NBRFJBSU4sIG5ldykKLSAgICAgICAgcGFzc3dkID0gcmF3X2lucHV0KHByb21wdCkKLSAgICBmaW5hbGx5OgotICAgICAgICB0ZXJtaW9zLnRjc2V0YXR0cihmZCwgdGVybWlvcy5UQ1NBRFJBSU4sIG9sZCkKLSAgICByZXR1cm4gcGFzc3dkCi1cZW5ke3ZlcmJhdGltfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ0ZXN0LnRleCBiL0RvYy9saWIvbGlidGVzdC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNTgwODkuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJ0ZXN0LnRleAorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3Rlc3R9IC0tLQotICAgICAgICAgUmVncmVzc2lvbiB0ZXN0cyBwYWNrYWdlIGZvciBQeXRob259Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXt0ZXN0fQotXHNlY3Rpb25hdXRob3J7QnJldHQgQ2Fubm9ufXticmV0dEBweXRob24ub3JnfQotXG1vZHVsZXN5bm9wc2lze1JlZ3Jlc3Npb24gdGVzdHMgcGFja2FnZSBjb250YWluaW5nIHRoZSB0ZXN0aW5nIHN1aXRlCi0gICAgICAgICAgICAgICAgZm9yIFB5dGhvbi59Ci0KLQotVGhlIFxtb2R1bGV7dGVzdH0gcGFja2FnZSBjb250YWlucyBhbGwgcmVncmVzc2lvbiB0ZXN0cyBmb3IgUHl0aG9uIGFzCi13ZWxsIGFzIHRoZSBtb2R1bGVzIFxtb2R1bGV7dGVzdC50ZXN0X3N1cHBvcnR9IGFuZAotXG1vZHVsZXt0ZXN0LnJlZ3J0ZXN0fS4gIFxtb2R1bGV7dGVzdC50ZXN0X3N1cHBvcnR9IGlzIHVzZWQgdG8gZW5oYW5jZQoteW91ciB0ZXN0cyB3aGlsZSBcbW9kdWxle3Rlc3QucmVncnRlc3R9IGRyaXZlcyB0aGUgdGVzdGluZyBzdWl0ZS4KLQotRWFjaCBtb2R1bGUgaW4gdGhlIFxtb2R1bGV7dGVzdH0gcGFja2FnZSB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoCi1cc2FtcHt0ZXN0X30gaXMgYSB0ZXN0aW5nIHN1aXRlIGZvciBhIHNwZWNpZmljIG1vZHVsZSBvciBmZWF0dXJlLgotQWxsIG5ldyB0ZXN0cyBzaG91bGQgYmUgd3JpdHRlbiB1c2luZyB0aGUgXHJlZm1vZHVsZXt1bml0dGVzdH0gb3IKLVxyZWZtb2R1bGV7ZG9jdGVzdH0gbW9kdWxlLiAgU29tZSBvbGRlciB0ZXN0cyBhcmUKLXdyaXR0ZW4gdXNpbmcgYSBgYHRyYWRpdGlvbmFsJycgdGVzdGluZyBzdHlsZSB0aGF0IGNvbXBhcmVzIG91dHB1dAotcHJpbnRlZCB0byBcY29kZXtzeXMuc3Rkb3V0fTsgdGhpcyBzdHlsZSBvZiB0ZXN0IGlzIGNvbnNpZGVyZWQKLWRlcHJlY2F0ZWQuCi0KLVxiZWdpbntzZWVhbHNvfQotXHNlZW1vZHVsZXt1bml0dGVzdH17V3JpdGluZyBQeVVuaXQgcmVncmVzc2lvbiB0ZXN0cy59Ci1cc2VlbW9kdWxle2RvY3Rlc3R9e1Rlc3RzIGVtYmVkZGVkIGluIGRvY3VtZW50YXRpb24gc3RyaW5ncy59Ci1cZW5ke3NlZWFsc299Ci0KLQotXHN1YnNlY3Rpb257V3JpdGluZyBVbml0IFRlc3RzIGZvciB0aGUgXG1vZHVsZXt0ZXN0fSBwYWNrYWdlJQotICAgICAgICAgICAgXGxhYmVse3dyaXRpbmctdGVzdHN9fQotCi1JdCBpcyBwcmVmZXJyZWQgdGhhdCB0ZXN0cyB0aGF0IHVzZSB0aGUgXHJlZm1vZHVsZXt1bml0dGVzdH0gbW9kdWxlCi1mb2xsb3cgYSBmZXcgZ3VpZGVsaW5lcy4KLU9uZSBpcyB0byBuYW1lIHRoZSB0ZXN0IG1vZHVsZSBieSBzdGFydGluZyBpdCB3aXRoIFxzYW1we3Rlc3RffSBhbmQgZW5kIGl0IHdpdGgKLXRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgYmVpbmcgdGVzdGVkLgotVGhlIHRlc3QgbWV0aG9kcyBpbiB0aGUgdGVzdCBtb2R1bGUgc2hvdWxkIHN0YXJ0IHdpdGggXHNhbXB7dGVzdF99IGFuZCBlbmQgd2l0aAotYSBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoZSBtZXRob2QgaXMgdGVzdGluZy4KLVRoaXMgaXMgbmVlZGVkIHNvIHRoYXQgdGhlIG1ldGhvZHMgYXJlIHJlY29nbml6ZWQgYnkgdGhlIHRlc3QgZHJpdmVyIGFzCi10ZXN0IG1ldGhvZHMuCi1BbHNvLCBubyBkb2N1bWVudGF0aW9uIHN0cmluZyBmb3IgdGhlIG1ldGhvZCBzaG91bGQgYmUgaW5jbHVkZWQuCi1BIGNvbW1lbnQgKHN1Y2ggYXMKLVxzYW1we1wjIFRlc3RzIGZ1bmN0aW9uIHJldHVybnMgb25seSBUcnVlIG9yIEZhbHNlfSkgc2hvdWxkIGJlIHVzZWQgdG8gcHJvdmlkZQotZG9jdW1lbnRhdGlvbiBmb3IgdGVzdCBtZXRob2RzLgotVGhpcyBpcyBkb25lIGJlY2F1c2UgZG9jdW1lbnRhdGlvbiBzdHJpbmdzIGdldCBwcmludGVkIG91dCBpZiB0aGV5IGV4aXN0IGFuZAotdGh1cyB3aGF0IHRlc3QgaXMgYmVpbmcgcnVuIGlzIG5vdCBzdGF0ZWQuCi0KLUEgYmFzaWMgYm9pbGVycGxhdGUgaXMgb2Z0ZW4gdXNlZDoKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAotCi1jbGFzcyBNeVRlc3RDYXNlMSh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0KLSAgICAjIE9ubHkgdXNlIHNldFVwKCkgYW5kIHRlYXJEb3duKCkgaWYgbmVjZXNzYXJ5Ci0KLSAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIC4uLiBjb2RlIHRvIGV4ZWN1dGUgaW4gcHJlcGFyYXRpb24gZm9yIHRlc3RzIC4uLgotCi0gICAgZGVmIHRlYXJEb3duKHNlbGYpOgotICAgICAgICAuLi4gY29kZSB0byBleGVjdXRlIHRvIGNsZWFuIHVwIGFmdGVyIHRlc3RzIC4uLgotCi0gICAgZGVmIHRlc3RfZmVhdHVyZV9vbmUoc2VsZik6Ci0gICAgICAgICMgVGVzdCBmZWF0dXJlIG9uZS4KLSAgICAgICAgLi4uIHRlc3RpbmcgY29kZSAuLi4KLQotICAgIGRlZiB0ZXN0X2ZlYXR1cmVfdHdvKHNlbGYpOgotICAgICAgICAjIFRlc3QgZmVhdHVyZSB0d28uCi0gICAgICAgIC4uLiB0ZXN0aW5nIGNvZGUgLi4uCi0KLSAgICAuLi4gbW9yZSB0ZXN0IG1ldGhvZHMgLi4uCi0KLWNsYXNzIE15VGVzdENhc2UyKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICAuLi4gc2FtZSBzdHJ1Y3R1cmUgYXMgTXlUZXN0Q2FzZTEgLi4uCi0KLS4uLiBtb3JlIHRlc3QgY2xhc3NlcyAuLi4KLQotZGVmIHRlc3RfbWFpbigpOgotICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoTXlUZXN0Q2FzZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNeVRlc3RDYXNlMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLiBsaXN0IG90aGVyIHRlc3RzIC4uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgdGVzdF9tYWluKCkKLVxlbmR7dmVyYmF0aW19Ci0KLVRoaXMgYm9pbGVycGxhdGUgY29kZSBhbGxvd3MgdGhlIHRlc3Rpbmcgc3VpdGUgdG8gYmUgcnVuIGJ5Ci1cbW9kdWxle3Rlc3QucmVncnRlc3R9IGFzIHdlbGwgYXMgb24gaXRzIG93biBhcyBhIHNjcmlwdC4KLQotVGhlIGdvYWwgZm9yIHJlZ3Jlc3Npb24gdGVzdGluZyBpcyB0byB0cnkgdG8gYnJlYWsgY29kZS4KLVRoaXMgbGVhZHMgdG8gYSBmZXcgZ3VpZGVsaW5lcyB0byBiZSBmb2xsb3dlZDoKLQotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSBUaGUgdGVzdGluZyBzdWl0ZSBzaG91bGQgZXhlcmNpc2UgYWxsIGNsYXNzZXMsIGZ1bmN0aW9ucywgYW5kCi0gICAgICBjb25zdGFudHMuCi0gICAgICBUaGlzIGluY2x1ZGVzIG5vdCBqdXN0IHRoZSBleHRlcm5hbCBBUEkgdGhhdCBpcyB0byBiZSBwcmVzZW50ZWQgdG8gdGhlCi0gICAgICBvdXRzaWRlIHdvcmxkIGJ1dCBhbHNvICJwcml2YXRlIiBjb2RlLgotXGl0ZW0gV2hpdGVib3ggdGVzdGluZyAoZXhhbWluaW5nIHRoZSBjb2RlIGJlaW5nIHRlc3RlZCB3aGVuIHRoZSB0ZXN0cyBhcmUKLSAgICAgIGJlaW5nIHdyaXR0ZW4pIGlzIHByZWZlcnJlZC4KLSAgICAgIEJsYWNrYm94IHRlc3RpbmcgKHRlc3Rpbmcgb25seSB0aGUgcHVibGlzaGVkIHVzZXIgaW50ZXJmYWNlKSBpcyBub3QKLSAgICAgIGNvbXBsZXRlIGVub3VnaCB0byBtYWtlIHN1cmUgYWxsIGJvdW5kYXJ5IGFuZCBlZGdlIGNhc2VzIGFyZSB0ZXN0ZWQuCi1caXRlbSBNYWtlIHN1cmUgYWxsIHBvc3NpYmxlIHZhbHVlcyBhcmUgdGVzdGVkIGluY2x1ZGluZyBpbnZhbGlkIG9uZXMuCi0gICAgICBUaGlzIG1ha2VzIHN1cmUgdGhhdCBub3Qgb25seSBhbGwgdmFsaWQgdmFsdWVzIGFyZSBhY2NlcHRhYmxlIGJ1dCBhbHNvCi0gICAgICB0aGF0IGltcHJvcGVyIHZhbHVlcyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkuCi1caXRlbSBFeGhhdXN0IGFzIG1hbnkgY29kZSBwYXRocyBhcyBwb3NzaWJsZS4KLSAgICAgIFRlc3Qgd2hlcmUgYnJhbmNoaW5nIG9jY3VycyBhbmQgdGh1cyB0YWlsb3IgaW5wdXQgdG8gbWFrZSBzdXJlIGFzIG1hbnkKLSAgICAgIGRpZmZlcmVudCBwYXRocyB0aHJvdWdoIHRoZSBjb2RlIGFyZSB0YWtlbi4KLVxpdGVtIEFkZCBhbiBleHBsaWNpdCB0ZXN0IGZvciBhbnkgYnVncyBkaXNjb3ZlcmVkIGZvciB0aGUgdGVzdGVkIGNvZGUuCi0gICAgICBUaGlzIHdpbGwgbWFrZSBzdXJlIHRoYXQgdGhlIGVycm9yIGRvZXMgbm90IGNyb3AgdXAgYWdhaW4gaWYgdGhlIGNvZGUgaXMKLSAgICAgIGNoYW5nZWQgaW4gdGhlIGZ1dHVyZS4KLVxpdGVtIE1ha2Ugc3VyZSB0byBjbGVhbiB1cCBhZnRlciB5b3VyIHRlc3RzIChzdWNoIGFzIGNsb3NlIGFuZCByZW1vdmUgYWxsCi0gICAgICB0ZW1wb3JhcnkgZmlsZXMpLgotXGl0ZW0gSWYgYSB0ZXN0IGlzIGRlcGVuZGVudCBvbiBhIHNwZWNpZmljIGNvbmRpdGlvbiBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbQotICAgICAgdGhlbiB2ZXJpZnkgdGhlIGNvbmRpdGlvbiBhbHJlYWR5IGV4aXN0cyBiZWZvcmUgYXR0ZW1wdGluZyB0aGUgdGVzdC4KLVxpdGVtIEltcG9ydCBhcyBmZXcgbW9kdWxlcyBhcyBwb3NzaWJsZSBhbmQgZG8gaXQgYXMgc29vbiBhcyBwb3NzaWJsZS4KLSAgICAgIFRoaXMgbWluaW1pemVzIGV4dGVybmFsIGRlcGVuZGVuY2llcyBvZiB0ZXN0cyBhbmQgYWxzbyBtaW5pbWl6ZXMgcG9zc2libGUKLSAgICAgIGFub21hbG91cyBiZWhhdmlvciBmcm9tIHNpZGUtZWZmZWN0cyBvZiBpbXBvcnRpbmcgYSBtb2R1bGUuCi1caXRlbSBUcnkgdG8gbWF4aW1pemUgY29kZSByZXVzZS4KLSAgICAgIE9uIG9jY2FzaW9uLCB0ZXN0cyB3aWxsIHZhcnkgYnkgc29tZXRoaW5nIGFzIHNtYWxsIGFzIHdoYXQgdHlwZQotICAgICAgb2YgaW5wdXQgaXMgdXNlZC4KLSAgICAgIE1pbmltaXplIGNvZGUgZHVwbGljYXRpb24gYnkgc3ViY2xhc3NpbmcgYSBiYXNpYyB0ZXN0IGNsYXNzIHdpdGggYSBjbGFzcwotICAgICAgdGhhdCBzcGVjaWZpZXMgdGhlIGlucHV0OgotXGJlZ2lue3ZlcmJhdGltfQotY2xhc3MgVGVzdEZ1bmNBY2NlcHRzU2VxdWVuY2VzKHVuaXR0ZXN0LlRlc3RDYXNlKToKLQotICAgIGZ1bmMgPSBteVN1cGVyV2hhbW15RnVuY3Rpb24KLQotICAgIGRlZiB0ZXN0X2Z1bmMoc2VsZik6Ci0gICAgICAgIHNlbGYuZnVuYyhzZWxmLmFyZykKLQotY2xhc3MgQWNjZXB0TGlzdHMoVGVzdEZ1bmNBY2NlcHRzU2VxdWVuY2VzKToKLSAgICBhcmcgPSBbMSwyLDNdCi0KLWNsYXNzIEFjY2VwdFN0cmluZ3MoVGVzdEZ1bmNBY2NlcHRzU2VxdWVuY2VzKToKLSAgICBhcmcgPSAnYWJjJwotCi1jbGFzcyBBY2NlcHRUdXBsZXMoVGVzdEZ1bmNBY2NlcHRzU2VxdWVuY2VzKToKLSAgICBhcmcgPSAoMSwyLDMpCi1cZW5ke3ZlcmJhdGltfQotXGVuZHtpdGVtaXplfQotCi1cYmVnaW57c2VlYWxzb30KLVxzZWV0aXRsZXtUZXN0IERyaXZlbiBEZXZlbG9wbWVudH0KLSAgICAgICAgIHtBIGJvb2sgYnkgS2VudCBCZWNrIG9uIHdyaXRpbmcgdGVzdHMgYmVmb3JlIGNvZGUufQotXGVuZHtzZWVhbHNvfQotCi0KLVxzdWJzZWN0aW9ue1J1bm5pbmcgdGVzdHMgdXNpbmcgXG1vZHVsZXt0ZXN0LnJlZ3J0ZXN0fSBcbGFiZWx7cmVncnRlc3R9fQotCi1cbW9kdWxle3Rlc3QucmVncnRlc3R9IGNhbiBiZSB1c2VkIGFzIGEgc2NyaXB0IHRvIGRyaXZlIFB5dGhvbidzCi1yZWdyZXNzaW9uIHRlc3Qgc3VpdGUuCi1SdW5uaW5nIHRoZSBzY3JpcHQgYnkgaXRzZWxmIGF1dG9tYXRpY2FsbHkgc3RhcnRzIHJ1bm5pbmcgYWxsCi1yZWdyZXNzaW9uIHRlc3RzIGluIHRoZSBcbW9kdWxle3Rlc3R9IHBhY2thZ2UuCi1JdCBkb2VzIHRoaXMgYnkgZmluZGluZyBhbGwgbW9kdWxlcyBpbiB0aGUgcGFja2FnZSB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoCi1cc2FtcHt0ZXN0X30sIGltcG9ydGluZyB0aGVtLCBhbmQgZXhlY3V0aW5nIHRoZSBmdW5jdGlvbgotXGZ1bmN0aW9ue3Rlc3RfbWFpbigpfSBpZiBwcmVzZW50LgotVGhlIG5hbWVzIG9mIHRlc3RzIHRvIGV4ZWN1dGUgbWF5IGFsc28gYmUgcGFzc2VkIHRvIHRoZSBzY3JpcHQuCi1TcGVjaWZ5aW5nIGEgc2luZ2xlIHJlZ3Jlc3Npb24gdGVzdCAoXHByb2dyYW17cHl0aG9uIHJlZ3J0ZXN0LnB5fQotXHByb2dyYW1vcHR7dGVzdF9zcGFtLnB5fSkgd2lsbCBtaW5pbWl6ZSBvdXRwdXQgYW5kIG9ubHkgcHJpbnQgd2hldGhlcgotdGhlIHRlc3QgcGFzc2VkIG9yIGZhaWxlZCBhbmQgdGh1cyBtaW5pbWl6ZSBvdXRwdXQuCi0KLVJ1bm5pbmcgXG1vZHVsZXt0ZXN0LnJlZ3J0ZXN0fSBkaXJlY3RseSBhbGxvd3Mgd2hhdCByZXNvdXJjZXMgYXJlCi1hdmFpbGFibGUgZm9yIHRlc3RzIHRvIHVzZSB0byBiZSBzZXQuCi1Zb3UgZG8gdGhpcyBieSB1c2luZyB0aGUgXHByb2dyYW1vcHR7LXV9IGNvbW1hbmQtbGluZSBvcHRpb24uCi1SdW4gXHByb2dyYW17cHl0aG9uIHJlZ3J0ZXN0LnB5fSBccHJvZ3JhbW9wdHstdWFsbH0gdG8gdHVybiBvbiBhbGwKLXJlc291cmNlczsgc3BlY2lmeWluZyBccHJvZ3JhbW9wdHthbGx9IGFzIGFuIG9wdGlvbiBmb3IKLVxwcm9ncmFtb3B0ey11fSBlbmFibGVzIGFsbCBwb3NzaWJsZSByZXNvdXJjZXMuCi1JZiBhbGwgYnV0IG9uZSByZXNvdXJjZSBpcyBkZXNpcmVkIChhIG1vcmUgY29tbW9uIGNhc2UpLCBhCi1jb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgbm90IGRlc2lyZWQgbWF5IGJlIGxpc3RlZCBhZnRlcgotXHByb2dyYW1vcHR7YWxsfS4KLVRoZSBjb21tYW5kIFxwcm9ncmFte3B5dGhvbiByZWdydGVzdC5weX0KLVxwcm9ncmFtb3B0ey11YWxsLC1hdWRpbywtbGFyZ2VmaWxlfSB3aWxsIHJ1biBcbW9kdWxle3Rlc3QucmVncnRlc3R9Ci13aXRoIGFsbCByZXNvdXJjZXMgZXhjZXB0IHRoZSBccHJvZ3JhbW9wdHthdWRpb30gYW5kCi1ccHJvZ3JhbW9wdHtsYXJnZWZpbGV9IHJlc291cmNlcy4KLUZvciBhIGxpc3Qgb2YgYWxsIHJlc291cmNlcyBhbmQgbW9yZSBjb21tYW5kLWxpbmUgb3B0aW9ucywgcnVuCi1ccHJvZ3JhbXtweXRob24gcmVncnRlc3QucHl9IFxwcm9ncmFtb3B0ey1ofS4KLQotU29tZSBvdGhlciB3YXlzIHRvIGV4ZWN1dGUgdGhlIHJlZ3Jlc3Npb24gdGVzdHMgZGVwZW5kIG9uIHdoYXQgcGxhdGZvcm0gdGhlCi10ZXN0cyBhcmUgYmVpbmcgZXhlY3V0ZWQgb24uCi1PbiBcVU5JWHt9LCB5b3UgY2FuIHJ1biBccHJvZ3JhbXttYWtlfSBccHJvZ3JhbW9wdHt0ZXN0fSBhdCB0aGUKLXRvcC1sZXZlbCBkaXJlY3Rvcnkgd2hlcmUgUHl0aG9uIHdhcyBidWlsdC4KLU9uIFdpbmRvd3MsIGV4ZWN1dGluZyBccHJvZ3JhbXtydC5iYXR9IGZyb20geW91ciBcZmlsZXtQQ0J1aWxkfQotZGlyZWN0b3J5IHdpbGwgcnVuIGFsbCByZWdyZXNzaW9uIHRlc3RzLgotCi0KLVxzZWN0aW9ue1xtb2R1bGV7dGVzdC50ZXN0X3N1cHBvcnR9IC0tLQotICAgICAgICAgVXRpbGl0eSBmdW5jdGlvbnMgZm9yIHRlc3RzfQotCi1cZGVjbGFyZW1vZHVsZVt0ZXN0LnRlc3RzdXBwb3J0XXtzdGFuZGFyZH17dGVzdC50ZXN0X3N1cHBvcnR9Ci1cbW9kdWxlc3lub3BzaXN7U3VwcG9ydCBmb3IgUHl0aG9uIHJlZ3Jlc3Npb24gdGVzdHMufQotCi1UaGUgXG1vZHVsZXt0ZXN0LnRlc3Rfc3VwcG9ydH0gbW9kdWxlIHByb3ZpZGVzIHN1cHBvcnQgZm9yIFB5dGhvbidzCi1yZWdyZXNzaW9uIHRlc3RzLgotCi1UaGlzIG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uczoKLQotXGJlZ2lue2V4Y2Rlc2N9e1Rlc3RGYWlsZWR9Ci1FeGNlcHRpb24gdG8gYmUgcmFpc2VkIHdoZW4gYSB0ZXN0IGZhaWxzLiBUaGlzIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3IKLW9mIFxtb2R1bGV7dW5pdHRlc3R9LWJhc2VkIHRlc3RzIGFuZCBcY2xhc3N7dW5pdHRlc3QuVGVzdENhc2V9J3MKLWFzc2VydGlvbiBtZXRob2RzLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317VGVzdFNraXBwZWR9Ci1TdWJjbGFzcyBvZiBcZXhjZXB0aW9ue1Rlc3RGYWlsZWR9LgotUmFpc2VkIHdoZW4gYSB0ZXN0IGlzIHNraXBwZWQuCi1UaGlzIG9jY3VycyB3aGVuIGEgbmVlZGVkIHJlc291cmNlIChzdWNoIGFzIGEgbmV0d29yayBjb25uZWN0aW9uKSBpcyBub3QKLWF2YWlsYWJsZSBhdCB0aGUgdGltZSBvZiB0ZXN0aW5nLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317UmVzb3VyY2VEZW5pZWR9Ci1TdWJjbGFzcyBvZiBcZXhjZXB0aW9ue1Rlc3RTa2lwcGVkfS4KLVJhaXNlZCB3aGVuIGEgcmVzb3VyY2UgKHN1Y2ggYXMgYSBuZXR3b3JrIGNvbm5lY3Rpb24pIGlzIG5vdCBhdmFpbGFibGUuCi1SYWlzZWQgYnkgdGhlIFxmdW5jdGlvbntyZXF1aXJlcygpfSBmdW5jdGlvbi4KLVxlbmR7ZXhjZGVzY30KLQotCi1UaGUgXG1vZHVsZXt0ZXN0LnRlc3Rfc3VwcG9ydH0gbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBjb25zdGFudHM6Ci0KLVxiZWdpbntkYXRhZGVzY317dmVyYm9zZX0KLVxjb25zdGFudHtUcnVlfSB3aGVuIHZlcmJvc2Ugb3V0cHV0IGlzIGVuYWJsZWQuCi1TaG91bGQgYmUgY2hlY2tlZCB3aGVuIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gaXMgZGVzaXJlZCBhYm91dCBhIHJ1bm5pbmcKLXRlc3QuCi1cdmFye3ZlcmJvc2V9IGlzIHNldCBieSBcbW9kdWxle3Rlc3QucmVncnRlc3R9LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtoYXZlX3VuaWNvZGV9Ci1cY29uc3RhbnR7VHJ1ZX0gd2hlbiBVbmljb2RlIHN1cHBvcnQgaXMgYXZhaWxhYmxlLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtpc19qeXRob259Ci1cY29uc3RhbnR7VHJ1ZX0gaWYgdGhlIHJ1bm5pbmcgaW50ZXJwcmV0ZXIgaXMgSnl0aG9uLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtURVNURk59Ci1TZXQgdG8gdGhlIHBhdGggdGhhdCBhIHRlbXBvcmFyeSBmaWxlIG1heSBiZSBjcmVhdGVkIGF0LgotQW55IHRlbXBvcmFyeSB0aGF0IGlzIGNyZWF0ZWQgc2hvdWxkIGJlIGNsb3NlZCBhbmQgdW5saW5rZWQgKHJlbW92ZWQpLgotXGVuZHtkYXRhZGVzY30KLQotCi1UaGUgXG1vZHVsZXt0ZXN0LnRlc3Rfc3VwcG9ydH0gbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6Ci0KLVxiZWdpbntmdW5jZGVzY317Zm9yZ2V0fXttb2R1bGVfbmFtZX0KLVJlbW92ZXMgdGhlIG1vZHVsZSBuYW1lZCBcdmFye21vZHVsZV9uYW1lfSBmcm9tIFxjb2Rle3N5cy5tb2R1bGVzfSBhbmQgZGVsZXRlcwotYW55IGJ5dGUtY29tcGlsZWQgZmlsZXMgb2YgdGhlIG1vZHVsZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aXNfcmVzb3VyY2VfZW5hYmxlZH17cmVzb3VyY2V9Ci1SZXR1cm5zIFxjb25zdGFudHtUcnVlfSBpZiBcdmFye3Jlc291cmNlfSBpcyBlbmFibGVkIGFuZCBhdmFpbGFibGUuCi1UaGUgbGlzdCBvZiBhdmFpbGFibGUgcmVzb3VyY2VzIGlzIG9ubHkgc2V0IHdoZW4gXG1vZHVsZXt0ZXN0LnJlZ3J0ZXN0fQotaXMgZXhlY3V0aW5nIHRoZSB0ZXN0cy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cmVxdWlyZXN9e3Jlc291cmNlXG9wdGlvbmFseywgbXNnfX0KLVJhaXNlcyBcZXhjZXB0aW9ue1Jlc291cmNlRGVuaWVkfSBpZiBcdmFye3Jlc291cmNlfSBpcyBub3QgYXZhaWxhYmxlLgotXHZhcnttc2d9IGlzIHRoZSBhcmd1bWVudCB0byBcZXhjZXB0aW9ue1Jlc291cmNlRGVuaWVkfSBpZiBpdCBpcyByYWlzZWQuCi1BbHdheXMgcmV0dXJucyB0cnVlIGlmIGNhbGxlZCBieSBhIGZ1bmN0aW9uIHdob3NlIFxjb2Rle19fbmFtZV9ffSBpcwotXGNvZGV7J19fbWFpbl9fJ30uCi1Vc2VkIHdoZW4gdGVzdHMgYXJlIGV4ZWN1dGVkIGJ5IFxtb2R1bGV7dGVzdC5yZWdydGVzdH0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2ZpbmRmaWxlfXtmaWxlbmFtZX0KLVJldHVybiB0aGUgcGF0aCB0byB0aGUgZmlsZSBuYW1lZCBcdmFye2ZpbGVuYW1lfS4KLUlmIG5vIG1hdGNoIGlzIGZvdW5kIFx2YXJ7ZmlsZW5hbWV9IGlzIHJldHVybmVkLgotVGhpcyBkb2VzIG5vdCBlcXVhbCBhIGZhaWx1cmUgc2luY2UgaXQgY291bGQgYmUgdGhlIHBhdGggdG8gdGhlIGZpbGUuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2d1YXJkX3dhcm5pbmdzX2ZpbHRlcn17fQotUmV0dXJucyBhIGNvbnRleHQgbWFuYWdlciB0aGF0IGd1YXJkcyB0aGUgXG1vZHVsZXt3YXJuaW5nc30gbW9kdWxlJ3MKLWZpbHRlciBzZXR0aW5ncy4KLVx2ZXJzaW9uYWRkZWR7Mi42fQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtydW5fdW5pdHRlc3R9eypjbGFzc2VzfQotRXhlY3V0ZSBcY2xhc3N7dW5pdHRlc3QuVGVzdENhc2V9IHN1YmNsYXNzZXMgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbi4KLVRoZSBmdW5jdGlvbiBzY2FucyB0aGUgY2xhc3NlcyBmb3IgbWV0aG9kcyBzdGFydGluZyB3aXRoIHRoZSBwcmVmaXgKLVxzYW1we3Rlc3RffSBhbmQgZXhlY3V0ZXMgdGhlIHRlc3RzIGluZGl2aWR1YWxseS4KLQotSXQgaXMgYWxzbyBsZWdhbCB0byBwYXNzIHN0cmluZ3MgYXMgcGFyYW1ldGVyczsgdGhlc2Ugc2hvdWxkIGJlIGtleXMgaW4KLVxjb2Rle3N5cy5tb2R1bGVzfS4gRWFjaCBhc3NvY2lhdGVkIG1vZHVsZSB3aWxsIGJlIHNjYW5uZWQgYnkKLVxjb2Rle3VuaXR0ZXN0LlRlc3RMb2FkZXIubG9hZFRlc3RzRnJvbU1vZHVsZSgpfS4gVGhpcyBpcyB1c3VhbGx5IHNlZW4gaW4KLXRoZSBmb2xsb3dpbmcgXGZ1bmN0aW9ue3Rlc3RfbWFpbigpfSBmdW5jdGlvbjoKLQotXGJlZ2lue3ZlcmJhdGltfQotZGVmIHRlc3RfbWFpbigpOgotICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoX19uYW1lX18pCi1cZW5ke3ZlcmJhdGltfQotCi1UaGlzIHdpbGwgcnVuIGFsbCB0ZXN0cyBkZWZpbmVkIGluIHRoZSBuYW1lZCBtb2R1bGUuCi1cZW5ke2Z1bmNkZXNjfQotCi1UaGUgXG1vZHVsZXt0ZXN0LnRlc3Rfc3VwcG9ydH0gbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBjbGFzc2VzOgotCi1cYmVnaW57Y2xhc3NkZXNjfXtUcmFuc2llbnRSZXNvdXJjZX17ZXhjXG9wdGlvbmFseywgKiprd2FyZ3N9fQotQ3JlYXRlIGEgY29udGV4dCBtYW5hZ2VyIHRoYXQgcmFpc2VzIFxjbGFzc3tSZXNvdXJjZURlbmllZH0gaWYgdGhlIHNwZWNpZmllZAotZXhjZXB0aW9uIHR5cGUgaXMgcmFpc2VkLiAgQW55IGtleXdvcmQgYXJndW1lbnRzIGFyZSB0cmVhdGVkIGFzIG5hbWUvdmFsdWUKLXBhaXJzIHRvIGJlIGNvbXBhcmVkIGFnYWluc3QgYW55IGV4Y2VwdGlvbiByYWlzZWQgd2l0aCB0aGUgXGNvZGV7d2l0aH0KLXN0YXRlbWVudC4gIE9ubHkgaWYgYWxsIHBhaXJzIG1hdGNoIGlzIFxjbGFzc3tSZXNvdXJjZURlbmllZH0gcmFpc2VkLgotXHZlcnNpb25hZGRlZHsyLjZ9Ci1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317RW52aXJvbm1lbnRWYXJHdWFyZH17fQotQ2xhc3MgdXNlZCB0byB0ZW1wb3JhcmlseSBzZXQgb3IgdW5zZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzLiAgSW5zdGFuY2VzIGNhbiBiZQotdXNlZCBhcyBhIGNvbnRleHQgbWFuYWdlci4KLVx2ZXJzaW9uYWRkZWR7Mi42fQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtzZXR9e2VudnZhciwgdmFsdWV9Ci1UZW1wb3JhcmlseSBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFxjb2Rle2VudnZhcn0gdG8gdGhlIHZhbHVlIG9mCi1cY29kZXt2YWx1ZX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXt1bnNldH17ZW52dmFyfQotVGVtcG9yYXJpbHkgdW5zZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFxjb2Rle2VudnZhcn0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlidGV4dHdyYXAudGV4IGIvRG9jL2xpYi9saWJ0ZXh0d3JhcC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYTI1YTguLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJ0ZXh0d3JhcC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXt0ZXh0d3JhcH0gLS0tCi0gICAgICAgICBUZXh0IHdyYXBwaW5nIGFuZCBmaWxsaW5nfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17dGV4dHdyYXB9Ci1cbW9kdWxlc3lub3BzaXN7VGV4dCB3cmFwcGluZyBhbmQgZmlsbGluZ30KLVxtb2R1bGVhdXRob3J7R3JlZyBXYXJkfXtnd2FyZEBweXRob24ubmV0fQotXHNlY3Rpb25hdXRob3J7R3JlZyBXYXJkfXtnd2FyZEBweXRob24ubmV0fQotCi1cdmVyc2lvbmFkZGVkezIuM30KLQotVGhlIFxtb2R1bGV7dGV4dHdyYXB9IG1vZHVsZSBwcm92aWRlcyB0d28gY29udmVuaWVuY2UgZnVuY3Rpb25zLAotXGZ1bmN0aW9ue3dyYXAoKX0gYW5kIFxmdW5jdGlvbntmaWxsKCl9LCBhcyB3ZWxsIGFzCi1cY2xhc3N7VGV4dFdyYXBwZXJ9LCB0aGUgY2xhc3MgdGhhdCBkb2VzIGFsbCB0aGUgd29yaywgYW5kIGEgdXRpbGl0eSBmdW5jdGlvbiAKLVxmdW5jdGlvbntkZWRlbnQoKX0uICBJZiB5b3UncmUganVzdCB3cmFwcGluZyBvciBmaWxsaW5nIG9uZSBvciB0d28gCi10ZXh0IHN0cmluZ3MsIHRoZSBjb252ZW5pZW5jZSBmdW5jdGlvbnMgc2hvdWxkIGJlIGdvb2QgZW5vdWdoOyBvdGhlcndpc2UsIAoteW91IHNob3VsZCB1c2UgYW4gaW5zdGFuY2Ugb2YgXGNsYXNze1RleHRXcmFwcGVyfSBmb3IgZWZmaWNpZW5jeS4KLQotXGJlZ2lue2Z1bmNkZXNjfXt3cmFwfXt0ZXh0XG9wdGlvbmFseywgd2lkdGhcb3B0aW9uYWx7LCBcbW9yZWFyZ3N9fX0KLVdyYXBzIHRoZSBzaW5nbGUgcGFyYWdyYXBoIGluIFx2YXJ7dGV4dH0gKGEgc3RyaW5nKSBzbyBldmVyeSBsaW5lIGlzIGF0Ci1tb3N0IFx2YXJ7d2lkdGh9IGNoYXJhY3RlcnMgbG9uZy4gIFJldHVybnMgYSBsaXN0IG9mIG91dHB1dCBsaW5lcywKLXdpdGhvdXQgZmluYWwgbmV3bGluZXMuCi0KLU9wdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzIGNvcnJlc3BvbmQgdG8gdGhlIGluc3RhbmNlIGF0dHJpYnV0ZXMgb2YKLVxjbGFzc3tUZXh0V3JhcHBlcn0sIGRvY3VtZW50ZWQgYmVsb3cuICBcdmFye3dpZHRofSBkZWZhdWx0cyB0bwotXGNvZGV7NzB9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtmaWxsfXt0ZXh0XG9wdGlvbmFseywgd2lkdGhcb3B0aW9uYWx7LCBcbW9yZWFyZ3N9fX0KLVdyYXBzIHRoZSBzaW5nbGUgcGFyYWdyYXBoIGluIFx2YXJ7dGV4dH0sIGFuZCByZXR1cm5zIGEgc2luZ2xlIHN0cmluZwotY29udGFpbmluZyB0aGUgd3JhcHBlZCBwYXJhZ3JhcGguICBcZnVuY3Rpb257ZmlsbCgpfSBpcyBzaG9ydGhhbmQgZm9yCi1cYmVnaW57dmVyYmF0aW19Ci0iXG4iLmpvaW4od3JhcCh0ZXh0LCAuLi4pKQotXGVuZHt2ZXJiYXRpbX0KLQotSW4gcGFydGljdWxhciwgXGZ1bmN0aW9ue2ZpbGwoKX0gYWNjZXB0cyBleGFjdGx5IHRoZSBzYW1lIGtleXdvcmQKLWFyZ3VtZW50cyBhcyBcZnVuY3Rpb257d3JhcCgpfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLUJvdGggXGZ1bmN0aW9ue3dyYXAoKX0gYW5kIFxmdW5jdGlvbntmaWxsKCl9IHdvcmsgYnkgY3JlYXRpbmcgYQotXGNsYXNze1RleHRXcmFwcGVyfSBpbnN0YW5jZSBhbmQgY2FsbGluZyBhIHNpbmdsZSBtZXRob2Qgb24gaXQuICBUaGF0Ci1pbnN0YW5jZSBpcyBub3QgcmV1c2VkLCBzbyBmb3IgYXBwbGljYXRpb25zIHRoYXQgd3JhcC9maWxsIG1hbnkgdGV4dAotc3RyaW5ncywgaXQgd2lsbCBiZSBtb3JlIGVmZmljaWVudCBmb3IgeW91IHRvIGNyZWF0ZSB5b3VyIG93bgotXGNsYXNze1RleHRXcmFwcGVyfSBvYmplY3QuCi0KLUFuIGFkZGl0aW9uYWwgdXRpbGl0eSBmdW5jdGlvbiwgXGZ1bmN0aW9ue2RlZGVudCgpfSwgaXMgcHJvdmlkZWQgdG8KLXJlbW92ZSBpbmRlbnRhdGlvbiBmcm9tIHN0cmluZ3MgdGhhdCBoYXZlIHVud2FudGVkIHdoaXRlc3BhY2UgdG8gdGhlCi1sZWZ0IG9mIHRoZSB0ZXh0LgotCi1cYmVnaW57ZnVuY2Rlc2N9e2RlZGVudH17dGV4dH0gCi1SZW1vdmUgYW55IGNvbW1vbiBsZWFkaW5nIHdoaXRlc3BhY2UgZnJvbSBldmVyeSBsaW5lIGluIFx2YXJ7dGV4dH0uCi0KLVRoaXMgY2FuIGJlIHVzZWQgdG8gbWFrZSB0cmlwbGUtcXVvdGVkIHN0cmluZ3MgbGluZSB1cCB3aXRoIHRoZSBsZWZ0Ci1lZGdlIG9mIHRoZSBkaXNwbGF5LCB3aGlsZSBzdGlsbCBwcmVzZW50aW5nIHRoZW0gaW4gdGhlIHNvdXJjZSBjb2RlCi1pbiBpbmRlbnRlZCBmb3JtLgotCi1Ob3RlIHRoYXQgdGFicyBhbmQgc3BhY2VzIGFyZSBib3RoIHRyZWF0ZWQgYXMgd2hpdGVzcGFjZSwgYnV0IHRoZXkgYXJlCi1ub3QgZXF1YWw6IHRoZSBsaW5lcyBcY29kZXsiIHt9IGhlbGxvIn0gYW5kIFxjb2RleyJcZSB0aGVsbG8ifQotYXJlIGNvbnNpZGVyZWQgdG8gaGF2ZSBubyBjb21tb24gbGVhZGluZyB3aGl0ZXNwYWNlLiAgKFRoaXMgYmVoYXZpb3VyIGlzCi1uZXcgaW4gUHl0aG9uIDIuNTsgb2xkZXIgdmVyc2lvbnMgb2YgdGhpcyBtb2R1bGUgaW5jb3JyZWN0bHkgZXhwYW5kZWQKLXRhYnMgYmVmb3JlIHNlYXJjaGluZyBmb3IgY29tbW9uIGxlYWRpbmcgd2hpdGVzcGFjZS4pCi0KLUZvciBleGFtcGxlOgotXGJlZ2lue3ZlcmJhdGltfQotZGVmIHRlc3QoKToKLSAgICAjIGVuZCBmaXJzdCBsaW5lIHdpdGggXCB0byBhdm9pZCB0aGUgZW1wdHkgbGluZSEKLSAgICBzID0gJycnXAotICAgIGhlbGxvCi0gICAgICB3b3JsZAotICAgICcnJwotICAgIHByaW50IHJlcHIocykgICAgICAgICAgIyBwcmludHMgJyAgICBoZWxsb1xuICAgICAgd29ybGRcbiAgICAnCi0gICAgcHJpbnQgcmVwcihkZWRlbnQocykpICAjIHByaW50cyAnaGVsbG9cbiAgd29ybGRcbicKLVxlbmR7dmVyYmF0aW19Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtUZXh0V3JhcHBlcn17Li4ufQotVGhlIFxjbGFzc3tUZXh0V3JhcHBlcn0gY29uc3RydWN0b3IgYWNjZXB0cyBhIG51bWJlciBvZiBvcHRpb25hbAota2V5d29yZCBhcmd1bWVudHMuICBFYWNoIGFyZ3VtZW50IGNvcnJlc3BvbmRzIHRvIG9uZSBpbnN0YW5jZSBhdHRyaWJ1dGUsCi1zbyBmb3IgZXhhbXBsZQotXGJlZ2lue3ZlcmJhdGltfQotd3JhcHBlciA9IFRleHRXcmFwcGVyKGluaXRpYWxfaW5kZW50PSIqICIpCi1cZW5ke3ZlcmJhdGltfQotaXMgdGhlIHNhbWUgYXMKLVxiZWdpbnt2ZXJiYXRpbX0KLXdyYXBwZXIgPSBUZXh0V3JhcHBlcigpCi13cmFwcGVyLmluaXRpYWxfaW5kZW50ID0gIiogIgotXGVuZHt2ZXJiYXRpbX0KLQotWW91IGNhbiByZS11c2UgdGhlIHNhbWUgXGNsYXNze1RleHRXcmFwcGVyfSBvYmplY3QgbWFueSB0aW1lcywgYW5kIHlvdQotY2FuIGNoYW5nZSBhbnkgb2YgaXRzIG9wdGlvbnMgdGhyb3VnaCBkaXJlY3QgYXNzaWdubWVudCB0byBpbnN0YW5jZQotYXR0cmlidXRlcyBiZXR3ZWVuIHVzZXMuCi1cZW5ke2NsYXNzZGVzY30KLQotVGhlIFxjbGFzc3tUZXh0V3JhcHBlcn0gaW5zdGFuY2UgYXR0cmlidXRlcyAoYW5kIGtleXdvcmQgYXJndW1lbnRzIHRvCi10aGUgY29uc3RydWN0b3IpIGFyZSBhcyBmb2xsb3dzOgotCi1cYmVnaW57bWVtYmVyZGVzY317d2lkdGh9Ci0oZGVmYXVsdDogXGNvZGV7NzB9KSBUaGUgbWF4aW11bSBsZW5ndGggb2Ygd3JhcHBlZCBsaW5lcy4gIEFzIGxvbmcgYXMKLXRoZXJlIGFyZSBubyBpbmRpdmlkdWFsIHdvcmRzIGluIHRoZSBpbnB1dCB0ZXh0IGxvbmdlciB0aGFuCi1cbWVtYmVye3dpZHRofSwgXGNsYXNze1RleHRXcmFwcGVyfSBndWFyYW50ZWVzIHRoYXQgbm8gb3V0cHV0IGxpbmUKLXdpbGwgYmUgbG9uZ2VyIHRoYW4gXG1lbWJlcnt3aWR0aH0gY2hhcmFjdGVycy4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9e2V4cGFuZF90YWJzfQotKGRlZmF1bHQ6IFxjb2Rle1RydWV9KSBJZiB0cnVlLCB0aGVuIGFsbCB0YWIgY2hhcmFjdGVycyBpbiBcdmFye3RleHR9Ci13aWxsIGJlIGV4cGFuZGVkIHRvIHNwYWNlcyB1c2luZyB0aGUgXG1ldGhvZHtleHBhbmR0YWJzKCl9IG1ldGhvZCBvZgotXHZhcnt0ZXh0fS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9e3JlcGxhY2Vfd2hpdGVzcGFjZX0KLShkZWZhdWx0OiBcY29kZXtUcnVlfSkgSWYgdHJ1ZSwgZWFjaCB3aGl0ZXNwYWNlIGNoYXJhY3RlciAoYXMgZGVmaW5lZAotYnkgXGNvZGV7c3RyaW5nLndoaXRlc3BhY2V9KSByZW1haW5pbmcgYWZ0ZXIgdGFiIGV4cGFuc2lvbiB3aWxsIGJlCi1yZXBsYWNlZCBieSBhIHNpbmdsZSBzcGFjZS4gIFxub3Rle0lmIFxtZW1iZXJ7ZXhwYW5kX3RhYnN9IGlzIGZhbHNlCi1hbmQgXG1lbWJlcntyZXBsYWNlX3doaXRlc3BhY2V9IGlzIHRydWUsIGVhY2ggdGFiIGNoYXJhY3RlciB3aWxsIGJlCi1yZXBsYWNlZCBieSBhIHNpbmdsZSBzcGFjZSwgd2hpY2ggaXMgXGVtcGh7bm90fSB0aGUgc2FtZSBhcyB0YWIKLWV4cGFuc2lvbi59Ci1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXtkcm9wX3doaXRlc3BhY2V9Ci0oZGVmYXVsdDogXGNvZGV7VHJ1ZX0pIElmIHRydWUsIHdoaXRlc3BhY2UgdGhhdCwgYWZ0ZXIgd3JhcHBpbmcsIGhhcHBlbnMKLXRvIGVuZCB1cCBhdCB0aGUgYmVnaW5uaW5nIG9yIGVuZCBvZiBhIGxpbmUgaXMgZHJvcHBlZCAobGVhZGluZyB3aGl0ZXNwYWNlCi1pbiB0aGUgZmlyc3QgbGluZSBpcyBhbHdheXMgcHJlc2VydmVkLCB0aG91Z2gpLgotXHZlcnNpb25hZGRlZFtXaGl0ZXNwYWNlIHdhcyBhbHdheXMgZHJvcHBlZCBpbiBlYXJsaWVyIHZlcnNpb25zXXsyLjZ9Ci1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXtpbml0aWFsX2luZGVudH0KLShkZWZhdWx0OiBcY29kZXsnJ30pIFN0cmluZyB0aGF0IHdpbGwgYmUgcHJlcGVuZGVkIHRvIHRoZSBmaXJzdCBsaW5lCi1vZiB3cmFwcGVkIG91dHB1dC4gIENvdW50cyB0b3dhcmRzIHRoZSBsZW5ndGggb2YgdGhlIGZpcnN0IGxpbmUuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXtzdWJzZXF1ZW50X2luZGVudH0KLShkZWZhdWx0OiBcY29kZXsnJ30pIFN0cmluZyB0aGF0IHdpbGwgYmUgcHJlcGVuZGVkIHRvIGFsbCBsaW5lcyBvZgotd3JhcHBlZCBvdXRwdXQgZXhjZXB0IHRoZSBmaXJzdC4gIENvdW50cyB0b3dhcmRzIHRoZSBsZW5ndGggb2YgZWFjaAotbGluZSBleGNlcHQgdGhlIGZpcnN0LgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY317Zml4X3NlbnRlbmNlX2VuZGluZ3N9Ci0oZGVmYXVsdDogXGNvZGV7RmFsc2V9KSBJZiB0cnVlLCBcY2xhc3N7VGV4dFdyYXBwZXJ9IGF0dGVtcHRzIHRvIGRldGVjdAotc2VudGVuY2UgZW5kaW5ncyBhbmQgZW5zdXJlIHRoYXQgc2VudGVuY2VzIGFyZSBhbHdheXMgc2VwYXJhdGVkIGJ5Ci1leGFjdGx5IHR3byBzcGFjZXMuICBUaGlzIGlzIGdlbmVyYWxseSBkZXNpcmVkIGZvciB0ZXh0IGluIGEgbW9ub3NwYWNlZAotZm9udC4gIEhvd2V2ZXIsIHRoZSBzZW50ZW5jZSBkZXRlY3Rpb24gYWxnb3JpdGhtIGlzIGltcGVyZmVjdDogaXQKLWFzc3VtZXMgdGhhdCBhIHNlbnRlbmNlIGVuZGluZyBjb25zaXN0cyBvZiBhIGxvd2VyY2FzZSBsZXR0ZXIgZm9sbG93ZWQKLWJ5IG9uZSBvZiBcY2hhcmFjdGVyey59LAotXGNoYXJhY3RlcnshfSwgb3IgXGNoYXJhY3Rlcns/fSwgcG9zc2libHkgZm9sbG93ZWQgYnkgb25lIG9mCi1cY2hhcmFjdGVyeyJ9IG9yIFxjaGFyYWN0ZXJ7J30sIGZvbGxvd2VkIGJ5IGEgc3BhY2UuICBPbmUgcHJvYmxlbQotd2l0aCB0aGlzIGlzIGFsZ29yaXRobSBpcyB0aGF0IGl0IGlzIHVuYWJsZSB0byBkZXRlY3QgdGhlIGRpZmZlcmVuY2UKLWJldHdlZW4gYGBEci4nJyBpbgotCi1cYmVnaW57dmVyYmF0aW19Ci1bLi4uXSBEci4gRnJhbmtlbnN0ZWluJ3MgbW9uc3RlciBbLi4uXQotXGVuZHt2ZXJiYXRpbX0KLQotYW5kIGBgU3BvdC4nJyBpbgotCi1cYmVnaW57dmVyYmF0aW19Ci1bLi4uXSBTZWUgU3BvdC4gU2VlIFNwb3QgcnVuIFsuLi5dCi1cZW5ke3ZlcmJhdGltfQotCi1cbWVtYmVye2ZpeF9zZW50ZW5jZV9lbmRpbmdzfSBpcyBmYWxzZSBieSBkZWZhdWx0LgotCi1TaW5jZSB0aGUgc2VudGVuY2UgZGV0ZWN0aW9uIGFsZ29yaXRobSByZWxpZXMgb24KLVxjb2Rle3N0cmluZy5sb3dlcmNhc2V9IGZvciB0aGUgZGVmaW5pdGlvbiBvZiBgYGxvd2VyY2FzZSBsZXR0ZXIsJycKLWFuZCBhIGNvbnZlbnRpb24gb2YgdXNpbmcgdHdvIHNwYWNlcyBhZnRlciBhIHBlcmlvZCB0byBzZXBhcmF0ZQotc2VudGVuY2VzIG9uIHRoZSBzYW1lIGxpbmUsIGl0IGlzIHNwZWNpZmljIHRvIEVuZ2xpc2gtbGFuZ3VhZ2UgdGV4dHMuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXticmVha19sb25nX3dvcmRzfQotKGRlZmF1bHQ6IFxjb2Rle1RydWV9KSBJZiB0cnVlLCB0aGVuIHdvcmRzIGxvbmdlciB0aGFuCi1cbWVtYmVye3dpZHRofSB3aWxsIGJlIGJyb2tlbiBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCBubyBsaW5lcyBhcmUKLWxvbmdlciB0aGFuIFxtZW1iZXJ7d2lkdGh9LiAgSWYgaXQgaXMgZmFsc2UsIGxvbmcgd29yZHMgd2lsbCBub3QgYmUKLWJyb2tlbiwgYW5kIHNvbWUgbGluZXMgbWF5IGJlIGxvbmdlciB0aGFuIFxtZW1iZXJ7d2lkdGh9LiAgKExvbmcgd29yZHMKLXdpbGwgYmUgcHV0IG9uIGEgbGluZSBieSB0aGVtc2VsdmVzLCBpbiBvcmRlciB0byBtaW5pbWl6ZSB0aGUgYW1vdW50Ci1ieSB3aGljaCBcbWVtYmVye3dpZHRofSBpcyBleGNlZWRlZC4pCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxjbGFzc3tUZXh0V3JhcHBlcn0gYWxzbyBwcm92aWRlcyB0d28gcHVibGljIG1ldGhvZHMsIGFuYWxvZ291cyB0byB0aGUKLW1vZHVsZS1sZXZlbCBjb252ZW5pZW5jZSBmdW5jdGlvbnM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfXt3cmFwfXt0ZXh0fQotV3JhcHMgdGhlIHNpbmdsZSBwYXJhZ3JhcGggaW4gXHZhcnt0ZXh0fSAoYSBzdHJpbmcpIHNvIGV2ZXJ5IGxpbmUgaXMKLWF0IG1vc3QgXG1lbWJlcnt3aWR0aH0gY2hhcmFjdGVycyBsb25nLiAgQWxsIHdyYXBwaW5nIG9wdGlvbnMgYXJlCi10YWtlbiBmcm9tIGluc3RhbmNlIGF0dHJpYnV0ZXMgb2YgdGhlIFxjbGFzc3tUZXh0V3JhcHBlcn0gaW5zdGFuY2UuCi1SZXR1cm5zIGEgbGlzdCBvZiBvdXRwdXQgbGluZXMsIHdpdGhvdXQgZmluYWwgbmV3bGluZXMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtmaWxsfXt0ZXh0fQotV3JhcHMgdGhlIHNpbmdsZSBwYXJhZ3JhcGggaW4gXHZhcnt0ZXh0fSwgYW5kIHJldHVybnMgYSBzaW5nbGUgc3RyaW5nCi1jb250YWluaW5nIHRoZSB3cmFwcGVkIHBhcmFncmFwaC4KLVxlbmR7bWV0aG9kZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlidGhyZWFkLnRleCBiL0RvYy9saWIvbGlidGhyZWFkLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAwN2VlYy4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnRocmVhZC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXt0aHJlYWR9IC0tLQotICAgICAgICAgTXVsdGlwbGUgdGhyZWFkcyBvZiBjb250cm9sfQotCi1cZGVjbGFyZW1vZHVsZXtidWlsdGlufXt0aHJlYWR9Ci1cbW9kdWxlc3lub3BzaXN7Q3JlYXRlIG11bHRpcGxlIHRocmVhZHMgb2YgY29udHJvbCB3aXRoaW4gb25lIGludGVycHJldGVyLn0KLQotCi1UaGlzIG1vZHVsZSBwcm92aWRlcyBsb3ctbGV2ZWwgcHJpbWl0aXZlcyBmb3Igd29ya2luZyB3aXRoIG11bHRpcGxlCi10aHJlYWRzIChhLmsuYS5cIFxkZm57bGlnaHQtd2VpZ2h0IHByb2Nlc3Nlc30gb3IgXGRmbnt0YXNrc30pIC0tLSBtdWx0aXBsZQotdGhyZWFkcyBvZiBjb250cm9sIHNoYXJpbmcgdGhlaXIgZ2xvYmFsIGRhdGEgc3BhY2UuICBGb3IKLXN5bmNocm9uaXphdGlvbiwgc2ltcGxlIGxvY2tzIChhLmsuYS5cIFxkZm57bXV0ZXhlc30gb3IgXGRmbntiaW5hcnkKLXNlbWFwaG9yZXN9KSBhcmUgcHJvdmlkZWQuCi1caW5kZXh7bGlnaHQtd2VpZ2h0IHByb2Nlc3Nlc30KLVxpbmRleHtwcm9jZXNzZXMsIGxpZ2h0LXdlaWdodH0KLVxpbmRleHtiaW5hcnkgc2VtYXBob3Jlc30KLVxpbmRleHtzZW1hcGhvcmVzLCBiaW5hcnl9Ci0KLVRoZSBtb2R1bGUgaXMgb3B0aW9uYWwuICBJdCBpcyBzdXBwb3J0ZWQgb24gV2luZG93cywgTGludXgsIFNHSQotSVJJWCwgU29sYXJpcyAyLngsIGFzIHdlbGwgYXMgb24gc3lzdGVtcyB0aGF0IGhhdmUgYSBcUE9TSVh7fSB0aHJlYWQKLShhLmsuYS4gYGBwdGhyZWFkJycpIGltcGxlbWVudGF0aW9uLiAgRm9yIHN5c3RlbXMgbGFja2luZyB0aGUgXG1vZHVsZXt0aHJlYWR9Ci1tb2R1bGUsIHRoZSBccmVmbW9kdWxlW2R1bW15dGhyZWFkXXtkdW1teV90aHJlYWR9IG1vZHVsZSBpcyBhdmFpbGFibGUuCi1JdCBkdXBsaWNhdGVzIHRoaXMgbW9kdWxlJ3MgaW50ZXJmYWNlIGFuZCBjYW4gYmUKLXVzZWQgYXMgYSBkcm9wLWluIHJlcGxhY2VtZW50LgotXGluZGV4e3B0aHJlYWRzfQotXGluZGV4aWl7dGhyZWFkc317XFBPU0lYfQotCi1JdCBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgY29uc3RhbnQgYW5kIGZ1bmN0aW9uczoKLQotXGJlZ2lue2V4Y2Rlc2N9e2Vycm9yfQotUmFpc2VkIG9uIHRocmVhZC1zcGVjaWZpYyBlcnJvcnMuCi1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317TG9ja1R5cGV9Ci1UaGlzIGlzIHRoZSB0eXBlIG9mIGxvY2sgb2JqZWN0cy4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c3RhcnRfbmV3X3RocmVhZH17ZnVuY3Rpb24sIGFyZ3Ncb3B0aW9uYWx7LCBrd2FyZ3N9fQotU3RhcnQgYSBuZXcgdGhyZWFkIGFuZCByZXR1cm4gaXRzIGlkZW50aWZpZXIuICBUaGUgdGhyZWFkIGV4ZWN1dGVzIHRoZSBmdW5jdGlvbgotXHZhcntmdW5jdGlvbn0gd2l0aCB0aGUgYXJndW1lbnQgbGlzdCBcdmFye2FyZ3N9ICh3aGljaCBtdXN0IGJlIGEgdHVwbGUpLiAgVGhlCi1vcHRpb25hbCBcdmFye2t3YXJnc30gYXJndW1lbnQgc3BlY2lmaWVzIGEgZGljdGlvbmFyeSBvZiBrZXl3b3JkIGFyZ3VtZW50cy4KLVdoZW4gdGhlIGZ1bmN0aW9uIHJldHVybnMsIHRoZSB0aHJlYWQgc2lsZW50bHkgZXhpdHMuICBXaGVuIHRoZSBmdW5jdGlvbgotdGVybWluYXRlcyB3aXRoIGFuIHVuaGFuZGxlZCBleGNlcHRpb24sIGEgc3RhY2sgdHJhY2UgaXMgcHJpbnRlZCBhbmQKLXRoZW4gdGhlIHRocmVhZCBleGl0cyAoYnV0IG90aGVyIHRocmVhZHMgY29udGludWUgdG8gcnVuKS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aW50ZXJydXB0X21haW59e30KLVJhaXNlIGEgXGV4Y2VwdGlvbntLZXlib2FyZEludGVycnVwdH0gZXhjZXB0aW9uIGluIHRoZSBtYWluIHRocmVhZC4gIEEgc3VidGhyZWFkCi1jYW4gdXNlIHRoaXMgZnVuY3Rpb24gdG8gaW50ZXJydXB0IHRoZSBtYWluIHRocmVhZC4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtleGl0fXt9Ci1SYWlzZSB0aGUgXGV4Y2VwdGlvbntTeXN0ZW1FeGl0fSBleGNlcHRpb24uICBXaGVuIG5vdCBjYXVnaHQsIHRoaXMKLXdpbGwgY2F1c2UgdGhlIHRocmVhZCB0byBleGl0IHNpbGVudGx5LgotXGVuZHtmdW5jZGVzY30KLQotJVxiZWdpbntmdW5jZGVzY317ZXhpdF9wcm9nfXtzdGF0dXN9Ci0lRXhpdCBhbGwgdGhyZWFkcyBhbmQgcmVwb3J0IHRoZSB2YWx1ZSBvZiB0aGUgaW50ZWdlciBhcmd1bWVudAotJVx2YXJ7c3RhdHVzfSBhcyB0aGUgZXhpdCBzdGF0dXMgb2YgdGhlIGVudGlyZSBwcm9ncmFtLgotJVxzdHJvbmd7Q2F2ZWF0On0gY29kZSBpbiBwZW5kaW5nIFxrZXl3b3Jke2ZpbmFsbHl9IGNsYXVzZXMsIGluIHRoaXMgdGhyZWFkCi0lb3IgaW4gb3RoZXIgdGhyZWFkcywgaXMgbm90IGV4ZWN1dGVkLgotJVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317YWxsb2NhdGVfbG9ja317fQotUmV0dXJuIGEgbmV3IGxvY2sgb2JqZWN0LiAgTWV0aG9kcyBvZiBsb2NrcyBhcmUgZGVzY3JpYmVkIGJlbG93LiAgVGhlCi1sb2NrIGlzIGluaXRpYWxseSB1bmxvY2tlZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0X2lkZW50fXt9Ci1SZXR1cm4gdGhlIGB0aHJlYWQgaWRlbnRpZmllcicgb2YgdGhlIGN1cnJlbnQgdGhyZWFkLiAgVGhpcyBpcyBhCi1ub256ZXJvIGludGVnZXIuICBJdHMgdmFsdWUgaGFzIG5vIGRpcmVjdCBtZWFuaW5nOyBpdCBpcyBpbnRlbmRlZCBhcyBhCi1tYWdpYyBjb29raWUgdG8gYmUgdXNlZCBlLmcuIHRvIGluZGV4IGEgZGljdGlvbmFyeSBvZiB0aHJlYWQtc3BlY2lmaWMKLWRhdGEuICBUaHJlYWQgaWRlbnRpZmllcnMgbWF5IGJlIHJlY3ljbGVkIHdoZW4gYSB0aHJlYWQgZXhpdHMgYW5kCi1hbm90aGVyIHRocmVhZCBpcyBjcmVhdGVkLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzdGFja19zaXplfXtcb3B0aW9uYWx7c2l6ZX19Ci1SZXR1cm4gdGhlIHRocmVhZCBzdGFjayBzaXplIHVzZWQgd2hlbiBjcmVhdGluZyBuZXcgdGhyZWFkcy4gIFRoZQotb3B0aW9uYWwgXHZhcntzaXplfSBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIHN0YWNrIHNpemUgdG8gYmUgdXNlZCBmb3IKLXN1YnNlcXVlbnRseSBjcmVhdGVkIHRocmVhZHMsIGFuZCBtdXN0IGJlIDAgKHVzZSBwbGF0Zm9ybSBvcgotY29uZmlndXJlZCBkZWZhdWx0KSBvciBhIHBvc2l0aXZlIGludGVnZXIgdmFsdWUgb2YgYXQgbGVhc3QgMzIsNzY4ICgzMmtCKS4KLUlmIGNoYW5naW5nIHRoZSB0aHJlYWQgc3RhY2sgc2l6ZSBpcyB1bnN1cHBvcnRlZCwgYSBcZXhjZXB0aW9ue1RocmVhZEVycm9yfQotaXMgcmFpc2VkLiAgSWYgdGhlIHNwZWNpZmllZCBzdGFjayBzaXplIGlzIGludmFsaWQsIGEgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfQotaXMgcmFpc2VkIGFuZCB0aGUgc3RhY2sgc2l6ZSBpcyB1bm1vZGlmaWVkLiAgMzJrQiBpcyBjdXJyZW50bHkgdGhlIG1pbmltdW0KLXN1cHBvcnRlZCBzdGFjayBzaXplIHZhbHVlIHRvIGd1YXJhbnRlZSBzdWZmaWNpZW50IHN0YWNrIHNwYWNlIGZvciB0aGUKLWludGVycHJldGVyIGl0c2VsZi4gIE5vdGUgdGhhdCBzb21lIHBsYXRmb3JtcyBtYXkgaGF2ZSBwYXJ0aWN1bGFyCi1yZXN0cmljdGlvbnMgb24gdmFsdWVzIGZvciB0aGUgc3RhY2sgc2l6ZSwgc3VjaCBhcyByZXF1aXJpbmcgYSBtaW5pbXVtCi1zdGFjayBzaXplID4gMzJrQiBvciByZXF1aXJpbmcgYWxsb2NhdGlvbiBpbiBtdWx0aXBsZXMgb2YgdGhlIHN5c3RlbQotbWVtb3J5IHBhZ2Ugc2l6ZSAtIHBsYXRmb3JtIGRvY3VtZW50YXRpb24gc2hvdWxkIGJlIHJlZmVycmVkIHRvIGZvcgotbW9yZSBpbmZvcm1hdGlvbiAoNGtCIHBhZ2VzIGFyZSBjb21tb247IHVzaW5nIG11bHRpcGxlcyBvZiA0MDk2IGZvcgotdGhlIHN0YWNrIHNpemUgaXMgdGhlIHN1Z2dlc3RlZCBhcHByb2FjaCBpbiB0aGUgYWJzZW5jZSBvZiBtb3JlCi1zcGVjaWZpYyBpbmZvcm1hdGlvbikuCi1BdmFpbGFiaWxpdHk6IFdpbmRvd3MsIHN5c3RlbXMgd2l0aCBcUE9TSVh7fSB0aHJlYWRzLgotXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke2Z1bmNkZXNjfQotCi0KLUxvY2sgb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLQotXGJlZ2lue21ldGhvZGRlc2N9W2xvY2tde2FjcXVpcmV9e1xvcHRpb25hbHt3YWl0ZmxhZ319Ci1XaXRob3V0IHRoZSBvcHRpb25hbCBhcmd1bWVudCwgdGhpcyBtZXRob2QgYWNxdWlyZXMgdGhlIGxvY2sKLXVuY29uZGl0aW9uYWxseSwgaWYgbmVjZXNzYXJ5IHdhaXRpbmcgdW50aWwgaXQgaXMgcmVsZWFzZWQgYnkgYW5vdGhlcgotdGhyZWFkIChvbmx5IG9uZSB0aHJlYWQgYXQgYSB0aW1lIGNhbiBhY3F1aXJlIGEgbG9jayAtLS0gdGhhdCdzIHRoZWlyCi1yZWFzb24gZm9yIGV4aXN0ZW5jZSkuICBJZiB0aGUgaW50ZWdlcgotXHZhcnt3YWl0ZmxhZ30gYXJndW1lbnQgaXMgcHJlc2VudCwgdGhlIGFjdGlvbiBkZXBlbmRzIG9uIGl0cwotdmFsdWU6IGlmIGl0IGlzIHplcm8sIHRoZSBsb2NrIGlzIG9ubHkgYWNxdWlyZWQgaWYgaXQgY2FuIGJlIGFjcXVpcmVkCi1pbW1lZGlhdGVseSB3aXRob3V0IHdhaXRpbmcsIHdoaWxlIGlmIGl0IGlzIG5vbnplcm8sIHRoZSBsb2NrIGlzCi1hY3F1aXJlZCB1bmNvbmRpdGlvbmFsbHkgYXMgYmVmb3JlLiAgVGhlCi1yZXR1cm4gdmFsdWUgaXMgXGNvZGV7VHJ1ZX0gaWYgdGhlIGxvY2sgaXMgYWNxdWlyZWQgc3VjY2Vzc2Z1bGx5LAotXGNvZGV7RmFsc2V9IGlmIG5vdC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2xvY2tde3JlbGVhc2V9e30KLVJlbGVhc2VzIHRoZSBsb2NrLiAgVGhlIGxvY2sgbXVzdCBoYXZlIGJlZW4gYWNxdWlyZWQgZWFybGllciwgYnV0IG5vdAotbmVjZXNzYXJpbHkgYnkgdGhlIHNhbWUgdGhyZWFkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bbG9ja117bG9ja2VkfXt9Ci1SZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgbG9jazpcIFxjb2Rle1RydWV9IGlmIGl0IGhhcyBiZWVuIGFjcXVpcmVkIGJ5Ci1zb21lIHRocmVhZCwgXGNvZGV7RmFsc2V9IGlmIG5vdC4KLVxlbmR7bWV0aG9kZGVzY30KLQotSW4gYWRkaXRpb24gdG8gdGhlc2UgbWV0aG9kcywgbG9jayBvYmplY3RzIGNhbiBhbHNvIGJlIHVzZWQgdmlhIHRoZQotXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50LCBlLmcuOgotCi1cYmVnaW57dmVyYmF0aW19Ci1mcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50Ci1pbXBvcnQgdGhyZWFkCi0KLWFfbG9jayA9IHRocmVhZC5hbGxvY2F0ZV9sb2NrKCkKLQotd2l0aCBhX2xvY2s6Ci0gICAgcHJpbnQgImFfbG9jayBpcyBsb2NrZWQgd2hpbGUgdGhpcyBleGVjdXRlcyIKLVxlbmR7dmVyYmF0aW19Ci0KLVxzdHJvbmd7Q2F2ZWF0czp9Ci0KLVxiZWdpbntpdGVtaXplfQotXGl0ZW0KLVRocmVhZHMgaW50ZXJhY3Qgc3RyYW5nZWx5IHdpdGggaW50ZXJydXB0czogdGhlCi1cZXhjZXB0aW9ue0tleWJvYXJkSW50ZXJydXB0fSBleGNlcHRpb24gd2lsbCBiZSByZWNlaXZlZCBieSBhbgotYXJiaXRyYXJ5IHRocmVhZC4gIChXaGVuIHRoZSBccmVmbW9kdWxle3NpZ25hbH1ccmVmYmltb2RpbmRleHtzaWduYWx9Ci1tb2R1bGUgaXMgYXZhaWxhYmxlLCBpbnRlcnJ1cHRzIGFsd2F5cyBnbyB0byB0aGUgbWFpbiB0aHJlYWQuKQotCi1caXRlbQotQ2FsbGluZyBcZnVuY3Rpb257c3lzLmV4aXQoKX0gb3IgcmFpc2luZyB0aGUgXGV4Y2VwdGlvbntTeXN0ZW1FeGl0fQotZXhjZXB0aW9uIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyBcZnVuY3Rpb257ZXhpdCgpfS4KLQotXGl0ZW0KLU5vdCBhbGwgYnVpbHQtaW4gZnVuY3Rpb25zIHRoYXQgbWF5IGJsb2NrIHdhaXRpbmcgZm9yIEkvTyBhbGxvdyBvdGhlcgotdGhyZWFkcyB0byBydW4uICAoVGhlIG1vc3QgcG9wdWxhciBvbmVzIChcZnVuY3Rpb257dGltZS5zbGVlcCgpfSwKLVxtZXRob2R7XHZhcntmaWxlfS5yZWFkKCl9LCBcZnVuY3Rpb257c2VsZWN0LnNlbGVjdCgpfSkgd29yayBhcwotZXhwZWN0ZWQuKQotCi1caXRlbQotSXQgaXMgbm90IHBvc3NpYmxlIHRvIGludGVycnVwdCB0aGUgXG1ldGhvZHthY3F1aXJlKCl9IG1ldGhvZCBvbiBhIGxvY2sKLS0tLSB0aGUgXGV4Y2VwdGlvbntLZXlib2FyZEludGVycnVwdH0gZXhjZXB0aW9uIHdpbGwgaGFwcGVuIGFmdGVyIHRoZQotbG9jayBoYXMgYmVlbiBhY3F1aXJlZC4KLQotXGl0ZW0KLVdoZW4gdGhlIG1haW4gdGhyZWFkIGV4aXRzLCBpdCBpcyBzeXN0ZW0gZGVmaW5lZCB3aGV0aGVyIHRoZSBvdGhlcgotdGhyZWFkcyBzdXJ2aXZlLiAgT24gU0dJIElSSVggdXNpbmcgdGhlIG5hdGl2ZSB0aHJlYWQgaW1wbGVtZW50YXRpb24sCi10aGV5IHN1cnZpdmUuICBPbiBtb3N0IG90aGVyIHN5c3RlbXMsIHRoZXkgYXJlIGtpbGxlZCB3aXRob3V0Ci1leGVjdXRpbmcgXGtleXdvcmR7dHJ5fSAuLi4gXGtleXdvcmR7ZmluYWxseX0gY2xhdXNlcyBvciBleGVjdXRpbmcKLW9iamVjdCBkZXN0cnVjdG9ycy4KLVxpbmRleGlpe3RocmVhZHN9e0lSSVh9Ci0KLVxpdGVtCi1XaGVuIHRoZSBtYWluIHRocmVhZCBleGl0cywgaXQgZG9lcyBub3QgZG8gYW55IG9mIGl0cyB1c3VhbCBjbGVhbnVwCi0oZXhjZXB0IHRoYXQgXGtleXdvcmR7dHJ5fSAuLi4gXGtleXdvcmR7ZmluYWxseX0gY2xhdXNlcyBhcmUgaG9ub3JlZCksCi1hbmQgdGhlIHN0YW5kYXJkIEkvTyBmaWxlcyBhcmUgbm90IGZsdXNoZWQuCi0KLVxlbmR7aXRlbWl6ZX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlidGhyZWFkaW5nLnRleCBiL0RvYy9saWIvbGlidGhyZWFkaW5nLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTljNDk2ZS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnRocmVhZGluZy50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw3MjggKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXt0aHJlYWRpbmd9IC0tLQotICAgICAgICAgSGlnaGVyLWxldmVsIHRocmVhZGluZyBpbnRlcmZhY2V9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXt0aHJlYWRpbmd9Ci1cbW9kdWxlc3lub3BzaXN7SGlnaGVyLWxldmVsIHRocmVhZGluZyBpbnRlcmZhY2UufQotCi0KLVRoaXMgbW9kdWxlIGNvbnN0cnVjdHMgaGlnaGVyLWxldmVsIHRocmVhZGluZyBpbnRlcmZhY2VzIG9uIHRvcCBvZiB0aGUgCi1sb3dlciBsZXZlbCBccmVmbW9kdWxle3RocmVhZH0gbW9kdWxlLgotCi1UaGUgXHJlZm1vZHVsZVtkdW1teXRocmVhZGluZ117ZHVtbXlfdGhyZWFkaW5nfSBtb2R1bGUgaXMgcHJvdmlkZWQgZm9yCi1zaXR1YXRpb25zIHdoZXJlIFxtb2R1bGV7dGhyZWFkaW5nfSBjYW5ub3QgYmUgdXNlZCBiZWNhdXNlCi1ccmVmbW9kdWxle3RocmVhZH0gaXMgbWlzc2luZy4KLQotVGhpcyBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhbmQgb2JqZWN0czoKLQotXGJlZ2lue2Z1bmNkZXNjfXthY3RpdmVDb3VudH17fQotUmV0dXJuIHRoZSBudW1iZXIgb2YgXGNsYXNze1RocmVhZH0gb2JqZWN0cyBjdXJyZW50bHkgYWxpdmUuICBUaGUKLXJldHVybmVkIGNvdW50IGlzIGVxdWFsIHRvIHRoZSBsZW5ndGggb2YgdGhlIGxpc3QgcmV0dXJuZWQgYnkKLVxmdW5jdGlvbntlbnVtZXJhdGUoKX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2NuaX17Q29uZGl0aW9ufXt9Ci1BIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgbmV3IGNvbmRpdGlvbiB2YXJpYWJsZSBvYmplY3QuCi1BIGNvbmRpdGlvbiB2YXJpYWJsZSBhbGxvd3Mgb25lIG9yIG1vcmUgdGhyZWFkcyB0byB3YWl0IHVudGlsIHRoZXkKLWFyZSBub3RpZmllZCBieSBhbm90aGVyIHRocmVhZC4KLVxlbmR7ZnVuY2Rlc2NuaX0KLQotXGJlZ2lue2Z1bmNkZXNjfXtjdXJyZW50VGhyZWFkfXt9Ci1SZXR1cm4gdGhlIGN1cnJlbnQgXGNsYXNze1RocmVhZH0gb2JqZWN0LCBjb3JyZXNwb25kaW5nIHRvIHRoZQotY2FsbGVyJ3MgdGhyZWFkIG9mIGNvbnRyb2wuICBJZiB0aGUgY2FsbGVyJ3MgdGhyZWFkIG9mIGNvbnRyb2wgd2FzIG5vdAotY3JlYXRlZCB0aHJvdWdoIHRoZQotXG1vZHVsZXt0aHJlYWRpbmd9IG1vZHVsZSwgYSBkdW1teSB0aHJlYWQgb2JqZWN0IHdpdGggbGltaXRlZCBmdW5jdGlvbmFsaXR5Ci1pcyByZXR1cm5lZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZW51bWVyYXRlfXt9Ci1SZXR1cm4gYSBsaXN0IG9mIGFsbCBcY2xhc3N7VGhyZWFkfSBvYmplY3RzIGN1cnJlbnRseSBhbGl2ZS4gIFRoZSBsaXN0Ci1pbmNsdWRlcyBkYWVtb25pYyB0aHJlYWRzLCBkdW1teSB0aHJlYWQgb2JqZWN0cyBjcmVhdGVkIGJ5Ci1cZnVuY3Rpb257Y3VycmVudFRocmVhZCgpfSwgYW5kIHRoZSBtYWluIHRocmVhZC4gIEl0IGV4Y2x1ZGVzCi10ZXJtaW5hdGVkIHRocmVhZHMgYW5kIHRocmVhZHMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBzdGFydGVkLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjbml9e0V2ZW50fXt9Ci1BIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgbmV3IGV2ZW50IG9iamVjdC4gIEFuIGV2ZW50IG1hbmFnZXMKLWEgZmxhZyB0aGF0IGNhbiBiZSBzZXQgdG8gdHJ1ZSB3aXRoIHRoZSBcbWV0aG9ke3NldCgpfSBtZXRob2QgYW5kCi1yZXNldCB0byBmYWxzZSB3aXRoIHRoZSBcbWV0aG9ke2NsZWFyKCl9IG1ldGhvZC4gIFRoZSBcbWV0aG9ke3dhaXQoKX0KLW1ldGhvZCBibG9ja3MgdW50aWwgdGhlIGZsYWcgaXMgdHJ1ZS4KLVxlbmR7ZnVuY2Rlc2NuaX0KLQotXGJlZ2lue2NsYXNzZGVzYyp9e2xvY2FsfXt9Ci1BIGNsYXNzIHRoYXQgcmVwcmVzZW50cyB0aHJlYWQtbG9jYWwgZGF0YS4gIFRocmVhZC1sb2NhbCBkYXRhIGFyZSBkYXRhCi13aG9zZSB2YWx1ZXMgYXJlIHRocmVhZCBzcGVjaWZpYy4gIFRvIG1hbmFnZSB0aHJlYWQtbG9jYWwgZGF0YSwganVzdAotY3JlYXRlIGFuIGluc3RhbmNlIG9mIFxjbGFzc3tsb2NhbH0gKG9yIGEgc3ViY2xhc3MpIGFuZCBzdG9yZQotYXR0cmlidXRlcyBvbiBpdDoKLQotXGJlZ2lue3ZlcmJhdGltfQotbXlkYXRhID0gdGhyZWFkaW5nLmxvY2FsKCkKLW15ZGF0YS54ID0gMQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGluc3RhbmNlJ3MgdmFsdWVzIHdpbGwgYmUgZGlmZmVyZW50IGZvciBzZXBhcmF0ZSB0aHJlYWRzLgotCi1Gb3IgbW9yZSBkZXRhaWxzIGFuZCBleHRlbnNpdmUgZXhhbXBsZXMsIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBzdHJpbmcKLW9mIHRoZSBcbW9kdWxle190aHJlYWRpbmdfbG9jYWx9IG1vZHVsZS4KLQotXHZlcnNpb25hZGRlZHsyLjR9Ci1cZW5ke2NsYXNzZGVzYyp9Ci0KLVxiZWdpbntmdW5jZGVzY317TG9ja317fQotQSBmYWN0b3J5IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIG5ldyBwcmltaXRpdmUgbG9jayBvYmplY3QuICBPbmNlCi1hIHRocmVhZCBoYXMgYWNxdWlyZWQgaXQsIHN1YnNlcXVlbnQgYXR0ZW1wdHMgdG8gYWNxdWlyZSBpdCBibG9jaywKLXVudGlsIGl0IGlzIHJlbGVhc2VkOyBhbnkgdGhyZWFkIG1heSByZWxlYXNlIGl0LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtSTG9ja317fQotQSBmYWN0b3J5IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIG5ldyByZWVudHJhbnQgbG9jayBvYmplY3QuCi1BIHJlZW50cmFudCBsb2NrIG11c3QgYmUgcmVsZWFzZWQgYnkgdGhlIHRocmVhZCB0aGF0IGFjcXVpcmVkIGl0LgotT25jZSBhIHRocmVhZCBoYXMgYWNxdWlyZWQgYSByZWVudHJhbnQgbG9jaywgdGhlIHNhbWUgdGhyZWFkIG1heQotYWNxdWlyZSBpdCBhZ2FpbiB3aXRob3V0IGJsb2NraW5nOyB0aGUgdGhyZWFkIG11c3QgcmVsZWFzZSBpdCBvbmNlCi1mb3IgZWFjaCB0aW1lIGl0IGhhcyBhY3F1aXJlZCBpdC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY25pfXtTZW1hcGhvcmV9e1xvcHRpb25hbHt2YWx1ZX19Ci1BIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgbmV3IHNlbWFwaG9yZSBvYmplY3QuICBBCi1zZW1hcGhvcmUgbWFuYWdlcyBhIGNvdW50ZXIgcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2YgXG1ldGhvZHtyZWxlYXNlKCl9Ci1jYWxscyBtaW51cyB0aGUgbnVtYmVyIG9mIFxtZXRob2R7YWNxdWlyZSgpfSBjYWxscywgcGx1cyBhbiBpbml0aWFsIHZhbHVlLgotVGhlIFxtZXRob2R7YWNxdWlyZSgpfSBtZXRob2QgYmxvY2tzIGlmIG5lY2Vzc2FyeSB1bnRpbCBpdCBjYW4gcmV0dXJuCi13aXRob3V0IG1ha2luZyB0aGUgY291bnRlciBuZWdhdGl2ZS4gIElmIG5vdCBnaXZlbiwgXHZhcnt2YWx1ZX0gZGVmYXVsdHMgdG8KLTEuIAotXGVuZHtmdW5jZGVzY25pfQotCi1cYmVnaW57ZnVuY2Rlc2N9e0JvdW5kZWRTZW1hcGhvcmV9e1xvcHRpb25hbHt2YWx1ZX19Ci1BIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgbmV3IGJvdW5kZWQgc2VtYXBob3JlIG9iamVjdC4gIEEgYm91bmRlZAotc2VtYXBob3JlIGNoZWNrcyB0byBtYWtlIHN1cmUgaXRzIGN1cnJlbnQgdmFsdWUgZG9lc24ndCBleGNlZWQgaXRzIGluaXRpYWwKLXZhbHVlLiAgSWYgaXQgZG9lcywgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSBpcyByYWlzZWQuIEluIG1vc3Qgc2l0dWF0aW9ucwotc2VtYXBob3JlcyBhcmUgdXNlZCB0byBndWFyZCByZXNvdXJjZXMgd2l0aCBsaW1pdGVkIGNhcGFjaXR5LiAgSWYgdGhlCi1zZW1hcGhvcmUgaXMgcmVsZWFzZWQgdG9vIG1hbnkgdGltZXMgaXQncyBhIHNpZ24gb2YgYSBidWcuICBJZiBub3QgZ2l2ZW4sCi1cdmFye3ZhbHVlfSBkZWZhdWx0cyB0byAxLiAKLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2MqfXtUaHJlYWR9Ci1BIGNsYXNzIHRoYXQgcmVwcmVzZW50cyBhIHRocmVhZCBvZiBjb250cm9sLiAgVGhpcyBjbGFzcyBjYW4gYmUgc2FmZWx5Ci1zdWJjbGFzc2VkIGluIGEgbGltaXRlZCBmYXNoaW9uLgotXGVuZHtjbGFzc2Rlc2MqfQotCi1cYmVnaW57Y2xhc3NkZXNjKn17VGltZXJ9Ci1BIHRocmVhZCB0aGF0IGV4ZWN1dGVzIGEgZnVuY3Rpb24gYWZ0ZXIgYSBzcGVjaWZpZWQgaW50ZXJ2YWwgaGFzIHBhc3NlZC4KLVxlbmR7Y2xhc3NkZXNjKn0KLQotXGJlZ2lue2Z1bmNkZXNjfXtzZXR0cmFjZX17ZnVuY30KLVNldCBhIHRyYWNlIGZ1bmN0aW9uXGluZGV4e3RyYWNlIGZ1bmN0aW9ufSBmb3IgYWxsIHRocmVhZHMgc3RhcnRlZAotZnJvbSB0aGUgXG1vZHVsZXt0aHJlYWRpbmd9IG1vZHVsZS4gIFRoZSBcdmFye2Z1bmN9IHdpbGwgYmUgcGFzc2VkIHRvIAotXGZ1bmN0aW9ue3N5cy5zZXR0cmFjZSgpfSBmb3IgZWFjaCB0aHJlYWQsIGJlZm9yZSBpdHMgXG1ldGhvZHtydW4oKX0KLW1ldGhvZCBpcyBjYWxsZWQuCi1cdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c2V0cHJvZmlsZX17ZnVuY30KLVNldCBhIHByb2ZpbGUgZnVuY3Rpb25caW5kZXh7cHJvZmlsZSBmdW5jdGlvbn0gZm9yIGFsbCB0aHJlYWRzIHN0YXJ0ZWQKLWZyb20gdGhlIFxtb2R1bGV7dGhyZWFkaW5nfSBtb2R1bGUuICBUaGUgXHZhcntmdW5jfSB3aWxsIGJlIHBhc3NlZCB0byAKLVxmdW5jdGlvbntzeXMuc2V0cHJvZmlsZSgpfSBmb3IgZWFjaCB0aHJlYWQsIGJlZm9yZSBpdHMgXG1ldGhvZHtydW4oKX0KLW1ldGhvZCBpcyBjYWxsZWQuCi1cdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c3RhY2tfc2l6ZX17XG9wdGlvbmFse3NpemV9fQotUmV0dXJuIHRoZSB0aHJlYWQgc3RhY2sgc2l6ZSB1c2VkIHdoZW4gY3JlYXRpbmcgbmV3IHRocmVhZHMuICBUaGUKLW9wdGlvbmFsIFx2YXJ7c2l6ZX0gYXJndW1lbnQgc3BlY2lmaWVzIHRoZSBzdGFjayBzaXplIHRvIGJlIHVzZWQgZm9yCi1zdWJzZXF1ZW50bHkgY3JlYXRlZCB0aHJlYWRzLCBhbmQgbXVzdCBiZSAwICh1c2UgcGxhdGZvcm0gb3IKLWNvbmZpZ3VyZWQgZGVmYXVsdCkgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIHZhbHVlIG9mIGF0IGxlYXN0IDMyLDc2OCAoMzJrQikuCi1JZiBjaGFuZ2luZyB0aGUgdGhyZWFkIHN0YWNrIHNpemUgaXMgdW5zdXBwb3J0ZWQsIGEgXGV4Y2VwdGlvbntUaHJlYWRFcnJvcn0KLWlzIHJhaXNlZC4gIElmIHRoZSBzcGVjaWZpZWQgc3RhY2sgc2l6ZSBpcyBpbnZhbGlkLCBhIFxleGNlcHRpb257VmFsdWVFcnJvcn0KLWlzIHJhaXNlZCBhbmQgdGhlIHN0YWNrIHNpemUgaXMgdW5tb2RpZmllZC4gIDMya0IgaXMgY3VycmVudGx5IHRoZSBtaW5pbXVtCi1zdXBwb3J0ZWQgc3RhY2sgc2l6ZSB2YWx1ZSB0byBndWFyYW50ZWUgc3VmZmljaWVudCBzdGFjayBzcGFjZSBmb3IgdGhlCi1pbnRlcnByZXRlciBpdHNlbGYuICBOb3RlIHRoYXQgc29tZSBwbGF0Zm9ybXMgbWF5IGhhdmUgcGFydGljdWxhcgotcmVzdHJpY3Rpb25zIG9uIHZhbHVlcyBmb3IgdGhlIHN0YWNrIHNpemUsIHN1Y2ggYXMgcmVxdWlyaW5nIGEgbWluaW11bQotc3RhY2sgc2l6ZSA+IDMya0Igb3IgcmVxdWlyaW5nIGFsbG9jYXRpb24gaW4gbXVsdGlwbGVzIG9mIHRoZSBzeXN0ZW0KLW1lbW9yeSBwYWdlIHNpemUgLSBwbGF0Zm9ybSBkb2N1bWVudGF0aW9uIHNob3VsZCBiZSByZWZlcnJlZCB0byBmb3IKLW1vcmUgaW5mb3JtYXRpb24gKDRrQiBwYWdlcyBhcmUgY29tbW9uOyB1c2luZyBtdWx0aXBsZXMgb2YgNDA5NiBmb3IKLXRoZSBzdGFjayBzaXplIGlzIHRoZSBzdWdnZXN0ZWQgYXBwcm9hY2ggaW4gdGhlIGFic2VuY2Ugb2YgbW9yZQotc3BlY2lmaWMgaW5mb3JtYXRpb24pLgotQXZhaWxhYmlsaXR5OiBXaW5kb3dzLCBzeXN0ZW1zIHdpdGggXFBPU0lYe30gdGhyZWFkcy4KLVx2ZXJzaW9uYWRkZWR7Mi41fQotXGVuZHtmdW5jZGVzY30KLQotRGV0YWlsZWQgaW50ZXJmYWNlcyBmb3IgdGhlIG9iamVjdHMgYXJlIGRvY3VtZW50ZWQgYmVsb3cuICAKLQotVGhlIGRlc2lnbiBvZiB0aGlzIG1vZHVsZSBpcyBsb29zZWx5IGJhc2VkIG9uIEphdmEncyB0aHJlYWRpbmcgbW9kZWwuCi1Ib3dldmVyLCB3aGVyZSBKYXZhIG1ha2VzIGxvY2tzIGFuZCBjb25kaXRpb24gdmFyaWFibGVzIGJhc2ljIGJlaGF2aW9yCi1vZiBldmVyeSBvYmplY3QsIHRoZXkgYXJlIHNlcGFyYXRlIG9iamVjdHMgaW4gUHl0aG9uLiAgUHl0aG9uJ3MgXGNsYXNze1RocmVhZH0KLWNsYXNzIHN1cHBvcnRzIGEgc3Vic2V0IG9mIHRoZSBiZWhhdmlvciBvZiBKYXZhJ3MgVGhyZWFkIGNsYXNzOwotY3VycmVudGx5LCB0aGVyZSBhcmUgbm8gcHJpb3JpdGllcywgbm8gdGhyZWFkIGdyb3VwcywgYW5kIHRocmVhZHMKLWNhbm5vdCBiZSBkZXN0cm95ZWQsIHN0b3BwZWQsIHN1c3BlbmRlZCwgcmVzdW1lZCwgb3IgaW50ZXJydXB0ZWQuICBUaGUKLXN0YXRpYyBtZXRob2RzIG9mIEphdmEncyBUaHJlYWQgY2xhc3MsIHdoZW4gaW1wbGVtZW50ZWQsIGFyZSBtYXBwZWQgdG8KLW1vZHVsZS1sZXZlbCBmdW5jdGlvbnMuCi0KLUFsbCBvZiB0aGUgbWV0aG9kcyBkZXNjcmliZWQgYmVsb3cgYXJlIGV4ZWN1dGVkIGF0b21pY2FsbHkuCi0KLQotXHN1YnNlY3Rpb257TG9jayBPYmplY3RzIFxsYWJlbHtsb2NrLW9iamVjdHN9fQotCi1BIHByaW1pdGl2ZSBsb2NrIGlzIGEgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZSB0aGF0IGlzIG5vdCBvd25lZAotYnkgYSBwYXJ0aWN1bGFyIHRocmVhZCB3aGVuIGxvY2tlZC4gIEluIFB5dGhvbiwgaXQgaXMgY3VycmVudGx5Ci10aGUgbG93ZXN0IGxldmVsIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmUgYXZhaWxhYmxlLCBpbXBsZW1lbnRlZAotZGlyZWN0bHkgYnkgdGhlIFxyZWZtb2R1bGV7dGhyZWFkfSBleHRlbnNpb24gbW9kdWxlLgotCi1BIHByaW1pdGl2ZSBsb2NrIGlzIGluIG9uZSBvZiB0d28gc3RhdGVzLCBgYGxvY2tlZCcnIG9yIGBgdW5sb2NrZWQnJy4KLUl0IGlzIGNyZWF0ZWQgaW4gdGhlIHVubG9ja2VkIHN0YXRlLiAgSXQgaGFzIHR3byBiYXNpYyBtZXRob2RzLAotXG1ldGhvZHthY3F1aXJlKCl9IGFuZCBcbWV0aG9ke3JlbGVhc2UoKX0uICBXaGVuIHRoZSBzdGF0ZSBpcwotdW5sb2NrZWQsIFxtZXRob2R7YWNxdWlyZSgpfSBjaGFuZ2VzIHRoZSBzdGF0ZSB0byBsb2NrZWQgYW5kIHJldHVybnMKLWltbWVkaWF0ZWx5LiAgV2hlbiB0aGUgc3RhdGUgaXMgbG9ja2VkLCBcbWV0aG9ke2FjcXVpcmUoKX0gYmxvY2tzCi11bnRpbCBhIGNhbGwgdG8gXG1ldGhvZHtyZWxlYXNlKCl9IGluIGFub3RoZXIgdGhyZWFkIGNoYW5nZXMgaXQgdG8KLXVubG9ja2VkLCB0aGVuIHRoZSBcbWV0aG9ke2FjcXVpcmUoKX0gY2FsbCByZXNldHMgaXQgdG8gbG9ja2VkIGFuZAotcmV0dXJucy4gIFRoZSBcbWV0aG9ke3JlbGVhc2UoKX0gbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpbiB0aGUKLWxvY2tlZCBzdGF0ZTsgaXQgY2hhbmdlcyB0aGUgc3RhdGUgdG8gdW5sb2NrZWQgYW5kIHJldHVybnMKLWltbWVkaWF0ZWx5LiBJZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gcmVsZWFzZSBhbiB1bmxvY2tlZCBsb2NrLCBhCi1cZXhjZXB0aW9ue1J1bnRpbWVFcnJvcn0gd2lsbCBiZSByYWlzZWQuCi0KLVdoZW4gbW9yZSB0aGFuIG9uZSB0aHJlYWQgaXMgYmxvY2tlZCBpbiBcbWV0aG9ke2FjcXVpcmUoKX0gd2FpdGluZyBmb3IKLXRoZSBzdGF0ZSB0byB0dXJuIHRvIHVubG9ja2VkLCBvbmx5IG9uZSB0aHJlYWQgcHJvY2VlZHMgd2hlbiBhCi1cbWV0aG9ke3JlbGVhc2UoKX0gY2FsbCByZXNldHMgdGhlIHN0YXRlIHRvIHVubG9ja2VkOyB3aGljaCBvbmUgb2YgdGhlCi13YWl0aW5nIHRocmVhZHMgcHJvY2VlZHMgaXMgbm90IGRlZmluZWQsIGFuZCBtYXkgdmFyeSBhY3Jvc3MKLWltcGxlbWVudGF0aW9ucy4KLQotQWxsIG1ldGhvZHMgYXJlIGV4ZWN1dGVkIGF0b21pY2FsbHkuCi0KLVxiZWdpbnttZXRob2RkZXNjfVtMb2NrXXthY3F1aXJlfXtcb3B0aW9uYWx7YmxvY2tpbmdcY29kZXsgPSAxfX19Ci1BY3F1aXJlIGEgbG9jaywgYmxvY2tpbmcgb3Igbm9uLWJsb2NraW5nLgotCi1XaGVuIGludm9rZWQgd2l0aG91dCBhcmd1bWVudHMsIGJsb2NrIHVudGlsIHRoZSBsb2NrIGlzCi11bmxvY2tlZCwgdGhlbiBzZXQgaXQgdG8gbG9ja2VkLCBhbmQgcmV0dXJuIHRydWUuICAKLQotV2hlbiBpbnZva2VkIHdpdGggdGhlIFx2YXJ7YmxvY2tpbmd9IGFyZ3VtZW50IHNldCB0byB0cnVlLCBkbyB0aGUKLXNhbWUgdGhpbmcgYXMgd2hlbiBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHMsIGFuZCByZXR1cm4gdHJ1ZS4KLQotV2hlbiBpbnZva2VkIHdpdGggdGhlIFx2YXJ7YmxvY2tpbmd9IGFyZ3VtZW50IHNldCB0byBmYWxzZSwgZG8gbm90Ci1ibG9jay4gIElmIGEgY2FsbCB3aXRob3V0IGFuIGFyZ3VtZW50IHdvdWxkIGJsb2NrLCByZXR1cm4gZmFsc2UKLWltbWVkaWF0ZWx5OyBvdGhlcndpc2UsIGRvIHRoZSBzYW1lIHRoaW5nIGFzIHdoZW4gY2FsbGVkCi13aXRob3V0IGFyZ3VtZW50cywgYW5kIHJldHVybiB0cnVlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTG9ja117cmVsZWFzZX17fQotUmVsZWFzZSBhIGxvY2suCi0KLVdoZW4gdGhlIGxvY2sgaXMgbG9ja2VkLCByZXNldCBpdCB0byB1bmxvY2tlZCwgYW5kIHJldHVybi4gIElmCi1hbnkgb3RoZXIgdGhyZWFkcyBhcmUgYmxvY2tlZCB3YWl0aW5nIGZvciB0aGUgbG9jayB0byBiZWNvbWUKLXVubG9ja2VkLCBhbGxvdyBleGFjdGx5IG9uZSBvZiB0aGVtIHRvIHByb2NlZWQuCi0KLURvIG5vdCBjYWxsIHRoaXMgbWV0aG9kIHdoZW4gdGhlIGxvY2sgaXMgdW5sb2NrZWQuCi0KLVRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cc3Vic2VjdGlvbntSTG9jayBPYmplY3RzIFxsYWJlbHtybG9jay1vYmplY3RzfX0KLQotQSByZWVudHJhbnQgbG9jayBpcyBhIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmUgdGhhdCBtYXkgYmUKLWFjcXVpcmVkIG11bHRpcGxlIHRpbWVzIGJ5IHRoZSBzYW1lIHRocmVhZC4gIEludGVybmFsbHksIGl0IHVzZXMKLXRoZSBjb25jZXB0cyBvZiBgYG93bmluZyB0aHJlYWQnJyBhbmQgYGByZWN1cnNpb24gbGV2ZWwnJyBpbgotYWRkaXRpb24gdG8gdGhlIGxvY2tlZC91bmxvY2tlZCBzdGF0ZSB1c2VkIGJ5IHByaW1pdGl2ZSBsb2Nrcy4gIEluCi10aGUgbG9ja2VkIHN0YXRlLCBzb21lIHRocmVhZCBvd25zIHRoZSBsb2NrOyBpbiB0aGUgdW5sb2NrZWQKLXN0YXRlLCBubyB0aHJlYWQgb3ducyBpdC4KLQotVG8gbG9jayB0aGUgbG9jaywgYSB0aHJlYWQgY2FsbHMgaXRzIFxtZXRob2R7YWNxdWlyZSgpfSBtZXRob2Q7IHRoaXMKLXJldHVybnMgb25jZSB0aGUgdGhyZWFkIG93bnMgdGhlIGxvY2suICBUbyB1bmxvY2sgdGhlIGxvY2ssIGEKLXRocmVhZCBjYWxscyBpdHMgXG1ldGhvZHtyZWxlYXNlKCl9IG1ldGhvZC4KLVxtZXRob2R7YWNxdWlyZSgpfS9cbWV0aG9ke3JlbGVhc2UoKX0gY2FsbCBwYWlycyBtYXkgYmUgbmVzdGVkOyBvbmx5Ci10aGUgZmluYWwgXG1ldGhvZHtyZWxlYXNlKCl9ICh0aGUgXG1ldGhvZHtyZWxlYXNlKCl9IG9mIHRoZSBvdXRlcm1vc3QKLXBhaXIpIHJlc2V0cyB0aGUgbG9jayB0byB1bmxvY2tlZCBhbmQgYWxsb3dzIGFub3RoZXIgdGhyZWFkIGJsb2NrZWQgaW4KLVxtZXRob2R7YWNxdWlyZSgpfSB0byBwcm9jZWVkLgotCi1cYmVnaW57bWV0aG9kZGVzY31bUkxvY2tde2FjcXVpcmV9e1xvcHRpb25hbHtibG9ja2luZ1xjb2RleyA9IDF9fX0KLUFjcXVpcmUgYSBsb2NrLCBibG9ja2luZyBvciBub24tYmxvY2tpbmcuCi0KLVdoZW4gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50czogaWYgdGhpcyB0aHJlYWQgYWxyZWFkeSBvd25zCi10aGUgbG9jaywgaW5jcmVtZW50IHRoZSByZWN1cnNpb24gbGV2ZWwgYnkgb25lLCBhbmQgcmV0dXJuCi1pbW1lZGlhdGVseS4gIE90aGVyd2lzZSwgaWYgYW5vdGhlciB0aHJlYWQgb3ducyB0aGUgbG9jaywKLWJsb2NrIHVudGlsIHRoZSBsb2NrIGlzIHVubG9ja2VkLiAgT25jZSB0aGUgbG9jayBpcyB1bmxvY2tlZAotKG5vdCBvd25lZCBieSBhbnkgdGhyZWFkKSwgdGhlbiBncmFiIG93bmVyc2hpcCwgc2V0IHRoZQotcmVjdXJzaW9uIGxldmVsIHRvIG9uZSwgYW5kIHJldHVybi4gIElmIG1vcmUgdGhhbiBvbmUgdGhyZWFkCi1pcyBibG9ja2VkIHdhaXRpbmcgdW50aWwgdGhlIGxvY2sgaXMgdW5sb2NrZWQsIG9ubHkgb25lIGF0IGEKLXRpbWUgd2lsbCBiZSBhYmxlIHRvIGdyYWIgb3duZXJzaGlwIG9mIHRoZSBsb2NrLiAgVGhlcmUgaXMgbm8KLXJldHVybiB2YWx1ZSBpbiB0aGlzIGNhc2UuCi0KLVdoZW4gaW52b2tlZCB3aXRoIHRoZSBcdmFye2Jsb2NraW5nfSBhcmd1bWVudCBzZXQgdG8gdHJ1ZSwgZG8gdGhlCi1zYW1lIHRoaW5nIGFzIHdoZW4gY2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzLCBhbmQgcmV0dXJuIHRydWUuCi0KLVdoZW4gaW52b2tlZCB3aXRoIHRoZSBcdmFye2Jsb2NraW5nfSBhcmd1bWVudCBzZXQgdG8gZmFsc2UsIGRvIG5vdAotYmxvY2suICBJZiBhIGNhbGwgd2l0aG91dCBhbiBhcmd1bWVudCB3b3VsZCBibG9jaywgcmV0dXJuIGZhbHNlCi1pbW1lZGlhdGVseTsgb3RoZXJ3aXNlLCBkbyB0aGUgc2FtZSB0aGluZyBhcyB3aGVuIGNhbGxlZAotd2l0aG91dCBhcmd1bWVudHMsIGFuZCByZXR1cm4gdHJ1ZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1JMb2NrXXtyZWxlYXNlfXt9Ci1SZWxlYXNlIGEgbG9jaywgZGVjcmVtZW50aW5nIHRoZSByZWN1cnNpb24gbGV2ZWwuICBJZiBhZnRlciB0aGUKLWRlY3JlbWVudCBpdCBpcyB6ZXJvLCByZXNldCB0aGUgbG9jayB0byB1bmxvY2tlZCAobm90IG93bmVkIGJ5IGFueQotdGhyZWFkKSwgYW5kIGlmIGFueSBvdGhlciB0aHJlYWRzIGFyZSBibG9ja2VkIHdhaXRpbmcgZm9yIHRoZSBsb2NrIHRvCi1iZWNvbWUgdW5sb2NrZWQsIGFsbG93IGV4YWN0bHkgb25lIG9mIHRoZW0gdG8gcHJvY2VlZC4gIElmIGFmdGVyIHRoZQotZGVjcmVtZW50IHRoZSByZWN1cnNpb24gbGV2ZWwgaXMgc3RpbGwgbm9uemVybywgdGhlIGxvY2sgcmVtYWlucwotbG9ja2VkIGFuZCBvd25lZCBieSB0aGUgY2FsbGluZyB0aHJlYWQuCi0KLU9ubHkgY2FsbCB0aGlzIG1ldGhvZCB3aGVuIHRoZSBjYWxsaW5nIHRocmVhZCBvd25zIHRoZSBsb2NrLiBBCi1cZXhjZXB0aW9ue1J1bnRpbWVFcnJvcn0gaXMgcmFpc2VkIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZQotbG9jayBpcyB1bmxvY2tlZC4KLQotVGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlLgotXGVuZHttZXRob2RkZXNjfQotCi0KLVxzdWJzZWN0aW9ue0NvbmRpdGlvbiBPYmplY3RzIFxsYWJlbHtjb25kaXRpb24tb2JqZWN0c319Ci0KLUEgY29uZGl0aW9uIHZhcmlhYmxlIGlzIGFsd2F5cyBhc3NvY2lhdGVkIHdpdGggc29tZSBraW5kIG9mIGxvY2s7Ci10aGlzIGNhbiBiZSBwYXNzZWQgaW4gb3Igb25lIHdpbGwgYmUgY3JlYXRlZCBieSBkZWZhdWx0LiAgKFBhc3NpbmcKLW9uZSBpbiBpcyB1c2VmdWwgd2hlbiBzZXZlcmFsIGNvbmRpdGlvbiB2YXJpYWJsZXMgbXVzdCBzaGFyZSB0aGUKLXNhbWUgbG9jay4pCi0KLUEgY29uZGl0aW9uIHZhcmlhYmxlIGhhcyBcbWV0aG9ke2FjcXVpcmUoKX0gYW5kIFxtZXRob2R7cmVsZWFzZSgpfQotbWV0aG9kcyB0aGF0IGNhbGwgdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kcyBvZiB0aGUgYXNzb2NpYXRlZCBsb2NrLgotSXQgYWxzbyBoYXMgYSBcbWV0aG9ke3dhaXQoKX0gbWV0aG9kLCBhbmQgXG1ldGhvZHtub3RpZnkoKX0gYW5kCi1cbWV0aG9ke25vdGlmeUFsbCgpfSBtZXRob2RzLiAgVGhlc2UgdGhyZWUgbXVzdCBvbmx5IGJlIGNhbGxlZCB3aGVuCi10aGUgY2FsbGluZyB0aHJlYWQgaGFzIGFjcXVpcmVkIHRoZSBsb2NrLCBvdGhlcndpc2UgYQotXGV4Y2VwdGlvbntSdW50aW1lRXJyb3J9IGlzIHJhaXNlZC4KLQotVGhlIFxtZXRob2R7d2FpdCgpfSBtZXRob2QgcmVsZWFzZXMgdGhlIGxvY2ssIGFuZCB0aGVuIGJsb2NrcyB1bnRpbCBpdAotaXMgYXdha2VuZWQgYnkgYSBcbWV0aG9ke25vdGlmeSgpfSBvciBcbWV0aG9ke25vdGlmeUFsbCgpfSBjYWxsIGZvcgotdGhlIHNhbWUgY29uZGl0aW9uIHZhcmlhYmxlIGluIGFub3RoZXIgdGhyZWFkLiAgT25jZSBhd2FrZW5lZCwgaXQKLXJlLWFjcXVpcmVzIHRoZSBsb2NrIGFuZCByZXR1cm5zLiAgSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBzcGVjaWZ5IGEKLXRpbWVvdXQuCi0KLVRoZSBcbWV0aG9ke25vdGlmeSgpfSBtZXRob2Qgd2FrZXMgdXAgb25lIG9mIHRoZSB0aHJlYWRzIHdhaXRpbmcgZm9yCi10aGUgY29uZGl0aW9uIHZhcmlhYmxlLCBpZiBhbnkgYXJlIHdhaXRpbmcuICBUaGUgXG1ldGhvZHtub3RpZnlBbGwoKX0KLW1ldGhvZCB3YWtlcyB1cCBhbGwgdGhyZWFkcyB3YWl0aW5nIGZvciB0aGUgY29uZGl0aW9uIHZhcmlhYmxlLgotCi1Ob3RlOiB0aGUgXG1ldGhvZHtub3RpZnkoKX0gYW5kIFxtZXRob2R7bm90aWZ5QWxsKCl9IG1ldGhvZHMgZG9uJ3QKLXJlbGVhc2UgdGhlIGxvY2s7IHRoaXMgbWVhbnMgdGhhdCB0aGUgdGhyZWFkIG9yIHRocmVhZHMgYXdha2VuZWQgd2lsbAotbm90IHJldHVybiBmcm9tIHRoZWlyIFxtZXRob2R7d2FpdCgpfSBjYWxsIGltbWVkaWF0ZWx5LCBidXQgb25seSB3aGVuCi10aGUgdGhyZWFkIHRoYXQgY2FsbGVkIFxtZXRob2R7bm90aWZ5KCl9IG9yIFxtZXRob2R7bm90aWZ5QWxsKCl9Ci1maW5hbGx5IHJlbGlucXVpc2hlcyBvd25lcnNoaXAgb2YgdGhlIGxvY2suCi0KLVRpcDogdGhlIHR5cGljYWwgcHJvZ3JhbW1pbmcgc3R5bGUgdXNpbmcgY29uZGl0aW9uIHZhcmlhYmxlcyB1c2VzIHRoZQotbG9jayB0byBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gc29tZSBzaGFyZWQgc3RhdGU7IHRocmVhZHMgdGhhdCBhcmUKLWludGVyZXN0ZWQgaW4gYSBwYXJ0aWN1bGFyIGNoYW5nZSBvZiBzdGF0ZSBjYWxsIFxtZXRob2R7d2FpdCgpfQotcmVwZWF0ZWRseSB1bnRpbCB0aGV5IHNlZSB0aGUgZGVzaXJlZCBzdGF0ZSwgd2hpbGUgdGhyZWFkcyB0aGF0IG1vZGlmeQotdGhlIHN0YXRlIGNhbGwgXG1ldGhvZHtub3RpZnkoKX0gb3IgXG1ldGhvZHtub3RpZnlBbGwoKX0gd2hlbiB0aGV5Ci1jaGFuZ2UgdGhlIHN0YXRlIGluIHN1Y2ggYSB3YXkgdGhhdCBpdCBjb3VsZCBwb3NzaWJseSBiZSBhIGRlc2lyZWQKLXN0YXRlIGZvciBvbmUgb2YgdGhlIHdhaXRlcnMuICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlIGlzIGEKLWdlbmVyaWMgcHJvZHVjZXItY29uc3VtZXIgc2l0dWF0aW9uIHdpdGggdW5saW1pdGVkIGJ1ZmZlciBjYXBhY2l0eToKLQotXGJlZ2lue3ZlcmJhdGltfQotIyBDb25zdW1lIG9uZSBpdGVtCi1jdi5hY3F1aXJlKCkKLXdoaWxlIG5vdCBhbl9pdGVtX2lzX2F2YWlsYWJsZSgpOgotICAgIGN2LndhaXQoKQotZ2V0X2FuX2F2YWlsYWJsZV9pdGVtKCkKLWN2LnJlbGVhc2UoKQotCi0jIFByb2R1Y2Ugb25lIGl0ZW0KLWN2LmFjcXVpcmUoKQotbWFrZV9hbl9pdGVtX2F2YWlsYWJsZSgpCi1jdi5ub3RpZnkoKQotY3YucmVsZWFzZSgpCi1cZW5ke3ZlcmJhdGltfQotCi1UbyBjaG9vc2UgYmV0d2VlbiBcbWV0aG9ke25vdGlmeSgpfSBhbmQgXG1ldGhvZHtub3RpZnlBbGwoKX0sIGNvbnNpZGVyCi13aGV0aGVyIG9uZSBzdGF0ZSBjaGFuZ2UgY2FuIGJlIGludGVyZXN0aW5nIGZvciBvbmx5IG9uZSBvciBzZXZlcmFsCi13YWl0aW5nIHRocmVhZHMuICBFLmcuIGluIGEgdHlwaWNhbCBwcm9kdWNlci1jb25zdW1lciBzaXR1YXRpb24sCi1hZGRpbmcgb25lIGl0ZW0gdG8gdGhlIGJ1ZmZlciBvbmx5IG5lZWRzIHRvIHdha2UgdXAgb25lIGNvbnN1bWVyCi10aHJlYWQuCi0KLVxiZWdpbntjbGFzc2Rlc2N9e0NvbmRpdGlvbn17XG9wdGlvbmFse2xvY2t9fQotSWYgdGhlIFx2YXJ7bG9ja30gYXJndW1lbnQgaXMgZ2l2ZW4gYW5kIG5vdCBcY29kZXtOb25lfSwgaXQgbXVzdCBiZSBhCi1cY2xhc3N7TG9ja30gb3IgXGNsYXNze1JMb2NrfSBvYmplY3QsIGFuZCBpdCBpcyB1c2VkIGFzIHRoZSB1bmRlcmx5aW5nCi1sb2NrLiAgT3RoZXJ3aXNlLCBhIG5ldyBcY2xhc3N7UkxvY2t9IG9iamVjdCBpcyBjcmVhdGVkIGFuZCB1c2VkIGFzCi10aGUgdW5kZXJseWluZyBsb2NrLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXthY3F1aXJlfXsqYXJnc30KLUFjcXVpcmUgdGhlIHVuZGVybHlpbmcgbG9jay4KLVRoaXMgbWV0aG9kIGNhbGxzIHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZCBvbiB0aGUgdW5kZXJseWluZwotbG9jazsgdGhlIHJldHVybiB2YWx1ZSBpcyB3aGF0ZXZlciB0aGF0IG1ldGhvZCByZXR1cm5zLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317cmVsZWFzZX17fQotUmVsZWFzZSB0aGUgdW5kZXJseWluZyBsb2NrLgotVGhpcyBtZXRob2QgY2FsbHMgdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kIG9uIHRoZSB1bmRlcmx5aW5nCi1sb2NrOyB0aGVyZSBpcyBubyByZXR1cm4gdmFsdWUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXt3YWl0fXtcb3B0aW9uYWx7dGltZW91dH19Ci1XYWl0IHVudGlsIG5vdGlmaWVkIG9yIHVudGlsIGEgdGltZW91dCBvY2N1cnMuIElmIHRoZSBjYWxsaW5nIHRocmVhZAotaGFzIG5vdCBhY3F1aXJlZCB0aGUgbG9jayB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgYQotXGV4Y2VwdGlvbntSdW50aW1lRXJyb3J9IGlzIHJhaXNlZC4KLQotVGhpcyBtZXRob2QgcmVsZWFzZXMgdGhlIHVuZGVybHlpbmcgbG9jaywgYW5kIHRoZW4gYmxvY2tzIHVudGlsIGl0IGlzCi1hd2FrZW5lZCBieSBhIFxtZXRob2R7bm90aWZ5KCl9IG9yIFxtZXRob2R7bm90aWZ5QWxsKCl9IGNhbGwgZm9yIHRoZQotc2FtZSBjb25kaXRpb24gdmFyaWFibGUgaW4gYW5vdGhlciB0aHJlYWQsIG9yIHVudGlsIHRoZSBvcHRpb25hbAotdGltZW91dCBvY2N1cnMuICBPbmNlIGF3YWtlbmVkIG9yIHRpbWVkIG91dCwgaXQgcmUtYWNxdWlyZXMgdGhlIGxvY2sKLWFuZCByZXR1cm5zLgotCi1XaGVuIHRoZSBcdmFye3RpbWVvdXR9IGFyZ3VtZW50IGlzIHByZXNlbnQgYW5kIG5vdCBcY29kZXtOb25lfSwgaXQKLXNob3VsZCBiZSBhIGZsb2F0aW5nIHBvaW50IG51bWJlciBzcGVjaWZ5aW5nIGEgdGltZW91dCBmb3IgdGhlCi1vcGVyYXRpb24gaW4gc2Vjb25kcyAob3IgZnJhY3Rpb25zIHRoZXJlb2YpLgotCi1XaGVuIHRoZSB1bmRlcmx5aW5nIGxvY2sgaXMgYW4gXGNsYXNze1JMb2NrfSwgaXQgaXMgbm90IHJlbGVhc2VkIHVzaW5nCi1pdHMgXG1ldGhvZHtyZWxlYXNlKCl9IG1ldGhvZCwgc2luY2UgdGhpcyBtYXkgbm90IGFjdHVhbGx5IHVubG9jayB0aGUKLWxvY2sgd2hlbiBpdCB3YXMgYWNxdWlyZWQgbXVsdGlwbGUgdGltZXMgcmVjdXJzaXZlbHkuICBJbnN0ZWFkLCBhbgotaW50ZXJuYWwgaW50ZXJmYWNlIG9mIHRoZSBcY2xhc3N7UkxvY2t9IGNsYXNzIGlzIHVzZWQsIHdoaWNoIHJlYWxseQotdW5sb2NrcyBpdCBldmVuIHdoZW4gaXQgaGFzIGJlZW4gcmVjdXJzaXZlbHkgYWNxdWlyZWQgc2V2ZXJhbCB0aW1lcy4KLUFub3RoZXIgaW50ZXJuYWwgaW50ZXJmYWNlIGlzIHRoZW4gdXNlZCB0byByZXN0b3JlIHRoZSByZWN1cnNpb24gbGV2ZWwKLXdoZW4gdGhlIGxvY2sgaXMgcmVhY3F1aXJlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e25vdGlmeX17fQotV2FrZSB1cCBhIHRocmVhZCB3YWl0aW5nIG9uIHRoaXMgY29uZGl0aW9uLCBpZiBhbnkuIFdhaXQgdW50aWwKLW5vdGlmaWVkIG9yIHVudGlsIGEgdGltZW91dCBvY2N1cnMuIElmIHRoZSBjYWxsaW5nIHRocmVhZCBoYXMgbm90Ci1hY3F1aXJlZCB0aGUgbG9jayB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgYQotXGV4Y2VwdGlvbntSdW50aW1lRXJyb3J9IGlzIHJhaXNlZC4KLQotVGhpcyBtZXRob2Qgd2FrZXMgdXAgb25lIG9mIHRoZSB0aHJlYWRzIHdhaXRpbmcgZm9yIHRoZSBjb25kaXRpb24KLXZhcmlhYmxlLCBpZiBhbnkgYXJlIHdhaXRpbmc7IGl0IGlzIGEgbm8tb3AgaWYgbm8gdGhyZWFkcyBhcmUgd2FpdGluZy4KLQotVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gd2FrZXMgdXAgZXhhY3RseSBvbmUgdGhyZWFkLCBpZiBhbnkgYXJlCi13YWl0aW5nLiAgSG93ZXZlciwgaXQncyBub3Qgc2FmZSB0byByZWx5IG9uIHRoaXMgYmVoYXZpb3IuICBBIGZ1dHVyZSwKLW9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiBtYXkgb2NjYXNpb25hbGx5IHdha2UgdXAgbW9yZSB0aGFuIG9uZQotdGhyZWFkLgotCi1Ob3RlOiB0aGUgYXdha2VuZWQgdGhyZWFkIGRvZXMgbm90IGFjdHVhbGx5IHJldHVybiBmcm9tIGl0cwotXG1ldGhvZHt3YWl0KCl9IGNhbGwgdW50aWwgaXQgY2FuIHJlYWNxdWlyZSB0aGUgbG9jay4gIFNpbmNlCi1cbWV0aG9ke25vdGlmeSgpfSBkb2VzIG5vdCByZWxlYXNlIHRoZSBsb2NrLCBpdHMgY2FsbGVyIHNob3VsZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e25vdGlmeUFsbH17fQotV2FrZSB1cCBhbGwgdGhyZWFkcyB3YWl0aW5nIG9uIHRoaXMgY29uZGl0aW9uLiAgVGhpcyBtZXRob2QgYWN0cyBsaWtlCi1cbWV0aG9ke25vdGlmeSgpfSwgYnV0IHdha2VzIHVwIGFsbCB3YWl0aW5nIHRocmVhZHMgaW5zdGVhZCBvZiBvbmUuIElmCi10aGUgY2FsbGluZyB0aHJlYWQgaGFzIG5vdCBhY3F1aXJlZCB0aGUgbG9jayB3aGVuIHRoaXMgbWV0aG9kIGlzCi1jYWxsZWQsIGEgXGV4Y2VwdGlvbntSdW50aW1lRXJyb3J9IGlzIHJhaXNlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cc3Vic2VjdGlvbntTZW1hcGhvcmUgT2JqZWN0cyBcbGFiZWx7c2VtYXBob3JlLW9iamVjdHN9fQotCi1UaGlzIGlzIG9uZSBvZiB0aGUgb2xkZXN0IHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzIGluIHRoZSBoaXN0b3J5IG9mCi1jb21wdXRlciBzY2llbmNlLCBpbnZlbnRlZCBieSB0aGUgZWFybHkgRHV0Y2ggY29tcHV0ZXIgc2NpZW50aXN0Ci1FZHNnZXIgVy4gRGlqa3N0cmEgKGhlIHVzZWQgXG1ldGhvZHtQKCl9IGFuZCBcbWV0aG9ke1YoKX0gaW5zdGVhZCBvZgotXG1ldGhvZHthY3F1aXJlKCl9IGFuZCBcbWV0aG9ke3JlbGVhc2UoKX0pLgotCi1BIHNlbWFwaG9yZSBtYW5hZ2VzIGFuIGludGVybmFsIGNvdW50ZXIgd2hpY2ggaXMgZGVjcmVtZW50ZWQgYnkgZWFjaAotXG1ldGhvZHthY3F1aXJlKCl9IGNhbGwgYW5kIGluY3JlbWVudGVkIGJ5IGVhY2ggXG1ldGhvZHtyZWxlYXNlKCl9Ci1jYWxsLiAgVGhlIGNvdW50ZXIgY2FuIG5ldmVyIGdvIGJlbG93IHplcm87IHdoZW4gXG1ldGhvZHthY3F1aXJlKCl9Ci1maW5kcyB0aGF0IGl0IGlzIHplcm8sIGl0IGJsb2Nrcywgd2FpdGluZyB1bnRpbCBzb21lIG90aGVyIHRocmVhZAotY2FsbHMgXG1ldGhvZHtyZWxlYXNlKCl9LgotCi1cYmVnaW57Y2xhc3NkZXNjfXtTZW1hcGhvcmV9e1xvcHRpb25hbHt2YWx1ZX19Ci1UaGUgb3B0aW9uYWwgYXJndW1lbnQgZ2l2ZXMgdGhlIGluaXRpYWwgXHZhcnt2YWx1ZX0gZm9yIHRoZSBpbnRlcm5hbAotY291bnRlcjsgaXQgZGVmYXVsdHMgdG8gXGNvZGV7MX0uIElmIHRoZSBcdmFye3ZhbHVlfSBnaXZlbiBpcyBsZXNzCi10aGFuIDAsIFxleGNlcHRpb257VmFsdWVFcnJvcn0gaXMgcmFpc2VkLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXthY3F1aXJlfXtcb3B0aW9uYWx7YmxvY2tpbmd9fQotQWNxdWlyZSBhIHNlbWFwaG9yZS4KLQotV2hlbiBpbnZva2VkIHdpdGhvdXQgYXJndW1lbnRzOiBpZiB0aGUgaW50ZXJuYWwgY291bnRlciBpcyBsYXJnZXIgdGhhbgotemVybyBvbiBlbnRyeSwgZGVjcmVtZW50IGl0IGJ5IG9uZSBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5LiAgSWYgaXQgaXMKLXplcm8gb24gZW50cnksIGJsb2NrLCB3YWl0aW5nIHVudGlsIHNvbWUgb3RoZXIgdGhyZWFkIGhhcyBjYWxsZWQKLVxtZXRob2R7cmVsZWFzZSgpfSB0byBtYWtlIGl0IGxhcmdlciB0aGFuIHplcm8uICBUaGlzIGlzIGRvbmUgd2l0aAotcHJvcGVyIGludGVybG9ja2luZyBzbyB0aGF0IGlmIG11bHRpcGxlIFxtZXRob2R7YWNxdWlyZSgpfSBjYWxscyBhcmUKLWJsb2NrZWQsIFxtZXRob2R7cmVsZWFzZSgpfSB3aWxsIHdha2UgZXhhY3RseSBvbmUgb2YgdGhlbSB1cC4gIFRoZQotaW1wbGVtZW50YXRpb24gbWF5IHBpY2sgb25lIGF0IHJhbmRvbSwgc28gdGhlIG9yZGVyIGluIHdoaWNoIGJsb2NrZWQKLXRocmVhZHMgYXJlIGF3YWtlbmVkIHNob3VsZCBub3QgYmUgcmVsaWVkIG9uLiAgVGhlcmUgaXMgbm8gcmV0dXJuCi12YWx1ZSBpbiB0aGlzIGNhc2UuCi0KLVdoZW4gaW52b2tlZCB3aXRoIFx2YXJ7YmxvY2tpbmd9IHNldCB0byB0cnVlLCBkbyB0aGUgc2FtZSB0aGluZyBhcwotd2hlbiBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHMsIGFuZCByZXR1cm4gdHJ1ZS4KLQotV2hlbiBpbnZva2VkIHdpdGggXHZhcntibG9ja2luZ30gc2V0IHRvIGZhbHNlLCBkbyBub3QgYmxvY2suICBJZiBhCi1jYWxsIHdpdGhvdXQgYW4gYXJndW1lbnQgd291bGQgYmxvY2ssIHJldHVybiBmYWxzZSBpbW1lZGlhdGVseTsKLW90aGVyd2lzZSwgZG8gdGhlIHNhbWUgdGhpbmcgYXMgd2hlbiBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHMsIGFuZAotcmV0dXJuIHRydWUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtyZWxlYXNlfXt9Ci1SZWxlYXNlIGEgc2VtYXBob3JlLAotaW5jcmVtZW50aW5nIHRoZSBpbnRlcm5hbCBjb3VudGVyIGJ5IG9uZS4gIFdoZW4gaXQgd2FzIHplcm8gb24KLWVudHJ5IGFuZCBhbm90aGVyIHRocmVhZCBpcyB3YWl0aW5nIGZvciBpdCB0byBiZWNvbWUgbGFyZ2VyCi10aGFuIHplcm8gYWdhaW4sIHdha2UgdXAgdGhhdCB0aHJlYWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLQotXHN1YnN1YnNlY3Rpb257XGNsYXNze1NlbWFwaG9yZX0gRXhhbXBsZSBcbGFiZWx7c2VtYXBob3JlLWV4YW1wbGVzfX0KLQotU2VtYXBob3JlcyBhcmUgb2Z0ZW4gdXNlZCB0byBndWFyZCByZXNvdXJjZXMgd2l0aCBsaW1pdGVkIGNhcGFjaXR5LCBmb3IKLWV4YW1wbGUsIGEgZGF0YWJhc2Ugc2VydmVyLiAgSW4gYW55IHNpdHVhdGlvbiB3aGVyZSB0aGUgc2l6ZSBvZiB0aGUgcmVzb3VyY2UKLXNpemUgaXMgZml4ZWQsIHlvdSBzaG91bGQgdXNlIGEgYm91bmRlZCBzZW1hcGhvcmUuICBCZWZvcmUgc3Bhd25pbmcgYW55Ci13b3JrZXIgdGhyZWFkcywgeW91ciBtYWluIHRocmVhZCB3b3VsZCBpbml0aWFsaXplIHRoZSBzZW1hcGhvcmU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLW1heGNvbm5lY3Rpb25zID0gNQotLi4uCi1wb29sX3NlbWEgPSBCb3VuZGVkU2VtYXBob3JlKHZhbHVlPW1heGNvbm5lY3Rpb25zKQotXGVuZHt2ZXJiYXRpbX0KLQotT25jZSBzcGF3bmVkLCB3b3JrZXIgdGhyZWFkcyBjYWxsIHRoZSBzZW1hcGhvcmUncyBhY3F1aXJlIGFuZCByZWxlYXNlCi1tZXRob2RzIHdoZW4gdGhleSBuZWVkIHRvIGNvbm5lY3QgdG8gdGhlIHNlcnZlcjoKLQotXGJlZ2lue3ZlcmJhdGltfQotcG9vbF9zZW1hLmFjcXVpcmUoKQotY29ubiA9IGNvbm5lY3RkYigpCi0uLi4gdXNlIGNvbm5lY3Rpb24gLi4uCi1jb25uLmNsb3NlKCkKLXBvb2xfc2VtYS5yZWxlYXNlKCkKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSB1c2Ugb2YgYSBib3VuZGVkIHNlbWFwaG9yZSByZWR1Y2VzIHRoZSBjaGFuY2UgdGhhdCBhIHByb2dyYW1taW5nIGVycm9yCi13aGljaCBjYXVzZXMgdGhlIHNlbWFwaG9yZSB0byBiZSByZWxlYXNlZCBtb3JlIHRoYW4gaXQncyBhY3F1aXJlZCB3aWxsIGdvCi11bmRldGVjdGVkLgotCi0KLVxzdWJzZWN0aW9ue0V2ZW50IE9iamVjdHMgXGxhYmVse2V2ZW50LW9iamVjdHN9fQotCi1UaGlzIGlzIG9uZSBvZiB0aGUgc2ltcGxlc3QgbWVjaGFuaXNtcyBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuCi10aHJlYWRzOiBvbmUgdGhyZWFkIHNpZ25hbHMgYW4gZXZlbnQgYW5kIG90aGVyIHRocmVhZHMgd2FpdCBmb3IgaXQuCi0KLUFuIGV2ZW50IG9iamVjdCBtYW5hZ2VzIGFuIGludGVybmFsIGZsYWcgdGhhdCBjYW4gYmUgc2V0IHRvIHRydWUgd2l0aAotdGhlIFxtZXRob2R7c2V0KCl9IG1ldGhvZCBhbmQgcmVzZXQgdG8gZmFsc2Ugd2l0aCB0aGUgXG1ldGhvZHtjbGVhcigpfQotbWV0aG9kLiAgVGhlIFxtZXRob2R7d2FpdCgpfSBtZXRob2QgYmxvY2tzIHVudGlsIHRoZSBmbGFnIGlzIHRydWUuCi0KLQotXGJlZ2lue2NsYXNzZGVzY317RXZlbnR9e30KLVRoZSBpbnRlcm5hbCBmbGFnIGlzIGluaXRpYWxseSBmYWxzZS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317aXNTZXR9e30KLVJldHVybiB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBpbnRlcm5hbCBmbGFnIGlzIHRydWUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtzZXR9e30KLVNldCB0aGUgaW50ZXJuYWwgZmxhZyB0byB0cnVlLgotQWxsIHRocmVhZHMgd2FpdGluZyBmb3IgaXQgdG8gYmVjb21lIHRydWUgYXJlIGF3YWtlbmVkLgotVGhyZWFkcyB0aGF0IGNhbGwgXG1ldGhvZHt3YWl0KCl9IG9uY2UgdGhlIGZsYWcgaXMgdHJ1ZSB3aWxsIG5vdCBibG9jawotYXQgYWxsLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Y2xlYXJ9e30KLVJlc2V0IHRoZSBpbnRlcm5hbCBmbGFnIHRvIGZhbHNlLgotU3Vic2VxdWVudGx5LCB0aHJlYWRzIGNhbGxpbmcgXG1ldGhvZHt3YWl0KCl9IHdpbGwgYmxvY2sgdW50aWwKLVxtZXRob2R7c2V0KCl9IGlzIGNhbGxlZCB0byBzZXQgdGhlIGludGVybmFsIGZsYWcgdG8gdHJ1ZSBhZ2Fpbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3dhaXR9e1xvcHRpb25hbHt0aW1lb3V0fX0KLUJsb2NrIHVudGlsIHRoZSBpbnRlcm5hbCBmbGFnIGlzIHRydWUuCi1JZiB0aGUgaW50ZXJuYWwgZmxhZyBpcyB0cnVlIG9uIGVudHJ5LCByZXR1cm4gaW1tZWRpYXRlbHkuICBPdGhlcndpc2UsCi1ibG9jayB1bnRpbCBhbm90aGVyIHRocmVhZCBjYWxscyBcbWV0aG9ke3NldCgpfSB0byBzZXQgdGhlIGZsYWcgdG8KLXRydWUsIG9yIHVudGlsIHRoZSBvcHRpb25hbCB0aW1lb3V0IG9jY3Vycy4KLQotV2hlbiB0aGUgdGltZW91dCBhcmd1bWVudCBpcyBwcmVzZW50IGFuZCBub3QgXGNvZGV7Tm9uZX0sIGl0IHNob3VsZCBiZSBhCi1mbG9hdGluZyBwb2ludCBudW1iZXIgc3BlY2lmeWluZyBhIHRpbWVvdXQgZm9yIHRoZSBvcGVyYXRpb24gaW4KLXNlY29uZHMgKG9yIGZyYWN0aW9ucyB0aGVyZW9mKS4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cc3Vic2VjdGlvbntUaHJlYWQgT2JqZWN0cyBcbGFiZWx7dGhyZWFkLW9iamVjdHN9fQotCi1UaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gYWN0aXZpdHkgdGhhdCBpcyBydW4gaW4gYSBzZXBhcmF0ZSB0aHJlYWQKLW9mIGNvbnRyb2wuICBUaGVyZSBhcmUgdHdvIHdheXMgdG8gc3BlY2lmeSB0aGUgYWN0aXZpdHk6IGJ5Ci1wYXNzaW5nIGEgY2FsbGFibGUgb2JqZWN0IHRvIHRoZSBjb25zdHJ1Y3Rvciwgb3IgYnkgb3ZlcnJpZGluZyB0aGUKLVxtZXRob2R7cnVuKCl9IG1ldGhvZCBpbiBhIHN1YmNsYXNzLiAgTm8gb3RoZXIgbWV0aG9kcyAoZXhjZXB0IGZvciB0aGUKLWNvbnN0cnVjdG9yKSBzaG91bGQgYmUgb3ZlcnJpZGRlbiBpbiBhIHN1YmNsYXNzLiAgSW4gb3RoZXIgd29yZHMsIAotXGVtcGh7b25seX0gIG92ZXJyaWRlIHRoZSBcbWV0aG9ke19faW5pdF9fKCl9IGFuZCBcbWV0aG9ke3J1bigpfQotbWV0aG9kcyBvZiB0aGlzIGNsYXNzLgotCi1PbmNlIGEgdGhyZWFkIG9iamVjdCBpcyBjcmVhdGVkLCBpdHMgYWN0aXZpdHkgbXVzdCBiZSBzdGFydGVkIGJ5Ci1jYWxsaW5nIHRoZSB0aHJlYWQncyBcbWV0aG9ke3N0YXJ0KCl9IG1ldGhvZC4gIFRoaXMgaW52b2tlcyB0aGUKLVxtZXRob2R7cnVuKCl9IG1ldGhvZCBpbiBhIHNlcGFyYXRlIHRocmVhZCBvZiBjb250cm9sLgotCi1PbmNlIHRoZSB0aHJlYWQncyBhY3Rpdml0eSBpcyBzdGFydGVkLCB0aGUgdGhyZWFkIGlzIGNvbnNpZGVyZWQKLSdhbGl2ZScuIEl0IHN0b3BzIGJlaW5nIGFsaXZlIHdoZW4gaXRzIFxtZXRob2R7cnVuKCl9IG1ldGhvZCB0ZXJtaW5hdGVzCi0tLSBlaXRoZXIgbm9ybWFsbHksIG9yIGJ5IHJhaXNpbmcgYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbi4gIFRoZQotXG1ldGhvZHtpc0FsaXZlKCl9IG1ldGhvZCB0ZXN0cyB3aGV0aGVyIHRoZSB0aHJlYWQgaXMgYWxpdmUuCi0KLU90aGVyIHRocmVhZHMgY2FuIGNhbGwgYSB0aHJlYWQncyBcbWV0aG9ke2pvaW4oKX0gbWV0aG9kLiAgVGhpcyBibG9ja3MKLXRoZSBjYWxsaW5nIHRocmVhZCB1bnRpbCB0aGUgdGhyZWFkIHdob3NlIFxtZXRob2R7am9pbigpfSBtZXRob2QgaXMKLWNhbGxlZCBpcyB0ZXJtaW5hdGVkLgotCi1BIHRocmVhZCBoYXMgYSBuYW1lLiAgVGhlIG5hbWUgY2FuIGJlIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IsCi1zZXQgd2l0aCB0aGUgXG1ldGhvZHtzZXROYW1lKCl9IG1ldGhvZCwgYW5kIHJldHJpZXZlZCB3aXRoIHRoZQotXG1ldGhvZHtnZXROYW1lKCl9IG1ldGhvZC4KLQotQSB0aHJlYWQgY2FuIGJlIGZsYWdnZWQgYXMgYSBgYGRhZW1vbiB0aHJlYWQnJy4gIFRoZSBzaWduaWZpY2FuY2UKLW9mIHRoaXMgZmxhZyBpcyB0aGF0IHRoZSBlbnRpcmUgUHl0aG9uIHByb2dyYW0gZXhpdHMgd2hlbiBvbmx5Ci1kYWVtb24gdGhyZWFkcyBhcmUgbGVmdC4gIFRoZSBpbml0aWFsIHZhbHVlIGlzIGluaGVyaXRlZCBmcm9tIHRoZQotY3JlYXRpbmcgdGhyZWFkLiAgVGhlIGZsYWcgY2FuIGJlIHNldCB3aXRoIHRoZSBcbWV0aG9ke3NldERhZW1vbigpfQotbWV0aG9kIGFuZCByZXRyaWV2ZWQgd2l0aCB0aGUgXG1ldGhvZHtpc0RhZW1vbigpfSBtZXRob2QuCi0KLVRoZXJlIGlzIGEgYGBtYWluIHRocmVhZCcnIG9iamVjdDsgdGhpcyBjb3JyZXNwb25kcyB0byB0aGUKLWluaXRpYWwgdGhyZWFkIG9mIGNvbnRyb2wgaW4gdGhlIFB5dGhvbiBwcm9ncmFtLiAgSXQgaXMgbm90IGEKLWRhZW1vbiB0aHJlYWQuCi0KLVRoZXJlIGlzIHRoZSBwb3NzaWJpbGl0eSB0aGF0IGBgZHVtbXkgdGhyZWFkIG9iamVjdHMnJyBhcmUgY3JlYXRlZC4KLVRoZXNlIGFyZSB0aHJlYWQgb2JqZWN0cyBjb3JyZXNwb25kaW5nIHRvIGBgYWxpZW4gdGhyZWFkcycnLCB3aGljaAotYXJlIHRocmVhZHMgb2YgY29udHJvbCBzdGFydGVkIG91dHNpZGUgdGhlIHRocmVhZGluZyBtb2R1bGUsIHN1Y2ggYXMKLWRpcmVjdGx5IGZyb20gQyBjb2RlLiAgRHVtbXkgdGhyZWFkIG9iamVjdHMgaGF2ZSBsaW1pdGVkCi1mdW5jdGlvbmFsaXR5OyB0aGV5IGFyZSBhbHdheXMgY29uc2lkZXJlZCBhbGl2ZSBhbmQgZGFlbW9uaWMsIGFuZAotY2Fubm90IGJlIFxtZXRob2R7am9pbigpfWVkLiAgVGhleSBhcmUgbmV2ZXIgZGVsZXRlZCwgc2luY2UgaXQgaXMKLWltcG9zc2libGUgdG8gZGV0ZWN0IHRoZSB0ZXJtaW5hdGlvbiBvZiBhbGllbiB0aHJlYWRzLgotCi0KLVxiZWdpbntjbGFzc2Rlc2N9e1RocmVhZH17Z3JvdXA9Tm9uZSwgdGFyZ2V0PU5vbmUsIG5hbWU9Tm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncz0oKSwga3dhcmdzPVx7XH19Ci1UaGlzIGNvbnN0cnVjdG9yIHNob3VsZCBhbHdheXMgYmUgY2FsbGVkIHdpdGgga2V5d29yZAotYXJndW1lbnRzLiAgQXJndW1lbnRzIGFyZToKLQotXHZhcntncm91cH0gc2hvdWxkIGJlIFxjb2Rle05vbmV9OyByZXNlcnZlZCBmb3IgZnV0dXJlIGV4dGVuc2lvbiB3aGVuCi1hIFxjbGFzc3tUaHJlYWRHcm91cH0gY2xhc3MgaXMgaW1wbGVtZW50ZWQuCi0KLVx2YXJ7dGFyZ2V0fSBpcyB0aGUgY2FsbGFibGUgb2JqZWN0IHRvIGJlIGludm9rZWQgYnkgdGhlCi1cbWV0aG9ke3J1bigpfSBtZXRob2QuICBEZWZhdWx0cyB0byBcY29kZXtOb25lfSwgbWVhbmluZyBub3RoaW5nIGlzCi1jYWxsZWQuCi0KLVx2YXJ7bmFtZX0gaXMgdGhlIHRocmVhZCBuYW1lLiAgQnkgZGVmYXVsdCwgYSB1bmlxdWUgbmFtZSBpcwotY29uc3RydWN0ZWQgb2YgdGhlIGZvcm0gYGBUaHJlYWQtXHZhcntOfScnIHdoZXJlIFx2YXJ7Tn0gaXMgYSBzbWFsbAotZGVjaW1hbCBudW1iZXIuCi0KLVx2YXJ7YXJnc30gaXMgdGhlIGFyZ3VtZW50IHR1cGxlIGZvciB0aGUgdGFyZ2V0IGludm9jYXRpb24uICBEZWZhdWx0cwotdG8gXGNvZGV7KCl9LgotCi1cdmFye2t3YXJnc30gaXMgYSBkaWN0aW9uYXJ5IG9mIGtleXdvcmQgYXJndW1lbnRzIGZvciB0aGUgdGFyZ2V0Ci1pbnZvY2F0aW9uLiAgRGVmYXVsdHMgdG8gXGNvZGV7XHtcfX0uCi0KLUlmIHRoZSBzdWJjbGFzcyBvdmVycmlkZXMgdGhlIGNvbnN0cnVjdG9yLCBpdCBtdXN0IG1ha2Ugc3VyZQotdG8gaW52b2tlIHRoZSBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yIChcY29kZXtUaHJlYWQuX19pbml0X18oKX0pCi1iZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZSB0byB0aGUgdGhyZWFkLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtzdGFydH17fQotU3RhcnQgdGhlIHRocmVhZCdzIGFjdGl2aXR5LgotCi1JdCBtdXN0IGJlIGNhbGxlZCBhdCBtb3N0IG9uY2UgcGVyIHRocmVhZCBvYmplY3QuICBJdCBhcnJhbmdlcyBmb3IgdGhlCi1vYmplY3QncyBcbWV0aG9ke3J1bigpfSBtZXRob2QgdG8gYmUgaW52b2tlZCBpbiBhIHNlcGFyYXRlIHRocmVhZCBvZgotY29udHJvbC4KLQotVGhpcyBtZXRob2Qgd2lsbCByYWlzZSBhIFxleGNlcHRpb257UnVudGltZUV4Y2VwdGlvbn0gaWYgY2FsbGVkIG1vcmUKLXRoYW4gb25jZSBvbiB0aGUgc2FtZSB0aHJlYWQgb2JqZWN0LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317cnVufXt9Ci1NZXRob2QgcmVwcmVzZW50aW5nIHRoZSB0aHJlYWQncyBhY3Rpdml0eS4KLQotWW91IG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBpbiBhIHN1YmNsYXNzLiAgVGhlIHN0YW5kYXJkCi1cbWV0aG9ke3J1bigpfSBtZXRob2QgaW52b2tlcyB0aGUgY2FsbGFibGUgb2JqZWN0IHBhc3NlZCB0byB0aGUKLW9iamVjdCdzIGNvbnN0cnVjdG9yIGFzIHRoZSBcdmFye3RhcmdldH0gYXJndW1lbnQsIGlmIGFueSwgd2l0aAotc2VxdWVudGlhbCBhbmQga2V5d29yZCBhcmd1bWVudHMgdGFrZW4gZnJvbSB0aGUgXHZhcnthcmdzfSBhbmQKLVx2YXJ7a3dhcmdzfSBhcmd1bWVudHMsIHJlc3BlY3RpdmVseS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2pvaW59e1xvcHRpb25hbHt0aW1lb3V0fX0KLVdhaXQgdW50aWwgdGhlIHRocmVhZCB0ZXJtaW5hdGVzLgotVGhpcyBibG9ja3MgdGhlIGNhbGxpbmcgdGhyZWFkIHVudGlsIHRoZSB0aHJlYWQgd2hvc2UgXG1ldGhvZHtqb2luKCl9Ci1tZXRob2QgaXMgY2FsbGVkIHRlcm1pbmF0ZXMgLS0gZWl0aGVyIG5vcm1hbGx5IG9yIHRocm91Z2ggYW4KLXVuaGFuZGxlZCBleGNlcHRpb24gLS0gb3IgdW50aWwgdGhlIG9wdGlvbmFsIHRpbWVvdXQgb2NjdXJzLgotCi1XaGVuIHRoZSBcdmFye3RpbWVvdXR9IGFyZ3VtZW50IGlzIHByZXNlbnQgYW5kIG5vdCBcY29kZXtOb25lfSwgaXQKLXNob3VsZCBiZSBhIGZsb2F0aW5nIHBvaW50IG51bWJlciBzcGVjaWZ5aW5nIGEgdGltZW91dCBmb3IgdGhlCi1vcGVyYXRpb24gaW4gc2Vjb25kcyAob3IgZnJhY3Rpb25zIHRoZXJlb2YpLiBBcyBcbWV0aG9ke2pvaW4oKX0gYWx3YXlzIAotcmV0dXJucyBcY29kZXtOb25lfSwgeW91IG11c3QgY2FsbCBcbWV0aG9ke2lzQWxpdmUoKX0gdG8gZGVjaWRlIHdoZXRoZXIgCi1hIHRpbWVvdXQgaGFwcGVuZWQuCi0KLVdoZW4gdGhlIFx2YXJ7dGltZW91dH0gYXJndW1lbnQgaXMgbm90IHByZXNlbnQgb3IgXGNvZGV7Tm9uZX0sIHRoZQotb3BlcmF0aW9uIHdpbGwgYmxvY2sgdW50aWwgdGhlIHRocmVhZCB0ZXJtaW5hdGVzLgotCi1BIHRocmVhZCBjYW4gYmUgXG1ldGhvZHtqb2luKCl9ZWQgbWFueSB0aW1lcy4KLQotXG1ldGhvZHtqb2luKCl9IG1heSB0aHJvdyBhIFxleGNlcHRpb257UnVudGltZUVycm9yfSwgaWYgYW4gYXR0ZW1wdCBpcwotbWFkZSB0byBqb2luIHRoZSBjdXJyZW50IHRocmVhZCBhcyB0aGF0IHdvdWxkIGNhdXNlIGEgZGVhZGxvY2suIEl0IGlzCi1hbHNvIGFuIGVycm9yIHRvIFxtZXRob2R7am9pbigpfSBhIHRocmVhZCBiZWZvcmUgaXQgaGFzIGJlZW4gc3RhcnRlZAotYW5kIGF0dGVtcHRzIHRvIGRvIHNvIHJhaXNlcyBzYW1lIGV4Y2VwdGlvbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2dldE5hbWV9e30KLVJldHVybiB0aGUgdGhyZWFkJ3MgbmFtZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3NldE5hbWV9e25hbWV9Ci1TZXQgdGhlIHRocmVhZCdzIG5hbWUuCi0KLVRoZSBuYW1lIGlzIGEgc3RyaW5nIHVzZWQgZm9yIGlkZW50aWZpY2F0aW9uIHB1cnBvc2VzIG9ubHkuCi1JdCBoYXMgbm8gc2VtYW50aWNzLiAgTXVsdGlwbGUgdGhyZWFkcyBtYXkgYmUgZ2l2ZW4gdGhlIHNhbWUKLW5hbWUuICBUaGUgaW5pdGlhbCBuYW1lIGlzIHNldCBieSB0aGUgY29uc3RydWN0b3IuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtpc0FsaXZlfXt9Ci1SZXR1cm4gd2hldGhlciB0aGUgdGhyZWFkIGlzIGFsaXZlLgotCi1Sb3VnaGx5LCBhIHRocmVhZCBpcyBhbGl2ZSBmcm9tIHRoZSBtb21lbnQgdGhlIFxtZXRob2R7c3RhcnQoKX0gbWV0aG9kCi1yZXR1cm5zIHVudGlsIGl0cyBcbWV0aG9ke3J1bigpfSBtZXRob2QgdGVybWluYXRlcy4gVGhlIG1vZHVsZQotZnVuY3Rpb24gXGZ1bmN0aW9ue2VudW1lcmF0ZSgpfSByZXR1cm5zIGEgbGlzdCBvZiBhbGwgYWxpdmUgdGhyZWFkcy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2lzRGFlbW9ufXt9Ci1SZXR1cm4gdGhlIHRocmVhZCdzIGRhZW1vbiBmbGFnLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317c2V0RGFlbW9ufXtkYWVtb25pY30KLVNldCB0aGUgdGhyZWFkJ3MgZGFlbW9uIGZsYWcgdG8gdGhlIEJvb2xlYW4gdmFsdWUgXHZhcntkYWVtb25pY30uCi1UaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBcbWV0aG9ke3N0YXJ0KCl9IGlzIGNhbGxlZCwgb3RoZXJ3aXNlCi1cZXhjZXB0aW9ue1J1bnRpbWVFcnJvcn0gaXMgcmFpc2VkLgotCi1UaGUgaW5pdGlhbCB2YWx1ZSBpcyBpbmhlcml0ZWQgZnJvbSB0aGUgY3JlYXRpbmcgdGhyZWFkLgotCi1UaGUgZW50aXJlIFB5dGhvbiBwcm9ncmFtIGV4aXRzIHdoZW4gbm8gYWxpdmUgbm9uLWRhZW1vbiB0aHJlYWRzIGFyZQotbGVmdC4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cc3Vic2VjdGlvbntUaW1lciBPYmplY3RzIFxsYWJlbHt0aW1lci1vYmplY3RzfX0KLQotVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGFjdGlvbiB0aGF0IHNob3VsZCBiZSBydW4gb25seSBhZnRlciBhCi1jZXJ0YWluIGFtb3VudCBvZiB0aW1lIGhhcyBwYXNzZWQgLS0tIGEgdGltZXIuICBcY2xhc3N7VGltZXJ9IGlzIGEKLXN1YmNsYXNzIG9mIFxjbGFzc3tUaHJlYWR9IGFuZCBhcyBzdWNoIGFsc28gZnVuY3Rpb25zIGFzIGFuIGV4YW1wbGUgb2YKLWNyZWF0aW5nIGN1c3RvbSB0aHJlYWRzLgotCi1UaW1lcnMgYXJlIHN0YXJ0ZWQsIGFzIHdpdGggdGhyZWFkcywgYnkgY2FsbGluZyB0aGVpciBcbWV0aG9ke3N0YXJ0KCl9Ci1tZXRob2QuICBUaGUgdGltZXIgY2FuIGJlIHN0b3BwZWQgKGJlZm9yZSBpdHMgYWN0aW9uIGhhcyBiZWd1bikgYnkKLWNhbGxpbmcgdGhlIFxtZXRob2R7Y2FuY2VsKCl9IG1ldGhvZC4gIFRoZSBpbnRlcnZhbCB0aGUgdGltZXIgd2lsbAotd2FpdCBiZWZvcmUgZXhlY3V0aW5nIGl0cyBhY3Rpb24gbWF5IG5vdCBiZSBleGFjdGx5IHRoZSBzYW1lIGFzIHRoZQotaW50ZXJ2YWwgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgotCi1Gb3IgZXhhbXBsZToKLVxiZWdpbnt2ZXJiYXRpbX0KLWRlZiBoZWxsbygpOgotICAgIHByaW50ICJoZWxsbywgd29ybGQiCi0KLXQgPSBUaW1lcigzMC4wLCBoZWxsbykKLXQuc3RhcnQoKSAjIGFmdGVyIDMwIHNlY29uZHMsICJoZWxsbywgd29ybGQiIHdpbGwgYmUgcHJpbnRlZAotXGVuZHt2ZXJiYXRpbX0KLQotXGJlZ2lue2NsYXNzZGVzY317VGltZXJ9e2ludGVydmFsLCBmdW5jdGlvbiwgYXJncz1bXSwga3dhcmdzPVx7XH19Ci1DcmVhdGUgYSB0aW1lciB0aGF0IHdpbGwgcnVuIFx2YXJ7ZnVuY3Rpb259IHdpdGggYXJndW1lbnRzIFx2YXJ7YXJnc30gYW5kIAota2V5d29yZCBhcmd1bWVudHMgXHZhcntrd2FyZ3N9LCBhZnRlciBcdmFye2ludGVydmFsfSBzZWNvbmRzIGhhdmUgcGFzc2VkLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtjYW5jZWx9e30KLVN0b3AgdGhlIHRpbWVyLCBhbmQgY2FuY2VsIHRoZSBleGVjdXRpb24gb2YgdGhlIHRpbWVyJ3MgYWN0aW9uLiAgVGhpcwotd2lsbCBvbmx5IHdvcmsgaWYgdGhlIHRpbWVyIGlzIHN0aWxsIGluIGl0cyB3YWl0aW5nIHN0YWdlLgotXGVuZHttZXRob2RkZXNjfQotCi1cc3Vic2VjdGlvbntVc2luZyBsb2NrcywgY29uZGl0aW9ucywgYW5kIHNlbWFwaG9yZXMgaW4gdGhlIFxrZXl3b3Jke3dpdGh9Ci1zdGF0ZW1lbnQgXGxhYmVse3dpdGgtbG9ja3N9fQotCi1BbGwgb2YgdGhlIG9iamVjdHMgcHJvdmlkZWQgYnkgdGhpcyBtb2R1bGUgdGhhdCBoYXZlIFxtZXRob2R7YWNxdWlyZSgpfSBhbmQKLVxtZXRob2R7cmVsZWFzZSgpfSBtZXRob2RzIGNhbiBiZSB1c2VkIGFzIGNvbnRleHQgbWFuYWdlcnMgZm9yIGEgXGtleXdvcmR7d2l0aH0KLXN0YXRlbWVudC4gIFRoZSBcbWV0aG9ke2FjcXVpcmUoKX0gbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGJsb2NrIGlzCi1lbnRlcmVkLCBhbmQgXG1ldGhvZHtyZWxlYXNlKCl9IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGJsb2NrIGlzIGV4aXRlZC4KLQotQ3VycmVudGx5LCBcY2xhc3N7TG9ja30sIFxjbGFzc3tSTG9ja30sIFxjbGFzc3tDb25kaXRpb259LCBcY2xhc3N7U2VtYXBob3JlfSwKLWFuZCBcY2xhc3N7Qm91bmRlZFNlbWFwaG9yZX0gb2JqZWN0cyBtYXkgYmUgdXNlZCBhcyBca2V5d29yZHt3aXRofQotc3RhdGVtZW50IGNvbnRleHQgbWFuYWdlcnMuICBGb3IgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB3aXRoX3N0YXRlbWVudAotaW1wb3J0IHRocmVhZGluZwotCi1zb21lX3Jsb2NrID0gdGhyZWFkaW5nLlJMb2NrKCkKLQotd2l0aCBzb21lX3Jsb2NrOgotICAgIHByaW50ICJzb21lX3Jsb2NrIGlzIGxvY2tlZCB3aGlsZSB0aGlzIGV4ZWN1dGVzIgotXGVuZHt2ZXJiYXRpbX0KLQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ0aW1lLnRleCBiL0RvYy9saWIvbGlidGltZS50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNDViZmMuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJ0aW1lLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDQ3NSArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3RpbWV9IC0tLQotICAgICAgICAgVGltZSBhY2Nlc3MgYW5kIGNvbnZlcnNpb25zfQotCi1cZGVjbGFyZW1vZHVsZXtidWlsdGlufXt0aW1lfQotXG1vZHVsZXN5bm9wc2lze1RpbWUgYWNjZXNzIGFuZCBjb252ZXJzaW9ucy59Ci0KLQotVGhpcyBtb2R1bGUgcHJvdmlkZXMgdmFyaW91cyB0aW1lLXJlbGF0ZWQgZnVuY3Rpb25zLiAgSXQgaXMgYWx3YXlzCi1hdmFpbGFibGUsIGJ1dCBub3QgYWxsIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlIG9uIGFsbCBwbGF0Zm9ybXMuICBNb3N0Ci1vZiB0aGUgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhpcyBtb2R1bGUgY2FsbCBwbGF0Zm9ybSBDIGxpYnJhcnkKLWZ1bmN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUuICBJdCBtYXkgc29tZXRpbWVzIGJlIGhlbHBmdWwgdG8gY29uc3VsdAotdGhlIHBsYXRmb3JtIGRvY3VtZW50YXRpb24sIGJlY2F1c2UgdGhlIHNlbWFudGljcyBvZiB0aGVzZSBmdW5jdGlvbnMKLXZhcmllcyBhbW9uZyBwbGF0Zm9ybXMuCi0KLUFuIGV4cGxhbmF0aW9uIG9mIHNvbWUgdGVybWlub2xvZ3kgYW5kIGNvbnZlbnRpb25zIGlzIGluIG9yZGVyLgotCi1cYmVnaW57aXRlbWl6ZX0KLQotXGl0ZW0KLVRoZSBcZGZue2Vwb2NofVxpbmRleHtlcG9jaH0gaXMgdGhlIHBvaW50IHdoZXJlIHRoZSB0aW1lIHN0YXJ0cy4gIE9uCi1KYW51YXJ5IDFzdCBvZiB0aGF0IHllYXIsIGF0IDAgaG91cnMsIHRoZSBgYHRpbWUgc2luY2UgdGhlIGVwb2NoJycgaXMKLXplcm8uICBGb3IgXFVOSVgsIHRoZSBlcG9jaCBpcyAxOTcwLiAgVG8gZmluZCBvdXQgd2hhdCB0aGUgZXBvY2ggaXMsCi1sb29rIGF0IFxjb2Rle2dtdGltZSgwKX0uCi0KLVxpdGVtCi1UaGUgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIGRvIG5vdCBoYW5kbGUgZGF0ZXMgYW5kIHRpbWVzIGJlZm9yZSB0aGUKLWVwb2NoIG9yIGZhciBpbiB0aGUgZnV0dXJlLiAgVGhlIGN1dC1vZmYgcG9pbnQgaW4gdGhlIGZ1dHVyZSBpcwotZGV0ZXJtaW5lZCBieSB0aGUgQyBsaWJyYXJ5OyBmb3IgXFVOSVgsIGl0IGlzIHR5cGljYWxseSBpbgotMjAzOFxpbmRleHtZZWFyIDIwMzh9LgotCi1caXRlbQotXHN0cm9uZ3tZZWFyIDIwMDAgKFkySykgaXNzdWVzfTpcaW5kZXh7WWVhciAyMDAwfVxpbmRleHtZMkt9ICBQeXRob24KLWRlcGVuZHMgb24gdGhlIHBsYXRmb3JtJ3MgQyBsaWJyYXJ5LCB3aGljaCBnZW5lcmFsbHkgZG9lc24ndCBoYXZlIHllYXIKLTIwMDAgaXNzdWVzLCBzaW5jZSBhbGwgZGF0ZXMgYW5kIHRpbWVzIGFyZSByZXByZXNlbnRlZCBpbnRlcm5hbGx5IGFzCi1zZWNvbmRzIHNpbmNlIHRoZSBlcG9jaC4gIEZ1bmN0aW9ucyBhY2NlcHRpbmcgYSBcY2xhc3N7c3RydWN0X3RpbWV9Ci0oc2VlIGJlbG93KSBnZW5lcmFsbHkgcmVxdWlyZSBhIDQtZGlnaXQgeWVhci4gIEZvciBiYWNrd2FyZAotY29tcGF0aWJpbGl0eSwgMi1kaWdpdCB5ZWFycyBhcmUgc3VwcG9ydGVkIGlmIHRoZSBtb2R1bGUgdmFyaWFibGUKLVxjb2Rle2FjY2VwdDJkeWVhcn0gaXMgYSBub24temVybyBpbnRlZ2VyOyB0aGlzIHZhcmlhYmxlIGlzCi1pbml0aWFsaXplZCB0byBcY29kZXsxfSB1bmxlc3MgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi1cZW52dmFye1BZVEhPTlkyS30gaXMgc2V0IHRvIGEgbm9uLWVtcHR5IHN0cmluZywgaW4gd2hpY2ggY2FzZSBpdCBpcwotaW5pdGlhbGl6ZWQgdG8gXGNvZGV7MH0uICBUaHVzLCB5b3UgY2FuIHNldAotXGVudnZhcntQWVRIT05ZMkt9IHRvIGEgbm9uLWVtcHR5IHN0cmluZyBpbiB0aGUgZW52aXJvbm1lbnQgdG8gcmVxdWlyZSA0LWRpZ2l0Ci15ZWFycyBmb3IgYWxsIHllYXIgaW5wdXQuICBXaGVuIDItZGlnaXQgeWVhcnMgYXJlIGFjY2VwdGVkLCB0aGV5IGFyZQotY29udmVydGVkIGFjY29yZGluZyB0byB0aGUgXFBPU0lYe30gb3IgWC9PcGVuIHN0YW5kYXJkOiB2YWx1ZXMgNjktOTkKLWFyZSBtYXBwZWQgdG8gMTk2OS0xOTk5LCBhbmQgdmFsdWVzIDAtLTY4IGFyZSBtYXBwZWQgdG8gMjAwMC0tMjA2OC4KLVZhbHVlcyAxMDAtLTE4OTkgYXJlIGFsd2F5cyBpbGxlZ2FsLiAgTm90ZSB0aGF0IHRoaXMgaXMgbmV3IGFzIG9mCi1QeXRob24gMS41LjIoYTIpOyBlYXJsaWVyIHZlcnNpb25zLCB1cCB0byBQeXRob24gMS41LjEgYW5kIDEuNS4yYTEsCi13b3VsZCBhZGQgMTkwMCB0byB5ZWFyIHZhbHVlcyBiZWxvdyAxOTAwLgotCi1caXRlbQotVVRDXGluZGV4e1VUQ30gaXMgQ29vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWVcaW5kZXh7Q29vcmRpbmF0ZWQKLVVuaXZlcnNhbCBUaW1lfSAoZm9ybWVybHkga25vd24gYXMgR3JlZW53aWNoIE1lYW4KLVRpbWUsXGluZGV4e0dyZWVud2ljaCBNZWFuIFRpbWV9IG9yIEdNVCkuICBUaGUgYWNyb255bSBVVEMgaXMgbm90IGEKLW1pc3Rha2UgYnV0IGEgY29tcHJvbWlzZSBiZXR3ZWVuIEVuZ2xpc2ggYW5kIEZyZW5jaC4KLQotXGl0ZW0KLURTVCBpcyBEYXlsaWdodCBTYXZpbmcgVGltZSxcaW5kZXh7RGF5bGlnaHQgU2F2aW5nIFRpbWV9IGFuIGFkanVzdG1lbnQKLW9mIHRoZSB0aW1lem9uZSBieSAodXN1YWxseSkgb25lIGhvdXIgZHVyaW5nIHBhcnQgb2YgdGhlIHllYXIuICBEU1QKLXJ1bGVzIGFyZSBtYWdpYyAoZGV0ZXJtaW5lZCBieSBsb2NhbCBsYXcpIGFuZCBjYW4gY2hhbmdlIGZyb20geWVhciB0bwoteWVhci4gIFRoZSBDIGxpYnJhcnkgaGFzIGEgdGFibGUgY29udGFpbmluZyB0aGUgbG9jYWwgcnVsZXMgKG9mdGVuIGl0Ci1pcyByZWFkIGZyb20gYSBzeXN0ZW0gZmlsZSBmb3IgZmxleGliaWxpdHkpIGFuZCBpcyB0aGUgb25seSBzb3VyY2Ugb2YKLVRydWUgV2lzZG9tIGluIHRoaXMgcmVzcGVjdC4KLQotXGl0ZW0KLVRoZSBwcmVjaXNpb24gb2YgdGhlIHZhcmlvdXMgcmVhbC10aW1lIGZ1bmN0aW9ucyBtYXkgYmUgbGVzcyB0aGFuCi1zdWdnZXN0ZWQgYnkgdGhlIHVuaXRzIGluIHdoaWNoIHRoZWlyIHZhbHVlIG9yIGFyZ3VtZW50IGlzIGV4cHJlc3NlZC4KLUUuZy5cIG9uIG1vc3QgXFVOSVh7fSBzeXN0ZW1zLCB0aGUgY2xvY2sgYGB0aWNrcycnIG9ubHkgNTAgb3IgMTAwIHRpbWVzIGEKLXNlY29uZCwgYW5kIG9uIHRoZSBNYWMsIHRpbWVzIGFyZSBvbmx5IGFjY3VyYXRlIHRvIHdob2xlIHNlY29uZHMuCi0KLVxpdGVtCi1PbiB0aGUgb3RoZXIgaGFuZCwgdGhlIHByZWNpc2lvbiBvZiBcZnVuY3Rpb257dGltZSgpfSBhbmQKLVxmdW5jdGlvbntzbGVlcCgpfSBpcyBiZXR0ZXIgdGhhbiB0aGVpciBcVU5JWHt9IGVxdWl2YWxlbnRzOiB0aW1lcyBhcmUKLWV4cHJlc3NlZCBhcyBmbG9hdGluZyBwb2ludCBudW1iZXJzLCBcZnVuY3Rpb257dGltZSgpfSByZXR1cm5zIHRoZQotbW9zdCBhY2N1cmF0ZSB0aW1lIGF2YWlsYWJsZSAodXNpbmcgXFVOSVh7fSBcY2Z1bmN0aW9ue2dldHRpbWVvZmRheSgpfQotd2hlcmUgYXZhaWxhYmxlKSwgYW5kIFxmdW5jdGlvbntzbGVlcCgpfSB3aWxsIGFjY2VwdCBhIHRpbWUgd2l0aCBhCi1ub256ZXJvIGZyYWN0aW9uIChcVU5JWHt9IFxjZnVuY3Rpb257c2VsZWN0KCl9IGlzIHVzZWQgdG8gaW1wbGVtZW50Ci10aGlzLCB3aGVyZSBhdmFpbGFibGUpLgotCi1caXRlbQotVGhlIHRpbWUgdmFsdWUgYXMgcmV0dXJuZWQgYnkgXGZ1bmN0aW9ue2dtdGltZSgpfSwKLVxmdW5jdGlvbntsb2NhbHRpbWUoKX0sIGFuZCBcZnVuY3Rpb257c3RycHRpbWUoKX0sIGFuZCBhY2NlcHRlZCBieQotXGZ1bmN0aW9ue2FzY3RpbWUoKX0sIFxmdW5jdGlvbntta3RpbWUoKX0gYW5kIFxmdW5jdGlvbntzdHJmdGltZSgpfSwKLWlzIGEgc2VxdWVuY2Ugb2YgOSBpbnRlZ2Vycy4gIFRoZSByZXR1cm4gdmFsdWVzIG9mIFxmdW5jdGlvbntnbXRpbWUoKX0sCi1cZnVuY3Rpb257bG9jYWx0aW1lKCl9LCBhbmQgXGZ1bmN0aW9ue3N0cnB0aW1lKCl9IGFsc28gb2ZmZXIgYXR0cmlidXRlCi1uYW1lcyBmb3IgaW5kaXZpZHVhbCBmaWVsZHMuCi0KLVxiZWdpbnt0YWJsZWlpaX17Y3xsfGx9e3RleHRybX17SW5kZXh9e0F0dHJpYnV0ZX17VmFsdWVzfQotICBcbGluZWlpaXswfXtcbWVtYmVye3RtX3llYXJ9fXsoZm9yIGV4YW1wbGUsIDE5OTMpfQotICBcbGluZWlpaXsxfXtcbWVtYmVye3RtX21vbn19e3JhbmdlIFsxLDEyXX0KLSAgXGxpbmVpaWl7Mn17XG1lbWJlcnt0bV9tZGF5fX17cmFuZ2UgWzEsMzFdfQotICBcbGluZWlpaXszfXtcbWVtYmVye3RtX2hvdXJ9fXtyYW5nZSBbMCwyM119Ci0gIFxsaW5laWlpezR9e1xtZW1iZXJ7dG1fbWlufX17cmFuZ2UgWzAsNTldfQotICBcbGluZWlpaXs1fXtcbWVtYmVye3RtX3NlY319e3JhbmdlIFswLDYxXTsgc2VlIFxzdHJvbmd7KDEpfSBpbiBcZnVuY3Rpb257c3RyZnRpbWUoKX0gZGVzY3JpcHRpb259Ci0gIFxsaW5laWlpezZ9e1xtZW1iZXJ7dG1fd2RheX19e3JhbmdlIFswLDZdLCBNb25kYXkgaXMgMH0KLSAgXGxpbmVpaWl7N317XG1lbWJlcnt0bV95ZGF5fX17cmFuZ2UgWzEsMzY2XX0KLSAgXGxpbmVpaWl7OH17XG1lbWJlcnt0bV9pc2RzdH19ezAsIDEgb3IgLTE7IHNlZSBiZWxvd30KLVxlbmR7dGFibGVpaWl9Ci0KLU5vdGUgdGhhdCB1bmxpa2UgdGhlIEMgc3RydWN0dXJlLCB0aGUgbW9udGggdmFsdWUgaXMgYQotcmFuZ2Ugb2YgMS0xMiwgbm90IDAtMTEuICBBIHllYXIgdmFsdWUgd2lsbCBiZSBoYW5kbGVkIGFzIGRlc2NyaWJlZAotdW5kZXIgYGBZZWFyIDIwMDAgKFkySykgaXNzdWVzJycgYWJvdmUuICBBIFxjb2Rley0xfSBhcmd1bWVudCBhcyB0aGUKLWRheWxpZ2h0IHNhdmluZ3MgZmxhZywgcGFzc2VkIHRvIFxmdW5jdGlvbntta3RpbWUoKX0gd2lsbCB1c3VhbGx5Ci1yZXN1bHQgaW4gdGhlIGNvcnJlY3QgZGF5bGlnaHQgc2F2aW5ncyBzdGF0ZSB0byBiZSBmaWxsZWQgaW4uCi0KLVdoZW4gYSB0dXBsZSB3aXRoIGFuIGluY29ycmVjdCBsZW5ndGggaXMgcGFzc2VkIHRvIGEgZnVuY3Rpb24KLWV4cGVjdGluZyBhIFxjbGFzc3tzdHJ1Y3RfdGltZX0sIG9yIGhhdmluZyBlbGVtZW50cyBvZiB0aGUgd3JvbmcgdHlwZSwgYQotXGV4Y2VwdGlvbntUeXBlRXJyb3J9IGlzIHJhaXNlZC4KLQotXHZlcnNpb25jaGFuZ2VkW1RoZSB0aW1lIHZhbHVlIHNlcXVlbmNlIHdhcyBjaGFuZ2VkIGZyb20gYSB0dXBsZSB0byBhCi0gICAgICAgICAgICAgICAgXGNsYXNze3N0cnVjdF90aW1lfSwgd2l0aCB0aGUgYWRkaXRpb24gb2YgYXR0cmlidXRlIG5hbWVzCi0gICAgICAgICAgICAgICAgZm9yIHRoZSBmaWVsZHNdezIuMn0KLVxlbmR7aXRlbWl6ZX0KLQotVGhlIG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFuZCBkYXRhIGl0ZW1zOgotCi0KLVxiZWdpbntkYXRhZGVzY317YWNjZXB0MmR5ZWFyfQotQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdHdvLWRpZ2l0IHllYXIgdmFsdWVzIHdpbGwgYmUKLWFjY2VwdGVkLiAgVGhpcyBpcyB0cnVlIGJ5IGRlZmF1bHQsIGJ1dCB3aWxsIGJlIHNldCB0byBmYWxzZSBpZiB0aGUKLWVudmlyb25tZW50IHZhcmlhYmxlIFxlbnZ2YXJ7UFlUSE9OWTJLfSBoYXMgYmVlbiBzZXQgdG8gYSBub24tZW1wdHkKLXN0cmluZy4gIEl0IG1heSBhbHNvIGJlIG1vZGlmaWVkIGF0IHJ1biB0aW1lLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXthbHR6b25lfQotVGhlIG9mZnNldCBvZiB0aGUgbG9jYWwgRFNUIHRpbWV6b25lLCBpbiBzZWNvbmRzIHdlc3Qgb2YgVVRDLCBpZiBvbmUKLWlzIGRlZmluZWQuICBUaGlzIGlzIG5lZ2F0aXZlIGlmIHRoZSBsb2NhbCBEU1QgdGltZXpvbmUgaXMgZWFzdCBvZiBVVEMKLShhcyBpbiBXZXN0ZXJuIEV1cm9wZSwgaW5jbHVkaW5nIHRoZSBVSykuICBPbmx5IHVzZSB0aGlzIGlmCi1cY29kZXtkYXlsaWdodH0gaXMgbm9uemVyby4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317YXNjdGltZX17XG9wdGlvbmFse3R9fQotQ29udmVydCBhIHR1cGxlIG9yIFxjbGFzc3tzdHJ1Y3RfdGltZX0gcmVwcmVzZW50aW5nIGEgdGltZSBhcyByZXR1cm5lZAotYnkgXGZ1bmN0aW9ue2dtdGltZSgpfQotb3IgXGZ1bmN0aW9ue2xvY2FsdGltZSgpfSB0byBhIDI0LWNoYXJhY3RlciBzdHJpbmcgb2YgdGhlIGZvbGxvd2luZyBmb3JtOgotXGNvZGV7J1N1biBKdW4gMjAgMjM6MjE6MDUgMTk5Myd9LiAgSWYgXHZhcnt0fSBpcyBub3QgcHJvdmlkZWQsIHRoZQotY3VycmVudCB0aW1lIGFzIHJldHVybmVkIGJ5IFxmdW5jdGlvbntsb2NhbHRpbWUoKX0gaXMgdXNlZC4KLUxvY2FsZSBpbmZvcm1hdGlvbiBpcyBub3QgdXNlZCBieSBcZnVuY3Rpb257YXNjdGltZSgpfS4KLVxub3Rle1VubGlrZSB0aGUgQyBmdW5jdGlvbiBvZiB0aGUgc2FtZSBuYW1lLCB0aGVyZSBpcyBubyB0cmFpbGluZwotbmV3bGluZS59Ci1cdmVyc2lvbmNoYW5nZWRbQWxsb3dlZCBcdmFye3R9IHRvIGJlIG9taXR0ZWRdezIuMX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y2xvY2t9e30KLU9uIFxVTklYLCByZXR1cm4KLXRoZSBjdXJyZW50IHByb2Nlc3NvciB0aW1lIGFzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGV4cHJlc3NlZCBpbgotc2Vjb25kcy4gIFRoZSBwcmVjaXNpb24sIGFuZCBpbiBmYWN0IHRoZSB2ZXJ5IGRlZmluaXRpb24gb2YgdGhlIG1lYW5pbmcKLW9mIGBgcHJvY2Vzc29yIHRpbWUnJ1xpbmRleHtDUFUgdGltZX1caW5kZXh7cHJvY2Vzc29yIHRpbWV9LCBkZXBlbmRzCi1vbiB0aGF0IG9mIHRoZSBDIGZ1bmN0aW9uIG9mIHRoZSBzYW1lIG5hbWUsIGJ1dCBpbiBhbnkgY2FzZSwgdGhpcyBpcwotdGhlIGZ1bmN0aW9uIHRvIHVzZSBmb3IgYmVuY2htYXJraW5nXGluZGV4e2JlbmNobWFya2luZ30gUHl0aG9uIG9yCi10aW1pbmcgYWxnb3JpdGhtcy4KLQotT24gV2luZG93cywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHdhbGwtY2xvY2sgc2Vjb25kcyBlbGFwc2VkIHNpbmNlIHRoZQotZmlyc3QgY2FsbCB0byB0aGlzIGZ1bmN0aW9uLCBhcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlciwKLWJhc2VkIG9uIHRoZSBXaW4zMiBmdW5jdGlvbiBcY2Z1bmN0aW9ue1F1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCl9LgotVGhlIHJlc29sdXRpb24gaXMgdHlwaWNhbGx5IGJldHRlciB0aGFuIG9uZSBtaWNyb3NlY29uZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y3RpbWV9e1xvcHRpb25hbHtzZWNzfX0KLUNvbnZlcnQgYSB0aW1lIGV4cHJlc3NlZCBpbiBzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaCB0byBhIHN0cmluZwotcmVwcmVzZW50aW5nIGxvY2FsIHRpbWUuIElmIFx2YXJ7c2Vjc30gaXMgbm90IHByb3ZpZGVkIG9yCi1cY29uc3RhbnR7Tm9uZX0sIHRoZSBjdXJyZW50IHRpbWUgYXMgcmV0dXJuZWQgYnkgXGZ1bmN0aW9ue3RpbWUoKX0gaXMKLXVzZWQuICBcY29kZXtjdGltZShcdmFye3NlY3N9KX0gaXMgZXF1aXZhbGVudCB0bwotXGNvZGV7YXNjdGltZShsb2NhbHRpbWUoXHZhcntzZWNzfSkpfS4KLUxvY2FsZSBpbmZvcm1hdGlvbiBpcyBub3QgdXNlZCBieSBcZnVuY3Rpb257Y3RpbWUoKX0uCi1cdmVyc2lvbmNoYW5nZWRbQWxsb3dlZCBcdmFye3NlY3N9IHRvIGJlIG9taXR0ZWRdezIuMX0KLVx2ZXJzaW9uY2hhbmdlZFtJZiBcdmFye3NlY3N9IGlzIFxjb25zdGFudHtOb25lfSwgdGhlIGN1cnJlbnQgdGltZSBpcwotICAgICAgICAgICAgICAgIHVzZWRdezIuNH0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317ZGF5bGlnaHR9Ci1Ob256ZXJvIGlmIGEgRFNUIHRpbWV6b25lIGlzIGRlZmluZWQuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dtdGltZX17XG9wdGlvbmFse3NlY3N9fQotQ29udmVydCBhIHRpbWUgZXhwcmVzc2VkIGluIHNlY29uZHMgc2luY2UgdGhlIGVwb2NoIHRvIGEgXGNsYXNze3N0cnVjdF90aW1lfQotaW4gVVRDIGluIHdoaWNoIHRoZSBkc3QgZmxhZyBpcyBhbHdheXMgemVyby4gIElmIFx2YXJ7c2Vjc30gaXMgbm90Ci1wcm92aWRlZCBvciBcY29uc3RhbnR7Tm9uZX0sIHRoZSBjdXJyZW50IHRpbWUgYXMgcmV0dXJuZWQgYnkKLVxmdW5jdGlvbnt0aW1lKCl9IGlzIHVzZWQuICBGcmFjdGlvbnMgb2YgYSBzZWNvbmQgYXJlIGlnbm9yZWQuICBTZWUKLWFib3ZlIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBcY2xhc3N7c3RydWN0X3RpbWV9IG9iamVjdC4gU2VlCi1cZnVuY3Rpb257Y2FsZW5kYXIudGltZWdtKCl9IGZvciB0aGUgaW52ZXJzZSBvZiB0aGlzIGZ1bmN0aW9uLgotXHZlcnNpb25jaGFuZ2VkW0FsbG93ZWQgXHZhcntzZWNzfSB0byBiZSBvbWl0dGVkXXsyLjF9Ci1cdmVyc2lvbmNoYW5nZWRbSWYgXHZhcntzZWNzfSBpcyBcY29uc3RhbnR7Tm9uZX0sIHRoZSBjdXJyZW50IHRpbWUgaXMKLSAgICAgICAgICAgICAgICB1c2VkXXsyLjR9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2xvY2FsdGltZX17XG9wdGlvbmFse3NlY3N9fQotTGlrZSBcZnVuY3Rpb257Z210aW1lKCl9IGJ1dCBjb252ZXJ0cyB0byBsb2NhbCB0aW1lLiAgSWYgXHZhcntzZWNzfSBpcwotbm90IHByb3ZpZGVkIG9yIFxjb25zdGFudHtOb25lfSwgdGhlIGN1cnJlbnQgdGltZSBhcyByZXR1cm5lZCBieQotXGZ1bmN0aW9ue3RpbWUoKX0gaXMgdXNlZC4gIFRoZSBkc3QgZmxhZyBpcyBzZXQgdG8gXGNvZGV7MX0gd2hlbiBEU1QKLWFwcGxpZXMgdG8gdGhlIGdpdmVuIHRpbWUuCi1cdmVyc2lvbmNoYW5nZWRbQWxsb3dlZCBcdmFye3NlY3N9IHRvIGJlIG9taXR0ZWRdezIuMX0KLVx2ZXJzaW9uY2hhbmdlZFtJZiBcdmFye3NlY3N9IGlzIFxjb25zdGFudHtOb25lfSwgdGhlIGN1cnJlbnQgdGltZSBpcwotICAgICAgICAgICAgICAgIHVzZWRdezIuNH0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bWt0aW1lfXt0fQotVGhpcyBpcyB0aGUgaW52ZXJzZSBmdW5jdGlvbiBvZiBcZnVuY3Rpb257bG9jYWx0aW1lKCl9LiAgSXRzIGFyZ3VtZW50Ci1pcyB0aGUgXGNsYXNze3N0cnVjdF90aW1lfSBvciBmdWxsIDktdHVwbGUgKHNpbmNlIHRoZSBkc3QgZmxhZyBpcwotbmVlZGVkOyB1c2UgXGNvZGV7LTF9IGFzIHRoZSBkc3QgZmxhZyBpZiBpdCBpcyB1bmtub3duKSB3aGljaAotZXhwcmVzc2VzIHRoZSB0aW1lIGluCi1cZW1waHtsb2NhbH0gdGltZSwgbm90IFVUQy4gIEl0IHJldHVybnMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIsIGZvcgotY29tcGF0aWJpbGl0eSB3aXRoIFxmdW5jdGlvbnt0aW1lKCl9LiAgSWYgdGhlIGlucHV0IHZhbHVlIGNhbm5vdCBiZQotcmVwcmVzZW50ZWQgYXMgYSB2YWxpZCB0aW1lLCBlaXRoZXIgXGV4Y2VwdGlvbntPdmVyZmxvd0Vycm9yfSBvcgotXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSB3aWxsIGJlIHJhaXNlZCAod2hpY2ggZGVwZW5kcyBvbiB3aGV0aGVyIHRoZQotaW52YWxpZCB2YWx1ZSBpcyBjYXVnaHQgYnkgUHl0aG9uIG9yIHRoZSB1bmRlcmx5aW5nIEMgbGlicmFyaWVzKS4gIFRoZQotZWFybGllc3QgZGF0ZSBmb3Igd2hpY2ggaXQgY2FuIGdlbmVyYXRlIGEgdGltZSBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NsZWVwfXtzZWNzfQotU3VzcGVuZCBleGVjdXRpb24gZm9yIHRoZSBnaXZlbiBudW1iZXIgb2Ygc2Vjb25kcy4gIFRoZSBhcmd1bWVudCBtYXkKLWJlIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHRvIGluZGljYXRlIGEgbW9yZSBwcmVjaXNlIHNsZWVwIHRpbWUuCi1UaGUgYWN0dWFsIHN1c3BlbnNpb24gdGltZSBtYXkgYmUgbGVzcyB0aGFuIHRoYXQgcmVxdWVzdGVkIGJlY2F1c2UgYW55Ci1jYXVnaHQgc2lnbmFsIHdpbGwgdGVybWluYXRlIHRoZSBcZnVuY3Rpb257c2xlZXAoKX0gZm9sbG93aW5nCi1leGVjdXRpb24gb2YgdGhhdCBzaWduYWwncyBjYXRjaGluZyByb3V0aW5lLiAgQWxzbywgdGhlIHN1c3BlbnNpb24KLXRpbWUgbWF5IGJlIGxvbmdlciB0aGFuIHJlcXVlc3RlZCBieSBhbiBhcmJpdHJhcnkgYW1vdW50IGJlY2F1c2Ugb2YKLXRoZSBzY2hlZHVsaW5nIG9mIG90aGVyIGFjdGl2aXR5IGluIHRoZSBzeXN0ZW0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3N0cmZ0aW1lfXtmb3JtYXRcb3B0aW9uYWx7LCB0fX0KLUNvbnZlcnQgYSB0dXBsZSBvciBcY2xhc3N7c3RydWN0X3RpbWV9IHJlcHJlc2VudGluZyBhIHRpbWUgYXMgcmV0dXJuZWQKLWJ5IFxmdW5jdGlvbntnbXRpbWUoKX0gb3IgXGZ1bmN0aW9ue2xvY2FsdGltZSgpfSB0byBhIHN0cmluZyBhcwotc3BlY2lmaWVkIGJ5IHRoZSBcdmFye2Zvcm1hdH0gYXJndW1lbnQuICBJZiBcdmFye3R9IGlzIG5vdAotcHJvdmlkZWQsIHRoZSBjdXJyZW50IHRpbWUgYXMgcmV0dXJuZWQgYnkgXGZ1bmN0aW9ue2xvY2FsdGltZSgpfSBpcwotdXNlZC4gIFx2YXJ7Zm9ybWF0fSBtdXN0IGJlIGEgc3RyaW5nLiAgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSBpcyByYWlzZWQKLWlmIGFueSBmaWVsZCBpbiBcdmFye3R9IGlzIG91dHNpZGUgb2YgdGhlIGFsbG93ZWQgcmFuZ2UuCi1cdmVyc2lvbmNoYW5nZWRbQWxsb3dlZCBcdmFye3R9IHRvIGJlIG9taXR0ZWRdezIuMX0KLVx2ZXJzaW9uY2hhbmdlZFtcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IHJhaXNlZCBpZiBhIGZpZWxkIGluIFx2YXJ7dH0gaXMKLW91dCBvZiByYW5nZV17Mi40fQotXHZlcnNpb25jaGFuZ2VkWzAgaXMgbm93IGEgbGVnYWwgYXJndW1lbnQgZm9yIGFueSBwb3NpdGlvbiBpbiB0aGUgdGltZSB0dXBsZTsKLWlmIGl0IGlzIG5vcm1hbGx5IGlsbGVnYWwgdGhlIHZhbHVlIGlzIGZvcmNlZCB0byBhIGNvcnJlY3Qgb25lLl17Mi41fQotCi0KLVRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlcyBjYW4gYmUgZW1iZWRkZWQgaW4gdGhlIFx2YXJ7Zm9ybWF0fSBzdHJpbmcuCi1UaGV5IGFyZSBzaG93biB3aXRob3V0IHRoZSBvcHRpb25hbCBmaWVsZCB3aWR0aCBhbmQgcHJlY2lzaW9uCi1zcGVjaWZpY2F0aW9uLCBhbmQgYXJlIHJlcGxhY2VkIGJ5IHRoZSBpbmRpY2F0ZWQgY2hhcmFjdGVycyBpbiB0aGUKLVxmdW5jdGlvbntzdHJmdGltZSgpfSByZXN1bHQ6Ci0KLVxiZWdpbnt0YWJsZWlpaX17Y3xwezI0ZW19fGN9e2NvZGV9e0RpcmVjdGl2ZX17TWVhbmluZ317Tm90ZXN9Ci0gIFxsaW5laWlpe1wlYX17TG9jYWxlJ3MgYWJicmV2aWF0ZWQgd2Vla2RheSBuYW1lLn17fQotICBcbGluZWlpaXtcJUF9e0xvY2FsZSdzIGZ1bGwgd2Vla2RheSBuYW1lLn17fQotICBcbGluZWlpaXtcJWJ9e0xvY2FsZSdzIGFiYnJldmlhdGVkIG1vbnRoIG5hbWUufXt9Ci0gIFxsaW5laWlpe1wlQn17TG9jYWxlJ3MgZnVsbCBtb250aCBuYW1lLn17fQotICBcbGluZWlpaXtcJWN9e0xvY2FsZSdzIGFwcHJvcHJpYXRlIGRhdGUgYW5kIHRpbWUgcmVwcmVzZW50YXRpb24ufXt9Ci0gIFxsaW5laWlpe1wlZH17RGF5IG9mIHRoZSBtb250aCBhcyBhIGRlY2ltYWwgbnVtYmVyIFswMSwzMV0ufXt9Ci0gIFxsaW5laWlpe1wlSH17SG91ciAoMjQtaG91ciBjbG9jaykgYXMgYSBkZWNpbWFsIG51bWJlciBbMDAsMjNdLn17fQotICBcbGluZWlpaXtcJUl9e0hvdXIgKDEyLWhvdXIgY2xvY2spIGFzIGEgZGVjaW1hbCBudW1iZXIgWzAxLDEyXS59e30KLSAgXGxpbmVpaWl7XCVqfXtEYXkgb2YgdGhlIHllYXIgYXMgYSBkZWNpbWFsIG51bWJlciBbMDAxLDM2Nl0ufXt9Ci0gIFxsaW5laWlpe1wlbX17TW9udGggYXMgYSBkZWNpbWFsIG51bWJlciBbMDEsMTJdLn17fQotICBcbGluZWlpaXtcJU19e01pbnV0ZSBhcyBhIGRlY2ltYWwgbnVtYmVyIFswMCw1OV0ufXt9Ci0gIFxsaW5laWlpe1wlcH17TG9jYWxlJ3MgZXF1aXZhbGVudCBvZiBlaXRoZXIgQU0gb3IgUE0ufXsoMSl9Ci0gIFxsaW5laWlpe1wlU317U2Vjb25kIGFzIGEgZGVjaW1hbCBudW1iZXIgWzAwLDYxXS59eygyKX0KLSAgXGxpbmVpaWl7XCVVfXtXZWVrIG51bWJlciBvZiB0aGUgeWVhciAoU3VuZGF5IGFzIHRoZSBmaXJzdCBkYXkgb2YgdGhlCi0gICAgICAgICAgICAgICAgd2VlaykgYXMgYSBkZWNpbWFsIG51bWJlciBbMDAsNTNdLiAgQWxsIGRheXMgaW4gYSBuZXcgeWVhcgotICAgICAgICAgICAgICAgIHByZWNlZGluZyB0aGUgZmlyc3QgU3VuZGF5IGFyZSBjb25zaWRlcmVkIHRvIGJlIGluIHdlZWsgMC59eygzKX0KLSAgXGxpbmVpaWl7XCV3fXtXZWVrZGF5IGFzIGEgZGVjaW1hbCBudW1iZXIgWzAoU3VuZGF5KSw2XS59e30KLSAgXGxpbmVpaWl7XCVXfXtXZWVrIG51bWJlciBvZiB0aGUgeWVhciAoTW9uZGF5IGFzIHRoZSBmaXJzdCBkYXkgb2YgdGhlCi0gICAgICAgICAgICAgICAgd2VlaykgYXMgYSBkZWNpbWFsIG51bWJlciBbMDAsNTNdLiAgQWxsIGRheXMgaW4gYSBuZXcgeWVhcgotICAgICAgICAgICAgICAgIHByZWNlZGluZyB0aGUgZmlyc3QgTW9uZGF5IGFyZSBjb25zaWRlcmVkIHRvIGJlIGluIHdlZWsgMC59eygzKX0KLSAgXGxpbmVpaWl7XCV4fXtMb2NhbGUncyBhcHByb3ByaWF0ZSBkYXRlIHJlcHJlc2VudGF0aW9uLn17fQotICBcbGluZWlpaXtcJVh9e0xvY2FsZSdzIGFwcHJvcHJpYXRlIHRpbWUgcmVwcmVzZW50YXRpb24ufXt9Ci0gIFxsaW5laWlpe1wleX17WWVhciB3aXRob3V0IGNlbnR1cnkgYXMgYSBkZWNpbWFsIG51bWJlciBbMDAsOTldLn17fQotICBcbGluZWlpaXtcJVl9e1llYXIgd2l0aCBjZW50dXJ5IGFzIGEgZGVjaW1hbCBudW1iZXIufXt9Ci0gIFxsaW5laWlpe1wlWn17VGltZSB6b25lIG5hbWUgKG5vIGNoYXJhY3RlcnMgaWYgbm8gdGltZSB6b25lIGV4aXN0cykufXt9Ci0gIFxsaW5laWlpe1wlXCV9e0EgbGl0ZXJhbCBcY2hhcmFjdGVye1wlfSBjaGFyYWN0ZXIufXt9Ci1cZW5ke3RhYmxlaWlpfQotCi1cbm9pbmRlbnQKLU5vdGVzOgotCi1cYmVnaW57ZGVzY3JpcHRpb259Ci0gIFxpdGVtWygxKV0KLSAgICBXaGVuIHVzZWQgd2l0aCB0aGUgXGZ1bmN0aW9ue3N0cnB0aW1lKCl9IGZ1bmN0aW9uLCB0aGUgXGNvZGV7XCVwfQotICAgIGRpcmVjdGl2ZSBvbmx5IGFmZmVjdHMgdGhlIG91dHB1dCBob3VyIGZpZWxkIGlmIHRoZSBcY29kZXtcJUl9IGRpcmVjdGl2ZQotICAgIGlzIHVzZWQgdG8gcGFyc2UgdGhlIGhvdXIuCi0gIFxpdGVtWygyKV0KLSAgICBUaGUgcmFuZ2UgcmVhbGx5IGlzIFxjb2RlezB9IHRvIFxjb2RlezYxfTsgdGhpcyBhY2NvdW50cyBmb3IgbGVhcAotICAgIHNlY29uZHMgYW5kIHRoZSAodmVyeSByYXJlKSBkb3VibGUgbGVhcCBzZWNvbmRzLgotICBcaXRlbVsoMyldCi0gICAgV2hlbiB1c2VkIHdpdGggdGhlIFxmdW5jdGlvbntzdHJwdGltZSgpfSBmdW5jdGlvbiwgXGNvZGV7XCVVfSBhbmQgXGNvZGV7XCVXfQotICAgIGFyZSBvbmx5IHVzZWQgaW4gY2FsY3VsYXRpb25zIHdoZW4gdGhlIGRheSBvZiB0aGUgd2VlayBhbmQgdGhlIHllYXIgYXJlCi0gICAgc3BlY2lmaWVkLgotXGVuZHtkZXNjcmlwdGlvbn0KLQotSGVyZSBpcyBhbiBleGFtcGxlLCBhIGZvcm1hdCBmb3IgZGF0ZXMgY29tcGF0aWJsZSB3aXRoIHRoYXQgc3BlY2lmaWVkIAotaW4gdGhlIFxyZmN7MjgyMn0gSW50ZXJuZXQgZW1haWwgc3RhbmRhcmQuCi0JXGZvb3Rub3Rle1RoZSB1c2Ugb2YgXGNvZGV7XCVafSBpcyBub3cKLQlkZXByZWNhdGVkLCBidXQgdGhlIFxjb2Rle1wlen0gZXNjYXBlIHRoYXQgZXhwYW5kcyB0byB0aGUgcHJlZmVycmVkIAotCWhvdXIvbWludXRlIG9mZnNldCBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFsbCBBTlNJIEMgbGlicmFyaWVzLiBBbHNvLAotCWEgc3RyaWN0IHJlYWRpbmcgb2YgdGhlIG9yaWdpbmFsIDE5ODIgXHJmY3s4MjJ9IHN0YW5kYXJkIGNhbGxzIGZvcgotCWEgdHdvLWRpZ2l0IHllYXIgKFwleSByYXRoZXIgdGhhbiBcJVkpLCBidXQgcHJhY3RpY2UgbW92ZWQgdG8KLQk0LWRpZ2l0IHllYXJzIGxvbmcgYmVmb3JlIHRoZSB5ZWFyIDIwMDAuICBUaGUgNC1kaWdpdCB5ZWFyIGhhcwotICAgICAgICBiZWVuIG1hbmRhdGVkIGJ5IFxyZmN7MjgyMn0sIHdoaWNoIG9ic29sZXRlcyBccmZjezgyMn0ufQotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZnJvbSB0aW1lIGltcG9ydCBnbXRpbWUsIHN0cmZ0aW1lCi0+Pj4gc3RyZnRpbWUoIiVhLCAlZCAlYiAlWSAlSDolTTolUyArMDAwMCIsIGdtdGltZSgpKQotJ1RodSwgMjggSnVuIDIwMDEgMTQ6MTc6MTUgKzAwMDAnCi1cZW5ke3ZlcmJhdGltfQotCi1BZGRpdGlvbmFsIGRpcmVjdGl2ZXMgbWF5IGJlIHN1cHBvcnRlZCBvbiBjZXJ0YWluIHBsYXRmb3JtcywgYnV0Ci1vbmx5IHRoZSBvbmVzIGxpc3RlZCBoZXJlIGhhdmUgYSBtZWFuaW5nIHN0YW5kYXJkaXplZCBieSBBTlNJIEMuCi0KLU9uIHNvbWUgcGxhdGZvcm1zLCBhbiBvcHRpb25hbCBmaWVsZCB3aWR0aCBhbmQgcHJlY2lzaW9uCi1zcGVjaWZpY2F0aW9uIGNhbiBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIGluaXRpYWwgXGNoYXJhY3RlcntcJX0gb2YgYQotZGlyZWN0aXZlIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI7IHRoaXMgaXMgYWxzbyBub3QgcG9ydGFibGUuCi1UaGUgZmllbGQgd2lkdGggaXMgbm9ybWFsbHkgMiBleGNlcHQgZm9yIFxjb2Rle1wlan0gd2hlcmUgaXQgaXMgMy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c3RycHRpbWV9e3N0cmluZ1xvcHRpb25hbHssIGZvcm1hdH19Ci1QYXJzZSBhIHN0cmluZyByZXByZXNlbnRpbmcgYSB0aW1lIGFjY29yZGluZyB0byBhIGZvcm1hdC4gIFRoZSByZXR1cm4gCi12YWx1ZSBpcyBhIFxjbGFzc3tzdHJ1Y3RfdGltZX0gYXMgcmV0dXJuZWQgYnkgXGZ1bmN0aW9ue2dtdGltZSgpfSBvcgotXGZ1bmN0aW9ue2xvY2FsdGltZSgpfS4gIAotCi1UaGUgXHZhcntmb3JtYXR9IHBhcmFtZXRlciB1c2VzIHRoZSBzYW1lIGRpcmVjdGl2ZXMgYXMgdGhvc2UgdXNlZCBieQotXGZ1bmN0aW9ue3N0cmZ0aW1lKCl9OyBpdCBkZWZhdWx0cyB0byBcY29kZXsiXCVhIFwlYiBcJWQgXCVIOlwlTTpcJVMKLSAgXCVZIn0gd2hpY2ggbWF0Y2hlcyB0aGUgZm9ybWF0dGluZyByZXR1cm5lZCBieSBcZnVuY3Rpb257Y3RpbWUoKX0uCi1JZiBcdmFye3N0cmluZ30gY2Fubm90IGJlIHBhcnNlZCBhY2NvcmRpbmcgdG8gXHZhcntmb3JtYXR9LCBvciBpZiBpdAotaGFzIGV4Y2VzcyBkYXRhIGFmdGVyIHBhcnNpbmcsIFxleGNlcHRpb257VmFsdWVFcnJvcn0gaXMgcmFpc2VkLiAgVGhlCi1kZWZhdWx0IHZhbHVlcyB1c2VkIHRvIGZpbGwgaW4gYW55IG1pc3NpbmcgZGF0YSB3aGVuIG1vcmUgYWNjdXJhdGUKLXZhbHVlcyBjYW5ub3QgYmUgaW5mZXJyZWQgYXJlIFxjb2RleygxOTAwLCAxLCAxLCAwLCAwLCAwLCAwLCAxLCAtMSl9LgotCi1Gb3IgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGltcG9ydCB0aW1lCi0+Pj4gdGltZS5zdHJwdGltZSgiMzAgTm92IDAwIiwgIiVkICViICV5IikKLSgyMDAwLCAxMSwgMzAsIDAsIDAsIDAsIDMsIDMzNSwgLTEpCi1cZW5ke3ZlcmJhdGltfQotCi1TdXBwb3J0IGZvciB0aGUgXGNvZGV7XCVafSBkaXJlY3RpdmUgaXMgYmFzZWQgb24gdGhlIHZhbHVlcyBjb250YWluZWQgaW4KLVxjb2Rle3R6bmFtZX0gYW5kIHdoZXRoZXIgXGNvZGV7ZGF5bGlnaHR9IGlzIHRydWUuICBCZWNhdXNlIG9mIHRoaXMsCi1pdCBpcyBwbGF0Zm9ybS1zcGVjaWZpYyBleGNlcHQgZm9yIHJlY29nbml6aW5nIFVUQyBhbmQgR01UIHdoaWNoIGFyZQotYWx3YXlzIGtub3duIChhbmQgYXJlIGNvbnNpZGVyZWQgdG8gYmUgbm9uLWRheWxpZ2h0IHNhdmluZ3MKLXRpbWV6b25lcykuCi0KLU9ubHkgdGhlIGRpcmVjdGl2ZXMgc3BlY2lmaWVkIGluIHRoZSBkb2N1bWVudGF0aW9uIGFyZSBzdXBwb3J0ZWQuICBCZWNhdXNlCi1cY29kZXtzdHJmdGltZSgpfSBpcyBpbXBsZW1lbnRlZCBwZXIgcGxhdGZvcm0gaXQgY2FuIHNvbWV0aW1lcyBvZmZlciBtb3JlCi1kaXJlY3RpdmVzIHRoYW4gdGhvc2UgbGlzdGVkLiAgQnV0IFxjb2Rle3N0cnB0aW1lKCl9IGlzIGluZGVwZW5kZW50IG9mIGFueQotcGxhdGZvcm0gYW5kIHRodXMgZG9lcyBub3QgbmVjZXNzYXJpbHkgc3VwcG9ydCBhbGwgZGlyZWN0aXZlcyBhdmFpbGFibGUgdGhhdAotYXJlIG5vdCBkb2N1bWVudGVkIGFzIHN1cHBvcnRlZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317c3RydWN0X3RpbWV9Ci1UaGUgdHlwZSBvZiB0aGUgdGltZSB2YWx1ZSBzZXF1ZW5jZSByZXR1cm5lZCBieSBcZnVuY3Rpb257Z210aW1lKCl9LAotXGZ1bmN0aW9ue2xvY2FsdGltZSgpfSwgYW5kIFxmdW5jdGlvbntzdHJwdGltZSgpfS4KLVx2ZXJzaW9uYWRkZWR7Mi4yfQotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt0aW1lfXt9Ci1SZXR1cm4gdGhlIHRpbWUgYXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgZXhwcmVzc2VkIGluIHNlY29uZHMgc2luY2UKLXRoZSBlcG9jaCwgaW4gVVRDLiAgTm90ZSB0aGF0IGV2ZW4gdGhvdWdoIHRoZSB0aW1lIGlzIGFsd2F5cyByZXR1cm5lZAotYXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIsIG5vdCBhbGwgc3lzdGVtcyBwcm92aWRlIHRpbWUgd2l0aCBhIGJldHRlcgotcHJlY2lzaW9uIHRoYW4gMSBzZWNvbmQuICBXaGlsZSB0aGlzIGZ1bmN0aW9uIG5vcm1hbGx5IHJldHVybnMKLW5vbi1kZWNyZWFzaW5nIHZhbHVlcywgaXQgY2FuIHJldHVybiBhIGxvd2VyIHZhbHVlIHRoYW4gYSBwcmV2aW91cwotY2FsbCBpZiB0aGUgc3lzdGVtIGNsb2NrIGhhcyBiZWVuIHNldCBiYWNrIGJldHdlZW4gdGhlIHR3byBjYWxscy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317dGltZXpvbmV9Ci1UaGUgb2Zmc2V0IG9mIHRoZSBsb2NhbCAobm9uLURTVCkgdGltZXpvbmUsIGluIHNlY29uZHMgd2VzdCBvZiBVVEMKLShuZWdhdGl2ZSBpbiBtb3N0IG9mIFdlc3Rlcm4gRXVyb3BlLCBwb3NpdGl2ZSBpbiB0aGUgVVMsIHplcm8gaW4gdGhlCi1VSykuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e3R6bmFtZX0KLUEgdHVwbGUgb2YgdHdvIHN0cmluZ3M6IHRoZSBmaXJzdCBpcyB0aGUgbmFtZSBvZiB0aGUgbG9jYWwgbm9uLURTVAotdGltZXpvbmUsIHRoZSBzZWNvbmQgaXMgdGhlIG5hbWUgb2YgdGhlIGxvY2FsIERTVCB0aW1lem9uZS4gIElmIG5vIERTVAotdGltZXpvbmUgaXMgZGVmaW5lZCwgdGhlIHNlY29uZCBzdHJpbmcgc2hvdWxkIG5vdCBiZSB1c2VkLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt0enNldH17fQotUmVzZXRzIHRoZSB0aW1lIGNvbnZlcnNpb24gcnVsZXMgdXNlZCBieSB0aGUgbGlicmFyeSByb3V0aW5lcy4KLVRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBcZW52dmFye1RafSBzcGVjaWZpZXMgaG93IHRoaXMgaXMgZG9uZS4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotCi1BdmFpbGFiaWxpdHk6IFxVTklYLgotCi1cYmVnaW57bm90aWNlfQotQWx0aG91Z2ggaW4gbWFueSBjYXNlcywgY2hhbmdpbmcgdGhlIFxlbnZ2YXJ7VFp9IGVudmlyb25tZW50IHZhcmlhYmxlCi1tYXkgYWZmZWN0IHRoZSBvdXRwdXQgb2YgZnVuY3Rpb25zIGxpa2UgXGZ1bmN0aW9ue2xvY2FsdGltZX0gd2l0aG91dCBjYWxsaW5nIAotXGZ1bmN0aW9ue3R6c2V0fSwgdGhpcyBiZWhhdmlvciBzaG91bGQgbm90IGJlIHJlbGllZCBvbi4KLQotVGhlIFxlbnZ2YXJ7VFp9IGVudmlyb25tZW50IHZhcmlhYmxlIHNob3VsZCBjb250YWluIG5vIHdoaXRlc3BhY2UuCi1cZW5ke25vdGljZX0KLQotVGhlIHN0YW5kYXJkIGZvcm1hdCBvZiB0aGUgXGVudnZhcntUWn0gZW52aXJvbm1lbnQgdmFyaWFibGUgaXM6Ci0od2hpdGVzcGFjZSBhZGRlZCBmb3IgY2xhcml0eSkKLVxiZWdpbntpdGVtaXplfQotICAgIFxpdGVtW3N0ZCBvZmZzZXQgW2RzdCBbb2Zmc2V0XSBbLHN0YXJ0Wy90aW1lXSwgZW5kWy90aW1lXV1dXQotXGVuZHtpdGVtaXplfQotCi1XaGVyZToKLQotXGJlZ2lue2l0ZW1pemV9Ci0gIFxpdGVtW3N0ZCBhbmQgZHN0XQotICAgIFRocmVlIG9yIG1vcmUgYWxwaGFudW1lcmljcyBnaXZpbmcgdGhlIHRpbWV6b25lIGFiYnJldmlhdGlvbnMuCi0gICAgVGhlc2Ugd2lsbCBiZSBwcm9wYWdhdGVkIGludG8gdGltZS50em5hbWUKLQotICBcaXRlbVtvZmZzZXRdCi0gICAgVGhlIG9mZnNldCBoYXMgdGhlIGZvcm06IFxwbHVzbWludXN7fSBoaFs6bW1bOnNzXV0uCi0gICAgVGhpcyBpbmRpY2F0ZXMgdGhlIHZhbHVlIGFkZGVkIHRoZSBsb2NhbCB0aW1lIHRvIGFycml2ZSBhdCBVVEMuIAotICAgIElmIHByZWNlZGVkIGJ5IGEgJy0nLCB0aGUgdGltZXpvbmUgaXMgZWFzdCBvZiB0aGUgUHJpbWUgCi0gICAgTWVyaWRpYW47IG90aGVyd2lzZSwgaXQgaXMgd2VzdC4gSWYgbm8gb2Zmc2V0IGZvbGxvd3MKLSAgICBkc3QsIHN1bW1lciB0aW1lIGlzIGFzc3VtZWQgdG8gYmUgb25lIGhvdXIgYWhlYWQgb2Ygc3RhbmRhcmQgdGltZS4KLQotICBcaXRlbVtzdGFydFsvdGltZV0sZW5kWy90aW1lXV0KLSAgICBJbmRpY2F0ZXMgd2hlbiB0byBjaGFuZ2UgdG8gYW5kIGJhY2sgZnJvbSBEU1QuIFRoZSBmb3JtYXQgb2YgdGhlCi0gICAgc3RhcnQgYW5kIGVuZCBkYXRlcyBhcmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICBcYmVnaW57aXRlbWl6ZX0KLSAgICAgIFxpdGVtW0pcdmFye259XQotICAgICAgICBUaGUgSnVsaWFuIGRheSBcdmFye259ICgxIDw9IFx2YXJ7bn0gPD0gMzY1KS4gTGVhcCBkYXlzIGFyZSBub3QgCi0gICAgICAgIGNvdW50ZWQsIHNvIGluIGFsbCB5ZWFycyBGZWJydWFyeSAyOCBpcyBkYXkgNTkgYW5kCi0gICAgICAgIE1hcmNoIDEgaXMgZGF5IDYwLgotCi0gICAgXGl0ZW1bXHZhcntufV0KLSAgICAgICAgVGhlIHplcm8tYmFzZWQgSnVsaWFuIGRheSAoMCA8PSBcdmFye259IDw9IDM2NSkuIExlYXAgZGF5cyBhcmUKLSAgICAgICAgY291bnRlZCwgYW5kIGl0IGlzIHBvc3NpYmxlIHRvIHJlZmVyIHRvIEZlYnJ1YXJ5IDI5LgotCi0gICAgICBcaXRlbVtNXHZhcnttfS5cdmFye259Llx2YXJ7ZH1dCi0gICAgICAgIFRoZSBcdmFye2R9J3RoIGRheSAoMCA8PSBcdmFye2R9IDw9IDYpIG9yIHdlZWsgXHZhcntufSAKLSAgICAgICAgb2YgbW9udGggXHZhcnttfSBvZiB0aGUgeWVhciAoMSA8PSBcdmFye259IDw9IDUsIAotICAgICAgICAxIDw9IFx2YXJ7bX0gPD0gMTIsIHdoZXJlIHdlZWsgNSBtZWFucyAidGhlIGxhc3QgXHZhcntkfSBkYXkKLSAgICAgICAgaW4gbW9udGggXHZhcnttfSIgd2hpY2ggbWF5IG9jY3VyIGluIGVpdGhlciB0aGUgZm91cnRoIG9yIAotICAgICAgICB0aGUgZmlmdGggd2VlaykuIFdlZWsgMSBpcyB0aGUgZmlyc3Qgd2VlayBpbiB3aGljaCB0aGUgCi0gICAgICAgIFx2YXJ7ZH0ndGggZGF5IG9jY3Vycy4gRGF5IHplcm8gaXMgU3VuZGF5LgotICAgIFxlbmR7aXRlbWl6ZX0KLQotICAgIHRpbWUgaGFzIHRoZSBzYW1lIGZvcm1hdCBhcyBvZmZzZXQgZXhjZXB0IHRoYXQgbm8gbGVhZGluZyBzaWduICgnLScgb3IKLSAgICAnKycpIGlzIGFsbG93ZWQuIFRoZSBkZWZhdWx0LCBpZiB0aW1lIGlzIG5vdCBnaXZlbiwgaXMgMDI6MDA6MDAuCi1cZW5ke2l0ZW1pemV9Ci0KLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IG9zLmVudmlyb25bJ1RaJ10gPSAnRVNUKzA1RURULE00LjEuMCxNMTAuNS4wJwotPj4+IHRpbWUudHpzZXQoKQotPj4+IHRpbWUuc3RyZnRpbWUoJyVYICV4ICVaJykKLScwMjowNzozNiAwNS8wOC8wMyBFRFQnCi0+Pj4gb3MuZW52aXJvblsnVFonXSA9ICdBRVNULTEwQUVEVC0xMSxNMTAuNS4wLE0zLjUuMCcKLT4+PiB0aW1lLnR6c2V0KCkKLT4+PiB0aW1lLnN0cmZ0aW1lKCclWCAleCAlWicpCi0nMTY6MDg6MTIgMDUvMDgvMDMgQUVTVCcKLVxlbmR7dmVyYmF0aW19Ci0KLU9uIG1hbnkgXFVOSVh7fSBzeXN0ZW1zIChpbmNsdWRpbmcgKkJTRCwgTGludXgsIFNvbGFyaXMsIGFuZCBEYXJ3aW4pLCBpdAotaXMgbW9yZSBjb252ZW5pZW50IHRvIHVzZSB0aGUgc3lzdGVtJ3Mgem9uZWluZm8gKFxtYW5wYWdle3R6ZmlsZX17NX0pIAotZGF0YWJhc2UgdG8gc3BlY2lmeSB0aGUgdGltZXpvbmUgcnVsZXMuIFRvIGRvIHRoaXMsIHNldCB0aGUgCi1cZW52dmFye1RafSBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgcGF0aCBvZiB0aGUgcmVxdWlyZWQgdGltZXpvbmUgCi1kYXRhZmlsZSwgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHN5c3RlbXMgJ3pvbmVpbmZvJyB0aW1lem9uZSBkYXRhYmFzZSwKLXVzdWFsbHkgbG9jYXRlZCBhdCBcZmlsZXsvdXNyL3NoYXJlL3pvbmVpbmZvfS4gRm9yIGV4YW1wbGUsIAotXGNvZGV7J1VTL0Vhc3Rlcm4nfSwgXGNvZGV7J0F1c3RyYWxpYS9NZWxib3VybmUnfSwgXGNvZGV7J0VneXB0J30gb3IgCi1cY29kZXsnRXVyb3BlL0Ftc3RlcmRhbSd9LgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gb3MuZW52aXJvblsnVFonXSA9ICdVUy9FYXN0ZXJuJwotPj4+IHRpbWUudHpzZXQoKQotPj4+IHRpbWUudHpuYW1lCi0oJ0VTVCcsICdFRFQnKQotPj4+IG9zLmVudmlyb25bJ1RaJ10gPSAnRWd5cHQnCi0+Pj4gdGltZS50enNldCgpCi0+Pj4gdGltZS50em5hbWUKLSgnRUVUJywgJ0VFU1QnKQotXGVuZHt2ZXJiYXRpbX0KLQotXGVuZHtmdW5jZGVzY30KLQotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZW1vZHVsZXtkYXRldGltZX17TW9yZSBvYmplY3Qtb3JpZW50ZWQgaW50ZXJmYWNlIHRvIGRhdGVzIGFuZCB0aW1lcy59Ci0gIFxzZWVtb2R1bGV7bG9jYWxlfXtJbnRlcm5hdGlvbmFsaXphdGlvbiBzZXJ2aWNlcy4gIFRoZSBsb2NhbGUKLSAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzIGNhbiBhZmZlY3QgdGhlIHJldHVybiB2YWx1ZXMgZm9yIHNvbWUgb2YgCi0gICAgICAgICAgICAgICAgICAgICB0aGUgZnVuY3Rpb25zIGluIHRoZSBcbW9kdWxle3RpbWV9IG1vZHVsZS59Ci0gIFxzZWVtb2R1bGV7Y2FsZW5kYXJ9e0dlbmVyYWwgY2FsZW5kYXItcmVsYXRlZCBmdW5jdGlvbnMuICAKLSAgICAgICAgICAgICAgICAgICAgICAgXGZ1bmN0aW9ue3RpbWVnbSgpfSBpcyB0aGUgaW52ZXJzZSBvZgotICAgICAgICAgICAgICAgICAgICAgICBcZnVuY3Rpb257Z210aW1lKCl9IGZyb20gdGhpcyBtb2R1bGUufQotXGVuZHtzZWVhbHNvfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ0aW1laXQudGV4IGIvRG9jL2xpYi9saWJ0aW1laXQudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Njg3MjhmLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlidGltZWl0LnRleAorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3RpbWVpdH0gLS0tCi0gICAgICAgICBNZWFzdXJlIGV4ZWN1dGlvbiB0aW1lIG9mIHNtYWxsIGNvZGUgc25pcHBldHN9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXt0aW1laXR9Ci1cbW9kdWxlc3lub3BzaXN7TWVhc3VyZSB0aGUgZXhlY3V0aW9uIHRpbWUgb2Ygc21hbGwgY29kZSBzbmlwcGV0cy59Ci0KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGluZGV4e0JlbmNobWFya2luZ30KLVxpbmRleHtQZXJmb3JtYW5jZX0KLQotVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBzaW1wbGUgd2F5IHRvIHRpbWUgc21hbGwgYml0cyBvZiBQeXRob24gY29kZS4KLUl0IGhhcyBib3RoIGNvbW1hbmQgbGluZSBhcyB3ZWxsIGFzIGNhbGxhYmxlIGludGVyZmFjZXMuICBJdCBhdm9pZHMgYQotbnVtYmVyIG9mIGNvbW1vbiB0cmFwcyBmb3IgbWVhc3VyaW5nIGV4ZWN1dGlvbiB0aW1lcy4gIFNlZSBhbHNvIFRpbQotUGV0ZXJzJyBpbnRyb2R1Y3Rpb24gdG8gdGhlIGBgQWxnb3JpdGhtcycnIGNoYXB0ZXIgaW4gdGhlCi1cY2l0ZXRpdGxle1B5dGhvbiBDb29rYm9va30sIHB1Ymxpc2hlZCBieSBPJ1JlaWxseS4KLQotVGhlIG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgcHVibGljIGNsYXNzOgotCi1cYmVnaW57Y2xhc3NkZXNjfXtUaW1lcn17XG9wdGlvbmFse3N0bXQ9XGNvZGV7J3Bhc3MnfQotICAgICAgICAgICAgICAgICAgICAgICAgIFxvcHRpb25hbHssIHNldHVwPVxjb2RleydwYXNzJ30KLSAgICAgICAgICAgICAgICAgICAgICAgICBcb3B0aW9uYWx7LCB0aW1lcj08dGltZXIgZnVuY3Rpb24+fX19fQotQ2xhc3MgZm9yIHRpbWluZyBleGVjdXRpb24gc3BlZWQgb2Ygc21hbGwgY29kZSBzbmlwcGV0cy4KLQotVGhlIGNvbnN0cnVjdG9yIHRha2VzIGEgc3RhdGVtZW50IHRvIGJlIHRpbWVkLCBhbiBhZGRpdGlvbmFsIHN0YXRlbWVudAotdXNlZCBmb3Igc2V0dXAsIGFuZCBhIHRpbWVyIGZ1bmN0aW9uLiAgQm90aCBzdGF0ZW1lbnRzIGRlZmF1bHQgdG8KLVxjb2RleydwYXNzJ307IHRoZSB0aW1lciBmdW5jdGlvbiBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQgKHNlZSB0aGUKLW1vZHVsZSBkb2Mgc3RyaW5nKS4gIFRoZSBzdGF0ZW1lbnRzIG1heSBjb250YWluIG5ld2xpbmVzLCBhcyBsb25nIGFzCi10aGV5IGRvbid0IGNvbnRhaW4gbXVsdGktbGluZSBzdHJpbmcgbGl0ZXJhbHMuCi0KLVRvIG1lYXN1cmUgdGhlIGV4ZWN1dGlvbiB0aW1lIG9mIHRoZSBmaXJzdCBzdGF0ZW1lbnQsIHVzZSB0aGUKLVxtZXRob2R7dGltZWl0KCl9IG1ldGhvZC4gIFRoZSBcbWV0aG9ke3JlcGVhdCgpfSBtZXRob2QgaXMgYQotY29udmVuaWVuY2UgdG8gY2FsbCBcbWV0aG9ke3RpbWVpdCgpfSBtdWx0aXBsZSB0aW1lcyBhbmQgcmV0dXJuIGEgbGlzdAotb2YgcmVzdWx0cy4KLQotXHZlcnNpb25jaGFuZ2VkW1RoZSBcdmFye3N0bXR9IGFuZCBcdmFye3NldHVwfSBwYXJhbWV0ZXJzIGNhbiBub3cgYWxzbwotICAgICAgICAgICAgICAgIHRha2Ugb2JqZWN0cyB0aGF0IGFyZSBjYWxsYWJsZSB3aXRob3V0IGFyZ3VtZW50cy4gVGhpcwotCQl3aWxsIGVtYmVkIGNhbGxzIHRvIHRoZW0gaW4gYSB0aW1lciBmdW5jdGlvbiB0aGF0IHdpbGwKLQkJdGhlbiBiZSBleGVjdXRlZCBieSBcbWV0aG9ke3RpbWVpdCgpfS4gIE5vdGUgdGhhdCB0aGUgdGltaW5nCi0JCW92ZXJoZWFkIGlzIGEgbGl0dGxlIGxhcmdlciBpbiB0aGlzIGNhc2UgYmVjYXVzZSBvZiB0aGUKLQkJZXh0cmEgZnVuY3Rpb24gY2FsbHNdezIuNn0KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317cHJpbnRfZXhjfXtcb3B0aW9uYWx7ZmlsZT1cY29uc3RhbnR7Tm9uZX19fQotSGVscGVyIHRvIHByaW50IGEgdHJhY2ViYWNrIGZyb20gdGhlIHRpbWVkIGNvZGUuCi0KLVR5cGljYWwgdXNlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgdCA9IFRpbWVyKC4uLikgICAgICAgIyBvdXRzaWRlIHRoZSB0cnkvZXhjZXB0Ci0gICAgdHJ5OgotICAgICAgICB0LnRpbWVpdCguLi4pICAgICMgb3IgdC5yZXBlYXQoLi4uKQotICAgIGV4Y2VwdDoKLSAgICAgICAgdC5wcmludF9leGMoKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGFkdmFudGFnZSBvdmVyIHRoZSBzdGFuZGFyZCB0cmFjZWJhY2sgaXMgdGhhdCBzb3VyY2UgbGluZXMgaW4gdGhlCi1jb21waWxlZCB0ZW1wbGF0ZSB3aWxsIGJlIGRpc3BsYXllZC4KLVRoZSBvcHRpb25hbCBcdmFye2ZpbGV9IGFyZ3VtZW50IGRpcmVjdHMgd2hlcmUgdGhlIHRyYWNlYmFjayBpcyBzZW50OwotaXQgZGVmYXVsdHMgdG8gXGNvZGV7c3lzLnN0ZGVycn0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtyZXBlYXR9e1xvcHRpb25hbHtyZXBlYXRcY29kZXs9M30gXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlclxjb2Rlez0xMDAwMDAwfX19fQotQ2FsbCBcbWV0aG9ke3RpbWVpdCgpfSBhIGZldyB0aW1lcy4KLQotVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRoYXQgY2FsbHMgdGhlIFxtZXRob2R7dGltZWl0KCl9Ci1yZXBlYXRlZGx5LCByZXR1cm5pbmcgYSBsaXN0IG9mIHJlc3VsdHMuICBUaGUgZmlyc3QgYXJndW1lbnQgc3BlY2lmaWVzCi1ob3cgbWFueSB0aW1lcyB0byBjYWxsIFxtZXRob2R7dGltZWl0KCl9LiAgVGhlIHNlY29uZCBhcmd1bWVudAotc3BlY2lmaWVzIHRoZSBcdmFye251bWJlcn0gYXJndW1lbnQgZm9yIFxmdW5jdGlvbnt0aW1laXQoKX0uCi0KLVxiZWdpbntub3RpY2V9Ci1JdCdzIHRlbXB0aW5nIHRvIGNhbGN1bGF0ZSBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gZnJvbSB0aGUgcmVzdWx0Ci12ZWN0b3IgYW5kIHJlcG9ydCB0aGVzZS4gIEhvd2V2ZXIsIHRoaXMgaXMgbm90IHZlcnkgdXNlZnVsLiAgSW4gYSB0eXBpY2FsCi1jYXNlLCB0aGUgbG93ZXN0IHZhbHVlIGdpdmVzIGEgbG93ZXIgYm91bmQgZm9yIGhvdyBmYXN0IHlvdXIgbWFjaGluZSBjYW4gcnVuCi10aGUgZ2l2ZW4gY29kZSBzbmlwcGV0OyBoaWdoZXIgdmFsdWVzIGluIHRoZSByZXN1bHQgdmVjdG9yIGFyZSB0eXBpY2FsbHkgbm90Ci1jYXVzZWQgYnkgdmFyaWFiaWxpdHkgaW4gUHl0aG9uJ3Mgc3BlZWQsIGJ1dCBieSBvdGhlciBwcm9jZXNzZXMgaW50ZXJmZXJpbmcKLXdpdGggeW91ciB0aW1pbmcgYWNjdXJhY3kuICBTbyB0aGUgXGZ1bmN0aW9ue21pbigpfSBvZiB0aGUgcmVzdWx0IGlzCi1wcm9iYWJseSB0aGUgb25seSBudW1iZXIgeW91IHNob3VsZCBiZSBpbnRlcmVzdGVkIGluLiAgQWZ0ZXIgdGhhdCwgeW91Ci1zaG91bGQgbG9vayBhdCB0aGUgZW50aXJlIHZlY3RvciBhbmQgYXBwbHkgY29tbW9uIHNlbnNlIHJhdGhlciB0aGFuCi1zdGF0aXN0aWNzLgotXGVuZHtub3RpY2V9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXt0aW1laXR9e1xvcHRpb25hbHtudW1iZXJcY29kZXs9MTAwMDAwMH19fQotVGltZSBcdmFye251bWJlcn0gZXhlY3V0aW9ucyBvZiB0aGUgbWFpbiBzdGF0ZW1lbnQuCi1UaGlzIGV4ZWN1dGVzIHRoZSBzZXR1cCBzdGF0ZW1lbnQgb25jZSwgYW5kIHRoZW4KLXJldHVybnMgdGhlIHRpbWUgaXQgdGFrZXMgdG8gZXhlY3V0ZSB0aGUgbWFpbiBzdGF0ZW1lbnQgYSBudW1iZXIgb2YKLXRpbWVzLCBtZWFzdXJlZCBpbiBzZWNvbmRzIGFzIGEgZmxvYXQuICBUaGUgYXJndW1lbnQgaXMgdGhlIG51bWJlciBvZgotdGltZXMgdGhyb3VnaCB0aGUgbG9vcCwgZGVmYXVsdGluZyB0byBvbmUgbWlsbGlvbi4gIFRoZSBtYWluCi1zdGF0ZW1lbnQsIHRoZSBzZXR1cCBzdGF0ZW1lbnQgYW5kIHRoZSB0aW1lciBmdW5jdGlvbiB0byBiZSB1c2VkIGFyZQotcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4KLQotXGJlZ2lue25vdGljZX0KLUJ5IGRlZmF1bHQsIFxtZXRob2R7dGltZWl0KCl9IHRlbXBvcmFyaWx5IHR1cm5zIG9mZiBnYXJiYWdlIGNvbGxlY3Rpb24KLWR1cmluZyB0aGUgdGltaW5nLiAgVGhlIGFkdmFudGFnZSBvZiB0aGlzIGFwcHJvYWNoIGlzIHRoYXQgaXQgbWFrZXMKLWluZGVwZW5kZW50IHRpbWluZ3MgbW9yZSBjb21wYXJhYmxlLiAgVGhpcyBkaXNhZHZhbnRhZ2UgaXMgdGhhdCBHQwotbWF5IGJlIGFuIGltcG9ydGFudCBjb21wb25lbnQgb2YgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBmdW5jdGlvbiBiZWluZwotbWVhc3VyZWQuICBJZiBzbywgR0MgY2FuIGJlIHJlLWVuYWJsZWQgYXMgdGhlIGZpcnN0IHN0YXRlbWVudCBpbiB0aGUKLVx2YXJ7c2V0dXB9IHN0cmluZy4gIEZvciBleGFtcGxlOgotXGJlZ2lue3ZlcmJhdGltfQotICAgIHRpbWVpdC5UaW1lcignZm9yIGkgaW4gcmFuZ2UoMTApOiBvY3QoaSknLCAnZ2MuZW5hYmxlKCknKS50aW1laXQoKQotXGVuZHt2ZXJiYXRpbX0KLVxlbmR7bm90aWNlfQotXGVuZHttZXRob2RkZXNjfQotCi0KLVN0YXJ0aW5nIHdpdGggdmVyc2lvbiAyLjYsIHRoZSBtb2R1bGUgYWxzbyBkZWZpbmVzIHR3byBjb252ZW5pZW5jZSBmdW5jdGlvbnM6Ci0KLVxiZWdpbntmdW5jZGVzY317cmVwZWF0fXtzdG10XG9wdGlvbmFseywgc2V0dXBcb3B0aW9uYWx7LCB0aW1lclxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0XGNvZGV7PTN9IFxvcHRpb25hbHssIG51bWJlclxjb2Rlez0xMDAwMDAwfX19fX19Ci1DcmVhdGUgYSBcY2xhc3N7VGltZXJ9IGluc3RhbmNlIHdpdGggdGhlIGdpdmVuIHN0YXRlbWVudCwgc2V0dXAgY29kZSBhbmQgdGltZXIKLWZ1bmN0aW9uIGFuZCBydW4gaXRzIFxtZXRob2R7cmVwZWF0fSBtZXRob2Qgd2l0aCB0aGUgZ2l2ZW4gcmVwZWF0IGNvdW50IGFuZAotXHZhcntudW1iZXJ9IGV4ZWN1dGlvbnMuCi1cdmVyc2lvbmFkZGVkezIuNn0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dGltZWl0fXtzdG10XG9wdGlvbmFseywgc2V0dXBcb3B0aW9uYWx7LCB0aW1lclxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyXGNvZGV7PTEwMDAwMDB9fX19fQotQ3JlYXRlIGEgXGNsYXNze1RpbWVyfSBpbnN0YW5jZSB3aXRoIHRoZSBnaXZlbiBzdGF0ZW1lbnQsIHNldHVwIGNvZGUgYW5kIHRpbWVyCi1mdW5jdGlvbiBhbmQgcnVuIGl0cyBcbWV0aG9ke3RpbWVpdH0gbWV0aG9kIHdpdGggXHZhcntudW1iZXJ9IGV4ZWN1dGlvbnMuCi1cdmVyc2lvbmFkZGVkezIuNn0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotXHN1YnNlY3Rpb257Q29tbWFuZCBMaW5lIEludGVyZmFjZX0KLQotV2hlbiBjYWxsZWQgYXMgYSBwcm9ncmFtIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgdGhlIGZvbGxvd2luZyBmb3JtIGlzIHVzZWQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXB5dGhvbiAtbSB0aW1laXQgWy1uIE5dIFstciBOXSBbLXMgU10gWy10XSBbLWNdIFstaF0gW3N0YXRlbWVudCAuLi5dCi1cZW5ke3ZlcmJhdGltfQotCi13aGVyZSB0aGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIHVuZGVyc3Rvb2Q6Ci0KLVxiZWdpbntkZXNjcmlwdGlvbn0KLVxpdGVtWy1uIE4vXGxvbmdwcm9ncmFtb3B0e251bWJlcj1OfV0gaG93IG1hbnkgdGltZXMgdG8gZXhlY3V0ZSAnc3RhdGVtZW50JwotXGl0ZW1bLXIgTi9cbG9uZ3Byb2dyYW1vcHR7cmVwZWF0PU59XSBob3cgbWFueSB0aW1lcyB0byByZXBlYXQgdGhlIHRpbWVyIChkZWZhdWx0IDMpCi1caXRlbVstcyBTL1xsb25ncHJvZ3JhbW9wdHtzZXR1cD1TfV0gc3RhdGVtZW50IHRvIGJlIGV4ZWN1dGVkIG9uY2UgaW5pdGlhbGx5IChkZWZhdWx0Ci1cY29kZXsncGFzcyd9KQotXGl0ZW1bLXQvXGxvbmdwcm9ncmFtb3B0e3RpbWV9XSB1c2UgXGZ1bmN0aW9ue3RpbWUudGltZSgpfQotKGRlZmF1bHQgb24gYWxsIHBsYXRmb3JtcyBidXQgV2luZG93cykKLVxpdGVtWy1jL1xsb25ncHJvZ3JhbW9wdHtjbG9ja31dIHVzZSBcZnVuY3Rpb257dGltZS5jbG9jaygpfSAoZGVmYXVsdCBvbiBXaW5kb3dzKQotXGl0ZW1bLXYvXGxvbmdwcm9ncmFtb3B0e3ZlcmJvc2V9XSBwcmludCByYXcgdGltaW5nIHJlc3VsdHM7IHJlcGVhdCBmb3IgbW9yZSBkaWdpdHMKLXByZWNpc2lvbgotXGl0ZW1bLWgvXGxvbmdwcm9ncmFtb3B0e2hlbHB9XSBwcmludCBhIHNob3J0IHVzYWdlIG1lc3NhZ2UgYW5kIGV4aXQKLVxlbmR7ZGVzY3JpcHRpb259Ci0KLUEgbXVsdGktbGluZSBzdGF0ZW1lbnQgbWF5IGJlIGdpdmVuIGJ5IHNwZWNpZnlpbmcgZWFjaCBsaW5lIGFzIGEKLXNlcGFyYXRlIHN0YXRlbWVudCBhcmd1bWVudDsgaW5kZW50ZWQgbGluZXMgYXJlIHBvc3NpYmxlIGJ5IGVuY2xvc2luZwotYW4gYXJndW1lbnQgaW4gcXVvdGVzIGFuZCB1c2luZyBsZWFkaW5nIHNwYWNlcy4gIE11bHRpcGxlCi1ccHJvZ3JhbW9wdHstc30gb3B0aW9ucyBhcmUgdHJlYXRlZCBzaW1pbGFybHkuCi0KLUlmIFxwcm9ncmFtb3B0ey1ufSBpcyBub3QgZ2l2ZW4sIGEgc3VpdGFibGUgbnVtYmVyIG9mIGxvb3BzIGlzCi1jYWxjdWxhdGVkIGJ5IHRyeWluZyBzdWNjZXNzaXZlIHBvd2VycyBvZiAxMCB1bnRpbCB0aGUgdG90YWwgdGltZSBpcwotYXQgbGVhc3QgMC4yIHNlY29uZHMuCi0KLVRoZSBkZWZhdWx0IHRpbWVyIGZ1bmN0aW9uIGlzIHBsYXRmb3JtIGRlcGVuZGVudC4gIE9uIFdpbmRvd3MsCi1cZnVuY3Rpb257dGltZS5jbG9jaygpfSBoYXMgbWljcm9zZWNvbmQgZ3JhbnVsYXJpdHkgYnV0Ci1cZnVuY3Rpb257dGltZS50aW1lKCl9J3MgZ3JhbnVsYXJpdHkgaXMgMS82MHRoIG9mIGEgc2Vjb25kOyBvbiBcVU5JWCwKLVxmdW5jdGlvbnt0aW1lLmNsb2NrKCl9IGhhcyAxLzEwMHRoIG9mIGEgc2Vjb25kIGdyYW51bGFyaXR5IGFuZAotXGZ1bmN0aW9ue3RpbWUudGltZSgpfSBpcyBtdWNoIG1vcmUgcHJlY2lzZS4gIE9uIGVpdGhlciBwbGF0Zm9ybSwgdGhlCi1kZWZhdWx0IHRpbWVyIGZ1bmN0aW9ucyBtZWFzdXJlIHdhbGwgY2xvY2sgdGltZSwgbm90IHRoZSBDUFUgdGltZS4KLVRoaXMgbWVhbnMgdGhhdCBvdGhlciBwcm9jZXNzZXMgcnVubmluZyBvbiB0aGUgc2FtZSBjb21wdXRlciBtYXkKLWludGVyZmVyZSB3aXRoIHRoZSB0aW1pbmcuICBUaGUgYmVzdCB0aGluZyB0byBkbyB3aGVuIGFjY3VyYXRlIHRpbWluZwotaXMgbmVjZXNzYXJ5IGlzIHRvIHJlcGVhdCB0aGUgdGltaW5nIGEgZmV3IHRpbWVzIGFuZCB1c2UgdGhlIGJlc3QKLXRpbWUuICBUaGUgXHByb2dyYW1vcHR7LXJ9IG9wdGlvbiBpcyBnb29kIGZvciB0aGlzOyB0aGUgZGVmYXVsdCBvZiAzCi1yZXBldGl0aW9ucyBpcyBwcm9iYWJseSBlbm91Z2ggaW4gbW9zdCBjYXNlcy4gIE9uIFxVTklYLCB5b3UgY2FuIHVzZQotXGZ1bmN0aW9ue3RpbWUuY2xvY2soKX0gdG8gbWVhc3VyZSBDUFUgdGltZS4KLQotXGJlZ2lue25vdGljZX0KLSAgVGhlcmUgaXMgYSBjZXJ0YWluIGJhc2VsaW5lIG92ZXJoZWFkIGFzc29jaWF0ZWQgd2l0aCBleGVjdXRpbmcgYQotICBwYXNzIHN0YXRlbWVudC4gIFRoZSBjb2RlIGhlcmUgZG9lc24ndCB0cnkgdG8gaGlkZSBpdCwgYnV0IHlvdQotICBzaG91bGQgYmUgYXdhcmUgb2YgaXQuICBUaGUgYmFzZWxpbmUgb3ZlcmhlYWQgY2FuIGJlIG1lYXN1cmVkIGJ5Ci0gIGludm9raW5nIHRoZSBwcm9ncmFtIHdpdGhvdXQgYXJndW1lbnRzLgotXGVuZHtub3RpY2V9Ci0KLVRoZSBiYXNlbGluZSBvdmVyaGVhZCBkaWZmZXJzIGJldHdlZW4gUHl0aG9uIHZlcnNpb25zISAgQWxzbywgdG8KLWZhaXJseSBjb21wYXJlIG9sZGVyIFB5dGhvbiB2ZXJzaW9ucyB0byBQeXRob24gMi4zLCB5b3UgbWF5IHdhbnQgdG8KLXVzZSBQeXRob24ncyBccHJvZ3JhbW9wdHstT30gb3B0aW9uIGZvciB0aGUgb2xkZXIgdmVyc2lvbnMgdG8gYXZvaWQKLXRpbWluZyBcY29kZXtTRVRfTElORU5PfSBpbnN0cnVjdGlvbnMuCi0KLVxzdWJzZWN0aW9ue0V4YW1wbGVzfQotCi1IZXJlIGFyZSB0d28gZXhhbXBsZSBzZXNzaW9ucyAob25lIHVzaW5nIHRoZSBjb21tYW5kIGxpbmUsIG9uZSB1c2luZwotdGhlIG1vZHVsZSBpbnRlcmZhY2UpIHRoYXQgY29tcGFyZSB0aGUgY29zdCBvZiB1c2luZwotXGZ1bmN0aW9ue2hhc2F0dHIoKX0gdnMuIFxrZXl3b3Jke3RyeX0vXGtleXdvcmR7ZXhjZXB0fSB0byB0ZXN0IGZvcgotbWlzc2luZyBhbmQgcHJlc2VudCBvYmplY3QgYXR0cmlidXRlcy4KLQotXGJlZ2lue3ZlcmJhdGltfQotJSB0aW1laXQucHkgJ3RyeTonICcgIHN0ci5fX2Jvb2xfXycgJ2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjonICcgIHBhc3MnCi0xMDAwMDAgbG9vcHMsIGJlc3Qgb2YgMzogMTUuNyB1c2VjIHBlciBsb29wCi0lIHRpbWVpdC5weSAnaWYgaGFzYXR0cihzdHIsICJfX2Jvb2xfXyIpOiBwYXNzJwotMTAwMDAwIGxvb3BzLCBiZXN0IG9mIDM6IDQuMjYgdXNlYyBwZXIgbG9vcAotJSB0aW1laXQucHkgJ3RyeTonICcgIGludC5fX2Jvb2xfXycgJ2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjonICcgIHBhc3MnCi0xMDAwMDAwIGxvb3BzLCBiZXN0IG9mIDM6IDEuNDMgdXNlYyBwZXIgbG9vcAotJSB0aW1laXQucHkgJ2lmIGhhc2F0dHIoaW50LCAiX19ib29sX18iKTogcGFzcycKLTEwMDAwMCBsb29wcywgYmVzdCBvZiAzOiAyLjIzIHVzZWMgcGVyIGxvb3AKLVxlbmR7dmVyYmF0aW19Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgdGltZWl0Ci0+Pj4gcyA9ICIiIlwKLS4uLiB0cnk6Ci0uLi4gICAgIHN0ci5fX2Jvb2xfXwotLi4uIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLS4uLiAgICAgcGFzcwotLi4uICIiIgotPj4+IHQgPSB0aW1laXQuVGltZXIoc3RtdD1zKQotPj4+IHByaW50ICIlLjJmIHVzZWMvcGFzcyIgJSAoMTAwMDAwMCAqIHQudGltZWl0KG51bWJlcj0xMDAwMDApLzEwMDAwMCkKLTE3LjA5IHVzZWMvcGFzcwotPj4+IHMgPSAiIiJcCi0uLi4gaWYgaGFzYXR0cihzdHIsICdfX2Jvb2xfXycpOiBwYXNzCi0uLi4gIiIiCi0+Pj4gdCA9IHRpbWVpdC5UaW1lcihzdG10PXMpCi0+Pj4gcHJpbnQgIiUuMmYgdXNlYy9wYXNzIiAlICgxMDAwMDAwICogdC50aW1laXQobnVtYmVyPTEwMDAwMCkvMTAwMDAwKQotNC44NSB1c2VjL3Bhc3MKLT4+PiBzID0gIiIiXAotLi4uIHRyeToKLS4uLiAgICAgaW50Ll9fYm9vbF9fCi0uLi4gZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotLi4uICAgICBwYXNzCi0uLi4gIiIiCi0+Pj4gdCA9IHRpbWVpdC5UaW1lcihzdG10PXMpCi0+Pj4gcHJpbnQgIiUuMmYgdXNlYy9wYXNzIiAlICgxMDAwMDAwICogdC50aW1laXQobnVtYmVyPTEwMDAwMCkvMTAwMDAwKQotMS45NyB1c2VjL3Bhc3MKLT4+PiBzID0gIiIiXAotLi4uIGlmIGhhc2F0dHIoaW50LCAnX19ib29sX18nKTogcGFzcwotLi4uICIiIgotPj4+IHQgPSB0aW1laXQuVGltZXIoc3RtdD1zKQotPj4+IHByaW50ICIlLjJmIHVzZWMvcGFzcyIgJSAoMTAwMDAwMCAqIHQudGltZWl0KG51bWJlcj0xMDAwMDApLzEwMDAwMCkKLTMuMTUgdXNlYy9wYXNzCi1cZW5ke3ZlcmJhdGltfQotCi1UbyBnaXZlIHRoZSBcbW9kdWxle3RpbWVpdH0gbW9kdWxlIGFjY2VzcyB0byBmdW5jdGlvbnMgeW91Ci1kZWZpbmUsIHlvdSBjYW4gcGFzcyBhIFxjb2Rle3NldHVwfSBwYXJhbWV0ZXIgd2hpY2ggY29udGFpbnMgYW4gaW1wb3J0Ci1zdGF0ZW1lbnQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWRlZiB0ZXN0KCk6Ci0gICAgIlN0dXBpZCB0ZXN0IGZ1bmN0aW9uIgotICAgIEwgPSBbXQotICAgIGZvciBpIGluIHJhbmdlKDEwMCk6Ci0gICAgICAgIEwuYXBwZW5kKGkpCi0KLWlmIF9fbmFtZV9fPT0nX19tYWluX18nOgotICAgIGZyb20gdGltZWl0IGltcG9ydCBUaW1lcgotICAgIHQgPSBUaW1lcigidGVzdCgpIiwgImZyb20gX19tYWluX18gaW1wb3J0IHRlc3QiKQotICAgIHByaW50IHQudGltZWl0KCkKLVxlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnRva2VuLnRleCBiL0RvYy9saWIvbGlidG9rZW4udGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2Y0NzUwLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlidG9rZW4udGV4CisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXt0b2tlbn0gLS0tCi0gICAgICAgICBDb25zdGFudHMgdXNlZCB3aXRoIFB5dGhvbiBwYXJzZSB0cmVlc30KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e3Rva2VufQotXG1vZHVsZXN5bm9wc2lze0NvbnN0YW50cyByZXByZXNlbnRpbmcgdGVybWluYWwgbm9kZXMgb2YgdGhlIHBhcnNlIHRyZWUufQotXHNlY3Rpb25hdXRob3J7RnJlZCBMLiBEcmFrZSwgSnIufXtmZHJha2VAYWNtLm9yZ30KLQotCi1UaGlzIG1vZHVsZSBwcm92aWRlcyBjb25zdGFudHMgd2hpY2ggcmVwcmVzZW50IHRoZSBudW1lcmljIHZhbHVlcyBvZgotbGVhZiBub2RlcyBvZiB0aGUgcGFyc2UgdHJlZSAodGVybWluYWwgdG9rZW5zKS4gIFJlZmVyIHRvIHRoZSBmaWxlCi1cZmlsZXtHcmFtbWFyL0dyYW1tYXJ9IGluIHRoZSBQeXRob24gZGlzdHJpYnV0aW9uIGZvciB0aGUgZGVmaW5pdGlvbnMKLW9mIHRoZSBuYW1lcyBpbiB0aGUgY29udGV4dCBvZiB0aGUgbGFuZ3VhZ2UgZ3JhbW1hci4gIFRoZSBzcGVjaWZpYwotbnVtZXJpYyB2YWx1ZXMgd2hpY2ggdGhlIG5hbWVzIG1hcCB0byBtYXkgY2hhbmdlIGJldHdlZW4gUHl0aG9uCi12ZXJzaW9ucy4KLQotVGhpcyBtb2R1bGUgYWxzbyBwcm92aWRlcyBvbmUgZGF0YSBvYmplY3QgYW5kIHNvbWUgZnVuY3Rpb25zLiAgVGhlCi1mdW5jdGlvbnMgbWlycm9yIGRlZmluaXRpb25zIGluIHRoZSBQeXRob24gQyBoZWFkZXIgZmlsZXMuCi0KLQotCi1cYmVnaW57ZGF0YWRlc2N9e3Rva19uYW1lfQotRGljdGlvbmFyeSBtYXBwaW5nIHRoZSBudW1lcmljIHZhbHVlcyBvZiB0aGUgY29uc3RhbnRzIGRlZmluZWQgaW4gdGhpcwotbW9kdWxlIGJhY2sgdG8gbmFtZSBzdHJpbmdzLCBhbGxvd2luZyBtb3JlIGh1bWFuLXJlYWRhYmxlCi1yZXByZXNlbnRhdGlvbiBvZiBwYXJzZSB0cmVlcyB0byBiZSBnZW5lcmF0ZWQuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e0lTVEVSTUlOQUx9e3h9Ci1SZXR1cm4gdHJ1ZSBmb3IgdGVybWluYWwgdG9rZW4gdmFsdWVzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtJU05PTlRFUk1JTkFMfXt4fQotUmV0dXJuIHRydWUgZm9yIG5vbi10ZXJtaW5hbCB0b2tlbiB2YWx1ZXMuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e0lTRU9GfXt4fQotUmV0dXJuIHRydWUgaWYgXHZhcnt4fSBpcyB0aGUgbWFya2VyIGluZGljYXRpbmcgdGhlIGVuZCBvZiBpbnB1dC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWVtb2R1bGV7cGFyc2VyfXtUaGUgc2Vjb25kIGV4YW1wbGUgZm9yIHRoZSBccmVmbW9kdWxle3BhcnNlcn0KLSAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSBzaG93cyBob3cgdG8gdXNlIHRoZSBcbW9kdWxle3N5bWJvbH0KLSAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS59Ci1cZW5ke3NlZWFsc299CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnRva2VuaXplLnRleCBiL0RvYy9saWIvbGlidG9rZW5pemUudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzlhZDNlLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlidG9rZW5pemUudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7dG9rZW5pemV9IC0tLQotICAgICAgICAgVG9rZW5pemVyIGZvciBQeXRob24gc291cmNlfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17dG9rZW5pemV9Ci1cbW9kdWxlc3lub3BzaXN7TGV4aWNhbCBzY2FubmVyIGZvciBQeXRob24gc291cmNlIGNvZGUufQotXG1vZHVsZWF1dGhvcntLYSBQaW5nIFllZX17fQotXHNlY3Rpb25hdXRob3J7RnJlZCBMLiBEcmFrZSwgSnIufXtmZHJha2VAYWNtLm9yZ30KLQotCi1UaGUgXG1vZHVsZXt0b2tlbml6ZX0gbW9kdWxlIHByb3ZpZGVzIGEgbGV4aWNhbCBzY2FubmVyIGZvciBQeXRob24KLXNvdXJjZSBjb2RlLCBpbXBsZW1lbnRlZCBpbiBQeXRob24uICBUaGUgc2Nhbm5lciBpbiB0aGlzIG1vZHVsZQotcmV0dXJucyBjb21tZW50cyBhcyB0b2tlbnMgYXMgd2VsbCwgbWFraW5nIGl0IHVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nCi1gYHByZXR0eS1wcmludGVycywnJyBpbmNsdWRpbmcgY29sb3JpemVycyBmb3Igb24tc2NyZWVuIGRpc3BsYXlzLgotCi1UaGUgcHJpbWFyeSBlbnRyeSBwb2ludCBpcyBhIGdlbmVyYXRvcjoKLQotXGJlZ2lue2Z1bmNkZXNjfXtnZW5lcmF0ZV90b2tlbnN9e3JlYWRsaW5lfQotICBUaGUgXGZ1bmN0aW9ue2dlbmVyYXRlX3Rva2VucygpfSBnZW5lcmF0b3IgcmVxdWlyZXMgb25lIGFyZ21lbnQsCi0gIFx2YXJ7cmVhZGxpbmV9LCB3aGljaCBtdXN0IGJlIGEgY2FsbGFibGUgb2JqZWN0IHdoaWNoCi0gIHByb3ZpZGVzIHRoZSBzYW1lIGludGVyZmFjZSBhcyB0aGUgXG1ldGhvZHtyZWFkbGluZSgpfSBtZXRob2Qgb2YKLSAgYnVpbHQtaW4gZmlsZSBvYmplY3RzIChzZWUgc2VjdGlvbn5ccmVme2JsdGluLWZpbGUtb2JqZWN0c30pLiAgRWFjaAotICBjYWxsIHRvIHRoZSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIG9uZSBsaW5lIG9mIGlucHV0IGFzIGEgc3RyaW5nLgotCi0gIFRoZSBnZW5lcmF0b3IgcHJvZHVjZXMgNS10dXBsZXMgd2l0aCB0aGVzZSBtZW1iZXJzOgotICB0aGUgdG9rZW4gdHlwZTsKLSAgdGhlIHRva2VuIHN0cmluZzsKLSAgYSAyLXR1cGxlIFxjb2RleyhcdmFye3Nyb3d9LCBcdmFye3Njb2x9KX0gb2YgaW50cyBzcGVjaWZ5aW5nIHRoZQotICByb3cgYW5kIGNvbHVtbiB3aGVyZSB0aGUgdG9rZW4gYmVnaW5zIGluIHRoZSBzb3VyY2U7Ci0gIGEgMi10dXBsZSBcY29kZXsoXHZhcntlcm93fSwgXHZhcntlY29sfSl9IG9mIGludHMgc3BlY2lmeWluZyB0aGUKLSAgcm93IGFuZCBjb2x1bW4gd2hlcmUgdGhlIHRva2VuIGVuZHMgaW4gdGhlIHNvdXJjZTsKLSAgYW5kIHRoZSBsaW5lIG9uIHdoaWNoIHRoZSB0b2tlbiB3YXMgZm91bmQuCi0gIFRoZSBsaW5lIHBhc3NlZCBpcyB0aGUgXGVtcGh7bG9naWNhbH0gbGluZTsKLSAgY29udGludWF0aW9uIGxpbmVzIGFyZSBpbmNsdWRlZC4KLSAgXHZlcnNpb25hZGRlZHsyLjJ9Ci1cZW5ke2Z1bmNkZXNjfQotCi1BbiBvbGRlciBlbnRyeSBwb2ludCBpcyByZXRhaW5lZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eToKLQotXGJlZ2lue2Z1bmNkZXNjfXt0b2tlbml6ZX17cmVhZGxpbmVcb3B0aW9uYWx7LCB0b2tlbmVhdGVyfX0KLSAgVGhlIFxmdW5jdGlvbnt0b2tlbml6ZSgpfSBmdW5jdGlvbiBhY2NlcHRzIHR3byBwYXJhbWV0ZXJzOiBvbmUKLSAgcmVwcmVzZW50aW5nIHRoZSBpbnB1dCBzdHJlYW0sIGFuZCBvbmUgcHJvdmlkaW5nIGFuIG91dHB1dCBtZWNoYW5pc20KLSAgZm9yIFxmdW5jdGlvbnt0b2tlbml6ZSgpfS4KLQotICBUaGUgZmlyc3QgcGFyYW1ldGVyLCBcdmFye3JlYWRsaW5lfSwgbXVzdCBiZSBhIGNhbGxhYmxlIG9iamVjdCB3aGljaAotICBwcm92aWRlcyB0aGUgc2FtZSBpbnRlcmZhY2UgYXMgdGhlIFxtZXRob2R7cmVhZGxpbmUoKX0gbWV0aG9kIG9mCi0gIGJ1aWx0LWluIGZpbGUgb2JqZWN0cyAoc2VlIHNlY3Rpb25+XHJlZntibHRpbi1maWxlLW9iamVjdHN9KS4gIEVhY2gKLSAgY2FsbCB0byB0aGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBvbmUgbGluZSBvZiBpbnB1dCBhcyBhIHN0cmluZy4KLSAgQWx0ZXJuYXRlbHksIFx2YXJ7cmVhZGxpbmV9IG1heSBiZSBhIGNhbGxhYmxlIG9iamVjdCB0aGF0IHNpZ25hbHMKLSAgY29tcGxldGlvbiBieSByYWlzaW5nIFxleGNlcHRpb257U3RvcEl0ZXJhdGlvbn0uCi0gIFx2ZXJzaW9uY2hhbmdlZFtBZGRlZCBcZXhjZXB0aW9ue1N0b3BJdGVyYXRpb259IHN1cHBvcnRdezIuNX0KLQotICBUaGUgc2Vjb25kIHBhcmFtZXRlciwgXHZhcnt0b2tlbmVhdGVyfSwgbXVzdCBhbHNvIGJlIGEgY2FsbGFibGUKLSAgb2JqZWN0LiAgSXQgaXMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggdG9rZW4sIHdpdGggZml2ZSBhcmd1bWVudHMsCi0gIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHR1cGxlcyBnZW5lcmF0ZWQgYnkgXGZ1bmN0aW9ue2dlbmVyYXRlX3Rva2VucygpfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotQWxsIGNvbnN0YW50cyBmcm9tIHRoZSBccmVmbW9kdWxle3Rva2VufSBtb2R1bGUgYXJlIGFsc28gZXhwb3J0ZWQgZnJvbQotXG1vZHVsZXt0b2tlbml6ZX0sIGFzIGFyZSB0d28gYWRkaXRpb25hbCB0b2tlbiB0eXBlIHZhbHVlcyB0aGF0IG1pZ2h0IGJlCi1wYXNzZWQgdG8gdGhlIFx2YXJ7dG9rZW5lYXRlcn0gZnVuY3Rpb24gYnkgXGZ1bmN0aW9ue3Rva2VuaXplKCl9OgotCi1cYmVnaW57ZGF0YWRlc2N9e0NPTU1FTlR9Ci0gIFRva2VuIHZhbHVlIHVzZWQgdG8gaW5kaWNhdGUgYSBjb21tZW50LgotXGVuZHtkYXRhZGVzY30KLVxiZWdpbntkYXRhZGVzY317Tkx9Ci0gIFRva2VuIHZhbHVlIHVzZWQgdG8gaW5kaWNhdGUgYSBub24tdGVybWluYXRpbmcgbmV3bGluZS4gIFRoZSBORVdMSU5FCi0gIHRva2VuIGluZGljYXRlcyB0aGUgZW5kIG9mIGEgbG9naWNhbCBsaW5lIG9mIFB5dGhvbiBjb2RlOyBOTCB0b2tlbnMKLSAgYXJlIGdlbmVyYXRlZCB3aGVuIGEgbG9naWNhbCBsaW5lIG9mIGNvZGUgaXMgY29udGludWVkIG92ZXIgbXVsdGlwbGUKLSAgcGh5c2ljYWwgbGluZXMuCi1cZW5ke2RhdGFkZXNjfQotCi1Bbm90aGVyIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHRvIHJldmVyc2UgdGhlIHRva2VuaXphdGlvbiBwcm9jZXNzLgotVGhpcyBpcyB1c2VmdWwgZm9yIGNyZWF0aW5nIHRvb2xzIHRoYXQgdG9rZW5pemUgYSBzY3JpcHQsIG1vZGlmeQotdGhlIHRva2VuIHN0cmVhbSwgYW5kIHdyaXRlIGJhY2sgdGhlIG1vZGlmaWVkIHNjcmlwdC4KLQotXGJlZ2lue2Z1bmNkZXNjfXt1bnRva2VuaXplfXtpdGVyYWJsZX0KLSAgQ29udmVydHMgdG9rZW5zIGJhY2sgaW50byBQeXRob24gc291cmNlIGNvZGUuICBUaGUgXHZhcntpdGVyYWJsZX0KLSAgbXVzdCByZXR1cm4gc2VxdWVuY2VzIHdpdGggYXQgbGVhc3QgdHdvIGVsZW1lbnRzLCB0aGUgdG9rZW4gdHlwZSBhbmQKLSAgdGhlIHRva2VuIHN0cmluZy4gIEFueSBhZGRpdGlvbmFsIHNlcXVlbmNlIGVsZW1lbnRzIGFyZSBpZ25vcmVkLgotCi0gIFRoZSByZWNvbnN0cnVjdGVkIHNjcmlwdCBpcyByZXR1cm5lZCBhcyBhIHNpbmdsZSBzdHJpbmcuICBUaGUKLSAgcmVzdWx0IGlzIGd1YXJhbnRlZWQgdG8gdG9rZW5pemUgYmFjayB0byBtYXRjaCB0aGUgaW5wdXQgc28gdGhhdAotICB0aGUgY29udmVyc2lvbiBpcyBsb3NzbGVzcyBhbmQgcm91bmQtdHJpcHMgYXJlIGFzc3VyZWQuICBUaGUKLSAgZ3VhcmFudGVlIGFwcGxpZXMgb25seSB0byB0aGUgdG9rZW4gdHlwZSBhbmQgdG9rZW4gc3RyaW5nIGFzCi0gIHRoZSBzcGFjaW5nIGJldHdlZW4gdG9rZW5zIChjb2x1bW4gcG9zaXRpb25zKSBtYXkgY2hhbmdlLgotICBcdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLUV4YW1wbGUgb2YgYSBzY3JpcHQgcmUtd3JpdGVyIHRoYXQgdHJhbnNmb3JtcyBmbG9hdCBsaXRlcmFscyBpbnRvCi1EZWNpbWFsIG9iamVjdHM6Ci1cYmVnaW57dmVyYmF0aW19Ci1kZWYgZGVjaXN0bXQocyk6Ci0gICAgIiIiU3Vic3RpdHV0ZSBEZWNpbWFscyBmb3IgZmxvYXRzIGluIGEgc3RyaW5nIG9mIHN0YXRlbWVudHMuCi0KLSAgICA+Pj4gZnJvbSBkZWNpbWFsIGltcG9ydCBEZWNpbWFsCi0gICAgPj4+IHMgPSAncHJpbnQgKzIxLjNlLTUqLS4xMjM0LzgxLjcnCi0gICAgPj4+IGRlY2lzdG10KHMpCi0gICAgInByaW50ICtEZWNpbWFsICgnMjEuM2UtNScpKi1EZWNpbWFsICgnLjEyMzQnKS9EZWNpbWFsICgnODEuNycpIgotCi0gICAgPj4+IGV4ZWMocykKLSAgICAtMy4yMTcxNjAzNDI3MmUtMDA3Ci0gICAgPj4+IGV4ZWMoZGVjaXN0bXQocykpCi0gICAgLTMuMjE3MTYwMzQyNzE3MjU4MjYxOTMzOTA0NTI5RS03Ci0KLSAgICAiIiIKLSAgICByZXN1bHQgPSBbXQotICAgIGcgPSBnZW5lcmF0ZV90b2tlbnMoU3RyaW5nSU8ocykucmVhZGxpbmUpICAgIyB0b2tlbml6ZSB0aGUgc3RyaW5nCi0gICAgZm9yIHRva251bSwgdG9rdmFsLCBfLCBfLCBfICBpbiBnOgotICAgICAgICBpZiB0b2tudW0gPT0gTlVNQkVSIGFuZCAnLicgaW4gdG9rdmFsOiAgIyByZXBsYWNlIE5VTUJFUiB0b2tlbnMKLSAgICAgICAgICAgIHJlc3VsdC5leHRlbmQoWwotICAgICAgICAgICAgICAgIChOQU1FLCAnRGVjaW1hbCcpLAotICAgICAgICAgICAgICAgIChPUCwgJygnKSwKLSAgICAgICAgICAgICAgICAoU1RSSU5HLCByZXByKHRva3ZhbCkpLAotICAgICAgICAgICAgICAgIChPUCwgJyknKQotICAgICAgICAgICAgXSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoKHRva251bSwgdG9rdmFsKSkKLSAgICByZXR1cm4gdW50b2tlbml6ZShyZXN1bHQpCi1cZW5ke3ZlcmJhdGltfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ0cmFjZS50ZXggYi9Eb2MvbGliL2xpYnRyYWNlLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ2NWFhYy4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnRyYWNlLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3RyYWNlfSAtLS0KLSAgICAgICAgIFRyYWNlIG9yIHRyYWNrIFB5dGhvbiBzdGF0ZW1lbnQgZXhlY3V0aW9ufQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17dHJhY2V9Ci1cbW9kdWxlc3lub3BzaXN7VHJhY2Ugb3IgdHJhY2sgUHl0aG9uIHN0YXRlbWVudCBleGVjdXRpb24ufQotCi1UaGUgXG1vZHVsZXt0cmFjZX0gbW9kdWxlIGFsbG93cyB5b3UgdG8gdHJhY2UgcHJvZ3JhbSBleGVjdXRpb24sIGdlbmVyYXRlCi1hbm5vdGF0ZWQgc3RhdGVtZW50IGNvdmVyYWdlIGxpc3RpbmdzLCBwcmludCBjYWxsZXIvY2FsbGVlIHJlbGF0aW9uc2hpcHMgYW5kCi1saXN0IGZ1bmN0aW9ucyBleGVjdXRlZCBkdXJpbmcgYSBwcm9ncmFtIHJ1bi4gIEl0IGNhbiBiZSB1c2VkIGluIGFub3RoZXIKLXByb2dyYW0gb3IgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgotCi1cc3Vic2VjdGlvbntDb21tYW5kIExpbmUgVXNhZ2VcbGFiZWx7dHJhY2UtY2xpfX0KLQotVGhlIFxtb2R1bGV7dHJhY2V9IG1vZHVsZSBjYW4gYmUgaW52b2tlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUuICBJdCBjYW4gYmUKLWFzIHNpbXBsZSBhcwotCi1cYmVnaW57dmVyYmF0aW19Ci1weXRob24gLW0gdHJhY2UgLS1jb3VudCBzb21lZmlsZS5weSAuLi4KLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBhYm92ZSB3aWxsIGdlbmVyYXRlIGFubm90YXRlZCBsaXN0aW5ncyBvZiBhbGwgUHl0aG9uIG1vZHVsZXMgaW1wb3J0ZWQKLWR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIFxmaWxle3NvbWVmaWxlLnB5fS4KLQotVGhlIGZvbGxvd2luZyBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGFyZSBzdXBwb3J0ZWQ6Ci0KLVxiZWdpbntkZXNjcmlwdGlvbn0KLVxpdGVtW1xsb25ncHJvZ3JhbW9wdHt0cmFjZX0sIFxwcm9ncmFtb3B0ey10fV0KLURpc3BsYXkgbGluZXMgYXMgdGhleSBhcmUgZXhlY3V0ZWQuCi0KLVxpdGVtW1xsb25ncHJvZ3JhbW9wdHtjb3VudH0sIFxwcm9ncmFtb3B0ey1jfV0KLVByb2R1Y2UgYSBzZXQgb2YgIGFubm90YXRlZCBsaXN0aW5nIGZpbGVzIHVwb24gcHJvZ3JhbQotY29tcGxldGlvbiB0aGF0IHNob3dzIGhvdyBtYW55IHRpbWVzIGVhY2ggc3RhdGVtZW50IHdhcyBleGVjdXRlZC4KLQotXGl0ZW1bXGxvbmdwcm9ncmFtb3B0e3JlcG9ydH0sIFxwcm9ncmFtb3B0ey1yfV0KLVByb2R1Y2UgYW4gYW5ub3RhdGVkIGxpc3QgZnJvbSBhbiBlYXJsaWVyIHByb2dyYW0gcnVuIHRoYXQKLXVzZWQgdGhlIFxsb25ncHJvZ3JhbW9wdHtjb3VudH0gYW5kIFxsb25ncHJvZ3JhbW9wdHtmaWxlfSBhcmd1bWVudHMuCi0KLVxpdGVtW1xsb25ncHJvZ3JhbW9wdHtuby1yZXBvcnR9LCBccHJvZ3JhbW9wdHstUn1dCi1EbyBub3QgZ2VuZXJhdGUgYW5ub3RhdGVkIGxpc3RpbmdzLiAgVGhpcyBpcyB1c2VmdWwgaWYgeW91IGludGVuZCB0byBtYWtlCi1zZXZlcmFsIHJ1bnMgd2l0aCBcbG9uZ3Byb2dyYW1vcHR7Y291bnR9IHRoZW4gcHJvZHVjZSBhIHNpbmdsZSBzZXQKLW9mIGFubm90YXRlZCBsaXN0aW5ncyBhdCB0aGUgZW5kLgotCi1caXRlbVtcbG9uZ3Byb2dyYW1vcHR7bGlzdGZ1bmNzfSwgXHByb2dyYW1vcHR7LWx9XQotTGlzdCB0aGUgZnVuY3Rpb25zIGV4ZWN1dGVkIGJ5IHJ1bm5pbmcgdGhlIHByb2dyYW0uCi0KLVxpdGVtW1xsb25ncHJvZ3JhbW9wdHt0cmFja2NhbGxzfSwgXHByb2dyYW1vcHR7LVR9XQotR2VuZXJhdGUgY2FsbGluZyByZWxhdGlvbnNoaXBzIGV4cG9zZWQgYnkgcnVubmluZyB0aGUgcHJvZ3JhbS4KLQotXGl0ZW1bXGxvbmdwcm9ncmFtb3B0e2ZpbGV9LCBccHJvZ3JhbW9wdHstZn1dCi1OYW1lIGEgZmlsZSBjb250YWluaW5nIChvciB0byBjb250YWluKSBjb3VudHMuCi0KLVxpdGVtW1xsb25ncHJvZ3JhbW9wdHtjb3ZlcmRpcn0sIFxwcm9ncmFtb3B0ey1DfV0KLU5hbWUgYSBkaXJlY3RvcnkgaW4gd2hpY2ggdG8gc2F2ZSBhbm5vdGF0ZWQgbGlzdGluZyBmaWxlcy4KLQotXGl0ZW1bXGxvbmdwcm9ncmFtb3B0e21pc3Npbmd9LCBccHJvZ3JhbW9wdHstbX1dCi1XaGVuIGdlbmVyYXRpbmcgYW5ub3RhdGVkIGxpc3RpbmdzLCBtYXJrIGxpbmVzIHdoaWNoCi13ZXJlIG5vdCBleGVjdXRlZCB3aXRoIGBcY29kZXs+Pj4+Pj59Jy4KLQotXGl0ZW1bXGxvbmdwcm9ncmFtb3B0e3N1bW1hcnl9LCBccHJvZ3JhbW9wdHstc31dCi1XaGVuIHVzaW5nIFxsb25ncHJvZ3JhbW9wdHtjb3VudH0gb3IgXGxvbmdwcm9ncmFtb3B0e3JlcG9ydH0sIHdyaXRlIGEKLWJyaWVmIHN1bW1hcnkgdG8gc3Rkb3V0IGZvciBlYWNoIGZpbGUgcHJvY2Vzc2VkLgotCi1caXRlbVtcbG9uZ3Byb2dyYW1vcHR7aWdub3JlLW1vZHVsZX1dCi1JZ25vcmUgdGhlIG5hbWVkIG1vZHVsZSBhbmQgaXRzIHN1Ym1vZHVsZXMgKGlmIGl0IGlzCi1hIHBhY2thZ2UpLiAgTWF5IGJlIGdpdmVuIG11bHRpcGxlIHRpbWVzLgotCi1caXRlbVtcbG9uZ3Byb2dyYW1vcHR7aWdub3JlLWRpcn1dCi1JZ25vcmUgYWxsIG1vZHVsZXMgYW5kIHBhY2thZ2VzIGluIHRoZSBuYW1lZCBkaXJlY3RvcnkKLWFuZCBzdWJkaXJlY3Rvcmllcy4gIE1heSBiZSBnaXZlbiBtdWx0aXBsZSB0aW1lcy4KLVxlbmR7ZGVzY3JpcHRpb259Ci0KLVxzdWJzZWN0aW9ue1Byb2dyYW1taW5nIEludGVyZmFjZVxsYWJlbHt0cmFjZS1hcGl9fQotCi1cYmVnaW57Y2xhc3NkZXNjfXtUcmFjZX17XG9wdGlvbmFse2NvdW50PTFcb3B0aW9uYWx7LCB0cmFjZT0xXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGZ1bmNzPTBcb3B0aW9uYWx7LCBjb3VudGNhbGxlcnM9MFxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlbW9kcz0oKVxvcHRpb25hbHssIGlnbm9yZWRpcnM9KClcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgIGluZmlsZT1Ob25lXG9wdGlvbmFseywgb3V0ZmlsZT1Ob25lfX19fX19fX19Ci1DcmVhdGUgYW4gb2JqZWN0IHRvIHRyYWNlIGV4ZWN1dGlvbiBvZiBhIHNpbmdsZSBzdGF0ZW1lbnQgb3IgZXhwcmVzc2lvbi4KLUFsbCBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbC4gIFx2YXJ7Y291bnR9IGVuYWJsZXMgY291bnRpbmcgb2YgbGluZSBudW1iZXJzLgotXHZhcnt0cmFjZX0gZW5hYmxlcyBsaW5lIGV4ZWN1dGlvbiB0cmFjaW5nLiAgXHZhcntjb3VudGZ1bmNzfSBlbmFibGVzCi1saXN0aW5nIG9mIHRoZSBmdW5jdGlvbnMgY2FsbGVkIGR1cmluZyB0aGUgcnVuLiAgXHZhcntjb3VudGNhbGxlcnN9IGVuYWJsZXMKLWNhbGwgcmVsYXRpb25zaGlwIHRyYWNraW5nLiAgXHZhcntpZ25vcmVtb2RzfSBpcyBhIGxpc3Qgb2YgbW9kdWxlcyBvcgotcGFja2FnZXMgdG8gaWdub3JlLiAgXHZhcntpZ25vcmVkaXJzfSBpcyBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMgd2hvc2UgbW9kdWxlcwotb3IgcGFja2FnZXMgc2hvdWxkIGJlIGlnbm9yZWQuICBcdmFye2luZmlsZX0gaXMgdGhlIGZpbGUgZnJvbSB3aGljaCB0byByZWFkCi1zdG9yZWQgY291bnQgaW5mb3JtYXRpb24uICBcdmFye291dGZpbGV9IGlzIGEgZmlsZSBpbiB3aGljaCB0byB3cml0ZSB1cGRhdGVkCi1jb3VudCBpbmZvcm1hdGlvbi4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bVHJhY2Vde3J1bn17Y21kfQotUnVuIFx2YXJ7Y21kfSB1bmRlciBjb250cm9sIG9mIHRoZSBUcmFjZSBvYmplY3Qgd2l0aCB0aGUgY3VycmVudCB0cmFjaW5nCi1wYXJhbWV0ZXJzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bVHJhY2Vde3J1bmN0eH17Y21kXG9wdGlvbmFseywgZ2xvYmFscz1Ob25lXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbHM9Tm9uZX19fQotUnVuIFx2YXJ7Y21kfSB1bmRlciBjb250cm9sIG9mIHRoZSBUcmFjZSBvYmplY3Qgd2l0aCB0aGUgY3VycmVudCB0cmFjaW5nCi1wYXJhbWV0ZXJzIGluIHRoZSBkZWZpbmVkIGdsb2JhbCBhbmQgbG9jYWwgZW52aXJvbm1lbnRzLiAgSWYgbm90IGRlZmluZWQsCi1cdmFye2dsb2JhbHN9IGFuZCBcdmFye2xvY2Fsc30gZGVmYXVsdCB0byBlbXB0eSBkaWN0aW9uYXJpZXMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtUcmFjZV17cnVuZnVuY317ZnVuYywgKmFyZ3MsICoqa3dkc30KLUNhbGwgXHZhcntmdW5jfSB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMgdW5kZXIgY29udHJvbCBvZiB0aGUKLVxjbGFzc3tUcmFjZX0gb2JqZWN0IHdpdGggdGhlIGN1cnJlbnQgdHJhY2luZyBwYXJhbWV0ZXJzLgotXGVuZHttZXRob2RkZXNjfQotCi1UaGlzIGlzIGEgc2ltcGxlIGV4YW1wbGUgc2hvd2luZyB0aGUgdXNlIG9mIHRoaXMgbW9kdWxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgc3lzCi1pbXBvcnQgdHJhY2UKLQotIyBjcmVhdGUgYSBUcmFjZSBvYmplY3QsIHRlbGxpbmcgaXQgd2hhdCB0byBpZ25vcmUsIGFuZCB3aGV0aGVyIHRvCi0jIGRvIHRyYWNpbmcgb3IgbGluZS1jb3VudGluZyBvciBib3RoLgotdHJhY2VyID0gdHJhY2UuVHJhY2UoCi0gICAgaWdub3JlZGlycz1bc3lzLnByZWZpeCwgc3lzLmV4ZWNfcHJlZml4XSwKLSAgICB0cmFjZT0wLAotICAgIGNvdW50PTEpCi0KLSMgcnVuIHRoZSBuZXcgY29tbWFuZCB1c2luZyB0aGUgZ2l2ZW4gdHJhY2VyCi10cmFjZXIucnVuKCdtYWluKCknKQotCi0jIG1ha2UgYSByZXBvcnQsIHBsYWNpbmcgb3V0cHV0IGluIC90bXAKLXIgPSB0cmFjZXIucmVzdWx0cygpCi1yLndyaXRlX3Jlc3VsdHMoc2hvd19taXNzaW5nPVRydWUsIGNvdmVyZGlyPSIvdG1wIikKLVxlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnRyYWNlYmFjay50ZXggYi9Eb2MvbGliL2xpYnRyYWNlYmFjay50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4N2IxZWYuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJ0cmFjZWJhY2sudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7dHJhY2ViYWNrfSAtLS0KLSAgICAgICAgIFByaW50IG9yIHJldHJpZXZlIGEgc3RhY2sgdHJhY2ViYWNrfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17dHJhY2ViYWNrfQotXG1vZHVsZXN5bm9wc2lze1ByaW50IG9yIHJldHJpZXZlIGEgc3RhY2sgdHJhY2ViYWNrLn0KLQotCi1UaGlzIG1vZHVsZSBwcm92aWRlcyBhIHN0YW5kYXJkIGludGVyZmFjZSB0byBleHRyYWN0LCBmb3JtYXQgYW5kIHByaW50Ci1zdGFjayB0cmFjZXMgb2YgUHl0aG9uIHByb2dyYW1zLiAgSXQgZXhhY3RseSBtaW1pY3MgdGhlIGJlaGF2aW9yIG9mCi10aGUgUHl0aG9uIGludGVycHJldGVyIHdoZW4gaXQgcHJpbnRzIGEgc3RhY2sgdHJhY2UuICBUaGlzIGlzIHVzZWZ1bAotd2hlbiB5b3Ugd2FudCB0byBwcmludCBzdGFjayB0cmFjZXMgdW5kZXIgcHJvZ3JhbSBjb250cm9sLCBzdWNoIGFzIGluIGEKLWBgd3JhcHBlcicnIGFyb3VuZCB0aGUgaW50ZXJwcmV0ZXIuCi0KLVRoZSBtb2R1bGUgdXNlcyB0cmFjZWJhY2sgb2JqZWN0cyAtLS0gdGhpcyBpcyB0aGUgb2JqZWN0IHR5cGUgdGhhdCBpcwotc3RvcmVkIGluIHRoZSBcY29kZXtzeXMubGFzdF90cmFjZWJhY2t9IHZhcmlhYmxlIGFuZCByZXR1cm5lZAotYXMgdGhlIHRoaXJkIGl0ZW0gZnJvbSBcZnVuY3Rpb257c3lzLmV4Y19pbmZvKCl9LgotXG9iaW5kZXh7dHJhY2ViYWNrfQotCi1UaGUgbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6Ci0KLVxiZWdpbntmdW5jZGVzY317cHJpbnRfdGJ9e3RyYWNlYmFja1xvcHRpb25hbHssIGxpbWl0XG9wdGlvbmFseywgZmlsZX19fQotUHJpbnQgdXAgdG8gXHZhcntsaW1pdH0gc3RhY2sgdHJhY2UgZW50cmllcyBmcm9tIFx2YXJ7dHJhY2ViYWNrfS4gIElmCi1cdmFye2xpbWl0fSBpcyBvbWl0dGVkIG9yIFxjb2Rle05vbmV9LCBhbGwgZW50cmllcyBhcmUgcHJpbnRlZC4KLUlmIFx2YXJ7ZmlsZX0gaXMgb21pdHRlZCBvciBcY29kZXtOb25lfSwgdGhlIG91dHB1dCBnb2VzIHRvCi1cY29kZXtzeXMuc3RkZXJyfTsgb3RoZXJ3aXNlIGl0IHNob3VsZCBiZSBhbiBvcGVuIGZpbGUgb3IgZmlsZS1saWtlCi1vYmplY3QgdG8gcmVjZWl2ZSB0aGUgb3V0cHV0LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtwcmludF9leGNlcHRpb259e3R5cGUsIHZhbHVlLCB0cmFjZWJhY2tcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0XG9wdGlvbmFseywgZmlsZX19fQotUHJpbnQgZXhjZXB0aW9uIGluZm9ybWF0aW9uIGFuZCB1cCB0byBcdmFye2xpbWl0fSBzdGFjayB0cmFjZSBlbnRyaWVzCi1mcm9tIFx2YXJ7dHJhY2ViYWNrfSB0byBcdmFye2ZpbGV9LgotVGhpcyBkaWZmZXJzIGZyb20gXGZ1bmN0aW9ue3ByaW50X3RiKCl9IGluIHRoZQotZm9sbG93aW5nIHdheXM6ICgxKSBpZiBcdmFye3RyYWNlYmFja30gaXMgbm90IFxjb2Rle05vbmV9LCBpdCBwcmludHMgYQotaGVhZGVyIFxzYW1we1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTp9OyAoMikgaXQgcHJpbnRzIHRoZQotZXhjZXB0aW9uIFx2YXJ7dHlwZX0gYW5kIFx2YXJ7dmFsdWV9IGFmdGVyIHRoZSBzdGFjayB0cmFjZTsgKDMpIGlmCi1cdmFye3R5cGV9IGlzIFxleGNlcHRpb257U3ludGF4RXJyb3J9IGFuZCBcdmFye3ZhbHVlfSBoYXMgdGhlCi1hcHByb3ByaWF0ZSBmb3JtYXQsIGl0IHByaW50cyB0aGUgbGluZSB3aGVyZSB0aGUgc3ludGF4IGVycm9yIG9jY3VycmVkCi13aXRoIGEgY2FyZXQgaW5kaWNhdGluZyB0aGUgYXBwcm94aW1hdGUgcG9zaXRpb24gb2YgdGhlIGVycm9yLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtwcmludF9leGN9e1xvcHRpb25hbHtsaW1pdFxvcHRpb25hbHssIGZpbGV9fX0KLVRoaXMgaXMgYSBzaG9ydGhhbmQgZm9yIFxjb2Rle3ByaW50X2V4Y2VwdGlvbigqXGZ1bmN0aW9ue3N5cy5leGNfaW5mbygpfX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2Zvcm1hdF9leGN9e1xvcHRpb25hbHtsaW1pdH19Ci1UaGlzIGlzIGxpa2UgXGNvZGV7cHJpbnRfZXhjKFx2YXJ7bGltaXR9KX0gYnV0IHJldHVybnMgYSBzdHJpbmcKLWluc3RlYWQgb2YgcHJpbnRpbmcgdG8gYSBmaWxlLgotXHZlcnNpb25hZGRlZHsyLjR9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3ByaW50X2xhc3R9e1xvcHRpb25hbHtsaW1pdFxvcHRpb25hbHssIGZpbGV9fX0KLVRoaXMgaXMgYSBzaG9ydGhhbmQgZm9yIFxjb2Rle3ByaW50X2V4Y2VwdGlvbihzeXMubGFzdF90eXBlLAotc3lzLmxhc3RfdmFsdWUsIHN5cy5sYXN0X3RyYWNlYmFjaywgXHZhcntsaW1pdH0sIFx2YXJ7ZmlsZX0pfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cHJpbnRfc3RhY2t9e1xvcHRpb25hbHtmXG9wdGlvbmFseywgbGltaXRcb3B0aW9uYWx7LCBmaWxlfX19fQotVGhpcyBmdW5jdGlvbiBwcmludHMgYSBzdGFjayB0cmFjZSBmcm9tIGl0cyBpbnZvY2F0aW9uIHBvaW50LiAgVGhlCi1vcHRpb25hbCBcdmFye2Z9IGFyZ3VtZW50IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYW4gYWx0ZXJuYXRlIHN0YWNrCi1mcmFtZSB0byBzdGFydC4gIFRoZSBvcHRpb25hbCBcdmFye2xpbWl0fSBhbmQgXHZhcntmaWxlfSBhcmd1bWVudHMgaGF2ZSB0aGUKLXNhbWUgbWVhbmluZyBhcyBmb3IgXGZ1bmN0aW9ue3ByaW50X2V4Y2VwdGlvbigpfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZXh0cmFjdF90Yn17dHJhY2ViYWNrXG9wdGlvbmFseywgbGltaXR9fQotUmV0dXJuIGEgbGlzdCBvZiB1cCB0byBcdmFye2xpbWl0fSBgYHByZS1wcm9jZXNzZWQnJyBzdGFjayB0cmFjZQotZW50cmllcyBleHRyYWN0ZWQgZnJvbSB0aGUgdHJhY2ViYWNrIG9iamVjdCBcdmFye3RyYWNlYmFja30uICBJdCBpcwotdXNlZnVsIGZvciBhbHRlcm5hdGUgZm9ybWF0dGluZyBvZiBzdGFjayB0cmFjZXMuICBJZiBcdmFye2xpbWl0fSBpcwotb21pdHRlZCBvciBcY29kZXtOb25lfSwgYWxsIGVudHJpZXMgYXJlIGV4dHJhY3RlZC4gIEEKLWBgcHJlLXByb2Nlc3NlZCcnIHN0YWNrIHRyYWNlIGVudHJ5IGlzIGEgcXVhZHJ1cGxlIChcdmFye2ZpbGVuYW1lfSwKLVx2YXJ7bGluZSBudW1iZXJ9LCBcdmFye2Z1bmN0aW9uIG5hbWV9LCBcdmFye3RleHR9KSByZXByZXNlbnRpbmcKLXRoZSBpbmZvcm1hdGlvbiB0aGF0IGlzIHVzdWFsbHkgcHJpbnRlZCBmb3IgYSBzdGFjayB0cmFjZS4gIFRoZQotXHZhcnt0ZXh0fSBpcyBhIHN0cmluZyB3aXRoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UKLXN0cmlwcGVkOyBpZiB0aGUgc291cmNlIGlzIG5vdCBhdmFpbGFibGUgaXQgaXMgXGNvZGV7Tm9uZX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2V4dHJhY3Rfc3RhY2t9e1xvcHRpb25hbHtmXG9wdGlvbmFseywgbGltaXR9fX0KLUV4dHJhY3QgdGhlIHJhdyB0cmFjZWJhY2sgZnJvbSB0aGUgY3VycmVudCBzdGFjayBmcmFtZS4gIFRoZSByZXR1cm4KLXZhbHVlIGhhcyB0aGUgc2FtZSBmb3JtYXQgYXMgZm9yIFxmdW5jdGlvbntleHRyYWN0X3RiKCl9LiAgVGhlCi1vcHRpb25hbCBcdmFye2Z9IGFuZCBcdmFye2xpbWl0fSBhcmd1bWVudHMgaGF2ZSB0aGUgc2FtZSBtZWFuaW5nIGFzCi1mb3IgXGZ1bmN0aW9ue3ByaW50X3N0YWNrKCl9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtmb3JtYXRfbGlzdH17bGlzdH0KLUdpdmVuIGEgbGlzdCBvZiB0dXBsZXMgYXMgcmV0dXJuZWQgYnkgXGZ1bmN0aW9ue2V4dHJhY3RfdGIoKX0gb3IKLVxmdW5jdGlvbntleHRyYWN0X3N0YWNrKCl9LCByZXR1cm4gYSBsaXN0IG9mIHN0cmluZ3MgcmVhZHkgZm9yCi1wcmludGluZy4gIEVhY2ggc3RyaW5nIGluIHRoZSByZXN1bHRpbmcgbGlzdCBjb3JyZXNwb25kcyB0byB0aGUgaXRlbQotd2l0aCB0aGUgc2FtZSBpbmRleCBpbiB0aGUgYXJndW1lbnQgbGlzdC4gIEVhY2ggc3RyaW5nIGVuZHMgaW4gYQotbmV3bGluZTsgdGhlIHN0cmluZ3MgbWF5IGNvbnRhaW4gaW50ZXJuYWwgbmV3bGluZXMgYXMgd2VsbCwgZm9yIHRob3NlCi1pdGVtcyB3aG9zZSBzb3VyY2UgdGV4dCBsaW5lIGlzIG5vdCBcY29kZXtOb25lfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Zm9ybWF0X2V4Y2VwdGlvbl9vbmx5fXt0eXBlLCB2YWx1ZX0KLUZvcm1hdCB0aGUgZXhjZXB0aW9uIHBhcnQgb2YgYSB0cmFjZWJhY2suICBUaGUgYXJndW1lbnRzIGFyZSB0aGUKLWV4Y2VwdGlvbiB0eXBlIGFuZCB2YWx1ZSBzdWNoIGFzIGdpdmVuIGJ5IFxjb2Rle3N5cy5sYXN0X3R5cGV9IGFuZAotXGNvZGV7c3lzLmxhc3RfdmFsdWV9LiAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIGxpc3Qgb2Ygc3RyaW5ncywgZWFjaAotZW5kaW5nIGluIGEgbmV3bGluZS4gIE5vcm1hbGx5LCB0aGUgbGlzdCBjb250YWlucyBhIHNpbmdsZSBzdHJpbmc7Ci1ob3dldmVyLCBmb3IgXGV4Y2VwdGlvbntTeW50YXhFcnJvcn0gZXhjZXB0aW9ucywgaXQgY29udGFpbnMgc2V2ZXJhbAotbGluZXMgdGhhdCAod2hlbiBwcmludGVkKSBkaXNwbGF5IGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHdoZXJlIHRoZQotc3ludGF4IGVycm9yIG9jY3VycmVkLiAgVGhlIG1lc3NhZ2UgaW5kaWNhdGluZyB3aGljaCBleGNlcHRpb24KLW9jY3VycmVkIGlzIHRoZSBhbHdheXMgbGFzdCBzdHJpbmcgaW4gdGhlIGxpc3QuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2Zvcm1hdF9leGNlcHRpb259e3R5cGUsIHZhbHVlLCB0YlxvcHRpb25hbHssIGxpbWl0fX0KLUZvcm1hdCBhIHN0YWNrIHRyYWNlIGFuZCB0aGUgZXhjZXB0aW9uIGluZm9ybWF0aW9uLiAgVGhlIGFyZ3VtZW50cyAKLWhhdmUgdGhlIHNhbWUgbWVhbmluZyBhcyB0aGUgY29ycmVzcG9uZGluZyBhcmd1bWVudHMgdG8KLVxmdW5jdGlvbntwcmludF9leGNlcHRpb24oKX0uICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgbGlzdCBvZiBzdHJpbmdzLAotZWFjaCBlbmRpbmcgaW4gYSBuZXdsaW5lIGFuZCBzb21lIGNvbnRhaW5pbmcgaW50ZXJuYWwgbmV3bGluZXMuICBXaGVuCi10aGVzZSBsaW5lcyBhcmUgY29uY2F0ZW5hdGVkIGFuZCBwcmludGVkLCBleGFjdGx5IHRoZSBzYW1lIHRleHQgaXMKLXByaW50ZWQgYXMgZG9lcyBcZnVuY3Rpb257cHJpbnRfZXhjZXB0aW9uKCl9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtmb3JtYXRfdGJ9e3RiXG9wdGlvbmFseywgbGltaXR9fQotQSBzaG9ydGhhbmQgZm9yIFxjb2Rle2Zvcm1hdF9saXN0KGV4dHJhY3RfdGIoXHZhcnt0Yn0sIFx2YXJ7bGltaXR9KSl9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtmb3JtYXRfc3RhY2t9e1xvcHRpb25hbHtmXG9wdGlvbmFseywgbGltaXR9fX0KLUEgc2hvcnRoYW5kIGZvciBcY29kZXtmb3JtYXRfbGlzdChleHRyYWN0X3N0YWNrKFx2YXJ7Zn0sIFx2YXJ7bGltaXR9KSl9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt0Yl9saW5lbm99e3RifQotVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyIHNldCBpbiB0aGUgdHJhY2ViYWNrCi1vYmplY3QuICBUaGlzIGZ1bmN0aW9uIHdhcyBuZWNlc3NhcnkgYmVjYXVzZSBpbiB2ZXJzaW9ucyBvZiBQeXRob24KLXByaW9yIHRvIDIuMyB3aGVuIHRoZSBccHJvZ3JhbW9wdHstT30gZmxhZyB3YXMgcGFzc2VkIHRvIFB5dGhvbiB0aGUKLVxjb2Rle1x2YXJ7dGJ9LnRiX2xpbmVub30gd2FzIG5vdCB1cGRhdGVkIGNvcnJlY3RseS4gIFRoaXMgZnVuY3Rpb24KLWhhcyBubyB1c2UgaW4gdmVyc2lvbnMgcGFzdCAyLjMuCi1cZW5ke2Z1bmNkZXNjfQotCi0KLVxzdWJzZWN0aW9ue1RyYWNlYmFjayBFeGFtcGxlIFxsYWJlbHt0cmFjZWJhY2stZXhhbXBsZX19Ci0KLVRoaXMgc2ltcGxlIGV4YW1wbGUgaW1wbGVtZW50cyBhIGJhc2ljIHJlYWQtZXZhbC1wcmludCBsb29wLCBzaW1pbGFyCi10byAoYnV0IGxlc3MgdXNlZnVsIHRoYW4pIHRoZSBzdGFuZGFyZCBQeXRob24gaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIKLWxvb3AuICBGb3IgYSBtb3JlIGNvbXBsZXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcnByZXRlciBsb29wLAotcmVmZXIgdG8gdGhlIFxyZWZtb2R1bGV7Y29kZX0gbW9kdWxlLgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgc3lzLCB0cmFjZWJhY2sKLQotZGVmIHJ1bl91c2VyX2NvZGUoZW52ZGlyKToKLSAgICBzb3VyY2UgPSByYXdfaW5wdXQoIj4+PiAiKQotICAgIHRyeToKLSAgICAgICAgZXhlYyhzb3VyY2UsIGVudmRpcikKLSAgICBleGNlcHQ6Ci0gICAgICAgIHByaW50ICJFeGNlcHRpb24gaW4gdXNlciBjb2RlOiIKLSAgICAgICAgcHJpbnQgJy0nKjYwCi0gICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoZmlsZT1zeXMuc3Rkb3V0KQotICAgICAgICBwcmludCAnLScqNjAKLQotZW52ZGlyID0ge30KLXdoaWxlIDE6Ci0gICAgcnVuX3VzZXJfY29kZShlbnZkaXIpCi1cZW5ke3ZlcmJhdGltfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ0dHkudGV4IGIvRG9jL2xpYi9saWJ0dHkudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDI3NzFhLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlidHR5LnRleAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7dHR5fSAtLS0KLSAgICAgICAgIFRlcm1pbmFsIGNvbnRyb2wgZnVuY3Rpb25zfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17dHR5fQotICBccGxhdGZvcm17VW5peH0KLVxtb2R1bGVhdXRob3J7U3RlZW4gTHVtaG9sdH17fQotXHNlY3Rpb25hdXRob3J7TW9zaGUgWmFka2F9e21vc2hlekB6YWRrYS5zaXRlLmNvLmlsfQotXG1vZHVsZXN5bm9wc2lze1V0aWxpdHkgZnVuY3Rpb25zIHRoYXQgcGVyZm9ybSBjb21tb24gdGVybWluYWwgY29udHJvbAotICAgICAgICAgICAgICAgIG9wZXJhdGlvbnMufQotCi1UaGUgXG1vZHVsZXt0dHl9IG1vZHVsZSBkZWZpbmVzIGZ1bmN0aW9ucyBmb3IgcHV0dGluZyB0aGUgdHR5IGludG8KLWNicmVhayBhbmQgcmF3IG1vZGVzLgotCi1CZWNhdXNlIGl0IHJlcXVpcmVzIHRoZSBccmVmbW9kdWxle3Rlcm1pb3N9IG1vZHVsZSwgaXQgd2lsbCB3b3JrCi1vbmx5IG9uIFxVTklYLgotCi1UaGUgXG1vZHVsZXt0dHl9IG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgotCi1cYmVnaW57ZnVuY2Rlc2N9e3NldHJhd317ZmRcb3B0aW9uYWx7LCB3aGVufX0KLUNoYW5nZSB0aGUgbW9kZSBvZiB0aGUgZmlsZSBkZXNjcmlwdG9yIFx2YXJ7ZmR9IHRvIHJhdy4gSWYgXHZhcnt3aGVufQotaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gXGNvbnN0YW50e3Rlcm1pb3MuVENTQUZMVVNIfSwgYW5kIGlzIHBhc3NlZAotdG8gXGZ1bmN0aW9ue3Rlcm1pb3MudGNzZXRhdHRyKCl9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzZXRjYnJlYWt9e2ZkXG9wdGlvbmFseywgd2hlbn19Ci1DaGFuZ2UgdGhlIG1vZGUgb2YgZmlsZSBkZXNjcmlwdG9yIFx2YXJ7ZmR9IHRvIGNicmVhay4gSWYgXHZhcnt3aGVufQotaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gXGNvbnN0YW50e3Rlcm1pb3MuVENTQUZMVVNIfSwgYW5kIGlzIHBhc3NlZAotdG8gXGZ1bmN0aW9ue3Rlcm1pb3MudGNzZXRhdHRyKCl9LgotXGVuZHtmdW5jZGVzY30KLQotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZW1vZHVsZXt0ZXJtaW9zfXtMb3ctbGV2ZWwgdGVybWluYWwgY29udHJvbCBpbnRlcmZhY2UufQotXGVuZHtzZWVhbHNvfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ0dXJ0bGUudGV4IGIvRG9jL2xpYi9saWJ0dXJ0bGUudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYThmMGRkLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlidHVydGxlLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3R1cnRsZX0gLS0tCi0gICAgICAgICBUdXJ0bGUgZ3JhcGhpY3MgZm9yIFRrfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17dHVydGxlfQotICAgXHBsYXRmb3Jte1RrfQotXG1vZHVsZWF1dGhvcntHdWlkbyB2YW4gUm9zc3VtfXtndWlkb0BweXRob24ub3JnfQotXG1vZHVsZXN5bm9wc2lze0FuIGVudmlyb25tZW50IGZvciB0dXJ0bGUgZ3JhcGhpY3MufQotCi1cc2VjdGlvbmF1dGhvcntNb3NoZSBaYWRrYX17bW9zaGV6QHphZGthLnNpdGUuY28uaWx9Ci0KLQotVGhlIFxtb2R1bGV7dHVydGxlfSBtb2R1bGUgcHJvdmlkZXMgdHVydGxlIGdyYXBoaWNzIHByaW1pdGl2ZXMsIGluIGJvdGggYW4KLW9iamVjdC1vcmllbnRlZCBhbmQgcHJvY2VkdXJlLW9yaWVudGVkIHdheXMuIEJlY2F1c2UgaXQgdXNlcyBcbW9kdWxle1RraW50ZXJ9Ci1mb3IgdGhlIHVuZGVybHlpbmcgZ3JhcGhpY3MsIGl0IG5lZWRzIGEgdmVyc2lvbiBvZiBweXRob24gaW5zdGFsbGVkIHdpdGgKLVRrIHN1cHBvcnQuCi0KLVRoZSBwcm9jZWR1cmFsIGludGVyZmFjZSB1c2VzIGEgcGVuIGFuZCBhIGNhbnZhcyB3aGljaCBhcmUgYXV0b21hZ2ljYWxseQotY3JlYXRlZCB3aGVuIGFueSBvZiB0aGUgZnVuY3Rpb25zIGFyZSBjYWxsZWQuCi0KLVRoZSBcbW9kdWxle3R1cnRsZX0gbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6Ci0KLVxiZWdpbntmdW5jZGVzY317ZGVncmVlc317fQotU2V0IGFuZ2xlIG1lYXN1cmVtZW50IHVuaXRzIHRvIGRlZ3JlZXMuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3JhZGlhbnN9e30KLVNldCBhbmdsZSBtZWFzdXJlbWVudCB1bml0cyB0byByYWRpYW5zLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzZXR1cH17Kiprd2FyZ3N9Ci1TZXRzIHRoZSBzaXplIGFuZCBwb3NpdGlvbiBvZiB0aGUgbWFpbiB3aW5kb3cuICBLZXl3b3JkcyBhcmU6Ci1cYmVnaW57aXRlbWl6ZX0KLSAgXGl0ZW0gXGNvZGV7d2lkdGh9OiBlaXRoZXIgYSBzaXplIGluIHBpeGVscyBvciBhIGZyYWN0aW9uIG9mIHRoZSBzY3JlZW4uCi0gICBUaGUgZGVmYXVsdCBpcyA1MFwlIG9mIHRoZSBzY3JlZW4uCi0gIFxpdGVtIFxjb2Rle2hlaWdodH06IGVpdGhlciBhIHNpemUgaW4gcGl4ZWxzIG9yIGEgZnJhY3Rpb24gb2YgdGhlIHNjcmVlbi4KLSAgIFRoZSBkZWZhdWx0IGlzIDUwXCUgb2YgdGhlIHNjcmVlbi4KLSAgXGl0ZW0gXGNvZGV7c3RhcnR4fTogc3RhcnRpbmcgcG9zaXRpb24gaW4gcGl4ZWxzIGZyb20gdGhlIGxlZnQgZWRnZQotICAgICAgb2YgdGhlIHNjcmVlbi4gXGNvZGV7Tm9uZX0gaXMgdGhlIGRlZmF1bHQgdmFsdWUgYW5kIAotICAgICAgY2VudGVycyB0aGUgd2luZG93IGhvcml6b250YWxseSBvbiBzY3JlZW4uCi0gIFxpdGVtIFxjb2Rle3N0YXJ0eX06IHN0YXJ0aW5nIHBvc2l0aW9uIGluIHBpeGVscyBmcm9tIHRoZSB0b3AgZWRnZQotICAgICAgb2YgdGhlIHNjcmVlbi4gXGNvZGV7Tm9uZX0gaXMgdGhlIGRlZmF1bHQgdmFsdWUgYW5kIAotICAgICAgY2VudGVycyB0aGUgd2luZG93IHZlcnRpY2FsbHkgb24gc2NyZWVuLgotXGVuZHtpdGVtaXplfQotCi0gICBFeGFtcGxlczoKLQotXGJlZ2lue3ZlcmJhdGltfQotIyBVc2VzIGRlZmF1bHQgZ2VvbWV0cnk6IDUwJSB4IDUwJSBvZiBzY3JlZW4sIGNlbnRlcmVkLgotc2V0dXAoKSAgCi0KLSMgU2V0cyB3aW5kb3cgdG8gMjAweDIwMCBwaXhlbHMsIGluIHVwcGVyIGxlZnQgb2Ygc2NyZWVuCi1zZXR1cCAod2lkdGg9MjAwLCBoZWlnaHQ9MjAwLCBzdGFydHg9MCwgc3RhcnR5PTApCi0KLSMgU2V0cyB3aW5kb3cgdG8gNzUlIG9mIHNjcmVlbiBieSA1MCUgb2Ygc2NyZWVuLCBhbmQgY2VudGVycyBpdC4KLXNldHVwKHdpZHRoPS43NSwgaGVpZ2h0PTAuNSwgc3RhcnR4PU5vbmUsIHN0YXJ0eT1Ob25lKQotXGVuZHt2ZXJiYXRpbX0KLQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt0aXRsZX17dGl0bGVfc3RyfQotU2V0IHRoZSB3aW5kb3cncyB0aXRsZSB0byBcdmFye3RpdGxlfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZG9uZX17fQotRW50ZXJzIHRoZSBUayBtYWluIGxvb3AuICBUaGUgd2luZG93IHdpbGwgY29udGludWUgdG8gCi1iZSBkaXNwbGF5ZWQgdW50aWwgdGhlIHVzZXIgY2xvc2VzIGl0IG9yIHRoZSBwcm9jZXNzIGlzIGtpbGxlZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cmVzZXR9e30KLUNsZWFyIHRoZSBzY3JlZW4sIHJlLWNlbnRlciB0aGUgcGVuLCBhbmQgc2V0IHZhcmlhYmxlcyB0byB0aGUgZGVmYXVsdAotdmFsdWVzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtjbGVhcn17fQotQ2xlYXIgdGhlIHNjcmVlbi4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dHJhY2VyfXtmbGFnfQotU2V0IHRyYWNpbmcgb24vb2ZmIChhY2NvcmRpbmcgdG8gd2hldGhlciBmbGFnIGlzIHRydWUgb3Igbm90KS4gVHJhY2luZwotbWVhbnMgbGluZSBhcmUgZHJhd24gbW9yZSBzbG93bHksIHdpdGggYW4gYW5pbWF0aW9uIG9mIGFuIGFycm93IGFsb25nIHRoZSAKLWxpbmUuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NwZWVkfXtzcGVlZH0KLVNldCB0aGUgc3BlZWQgb2YgdGhlIHR1cnRsZS4gVmFsaWQgdmFsdWVzIGZvciB0aGUgcGFyYW1ldGVyCi1cdmFye3NwZWVkfSBhcmUgXGNvZGV7J2Zhc3Rlc3QnfSAobm8gZGVsYXkpLCBcY29kZXsnZmFzdCd9LAotKGRlbGF5IDVtcyksIFxjb2Rleydub3JtYWwnfSAoZGVsYXkgMTBtcyksIFxjb2RleydzbG93J30KLShkZWxheSAxNW1zKSwgYW5kIFxjb2RleydzbG93ZXN0J30gKGRlbGF5IDIwbXMpLgotXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2RlbGF5fXtkZWxheX0KLVNldCB0aGUgc3BlZWQgb2YgdGhlIHR1cnRsZSB0byBcdmFye2RlbGF5fSwgd2hpY2ggaXMgZ2l2ZW4KLWluIG1zLiBcdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Zm9yd2FyZH17ZGlzdGFuY2V9Ci1HbyBmb3J3YXJkIFx2YXJ7ZGlzdGFuY2V9IHN0ZXBzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtiYWNrd2FyZH17ZGlzdGFuY2V9Ci1HbyBiYWNrd2FyZCBcdmFye2Rpc3RhbmNlfSBzdGVwcy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bGVmdH17YW5nbGV9Ci1UdXJuIGxlZnQgXHZhcnthbmdsZX0gdW5pdHMuIFVuaXRzIGFyZSBieSBkZWZhdWx0IGRlZ3JlZXMsIGJ1dCBjYW4gYmUKLXNldCB2aWEgdGhlIFxmdW5jdGlvbntkZWdyZWVzKCl9IGFuZCBcZnVuY3Rpb257cmFkaWFucygpfSBmdW5jdGlvbnMuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3JpZ2h0fXthbmdsZX0KLVR1cm4gcmlnaHQgXHZhcnthbmdsZX0gdW5pdHMuIFVuaXRzIGFyZSBieSBkZWZhdWx0IGRlZ3JlZXMsIGJ1dCBjYW4gYmUKLXNldCB2aWEgdGhlIFxmdW5jdGlvbntkZWdyZWVzKCl9IGFuZCBcZnVuY3Rpb257cmFkaWFucygpfSBmdW5jdGlvbnMuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3VwfXt9Ci1Nb3ZlIHRoZSBwZW4gdXAgLS0tIHN0b3AgZHJhd2luZy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZG93bn17fQotTW92ZSB0aGUgcGVuIGRvd24gLS0tIGRyYXcgd2hlbiBtb3ZpbmcuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3dpZHRofXt3aWR0aH0KLVNldCB0aGUgbGluZSB3aWR0aCB0byBcdmFye3dpZHRofS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y29sb3J9e3N9Ci1cZnVuY2xpbmVuaXtjb2xvcn17KHIsIGcsIGIpfQotXGZ1bmNsaW5lbml7Y29sb3J9e3IsIGcsIGJ9Ci1TZXQgdGhlIHBlbiBjb2xvci4gIEluIHRoZSBmaXJzdCBmb3JtLCB0aGUgY29sb3IgaXMgc3BlY2lmaWVkIGFzIGEKLVRrIGNvbG9yIHNwZWNpZmljYXRpb24gYXMgYSBzdHJpbmcuICBUaGUgc2Vjb25kIGZvcm0gc3BlY2lmaWVzIHRoZQotY29sb3IgYXMgYSB0dXBsZSBvZiB0aGUgUkdCIHZhbHVlcywgZWFjaCBpbiB0aGUgcmFuZ2UgWzAuLjFdLiAgRm9yIHRoZQotdGhpcmQgZm9ybSwgdGhlIGNvbG9yIGlzIHNwZWNpZmllZCBnaXZpbmcgdGhlIFJHQiB2YWx1ZXMgYXMgdGhyZWUKLXNlcGFyYXRlIHBhcmFtZXRlcnMgKGVhY2ggaW4gdGhlIHJhbmdlIFswLi4xXSkuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3dyaXRlfXt0ZXh0XG9wdGlvbmFseywgbW92ZX19Ci1Xcml0ZSBcdmFye3RleHR9IGF0IHRoZSBjdXJyZW50IHBlbiBwb3NpdGlvbi4gSWYgXHZhcnttb3ZlfSBpcyB0cnVlLAotdGhlIHBlbiBpcyBtb3ZlZCB0byB0aGUgYm90dG9tLXJpZ2h0IGNvcm5lciBvZiB0aGUgdGV4dC4gQnkgZGVmYXVsdCwKLVx2YXJ7bW92ZX0gaXMgZmFsc2UuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2ZpbGx9e2ZsYWd9Ci1UaGUgY29tcGxldGUgc3BlY2lmaWNhdGlvbnMgYXJlIHJhdGhlciBjb21wbGV4LCBidXQgdGhlIHJlY29tbWVuZGVkIAotdXNhZ2UgaXM6IGNhbGwgXGNvZGV7ZmlsbCgxKX0gYmVmb3JlIGRyYXdpbmcgYSBwYXRoIHlvdSB3YW50IHRvIGZpbGwsCi1hbmQgY2FsbCBcY29kZXtmaWxsKDApfSB3aGVuIHlvdSBmaW5pc2ggdG8gZHJhdyB0aGUgcGF0aC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317YmVnaW5cX2ZpbGx9e30KLVN3aXRjaCB0dXJ0bGUgaW50byBmaWxsaW5nIG1vZGU7IAotTXVzdCBldmVudHVhbGx5IGJlIGZvbGxvd2VkIGJ5IGEgY29ycmVzcG9uZGluZyBlbmRfZmlsbCgpIGNhbGwuCi1PdGhlcndpc2UgaXQgd2lsbCBiZSBpZ25vcmVkLgotXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2VuZFxfZmlsbH17fQotRW5kIGZpbGxpbmcgbW9kZSwgYW5kIGZpbGwgdGhlIHNoYXBlOyBlcXVpdmFsZW50IHRvIFxjb2Rle2ZpbGwoMCl9LgotXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2NpcmNsZX17cmFkaXVzXG9wdGlvbmFseywgZXh0ZW50fX0KLURyYXcgYSBjaXJjbGUgd2l0aCByYWRpdXMgXHZhcntyYWRpdXN9IHdob3NlIGNlbnRlci1wb2ludCBpcwotXHZhcntyYWRpdXN9IHVuaXRzIGxlZnQgb2YgdGhlIHR1cnRsZS4KLVx2YXJ7ZXh0ZW50fSBkZXRlcm1pbmVzIHdoaWNoIHBhcnQgb2YgYSBjaXJjbGUgaXMgZHJhd246IGlmCi1ub3QgZ2l2ZW4gaXQgZGVmYXVsdHMgdG8gYSBmdWxsIGNpcmNsZS4KLQotSWYgXHZhcntleHRlbnR9IGlzIG5vdCBhIGZ1bGwgY2lyY2xlLCBvbmUgZW5kcG9pbnQgb2YgdGhlIGFyYyBpcyB0aGUKLWN1cnJlbnQgcGVuIHBvc2l0aW9uLiBUaGUgYXJjIGlzIGRyYXduIGluIGEgY291bnRlciBjbG9ja3dpc2UKLWRpcmVjdGlvbiBpZiBcdmFye3JhZGl1c30gaXMgcG9zaXRpdmUsIG90aGVyd2lzZSBpbiBhIGNsb2Nrd2lzZQotZGlyZWN0aW9uLiAgSW4gdGhlIHByb2Nlc3MsIHRoZSBkaXJlY3Rpb24gb2YgdGhlIHR1cnRsZSBpcyBjaGFuZ2VkCi1ieSB0aGUgYW1vdW50IG9mIHRoZSBcdmFye2V4dGVudH0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dvdG99e3gsIHl9Ci1cZnVuY2xpbmVuaXtnb3RvfXsoeCwgeSl9Ci1HbyB0byBjby1vcmRpbmF0ZXMgXHZhcnt4fSwgXHZhcnt5fS4gIFRoZSBjby1vcmRpbmF0ZXMgbWF5IGJlCi1zcGVjaWZpZWQgZWl0aGVyIGFzIHR3byBzZXBhcmF0ZSBhcmd1bWVudHMgb3IgYXMgYSAyLXR1cGxlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt0b3dhcmRzfXt4LCB5fQotUmV0dXJuIHRoZSBhbmdsZSBvZiB0aGUgbGluZSBmcm9tIHRoZSB0dXJ0bGUncyBwb3NpdGlvbgotdG8gdGhlIHBvaW50IFx2YXJ7eH0sIFx2YXJ7eX0uIFRoZSBjby1vcmRpbmF0ZXMgbWF5IGJlCi1zcGVjaWZpZWQgZWl0aGVyIGFzIHR3byBzZXBhcmF0ZSBhcmd1bWVudHMsIGFzIGEgMi10dXBsZSwKLW9yIGFzIGFub3RoZXIgcGVuIG9iamVjdC4KLVx2ZXJzaW9uYWRkZWR7Mi41fQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtoZWFkaW5nfXt9Ci1SZXR1cm4gdGhlIGN1cnJlbnQgb3JpZW50YXRpb24gb2YgdGhlIHR1cnRsZS4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzZXRoZWFkaW5nfXthbmdsZX0KLVNldCB0aGUgb3JpZW50YXRpb24gb2YgdGhlIHR1cnRsZSB0byBcdmFye2FuZ2xlfS4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtwb3NpdGlvbn17fQotUmV0dXJuIHRoZSBjdXJyZW50IGxvY2F0aW9uIG9mIHRoZSB0dXJ0bGUgYXMgYW4gXGNvZGV7KHgseSl9IHBhaXIuCi1cdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c2V0eH17eH0KLVNldCB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB0dXJ0bGUgdG8gXHZhcnt4fS4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzZXR5fXt5fQotU2V0IHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHR1cnRsZSB0byBcdmFye3l9LgotXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3dpbmRvd1xfd2lkdGh9e30KLVJldHVybiB0aGUgd2lkdGggb2YgdGhlIGNhbnZhcyB3aW5kb3cuCi1cdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317d2luZG93XF9oZWlnaHR9e30KLVJldHVybiB0aGUgaGVpZ2h0IG9mIHRoZSBjYW52YXMgd2luZG93LgotXHZlcnNpb25hZGRlZHsyLjN9Ci1cZW5ke2Z1bmNkZXNjfQotCi1UaGlzIG1vZHVsZSBhbHNvIGRvZXMgXGNvZGV7ZnJvbSBtYXRoIGltcG9ydCAqfSwgc28gc2VlIHRoZQotZG9jdW1lbnRhdGlvbiBmb3IgdGhlIFxyZWZtb2R1bGV7bWF0aH0gbW9kdWxlIGZvciBhZGRpdGlvbmFsIGNvbnN0YW50cwotYW5kIGZ1bmN0aW9ucyB1c2VmdWwgZm9yIHR1cnRsZSBncmFwaGljcy4KLQotXGJlZ2lue2Z1bmNkZXNjfXtkZW1vfXt9Ci1FeGVyY2lzZSB0aGUgbW9kdWxlIGEgYml0LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e0Vycm9yfQotRXhjZXB0aW9uIHJhaXNlZCBvbiBhbnkgZXJyb3IgY2F1Z2h0IGJ5IHRoaXMgbW9kdWxlLgotXGVuZHtleGNkZXNjfQotCi1Gb3IgZXhhbXBsZXMsIHNlZSB0aGUgY29kZSBvZiB0aGUgXGZ1bmN0aW9ue2RlbW8oKX0gZnVuY3Rpb24uCi0KLVRoaXMgbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBjbGFzc2VzOgotCi1cYmVnaW57Y2xhc3NkZXNjfXtQZW59e30KLURlZmluZSBhIHBlbi4gQWxsIGFib3ZlIGZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkIGFzIGEgbWV0aG9kcyBvbiB0aGUgZ2l2ZW4KLXBlbi4gVGhlIGNvbnN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBhIGNhbnZhcyBkbyBiZSBkcmF3biBvbi4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtUdXJ0bGV9e30KLURlZmluZSBhIHBlbi4gVGhpcyBpcyBlc3NlbnRpYWxseSBhIHN5bm9ueW0gZm9yIFxjb2Rle1BlbigpfTsKLVxjbGFzc3tUdXJ0bGV9IGlzIGFuIGVtcHR5IHN1YmNsYXNzIG9mIFxjbGFzc3tQZW59LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1Jhd1Blbn17Y2FudmFzfQotRGVmaW5lIGEgcGVuIHdoaWNoIGRyYXdzIG9uIGEgY2FudmFzIFx2YXJ7Y2FudmFzfS4gVGhpcyBpcyB1c2VmdWwgaWYgCi15b3Ugd2FudCB0byB1c2UgdGhlIG1vZHVsZSB0byBjcmVhdGUgZ3JhcGhpY3MgaW4gYSBgYHJlYWwnJyBwcm9ncmFtLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxzdWJzZWN0aW9ue1R1cnRsZSwgUGVuIGFuZCBSYXdQZW4gT2JqZWN0cyBcbGFiZWx7cGVuLXJhd3Blbi1vYmplY3RzfX0KLQotTW9zdCBvZiB0aGUgZ2xvYmFsIGZ1bmN0aW9ucyBhdmFpbGFibGUgaW4gdGhlIG1vZHVsZSBhcmUgYWxzbwotYXZhaWxhYmxlIGFzIG1ldGhvZHMgb2YgdGhlIFxjbGFzc3tUdXJ0bGV9LCBcY2xhc3N7UGVufSBhbmQKLVxjbGFzc3tSYXdQZW59IGNsYXNzZXMsIGFmZmVjdGluZyBvbmx5IHRoZSBzdGF0ZSBvZiB0aGUgZ2l2ZW4gcGVuLgotCi1UaGUgb25seSBtZXRob2Qgd2hpY2ggaXMgbW9yZSBwb3dlcmZ1bCBhcyBhIG1ldGhvZCBpcwotXGZ1bmN0aW9ue2RlZ3JlZXMoKX0sIHdoaWNoIHRha2VzIGFuIG9wdGlvbmFsIGFyZ3VtZW50IGxldHRpbmcgCi15b3Ugc3BlY2lmeSB0aGUgbnVtYmVyIG9mIHVuaXRzIGNvcnJlc3BvbmRpbmcgdG8gYSBmdWxsIGNpcmNsZToKLQotXGJlZ2lue21ldGhvZGRlc2N9W1R1cnRsZV17ZGVncmVlc317XG9wdGlvbmFse2Z1bGxjaXJjbGV9fQotXHZhcntmdWxsY2lyY2xlfSBpcyBieSBkZWZhdWx0IDM2MC4gVGhpcyBjYW4gY2F1c2UgdGhlIHBlbiB0byBoYXZlIGFueQotYW5ndWxhciB1bml0cyB3aGF0ZXZlcjogZ2l2ZSBcdmFye2Z1bGxjaXJjbGV9IDIqJFxwaSQgZm9yIHJhZGlhbnMsIG9yCi00MDAgZm9yIGdyYWRpYW5zLgotXGVuZHttZXRob2RkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ0eXBlcy50ZXggYi9Eb2MvbGliL2xpYnR5cGVzLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIxNDNiOS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnR5cGVzLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3R5cGVzfSAtLS0KLSAgICAgICAgIE5hbWVzIGZvciBidWlsdC1pbiB0eXBlc30KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e3R5cGVzfQotXG1vZHVsZXN5bm9wc2lze05hbWVzIGZvciBidWlsdC1pbiB0eXBlcy59Ci0KLQotVGhpcyBtb2R1bGUgZGVmaW5lcyBuYW1lcyBmb3Igc29tZSBvYmplY3QgdHlwZXMgdGhhdCBhcmUgdXNlZCBieQotdGhlIHN0YW5kYXJkIFB5dGhvbiBpbnRlcnByZXRlciwgYnV0IG5vdCBmb3IgdGhlIHR5cGVzIGRlZmluZWQgYnkgdmFyaW91cwotZXh0ZW5zaW9uIG1vZHVsZXMuICBBbHNvLCBpdCBkb2VzIG5vdCBpbmNsdWRlIHNvbWUgb2YgdGhlIHR5cGVzIHRoYXQKLWFyaXNlIGR1cmluZyBwcm9jZXNzaW5nIHN1Y2ggYXMgdGhlIFxjb2Rle2xpc3RpdGVyYXRvcn0gdHlwZS4KLUl0IGlzIHNhZmUgdG8gdXNlIFxzYW1we2Zyb20gdHlwZXMgaW1wb3J0ICp9IC0tLQotdGhlIG1vZHVsZSBkb2VzIG5vdCBleHBvcnQgYW55IG5hbWVzIGJlc2lkZXMgdGhlIG9uZXMgbGlzdGVkIGhlcmUuCi1OZXcgbmFtZXMgZXhwb3J0ZWQgYnkgZnV0dXJlIHZlcnNpb25zIG9mIHRoaXMgbW9kdWxlIHdpbGwgYWxsIGVuZCBpbgotXHNhbXB7VHlwZX0uCi0KLVR5cGljYWwgdXNlIGlzIGZvciBmdW5jdGlvbnMgdGhhdCBkbyBkaWZmZXJlbnQgdGhpbmdzIGRlcGVuZGluZyBvbgotdGhlaXIgYXJndW1lbnQgdHlwZXMsIGxpa2UgdGhlIGZvbGxvd2luZzoKLQotXGJlZ2lue3ZlcmJhdGltfQotZnJvbSB0eXBlcyBpbXBvcnQgKgotZGVmIGRlbGV0ZShteWxpc3QsIGl0ZW0pOgotICAgIGlmIHR5cGUoaXRlbSkgaXMgSW50VHlwZToKLSAgICAgICBkZWwgbXlsaXN0W2l0ZW1dCi0gICAgZWxzZToKLSAgICAgICBteWxpc3QucmVtb3ZlKGl0ZW0pCi1cZW5ke3ZlcmJhdGltfQotCi1TdGFydGluZyBpbiBQeXRob24gMi4yLCBidWlsdC1pbiBmYWN0b3J5IGZ1bmN0aW9ucyBzdWNoIGFzCi1cZnVuY3Rpb257aW50KCl9IGFuZCBcZnVuY3Rpb257c3RyKCl9IGFyZSBhbHNvIG5hbWVzIGZvciB0aGUKLWNvcnJlc3BvbmRpbmcgdHlwZXMuICBUaGlzIGlzIG5vdyB0aGUgcHJlZmVycmVkIHdheSB0byBhY2Nlc3MKLXRoZSB0eXBlIGluc3RlYWQgb2YgdXNpbmcgdGhlIFxtb2R1bGV7dHlwZXN9IG1vZHVsZS4gIEFjY29yZGluZ2x5LAotdGhlIGV4YW1wbGUgYWJvdmUgc2hvdWxkIGJlIHdyaXR0ZW4gYXMgZm9sbG93czoKLQotXGJlZ2lue3ZlcmJhdGltfQotZGVmIGRlbGV0ZShteWxpc3QsIGl0ZW0pOgotICAgIGlmIGlzaW5zdGFuY2UoaXRlbSwgaW50KToKLSAgICAgICBkZWwgbXlsaXN0W2l0ZW1dCi0gICAgZWxzZToKLSAgICAgICBteWxpc3QucmVtb3ZlKGl0ZW0pCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBuYW1lczoKLQotXGJlZ2lue2RhdGFkZXNjfXtOb25lVHlwZX0KLVRoZSB0eXBlIG9mIFxjb2Rle05vbmV9LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtUeXBlVHlwZX0KLVRoZSB0eXBlIG9mIHR5cGUgb2JqZWN0cyAoc3VjaCBhcyByZXR1cm5lZCBieQotXGZ1bmN0aW9ue3R5cGUoKX1cYmlmdW5jaW5kZXh7dHlwZX0pLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtCb29sZWFuVHlwZX0KLVRoZSB0eXBlIG9mIHRoZSBcY2xhc3N7Ym9vbH0gdmFsdWVzIFxjb2Rle1RydWV9IGFuZCBcY29kZXtGYWxzZX07IHRoaXMKLWlzIGFuIGFsaWFzIG9mIHRoZSBidWlsdC1pbiBcZnVuY3Rpb257Ym9vbCgpfSBmdW5jdGlvbi4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtJbnRUeXBlfQotVGhlIHR5cGUgb2YgaW50ZWdlcnMgKGUuZy4gXGNvZGV7MX0pLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtMb25nVHlwZX0KLVRoZSB0eXBlIG9mIGxvbmcgaW50ZWdlcnMgKGUuZy4gXGNvZGV7MUx9KS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317RmxvYXRUeXBlfQotVGhlIHR5cGUgb2YgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyAoZS5nLiBcY29kZXsxLjB9KS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317Q29tcGxleFR5cGV9Ci1UaGUgdHlwZSBvZiBjb21wbGV4IG51bWJlcnMgKGUuZy4gXGNvZGV7MS4wan0pLiAgVGhpcyBpcyBub3QgZGVmaW5lZAotaWYgUHl0aG9uIHdhcyBidWlsdCB3aXRob3V0IGNvbXBsZXggbnVtYmVyIHN1cHBvcnQuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1N0cmluZ1R5cGV9Ci1UaGUgdHlwZSBvZiBjaGFyYWN0ZXIgc3RyaW5ncyAoZS5nLiBcY29kZXsnU3BhbSd9KS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317VW5pY29kZVR5cGV9Ci1UaGUgdHlwZSBvZiBVbmljb2RlIGNoYXJhY3RlciBzdHJpbmdzIChlLmcuIFxjb2Rle3UnU3BhbSd9KS4gIFRoaXMgaXMKLW5vdCBkZWZpbmVkIGlmIFB5dGhvbiB3YXMgYnVpbHQgd2l0aG91dCBVbmljb2RlIHN1cHBvcnQuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1R1cGxlVHlwZX0KLVRoZSB0eXBlIG9mIHR1cGxlcyAoZS5nLiBcY29kZXsoMSwgMiwgMywgJ1NwYW0nKX0pLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtMaXN0VHlwZX0KLVRoZSB0eXBlIG9mIGxpc3RzIChlLmcuIFxjb2Rle1swLCAxLCAyLCAzXX0pLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtEaWN0VHlwZX0KLVRoZSB0eXBlIG9mIGRpY3Rpb25hcmllcyAoZS5nLiBcY29kZXtceydCYWNvbic6IDEsICdIYW0nOiAwXH19KS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317RGljdGlvbmFyeVR5cGV9Ci1BbiBhbHRlcm5hdGUgbmFtZSBmb3IgXGNvZGV7RGljdFR5cGV9LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtGdW5jdGlvblR5cGV9Ci1UaGUgdHlwZSBvZiB1c2VyLWRlZmluZWQgZnVuY3Rpb25zIGFuZCBsYW1iZGFzLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtMYW1iZGFUeXBlfQotQW4gYWx0ZXJuYXRlIG5hbWUgZm9yIFxjb2Rle0Z1bmN0aW9uVHlwZX0uCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e0dlbmVyYXRvclR5cGV9Ci1UaGUgdHlwZSBvZiBnZW5lcmF0b3ItaXRlcmF0b3Igb2JqZWN0cywgcHJvZHVjZWQgYnkgY2FsbGluZyBhCi1nZW5lcmF0b3IgZnVuY3Rpb24uCi1cdmVyc2lvbmFkZGVkezIuMn0KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317Q29kZVR5cGV9Ci1UaGUgdHlwZSBmb3IgY29kZSBvYmplY3RzIHN1Y2ggYXMgcmV0dXJuZWQgYnkKLVxmdW5jdGlvbntjb21waWxlKCl9XGJpZnVuY2luZGV4e2NvbXBpbGV9LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtDbGFzc1R5cGV9Ci1UaGUgdHlwZSBvZiB1c2VyLWRlZmluZWQgY2xhc3Nlcy4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317TWV0aG9kVHlwZX0KLVRoZSB0eXBlIG9mIG1ldGhvZHMgb2YgdXNlci1kZWZpbmVkIGNsYXNzIGluc3RhbmNlcy4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317VW5ib3VuZE1ldGhvZFR5cGV9Ci1BbiBhbHRlcm5hdGUgbmFtZSBmb3IgXGNvZGV7TWV0aG9kVHlwZX0uCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e0J1aWx0aW5GdW5jdGlvblR5cGV9Ci1UaGUgdHlwZSBvZiBidWlsdC1pbiBmdW5jdGlvbnMgbGlrZSBcZnVuY3Rpb257bGVuKCl9IG9yCi1cZnVuY3Rpb257c3lzLmV4aXQoKX0uCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e0J1aWx0aW5NZXRob2RUeXBlfQotQW4gYWx0ZXJuYXRlIG5hbWUgZm9yIFxjb2Rle0J1aWx0aW5GdW5jdGlvbn0uCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e01vZHVsZVR5cGV9Ci1UaGUgdHlwZSBvZiBtb2R1bGVzLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtGaWxlVHlwZX0KLVRoZSB0eXBlIG9mIG9wZW4gZmlsZSBvYmplY3RzIHN1Y2ggYXMgXGNvZGV7c3lzLnN0ZG91dH0uCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1JhbmdlVHlwZX0KLVRoZSB0eXBlIG9mIHJhbmdlIG9iamVjdHMgcmV0dXJuZWQgYnkKLVxmdW5jdGlvbntyYW5nZSgpfVxiaWZ1bmNpbmRleHtyYW5nZX0uCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1NsaWNlVHlwZX0KLVRoZSB0eXBlIG9mIG9iamVjdHMgcmV0dXJuZWQgYnkKLVxmdW5jdGlvbntzbGljZSgpfVxiaWZ1bmNpbmRleHtzbGljZX0uCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e0VsbGlwc2lzVHlwZX0KLVRoZSB0eXBlIG9mIFxjb2Rle0VsbGlwc2lzfS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317VHJhY2ViYWNrVHlwZX0KLVRoZSB0eXBlIG9mIHRyYWNlYmFjayBvYmplY3RzIHN1Y2ggYXMgZm91bmQgaW4KLVxjb2Rle3N5cy5leGNfaW5mbygpWzJdfS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317RnJhbWVUeXBlfQotVGhlIHR5cGUgb2YgZnJhbWUgb2JqZWN0cyBzdWNoIGFzIGZvdW5kIGluIFxjb2Rle3RiLnRiX2ZyYW1lfSBpZgotXGNvZGV7dGJ9IGlzIGEgdHJhY2ViYWNrIG9iamVjdC4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317QnVmZmVyVHlwZX0KLVRoZSB0eXBlIG9mIGJ1ZmZlciBvYmplY3RzIGNyZWF0ZWQgYnkgdGhlCi1cZnVuY3Rpb257YnVmZmVyKCl9XGJpZnVuY2luZGV4e2J1ZmZlcn0gZnVuY3Rpb24uCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e0RpY3RQcm94eVR5cGV9Ci1UaGUgdHlwZSBvZiBkaWN0IHByb3hpZXMsIHN1Y2ggYXMgXGNvZGV7VHlwZVR5cGUuX19kaWN0X199LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtOb3RJbXBsZW1lbnRlZFR5cGV9Ci1UaGUgdHlwZSBvZiBcY29kZXtOb3RJbXBsZW1lbnRlZH0KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317R2V0U2V0RGVzY3JpcHRvclR5cGV9Ci1UaGUgdHlwZSBvZiBvYmplY3RzIGRlZmluZWQgaW4gZXh0ZW5zaW9uIG1vZHVsZXMgd2l0aCBcY29kZXtQeUdldFNldERlZn0sIHN1Y2gKLWFzIFxjb2Rle0ZyYW1lVHlwZS5mX2xvY2Fsc30gb3IgXGNvZGV7YXJyYXkuYXJyYXkudHlwZWNvZGV9LiAgVGhpcyBjb25zdGFudCBpcwotbm90IGRlZmluZWQgaW4gaW1wbGVtZW50YXRpb25zIG9mIFB5dGhvbiB0aGF0IGRvIG5vdCBoYXZlIHN1Y2ggZXh0ZW5zaW9uCi10eXBlcywgc28gZm9yIHBvcnRhYmxlIGNvZGUgdXNlIFxjb2Rle2hhc2F0dHIodHlwZXMsICdHZXRTZXREZXNjcmlwdG9yVHlwZScpfS4KLVx2ZXJzaW9uYWRkZWR7Mi41fQotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtNZW1iZXJEZXNjcmlwdG9yVHlwZX0KLVRoZSB0eXBlIG9mIG9iamVjdHMgZGVmaW5lZCBpbiBleHRlbnNpb24gbW9kdWxlcyB3aXRoIFxjb2Rle1B5TWVtYmVyRGVmfSwgc3VjaAotYXMgXGNvZGUge2RhdGV0aW1lLnRpbWVkZWx0YS5kYXlzfS4gIFRoaXMgY29uc3RhbnQgaXMgbm90IGRlZmluZWQgaW4KLWltcGxlbWVudGF0aW9ucyBvZiBQeXRob24gdGhhdCBkbyBub3QgaGF2ZSBzdWNoIGV4dGVuc2lvbiB0eXBlcywgc28gZm9yCi1wb3J0YWJsZSBjb2RlIHVzZSBcY29kZXtoYXNhdHRyKHR5cGVzLCAnTWVtYmVyRGVzY3JpcHRvclR5cGUnKX0uCi1cdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317U3RyaW5nVHlwZXN9Ci1BIHNlcXVlbmNlIGNvbnRhaW5pbmcgXGNvZGV7U3RyaW5nVHlwZX0gYW5kIFxjb2Rle1VuaWNvZGVUeXBlfSB1c2VkIHRvCi1mYWNpbGl0YXRlIGVhc2llciBjaGVja2luZyBmb3IgYW55IHN0cmluZyBvYmplY3QuICBVc2luZyB0aGlzIGlzIG1vcmUKLXBvcnRhYmxlIHRoYW4gdXNpbmcgYSBzZXF1ZW5jZSBvZiB0aGUgdHdvIHN0cmluZyB0eXBlcyBjb25zdHJ1Y3RlZAotZWxzZXdoZXJlIHNpbmNlIGl0IG9ubHkgY29udGFpbnMgXGNvZGV7VW5pY29kZVR5cGV9IGlmIGl0IGhhcyBiZWVuCi1idWlsdCBpbiB0aGUgcnVubmluZyB2ZXJzaW9uIG9mIFB5dGhvbi4gIEZvciBleGFtcGxlOgotXGNvZGV7aXNpbnN0YW5jZShzLCB0eXBlcy5TdHJpbmdUeXBlcyl9LgotXHZlcnNpb25hZGRlZHsyLjJ9Ci1cZW5ke2RhdGFkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ1bmRvYy50ZXggYi9Eb2MvbGliL2xpYnVuZG9jLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY1MWVlZS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnVuZG9jLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLVxjaGFwdGVye1VuZG9jdW1lbnRlZCBNb2R1bGVzIFxsYWJlbHt1bmRvY319Ci0KLUhlcmUncyBhIHF1aWNrIGxpc3Rpbmcgb2YgbW9kdWxlcyB0aGF0IGFyZSBjdXJyZW50bHkgdW5kb2N1bWVudGVkLCBidXQKLXRoYXQgc2hvdWxkIGJlIGRvY3VtZW50ZWQuICBGZWVsIGZyZWUgdG8gY29udHJpYnV0ZSBkb2N1bWVudGF0aW9uIGZvcgotdGhlbSEgIChTZW5kIHZpYSBlbWFpbCB0byBcZW1haWx7ZG9jc0BweXRob24ub3JnfS4pCi0KLVRoZSBpZGVhIGFuZCBvcmlnaW5hbCBjb250ZW50cyBmb3IgdGhpcyBjaGFwdGVyIHdlcmUgdGFrZW4KLWZyb20gYSBwb3N0aW5nIGJ5IEZyZWRyaWsgTHVuZGg7IHRoZSBzcGVjaWZpYyBjb250ZW50cyBvZiB0aGlzIGNoYXB0ZXIKLWhhdmUgYmVlbiBzdWJzdGFudGlhbGx5IHJldmlzZWQuCi0KLQotXHNlY3Rpb257RnJhbWV3b3Jrc30KLQotRnJhbWV3b3JrcyB0ZW5kIHRvIGJlIGhhcmRlciB0byBkb2N1bWVudCwgYnV0IGFyZSB3ZWxsIHdvcnRoIHRoZQotZWZmb3J0IHNwZW50LgotCi1cYmVnaW57ZGVzY3JpcHRpb259Ci1caXRlbSBOb25lIGF0IHRoaXMgdGltZS4KLVxlbmR7ZGVzY3JpcHRpb259Ci0KLQotXHNlY3Rpb257TWlzY2VsbGFuZW91cyB1c2VmdWwgdXRpbGl0aWVzfQotCi1Tb21lIG9mIHRoZXNlIGFyZSB2ZXJ5IG9sZCBhbmQvb3Igbm90IHZlcnkgcm9idXN0OyBtYXJrZWQgd2l0aCBgYGhtbS4nJwotCi1cYmVnaW57ZGVzY3JpcHRpb259Ci1caXRlbVtcbW9kdWxle2JkYn1dCi0tLS0gQSBnZW5lcmljIFB5dGhvbiBkZWJ1Z2dlciBiYXNlIGNsYXNzICh1c2VkIGJ5IHBkYikuCi0KLVxpdGVtW1xtb2R1bGV7aWhvb2tzfV0KLS0tLSBJbXBvcnQgaG9vayBzdXBwb3J0IChmb3IgXHJlZm1vZHVsZXtyZXhlY307IG1heSBiZWNvbWUgb2Jzb2xldGUpLgotXGVuZHtkZXNjcmlwdGlvbn0KLQotCi0KLVxzZWN0aW9ue1BsYXRmb3JtIHNwZWNpZmljIG1vZHVsZXN9Ci0KLVRoZXNlIG1vZHVsZXMgYXJlIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBccmVmbW9kdWxle29zLnBhdGh9IG1vZHVsZSwKLWFuZCBhcmUgbm90IGRvY3VtZW50ZWQgYmV5b25kIHRoaXMgbWVudGlvbi4gIFRoZXJlJ3MgbGl0dGxlIG5lZWQgdG8KLWRvY3VtZW50IHRoZXNlLgotCi1cYmVnaW57ZGVzY3JpcHRpb259Ci1caXRlbVtcbW9kdWxle250cGF0aH1dCi0tLS0gSW1wbGVtZW50YXRpb24gb2YgXG1vZHVsZXtvcy5wYXRofSBvbiBXaW4zMiwgV2luNjQsIFdpbkNFLCBhbmQKLSAgICBPUy8yIHBsYXRmb3Jtcy4KLQotXGl0ZW1bXG1vZHVsZXtwb3NpeHBhdGh9XQotLS0tIEltcGxlbWVudGF0aW9uIG9mIFxtb2R1bGV7b3MucGF0aH0gb24gXFBPU0lYLgotXGVuZHtkZXNjcmlwdGlvbn0KLQotCi1cc2VjdGlvbntNdWx0aW1lZGlhfQotCi1cYmVnaW57ZGVzY3JpcHRpb259Ci1caXRlbVtcbW9kdWxle3N1bmF1ZGlvfV0KLS0tLSBJbnRlcnByZXQgU3VuIGF1ZGlvIGhlYWRlcnMgKG1heSBiZWNvbWUgb2Jzb2xldGUgb3IgYSB0b29sL2RlbW8pLgotXGVuZHtkZXNjcmlwdGlvbn0KLQotCi1cc2VjdGlvbntPYnNvbGV0ZSBcbGFiZWx7b2Jzb2xldGUtbW9kdWxlc319Ci0KLVRoZXNlIG1vZHVsZXMgYXJlIG5vdCBub3JtYWxseSBhdmFpbGFibGUgZm9yIGltcG9ydDsgYWRkaXRpb25hbCB3b3JrCi1tdXN0IGJlIGRvbmUgdG8gbWFrZSB0aGVtIGF2YWlsYWJsZS4KLQotJSUlIGxpYi1vbGQgaXMgZW1wdHkgYXMgb2YgUHl0aG9uIDIuNQotJSBUaG9zZSB3aGljaCBhcmUgd3JpdHRlbiBpbiBQeXRob24gd2lsbCBiZSBpbnN0YWxsZWQgaW50byB0aGUgZGlyZWN0b3J5IAotJSBcZmlsZXtsaWItb2xkL30gaW5zdGFsbGVkIGFzIHBhcnQgb2YgdGhlIHN0YW5kYXJkIGxpYnJhcnkuICBUbyB1c2UKLSUgdGhlc2UsIHRoZSBkaXJlY3RvcnkgbXVzdCBiZSBhZGRlZCB0byBcY29kZXtzeXMucGF0aH0sIHBvc3NpYmx5IHVzaW5nCi0lIFxlbnZ2YXJ7UFlUSE9OUEFUSH0uCi0KLVRoZXNlIGV4dGVuc2lvbiBtb2R1bGVzIHdyaXR0ZW4gaW4gQyBhcmUgbm90IGJ1aWx0IGJ5IGRlZmF1bHQuCi1VbmRlciBcVU5JWCwgdGhlc2UgbXVzdCBiZSBlbmFibGVkIGJ5IHVuY29tbWVudGluZyB0aGUgYXBwcm9wcmlhdGUKLWxpbmVzIGluIFxmaWxle01vZHVsZXMvU2V0dXB9IGluIHRoZSBidWlsZCB0cmVlIGFuZCBlaXRoZXIgcmVidWlsZGluZwotUHl0aG9uIGlmIHRoZSBtb2R1bGVzIGFyZSBzdGF0aWNhbGx5IGxpbmtlZCwgb3IgYnVpbGRpbmcgYW5kCi1pbnN0YWxsaW5nIHRoZSBzaGFyZWQgb2JqZWN0IGlmIHVzaW5nIGR5bmFtaWNhbGx5LWxvYWRlZCBleHRlbnNpb25zLgotCi0lIFhYWCBuZWVkIFdpbmRvd3MgaW5zdHJ1Y3Rpb25zIQotCi1cYmVnaW57ZGVzY3JpcHRpb259Ci1caXRlbQotLS0tIFRoaXMgc2VjdGlvbiBzaG91bGQgYmUgZW1wdHkgZm9yIFB5dGhvbiAzLjAuCi1cZW5ke2Rlc2NyaXB0aW9ufQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ1bmljb2RlZGF0YS50ZXggYi9Eb2MvbGliL2xpYnVuaWNvZGVkYXRhLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM1NDY2YS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnVuaWNvZGVkYXRhLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3VuaWNvZGVkYXRhfSAtLS0KLSAgICAgICAgIFVuaWNvZGUgRGF0YWJhc2V9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXt1bmljb2RlZGF0YX0KLVxtb2R1bGVzeW5vcHNpc3tBY2Nlc3MgdGhlIFVuaWNvZGUgRGF0YWJhc2UufQotXG1vZHVsZWF1dGhvcntNYXJjLUFuZHJlIExlbWJ1cmd9e21hbEBsZW1idXJnLmNvbX0KLVxzZWN0aW9uYXV0aG9ye01hcmMtQW5kcmUgTGVtYnVyZ317bWFsQGxlbWJ1cmcuY29tfQotXHNlY3Rpb25hdXRob3J7TWFydGluIHYuIExcIm93aXN9e21hcnRpbkB2LmxvZXdpcy5kZX0KLQotXGluZGV4e1VuaWNvZGV9Ci1caW5kZXh7Y2hhcmFjdGVyfQotXGluZGV4aWl7VW5pY29kZX17ZGF0YWJhc2V9Ci0KLVRoaXMgbW9kdWxlIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgVW5pY29kZSBDaGFyYWN0ZXIgRGF0YWJhc2Ugd2hpY2gKLWRlZmluZXMgY2hhcmFjdGVyIHByb3BlcnRpZXMgZm9yIGFsbCBVbmljb2RlIGNoYXJhY3RlcnMuIFRoZSBkYXRhIGluCi10aGlzIGRhdGFiYXNlIGlzIGJhc2VkIG9uIHRoZSBcZmlsZXtVbmljb2RlRGF0YS50eHR9IGZpbGUgdmVyc2lvbgotNC4xLjAgd2hpY2ggaXMgcHVibGljbHkgYXZhaWxhYmxlIGZyb20gXHVybHtmdHA6Ly9mdHAudW5pY29kZS5vcmcvfS4KLQotVGhlIG1vZHVsZSB1c2VzIHRoZSBzYW1lIG5hbWVzIGFuZCBzeW1ib2xzIGFzIGRlZmluZWQgYnkgdGhlCi1Vbmljb2RlRGF0YSBGaWxlIEZvcm1hdCA0LjEuMCAoc2VlCi1cdXJse2h0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljLzQuMS4wL3VjZC9VQ0QuaHRtbH0pLiAgSXQKLWRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6Ci0KLVxiZWdpbntmdW5jZGVzY317bG9va3VwfXtuYW1lfQotICBMb29rIHVwIGNoYXJhY3RlciBieSBuYW1lLiAgSWYgYSBjaGFyYWN0ZXIgd2l0aCB0aGUKLSAgZ2l2ZW4gbmFtZSBpcyBmb3VuZCwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIFVuaWNvZGUKLSAgY2hhcmFjdGVyLiAgSWYgbm90IGZvdW5kLCBcZXhjZXB0aW9ue0tleUVycm9yfSBpcyByYWlzZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e25hbWV9e3VuaWNoclxvcHRpb25hbHssIGRlZmF1bHR9fQotICBSZXR1cm5zIHRoZSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBVbmljb2RlIGNoYXJhY3RlcgotICBcdmFye3VuaWNocn0gYXMgYSBzdHJpbmcuIElmIG5vIG5hbWUgaXMgZGVmaW5lZCwKLSAgXHZhcntkZWZhdWx0fSBpcyByZXR1cm5lZCwgb3IsIGlmIG5vdCBnaXZlbiwKLSAgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSBpcyByYWlzZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2RlY2ltYWx9e3VuaWNoclxvcHRpb25hbHssIGRlZmF1bHR9fQotICBSZXR1cm5zIHRoZSBkZWNpbWFsIHZhbHVlIGFzc2lnbmVkIHRvIHRoZSBVbmljb2RlIGNoYXJhY3RlcgotICBcdmFye3VuaWNocn0gYXMgaW50ZWdlci4gSWYgbm8gc3VjaCB2YWx1ZSBpcyBkZWZpbmVkLAotICBcdmFye2RlZmF1bHR9IGlzIHJldHVybmVkLCBvciwgaWYgbm90IGdpdmVuLAotICBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IGlzIHJhaXNlZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZGlnaXR9e3VuaWNoclxvcHRpb25hbHssIGRlZmF1bHR9fQotICBSZXR1cm5zIHRoZSBkaWdpdCB2YWx1ZSBhc3NpZ25lZCB0byB0aGUgVW5pY29kZSBjaGFyYWN0ZXIKLSAgXHZhcnt1bmljaHJ9IGFzIGludGVnZXIuIElmIG5vIHN1Y2ggdmFsdWUgaXMgZGVmaW5lZCwKLSAgXHZhcntkZWZhdWx0fSBpcyByZXR1cm5lZCwgb3IsIGlmIG5vdCBnaXZlbiwKLSAgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSBpcyByYWlzZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e251bWVyaWN9e3VuaWNoclxvcHRpb25hbHssIGRlZmF1bHR9fQotICBSZXR1cm5zIHRoZSBudW1lcmljIHZhbHVlIGFzc2lnbmVkIHRvIHRoZSBVbmljb2RlIGNoYXJhY3RlcgotICBcdmFye3VuaWNocn0gYXMgZmxvYXQuIElmIG5vIHN1Y2ggdmFsdWUgaXMgZGVmaW5lZCwgXHZhcntkZWZhdWx0fSBpcwotICByZXR1cm5lZCwgb3IsIGlmIG5vdCBnaXZlbiwgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSBpcyByYWlzZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2NhdGVnb3J5fXt1bmljaHJ9Ci0gIFJldHVybnMgdGhlIGdlbmVyYWwgY2F0ZWdvcnkgYXNzaWduZWQgdG8gdGhlIFVuaWNvZGUgY2hhcmFjdGVyCi0gIFx2YXJ7dW5pY2hyfSBhcyBzdHJpbmcuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2JpZGlyZWN0aW9uYWx9e3VuaWNocn0KLSAgUmV0dXJucyB0aGUgYmlkaXJlY3Rpb25hbCBjYXRlZ29yeSBhc3NpZ25lZCB0byB0aGUgVW5pY29kZSBjaGFyYWN0ZXIKLSAgXHZhcnt1bmljaHJ9IGFzIHN0cmluZy4gSWYgbm8gc3VjaCB2YWx1ZSBpcyBkZWZpbmVkLCBhbiBlbXB0eSBzdHJpbmcKLSAgaXMgcmV0dXJuZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2NvbWJpbmluZ317dW5pY2hyfQotICBSZXR1cm5zIHRoZSBjYW5vbmljYWwgY29tYmluaW5nIGNsYXNzIGFzc2lnbmVkIHRvIHRoZSBVbmljb2RlCi0gIGNoYXJhY3RlciBcdmFye3VuaWNocn0gYXMgaW50ZWdlci4gUmV0dXJucyBcY29kZXswfSBpZiBubyBjb21iaW5pbmcKLSAgY2xhc3MgaXMgZGVmaW5lZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZWFzdF9hc2lhbl93aWR0aH17dW5pY2hyfQotICBSZXR1cm5zIHRoZSBlYXN0IGFzaWFuIHdpZHRoIGFzc2lnbmVkIHRvIHRoZSBVbmljb2RlIGNoYXJhY3RlcgotICBcdmFye3VuaWNocn0gYXMgc3RyaW5nLgotXHZlcnNpb25hZGRlZHsyLjR9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e21pcnJvcmVkfXt1bmljaHJ9Ci0gIFJldHVybnMgdGhlIG1pcnJvcmVkIHByb3BlcnR5IGFzc2lnbmVkIHRvIHRoZSBVbmljb2RlIGNoYXJhY3RlcgotICBcdmFye3VuaWNocn0gYXMgaW50ZWdlci4gUmV0dXJucyBcY29kZXsxfSBpZiB0aGUgY2hhcmFjdGVyIGhhcyBiZWVuCi0gIGlkZW50aWZpZWQgYXMgYSBgYG1pcnJvcmVkJycgY2hhcmFjdGVyIGluIGJpZGlyZWN0aW9uYWwgdGV4dCwKLSAgXGNvZGV7MH0gb3RoZXJ3aXNlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtkZWNvbXBvc2l0aW9ufXt1bmljaHJ9Ci0gIFJldHVybnMgdGhlIGNoYXJhY3RlciBkZWNvbXBvc2l0aW9uIG1hcHBpbmcgYXNzaWduZWQgdG8gdGhlIFVuaWNvZGUKLSAgY2hhcmFjdGVyIFx2YXJ7dW5pY2hyfSBhcyBzdHJpbmcuIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBpbiBjYXNlCi0gIG5vIHN1Y2ggbWFwcGluZyBpcyBkZWZpbmVkLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtub3JtYWxpemV9e2Zvcm0sIHVuaXN0cn0KLQotUmV0dXJuIHRoZSBub3JtYWwgZm9ybSBcdmFye2Zvcm19IGZvciB0aGUgVW5pY29kZSBzdHJpbmcgXHZhcnt1bmlzdHJ9LgotVmFsaWQgdmFsdWVzIGZvciBcdmFye2Zvcm19IGFyZSAnTkZDJywgJ05GS0MnLCAnTkZEJywgYW5kICdORktEJy4KLQotVGhlIFVuaWNvZGUgc3RhbmRhcmQgZGVmaW5lcyB2YXJpb3VzIG5vcm1hbGl6YXRpb24gZm9ybXMgb2YgYSBVbmljb2RlCi1zdHJpbmcsIGJhc2VkIG9uIHRoZSBkZWZpbml0aW9uIG9mIGNhbm9uaWNhbCBlcXVpdmFsZW5jZSBhbmQKLWNvbXBhdGliaWxpdHkgZXF1aXZhbGVuY2UuIEluIFVuaWNvZGUsIHNldmVyYWwgY2hhcmFjdGVycyBjYW4gYmUKLWV4cHJlc3NlZCBpbiB2YXJpb3VzIHdheS4gRm9yIGV4YW1wbGUsIHRoZSBjaGFyYWN0ZXIgVSswMEM3IChMQVRJTgotQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEpIGNhbiBhbHNvIGJlIGV4cHJlc3NlZCBhcyB0aGUgc2VxdWVuY2UKLVUrMDA0MyAoTEFUSU4gQ0FQSVRBTCBMRVRURVIgQykgVSswMzI3IChDT01CSU5JTkcgQ0VESUxMQSkuCi0KLUZvciBlYWNoIGNoYXJhY3RlciwgdGhlcmUgYXJlIHR3byBub3JtYWwgZm9ybXM6IG5vcm1hbCBmb3JtIEMgYW5kCi1ub3JtYWwgZm9ybSBELiBOb3JtYWwgZm9ybSBEIChORkQpIGlzIGFsc28ga25vd24gYXMgY2Fub25pY2FsCi1kZWNvbXBvc2l0aW9uLCBhbmQgdHJhbnNsYXRlcyBlYWNoIGNoYXJhY3RlciBpbnRvIGl0cyBkZWNvbXBvc2VkIGZvcm0uCi1Ob3JtYWwgZm9ybSBDIChORkMpIGZpcnN0IGFwcGxpZXMgYSBjYW5vbmljYWwgZGVjb21wb3NpdGlvbiwgdGhlbgotY29tcG9zZXMgcHJlLWNvbWJpbmVkIGNoYXJhY3RlcnMgYWdhaW4uCi0KLUluIGFkZGl0aW9uIHRvIHRoZXNlIHR3byBmb3JtcywgdGhlcmUgYXJlIHR3byBhZGRpdGlvbmFsIG5vcm1hbCBmb3JtcwotYmFzZWQgb24gY29tcGF0aWJpbGl0eSBlcXVpdmFsZW5jZS4gSW4gVW5pY29kZSwgY2VydGFpbiBjaGFyYWN0ZXJzIGFyZQotc3VwcG9ydGVkIHdoaWNoIG5vcm1hbGx5IHdvdWxkIGJlIHVuaWZpZWQgd2l0aCBvdGhlciBjaGFyYWN0ZXJzLiBGb3IKLWV4YW1wbGUsIFUrMjE2MCAoUk9NQU4gTlVNRVJBTCBPTkUpIGlzIHJlYWxseSB0aGUgc2FtZSB0aGluZyBhcyBVKzAwNDkKLShMQVRJTiBDQVBJVEFMIExFVFRFUiBJKS4gSG93ZXZlciwgaXQgaXMgc3VwcG9ydGVkIGluIFVuaWNvZGUgZm9yCi1jb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgY2hhcmFjdGVyIHNldHMgKGUuZy4gZ2IyMzEyKS4KLQotVGhlIG5vcm1hbCBmb3JtIEtEIChORktEKSB3aWxsIGFwcGx5IHRoZSBjb21wYXRpYmlsaXR5IGRlY29tcG9zaXRpb24sCi1pLmUuIHJlcGxhY2UgYWxsIGNvbXBhdGliaWxpdHkgY2hhcmFjdGVycyB3aXRoIHRoZWlyIGVxdWl2YWxlbnRzLiBUaGUKLW5vcm1hbCBmb3JtIEtDIChORktDKSBmaXJzdCBhcHBsaWVzIHRoZSBjb21wYXRpYmlsaXR5IGRlY29tcG9zaXRpb24sCi1mb2xsb3dlZCBieSB0aGUgY2Fub25pY2FsIGNvbXBvc2l0aW9uLgotCi1cdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7ZnVuY2Rlc2N9Ci0KLUluIGFkZGl0aW9uLCB0aGUgbW9kdWxlIGV4cG9zZXMgdGhlIGZvbGxvd2luZyBjb25zdGFudDoKLQotXGJlZ2lue2RhdGFkZXNjfXt1bmlkYXRhX3ZlcnNpb259Ci1UaGUgdmVyc2lvbiBvZiB0aGUgVW5pY29kZSBkYXRhYmFzZSB1c2VkIGluIHRoaXMgbW9kdWxlLgotCi1cdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317dWNkXzNfMl8wfQotVGhpcyBpcyBhbiBvYmplY3QgdGhhdCBoYXMgdGhlIHNhbWUgbWV0aG9kcyBhcyB0aGUgZW50aXJlCi1tb2R1bGUsIGJ1dCB1c2VzIHRoZSBVbmljb2RlIGRhdGFiYXNlIHZlcnNpb24gMy4yIGluc3RlYWQsCi1mb3IgYXBwbGljYXRpb25zIHRoYXQgcmVxdWlyZSB0aGlzIHNwZWNpZmljIHZlcnNpb24gb2YKLXRoZSBVbmljb2RlIGRhdGFiYXNlIChzdWNoIGFzIElETkEpLgotCi1cdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7ZGF0YWRlc2N9Ci0KLUV4YW1wbGVzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gdW5pY29kZWRhdGEubG9va3VwKCdMRUZUIENVUkxZIEJSQUNLRVQnKQotdSd7JwotPj4+IHVuaWNvZGVkYXRhLm5hbWUodScvJykKLSdTT0xJRFVTJwotPj4+IHVuaWNvZGVkYXRhLmRlY2ltYWwodSc5JykKLTkKLT4+PiB1bmljb2RlZGF0YS5kZWNpbWFsKHUnYScpCi1UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KLVZhbHVlRXJyb3I6IG5vdCBhIGRlY2ltYWwKLT4+PiB1bmljb2RlZGF0YS5jYXRlZ29yeSh1J0EnKSAgIyAnTCdldHRlciwgJ3UncHBlcmNhc2UKLSdMdScgICAKLT4+PiB1bmljb2RlZGF0YS5iaWRpcmVjdGlvbmFsKHUnXHUwNjYwJykgIyAnQSdyYWJpYywgJ04ndW1iZXIKLSdBTicKLVxlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnVuaXR0ZXN0LnRleCBiL0RvYy9saWIvbGlidW5pdHRlc3QudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTE5OGM3Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlidW5pdHRlc3QudGV4CisrKyAvZGV2L251bGwKQEAgLTEsOTc4ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7dW5pdHRlc3R9IC0tLQotICAgICAgICAgVW5pdCB0ZXN0aW5nIGZyYW1ld29ya30KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e3VuaXR0ZXN0fQotXG1vZHVsZXN5bm9wc2lze1VuaXQgdGVzdGluZyBmcmFtZXdvcmsgZm9yIFB5dGhvbi59Ci1cbW9kdWxlYXV0aG9ye1N0ZXZlIFB1cmNlbGx9e3N0ZXBoZW5cdGV4dHVuZGVyc2NvcmV7fXB1cmNlbGxAeWFob28uY29tfQotXHNlY3Rpb25hdXRob3J7U3RldmUgUHVyY2VsbH17c3RlcGhlblx0ZXh0dW5kZXJzY29yZXt9cHVyY2VsbEB5YWhvby5jb219Ci1cc2VjdGlvbmF1dGhvcntGcmVkIEwuIERyYWtlLCBKci59e2ZkcmFrZUBhY20ub3JnfQotXHNlY3Rpb25hdXRob3J7UmF5bW9uZCBIZXR0aW5nZXJ9e3B5dGhvbkByY24uY29tfQotCi1cdmVyc2lvbmFkZGVkezIuMX0KLQotVGhlIFB5dGhvbiB1bml0IHRlc3RpbmcgZnJhbWV3b3JrLCBzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgYGBQeVVuaXQsJycgaXMKLWEgUHl0aG9uIGxhbmd1YWdlIHZlcnNpb24gb2YgSlVuaXQsIGJ5IEtlbnQgQmVjayBhbmQgRXJpY2ggR2FtbWEuCi1KVW5pdCBpcywgaW4gdHVybiwgYSBKYXZhIHZlcnNpb24gb2YgS2VudCdzIFNtYWxsdGFsayB0ZXN0aW5nCi1mcmFtZXdvcmsuICBFYWNoIGlzIHRoZSBkZSBmYWN0byBzdGFuZGFyZCB1bml0IHRlc3RpbmcgZnJhbWV3b3JrIGZvcgotaXRzIHJlc3BlY3RpdmUgbGFuZ3VhZ2UuCi0KLVxtb2R1bGV7dW5pdHRlc3R9IHN1cHBvcnRzIHRlc3QgYXV0b21hdGlvbiwgc2hhcmluZyBvZiBzZXR1cCBhbmQgc2h1dGRvd24KLWNvZGUgZm9yIHRlc3RzLCBhZ2dyZWdhdGlvbiBvZiB0ZXN0cyBpbnRvIGNvbGxlY3Rpb25zLCBhbmQgaW5kZXBlbmRlbmNlIG9mCi10aGUgdGVzdHMgZnJvbSB0aGUgcmVwb3J0aW5nIGZyYW1ld29yay4gIFRoZSBcbW9kdWxle3VuaXR0ZXN0fSBtb2R1bGUKLXByb3ZpZGVzIGNsYXNzZXMgdGhhdCBtYWtlIGl0IGVhc3kgdG8gc3VwcG9ydCB0aGVzZSBxdWFsaXRpZXMgZm9yIGEKLXNldCBvZiB0ZXN0cy4KLQotVG8gYWNoaWV2ZSB0aGlzLCBcbW9kdWxle3VuaXR0ZXN0fSBzdXBwb3J0cyBzb21lIGltcG9ydGFudCBjb25jZXB0czoKLQotXGJlZ2lue2RlZmluaXRpb25zfQotXHRlcm17dGVzdCBmaXh0dXJlfQotQSBcZGZue3Rlc3QgZml4dHVyZX0gcmVwcmVzZW50cyB0aGUgcHJlcGFyYXRpb24gbmVlZGVkIHRvIHBlcmZvcm0gb25lCi1vciBtb3JlIHRlc3RzLCBhbmQgYW55IGFzc29jaWF0ZSBjbGVhbnVwIGFjdGlvbnMuICBUaGlzIG1heSBpbnZvbHZlLAotZm9yIGV4YW1wbGUsIGNyZWF0aW5nIHRlbXBvcmFyeSBvciBwcm94eSBkYXRhYmFzZXMsIGRpcmVjdG9yaWVzLCBvcgotc3RhcnRpbmcgYSBzZXJ2ZXIgcHJvY2Vzcy4KLQotXHRlcm17dGVzdCBjYXNlfQotQSBcZGZue3Rlc3QgY2FzZX0gaXMgdGhlIHNtYWxsZXN0IHVuaXQgb2YgdGVzdGluZy4gIEl0IGNoZWNrcyBmb3IgYQotc3BlY2lmaWMgcmVzcG9uc2UgdG8gYSBwYXJ0aWN1bGFyIHNldCBvZiBpbnB1dHMuICBcbW9kdWxle3VuaXR0ZXN0fQotcHJvdmlkZXMgYSBiYXNlIGNsYXNzLCBcY2xhc3N7VGVzdENhc2V9LCB3aGljaCBtYXkgYmUgdXNlZCB0byBjcmVhdGUKLW5ldyB0ZXN0IGNhc2VzLgotCi1cdGVybXt0ZXN0IHN1aXRlfQotQSBcZGZue3Rlc3Qgc3VpdGV9IGlzIGEgY29sbGVjdGlvbiBvZiB0ZXN0IGNhc2VzLCB0ZXN0IHN1aXRlcywgb3IKLWJvdGguICBJdCBpcyB1c2VkIHRvIGFnZ3JlZ2F0ZSB0ZXN0cyB0aGF0IHNob3VsZCBiZSBleGVjdXRlZAotdG9nZXRoZXIuCi0KLVx0ZXJte3Rlc3QgcnVubmVyfQotQSBcZGZue3Rlc3QgcnVubmVyfSBpcyBhIGNvbXBvbmVudCB3aGljaCBvcmNoZXN0cmF0ZXMgdGhlIGV4ZWN1dGlvbiBvZgotdGVzdHMgYW5kIHByb3ZpZGVzIHRoZSBvdXRjb21lIHRvIHRoZSB1c2VyLiAgVGhlIHJ1bm5lciBtYXkgdXNlIGEKLWdyYXBoaWNhbCBpbnRlcmZhY2UsIGEgdGV4dHVhbCBpbnRlcmZhY2UsIG9yIHJldHVybiBhIHNwZWNpYWwgdmFsdWUgdG8KLWluZGljYXRlIHRoZSByZXN1bHRzIG9mIGV4ZWN1dGluZyB0aGUgdGVzdHMuCi1cZW5ke2RlZmluaXRpb25zfQotCi0KLVRoZSB0ZXN0IGNhc2UgYW5kIHRlc3QgZml4dHVyZSBjb25jZXB0cyBhcmUgc3VwcG9ydGVkIHRocm91Z2ggdGhlCi1cY2xhc3N7VGVzdENhc2V9IGFuZCBcY2xhc3N7RnVuY3Rpb25UZXN0Q2FzZX0gY2xhc3NlczsgdGhlIGZvcm1lcgotc2hvdWxkIGJlIHVzZWQgd2hlbiBjcmVhdGluZyBuZXcgdGVzdHMsIGFuZCB0aGUgbGF0dGVyIGNhbiBiZSB1c2VkIHdoZW4KLWludGVncmF0aW5nIGV4aXN0aW5nIHRlc3QgY29kZSB3aXRoIGEgXG1vZHVsZXt1bml0dGVzdH0tZHJpdmVuIGZyYW1ld29yay4KLVdoZW4gYnVpbGRpbmcgdGVzdCBmaXh0dXJlcyB1c2luZyBcY2xhc3N7VGVzdENhc2V9LCB0aGUgXG1ldGhvZHtzZXRVcCgpfQotYW5kIFxtZXRob2R7dGVhckRvd24oKX0gbWV0aG9kcyBjYW4gYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlCi1pbml0aWFsaXphdGlvbiBhbmQgY2xlYW51cCBmb3IgdGhlIGZpeHR1cmUuICBXaXRoCi1cY2xhc3N7RnVuY3Rpb25UZXN0Q2FzZX0sIGV4aXN0aW5nIGZ1bmN0aW9ucyBjYW4gYmUgcGFzc2VkIHRvIHRoZQotY29uc3RydWN0b3IgZm9yIHRoZXNlIHB1cnBvc2VzLiAgV2hlbiB0aGUgdGVzdCBpcyBydW4sIHRoZQotZml4dHVyZSBpbml0aWFsaXphdGlvbiBpcyBydW4gZmlyc3Q7IGlmIGl0IHN1Y2NlZWRzLCB0aGUgY2xlYW51cAotbWV0aG9kIGlzIHJ1biBhZnRlciB0aGUgdGVzdCBoYXMgYmVlbiBleGVjdXRlZCwgcmVnYXJkbGVzcyBvZiB0aGUKLW91dGNvbWUgb2YgdGhlIHRlc3QuICBFYWNoIGluc3RhbmNlIG9mIHRoZSBcY2xhc3N7VGVzdENhc2V9IHdpbGwgb25seQotYmUgdXNlZCB0byBydW4gYSBzaW5nbGUgdGVzdCBtZXRob2QsIHNvIGEgbmV3IGZpeHR1cmUgaXMgY3JlYXRlZCBmb3IKLWVhY2ggdGVzdC4KLQotVGVzdCBzdWl0ZXMgYXJlIGltcGxlbWVudGVkIGJ5IHRoZSBcY2xhc3N7VGVzdFN1aXRlfSBjbGFzcy4gIFRoaXMKLWNsYXNzIGFsbG93cyBpbmRpdmlkdWFsIHRlc3RzIGFuZCB0ZXN0IHN1aXRlcyB0byBiZSBhZ2dyZWdhdGVkOyB3aGVuCi10aGUgc3VpdGUgaXMgZXhlY3V0ZWQsIGFsbCB0ZXN0cyBhZGRlZCBkaXJlY3RseSB0byB0aGUgc3VpdGUgYW5kIGluCi1gYGNoaWxkJycgdGVzdCBzdWl0ZXMgYXJlIHJ1bi4KLQotQSB0ZXN0IHJ1bm5lciBpcyBhbiBvYmplY3QgdGhhdCBwcm92aWRlcyBhIHNpbmdsZSBtZXRob2QsCi1cbWV0aG9ke3J1bigpfSwgd2hpY2ggYWNjZXB0cyBhIFxjbGFzc3tUZXN0Q2FzZX0gb3IgXGNsYXNze1Rlc3RTdWl0ZX0KLW9iamVjdCBhcyBhIHBhcmFtZXRlciwgYW5kIHJldHVybnMgYSByZXN1bHQgb2JqZWN0LiAgVGhlIGNsYXNzCi1cY2xhc3N7VGVzdFJlc3VsdH0gaXMgcHJvdmlkZWQgZm9yIHVzZSBhcyB0aGUgcmVzdWx0IG9iamVjdC4KLVxtb2R1bGV7dW5pdHRlc3R9IHByb3ZpZGVzIHRoZSBcY2xhc3N7VGV4dFRlc3RSdW5uZXJ9IGFzIGFuIGV4YW1wbGUKLXRlc3QgcnVubmVyIHdoaWNoIHJlcG9ydHMgdGVzdCByZXN1bHRzIG9uIHRoZSBzdGFuZGFyZCBlcnJvciBzdHJlYW0gYnkKLWRlZmF1bHQuICBBbHRlcm5hdGUgcnVubmVycyBjYW4gYmUgaW1wbGVtZW50ZWQgZm9yIG90aGVyIGVudmlyb25tZW50cwotKHN1Y2ggYXMgZ3JhcGhpY2FsIGVudmlyb25tZW50cykgd2l0aG91dCBhbnkgbmVlZCB0byBkZXJpdmUgZnJvbSBhCi1zcGVjaWZpYyBjbGFzcy4KLQotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZW1vZHVsZXtkb2N0ZXN0fXtBbm90aGVyIHRlc3Qtc3VwcG9ydCBtb2R1bGUgd2l0aCBhIHZlcnkKLSAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbnQgZmxhdm9yLn0KLSAgXHNlZXRpdGxlW2h0dHA6Ly93d3cuWFByb2dyYW1taW5nLmNvbS90ZXN0ZnJhbS5odG1de1NpbXBsZSBTbWFsbHRhbGsKLSAgICAgICAgICAgIFRlc3Rpbmc6IFdpdGggUGF0dGVybnN9e0tlbnQgQmVjaydzIG9yaWdpbmFsIHBhcGVyIG9uCi0gICAgICAgICAgICB0ZXN0aW5nIGZyYW1ld29ya3MgdXNpbmcgdGhlIHBhdHRlcm4gc2hhcmVkIGJ5Ci0gICAgICAgICAgICBcbW9kdWxle3VuaXR0ZXN0fS59Ci1cZW5ke3NlZWFsc299Ci0KLQotXHN1YnNlY3Rpb257QmFzaWMgZXhhbXBsZSBcbGFiZWx7dW5pdHRlc3QtbWluaW1hbC1leGFtcGxlfX0KLQotVGhlIFxtb2R1bGV7dW5pdHRlc3R9IG1vZHVsZSBwcm92aWRlcyBhIHJpY2ggc2V0IG9mIHRvb2xzIGZvcgotY29uc3RydWN0aW5nIGFuZCBydW5uaW5nIHRlc3RzLiAgVGhpcyBzZWN0aW9uIGRlbW9uc3RyYXRlcyB0aGF0IGEKLXNtYWxsIHN1YnNldCBvZiB0aGUgdG9vbHMgc3VmZmljZSB0byBtZWV0IHRoZSBuZWVkcyBvZiBtb3N0IHVzZXJzLgotCi1IZXJlIGlzIGEgc2hvcnQgc2NyaXB0IHRvIHRlc3QgdGhyZWUgZnVuY3Rpb25zIGZyb20gdGhlCi1ccmVmbW9kdWxle3JhbmRvbX0gbW9kdWxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgcmFuZG9tCi1pbXBvcnQgdW5pdHRlc3QKLQotY2xhc3MgVGVzdFNlcXVlbmNlRnVuY3Rpb25zKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICAKLSAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIHNlbGYuc2VxID0gcmFuZ2UoMTApCi0KLSAgICBkZWYgdGVzdHNodWZmbGUoc2VsZik6Ci0gICAgICAgICMgbWFrZSBzdXJlIHRoZSBzaHVmZmxlZCBzZXF1ZW5jZSBkb2VzIG5vdCBsb3NlIGFueSBlbGVtZW50cwotICAgICAgICByYW5kb20uc2h1ZmZsZShzZWxmLnNlcSkKLSAgICAgICAgc2VsZi5zZXEuc29ydCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXEsIHJhbmdlKDEwKSkKLQotICAgIGRlZiB0ZXN0Y2hvaWNlKHNlbGYpOgotICAgICAgICBlbGVtZW50ID0gcmFuZG9tLmNob2ljZShzZWxmLnNlcSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGVsZW1lbnQgaW4gc2VsZi5zZXEpCi0KLSAgICBkZWYgdGVzdHNhbXBsZShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcmFuZG9tLnNhbXBsZSwgc2VsZi5zZXEsIDIwKQotICAgICAgICBmb3IgZWxlbWVudCBpbiByYW5kb20uc2FtcGxlKHNlbGYuc2VxLCA1KToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhlbGVtZW50IGluIHNlbGYuc2VxKQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIHVuaXR0ZXN0Lm1haW4oKQotXGVuZHt2ZXJiYXRpbX0KLQotQSB0ZXN0Y2FzZSBpcyBjcmVhdGVkIGJ5IHN1YmNsYXNzaW5nIFxjbGFzc3t1bml0dGVzdC5UZXN0Q2FzZX0uCi1UaGUgdGhyZWUgaW5kaXZpZHVhbCB0ZXN0cyBhcmUgZGVmaW5lZCB3aXRoIG1ldGhvZHMgd2hvc2UgbmFtZXMgc3RhcnQgd2l0aAotdGhlIGxldHRlcnMgXHNhbXB7dGVzdH0uICBUaGlzIG5hbWluZyBjb252ZW50aW9uIGluZm9ybXMgdGhlIHRlc3QgcnVubmVyCi1hYm91dCB3aGljaCBtZXRob2RzIHJlcHJlc2VudCB0ZXN0cy4KLQotVGhlIGNydXggb2YgZWFjaCB0ZXN0IGlzIGEgY2FsbCB0byBcbWV0aG9ke2Fzc2VydEVxdWFsKCl9IHRvCi1jaGVjayBmb3IgYW4gZXhwZWN0ZWQgcmVzdWx0OyBcbWV0aG9ke2Fzc2VydF8oKX0gdG8gdmVyaWZ5IGEgY29uZGl0aW9uOwotb3IgXG1ldGhvZHthc3NlcnRSYWlzZXMoKX0gdG8gdmVyaWZ5IHRoYXQgYW4gZXhwZWN0ZWQgZXhjZXB0aW9uIGdldHMKLXJhaXNlZC4gIFRoZXNlIG1ldGhvZHMgYXJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgXGtleXdvcmR7YXNzZXJ0fSBzdGF0ZW1lbnQKLXNvIHRoZSB0ZXN0IHJ1bm5lciBjYW4gYWNjdW11bGF0ZSBhbGwgdGVzdCByZXN1bHRzIGFuZCBwcm9kdWNlIGEgcmVwb3J0LgotCi1XaGVuIGEgXG1ldGhvZHtzZXRVcCgpfSBtZXRob2QgaXMgZGVmaW5lZCwgdGhlIHRlc3QgcnVubmVyIHdpbGwgcnVuIHRoYXQKLW1ldGhvZCBwcmlvciB0byBlYWNoIHRlc3QuICBMaWtld2lzZSwgaWYgYSBcbWV0aG9ke3RlYXJEb3duKCl9IG1ldGhvZCBpcwotZGVmaW5lZCwgdGhlIHRlc3QgcnVubmVyIHdpbGwgaW52b2tlIHRoYXQgbWV0aG9kIGFmdGVyIGVhY2ggdGVzdC4gIEluIHRoZQotZXhhbXBsZSwgXG1ldGhvZHtzZXRVcCgpfSB3YXMgdXNlZCB0byBjcmVhdGUgYSBmcmVzaCBzZXF1ZW5jZSBmb3IgZWFjaCB0ZXN0LgotCi1UaGUgZmluYWwgYmxvY2sgc2hvd3MgYSBzaW1wbGUgd2F5IHRvIHJ1biB0aGUgdGVzdHMuCi1cZnVuY3Rpb257dW5pdHRlc3QubWFpbigpfSBwcm92aWRlcyBhIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UgdG8gdGhlCi10ZXN0IHNjcmlwdC4gIFdoZW4gcnVuIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgdGhlIGFib3ZlIHNjcmlwdAotcHJvZHVjZXMgYW4gb3V0cHV0IHRoYXQgbG9va3MgbGlrZSB0aGlzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0uLi4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVJhbiAzIHRlc3RzIGluIDAuMDAwcwotCi1PSwotXGVuZHt2ZXJiYXRpbX0KLQotSW5zdGVhZCBvZiBcZnVuY3Rpb257dW5pdHRlc3QubWFpbigpfSwgdGhlcmUgYXJlIG90aGVyIHdheXMgdG8gcnVuIHRoZSB0ZXN0cwotd2l0aCBhIGZpbmVyIGxldmVsIG9mIGNvbnRyb2wsIGxlc3MgdGVyc2Ugb3V0cHV0LCBhbmQgbm8gcmVxdWlyZW1lbnQgdG8gYmUKLXJ1biBmcm9tIHRoZSBjb21tYW5kIGxpbmUuICBGb3IgZXhhbXBsZSwgdGhlIGxhc3QgdHdvIGxpbmVzIG1heSBiZSByZXBsYWNlZAotd2l0aDoKLQotXGJlZ2lue3ZlcmJhdGltfQotc3VpdGUgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFRlc3RTZXF1ZW5jZUZ1bmN0aW9ucykKLXVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKS5ydW4oc3VpdGUpCi1cZW5ke3ZlcmJhdGltfQotCi1SdW5uaW5nIHRoZSByZXZpc2VkIHNjcmlwdCBmcm9tIHRoZSBpbnRlcnByZXRlciBvciBhbm90aGVyIHNjcmlwdAotcHJvZHVjZXMgdGhlIGZvbGxvd2luZyBvdXRwdXQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXRlc3RjaG9pY2UgKF9fbWFpbl9fLlRlc3RTZXF1ZW5jZUZ1bmN0aW9ucykgLi4uIG9rCi10ZXN0c2FtcGxlIChfX21haW5fXy5UZXN0U2VxdWVuY2VGdW5jdGlvbnMpIC4uLiBvawotdGVzdHNodWZmbGUgKF9fbWFpbl9fLlRlc3RTZXF1ZW5jZUZ1bmN0aW9ucykgLi4uIG9rCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVJhbiAzIHRlc3RzIGluIDAuMTEwcwotCi1PSwotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGFib3ZlIGV4YW1wbGVzIHNob3cgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBcbW9kdWxle3VuaXR0ZXN0fSBmZWF0dXJlcwotd2hpY2ggYXJlIHN1ZmZpY2llbnQgdG8gbWVldCBtYW55IGV2ZXJ5ZGF5IHRlc3RpbmcgbmVlZHMuICBUaGUgcmVtYWluZGVyCi1vZiB0aGUgZG9jdW1lbnRhdGlvbiBleHBsb3JlcyB0aGUgZnVsbCBmZWF0dXJlIHNldCBmcm9tIGZpcnN0IHByaW5jaXBsZXMuCi0KLQotXHN1YnNlY3Rpb257T3JnYW5pemluZyB0ZXN0IGNvZGUKLSAgICAgICAgICAgIFxsYWJlbHtvcmdhbml6aW5nLXRlc3RzfX0KLQotVGhlIGJhc2ljIGJ1aWxkaW5nIGJsb2NrcyBvZiB1bml0IHRlc3RpbmcgYXJlIFxkZm57dGVzdCBjYXNlc30gLS0tCi1zaW5nbGUgc2NlbmFyaW9zIHRoYXQgbXVzdCBiZSBzZXQgdXAgYW5kIGNoZWNrZWQgZm9yIGNvcnJlY3RuZXNzLiAgSW4KLVxtb2R1bGV7dW5pdHRlc3R9LCB0ZXN0IGNhc2VzIGFyZSByZXByZXNlbnRlZCBieSBpbnN0YW5jZXMgb2YKLVxtb2R1bGV7dW5pdHRlc3R9J3MgXGNsYXNze1Rlc3RDYXNlfSBjbGFzcy4gVG8gbWFrZQoteW91ciBvd24gdGVzdCBjYXNlcyB5b3UgbXVzdCB3cml0ZSBzdWJjbGFzc2VzIG9mIFxjbGFzc3tUZXN0Q2FzZX0sIG9yCi11c2UgXGNsYXNze0Z1bmN0aW9uVGVzdENhc2V9LgotCi1BbiBpbnN0YW5jZSBvZiBhIFxjbGFzc3tUZXN0Q2FzZX0tZGVyaXZlZCBjbGFzcyBpcyBhbiBvYmplY3QgdGhhdCBjYW4KLWNvbXBsZXRlbHkgcnVuIGEgc2luZ2xlIHRlc3QgbWV0aG9kLCB0b2dldGhlciB3aXRoIG9wdGlvbmFsIHNldC11cAotYW5kIHRpZHktdXAgY29kZS4KLQotVGhlIHRlc3RpbmcgY29kZSBvZiBhIFxjbGFzc3tUZXN0Q2FzZX0gaW5zdGFuY2Ugc2hvdWxkIGJlIGVudGlyZWx5Ci1zZWxmIGNvbnRhaW5lZCwgc3VjaCB0aGF0IGl0IGNhbiBiZSBydW4gZWl0aGVyIGluIGlzb2xhdGlvbiBvciBpbgotYXJiaXRyYXJ5IGNvbWJpbmF0aW9uIHdpdGggYW55IG51bWJlciBvZiBvdGhlciB0ZXN0IGNhc2VzLgotCi1UaGUgc2ltcGxlc3QgXGNsYXNze1Rlc3RDYXNlfSBzdWJjbGFzcyB3aWxsIHNpbXBseSBvdmVycmlkZSB0aGUKLVxtZXRob2R7cnVuVGVzdCgpfSBtZXRob2QgaW4gb3JkZXIgdG8gcGVyZm9ybSBzcGVjaWZpYyB0ZXN0aW5nIGNvZGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCB1bml0dGVzdAotCi1jbGFzcyBEZWZhdWx0V2lkZ2V0U2l6ZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBkZWYgcnVuVGVzdChzZWxmKToKLSAgICAgICAgd2lkZ2V0ID0gV2lkZ2V0KCdUaGUgd2lkZ2V0JykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3aWRnZXQuc2l6ZSgpLCAoNTAsIDUwKSwgJ2luY29ycmVjdCBkZWZhdWx0IHNpemUnKQotXGVuZHt2ZXJiYXRpbX0KLQotTm90ZSB0aGF0IGluIG9yZGVyIHRvIHRlc3Qgc29tZXRoaW5nLCB3ZSB1c2UgdGhlIG9uZSBvZiB0aGUKLVxtZXRob2R7YXNzZXJ0KigpfSBvciBcbWV0aG9ke2ZhaWwqKCl9IG1ldGhvZHMgcHJvdmlkZWQgYnkgdGhlCi1cY2xhc3N7VGVzdENhc2V9IGJhc2UgY2xhc3MuICBJZiB0aGUgdGVzdCBmYWlscywgYW4gZXhjZXB0aW9uIHdpbGwgYmUKLXJhaXNlZCwgYW5kIFxtb2R1bGV7dW5pdHRlc3R9IHdpbGwgaWRlbnRpZnkgdGhlIHRlc3QgY2FzZSBhcyBhCi1cZGZue2ZhaWx1cmV9LiAgQW55IG90aGVyIGV4Y2VwdGlvbnMgd2lsbCBiZSB0cmVhdGVkIGFzIFxkZm57ZXJyb3JzfS4KLVRoaXMgaGVscHMgeW91IGlkZW50aWZ5IHdoZXJlIHRoZSBwcm9ibGVtIGlzOiBcZGZue2ZhaWx1cmVzfSBhcmUgY2F1c2VkIGJ5Ci1pbmNvcnJlY3QgcmVzdWx0cyAtIGEgNSB3aGVyZSB5b3UgZXhwZWN0ZWQgYSA2LiBcZGZue0Vycm9yc30gYXJlIGNhdXNlZCBieQotaW5jb3JyZWN0IGNvZGUgLSBlLmcuLCBhIFxleGNlcHRpb257VHlwZUVycm9yfSBjYXVzZWQgYnkgYW4gaW5jb3JyZWN0Ci1mdW5jdGlvbiBjYWxsLgotCi1UaGUgd2F5IHRvIHJ1biBhIHRlc3QgY2FzZSB3aWxsIGJlIGRlc2NyaWJlZCBsYXRlci4gIEZvciBub3csIG5vdGUKLXRoYXQgdG8gY29uc3RydWN0IGFuIGluc3RhbmNlIG9mIHN1Y2ggYSB0ZXN0IGNhc2UsIHdlIGNhbGwgaXRzCi1jb25zdHJ1Y3RvciB3aXRob3V0IGFyZ3VtZW50czoKLQotXGJlZ2lue3ZlcmJhdGltfQotdGVzdENhc2UgPSBEZWZhdWx0V2lkZ2V0U2l6ZVRlc3RDYXNlKCkKLVxlbmR7dmVyYmF0aW19Ci0KLU5vdywgc3VjaCB0ZXN0IGNhc2VzIGNhbiBiZSBudW1lcm91cywgYW5kIHRoZWlyIHNldC11cCBjYW4gYmUKLXJlcGV0aXRpdmUuICBJbiB0aGUgYWJvdmUgY2FzZSwgY29uc3RydWN0aW5nIGEgXGNsYXNze1dpZGdldH0gaW4gZWFjaCBvZgotMTAwIFdpZGdldCB0ZXN0IGNhc2Ugc3ViY2xhc3NlcyB3b3VsZCBtZWFuIHVuc2lnaHRseSBkdXBsaWNhdGlvbi4KLQotTHVja2lseSwgd2UgY2FuIGZhY3RvciBvdXQgc3VjaCBzZXQtdXAgY29kZSBieSBpbXBsZW1lbnRpbmcgYSBtZXRob2QKLWNhbGxlZCBcbWV0aG9ke3NldFVwKCl9LCB3aGljaCB0aGUgdGVzdGluZyBmcmFtZXdvcmsgd2lsbAotYXV0b21hdGljYWxseSBjYWxsIGZvciB1cyB3aGVuIHdlIHJ1biB0aGUgdGVzdDoKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IHVuaXR0ZXN0Ci0KLWNsYXNzIFNpbXBsZVdpZGdldFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIHNlbGYud2lkZ2V0ID0gV2lkZ2V0KCdUaGUgd2lkZ2V0JykKLQotY2xhc3MgRGVmYXVsdFdpZGdldFNpemVUZXN0Q2FzZShTaW1wbGVXaWRnZXRUZXN0Q2FzZSk6Ci0gICAgZGVmIHJ1blRlc3Qoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzZWxmLndpZGdldC5zaXplKCkgPT0gKDUwLDUwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdpbmNvcnJlY3QgZGVmYXVsdCBzaXplJykKLQotY2xhc3MgV2lkZ2V0UmVzaXplVGVzdENhc2UoU2ltcGxlV2lkZ2V0VGVzdENhc2UpOgotICAgIGRlZiBydW5UZXN0KHNlbGYpOgotICAgICAgICBzZWxmLndpZGdldC5yZXNpemUoMTAwLDE1MCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHNlbGYud2lkZ2V0LnNpemUoKSA9PSAoMTAwLDE1MCksCi0gICAgICAgICAgICAgICAgICAgICAgICAnd3Jvbmcgc2l6ZSBhZnRlciByZXNpemUnKQotXGVuZHt2ZXJiYXRpbX0KLQotSWYgdGhlIFxtZXRob2R7c2V0VXAoKX0gbWV0aG9kIHJhaXNlcyBhbiBleGNlcHRpb24gd2hpbGUgdGhlIHRlc3QgaXMKLXJ1bm5pbmcsIHRoZSBmcmFtZXdvcmsgd2lsbCBjb25zaWRlciB0aGUgdGVzdCB0byBoYXZlIHN1ZmZlcmVkIGFuCi1lcnJvciwgYW5kIHRoZSBcbWV0aG9ke3J1blRlc3QoKX0gbWV0aG9kIHdpbGwgbm90IGJlIGV4ZWN1dGVkLgotCi1TaW1pbGFybHksIHdlIGNhbiBwcm92aWRlIGEgXG1ldGhvZHt0ZWFyRG93bigpfSBtZXRob2QgdGhhdCB0aWRpZXMgdXAKLWFmdGVyIHRoZSBcbWV0aG9ke3J1blRlc3QoKX0gbWV0aG9kIGhhcyBiZWVuIHJ1bjoKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IHVuaXR0ZXN0Ci0KLWNsYXNzIFNpbXBsZVdpZGdldFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIHNlbGYud2lkZ2V0ID0gV2lkZ2V0KCdUaGUgd2lkZ2V0JykKLQotICAgIGRlZiB0ZWFyRG93bihzZWxmKToKLSAgICAgICAgc2VsZi53aWRnZXQuZGlzcG9zZSgpCi0gICAgICAgIHNlbGYud2lkZ2V0ID0gTm9uZQotXGVuZHt2ZXJiYXRpbX0KLQotSWYgXG1ldGhvZHtzZXRVcCgpfSBzdWNjZWVkZWQsIHRoZSBcbWV0aG9ke3RlYXJEb3duKCl9IG1ldGhvZCB3aWxsIGJlCi1ydW4gd2hldGhlciBcbWV0aG9ke3J1blRlc3QoKX0gc3VjY2VlZGVkIG9yIG5vdC4KLQotU3VjaCBhIHdvcmtpbmcgZW52aXJvbm1lbnQgZm9yIHRoZSB0ZXN0aW5nIGNvZGUgaXMgY2FsbGVkIGEKLVxkZm57Zml4dHVyZX0uCi0KLU9mdGVuLCBtYW55IHNtYWxsIHRlc3QgY2FzZXMgd2lsbCB1c2UgdGhlIHNhbWUgZml4dHVyZS4gIEluIHRoaXMgY2FzZSwKLXdlIHdvdWxkIGVuZCB1cCBzdWJjbGFzc2luZyBcY2xhc3N7U2ltcGxlV2lkZ2V0VGVzdENhc2V9IGludG8gbWFueQotc21hbGwgb25lLW1ldGhvZCBjbGFzc2VzIHN1Y2ggYXMKLVxjbGFzc3tEZWZhdWx0V2lkZ2V0U2l6ZVRlc3RDYXNlfS4gIFRoaXMgaXMgdGltZS1jb25zdW1pbmcgYW5kCi0KLWRpc2NvdXJhZ2luZywgc28gaW4gdGhlIHNhbWUgdmVpbiBhcyBKVW5pdCwgXG1vZHVsZXt1bml0dGVzdH0gcHJvdmlkZXMKLWEgc2ltcGxlciBtZWNoYW5pc206Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCB1bml0dGVzdAotCi1jbGFzcyBXaWRnZXRUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBzZWxmLndpZGdldCA9IFdpZGdldCgnVGhlIHdpZGdldCcpCi0KLSAgICBkZWYgdGVhckRvd24oc2VsZik6Ci0gICAgICAgIHNlbGYud2lkZ2V0LmRpc3Bvc2UoKQotICAgICAgICBzZWxmLndpZGdldCA9IE5vbmUKLQotICAgIGRlZiB0ZXN0RGVmYXVsdFNpemUoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzZWxmLndpZGdldC5zaXplKCkgPT0gKDUwLDUwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdpbmNvcnJlY3QgZGVmYXVsdCBzaXplJykKLQotICAgIGRlZiB0ZXN0UmVzaXplKHNlbGYpOgotICAgICAgICBzZWxmLndpZGdldC5yZXNpemUoMTAwLDE1MCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHNlbGYud2lkZ2V0LnNpemUoKSA9PSAoMTAwLDE1MCksCi0gICAgICAgICAgICAgICAgICAgICAgICAnd3Jvbmcgc2l6ZSBhZnRlciByZXNpemUnKQotXGVuZHt2ZXJiYXRpbX0KLQotSGVyZSB3ZSBoYXZlIG5vdCBwcm92aWRlZCBhIFxtZXRob2R7cnVuVGVzdCgpfSBtZXRob2QsIGJ1dCBoYXZlCi1pbnN0ZWFkIHByb3ZpZGVkIHR3byBkaWZmZXJlbnQgdGVzdCBtZXRob2RzLiAgQ2xhc3MgaW5zdGFuY2VzIHdpbGwgbm93Ci1lYWNoIHJ1biBvbmUgb2YgdGhlIFxtZXRob2R7dGVzdCooKX0gIG1ldGhvZHMsIHdpdGggXGNvZGV7c2VsZi53aWRnZXR9Ci1jcmVhdGVkIGFuZCBkZXN0cm95ZWQgc2VwYXJhdGVseSBmb3IgZWFjaCBpbnN0YW5jZS4gIFdoZW4gY3JlYXRpbmcgYW4KLWluc3RhbmNlIHdlIG11c3Qgc3BlY2lmeSB0aGUgdGVzdCBtZXRob2QgaXQgaXMgdG8gcnVuLiAgV2UgZG8gdGhpcyBieQotcGFzc2luZyB0aGUgbWV0aG9kIG5hbWUgaW4gdGhlIGNvbnN0cnVjdG9yOgotCi1cYmVnaW57dmVyYmF0aW19Ci1kZWZhdWx0U2l6ZVRlc3RDYXNlID0gV2lkZ2V0VGVzdENhc2UoJ3Rlc3REZWZhdWx0U2l6ZScpCi1yZXNpemVUZXN0Q2FzZSA9IFdpZGdldFRlc3RDYXNlKCd0ZXN0UmVzaXplJykKLVxlbmR7dmVyYmF0aW19Ci0KLVRlc3QgY2FzZSBpbnN0YW5jZXMgYXJlIGdyb3VwZWQgdG9nZXRoZXIgYWNjb3JkaW5nIHRvIHRoZSBmZWF0dXJlcwotdGhleSB0ZXN0LiAgXG1vZHVsZXt1bml0dGVzdH0gcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIHRoaXM6IHRoZQotXGRmbnt0ZXN0IHN1aXRlfSwgcmVwcmVzZW50ZWQgYnkgXG1vZHVsZXt1bml0dGVzdH0ncyBcY2xhc3N7VGVzdFN1aXRlfQotY2xhc3M6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXdpZGdldFRlc3RTdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCi13aWRnZXRUZXN0U3VpdGUuYWRkVGVzdChXaWRnZXRUZXN0Q2FzZSgndGVzdERlZmF1bHRTaXplJykpCi13aWRnZXRUZXN0U3VpdGUuYWRkVGVzdChXaWRnZXRUZXN0Q2FzZSgndGVzdFJlc2l6ZScpKQotXGVuZHt2ZXJiYXRpbX0KLQotRm9yIHRoZSBlYXNlIG9mIHJ1bm5pbmcgdGVzdHMsIGFzIHdlIHdpbGwgc2VlIGxhdGVyLCBpdCBpcyBhIGdvb2QKLWlkZWEgdG8gcHJvdmlkZSBpbiBlYWNoIHRlc3QgbW9kdWxlIGEgY2FsbGFibGUgb2JqZWN0IHRoYXQgcmV0dXJucyBhCi1wcmUtYnVpbHQgdGVzdCBzdWl0ZToKLQotXGJlZ2lue3ZlcmJhdGltfQotZGVmIHN1aXRlKCk6Ci0gICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQotICAgIHN1aXRlLmFkZFRlc3QoV2lkZ2V0VGVzdENhc2UoJ3Rlc3REZWZhdWx0U2l6ZScpKQotICAgIHN1aXRlLmFkZFRlc3QoV2lkZ2V0VGVzdENhc2UoJ3Rlc3RSZXNpemUnKSkKLSAgICByZXR1cm4gc3VpdGUKLVxlbmR7dmVyYmF0aW19Ci0KLW9yIGV2ZW46Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWRlZiBzdWl0ZSgpOgotICAgIHRlc3RzID0gWyd0ZXN0RGVmYXVsdFNpemUnLCAndGVzdFJlc2l6ZSddCi0KLSAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKG1hcChXaWRnZXRUZXN0Q2FzZSwgdGVzdHMpKQotXGVuZHt2ZXJiYXRpbX0KLQotU2luY2UgaXQgaXMgYSBjb21tb24gcGF0dGVybiB0byBjcmVhdGUgYSBcY2xhc3N7VGVzdENhc2V9IHN1YmNsYXNzCi13aXRoIG1hbnkgc2ltaWxhcmx5IG5hbWVkIHRlc3QgZnVuY3Rpb25zLCBcbW9kdWxle3VuaXR0ZXN0fSBwcm92aWRlcyBhCi1cY2xhc3N7VGVzdExvYWRlcn0gY2xhc3MgdGhhdCBjYW4gYmUgdXNlZCB0byBhdXRvbWF0ZSB0aGUgcHJvY2VzcyBvZgotY3JlYXRpbmcgYSB0ZXN0IHN1aXRlIGFuZCBwb3B1bGF0aW5nIGl0IHdpdGggaW5kaXZpZHVhbCB0ZXN0cy4KLUZvciBleGFtcGxlLAotCi1cYmVnaW57dmVyYmF0aW19Ci1zdWl0ZSA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKS5sb2FkVGVzdHNGcm9tVGVzdENhc2UoV2lkZ2V0VGVzdENhc2UpCi1cZW5ke3ZlcmJhdGltfQotCi13aWxsIGNyZWF0ZSBhIHRlc3Qgc3VpdGUgdGhhdCB3aWxsIHJ1bgotXGNvZGV7V2lkZ2V0VGVzdENhc2UudGVzdERlZmF1bHRTaXplKCl9IGFuZCBcY29kZXtXaWRnZXRUZXN0Q2FzZS50ZXN0UmVzaXplfS4KLVxjbGFzc3tUZXN0TG9hZGVyfSB1c2VzIHRoZSBcY29kZXsndGVzdCd9IG1ldGhvZCBuYW1lIHByZWZpeCB0byBpZGVudGlmeQotdGVzdCBtZXRob2RzIGF1dG9tYXRpY2FsbHkuCi0KLU5vdGUgdGhhdCB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIHZhcmlvdXMgdGVzdCBjYXNlcyB3aWxsIGJlIHJ1biBpcwotZGV0ZXJtaW5lZCBieSBzb3J0aW5nIHRoZSB0ZXN0IGZ1bmN0aW9uIG5hbWVzIHdpdGggdGhlIGJ1aWx0LWluCi1cZnVuY3Rpb257Y21wKCl9IGZ1bmN0aW9uLgotCi1PZnRlbiBpdCBpcyBkZXNpcmFibGUgdG8gZ3JvdXAgc3VpdGVzIG9mIHRlc3QgY2FzZXMgdG9nZXRoZXIsIHNvIGFzIHRvCi1ydW4gdGVzdHMgZm9yIHRoZSB3aG9sZSBzeXN0ZW0gYXQgb25jZS4gIFRoaXMgaXMgZWFzeSwgc2luY2UKLVxjbGFzc3tUZXN0U3VpdGV9IGluc3RhbmNlcyBjYW4gYmUgYWRkZWQgdG8gYSBcY2xhc3N7VGVzdFN1aXRlfSBqdXN0Ci1hcyBcY2xhc3N7VGVzdENhc2V9IGluc3RhbmNlcyBjYW4gYmUgYWRkZWQgdG8gYSBcY2xhc3N7VGVzdFN1aXRlfToKLQotXGJlZ2lue3ZlcmJhdGltfQotc3VpdGUxID0gbW9kdWxlMS5UaGVUZXN0U3VpdGUoKQotc3VpdGUyID0gbW9kdWxlMi5UaGVUZXN0U3VpdGUoKQotYWxsdGVzdHMgPSB1bml0dGVzdC5UZXN0U3VpdGUoW3N1aXRlMSwgc3VpdGUyXSkKLVxlbmR7dmVyYmF0aW19Ci0KLVlvdSBjYW4gcGxhY2UgdGhlIGRlZmluaXRpb25zIG9mIHRlc3QgY2FzZXMgYW5kIHRlc3Qgc3VpdGVzIGluIHRoZQotc2FtZSBtb2R1bGVzIGFzIHRoZSBjb2RlIHRoZXkgYXJlIHRvIHRlc3QgKHN1Y2ggYXMgXGZpbGV7d2lkZ2V0LnB5fSksCi1idXQgdGhlcmUgYXJlIHNldmVyYWwgYWR2YW50YWdlcyB0byBwbGFjaW5nIHRoZSB0ZXN0IGNvZGUgaW4gYQotc2VwYXJhdGUgbW9kdWxlLCBzdWNoIGFzIFxmaWxle3Rlc3Rfd2lkZ2V0LnB5fToKLQotXGJlZ2lue2l0ZW1pemV9Ci0gIFxpdGVtIFRoZSB0ZXN0IG1vZHVsZSBjYW4gYmUgcnVuIHN0YW5kYWxvbmUgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgotICBcaXRlbSBUaGUgdGVzdCBjb2RlIGNhbiBtb3JlIGVhc2lseSBiZSBzZXBhcmF0ZWQgZnJvbSBzaGlwcGVkIGNvZGUuCi0gIFxpdGVtIFRoZXJlIGlzIGxlc3MgdGVtcHRhdGlvbiB0byBjaGFuZ2UgdGVzdCBjb2RlIHRvIGZpdCB0aGUgY29kZQotICAgICAgICBpdCB0ZXN0cyB3aXRob3V0IGEgZ29vZCByZWFzb24uCi0gIFxpdGVtIFRlc3QgY29kZSBzaG91bGQgYmUgbW9kaWZpZWQgbXVjaCBsZXNzIGZyZXF1ZW50bHkgdGhhbiB0aGUKLSAgICAgICAgY29kZSBpdCB0ZXN0cy4KLSAgXGl0ZW0gVGVzdGVkIGNvZGUgY2FuIGJlIHJlZmFjdG9yZWQgbW9yZSBlYXNpbHkuCi0gIFxpdGVtIFRlc3RzIGZvciBtb2R1bGVzIHdyaXR0ZW4gaW4gQyBtdXN0IGJlIGluIHNlcGFyYXRlIG1vZHVsZXMKLSAgICAgICAgYW55d2F5LCBzbyB3aHkgbm90IGJlIGNvbnNpc3RlbnQ/Ci0gIFxpdGVtIElmIHRoZSB0ZXN0aW5nIHN0cmF0ZWd5IGNoYW5nZXMsIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hhbmdlCi0gICAgICAgIHRoZSBzb3VyY2UgY29kZS4KLVxlbmR7aXRlbWl6ZX0KLQotCi1cc3Vic2VjdGlvbntSZS11c2luZyBvbGQgdGVzdCBjb2RlCi0gICAgICAgICAgICBcbGFiZWx7bGVnYWN5LXVuaXQtdGVzdHN9fQotCi1Tb21lIHVzZXJzIHdpbGwgZmluZCB0aGF0IHRoZXkgaGF2ZSBleGlzdGluZyB0ZXN0IGNvZGUgdGhhdCB0aGV5IHdvdWxkCi1saWtlIHRvIHJ1biBmcm9tIFxtb2R1bGV7dW5pdHRlc3R9LCB3aXRob3V0IGNvbnZlcnRpbmcgZXZlcnkgb2xkIHRlc3QKLWZ1bmN0aW9uIHRvIGEgXGNsYXNze1Rlc3RDYXNlfSBzdWJjbGFzcy4KLQotRm9yIHRoaXMgcmVhc29uLCBcbW9kdWxle3VuaXR0ZXN0fSBwcm92aWRlcyBhIFxjbGFzc3tGdW5jdGlvblRlc3RDYXNlfQotY2xhc3MuICBUaGlzIHN1YmNsYXNzIG9mIFxjbGFzc3tUZXN0Q2FzZX0gY2FuIGJlIHVzZWQgdG8gd3JhcCBhbiBleGlzdGluZwotdGVzdCBmdW5jdGlvbi4gIFNldC11cCBhbmQgdGVhci1kb3duIGZ1bmN0aW9ucyBjYW4gYWxzbyBiZSBwcm92aWRlZC4KLQotR2l2ZW4gdGhlIGZvbGxvd2luZyB0ZXN0IGZ1bmN0aW9uOgotCi1cYmVnaW57dmVyYmF0aW19Ci1kZWYgdGVzdFNvbWV0aGluZygpOgotICAgIHNvbWV0aGluZyA9IG1ha2VTb21ldGhpbmcoKQotICAgIGFzc2VydCBzb21ldGhpbmcubmFtZSBpcyBub3QgTm9uZQotICAgICMgLi4uCi1cZW5ke3ZlcmJhdGltfQotCi1vbmUgY2FuIGNyZWF0ZSBhbiBlcXVpdmFsZW50IHRlc3QgY2FzZSBpbnN0YW5jZSBhcyBmb2xsb3dzOgotCi1cYmVnaW57dmVyYmF0aW19Ci10ZXN0Y2FzZSA9IHVuaXR0ZXN0LkZ1bmN0aW9uVGVzdENhc2UodGVzdFNvbWV0aGluZykKLVxlbmR7dmVyYmF0aW19Ci0KLUlmIHRoZXJlIGFyZSBhZGRpdGlvbmFsIHNldC11cCBhbmQgdGVhci1kb3duIG1ldGhvZHMgdGhhdCBzaG91bGQgYmUKLWNhbGxlZCBhcyBwYXJ0IG9mIHRoZSB0ZXN0IGNhc2UncyBvcGVyYXRpb24sIHRoZXkgY2FuIGFsc28gYmUgcHJvdmlkZWQKLWxpa2Ugc286Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXRlc3RjYXNlID0gdW5pdHRlc3QuRnVuY3Rpb25UZXN0Q2FzZSh0ZXN0U29tZXRoaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFVwPW1ha2VTb21ldGhpbmdEQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFyRG93bj1kZWxldGVTb21ldGhpbmdEQikKLVxlbmR7dmVyYmF0aW19Ci0KLVRvIG1ha2UgbWlncmF0aW5nIGV4aXN0aW5nIHRlc3Qgc3VpdGVzIGVhc2llciwgXG1vZHVsZXt1bml0dGVzdH0KLXN1cHBvcnRzIHRlc3RzIHJhaXNpbmcgXGV4Y2VwdGlvbntBc3NlcnRpb25FcnJvcn0gdG8gaW5kaWNhdGUgdGVzdCBmYWlsdXJlLgotSG93ZXZlciwgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgdXNlIHRoZSBleHBsaWNpdAotXG1ldGhvZHtUZXN0Q2FzZS5mYWlsKigpfSBhbmQgXG1ldGhvZHtUZXN0Q2FzZS5hc3NlcnQqKCl9IG1ldGhvZHMgaW5zdGVhZCwKLWFzIGZ1dHVyZSB2ZXJzaW9ucyBvZiBcbW9kdWxle3VuaXR0ZXN0fSBtYXkgdHJlYXQgXGV4Y2VwdGlvbntBc3NlcnRpb25FcnJvcn0KLWRpZmZlcmVudGx5LgotCi1cbm90ZXtFdmVuIHRob3VnaCBcY2xhc3N7RnVuY3Rpb25UZXN0Q2FzZX0gY2FuIGJlIHVzZWQgdG8gcXVpY2tseSBjb252ZXJ0Ci1hbiBleGlzdGluZyB0ZXN0IGJhc2Ugb3ZlciB0byBhIFxtb2R1bGV7dW5pdHRlc3R9LWJhc2VkIHN5c3RlbSwgdGhpcwotYXBwcm9hY2ggaXMgbm90IHJlY29tbWVuZGVkLiAgVGFraW5nIHRoZSB0aW1lIHRvIHNldCB1cCBwcm9wZXIKLVxjbGFzc3tUZXN0Q2FzZX0gc3ViY2xhc3NlcyB3aWxsIG1ha2UgZnV0dXJlIHRlc3QgcmVmYWN0b3JpbmdzIGluZmluaXRlbHkKLWVhc2llci59Ci0KLQotCi1cc3Vic2VjdGlvbntDbGFzc2VzIGFuZCBmdW5jdGlvbnMKLSAgICAgICAgICAgIFxsYWJlbHt1bml0dGVzdC1jb250ZW50c319Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1Rlc3RDYXNlfXtcb3B0aW9uYWx7bWV0aG9kTmFtZX19Ci0gIEluc3RhbmNlcyBvZiB0aGUgXGNsYXNze1Rlc3RDYXNlfSBjbGFzcyByZXByZXNlbnQgdGhlIHNtYWxsZXN0Ci0gIHRlc3RhYmxlIHVuaXRzIGluIHRoZSBcbW9kdWxle3VuaXR0ZXN0fSB1bml2ZXJzZS4gIFRoaXMgY2xhc3MgaXMKLSAgaW50ZW5kZWQgdG8gYmUgdXNlZCBhcyBhIGJhc2UgY2xhc3MsIHdpdGggc3BlY2lmaWMgdGVzdHMgYmVpbmcKLSAgaW1wbGVtZW50ZWQgYnkgY29uY3JldGUgc3ViY2xhc3Nlcy4gIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUKLSAgaW50ZXJmYWNlIG5lZWRlZCBieSB0aGUgdGVzdCBydW5uZXIgdG8gYWxsb3cgaXQgdG8gZHJpdmUgdGhlCi0gIHRlc3QsIGFuZCBtZXRob2RzIHRoYXQgdGhlIHRlc3QgY29kZSBjYW4gdXNlIHRvIGNoZWNrIGZvciBhbmQKLSAgcmVwb3J0IHZhcmlvdXMga2luZHMgb2YgZmFpbHVyZS4KLSAgCi0gIEVhY2ggaW5zdGFuY2Ugb2YgXGNsYXNze1Rlc3RDYXNlfSB3aWxsIHJ1biBhIHNpbmdsZSB0ZXN0IG1ldGhvZDoKLSAgdGhlIG1ldGhvZCBuYW1lZCBcdmFye21ldGhvZE5hbWV9LiAgSWYgeW91IHJlbWVtYmVyLCB3ZSBoYWQgYW4KLSAgZWFybGllciBleGFtcGxlIHRoYXQgd2VudCBzb21ldGhpbmcgbGlrZSB0aGlzOgotICAKLSAgXGJlZ2lue3ZlcmJhdGltfQotICBkZWYgc3VpdGUoKToKLSAgICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKLSAgICAgIHN1aXRlLmFkZFRlc3QoV2lkZ2V0VGVzdENhc2UoJ3Rlc3REZWZhdWx0U2l6ZScpKQotICAgICAgc3VpdGUuYWRkVGVzdChXaWRnZXRUZXN0Q2FzZSgndGVzdFJlc2l6ZScpKQotICAgICAgcmV0dXJuIHN1aXRlCi0gIFxlbmR7dmVyYmF0aW19Ci0gIAotICBIZXJlLCB3ZSBjcmVhdGUgdHdvIGluc3RhbmNlcyBvZiBcY2xhc3N7V2lkZ2V0VGVzdENhc2V9LCBlYWNoIG9mCi0gIHdoaWNoIHJ1bnMgYSBzaW5nbGUgdGVzdC4KLSAgCi0gIFx2YXJ7bWV0aG9kTmFtZX0gZGVmYXVsdHMgdG8gXGNvZGV7J3J1blRlc3QnfS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtGdW5jdGlvblRlc3RDYXNlfXt0ZXN0RnVuY1xvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICBzZXRVcFxvcHRpb25hbHssIHRlYXJEb3duXG9wdGlvbmFseywgZGVzY3JpcHRpb259fX19Ci0gIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgcG9ydGlvbiBvZiB0aGUgXGNsYXNze1Rlc3RDYXNlfSBpbnRlcmZhY2UKLSAgd2hpY2ggYWxsb3dzIHRoZSB0ZXN0IHJ1bm5lciB0byBkcml2ZSB0aGUgdGVzdCwgYnV0IGRvZXMgbm90IHByb3ZpZGUKLSAgdGhlIG1ldGhvZHMgd2hpY2ggdGVzdCBjb2RlIGNhbiB1c2UgdG8gY2hlY2sgYW5kIHJlcG9ydCBlcnJvcnMuCi0gIFRoaXMgaXMgdXNlZCB0byBjcmVhdGUgdGVzdCBjYXNlcyB1c2luZyBsZWdhY3kgdGVzdCBjb2RlLCBhbGxvd2luZwotICBpdCB0byBiZSBpbnRlZ3JhdGVkIGludG8gYSBccmVmbW9kdWxle3VuaXR0ZXN0fS1iYXNlZCB0ZXN0Ci0gIGZyYW1ld29yay4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtUZXN0U3VpdGV9e1xvcHRpb25hbHt0ZXN0c319Ci0gIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBhZ2dyZWdhdGlvbiBvZiBpbmRpdmlkdWFsIHRlc3RzIGNhc2VzIGFuZAotICB0ZXN0IHN1aXRlcy4gIFRoZSBjbGFzcyBwcmVzZW50cyB0aGUgaW50ZXJmYWNlIG5lZWRlZCBieSB0aGUgdGVzdAotICBydW5uZXIgdG8gYWxsb3cgaXQgdG8gYmUgcnVuIGFzIGFueSBvdGhlciB0ZXN0IGNhc2UuICBSdW5uaW5nIGEKLSAgXGNsYXNze1Rlc3RTdWl0ZX0gaW5zdGFuY2UgaXMgdGhlIHNhbWUgYXMgaXRlcmF0aW5nIG92ZXIgdGhlIHN1aXRlLAotICBydW5uaW5nIGVhY2ggdGVzdCBpbmRpdmlkdWFsbHkuCi0gIAotICBJZiBcdmFye3Rlc3RzfSBpcyBnaXZlbiwgaXQgbXVzdCBiZSBhbiBpdGVyYWJsZSBvZiBpbmRpdmlkdWFsIHRlc3QgY2FzZXMgb3IKLSAgb3RoZXIgdGVzdCBzdWl0ZXMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gYnVpbGQgdGhlIHN1aXRlIGluaXRpYWxseS4KLSAgQWRkaXRpb25hbCBtZXRob2RzIGFyZSBwcm92aWRlZCB0byBhZGQgdGVzdCBjYXNlcyBhbmQgc3VpdGVzIHRvIHRoZQotICBjb2xsZWN0aW9uIGxhdGVyIG9uLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1Rlc3RMb2FkZXJ9e30KLSAgVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgbG9hZGluZyB0ZXN0cyBhY2NvcmRpbmcgdG8gdmFyaW91cwotICBjcml0ZXJpYSBhbmQgcmV0dXJuaW5nIHRoZW0gd3JhcHBlZCBpbiBhIFxjbGFzc3tUZXN0U3VpdGV9LgotICBJdCBjYW4gbG9hZCBhbGwgdGVzdHMgd2l0aGluIGEgZ2l2ZW4gbW9kdWxlIG9yIFxjbGFzc3tUZXN0Q2FzZX0KLSAgc3ViY2xhc3MuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317VGVzdFJlc3VsdH17fQotICBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gY29tcGlsZSBpbmZvcm1hdGlvbiBhYm91dCB3aGljaCB0ZXN0cyBoYXZlIHN1Y2NlZWRlZAotICBhbmQgd2hpY2ggaGF2ZSBmYWlsZWQuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtkZWZhdWx0VGVzdExvYWRlcn0KLSAgSW5zdGFuY2Ugb2YgdGhlIFxjbGFzc3tUZXN0TG9hZGVyfSBjbGFzcyBpbnRlbmRlZCB0byBiZSBzaGFyZWQuICBJZiBubwotICBjdXN0b21pemF0aW9uIG9mIHRoZSBcY2xhc3N7VGVzdExvYWRlcn0gaXMgbmVlZGVkLCB0aGlzIGluc3RhbmNlIGNhbgotICBiZSB1c2VkIGluc3RlYWQgb2YgcmVwZWF0ZWRseSBjcmVhdGluZyBuZXcgaW5zdGFuY2VzLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317VGV4dFRlc3RSdW5uZXJ9e1xvcHRpb25hbHtzdHJlYW1cb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb25zXG9wdGlvbmFseywgdmVyYm9zaXR5fX19fQotICBBIGJhc2ljIHRlc3QgcnVubmVyIGltcGxlbWVudGF0aW9uIHdoaWNoIHByaW50cyByZXN1bHRzIG9uIHN0YW5kYXJkCi0gIGVycm9yLiAgSXQgaGFzIGEgZmV3IGNvbmZpZ3VyYWJsZSBwYXJhbWV0ZXJzLCBidXQgaXMgZXNzZW50aWFsbHkKLSAgdmVyeSBzaW1wbGUuICBHcmFwaGljYWwgYXBwbGljYXRpb25zIHdoaWNoIHJ1biB0ZXN0IHN1aXRlcyBzaG91bGQKLSAgcHJvdmlkZSBhbHRlcm5hdGUgaW1wbGVtZW50YXRpb25zLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bWFpbn17XG9wdGlvbmFse21vZHVsZVxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgIGRlZmF1bHRUZXN0XG9wdGlvbmFseywgYXJndlxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgIHRlc3RSdW5uZXJcb3B0aW9uYWx7LCB0ZXN0TG9hZGVyfX19fX19Ci0gIEEgY29tbWFuZC1saW5lIHByb2dyYW0gdGhhdCBydW5zIGEgc2V0IG9mIHRlc3RzOyB0aGlzIGlzIHByaW1hcmlseQotICBmb3IgbWFraW5nIHRlc3QgbW9kdWxlcyBjb252ZW5pZW50bHkgZXhlY3V0YWJsZS4gIFRoZSBzaW1wbGVzdCB1c2UKLSAgZm9yIHRoaXMgZnVuY3Rpb24gaXMgdG8gaW5jbHVkZSB0aGUgZm9sbG93aW5nIGxpbmUgYXQgdGhlIGVuZCBvZiBhCi0gIHRlc3Qgc2NyaXB0OgotCi1cYmVnaW57dmVyYmF0aW19Ci1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIHVuaXR0ZXN0Lm1haW4oKQotXGVuZHt2ZXJiYXRpbX0KLQotICBUaGUgXHZhcnt0ZXN0UnVubmVyfSBhcmd1bWVudCBjYW4gZWl0aGVyIGJlIGEgdGVzdCBydW5uZXIgY2xhc3Mgb3IKLSAgYW4gYWxyZWFkeSBjcmVhdGVkIGluc3RhbmNlIG9mIGl0LgotXGVuZHtmdW5jZGVzY30KLQotSW4gc29tZSBjYXNlcywgdGhlIGV4aXN0aW5nIHRlc3RzIG1heSBoYXZlIGJlZW4gd3JpdHRlbiB1c2luZyB0aGUKLVxyZWZtb2R1bGV7ZG9jdGVzdH0gbW9kdWxlLiAgSWYgc28sIHRoYXQgbW9kdWxlIHByb3ZpZGVzIGEgCi1cY2xhc3N7RG9jVGVzdFN1aXRlfSBjbGFzcyB0aGF0IGNhbiBhdXRvbWF0aWNhbGx5IGJ1aWxkCi1cY2xhc3N7dW5pdHRlc3QuVGVzdFN1aXRlfSBpbnN0YW5jZXMgZnJvbSB0aGUgZXhpc3RpbmcKLVxtb2R1bGV7ZG9jdGVzdH0tYmFzZWQgdGVzdHMuCi1cdmVyc2lvbmFkZGVkezIuM30KLQotCi1cc3Vic2VjdGlvbntUZXN0Q2FzZSBPYmplY3RzCi0gICAgICAgICAgICBcbGFiZWx7dGVzdGNhc2Utb2JqZWN0c319Ci0KLUVhY2ggXGNsYXNze1Rlc3RDYXNlfSBpbnN0YW5jZSByZXByZXNlbnRzIGEgc2luZ2xlIHRlc3QsIGJ1dCBlYWNoCi1jb25jcmV0ZSBzdWJjbGFzcyBtYXkgYmUgdXNlZCB0byBkZWZpbmUgbXVsdGlwbGUgdGVzdHMgLS0tIHRoZQotY29uY3JldGUgY2xhc3MgcmVwcmVzZW50cyBhIHNpbmdsZSB0ZXN0IGZpeHR1cmUuICBUaGUgZml4dHVyZSBpcwotY3JlYXRlZCBhbmQgY2xlYW5lZCB1cCBmb3IgZWFjaCB0ZXN0IGNhc2UuCi0KLVxjbGFzc3tUZXN0Q2FzZX0gaW5zdGFuY2VzIHByb3ZpZGUgdGhyZWUgZ3JvdXBzIG9mIG1ldGhvZHM6IG9uZSBncm91cAotdXNlZCB0byBydW4gdGhlIHRlc3QsIGFub3RoZXIgdXNlZCBieSB0aGUgdGVzdCBpbXBsZW1lbnRhdGlvbiB0bwotY2hlY2sgY29uZGl0aW9ucyBhbmQgcmVwb3J0IGZhaWx1cmVzLCBhbmQgc29tZSBpbnF1aXJ5IG1ldGhvZHMKLWFsbG93aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0ZXN0IGl0c2VsZiB0byBiZSBnYXRoZXJlZC4KLQotTWV0aG9kcyBpbiB0aGUgZmlyc3QgZ3JvdXAgKHJ1bm5pbmcgdGhlIHRlc3QpIGFyZToKLQotXGJlZ2lue21ldGhvZGRlc2N9W1Rlc3RDYXNlXXtzZXRVcH17fQotICBNZXRob2QgY2FsbGVkIHRvIHByZXBhcmUgdGhlIHRlc3QgZml4dHVyZS4gIFRoaXMgaXMgY2FsbGVkCi0gIGltbWVkaWF0ZWx5IGJlZm9yZSBjYWxsaW5nIHRoZSB0ZXN0IG1ldGhvZDsgYW55IGV4Y2VwdGlvbiByYWlzZWQgYnkKLSAgdGhpcyBtZXRob2Qgd2lsbCBiZSBjb25zaWRlcmVkIGFuIGVycm9yIHJhdGhlciB0aGFuIGEgdGVzdCBmYWlsdXJlLgotICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtUZXN0Q2FzZV17dGVhckRvd259e30KLSAgTWV0aG9kIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgdGVzdCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIGFuZAotICB0aGUgcmVzdWx0IHJlY29yZGVkLiAgVGhpcyBpcyBjYWxsZWQgZXZlbiBpZiB0aGUgdGVzdCBtZXRob2QgcmFpc2VkCi0gIGFuIGV4Y2VwdGlvbiwgc28gdGhlIGltcGxlbWVudGF0aW9uIGluIHN1YmNsYXNzZXMgbWF5IG5lZWQgdG8gYmUKLSAgcGFydGljdWxhcmx5IGNhcmVmdWwgYWJvdXQgY2hlY2tpbmcgaW50ZXJuYWwgc3RhdGUuICBBbnkgZXhjZXB0aW9uCi0gIHJhaXNlZCBieSB0aGlzIG1ldGhvZCB3aWxsIGJlIGNvbnNpZGVyZWQgYW4gZXJyb3IgcmF0aGVyIHRoYW4gYSB0ZXN0Ci0gIGZhaWx1cmUuICBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgYmUgY2FsbGVkIGlmIHRoZSBcbWV0aG9ke3NldFVwKCl9Ci0gIHN1Y2NlZWRzLCByZWdhcmRsZXNzIG9mIHRoZSBvdXRjb21lIG9mIHRoZSB0ZXN0IG1ldGhvZC4KLSAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiAgCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtUZXN0Q2FzZV17cnVufXtcb3B0aW9uYWx7cmVzdWx0fX0KLSAgUnVuIHRoZSB0ZXN0LCBjb2xsZWN0aW5nIHRoZSByZXN1bHQgaW50byB0aGUgdGVzdCByZXN1bHQgb2JqZWN0Ci0gIHBhc3NlZCBhcyBcdmFye3Jlc3VsdH0uICBJZiBcdmFye3Jlc3VsdH0gaXMgb21pdHRlZCBvciBcY29uc3RhbnR7Tm9uZX0sCi0gIGEgdGVtcG9yYXJ5IHJlc3VsdCBvYmplY3QgaXMgY3JlYXRlZCAoYnkgY2FsbGluZyB0aGUKLSAgXG1ldGhvZHtkZWZhdWx0VGVzdENhc2UoKX0gbWV0aG9kKSBhbmQgdXNlZDsgdGhpcyByZXN1bHQgb2JqZWN0IGlzIG5vdAotICByZXR1cm5lZCB0byBcbWV0aG9ke3J1bigpfSdzIGNhbGxlci4KLSAgCi0gIFRoZSBzYW1lIGVmZmVjdCBtYXkgYmUgaGFkIGJ5IHNpbXBseSBjYWxsaW5nIHRoZSBcY2xhc3N7VGVzdENhc2V9Ci0gIGluc3RhbmNlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bVGVzdENhc2Vde2RlYnVnfXt9Ci0gIFJ1biB0aGUgdGVzdCB3aXRob3V0IGNvbGxlY3RpbmcgdGhlIHJlc3VsdC4gIFRoaXMgYWxsb3dzIGV4Y2VwdGlvbnMKLSAgcmFpc2VkIGJ5IHRoZSB0ZXN0IHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNhbGxlciwgYW5kIGNhbiBiZSB1c2VkCi0gIHRvIHN1cHBvcnQgcnVubmluZyB0ZXN0cyB1bmRlciBhIGRlYnVnZ2VyLgotXGVuZHttZXRob2RkZXNjfQotCi0KLVRoZSB0ZXN0IGNvZGUgY2FuIHVzZSBhbnkgb2YgdGhlIGZvbGxvd2luZyBtZXRob2RzIHRvIGNoZWNrIGZvciBhbmQKLXJlcG9ydCBmYWlsdXJlcy4KLQotXGJlZ2lue21ldGhvZGRlc2N9W1Rlc3RDYXNlXXthc3NlcnRffXtleHByXG9wdGlvbmFseywgbXNnfX0KLVxtZXRob2RsaW5lW1Rlc3RDYXNlXXtmYWlsVW5sZXNzfXtleHByXG9wdGlvbmFseywgbXNnfX0KLSAgU2lnbmFsIGEgdGVzdCBmYWlsdXJlIGlmIFx2YXJ7ZXhwcn0gaXMgZmFsc2U7IHRoZSBleHBsYW5hdGlvbiBmb3IKLSAgdGhlIGVycm9yIHdpbGwgYmUgXHZhcnttc2d9IGlmIGdpdmVuLCBvdGhlcndpc2UgaXQgd2lsbCBiZQotICBcY29uc3RhbnR7Tm9uZX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtUZXN0Q2FzZV17YXNzZXJ0RXF1YWx9e2ZpcnN0LCBzZWNvbmRcb3B0aW9uYWx7LCBtc2d9fQotXG1ldGhvZGxpbmVbVGVzdENhc2Vde2ZhaWxVbmxlc3NFcXVhbH17Zmlyc3QsIHNlY29uZFxvcHRpb25hbHssIG1zZ319Ci0gIFRlc3QgdGhhdCBcdmFye2ZpcnN0fSBhbmQgXHZhcntzZWNvbmR9IGFyZSBlcXVhbC4gIElmIHRoZSB2YWx1ZXMgZG8KLSAgbm90IGNvbXBhcmUgZXF1YWwsIHRoZSB0ZXN0IHdpbGwgZmFpbCB3aXRoIHRoZSBleHBsYW5hdGlvbiBnaXZlbiBieQotICBcdmFye21zZ30sIG9yIFxjb25zdGFudHtOb25lfS4gIE5vdGUgdGhhdCB1c2luZyBcbWV0aG9ke2ZhaWxVbmxlc3NFcXVhbCgpfQotICBpbXByb3ZlcyB1cG9uIGRvaW5nIHRoZSBjb21wYXJpc29uIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgdG8KLSAgXG1ldGhvZHtmYWlsVW5sZXNzKCl9OiAgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIFx2YXJ7bXNnfSBjYW4gYmUKLSAgY29tcHV0ZWQgdG8gaW5jbHVkZSByZXByZXNlbnRhdGlvbnMgb2YgYm90aCBcdmFye2ZpcnN0fSBhbmQKLSAgXHZhcntzZWNvbmR9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bVGVzdENhc2Vde2Fzc2VydE5vdEVxdWFsfXtmaXJzdCwgc2Vjb25kXG9wdGlvbmFseywgbXNnfX0KLVxtZXRob2RsaW5lW1Rlc3RDYXNlXXtmYWlsSWZFcXVhbH17Zmlyc3QsIHNlY29uZFxvcHRpb25hbHssIG1zZ319Ci0gIFRlc3QgdGhhdCBcdmFye2ZpcnN0fSBhbmQgXHZhcntzZWNvbmR9IGFyZSBub3QgZXF1YWwuICBJZiB0aGUgdmFsdWVzCi0gIGRvIGNvbXBhcmUgZXF1YWwsIHRoZSB0ZXN0IHdpbGwgZmFpbCB3aXRoIHRoZSBleHBsYW5hdGlvbiBnaXZlbiBieQotICBcdmFye21zZ30sIG9yIFxjb25zdGFudHtOb25lfS4gIE5vdGUgdGhhdCB1c2luZyBcbWV0aG9ke2ZhaWxJZkVxdWFsKCl9Ci0gIGltcHJvdmVzIHVwb24gZG9pbmcgdGhlIGNvbXBhcmlzb24gYXMgdGhlIGZpcnN0IHBhcmFtZXRlciB0bwotICBcbWV0aG9ke2ZhaWxVbmxlc3MoKX0gaXMgdGhhdCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgXHZhcnttc2d9IGNhbiBiZQotICBjb21wdXRlZCB0byBpbmNsdWRlIHJlcHJlc2VudGF0aW9ucyBvZiBib3RoIFx2YXJ7Zmlyc3R9IGFuZAotICBcdmFye3NlY29uZH0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtUZXN0Q2FzZV17YXNzZXJ0QWxtb3N0RXF1YWx9e2ZpcnN0LCBzZWNvbmRcb3B0aW9uYWx7LAotCQkJCQkJcGxhY2VzXG9wdGlvbmFseywgbXNnfX19Ci1cbWV0aG9kbGluZVtUZXN0Q2FzZV17ZmFpbFVubGVzc0FsbW9zdEVxdWFsfXtmaXJzdCwgc2Vjb25kXG9wdGlvbmFseywKLQkJCQkJCXBsYWNlc1xvcHRpb25hbHssIG1zZ319fQotICBUZXN0IHRoYXQgXHZhcntmaXJzdH0gYW5kIFx2YXJ7c2Vjb25kfSBhcmUgYXBwcm94aW1hdGVseSBlcXVhbAotICBieSBjb21wdXRpbmcgdGhlIGRpZmZlcmVuY2UsIHJvdW5kaW5nIHRvIHRoZSBnaXZlbiBudW1iZXIgb2YgXHZhcntwbGFjZXN9LAotICBhbmQgY29tcGFyaW5nIHRvIHplcm8uICBOb3RlIHRoYXQgY29tcGFyaW5nIGEgZ2l2ZW4gbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzCi0gIGlzIG5vdCB0aGUgc2FtZSBhcyBjb21wYXJpbmcgYSBnaXZlbiBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgZGlnaXRzLgotICBJZiB0aGUgdmFsdWVzIGRvIG5vdCBjb21wYXJlIGVxdWFsLCB0aGUgdGVzdCB3aWxsIGZhaWwgd2l0aCB0aGUgZXhwbGFuYXRpb24KLSAgZ2l2ZW4gYnkgXHZhcnttc2d9LCBvciBcY29uc3RhbnR7Tm9uZX0uICAKLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1Rlc3RDYXNlXXthc3NlcnROb3RBbG1vc3RFcXVhbH17Zmlyc3QsIHNlY29uZFxvcHRpb25hbHssCi0JCQkJCQlwbGFjZXNcb3B0aW9uYWx7LCBtc2d9fX0KLVxtZXRob2RsaW5lW1Rlc3RDYXNlXXtmYWlsSWZBbG1vc3RFcXVhbH17Zmlyc3QsIHNlY29uZFxvcHRpb25hbHssCi0JCQkJCQlwbGFjZXNcb3B0aW9uYWx7LCBtc2d9fX0KLSAgVGVzdCB0aGF0IFx2YXJ7Zmlyc3R9IGFuZCBcdmFye3NlY29uZH0gYXJlIG5vdCBhcHByb3hpbWF0ZWx5IGVxdWFsCi0gIGJ5IGNvbXB1dGluZyB0aGUgZGlmZmVyZW5jZSwgcm91bmRpbmcgdG8gdGhlIGdpdmVuIG51bWJlciBvZiBcdmFye3BsYWNlc30sCi0gIGFuZCBjb21wYXJpbmcgdG8gemVyby4gIE5vdGUgdGhhdCBjb21wYXJpbmcgYSBnaXZlbiBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMKLSAgaXMgbm90IHRoZSBzYW1lIGFzIGNvbXBhcmluZyBhIGdpdmVuIG51bWJlciBvZiBzaWduaWZpY2FudCBkaWdpdHMuCi0gIElmIHRoZSB2YWx1ZXMgZG8gbm90IGNvbXBhcmUgZXF1YWwsIHRoZSB0ZXN0IHdpbGwgZmFpbCB3aXRoIHRoZSBleHBsYW5hdGlvbgotICBnaXZlbiBieSBcdmFye21zZ30sIG9yIFxjb25zdGFudHtOb25lfS4gIAotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bVGVzdENhc2Vde2Fzc2VydFJhaXNlc317ZXhjZXB0aW9uLCBjYWxsYWJsZSwgXG1vcmVhcmdzfQotXG1ldGhvZGxpbmVbVGVzdENhc2Vde2ZhaWxVbmxlc3NSYWlzZXN9e2V4Y2VwdGlvbiwgY2FsbGFibGUsIFxtb3JlYXJnc30KLSAgVGVzdCB0aGF0IGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQgd2hlbiBcdmFye2NhbGxhYmxlfSBpcyBjYWxsZWQgd2l0aAotICBhbnkgcG9zaXRpb25hbCBvciBrZXl3b3JkIGFyZ3VtZW50cyB0aGF0IGFyZSBhbHNvIHBhc3NlZCB0bwotICBcbWV0aG9ke2Fzc2VydFJhaXNlcygpfS4gIFRoZSB0ZXN0IHBhc3NlcyBpZiBcdmFye2V4Y2VwdGlvbn0gaXMKLSAgcmFpc2VkLCBpcyBhbiBlcnJvciBpZiBhbm90aGVyIGV4Y2VwdGlvbiBpcyByYWlzZWQsIG9yIGZhaWxzIGlmIG5vCi0gIGV4Y2VwdGlvbiBpcyByYWlzZWQuICBUbyBjYXRjaCBhbnkgb2YgYSBncm91cCBvZiBleGNlcHRpb25zLCBhIHR1cGxlCi0gIGNvbnRhaW5pbmcgdGhlIGV4Y2VwdGlvbiBjbGFzc2VzIG1heSBiZSBwYXNzZWQgYXMgXHZhcntleGNlcHRpb259LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bVGVzdENhc2Vde2ZhaWxJZn17ZXhwclxvcHRpb25hbHssIG1zZ319Ci0gIFRoZSBpbnZlcnNlIG9mIHRoZSBcbWV0aG9ke2ZhaWxVbmxlc3MoKX0gbWV0aG9kIGlzIHRoZQotICBcbWV0aG9ke2ZhaWxJZigpfSBtZXRob2QuICBUaGlzIHNpZ25hbHMgYSB0ZXN0IGZhaWx1cmUgaWYgXHZhcntleHByfQotICBpcyB0cnVlLCB3aXRoIFx2YXJ7bXNnfSBvciBcY29uc3RhbnR7Tm9uZX0gZm9yIHRoZSBlcnJvciBtZXNzYWdlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bVGVzdENhc2Vde2ZhaWx9e1xvcHRpb25hbHttc2d9fQotICBTaWduYWxzIGEgdGVzdCBmYWlsdXJlIHVuY29uZGl0aW9uYWxseSwgd2l0aCBcdmFye21zZ30gb3IKLSAgXGNvbnN0YW50e05vbmV9IGZvciB0aGUgZXJyb3IgbWVzc2FnZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W1Rlc3RDYXNlXXtmYWlsdXJlRXhjZXB0aW9ufQotICBUaGlzIGNsYXNzIGF0dHJpYnV0ZSBnaXZlcyB0aGUgZXhjZXB0aW9uIHJhaXNlZCBieSB0aGUKLSAgXG1ldGhvZHt0ZXN0KCl9IG1ldGhvZC4gIElmIGEgdGVzdCBmcmFtZXdvcmsgbmVlZHMgdG8gdXNlIGEKLSAgc3BlY2lhbGl6ZWQgZXhjZXB0aW9uLCBwb3NzaWJseSB0byBjYXJyeSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCBpdAotICBtdXN0IHN1YmNsYXNzIHRoaXMgZXhjZXB0aW9uIGluIG9yZGVyIHRvIGBgcGxheSBmYWlyJycgd2l0aCB0aGUKLSAgZnJhbWV3b3JrLiAgVGhlIGluaXRpYWwgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUgaXMKLSAgXGV4Y2VwdGlvbntBc3NlcnRpb25FcnJvcn0uCi1cZW5ke21lbWJlcmRlc2N9Ci0KLQotVGVzdGluZyBmcmFtZXdvcmtzIGNhbiB1c2UgdGhlIGZvbGxvd2luZyBtZXRob2RzIHRvIGNvbGxlY3QKLWluZm9ybWF0aW9uIG9uIHRoZSB0ZXN0OgotCi1cYmVnaW57bWV0aG9kZGVzY31bVGVzdENhc2Vde2NvdW50VGVzdENhc2VzfXt9Ci0gIFJldHVybiB0aGUgbnVtYmVyIG9mIHRlc3RzIHJlcHJlc2VudGVkIGJ5IHRoaXMgdGVzdCBvYmplY3QuICBGb3IKLSAgXGNsYXNze1Rlc3RDYXNlfSBpbnN0YW5jZXMsIHRoaXMgd2lsbCBhbHdheXMgYmUgXGNvZGV7MX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtUZXN0Q2FzZV17ZGVmYXVsdFRlc3RSZXN1bHR9e30KLSAgUmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSB0ZXN0IHJlc3VsdCBjbGFzcyB0aGF0IHNob3VsZCBiZSB1c2VkCi0gIGZvciB0aGlzIHRlc3QgY2FzZSBjbGFzcyAoaWYgbm8gb3RoZXIgcmVzdWx0IGluc3RhbmNlIGlzIHByb3ZpZGVkCi0gIHRvIHRoZSBcbWV0aG9ke3J1bigpfSBtZXRob2QpLgotICAKLSAgRm9yIFxjbGFzc3tUZXN0Q2FzZX0gaW5zdGFuY2VzLCB0aGlzIHdpbGwgYWx3YXlzIGJlIGFuIGluc3RhbmNlIG9mCi0gIFxjbGFzc3tUZXN0UmVzdWx0fTsgIHN1YmNsYXNzZXMgb2YgXGNsYXNze1Rlc3RDYXNlfSBzaG91bGQKLSAgb3ZlcnJpZGUgdGhpcyBhcyBuZWNlc3NhcnkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtUZXN0Q2FzZV17aWR9e30KLSAgUmV0dXJuIGEgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBzcGVjaWZpYyB0ZXN0IGNhc2UuICBUaGlzIGlzIHVzdWFsbHkKLSAgdGhlIGZ1bGwgbmFtZSBvZiB0aGUgdGVzdCBtZXRob2QsIGluY2x1ZGluZyB0aGUgbW9kdWxlIGFuZCBjbGFzcwotICBuYW1lLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bVGVzdENhc2Vde3Nob3J0RGVzY3JpcHRpb259e30KLSAgUmV0dXJucyBhIG9uZS1saW5lIGRlc2NyaXB0aW9uIG9mIHRoZSB0ZXN0LCBvciBcY29uc3RhbnR7Tm9uZX0gaWYgbm8KLSAgZGVzY3JpcHRpb24gaGFzIGJlZW4gcHJvdmlkZWQuICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0gIG1ldGhvZCByZXR1cm5zIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSB0ZXN0IG1ldGhvZCdzIGRvY3N0cmluZywgaWYKLSAgYXZhaWxhYmxlLCBvciBcY29uc3RhbnR7Tm9uZX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLQotXHN1YnNlY3Rpb257VGVzdFN1aXRlIE9iamVjdHMKLSAgICAgICAgICAgIFxsYWJlbHt0ZXN0c3VpdGUtb2JqZWN0c319Ci0KLVxjbGFzc3tUZXN0U3VpdGV9IG9iamVjdHMgYmVoYXZlIG11Y2ggbGlrZSBcY2xhc3N7VGVzdENhc2V9IG9iamVjdHMsCi1leGNlcHQgdGhleSBkbyBub3QgYWN0dWFsbHkgaW1wbGVtZW50IGEgdGVzdC4gIEluc3RlYWQsIHRoZXkgYXJlIHVzZWQKLXRvIGFnZ3JlZ2F0ZSB0ZXN0cyBpbnRvIGdyb3VwcyBvZiB0ZXN0cyB0aGF0IHNob3VsZCBiZSBydW4gdG9nZXRoZXIuCi1Tb21lIGFkZGl0aW9uYWwgbWV0aG9kcyBhcmUgYXZhaWxhYmxlIHRvIGFkZCB0ZXN0cyB0byBcY2xhc3N7VGVzdFN1aXRlfQotaW5zdGFuY2VzOgotCi1cYmVnaW57bWV0aG9kZGVzY31bVGVzdFN1aXRlXXthZGRUZXN0fXt0ZXN0fQotICBBZGQgYSBcY2xhc3N7VGVzdENhc2V9IG9yIFxjbGFzc3tUZXN0U3VpdGV9IHRvIHRoZSBzdWl0ZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1Rlc3RTdWl0ZV17YWRkVGVzdHN9e3Rlc3RzfQotICBBZGQgYWxsIHRoZSB0ZXN0cyBmcm9tIGFuIGl0ZXJhYmxlIG9mIFxjbGFzc3tUZXN0Q2FzZX0gYW5kCi0gIFxjbGFzc3tUZXN0U3VpdGV9IGluc3RhbmNlcyB0byB0aGlzIHRlc3Qgc3VpdGUuCi0gIAotICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gaXRlcmF0aW5nIG92ZXIgXHZhcnt0ZXN0c30sIGNhbGxpbmcKLSAgXG1ldGhvZHthZGRUZXN0KCl9IGZvciBlYWNoIGVsZW1lbnQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxjbGFzc3tUZXN0U3VpdGV9IHNoYXJlcyB0aGUgZm9sbG93aW5nIG1ldGhvZHMgd2l0aCBcY2xhc3N7VGVzdENhc2V9OgotCi1cYmVnaW57bWV0aG9kZGVzY31bVGVzdFN1aXRlXXtydW59e3Jlc3VsdH0KLSAgUnVuIHRoZSB0ZXN0cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdWl0ZSwgY29sbGVjdGluZyB0aGUgcmVzdWx0IGludG8KLSAgdGhlIHRlc3QgcmVzdWx0IG9iamVjdCBwYXNzZWQgYXMgXHZhcntyZXN1bHR9LiAgTm90ZSB0aGF0IHVubGlrZQotICBcbWV0aG9ke1Rlc3RDYXNlLnJ1bigpfSwgXG1ldGhvZHtUZXN0U3VpdGUucnVuKCl9IHJlcXVpcmVzIHRoZQotICByZXN1bHQgb2JqZWN0IHRvIGJlIHBhc3NlZCBpbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1Rlc3RTdWl0ZV17ZGVidWd9e30KLSAgUnVuIHRoZSB0ZXN0cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdWl0ZSB3aXRob3V0IGNvbGxlY3RpbmcgdGhlIHJlc3VsdC4KLSAgVGhpcyBhbGxvd3MgZXhjZXB0aW9ucyByYWlzZWQgYnkgdGhlIHRlc3QgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY2FsbGVyCi0gIGFuZCBjYW4gYmUgdXNlZCB0byBzdXBwb3J0IHJ1bm5pbmcgdGVzdHMgdW5kZXIgYSBkZWJ1Z2dlci4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1Rlc3RTdWl0ZV17Y291bnRUZXN0Q2FzZXN9e30KLSAgUmV0dXJuIHRoZSBudW1iZXIgb2YgdGVzdHMgcmVwcmVzZW50ZWQgYnkgdGhpcyB0ZXN0IG9iamVjdCwgaW5jbHVkaW5nCi0gIGFsbCBpbmRpdmlkdWFsIHRlc3RzIGFuZCBzdWItc3VpdGVzLgotXGVuZHttZXRob2RkZXNjfQotCi1JbiB0aGUgdHlwaWNhbCB1c2FnZSBvZiBhIFxjbGFzc3tUZXN0U3VpdGV9IG9iamVjdCwgdGhlIFxtZXRob2R7cnVuKCl9Ci1tZXRob2QgaXMgaW52b2tlZCBieSBhIFxjbGFzc3tUZXN0UnVubmVyfSByYXRoZXIgdGhhbiBieSB0aGUgZW5kLXVzZXIKLXRlc3QgaGFybmVzcy4KLQotCi1cc3Vic2VjdGlvbntUZXN0UmVzdWx0IE9iamVjdHMKLSAgICAgICAgICAgIFxsYWJlbHt0ZXN0cmVzdWx0LW9iamVjdHN9fQotCi1BIFxjbGFzc3tUZXN0UmVzdWx0fSBvYmplY3Qgc3RvcmVzIHRoZSByZXN1bHRzIG9mIGEgc2V0IG9mIHRlc3RzLiAgVGhlCi1cY2xhc3N7VGVzdENhc2V9IGFuZCBcY2xhc3N7VGVzdFN1aXRlfSBjbGFzc2VzIGVuc3VyZSB0aGF0IHJlc3VsdHMgYXJlCi1wcm9wZXJseSByZWNvcmRlZDsgdGVzdCBhdXRob3JzIGRvIG5vdCBuZWVkIHRvIHdvcnJ5IGFib3V0IHJlY29yZGluZyB0aGUKLW91dGNvbWUgb2YgdGVzdHMuCi0KLVRlc3RpbmcgZnJhbWV3b3JrcyBidWlsdCBvbiB0b3Agb2YgXHJlZm1vZHVsZXt1bml0dGVzdH0gbWF5IHdhbnQKLWFjY2VzcyB0byB0aGUgXGNsYXNze1Rlc3RSZXN1bHR9IG9iamVjdCBnZW5lcmF0ZWQgYnkgcnVubmluZyBhIHNldCBvZgotdGVzdHMgZm9yIHJlcG9ydGluZyBwdXJwb3NlczsgYSBcY2xhc3N7VGVzdFJlc3VsdH0gaW5zdGFuY2UgaXMKLXJldHVybmVkIGJ5IHRoZSBcbWV0aG9ke1Rlc3RSdW5uZXIucnVuKCl9IG1ldGhvZCBmb3IgdGhpcyBwdXJwb3NlLgotCi1cY2xhc3N7VGVzdFJlc3VsdH0gaW5zdGFuY2VzIGhhdmUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIHRoYXQgd2lsbAotYmUgb2YgaW50ZXJlc3Qgd2hlbiBpbnNwZWN0aW5nIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmcgYSBzZXQgb2YgdGVzdHM6Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtUZXN0UmVzdWx0XXtlcnJvcnN9Ci0gIEEgbGlzdCBjb250YWluaW5nIDItdHVwbGVzIG9mIFxjbGFzc3tUZXN0Q2FzZX0gaW5zdGFuY2VzIGFuZAotICBzdHJpbmdzIGhvbGRpbmcgZm9ybWF0dGVkIHRyYWNlYmFja3MuIEVhY2ggdHVwbGUgcmVwcmVzZW50cyBhIHRlc3Qgd2hpY2gKLSAgcmFpc2VkIGFuIHVuZXhwZWN0ZWQgZXhjZXB0aW9uLgotICBcdmVyc2lvbmNoYW5nZWRbQ29udGFpbnMgZm9ybWF0dGVkIHRyYWNlYmFja3MgaW5zdGVhZCBvZgotICAgICAgICAgICAgICAgICAgXGZ1bmN0aW9ue3N5cy5leGNfaW5mbygpfSByZXN1bHRzXXsyLjJ9Ci1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtUZXN0UmVzdWx0XXtmYWlsdXJlc30KLSAgQSBsaXN0IGNvbnRhaW5pbmcgMi10dXBsZXMgb2YgXGNsYXNze1Rlc3RDYXNlfSBpbnN0YW5jZXMgYW5kIHN0cmluZ3MKLSAgaG9sZGluZyBmb3JtYXR0ZWQgdHJhY2ViYWNrcy4gRWFjaCB0dXBsZSByZXByZXNlbnRzIGEgdGVzdCB3aGVyZSBhIGZhaWx1cmUKLSAgd2FzIGV4cGxpY2l0bHkgc2lnbmFsbGVkIHVzaW5nIHRoZSBcbWV0aG9ke1Rlc3RDYXNlLmZhaWwqKCl9IG9yCi0gIFxtZXRob2R7VGVzdENhc2UuYXNzZXJ0KigpfSBtZXRob2RzLgotICBcdmVyc2lvbmNoYW5nZWRbQ29udGFpbnMgZm9ybWF0dGVkIHRyYWNlYmFja3MgaW5zdGVhZCBvZgotICAgICAgICAgICAgICAgICAgXGZ1bmN0aW9ue3N5cy5leGNfaW5mbygpfSByZXN1bHRzXXsyLjJ9Ci1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtUZXN0UmVzdWx0XXt0ZXN0c1J1bn0KLSAgVGhlIHRvdGFsIG51bWJlciBvZiB0ZXN0cyBydW4gc28gZmFyLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bVGVzdFJlc3VsdF17d2FzU3VjY2Vzc2Z1bH17fQotICBSZXR1cm5zIFxjb25zdGFudHtUcnVlfSBpZiBhbGwgdGVzdHMgcnVuIHNvIGZhciBoYXZlIHBhc3NlZCwKLSAgb3RoZXJ3aXNlIHJldHVybnMgXGNvbnN0YW50e0ZhbHNlfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1Rlc3RSZXN1bHRde3N0b3B9e30KLSAgVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byBzaWduYWwgdGhhdCB0aGUgc2V0IG9mIHRlc3RzIGJlaW5nIHJ1bgotICBzaG91bGQgYmUgYWJvcnRlZCBieSBzZXR0aW5nIHRoZSBcY2xhc3N7VGVzdFJlc3VsdH0ncyBcY29kZXtzaG91bGRTdG9wfQotICBhdHRyaWJ1dGUgdG8gXGNvbnN0YW50e1RydWV9LiAgXGNsYXNze1Rlc3RSdW5uZXJ9IG9iamVjdHMgc2hvdWxkIHJlc3BlY3QKLSAgdGhpcyBmbGFnIGFuZCByZXR1cm4gd2l0aG91dCBydW5uaW5nIGFueSBhZGRpdGlvbmFsIHRlc3RzLgotICAKLSAgRm9yIGV4YW1wbGUsIHRoaXMgZmVhdHVyZSBpcyB1c2VkIGJ5IHRoZSBcY2xhc3N7VGV4dFRlc3RSdW5uZXJ9IGNsYXNzCi0gIHRvIHN0b3AgdGhlIHRlc3QgZnJhbWV3b3JrIHdoZW4gdGhlIHVzZXIgc2lnbmFscyBhbiBpbnRlcnJ1cHQgZnJvbQotICB0aGUga2V5Ym9hcmQuICBJbnRlcmFjdGl2ZSB0b29scyB3aGljaCBwcm92aWRlIFxjbGFzc3tUZXN0UnVubmVyfQotICBpbXBsZW1lbnRhdGlvbnMgY2FuIHVzZSB0aGlzIGluIGEgc2ltaWxhciBtYW5uZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLQotVGhlIGZvbGxvd2luZyBtZXRob2RzIG9mIHRoZSBcY2xhc3N7VGVzdFJlc3VsdH0gY2xhc3MgYXJlIHVzZWQgdG8KLW1haW50YWluIHRoZSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMsIGFuZCBtYXkgYmUgZXh0ZW5kZWQgaW4KLXN1YmNsYXNzZXMgdG8gc3VwcG9ydCBhZGRpdGlvbmFsIHJlcG9ydGluZyByZXF1aXJlbWVudHMuICBUaGlzIGlzCi1wYXJ0aWN1bGFybHkgdXNlZnVsIGluIGJ1aWxkaW5nIHRvb2xzIHdoaWNoIHN1cHBvcnQgaW50ZXJhY3RpdmUKLXJlcG9ydGluZyB3aGlsZSB0ZXN0cyBhcmUgYmVpbmcgcnVuLgotCi1cYmVnaW57bWV0aG9kZGVzY31bVGVzdFJlc3VsdF17c3RhcnRUZXN0fXt0ZXN0fQotICBDYWxsZWQgd2hlbiB0aGUgdGVzdCBjYXNlIFx2YXJ7dGVzdH0gaXMgYWJvdXQgdG8gYmUgcnVuLgotICAKLSAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2ltcGx5IGluY3JlbWVudHMgdGhlIGluc3RhbmNlJ3MKLSAgXGNvZGV7dGVzdHNSdW59IGNvdW50ZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtUZXN0UmVzdWx0XXtzdG9wVGVzdH17dGVzdH0KLSAgQ2FsbGVkIGFmdGVyIHRoZSB0ZXN0IGNhc2UgXHZhcnt0ZXN0fSBoYXMgYmVlbiBleGVjdXRlZCwgcmVnYXJkbGVzcwotICBvZiB0aGUgb3V0Y29tZS4KLSAgCi0gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1Rlc3RSZXN1bHRde2FkZEVycm9yfXt0ZXN0LCBlcnJ9Ci0gIENhbGxlZCB3aGVuIHRoZSB0ZXN0IGNhc2UgXHZhcnt0ZXN0fSByYWlzZXMgYW4gdW5leHBlY3RlZCBleGNlcHRpb24KLSAgXHZhcntlcnJ9IGlzIGEgdHVwbGUgb2YgdGhlIGZvcm0gcmV0dXJuZWQgYnkgXGZ1bmN0aW9ue3N5cy5leGNfaW5mbygpfToKLSAgXGNvZGV7KFx2YXJ7dHlwZX0sIFx2YXJ7dmFsdWV9LCBcdmFye3RyYWNlYmFja30pfS4KLSAgCi0gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGFwcGVuZHMgXGNvZGV7KFx2YXJ7dGVzdH0sIFx2YXJ7ZXJyfSl9IHRvCi0gIHRoZSBpbnN0YW5jZSdzIFxjb2Rle2Vycm9yc30gYXR0cmlidXRlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bVGVzdFJlc3VsdF17YWRkRmFpbHVyZX17dGVzdCwgZXJyfQotICBDYWxsZWQgd2hlbiB0aGUgdGVzdCBjYXNlIFx2YXJ7dGVzdH0gc2lnbmFscyBhIGZhaWx1cmUuCi0gIFx2YXJ7ZXJyfSBpcyBhIHR1cGxlIG9mIHRoZSBmb3JtIHJldHVybmVkIGJ5Ci0gIFxmdW5jdGlvbntzeXMuZXhjX2luZm8oKX06ICBcY29kZXsoXHZhcnt0eXBlfSwgXHZhcnt2YWx1ZX0sCi0gIFx2YXJ7dHJhY2ViYWNrfSl9LgotICAKLSAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYXBwZW5kcyBcY29kZXsoXHZhcnt0ZXN0fSwgXHZhcntlcnJ9KX0gdG8KLSAgdGhlIGluc3RhbmNlJ3MgXGNvZGV7ZmFpbHVyZXN9IGF0dHJpYnV0ZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1Rlc3RSZXN1bHRde2FkZFN1Y2Nlc3N9e3Rlc3R9Ci0gIENhbGxlZCB3aGVuIHRoZSB0ZXN0IGNhc2UgXHZhcnt0ZXN0fSBzdWNjZWVkcy4KLSAgCi0gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi0KLVxzdWJzZWN0aW9ue1Rlc3RMb2FkZXIgT2JqZWN0cwotICAgICAgICAgICAgXGxhYmVse3Rlc3Rsb2FkZXItb2JqZWN0c319Ci0KLVRoZSBcY2xhc3N7VGVzdExvYWRlcn0gY2xhc3MgaXMgdXNlZCB0byBjcmVhdGUgdGVzdCBzdWl0ZXMgZnJvbQotY2xhc3NlcyBhbmQgbW9kdWxlcy4gIE5vcm1hbGx5LCB0aGVyZSBpcyBubyBuZWVkIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZQotb2YgdGhpcyBjbGFzczsgdGhlIFxyZWZtb2R1bGV7dW5pdHRlc3R9IG1vZHVsZSBwcm92aWRlcyBhbiBpbnN0YW5jZQotdGhhdCBjYW4gYmUgc2hhcmVkIGFzIFxjb2Rle3VuaXR0ZXN0LmRlZmF1bHRUZXN0TG9hZGVyfS4KLVVzaW5nIGEgc3ViY2xhc3Mgb3IgaW5zdGFuY2UsIGhvd2V2ZXIsIGFsbG93cyBjdXN0b21pemF0aW9uIG9mIHNvbWUKLWNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzLgotCi1cY2xhc3N7VGVzdExvYWRlcn0gb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLQotXGJlZ2lue21ldGhvZGRlc2N9W1Rlc3RMb2FkZXJde2xvYWRUZXN0c0Zyb21UZXN0Q2FzZX17dGVzdENhc2VDbGFzc30KLSAgUmV0dXJuIGEgc3VpdGUgb2YgYWxsIHRlc3RzIGNhc2VzIGNvbnRhaW5lZCBpbiB0aGUKLSAgXGNsYXNze1Rlc3RDYXNlfS1kZXJpdmVkIFxjbGFzc3t0ZXN0Q2FzZUNsYXNzfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1Rlc3RMb2FkZXJde2xvYWRUZXN0c0Zyb21Nb2R1bGV9e21vZHVsZX0KLSAgUmV0dXJuIGEgc3VpdGUgb2YgYWxsIHRlc3RzIGNhc2VzIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gbW9kdWxlLgotICBUaGlzIG1ldGhvZCBzZWFyY2hlcyBcdmFye21vZHVsZX0gZm9yIGNsYXNzZXMgZGVyaXZlZCBmcm9tCi0gIFxjbGFzc3tUZXN0Q2FzZX0gYW5kIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIGZvciBlYWNoIHRlc3QKLSAgbWV0aG9kIGRlZmluZWQgZm9yIHRoZSBjbGFzcy4KLQotICBcd2FybmluZ3tXaGlsZSB1c2luZyBhIGhpZXJhcmNoeSBvZgotICBcY2xhc3N7VGVzdENhc2V9LWRlcml2ZWQgY2xhc3NlcyBjYW4gYmUgY29udmVuaWVudCBpbiBzaGFyaW5nCi0gIGZpeHR1cmVzIGFuZCBoZWxwZXIgZnVuY3Rpb25zLCBkZWZpbmluZyB0ZXN0IG1ldGhvZHMgb24gYmFzZSBjbGFzc2VzCi0gIHRoYXQgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHkgZG9lcyBub3QgcGxheSB3ZWxsCi0gIHdpdGggdGhpcyBtZXRob2QuICBEb2luZyBzbywgaG93ZXZlciwgY2FuIGJlIHVzZWZ1bCB3aGVuIHRoZQotICBmaXh0dXJlcyBhcmUgZGlmZmVyZW50IGFuZCBkZWZpbmVkIGluIHN1YmNsYXNzZXMufQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bVGVzdExvYWRlcl17bG9hZFRlc3RzRnJvbU5hbWV9e25hbWVcb3B0aW9uYWx7LCBtb2R1bGV9fQotICBSZXR1cm4gYSBzdWl0ZSBvZiBhbGwgdGVzdHMgY2FzZXMgZ2l2ZW4gYSBzdHJpbmcgc3BlY2lmaWVyLgotCi0gIFRoZSBzcGVjaWZpZXIgXHZhcntuYW1lfSBpcyBhIGBgZG90dGVkIG5hbWUnJyB0aGF0IG1heSByZXNvbHZlCi0gIGVpdGhlciB0byBhIG1vZHVsZSwgYSB0ZXN0IGNhc2UgY2xhc3MsIGEgdGVzdCBtZXRob2Qgd2l0aGluIGEgdGVzdAotICBjYXNlIGNsYXNzLCBhIFxjbGFzc3tUZXN0U3VpdGV9IGluc3RhbmNlLCBvciBhIGNhbGxhYmxlIG9iamVjdCB3aGljaAotICByZXR1cm5zIGEgXGNsYXNze1Rlc3RDYXNlfSBvciBcY2xhc3N7VGVzdFN1aXRlfSBpbnN0YW5jZS4gIFRoZXNlIGNoZWNrcwotICBhcmUgYXBwbGllZCBpbiB0aGUgb3JkZXIgbGlzdGVkIGhlcmU7IHRoYXQgaXMsIGEgbWV0aG9kIG9uIGEgcG9zc2libGUKLSAgdGVzdCBjYXNlIGNsYXNzIHdpbGwgYmUgcGlja2VkIHVwIGFzIGBgYSB0ZXN0IG1ldGhvZCB3aXRoaW4gYSB0ZXN0Ci0gIGNhc2UgY2xhc3MnJywgcmF0aGVyIHRoYW4gYGBhIGNhbGxhYmxlIG9iamVjdCcnLgotCi0gIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIG1vZHVsZSBcbW9kdWxle1NhbXBsZVRlc3RzfSBjb250YWluaW5nIGEKLSAgXGNsYXNze1Rlc3RDYXNlfS1kZXJpdmVkIGNsYXNzIFxjbGFzc3tTYW1wbGVUZXN0Q2FzZX0gd2l0aCB0aHJlZSB0ZXN0Ci0gIG1ldGhvZHMgKFxtZXRob2R7dGVzdF9vbmUoKX0sIFxtZXRob2R7dGVzdF90d28oKX0sIGFuZAotICBcbWV0aG9ke3Rlc3RfdGhyZWUoKX0pLCB0aGUgc3BlY2lmaWVyIFxjb2RleydTYW1wbGVUZXN0cy5TYW1wbGVUZXN0Q2FzZSd9Ci0gIHdvdWxkIGNhdXNlIHRoaXMgbWV0aG9kIHRvIHJldHVybiBhIHN1aXRlIHdoaWNoIHdpbGwgcnVuIGFsbCB0aHJlZSB0ZXN0Ci0gIG1ldGhvZHMuICBVc2luZyB0aGUgc3BlY2lmaWVyIFxjb2RleydTYW1wbGVUZXN0cy5TYW1wbGVUZXN0Q2FzZS50ZXN0X3R3byd9Ci0gIHdvdWxkIGNhdXNlIGl0IHRvIHJldHVybiBhIHRlc3Qgc3VpdGUgd2hpY2ggd2lsbCBydW4gb25seSB0aGUKLSAgXG1ldGhvZHt0ZXN0X3R3bygpfSB0ZXN0IG1ldGhvZC4gIFRoZSBzcGVjaWZpZXIgY2FuIHJlZmVyIHRvIG1vZHVsZXMKLSAgYW5kIHBhY2thZ2VzIHdoaWNoIGhhdmUgbm90IGJlZW4gaW1wb3J0ZWQ7IHRoZXkgd2lsbCBiZSBpbXBvcnRlZCBhcwotICBhIHNpZGUtZWZmZWN0LgotCi0gIFRoZSBtZXRob2Qgb3B0aW9uYWxseSByZXNvbHZlcyBcdmFye25hbWV9IHJlbGF0aXZlIHRvIHRoZSBnaXZlbgotICBcdmFye21vZHVsZX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtUZXN0TG9hZGVyXXtsb2FkVGVzdHNGcm9tTmFtZXN9e25hbWVzXG9wdGlvbmFseywgbW9kdWxlfX0KLSAgU2ltaWxhciB0byBcbWV0aG9ke2xvYWRUZXN0c0Zyb21OYW1lKCl9LCBidXQgdGFrZXMgYSBzZXF1ZW5jZSBvZgotICBuYW1lcyByYXRoZXIgdGhhbiBhIHNpbmdsZSBuYW1lLiAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIHRlc3Qgc3VpdGUKLSAgd2hpY2ggc3VwcG9ydHMgYWxsIHRoZSB0ZXN0cyBkZWZpbmVkIGZvciBlYWNoIG5hbWUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtUZXN0TG9hZGVyXXtnZXRUZXN0Q2FzZU5hbWVzfXt0ZXN0Q2FzZUNsYXNzfQotICBSZXR1cm4gYSBzb3J0ZWQgc2VxdWVuY2Ugb2YgbWV0aG9kIG5hbWVzIGZvdW5kIHdpdGhpbgotICBcdmFye3Rlc3RDYXNlQ2xhc3N9OyB0aGlzIHNob3VsZCBiZSBhIHN1YmNsYXNzIG9mIFxjbGFzc3tUZXN0Q2FzZX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLQotVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIG9mIGEgXGNsYXNze1Rlc3RMb2FkZXJ9IGNhbiBiZSBjb25maWd1cmVkCi1laXRoZXIgYnkgc3ViY2xhc3Npbmcgb3IgYXNzaWdubWVudCBvbiBhbiBpbnN0YW5jZToKLQotXGJlZ2lue21lbWJlcmRlc2N9W1Rlc3RMb2FkZXJde3Rlc3RNZXRob2RQcmVmaXh9Ci0gIFN0cmluZyBnaXZpbmcgdGhlIHByZWZpeCBvZiBtZXRob2QgbmFtZXMgd2hpY2ggd2lsbCBiZSBpbnRlcnByZXRlZAotICBhcyB0ZXN0IG1ldGhvZHMuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBcY29kZXsndGVzdCd9LgotICAKLSAgVGhpcyBhZmZlY3RzIFxtZXRob2R7Z2V0VGVzdENhc2VOYW1lcygpfSBhbmQgYWxsIHRoZQotICBcbWV0aG9ke2xvYWRUZXN0c0Zyb20qKCl9IG1ldGhvZHMuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtUZXN0TG9hZGVyXXtzb3J0VGVzdE1ldGhvZHNVc2luZ30KLSAgRnVuY3Rpb24gdG8gYmUgdXNlZCB0byBjb21wYXJlIG1ldGhvZCBuYW1lcyB3aGVuIHNvcnRpbmcgdGhlbSBpbgotICBcbWV0aG9ke2dldFRlc3RDYXNlTmFtZXMoKX0gYW5kIGFsbCB0aGUgXG1ldGhvZHtsb2FkVGVzdHNGcm9tKigpfSBtZXRob2RzLgotICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0aGUgYnVpbHQtaW4gXGZ1bmN0aW9ue2NtcCgpfSBmdW5jdGlvbjsgdGhlIGF0dHJpYnV0ZQotICBjYW4gYWxzbyBiZSBzZXQgdG8gXGNvbnN0YW50e05vbmV9IHRvIGRpc2FibGUgdGhlIHNvcnQuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtUZXN0TG9hZGVyXXtzdWl0ZUNsYXNzfQotICBDYWxsYWJsZSBvYmplY3QgdGhhdCBjb25zdHJ1Y3RzIGEgdGVzdCBzdWl0ZSBmcm9tIGEgbGlzdCBvZiB0ZXN0cy4KLSAgTm8gbWV0aG9kcyBvbiB0aGUgcmVzdWx0aW5nIG9iamVjdCBhcmUgbmVlZGVkLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMKLSAgdGhlIFxjbGFzc3tUZXN0U3VpdGV9IGNsYXNzLgotICAKLSAgVGhpcyBhZmZlY3RzIGFsbCB0aGUgXG1ldGhvZHtsb2FkVGVzdHNGcm9tKigpfSBtZXRob2RzLgotXGVuZHttZW1iZXJkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ1bml4LnRleCBiL0RvYy9saWIvbGlidW5peC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NmRmMDEuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJ1bml4LnRleAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotXGNoYXB0ZXJ7VW5peCBTcGVjaWZpYyBTZXJ2aWNlc30KLVxsYWJlbHt1bml4fQotCi1UaGUgbW9kdWxlcyBkZXNjcmliZWQgaW4gdGhpcyBjaGFwdGVyIHByb3ZpZGUgaW50ZXJmYWNlcyB0byBmZWF0dXJlcwotdGhhdCBhcmUgdW5pcXVlIHRvIHRoZSBcVU5JWHt9IG9wZXJhdGluZyBzeXN0ZW0sIG9yIGluIHNvbWUgY2FzZXMgdG8KLXNvbWUgb3IgbWFueSB2YXJpYW50cyBvZiBpdC4gIEhlcmUncyBhbiBvdmVydmlldzoKLQotXGxvY2FsbW9kdWxldGFibGUKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlidXJsbGliLnRleCBiL0RvYy9saWIvbGlidXJsbGliLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdkZmI4Zi4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnVybGxpYi50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw0OTQgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXt1cmxsaWJ9IC0tLQotICAgICAgICAgT3BlbiBhcmJpdHJhcnkgcmVzb3VyY2VzIGJ5IFVSTH0KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e3VybGxpYn0KLVxtb2R1bGVzeW5vcHNpc3tPcGVuIGFuIGFyYml0cmFyeSBuZXR3b3JrIHJlc291cmNlIGJ5IFVSTCAocmVxdWlyZXMgc29ja2V0cykufQotCi1caW5kZXh7V1dXfQotXGluZGV4e1dvcmxkIFdpZGUgV2VifQotXGluZGV4e1VSTH0KLQotCi1UaGlzIG1vZHVsZSBwcm92aWRlcyBhIGhpZ2gtbGV2ZWwgaW50ZXJmYWNlIGZvciBmZXRjaGluZyBkYXRhIGFjcm9zcwotdGhlIFdvcmxkIFdpZGUgV2ViLiAgSW4gcGFydGljdWxhciwgdGhlIFxmdW5jdGlvbnt1cmxvcGVuKCl9IGZ1bmN0aW9uCi1pcyBzaW1pbGFyIHRvIHRoZSBidWlsdC1pbiBmdW5jdGlvbiBcZnVuY3Rpb257b3BlbigpfSwgYnV0IGFjY2VwdHMKLVVuaXZlcnNhbCBSZXNvdXJjZSBMb2NhdG9ycyAoVVJMcykgaW5zdGVhZCBvZiBmaWxlbmFtZXMuICBTb21lCi1yZXN0cmljdGlvbnMgYXBwbHkgLS0tIGl0IGNhbiBvbmx5IG9wZW4gVVJMcyBmb3IgcmVhZGluZywgYW5kIG5vIHNlZWsKLW9wZXJhdGlvbnMgYXJlIGF2YWlsYWJsZS4KLQotSXQgZGVmaW5lcyB0aGUgZm9sbG93aW5nIHB1YmxpYyBmdW5jdGlvbnM6Ci0KLVxiZWdpbntmdW5jZGVzY317dXJsb3Blbn17dXJsXG9wdGlvbmFseywgZGF0YVxvcHRpb25hbHssIHByb3hpZXN9fX0KLU9wZW4gYSBuZXR3b3JrIG9iamVjdCBkZW5vdGVkIGJ5IGEgVVJMIGZvciByZWFkaW5nLiAgSWYgdGhlIFVSTCBkb2VzCi1ub3QgaGF2ZSBhIHNjaGVtZSBpZGVudGlmaWVyLCBvciBpZiBpdCBoYXMgXGZpbGV7ZmlsZTp9IGFzIGl0cyBzY2hlbWUKLWlkZW50aWZpZXIsIHRoaXMgb3BlbnMgYSBsb2NhbCBmaWxlICh3aXRob3V0IHVuaXZlcnNhbCBuZXdsaW5lcyk7Ci1vdGhlcndpc2UgaXQgb3BlbnMgYSBzb2NrZXQgdG8gYSBzZXJ2ZXIgc29tZXdoZXJlIG9uIHRoZSBuZXR3b3JrLiAgSWYKLXRoZSBjb25uZWN0aW9uIGNhbm5vdCBiZSBtYWRlCi10aGUgXGV4Y2VwdGlvbntJT0Vycm9yfSBleGNlcHRpb24gaXMgcmFpc2VkLiAgSWYgYWxsIHdlbnQgd2VsbCwgYQotZmlsZS1saWtlIG9iamVjdCBpcyByZXR1cm5lZC4gIFRoaXMgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotXG1ldGhvZHtyZWFkKCl9LCBcbWV0aG9ke3JlYWRsaW5lKCl9LCBcbWV0aG9ke3JlYWRsaW5lcygpfSwgXG1ldGhvZHtmaWxlbm8oKX0sCi1cbWV0aG9ke2Nsb3NlKCl9LCBcbWV0aG9ke2luZm8oKX0gYW5kIFxtZXRob2R7Z2V0dXJsKCl9LiAgSXQgYWxzbyBoYXMKLXByb3BlciBzdXBwb3J0IGZvciB0aGUgaXRlcmF0b3IgcHJvdG9jb2wuCi1PbmUgY2F2ZWF0OiB0aGUgXG1ldGhvZHtyZWFkKCl9IG1ldGhvZCwgaWYgdGhlIHNpemUgYXJndW1lbnQgaXMKLW9taXR0ZWQgb3IgbmVnYXRpdmUsIG1heSBub3QgcmVhZCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBkYXRhIHN0cmVhbTsKLXRoZXJlIGlzIG5vIGdvb2Qgd2F5IHRvIGRldGVybWluZSB0aGF0IHRoZSBlbnRpcmUgc3RyZWFtIGZyb20gYSBzb2NrZXQKLWhhcyBiZWVuIHJlYWQgaW4gdGhlIGdlbmVyYWwgY2FzZS4KLQotRXhjZXB0IGZvciB0aGUgXG1ldGhvZHtpbmZvKCl9IGFuZCBcbWV0aG9ke2dldHVybCgpfSBtZXRob2RzLAotdGhlc2UgbWV0aG9kcyBoYXZlIHRoZSBzYW1lIGludGVyZmFjZSBhcyBmb3IKLWZpbGUgb2JqZWN0cyAtLS0gc2VlIHNlY3Rpb24gXHJlZntibHRpbi1maWxlLW9iamVjdHN9IGluIHRoaXMKLW1hbnVhbC4gIChJdCBpcyBub3QgYSBidWlsdC1pbiBmaWxlIG9iamVjdCwgaG93ZXZlciwgc28gaXQgY2FuJ3QgYmUKLXVzZWQgYXQgdGhvc2UgZmV3IHBsYWNlcyB3aGVyZSBhIHRydWUgYnVpbHQtaW4gZmlsZSBvYmplY3QgaXMKLXJlcXVpcmVkLikKLQotVGhlIFxtZXRob2R7aW5mbygpfSBtZXRob2QgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MKLVxjbGFzc3ttaW1ldG9vbHMuTWVzc2FnZX0gY29udGFpbmluZyBtZXRhLWluZm9ybWF0aW9uIGFzc29jaWF0ZWQKLXdpdGggdGhlIFVSTC4gIFdoZW4gdGhlIG1ldGhvZCBpcyBIVFRQLCB0aGVzZSBoZWFkZXJzIGFyZSB0aG9zZQotcmV0dXJuZWQgYnkgdGhlIHNlcnZlciBhdCB0aGUgaGVhZCBvZiB0aGUgcmV0cmlldmVkIEhUTUwgcGFnZQotKGluY2x1ZGluZyBDb250ZW50LUxlbmd0aCBhbmQgQ29udGVudC1UeXBlKS4gIFdoZW4gdGhlIG1ldGhvZCBpcyBGVFAsCi1hIENvbnRlbnQtTGVuZ3RoIGhlYWRlciB3aWxsIGJlIHByZXNlbnQgaWYgKGFzIGlzIG5vdyB1c3VhbCkgdGhlCi1zZXJ2ZXIgcGFzc2VkIGJhY2sgYSBmaWxlIGxlbmd0aCBpbiByZXNwb25zZSB0byB0aGUgRlRQIHJldHJpZXZhbAotcmVxdWVzdC4gQSBDb250ZW50LVR5cGUgaGVhZGVyIHdpbGwgYmUgcHJlc2VudCBpZiB0aGUgTUlNRSB0eXBlIGNhbgotYmUgZ3Vlc3NlZC4gIFdoZW4gdGhlIG1ldGhvZCBpcyBsb2NhbC1maWxlLCByZXR1cm5lZCBoZWFkZXJzIHdpbGwgaW5jbHVkZQotYSBEYXRlIHJlcHJlc2VudGluZyB0aGUgZmlsZSdzIGxhc3QtbW9kaWZpZWQgdGltZSwgYSBDb250ZW50LUxlbmd0aAotZ2l2aW5nIGZpbGUgc2l6ZSwgYW5kIGEgQ29udGVudC1UeXBlIGNvbnRhaW5pbmcgYSBndWVzcyBhdCB0aGUgZmlsZSdzCi10eXBlLiBTZWUgYWxzbyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlCi1ccmVmbW9kdWxle21pbWV0b29sc31ccmVmc3Rtb2RpbmRleHttaW1ldG9vbHN9IG1vZHVsZS4KLQotVGhlIFxtZXRob2R7Z2V0dXJsKCl9IG1ldGhvZCByZXR1cm5zIHRoZSByZWFsIFVSTCBvZiB0aGUgcGFnZS4gIEluCi1zb21lIGNhc2VzLCB0aGUgSFRUUCBzZXJ2ZXIgcmVkaXJlY3RzIGEgY2xpZW50IHRvIGFub3RoZXIgVVJMLiAgVGhlCi1cZnVuY3Rpb257dXJsb3BlbigpfSBmdW5jdGlvbiBoYW5kbGVzIHRoaXMgdHJhbnNwYXJlbnRseSwgYnV0IGluIHNvbWUKLWNhc2VzIHRoZSBjYWxsZXIgbmVlZHMgdG8ga25vdyB3aGljaCBVUkwgdGhlIGNsaWVudCB3YXMgcmVkaXJlY3RlZAotdG8uICBUaGUgXG1ldGhvZHtnZXR1cmwoKX0gbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGdldCBhdCB0aGlzCi1yZWRpcmVjdGVkIFVSTC4KLQotSWYgdGhlIFx2YXJ7dXJsfSB1c2VzIHRoZSBcZmlsZXtodHRwOn0gc2NoZW1lIGlkZW50aWZpZXIsIHRoZSBvcHRpb25hbAotXHZhcntkYXRhfSBhcmd1bWVudCBtYXkgYmUgZ2l2ZW4gdG8gc3BlY2lmeSBhIFxjb2Rle1BPU1R9IHJlcXVlc3QKLShub3JtYWxseSB0aGUgcmVxdWVzdCB0eXBlIGlzIFxjb2Rle0dFVH0pLiAgVGhlIFx2YXJ7ZGF0YX0gYXJndW1lbnQKLW11c3QgYmUgaW4gc3RhbmRhcmQgXG1pbWV0eXBle2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZH0gZm9ybWF0Owotc2VlIHRoZSBcZnVuY3Rpb257dXJsZW5jb2RlKCl9IGZ1bmN0aW9uIGJlbG93LgotCi1UaGUgXGZ1bmN0aW9ue3VybG9wZW4oKX0gZnVuY3Rpb24gd29ya3MgdHJhbnNwYXJlbnRseSB3aXRoIHByb3hpZXMKLXdoaWNoIGRvIG5vdCByZXF1aXJlIGF1dGhlbnRpY2F0aW9uLiAgSW4gYSBcVU5JWHt9IG9yIFdpbmRvd3MKLWVudmlyb25tZW50LCBzZXQgdGhlIFxlbnZ2YXJ7aHR0cF9wcm94eX0sIG9yIFxlbnZ2YXJ7ZnRwX3Byb3h5fQotZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGEgVVJMIHRoYXQgaWRlbnRpZmllcwotdGhlIHByb3h5IHNlcnZlciBiZWZvcmUgc3RhcnRpbmcgdGhlIFB5dGhvbiBpbnRlcnByZXRlci4gIEZvciBleGFtcGxlCi0odGhlIFxjaGFyYWN0ZXJ7XCV9IGlzIHRoZSBjb21tYW5kIHByb21wdCk6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSUgaHR0cF9wcm94eT0iaHR0cDovL3d3dy5zb21lcHJveHkuY29tOjMxMjgiCi0lIGV4cG9ydCBodHRwX3Byb3h5Ci0lIHB5dGhvbgotLi4uCi1cZW5ke3ZlcmJhdGltfQotCi1JbiBhIFdpbmRvd3MgZW52aXJvbm1lbnQsIGlmIG5vIHByb3h5IGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc2V0LAotcHJveHkgc2V0dGluZ3MgYXJlIG9idGFpbmVkIGZyb20gdGhlIHJlZ2lzdHJ5J3MgSW50ZXJuZXQgU2V0dGluZ3MKLXNlY3Rpb24uCi0KLUluIGEgTWFjaW50b3NoIGVudmlyb25tZW50LCBcZnVuY3Rpb257dXJsb3BlbigpfSB3aWxsIHJldHJpZXZlIHByb3h5Ci1pbmZvcm1hdGlvbiBmcm9tIEludGVybmV0XGluZGV4e0ludGVybmV0IENvbmZpZ30gQ29uZmlnLgotCi1BbHRlcm5hdGl2ZWx5LCB0aGUgb3B0aW9uYWwgXHZhcntwcm94aWVzfSBhcmd1bWVudCBtYXkgYmUgdXNlZCB0bwotZXhwbGljaXRseSBzcGVjaWZ5IHByb3hpZXMuICBJdCBtdXN0IGJlIGEgZGljdGlvbmFyeSBtYXBwaW5nIHNjaGVtZQotbmFtZXMgdG8gcHJveHkgVVJMcywgd2hlcmUgYW4gZW1wdHkgZGljdGlvbmFyeSBjYXVzZXMgbm8gcHJveGllcyB0byBiZQotdXNlZCwgYW5kIFxjb2Rle05vbmV9ICh0aGUgZGVmYXVsdCB2YWx1ZSkgY2F1c2VzIGVudmlyb25tZW50YWwgcHJveHkKLXNldHRpbmdzIHRvIGJlIHVzZWQgYXMgZGlzY3Vzc2VkIGFib3ZlLiAgRm9yIGV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSMgVXNlIGh0dHA6Ly93d3cuc29tZXByb3h5LmNvbTozMTI4IGZvciBodHRwIHByb3h5aW5nCi1wcm94aWVzID0geydodHRwJzogJ2h0dHA6Ly93d3cuc29tZXByb3h5LmNvbTozMTI4J30KLWZpbGVoYW5kbGUgPSB1cmxsaWIudXJsb3Blbihzb21lX3VybCwgcHJveGllcz1wcm94aWVzKQotIyBEb24ndCB1c2UgYW55IHByb3hpZXMKLWZpbGVoYW5kbGUgPSB1cmxsaWIudXJsb3Blbihzb21lX3VybCwgcHJveGllcz17fSkKLSMgVXNlIHByb3hpZXMgZnJvbSBlbnZpcm9ubWVudCAtIGJvdGggdmVyc2lvbnMgYXJlIGVxdWl2YWxlbnQKLWZpbGVoYW5kbGUgPSB1cmxsaWIudXJsb3Blbihzb21lX3VybCwgcHJveGllcz1Ob25lKQotZmlsZWhhbmRsZSA9IHVybGxpYi51cmxvcGVuKHNvbWVfdXJsKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIFxmdW5jdGlvbnt1cmxvcGVuKCl9IGZ1bmN0aW9uIGRvZXMgbm90IHN1cHBvcnQgZXhwbGljaXQgcHJveHkKLXNwZWNpZmljYXRpb24uICBJZiB5b3UgbmVlZCB0byBvdmVycmlkZSBlbnZpcm9ubWVudGFsIHByb3h5IHNldHRpbmdzLAotdXNlIFxjbGFzc3tVUkxvcGVuZXJ9LCBvciBhIHN1YmNsYXNzIHN1Y2ggYXMgXGNsYXNze0ZhbmN5VVJMb3BlbmVyfS4KLQotUHJveGllcyB3aGljaCByZXF1aXJlIGF1dGhlbnRpY2F0aW9uIGZvciB1c2UgYXJlIG5vdCBjdXJyZW50bHkKLXN1cHBvcnRlZDsgdGhpcyBpcyBjb25zaWRlcmVkIGFuIGltcGxlbWVudGF0aW9uIGxpbWl0YXRpb24uCi0KLVx2ZXJzaW9uY2hhbmdlZFtBZGRlZCB0aGUgXHZhcntwcm94aWVzfSBzdXBwb3J0XXsyLjN9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3VybHJldHJpZXZlfXt1cmxcb3B0aW9uYWx7LCBmaWxlbmFtZVxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRob29rXG9wdGlvbmFseywgZGF0YX19fX0KLUNvcHkgYSBuZXR3b3JrIG9iamVjdCBkZW5vdGVkIGJ5IGEgVVJMIHRvIGEgbG9jYWwgZmlsZSwgaWYgbmVjZXNzYXJ5LgotSWYgdGhlIFVSTCBwb2ludHMgdG8gYSBsb2NhbCBmaWxlLCBvciBhIHZhbGlkIGNhY2hlZCBjb3B5IG9mIHRoZQotb2JqZWN0IGV4aXN0cywgdGhlIG9iamVjdCBpcyBub3QgY29waWVkLiAgUmV0dXJuIGEgdHVwbGUKLVxjb2RleyhcdmFye2ZpbGVuYW1lfSwgXHZhcntoZWFkZXJzfSl9IHdoZXJlIFx2YXJ7ZmlsZW5hbWV9IGlzIHRoZQotbG9jYWwgZmlsZSBuYW1lIHVuZGVyIHdoaWNoIHRoZSBvYmplY3QgY2FuIGJlIGZvdW5kLCBhbmQgXHZhcntoZWFkZXJzfQotaXMgd2hhdGV2ZXIgdGhlIFxtZXRob2R7aW5mbygpfSBtZXRob2Qgb2YgdGhlIG9iamVjdCByZXR1cm5lZCBieQotXGZ1bmN0aW9ue3VybG9wZW4oKX0gcmV0dXJuZWQgKGZvciBhIHJlbW90ZSBvYmplY3QsIHBvc3NpYmx5IGNhY2hlZCkuCi1FeGNlcHRpb25zIGFyZSB0aGUgc2FtZSBhcyBmb3IgXGZ1bmN0aW9ue3VybG9wZW4oKX0uCi0KLVRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHByZXNlbnQsIHNwZWNpZmllcyB0aGUgZmlsZSBsb2NhdGlvbiB0byBjb3B5Ci10byAoaWYgYWJzZW50LCB0aGUgbG9jYXRpb24gd2lsbCBiZSBhIHRlbXBmaWxlIHdpdGggYSBnZW5lcmF0ZWQgbmFtZSkuCi1UaGUgdGhpcmQgYXJndW1lbnQsIGlmIHByZXNlbnQsIGlzIGEgaG9vayBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkCi1vbmNlIG9uIGVzdGFibGlzaG1lbnQgb2YgdGhlIG5ldHdvcmsgY29ubmVjdGlvbiBhbmQgb25jZSBhZnRlciBlYWNoCi1ibG9jayByZWFkIHRoZXJlYWZ0ZXIuICBUaGUgaG9vayB3aWxsIGJlIHBhc3NlZCB0aHJlZSBhcmd1bWVudHM7IGEKLWNvdW50IG9mIGJsb2NrcyB0cmFuc2ZlcnJlZCBzbyBmYXIsIGEgYmxvY2sgc2l6ZSBpbiBieXRlcywgYW5kIHRoZQotdG90YWwgc2l6ZSBvZiB0aGUgZmlsZS4gIFRoZSB0aGlyZCBhcmd1bWVudCBtYXkgYmUgXGNvZGV7LTF9IG9uIG9sZGVyCi1GVFAgc2VydmVycyB3aGljaCBkbyBub3QgcmV0dXJuIGEgZmlsZSBzaXplIGluIHJlc3BvbnNlIHRvIGEgcmV0cmlldmFsCi1yZXF1ZXN0LgotCi1JZiB0aGUgXHZhcnt1cmx9IHVzZXMgdGhlIFxmaWxle2h0dHA6fSBzY2hlbWUgaWRlbnRpZmllciwgdGhlIG9wdGlvbmFsCi1cdmFye2RhdGF9IGFyZ3VtZW50IG1heSBiZSBnaXZlbiB0byBzcGVjaWZ5IGEgXGNvZGV7UE9TVH0gcmVxdWVzdAotKG5vcm1hbGx5IHRoZSByZXF1ZXN0IHR5cGUgaXMgXGNvZGV7R0VUfSkuICBUaGUgXHZhcntkYXRhfSBhcmd1bWVudAotbXVzdCBpbiBzdGFuZGFyZCBcbWltZXR5cGV7YXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkfSBmb3JtYXQ7Ci1zZWUgdGhlIFxmdW5jdGlvbnt1cmxlbmNvZGUoKX0gZnVuY3Rpb24gYmVsb3cuCi0KLVx2ZXJzaW9uY2hhbmdlZFsKLVxmdW5jdGlvbnt1cmxyZXRyaWV2ZSgpfSB3aWxsIHJhaXNlIFxleGNlcHRpb257Q29udGVudFRvb1Nob3J0RXJyb3J9Ci13aGVuIGl0IGRldGVjdHMgdGhhdCB0aGUgYW1vdW50IG9mIGRhdGEgYXZhaWxhYmxlIAotd2FzIGxlc3MgdGhhbiB0aGUgZXhwZWN0ZWQgYW1vdW50ICh3aGljaCBpcyB0aGUgc2l6ZSByZXBvcnRlZCBieSBhIAotXHZhcntDb250ZW50LUxlbmd0aH0gaGVhZGVyKS4gVGhpcyBjYW4gb2NjdXIsIGZvciBleGFtcGxlLCB3aGVuIHRoZSAKLWRvd25sb2FkIGlzIGludGVycnVwdGVkLgotCi1UaGUgXHZhcntDb250ZW50LUxlbmd0aH0gaXMgdHJlYXRlZCBhcyBhIGxvd2VyIGJvdW5kOiBpZiB0aGVyZSdzIG1vcmUgZGF0YSAKLXRvIHJlYWQsIHVybHJldHJpZXZlIHJlYWRzIG1vcmUgZGF0YSwgYnV0IGlmIGxlc3MgZGF0YSBpcyBhdmFpbGFibGUsIAotaXQgcmFpc2VzIHRoZSBleGNlcHRpb24uCi0KLVlvdSBjYW4gc3RpbGwgcmV0cmlldmUgdGhlIGRvd25sb2FkZWQgZGF0YSBpbiB0aGlzIGNhc2UsIGl0IGlzIHN0b3JlZCAKLWluIHRoZSBcbWVtYmVye2NvbnRlbnR9IGF0dHJpYnV0ZSBvZiB0aGUgZXhjZXB0aW9uIGluc3RhbmNlLgotCi1JZiBubyBcdmFye0NvbnRlbnQtTGVuZ3RofSBoZWFkZXIgd2FzIHN1cHBsaWVkLCB1cmxyZXRyaWV2ZSBjYW4KLW5vdCBjaGVjayB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBpdCBoYXMgZG93bmxvYWRlZCwgYW5kIGp1c3QgcmV0dXJucyBpdC4gCi1JbiB0aGlzIGNhc2UgeW91IGp1c3QgaGF2ZSB0byBhc3N1bWUgdGhhdCB0aGUgZG93bmxvYWQgd2FzIHN1Y2Nlc3NmdWxdezIuNX0KLQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtfdXJsb3BlbmVyfQotVGhlIHB1YmxpYyBmdW5jdGlvbnMgXGZ1bmN0aW9ue3VybG9wZW4oKX0gYW5kCi1cZnVuY3Rpb257dXJscmV0cmlldmUoKX0gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZQotXGNsYXNze0ZhbmN5VVJMb3BlbmVyfSBjbGFzcyBhbmQgdXNlIGl0IHRvIHBlcmZvcm0gdGhlaXIgcmVxdWVzdGVkCi1hY3Rpb25zLiAgVG8gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbmFsaXR5LCBwcm9ncmFtbWVycyBjYW4gY3JlYXRlIGEKLXN1YmNsYXNzIG9mIFxjbGFzc3tVUkxvcGVuZXJ9IG9yIFxjbGFzc3tGYW5jeVVSTG9wZW5lcn0sIHRoZW4gYXNzaWduCi1hbiBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzIHRvIHRoZQotXGNvZGV7dXJsbGliLl91cmxvcGVuZXJ9IHZhcmlhYmxlIGJlZm9yZSBjYWxsaW5nIHRoZSBkZXNpcmVkIGZ1bmN0aW9uLgotRm9yIGV4YW1wbGUsIGFwcGxpY2F0aW9ucyBtYXkgd2FudCB0byBzcGVjaWZ5IGEgZGlmZmVyZW50Ci1cbWFpbGhlYWRlcntVc2VyLUFnZW50fSBoZWFkZXIgdGhhbiBcY2xhc3N7VVJMb3BlbmVyfSBkZWZpbmVzLiAgVGhpcwotY2FuIGJlIGFjY29tcGxpc2hlZCB3aXRoIHRoZSBmb2xsb3dpbmcgY29kZToKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IHVybGxpYgotCi1jbGFzcyBBcHBVUkxvcGVuZXIodXJsbGliLkZhbmN5VVJMb3BlbmVyKToKLSAgICB2ZXJzaW9uID0gIkFwcC8xLjciCi0KLXVybGxpYi5fdXJsb3BlbmVyID0gQXBwVVJMb3BlbmVyKCkKLVxlbmR7dmVyYmF0aW19Ci1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3VybGNsZWFudXB9e30KLUNsZWFyIHRoZSBjYWNoZSB0aGF0IG1heSBoYXZlIGJlZW4gYnVpbHQgdXAgYnkgcHJldmlvdXMgY2FsbHMgdG8KLVxmdW5jdGlvbnt1cmxyZXRyaWV2ZSgpfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cXVvdGV9e3N0cmluZ1xvcHRpb25hbHssIHNhZmV9fQotUmVwbGFjZSBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gXHZhcntzdHJpbmd9IHVzaW5nIHRoZSBcc2FtcHtcJXh4fSBlc2NhcGUuCi1MZXR0ZXJzLCBkaWdpdHMsIGFuZCB0aGUgY2hhcmFjdGVycyBcY2hhcmFjdGVye18uLX0gYXJlIG5ldmVyIHF1b3RlZC4KLVRoZSBvcHRpb25hbCBcdmFye3NhZmV9IHBhcmFtZXRlciBzcGVjaWZpZXMgYWRkaXRpb25hbCBjaGFyYWN0ZXJzCi10aGF0IHNob3VsZCBub3QgYmUgcXVvdGVkIC0tLSBpdHMgZGVmYXVsdCB2YWx1ZSBpcyBcY29kZXsnLyd9LgotCi1FeGFtcGxlOiBcY29kZXtxdW90ZSgnL1x+e31jb25ub2xseS8nKX0geWllbGRzIFxjb2RleycvXCU3ZWNvbm5vbGx5Lyd9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtxdW90ZV9wbHVzfXtzdHJpbmdcb3B0aW9uYWx7LCBzYWZlfX0KLUxpa2UgXGZ1bmN0aW9ue3F1b3RlKCl9LCBidXQgYWxzbyByZXBsYWNlcyBzcGFjZXMgYnkgcGx1cyBzaWducywgYXMKLXJlcXVpcmVkIGZvciBxdW90aW5nIEhUTUwgZm9ybSB2YWx1ZXMuICBQbHVzIHNpZ25zIGluIHRoZSBvcmlnaW5hbAotc3RyaW5nIGFyZSBlc2NhcGVkIHVubGVzcyB0aGV5IGFyZSBpbmNsdWRlZCBpbiBcdmFye3NhZmV9LiAgSXQgYWxzbwotZG9lcyBub3QgaGF2ZSBcdmFye3NhZmV9IGRlZmF1bHQgdG8gXGNvZGV7Jy8nfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dW5xdW90ZX17c3RyaW5nfQotUmVwbGFjZSBcc2FtcHtcJXh4fSBlc2NhcGVzIGJ5IHRoZWlyIHNpbmdsZS1jaGFyYWN0ZXIgZXF1aXZhbGVudC4KLQotRXhhbXBsZTogXGNvZGV7dW5xdW90ZSgnL1wlN0Vjb25ub2xseS8nKX0geWllbGRzIFxjb2RleycvXH57fWNvbm5vbGx5Lyd9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt1bnF1b3RlX3BsdXN9e3N0cmluZ30KLUxpa2UgXGZ1bmN0aW9ue3VucXVvdGUoKX0sIGJ1dCBhbHNvIHJlcGxhY2VzIHBsdXMgc2lnbnMgYnkgc3BhY2VzLCBhcwotcmVxdWlyZWQgZm9yIHVucXVvdGluZyBIVE1MIGZvcm0gdmFsdWVzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt1cmxlbmNvZGV9e3F1ZXJ5XG9wdGlvbmFseywgZG9zZXF9fQotQ29udmVydCBhIG1hcHBpbmcgb2JqZWN0IG9yIGEgc2VxdWVuY2Ugb2YgdHdvLWVsZW1lbnQgdHVwbGVzICB0byBhCi1gYHVybC1lbmNvZGVkJycgc3RyaW5nLCBzdWl0YWJsZSB0byBwYXNzIHRvCi1cZnVuY3Rpb257dXJsb3BlbigpfSBhYm92ZSBhcyB0aGUgb3B0aW9uYWwgXHZhcntkYXRhfSBhcmd1bWVudC4gIFRoaXMKLWlzIHVzZWZ1bCB0byBwYXNzIGEgZGljdGlvbmFyeSBvZiBmb3JtIGZpZWxkcyB0byBhIFxjb2Rle1BPU1R9Ci1yZXF1ZXN0LiAgVGhlIHJlc3VsdGluZyBzdHJpbmcgaXMgYSBzZXJpZXMgb2YKLVxjb2Rle1x2YXJ7a2V5fT1cdmFye3ZhbHVlfX0gcGFpcnMgc2VwYXJhdGVkIGJ5IFxjaGFyYWN0ZXJ7XCZ9Ci1jaGFyYWN0ZXJzLCB3aGVyZSBib3RoIFx2YXJ7a2V5fSBhbmQgXHZhcnt2YWx1ZX0gYXJlIHF1b3RlZCB1c2luZwotXGZ1bmN0aW9ue3F1b3RlX3BsdXMoKX0gYWJvdmUuICBJZiB0aGUgb3B0aW9uYWwgcGFyYW1ldGVyIFx2YXJ7ZG9zZXF9IGlzCi1wcmVzZW50IGFuZCBldmFsdWF0ZXMgdG8gdHJ1ZSwgaW5kaXZpZHVhbCBcY29kZXtcdmFye2tleX09XHZhcnt2YWx1ZX19IHBhaXJzCi1hcmUgZ2VuZXJhdGVkIGZvciBlYWNoIGVsZW1lbnQgb2YgdGhlIHNlcXVlbmNlLgotV2hlbiBhIHNlcXVlbmNlIG9mIHR3by1lbGVtZW50IHR1cGxlcyBpcyB1c2VkIGFzIHRoZSBcdmFye3F1ZXJ5fSBhcmd1bWVudCwKLXRoZSBmaXJzdCBlbGVtZW50IG9mIGVhY2ggdHVwbGUgaXMgYSBrZXkgYW5kIHRoZSBzZWNvbmQgaXMgYSB2YWx1ZS4gIFRoZQotb3JkZXIgb2YgcGFyYW1ldGVycyBpbiB0aGUgZW5jb2RlZCBzdHJpbmcgd2lsbCBtYXRjaCB0aGUgb3JkZXIgb2YgcGFyYW1ldGVyCi10dXBsZXMgaW4gdGhlIHNlcXVlbmNlLgotVGhlIFxyZWZtb2R1bGV7Y2dpfSBtb2R1bGUgcHJvdmlkZXMgdGhlIGZ1bmN0aW9ucwotXGZ1bmN0aW9ue3BhcnNlX3FzKCl9IGFuZCBcZnVuY3Rpb257cGFyc2VfcXNsKCl9IHdoaWNoIGFyZSB1c2VkIHRvCi1wYXJzZSBxdWVyeSBzdHJpbmdzIGludG8gUHl0aG9uIGRhdGEgc3RydWN0dXJlcy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cGF0aG5hbWUydXJsfXtwYXRofQotQ29udmVydCB0aGUgcGF0aG5hbWUgXHZhcntwYXRofSBmcm9tIHRoZSBsb2NhbCBzeW50YXggZm9yIGEgcGF0aCB0bwotdGhlIGZvcm0gdXNlZCBpbiB0aGUgcGF0aCBjb21wb25lbnQgb2YgYSBVUkwuICBUaGlzIGRvZXMgbm90IHByb2R1Y2UgYQotY29tcGxldGUgVVJMLiAgVGhlIHJldHVybiB2YWx1ZSB3aWxsIGFscmVhZHkgYmUgcXVvdGVkIHVzaW5nIHRoZQotXGZ1bmN0aW9ue3F1b3RlKCl9IGZ1bmN0aW9uLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt1cmwycGF0aG5hbWV9e3BhdGh9Ci1Db252ZXJ0IHRoZSBwYXRoIGNvbXBvbmVudCBcdmFye3BhdGh9IGZyb20gYW4gZW5jb2RlZCBVUkwgdG8gdGhlIGxvY2FsCi1zeW50YXggZm9yIGEgcGF0aC4gIFRoaXMgZG9lcyBub3QgYWNjZXB0IGEgY29tcGxldGUgVVJMLiAgVGhpcwotZnVuY3Rpb24gdXNlcyBcZnVuY3Rpb257dW5xdW90ZSgpfSB0byBkZWNvZGUgXHZhcntwYXRofS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1VSTG9wZW5lcn17XG9wdGlvbmFse3Byb3hpZXNcb3B0aW9uYWx7LCAqKng1MDl9fX0KLUJhc2UgY2xhc3MgZm9yIG9wZW5pbmcgYW5kIHJlYWRpbmcgVVJMcy4gIFVubGVzcyB5b3UgbmVlZCB0byBzdXBwb3J0Ci1vcGVuaW5nIG9iamVjdHMgdXNpbmcgc2NoZW1lcyBvdGhlciB0aGFuIFxmaWxle2h0dHA6fSwgXGZpbGV7ZnRwOn0sCi1vciBcZmlsZXtmaWxlOn0sIHlvdSBwcm9iYWJseSB3YW50IHRvIHVzZQotXGNsYXNze0ZhbmN5VVJMb3BlbmVyfS4KLQotQnkgZGVmYXVsdCwgdGhlIFxjbGFzc3tVUkxvcGVuZXJ9IGNsYXNzIHNlbmRzIGEKLVxtYWlsaGVhZGVye1VzZXItQWdlbnR9IGhlYWRlciBvZiBcc2FtcHt1cmxsaWIvXHZhcntWVlZ9fSwgd2hlcmUKLVx2YXJ7VlZWfSBpcyB0aGUgXG1vZHVsZXt1cmxsaWJ9IHZlcnNpb24gbnVtYmVyLiAgQXBwbGljYXRpb25zIGNhbgotZGVmaW5lIHRoZWlyIG93biBcbWFpbGhlYWRlcntVc2VyLUFnZW50fSBoZWFkZXIgYnkgc3ViY2xhc3NpbmcKLVxjbGFzc3tVUkxvcGVuZXJ9IG9yIFxjbGFzc3tGYW5jeVVSTG9wZW5lcn0gYW5kIHNldHRpbmcgdGhlIGNsYXNzCi1hdHRyaWJ1dGUgXG1lbWJlcnt2ZXJzaW9ufSB0byBhbiBhcHByb3ByaWF0ZSBzdHJpbmcgdmFsdWUgaW4gdGhlCi1zdWJjbGFzcyBkZWZpbml0aW9uLgotCi1UaGUgb3B0aW9uYWwgXHZhcntwcm94aWVzfSBwYXJhbWV0ZXIgc2hvdWxkIGJlIGEgZGljdGlvbmFyeSBtYXBwaW5nCi1zY2hlbWUgbmFtZXMgdG8gcHJveHkgVVJMcywgd2hlcmUgYW4gZW1wdHkgZGljdGlvbmFyeSB0dXJucyBwcm94aWVzCi1vZmYgY29tcGxldGVseS4gIEl0cyBkZWZhdWx0IHZhbHVlIGlzIFxjb2Rle05vbmV9LCBpbiB3aGljaCBjYXNlCi1lbnZpcm9ubWVudGFsIHByb3h5IHNldHRpbmdzIHdpbGwgYmUgdXNlZCBpZiBwcmVzZW50LCBhcyBkaXNjdXNzZWQgaW4KLXRoZSBkZWZpbml0aW9uIG9mIFxmdW5jdGlvbnt1cmxvcGVuKCl9LCBhYm92ZS4KLQotQWRkaXRpb25hbCBrZXl3b3JkIHBhcmFtZXRlcnMsIGNvbGxlY3RlZCBpbiBcdmFye3g1MDl9LCBtYXkgYmUgdXNlZCBmb3IKLWF1dGhlbnRpY2F0aW9uIG9mIHRoZSBjbGllbnQgd2hlbiB1c2luZyB0aGUgXGZpbGV7aHR0cHM6fSBzY2hlbWUuICBUaGUga2V5d29yZHMKLVx2YXJ7a2V5X2ZpbGV9IGFuZCBcdmFye2NlcnRfZmlsZX0gYXJlIHN1cHBvcnRlZCB0byBwcm92aWRlIGFuIAotU1NMIGtleSBhbmQgY2VydGlmaWNhdGU7IGJvdGggYXJlIG5lZWRlZCB0byBzdXBwb3J0IGNsaWVudCBhdXRoZW50aWNhdGlvbi4KLQotXGNsYXNze1VSTG9wZW5lcn0gb2JqZWN0cyB3aWxsIHJhaXNlIGFuIFxleGNlcHRpb257SU9FcnJvcn0gZXhjZXB0aW9uCi1pZiB0aGUgc2VydmVyIHJldHVybnMgYW4gZXJyb3IgY29kZS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtGYW5jeVVSTG9wZW5lcn17Li4ufQotXGNsYXNze0ZhbmN5VVJMb3BlbmVyfSBzdWJjbGFzc2VzIFxjbGFzc3tVUkxvcGVuZXJ9IHByb3ZpZGluZyBkZWZhdWx0Ci1oYW5kbGluZyBmb3IgdGhlIGZvbGxvd2luZyBIVFRQIHJlc3BvbnNlIGNvZGVzOiAzMDEsIDMwMiwgMzAzLCAzMDcgYW5kCi00MDEuICBGb3IgdGhlIDMweCByZXNwb25zZSBjb2RlcyBsaXN0ZWQgYWJvdmUsIHRoZQotXG1haWxoZWFkZXJ7TG9jYXRpb259IGhlYWRlciBpcyB1c2VkIHRvIGZldGNoIHRoZSBhY3R1YWwgVVJMLiAgRm9yIDQwMQotcmVzcG9uc2UgY29kZXMgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKSwgYmFzaWMgSFRUUCBhdXRoZW50aWNhdGlvbiBpcwotcGVyZm9ybWVkLiAgRm9yIHRoZSAzMHggcmVzcG9uc2UgY29kZXMsIHJlY3Vyc2lvbiBpcyBib3VuZGVkIGJ5IHRoZQotdmFsdWUgb2YgdGhlIFx2YXJ7bWF4dHJpZXN9IGF0dHJpYnV0ZSwgd2hpY2ggZGVmYXVsdHMgdG8gMTAuCi0KLUZvciBhbGwgb3RoZXIgcmVzcG9uc2UgY29kZXMsIHRoZSBtZXRob2QgXG1ldGhvZHtodHRwX2Vycm9yX2RlZmF1bHQoKX0KLWlzIGNhbGxlZCB3aGljaCB5b3UgY2FuIG92ZXJyaWRlIGluIHN1YmNsYXNzZXMgdG8gaGFuZGxlIHRoZSBlcnJvcgotYXBwcm9wcmlhdGVseS4KLQotXG5vdGV7QWNjb3JkaW5nIHRvIHRoZSBsZXR0ZXIgb2YgXHJmY3syNjE2fSwgMzAxIGFuZCAzMDIgcmVzcG9uc2VzIHRvCi0gIFBPU1QgcmVxdWVzdHMgbXVzdCBub3QgYmUgYXV0b21hdGljYWxseSByZWRpcmVjdGVkIHdpdGhvdXQKLSAgY29uZmlybWF0aW9uIGJ5IHRoZSB1c2VyLiAgSW4gcmVhbGl0eSwgYnJvd3NlcnMgZG8gYWxsb3cgYXV0b21hdGljCi0gIHJlZGlyZWN0aW9uIG9mIHRoZXNlIHJlc3BvbnNlcywgY2hhbmdpbmcgdGhlIFBPU1QgdG8gYSBHRVQsIGFuZAotICBcbW9kdWxle3VybGxpYn0gcmVwcm9kdWNlcyB0aGlzIGJlaGF2aW91ci59Ci0KLVRoZSBwYXJhbWV0ZXJzIHRvIHRoZSBjb25zdHJ1Y3RvciBhcmUgdGhlIHNhbWUgYXMgdGhvc2UgZm9yCi1cY2xhc3N7VVJMb3BlbmVyfS4KLQotXG5vdGV7V2hlbiBwZXJmb3JtaW5nIGJhc2ljIGF1dGhlbnRpY2F0aW9uLCBhCi1cY2xhc3N7RmFuY3lVUkxvcGVuZXJ9IGluc3RhbmNlIGNhbGxzIGl0cwotXG1ldGhvZHtwcm9tcHRfdXNlcl9wYXNzd2QoKX0gbWV0aG9kLiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYXNrcwotdGhlIHVzZXJzIGZvciB0aGUgcmVxdWlyZWQgaW5mb3JtYXRpb24gb24gdGhlIGNvbnRyb2xsaW5nIHRlcm1pbmFsLiAgQQotc3ViY2xhc3MgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHN1cHBvcnQgbW9yZSBhcHByb3ByaWF0ZSBiZWhhdmlvcgotaWYgbmVlZGVkLn0KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57ZXhjY2xhc3NkZXNjfXtDb250ZW50VG9vU2hvcnRFcnJvcn17bXNnXG9wdGlvbmFseywgY29udGVudH19Ci1UaGlzIGV4Y2VwdGlvbiBpcyByYWlzZWQgd2hlbiB0aGUgXGZ1bmN0aW9ue3VybHJldHJpZXZlKCl9IGZ1bmN0aW9uCi1kZXRlY3RzIHRoYXQgdGhlIGFtb3VudCBvZiB0aGUgZG93bmxvYWRlZCBkYXRhIGlzIGxlc3MgdGhhbiB0aGUgCi1leHBlY3RlZCBhbW91bnQgKGdpdmVuIGJ5IHRoZSBcdmFye0NvbnRlbnQtTGVuZ3RofSBoZWFkZXIpLiBUaGUKLVxtZW1iZXJ7Y29udGVudH0gYXR0cmlidXRlIHN0b3JlcyB0aGUgZG93bmxvYWRlZCAoYW5kIHN1cHBvc2VkbHkKLXRydW5jYXRlZCkgZGF0YS4KLVx2ZXJzaW9uYWRkZWR7Mi41fQotXGVuZHtleGNjbGFzc2Rlc2N9Ci0KLVJlc3RyaWN0aW9uczoKLQotXGJlZ2lue2l0ZW1pemV9Ci0KLVxpdGVtCi1DdXJyZW50bHksIG9ubHkgdGhlIGZvbGxvd2luZyBwcm90b2NvbHMgYXJlIHN1cHBvcnRlZDogSFRUUCwgKHZlcnNpb25zCi0wLjkgYW5kIDEuMCksICBGVFAsIGFuZCBsb2NhbCBmaWxlcy4KLVxpbmRleGlpe0hUVFB9e3Byb3RvY29sfQotXGluZGV4aWl7RlRQfXtwcm90b2NvbH0KLQotXGl0ZW0KLVRoZSBjYWNoaW5nIGZlYXR1cmUgb2YgXGZ1bmN0aW9ue3VybHJldHJpZXZlKCl9IGhhcyBiZWVuIGRpc2FibGVkCi11bnRpbCBJIGZpbmQgdGhlIHRpbWUgdG8gaGFjayBwcm9wZXIgcHJvY2Vzc2luZyBvZiBFeHBpcmF0aW9uIHRpbWUKLWhlYWRlcnMuCi0KLVxpdGVtCi1UaGVyZSBzaG91bGQgYmUgYSBmdW5jdGlvbiB0byBxdWVyeSB3aGV0aGVyIGEgcGFydGljdWxhciBVUkwgaXMgaW4KLXRoZSBjYWNoZS4KLQotXGl0ZW0KLUZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBpZiBhIFVSTCBhcHBlYXJzIHRvIHBvaW50IHRvIGEgbG9jYWwgZmlsZQotYnV0IHRoZSBmaWxlIGNhbid0IGJlIG9wZW5lZCwgdGhlIFVSTCBpcyByZS1pbnRlcnByZXRlZCB1c2luZyB0aGUgRlRQCi1wcm90b2NvbC4gIFRoaXMgY2FuIHNvbWV0aW1lcyBjYXVzZSBjb25mdXNpbmcgZXJyb3IgbWVzc2FnZXMuCi0KLVxpdGVtCi1UaGUgXGZ1bmN0aW9ue3VybG9wZW4oKX0gYW5kIFxmdW5jdGlvbnt1cmxyZXRyaWV2ZSgpfSBmdW5jdGlvbnMgY2FuCi1jYXVzZSBhcmJpdHJhcmlseSBsb25nIGRlbGF5cyB3aGlsZSB3YWl0aW5nIGZvciBhIG5ldHdvcmsgY29ubmVjdGlvbgotdG8gYmUgc2V0IHVwLiAgVGhpcyBtZWFucyB0aGF0IGl0IGlzIGRpZmZpY3VsdCB0byBidWlsZCBhbiBpbnRlcmFjdGl2ZQotV2ViIGNsaWVudCB1c2luZyB0aGVzZSBmdW5jdGlvbnMgd2l0aG91dCB1c2luZyB0aHJlYWRzLgotCi1caXRlbQotVGhlIGRhdGEgcmV0dXJuZWQgYnkgXGZ1bmN0aW9ue3VybG9wZW4oKX0gb3IgXGZ1bmN0aW9ue3VybHJldHJpZXZlKCl9Ci1pcyB0aGUgcmF3IGRhdGEgcmV0dXJuZWQgYnkgdGhlIHNlcnZlci4gIFRoaXMgbWF5IGJlIGJpbmFyeSBkYXRhCi0oc3VjaCBhcyBhbiBpbWFnZSksIHBsYWluIHRleHQgb3IgKGZvciBleGFtcGxlKSBIVE1MXGluZGV4e0hUTUx9LiAgVGhlCi1IVFRQXGluZGV4aWl7SFRUUH17cHJvdG9jb2x9IHByb3RvY29sIHByb3ZpZGVzIHR5cGUgaW5mb3JtYXRpb24gaW4gdGhlCi1yZXBseSBoZWFkZXIsIHdoaWNoIGNhbiBiZSBpbnNwZWN0ZWQgYnkgbG9va2luZyBhdCB0aGUKLVxtYWlsaGVhZGVye0NvbnRlbnQtVHlwZX0gaGVhZGVyLiAgSWYgdGhlCi1yZXR1cm5lZCBkYXRhIGlzIEhUTUwsIHlvdSBjYW4gdXNlIHRoZSBtb2R1bGUKLVxyZWZtb2R1bGV7aHRtbGxpYn1ccmVmc3Rtb2RpbmRleHtodG1sbGlifSB0byBwYXJzZSBpdC4KLQotXGl0ZW0KLVRoZSBjb2RlIGhhbmRsaW5nIHRoZSBGVFBcaW5kZXh7RlRQfSBwcm90b2NvbCBjYW5ub3QgZGlmZmVyZW50aWF0ZQotYmV0d2VlbiBhIGZpbGUgYW5kIGEgZGlyZWN0b3J5LiAgVGhpcyBjYW4gbGVhZCB0byB1bmV4cGVjdGVkIGJlaGF2aW9yCi13aGVuIGF0dGVtcHRpbmcgdG8gcmVhZCBhIFVSTCB0aGF0IHBvaW50cyB0byBhIGZpbGUgdGhhdCBpcyBub3QKLWFjY2Vzc2libGUuICBJZiB0aGUgVVJMIGVuZHMgaW4gYSBcY29kZXsvfSwgaXQgaXMgYXNzdW1lZCB0byByZWZlciB0bwotYSBkaXJlY3RvcnkgYW5kIHdpbGwgYmUgaGFuZGxlZCBhY2NvcmRpbmdseS4gIEJ1dCBpZiBhbiBhdHRlbXB0IHRvCi1yZWFkIGEgZmlsZSBsZWFkcyB0byBhIDU1MCBlcnJvciAobWVhbmluZyB0aGUgVVJMIGNhbm5vdCBiZSBmb3VuZCBvcgotaXMgbm90IGFjY2Vzc2libGUsIG9mdGVuIGZvciBwZXJtaXNzaW9uIHJlYXNvbnMpLCB0aGVuIHRoZSBwYXRoIGlzCi10cmVhdGVkIGFzIGEgZGlyZWN0b3J5IGluIG9yZGVyIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVuIGEgZGlyZWN0b3J5IGlzCi1zcGVjaWZpZWQgYnkgYSBVUkwgYnV0IHRoZSB0cmFpbGluZyBcY29kZXsvfSBoYXMgYmVlbiBsZWZ0IG9mZi4gIFRoaXMgY2FuCi1jYXVzZSBtaXNsZWFkaW5nIHJlc3VsdHMgd2hlbiB5b3UgdHJ5IHRvIGZldGNoIGEgZmlsZSB3aG9zZSByZWFkCi1wZXJtaXNzaW9ucyBtYWtlIGl0IGluYWNjZXNzaWJsZTsgdGhlIEZUUCBjb2RlIHdpbGwgdHJ5IHRvIHJlYWQgaXQsCi1mYWlsIHdpdGggYSA1NTAgZXJyb3IsIGFuZCB0aGVuIHBlcmZvcm0gYSBkaXJlY3RvcnkgbGlzdGluZyBmb3IgdGhlCi11bnJlYWRhYmxlIGZpbGUuIElmIGZpbmUtZ3JhaW5lZCBjb250cm9sIGlzIG5lZWRlZCwgY29uc2lkZXIgdXNpbmcgdGhlCi1cbW9kdWxle2Z0cGxpYn0gbW9kdWxlLCBzdWJjbGFzc2luZyBcY2xhc3N7RmFuY3lVUkxPcGVuZXJ9LCBvciBjaGFuZ2luZwotXHZhcntfdXJsb3BlbmVyfSB0byBtZWV0IHlvdXIgbmVlZHMuCi0KLVxpdGVtCi1UaGlzIG1vZHVsZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSB1c2Ugb2YgcHJveGllcyB3aGljaCByZXF1aXJlCi1hdXRoZW50aWNhdGlvbi4gIFRoaXMgbWF5IGJlIGltcGxlbWVudGVkIGluIHRoZSBmdXR1cmUuCi0KLVxpdGVtCi1BbHRob3VnaCB0aGUgXG1vZHVsZXt1cmxsaWJ9IG1vZHVsZSBjb250YWlucyAodW5kb2N1bWVudGVkKSByb3V0aW5lcwotdG8gcGFyc2UgYW5kIHVucGFyc2UgVVJMIHN0cmluZ3MsIHRoZSByZWNvbW1lbmRlZCBpbnRlcmZhY2UgZm9yIFVSTAotbWFuaXB1bGF0aW9uIGlzIGluIG1vZHVsZSBccmVmbW9kdWxle3VybHBhcnNlfVxyZWZzdG1vZGluZGV4e3VybHBhcnNlfS4KLQotXGVuZHtpdGVtaXplfQotCi0KLVxzdWJzZWN0aW9ue1VSTG9wZW5lciBPYmplY3RzIFxsYWJlbHt1cmxvcGVuZXItb2Jqc319Ci1cc2VjdGlvbmF1dGhvcntTa2lwIE1vbnRhbmFyb317c2tpcEBtb2phbS5jb219Ci0KLVxjbGFzc3tVUkxvcGVuZXJ9IGFuZCBcY2xhc3N7RmFuY3lVUkxvcGVuZXJ9IG9iamVjdHMgaGF2ZSB0aGUKLWZvbGxvd2luZyBhdHRyaWJ1dGVzLgotCi1cYmVnaW57bWV0aG9kZGVzY31bVVJMb3BlbmVyXXtvcGVufXtmdWxsdXJsXG9wdGlvbmFseywgZGF0YX19Ci1PcGVuIFx2YXJ7ZnVsbHVybH0gdXNpbmcgdGhlIGFwcHJvcHJpYXRlIHByb3RvY29sLiAgVGhpcyBtZXRob2Qgc2V0cwotdXAgY2FjaGUgYW5kIHByb3h5IGluZm9ybWF0aW9uLCB0aGVuIGNhbGxzIHRoZSBhcHByb3ByaWF0ZSBvcGVuIG1ldGhvZCB3aXRoCi1pdHMgaW5wdXQgYXJndW1lbnRzLiAgSWYgdGhlIHNjaGVtZSBpcyBub3QgcmVjb2duaXplZCwKLVxtZXRob2R7b3Blbl91bmtub3duKCl9IGlzIGNhbGxlZC4gIFRoZSBcdmFye2RhdGF9IGFyZ3VtZW50Ci1oYXMgdGhlIHNhbWUgbWVhbmluZyBhcyB0aGUgXHZhcntkYXRhfSBhcmd1bWVudCBvZiBcZnVuY3Rpb257dXJsb3BlbigpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1VSTG9wZW5lcl17b3Blbl91bmtub3dufXtmdWxsdXJsXG9wdGlvbmFseywgZGF0YX19Ci1PdmVycmlkYWJsZSBpbnRlcmZhY2UgdG8gb3BlbiB1bmtub3duIFVSTCB0eXBlcy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1VSTG9wZW5lcl17cmV0cmlldmV9e3VybFxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGhvb2tcb3B0aW9uYWx7LCBkYXRhfX19fQotUmV0cmlldmVzIHRoZSBjb250ZW50cyBvZiBcdmFye3VybH0gYW5kIHBsYWNlcyBpdCBpbiBcdmFye2ZpbGVuYW1lfS4gIFRoZQotcmV0dXJuIHZhbHVlIGlzIGEgdHVwbGUgY29uc2lzdGluZyBvZiBhIGxvY2FsIGZpbGVuYW1lIGFuZCBlaXRoZXIgYQotXGNsYXNze21pbWV0b29scy5NZXNzYWdlfSBvYmplY3QgY29udGFpbmluZyB0aGUgcmVzcG9uc2UgaGVhZGVycyAoZm9yIHJlbW90ZQotVVJMcykgb3IgXGNvZGV7Tm9uZX0gKGZvciBsb2NhbCBVUkxzKS4gIFRoZSBjYWxsZXIgbXVzdCB0aGVuIG9wZW4gYW5kIHJlYWQgdGhlCi1jb250ZW50cyBvZiBcdmFye2ZpbGVuYW1lfS4gIElmIFx2YXJ7ZmlsZW5hbWV9IGlzIG5vdCBnaXZlbiBhbmQgdGhlIFVSTAotcmVmZXJzIHRvIGEgbG9jYWwgZmlsZSwgdGhlIGlucHV0IGZpbGVuYW1lIGlzIHJldHVybmVkLiAgSWYgdGhlIFVSTCBpcwotbm9uLWxvY2FsIGFuZCBcdmFye2ZpbGVuYW1lfSBpcyBub3QgZ2l2ZW4sIHRoZSBmaWxlbmFtZSBpcyB0aGUgb3V0cHV0IG9mCi1cZnVuY3Rpb257dGVtcGZpbGUubWt0ZW1wKCl9IHdpdGggYSBzdWZmaXggdGhhdCBtYXRjaGVzIHRoZSBzdWZmaXggb2YgdGhlIGxhc3QKLXBhdGggY29tcG9uZW50IG9mIHRoZSBpbnB1dCBVUkwuICBJZiBcdmFye3JlcG9ydGhvb2t9IGlzIGdpdmVuLCBpdCBtdXN0IGJlCi1hIGZ1bmN0aW9uIGFjY2VwdGluZyB0aHJlZSBudW1lcmljIHBhcmFtZXRlcnMuICBJdCB3aWxsIGJlIGNhbGxlZCBhZnRlciBlYWNoCi1jaHVuayBvZiBkYXRhIGlzIHJlYWQgZnJvbSB0aGUgbmV0d29yay4gIFx2YXJ7cmVwb3J0aG9va30gaXMgaWdub3JlZCBmb3IKLWxvY2FsIFVSTHMuCi0KLUlmIHRoZSBcdmFye3VybH0gdXNlcyB0aGUgXGZpbGV7aHR0cDp9IHNjaGVtZSBpZGVudGlmaWVyLCB0aGUgb3B0aW9uYWwKLVx2YXJ7ZGF0YX0gYXJndW1lbnQgbWF5IGJlIGdpdmVuIHRvIHNwZWNpZnkgYSBcY29kZXtQT1NUfSByZXF1ZXN0Ci0obm9ybWFsbHkgdGhlIHJlcXVlc3QgdHlwZSBpcyBcY29kZXtHRVR9KS4gIFRoZSBcdmFye2RhdGF9IGFyZ3VtZW50Ci1tdXN0IGluIHN0YW5kYXJkIFxtaW1ldHlwZXthcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWR9IGZvcm1hdDsKLXNlZSB0aGUgXGZ1bmN0aW9ue3VybGVuY29kZSgpfSBmdW5jdGlvbiBiZWxvdy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W1VSTG9wZW5lcl17dmVyc2lvbn0KLVZhcmlhYmxlIHRoYXQgc3BlY2lmaWVzIHRoZSB1c2VyIGFnZW50IG9mIHRoZSBvcGVuZXIgb2JqZWN0LiAgVG8gZ2V0Ci1ccmVmbW9kdWxle3VybGxpYn0gdG8gdGVsbCBzZXJ2ZXJzIHRoYXQgaXQgaXMgYSBwYXJ0aWN1bGFyIHVzZXIgYWdlbnQsCi1zZXQgdGhpcyBpbiBhIHN1YmNsYXNzIGFzIGEgY2xhc3MgdmFyaWFibGUgb3IgaW4gdGhlIGNvbnN0cnVjdG9yCi1iZWZvcmUgY2FsbGluZyB0aGUgYmFzZSBjb25zdHJ1Y3Rvci4KLVxlbmR7bWVtYmVyZGVzY30KLQotVGhlIFxjbGFzc3tGYW5jeVVSTG9wZW5lcn0gY2xhc3Mgb2ZmZXJzIG9uZSBhZGRpdGlvbmFsIG1ldGhvZCB0aGF0Ci1zaG91bGQgYmUgb3ZlcmxvYWRlZCB0byBwcm92aWRlIHRoZSBhcHByb3ByaWF0ZSBiZWhhdmlvcjoKLQotXGJlZ2lue21ldGhvZGRlc2N9W0ZhbmN5VVJMb3BlbmVyXXtwcm9tcHRfdXNlcl9wYXNzd2R9e2hvc3QsIHJlYWxtfQotUmV0dXJuIGluZm9ybWF0aW9uIG5lZWRlZCB0byBhdXRoZW50aWNhdGUgdGhlIHVzZXIgYXQgdGhlIGdpdmVuIGhvc3QKLWluIHRoZSBzcGVjaWZpZWQgc2VjdXJpdHkgcmVhbG0uICBUaGUgcmV0dXJuIHZhbHVlIHNob3VsZCBiZSBhIHR1cGxlLAotXGNvZGV7KFx2YXJ7dXNlcn0sIFx2YXJ7cGFzc3dvcmR9KX0sIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBiYXNpYwotYXV0aGVudGljYXRpb24uCi0KLVRoZSBpbXBsZW1lbnRhdGlvbiBwcm9tcHRzIGZvciB0aGlzIGluZm9ybWF0aW9uIG9uIHRoZSB0ZXJtaW5hbDsgYW4KLWFwcGxpY2F0aW9uIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byB1c2UgYW4gYXBwcm9wcmlhdGUKLWludGVyYWN0aW9uIG1vZGVsIGluIHRoZSBsb2NhbCBlbnZpcm9ubWVudC4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cc3Vic2VjdGlvbntFeGFtcGxlc30KLVxub2RlbmFtZXtVcmxsaWIgRXhhbXBsZXN9Ci0KLUhlcmUgaXMgYW4gZXhhbXBsZSBzZXNzaW9uIHRoYXQgdXNlcyB0aGUgXHNhbXB7R0VUfSBtZXRob2QgdG8gcmV0cmlldmUKLWEgVVJMIGNvbnRhaW5pbmcgcGFyYW1ldGVyczoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGltcG9ydCB1cmxsaWIKLT4+PiBwYXJhbXMgPSB1cmxsaWIudXJsZW5jb2RlKHsnc3BhbSc6IDEsICdlZ2dzJzogMiwgJ2JhY29uJzogMH0pCi0+Pj4gZiA9IHVybGxpYi51cmxvcGVuKCJodHRwOi8vd3d3Lm11c2ktY2FsLmNvbS9jZ2ktYmluL3F1ZXJ5PyVzIiAlIHBhcmFtcykKLT4+PiBwcmludCBmLnJlYWQoKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGZvbGxvd2luZyBleGFtcGxlIHVzZXMgdGhlIFxzYW1we1BPU1R9IG1ldGhvZCBpbnN0ZWFkOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gaW1wb3J0IHVybGxpYgotPj4+IHBhcmFtcyA9IHVybGxpYi51cmxlbmNvZGUoeydzcGFtJzogMSwgJ2VnZ3MnOiAyLCAnYmFjb24nOiAwfSkKLT4+PiBmID0gdXJsbGliLnVybG9wZW4oImh0dHA6Ly93d3cubXVzaS1jYWwuY29tL2NnaS1iaW4vcXVlcnkiLCBwYXJhbXMpCi0+Pj4gcHJpbnQgZi5yZWFkKCkKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBmb2xsb3dpbmcgZXhhbXBsZSB1c2VzIGFuIGV4cGxpY2l0bHkgc3BlY2lmaWVkIEhUVFAgcHJveHksCi1vdmVycmlkaW5nIGVudmlyb25tZW50IHNldHRpbmdzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gaW1wb3J0IHVybGxpYgotPj4+IHByb3hpZXMgPSB7J2h0dHAnOiAnaHR0cDovL3Byb3h5LmV4YW1wbGUuY29tOjgwODAvJ30KLT4+PiBvcGVuZXIgPSB1cmxsaWIuRmFuY3lVUkxvcGVuZXIocHJveGllcykKLT4+PiBmID0gb3BlbmVyLm9wZW4oImh0dHA6Ly93d3cucHl0aG9uLm9yZyIpCi0+Pj4gZi5yZWFkKCkKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBmb2xsb3dpbmcgZXhhbXBsZSB1c2VzIG5vIHByb3hpZXMgYXQgYWxsLCBvdmVycmlkaW5nIGVudmlyb25tZW50Ci1zZXR0aW5nczoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGltcG9ydCB1cmxsaWIKLT4+PiBvcGVuZXIgPSB1cmxsaWIuRmFuY3lVUkxvcGVuZXIoe30pCi0+Pj4gZiA9IG9wZW5lci5vcGVuKCJodHRwOi8vd3d3LnB5dGhvbi5vcmcvIikKLT4+PiBmLnJlYWQoKQotXGVuZHt2ZXJiYXRpbX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlidXJsbGliMi50ZXggYi9Eb2MvbGliL2xpYnVybGxpYjIudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDJjMzgyLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlidXJsbGliMi50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw4NzIgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXt1cmxsaWIyfSAtLS0KLSAgICAgICAgIGV4dGVuc2libGUgbGlicmFyeSBmb3Igb3BlbmluZyBVUkxzfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17dXJsbGliMn0KLVxtb2R1bGVhdXRob3J7SmVyZW15IEh5bHRvbn17amh5bHRvbkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXR9Ci1cc2VjdGlvbmF1dGhvcntNb3NoZSBaYWRrYX17bW9zaGV6QHVzZXJzLnNvdXJjZWZvcmdlLm5ldH0KLQotXG1vZHVsZXN5bm9wc2lze0FuIGV4dGVuc2libGUgbGlicmFyeSBmb3Igb3BlbmluZyBVUkxzIHVzaW5nIGEgdmFyaWV0eSBvZiAKLSAgICAgICAgICAgICAgICBwcm90b2NvbHN9Ci0KLVRoZSBcbW9kdWxle3VybGxpYjJ9IG1vZHVsZSBkZWZpbmVzIGZ1bmN0aW9ucyBhbmQgY2xhc3NlcyB3aGljaCBoZWxwCi1pbiBvcGVuaW5nIFVSTHMgKG1vc3RseSBIVFRQKSBpbiBhIGNvbXBsZXggd29ybGQgLS0tIGJhc2ljIGFuZCBkaWdlc3QKLWF1dGhlbnRpY2F0aW9uLCByZWRpcmVjdGlvbnMsIGNvb2tpZXMgYW5kIG1vcmUuCi0KLVRoZSBcbW9kdWxle3VybGxpYjJ9IG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgotCi1cYmVnaW57ZnVuY2Rlc2N9e3VybG9wZW59e3VybFxvcHRpb25hbHssIGRhdGF9XG9wdGlvbmFseywgdGltZW91dH19Ci1PcGVuIHRoZSBVUkwgXHZhcnt1cmx9LCB3aGljaCBjYW4gYmUgZWl0aGVyIGEgc3RyaW5nIG9yIGEgXGNsYXNze1JlcXVlc3R9Ci1vYmplY3QuCi0KLVx2YXJ7ZGF0YX0gbWF5IGJlIGEgc3RyaW5nIHNwZWNpZnlpbmcgYWRkaXRpb25hbCBkYXRhIHRvIHNlbmQgdG8gdGhlCi1zZXJ2ZXIsIG9yIFxjb2Rle05vbmV9IGlmIG5vIHN1Y2ggZGF0YSBpcyBuZWVkZWQuIAotQ3VycmVudGx5IEhUVFAgcmVxdWVzdHMgYXJlIHRoZSBvbmx5IG9uZXMgdGhhdCB1c2UgXHZhcntkYXRhfTsKLXRoZSBIVFRQIHJlcXVlc3Qgd2lsbCBiZSBhIFBPU1QgaW5zdGVhZCBvZiBhIEdFVCB3aGVuIHRoZSBcdmFye2RhdGF9Ci1wYXJhbWV0ZXIgaXMgcHJvdmlkZWQuICBcdmFye2RhdGF9IHNob3VsZCBiZSBhIGJ1ZmZlciBpbiB0aGUgc3RhbmRhcmQKLVxtaW1ldHlwZXthcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWR9IGZvcm1hdC4gIFRoZQotXGZ1bmN0aW9ue3VybGxpYi51cmxlbmNvZGUoKX0gZnVuY3Rpb24gdGFrZXMgYSBtYXBwaW5nIG9yIHNlcXVlbmNlIG9mCi0yLXR1cGxlcyBhbmQgcmV0dXJucyBhIHN0cmluZyBpbiB0aGlzIGZvcm1hdC4KLQotVGhlIG9wdGlvbmFsIFx2YXJ7dGltZW91dH0gcGFyYW1ldGVyIHNwZWNpZmllcyBhIHRpbWVvdXQgaW4gc2Vjb25kcyBmb3IgdGhlCi1jb25uZWN0aW9uIGF0dGVtcHQgKGlmIG5vdCBzcGVjaWZpZWQsIG9yIHBhc3NlZCBhcyBOb25lLCB0aGUgZ2xvYmFsIGRlZmF1bHQKLXRpbWVvdXQgc2V0dGluZyB3aWxsIGJlIHVzZWQpLiBUaGlzIGFjdHVhbGx5IG9ubHkgd29yayBmb3IgSFRUUCwgSFRUUFMsIEZUUAotYW5kIEZUUFMgY29ubmVjdGlvbnMuCi0KLVRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGZpbGUtbGlrZSBvYmplY3Qgd2l0aCB0d28gYWRkaXRpb25hbCBtZXRob2RzOgotCi1cYmVnaW57aXRlbWl6ZX0KLSAgXGl0ZW0gXG1ldGhvZHtnZXR1cmwoKX0gLS0tIHJldHVybiB0aGUgVVJMIG9mIHRoZSByZXNvdXJjZSByZXRyaWV2ZWQKLSAgXGl0ZW0gXG1ldGhvZHtpbmZvKCl9IC0tLSByZXR1cm4gdGhlIG1ldGEtaW5mb3JtYXRpb24gb2YgdGhlIHBhZ2UsIGFzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBkaWN0aW9uYXJ5LWxpa2Ugb2JqZWN0Ci1cZW5ke2l0ZW1pemV9Ci0KLVJhaXNlcyBcZXhjZXB0aW9ue1VSTEVycm9yfSBvbiBlcnJvcnMuCi0KLU5vdGUgdGhhdCBcY29kZXtOb25lfSBtYXkgYmUgcmV0dXJuZWQgaWYgbm8gaGFuZGxlciBoYW5kbGVzIHRoZQotcmVxdWVzdCAodGhvdWdoIHRoZSBkZWZhdWx0IGluc3RhbGxlZCBnbG9iYWwgXGNsYXNze09wZW5lckRpcmVjdG9yfQotdXNlcyBcY2xhc3N7VW5rbm93bkhhbmRsZXJ9IHRvIGVuc3VyZSB0aGlzIG5ldmVyIGhhcHBlbnMpLgotCi1cdmVyc2lvbmNoYW5nZWRbXHZhcnt0aW1lb3V0fSB3YXMgYWRkZWRdezIuNn0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317aW5zdGFsbF9vcGVuZXJ9e29wZW5lcn0KLUluc3RhbGwgYW4gXGNsYXNze09wZW5lckRpcmVjdG9yfSBpbnN0YW5jZSBhcyB0aGUgZGVmYXVsdCBnbG9iYWwKLW9wZW5lci4gIEluc3RhbGxpbmcgYW4gb3BlbmVyIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIHlvdSB3YW50IHVybG9wZW4gdG8KLXVzZSB0aGF0IG9wZW5lcjsgb3RoZXJ3aXNlLCBzaW1wbHkgY2FsbCBcbWV0aG9ke09wZW5lckRpcmVjdG9yLm9wZW4oKX0KLWluc3RlYWQgb2YgXGZ1bmN0aW9ue3VybG9wZW4oKX0uICBUaGUgY29kZSBkb2VzIG5vdCBjaGVjayBmb3IgYSByZWFsCi1cY2xhc3N7T3BlbmVyRGlyZWN0b3J9LCBhbmQgYW55IGNsYXNzIHdpdGggdGhlIGFwcHJvcHJpYXRlIGludGVyZmFjZQotd2lsbCB3b3JrLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtidWlsZF9vcGVuZXJ9e1xvcHRpb25hbHtoYW5kbGVyLCBcbW9yZWFyZ3N9fQotUmV0dXJuIGFuIFxjbGFzc3tPcGVuZXJEaXJlY3Rvcn0gaW5zdGFuY2UsIHdoaWNoIGNoYWlucyB0aGUKLWhhbmRsZXJzIGluIHRoZSBvcmRlciBnaXZlbi4gXHZhcntoYW5kbGVyfXMgY2FuIGJlIGVpdGhlciBpbnN0YW5jZXMKLW9mIFxjbGFzc3tCYXNlSGFuZGxlcn0sIG9yIHN1YmNsYXNzZXMgb2YgXGNsYXNze0Jhc2VIYW5kbGVyfSAoaW4KLXdoaWNoIGNhc2UgaXQgbXVzdCBiZSBwb3NzaWJsZSB0byBjYWxsIHRoZSBjb25zdHJ1Y3RvciB3aXRob3V0Ci1hbnkgcGFyYW1ldGVycykuICBJbnN0YW5jZXMgb2YgdGhlIGZvbGxvd2luZyBjbGFzc2VzIHdpbGwgYmUgaW4KLWZyb250IG9mIHRoZSBcdmFye2hhbmRsZXJ9cywgdW5sZXNzIHRoZSBcdmFye2hhbmRsZXJ9cyBjb250YWluCi10aGVtLCBpbnN0YW5jZXMgb2YgdGhlbSBvciBzdWJjbGFzc2VzIG9mIHRoZW06Ci1cY2xhc3N7UHJveHlIYW5kbGVyfSwgXGNsYXNze1Vua25vd25IYW5kbGVyfSwgXGNsYXNze0hUVFBIYW5kbGVyfSwKLVxjbGFzc3tIVFRQRGVmYXVsdEVycm9ySGFuZGxlcn0sIFxjbGFzc3tIVFRQUmVkaXJlY3RIYW5kbGVyfSwKLVxjbGFzc3tGVFBIYW5kbGVyfSwgXGNsYXNze0ZpbGVIYW5kbGVyfSwgXGNsYXNze0hUVFBFcnJvclByb2Nlc3Nvcn0uCi0KLUlmIHRoZSBQeXRob24gaW5zdGFsbGF0aW9uIGhhcyBTU0wgc3VwcG9ydCAoXGZ1bmN0aW9ue3NvY2tldC5zc2woKX0KLWV4aXN0cyksIFxjbGFzc3tIVFRQU0hhbmRsZXJ9IHdpbGwgYWxzbyBiZSBhZGRlZC4KLQotQmVnaW5uaW5nIGluIFB5dGhvbiAyLjMsIGEgXGNsYXNze0Jhc2VIYW5kbGVyfSBzdWJjbGFzcyBtYXkgYWxzbwotY2hhbmdlIGl0cyBcbWVtYmVye2hhbmRsZXJfb3JkZXJ9IG1lbWJlciB2YXJpYWJsZSB0byBtb2RpZnkgaXRzCi1wb3NpdGlvbiBpbiB0aGUgaGFuZGxlcnMgbGlzdC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotVGhlIGZvbGxvd2luZyBleGNlcHRpb25zIGFyZSByYWlzZWQgYXMgYXBwcm9wcmlhdGU6Ci0KLVxiZWdpbntleGNkZXNjfXtVUkxFcnJvcn0KLVRoZSBoYW5kbGVycyByYWlzZSB0aGlzIGV4Y2VwdGlvbiAob3IgZGVyaXZlZCBleGNlcHRpb25zKSB3aGVuIHRoZXkKLXJ1biBpbnRvIGEgcHJvYmxlbS4gIEl0IGlzIGEgc3ViY2xhc3Mgb2YgXGV4Y2VwdGlvbntJT0Vycm9yfS4KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e0hUVFBFcnJvcn0KLUEgc3ViY2xhc3Mgb2YgXGV4Y2VwdGlvbntVUkxFcnJvcn0sIGl0IGNhbiBhbHNvIGZ1bmN0aW9uIGFzIGEgCi1ub24tZXhjZXB0aW9uYWwgZmlsZS1saWtlIHJldHVybiB2YWx1ZSAodGhlIHNhbWUgdGhpbmcgdGhhdAotXGZ1bmN0aW9ue3VybG9wZW4oKX0gcmV0dXJucykuICBUaGlzIGlzIHVzZWZ1bCB3aGVuIGhhbmRsaW5nIGV4b3RpYwotSFRUUCBlcnJvcnMsIHN1Y2ggYXMgcmVxdWVzdHMgZm9yIGF1dGhlbnRpY2F0aW9uLgotXGVuZHtleGNkZXNjfQotCi0KLVRoZSBmb2xsb3dpbmcgY2xhc3NlcyBhcmUgcHJvdmlkZWQ6Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1JlcXVlc3R9e3VybFxvcHRpb25hbHssIGRhdGF9XG9wdGlvbmFseywgaGVhZGVyc30KLSAgICBcb3B0aW9uYWx7LCBvcmlnaW5fcmVxX2hvc3R9XG9wdGlvbmFseywgdW52ZXJpZmlhYmxlfX0KLVRoaXMgY2xhc3MgaXMgYW4gYWJzdHJhY3Rpb24gb2YgYSBVUkwgcmVxdWVzdC4KLQotXHZhcnt1cmx9IHNob3VsZCBiZSBhIHN0cmluZyBjb250YWluaW5nIGEgdmFsaWQgVVJMLiAgCi0KLVx2YXJ7ZGF0YX0gbWF5IGJlIGEgc3RyaW5nIHNwZWNpZnlpbmcgYWRkaXRpb25hbCBkYXRhIHRvIHNlbmQgdG8gdGhlCi1zZXJ2ZXIsIG9yIFxjb2Rle05vbmV9IGlmIG5vIHN1Y2ggZGF0YSBpcyBuZWVkZWQuIAotQ3VycmVudGx5IEhUVFAgcmVxdWVzdHMgYXJlIHRoZSBvbmx5IG9uZXMgdGhhdCB1c2UgXHZhcntkYXRhfTsKLXRoZSBIVFRQIHJlcXVlc3Qgd2lsbCBiZSBhIFBPU1QgaW5zdGVhZCBvZiBhIEdFVCB3aGVuIHRoZSBcdmFye2RhdGF9Ci1wYXJhbWV0ZXIgaXMgcHJvdmlkZWQuICBcdmFye2RhdGF9IHNob3VsZCBiZSBhIGJ1ZmZlciBpbiB0aGUgc3RhbmRhcmQKLVxtaW1ldHlwZXthcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWR9IGZvcm1hdC4gIFRoZQotXGZ1bmN0aW9ue3VybGxpYi51cmxlbmNvZGUoKX0gZnVuY3Rpb24gdGFrZXMgYSBtYXBwaW5nIG9yIHNlcXVlbmNlIG9mCi0yLXR1cGxlcyBhbmQgcmV0dXJucyBhIHN0cmluZyBpbiB0aGlzIGZvcm1hdC4KLQotXHZhcntoZWFkZXJzfSBzaG91bGQgYmUgYSBkaWN0aW9uYXJ5LCBhbmQgd2lsbCBiZSB0cmVhdGVkIGFzIGlmCi1cbWV0aG9ke2FkZF9oZWFkZXIoKX0gd2FzIGNhbGxlZCB3aXRoIGVhY2gga2V5IGFuZCB2YWx1ZSBhcyBhcmd1bWVudHMuCi0KLVRoZSBmaW5hbCB0d28gYXJndW1lbnRzIGFyZSBvbmx5IG9mIGludGVyZXN0IGZvciBjb3JyZWN0IGhhbmRsaW5nIG9mCi10aGlyZC1wYXJ0eSBIVFRQIGNvb2tpZXM6Ci0KLVx2YXJ7b3JpZ2luX3JlcV9ob3N0fSBzaG91bGQgYmUgdGhlIHJlcXVlc3QtaG9zdCBvZiB0aGUgb3JpZ2luCi10cmFuc2FjdGlvbiwgYXMgZGVmaW5lZCBieSBccmZjezI5NjV9LiAgSXQgZGVmYXVsdHMgdG8KLVxjb2Rle2Nvb2tpZWxpYi5yZXF1ZXN0X2hvc3Qoc2VsZil9LiAgVGhpcyBpcyB0aGUgaG9zdCBuYW1lIG9yIElQCi1hZGRyZXNzIG9mIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHRoYXQgd2FzIGluaXRpYXRlZCBieSB0aGUgdXNlci4gIEZvcgotZXhhbXBsZSwgaWYgdGhlIHJlcXVlc3QgaXMgZm9yIGFuIGltYWdlIGluIGFuIEhUTUwgZG9jdW1lbnQsIHRoaXMKLXNob3VsZCBiZSB0aGUgcmVxdWVzdC1ob3N0IG9mIHRoZSByZXF1ZXN0IGZvciB0aGUgcGFnZSBjb250YWluaW5nIHRoZQotaW1hZ2UuCi0KLVx2YXJ7dW52ZXJpZmlhYmxlfSBzaG91bGQgaW5kaWNhdGUgd2hldGhlciB0aGUgcmVxdWVzdCBpcwotdW52ZXJpZmlhYmxlLCBhcyBkZWZpbmVkIGJ5IFJGQyAyOTY1LiAgSXQgZGVmYXVsdHMgdG8gRmFsc2UuICBBbgotdW52ZXJpZmlhYmxlIHJlcXVlc3QgaXMgb25lIHdob3NlIFVSTCB0aGUgdXNlciBkaWQgbm90IGhhdmUgdGhlIG9wdGlvbgotdG8gYXBwcm92ZS4gIEZvciBleGFtcGxlLCBpZiB0aGUgcmVxdWVzdCBpcyBmb3IgYW4gaW1hZ2UgaW4gYW4gSFRNTAotZG9jdW1lbnQsIGFuZCB0aGUgdXNlciBoYWQgbm8gb3B0aW9uIHRvIGFwcHJvdmUgdGhlIGF1dG9tYXRpYyBmZXRjaGluZwotb2YgdGhlIGltYWdlLCB0aGlzIHNob3VsZCBiZSB0cnVlLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e09wZW5lckRpcmVjdG9yfXt9Ci1UaGUgXGNsYXNze09wZW5lckRpcmVjdG9yfSBjbGFzcyBvcGVucyBVUkxzIHZpYSBcY2xhc3N7QmFzZUhhbmRsZXJ9cwotY2hhaW5lZCB0b2dldGhlci4gSXQgbWFuYWdlcyB0aGUgY2hhaW5pbmcgb2YgaGFuZGxlcnMsIGFuZCByZWNvdmVyeQotZnJvbSBlcnJvcnMuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317QmFzZUhhbmRsZXJ9e30KLVRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGFsbCByZWdpc3RlcmVkIGhhbmRsZXJzIC0tLSBhbmQgaGFuZGxlcyBvbmx5Ci10aGUgc2ltcGxlIG1lY2hhbmljcyBvZiByZWdpc3RyYXRpb24uCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317SFRUUERlZmF1bHRFcnJvckhhbmRsZXJ9e30KLUEgY2xhc3Mgd2hpY2ggZGVmaW5lcyBhIGRlZmF1bHQgaGFuZGxlciBmb3IgSFRUUCBlcnJvciByZXNwb25zZXM7IGFsbAotcmVzcG9uc2VzIGFyZSB0dXJuZWQgaW50byBcZXhjZXB0aW9ue0hUVFBFcnJvcn0gZXhjZXB0aW9ucy4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtIVFRQUmVkaXJlY3RIYW5kbGVyfXt9Ci1BIGNsYXNzIHRvIGhhbmRsZSByZWRpcmVjdGlvbnMuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317SFRUUENvb2tpZVByb2Nlc3Nvcn17XG9wdGlvbmFse2Nvb2tpZWphcn19Ci1BIGNsYXNzIHRvIGhhbmRsZSBIVFRQIENvb2tpZXMuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317UHJveHlIYW5kbGVyfXtcb3B0aW9uYWx7cHJveGllc319Ci1DYXVzZSByZXF1ZXN0cyB0byBnbyB0aHJvdWdoIGEgcHJveHkuCi1JZiBcdmFye3Byb3hpZXN9IGlzIGdpdmVuLCBpdCBtdXN0IGJlIGEgZGljdGlvbmFyeSBtYXBwaW5nCi1wcm90b2NvbCBuYW1lcyB0byBVUkxzIG9mIHByb3hpZXMuCi1UaGUgZGVmYXVsdCBpcyB0byByZWFkIHRoZSBsaXN0IG9mIHByb3hpZXMgZnJvbSB0aGUgZW52aXJvbm1lbnQKLXZhcmlhYmxlcyBcZW52dmFyezxwcm90b2NvbD5fcHJveHl9LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0hUVFBQYXNzd29yZE1ncn17fQotS2VlcCBhIGRhdGFiYXNlIG9mIAotXGNvZGV7KFx2YXJ7cmVhbG19LCBcdmFye3VyaX0pIC0+IChcdmFye3VzZXJ9LCBcdmFye3Bhc3N3b3JkfSl9Ci1tYXBwaW5ncy4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtIVFRQUGFzc3dvcmRNZ3JXaXRoRGVmYXVsdFJlYWxtfXt9Ci1LZWVwIGEgZGF0YWJhc2Ugb2YgCi1cY29kZXsoXHZhcntyZWFsbX0sIFx2YXJ7dXJpfSkgLT4gKFx2YXJ7dXNlcn0sIFx2YXJ7cGFzc3dvcmR9KX0gbWFwcGluZ3MuCi1BIHJlYWxtIG9mIFxjb2Rle05vbmV9IGlzIGNvbnNpZGVyZWQgYSBjYXRjaC1hbGwgcmVhbG0sIHdoaWNoIGlzIHNlYXJjaGVkCi1pZiBubyBvdGhlciByZWFsbSBmaXRzLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0Fic3RyYWN0QmFzaWNBdXRoSGFuZGxlcn17XG9wdGlvbmFse3Bhc3N3b3JkX21ncn19Ci1UaGlzIGlzIGEgbWl4aW4gY2xhc3MgdGhhdCBoZWxwcyB3aXRoIEhUVFAgYXV0aGVudGljYXRpb24sIGJvdGgKLXRvIHRoZSByZW1vdGUgaG9zdCBhbmQgdG8gYSBwcm94eS4KLVx2YXJ7cGFzc3dvcmRfbWdyfSwgaWYgZ2l2ZW4sIHNob3VsZCBiZSBzb21ldGhpbmcgdGhhdCBpcyBjb21wYXRpYmxlCi13aXRoIFxjbGFzc3tIVFRQUGFzc3dvcmRNZ3J9OyByZWZlciB0byBzZWN0aW9uflxyZWZ7aHR0cC1wYXNzd29yZC1tZ3J9Ci1mb3IgaW5mb3JtYXRpb24gb24gdGhlIGludGVyZmFjZSB0aGF0IG11c3QgYmUgc3VwcG9ydGVkLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0hUVFBCYXNpY0F1dGhIYW5kbGVyfXtcb3B0aW9uYWx7cGFzc3dvcmRfbWdyfX0KLUhhbmRsZSBhdXRoZW50aWNhdGlvbiB3aXRoIHRoZSByZW1vdGUgaG9zdC4KLVx2YXJ7cGFzc3dvcmRfbWdyfSwgaWYgZ2l2ZW4sIHNob3VsZCBiZSBzb21ldGhpbmcgdGhhdCBpcyBjb21wYXRpYmxlCi13aXRoIFxjbGFzc3tIVFRQUGFzc3dvcmRNZ3J9OyByZWZlciB0byBzZWN0aW9uflxyZWZ7aHR0cC1wYXNzd29yZC1tZ3J9Ci1mb3IgaW5mb3JtYXRpb24gb24gdGhlIGludGVyZmFjZSB0aGF0IG11c3QgYmUgc3VwcG9ydGVkLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1Byb3h5QmFzaWNBdXRoSGFuZGxlcn17XG9wdGlvbmFse3Bhc3N3b3JkX21ncn19Ci1IYW5kbGUgYXV0aGVudGljYXRpb24gd2l0aCB0aGUgcHJveHkuCi1cdmFye3Bhc3N3b3JkX21ncn0sIGlmIGdpdmVuLCBzaG91bGQgYmUgc29tZXRoaW5nIHRoYXQgaXMgY29tcGF0aWJsZQotd2l0aCBcY2xhc3N7SFRUUFBhc3N3b3JkTWdyfTsgcmVmZXIgdG8gc2VjdGlvbn5ccmVme2h0dHAtcGFzc3dvcmQtbWdyfQotZm9yIGluZm9ybWF0aW9uIG9uIHRoZSBpbnRlcmZhY2UgdGhhdCBtdXN0IGJlIHN1cHBvcnRlZC4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtBYnN0cmFjdERpZ2VzdEF1dGhIYW5kbGVyfXtcb3B0aW9uYWx7cGFzc3dvcmRfbWdyfX0KLVRoaXMgaXMgYSBtaXhpbiBjbGFzcyB0aGF0IGhlbHBzIHdpdGggSFRUUCBhdXRoZW50aWNhdGlvbiwgYm90aAotdG8gdGhlIHJlbW90ZSBob3N0IGFuZCB0byBhIHByb3h5LgotXHZhcntwYXNzd29yZF9tZ3J9LCBpZiBnaXZlbiwgc2hvdWxkIGJlIHNvbWV0aGluZyB0aGF0IGlzIGNvbXBhdGlibGUKLXdpdGggXGNsYXNze0hUVFBQYXNzd29yZE1ncn07IHJlZmVyIHRvIHNlY3Rpb25+XHJlZntodHRwLXBhc3N3b3JkLW1ncn0KLWZvciBpbmZvcm1hdGlvbiBvbiB0aGUgaW50ZXJmYWNlIHRoYXQgbXVzdCBiZSBzdXBwb3J0ZWQuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317SFRUUERpZ2VzdEF1dGhIYW5kbGVyfXtcb3B0aW9uYWx7cGFzc3dvcmRfbWdyfX0KLUhhbmRsZSBhdXRoZW50aWNhdGlvbiB3aXRoIHRoZSByZW1vdGUgaG9zdC4KLVx2YXJ7cGFzc3dvcmRfbWdyfSwgaWYgZ2l2ZW4sIHNob3VsZCBiZSBzb21ldGhpbmcgdGhhdCBpcyBjb21wYXRpYmxlCi13aXRoIFxjbGFzc3tIVFRQUGFzc3dvcmRNZ3J9OyByZWZlciB0byBzZWN0aW9uflxyZWZ7aHR0cC1wYXNzd29yZC1tZ3J9Ci1mb3IgaW5mb3JtYXRpb24gb24gdGhlIGludGVyZmFjZSB0aGF0IG11c3QgYmUgc3VwcG9ydGVkLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1Byb3h5RGlnZXN0QXV0aEhhbmRsZXJ9e1xvcHRpb25hbHtwYXNzd29yZF9tZ3J9fQotSGFuZGxlIGF1dGhlbnRpY2F0aW9uIHdpdGggdGhlIHByb3h5LgotXHZhcntwYXNzd29yZF9tZ3J9LCBpZiBnaXZlbiwgc2hvdWxkIGJlIHNvbWV0aGluZyB0aGF0IGlzIGNvbXBhdGlibGUKLXdpdGggXGNsYXNze0hUVFBQYXNzd29yZE1ncn07IHJlZmVyIHRvIHNlY3Rpb25+XHJlZntodHRwLXBhc3N3b3JkLW1ncn0KLWZvciBpbmZvcm1hdGlvbiBvbiB0aGUgaW50ZXJmYWNlIHRoYXQgbXVzdCBiZSBzdXBwb3J0ZWQuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317SFRUUEhhbmRsZXJ9e30KLUEgY2xhc3MgdG8gaGFuZGxlIG9wZW5pbmcgb2YgSFRUUCBVUkxzLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0hUVFBTSGFuZGxlcn17fQotQSBjbGFzcyB0byBoYW5kbGUgb3BlbmluZyBvZiBIVFRQUyBVUkxzLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0ZpbGVIYW5kbGVyfXt9Ci1PcGVuIGxvY2FsIGZpbGVzLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0ZUUEhhbmRsZXJ9e30KLU9wZW4gRlRQIFVSTHMuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317Q2FjaGVGVFBIYW5kbGVyfXt9Ci1PcGVuIEZUUCBVUkxzLCBrZWVwaW5nIGEgY2FjaGUgb2Ygb3BlbiBGVFAgY29ubmVjdGlvbnMgdG8gbWluaW1pemUKLWRlbGF5cy4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtVbmtub3duSGFuZGxlcn17fQotQSBjYXRjaC1hbGwgY2xhc3MgdG8gaGFuZGxlIHVua25vd24gVVJMcy4KLVxlbmR7Y2xhc3NkZXNjfQotCi0KLVxzdWJzZWN0aW9ue1JlcXVlc3QgT2JqZWN0cyBcbGFiZWx7cmVxdWVzdC1vYmplY3RzfX0KLQotVGhlIGZvbGxvd2luZyBtZXRob2RzIGRlc2NyaWJlIGFsbCBvZiBcY2xhc3N7UmVxdWVzdH0ncyBwdWJsaWMgaW50ZXJmYWNlLAotYW5kIHNvIGFsbCBtdXN0IGJlIG92ZXJyaWRkZW4gaW4gc3ViY2xhc3Nlcy4KLQotXGJlZ2lue21ldGhvZGRlc2N9W1JlcXVlc3Rde2FkZF9kYXRhfXtkYXRhfQotU2V0IHRoZSBcY2xhc3N7UmVxdWVzdH0gZGF0YSB0byBcdmFye2RhdGF9LiAgVGhpcyBpcyBpZ25vcmVkIGJ5IGFsbAotaGFuZGxlcnMgZXhjZXB0IEhUVFAgaGFuZGxlcnMgLS0tIGFuZCB0aGVyZSBpdCBzaG91bGQgYmUgYSBieXRlCi1zdHJpbmcsIGFuZCB3aWxsIGNoYW5nZSB0aGUgcmVxdWVzdCB0byBiZSBcY29kZXtQT1NUfSByYXRoZXIgdGhhbgotXGNvZGV7R0VUfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1JlcXVlc3Rde2dldF9tZXRob2R9e30KLVJldHVybiBhIHN0cmluZyBpbmRpY2F0aW5nIHRoZSBIVFRQIHJlcXVlc3QgbWV0aG9kLiAgVGhpcyBpcyBvbmx5Ci1tZWFuaW5nZnVsIGZvciBIVFRQIHJlcXVlc3RzLCBhbmQgY3VycmVudGx5IGFsd2F5cyByZXR1cm5zCi1cY29kZXsnR0VUJ30gb3IgXGNvZGV7J1BPU1QnfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1JlcXVlc3Rde2hhc19kYXRhfXt9Ci1SZXR1cm4gd2hldGhlciB0aGUgaW5zdGFuY2UgaGFzIGEgbm9uLVxjb2Rle05vbmV9IGRhdGEuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtSZXF1ZXN0XXtnZXRfZGF0YX17fQotUmV0dXJuIHRoZSBpbnN0YW5jZSdzIGRhdGEuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtSZXF1ZXN0XXthZGRfaGVhZGVyfXtrZXksIHZhbH0KLUFkZCBhbm90aGVyIGhlYWRlciB0byB0aGUgcmVxdWVzdC4gIEhlYWRlcnMgYXJlIGN1cnJlbnRseSBpZ25vcmVkIGJ5Ci1hbGwgaGFuZGxlcnMgZXhjZXB0IEhUVFAgaGFuZGxlcnMsIHdoZXJlIHRoZXkgYXJlIGFkZGVkIHRvIHRoZSBsaXN0Ci1vZiBoZWFkZXJzIHNlbnQgdG8gdGhlIHNlcnZlci4gIE5vdGUgdGhhdCB0aGVyZSBjYW5ub3QgYmUgbW9yZSB0aGFuCi1vbmUgaGVhZGVyIHdpdGggdGhlIHNhbWUgbmFtZSwgYW5kIGxhdGVyIGNhbGxzIHdpbGwgb3ZlcndyaXRlCi1wcmV2aW91cyBjYWxscyBpbiBjYXNlIHRoZSBcdmFye2tleX0gY29sbGlkZXMuICBDdXJyZW50bHksIHRoaXMgaXMKLW5vIGxvc3Mgb2YgSFRUUCBmdW5jdGlvbmFsaXR5LCBzaW5jZSBhbGwgaGVhZGVycyB3aGljaCBoYXZlIG1lYW5pbmcKLXdoZW4gdXNlZCBtb3JlIHRoYW4gb25jZSBoYXZlIGEgKGhlYWRlci1zcGVjaWZpYykgd2F5IG9mIGdhaW5pbmcgdGhlCi1zYW1lIGZ1bmN0aW9uYWxpdHkgdXNpbmcgb25seSBvbmUgaGVhZGVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUmVxdWVzdF17YWRkX3VucmVkaXJlY3RlZF9oZWFkZXJ9e2tleSwgaGVhZGVyfQotQWRkIGEgaGVhZGVyIHRoYXQgd2lsbCBub3QgYmUgYWRkZWQgdG8gYSByZWRpcmVjdGVkIHJlcXVlc3QuCi1cdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1JlcXVlc3Rde2hhc19oZWFkZXJ9e2hlYWRlcn0KLVJldHVybiB3aGV0aGVyIHRoZSBpbnN0YW5jZSBoYXMgdGhlIG5hbWVkIGhlYWRlciAoY2hlY2tzIGJvdGggcmVndWxhcgotYW5kIHVucmVkaXJlY3RlZCkuCi1cdmVyc2lvbmFkZGVkezIuNH0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1JlcXVlc3Rde2dldF9mdWxsX3VybH17fQotUmV0dXJuIHRoZSBVUkwgZ2l2ZW4gaW4gdGhlIGNvbnN0cnVjdG9yLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUmVxdWVzdF17Z2V0X3R5cGV9e30KLVJldHVybiB0aGUgdHlwZSBvZiB0aGUgVVJMIC0tLSBhbHNvIGtub3duIGFzIHRoZSBzY2hlbWUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtSZXF1ZXN0XXtnZXRfaG9zdH17fQotUmV0dXJuIHRoZSBob3N0IHRvIHdoaWNoIGEgY29ubmVjdGlvbiB3aWxsIGJlIG1hZGUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtSZXF1ZXN0XXtnZXRfc2VsZWN0b3J9e30KLVJldHVybiB0aGUgc2VsZWN0b3IgLS0tIHRoZSBwYXJ0IG9mIHRoZSBVUkwgdGhhdCBpcyBzZW50IHRvCi10aGUgc2VydmVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUmVxdWVzdF17c2V0X3Byb3h5fXtob3N0LCB0eXBlfQotUHJlcGFyZSB0aGUgcmVxdWVzdCBieSBjb25uZWN0aW5nIHRvIGEgcHJveHkgc2VydmVyLiBUaGUgXHZhcntob3N0fQotYW5kIFx2YXJ7dHlwZX0gd2lsbCByZXBsYWNlIHRob3NlIG9mIHRoZSBpbnN0YW5jZSwgYW5kIHRoZSBpbnN0YW5jZSdzCi1zZWxlY3RvciB3aWxsIGJlIHRoZSBvcmlnaW5hbCBVUkwgZ2l2ZW4gaW4gdGhlIGNvbnN0cnVjdG9yLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUmVxdWVzdF17Z2V0X29yaWdpbl9yZXFfaG9zdH17fQotUmV0dXJuIHRoZSByZXF1ZXN0LWhvc3Qgb2YgdGhlIG9yaWdpbiB0cmFuc2FjdGlvbiwgYXMgZGVmaW5lZCBieQotXHJmY3syOTY1fS4gIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIFxjbGFzc3tSZXF1ZXN0fQotY29uc3RydWN0b3IuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtSZXF1ZXN0XXtpc191bnZlcmlmaWFibGV9e30KLVJldHVybiB3aGV0aGVyIHRoZSByZXF1ZXN0IGlzIHVudmVyaWZpYWJsZSwgYXMgZGVmaW5lZCBieSBSRkMgMjk2NS4KLVNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIFxjbGFzc3tSZXF1ZXN0fSBjb25zdHJ1Y3Rvci4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cc3Vic2VjdGlvbntPcGVuZXJEaXJlY3RvciBPYmplY3RzIFxsYWJlbHtvcGVuZXItZGlyZWN0b3Itb2JqZWN0c319Ci0KLVxjbGFzc3tPcGVuZXJEaXJlY3Rvcn0gaW5zdGFuY2VzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotCi1cYmVnaW57bWV0aG9kZGVzY31bT3BlbmVyRGlyZWN0b3Jde2FkZF9oYW5kbGVyfXtoYW5kbGVyfQotXHZhcntoYW5kbGVyfSBzaG91bGQgYmUgYW4gaW5zdGFuY2Ugb2YgXGNsYXNze0Jhc2VIYW5kbGVyfS4gIFRoZQotZm9sbG93aW5nIG1ldGhvZHMgYXJlIHNlYXJjaGVkLCBhbmQgYWRkZWQgdG8gdGhlIHBvc3NpYmxlIGNoYWlucyAobm90ZQotdGhhdCBIVFRQIGVycm9ycyBhcmUgYSBzcGVjaWFsIGNhc2UpLgotCi1cYmVnaW57aXRlbWl6ZX0KLSAgXGl0ZW0gXG1ldGhvZHtcdmFye3Byb3RvY29sfV9vcGVuKCl9IC0tLQotICAgIHNpZ25hbCB0aGF0IHRoZSBoYW5kbGVyIGtub3dzIGhvdyB0byBvcGVuIFx2YXJ7cHJvdG9jb2x9IFVSTHMuCi0gIFxpdGVtIFxtZXRob2R7aHR0cF9lcnJvcl9cdmFye3R5cGV9KCl9IC0tLQotICAgIHNpZ25hbCB0aGF0IHRoZSBoYW5kbGVyIGtub3dzIGhvdyB0byBoYW5kbGUgSFRUUCBlcnJvcnMgd2l0aCBIVFRQCi0gICAgZXJyb3IgY29kZSBcdmFye3R5cGV9LgotICBcaXRlbSBcbWV0aG9ke1x2YXJ7cHJvdG9jb2x9X2Vycm9yKCl9IC0tLQotICAgIHNpZ25hbCB0aGF0IHRoZSBoYW5kbGVyIGtub3dzIGhvdyB0byBoYW5kbGUgZXJyb3JzIGZyb20KLSAgICAobm9uLVxjb2Rle2h0dHB9KSBcdmFye3Byb3RvY29sfS4KLSAgXGl0ZW0gXG1ldGhvZHtcdmFye3Byb3RvY29sfV9yZXF1ZXN0KCl9IC0tLQotICAgIHNpZ25hbCB0aGF0IHRoZSBoYW5kbGVyIGtub3dzIGhvdyB0byBwcmUtcHJvY2VzcyBcdmFye3Byb3RvY29sfQotICAgIHJlcXVlc3RzLgotICBcaXRlbSBcbWV0aG9ke1x2YXJ7cHJvdG9jb2x9X3Jlc3BvbnNlKCl9IC0tLQotICAgIHNpZ25hbCB0aGF0IHRoZSBoYW5kbGVyIGtub3dzIGhvdyB0byBwb3N0LXByb2Nlc3MgXHZhcntwcm90b2NvbH0KLSAgICByZXNwb25zZXMuCi1cZW5ke2l0ZW1pemV9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtPcGVuZXJEaXJlY3Rvcl17b3Blbn17dXJsXG9wdGlvbmFseywgZGF0YX17XG9wdGlvbmFseywgdGltZW91dH19fQotT3BlbiB0aGUgZ2l2ZW4gXHZhcnt1cmx9ICh3aGljaCBjYW4gYmUgYSByZXF1ZXN0IG9iamVjdCBvciBhIHN0cmluZyksCi1vcHRpb25hbGx5IHBhc3NpbmcgdGhlIGdpdmVuIFx2YXJ7ZGF0YX0uCi1Bcmd1bWVudHMsIHJldHVybiB2YWx1ZXMgYW5kIGV4Y2VwdGlvbnMgcmFpc2VkIGFyZSB0aGUgc2FtZSBhcyB0aG9zZQotb2YgXGZ1bmN0aW9ue3VybG9wZW4oKX0gKHdoaWNoIHNpbXBseSBjYWxscyB0aGUgXG1ldGhvZHtvcGVuKCl9IG1ldGhvZAotb24gdGhlIGN1cnJlbnRseSBpbnN0YWxsZWQgZ2xvYmFsIFxjbGFzc3tPcGVuZXJEaXJlY3Rvcn0pLiAgVGhlIG9wdGlvbmFsCi1cdmFye3RpbWVvdXR9IHBhcmFtZXRlciBzcGVjaWZpZXMgYSB0aW1lb3V0IGluIHNlY29uZHMgZm9yIHRoZSBjb25uZWN0aW9uIAotYXR0ZW1wdCAoaWYgbm90IHNwZWNpZmllZCwgb3IgcGFzc2VkIGFzIE5vbmUsIHRoZSBnbG9iYWwgZGVmYXVsdCB0aW1lb3V0IAotc2V0dGluZyB3aWxsIGJlIHVzZWQ7IHRoaXMgYWN0dWFsbHkgb25seSB3b3JrIGZvciBIVFRQLCBIVFRQUywgRlRQCi1hbmQgRlRQUyBjb25uZWN0aW9ucykuCi0KLVx2ZXJzaW9uY2hhbmdlZFtcdmFye3RpbWVvdXR9IHdhcyBhZGRlZF17Mi42fQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bT3BlbmVyRGlyZWN0b3Jde2Vycm9yfXtwcm90b1xvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdcb3B0aW9uYWx7LCBcbW9yZWFyZ3N9fX0KLUhhbmRsZSBhbiBlcnJvciBvZiB0aGUgZ2l2ZW4gcHJvdG9jb2wuICBUaGlzIHdpbGwgY2FsbCB0aGUgcmVnaXN0ZXJlZAotZXJyb3IgaGFuZGxlcnMgZm9yIHRoZSBnaXZlbiBwcm90b2NvbCB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMgKHdoaWNoCi1hcmUgcHJvdG9jb2wgc3BlY2lmaWMpLiAgVGhlIEhUVFAgcHJvdG9jb2wgaXMgYSBzcGVjaWFsIGNhc2Ugd2hpY2gKLXVzZXMgdGhlIEhUVFAgcmVzcG9uc2UgY29kZSB0byBkZXRlcm1pbmUgdGhlIHNwZWNpZmljIGVycm9yIGhhbmRsZXI7Ci1yZWZlciB0byB0aGUgXG1ldGhvZHtodHRwX2Vycm9yXyooKX0gbWV0aG9kcyBvZiB0aGUgaGFuZGxlciBjbGFzc2VzLgotCi1SZXR1cm4gdmFsdWVzIGFuZCBleGNlcHRpb25zIHJhaXNlZCBhcmUgdGhlIHNhbWUgYXMgdGhvc2UKLW9mIFxmdW5jdGlvbnt1cmxvcGVuKCl9LgotXGVuZHttZXRob2RkZXNjfQotCi1PcGVuZXJEaXJlY3RvciBvYmplY3RzIG9wZW4gVVJMcyBpbiB0aHJlZSBzdGFnZXM6Ci0KLVRoZSBvcmRlciBpbiB3aGljaCB0aGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgd2l0aGluIGVhY2ggc3RhZ2UgaXMKLWRldGVybWluZWQgYnkgc29ydGluZyB0aGUgaGFuZGxlciBpbnN0YW5jZXMuCi0KLVxiZWdpbntlbnVtZXJhdGV9Ci0gIFxpdGVtIEV2ZXJ5IGhhbmRsZXIgd2l0aCBhIG1ldGhvZCBuYW1lZCBsaWtlCi0gICAgXG1ldGhvZHtcdmFye3Byb3RvY29sfV9yZXF1ZXN0KCl9IGhhcyB0aGF0IG1ldGhvZCBjYWxsZWQgdG8KLSAgICBwcmUtcHJvY2VzcyB0aGUgcmVxdWVzdC4KLQotICBcaXRlbSBIYW5kbGVycyB3aXRoIGEgbWV0aG9kIG5hbWVkIGxpa2UKLSAgICBcbWV0aG9ke1x2YXJ7cHJvdG9jb2x9X29wZW4oKX0gYXJlIGNhbGxlZCB0byBoYW5kbGUgdGhlIHJlcXVlc3QuCi0gICAgVGhpcyBzdGFnZSBlbmRzIHdoZW4gYSBoYW5kbGVyIGVpdGhlciByZXR1cm5zIGEKLSAgICBub24tXGNvbnN0YW50e05vbmV9IHZhbHVlIChpZS4gYSByZXNwb25zZSksIG9yIHJhaXNlcyBhbiBleGNlcHRpb24KLSAgICAodXN1YWxseSBcZXhjZXB0aW9ue1VSTEVycm9yfSkuICBFeGNlcHRpb25zIGFyZSBhbGxvd2VkIHRvIHByb3BhZ2F0ZS4KLQotICAgIEluIGZhY3QsIHRoZSBhYm92ZSBhbGdvcml0aG0gaXMgZmlyc3QgdHJpZWQgZm9yIG1ldGhvZHMgbmFtZWQKLSAgICBcbWV0aG9ke2RlZmF1bHRfb3Blbn0uICBJZiBhbGwgc3VjaCBtZXRob2RzIHJldHVybgotICAgIFxjb25zdGFudHtOb25lfSwgdGhlIGFsZ29yaXRobSBpcyByZXBlYXRlZCBmb3IgbWV0aG9kcyBuYW1lZCBsaWtlCi0gICAgXG1ldGhvZHtcdmFye3Byb3RvY29sfV9vcGVuKCl9LiAgSWYgYWxsIHN1Y2ggbWV0aG9kcyByZXR1cm4KLSAgICBcY29uc3RhbnR7Tm9uZX0sIHRoZSBhbGdvcml0aG0gaXMgcmVwZWF0ZWQgZm9yIG1ldGhvZHMgbmFtZWQKLSAgICBcbWV0aG9ke3Vua25vd25fb3BlbigpfS4KLQotICAgIE5vdGUgdGhhdCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlc2UgbWV0aG9kcyBtYXkgaW52b2x2ZSBjYWxscyBvZgotICAgIHRoZSBwYXJlbnQgXGNsYXNze09wZW5lckRpcmVjdG9yfSBpbnN0YW5jZSdzIFxtZXRob2R7Lm9wZW4oKX0gYW5kCi0gICAgXG1ldGhvZHsuZXJyb3IoKX0gbWV0aG9kcy4KLQotICBcaXRlbSBFdmVyeSBoYW5kbGVyIHdpdGggYSBtZXRob2QgbmFtZWQgbGlrZQotICAgIFxtZXRob2R7XHZhcntwcm90b2NvbH1fcmVzcG9uc2UoKX0gaGFzIHRoYXQgbWV0aG9kIGNhbGxlZCB0bwotICAgIHBvc3QtcHJvY2VzcyB0aGUgcmVzcG9uc2UuCi0KLVxlbmR7ZW51bWVyYXRlfQotCi1cc3Vic2VjdGlvbntCYXNlSGFuZGxlciBPYmplY3RzIFxsYWJlbHtiYXNlLWhhbmRsZXItb2JqZWN0c319Ci0KLVxjbGFzc3tCYXNlSGFuZGxlcn0gb2JqZWN0cyBwcm92aWRlIGEgY291cGxlIG9mIG1ldGhvZHMgdGhhdCBhcmUKLWRpcmVjdGx5IHVzZWZ1bCwgYW5kIG90aGVycyB0aGF0IGFyZSBtZWFudCB0byBiZSB1c2VkIGJ5IGRlcml2ZWQKLWNsYXNzZXMuICBUaGVzZSBhcmUgaW50ZW5kZWQgZm9yIGRpcmVjdCB1c2U6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtCYXNlSGFuZGxlcl17YWRkX3BhcmVudH17ZGlyZWN0b3J9Ci1BZGQgYSBkaXJlY3RvciBhcyBwYXJlbnQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtCYXNlSGFuZGxlcl17Y2xvc2V9e30KLVJlbW92ZSBhbnkgcGFyZW50cy4KLVxlbmR7bWV0aG9kZGVzY30KLQotVGhlIGZvbGxvd2luZyBtZW1iZXJzIGFuZCBtZXRob2RzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgY2xhc3NlcwotZGVyaXZlZCBmcm9tIFxjbGFzc3tCYXNlSGFuZGxlcn0uICBcbm90ZXtUaGUgY29udmVudGlvbiBoYXMgYmVlbgotYWRvcHRlZCB0aGF0IHN1YmNsYXNzZXMgZGVmaW5pbmcgXG1ldGhvZHtcdmFye3Byb3RvY29sfV9yZXF1ZXN0KCl9IG9yCi1cbWV0aG9ke1x2YXJ7cHJvdG9jb2x9X3Jlc3BvbnNlKCl9IG1ldGhvZHMgYXJlIG5hbWVkCi1cY2xhc3N7KlByb2Nlc3Nvcn07IGFsbCBvdGhlcnMgYXJlIG5hbWVkIFxjbGFzc3sqSGFuZGxlcn0ufQotCi0KLVxiZWdpbnttZW1iZXJkZXNjfVtCYXNlSGFuZGxlcl17cGFyZW50fQotQSB2YWxpZCBcY2xhc3N7T3BlbmVyRGlyZWN0b3J9LCB3aGljaCBjYW4gYmUgdXNlZCB0byBvcGVuIHVzaW5nIGEKLWRpZmZlcmVudCBwcm90b2NvbCwgb3IgaGFuZGxlIGVycm9ycy4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0Jhc2VIYW5kbGVyXXtkZWZhdWx0X29wZW59e3JlcX0KLVRoaXMgbWV0aG9kIGlzIFxlbXBoe25vdH0gZGVmaW5lZCBpbiBcY2xhc3N7QmFzZUhhbmRsZXJ9LCBidXQKLXN1YmNsYXNzZXMgc2hvdWxkIGRlZmluZSBpdCBpZiB0aGV5IHdhbnQgdG8gY2F0Y2ggYWxsIFVSTHMuCi0KLVRoaXMgbWV0aG9kLCBpZiBpbXBsZW1lbnRlZCwgd2lsbCBiZSBjYWxsZWQgYnkgdGhlIHBhcmVudAotXGNsYXNze09wZW5lckRpcmVjdG9yfS4gIEl0IHNob3VsZCByZXR1cm4gYSBmaWxlLWxpa2Ugb2JqZWN0IGFzCi1kZXNjcmliZWQgaW4gdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgXG1ldGhvZHtvcGVuKCl9IG9mCi1cY2xhc3N7T3BlbmVyRGlyZWN0b3J9LCBvciBcY29kZXtOb25lfS4gIEl0IHNob3VsZCByYWlzZQotXGV4Y2VwdGlvbntVUkxFcnJvcn0sIHVubGVzcyBhIHRydWx5IGV4Y2VwdGlvbmFsIHRoaW5nIGhhcHBlbnMgKGZvcgotZXhhbXBsZSwgXGV4Y2VwdGlvbntNZW1vcnlFcnJvcn0gc2hvdWxkIG5vdCBiZSBtYXBwZWQgdG8KLVxleGNlcHRpb257VVJMRXJyb3J9KS4KLQotVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIGFueSBwcm90b2NvbC1zcGVjaWZpYyBvcGVuIG1ldGhvZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2NuaX1bQmFzZUhhbmRsZXJde1x2YXJ7cHJvdG9jb2x9X29wZW59e3JlcX0KLVRoaXMgbWV0aG9kIGlzIFxlbXBoe25vdH0gZGVmaW5lZCBpbiBcY2xhc3N7QmFzZUhhbmRsZXJ9LCBidXQKLXN1YmNsYXNzZXMgc2hvdWxkIGRlZmluZSBpdCBpZiB0aGV5IHdhbnQgdG8gaGFuZGxlIFVSTHMgd2l0aCB0aGUgZ2l2ZW4KLXByb3RvY29sLgotCi1UaGlzIG1ldGhvZCwgaWYgZGVmaW5lZCwgd2lsbCBiZSBjYWxsZWQgYnkgdGhlIHBhcmVudAotXGNsYXNze09wZW5lckRpcmVjdG9yfS4gIFJldHVybiB2YWx1ZXMgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIGZvciAKLVxtZXRob2R7ZGVmYXVsdF9vcGVuKCl9LgotXGVuZHttZXRob2RkZXNjbml9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtCYXNlSGFuZGxlcl17dW5rbm93bl9vcGVufXtyZXF9Ci1UaGlzIG1ldGhvZCBpcyBcdmFye25vdH0gZGVmaW5lZCBpbiBcY2xhc3N7QmFzZUhhbmRsZXJ9LCBidXQKLXN1YmNsYXNzZXMgc2hvdWxkIGRlZmluZSBpdCBpZiB0aGV5IHdhbnQgdG8gY2F0Y2ggYWxsIFVSTHMgd2l0aCBubwotc3BlY2lmaWMgcmVnaXN0ZXJlZCBoYW5kbGVyIHRvIG9wZW4gaXQuCi0KLVRoaXMgbWV0aG9kLCBpZiBpbXBsZW1lbnRlZCwgd2lsbCBiZSBjYWxsZWQgYnkgdGhlIFxtZW1iZXJ7cGFyZW50fSAKLVxjbGFzc3tPcGVuZXJEaXJlY3Rvcn0uICBSZXR1cm4gdmFsdWVzIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBmb3IgCi1cbWV0aG9ke2RlZmF1bHRfb3BlbigpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0Jhc2VIYW5kbGVyXXtodHRwX2Vycm9yX2RlZmF1bHR9e3JlcSwgZnAsIGNvZGUsIG1zZywgaGRyc30KLVRoaXMgbWV0aG9kIGlzIFxlbXBoe25vdH0gZGVmaW5lZCBpbiBcY2xhc3N7QmFzZUhhbmRsZXJ9LCBidXQKLXN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGl0IGlmIHRoZXkgaW50ZW5kIHRvIHByb3ZpZGUgYSBjYXRjaC1hbGwKLWZvciBvdGhlcndpc2UgdW5oYW5kbGVkIEhUVFAgZXJyb3JzLiAgSXQgd2lsbCBiZSBjYWxsZWQgYXV0b21hdGljYWxseQotYnkgdGhlICBcY2xhc3N7T3BlbmVyRGlyZWN0b3J9IGdldHRpbmcgdGhlIGVycm9yLCBhbmQgc2hvdWxkIG5vdAotbm9ybWFsbHkgYmUgY2FsbGVkIGluIG90aGVyIGNpcmN1bXN0YW5jZXMuCi0KLVx2YXJ7cmVxfSB3aWxsIGJlIGEgXGNsYXNze1JlcXVlc3R9IG9iamVjdCwgXHZhcntmcH0gd2lsbCBiZSBhCi1maWxlLWxpa2Ugb2JqZWN0IHdpdGggdGhlIEhUVFAgZXJyb3IgYm9keSwgXHZhcntjb2RlfSB3aWxsIGJlIHRoZQotdGhyZWUtZGlnaXQgY29kZSBvZiB0aGUgZXJyb3IsIFx2YXJ7bXNnfSB3aWxsIGJlIHRoZSB1c2VyLXZpc2libGUKLWV4cGxhbmF0aW9uIG9mIHRoZSBjb2RlIGFuZCBcdmFye2hkcnN9IHdpbGwgYmUgYSBtYXBwaW5nIG9iamVjdCB3aXRoCi10aGUgaGVhZGVycyBvZiB0aGUgZXJyb3IuCi0KLVJldHVybiB2YWx1ZXMgYW5kIGV4Y2VwdGlvbnMgcmFpc2VkIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aG9zZQotb2YgXGZ1bmN0aW9ue3VybG9wZW4oKX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtCYXNlSGFuZGxlcl17aHR0cF9lcnJvcl9cdmFye25ubn19e3JlcSwgZnAsIGNvZGUsIG1zZywgaGRyc30KLVx2YXJ7bm5ufSBzaG91bGQgYmUgYSB0aHJlZS1kaWdpdCBIVFRQIGVycm9yIGNvZGUuICBUaGlzIG1ldGhvZCBpcwotYWxzbyBub3QgZGVmaW5lZCBpbiBcY2xhc3N7QmFzZUhhbmRsZXJ9LCBidXQgd2lsbCBiZSBjYWxsZWQsIGlmIGl0Ci1leGlzdHMsIG9uIGFuIGluc3RhbmNlIG9mIGEgc3ViY2xhc3MsIHdoZW4gYW4gSFRUUCBlcnJvciB3aXRoIGNvZGUKLVx2YXJ7bm5ufSBvY2N1cnMuCi0KLVN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzcGVjaWZpYyBIVFRQCi1lcnJvcnMuCi0KLUFyZ3VtZW50cywgcmV0dXJuIHZhbHVlcyBhbmQgZXhjZXB0aW9ucyByYWlzZWQgc2hvdWxkIGJlIHRoZSBzYW1lIGFzCi1mb3IgXG1ldGhvZHtodHRwX2Vycm9yX2RlZmF1bHQoKX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjbml9W0Jhc2VIYW5kbGVyXXtcdmFye3Byb3RvY29sfV9yZXF1ZXN0fXtyZXF9Ci1UaGlzIG1ldGhvZCBpcyBcZW1waHtub3R9IGRlZmluZWQgaW4gXGNsYXNze0Jhc2VIYW5kbGVyfSwgYnV0Ci1zdWJjbGFzc2VzIHNob3VsZCBkZWZpbmUgaXQgaWYgdGhleSB3YW50IHRvIHByZS1wcm9jZXNzIHJlcXVlc3RzIG9mCi10aGUgZ2l2ZW4gcHJvdG9jb2wuCi0KLVRoaXMgbWV0aG9kLCBpZiBkZWZpbmVkLCB3aWxsIGJlIGNhbGxlZCBieSB0aGUgcGFyZW50Ci1cY2xhc3N7T3BlbmVyRGlyZWN0b3J9LiAgXHZhcntyZXF9IHdpbGwgYmUgYSBcY2xhc3N7UmVxdWVzdH0gb2JqZWN0LgotVGhlIHJldHVybiB2YWx1ZSBzaG91bGQgYmUgYSBcY2xhc3N7UmVxdWVzdH0gb2JqZWN0LgotXGVuZHttZXRob2RkZXNjbml9Ci0KLVxiZWdpbnttZXRob2RkZXNjbml9W0Jhc2VIYW5kbGVyXXtcdmFye3Byb3RvY29sfV9yZXNwb25zZX17cmVxLCByZXNwb25zZX0KLVRoaXMgbWV0aG9kIGlzIFxlbXBoe25vdH0gZGVmaW5lZCBpbiBcY2xhc3N7QmFzZUhhbmRsZXJ9LCBidXQKLXN1YmNsYXNzZXMgc2hvdWxkIGRlZmluZSBpdCBpZiB0aGV5IHdhbnQgdG8gcG9zdC1wcm9jZXNzIHJlc3BvbnNlcyBvZgotdGhlIGdpdmVuIHByb3RvY29sLgotCi1UaGlzIG1ldGhvZCwgaWYgZGVmaW5lZCwgd2lsbCBiZSBjYWxsZWQgYnkgdGhlIHBhcmVudAotXGNsYXNze09wZW5lckRpcmVjdG9yfS4gIFx2YXJ7cmVxfSB3aWxsIGJlIGEgXGNsYXNze1JlcXVlc3R9IG9iamVjdC4KLVx2YXJ7cmVzcG9uc2V9IHdpbGwgYmUgYW4gb2JqZWN0IGltcGxlbWVudGluZyB0aGUgc2FtZSBpbnRlcmZhY2UgYXMKLXRoZSByZXR1cm4gdmFsdWUgb2YgXGZ1bmN0aW9ue3VybG9wZW4oKX0uICBUaGUgcmV0dXJuIHZhbHVlIHNob3VsZAotaW1wbGVtZW50IHRoZSBzYW1lIGludGVyZmFjZSBhcyB0aGUgcmV0dXJuIHZhbHVlIG9mCi1cZnVuY3Rpb257dXJsb3BlbigpfS4KLVxlbmR7bWV0aG9kZGVzY25pfQotCi1cc3Vic2VjdGlvbntIVFRQUmVkaXJlY3RIYW5kbGVyIE9iamVjdHMgXGxhYmVse2h0dHAtcmVkaXJlY3QtaGFuZGxlcn19Ci0KLVxub3Rle1NvbWUgSFRUUCByZWRpcmVjdGlvbnMgcmVxdWlyZSBhY3Rpb24gZnJvbSB0aGlzIG1vZHVsZSdzIGNsaWVudAotICBjb2RlLiAgSWYgdGhpcyBpcyB0aGUgY2FzZSwgXGV4Y2VwdGlvbntIVFRQRXJyb3J9IGlzIHJhaXNlZC4gIFNlZQotICBccmZjezI2MTZ9IGZvciBkZXRhaWxzIG9mIHRoZSBwcmVjaXNlIG1lYW5pbmdzIG9mIHRoZSB2YXJpb3VzCi0gIHJlZGlyZWN0aW9uIGNvZGVzLn0KLQotXGJlZ2lue21ldGhvZGRlc2N9W0hUVFBSZWRpcmVjdEhhbmRsZXJde3JlZGlyZWN0X3JlcXVlc3R9e3JlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnAsIGNvZGUsIG1zZywgaGRyc30KLVJldHVybiBhIFxjbGFzc3tSZXF1ZXN0fSBvciBcY29kZXtOb25lfSBpbiByZXNwb25zZSB0byBhIHJlZGlyZWN0LgotVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIG9mIHRoZQotXG1ldGhvZHtodHRwX2Vycm9yXzMwKigpfSBtZXRob2RzIHdoZW4gYSByZWRpcmVjdGlvbiBpcyByZWNlaXZlZCBmcm9tCi10aGUgc2VydmVyLiAgSWYgYSByZWRpcmVjdGlvbiBzaG91bGQgdGFrZSBwbGFjZSwgcmV0dXJuIGEgbmV3Ci1cY2xhc3N7UmVxdWVzdH0gdG8gYWxsb3cgXG1ldGhvZHtodHRwX2Vycm9yXzMwKigpfSB0byBwZXJmb3JtIHRoZQotcmVkaXJlY3QuICBPdGhlcndpc2UsIHJhaXNlIFxleGNlcHRpb257SFRUUEVycm9yfSBpZiBubyBvdGhlciBoYW5kbGVyCi1zaG91bGQgdHJ5IHRvIGhhbmRsZSB0aGlzIFVSTCwgb3IgcmV0dXJuIFxjb2Rle05vbmV9IGlmIHlvdSBjYW4ndCBidXQKLWFub3RoZXIgaGFuZGxlciBtaWdodC4KLQotXGJlZ2lue25vdGljZX0KLSBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBzdHJpY3RseQotIGZvbGxvdyBccmZjezI2MTZ9LCB3aGljaCBzYXlzIHRoYXQgMzAxIGFuZCAzMDIgcmVzcG9uc2VzIHRvIFxjb2Rle1BPU1R9Ci0gcmVxdWVzdHMgbXVzdCBub3QgYmUgYXV0b21hdGljYWxseSByZWRpcmVjdGVkIHdpdGhvdXQgY29uZmlybWF0aW9uIGJ5Ci0gdGhlIHVzZXIuICBJbiByZWFsaXR5LCBicm93c2VycyBkbyBhbGxvdyBhdXRvbWF0aWMgcmVkaXJlY3Rpb24gb2YKLSB0aGVzZSByZXNwb25zZXMsIGNoYW5naW5nIHRoZSBQT1NUIHRvIGEgXGNvZGV7R0VUfSwgYW5kIHRoZSBkZWZhdWx0Ci0gaW1wbGVtZW50YXRpb24gcmVwcm9kdWNlcyB0aGlzIGJlaGF2aW9yLgotXGVuZHtub3RpY2V9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLQotXGJlZ2lue21ldGhvZGRlc2N9W0hUVFBSZWRpcmVjdEhhbmRsZXJde2h0dHBfZXJyb3JfMzAxfXtyZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwLCBjb2RlLCBtc2csIGhkcnN9Ci1SZWRpcmVjdCB0byB0aGUgXGNvZGV7TG9jYXRpb246fSBVUkwuICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkKLXRoZSBwYXJlbnQgXGNsYXNze09wZW5lckRpcmVjdG9yfSB3aGVuIGdldHRpbmcgYW4gSFRUUAotYG1vdmVkIHBlcm1hbmVudGx5JyByZXNwb25zZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0hUVFBSZWRpcmVjdEhhbmRsZXJde2h0dHBfZXJyb3JfMzAyfXtyZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwLCBjb2RlLCBtc2csIGhkcnN9Ci1UaGUgc2FtZSBhcyBcbWV0aG9ke2h0dHBfZXJyb3JfMzAxKCl9LCBidXQgY2FsbGVkIGZvciB0aGUKLWBmb3VuZCcgcmVzcG9uc2UuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtIVFRQUmVkaXJlY3RIYW5kbGVyXXtodHRwX2Vycm9yXzMwM317cmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcCwgY29kZSwgbXNnLCBoZHJzfQotVGhlIHNhbWUgYXMgXG1ldGhvZHtodHRwX2Vycm9yXzMwMSgpfSwgYnV0IGNhbGxlZCBmb3IgdGhlCi1gc2VlIG90aGVyJyByZXNwb25zZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0hUVFBSZWRpcmVjdEhhbmRsZXJde2h0dHBfZXJyb3JfMzA3fXtyZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwLCBjb2RlLCBtc2csIGhkcnN9Ci1UaGUgc2FtZSBhcyBcbWV0aG9ke2h0dHBfZXJyb3JfMzAxKCl9LCBidXQgY2FsbGVkIGZvciB0aGUKLWB0ZW1wb3JhcnkgcmVkaXJlY3QnIHJlc3BvbnNlLgotXGVuZHttZXRob2RkZXNjfQotCi0KLVxzdWJzZWN0aW9ue0hUVFBDb29raWVQcm9jZXNzb3IgT2JqZWN0cyBcbGFiZWx7aHR0cC1jb29raWUtcHJvY2Vzc29yfX0KLQotXHZlcnNpb25hZGRlZHsyLjR9Ci0KLVxjbGFzc3tIVFRQQ29va2llUHJvY2Vzc29yfSBpbnN0YW5jZXMgaGF2ZSBvbmUgYXR0cmlidXRlOgotCi1cYmVnaW57bWVtYmVyZGVzY31bSFRUUENvb2tpZVByb2Nlc3Nvcl17Y29va2llamFyfQotVGhlIFxjbGFzc3tjb29raWVsaWIuQ29va2llSmFyfSBpbiB3aGljaCBjb29raWVzIGFyZSBzdG9yZWQuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLQotXHN1YnNlY3Rpb257UHJveHlIYW5kbGVyIE9iamVjdHMgXGxhYmVse3Byb3h5LWhhbmRsZXJ9fQotCi1cYmVnaW57bWV0aG9kZGVzY25pfVtQcm94eUhhbmRsZXJde1x2YXJ7cHJvdG9jb2x9X29wZW59e3JlcXVlc3R9Ci1UaGUgXGNsYXNze1Byb3h5SGFuZGxlcn0gd2lsbCBoYXZlIGEgbWV0aG9kCi1cbWV0aG9ke1x2YXJ7cHJvdG9jb2x9X29wZW4oKX0gZm9yIGV2ZXJ5IFx2YXJ7cHJvdG9jb2x9IHdoaWNoIGhhcyBhCi1wcm94eSBpbiB0aGUgXHZhcntwcm94aWVzfSBkaWN0aW9uYXJ5IGdpdmVuIGluIHRoZSBjb25zdHJ1Y3Rvci4gIFRoZQotbWV0aG9kIHdpbGwgbW9kaWZ5IHJlcXVlc3RzIHRvIGdvIHRocm91Z2ggdGhlIHByb3h5LCBieSBjYWxsaW5nCi1cY29kZXtyZXF1ZXN0LnNldF9wcm94eSgpfSwgYW5kIGNhbGwgdGhlIG5leHQgaGFuZGxlciBpbiB0aGUgY2hhaW4gdG8KLWFjdHVhbGx5IGV4ZWN1dGUgdGhlIHByb3RvY29sLgotXGVuZHttZXRob2RkZXNjbml9Ci0KLQotXHN1YnNlY3Rpb257SFRUUFBhc3N3b3JkTWdyIE9iamVjdHMgXGxhYmVse2h0dHAtcGFzc3dvcmQtbWdyfX0KLQotVGhlc2UgbWV0aG9kcyBhcmUgYXZhaWxhYmxlIG9uIFxjbGFzc3tIVFRQUGFzc3dvcmRNZ3J9IGFuZAotXGNsYXNze0hUVFBQYXNzd29yZE1ncldpdGhEZWZhdWx0UmVhbG19IG9iamVjdHMuCi0KLVxiZWdpbnttZXRob2RkZXNjfVtIVFRQUGFzc3dvcmRNZ3Jde2FkZF9wYXNzd29yZH17cmVhbG0sIHVyaSwgdXNlciwgcGFzc3dkfQotXHZhcnt1cml9IGNhbiBiZSBlaXRoZXIgYSBzaW5nbGUgVVJJLCBvciBhIHNlcXVlbmNlIG9mIFVSSXMuIFx2YXJ7cmVhbG19LAotXHZhcnt1c2VyfSBhbmQgXHZhcntwYXNzd2R9IG11c3QgYmUgc3RyaW5ncy4gVGhpcyBjYXVzZXMKLVxjb2RleyhcdmFye3VzZXJ9LCBcdmFye3Bhc3N3ZH0pfSB0byBiZSB1c2VkIGFzIGF1dGhlbnRpY2F0aW9uIHRva2Vucwotd2hlbiBhdXRoZW50aWNhdGlvbiBmb3IgXHZhcntyZWFsbX0gYW5kIGEgc3VwZXItVVJJIG9mIGFueSBvZiB0aGUKLWdpdmVuIFVSSXMgaXMgZ2l2ZW4uCi1cZW5ke21ldGhvZGRlc2N9ICAKLQotXGJlZ2lue21ldGhvZGRlc2N9W0hUVFBQYXNzd29yZE1ncl17ZmluZF91c2VyX3Bhc3N3b3JkfXtyZWFsbSwgYXV0aHVyaX0KLUdldCB1c2VyL3Bhc3N3b3JkIGZvciBnaXZlbiByZWFsbSBhbmQgVVJJLCBpZiBhbnkuICBUaGlzIG1ldGhvZCB3aWxsCi1yZXR1cm4gXGNvZGV7KE5vbmUsIE5vbmUpfSBpZiB0aGVyZSBpcyBubyBtYXRjaGluZyB1c2VyL3Bhc3N3b3JkLgotCi1Gb3IgXGNsYXNze0hUVFBQYXNzd29yZE1ncldpdGhEZWZhdWx0UmVhbG19IG9iamVjdHMsIHRoZSByZWFsbQotXGNvZGV7Tm9uZX0gd2lsbCBiZSBzZWFyY2hlZCBpZiB0aGUgZ2l2ZW4gXHZhcntyZWFsbX0gaGFzIG5vIG1hdGNoaW5nCi11c2VyL3Bhc3N3b3JkLgotXGVuZHttZXRob2RkZXNjfQotCi0KLVxzdWJzZWN0aW9ue0Fic3RyYWN0QmFzaWNBdXRoSGFuZGxlciBPYmplY3RzCi0gICAgICAgICAgICBcbGFiZWx7YWJzdHJhY3QtYmFzaWMtYXV0aC1oYW5kbGVyfX0KLQotXGJlZ2lue21ldGhvZGRlc2N9W0Fic3RyYWN0QmFzaWNBdXRoSGFuZGxlcl17aHR0cF9lcnJvcl9hdXRoX3JlcWVkfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7YXV0aHJlcSwgaG9zdCwgcmVxLCBoZWFkZXJzfQotSGFuZGxlIGFuIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgYnkgZ2V0dGluZyBhIHVzZXIvcGFzc3dvcmQgcGFpciwgYW5kCi1yZS10cnlpbmcgdGhlIHJlcXVlc3QuICBcdmFye2F1dGhyZXF9IHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgaGVhZGVyCi13aGVyZSB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlYWxtIGlzIGluY2x1ZGVkIGluIHRoZSByZXF1ZXN0LAotXHZhcntob3N0fSBzcGVjaWZpZXMgdGhlIFVSTCBhbmQgcGF0aCB0byBhdXRoZW50aWNhdGUgZm9yLCBcdmFye3JlcX0KLXNob3VsZCBiZSB0aGUgKGZhaWxlZCkgXGNsYXNze1JlcXVlc3R9IG9iamVjdCwgYW5kIFx2YXJ7aGVhZGVyc30KLXNob3VsZCBiZSB0aGUgZXJyb3IgaGVhZGVycy4KLQotXHZhcntob3N0fSBpcyBlaXRoZXIgYW4gYXV0aG9yaXR5IChlLmcuIFxjb2RleyJweXRob24ub3JnIn0pIG9yIGEgVVJMCi1jb250YWluaW5nIGFuIGF1dGhvcml0eSBjb21wb25lbnQgKGUuZy4gXGNvZGV7Imh0dHA6Ly9weXRob24ub3JnLyJ9KS4KLUluIGVpdGhlciBjYXNlLCB0aGUgYXV0aG9yaXR5IG11c3Qgbm90IGNvbnRhaW4gYSB1c2VyaW5mbyBjb21wb25lbnQKLShzbywgXGNvZGV7InB5dGhvbi5vcmcifSBhbmQgXGNvZGV7InB5dGhvbi5vcmc6ODAifSBhcmUgZmluZSwKLVxjb2RleyJqb2U6cGFzc3dvcmRAcHl0aG9uLm9yZyJ9IGlzIG5vdCkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLQotXHN1YnNlY3Rpb257SFRUUEJhc2ljQXV0aEhhbmRsZXIgT2JqZWN0cwotICAgICAgICAgICAgXGxhYmVse2h0dHAtYmFzaWMtYXV0aC1oYW5kbGVyfX0KLQotXGJlZ2lue21ldGhvZGRlc2N9W0hUVFBCYXNpY0F1dGhIYW5kbGVyXXtodHRwX2Vycm9yXzQwMX17cmVxLCBmcCwgY29kZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZywgaGRyc30KLVJldHJ5IHRoZSByZXF1ZXN0IHdpdGggYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24sIGlmIGF2YWlsYWJsZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cc3Vic2VjdGlvbntQcm94eUJhc2ljQXV0aEhhbmRsZXIgT2JqZWN0cwotICAgICAgICAgICAgXGxhYmVse3Byb3h5LWJhc2ljLWF1dGgtaGFuZGxlcn19Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtQcm94eUJhc2ljQXV0aEhhbmRsZXJde2h0dHBfZXJyb3JfNDA3fXtyZXEsIGZwLCBjb2RlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLCBoZHJzfQotUmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiwgaWYgYXZhaWxhYmxlLgotXGVuZHttZXRob2RkZXNjfQotCi0KLVxzdWJzZWN0aW9ue0Fic3RyYWN0RGlnZXN0QXV0aEhhbmRsZXIgT2JqZWN0cwotICAgICAgICAgICAgXGxhYmVse2Fic3RyYWN0LWRpZ2VzdC1hdXRoLWhhbmRsZXJ9fQotCi1cYmVnaW57bWV0aG9kZGVzY31bQWJzdHJhY3REaWdlc3RBdXRoSGFuZGxlcl17aHR0cF9lcnJvcl9hdXRoX3JlcWVkfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7YXV0aHJlcSwgaG9zdCwgcmVxLCBoZWFkZXJzfQotXHZhcnthdXRocmVxfSBzaG91bGQgYmUgdGhlIG5hbWUgb2YgdGhlIGhlYWRlciB3aGVyZSB0aGUgaW5mb3JtYXRpb24gYWJvdXQKLXRoZSByZWFsbSBpcyBpbmNsdWRlZCBpbiB0aGUgcmVxdWVzdCwgXHZhcntob3N0fSBzaG91bGQgYmUgdGhlIGhvc3QgdG8KLWF1dGhlbnRpY2F0ZSB0bywgXHZhcntyZXF9IHNob3VsZCBiZSB0aGUgKGZhaWxlZCkgXGNsYXNze1JlcXVlc3R9Ci1vYmplY3QsIGFuZCBcdmFye2hlYWRlcnN9IHNob3VsZCBiZSB0aGUgZXJyb3IgaGVhZGVycy4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cc3Vic2VjdGlvbntIVFRQRGlnZXN0QXV0aEhhbmRsZXIgT2JqZWN0cwotICAgICAgICAgICAgXGxhYmVse2h0dHAtZGlnZXN0LWF1dGgtaGFuZGxlcn19Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtIVFRQRGlnZXN0QXV0aEhhbmRsZXJde2h0dHBfZXJyb3JfNDAxfXtyZXEsIGZwLCBjb2RlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLCBoZHJzfQotUmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiwgaWYgYXZhaWxhYmxlLgotXGVuZHttZXRob2RkZXNjfQotCi0KLVxzdWJzZWN0aW9ue1Byb3h5RGlnZXN0QXV0aEhhbmRsZXIgT2JqZWN0cwotICAgICAgICAgICAgXGxhYmVse3Byb3h5LWRpZ2VzdC1hdXRoLWhhbmRsZXJ9fQotCi1cYmVnaW57bWV0aG9kZGVzY31bUHJveHlEaWdlc3RBdXRoSGFuZGxlcl17aHR0cF9lcnJvcl80MDd9e3JlcSwgZnAsIGNvZGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2csIGhkcnN9Ci1SZXRyeSB0aGUgcmVxdWVzdCB3aXRoIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uLCBpZiBhdmFpbGFibGUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLQotXHN1YnNlY3Rpb257SFRUUEhhbmRsZXIgT2JqZWN0cyBcbGFiZWx7aHR0cC1oYW5kbGVyLW9iamVjdHN9fQotCi1cYmVnaW57bWV0aG9kZGVzY31bSFRUUEhhbmRsZXJde2h0dHBfb3Blbn17cmVxfQotU2VuZCBhbiBIVFRQIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSBlaXRoZXIgR0VUIG9yIFBPU1QsIGRlcGVuZGluZyBvbgotXGNvZGV7XHZhcntyZXF9Lmhhc19kYXRhKCl9LgotXGVuZHttZXRob2RkZXNjfQotCi0KLVxzdWJzZWN0aW9ue0hUVFBTSGFuZGxlciBPYmplY3RzIFxsYWJlbHtodHRwcy1oYW5kbGVyLW9iamVjdHN9fQotCi1cYmVnaW57bWV0aG9kZGVzY31bSFRUUFNIYW5kbGVyXXtodHRwc19vcGVufXtyZXF9Ci1TZW5kIGFuIEhUVFBTIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSBlaXRoZXIgR0VUIG9yIFBPU1QsIGRlcGVuZGluZyBvbgotXGNvZGV7XHZhcntyZXF9Lmhhc19kYXRhKCl9LgotXGVuZHttZXRob2RkZXNjfQotCi0KLVxzdWJzZWN0aW9ue0ZpbGVIYW5kbGVyIE9iamVjdHMgXGxhYmVse2ZpbGUtaGFuZGxlci1vYmplY3RzfX0KLQotXGJlZ2lue21ldGhvZGRlc2N9W0ZpbGVIYW5kbGVyXXtmaWxlX29wZW59e3JlcX0KLU9wZW4gdGhlIGZpbGUgbG9jYWxseSwgaWYgdGhlcmUgaXMgbm8gaG9zdCBuYW1lLCBvcgotdGhlIGhvc3QgbmFtZSBpcyBcY29kZXsnbG9jYWxob3N0J30uIENoYW5nZSB0aGUKLXByb3RvY29sIHRvIFxjb2Rle2Z0cH0gb3RoZXJ3aXNlLCBhbmQgcmV0cnkgb3BlbmluZwotaXQgdXNpbmcgXG1lbWJlcntwYXJlbnR9LgotXGVuZHttZXRob2RkZXNjfQotCi0KLVxzdWJzZWN0aW9ue0ZUUEhhbmRsZXIgT2JqZWN0cyBcbGFiZWx7ZnRwLWhhbmRsZXItb2JqZWN0c319Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtGVFBIYW5kbGVyXXtmdHBfb3Blbn17cmVxfQotT3BlbiB0aGUgRlRQIGZpbGUgaW5kaWNhdGVkIGJ5IFx2YXJ7cmVxfS4KLVRoZSBsb2dpbiBpcyBhbHdheXMgZG9uZSB3aXRoIGVtcHR5IHVzZXJuYW1lIGFuZCBwYXNzd29yZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cc3Vic2VjdGlvbntDYWNoZUZUUEhhbmRsZXIgT2JqZWN0cyBcbGFiZWx7Y2FjaGVmdHAtaGFuZGxlci1vYmplY3RzfX0KLQotXGNsYXNze0NhY2hlRlRQSGFuZGxlcn0gb2JqZWN0cyBhcmUgXGNsYXNze0ZUUEhhbmRsZXJ9IG9iamVjdHMgd2l0aAotdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDYWNoZUZUUEhhbmRsZXJde3NldFRpbWVvdXR9e3R9Ci1TZXQgdGltZW91dCBvZiBjb25uZWN0aW9ucyB0byBcdmFye3R9IHNlY29uZHMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDYWNoZUZUUEhhbmRsZXJde3NldE1heENvbm5zfXttfQotU2V0IG1heGltdW0gbnVtYmVyIG9mIGNhY2hlZCBjb25uZWN0aW9ucyB0byBcdmFye219LgotXGVuZHttZXRob2RkZXNjfQotCi0KLVxzdWJzZWN0aW9ue1Vua25vd25IYW5kbGVyIE9iamVjdHMgXGxhYmVse3Vua25vd24taGFuZGxlci1vYmplY3RzfX0KLQotXGJlZ2lue21ldGhvZGRlc2N9W1Vua25vd25IYW5kbGVyXXt1bmtub3duX29wZW59e30KLVJhaXNlIGEgXGV4Y2VwdGlvbntVUkxFcnJvcn0gZXhjZXB0aW9uLgotXGVuZHttZXRob2RkZXNjfQotCi0KLVxzdWJzZWN0aW9ue0hUVFBFcnJvclByb2Nlc3NvciBPYmplY3RzIFxsYWJlbHtodHRwLWVycm9yLXByb2Nlc3Nvci1vYmplY3RzfX0KLQotXHZlcnNpb25hZGRlZHsyLjR9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtIVFRQRXJyb3JQcm9jZXNzb3Jde3Vua25vd25fb3Blbn17fQotUHJvY2VzcyBIVFRQIGVycm9yIHJlc3BvbnNlcy4KLQotRm9yIDIwMCBlcnJvciBjb2RlcywgdGhlIHJlc3BvbnNlIG9iamVjdCBpcyByZXR1cm5lZCBpbW1lZGlhdGVseS4KLQotRm9yIG5vbi0yMDAgZXJyb3IgY29kZXMsIHRoaXMgc2ltcGx5IHBhc3NlcyB0aGUgam9iIG9uIHRvIHRoZQotXG1ldGhvZHtcdmFye3Byb3RvY29sfV9lcnJvcl9cdmFye2NvZGV9KCl9IGhhbmRsZXIgbWV0aG9kcywgdmlhCi1cbWV0aG9ke09wZW5lckRpcmVjdG9yLmVycm9yKCl9LiAgRXZlbnR1YWxseSwKLVxjbGFzc3t1cmxsaWIyLkhUVFBEZWZhdWx0RXJyb3JIYW5kbGVyfSB3aWxsIHJhaXNlIGFuCi1cZXhjZXB0aW9ue0hUVFBFcnJvcn0gaWYgbm8gb3RoZXIgaGFuZGxlciBoYW5kbGVzIHRoZSBlcnJvci4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cc3Vic2VjdGlvbntFeGFtcGxlcyBcbGFiZWx7dXJsbGliMi1leGFtcGxlc319Ci0KLVRoaXMgZXhhbXBsZSBnZXRzIHRoZSBweXRob24ub3JnIG1haW4gcGFnZSBhbmQgZGlzcGxheXMgdGhlIGZpcnN0IDEwMAotYnl0ZXMgb2YgaXQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgdXJsbGliMgotPj4+IGYgPSB1cmxsaWIyLnVybG9wZW4oJ2h0dHA6Ly93d3cucHl0aG9uLm9yZy8nKQotPj4+IHByaW50IGYucmVhZCgxMDApCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KLTw/eG1sLXN0eWxlc2hlZXQgaHJlZj0iLi9jc3MvaHQyaHRtbAotXGVuZHt2ZXJiYXRpbX0KLQotSGVyZSB3ZSBhcmUgc2VuZGluZyBhIGRhdGEtc3RyZWFtIHRvIHRoZSBzdGRpbiBvZiBhIENHSSBhbmQgcmVhZGluZwotdGhlIGRhdGEgaXQgcmV0dXJucyB0byB1cy4gTm90ZSB0aGF0IHRoaXMgZXhhbXBsZSB3aWxsIG9ubHkgd29yayB3aGVuIHRoZQotUHl0aG9uIGluc3RhbGxhdGlvbiBzdXBwb3J0cyBTU0wuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgdXJsbGliMgotPj4+IHJlcSA9IHVybGxpYjIuUmVxdWVzdCh1cmw9J2h0dHBzOi8vbG9jYWxob3N0L2NnaS1iaW4vdGVzdC5jZ2knLAotLi4uICAgICAgICAgICAgICAgICAgICAgICBkYXRhPSdUaGlzIGRhdGEgaXMgcGFzc2VkIHRvIHN0ZGluIG9mIHRoZSBDR0knKQotPj4+IGYgPSB1cmxsaWIyLnVybG9wZW4ocmVxKQotPj4+IHByaW50IGYucmVhZCgpCi1Hb3QgRGF0YTogIlRoaXMgZGF0YSBpcyBwYXNzZWQgdG8gc3RkaW4gb2YgdGhlIENHSSIKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBjb2RlIGZvciB0aGUgc2FtcGxlIENHSSB1c2VkIGluIHRoZSBhYm92ZSBleGFtcGxlIGlzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0jIS91c3IvYmluL2VudiBweXRob24KLWltcG9ydCBzeXMKLWRhdGEgPSBzeXMuc3RkaW4ucmVhZCgpCi1wcmludCAnQ29udGVudC10eXBlOiB0ZXh0LXBsYWluXG5cbkdvdCBEYXRhOiAiJXMiJyAlIGRhdGEKLVxlbmR7dmVyYmF0aW19Ci0KLQotVXNlIG9mIEJhc2ljIEhUVFAgQXV0aGVudGljYXRpb246Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCB1cmxsaWIyCi0jIENyZWF0ZSBhbiBPcGVuZXJEaXJlY3RvciB3aXRoIHN1cHBvcnQgZm9yIEJhc2ljIEhUVFAgQXV0aGVudGljYXRpb24uLi4KLWF1dGhfaGFuZGxlciA9IHVybGxpYjIuSFRUUEJhc2ljQXV0aEhhbmRsZXIoKQotYXV0aF9oYW5kbGVyLmFkZF9wYXNzd29yZChyZWFsbT0nUERRIEFwcGxpY2F0aW9uJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdXJpPSdodHRwczovL21haGxlcjo4MDkyL3NpdGUtdXBkYXRlcy5weScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXI9J2tsZW0nLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd2Q9J2thZGlkZCFlaG9wcGVyJykKLW9wZW5lciA9IHVybGxpYjIuYnVpbGRfb3BlbmVyKGF1dGhfaGFuZGxlcikKLSMgLi4uYW5kIGluc3RhbGwgaXQgZ2xvYmFsbHkgc28gaXQgY2FuIGJlIHVzZWQgd2l0aCB1cmxvcGVuLgotdXJsbGliMi5pbnN0YWxsX29wZW5lcihvcGVuZXIpCi11cmxsaWIyLnVybG9wZW4oJ2h0dHA6Ly93d3cuZXhhbXBsZS5jb20vbG9naW4uaHRtbCcpCi1cZW5ke3ZlcmJhdGltfQotCi1cZnVuY3Rpb257YnVpbGRfb3BlbmVyKCl9IHByb3ZpZGVzIG1hbnkgaGFuZGxlcnMgYnkgZGVmYXVsdCwgaW5jbHVkaW5nIGEKLVxjbGFzc3tQcm94eUhhbmRsZXJ9LiAgQnkgZGVmYXVsdCwgXGNsYXNze1Byb3h5SGFuZGxlcn0gdXNlcyB0aGUKLWVudmlyb25tZW50IHZhcmlhYmxlcyBuYW1lZCBcY29kZXs8c2NoZW1lPl9wcm94eX0sIHdoZXJlIFxjb2RlezxzY2hlbWU+fQotaXMgdGhlIFVSTCBzY2hlbWUgaW52b2x2ZWQuICBGb3IgZXhhbXBsZSwgdGhlIFxlbnZ2YXJ7aHR0cF9wcm94eX0KLWVudmlyb25tZW50IHZhcmlhYmxlIGlzIHJlYWQgdG8gb2J0YWluIHRoZSBIVFRQIHByb3h5J3MgVVJMLgotCi1UaGlzIGV4YW1wbGUgcmVwbGFjZXMgdGhlIGRlZmF1bHQgXGNsYXNze1Byb3h5SGFuZGxlcn0gd2l0aCBvbmUgdGhhdCB1c2VzCi1wcm9ncmFtYXRpY2FsbHktc3VwcGxpZWQgcHJveHkgVVJMcywgYW5kIGFkZHMgcHJveHkgYXV0aG9yaXphdGlvbiBzdXBwb3J0Ci13aXRoIFxjbGFzc3tQcm94eUJhc2ljQXV0aEhhbmRsZXJ9LgotCi1cYmVnaW57dmVyYmF0aW19Ci1wcm94eV9oYW5kbGVyID0gdXJsbGliMi5Qcm94eUhhbmRsZXIoeydodHRwJzogJ2h0dHA6Ly93d3cuZXhhbXBsZS5jb206MzEyOC8nfSkKLXByb3h5X2F1dGhfaGFuZGxlciA9IHVybGxpYjIuSFRUUEJhc2ljQXV0aEhhbmRsZXIoKQotcHJveHlfYXV0aF9oYW5kbGVyLmFkZF9wYXNzd29yZCgncmVhbG0nLCAnaG9zdCcsICd1c2VybmFtZScsICdwYXNzd29yZCcpCi0KLW9wZW5lciA9IGJ1aWxkX29wZW5lcihwcm94eV9oYW5kbGVyLCBwcm94eV9hdXRoX2hhbmRsZXIpCi0jIFRoaXMgdGltZSwgcmF0aGVyIHRoYW4gaW5zdGFsbCB0aGUgT3BlbmVyRGlyZWN0b3IsIHdlIHVzZSBpdCBkaXJlY3RseToKLW9wZW5lci5vcGVuKCdodHRwOi8vd3d3LmV4YW1wbGUuY29tL2xvZ2luLmh0bWwnKQotXGVuZHt2ZXJiYXRpbX0KLQotCi1BZGRpbmcgSFRUUCBoZWFkZXJzOgotCi1Vc2UgdGhlIFx2YXJ7aGVhZGVyc30gYXJndW1lbnQgdG8gdGhlIFxjbGFzc3tSZXF1ZXN0fSBjb25zdHJ1Y3Rvciwgb3I6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCB1cmxsaWIyCi1yZXEgPSB1cmxsaWIyLlJlcXVlc3QoJ2h0dHA6Ly93d3cuZXhhbXBsZS5jb20vJykKLXJlcS5hZGRfaGVhZGVyKCdSZWZlcmVyJywgJ2h0dHA6Ly93d3cucHl0aG9uLm9yZy8nKQotciA9IHVybGxpYjIudXJsb3BlbihyZXEpCi1cZW5ke3ZlcmJhdGltfQotCi1cY2xhc3N7T3BlbmVyRGlyZWN0b3J9IGF1dG9tYXRpY2FsbHkgYWRkcyBhIFxtYWlsaGVhZGVye1VzZXItQWdlbnR9Ci1oZWFkZXIgdG8gZXZlcnkgXGNsYXNze1JlcXVlc3R9LiAgVG8gY2hhbmdlIHRoaXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCB1cmxsaWIyCi1vcGVuZXIgPSB1cmxsaWIyLmJ1aWxkX29wZW5lcigpCi1vcGVuZXIuYWRkaGVhZGVycyA9IFsoJ1VzZXItYWdlbnQnLCAnTW96aWxsYS81LjAnKV0KLW9wZW5lci5vcGVuKCdodHRwOi8vd3d3LmV4YW1wbGUuY29tLycpCi1cZW5ke3ZlcmJhdGltfQotCi1BbHNvLCByZW1lbWJlciB0aGF0IGEgZmV3IHN0YW5kYXJkIGhlYWRlcnMKLShcbWFpbGhlYWRlcntDb250ZW50LUxlbmd0aH0sIFxtYWlsaGVhZGVye0NvbnRlbnQtVHlwZX0gYW5kCi1cbWFpbGhlYWRlcntIb3N0fSkgYXJlIGFkZGVkIHdoZW4gdGhlIFxjbGFzc3tSZXF1ZXN0fSBpcyBwYXNzZWQgdG8KLVxmdW5jdGlvbnt1cmxvcGVuKCl9IChvciBcbWV0aG9ke09wZW5lckRpcmVjdG9yLm9wZW4oKX0pLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ1cmxwYXJzZS50ZXggYi9Eb2MvbGliL2xpYnVybHBhcnNlLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZmMzhhMC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnVybHBhcnNlLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3VybHBhcnNlfSAtLS0KLSAgICAgICAgIFBhcnNlIFVSTHMgaW50byBjb21wb25lbnRzfQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e3VybHBhcnNlfQotCi1cbW9kdWxlc3lub3BzaXN7UGFyc2UgVVJMcyBpbnRvIGNvbXBvbmVudHMufQotCi1caW5kZXh7V1dXfQotXGluZGV4e1dvcmxkIFdpZGUgV2VifQotXGluZGV4e1VSTH0KLVxpbmRleGlpe1VSTH17cGFyc2luZ30KLVxpbmRleGlpe3JlbGF0aXZlfXtVUkx9Ci0KLQotVGhpcyBtb2R1bGUgZGVmaW5lcyBhIHN0YW5kYXJkIGludGVyZmFjZSB0byBicmVhayBVbmlmb3JtIFJlc291cmNlCi1Mb2NhdG9yIChVUkwpIHN0cmluZ3MgdXAgaW4gY29tcG9uZW50cyAoYWRkcmVzc2luZyBzY2hlbWUsIG5ldHdvcmsKLWxvY2F0aW9uLCBwYXRoIGV0Yy4pLCB0byBjb21iaW5lIHRoZSBjb21wb25lbnRzIGJhY2sgaW50byBhIFVSTAotc3RyaW5nLCBhbmQgdG8gY29udmVydCBhIGBgcmVsYXRpdmUgVVJMJycgdG8gYW4gYWJzb2x1dGUgVVJMIGdpdmVuIGEKLWBgYmFzZSBVUkwuJycKLQotVGhlIG1vZHVsZSBoYXMgYmVlbiBkZXNpZ25lZCB0byBtYXRjaCB0aGUgSW50ZXJuZXQgUkZDIG9uIFJlbGF0aXZlCi1Vbmlmb3JtIFJlc291cmNlIExvY2F0b3JzIChhbmQgZGlzY292ZXJlZCBhIGJ1ZyBpbiBhbiBlYXJsaWVyCi1kcmFmdCEpLiBJdCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIFVSTCBzY2hlbWVzOgotXGNvZGV7ZmlsZX0sIFxjb2Rle2Z0cH0sIFxjb2Rle2dvcGhlcn0sIFxjb2Rle2hkbH0sIFxjb2Rle2h0dHB9LCAKLVxjb2Rle2h0dHBzfSwgXGNvZGV7aW1hcH0sIFxjb2Rle21haWx0b30sIFxjb2Rle21tc30sIFxjb2Rle25ld3N9LCAKLVxjb2Rle25udHB9LCBcY29kZXtwcm9zcGVyb30sIFxjb2Rle3JzeW5jfSwgXGNvZGV7cnRzcH0sIFxjb2Rle3J0c3B1fSwgCi1cY29kZXtzZnRwfSwgXGNvZGV7c2h0dHB9LCBcY29kZXtzaXB9LCBcY29kZXtzaXBzfSwgXGNvZGV7c25ld3N9LCBcY29kZXtzdm59LCAKLVxjb2Rle3N2bitzc2h9LCBcY29kZXt0ZWxuZXR9LCBcY29kZXt3YWlzfS4KLQotXHZlcnNpb25hZGRlZFtTdXBwb3J0IGZvciB0aGUgXGNvZGV7c2Z0cH0gYW5kIFxjb2Rle3NpcHN9IHNjaGVtZXNdezIuNX0KLQotVGhlIFxtb2R1bGV7dXJscGFyc2V9IG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgotCi1cYmVnaW57ZnVuY2Rlc2N9e3VybHBhcnNlfXt1cmxzdHJpbmdcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF9zY2hlbWVcb3B0aW9uYWx7LCBhbGxvd19mcmFnbWVudHN9fX0KLVBhcnNlIGEgVVJMIGludG8gc2l4IGNvbXBvbmVudHMsIHJldHVybmluZyBhIDYtdHVwbGUuICBUaGlzCi1jb3JyZXNwb25kcyB0byB0aGUgZ2VuZXJhbCBzdHJ1Y3R1cmUgb2YgYSBVUkw6Ci1cY29kZXtcdmFye3NjaGVtZX06Ly9cdmFye25ldGxvY30vXHZhcntwYXRofTtcdmFye3BhcmFtZXRlcnN9P1x2YXJ7cXVlcnl9XCNcdmFye2ZyYWdtZW50fX0uCi1FYWNoIHR1cGxlIGl0ZW0gaXMgYSBzdHJpbmcsIHBvc3NpYmx5IGVtcHR5LgotVGhlIGNvbXBvbmVudHMgYXJlIG5vdCBicm9rZW4gdXAgaW4gc21hbGxlciBwYXJ0cyAoZm9yIGV4YW1wbGUsIHRoZSBuZXR3b3JrCi1sb2NhdGlvbiBpcyBhIHNpbmdsZSBzdHJpbmcpLCBhbmQgXCUgZXNjYXBlcyBhcmUgbm90IGV4cGFuZGVkLgotVGhlIGRlbGltaXRlcnMgYXMgc2hvd24gYWJvdmUgYXJlIG5vdCBwYXJ0IG9mIHRoZSByZXN1bHQsCi1leGNlcHQgZm9yIGEgbGVhZGluZyBzbGFzaCBpbiB0aGUgXHZhcntwYXRofSBjb21wb25lbnQsIHdoaWNoIGlzCi1yZXRhaW5lZCBpZiBwcmVzZW50LiAgRm9yIGV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBmcm9tIHVybHBhcnNlIGltcG9ydCB1cmxwYXJzZQotPj4+IG8gPSB1cmxwYXJzZSgnaHR0cDovL3d3dy5jd2kubmw6ODAvJTdFZ3VpZG8vUHl0aG9uLmh0bWwnKQotPj4+IG8KLSgnaHR0cCcsICd3d3cuY3dpLm5sOjgwJywgJy8lN0VndWlkby9QeXRob24uaHRtbCcsICcnLCAnJywgJycpCi0+Pj4gby5zY2hlbWUKLSdodHRwJwotPj4+IG8ucG9ydAotODAKLT4+PiBvLmdldHVybCgpCi0naHR0cDovL3d3dy5jd2kubmw6ODAvJTdFZ3VpZG8vUHl0aG9uLmh0bWwnCi1cZW5ke3ZlcmJhdGltfQotCi1JZiB0aGUgXHZhcntkZWZhdWx0X3NjaGVtZX0gYXJndW1lbnQgaXMgc3BlY2lmaWVkLCBpdCBnaXZlcyB0aGUKLWRlZmF1bHQgYWRkcmVzc2luZyBzY2hlbWUsIHRvIGJlIHVzZWQgb25seSBpZiB0aGUgVVJMIGRvZXMgbm90Ci1zcGVjaWZ5IG9uZS4gIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGFyZ3VtZW50IGlzIHRoZSBlbXB0eSBzdHJpbmcuCi0KLUlmIHRoZSBcdmFye2FsbG93X2ZyYWdtZW50c30gYXJndW1lbnQgaXMgZmFsc2UsIGZyYWdtZW50IGlkZW50aWZpZXJzCi1hcmUgbm90IGFsbG93ZWQsIGV2ZW4gaWYgdGhlIFVSTCdzIGFkZHJlc3Npbmcgc2NoZW1lIG5vcm1hbGx5IGRvZXMKLXN1cHBvcnQgdGhlbS4gIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGFyZ3VtZW50IGlzIFxjb25zdGFudHtUcnVlfS4KLQotVGhlIHJldHVybiB2YWx1ZSBpcyBhY3R1YWxseSBhbiBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIG9mCi1ccHl0eXBle3R1cGxlfS4gIFRoaXMgY2xhc3MgaGFzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCByZWFkLW9ubHkKLWNvbnZlbmllbmNlIGF0dHJpYnV0ZXM6Ci0KLVxiZWdpbnt0YWJsZWl2fXtsfGN8bHxjfXttZW1iZXJ9e0F0dHJpYnV0ZX17SW5kZXh9e1ZhbHVlfXtWYWx1ZSBpZiBub3QgcHJlc2VudH0KLSAgXGxpbmVpdntzY2hlbWV9ICB7MH0ge1VSTCBzY2hlbWUgc3BlY2lmaWVyfSAgICAgICAgICAgICB7ZW1wdHkgc3RyaW5nfQotICBcbGluZWl2e25ldGxvY30gIHsxfSB7TmV0d29yayBsb2NhdGlvbiBwYXJ0fSAgICAgICAgICAgIHtlbXB0eSBzdHJpbmd9Ci0gIFxsaW5laXZ7cGF0aH0gICAgezJ9IHtIaWVyYXJjaGljYWwgcGF0aH0gICAgICAgICAgICAgICAge2VtcHR5IHN0cmluZ30KLSAgXGxpbmVpdntwYXJhbXN9ICB7M30ge1BhcmFtZXRlcnMgZm9yIGxhc3QgcGF0aCBlbGVtZW50fSB7ZW1wdHkgc3RyaW5nfQotICBcbGluZWl2e3F1ZXJ5fSAgIHs0fSB7UXVlcnkgY29tcG9uZW50fSAgICAgICAgICAgICAgICAgIHtlbXB0eSBzdHJpbmd9Ci0gIFxsaW5laXZ7ZnJhZ21lbnR9ezV9IHtGcmFnbWVudCBpZGVudGlmaWVyfSAgICAgICAgICAgICAge2VtcHR5IHN0cmluZ30KLSAgXGxpbmVpdnt1c2VybmFtZX17IH0ge1VzZXIgbmFtZX0gICAgICAgICAgICAgICAgICAgICAgICB7XGNvbnN0YW50e05vbmV9fQotICBcbGluZWl2e3Bhc3N3b3JkfXsgfSB7UGFzc3dvcmR9ICAgICAgICAgICAgICAgICAgICAgICAgIHtcY29uc3RhbnR7Tm9uZX19Ci0gIFxsaW5laXZ7aG9zdG5hbWV9eyB9IHtIb3N0IG5hbWUgKGxvd2VyIGNhc2UpfSAgICAgICAgICAge1xjb25zdGFudHtOb25lfX0KLSAgXGxpbmVpdntwb3J0fSAgICB7IH0ge1BvcnQgbnVtYmVyIGFzIGludGVnZXIsIGlmIHByZXNlbnR9IHtcY29uc3RhbnR7Tm9uZX19Ci1cZW5ke3RhYmxlaXZ9Ci0KLVNlZSBzZWN0aW9uflxyZWZ7dXJscGFyc2UtcmVzdWx0LW9iamVjdH0sIGBgUmVzdWx0cyBvZgotXGZ1bmN0aW9ue3VybHBhcnNlKCl9IGFuZCBcZnVuY3Rpb257dXJsc3BsaXQoKX0sJycgZm9yIG1vcmUKLWluZm9ybWF0aW9uIG9uIHRoZSByZXN1bHQgb2JqZWN0LgotCi1cdmVyc2lvbmNoYW5nZWRbQWRkZWQgYXR0cmlidXRlcyB0byByZXR1cm4gdmFsdWVdezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dXJsdW5wYXJzZX17cGFydHN9Ci1Db25zdHJ1Y3QgYSBVUkwgZnJvbSBhIHR1cGxlIGFzIHJldHVybmVkIGJ5IFxjb2Rle3VybHBhcnNlKCl9LgotVGhlIFx2YXJ7cGFydHN9IGFyZ3VtZW50IGNhbiBiZSBhbnkgc2l4LWl0ZW0gaXRlcmFibGUuCi1UaGlzIG1heSByZXN1bHQgaW4gYSBzbGlnaHRseSBkaWZmZXJlbnQsIGJ1dCBlcXVpdmFsZW50IFVSTCwgaWYgdGhlCi1VUkwgdGhhdCB3YXMgcGFyc2VkIG9yaWdpbmFsbHkgaGFkIHVubmVjZXNzYXJ5IGRlbGltaXRlcnMgKGZvciBleGFtcGxlLAotYSA/IHdpdGggYW4gZW1wdHkgcXVlcnk7IHRoZSBSRkMgc3RhdGVzIHRoYXQgdGhlc2UgYXJlIGVxdWl2YWxlbnQpLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt1cmxzcGxpdH17dXJsc3RyaW5nXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfc2NoZW1lXG9wdGlvbmFseywgYWxsb3dfZnJhZ21lbnRzfX19Ci1UaGlzIGlzIHNpbWlsYXIgdG8gXGZ1bmN0aW9ue3VybHBhcnNlKCl9LCBidXQgZG9lcyBub3Qgc3BsaXQgdGhlCi1wYXJhbXMgZnJvbSB0aGUgVVJMLiAgVGhpcyBzaG91bGQgZ2VuZXJhbGx5IGJlIHVzZWQgaW5zdGVhZCBvZgotXGZ1bmN0aW9ue3VybHBhcnNlKCl9IGlmIHRoZSBtb3JlIHJlY2VudCBVUkwgc3ludGF4IGFsbG93aW5nCi1wYXJhbWV0ZXJzIHRvIGJlIGFwcGxpZWQgdG8gZWFjaCBzZWdtZW50IG9mIHRoZSBcdmFye3BhdGh9IHBvcnRpb24gb2YKLXRoZSBVUkwgKHNlZSBccmZjezIzOTZ9KSBpcyB3YW50ZWQuICBBIHNlcGFyYXRlIGZ1bmN0aW9uIGlzIG5lZWRlZCB0bwotc2VwYXJhdGUgdGhlIHBhdGggc2VnbWVudHMgYW5kIHBhcmFtZXRlcnMuICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYQotNS10dXBsZTogKGFkZHJlc3Npbmcgc2NoZW1lLCBuZXR3b3JrIGxvY2F0aW9uLCBwYXRoLCBxdWVyeSwgZnJhZ21lbnQKLWlkZW50aWZpZXIpLgotCi1UaGUgcmV0dXJuIHZhbHVlIGlzIGFjdHVhbGx5IGFuIGluc3RhbmNlIG9mIGEgc3ViY2xhc3Mgb2YKLVxweXR5cGV7dHVwbGV9LiAgVGhpcyBjbGFzcyBoYXMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIHJlYWQtb25seQotY29udmVuaWVuY2UgYXR0cmlidXRlczoKLQotXGJlZ2lue3RhYmxlaXZ9e2x8Y3xsfGN9e21lbWJlcn17QXR0cmlidXRlfXtJbmRleH17VmFsdWV9e1ZhbHVlIGlmIG5vdCBwcmVzZW50fQotICBcbGluZWl2e3NjaGVtZX0gICB7MH0ge1VSTCBzY2hlbWUgc3BlY2lmaWVyfSAgIHtlbXB0eSBzdHJpbmd9Ci0gIFxsaW5laXZ7bmV0bG9jfSAgIHsxfSB7TmV0d29yayBsb2NhdGlvbiBwYXJ0fSAge2VtcHR5IHN0cmluZ30KLSAgXGxpbmVpdntwYXRofSAgICAgezJ9IHtIaWVyYXJjaGljYWwgcGF0aH0gICAgICB7ZW1wdHkgc3RyaW5nfQotICBcbGluZWl2e3F1ZXJ5fSAgICB7M30ge1F1ZXJ5IGNvbXBvbmVudH0gICAgICAgIHtlbXB0eSBzdHJpbmd9Ci0gIFxsaW5laXZ7ZnJhZ21lbnR9IHs0fSB7RnJhZ21lbnQgaWRlbnRpZmllcn0gICAge2VtcHR5IHN0cmluZ30KLSAgXGxpbmVpdnt1c2VybmFtZX0geyB9IHtVc2VyIG5hbWV9ICAgICAgICAgICAgICB7XGNvbnN0YW50e05vbmV9fQotICBcbGluZWl2e3Bhc3N3b3JkfSB7IH0ge1Bhc3N3b3JkfSAgICAgICAgICAgICAgIHtcY29uc3RhbnR7Tm9uZX19Ci0gIFxsaW5laXZ7aG9zdG5hbWV9IHsgfSB7SG9zdCBuYW1lIChsb3dlciBjYXNlKX0ge1xjb25zdGFudHtOb25lfX0KLSAgXGxpbmVpdntwb3J0fSAgICAgeyB9IHtQb3J0IG51bWJlciBhcyBpbnRlZ2VyLCBpZiBwcmVzZW50fSB7XGNvbnN0YW50e05vbmV9fQotXGVuZHt0YWJsZWl2fQotCi1TZWUgc2VjdGlvbn5ccmVme3VybHBhcnNlLXJlc3VsdC1vYmplY3R9LCBgYFJlc3VsdHMgb2YKLVxmdW5jdGlvbnt1cmxwYXJzZSgpfSBhbmQgXGZ1bmN0aW9ue3VybHNwbGl0KCl9LCcnIGZvciBtb3JlCi1pbmZvcm1hdGlvbiBvbiB0aGUgcmVzdWx0IG9iamVjdC4KLQotXHZlcnNpb25hZGRlZHsyLjJ9Ci1cdmVyc2lvbmNoYW5nZWRbQWRkZWQgYXR0cmlidXRlcyB0byByZXR1cm4gdmFsdWVdezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dXJsdW5zcGxpdH17cGFydHN9Ci1Db21iaW5lIHRoZSBlbGVtZW50cyBvZiBhIHR1cGxlIGFzIHJldHVybmVkIGJ5IFxmdW5jdGlvbnt1cmxzcGxpdCgpfQotaW50byBhIGNvbXBsZXRlIFVSTCBhcyBhIHN0cmluZy4KLVRoZSBcdmFye3BhcnRzfSBhcmd1bWVudCBjYW4gYmUgYW55IGZpdmUtaXRlbSBpdGVyYWJsZS4KLVRoaXMgbWF5IHJlc3VsdCBpbiBhIHNsaWdodGx5IGRpZmZlcmVudCwgYnV0IGVxdWl2YWxlbnQgVVJMLCBpZiB0aGUKLVVSTCB0aGF0IHdhcyBwYXJzZWQgb3JpZ2luYWxseSBoYWQgdW5uZWNlc3NhcnkgZGVsaW1pdGVycyAoZm9yIGV4YW1wbGUsCi1hID8gd2l0aCBhbiBlbXB0eSBxdWVyeTsgdGhlIFJGQyBzdGF0ZXMgdGhhdCB0aGVzZSBhcmUgZXF1aXZhbGVudCkuCi1cdmVyc2lvbmFkZGVkezIuMn0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dXJsam9pbn17YmFzZSwgdXJsXG9wdGlvbmFseywgYWxsb3dfZnJhZ21lbnRzfX0KLUNvbnN0cnVjdCBhIGZ1bGwgKGBgYWJzb2x1dGUnJykgVVJMIGJ5IGNvbWJpbmluZyBhIGBgYmFzZSBVUkwnJwotKFx2YXJ7YmFzZX0pIHdpdGggYW5vdGhlciBVUkwgKFx2YXJ7dXJsfSkuICBJbmZvcm1hbGx5LCB0aGlzCi11c2VzIGNvbXBvbmVudHMgb2YgdGhlIGJhc2UgVVJMLCBpbiBwYXJ0aWN1bGFyIHRoZSBhZGRyZXNzaW5nIHNjaGVtZSwKLXRoZSBuZXR3b3JrIGxvY2F0aW9uIGFuZCAocGFydCBvZikgdGhlIHBhdGgsIHRvIHByb3ZpZGUgbWlzc2luZwotY29tcG9uZW50cyBpbiB0aGUgcmVsYXRpdmUgVVJMLiAgRm9yIGV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBmcm9tIHVybHBhcnNlIGltcG9ydCB1cmxqb2luCi0+Pj4gdXJsam9pbignaHR0cDovL3d3dy5jd2kubmwvJTdFZ3VpZG8vUHl0aG9uLmh0bWwnLCAnRkFRLmh0bWwnKQotJ2h0dHA6Ly93d3cuY3dpLm5sLyU3RWd1aWRvL0ZBUS5odG1sJwotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIFx2YXJ7YWxsb3dfZnJhZ21lbnRzfSBhcmd1bWVudCBoYXMgdGhlIHNhbWUgbWVhbmluZyBhbmQgZGVmYXVsdCBhcwotZm9yIFxmdW5jdGlvbnt1cmxwYXJzZSgpfS4KLQotXG5vdGV7SWYgXHZhcnt1cmx9IGlzIGFuIGFic29sdXRlIFVSTCAodGhhdCBpcywgc3RhcnRpbmcgd2l0aCBcY29kZXsvL30KLSAgICAgIG9yIFxjb2Rle3NjaGVtZTovL30pLCB0aGUgXHZhcnt1cmx9J3MgaG9zdCBuYW1lIGFuZC9vciBzY2hlbWUKLSAgICAgIHdpbGwgYmUgcHJlc2VudCBpbiB0aGUgcmVzdWx0LiAgRm9yIGV4YW1wbGU6fQotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gdXJsam9pbignaHR0cDovL3d3dy5jd2kubmwvJTdFZ3VpZG8vUHl0aG9uLmh0bWwnLAotLi4uICAgICAgICAgJy8vd3d3LnB5dGhvbi5vcmcvJTdFZ3VpZG8nKQotJ2h0dHA6Ly93d3cucHl0aG9uLm9yZy8lN0VndWlkbycKLVxlbmR7dmVyYmF0aW19Ci0gICAgICAKLUlmIHlvdSBkbyBub3Qgd2FudCB0aGF0IGJlaGF2aW9yLCBwcmVwcm9jZXNzCi10aGUgXHZhcnt1cmx9IHdpdGggXGZ1bmN0aW9ue3VybHNwbGl0KCl9IGFuZCBcZnVuY3Rpb257dXJsdW5zcGxpdCgpfSwKLXJlbW92aW5nIHBvc3NpYmxlIFxlbXBoe3NjaGVtZX0gYW5kIFxlbXBoe25ldGxvY30gcGFydHMuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3VybGRlZnJhZ317dXJsfQotSWYgXHZhcnt1cmx9IGNvbnRhaW5zIGEgZnJhZ21lbnQgaWRlbnRpZmllciwgcmV0dXJucyBhIG1vZGlmaWVkCi12ZXJzaW9uIG9mIFx2YXJ7dXJsfSB3aXRoIG5vIGZyYWdtZW50IGlkZW50aWZpZXIsIGFuZCB0aGUgZnJhZ21lbnQKLWlkZW50aWZpZXIgYXMgYSBzZXBhcmF0ZSBzdHJpbmcuICBJZiB0aGVyZSBpcyBubyBmcmFnbWVudCBpZGVudGlmaWVyCi1pbiBcdmFye3VybH0sIHJldHVybnMgXHZhcnt1cmx9IHVubW9kaWZpZWQgYW5kIGFuIGVtcHR5IHN0cmluZy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWVyZmN7MTczOH17VW5pZm9ybSBSZXNvdXJjZSBMb2NhdG9ycyAoVVJMKX17Ci0gICAgICAgIFRoaXMgc3BlY2lmaWVzIHRoZSBmb3JtYWwgc3ludGF4IGFuZCBzZW1hbnRpY3Mgb2YgYWJzb2x1dGUKLSAgICAgICAgVVJMcy59Ci0gIFxzZWVyZmN7MTgwOH17UmVsYXRpdmUgVW5pZm9ybSBSZXNvdXJjZSBMb2NhdG9yc317Ci0gICAgICAgIFRoaXMgUmVxdWVzdCBGb3IgQ29tbWVudHMgaW5jbHVkZXMgdGhlIHJ1bGVzIGZvciBqb2luaW5nIGFuCi0gICAgICAgIGFic29sdXRlIGFuZCBhIHJlbGF0aXZlIFVSTCwgaW5jbHVkaW5nIGEgZmFpciBudW1iZXIgb2YKLSAgICAgICAgYGBBYm5vcm1hbCBFeGFtcGxlcycnIHdoaWNoIGdvdmVybiB0aGUgdHJlYXRtZW50IG9mIGJvcmRlcgotICAgICAgICBjYXNlcy59Ci0gIFxzZWVyZmN7MjM5Nn17VW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVycyAoVVJJKTogR2VuZXJpYyBTeW50YXh9ewotICAgICAgICBEb2N1bWVudCBkZXNjcmliaW5nIHRoZSBnZW5lcmljIHN5bnRhY3RpYyByZXF1aXJlbWVudHMgZm9yCi0gICAgICAgIGJvdGggVW5pZm9ybSBSZXNvdXJjZSBOYW1lcyAoVVJOcykgYW5kIFVuaWZvcm0gUmVzb3VyY2UKLSAgICAgICAgTG9jYXRvcnMgKFVSTHMpLn0KLVxlbmR7c2VlYWxzb30KLQotCi1cc3Vic2VjdGlvbntSZXN1bHRzIG9mIFxmdW5jdGlvbnt1cmxwYXJzZSgpfSBhbmQgXGZ1bmN0aW9ue3VybHNwbGl0KCl9Ci0gICAgICAgICAgICBcbGFiZWx7dXJscGFyc2UtcmVzdWx0LW9iamVjdH19Ci0KLVRoZSByZXN1bHQgb2JqZWN0cyBmcm9tIHRoZSBcZnVuY3Rpb257dXJscGFyc2UoKX0gYW5kCi1cZnVuY3Rpb257dXJsc3BsaXQoKX0gZnVuY3Rpb25zIGFyZSBzdWJjbGFzc2VzIG9mIHRoZSBccHl0eXBle3R1cGxlfQotdHlwZS4gIFRoZXNlIHN1YmNsYXNzZXMgYWRkIHRoZSBhdHRyaWJ1dGVzIGRlc2NyaWJlZCBpbiB0aG9zZQotZnVuY3Rpb25zLCBhcyB3ZWxsIGFzIHByb3ZpZGUgYW4gYWRkaXRpb25hbCBtZXRob2Q6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtQYXJzZVJlc3VsdF17Z2V0dXJsfXt9Ci0gIFJldHVybiB0aGUgcmUtY29tYmluZWQgdmVyc2lvbiBvZiB0aGUgb3JpZ2luYWwgVVJMIGFzIGEgc3RyaW5nLgotICBUaGlzIG1heSBkaWZmZXIgZnJvbSB0aGUgb3JpZ2luYWwgVVJMIGluIHRoYXQgdGhlIHNjaGVtZSB3aWxsIGFsd2F5cwotICBiZSBub3JtYWxpemVkIHRvIGxvd2VyIGNhc2UgYW5kIGVtcHR5IGNvbXBvbmVudHMgbWF5IGJlIGRyb3BwZWQuCi0gIFNwZWNpZmljYWxseSwgZW1wdHkgcGFyYW1ldGVycywgcXVlcmllcywgYW5kIGZyYWdtZW50IGlkZW50aWZpZXJzCi0gIHdpbGwgYmUgcmVtb3ZlZC4KLQotICBUaGUgcmVzdWx0IG9mIHRoaXMgbWV0aG9kIGlzIGEgZml4cG9pbnQgaWYgcGFzc2VkIGJhY2sgdGhyb3VnaCB0aGUKLSAgb3JpZ2luYWwgcGFyc2luZyBmdW5jdGlvbjoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGltcG9ydCB1cmxwYXJzZQotPj4+IHVybCA9ICdIVFRQOi8vd3d3LlB5dGhvbi5vcmcvZG9jLyMnCi0KLT4+PiByMSA9IHVybHBhcnNlLnVybHNwbGl0KHVybCkKLT4+PiByMS5nZXR1cmwoKQotJ2h0dHA6Ly93d3cuUHl0aG9uLm9yZy9kb2MvJwotCi0+Pj4gcjIgPSB1cmxwYXJzZS51cmxzcGxpdChyMS5nZXR1cmwoKSkKLT4+PiByMi5nZXR1cmwoKQotJ2h0dHA6Ly93d3cuUHl0aG9uLm9yZy9kb2MvJwotXGVuZHt2ZXJiYXRpbX0KLQotXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVRoZSBmb2xsb3dpbmcgY2xhc3NlcyBwcm92aWRlIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIHBhcnNlIHJlc3VsdHM6OgotCi1cYmVnaW57Y2xhc3NkZXNjKn17QmFzZVJlc3VsdH0KLSAgQmFzZSBjbGFzcyBmb3IgdGhlIGNvbmNyZXRlIHJlc3VsdCBjbGFzc2VzLiAgVGhpcyBwcm92aWRlcyBtb3N0IG9mCi0gIHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMuICBJdCBkb2VzIG5vdCBwcm92aWRlIGEgXG1ldGhvZHtnZXR1cmwoKX0KLSAgbWV0aG9kLiAgSXQgaXMgZGVyaXZlZCBmcm9tIFxjbGFzc3t0dXBsZX0sIGJ1dCBkb2VzIG5vdCBvdmVycmlkZSB0aGUKLSAgXG1ldGhvZHtfX2luaXRfXygpfSBvciBcbWV0aG9ke19fbmV3X18oKX0gbWV0aG9kcy4KLVxlbmR7Y2xhc3NkZXNjKn0KLQotCi1cYmVnaW57Y2xhc3NkZXNjfXtQYXJzZVJlc3VsdH17c2NoZW1lLCBuZXRsb2MsIHBhdGgsIHBhcmFtcywgcXVlcnksIGZyYWdtZW50fQotICBDb25jcmV0ZSBjbGFzcyBmb3IgXGZ1bmN0aW9ue3VybHBhcnNlKCl9IHJlc3VsdHMuICBUaGUKLSAgXG1ldGhvZHtfX25ld19fKCl9IG1ldGhvZCBpcyBvdmVycmlkZGVuIHRvIHN1cHBvcnQgY2hlY2tpbmcgdGhhdCB0aGUKLSAgcmlnaHQgbnVtYmVyIG9mIGFyZ3VtZW50cyBhcmUgcGFzc2VkLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLQotXGJlZ2lue2NsYXNzZGVzY317U3BsaXRSZXN1bHR9e3NjaGVtZSwgbmV0bG9jLCBwYXRoLCBxdWVyeSwgZnJhZ21lbnR9Ci0gIENvbmNyZXRlIGNsYXNzIGZvciBcZnVuY3Rpb257dXJsc3BsaXQoKX0gcmVzdWx0cy4gIFRoZQotICBcbWV0aG9ke19fbmV3X18oKX0gbWV0aG9kIGlzIG92ZXJyaWRkZW4gdG8gc3VwcG9ydCBjaGVja2luZyB0aGF0IHRoZQotICByaWdodCBudW1iZXIgb2YgYXJndW1lbnRzIGFyZSBwYXNzZWQuCi1cZW5ke2NsYXNzZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlidXNlci50ZXggYi9Eb2MvbGliL2xpYnVzZXIudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGQxNTQ2Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlidXNlci50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3VzZXJ9IC0tLQotICAgICAgICAgVXNlci1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGhvb2t9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXt1c2VyfQotXG1vZHVsZXN5bm9wc2lze0Egc3RhbmRhcmQgd2F5IHRvIHJlZmVyZW5jZSB1c2VyLXNwZWNpZmljIG1vZHVsZXMufQotCi0KLVxpbmRleGlpey5weXRob25yYy5weX17ZmlsZX0KLVxpbmRleGlpaXt1c2VyfXtjb25maWd1cmF0aW9ufXtmaWxlfQotCi1BcyBhIHBvbGljeSwgUHl0aG9uIGRvZXNuJ3QgcnVuIHVzZXItc3BlY2lmaWVkIGNvZGUgb24gc3RhcnR1cCBvZgotUHl0aG9uIHByb2dyYW1zLiAgKE9ubHkgaW50ZXJhY3RpdmUgc2Vzc2lvbnMgZXhlY3V0ZSB0aGUgc2NyaXB0Ci1zcGVjaWZpZWQgaW4gdGhlIFxlbnZ2YXJ7UFlUSE9OU1RBUlRVUH0gZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgaXQKLWV4aXN0cykuCi0KLUhvd2V2ZXIsIHNvbWUgcHJvZ3JhbXMgb3Igc2l0ZXMgbWF5IGZpbmQgaXQgY29udmVuaWVudCB0byBhbGxvdyB1c2VycwotdG8gaGF2ZSBhIHN0YW5kYXJkIGN1c3RvbWl6YXRpb24gZmlsZSwgd2hpY2ggZ2V0cyBydW4gd2hlbiBhIHByb2dyYW0KLXJlcXVlc3RzIGl0LiAgVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBzdWNoIGEgbWVjaGFuaXNtLiAgQSBwcm9ncmFtCi10aGF0IHdpc2hlcyB0byB1c2UgdGhlIG1lY2hhbmlzbSBtdXN0IGV4ZWN1dGUgdGhlIHN0YXRlbWVudAotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgdXNlcgotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIFxtb2R1bGV7dXNlcn0gbW9kdWxlIGxvb2tzIGZvciBhIGZpbGUgXGZpbGV7LnB5dGhvbnJjLnB5fSBpbiB0aGUgdXNlcidzCi1ob21lIGRpcmVjdG9yeSBhbmQgaWYgaXQgY2FuIGJlIG9wZW5lZCwgZXhlY3V0ZXMgaXQgKHVzaW5nCi1cZnVuY3Rpb257ZXhlYygpfVxiaWZ1bmNpbmRleHtleGVjfSkgaW4gaXRzIG93biAodGhlCi1tb2R1bGUgXG1vZHVsZXt1c2VyfSdzKSBnbG9iYWwgbmFtZXNwYWNlLiAgRXJyb3JzIGR1cmluZyB0aGlzIHBoYXNlCi1hcmUgbm90IGNhdWdodDsgdGhhdCdzIHVwIHRvIHRoZSBwcm9ncmFtIHRoYXQgaW1wb3J0cyB0aGUKLVxtb2R1bGV7dXNlcn0gbW9kdWxlLCBpZiBpdCB3aXNoZXMuICBUaGUgaG9tZSBkaXJlY3RvcnkgaXMgYXNzdW1lZCB0bwotYmUgbmFtZWQgYnkgdGhlIFxlbnZ2YXJ7SE9NRX0gZW52aXJvbm1lbnQgdmFyaWFibGU7IGlmIHRoaXMgaXMgbm90IHNldCwKLXRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcyB1c2VkLgotCi1UaGUgdXNlcidzIFxmaWxley5weXRob25yYy5weX0gY291bGQgY29uY2VpdmFibHkgdGVzdCBmb3IKLVxjb2Rle3N5cy52ZXJzaW9ufSBpZiBpdCB3aXNoZXMgdG8gZG8gZGlmZmVyZW50IHRoaW5ncyBkZXBlbmRpbmcgb24KLXRoZSBQeXRob24gdmVyc2lvbi4KLQotQSB3YXJuaW5nIHRvIHVzZXJzOiBiZSB2ZXJ5IGNvbnNlcnZhdGl2ZSBpbiB3aGF0IHlvdSBwbGFjZSBpbiB5b3VyCi1cZmlsZXsucHl0aG9ucmMucHl9IGZpbGUuICBTaW5jZSB5b3UgZG9uJ3Qga25vdyB3aGljaCBwcm9ncmFtcyB3aWxsCi11c2UgaXQsIGNoYW5naW5nIHRoZSBiZWhhdmlvciBvZiBzdGFuZGFyZCBtb2R1bGVzIG9yIGZ1bmN0aW9ucyBpcwotZ2VuZXJhbGx5IG5vdCBhIGdvb2QgaWRlYS4KLQotQSBzdWdnZXN0aW9uIGZvciBwcm9ncmFtbWVycyB3aG8gd2lzaCB0byB1c2UgdGhpcyBtZWNoYW5pc206IGEgc2ltcGxlCi13YXkgdG8gbGV0IHVzZXJzIHNwZWNpZnkgb3B0aW9ucyBmb3IgeW91ciBwYWNrYWdlIGlzIHRvIGhhdmUgdGhlbQotZGVmaW5lIHZhcmlhYmxlcyBpbiB0aGVpciBcZmlsZXsucHl0aG9ucmMucHl9IGZpbGUgdGhhdCB5b3UgdGVzdCBpbgoteW91ciBtb2R1bGUuICBGb3IgZXhhbXBsZSwgYSBtb2R1bGUgXG1vZHVsZXtzcGFtfSB0aGF0IGhhcyBhIHZlcmJvc2l0eQotbGV2ZWwgY2FuIGxvb2sgZm9yIGEgdmFyaWFibGUgXGNvZGV7dXNlci5zcGFtX3ZlcmJvc2V9LCBhcyBmb2xsb3dzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgdXNlcgotCi12ZXJib3NlID0gYm9vbChnZXRhdHRyKHVzZXIsICJzcGFtX3ZlcmJvc2UiLCAwKSkKLVxlbmR7dmVyYmF0aW19Ci0KLShUaGUgdGhyZWUtYXJndW1lbnQgZm9ybSBvZiBcZnVuY3Rpb257Z2V0YXR0cigpfSBpcyB1c2VkIGluIGNhc2UKLXRoZSB1c2VyIGhhcyBub3QgZGVmaW5lZCBcY29kZXtzcGFtX3ZlcmJvc2V9IGluIHRoZWlyCi1cZmlsZXsucHl0aG9ucmMucHl9IGZpbGUuKQotCi1Qcm9ncmFtcyB3aXRoIGV4dGVuc2l2ZSBjdXN0b21pemF0aW9uIG5lZWRzIGFyZSBiZXR0ZXIgb2ZmIHJlYWRpbmcgYQotcHJvZ3JhbS1zcGVjaWZpYyBjdXN0b21pemF0aW9uIGZpbGUuCi0KLVByb2dyYW1zIHdpdGggc2VjdXJpdHkgb3IgcHJpdmFjeSBjb25jZXJucyBzaG91bGQgXGVtcGh7bm90fSBpbXBvcnQKLXRoaXMgbW9kdWxlOyBhIHVzZXIgY2FuIGVhc2lseSBicmVhayBpbnRvIGEgcHJvZ3JhbSBieSBwbGFjaW5nCi1hcmJpdHJhcnkgY29kZSBpbiB0aGUgXGZpbGV7LnB5dGhvbnJjLnB5fSBmaWxlLgotCi1Nb2R1bGVzIGZvciBnZW5lcmFsIHVzZSBzaG91bGQgXGVtcGh7bm90fSBpbXBvcnQgdGhpcyBtb2R1bGU7IGl0IG1heQotaW50ZXJmZXJlIHdpdGggdGhlIG9wZXJhdGlvbiBvZiB0aGUgaW1wb3J0aW5nIHByb2dyYW0uCi0KLVxiZWdpbntzZWVhbHNvfQotICBcc2VlbW9kdWxle3NpdGV9e1NpdGUtd2lkZSBjdXN0b21pemF0aW9uIG1lY2hhbmlzbS59Ci1cZW5ke3NlZWFsc299CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnVzZXJkaWN0LnRleCBiL0RvYy9saWIvbGlidXNlcmRpY3QudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmI1N2M4Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlidXNlcmRpY3QudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7VXNlckRpY3R9IC0tLQotICAgICAgICAgQ2xhc3Mgd3JhcHBlciBmb3IgZGljdGlvbmFyeSBvYmplY3RzfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17VXNlckRpY3R9Ci1cbW9kdWxlc3lub3BzaXN7Q2xhc3Mgd3JhcHBlciBmb3IgZGljdGlvbmFyeSBvYmplY3RzLn0KLQotCi1UaGUgbW9kdWxlIGRlZmluZXMgYSBtaXhpbiwgIFxjbGFzc3tEaWN0TWl4aW59LCBkZWZpbmluZyBhbGwgZGljdGlvbmFyeQotbWV0aG9kcyBmb3IgY2xhc3NlcyB0aGF0IGFscmVhZHkgaGF2ZSBhIG1pbmltdW0gbWFwcGluZyBpbnRlcmZhY2UuICBUaGlzCi1ncmVhdGx5IHNpbXBsaWZpZXMgd3JpdGluZyBjbGFzc2VzIHRoYXQgbmVlZCB0byBiZSBzdWJzdGl0dXRhYmxlIGZvcgotZGljdGlvbmFyaWVzIChzdWNoIGFzIHRoZSBzaGVsdmUgbW9kdWxlKS4KLQotVGhpcyBhbHNvIG1vZHVsZSBkZWZpbmVzIGEgY2xhc3MsIFxjbGFzc3tVc2VyRGljdH0sIHRoYXQgYWN0cyBhcyBhIHdyYXBwZXIKLWFyb3VuZCBkaWN0aW9uYXJ5IG9iamVjdHMuICBUaGUgbmVlZCBmb3IgdGhpcyBjbGFzcyBoYXMgYmVlbiBsYXJnZWx5Ci1zdXBwbGFudGVkIGJ5IHRoZSBhYmlsaXR5IHRvIHN1YmNsYXNzIGRpcmVjdGx5IGZyb20gXGNsYXNze2RpY3R9IChhIGZlYXR1cmUKLXRoYXQgYmVjYW1lIGF2YWlsYWJsZSBzdGFydGluZyB3aXRoIFB5dGhvbiB2ZXJzaW9uIDIuMikuICBQcmlvciB0byB0aGUKLWludHJvZHVjdGlvbiBvZiBcY2xhc3N7ZGljdH0sIHRoZSBcY2xhc3N7VXNlckRpY3R9IGNsYXNzIHdhcyB1c2VkIHRvCi1jcmVhdGUgZGljdGlvbmFyeS1saWtlIHN1Yi1jbGFzc2VzIHRoYXQgb2J0YWluZWQgbmV3IGJlaGF2aW9ycyBieSBvdmVycmlkaW5nCi1leGlzdGluZyBtZXRob2RzIG9yIGFkZGluZyBuZXcgb25lcy4KLQotVGhlIFxtb2R1bGV7VXNlckRpY3R9IG1vZHVsZSBkZWZpbmVzIHRoZSBcY2xhc3N7VXNlckRpY3R9IGNsYXNzCi1hbmQgXGNsYXNze0RpY3RNaXhpbn06Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1VzZXJEaWN0fXtcb3B0aW9uYWx7aW5pdGlhbGRhdGF9fSAKLUNsYXNzIHRoYXQgc2ltdWxhdGVzIGEgZGljdGlvbmFyeS4gIFRoZSBpbnN0YW5jZSdzIGNvbnRlbnRzIGFyZSBrZXB0Ci1pbiBhIHJlZ3VsYXIgZGljdGlvbmFyeSwgd2hpY2ggaXMgYWNjZXNzaWJsZSB2aWEgdGhlIFxtZW1iZXJ7ZGF0YX0KLWF0dHJpYnV0ZSBvZiBcY2xhc3N7VXNlckRpY3R9IGluc3RhbmNlcy4gIElmIFx2YXJ7aW5pdGlhbGRhdGF9IGlzCi1wcm92aWRlZCwgXG1lbWJlcntkYXRhfSBpcyBpbml0aWFsaXplZCB3aXRoIGl0cyBjb250ZW50czsgbm90ZSB0aGF0IGEKLXJlZmVyZW5jZSB0byBcdmFye2luaXRpYWxkYXRhfSB3aWxsIG5vdCBiZSBrZXB0LCBhbGxvd2luZyBpdCBiZSB1c2VkCi1mb3Igb3RoZXIgcHVycG9zZXMuIFxub3Rle0ZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBpbnN0YW5jZXMgb2YKLVxjbGFzc3tVc2VyRGljdH0gYXJlIG5vdCBpdGVyYWJsZS59Ci1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317SXRlcmFibGVVc2VyRGljdH17XG9wdGlvbmFse2luaXRpYWxkYXRhfX0KLVN1YmNsYXNzIG9mIFxjbGFzc3tVc2VyRGljdH0gdGhhdCBzdXBwb3J0cyBkaXJlY3QgaXRlcmF0aW9uIChlLmcuIAotXGNvZGV7Zm9yIGtleSBpbiBteURpY3R9KS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1JbiBhZGRpdGlvbiB0byBzdXBwb3J0aW5nIHRoZSBtZXRob2RzIGFuZCBvcGVyYXRpb25zIG9mIG1hcHBpbmdzIChzZWUKLXNlY3Rpb24gXHJlZnt0eXBlc21hcHBpbmd9KSwgXGNsYXNze1VzZXJEaWN0fSBhbmQKLVxjbGFzc3tJdGVyYWJsZVVzZXJEaWN0fSBpbnN0YW5jZXMgcHJvdmlkZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZToKLQotXGJlZ2lue21lbWJlcmRlc2N9e2RhdGF9Ci1BIHJlYWwgZGljdGlvbmFyeSB1c2VkIHRvIHN0b3JlIHRoZSBjb250ZW50cyBvZiB0aGUgXGNsYXNze1VzZXJEaWN0fQotY2xhc3MuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0RpY3RNaXhpbn17fQotTWl4aW4gZGVmaW5pbmcgYWxsIGRpY3Rpb25hcnkgbWV0aG9kcyBmb3IgY2xhc3NlcyB0aGF0IGFscmVhZHkgaGF2ZQotYSBtaW5pbXVtIGRpY3Rpb25hcnkgaW50ZXJmYWNlIGluY2x1ZGluZyBcbWV0aG9ke19fZ2V0aXRlbV9fKCl9LAotXG1ldGhvZHtfX3NldGl0ZW1fXygpfSwgXG1ldGhvZHtfX2RlbGl0ZW1fXygpfSwgYW5kIFxtZXRob2R7a2V5cygpfS4KLQotVGhpcyBtaXhpbiBzaG91bGQgYmUgdXNlZCBhcyBhIHN1cGVyY2xhc3MuICBBZGRpbmcgZWFjaCBvZiB0aGUKLWFib3ZlIG1ldGhvZHMgYWRkcyBwcm9ncmVzc2l2ZWx5IG1vcmUgZnVuY3Rpb25hbGl0eS4gIEZvciBpbnN0YW5jZSwKLWRlZmluaW5nIGFsbCBidXQgXG1ldGhvZHtfX2RlbGl0ZW1fX30gd2lsbCBwcmVjbHVkZSBvbmx5IFxtZXRob2R7cG9wfQotYW5kIFxtZXRob2R7cG9waXRlbX0gZnJvbSB0aGUgZnVsbCBpbnRlcmZhY2UuCi0KLUluIGFkZGl0aW9uIHRvIHRoZSBmb3VyIGJhc2UgbWV0aG9kcywgcHJvZ3Jlc3NpdmVseSBtb3JlIGVmZmljaWVuY3kKLWNvbWVzIHdpdGggZGVmaW5pbmcgXG1ldGhvZHtfX2NvbnRhaW5zX18oKX0sIFxtZXRob2R7X19pdGVyX18oKX0sIGFuZAotXG1ldGhvZHtpdGVyaXRlbXMoKX0uCi0KLVNpbmNlIHRoZSBtaXhpbiBoYXMgbm8ga25vd2xlZGdlIG9mIHRoZSBzdWJjbGFzcyBjb25zdHJ1Y3RvciwgaXQKLWRvZXMgbm90IGRlZmluZSBcbWV0aG9ke19faW5pdF9fKCl9IG9yIFxtZXRob2R7Y29weSgpfS4KLVxlbmR7Y2xhc3NkZXNjfQotCi0KLVxzZWN0aW9ue1xtb2R1bGV7VXNlckxpc3R9IC0tLQotICAgICAgICAgQ2xhc3Mgd3JhcHBlciBmb3IgbGlzdCBvYmplY3RzfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17VXNlckxpc3R9Ci1cbW9kdWxlc3lub3BzaXN7Q2xhc3Mgd3JhcHBlciBmb3IgbGlzdCBvYmplY3RzLn0KLQotCi1cbm90ZXtUaGlzIG1vZHVsZSBpcyBhdmFpbGFibGUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgb25seS4gIElmCi15b3UgYXJlIHdyaXRpbmcgY29kZSB0aGF0IGRvZXMgbm90IG5lZWQgdG8gd29yayB3aXRoIHZlcnNpb25zIG9mCi1QeXRob24gZWFybGllciB0aGFuIFB5dGhvbiAyLjIsIHBsZWFzZSBjb25zaWRlciBzdWJjbGFzc2luZyBkaXJlY3RseQotZnJvbSB0aGUgYnVpbHQtaW4gXGNsYXNze2xpc3R9IHR5cGUufQotCi1UaGlzIG1vZHVsZSBkZWZpbmVzIGEgY2xhc3MgdGhhdCBhY3RzIGFzIGEgd3JhcHBlciBhcm91bmQKLWxpc3Qgb2JqZWN0cy4gIEl0IGlzIGEgdXNlZnVsIGJhc2UgY2xhc3MgZm9yCi15b3VyIG93biBsaXN0LWxpa2UgY2xhc3Nlcywgd2hpY2ggY2FuIGluaGVyaXQgZnJvbQotdGhlbSBhbmQgb3ZlcnJpZGUgZXhpc3RpbmcgbWV0aG9kcyBvciBhZGQgbmV3IG9uZXMuICBJbiB0aGlzIHdheSBvbmUKLWNhbiBhZGQgbmV3IGJlaGF2aW9ycyB0byBsaXN0cy4KLQotVGhlIFxtb2R1bGV7VXNlckxpc3R9IG1vZHVsZSBkZWZpbmVzIHRoZSBcY2xhc3N7VXNlckxpc3R9IGNsYXNzOgotCi1cYmVnaW57Y2xhc3NkZXNjfXtVc2VyTGlzdH17XG9wdGlvbmFse2xpc3R9fQotQ2xhc3MgdGhhdCBzaW11bGF0ZXMgYSBsaXN0LiAgVGhlIGluc3RhbmNlJ3MKLWNvbnRlbnRzIGFyZSBrZXB0IGluIGEgcmVndWxhciBsaXN0LCB3aGljaCBpcyBhY2Nlc3NpYmxlIHZpYSB0aGUKLVxtZW1iZXJ7ZGF0YX0gYXR0cmlidXRlIG9mIFxjbGFzc3tVc2VyTGlzdH0gaW5zdGFuY2VzLiAgVGhlIGluc3RhbmNlJ3MKLWNvbnRlbnRzIGFyZSBpbml0aWFsbHkgc2V0IHRvIGEgY29weSBvZiBcdmFye2xpc3R9LCBkZWZhdWx0aW5nIHRvIHRoZQotZW1wdHkgbGlzdCBcY29kZXtbXX0uICBcdmFye2xpc3R9IGNhbiBiZSBlaXRoZXIgYSByZWd1bGFyIFB5dGhvbiBsaXN0LAotb3IgYW4gaW5zdGFuY2Ugb2YgXGNsYXNze1VzZXJMaXN0fSAob3IgYSBzdWJjbGFzcykuCi1cZW5ke2NsYXNzZGVzY30KLQotSW4gYWRkaXRpb24gdG8gc3VwcG9ydGluZyB0aGUgbWV0aG9kcyBhbmQgb3BlcmF0aW9ucyBvZiBtdXRhYmxlCi1zZXF1ZW5jZXMgKHNlZSBzZWN0aW9uIFxyZWZ7dHlwZXNzZXF9KSwgXGNsYXNze1VzZXJMaXN0fSBpbnN0YW5jZXMKLXByb3ZpZGUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGU6Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXtkYXRhfQotQSByZWFsIFB5dGhvbiBsaXN0IG9iamVjdCB1c2VkIHRvIHN0b3JlIHRoZSBjb250ZW50cyBvZiB0aGUKLVxjbGFzc3tVc2VyTGlzdH0gY2xhc3MuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxzdHJvbmd7U3ViY2xhc3NpbmcgcmVxdWlyZW1lbnRzOn0KLVN1YmNsYXNzZXMgb2YgXGNsYXNze1VzZXJMaXN0fSBhcmUgZXhwZWN0IHRvIG9mZmVyIGEgY29uc3RydWN0b3Igd2hpY2gKLWNhbiBiZSBjYWxsZWQgd2l0aCBlaXRoZXIgbm8gYXJndW1lbnRzIG9yIG9uZSBhcmd1bWVudC4gIExpc3QKLW9wZXJhdGlvbnMgd2hpY2ggcmV0dXJuIGEgbmV3IHNlcXVlbmNlIGF0dGVtcHQgdG8gY3JlYXRlIGFuIGluc3RhbmNlCi1vZiB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIGNsYXNzLiAgVG8gZG8gc28sIGl0IGFzc3VtZXMgdGhhdCB0aGUKLWNvbnN0cnVjdG9yIGNhbiBiZSBjYWxsZWQgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIsIHdoaWNoIGlzIGEgc2VxdWVuY2UKLW9iamVjdCB1c2VkIGFzIGEgZGF0YSBzb3VyY2UuCi0KLUlmIGEgZGVyaXZlZCBjbGFzcyBkb2VzIG5vdCB3aXNoIHRvIGNvbXBseSB3aXRoIHRoaXMgcmVxdWlyZW1lbnQsIGFsbAotb2YgdGhlIHNwZWNpYWwgbWV0aG9kcyBzdXBwb3J0ZWQgYnkgdGhpcyBjbGFzcyB3aWxsIG5lZWQgdG8gYmUKLW92ZXJyaWRkZW47IHBsZWFzZSBjb25zdWx0IHRoZSBzb3VyY2VzIGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLW1ldGhvZHMgd2hpY2ggbmVlZCB0byBiZSBwcm92aWRlZCBpbiB0aGF0IGNhc2UuCi0KLVx2ZXJzaW9uY2hhbmdlZFtQeXRob24gdmVyc2lvbnMgMS41LjIgYW5kIDEuNiBhbHNvIHJlcXVpcmVkIHRoYXQgdGhlCi0gICAgICAgICAgICAgICAgY29uc3RydWN0b3IgYmUgY2FsbGFibGUgd2l0aCBubyBwYXJhbWV0ZXJzLCBhbmQgb2ZmZXIKLSAgICAgICAgICAgICAgICBhIG11dGFibGUgXG1lbWJlcntkYXRhfSBhdHRyaWJ1dGUuICBFYXJsaWVyIHZlcnNpb25zCi0gICAgICAgICAgICAgICAgb2YgUHl0aG9uIGRpZCBub3QgYXR0ZW1wdCB0byBjcmVhdGUgaW5zdGFuY2VzIG9mIHRoZQotICAgICAgICAgICAgICAgIGRlcml2ZWQgY2xhc3NdezIuMH0KLQotCi1cc2VjdGlvbntcbW9kdWxle1VzZXJTdHJpbmd9IC0tLQotICAgICAgICAgQ2xhc3Mgd3JhcHBlciBmb3Igc3RyaW5nIG9iamVjdHN9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtVc2VyU3RyaW5nfQotXG1vZHVsZXN5bm9wc2lze0NsYXNzIHdyYXBwZXIgZm9yIHN0cmluZyBvYmplY3RzLn0KLVxtb2R1bGVhdXRob3J7UGV0ZXIgRnVua317cGZAYXJ0Y29tLWdtYmguZGV9Ci1cc2VjdGlvbmF1dGhvcntQZXRlciBGdW5rfXtwZkBhcnRjb20tZ21iaC5kZX0KLQotXG5vdGV7VGhpcyBcY2xhc3N7VXNlclN0cmluZ30gY2xhc3MgZnJvbSB0aGlzIG1vZHVsZSBpcyBhdmFpbGFibGUgZm9yCi1iYWNrd2FyZCBjb21wYXRpYmlsaXR5IG9ubHkuICBJZiB5b3UgYXJlIHdyaXRpbmcgY29kZSB0aGF0IGRvZXMgbm90Ci1uZWVkIHRvIHdvcmsgd2l0aCB2ZXJzaW9ucyBvZiBQeXRob24gZWFybGllciB0aGFuIFB5dGhvbiAyLjIsIHBsZWFzZQotY29uc2lkZXIgc3ViY2xhc3NpbmcgZGlyZWN0bHkgZnJvbSB0aGUgYnVpbHQtaW4gXGNsYXNze3N0cn0gdHlwZQotaW5zdGVhZCBvZiB1c2luZyBcY2xhc3N7VXNlclN0cmluZ30gKHRoZXJlIGlzIG5vIGJ1aWx0LWluIGVxdWl2YWxlbnQKLXRvIFxjbGFzc3tNdXRhYmxlU3RyaW5nfSkufQotCi1UaGlzIG1vZHVsZSBkZWZpbmVzIGEgY2xhc3MgdGhhdCBhY3RzIGFzIGEgd3JhcHBlciBhcm91bmQgc3RyaW5nCi1vYmplY3RzLiAgSXQgaXMgYSB1c2VmdWwgYmFzZSBjbGFzcyBmb3IgeW91ciBvd24gc3RyaW5nLWxpa2UgY2xhc3NlcywKLXdoaWNoIGNhbiBpbmhlcml0IGZyb20gdGhlbSBhbmQgb3ZlcnJpZGUgZXhpc3RpbmcgbWV0aG9kcyBvciBhZGQgbmV3Ci1vbmVzLiAgSW4gdGhpcyB3YXkgb25lIGNhbiBhZGQgbmV3IGJlaGF2aW9ycyB0byBzdHJpbmdzLgotCi1JdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGVzZSBjbGFzc2VzIGFyZSBoaWdobHkgaW5lZmZpY2llbnQgY29tcGFyZWQKLXRvIHJlYWwgc3RyaW5nIG9yIFVuaWNvZGUgb2JqZWN0czsgdGhpcyBpcyBlc3BlY2lhbGx5IHRoZSBjYXNlIGZvcgotXGNsYXNze011dGFibGVTdHJpbmd9LgotCi1UaGUgXG1vZHVsZXtVc2VyU3RyaW5nfSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGNsYXNzZXM6Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1VzZXJTdHJpbmd9e1xvcHRpb25hbHtzZXF1ZW5jZX19Ci1DbGFzcyB0aGF0IHNpbXVsYXRlcyBhIHN0cmluZyBvciBhIFVuaWNvZGUgc3RyaW5nCi1vYmplY3QuICBUaGUgaW5zdGFuY2UncyBjb250ZW50IGlzIGtlcHQgaW4gYSByZWd1bGFyIHN0cmluZyBvciBVbmljb2RlCi1zdHJpbmcgb2JqZWN0LCB3aGljaCBpcyBhY2Nlc3NpYmxlIHZpYSB0aGUgXG1lbWJlcntkYXRhfSBhdHRyaWJ1dGUgb2YKLVxjbGFzc3tVc2VyU3RyaW5nfSBpbnN0YW5jZXMuICBUaGUgaW5zdGFuY2UncyBjb250ZW50cyBhcmUgaW5pdGlhbGx5Ci1zZXQgdG8gYSBjb3B5IG9mIFx2YXJ7c2VxdWVuY2V9LiAgXHZhcntzZXF1ZW5jZX0gY2FuIGJlIGVpdGhlciBhCi1yZWd1bGFyIFB5dGhvbiBzdHJpbmcgb3IgVW5pY29kZSBzdHJpbmcsIGFuIGluc3RhbmNlIG9mCi1cY2xhc3N7VXNlclN0cmluZ30gKG9yIGEgc3ViY2xhc3MpIG9yIGFuIGFyYml0cmFyeSBzZXF1ZW5jZSB3aGljaCBjYW4KLWJlIGNvbnZlcnRlZCBpbnRvIGEgc3RyaW5nIHVzaW5nIHRoZSBidWlsdC1pbiBcZnVuY3Rpb257c3RyKCl9IGZ1bmN0aW9uLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e011dGFibGVTdHJpbmd9e1xvcHRpb25hbHtzZXF1ZW5jZX19Ci1UaGlzIGNsYXNzIGlzIGRlcml2ZWQgZnJvbSB0aGUgXGNsYXNze1VzZXJTdHJpbmd9IGFib3ZlIGFuZCByZWRlZmluZXMKLXN0cmluZ3MgdG8gYmUgXGVtcGh7bXV0YWJsZX0uICBNdXRhYmxlIHN0cmluZ3MgY2FuJ3QgYmUgdXNlZCBhcwotZGljdGlvbmFyeSBrZXlzLCBiZWNhdXNlIGRpY3Rpb25hcmllcyByZXF1aXJlIFxlbXBoe2ltbXV0YWJsZX0gb2JqZWN0cyBhcwota2V5cy4gIFRoZSBtYWluIGludGVudGlvbiBvZiB0aGlzIGNsYXNzIGlzIHRvIHNlcnZlIGFzIGFuIGVkdWNhdGlvbmFsCi1leGFtcGxlIGZvciBpbmhlcml0YW5jZSBhbmQgbmVjZXNzaXR5IHRvIHJlbW92ZSAob3ZlcnJpZGUpIHRoZQotXG1ldGhvZHtfX2hhc2hfXygpfSBtZXRob2QgaW4gb3JkZXIgdG8gdHJhcCBhdHRlbXB0cyB0byB1c2UgYQotbXV0YWJsZSBvYmplY3QgYXMgZGljdGlvbmFyeSBrZXksIHdoaWNoIHdvdWxkIGJlIG90aGVyd2lzZSB2ZXJ5Ci1lcnJvciBwcm9uZSBhbmQgaGFyZCB0byB0cmFjayBkb3duLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLUluIGFkZGl0aW9uIHRvIHN1cHBvcnRpbmcgdGhlIG1ldGhvZHMgYW5kIG9wZXJhdGlvbnMgb2Ygc3RyaW5nIGFuZAotVW5pY29kZSBvYmplY3RzIChzZWUgc2VjdGlvbiBccmVme3N0cmluZy1tZXRob2RzfSwgYGBTdHJpbmcKLU1ldGhvZHMnJyksIFxjbGFzc3tVc2VyU3RyaW5nfSBpbnN0YW5jZXMgcHJvdmlkZSB0aGUgZm9sbG93aW5nCi1hdHRyaWJ1dGU6Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXtkYXRhfQotQSByZWFsIFB5dGhvbiBzdHJpbmcgb3IgVW5pY29kZSBvYmplY3QgdXNlZCB0byBzdG9yZSB0aGUgY29udGVudCBvZiB0aGUKLVxjbGFzc3tVc2VyU3RyaW5nfSBjbGFzcy4KLVxlbmR7bWVtYmVyZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlidXUudGV4IGIvRG9jL2xpYi9saWJ1dS50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNTQ2YTAuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJ1dS50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3V1fSAtLS0KLSAgICAgICAgIEVuY29kZSBhbmQgZGVjb2RlIHV1ZW5jb2RlIGZpbGVzfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17dXV9Ci1cbW9kdWxlc3lub3BzaXN7RW5jb2RlIGFuZCBkZWNvZGUgZmlsZXMgaW4gdXVlbmNvZGUgZm9ybWF0Ln0KLVxtb2R1bGVhdXRob3J7TGFuY2UgRWxsaW5naG91c2V9e30KLQotCi1UaGlzIG1vZHVsZSBlbmNvZGVzIGFuZCBkZWNvZGVzIGZpbGVzIGluIHV1ZW5jb2RlIGZvcm1hdCwgYWxsb3dpbmcKLWFyYml0cmFyeSBiaW5hcnkgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBvdmVyIEFTQ0lJLW9ubHkgY29ubmVjdGlvbnMuCi1XaGVyZXZlciBhIGZpbGUgYXJndW1lbnQgaXMgZXhwZWN0ZWQsIHRoZSBtZXRob2RzIGFjY2VwdCBhIGZpbGUtbGlrZQotb2JqZWN0LiAgRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBhIHN0cmluZyBjb250YWluaW5nIGEgcGF0aG5hbWUKLWlzIGFsc28gYWNjZXB0ZWQsIGFuZCB0aGUgY29ycmVzcG9uZGluZyBmaWxlIHdpbGwgYmUgb3BlbmVkIGZvcgotcmVhZGluZyBhbmQgd3JpdGluZzsgdGhlIHBhdGhuYW1lIFxjb2RleyctJ30gaXMgdW5kZXJzdG9vZCB0byBtZWFuIHRoZQotc3RhbmRhcmQgaW5wdXQgb3Igb3V0cHV0LiAgSG93ZXZlciwgdGhpcyBpbnRlcmZhY2UgaXMgZGVwcmVjYXRlZDsgaXQncwotYmV0dGVyIGZvciB0aGUgY2FsbGVyIHRvIG9wZW4gdGhlIGZpbGUgaXRzZWxmLCBhbmQgYmUgc3VyZSB0aGF0LCB3aGVuCi1yZXF1aXJlZCwgdGhlIG1vZGUgaXMgXGNvZGV7J3JiJ30gb3IgXGNvZGV7J3diJ30gb24gV2luZG93cy4KLQotVGhpcyBjb2RlIHdhcyBjb250cmlidXRlZCBieSBMYW5jZSBFbGxpbmdob3VzZSwgYW5kIG1vZGlmaWVkIGJ5IEphY2sKLUphbnNlbi4KLVxpbmRleHtKYW5zZW4sIEphY2t9Ci1caW5kZXh7RWxsaW5naG91c2UsIExhbmNlfQotCi1UaGUgXG1vZHVsZXt1dX0gbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6Ci0KLVxiZWdpbntmdW5jZGVzY317ZW5jb2RlfXtpbl9maWxlLCBvdXRfZmlsZVxvcHRpb25hbHssIG5hbWVcb3B0aW9uYWx7LCBtb2RlfX19Ci0gIFV1ZW5jb2RlIGZpbGUgXHZhcntpbl9maWxlfSBpbnRvIGZpbGUgXHZhcntvdXRfZmlsZX0uICBUaGUgdXVlbmNvZGVkCi0gIGZpbGUgd2lsbCBoYXZlIHRoZSBoZWFkZXIgc3BlY2lmeWluZyBcdmFye25hbWV9IGFuZCBcdmFye21vZGV9IGFzCi0gIHRoZSBkZWZhdWx0cyBmb3IgdGhlIHJlc3VsdHMgb2YgZGVjb2RpbmcgdGhlIGZpbGUuIFRoZSBkZWZhdWx0Ci0gIGRlZmF1bHRzIGFyZSB0YWtlbiBmcm9tIFx2YXJ7aW5fZmlsZX0sIG9yIFxjb2RleyctJ30gYW5kIFxjb2RlezA2NjZ9Ci0gIHJlc3BlY3RpdmVseS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZGVjb2RlfXtpbl9maWxlXG9wdGlvbmFseywgb3V0X2ZpbGVcb3B0aW9uYWx7LCBtb2RlXG9wdGlvbmFseywgcXVpZXR9fX19Ci0gIFRoaXMgY2FsbCBkZWNvZGVzIHV1ZW5jb2RlZCBmaWxlIFx2YXJ7aW5fZmlsZX0gcGxhY2luZyB0aGUgcmVzdWx0IG9uCi0gIGZpbGUgXHZhcntvdXRfZmlsZX0uIElmIFx2YXJ7b3V0X2ZpbGV9IGlzIGEgcGF0aG5hbWUsIFx2YXJ7bW9kZX0gaXMKLSAgdXNlZCB0byBzZXQgdGhlIHBlcm1pc3Npb24gYml0cyBpZiB0aGUgZmlsZSBtdXN0IGJlCi0gIGNyZWF0ZWQuIERlZmF1bHRzIGZvciBcdmFye291dF9maWxlfSBhbmQgXHZhcnttb2RlfSBhcmUgdGFrZW4gZnJvbQotICB0aGUgdXVlbmNvZGUgaGVhZGVyLiAgSG93ZXZlciwgaWYgdGhlIGZpbGUgc3BlY2lmaWVkIGluIHRoZSBoZWFkZXIKLSAgYWxyZWFkeSBleGlzdHMsIGEgXGV4Y2VwdGlvbnt1dS5FcnJvcn0gaXMgcmFpc2VkLgotCi0gIFxmdW5jdGlvbntkZWNvZGUoKX0gbWF5IHByaW50IGEgd2FybmluZyB0byBzdGFuZGFyZCBlcnJvciBpZiB0aGUKLSAgaW5wdXQgd2FzIHByb2R1Y2VkIGJ5IGFuIGluY29ycmVjdCB1dWVuY29kZXIgYW5kIFB5dGhvbiBjb3VsZAotICByZWNvdmVyIGZyb20gdGhhdCBlcnJvci4gIFNldHRpbmcgXHZhcntxdWlldH0gdG8gYSB0cnVlIHZhbHVlCi0gIHNpbGVuY2VzIHRoaXMgd2FybmluZy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntleGNjbGFzc2Rlc2N9e0Vycm9yfXt9Ci0gIFN1YmNsYXNzIG9mIFxleGNlcHRpb257RXhjZXB0aW9ufSwgdGhpcyBjYW4gYmUgcmFpc2VkIGJ5Ci0gIFxmdW5jdGlvbnt1dS5kZWNvZGUoKX0gdW5kZXIgdmFyaW91cyBzaXR1YXRpb25zLCBzdWNoIGFzIGRlc2NyaWJlZAotICBhYm92ZSwgYnV0IGFsc28gaW5jbHVkaW5nIGEgYmFkbHkgZm9ybWF0dGVkIGhlYWRlciwgb3IgdHJ1bmNhdGVkCi0gIGlucHV0IGZpbGUuCi1cZW5ke2V4Y2NsYXNzZGVzY30KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWVtb2R1bGV7YmluYXNjaWl9e1N1cHBvcnQgbW9kdWxlIGNvbnRhaW5pbmcgXEFTQ0lJLXRvLWJpbmFyeQotICAgICAgICAgICAgICAgICAgICAgICBhbmQgYmluYXJ5LXRvLVxBU0NJSXt9IGNvbnZlcnNpb25zLn0KLVxlbmR7c2VlYWxzb30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlidXVpZC50ZXggYi9Eb2MvbGliL2xpYnV1aWQudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWE5ZDhjLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlidXVpZC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXt1dWlkfSAtLS0KLSAgICAgICAgIFVVSUQgb2JqZWN0cyBhY2NvcmRpbmcgdG8gUkZDIDQxMjJ9Ci1cZGVjbGFyZW1vZHVsZXtidWlsdGlufXt1dWlkfQotXG1vZHVsZXN5bm9wc2lze1VVSUQgb2JqZWN0cyAodW5pdmVyc2FsbHkgdW5pcXVlIGlkZW50aWZpZXJzKSBhY2NvcmRpbmcgdG8gUkZDIDQxMjJ9Ci1cbW9kdWxlYXV0aG9ye0thLVBpbmcgWWVlfXtwaW5nQHplc3R5LmNhfQotXHNlY3Rpb25hdXRob3J7R2VvcmdlIFlvc2hpZGF9e3F1aXZlckB1c2Vycy5zb3VyY2Vmb3JnZS5uZXR9Ci0KLVx2ZXJzaW9uYWRkZWR7Mi41fQotCi1UaGlzIG1vZHVsZSBwcm92aWRlcyBpbW11dGFibGUgXGNsYXNze1VVSUR9IG9iamVjdHMgKHRoZSBcY2xhc3N7VVVJRH0gY2xhc3MpCi1hbmQgdGhlIGZ1bmN0aW9ucyBcZnVuY3Rpb257dXVpZDEoKX0sIFxmdW5jdGlvbnt1dWlkMygpfSwKLVxmdW5jdGlvbnt1dWlkNCgpfSwgXGZ1bmN0aW9ue3V1aWQ1KCl9IGZvciBnZW5lcmF0aW5nIHZlcnNpb24gMSwgMywgNCwKLWFuZCA1IFVVSURzIGFzIHNwZWNpZmllZCBpbiBccmZjezQxMjJ9LgotCi1JZiBhbGwgeW91IHdhbnQgaXMgYSB1bmlxdWUgSUQsIHlvdSBzaG91bGQgcHJvYmFibHkgY2FsbAotXGZ1bmN0aW9ue3V1aWQxKCl9IG9yIFxmdW5jdGlvbnt1dWlkNCgpfS4gIE5vdGUgdGhhdCBcZnVuY3Rpb257dXVpZDEoKX0KLW1heSBjb21wcm9taXNlIHByaXZhY3kgc2luY2UgaXQgY3JlYXRlcyBhIFVVSUQgY29udGFpbmluZyB0aGUgY29tcHV0ZXIncwotbmV0d29yayBhZGRyZXNzLiAgXGZ1bmN0aW9ue3V1aWQ0KCl9IGNyZWF0ZXMgYSByYW5kb20gVVVJRC4KLQotXGJlZ2lue2NsYXNzZGVzY317VVVJRH17XG9wdGlvbmFse2hleFxvcHRpb25hbHssIGJ5dGVzXG9wdGlvbmFseywKLWJ5dGVzX2xlXG9wdGlvbmFseywgZmllbGRzXG9wdGlvbmFseywgaW50XG9wdGlvbmFseywgdmVyc2lvbn19fX19fX0KLQotQ3JlYXRlIGEgVVVJRCBmcm9tIGVpdGhlciBhIHN0cmluZyBvZiAzMiBoZXhhZGVjaW1hbCBkaWdpdHMsCi1hIHN0cmluZyBvZiAxNiBieXRlcyBhcyB0aGUgXHZhcntieXRlc30gYXJndW1lbnQsIGEgc3RyaW5nIG9mIDE2IGJ5dGVzCi1pbiBsaXR0bGUtZW5kaWFuIG9yZGVyIGFzIHRoZSBcdmFye2J5dGVzX2xlfSBhcmd1bWVudCwgYSB0dXBsZSBvZiBzaXgKLWludGVnZXJzICgzMi1iaXQgXHZhcnt0aW1lX2xvd30sIDE2LWJpdCBcdmFye3RpbWVfbWlkfSwKLTE2LWJpdCBcdmFye3RpbWVfaGlfdmVyc2lvbn0sCi04LWJpdCBcdmFye2Nsb2NrX3NlcV9oaV92YXJpYW50fSwgOC1iaXQgXHZhcntjbG9ja19zZXFfbG93fSwgNDgtYml0IFx2YXJ7bm9kZX0pCi1hcyB0aGUgXHZhcntmaWVsZHN9IGFyZ3VtZW50LCBvciBhIHNpbmdsZSAxMjgtYml0IGludGVnZXIgYXMgdGhlIFx2YXJ7aW50fQotYXJndW1lbnQuICBXaGVuIGEgc3RyaW5nIG9mIGhleCBkaWdpdHMgaXMgZ2l2ZW4sIGN1cmx5IGJyYWNlcywKLWh5cGhlbnMsIGFuZCBhIFVSTiBwcmVmaXggYXJlIGFsbCBvcHRpb25hbC4gIEZvciBleGFtcGxlLCB0aGVzZQotZXhwcmVzc2lvbnMgYWxsIHlpZWxkIHRoZSBzYW1lIFVVSUQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLVVVSUQoJ3sxMjM0NTY3OC0xMjM0LTU2NzgtMTIzNC01Njc4MTIzNDU2Nzh9JykKLVVVSUQoJzEyMzQ1Njc4MTIzNDU2NzgxMjM0NTY3ODEyMzQ1Njc4JykKLVVVSUQoJ3Vybjp1dWlkOjEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OCcpCi1VVUlEKGJ5dGVzPSdceDEyXHgzNFx4NTZceDc4Jyo0KQotVVVJRChieXRlc19sZT0nXHg3OFx4NTZceDM0XHgxMlx4MzRceDEyXHg3OFx4NTYnICsKLSAgICAgICAgICAgICAgJ1x4MTJceDM0XHg1Nlx4NzhceDEyXHgzNFx4NTZceDc4JykKLVVVSUQoZmllbGRzPSgweDEyMzQ1Njc4LCAweDEyMzQsIDB4NTY3OCwgMHgxMiwgMHgzNCwgMHg1Njc4MTIzNDU2NzgpKQotVVVJRChpbnQ9MHgxMjM0NTY3ODEyMzQ1Njc4MTIzNDU2NzgxMjM0NTY3OCkKLVxlbmR7dmVyYmF0aW19Ci0KLUV4YWN0bHkgb25lIG9mIFx2YXJ7aGV4fSwgXHZhcntieXRlc30sIFx2YXJ7Ynl0ZXNfbGV9LCBcdmFye2ZpZWxkc30sCi1vciBcdmFye2ludH0gbXVzdAotYmUgZ2l2ZW4uICBUaGUgXHZhcnt2ZXJzaW9ufSBhcmd1bWVudCBpcyBvcHRpb25hbDsgaWYgZ2l2ZW4sIHRoZQotcmVzdWx0aW5nIFVVSUQgd2lsbCBoYXZlIGl0cyB2YXJpYW50IGFuZCB2ZXJzaW9uIG51bWJlciBzZXQgYWNjb3JkaW5nIHRvCi1SRkMgNDEyMiwgb3ZlcnJpZGluZyBiaXRzIGluIHRoZSBnaXZlbiBcdmFye2hleH0sIFx2YXJ7Ynl0ZXN9LAotXHZhcntieXRlc19sZX0sIFx2YXJ7ZmllbGRzfSwgb3IgXHZhcntpbnR9LgotCi1cZW5ke2NsYXNzZGVzY30KLQotXGNsYXNze1VVSUR9IGluc3RhbmNlcyBoYXZlIHRoZXNlIHJlYWQtb25seSBhdHRyaWJ1dGVzOgotCi1cYmVnaW57bWVtYmVyZGVzY317Ynl0ZXN9Ci1UaGUgVVVJRCBhcyBhIDE2LWJ5dGUgc3RyaW5nIChjb250YWluaW5nIHRoZSBzaXgKLWludGVnZXIgZmllbGRzIGluIGJpZy1lbmRpYW4gYnl0ZSBvcmRlcikuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXtieXRlc19sZX0KLVRoZSBVVUlEIGFzIGEgMTYtYnl0ZSBzdHJpbmcgKHdpdGggXHZhcnt0aW1lX2xvd30sIFx2YXJ7dGltZV9taWR9LAotYW5kIFx2YXJ7dGltZV9oaV92ZXJzaW9ufSBpbiBsaXR0bGUtZW5kaWFuIGJ5dGUgb3JkZXIpLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY317ZmllbGRzfQotQSB0dXBsZSBvZiB0aGUgc2l4IGludGVnZXIgZmllbGRzIG9mIHRoZSBVVUlELCB3aGljaCBhcmUgYWxzbyBhdmFpbGFibGUKLWFzIHNpeCBpbmRpdmlkdWFsIGF0dHJpYnV0ZXMgYW5kIHR3byBkZXJpdmVkIGF0dHJpYnV0ZXM6Ci0KLVxiZWdpbnt0YWJsZWlpfXtsfGx9e21lbWJlcn17RmllbGR9e01lYW5pbmd9Ci0gIFxsaW5laWl7dGltZV9sb3d9e3RoZSBmaXJzdCAzMiBiaXRzIG9mIHRoZSBVVUlEfQotICBcbGluZWlpe3RpbWVfbWlkfXt0aGUgbmV4dCAxNiBiaXRzIG9mIHRoZSBVVUlEfQotICBcbGluZWlpe3RpbWVfaGlfdmVyc2lvbn17dGhlIG5leHQgMTYgYml0cyBvZiB0aGUgVVVJRH0KLSAgXGxpbmVpaXtjbG9ja19zZXFfaGlfdmFyaWFudH17dGhlIG5leHQgOCBiaXRzIG9mIHRoZSBVVUlEfQotICBcbGluZWlpe2Nsb2NrX3NlcV9sb3d9e3RoZSBuZXh0IDggYml0cyBvZiB0aGUgVVVJRH0KLSAgXGxpbmVpaXtub2RlfXt0aGUgbGFzdCA0OCBiaXRzIG9mIHRoZSBVVUlEfQotICBcbGluZWlpe3RpbWV9e3RoZSA2MC1iaXQgdGltZXN0YW1wfQotICBcbGluZWlpe2Nsb2NrX3NlcX17dGhlIDE0LWJpdCBzZXF1ZW5jZSBudW1iZXJ9Ci1cZW5ke3RhYmxlaWl9Ci0KLQotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY317aGV4fQotVGhlIFVVSUQgYXMgYSAzMi1jaGFyYWN0ZXIgaGV4YWRlY2ltYWwgc3RyaW5nLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY317aW50fQotVGhlIFVVSUQgYXMgYSAxMjgtYml0IGludGVnZXIuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXt1cm59Ci1UaGUgVVVJRCBhcyBhIFVSTiBhcyBzcGVjaWZpZWQgaW4gUkZDIDQxMjIuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXt2YXJpYW50fQotVGhlIFVVSUQgdmFyaWFudCwgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgaW50ZXJuYWwgbGF5b3V0IG9mIHRoZSBVVUlELgotVGhpcyB3aWxsIGJlIG9uZSBvZiB0aGUgaW50ZWdlciBjb25zdGFudHMKLVxjb25zdGFudHtSRVNFUlZFRF9OQ1N9LAotXGNvbnN0YW50e1JGQ180MTIyfSwgXGNvbnN0YW50e1JFU0VSVkVEX01JQ1JPU09GVH0sIG9yCi1cY29uc3RhbnR7UkVTRVJWRURfRlVUVVJFfS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9e3ZlcnNpb259Ci1UaGUgVVVJRCB2ZXJzaW9uIG51bWJlciAoMSB0aHJvdWdoIDUsIG1lYW5pbmdmdWwgb25seQotd2hlbiB0aGUgdmFyaWFudCBpcyBcY29uc3RhbnR7UkZDXzQxMjJ9KS4KLVxlbmR7bWVtYmVyZGVzY30KLQotVGhlIFxtb2R1bGV7dXVpZH0gbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0bm9kZX17fQotR2V0IHRoZSBoYXJkd2FyZSBhZGRyZXNzIGFzIGEgNDgtYml0IHBvc2l0aXZlIGludGVnZXIuICBUaGUgZmlyc3QgdGltZSB0aGlzCi1ydW5zLCBpdCBtYXkgbGF1bmNoIGEgc2VwYXJhdGUgcHJvZ3JhbSwgd2hpY2ggY291bGQgYmUgcXVpdGUgc2xvdy4gIElmIGFsbAotYXR0ZW1wdHMgdG8gb2J0YWluIHRoZSBoYXJkd2FyZSBhZGRyZXNzIGZhaWwsIHdlIGNob29zZSBhIHJhbmRvbSA0OC1iaXQKLW51bWJlciB3aXRoIGl0cyBlaWdodGggYml0IHNldCB0byAxIGFzIHJlY29tbWVuZGVkIGluIFJGQyA0MTIyLiAgIkhhcmR3YXJlCi1hZGRyZXNzIiBtZWFucyB0aGUgTUFDIGFkZHJlc3Mgb2YgYSBuZXR3b3JrIGludGVyZmFjZSwgYW5kIG9uIGEgbWFjaGluZQotd2l0aCBtdWx0aXBsZSBuZXR3b3JrIGludGVyZmFjZXMgdGhlIE1BQyBhZGRyZXNzIG9mIGFueSBvbmUgb2YgdGhlbSBtYXkKLWJlIHJldHVybmVkLgotXGVuZHtmdW5jZGVzY30KLVxpbmRleHtnZXRub2RlfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3V1aWQxfXtcb3B0aW9uYWx7bm9kZVxvcHRpb25hbHssIGNsb2NrX3NlcX19fQotR2VuZXJhdGUgYSBVVUlEIGZyb20gYSBob3N0IElELCBzZXF1ZW5jZSBudW1iZXIsIGFuZCB0aGUgY3VycmVudCB0aW1lLgotSWYgXHZhcntub2RlfSBpcyBub3QgZ2l2ZW4sIFxmdW5jdGlvbntnZXRub2RlKCl9IGlzIHVzZWQgdG8gb2J0YWluIHRoZQotaGFyZHdhcmUgYWRkcmVzcy4KLUlmIFx2YXJ7Y2xvY2tfc2VxfSBpcyBnaXZlbiwgaXQgaXMgdXNlZCBhcyB0aGUgc2VxdWVuY2UgbnVtYmVyOwotb3RoZXJ3aXNlIGEgcmFuZG9tIDE0LWJpdCBzZXF1ZW5jZSBudW1iZXIgaXMgY2hvc2VuLgotXGVuZHtmdW5jZGVzY30KLVxpbmRleHt1dWlkMX0KLQotXGJlZ2lue2Z1bmNkZXNjfXt1dWlkM317bmFtZXNwYWNlLCBuYW1lfQotR2VuZXJhdGUgYSBVVUlEIGJhc2VkIG9uIHRoZSBNRDUgaGFzaAotb2YgYSBuYW1lc3BhY2UgaWRlbnRpZmllciAod2hpY2ggaXMgYSBVVUlEKSBhbmQgYSBuYW1lICh3aGljaCBpcyBhIHN0cmluZykuCi1cZW5ke2Z1bmNkZXNjfQotXGluZGV4e3V1aWQzfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3V1aWQ0fXt9Ci1HZW5lcmF0ZSBhIHJhbmRvbSBVVUlELgotXGVuZHtmdW5jZGVzY30KLVxpbmRleHt1dWlkNH0KLQotXGJlZ2lue2Z1bmNkZXNjfXt1dWlkNX17bmFtZXNwYWNlLCBuYW1lfQotR2VuZXJhdGUgYSBVVUlEIGJhc2VkIG9uIHRoZSBTSEEtMSBoYXNoCi1vZiBhIG5hbWVzcGFjZSBpZGVudGlmaWVyICh3aGljaCBpcyBhIFVVSUQpIGFuZCBhIG5hbWUgKHdoaWNoIGlzIGEgc3RyaW5nKS4KLVxlbmR7ZnVuY2Rlc2N9Ci1caW5kZXh7dXVpZDV9Ci0KLVRoZSBcbW9kdWxle3V1aWR9IG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgbmFtZXNwYWNlIGlkZW50aWZpZXJzCi1mb3IgdXNlIHdpdGggXGZ1bmN0aW9ue3V1aWQzKCl9IG9yIFxmdW5jdGlvbnt1dWlkNSgpfS4KLQotXGJlZ2lue2RhdGFkZXNjfXtOQU1FU1BBQ0VfRE5TfQotV2hlbiB0aGlzIG5hbWVzcGFjZSBpcyBzcGVjaWZpZWQsCi10aGUgXHZhcntuYW1lfSBzdHJpbmcgaXMgYSBmdWxseS1xdWFsaWZpZWQgZG9tYWluIG5hbWUuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e05BTUVTUEFDRV9VUkx9Ci1XaGVuIHRoaXMgbmFtZXNwYWNlIGlzIHNwZWNpZmllZCwKLXRoZSBcdmFye25hbWV9IHN0cmluZyBpcyBhIFVSTC4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317TkFNRVNQQUNFX09JRH0KLVdoZW4gdGhpcyBuYW1lc3BhY2UgaXMgc3BlY2lmaWVkLAotdGhlIFx2YXJ7bmFtZX0gc3RyaW5nIGlzIGFuIElTTyBPSUQuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e05BTUVTUEFDRV9YNTAwfQotV2hlbiB0aGlzIG5hbWVzcGFjZSBpcyBzcGVjaWZpZWQsCi10aGUgXHZhcntuYW1lfSBzdHJpbmcgaXMgYW4gWC41MDAgRE4gaW4gREVSIG9yIGEgdGV4dCBvdXRwdXQgZm9ybWF0LgotXGVuZHtkYXRhZGVzY30KLQotVGhlIFxtb2R1bGV7dXVpZH0gbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBjb25zdGFudHMKLWZvciB0aGUgcG9zc2libGUgdmFsdWVzIG9mIHRoZSBcbWVtYmVye3ZhcmlhbnR9IGF0dHJpYnV0ZToKLQotXGJlZ2lue2RhdGFkZXNjfXtSRVNFUlZFRF9OQ1N9Ci1SZXNlcnZlZCBmb3IgTkNTIGNvbXBhdGliaWxpdHkuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1JGQ180MTIyfQotU3BlY2lmaWVzIHRoZSBVVUlEIGxheW91dCBnaXZlbiBpbiBccmZjezQxMjJ9LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtSRVNFUlZFRF9NSUNST1NPRlR9Ci1SZXNlcnZlZCBmb3IgTWljcm9zb2Z0IGNvbXBhdGliaWxpdHkuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1JFU0VSVkVEX0ZVVFVSRX0KLVJlc2VydmVkIGZvciBmdXR1cmUgZGVmaW5pdGlvbi4KLVxlbmR7ZGF0YWRlc2N9Ci0KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWVyZmN7NDEyMn17QSBVbml2ZXJzYWxseSBVbmlxdWUgSURlbnRpZmllciAoVVVJRCkgVVJOIE5hbWVzcGFjZX17Ci1UaGlzIHNwZWNpZmljYXRpb24gZGVmaW5lcyBhIFVuaWZvcm0gUmVzb3VyY2UgTmFtZSBuYW1lc3BhY2UgZm9yIFVVSURzLAotdGhlIGludGVybmFsIGZvcm1hdCBvZiBVVUlEcywgYW5kIG1ldGhvZHMgb2YgZ2VuZXJhdGluZyBVVUlEcy59Ci1cZW5ke3NlZWFsc299Ci0KLVxzdWJzZWN0aW9ue0V4YW1wbGUgXGxhYmVse3V1aWQtZXhhbXBsZX19Ci0KLUhlcmUgYXJlIHNvbWUgZXhhbXBsZXMgb2YgdHlwaWNhbCB1c2FnZSBvZiB0aGUgXG1vZHVsZXt1dWlkfSBtb2R1bGU6Ci1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gaW1wb3J0IHV1aWQKLQotIyBtYWtlIGEgVVVJRCBiYXNlZCBvbiB0aGUgaG9zdCBJRCBhbmQgY3VycmVudCB0aW1lCi0+Pj4gdXVpZC51dWlkMSgpCi1VVUlEKCdhODA5OGMxYS1mODZlLTExZGEtYmQxYS0wMDExMjQ0NGJlMWUnKQotCi0jIG1ha2UgYSBVVUlEIHVzaW5nIGFuIE1ENSBoYXNoIG9mIGEgbmFtZXNwYWNlIFVVSUQgYW5kIGEgbmFtZQotPj4+IHV1aWQudXVpZDModXVpZC5OQU1FU1BBQ0VfRE5TLCAncHl0aG9uLm9yZycpCi1VVUlEKCc2ZmE0NTllYS1lZThhLTNjYTQtODk0ZS1kYjc3ZTE2MDM1NWUnKQotCi0jIG1ha2UgYSByYW5kb20gVVVJRAotPj4+IHV1aWQudXVpZDQoKQotVVVJRCgnMTZmZDI3MDYtOGJhZi00MzNiLTgyZWItOGM3ZmFkYTg0N2RhJykKLQotIyBtYWtlIGEgVVVJRCB1c2luZyBhIFNIQS0xIGhhc2ggb2YgYSBuYW1lc3BhY2UgVVVJRCBhbmQgYSBuYW1lCi0+Pj4gdXVpZC51dWlkNSh1dWlkLk5BTUVTUEFDRV9ETlMsICdweXRob24ub3JnJykKLVVVSUQoJzg4NjMxM2UxLTNiOGEtNTM3Mi05YjkwLTBjOWFlZTE5OWU1ZCcpCi0KLSMgbWFrZSBhIFVVSUQgZnJvbSBhIHN0cmluZyBvZiBoZXggZGlnaXRzIChicmFjZXMgYW5kIGh5cGhlbnMgaWdub3JlZCkKLT4+PiB4ID0gdXVpZC5VVUlEKCd7MDAwMTAyMDMtMDQwNS0wNjA3LTA4MDktMGEwYjBjMGQwZTBmfScpCi0KLSMgY29udmVydCBhIFVVSUQgdG8gYSBzdHJpbmcgb2YgaGV4IGRpZ2l0cyBpbiBzdGFuZGFyZCBmb3JtCi0+Pj4gc3RyKHgpCi0nMDAwMTAyMDMtMDQwNS0wNjA3LTA4MDktMGEwYjBjMGQwZTBmJwotCi0jIGdldCB0aGUgcmF3IDE2IGJ5dGVzIG9mIHRoZSBVVUlECi0+Pj4geC5ieXRlcwotJ1x4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOFx0XG5ceDBiXHgwY1xyXHgwZVx4MGYnCi0KLSMgbWFrZSBhIFVVSUQgZnJvbSBhIDE2LWJ5dGUgc3RyaW5nCi0+Pj4gdXVpZC5VVUlEKGJ5dGVzPXguYnl0ZXMpCi1VVUlEKCcwMDAxMDIwMy0wNDA1LTA2MDctMDgwOS0wYTBiMGMwZDBlMGYnKQotXGVuZHt2ZXJiYXRpbX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlid2FybmluZ3MudGV4IGIvRG9jL2xpYi9saWJ3YXJuaW5ncy50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzN2E5ZjUuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJ3YXJuaW5ncy50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXt3YXJuaW5nc30gLS0tCi0gICAgICAgICBXYXJuaW5nIGNvbnRyb2x9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXt3YXJuaW5nc30KLVxtb2R1bGVzeW5vcHNpc3tJc3N1ZSB3YXJuaW5nIG1lc3NhZ2VzIGFuZCBjb250cm9sIHRoZWlyIGRpc3Bvc2l0aW9uLn0KLVxpbmRleHt3YXJuaW5nc30KLQotXHZlcnNpb25hZGRlZHsyLjF9Ci0KLVdhcm5pbmcgbWVzc2FnZXMgYXJlIHR5cGljYWxseSBpc3N1ZWQgaW4gc2l0dWF0aW9ucyB3aGVyZSBpdCBpcyB1c2VmdWwKLXRvIGFsZXJ0IHRoZSB1c2VyIG9mIHNvbWUgY29uZGl0aW9uIGluIGEgcHJvZ3JhbSwgd2hlcmUgdGhhdCBjb25kaXRpb24KLShub3JtYWxseSkgZG9lc24ndCB3YXJyYW50IHJhaXNpbmcgYW4gZXhjZXB0aW9uIGFuZCB0ZXJtaW5hdGluZyB0aGUKLXByb2dyYW0uICBGb3IgZXhhbXBsZSwgb25lIG1pZ2h0IHdhbnQgdG8gaXNzdWUgYSB3YXJuaW5nIHdoZW4gYQotcHJvZ3JhbSB1c2VzIGFuIG9ic29sZXRlIG1vZHVsZS4KLQotUHl0aG9uIHByb2dyYW1tZXJzIGlzc3VlIHdhcm5pbmdzIGJ5IGNhbGxpbmcgdGhlIFxmdW5jdGlvbnt3YXJuKCl9Ci1mdW5jdGlvbiBkZWZpbmVkIGluIHRoaXMgbW9kdWxlLiAgKEMgcHJvZ3JhbW1lcnMgdXNlCi1cY2Z1bmN0aW9ue1B5RXJyX1dhcm4oKX07IHNlZSB0aGUKLVxjaXRldGl0bGVbLi4vYXBpL2V4Y2VwdGlvbkhhbmRsaW5nLmh0bWxde1B5dGhvbi9DIEFQSSBSZWZlcmVuY2UKLU1hbnVhbH0gZm9yIGRldGFpbHMpLgotCi1XYXJuaW5nIG1lc3NhZ2VzIGFyZSBub3JtYWxseSB3cml0dGVuIHRvIFxjb2Rle3N5cy5zdGRlcnJ9LCBidXQgdGhlaXIKLWRpc3Bvc2l0aW9uIGNhbiBiZSBjaGFuZ2VkIGZsZXhpYmx5LCBmcm9tIGlnbm9yaW5nIGFsbCB3YXJuaW5ncyB0bwotdHVybmluZyB0aGVtIGludG8gZXhjZXB0aW9ucy4gIFRoZSBkaXNwb3NpdGlvbiBvZiB3YXJuaW5ncyBjYW4gdmFyeQotYmFzZWQgb24gdGhlIHdhcm5pbmcgY2F0ZWdvcnkgKHNlZSBiZWxvdyksIHRoZSB0ZXh0IG9mIHRoZSB3YXJuaW5nCi1tZXNzYWdlLCBhbmQgdGhlIHNvdXJjZSBsb2NhdGlvbiB3aGVyZSBpdCBpcyBpc3N1ZWQuICBSZXBldGl0aW9ucyBvZiBhCi1wYXJ0aWN1bGFyIHdhcm5pbmcgZm9yIHRoZSBzYW1lIHNvdXJjZSBsb2NhdGlvbiBhcmUgdHlwaWNhbGx5Ci1zdXBwcmVzc2VkLgotCi1UaGVyZSBhcmUgdHdvIHN0YWdlcyBpbiB3YXJuaW5nIGNvbnRyb2w6IGZpcnN0LCBlYWNoIHRpbWUgYSB3YXJuaW5nIGlzCi1pc3N1ZWQsIGEgZGV0ZXJtaW5hdGlvbiBpcyBtYWRlIHdoZXRoZXIgYSBtZXNzYWdlIHNob3VsZCBiZSBpc3N1ZWQgb3IKLW5vdDsgbmV4dCwgaWYgYSBtZXNzYWdlIGlzIHRvIGJlIGlzc3VlZCwgaXQgaXMgZm9ybWF0dGVkIGFuZCBwcmludGVkCi11c2luZyBhIHVzZXItc2V0dGFibGUgaG9vay4KLQotVGhlIGRldGVybWluYXRpb24gd2hldGhlciB0byBpc3N1ZSBhIHdhcm5pbmcgbWVzc2FnZSBpcyBjb250cm9sbGVkIGJ5Ci10aGUgd2FybmluZyBmaWx0ZXIsIHdoaWNoIGlzIGEgc2VxdWVuY2Ugb2YgbWF0Y2hpbmcgcnVsZXMgYW5kIGFjdGlvbnMuCi1SdWxlcyBjYW4gYmUgYWRkZWQgdG8gdGhlIGZpbHRlciBieSBjYWxsaW5nCi1cZnVuY3Rpb257ZmlsdGVyd2FybmluZ3MoKX0gYW5kIHJlc2V0IHRvIGl0cyBkZWZhdWx0IHN0YXRlIGJ5IGNhbGxpbmcKLVxmdW5jdGlvbntyZXNldHdhcm5pbmdzKCl9LgotCi1UaGUgcHJpbnRpbmcgb2Ygd2FybmluZyBtZXNzYWdlcyBpcyBkb25lIGJ5IGNhbGxpbmcKLVxmdW5jdGlvbntzaG93d2FybmluZygpfSwgd2hpY2ggbWF5IGJlIG92ZXJyaWRkZW47IHRoZSBkZWZhdWx0Ci1pbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIGZvcm1hdHMgdGhlIG1lc3NhZ2UgYnkgY2FsbGluZwotXGZ1bmN0aW9ue2Zvcm1hdHdhcm5pbmcoKX0sIHdoaWNoIGlzIGFsc28gYXZhaWxhYmxlIGZvciB1c2UgYnkgY3VzdG9tCi1pbXBsZW1lbnRhdGlvbnMuCi0KLQotXHN1YnNlY3Rpb257V2FybmluZyBDYXRlZ29yaWVzIFxsYWJlbHt3YXJuaW5nLWNhdGVnb3JpZXN9fQotCi1UaGVyZSBhcmUgYSBudW1iZXIgb2YgYnVpbHQtaW4gZXhjZXB0aW9ucyB0aGF0IHJlcHJlc2VudCB3YXJuaW5nCi1jYXRlZ29yaWVzLiAgVGhpcyBjYXRlZ29yaXphdGlvbiBpcyB1c2VmdWwgdG8gYmUgYWJsZSB0byBmaWx0ZXIgb3V0Ci1ncm91cHMgb2Ygd2FybmluZ3MuICBUaGUgZm9sbG93aW5nIHdhcm5pbmdzIGNhdGVnb3J5IGNsYXNzZXMgYXJlCi1jdXJyZW50bHkgZGVmaW5lZDoKLQotXGJlZ2lue3RhYmxlaWl9e2x8bH17ZXhjZXB0aW9ufXtDbGFzc317RGVzY3JpcHRpb259Ci0KLVxsaW5laWl7V2FybmluZ317VGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBvZiBhbGwgd2FybmluZyBjYXRlZ29yeQotY2xhc3Nlcy4gIEl0IGlzIGEgc3ViY2xhc3Mgb2YgXGV4Y2VwdGlvbntFeGNlcHRpb259Ln0KLQotXGxpbmVpaXtVc2VyV2FybmluZ317VGhlIGRlZmF1bHQgY2F0ZWdvcnkgZm9yIFxmdW5jdGlvbnt3YXJuKCl9Ln0KLQotXGxpbmVpaXtEZXByZWNhdGlvbldhcm5pbmd9e0Jhc2UgY2F0ZWdvcnkgZm9yIHdhcm5pbmdzIGFib3V0Ci1kZXByZWNhdGVkIGZlYXR1cmVzLn0KLQotXGxpbmVpaXtTeW50YXhXYXJuaW5nfXtCYXNlIGNhdGVnb3J5IGZvciB3YXJuaW5ncyBhYm91dCBkdWJpb3VzCi1zeW50YWN0aWMgZmVhdHVyZXMufQotCi1cbGluZWlpe1J1bnRpbWVXYXJuaW5nfXtCYXNlIGNhdGVnb3J5IGZvciB3YXJuaW5ncyBhYm91dCBkdWJpb3VzCi1ydW50aW1lIGZlYXR1cmVzLn0KLQotXGxpbmVpaXtGdXR1cmVXYXJuaW5nfXtCYXNlIGNhdGVnb3J5IGZvciB3YXJuaW5ncyBhYm91dCBjb25zdHJ1Y3RzCi10aGF0IHdpbGwgY2hhbmdlIHNlbWFudGljYWxseSBpbiB0aGUgZnV0dXJlLn0KLQotXGxpbmVpaXtQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nfXtCYXNlIGNhdGVnb3J5IGZvciB3YXJuaW5ncyBhYm91dAotZmVhdHVyZXMgdGhhdCB3aWxsIGJlIGRlcHJlY2F0ZWQgaW4gdGhlIGZ1dHVyZSAoaWdub3JlZCBieSBkZWZhdWx0KS59Ci0KLVxsaW5laWl7SW1wb3J0V2FybmluZ317QmFzZSBjYXRlZ29yeSBmb3Igd2FybmluZ3MgdHJpZ2dlcmVkIGR1cmluZyB0aGUKLXByb2Nlc3Mgb2YgaW1wb3J0aW5nIGEgbW9kdWxlIChpZ25vcmVkIGJ5IGRlZmF1bHQpLn0KLQotXGxpbmVpaXtVbmljb2RlV2FybmluZ317QmFzZSBjYXRlZ29yeSBmb3Igd2FybmluZ3MgcmVsYXRlZCB0byBVbmljb2RlLn0KLQotXGVuZHt0YWJsZWlpfQotCi1XaGlsZSB0aGVzZSBhcmUgdGVjaG5pY2FsbHkgYnVpbHQtaW4gZXhjZXB0aW9ucywgdGhleSBhcmUgZG9jdW1lbnRlZAotaGVyZSwgYmVjYXVzZSBjb25jZXB0dWFsbHkgdGhleSBiZWxvbmcgdG8gdGhlIHdhcm5pbmdzIG1lY2hhbmlzbS4KLQotVXNlciBjb2RlIGNhbiBkZWZpbmUgYWRkaXRpb25hbCB3YXJuaW5nIGNhdGVnb3JpZXMgYnkgc3ViY2xhc3Npbmcgb25lCi1vZiB0aGUgc3RhbmRhcmQgd2FybmluZyBjYXRlZ29yaWVzLiAgQSB3YXJuaW5nIGNhdGVnb3J5IG11c3QgYWx3YXlzIGJlCi1hIHN1YmNsYXNzIG9mIHRoZSBcZXhjZXB0aW9ue1dhcm5pbmd9IGNsYXNzLgotCi0KLVxzdWJzZWN0aW9ue1RoZSBXYXJuaW5ncyBGaWx0ZXIgXGxhYmVse3dhcm5pbmctZmlsdGVyfX0KLQotVGhlIHdhcm5pbmdzIGZpbHRlciBjb250cm9scyB3aGV0aGVyIHdhcm5pbmdzIGFyZSBpZ25vcmVkLCBkaXNwbGF5ZWQsCi1vciB0dXJuZWQgaW50byBlcnJvcnMgKHJhaXNpbmcgYW4gZXhjZXB0aW9uKS4KLQotQ29uY2VwdHVhbGx5LCB0aGUgd2FybmluZ3MgZmlsdGVyIG1haW50YWlucyBhbiBvcmRlcmVkIGxpc3Qgb2YgZmlsdGVyCi1zcGVjaWZpY2F0aW9uczsgYW55IHNwZWNpZmljIHdhcm5pbmcgaXMgbWF0Y2hlZCBhZ2FpbnN0IGVhY2ggZmlsdGVyCi1zcGVjaWZpY2F0aW9uIGluIHRoZSBsaXN0IGluIHR1cm4gdW50aWwgYSBtYXRjaCBpcyBmb3VuZDsgdGhlIG1hdGNoCi1kZXRlcm1pbmVzIHRoZSBkaXNwb3NpdGlvbiBvZiB0aGUgbWF0Y2guICBFYWNoIGVudHJ5IGlzIGEgdHVwbGUgb2YgdGhlCi1mb3JtIChcdmFye2FjdGlvbn0sIFx2YXJ7bWVzc2FnZX0sIFx2YXJ7Y2F0ZWdvcnl9LCBcdmFye21vZHVsZX0sCi1cdmFye2xpbmVub30pLCB3aGVyZToKLQotXGJlZ2lue2l0ZW1pemV9Ci0KLVxpdGVtIFx2YXJ7YWN0aW9ufSBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBzdHJpbmdzOgotCi0gICAgXGJlZ2lue3RhYmxlaWl9e2x8bH17Y29kZX17VmFsdWV9e0Rpc3Bvc2l0aW9ufQotCi0gICAgXGxpbmVpaXsiZXJyb3IifXt0dXJuIG1hdGNoaW5nIHdhcm5pbmdzIGludG8gZXhjZXB0aW9uc30KLQotICAgIFxsaW5laWl7Imlnbm9yZSJ9e25ldmVyIHByaW50IG1hdGNoaW5nIHdhcm5pbmdzfQotCi0gICAgXGxpbmVpaXsiYWx3YXlzIn17YWx3YXlzIHByaW50IG1hdGNoaW5nIHdhcm5pbmdzfQotCi0gICAgXGxpbmVpaXsiZGVmYXVsdCJ9e3ByaW50IHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIG1hdGNoaW5nCi0gICAgd2FybmluZ3MgZm9yIGVhY2ggbG9jYXRpb24gd2hlcmUgdGhlIHdhcm5pbmcgaXMgaXNzdWVkfQotCi0gICAgXGxpbmVpaXsibW9kdWxlIn17cHJpbnQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgbWF0Y2hpbmcKLSAgICB3YXJuaW5ncyBmb3IgZWFjaCBtb2R1bGUgd2hlcmUgdGhlIHdhcm5pbmcgaXMgaXNzdWVkfQotCi0gICAgXGxpbmVpaXsib25jZSJ9e3ByaW50IG9ubHkgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgbWF0Y2hpbmcKLSAgICB3YXJuaW5ncywgcmVnYXJkbGVzcyBvZiBsb2NhdGlvbn0KLQotICAgIFxlbmR7dGFibGVpaX0KLQotXGl0ZW0gXHZhcnttZXNzYWdlfSBpcyBhIHN0cmluZyBjb250YWluaW5nIGEgcmVndWxhciBleHByZXNzaW9uIHRoYXQKLXRoZSB3YXJuaW5nIG1lc3NhZ2UgbXVzdCBtYXRjaCAodGhlIG1hdGNoIGlzIGNvbXBpbGVkIHRvIGFsd2F5cyBiZSAKLWNhc2UtaW5zZW5zaXRpdmUpIAotCi1caXRlbSBcdmFye2NhdGVnb3J5fSBpcyBhIGNsYXNzIChhIHN1YmNsYXNzIG9mIFxleGNlcHRpb257V2FybmluZ30pIG9mCi0gICAgICB3aGljaCB0aGUgd2FybmluZyBjYXRlZ29yeSBtdXN0IGJlIGEgc3ViY2xhc3MgaW4gb3JkZXIgdG8gbWF0Y2gKLQotXGl0ZW0gXHZhcnttb2R1bGV9IGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCB0aGUgbW9kdWxlCi0gICAgICBuYW1lIG11c3QgbWF0Y2ggKHRoZSBtYXRjaCBpcyBjb21waWxlZCB0byBiZSBjYXNlLXNlbnNpdGl2ZSkKLQotXGl0ZW0gXHZhcntsaW5lbm99IGlzIGFuIGludGVnZXIgdGhhdCB0aGUgbGluZSBudW1iZXIgd2hlcmUgdGhlCi0gICAgICB3YXJuaW5nIG9jY3VycmVkIG11c3QgbWF0Y2gsIG9yIFxjb2RlezB9IHRvIG1hdGNoIGFsbCBsaW5lCi0gICAgICBudW1iZXJzCi0KLVxlbmR7aXRlbWl6ZX0KLQotU2luY2UgdGhlIFxleGNlcHRpb257V2FybmluZ30gY2xhc3MgaXMgZGVyaXZlZCBmcm9tIHRoZSBidWlsdC1pbgotXGV4Y2VwdGlvbntFeGNlcHRpb259IGNsYXNzLCB0byB0dXJuIGEgd2FybmluZyBpbnRvIGFuIGVycm9yIHdlIHNpbXBseQotcmFpc2UgXGNvZGV7Y2F0ZWdvcnkobWVzc2FnZSl9LgotCi1UaGUgd2FybmluZ3MgZmlsdGVyIGlzIGluaXRpYWxpemVkIGJ5IFxwcm9ncmFtb3B0ey1XfSBvcHRpb25zIHBhc3NlZAotdG8gdGhlIFB5dGhvbiBpbnRlcnByZXRlciBjb21tYW5kIGxpbmUuICBUaGUgaW50ZXJwcmV0ZXIgc2F2ZXMgdGhlCi1hcmd1bWVudHMgZm9yIGFsbCBccHJvZ3JhbW9wdHstV30gb3B0aW9ucyB3aXRob3V0IGludGVycHJldGF0aW9uIGluCi1cY29kZXtzeXMud2Fybm9wdGlvbnN9OyB0aGUgXG1vZHVsZXt3YXJuaW5nc30gbW9kdWxlIHBhcnNlcyB0aGVzZSB3aGVuCi1pdCBpcyBmaXJzdCBpbXBvcnRlZCAoaW52YWxpZCBvcHRpb25zIGFyZSBpZ25vcmVkLCBhZnRlciBwcmludGluZyBhCi1tZXNzYWdlIHRvIFxjb2Rle3N5cy5zdGRlcnJ9KS4KLQotVGhlIHdhcm5pbmdzIHRoYXQgYXJlIGlnbm9yZWQgYnkgZGVmYXVsdCBtYXkgYmUgZW5hYmxlZCBieSBwYXNzaW5nCi0gXHByb2dyYW1vcHR7LVdkfSB0byB0aGUgaW50ZXJwcmV0ZXIuIFRoaXMgZW5hYmxlcyBkZWZhdWx0IGhhbmRsaW5nCi1mb3IgYWxsIHdhcm5pbmdzLCBpbmNsdWRpbmcgdGhvc2UgdGhhdCBhcmUgbm9ybWFsbHkgaWdub3JlZCBieQotZGVmYXVsdC4gVGhpcyBpcyBwYXJ0aWN1bGFyIHVzZWZ1bCBmb3IgZW5hYmxpbmcgSW1wb3J0V2FybmluZyB3aGVuCi1kZWJ1Z2dpbmcgcHJvYmxlbXMgaW1wb3J0aW5nIGEgZGV2ZWxvcGVkIHBhY2thZ2UuIEltcG9ydFdhcm5pbmcgY2FuCi1hbHNvIGJlIGVuYWJsZWQgZXhwbGljaXRseSBpbiBQeXRob24gY29kZSB1c2luZzoKLQotXGJlZ2lue3ZlcmJhdGltfQotICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignZGVmYXVsdCcsIEltcG9ydFdhcm5pbmcpCi1cZW5ke3ZlcmJhdGltfQotCi0KLVxzdWJzZWN0aW9ue0F2YWlsYWJsZSBGdW5jdGlvbnMgXGxhYmVse3dhcm5pbmctZnVuY3Rpb25zfX0KLQotXGJlZ2lue2Z1bmNkZXNjfXt3YXJufXttZXNzYWdlXG9wdGlvbmFseywgY2F0ZWdvcnlcb3B0aW9uYWx7LCBzdGFja2xldmVsfX19Ci1Jc3N1ZSBhIHdhcm5pbmcsIG9yIG1heWJlIGlnbm9yZSBpdCBvciByYWlzZSBhbiBleGNlcHRpb24uICBUaGUKLVx2YXJ7Y2F0ZWdvcnl9IGFyZ3VtZW50LCBpZiBnaXZlbiwgbXVzdCBiZSBhIHdhcm5pbmcgY2F0ZWdvcnkgY2xhc3MKLShzZWUgYWJvdmUpOyBpdCBkZWZhdWx0cyB0byBcZXhjZXB0aW9ue1VzZXJXYXJuaW5nfS4gIEFsdGVybmF0aXZlbHkKLVx2YXJ7bWVzc2FnZX0gY2FuIGJlIGEgXGV4Y2VwdGlvbntXYXJuaW5nfSBpbnN0YW5jZSwgaW4gd2hpY2ggY2FzZQotXHZhcntjYXRlZ29yeX0gd2lsbCBiZSBpZ25vcmVkIGFuZCBcY29kZXttZXNzYWdlLl9fY2xhc3NfX30gd2lsbCBiZSB1c2VkLgotSW4gdGhpcyBjYXNlIHRoZSBtZXNzYWdlIHRleHQgd2lsbCBiZSBcY29kZXtzdHIobWVzc2FnZSl9LiBUaGlzIGZ1bmN0aW9uCi1yYWlzZXMgYW4gZXhjZXB0aW9uIGlmIHRoZSBwYXJ0aWN1bGFyIHdhcm5pbmcgaXNzdWVkIGlzIGNoYW5nZWQKLWludG8gYW4gZXJyb3IgYnkgdGhlIHdhcm5pbmdzIGZpbHRlciBzZWUgYWJvdmUuICBUaGUgXHZhcntzdGFja2xldmVsfQotYXJndW1lbnQgY2FuIGJlIHVzZWQgYnkgd3JhcHBlciBmdW5jdGlvbnMgd3JpdHRlbiBpbiBQeXRob24sIGxpa2UKLXRoaXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWRlZiBkZXByZWNhdGlvbihtZXNzYWdlKToKLSAgICB3YXJuaW5ncy53YXJuKG1lc3NhZ2UsIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhpcyBtYWtlcyB0aGUgd2FybmluZyByZWZlciB0byBcZnVuY3Rpb257ZGVwcmVjYXRpb24oKX0ncyBjYWxsZXIsCi1yYXRoZXIgdGhhbiB0byB0aGUgc291cmNlIG9mIFxmdW5jdGlvbntkZXByZWNhdGlvbigpfSBpdHNlbGYgKHNpbmNlCi10aGUgbGF0dGVyIHdvdWxkIGRlZmVhdCB0aGUgcHVycG9zZSBvZiB0aGUgd2FybmluZyBtZXNzYWdlKS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317d2Fybl9leHBsaWNpdH17bWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLAotIGxpbmVub1xvcHRpb25hbHssIG1vZHVsZVxvcHRpb25hbHssIHJlZ2lzdHJ5XG9wdGlvbmFseywKLSBtb2R1bGVfZ2xvYmFsc319fX0KLVRoaXMgaXMgYSBsb3ctbGV2ZWwgaW50ZXJmYWNlIHRvIHRoZSBmdW5jdGlvbmFsaXR5IG9mCi1cZnVuY3Rpb257d2FybigpfSwgcGFzc2luZyBpbiBleHBsaWNpdGx5IHRoZSBtZXNzYWdlLCBjYXRlZ29yeSwKLWZpbGVuYW1lIGFuZCBsaW5lIG51bWJlciwgYW5kIG9wdGlvbmFsbHkgdGhlIG1vZHVsZSBuYW1lIGFuZCB0aGUKLXJlZ2lzdHJ5ICh3aGljaCBzaG91bGQgYmUgdGhlIFxjb2Rle19fd2FybmluZ3JlZ2lzdHJ5X199IGRpY3Rpb25hcnkgb2YKLXRoZSBtb2R1bGUpLiAgVGhlIG1vZHVsZSBuYW1lIGRlZmF1bHRzIHRvIHRoZSBmaWxlbmFtZSB3aXRoIFxjb2Rley5weX0KLXN0cmlwcGVkOyBpZiBubyByZWdpc3RyeSBpcyBwYXNzZWQsIHRoZSB3YXJuaW5nIGlzIG5ldmVyIHN1cHByZXNzZWQuCi1cdmFye21lc3NhZ2V9IG11c3QgYmUgYSBzdHJpbmcgYW5kIFx2YXJ7Y2F0ZWdvcnl9IGEgc3ViY2xhc3Mgb2YKLVxleGNlcHRpb257V2FybmluZ30gb3IgXHZhcnttZXNzYWdlfSBtYXkgYmUgYSBcZXhjZXB0aW9ue1dhcm5pbmd9IGluc3RhbmNlLAotaW4gd2hpY2ggY2FzZSBcdmFye2NhdGVnb3J5fSB3aWxsIGJlIGlnbm9yZWQuCi0KLVx2YXJ7bW9kdWxlX2dsb2JhbHN9LCBpZiBzdXBwbGllZCwgc2hvdWxkIGJlIHRoZSBnbG9iYWwgbmFtZXNwYWNlIGluIHVzZQotYnkgdGhlIGNvZGUgZm9yIHdoaWNoIHRoZSB3YXJuaW5nIGlzIGlzc3VlZC4gIChUaGlzIGFyZ3VtZW50IGlzIHVzZWQgdG8KLXN1cHBvcnQgZGlzcGxheWluZyBzb3VyY2UgZm9yIG1vZHVsZXMgZm91bmQgaW4gemlwZmlsZXMgb3Igb3RoZXIKLW5vbi1maWxlc3lzdGVtIGltcG9ydCBzb3VyY2VzLCBhbmQgd2FzIGFkZGVkIGluIFB5dGhvbiAyLjUuKQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzaG93d2FybmluZ317bWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLAotCQkJICAgICBsaW5lbm9cb3B0aW9uYWx7LCBmaWxlfX0KLVdyaXRlIGEgd2FybmluZyB0byBhIGZpbGUuICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjYWxscwotXGNvZGV7Zm9ybWF0d2FybmluZyhcdmFye21lc3NhZ2V9LCBcdmFye2NhdGVnb3J5fSwgXHZhcntmaWxlbmFtZX0sCi1cdmFye2xpbmVub30pfSBhbmQgd3JpdGVzIHRoZSByZXN1bHRpbmcgc3RyaW5nIHRvIFx2YXJ7ZmlsZX0sIHdoaWNoCi1kZWZhdWx0cyB0byBcY29kZXtzeXMuc3RkZXJyfS4gIFlvdSBtYXkgcmVwbGFjZSB0aGlzIGZ1bmN0aW9uIHdpdGggYW4KLWFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9uIGJ5IGFzc2lnbmluZyB0bwotXGNvZGV7d2FybmluZ3Muc2hvd3dhcm5pbmd9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtmb3JtYXR3YXJuaW5nfXttZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVub30KLUZvcm1hdCBhIHdhcm5pbmcgdGhlIHN0YW5kYXJkIHdheS4gIFRoaXMgcmV0dXJucyBhIHN0cmluZyAgd2hpY2ggbWF5Ci1jb250YWluIGVtYmVkZGVkIG5ld2xpbmVzIGFuZCBlbmRzIGluIGEgbmV3bGluZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZmlsdGVyd2FybmluZ3N9e2FjdGlvblxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgIG1lc3NhZ2Vcb3B0aW9uYWx7LCBjYXRlZ29yeVxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgIG1vZHVsZVxvcHRpb25hbHssIGxpbmVub1xvcHRpb25hbHssIGFwcGVuZH19fX19fQotSW5zZXJ0IGFuIGVudHJ5IGludG8gdGhlIGxpc3Qgb2Ygd2FybmluZ3MgZmlsdGVycy4gIFRoZSBlbnRyeSBpcwotaW5zZXJ0ZWQgYXQgdGhlIGZyb250IGJ5IGRlZmF1bHQ7IGlmIFx2YXJ7YXBwZW5kfSBpcyB0cnVlLCBpdCBpcwotaW5zZXJ0ZWQgYXQgdGhlIGVuZC4KLVRoaXMgY2hlY2tzIHRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzLCBjb21waWxlcyB0aGUgbWVzc2FnZSBhbmQKLW1vZHVsZSByZWd1bGFyIGV4cHJlc3Npb25zLCBhbmQgaW5zZXJ0cyB0aGVtIGFzIGEgdHVwbGUgaW4gdGhlIAotbGlzdCBvZiB3YXJuaW5ncyBmaWx0ZXJzLiAgRW50cmllcyBjbG9zZXIgdG8gdGhlIGZyb250IG9mIHRoZSBsaXN0Ci1vdmVycmlkZSBlbnRyaWVzIGxhdGVyIGluIHRoZSBsaXN0LCBpZiBib3RoIG1hdGNoIGEgcGFydGljdWxhcgotd2FybmluZy4gIE9taXR0ZWQgYXJndW1lbnRzIGRlZmF1bHQgdG8gYSB2YWx1ZSB0aGF0IG1hdGNoZXMKLWV2ZXJ5dGhpbmcuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NpbXBsZWZpbHRlcn17YWN0aW9uXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgY2F0ZWdvcnlcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICBsaW5lbm9cb3B0aW9uYWx7LCBhcHBlbmR9fX19Ci1JbnNlcnQgYSBzaW1wbGUgZW50cnkgaW50byB0aGUgbGlzdCBvZiB3YXJuaW5ncyBmaWx0ZXJzLiBUaGUgbWVhbmluZwotb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgYXMgZm9yIFxmdW5jdGlvbntmaWx0ZXJ3YXJuaW5ncygpfSwgYnV0Ci1yZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBub3QgbmVlZGVkIGFzIHRoZSBmaWx0ZXIgaW5zZXJ0ZWQgYWx3YXlzCi1tYXRjaGVzIGFueSBtZXNzYWdlIGluIGFueSBtb2R1bGUgYXMgbG9uZyBhcyB0aGUgY2F0ZWdvcnkgYW5kIGxpbmUKLW51bWJlciBtYXRjaC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cmVzZXR3YXJuaW5nc317fQotUmVzZXQgdGhlIHdhcm5pbmdzIGZpbHRlci4gIFRoaXMgZGlzY2FyZHMgdGhlIGVmZmVjdCBvZiBhbGwgcHJldmlvdXMKLWNhbGxzIHRvIFxmdW5jdGlvbntmaWx0ZXJ3YXJuaW5ncygpfSwgaW5jbHVkaW5nIHRoYXQgb2YgdGhlCi1ccHJvZ3JhbW9wdHstV30gY29tbWFuZCBsaW5lIG9wdGlvbnMgYW5kIGNhbGxzIHRvCi1cZnVuY3Rpb257c2ltcGxlZmlsdGVyKCl9LgotXGVuZHtmdW5jZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlid2F2ZS50ZXggYi9Eb2MvbGliL2xpYndhdmUudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzZiYmVkLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlid2F2ZS50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotJSBEb2N1bWVudGF0aW9ucyBzdG9sZW4gYW5kIExhVGVYJ2VkIGZyb20gY29tbWVudHMgaW4gZmlsZS4KLVxzZWN0aW9ue1xtb2R1bGV7d2F2ZX0gLS0tCi0gICAgICAgICBSZWFkIGFuZCB3cml0ZSBXQVYgZmlsZXN9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXt3YXZlfQotXHNlY3Rpb25hdXRob3J7TW9zaGUgWmFka2F9e21vc2hlekB6YWRrYS5zaXRlLmNvLmlsfQotXG1vZHVsZXN5bm9wc2lze1Byb3ZpZGUgYW4gaW50ZXJmYWNlIHRvIHRoZSBXQVYgc291bmQgZm9ybWF0Ln0KLQotVGhlIFxtb2R1bGV7d2F2ZX0gbW9kdWxlIHByb3ZpZGVzIGEgY29udmVuaWVudCBpbnRlcmZhY2UgdG8gdGhlIFdBViBzb3VuZAotZm9ybWF0LiBJdCBkb2VzIG5vdCBzdXBwb3J0IGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24sIGJ1dCBpdCBkb2VzIHN1cHBvcnQKLW1vbm8vc3RlcmVvLgotCi1UaGUgXG1vZHVsZXt3YXZlfSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIGFuZCBleGNlcHRpb246Ci0KLVxiZWdpbntmdW5jZGVzY317b3Blbn17ZmlsZVxvcHRpb25hbHssIG1vZGV9fQotSWYgXHZhcntmaWxlfSBpcyBhIHN0cmluZywgb3BlbiB0aGUgZmlsZSBieSB0aGF0IG5hbWUsIG90aGVyIHRyZWF0IGl0Ci1hcyBhIHNlZWthYmxlIGZpbGUtbGlrZSBvYmplY3QuIFx2YXJ7bW9kZX0gY2FuIGJlIGFueSBvZgotXGJlZ2lue2Rlc2NyaXB0aW9ufQotICAgICAgICBcaXRlbVtcY29kZXsncid9LCBcY29kZXsncmInfV0gUmVhZCBvbmx5IG1vZGUuCi0gICAgICAgIFxpdGVtW1xjb2Rleyd3J30sIFxjb2Rleyd3Yid9XSBXcml0ZSBvbmx5IG1vZGUuCi1cZW5ke2Rlc2NyaXB0aW9ufQotTm90ZSB0aGF0IGl0IGRvZXMgbm90IGFsbG93IHJlYWQvd3JpdGUgV0FWIGZpbGVzLgotCi1BIFx2YXJ7bW9kZX0gb2YgXGNvZGV7J3InfSBvciBcY29kZXsncmInfSByZXR1cm5zIGEgXGNsYXNze1dhdmVfcmVhZH0KLW9iamVjdCwgd2hpbGUgYSBcdmFye21vZGV9IG9mIFxjb2Rleyd3J30gb3IgXGNvZGV7J3diJ30gcmV0dXJucwotYSBcY2xhc3N7V2F2ZV93cml0ZX0gb2JqZWN0LiAgSWYgXHZhcnttb2RlfSBpcyBvbWl0dGVkIGFuZCBhIGZpbGUtbGlrZSAKLW9iamVjdCBpcyBwYXNzZWQgYXMgXHZhcntmaWxlfSwgXGNvZGV7XHZhcntmaWxlfS5tb2RlfSBpcyB1c2VkIGFzIHRoZQotZGVmYXVsdCB2YWx1ZSBmb3IgXHZhcnttb2RlfSAodGhlIFxjaGFyYWN0ZXJ7Yn0gZmxhZyBpcyBzdGlsbCBhZGRlZCBpZiAKLW5lY2Vzc2FyeSkuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e29wZW5mcH17ZmlsZSwgbW9kZX0KLUEgc3lub255bSBmb3IgXGZ1bmN0aW9ue29wZW4oKX0sIG1haW50YWluZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e0Vycm9yfQotQW4gZXJyb3IgcmFpc2VkIHdoZW4gc29tZXRoaW5nIGlzIGltcG9zc2libGUgYmVjYXVzZSBpdCB2aW9sYXRlcyB0aGUKLVdBViBzcGVjaWZpY2F0aW9uIG9yIGhpdHMgYW4gaW1wbGVtZW50YXRpb24gZGVmaWNpZW5jeS4KLVxlbmR7ZXhjZGVzY30KLQotCi1cc3Vic2VjdGlvbntXYXZlX3JlYWQgT2JqZWN0cyBcbGFiZWx7V2F2ZS1yZWFkLW9iamVjdHN9fQotCi1XYXZlX3JlYWQgb2JqZWN0cywgYXMgcmV0dXJuZWQgYnkgXGZ1bmN0aW9ue29wZW4oKX0sIGhhdmUgdGhlCi1mb2xsb3dpbmcgbWV0aG9kczoKLQotXGJlZ2lue21ldGhvZGRlc2N9W1dhdmVfcmVhZF17Y2xvc2V9e30KLUNsb3NlIHRoZSBzdHJlYW0sIGFuZCBtYWtlIHRoZSBpbnN0YW5jZSB1bnVzYWJsZS4gVGhpcyBpcwotY2FsbGVkIGF1dG9tYXRpY2FsbHkgb24gb2JqZWN0IGNvbGxlY3Rpb24uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtXYXZlX3JlYWRde2dldG5jaGFubmVsc317fQotUmV0dXJucyBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgKFxjb2RlezF9IGZvciBtb25vLCBcY29kZXsyfSBmb3IKLXN0ZXJlbykuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtXYXZlX3JlYWRde2dldHNhbXB3aWR0aH17fQotUmV0dXJucyBzYW1wbGUgd2lkdGggaW4gYnl0ZXMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtXYXZlX3JlYWRde2dldGZyYW1lcmF0ZX17fQotUmV0dXJucyBzYW1wbGluZyBmcmVxdWVuY3kuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtXYXZlX3JlYWRde2dldG5mcmFtZXN9e30KLVJldHVybnMgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1dhdmVfcmVhZF17Z2V0Y29tcHR5cGV9e30KLVJldHVybnMgY29tcHJlc3Npb24gdHlwZSAoXGNvZGV7J05PTkUnfSBpcyB0aGUgb25seSBzdXBwb3J0ZWQgdHlwZSkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtXYXZlX3JlYWRde2dldGNvbXBuYW1lfXt9Ci1IdW1hbi1yZWFkYWJsZSB2ZXJzaW9uIG9mIFxtZXRob2R7Z2V0Y29tcHR5cGUoKX0uCi1Vc3VhbGx5IFxjb2Rleydub3QgY29tcHJlc3NlZCd9IHBhcmFsbGVscyBcY29kZXsnTk9ORSd9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bV2F2ZV9yZWFkXXtnZXRwYXJhbXN9e30KLVJldHVybnMgYSB0dXBsZQotXGNvZGV7KFx2YXJ7bmNoYW5uZWxzfSwgXHZhcntzYW1wd2lkdGh9LCBcdmFye2ZyYW1lcmF0ZX0sCi1cdmFye25mcmFtZXN9LCBcdmFye2NvbXB0eXBlfSwgXHZhcntjb21wbmFtZX0pfSwgZXF1aXZhbGVudCB0byBvdXRwdXQKLW9mIHRoZSBcbWV0aG9ke2dldCooKX0gbWV0aG9kcy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1dhdmVfcmVhZF17cmVhZGZyYW1lc317bn0KLVJlYWRzIGFuZCByZXR1cm5zIGF0IG1vc3QgXHZhcntufSBmcmFtZXMgb2YgYXVkaW8sIGFzIGEgc3RyaW5nIG9mIGJ5dGVzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bV2F2ZV9yZWFkXXtyZXdpbmR9e30KLVJld2luZCB0aGUgZmlsZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGF1ZGlvIHN0cmVhbS4KLVxlbmR7bWV0aG9kZGVzY30KLQotVGhlIGZvbGxvd2luZyB0d28gbWV0aG9kcyBhcmUgZGVmaW5lZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZQotXHJlZm1vZHVsZXthaWZjfSBtb2R1bGUsIGFuZCBkb24ndCBkbyBhbnl0aGluZyBpbnRlcmVzdGluZy4KLQotXGJlZ2lue21ldGhvZGRlc2N9W1dhdmVfcmVhZF17Z2V0bWFya2Vyc317fQotUmV0dXJucyBcY29kZXtOb25lfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1dhdmVfcmVhZF17Z2V0bWFya317aWR9Ci1SYWlzZSBhbiBlcnJvci4KLVxlbmR7bWV0aG9kZGVzY30KLQotVGhlIGZvbGxvd2luZyB0d28gbWV0aG9kcyBkZWZpbmUgYSB0ZXJtIGBgcG9zaXRpb24nJyB3aGljaCBpcyBjb21wYXRpYmxlCi1iZXR3ZWVuIHRoZW0sIGFuZCBpcyBvdGhlcndpc2UgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50LgotCi1cYmVnaW57bWV0aG9kZGVzY31bV2F2ZV9yZWFkXXtzZXRwb3N9e3Bvc30KLVNldCB0aGUgZmlsZSBwb2ludGVyIHRvIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtXYXZlX3JlYWRde3RlbGx9e30KLVJldHVybiBjdXJyZW50IGZpbGUgcG9pbnRlciBwb3NpdGlvbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cc3Vic2VjdGlvbntXYXZlX3dyaXRlIE9iamVjdHMgXGxhYmVse1dhdmUtd3JpdGUtb2JqZWN0c319Ci0KLVdhdmVfd3JpdGUgb2JqZWN0cywgYXMgcmV0dXJuZWQgYnkgXGZ1bmN0aW9ue29wZW4oKX0sIGhhdmUgdGhlCi1mb2xsb3dpbmcgbWV0aG9kczoKLQotXGJlZ2lue21ldGhvZGRlc2N9W1dhdmVfd3JpdGVde2Nsb3NlfXt9Ci1NYWtlIHN1cmUgXHZhcntuZnJhbWVzfSBpcyBjb3JyZWN0LCBhbmQgY2xvc2UgdGhlIGZpbGUuCi1UaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBkZWxldGlvbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1dhdmVfd3JpdGVde3NldG5jaGFubmVsc317bn0KLVNldCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bV2F2ZV93cml0ZV17c2V0c2FtcHdpZHRofXtufQotU2V0IHRoZSBzYW1wbGUgd2lkdGggdG8gXHZhcntufSBieXRlcy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1dhdmVfd3JpdGVde3NldGZyYW1lcmF0ZX17bn0KLVNldCB0aGUgZnJhbWUgcmF0ZSB0byBcdmFye259LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bV2F2ZV93cml0ZV17c2V0bmZyYW1lc317bn0KLVNldCB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0byBcdmFye259LiBUaGlzIHdpbGwgYmUgY2hhbmdlZCBsYXRlciBpZgotbW9yZSBmcmFtZXMgYXJlIHdyaXR0ZW4uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtXYXZlX3dyaXRlXXtzZXRjb21wdHlwZX17dHlwZSwgbmFtZX0KLVNldCB0aGUgY29tcHJlc3Npb24gdHlwZSBhbmQgZGVzY3JpcHRpb24uCi1BdCB0aGUgbW9tZW50LCBvbmx5IGNvbXByZXNzaW9uIHR5cGUgXHNhbXB7Tk9ORX0gaXMgc3VwcG9ydGVkLAotbWVhbmluZyBubyBjb21wcmVzc2lvbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1dhdmVfd3JpdGVde3NldHBhcmFtc317dHVwbGV9Ci1UaGUgXHZhcnt0dXBsZX0gc2hvdWxkIGJlIFxjb2RleyhcdmFye25jaGFubmVsc30sIFx2YXJ7c2FtcHdpZHRofSwKLVx2YXJ7ZnJhbWVyYXRlfSwgXHZhcntuZnJhbWVzfSwgXHZhcntjb21wdHlwZX0sIFx2YXJ7Y29tcG5hbWV9KX0sIHdpdGgKLXZhbHVlcyB2YWxpZCBmb3IgdGhlIFxtZXRob2R7c2V0KigpfSBtZXRob2RzLiAgU2V0cyBhbGwgcGFyYW1ldGVycy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1dhdmVfd3JpdGVde3RlbGx9e30KLVJldHVybiBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBmaWxlLCB3aXRoIHRoZSBzYW1lIGRpc2NsYWltZXIgZm9yCi10aGUgXG1ldGhvZHtXYXZlX3JlYWQudGVsbCgpfSBhbmQgXG1ldGhvZHtXYXZlX3JlYWQuc2V0cG9zKCl9Ci1tZXRob2RzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bV2F2ZV93cml0ZV17d3JpdGVmcmFtZXNyYXd9e2RhdGF9Ci1Xcml0ZSBhdWRpbyBmcmFtZXMsIHdpdGhvdXQgY29ycmVjdGluZyBcdmFye25mcmFtZXN9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bV2F2ZV93cml0ZV17d3JpdGVmcmFtZXN9e2RhdGF9Ci1Xcml0ZSBhdWRpbyBmcmFtZXMgYW5kIG1ha2Ugc3VyZSBcdmFye25mcmFtZXN9IGlzIGNvcnJlY3QuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLU5vdGUgdGhhdCBpdCBpcyBpbnZhbGlkIHRvIHNldCBhbnkgcGFyYW1ldGVycyBhZnRlciBjYWxsaW5nCi1cbWV0aG9ke3dyaXRlZnJhbWVzKCl9IG9yIFxtZXRob2R7d3JpdGVmcmFtZXNyYXcoKX0sIGFuZCBhbnkgYXR0ZW1wdAotdG8gZG8gc28gd2lsbCByYWlzZSBcZXhjZXB0aW9ue3dhdmUuRXJyb3J9LgpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ3ZWFrcmVmLnRleCBiL0RvYy9saWIvbGlid2Vha3JlZi50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNjc2YTIuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJ3ZWFrcmVmLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDMzNiArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3dlYWtyZWZ9IC0tLQotICAgICAgICAgV2VhayByZWZlcmVuY2VzfQotCi1cZGVjbGFyZW1vZHVsZXtleHRlbnNpb259e3dlYWtyZWZ9Ci1cbW9kdWxlc3lub3BzaXN7U3VwcG9ydCBmb3Igd2VhayByZWZlcmVuY2VzIGFuZCB3ZWFrIGRpY3Rpb25hcmllcy59Ci1cbW9kdWxlYXV0aG9ye0ZyZWQgTC4gRHJha2UsIEpyLn17ZmRyYWtlQGFjbS5vcmd9Ci1cbW9kdWxlYXV0aG9ye05laWwgU2NoZW1lbmF1ZXJ9e25hc0BhcmN0cml4LmNvbX0KLVxtb2R1bGVhdXRob3J7TWFydGluIHZvbiBMXCJvd2lzfXttYXJ0aW5AbG9ld2lzLmhvbWUuY3MudHUtYmVybGluLmRlfQotXHNlY3Rpb25hdXRob3J7RnJlZCBMLiBEcmFrZSwgSnIufXtmZHJha2VAYWNtLm9yZ30KLQotXHZlcnNpb25hZGRlZHsyLjF9Ci0KLSUgV2hlbiBtYWtpbmcgY2hhbmdlcyB0byB0aGUgZXhhbXBsZXMgaW4gdGhpcyBmaWxlLCBiZSBzdXJlIHRvIHVwZGF0ZQotJSBMaWIvdGVzdC90ZXN0X3dlYWtyZWYucHk6OmxpYnJlZnRlc3QgdG9vIQotCi1UaGUgXG1vZHVsZXt3ZWFrcmVmfSBtb2R1bGUgYWxsb3dzIHRoZSBQeXRob24gcHJvZ3JhbW1lciB0byBjcmVhdGUKLVxkZm57d2VhayByZWZlcmVuY2VzfSB0byBvYmplY3RzLgotCi1JbiB0aGUgZm9sbG93aW5nLCB0aGUgdGVybSBcZGZue3JlZmVyZW50fSBtZWFucyB0aGUKLW9iamVjdCB3aGljaCBpcyByZWZlcnJlZCB0byBieSBhIHdlYWsgcmVmZXJlbmNlLgotCi1BIHdlYWsgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCBpcyBub3QgZW5vdWdoIHRvIGtlZXAgdGhlIG9iamVjdCBhbGl2ZToKLXdoZW4gdGhlIG9ubHkgcmVtYWluaW5nIHJlZmVyZW5jZXMgdG8gYSByZWZlcmVudCBhcmUgd2VhayByZWZlcmVuY2VzLAotZ2FyYmFnZSBjb2xsZWN0aW9uIGlzIGZyZWUgdG8gZGVzdHJveSB0aGUgcmVmZXJlbnQgYW5kIHJldXNlIGl0cyBtZW1vcnkKLWZvciBzb21ldGhpbmcgZWxzZS4gIEEgcHJpbWFyeSB1c2UgZm9yIHdlYWsgcmVmZXJlbmNlcyBpcyB0byBpbXBsZW1lbnQKLWNhY2hlcyBvciBtYXBwaW5ncyBob2xkaW5nIGxhcmdlIG9iamVjdHMsIHdoZXJlIGl0J3MgZGVzaXJlZCB0aGF0IGEKLWxhcmdlIG9iamVjdCBub3QgYmUga2VwdCBhbGl2ZSBzb2xlbHkgYmVjYXVzZSBpdCBhcHBlYXJzIGluIGEgY2FjaGUgb3IKLW1hcHBpbmcuICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBudW1iZXIgb2YgbGFyZ2UgYmluYXJ5IGltYWdlIG9iamVjdHMsCi15b3UgbWF5IHdpc2ggdG8gYXNzb2NpYXRlIGEgbmFtZSB3aXRoIGVhY2guICBJZiB5b3UgdXNlZCBhIFB5dGhvbgotZGljdGlvbmFyeSB0byBtYXAgbmFtZXMgdG8gaW1hZ2VzLCBvciBpbWFnZXMgdG8gbmFtZXMsIHRoZSBpbWFnZSBvYmplY3RzCi13b3VsZCByZW1haW4gYWxpdmUganVzdCBiZWNhdXNlIHRoZXkgYXBwZWFyZWQgYXMgdmFsdWVzIG9yIGtleXMgaW4gdGhlCi1kaWN0aW9uYXJpZXMuICBUaGUgXGNsYXNze1dlYWtLZXlEaWN0aW9uYXJ5fSBhbmQKLVxjbGFzc3tXZWFrVmFsdWVEaWN0aW9uYXJ5fSBjbGFzc2VzIHN1cHBsaWVkIGJ5IHRoZSBcbW9kdWxle3dlYWtyZWZ9Ci1tb2R1bGUgYXJlIGFuIGFsdGVybmF0aXZlLCB1c2luZyB3ZWFrIHJlZmVyZW5jZXMgdG8gY29uc3RydWN0IG1hcHBpbmdzCi10aGF0IGRvbid0IGtlZXAgb2JqZWN0cyBhbGl2ZSBzb2xlbHkgYmVjYXVzZSB0aGV5IGFwcGVhciBpbiB0aGUgbWFwcGluZwotb2JqZWN0cy4gIElmLCBmb3IgZXhhbXBsZSwgYW4gaW1hZ2Ugb2JqZWN0IGlzIGEgdmFsdWUgaW4gYQotXGNsYXNze1dlYWtWYWx1ZURpY3Rpb25hcnl9LCB0aGVuIHdoZW4gdGhlIGxhc3QgcmVtYWluaW5nCi1yZWZlcmVuY2VzIHRvIHRoYXQgaW1hZ2Ugb2JqZWN0IGFyZSB0aGUgd2VhayByZWZlcmVuY2VzIGhlbGQgYnkgd2VhawotbWFwcGluZ3MsIGdhcmJhZ2UgY29sbGVjdGlvbiBjYW4gcmVjbGFpbSB0aGUgb2JqZWN0LCBhbmQgaXRzIGNvcnJlc3BvbmRpbmcKLWVudHJpZXMgaW4gd2VhayBtYXBwaW5ncyBhcmUgc2ltcGx5IGRlbGV0ZWQuCi0KLVxjbGFzc3tXZWFrS2V5RGljdGlvbmFyeX0gYW5kIFxjbGFzc3tXZWFrVmFsdWVEaWN0aW9uYXJ5fSB1c2Ugd2VhawotcmVmZXJlbmNlcyBpbiB0aGVpciBpbXBsZW1lbnRhdGlvbiwgc2V0dGluZyB1cCBjYWxsYmFjayBmdW5jdGlvbnMgb24KLXRoZSB3ZWFrIHJlZmVyZW5jZXMgdGhhdCBub3RpZnkgdGhlIHdlYWsgZGljdGlvbmFyaWVzIHdoZW4gYSBrZXkgb3IgdmFsdWUKLWhhcyBiZWVuIHJlY2xhaW1lZCBieSBnYXJiYWdlIGNvbGxlY3Rpb24uICBNb3N0IHByb2dyYW1zIHNob3VsZCBmaW5kIHRoYXQKLXVzaW5nIG9uZSBvZiB0aGVzZSB3ZWFrIGRpY3Rpb25hcnkgdHlwZXMgaXMgYWxsIHRoZXkgbmVlZCAtLSBpdCdzCi1ub3QgdXN1YWxseSBuZWNlc3NhcnkgdG8gY3JlYXRlIHlvdXIgb3duIHdlYWsgcmVmZXJlbmNlcyBkaXJlY3RseS4gIFRoZQotbG93LWxldmVsIG1hY2hpbmVyeSB1c2VkIGJ5IHRoZSB3ZWFrIGRpY3Rpb25hcnkgaW1wbGVtZW50YXRpb25zIGlzIGV4cG9zZWQKLWJ5IHRoZSBcbW9kdWxle3dlYWtyZWZ9IG1vZHVsZSBmb3IgdGhlIGJlbmVmaXQgb2YgYWR2YW5jZWQgdXNlcy4KLQotTm90IGFsbCBvYmplY3RzIGNhbiBiZSB3ZWFrbHkgcmVmZXJlbmNlZDsgdGhvc2Ugb2JqZWN0cyB3aGljaCBjYW4KLWluY2x1ZGUgY2xhc3MgaW5zdGFuY2VzLCBmdW5jdGlvbnMgd3JpdHRlbiBpbiBQeXRob24gKGJ1dCBub3QgaW4gQyksCi1tZXRob2RzIChib3RoIGJvdW5kIGFuZCB1bmJvdW5kKSwgc2V0cywgZnJvemVuc2V0cywgZmlsZSBvYmplY3RzLAotZ2VuZXJhdG9ycywgdHlwZSBvYmplY3RzLCBEQmN1cnNvciBvYmplY3RzIGZyb20gdGhlIFxtb2R1bGV7YnNkZGJ9IG1vZHVsZSwKLXNvY2tldHMsIGFycmF5cywgZGVxdWVzLCBhbmQgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gb2JqZWN0cy4KLVx2ZXJzaW9uY2hhbmdlZFtBZGRlZCBzdXBwb3J0IGZvciBmaWxlcywgc29ja2V0cywgYXJyYXlzLCBhbmQgcGF0dGVybnNdezIuNH0KLQotU2V2ZXJhbCBidWlsdGluIHR5cGVzIHN1Y2ggYXMgXGNsYXNze2xpc3R9IGFuZCBcY2xhc3N7ZGljdH0gZG8gbm90Ci1kaXJlY3RseSBzdXBwb3J0IHdlYWsgcmVmZXJlbmNlcyBidXQgY2FuIGFkZCBzdXBwb3J0IHRocm91Z2ggc3ViY2xhc3Npbmc6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWNsYXNzIERpY3QoZGljdCk6Ci0gICAgcGFzcwotCi1vYmogPSBEaWN0KHJlZD0xLCBncmVlbj0yLCBibHVlPTMpICAgIyB0aGlzIG9iamVjdCBpcyB3ZWFrIHJlZmVyZW5jYWJsZQotXGVuZHt2ZXJiYXRpbX0KLQotRXh0ZW5zaW9uIHR5cGVzIGNhbiBlYXNpbHkgYmUgbWFkZSB0byBzdXBwb3J0IHdlYWsgcmVmZXJlbmNlczsgc2VlCi1gYFx1bGlua3tXZWFrIFJlZmVyZW5jZSBTdXBwb3J0fXsuLi9leHQvd2Vha3JlZi1zdXBwb3J0Lmh0bWx9JycgaW4KLVxjaXRldGl0bGVbLi4vZXh0L2V4dC5odG1sXXtFeHRlbmRpbmcgYW5kIEVtYmVkZGluZyB0aGUgUHl0aG9uCi1JbnRlcnByZXRlcn0uCi0lIFRoZSByZWZlcmVuY2VkIHNlY3Rpb24gdXNlZCB0byBhcHBlYXIgaW4gdGhpcyBkb2N1bWVudCB3aXRoIHRoZQotJSBcbGFiZWwgd2Vha3JlZi1leHRlbnNpb24uICBJdCB3b3VsZCBiZSBnb29kIHRvIGJlIGFibGUgdG8gZ2VuZXJhdGUgYQotJSByZWRpcmVjdCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgSFRNTCBwYWdlICh3ZWFrcmVmLWV4dGVuc2lvbi5odG1sKQotJSBmb3Igb24tbGluZSB2ZXJzaW9ucyBvZiB0aGlzIGRvY3VtZW50LgotCi1cYmVnaW57Y2xhc3NkZXNjfXtyZWZ9e29iamVjdFxvcHRpb25hbHssIGNhbGxiYWNrfX0KLSAgUmV0dXJuIGEgd2VhayByZWZlcmVuY2UgdG8gXHZhcntvYmplY3R9LiAgVGhlIG9yaWdpbmFsIG9iamVjdCBjYW4gYmUKLSAgcmV0cmlldmVkIGJ5IGNhbGxpbmcgdGhlIHJlZmVyZW5jZSBvYmplY3QgaWYgdGhlIHJlZmVyZW50IGlzIHN0aWxsCi0gIGFsaXZlOyBpZiB0aGUgcmVmZXJlbnQgaXMgbm8gbG9uZ2VyIGFsaXZlLCBjYWxsaW5nIHRoZSByZWZlcmVuY2UKLSAgb2JqZWN0IHdpbGwgY2F1c2UgXGNvbnN0YW50e05vbmV9IHRvIGJlIHJldHVybmVkLiAgSWYgXHZhcntjYWxsYmFja30gaXMKLSAgcHJvdmlkZWQgYW5kIG5vdCBcY29uc3RhbnR7Tm9uZX0sIGFuZCB0aGUgcmV0dXJuZWQgd2Vha3JlZiBvYmplY3QgaXMKLSAgc3RpbGwgYWxpdmUsIHRoZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBvYmplY3QgaXMgYWJvdXQgdG8gYmUKLSAgZmluYWxpemVkOyB0aGUgd2VhayByZWZlcmVuY2Ugb2JqZWN0IHdpbGwgYmUgcGFzc2VkIGFzIHRoZSBvbmx5Ci0gIHBhcmFtZXRlciB0byB0aGUgY2FsbGJhY2s7IHRoZSByZWZlcmVudCB3aWxsIG5vIGxvbmdlciBiZSBhdmFpbGFibGUuCi0KLSAgSXQgaXMgYWxsb3dhYmxlIGZvciBtYW55IHdlYWsgcmVmZXJlbmNlcyB0byBiZSBjb25zdHJ1Y3RlZCBmb3IgdGhlCi0gIHNhbWUgb2JqZWN0LiAgQ2FsbGJhY2tzIHJlZ2lzdGVyZWQgZm9yIGVhY2ggd2VhayByZWZlcmVuY2Ugd2lsbCBiZQotICBjYWxsZWQgZnJvbSB0aGUgbW9zdCByZWNlbnRseSByZWdpc3RlcmVkIGNhbGxiYWNrIHRvIHRoZSBvbGRlc3QKLSAgcmVnaXN0ZXJlZCBjYWxsYmFjay4KLQotICBFeGNlcHRpb25zIHJhaXNlZCBieSB0aGUgY2FsbGJhY2sgd2lsbCBiZSBub3RlZCBvbiB0aGUgc3RhbmRhcmQKLSAgZXJyb3Igb3V0cHV0LCBidXQgY2Fubm90IGJlIHByb3BhZ2F0ZWQ7IHRoZXkgYXJlIGhhbmRsZWQgaW4gZXhhY3RseQotICB0aGUgc2FtZSB3YXkgYXMgZXhjZXB0aW9ucyByYWlzZWQgZnJvbSBhbiBvYmplY3QncwotICBcbWV0aG9ke19fZGVsX18oKX0gbWV0aG9kLgotCi0gIFdlYWsgcmVmZXJlbmNlcyBhcmUgaGFzaGFibGUgaWYgdGhlIFx2YXJ7b2JqZWN0fSBpcyBoYXNoYWJsZS4gIFRoZXkKLSAgd2lsbCBtYWludGFpbiB0aGVpciBoYXNoIHZhbHVlIGV2ZW4gYWZ0ZXIgdGhlIFx2YXJ7b2JqZWN0fSB3YXMKLSAgZGVsZXRlZC4gIElmIFxmdW5jdGlvbntoYXNoKCl9IGlzIGNhbGxlZCB0aGUgZmlyc3QgdGltZSBvbmx5IGFmdGVyCi0gIHRoZSBcdmFye29iamVjdH0gd2FzIGRlbGV0ZWQsIHRoZSBjYWxsIHdpbGwgcmFpc2UKLSAgXGV4Y2VwdGlvbntUeXBlRXJyb3J9LgotCi0gIFdlYWsgcmVmZXJlbmNlcyBzdXBwb3J0IHRlc3RzIGZvciBlcXVhbGl0eSwgYnV0IG5vdCBvcmRlcmluZy4gIElmCi0gIHRoZSByZWZlcmVudHMgYXJlIHN0aWxsIGFsaXZlLCB0d28gcmVmZXJlbmNlcyBoYXZlIHRoZSBzYW1lCi0gIGVxdWFsaXR5IHJlbGF0aW9uc2hpcCBhcyB0aGVpciByZWZlcmVudHMgKHJlZ2FyZGxlc3Mgb2YgdGhlCi0gIFx2YXJ7Y2FsbGJhY2t9KS4gIElmIGVpdGhlciByZWZlcmVudCBoYXMgYmVlbiBkZWxldGVkLCB0aGUKLSAgcmVmZXJlbmNlcyBhcmUgZXF1YWwgb25seSBpZiB0aGUgcmVmZXJlbmNlIG9iamVjdHMgYXJlIHRoZSBzYW1lCi0gIG9iamVjdC4KLQotICBcdmVyc2lvbmNoYW5nZWRbVGhpcyBpcyBub3cgYSBzdWJjbGFzc2FibGUgdHlwZSByYXRoZXIgdGhhbiBhCi0gICAgICAgICAgICAgICAgICBmYWN0b3J5IGZ1bmN0aW9uOyBpdCBkZXJpdmVzIGZyb20gXGNsYXNze29iamVjdH1dCi0gICAgICAgICAgICAgICAgICB7Mi40fQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cHJveHl9e29iamVjdFxvcHRpb25hbHssIGNhbGxiYWNrfX0KLSAgUmV0dXJuIGEgcHJveHkgdG8gXHZhcntvYmplY3R9IHdoaWNoIHVzZXMgYSB3ZWFrIHJlZmVyZW5jZS4gIFRoaXMKLSAgc3VwcG9ydHMgdXNlIG9mIHRoZSBwcm94eSBpbiBtb3N0IGNvbnRleHRzIGluc3RlYWQgb2YgcmVxdWlyaW5nIHRoZQotICBleHBsaWNpdCBkZXJlZmVyZW5jaW5nIHVzZWQgd2l0aCB3ZWFrIHJlZmVyZW5jZSBvYmplY3RzLiAgVGhlCi0gIHJldHVybmVkIG9iamVjdCB3aWxsIGhhdmUgYSB0eXBlIG9mIGVpdGhlciBcY29kZXtQcm94eVR5cGV9IG9yCi0gIFxjb2Rle0NhbGxhYmxlUHJveHlUeXBlfSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgXHZhcntvYmplY3R9IGlzCi0gIGNhbGxhYmxlLiAgUHJveHkgb2JqZWN0cyBhcmUgbm90IGhhc2hhYmxlIHJlZ2FyZGxlc3Mgb2YgdGhlCi0gIHJlZmVyZW50OyB0aGlzIGF2b2lkcyBhIG51bWJlciBvZiBwcm9ibGVtcyByZWxhdGVkIHRvIHRoZWlyCi0gIGZ1bmRhbWVudGFsbHkgbXV0YWJsZSBuYXR1cmUsIGFuZCBwcmV2ZW50IHRoZWlyIHVzZSBhcyBkaWN0aW9uYXJ5Ci0gIGtleXMuICBcdmFye2NhbGxiYWNrfSBpcyB0aGUgc2FtZSBhcyB0aGUgcGFyYW1ldGVyIG9mIHRoZSBzYW1lIG5hbWUKLSAgdG8gdGhlIFxmdW5jdGlvbntyZWYoKX0gZnVuY3Rpb24uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldHdlYWtyZWZjb3VudH17b2JqZWN0fQotICBSZXR1cm4gdGhlIG51bWJlciBvZiB3ZWFrIHJlZmVyZW5jZXMgYW5kIHByb3hpZXMgd2hpY2ggcmVmZXIgdG8KLSAgXHZhcntvYmplY3R9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXR3ZWFrcmVmc317b2JqZWN0fQotICBSZXR1cm4gYSBsaXN0IG9mIGFsbCB3ZWFrIHJlZmVyZW5jZSBhbmQgcHJveHkgb2JqZWN0cyB3aGljaCByZWZlciB0bwotICBcdmFye29iamVjdH0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtXZWFrS2V5RGljdGlvbmFyeX17XG9wdGlvbmFse2RpY3R9fQotICBNYXBwaW5nIGNsYXNzIHRoYXQgcmVmZXJlbmNlcyBrZXlzIHdlYWtseS4gIEVudHJpZXMgaW4gdGhlCi0gIGRpY3Rpb25hcnkgd2lsbCBiZSBkaXNjYXJkZWQgd2hlbiB0aGVyZSBpcyBubyBsb25nZXIgYSBzdHJvbmcKLSAgcmVmZXJlbmNlIHRvIHRoZSBrZXkuICBUaGlzIGNhbiBiZSB1c2VkIHRvIGFzc29jaWF0ZSBhZGRpdGlvbmFsIGRhdGEKLSAgd2l0aCBhbiBvYmplY3Qgb3duZWQgYnkgb3RoZXIgcGFydHMgb2YgYW4gYXBwbGljYXRpb24gd2l0aG91dCBhZGRpbmcKLSAgYXR0cmlidXRlcyB0byB0aG9zZSBvYmplY3RzLiAgVGhpcyBjYW4gYmUgZXNwZWNpYWxseSB1c2VmdWwgd2l0aAotICBvYmplY3RzIHRoYXQgb3ZlcnJpZGUgYXR0cmlidXRlIGFjY2Vzc2VzLgotCi0gIFxub3Rle0NhdXRpb246ICBCZWNhdXNlIGEgXGNsYXNze1dlYWtLZXlEaWN0aW9uYXJ5fSBpcyBidWlsdCBvbiB0b3AKLSAgICAgICAgb2YgYSBQeXRob24gZGljdGlvbmFyeSwgaXQgbXVzdCBub3QgY2hhbmdlIHNpemUgd2hlbiBpdGVyYXRpbmcKLSAgICAgICAgb3ZlciBpdC4gIFRoaXMgY2FuIGJlIGRpZmZpY3VsdCB0byBlbnN1cmUgZm9yIGEKLSAgICAgICAgXGNsYXNze1dlYWtLZXlEaWN0aW9uYXJ5fSBiZWNhdXNlIGFjdGlvbnMgcGVyZm9ybWVkIGJ5IHRoZQotICAgICAgICBwcm9ncmFtIGR1cmluZyBpdGVyYXRpb24gbWF5IGNhdXNlIGl0ZW1zIGluIHRoZSBkaWN0aW9uYXJ5Ci0gICAgICAgIHRvIHZhbmlzaCAiYnkgbWFnaWMiIChhcyBhIHNpZGUgZWZmZWN0IG9mIGdhcmJhZ2UgY29sbGVjdGlvbikufQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxjbGFzc3tXZWFrS2V5RGljdGlvbmFyeX0gb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbAotbWV0aG9kcy4gIFRoZXNlIGV4cG9zZSB0aGUgaW50ZXJuYWwgcmVmZXJlbmNlcyBkaXJlY3RseS4gIFRoZQotcmVmZXJlbmNlcyBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUgYGBsaXZlJycgYXQgdGhlIHRpbWUgdGhleSBhcmUKLXVzZWQsIHNvIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgcmVmZXJlbmNlcyBuZWVkcyB0byBiZSBjaGVja2VkCi1iZWZvcmUgYmVpbmcgdXNlZC4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXZvaWQgY3JlYXRpbmcgcmVmZXJlbmNlcyB0aGF0Ci13aWxsIGNhdXNlIHRoZSBnYXJiYWdlIGNvbGxlY3RvciB0byBrZWVwIHRoZSBrZXlzIGFyb3VuZCBsb25nZXIgdGhhbgotbmVlZGVkLgotCi1cYmVnaW57bWV0aG9kZGVzY317aXRlcmtleXJlZnN9e30KLSAgUmV0dXJuIGFuIGl0ZXJhdG9yIHRoYXQgeWllbGRzIHRoZSB3ZWFrIHJlZmVyZW5jZXMgdG8gdGhlIGtleXMuCi0gIFx2ZXJzaW9uYWRkZWR7Mi41fQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317a2V5cmVmc317fQotICBSZXR1cm4gYSBsaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyB0byB0aGUga2V5cy4KLSAgXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1dlYWtWYWx1ZURpY3Rpb25hcnl9e1xvcHRpb25hbHtkaWN0fX0KLSAgTWFwcGluZyBjbGFzcyB0aGF0IHJlZmVyZW5jZXMgdmFsdWVzIHdlYWtseS4gIEVudHJpZXMgaW4gdGhlCi0gIGRpY3Rpb25hcnkgd2lsbCBiZSBkaXNjYXJkZWQgd2hlbiBubyBzdHJvbmcgcmVmZXJlbmNlIHRvIHRoZSB2YWx1ZQotICBleGlzdHMgYW55IG1vcmUuCi0KLSAgXG5vdGV7Q2F1dGlvbjogIEJlY2F1c2UgYSBcY2xhc3N7V2Vha1ZhbHVlRGljdGlvbmFyeX0gaXMgYnVpbHQgb24gdG9wCi0gICAgICAgIG9mIGEgUHl0aG9uIGRpY3Rpb25hcnksIGl0IG11c3Qgbm90IGNoYW5nZSBzaXplIHdoZW4gaXRlcmF0aW5nCi0gICAgICAgIG92ZXIgaXQuICBUaGlzIGNhbiBiZSBkaWZmaWN1bHQgdG8gZW5zdXJlIGZvciBhCi0gICAgICAgIFxjbGFzc3tXZWFrVmFsdWVEaWN0aW9uYXJ5fSBiZWNhdXNlIGFjdGlvbnMgcGVyZm9ybWVkIGJ5IHRoZQotICAgICAgICBwcm9ncmFtIGR1cmluZyBpdGVyYXRpb24gbWF5IGNhdXNlIGl0ZW1zIGluIHRoZSBkaWN0aW9uYXJ5Ci0gICAgICAgIHRvIHZhbmlzaCAiYnkgbWFnaWMiIChhcyBhIHNpZGUgZWZmZWN0IG9mIGdhcmJhZ2UgY29sbGVjdGlvbikufQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxjbGFzc3tXZWFrVmFsdWVEaWN0aW9uYXJ5fSBvYmplY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsCi1tZXRob2RzLiAgVGhlc2UgbWV0aG9kIGhhdmUgdGhlIHNhbWUgaXNzdWVzIGFzIHRoZQotXG1ldGhvZHtpdGVya2V5cmVmcygpfSBhbmQgXG1ldGhvZHtrZXlyZWZzKCl9IG1ldGhvZHMgb2YKLVxjbGFzc3tXZWFrS2V5RGljdGlvbmFyeX0gb2JqZWN0cy4KLQotXGJlZ2lue21ldGhvZGRlc2N9e2l0ZXJ2YWx1ZXJlZnN9e30KLSAgUmV0dXJuIGFuIGl0ZXJhdG9yIHRoYXQgeWllbGRzIHRoZSB3ZWFrIHJlZmVyZW5jZXMgdG8gdGhlIHZhbHVlcy4KLSAgXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXt2YWx1ZXJlZnN9e30KLSAgUmV0dXJuIGEgbGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgdG8gdGhlIHZhbHVlcy4KLSAgXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317UmVmZXJlbmNlVHlwZX0KLSAgVGhlIHR5cGUgb2JqZWN0IGZvciB3ZWFrIHJlZmVyZW5jZXMgb2JqZWN0cy4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317UHJveHlUeXBlfQotICBUaGUgdHlwZSBvYmplY3QgZm9yIHByb3hpZXMgb2Ygb2JqZWN0cyB3aGljaCBhcmUgbm90IGNhbGxhYmxlLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtDYWxsYWJsZVByb3h5VHlwZX0KLSAgVGhlIHR5cGUgb2JqZWN0IGZvciBwcm94aWVzIG9mIGNhbGxhYmxlIG9iamVjdHMuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1Byb3h5VHlwZXN9Ci0gIFNlcXVlbmNlIGNvbnRhaW5pbmcgYWxsIHRoZSB0eXBlIG9iamVjdHMgZm9yIHByb3hpZXMuICBUaGlzIGNhbiBtYWtlCi0gIGl0IHNpbXBsZXIgdG8gdGVzdCBpZiBhbiBvYmplY3QgaXMgYSBwcm94eSB3aXRob3V0IGJlaW5nIGRlcGVuZGVudAotICBvbiBuYW1pbmcgYm90aCBwcm94eSB0eXBlcy4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtSZWZlcmVuY2VFcnJvcn0KLSAgRXhjZXB0aW9uIHJhaXNlZCB3aGVuIGEgcHJveHkgb2JqZWN0IGlzIHVzZWQgYnV0IHRoZSB1bmRlcmx5aW5nCi0gIG9iamVjdCBoYXMgYmVlbiBjb2xsZWN0ZWQuICBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBzdGFuZGFyZAotICBcZXhjZXB0aW9ue1JlZmVyZW5jZUVycm9yfSBleGNlcHRpb24uCi1cZW5ke2V4Y2Rlc2N9Ci0KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWVwZXB7MDIwNX17V2VhayBSZWZlcmVuY2VzfXtUaGUgcHJvcG9zYWwgYW5kIHJhdGlvbmFsZSBmb3IgdGhpcwotICAgICAgICAgICAgICAgIGZlYXR1cmUsIGluY2x1ZGluZyBsaW5rcyB0byBlYXJsaWVyIGltcGxlbWVudGF0aW9ucwotICAgICAgICAgICAgICAgIGFuZCBpbmZvcm1hdGlvbiBhYm91dCBzaW1pbGFyIGZlYXR1cmVzIGluIG90aGVyCi0gICAgICAgICAgICAgICAgbGFuZ3VhZ2VzLn0KLVxlbmR7c2VlYWxzb30KLQotCi1cc3Vic2VjdGlvbntXZWFrIFJlZmVyZW5jZSBPYmplY3RzCi0gICAgICAgICAgICBcbGFiZWx7d2Vha3JlZi1vYmplY3RzfX0KLQotV2VhayByZWZlcmVuY2Ugb2JqZWN0cyBoYXZlIG5vIGF0dHJpYnV0ZXMgb3IgbWV0aG9kcywgYnV0IGRvIGFsbG93IHRoZQotcmVmZXJlbnQgdG8gYmUgb2J0YWluZWQsIGlmIGl0IHN0aWxsIGV4aXN0cywgYnkgY2FsbGluZyBpdDoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGltcG9ydCB3ZWFrcmVmCi0+Pj4gY2xhc3MgT2JqZWN0OgotLi4uICAgICBwYXNzCi0uLi4KLT4+PiBvID0gT2JqZWN0KCkKLT4+PiByID0gd2Vha3JlZi5yZWYobykKLT4+PiBvMiA9IHIoKQotPj4+IG8gaXMgbzIKLVRydWUKLVxlbmR7dmVyYmF0aW19Ci0KLUlmIHRoZSByZWZlcmVudCBubyBsb25nZXIgZXhpc3RzLCBjYWxsaW5nIHRoZSByZWZlcmVuY2Ugb2JqZWN0IHJldHVybnMKLVxjb25zdGFudHtOb25lfToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGRlbCBvLCBvMgotPj4+IHByaW50IHIoKQotTm9uZQotXGVuZHt2ZXJiYXRpbX0KLQotVGVzdGluZyB0aGF0IGEgd2VhayByZWZlcmVuY2Ugb2JqZWN0IGlzIHN0aWxsIGxpdmUgc2hvdWxkIGJlIGRvbmUKLXVzaW5nIHRoZSBleHByZXNzaW9uIFxjb2Rle1x2YXJ7cmVmfSgpIGlzIG5vdCBOb25lfS4gIE5vcm1hbGx5LAotYXBwbGljYXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIHVzZSBhIHJlZmVyZW5jZSBvYmplY3Qgc2hvdWxkIGZvbGxvdwotdGhpcyBwYXR0ZXJuOgotCi1cYmVnaW57dmVyYmF0aW19Ci0jIHIgaXMgYSB3ZWFrIHJlZmVyZW5jZSBvYmplY3QKLW8gPSByKCkKLWlmIG8gaXMgTm9uZToKLSAgICAjIHJlZmVyZW50IGhhcyBiZWVuIGdhcmJhZ2UgY29sbGVjdGVkCi0gICAgcHJpbnQgIk9iamVjdCBoYXMgYmVlbiBkZWFsbG9jYXRlZDsgY2FuJ3QgZnJvYm5pY2F0ZS4iCi1lbHNlOgotICAgIHByaW50ICJPYmplY3QgaXMgc3RpbGwgbGl2ZSEiCi0gICAgby5kb19zb21ldGhpbmdfdXNlZnVsKCkKLVxlbmR7dmVyYmF0aW19Ci0KLVVzaW5nIGEgc2VwYXJhdGUgdGVzdCBmb3IgYGBsaXZlbmVzcycnIGNyZWF0ZXMgcmFjZSBjb25kaXRpb25zIGluCi10aHJlYWRlZCBhcHBsaWNhdGlvbnM7IGFub3RoZXIgdGhyZWFkIGNhbiBjYXVzZSBhIHdlYWsgcmVmZXJlbmNlIHRvCi1iZWNvbWUgaW52YWxpZGF0ZWQgYmVmb3JlIHRoZSB3ZWFrIHJlZmVyZW5jZSBpcyBjYWxsZWQ7IHRoZQotaWRpb20gc2hvd24gYWJvdmUgaXMgc2FmZSBpbiB0aHJlYWRlZCBhcHBsaWNhdGlvbnMgYXMgd2VsbCBhcwotc2luZ2xlLXRocmVhZGVkIGFwcGxpY2F0aW9ucy4KLQotU3BlY2lhbGl6ZWQgdmVyc2lvbnMgb2YgXGNsYXNze3JlZn0gb2JqZWN0cyBjYW4gYmUgY3JlYXRlZCB0aHJvdWdoCi1zdWJjbGFzc2luZy4gIFRoaXMgaXMgdXNlZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlCi1cY2xhc3N7V2Vha1ZhbHVlRGljdGlvbmFyeX0gdG8gcmVkdWNlIHRoZSBtZW1vcnkgb3ZlcmhlYWQgZm9yIGVhY2gKLWVudHJ5IGluIHRoZSBtYXBwaW5nLiAgVGhpcyBtYXkgYmUgbW9zdCB1c2VmdWwgdG8gYXNzb2NpYXRlIGFkZGl0aW9uYWwKLWluZm9ybWF0aW9uIHdpdGggYSByZWZlcmVuY2UsIGJ1dCBjb3VsZCBhbHNvIGJlIHVzZWQgdG8gaW5zZXJ0Ci1hZGRpdGlvbmFsIHByb2Nlc3Npbmcgb24gY2FsbHMgdG8gcmV0cmlldmUgdGhlIHJlZmVyZW50LgotCi1UaGlzIGV4YW1wbGUgc2hvd3MgaG93IGEgc3ViY2xhc3Mgb2YgXGNsYXNze3JlZn0gY2FuIGJlIHVzZWQgdG8gc3RvcmUKLWFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYW4gb2JqZWN0IGFuZCBhZmZlY3QgdGhlIHZhbHVlIHRoYXQncwotcmV0dXJuZWQgd2hlbiB0aGUgcmVmZXJlbnQgaXMgYWNjZXNzZWQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCB3ZWFrcmVmCi0KLWNsYXNzIEV4dGVuZGVkUmVmKHdlYWtyZWYucmVmKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgb2IsIGNhbGxiYWNrPU5vbmUsICoqYW5ub3RhdGlvbnMpOgotICAgICAgICBzdXBlcihFeHRlbmRlZFJlZiwgc2VsZikuX19pbml0X18ob2IsIGNhbGxiYWNrKQotICAgICAgICBzZWxmLl9fY291bnRlciA9IDAKLSAgICAgICAgZm9yIGssIHYgaW4gYW5ub3RhdGlvbnMuaXRlcml0ZW1zKCk6Ci0gICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGssIHYpCi0KLSAgICBkZWYgX19jYWxsX18oc2VsZik6Ci0gICAgICAgICIiIlJldHVybiBhIHBhaXIgY29udGFpbmluZyB0aGUgcmVmZXJlbnQgYW5kIHRoZSBudW1iZXIgb2YKLSAgICAgICAgdGltZXMgdGhlIHJlZmVyZW5jZSBoYXMgYmVlbiBjYWxsZWQuCi0gICAgICAgICIiIgotICAgICAgICBvYiA9IHN1cGVyKEV4dGVuZGVkUmVmLCBzZWxmKS5fX2NhbGxfXygpCi0gICAgICAgIGlmIG9iIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc2VsZi5fX2NvdW50ZXIgKz0gMQotICAgICAgICAgICAgb2IgPSAob2IsIHNlbGYuX19jb3VudGVyKQotICAgICAgICByZXR1cm4gb2IKLVxlbmR7dmVyYmF0aW19Ci0KLQotXHN1YnNlY3Rpb257RXhhbXBsZSBcbGFiZWx7d2Vha3JlZi1leGFtcGxlfX0KLQotVGhpcyBzaW1wbGUgZXhhbXBsZSBzaG93cyBob3cgYW4gYXBwbGljYXRpb24gY2FuIHVzZSBvYmplY3RzIElEcyB0bwotcmV0cmlldmUgb2JqZWN0cyB0aGF0IGl0IGhhcyBzZWVuIGJlZm9yZS4gIFRoZSBJRHMgb2YgdGhlIG9iamVjdHMgY2FuCi10aGVuIGJlIHVzZWQgaW4gb3RoZXIgZGF0YSBzdHJ1Y3R1cmVzIHdpdGhvdXQgZm9yY2luZyB0aGUgb2JqZWN0cyB0bwotcmVtYWluIGFsaXZlLCBidXQgdGhlIG9iamVjdHMgY2FuIHN0aWxsIGJlIHJldHJpZXZlZCBieSBJRCBpZiB0aGV5Ci1kby4KLQotJSBFeGFtcGxlIGNvbnRyaWJ1dGVkIGJ5IFRpbSBQZXRlcnMuCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgd2Vha3JlZgotCi1faWQyb2JqX2RpY3QgPSB3ZWFrcmVmLldlYWtWYWx1ZURpY3Rpb25hcnkoKQotCi1kZWYgcmVtZW1iZXIob2JqKToKLSAgICBvaWQgPSBpZChvYmopCi0gICAgX2lkMm9ial9kaWN0W29pZF0gPSBvYmoKLSAgICByZXR1cm4gb2lkCi0KLWRlZiBpZDJvYmoob2lkKToKLSAgICByZXR1cm4gX2lkMm9ial9kaWN0W29pZF0KLVxlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYndlYmJyb3dzZXIudGV4IGIvRG9jL2xpYi9saWJ3ZWJicm93c2VyLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ1ZjIzNi4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYndlYmJyb3dzZXIudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7d2ViYnJvd3Nlcn0gLS0tCi0gICAgICAgICBDb252ZW5pZW50IFdlYi1icm93c2VyIGNvbnRyb2xsZXJ9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXt3ZWJicm93c2VyfQotXG1vZHVsZXN5bm9wc2lze0Vhc3ktdG8tdXNlIGNvbnRyb2xsZXIgZm9yIFdlYiBicm93c2Vycy59Ci1cbW9kdWxlYXV0aG9ye0ZyZWQgTC4gRHJha2UsIEpyLn17ZmRyYWtlQGFjbS5vcmd9Ci1cc2VjdGlvbmF1dGhvcntGcmVkIEwuIERyYWtlLCBKci59e2ZkcmFrZUBhY20ub3JnfQotCi1UaGUgXG1vZHVsZXt3ZWJicm93c2VyfSBtb2R1bGUgcHJvdmlkZXMgYSBoaWdoLWxldmVsIGludGVyZmFjZSB0bwotYWxsb3cgZGlzcGxheWluZyBXZWItYmFzZWQgZG9jdW1lbnRzIHRvIHVzZXJzLiBVbmRlciBtb3N0Ci1jaXJjdW1zdGFuY2VzLCBzaW1wbHkgY2FsbGluZyB0aGUgXGZ1bmN0aW9ue29wZW4oKX0gZnVuY3Rpb24gZnJvbSB0aGlzCi1tb2R1bGUgd2lsbCBkbyB0aGUgcmlnaHQgdGhpbmcuCi0KLVVuZGVyIFxVTklYe30sIGdyYXBoaWNhbCBicm93c2VycyBhcmUgcHJlZmVycmVkIHVuZGVyIFgxMSwgYnV0IHRleHQtbW9kZQotYnJvd3NlcnMgd2lsbCBiZSB1c2VkIGlmIGdyYXBoaWNhbCBicm93c2VycyBhcmUgbm90IGF2YWlsYWJsZSBvciBhbiBYMTEKLWRpc3BsYXkgaXNuJ3QgYXZhaWxhYmxlLiAgSWYgdGV4dC1tb2RlIGJyb3dzZXJzIGFyZSB1c2VkLCB0aGUgY2FsbGluZwotcHJvY2VzcyB3aWxsIGJsb2NrIHVudGlsIHRoZSB1c2VyIGV4aXRzIHRoZSBicm93c2VyLgotCi1JZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgXGVudnZhcntCUk9XU0VSfSBleGlzdHMsIGl0Ci1pcyBpbnRlcnByZXRlZCB0byBvdmVycmlkZSB0aGUgcGxhdGZvcm0gZGVmYXVsdCBsaXN0IG9mIGJyb3dzZXJzLCBhcyBhCi1vcy5wYXRoc2VwLXNlcGFyYXRlZCBsaXN0IG9mIGJyb3dzZXJzIHRvIHRyeSBpbiBvcmRlci4gIFdoZW4gdGhlIHZhbHVlIG9mCi1hIGxpc3QgcGFydCBjb250YWlucyB0aGUgc3RyaW5nIFxjb2Rle1wlc30sIHRoZW4gaXQgaXMgCi1pbnRlcnByZXRlZCBhcyBhIGxpdGVyYWwgYnJvd3NlciBjb21tYW5kIGxpbmUgdG8gYmUgdXNlZCB3aXRoIHRoZSBhcmd1bWVudCBVUkwKLXN1YnN0aXR1dGVkIGZvciBcY29kZXtcJXN9OyBpZiB0aGUgcGFydCBkb2VzIG5vdCBjb250YWluCi1cY29kZXtcJXN9LCBpdCBpcyBzaW1wbHkgaW50ZXJwcmV0ZWQgYXMgdGhlIG5hbWUgb2YgdGhlIGJyb3dzZXIgdG8KLWxhdW5jaC4KLQotRm9yIG5vbi1cVU5JWHt9IHBsYXRmb3Jtcywgb3Igd2hlbiBhIHJlbW90ZSBicm93c2VyIGlzIGF2YWlsYWJsZSBvbgotXFVOSVh7fSwgdGhlIGNvbnRyb2xsaW5nIHByb2Nlc3Mgd2lsbCBub3Qgd2FpdCBmb3IgdGhlIHVzZXIgdG8gZmluaXNoCi13aXRoIHRoZSBicm93c2VyLCBidXQgYWxsb3cgdGhlIHJlbW90ZSBicm93c2VyIHRvIG1haW50YWluIGl0cyBvd24KLXdpbmRvd3Mgb24gdGhlIGRpc3BsYXkuICBJZiByZW1vdGUgYnJvd3NlcnMgYXJlIG5vdCBhdmFpbGFibGUgb24gXFVOSVh7fSwKLXRoZSBjb250cm9sbGluZyBwcm9jZXNzIHdpbGwgbGF1bmNoIGEgbmV3IGJyb3dzZXIgYW5kIHdhaXQuCi0KLVRoZSBzY3JpcHQgXHByb2dyYW17d2ViYnJvd3Nlcn0gY2FuIGJlIHVzZWQgYXMgYSBjb21tYW5kLWxpbmUgaW50ZXJmYWNlCi1mb3IgdGhlIG1vZHVsZS4gSXQgYWNjZXB0cyBhbiBVUkwgYXMgdGhlIGFyZ3VtZW50LiBJdCBhY2NlcHRzIHRoZSBmb2xsb3dpbmcKLW9wdGlvbmFsIHBhcmFtZXRlcnM6IFxwcm9ncmFtb3B0ey1ufSBvcGVucyB0aGUgVVJMIGluIGEgbmV3IGJyb3dzZXIgd2luZG93LAotaWYgcG9zc2libGU7IFxwcm9ncmFtb3B0ey10fSBvcGVucyB0aGUgVVJMIGluIGEgbmV3IGJyb3dzZXIgcGFnZSAoInRhYiIpLiBUaGUKLW9wdGlvbnMgYXJlLCBuYXR1cmFsbHksIG11dHVhbGx5IGV4Y2x1c2l2ZS4KLQotVGhlIGZvbGxvd2luZyBleGNlcHRpb24gaXMgZGVmaW5lZDoKLQotXGJlZ2lue2V4Y2Rlc2N9e0Vycm9yfQotICBFeGNlcHRpb24gcmFpc2VkIHdoZW4gYSBicm93c2VyIGNvbnRyb2wgZXJyb3Igb2NjdXJzLgotXGVuZHtleGNkZXNjfQotCi1UaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZDoKLQotXGJlZ2lue2Z1bmNkZXNjfXtvcGVufXt1cmxcb3B0aW9uYWx7LCBuZXc9MFxvcHRpb25hbHssIGF1dG9yYWlzZT0xfX19Ci0gIERpc3BsYXkgXHZhcnt1cmx9IHVzaW5nIHRoZSBkZWZhdWx0IGJyb3dzZXIuIElmIFx2YXJ7bmV3fSBpcyAwLCB0aGUKLSAgXHZhcnt1cmx9IGlzIG9wZW5lZCBpbiB0aGUgc2FtZSBicm93c2VyIHdpbmRvdyBpZiBwb3NzaWJsZS4gIElmIFx2YXJ7bmV3fSBpcyAxLAotICBhIG5ldyBicm93c2VyIHdpbmRvdyBpcyBvcGVuZWQgaWYgcG9zc2libGUuICBJZiBcdmFye25ld30gaXMgMiwKLSAgYSBuZXcgYnJvd3NlciBwYWdlICgidGFiIikgaXMgb3BlbmVkIGlmIHBvc3NpYmxlLiAgSWYgXHZhcnthdXRvcmFpc2V9IGlzCi0gIHRydWUsIHRoZSB3aW5kb3cgaXMgcmFpc2VkIGlmIHBvc3NpYmxlIChub3RlIHRoYXQgdW5kZXIgbWFueSB3aW5kb3cKLSAgbWFuYWdlcnMgdGhpcyB3aWxsIG9jY3VyIHJlZ2FyZGxlc3Mgb2YgdGhlIHNldHRpbmcgb2YgdGhpcyB2YXJpYWJsZSkuCi1cdmVyc2lvbmNoYW5nZWRbXHZhcntuZXd9IGNhbiBub3cgYmUgMl17Mi41fQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtvcGVuX25ld317dXJsfQotICBPcGVuIFx2YXJ7dXJsfSBpbiBhIG5ldyB3aW5kb3cgb2YgdGhlIGRlZmF1bHQgYnJvd3NlciwgaWYgcG9zc2libGUsCi0gIG90aGVyd2lzZSwgb3BlbiBcdmFye3VybH0gaW4gdGhlIG9ubHkgYnJvd3NlciB3aW5kb3cuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e29wZW5fbmV3X3RhYn17dXJsfQotICBPcGVuIFx2YXJ7dXJsfSBpbiBhIG5ldyBwYWdlICgidGFiIikgb2YgdGhlIGRlZmF1bHQgYnJvd3NlciwgaWYgcG9zc2libGUsCi0gIG90aGVyd2lzZSBlcXVpdmFsZW50IHRvIFxmdW5jdGlvbntvcGVuX25ld30uCi1cdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0fXtcb3B0aW9uYWx7bmFtZX19Ci0gIFJldHVybiBhIGNvbnRyb2xsZXIgb2JqZWN0IGZvciB0aGUgYnJvd3NlciB0eXBlIFx2YXJ7bmFtZX0uICBJZgotICBcdmFye25hbWV9IGlzIGVtcHR5LCByZXR1cm4gYSBjb250cm9sbGVyIGZvciBhIGRlZmF1bHQgYnJvd3NlcgotICBhcHByb3ByaWF0ZSB0byB0aGUgY2FsbGVyJ3MgZW52aXJvbm1lbnQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3JlZ2lzdGVyfXtuYW1lLCBjb25zdHJ1Y3RvclxvcHRpb25hbHssIGluc3RhbmNlfX0KLSAgUmVnaXN0ZXIgdGhlIGJyb3dzZXIgdHlwZSBcdmFye25hbWV9LiAgT25jZSBhIGJyb3dzZXIgdHlwZSBpcwotICByZWdpc3RlcmVkLCB0aGUgXGZ1bmN0aW9ue2dldCgpfSBmdW5jdGlvbiBjYW4gcmV0dXJuIGEgY29udHJvbGxlcgotICBmb3IgdGhhdCBicm93c2VyIHR5cGUuICBJZiBcdmFye2luc3RhbmNlfSBpcyBub3QgcHJvdmlkZWQsIG9yIGlzCi0gIFxjb2Rle05vbmV9LCBcdmFye2NvbnN0cnVjdG9yfSB3aWxsIGJlIGNhbGxlZCB3aXRob3V0IHBhcmFtZXRlcnMgdG8KLSAgY3JlYXRlIGFuIGluc3RhbmNlIHdoZW4gbmVlZGVkLiAgSWYgXHZhcntpbnN0YW5jZX0gaXMgcHJvdmlkZWQsCi0gIFx2YXJ7Y29uc3RydWN0b3J9IHdpbGwgbmV2ZXIgYmUgY2FsbGVkLCBhbmQgbWF5IGJlIFxjb2Rle05vbmV9LgotCi0gIFRoaXMgZW50cnkgcG9pbnQgaXMgb25seSB1c2VmdWwgaWYgeW91IHBsYW4gdG8gZWl0aGVyIHNldCB0aGUKLSAgXGVudnZhcntCUk9XU0VSfSB2YXJpYWJsZSBvciBjYWxsIFxmdW5jdGlvbntnZXR9IHdpdGggYSBub25lbXB0eQotICBhcmd1bWVudCBtYXRjaGluZyB0aGUgbmFtZSBvZiBhIGhhbmRsZXIgeW91IGRlY2xhcmUuCi1cZW5ke2Z1bmNkZXNjfQotCi1BIG51bWJlciBvZiBicm93c2VyIHR5cGVzIGFyZSBwcmVkZWZpbmVkLiAgVGhpcyB0YWJsZSBnaXZlcyB0aGUgdHlwZQotbmFtZXMgdGhhdCBtYXkgYmUgcGFzc2VkIHRvIHRoZSBcZnVuY3Rpb257Z2V0KCl9IGZ1bmN0aW9uIGFuZCB0aGUKLWNvcnJlc3BvbmRpbmcgaW5zdGFudGlhdGlvbnMgZm9yIHRoZSBjb250cm9sbGVyIGNsYXNzZXMsIGFsbCBkZWZpbmVkCi1pbiB0aGlzIG1vZHVsZS4KLQotXGJlZ2lue3RhYmxlaWlpfXtsfGx8Y317Y29kZX17VHlwZSBOYW1lfXtDbGFzcyBOYW1lfXtOb3Rlc30KLSAgXGxpbmVpaWl7J21vemlsbGEnfXtcY2xhc3N7TW96aWxsYSgnbW96aWxsYScpfX17fQotICBcbGluZWlpaXsnZmlyZWZveCd9e1xjbGFzc3tNb3ppbGxhKCdtb3ppbGxhJyl9fXt9Ci0gIFxsaW5laWlpeyduZXRzY2FwZSd9e1xjbGFzc3tNb3ppbGxhKCduZXRzY2FwZScpfX17fQotICBcbGluZWlpaXsnZ2FsZW9uJ317XGNsYXNze0dhbGVvbignZ2FsZW9uJyl9fXt9Ci0gIFxsaW5laWlpeydlcGlwaGFueSd9e1xjbGFzc3tHYWxlb24oJ2VwaXBoYW55Jyl9fXt9Ci0gIFxsaW5laWlpeydza2lwc3RvbmUnfXtcY2xhc3N7QmFja2dyb3VuZEJyb3dzZXIoJ3NraXBzdG9uZScpfX17fQotICBcbGluZWlpaXsna2ZtY2xpZW50J317XGNsYXNze0tvbnF1ZXJvcigpfX17KDEpfQotICBcbGluZWlpaXsna29ucXVlcm9yJ317XGNsYXNze0tvbnF1ZXJvcigpfX17KDEpfQotICBcbGluZWlpaXsna2ZtJ317XGNsYXNze0tvbnF1ZXJvcigpfX17KDEpfQotICBcbGluZWlpaXsnbW9zYWljJ317XGNsYXNze0JhY2tncm91bmRCcm93c2VyKCdtb3NhaWMnKX19e30KLSAgXGxpbmVpaWl7J29wZXJhJ317XGNsYXNze09wZXJhKCl9fXt9Ci0gIFxsaW5laWlpeydncmFpbCd9e1xjbGFzc3tHcmFpbCgpfX17fQotICBcbGluZWlpaXsnbGlua3MnfXtcY2xhc3N7R2VuZXJpY0Jyb3dzZXIoJ2xpbmtzJyl9fXt9Ci0gIFxsaW5laWlpeydlbGlua3MnfXtcY2xhc3N7RWxpbmtzKCdlbGlua3MnKX19e30KLSAgXGxpbmVpaWl7J2x5bngnfXtcY2xhc3N7R2VuZXJpY0Jyb3dzZXIoJ2x5bngnKX19e30KLSAgXGxpbmVpaWl7J3czbSd9e1xjbGFzc3tHZW5lcmljQnJvd3NlcigndzNtJyl9fXt9Ci0gIFxsaW5laWlpeyd3aW5kb3dzLWRlZmF1bHQnfXtcY2xhc3N7V2luZG93c0RlZmF1bHR9fXsoMil9Ci0gIFxsaW5laWlpeydpbnRlcm5ldC1jb25maWcnfXtcY2xhc3N7SW50ZXJuZXRDb25maWd9fXsoMyl9Ci0gIFxsaW5laWlpeydtYWNvc3gnfXtcY2xhc3N7TWFjT1NYKCdkZWZhdWx0Jyl9fXsoNCl9Ci1cZW5ke3RhYmxlaWlpfQotCi1cbm9pbmRlbnQKLU5vdGVzOgotCi1cYmVnaW57ZGVzY3JpcHRpb259Ci1caXRlbVsoMSldCi1gYEtvbnF1ZXJvcicnIGlzIHRoZSBmaWxlIG1hbmFnZXIgZm9yIHRoZSBLREUgZGVza3RvcCBlbnZpcm9ubWVudCBmb3IKLVxVTklYe30sIGFuZCBvbmx5IG1ha2VzIHNlbnNlIHRvIHVzZSBpZiBLREUgaXMgcnVubmluZy4gIFNvbWUgd2F5IG9mCi1yZWxpYWJseSBkZXRlY3RpbmcgS0RFIHdvdWxkIGJlIG5pY2U7IHRoZSBcZW52dmFye0tERURJUn0gdmFyaWFibGUgaXMKLW5vdCBzdWZmaWNpZW50LiAgTm90ZSBhbHNvIHRoYXQgdGhlIG5hbWUgYGBrZm0nJyBpcyB1c2VkIGV2ZW4gd2hlbgotdXNpbmcgdGhlIFxwcm9ncmFte2tvbnF1ZXJvcn0gY29tbWFuZCB3aXRoIEtERSAyIC0tLSB0aGUKLWltcGxlbWVudGF0aW9uIHNlbGVjdHMgdGhlIGJlc3Qgc3RyYXRlZ3kgZm9yIHJ1bm5pbmcgS29ucXVlcm9yLgotCi1caXRlbVsoMildCi1Pbmx5IG9uIFdpbmRvd3MgcGxhdGZvcm1zLgotCi1caXRlbVsoMyldCi1Pbmx5IG9uIE1hY09TIHBsYXRmb3JtczsgcmVxdWlyZXMgdGhlIHN0YW5kYXJkIE1hY1B5dGhvbiBcbW9kdWxle2ljfQotbW9kdWxlLCBkZXNjcmliZWQgaW4gdGhlIFxjaXRldGl0bGVbLi4vbWFjL21vZHVsZS1pYy5odG1sXXtNYWNpbnRvc2gKLUxpYnJhcnkgTW9kdWxlc30gbWFudWFsLgotCi1caXRlbVsoNCldCi1Pbmx5IG9uIE1hY09TIFggcGxhdGZvcm0uCi1cZW5ke2Rlc2NyaXB0aW9ufQotCi1IZXJlIGFyZSBzb21lIHNpbXBsZSBleGFtcGxlczoKLQotXGJlZ2lue3ZlcmJhdGltfQotdXJsID0gJ2h0dHA6Ly93d3cucHl0aG9uLm9yZycKLQotIyBPcGVuIFVSTCBpbiBhIG5ldyB0YWIsIGlmIGEgYnJvd3NlciB3aW5kb3cgaXMgYWxyZWFkeSBvcGVuLiAKLXdlYmJyb3dzZXIub3Blbl9uZXdfdGFiKHVybCArICcvZG9jJykKLQotIyBPcGVuIFVSTCBpbiBuZXcgd2luZG93LCByYWlzaW5nIHRoZSB3aW5kb3cgaWYgcG9zc2libGUuCi13ZWJicm93c2VyLm9wZW5fbmV3KHVybCkKLVxlbmR7dmVyYmF0aW19Ci0KLQotXHN1YnNlY3Rpb257QnJvd3NlciBDb250cm9sbGVyIE9iamVjdHMgXGxhYmVse2Jyb3dzZXItY29udHJvbGxlcnN9fQotCi1Ccm93c2VyIGNvbnRyb2xsZXJzIHByb3ZpZGUgdHdvIG1ldGhvZHMgd2hpY2ggcGFyYWxsZWwgdHdvIG9mIHRoZQotbW9kdWxlLWxldmVsIGNvbnZlbmllbmNlIGZ1bmN0aW9uczoKLQotXGJlZ2lue21ldGhvZGRlc2N9W2NvbnRyb2xsZXJde29wZW59e3VybFxvcHRpb25hbHssIG5ld1xvcHRpb25hbHssIGF1dG9yYWlzZT0xfX19Ci0gIERpc3BsYXkgXHZhcnt1cmx9IHVzaW5nIHRoZSBicm93c2VyIGhhbmRsZWQgYnkgdGhpcyBjb250cm9sbGVyLgotICBJZiBcdmFye25ld30gaXMgMSwgYSBuZXcgYnJvd3NlciB3aW5kb3cgaXMgb3BlbmVkIGlmIHBvc3NpYmxlLgotICBJZiBcdmFye25ld30gaXMgMiwgYSBuZXcgYnJvd3NlciBwYWdlICgidGFiIikgaXMgb3BlbmVkIGlmIHBvc3NpYmxlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bY29udHJvbGxlcl17b3Blbl9uZXd9e3VybH0KLSAgT3BlbiBcdmFye3VybH0gaW4gYSBuZXcgd2luZG93IG9mIHRoZSBicm93c2VyIGhhbmRsZWQgYnkgdGhpcwotICBjb250cm9sbGVyLCBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlLCBvcGVuIFx2YXJ7dXJsfSBpbiB0aGUgb25seQotICBicm93c2VyIHdpbmRvdy4gIEFsaWFzIFxmdW5jdGlvbntvcGVuX25ld30uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtjb250cm9sbGVyXXtvcGVuX25ld190YWJ9e3VybH0KLSAgT3BlbiBcdmFye3VybH0gaW4gYSBuZXcgcGFnZSAoInRhYiIpIG9mIHRoZSBicm93c2VyIGhhbmRsZWQgYnkgdGhpcwotICBjb250cm9sbGVyLCBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlIGVxdWl2YWxlbnQgdG8gXGZ1bmN0aW9ue29wZW5fbmV3fS4KLVx2ZXJzaW9uYWRkZWR7Mi41fQotXGVuZHttZXRob2RkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ3aGljaGRiLnRleCBiL0RvYy9saWIvbGlid2hpY2hkYi50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZDM3ZTcuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJ3aGljaGRiLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7d2hpY2hkYn0gLS0tCi0gICAgICAgICBHdWVzcyB3aGljaCBEQk0gbW9kdWxlIGNyZWF0ZWQgYSBkYXRhYmFzZX0KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e3doaWNoZGJ9Ci1cbW9kdWxlc3lub3BzaXN7R3Vlc3Mgd2hpY2ggREJNLXN0eWxlIG1vZHVsZSBjcmVhdGVkIGEgZ2l2ZW4gZGF0YWJhc2UufQotCi0KLVRoZSBzaW5nbGUgZnVuY3Rpb24gaW4gdGhpcyBtb2R1bGUgYXR0ZW1wdHMgdG8gZ3Vlc3Mgd2hpY2ggb2YgdGhlCi1zZXZlcmFsIHNpbXBsZSBkYXRhYmFzZSBtb2R1bGVzIGF2YWlsYWJsZS0tXHJlZm1vZHVsZXtkYm19LAotXHJlZm1vZHVsZXtnZGJtfSwgb3IgXHJlZm1vZHVsZXtkYmhhc2h9LS1zaG91bGQgYmUgdXNlZCB0byBvcGVuIGEKLWdpdmVuIGZpbGUuCi0KLVxiZWdpbntmdW5jZGVzY317d2hpY2hkYn17ZmlsZW5hbWV9Ci1SZXR1cm5zIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogXGNvZGV7Tm9uZX0gaWYgdGhlIGZpbGUgY2FuJ3QgYmUKLW9wZW5lZCBiZWNhdXNlIGl0J3MgdW5yZWFkYWJsZSBvciBkb2Vzbid0IGV4aXN0OyB0aGUgZW1wdHkgc3RyaW5nCi0oXGNvZGV7Jyd9KSBpZiB0aGUgZmlsZSdzIGZvcm1hdCBjYW4ndCBiZSBndWVzc2VkOyBvciBhIHN0cmluZwotY29udGFpbmluZyB0aGUgcmVxdWlyZWQgbW9kdWxlIG5hbWUsIHN1Y2ggYXMgXGNvZGV7J2RibSd9IG9yCi1cY29kZXsnZ2RibSd9LgotXGVuZHtmdW5jZGVzY30KLQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ3aW5yZWcudGV4IGIvRG9jL2xpYi9saWJ3aW5yZWcudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzFjM2NhLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlid2lucmVnLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDQxNCArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle193aW5yZWd9IC0tCi0gICAgICAgICBXaW5kb3dzIHJlZ2lzdHJ5IGFjY2Vzc30KLQotXGRlY2xhcmVtb2R1bGVbLXdpbnJlZ117ZXh0ZW5zaW9ufXtfd2lucmVnfQotICBccGxhdGZvcm17V2luZG93c30KLVxtb2R1bGVzeW5vcHNpc3tSb3V0aW5lcyBhbmQgb2JqZWN0cyBmb3IgbWFuaXB1bGF0aW5nIHRoZSBXaW5kb3dzIHJlZ2lzdHJ5Ln0KLVxzZWN0aW9uYXV0aG9ye01hcmsgSGFtbW9uZH17TWFya0hAQWN0aXZlU3RhdGUuY29tfQotCi1cdmVyc2lvbmFkZGVkezIuMH0KLQotVGhlc2UgZnVuY3Rpb25zIGV4cG9zZSB0aGUgV2luZG93cyByZWdpc3RyeSBBUEkgdG8gUHl0aG9uLiAgSW5zdGVhZCBvZgotdXNpbmcgYW4gaW50ZWdlciBhcyB0aGUgcmVnaXN0cnkgaGFuZGxlLCBhIGhhbmRsZSBvYmplY3QgaXMgdXNlZCB0bwotZW5zdXJlIHRoYXQgdGhlIGhhbmRsZXMgYXJlIGNsb3NlZCBjb3JyZWN0bHksIGV2ZW4gaWYgdGhlIHByb2dyYW1tZXIKLW5lZ2xlY3RzIHRvIGV4cGxpY2l0bHkgY2xvc2UgdGhlbS4KLQotVGhpcyBtb2R1bGUgZXhwb3NlcyBhIHZlcnkgbG93LWxldmVsIGludGVyZmFjZSB0byB0aGUgV2luZG93cwotcmVnaXN0cnk7IGl0IGlzIGV4cGVjdGVkIHRoYXQgaW4gdGhlIGZ1dHVyZSBhIG5ldyBcY29kZXt3aW5yZWd9IAotbW9kdWxlIHdpbGwgYmUgY3JlYXRlZCBvZmZlcmluZyBhIGhpZ2hlci1sZXZlbCBpbnRlcmZhY2UgdG8gdGhlCi1yZWdpc3RyeSBBUEkuCi0KLVRoaXMgbW9kdWxlIG9mZmVycyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKLQotCi1cYmVnaW57ZnVuY2Rlc2N9e0Nsb3NlS2V5fXtoa2V5fQotIENsb3NlcyBhIHByZXZpb3VzbHkgb3BlbmVkIHJlZ2lzdHJ5IGtleS4KLSBUaGUgaGtleSBhcmd1bWVudCBzcGVjaWZpZXMgYSBwcmV2aW91c2x5IG9wZW5lZCBrZXkuCi0KLSBOb3RlIHRoYXQgaWYgXHZhcntoa2V5fSBpcyBub3QgY2xvc2VkIHVzaW5nIHRoaXMgbWV0aG9kIChvciB2aWEKLSBcbWV0aG9ke2hhbmRsZS5DbG9zZSgpfSksIGl0IGlzIGNsb3NlZCB3aGVuIHRoZSBcdmFye2hrZXl9IG9iamVjdAotIGlzIGRlc3Ryb3llZCBieSBQeXRob24uCi1cZW5ke2Z1bmNkZXNjfQotCi0KLVxiZWdpbntmdW5jZGVzY317Q29ubmVjdFJlZ2lzdHJ5fXtjb21wdXRlcl9uYW1lLCBrZXl9Ci0gIEVzdGFibGlzaGVzIGEgY29ubmVjdGlvbiB0byBhIHByZWRlZmluZWQgcmVnaXN0cnkgaGFuZGxlIG9uIAotICBhbm90aGVyIGNvbXB1dGVyLCBhbmQgcmV0dXJucyBhIFxkZm57aGFuZGxlIG9iamVjdH0KLQotIFx2YXJ7Y29tcHV0ZXJfbmFtZX0gaXMgdGhlIG5hbWUgb2YgdGhlIHJlbW90ZSBjb21wdXRlciwgb2YgdGhlIAotIGZvcm0gXGNvZGV7ciJcZVxlIGNvbXB1dGVybmFtZSJ9LiAgSWYgXGNvZGV7Tm9uZX0sIHRoZSBsb2NhbCBjb21wdXRlcgotIGlzIHVzZWQuCi0gCi0gXHZhcntrZXl9IGlzIHRoZSBwcmVkZWZpbmVkIGhhbmRsZSB0byBjb25uZWN0IHRvLgotCi0gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgaGFuZGxlIG9mIHRoZSBvcGVuZWQga2V5LgotIElmIHRoZSBmdW5jdGlvbiBmYWlscywgYW4gXGV4Y2VwdGlvbntFbnZpcm9ubWVudEVycm9yfSBleGNlcHRpb24gaXMgCi0gcmFpc2VkLgotXGVuZHtmdW5jZGVzY30KLQotCi1cYmVnaW57ZnVuY2Rlc2N9e0NyZWF0ZUtleX17a2V5LCBzdWJfa2V5fQotIENyZWF0ZXMgb3Igb3BlbnMgdGhlIHNwZWNpZmllZCBrZXksIHJldHVybmluZyBhIFxkZm57aGFuZGxlIG9iamVjdH0KLSAKLSBcdmFye2tleX0gaXMgYW4gYWxyZWFkeSBvcGVuIGtleSwgb3Igb25lIG9mIHRoZSBwcmVkZWZpbmVkIAotIFxjb25zdGFudHtIS0VZXyp9IGNvbnN0YW50cy4KLSAKLSBcdmFye3N1Yl9rZXl9IGlzIGEgc3RyaW5nIHRoYXQgbmFtZXMgdGhlIGtleSB0aGlzIG1ldGhvZCBvcGVucyAKLSBvciBjcmVhdGVzLgotIAotIElmIFx2YXJ7a2V5fSBpcyBvbmUgb2YgdGhlIHByZWRlZmluZWQga2V5cywgXHZhcntzdWJfa2V5fSBtYXkgCi0gYmUgXGNvZGV7Tm9uZX0uIEluIHRoYXQgY2FzZSwgdGhlIGhhbmRsZSByZXR1cm5lZCBpcyB0aGUgc2FtZSBrZXkgaGFuZGxlIAotIHBhc3NlZCBpbiB0byB0aGUgZnVuY3Rpb24uCi0KLSBJZiB0aGUga2V5IGFscmVhZHkgZXhpc3RzLCB0aGlzIGZ1bmN0aW9uIG9wZW5zIHRoZSBleGlzdGluZyBrZXkuCi0KLSBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBoYW5kbGUgb2YgdGhlIG9wZW5lZCBrZXkuCi0gSWYgdGhlIGZ1bmN0aW9uIGZhaWxzLCBhbiBcZXhjZXB0aW9ue0Vudmlyb25tZW50RXJyb3J9IGV4Y2VwdGlvbiBpcyAKLSByYWlzZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e0RlbGV0ZUtleX17a2V5LCBzdWJfa2V5fQotIERlbGV0ZXMgdGhlIHNwZWNpZmllZCBrZXkuCi0KLSBcdmFye2tleX0gaXMgYW4gYWxyZWFkeSBvcGVuIGtleSwgb3IgYW55IG9uZSBvZiB0aGUgcHJlZGVmaW5lZCAKLSBcY29uc3RhbnR7SEtFWV8qfSBjb25zdGFudHMuCi0gCi0gXHZhcntzdWJfa2V5fSBpcyBhIHN0cmluZyB0aGF0IG11c3QgYmUgYSBzdWJrZXkgb2YgdGhlIGtleSAKLSBpZGVudGlmaWVkIGJ5IHRoZSBcdmFye2tleX0gcGFyYW1ldGVyLiAgVGhpcyB2YWx1ZSBtdXN0IG5vdCBiZSAKLSBcY29kZXtOb25lfSwgYW5kIHRoZSBrZXkgbWF5IG5vdCBoYXZlIHN1YmtleXMuCi0KLSBcZW1waHtUaGlzIG1ldGhvZCBjYW4gbm90IGRlbGV0ZSBrZXlzIHdpdGggc3Via2V5cy59Ci0KLSBJZiB0aGUgbWV0aG9kIHN1Y2NlZWRzLCB0aGUgZW50aXJlIGtleSwgaW5jbHVkaW5nIGFsbCBvZiBpdHMgdmFsdWVzLAotIGlzIHJlbW92ZWQuICBJZiB0aGUgbWV0aG9kIGZhaWxzLCBhbiBcZXhjZXB0aW9ue0Vudmlyb25tZW50RXJyb3J9IAotIGV4Y2VwdGlvbiBpcyByYWlzZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi0KLVxiZWdpbntmdW5jZGVzY317RGVsZXRlVmFsdWV9e2tleSwgdmFsdWV9Ci0gIFJlbW92ZXMgYSBuYW1lZCB2YWx1ZSBmcm9tIGEgcmVnaXN0cnkga2V5LgotICAKLSBcdmFye2tleX0gaXMgYW4gYWxyZWFkeSBvcGVuIGtleSwgb3Igb25lIG9mIHRoZSBwcmVkZWZpbmVkIAotIFxjb25zdGFudHtIS0VZXyp9IGNvbnN0YW50cy4KLSAgCi0gXHZhcnt2YWx1ZX0gaXMgYSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIHRoZSB2YWx1ZSB0byByZW1vdmUuCi1cZW5ke2Z1bmNkZXNjfQotCi0KLVxiZWdpbntmdW5jZGVzY317RW51bUtleX17a2V5LCBpbmRleH0KLSAgRW51bWVyYXRlcyBzdWJrZXlzIG9mIGFuIG9wZW4gcmVnaXN0cnkga2V5LCByZXR1cm5pbmcgYSBzdHJpbmcuCi0KLSBcdmFye2tleX0gaXMgYW4gYWxyZWFkeSBvcGVuIGtleSwgb3IgYW55IG9uZSBvZiB0aGUgcHJlZGVmaW5lZCAKLSBcY29uc3RhbnR7SEtFWV8qfSBjb25zdGFudHMuCi0KLSBcdmFye2luZGV4fSBpcyBhbiBpbnRlZ2VyIHRoYXQgaWRlbnRpZmllcyB0aGUgaW5kZXggb2YgdGhlIGtleSB0byAKLSByZXRyaWV2ZS4KLQotIFRoZSBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIG5hbWUgb2Ygb25lIHN1YmtleSBlYWNoIHRpbWUgaXQgCi0gaXMgY2FsbGVkLiAgSXQgaXMgdHlwaWNhbGx5IGNhbGxlZCByZXBlYXRlZGx5IHVudGlsIGFuIAotIFxleGNlcHRpb257RW52aXJvbm1lbnRFcnJvcn0gZXhjZXB0aW9uIAotIGlzIHJhaXNlZCwgaW5kaWNhdGluZywgbm8gbW9yZSB2YWx1ZXMgYXJlIGF2YWlsYWJsZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue2Z1bmNkZXNjfXtFbnVtVmFsdWV9e2tleSwgaW5kZXh9Ci0gIEVudW1lcmF0ZXMgdmFsdWVzIG9mIGFuIG9wZW4gcmVnaXN0cnkga2V5LCByZXR1cm5pbmcgYSB0dXBsZS4KLSAgCi0gXHZhcntrZXl9IGlzIGFuIGFscmVhZHkgb3BlbiBrZXksIG9yIGFueSBvbmUgb2YgdGhlIHByZWRlZmluZWQgCi0gXGNvbnN0YW50e0hLRVlfKn0gY29uc3RhbnRzLgotIAotIFx2YXJ7aW5kZXh9IGlzIGFuIGludGVnZXIgdGhhdCBpZGVudGlmaWVzIHRoZSBpbmRleCBvZiB0aGUgdmFsdWUgCi0gdG8gcmV0cmlldmUuCi0gCi0gVGhlIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUgbmFtZSBvZiBvbmUgc3Via2V5IGVhY2ggdGltZSBpdCBpcyAKLSBjYWxsZWQuIEl0IGlzIHR5cGljYWxseSBjYWxsZWQgcmVwZWF0ZWRseSwgdW50aWwgYW4gCi0gXGV4Y2VwdGlvbntFbnZpcm9ubWVudEVycm9yfSBleGNlcHRpb24gaXMgcmFpc2VkLCBpbmRpY2F0aW5nIAotIG5vIG1vcmUgdmFsdWVzLgotIAotIFRoZSByZXN1bHQgaXMgYSB0dXBsZSBvZiAzIGl0ZW1zOgotCi0gXGJlZ2lue3RhYmxlaWl9e2N8cHszaW59fXtjb2RlfXtJbmRleH17TWVhbmluZ30KLSAgIFxsaW5laWl7MH17QSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIHRoZSB2YWx1ZSBuYW1lfQotICAgXGxpbmVpaXsxfXtBbiBvYmplY3QgdGhhdCBob2xkcyB0aGUgdmFsdWUgZGF0YSwgYW5kIHdob3NlCi0gICAgICAgICAgICAgIHR5cGUgZGVwZW5kcyBvbiB0aGUgdW5kZXJseWluZyByZWdpc3RyeSB0eXBlfQotICAgXGxpbmVpaXsyfXtBbiBpbnRlZ2VyIHRoYXQgaWRlbnRpZmllcyB0aGUgdHlwZSBvZiB0aGUgdmFsdWUgZGF0YX0KLSBcZW5ke3RhYmxlaWl9Ci0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue2Z1bmNkZXNjfXtGbHVzaEtleX17a2V5fQotICBXcml0ZXMgYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIGEga2V5IHRvIHRoZSByZWdpc3RyeS4KLQotIFx2YXJ7a2V5fSBpcyBhbiBhbHJlYWR5IG9wZW4ga2V5LCBvciBvbmUgb2YgdGhlIHByZWRlZmluZWQgCi0gXGNvbnN0YW50e0hLRVlfKn0gY29uc3RhbnRzLgotCi0gSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjYWxsIFJlZ0ZsdXNoS2V5IHRvIGNoYW5nZSBhIGtleS4KLSBSZWdpc3RyeSBjaGFuZ2VzIGFyZSBmbHVzaGVkIHRvIGRpc2sgYnkgdGhlIHJlZ2lzdHJ5IHVzaW5nIGl0cyBsYXp5IAotIGZsdXNoZXIuICBSZWdpc3RyeSBjaGFuZ2VzIGFyZSBhbHNvIGZsdXNoZWQgdG8gZGlzayBhdCBzeXN0ZW0gCi0gc2h1dGRvd24uICBVbmxpa2UgXGZ1bmN0aW9ue0Nsb3NlS2V5KCl9LCB0aGUgXGZ1bmN0aW9ue0ZsdXNoS2V5KCl9IG1ldGhvZCAKLSByZXR1cm5zIG9ubHkgd2hlbiBhbGwgdGhlIGRhdGEgaGFzIGJlZW4gd3JpdHRlbiB0byB0aGUgcmVnaXN0cnkuCi0gQW4gYXBwbGljYXRpb24gc2hvdWxkIG9ubHkgY2FsbCBcZnVuY3Rpb257Rmx1c2hLZXkoKX0gaWYgaXQgcmVxdWlyZXMgYWJzb2x1dGUgCi0gY2VydGFpbnR5IHRoYXQgcmVnaXN0cnkgY2hhbmdlcyBhcmUgb24gZGlzay4KLSAKLSBcbm90ZXtJZiB5b3UgZG9uJ3Qga25vdyB3aGV0aGVyIGEgXGZ1bmN0aW9ue0ZsdXNoS2V5KCl9IGNhbGwgaXMgcmVxdWlyZWQsIGl0IAotIHByb2JhYmx5IGlzbid0Ln0KLSAKLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue2Z1bmNkZXNjfXtSZWdMb2FkS2V5fXtrZXksIHN1Yl9rZXksIGZpbGVfbmFtZX0KLSBDcmVhdGVzIGEgc3Via2V5IHVuZGVyIHRoZSBzcGVjaWZpZWQga2V5IGFuZCBzdG9yZXMgcmVnaXN0cmF0aW9uIAotIGluZm9ybWF0aW9uIGZyb20gYSBzcGVjaWZpZWQgZmlsZSBpbnRvIHRoYXQgc3Via2V5LgotCi0gXHZhcntrZXl9IGlzIGFuIGFscmVhZHkgb3BlbiBrZXksIG9yIGFueSBvZiB0aGUgcHJlZGVmaW5lZAotIFxjb25zdGFudHtIS0VZXyp9IGNvbnN0YW50cy4KLSAKLSBcdmFye3N1Yl9rZXl9IGlzIGEgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyB0aGUgc3ViX2tleSB0byBsb2FkLgotIAotIFx2YXIge2ZpbGVfbmFtZX0gaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gbG9hZCByZWdpc3RyeSBkYXRhIGZyb20uCi0gIFRoaXMgZmlsZSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIFxmdW5jdGlvbntTYXZlS2V5KCl9IGZ1bmN0aW9uLgotICBVbmRlciB0aGUgZmlsZSBhbGxvY2F0aW9uIHRhYmxlIChGQVQpIGZpbGUgc3lzdGVtLCB0aGUgZmlsZW5hbWUgbWF5IG5vdAotICBoYXZlIGFuIGV4dGVuc2lvbi4KLQotIEEgY2FsbCB0byBMb2FkS2V5KCkgZmFpbHMgaWYgdGhlIGNhbGxpbmcgcHJvY2VzcyBkb2VzIG5vdCBoYXZlIHRoZQotIFxjb25zdGFudHtTRV9SRVNUT1JFX1BSSVZJTEVHRX0gcHJpdmlsZWdlLiBOb3RlIHRoYXQgcHJpdmlsZWdlcwotIGFyZSBkaWZmZXJlbnQgdGhhbiBwZXJtaXNzaW9ucyAtIHNlZSB0aGUgV2luMzIgZG9jdW1lbnRhdGlvbiBmb3IKLSBtb3JlIGRldGFpbHMuCi0KLSBJZiBcdmFye2tleX0gaXMgYSBoYW5kbGUgcmV0dXJuZWQgYnkgXGZ1bmN0aW9ue0Nvbm5lY3RSZWdpc3RyeSgpfSwgCi0gdGhlbiB0aGUgcGF0aCBzcGVjaWZpZWQgaW4gXHZhcntmaWxlTmFtZX0gaXMgcmVsYXRpdmUgdG8gdGhlIAotIHJlbW90ZSBjb21wdXRlci4KLQotIFRoZSBXaW4zMiBkb2N1bWVudGF0aW9uIGltcGxpZXMgXHZhcntrZXl9IG11c3QgYmUgaW4gdGhlIAotIFxjb25zdGFudHtIS0VZX1VTRVJ9IG9yIFxjb25zdGFudHtIS0VZX0xPQ0FMX01BQ0hJTkV9IHRyZWUuCi0gVGhpcyBtYXkgb3IgbWF5IG5vdCBiZSB0cnVlLgotXGVuZHtmdW5jZGVzY30KLQotCi1cYmVnaW57ZnVuY2Rlc2N9e09wZW5LZXl9e2tleSwgc3ViX2tleVxvcHRpb25hbHssIHJlc1xjb2RleyA9IDB9fVxvcHRpb25hbHssIHNhbVxjb2RleyA9IFxjb25zdGFudHtLRVlfUkVBRH19fX0KLSAgT3BlbnMgdGhlIHNwZWNpZmllZCBrZXksIHJldHVybmluZyBhIFxkZm57aGFuZGxlIG9iamVjdH0KLQotIFx2YXJ7a2V5fSBpcyBhbiBhbHJlYWR5IG9wZW4ga2V5LCBvciBhbnkgb25lIG9mIHRoZSBwcmVkZWZpbmVkCi0gXGNvbnN0YW50e0hLRVlfKn0gY29uc3RhbnRzLgotCi0gXHZhcntzdWJfa2V5fSBpcyBhIHN0cmluZyB0aGF0IGlkZW50aWZpZXMgdGhlIHN1Yl9rZXkgdG8gb3Blbi4KLSAKLSBcdmFye3Jlc30gaXMgYSByZXNlcnZlZCBpbnRlZ2VyLCBhbmQgbXVzdCBiZSB6ZXJvLiAgVGhlIGRlZmF1bHQgaXMgemVyby4KLSAKLSBcdmFye3NhbX0gaXMgYW4gaW50ZWdlciB0aGF0IHNwZWNpZmllcyBhbiBhY2Nlc3MgbWFzayB0aGF0IGRlc2NyaWJlcyAKLSB0aGUgZGVzaXJlZCBzZWN1cml0eSBhY2Nlc3MgZm9yIHRoZSBrZXkuICBEZWZhdWx0IGlzIFxjb25zdGFudHtLRVlfUkVBRH0KLSAKLSBUaGUgcmVzdWx0IGlzIGEgbmV3IGhhbmRsZSB0byB0aGUgc3BlY2lmaWVkIGtleS4KLSAKLSBJZiB0aGUgZnVuY3Rpb24gZmFpbHMsIFxleGNlcHRpb257RW52aXJvbm1lbnRFcnJvcn0gaXMgcmFpc2VkLgotXGVuZHtmdW5jZGVzY30KLQotCi1cYmVnaW57ZnVuY2Rlc2N9e09wZW5LZXlFeH17fQotICBUaGUgZnVuY3Rpb25hbGl0eSBvZiBcZnVuY3Rpb257T3BlbktleUV4KCl9IGlzIHByb3ZpZGVkIHZpYQotICBcZnVuY3Rpb257T3BlbktleSgpfSwgYnkgdGhlIHVzZSBvZiBkZWZhdWx0IGFyZ3VtZW50cy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue2Z1bmNkZXNjfXtRdWVyeUluZm9LZXl9e2tleX0KLSBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGEga2V5LCBhcyBhIHR1cGxlLgotCi0gXHZhcntrZXl9IGlzIGFuIGFscmVhZHkgb3BlbiBrZXksIG9yIG9uZSBvZiB0aGUgcHJlZGVmaW5lZCAKLSBcY29uc3RhbnR7SEtFWV8qfSBjb25zdGFudHMuCi0KLSBUaGUgcmVzdWx0IGlzIGEgdHVwbGUgb2YgMyBpdGVtczoKLQotIFxiZWdpbnt0YWJsZWlpfXtjfHB7M2lufX17Y29kZX17SW5kZXh9e01lYW5pbmd9Ci0gICBcbGluZWlpezB9e0FuIGludGVnZXIgZ2l2aW5nIHRoZSBudW1iZXIgb2Ygc3ViIGtleXMgdGhpcyBrZXkgaGFzLn0KLSAgIFxsaW5laWl7MX17QW4gaW50ZWdlciBnaXZpbmcgdGhlIG51bWJlciBvZiB2YWx1ZXMgdGhpcyBrZXkgaGFzLn0KLSAgIFxsaW5laWl7Mn17QSBsb25nIGludGVnZXIgZ2l2aW5nIHdoZW4gdGhlIGtleSB3YXMgbGFzdCBtb2RpZmllZCAoaWYKLSAgICAgICAgICAgICAgYXZhaWxhYmxlKSBhcyAxMDAncyBvZiBuYW5vc2Vjb25kcyBzaW5jZSBKYW4gMSwgMTYwMC59Ci0gXGVuZHt0YWJsZWlpfQotXGVuZHtmdW5jZGVzY30KLQotCi1cYmVnaW57ZnVuY2Rlc2N9e1F1ZXJ5VmFsdWV9e2tleSwgc3ViX2tleX0KLSBSZXRyaWV2ZXMgdGhlIHVubmFtZWQgdmFsdWUgZm9yIGEga2V5LCBhcyBhIHN0cmluZwotCi0gXHZhcntrZXl9IGlzIGFuIGFscmVhZHkgb3BlbiBrZXksIG9yIG9uZSBvZiB0aGUgcHJlZGVmaW5lZCAKLSBcY29uc3RhbnR7SEtFWV8qfSBjb25zdGFudHMuCi0KLSBcdmFye3N1Yl9rZXl9IGlzIGEgc3RyaW5nIHRoYXQgaG9sZHMgdGhlIG5hbWUgb2YgdGhlIHN1YmtleSB3aXRoIHdoaWNoIAotIHRoZSB2YWx1ZSBpcyBhc3NvY2lhdGVkLiAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgXGNvZGV7Tm9uZX0gb3IgZW1wdHksIHRoZSAKLSBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIHZhbHVlIHNldCBieSB0aGUgXGZ1bmN0aW9ue1NldFZhbHVlKCl9IG1ldGhvZCAKLSBmb3IgdGhlIGtleSBpZGVudGlmaWVkIGJ5IFx2YXJ7a2V5fS4KLQotIFZhbHVlcyBpbiB0aGUgcmVnaXN0cnkgaGF2ZSBuYW1lLCB0eXBlLCBhbmQgZGF0YSBjb21wb25lbnRzLiBUaGlzIAotIG1ldGhvZCByZXRyaWV2ZXMgdGhlIGRhdGEgZm9yIGEga2V5J3MgZmlyc3QgdmFsdWUgdGhhdCBoYXMgYSBOVUxMIG5hbWUuCi0gQnV0IHRoZSB1bmRlcmx5aW5nIEFQSSBjYWxsIGRvZXNuJ3QgcmV0dXJuIHRoZSB0eXBlLCBMYW1lIExhbWUgTGFtZSwKLSBETyBOT1QgVVNFIFRISVMhISEKLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue2Z1bmNkZXNjfXtRdWVyeVZhbHVlRXh9e2tleSwgdmFsdWVfbmFtZX0KLSAgUmV0cmlldmVzIHRoZSB0eXBlIGFuZCBkYXRhIGZvciBhIHNwZWNpZmllZCB2YWx1ZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCAKLSAgYW4gb3BlbiByZWdpc3RyeSBrZXkuCi0gIAotIFx2YXJ7a2V5fSBpcyBhbiBhbHJlYWR5IG9wZW4ga2V5LCBvciBvbmUgb2YgdGhlIHByZWRlZmluZWQgCi0gXGNvbnN0YW50e0hLRVlfKn0gY29uc3RhbnRzLgotCi0gXHZhcnt2YWx1ZV9uYW1lfSBpcyBhIHN0cmluZyBpbmRpY2F0aW5nIHRoZSB2YWx1ZSB0byBxdWVyeS4KLQotIFRoZSByZXN1bHQgaXMgYSB0dXBsZSBvZiAyIGl0ZW1zOgotCi0gXGJlZ2lue3RhYmxlaWl9e2N8cHszaW59fXtjb2RlfXtJbmRleH17TWVhbmluZ30KLSAgIFxsaW5laWl7MH17VGhlIHZhbHVlIG9mIHRoZSByZWdpc3RyeSBpdGVtLn0KLSAgIFxsaW5laWl7MX17QW4gaW50ZWdlciBnaXZpbmcgdGhlIHJlZ2lzdHJ5IHR5cGUgZm9yIHRoaXMgdmFsdWUufQotIFxlbmR7dGFibGVpaX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue2Z1bmNkZXNjfXtTYXZlS2V5fXtrZXksIGZpbGVfbmFtZX0KLSAgU2F2ZXMgdGhlIHNwZWNpZmllZCBrZXksIGFuZCBhbGwgaXRzIHN1YmtleXMgdG8gdGhlIHNwZWNpZmllZCBmaWxlLgotCi0gXHZhcntrZXl9IGlzIGFuIGFscmVhZHkgb3BlbiBrZXksIG9yIG9uZSBvZiB0aGUgcHJlZGVmaW5lZCAKLSBcY29uc3RhbnR7SEtFWV8qfSBjb25zdGFudHMuCi0KLSBcdmFye2ZpbGVfbmFtZX0gaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gc2F2ZSByZWdpc3RyeSBkYXRhIHRvLgotICBUaGlzIGZpbGUgY2Fubm90IGFscmVhZHkgZXhpc3QuIElmIHRoaXMgZmlsZW5hbWUgaW5jbHVkZXMgYW4gZXh0ZW5zaW9uLAotICBpdCBjYW5ub3QgYmUgdXNlZCBvbiBmaWxlIGFsbG9jYXRpb24gdGFibGUgKEZBVCkgZmlsZSBzeXN0ZW1zIGJ5IHRoZQotICBcbWV0aG9ke0xvYWRLZXkoKX0sIFxtZXRob2R7UmVwbGFjZUtleSgpfSBvciAKLSAgXG1ldGhvZHtSZXN0b3JlS2V5KCl9IG1ldGhvZHMuCi0KLSBJZiBcdmFye2tleX0gcmVwcmVzZW50cyBhIGtleSBvbiBhIHJlbW90ZSBjb21wdXRlciwgdGhlIHBhdGggCi0gZGVzY3JpYmVkIGJ5IFx2YXJ7ZmlsZV9uYW1lfSBpcyByZWxhdGl2ZSB0byB0aGUgcmVtb3RlIGNvbXB1dGVyLgotIFRoZSBjYWxsZXIgb2YgdGhpcyBtZXRob2QgbXVzdCBwb3NzZXNzIHRoZSBcY29uc3RhbnR7U2VCYWNrdXBQcml2aWxlZ2V9IAotIHNlY3VyaXR5IHByaXZpbGVnZS4gIE5vdGUgdGhhdCBwcml2aWxlZ2VzIGFyZSBkaWZmZXJlbnQgdGhhbiBwZXJtaXNzaW9ucyAKLSAtIHNlZSB0aGUgV2luMzIgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgotIAotIFRoaXMgZnVuY3Rpb24gcGFzc2VzIE5VTEwgZm9yIFx2YXJ7c2VjdXJpdHlfYXR0cmlidXRlc30gdG8gdGhlIEFQSS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue2Z1bmNkZXNjfXtTZXRWYWx1ZX17a2V5LCBzdWJfa2V5LCB0eXBlLCB2YWx1ZX0KLSBBc3NvY2lhdGVzIGEgdmFsdWUgd2l0aCBhIHNwZWNpZmllZCBrZXkuCi0gCi0gXHZhcntrZXl9IGlzIGFuIGFscmVhZHkgb3BlbiBrZXksIG9yIG9uZSBvZiB0aGUgcHJlZGVmaW5lZCAKLSBcY29uc3RhbnR7SEtFWV8qfSBjb25zdGFudHMuCi0KLSBcdmFye3N1Yl9rZXl9IGlzIGEgc3RyaW5nIHRoYXQgbmFtZXMgdGhlIHN1YmtleSB3aXRoIHdoaWNoIHRoZSB2YWx1ZSAKLSBpcyBhc3NvY2lhdGVkLgotIAotIFx2YXJ7dHlwZX0gaXMgYW4gaW50ZWdlciB0aGF0IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgZGF0YS4KLSBDdXJyZW50bHkgdGhpcyBtdXN0IGJlIFxjb25zdGFudHtSRUdfU1p9LCBtZWFuaW5nIG9ubHkgc3RyaW5ncyBhcmUKLSBzdXBwb3J0ZWQuICBVc2UgdGhlIFxmdW5jdGlvbntTZXRWYWx1ZUV4KCl9IGZ1bmN0aW9uIGZvciBzdXBwb3J0IGZvcgotIG90aGVyIGRhdGEgdHlwZXMuCi0gCi0gXHZhcnt2YWx1ZX0gaXMgYSBzdHJpbmcgdGhhdCBzcGVjaWZpZXMgdGhlIG5ldyB2YWx1ZS4KLQotIElmIHRoZSBrZXkgc3BlY2lmaWVkIGJ5IHRoZSBcdmFye3N1Yl9rZXl9IHBhcmFtZXRlciBkb2VzIG5vdCBleGlzdCwKLSB0aGUgU2V0VmFsdWUgZnVuY3Rpb24gY3JlYXRlcyBpdC4KLQotIFZhbHVlIGxlbmd0aHMgYXJlIGxpbWl0ZWQgYnkgYXZhaWxhYmxlIG1lbW9yeS4gTG9uZyB2YWx1ZXMgKG1vcmUgdGhhbgotIDIwNDggYnl0ZXMpIHNob3VsZCBiZSBzdG9yZWQgYXMgZmlsZXMgd2l0aCB0aGUgZmlsZW5hbWVzIHN0b3JlZCBpbgotIHRoZSBjb25maWd1cmF0aW9uIHJlZ2lzdHJ5LiAgVGhpcyBoZWxwcyB0aGUgcmVnaXN0cnkgcGVyZm9ybQotIGVmZmljaWVudGx5LgotCi0gVGhlIGtleSBpZGVudGlmaWVkIGJ5IHRoZSBcdmFye2tleX0gcGFyYW1ldGVyIG11c3QgaGF2ZSBiZWVuIAotIG9wZW5lZCB3aXRoIFxjb25zdGFudHtLRVlfU0VUX1ZBTFVFfSBhY2Nlc3MuCi1cZW5ke2Z1bmNkZXNjfQotCi0KLVxiZWdpbntmdW5jZGVzY317U2V0VmFsdWVFeH17a2V5LCB2YWx1ZV9uYW1lLCByZXNlcnZlZCwgdHlwZSwgdmFsdWV9Ci0gU3RvcmVzIGRhdGEgaW4gdGhlIHZhbHVlIGZpZWxkIG9mIGFuIG9wZW4gcmVnaXN0cnkga2V5LgotCi0gXHZhcntrZXl9IGlzIGFuIGFscmVhZHkgb3BlbiBrZXksIG9yIG9uZSBvZiB0aGUgcHJlZGVmaW5lZCAKLSBcY29uc3RhbnR7SEtFWV8qfSBjb25zdGFudHMuCi0KLSBcdmFye3ZhbHVlX25hbWV9IGlzIGEgc3RyaW5nIHRoYXQgbmFtZXMgdGhlIHN1YmtleSB3aXRoIHdoaWNoIHRoZSAKLSB2YWx1ZSBpcyBhc3NvY2lhdGVkLgotCi0gXHZhcnt0eXBlfSBpcyBhbiBpbnRlZ2VyIHRoYXQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBkYXRhLiAgCi0gVGhpcyBzaG91bGQgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIGRlZmluZWQgaW4gdGhpcyBtb2R1bGU6Ci0KLSBcYmVnaW57dGFibGVpaX17bHxwezNpbn19e2NvbnN0YW50fXtDb25zdGFudH17TWVhbmluZ30KLSAgIFxsaW5laWl7UkVHX0JJTkFSWX17QmluYXJ5IGRhdGEgaW4gYW55IGZvcm0ufQotICAgXGxpbmVpaXtSRUdfRFdPUkR9e0EgMzItYml0IG51bWJlci59Ci0gICBcbGluZWlpe1JFR19EV09SRF9MSVRUTEVfRU5ESUFOfXtBIDMyLWJpdCBudW1iZXIgaW4gbGl0dGxlLWVuZGlhbiBmb3JtYXQufQotICAgXGxpbmVpaXtSRUdfRFdPUkRfQklHX0VORElBTn17QSAzMi1iaXQgbnVtYmVyIGluIGJpZy1lbmRpYW4gZm9ybWF0Ln0KLSAgIFxsaW5laWl7UkVHX0VYUEFORF9TWn17TnVsbC10ZXJtaW5hdGVkIHN0cmluZyBjb250YWluaW5nIHJlZmVyZW5jZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gZW52aXJvbm1lbnQgdmFyaWFibGVzIChcc2FtcHtcJVBBVEhcJX0pLn0KLSAgIFxsaW5laWl7UkVHX0xJTkt9e0EgVW5pY29kZSBzeW1ib2xpYyBsaW5rLn0KLSAgIFxsaW5laWl7UkVHX01VTFRJX1NafXtBIHNlcXVlbmNlIG9mIG51bGwtdGVybWluYXRlZCBzdHJpbmdzLCAKLQl0ZXJtaW5hdGVkIGJ5IHR3byBudWxsIGNoYXJhY3RlcnMuICAoUHl0aG9uIGhhbmRsZXMgCi0JdGhpcyB0ZXJtaW5hdGlvbiBhdXRvbWF0aWNhbGx5Lil9Ci0gICBcbGluZWlpe1JFR19OT05FfXtObyBkZWZpbmVkIHZhbHVlIHR5cGUufQotICAgXGxpbmVpaXtSRUdfUkVTT1VSQ0VfTElTVH17QSBkZXZpY2UtZHJpdmVyIHJlc291cmNlIGxpc3QufQotICAgXGxpbmVpaXtSRUdfU1p9e0EgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy59Ci0gXGVuZHt0YWJsZWlpfQotCi0gXHZhcntyZXNlcnZlZH0gY2FuIGJlIGFueXRoaW5nIC0gemVybyBpcyBhbHdheXMgcGFzc2VkIHRvIHRoZSAKLSBBUEkuCi0KLSBcdmFye3ZhbHVlfSBpcyBhIHN0cmluZyB0aGF0IHNwZWNpZmllcyB0aGUgbmV3IHZhbHVlLgotCi0gVGhpcyBtZXRob2QgY2FuIGFsc28gc2V0IGFkZGl0aW9uYWwgdmFsdWUgYW5kIHR5cGUgaW5mb3JtYXRpb24gZm9yIHRoZQotIHNwZWNpZmllZCBrZXkuICBUaGUga2V5IGlkZW50aWZpZWQgYnkgdGhlIGtleSBwYXJhbWV0ZXIgbXVzdCBoYXZlIGJlZW4KLSBvcGVuZWQgd2l0aCBcY29uc3RhbnR7S0VZX1NFVF9WQUxVRX0gYWNjZXNzLgotCi0gVG8gb3BlbiB0aGUga2V5LCB1c2UgdGhlIFxmdW5jdGlvbntDcmVhdGVLZXlFeCgpfSBvciAKLSBcZnVuY3Rpb257T3BlbktleSgpfSBtZXRob2RzLgotCi0gVmFsdWUgbGVuZ3RocyBhcmUgbGltaXRlZCBieSBhdmFpbGFibGUgbWVtb3J5LiBMb25nIHZhbHVlcyAobW9yZSB0aGFuCi0gMjA0OCBieXRlcykgc2hvdWxkIGJlIHN0b3JlZCBhcyBmaWxlcyB3aXRoIHRoZSBmaWxlbmFtZXMgc3RvcmVkIGluCi0gdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0cnkuICBUaGlzIGhlbHBzIHRoZSByZWdpc3RyeSBwZXJmb3JtIGVmZmljaWVudGx5LgotXGVuZHtmdW5jZGVzY30KLQotCi0KLVxzdWJzZWN0aW9ue1JlZ2lzdHJ5IEhhbmRsZSBPYmplY3RzIFxsYWJlbHtoYW5kbGUtb2JqZWN0fX0KLQotIFRoaXMgb2JqZWN0IHdyYXBzIGEgV2luZG93cyBIS0VZIG9iamVjdCwgYXV0b21hdGljYWxseSBjbG9zaW5nIGl0IHdoZW4KLSB0aGUgb2JqZWN0IGlzIGRlc3Ryb3llZC4gIFRvIGd1YXJhbnRlZSBjbGVhbnVwLCB5b3UgY2FuIGNhbGwgZWl0aGVyCi0gdGhlIFxtZXRob2R7Q2xvc2UoKX0gbWV0aG9kIG9uIHRoZSBvYmplY3QsIG9yIHRoZSAKLSBcZnVuY3Rpb257Q2xvc2VLZXkoKX0gZnVuY3Rpb24uCi0KLSBBbGwgcmVnaXN0cnkgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIHJldHVybiBvbmUgb2YgdGhlc2Ugb2JqZWN0cy4KLQotIEFsbCByZWdpc3RyeSBmdW5jdGlvbnMgaW4gdGhpcyBtb2R1bGUgd2hpY2ggYWNjZXB0IGEgaGFuZGxlIG9iamVjdCAKLSBhbHNvIGFjY2VwdCBhbiBpbnRlZ2VyLCBob3dldmVyLCB1c2Ugb2YgdGhlIGhhbmRsZSBvYmplY3QgaXMgCi0gZW5jb3VyYWdlZC4KLSAKLSBIYW5kbGUgb2JqZWN0cyBwcm92aWRlIHNlbWFudGljcyBmb3IgXG1ldGhvZHtfX2Jvb2xfXygpfSAtIHRodXMKLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICBpZiBoYW5kbGU6Ci0gICAgICAgIHByaW50ICJZZXMiCi1cZW5ke3ZlcmJhdGltfQotIHdpbGwgcHJpbnQgXGNvZGV7WWVzfSBpZiB0aGUgaGFuZGxlIGlzIGN1cnJlbnRseSB2YWxpZCAoaGFzIG5vdCBiZWVuCi0gY2xvc2VkIG9yIGRldGFjaGVkKS4KLQotIFRoZSBvYmplY3QgYWxzbyBzdXBwb3J0IGNvbXBhcmlzb24gc2VtYW50aWNzLCBzbyBoYW5kbGUKLSBvYmplY3RzIHdpbGwgY29tcGFyZSB0cnVlIGlmIHRoZXkgYm90aCByZWZlcmVuY2UgdGhlIHNhbWUKLSB1bmRlcmx5aW5nIFdpbmRvd3MgaGFuZGxlIHZhbHVlLgotCi0gSGFuZGxlIG9iamVjdHMgY2FuIGJlIGNvbnZlcnRlZCB0byBhbiBpbnRlZ2VyIChlLmcuLCB1c2luZyB0aGUKLSBidWlsdGluIFxmdW5jdGlvbntpbnQoKX0gZnVuY3Rpb24pLCBpbiB3aGljaCBjYXNlIHRoZSB1bmRlcmx5aW5nCi0gV2luZG93cyBoYW5kbGUgdmFsdWUgaXMgcmV0dXJuZWQuICBZb3UgY2FuIGFsc28gdXNlIHRoZSAKLSBcbWV0aG9ke0RldGFjaCgpfSBtZXRob2QgdG8gcmV0dXJuIHRoZSBpbnRlZ2VyIGhhbmRsZSwgYW5kCi0gYWxzbyBkaXNjb25uZWN0IHRoZSBXaW5kb3dzIGhhbmRsZSBmcm9tIHRoZSBoYW5kbGUgb2JqZWN0LgotCi1cYmVnaW57bWV0aG9kZGVzY31bUHlIS0VZXXtDbG9zZX17fQotICBDbG9zZXMgdGhlIHVuZGVybHlpbmcgV2luZG93cyBoYW5kbGUuCi0KLSAgSWYgdGhlIGhhbmRsZSBpcyBhbHJlYWR5IGNsb3NlZCwgbm8gZXJyb3IgaXMgcmFpc2VkLgotXGVuZHttZXRob2RkZXNjfQotCi0KLVxiZWdpbnttZXRob2RkZXNjfVtQeUhLRVlde0RldGFjaH17fQotICBEZXRhY2hlcyB0aGUgV2luZG93cyBoYW5kbGUgZnJvbSB0aGUgaGFuZGxlIG9iamVjdC4KLQotIFRoZSByZXN1bHQgaXMgYW4gaW50ZWdlciAob3IgbG9uZyBvbiA2NCBiaXQgV2luZG93cykgdGhhdCBob2xkcwotIHRoZSB2YWx1ZSBvZiB0aGUgaGFuZGxlIGJlZm9yZSBpdCBpcyBkZXRhY2hlZC4gIElmIHRoZQotIGhhbmRsZSBpcyBhbHJlYWR5IGRldGFjaGVkIG9yIGNsb3NlZCwgdGhpcyB3aWxsIHJldHVybiB6ZXJvLgotCi0gQWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCB0aGUgaGFuZGxlIGlzIGVmZmVjdGl2ZWx5IGludmFsaWRhdGVkLAotIGJ1dCB0aGUgaGFuZGxlIGlzIG5vdCBjbG9zZWQuICBZb3Ugd291bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gCi0geW91IG5lZWQgdGhlIHVuZGVybHlpbmcgV2luMzIgaGFuZGxlIHRvIGV4aXN0IGJleW9uZCB0aGUgbGlmZXRpbWUgCi0gb2YgdGhlIGhhbmRsZSBvYmplY3QuCi1cZW5ke21ldGhvZGRlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYndpbnNvdW5kLnRleCBiL0RvYy9saWIvbGlid2luc291bmQudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjViMTVlLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlid2luc291bmQudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7d2luc291bmR9IC0tLQotICAgICAgICAgU291bmQtcGxheWluZyBpbnRlcmZhY2UgZm9yIFdpbmRvd3N9Ci0KLVxkZWNsYXJlbW9kdWxle2J1aWx0aW59e3dpbnNvdW5kfQotICBccGxhdGZvcm17V2luZG93c30KLVxtb2R1bGVzeW5vcHNpc3tBY2Nlc3MgdG8gdGhlIHNvdW5kLXBsYXlpbmcgbWFjaGluZXJ5IGZvciBXaW5kb3dzLn0KLVxtb2R1bGVhdXRob3J7VG9ieSBEaWNrZW5zb259e2h0cmQ5MEB6ZXBsZXIub3JnfQotXHNlY3Rpb25hdXRob3J7RnJlZCBMLiBEcmFrZSwgSnIufXtmZHJha2VAYWNtLm9yZ30KLQotXHZlcnNpb25hZGRlZHsxLjUuMn0KLQotVGhlIFxtb2R1bGV7d2luc291bmR9IG1vZHVsZSBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGJhc2ljCi1zb3VuZC1wbGF5aW5nIG1hY2hpbmVyeSBwcm92aWRlZCBieSBXaW5kb3dzIHBsYXRmb3Jtcy4gIEl0IGluY2x1ZGVzCi1mdW5jdGlvbnMgYW5kIHNldmVyYWwgY29uc3RhbnRzLgotCi0KLVxiZWdpbntmdW5jZGVzY317QmVlcH17ZnJlcXVlbmN5LCBkdXJhdGlvbn0KLSAgQmVlcCB0aGUgUEMncyBzcGVha2VyLgotICBUaGUgXHZhcntmcmVxdWVuY3l9IHBhcmFtZXRlciBzcGVjaWZpZXMgZnJlcXVlbmN5LCBpbiBoZXJ0eiwgb2YgdGhlCi0gIHNvdW5kLCBhbmQgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMzcgdGhyb3VnaCAzMiw3NjcuCi0gIFRoZSBcdmFye2R1cmF0aW9ufSBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoZQotICBzb3VuZCBzaG91bGQgbGFzdC4gIElmIHRoZSBzeXN0ZW0gaXMgbm90Ci0gIGFibGUgdG8gYmVlcCB0aGUgc3BlYWtlciwgXGV4Y2VwdGlvbntSdW50aW1lRXJyb3J9IGlzIHJhaXNlZC4KLSAgXG5vdGV7VW5kZXIgV2luZG93cyA5NSBhbmQgOTgsIHRoZSBXaW5kb3dzIFxjZnVuY3Rpb257QmVlcCgpfQotICBmdW5jdGlvbiBleGlzdHMgYnV0IGlzIHVzZWxlc3MgKGl0IGlnbm9yZXMgaXRzIGFyZ3VtZW50cykuICBJbiB0aGF0Ci0gIGNhc2UgUHl0aG9uIHNpbXVsYXRlcyBpdCB2aWEgZGlyZWN0IHBvcnQgbWFuaXB1bGF0aW9uIChhZGRlZCBpbiB2ZXJzaW9uCi0gIDIuMSkuICBJdCdzIHVua25vd24gd2hldGhlciB0aGF0IHdpbGwgd29yayBvbiBhbGwgc3lzdGVtcy59Ci0gIFx2ZXJzaW9uYWRkZWR7MS42fQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtQbGF5U291bmR9e3NvdW5kLCBmbGFnc30KLSAgQ2FsbCB0aGUgdW5kZXJseWluZyBcY2Z1bmN0aW9ue1BsYXlTb3VuZCgpfSBmdW5jdGlvbiBmcm9tIHRoZQotICBQbGF0Zm9ybSBBUEkuICBUaGUgXHZhcntzb3VuZH0gcGFyYW1ldGVyIG1heSBiZSBhIGZpbGVuYW1lLCBhdWRpbwotICBkYXRhIGFzIGEgc3RyaW5nLCBvciBcY29kZXtOb25lfS4gIEl0cyBpbnRlcnByZXRhdGlvbiBkZXBlbmRzIG9uIHRoZQotICB2YWx1ZSBvZiBcdmFye2ZsYWdzfSwgd2hpY2ggY2FuIGJlIGEgYml0LXdpc2UgT1JlZCBjb21iaW5hdGlvbiBvZgotICB0aGUgY29uc3RhbnRzIGRlc2NyaWJlZCBiZWxvdy4gIElmIHRoZSBzeXN0ZW0gaW5kaWNhdGVzIGFuIGVycm9yLAotICBcZXhjZXB0aW9ue1J1bnRpbWVFcnJvcn0gaXMgcmFpc2VkLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtNZXNzYWdlQmVlcH17XG9wdGlvbmFse3R5cGU9XGNvZGV7TUJfT0t9fX0KLSAgQ2FsbCB0aGUgdW5kZXJseWluZyBcY2Z1bmN0aW9ue01lc3NhZ2VCZWVwKCl9IGZ1bmN0aW9uIGZyb20gdGhlCi0gIFBsYXRmb3JtIEFQSS4gIFRoaXMgcGxheXMgYSBzb3VuZCBhcyBzcGVjaWZpZWQgaW4gdGhlIHJlZ2lzdHJ5LiAgVGhlCi0gIFx2YXJ7dHlwZX0gYXJndW1lbnQgc3BlY2lmaWVzIHdoaWNoIHNvdW5kIHRvIHBsYXk7IHBvc3NpYmxlIHZhbHVlcwotICBhcmUgXGNvZGV7LTF9LCBcY29kZXtNQl9JQ09OQVNURVJJU0t9LCBcY29kZXtNQl9JQ09ORVhDTEFNQVRJT059LAotICBcY29kZXtNQl9JQ09OSEFORH0sIFxjb2Rle01CX0lDT05RVUVTVElPTn0sIGFuZCBcY29kZXtNQl9PS30sIGFsbAotICBkZXNjcmliZWQgYmVsb3cuICBUaGUgdmFsdWUgXGNvZGV7LTF9IHByb2R1Y2VzIGEgYGBzaW1wbGUgYmVlcCcnOwotICB0aGlzIGlzIHRoZSBmaW5hbCBmYWxsYmFjayBpZiBhIHNvdW5kIGNhbm5vdCBiZSBwbGF5ZWQgb3RoZXJ3aXNlLgotICBcdmVyc2lvbmFkZGVkezIuM30KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317U05EX0ZJTEVOQU1FfQotICBUaGUgXHZhcntzb3VuZH0gcGFyYW1ldGVyIGlzIHRoZSBuYW1lIG9mIGEgV0FWIGZpbGUuCi0gIERvIG5vdCB1c2Ugd2l0aCBcY29uc3RhbnR7U05EX0FMSUFTfS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317U05EX0FMSUFTfQotICBUaGUgXHZhcntzb3VuZH0gcGFyYW1ldGVyIGlzIGEgc291bmQgYXNzb2NpYXRpb24gbmFtZSBmcm9tIHRoZQotICByZWdpc3RyeS4gIElmIHRoZSByZWdpc3RyeSBjb250YWlucyBubyBzdWNoIG5hbWUsIHBsYXkgdGhlIHN5c3RlbQotICBkZWZhdWx0IHNvdW5kIHVubGVzcyBcY29uc3RhbnR7U05EX05PREVGQVVMVH0gaXMgYWxzbyBzcGVjaWZpZWQuCi0gIElmIG5vIGRlZmF1bHQgc291bmQgaXMgcmVnaXN0ZXJlZCwgcmFpc2UgXGV4Y2VwdGlvbntSdW50aW1lRXJyb3J9LgotICBEbyBub3QgdXNlIHdpdGggXGNvbnN0YW50e1NORF9GSUxFTkFNRX0uCi0KLSAgQWxsIFdpbjMyIHN5c3RlbXMgc3VwcG9ydCBhdCBsZWFzdCB0aGUgZm9sbG93aW5nOyBtb3N0IHN5c3RlbXMgc3VwcG9ydAotICBtYW55IG1vcmU6Ci0KLVxiZWdpbnt0YWJsZWlpfXtsfGx9e2NvZGV9Ci0gICAgICAgICAgICAgICB7XGZ1bmN0aW9ue1BsYXlTb3VuZCgpfSBcdmFye25hbWV9fQotICAgICAgICAgICAgICAge0NvcnJlc3BvbmRpbmcgQ29udHJvbCBQYW5lbCBTb3VuZCBuYW1lfQotICBcbGluZWlpeydTeXN0ZW1Bc3Rlcmlzayd9ICAge0FzdGVyaXNrfQotICBcbGluZWlpeydTeXN0ZW1FeGNsYW1hdGlvbid9e0V4Y2xhbWF0aW9ufQotICBcbGluZWlpeydTeXN0ZW1FeGl0J30gICAgICAge0V4aXQgV2luZG93c30KLSAgXGxpbmVpaXsnU3lzdGVtSGFuZCd9ICAgICAgIHtDcml0aWNhbCBTdG9wfQotICBcbGluZWlpeydTeXN0ZW1RdWVzdGlvbid9ICAge1F1ZXN0aW9ufQotXGVuZHt0YWJsZWlpfQotCi0gIEZvciBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgd2luc291bmQKLSMgUGxheSBXaW5kb3dzIGV4aXQgc291bmQuCi13aW5zb3VuZC5QbGF5U291bmQoIlN5c3RlbUV4aXQiLCB3aW5zb3VuZC5TTkRfQUxJQVMpCi0KLSMgUHJvYmFibHkgcGxheSBXaW5kb3dzIGRlZmF1bHQgc291bmQsIGlmIGFueSBpcyByZWdpc3RlcmVkIChiZWNhdXNlCi0jICIqIiBwcm9iYWJseSBpc24ndCB0aGUgcmVnaXN0ZXJlZCBuYW1lIG9mIGFueSBzb3VuZCkuCi13aW5zb3VuZC5QbGF5U291bmQoIioiLCB3aW5zb3VuZC5TTkRfQUxJQVMpCi1cZW5ke3ZlcmJhdGltfQotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtTTkRfTE9PUH0KLSAgUGxheSB0aGUgc291bmQgcmVwZWF0ZWRseS4gIFRoZSBcY29uc3RhbnR7U05EX0FTWU5DfSBmbGFnIG11c3QgYWxzbwotICBiZSB1c2VkIHRvIGF2b2lkIGJsb2NraW5nLiAgQ2Fubm90IGJlIHVzZWQgd2l0aCBcY29uc3RhbnR7U05EX01FTU9SWX0uCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1NORF9NRU1PUll9Ci0gIFRoZSBcdmFye3NvdW5kfSBwYXJhbWV0ZXIgdG8gXGZ1bmN0aW9ue1BsYXlTb3VuZCgpfSBpcyBhIG1lbW9yeQotICBpbWFnZSBvZiBhIFdBViBmaWxlLCBhcyBhIHN0cmluZy4KLQotICBcbm90ZXtUaGlzIG1vZHVsZSBkb2VzIG5vdCBzdXBwb3J0IHBsYXlpbmcgZnJvbSBhIG1lbW9yeQotICBpbWFnZSBhc3luY2hyb25vdXNseSwgc28gYSBjb21iaW5hdGlvbiBvZiB0aGlzIGZsYWcgYW5kCi0gIFxjb25zdGFudHtTTkRfQVNZTkN9IHdpbGwgcmFpc2UgXGV4Y2VwdGlvbntSdW50aW1lRXJyb3J9Ln0KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317U05EX1BVUkdFfQotICBTdG9wIHBsYXlpbmcgYWxsIGluc3RhbmNlcyBvZiB0aGUgc3BlY2lmaWVkIHNvdW5kLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtTTkRfQVNZTkN9Ci0gIFJldHVybiBpbW1lZGlhdGVseSwgYWxsb3dpbmcgc291bmRzIHRvIHBsYXkgYXN5bmNocm9ub3VzbHkuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1NORF9OT0RFRkFVTFR9Ci0gIElmIHRoZSBzcGVjaWZpZWQgc291bmQgY2Fubm90IGJlIGZvdW5kLCBkbyBub3QgcGxheSB0aGUgc3lzdGVtIGRlZmF1bHQKLSAgc291bmQuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1NORF9OT1NUT1B9Ci0gIERvIG5vdCBpbnRlcnJ1cHQgc291bmRzIGN1cnJlbnRseSBwbGF5aW5nLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtTTkRfTk9XQUlUfQotICBSZXR1cm4gaW1tZWRpYXRlbHkgaWYgdGhlIHNvdW5kIGRyaXZlciBpcyBidXN5LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtNQl9JQ09OQVNURVJJU0t9Ci0gIFBsYXkgdGhlIFxjb2Rle1N5c3RlbURlZmF1bHR9IHNvdW5kLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtNQl9JQ09ORVhDTEFNQVRJT059Ci0gIFBsYXkgdGhlIFxjb2Rle1N5c3RlbUV4Y2xhbWF0aW9ufSBzb3VuZC4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317TUJfSUNPTkhBTkR9Ci0gIFBsYXkgdGhlIFxjb2Rle1N5c3RlbUhhbmR9IHNvdW5kLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtNQl9JQ09OUVVFU1RJT059Ci0gIFBsYXkgdGhlIFxjb2Rle1N5c3RlbVF1ZXN0aW9ufSBzb3VuZC4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317TUJfT0t9Ci0gIFBsYXkgdGhlIFxjb2Rle1N5c3RlbURlZmF1bHR9IHNvdW5kLgotXGVuZHtkYXRhZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlid3NnaXJlZi50ZXggYi9Eb2MvbGliL2xpYndzZ2lyZWYudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzN2RlZDlmLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlid3NnaXJlZi50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw3ODIgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXt3c2dpcmVmfSAtLS0gV1NHSSBVdGlsaXRpZXMgYW5kIFJlZmVyZW5jZQotSW1wbGVtZW50YXRpb259Ci1cZGVjbGFyZW1vZHVsZXt9e3dzZ2lyZWZ9Ci1cbW9kdWxlYXV0aG9ye1BoaWxsaXAgSi4gRWJ5fXtwamVAdGVsZWNvbW11bml0eS5jb219Ci1cc2VjdGlvbmF1dGhvcntQaGlsbGlwIEouIEVieX17cGplQHRlbGVjb21tdW5pdHkuY29tfQotXG1vZHVsZXN5bm9wc2lze1dTR0kgVXRpbGl0aWVzIGFuZCBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb259Ci0KLVx2ZXJzaW9uYWRkZWR7Mi41fQotCi1UaGUgV2ViIFNlcnZlciBHYXRld2F5IEludGVyZmFjZSAoV1NHSSkgaXMgYSBzdGFuZGFyZCBpbnRlcmZhY2UKLWJldHdlZW4gd2ViIHNlcnZlciBzb2Z0d2FyZSBhbmQgd2ViIGFwcGxpY2F0aW9ucyB3cml0dGVuIGluIFB5dGhvbi4KLUhhdmluZyBhIHN0YW5kYXJkIGludGVyZmFjZSBtYWtlcyBpdCBlYXN5IHRvIHVzZSBhbiBhcHBsaWNhdGlvbgotdGhhdCBzdXBwb3J0cyBXU0dJIHdpdGggYSBudW1iZXIgb2YgZGlmZmVyZW50IHdlYiBzZXJ2ZXJzLgotCi1Pbmx5IGF1dGhvcnMgb2Ygd2ViIHNlcnZlcnMgYW5kIHByb2dyYW1taW5nIGZyYW1ld29ya3MgbmVlZCB0byBrbm93Ci1ldmVyeSBkZXRhaWwgYW5kIGNvcm5lciBjYXNlIG9mIHRoZSBXU0dJIGRlc2lnbi4gIFlvdSBkb24ndCBuZWVkIHRvCi11bmRlcnN0YW5kIGV2ZXJ5IGRldGFpbCBvZiBXU0dJIGp1c3QgdG8gaW5zdGFsbCBhIFdTR0kgYXBwbGljYXRpb24gb3IKLXRvIHdyaXRlIGEgd2ViIGFwcGxpY2F0aW9uIHVzaW5nIGFuIGV4aXN0aW5nIGZyYW1ld29yay4KLQotXG1vZHVsZXt3c2dpcmVmfSBpcyBhIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgV1NHSSBzcGVjaWZpY2F0aW9uCi10aGF0IGNhbiBiZSB1c2VkIHRvIGFkZCBXU0dJIHN1cHBvcnQgdG8gYSB3ZWIgc2VydmVyIG9yIGZyYW1ld29yay4gIEl0Ci1wcm92aWRlcyB1dGlsaXRpZXMgZm9yIG1hbmlwdWxhdGluZyBXU0dJIGVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQKLXJlc3BvbnNlIGhlYWRlcnMsIGJhc2UgY2xhc3NlcyBmb3IgaW1wbGVtZW50aW5nIFdTR0kgc2VydmVycywgYSBkZW1vCi1IVFRQIHNlcnZlciB0aGF0IHNlcnZlcyBXU0dJIGFwcGxpY2F0aW9ucywgYW5kIGEgdmFsaWRhdGlvbiB0b29sIHRoYXQKLWNoZWNrcyBXU0dJIHNlcnZlcnMgYW5kIGFwcGxpY2F0aW9ucyBmb3IgY29uZm9ybWFuY2UgdG8gdGhlCi1XU0dJIHNwZWNpZmljYXRpb24gKFxwZXB7MzMzfSkuCi0KLSUgWFhYIElmIHlvdSdyZSBqdXN0IHRyeWluZyB0byB3cml0ZSBhIHdlYiBhcHBsaWNhdGlvbi4uLgotCi1TZWUgXHVybHtodHRwOi8vd3d3LndzZ2kub3JnfSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBXU0dJLAotYW5kIGxpbmtzIHRvIHR1dG9yaWFscyBhbmQgb3RoZXIgcmVzb3VyY2VzLgotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi1cc3Vic2VjdGlvbntcbW9kdWxle3dzZ2lyZWYudXRpbH0gLS0gV1NHSSBlbnZpcm9ubWVudCB1dGlsaXRpZXN9Ci1cZGVjbGFyZW1vZHVsZXt9e3dzZ2lyZWYudXRpbH0KLQotVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSB2YXJpZXR5IG9mIHV0aWxpdHkgZnVuY3Rpb25zIGZvciB3b3JraW5nIHdpdGgKLVdTR0kgZW52aXJvbm1lbnRzLiAgQSBXU0dJIGVudmlyb25tZW50IGlzIGEgZGljdGlvbmFyeSBjb250YWluaW5nCi1IVFRQIHJlcXVlc3QgdmFyaWFibGVzIGFzIGRlc2NyaWJlZCBpbiBccGVwezMzM30uICBBbGwgb2YgdGhlIGZ1bmN0aW9ucwotdGFraW5nIGFuIFx2YXJ7ZW52aXJvbn0gcGFyYW1ldGVyIGV4cGVjdCBhIFdTR0ktY29tcGxpYW50IGRpY3Rpb25hcnkgdG8KLWJlIHN1cHBsaWVkOyBwbGVhc2Ugc2VlIFxwZXB7MzMzfSBmb3IgYSBkZXRhaWxlZCBzcGVjaWZpY2F0aW9uLgotCi1cYmVnaW57ZnVuY2Rlc2N9e2d1ZXNzX3NjaGVtZX17ZW52aXJvbn0KLVJldHVybiBhIGd1ZXNzIGZvciB3aGV0aGVyIFxjb2Rle3dzZ2kudXJsX3NjaGVtZX0gc2hvdWxkIGJlIGBgaHR0cCcnIG9yCi1gYGh0dHBzJycsIGJ5IGNoZWNraW5nIGZvciBhIFxjb2Rle0hUVFBTfSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpbiB0aGUKLVx2YXJ7ZW52aXJvbn0gZGljdGlvbmFyeS4gIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBzdHJpbmcuCi0KLVRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIHdoZW4gY3JlYXRpbmcgYSBnYXRld2F5IHRoYXQgd3JhcHMgQ0dJIG9yIGEKLUNHSS1saWtlIHByb3RvY29sIHN1Y2ggYXMgRmFzdENHSS4gIFR5cGljYWxseSwgc2VydmVycyBwcm92aWRpbmcgc3VjaAotcHJvdG9jb2xzIHdpbGwgaW5jbHVkZSBhIFxjb2Rle0hUVFBTfSB2YXJpYWJsZSB3aXRoIGEgdmFsdWUgb2YgYGAxJycKLWBgeWVzJycsIG9yIGBgb24nJyB3aGVuIGEgcmVxdWVzdCBpcyByZWNlaXZlZCB2aWEgU1NMLiAgU28sIHRoaXMKLWZ1bmN0aW9uIHJldHVybnMgYGBodHRwcycnIGlmIHN1Y2ggYSB2YWx1ZSBpcyBmb3VuZCwgYW5kIGBgaHR0cCcnCi1vdGhlcndpc2UuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3JlcXVlc3RfdXJpfXtlbnZpcm9uIFxvcHRpb25hbHssIGluY2x1ZGVfcXVlcnk9MX19Ci1SZXR1cm4gdGhlIGZ1bGwgcmVxdWVzdCBVUkksIG9wdGlvbmFsbHkgaW5jbHVkaW5nIHRoZSBxdWVyeSBzdHJpbmcsCi11c2luZyB0aGUgYWxnb3JpdGhtIGZvdW5kIGluIHRoZSBgYFVSTCBSZWNvbnN0cnVjdGlvbicnIHNlY3Rpb24gb2YKLVxwZXB7MzMzfS4gIElmIFx2YXJ7aW5jbHVkZV9xdWVyeX0gaXMgZmFsc2UsIHRoZSBxdWVyeSBzdHJpbmcgaXMKLW5vdCBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIFVSSS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317YXBwbGljYXRpb25fdXJpfXtlbnZpcm9ufQotU2ltaWxhciB0byBcZnVuY3Rpb257cmVxdWVzdF91cml9LCBleGNlcHQgdGhhdCB0aGUgXGNvZGV7UEFUSF9JTkZPfSBhbmQKLVxjb2Rle1FVRVJZX1NUUklOR30gdmFyaWFibGVzIGFyZSBpZ25vcmVkLiAgVGhlIHJlc3VsdCBpcyB0aGUgYmFzZSBVUkkKLW9mIHRoZSBhcHBsaWNhdGlvbiBvYmplY3QgYWRkcmVzc2VkIGJ5IHRoZSByZXF1ZXN0LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzaGlmdF9wYXRoX2luZm99e2Vudmlyb259Ci1TaGlmdCBhIHNpbmdsZSBuYW1lIGZyb20gXGNvZGV7UEFUSF9JTkZPfSB0byBcY29kZXtTQ1JJUFRfTkFNRX0gYW5kCi1yZXR1cm4gdGhlIG5hbWUuICBUaGUgXHZhcntlbnZpcm9ufSBkaWN0aW9uYXJ5IGlzIFxlbXBoe21vZGlmaWVkfQotaW4tcGxhY2U7IHVzZSBhIGNvcHkgaWYgeW91IG5lZWQgdG8ga2VlcCB0aGUgb3JpZ2luYWwgXGNvZGV7UEFUSF9JTkZPfQotb3IgXGNvZGV7U0NSSVBUX05BTUV9IGludGFjdC4KLQotSWYgdGhlcmUgYXJlIG5vIHJlbWFpbmluZyBwYXRoIHNlZ21lbnRzIGluIFxjb2Rle1BBVEhfSU5GT30sIFxjb2Rle05vbmV9Ci1pcyByZXR1cm5lZC4KLQotVHlwaWNhbGx5LCB0aGlzIHJvdXRpbmUgaXMgdXNlZCB0byBwcm9jZXNzIGVhY2ggcG9ydGlvbiBvZiBhIHJlcXVlc3QKLVVSSSBwYXRoLCBmb3IgZXhhbXBsZSB0byB0cmVhdCB0aGUgcGF0aCBhcyBhIHNlcmllcyBvZiBkaWN0aW9uYXJ5IGtleXMuCi1UaGlzIHJvdXRpbmUgbW9kaWZpZXMgdGhlIHBhc3NlZC1pbiBlbnZpcm9ubWVudCB0byBtYWtlIGl0IHN1aXRhYmxlIGZvcgotaW52b2tpbmcgYW5vdGhlciBXU0dJIGFwcGxpY2F0aW9uIHRoYXQgaXMgbG9jYXRlZCBhdCB0aGUgdGFyZ2V0IFVSSS4KLUZvciBleGFtcGxlLCBpZiB0aGVyZSBpcyBhIFdTR0kgYXBwbGljYXRpb24gYXQgXGNvZGV7L2Zvb30sIGFuZCB0aGUKLXJlcXVlc3QgVVJJIHBhdGggaXMgXGNvZGV7L2Zvby9iYXIvYmF6fSwgYW5kIHRoZSBXU0dJIGFwcGxpY2F0aW9uIGF0Ci1cY29kZXsvZm9vfSBjYWxscyBcZnVuY3Rpb257c2hpZnRfcGF0aF9pbmZvfSwgaXQgd2lsbCByZWNlaXZlIHRoZSBzdHJpbmcKLWBgYmFyJycsIGFuZCB0aGUgZW52aXJvbm1lbnQgd2lsbCBiZSB1cGRhdGVkIHRvIGJlIHN1aXRhYmxlIGZvciBwYXNzaW5nCi10byBhIFdTR0kgYXBwbGljYXRpb24gYXQgXGNvZGV7L2Zvby9iYXJ9LiAgVGhhdCBpcywgXGNvZGV7U0NSSVBUX05BTUV9Ci13aWxsIGNoYW5nZSBmcm9tIFxjb2Rley9mb299IHRvIFxjb2Rley9mb28vYmFyfSwgYW5kIFxjb2Rle1BBVEhfSU5GT30KLXdpbGwgY2hhbmdlIGZyb20gXGNvZGV7L2Jhci9iYXp9IHRvIFxjb2Rley9iYXp9LgotCi1XaGVuIFxjb2Rle1BBVEhfSU5GT30gaXMganVzdCBhIGBgLycnLCB0aGlzIHJvdXRpbmUgcmV0dXJucyBhbiBlbXB0eQotc3RyaW5nIGFuZCBhcHBlbmRzIGEgdHJhaWxpbmcgc2xhc2ggdG8gXGNvZGV7U0NSSVBUX05BTUV9LCBldmVuIHRob3VnaAotZW1wdHkgcGF0aCBzZWdtZW50cyBhcmUgbm9ybWFsbHkgaWdub3JlZCwgYW5kIFxjb2Rle1NDUklQVF9OQU1FfSBkb2Vzbid0Ci1ub3JtYWxseSBlbmQgaW4gYSBzbGFzaC4gIFRoaXMgaXMgaW50ZW50aW9uYWwgYmVoYXZpb3IsIHRvIGVuc3VyZSB0aGF0Ci1hbiBhcHBsaWNhdGlvbiBjYW4gdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFVSSXMgZW5kaW5nIGluIFxjb2Rley94fQotZnJvbSBvbmVzIGVuZGluZyBpbiBcY29kZXsveC99IHdoZW4gdXNpbmcgdGhpcyByb3V0aW5lIHRvIGRvIG9iamVjdAotdHJhdmVyc2FsLgotCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NldHVwX3Rlc3RpbmdfZGVmYXVsdHN9e2Vudmlyb259Ci1VcGRhdGUgXHZhcntlbnZpcm9ufSB3aXRoIHRyaXZpYWwgZGVmYXVsdHMgZm9yIHRlc3RpbmcgcHVycG9zZXMuCi0KLVRoaXMgcm91dGluZSBhZGRzIHZhcmlvdXMgcGFyYW1ldGVycyByZXF1aXJlZCBmb3IgV1NHSSwgaW5jbHVkaW5nCi1cY29kZXtIVFRQX0hPU1R9LCBcY29kZXtTRVJWRVJfTkFNRX0sIFxjb2Rle1NFUlZFUl9QT1JUfSwKLVxjb2Rle1JFUVVFU1RfTUVUSE9EfSwgXGNvZGV7U0NSSVBUX05BTUV9LCBcY29kZXtQQVRIX0lORk99LCBhbmQgYWxsIG9mCi10aGUgXHBlcHszMzN9LWRlZmluZWQgXGNvZGV7d3NnaS4qfSB2YXJpYWJsZXMuICBJdCBvbmx5IHN1cHBsaWVzIGRlZmF1bHQKLXZhbHVlcywgYW5kIGRvZXMgbm90IHJlcGxhY2UgYW55IGV4aXN0aW5nIHNldHRpbmdzIGZvciB0aGVzZSB2YXJpYWJsZXMuCi0KLVRoaXMgcm91dGluZSBpcyBpbnRlbmRlZCB0byBtYWtlIGl0IGVhc2llciBmb3IgdW5pdCB0ZXN0cyBvZiBXU0dJCi1zZXJ2ZXJzIGFuZCBhcHBsaWNhdGlvbnMgdG8gc2V0IHVwIGR1bW15IGVudmlyb25tZW50cy4gIEl0IHNob3VsZCBOT1QKLWJlIHVzZWQgYnkgYWN0dWFsIFdTR0kgc2VydmVycyBvciBhcHBsaWNhdGlvbnMsIHNpbmNlIHRoZSBkYXRhIGlzIGZha2UhCi1cZW5ke2Z1bmNkZXNjfQotCi0KLQotSW4gYWRkaXRpb24gdG8gdGhlIGVudmlyb25tZW50IGZ1bmN0aW9ucyBhYm92ZSwgdGhlCi1cbW9kdWxle3dzZ2lyZWYudXRpbH0gbW9kdWxlIGFsc28gcHJvdmlkZXMgdGhlc2UgbWlzY2VsbGFuZW91cwotdXRpbGl0aWVzOgotCi1cYmVnaW57ZnVuY2Rlc2N9e2lzX2hvcF9ieV9ob3B9e2hlYWRlcl9uYW1lfQotUmV0dXJuIHRydWUgaWYgJ2hlYWRlcl9uYW1lJyBpcyBhbiBIVFRQLzEuMSBgYEhvcC1ieS1Ib3AnJyBoZWFkZXIsIGFzCi1kZWZpbmVkIGJ5IFxyZmN7MjYxNn0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtGaWxlV3JhcHBlcn17ZmlsZWxpa2UgXG9wdGlvbmFseywgYmxrc2l6ZT04MTkyfX0KLUEgd3JhcHBlciB0byBjb252ZXJ0IGEgZmlsZS1saWtlIG9iamVjdCB0byBhbiBpdGVyYXRvci4gIFRoZSByZXN1bHRpbmcKLW9iamVjdHMgc3VwcG9ydCBib3RoIFxtZXRob2R7X19nZXRpdGVtX199IGFuZCBcbWV0aG9ke19faXRlcl9ffQotaXRlcmF0aW9uIHN0eWxlcywgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBQeXRob24gMi4xIGFuZCBKeXRob24uCi1BcyB0aGUgb2JqZWN0IGlzIGl0ZXJhdGVkIG92ZXIsIHRoZSBvcHRpb25hbCBcdmFye2Jsa3NpemV9IHBhcmFtZXRlcgotd2lsbCBiZSByZXBlYXRlZGx5IHBhc3NlZCB0byB0aGUgXHZhcntmaWxlbGlrZX0gb2JqZWN0J3MgXG1ldGhvZHtyZWFkKCl9Ci1tZXRob2QgdG8gb2J0YWluIHN0cmluZ3MgdG8geWllbGQuICBXaGVuIFxtZXRob2R7cmVhZCgpfSByZXR1cm5zIGFuCi1lbXB0eSBzdHJpbmcsIGl0ZXJhdGlvbiBpcyBlbmRlZCBhbmQgaXMgbm90IHJlc3VtYWJsZS4KLQotSWYgXHZhcntmaWxlbGlrZX0gaGFzIGEgXG1ldGhvZHtjbG9zZSgpfSBtZXRob2QsIHRoZSByZXR1cm5lZCBvYmplY3QKLXdpbGwgYWxzbyBoYXZlIGEgXG1ldGhvZHtjbG9zZSgpfSBtZXRob2QsIGFuZCBpdCB3aWxsIGludm9rZSB0aGUKLVx2YXJ7ZmlsZWxpa2V9IG9iamVjdCdzIFxtZXRob2R7Y2xvc2UoKX0gbWV0aG9kIHdoZW4gY2FsbGVkLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLVxzdWJzZWN0aW9ue1xtb2R1bGV7d3NnaXJlZi5oZWFkZXJzfSAtLSBXU0dJIHJlc3BvbnNlIGhlYWRlciB0b29sc30KLVxkZWNsYXJlbW9kdWxle317d3NnaXJlZi5oZWFkZXJzfQotCi1UaGlzIG1vZHVsZSBwcm92aWRlcyBhIHNpbmdsZSBjbGFzcywgXGNsYXNze0hlYWRlcnN9LCBmb3IgY29udmVuaWVudAotbWFuaXB1bGF0aW9uIG9mIFdTR0kgcmVzcG9uc2UgaGVhZGVycyB1c2luZyBhIG1hcHBpbmctbGlrZSBpbnRlcmZhY2UuCi0KLVxiZWdpbntjbGFzc2Rlc2N9e0hlYWRlcnN9e2hlYWRlcnN9Ci1DcmVhdGUgYSBtYXBwaW5nLWxpa2Ugb2JqZWN0IHdyYXBwaW5nIFx2YXJ7aGVhZGVyc30sIHdoaWNoIG11c3QgYmUgYQotbGlzdCBvZiBoZWFkZXIgbmFtZS92YWx1ZSB0dXBsZXMgYXMgZGVzY3JpYmVkIGluIFxwZXB7MzMzfS4gIEFueSBjaGFuZ2VzCi1tYWRlIHRvIHRoZSBuZXcgXGNsYXNze0hlYWRlcnN9IG9iamVjdCB3aWxsIGRpcmVjdGx5IHVwZGF0ZSB0aGUKLVx2YXJ7aGVhZGVyc30gbGlzdCBpdCB3YXMgY3JlYXRlZCB3aXRoLgotCi1cY2xhc3N7SGVhZGVyc30gb2JqZWN0cyBzdXBwb3J0IHR5cGljYWwgbWFwcGluZyBvcGVyYXRpb25zIGluY2x1ZGluZwotXG1ldGhvZHtfX2dldGl0ZW1fX30sIFxtZXRob2R7Z2V0fSwgXG1ldGhvZHtfX3NldGl0ZW1fX30sCi1cbWV0aG9ke3NldGRlZmF1bHR9LCBcbWV0aG9ke19fZGVsaXRlbV9ffSwgXG1ldGhvZHtfX2NvbnRhaW5zX199IGFuZAotXG1ldGhvZHtoYXNfa2V5fS4gIEZvciBlYWNoIG9mIHRoZXNlIG1ldGhvZHMsIHRoZSBrZXkgaXMgdGhlIGhlYWRlciBuYW1lCi0odHJlYXRlZCBjYXNlLWluc2Vuc2l0aXZlbHkpLCBhbmQgdGhlIHZhbHVlIGlzIHRoZSBmaXJzdCB2YWx1ZQotYXNzb2NpYXRlZCB3aXRoIHRoYXQgaGVhZGVyIG5hbWUuICBTZXR0aW5nIGEgaGVhZGVyIGRlbGV0ZXMgYW55IGV4aXN0aW5nCi12YWx1ZXMgZm9yIHRoYXQgaGVhZGVyLCB0aGVuIGFkZHMgYSBuZXcgdmFsdWUgYXQgdGhlIGVuZCBvZiB0aGUgd3JhcHBlZAotaGVhZGVyIGxpc3QuICBIZWFkZXJzJyBleGlzdGluZyBvcmRlciBpcyBnZW5lcmFsbHkgbWFpbnRhaW5lZCwgd2l0aCBuZXcKLWhlYWRlcnMgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgd3JhcHBlZCBsaXN0LgotCi1Vbmxpa2UgYSBkaWN0aW9uYXJ5LCBcY2xhc3N7SGVhZGVyc30gb2JqZWN0cyBkbyBub3QgcmFpc2UgYW4gZXJyb3Igd2hlbgoteW91IHRyeSB0byBnZXQgb3IgZGVsZXRlIGEga2V5IHRoYXQgaXNuJ3QgaW4gdGhlIHdyYXBwZWQgaGVhZGVyIGxpc3QuCi1HZXR0aW5nIGEgbm9uZXhpc3RlbnQgaGVhZGVyIGp1c3QgcmV0dXJucyBcY29kZXtOb25lfSwgYW5kIGRlbGV0aW5nCi1hIG5vbmV4aXN0ZW50IGhlYWRlciBkb2VzIG5vdGhpbmcuCi0KLVxjbGFzc3tIZWFkZXJzfSBvYmplY3RzIGFsc28gc3VwcG9ydCBcbWV0aG9ke2tleXMoKX0sIFxtZXRob2R7dmFsdWVzKCl9LAotYW5kIFxtZXRob2R7aXRlbXMoKX0gbWV0aG9kcy4gIFRoZSBsaXN0cyByZXR1cm5lZCBieSBcbWV0aG9ke2tleXMoKX0KLWFuZCBcbWV0aG9ke2l0ZW1zKCl9IGNhbiBpbmNsdWRlIHRoZSBzYW1lIGtleSBtb3JlIHRoYW4gb25jZSBpZiB0aGVyZQotaXMgYSBtdWx0aS12YWx1ZWQgaGVhZGVyLiAgVGhlIFxjb2Rle2xlbigpfSBvZiBhIFxjbGFzc3tIZWFkZXJzfSBvYmplY3QKLWlzIHRoZSBzYW1lIGFzIHRoZSBsZW5ndGggb2YgaXRzIFxtZXRob2R7aXRlbXMoKX0sIHdoaWNoIGlzIHRoZSBzYW1lCi1hcyB0aGUgbGVuZ3RoIG9mIHRoZSB3cmFwcGVkIGhlYWRlciBsaXN0LiAgSW4gZmFjdCwgdGhlIFxtZXRob2R7aXRlbXMoKX0KLW1ldGhvZCBqdXN0IHJldHVybnMgYSBjb3B5IG9mIHRoZSB3cmFwcGVkIGhlYWRlciBsaXN0LgotCi1DYWxsaW5nIFxjb2Rle3N0cigpfSBvbiBhIFxjbGFzc3tIZWFkZXJzfSBvYmplY3QgcmV0dXJucyBhIGZvcm1hdHRlZAotc3RyaW5nIHN1aXRhYmxlIGZvciB0cmFuc21pc3Npb24gYXMgSFRUUCByZXNwb25zZSBoZWFkZXJzLiAgRWFjaCBoZWFkZXIKLWlzIHBsYWNlZCBvbiBhIGxpbmUgd2l0aCBpdHMgdmFsdWUsIHNlcGFyYXRlZCBieSBhIGNvbG9uIGFuZCBhIHNwYWNlLgotRWFjaCBsaW5lIGlzIHRlcm1pbmF0ZWQgYnkgYSBjYXJyaWFnZSByZXR1cm4gYW5kIGxpbmUgZmVlZCwgYW5kIHRoZQotc3RyaW5nIGlzIHRlcm1pbmF0ZWQgd2l0aCBhIGJsYW5rIGxpbmUuCi0KLUluIGFkZGl0aW9uIHRvIHRoZWlyIG1hcHBpbmcgaW50ZXJmYWNlIGFuZCBmb3JtYXR0aW5nIGZlYXR1cmVzLAotXGNsYXNze0hlYWRlcnN9IG9iamVjdHMgYWxzbyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBmb3IgcXVlcnlpbmcKLWFuZCBhZGRpbmcgbXVsdGktdmFsdWVkIGhlYWRlcnMsIGFuZCBmb3IgYWRkaW5nIGhlYWRlcnMgd2l0aCBNSU1FCi1wYXJhbWV0ZXJzOgotCi1cYmVnaW57bWV0aG9kZGVzY317Z2V0X2FsbH17bmFtZX0KLVJldHVybiBhIGxpc3Qgb2YgYWxsIHRoZSB2YWx1ZXMgZm9yIHRoZSBuYW1lZCBoZWFkZXIuCi0KLVRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgc29ydGVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhcmVkIGluIHRoZQotb3JpZ2luYWwgaGVhZGVyIGxpc3Qgb3Igd2VyZSBhZGRlZCB0byB0aGlzIGluc3RhbmNlLCBhbmQgbWF5IGNvbnRhaW4KLWR1cGxpY2F0ZXMuICBBbnkgZmllbGRzIGRlbGV0ZWQgYW5kIHJlLWluc2VydGVkIGFyZSBhbHdheXMgYXBwZW5kZWQgdG8KLXRoZSBoZWFkZXIgbGlzdC4gIElmIG5vIGZpZWxkcyBleGlzdCB3aXRoIHRoZSBnaXZlbiBuYW1lLCByZXR1cm5zIGFuCi1lbXB0eSBsaXN0LgotXGVuZHttZXRob2RkZXNjfQotCi0KLVxiZWdpbnttZXRob2RkZXNjfXthZGRfaGVhZGVyfXtuYW1lLCB2YWx1ZSwgKipfcGFyYW1zfQotQWRkIGEgKHBvc3NpYmx5IG11bHRpLXZhbHVlZCkgaGVhZGVyLCB3aXRoIG9wdGlvbmFsIE1JTUUgcGFyYW1ldGVycwotc3BlY2lmaWVkIHZpYSBrZXl3b3JkIGFyZ3VtZW50cy4KLQotXHZhcntuYW1lfSBpcyB0aGUgaGVhZGVyIGZpZWxkIHRvIGFkZC4gIEtleXdvcmQgYXJndW1lbnRzIGNhbiBiZSB1c2VkIHRvCi1zZXQgTUlNRSBwYXJhbWV0ZXJzIGZvciB0aGUgaGVhZGVyIGZpZWxkLiAgRWFjaCBwYXJhbWV0ZXIgbXVzdCBiZSBhCi1zdHJpbmcgb3IgXGNvZGV7Tm9uZX0uICBVbmRlcnNjb3JlcyBpbiBwYXJhbWV0ZXIgbmFtZXMgYXJlIGNvbnZlcnRlZCB0bwotZGFzaGVzLCBzaW5jZSBkYXNoZXMgYXJlIGlsbGVnYWwgaW4gUHl0aG9uIGlkZW50aWZpZXJzLCBidXQgbWFueSBNSU1FCi1wYXJhbWV0ZXIgbmFtZXMgaW5jbHVkZSBkYXNoZXMuICBJZiB0aGUgcGFyYW1ldGVyIHZhbHVlIGlzIGEgc3RyaW5nLCBpdAotaXMgYWRkZWQgdG8gdGhlIGhlYWRlciB2YWx1ZSBwYXJhbWV0ZXJzIGluIHRoZSBmb3JtIFxjb2Rle25hbWU9InZhbHVlIn0uCi1JZiBpdCBpcyBcY29kZXtOb25lfSwgb25seSB0aGUgcGFyYW1ldGVyIG5hbWUgaXMgYWRkZWQuICAoVGhpcyBpcyB1c2VkCi1mb3IgTUlNRSBwYXJhbWV0ZXJzIHdpdGhvdXQgYSB2YWx1ZS4pICBFeGFtcGxlIHVzYWdlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1oLmFkZF9oZWFkZXIoJ2NvbnRlbnQtZGlzcG9zaXRpb24nLCAnYXR0YWNobWVudCcsIGZpbGVuYW1lPSdidWQuZ2lmJykKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBhYm92ZSB3aWxsIGFkZCBhIGhlYWRlciB0aGF0IGxvb2tzIGxpa2UgdGhpczoKLQotXGJlZ2lue3ZlcmJhdGltfQotQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9ImJ1ZC5naWYiCi1cZW5ke3ZlcmJhdGltfQotXGVuZHttZXRob2RkZXNjfQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxzdWJzZWN0aW9ue1xtb2R1bGV7d3NnaXJlZi5zaW1wbGVfc2VydmVyfSAtLSBhIHNpbXBsZSBXU0dJIEhUVFAgc2VydmVyfQotXGRlY2xhcmVtb2R1bGVbd3NnaXJlZi5zaW1wbGVzZXJ2ZXJde317d3NnaXJlZi5zaW1wbGVfc2VydmVyfQotCi1UaGlzIG1vZHVsZSBpbXBsZW1lbnRzIGEgc2ltcGxlIEhUVFAgc2VydmVyIChiYXNlZCBvbgotXG1vZHVsZXtCYXNlSFRUUFNlcnZlcn0pIHRoYXQgc2VydmVzIFdTR0kgYXBwbGljYXRpb25zLiAgRWFjaCBzZXJ2ZXIKLWluc3RhbmNlIHNlcnZlcyBhIHNpbmdsZSBXU0dJIGFwcGxpY2F0aW9uIG9uIGEgZ2l2ZW4gaG9zdCBhbmQgcG9ydC4gIElmCi15b3Ugd2FudCB0byBzZXJ2ZSBtdWx0aXBsZSBhcHBsaWNhdGlvbnMgb24gYSBzaW5nbGUgaG9zdCBhbmQgcG9ydCwgeW91Ci1zaG91bGQgY3JlYXRlIGEgV1NHSSBhcHBsaWNhdGlvbiB0aGF0IHBhcnNlcyBcY29kZXtQQVRIX0lORk99IHRvIHNlbGVjdAotd2hpY2ggYXBwbGljYXRpb24gdG8gaW52b2tlIGZvciBlYWNoIHJlcXVlc3QuICAoRS5nLiwgdXNpbmcgdGhlCi1cZnVuY3Rpb257c2hpZnRfcGF0aF9pbmZvKCl9IGZ1bmN0aW9uIGZyb20gXG1vZHVsZXt3c2dpcmVmLnV0aWx9LikKLQotCi1cYmVnaW57ZnVuY2Rlc2N9e21ha2Vfc2VydmVyfXtob3N0LCBwb3J0LCBhcHAKLVxvcHRpb25hbHssIHNlcnZlcl9jbGFzcz1cY2xhc3N7V1NHSVNlcnZlcn0gXG9wdGlvbmFseywKLWhhbmRsZXJfY2xhc3M9XGNsYXNze1dTR0lSZXF1ZXN0SGFuZGxlcn19fX0KLUNyZWF0ZSBhIG5ldyBXU0dJIHNlcnZlciBsaXN0ZW5pbmcgb24gXHZhcntob3N0fSBhbmQgXHZhcntwb3J0fSwKLWFjY2VwdGluZyBjb25uZWN0aW9ucyBmb3IgXHZhcnthcHB9LiAgVGhlIHJldHVybiB2YWx1ZSBpcyBhbiBpbnN0YW5jZSBvZgotdGhlIHN1cHBsaWVkIFx2YXJ7c2VydmVyX2NsYXNzfSwgYW5kIHdpbGwgcHJvY2VzcyByZXF1ZXN0cyB1c2luZyB0aGUKLXNwZWNpZmllZCBcdmFye2hhbmRsZXJfY2xhc3N9LiAgXHZhcnthcHB9IG11c3QgYmUgYSBXU0dJIGFwcGxpY2F0aW9uCi1vYmplY3QsIGFzIGRlZmluZWQgYnkgXHBlcHszMzN9LgotCi1FeGFtcGxlIHVzYWdlOgotXGJlZ2lue3ZlcmJhdGltfWZyb20gd3NnaXJlZi5zaW1wbGVfc2VydmVyIGltcG9ydCBtYWtlX3NlcnZlciwgZGVtb19hcHAKLQotaHR0cGQgPSBtYWtlX3NlcnZlcignJywgODAwMCwgZGVtb19hcHApCi1wcmludCAiU2VydmluZyBIVFRQIG9uIHBvcnQgODAwMC4uLiIKLQotIyBSZXNwb25kIHRvIHJlcXVlc3RzIHVudGlsIHByb2Nlc3MgaXMga2lsbGVkCi1odHRwZC5zZXJ2ZV9mb3JldmVyKCkKLQotIyBBbHRlcm5hdGl2ZTogc2VydmUgb25lIHJlcXVlc3QsIHRoZW4gZXhpdAotIyNodHRwZC5oYW5kbGVfcmVxdWVzdCgpCi1cZW5ke3ZlcmJhdGltfQotCi1cZW5ke2Z1bmNkZXNjfQotCi0KLQotCi0KLQotXGJlZ2lue2Z1bmNkZXNjfXtkZW1vX2FwcH17ZW52aXJvbiwgc3RhcnRfcmVzcG9uc2V9Ci1UaGlzIGZ1bmN0aW9uIGlzIGEgc21hbGwgYnV0IGNvbXBsZXRlIFdTR0kgYXBwbGljYXRpb24gdGhhdAotcmV0dXJucyBhIHRleHQgcGFnZSBjb250YWluaW5nIHRoZSBtZXNzYWdlIGBgSGVsbG8gd29ybGQhJycKLWFuZCBhIGxpc3Qgb2YgdGhlIGtleS92YWx1ZSBwYWlycyBwcm92aWRlZCBpbiB0aGUKLVx2YXJ7ZW52aXJvbn0gcGFyYW1ldGVyLiAgSXQncyB1c2VmdWwgZm9yIHZlcmlmeWluZyB0aGF0IGEgV1NHSSBzZXJ2ZXIKLShzdWNoIGFzIFxtb2R1bGV7d3NnaXJlZi5zaW1wbGVfc2VydmVyfSkgaXMgYWJsZSB0byBydW4gYSBzaW1wbGUgV1NHSQotYXBwbGljYXRpb24gY29ycmVjdGx5LgotXGVuZHtmdW5jZGVzY30KLQotCi1cYmVnaW57Y2xhc3NkZXNjfXtXU0dJU2VydmVyfXtzZXJ2ZXJfYWRkcmVzcywgUmVxdWVzdEhhbmRsZXJDbGFzc30KLUNyZWF0ZSBhIFxjbGFzc3tXU0dJU2VydmVyfSBpbnN0YW5jZS4gIFx2YXJ7c2VydmVyX2FkZHJlc3N9IHNob3VsZCBiZQotYSBcY29kZXsoaG9zdCxwb3J0KX0gdHVwbGUsIGFuZCBcdmFye1JlcXVlc3RIYW5kbGVyQ2xhc3N9IHNob3VsZCBiZQotdGhlIHN1YmNsYXNzIG9mIFxjbGFzc3tCYXNlSFRUUFNlcnZlci5CYXNlSFRUUFJlcXVlc3RIYW5kbGVyfSB0aGF0IHdpbGwKLWJlIHVzZWQgdG8gcHJvY2VzcyByZXF1ZXN0cy4KLQotWW91IGRvIG5vdCBub3JtYWxseSBuZWVkIHRvIGNhbGwgdGhpcyBjb25zdHJ1Y3RvciwgYXMgdGhlCi1cZnVuY3Rpb257bWFrZV9zZXJ2ZXIoKX0gZnVuY3Rpb24gY2FuIGhhbmRsZSBhbGwgdGhlIGRldGFpbHMgZm9yIHlvdS4KLQotXGNsYXNze1dTR0lTZXJ2ZXJ9IGlzIGEgc3ViY2xhc3MKLW9mIFxjbGFzc3tCYXNlSFRUUFNlcnZlci5IVFRQU2VydmVyfSwgc28gYWxsIG9mIGl0cyBtZXRob2RzIChzdWNoIGFzCi1cbWV0aG9ke3NlcnZlX2ZvcmV2ZXIoKX0gYW5kIFxtZXRob2R7aGFuZGxlX3JlcXVlc3QoKX0pIGFyZSBhdmFpbGFibGUuCi1cY2xhc3N7V1NHSVNlcnZlcn0gYWxzbyBwcm92aWRlcyB0aGVzZSBXU0dJLXNwZWNpZmljIG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtzZXRfYXBwfXthcHBsaWNhdGlvbn0KLVNldHMgdGhlIGNhbGxhYmxlIFx2YXJ7YXBwbGljYXRpb259IGFzIHRoZSBXU0dJIGFwcGxpY2F0aW9uIHRoYXQgd2lsbAotcmVjZWl2ZSByZXF1ZXN0cy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2dldF9hcHB9e30KLVJldHVybnMgdGhlIGN1cnJlbnRseS1zZXQgYXBwbGljYXRpb24gY2FsbGFibGUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLU5vcm1hbGx5LCBob3dldmVyLCB5b3UgZG8gbm90IG5lZWQgdG8gdXNlIHRoZXNlIGFkZGl0aW9uYWwgbWV0aG9kcywgYXMKLVxtZXRob2R7c2V0X2FwcCgpfSBpcyBub3JtYWxseSBjYWxsZWQgYnkgXGZ1bmN0aW9ue21ha2Vfc2VydmVyKCl9LCBhbmQKLXRoZSBcbWV0aG9ke2dldF9hcHAoKX0gZXhpc3RzIG1haW5seSBmb3IgdGhlIGJlbmVmaXQgb2YgcmVxdWVzdCBoYW5kbGVyCi1pbnN0YW5jZXMuCi1cZW5ke2NsYXNzZGVzY30KLQotCi0KLVxiZWdpbntjbGFzc2Rlc2N9e1dTR0lSZXF1ZXN0SGFuZGxlcn17cmVxdWVzdCwgY2xpZW50X2FkZHJlc3MsIHNlcnZlcn0KLUNyZWF0ZSBhbiBIVFRQIGhhbmRsZXIgZm9yIHRoZSBnaXZlbiBcdmFye3JlcXVlc3R9IChpLmUuIGEgc29ja2V0KSwKLVx2YXJ7Y2xpZW50X2FkZHJlc3N9IChhIFxjb2RleyhcdmFye2hvc3R9LFx2YXJ7cG9ydH0pfSB0dXBsZSksIGFuZAotXHZhcntzZXJ2ZXJ9IChcY2xhc3N7V1NHSVNlcnZlcn0gaW5zdGFuY2UpLgotCi1Zb3UgZG8gbm90IG5lZWQgdG8gY3JlYXRlIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGRpcmVjdGx5OyB0aGV5IGFyZQotYXV0b21hdGljYWxseSBjcmVhdGVkIGFzIG5lZWRlZCBieSBcY2xhc3N7V1NHSVNlcnZlcn0gb2JqZWN0cy4gIFlvdQotY2FuLCBob3dldmVyLCBzdWJjbGFzcyB0aGlzIGNsYXNzIGFuZCBzdXBwbHkgaXQgYXMgYSBcdmFye2hhbmRsZXJfY2xhc3N9Ci10byB0aGUgXGZ1bmN0aW9ue21ha2Vfc2VydmVyKCl9IGZ1bmN0aW9uLiAgU29tZSBwb3NzaWJseSByZWxldmFudAotbWV0aG9kcyBmb3Igb3ZlcnJpZGluZyBpbiBzdWJjbGFzc2VzOgotCi1cYmVnaW57bWV0aG9kZGVzY317Z2V0X2Vudmlyb259e30KLVJldHVybnMgYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIFdTR0kgZW52aXJvbm1lbnQgZm9yIGEgcmVxdWVzdC4gIFRoZQotZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjb3BpZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBcY2xhc3N7V1NHSVNlcnZlcn0KLW9iamVjdCdzIFxtZW1iZXJ7YmFzZV9lbnZpcm9ufSBkaWN0aW9uYXJ5IGF0dHJpYnV0ZSBhbmQgdGhlbiBhZGRzCi12YXJpb3VzIGhlYWRlcnMgZGVyaXZlZCBmcm9tIHRoZSBIVFRQIHJlcXVlc3QuICBFYWNoIGNhbGwgdG8gdGhpcyBtZXRob2QKLXNob3VsZCByZXR1cm4gYSBuZXcgZGljdGlvbmFyeSBjb250YWluaW5nIGFsbCBvZiB0aGUgcmVsZXZhbnQgQ0dJCi1lbnZpcm9ubWVudCB2YXJpYWJsZXMgYXMgc3BlY2lmaWVkIGluIFxwZXB7MzMzfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2dldF9zdGRlcnJ9e30KLVJldHVybiB0aGUgb2JqZWN0IHRoYXQgc2hvdWxkIGJlIHVzZWQgYXMgdGhlIFxjb2Rle3dzZ2kuZXJyb3JzfSBzdHJlYW0uCi1UaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBqdXN0IHJldHVybnMgXGNvZGV7c3lzLnN0ZGVycn0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtoYW5kbGV9e30KLVByb2Nlc3MgdGhlIEhUVFAgcmVxdWVzdC4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGNyZWF0ZXMgYSBoYW5kbGVyCi1pbnN0YW5jZSB1c2luZyBhIFxtb2R1bGV7d3NnaXJlZi5oYW5kbGVyc30gY2xhc3MgdG8gaW1wbGVtZW50IHRoZSBhY3R1YWwKLVdTR0kgYXBwbGljYXRpb24gaW50ZXJmYWNlLgotXGVuZHttZXRob2RkZXNjfQotCi1cZW5ke2NsYXNzZGVzY30KLQotCi0KLQotCi0KLQotCi0KLVxzdWJzZWN0aW9ue1xtb2R1bGV7d3NnaXJlZi52YWxpZGF0ZX0gLS0gV1NHSSBjb25mb3JtYW5jZSBjaGVja2VyfQotXGRlY2xhcmVtb2R1bGV7fXt3c2dpcmVmLnZhbGlkYXRlfQotV2hlbiBjcmVhdGluZyBuZXcgV1NHSSBhcHBsaWNhdGlvbiBvYmplY3RzLCBmcmFtZXdvcmtzLCBzZXJ2ZXJzLCBvcgotbWlkZGxld2FyZSwgaXQgY2FuIGJlIHVzZWZ1bCB0byB2YWxpZGF0ZSB0aGUgbmV3IGNvZGUncyBjb25mb3JtYW5jZQotdXNpbmcgXG1vZHVsZXt3c2dpcmVmLnZhbGlkYXRlfS4gIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgZnVuY3Rpb24gdGhhdAotY3JlYXRlcyBXU0dJIGFwcGxpY2F0aW9uIG9iamVjdHMgdGhhdCB2YWxpZGF0ZSBjb21tdW5pY2F0aW9ucyBiZXR3ZWVuCi1hIFdTR0kgc2VydmVyIG9yIGdhdGV3YXkgYW5kIGEgV1NHSSBhcHBsaWNhdGlvbiBvYmplY3QsIHRvIGNoZWNrIGJvdGgKLXNpZGVzIGZvciBwcm90b2NvbCBjb25mb3JtYW5jZS4KLQotTm90ZSB0aGF0IHRoaXMgdXRpbGl0eSBkb2VzIG5vdCBndWFyYW50ZWUgY29tcGxldGUgXHBlcHszMzN9IGNvbXBsaWFuY2U7Ci1hbiBhYnNlbmNlIG9mIGVycm9ycyBmcm9tIHRoaXMgbW9kdWxlIGRvZXMgbm90IG5lY2Vzc2FyaWx5IG1lYW4gdGhhdAotZXJyb3JzIGRvIG5vdCBleGlzdC4gIEhvd2V2ZXIsIGlmIHRoaXMgbW9kdWxlIGRvZXMgcHJvZHVjZSBhbiBlcnJvciwKLXRoZW4gaXQgaXMgdmlydHVhbGx5IGNlcnRhaW4gdGhhdCBlaXRoZXIgdGhlIHNlcnZlciBvciBhcHBsaWNhdGlvbiBpcwotbm90IDEwMFwlIGNvbXBsaWFudC4KLQotVGhpcyBtb2R1bGUgaXMgYmFzZWQgb24gdGhlIFxtb2R1bGV7cGFzdGUubGludH0gbW9kdWxlIGZyb20gSWFuCi1CaWNraW5nJ3MgYGBQeXRob24gUGFzdGUnJyBsaWJyYXJ5LgotCi1cYmVnaW57ZnVuY2Rlc2N9e3ZhbGlkYXRvcn17YXBwbGljYXRpb259Ci1XcmFwIFx2YXJ7YXBwbGljYXRpb259IGFuZCByZXR1cm4gYSBuZXcgV1NHSSBhcHBsaWNhdGlvbiBvYmplY3QuICBUaGUKLXJldHVybmVkIGFwcGxpY2F0aW9uIHdpbGwgZm9yd2FyZCBhbGwgcmVxdWVzdHMgdG8gdGhlIG9yaWdpbmFsCi1cdmFye2FwcGxpY2F0aW9ufSwgYW5kIHdpbGwgY2hlY2sgdGhhdCBib3RoIHRoZSBcdmFye2FwcGxpY2F0aW9ufSBhbmQKLXRoZSBzZXJ2ZXIgaW52b2tpbmcgaXQgYXJlIGNvbmZvcm1pbmcgdG8gdGhlIFdTR0kgc3BlY2lmaWNhdGlvbiBhbmQgdG8KLVJGQyAyNjE2LgotCi1BbnkgZGV0ZWN0ZWQgbm9uY29uZm9ybWFuY2UgcmVzdWx0cyBpbiBhbiBcZXhjZXB0aW9ue0Fzc2VydGlvbkVycm9yfQotYmVpbmcgcmFpc2VkOyBub3RlLCBob3dldmVyLCB0aGF0IGhvdyB0aGVzZSBlcnJvcnMgYXJlIGhhbmRsZWQgaXMKLXNlcnZlci1kZXBlbmRlbnQuICBGb3IgZXhhbXBsZSwgXG1vZHVsZXt3c2dpcmVmLnNpbXBsZV9zZXJ2ZXJ9IGFuZCBvdGhlcgotc2VydmVycyBiYXNlZCBvbiBcbW9kdWxle3dzZ2lyZWYuaGFuZGxlcnN9ICh0aGF0IGRvbid0IG92ZXJyaWRlIHRoZQotZXJyb3IgaGFuZGxpbmcgbWV0aG9kcyB0byBkbyBzb21ldGhpbmcgZWxzZSkgd2lsbCBzaW1wbHkgb3V0cHV0IGEKLW1lc3NhZ2UgdGhhdCBhbiBlcnJvciBoYXMgb2NjdXJyZWQsIGFuZCBkdW1wIHRoZSB0cmFjZWJhY2sgdG8KLVxjb2Rle3N5cy5zdGRlcnJ9IG9yIHNvbWUgb3RoZXIgZXJyb3Igc3RyZWFtLgotCi1UaGlzIHdyYXBwZXIgbWF5IGFsc28gZ2VuZXJhdGUgb3V0cHV0IHVzaW5nIHRoZSBcbW9kdWxle3dhcm5pbmdzfSBtb2R1bGUKLXRvIGluZGljYXRlIGJlaGF2aW9ycyB0aGF0IGFyZSBxdWVzdGlvbmFibGUgYnV0IHdoaWNoIG1heSBub3QgYWN0dWFsbHkKLWJlIHByb2hpYml0ZWQgYnkgXHBlcHszMzN9LiAgVW5sZXNzIHRoZXkgYXJlIHN1cHByZXNzZWQgdXNpbmcgUHl0aG9uCi1jb21tYW5kLWxpbmUgb3B0aW9ucyBvciB0aGUgXG1vZHVsZXt3YXJuaW5nc30gQVBJLCBhbnkgc3VjaCB3YXJuaW5ncwotd2lsbCBiZSB3cml0dGVuIHRvIFxjb2Rle3N5cy5zdGRlcnJ9IChcZW1waHtub3R9IFxjb2Rle3dzZ2kuZXJyb3JzfSwKLXVubGVzcyB0aGV5IGhhcHBlbiB0byBiZSB0aGUgc2FtZSBvYmplY3QpLgotXGVuZHtmdW5jZGVzY30KLQotXHN1YnNlY3Rpb257XG1vZHVsZXt3c2dpcmVmLmhhbmRsZXJzfSAtLSBzZXJ2ZXIvZ2F0ZXdheSBiYXNlIGNsYXNzZXN9Ci1cZGVjbGFyZW1vZHVsZXt9e3dzZ2lyZWYuaGFuZGxlcnN9Ci0KLVRoaXMgbW9kdWxlIHByb3ZpZGVzIGJhc2UgaGFuZGxlciBjbGFzc2VzIGZvciBpbXBsZW1lbnRpbmcgV1NHSSBzZXJ2ZXJzCi1hbmQgZ2F0ZXdheXMuICBUaGVzZSBiYXNlIGNsYXNzZXMgaGFuZGxlIG1vc3Qgb2YgdGhlIHdvcmsgb2YKLWNvbW11bmljYXRpbmcgd2l0aCBhIFdTR0kgYXBwbGljYXRpb24sIGFzIGxvbmcgYXMgdGhleSBhcmUgZ2l2ZW4gYQotQ0dJLWxpa2UgZW52aXJvbm1lbnQsIGFsb25nIHdpdGggaW5wdXQsIG91dHB1dCwgYW5kIGVycm9yIHN0cmVhbXMuCi0KLQotXGJlZ2lue2NsYXNzZGVzY317Q0dJSGFuZGxlcn17fQotQ0dJLWJhc2VkIGludm9jYXRpb24gdmlhIFxjb2Rle3N5cy5zdGRpbn0sIFxjb2Rle3N5cy5zdGRvdXR9LAotXGNvZGV7c3lzLnN0ZGVycn0gYW5kIFxjb2Rle29zLmVudmlyb259LiAgVGhpcyBpcyB1c2VmdWwgd2hlbiB5b3UgaGF2ZQotYSBXU0dJIGFwcGxpY2F0aW9uIGFuZCB3YW50IHRvIHJ1biBpdCBhcyBhIENHSSBzY3JpcHQuICBTaW1wbHkgaW52b2tlCi1cY29kZXtDR0lIYW5kbGVyKCkucnVuKGFwcCl9LCB3aGVyZSBcY29kZXthcHB9IGlzIHRoZSBXU0dJIGFwcGxpY2F0aW9uCi1vYmplY3QgeW91IHdpc2ggdG8gaW52b2tlLgotCi1UaGlzIGNsYXNzIGlzIGEgc3ViY2xhc3Mgb2YgXGNsYXNze0Jhc2VDR0lIYW5kbGVyfSB0aGF0IHNldHMKLVxjb2Rle3dzZ2kucnVuX29uY2V9IHRvIHRydWUsIFxjb2Rle3dzZ2kubXVsdGl0aHJlYWR9IHRvIGZhbHNlLCBhbmQKLVxjb2Rle3dzZ2kubXVsdGlwcm9jZXNzfSB0byB0cnVlLCBhbmQgYWx3YXlzIHVzZXMgXG1vZHVsZXtzeXN9IGFuZAotXG1vZHVsZXtvc30gdG8gb2J0YWluIHRoZSBuZWNlc3NhcnkgQ0dJIHN0cmVhbXMgYW5kIGVudmlyb25tZW50LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLQotXGJlZ2lue2NsYXNzZGVzY317QmFzZUNHSUhhbmRsZXJ9e3N0ZGluLCBzdGRvdXQsIHN0ZGVyciwgZW52aXJvbgotXG9wdGlvbmFseywgbXVsdGl0aHJlYWQ9VHJ1ZSBcb3B0aW9uYWx7LCBtdWx0aXByb2Nlc3M9RmFsc2V9fX0KLQotU2ltaWxhciB0byBcY2xhc3N7Q0dJSGFuZGxlcn0sIGJ1dCBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBcbW9kdWxle3N5c30gYW5kCi1cbW9kdWxle29zfSBtb2R1bGVzLCB0aGUgQ0dJIGVudmlyb25tZW50IGFuZCBJL08gc3RyZWFtcyBhcmUgc3BlY2lmaWVkCi1leHBsaWNpdGx5LiAgVGhlIFx2YXJ7bXVsdGl0aHJlYWR9IGFuZCBcdmFye211bHRpcHJvY2Vzc30gdmFsdWVzIGFyZQotdXNlZCB0byBzZXQgdGhlIFxjb2Rle3dzZ2kubXVsdGl0aHJlYWR9IGFuZCBcY29kZXt3c2dpLm11bHRpcHJvY2Vzc30KLWZsYWdzIGZvciBhbnkgYXBwbGljYXRpb25zIHJ1biBieSB0aGUgaGFuZGxlciBpbnN0YW5jZS4KLQotVGhpcyBjbGFzcyBpcyBhIHN1YmNsYXNzIG9mIFxjbGFzc3tTaW1wbGVIYW5kbGVyfSBpbnRlbmRlZCBmb3IgdXNlIHdpdGgKLXNvZnR3YXJlIG90aGVyIHRoYW4gSFRUUCBgYG9yaWdpbiBzZXJ2ZXJzJycuICBJZiB5b3UgYXJlIHdyaXRpbmcgYQotZ2F0ZXdheSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiAoc3VjaCBhcyBDR0ksIEZhc3RDR0ksIFNDR0ksIGV0Yy4pIHRoYXQKLXVzZXMgYSBcY29kZXtTdGF0dXM6fSBoZWFkZXIgdG8gc2VuZCBhbiBIVFRQIHN0YXR1cywgeW91IHByb2JhYmx5IHdhbnQKLXRvIHN1YmNsYXNzIHRoaXMgaW5zdGVhZCBvZiBcY2xhc3N7U2ltcGxlSGFuZGxlcn0uCi1cZW5ke2NsYXNzZGVzY30KLQotCi0KLVxiZWdpbntjbGFzc2Rlc2N9e1NpbXBsZUhhbmRsZXJ9e3N0ZGluLCBzdGRvdXQsIHN0ZGVyciwgZW52aXJvbgotXG9wdGlvbmFseyxtdWx0aXRocmVhZD1UcnVlIFxvcHRpb25hbHssIG11bHRpcHJvY2Vzcz1GYWxzZX19fQotCi1TaW1pbGFyIHRvIFxjbGFzc3tCYXNlQ0dJSGFuZGxlcn0sIGJ1dCBkZXNpZ25lZCBmb3IgdXNlIHdpdGggSFRUUCBvcmlnaW4KLXNlcnZlcnMuICBJZiB5b3UgYXJlIHdyaXRpbmcgYW4gSFRUUCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24sIHlvdSB3aWxsCi1wcm9iYWJseSB3YW50IHRvIHN1YmNsYXNzIHRoaXMgaW5zdGVhZCBvZiBcY2xhc3N7QmFzZUNHSUhhbmRsZXJ9Ci0KLVRoaXMgY2xhc3MgaXMgYSBzdWJjbGFzcyBvZiBcY2xhc3N7QmFzZUhhbmRsZXJ9LiAgSXQgb3ZlcnJpZGVzIHRoZQotXG1ldGhvZHtfX2luaXRfXygpfSwgXG1ldGhvZHtnZXRfc3RkaW4oKX0sIFxtZXRob2R7Z2V0X3N0ZGVycigpfSwKLVxtZXRob2R7YWRkX2NnaV92YXJzKCl9LCBcbWV0aG9ke193cml0ZSgpfSwgYW5kIFxtZXRob2R7X2ZsdXNoKCl9Ci1tZXRob2RzIHRvIHN1cHBvcnQgZXhwbGljaXRseSBzZXR0aW5nIHRoZSBlbnZpcm9ubWVudCBhbmQgc3RyZWFtcyB2aWEKLXRoZSBjb25zdHJ1Y3Rvci4gIFRoZSBzdXBwbGllZCBlbnZpcm9ubWVudCBhbmQgc3RyZWFtcyBhcmUgc3RvcmVkIGluCi10aGUgXG1lbWJlcntzdGRpbn0sIFxtZW1iZXJ7c3Rkb3V0fSwgXG1lbWJlcntzdGRlcnJ9LCBhbmQKLVxtZW1iZXJ7ZW52aXJvbn0gYXR0cmlidXRlcy4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtCYXNlSGFuZGxlcn17fQotVGhpcyBpcyBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBydW5uaW5nIFdTR0kgYXBwbGljYXRpb25zLiAgRWFjaAotaW5zdGFuY2Ugd2lsbCBoYW5kbGUgYSBzaW5nbGUgSFRUUCByZXF1ZXN0LCBhbHRob3VnaCBpbiBwcmluY2lwbGUgeW91Ci1jb3VsZCBjcmVhdGUgYSBzdWJjbGFzcyB0aGF0IHdhcyByZXVzYWJsZSBmb3IgbXVsdGlwbGUgcmVxdWVzdHMuCi0KLVxjbGFzc3tCYXNlSGFuZGxlcn0gaW5zdGFuY2VzIGhhdmUgb25seSBvbmUgbWV0aG9kIGludGVuZGVkIGZvciBleHRlcm5hbAotdXNlOgotCi1cYmVnaW57bWV0aG9kZGVzY317cnVufXthcHB9Ci1SdW4gdGhlIHNwZWNpZmllZCBXU0dJIGFwcGxpY2F0aW9uLCBcdmFye2FwcH0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLUFsbCBvZiB0aGUgb3RoZXIgXGNsYXNze0Jhc2VIYW5kbGVyfSBtZXRob2RzIGFyZSBpbnZva2VkIGJ5IHRoaXMgbWV0aG9kCi1pbiB0aGUgcHJvY2VzcyBvZiBydW5uaW5nIHRoZSBhcHBsaWNhdGlvbiwgYW5kIHRodXMgZXhpc3QgcHJpbWFyaWx5IHRvCi1hbGxvdyBjdXN0b21pemluZyB0aGUgcHJvY2Vzcy4KLQotVGhlIGZvbGxvd2luZyBtZXRob2RzIE1VU1QgYmUgb3ZlcnJpZGRlbiBpbiBhIHN1YmNsYXNzOgotCi1cYmVnaW57bWV0aG9kZGVzY317X3dyaXRlfXtkYXRhfQotQnVmZmVyIHRoZSBzdHJpbmcgXHZhcntkYXRhfSBmb3IgdHJhbnNtaXNzaW9uIHRvIHRoZSBjbGllbnQuICBJdCdzIG9rYXkKLWlmIHRoaXMgbWV0aG9kIGFjdHVhbGx5IHRyYW5zbWl0cyB0aGUgZGF0YTsgXGNsYXNze0Jhc2VIYW5kbGVyfQotanVzdCBzZXBhcmF0ZXMgd3JpdGUgYW5kIGZsdXNoIG9wZXJhdGlvbnMgZm9yIGdyZWF0ZXIgZWZmaWNpZW5jeQotd2hlbiB0aGUgdW5kZXJseWluZyBzeXN0ZW0gYWN0dWFsbHkgaGFzIHN1Y2ggYSBkaXN0aW5jdGlvbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e19mbHVzaH17fQotRm9yY2UgYnVmZmVyZWQgZGF0YSB0byBiZSB0cmFuc21pdHRlZCB0byB0aGUgY2xpZW50LiAgSXQncyBva2F5IGlmIHRoaXMKLW1ldGhvZCBpcyBhIG5vLW9wIChpLmUuLCBpZiBcbWV0aG9ke193cml0ZSgpfSBhY3R1YWxseSBzZW5kcyB0aGUgZGF0YSkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtnZXRfc3RkaW59e30KLVJldHVybiBhbiBpbnB1dCBzdHJlYW0gb2JqZWN0IHN1aXRhYmxlIGZvciB1c2UgYXMgdGhlIFxjb2Rle3dzZ2kuaW5wdXR9Ci1vZiB0aGUgcmVxdWVzdCBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Z2V0X3N0ZGVycn17fQotUmV0dXJuIGFuIG91dHB1dCBzdHJlYW0gb2JqZWN0IHN1aXRhYmxlIGZvciB1c2UgYXMgdGhlCi1cY29kZXt3c2dpLmVycm9yc30gb2YgdGhlIHJlcXVlc3QgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2FkZF9jZ2lfdmFyc317fQotSW5zZXJ0IENHSSB2YXJpYWJsZXMgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QgaW50byB0aGUgXG1lbWJlcntlbnZpcm9ufQotYXR0cmlidXRlLgotXGVuZHttZXRob2RkZXNjfQotCi1IZXJlIGFyZSBzb21lIG90aGVyIG1ldGhvZHMgYW5kIGF0dHJpYnV0ZXMgeW91IG1heSB3aXNoIHRvIG92ZXJyaWRlLgotVGhpcyBsaXN0IGlzIG9ubHkgYSBzdW1tYXJ5LCBob3dldmVyLCBhbmQgZG9lcyBub3QgaW5jbHVkZSBldmVyeSBtZXRob2QKLXRoYXQgY2FuIGJlIG92ZXJyaWRkZW4uICBZb3Ugc2hvdWxkIGNvbnN1bHQgdGhlIGRvY3N0cmluZ3MgYW5kIHNvdXJjZQotY29kZSBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBiZWZvcmUgYXR0ZW1wdGluZyB0byBjcmVhdGUgYSBjdXN0b21pemVkCi1cY2xhc3N7QmFzZUhhbmRsZXJ9IHN1YmNsYXNzLgotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi1BdHRyaWJ1dGVzIGFuZCBtZXRob2RzIGZvciBjdXN0b21pemluZyB0aGUgV1NHSSBlbnZpcm9ubWVudDoKLQotXGJlZ2lue21lbWJlcmRlc2N9e3dzZ2lfbXVsdGl0aHJlYWR9Ci1UaGUgdmFsdWUgdG8gYmUgdXNlZCBmb3IgdGhlIFxjb2Rle3dzZ2kubXVsdGl0aHJlYWR9IGVudmlyb25tZW50Ci12YXJpYWJsZS4gIEl0IGRlZmF1bHRzIHRvIHRydWUgaW4gXGNsYXNze0Jhc2VIYW5kbGVyfSwgYnV0IG1heSBoYXZlCi1hIGRpZmZlcmVudCBkZWZhdWx0IChvciBiZSBzZXQgYnkgdGhlIGNvbnN0cnVjdG9yKSBpbiB0aGUgb3RoZXIKLXN1YmNsYXNzZXMuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXt3c2dpX211bHRpcHJvY2Vzc30KLVRoZSB2YWx1ZSB0byBiZSB1c2VkIGZvciB0aGUgXGNvZGV7d3NnaS5tdWx0aXByb2Nlc3N9IGVudmlyb25tZW50Ci12YXJpYWJsZS4gIEl0IGRlZmF1bHRzIHRvIHRydWUgaW4gXGNsYXNze0Jhc2VIYW5kbGVyfSwgYnV0IG1heSBoYXZlCi1hIGRpZmZlcmVudCBkZWZhdWx0IChvciBiZSBzZXQgYnkgdGhlIGNvbnN0cnVjdG9yKSBpbiB0aGUgb3RoZXIKLXN1YmNsYXNzZXMuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXt3c2dpX3J1bl9vbmNlfQotVGhlIHZhbHVlIHRvIGJlIHVzZWQgZm9yIHRoZSBcY29kZXt3c2dpLnJ1bl9vbmNlfSBlbnZpcm9ubWVudAotdmFyaWFibGUuICBJdCBkZWZhdWx0cyB0byBmYWxzZSBpbiBcY2xhc3N7QmFzZUhhbmRsZXJ9LCBidXQKLVxjbGFzc3tDR0lIYW5kbGVyfSBzZXRzIGl0IHRvIHRydWUgYnkgZGVmYXVsdC4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9e29zX2Vudmlyb259Ci1UaGUgZGVmYXVsdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gYmUgaW5jbHVkZWQgaW4gZXZlcnkgcmVxdWVzdCdzCi1XU0dJIGVudmlyb25tZW50LiAgQnkgZGVmYXVsdCwgdGhpcyBpcyBhIGNvcHkgb2YgXGNvZGV7b3MuZW52aXJvbn0gYXQKLXRoZSB0aW1lIHRoYXQgXG1vZHVsZXt3c2dpcmVmLmhhbmRsZXJzfSB3YXMgaW1wb3J0ZWQsIGJ1dCBzdWJjbGFzc2VzIGNhbgotZWl0aGVyIGNyZWF0ZSB0aGVpciBvd24gYXQgdGhlIGNsYXNzIG9yIGluc3RhbmNlIGxldmVsLiAgTm90ZSB0aGF0IHRoZQotZGljdGlvbmFyeSBzaG91bGQgYmUgY29uc2lkZXJlZCByZWFkLW9ubHksIHNpbmNlIHRoZSBkZWZhdWx0IHZhbHVlIGlzCi1zaGFyZWQgYmV0d2VlbiBtdWx0aXBsZSBjbGFzc2VzIGFuZCBpbnN0YW5jZXMuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXtzZXJ2ZXJfc29mdHdhcmV9Ci1JZiB0aGUgXG1lbWJlcntvcmlnaW5fc2VydmVyfSBhdHRyaWJ1dGUgaXMgc2V0LCB0aGlzIGF0dHJpYnV0ZSdzIHZhbHVlCi1pcyB1c2VkIHRvIHNldCB0aGUgZGVmYXVsdCBcY29kZXtTRVJWRVJfU09GVFdBUkV9IFdTR0kgZW52aXJvbm1lbnQKLXZhcmlhYmxlLCBhbmQgYWxzbyB0byBzZXQgYSBkZWZhdWx0IFxjb2Rle1NlcnZlcjp9IGhlYWRlciBpbiBIVFRQCi1yZXNwb25zZXMuICBJdCBpcyBpZ25vcmVkIGZvciBoYW5kbGVycyAoc3VjaCBhcyBcY2xhc3N7QmFzZUNHSUhhbmRsZXJ9Ci1hbmQgXGNsYXNze0NHSUhhbmRsZXJ9KSB0aGF0IGFyZSBub3QgSFRUUCBvcmlnaW4gc2VydmVycy4KLVxlbmR7bWVtYmVyZGVzY30KLQotCi0KLVxiZWdpbnttZXRob2RkZXNjfXtnZXRfc2NoZW1lfXt9Ci1SZXR1cm4gdGhlIFVSTCBzY2hlbWUgYmVpbmcgdXNlZCBmb3IgdGhlIGN1cnJlbnQgcmVxdWVzdC4gIFRoZSBkZWZhdWx0Ci1pbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSBcZnVuY3Rpb257Z3Vlc3Nfc2NoZW1lKCl9IGZ1bmN0aW9uIGZyb20KLVxtb2R1bGV7d3NnaXJlZi51dGlsfSB0byBndWVzcyB3aGV0aGVyIHRoZSBzY2hlbWUgc2hvdWxkIGJlIGBgaHR0cCcnIG9yCi1gYGh0dHBzJycsIGJhc2VkIG9uIHRoZSBjdXJyZW50IHJlcXVlc3QncyBcbWVtYmVye2Vudmlyb259IHZhcmlhYmxlcy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3NldHVwX2Vudmlyb259e30KLVNldCB0aGUgXG1lbWJlcntlbnZpcm9ufSBhdHRyaWJ1dGUgdG8gYSBmdWxseS1wb3B1bGF0ZWQgV1NHSQotZW52aXJvbm1lbnQuICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB1c2VzIGFsbCBvZiB0aGUgYWJvdmUgbWV0aG9kcwotYW5kIGF0dHJpYnV0ZXMsIHBsdXMgdGhlIFxtZXRob2R7Z2V0X3N0ZGluKCl9LCBcbWV0aG9ke2dldF9zdGRlcnIoKX0sCi1hbmQgXG1ldGhvZHthZGRfY2dpX3ZhcnMoKX0gbWV0aG9kcyBhbmQgdGhlIFxtZW1iZXJ7d3NnaV9maWxlX3dyYXBwZXJ9Ci1hdHRyaWJ1dGUuICBJdCBhbHNvIGluc2VydHMgYSBcY29kZXtTRVJWRVJfU09GVFdBUkV9IGtleSBpZiBub3QgcHJlc2VudCwKLWFzIGxvbmcgYXMgdGhlIFxtZW1iZXJ7b3JpZ2luX3NlcnZlcn0gYXR0cmlidXRlIGlzIGEgdHJ1ZSB2YWx1ZSBhbmQgdGhlCi1cbWVtYmVye3NlcnZlcl9zb2Z0d2FyZX0gYXR0cmlidXRlIGlzIHNldC4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotTWV0aG9kcyBhbmQgYXR0cmlidXRlcyBmb3IgY3VzdG9taXppbmcgZXhjZXB0aW9uIGhhbmRsaW5nOgotCi1cYmVnaW57bWV0aG9kZGVzY317bG9nX2V4Y2VwdGlvbn17ZXhjX2luZm99Ci1Mb2cgdGhlIFx2YXJ7ZXhjX2luZm99IHR1cGxlIGluIHRoZSBzZXJ2ZXIgbG9nLiAgXHZhcntleGNfaW5mb30gaXMgYQotXGNvZGV7KFx2YXJ7dHlwZX0sIFx2YXJ7dmFsdWV9LCBcdmFye3RyYWNlYmFja30pfSB0dXBsZS4gIFRoZSBkZWZhdWx0Ci1pbXBsZW1lbnRhdGlvbiBzaW1wbHkgd3JpdGVzIHRoZSB0cmFjZWJhY2sgdG8gdGhlIHJlcXVlc3QncwotXGNvZGV7d3NnaS5lcnJvcnN9IHN0cmVhbSBhbmQgZmx1c2hlcyBpdC4gIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMKLW1ldGhvZCB0byBjaGFuZ2UgdGhlIGZvcm1hdCBvciByZXRhcmdldCB0aGUgb3V0cHV0LCBtYWlsIHRoZSB0cmFjZWJhY2sKLXRvIGFuIGFkbWluaXN0cmF0b3IsIG9yIHdoYXRldmVyIG90aGVyIGFjdGlvbiBtYXkgYmUgZGVlbWVkIHN1aXRhYmxlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY317dHJhY2ViYWNrX2xpbWl0fQotVGhlIG1heGltdW0gbnVtYmVyIG9mIGZyYW1lcyB0byBpbmNsdWRlIGluIHRyYWNlYmFja3Mgb3V0cHV0IGJ5IHRoZQotZGVmYXVsdCBcbWV0aG9ke2xvZ19leGNlcHRpb24oKX0gbWV0aG9kLiAgSWYgXGNvZGV7Tm9uZX0sIGFsbCBmcmFtZXMKLWFyZSBpbmNsdWRlZC4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2Vycm9yX291dHB1dH17ZW52aXJvbiwgc3RhcnRfcmVzcG9uc2V9Ci1UaGlzIG1ldGhvZCBpcyBhIFdTR0kgYXBwbGljYXRpb24gdG8gZ2VuZXJhdGUgYW4gZXJyb3IgcGFnZSBmb3IgdGhlCi11c2VyLiAgSXQgaXMgb25seSBpbnZva2VkIGlmIGFuIGVycm9yIG9jY3VycyBiZWZvcmUgaGVhZGVycyBhcmUgc2VudAotdG8gdGhlIGNsaWVudC4KLQotVGhpcyBtZXRob2QgY2FuIGFjY2VzcyB0aGUgY3VycmVudCBlcnJvciBpbmZvcm1hdGlvbiB1c2luZwotXGNvZGV7c3lzLmV4Y19pbmZvKCl9LCBhbmQgc2hvdWxkIHBhc3MgdGhhdCBpbmZvcm1hdGlvbiB0bwotXHZhcntzdGFydF9yZXNwb25zZX0gd2hlbiBjYWxsaW5nIGl0IChhcyBkZXNjcmliZWQgaW4gdGhlIGBgRXJyb3IKLUhhbmRsaW5nJycgc2VjdGlvbiBvZiBccGVwezMzM30pLgotCi1UaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBqdXN0IHVzZXMgdGhlIFxtZW1iZXJ7ZXJyb3Jfc3RhdHVzfSwKLVxtZW1iZXJ7ZXJyb3JfaGVhZGVyc30sIGFuZCBcbWVtYmVye2Vycm9yX2JvZHl9IGF0dHJpYnV0ZXMgdG8gZ2VuZXJhdGUKLWFuIG91dHB1dCBwYWdlLiAgU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyB0byBwcm9kdWNlIG1vcmUgZHluYW1pYwotZXJyb3Igb3V0cHV0LgotCi1Ob3RlLCBob3dldmVyLCB0aGF0IGl0J3Mgbm90IHJlY29tbWVuZGVkIGZyb20gYSBzZWN1cml0eSBwZXJzcGVjdGl2ZSB0bwotc3BpdCBvdXQgZGlhZ25vc3RpY3MgdG8gYW55IG9sZCB1c2VyOyBpZGVhbGx5LCB5b3Ugc2hvdWxkIGhhdmUgdG8gZG8KLXNvbWV0aGluZyBzcGVjaWFsIHRvIGVuYWJsZSBkaWFnbm9zdGljIG91dHB1dCwgd2hpY2ggaXMgd2h5IHRoZSBkZWZhdWx0Ci1pbXBsZW1lbnRhdGlvbiBkb2Vzbid0IGluY2x1ZGUgYW55LgotXGVuZHttZXRob2RkZXNjfQotCi0KLQotCi1cYmVnaW57bWVtYmVyZGVzY317ZXJyb3Jfc3RhdHVzfQotVGhlIEhUVFAgc3RhdHVzIHVzZWQgZm9yIGVycm9yIHJlc3BvbnNlcy4gIFRoaXMgc2hvdWxkIGJlIGEgc3RhdHVzCi1zdHJpbmcgYXMgZGVmaW5lZCBpbiBccGVwezMzM307IGl0IGRlZmF1bHRzIHRvIGEgNTAwIGNvZGUgYW5kIG1lc3NhZ2UuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXtlcnJvcl9oZWFkZXJzfQotVGhlIEhUVFAgaGVhZGVycyB1c2VkIGZvciBlcnJvciByZXNwb25zZXMuICBUaGlzIHNob3VsZCBiZSBhIGxpc3Qgb2YKLVdTR0kgcmVzcG9uc2UgaGVhZGVycyAoXGNvZGV7KFx2YXJ7bmFtZX0sIFx2YXJ7dmFsdWV9KX0gdHVwbGVzKSwgYXMKLWRlc2NyaWJlZCBpbiBccGVwezMzM30uICBUaGUgZGVmYXVsdCBsaXN0IGp1c3Qgc2V0cyB0aGUgY29udGVudCB0eXBlCi10byBcY29kZXt0ZXh0L3BsYWlufS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9e2Vycm9yX2JvZHl9Ci1UaGUgZXJyb3IgcmVzcG9uc2UgYm9keS4gIFRoaXMgc2hvdWxkIGJlIGFuIEhUVFAgcmVzcG9uc2UgYm9keSBzdHJpbmcuCi1JdCBkZWZhdWx0cyB0byB0aGUgcGxhaW4gdGV4dCwgYGBBIHNlcnZlciBlcnJvciBvY2N1cnJlZC4gIFBsZWFzZQotY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nJwotXGVuZHttZW1iZXJkZXNjfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotTWV0aG9kcyBhbmQgYXR0cmlidXRlcyBmb3IgXHBlcHszMzN9J3MgYGBPcHRpb25hbCBQbGF0Zm9ybS1TcGVjaWZpYyBGaWxlCi1IYW5kbGluZycnIGZlYXR1cmU6Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXt3c2dpX2ZpbGVfd3JhcHBlcn0KLUEgXGNvZGV7d3NnaS5maWxlX3dyYXBwZXJ9IGZhY3RvcnksIG9yIFxjb2Rle05vbmV9LiAgVGhlIGRlZmF1bHQgdmFsdWUKLW9mIHRoaXMgYXR0cmlidXRlIGlzIHRoZSBcY2xhc3N7RmlsZVdyYXBwZXJ9IGNsYXNzIGZyb20KLVxtb2R1bGV7d3NnaXJlZi51dGlsfS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3NlbmRmaWxlfXt9Ci1PdmVycmlkZSB0byBpbXBsZW1lbnQgcGxhdGZvcm0tc3BlY2lmaWMgZmlsZSB0cmFuc21pc3Npb24uICBUaGlzIG1ldGhvZAotaXMgY2FsbGVkIG9ubHkgaWYgdGhlIGFwcGxpY2F0aW9uJ3MgcmV0dXJuIHZhbHVlIGlzIGFuIGluc3RhbmNlIG9mCi10aGUgY2xhc3Mgc3BlY2lmaWVkIGJ5IHRoZSBcbWVtYmVye3dzZ2lfZmlsZV93cmFwcGVyfSBhdHRyaWJ1dGUuICBJdAotc2hvdWxkIHJldHVybiBhIHRydWUgdmFsdWUgaWYgaXQgd2FzIGFibGUgdG8gc3VjY2Vzc2Z1bGx5IHRyYW5zbWl0IHRoZQotZmlsZSwgc28gdGhhdCB0aGUgZGVmYXVsdCB0cmFuc21pc3Npb24gY29kZSB3aWxsIG5vdCBiZSBleGVjdXRlZC4KLVRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGp1c3QgcmV0dXJucyBhIGZhbHNlIHZhbHVlLgotXGVuZHttZXRob2RkZXNjfQotCi0KLU1pc2NlbGxhbmVvdXMgbWV0aG9kcyBhbmQgYXR0cmlidXRlczoKLQotXGJlZ2lue21lbWJlcmRlc2N9e29yaWdpbl9zZXJ2ZXJ9Ci1UaGlzIGF0dHJpYnV0ZSBzaG91bGQgYmUgc2V0IHRvIGEgdHJ1ZSB2YWx1ZSBpZiB0aGUgaGFuZGxlcidzCi1cbWV0aG9ke193cml0ZSgpfSBhbmQgXG1ldGhvZHtfZmx1c2goKX0gYXJlIGJlaW5nIHVzZWQgdG8gY29tbXVuaWNhdGUKLWRpcmVjdGx5IHRvIHRoZSBjbGllbnQsIHJhdGhlciB0aGFuIHZpYSBhIENHSS1saWtlIGdhdGV3YXkgcHJvdG9jb2wgdGhhdAotd2FudHMgdGhlIEhUVFAgc3RhdHVzIGluIGEgc3BlY2lhbCBcY29kZXtTdGF0dXM6fSBoZWFkZXIuCi0KLVRoaXMgYXR0cmlidXRlJ3MgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlIGluIFxjbGFzc3tCYXNlSGFuZGxlcn0sIGJ1dAotZmFsc2UgaW4gXGNsYXNze0Jhc2VDR0lIYW5kbGVyfSBhbmQgXGNsYXNze0NHSUhhbmRsZXJ9LgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY317aHR0cF92ZXJzaW9ufQotSWYgXG1lbWJlcntvcmlnaW5fc2VydmVyfSBpcyB0cnVlLCB0aGlzIHN0cmluZyBhdHRyaWJ1dGUgaXMgdXNlZCB0bwotc2V0IHRoZSBIVFRQIHZlcnNpb24gb2YgdGhlIHJlc3BvbnNlIHNldCB0byB0aGUgY2xpZW50LiAgSXQgZGVmYXVsdHMgdG8KLVxjb2RleyIxLjAifS4KLVxlbmR7bWVtYmVyZGVzY30KLQotCi0KLQotCi1cZW5ke2NsYXNzZGVzY30KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ4ZHJsaWIudGV4IGIvRG9jL2xpYi9saWJ4ZHJsaWIudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjQ3NGI3Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlieGRybGliLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3hkcmxpYn0gLS0tCi0gICAgICAgICBFbmNvZGUgYW5kIGRlY29kZSBYRFIgZGF0YX0KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e3hkcmxpYn0KLVxtb2R1bGVzeW5vcHNpc3tFbmNvZGVycyBhbmQgZGVjb2RlcnMgZm9yIHRoZSBFeHRlcm5hbCBEYXRhCi0gICAgICAgICAgICAgICAgUmVwcmVzZW50YXRpb24gKFhEUikufQotCi1caW5kZXh7WERSfQotXGluZGV4e0V4dGVybmFsIERhdGEgUmVwcmVzZW50YXRpb259Ci0KLVRoZSBcbW9kdWxle3hkcmxpYn0gbW9kdWxlIHN1cHBvcnRzIHRoZSBFeHRlcm5hbCBEYXRhIFJlcHJlc2VudGF0aW9uCi1TdGFuZGFyZCBhcyBkZXNjcmliZWQgaW4gXHJmY3sxMDE0fSwgd3JpdHRlbiBieSBTdW4gTWljcm9zeXN0ZW1zLAotSW5jLiBKdW5lIDE5ODcuICBJdCBzdXBwb3J0cyBtb3N0IG9mIHRoZSBkYXRhIHR5cGVzIGRlc2NyaWJlZCBpbiB0aGUKLVJGQy4KLQotVGhlIFxtb2R1bGV7eGRybGlifSBtb2R1bGUgZGVmaW5lcyB0d28gY2xhc3Nlcywgb25lIGZvciBwYWNraW5nCi12YXJpYWJsZXMgaW50byBYRFIgcmVwcmVzZW50YXRpb24sIGFuZCBhbm90aGVyIGZvciB1bnBhY2tpbmcgZnJvbSBYRFIKLXJlcHJlc2VudGF0aW9uLiAgVGhlcmUgYXJlIGFsc28gdHdvIGV4Y2VwdGlvbiBjbGFzc2VzLgotCi1cYmVnaW57Y2xhc3NkZXNjfXtQYWNrZXJ9e30KLVxjbGFzc3tQYWNrZXJ9IGlzIHRoZSBjbGFzcyBmb3IgcGFja2luZyBkYXRhIGludG8gWERSIHJlcHJlc2VudGF0aW9uLgotVGhlIFxjbGFzc3tQYWNrZXJ9IGNsYXNzIGlzIGluc3RhbnRpYXRlZCB3aXRoIG5vIGFyZ3VtZW50cy4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtVbnBhY2tlcn17ZGF0YX0KLVxjb2Rle1VucGFja2VyfSBpcyB0aGUgY29tcGxlbWVudGFyeSBjbGFzcyB3aGljaCB1bnBhY2tzIFhEUiBkYXRhCi12YWx1ZXMgZnJvbSBhIHN0cmluZyBidWZmZXIuICBUaGUgaW5wdXQgYnVmZmVyIGlzIGdpdmVuIGFzCi1cdmFye2RhdGF9LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWVyZmN7MTAxNH17WERSOiBFeHRlcm5hbCBEYXRhIFJlcHJlc2VudGF0aW9uIFN0YW5kYXJkfXtUaGlzIFJGQwotICAgICAgICAgICAgICAgIGRlZmluZWQgdGhlIGVuY29kaW5nIG9mIGRhdGEgd2hpY2ggd2FzIFhEUiBhdCB0aGUgdGltZQotICAgICAgICAgICAgICAgIHRoaXMgbW9kdWxlIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4uICBJdCBoYXMKLSAgICAgICAgICAgICAgICBhcHBhcmVudGx5IGJlZW4gb2Jzb2xldGVkIGJ5IFxyZmN7MTgzMn0ufQotCi0gIFxzZWVyZmN7MTgzMn17WERSOiBFeHRlcm5hbCBEYXRhIFJlcHJlc2VudGF0aW9uIFN0YW5kYXJkfXtOZXdlciBSRkMKLSAgICAgICAgICAgICAgICB0aGF0IHByb3ZpZGVzIGEgcmV2aXNlZCBkZWZpbml0aW9uIG9mIFhEUi59Ci1cZW5ke3NlZWFsc299Ci0KLQotXHN1YnNlY3Rpb257UGFja2VyIE9iamVjdHMgXGxhYmVse3hkci1wYWNrZXItb2JqZWN0c319Ci0KLVxjbGFzc3tQYWNrZXJ9IGluc3RhbmNlcyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLQotXGJlZ2lue21ldGhvZGRlc2N9W1BhY2tlcl17Z2V0X2J1ZmZlcn17fQotUmV0dXJucyB0aGUgY3VycmVudCBwYWNrIGJ1ZmZlciBhcyBhIHN0cmluZy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1BhY2tlcl17cmVzZXR9e30KLVJlc2V0cyB0aGUgcGFjayBidWZmZXIgdG8gdGhlIGVtcHR5IHN0cmluZy4KLVxlbmR7bWV0aG9kZGVzY30KLQotSW4gZ2VuZXJhbCwgeW91IGNhbiBwYWNrIGFueSBvZiB0aGUgbW9zdCBjb21tb24gWERSIGRhdGEgdHlwZXMgYnkKLWNhbGxpbmcgdGhlIGFwcHJvcHJpYXRlIFxjb2Rle3BhY2tfXHZhcnt0eXBlfSgpfSBtZXRob2QuICBFYWNoIG1ldGhvZAotdGFrZXMgYSBzaW5nbGUgYXJndW1lbnQsIHRoZSB2YWx1ZSB0byBwYWNrLiAgVGhlIGZvbGxvd2luZyBzaW1wbGUgZGF0YQotdHlwZSBwYWNraW5nIG1ldGhvZHMgYXJlIHN1cHBvcnRlZDogXG1ldGhvZHtwYWNrX3VpbnQoKX0sCi1cbWV0aG9ke3BhY2tfaW50KCl9LCBcbWV0aG9ke3BhY2tfZW51bSgpfSwgXG1ldGhvZHtwYWNrX2Jvb2woKX0sCi1cbWV0aG9ke3BhY2tfdWh5cGVyKCl9LCBhbmQgXG1ldGhvZHtwYWNrX2h5cGVyKCl9LgotCi1cYmVnaW57bWV0aG9kZGVzY31bUGFja2VyXXtwYWNrX2Zsb2F0fXt2YWx1ZX0KLVBhY2tzIHRoZSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IG51bWJlciBcdmFye3ZhbHVlfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1BhY2tlcl17cGFja19kb3VibGV9e3ZhbHVlfQotUGFja3MgdGhlIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgbnVtYmVyIFx2YXJ7dmFsdWV9LgotXGVuZHttZXRob2RkZXNjfQotCi1UaGUgZm9sbG93aW5nIG1ldGhvZHMgc3VwcG9ydCBwYWNraW5nIHN0cmluZ3MsIGJ5dGVzLCBhbmQgb3BhcXVlIGRhdGE6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtQYWNrZXJde3BhY2tfZnN0cmluZ317biwgc30KLVBhY2tzIGEgZml4ZWQgbGVuZ3RoIHN0cmluZywgXHZhcntzfS4gIFx2YXJ7bn0gaXMgdGhlIGxlbmd0aCBvZiB0aGUKLXN0cmluZyBidXQgaXQgaXMgXGVtcGh7bm90fSBwYWNrZWQgaW50byB0aGUgZGF0YSBidWZmZXIuICBUaGUgc3RyaW5nCi1pcyBwYWRkZWQgd2l0aCBudWxsIGJ5dGVzIGlmIG5lY2Vzc2FyeSB0byBndWFyYW50ZWVkIDQgYnl0ZSBhbGlnbm1lbnQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtQYWNrZXJde3BhY2tfZm9wYXF1ZX17biwgZGF0YX0KLVBhY2tzIGEgZml4ZWQgbGVuZ3RoIG9wYXF1ZSBkYXRhIHN0cmVhbSwgc2ltaWxhcmx5IHRvCi1cbWV0aG9ke3BhY2tfZnN0cmluZygpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1BhY2tlcl17cGFja19zdHJpbmd9e3N9Ci1QYWNrcyBhIHZhcmlhYmxlIGxlbmd0aCBzdHJpbmcsIFx2YXJ7c30uICBUaGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgaXMKLWZpcnN0IHBhY2tlZCBhcyBhbiB1bnNpZ25lZCBpbnRlZ2VyLCB0aGVuIHRoZSBzdHJpbmcgZGF0YSBpcyBwYWNrZWQKLXdpdGggXG1ldGhvZHtwYWNrX2ZzdHJpbmcoKX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtQYWNrZXJde3BhY2tfb3BhcXVlfXtkYXRhfQotUGFja3MgYSB2YXJpYWJsZSBsZW5ndGggb3BhcXVlIGRhdGEgc3RyaW5nLCBzaW1pbGFybHkgdG8KLVxtZXRob2R7cGFja19zdHJpbmcoKX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtQYWNrZXJde3BhY2tfYnl0ZXN9e2J5dGVzfQotUGFja3MgYSB2YXJpYWJsZSBsZW5ndGggYnl0ZSBzdHJlYW0sIHNpbWlsYXJseSB0byBcbWV0aG9ke3BhY2tfc3RyaW5nKCl9LgotXGVuZHttZXRob2RkZXNjfQotCi1UaGUgZm9sbG93aW5nIG1ldGhvZHMgc3VwcG9ydCBwYWNraW5nIGFycmF5cyBhbmQgbGlzdHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtQYWNrZXJde3BhY2tfbGlzdH17bGlzdCwgcGFja19pdGVtfQotUGFja3MgYSBcdmFye2xpc3R9IG9mIGhvbW9nZW5lb3VzIGl0ZW1zLiAgVGhpcyBtZXRob2QgaXMgdXNlZnVsIGZvcgotbGlzdHMgd2l0aCBhbiBpbmRldGVybWluYXRlIHNpemU7IGkuZS4gdGhlIHNpemUgaXMgbm90IGF2YWlsYWJsZSB1bnRpbAotdGhlIGVudGlyZSBsaXN0IGhhcyBiZWVuIHdhbGtlZC4gIEZvciBlYWNoIGl0ZW0gaW4gdGhlIGxpc3QsIGFuCi11bnNpZ25lZCBpbnRlZ2VyIFxjb2RlezF9IGlzIHBhY2tlZCBmaXJzdCwgZm9sbG93ZWQgYnkgdGhlIGRhdGEgdmFsdWUKLWZyb20gdGhlIGxpc3QuICBcdmFye3BhY2tfaXRlbX0gaXMgdGhlIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHRvIHBhY2sKLXRoZSBpbmRpdmlkdWFsIGl0ZW0uICBBdCB0aGUgZW5kIG9mIHRoZSBsaXN0LCBhbiB1bnNpZ25lZCBpbnRlZ2VyCi1cY29kZXswfSBpcyBwYWNrZWQuCi0KLUZvciBleGFtcGxlLCB0byBwYWNrIGEgbGlzdCBvZiBpbnRlZ2VycywgdGhlIGNvZGUgbWlnaHQgYXBwZWFyIGxpa2UKLXRoaXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCB4ZHJsaWIKLXAgPSB4ZHJsaWIuUGFja2VyKCkKLXAucGFja19saXN0KFsxLCAyLCAzXSwgcC5wYWNrX2ludCkKLVxlbmR7dmVyYmF0aW19Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtQYWNrZXJde3BhY2tfZmFycmF5fXtuLCBhcnJheSwgcGFja19pdGVtfQotUGFja3MgYSBmaXhlZCBsZW5ndGggbGlzdCAoXHZhcnthcnJheX0pIG9mIGhvbW9nZW5lb3VzIGl0ZW1zLiAgXHZhcntufQotaXMgdGhlIGxlbmd0aCBvZiB0aGUgbGlzdDsgaXQgaXMgXGVtcGh7bm90fSBwYWNrZWQgaW50byB0aGUgYnVmZmVyLAotYnV0IGEgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSBleGNlcHRpb24gaXMgcmFpc2VkIGlmCi1cY29kZXtsZW4oXHZhcnthcnJheX0pfSBpcyBub3QgZXF1YWwgdG8gXHZhcntufS4gIEFzIGFib3ZlLAotXHZhcntwYWNrX2l0ZW19IGlzIHRoZSBmdW5jdGlvbiB1c2VkIHRvIHBhY2sgZWFjaCBlbGVtZW50LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUGFja2VyXXtwYWNrX2FycmF5fXtsaXN0LCBwYWNrX2l0ZW19Ci1QYWNrcyBhIHZhcmlhYmxlIGxlbmd0aCBcdmFye2xpc3R9IG9mIGhvbW9nZW5lb3VzIGl0ZW1zLiAgRmlyc3QsIHRoZQotbGVuZ3RoIG9mIHRoZSBsaXN0IGlzIHBhY2tlZCBhcyBhbiB1bnNpZ25lZCBpbnRlZ2VyLCB0aGVuIGVhY2ggZWxlbWVudAotaXMgcGFja2VkIGFzIGluIFxtZXRob2R7cGFja19mYXJyYXkoKX0gYWJvdmUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLQotXHN1YnNlY3Rpb257VW5wYWNrZXIgT2JqZWN0cyBcbGFiZWx7eGRyLXVucGFja2VyLW9iamVjdHN9fQotCi1UaGUgXGNsYXNze1VucGFja2VyfSBjbGFzcyBvZmZlcnMgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotCi1cYmVnaW57bWV0aG9kZGVzY31bVW5wYWNrZXJde3Jlc2V0fXtkYXRhfQotUmVzZXRzIHRoZSBzdHJpbmcgYnVmZmVyIHdpdGggdGhlIGdpdmVuIFx2YXJ7ZGF0YX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtVbnBhY2tlcl17Z2V0X3Bvc2l0aW9ufXt9Ci1SZXR1cm5zIHRoZSBjdXJyZW50IHVucGFjayBwb3NpdGlvbiBpbiB0aGUgZGF0YSBidWZmZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtVbnBhY2tlcl17c2V0X3Bvc2l0aW9ufXtwb3NpdGlvbn0KLVNldHMgdGhlIGRhdGEgYnVmZmVyIHVucGFjayBwb3NpdGlvbiB0byBcdmFye3Bvc2l0aW9ufS4gIFlvdSBzaG91bGQgYmUKLWNhcmVmdWwgYWJvdXQgdXNpbmcgXG1ldGhvZHtnZXRfcG9zaXRpb24oKX0gYW5kIFxtZXRob2R7c2V0X3Bvc2l0aW9uKCl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bVW5wYWNrZXJde2dldF9idWZmZXJ9e30KLVJldHVybnMgdGhlIGN1cnJlbnQgdW5wYWNrIGRhdGEgYnVmZmVyIGFzIGEgc3RyaW5nLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bVW5wYWNrZXJde2RvbmV9e30KLUluZGljYXRlcyB1bnBhY2sgY29tcGxldGlvbi4gIFJhaXNlcyBhbiBcZXhjZXB0aW9ue0Vycm9yfSBleGNlcHRpb24KLWlmIGFsbCBvZiB0aGUgZGF0YSBoYXMgbm90IGJlZW4gdW5wYWNrZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLUluIGFkZGl0aW9uLCBldmVyeSBkYXRhIHR5cGUgdGhhdCBjYW4gYmUgcGFja2VkIHdpdGggYSBcY2xhc3N7UGFja2VyfSwKLWNhbiBiZSB1bnBhY2tlZCB3aXRoIGFuIFxjbGFzc3tVbnBhY2tlcn0uICBVbnBhY2tpbmcgbWV0aG9kcyBhcmUgb2YgdGhlCi1mb3JtIFxjb2Rle3VucGFja19cdmFye3R5cGV9KCl9LCBhbmQgdGFrZSBubyBhcmd1bWVudHMuICBUaGV5IHJldHVybiB0aGUKLXVucGFja2VkIG9iamVjdC4KLQotXGJlZ2lue21ldGhvZGRlc2N9W1VucGFja2VyXXt1bnBhY2tfZmxvYXR9e30KLVVucGFja3MgYSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IG51bWJlci4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1VucGFja2VyXXt1bnBhY2tfZG91YmxlfXt9Ci1VbnBhY2tzIGEgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBudW1iZXIsIHNpbWlsYXJseSB0bwotXG1ldGhvZHt1bnBhY2tfZmxvYXQoKX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLUluIGFkZGl0aW9uLCB0aGUgZm9sbG93aW5nIG1ldGhvZHMgdW5wYWNrIHN0cmluZ3MsIGJ5dGVzLCBhbmQgb3BhcXVlCi1kYXRhOgotCi1cYmVnaW57bWV0aG9kZGVzY31bVW5wYWNrZXJde3VucGFja19mc3RyaW5nfXtufQotVW5wYWNrcyBhbmQgcmV0dXJucyBhIGZpeGVkIGxlbmd0aCBzdHJpbmcuICBcdmFye259IGlzIHRoZSBudW1iZXIgb2YKLWNoYXJhY3RlcnMgZXhwZWN0ZWQuICBQYWRkaW5nIHdpdGggbnVsbCBieXRlcyB0byBndWFyYW50ZWVkIDQgYnl0ZQotYWxpZ25tZW50IGlzIGFzc3VtZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtVbnBhY2tlcl17dW5wYWNrX2ZvcGFxdWV9e259Ci1VbnBhY2tzIGFuZCByZXR1cm5zIGEgZml4ZWQgbGVuZ3RoIG9wYXF1ZSBkYXRhIHN0cmVhbSwgc2ltaWxhcmx5IHRvCi1cbWV0aG9ke3VucGFja19mc3RyaW5nKCl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bVW5wYWNrZXJde3VucGFja19zdHJpbmd9e30KLVVucGFja3MgYW5kIHJldHVybnMgYSB2YXJpYWJsZSBsZW5ndGggc3RyaW5nLiAgVGhlIGxlbmd0aCBvZiB0aGUKLXN0cmluZyBpcyBmaXJzdCB1bnBhY2tlZCBhcyBhbiB1bnNpZ25lZCBpbnRlZ2VyLCB0aGVuIHRoZSBzdHJpbmcgZGF0YQotaXMgdW5wYWNrZWQgd2l0aCBcbWV0aG9ke3VucGFja19mc3RyaW5nKCl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bVW5wYWNrZXJde3VucGFja19vcGFxdWV9e30KLVVucGFja3MgYW5kIHJldHVybnMgYSB2YXJpYWJsZSBsZW5ndGggb3BhcXVlIGRhdGEgc3RyaW5nLCBzaW1pbGFybHkgdG8KLVxtZXRob2R7dW5wYWNrX3N0cmluZygpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1VucGFja2VyXXt1bnBhY2tfYnl0ZXN9e30KLVVucGFja3MgYW5kIHJldHVybnMgYSB2YXJpYWJsZSBsZW5ndGggYnl0ZSBzdHJlYW0sIHNpbWlsYXJseSB0bwotXG1ldGhvZHt1bnBhY2tfc3RyaW5nKCl9LgotXGVuZHttZXRob2RkZXNjfQotCi1UaGUgZm9sbG93aW5nIG1ldGhvZHMgc3VwcG9ydCB1bnBhY2tpbmcgYXJyYXlzIGFuZCBsaXN0czoKLQotXGJlZ2lue21ldGhvZGRlc2N9W1VucGFja2VyXXt1bnBhY2tfbGlzdH17dW5wYWNrX2l0ZW19Ci1VbnBhY2tzIGFuZCByZXR1cm5zIGEgbGlzdCBvZiBob21vZ2VuZW91cyBpdGVtcy4gIFRoZSBsaXN0IGlzIHVucGFja2VkCi1vbmUgZWxlbWVudCBhdCBhIHRpbWUKLWJ5IGZpcnN0IHVucGFja2luZyBhbiB1bnNpZ25lZCBpbnRlZ2VyIGZsYWcuICBJZiB0aGUgZmxhZyBpcyBcY29kZXsxfSwKLXRoZW4gdGhlIGl0ZW0gaXMgdW5wYWNrZWQgYW5kIGFwcGVuZGVkIHRvIHRoZSBsaXN0LiAgQSBmbGFnIG9mCi1cY29kZXswfSBpbmRpY2F0ZXMgdGhlIGVuZCBvZiB0aGUgbGlzdC4gIFx2YXJ7dW5wYWNrX2l0ZW19IGlzIHRoZQotZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgdG8gdW5wYWNrIHRoZSBpdGVtcy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1VucGFja2VyXXt1bnBhY2tfZmFycmF5fXtuLCB1bnBhY2tfaXRlbX0KLVVucGFja3MgYW5kIHJldHVybnMgKGFzIGEgbGlzdCkgYSBmaXhlZCBsZW5ndGggYXJyYXkgb2YgaG9tb2dlbmVvdXMKLWl0ZW1zLiAgXHZhcntufSBpcyBudW1iZXIgb2YgbGlzdCBlbGVtZW50cyB0byBleHBlY3QgaW4gdGhlIGJ1ZmZlci4KLUFzIGFib3ZlLCBcdmFye3VucGFja19pdGVtfSBpcyB0aGUgZnVuY3Rpb24gdXNlZCB0byB1bnBhY2sgZWFjaCBlbGVtZW50LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bVW5wYWNrZXJde3VucGFja19hcnJheX17dW5wYWNrX2l0ZW19Ci1VbnBhY2tzIGFuZCByZXR1cm5zIGEgdmFyaWFibGUgbGVuZ3RoIFx2YXJ7bGlzdH0gb2YgaG9tb2dlbmVvdXMgaXRlbXMuCi1GaXJzdCwgdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCBpcyB1bnBhY2tlZCBhcyBhbiB1bnNpZ25lZCBpbnRlZ2VyLCB0aGVuCi1lYWNoIGVsZW1lbnQgaXMgdW5wYWNrZWQgYXMgaW4gXG1ldGhvZHt1bnBhY2tfZmFycmF5KCl9IGFib3ZlLgotXGVuZHttZXRob2RkZXNjfQotCi0KLVxzdWJzZWN0aW9ue0V4Y2VwdGlvbnMgXGxhYmVse3hkci1leGNlcHRpb25zfX0KLQotRXhjZXB0aW9ucyBpbiB0aGlzIG1vZHVsZSBhcmUgY29kZWQgYXMgY2xhc3MgaW5zdGFuY2VzOgotCi1cYmVnaW57ZXhjZGVzY317RXJyb3J9Ci1UaGUgYmFzZSBleGNlcHRpb24gY2xhc3MuICBcZXhjZXB0aW9ue0Vycm9yfSBoYXMgYSBzaW5nbGUgcHVibGljIGRhdGEKLW1lbWJlciBcbWVtYmVye21zZ30gY29udGFpbmluZyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317Q29udmVyc2lvbkVycm9yfQotQ2xhc3MgZGVyaXZlZCBmcm9tIFxleGNlcHRpb257RXJyb3J9LiAgQ29udGFpbnMgbm8gYWRkaXRpb25hbCBpbnN0YW5jZQotdmFyaWFibGVzLgotXGVuZHtleGNkZXNjfQotCi1IZXJlIGlzIGFuIGV4YW1wbGUgb2YgaG93IHlvdSB3b3VsZCBjYXRjaCBvbmUgb2YgdGhlc2UgZXhjZXB0aW9uczoKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IHhkcmxpYgotcCA9IHhkcmxpYi5QYWNrZXIoKQotdHJ5OgotICAgIHAucGFja19kb3VibGUoOC4wMSkKLWV4Y2VwdCB4ZHJsaWIuQ29udmVyc2lvbkVycm9yIGFzIGluc3RhbmNlOgotICAgIHByaW50ICdwYWNraW5nIHRoZSBkb3VibGUgZmFpbGVkOicsIGluc3RhbmNlLm1zZwotXGVuZHt2ZXJiYXRpbX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlieG1scnBjbGliLnRleCBiL0RvYy9saWIvbGlieG1scnBjbGliLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJmMjliOC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnhtbHJwY2xpYi50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwzOTEgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXt4bWxycGNsaWJ9IC0tLSBYTUwtUlBDIGNsaWVudCBhY2Nlc3N9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXt4bWxycGNsaWJ9Ci1cbW9kdWxlc3lub3BzaXN7WE1MLVJQQyBjbGllbnQgYWNjZXNzLn0KLVxtb2R1bGVhdXRob3J7RnJlZHJpayBMdW5kaH17ZnJlZHJpa0BweXRob253YXJlLmNvbX0KLVxzZWN0aW9uYXV0aG9ye0VyaWMgUy4gUmF5bW9uZH17ZXNyQHNuYXJrLnRoeXJzdXMuY29tfQotCi0lIE5vdCBldmVyeXRoaW5nIGlzIGRvY3VtZW50ZWQgeWV0LiAgSXQgbWlnaHQgYmUgZ29vZCB0byBkZXNjcmliZSAKLSUgTWFyc2hhbGxlciwgVW5tYXJzaGFsbGVyLCBnZXRwYXJzZXIsIGR1bXBzLCBsb2FkcywgYW5kIFRyYW5zcG9ydC4KLQotXHZlcnNpb25hZGRlZHsyLjJ9Ci0KLVhNTC1SUEMgaXMgYSBSZW1vdGUgUHJvY2VkdXJlIENhbGwgbWV0aG9kIHRoYXQgdXNlcyBYTUwgcGFzc2VkIHZpYQotSFRUUCBhcyBhIHRyYW5zcG9ydC4gIFdpdGggaXQsIGEgY2xpZW50IGNhbiBjYWxsIG1ldGhvZHMgd2l0aAotcGFyYW1ldGVycyBvbiBhIHJlbW90ZSBzZXJ2ZXIgKHRoZSBzZXJ2ZXIgaXMgbmFtZWQgYnkgYSBVUkkpIGFuZCBnZXQgYmFjawotc3RydWN0dXJlZCBkYXRhLiAgVGhpcyBtb2R1bGUgc3VwcG9ydHMgd3JpdGluZyBYTUwtUlBDIGNsaWVudCBjb2RlOyBpdAotaGFuZGxlcyBhbGwgdGhlIGRldGFpbHMgb2YgdHJhbnNsYXRpbmcgYmV0d2VlbiBjb25mb3JtYWJsZSBQeXRob24KLW9iamVjdHMgYW5kIFhNTCBvbiB0aGUgd2lyZS4KLQotXGJlZ2lue2NsYXNzZGVzY317U2VydmVyUHJveHl9e3VyaVxvcHRpb25hbHssIHRyYW5zcG9ydFxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmdcb3B0aW9uYWx7LCB2ZXJib3NlXG9wdGlvbmFseywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfbm9uZVxvcHRpb25hbHssIHVzZV9kYXRldGltZX19fX19fQotQSBcY2xhc3N7U2VydmVyUHJveHl9IGluc3RhbmNlIGlzIGFuIG9iamVjdCB0aGF0IG1hbmFnZXMgY29tbXVuaWNhdGlvbgotd2l0aCBhIHJlbW90ZSBYTUwtUlBDIHNlcnZlci4gIFRoZSByZXF1aXJlZCBmaXJzdCBhcmd1bWVudCBpcyBhIFVSSQotKFVuaWZvcm0gUmVzb3VyY2UgSW5kaWNhdG9yKSwgYW5kIHdpbGwgbm9ybWFsbHkgYmUgdGhlIFVSTCBvZiB0aGUKLXNlcnZlci4gIFRoZSBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQgaXMgYSB0cmFuc3BvcnQgZmFjdG9yeSBpbnN0YW5jZTsKLWJ5IGRlZmF1bHQgaXQgaXMgYW4gaW50ZXJuYWwgXGNsYXNze1NhZmVUcmFuc3BvcnR9IGluc3RhbmNlIGZvciBodHRwczoKLVVSTHMgYW5kIGFuIGludGVybmFsIEhUVFAgXGNsYXNze1RyYW5zcG9ydH0gaW5zdGFuY2Ugb3RoZXJ3aXNlLiAgVGhlCi1vcHRpb25hbCB0aGlyZCBhcmd1bWVudCBpcyBhbiBlbmNvZGluZywgYnkgZGVmYXVsdCBVVEYtOC4gVGhlIG9wdGlvbmFsCi1mb3VydGggYXJndW1lbnQgaXMgYSBkZWJ1Z2dpbmcgZmxhZy4gIElmIFx2YXJ7YWxsb3dfbm9uZX0gaXMgdHJ1ZSwgCi10aGUgUHl0aG9uIGNvbnN0YW50IFxjb2Rle05vbmV9IHdpbGwgYmUgdHJhbnNsYXRlZCBpbnRvIFhNTDsgdGhlCi1kZWZhdWx0IGJlaGF2aW91ciBpcyBmb3IgXGNvZGV7Tm9uZX0gdG8gcmFpc2UgYSBcZXhjZXB0aW9ue1R5cGVFcnJvcn0uCi1UaGlzIGlzIGEgY29tbW9ubHktdXNlZCBleHRlbnNpb24gdG8gdGhlIFhNTC1SUEMgc3BlY2lmaWNhdGlvbiwgYnV0IGlzbid0Ci1zdXBwb3J0ZWQgYnkgYWxsIGNsaWVudHMgYW5kIHNlcnZlcnM7IHNlZQotXHVybHtodHRwOi8vb250b3N5cy5jb20veG1sLXJwYy9leHRlbnNpb25zLnBocH0gZm9yIGEgZGVzY3JpcHRpb24uIAotVGhlIFx2YXJ7dXNlX2RhdGV0aW1lfSBmbGFnIGNhbiBiZSB1c2VkIHRvIGNhdXNlIGRhdGUvdGltZSB2YWx1ZXMgdG8gYmUKLXByZXNlbnRlZCBhcyBcY2xhc3N7XHJlZm1vZHVsZXtkYXRldGltZX0uZGF0ZXRpbWV9IG9iamVjdHM7IHRoaXMgaXMgZmFsc2UKLWJ5IGRlZmF1bHQuICBcY2xhc3N7XHJlZm1vZHVsZXtkYXRldGltZX0uZGF0ZXRpbWV9LAotXGNsYXNze1xyZWZtb2R1bGV7ZGF0ZXRpbWV9LmRhdGV9IGFuZCBcY2xhc3N7XHJlZm1vZHVsZXtkYXRldGltZX0udGltZX0KLW9iamVjdHMgbWF5IGJlIHBhc3NlZCB0byBjYWxscy4gIFxjbGFzc3tccmVmbW9kdWxle2RhdGV0aW1lfS5kYXRlfSBvYmplY3RzCi1hcmUgY29udmVydGVkIHdpdGggYSB0aW1lIG9mIGBgMDA6MDA6MDAnJy4KLVxjbGFzc3tccmVmbW9kdWxle2RhdGV0aW1lfS50aW1lfSBvYmplY3RzIGFyZSBjb252ZXJ0ZWQgdXNpbmcgdG9kYXkncyBkYXRlLgotCi1Cb3RoIHRoZSBIVFRQIGFuZCBIVFRQUyB0cmFuc3BvcnRzIHN1cHBvcnQgdGhlIFVSTCBzeW50YXggZXh0ZW5zaW9uIGZvcgotSFRUUCBCYXNpYyBBdXRoZW50aWNhdGlvbjogXGNvZGV7aHR0cDovL3VzZXI6cGFzc0Bob3N0OnBvcnQvcGF0aH0uICBUaGUgCi1cY29kZXt1c2VyOnBhc3N9IHBvcnRpb24gd2lsbCBiZSBiYXNlNjQtZW5jb2RlZCBhcyBhbiBIVFRQIGBBdXRob3JpemF0aW9uJwotaGVhZGVyLCBhbmQgc2VudCB0byB0aGUgcmVtb3RlIHNlcnZlciBhcyBwYXJ0IG9mIHRoZSBjb25uZWN0aW9uIHByb2Nlc3MKLXdoZW4gaW52b2tpbmcgYW4gWE1MLVJQQyBtZXRob2QuICBZb3Ugb25seSBuZWVkIHRvIHVzZSB0aGlzIGlmIHRoZQotcmVtb3RlIHNlcnZlciByZXF1aXJlcyBhIEJhc2ljIEF1dGhlbnRpY2F0aW9uIHVzZXIgYW5kIHBhc3N3b3JkLgotCi1UaGUgcmV0dXJuZWQgaW5zdGFuY2UgaXMgYSBwcm94eSBvYmplY3Qgd2l0aCBtZXRob2RzIHRoYXQgY2FuIGJlIHVzZWQKLXRvIGludm9rZSBjb3JyZXNwb25kaW5nIFJQQyBjYWxscyBvbiB0aGUgcmVtb3RlIHNlcnZlci4gIElmIHRoZSByZW1vdGUKLXNlcnZlciBzdXBwb3J0cyB0aGUgaW50cm9zcGVjdGlvbiBBUEksIHRoZSBwcm94eSBjYW4gYWxzbyBiZSB1c2VkIHRvIHF1ZXJ5Ci10aGUgcmVtb3RlIHNlcnZlciBmb3IgdGhlIG1ldGhvZHMgaXQgc3VwcG9ydHMgKHNlcnZpY2UgZGlzY292ZXJ5KSBhbmQKLWZldGNoIG90aGVyIHNlcnZlci1hc3NvY2lhdGVkIG1ldGFkYXRhLgotCi1cY2xhc3N7U2VydmVyUHJveHl9IGluc3RhbmNlIG1ldGhvZHMgdGFrZSBQeXRob24gYmFzaWMgdHlwZXMgYW5kIG9iamVjdHMgYXMgCi1hcmd1bWVudHMgYW5kIHJldHVybiBQeXRob24gYmFzaWMgdHlwZXMgYW5kIGNsYXNzZXMuICBUeXBlcyB0aGF0IGFyZQotY29uZm9ybWFibGUgKGUuZy4gdGhhdCBjYW4gYmUgbWFyc2hhbGxlZCB0aHJvdWdoIFhNTCksIGluY2x1ZGUgdGhlCi1mb2xsb3dpbmcgKGFuZCBleGNlcHQgd2hlcmUgbm90ZWQsIHRoZXkgYXJlIHVubWFyc2hhbGxlZCBhcyB0aGUgc2FtZQotUHl0aG9uIHR5cGUpOgotCi1cYmVnaW57dGFibGVpaX17bHxsfXtjb25zdGFudH17TmFtZX17TWVhbmluZ30KLSAgXGxpbmVpaXtib29sZWFufXtUaGUgXGNvbnN0YW50e1RydWV9IGFuZCBcY29uc3RhbnR7RmFsc2V9IGNvbnN0YW50c30KLSAgXGxpbmVpaXtpbnRlZ2Vyc317UGFzcyBpbiBkaXJlY3RseX0KLSAgXGxpbmVpaXtmbG9hdGluZy1wb2ludCBudW1iZXJzfXtQYXNzIGluIGRpcmVjdGx5fQotICBcbGluZWlpe3N0cmluZ3N9e1Bhc3MgaW4gZGlyZWN0bHl9Ci0gIFxsaW5laWl7YXJyYXlzfXtBbnkgUHl0aG9uIHNlcXVlbmNlIHR5cGUgY29udGFpbmluZyBjb25mb3JtYWJsZQotICAgICAgICAgICAgICAgICAgZWxlbWVudHMuIEFycmF5cyBhcmUgcmV0dXJuZWQgYXMgbGlzdHN9Ci0gIFxsaW5laWl7c3RydWN0dXJlc317QSBQeXRob24gZGljdGlvbmFyeS4gS2V5cyBtdXN0IGJlIHN0cmluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgdmFsdWVzIG1heSBiZSBhbnkgY29uZm9ybWFibGUgdHlwZS4gT2JqZWN0cwotICAgICAgICAgICAgICAgICAgICAgIG9mIHVzZXItZGVmaW5lZCBjbGFzc2VzIGNhbiBiZSBwYXNzZWQgaW47Ci0gICAgICAgICAgICAgICAgICAgICAgb25seSB0aGVpciBcdmFye19fZGljdF9ffSBhdHRyaWJ1dGUgaXMgCi0gICAgICAgICAgICAgICAgICAgICAgdHJhbnNtaXR0ZWQufQotICBcbGluZWlpe2RhdGVzfXtpbiBzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaCAocGFzcyBpbiBhbiBpbnN0YW5jZSBvZiB0aGUKLSAgICAgICAgICAgICAgICAgXGNsYXNze0RhdGVUaW1lfSBjbGFzcykgb3IgYQotICAgICAgICAgICAgICAgICBcY2xhc3N7XHJlZm1vZHVsZXtkYXRldGltZX0uZGF0ZXRpbWV9LAotICAgICAgICAgICAgICAgICBcY2xhc3N7XHJlZm1vZHVsZXtkYXRldGltZX0uZGF0ZX0gb3IKLSAgICAgICAgICAgICAgICAgXGNsYXNze1xyZWZtb2R1bGV7ZGF0ZXRpbWV9LnRpbWV9IGluc3RhbmNlfSAKLSAgXGxpbmVpaXtiaW5hcnkgZGF0YX17cGFzcyBpbiBhbiBpbnN0YW5jZSBvZiB0aGUgXGNsYXNze0JpbmFyeX0KLSAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlciBjbGFzc30KLVxlbmR7dGFibGVpaX0KLQotVGhpcyBpcyB0aGUgZnVsbCBzZXQgb2YgZGF0YSB0eXBlcyBzdXBwb3J0ZWQgYnkgWE1MLVJQQy4gIE1ldGhvZCBjYWxscwotbWF5IGFsc28gcmFpc2UgYSBzcGVjaWFsIFxleGNlcHRpb257RmF1bHR9IGluc3RhbmNlLCB1c2VkIHRvIHNpZ25hbAotWE1MLVJQQyBzZXJ2ZXIgZXJyb3JzLCBvciBcZXhjZXB0aW9ue1Byb3RvY29sRXJyb3J9IHVzZWQgdG8gc2lnbmFsIGFuCi1lcnJvciBpbiB0aGUgSFRUUC9IVFRQUyB0cmFuc3BvcnQgbGF5ZXIuICBCb3RoIFxleGNlcHRpb257RmF1bHR9IGFuZAotXGV4Y2VwdGlvbntQcm90b2NvbEVycm9yfSBkZXJpdmUgZnJvbSBhIGJhc2UgY2xhc3MgY2FsbGVkCi1cZXhjZXB0aW9ue0Vycm9yfS4gIE5vdGUgdGhhdCBldmVuIHRob3VnaCBzdGFydGluZyB3aXRoIFB5dGhvbiAyLjIgeW91Ci1jYW4gc3ViY2xhc3MgYnVpbHRpbiB0eXBlcywgdGhlIHhtbHJwY2xpYiBtb2R1bGUgY3VycmVudGx5IGRvZXMgbm90Ci1tYXJzaGFsIGluc3RhbmNlcyBvZiBzdWNoIHN1YmNsYXNzZXMuCi0KLVdoZW4gcGFzc2luZyBzdHJpbmdzLCBjaGFyYWN0ZXJzIHNwZWNpYWwgdG8gWE1MIHN1Y2ggYXMgXHNhbXB7PH0sCi1cc2FtcHs+fSwgYW5kIFxzYW1we1wmfSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZXNjYXBlZC4gIEhvd2V2ZXIsIGl0J3MKLXRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCB0aGUgc3RyaW5nIGlzIGZyZWUgb2YKLWNoYXJhY3RlcnMgdGhhdCBhcmVuJ3QgYWxsb3dlZCBpbiBYTUwsIHN1Y2ggYXMgdGhlIGNvbnRyb2wgY2hhcmFjdGVycwotd2l0aCBBU0NJSSB2YWx1ZXMgYmV0d2VlbiAwIGFuZCAzMSAoZXhjZXB0LCBvZiBjb3Vyc2UsIHRhYiwgbmV3bGluZSBhbmQKLWNhcnJpYWdlIHJldHVybik7IGZhaWxpbmcgdG8gZG8gdGhpcyB3aWxsIHJlc3VsdCBpbgotYW4gWE1MLVJQQyByZXF1ZXN0IHRoYXQgaXNuJ3Qgd2VsbC1mb3JtZWQgWE1MLiAgSWYgeW91IGhhdmUgdG8gcGFzcwotYXJiaXRyYXJ5IHN0cmluZ3MgdmlhIFhNTC1SUEMsIHVzZSB0aGUgXGNsYXNze0JpbmFyeX0gd3JhcHBlciBjbGFzcwotZGVzY3JpYmVkIGJlbG93LgotCi1cY2xhc3N7U2VydmVyfSBpcyByZXRhaW5lZCBhcyBhbiBhbGlhcyBmb3IgXGNsYXNze1NlcnZlclByb3h5fSBmb3IgYmFja3dhcmRzCi1jb21wYXRpYmlsaXR5LiAgTmV3IGNvZGUgc2hvdWxkIHVzZSBcY2xhc3N7U2VydmVyUHJveHl9LgotCi1cdmVyc2lvbmNoYW5nZWRbVGhlIFx2YXJ7dXNlX2RhdGV0aW1lfSBmbGFnIHdhcyBhZGRlZF17Mi41fQotCi1cdmVyc2lvbmNoYW5nZWRbSW5zdGFuY2VzIG9mIG5ldy1zdHlsZSBjbGFzc2VzIGNhbiBiZSBwYXNzZWQgaW4KLWlmIHRoZXkgaGF2ZSBhbiBcdmFye19fZGljdF9ffSBhdHRyaWJ1dGUgYW5kIGRvbid0IGhhdmUgYSBiYXNlIGNsYXNzCi10aGF0IGlzIG1hcnNoYWxsZWQgaW4gYSBzcGVjaWFsIHdheV17Mi42fQotXGVuZHtjbGFzc2Rlc2N9Ci0KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWV0aXRsZVtodHRwOi8vd3d3LnRsZHAub3JnL0hPV1RPL1hNTC1SUEMtSE9XVE8vaW5kZXguaHRtbF0KLSAgICAgICAgICAge1hNTC1SUEMgSE9XVE99e0EgZ29vZCBkZXNjcmlwdGlvbiBvZiBYTUwgb3BlcmF0aW9uIGFuZAotICAgICAgICAgICAgY2xpZW50IHNvZnR3YXJlIGluIHNldmVyYWwgbGFuZ3VhZ2VzLiAgQ29udGFpbnMgcHJldHR5IG11Y2gKLSAgICAgICAgICAgIGV2ZXJ5dGhpbmcgYW4gWE1MLVJQQyBjbGllbnQgZGV2ZWxvcGVyIG5lZWRzIHRvIGtub3cufQotICBcc2VldGl0bGVbaHR0cDovL3htbHJwYy1jLnNvdXJjZWZvcmdlLm5ldC9oYWNrcy5waHBdCi0gICAgICAgICAgIHtYTUwtUlBDIEhhY2tzIHBhZ2V9e0V4dGVuc2lvbnMgZm9yIHZhcmlvdXMgb3Blbi1zb3VyY2UKLSAgICAgICAgICAgIGxpYnJhcmllcyB0byBzdXBwb3J0IGludHJvc3BlY3Rpb24gYW5kIG11bHRpY2FsbC59Ci1cZW5ke3NlZWFsc299Ci0KLQotXHN1YnNlY3Rpb257U2VydmVyUHJveHkgT2JqZWN0cyBcbGFiZWx7c2VydmVycHJveHktb2JqZWN0c319Ci0KLUEgXGNsYXNze1NlcnZlclByb3h5fSBpbnN0YW5jZSBoYXMgYSBtZXRob2QgY29ycmVzcG9uZGluZyB0bwotZWFjaCByZW1vdGUgcHJvY2VkdXJlIGNhbGwgYWNjZXB0ZWQgYnkgdGhlIFhNTC1SUEMgc2VydmVyLiAgQ2FsbGluZwotdGhlIG1ldGhvZCBwZXJmb3JtcyBhbiBSUEMsIGRpc3BhdGNoZWQgYnkgYm90aCBuYW1lIGFuZCBhcmd1bWVudAotc2lnbmF0dXJlIChlLmcuIHRoZSBzYW1lIG1ldGhvZCBuYW1lIGNhbiBiZSBvdmVybG9hZGVkIHdpdGggbXVsdGlwbGUKLWFyZ3VtZW50IHNpZ25hdHVyZXMpLiAgVGhlIFJQQyBmaW5pc2hlcyBieSByZXR1cm5pbmcgYSB2YWx1ZSwgd2hpY2gKLW1heSBiZSBlaXRoZXIgcmV0dXJuZWQgZGF0YSBpbiBhIGNvbmZvcm1hbnQgdHlwZSBvciBhIFxjbGFzc3tGYXVsdH0gb3IKLVxjbGFzc3tQcm90b2NvbEVycm9yfSBvYmplY3QgaW5kaWNhdGluZyBhbiBlcnJvci4KLQotU2VydmVycyB0aGF0IHN1cHBvcnQgdGhlIFhNTCBpbnRyb3NwZWN0aW9uIEFQSSBzdXBwb3J0IHNvbWUgY29tbW9uCi1tZXRob2RzIGdyb3VwZWQgdW5kZXIgdGhlIHJlc2VydmVkIFxtZW1iZXJ7c3lzdGVtfSBtZW1iZXI6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtTZXJ2ZXJQcm94eV17c3lzdGVtLmxpc3RNZXRob2RzfXt9Ci1UaGlzIG1ldGhvZCByZXR1cm5zIGEgbGlzdCBvZiBzdHJpbmdzLCBvbmUgZm9yIGVhY2ggKG5vbi1zeXN0ZW0pCi1tZXRob2Qgc3VwcG9ydGVkIGJ5IHRoZSBYTUwtUlBDIHNlcnZlci4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1NlcnZlclByb3h5XXtzeXN0ZW0ubWV0aG9kU2lnbmF0dXJlfXtuYW1lfQotVGhpcyBtZXRob2QgdGFrZXMgb25lIHBhcmFtZXRlciwgdGhlIG5hbWUgb2YgYSBtZXRob2QgaW1wbGVtZW50ZWQgYnkKLXRoZSBYTUwtUlBDIHNlcnZlci5JdCByZXR1cm5zIGFuIGFycmF5IG9mIHBvc3NpYmxlIHNpZ25hdHVyZXMgZm9yIHRoaXMKLW1ldGhvZC4gQSBzaWduYXR1cmUgaXMgYW4gYXJyYXkgb2YgdHlwZXMuIFRoZSBmaXJzdCBvZiB0aGVzZSB0eXBlcyBpcwotdGhlIHJldHVybiB0eXBlIG9mIHRoZSBtZXRob2QsIHRoZSByZXN0IGFyZSBwYXJhbWV0ZXJzLgotCi1CZWNhdXNlIG11bHRpcGxlIHNpZ25hdHVyZXMgKGllLiBvdmVybG9hZGluZykgaXMgcGVybWl0dGVkLCB0aGlzIG1ldGhvZAotcmV0dXJucyBhIGxpc3Qgb2Ygc2lnbmF0dXJlcyByYXRoZXIgdGhhbiBhIHNpbmdsZXRvbi4KLQotU2lnbmF0dXJlcyB0aGVtc2VsdmVzIGFyZSByZXN0cmljdGVkIHRvIHRoZSB0b3AgbGV2ZWwgcGFyYW1ldGVycwotZXhwZWN0ZWQgYnkgYSBtZXRob2QuIEZvciBpbnN0YW5jZSBpZiBhIG1ldGhvZCBleHBlY3RzIG9uZSBhcnJheSBvZgotc3RydWN0cyBhcyBhIHBhcmFtZXRlciwgYW5kIGl0IHJldHVybnMgYSBzdHJpbmcsIGl0cyBzaWduYXR1cmUgaXMKLXNpbXBseSAic3RyaW5nLCBhcnJheSIuIElmIGl0IGV4cGVjdHMgdGhyZWUgaW50ZWdlcnMgYW5kIHJldHVybnMgYQotc3RyaW5nLCBpdHMgc2lnbmF0dXJlIGlzICJzdHJpbmcsIGludCwgaW50LCBpbnQiLgotCi1JZiBubyBzaWduYXR1cmUgaXMgZGVmaW5lZCBmb3IgdGhlIG1ldGhvZCwgYSBub24tYXJyYXkgdmFsdWUgaXMKLXJldHVybmVkLiBJbiBQeXRob24gdGhpcyBtZWFucyB0aGF0IHRoZSB0eXBlIG9mIHRoZSByZXR1cm5lZCAKLXZhbHVlIHdpbGwgYmUgc29tZXRoaW5nIG90aGVyIHRoYXQgbGlzdC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1NlcnZlclByb3h5XXtzeXN0ZW0ubWV0aG9kSGVscH17bmFtZX0KLVRoaXMgbWV0aG9kIHRha2VzIG9uZSBwYXJhbWV0ZXIsIHRoZSBuYW1lIG9mIGEgbWV0aG9kIGltcGxlbWVudGVkIGJ5Ci10aGUgWE1MLVJQQyBzZXJ2ZXIuICBJdCByZXR1cm5zIGEgZG9jdW1lbnRhdGlvbiBzdHJpbmcgZGVzY3JpYmluZyB0aGUKLXVzZSBvZiB0aGF0IG1ldGhvZC4gSWYgbm8gc3VjaCBzdHJpbmcgaXMgYXZhaWxhYmxlLCBhbiBlbXB0eSBzdHJpbmcgaXMKLXJldHVybmVkLiBUaGUgZG9jdW1lbnRhdGlvbiBzdHJpbmcgbWF5IGNvbnRhaW4gSFRNTCBtYXJrdXAuICAKLVxlbmR7bWV0aG9kZGVzY30KLQotSW50cm9zcGVjdGlvbiBtZXRob2RzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IHNlcnZlcnMgd3JpdHRlbiBpbgotUEhQLCBDIGFuZCBNaWNyb3NvZnQgLk5FVC4gUGFydGlhbCBpbnRyb3NwZWN0aW9uIHN1cHBvcnQgaXMgaW5jbHVkZWQKLWluIHJlY2VudCB1cGRhdGVzIHRvIFVzZXJMYW5kIEZyb250aWVyLiBJbnRyb3NwZWN0aW9uIHN1cHBvcnQgZm9yCi1QZXJsLCBQeXRob24gYW5kIEphdmEgaXMgYXZhaWxhYmxlIGF0IHRoZSBcdWxpbmt7WE1MLVJQQwotSGFja3N9e2h0dHA6Ly94bWxycGMtYy5zb3VyY2Vmb3JnZS5uZXQvaGFja3MucGhwfSBwYWdlLgotCi0KLVxzdWJzZWN0aW9ue0Jvb2xlYW4gT2JqZWN0cyBcbGFiZWx7Ym9vbGVhbi1vYmplY3RzfX0KLQotVGhpcyBjbGFzcyBtYXkgYmUgaW5pdGlhbGl6ZWQgZnJvbSBhbnkgUHl0aG9uIHZhbHVlOyB0aGUgaW5zdGFuY2UKLXJldHVybmVkIGRlcGVuZHMgb25seSBvbiBpdHMgdHJ1dGggdmFsdWUuICBJdCBzdXBwb3J0cyB2YXJpb3VzIFB5dGhvbgotb3BlcmF0b3JzIHRocm91Z2ggXG1ldGhvZHtfX2NtcF9fKCl9LCBcbWV0aG9ke19fcmVwcl9fKCl9LAotXG1ldGhvZHtfX2ludF9fKCl9LCBhbmQgXG1ldGhvZHtfX2Jvb2xfXygpfSBtZXRob2RzLCBhbGwKLWltcGxlbWVudGVkIGluIHRoZSBvYnZpb3VzIHdheXMuCi0KLUl0IGFsc28gaGFzIHRoZSBmb2xsb3dpbmcgbWV0aG9kLCBzdXBwb3J0ZWQgbWFpbmx5IGZvciBpbnRlcm5hbCB1c2UgYnkKLXRoZSB1bm1hcnNoYWxsaW5nIGNvZGU6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtCb29sZWFuXXtlbmNvZGV9e291dH0KLVdyaXRlIHRoZSBYTUwtUlBDIGVuY29kaW5nIG9mIHRoaXMgQm9vbGVhbiBpdGVtIHRvIHRoZSBvdXQgc3RyZWFtIG9iamVjdC4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cc3Vic2VjdGlvbntEYXRlVGltZSBPYmplY3RzIFxsYWJlbHtkYXRldGltZS1vYmplY3RzfX0KLQotVGhpcyBjbGFzcyBtYXkgYmUgaW5pdGlhbGl6ZWQgd2l0aCBzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaCwgYSB0aW1lIHR1cGxlLCBhbgotSVNPIDg2MDEgdGltZS9kYXRlIHN0cmluZywgb3IgYSB7fVxjbGFzc3tccmVmbW9kdWxle2RhdGV0aW1lfS5kYXRldGltZX0sCi17fVxjbGFzc3tccmVmbW9kdWxle2RhdGV0aW1lfS5kYXRlfSBvciB7fVxjbGFzc3tccmVmbW9kdWxle2RhdGV0aW1lfS50aW1lfQotaW5zdGFuY2UuICBJdCBoYXMgdGhlIGZvbGxvd2luZyBtZXRob2RzLCBzdXBwb3J0ZWQgbWFpbmx5IGZvciBpbnRlcm5hbCB1c2UKLWJ5IHRoZSBtYXJzaGFsbGluZy91bm1hcnNoYWxsaW5nIGNvZGU6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtEYXRlVGltZV17ZGVjb2RlfXtzdHJpbmd9Ci1BY2NlcHQgYSBzdHJpbmcgYXMgdGhlIGluc3RhbmNlJ3MgbmV3IHRpbWUgdmFsdWUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtEYXRlVGltZV17ZW5jb2RlfXtvdXR9Ci1Xcml0ZSB0aGUgWE1MLVJQQyBlbmNvZGluZyBvZiB0aGlzIFxjbGFzc3tEYXRlVGltZX0gaXRlbSB0byB0aGUKLVx2YXJ7b3V0fSBzdHJlYW0gb2JqZWN0LgotXGVuZHttZXRob2RkZXNjfQotCi1JdCBhbHNvIHN1cHBvcnRzIGNlcnRhaW4gb2YgUHl0aG9uJ3MgYnVpbHQtaW4gb3BlcmF0b3JzIHRocm91Z2ggCi1cbWV0aG9ke19fY21wX18oKX0gYW5kIFxtZXRob2R7X19yZXByX18oKX0gbWV0aG9kcy4KLQotCi1cc3Vic2VjdGlvbntCaW5hcnkgT2JqZWN0cyBcbGFiZWx7YmluYXJ5LW9iamVjdHN9fQotCi1UaGlzIGNsYXNzIG1heSBiZSBpbml0aWFsaXplZCBmcm9tIHN0cmluZyBkYXRhICh3aGljaCBtYXkgaW5jbHVkZSBOVUxzKS4KLVRoZSBwcmltYXJ5IGFjY2VzcyB0byB0aGUgY29udGVudCBvZiBhIFxjbGFzc3tCaW5hcnl9IG9iamVjdCBpcwotcHJvdmlkZWQgYnkgYW4gYXR0cmlidXRlOgotCi1cYmVnaW57bWVtYmVyZGVzY31bQmluYXJ5XXtkYXRhfQotVGhlIGJpbmFyeSBkYXRhIGVuY2Fwc3VsYXRlZCBieSB0aGUgXGNsYXNze0JpbmFyeX0gaW5zdGFuY2UuICBUaGUgZGF0YQotaXMgcHJvdmlkZWQgYXMgYW4gOC1iaXQgc3RyaW5nLgotXGVuZHttZW1iZXJkZXNjfQotCi1cY2xhc3N7QmluYXJ5fSBvYmplY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzLCBzdXBwb3J0ZWQgbWFpbmx5Ci1mb3IgaW50ZXJuYWwgdXNlIGJ5IHRoZSBtYXJzaGFsbGluZy91bm1hcnNoYWxsaW5nIGNvZGU6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtCaW5hcnlde2RlY29kZX17c3RyaW5nfQotQWNjZXB0IGEgYmFzZTY0IHN0cmluZyBhbmQgZGVjb2RlIGl0IGFzIHRoZSBpbnN0YW5jZSdzIG5ldyBkYXRhLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQmluYXJ5XXtlbmNvZGV9e291dH0KLVdyaXRlIHRoZSBYTUwtUlBDIGJhc2UgNjQgZW5jb2Rpbmcgb2YgdGhpcyBiaW5hcnkgaXRlbSB0byB0aGUgb3V0Ci1zdHJlYW0gb2JqZWN0LgotXGVuZHttZXRob2RkZXNjfQotCi1JdCBhbHNvIHN1cHBvcnRzIGNlcnRhaW4gb2YgUHl0aG9uJ3MgYnVpbHQtaW4gb3BlcmF0b3JzIHRocm91Z2ggYQotXG1ldGhvZHtfX2NtcF9fKCl9IG1ldGhvZC4KLQotCi1cc3Vic2VjdGlvbntGYXVsdCBPYmplY3RzIFxsYWJlbHtmYXVsdC1vYmplY3RzfX0KLQotQSBcY2xhc3N7RmF1bHR9IG9iamVjdCBlbmNhcHN1bGF0ZXMgdGhlIGNvbnRlbnQgb2YgYW4gWE1MLVJQQyBmYXVsdCB0YWcuCi1GYXVsdCBvYmplY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBtZW1iZXJzOgotCi1cYmVnaW57bWVtYmVyZGVzY31bRmF1bHRde2ZhdWx0Q29kZX0KLUEgc3RyaW5nIGluZGljYXRpbmcgdGhlIGZhdWx0IHR5cGUuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtGYXVsdF17ZmF1bHRTdHJpbmd9Ci1BIHN0cmluZyBjb250YWluaW5nIGEgZGlhZ25vc3RpYyBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmF1bHQuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLQotXHN1YnNlY3Rpb257UHJvdG9jb2xFcnJvciBPYmplY3RzIFxsYWJlbHtwcm90b2NvbC1lcnJvci1vYmplY3RzfX0KLQotQSBcY2xhc3N7UHJvdG9jb2xFcnJvcn0gb2JqZWN0IGRlc2NyaWJlcyBhIHByb3RvY29sIGVycm9yIGluIHRoZQotdW5kZXJseWluZyB0cmFuc3BvcnQgbGF5ZXIgKHN1Y2ggYXMgYSA0MDQgYG5vdCBmb3VuZCcgZXJyb3IgaWYgdGhlCi1zZXJ2ZXIgbmFtZWQgYnkgdGhlIFVSSSBkb2VzIG5vdCBleGlzdCkuICBJdCBoYXMgdGhlIGZvbGxvd2luZwotbWVtYmVyczoKLQotXGJlZ2lue21lbWJlcmRlc2N9W1Byb3RvY29sRXJyb3Jde3VybH0KLVRoZSBVUkkgb3IgVVJMIHRoYXQgdHJpZ2dlcmVkIHRoZSBlcnJvci4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W1Byb3RvY29sRXJyb3Jde2VycmNvZGV9Ci1UaGUgZXJyb3IgY29kZS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W1Byb3RvY29sRXJyb3Jde2Vycm1zZ30KLVRoZSBlcnJvciBtZXNzYWdlIG9yIGRpYWdub3N0aWMgc3RyaW5nLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bUHJvdG9jb2xFcnJvcl17aGVhZGVyc30KLUEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGhlYWRlcnMgb2YgdGhlIEhUVFAvSFRUUFMgcmVxdWVzdCB0aGF0Ci10cmlnZ2VyZWQgdGhlIGVycm9yLgotXGVuZHttZW1iZXJkZXNjfQotCi1cc3Vic2VjdGlvbntNdWx0aUNhbGwgT2JqZWN0c30KLQotXHZlcnNpb25hZGRlZHsyLjR9Ci0KLUluIFx1cmx7aHR0cDovL3d3dy54bWxycGMuY29tL2Rpc2N1c3MvbXNnUmVhZGVyXCUyNDEyMDh9LCBhbiBhcHByb2FjaAotaXMgcHJlc2VudGVkIHRvIGVuY2Fwc3VsYXRlIG11bHRpcGxlIGNhbGxzIHRvIGEgcmVtb3RlIHNlcnZlciBpbnRvIGEKLXNpbmdsZSByZXF1ZXN0LgotCi1cYmVnaW57Y2xhc3NkZXNjfXtNdWx0aUNhbGx9e3NlcnZlcn0KLQotQ3JlYXRlIGFuIG9iamVjdCB1c2VkIHRvIGJveGNhciBtZXRob2QgY2FsbHMuIFx2YXJ7c2VydmVyfSBpcyB0aGUKLWV2ZW50dWFsIHRhcmdldCBvZiB0aGUgY2FsbC4gQ2FsbHMgY2FuIGJlIG1hZGUgdG8gdGhlIHJlc3VsdCBvYmplY3QsCi1idXQgdGhleSB3aWxsIGltbWVkaWF0ZWx5IHJldHVybiBcY29kZXtOb25lfSwgYW5kIG9ubHkgc3RvcmUgdGhlCi1jYWxsIG5hbWUgYW5kIHBhcmFtZXRlcnMgaW4gdGhlIFxjbGFzc3tNdWx0aUNhbGx9IG9iamVjdC4gQ2FsbGluZwotdGhlIG9iamVjdCBpdHNlbGYgY2F1c2VzIGFsbCBzdG9yZWQgY2FsbHMgdG8gYmUgdHJhbnNtaXR0ZWQgYXMKLWEgc2luZ2xlIFxjb2Rle3N5c3RlbS5tdWx0aWNhbGx9IHJlcXVlc3QuIFRoZSByZXN1bHQgb2YgdGhpcyBjYWxsCi1pcyBhIGdlbmVyYXRvcjsgaXRlcmF0aW5nIG92ZXIgdGhpcyBnZW5lcmF0b3IgeWllbGRzIHRoZSBpbmRpdmlkdWFsCi1yZXN1bHRzLgotCi1cZW5ke2NsYXNzZGVzY30KLQotQSB1c2FnZSBleGFtcGxlIG9mIHRoaXMgY2xhc3MgaXMKLQotXGJlZ2lue3ZlcmJhdGltfQotbXVsdGljYWxsID0gTXVsdGlDYWxsKHNlcnZlcl9wcm94eSkKLW11bHRpY2FsbC5hZGQoMiwzKQotbXVsdGljYWxsLmdldF9hZGRyZXNzKCJHdWlkbyIpCi1hZGRfcmVzdWx0LCBhZGRyZXNzID0gbXVsdGljYWxsKCkKLVxlbmR7dmVyYmF0aW19Ci0KLVxzdWJzZWN0aW9ue0NvbnZlbmllbmNlIEZ1bmN0aW9uc30KLQotXGJlZ2lue2Z1bmNkZXNjfXtib29sZWFufXt2YWx1ZX0KLUNvbnZlcnQgYW55IFB5dGhvbiB2YWx1ZSB0byBvbmUgb2YgdGhlIFhNTC1SUEMgQm9vbGVhbiBjb25zdGFudHMsCi1cY29kZXtUcnVlfSBvciBcY29kZXtGYWxzZX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2R1bXBzfXtwYXJhbXNcb3B0aW9uYWx7LCBtZXRob2RuYW1lXG9wdGlvbmFseywgCi0JICAgICAgICAgICAgICAgIG1ldGhvZHJlc3BvbnNlXG9wdGlvbmFseywgZW5jb2Rpbmdcb3B0aW9uYWx7LAotCSAgICAgICAgICAgICAgICBhbGxvd19ub25lfX19fX0KLUNvbnZlcnQgXHZhcntwYXJhbXN9IGludG8gYW4gWE1MLVJQQyByZXF1ZXN0Lgotb3IgaW50byBhIHJlc3BvbnNlIGlmIFx2YXJ7bWV0aG9kcmVzcG9uc2V9IGlzIHRydWUuCi1cdmFye3BhcmFtc30gY2FuIGJlIGVpdGhlciBhIHR1cGxlIG9mIGFyZ3VtZW50cyBvciBhbiBpbnN0YW5jZSBvZiB0aGUgCi1cZXhjZXB0aW9ue0ZhdWx0fSBleGNlcHRpb24gY2xhc3MuICBJZiBcdmFye21ldGhvZHJlc3BvbnNlfSBpcyB0cnVlLAotb25seSBhIHNpbmdsZSB2YWx1ZSBjYW4gYmUgcmV0dXJuZWQsIG1lYW5pbmcgdGhhdCBcdmFye3BhcmFtc30gbXVzdCBiZSBvZiBsZW5ndGggMS4KLVx2YXJ7ZW5jb2Rpbmd9LCBpZiBzdXBwbGllZCwgaXMgdGhlIGVuY29kaW5nIHRvIHVzZSBpbiB0aGUgZ2VuZXJhdGVkCi1YTUw7IHRoZSBkZWZhdWx0IGlzIFVURi04LiAgUHl0aG9uJ3MgXGNvbnN0YW50e05vbmV9IHZhbHVlIGNhbm5vdCBiZQotdXNlZCBpbiBzdGFuZGFyZCBYTUwtUlBDOyB0byBhbGxvdyB1c2luZyBpdCB2aWEgYW4gZXh0ZW5zaW9uLCAKLXByb3ZpZGUgYSB0cnVlIHZhbHVlIGZvciBcdmFye2FsbG93X25vbmV9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtsb2Fkc317ZGF0YVxvcHRpb25hbHssIHVzZV9kYXRldGltZX19Ci1Db252ZXJ0IGFuIFhNTC1SUEMgcmVxdWVzdCBvciByZXNwb25zZSBpbnRvIFB5dGhvbiBvYmplY3RzLCBhCi1cY29kZXsoXHZhcntwYXJhbXN9LCBcdmFye21ldGhvZG5hbWV9KX0uICBcdmFye3BhcmFtc30gaXMgYSB0dXBsZSBvZiBhcmd1bWVudDsgXHZhcnttZXRob2RuYW1lfQotaXMgYSBzdHJpbmcsIG9yIFxjb2Rle05vbmV9IGlmIG5vIG1ldGhvZCBuYW1lIGlzIHByZXNlbnQgaW4gdGhlIHBhY2tldC4KLUlmIHRoZSBYTUwtUlBDIHBhY2tldCByZXByZXNlbnRzIGEgZmF1bHQgY29uZGl0aW9uLCB0aGlzCi1mdW5jdGlvbiB3aWxsIHJhaXNlIGEgXGV4Y2VwdGlvbntGYXVsdH0gZXhjZXB0aW9uLgotVGhlIFx2YXJ7dXNlX2RhdGV0aW1lfSBmbGFnIGNhbiBiZSB1c2VkIHRvIGNhdXNlIGRhdGUvdGltZSB2YWx1ZXMgdG8gYmUKLXByZXNlbnRlZCBhcyBcY2xhc3N7XHJlZm1vZHVsZXtkYXRldGltZX0uZGF0ZXRpbWV9IG9iamVjdHM7IHRoaXMgaXMgZmFsc2UKLWJ5IGRlZmF1bHQuCi1Ob3RlIHRoYXQgZXZlbiBpZiB5b3UgY2FsbCBhbiBYTUwtUlBDIG1ldGhvZCB3aXRoCi1cY2xhc3N7XHJlZm1vZHVsZXtkYXRldGltZX0uZGF0ZX0gb3IgXGNsYXNze1xyZWZtb2R1bGV7ZGF0ZXRpbWV9LnRpbWV9Ci1vYmplY3RzLCB0aGV5IGFyZSBjb252ZXJ0ZWQgdG8gXGNsYXNze0RhdGVUaW1lfSBvYmplY3RzIGludGVybmFsbHksIHNvIG9ubHkKLXt9XGNsYXNze1xyZWZtb2R1bGV7ZGF0ZXRpbWV9LmRhdGV0aW1lfSBvYmplY3RzIHdpbGwgYmUgcmV0dXJuZWQuCi0KLVx2ZXJzaW9uY2hhbmdlZFtUaGUgXHZhcnt1c2VfZGF0ZXRpbWV9IGZsYWcgd2FzIGFkZGVkXXsyLjV9Ci1cZW5ke2Z1bmNkZXNjfQotCi0KLQotXHN1YnNlY3Rpb257RXhhbXBsZSBvZiBDbGllbnQgVXNhZ2UgXGxhYmVse3htbHJwYy1jbGllbnQtZXhhbXBsZX19Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSMgc2ltcGxlIHRlc3QgcHJvZ3JhbSAoZnJvbSB0aGUgWE1MLVJQQyBzcGVjaWZpY2F0aW9uKQotZnJvbSB4bWxycGNsaWIgaW1wb3J0IFNlcnZlclByb3h5LCBFcnJvcgotCi0jIHNlcnZlciA9IFNlcnZlclByb3h5KCJodHRwOi8vbG9jYWxob3N0OjgwMDAiKSAjIGxvY2FsIHNlcnZlcgotc2VydmVyID0gU2VydmVyUHJveHkoImh0dHA6Ly9iZXR0eS51c2VybGFuZC5jb20iKQotCi1wcmludCBzZXJ2ZXIKLQotdHJ5OgotICAgIHByaW50IHNlcnZlci5leGFtcGxlcy5nZXRTdGF0ZU5hbWUoNDEpCi1leGNlcHQgRXJyb3IgYXMgdjoKLSAgICBwcmludCAiRVJST1IiLCB2Ci1cZW5ke3ZlcmJhdGltfQotCi1UbyBhY2Nlc3MgYW4gWE1MLVJQQyBzZXJ2ZXIgdGhyb3VnaCBhIHByb3h5LCB5b3UgbmVlZCB0byBkZWZpbmUgCi1hIGN1c3RvbSB0cmFuc3BvcnQuICBUaGUgZm9sbG93aW5nIGV4YW1wbGUsIAotd3JpdHRlbiBieSBOb2JvTm9ibywgJSBmaWxsIGluIG9yaWdpbmFsIGF1dGhvcidzIG5hbWUgaWYgd2UgZXZlciBsZWFybiBpdAotc2hvd3MgaG93OgotCi0lIEV4YW1wbGUgdGFrZW4gZnJvbSBodHRwOi8vbG93bGlmZS5qcC9ub2Jvbm9iby93aWtpL3htbHJwY3dpdGhwcm94eS5odG1sCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgeG1scnBjbGliLCBodHRwbGliCi0KLWNsYXNzIFByb3hpZWRUcmFuc3BvcnQoeG1scnBjbGliLlRyYW5zcG9ydCk6Ci0gICAgZGVmIHNldF9wcm94eShzZWxmLCBwcm94eSk6Ci0gICAgICAgIHNlbGYucHJveHkgPSBwcm94eQotICAgIGRlZiBtYWtlX2Nvbm5lY3Rpb24oc2VsZiwgaG9zdCk6Ci0gICAgICAgIHNlbGYucmVhbGhvc3QgPSBob3N0Ci0JaCA9IGh0dHBsaWIuSFRUUChzZWxmLnByb3h5KQotCXJldHVybiBoCi0gICAgZGVmIHNlbmRfcmVxdWVzdChzZWxmLCBjb25uZWN0aW9uLCBoYW5kbGVyLCByZXF1ZXN0X2JvZHkpOgotICAgICAgICBjb25uZWN0aW9uLnB1dHJlcXVlc3QoIlBPU1QiLCAnaHR0cDovLyVzJXMnICUgKHNlbGYucmVhbGhvc3QsIGhhbmRsZXIpKQotICAgIGRlZiBzZW5kX2hvc3Qoc2VsZiwgY29ubmVjdGlvbiwgaG9zdCk6Ci0gICAgICAgIGNvbm5lY3Rpb24ucHV0aGVhZGVyKCdIb3N0Jywgc2VsZi5yZWFsaG9zdCkKLQotcCA9IFByb3hpZWRUcmFuc3BvcnQoKQotcC5zZXRfcHJveHkoJ3Byb3h5LXNlcnZlcjo4MDgwJykKLXNlcnZlciA9IHhtbHJwY2xpYi5TZXJ2ZXIoJ2h0dHA6Ly90aW1lLnhtbHJwYy5jb20vUlBDMicsIHRyYW5zcG9ydD1wKQotcHJpbnQgc2VydmVyLmN1cnJlbnRUaW1lLmdldEN1cnJlbnRUaW1lKCkKLVxlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnppcGZpbGUudGV4IGIvRG9jL2xpYi9saWJ6aXBmaWxlLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY2Y2VlOS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnppcGZpbGUudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMzcxICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7emlwZmlsZX0gLS0tCi0gICAgICAgICBXb3JrIHdpdGggWklQIGFyY2hpdmVzfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17emlwZmlsZX0KLVxtb2R1bGVzeW5vcHNpc3tSZWFkIGFuZCB3cml0ZSBaSVAtZm9ybWF0IGFyY2hpdmUgZmlsZXMufQotXG1vZHVsZWF1dGhvcntKYW1lcyBDLiBBaGxzdHJvbX17amltQGludGVyZXQuY29tfQotXHNlY3Rpb25hdXRob3J7SmFtZXMgQy4gQWhsc3Ryb219e2ppbUBpbnRlcmV0LmNvbX0KLSUgTGFUZVggbWFya3VwIGJ5IEZyZWQgTC4gRHJha2UsIEpyLiA8ZmRyYWtlQGFjbS5vcmc+Ci0KLVx2ZXJzaW9uYWRkZWR7MS42fQotCi1UaGUgWklQIGZpbGUgZm9ybWF0IGlzIGEgY29tbW9uIGFyY2hpdmUgYW5kIGNvbXByZXNzaW9uIHN0YW5kYXJkLgotVGhpcyBtb2R1bGUgcHJvdmlkZXMgdG9vbHMgdG8gY3JlYXRlLCByZWFkLCB3cml0ZSwgYXBwZW5kLCBhbmQgbGlzdCBhCi1aSVAgZmlsZS4gIEFueSBhZHZhbmNlZCB1c2Ugb2YgdGhpcyBtb2R1bGUgd2lsbCByZXF1aXJlIGFuCi11bmRlcnN0YW5kaW5nIG9mIHRoZSBmb3JtYXQsIGFzIGRlZmluZWQgaW4KLVxjaXRldGl0bGVbaHR0cDovL3d3dy5wa3dhcmUuY29tL2J1c2luZXNzX2FuZF9kZXZlbG9wZXJzL2RldmVsb3Blci9hcHBub3RlL10KLXtQS1pJUCBBcHBsaWNhdGlvbiBOb3RlfS4KLQotVGhpcyBtb2R1bGUgZG9lcyBub3QgY3VycmVudGx5IGhhbmRsZSBaSVAgZmlsZXMgd2hpY2ggaGF2ZSBhcHBlbmRlZAotY29tbWVudHMsIG9yIG11bHRpLWRpc2sgWklQIGZpbGVzLiBJdCBjYW4gaGFuZGxlIFpJUCBmaWxlcyB0aGF0IHVzZQotdGhlIFpJUDY0IGV4dGVuc2lvbnMgKHRoYXQgaXMgWklQIGZpbGVzIHRoYXQgYXJlIG1vcmUgdGhhbiA0IEdCeXRlIGluCi1zaXplKS4gIEl0IHN1cHBvcnRzIGRlY3J5cHRpb24gb2YgZW5jcnlwdGVkIGZpbGVzIGluIFpJUCBhcmNoaXZlcywgYnV0Ci1pdCBjYW5ub3QgY3VycmVudGx5IGNyZWF0ZSBhbiBlbmNyeXB0ZWQgZmlsZS4gIAotCi1UaGUgYXZhaWxhYmxlIGF0dHJpYnV0ZXMgb2YgdGhpcyBtb2R1bGUgYXJlOgotCi1cYmVnaW57ZXhjZGVzY317QmFkWmlwZmlsZX0KLSAgVGhlIGVycm9yIHJhaXNlZCBmb3IgYmFkIFpJUCBmaWxlcyAob2xkIG5hbWU6IFxjb2Rle3ppcGZpbGUuZXJyb3J9KS4KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e0xhcmdlWmlwRmlsZX0KLSAgVGhlIGVycm9yIHJhaXNlZCB3aGVuIGEgWklQIGZpbGUgd291bGQgcmVxdWlyZSBaSVA2NCBmdW5jdGlvbmFsaXR5IGJ1dCB0aGF0Ci0gIGhhcyBub3QgYmVlbiBlbmFibGVkLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjKn17WmlwRmlsZX0KLSAgVGhlIGNsYXNzIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIFpJUCBmaWxlcy4gIFNlZQotICBgYFxjaXRldGl0bGV7WmlwRmlsZSBPYmplY3RzfScnIChzZWN0aW9uIFxyZWZ7emlwZmlsZS1vYmplY3RzfSkgZm9yCi0gIGNvbnN0cnVjdG9yIGRldGFpbHMuCi1cZW5ke2NsYXNzZGVzYyp9Ci0KLVxiZWdpbntjbGFzc2Rlc2MqfXtQeVppcEZpbGV9Ci0gIENsYXNzIGZvciBjcmVhdGluZyBaSVAgYXJjaGl2ZXMgY29udGFpbmluZyBQeXRob24gbGlicmFyaWVzLgotXGVuZHtjbGFzc2Rlc2MqfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtaaXBJbmZvfXtcb3B0aW9uYWx7ZmlsZW5hbWVcb3B0aW9uYWx7LCBkYXRlX3RpbWV9fX0KLSAgQ2xhc3MgdXNlZCB0byByZXByZXNlbnQgaW5mb3JtYXRpb24gYWJvdXQgYSBtZW1iZXIgb2YgYW4gYXJjaGl2ZS4KLSAgSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYXJlIHJldHVybmVkIGJ5IHRoZSBcbWV0aG9ke2dldGluZm8oKX0gYW5kCi0gIFxtZXRob2R7aW5mb2xpc3QoKX0gbWV0aG9kcyBvZiBcY2xhc3N7WmlwRmlsZX0gb2JqZWN0cy4gIE1vc3QgdXNlcnMKLSAgb2YgdGhlIFxtb2R1bGV7emlwZmlsZX0gbW9kdWxlIHdpbGwgbm90IG5lZWQgdG8gY3JlYXRlIHRoZXNlLCBidXQKLSAgb25seSB1c2UgdGhvc2UgY3JlYXRlZCBieSB0aGlzIG1vZHVsZS4KLSAgXHZhcntmaWxlbmFtZX0gc2hvdWxkIGJlIHRoZSBmdWxsIG5hbWUgb2YgdGhlIGFyY2hpdmUgbWVtYmVyLCBhbmQKLSAgXHZhcntkYXRlX3RpbWV9IHNob3VsZCBiZSBhIHR1cGxlIGNvbnRhaW5pbmcgc2l4IGZpZWxkcyB3aGljaAotICBkZXNjcmliZSB0aGUgdGltZSBvZiB0aGUgbGFzdCBtb2RpZmljYXRpb24gdG8gdGhlIGZpbGU7IHRoZSBmaWVsZHMKLSAgYXJlIGRlc2NyaWJlZCBpbiBzZWN0aW9uIFxyZWZ7emlwaW5mby1vYmplY3RzfSwgYGBaaXBJbmZvIE9iamVjdHMuJycKLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2lzX3ppcGZpbGV9e2ZpbGVuYW1lfQotICBSZXR1cm5zIFxjb2Rle1RydWV9IGlmIFx2YXJ7ZmlsZW5hbWV9IGlzIGEgdmFsaWQgWklQIGZpbGUgYmFzZWQgb24gaXRzIG1hZ2ljCi0gIG51bWJlciwgb3RoZXJ3aXNlIHJldHVybnMgXGNvZGV7RmFsc2V9LiAgVGhpcyBtb2R1bGUgZG9lcyBub3QgY3VycmVudGx5Ci0gIGhhbmRsZSBaSVAgZmlsZXMgd2hpY2ggaGF2ZSBhcHBlbmRlZCBjb21tZW50cy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317WklQX1NUT1JFRH0KLSAgVGhlIG51bWVyaWMgY29uc3RhbnQgZm9yIGFuIHVuY29tcHJlc3NlZCBhcmNoaXZlIG1lbWJlci4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317WklQX0RFRkxBVEVEfQotICBUaGUgbnVtZXJpYyBjb25zdGFudCBmb3IgdGhlIHVzdWFsIFpJUCBjb21wcmVzc2lvbiBtZXRob2QuICBUaGlzCi0gIHJlcXVpcmVzIHRoZSB6bGliIG1vZHVsZS4gIE5vIG90aGVyIGNvbXByZXNzaW9uIG1ldGhvZHMgYXJlCi0gIGN1cnJlbnRseSBzdXBwb3J0ZWQuCi1cZW5ke2RhdGFkZXNjfQotCi0KLVxiZWdpbntzZWVhbHNvfQotICBcc2VldGl0bGVbaHR0cDovL3d3dy5wa3dhcmUuY29tL2J1c2luZXNzX2FuZF9kZXZlbG9wZXJzL2RldmVsb3Blci9hcHBub3RlL10KLSAgICAgICAgICAge1BLWklQIEFwcGxpY2F0aW9uIE5vdGV9e0RvY3VtZW50YXRpb24gb24gdGhlIFpJUCBmaWxlIGZvcm1hdCBieQotICAgICAgICAgICAgUGhpbCBLYXR6LCB0aGUgY3JlYXRvciBvZiB0aGUgZm9ybWF0IGFuZCBhbGdvcml0aG1zIHVzZWQufQotCi0gIFxzZWV0aXRsZVtodHRwOi8vd3d3LmluZm8temlwLm9yZy9wdWIvaW5mb3ppcC9de0luZm8tWklQIEhvbWUgUGFnZX17Ci0gICAgICAgICAgICBJbmZvcm1hdGlvbiBhYm91dCB0aGUgSW5mby1aSVAgcHJvamVjdCdzIFpJUCBhcmNoaXZlCi0gICAgICAgICAgICBwcm9ncmFtcyBhbmQgZGV2ZWxvcG1lbnQgbGlicmFyaWVzLn0KLVxlbmR7c2VlYWxzb30KLQotCi1cc3Vic2VjdGlvbntaaXBGaWxlIE9iamVjdHMgXGxhYmVse3ppcGZpbGUtb2JqZWN0c319Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1ppcEZpbGV9e2ZpbGVcb3B0aW9uYWx7LCBtb2RlXG9wdGlvbmFseywgY29tcHJlc3Npb25cb3B0aW9uYWx7LCBhbGxvd1ppcDY0fX19fSAKLSAgT3BlbiBhIFpJUCBmaWxlLCB3aGVyZSBcdmFye2ZpbGV9IGNhbiBiZSBlaXRoZXIgYSBwYXRoIHRvIGEgZmlsZQotICAoYSBzdHJpbmcpIG9yIGEgZmlsZS1saWtlIG9iamVjdC4gIFRoZSBcdmFye21vZGV9IHBhcmFtZXRlcgotICBzaG91bGQgYmUgXGNvZGV7J3InfSB0byByZWFkIGFuIGV4aXN0aW5nIGZpbGUsIFxjb2Rleyd3J30gdG8KLSAgdHJ1bmNhdGUgYW5kIHdyaXRlIGEgbmV3IGZpbGUsIG9yIFxjb2RleydhJ30gdG8gYXBwZW5kIHRvIGFuCi0gIGV4aXN0aW5nIGZpbGUuICBJZiBcdmFye21vZGV9IGlzIFxjb2RleydhJ30gYW5kIFx2YXJ7ZmlsZX0KLSAgcmVmZXJzIHRvIGFuIGV4aXN0aW5nIFpJUCBmaWxlLCB0aGVuIGFkZGl0aW9uYWwgZmlsZXMgYXJlIGFkZGVkIHRvCi0gIGl0LiAgSWYgXHZhcntmaWxlfSBkb2VzIG5vdCByZWZlciB0byBhIFpJUCBmaWxlLCB0aGVuIGEgbmV3IFpJUAotICBhcmNoaXZlIGlzIGFwcGVuZGVkIHRvIHRoZSBmaWxlLiAgVGhpcyBpcyBtZWFudCBmb3IgYWRkaW5nIGEgWklQCi0gIGFyY2hpdmUgdG8gYW5vdGhlciBmaWxlLCBzdWNoIGFzIFxmaWxle3B5dGhvbi5leGV9LiAgVXNpbmcKLQotXGJlZ2lue3ZlcmJhdGltfQotY2F0IG15emlwLnppcCA+PiBweXRob24uZXhlCi1cZW5ke3ZlcmJhdGltfQotCi0gIGFsc28gd29ya3MsIGFuZCBhdCBsZWFzdCBccHJvZ3JhbXtXaW5aaXB9IGNhbiByZWFkIHN1Y2ggZmlsZXMuCi0gIElmIFx2YXJ7bW9kZX0gaXMgXGNvZGV7YX0gYW5kIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0IGF0IGFsbCwKLSAgaXQgaXMgY3JlYXRlZC4KLSAgXHZhcntjb21wcmVzc2lvbn0gaXMgdGhlIFpJUCBjb21wcmVzc2lvbiBtZXRob2QgdG8gdXNlIHdoZW4gd3JpdGluZwotICB0aGUgYXJjaGl2ZSwgYW5kIHNob3VsZCBiZSBcY29uc3RhbnR7WklQX1NUT1JFRH0gb3IKLSAgXGNvbnN0YW50e1pJUF9ERUZMQVRFRH07IHVucmVjb2duaXplZCB2YWx1ZXMgd2lsbCBjYXVzZQotICBcZXhjZXB0aW9ue1J1bnRpbWVFcnJvcn0gdG8gYmUgcmFpc2VkLiAgSWYgXGNvbnN0YW50e1pJUF9ERUZMQVRFRH0KLSAgaXMgc3BlY2lmaWVkIGJ1dCB0aGUgXHJlZm1vZHVsZXt6bGlifSBtb2R1bGUgaXMgbm90IGF2YWlsYWJsZSwKLSAgXGV4Y2VwdGlvbntSdW50aW1lRXJyb3J9IGlzIGFsc28gcmFpc2VkLiAgVGhlIGRlZmF1bHQgaXMKLSAgXGNvbnN0YW50e1pJUF9TVE9SRUR9LiAKLSAgSWYgXHZhcnthbGxvd1ppcDY0fSBpcyBcY29kZXtUcnVlfSB6aXBmaWxlIHdpbGwgY3JlYXRlIFpJUCBmaWxlcyB0aGF0IHVzZQotICB0aGUgWklQNjQgZXh0ZW5zaW9ucyB3aGVuIHRoZSB6aXBmaWxlIGlzIGxhcmdlciB0aGFuIDIgR0IuIElmIGl0IGlzIAotICBmYWxzZSAodGhlIGRlZmF1bHQpIFxtb2R1bGV7emlwZmlsZX0gd2lsbCByYWlzZSBhbiBleGNlcHRpb24gd2hlbiB0aGUKLSAgWklQIGZpbGUgd291bGQgcmVxdWlyZSBaSVA2NCBleHRlbnNpb25zLiBaSVA2NCBleHRlbnNpb25zIGFyZSBkaXNhYmxlZCBieQotICBkZWZhdWx0IGJlY2F1c2UgdGhlIGRlZmF1bHQgXHByb2dyYW17emlwfSBhbmQgXHByb2dyYW17dW56aXB9IGNvbW1hbmRzIG9uCi0gIFxVTklYe30gKHRoZSBJbmZvWklQIHV0aWxpdGllcykgZG9uJ3Qgc3VwcG9ydCB0aGVzZSBleHRlbnNpb25zLgotCi0gIFx2ZXJzaW9uY2hhbmdlZFtJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgaXQgaXMgY3JlYXRlZCBpZiB0aGUKLSAgbW9kZSBpcyAnYSddezIuNn0KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Y2xvc2V9e30KLSAgQ2xvc2UgdGhlIGFyY2hpdmUgZmlsZS4gIFlvdSBtdXN0IGNhbGwgXG1ldGhvZHtjbG9zZSgpfSBiZWZvcmUKLSAgZXhpdGluZyB5b3VyIHByb2dyYW0gb3IgZXNzZW50aWFsIHJlY29yZHMgd2lsbCBub3QgYmUgd3JpdHRlbi4gCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtnZXRpbmZvfXtuYW1lfQotICBSZXR1cm4gYSBcY2xhc3N7WmlwSW5mb30gb2JqZWN0IHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFyY2hpdmUKLSAgbWVtYmVyIFx2YXJ7bmFtZX0uICBDYWxsaW5nIFxtZXRob2R7Z2V0aW5mbygpfSBmb3IgYSBuYW1lIG5vdCBjdXJyZW50bHkKLSAgY29udGFpbmVkIGluIHRoZSBhcmNoaXZlIHdpbGwgcmFpc2UgYSBcZXhjZXB0aW9ue0tleUVycm9yfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2luZm9saXN0fXt9Ci0gIFJldHVybiBhIGxpc3QgY29udGFpbmluZyBhIFxjbGFzc3taaXBJbmZvfSBvYmplY3QgZm9yIGVhY2ggbWVtYmVyIG9mCi0gIHRoZSBhcmNoaXZlLiAgVGhlIG9iamVjdHMgYXJlIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZWlyIGVudHJpZXMgaW4KLSAgdGhlIGFjdHVhbCBaSVAgZmlsZSBvbiBkaXNrIGlmIGFuIGV4aXN0aW5nIGFyY2hpdmUgd2FzIG9wZW5lZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e25hbWVsaXN0fXt9Ci0gIFJldHVybiBhIGxpc3Qgb2YgYXJjaGl2ZSBtZW1iZXJzIGJ5IG5hbWUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtvcGVufXtuYW1lXG9wdGlvbmFseywgbW9kZVxvcHRpb25hbHssIHB3ZH19fQotICAgIEV4dHJhY3QgYSBtZW1iZXIgZnJvbSB0aGUgYXJjaGl2ZSBhcyBhIGZpbGUtbGlrZSBvYmplY3QgKFppcEV4dEZpbGUpLgotICAgIFx2YXJ7bmFtZX0gaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgaW4gdGhlIGFyY2hpdmUuIFRoZSBcdmFye21vZGV9Ci0gICAgcGFyYW1ldGVyLCBpZiBpbmNsdWRlZCwgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzogXGNvZGV7J3InfSAodGhlIAotICAgIGRlZmF1bHQpLCBcY29kZXsnVSd9LCBvciBcY29kZXsnclUnfS4gQ2hvb3NpbmcgXGNvZGV7J1UnfSBvciAKLSAgICBcY29kZXsnclUnfSB3aWxsIGVuYWJsZSB1bml2ZXJzYWwgbmV3bGluZSBzdXBwb3J0IGluIHRoZSByZWFkLW9ubHkKLSAgICBvYmplY3QuIFx2YXJ7cHdkfSBpcyB0aGUgcGFzc3dvcmQgdXNlZCBmb3IgZW5jcnlwdGVkIGZpbGVzLiAgQ2FsbGluZyAKLSAgICBcbWV0aG9ke29wZW4oKX0gb24gYSBjbG9zZWQgWmlwRmlsZSB3aWxsIHJhaXNlIGEgCi0gICAgXGV4Y2VwdGlvbntSdW50aW1lRXJyb3J9LgotICAgIFxiZWdpbntub3RpY2V9Ci0gICAgICAgIFRoZSBmaWxlLWxpa2Ugb2JqZWN0IGlzIHJlYWQtb25seSBhbmQgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotICAgICAgICBcbWV0aG9ke3JlYWQoKX0sIFxtZXRob2R7cmVhZGxpbmUoKX0sIFxtZXRob2R7cmVhZGxpbmVzKCl9LAotICAgICAgICBcbWV0aG9ke19faXRlcl9fKCl9LCBcbWV0aG9ke25leHQoKX0uIAotICAgIFxlbmR7bm90aWNlfQotICAgIFxiZWdpbntub3RpY2V9Ci0gICAgICAgIElmIHRoZSBaaXBGaWxlIHdhcyBjcmVhdGVkIGJ5IHBhc3NpbmcgaW4gYSBmaWxlLWxpa2Ugb2JqZWN0IGFzIHRoZSAKLSAgICAgICAgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGNvbnN0cnVjdG9yLCB0aGVuIHRoZSBvYmplY3QgcmV0dXJuZWQgYnkKLSAgICAgICAgXG1ldGhvZHtvcGVuKCl9IHNoYXJlcyB0aGUgWmlwRmlsZSdzIGZpbGUgcG9pbnRlci4gIFVuZGVyIHRoZXNlIAotICAgICAgICBjaXJjdW1zdGFuY2VzLCB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IFxtZXRob2R7b3BlbigpfSBzaG91bGQgbm90IAotICAgICAgICBiZSB1c2VkIGFmdGVyIGFueSBhZGRpdGlvbmFsIG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZCBvbiB0aGUgCi0gICAgICAgIFppcEZpbGUgb2JqZWN0LiAgSWYgdGhlIFppcEZpbGUgd2FzIGNyZWF0ZWQgYnkgcGFzc2luZyBpbiBhIHN0cmluZwotICAgICAgICAodGhlIGZpbGVuYW1lKSBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGNvbnN0cnVjdG9yLCB0aGVuIAotICAgICAgICBcbWV0aG9ke29wZW4oKX0gd2lsbCBjcmVhdGUgYSBuZXcgZmlsZSBvYmplY3QgdGhhdCB3aWxsIGJlIGhlbGQKLSAgICAgICAgYnkgdGhlIFppcEV4dEZpbGUsIGFsbG93aW5nIGl0IHRvIG9wZXJhdGUgaW5kZXBlbmRlbnRseSBvZiB0aGUgCi0gICAgICAgIFppcEZpbGUuCi0gICAgXGVuZHtub3RpY2V9Ci0KLSAgICBcdmVyc2lvbmFkZGVkezIuNn0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3ByaW50ZGlyfXt9Ci0gIFByaW50IGEgdGFibGUgb2YgY29udGVudHMgZm9yIHRoZSBhcmNoaXZlIHRvIFxjb2Rle3N5cy5zdGRvdXR9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317c2V0cGFzc3dvcmR9e3B3ZH0KLSAgU2V0IFx2YXJ7cHdkfSBhcyBkZWZhdWx0IHBhc3N3b3JkIHRvIGV4dHJhY3QgZW5jcnlwdGVkIGZpbGVzLgotICBcdmVyc2lvbmFkZGVkezIuNn0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3JlYWR9e25hbWVcb3B0aW9uYWx7LCBwd2R9fQotICBSZXR1cm4gdGhlIGJ5dGVzIG9mIHRoZSBmaWxlIGluIHRoZSBhcmNoaXZlLiAgVGhlIGFyY2hpdmUgbXVzdCBiZQotICBvcGVuIGZvciByZWFkIG9yIGFwcGVuZC4gXHZhcntwd2R9IGlzIHRoZSBwYXNzd29yZCB1c2VkIGZvciBlbmNyeXB0ZWQgCi0gIGZpbGVzIGFuZCwgaWYgc3BlY2lmaWVkLCBpdCB3aWxsIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHBhc3N3b3JkIHNldCB3aXRoCi0gIFxtZXRob2R7c2V0cGFzc3dvcmQoKX0uICBDYWxsaW5nIFxtZXRob2R7cmVhZCgpfSBvbiBhIGNsb3NlZCBaaXBGaWxlIAotICB3aWxsIHJhaXNlIGEgXGV4Y2VwdGlvbntSdW50aW1lRXJyb3J9LgotCi0gIFx2ZXJzaW9uY2hhbmdlZFtcdmFye3B3ZH0gd2FzIGFkZGVkXXsyLjZ9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXt0ZXN0emlwfXt9Ci0gIFJlYWQgYWxsIHRoZSBmaWxlcyBpbiB0aGUgYXJjaGl2ZSBhbmQgY2hlY2sgdGhlaXIgQ1JDJ3MgYW5kIGZpbGUKLSAgaGVhZGVycy4gIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZmlyc3QgYmFkIGZpbGUsIG9yIGVsc2UgcmV0dXJuIFxjb2Rle05vbmV9LgotICBDYWxsaW5nIFxtZXRob2R7dGVzdHppcCgpfSBvbiBhIGNsb3NlZCBaaXBGaWxlIHdpbGwgcmFpc2UgYQotICBcZXhjZXB0aW9ue1J1bnRpbWVFcnJvcn0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXt3cml0ZX17ZmlsZW5hbWVcb3B0aW9uYWx7LCBhcmNuYW1lXG9wdGlvbmFseywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NfdHlwZX19fQotICBXcml0ZSB0aGUgZmlsZSBuYW1lZCBcdmFye2ZpbGVuYW1lfSB0byB0aGUgYXJjaGl2ZSwgZ2l2aW5nIGl0IHRoZQotICBhcmNoaXZlIG5hbWUgXHZhcnthcmNuYW1lfSAoYnkgZGVmYXVsdCwgdGhpcyB3aWxsIGJlIHRoZSBzYW1lIGFzCi0gIFx2YXJ7ZmlsZW5hbWV9LCBidXQgd2l0aG91dCBhIGRyaXZlIGxldHRlciBhbmQgd2l0aCBsZWFkaW5nIHBhdGgKLSAgc2VwYXJhdG9ycyByZW1vdmVkKS4gIElmIGdpdmVuLCBcdmFye2NvbXByZXNzX3R5cGV9IG92ZXJyaWRlcyB0aGUKLSAgdmFsdWUgZ2l2ZW4gZm9yIHRoZSBcdmFye2NvbXByZXNzaW9ufSBwYXJhbWV0ZXIgdG8gdGhlIGNvbnN0cnVjdG9yCi0gIGZvciB0aGUgbmV3IGVudHJ5LiAgVGhlIGFyY2hpdmUgbXVzdCBiZSBvcGVuIHdpdGggbW9kZSBcY29kZXsndyd9Ci0gIG9yIFxjb2RleydhJ30gLS0gY2FsbGluZyBcbWV0aG9ke3dyaXRlKCl9IG9uIGEgWmlwRmlsZSBjcmVhdGVkIHdpdGgKLSAgbW9kZSBcY29kZXsncid9IHdpbGwgcmFpc2UgYSBcZXhjZXB0aW9ue1J1bnRpbWVFcnJvcn0uICBDYWxsaW5nIAotICBcbWV0aG9ke3dyaXRlKCl9IG9uIGEgY2xvc2VkIFppcEZpbGUgd2lsbCByYWlzZSBhIAotICBcZXhjZXB0aW9ue1J1bnRpbWVFcnJvcn0uCi0gIAotICBcbm90ZXtUaGVyZSBpcyBubyBvZmZpY2lhbCBmaWxlIG5hbWUgZW5jb2RpbmcgZm9yIFpJUCBmaWxlcy4KLSAgSWYgeW91IGhhdmUgdW5pY29kZSBmaWxlIG5hbWVzLCBwbGVhc2UgY29udmVydCB0aGVtIHRvIGJ5dGUgc3RyaW5ncwotICBpbiB5b3VyIGRlc2lyZWQgZW5jb2RpbmcgYmVmb3JlIHBhc3NpbmcgdGhlbSB0byBcbWV0aG9ke3dyaXRlKCl9LgotICBXaW5aaXAgaW50ZXJwcmV0cyBhbGwgZmlsZSBuYW1lcyBhcyBlbmNvZGVkIGluIENQNDM3LCBhbHNvIGtub3duCi0gIGFzIERPUyBMYXRpbi59Ci0KLSAgXG5vdGV7QXJjaGl2ZSBuYW1lcyBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhlIGFyY2hpdmUgcm9vdCwgdGhhdCBpcywKLSAgICAgICAgdGhleSBzaG91bGQgbm90IHN0YXJ0IHdpdGggYSBwYXRoIHNlcGFyYXRvci59Ci0KLSAgXG5vdGV7SWYgXGNvZGV7YXJjbmFtZX0gKG9yIFxjb2Rle2ZpbGVuYW1lfSwgaWYgXGNvZGV7YXJjbmFtZX0gaXMgCi0gIG5vdCBnaXZlbikgY29udGFpbnMgYSBudWxsIGJ5dGUsIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGluIHRoZSBhcmNoaXZlIHdpbGwKLSAgYmUgdHJ1bmNhdGVkIGF0IHRoZSBudWxsIGJ5dGUufQotCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXt3cml0ZXN0cn17emluZm9fb3JfYXJjbmFtZSwgYnl0ZXN9Ci0gIFdyaXRlIHRoZSBzdHJpbmcgXHZhcntieXRlc30gdG8gdGhlIGFyY2hpdmU7IFx2YXJ7emluZm9fb3JfYXJjbmFtZX0KLSAgaXMgZWl0aGVyIHRoZSBmaWxlIG5hbWUgaXQgd2lsbCBiZSBnaXZlbiBpbiB0aGUgYXJjaGl2ZSwgb3IgYQotICBcY2xhc3N7WmlwSW5mb30gaW5zdGFuY2UuICBJZiBpdCdzIGFuIGluc3RhbmNlLCBhdCBsZWFzdCB0aGUKLSAgZmlsZW5hbWUsIGRhdGUsIGFuZCB0aW1lIG11c3QgYmUgZ2l2ZW4uICBJZiBpdCdzIGEgbmFtZSwgdGhlIGRhdGUKLSAgYW5kIHRpbWUgaXMgc2V0IHRvIHRoZSBjdXJyZW50IGRhdGUgYW5kIHRpbWUuIFRoZSBhcmNoaXZlIG11c3QgYmUKLSAgb3BlbmVkIHdpdGggbW9kZSBcY29kZXsndyd9IG9yIFxjb2RleydhJ30gLS0gY2FsbGluZyAKLSAgXG1ldGhvZHt3cml0ZXN0cigpfSBvbiBhIFppcEZpbGUgY3JlYXRlZCB3aXRoIG1vZGUgXGNvZGV7J3InfSAKLSAgd2lsbCByYWlzZSBhIFxleGNlcHRpb257UnVudGltZUVycm9yfS4gIENhbGxpbmcgXG1ldGhvZHt3cml0ZXN0cigpfQotICBvbiBhIGNsb3NlZCBaaXBGaWxlIHdpbGwgcmFpc2UgYSBcZXhjZXB0aW9ue1J1bnRpbWVFcnJvcn0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLQotVGhlIGZvbGxvd2luZyBkYXRhIGF0dHJpYnV0ZSBpcyBhbHNvIGF2YWlsYWJsZToKLQotXGJlZ2lue21lbWJlcmRlc2N9e2RlYnVnfQotICBUaGUgbGV2ZWwgb2YgZGVidWcgb3V0cHV0IHRvIHVzZS4gIFRoaXMgbWF5IGJlIHNldCBmcm9tIFxjb2RlezB9Ci0gICh0aGUgZGVmYXVsdCwgbm8gb3V0cHV0KSB0byBcY29kZXszfSAodGhlIG1vc3Qgb3V0cHV0KS4gIERlYnVnZ2luZwotICBpbmZvcm1hdGlvbiBpcyB3cml0dGVuIHRvIFxjb2Rle3N5cy5zdGRvdXR9LgotXGVuZHttZW1iZXJkZXNjfQotCi0KLVxzdWJzZWN0aW9ue1B5WmlwRmlsZSBPYmplY3RzIFxsYWJlbHtweXppcGZpbGUtb2JqZWN0c319Ci0KLVRoZSBcY2xhc3N7UHlaaXBGaWxlfSBjb25zdHJ1Y3RvciB0YWtlcyB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFzIHRoZQotXGNsYXNze1ppcEZpbGV9IGNvbnN0cnVjdG9yLiAgSW5zdGFuY2VzIGhhdmUgb25lIG1ldGhvZCBpbiBhZGRpdGlvbiB0bwotdGhvc2Ugb2YgXGNsYXNze1ppcEZpbGV9IG9iamVjdHMuCi0KLVxiZWdpbnttZXRob2RkZXNjfVtQeVppcEZpbGVde3dyaXRlcHl9e3BhdGhuYW1lXG9wdGlvbmFseywgYmFzZW5hbWV9fQotICBTZWFyY2ggZm9yIGZpbGVzIFxmaWxleyoucHl9IGFuZCBhZGQgdGhlIGNvcnJlc3BvbmRpbmcgZmlsZSB0byB0aGUKLSAgYXJjaGl2ZS4gIFRoZSBjb3JyZXNwb25kaW5nIGZpbGUgaXMgYSBcZmlsZXsqLnB5b30gZmlsZSBpZgotICBhdmFpbGFibGUsIGVsc2UgYSBcZmlsZXsqLnB5Y30gZmlsZSwgY29tcGlsaW5nIGlmIG5lY2Vzc2FyeS4gIElmIHRoZQotICBwYXRobmFtZSBpcyBhIGZpbGUsIHRoZSBmaWxlbmFtZSBtdXN0IGVuZCB3aXRoIFxmaWxley5weX0sIGFuZCBqdXN0Ci0gIHRoZSAoY29ycmVzcG9uZGluZyBcZmlsZXsqLnB5W2NvXX0pIGZpbGUgaXMgYWRkZWQgYXQgdGhlIHRvcCBsZXZlbAotICAobm8gcGF0aCBpbmZvcm1hdGlvbikuICBJZiB0aGUgcGF0aG5hbWUgaXMgYSBmaWxlIHRoYXQgZG9lcyBub3QgZW5kIHdpdGgKLSAgXGZpbGV7LnB5fSwgYSBcZXhjZXB0aW9ue1J1bnRpbWVFcnJvcn0gd2lsbCBiZSByYWlzZWQuICBJZiBpdCBpcyBhCi0gIGRpcmVjdG9yeSwgYW5kIHRoZSBkaXJlY3RvcnkgaXMgbm90IGEgcGFja2FnZSBkaXJlY3RvcnksIHRoZW4gYWxsIHRoZQotICBmaWxlcyBcZmlsZXsqLnB5W2NvXX0gYXJlIGFkZGVkIGF0IHRoZSB0b3AgbGV2ZWwuICBJZiB0aGUgZGlyZWN0b3J5IGlzCi0gIGEgcGFja2FnZSBkaXJlY3RvcnksIHRoZW4gYWxsIFxmaWxleyoucHlbY29dfSBhcmUgYWRkZWQgdW5kZXIgdGhlIHBhY2thZ2UKLSAgbmFtZSBhcyBhIGZpbGUgcGF0aCwgYW5kIGlmIGFueSBzdWJkaXJlY3RvcmllcyBhcmUgcGFja2FnZSBkaXJlY3RvcmllcywgYWxsCi0gIG9mIHRoZXNlIGFyZSBhZGRlZCByZWN1cnNpdmVseS4gIFx2YXJ7YmFzZW5hbWV9IGlzIGludGVuZGVkIGZvcgotICBpbnRlcm5hbCB1c2Ugb25seS4gIFRoZSBcbWV0aG9ke3dyaXRlcHkoKX0gbWV0aG9kIG1ha2VzIGFyY2hpdmVzCi0gIHdpdGggZmlsZSBuYW1lcyBsaWtlIHRoaXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICBzdHJpbmcucHljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRvcCBsZXZlbCBuYW1lIAotICAgIHRlc3QvX19pbml0X18ucHljICAgICAgICAgICAgICAgICAgICAgICAgICMgUGFja2FnZSBkaXJlY3RvcnkgCi0gICAgdGVzdC90ZXN0YWxsLnB5YyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBNb2R1bGUgdGVzdC50ZXN0YWxsCi0gICAgdGVzdC9ib2d1cy9fX2luaXRfXy5weWMgICAgICAgICAgICAgICAgICAgIyBTdWJwYWNrYWdlIGRpcmVjdG9yeSAKLSAgICB0ZXN0L2JvZ3VzL215ZmlsZS5weWMgICAgICAgICAgICAgICAgICAgICAjIFN1Ym1vZHVsZSB0ZXN0LmJvZ3VzLm15ZmlsZQotXGVuZHt2ZXJiYXRpbX0KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cc3Vic2VjdGlvbntaaXBJbmZvIE9iamVjdHMgXGxhYmVse3ppcGluZm8tb2JqZWN0c319Ci0KLUluc3RhbmNlcyBvZiB0aGUgXGNsYXNze1ppcEluZm99IGNsYXNzIGFyZSByZXR1cm5lZCBieSB0aGUKLVxtZXRob2R7Z2V0aW5mbygpfSBhbmQgXG1ldGhvZHtpbmZvbGlzdCgpfSBtZXRob2RzIG9mCi1cY2xhc3N7WmlwRmlsZX0gb2JqZWN0cy4gIEVhY2ggb2JqZWN0IHN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCBhCi1zaW5nbGUgbWVtYmVyIG9mIHRoZSBaSVAgYXJjaGl2ZS4KLQotSW5zdGFuY2VzIGhhdmUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgotCi1cYmVnaW57bWVtYmVyZGVzY31bWmlwSW5mb117ZmlsZW5hbWV9Ci0gIE5hbWUgb2YgdGhlIGZpbGUgaW4gdGhlIGFyY2hpdmUuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtaaXBJbmZvXXtkYXRlX3RpbWV9Ci0gIFRoZSB0aW1lIGFuZCBkYXRlIG9mIHRoZSBsYXN0IG1vZGlmaWNhdGlvbiB0byB0aGUgYXJjaGl2ZQotICBtZW1iZXIuICBUaGlzIGlzIGEgdHVwbGUgb2Ygc2l4IHZhbHVlczoKLQotXGJlZ2lue3RhYmxlaWl9e2N8bH17Y29kZX17SW5kZXh9e1ZhbHVlfQotICBcbGluZWlpezB9e1llYXJ9Ci0gIFxsaW5laWl7MX17TW9udGggKG9uZS1iYXNlZCl9Ci0gIFxsaW5laWl7Mn17RGF5IG9mIG1vbnRoIChvbmUtYmFzZWQpfQotICBcbGluZWlpezN9e0hvdXJzICh6ZXJvLWJhc2VkKX0KLSAgXGxpbmVpaXs0fXtNaW51dGVzICh6ZXJvLWJhc2VkKX0KLSAgXGxpbmVpaXs1fXtTZWNvbmRzICh6ZXJvLWJhc2VkKX0KLVxlbmR7dGFibGVpaX0KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W1ppcEluZm9de2NvbXByZXNzX3R5cGV9Ci0gIFR5cGUgb2YgY29tcHJlc3Npb24gZm9yIHRoZSBhcmNoaXZlIG1lbWJlci4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W1ppcEluZm9de2NvbW1lbnR9Ci0gIENvbW1lbnQgZm9yIHRoZSBpbmRpdmlkdWFsIGFyY2hpdmUgbWVtYmVyLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bWmlwSW5mb117ZXh0cmF9Ci0gIEV4cGFuc2lvbiBmaWVsZCBkYXRhLiAgVGhlCi0gIFxjaXRldGl0bGVbaHR0cDovL3d3dy5wa3dhcmUuY29tL2J1c2luZXNzX2FuZF9kZXZlbG9wZXJzL2RldmVsb3Blci9hcHBub3RlL10KLSAge1BLWklQIEFwcGxpY2F0aW9uIE5vdGV9IGNvbnRhaW5zIHNvbWUgY29tbWVudHMgb24gdGhlIGludGVybmFsCi0gIHN0cnVjdHVyZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhpcyBzdHJpbmcuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtaaXBJbmZvXXtjcmVhdGVfc3lzdGVtfQotICBTeXN0ZW0gd2hpY2ggY3JlYXRlZCBaSVAgYXJjaGl2ZS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W1ppcEluZm9de2NyZWF0ZV92ZXJzaW9ufQotICBQS1pJUCB2ZXJzaW9uIHdoaWNoIGNyZWF0ZWQgWklQIGFyY2hpdmUuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtaaXBJbmZvXXtleHRyYWN0X3ZlcnNpb259Ci0gIFBLWklQIHZlcnNpb24gbmVlZGVkIHRvIGV4dHJhY3QgYXJjaGl2ZS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W1ppcEluZm9de3Jlc2VydmVkfQotICBNdXN0IGJlIHplcm8uCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtaaXBJbmZvXXtmbGFnX2JpdHN9Ci0gIFpJUCBmbGFnIGJpdHMuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtaaXBJbmZvXXt2b2x1bWV9Ci0gIFZvbHVtZSBudW1iZXIgb2YgZmlsZSBoZWFkZXIuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtaaXBJbmZvXXtpbnRlcm5hbF9hdHRyfQotICBJbnRlcm5hbCBhdHRyaWJ1dGVzLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bWmlwSW5mb117ZXh0ZXJuYWxfYXR0cn0KLSBFeHRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtaaXBJbmZvXXtoZWFkZXJfb2Zmc2V0fQotICBCeXRlIG9mZnNldCB0byB0aGUgZmlsZSBoZWFkZXIuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtaaXBJbmZvXXtDUkN9Ci0gIENSQy0zMiBvZiB0aGUgdW5jb21wcmVzc2VkIGZpbGUuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtaaXBJbmZvXXtjb21wcmVzc19zaXplfQotICBTaXplIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtaaXBJbmZvXXtmaWxlX3NpemV9Ci0gIFNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBmaWxlLgotXGVuZHttZW1iZXJkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ6aXBpbXBvcnQudGV4IGIvRG9jL2xpYi9saWJ6aXBpbXBvcnQudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWJlM2M1Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGliemlwaW1wb3J0LnRleAorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3ppcGltcG9ydH0gLS0tCi0gICAgICAgICBJbXBvcnQgbW9kdWxlcyBmcm9tIFppcCBhcmNoaXZlc30KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e3ppcGltcG9ydH0KLVxtb2R1bGVzeW5vcHNpc3tzdXBwb3J0IGZvciBpbXBvcnRpbmcgUHl0aG9uIG1vZHVsZXMgZnJvbSBaSVAgYXJjaGl2ZXMufQotXG1vZHVsZWF1dGhvcntKdXN0IHZhbiBSb3NzdW19e2p1c3RAbGV0dGVycm9yLmNvbX0KLQotXHZlcnNpb25hZGRlZHsyLjN9Ci0KLVRoaXMgbW9kdWxlIGFkZHMgdGhlIGFiaWxpdHkgdG8gaW1wb3J0IFB5dGhvbiBtb2R1bGVzIChcZmlsZXsqLnB5fSwKLVxmaWxleyoucHlbY29dfSkgYW5kIHBhY2thZ2VzIGZyb20gWklQLWZvcm1hdCBhcmNoaXZlcy4gSXQgaXMgdXN1YWxseQotbm90IG5lZWRlZCB0byB1c2UgdGhlIFxtb2R1bGV7emlwaW1wb3J0fSBtb2R1bGUgZXhwbGljaXRseTsgaXQgaXMKLWF1dG9tYXRpY2FsbHkgdXNlZCBieSB0aGUgYnVpbHRpbiBca2V5d29yZHtpbXBvcnR9IG1lY2hhbmlzbSBmb3IKLVxjb2Rle3N5cy5wYXRofSBpdGVtcyB0aGF0IGFyZSBwYXRocyB0byBaSVAgYXJjaGl2ZXMuCi0KLVR5cGljYWxseSwgXGNvZGV7c3lzLnBhdGh9IGlzIGEgbGlzdCBvZiBkaXJlY3RvcnkgbmFtZXMgYXMgc3RyaW5ncy4gIFRoaXMKLW1vZHVsZSBhbHNvIGFsbG93cyBhbiBpdGVtIG9mIFxjb2Rle3N5cy5wYXRofSB0byBiZSBhIHN0cmluZyBuYW1pbmcgYSBaSVAKLWZpbGUgYXJjaGl2ZS4gVGhlIFpJUCBhcmNoaXZlIGNhbiBjb250YWluIGEgc3ViZGlyZWN0b3J5IHN0cnVjdHVyZSB0bwotc3VwcG9ydCBwYWNrYWdlIGltcG9ydHMsIGFuZCBhIHBhdGggd2l0aGluIHRoZSBhcmNoaXZlIGNhbiBiZSBzcGVjaWZpZWQgdG8KLW9ubHkgaW1wb3J0IGZyb20gYSBzdWJkaXJlY3RvcnkuICBGb3IgZXhhbXBsZSwgdGhlIHBhdGgKLVxmaWxley90bXAvZXhhbXBsZS56aXAvbGliL30gd291bGQgb25seSBpbXBvcnQgZnJvbSB0aGUKLVxmaWxle2xpYi99IHN1YmRpcmVjdG9yeSB3aXRoaW4gdGhlIGFyY2hpdmUuCi0KLUFueSBmaWxlcyBtYXkgYmUgcHJlc2VudCBpbiB0aGUgWklQIGFyY2hpdmUsIGJ1dCBvbmx5IGZpbGVzIFxmaWxley5weX0gYW5kCi1cZmlsZXsucHlbY29dfSBhcmUgYXZhaWxhYmxlIGZvciBpbXBvcnQuICBaSVAgaW1wb3J0IG9mIGR5bmFtaWMgbW9kdWxlcwotKFxmaWxley5weWR9LCBcZmlsZXsuc299KSBpcyBkaXNhbGxvd2VkLiBOb3RlIHRoYXQgaWYgYW4gYXJjaGl2ZSBvbmx5Ci1jb250YWlucyBcZmlsZXsucHl9IGZpbGVzLCBQeXRob24gd2lsbCBub3QgYXR0ZW1wdCB0byBtb2RpZnkgdGhlIGFyY2hpdmUKLWJ5IGFkZGluZyB0aGUgY29ycmVzcG9uZGluZyBcZmlsZXsucHljfSBvciBcZmlsZXsucHlvfSBmaWxlLCBtZWFuaW5nIHRoYXQKLWlmIGEgWklQIGFyY2hpdmUgZG9lc24ndCBjb250YWluIFxmaWxley5weWN9IGZpbGVzLCBpbXBvcnRpbmcgbWF5IGJlIHJhdGhlcgotc2xvdy4KLQotVGhlIGF2YWlsYWJsZSBhdHRyaWJ1dGVzIG9mIHRoaXMgbW9kdWxlIGFyZToKLQotXGJlZ2lue2V4Y2Rlc2N9e1ppcEltcG9ydEVycm9yfQotICBFeGNlcHRpb24gcmFpc2VkIGJ5IHppcGltcG9ydGVyIG9iamVjdHMuIEl0J3MgYSBzdWJjbGFzcyBvZgotICBcZXhjZXB0aW9ue0ltcG9ydEVycm9yfSwgc28gaXQgY2FuIGJlIGNhdWdodCBhcyBcZXhjZXB0aW9ue0ltcG9ydEVycm9yfSwKLSAgdG9vLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjKn17emlwaW1wb3J0ZXJ9Ci0gIFRoZSBjbGFzcyBmb3IgaW1wb3J0aW5nIFpJUCBmaWxlcy4gIFNlZQotICBgYFxjaXRldGl0bGV7emlwaW1wb3J0ZXIgT2JqZWN0c30nJyAoc2VjdGlvbiBccmVme3ppcGltcG9ydGVyLW9iamVjdHN9KQotICBmb3IgY29uc3RydWN0b3IgZGV0YWlscy4KLVxlbmR7Y2xhc3NkZXNjKn0KLQotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZXRpdGxlW2h0dHA6Ly93d3cucGt3YXJlLmNvbS9idXNpbmVzc19hbmRfZGV2ZWxvcGVycy9kZXZlbG9wZXIvYXBwbm90ZS9dCi0gICAgICAgICAgIHtQS1pJUCBBcHBsaWNhdGlvbiBOb3RlfXtEb2N1bWVudGF0aW9uIG9uIHRoZSBaSVAgZmlsZSBmb3JtYXQgYnkKLSAgICAgICAgICAgIFBoaWwgS2F0eiwgdGhlIGNyZWF0b3Igb2YgdGhlIGZvcm1hdCBhbmQgYWxnb3JpdGhtcyB1c2VkLn0KLQotICBcc2VlcGVwezAyNzN9e0ltcG9ydCBNb2R1bGVzIGZyb20gWmlwIEFyY2hpdmVzfXtXcml0dGVuIGJ5IEphbWVzIEMuCi0gICAgICAgICAgQWhsc3Ryb20sIHdobyBhbHNvIHByb3ZpZGVkIGFuIGltcGxlbWVudGF0aW9uLiBQeXRob24gMi4zCi0gICAgICAgICAgZm9sbG93cyB0aGUgc3BlY2lmaWNhdGlvbiBpbiBQRVAgMjczLCBidXQgdXNlcyBhbgotICAgICAgICAgIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4gYnkgSnVzdCB2YW4gUm9zc3VtIHRoYXQgdXNlcyB0aGUgaW1wb3J0Ci0gICAgICAgICAgaG9va3MgZGVzY3JpYmVkIGluIFBFUCAzMDIufQotCi0gIFxzZWVwZXB7MDMwMn17TmV3IEltcG9ydCBIb29rc317VGhlIFBFUCB0byBhZGQgdGhlIGltcG9ydCBob29rcyB0aGF0IGhlbHAKLSAgICAgICAgICB0aGlzIG1vZHVsZSB3b3JrLn0KLVxlbmR7c2VlYWxzb30KLQotCi1cc3Vic2VjdGlvbnt6aXBpbXBvcnRlciBPYmplY3RzIFxsYWJlbHt6aXBpbXBvcnRlci1vYmplY3RzfX0KLQotXGJlZ2lue2NsYXNzZGVzY317emlwaW1wb3J0ZXJ9e2FyY2hpdmVwYXRofSAKLSAgQ3JlYXRlIGEgbmV3IHppcGltcG9ydGVyIGluc3RhbmNlLiBcdmFye2FyY2hpdmVwYXRofSBtdXN0IGJlIGEgcGF0aCB0bwotICBhIHppcGZpbGUuICBcZXhjZXB0aW9ue1ppcEltcG9ydEVycm9yfSBpcyByYWlzZWQgaWYgXHZhcnthcmNoaXZlcGF0aH0KLSAgZG9lc24ndCBwb2ludCB0byBhIHZhbGlkIFpJUCBhcmNoaXZlLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtmaW5kX21vZHVsZX17ZnVsbG5hbWVcb3B0aW9uYWx7LCBwYXRofX0KLSAgU2VhcmNoIGZvciBhIG1vZHVsZSBzcGVjaWZpZWQgYnkgXHZhcntmdWxsbmFtZX0uIFx2YXJ7ZnVsbG5hbWV9IG11c3QgYmUKLSAgdGhlIGZ1bGx5IHF1YWxpZmllZCAoZG90dGVkKSBtb2R1bGUgbmFtZS4gSXQgcmV0dXJucyB0aGUgemlwaW1wb3J0ZXIKLSAgaW5zdGFuY2UgaXRzZWxmIGlmIHRoZSBtb2R1bGUgd2FzIGZvdW5kLCBvciBcY29uc3RhbnR7Tm9uZX0gaWYgaXQgd2Fzbid0LgotICBUaGUgb3B0aW9uYWwgXHZhcntwYXRofSBhcmd1bWVudCBpcyBpZ25vcmVkLS0taXQncyB0aGVyZSBmb3IgCi0gIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgaW1wb3J0ZXIgcHJvdG9jb2wuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtnZXRfY29kZX17ZnVsbG5hbWV9Ci0gIFJldHVybiB0aGUgY29kZSBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgbW9kdWxlLiBSYWlzZQotICBcZXhjZXB0aW9ue1ppcEltcG9ydEVycm9yfSBpZiB0aGUgbW9kdWxlIGNvdWxkbid0IGJlIGZvdW5kLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317Z2V0X2RhdGF9e3BhdGhuYW1lfQotICBSZXR1cm4gdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIFx2YXJ7cGF0aG5hbWV9LiBSYWlzZSBcZXhjZXB0aW9ue0lPRXJyb3J9Ci0gIGlmIHRoZSBmaWxlIHdhc24ndCBmb3VuZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2dldF9zb3VyY2V9e2Z1bGxuYW1lfQotICBSZXR1cm4gdGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgc3BlY2lmaWVkIG1vZHVsZS4gUmFpc2UKLSAgXGV4Y2VwdGlvbntaaXBJbXBvcnRFcnJvcn0gaWYgdGhlIG1vZHVsZSBjb3VsZG4ndCBiZSBmb3VuZCwgcmV0dXJuCi0gIFxjb25zdGFudHtOb25lfSBpZiB0aGUgYXJjaGl2ZSBkb2VzIGNvbnRhaW4gdGhlIG1vZHVsZSwgYnV0IGhhcwotICBubyBzb3VyY2UgZm9yIGl0LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317aXNfcGFja2FnZX17ZnVsbG5hbWV9Ci0gIFJldHVybiBUcnVlIGlmIHRoZSBtb2R1bGUgc3BlY2lmaWVkIGJ5IFx2YXJ7ZnVsbG5hbWV9IGlzIGEgcGFja2FnZS4KLSAgUmFpc2UgXGV4Y2VwdGlvbntaaXBJbXBvcnRFcnJvcn0gaWYgdGhlIG1vZHVsZSBjb3VsZG4ndCBiZSBmb3VuZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2xvYWRfbW9kdWxlfXtmdWxsbmFtZX0KLSAgTG9hZCB0aGUgbW9kdWxlIHNwZWNpZmllZCBieSBcdmFye2Z1bGxuYW1lfS4gXHZhcntmdWxsbmFtZX0gbXVzdCBiZSB0aGUKLSAgZnVsbHkgcXVhbGlmaWVkIChkb3R0ZWQpIG1vZHVsZSBuYW1lLiBJdCByZXR1cm5zIHRoZSBpbXBvcnRlZAotICBtb2R1bGUsIG9yIHJhaXNlcyBcZXhjZXB0aW9ue1ppcEltcG9ydEVycm9yfSBpZiBpdCB3YXNuJ3QgZm91bmQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxzdWJzZWN0aW9ue0V4YW1wbGVzfQotXG5vZGVuYW1le3ppcGltcG9ydCBFeGFtcGxlc30KLQotSGVyZSBpcyBhbiBleGFtcGxlIHRoYXQgaW1wb3J0cyBhIG1vZHVsZSBmcm9tIGEgWklQIGFyY2hpdmUgLSBub3RlIHRoYXQKLXRoZSBcbW9kdWxle3ppcGltcG9ydH0gbW9kdWxlIGlzIG5vdCBleHBsaWNpdGx5IHVzZWQuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLSQgdW56aXAgLWwgL3RtcC9leGFtcGxlLnppcAotQXJjaGl2ZTogIC90bXAvZXhhbXBsZS56aXAKLSAgTGVuZ3RoICAgICBEYXRlICAgVGltZSAgICBOYW1lCi0gLS0tLS0tLS0gICAgLS0tLSAgIC0tLS0gICAgLS0tLQotICAgICA4NDY3ICAxMS0yNi0wMiAyMjozMCAgIGp3enRocmVhZGluZy5weQotIC0tLS0tLS0tICAgICAgICAgICAgICAgICAgIC0tLS0tLS0KLSAgICAgODQ2NyAgICAgICAgICAgICAgICAgICAxIGZpbGUKLSQgLi9weXRob24KLVB5dGhvbiAyLjMgKCMxLCBBdWcgMSAyMDAzLCAxOTo1NDozMikgCi0+Pj4gaW1wb3J0IHN5cwotPj4+IHN5cy5wYXRoLmluc2VydCgwLCAnL3RtcC9leGFtcGxlLnppcCcpICAjIEFkZCAuemlwIGZpbGUgdG8gZnJvbnQgb2YgcGF0aAotPj4+IGltcG9ydCBqd3p0aHJlYWRpbmcKLT4+PiBqd3p0aHJlYWRpbmcuX19maWxlX18KLScvdG1wL2V4YW1wbGUuemlwL2p3enRocmVhZGluZy5weScKLVxlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnpsaWIudGV4IGIvRG9jL2xpYi9saWJ6bGliLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NjN2IzYy4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnpsaWIudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7emxpYn0gLS0tCi0gICAgICAgICBDb21wcmVzc2lvbiBjb21wYXRpYmxlIHdpdGggXHByb2dyYW17Z3ppcH19Ci0KLVxkZWNsYXJlbW9kdWxle2J1aWx0aW59e3psaWJ9Ci1cbW9kdWxlc3lub3BzaXN7TG93LWxldmVsIGludGVyZmFjZSB0byBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgotICAgICAgICAgICAgICAgIHJvdXRpbmVzIGNvbXBhdGlibGUgd2l0aCBccHJvZ3JhbXtnemlwfS59Ci0KLQotRm9yIGFwcGxpY2F0aW9ucyB0aGF0IHJlcXVpcmUgZGF0YSBjb21wcmVzc2lvbiwgdGhlIGZ1bmN0aW9ucyBpbiB0aGlzCi1tb2R1bGUgYWxsb3cgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24sIHVzaW5nIHRoZSB6bGliIGxpYnJhcnkuCi1UaGUgemxpYiBsaWJyYXJ5IGhhcyBpdHMgb3duIGhvbWUgcGFnZSBhdCBcdXJse2h0dHA6Ly93d3cuemxpYi5uZXR9LiAgCi1UaGVyZSBhcmUga25vd24gaW5jb21wYXRpYmlsaXRpZXMgYmV0d2VlbiB0aGUgUHl0aG9uIG1vZHVsZSBhbmQKLXZlcnNpb25zIG9mIHRoZSB6bGliIGxpYnJhcnkgZWFybGllciB0aGFuIDEuMS4zOyAxLjEuMyBoYXMgYSBzZWN1cml0eQotdnVsbmVyYWJpbGl0eSwgc28gd2UgcmVjb21tZW5kIHVzaW5nIDEuMS40IG9yIGxhdGVyLgotCi16bGliJ3MgZnVuY3Rpb25zIGhhdmUgbWFueSBvcHRpb25zIGFuZCBvZnRlbiBuZWVkIHRvIGJlIHVzZWQgaW4gYQotcGFydGljdWxhciBvcmRlci4gIFRoaXMgZG9jdW1lbnRhdGlvbiBkb2Vzbid0IGF0dGVtcHQgdG8gY292ZXIgYWxsIG9mCi10aGUgcGVybXV0YXRpb25zOyBjb25zdWx0IHRoZSB6bGliIG1hbnVhbCBhdAotXHVybHtodHRwOi8vd3d3LnpsaWIubmV0L21hbnVhbC5odG1sfSBmb3IgYXV0aG9yaXRhdGl2ZSBpbmZvcm1hdGlvbi4KLQotVGhlIGF2YWlsYWJsZSBleGNlcHRpb24gYW5kIGZ1bmN0aW9ucyBpbiB0aGlzIG1vZHVsZSBhcmU6Ci0KLVxiZWdpbntleGNkZXNjfXtlcnJvcn0KLSAgRXhjZXB0aW9uIHJhaXNlZCBvbiBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBlcnJvcnMuCi1cZW5ke2V4Y2Rlc2N9Ci0KLQotXGJlZ2lue2Z1bmNkZXNjfXthZGxlcjMyfXtzdHJpbmdcb3B0aW9uYWx7LCB2YWx1ZX19Ci0gICBDb21wdXRlcyBhIEFkbGVyLTMyIGNoZWNrc3VtIG9mIFx2YXJ7c3RyaW5nfS4gIChBbiBBZGxlci0zMgotICAgY2hlY2tzdW0gaXMgYWxtb3N0IGFzIHJlbGlhYmxlIGFzIGEgQ1JDMzIgYnV0IGNhbiBiZSBjb21wdXRlZCBtdWNoCi0gICBtb3JlIHF1aWNrbHkuKSAgSWYgXHZhcnt2YWx1ZX0gaXMgcHJlc2VudCwgaXQgaXMgdXNlZCBhcyB0aGUKLSAgIHN0YXJ0aW5nIHZhbHVlIG9mIHRoZSBjaGVja3N1bTsgb3RoZXJ3aXNlLCBhIGZpeGVkIGRlZmF1bHQgdmFsdWUgaXMKLSAgIHVzZWQuICBUaGlzIGFsbG93cyBjb21wdXRpbmcgYSBydW5uaW5nIGNoZWNrc3VtIG92ZXIgdGhlCi0gICBjb25jYXRlbmF0aW9uIG9mIHNldmVyYWwgaW5wdXQgc3RyaW5ncy4gIFRoZSBhbGdvcml0aG0gaXMgbm90Ci0gICBjcnlwdG9ncmFwaGljYWxseSBzdHJvbmcsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgZm9yCi0gICBhdXRoZW50aWNhdGlvbiBvciBkaWdpdGFsIHNpZ25hdHVyZXMuICBTaW5jZSB0aGUgYWxnb3JpdGhtIGlzCi0gICBkZXNpZ25lZCBmb3IgdXNlIGFzIGEgY2hlY2tzdW0gYWxnb3JpdGhtLCBpdCBpcyBub3Qgc3VpdGFibGUgZm9yCi0gICB1c2UgYXMgYSBnZW5lcmFsIGhhc2ggYWxnb3JpdGhtLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtjb21wcmVzc317c3RyaW5nXG9wdGlvbmFseywgbGV2ZWx9fQotICBDb21wcmVzc2VzIHRoZSBkYXRhIGluIFx2YXJ7c3RyaW5nfSwgcmV0dXJuaW5nIGEgc3RyaW5nIGNvbnRhaW5lZAotICBjb21wcmVzc2VkIGRhdGEuICBcdmFye2xldmVsfSBpcyBhbiBpbnRlZ2VyIGZyb20gXGNvZGV7MX0gdG8KLSAgXGNvZGV7OX0gY29udHJvbGxpbmcgdGhlIGxldmVsIG9mIGNvbXByZXNzaW9uOyBcY29kZXsxfSBpcyBmYXN0ZXN0Ci0gIGFuZCBwcm9kdWNlcyB0aGUgbGVhc3QgY29tcHJlc3Npb24sIFxjb2Rlezl9IGlzIHNsb3dlc3QgYW5kIHByb2R1Y2VzCi0gIHRoZSBtb3N0LiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgXGNvZGV7Nn0uICBSYWlzZXMgdGhlCi0gIFxleGNlcHRpb257ZXJyb3J9IGV4Y2VwdGlvbiBpZiBhbnkgZXJyb3Igb2NjdXJzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtjb21wcmVzc29ian17XG9wdGlvbmFse2xldmVsfX0KLSAgUmV0dXJucyBhIGNvbXByZXNzaW9uIG9iamVjdCwgdG8gYmUgdXNlZCBmb3IgY29tcHJlc3NpbmcgZGF0YSBzdHJlYW1zCi0gIHRoYXQgd29uJ3QgZml0IGludG8gbWVtb3J5IGF0IG9uY2UuICBcdmFye2xldmVsfSBpcyBhbiBpbnRlZ2VyIGZyb20KLSAgXGNvZGV7MX0gdG8gXGNvZGV7OX0gY29udHJvbGxpbmcgdGhlIGxldmVsIG9mIGNvbXByZXNzaW9uOyBcY29kZXsxfSBpcwotICBmYXN0ZXN0IGFuZCBwcm9kdWNlcyB0aGUgbGVhc3QgY29tcHJlc3Npb24sIFxjb2Rlezl9IGlzIHNsb3dlc3QgYW5kCi0gIHByb2R1Y2VzIHRoZSBtb3N0LiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgXGNvZGV7Nn0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2NyYzMyfXtzdHJpbmdcb3B0aW9uYWx7LCB2YWx1ZX19Ci0gIENvbXB1dGVzIGEgQ1JDIChDeWNsaWMgUmVkdW5kYW5jeSBDaGVjayklCi0gIFxpbmRleHtDeWNsaWMgUmVkdW5kYW5jeSBDaGVja30KLSAgXGluZGV4e2NoZWNrc3VtIUN5Y2xpYyBSZWR1bmRhbmN5IENoZWNrfQotICBjaGVja3N1bSBvZiBcdmFye3N0cmluZ30uIElmCi0gIFx2YXJ7dmFsdWV9IGlzIHByZXNlbnQsIGl0IGlzIHVzZWQgYXMgdGhlIHN0YXJ0aW5nIHZhbHVlIG9mIHRoZQotICBjaGVja3N1bTsgb3RoZXJ3aXNlLCBhIGZpeGVkIGRlZmF1bHQgdmFsdWUgaXMgdXNlZC4gIFRoaXMgYWxsb3dzCi0gIGNvbXB1dGluZyBhIHJ1bm5pbmcgY2hlY2tzdW0gb3ZlciB0aGUgY29uY2F0ZW5hdGlvbiBvZiBzZXZlcmFsCi0gIGlucHV0IHN0cmluZ3MuICBUaGUgYWxnb3JpdGhtIGlzIG5vdCBjcnlwdG9ncmFwaGljYWxseSBzdHJvbmcsIGFuZAotICBzaG91bGQgbm90IGJlIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uIG9yIGRpZ2l0YWwgc2lnbmF0dXJlcy4gIFNpbmNlCi0gIHRoZSBhbGdvcml0aG0gaXMgZGVzaWduZWQgZm9yIHVzZSBhcyBhIGNoZWNrc3VtIGFsZ29yaXRobSwgaXQgaXMgbm90Ci0gIHN1aXRhYmxlIGZvciB1c2UgYXMgYSBnZW5lcmFsIGhhc2ggYWxnb3JpdGhtLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtkZWNvbXByZXNzfXtzdHJpbmdcb3B0aW9uYWx7LCB3Yml0c1xvcHRpb25hbHssIGJ1ZnNpemV9fX0KLSAgRGVjb21wcmVzc2VzIHRoZSBkYXRhIGluIFx2YXJ7c3RyaW5nfSwgcmV0dXJuaW5nIGEgc3RyaW5nIGNvbnRhaW5pbmcKLSAgdGhlIHVuY29tcHJlc3NlZCBkYXRhLiAgVGhlIFx2YXJ7d2JpdHN9IHBhcmFtZXRlciBjb250cm9scyB0aGUgc2l6ZSBvZgotICB0aGUgd2luZG93IGJ1ZmZlci4gIElmIFx2YXJ7YnVmc2l6ZX0gaXMgZ2l2ZW4sIGl0IGlzIHVzZWQgYXMgdGhlCi0gIGluaXRpYWwgc2l6ZSBvZiB0aGUgb3V0cHV0IGJ1ZmZlci4gIFJhaXNlcyB0aGUgXGV4Y2VwdGlvbntlcnJvcn0KLSAgZXhjZXB0aW9uIGlmIGFueSBlcnJvciBvY2N1cnMuCi0KLVRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBcdmFye3diaXRzfSBpcyB0aGUgYmFzZSB0d28gbG9nYXJpdGhtIG9mIHRoZQotc2l6ZSBvZiB0aGUgaGlzdG9yeSBidWZmZXIgKHRoZSBgYHdpbmRvdyBzaXplJycpIHVzZWQgd2hlbiBjb21wcmVzc2luZwotZGF0YS4gIEl0cyBhYnNvbHV0ZSB2YWx1ZSBzaG91bGQgYmUgYmV0d2VlbiA4IGFuZCAxNSBmb3IgdGhlIG1vc3QKLXJlY2VudCB2ZXJzaW9ucyBvZiB0aGUgemxpYiBsaWJyYXJ5LCBsYXJnZXIgdmFsdWVzIHJlc3VsdGluZyBpbiBiZXR0ZXIKLWNvbXByZXNzaW9uIGF0IHRoZSBleHBlbnNlIG9mIGdyZWF0ZXIgbWVtb3J5IHVzYWdlLiAgVGhlIGRlZmF1bHQgdmFsdWUKLWlzIDE1LiAgV2hlbiBcdmFye3diaXRzfSBpcyBuZWdhdGl2ZSwgdGhlIHN0YW5kYXJkCi1ccHJvZ3JhbXtnemlwfSBoZWFkZXIgaXMgc3VwcHJlc3NlZDsgdGhpcyBpcyBhbiB1bmRvY3VtZW50ZWQgZmVhdHVyZQotb2YgdGhlIHpsaWIgbGlicmFyeSwgdXNlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFxwcm9ncmFte3VuemlwfSdzCi1jb21wcmVzc2lvbiBmaWxlIGZvcm1hdC4KLQotXHZhcntidWZzaXplfSBpcyB0aGUgaW5pdGlhbCBzaXplIG9mIHRoZSBidWZmZXIgdXNlZCB0byBob2xkCi1kZWNvbXByZXNzZWQgZGF0YS4gIElmIG1vcmUgc3BhY2UgaXMgcmVxdWlyZWQsIHRoZSBidWZmZXIgc2l6ZSB3aWxsIGJlCi1pbmNyZWFzZWQgYXMgbmVlZGVkLCBzbyB5b3UgZG9uJ3QgaGF2ZSB0byBnZXQgdGhpcyB2YWx1ZSBleGFjdGx5Ci1yaWdodDsgdHVuaW5nIGl0IHdpbGwgb25seSBzYXZlIGEgZmV3IGNhbGxzIHRvIFxjZnVuY3Rpb257bWFsbG9jKCl9LiAgVGhlCi1kZWZhdWx0IHNpemUgaXMgMTYzODQuCi0gICAKLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZGVjb21wcmVzc29ian17XG9wdGlvbmFse3diaXRzfX0KLSAgUmV0dXJucyBhIGRlY29tcHJlc3Npb24gb2JqZWN0LCB0byBiZSB1c2VkIGZvciBkZWNvbXByZXNzaW5nIGRhdGEKLSAgc3RyZWFtcyB0aGF0IHdvbid0IGZpdCBpbnRvIG1lbW9yeSBhdCBvbmNlLiAgVGhlIFx2YXJ7d2JpdHN9Ci0gIHBhcmFtZXRlciBjb250cm9scyB0aGUgc2l6ZSBvZiB0aGUgd2luZG93IGJ1ZmZlci4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLUNvbXByZXNzaW9uIG9iamVjdHMgc3VwcG9ydCB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb21wcmVzc117Y29tcHJlc3N9e3N0cmluZ30KLUNvbXByZXNzIFx2YXJ7c3RyaW5nfSwgcmV0dXJuaW5nIGEgc3RyaW5nIGNvbnRhaW5pbmcgY29tcHJlc3NlZCBkYXRhCi1mb3IgYXQgbGVhc3QgcGFydCBvZiB0aGUgZGF0YSBpbiBcdmFye3N0cmluZ30uICBUaGlzIGRhdGEgc2hvdWxkIGJlCi1jb25jYXRlbmF0ZWQgdG8gdGhlIG91dHB1dCBwcm9kdWNlZCBieSBhbnkgcHJlY2VkaW5nIGNhbGxzIHRvIHRoZQotXG1ldGhvZHtjb21wcmVzcygpfSBtZXRob2QuICBTb21lIGlucHV0IG1heSBiZSBrZXB0IGluIGludGVybmFsIGJ1ZmZlcnMKLWZvciBsYXRlciBwcm9jZXNzaW5nLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29tcHJlc3Nde2ZsdXNofXtcb3B0aW9uYWx7bW9kZX19Ci1BbGwgcGVuZGluZyBpbnB1dCBpcyBwcm9jZXNzZWQsIGFuZCBhIHN0cmluZyBjb250YWluaW5nIHRoZSByZW1haW5pbmcKLWNvbXByZXNzZWQgb3V0cHV0IGlzIHJldHVybmVkLiAgXHZhcnttb2RlfSBjYW4gYmUgc2VsZWN0ZWQgZnJvbSB0aGUKLWNvbnN0YW50cyBcY29uc3RhbnR7Wl9TWU5DX0ZMVVNIfSwgIFxjb25zdGFudHtaX0ZVTExfRkxVU0h9LCAgb3IgCi1cY29uc3RhbnR7Wl9GSU5JU0h9LCBkZWZhdWx0aW5nIHRvIFxjb25zdGFudHtaX0ZJTklTSH0uICBcY29uc3RhbnR7Wl9TWU5DX0ZMVVNIfSBhbmQgCi1cY29uc3RhbnR7Wl9GVUxMX0ZMVVNIfSBhbGxvdyBjb21wcmVzc2luZyBmdXJ0aGVyIHN0cmluZ3Mgb2YgZGF0YSwgd2hpbGUKLVxjb25zdGFudHtaX0ZJTklTSH0gZmluaXNoZXMgdGhlIGNvbXByZXNzZWQgc3RyZWFtIGFuZCAKLXByZXZlbnRzIGNvbXByZXNzaW5nIGFueSBtb3JlIGRhdGEuICBBZnRlciBjYWxsaW5nCi1cbWV0aG9ke2ZsdXNoKCl9IHdpdGggXHZhcnttb2RlfSBzZXQgdG8gXGNvbnN0YW50e1pfRklOSVNIfSwgdGhlCi1cbWV0aG9ke2NvbXByZXNzKCl9IG1ldGhvZCBjYW5ub3QgYmUgY2FsbGVkIGFnYWluOyB0aGUgb25seSByZWFsaXN0aWMKLWFjdGlvbiBpcyB0byBkZWxldGUgdGhlIG9iamVjdC4gIAotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29tcHJlc3Nde2NvcHl9e30KLVJldHVybnMgYSBjb3B5IG9mIHRoZSBjb21wcmVzc2lvbiBvYmplY3QuICBUaGlzIGNhbiBiZSB1c2VkIHRvIGVmZmljaWVudGx5Ci1jb21wcmVzcyBhIHNldCBvZiBkYXRhIHRoYXQgc2hhcmUgYSBjb21tb24gaW5pdGlhbCBwcmVmaXguCi1cdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7bWV0aG9kZGVzY30KLQotRGVjb21wcmVzc2lvbiBvYmplY3RzIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBtZXRob2RzLCBhbmQgdHdvIGF0dHJpYnV0ZXM6Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtEZWNvbXByZXNzXXt1bnVzZWRfZGF0YX0KLUEgc3RyaW5nIHdoaWNoIGNvbnRhaW5zIGFueSBieXRlcyBwYXN0IHRoZSBlbmQgb2YgdGhlIGNvbXByZXNzZWQgZGF0YS4KLVRoYXQgaXMsIHRoaXMgcmVtYWlucyBcY29kZXsiIn0gdW50aWwgdGhlIGxhc3QgYnl0ZSB0aGF0IGNvbnRhaW5zCi1jb21wcmVzc2lvbiBkYXRhIGlzIGF2YWlsYWJsZS4gIElmIHRoZSB3aG9sZSBzdHJpbmcgdHVybmVkIG91dCB0bwotY29udGFpbiBjb21wcmVzc2VkIGRhdGEsIHRoaXMgaXMgXGNvZGV7IiJ9LCB0aGUgZW1wdHkgc3RyaW5nLgotCi1UaGUgb25seSB3YXkgdG8gZGV0ZXJtaW5lIHdoZXJlIGEgc3RyaW5nIG9mIGNvbXByZXNzZWQgZGF0YSBlbmRzIGlzIGJ5Ci1hY3R1YWxseSBkZWNvbXByZXNzaW5nIGl0LiAgVGhpcyBtZWFucyB0aGF0IHdoZW4gY29tcHJlc3NlZCBkYXRhIGlzCi1jb250YWluZWQgcGFydCBvZiBhIGxhcmdlciBmaWxlLCB5b3UgY2FuIG9ubHkgZmluZCB0aGUgZW5kIG9mIGl0IGJ5Ci1yZWFkaW5nIGRhdGEgYW5kIGZlZWRpbmcgaXQgZm9sbG93ZWQgYnkgc29tZSBub24tZW1wdHkgc3RyaW5nIGludG8gYQotZGVjb21wcmVzc2lvbiBvYmplY3QncyBcbWV0aG9ke2RlY29tcHJlc3N9IG1ldGhvZCB1bnRpbCB0aGUKLVxtZW1iZXJ7dW51c2VkX2RhdGF9IGF0dHJpYnV0ZSBpcyBubyBsb25nZXIgdGhlIGVtcHR5IHN0cmluZy4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W0RlY29tcHJlc3Nde3VuY29uc3VtZWRfdGFpbH0KLUEgc3RyaW5nIHRoYXQgY29udGFpbnMgYW55IGRhdGEgdGhhdCB3YXMgbm90IGNvbnN1bWVkIGJ5IHRoZSBsYXN0Ci1cbWV0aG9ke2RlY29tcHJlc3N9IGNhbGwgYmVjYXVzZSBpdCBleGNlZWRlZCB0aGUgbGltaXQgZm9yIHRoZQotdW5jb21wcmVzc2VkIGRhdGEgYnVmZmVyLiAgVGhpcyBkYXRhIGhhcyBub3QgeWV0IGJlZW4gc2VlbiBieSB0aGUgemxpYgotbWFjaGluZXJ5LCBzbyB5b3UgbXVzdCBmZWVkIGl0IChwb3NzaWJseSB3aXRoIGZ1cnRoZXIgZGF0YQotY29uY2F0ZW5hdGVkIHRvIGl0KSBiYWNrIHRvIGEgc3Vic2VxdWVudCBcbWV0aG9ke2RlY29tcHJlc3N9IG1ldGhvZAotY2FsbCBpbiBvcmRlciB0byBnZXQgY29ycmVjdCBvdXRwdXQuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLQotXGJlZ2lue21ldGhvZGRlc2N9W0RlY29tcHJlc3Nde2RlY29tcHJlc3N9e3N0cmluZ1xvcHRpb25hbHssIG1heF9sZW5ndGh9fQotRGVjb21wcmVzcyBcdmFye3N0cmluZ30sIHJldHVybmluZyBhIHN0cmluZyBjb250YWluaW5nIHRoZQotdW5jb21wcmVzc2VkIGRhdGEgY29ycmVzcG9uZGluZyB0byBhdCBsZWFzdCBwYXJ0IG9mIHRoZSBkYXRhIGluCi1cdmFye3N0cmluZ30uICBUaGlzIGRhdGEgc2hvdWxkIGJlIGNvbmNhdGVuYXRlZCB0byB0aGUgb3V0cHV0IHByb2R1Y2VkCi1ieSBhbnkgcHJlY2VkaW5nIGNhbGxzIHRvIHRoZQotXG1ldGhvZHtkZWNvbXByZXNzKCl9IG1ldGhvZC4gIFNvbWUgb2YgdGhlIGlucHV0IGRhdGEgbWF5IGJlIHByZXNlcnZlZAotaW4gaW50ZXJuYWwgYnVmZmVycyBmb3IgbGF0ZXIgcHJvY2Vzc2luZy4KLQotSWYgdGhlIG9wdGlvbmFsIHBhcmFtZXRlciBcdmFye21heF9sZW5ndGh9IGlzIHN1cHBsaWVkIHRoZW4gdGhlIHJldHVybiB2YWx1ZQotd2lsbCBiZSBubyBsb25nZXIgdGhhbiBcdmFye21heF9sZW5ndGh9LiBUaGlzIG1heSBtZWFuIHRoYXQgbm90IGFsbCBvZiB0aGUKLWNvbXByZXNzZWQgaW5wdXQgY2FuIGJlIHByb2Nlc3NlZDsgYW5kIHVuY29uc3VtZWQgZGF0YSB3aWxsIGJlIHN0b3JlZAotaW4gdGhlIGF0dHJpYnV0ZSBcbWVtYmVye3VuY29uc3VtZWRfdGFpbH0uIFRoaXMgc3RyaW5nIG11c3QgYmUgcGFzc2VkCi10byBhIHN1YnNlcXVlbnQgY2FsbCB0byBcbWV0aG9ke2RlY29tcHJlc3MoKX0gaWYgZGVjb21wcmVzc2lvbiBpcyB0bwotY29udGludWUuICBJZiBcdmFye21heF9sZW5ndGh9IGlzIG5vdCBzdXBwbGllZCB0aGVuIHRoZSB3aG9sZSBpbnB1dCBpcwotZGVjb21wcmVzc2VkLCBhbmQgXG1lbWJlcnt1bmNvbnN1bWVkX3RhaWx9IGlzIGFuIGVtcHR5IHN0cmluZy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0RlY29tcHJlc3Nde2ZsdXNofXtcb3B0aW9uYWx7bGVuZ3RofX0KLUFsbCBwZW5kaW5nIGlucHV0IGlzIHByb2Nlc3NlZCwgYW5kIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHJlbWFpbmluZwotdW5jb21wcmVzc2VkIG91dHB1dCBpcyByZXR1cm5lZC4gIEFmdGVyIGNhbGxpbmcgXG1ldGhvZHtmbHVzaCgpfSwgdGhlCi1cbWV0aG9ke2RlY29tcHJlc3MoKX0gbWV0aG9kIGNhbm5vdCBiZSBjYWxsZWQgYWdhaW47IHRoZSBvbmx5IHJlYWxpc3RpYwotYWN0aW9uIGlzIHRvIGRlbGV0ZSB0aGUgb2JqZWN0LgotCi1UaGUgb3B0aW9uYWwgcGFyYW1ldGVyIFx2YXJ7bGVuZ3RofSBzZXRzIHRoZSBpbml0aWFsIHNpemUgb2YgdGhlCi1vdXRwdXQgYnVmZmVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRGVjb21wcmVzc117Y29weX17fQotUmV0dXJucyBhIGNvcHkgb2YgdGhlIGRlY29tcHJlc3Npb24gb2JqZWN0LiAgVGhpcyBjYW4gYmUgdXNlZCB0byBzYXZlIHRoZQotc3RhdGUgb2YgdGhlIGRlY29tcHJlc3NvciBtaWR3YXkgdGhyb3VnaCB0aGUgZGF0YSBzdHJlYW0gaW4gb3JkZXIgdG8gc3BlZWQgdXAKLXJhbmRvbSBzZWVrcyBpbnRvIHRoZSBzdHJlYW0gYXQgYSBmdXR1cmUgcG9pbnQuCi1cdmVyc2lvbmFkZGVkezIuNX0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWVtb2R1bGV7Z3ppcH17UmVhZGluZyBhbmQgd3JpdGluZyBccHJvZ3JhbXtnemlwfS1mb3JtYXQgZmlsZXMufQotICBcc2VldXJse2h0dHA6Ly93d3cuemxpYi5uZXR9e1RoZSB6bGliIGxpYnJhcnkgaG9tZSBwYWdlLn0KLSAgXHNlZXVybHtodHRwOi8vd3d3LnpsaWIubmV0L21hbnVhbC5odG1sfXtUaGUgemxpYiBtYW51YWwgZXhwbGFpbnMgCi0gICAgdGhlIHNlbWFudGljcyBhbmQgdXNhZ2Ugb2YgdGhlIGxpYnJhcnkncyBtYW55IGZ1bmN0aW9ucy59Ci1cZW5ke3NlZWFsc299CmRpZmYgLS1naXQgYS9Eb2MvbGliL21hcmt1cC50ZXggYi9Eb2MvbGliL21hcmt1cC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkOTIzYTcuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9tYXJrdXAudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotXGNoYXB0ZXJ7U3RydWN0dXJlZCBNYXJrdXAgUHJvY2Vzc2luZyBUb29scwotICAgICAgICAgXGxhYmVse21hcmt1cH19Ci0KLVB5dGhvbiBzdXBwb3J0cyBhIHZhcmlldHkgb2YgbW9kdWxlcyB0byB3b3JrIHdpdGggdmFyaW91cyBmb3JtcyBvZgotc3RydWN0dXJlZCBkYXRhIG1hcmt1cC4gIFRoaXMgaW5jbHVkZXMgbW9kdWxlcyB0byB3b3JrIHdpdGggdGhlCi1TdGFuZGFyZCBHZW5lcmFsaXplZCBNYXJrdXAgTGFuZ3VhZ2UgKFNHTUwpIGFuZCB0aGUgSHlwZXJ0ZXh0IE1hcmt1cAotTGFuZ3VhZ2UgKEhUTUwpLCBhbmQgc2V2ZXJhbCBpbnRlcmZhY2VzIGZvciB3b3JraW5nIHdpdGggdGhlCi1FeHRlbnNpYmxlIE1hcmt1cCBMYW5ndWFnZSAoWE1MKS4KLQotSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCBtb2R1bGVzIGluIHRoZSBcbW9kdWxle3htbH0gcGFja2FnZQotcmVxdWlyZSB0aGF0IHRoZXJlIGJlIGF0IGxlYXN0IG9uZSBTQVgtY29tcGxpYW50IFhNTCBwYXJzZXIgYXZhaWxhYmxlLgotU3RhcnRpbmcgd2l0aCBQeXRob24gMi4zLCB0aGUgRXhwYXQgcGFyc2VyIGlzIGluY2x1ZGVkIHdpdGggUHl0aG9uLCBzbwotdGhlIFxyZWZtb2R1bGV7eG1sLnBhcnNlcnMuZXhwYXR9IG1vZHVsZSB3aWxsIGFsd2F5cyBiZSBhdmFpbGFibGUuCi1Zb3UgbWF5IHN0aWxsIHdhbnQgdG8gYmUgYXdhcmUgb2YgdGhlIFx1bGlua3tQeVhNTCBhZGQtb24KLXBhY2thZ2V9e2h0dHA6Ly9weXhtbC5zb3VyY2Vmb3JnZS5uZXQvfTsgdGhhdCBwYWNrYWdlIHByb3ZpZGVzIGFuCi1leHRlbmRlZCBzZXQgb2YgWE1MIGxpYnJhcmllcyBmb3IgUHl0aG9uLgotCi1UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIFxtb2R1bGV7eG1sLmRvbX0gYW5kIFxtb2R1bGV7eG1sLnNheH0KLXBhY2thZ2VzIGFyZSB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgUHl0aG9uIGJpbmRpbmdzIGZvciB0aGUgRE9NIGFuZCBTQVgKLWludGVyZmFjZXMuCi0KLVxsb2NhbG1vZHVsZXRhYmxlCi0KLVxiZWdpbntzZWVhbHNvfQotICBcc2VldGl0bGVbaHR0cDovL3B5eG1sLnNvdXJjZWZvcmdlLm5ldC9dCi0gICAgICAgICAgIHtQeXRob24vWE1MIExpYnJhcmllc30KLSAgICAgICAgICAge0hvbWUgcGFnZSBmb3IgdGhlIFB5WE1MIHBhY2thZ2UsIGNvbnRhaW5pbmcgYW4gZXh0ZW5zaW9uCi0gICAgICAgICAgICBvZiBcbW9kdWxle3htbH0gcGFja2FnZSBidW5kbGVkIHdpdGggUHl0aG9uLn0KLVxlbmR7c2VlYWxzb30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbWltZWxpYi50ZXggYi9Eb2MvbGliL21pbWVsaWIudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTFkODQ0Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbWltZWxpYi50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0lIFRoaXMgZG9jdW1lbnQgaXMgbGFyZ2VseSBhIHN0dWIgdXNlZCB0byBhbGxvdyB0aGUgZW1haWwgcGFja2FnZSBkb2NzCi0lIHRvIGJlIGZvcm1hdHRlZCBzZXBhcmF0ZWx5IGZyb20gdGhlIHJlc3Qgb2YgdGhlIFB5dGhvbgotJSBkb2N1bWVudGF0aW9uLiAgVGhpcyBhbGxvd3MgdGhlIGRvY3VtZW50YXRpb24gdG8gYmUgcmVsZWFzZWQKLSUgaW5kZXBlbmRlbnRseSBvZiB0aGUgcmVzdCBvZiBQeXRob24gc2luY2UgdGhlIGVtYWlsIHBhY2thZ2UgaXMgYmVpbmcKLSUgbWFpbnRhaW5lZCBmb3IgbXVsdGlwbGUgUHl0aG9uIHZlcnNpb25zLCBhbmQgb24gYW4gYWNjZWxlcmF0ZWQKLSUgc2NoZWR1bGUuCi0KLVxkb2N1bWVudGNsYXNze2hvd3RvfQotCi1cdGl0bGV7ZW1haWwgUGFja2FnZSBSZWZlcmVuY2V9Ci1cYXV0aG9ye0JhcnJ5IFdhcnNhd30KLVxhdXRob3JhZGRyZXNze1xlbWFpbHtiYXJyeUBweXRob24ub3JnfX0KLQotXGRhdGV7XHRvZGF5fQotXHJlbGVhc2V7NC4wfQkJCSUgc29mdHdhcmUgcmVsZWFzZSwgbm90IGRvY3VtZW50YXRpb24KLVxzZXRyZWxlYXNlaW5mb3t9CQklIGVtcHR5IGZvciBmaW5hbCByZWxlYXNlCi1cc2V0c2hvcnR2ZXJzaW9uezQuMH0JCSUgbWFqb3IubWlub3Igb25seSBmb3Igc29mdHdhcmUKLQotXGJlZ2lue2RvY3VtZW50fQotCi1cbWFrZXRpdGxlCi0KLVxiZWdpbnthYnN0cmFjdH0KLSAgVGhlIFxtb2R1bGV7ZW1haWx9IHBhY2thZ2UgcHJvdmlkZXMgY2xhc3NlcyBhbmQgdXRpbGl0aWVzIHRvIGNyZWF0ZSwKLSAgcGFyc2UsIGdlbmVyYXRlLCBhbmQgbW9kaWZ5IGVtYWlsIG1lc3NhZ2VzLCBjb25mb3JtaW5nIHRvIGFsbCB0aGUKLSAgcmVsZXZhbnQgZW1haWwgYW5kIE1JTUUgcmVsYXRlZCBSRkNzLgotXGVuZHthYnN0cmFjdH0KLQotJSBUaGUgdWdseSAiJWJlZ2lue2xhdGV4b25seX0iIHBzZXVkby1lbnZpcm9ubWVudCBzdXBwcmVzc2VzIHRoZSB0YWJsZQotJSBvZiBjb250ZW50cyBmb3IgSFRNTCBnZW5lcmF0aW9uLgotJQotJWJlZ2lue2xhdGV4b25seX0KLVx0YWJsZW9mY29udGVudHMKLSVlbmR7bGF0ZXhvbmx5fQotCi1cc2VjdGlvbntJbnRyb2R1Y3Rpb259Ci1UaGUgXG1vZHVsZXtlbWFpbH0gcGFja2FnZSBwcm92aWRlcyBjbGFzc2VzIGFuZCB1dGlsaXRpZXMgdG8gY3JlYXRlLAotcGFyc2UsIGdlbmVyYXRlLCBhbmQgbW9kaWZ5IGVtYWlsIG1lc3NhZ2VzLCBjb25mb3JtaW5nIHRvIGFsbCB0aGUKLXJlbGV2YW50IGVtYWlsIGFuZCBNSU1FIHJlbGF0ZWQgUkZDcy4KLQotVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdmVyc2lvbiA0LjAgb2YgdGhlIFxtb2R1bGV7ZW1haWx9IHBhY2thZ2UsIHdoaWNoIGlzCi1kaXN0cmlidXRlZCB3aXRoIFB5dGhvbiAyLjUgYW5kIGlzIGF2YWlsYWJsZSBhcyBhIHN0YW5kYWxvbmUgZGlzdHV0aWxzLWJhc2VkCi1wYWNrYWdlIGZvciB1c2Ugd2l0aCBlYXJsaWVyIFB5dGhvbiB2ZXJzaW9ucy4gIFxtb2R1bGV7ZW1haWx9IDQuMCBpcyBub3QKLWNvbXBhdGlibGUgd2l0aCBQeXRob24gdmVyc2lvbnMgZWFybGllciB0aGFuIDIuMy4gIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0Ci10aGUgXG1vZHVsZXtlbWFpbH0gcGFja2FnZSwgaW5jbHVkaW5nIGRvd25sb2FkIGxpbmtzIGFuZCBtYWlsaW5nIGxpc3RzLCBzZWUKLVx1bGlua3tQeXRob24ncyBlbWFpbCBTSUd9e2h0dHA6Ly93d3cucHl0aG9uLm9yZy9zaWdzL2VtYWlsLXNpZ30uCi0KLVRoZSBkb2N1bWVudGF0aW9uIHRoYXQgZm9sbG93cyB3YXMgd3JpdHRlbiBmb3IgdGhlIFB5dGhvbiBwcm9qZWN0LCBzbwotaWYgeW91J3JlIHJlYWRpbmcgdGhpcyBhcyBwYXJ0IG9mIHRoZSBzdGFuZGFsb25lIFxtb2R1bGV7ZW1haWx9Ci1wYWNrYWdlIGRvY3VtZW50YXRpb24sIHRoZXJlIGFyZSBhIGZldyBub3RlcyB0byBiZSBhd2FyZSBvZjoKLQotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSBEZXByZWNhdGlvbiBhbmQgYGB2ZXJzaW9uIGFkZGVkJycgbm90ZXMgYXJlIHJlbGF0aXZlIHRvIHRoZQotICAgICAgUHl0aG9uIHZlcnNpb24gYSBmZWF0dXJlIHdhcyBhZGRlZCBvciBkZXByZWNhdGVkLiAgU2VlCi0gICAgICB0aGUgcGFja2FnZSBoaXN0b3J5IGluIHNlY3Rpb24gXHJlZntlbWFpbC1wa2ctaGlzdG9yeX0gZm9yIGRldGFpbHMuCi0KLVxpdGVtIElmIHlvdSdyZSByZWFkaW5nIHRoaXMgZG9jdW1lbnRhdGlvbiBhcyBwYXJ0IG9mIHRoZQotICAgICAgc3RhbmRhbG9uZSBcbW9kdWxle2VtYWlsfSBwYWNrYWdlLCBzb21lIG9mIHRoZSBpbnRlcm5hbCBsaW5rcyB0bwotICAgICAgb3RoZXIgc2VjdGlvbnMgb2YgdGhlIFB5dGhvbiBzdGFuZGFyZCBsaWJyYXJ5IG1heSBub3QgcmVzb2x2ZS4KLQotXGVuZHtpdGVtaXplfQotCi1caW5wdXR7ZW1haWx9Ci0KLVxlbmR7ZG9jdW1lbnR9CmRpZmYgLS1naXQgYS9Eb2MvbGliL21pbmlkb20tZXhhbXBsZS5weSBiL0RvYy9saWIvbWluaWRvbS1leGFtcGxlLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzBjNGUwLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbWluaWRvbS1leGFtcGxlLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotaW1wb3J0IHhtbC5kb20ubWluaWRvbQotCi1kb2N1bWVudCA9ICIiIlwKLTxzbGlkZXNob3c+Ci08dGl0bGU+RGVtbyBzbGlkZXNob3c8L3RpdGxlPgotPHNsaWRlPjx0aXRsZT5TbGlkZSB0aXRsZTwvdGl0bGU+Ci08cG9pbnQ+VGhpcyBpcyBhIGRlbW88L3BvaW50PgotPHBvaW50Pk9mIGEgcHJvZ3JhbSBmb3IgcHJvY2Vzc2luZyBzbGlkZXM8L3BvaW50PgotPC9zbGlkZT4KLQotPHNsaWRlPjx0aXRsZT5Bbm90aGVyIGRlbW8gc2xpZGU8L3RpdGxlPgotPHBvaW50Pkl0IGlzIGltcG9ydGFudDwvcG9pbnQ+Ci08cG9pbnQ+VG8gaGF2ZSBtb3JlIHRoYW48L3BvaW50PgotPHBvaW50Pm9uZSBzbGlkZTwvcG9pbnQ+Ci08L3NsaWRlPgotPC9zbGlkZXNob3c+Ci0iIiIKLQotZG9tID0geG1sLmRvbS5taW5pZG9tLnBhcnNlU3RyaW5nKGRvY3VtZW50KQotCi1kZWYgZ2V0VGV4dChub2RlbGlzdCk6Ci0gICAgcmMgPSAiIgotICAgIGZvciBub2RlIGluIG5vZGVsaXN0OgotICAgICAgICBpZiBub2RlLm5vZGVUeXBlID09IG5vZGUuVEVYVF9OT0RFOgotICAgICAgICAgICAgcmMgPSByYyArIG5vZGUuZGF0YQotICAgIHJldHVybiByYwotCi1kZWYgaGFuZGxlU2xpZGVzaG93KHNsaWRlc2hvdyk6Ci0gICAgcHJpbnQgIjxodG1sPiIKLSAgICBoYW5kbGVTbGlkZXNob3dUaXRsZShzbGlkZXNob3cuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRpdGxlIilbMF0pCi0gICAgc2xpZGVzID0gc2xpZGVzaG93LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzbGlkZSIpCi0gICAgaGFuZGxlVG9jKHNsaWRlcykKLSAgICBoYW5kbGVTbGlkZXMoc2xpZGVzKQotICAgIHByaW50ICI8L2h0bWw+IgotCi1kZWYgaGFuZGxlU2xpZGVzKHNsaWRlcyk6Ci0gICAgZm9yIHNsaWRlIGluIHNsaWRlczoKLSAgICAgICAgaGFuZGxlU2xpZGUoc2xpZGUpCi0KLWRlZiBoYW5kbGVTbGlkZShzbGlkZSk6Ci0gICAgaGFuZGxlU2xpZGVUaXRsZShzbGlkZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGl0bGUiKVswXSkKLSAgICBoYW5kbGVQb2ludHMoc2xpZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBvaW50IikpCi0KLWRlZiBoYW5kbGVTbGlkZXNob3dUaXRsZSh0aXRsZSk6Ci0gICAgcHJpbnQgIjx0aXRsZT4lczwvdGl0bGU+IiAlIGdldFRleHQodGl0bGUuY2hpbGROb2RlcykKLQotZGVmIGhhbmRsZVNsaWRlVGl0bGUodGl0bGUpOgotICAgIHByaW50ICI8aDI+JXM8L2gyPiIgJSBnZXRUZXh0KHRpdGxlLmNoaWxkTm9kZXMpCi0KLWRlZiBoYW5kbGVQb2ludHMocG9pbnRzKToKLSAgICBwcmludCAiPHVsPiIKLSAgICBmb3IgcG9pbnQgaW4gcG9pbnRzOgotICAgICAgICBoYW5kbGVQb2ludChwb2ludCkKLSAgICBwcmludCAiPC91bD4iCi0KLWRlZiBoYW5kbGVQb2ludChwb2ludCk6Ci0gICAgcHJpbnQgIjxsaT4lczwvbGk+IiAlIGdldFRleHQocG9pbnQuY2hpbGROb2RlcykKLQotZGVmIGhhbmRsZVRvYyhzbGlkZXMpOgotICAgIGZvciBzbGlkZSBpbiBzbGlkZXM6Ci0gICAgICAgIHRpdGxlID0gc2xpZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRpdGxlIilbMF0KLSAgICAgICAgcHJpbnQgIjxwPiVzPC9wPiIgJSBnZXRUZXh0KHRpdGxlLmNoaWxkTm9kZXMpCi0KLWhhbmRsZVNsaWRlc2hvdyhkb20pCmRpZmYgLS1naXQgYS9Eb2MvbGliL21vZHVsZXMudGV4IGIvRG9jL2xpYi9tb2R1bGVzLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIzZDA1MS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL21vZHVsZXMudGV4CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1cY2hhcHRlcntJbXBvcnRpbmcgTW9kdWxlc30KLVxsYWJlbHttb2R1bGVzfQotCi1UaGUgbW9kdWxlcyBkZXNjcmliZWQgaW4gdGhpcyBjaGFwdGVyIHByb3ZpZGUgbmV3IHdheXMgdG8gaW1wb3J0IG90aGVyCi1QeXRob24gbW9kdWxlcyBhbmQgaG9va3MgZm9yIGN1c3RvbWl6aW5nIHRoZSBpbXBvcnQgcHJvY2Vzcy4KLQotVGhlIGZ1bGwgbGlzdCBvZiBtb2R1bGVzIGRlc2NyaWJlZCBpbiB0aGlzIGNoYXB0ZXIgaXM6Ci0KLVxsb2NhbG1vZHVsZXRhYmxlCmRpZmYgLS1naXQgYS9Eb2MvbGliL25ldGRhdGEudGV4IGIvRG9jL2xpYi9uZXRkYXRhLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgwNjJkMC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL25ldGRhdGEudGV4CisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1cY2hhcHRlcntJbnRlcm5ldCBEYXRhIEhhbmRsaW5nIFxsYWJlbHtuZXRkYXRhfX0KLQotVGhpcyBjaGFwdGVyIGRlc2NyaWJlcyBtb2R1bGVzIHdoaWNoIHN1cHBvcnQgaGFuZGxpbmcgZGF0YSBmb3JtYXRzCi1jb21tb25seSB1c2VkIG9uIHRoZSBJbnRlcm5ldC4KLQotXGxvY2FsbW9kdWxldGFibGUKZGlmZiAtLWdpdCBhL0RvYy9saWIvbnVtZXJpYy50ZXggYi9Eb2MvbGliL251bWVyaWMudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWE5ZTE4Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbnVtZXJpYy50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1cY2hhcHRlcntOdW1lcmljIGFuZCBNYXRoZW1hdGljYWwgTW9kdWxlc30KLVxsYWJlbHtudW1lcmljfQotCi1UaGUgbW9kdWxlcyBkZXNjcmliZWQgaW4gdGhpcyBjaGFwdGVyIHByb3ZpZGUKLW51bWVyaWMgYW5kIG1hdGgtcmVsYXRlZCBmdW5jdGlvbnMgYW5kIGRhdGEgdHlwZXMuCi1UaGUgXG1vZHVsZXttYXRofSBhbmQgXG1vZHVsZXtjbWF0aH0gY29udGFpbiAKLXZhcmlvdXMgbWF0aGVtYXRpY2FsIGZ1bmN0aW9ucyBmb3IgZmxvYXRpbmctcG9pbnQgYW5kIGNvbXBsZXggbnVtYmVycy4KLUZvciB1c2VycyBtb3JlIGludGVyZXN0ZWQgaW4gZGVjaW1hbCBhY2N1cmFjeSB0aGFuIGluIHNwZWVkLCB0aGUgCi1cbW9kdWxle2RlY2ltYWx9IG1vZHVsZSBzdXBwb3J0cyBleGFjdCByZXByZXNlbnRhdGlvbnMgb2YgIGRlY2ltYWwgbnVtYmVycy4KLQotVGhlIGZvbGxvd2luZyBtb2R1bGVzIGFyZSBkb2N1bWVudGVkIGluIHRoaXMgY2hhcHRlcjoKLQotXGxvY2FsbW9kdWxldGFibGUKZGlmZiAtLWdpdCBhL0RvYy9saWIvcGVyc2lzdGVuY2UudGV4IGIvRG9jL2xpYi9wZXJzaXN0ZW5jZS50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiY2RhZDIuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9wZXJzaXN0ZW5jZS50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1cY2hhcHRlcntEYXRhIFBlcnNpc3RlbmNlfQotXGxhYmVse3BlcnNpc3RlbmNlfQotCi1UaGUgbW9kdWxlcyBkZXNjcmliZWQgaW4gdGhpcyBjaGFwdGVyIHN1cHBvcnQgc3RvcmluZyBQeXRob24gZGF0YSBpbiBhCi1wZXJzaXN0ZW50IGZvcm0gb24gZGlzay4gIFRoZSBcbW9kdWxle3BpY2tsZX0gYW5kIFxtb2R1bGV7bWFyc2hhbH0KLW1vZHVsZXMgY2FuIHR1cm4gbWFueSBQeXRob24gZGF0YSB0eXBlcyBpbnRvIGEgc3RyZWFtIG9mIGJ5dGVzIGFuZAotdGhlbiByZWNyZWF0ZSB0aGUgb2JqZWN0cyBmcm9tIHRoZSBieXRlcy4gIFRoZSB2YXJpb3VzIERCTS1yZWxhdGVkCi1tb2R1bGVzIHN1cHBvcnQgYSBmYW1pbHkgb2YgaGFzaC1iYXNlZCBmaWxlIGZvcm1hdHMgdGhhdCBzdG9yZSBhCi1tYXBwaW5nIG9mIHN0cmluZ3MgdG8gb3RoZXIgc3RyaW5ncy4gIFRoZSBcbW9kdWxle2JzZGRifSBtb2R1bGUgYWxzbwotcHJvdmlkZXMgc3VjaCBkaXNrLWJhc2VkIHN0cmluZy10by1zdHJpbmcgbWFwcGluZ3MgYmFzZWQgb24gaGFzaGluZywKLWFuZCBhbHNvIHN1cHBvcnRzIEItVHJlZSBhbmQgcmVjb3JkLWJhc2VkIGZvcm1hdHMuCi0KLVRoZSBsaXN0IG9mIG1vZHVsZXMgZGVzY3JpYmVkIGluIHRoaXMgY2hhcHRlciBpczoKLQotXGxvY2FsbW9kdWxldGFibGUKZGlmZiAtLWdpdCBhL0RvYy9saWIvcmVxdWlyZWRfMS5weSBiL0RvYy9saWIvcmVxdWlyZWRfMS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmJlNTY2OC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL3JlcXVpcmVkXzEucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1pbXBvcnQgb3B0cGFyc2UKLQotY2xhc3MgT3B0aW9uUGFyc2VyIChvcHRwYXJzZS5PcHRpb25QYXJzZXIpOgotCi0gICAgZGVmIGNoZWNrX3JlcXVpcmVkIChzZWxmLCBvcHQpOgotICAgICAgICBvcHRpb24gPSBzZWxmLmdldF9vcHRpb24ob3B0KQotCi0gICAgICAgICMgQXNzdW1lcyB0aGUgb3B0aW9uJ3MgJ2RlZmF1bHQnIGlzIHNldCB0byBOb25lIQotICAgICAgICBpZiBnZXRhdHRyKHNlbGYudmFsdWVzLCBvcHRpb24uZGVzdCkgaXMgTm9uZToKLSAgICAgICAgICAgIHNlbGYuZXJyb3IoIiVzIG9wdGlvbiBub3Qgc3VwcGxpZWQiICUgb3B0aW9uKQotCi0KLXBhcnNlciA9IE9wdGlvblBhcnNlcigpCi1wYXJzZXIuYWRkX29wdGlvbigiLXYiLCBhY3Rpb249ImNvdW50IiwgZGVzdD0idmVyYm9zZSIpCi1wYXJzZXIuYWRkX29wdGlvbigiLWYiLCAiLS1maWxlIiwgZGVmYXVsdD1Ob25lKQotKG9wdGlvbnMsIGFyZ3MpID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQotCi1wcmludCAidmVyYm9zZToiLCBvcHRpb25zLnZlcmJvc2UKLXByaW50ICJmaWxlOiIsIG9wdGlvbnMuZmlsZQotcGFyc2VyLmNoZWNrX3JlcXVpcmVkKCItZiIpCmRpZmYgLS1naXQgYS9Eb2MvbGliL3JlcXVpcmVkXzIucHkgYi9Eb2MvbGliL3JlcXVpcmVkXzIucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQyMTUxNGEuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9yZXF1aXJlZF8yLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotaW1wb3J0IG9wdHBhcnNlCi0KLWNsYXNzIE9wdGlvbiAob3B0cGFyc2UuT3B0aW9uKToKLSAgICBBVFRSUyA9IG9wdHBhcnNlLk9wdGlvbi5BVFRSUyArIFsncmVxdWlyZWQnXQotCi0gICAgZGVmIF9jaGVja19yZXF1aXJlZCAoc2VsZik6Ci0gICAgICAgIGlmIHNlbGYucmVxdWlyZWQgYW5kIG5vdCBzZWxmLnRha2VzX3ZhbHVlKCk6Ci0gICAgICAgICAgICByYWlzZSBPcHRpb25FcnJvcigKLSAgICAgICAgICAgICAgICAicmVxdWlyZWQgZmxhZyBzZXQgZm9yIG9wdGlvbiB0aGF0IGRvZXNuJ3QgdGFrZSBhIHZhbHVlIiwKLSAgICAgICAgICAgICAgICAgc2VsZikKLQotICAgICMgTWFrZSBzdXJlIF9jaGVja19yZXF1aXJlZCgpIGlzIGNhbGxlZCBmcm9tIHRoZSBjb25zdHJ1Y3RvciEKLSAgICBDSEVDS19NRVRIT0RTID0gb3B0cGFyc2UuT3B0aW9uLkNIRUNLX01FVEhPRFMgKyBbX2NoZWNrX3JlcXVpcmVkXQotCi0gICAgZGVmIHByb2Nlc3MgKHNlbGYsIG9wdCwgdmFsdWUsIHZhbHVlcywgcGFyc2VyKToKLSAgICAgICAgb3B0cGFyc2UuT3B0aW9uLnByb2Nlc3Moc2VsZiwgb3B0LCB2YWx1ZSwgdmFsdWVzLCBwYXJzZXIpCi0gICAgICAgIHBhcnNlci5vcHRpb25fc2VlbltzZWxmXSA9IDEKLQotCi1jbGFzcyBPcHRpb25QYXJzZXIgKG9wdHBhcnNlLk9wdGlvblBhcnNlcik6Ci0KLSAgICBkZWYgX2luaXRfcGFyc2luZ19zdGF0ZSAoc2VsZik6Ci0gICAgICAgIG9wdHBhcnNlLk9wdGlvblBhcnNlci5faW5pdF9wYXJzaW5nX3N0YXRlKHNlbGYpCi0gICAgICAgIHNlbGYub3B0aW9uX3NlZW4gPSB7fQotCi0gICAgZGVmIGNoZWNrX3ZhbHVlcyAoc2VsZiwgdmFsdWVzLCBhcmdzKToKLSAgICAgICAgZm9yIG9wdGlvbiBpbiBzZWxmLm9wdGlvbl9saXN0OgotICAgICAgICAgICAgaWYgKGlzaW5zdGFuY2Uob3B0aW9uLCBPcHRpb24pIGFuZAotICAgICAgICAgICAgICAgIG9wdGlvbi5yZXF1aXJlZCBhbmQKLSAgICAgICAgICAgICAgICBub3Qgc2VsZi5vcHRpb25fc2Vlbi5oYXNfa2V5KG9wdGlvbikpOgotICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IoIiVzIG5vdCBzdXBwbGllZCIgJSBvcHRpb24pCi0gICAgICAgIHJldHVybiAodmFsdWVzLCBhcmdzKQotCi0KLXBhcnNlciA9IE9wdGlvblBhcnNlcihvcHRpb25fbGlzdD1bCi0gICAgT3B0aW9uKCItdiIsIGFjdGlvbj0iY291bnQiLCBkZXN0PSJ2ZXJib3NlIiksCi0gICAgT3B0aW9uKCItZiIsICItLWZpbGUiLCByZXF1aXJlZD0xKV0pCi0ob3B0aW9ucywgYXJncykgPSBwYXJzZXIucGFyc2VfYXJncygpCi0KLXByaW50ICJ2ZXJib3NlOiIsIG9wdGlvbnMudmVyYm9zZQotcHJpbnQgImZpbGU6Iiwgb3B0aW9ucy5maWxlCmRpZmYgLS1naXQgYS9Eb2MvbGliL3NxbGl0ZTMvYWRhcHRlcl9kYXRldGltZS5weSBiL0RvYy9saWIvc3FsaXRlMy9hZGFwdGVyX2RhdGV0aW1lLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODY5ZTIyLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvc3FsaXRlMy9hZGFwdGVyX2RhdGV0aW1lLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotaW1wb3J0IHNxbGl0ZTMKLWltcG9ydCBkYXRldGltZSwgdGltZQotCi1kZWYgYWRhcHRfZGF0ZXRpbWUodHMpOgotICAgIHJldHVybiB0aW1lLm1rdGltZSh0cy50aW1ldHVwbGUoKSkKLQotc3FsaXRlMy5yZWdpc3Rlcl9hZGFwdGVyKGRhdGV0aW1lLmRhdGV0aW1lLCBhZGFwdF9kYXRldGltZSkKLQotY29uID0gc3FsaXRlMy5jb25uZWN0KCI6bWVtb3J5OiIpCi1jdXIgPSBjb24uY3Vyc29yKCkKLQotbm93ID0gZGF0ZXRpbWUuZGF0ZXRpbWUubm93KCkKLWN1ci5leGVjdXRlKCJzZWxlY3QgPyIsIChub3csKSkKLXByaW50KGN1ci5mZXRjaG9uZSgpWzBdKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9zcWxpdGUzL2FkYXB0ZXJfcG9pbnRfMS5weSBiL0RvYy9saWIvc3FsaXRlMy9hZGFwdGVyX3BvaW50XzEucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNDNhY2QuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9zcWxpdGUzL2FkYXB0ZXJfcG9pbnRfMS5weQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLWltcG9ydCBzcWxpdGUzCi0KLWNsYXNzIFBvaW50KG9iamVjdCk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHgsIHkpOgotICAgICAgICBzZWxmLngsIHNlbGYueSA9IHgsIHkKLQotICAgIGRlZiBfX2NvbmZvcm1fXyhzZWxmLCBwcm90b2NvbCk6Ci0gICAgICAgIGlmIHByb3RvY29sIGlzIHNxbGl0ZTMuUHJlcGFyZVByb3RvY29sOgotICAgICAgICAgICAgcmV0dXJuICIlZjslZiIgJSAoc2VsZi54LCBzZWxmLnkpCi0KLWNvbiA9IHNxbGl0ZTMuY29ubmVjdCgiOm1lbW9yeToiKQotY3VyID0gY29uLmN1cnNvcigpCi0KLXAgPSBQb2ludCg0LjAsIC0zLjIpCi1jdXIuZXhlY3V0ZSgic2VsZWN0ID8iLCAocCwpKQotcHJpbnQoY3VyLmZldGNob25lKClbMF0pCmRpZmYgLS1naXQgYS9Eb2MvbGliL3NxbGl0ZTMvYWRhcHRlcl9wb2ludF8yLnB5IGIvRG9jL2xpYi9zcWxpdGUzL2FkYXB0ZXJfcG9pbnRfMi5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUxNzE5YS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL3NxbGl0ZTMvYWRhcHRlcl9wb2ludF8yLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotaW1wb3J0IHNxbGl0ZTMKLQotY2xhc3MgUG9pbnQob2JqZWN0KToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgeCwgeSk6Ci0gICAgICAgIHNlbGYueCwgc2VsZi55ID0geCwgeQotCi1kZWYgYWRhcHRfcG9pbnQocG9pbnQpOgotICAgIHJldHVybiAiJWY7JWYiICUgKHBvaW50LngsIHBvaW50LnkpCi0KLXNxbGl0ZTMucmVnaXN0ZXJfYWRhcHRlcihQb2ludCwgYWRhcHRfcG9pbnQpCi0KLWNvbiA9IHNxbGl0ZTMuY29ubmVjdCgiOm1lbW9yeToiKQotY3VyID0gY29uLmN1cnNvcigpCi0KLXAgPSBQb2ludCg0LjAsIC0zLjIpCi1jdXIuZXhlY3V0ZSgic2VsZWN0ID8iLCAocCwpKQotcHJpbnQoY3VyLmZldGNob25lKClbMF0pCmRpZmYgLS1naXQgYS9Eb2MvbGliL3NxbGl0ZTMvY29sbGF0aW9uX3JldmVyc2UucHkgYi9Eb2MvbGliL3NxbGl0ZTMvY29sbGF0aW9uX3JldmVyc2UucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZDdmNWIuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9zcWxpdGUzL2NvbGxhdGlvbl9yZXZlcnNlLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotaW1wb3J0IHNxbGl0ZTMKLQotZGVmIGNvbGxhdGVfcmV2ZXJzZShzdHJpbmcxLCBzdHJpbmcyKToKLSAgICByZXR1cm4gLWNtcChzdHJpbmcxLCBzdHJpbmcyKQotCi1jb24gPSBzcWxpdGUzLmNvbm5lY3QoIjptZW1vcnk6IikKLWNvbi5jcmVhdGVfY29sbGF0aW9uKCJyZXZlcnNlIiwgY29sbGF0ZV9yZXZlcnNlKQotCi1jdXIgPSBjb24uY3Vyc29yKCkKLWN1ci5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdCh4KSIpCi1jdXIuZXhlY3V0ZW1hbnkoImluc2VydCBpbnRvIHRlc3QoeCkgdmFsdWVzICg/KSIsIFsoImEiLCksICgiYiIsKV0pCi1jdXIuZXhlY3V0ZSgic2VsZWN0IHggZnJvbSB0ZXN0IG9yZGVyIGJ5IHggY29sbGF0ZSByZXZlcnNlIikKLWZvciByb3cgaW4gY3VyOgotICAgIHByaW50KHJvdykKLWNvbi5jbG9zZSgpCmRpZmYgLS1naXQgYS9Eb2MvbGliL3NxbGl0ZTMvY29tcGxldGVfc3RhdGVtZW50LnB5IGIvRG9jL2xpYi9zcWxpdGUzL2NvbXBsZXRlX3N0YXRlbWVudC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QzOGQ3My4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL3NxbGl0ZTMvY29tcGxldGVfc3RhdGVtZW50LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotIyBBIG1pbmltYWwgU1FMaXRlIHNoZWxsIGZvciBleHBlcmltZW50cwotCi1pbXBvcnQgc3FsaXRlMwotCi1jb24gPSBzcWxpdGUzLmNvbm5lY3QoIjptZW1vcnk6IikKLWNvbi5pc29sYXRpb25fbGV2ZWwgPSBOb25lCi1jdXIgPSBjb24uY3Vyc29yKCkKLQotYnVmZmVyID0gIiIKLQotcHJpbnQoIkVudGVyIHlvdXIgU1FMIGNvbW1hbmRzIHRvIGV4ZWN1dGUgaW4gc3FsaXRlMy4iKQotcHJpbnQoIkVudGVyIGEgYmxhbmsgbGluZSB0byBleGl0LiIpCi0KLXdoaWxlIFRydWU6Ci0gICAgbGluZSA9IGlucHV0KCkKLSAgICBpZiBsaW5lID09ICIiOgotICAgICAgICBicmVhawotICAgIGJ1ZmZlciArPSBsaW5lCi0gICAgaWYgc3FsaXRlMy5jb21wbGV0ZV9zdGF0ZW1lbnQoYnVmZmVyKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgYnVmZmVyID0gYnVmZmVyLnN0cmlwKCkKLSAgICAgICAgICAgIGN1ci5leGVjdXRlKGJ1ZmZlcikKLQotICAgICAgICAgICAgaWYgYnVmZmVyLmxzdHJpcCgpLnVwcGVyKCkuc3RhcnRzd2l0aCgiU0VMRUNUIik6Ci0gICAgICAgICAgICAgICAgcHJpbnQoY3VyLmZldGNoYWxsKCkpCi0gICAgICAgIGV4Y2VwdCBzcWxpdGUzLkVycm9yIGFzIGU6Ci0gICAgICAgICAgICBwcmludCgiQW4gZXJyb3Igb2NjdXJyZWQ6IiwgZS5hcmdzWzBdKQotICAgICAgICBidWZmZXIgPSAiIgotCi1jb24uY2xvc2UoKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9zcWxpdGUzL2Nvbm5lY3RfZGJfMS5weSBiL0RvYy9saWIvc3FsaXRlMy9jb25uZWN0X2RiXzEucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiOTc1MjMuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9zcWxpdGUzL2Nvbm5lY3RfZGJfMS5weQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotaW1wb3J0IHNxbGl0ZTMKLQotY29uID0gc3FsaXRlMy5jb25uZWN0KCJteWRiIikKZGlmZiAtLWdpdCBhL0RvYy9saWIvc3FsaXRlMy9jb25uZWN0X2RiXzIucHkgYi9Eb2MvbGliL3NxbGl0ZTMvY29ubmVjdF9kYl8yLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTcyOGIzLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvc3FsaXRlMy9jb25uZWN0X2RiXzIucHkKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWltcG9ydCBzcWxpdGUzCi0KLWNvbiA9IHNxbGl0ZTMuY29ubmVjdCgiOm1lbW9yeToiKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9zcWxpdGUzL2NvbnZlcnRlcl9wb2ludC5weSBiL0RvYy9saWIvc3FsaXRlMy9jb252ZXJ0ZXJfcG9pbnQucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNzA3YWIuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9zcWxpdGUzL2NvbnZlcnRlcl9wb2ludC5weQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLWltcG9ydCBzcWxpdGUzCi0KLWNsYXNzIFBvaW50KG9iamVjdCk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHgsIHkpOgotICAgICAgICBzZWxmLngsIHNlbGYueSA9IHgsIHkKLQotICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuICIoJWY7JWYpIiAlIChzZWxmLngsIHNlbGYueSkKLQotZGVmIGFkYXB0X3BvaW50KHBvaW50KToKLSAgICByZXR1cm4gIiVmOyVmIiAlIChwb2ludC54LCBwb2ludC55KQotCi1kZWYgY29udmVydF9wb2ludChzKToKLSAgICB4LCB5ID0gbGlzdChtYXAoZmxvYXQsIHMuc3BsaXQoIjsiKSkpCi0gICAgcmV0dXJuIFBvaW50KHgsIHkpCi0KLSMgUmVnaXN0ZXIgdGhlIGFkYXB0ZXIKLXNxbGl0ZTMucmVnaXN0ZXJfYWRhcHRlcihQb2ludCwgYWRhcHRfcG9pbnQpCi0KLSMgUmVnaXN0ZXIgdGhlIGNvbnZlcnRlcgotc3FsaXRlMy5yZWdpc3Rlcl9jb252ZXJ0ZXIoInBvaW50IiwgY29udmVydF9wb2ludCkKLQotcCA9IFBvaW50KDQuMCwgLTMuMikKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAxKSBVc2luZyBkZWNsYXJlZCB0eXBlcwotY29uID0gc3FsaXRlMy5jb25uZWN0KCI6bWVtb3J5OiIsIGRldGVjdF90eXBlcz1zcWxpdGUzLlBBUlNFX0RFQ0xUWVBFUykKLWN1ciA9IGNvbi5jdXJzb3IoKQotY3VyLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KHAgcG9pbnQpIikKLQotY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QocCkgdmFsdWVzICg/KSIsIChwLCkpCi1jdXIuZXhlY3V0ZSgic2VsZWN0IHAgZnJvbSB0ZXN0IikKLXByaW50KCJ3aXRoIGRlY2xhcmVkIHR5cGVzOiIsIGN1ci5mZXRjaG9uZSgpWzBdKQotY3VyLmNsb3NlKCkKLWNvbi5jbG9zZSgpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIDEpIFVzaW5nIGNvbHVtbiBuYW1lcwotY29uID0gc3FsaXRlMy5jb25uZWN0KCI6bWVtb3J5OiIsIGRldGVjdF90eXBlcz1zcWxpdGUzLlBBUlNFX0NPTE5BTUVTKQotY3VyID0gY29uLmN1cnNvcigpCi1jdXIuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QocCkiKQotCi1jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChwKSB2YWx1ZXMgKD8pIiwgKHAsKSkKLWN1ci5leGVjdXRlKCdzZWxlY3QgcCBhcyAicCBbcG9pbnRdIiBmcm9tIHRlc3QnKQotcHJpbnQoIndpdGggY29sdW1uIG5hbWVzOiIsIGN1ci5mZXRjaG9uZSgpWzBdKQotY3VyLmNsb3NlKCkKLWNvbi5jbG9zZSgpCmRpZmYgLS1naXQgYS9Eb2MvbGliL3NxbGl0ZTMvY291bnRjdXJzb3JzLnB5IGIvRG9jL2xpYi9zcWxpdGUzL2NvdW50Y3Vyc29ycy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYzZTcwYS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL3NxbGl0ZTMvY291bnRjdXJzb3JzLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotaW1wb3J0IHNxbGl0ZTMKLQotY2xhc3MgQ291bnRDdXJzb3JzQ29ubmVjdGlvbihzcWxpdGUzLkNvbm5lY3Rpb24pOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgotICAgICAgICBzcWxpdGUzLkNvbm5lY3Rpb24uX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQotICAgICAgICBzZWxmLm51bWN1cnNvcnMgPSAwCi0KLSAgICBkZWYgY3Vyc29yKHNlbGYsICphcmdzLCAqKmt3YXJncyk6Ci0gICAgICAgIHNlbGYubnVtY3Vyc29ycyArPSAxCi0gICAgICAgIHJldHVybiBzcWxpdGUzLkNvbm5lY3Rpb24uY3Vyc29yKHNlbGYsICphcmdzLCAqKmt3YXJncykKLQotY29uID0gc3FsaXRlMy5jb25uZWN0KCI6bWVtb3J5OiIsIGZhY3Rvcnk9Q291bnRDdXJzb3JzQ29ubmVjdGlvbikKLWN1cjEgPSBjb24uY3Vyc29yKCkKLWN1cjIgPSBjb24uY3Vyc29yKCkKLXByaW50KGNvbi5udW1jdXJzb3JzKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9zcWxpdGUzL2NyZWF0ZWRiLnB5IGIvRG9jL2xpYi9zcWxpdGUzL2NyZWF0ZWRiLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTI5NTBiLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvc3FsaXRlMy9jcmVhdGVkYi5weQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMgTm90IHJlZmVyZW5jZWQgZnJvbSB0aGUgZG9jdW1lbnRhdGlvbiwgYnV0IGJ1aWxkcyB0aGUgZGF0YWJhc2UgZmlsZSB0aGUgb3RoZXIKLSMgY29kZSBzbmlwcGV0cyBleHBlY3QuCi0KLWltcG9ydCBzcWxpdGUzCi1pbXBvcnQgb3MKLQotREJfRklMRSA9ICJteWRiIgotCi1pZiBvcy5wYXRoLmV4aXN0cyhEQl9GSUxFKToKLSAgICBvcy5yZW1vdmUoREJfRklMRSkKLQotY29uID0gc3FsaXRlMy5jb25uZWN0KERCX0ZJTEUpCi1jdXIgPSBjb24uY3Vyc29yKCkKLWN1ci5leGVjdXRlKCIiIgotICAgICAgICBjcmVhdGUgdGFibGUgcGVvcGxlCi0gICAgICAgICgKLSAgICAgICAgICBuYW1lX2xhc3QgICAgICB2YXJjaGFyKDIwKSwKLSAgICAgICAgICBhZ2UgICAgICAgICAgICBpbnRlZ2VyCi0gICAgICAgICkKLSAgICAgICAgIiIiKQotCi1jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gcGVvcGxlIChuYW1lX2xhc3QsIGFnZSkgdmFsdWVzICgnWWVsdHNpbicsICAgNzIpIikKLWN1ci5leGVjdXRlKCJpbnNlcnQgaW50byBwZW9wbGUgKG5hbWVfbGFzdCwgYWdlKSB2YWx1ZXMgKCdQdXRpbicsICAgICA1MSkiKQotCi1jb24uY29tbWl0KCkKLQotY3VyLmNsb3NlKCkKLWNvbi5jbG9zZSgpCmRpZmYgLS1naXQgYS9Eb2MvbGliL3NxbGl0ZTMvZXhlY3NxbF9mZXRjaG9uZXJvdy5weSBiL0RvYy9saWIvc3FsaXRlMy9leGVjc3FsX2ZldGNob25lcm93LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzg4NzNiLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvc3FsaXRlMy9leGVjc3FsX2ZldGNob25lcm93LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotaW1wb3J0IHNxbGl0ZTMKLQotY29uID0gc3FsaXRlMy5jb25uZWN0KCJteWRiIikKLQotY3VyID0gY29uLmN1cnNvcigpCi1TRUxFQ1QgPSAic2VsZWN0IG5hbWVfbGFzdCwgYWdlIGZyb20gcGVvcGxlIG9yZGVyIGJ5IGFnZSwgbmFtZV9sYXN0IgotCi0jIDEuIEl0ZXJhdGUgb3ZlciB0aGUgcm93cyBhdmFpbGFibGUgZnJvbSB0aGUgY3Vyc29yLCB1bnBhY2tpbmcgdGhlCi0jIHJlc3VsdGluZyBzZXF1ZW5jZXMgdG8geWllbGQgdGhlaXIgZWxlbWVudHMgKG5hbWVfbGFzdCwgYWdlKToKLWN1ci5leGVjdXRlKFNFTEVDVCkKLWZvciAobmFtZV9sYXN0LCBhZ2UpIGluIGN1cjoKLSAgICBwcmludCgnJXMgaXMgJWQgeWVhcnMgb2xkLicgJSAobmFtZV9sYXN0LCBhZ2UpKQotCi0jIDIuIEVxdWl2YWxlbnRseToKLWN1ci5leGVjdXRlKFNFTEVDVCkKLWZvciByb3cgaW4gY3VyOgotICAgIHByaW50KCclcyBpcyAlZCB5ZWFycyBvbGQuJyAlIChyb3dbMF0sIHJvd1sxXSkpCmRpZmYgLS1naXQgYS9Eb2MvbGliL3NxbGl0ZTMvZXhlY3NxbF9wcmludGFsbF8xLnB5IGIvRG9jL2xpYi9zcWxpdGUzL2V4ZWNzcWxfcHJpbnRhbGxfMS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRjZTVjNS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL3NxbGl0ZTMvZXhlY3NxbF9wcmludGFsbF8xLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotaW1wb3J0IHNxbGl0ZTMKLQotIyBDcmVhdGUgYSBjb25uZWN0aW9uIHRvIHRoZSBkYXRhYmFzZSBmaWxlICJteWRiIjoKLWNvbiA9IHNxbGl0ZTMuY29ubmVjdCgibXlkYiIpCi0KLSMgR2V0IGEgQ3Vyc29yIG9iamVjdCB0aGF0IG9wZXJhdGVzIGluIHRoZSBjb250ZXh0IG9mIENvbm5lY3Rpb24gY29uOgotY3VyID0gY29uLmN1cnNvcigpCi0KLSMgRXhlY3V0ZSB0aGUgU0VMRUNUIHN0YXRlbWVudDoKLWN1ci5leGVjdXRlKCJzZWxlY3QgKiBmcm9tIHBlb3BsZSBvcmRlciBieSBhZ2UiKQotCi0jIFJldHJpZXZlIGFsbCByb3dzIGFzIGEgc2VxdWVuY2UgYW5kIHByaW50IHRoYXQgc2VxdWVuY2U6Ci1wcmludChjdXIuZmV0Y2hhbGwoKSkKZGlmZiAtLWdpdCBhL0RvYy9saWIvc3FsaXRlMy9leGVjdXRlXzEucHkgYi9Eb2MvbGliL3NxbGl0ZTMvZXhlY3V0ZV8xLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDA4ODQwLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvc3FsaXRlMy9leGVjdXRlXzEucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1pbXBvcnQgc3FsaXRlMwotCi1jb24gPSBzcWxpdGUzLmNvbm5lY3QoIm15ZGIiKQotCi1jdXIgPSBjb24uY3Vyc29yKCkKLQotd2hvID0gIlllbHRzaW4iCi1hZ2UgPSA3MgotCi1jdXIuZXhlY3V0ZSgic2VsZWN0IG5hbWVfbGFzdCwgYWdlIGZyb20gcGVvcGxlIHdoZXJlIG5hbWVfbGFzdD0/IGFuZCBhZ2U9PyIsICh3aG8sIGFnZSkpCi1wcmludChjdXIuZmV0Y2hvbmUoKSkKZGlmZiAtLWdpdCBhL0RvYy9saWIvc3FsaXRlMy9leGVjdXRlXzIucHkgYi9Eb2MvbGliL3NxbGl0ZTMvZXhlY3V0ZV8yLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDczNGY5Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvc3FsaXRlMy9leGVjdXRlXzIucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1pbXBvcnQgc3FsaXRlMwotCi1jb24gPSBzcWxpdGUzLmNvbm5lY3QoIm15ZGIiKQotCi1jdXIgPSBjb24uY3Vyc29yKCkKLQotd2hvID0gIlllbHRzaW4iCi1hZ2UgPSA3MgotCi1jdXIuZXhlY3V0ZSgic2VsZWN0IG5hbWVfbGFzdCwgYWdlIGZyb20gcGVvcGxlIHdoZXJlIG5hbWVfbGFzdD06d2hvIGFuZCBhZ2U9OmFnZSIsCi0gICAgeyJ3aG8iOiB3aG8sICJhZ2UiOiBhZ2V9KQotcHJpbnQoY3VyLmZldGNob25lKCkpCmRpZmYgLS1naXQgYS9Eb2MvbGliL3NxbGl0ZTMvZXhlY3V0ZV8zLnB5IGIvRG9jL2xpYi9zcWxpdGUzL2V4ZWN1dGVfMy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM1MzY4My4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL3NxbGl0ZTMvZXhlY3V0ZV8zLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotaW1wb3J0IHNxbGl0ZTMKLQotY29uID0gc3FsaXRlMy5jb25uZWN0KCJteWRiIikKLQotY3VyID0gY29uLmN1cnNvcigpCi0KLXdobyA9ICJZZWx0c2luIgotYWdlID0gNzIKLQotY3VyLmV4ZWN1dGUoInNlbGVjdCBuYW1lX2xhc3QsIGFnZSBmcm9tIHBlb3BsZSB3aGVyZSBuYW1lX2xhc3Q9OndobyBhbmQgYWdlPTphZ2UiLAotICAgIGxvY2FscygpKQotcHJpbnQoY3VyLmZldGNob25lKCkpCmRpZmYgLS1naXQgYS9Eb2MvbGliL3NxbGl0ZTMvZXhlY3V0ZW1hbnlfMS5weSBiL0RvYy9saWIvc3FsaXRlMy9leGVjdXRlbWFueV8xLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmFlMTA2Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvc3FsaXRlMy9leGVjdXRlbWFueV8xLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotaW1wb3J0IHNxbGl0ZTMKLQotY2xhc3MgSXRlckNoYXJzOgotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc2VsZi5jb3VudCA9IG9yZCgnYScpCi0KLSAgICBkZWYgX19pdGVyX18oc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmCi0KLSAgICBkZWYgX19uZXh0X18oc2VsZik6Ci0gICAgICAgIGlmIHNlbGYuY291bnQgPiBvcmQoJ3onKToKLSAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KLSAgICAgICAgc2VsZi5jb3VudCArPSAxCi0gICAgICAgIHJldHVybiAoY2hyKHNlbGYuY291bnQgLSAxKSwpICMgdGhpcyBpcyBhIDEtdHVwbGUKLQotY29uID0gc3FsaXRlMy5jb25uZWN0KCI6bWVtb3J5OiIpCi1jdXIgPSBjb24uY3Vyc29yKCkKLWN1ci5leGVjdXRlKCJjcmVhdGUgdGFibGUgY2hhcmFjdGVycyhjKSIpCi0KLXRoZUl0ZXIgPSBJdGVyQ2hhcnMoKQotY3VyLmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byBjaGFyYWN0ZXJzKGMpIHZhbHVlcyAoPykiLCB0aGVJdGVyKQotCi1jdXIuZXhlY3V0ZSgic2VsZWN0IGMgZnJvbSBjaGFyYWN0ZXJzIikKLXByaW50KGN1ci5mZXRjaGFsbCgpKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9zcWxpdGUzL2V4ZWN1dGVtYW55XzIucHkgYi9Eb2MvbGliL3NxbGl0ZTMvZXhlY3V0ZW1hbnlfMi5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE4Y2Q5NC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL3NxbGl0ZTMvZXhlY3V0ZW1hbnlfMi5weQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLWltcG9ydCBzcWxpdGUzCi0KLWRlZiBjaGFyX2dlbmVyYXRvcigpOgotICAgIGltcG9ydCBzdHJpbmcKLSAgICBmb3IgYyBpbiBzdHJpbmcubGV0dGVyc1s6MjZdOgotICAgICAgICB5aWVsZCAoYywpCi0KLWNvbiA9IHNxbGl0ZTMuY29ubmVjdCgiOm1lbW9yeToiKQotY3VyID0gY29uLmN1cnNvcigpCi1jdXIuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIGNoYXJhY3RlcnMoYykiKQotCi1jdXIuZXhlY3V0ZW1hbnkoImluc2VydCBpbnRvIGNoYXJhY3RlcnMoYykgdmFsdWVzICg/KSIsIGNoYXJfZ2VuZXJhdG9yKCkpCi0KLWN1ci5leGVjdXRlKCJzZWxlY3QgYyBmcm9tIGNoYXJhY3RlcnMiKQotcHJpbnQoY3VyLmZldGNoYWxsKCkpCmRpZmYgLS1naXQgYS9Eb2MvbGliL3NxbGl0ZTMvZXhlY3V0ZXNjcmlwdC5weSBiL0RvYy9saWIvc3FsaXRlMy9leGVjdXRlc2NyaXB0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTUzNTgxLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvc3FsaXRlMy9leGVjdXRlc2NyaXB0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotaW1wb3J0IHNxbGl0ZTMKLQotY29uID0gc3FsaXRlMy5jb25uZWN0KCI6bWVtb3J5OiIpCi1jdXIgPSBjb24uY3Vyc29yKCkKLWN1ci5leGVjdXRlc2NyaXB0KCIiIgotICAgIGNyZWF0ZSB0YWJsZSBwZXJzb24oCi0gICAgICAgIGZpcnN0bmFtZSwKLSAgICAgICAgbGFzdG5hbWUsCi0gICAgICAgIGFnZQotICAgICk7Ci0KLSAgICBjcmVhdGUgdGFibGUgYm9vaygKLSAgICAgICAgdGl0bGUsCi0gICAgICAgIGF1dGhvciwKLSAgICAgICAgcHVibGlzaGVkCi0gICAgKTsKLQotICAgIGluc2VydCBpbnRvIGJvb2sodGl0bGUsIGF1dGhvciwgcHVibGlzaGVkKQotICAgIHZhbHVlcyAoCi0gICAgICAgICdEaXJrIEdlbnRseScncyBIb2xpc3RpYyBEZXRlY3RpdmUgQWdlbmN5JywKLSAgICAgICAgJ0RvdWdsYXMgQWRhbXMnLAotICAgICAgICAxOTg3Ci0gICAgKTsKLSAgICAiIiIpCmRpZmYgLS1naXQgYS9Eb2MvbGliL3NxbGl0ZTMvaW5zZXJ0X21vcmVfcGVvcGxlLnB5IGIvRG9jL2xpYi9zcWxpdGUzL2luc2VydF9tb3JlX3Blb3BsZS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRiYzc5ZS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL3NxbGl0ZTMvaW5zZXJ0X21vcmVfcGVvcGxlLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotaW1wb3J0IHNxbGl0ZTMKLQotY29uID0gc3FsaXRlMy5jb25uZWN0KCJteWRiIikKLQotY3VyID0gY29uLmN1cnNvcigpCi0KLW5ld1Blb3BsZSA9ICgKLSAgICAoJ0xlYmVkJyAgICAgICAsIDUzKSwKLSAgICAoJ1poaXJpbm92c2t5JyAsIDU3KSwKLSAgKQotCi1mb3IgcGVyc29uIGluIG5ld1Blb3BsZToKLSAgICBjdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gcGVvcGxlIChuYW1lX2xhc3QsIGFnZSkgdmFsdWVzICg/LCA/KSIsIHBlcnNvbikKLQotIyBUaGUgY2hhbmdlcyB3aWxsIG5vdCBiZSBzYXZlZCB1bmxlc3MgdGhlIHRyYW5zYWN0aW9uIGlzIGNvbW1pdHRlZCBleHBsaWNpdGx5OgotY29uLmNvbW1pdCgpCmRpZmYgLS1naXQgYS9Eb2MvbGliL3NxbGl0ZTMvbWQ1ZnVuYy5weSBiL0RvYy9saWIvc3FsaXRlMy9tZDVmdW5jLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2JjMDViLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvc3FsaXRlMy9tZDVmdW5jLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotaW1wb3J0IHNxbGl0ZTMKLWltcG9ydCBoYXNobGliCi0KLWRlZiBtZDVzdW0odCk6Ci0gICAgcmV0dXJuIGhhc2hsaWIubWQ1KHQpLmhleGRpZ2VzdCgpCi0KLWNvbiA9IHNxbGl0ZTMuY29ubmVjdCgiOm1lbW9yeToiKQotY29uLmNyZWF0ZV9mdW5jdGlvbigibWQ1IiwgMSwgbWQ1c3VtKQotY3VyID0gY29uLmN1cnNvcigpCi1jdXIuZXhlY3V0ZSgic2VsZWN0IG1kNSg/KSIsICgiZm9vIiwpKQotcHJpbnQoY3VyLmZldGNob25lKClbMF0pCmRpZmYgLS1naXQgYS9Eb2MvbGliL3NxbGl0ZTMvbXlzdW1hZ2dyLnB5IGIvRG9jL2xpYi9zcWxpdGUzL215c3VtYWdnci5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJkZmQyYy4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL3NxbGl0ZTMvbXlzdW1hZ2dyLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotaW1wb3J0IHNxbGl0ZTMKLQotY2xhc3MgTXlTdW06Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBzZWxmLmNvdW50ID0gMAotCi0gICAgZGVmIHN0ZXAoc2VsZiwgdmFsdWUpOgotICAgICAgICBzZWxmLmNvdW50ICs9IHZhbHVlCi0KLSAgICBkZWYgZmluYWxpemUoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLmNvdW50Ci0KLWNvbiA9IHNxbGl0ZTMuY29ubmVjdCgiOm1lbW9yeToiKQotY29uLmNyZWF0ZV9hZ2dyZWdhdGUoIm15c3VtIiwgMSwgTXlTdW0pCi1jdXIgPSBjb24uY3Vyc29yKCkKLWN1ci5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpKSIpCi1jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKDEpIikKLWN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoMikiKQotY3VyLmV4ZWN1dGUoInNlbGVjdCBteXN1bShpKSBmcm9tIHRlc3QiKQotcHJpbnQoY3VyLmZldGNob25lKClbMF0pCmRpZmYgLS1naXQgYS9Eb2MvbGliL3NxbGl0ZTMvcGFyc2VfY29sbmFtZXMucHkgYi9Eb2MvbGliL3NxbGl0ZTMvcGFyc2VfY29sbmFtZXMucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNjhjNzYuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9zcWxpdGUzL3BhcnNlX2NvbG5hbWVzLnB5CisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1pbXBvcnQgc3FsaXRlMwotaW1wb3J0IGRhdGV0aW1lCi0KLWNvbiA9IHNxbGl0ZTMuY29ubmVjdCgiOm1lbW9yeToiLCBkZXRlY3RfdHlwZXM9c3FsaXRlMy5QQVJTRV9DT0xOQU1FUykKLWN1ciA9IGNvbi5jdXJzb3IoKQotY3VyLmV4ZWN1dGUoJ3NlbGVjdCA/IGFzICJ4IFt0aW1lc3RhbXBdIicsIChkYXRldGltZS5kYXRldGltZS5ub3coKSwpKQotZHQgPSBjdXIuZmV0Y2hvbmUoKVswXQotcHJpbnQoZHQsIHR5cGUoZHQpKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9zcWxpdGUzL3B5c3FsaXRlX2RhdGV0aW1lLnB5IGIvRG9jL2xpYi9zcWxpdGUzL3B5c3FsaXRlX2RhdGV0aW1lLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGQ0OTM1Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvc3FsaXRlMy9weXNxbGl0ZV9kYXRldGltZS5weQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLWltcG9ydCBzcWxpdGUzCi1pbXBvcnQgZGF0ZXRpbWUKLQotY29uID0gc3FsaXRlMy5jb25uZWN0KCI6bWVtb3J5OiIsIGRldGVjdF90eXBlcz1zcWxpdGUzLlBBUlNFX0RFQ0xUWVBFU3xzcWxpdGUzLlBBUlNFX0NPTE5BTUVTKQotY3VyID0gY29uLmN1cnNvcigpCi1jdXIuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoZCBkYXRlLCB0cyB0aW1lc3RhbXApIikKLQotdG9kYXkgPSBkYXRldGltZS5kYXRlLnRvZGF5KCkKLW5vdyA9IGRhdGV0aW1lLmRhdGV0aW1lLm5vdygpCi0KLWN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGQsIHRzKSB2YWx1ZXMgKD8sID8pIiwgKHRvZGF5LCBub3cpKQotY3VyLmV4ZWN1dGUoInNlbGVjdCBkLCB0cyBmcm9tIHRlc3QiKQotcm93ID0gY3VyLmZldGNob25lKCkKLXByaW50KHRvZGF5LCAiPT4iLCByb3dbMF0sIHR5cGUocm93WzBdKSkKLXByaW50KG5vdywgIj0+Iiwgcm93WzFdLCB0eXBlKHJvd1sxXSkpCi0KLWN1ci5leGVjdXRlKCdzZWxlY3QgY3VycmVudF9kYXRlIGFzICJkIFtkYXRlXSIsIGN1cnJlbnRfdGltZXN0YW1wIGFzICJ0cyBbdGltZXN0YW1wXSInKQotcm93ID0gY3VyLmZldGNob25lKCkKLXByaW50KCJjdXJyZW50X2RhdGUiLCByb3dbMF0sIHR5cGUocm93WzBdKSkKLXByaW50KCJjdXJyZW50X3RpbWVzdGFtcCIsIHJvd1sxXSwgdHlwZShyb3dbMV0pKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9zcWxpdGUzL3Jvd19mYWN0b3J5LnB5IGIvRG9jL2xpYi9zcWxpdGUzL3Jvd19mYWN0b3J5LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDM2ZmZjLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvc3FsaXRlMy9yb3dfZmFjdG9yeS5weQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLWltcG9ydCBzcWxpdGUzCi0KLWRlZiBkaWN0X2ZhY3RvcnkoY3Vyc29yLCByb3cpOgotICAgIGQgPSB7fQotICAgIGZvciBpZHgsIGNvbCBpbiBlbnVtZXJhdGUoY3Vyc29yLmRlc2NyaXB0aW9uKToKLSAgICAgICAgZFtjb2xbMF1dID0gcm93W2lkeF0KLSAgICByZXR1cm4gZAotCi1jb24gPSBzcWxpdGUzLmNvbm5lY3QoIjptZW1vcnk6IikKLWNvbi5yb3dfZmFjdG9yeSA9IGRpY3RfZmFjdG9yeQotY3VyID0gY29uLmN1cnNvcigpCi1jdXIuZXhlY3V0ZSgic2VsZWN0IDEgYXMgYSIpCi1wcmludChjdXIuZmV0Y2hvbmUoKVsiYSJdKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9zcWxpdGUzL3Jvd2NsYXNzLnB5IGIvRG9jL2xpYi9zcWxpdGUzL3Jvd2NsYXNzLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmEwYjg3Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvc3FsaXRlMy9yb3djbGFzcy5weQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLWltcG9ydCBzcWxpdGUzCi0KLWNvbiA9IHNxbGl0ZTMuY29ubmVjdCgibXlkYiIpCi1jb24ucm93X2ZhY3RvcnkgPSBzcWxpdGUzLlJvdwotCi1jdXIgPSBjb24uY3Vyc29yKCkKLWN1ci5leGVjdXRlKCJzZWxlY3QgbmFtZV9sYXN0LCBhZ2UgZnJvbSBwZW9wbGUiKQotZm9yIHJvdyBpbiBjdXI6Ci0gICAgYXNzZXJ0IHJvd1swXSA9PSByb3dbIm5hbWVfbGFzdCJdCi0gICAgYXNzZXJ0IHJvd1sibmFtZV9sYXN0Il0gPT0gcm93WyJuQW1FX2xBc1QiXQotICAgIGFzc2VydCByb3dbMV0gPT0gcm93WyJhZ2UiXQotICAgIGFzc2VydCByb3dbMV0gPT0gcm93WyJBZ0UiXQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9zcWxpdGUzL3NoYXJlZF9jYWNoZS5weSBiL0RvYy9saWIvc3FsaXRlMy9zaGFyZWRfY2FjaGUucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMWQ3YjQuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9zcWxpdGUzL3NoYXJlZF9jYWNoZS5weQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotaW1wb3J0IHNxbGl0ZTMKLQotIyBUaGUgc2hhcmVkIGNhY2hlIGlzIG9ubHkgYXZhaWxhYmxlIGluIFNRTGl0ZSB2ZXJzaW9ucyAzLjMuMyBvciBsYXRlcgotIyBTZWUgdGhlIFNRTGl0ZSBkb2N1bWVudGF0b24gZm9yIGRldGFpbHMuCi0KLXNxbGl0ZTMuZW5hYmxlX3NoYXJlZF9jYWNoZShUcnVlKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9zcWxpdGUzL3Nob3J0Y3V0X21ldGhvZHMucHkgYi9Eb2MvbGliL3NxbGl0ZTMvc2hvcnRjdXRfbWV0aG9kcy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk2ZDg3Yy4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL3NxbGl0ZTMvc2hvcnRjdXRfbWV0aG9kcy5weQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLWltcG9ydCBzcWxpdGUzCi0KLXBlcnNvbnMgPSBbCi0gICAgKCJIdWdvIiwgIkJvc3MiKSwKLSAgICAoIkNhbHZpbiIsICJLbGVpbiIpCi0gICAgXQotCi1jb24gPSBzcWxpdGUzLmNvbm5lY3QoIjptZW1vcnk6IikKLQotIyBDcmVhdGUgdGhlIHRhYmxlCi1jb24uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHBlcnNvbihmaXJzdG5hbWUsIGxhc3RuYW1lKSIpCi0KLSMgRmlsbCB0aGUgdGFibGUKLWNvbi5leGVjdXRlbWFueSgiaW5zZXJ0IGludG8gcGVyc29uKGZpcnN0bmFtZSwgbGFzdG5hbWUpIHZhbHVlcyAoPywgPykiLCBwZXJzb25zKQotCi0jIFByaW50IHRoZSB0YWJsZSBjb250ZW50cwotZm9yIHJvdyBpbiBjb24uZXhlY3V0ZSgic2VsZWN0IGZpcnN0bmFtZSwgbGFzdG5hbWUgZnJvbSBwZXJzb24iKToKLSAgICBwcmludChyb3cpCi0KLSMgVXNpbmcgYSBkdW1teSBXSEVSRSBjbGF1c2UgdG8gbm90IGxldCBTUUxpdGUgdGFrZSB0aGUgc2hvcnRjdXQgdGFibGUgZGVsZXRlcy4KLXByaW50KCJJIGp1c3QgZGVsZXRlZCIsIGNvbi5leGVjdXRlKCJkZWxldGUgZnJvbSBwZXJzb24gd2hlcmUgMT0xIikucm93Y291bnQsICJyb3dzIikKZGlmZiAtLWdpdCBhL0RvYy9saWIvc3FsaXRlMy9zaW1wbGVfdGFibGVwcmludGVyLnB5IGIvRG9jL2xpYi9zcWxpdGUzL3NpbXBsZV90YWJsZXByaW50ZXIucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMWQ4NzIuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9zcWxpdGUzL3NpbXBsZV90YWJsZXByaW50ZXIucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1pbXBvcnQgc3FsaXRlMwotCi1GSUVMRF9NQVhfV0lEVEggPSAyMAotVEFCTEVfTkFNRSA9ICdwZW9wbGUnCi1TRUxFQ1QgPSAnc2VsZWN0ICogZnJvbSAlcyBvcmRlciBieSBhZ2UsIG5hbWVfbGFzdCcgJSBUQUJMRV9OQU1FCi0KLWNvbiA9IHNxbGl0ZTMuY29ubmVjdCgibXlkYiIpCi0KLWN1ciA9IGNvbi5jdXJzb3IoKQotY3VyLmV4ZWN1dGUoU0VMRUNUKQotCi0jIFByaW50IGEgaGVhZGVyLgotZm9yIGZpZWxkRGVzYyBpbiBjdXIuZGVzY3JpcHRpb246Ci0gICAgcHJpbnQoZmllbGREZXNjWzBdLmxqdXN0KEZJRUxEX01BWF9XSURUSCksIGVuZD0nICcpCi1wcmludCgpICMgRmluaXNoIHRoZSBoZWFkZXIgd2l0aCBhIG5ld2xpbmUuCi1wcmludCgnLScgKiA3OCkKLQotIyBGb3IgZWFjaCByb3csIHByaW50IHRoZSB2YWx1ZSBvZiBlYWNoIGZpZWxkIGxlZnQtanVzdGlmaWVkIHdpdGhpbgotIyB0aGUgbWF4aW11bSBwb3NzaWJsZSB3aWR0aCBvZiB0aGF0IGZpZWxkLgotZmllbGRJbmRpY2VzID0gcmFuZ2UobGVuKGN1ci5kZXNjcmlwdGlvbikpCi1mb3Igcm93IGluIGN1cjoKLSAgICBmb3IgZmllbGRJbmRleCBpbiBmaWVsZEluZGljZXM6Ci0gICAgICAgIGZpZWxkVmFsdWUgPSBzdHIocm93W2ZpZWxkSW5kZXhdKQotICAgICAgICBwcmludChmaWVsZFZhbHVlLmxqdXN0KEZJRUxEX01BWF9XSURUSCksIGVuZD0nICcpCi0KLSAgICBwcmludCgpICMgRmluaXNoIHRoZSByb3cgd2l0aCBhIG5ld2xpbmUuCmRpZmYgLS1naXQgYS9Eb2MvbGliL3NxbGl0ZTMvdGV4dF9mYWN0b3J5LnB5IGIvRG9jL2xpYi9zcWxpdGUzL3RleHRfZmFjdG9yeS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRhYjhlNC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL3NxbGl0ZTMvdGV4dF9mYWN0b3J5LnB5CisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotaW1wb3J0IHNxbGl0ZTMKLQotY29uID0gc3FsaXRlMy5jb25uZWN0KCI6bWVtb3J5OiIpCi1jdXIgPSBjb24uY3Vyc29yKCkKLQotIyBDcmVhdGUgdGhlIHRhYmxlCi1jb24uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHBlcnNvbihsYXN0bmFtZSwgZmlyc3RuYW1lKSIpCi0KLUFVU1RSSUEgPSAiXHhkNnN0ZXJyZWljaCIKLQotIyBieSBkZWZhdWx0LCByb3dzIGFyZSByZXR1cm5lZCBhcyBVbmljb2RlCi1jdXIuZXhlY3V0ZSgic2VsZWN0ID8iLCAoQVVTVFJJQSwpKQotcm93ID0gY3VyLmZldGNob25lKCkKLWFzc2VydCByb3dbMF0gPT0gQVVTVFJJQQotCi0jIGJ1dCB3ZSBjYW4gbWFrZSBweXNxbGl0ZSBhbHdheXMgcmV0dXJuIGJ5dGVzdHJpbmdzIC4uLgotY29uLnRleHRfZmFjdG9yeSA9IHN0cgotY3VyLmV4ZWN1dGUoInNlbGVjdCA/IiwgKEFVU1RSSUEsKSkKLXJvdyA9IGN1ci5mZXRjaG9uZSgpCi1hc3NlcnQgdHlwZShyb3dbMF0pID09IHN0cgotIyB0aGUgYnl0ZXN0cmluZ3Mgd2lsbCBiZSBlbmNvZGVkIGluIFVURi04LCB1bmxlc3MgeW91IHN0b3JlZCBnYXJiYWdlIGluIHRoZQotIyBkYXRhYmFzZSAuLi4KLWFzc2VydCByb3dbMF0gPT0gQVVTVFJJQS5lbmNvZGUoInV0Zi04IikKLQotIyB3ZSBjYW4gYWxzbyBpbXBsZW1lbnQgYSBjdXN0b20gdGV4dF9mYWN0b3J5IC4uLgotIyBoZXJlIHdlIGltcGxlbWVudCBvbmUgdGhhdCB3aWxsIGlnbm9yZSBVbmljb2RlIGNoYXJhY3RlcnMgdGhhdCBjYW5ub3QgYmUKLSMgZGVjb2RlZCBmcm9tIFVURi04Ci1jb24udGV4dF9mYWN0b3J5ID0gbGFtYmRhIHg6IHN0cih4LCAidXRmLTgiLCAiaWdub3JlIikKLWN1ci5leGVjdXRlKCJzZWxlY3QgPyIsICgidGhpcyBpcyBsYXRpbjEgYW5kIHdvdWxkIG5vcm1hbGx5IGNyZWF0ZSBlcnJvcnMiICsgIlx4ZTRceGY2XHhmYyIuZW5jb2RlKCJsYXRpbjEiKSwpKQotcm93ID0gY3VyLmZldGNob25lKCkKLWFzc2VydCB0eXBlKHJvd1swXSkgPT0gc3RyCi0KLSMgcHlzcWxpdGUgb2ZmZXJzIGEgYnVpbHRpbiBvcHRpbWl6ZWQgdGV4dF9mYWN0b3J5IHRoYXQgd2lsbCByZXR1cm4gYnl0ZXN0cmluZwotIyBvYmplY3RzLCBpZiB0aGUgZGF0YSBpcyBpbiBBU0NJSSBvbmx5LCBhbmQgb3RoZXJ3aXNlIHJldHVybiB1bmljb2RlIG9iamVjdHMKLWNvbi50ZXh0X2ZhY3RvcnkgPSBzcWxpdGUzLk9wdGltaXplZFVuaWNvZGUKLWN1ci5leGVjdXRlKCJzZWxlY3QgPyIsIChBVVNUUklBLCkpCi1yb3cgPSBjdXIuZmV0Y2hvbmUoKQotYXNzZXJ0IHR5cGUocm93WzBdKSA9PSBzdHIKLQotY3VyLmV4ZWN1dGUoInNlbGVjdCA/IiwgKCJHZXJtYW55IiwpKQotcm93ID0gY3VyLmZldGNob25lKCkKLWFzc2VydCB0eXBlKHJvd1swXSkgPT0gc3RyCmRpZmYgLS1naXQgYS9Eb2MvbGliL3RraW50ZXIudGV4IGIvRG9jL2xpYi90a2ludGVyLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBiMjM3My4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL3RraW50ZXIudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTg3MyArMCwwIEBACi1cY2hhcHRlcntHcmFwaGljYWwgVXNlciBJbnRlcmZhY2VzIHdpdGggVGsgXGxhYmVse3RraW50ZXJ9fQotCi1caW5kZXh7R1VJfQotXGluZGV4e0dyYXBoaWNhbCBVc2VyIEludGVyZmFjZX0KLVxpbmRleHtUa2ludGVyfQotXGluZGV4e1RrfQotCi1Uay9UY2wgaGFzIGxvbmcgYmVlbiBhbiBpbnRlZ3JhbCBwYXJ0IG9mIFB5dGhvbi4gIEl0IHByb3ZpZGVzIGEgcm9idXN0Ci1hbmQgcGxhdGZvcm0gaW5kZXBlbmRlbnQgd2luZG93aW5nIHRvb2xraXQsIHRoYXQgaXMgYXZhaWxhYmxlIHRvCi1QeXRob24gcHJvZ3JhbW1lcnMgdXNpbmcgdGhlIFxyZWZtb2R1bGV7VGtpbnRlcn0gbW9kdWxlLCBhbmQgaXRzCi1leHRlbnNpb24sIHRoZSBccmVmbW9kdWxle1RpeH0gbW9kdWxlLgotCi1UaGUgXHJlZm1vZHVsZXtUa2ludGVyfSBtb2R1bGUgaXMgYSB0aGluIG9iamVjdC1vcmllbnRlZCBsYXllciBvbiB0b3Agb2YKLVRjbC9Uay4gVG8gdXNlIFxyZWZtb2R1bGV7VGtpbnRlcn0sIHlvdSBkb24ndCBuZWVkIHRvIHdyaXRlIFRjbCBjb2RlLAotYnV0IHlvdSB3aWxsIG5lZWQgdG8gY29uc3VsdCB0aGUgVGsgZG9jdW1lbnRhdGlvbiwgYW5kIG9jY2FzaW9uYWxseQotdGhlIFRjbCBkb2N1bWVudGF0aW9uLiAgXHJlZm1vZHVsZXtUa2ludGVyfSBpcyBhIHNldCBvZiB3cmFwcGVycyB0aGF0Ci1pbXBsZW1lbnQgdGhlIFRrIHdpZGdldHMgYXMgUHl0aG9uIGNsYXNzZXMuICBJbiBhZGRpdGlvbiwgdGhlIGludGVybmFsCi1tb2R1bGUgXG1vZHVsZXtcX3RraW50ZXJ9IHByb3ZpZGVzIGEgdGhyZWFkc2FmZSBtZWNoYW5pc20gd2hpY2ggYWxsb3dzCi1QeXRob24gYW5kIFRjbCB0byBpbnRlcmFjdC4KLQotVGsgaXMgbm90IHRoZSBvbmx5IEdVSSBmb3IgUHl0aG9uOyBzZWUKLXNlY3Rpb25+XHJlZntvdGhlci1ndWktcGFja2FnZXN9LCBgYE90aGVyIFVzZXIgSW50ZXJmYWNlIE1vZHVsZXMgYW5kCi1QYWNrYWdlcywnJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBvdGhlciBHVUkgdG9vbGtpdHMgZm9yIFB5dGhvbi4KLQotJSBPdGhlciBzZWN0aW9ucyBJIGhhdmUgaW4gbWluZCBhcmUKLSUgVGtpbnRlciBpbnRlcm5hbHMKLSUgRnJlZXppbmcgVGtpbnRlciBhcHBsaWNhdGlvbnMKLQotXGxvY2FsbW9kdWxldGFibGUKLQotCi1cc2VjdGlvbntcbW9kdWxle1RraW50ZXJ9IC0tLQotICAgICAgICAgUHl0aG9uIGludGVyZmFjZSB0byBUY2wvVGt9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtUa2ludGVyfQotXG1vZHVsZXN5bm9wc2lze0ludGVyZmFjZSB0byBUY2wvVGsgZm9yIGdyYXBoaWNhbCB1c2VyIGludGVyZmFjZXN9Ci1cbW9kdWxlYXV0aG9ye0d1aWRvIHZhbiBSb3NzdW19e2d1aWRvQFB5dGhvbi5vcmd9Ci0KLVRoZSBcbW9kdWxle1RraW50ZXJ9IG1vZHVsZSAoYGBUayBpbnRlcmZhY2UnJykgaXMgdGhlIHN0YW5kYXJkIFB5dGhvbgotaW50ZXJmYWNlIHRvIHRoZSBUayBHVUkgdG9vbGtpdC4gIEJvdGggVGsgYW5kIFxtb2R1bGV7VGtpbnRlcn0gYXJlCi1hdmFpbGFibGUgb24gbW9zdCBcVU5JWHt9IHBsYXRmb3JtcywgYXMgd2VsbCBhcyBvbiBXaW5kb3dzIGFuZAotTWFjaW50b3NoIHN5c3RlbXMuICAoVGsgaXRzZWxmIGlzIG5vdCBwYXJ0IG9mIFB5dGhvbjsgaXQgaXMgbWFpbnRhaW5lZAotYXQgQWN0aXZlU3RhdGUuKQotCi1cYmVnaW57c2VlYWxzb30KLVxzZWV0aXRsZVtodHRwOi8vd3d3LnB5dGhvbi5vcmcvdG9waWNzL3RraW50ZXIvXQotICAgICAgICAge1B5dGhvbiBUa2ludGVyIFJlc291cmNlc30KLSAgICAgICAgIHtUaGUgUHl0aG9uIFRraW50ZXIgVG9waWMgR3VpZGUgcHJvdmlkZXMgYSBncmVhdAotICAgICAgICAgICAgZGVhbCBvZiBpbmZvcm1hdGlvbiBvbiB1c2luZyBUayBmcm9tIFB5dGhvbiBhbmQgbGlua3MgdG8KLSAgICAgICAgICAgIG90aGVyIHNvdXJjZXMgb2YgaW5mb3JtYXRpb24gb24gVGsufQotCi1cc2VldGl0bGVbaHR0cDovL3d3dy5weXRob253YXJlLmNvbS9saWJyYXJ5L2FuLWludHJvZHVjdGlvbi10by10a2ludGVyLmh0bV0KLSAgICAgICAgIHtBbiBJbnRyb2R1Y3Rpb24gdG8gVGtpbnRlcn0KLSAgICAgICAgIHtGcmVkcmlrIEx1bmRoJ3Mgb24tbGluZSByZWZlcmVuY2UgbWF0ZXJpYWwufQotCi1cc2VldGl0bGVbaHR0cDovL3d3dy5ubXQuZWR1L3RjYy9oZWxwL3B1YnMvbGFuZy5odG1sXQotICAgICAgICAge1RraW50ZXIgcmVmZXJlbmNlOiBhIEdVSSBmb3IgUHl0aG9ufQotICAgICAgICAge09uLWxpbmUgcmVmZXJlbmNlIG1hdGVyaWFsLn0KLSAgICAgICAgCi1cc2VldGl0bGVbaHR0cDovL2p0a2ludGVyLnNvdXJjZWZvcmdlLm5ldF0KLSAgICAgICAgIHtUa2ludGVyIGZvciBKUHl0aG9ufQotICAgICAgICAge1RoZSBKeXRob24gaW50ZXJmYWNlIHRvIFRraW50ZXIufQotCi1cc2VldGl0bGVbaHR0cDovL3d3dy5hbWF6b24uY29tL2V4ZWMvb2JpZG9zL0FTSU4vMTg4NDc3NzgxM10KLSAgICAgICAgIHtQeXRob24gYW5kIFRraW50ZXIgUHJvZ3JhbW1pbmd9Ci0gICAgICAgICB7VGhlIGJvb2sgYnkgSm9obiBHcmF5c29uIChJU0JOIDEtODg0Nzc3LTgxLTMpLn0KLVxlbmR7c2VlYWxzb30KLQotCi1cc3Vic2VjdGlvbntUa2ludGVyIE1vZHVsZXN9Ci0KLU1vc3Qgb2YgdGhlIHRpbWUsIHRoZSBccmVmbW9kdWxle1RraW50ZXJ9IG1vZHVsZSBpcyBhbGwgeW91IHJlYWxseQotbmVlZCwgYnV0IGEgbnVtYmVyIG9mIGFkZGl0aW9uYWwgbW9kdWxlcyBhcmUgYXZhaWxhYmxlIGFzIHdlbGwuICBUaGUKLVRrIGludGVyZmFjZSBpcyBsb2NhdGVkIGluIGEgYmluYXJ5IG1vZHVsZSBuYW1lZCBcbW9kdWxle190a2ludGVyfS4KLVRoaXMgbW9kdWxlIGNvbnRhaW5zIHRoZSBsb3ctbGV2ZWwgaW50ZXJmYWNlIHRvIFRrLCBhbmQgc2hvdWxkIG5ldmVyCi1iZSB1c2VkIGRpcmVjdGx5IGJ5IGFwcGxpY2F0aW9uIHByb2dyYW1tZXJzLiBJdCBpcyB1c3VhbGx5IGEgc2hhcmVkCi1saWJyYXJ5IChvciBETEwpLCBidXQgbWlnaHQgaW4gc29tZSBjYXNlcyBiZSBzdGF0aWNhbGx5IGxpbmtlZCB3aXRoCi10aGUgUHl0aG9uIGludGVycHJldGVyLgotCi1JbiBhZGRpdGlvbiB0byB0aGUgVGsgaW50ZXJmYWNlIG1vZHVsZSwgXHJlZm1vZHVsZXtUa2ludGVyfSBpbmNsdWRlcyBhCi1udW1iZXIgb2YgUHl0aG9uIG1vZHVsZXMuIFRoZSB0d28gbW9zdCBpbXBvcnRhbnQgbW9kdWxlcyBhcmUgdGhlCi1ccmVmbW9kdWxle1RraW50ZXJ9IG1vZHVsZSBpdHNlbGYsIGFuZCBhIG1vZHVsZSBjYWxsZWQKLVxtb2R1bGV7VGtjb25zdGFudHN9LiBUaGUgZm9ybWVyIGF1dG9tYXRpY2FsbHkgaW1wb3J0cyB0aGUgbGF0dGVyLCBzbwotdG8gdXNlIFRraW50ZXIsIGFsbCB5b3UgbmVlZCB0byBkbyBpcyB0byBpbXBvcnQgb25lIG1vZHVsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IFRraW50ZXIKLVxlbmR7dmVyYmF0aW19Ci0KLU9yLCBtb3JlIG9mdGVuOgotCi1cYmVnaW57dmVyYmF0aW19Ci1mcm9tIFRraW50ZXIgaW1wb3J0ICoKLVxlbmR7dmVyYmF0aW19Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1RrfXtzY3JlZW5OYW1lPU5vbmUsIGJhc2VOYW1lPU5vbmUsIGNsYXNzTmFtZT0nVGsnLCB1c2VUaz0xfQotVGhlIFxjbGFzc3tUa30gY2xhc3MgaXMgaW5zdGFudGlhdGVkIHdpdGhvdXQgYXJndW1lbnRzLgotVGhpcyBjcmVhdGVzIGEgdG9wbGV2ZWwgd2lkZ2V0IG9mIFRrIHdoaWNoIHVzdWFsbHkgaXMgdGhlIG1haW4gd2luZG93Ci1vZiBhbiBhcHBsaWNhdGlvbi4gRWFjaCBpbnN0YW5jZSBoYXMgaXRzIG93biBhc3NvY2lhdGVkIFRjbCBpbnRlcnByZXRlci4KLSUgRklYTUU6IFRoZSBmb2xsb3dpbmcga2V5d29yZCBhcmd1bWVudHMgYXJlIGN1cnJlbnRseSByZWNvZ25pemVkOgotXHZlcnNpb25jaGFuZ2VkW1RoZSBcdmFye3VzZVRrfSBwYXJhbWV0ZXIgd2FzIGFkZGVkXXsyLjR9Ci1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtUY2x9e3NjcmVlbk5hbWU9Tm9uZSwgYmFzZU5hbWU9Tm9uZSwgY2xhc3NOYW1lPSdUaycsIHVzZVRrPTB9Ci1UaGUgXGZ1bmN0aW9ue1RjbH0gZnVuY3Rpb24gaXMgYSBmYWN0b3J5IGZ1bmN0aW9uIHdoaWNoIGNyZWF0ZXMgYW4KLW9iamVjdCBtdWNoIGxpa2UgdGhhdCBjcmVhdGVkIGJ5IHRoZSBcY2xhc3N7VGt9IGNsYXNzLCBleGNlcHQgdGhhdCBpdAotZG9lcyBub3QgaW5pdGlhbGl6ZSB0aGUgVGsgc3Vic3lzdGVtLiAgVGhpcyBpcyBtb3N0IG9mdGVuIHVzZWZ1bCB3aGVuCi1kcml2aW5nIHRoZSBUY2wgaW50ZXJwcmV0ZXIgaW4gYW4gZW52aXJvbm1lbnQgd2hlcmUgb25lIGRvZXNuJ3Qgd2FudAotdG8gY3JlYXRlIGV4dHJhbmVvdXMgdG9wbGV2ZWwgd2luZG93cywgb3Igd2hlcmUgb25lIGNhbm5vdCAoc3VjaCBhcwotXFVOSVgvTGludXggc3lzdGVtcyB3aXRob3V0IGFuIFggc2VydmVyKS4gIEFuIG9iamVjdCBjcmVhdGVkIGJ5IHRoZQotXGZ1bmN0aW9ue1RjbH0gb2JqZWN0IGNhbiBoYXZlIGEgVG9wbGV2ZWwgd2luZG93IGNyZWF0ZWQgKGFuZCB0aGUgVGsKLXN1YnN5c3RlbSBpbml0aWFsaXplZCkgYnkgY2FsbGluZyBpdHMgXG1ldGhvZHtsb2FkdGt9IG1ldGhvZC4KLVx2ZXJzaW9uYWRkZWR7Mi40fQotXGVuZHtmdW5jZGVzY30KLQotT3RoZXIgbW9kdWxlcyB0aGF0IHByb3ZpZGUgVGsgc3VwcG9ydCBpbmNsdWRlOgotCi1cYmVnaW57ZGVzY3JpcHRpb259Ci0lIFxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtUa2NvbnN0YW50c30KLSUgXG1vZHVsZXN5bm9wc2lze0NvbnN0YW50cyB1c2VkIGJ5IFRraW50ZXJ9Ci0lIEZJWE1FIAotCi1caXRlbVtccmVmbW9kdWxle1Njcm9sbGVkVGV4dH1dCi1UZXh0IHdpZGdldCB3aXRoIGEgdmVydGljYWwgc2Nyb2xsIGJhciBidWlsdCBpbi4KLQotXGl0ZW1bXG1vZHVsZXt0a0NvbG9yQ2hvb3Nlcn1dCi1EaWFsb2cgdG8gbGV0IHRoZSB1c2VyIGNob29zZSBhIGNvbG9yLgotCi1caXRlbVtcbW9kdWxle3RrQ29tbW9uRGlhbG9nfV0KLUJhc2UgY2xhc3MgZm9yIHRoZSBkaWFsb2dzIGRlZmluZWQgaW4gdGhlIG90aGVyIG1vZHVsZXMgbGlzdGVkIGhlcmUuCi0KLVxpdGVtW1xtb2R1bGV7dGtGaWxlRGlhbG9nfV0KLUNvbW1vbiBkaWFsb2dzIHRvIGFsbG93IHRoZSB1c2VyIHRvIHNwZWNpZnkgYSBmaWxlIHRvIG9wZW4gb3Igc2F2ZS4KLQotXGl0ZW1bXG1vZHVsZXt0a0ZvbnR9XQotVXRpbGl0aWVzIHRvIGhlbHAgd29yayB3aXRoIGZvbnRzLgotCi1caXRlbVtcbW9kdWxle3RrTWVzc2FnZUJveH1dCi1BY2Nlc3MgdG8gc3RhbmRhcmQgVGsgZGlhbG9nIGJveGVzLgotCi1caXRlbVtcbW9kdWxle3RrU2ltcGxlRGlhbG9nfV0KLUJhc2ljIGRpYWxvZ3MgYW5kIGNvbnZlbmllbmNlIGZ1bmN0aW9ucy4KLQotXGl0ZW1bXG1vZHVsZXtUa2RuZH1dCi1EcmFnLWFuZC1kcm9wIHN1cHBvcnQgZm9yIFxyZWZtb2R1bGV7VGtpbnRlcn0uCi1UaGlzIGlzIGV4cGVyaW1lbnRhbCBhbmQgc2hvdWxkIGJlY29tZSBkZXByZWNhdGVkIHdoZW4gaXQgaXMgcmVwbGFjZWQgCi13aXRoIHRoZSBUayBETkQuCi0KLVxpdGVtW1xyZWZtb2R1bGV7dHVydGxlfV0KLVR1cnRsZSBncmFwaGljcyBpbiBhIFRrIHdpbmRvdy4KLQotXGVuZHtkZXNjcmlwdGlvbn0KLQotXHN1YnNlY3Rpb257VGtpbnRlciBMaWZlIFByZXNlcnZlcn0KLVxzZWN0aW9uYXV0aG9ye01hdHQgQ29ud2F5fXt9Ci0lIENvbnZlcnRlZCB0byBMYVRlWCBieSBNaWtlIENsYXJrc29uLgotCi1UaGlzIHNlY3Rpb24gaXMgbm90IGRlc2lnbmVkIHRvIGJlIGFuIGV4aGF1c3RpdmUgdHV0b3JpYWwgb24gZWl0aGVyCi1UayBvciBUa2ludGVyLiAgUmF0aGVyLCBpdCBpcyBpbnRlbmRlZCBhcyBhIHN0b3AgZ2FwLCBwcm92aWRpbmcgc29tZQotaW50cm9kdWN0b3J5IG9yaWVudGF0aW9uIG9uIHRoZSBzeXN0ZW0uCi0KLUNyZWRpdHM6Ci1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtICAgVGtpbnRlciB3YXMgd3JpdHRlbiBieSBTdGVlbiBMdW1ob2x0IGFuZCBHdWlkbyB2YW4gUm9zc3VtLgotXGl0ZW0gICBUayB3YXMgd3JpdHRlbiBieSBKb2huIE91c3RlcmhvdXQgd2hpbGUgYXQgQmVya2VsZXkuCi1caXRlbSAgIFRoaXMgTGlmZSBQcmVzZXJ2ZXIgd2FzIHdyaXR0ZW4gYnkgTWF0dCBDb253YXkgYXQKLXRoZSBVbml2ZXJzaXR5IG9mIFZpcmdpbmlhLgotXGl0ZW0gICBUaGUgaHRtbCByZW5kZXJpbmcsIGFuZCBzb21lIGxpYmVyYWwgZWRpdGluZywgd2FzCi1wcm9kdWNlZCBmcm9tIGEgRnJhbWVNYWtlciB2ZXJzaW9uIGJ5IEtlbiBNYW5oZWltZXIuCi1caXRlbSAgIEZyZWRyaWsgTHVuZGggZWxhYm9yYXRlZCBhbmQgcmV2aXNlZCB0aGUgY2xhc3MgaW50ZXJmYWNlIGRlc2NyaXB0aW9ucywKLXRvIGdldCB0aGVtIGN1cnJlbnQgd2l0aCBUayA0LjIuCi1caXRlbSAgTWlrZSBDbGFya3NvbiBjb252ZXJ0ZWQgdGhlIGRvY3VtZW50YXRpb24gdG8gXExhVGVYLCBhbmQgY29tcGlsZWQgdGhlIAotVXNlciBJbnRlcmZhY2UgY2hhcHRlciBvZiB0aGUgcmVmZXJlbmNlIG1hbnVhbC4KLVxlbmR7aXRlbWl6ZX0KLQotCi1cc3Vic3Vic2VjdGlvbntIb3cgVG8gVXNlIFRoaXMgU2VjdGlvbn0KLQotVGhpcyBzZWN0aW9uIGlzIGRlc2lnbmVkIGluIHR3byBwYXJ0czogdGhlIGZpcnN0IGhhbGYgKHJvdWdobHkpIGNvdmVycwotYmFja2dyb3VuZCBtYXRlcmlhbCwgd2hpbGUgdGhlIHNlY29uZCBoYWxmIGNhbiBiZSB0YWtlbiB0byB0aGUKLWtleWJvYXJkIGFzIGEgaGFuZHkgcmVmZXJlbmNlLgotCi1XaGVuIHRyeWluZyB0byBhbnN3ZXIgcXVlc3Rpb25zIG9mIHRoZSBmb3JtIGBgaG93IGRvIEkgZG8gYmxhaCcnLCBpdAotaXMgb2Z0ZW4gYmVzdCB0byBmaW5kIG91dCBob3cgdG8gZG9gYGJsYWgnJyBpbiBzdHJhaWdodCBUaywgYW5kIHRoZW4KLWNvbnZlcnQgdGhpcyBiYWNrIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgXHJlZm1vZHVsZXtUa2ludGVyfSBjYWxsLgotUHl0aG9uIHByb2dyYW1tZXJzIGNhbiBvZnRlbiBndWVzcyBhdCB0aGUgY29ycmVjdCBQeXRob24gY29tbWFuZCBieQotbG9va2luZyBhdCB0aGUgVGsgZG9jdW1lbnRhdGlvbi4gVGhpcyBtZWFucyB0aGF0IGluIG9yZGVyIHRvIHVzZQotVGtpbnRlciwgeW91IHdpbGwgaGF2ZSB0byBrbm93IGEgbGl0dGxlIGJpdCBhYm91dCBUay4gVGhpcyBkb2N1bWVudAotY2FuJ3QgZnVsZmlsbCB0aGF0IHJvbGUsIHNvIHRoZSBiZXN0IHdlIGNhbiBkbyBpcyBwb2ludCB5b3UgdG8gdGhlCi1iZXN0IGRvY3VtZW50YXRpb24gdGhhdCBleGlzdHMuIEhlcmUgYXJlIHNvbWUgaGludHM6Ci0KLVxiZWdpbntpdGVtaXplfQotXGl0ZW0gICBUaGUgYXV0aG9ycyBzdHJvbmdseSBzdWdnZXN0IGdldHRpbmcgYSBjb3B5IG9mIHRoZSBUayBtYW4KLXBhZ2VzLiBTcGVjaWZpY2FsbHksIHRoZSBtYW4gcGFnZXMgaW4gdGhlIFxjb2Rle21hbm59IGRpcmVjdG9yeSBhcmUgbW9zdAotdXNlZnVsLiBUaGUgXGNvZGV7bWFuM30gbWFuIHBhZ2VzIGRlc2NyaWJlIHRoZSBDIGludGVyZmFjZSB0byB0aGUgVGsKLWxpYnJhcnkgYW5kIHRodXMgYXJlIG5vdCBlc3BlY2lhbGx5IGhlbHBmdWwgZm9yIHNjcmlwdCB3cml0ZXJzLiAgCi0KLVxpdGVtICAgQWRkaXNvbi1XZXNsZXkgcHVibGlzaGVzIGEgYm9vayBjYWxsZWQgXGNpdGV0aXRsZXtUY2wgYW5kIHRoZQotVGsgVG9vbGtpdH0gYnkgSm9obiBPdXN0ZXJob3V0IChJU0JOIDAtMjAxLTYzMzM3LVgpIHdoaWNoIGlzIGEgZ29vZAotaW50cm9kdWN0aW9uIHRvIFRjbCBhbmQgVGsgZm9yIHRoZSBub3ZpY2UuICBUaGUgYm9vayBpcyBub3QKLWV4aGF1c3RpdmUsIGFuZCBmb3IgbWFueSBkZXRhaWxzIGl0IGRlZmVycyB0byB0aGUgbWFuIHBhZ2VzLiAKLQotXGl0ZW0gICBcZmlsZXtUa2ludGVyLnB5fSBpcyBhIGxhc3QgcmVzb3J0IGZvciBtb3N0LCBidXQgY2FuIGJlIGEgZ29vZAotcGxhY2UgdG8gZ28gd2hlbiBub3RoaW5nIGVsc2UgbWFrZXMgc2Vuc2UuICAKLVxlbmR7aXRlbWl6ZX0KLQotXGJlZ2lue3NlZWFsc299Ci1cc2VldGl0bGVbaHR0cDovL3RjbC5hY3RpdmVzdGF0ZS5jb20vXQotICAgICAgICB7QWN0aXZlU3RhdGUgVGNsIEhvbWUgUGFnZX0KLSAgICAgICAge1RoZSBUay9UY2wgZGV2ZWxvcG1lbnQgaXMgbGFyZ2VseSB0YWtpbmcgcGxhY2UgYXQKLSAgICAgICAgIEFjdGl2ZVN0YXRlLn0KLVxzZWV0aXRsZVtodHRwOi8vd3d3LmFtYXpvbi5jb20vZXhlYy9vYmlkb3MvQVNJTi8wMjAxNjMzMzdYXQotICAgICAgICB7VGNsIGFuZCB0aGUgVGsgVG9vbGtpdH0KLSAgICAgICAge1RoZSBib29rIGJ5IEpvaG4gT3VzdGVyaG91dCwgdGhlIGludmVudG9yIG9mIFRjbCAufQotXHNlZXRpdGxlW2h0dHA6Ly93d3cuYW1hem9uLmNvbS9leGVjL29iaWRvcy9BU0lOLzAxMzAyMjAyODBdCi0gICAgICAgIHtQcmFjdGljYWwgUHJvZ3JhbW1pbmcgaW4gVGNsIGFuZCBUa30KLSAgICAgICAge0JyZW50IFdlbGNoJ3MgZW5jeWNsb3BlZGljIGJvb2sufQotXGVuZHtzZWVhbHNvfQotCi0KLVxzdWJzdWJzZWN0aW9ue0EgU2ltcGxlIEhlbGxvIFdvcmxkIFByb2dyYW19ICUgSGVsbG9Xb3JsZC5odG1sCi0KLSViZWdpbntsYXRleG9ubHl9Ci0lXGJlZ2lue2ZpZ3VyZX1baGJ0cF0KLSVcY2VudGVybGluZXtcZXBzZmlne2ZpbGU9SGVsbG9Xb3JsZC5naWYsd2lkdGg9LjlcdGV4dHdpZHRofX0KLSVcdnNwYWNley41Y219Ci0lXGNhcHRpb257SGVsbG9Xb3JsZCBnYWRnZXQgaW1hZ2V9Ci0lXGVuZHtmaWd1cmV9Ci0lU2VlIGFsc28gdGhlIGhlbGxvLXdvcmxkIFx1bGlua3tub3Rlc317Y2xhc3Nlcy9IZWxsb1dvcmxkLW5vdGVzLmh0bWx9IGFuZAotJVx1bGlua3tzdW1tYXJ5fXtjbGFzc2VzL0hlbGxvV29ybGQtc3VtbWFyeS5odG1sfS4KLSVlbmR7bGF0ZXhvbmx5fQotCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLWZyb20gVGtpbnRlciBpbXBvcnQgKgotCi1jbGFzcyBBcHBsaWNhdGlvbihGcmFtZSk6Ci0gICAgZGVmIHNheV9oaShzZWxmKToKLSAgICAgICAgcHJpbnQgImhpIHRoZXJlLCBldmVyeW9uZSEiCi0KLSAgICBkZWYgY3JlYXRlV2lkZ2V0cyhzZWxmKToKLSAgICAgICAgc2VsZi5RVUlUID0gQnV0dG9uKHNlbGYpCi0gICAgICAgIHNlbGYuUVVJVFsidGV4dCJdID0gIlFVSVQiCi0gICAgICAgIHNlbGYuUVVJVFsiZmciXSAgID0gInJlZCIKLSAgICAgICAgc2VsZi5RVUlUWyJjb21tYW5kIl0gPSAgc2VsZi5xdWl0Ci0KLSAgICAgICAgc2VsZi5RVUlULnBhY2soeyJzaWRlIjogImxlZnQifSkKLQotICAgICAgICBzZWxmLmhpX3RoZXJlID0gQnV0dG9uKHNlbGYpCi0gICAgICAgIHNlbGYuaGlfdGhlcmVbInRleHQiXSA9ICJIZWxsbyIsCi0gICAgICAgIHNlbGYuaGlfdGhlcmVbImNvbW1hbmQiXSA9IHNlbGYuc2F5X2hpCi0KLSAgICAgICAgc2VsZi5oaV90aGVyZS5wYWNrKHsic2lkZSI6ICJsZWZ0In0pCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUpOgotICAgICAgICBGcmFtZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIpCi0gICAgICAgIHNlbGYucGFjaygpCi0gICAgICAgIHNlbGYuY3JlYXRlV2lkZ2V0cygpCi0KLXJvb3QgPSBUaygpCi1hcHAgPSBBcHBsaWNhdGlvbihtYXN0ZXI9cm9vdCkKLWFwcC5tYWlubG9vcCgpCi1yb290LmRlc3Ryb3koKQotXGVuZHt2ZXJiYXRpbX0KLQotCi1cc3Vic2VjdGlvbntBIChWZXJ5KSBRdWljayBMb29rIGF0IFRjbC9Ua30gJSBCcmllZlRjbFRrLmh0bWwKLQotVGhlIGNsYXNzIGhpZXJhcmNoeSBsb29rcyBjb21wbGljYXRlZCwgYnV0IGluIGFjdHVhbCBwcmFjdGljZSwKLWFwcGxpY2F0aW9uIHByb2dyYW1tZXJzIGFsbW9zdCBhbHdheXMgcmVmZXIgdG8gdGhlIGNsYXNzZXMgYXQgdGhlIHZlcnkKLWJvdHRvbSBvZiB0aGUgaGllcmFyY2h5LiAKLQotTm90ZXM6Ci1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtICAgVGhlc2UgY2xhc3NlcyBhcmUgcHJvdmlkZWQgZm9yIHRoZSBwdXJwb3NlcyBvZgotb3JnYW5pemluZyBjZXJ0YWluIGZ1bmN0aW9ucyB1bmRlciBvbmUgbmFtZXNwYWNlLiBUaGV5IGFyZW4ndCBtZWFudCB0bwotYmUgaW5zdGFudGlhdGVkIGluZGVwZW5kZW50bHkuCi0KLVxpdGVtICAgIFRoZSBcY2xhc3N7VGt9IGNsYXNzIGlzIG1lYW50IHRvIGJlIGluc3RhbnRpYXRlZCBvbmx5IG9uY2UgaW4KLWFuIGFwcGxpY2F0aW9uLiBBcHBsaWNhdGlvbiBwcm9ncmFtbWVycyBuZWVkIG5vdCBpbnN0YW50aWF0ZSBvbmUKLWV4cGxpY2l0bHksIHRoZSBzeXN0ZW0gY3JlYXRlcyBvbmUgd2hlbmV2ZXIgYW55IG9mIHRoZSBvdGhlciBjbGFzc2VzCi1hcmUgaW5zdGFudGlhdGVkLgotCi1caXRlbSAgICBUaGUgXGNsYXNze1dpZGdldH0gY2xhc3MgaXMgbm90IG1lYW50IHRvIGJlIGluc3RhbnRpYXRlZCwgaXQKLWlzIG1lYW50IG9ubHkgZm9yIHN1YmNsYXNzaW5nIHRvIG1ha2UgYGByZWFsJycgd2lkZ2V0cyAoaW4gXENwcCwgdGhpcwotaXMgY2FsbGVkIGFuIGBhYnN0cmFjdCBjbGFzcycpLgotXGVuZHtpdGVtaXplfQotCi1UbyBtYWtlIHVzZSBvZiB0aGlzIHJlZmVyZW5jZSBtYXRlcmlhbCwgdGhlcmUgd2lsbCBiZSB0aW1lcyB3aGVuIHlvdQotd2lsbCBuZWVkIHRvIGtub3cgaG93IHRvIHJlYWQgc2hvcnQgcGFzc2FnZXMgb2YgVGsgYW5kIGhvdyB0byBpZGVudGlmeQotdGhlIHZhcmlvdXMgcGFydHMgb2YgYSBUayBjb21tYW5kLiAgCi0oU2VlIHNlY3Rpb25+XHJlZnt0a2ludGVyLWJhc2ljLW1hcHBpbmd9IGZvciB0aGUKLVxyZWZtb2R1bGV7VGtpbnRlcn0gZXF1aXZhbGVudHMgb2Ygd2hhdCdzIGJlbG93LikKLQotVGsgc2NyaXB0cyBhcmUgVGNsIHByb2dyYW1zLiAgTGlrZSBhbGwgVGNsIHByb2dyYW1zLCBUayBzY3JpcHRzIGFyZQotanVzdCBsaXN0cyBvZiB0b2tlbnMgc2VwYXJhdGVkIGJ5IHNwYWNlcy4gIEEgVGsgd2lkZ2V0IGlzIGp1c3QgaXRzCi1cZW1waHtjbGFzc30sIHRoZSBcZW1waHtvcHRpb25zfSB0aGF0IGhlbHAgY29uZmlndXJlIGl0LCBhbmQgdGhlCi1cZW1waHthY3Rpb25zfSB0aGF0IG1ha2UgaXQgZG8gdXNlZnVsIHRoaW5ncy4gCi0KLVRvIG1ha2UgYSB3aWRnZXQgaW4gVGssIHRoZSBjb21tYW5kIGlzIGFsd2F5cyBvZiB0aGUgZm9ybTogCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICAgICAgICAgICAgICBjbGFzc0NvbW1hbmQgbmV3UGF0aG5hbWUgb3B0aW9ucwotXGVuZHt2ZXJiYXRpbX0KLQotXGJlZ2lue2Rlc2NyaXB0aW9ufQotXGl0ZW1bXHZhcntjbGFzc0NvbW1hbmR9XQotZGVub3RlcyB3aGljaCBraW5kIG9mIHdpZGdldCB0byBtYWtlIChhIGJ1dHRvbiwgYSBsYWJlbCwgYSBtZW51Li4uKQotCi1caXRlbVtcdmFye25ld1BhdGhuYW1lfV0KLWlzIHRoZSBuZXcgbmFtZSBmb3IgdGhpcyB3aWRnZXQuICBBbGwgbmFtZXMgaW4gVGsgbXVzdCBiZSB1bmlxdWUuICBUbwotaGVscCBlbmZvcmNlIHRoaXMsIHdpZGdldHMgaW4gVGsgYXJlIG5hbWVkIHdpdGggXGVtcGh7cGF0aG5hbWVzfSwganVzdAotbGlrZSBmaWxlcyBpbiBhIGZpbGUgc3lzdGVtLiAgVGhlIHRvcCBsZXZlbCB3aWRnZXQsIHRoZSBcZW1waHtyb290fSwKLWlzIGNhbGxlZCBcY29kZXsufSAocGVyaW9kKSBhbmQgY2hpbGRyZW4gYXJlIGRlbGltaXRlZCBieSBtb3JlCi1wZXJpb2RzLiAgRm9yIGV4YW1wbGUsIFxjb2Rley5teUFwcC5jb250cm9sUGFuZWwub2tCdXR0b259IG1pZ2h0IGJlCi10aGUgbmFtZSBvZiBhIHdpZGdldC4KLQotXGl0ZW1bXHZhcntvcHRpb25zfV0KLWNvbmZpZ3VyZSB0aGUgd2lkZ2V0J3MgYXBwZWFyYW5jZSBhbmQgaW4gc29tZSBjYXNlcywgaXRzCi1iZWhhdmlvci4gIFRoZSBvcHRpb25zIGNvbWUgaW4gdGhlIGZvcm0gb2YgYSBsaXN0IG9mIGZsYWdzIGFuZCB2YWx1ZXMuCi1GbGFncyBhcmUgcHJlY2VkZWQgYnkgYSBgLScsIGxpa2UgXFVOSVh7fSBzaGVsbCBjb21tYW5kIGZsYWdzLCBhbmQKLXZhbHVlcyBhcmUgcHV0IGluIHF1b3RlcyBpZiB0aGV5IGFyZSBtb3JlIHRoYW4gb25lIHdvcmQuCi1cZW5ke2Rlc2NyaXB0aW9ufQotCi1Gb3IgZXhhbXBsZTogCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICBidXR0b24gICAuZnJlZCAgIC1mZyByZWQgLXRleHQgImhpIHRoZXJlIgotICAgICAgIF4gICAgICAgXiAgICAgXF9fX19fX19fX19fX19fX19fX19fXy8KLSAgICAgICB8ICAgICAgIHwgICAgICAgICAgICAgICAgfAotICAgICBjbGFzcyAgICBuZXcgICAgICAgICAgICBvcHRpb25zCi0gICAgY29tbWFuZCAgd2lkZ2V0ICAoLW9wdCB2YWwgLW9wdCB2YWwgLi4uKQotXGVuZHt2ZXJiYXRpbX0gCi0KLU9uY2UgY3JlYXRlZCwgdGhlIHBhdGhuYW1lIHRvIHRoZSB3aWRnZXQgYmVjb21lcyBhIG5ldyBjb21tYW5kLiAgVGhpcwotbmV3IFx2YXJ7d2lkZ2V0IGNvbW1hbmR9IGlzIHRoZSBwcm9ncmFtbWVyJ3MgaGFuZGxlIGZvciBnZXR0aW5nIHRoZSBuZXcKLXdpZGdldCB0byBwZXJmb3JtIHNvbWUgXHZhcnthY3Rpb259LiAgSW4gQywgeW91J2QgZXhwcmVzcyB0aGlzIGFzCi1zb21lQWN0aW9uKGZyZWQsIHNvbWVPcHRpb25zKSwgaW4gXENwcCwgeW91IHdvdWxkIGV4cHJlc3MgdGhpcyBhcwotZnJlZC5zb21lQWN0aW9uKHNvbWVPcHRpb25zKSwgYW5kIGluIFRrLCB5b3Ugc2F5OiAKLQotXGJlZ2lue3ZlcmJhdGltfQotICAgIC5mcmVkIHNvbWVBY3Rpb24gc29tZU9wdGlvbnMgCi1cZW5ke3ZlcmJhdGltfSAKLQotTm90ZSB0aGF0IHRoZSBvYmplY3QgbmFtZSwgXGNvZGV7LmZyZWR9LCBzdGFydHMgd2l0aCBhIGRvdC4KLQotQXMgeW91J2QgZXhwZWN0LCB0aGUgbGVnYWwgdmFsdWVzIGZvciBcdmFye3NvbWVBY3Rpb259IHdpbGwgZGVwZW5kIG9uCi10aGUgd2lkZ2V0J3MgY2xhc3M6IFxjb2Rley5mcmVkIGRpc2FibGV9IHdvcmtzIGlmIGZyZWQgaXMgYQotYnV0dG9uIChmcmVkIGdldHMgZ3JleWVkIG91dCksIGJ1dCBkb2VzIG5vdCB3b3JrIGlmIGZyZWQgaXMgYSBsYWJlbAotKGRpc2FibGluZyBvZiBsYWJlbHMgaXMgbm90IHN1cHBvcnRlZCBpbiBUaykuIAotCi1UaGUgbGVnYWwgdmFsdWVzIG9mIFx2YXJ7c29tZU9wdGlvbnN9IGlzIGFjdGlvbiBkZXBlbmRlbnQuICBTb21lCi1hY3Rpb25zLCBsaWtlIFxjb2Rle2Rpc2FibGV9LCByZXF1aXJlIG5vIGFyZ3VtZW50cywgb3RoZXJzLCBsaWtlCi1hIHRleHQtZW50cnkgYm94J3MgXGNvZGV7ZGVsZXRlfSBjb21tYW5kLCB3b3VsZCBuZWVkIGFyZ3VtZW50cwotdG8gc3BlY2lmeSB3aGF0IHJhbmdlIG9mIHRleHQgdG8gZGVsZXRlLiAgCi0KLQotXHN1YnNlY3Rpb257TWFwcGluZyBCYXNpYyBUayBpbnRvIFRraW50ZXIKLSAgICAgICAgICAgIFxsYWJlbHt0a2ludGVyLWJhc2ljLW1hcHBpbmd9fQotCi1DbGFzcyBjb21tYW5kcyBpbiBUayBjb3JyZXNwb25kIHRvIGNsYXNzIGNvbnN0cnVjdG9ycyBpbiBUa2ludGVyLgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgYnV0dG9uIC5mcmVkICAgICAgICAgICAgICAgID09PT09PiAgZnJlZCA9IEJ1dHRvbigpCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgbWFzdGVyIG9mIGFuIG9iamVjdCBpcyBpbXBsaWNpdCBpbiB0aGUgbmV3IG5hbWUgZ2l2ZW4gdG8gaXQgYXQKLWNyZWF0aW9uIHRpbWUuICBJbiBUa2ludGVyLCBtYXN0ZXJzIGFyZSBzcGVjaWZpZWQgZXhwbGljaXRseS4KLQotXGJlZ2lue3ZlcmJhdGltfQotICAgIGJ1dHRvbiAucGFuZWwuZnJlZCAgICAgICAgICA9PT09PT4gIGZyZWQgPSBCdXR0b24ocGFuZWwpCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGluIFRrIGFyZSBnaXZlbiBpbiBsaXN0cyBvZiBoeXBoZW5lZCB0YWdzCi1mb2xsb3dlZCBieSB2YWx1ZXMuICBJbiBUa2ludGVyLCBvcHRpb25zIGFyZSBzcGVjaWZpZWQgYXMKLWtleXdvcmQtYXJndW1lbnRzIGluIHRoZSBpbnN0YW5jZSBjb25zdHJ1Y3RvciwgYW5kIGtleXdvcmQtYXJncyBmb3IKLWNvbmZpZ3VyZSBjYWxscyBvciBhcyBpbnN0YW5jZSBpbmRpY2VzLCBpbiBkaWN0aW9uYXJ5IHN0eWxlLCBmb3IKLWVzdGFibGlzaGVkIGluc3RhbmNlcy4gIFNlZSBzZWN0aW9uflxyZWZ7dGtpbnRlci1zZXR0aW5nLW9wdGlvbnN9IG9uCi1zZXR0aW5nIG9wdGlvbnMuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICBidXR0b24gLmZyZWQgLWZnIHJlZCAgICAgICAgPT09PT0+ICBmcmVkID0gQnV0dG9uKHBhbmVsLCBmZyA9ICJyZWQiKQotICAgIC5mcmVkIGNvbmZpZ3VyZSAtZmcgcmVkICAgICA9PT09PT4gIGZyZWRbImZnIl0gPSByZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1IgPT0+ICBmcmVkLmNvbmZpZyhmZyA9ICJyZWQiKQotXGVuZHt2ZXJiYXRpbX0KLQotSW4gVGssIHRvIHBlcmZvcm0gYW4gYWN0aW9uIG9uIGEgd2lkZ2V0LCB1c2UgdGhlIHdpZGdldCBuYW1lIGFzIGEKLWNvbW1hbmQsIGFuZCBmb2xsb3cgaXQgd2l0aCBhbiBhY3Rpb24gbmFtZSwgcG9zc2libHkgd2l0aCBhcmd1bWVudHMKLShvcHRpb25zKS4gIEluIFRraW50ZXIsIHlvdSBjYWxsIG1ldGhvZHMgb24gdGhlIGNsYXNzIGluc3RhbmNlIHRvCi1pbnZva2UgYWN0aW9ucyBvbiB0aGUgd2lkZ2V0LiAgVGhlIGFjdGlvbnMgKG1ldGhvZHMpIHRoYXQgYSBnaXZlbgotd2lkZ2V0IGNhbiBwZXJmb3JtIGFyZSBsaXN0ZWQgaW4gdGhlIFRraW50ZXIucHkgbW9kdWxlLgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgLmZyZWQgaW52b2tlICAgICAgICAgICAgICAgID09PT09PiAgZnJlZC5pbnZva2UoKQotXGVuZHt2ZXJiYXRpbX0KLQotVG8gZ2l2ZSBhIHdpZGdldCB0byB0aGUgcGFja2VyIChnZW9tZXRyeSBtYW5hZ2VyKSwgeW91IGNhbGwgcGFjayB3aXRoCi1vcHRpb25hbCBhcmd1bWVudHMuICBJbiBUa2ludGVyLCB0aGUgUGFjayBjbGFzcyBob2xkcyBhbGwgdGhpcwotZnVuY3Rpb25hbGl0eSwgYW5kIHRoZSB2YXJpb3VzIGZvcm1zIG9mIHRoZSBwYWNrIGNvbW1hbmQgYXJlCi1pbXBsZW1lbnRlZCBhcyBtZXRob2RzLiAgQWxsIHdpZGdldHMgaW4gXHJlZm1vZHVsZXtUa2ludGVyfSBhcmUKLXN1YmNsYXNzZWQgZnJvbSB0aGUgUGFja2VyLCBhbmQgc28gaW5oZXJpdCBhbGwgdGhlIHBhY2tpbmcKLW1ldGhvZHMuIFNlZSB0aGUgXHJlZm1vZHVsZXtUaXh9IG1vZHVsZSBkb2N1bWVudGF0aW9uIGZvciBhZGRpdGlvbmFsCi1pbmZvcm1hdGlvbiBvbiB0aGUgRm9ybSBnZW9tZXRyeSBtYW5hZ2VyLgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgcGFjayAuZnJlZCAtc2lkZSBsZWZ0ICAgICAgID09PT09PiAgZnJlZC5wYWNrKHNpZGUgPSAibGVmdCIpCi1cZW5ke3ZlcmJhdGltfQotCi0KLVxzdWJzZWN0aW9ue0hvdyBUayBhbmQgVGtpbnRlciBhcmUgUmVsYXRlZH0gJSBSZWxhdGlvbnNoaXAuaHRtbAotCi1cbm90ZXtUaGlzIHdhcyBkZXJpdmVkIGZyb20gYSBncmFwaGljYWwgaW1hZ2U7IHRoZSBpbWFnZSB3aWxsIGJlIHVzZWQKLSAgICAgIG1vcmUgZGlyZWN0bHkgaW4gYSBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudC59Ci0KLUZyb20gdGhlIHRvcCBkb3duOgotXGJlZ2lue2Rlc2NyaXB0aW9ufQotXGl0ZW1bXGJ7WW91ciBBcHAgSGVyZSAoUHl0aG9uKX1dCi1BIFB5dGhvbiBhcHBsaWNhdGlvbiBtYWtlcyBhIFxyZWZtb2R1bGV7VGtpbnRlcn0gY2FsbC4KLQotXGl0ZW1bXGJ7VGtpbnRlciAoUHl0aG9uIE1vZHVsZSl9XQotVGhpcyBjYWxsIChzYXksIGZvciBleGFtcGxlLCBjcmVhdGluZyBhIGJ1dHRvbiB3aWRnZXQpLCBpcwotaW1wbGVtZW50ZWQgaW4gdGhlIFxlbXBoe1RraW50ZXJ9IG1vZHVsZSwgd2hpY2ggaXMgd3JpdHRlbiBpbgotUHl0aG9uLiAgVGhpcyBQeXRob24gZnVuY3Rpb24gd2lsbCBwYXJzZSB0aGUgY29tbWFuZHMgYW5kIHRoZQotYXJndW1lbnRzIGFuZCBjb252ZXJ0IHRoZW0gaW50byBhIGZvcm0gdGhhdCBtYWtlcyB0aGVtIGxvb2sgYXMgaWYgdGhleQotaGFkIGNvbWUgZnJvbSBhIFRrIHNjcmlwdCBpbnN0ZWFkIG9mIGEgUHl0aG9uIHNjcmlwdC4KLQotXGl0ZW1bXGJ7dGtpbnRlciAoQyl9XQotVGhlc2UgY29tbWFuZHMgYW5kIHRoZWlyIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCB0byBhIEMgZnVuY3Rpb24KLWluIHRoZSBcZW1waHt0a2ludGVyfSAtIG5vdGUgdGhlIGxvd2VyY2FzZSAtIGV4dGVuc2lvbiBtb2R1bGUuCi0KLVxpdGVtW1xie1RrIFdpZGdldHN9IChDIGFuZCBUY2wpXQotVGhpcyBDIGZ1bmN0aW9uIGlzIGFibGUgdG8gbWFrZSBjYWxscyBpbnRvIG90aGVyIEMgbW9kdWxlcywKLWluY2x1ZGluZyB0aGUgQyBmdW5jdGlvbnMgdGhhdCBtYWtlIHVwIHRoZSBUayBsaWJyYXJ5LiAgVGsgaXMKLWltcGxlbWVudGVkIGluIEMgYW5kIHNvbWUgVGNsLiAgVGhlIFRjbCBwYXJ0IG9mIHRoZSBUayB3aWRnZXRzIGlzIHVzZWQKLXRvIGJpbmQgY2VydGFpbiBkZWZhdWx0IGJlaGF2aW9ycyB0byB3aWRnZXRzLCBhbmQgaXMgZXhlY3V0ZWQgb25jZSBhdAotdGhlIHBvaW50IHdoZXJlIHRoZSBQeXRob24gXHJlZm1vZHVsZXtUa2ludGVyfSBtb2R1bGUgaXMKLWltcG9ydGVkLiAoVGhlIHVzZXIgbmV2ZXIgc2VlcyB0aGlzIHN0YWdlKS4KLQotXGl0ZW1bXGJ7VGsgKEMpfV0KLVRoZSBUayBwYXJ0IG9mIHRoZSBUayBXaWRnZXRzIGltcGxlbWVudCB0aGUgZmluYWwgbWFwcGluZyB0byAuLi4KLQotXGl0ZW1bXGJ7WGxpYiAoQyl9XQotdGhlIFhsaWIgbGlicmFyeSB0byBkcmF3IGdyYXBoaWNzIG9uIHRoZSBzY3JlZW4uCi1cZW5ke2Rlc2NyaXB0aW9ufQotCi0KLVxzdWJzZWN0aW9ue0hhbmR5IFJlZmVyZW5jZX0KLQotXHN1YnN1YnNlY3Rpb257U2V0dGluZyBPcHRpb25zCi0gICAgICAgICAgICAgICBcbGFiZWx7dGtpbnRlci1zZXR0aW5nLW9wdGlvbnN9fQotCi1PcHRpb25zIGNvbnRyb2wgdGhpbmdzIGxpa2UgdGhlIGNvbG9yIGFuZCBib3JkZXIgd2lkdGggb2YgYSB3aWRnZXQuCi1PcHRpb25zIGNhbiBiZSBzZXQgaW4gdGhyZWUgd2F5czoKLQotXGJlZ2lue2Rlc2NyaXB0aW9ufQotXGl0ZW1bQXQgb2JqZWN0IGNyZWF0aW9uIHRpbWUsIHVzaW5nIGtleXdvcmQgYXJndW1lbnRzXToKLVxiZWdpbnt2ZXJiYXRpbX0KLWZyZWQgPSBCdXR0b24oc2VsZiwgZmcgPSAicmVkIiwgYmcgPSAiYmx1ZSIpCi1cZW5ke3ZlcmJhdGltfQotXGl0ZW1bQWZ0ZXIgb2JqZWN0IGNyZWF0aW9uLCB0cmVhdGluZyB0aGUgb3B0aW9uIG5hbWUgbGlrZSBhIGRpY3Rpb25hcnkgaW5kZXhdOgotXGJlZ2lue3ZlcmJhdGltfQotZnJlZFsiZmciXSA9ICJyZWQiCi1mcmVkWyJiZyJdID0gImJsdWUiCi1cZW5ke3ZlcmJhdGltfQotXGl0ZW1bVXNlIHRoZSBjb25maWcoKSBtZXRob2QgdG8gdXBkYXRlIG11bHRpcGxlIGF0dHJzIHN1YnNlcXVlbnQgdG8KLW9iamVjdCBjcmVhdGlvbl06Ci1cYmVnaW57dmVyYmF0aW19Ci1mcmVkLmNvbmZpZyhmZyA9ICJyZWQiLCBiZyA9ICJibHVlIikKLVxlbmR7dmVyYmF0aW19Ci1cZW5ke2Rlc2NyaXB0aW9ufQotCi1Gb3IgYSBjb21wbGV0ZSBleHBsYW5hdGlvbiBvZiBhIGdpdmVuIG9wdGlvbiBhbmQgaXRzIGJlaGF2aW9yLCBzZWUgdGhlCi1UayBtYW4gcGFnZXMgZm9yIHRoZSB3aWRnZXQgaW4gcXVlc3Rpb24uCi0KLU5vdGUgdGhhdCB0aGUgbWFuIHBhZ2VzIGxpc3QgIlNUQU5EQVJEIE9QVElPTlMiIGFuZCAiV0lER0VUIFNQRUNJRklDCi1PUFRJT05TIiBmb3IgZWFjaCB3aWRnZXQuICBUaGUgZm9ybWVyIGlzIGEgbGlzdCBvZiBvcHRpb25zIHRoYXQgYXJlCi1jb21tb24gdG8gbWFueSB3aWRnZXRzLCB0aGUgbGF0dGVyIGFyZSB0aGUgb3B0aW9ucyB0aGF0IGFyZQotaWRpb3N5bmNyYXRpYyB0byB0aGF0IHBhcnRpY3VsYXIgd2lkZ2V0LiAgVGhlIFN0YW5kYXJkIE9wdGlvbnMgYXJlCi1kb2N1bWVudGVkIG9uIHRoZSBcbWFucGFnZXtvcHRpb25zfXszfSBtYW4gcGFnZS4KLQotTm8gZGlzdGluY3Rpb24gYmV0d2VlbiBzdGFuZGFyZCBhbmQgd2lkZ2V0LXNwZWNpZmljIG9wdGlvbnMgaXMgbWFkZSBpbgotdGhpcyBkb2N1bWVudC4gIFNvbWUgb3B0aW9ucyBkb24ndCBhcHBseSB0byBzb21lIGtpbmRzIG9mIHdpZGdldHMuCi1XaGV0aGVyIGEgZ2l2ZW4gd2lkZ2V0IHJlc3BvbmRzIHRvIGEgcGFydGljdWxhciBvcHRpb24gZGVwZW5kcyBvbiB0aGUKLWNsYXNzIG9mIHRoZSB3aWRnZXQ7IGJ1dHRvbnMgaGF2ZSBhIFxjb2Rle2NvbW1hbmR9IG9wdGlvbiwgbGFiZWxzIGRvIG5vdC4gCi0KLVRoZSBvcHRpb25zIHN1cHBvcnRlZCBieSBhIGdpdmVuIHdpZGdldCBhcmUgbGlzdGVkIGluIHRoYXQgd2lkZ2V0J3MKLW1hbiBwYWdlLCBvciBjYW4gYmUgcXVlcmllZCBhdCBydW50aW1lIGJ5IGNhbGxpbmcgdGhlCi1cbWV0aG9ke2NvbmZpZygpfSBtZXRob2Qgd2l0aG91dCBhcmd1bWVudHMsIG9yIGJ5IGNhbGxpbmcgdGhlCi1cbWV0aG9ke2tleXMoKX0gbWV0aG9kIG9uIHRoYXQgd2lkZ2V0LiAgVGhlIHJldHVybiB2YWx1ZSBvZiB0aGVzZQotY2FsbHMgaXMgYSBkaWN0aW9uYXJ5IHdob3NlIGtleSBpcyB0aGUgbmFtZSBvZiB0aGUgb3B0aW9uIGFzIGEgc3RyaW5nCi0oZm9yIGV4YW1wbGUsIFxjb2RleydyZWxpZWYnfSkgYW5kIHdob3NlIHZhbHVlcyBhcmUgNS10dXBsZXMuCi0KLVNvbWUgb3B0aW9ucywgbGlrZSBcY29kZXtiZ30gYXJlIHN5bm9ueW1zIGZvciBjb21tb24gb3B0aW9ucyB3aXRoIGxvbmcKLW5hbWVzIChcY29kZXtiZ30gaXMgc2hvcnRoYW5kIGZvciAiYmFja2dyb3VuZCIpLiBQYXNzaW5nIHRoZQotXGNvZGV7Y29uZmlnKCl9IG1ldGhvZCB0aGUgbmFtZSBvZiBhIHNob3J0aGFuZCBvcHRpb24gd2lsbCByZXR1cm4gYQotMi10dXBsZSwgbm90IDUtdHVwbGUuIFRoZSAyLXR1cGxlIHBhc3NlZCBiYWNrIHdpbGwgY29udGFpbiB0aGUgbmFtZSBvZgotdGhlIHN5bm9ueW0gYW5kIHRoZSBgYHJlYWwnJyBvcHRpb24gKHN1Y2ggYXMgXGNvZGV7KCdiZycsCi0nYmFja2dyb3VuZCcpfSkuCi0KLVxiZWdpbnt0YWJsZWlpaX17Y3xsfGx9e3RleHRybX17SW5kZXh9e01lYW5pbmd9e0V4YW1wbGV9Ci0gIFxsaW5laWlpezB9e29wdGlvbiBuYW1lfSAgICAgICAgICAgICAgICAgICAgICAge1xjb2RleydyZWxpZWYnfX0KLSAgXGxpbmVpaWl7MX17b3B0aW9uIG5hbWUgZm9yIGRhdGFiYXNlIGxvb2t1cH0gICB7XGNvZGV7J3JlbGllZid9fQotICBcbGluZWlpaXsyfXtvcHRpb24gY2xhc3MgZm9yIGRhdGFiYXNlIGxvb2t1cH0gIHtcY29kZXsnUmVsaWVmJ319Ci0gIFxsaW5laWlpezN9e2RlZmF1bHQgdmFsdWV9ICAgICAgICAgICAgICAgICAgICAge1xjb2RleydyYWlzZWQnfX0KLSAgXGxpbmVpaWl7NH17Y3VycmVudCB2YWx1ZX0gICAgICAgICAgICAgICAgICAgICB7XGNvZGV7J2dyb292ZSd9fQotXGVuZHt0YWJsZWlpaX0KLQotCi1FeGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gcHJpbnQgZnJlZC5jb25maWcoKQoteydyZWxpZWYnIDogKCdyZWxpZWYnLCAncmVsaWVmJywgJ1JlbGllZicsICdyYWlzZWQnLCAnZ3Jvb3ZlJyl9Ci1cZW5ke3ZlcmJhdGltfQotCi1PZiBjb3Vyc2UsIHRoZSBkaWN0aW9uYXJ5IHByaW50ZWQgd2lsbCBpbmNsdWRlIGFsbCB0aGUgb3B0aW9ucwotYXZhaWxhYmxlIGFuZCB0aGVpciB2YWx1ZXMuICBUaGlzIGlzIG1lYW50IG9ubHkgYXMgYW4gZXhhbXBsZS4KLQotCi1cc3Vic3Vic2VjdGlvbntUaGUgUGFja2VyfSAlIFBhY2tlci5odG1sCi1caW5kZXh7cGFja2luZyAod2lkZ2V0cyl9Ci0KLVRoZSBwYWNrZXIgaXMgb25lIG9mIFRrJ3MgZ2VvbWV0cnktbWFuYWdlbWVudCBtZWNoYW5pc21zLiAgCi0lIFNlZSBhbHNvIFxjaXRldGl0bGVbY2xhc3Nlcy9DbGFzc1BhY2tlci5odG1sXXt0aGUgUGFja2VyIGNsYXNzIGludGVyZmFjZX0uCi0KLUdlb21ldHJ5IG1hbmFnZXJzIGFyZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHJlbGF0aXZlIHBvc2l0aW9uaW5nIG9mIHRoZQotcG9zaXRpb25pbmcgb2Ygd2lkZ2V0cyB3aXRoaW4gdGhlaXIgY29udGFpbmVyIC0gdGhlaXIgbXV0dWFsCi1cZW1waHttYXN0ZXJ9LiAgSW4gY29udHJhc3QgdG8gdGhlIG1vcmUgY3VtYmVyc29tZSBcZW1waHtwbGFjZXJ9Ci0od2hpY2ggaXMgdXNlZCBsZXNzIGNvbW1vbmx5LCBhbmQgd2UgZG8gbm90IGNvdmVyIGhlcmUpLCB0aGUgcGFja2VyCi10YWtlcyBxdWFsaXRhdGl2ZSByZWxhdGlvbnNoaXAgc3BlY2lmaWNhdGlvbiAtIFxlbXBoe2Fib3ZlfSwgXGVtcGh7dG8KLXRoZSBsZWZ0IG9mfSwgXGVtcGh7ZmlsbGluZ30sIGV0YyAtIGFuZCB3b3JrcyBldmVyeXRoaW5nIG91dCB0bwotZGV0ZXJtaW5lIHRoZSBleGFjdCBwbGFjZW1lbnQgY29vcmRpbmF0ZXMgZm9yIHlvdS4gCi0KLVRoZSBzaXplIG9mIGFueSBcZW1waHttYXN0ZXJ9IHdpZGdldCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBzaXplIG9mCi10aGUgInNsYXZlIHdpZGdldHMiIGluc2lkZS4gIFRoZSBwYWNrZXIgaXMgdXNlZCB0byBjb250cm9sIHdoZXJlIHNsYXZlCi13aWRnZXRzIGFwcGVhciBpbnNpZGUgdGhlIG1hc3RlciBpbnRvIHdoaWNoIHRoZXkgYXJlIHBhY2tlZC4gIFlvdSBjYW4KLXBhY2sgd2lkZ2V0cyBpbnRvIGZyYW1lcywgYW5kIGZyYW1lcyBpbnRvIG90aGVyIGZyYW1lcywgaW4gb3JkZXIgdG8KLWFjaGlldmUgdGhlIGtpbmQgb2YgbGF5b3V0IHlvdSBkZXNpcmUuICBBZGRpdGlvbmFsbHksIHRoZSBhcnJhbmdlbWVudAotaXMgZHluYW1pY2FsbHkgYWRqdXN0ZWQgdG8gYWNjb21tb2RhdGUgaW5jcmVtZW50YWwgY2hhbmdlcyB0byB0aGUKLWNvbmZpZ3VyYXRpb24sIG9uY2UgaXQgaXMgcGFja2VkLgotCi1Ob3RlIHRoYXQgd2lkZ2V0cyBkbyBub3QgYXBwZWFyIHVudGlsIHRoZXkgaGF2ZSBoYWQgdGhlaXIgZ2VvbWV0cnkKLXNwZWNpZmllZCB3aXRoIGEgZ2VvbWV0cnkgbWFuYWdlci4gIEl0J3MgYSBjb21tb24gZWFybHkgbWlzdGFrZSB0bwotbGVhdmUgb3V0IHRoZSBnZW9tZXRyeSBzcGVjaWZpY2F0aW9uLCBhbmQgdGhlbiBiZSBzdXJwcmlzZWQgd2hlbiB0aGUKLXdpZGdldCBpcyBjcmVhdGVkIGJ1dCBub3RoaW5nIGFwcGVhcnMuICBBIHdpZGdldCB3aWxsIGFwcGVhciBvbmx5Ci1hZnRlciBpdCBoYXMgaGFkLCBmb3IgZXhhbXBsZSwgdGhlIHBhY2tlcidzIFxtZXRob2R7cGFjaygpfSBtZXRob2QKLWFwcGxpZWQgdG8gaXQuCi0KLVRoZSBwYWNrKCkgbWV0aG9kIGNhbiBiZSBjYWxsZWQgd2l0aCBrZXl3b3JkLW9wdGlvbi92YWx1ZSBwYWlycyB0aGF0Ci1jb250cm9sIHdoZXJlIHRoZSB3aWRnZXQgaXMgdG8gYXBwZWFyIHdpdGhpbiBpdHMgY29udGFpbmVyLCBhbmQgaG93IGl0Ci1pcyB0byBiZWhhdmUgd2hlbiB0aGUgbWFpbiBhcHBsaWNhdGlvbiB3aW5kb3cgaXMgcmVzaXplZC4gIEhlcmUgYXJlCi1zb21lIGV4YW1wbGVzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgZnJlZC5wYWNrKCkgICAgICAgICAgICAgICAgICAgICAjIGRlZmF1bHRzIHRvIHNpZGUgPSAidG9wIgotICAgIGZyZWQucGFjayhzaWRlID0gImxlZnQiKQotICAgIGZyZWQucGFjayhleHBhbmQgPSAxKQotXGVuZHt2ZXJiYXRpbX0KLQotCi1cc3Vic3Vic2VjdGlvbntQYWNrZXIgT3B0aW9uc30KLQotRm9yIG1vcmUgZXh0ZW5zaXZlIGluZm9ybWF0aW9uIG9uIHRoZSBwYWNrZXIgYW5kIHRoZSBvcHRpb25zIHRoYXQgaXQKLWNhbiB0YWtlLCBzZWUgdGhlIG1hbiBwYWdlcyBhbmQgcGFnZSAxODMgb2YgSm9obiBPdXN0ZXJob3V0J3MgYm9vay4KLQotXGJlZ2lue2Rlc2NyaXB0aW9ufQotXGl0ZW1bXGJ7YW5jaG9yIH1dCi1BbmNob3IgdHlwZS4gIERlbm90ZXMgd2hlcmUgdGhlIHBhY2tlciBpcyB0byBwbGFjZSBlYWNoIHNsYXZlIGluIGl0cwotcGFyY2VsLgotCi1caXRlbVtcYntleHBhbmR9XQotQm9vbGVhbiwgXGNvZGV7MH0gb3IgXGNvZGV7MX0uCi0KLVxpdGVtW1xie2ZpbGx9XQotTGVnYWwgdmFsdWVzOiBcY29kZXsneCd9LCBcY29kZXsneSd9LCBcY29kZXsnYm90aCd9LCBcY29kZXsnbm9uZSd9LgotCi1caXRlbVtcYntpcGFkeH0gYW5kIFxie2lwYWR5fV0KLUEgZGlzdGFuY2UgLSBkZXNpZ25hdGluZyBpbnRlcm5hbCBwYWRkaW5nIG9uIGVhY2ggc2lkZSBvZiB0aGUgc2xhdmUKLXdpZGdldC4KLQotXGl0ZW1bXGJ7cGFkeH0gYW5kIFxie3BhZHl9XQotQSBkaXN0YW5jZSAtIGRlc2lnbmF0aW5nIGV4dGVybmFsIHBhZGRpbmcgb24gZWFjaCBzaWRlIG9mIHRoZSBzbGF2ZQotd2lkZ2V0LgotCi1caXRlbVtcYntzaWRlfV0KLUxlZ2FsIHZhbHVlcyBhcmU6IFxjb2RleydsZWZ0J30sIFxjb2RleydyaWdodCd9LCBcY29kZXsndG9wJ30sCi1cY29kZXsnYm90dG9tJ30uCi1cZW5ke2Rlc2NyaXB0aW9ufQotCi0KLVxzdWJzdWJzZWN0aW9ue0NvdXBsaW5nIFdpZGdldCBWYXJpYWJsZXN9ICUgVmFyQ291cGxpbmdzLmh0bWwKLQotVGhlIGN1cnJlbnQtdmFsdWUgc2V0dGluZyBvZiBzb21lIHdpZGdldHMgKGxpa2UgdGV4dCBlbnRyeSB3aWRnZXRzKQotY2FuIGJlIGNvbm5lY3RlZCBkaXJlY3RseSB0byBhcHBsaWNhdGlvbiB2YXJpYWJsZXMgYnkgdXNpbmcgc3BlY2lhbAotb3B0aW9ucy4gIFRoZXNlIG9wdGlvbnMgYXJlIFxjb2Rle3ZhcmlhYmxlfSwgXGNvZGV7dGV4dHZhcmlhYmxlfSwKLVxjb2Rle29udmFsdWV9LCBcY29kZXtvZmZ2YWx1ZX0sIGFuZCBcY29kZXt2YWx1ZX0uICBUaGlzCi1jb25uZWN0aW9uIHdvcmtzIGJvdGggd2F5czogaWYgdGhlIHZhcmlhYmxlIGNoYW5nZXMgZm9yIGFueSByZWFzb24sCi10aGUgd2lkZ2V0IGl0J3MgY29ubmVjdGVkIHRvIHdpbGwgYmUgdXBkYXRlZCB0byByZWZsZWN0IHRoZSBuZXcgdmFsdWUuIAotCi1VbmZvcnR1bmF0ZWx5LCBpbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBccmVmbW9kdWxle1RraW50ZXJ9IGl0IGlzCi1ub3QgcG9zc2libGUgdG8gaGFuZCBvdmVyIGFuIGFyYml0cmFyeSBQeXRob24gdmFyaWFibGUgdG8gYSB3aWRnZXQKLXRocm91Z2ggYSBcY29kZXt2YXJpYWJsZX0gb3IgXGNvZGV7dGV4dHZhcmlhYmxlfSBvcHRpb24uICBUaGUgb25seQota2luZHMgb2YgdmFyaWFibGVzIGZvciB3aGljaCB0aGlzIHdvcmtzIGFyZSB2YXJpYWJsZXMgdGhhdCBhcmUKLXN1YmNsYXNzZWQgZnJvbSBhIGNsYXNzIGNhbGxlZCBWYXJpYWJsZSwgZGVmaW5lZCBpbiB0aGUKLVxyZWZtb2R1bGV7VGtpbnRlcn0gbW9kdWxlLgotCi1UaGVyZSBhcmUgbWFueSB1c2VmdWwgc3ViY2xhc3NlcyBvZiBWYXJpYWJsZSBhbHJlYWR5IGRlZmluZWQ6Ci1cY2xhc3N7U3RyaW5nVmFyfSwgXGNsYXNze0ludFZhcn0sIFxjbGFzc3tEb3VibGVWYXJ9LCBhbmQKLVxjbGFzc3tCb29sZWFuVmFyfS4gIFRvIHJlYWQgdGhlIGN1cnJlbnQgdmFsdWUgb2Ygc3VjaCBhIHZhcmlhYmxlLAotY2FsbCB0aGUgXG1ldGhvZHtnZXQoKX0gbWV0aG9kIG9uCi1pdCwgYW5kIHRvIGNoYW5nZSBpdHMgdmFsdWUgeW91IGNhbGwgdGhlIFxtZXRob2R7c2V0KCl9IG1ldGhvZC4gIElmCi15b3UgZm9sbG93IHRoaXMgcHJvdG9jb2wsIHRoZSB3aWRnZXQgd2lsbCBhbHdheXMgdHJhY2sgdGhlIHZhbHVlIG9mCi10aGUgdmFyaWFibGUsIHdpdGggbm8gZnVydGhlciBpbnRlcnZlbnRpb24gb24geW91ciBwYXJ0LgotCi1Gb3IgZXhhbXBsZTogCi1cYmVnaW57dmVyYmF0aW19Ci1jbGFzcyBBcHAoRnJhbWUpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSk6Ci0gICAgICAgIEZyYW1lLl9faW5pdF9fKHNlbGYsIG1hc3RlcikKLSAgICAgICAgc2VsZi5wYWNrKCkKLSAgICAgICAgCi0gICAgICAgIHNlbGYuZW50cnl0aGluZ3kgPSBFbnRyeSgpCi0gICAgICAgIHNlbGYuZW50cnl0aGluZ3kucGFjaygpCi0gICAgICAgIAotICAgICAgICAjIGhlcmUgaXMgdGhlIGFwcGxpY2F0aW9uIHZhcmlhYmxlCi0gICAgICAgIHNlbGYuY29udGVudHMgPSBTdHJpbmdWYXIoKQotICAgICAgICAjIHNldCBpdCB0byBzb21lIHZhbHVlCi0gICAgICAgIHNlbGYuY29udGVudHMuc2V0KCJ0aGlzIGlzIGEgdmFyaWFibGUiKQotICAgICAgICAjIHRlbGwgdGhlIGVudHJ5IHdpZGdldCB0byB3YXRjaCB0aGlzIHZhcmlhYmxlCi0gICAgICAgIHNlbGYuZW50cnl0aGluZ3lbInRleHR2YXJpYWJsZSJdID0gc2VsZi5jb250ZW50cwotICAgICAgICAKLSAgICAgICAgIyBhbmQgaGVyZSB3ZSBnZXQgYSBjYWxsYmFjayB3aGVuIHRoZSB1c2VyIGhpdHMgcmV0dXJuLgotICAgICAgICAjIHdlIHdpbGwgaGF2ZSB0aGUgcHJvZ3JhbSBwcmludCBvdXQgdGhlIHZhbHVlIG9mIHRoZQotICAgICAgICAjIGFwcGxpY2F0aW9uIHZhcmlhYmxlIHdoZW4gdGhlIHVzZXIgaGl0cyByZXR1cm4KLSAgICAgICAgc2VsZi5lbnRyeXRoaW5neS5iaW5kKCc8S2V5LVJldHVybj4nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wcmludF9jb250ZW50cykKLQotICAgIGRlZiBwcmludF9jb250ZW50cyhzZWxmLCBldmVudCk6Ci0gICAgICAgIHByaW50ICJoaS4gY29udGVudHMgb2YgZW50cnkgaXMgbm93IC0tLS0+IiwgXAotICAgICAgICAgICAgICBzZWxmLmNvbnRlbnRzLmdldCgpCi1cZW5ke3ZlcmJhdGltfQotCi0KLVxzdWJzdWJzZWN0aW9ue1RoZSBXaW5kb3cgTWFuYWdlcn0gJSBXaW5kb3dNZ3IuaHRtbAotXGluZGV4e3dpbmRvdyBtYW5hZ2VyICh3aWRnZXRzKX0KLQotSW4gVGssIHRoZXJlIGlzIGEgdXRpbGl0eSBjb21tYW5kLCBcY29kZXt3bX0sIGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZQotd2luZG93IG1hbmFnZXIuICBPcHRpb25zIHRvIHRoZSBcY29kZXt3bX0gY29tbWFuZCBhbGxvdyB5b3UgdG8gY29udHJvbAotdGhpbmdzIGxpa2UgdGl0bGVzLCBwbGFjZW1lbnQsIGljb24gYml0bWFwcywgYW5kIHRoZSBsaWtlLiAgSW4KLVxyZWZtb2R1bGV7VGtpbnRlcn0sIHRoZXNlIGNvbW1hbmRzIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBhcyBtZXRob2RzCi1vbiB0aGUgXGNsYXNze1dtfSBjbGFzcy4gIFRvcGxldmVsIHdpZGdldHMgYXJlIHN1YmNsYXNzZWQgZnJvbSB0aGUKLVxjbGFzc3tXbX0gY2xhc3MsIGFuZCBzbyBjYW4gY2FsbCB0aGUgXGNsYXNze1dtfSBtZXRob2RzIGRpcmVjdGx5LgotCi0lU2VlIGFsc28gXGNpdGV0aXRsZVtjbGFzc2VzL0NsYXNzV20uaHRtbF17dGhlIFdtIGNsYXNzIGludGVyZmFjZX0uCi0KLVRvIGdldCBhdCB0aGUgdG9wbGV2ZWwgd2luZG93IHRoYXQgY29udGFpbnMgYSBnaXZlbiB3aWRnZXQsIHlvdSBjYW4KLW9mdGVuIGp1c3QgcmVmZXIgdG8gdGhlIHdpZGdldCdzIG1hc3Rlci4gIE9mIGNvdXJzZSBpZiB0aGUgd2lkZ2V0IGhhcwotYmVlbiBwYWNrZWQgaW5zaWRlIG9mIGEgZnJhbWUsIHRoZSBtYXN0ZXIgd29uJ3QgcmVwcmVzZW50IGEgdG9wbGV2ZWwKLXdpbmRvdy4gIFRvIGdldCBhdCB0aGUgdG9wbGV2ZWwgd2luZG93IHRoYXQgY29udGFpbnMgYW4gYXJiaXRyYXJ5Ci13aWRnZXQsIHlvdSBjYW4gY2FsbCB0aGUgXG1ldGhvZHtfcm9vdCgpfSBtZXRob2QuICBUaGlzCi1tZXRob2QgYmVnaW5zIHdpdGggYW4gdW5kZXJzY29yZSB0byBkZW5vdGUgdGhlIGZhY3QgdGhhdCB0aGlzIGZ1bmN0aW9uCi1pcyBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgYW5kIG5vdCBhbiBpbnRlcmZhY2UgdG8gVGsgZnVuY3Rpb25hbGl0eS4KLQotSGVyZSBhcmUgc29tZSBleGFtcGxlcyBvZiB0eXBpY2FsIHVzYWdlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1mcm9tIFRraW50ZXIgaW1wb3J0ICoKLWNsYXNzIEFwcChGcmFtZSk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lKToKLSAgICAgICAgRnJhbWUuX19pbml0X18oc2VsZiwgbWFzdGVyKQotICAgICAgICBzZWxmLnBhY2soKQotCi0KLSMgY3JlYXRlIHRoZSBhcHBsaWNhdGlvbgotbXlhcHAgPSBBcHAoKQotCi0jCi0jIGhlcmUgYXJlIG1ldGhvZCBjYWxscyB0byB0aGUgd2luZG93IG1hbmFnZXIgY2xhc3MKLSMKLW15YXBwLm1hc3Rlci50aXRsZSgiTXkgRG8tTm90aGluZyBBcHBsaWNhdGlvbiIpCi1teWFwcC5tYXN0ZXIubWF4c2l6ZSgxMDAwLCA0MDApCi0KLSMgc3RhcnQgdGhlIHByb2dyYW0KLW15YXBwLm1haW5sb29wKCkKLVxlbmR7dmVyYmF0aW19Ci0KLQotXHN1YnN1YnNlY3Rpb257VGsgT3B0aW9uIERhdGEgVHlwZXN9ICUgT3B0aW9uVHlwZXMuaHRtbAotCi1caW5kZXh7VGsgT3B0aW9uIERhdGEgVHlwZXN9Ci0KLVxiZWdpbntkZXNjcmlwdGlvbn0KLVxpdGVtW2FuY2hvcl0KLUxlZ2FsIHZhbHVlcyBhcmUgcG9pbnRzIG9mIHRoZSBjb21wYXNzOiBcY29kZXsibiJ9LAotXGNvZGV7Im5lIn0sIFxjb2RleyJlIn0sIFxjb2RleyJzZSJ9LCBcY29kZXsicyJ9LAotXGNvZGV7InN3In0sIFxjb2RleyJ3In0sIFxjb2RleyJudyJ9LCBhbmQgYWxzbwotXGNvZGV7ImNlbnRlciJ9LgotCi1caXRlbVtiaXRtYXBdCi1UaGVyZSBhcmUgZWlnaHQgYnVpbHQtaW4sIG5hbWVkIGJpdG1hcHM6IFxjb2RleydlcnJvcid9LCBcY29kZXsnZ3JheTI1J30sCi1cY29kZXsnZ3JheTUwJ30sIFxjb2Rleydob3VyZ2xhc3MnfSwgXGNvZGV7J2luZm8nfSwgXGNvZGV7J3F1ZXN0aGVhZCd9LAotXGNvZGV7J3F1ZXN0aW9uJ30sIFxjb2Rleyd3YXJuaW5nJ30uICBUbyBzcGVjaWZ5IGFuIFggYml0bWFwCi1maWxlbmFtZSwgZ2l2ZSB0aGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlLCBwcmVjZWRlZCB3aXRoIGFuIFxjb2Rle0B9LAotYXMgaW4gXGNvZGV7IkAvdXNyL2NvbnRyaWIvYml0bWFwL2d1bWJ5LmJpdCJ9LgotCi1caXRlbVtib29sZWFuXQotWW91IGNhbiBwYXNzIGludGVnZXJzIDAgb3IgMSBvciB0aGUgc3RyaW5ncyBcY29kZXsieWVzIn0gb3IgXGNvZGV7Im5vIn0gLgotCi1caXRlbVtjYWxsYmFja10KLVRoaXMgaXMgYW55IFB5dGhvbiBmdW5jdGlvbiB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cy4gIEZvciBleGFtcGxlOiAKLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICBkZWYgcHJpbnRfaXQoKToKLSAgICAgICAgICAgIHByaW50ICJoaSB0aGVyZSIKLSAgICBmcmVkWyJjb21tYW5kIl0gPSBwcmludF9pdAotXGVuZHt2ZXJiYXRpbX0KLQotXGl0ZW1bY29sb3JdCi1Db2xvcnMgY2FuIGJlIGdpdmVuIGFzIHRoZSBuYW1lcyBvZiBYIGNvbG9ycyBpbiB0aGUgcmdiLnR4dCBmaWxlLAotb3IgYXMgc3RyaW5ncyByZXByZXNlbnRpbmcgUkdCIHZhbHVlcyBpbiA0IGJpdDogXGNvZGV7IlwjUkdCIn0sIDgKLWJpdDogXGNvZGV7IlwjUlJHR0JCIn0sIDEyIGJpdCIgXGNvZGV7IlwjUlJSR0dHQkJCIn0sIG9yIDE2IGJpdAotXGNvZGV7IlwjUlJSUkdHR0dCQkJCIn0gcmFuZ2VzLCB3aGVyZSBSLEcsQiBoZXJlIHJlcHJlc2VudCBhbnkKLWxlZ2FsIGhleCBkaWdpdC4gIFNlZSBwYWdlIDE2MCBvZiBPdXN0ZXJob3V0J3MgYm9vayBmb3IgZGV0YWlscy4gIAotCi1caXRlbVtjdXJzb3JdCi1UaGUgc3RhbmRhcmQgWCBjdXJzb3IgbmFtZXMgZnJvbSBcZmlsZXtjdXJzb3Jmb250Lmh9IGNhbiBiZSB1c2VkLAotd2l0aG91dCB0aGUgXGNvZGV7WENffSBwcmVmaXguICBGb3IgZXhhbXBsZSB0byBnZXQgYSBoYW5kIGN1cnNvcgotKFxjb25zdGFudHtYQ19oYW5kMn0pLCB1c2UgdGhlIHN0cmluZyBcY29kZXsiaGFuZDIifS4gIFlvdSBjYW4gYWxzbwotc3BlY2lmeSBhIGJpdG1hcCBhbmQgbWFzayBmaWxlIG9mIHlvdXIgb3duLiAgU2VlIHBhZ2UgMTc5IG9mCi1PdXN0ZXJob3V0J3MgYm9vay4KLQotXGl0ZW1bZGlzdGFuY2VdCi1TY3JlZW4gZGlzdGFuY2VzIGNhbiBiZSBzcGVjaWZpZWQgaW4gZWl0aGVyIHBpeGVscyBvciBhYnNvbHV0ZQotZGlzdGFuY2VzLiAgUGl4ZWxzIGFyZSBnaXZlbiBhcyBudW1iZXJzIGFuZCBhYnNvbHV0ZSBkaXN0YW5jZXMgYXMKLXN0cmluZ3MsIHdpdGggdGhlIHRyYWlsaW5nIGNoYXJhY3RlciBkZW5vdGluZyB1bml0czogXGNvZGV7Y30KLWZvciBjZW50aW1ldHJlcywgXGNvZGV7aX0gZm9yIGluY2hlcywgXGNvZGV7bX0gZm9yIG1pbGxpbWV0cmVzLAotXGNvZGV7cH0gZm9yIHByaW50ZXIncyBwb2ludHMuICBGb3IgZXhhbXBsZSwgMy41IGluY2hlcyBpcyBleHByZXNzZWQKLWFzIFxjb2RleyIzLjVpIn0uCi0KLVxpdGVtW2ZvbnRdCi1UayB1c2VzIGEgbGlzdCBmb250IG5hbWUgZm9ybWF0LCBzdWNoIGFzIFxjb2Rle1x7Y291cmllciAxMCBib2xkXH19LgotRm9udCBzaXplcyB3aXRoIHBvc2l0aXZlIG51bWJlcnMgYXJlIG1lYXN1cmVkIGluIHBvaW50czsKLXNpemVzIHdpdGggbmVnYXRpdmUgbnVtYmVycyBhcmUgbWVhc3VyZWQgaW4gcGl4ZWxzLgotCi1caXRlbVtnZW9tZXRyeV0KLVRoaXMgaXMgYSBzdHJpbmcgb2YgdGhlIGZvcm0gXHNhbXB7XHZhcnt3aWR0aH14XHZhcntoZWlnaHR9fSwgd2hlcmUKLXdpZHRoIGFuZCBoZWlnaHQgYXJlIG1lYXN1cmVkIGluIHBpeGVscyBmb3IgbW9zdCB3aWRnZXRzIChpbgotY2hhcmFjdGVycyBmb3Igd2lkZ2V0cyBkaXNwbGF5aW5nIHRleHQpLiAgRm9yIGV4YW1wbGU6Ci1cY29kZXtmcmVkWyJnZW9tZXRyeSJdID0gIjIwMHgxMDAifS4KLQotXGl0ZW1banVzdGlmeV0KLUxlZ2FsIHZhbHVlcyBhcmUgdGhlIHN0cmluZ3M6IFxjb2RleyJsZWZ0In0sCi1cY29kZXsiY2VudGVyIn0sIFxjb2RleyJyaWdodCJ9LCBhbmQgXGNvZGV7ImZpbGwifS4KLQotXGl0ZW1bcmVnaW9uXQotVGhpcyBpcyBhIHN0cmluZyB3aXRoIGZvdXIgc3BhY2UtZGVsaW1pdGVkIGVsZW1lbnRzLCBlYWNoIG9mCi13aGljaCBpcyBhIGxlZ2FsIGRpc3RhbmNlIChzZWUgYWJvdmUpLiAgRm9yIGV4YW1wbGU6IFxjb2RleyIyIDMgNAotNSJ9IGFuZCBcY29kZXsiM2kgMmkgNC41aSAyaSJ9IGFuZCBcY29kZXsiM2MgMmMgNGMgMTAuNDNjIn0gCi1hcmUgYWxsIGxlZ2FsIHJlZ2lvbnMuCi0KLVxpdGVtW3JlbGllZl0KLURldGVybWluZXMgd2hhdCB0aGUgYm9yZGVyIHN0eWxlIG9mIGEgd2lkZ2V0IHdpbGwgYmUuICBMZWdhbAotdmFsdWVzIGFyZTogXGNvZGV7InJhaXNlZCJ9LCBcY29kZXsic3Vua2VuIn0sCi1cY29kZXsiZmxhdCJ9LCBcY29kZXsiZ3Jvb3ZlIn0sIGFuZCBcY29kZXsicmlkZ2UifS4KLQotXGl0ZW1bc2Nyb2xsY29tbWFuZF0KLVRoaXMgaXMgYWxtb3N0IGFsd2F5cyB0aGUgXG1ldGhvZHtzZXQoKX0gbWV0aG9kIG9mIHNvbWUgc2Nyb2xsYmFyCi13aWRnZXQsIGJ1dCBjYW4gYmUgYW55IHdpZGdldCBtZXRob2QgdGhhdCB0YWtlcyBhIHNpbmdsZSBhcmd1bWVudC4gIAotUmVmZXIgdG8gdGhlIGZpbGUgXGZpbGV7RGVtby90a2ludGVyL21hdHQvY2FudmFzLXdpdGgtc2Nyb2xsYmFycy5weX0KLWluIHRoZSBQeXRob24gc291cmNlIGRpc3RyaWJ1dGlvbiBmb3IgYW4gZXhhbXBsZS4KLQotXGl0ZW1bd3JhcDpdCi1NdXN0IGJlIG9uZSBvZjogXGNvZGV7Im5vbmUifSwgXGNvZGV7ImNoYXIifSwgb3IgXGNvZGV7IndvcmQifS4KLVxlbmR7ZGVzY3JpcHRpb259Ci0KLQotXHN1YnN1YnNlY3Rpb257QmluZGluZ3MgYW5kIEV2ZW50c30gJSBCaW5kaW5ncy5odG1sCi0KLVxpbmRleHtiaW5kICh3aWRnZXRzKX0KLVxpbmRleHtldmVudHMgKHdpZGdldHMpfQotCi1UaGUgYmluZCBtZXRob2QgZnJvbSB0aGUgd2lkZ2V0IGNvbW1hbmQgYWxsb3dzIHlvdSB0byB3YXRjaCBmb3IKLWNlcnRhaW4gZXZlbnRzIGFuZCB0byBoYXZlIGEgY2FsbGJhY2sgZnVuY3Rpb24gdHJpZ2dlciB3aGVuIHRoYXQgZXZlbnQKLXR5cGUgb2NjdXJzLiAgVGhlIGZvcm0gb2YgdGhlIGJpbmQgbWV0aG9kIGlzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgZGVmIGJpbmQoc2VsZiwgc2VxdWVuY2UsIGZ1bmMsIGFkZD0nJyk6Ci1cZW5ke3ZlcmJhdGltfQotd2hlcmU6Ci0KLVxiZWdpbntkZXNjcmlwdGlvbn0KLVxpdGVtW3NlcXVlbmNlXQotaXMgYSBzdHJpbmcgdGhhdCBkZW5vdGVzIHRoZSB0YXJnZXQga2luZCBvZiBldmVudC4gIChTZWUgdGhlIGJpbmQKLW1hbiBwYWdlIGFuZCBwYWdlIDIwMSBvZiBKb2huIE91c3RlcmhvdXQncyBib29rIGZvciBkZXRhaWxzKS4KLQotXGl0ZW1bZnVuY10KLWlzIGEgUHl0aG9uIGZ1bmN0aW9uLCB0YWtpbmcgb25lIGFyZ3VtZW50LCB0byBiZSBpbnZva2VkIHdoZW4gdGhlCi1ldmVudCBvY2N1cnMuICBBbiBFdmVudCBpbnN0YW5jZSB3aWxsIGJlIHBhc3NlZCBhcyB0aGUgYXJndW1lbnQuCi0oRnVuY3Rpb25zIGRlcGxveWVkIHRoaXMgd2F5IGFyZSBjb21tb25seSBrbm93biBhcyBcdmFye2NhbGxiYWNrc30uKQotCi1caXRlbVthZGRdCi1pcyBvcHRpb25hbCwgZWl0aGVyIFxzYW1we30gb3IgXHNhbXB7K30uICBQYXNzaW5nIGFuIGVtcHR5IHN0cmluZwotZGVub3RlcyB0aGF0IHRoaXMgYmluZGluZyBpcyB0byByZXBsYWNlIGFueSBvdGhlciBiaW5kaW5ncyB0aGF0IHRoaXMKLWV2ZW50IGlzIGFzc29jaWF0ZWQgd2l0aC4gIFByZWNlZWRpbmcgd2l0aCBhIFxzYW1weyt9IG1lYW5zIHRoYXQgdGhpcwotZnVuY3Rpb24gaXMgdG8gYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgZnVuY3Rpb25zIGJvdW5kIHRvIHRoaXMgZXZlbnQgdHlwZS4KLVxlbmR7ZGVzY3JpcHRpb259Ci0KLUZvciBleGFtcGxlOgotXGJlZ2lue3ZlcmJhdGltfQotICAgIGRlZiB0dXJuUmVkKHNlbGYsIGV2ZW50KToKLSAgICAgICAgZXZlbnQud2lkZ2V0WyJhY3RpdmVmb3JlZ3JvdW5kIl0gPSAicmVkIgotCi0gICAgc2VsZi5idXR0b24uYmluZCgiPEVudGVyPiIsIHNlbGYudHVyblJlZCkKLVxlbmR7dmVyYmF0aW19Ci0KLU5vdGljZSBob3cgdGhlIHdpZGdldCBmaWVsZCBvZiB0aGUgZXZlbnQgaXMgYmVpbmcgYWNjZXNzZWQgaW4gdGhlCi1cbWV0aG9ke3R1cm5SZWQoKX0gY2FsbGJhY2suICBUaGlzIGZpZWxkIGNvbnRhaW5zIHRoZSB3aWRnZXQgdGhhdAotY2F1Z2h0IHRoZSBYIGV2ZW50LiAgVGhlIGZvbGxvd2luZyB0YWJsZSBsaXN0cyB0aGUgb3RoZXIgZXZlbnQgZmllbGRzCi15b3UgY2FuIGFjY2VzcywgYW5kIGhvdyB0aGV5IGFyZSBkZW5vdGVkIGluIFRrLCB3aGljaCBjYW4gYmUgdXNlZnVsCi13aGVuIHJlZmVycmluZyB0byB0aGUgVGsgbWFuIHBhZ2VzLgotCi1cYmVnaW57dmVyYmF0aW19Ci1UayAgICAgIFRraW50ZXIgRXZlbnQgRmllbGQgICAgICAgICAgICAgVGsgICAgICBUa2ludGVyIEV2ZW50IEZpZWxkIAotLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgIC0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLQotJWYgICAgICBmb2N1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICVBICAgICAgY2hhcgotJWggICAgICBoZWlnaHQgICAgICAgICAgICAgICAgICAgICAgICAgICVFICAgICAgc2VuZF9ldmVudAotJWsgICAgICBrZXljb2RlICAgICAgICAgICAgICAgICAgICAgICAgICVLICAgICAga2V5c3ltCi0lcyAgICAgIHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgJU4gICAgICBrZXlzeW1fbnVtCi0ldCAgICAgIHRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVQgICAgICB0eXBlCi0ldyAgICAgIHdpZHRoICAgICAgICAgICAgICAgICAgICAgICAgICAgJVcgICAgICB3aWRnZXQKLSV4ICAgICAgeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlWCAgICAgIHhfcm9vdAotJXkgICAgICB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVZICAgICAgeV9yb290Ci1cZW5ke3ZlcmJhdGltfQotCi0KLVxzdWJzdWJzZWN0aW9ue1RoZSBpbmRleCBQYXJhbWV0ZXJ9ICUgSW5kZXguaHRtbAotCi1BIG51bWJlciBvZiB3aWRnZXRzIHJlcXVpcmVgYGluZGV4JycgcGFyYW1ldGVycyB0byBiZSBwYXNzZWQuICBUaGVzZQotYXJlIHVzZWQgdG8gcG9pbnQgYXQgYSBzcGVjaWZpYyBwbGFjZSBpbiBhIFRleHQgd2lkZ2V0LCBvciB0bwotcGFydGljdWxhciBjaGFyYWN0ZXJzIGluIGFuIEVudHJ5IHdpZGdldCwgb3IgdG8gcGFydGljdWxhciBtZW51IGl0ZW1zCi1pbiBhIE1lbnUgd2lkZ2V0LgotCi1cYmVnaW57ZGVzY3JpcHRpb259Ci1caXRlbVtcYntFbnRyeSB3aWRnZXQgaW5kZXhlcyAoaW5kZXgsIHZpZXcgaW5kZXgsIGV0Yy4pfV0KLUVudHJ5IHdpZGdldHMgaGF2ZSBvcHRpb25zIHRoYXQgcmVmZXIgdG8gY2hhcmFjdGVyIHBvc2l0aW9ucyBpbiB0aGUKLXRleHQgYmVpbmcgZGlzcGxheWVkLiAgWW91IGNhbiB1c2UgdGhlc2UgXHJlZm1vZHVsZXtUa2ludGVyfSBmdW5jdGlvbnMKLXRvIGFjY2VzcyB0aGVzZSBzcGVjaWFsIHBvaW50cyBpbiB0ZXh0IHdpZGdldHM6Ci0KLVxiZWdpbntkZXNjcmlwdGlvbn0KLVxpdGVtW0F0RW5kKCldCi1yZWZlcnMgdG8gdGhlIGxhc3QgcG9zaXRpb24gaW4gdGhlIHRleHQKLQotXGl0ZW1bQXRJbnNlcnQoKV0KLXJlZmVycyB0byB0aGUgcG9pbnQgd2hlcmUgdGhlIHRleHQgY3Vyc29yIGlzCi0KLVxpdGVtW0F0U2VsRmlyc3QoKV0KLWluZGljYXRlcyB0aGUgYmVnaW5uaW5nIHBvaW50IG9mIHRoZSBzZWxlY3RlZCB0ZXh0Ci0KLVxpdGVtW0F0U2VsTGFzdCgpXQotZGVub3RlcyB0aGUgbGFzdCBwb2ludCBvZiB0aGUgc2VsZWN0ZWQgdGV4dCBhbmQgZmluYWxseQotCi1caXRlbVtBdCh4XG9wdGlvbmFseywgeX0pXQotcmVmZXJzIHRvIHRoZSBjaGFyYWN0ZXIgYXQgcGl4ZWwgbG9jYXRpb24gXHZhcnt4fSwgXHZhcnt5fSAod2l0aAotXHZhcnt5fSBub3QgdXNlZCBpbiB0aGUgY2FzZSBvZiBhIHRleHQgZW50cnkgd2lkZ2V0LCB3aGljaCBjb250YWlucyBhCi1zaW5nbGUgbGluZSBvZiB0ZXh0KS4KLVxlbmR7ZGVzY3JpcHRpb259Ci0KLVxpdGVtW1xie1RleHQgd2lkZ2V0IGluZGV4ZXN9XQotVGhlIGluZGV4IG5vdGF0aW9uIGZvciBUZXh0IHdpZGdldHMgaXMgdmVyeSByaWNoIGFuZCBpcyBiZXN0IGRlc2NyaWJlZAotaW4gdGhlIFRrIG1hbiBwYWdlcy4KLQotXGl0ZW1bXGJ7TWVudSBpbmRleGVzIChtZW51Lmludm9rZSgpLCBtZW51LmVudHJ5Y29uZmlnKCksIGV0Yy4pfV0KLQotU29tZSBvcHRpb25zIGFuZCBtZXRob2RzIGZvciBtZW51cyBtYW5pcHVsYXRlIHNwZWNpZmljIG1lbnUgZW50cmllcy4KLUFueXRpbWUgYSBtZW51IGluZGV4IGlzIG5lZWRlZCBmb3IgYW4gb3B0aW9uIG9yIGEgcGFyYW1ldGVyLCB5b3UgbWF5Ci1wYXNzIGluOiAKLVxiZWdpbntpdGVtaXplfQotXGl0ZW0gICBhbiBpbnRlZ2VyIHdoaWNoIHJlZmVycyB0byB0aGUgbnVtZXJpYyBwb3NpdGlvbiBvZiB0aGUgZW50cnkgaW4KLXRoZSB3aWRnZXQsIGNvdW50ZWQgZnJvbSB0aGUgdG9wLCBzdGFydGluZyB3aXRoIDA7IAotXGl0ZW0gICB0aGUgc3RyaW5nIFxjb2RleydhY3RpdmUnfSwgd2hpY2ggcmVmZXJzIHRvIHRoZSBtZW51IHBvc2l0aW9uIHRoYXQgaXMKLWN1cnJlbnRseSB1bmRlciB0aGUgY3Vyc29yOwotXGl0ZW0gICB0aGUgc3RyaW5nIFxjb2RleyJsYXN0In0gd2hpY2ggcmVmZXJzIHRvIHRoZSBsYXN0IG1lbnUKLWl0ZW07ICAKLVxpdGVtICAgQW4gaW50ZWdlciBwcmVjZWRlZCBieSBcY29kZXtAfSwgYXMgaW4gXGNvZGV7QDZ9LCB3aGVyZSB0aGUgaW50ZWdlciBpcwotaW50ZXJwcmV0ZWQgYXMgYSB5IHBpeGVsIGNvb3JkaW5hdGUgaW4gdGhlIG1lbnUncyBjb29yZGluYXRlIHN5c3RlbTsKLVxpdGVtICAgdGhlIHN0cmluZyBcY29kZXsibm9uZSJ9LCB3aGljaCBpbmRpY2F0ZXMgbm8gbWVudSBlbnRyeSBhdCBhbGwsIG1vc3QKLW9mdGVuIHVzZWQgd2l0aCBtZW51LmFjdGl2YXRlKCkgdG8gZGVhY3RpdmF0ZSBhbGwgZW50cmllcywgYW5kCi1maW5hbGx5LAotXGl0ZW0gICBhIHRleHQgc3RyaW5nIHRoYXQgaXMgcGF0dGVybiBtYXRjaGVkIGFnYWluc3QgdGhlIGxhYmVsIG9mIHRoZQotbWVudSBlbnRyeSwgYXMgc2Nhbm5lZCBmcm9tIHRoZSB0b3Agb2YgdGhlIG1lbnUgdG8gdGhlIGJvdHRvbS4gIE5vdGUKLXRoYXQgdGhpcyBpbmRleCB0eXBlIGlzIGNvbnNpZGVyZWQgYWZ0ZXIgYWxsIHRoZSBvdGhlcnMsIHdoaWNoIG1lYW5zCi10aGF0IG1hdGNoZXMgZm9yIG1lbnUgaXRlbXMgbGFiZWxsZWQgXGNvZGV7bGFzdH0sIFxjb2Rle2FjdGl2ZX0sIG9yCi1cY29kZXtub25lfSBtYXkgYmUgaW50ZXJwcmV0ZWQgYXMgdGhlIGFib3ZlIGxpdGVyYWxzLCBpbnN0ZWFkLgotXGVuZHtpdGVtaXplfQotXGVuZHtkZXNjcmlwdGlvbn0KLQotXHN1YnN1YnNlY3Rpb257SW1hZ2VzfQotCi1CaXRtYXAvUGl4ZWxtYXAgaW1hZ2VzIGNhbiBiZSBjcmVhdGVkIHRocm91Z2ggdGhlIHN1YmNsYXNzZXMgb2YKLVxjbGFzc3tUa2ludGVyLkltYWdlfToKLQotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSAgXGNsYXNze0JpdG1hcEltYWdlfSBjYW4gYmUgdXNlZCBmb3IgWDExIGJpdG1hcCBkYXRhLgotXGl0ZW0gIFxjbGFzc3tQaG90b0ltYWdlfSBjYW4gYmUgdXNlZCBmb3IgR0lGIGFuZCBQUE0vUEdNIGNvbG9yIGJpdG1hcHMuCi1cZW5ke2l0ZW1pemV9Ci0KLUVpdGhlciB0eXBlIG9mIGltYWdlIGlzIGNyZWF0ZWQgdGhyb3VnaCBlaXRoZXIgdGhlIFxjb2Rle2ZpbGV9IG9yIHRoZQotXGNvZGV7ZGF0YX0gb3B0aW9uIChvdGhlciBvcHRpb25zIGFyZSBhdmFpbGFibGUgYXMgd2VsbCkuCi0KLVRoZSBpbWFnZSBvYmplY3QgY2FuIHRoZW4gYmUgdXNlZCB3aGVyZXZlciBhbiBcY29kZXtpbWFnZX0gb3B0aW9uIGlzCi1zdXBwb3J0ZWQgYnkgc29tZSB3aWRnZXQgKGUuZy4gbGFiZWxzLCBidXR0b25zLCBtZW51cykuIEluIHRoZXNlCi1jYXNlcywgVGsgd2lsbCBub3Qga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgaW1hZ2UuIFdoZW4gdGhlIGxhc3QgUHl0aG9uCi1yZWZlcmVuY2UgdG8gdGhlIGltYWdlIG9iamVjdCBpcyBkZWxldGVkLCB0aGUgaW1hZ2UgZGF0YSBpcyBkZWxldGVkIGFzCi13ZWxsLCBhbmQgVGsgd2lsbCBkaXNwbGF5IGFuIGVtcHR5IGJveCB3aGVyZXZlciB0aGUgaW1hZ2Ugd2FzIHVzZWQuCi0KLVxzZWN0aW9ue1xtb2R1bGV7VGl4fSAtLS0KLSAgICAgICAgIEV4dGVuc2lvbiB3aWRnZXRzIGZvciBUa30KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e1RpeH0KLVxtb2R1bGVzeW5vcHNpc3tUayBFeHRlbnNpb24gV2lkZ2V0cyBmb3IgVGtpbnRlcn0KLVxzZWN0aW9uYXV0aG9ye01pa2UgQ2xhcmtzb259e21pa2VjbGFya3NvbkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXR9Ci0KLVxpbmRleHtUaXh9Ci0KLVRoZSBcbW9kdWxle1RpeH0gKFRrIEludGVyZmFjZSBFeHRlbnNpb24pIG1vZHVsZSBwcm92aWRlcyBhbgotYWRkaXRpb25hbCByaWNoIHNldCBvZiB3aWRnZXRzLiBBbHRob3VnaCB0aGUgc3RhbmRhcmQgVGsgbGlicmFyeSBoYXMKLW1hbnkgdXNlZnVsIHdpZGdldHMsIHRoZXkgYXJlIGZhciBmcm9tIGNvbXBsZXRlLiBUaGUgXG1vZHVsZXtUaXh9Ci1saWJyYXJ5IHByb3ZpZGVzIG1vc3Qgb2YgdGhlIGNvbW1vbmx5IG5lZWRlZCB3aWRnZXRzIHRoYXQgYXJlIG1pc3NpbmcKLWZyb20gc3RhbmRhcmQgVGs6IFxjbGFzc3tITGlzdH0sIFxjbGFzc3tDb21ib0JveH0sIFxjbGFzc3tDb250cm9sfQotKGEuay5hLiBTcGluQm94KSBhbmQgYW4gYXNzb3J0bWVudCBvZiBzY3JvbGxhYmxlIHdpZGdldHMuIFxtb2R1bGV7VGl4fQotYWxzbyBpbmNsdWRlcyBtYW55IG1vcmUgd2lkZ2V0cyB0aGF0IGFyZSBnZW5lcmFsbHkgdXNlZnVsIGluIGEgd2lkZQotcmFuZ2Ugb2YgYXBwbGljYXRpb25zOiBcY2xhc3N7Tm90ZUJvb2t9LCBcY2xhc3N7RmlsZUVudHJ5fSwKLVxjbGFzc3tQYW5lZFdpbmRvd30sIGV0YzsgdGhlcmUgYXJlIG1vcmUgdGhhbiA0MCBvZiB0aGVtLgotCi1XaXRoIGFsbCB0aGVzZSBuZXcgd2lkZ2V0cywgeW91IGNhbiBpbnRyb2R1Y2UgbmV3IGludGVyYWN0aW9uCi10ZWNobmlxdWVzIGludG8gYXBwbGljYXRpb25zLCBjcmVhdGluZyBtb3JlIHVzZWZ1bCBhbmQgbW9yZSBpbnR1aXRpdmUKLXVzZXIgaW50ZXJmYWNlcy4gWW91IGNhbiBkZXNpZ24geW91ciBhcHBsaWNhdGlvbiBieSBjaG9vc2luZyB0aGUgbW9zdAotYXBwcm9wcmlhdGUgd2lkZ2V0cyB0byBtYXRjaCB0aGUgc3BlY2lhbCBuZWVkcyBvZiB5b3VyIGFwcGxpY2F0aW9uIGFuZAotdXNlcnMuIAotCi1cYmVnaW57c2VlYWxzb30KLVxzZWV0aXRsZVtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9dCi0gICAgICAgIHtUaXggSG9tZXBhZ2V9Ci0gICAgICAgIHtUaGUgaG9tZSBwYWdlIGZvciBcbW9kdWxle1RpeH0uICBUaGlzIGluY2x1ZGVzIGxpbmtzIHRvCi0gICAgICAgICBhZGRpdGlvbmFsIGRvY3VtZW50YXRpb24gYW5kIGRvd25sb2Fkcy59Ci1cc2VldGl0bGVbaHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L21hbi9dCi0gICAgICAgIHtUaXggTWFuIFBhZ2VzfQotICAgICAgICB7T24tbGluZSB2ZXJzaW9uIG9mIHRoZSBtYW4gcGFnZXMgYW5kIHJlZmVyZW5jZSBtYXRlcmlhbC59Ci1cc2VldGl0bGVbaHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L2RvY3MvdGl4LWJvb2svdGl4LmJvb2suaHRtbF0KLSAgICAgICAge1RpeCBQcm9ncmFtbWluZyBHdWlkZX0KLSAgICAgICAge09uLWxpbmUgdmVyc2lvbiBvZiB0aGUgcHJvZ3JhbW1lcidzIHJlZmVyZW5jZSBtYXRlcmlhbC59Ci1cc2VldGl0bGVbaHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvVGlkZS9dCi0gICAgICAgIHtUaXggRGV2ZWxvcG1lbnQgQXBwbGljYXRpb25zfQotICAgICAgICB7VGl4IGFwcGxpY2F0aW9ucyBmb3IgZGV2ZWxvcG1lbnQgb2YgVGl4IGFuZCBUa2ludGVyIHByb2dyYW1zLgotICAgICAgICAgVGlkZSBhcHBsaWNhdGlvbnMgd29yayB1bmRlciBUayBvciBUa2ludGVyLCBhbmQgaW5jbHVkZQotICAgICAgICAgXHByb2dyYW17VGl4SW5zcGVjdH0sIGFuIGluc3BlY3RvciB0byByZW1vdGVseSBtb2RpZnkgYW5kCi0gICAgICAgICBkZWJ1ZyBUaXgvVGsvVGtpbnRlciBhcHBsaWNhdGlvbnMufQotXGVuZHtzZWVhbHNvfQotCi0KLVxzdWJzZWN0aW9ue1VzaW5nIFRpeH0KLQotXGJlZ2lue2NsYXNzZGVzY317VGl4fXtzY3JlZW5OYW1lXG9wdGlvbmFseywgYmFzZU5hbWVcb3B0aW9uYWx7LCBjbGFzc05hbWV9fX0KLSAgICBUb3BsZXZlbCB3aWRnZXQgb2YgVGl4IHdoaWNoIHJlcHJlc2VudHMgbW9zdGx5IHRoZSBtYWluIHdpbmRvdwotICAgIG9mIGFuIGFwcGxpY2F0aW9uLiBJdCBoYXMgYW4gYXNzb2NpYXRlZCBUY2wgaW50ZXJwcmV0ZXIuCi0KLUNsYXNzZXMgaW4gdGhlIFxyZWZtb2R1bGV7VGl4fSBtb2R1bGUgc3ViY2xhc3NlcyB0aGUgY2xhc3NlcyBpbiB0aGUKLVxyZWZtb2R1bGV7VGtpbnRlcn0gbW9kdWxlLiBUaGUgZm9ybWVyIGltcG9ydHMgdGhlIGxhdHRlciwgc28gdG8gdXNlCi1ccmVmbW9kdWxle1RpeH0gd2l0aCBUa2ludGVyLCBhbGwgeW91IG5lZWQgdG8gZG8gaXMgdG8gaW1wb3J0IG9uZQotbW9kdWxlLiBJbiBnZW5lcmFsLCB5b3UgY2FuIGp1c3QgaW1wb3J0IFxyZWZtb2R1bGV7VGl4fSwgYW5kIHJlcGxhY2UKLXRoZSB0b3BsZXZlbCBjYWxsIHRvIFxjbGFzc3tUa2ludGVyLlRrfSB3aXRoIFxjbGFzc3tUaXguVGt9OgotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IFRpeAotZnJvbSBUa2NvbnN0YW50cyBpbXBvcnQgKgotcm9vdCA9IFRpeC5UaygpCi1cZW5ke3ZlcmJhdGltfQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVRvIHVzZSBccmVmbW9kdWxle1RpeH0sIHlvdSBtdXN0IGhhdmUgdGhlIFxyZWZtb2R1bGV7VGl4fSB3aWRnZXRzIGluc3RhbGxlZCwKLXVzdWFsbHkgYWxvbmdzaWRlIHlvdXIgaW5zdGFsbGF0aW9uIG9mIHRoZSBUayB3aWRnZXRzLgotVG8gdGVzdCB5b3VyIGluc3RhbGxhdGlvbiwgdHJ5IHRoZSBmb2xsb3dpbmc6Ci1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgVGl4Ci1yb290ID0gVGl4LlRrKCkKLXJvb3QudGsuZXZhbCgncGFja2FnZSByZXF1aXJlIFRpeCcpCi1cZW5ke3ZlcmJhdGltfQotCi1JZiB0aGlzIGZhaWxzLCB5b3UgaGF2ZSBhIFRrIGluc3RhbGxhdGlvbiBwcm9ibGVtIHdoaWNoIG11c3QgYmUKLXJlc29sdmVkIGJlZm9yZSBwcm9jZWVkaW5nLiBVc2UgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFxlbnZ2YXJ7VElYX0xJQlJBUll9Ci10byBwb2ludCB0byB0aGUgaW5zdGFsbGVkIFxyZWZtb2R1bGV7VGl4fSBsaWJyYXJ5IGRpcmVjdG9yeSwgYW5kCi1tYWtlIHN1cmUgeW91IGhhdmUgdGhlIGR5bmFtaWMgb2JqZWN0IGxpYnJhcnkgKFxmaWxle3RpeDgxODMuZGxsfSBvcgotXGZpbGV7bGlidGl4ODE4My5zb30pIGluICB0aGUgc2FtZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB5b3VyIFRrCi1keW5hbWljIG9iamVjdCBsaWJyYXJ5IChcZmlsZXt0azgxODMuZGxsfSBvciBcZmlsZXtsaWJ0azgxODMuc299KS4gVGhlCi1kaXJlY3Rvcnkgd2l0aCB0aGUgZHluYW1pYyBvYmplY3QgbGlicmFyeSBzaG91bGQgYWxzbyBoYXZlIGEgZmlsZQotY2FsbGVkIFxmaWxle3BrZ0luZGV4LnRjbH0gKGNhc2Ugc2Vuc2l0aXZlKSwgd2hpY2ggY29udGFpbnMgdGhlIGxpbmU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXBhY2thZ2UgaWZuZWVkZWQgVGl4IDguMSBbbGlzdCBsb2FkICJbZmlsZSBqb2luICRkaXIgdGl4ODE4My5kbGxdIiBUaXhdCi1cZW5ke3ZlcmJhdGltfSAlICQgPC0tIGJvdyB0byBmb250LWxvY2sKLQotCi1cc3Vic2VjdGlvbntUaXggV2lkZ2V0c30KLQotXHVsaW5re1RpeH0KLXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvbWFuL2h0bWwvVGl4Q21kL1RpeEludHJvLmh0bX0KLWludHJvZHVjZXMgb3ZlciA0MCB3aWRnZXQgY2xhc3NlcyB0byB0aGUgXHJlZm1vZHVsZXtUa2ludGVyfSAKLXJlcGVydG9pcmUuICBUaGVyZSBpcyBhIGRlbW8gb2YgYWxsIHRoZSBccmVmbW9kdWxle1RpeH0gd2lkZ2V0cyBpbiB0aGUKLVxmaWxle0RlbW8vdGl4fSBkaXJlY3Rvcnkgb2YgdGhlIHN0YW5kYXJkIGRpc3RyaWJ1dGlvbi4KLQotCi0lIFRoZSBQeXRob24gc2FtcGxlIGNvZGUgaXMgc3RpbGwgYmVpbmcgYWRkZWQgdG8gUHl0aG9uLCBoZW5jZSBjb21tZW50ZWQgb3V0Ci0KLQotXHN1YnN1YnNlY3Rpb257QmFzaWMgV2lkZ2V0c30KLQotXGJlZ2lue2NsYXNzZGVzY317QmFsbG9vbn17fQotQSBcdWxpbmt7QmFsbG9vbn0KLXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvbWFuL2h0bWwvVGl4Q21kL3RpeEJhbGxvb24uaHRtfQotdGhhdCBwb3BzIHVwIG92ZXIgYSB3aWRnZXQgdG8gcHJvdmlkZSBoZWxwLiAgV2hlbiB0aGUgdXNlciBtb3ZlcyB0aGUKLWN1cnNvciBpbnNpZGUgYSB3aWRnZXQgdG8gd2hpY2ggYSBCYWxsb29uIHdpZGdldCBoYXMgYmVlbiBib3VuZCwgYQotc21hbGwgcG9wLXVwIHdpbmRvdyB3aXRoIGEgZGVzY3JpcHRpdmUgbWVzc2FnZSB3aWxsIGJlIHNob3duIG9uIHRoZQotc2NyZWVuLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLSUgUHl0aG9uIERlbW8gb2Y6Ci0lIFx1bGlua3tCYWxsb29ufXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvZGVtb3Mvc2FtcGxlcy9CYWxsb29uLnRjbH0KLQotXGJlZ2lue2NsYXNzZGVzY317QnV0dG9uQm94fXt9Ci1UaGUgXHVsaW5re0J1dHRvbkJveH0KLXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvbWFuL2h0bWwvVGl4Q21kL3RpeEJ1dHRvbkJveC5odG19Ci13aWRnZXQgY3JlYXRlcyBhIGJveCBvZiBidXR0b25zLCBzdWNoIGFzIGlzIGNvbW1vbmx5IHVzZWQgZm9yIFxjb2Rle09rCi1DYW5jZWx9LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLSUgUHl0aG9uIERlbW8gb2Y6Ci0lIFx1bGlua3tCdXR0b25Cb3h9e2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9kZW1vcy9zYW1wbGVzL0J0bkJveC50Y2x9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0NvbWJvQm94fXt9Ci1UaGUgXHVsaW5re0NvbWJvQm94fQote2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9tYW4vaHRtbC9UaXhDbWQvdGl4Q29tYm9Cb3guaHRtfQotd2lkZ2V0IGlzIHNpbWlsYXIgdG8gdGhlIGNvbWJvIGJveCBjb250cm9sIGluIE1TIFdpbmRvd3MuIFRoZSB1c2VyIGNhbgotc2VsZWN0IGEgY2hvaWNlIGJ5IGVpdGhlciB0eXBpbmcgaW4gdGhlIGVudHJ5IHN1YndkZ2V0IG9yIHNlbGVjdGluZwotZnJvbSB0aGUgbGlzdGJveCBzdWJ3aWRnZXQuCi1cZW5ke2NsYXNzZGVzY30KLQotJSBQeXRob24gRGVtbyBvZjoKLSUgXHVsaW5re0NvbWJvQm94fXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvZGVtb3Mvc2FtcGxlcy9Db21ib0JveC50Y2x9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0NvbnRyb2x9e30KLVRoZSBcdWxpbmt7Q29udHJvbH0KLXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvbWFuL2h0bWwvVGl4Q21kL3RpeENvbnRyb2wuaHRtfQotd2lkZ2V0IGlzIGFsc28ga25vd24gYXMgdGhlIFxjbGFzc3tTcGluQm94fSB3aWRnZXQuIFRoZSB1c2VyIGNhbgotYWRqdXN0IHRoZSB2YWx1ZSBieSBwcmVzc2luZyB0aGUgdHdvIGFycm93IGJ1dHRvbnMgb3IgYnkgZW50ZXJpbmcgdGhlCi12YWx1ZSBkaXJlY3RseSBpbnRvIHRoZSBlbnRyeS4gVGhlIG5ldyB2YWx1ZSB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdAotdGhlIHVzZXItZGVmaW5lZCB1cHBlciBhbmQgbG93ZXIgbGltaXRzLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLSUgUHl0aG9uIERlbW8gb2Y6Ci0lIFx1bGlua3tDb250cm9sfXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvZGVtb3Mvc2FtcGxlcy9Db250cm9sLnRjbH0KLQotXGJlZ2lue2NsYXNzZGVzY317TGFiZWxFbnRyeX17fQotVGhlIFx1bGlua3tMYWJlbEVudHJ5fQote2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9tYW4vaHRtbC9UaXhDbWQvdGl4TGFiZWxFbnRyeS5odG19Ci13aWRnZXQgcGFja2FnZXMgYW4gZW50cnkgd2lkZ2V0IGFuZCBhIGxhYmVsIGludG8gb25lIG1lZ2Egd2lkZ2V0LiBJdAotY2FuIGJlIHVzZWQgYmUgdXNlZCB0byBzaW1wbGlmeSB0aGUgY3JlYXRpb24gb2YgYGBlbnRyeS1mb3JtJycgdHlwZSBvZgotaW50ZXJmYWNlLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLSUgUHl0aG9uIERlbW8gb2Y6Ci0lIFx1bGlua3tMYWJlbEVudHJ5fXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvZGVtb3Mvc2FtcGxlcy9MYWJFbnRyeS50Y2x9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0xhYmVsRnJhbWV9e30KLVRoZSBcdWxpbmt7TGFiZWxGcmFtZX0KLXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvbWFuL2h0bWwvVGl4Q21kL3RpeExhYmVsRnJhbWUuaHRtfQotd2lkZ2V0IHBhY2thZ2VzIGEgZnJhbWUgd2lkZ2V0IGFuZCBhIGxhYmVsIGludG8gb25lIG1lZ2Egd2lkZ2V0LiAgVG8KLWNyZWF0ZSB3aWRnZXRzIGluc2lkZSBhIExhYmVsRnJhbWUgd2lkZ2V0LCBvbmUgY3JlYXRlcyB0aGUgbmV3IHdpZGdldHMKLXJlbGF0aXZlIHRvIHRoZSBcbWVtYmVye2ZyYW1lfSBzdWJ3aWRnZXQgYW5kIG1hbmFnZSB0aGVtIGluc2lkZSB0aGUKLVxtZW1iZXJ7ZnJhbWV9IHN1YndpZGdldC4KLVxlbmR7Y2xhc3NkZXNjfQotCi0lIFB5dGhvbiBEZW1vIG9mOgotJSBcdWxpbmt7TGFiZWxGcmFtZX17aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L2RlbW9zL3NhbXBsZXMvTGFiRnJhbWUudGNsfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtNZXRlcn17fQotVGhlIFx1bGlua3tNZXRlcn0KLXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvbWFuL2h0bWwvVGl4Q21kL3RpeE1ldGVyLmh0bX0KLXdpZGdldCBjYW4gYmUgdXNlZCB0byBzaG93IHRoZSBwcm9ncmVzcyBvZiBhIGJhY2tncm91bmQgam9iIHdoaWNoIG1heQotdGFrZSBhIGxvbmcgdGltZSB0byBleGVjdXRlLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLSUgUHl0aG9uIERlbW8gb2Y6Ci0lIFx1bGlua3tNZXRlcn17aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L2RlbW9zL3NhbXBsZXMvTWV0ZXIudGNsfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtPcHRpb25NZW51fXt9Ci1UaGUgXHVsaW5re09wdGlvbk1lbnV9Ci17aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L21hbi9odG1sL1RpeENtZC90aXhPcHRpb25NZW51Lmh0bX0KLWNyZWF0ZXMgYSBtZW51IGJ1dHRvbiBvZiBvcHRpb25zLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLSUgUHl0aG9uIERlbW8gb2Y6Ci0lIFx1bGlua3tPcHRpb25NZW51fXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvZGVtb3Mvc2FtcGxlcy9PcHRNZW51LnRjbH0KLQotXGJlZ2lue2NsYXNzZGVzY317UG9wdXBNZW51fXt9Ci1UaGUgXHVsaW5re1BvcHVwTWVudX0KLXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvbWFuL2h0bWwvVGl4Q21kL3RpeFBvcHVwTWVudS5odG19Ci13aWRnZXQgY2FuIGJlIHVzZWQgYXMgYSByZXBsYWNlbWVudCBvZiB0aGUgXGNvZGV7dGtfcG9wdXB9Ci1jb21tYW5kLiBUaGUgYWR2YW50YWdlIG9mIHRoZSBccmVmbW9kdWxle1RpeH0gXGNsYXNze1BvcHVwTWVudX0gd2lkZ2V0Ci1pcyBpdCByZXF1aXJlcyBsZXNzIGFwcGxpY2F0aW9uIGNvZGUgdG8gbWFuaXB1bGF0ZS4KLVxlbmR7Y2xhc3NkZXNjfQotCi0lIFB5dGhvbiBEZW1vIG9mOgotJSBcdWxpbmt7UG9wdXBNZW51fXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvZGVtb3Mvc2FtcGxlcy9Qb3BNZW51LnRjbH0KLQotXGJlZ2lue2NsYXNzZGVzY317U2VsZWN0fXt9Ci1UaGUgXHVsaW5re1NlbGVjdH0KLXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvbWFuL2h0bWwvVGl4Q21kL3RpeFNlbGVjdC5odG19Ci13aWRnZXQgaXMgYSBjb250YWluZXIgb2YgYnV0dG9uIHN1YndpZGdldHMuIEl0IGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUKLXJhZGlvLWJveCBvciBjaGVjay1ib3ggc3R5bGUgb2Ygc2VsZWN0aW9uIG9wdGlvbnMgZm9yIHRoZSB1c2VyLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLSUgUHl0aG9uIERlbW8gb2Y6Ci0lIFx1bGlua3tTZWxlY3R9e2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9kZW1vcy9zYW1wbGVzL1NlbGVjdC50Y2x9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1N0ZEJ1dHRvbkJveH17fQotVGhlIFx1bGlua3tTdGRCdXR0b25Cb3h9Ci17aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L21hbi9odG1sL1RpeENtZC90aXhTdGRCdXR0b25Cb3guaHRtfQotd2lkZ2V0IGlzIGEgZ3JvdXAgb2Ygc3RhbmRhcmQgYnV0dG9ucyBmb3IgTW90aWYtbGlrZSBkaWFsb2cgYm94ZXMuCi1cZW5ke2NsYXNzZGVzY30KLQotJSBQeXRob24gRGVtbyBvZjoKLSUgXHVsaW5re1N0ZEJ1dHRvbkJveH17aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L2RlbW9zL3NhbXBsZXMvU3RkQkJveC50Y2x9Ci0KLQotXHN1YnN1YnNlY3Rpb257RmlsZSBTZWxlY3RvcnN9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0Rpckxpc3R9e30KLVRoZSBcdWxpbmt7RGlyTGlzdH0KLXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvbWFuL2h0bWwvVGl4Q21kL3RpeERpckxpc3QuaHRtfSB3aWRnZXQKLWRpc3BsYXlzIGEgbGlzdCB2aWV3IG9mIGEgZGlyZWN0b3J5LCBpdHMgcHJldmlvdXMgZGlyZWN0b3JpZXMgYW5kIGl0cwotc3ViLWRpcmVjdG9yaWVzLiBUaGUgdXNlciBjYW4gY2hvb3NlIG9uZSBvZiB0aGUgZGlyZWN0b3JpZXMgZGlzcGxheWVkCi1pbiB0aGUgbGlzdCBvciBjaGFuZ2UgdG8gYW5vdGhlciBkaXJlY3RvcnkuCi1cZW5ke2NsYXNzZGVzY30KLQotJSBQeXRob24gRGVtbyBvZjoKLSUgXHVsaW5re0Rpckxpc3R9e2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9kZW1vcy9zYW1wbGVzL0Rpckxpc3QudGNsfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtEaXJUcmVlfXt9Ci1UaGUgXHVsaW5re0RpclRyZWV9Ci17aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L21hbi9odG1sL1RpeENtZC90aXhEaXJUcmVlLmh0bX0KLXdpZGdldCBkaXNwbGF5cyBhIHRyZWUgdmlldyBvZiBhIGRpcmVjdG9yeSwgaXRzIHByZXZpb3VzIGRpcmVjdG9yaWVzCi1hbmQgaXRzIHN1Yi1kaXJlY3Rvcmllcy4gVGhlIHVzZXIgY2FuIGNob29zZSBvbmUgb2YgdGhlIGRpcmVjdG9yaWVzCi1kaXNwbGF5ZWQgaW4gdGhlIGxpc3Qgb3IgY2hhbmdlIHRvIGFub3RoZXIgZGlyZWN0b3J5LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLSUgUHl0aG9uIERlbW8gb2Y6Ci0lIFx1bGlua3tEaXJUcmVlfXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvZGVtb3Mvc2FtcGxlcy9EaXJUcmVlLnRjbH0KLQotXGJlZ2lue2NsYXNzZGVzY317RGlyU2VsZWN0RGlhbG9nfXt9Ci1UaGUgXHVsaW5re0RpclNlbGVjdERpYWxvZ30KLXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvbWFuL2h0bWwvVGl4Q21kL3RpeERpclNlbGVjdERpYWxvZy5odG19Ci13aWRnZXQgcHJlc2VudHMgdGhlIGRpcmVjdG9yaWVzIGluIHRoZSBmaWxlIHN5c3RlbSBpbiBhIGRpYWxvZwotd2luZG93LiAgVGhlIHVzZXIgY2FuIHVzZSB0aGlzIGRpYWxvZyB3aW5kb3cgdG8gbmF2aWdhdGUgdGhyb3VnaCB0aGUKLWZpbGUgc3lzdGVtIHRvIHNlbGVjdCB0aGUgZGVzaXJlZCBkaXJlY3RvcnkuCi1cZW5ke2NsYXNzZGVzY30KLQotJSBQeXRob24gRGVtbyBvZjoKLSUgXHVsaW5re0RpclNlbGVjdERpYWxvZ317aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L2RlbW9zL3NhbXBsZXMvRGlyRGxnLnRjbH0KLQotXGJlZ2lue2NsYXNzZGVzY317RGlyU2VsZWN0Qm94fXt9Ci1UaGUgXGNsYXNze0RpclNlbGVjdEJveH0gaXMgc2ltaWxhcgotdG8gdGhlIHN0YW5kYXJkIE1vdGlmKFRNKSBkaXJlY3Rvcnktc2VsZWN0aW9uIGJveC4gSXQgaXMgZ2VuZXJhbGx5IHVzZWQgZm9yCi10aGUgdXNlciB0byBjaG9vc2UgYSBkaXJlY3RvcnkuIERpclNlbGVjdEJveCBzdG9yZXMgdGhlIGRpcmVjdG9yaWVzIG1vc3RseQotcmVjZW50bHkgc2VsZWN0ZWQgaW50byBhIENvbWJvQm94IHdpZGdldCBzbyB0aGF0IHRoZXkgY2FuIGJlIHF1aWNrbHkKLXNlbGVjdGVkIGFnYWluLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0V4RmlsZVNlbGVjdEJveH17fQotVGhlIFx1bGlua3tFeEZpbGVTZWxlY3RCb3h9Ci17aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L21hbi9odG1sL1RpeENtZC90aXhFeEZpbGVTZWxlY3RCb3guaHRtfQotd2lkZ2V0IGlzIHVzdWFsbHkgZW1iZWRkZWQgaW4gYSB0aXhFeEZpbGVTZWxlY3REaWFsb2cgd2lkZ2V0LiBJdAotcHJvdmlkZXMgYW4gY29udmVuaWVudCBtZXRob2QgZm9yIHRoZSB1c2VyIHRvIHNlbGVjdCBmaWxlcy4gVGhlIHN0eWxlCi1vZiB0aGUgXGNsYXNze0V4RmlsZVNlbGVjdEJveH0gd2lkZ2V0IGlzIHZlcnkgc2ltaWxhciB0byB0aGUgc3RhbmRhcmQKLWZpbGUgZGlhbG9nIG9uIE1TIFdpbmRvd3MgMy4xLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLSUgUHl0aG9uIERlbW8gb2Y6Ci0lXHVsaW5re0V4RmlsZVNlbGVjdERpYWxvZ317aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L2RlbW9zL3NhbXBsZXMvRUZpbGVEbGcudGNsfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtGaWxlU2VsZWN0Qm94fXt9Ci1UaGUgXHVsaW5re0ZpbGVTZWxlY3RCb3h9Ci17aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L21hbi9odG1sL1RpeENtZC90aXhGaWxlU2VsZWN0Qm94Lmh0bX0KLWlzIHNpbWlsYXIgdG8gdGhlIHN0YW5kYXJkIE1vdGlmKFRNKSBmaWxlLXNlbGVjdGlvbiBib3guIEl0IGlzCi1nZW5lcmFsbHkgdXNlZCBmb3IgdGhlIHVzZXIgdG8gY2hvb3NlIGEgZmlsZS4gRmlsZVNlbGVjdEJveCBzdG9yZXMgdGhlCi1maWxlcyBtb3N0bHkgcmVjZW50bHkgc2VsZWN0ZWQgaW50byBhIFxjbGFzc3tDb21ib0JveH0gd2lkZ2V0IHNvIHRoYXQKLXRoZXkgY2FuIGJlIHF1aWNrbHkgc2VsZWN0ZWQgYWdhaW4uCi1cZW5ke2NsYXNzZGVzY30KLQotJSBQeXRob24gRGVtbyBvZjoKLSUgXHVsaW5re0ZpbGVTZWxlY3REaWFsb2d9e2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9kZW1vcy9zYW1wbGVzL0ZpbGVEbGcudGNsfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtGaWxlRW50cnl9e30KLVRoZSBcdWxpbmt7RmlsZUVudHJ5fQote2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9tYW4vaHRtbC9UaXhDbWQvdGl4RmlsZUVudHJ5Lmh0bX0KLXdpZGdldCBjYW4gYmUgdXNlZCB0byBpbnB1dCBhIGZpbGVuYW1lLiBUaGUgdXNlciBjYW4gdHlwZSBpbiB0aGUKLWZpbGVuYW1lIG1hbnVhbGx5LiBBbHRlcm5hdGl2ZWx5LCB0aGUgdXNlciBjYW4gcHJlc3MgdGhlIGJ1dHRvbiB3aWRnZXQKLXRoYXQgc2l0cyBuZXh0IHRvIHRoZSBlbnRyeSwgd2hpY2ggd2lsbCBicmluZyB1cCBhIGZpbGUgc2VsZWN0aW9uCi1kaWFsb2cuCi1cZW5ke2NsYXNzZGVzY30KLQotJSBQeXRob24gRGVtbyBvZjoKLSUgXHVsaW5re0ZpbGVFbnRyeX17aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L2RlbW9zL3NhbXBsZXMvRmlsZUVudC50Y2x9Ci0KLQotXHN1YnN1YnNlY3Rpb257SGllcmFjaGljYWwgTGlzdEJveH0KLQotXGJlZ2lue2NsYXNzZGVzY317SExpc3R9e30KLVRoZSBcdWxpbmt7SExpc3R9Ci17aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L21hbi9odG1sL1RpeENtZC90aXhITGlzdC5odG19Ci13aWRnZXQgY2FuIGJlIHVzZWQgdG8gZGlzcGxheSBhbnkgZGF0YSB0aGF0IGhhdmUgYSBoaWVyYXJjaGljYWwKLXN0cnVjdHVyZSwgZm9yIGV4YW1wbGUsIGZpbGUgc3lzdGVtIGRpcmVjdG9yeSB0cmVlcy4gVGhlIGxpc3QgZW50cmllcwotYXJlIGluZGVudGVkIGFuZCBjb25uZWN0ZWQgYnkgYnJhbmNoIGxpbmVzIGFjY29yZGluZyB0byB0aGVpciBwbGFjZXMKLWluIHRoZSBoaWVyYXJjaHkuCi1cZW5ke2NsYXNzZGVzY30KLQotJSBQeXRob24gRGVtbyBvZjoKLSUgXHVsaW5re0hMaXN0fXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvZGVtb3Mvc2FtcGxlcy9ITGlzdDEudGNsfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtDaGVja0xpc3R9e30KLVRoZSBcdWxpbmt7Q2hlY2tMaXN0fQote2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9tYW4vaHRtbC9UaXhDbWQvdGl4Q2hlY2tMaXN0Lmh0bX0KLXdpZGdldCBkaXNwbGF5cyBhIGxpc3Qgb2YgaXRlbXMgdG8gYmUgc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIENoZWNrTGlzdAotYWN0cyBzaW1pbGFybHkgdG8gdGhlIFRrIGNoZWNrYnV0dG9uIG9yIHJhZGlvYnV0dG9uIHdpZGdldHMsIGV4Y2VwdCBpdAotaXMgY2FwYWJsZSBvZiBoYW5kbGluZyBtYW55IG1vcmUgaXRlbXMgdGhhbiBjaGVja2J1dHRvbnMgb3IKLXJhZGlvYnV0dG9ucy4KLVxlbmR7Y2xhc3NkZXNjfQotCi0lIFB5dGhvbiBEZW1vIG9mOgotJSBcdWxpbmt7IENoZWNrTGlzdH17aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L2RlbW9zL3NhbXBsZXMvQ2hrTGlzdC50Y2x9Ci0lIFB5dGhvbiBEZW1vIG9mOgotJSBcdWxpbmt7U2Nyb2xsZWRITGlzdCAoMSl9e2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9kZW1vcy9zYW1wbGVzL1NITGlzdC50Y2x9Ci0lIFB5dGhvbiBEZW1vIG9mOgotJSBcdWxpbmt7U2Nyb2xsZWRITGlzdCAoMil9e2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9kZW1vcy9zYW1wbGVzL1NITGlzdDIudGNsfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtUcmVlfXt9Ci1UaGUgXHVsaW5re1RyZWV9Ci17aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L21hbi9odG1sL1RpeENtZC90aXhUcmVlLmh0bX0KLXdpZGdldCBjYW4gYmUgdXNlZCB0byBkaXNwbGF5IGhpZXJhcmNoaWNhbCBkYXRhIGluIGEgdHJlZSBmb3JtLiBUaGUKLXVzZXIgY2FuIGFkanVzdCB0aGUgdmlldyBvZiB0aGUgdHJlZSBieSBvcGVuaW5nIG9yIGNsb3NpbmcgcGFydHMgb2YKLXRoZSB0cmVlLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLSUgUHl0aG9uIERlbW8gb2Y6Ci0lIFx1bGlua3tUcmVlfXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvZGVtb3Mvc2FtcGxlcy9UcmVlLnRjbH0KLQotJSBQeXRob24gRGVtbyBvZjoKLSUgXHVsaW5re1RyZWUgKER5bmFtaWMpfXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvZGVtb3Mvc2FtcGxlcy9EeW5UcmVlLnRjbH0KLQotCi1cc3Vic3Vic2VjdGlvbntUYWJ1bGFyIExpc3RCb3h9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1RMaXN0fXt9Ci1UaGUgXHVsaW5re1RMaXN0fQote2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9tYW4vaHRtbC9UaXhDbWQvdGl4VExpc3QuaHRtfQotd2lkZ2V0IGNhbiBiZSB1c2VkIHRvIGRpc3BsYXkgZGF0YSBpbiBhIHRhYnVsYXIgZm9ybWF0LiBUaGUgbGlzdAotZW50cmllcyBvZiBhIFxjbGFzc3tUTGlzdH0gd2lkZ2V0IGFyZSBzaW1pbGFyIHRvIHRoZSBlbnRyaWVzIGluIHRoZSBUawotbGlzdGJveCB3aWRnZXQuICBUaGUgbWFpbiBkaWZmZXJlbmNlcyBhcmUgKDEpIHRoZSBcY2xhc3N7VExpc3R9IHdpZGdldAotY2FuIGRpc3BsYXkgdGhlIGxpc3QgZW50cmllcyBpbiBhIHR3byBkaW1lbnNpb25hbCBmb3JtYXQgYW5kICgyKSB5b3UKLWNhbiB1c2UgZ3JhcGhpY2FsIGltYWdlcyBhcyB3ZWxsIGFzIG11bHRpcGxlIGNvbG9ycyBhbmQgZm9udHMgZm9yIHRoZQotbGlzdCBlbnRyaWVzLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLSUgUHl0aG9uIERlbW8gb2Y6Ci0lIFx1bGlua3tTY3JvbGxlZFRMaXN0ICgxKX17aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L2RlbW9zL3NhbXBsZXMvU1RMaXN0MS50Y2x9Ci0lIFB5dGhvbiBEZW1vIG9mOgotJSBcdWxpbmt7U2Nyb2xsZWRUTGlzdCAoMil9e2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9kZW1vcy9zYW1wbGVzL1NUTGlzdDIudGNsfQotCi0lIEdyaWQgaGFzIHlldCB0byBiZSBhZGRlZCB0byBQeXRob24KLSUgXHN1YnN1YnNlY3Rpb257R3JpZCBXaWRnZXR9Ci0lIFB5dGhvbiBEZW1vIG9mOgotJSBcdWxpbmt7U2ltcGxlIEdyaWR9e2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9kZW1vcy9zYW1wbGVzL1NHcmlkMC50Y2x9Ci0lIFB5dGhvbiBEZW1vIG9mOgotJSBcdWxpbmt7U2Nyb2xsZWRHcmlkfXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvZGVtb3Mvc2FtcGxlcy9TR3JpZDEudGNsfQotJSBQeXRob24gRGVtbyBvZjoKLSUgXHVsaW5re0VkaXRhYmxlIEdyaWR9e2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9kZW1vcy9zYW1wbGVzL0VkaXRHcmlkLnRjbH0KLQotCi1cc3Vic3Vic2VjdGlvbntNYW5hZ2VyIFdpZGdldHN9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1BhbmVkV2luZG93fXt9Ci1UaGUgXHVsaW5re1BhbmVkV2luZG93fQote2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9tYW4vaHRtbC9UaXhDbWQvdGl4UGFuZWRXaW5kb3cuaHRtfQotd2lkZ2V0IGFsbG93cyB0aGUgdXNlciB0byBpbnRlcmFjdGl2ZWx5IG1hbmlwdWxhdGUgdGhlIHNpemVzIG9mCi1zZXZlcmFsIHBhbmVzLiAgVGhlIHBhbmVzIGNhbiBiZSBhcnJhbmdlZCBlaXRoZXIgdmVydGljYWxseSBvcgotaG9yaXpvbnRhbGx5LiAgVGhlIHVzZXIgY2hhbmdlcyB0aGUgc2l6ZXMgb2YgdGhlIHBhbmVzIGJ5IGRyYWdnaW5nIHRoZQotcmVzaXplIGhhbmRsZSBiZXR3ZWVuIHR3byBwYW5lcy4KLVxlbmR7Y2xhc3NkZXNjfQotCi0lIFB5dGhvbiBEZW1vIG9mOgotJSBcdWxpbmt7UGFuZWRXaW5kb3d9e2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9kZW1vcy9zYW1wbGVzL1BhbmVkV2luLnRjbH0KLQotXGJlZ2lue2NsYXNzZGVzY317TGlzdE5vdGVCb29rfXt9Ci1UaGUgXHVsaW5re0xpc3ROb3RlQm9va30KLXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvbWFuL2h0bWwvVGl4Q21kL3RpeExpc3ROb3RlQm9vay5odG19Ci13aWRnZXQgaXMgdmVyeSBzaW1pbGFyIHRvIHRoZSBcY2xhc3N7VGl4Tm90ZUJvb2t9IHdpZGdldDogaXQgY2FuIGJlCi11c2VkIHRvIGRpc3BsYXkgbWFueSB3aW5kb3dzIGluIGEgbGltaXRlZCBzcGFjZSB1c2luZyBhIG5vdGVib29rCi1tZXRhcGhvci4gVGhlIG5vdGVib29rIGlzIGRpdmlkZWQgaW50byBhIHN0YWNrIG9mIHBhZ2VzICh3aW5kb3dzKS4gQXQKLW9uZSB0aW1lIG9ubHkgb25lIG9mIHRoZXNlIHBhZ2VzIGNhbiBiZSBzaG93bi4gVGhlIHVzZXIgY2FuIG5hdmlnYXRlCi10aHJvdWdoIHRoZXNlIHBhZ2VzIGJ5IGNob29zaW5nIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIHBhZ2UgaW4gdGhlCi1cbWVtYmVye2hsaXN0fSBzdWJ3aWRnZXQuCi1cZW5ke2NsYXNzZGVzY30KLQotJSBQeXRob24gRGVtbyBvZjoKLSUgXHVsaW5re0xpc3ROb3RlQm9va317aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L2RlbW9zL3NhbXBsZXMvTGlzdE5CSy50Y2x9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e05vdGVCb29rfXt9Ci1UaGUgXHVsaW5re05vdGVCb29rfQote2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9tYW4vaHRtbC9UaXhDbWQvdGl4Tm90ZUJvb2suaHRtfQotd2lkZ2V0IGNhbiBiZSB1c2VkIHRvIGRpc3BsYXkgbWFueSB3aW5kb3dzIGluIGEgbGltaXRlZCBzcGFjZSB1c2luZyBhCi1ub3RlYm9vayBtZXRhcGhvci4gVGhlIG5vdGVib29rIGlzIGRpdmlkZWQgaW50byBhIHN0YWNrIG9mIHBhZ2VzLiBBdAotb25lIHRpbWUgb25seSBvbmUgb2YgdGhlc2UgcGFnZXMgY2FuIGJlIHNob3duLiBUaGUgdXNlciBjYW4gbmF2aWdhdGUKLXRocm91Z2ggdGhlc2UgcGFnZXMgYnkgY2hvb3NpbmcgdGhlIHZpc3VhbCBgYHRhYnMnJyBhdCB0aGUgdG9wIG9mIHRoZQotTm90ZUJvb2sgd2lkZ2V0LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLSUgUHl0aG9uIERlbW8gb2Y6Ci0lIFx1bGlua3tOb3RlQm9va317aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L2RlbW9zL3NhbXBsZXMvTm90ZUJvb2sudGNsfQotCi0KLSUgXHN1YnN1YnNlY3Rpb257U2Nyb2xsZWQgV2lkZ2V0c30KLSUgUHl0aG9uIERlbW8gb2Y6Ci0lIFx1bGlua3tTY3JvbGxlZExpc3RCb3h9e2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9kZW1vcy9zYW1wbGVzL1NMaXN0Qm94LnRjbH0KLSUgUHl0aG9uIERlbW8gb2Y6Ci0lIFx1bGlua3tTY3JvbGxlZFRleHR9e2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9kZW1vcy9zYW1wbGVzL1NUZXh0LnRjbH0KLSUgUHl0aG9uIERlbW8gb2Y6Ci0lIFx1bGlua3tTY3JvbGxlZFdpbmRvd317aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L2RlbW9zL3NhbXBsZXMvU1dpbmRvdy50Y2x9Ci0lIFB5dGhvbiBEZW1vIG9mOgotJSBcdWxpbmt7Q2FudmFzIE9iamVjdCBWaWV3fXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvZGVtb3Mvc2FtcGxlcy9DT2JqVmlldy50Y2x9Ci0KLQotXHN1YnN1YnNlY3Rpb257SW1hZ2UgVHlwZXN9Ci0KLVRoZSBccmVmbW9kdWxle1RpeH0gbW9kdWxlIGFkZHM6Ci1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtIAotXHVsaW5re3BpeG1hcH0KLXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvbWFuL2h0bWwvVGl4Q21kL3BpeG1hcC5odG19Ci1jYXBhYmlsaXRpZXMgdG8gYWxsIFxyZWZtb2R1bGV7VGl4fSBhbmQgXHJlZm1vZHVsZXtUa2ludGVyfSB3aWRnZXRzIHRvCi1jcmVhdGUgY29sb3IgaW1hZ2VzIGZyb20gWFBNIGZpbGVzLgotCi0lIFB5dGhvbiBEZW1vIG9mOgotJSBcdWxpbmt7WFBNIEltYWdlIEluIEJ1dHRvbn17aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L2RlbW9zL3NhbXBsZXMvWHBtLnRjbH0KLQotJSBQeXRob24gRGVtbyBvZjoKLSUgXHVsaW5re1hQTSBJbWFnZSBJbiBNZW51fXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvZGVtb3Mvc2FtcGxlcy9YcG0xLnRjbH0KLQotXGl0ZW0KLVx1bGlua3tDb21wb3VuZH0KLXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvbWFuL2h0bWwvVGl4Q21kL2NvbXBvdW5kLmh0bX0KLWltYWdlIHR5cGVzIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBpbWFnZXMgdGhhdCBjb25zaXN0cyBvZiBtdWx0aXBsZQotaG9yaXpvbnRhbCBsaW5lczsgZWFjaCBsaW5lIGlzIGNvbXBvc2VkIG9mIGEgc2VyaWVzIG9mIGl0ZW1zICh0ZXh0cywKLWJpdG1hcHMsIGltYWdlcyBvciBzcGFjZXMpIGFycmFuZ2VkIGZyb20gbGVmdCB0byByaWdodC4gRm9yIGV4YW1wbGUsIGEKLWNvbXBvdW5kIGltYWdlIGNhbiBiZSB1c2VkIHRvIGRpc3BsYXkgYSBiaXRtYXAgYW5kIGEgdGV4dCBzdHJpbmcKLXNpbXVsdGFuZW91c2x5IGluIGEgVGsgXGNsYXNze0J1dHRvbn0gd2lkZ2V0LgotCi0lIFB5dGhvbiBEZW1vIG9mOgotJSBcdWxpbmt7Q29tcG91bmQgSW1hZ2UgSW4gQnV0dG9uc317aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L2RlbW9zL3NhbXBsZXMvQ21wSW1nLnRjbH0KLQotJSBQeXRob24gRGVtbyBvZjoKLSUgXHVsaW5re0NvbXBvdW5kIEltYWdlIEluIE5vdGVCb29rfXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvZGVtb3Mvc2FtcGxlcy9DbXBJbWcyLnRjbH0KLQotJSBQeXRob24gRGVtbyBvZjoKLSUgXHVsaW5re0NvbXBvdW5kIEltYWdlIE5vdGVib29rIENvbG9yIFRhYnN9e2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9kZW1vcy9zYW1wbGVzL0NtcEltZzQudGNsfQotCi0lIFB5dGhvbiBEZW1vIG9mOgotJSBcdWxpbmt7Q29tcG91bmQgSW1hZ2UgSWNvbnN9e2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9kZW1vcy9zYW1wbGVzL0NtcEltZzMudGNsfQotXGVuZHtpdGVtaXplfQotCi0KLVxzdWJzdWJzZWN0aW9ue01pc2NlbGxhbmVvdXMgV2lkZ2V0c30KLQotXGJlZ2lue2NsYXNzZGVzY317SW5wdXRPbmx5fXt9Ci1UaGUgXHVsaW5re0lucHV0T25seX0KLXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvbWFuL2h0bWwvVGl4Q21kL3RpeElucHV0T25seS5odG19Ci13aWRnZXRzIGFyZSB0byBhY2NlcHQgaW5wdXRzIGZyb20gdGhlIHVzZXIsIHdoaWNoIGNhbiBiZSBkb25lIHdpdGggdGhlCi1cY29kZXtiaW5kfSBjb21tYW5kIChcVU5JWHt9IG9ubHkpLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxzdWJzdWJzZWN0aW9ue0Zvcm0gR2VvbWV0cnkgTWFuYWdlcn0KLQotSW4gYWRkaXRpb24sIFxyZWZtb2R1bGV7VGl4fSBhdWdtZW50cyBccmVmbW9kdWxle1RraW50ZXJ9IGJ5IHByb3ZpZGluZzoKLQotXGJlZ2lue2NsYXNzZGVzY317Rm9ybX17fQotVGhlIFx1bGlua3tGb3JtfQote2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9tYW4vaHRtbC9UaXhDbWQvdGl4Rm9ybS5odG19Ci1nZW9tZXRyeSBtYW5hZ2VyIGJhc2VkIG9uIGF0dGFjaG1lbnQgcnVsZXMgZm9yIGFsbCBUayB3aWRnZXRzLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLQotJWJlZ2lue2xhdGV4b25seX0KLSVcc3Vic2VjdGlvbntUaXggQ2xhc3MgU3RydWN0dXJlfQotJQotJVxiZWdpbntmaWd1cmV9W2hidHBdCi0lXGNlbnRlcmxpbmV7XGVwc2ZpZ3tmaWxlPWhpZXJhcmNoeS5wbmcsd2lkdGg9LjlcdGV4dHdpZHRofX0KLSVcdnNwYWNley41Y219Ci0lXGNhcHRpb257VGhlIENsYXNzIEhpZXJhcmNoeSBvZiBUaXggV2lkZ2V0c30KLSVcZW5ke2ZpZ3VyZX0KLSVlbmR7bGF0ZXhvbmx5fQotCi1cc3Vic2VjdGlvbntUaXggQ29tbWFuZHN9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e3RpeENvbW1hbmR9e30KLVRoZSBcdWxpbmt7dGl4IGNvbW1hbmRzfQote2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9tYW4vaHRtbC9UaXhDbWQvdGl4Lmh0bX0KLXByb3ZpZGUgYWNjZXNzIHRvIG1pc2NlbGxhbmVvdXMgZWxlbWVudHMgb2YgXHJlZm1vZHVsZXtUaXh9J3MgaW50ZXJuYWwKLXN0YXRlIGFuZCB0aGUgIFxyZWZtb2R1bGV7VGl4fSBhcHBsaWNhdGlvbiBjb250ZXh0LiAgTW9zdCBvZiB0aGUgaW5mb3JtYXRpb24KLW1hbmlwdWxhdGVkIGJ5IHRoZXNlIG1ldGhvZHMgcGVydGFpbnMgdG8gdGhlIGFwcGxpY2F0aW9uIGFzIGEgd2hvbGUsCi1vciB0byBhIHNjcmVlbiBvciBkaXNwbGF5LCByYXRoZXIgdGhhbiB0byBhIHBhcnRpY3VsYXIgd2luZG93LgotCi1UbyB2aWV3IHRoZSBjdXJyZW50IHNldHRpbmdzLCB0aGUgY29tbW9uIHVzYWdlIGlzOgotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IFRpeAotcm9vdCA9IFRpeC5UaygpCi1wcmludCByb290LnRpeF9jb25maWd1cmUoKQotXGVuZHt2ZXJiYXRpbX0KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317dGl4X2NvbmZpZ3VyZX17XG9wdGlvbmFse2NuZix9ICoqa3d9Ci1RdWVyeSBvciBtb2RpZnkgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBvZiB0aGUgVGl4IGFwcGxpY2F0aW9uCi1jb250ZXh0LiBJZiBubyBvcHRpb24gaXMgc3BlY2lmaWVkLCByZXR1cm5zIGEgZGljdGlvbmFyeSBhbGwgb2YgdGhlCi1hdmFpbGFibGUgb3B0aW9ucy4gIElmIG9wdGlvbiBpcyBzcGVjaWZpZWQgd2l0aCBubyB2YWx1ZSwgdGhlbiB0aGUKLW1ldGhvZCByZXR1cm5zIGEgbGlzdCBkZXNjcmliaW5nIHRoZSBvbmUgbmFtZWQgb3B0aW9uICh0aGlzIGxpc3Qgd2lsbAotYmUgaWRlbnRpY2FsIHRvIHRoZSBjb3JyZXNwb25kaW5nIHN1Ymxpc3Qgb2YgdGhlIHZhbHVlIHJldHVybmVkIGlmIG5vCi1vcHRpb24gaXMgc3BlY2lmaWVkKS4gIElmIG9uZSBvciBtb3JlIG9wdGlvbi12YWx1ZSBwYWlycyBhcmUKLXNwZWNpZmllZCwgdGhlbiB0aGUgbWV0aG9kIG1vZGlmaWVzIHRoZSBnaXZlbiBvcHRpb24ocykgdG8gaGF2ZSB0aGUKLWdpdmVuIHZhbHVlKHMpOyBpbiB0aGlzIGNhc2UgdGhlIG1ldGhvZCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy4KLU9wdGlvbiBtYXkgYmUgYW55IG9mIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXt0aXhfY2dldH17b3B0aW9ufQotUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgY29uZmlndXJhdGlvbiBvcHRpb24gZ2l2ZW4gYnkKLVx2YXJ7b3B0aW9ufS4gT3B0aW9uIG1heSBiZSBhbnkgb2YgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3RpeF9nZXRiaXRtYXB9e25hbWV9Ci1Mb2NhdGVzIGEgYml0bWFwIGZpbGUgb2YgdGhlIG5hbWUgXGNvZGV7bmFtZS54cG19IG9yIFxjb2Rle25hbWV9IGluCi1vbmUgb2YgdGhlIGJpdG1hcCBkaXJlY3RvcmllcyAoc2VlIHRoZSBcbWV0aG9ke3RpeF9hZGRiaXRtYXBkaXIoKX0KLW1ldGhvZCkuICBCeSB1c2luZyBcbWV0aG9ke3RpeF9nZXRiaXRtYXAoKX0sIHlvdSBjYW4gYXZvaWQgaGFyZAotY29kaW5nIHRoZSBwYXRobmFtZXMgb2YgdGhlIGJpdG1hcCBmaWxlcyBpbiB5b3VyIGFwcGxpY2F0aW9uLiBXaGVuCi1zdWNjZXNzZnVsLCBpdCByZXR1cm5zIHRoZSBjb21wbGV0ZSBwYXRobmFtZSBvZiB0aGUgYml0bWFwIGZpbGUsCi1wcmVmaXhlZCB3aXRoIHRoZSBjaGFyYWN0ZXIgXHNhbXB7QH0uICBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlIHVzZWQgdG8KLWNvbmZpZ3VyZSB0aGUgXGNvZGV7Yml0bWFwfSBvcHRpb24gb2YgdGhlIFRrIGFuZCBUaXggd2lkZ2V0cy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e3RpeF9hZGRiaXRtYXBkaXJ9e2RpcmVjdG9yeX0KLVRpeCBtYWludGFpbnMgYSBsaXN0IG9mIGRpcmVjdG9yaWVzIHVuZGVyIHdoaWNoIHRoZQotXG1ldGhvZHt0aXhfZ2V0aW1hZ2UoKX0gYW5kIFxtZXRob2R7dGl4X2dldGJpdG1hcCgpfSBtZXRob2RzIHdpbGwKLXNlYXJjaCBmb3IgaW1hZ2UgZmlsZXMuICBUaGUgc3RhbmRhcmQgYml0bWFwIGRpcmVjdG9yeSBpcwotXGZpbGV7XCRUSVhfTElCUkFSWS9iaXRtYXBzfS4gVGhlIFxtZXRob2R7dGl4X2FkZGJpdG1hcGRpcigpfSBtZXRob2QKLWFkZHMgXHZhcntkaXJlY3Rvcnl9IGludG8gdGhpcyBsaXN0LiBCeSB1c2luZyB0aGlzIG1ldGhvZCwgdGhlIGltYWdlCi1maWxlcyBvZiBhbiBhcHBsaWNhdGlvbnMgY2FuIGFsc28gYmUgbG9jYXRlZCB1c2luZyB0aGUKLVxtZXRob2R7dGl4X2dldGltYWdlKCl9IG9yIFxtZXRob2R7dGl4X2dldGJpdG1hcCgpfSBtZXRob2QuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXt0aXhfZmlsZWRpYWxvZ317XG9wdGlvbmFse2RsZ2NsYXNzfX0KLVJldHVybnMgdGhlIGZpbGUgc2VsZWN0aW9uIGRpYWxvZyB0aGF0IG1heSBiZSBzaGFyZWQgYW1vbmcgZGlmZmVyZW50Ci1jYWxscyBmcm9tIHRoaXMgYXBwbGljYXRpb24uICBUaGlzIG1ldGhvZCB3aWxsIGNyZWF0ZSBhIGZpbGUgc2VsZWN0aW9uCi1kaWFsb2cgd2lkZ2V0IHdoZW4gaXQgaXMgY2FsbGVkIHRoZSBmaXJzdCB0aW1lLiBUaGlzIGRpYWxvZyB3aWxsIGJlCi1yZXR1cm5lZCBieSBhbGwgc3Vic2VxdWVudCBjYWxscyB0byBcbWV0aG9ke3RpeF9maWxlZGlhbG9nKCl9LiAgQW4KLW9wdGlvbmFsIGRsZ2NsYXNzIHBhcmFtZXRlciBjYW4gYmUgcGFzc2VkIGFzIGEgc3RyaW5nIHRvIHNwZWNpZmllZAotd2hhdCB0eXBlIG9mIGZpbGUgc2VsZWN0aW9uIGRpYWxvZyB3aWRnZXQgaXMgZGVzaXJlZC4gIFBvc3NpYmxlCi1vcHRpb25zIGFyZSBcY29kZXt0aXh9LCBcY29kZXtGaWxlU2VsZWN0RGlhbG9nfSBvcgotXGNvZGV7dGl4RXhGaWxlU2VsZWN0RGlhbG9nfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cYmVnaW57bWV0aG9kZGVzY317dGl4X2dldGltYWdlfXtzZWxmLCBuYW1lfQotTG9jYXRlcyBhbiBpbWFnZSBmaWxlIG9mIHRoZSBuYW1lIFxmaWxle25hbWUueHBtfSwgXGZpbGV7bmFtZS54Ym19IG9yCi1cZmlsZXtuYW1lLnBwbX0gaW4gb25lIG9mIHRoZSBiaXRtYXAgZGlyZWN0b3JpZXMgKHNlZSB0aGUKLVxtZXRob2R7dGl4X2FkZGJpdG1hcGRpcigpfSBtZXRob2QgYWJvdmUpLiBJZiBtb3JlIHRoYW4gb25lIGZpbGUgd2l0aAotdGhlIHNhbWUgbmFtZSAoYnV0IGRpZmZlcmVudCBleHRlbnNpb25zKSBleGlzdCwgdGhlbiB0aGUgaW1hZ2UgdHlwZSBpcwotY2hvc2VuIGFjY29yZGluZyB0byB0aGUgZGVwdGggb2YgdGhlIFggZGlzcGxheTogeGJtIGltYWdlcyBhcmUgY2hvc2VuCi1vbiBtb25vY2hyb21lIGRpc3BsYXlzIGFuZCBjb2xvciBpbWFnZXMgYXJlIGNob3NlbiBvbiBjb2xvcgotZGlzcGxheXMuIEJ5IHVzaW5nIFxtZXRob2R7dGl4X2dldGltYWdlKCl9LCB5b3UgY2FuIGF2b2lkIGhhcmQgY29kaW5nCi10aGUgcGF0aG5hbWVzIG9mIHRoZSBpbWFnZSBmaWxlcyBpbiB5b3VyIGFwcGxpY2F0aW9uLiBXaGVuIHN1Y2Nlc3NmdWwsCi10aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBuZXdseSBjcmVhdGVkIGltYWdlLCB3aGljaCBjYW4gYmUKLXVzZWQgdG8gY29uZmlndXJlIHRoZSBcY29kZXtpbWFnZX0gb3B0aW9uIG9mIHRoZSBUayBhbmQgVGl4IHdpZGdldHMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXt0aXhfb3B0aW9uX2dldH17bmFtZX0KLUdldHMgdGhlIG9wdGlvbnMgbWFpbnRhaW5lZCBieSB0aGUgVGl4IHNjaGVtZSBtZWNoYW5pc20uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXt0aXhfcmVzZXRvcHRpb25zfXtuZXdTY2hlbWUsIG5ld0ZvbnRTZXRcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1NjbVByaW99fQotUmVzZXRzIHRoZSBzY2hlbWUgYW5kIGZvbnRzZXQgb2YgdGhlIFRpeCBhcHBsaWNhdGlvbiB0bwotXHZhcntuZXdTY2hlbWV9IGFuZCBcdmFye25ld0ZvbnRTZXR9LCByZXNwZWN0aXZlbHkuICBUaGlzIGFmZmVjdHMgb25seQotdGhvc2Ugd2lkZ2V0cyBjcmVhdGVkIGFmdGVyIHRoaXMgY2FsbC4gIFRoZXJlZm9yZSwgaXQgaXMgYmVzdCB0byBjYWxsCi10aGUgcmVzZXRvcHRpb25zIG1ldGhvZCBiZWZvcmUgdGhlIGNyZWF0aW9uIG9mIGFueSB3aWRnZXRzIGluIGEgVGl4Ci1hcHBsaWNhdGlvbi4KLQotVGhlIG9wdGlvbmFsIHBhcmFtZXRlciBcdmFye25ld1NjbVByaW99IGNhbiBiZSBnaXZlbiB0byByZXNldCB0aGUKLXByaW9yaXR5IGxldmVsIG9mIHRoZSBUayBvcHRpb25zIHNldCBieSB0aGUgVGl4IHNjaGVtZXMuCi0KLUJlY2F1c2Ugb2YgdGhlIHdheSBUayBoYW5kbGVzIHRoZSBYIG9wdGlvbiBkYXRhYmFzZSwgYWZ0ZXIgVGl4IGhhcwotYmVlbiBoYXMgaW1wb3J0ZWQgYW5kIGluaXRlZCwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJlc2V0IHRoZSBjb2xvcgotc2NoZW1lcyBhbmQgZm9udCBzZXRzIHVzaW5nIHRoZSBcbWV0aG9ke3RpeF9jb25maWcoKX0gbWV0aG9kLgotSW5zdGVhZCwgdGhlIFxtZXRob2R7dGl4X3Jlc2V0b3B0aW9ucygpfSBtZXRob2QgbXVzdCBiZSB1c2VkLgotXGVuZHttZXRob2RkZXNjfQotCi0KLQotXHNlY3Rpb257XG1vZHVsZXtTY3JvbGxlZFRleHR9IC0tLQotICAgICAgICAgU2Nyb2xsZWQgVGV4dCBXaWRnZXR9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtTY3JvbGxlZFRleHR9Ci0gICBccGxhdGZvcm17VGt9Ci1cbW9kdWxlc3lub3BzaXN7VGV4dCB3aWRnZXQgd2l0aCBhIHZlcnRpY2FsIHNjcm9sbCBiYXIufQotXHNlY3Rpb25hdXRob3J7RnJlZCBMLiBEcmFrZSwgSnIufXtmZHJha2VAYWNtLm9yZ30KLQotVGhlIFxtb2R1bGV7U2Nyb2xsZWRUZXh0fSBtb2R1bGUgcHJvdmlkZXMgYSBjbGFzcyBvZiB0aGUgc2FtZSBuYW1lCi13aGljaCBpbXBsZW1lbnRzIGEgYmFzaWMgdGV4dCB3aWRnZXQgd2hpY2ggaGFzIGEgdmVydGljYWwgc2Nyb2xsIGJhcgotY29uZmlndXJlZCB0byBkbyB0aGUgYGByaWdodCB0aGluZy4nJyAgVXNpbmcgdGhlIFxjbGFzc3tTY3JvbGxlZFRleHR9Ci1jbGFzcyBpcyBhIGxvdCBlYXNpZXIgdGhhbiBzZXR0aW5nIHVwIGEgdGV4dCB3aWRnZXQgYW5kIHNjcm9sbCBiYXIKLWRpcmVjdGx5LiAgVGhlIGNvbnN0cnVjdG9yIGlzIHRoZSBzYW1lIGFzIHRoYXQgb2YgdGhlCi1cY2xhc3N7VGtpbnRlci5UZXh0fSBjbGFzcy4KLQotVGhlIHRleHQgd2lkZ2V0IGFuZCBzY3JvbGxiYXIgYXJlIHBhY2tlZCB0b2dldGhlciBpbiBhIFxjbGFzc3tGcmFtZX0sCi1hbmQgdGhlIG1ldGhvZHMgb2YgdGhlIFxjbGFzc3tHcmlkfSBhbmQgXGNsYXNze1BhY2t9IGdlb21ldHJ5IG1hbmFnZXJzCi1hcmUgYWNxdWlyZWQgZnJvbSB0aGUgXGNsYXNze0ZyYW1lfSBvYmplY3QuICBUaGlzIGFsbG93cyB0aGUKLVxjbGFzc3tTY3JvbGxlZFRleHR9IHdpZGdldCB0byBiZSB1c2VkIGRpcmVjdGx5IHRvIGFjaGlldmUgbW9zdCBub3JtYWwKLWdlb21ldHJ5IG1hbmFnZW1lbnQgYmVoYXZpb3IuCi0KLVNob3VsZCBtb3JlIHNwZWNpZmljIGNvbnRyb2wgYmUgbmVjZXNzYXJ5LCB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMKLWFyZSBhdmFpbGFibGU6Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtTY3JvbGxlZFRleHRde2ZyYW1lfQotICBUaGUgZnJhbWUgd2hpY2ggc3Vycm91bmRzIHRoZSB0ZXh0IGFuZCBzY3JvbGwgYmFyIHdpZGdldHMuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtTY3JvbGxlZFRleHRde3ZiYXJ9Ci0gIFRoZSBzY3JvbGwgYmFyIHdpZGdldC4KLVxlbmR7bWVtYmVyZGVzY30KLQotCi1caW5wdXR7bGlidHVydGxlfQotCi0KLVxzZWN0aW9ue0lkbGUgXGxhYmVse2lkbGV9fQotCi0lXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2lkbGV9Ci0lXG1vZHVsZXN5bm9wc2lze0EgUHl0aG9uIEludGVncmF0ZWQgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnR9Ci1cbW9kdWxlYXV0aG9ye0d1aWRvIHZhbiBSb3NzdW19e2d1aWRvQFB5dGhvbi5vcmd9Ci0KLUlkbGUgaXMgdGhlIFB5dGhvbiBJREUgYnVpbHQgd2l0aCB0aGUgXHJlZm1vZHVsZXtUa2ludGVyfSBHVUkgdG9vbGtpdC4gIAotXGluZGV4e0lkbGV9Ci1caW5kZXh7UHl0aG9uIEVkaXRvcn0KLVxpbmRleHtJbnRlZ3JhdGVkIERldmVsb3BtZW50IEVudmlyb25tZW50fQotCi0KLUlETEUgaGFzIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXM6Ci0KLVxiZWdpbntpdGVtaXplfQotXGl0ZW0gICBjb2RlZCBpbiAxMDBcJSBwdXJlIFB5dGhvbiwgdXNpbmcgdGhlIFxyZWZtb2R1bGV7VGtpbnRlcn0gR1VJIHRvb2xraXQKLQotXGl0ZW0gICBjcm9zcy1wbGF0Zm9ybTogd29ya3Mgb24gV2luZG93cyBhbmQgXFVOSVh7fSAob24gTWFjIE9TLCB0aGVyZSBhcmUKLWN1cnJlbnRseSBwcm9ibGVtcyB3aXRoIFRjbC9UaykKLQotXGl0ZW0gICBtdWx0aS13aW5kb3cgdGV4dCBlZGl0b3Igd2l0aCBtdWx0aXBsZSB1bmRvLCBQeXRob24gY29sb3JpemluZwotYW5kIG1hbnkgb3RoZXIgZmVhdHVyZXMsIGUuZy4gc21hcnQgaW5kZW50IGFuZCBjYWxsIHRpcHMKLQotXGl0ZW0gICBQeXRob24gc2hlbGwgd2luZG93IChhLmsuYS4gaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIpCi0KLVxpdGVtICAgZGVidWdnZXIgKG5vdCBjb21wbGV0ZSwgYnV0IHlvdSBjYW4gc2V0IGJyZWFrcG9pbnRzLCB2aWV3ICBhbmQgc3RlcCkKLVxlbmR7aXRlbWl6ZX0KLQotCi1cc3Vic2VjdGlvbntNZW51c30KLQotXHN1YnN1YnNlY3Rpb257RmlsZSBtZW51fQotCi1cYmVnaW57ZGVzY3JpcHRpb259Ci1caXRlbVtOZXcgd2luZG93XSAgICAgY3JlYXRlIGEgbmV3IGVkaXRpbmcgd2luZG93Ci1caXRlbVtPcGVuLi4uXSAgICAgICAgb3BlbiBhbiBleGlzdGluZyBmaWxlCi1caXRlbVtPcGVuIG1vZHVsZS4uLl0gb3BlbiBhbiBleGlzdGluZyBtb2R1bGUgKHNlYXJjaGVzIHN5cy5wYXRoKQotXGl0ZW1bQ2xhc3MgYnJvd3Nlcl0gIHNob3cgY2xhc3NlcyBhbmQgbWV0aG9kcyBpbiBjdXJyZW50IGZpbGUKLVxpdGVtW1BhdGggYnJvd3Nlcl0gICBzaG93IHN5cy5wYXRoIGRpcmVjdG9yaWVzLCBtb2R1bGVzLCBjbGFzc2VzIGFuZCBtZXRob2RzCi1cZW5ke2Rlc2NyaXB0aW9ufQotXGluZGV4e0NsYXNzIGJyb3dzZXJ9Ci1caW5kZXh7UGF0aCBicm93c2VyfQotCi1cYmVnaW57ZGVzY3JpcHRpb259Ci1caXRlbVtTYXZlXSAgIHNhdmUgY3VycmVudCB3aW5kb3cgdG8gdGhlIGFzc29jaWF0ZWQgZmlsZSAodW5zYXZlZAotd2luZG93cyBoYXZlIGEgKiBiZWZvcmUgYW5kIGFmdGVyIHRoZSB3aW5kb3cgdGl0bGUpCi0KLVxpdGVtW1NhdmUgQXMuLi5dICAgICBzYXZlIGN1cnJlbnQgd2luZG93IHRvIG5ldyBmaWxlLCB3aGljaCBiZWNvbWVzCi10aGUgYXNzb2NpYXRlZCBmaWxlCi1caXRlbVtTYXZlIENvcHkgQXMuLi5dICAgICAgICBzYXZlIGN1cnJlbnQgd2luZG93IHRvIGRpZmZlcmVudCBmaWxlCi13aXRob3V0IGNoYW5naW5nIHRoZSBhc3NvY2lhdGVkIGZpbGUKLVxlbmR7ZGVzY3JpcHRpb259Ci0KLVxiZWdpbntkZXNjcmlwdGlvbn0KLVxpdGVtW0Nsb3NlXSAgY2xvc2UgY3VycmVudCB3aW5kb3cgKGFza3MgdG8gc2F2ZSBpZiB1bnNhdmVkKQotXGl0ZW1bRXhpdF0gICBjbG9zZSBhbGwgd2luZG93cyBhbmQgcXVpdCBJRExFIChhc2tzIHRvIHNhdmUgaWYgdW5zYXZlZCkKLVxlbmR7ZGVzY3JpcHRpb259Ci0KLQotXHN1YnN1YnNlY3Rpb257RWRpdCBtZW51fQotCi1cYmVnaW57ZGVzY3JpcHRpb259Ci1caXRlbVtVbmRvXSAgIFVuZG8gbGFzdCBjaGFuZ2UgdG8gY3VycmVudCB3aW5kb3cgKG1heCAxMDAwIGNoYW5nZXMpCi1caXRlbVtSZWRvXSAgIFJlZG8gbGFzdCB1bmRvbmUgY2hhbmdlIHRvIGN1cnJlbnQgd2luZG93Ci1cZW5ke2Rlc2NyaXB0aW9ufQotCi1cYmVnaW57ZGVzY3JpcHRpb259Ci1caXRlbVtDdXRdICAgIENvcHkgc2VsZWN0aW9uIGludG8gc3lzdGVtLXdpZGUgY2xpcGJvYXJkOyB0aGVuIGRlbGV0ZSBzZWxlY3Rpb24KLVxpdGVtW0NvcHldICAgQ29weSBzZWxlY3Rpb24gaW50byBzeXN0ZW0td2lkZSBjbGlwYm9hcmQKLVxpdGVtW1Bhc3RlXSAgSW5zZXJ0IHN5c3RlbS13aWRlIGNsaXBib2FyZCBpbnRvIHdpbmRvdwotXGl0ZW1bU2VsZWN0IEFsbF0gICAgIFNlbGVjdCB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBlZGl0IGJ1ZmZlcgotXGVuZHtkZXNjcmlwdGlvbn0KLQotXGJlZ2lue2Rlc2NyaXB0aW9ufQotXGl0ZW1bRmluZC4uLl0gICAgICAgIE9wZW4gYSBzZWFyY2ggZGlhbG9nIGJveCB3aXRoIG1hbnkgb3B0aW9ucwotXGl0ZW1bRmluZCBhZ2Fpbl0gICAgIFJlcGVhdCBsYXN0IHNlYXJjaAotXGl0ZW1bRmluZCBzZWxlY3Rpb25dIFNlYXJjaCBmb3IgdGhlIHN0cmluZyBpbiB0aGUgc2VsZWN0aW9uCi1caXRlbVtGaW5kIGluIEZpbGVzLi4uXSAgICAgICBPcGVuIGEgc2VhcmNoIGRpYWxvZyBib3ggZm9yIHNlYXJjaGluZyBmaWxlcwotXGl0ZW1bUmVwbGFjZS4uLl0gICAgIE9wZW4gYSBzZWFyY2gtYW5kLXJlcGxhY2UgZGlhbG9nIGJveAotXGl0ZW1bR28gdG8gbGluZV0gICAgIEFzayBmb3IgYSBsaW5lIG51bWJlciBhbmQgc2hvdyB0aGF0IGxpbmUKLVxlbmR7ZGVzY3JpcHRpb259Ci0KLVxiZWdpbntkZXNjcmlwdGlvbn0KLVxpdGVtW0luZGVudCByZWdpb25dICBTaGlmdCBzZWxlY3RlZCBsaW5lcyByaWdodCA0IHNwYWNlcwotXGl0ZW1bRGVkZW50IHJlZ2lvbl0gIFNoaWZ0IHNlbGVjdGVkIGxpbmVzIGxlZnQgNCBzcGFjZXMKLVxpdGVtW0NvbW1lbnQgb3V0IHJlZ2lvbl0gICAgIEluc2VydCBcI1wjIGluIGZyb250IG9mIHNlbGVjdGVkIGxpbmVzCi1caXRlbVtVbmNvbW1lbnQgcmVnaW9uXSAgICAgICBSZW1vdmUgbGVhZGluZyBcIyBvciBcI1wjIGZyb20gc2VsZWN0ZWQgbGluZXMKLVxpdGVtW1RhYmlmeSByZWdpb25dICBUdXJucyBcZW1waHtsZWFkaW5nfSBzdHJldGNoZXMgb2Ygc3BhY2VzIGludG8gdGFicwotXGl0ZW1bVW50YWJpZnkgcmVnaW9uXSAgICAgICAgVHVybiBcZW1waHthbGx9IHRhYnMgaW50byB0aGUgcmlnaHQgbnVtYmVyIG9mIHNwYWNlcwotXGl0ZW1bRXhwYW5kIHdvcmRdICAgIEV4cGFuZCB0aGUgd29yZCB5b3UgaGF2ZSB0eXBlZCB0byBtYXRjaCBhbm90aGVyCi0gICAgICAgICAgICAgICAgd29yZCBpbiB0aGUgc2FtZSBidWZmZXI7IHJlcGVhdCB0byBnZXQgYSBkaWZmZXJlbnQgZXhwYW5zaW9uCi1caXRlbVtGb3JtYXQgUGFyYWdyYXBoXSAgICAgICBSZWZvcm1hdCB0aGUgY3VycmVudCBibGFuay1saW5lLXNlcGFyYXRlZCBwYXJhZ3JhcGgKLVxlbmR7ZGVzY3JpcHRpb259Ci0KLVxiZWdpbntkZXNjcmlwdGlvbn0KLVxpdGVtW0ltcG9ydCBtb2R1bGVdICBJbXBvcnQgb3IgcmVsb2FkIHRoZSBjdXJyZW50IG1vZHVsZQotXGl0ZW1bUnVuIHNjcmlwdF0gICAgIEV4ZWN1dGUgdGhlIGN1cnJlbnQgZmlsZSBpbiB0aGUgX19tYWluX18gbmFtZXNwYWNlCi1cZW5ke2Rlc2NyaXB0aW9ufQotCi1caW5kZXh7SW1wb3J0IG1vZHVsZX0KLVxpbmRleHtSdW4gc2NyaXB0fQotCi0KLVxzdWJzdWJzZWN0aW9ue1dpbmRvd3MgbWVudX0KLQotXGJlZ2lue2Rlc2NyaXB0aW9ufQotXGl0ZW1bWm9vbSBIZWlnaHRdICAgIHRvZ2dsZXMgdGhlIHdpbmRvdyBiZXR3ZWVuIG5vcm1hbCBzaXplICgyNHg4MCkKLSAgICAgICAgYW5kIG1heGltdW0gaGVpZ2h0LgotXGVuZHtkZXNjcmlwdGlvbn0KLQotVGhlIHJlc3Qgb2YgdGhpcyBtZW51IGxpc3RzIHRoZSBuYW1lcyBvZiBhbGwgb3BlbiB3aW5kb3dzOyBzZWxlY3Qgb25lCi10byBicmluZyBpdCB0byB0aGUgZm9yZWdyb3VuZCAoZGVpY29uaWZ5aW5nIGl0IGlmIG5lY2Vzc2FyeSkuCi0KLQotXHN1YnN1YnNlY3Rpb257RGVidWcgbWVudSAoaW4gdGhlIFB5dGhvbiBTaGVsbCB3aW5kb3cgb25seSl9Ci0KLVxiZWdpbntkZXNjcmlwdGlvbn0KLVxpdGVtW0dvIHRvIGZpbGUvbGluZV0gICAgICAgIGxvb2sgYXJvdW5kIHRoZSBpbnNlcnQgcG9pbnQgZm9yIGEgZmlsZW5hbWUKLSAgICAgICAgICAgICAgICBhbmQgbGluZW51bWJlciwgb3BlbiB0aGUgZmlsZSwgYW5kIHNob3cgdGhlIGxpbmUuCi1caXRlbVtPcGVuIHN0YWNrIHZpZXdlcl0gICAgICBzaG93IHRoZSBzdGFjayB0cmFjZWJhY2sgb2YgdGhlIGxhc3QgZXhjZXB0aW9uCi1caXRlbVtEZWJ1Z2dlciB0b2dnbGVdICAgICAgICBSdW4gY29tbWFuZHMgaW4gdGhlIHNoZWxsIHVuZGVyIHRoZSBkZWJ1Z2dlcgotXGl0ZW1bSklUIFN0YWNrIHZpZXdlciB0b2dnbGVdICAgICAgICBPcGVuIHN0YWNrIHZpZXdlciBvbiB0cmFjZWJhY2sKLVxlbmR7ZGVzY3JpcHRpb259Ci0KLVxpbmRleHtzdGFjayB2aWV3ZXJ9Ci1caW5kZXh7ZGVidWdnZXJ9Ci0KLQotXHN1YnNlY3Rpb257QmFzaWMgZWRpdGluZyBhbmQgbmF2aWdhdGlvbn0KLQotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSAgIFxrYmR7QmFja3NwYWNlfSBkZWxldGVzIHRvIHRoZSBsZWZ0OyBca2Jke0RlbH0gZGVsZXRlcyB0byB0aGUgcmlnaHQKLVxpdGVtICAgQXJyb3cga2V5cyBhbmQgXGtiZHtQYWdlIFVwfS9ca2Jke1BhZ2UgRG93bn0gdG8gbW92ZSBhcm91bmQKLVxpdGVtICAgXGtiZHtIb21lfS9ca2Jke0VuZH0gZ28gdG8gYmVnaW4vZW5kIG9mIGxpbmUKLVxpdGVtICAgXGtiZHtDLUhvbWV9L1xrYmR7Qy1FbmR9IGdvIHRvIGJlZ2luL2VuZCBvZiBmaWxlCi1caXRlbSAgIFNvbWUgXHByb2dyYW17RW1hY3N9IGJpbmRpbmdzIG1heSBhbHNvIHdvcmssIGluY2x1ZGluZyBca2Jke0MtQn0sCi0gICAgICAgIFxrYmR7Qy1QfSwgXGtiZHtDLUF9LCBca2Jke0MtRX0sIFxrYmR7Qy1EfSwgXGtiZHtDLUx9Ci1cZW5ke2l0ZW1pemV9Ci0KLQotXHN1YnN1YnNlY3Rpb257QXV0b21hdGljIGluZGVudGF0aW9ufQotCi1BZnRlciBhIGJsb2NrLW9wZW5pbmcgc3RhdGVtZW50LCB0aGUgbmV4dCBsaW5lIGlzIGluZGVudGVkIGJ5IDQgc3BhY2VzCi0oaW4gdGhlIFB5dGhvbiBTaGVsbCB3aW5kb3cgYnkgb25lIHRhYikuICBBZnRlciBjZXJ0YWluIGtleXdvcmRzCi0oYnJlYWssIHJldHVybiBldGMuKSB0aGUgbmV4dCBsaW5lIGlzIGRlZGVudGVkLiAgSW4gbGVhZGluZwotaW5kZW50YXRpb24sIFxrYmR7QmFja3NwYWNlfSBkZWxldGVzIHVwIHRvIDQgc3BhY2VzIGlmIHRoZXkgYXJlIHRoZXJlLgotXGtiZHtUYWJ9IGluc2VydHMgMS00IHNwYWNlcyAoaW4gdGhlIFB5dGhvbiBTaGVsbCB3aW5kb3cgb25lIHRhYikuCi1TZWUgYWxzbyB0aGUgaW5kZW50L2RlZGVudCByZWdpb24gY29tbWFuZHMgaW4gdGhlIGVkaXQgbWVudS4KLQotCi1cc3Vic3Vic2VjdGlvbntQeXRob24gU2hlbGwgd2luZG93fQotCi1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtICAgXGtiZHtDLUN9IGludGVycnVwdHMgZXhlY3V0aW5nIGNvbW1hbmQKLVxpdGVtICAgXGtiZHtDLUR9IHNlbmRzIGVuZC1vZi1maWxlOyBjbG9zZXMgd2luZG93IGlmIHR5cGVkIGF0Ci1hIFxzYW1wez4+Pn59IHByb21wdAotXGVuZHtpdGVtaXplfQotCi1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtICAgXGtiZHtBbHQtcH0gcmV0cmlldmVzIHByZXZpb3VzIGNvbW1hbmQgbWF0Y2hpbmcgd2hhdCB5b3UgaGF2ZSB0eXBlZAotXGl0ZW0gICBca2Jke0FsdC1ufSByZXRyaWV2ZXMgbmV4dAotXGl0ZW0gICBca2Jke1JldHVybn0gd2hpbGUgb24gYW55IHByZXZpb3VzIGNvbW1hbmQgcmV0cmlldmVzIHRoYXQgY29tbWFuZAotXGl0ZW0gICBca2Jke0FsdC0vfSAoRXhwYW5kIHdvcmQpIGlzIGFsc28gdXNlZnVsIGhlcmUKLVxlbmR7aXRlbWl6ZX0KLQotXGluZGV4e2luZGVudGF0aW9ufQotCi0KLVxzdWJzZWN0aW9ue1N5bnRheCBjb2xvcnN9Ci0KLVRoZSBjb2xvcmluZyBpcyBhcHBsaWVkIGluIGEgYmFja2dyb3VuZCBgYHRocmVhZCwnJyBzbyB5b3UgbWF5Ci1vY2Nhc2lvbmFsbHkgc2VlIHVuY29sb3JpemVkIHRleHQuICBUbyBjaGFuZ2UgdGhlIGNvbG9yCi1zY2hlbWUsIGVkaXQgdGhlIFxjb2Rle1tDb2xvcnNdfSBzZWN0aW9uIGluIFxmaWxle2NvbmZpZy50eHR9LgotCi1cYmVnaW57ZGVzY3JpcHRpb259Ci1caXRlbVtQeXRob24gc3ludGF4IGNvbG9yczpdCi0KLVxiZWdpbntkZXNjcmlwdGlvbn0KLVxpdGVtW0tleXdvcmRzXSAgICAgICBvcmFuZ2UKLVxpdGVtW1N0cmluZ3MgXSAgICAgICBncmVlbgotXGl0ZW1bQ29tbWVudHNdICAgICAgIHJlZAotXGl0ZW1bRGVmaW5pdGlvbnNdICAgIGJsdWUKLVxlbmR7ZGVzY3JpcHRpb259Ci0KLVxpdGVtW1NoZWxsIGNvbG9yczpdCi1cYmVnaW57ZGVzY3JpcHRpb259Ci1caXRlbVtDb25zb2xlIG91dHB1dF0gYnJvd24KLVxpdGVtW3N0ZG91dF0gICAgICAgICBibHVlCi1caXRlbVtzdGRlcnJdICAgICAgIGRhcmsgZ3JlZW4KLVxpdGVtW3N0ZGluXSAgICAgICBibGFjawotXGVuZHtkZXNjcmlwdGlvbn0KLVxlbmR7ZGVzY3JpcHRpb259Ci0KLQotXHN1YnN1YnNlY3Rpb257Q29tbWFuZCBsaW5lIHVzYWdlfQotCi1cYmVnaW57dmVyYmF0aW19Ci1pZGxlLnB5IFstYyBjb21tYW5kXSBbLWRdIFstZV0gWy1zXSBbLXQgdGl0bGVdIFthcmddIC4uLgotCi0tYyBjb21tYW5kICBydW4gdGhpcyBjb21tYW5kCi0tZCAgICAgICAgICBlbmFibGUgZGVidWdnZXIKLS1lICAgICAgICAgIGVkaXQgbW9kZTsgYXJndW1lbnRzIGFyZSBmaWxlcyB0byBiZSBlZGl0ZWQKLS1zICAgICAgICAgIHJ1biAkSURMRVNUQVJUVVAgb3IgJFBZVEhPTlNUQVJUVVAgZmlyc3QKLS10IHRpdGxlICAgIHNldCB0aXRsZSBvZiBzaGVsbCB3aW5kb3cKLVxlbmR7dmVyYmF0aW19Ci0KLUlmIHRoZXJlIGFyZSBhcmd1bWVudHM6Ci0KLVxiZWdpbntlbnVtZXJhdGV9Ci1caXRlbSAgIElmIFxwcm9ncmFtb3B0ey1lfSBpcyB1c2VkLCBhcmd1bWVudHMgYXJlIGZpbGVzIG9wZW5lZCBmb3IKLSAgICAgICAgZWRpdGluZyBhbmQgXGNvZGV7c3lzLmFyZ3Z9IHJlZmxlY3RzIHRoZSBhcmd1bWVudHMgcGFzc2VkIHRvCi0gICAgICAgIElETEUgaXRzZWxmLgotCi1caXRlbSAgIE90aGVyd2lzZSwgaWYgXHByb2dyYW1vcHR7LWN9IGlzIHVzZWQsIGFsbCBhcmd1bWVudHMgYXJlCi0gICAgICAgIHBsYWNlZCBpbiBcY29kZXtzeXMuYXJndlsxOi4uLl19LCB3aXRoIFxjb2Rle3N5cy5hcmd2WzBdfSBzZXQKLSAgICAgICAgdG8gXGNvZGV7Jy1jJ30uCi0KLVxpdGVtICAgT3RoZXJ3aXNlLCBpZiBuZWl0aGVyIFxwcm9ncmFtb3B0ey1lfSBub3IgXHByb2dyYW1vcHR7LWN9IGlzCi0gICAgICAgIHVzZWQsIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBhIHNjcmlwdCB3aGljaCBpcyBleGVjdXRlZCB3aXRoCi0gICAgICAgIHRoZSByZW1haW5pbmcgYXJndW1lbnRzIGluIFxjb2Rle3N5cy5hcmd2WzE6Li4uXX0gIGFuZAotICAgICAgICBcY29kZXtzeXMuYXJndlswXX0gc2V0IHRvIHRoZSBzY3JpcHQgbmFtZS4gIElmIHRoZSBzY3JpcHQgbmFtZQotICAgICAgICBpcyAnLScsIG5vIHNjcmlwdCBpcyBleGVjdXRlZCBidXQgYW4gaW50ZXJhY3RpdmUgUHl0aG9uCi0gICAgICAgIHNlc3Npb24gaXMgc3RhcnRlZDsgdGhlIGFyZ3VtZW50cyBhcmUgc3RpbGwgYXZhaWxhYmxlIGluCi0gICAgICAgIFxjb2Rle3N5cy5hcmd2fS4KLVxlbmR7ZW51bWVyYXRlfQotCi0KLVxzZWN0aW9ue090aGVyIEdyYXBoaWNhbCBVc2VyIEludGVyZmFjZSBQYWNrYWdlcwotICAgICAgICAgXGxhYmVse290aGVyLWd1aS1wYWNrYWdlc319Ci0KLQotVGhlcmUgYXJlIGFuIG51bWJlciBvZiBleHRlbnNpb24gd2lkZ2V0IHNldHMgdG8gXHJlZm1vZHVsZXtUa2ludGVyfS4KLQotXGJlZ2lue3NlZWFsc28qfQotXHNlZXRpdGxlW2h0dHA6Ly9wbXcuc291cmNlZm9yZ2UubmV0L117UHl0aG9uIG1lZ2F3aWRnZXRzfXtpcyBhCi10b29sa2l0IGZvciBidWlsZGluZyBoaWdoLWxldmVsIGNvbXBvdW5kIHdpZGdldHMgaW4gUHl0aG9uIHVzaW5nIHRoZQotXHJlZm1vZHVsZXtUa2ludGVyfSBtb2R1bGUuICBJdCBjb25zaXN0cyBvZiBhIHNldCBvZiBiYXNlIGNsYXNzZXMgYW5kCi1hIGxpYnJhcnkgb2YgZmxleGlibGUgYW5kIGV4dGVuc2libGUgbWVnYXdpZGdldHMgYnVpbHQgb24gdGhpcwotZm91bmRhdGlvbi4gVGhlc2UgbWVnYXdpZGdldHMgaW5jbHVkZSBub3RlYm9va3MsIGNvbWJvYm94ZXMsIHNlbGVjdGlvbgotd2lkZ2V0cywgcGFuZWQgd2lkZ2V0cywgc2Nyb2xsZWQgd2lkZ2V0cywgZGlhbG9nIHdpbmRvd3MsIGV0Yy4gIEFsc28sCi13aXRoIHRoZSBQbXcuQmx0IGludGVyZmFjZSB0byBCTFQsIHRoZSBidXN5LCBncmFwaCwgc3RyaXBjaGFydCwgdGFic2V0Ci1hbmQgdmVjdG9yIGNvbW1hbmRzIGFyZSBiZSBhdmFpbGFibGUuCi0KLVRoZSBpbml0aWFsIGlkZWFzIGZvciBQbXcgd2VyZSB0YWtlbiBmcm9tIHRoZSBUayBcY29kZXtpdGNsfQotZXh0ZW5zaW9ucyBcY29kZXtbaW5jciBUa119IGJ5IE1pY2hhZWwgTWNMZW5uYW4gYW5kIFxjb2Rle1tpbmNyCi1XaWRnZXRzXX0gYnkgTWFyayBVbGZlcnRzLiBTZXZlcmFsIG9mIHRoZSBtZWdhd2lkZ2V0cyBhcmUgZGlyZWN0Ci10cmFuc2xhdGlvbnMgZnJvbSB0aGUgaXRjbCB0byBQeXRob24uIEl0IG9mZmVycyBtb3N0IG9mIHRoZSByYW5nZSBvZgotd2lkZ2V0cyB0aGF0IFxjb2Rle1tpbmNyIFdpZGdldHNdfSBkb2VzLCBhbmQgaXMgYWxtb3N0IGFzIGNvbXBsZXRlIGFzCi1UaXgsIGxhY2tpbmcgaG93ZXZlciBUaXgncyBmYXN0IFxjbGFzc3tITGlzdH0gd2lkZ2V0IGZvciBkcmF3aW5nIHRyZWVzLgotfQotCi1cc2VldGl0bGVbaHR0cDovL3RraW50ZXIuZWZmYm90Lm9yZy9de1RraW50ZXIzMDAwIFdpZGdldCBDb25zdHJ1Y3Rpb24KLSAgICAgICAgICBLaXQgKFdDSyl9eyUKLWlzIGEgbGlicmFyeSB0aGF0IGFsbG93cyB5b3UgdG8gd3JpdGUgbmV3IFRraW50ZXIgd2lkZ2V0cyBpbiBwdXJlCi1QeXRob24uICBUaGUgV0NLIGZyYW1ld29yayBnaXZlcyB5b3UgZnVsbCBjb250cm9sIG92ZXIgd2lkZ2V0Ci1jcmVhdGlvbiwgY29uZmlndXJhdGlvbiwgc2NyZWVuIGFwcGVhcmFuY2UsIGFuZCBldmVudCBoYW5kbGluZy4gIFdDSwotd2lkZ2V0cyBjYW4gYmUgdmVyeSBmYXN0IGFuZCBsaWdodC13ZWlnaHQsIHNpbmNlIHRoZXkgY2FuIG9wZXJhdGUKLWRpcmVjdGx5IG9uIFB5dGhvbiBkYXRhIHN0cnVjdHVyZXMsIHdpdGhvdXQgaGF2aW5nIHRvIHRyYW5zZmVyIGRhdGEKLXRocm91Z2ggdGhlIFRrL1RjbCBsYXllci59Ci1cZW5ke3NlZWFsc28qfQotCi1PdGhlciBHVUkgcGFja2FnZXMgYXJlIGFsc28gYXZhaWxhYmxlIGZvciBQeXRob246Ci0KLVxiZWdpbntzZWVhbHNvKn0KLVxzZWV0aXRsZVtodHRwOi8vd3d3Lnd4cHl0aG9uLm9yZ117d3hQeXRob259ewotd3hQeXRob24gaXMgYSBjcm9zcy1wbGF0Zm9ybSBHVUkgdG9vbGtpdCBmb3IgUHl0aG9uIHRoYXQgaXMgYnVpbHQKLWFyb3VuZCB0aGUgcG9wdWxhciBcdWxpbmt7d3hXaWRnZXRzfXtodHRwOi8vd3d3Lnd4d2lkZ2V0cy5vcmcvfSBcQ3Bwe30KLXRvb2xraXQuIKBJdCBwcm92aWRlcyBhIG5hdGl2ZSBsb29rIGFuZCBmZWVsIGZvciBhcHBsaWNhdGlvbnMgb24KLVdpbmRvd3MsIE1hYyBPUyBYLCBhbmQgXFVOSVh7fSBzeXN0ZW1zIGJ5IHVzaW5nIGVhY2ggcGxhdGZvcm0ncyBuYXRpdmUKLXdpZGdldHMgd2hlcmUgZXZlciBwb3NzaWJsZSwgKEdUSysgb24gXFVOSVgtbGlrZSBzeXN0ZW1zKS4goEluCi1hZGRpdGlvbiB0byBhbiBleHRlbnNpdmUgc2V0IG9mIHdpZGdldHMsIHd4UHl0aG9uIHByb3ZpZGVzIGNsYXNzZXMgZm9yCi1vbmxpbmUgZG9jdW1lbnRhdGlvbiBhbmQgY29udGV4dCBzZW5zaXRpdmUgaGVscCwgcHJpbnRpbmcsIEhUTUwKLXZpZXdpbmcsIGxvdy1sZXZlbCBkZXZpY2UgY29udGV4dCBkcmF3aW5nLCBkcmFnIGFuZCBkcm9wLCBzeXN0ZW0KLWNsaXBib2FyZCBhY2Nlc3MsIGFuIFhNTC1iYXNlZCByZXNvdXJjZSBmb3JtYXQgYW5kIG1vcmUsIGluY2x1ZGluZyBhbgotZXZlciBncm93aW5nIGxpYnJhcnkgb2YgdXNlci1jb250cmlidXRlZCBtb2R1bGVzLiCgQm90aCB0aGUgd3hXaWRnZXRzCi1hbmQgd3hQeXRob24gcHJvamVjdHMgYXJlIHVuZGVyIGFjdGl2ZSBkZXZlbG9wbWVudCBhbmQgY29udGludW91cwotaW1wcm92ZW1lbnQsIGFuZCBoYXZlIGFjdGl2ZSBhbmQgaGVscGZ1bCB1c2VyIGFuZCBkZXZlbG9wZXIKLWNvbW11bml0aWVzLgotfQotXHNlZXRpdGxlW2h0dHA6Ly93d3cuYW1hem9uLmNvbS9leGVjL29iaWRvcy9BU0lOLzE5MzIzOTQ2MjFdCi17d3hQeXRob24gaW4gQWN0aW9ufXsKLVRoZSB3eFB5dGhvbiBib29rLCBieSBOb2VsIFJhcHBpbiBhbmQgUm9iaW4gRHVubi4KLX0KLVxzZWV0aXRsZXtQeVF0fXsKLVB5UXQgaXMgYSBccHJvZ3JhbXtzaXB9LXdyYXBwZWQgYmluZGluZyB0byB0aGUgUXQgdG9vbGtpdC4gIFF0IGlzIGFuCi1leHRlbnNpdmUgXENwcHt9IEdVSSB0b29sa2l0IHRoYXQgaXMgYXZhaWxhYmxlIGZvciBcVU5JWCwgV2luZG93cyBhbmQKLU1hYyBPUyBYLiAgXHByb2dyYW17c2lwfSBpcyBhIHRvb2wgZm9yIGdlbmVyYXRpbmcgYmluZGluZ3MgZm9yIFxDcHB7fQotbGlicmFyaWVzIGFzIFB5dGhvbiBjbGFzc2VzLCBhbmQgaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIGZvciBQeXRob24uCi1BbiBvbmxpbmUgbWFudWFsIGlzIGF2YWlsYWJsZSBhdAotXHVybHtodHRwOi8vd3d3Lm9wZW5kb2NzcHVibGlzaGluZy5jb20vcHlxdC99IChlcnJhdGEgYXJlIGxvY2F0ZWQgYXQKLVx1cmx7aHR0cDovL3d3dy52YWxkeWFzLm9yZy9weXRob24vYm9vay5odG1sfSkuIAotfQotXHNlZXRpdGxlW2h0dHA6Ly93d3cucml2ZXJiYW5rY29tcHV0aW5nLmNvLnVrL3B5a2RlL2luZGV4LnBocF17UHlLREV9ewotUHlLREUgaXMgYSBccHJvZ3JhbXtzaXB9LXdyYXBwZWQgaW50ZXJmYWNlIHRvIHRoZSBLREUgZGVza3RvcAotbGlicmFyaWVzLiAgS0RFIGlzIGEgZGVza3RvcCBlbnZpcm9ubWVudCBmb3IgXFVOSVh7fSBjb21wdXRlcnM7IHRoZQotZ3JhcGhpY2FsIGNvbXBvbmVudHMgYXJlIGJhc2VkIG9uIFF0LgotfQotXHNlZXRpdGxlW2h0dHA6Ly9meHB5LnNvdXJjZWZvcmdlLm5ldC9de0ZYUHl9ewotaXMgYSBQeXRob24gZXh0ZW5zaW9uIG1vZHVsZSB3aGljaCBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gdGhlIAotXGNpdGV0aXRsZVtodHRwOi8vd3d3LmNmZHJjLmNvbS9GT1gvZm94Lmh0bWxde0ZPWH0gR1VJLgotRk9YIGlzIGEgXENwcHt9IGJhc2VkIFRvb2xraXQgZm9yIGRldmVsb3BpbmcgR3JhcGhpY2FsIFVzZXIgSW50ZXJmYWNlcwotZWFzaWx5IGFuZCBlZmZlY3RpdmVseS4gSXQgb2ZmZXJzIGEgd2lkZSwgYW5kIGdyb3dpbmcsIGNvbGxlY3Rpb24gb2YKLUNvbnRyb2xzLCBhbmQgcHJvdmlkZXMgc3RhdGUgb2YgdGhlIGFydCBmYWNpbGl0aWVzIHN1Y2ggYXMgZHJhZyBhbmQKLWRyb3AsIHNlbGVjdGlvbiwgYXMgd2VsbCBhcyBPcGVuR0wgd2lkZ2V0cyBmb3IgM0QgZ3JhcGhpY2FsCi1tYW5pcHVsYXRpb24uICBGT1ggYWxzbyBpbXBsZW1lbnRzIGljb25zLCBpbWFnZXMsIGFuZCB1c2VyLWNvbnZlbmllbmNlCi1mZWF0dXJlcyBzdWNoIGFzIHN0YXR1cyBsaW5lIGhlbHAsIGFuZCB0b29sdGlwcy4gIAotCi1FdmVuIHRob3VnaCBGT1ggb2ZmZXJzIGEgbGFyZ2UgY29sbGVjdGlvbiBvZiBjb250cm9scyBhbHJlYWR5LCBGT1gKLWxldmVyYWdlcyBcQ3Bwe30gdG8gYWxsb3cgcHJvZ3JhbW1lcnMgdG8gZWFzaWx5IGJ1aWxkIGFkZGl0aW9uYWwgQ29udHJvbHMKLWFuZCBHVUkgZWxlbWVudHMsIHNpbXBseSBieSB0YWtpbmcgZXhpc3RpbmcgY29udHJvbHMsIGFuZCBjcmVhdGluZyBhCi1kZXJpdmVkIGNsYXNzIHdoaWNoIHNpbXBseSBhZGRzIG9yIHJlZGVmaW5lcyB0aGUgZGVzaXJlZCBiZWhhdmlvci4KLX0KLVxzZWV0aXRsZVtodHRwOi8vd3d3LmRhYS5jb20uYXUvXHRleHRhc2NpaXRpbGRlIGphbWVzL3NvZnR3YXJlL3B5Z3RrL117UHlHVEt9ewotaXMgYSBzZXQgb2YgYmluZGluZ3MgZm9yIHRoZSBcdWxpbmt7R1RLfXtodHRwOi8vd3d3Lmd0ay5vcmcvfSB3aWRnZXQgc2V0LgotSXQgcHJvdmlkZXMgYW4gb2JqZWN0IG9yaWVudGVkIGludGVyZmFjZSB0aGF0IGlzIHNsaWdodGx5IGhpZ2hlcgotbGV2ZWwgdGhhbiB0aGUgQyBvbmUuIEl0IGF1dG9tYXRpY2FsbHkgZG9lcyBhbGwgdGhlIHR5cGUgY2FzdGluZyBhbmQKLXJlZmVyZW5jZSBjb3VudGluZyB0aGF0IHlvdSB3b3VsZCBoYXZlIHRvIGRvIG5vcm1hbGx5IHdpdGggdGhlIEMKLUFQSS4gVGhlcmUgYXJlIGFsc28KLVx1bGlua3tiaW5kaW5nc317aHR0cDovL3d3dy5kYWEuY29tLmF1L1x0ZXh0YXNjaWl0aWxkZSBqYW1lcy9nbm9tZS99Ci10byAgXHVsaW5re0dOT01FfXtodHRwOi8vd3d3Lmdub21lLm9yZ30sIGFuZCBhIAotXHVsaW5re3R1dG9yaWFsfQote2h0dHA6Ly9sYWd1bmEuZm1lZGljLnVuYW0ubXgvXHRleHRhc2NpaXRpbGRlIGRhbmllbC9weWd0dXRvcmlhbC9weWd0dXRvcmlhbC9pbmRleC5odG1sfQotaXMgYXZhaWxhYmxlLgotfQotXGVuZHtzZWVhbHNvKn0KLQotJSBYWFggUmVmZXJlbmNlIFVSTHMgdGhhdCBjb21wYXJlIHRoZSBkaWZmZXJlbnQgVUkgcGFja2FnZXMKZGlmZiAtLWdpdCBhL0RvYy9saWIvdHppbmZvLWV4YW1wbGVzLnB5IGIvRG9jL2xpYi90emluZm8tZXhhbXBsZXMucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMmI4YWQuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi90emluZm8tZXhhbXBsZXMucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotZnJvbSBkYXRldGltZSBpbXBvcnQgdHppbmZvLCB0aW1lZGVsdGEsIGRhdGV0aW1lCi0KLVpFUk8gPSB0aW1lZGVsdGEoMCkKLUhPVVIgPSB0aW1lZGVsdGEoaG91cnM9MSkKLQotIyBBIFVUQyBjbGFzcy4KLQotY2xhc3MgVVRDKHR6aW5mbyk6Ci0gICAgIiIiVVRDIiIiCi0KLSAgICBkZWYgdXRjb2Zmc2V0KHNlbGYsIGR0KToKLSAgICAgICAgcmV0dXJuIFpFUk8KLQotICAgIGRlZiB0em5hbWUoc2VsZiwgZHQpOgotICAgICAgICByZXR1cm4gIlVUQyIKLQotICAgIGRlZiBkc3Qoc2VsZiwgZHQpOgotICAgICAgICByZXR1cm4gWkVSTwotCi11dGMgPSBVVEMoKQotCi0jIEEgY2xhc3MgYnVpbGRpbmcgdHppbmZvIG9iamVjdHMgZm9yIGZpeGVkLW9mZnNldCB0aW1lIHpvbmVzLgotIyBOb3RlIHRoYXQgRml4ZWRPZmZzZXQoMCwgIlVUQyIpIGlzIGEgZGlmZmVyZW50IHdheSB0byBidWlsZCBhCi0jIFVUQyB0emluZm8gb2JqZWN0LgotCi1jbGFzcyBGaXhlZE9mZnNldCh0emluZm8pOgotICAgICIiIkZpeGVkIG9mZnNldCBpbiBtaW51dGVzIGVhc3QgZnJvbSBVVEMuIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgb2Zmc2V0LCBuYW1lKToKLSAgICAgICAgc2VsZi5fX29mZnNldCA9IHRpbWVkZWx0YShtaW51dGVzID0gb2Zmc2V0KQotICAgICAgICBzZWxmLl9fbmFtZSA9IG5hbWUKLQotICAgIGRlZiB1dGNvZmZzZXQoc2VsZiwgZHQpOgotICAgICAgICByZXR1cm4gc2VsZi5fX29mZnNldAotCi0gICAgZGVmIHR6bmFtZShzZWxmLCBkdCk6Ci0gICAgICAgIHJldHVybiBzZWxmLl9fbmFtZQotCi0gICAgZGVmIGRzdChzZWxmLCBkdCk6Ci0gICAgICAgIHJldHVybiBaRVJPCi0KLSMgQSBjbGFzcyBjYXB0dXJpbmcgdGhlIHBsYXRmb3JtJ3MgaWRlYSBvZiBsb2NhbCB0aW1lLgotCi1pbXBvcnQgdGltZSBhcyBfdGltZQotCi1TVERPRkZTRVQgPSB0aW1lZGVsdGEoc2Vjb25kcyA9IC1fdGltZS50aW1lem9uZSkKLWlmIF90aW1lLmRheWxpZ2h0OgotICAgIERTVE9GRlNFVCA9IHRpbWVkZWx0YShzZWNvbmRzID0gLV90aW1lLmFsdHpvbmUpCi1lbHNlOgotICAgIERTVE9GRlNFVCA9IFNURE9GRlNFVAotCi1EU1RESUZGID0gRFNUT0ZGU0VUIC0gU1RET0ZGU0VUCi0KLWNsYXNzIExvY2FsVGltZXpvbmUodHppbmZvKToKLQotICAgIGRlZiB1dGNvZmZzZXQoc2VsZiwgZHQpOgotICAgICAgICBpZiBzZWxmLl9pc2RzdChkdCk6Ci0gICAgICAgICAgICByZXR1cm4gRFNUT0ZGU0VUCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gU1RET0ZGU0VUCi0KLSAgICBkZWYgZHN0KHNlbGYsIGR0KToKLSAgICAgICAgaWYgc2VsZi5faXNkc3QoZHQpOgotICAgICAgICAgICAgcmV0dXJuIERTVERJRkYKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBaRVJPCi0KLSAgICBkZWYgdHpuYW1lKHNlbGYsIGR0KToKLSAgICAgICAgcmV0dXJuIF90aW1lLnR6bmFtZVtzZWxmLl9pc2RzdChkdCldCi0KLSAgICBkZWYgX2lzZHN0KHNlbGYsIGR0KToKLSAgICAgICAgdHQgPSAoZHQueWVhciwgZHQubW9udGgsIGR0LmRheSwKLSAgICAgICAgICAgICAgZHQuaG91ciwgZHQubWludXRlLCBkdC5zZWNvbmQsCi0gICAgICAgICAgICAgIGR0LndlZWtkYXkoKSwgMCwgLTEpCi0gICAgICAgIHN0YW1wID0gX3RpbWUubWt0aW1lKHR0KQotICAgICAgICB0dCA9IF90aW1lLmxvY2FsdGltZShzdGFtcCkKLSAgICAgICAgcmV0dXJuIHR0LnRtX2lzZHN0ID4gMAotCi1Mb2NhbCA9IExvY2FsVGltZXpvbmUoKQotCi0KLSMgQSBjb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBjdXJyZW50IERTVCBydWxlcyBmb3IgbWFqb3IgVVMgdGltZSB6b25lcy4KLQotZGVmIGZpcnN0X3N1bmRheV9vbl9vcl9hZnRlcihkdCk6Ci0gICAgZGF5c190b19nbyA9IDYgLSBkdC53ZWVrZGF5KCkKLSAgICBpZiBkYXlzX3RvX2dvOgotICAgICAgICBkdCArPSB0aW1lZGVsdGEoZGF5c190b19nbykKLSAgICByZXR1cm4gZHQKLQotIyBJbiB0aGUgVVMsIERTVCBzdGFydHMgYXQgMmFtIChzdGFuZGFyZCB0aW1lKSBvbiB0aGUgZmlyc3QgU3VuZGF5IGluIEFwcmlsLgotRFNUU1RBUlQgPSBkYXRldGltZSgxLCA0LCAxLCAyKQotIyBhbmQgZW5kcyBhdCAyYW0gKERTVCB0aW1lOyAxYW0gc3RhbmRhcmQgdGltZSkgb24gdGhlIGxhc3QgU3VuZGF5IG9mIE9jdC4KLSMgd2hpY2ggaXMgdGhlIGZpcnN0IFN1bmRheSBvbiBvciBhZnRlciBPY3QgMjUuCi1EU1RFTkQgPSBkYXRldGltZSgxLCAxMCwgMjUsIDEpCi0KLWNsYXNzIFVTVGltZVpvbmUodHppbmZvKToKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3VycywgcmVwcm5hbWUsIHN0ZG5hbWUsIGRzdG5hbWUpOgotICAgICAgICBzZWxmLnN0ZG9mZnNldCA9IHRpbWVkZWx0YShob3Vycz1ob3VycykKLSAgICAgICAgc2VsZi5yZXBybmFtZSA9IHJlcHJuYW1lCi0gICAgICAgIHNlbGYuc3RkbmFtZSA9IHN0ZG5hbWUKLSAgICAgICAgc2VsZi5kc3RuYW1lID0gZHN0bmFtZQotCi0gICAgZGVmIF9fcmVwcl9fKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5yZXBybmFtZQotCi0gICAgZGVmIHR6bmFtZShzZWxmLCBkdCk6Ci0gICAgICAgIGlmIHNlbGYuZHN0KGR0KToKLSAgICAgICAgICAgIHJldHVybiBzZWxmLmRzdG5hbWUKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBzZWxmLnN0ZG5hbWUKLQotICAgIGRlZiB1dGNvZmZzZXQoc2VsZiwgZHQpOgotICAgICAgICByZXR1cm4gc2VsZi5zdGRvZmZzZXQgKyBzZWxmLmRzdChkdCkKLQotICAgIGRlZiBkc3Qoc2VsZiwgZHQpOgotICAgICAgICBpZiBkdCBpcyBOb25lIG9yIGR0LnR6aW5mbyBpcyBOb25lOgotICAgICAgICAgICAgIyBBbiBleGNlcHRpb24gbWF5IGJlIHNlbnNpYmxlIGhlcmUsIGluIG9uZSBvciBib3RoIGNhc2VzLgotICAgICAgICAgICAgIyBJdCBkZXBlbmRzIG9uIGhvdyB5b3Ugd2FudCB0byB0cmVhdCB0aGVtLiAgVGhlIGRlZmF1bHQKLSAgICAgICAgICAgICMgZnJvbXV0YygpIGltcGxlbWVudGF0aW9uIChjYWxsZWQgYnkgdGhlIGRlZmF1bHQgYXN0aW1lem9uZSgpCi0gICAgICAgICAgICAjIGltcGxlbWVudGF0aW9uKSBwYXNzZXMgYSBkYXRldGltZSB3aXRoIGR0LnR6aW5mbyBpcyBzZWxmLgotICAgICAgICAgICAgcmV0dXJuIFpFUk8KLSAgICAgICAgYXNzZXJ0IGR0LnR6aW5mbyBpcyBzZWxmCi0KLSAgICAgICAgIyBGaW5kIGZpcnN0IFN1bmRheSBpbiBBcHJpbCAmIHRoZSBsYXN0IGluIE9jdG9iZXIuCi0gICAgICAgIHN0YXJ0ID0gZmlyc3Rfc3VuZGF5X29uX29yX2FmdGVyKERTVFNUQVJULnJlcGxhY2UoeWVhcj1kdC55ZWFyKSkKLSAgICAgICAgZW5kID0gZmlyc3Rfc3VuZGF5X29uX29yX2FmdGVyKERTVEVORC5yZXBsYWNlKHllYXI9ZHQueWVhcikpCi0KLSAgICAgICAgIyBDYW4ndCBjb21wYXJlIG5haXZlIHRvIGF3YXJlIG9iamVjdHMsIHNvIHN0cmlwIHRoZSB0aW1lem9uZSBmcm9tCi0gICAgICAgICMgZHQgZmlyc3QuCi0gICAgICAgIGlmIHN0YXJ0IDw9IGR0LnJlcGxhY2UodHppbmZvPU5vbmUpIDwgZW5kOgotICAgICAgICAgICAgcmV0dXJuIEhPVVIKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBaRVJPCi0KLUVhc3Rlcm4gID0gVVNUaW1lWm9uZSgtNSwgIkVhc3Rlcm4iLCAgIkVTVCIsICJFRFQiKQotQ2VudHJhbCAgPSBVU1RpbWVab25lKC02LCAiQ2VudHJhbCIsICAiQ1NUIiwgIkNEVCIpCi1Nb3VudGFpbiA9IFVTVGltZVpvbmUoLTcsICJNb3VudGFpbiIsICJNU1QiLCAiTURUIikKLVBhY2lmaWMgID0gVVNUaW1lWm9uZSgtOCwgIlBhY2lmaWMiLCAgIlBTVCIsICJQRFQiKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi93aW5kb3dzLnRleCBiL0RvYy9saWIvd2luZG93cy50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZDM1NTkuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi93aW5kb3dzLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotXGNoYXB0ZXJ7TVMgV2luZG93cyBTcGVjaWZpYyBTZXJ2aWNlc30KLQotCi1UaGlzIGNoYXB0ZXIgZGVzY3JpYmVzIG1vZHVsZXMgdGhhdCBhcmUgb25seSBhdmFpbGFibGUgb24gTVMgV2luZG93cwotcGxhdGZvcm1zLgotCi0KLVxsb2NhbG1vZHVsZXRhYmxlCmRpZmYgLS1naXQgYS9Eb2MvbGliL3htbGRvbS50ZXggYi9Eb2MvbGliL3htbGRvbS50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NTFiZjAuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi94bWxkb20udGV4CisrKyAvZGV2L251bGwKQEAgLTEsOTI4ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7eG1sLmRvbX0gLS0tCi0gICAgICAgICBUaGUgRG9jdW1lbnQgT2JqZWN0IE1vZGVsIEFQSX0KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e3htbC5kb219Ci1cbW9kdWxlc3lub3BzaXN7RG9jdW1lbnQgT2JqZWN0IE1vZGVsIEFQSSBmb3IgUHl0aG9uLn0KLVxzZWN0aW9uYXV0aG9ye1BhdWwgUHJlc2NvZH17cGF1bEBwcmVzY29kLm5ldH0KLVxzZWN0aW9uYXV0aG9ye01hcnRpbiB2LiBMXCJvd2lzfXttYXJ0aW5Adi5sb2V3aXMuZGV9Ci0KLVx2ZXJzaW9uYWRkZWR7Mi4wfQotCi1UaGUgRG9jdW1lbnQgT2JqZWN0IE1vZGVsLCBvciBgYERPTSwnJyBpcyBhIGNyb3NzLWxhbmd1YWdlIEFQSSBmcm9tCi10aGUgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSAoVzNDKSBmb3IgYWNjZXNzaW5nIGFuZCBtb2RpZnlpbmcgWE1MCi1kb2N1bWVudHMuICBBIERPTSBpbXBsZW1lbnRhdGlvbiBwcmVzZW50cyBhbiBYTUwgZG9jdW1lbnQgYXMgYSB0cmVlCi1zdHJ1Y3R1cmUsIG9yIGFsbG93cyBjbGllbnQgY29kZSB0byBidWlsZCBzdWNoIGEgc3RydWN0dXJlIGZyb20KLXNjcmF0Y2guICBJdCB0aGVuIGdpdmVzIGFjY2VzcyB0byB0aGUgc3RydWN0dXJlIHRocm91Z2ggYSBzZXQgb2YKLW9iamVjdHMgd2hpY2ggcHJvdmlkZWQgd2VsbC1rbm93biBpbnRlcmZhY2VzLgotCi1UaGUgRE9NIGlzIGV4dHJlbWVseSB1c2VmdWwgZm9yIHJhbmRvbS1hY2Nlc3MgYXBwbGljYXRpb25zLiAgU0FYIG9ubHkKLWFsbG93cyB5b3UgYSB2aWV3IG9mIG9uZSBiaXQgb2YgdGhlIGRvY3VtZW50IGF0IGEgdGltZS4gIElmIHlvdSBhcmUKLWxvb2tpbmcgYXQgb25lIFNBWCBlbGVtZW50LCB5b3UgaGF2ZSBubyBhY2Nlc3MgdG8gYW5vdGhlci4gIElmIHlvdSBhcmUKLWxvb2tpbmcgYXQgYSB0ZXh0IG5vZGUsIHlvdSBoYXZlIG5vIGFjY2VzcyB0byBhIGNvbnRhaW5pbmcgZWxlbWVudC4KLVdoZW4geW91IHdyaXRlIGEgU0FYIGFwcGxpY2F0aW9uLCB5b3UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHlvdXIKLXByb2dyYW0ncyBwb3NpdGlvbiBpbiB0aGUgZG9jdW1lbnQgc29tZXdoZXJlIGluIHlvdXIgb3duIGNvZGUuICBTQVgKLWRvZXMgbm90IGRvIGl0IGZvciB5b3UuICBBbHNvLCBpZiB5b3UgbmVlZCB0byBsb29rIGFoZWFkIGluIHRoZSBYTUwKLWRvY3VtZW50LCB5b3UgYXJlIGp1c3Qgb3V0IG9mIGx1Y2suCi0KLVNvbWUgYXBwbGljYXRpb25zIGFyZSBzaW1wbHkgaW1wb3NzaWJsZSBpbiBhbiBldmVudCBkcml2ZW4gbW9kZWwgd2l0aAotbm8gYWNjZXNzIHRvIGEgdHJlZS4gIE9mIGNvdXJzZSB5b3UgY291bGQgYnVpbGQgc29tZSBzb3J0IG9mIHRyZWUKLXlvdXJzZWxmIGluIFNBWCBldmVudHMsIGJ1dCB0aGUgRE9NIGFsbG93cyB5b3UgdG8gYXZvaWQgd3JpdGluZyB0aGF0Ci1jb2RlLiAgVGhlIERPTSBpcyBhIHN0YW5kYXJkIHRyZWUgcmVwcmVzZW50YXRpb24gZm9yIFhNTCBkYXRhLgotCi0lV2hhdCBpZiB5b3VyIG5lZWRzIGFyZSBzb21ld2hlcmUgYmV0d2VlbiBTQVggYW5kIHRoZSBET00/ICBQZXJoYXBzCi0leW91IGNhbm5vdCBhZmZvcmQgdG8gbG9hZCB0aGUgZW50aXJlIHRyZWUgaW4gbWVtb3J5IGJ1dCB5b3UgZmluZCB0aGUKLSVTQVggbW9kZWwgc29tZXdoYXQgY3VtYmVyc29tZSBhbmQgbG93LWxldmVsLiAgVGhlcmUgaXMgYWxzbyBhIG1vZHVsZQotJWNhbGxlZCB4bWwuZG9tLnB1bGxkb20gdGhhdCBhbGxvd3MgeW91IHRvIGJ1aWxkIHRyZWVzIG9mIG9ubHkgdGhlCi0lcGFydHMgb2YgYSBkb2N1bWVudCB0aGF0IHlvdSBuZWVkIHN0cnVjdHVyZWQgYWNjZXNzIHRvLiAgSXQgYWxzbyBoYXMKLSVmZWF0dXJlcyB0aGF0IGFsbG93IHlvdSB0byBmaW5kIHlvdXIgd2F5IGFyb3VuZCB0aGUgRE9NLgotJSBTZWUgaHR0cDovL3d3dy5wcmVzY29kLm5ldC9weXRob24vcHVsbGRvbQotCi1UaGUgRG9jdW1lbnQgT2JqZWN0IE1vZGVsIGlzIGJlaW5nIGRlZmluZWQgYnkgdGhlIFczQyBpbiBzdGFnZXMsIG9yCi1gYGxldmVscycnIGluIHRoZWlyIHRlcm1pbm9sb2d5LiAgVGhlIFB5dGhvbiBtYXBwaW5nIG9mIHRoZSBBUEkgaXMKLXN1YnN0YW50aWFsbHkgYmFzZWQgb24gdGhlIERPTSBMZXZlbH4yIHJlY29tbWVuZGF0aW9uLiAgVGhlIG1hcHBpbmcgb2YKLXRoZSBMZXZlbH4zIHNwZWNpZmljYXRpb24sIGN1cnJlbnRseSBvbmx5IGF2YWlsYWJsZSBpbiBkcmFmdCBmb3JtLCBpcwotYmVpbmcgZGV2ZWxvcGVkIGJ5IHRoZSBcdWxpbmt7UHl0aG9uIFhNTCBTcGVjaWFsIEludGVyZXN0Ci1Hcm91cH17aHR0cDovL3d3dy5weXRob24ub3JnL3NpZ3MveG1sLXNpZy99IGFzIHBhcnQgb2YgdGhlCi1cdWxpbmt7UHlYTUwgcGFja2FnZX17aHR0cDovL3B5eG1sLnNvdXJjZWZvcmdlLm5ldC99LiAgUmVmZXIgdG8gdGhlCi1kb2N1bWVudGF0aW9uIGJ1bmRsZWQgd2l0aCB0aGF0IHBhY2thZ2UgZm9yIGluZm9ybWF0aW9uIG9uIHRoZSBjdXJyZW50Ci1zdGF0ZSBvZiBET00gTGV2ZWx+MyBzdXBwb3J0LgotCi1ET00gYXBwbGljYXRpb25zIHR5cGljYWxseSBzdGFydCBieSBwYXJzaW5nIHNvbWUgWE1MIGludG8gYSBET00uICBIb3cKLXRoaXMgaXMgYWNjb21wbGlzaGVkIGlzIG5vdCBjb3ZlcmVkIGF0IGFsbCBieSBET00gTGV2ZWx+MSwgYW5kIExldmVsfjIKLXByb3ZpZGVzIG9ubHkgbGltaXRlZCBpbXByb3ZlbWVudHM6IFRoZXJlIGlzIGEKLVxjbGFzc3tET01JbXBsZW1lbnRhdGlvbn0gb2JqZWN0IGNsYXNzIHdoaWNoIHByb3ZpZGVzIGFjY2VzcyB0bwotXGNsYXNze0RvY3VtZW50fSBjcmVhdGlvbiBtZXRob2RzLCBidXQgbm8gd2F5IHRvIGFjY2VzcyBhbiBYTUwKLXJlYWRlci9wYXJzZXIvRG9jdW1lbnQgYnVpbGRlciBpbiBhbiBpbXBsZW1lbnRhdGlvbi1pbmRlcGVuZGVudCB3YXkuCi1UaGVyZSBpcyBhbHNvIG5vIHdlbGwtZGVmaW5lZCB3YXkgdG8gYWNjZXNzIHRoZXNlIG1ldGhvZHMgd2l0aG91dCBhbgotZXhpc3RpbmcgXGNsYXNze0RvY3VtZW50fSBvYmplY3QuICBJbiBQeXRob24sIGVhY2ggRE9NIGltcGxlbWVudGF0aW9uCi13aWxsIHByb3ZpZGUgYSBmdW5jdGlvbiBcZnVuY3Rpb257Z2V0RE9NSW1wbGVtZW50YXRpb24oKX0uIERPTSBMZXZlbH4zCi1hZGRzIGEgTG9hZC9TdG9yZSBzcGVjaWZpY2F0aW9uLCB3aGljaCBkZWZpbmVzIGFuIGludGVyZmFjZSB0byB0aGUKLXJlYWRlciwgYnV0IHRoaXMgaXMgbm90IHlldCBhdmFpbGFibGUgaW4gdGhlIFB5dGhvbiBzdGFuZGFyZCBsaWJyYXJ5LgotCi1PbmNlIHlvdSBoYXZlIGEgRE9NIGRvY3VtZW50IG9iamVjdCwgeW91IGNhbiBhY2Nlc3MgdGhlIHBhcnRzIG9mIHlvdXIKLVhNTCBkb2N1bWVudCB0aHJvdWdoIGl0cyBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzLiAgVGhlc2UgcHJvcGVydGllcyBhcmUKLWRlZmluZWQgaW4gdGhlIERPTSBzcGVjaWZpY2F0aW9uOyB0aGlzIHBvcnRpb24gb2YgdGhlIHJlZmVyZW5jZSBtYW51YWwKLWRlc2NyaWJlcyB0aGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIHNwZWNpZmljYXRpb24gaW4gUHl0aG9uLgotCi1UaGUgc3BlY2lmaWNhdGlvbiBwcm92aWRlZCBieSB0aGUgVzNDIGRlZmluZXMgdGhlIERPTSBBUEkgZm9yIEphdmEsCi1FQ01BU2NyaXB0LCBhbmQgT01HIElETC4gIFRoZSBQeXRob24gbWFwcGluZyBkZWZpbmVkIGhlcmUgaXMgYmFzZWQgaW4KLWxhcmdlIHBhcnQgb24gdGhlIElETCB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLCBidXQgc3RyaWN0Ci1jb21wbGlhbmNlIGlzIG5vdCByZXF1aXJlZCAodGhvdWdoIGltcGxlbWVudGF0aW9ucyBhcmUgZnJlZSB0byBzdXBwb3J0Ci10aGUgc3RyaWN0IG1hcHBpbmcgZnJvbSBJREwpLiAgU2VlIHNlY3Rpb24gXHJlZntkb20tY29uZm9ybWFuY2V9LAotYGBDb25mb3JtYW5jZSwnJyBmb3IgYSBkZXRhaWxlZCBkaXNjdXNzaW9uIG9mIG1hcHBpbmcgcmVxdWlyZW1lbnRzLgotCi0KLVxiZWdpbntzZWVhbHNvfQotICBcc2VldGl0bGVbaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9de0RvY3VtZW50IE9iamVjdAotICAgICAgICAgICAgTW9kZWwgKERPTSkgTGV2ZWx+MiBTcGVjaWZpY2F0aW9ufQotICAgICAgICAgICB7VGhlIFczQyByZWNvbW1lbmRhdGlvbiB1cG9uIHdoaWNoIHRoZSBQeXRob24gRE9NIEFQSSBpcwotICAgICAgICAgICAgYmFzZWQufQotICBcc2VldGl0bGVbaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLURPTS1MZXZlbC0xL117RG9jdW1lbnQgT2JqZWN0Ci0gICAgICAgICAgICBNb2RlbCAoRE9NKSBMZXZlbH4xIFNwZWNpZmljYXRpb259Ci0gICAgICAgICAgIHtUaGUgVzNDIHJlY29tbWVuZGF0aW9uIGZvciB0aGUKLSAgICAgICAgICAgIERPTSBzdXBwb3J0ZWQgYnkgXG1vZHVsZXt4bWwuZG9tLm1pbmlkb219Ln0KLSAgXHNlZXRpdGxlW2h0dHA6Ly9weXhtbC5zb3VyY2Vmb3JnZS5uZXRde1B5WE1MfXtVc2VycyB0aGF0IHJlcXVpcmUgYQotICAgICAgICAgICAgZnVsbC1mZWF0dXJlZCBpbXBsZW1lbnRhdGlvbiBvZiBET00gc2hvdWxkIHVzZSB0aGUgUHlYTUwKLSAgICAgICAgICAgIHBhY2thZ2UufQotICBcc2VldGl0bGVbaHR0cDovL3d3dy5vbWcub3JnL2RvY3MvZm9ybWFsLzAyLTExLTA1LnBkZl17UHl0aG9uCi0gICAgICAgICAgICBMYW5ndWFnZSBNYXBwaW5nIFNwZWNpZmljYXRpb259Ci0gICAgICAgICAgIHtUaGlzIHNwZWNpZmllcyB0aGUgbWFwcGluZyBmcm9tIE9NRyBJREwgdG8gUHl0aG9uLn0KLVxlbmR7c2VlYWxzb30KLQotXHN1YnNlY3Rpb257TW9kdWxlIENvbnRlbnRzfQotCi1UaGUgXG1vZHVsZXt4bWwuZG9tfSBjb250YWlucyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKLQotXGJlZ2lue2Z1bmNkZXNjfXtyZWdpc3RlckRPTUltcGxlbWVudGF0aW9ufXtuYW1lLCBmYWN0b3J5fQotUmVnaXN0ZXIgdGhlIFx2YXJ7ZmFjdG9yeX0gZnVuY3Rpb24gd2l0aCB0aGUgbmFtZSBcdmFye25hbWV9LiAgVGhlCi1mYWN0b3J5IGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYW4gb2JqZWN0IHdoaWNoIGltcGxlbWVudHMgdGhlCi1cY2xhc3N7RE9NSW1wbGVtZW50YXRpb259IGludGVyZmFjZS4gIFRoZSBmYWN0b3J5IGZ1bmN0aW9uIGNhbiByZXR1cm4KLXRoZSBzYW1lIG9iamVjdCBldmVyeSB0aW1lLCBvciBhIG5ldyBvbmUgZm9yIGVhY2ggY2FsbCwgYXMgYXBwcm9wcmlhdGUKLWZvciB0aGUgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gKGUuZy4gaWYgdGhhdCBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cwotc29tZSBjdXN0b21pemF0aW9uKS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z2V0RE9NSW1wbGVtZW50YXRpb259e1xvcHRpb25hbHtuYW1lXG9wdGlvbmFseywgZmVhdHVyZXN9fX0KLVJldHVybiBhIHN1aXRhYmxlIERPTSBpbXBsZW1lbnRhdGlvbi4gVGhlIFx2YXJ7bmFtZX0gaXMgZWl0aGVyCi13ZWxsLWtub3duLCB0aGUgbW9kdWxlIG5hbWUgb2YgYSBET00gaW1wbGVtZW50YXRpb24sIG9yCi1cY29kZXtOb25lfS4gSWYgaXQgaXMgbm90IFxjb2Rle05vbmV9LCBpbXBvcnRzIHRoZSBjb3JyZXNwb25kaW5nCi1tb2R1bGUgYW5kIHJldHVybnMgYSBcY2xhc3N7RE9NSW1wbGVtZW50YXRpb259IG9iamVjdCBpZiB0aGUgaW1wb3J0Ci1zdWNjZWVkcy4gIElmIG5vIG5hbWUgaXMgZ2l2ZW4sIGFuZCBpZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLVxlbnZ2YXJ7UFlUSE9OX0RPTX0gaXMgc2V0LCB0aGlzIHZhcmlhYmxlIGlzIHVzZWQgdG8gZmluZCB0aGUKLWltcGxlbWVudGF0aW9uLgotCi1JZiBuYW1lIGlzIG5vdCBnaXZlbiwgdGhpcyBleGFtaW5lcyB0aGUgYXZhaWxhYmxlIGltcGxlbWVudGF0aW9ucyB0bwotZmluZCBvbmUgd2l0aCB0aGUgcmVxdWlyZWQgZmVhdHVyZSBzZXQuICBJZiBubyBpbXBsZW1lbnRhdGlvbiBjYW4gYmUKLWZvdW5kLCByYWlzZSBhbiBcZXhjZXB0aW9ue0ltcG9ydEVycm9yfS4gIFRoZSBmZWF0dXJlcyBsaXN0IG11c3QgYmUgYQotc2VxdWVuY2Ugb2YgXGNvZGV7KFx2YXJ7ZmVhdHVyZX0sIFx2YXJ7dmVyc2lvbn0pfSBwYWlycyB3aGljaCBhcmUKLXBhc3NlZCB0byB0aGUgXG1ldGhvZHtoYXNGZWF0dXJlKCl9IG1ldGhvZCBvbiBhdmFpbGFibGUKLVxjbGFzc3tET01JbXBsZW1lbnRhdGlvbn0gb2JqZWN0cy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotU29tZSBjb252ZW5pZW5jZSBjb25zdGFudHMgYXJlIGFsc28gcHJvdmlkZWQ6Ci0KLVxiZWdpbntkYXRhZGVzY317RU1QVFlfTkFNRVNQQUNFfQotICBUaGUgdmFsdWUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIG5hbWVzcGFjZSBpcyBhc3NvY2lhdGVkIHdpdGggYQotICBub2RlIGluIHRoZSBET00uICBUaGlzIGlzIHR5cGljYWxseSBmb3VuZCBhcyB0aGUKLSAgXG1lbWJlcntuYW1lc3BhY2VVUkl9IG9mIGEgbm9kZSwgb3IgdXNlZCBhcyB0aGUgXHZhcntuYW1lc3BhY2VVUkl9Ci0gIHBhcmFtZXRlciB0byBhIG5hbWVzcGFjZXMtc3BlY2lmaWMgbWV0aG9kLgotICBcdmVyc2lvbmFkZGVkezIuMn0KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317WE1MX05BTUVTUEFDRX0KLSAgVGhlIG5hbWVzcGFjZSBVUkkgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNlcnZlZCBwcmVmaXggXGNvZGV7eG1sfSwgYXMKLSAgZGVmaW5lZCBieQotICBcY2l0ZXRpdGxlW2h0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwtbmFtZXMvXXtOYW1lc3BhY2VzIGluIFhNTH0KLSAgKHNlY3Rpb25+NCkuCi0gIFx2ZXJzaW9uYWRkZWR7Mi4yfQotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtYTUxOU19OQU1FU1BBQ0V9Ci0gIFRoZSBuYW1lc3BhY2UgVVJJIGZvciBuYW1lc3BhY2UgZGVjbGFyYXRpb25zLCBhcyBkZWZpbmVkIGJ5Ci0gIFxjaXRldGl0bGVbaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlLmh0bWxde0RvY3VtZW50Ci0gIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbH4yIENvcmUgU3BlY2lmaWNhdGlvbn0gKHNlY3Rpb25+MS4xLjgpLgotICBcdmVyc2lvbmFkZGVkezIuMn0KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317WEhUTUxfTkFNRVNQQUNFfQotICBUaGUgVVJJIG9mIHRoZSBYSFRNTCBuYW1lc3BhY2UgYXMgZGVmaW5lZCBieQotICBcY2l0ZXRpdGxlW2h0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9de1hIVE1MIDEuMDogVGhlIEV4dGVuc2libGUKLSAgSHlwZXJUZXh0IE1hcmt1cCBMYW5ndWFnZX0gKHNlY3Rpb25+My4xLjEpLgotICBcdmVyc2lvbmFkZGVkezIuMn0KLVxlbmR7ZGF0YWRlc2N9Ci0KLQotJSBTaG91bGQgdGhlIE5vZGUgZG9jdW1lbnRhdGlvbiBnbyBoZXJlPwotCi1JbiBhZGRpdGlvbiwgXG1vZHVsZXt4bWwuZG9tfSBjb250YWlucyBhIGJhc2UgXGNsYXNze05vZGV9IGNsYXNzIGFuZAotdGhlIERPTSBleGNlcHRpb24gY2xhc3Nlcy4gIFRoZSBcY2xhc3N7Tm9kZX0gY2xhc3MgcHJvdmlkZWQgYnkgdGhpcwotbW9kdWxlIGRvZXMgbm90IGltcGxlbWVudCBhbnkgb2YgdGhlIG1ldGhvZHMgb3IgYXR0cmlidXRlcyBkZWZpbmVkIGJ5Ci10aGUgRE9NIHNwZWNpZmljYXRpb247IGNvbmNyZXRlIERPTSBpbXBsZW1lbnRhdGlvbnMgbXVzdCBwcm92aWRlCi10aG9zZS4gIFRoZSBcY2xhc3N7Tm9kZX0gY2xhc3MgcHJvdmlkZWQgYXMgcGFydCBvZiB0aGlzIG1vZHVsZSBkb2VzCi1wcm92aWRlIHRoZSBjb25zdGFudHMgdXNlZCBmb3IgdGhlIFxtZW1iZXJ7bm9kZVR5cGV9IGF0dHJpYnV0ZSBvbgotY29uY3JldGUgXGNsYXNze05vZGV9IG9iamVjdHM7IHRoZXkgYXJlIGxvY2F0ZWQgd2l0aGluIHRoZSBjbGFzcwotcmF0aGVyIHRoYW4gYXQgdGhlIG1vZHVsZSBsZXZlbCB0byBjb25mb3JtIHdpdGggdGhlIERPTQotc3BlY2lmaWNhdGlvbnMuCi0KLQotXHN1YnNlY3Rpb257T2JqZWN0cyBpbiB0aGUgRE9NIFxsYWJlbHtkb20tb2JqZWN0c319Ci0KLVRoZSBkZWZpbml0aXZlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBET00gaXMgdGhlIERPTSBzcGVjaWZpY2F0aW9uIGZyb20KLXRoZSBXM0MuCi0KLU5vdGUgdGhhdCBET00gYXR0cmlidXRlcyBtYXkgYWxzbyBiZSBtYW5pcHVsYXRlZCBhcyBub2RlcyBpbnN0ZWFkIG9mCi1hcyBzaW1wbGUgc3RyaW5ncy4gIEl0IGlzIGZhaXJseSByYXJlIHRoYXQgeW91IG11c3QgZG8gdGhpcywgaG93ZXZlciwKLXNvIHRoaXMgdXNhZ2UgaXMgbm90IHlldCBkb2N1bWVudGVkLgotCi0KLVxiZWdpbnt0YWJsZWlpaX17bHxsfGx9e2NsYXNzfXtJbnRlcmZhY2V9e1NlY3Rpb259e1B1cnBvc2V9Ci0gIFxsaW5laWlpe0RPTUltcGxlbWVudGF0aW9ufXtccmVme2RvbS1pbXBsZW1lbnRhdGlvbi1vYmplY3RzfX0KLSAgICAgICAgICB7SW50ZXJmYWNlIHRvIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uLn0KLSAgXGxpbmVpaWl7Tm9kZX17XHJlZntkb20tbm9kZS1vYmplY3RzfX0KLSAgICAgICAgICB7QmFzZSBpbnRlcmZhY2UgZm9yIG1vc3Qgb2JqZWN0cyBpbiBhIGRvY3VtZW50Ln0KLSAgXGxpbmVpaWl7Tm9kZUxpc3R9e1xyZWZ7ZG9tLW5vZGVsaXN0LW9iamVjdHN9fQotICAgICAgICAgIHtJbnRlcmZhY2UgZm9yIGEgc2VxdWVuY2Ugb2Ygbm9kZXMufQotICBcbGluZWlpaXtEb2N1bWVudFR5cGV9e1xyZWZ7ZG9tLWRvY3VtZW50dHlwZS1vYmplY3RzfX0KLSAgICAgICAgICB7SW5mb3JtYXRpb24gYWJvdXQgdGhlIGRlY2xhcmF0aW9ucyBuZWVkZWQgdG8gcHJvY2VzcyBhIGRvY3VtZW50Ln0KLSAgXGxpbmVpaWl7RG9jdW1lbnR9e1xyZWZ7ZG9tLWRvY3VtZW50LW9iamVjdHN9fQotICAgICAgICAgIHtPYmplY3Qgd2hpY2ggcmVwcmVzZW50cyBhbiBlbnRpcmUgZG9jdW1lbnQufQotICBcbGluZWlpaXtFbGVtZW50fXtccmVme2RvbS1lbGVtZW50LW9iamVjdHN9fQotICAgICAgICAgIHtFbGVtZW50IG5vZGVzIGluIHRoZSBkb2N1bWVudCBoaWVyYXJjaHkufQotICBcbGluZWlpaXtBdHRyfXtccmVme2RvbS1hdHRyLW9iamVjdHN9fQotICAgICAgICAgIHtBdHRyaWJ1dGUgdmFsdWUgbm9kZXMgb24gZWxlbWVudCBub2Rlcy59Ci0gIFxsaW5laWlpe0NvbW1lbnR9e1xyZWZ7ZG9tLWNvbW1lbnQtb2JqZWN0c319Ci0gICAgICAgICAge1JlcHJlc2VudGF0aW9uIG9mIGNvbW1lbnRzIGluIHRoZSBzb3VyY2UgZG9jdW1lbnQufQotICBcbGluZWlpaXtUZXh0fXtccmVme2RvbS10ZXh0LW9iamVjdHN9fQotICAgICAgICAgIHtOb2RlcyBjb250YWluaW5nIHRleHR1YWwgY29udGVudCBmcm9tIHRoZSBkb2N1bWVudC59Ci0gIFxsaW5laWlpe1Byb2Nlc3NpbmdJbnN0cnVjdGlvbn17XHJlZntkb20tcGktb2JqZWN0c319Ci0gICAgICAgICAge1Byb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gcmVwcmVzZW50YXRpb24ufQotXGVuZHt0YWJsZWlpaX0KLQotQW4gYWRkaXRpb25hbCBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB3b3JraW5nCi13aXRoIHRoZSBET00gaW4gUHl0aG9uLgotCi0KLVxzdWJzdWJzZWN0aW9ue0RPTUltcGxlbWVudGF0aW9uIE9iamVjdHMKLSAgICAgICAgICAgICAgIFxsYWJlbHtkb20taW1wbGVtZW50YXRpb24tb2JqZWN0c319Ci0KLVRoZSBcY2xhc3N7RE9NSW1wbGVtZW50YXRpb259IGludGVyZmFjZSBwcm92aWRlcyBhIHdheSBmb3IKLWFwcGxpY2F0aW9ucyB0byBkZXRlcm1pbmUgdGhlIGF2YWlsYWJpbGl0eSBvZiBwYXJ0aWN1bGFyIGZlYXR1cmVzIGluCi10aGUgRE9NIHRoZXkgYXJlIHVzaW5nLiAgRE9NIExldmVsfjIgYWRkZWQgdGhlIGFiaWxpdHkgdG8gY3JlYXRlIG5ldwotXGNsYXNze0RvY3VtZW50fSBhbmQgXGNsYXNze0RvY3VtZW50VHlwZX0gb2JqZWN0cyB1c2luZyB0aGUKLVxjbGFzc3tET01JbXBsZW1lbnRhdGlvbn0gYXMgd2VsbC4KLQotXGJlZ2lue21ldGhvZGRlc2N9W0RPTUltcGxlbWVudGF0aW9uXXtoYXNGZWF0dXJlfXtmZWF0dXJlLCB2ZXJzaW9ufQotUmV0dXJuIHRydWUgaWYgdGhlIGZlYXR1cmUgaWRlbnRpZmllZCBieSB0aGUgcGFpciBvZiBzdHJpbmdzCi1cdmFye2ZlYXR1cmV9IGFuZCBcdmFye3ZlcnNpb259IGlzIGltcGxlbWVudGVkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRE9NSW1wbGVtZW50YXRpb25de2NyZWF0ZURvY3VtZW50fXtuYW1lc3BhY2VVcmksIHF1YWxpZmllZE5hbWUsIGRvY3R5cGV9Ci1SZXR1cm4gYSBuZXcgXGNsYXNze0RvY3VtZW50fSBvYmplY3QgKHRoZSByb290IG9mIHRoZSBET00pLCB3aXRoIGEKLWNoaWxkIFxjbGFzc3tFbGVtZW50fSBvYmplY3QgaGF2aW5nIHRoZSBnaXZlbiBcdmFye25hbWVzcGFjZVVyaX0gYW5kCi1cdmFye3F1YWxpZmllZE5hbWV9LiBUaGUgXHZhcntkb2N0eXBlfSBtdXN0IGJlIGEgXGNsYXNze0RvY3VtZW50VHlwZX0KLW9iamVjdCBjcmVhdGVkIGJ5IFxtZXRob2R7Y3JlYXRlRG9jdW1lbnRUeXBlKCl9LCBvciBcY29kZXtOb25lfS4KLUluIHRoZSBQeXRob24gRE9NIEFQSSwgdGhlIGZpcnN0IHR3byBhcmd1bWVudHMgY2FuIGFsc28gYmUgXGNvZGV7Tm9uZX0KLWluIG9yZGVyIHRvIGluZGljYXRlIHRoYXQgbm8gXGNsYXNze0VsZW1lbnR9IGNoaWxkIGlzIHRvIGJlIGNyZWF0ZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtET01JbXBsZW1lbnRhdGlvbl17Y3JlYXRlRG9jdW1lbnRUeXBlfXtxdWFsaWZpZWROYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWR9Ci1SZXR1cm4gYSBuZXcgXGNsYXNze0RvY3VtZW50VHlwZX0gb2JqZWN0IHRoYXQgZW5jYXBzdWxhdGVzIHRoZSBnaXZlbgotXHZhcntxdWFsaWZpZWROYW1lfSwgXHZhcntwdWJsaWNJZH0sIGFuZCBcdmFye3N5c3RlbUlkfSBzdHJpbmdzLAotcmVwcmVzZW50aW5nIHRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gYW4gWE1MIGRvY3VtZW50IHR5cGUKLWRlY2xhcmF0aW9uLgotXGVuZHttZXRob2RkZXNjfQotCi0KLVxzdWJzdWJzZWN0aW9ue05vZGUgT2JqZWN0cyBcbGFiZWx7ZG9tLW5vZGUtb2JqZWN0c319Ci0KLUFsbCBvZiB0aGUgY29tcG9uZW50cyBvZiBhbiBYTUwgZG9jdW1lbnQgYXJlIHN1YmNsYXNzZXMgb2YKLVxjbGFzc3tOb2RlfS4KLQotXGJlZ2lue21lbWJlcmRlc2N9W05vZGVde25vZGVUeXBlfQotQW4gaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIG5vZGUgdHlwZS4gIFN5bWJvbGljIGNvbnN0YW50cyBmb3IgdGhlCi10eXBlcyBhcmUgb24gdGhlIFxjbGFzc3tOb2RlfSBvYmplY3Q6Ci1cY29uc3RhbnR7RUxFTUVOVF9OT0RFfSwgXGNvbnN0YW50e0FUVFJJQlVURV9OT0RFfSwKLVxjb25zdGFudHtURVhUX05PREV9LCBcY29uc3RhbnR7Q0RBVEFfU0VDVElPTl9OT0RFfSwKLVxjb25zdGFudHtFTlRJVFlfTk9ERX0sIFxjb25zdGFudHtQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREV9LAotXGNvbnN0YW50e0NPTU1FTlRfTk9ERX0sIFxjb25zdGFudHtET0NVTUVOVF9OT0RFfSwKLVxjb25zdGFudHtET0NVTUVOVF9UWVBFX05PREV9LCBcY29uc3RhbnR7Tk9UQVRJT05fTk9ERX0uCi1UaGlzIGlzIGEgcmVhZC1vbmx5IGF0dHJpYnV0ZS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W05vZGVde3BhcmVudE5vZGV9Ci1UaGUgcGFyZW50IG9mIHRoZSBjdXJyZW50IG5vZGUsIG9yIFxjb2Rle05vbmV9IGZvciB0aGUgZG9jdW1lbnQgbm9kZS4KLVRoZSB2YWx1ZSBpcyBhbHdheXMgYSBcY2xhc3N7Tm9kZX0gb2JqZWN0IG9yIFxjb2Rle05vbmV9LiAgRm9yCi1cY2xhc3N7RWxlbWVudH0gbm9kZXMsIHRoaXMgd2lsbCBiZSB0aGUgcGFyZW50IGVsZW1lbnQsIGV4Y2VwdCBmb3IgdGhlCi1yb290IGVsZW1lbnQsIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBiZSB0aGUgXGNsYXNze0RvY3VtZW50fSBvYmplY3QuCi1Gb3IgXGNsYXNze0F0dHJ9IG5vZGVzLCB0aGlzIGlzIGFsd2F5cyBcY29kZXtOb25lfS4KLVRoaXMgaXMgYSByZWFkLW9ubHkgYXR0cmlidXRlLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bTm9kZV17YXR0cmlidXRlc30KLUEgXGNsYXNze05hbWVkTm9kZU1hcH0gb2YgYXR0cmlidXRlIG9iamVjdHMuICBPbmx5IGVsZW1lbnRzIGhhdmUKLWFjdHVhbCB2YWx1ZXMgZm9yIHRoaXM7IG90aGVycyBwcm92aWRlIFxjb2Rle05vbmV9IGZvciB0aGlzIGF0dHJpYnV0ZS4KLVRoaXMgaXMgYSByZWFkLW9ubHkgYXR0cmlidXRlLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bTm9kZV17cHJldmlvdXNTaWJsaW5nfQotVGhlIG5vZGUgdGhhdCBpbW1lZGlhdGVseSBwcmVjZWRlcyB0aGlzIG9uZSB3aXRoIHRoZSBzYW1lIHBhcmVudC4gIEZvcgotaW5zdGFuY2UgdGhlIGVsZW1lbnQgd2l0aCBhbiBlbmQtdGFnIHRoYXQgY29tZXMganVzdCBiZWZvcmUgdGhlCi1cdmFye3NlbGZ9IGVsZW1lbnQncyBzdGFydC10YWcuICBPZiBjb3Vyc2UsIFhNTCBkb2N1bWVudHMgYXJlIG1hZGUKLXVwIG9mIG1vcmUgdGhhbiBqdXN0IGVsZW1lbnRzIHNvIHRoZSBwcmV2aW91cyBzaWJsaW5nIGNvdWxkIGJlIHRleHQsIGEKLWNvbW1lbnQsIG9yIHNvbWV0aGluZyBlbHNlLiAgSWYgdGhpcyBub2RlIGlzIHRoZSBmaXJzdCBjaGlsZCBvZiB0aGUKLXBhcmVudCwgdGhpcyBhdHRyaWJ1dGUgd2lsbCBiZSBcY29kZXtOb25lfS4KLVRoaXMgaXMgYSByZWFkLW9ubHkgYXR0cmlidXRlLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bTm9kZV17bmV4dFNpYmxpbmd9Ci1UaGUgbm9kZSB0aGF0IGltbWVkaWF0ZWx5IGZvbGxvd3MgdGhpcyBvbmUgd2l0aCB0aGUgc2FtZSBwYXJlbnQuICBTZWUKLWFsc28gXG1lbWJlcntwcmV2aW91c1NpYmxpbmd9LiAgSWYgdGhpcyBpcyB0aGUgbGFzdCBjaGlsZCBvZiB0aGUKLXBhcmVudCwgdGhpcyBhdHRyaWJ1dGUgd2lsbCBiZSBcY29kZXtOb25lfS4KLVRoaXMgaXMgYSByZWFkLW9ubHkgYXR0cmlidXRlLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bTm9kZV17Y2hpbGROb2Rlc30KLUEgbGlzdCBvZiBub2RlcyBjb250YWluZWQgd2l0aGluIHRoaXMgbm9kZS4KLVRoaXMgaXMgYSByZWFkLW9ubHkgYXR0cmlidXRlLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bTm9kZV17Zmlyc3RDaGlsZH0KLVRoZSBmaXJzdCBjaGlsZCBvZiB0aGUgbm9kZSwgaWYgdGhlcmUgYXJlIGFueSwgb3IgXGNvZGV7Tm9uZX0uCi1UaGlzIGlzIGEgcmVhZC1vbmx5IGF0dHJpYnV0ZS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W05vZGVde2xhc3RDaGlsZH0KLVRoZSBsYXN0IGNoaWxkIG9mIHRoZSBub2RlLCBpZiB0aGVyZSBhcmUgYW55LCBvciBcY29kZXtOb25lfS4KLVRoaXMgaXMgYSByZWFkLW9ubHkgYXR0cmlidXRlLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bTm9kZV17bG9jYWxOYW1lfQotVGhlIHBhcnQgb2YgdGhlIFxtZW1iZXJ7dGFnTmFtZX0gZm9sbG93aW5nIHRoZSBjb2xvbiBpZiB0aGVyZSBpcyBvbmUsCi1lbHNlIHRoZSBlbnRpcmUgXG1lbWJlcnt0YWdOYW1lfS4gIFRoZSB2YWx1ZSBpcyBhIHN0cmluZy4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W05vZGVde3ByZWZpeH0KLVRoZSBwYXJ0IG9mIHRoZSBcbWVtYmVye3RhZ05hbWV9IHByZWNlZGluZyB0aGUgY29sb24gaWYgdGhlcmUgaXMgb25lLAotZWxzZSB0aGUgZW1wdHkgc3RyaW5nLiAgVGhlIHZhbHVlIGlzIGEgc3RyaW5nLCBvciBcY29kZXtOb25lfQotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bTm9kZV17bmFtZXNwYWNlVVJJfQotVGhlIG5hbWVzcGFjZSBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQgbmFtZS4gIFRoaXMgd2lsbCBiZSBhCi1zdHJpbmcgb3IgXGNvZGV7Tm9uZX0uICBUaGlzIGlzIGEgcmVhZC1vbmx5IGF0dHJpYnV0ZS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W05vZGVde25vZGVOYW1lfQotVGhpcyBoYXMgYSBkaWZmZXJlbnQgbWVhbmluZyBmb3IgZWFjaCBub2RlIHR5cGU7IHNlZSB0aGUgRE9NCi1zcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzLiAgWW91IGNhbiBhbHdheXMgZ2V0IHRoZSBpbmZvcm1hdGlvbiB5b3UKLXdvdWxkIGdldCBoZXJlIGZyb20gYW5vdGhlciBwcm9wZXJ0eSBzdWNoIGFzIHRoZSBcbWVtYmVye3RhZ05hbWV9Ci1wcm9wZXJ0eSBmb3IgZWxlbWVudHMgb3IgdGhlIFxtZW1iZXJ7bmFtZX0gcHJvcGVydHkgZm9yIGF0dHJpYnV0ZXMuCi1Gb3IgYWxsIG5vZGUgdHlwZXMsIHRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSB3aWxsIGJlIGVpdGhlciBhCi1zdHJpbmcgb3IgXGNvZGV7Tm9uZX0uICBUaGlzIGlzIGEgcmVhZC1vbmx5IGF0dHJpYnV0ZS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W05vZGVde25vZGVWYWx1ZX0KLVRoaXMgaGFzIGEgZGlmZmVyZW50IG1lYW5pbmcgZm9yIGVhY2ggbm9kZSB0eXBlOyBzZWUgdGhlIERPTQotc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy4gIFRoZSBzaXR1YXRpb24gaXMgc2ltaWxhciB0byB0aGF0IHdpdGgKLVxtZW1iZXJ7bm9kZU5hbWV9LiAgVGhlIHZhbHVlIGlzIGEgc3RyaW5nIG9yIFxjb2Rle05vbmV9LgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTm9kZV17aGFzQXR0cmlidXRlc317fQotUmV0dXJucyB0cnVlIGlmIHRoZSBub2RlIGhhcyBhbnkgYXR0cmlidXRlcy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W05vZGVde2hhc0NoaWxkTm9kZXN9e30KLVJldHVybnMgdHJ1ZSBpZiB0aGUgbm9kZSBoYXMgYW55IGNoaWxkIG5vZGVzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTm9kZV17aXNTYW1lTm9kZX17b3RoZXJ9Ci1SZXR1cm5zIHRydWUgaWYgXHZhcntvdGhlcn0gcmVmZXJzIHRvIHRoZSBzYW1lIG5vZGUgYXMgdGhpcyBub2RlLgotVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBmb3IgRE9NIGltcGxlbWVudGF0aW9ucyB3aGljaCB1c2UgYW55IHNvcnQKLW9mIHByb3h5IGFyY2hpdGVjdHVyZSAoYmVjYXVzZSBtb3JlIHRoYW4gb25lIG9iamVjdCBjYW4gcmVmZXIgdG8gdGhlCi1zYW1lIG5vZGUpLgotCi1cYmVnaW57bm90aWNlfQotICBUaGlzIGlzIGJhc2VkIG9uIGEgcHJvcG9zZWQgRE9NIExldmVsfjMgQVBJIHdoaWNoIGlzIHN0aWxsIGluIHRoZQotICBgYHdvcmtpbmcgZHJhZnQnJyBzdGFnZSwgYnV0IHRoaXMgcGFydGljdWxhciBpbnRlcmZhY2UgYXBwZWFycwotICB1bmNvbnRyb3ZlcnNpYWwuICBDaGFuZ2VzIGZyb20gdGhlIFczQyB3aWxsIG5vdCBuZWNlc3NhcmlseSBhZmZlY3QKLSAgdGhpcyBtZXRob2QgaW4gdGhlIFB5dGhvbiBET00gaW50ZXJmYWNlICh0aG91Z2ggYW55IG5ldyBXM0MgQVBJIGZvcgotICB0aGlzIHdvdWxkIGFsc28gYmUgc3VwcG9ydGVkKS4KLVxlbmR7bm90aWNlfQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTm9kZV17YXBwZW5kQ2hpbGR9e25ld0NoaWxkfQotQWRkIGEgbmV3IGNoaWxkIG5vZGUgdG8gdGhpcyBub2RlIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3Qgb2YgY2hpbGRyZW4sCi1yZXR1cm5pbmcgXHZhcntuZXdDaGlsZH0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtOb2RlXXtpbnNlcnRCZWZvcmV9e25ld0NoaWxkLCByZWZDaGlsZH0KLUluc2VydCBhIG5ldyBjaGlsZCBub2RlIGJlZm9yZSBhbiBleGlzdGluZyBjaGlsZC4gIEl0IG11c3QgYmUgdGhlIGNhc2UKLXRoYXQgXHZhcntyZWZDaGlsZH0gaXMgYSBjaGlsZCBvZiB0aGlzIG5vZGU7IGlmIG5vdCwKLVxleGNlcHRpb257VmFsdWVFcnJvcn0gaXMgcmFpc2VkLiAgXHZhcntuZXdDaGlsZH0gaXMgcmV0dXJuZWQuIElmCi1cdmFye3JlZkNoaWxkfSBpcyBcY29kZXtOb25lfSwgaXQgaW5zZXJ0cyBcdmFye25ld0NoaWxkfSBhdCB0aGUgZW5kIG9mCi10aGUgY2hpbGRyZW4ncyBsaXN0LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTm9kZV17cmVtb3ZlQ2hpbGR9e29sZENoaWxkfQotUmVtb3ZlIGEgY2hpbGQgbm9kZS4gIFx2YXJ7b2xkQ2hpbGR9IG11c3QgYmUgYSBjaGlsZCBvZiB0aGlzIG5vZGU7IGlmCi1ub3QsIFxleGNlcHRpb257VmFsdWVFcnJvcn0gaXMgcmFpc2VkLiAgXHZhcntvbGRDaGlsZH0gaXMgcmV0dXJuZWQgb24KLXN1Y2Nlc3MuICBJZiBcdmFye29sZENoaWxkfSB3aWxsIG5vdCBiZSB1c2VkIGZ1cnRoZXIsIGl0cwotXG1ldGhvZHt1bmxpbmsoKX0gbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtOb2RlXXtyZXBsYWNlQ2hpbGR9e25ld0NoaWxkLCBvbGRDaGlsZH0KLVJlcGxhY2UgYW4gZXhpc3Rpbmcgbm9kZSB3aXRoIGEgbmV3IG5vZGUuIEl0IG11c3QgYmUgdGhlIGNhc2UgdGhhdCAKLVx2YXJ7b2xkQ2hpbGR9IGlzIGEgY2hpbGQgb2YgdGhpcyBub2RlOyBpZiBub3QsCi1cZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IGlzIHJhaXNlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W05vZGVde25vcm1hbGl6ZX17fQotSm9pbiBhZGphY2VudCB0ZXh0IG5vZGVzIHNvIHRoYXQgYWxsIHN0cmV0Y2hlcyBvZiB0ZXh0IGFyZSBzdG9yZWQgYXMKLXNpbmdsZSBcY2xhc3N7VGV4dH0gaW5zdGFuY2VzLiAgVGhpcyBzaW1wbGlmaWVzIHByb2Nlc3NpbmcgdGV4dCBmcm9tIGEKLURPTSB0cmVlIGZvciBtYW55IGFwcGxpY2F0aW9ucy4KLVx2ZXJzaW9uYWRkZWR7Mi4xfQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTm9kZV17Y2xvbmVOb2RlfXtkZWVwfQotQ2xvbmUgdGhpcyBub2RlLiAgU2V0dGluZyBcdmFye2RlZXB9IG1lYW5zIHRvIGNsb25lIGFsbCBjaGlsZCBub2RlcyBhcwotd2VsbC4gIFRoaXMgcmV0dXJucyB0aGUgY2xvbmUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLQotXHN1YnN1YnNlY3Rpb257Tm9kZUxpc3QgT2JqZWN0cyBcbGFiZWx7ZG9tLW5vZGVsaXN0LW9iamVjdHN9fQotCi1BIFxjbGFzc3tOb2RlTGlzdH0gcmVwcmVzZW50cyBhIHNlcXVlbmNlIG9mIG5vZGVzLiAgVGhlc2Ugb2JqZWN0cyBhcmUKLXVzZWQgaW4gdHdvIHdheXMgaW4gdGhlIERPTSBDb3JlIHJlY29tbWVuZGF0aW9uOiAgdGhlCi1cY2xhc3N7RWxlbWVudH0gb2JqZWN0cyBwcm92aWRlcyBvbmUgYXMgaXRzIGxpc3Qgb2YgY2hpbGQgbm9kZXMsIGFuZAotdGhlIFxtZXRob2R7Z2V0RWxlbWVudHNCeVRhZ05hbWUoKX0gYW5kCi1cbWV0aG9ke2dldEVsZW1lbnRzQnlUYWdOYW1lTlMoKX0gbWV0aG9kcyBvZiBcY2xhc3N7Tm9kZX0gcmV0dXJuCi1vYmplY3RzIHdpdGggdGhpcyBpbnRlcmZhY2UgdG8gcmVwcmVzZW50IHF1ZXJ5IHJlc3VsdHMuCi0KLVRoZSBET00gTGV2ZWx+MiByZWNvbW1lbmRhdGlvbiBkZWZpbmVzIG9uZSBtZXRob2QgYW5kIG9uZSBhdHRyaWJ1dGUKLWZvciB0aGVzZSBvYmplY3RzOgotCi1cYmVnaW57bWV0aG9kZGVzY31bTm9kZUxpc3Rde2l0ZW19e2l9Ci0gIFJldHVybiB0aGUgXHZhcntpfSd0aCBpdGVtIGZyb20gdGhlIHNlcXVlbmNlLCBpZiB0aGVyZSBpcyBvbmUsIG9yCi0gIFxjb2Rle05vbmV9LiAgVGhlIGluZGV4IFx2YXJ7aX0gaXMgbm90IGFsbG93ZWQgdG8gYmUgbGVzcyB0aGVuIHplcm8KLSAgb3IgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bTm9kZUxpc3Rde2xlbmd0aH0KLSAgVGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGUgc2VxdWVuY2UuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLUluIGFkZGl0aW9uLCB0aGUgUHl0aG9uIERPTSBpbnRlcmZhY2UgcmVxdWlyZXMgdGhhdCBzb21lIGFkZGl0aW9uYWwKLXN1cHBvcnQgaXMgcHJvdmlkZWQgdG8gYWxsb3cgXGNsYXNze05vZGVMaXN0fSBvYmplY3RzIHRvIGJlIHVzZWQgYXMKLVB5dGhvbiBzZXF1ZW5jZXMuICBBbGwgXGNsYXNze05vZGVMaXN0fSBpbXBsZW1lbnRhdGlvbnMgbXVzdCBpbmNsdWRlCi1zdXBwb3J0IGZvciBcbWV0aG9ke19fbGVuX18oKX0gYW5kIFxtZXRob2R7X19nZXRpdGVtX18oKX07IHRoaXMgYWxsb3dzCi1pdGVyYXRpb24gb3ZlciB0aGUgXGNsYXNze05vZGVMaXN0fSBpbiBca2V5d29yZHtmb3J9IHN0YXRlbWVudHMgYW5kCi1wcm9wZXIgc3VwcG9ydCBmb3IgdGhlIFxmdW5jdGlvbntsZW4oKX0gYnVpbHQtaW4gZnVuY3Rpb24uCi0KLUlmIGEgRE9NIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG1vZGlmaWNhdGlvbiBvZiB0aGUgZG9jdW1lbnQsIHRoZQotXGNsYXNze05vZGVMaXN0fSBpbXBsZW1lbnRhdGlvbiBtdXN0IGFsc28gc3VwcG9ydCB0aGUKLVxtZXRob2R7X19zZXRpdGVtX18oKX0gYW5kIFxtZXRob2R7X19kZWxpdGVtX18oKX0gbWV0aG9kcy4KLQotCi1cc3Vic3Vic2VjdGlvbntEb2N1bWVudFR5cGUgT2JqZWN0cyBcbGFiZWx7ZG9tLWRvY3VtZW50dHlwZS1vYmplY3RzfX0KLQotSW5mb3JtYXRpb24gYWJvdXQgdGhlIG5vdGF0aW9ucyBhbmQgZW50aXRpZXMgZGVjbGFyZWQgYnkgYSBkb2N1bWVudAotKGluY2x1ZGluZyB0aGUgZXh0ZXJuYWwgc3Vic2V0IGlmIHRoZSBwYXJzZXIgdXNlcyBpdCBhbmQgY2FuIHByb3ZpZGUKLXRoZSBpbmZvcm1hdGlvbikgaXMgYXZhaWxhYmxlIGZyb20gYSBcY2xhc3N7RG9jdW1lbnRUeXBlfSBvYmplY3QuICBUaGUKLVxjbGFzc3tEb2N1bWVudFR5cGV9IGZvciBhIGRvY3VtZW50IGlzIGF2YWlsYWJsZSBmcm9tIHRoZQotXGNsYXNze0RvY3VtZW50fSBvYmplY3QncyBcbWVtYmVye2RvY3R5cGV9IGF0dHJpYnV0ZTsgaWYgdGhlcmUgaXMgbm8KLVxjb2Rle0RPQ1RZUEV9IGRlY2xhcmF0aW9uIGZvciB0aGUgZG9jdW1lbnQsIHRoZSBkb2N1bWVudCdzCi1cbWVtYmVye2RvY3R5cGV9IGF0dHJpYnV0ZSB3aWxsIGJlIHNldCB0byBcY29kZXtOb25lfSBpbnN0ZWFkIG9mIGFuCi1pbnN0YW5jZSBvZiB0aGlzIGludGVyZmFjZS4KLQotXGNsYXNze0RvY3VtZW50VHlwZX0gaXMgYSBzcGVjaWFsaXphdGlvbiBvZiBcY2xhc3N7Tm9kZX0sIGFuZCBhZGRzIHRoZQotZm9sbG93aW5nIGF0dHJpYnV0ZXM6Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtEb2N1bWVudFR5cGVde3B1YmxpY0lkfQotICBUaGUgcHVibGljIGlkZW50aWZpZXIgZm9yIHRoZSBleHRlcm5hbCBzdWJzZXQgb2YgdGhlIGRvY3VtZW50IHR5cGUKLSAgZGVmaW5pdGlvbi4gIFRoaXMgd2lsbCBiZSBhIHN0cmluZyBvciBcY29kZXtOb25lfS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W0RvY3VtZW50VHlwZV17c3lzdGVtSWR9Ci0gIFRoZSBzeXN0ZW0gaWRlbnRpZmllciBmb3IgdGhlIGV4dGVybmFsIHN1YnNldCBvZiB0aGUgZG9jdW1lbnQgdHlwZQotICBkZWZpbml0aW9uLiAgVGhpcyB3aWxsIGJlIGEgVVJJIGFzIGEgc3RyaW5nLCBvciBcY29kZXtOb25lfS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W0RvY3VtZW50VHlwZV17aW50ZXJuYWxTdWJzZXR9Ci0gIEEgc3RyaW5nIGdpdmluZyB0aGUgY29tcGxldGUgaW50ZXJuYWwgc3Vic2V0IGZyb20gdGhlIGRvY3VtZW50LgotICBUaGlzIGRvZXMgbm90IGluY2x1ZGUgdGhlIGJyYWNrZXRzIHdoaWNoIGVuY2xvc2UgdGhlIHN1YnNldC4gIElmIHRoZQotICBkb2N1bWVudCBoYXMgbm8gaW50ZXJuYWwgc3Vic2V0LCB0aGlzIHNob3VsZCBiZSBcY29kZXtOb25lfS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W0RvY3VtZW50VHlwZV17bmFtZX0KLSAgVGhlIG5hbWUgb2YgdGhlIHJvb3QgZWxlbWVudCBhcyBnaXZlbiBpbiB0aGUgXGNvZGV7RE9DVFlQRX0KLSAgZGVjbGFyYXRpb24sIGlmIHByZXNlbnQuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtEb2N1bWVudFR5cGVde2VudGl0aWVzfQotICBUaGlzIGlzIGEgXGNsYXNze05hbWVkTm9kZU1hcH0gZ2l2aW5nIHRoZSBkZWZpbml0aW9ucyBvZiBleHRlcm5hbAotICBlbnRpdGllcy4gIEZvciBlbnRpdHkgbmFtZXMgZGVmaW5lZCBtb3JlIHRoYW4gb25jZSwgb25seSB0aGUgZmlyc3QKLSAgZGVmaW5pdGlvbiBpcyBwcm92aWRlZCAob3RoZXJzIGFyZSBpZ25vcmVkIGFzIHJlcXVpcmVkIGJ5IHRoZSBYTUwKLSAgcmVjb21tZW5kYXRpb24pLiAgVGhpcyBtYXkgYmUgXGNvZGV7Tm9uZX0gaWYgdGhlIGluZm9ybWF0aW9uIGlzIG5vdAotICBwcm92aWRlZCBieSB0aGUgcGFyc2VyLCBvciBpZiBubyBlbnRpdGllcyBhcmUgZGVmaW5lZC4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W0RvY3VtZW50VHlwZV17bm90YXRpb25zfQotICBUaGlzIGlzIGEgXGNsYXNze05hbWVkTm9kZU1hcH0gZ2l2aW5nIHRoZSBkZWZpbml0aW9ucyBvZiBub3RhdGlvbnMuCi0gIEZvciBub3RhdGlvbiBuYW1lcyBkZWZpbmVkIG1vcmUgdGhhbiBvbmNlLCBvbmx5IHRoZSBmaXJzdCBkZWZpbml0aW9uCi0gIGlzIHByb3ZpZGVkIChvdGhlcnMgYXJlIGlnbm9yZWQgYXMgcmVxdWlyZWQgYnkgdGhlIFhNTAotICByZWNvbW1lbmRhdGlvbikuICBUaGlzIG1heSBiZSBcY29kZXtOb25lfSBpZiB0aGUgaW5mb3JtYXRpb24gaXMgbm90Ci0gIHByb3ZpZGVkIGJ5IHRoZSBwYXJzZXIsIG9yIGlmIG5vIG5vdGF0aW9ucyBhcmUgZGVmaW5lZC4KLVxlbmR7bWVtYmVyZGVzY30KLQotCi1cc3Vic3Vic2VjdGlvbntEb2N1bWVudCBPYmplY3RzIFxsYWJlbHtkb20tZG9jdW1lbnQtb2JqZWN0c319Ci0KLUEgXGNsYXNze0RvY3VtZW50fSByZXByZXNlbnRzIGFuIGVudGlyZSBYTUwgZG9jdW1lbnQsIGluY2x1ZGluZyBpdHMKLWNvbnN0aXR1ZW50IGVsZW1lbnRzLCBhdHRyaWJ1dGVzLCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucywgY29tbWVudHMKLWV0Yy4gIFJlbWViZXIgdGhhdCBpdCBpbmhlcml0cyBwcm9wZXJ0aWVzIGZyb20gXGNsYXNze05vZGV9LgotCi1cYmVnaW57bWVtYmVyZGVzY31bRG9jdW1lbnRde2RvY3VtZW50RWxlbWVudH0KLVRoZSBvbmUgYW5kIG9ubHkgcm9vdCBlbGVtZW50IG9mIHRoZSBkb2N1bWVudC4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0RvY3VtZW50XXtjcmVhdGVFbGVtZW50fXt0YWdOYW1lfQotQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgZWxlbWVudCBub2RlLiAgVGhlIGVsZW1lbnQgaXMgbm90IGluc2VydGVkCi1pbnRvIHRoZSBkb2N1bWVudCB3aGVuIGl0IGlzIGNyZWF0ZWQuICBZb3UgbmVlZCB0byBleHBsaWNpdGx5IGluc2VydAotaXQgd2l0aCBvbmUgb2YgdGhlIG90aGVyIG1ldGhvZHMgc3VjaCBhcyBcbWV0aG9ke2luc2VydEJlZm9yZSgpfSBvcgotXG1ldGhvZHthcHBlbmRDaGlsZCgpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0RvY3VtZW50XXtjcmVhdGVFbGVtZW50TlN9e25hbWVzcGFjZVVSSSwgdGFnTmFtZX0KLUNyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IGVsZW1lbnQgd2l0aCBhIG5hbWVzcGFjZS4gIFRoZQotXHZhcnt0YWdOYW1lfSBtYXkgaGF2ZSBhIHByZWZpeC4gIFRoZSBlbGVtZW50IGlzIG5vdCBpbnNlcnRlZCBpbnRvIHRoZQotZG9jdW1lbnQgd2hlbiBpdCBpcyBjcmVhdGVkLiAgWW91IG5lZWQgdG8gZXhwbGljaXRseSBpbnNlcnQgaXQgd2l0aAotb25lIG9mIHRoZSBvdGhlciBtZXRob2RzIHN1Y2ggYXMgXG1ldGhvZHtpbnNlcnRCZWZvcmUoKX0gb3IKLVxtZXRob2R7YXBwZW5kQ2hpbGQoKX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtEb2N1bWVudF17Y3JlYXRlVGV4dE5vZGV9e2RhdGF9Ci1DcmVhdGUgYW5kIHJldHVybiBhIHRleHQgbm9kZSBjb250YWluaW5nIHRoZSBkYXRhIHBhc3NlZCBhcyBhCi1wYXJhbWV0ZXIuICBBcyB3aXRoIHRoZSBvdGhlciBjcmVhdGlvbiBtZXRob2RzLCB0aGlzIG9uZSBkb2VzIG5vdAotaW5zZXJ0IHRoZSBub2RlIGludG8gdGhlIHRyZWUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtEb2N1bWVudF17Y3JlYXRlQ29tbWVudH17ZGF0YX0KLUNyZWF0ZSBhbmQgcmV0dXJuIGEgY29tbWVudCBub2RlIGNvbnRhaW5pbmcgdGhlIGRhdGEgcGFzc2VkIGFzIGEKLXBhcmFtZXRlci4gIEFzIHdpdGggdGhlIG90aGVyIGNyZWF0aW9uIG1ldGhvZHMsIHRoaXMgb25lIGRvZXMgbm90Ci1pbnNlcnQgdGhlIG5vZGUgaW50byB0aGUgdHJlZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0RvY3VtZW50XXtjcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb259e3RhcmdldCwgZGF0YX0KLUNyZWF0ZSBhbmQgcmV0dXJuIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBub2RlIGNvbnRhaW5pbmcgdGhlCi1cdmFye3RhcmdldH0gYW5kIFx2YXJ7ZGF0YX0gcGFzc2VkIGFzIHBhcmFtZXRlcnMuICBBcyB3aXRoIHRoZSBvdGhlcgotY3JlYXRpb24gbWV0aG9kcywgdGhpcyBvbmUgZG9lcyBub3QgaW5zZXJ0IHRoZSBub2RlIGludG8gdGhlIHRyZWUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtEb2N1bWVudF17Y3JlYXRlQXR0cmlidXRlfXtuYW1lfQotQ3JlYXRlIGFuZCByZXR1cm4gYW4gYXR0cmlidXRlIG5vZGUuICBUaGlzIG1ldGhvZCBkb2VzIG5vdCBhc3NvY2lhdGUKLXRoZSBhdHRyaWJ1dGUgbm9kZSB3aXRoIGFueSBwYXJ0aWN1bGFyIGVsZW1lbnQuICBZb3UgbXVzdCB1c2UKLVxtZXRob2R7c2V0QXR0cmlidXRlTm9kZSgpfSBvbiB0aGUgYXBwcm9wcmlhdGUgXGNsYXNze0VsZW1lbnR9IG9iamVjdAotdG8gdXNlIHRoZSBuZXdseSBjcmVhdGVkIGF0dHJpYnV0ZSBpbnN0YW5jZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0RvY3VtZW50XXtjcmVhdGVBdHRyaWJ1dGVOU317bmFtZXNwYWNlVVJJLCBxdWFsaWZpZWROYW1lfQotQ3JlYXRlIGFuZCByZXR1cm4gYW4gYXR0cmlidXRlIG5vZGUgd2l0aCBhIG5hbWVzcGFjZS4gIFRoZQotXHZhcnt0YWdOYW1lfSBtYXkgaGF2ZSBhIHByZWZpeC4gIFRoaXMgbWV0aG9kIGRvZXMgbm90IGFzc29jaWF0ZSB0aGUKLWF0dHJpYnV0ZSBub2RlIHdpdGggYW55IHBhcnRpY3VsYXIgZWxlbWVudC4gIFlvdSBtdXN0IHVzZQotXG1ldGhvZHtzZXRBdHRyaWJ1dGVOb2RlKCl9IG9uIHRoZSBhcHByb3ByaWF0ZSBcY2xhc3N7RWxlbWVudH0gb2JqZWN0Ci10byB1c2UgdGhlIG5ld2x5IGNyZWF0ZWQgYXR0cmlidXRlIGluc3RhbmNlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRG9jdW1lbnRde2dldEVsZW1lbnRzQnlUYWdOYW1lfXt0YWdOYW1lfQotU2VhcmNoIGZvciBhbGwgZGVzY2VuZGFudHMgKGRpcmVjdCBjaGlsZHJlbiwgY2hpbGRyZW4ncyBjaGlsZHJlbiwKLWV0Yy4pIHdpdGggYSBwYXJ0aWN1bGFyIGVsZW1lbnQgdHlwZSBuYW1lLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRG9jdW1lbnRde2dldEVsZW1lbnRzQnlUYWdOYW1lTlN9e25hbWVzcGFjZVVSSSwgbG9jYWxOYW1lfQotU2VhcmNoIGZvciBhbGwgZGVzY2VuZGFudHMgKGRpcmVjdCBjaGlsZHJlbiwgY2hpbGRyZW4ncyBjaGlsZHJlbiwKLWV0Yy4pIHdpdGggYSBwYXJ0aWN1bGFyIG5hbWVzcGFjZSBVUkkgYW5kIGxvY2FsbmFtZS4gIFRoZSBsb2NhbG5hbWUgaXMKLXRoZSBwYXJ0IG9mIHRoZSBuYW1lc3BhY2UgYWZ0ZXIgdGhlIHByZWZpeC4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cc3Vic3Vic2VjdGlvbntFbGVtZW50IE9iamVjdHMgXGxhYmVse2RvbS1lbGVtZW50LW9iamVjdHN9fQotCi1cY2xhc3N7RWxlbWVudH0gaXMgYSBzdWJjbGFzcyBvZiBcY2xhc3N7Tm9kZX0sIHNvIGluaGVyaXRzIGFsbCB0aGUKLWF0dHJpYnV0ZXMgb2YgdGhhdCBjbGFzcy4KLQotXGJlZ2lue21lbWJlcmRlc2N9W0VsZW1lbnRde3RhZ05hbWV9Ci1UaGUgZWxlbWVudCB0eXBlIG5hbWUuICBJbiBhIG5hbWVzcGFjZS11c2luZyBkb2N1bWVudCBpdCBtYXkgaGF2ZQotY29sb25zIGluIGl0LiAgVGhlIHZhbHVlIGlzIGEgc3RyaW5nLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRWxlbWVudF17Z2V0RWxlbWVudHNCeVRhZ05hbWV9e3RhZ05hbWV9Ci1TYW1lIGFzIGVxdWl2YWxlbnQgbWV0aG9kIGluIHRoZSBcY2xhc3N7RG9jdW1lbnR9IGNsYXNzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRWxlbWVudF17Z2V0RWxlbWVudHNCeVRhZ05hbWVOU317dGFnTmFtZX0KLVNhbWUgYXMgZXF1aXZhbGVudCBtZXRob2QgaW4gdGhlIFxjbGFzc3tEb2N1bWVudH0gY2xhc3MuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtFbGVtZW50XXtoYXNBdHRyaWJ1dGV9e25hbWV9Ci1SZXR1cm5zIHRydWUgaWYgdGhlIGVsZW1lbnQgaGFzIGFuIGF0dHJpYnV0ZSBuYW1lZCBieSBcdmFye25hbWV9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRWxlbWVudF17aGFzQXR0cmlidXRlTlN9e25hbWVzcGFjZVVSSSwgbG9jYWxOYW1lfQotUmV0dXJucyB0cnVlIGlmIHRoZSBlbGVtZW50IGhhcyBhbiBhdHRyaWJ1dGUgbmFtZWQgYnkKLVx2YXJ7bmFtZXNwYWNlVVJJfSBhbmQgXHZhcntsb2NhbE5hbWV9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRWxlbWVudF17Z2V0QXR0cmlidXRlfXtuYW1lfQotUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIG5hbWVkIGJ5IFx2YXJ7bmFtZX0gYXMgYQotc3RyaW5nLiBJZiBubyBzdWNoIGF0dHJpYnV0ZSBleGlzdHMsIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCwKLWFzIGlmIHRoZSBhdHRyaWJ1dGUgaGFkIG5vIHZhbHVlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRWxlbWVudF17Z2V0QXR0cmlidXRlTm9kZX17YXR0cm5hbWV9Ci1SZXR1cm4gdGhlIFxjbGFzc3tBdHRyfSBub2RlIGZvciB0aGUgYXR0cmlidXRlIG5hbWVkIGJ5Ci1cdmFye2F0dHJuYW1lfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0VsZW1lbnRde2dldEF0dHJpYnV0ZU5TfXtuYW1lc3BhY2VVUkksIGxvY2FsTmFtZX0KLVJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBuYW1lZCBieSBcdmFye25hbWVzcGFjZVVSSX0gYW5kCi1cdmFye2xvY2FsTmFtZX0gYXMgYSBzdHJpbmcuIElmIG5vIHN1Y2ggYXR0cmlidXRlIGV4aXN0cywgYW4gZW1wdHkKLXN0cmluZyBpcyByZXR1cm5lZCwgYXMgaWYgdGhlIGF0dHJpYnV0ZSBoYWQgbm8gdmFsdWUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtFbGVtZW50XXtnZXRBdHRyaWJ1dGVOb2RlTlN9e25hbWVzcGFjZVVSSSwgbG9jYWxOYW1lfQotUmV0dXJuIGFuIGF0dHJpYnV0ZSB2YWx1ZSBhcyBhIG5vZGUsIGdpdmVuIGEgXHZhcntuYW1lc3BhY2VVUkl9IGFuZAotXHZhcntsb2NhbE5hbWV9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRWxlbWVudF17cmVtb3ZlQXR0cmlidXRlfXtuYW1lfQotUmVtb3ZlIGFuIGF0dHJpYnV0ZSBieSBuYW1lLiAgTm8gZXhjZXB0aW9uIGlzIHJhaXNlZCBpZiB0aGVyZSBpcyBubwotbWF0Y2hpbmcgYXR0cmlidXRlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRWxlbWVudF17cmVtb3ZlQXR0cmlidXRlTm9kZX17b2xkQXR0cn0KLVJlbW92ZSBhbmQgcmV0dXJuIFx2YXJ7b2xkQXR0cn0gZnJvbSB0aGUgYXR0cmlidXRlIGxpc3QsIGlmIHByZXNlbnQuCi1JZiBcdmFye29sZEF0dHJ9IGlzIG5vdCBwcmVzZW50LCBcZXhjZXB0aW9ue05vdEZvdW5kRXJyfSBpcyByYWlzZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtFbGVtZW50XXtyZW1vdmVBdHRyaWJ1dGVOU317bmFtZXNwYWNlVVJJLCBsb2NhbE5hbWV9Ci1SZW1vdmUgYW4gYXR0cmlidXRlIGJ5IG5hbWUuICBOb3RlIHRoYXQgaXQgdXNlcyBhIGxvY2FsTmFtZSwgbm90IGEKLXFuYW1lLiAgTm8gZXhjZXB0aW9uIGlzIHJhaXNlZCBpZiB0aGVyZSBpcyBubyBtYXRjaGluZyBhdHRyaWJ1dGUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtFbGVtZW50XXtzZXRBdHRyaWJ1dGV9e25hbWUsIHZhbHVlfQotU2V0IGFuIGF0dHJpYnV0ZSB2YWx1ZSBmcm9tIGEgc3RyaW5nLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRWxlbWVudF17c2V0QXR0cmlidXRlTm9kZX17bmV3QXR0cn0KLUFkZCBhIG5ldyBhdHRyaWJ1dGUgbm9kZSB0byB0aGUgZWxlbWVudCwgcmVwbGFjaW5nIGFuIGV4aXN0aW5nCi1hdHRyaWJ1dGUgaWYgbmVjZXNzYXJ5IGlmIHRoZSBcbWVtYmVye25hbWV9IGF0dHJpYnV0ZSBtYXRjaGVzLiAgSWYgYQotcmVwbGFjZW1lbnQgb2NjdXJzLCB0aGUgb2xkIGF0dHJpYnV0ZSBub2RlIHdpbGwgYmUgcmV0dXJuZWQuICBJZgotXHZhcntuZXdBdHRyfSBpcyBhbHJlYWR5IGluIHVzZSwgXGV4Y2VwdGlvbntJbnVzZUF0dHJpYnV0ZUVycn0gd2lsbCBiZQotcmFpc2VkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRWxlbWVudF17c2V0QXR0cmlidXRlTm9kZU5TfXtuZXdBdHRyfQotQWRkIGEgbmV3IGF0dHJpYnV0ZSBub2RlIHRvIHRoZSBlbGVtZW50LCByZXBsYWNpbmcgYW4gZXhpc3RpbmcKLWF0dHJpYnV0ZSBpZiBuZWNlc3NhcnkgaWYgdGhlIFxtZW1iZXJ7bmFtZXNwYWNlVVJJfSBhbmQKLVxtZW1iZXJ7bG9jYWxOYW1lfSBhdHRyaWJ1dGVzIG1hdGNoLiAgSWYgYSByZXBsYWNlbWVudCBvY2N1cnMsIHRoZSBvbGQKLWF0dHJpYnV0ZSBub2RlIHdpbGwgYmUgcmV0dXJuZWQuICBJZiBcdmFye25ld0F0dHJ9IGlzIGFscmVhZHkgaW4gdXNlLAotXGV4Y2VwdGlvbntJbnVzZUF0dHJpYnV0ZUVycn0gd2lsbCBiZSByYWlzZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtFbGVtZW50XXtzZXRBdHRyaWJ1dGVOU317bmFtZXNwYWNlVVJJLCBxbmFtZSwgdmFsdWV9Ci1TZXQgYW4gYXR0cmlidXRlIHZhbHVlIGZyb20gYSBzdHJpbmcsIGdpdmVuIGEgXHZhcntuYW1lc3BhY2VVUkl9IGFuZCBhCi1cdmFye3FuYW1lfS4gIE5vdGUgdGhhdCBhIHFuYW1lIGlzIHRoZSB3aG9sZSBhdHRyaWJ1dGUgbmFtZS4gIFRoaXMgaXMKLWRpZmZlcmVudCB0aGFuIGFib3ZlLgotXGVuZHttZXRob2RkZXNjfQotCi0KLVxzdWJzdWJzZWN0aW9ue0F0dHIgT2JqZWN0cyBcbGFiZWx7ZG9tLWF0dHItb2JqZWN0c319Ci0KLVxjbGFzc3tBdHRyfSBpbmhlcml0cyBmcm9tIFxjbGFzc3tOb2RlfSwgc28gaW5oZXJpdHMgYWxsIGl0cwotYXR0cmlidXRlcy4KLQotXGJlZ2lue21lbWJlcmRlc2N9W0F0dHJde25hbWV9Ci1UaGUgYXR0cmlidXRlIG5hbWUuICBJbiBhIG5hbWVzcGFjZS11c2luZyBkb2N1bWVudCBpdCBtYXkgaGF2ZSBjb2xvbnMKLWluIGl0LgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bQXR0cl17bG9jYWxOYW1lfQotVGhlIHBhcnQgb2YgdGhlIG5hbWUgZm9sbG93aW5nIHRoZSBjb2xvbiBpZiB0aGVyZSBpcyBvbmUsIGVsc2UgdGhlCi1lbnRpcmUgbmFtZS4gIFRoaXMgaXMgYSByZWFkLW9ubHkgYXR0cmlidXRlLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bQXR0cl17cHJlZml4fQotVGhlIHBhcnQgb2YgdGhlIG5hbWUgcHJlY2VkaW5nIHRoZSBjb2xvbiBpZiB0aGVyZSBpcyBvbmUsIGVsc2UgdGhlCi1lbXB0eSBzdHJpbmcuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLQotXHN1YnN1YnNlY3Rpb257TmFtZWROb2RlTWFwIE9iamVjdHMgXGxhYmVse2RvbS1hdHRyaWJ1dGVsaXN0LW9iamVjdHN9fQotCi1cY2xhc3N7TmFtZWROb2RlTWFwfSBkb2VzIFxlbXBoe25vdH0gaW5oZXJpdCBmcm9tIFxjbGFzc3tOb2RlfS4KLQotXGJlZ2lue21lbWJlcmRlc2N9W05hbWVkTm9kZU1hcF17bGVuZ3RofQotVGhlIGxlbmd0aCBvZiB0aGUgYXR0cmlidXRlIGxpc3QuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtOYW1lZE5vZGVNYXBde2l0ZW19e2luZGV4fQotUmV0dXJuIGFuIGF0dHJpYnV0ZSB3aXRoIGEgcGFydGljdWxhciBpbmRleC4gIFRoZSBvcmRlciB5b3UgZ2V0IHRoZQotYXR0cmlidXRlcyBpbiBpcyBhcmJpdHJhcnkgYnV0IHdpbGwgYmUgY29uc2lzdGVudCBmb3IgdGhlIGxpZmUgb2YgYQotRE9NLiAgRWFjaCBpdGVtIGlzIGFuIGF0dHJpYnV0ZSBub2RlLiAgR2V0IGl0cyB2YWx1ZSB3aXRoIHRoZQotXG1lbWJlcnt2YWx1ZX0gYXR0cmlidXRlLgotXGVuZHttZXRob2RkZXNjfQotCi1UaGVyZSBhcmUgYWxzbyBleHBlcmltZW50YWwgbWV0aG9kcyB0aGF0IGdpdmUgdGhpcyBjbGFzcyBtb3JlIG1hcHBpbmcKLWJlaGF2aW9yLiAgWW91IGNhbiB1c2UgdGhlbSBvciB5b3UgY2FuIHVzZSB0aGUgc3RhbmRhcmRpemVkCi1cbWV0aG9ke2dldEF0dHJpYnV0ZSooKX0gZmFtaWx5IG9mIG1ldGhvZHMgb24gdGhlIFxjbGFzc3tFbGVtZW50fQotb2JqZWN0cy4KLQotCi1cc3Vic3Vic2VjdGlvbntDb21tZW50IE9iamVjdHMgXGxhYmVse2RvbS1jb21tZW50LW9iamVjdHN9fQotCi1cY2xhc3N7Q29tbWVudH0gcmVwcmVzZW50cyBhIGNvbW1lbnQgaW4gdGhlIFhNTCBkb2N1bWVudC4gIEl0IGlzIGEKLXN1YmNsYXNzIG9mIFxjbGFzc3tOb2RlfSwgYnV0IGNhbm5vdCBoYXZlIGNoaWxkIG5vZGVzLgotCi1cYmVnaW57bWVtYmVyZGVzY31bQ29tbWVudF17ZGF0YX0KLVRoZSBjb250ZW50IG9mIHRoZSBjb21tZW50IGFzIGEgc3RyaW5nLiAgVGhlIGF0dHJpYnV0ZSBjb250YWlucyBhbGwKLWNoYXJhY3RlcnMgYmV0d2VlbiB0aGUgbGVhZGluZyBcY29kZXs8IS19XGNvZGV7LX0gYW5kIHRyYWlsaW5nCi1cY29kZXstfVxjb2Rley0+fSwgYnV0IGRvZXMgbm90IGluY2x1ZGUgdGhlbS4KLVxlbmR7bWVtYmVyZGVzY30KLQotCi1cc3Vic3Vic2VjdGlvbntUZXh0IGFuZCBDREFUQVNlY3Rpb24gT2JqZWN0cyBcbGFiZWx7ZG9tLXRleHQtb2JqZWN0c319Ci0KLVRoZSBcY2xhc3N7VGV4dH0gaW50ZXJmYWNlIHJlcHJlc2VudHMgdGV4dCBpbiB0aGUgWE1MIGRvY3VtZW50LiAgSWYKLXRoZSBwYXJzZXIgYW5kIERPTSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IHRoZSBET00ncyBYTUwgZXh0ZW5zaW9uLAotcG9ydGlvbnMgb2YgdGhlIHRleHQgZW5jbG9zZWQgaW4gQ0RBVEEgbWFya2VkIHNlY3Rpb25zIGFyZSBzdG9yZWQgaW4KLVxjbGFzc3tDREFUQVNlY3Rpb259IG9iamVjdHMuICBUaGVzZSB0d28gaW50ZXJmYWNlcyBhcmUgaWRlbnRpY2FsLCBidXQKLXByb3ZpZGUgZGlmZmVyZW50IHZhbHVlcyBmb3IgdGhlIFxtZW1iZXJ7bm9kZVR5cGV9IGF0dHJpYnV0ZS4KLQotVGhlc2UgaW50ZXJmYWNlcyBleHRlbmQgdGhlIFxjbGFzc3tOb2RlfSBpbnRlcmZhY2UuICBUaGV5IGNhbm5vdCBoYXZlCi1jaGlsZCBub2Rlcy4KLQotXGJlZ2lue21lbWJlcmRlc2N9W1RleHRde2RhdGF9Ci1UaGUgY29udGVudCBvZiB0aGUgdGV4dCBub2RlIGFzIGEgc3RyaW5nLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bm90aWNlfQotICBUaGUgdXNlIG9mIGEgXGNsYXNze0NEQVRBU2VjdGlvbn0gbm9kZSBkb2VzIG5vdCBpbmRpY2F0ZSB0aGF0IHRoZQotICBub2RlIHJlcHJlc2VudHMgYSBjb21wbGV0ZSBDREFUQSBtYXJrZWQgc2VjdGlvbiwgb25seSB0aGF0IHRoZQotICBjb250ZW50IG9mIHRoZSBub2RlIHdhcyBwYXJ0IG9mIGEgQ0RBVEEgc2VjdGlvbi4gIEEgc2luZ2xlIENEQVRBCi0gIHNlY3Rpb24gbWF5IGJlIHJlcHJlc2VudGVkIGJ5IG1vcmUgdGhhbiBvbmUgbm9kZSBpbiB0aGUgZG9jdW1lbnQKLSAgdHJlZS4gIFRoZXJlIGlzIG5vIHdheSB0byBkZXRlcm1pbmUgd2hldGhlciB0d28gYWRqYWNlbnQKLSAgXGNsYXNze0NEQVRBU2VjdGlvbn0gbm9kZXMgcmVwcmVzZW50IGRpZmZlcmVudCBDREFUQSBtYXJrZWQKLSAgc2VjdGlvbnMuCi1cZW5ke25vdGljZX0KLQotCi1cc3Vic3Vic2VjdGlvbntQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gT2JqZWN0cyBcbGFiZWx7ZG9tLXBpLW9iamVjdHN9fQotCi1SZXByZXNlbnRzIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBpbiB0aGUgWE1MIGRvY3VtZW50OyB0aGlzIGluaGVyaXRzCi1mcm9tIHRoZSBcY2xhc3N7Tm9kZX0gaW50ZXJmYWNlIGFuZCBjYW5ub3QgaGF2ZSBjaGlsZCBub2Rlcy4KLQotXGJlZ2lue21lbWJlcmRlc2N9W1Byb2Nlc3NpbmdJbnN0cnVjdGlvbl17dGFyZ2V0fQotVGhlIGNvbnRlbnQgb2YgdGhlIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdXAgdG8gdGhlIGZpcnN0IHdoaXRlc3BhY2UKLWNoYXJhY3Rlci4gIFRoaXMgaXMgYSByZWFkLW9ubHkgYXR0cmlidXRlLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bUHJvY2Vzc2luZ0luc3RydWN0aW9uXXtkYXRhfQotVGhlIGNvbnRlbnQgb2YgdGhlIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZm9sbG93aW5nIHRoZSBmaXJzdAotd2hpdGVzcGFjZSBjaGFyYWN0ZXIuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLQotXHN1YnN1YnNlY3Rpb257RXhjZXB0aW9ucyBcbGFiZWx7ZG9tLWV4Y2VwdGlvbnN9fQotCi1cdmVyc2lvbmFkZGVkezIuMX0KLQotVGhlIERPTSBMZXZlbH4yIHJlY29tbWVuZGF0aW9uIGRlZmluZXMgYSBzaW5nbGUgZXhjZXB0aW9uLAotXGV4Y2VwdGlvbntET01FeGNlcHRpb259LCBhbmQgYSBudW1iZXIgb2YgY29uc3RhbnRzIHRoYXQgYWxsb3cKLWFwcGxpY2F0aW9ucyB0byBkZXRlcm1pbmUgd2hhdCBzb3J0IG9mIGVycm9yIG9jY3VycmVkLgotXGV4Y2VwdGlvbntET01FeGNlcHRpb259IGluc3RhbmNlcyBjYXJyeSBhIFxtZW1iZXJ7Y29kZX0gYXR0cmlidXRlCi10aGF0IHByb3ZpZGVzIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmljIGV4Y2VwdGlvbi4KLQotVGhlIFB5dGhvbiBET00gaW50ZXJmYWNlIHByb3ZpZGVzIHRoZSBjb25zdGFudHMsIGJ1dCBhbHNvIGV4cGFuZHMgdGhlCi1zZXQgb2YgZXhjZXB0aW9ucyBzbyB0aGF0IGEgc3BlY2lmaWMgZXhjZXB0aW9uIGV4aXN0cyBmb3IgZWFjaCBvZiB0aGUKLWV4Y2VwdGlvbiBjb2RlcyBkZWZpbmVkIGJ5IHRoZSBET00uICBUaGUgaW1wbGVtZW50YXRpb25zIG11c3QgcmFpc2UKLXRoZSBhcHByb3ByaWF0ZSBzcGVjaWZpYyBleGNlcHRpb24sIGVhY2ggb2Ygd2hpY2ggY2FycmllcyB0aGUKLWFwcHJvcHJpYXRlIHZhbHVlIGZvciB0aGUgXG1lbWJlcntjb2RlfSBhdHRyaWJ1dGUuCi0KLVxiZWdpbntleGNkZXNjfXtET01FeGNlcHRpb259Ci0gIEJhc2UgZXhjZXB0aW9uIGNsYXNzIHVzZWQgZm9yIGFsbCBzcGVjaWZpYyBET00gZXhjZXB0aW9ucy4gIFRoaXMKLSAgZXhjZXB0aW9uIGNsYXNzIGNhbm5vdCBiZSBkaXJlY3RseSBpbnN0YW50aWF0ZWQuCi1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtEb21zdHJpbmdTaXplRXJyfQotICBSYWlzZWQgd2hlbiBhIHNwZWNpZmllZCByYW5nZSBvZiB0ZXh0IGRvZXMgbm90IGZpdCBpbnRvIGEgc3RyaW5nLgotICBUaGlzIGlzIG5vdCBrbm93biB0byBiZSB1c2VkIGluIHRoZSBQeXRob24gRE9NIGltcGxlbWVudGF0aW9ucywgYnV0Ci0gIG1heSBiZSByZWNlaXZlZCBmcm9tIERPTSBpbXBsZW1lbnRhdGlvbnMgbm90IHdyaXR0ZW4gaW4gUHl0aG9uLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317SGllcmFyY2h5UmVxdWVzdEVycn0KLSAgUmFpc2VkIHdoZW4gYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGluc2VydCBhIG5vZGUgd2hlcmUgdGhlIG5vZGUgdHlwZQotICBpcyBub3QgYWxsb3dlZC4KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e0luZGV4U2l6ZUVycn0KLSAgUmFpc2VkIHdoZW4gYW4gaW5kZXggb3Igc2l6ZSBwYXJhbWV0ZXIgdG8gYSBtZXRob2QgaXMgbmVnYXRpdmUgb3IKLSAgZXhjZWVkcyB0aGUgYWxsb3dlZCB2YWx1ZXMuCi1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtJbnVzZUF0dHJpYnV0ZUVycn0KLSAgUmFpc2VkIHdoZW4gYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGluc2VydCBhbiBcY2xhc3N7QXR0cn0gbm9kZSB0aGF0Ci0gIGlzIGFscmVhZHkgcHJlc2VudCBlbHNld2hlcmUgaW4gdGhlIGRvY3VtZW50LgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317SW52YWxpZEFjY2Vzc0Vycn0KLSAgUmFpc2VkIGlmIGEgcGFyYW1ldGVyIG9yIGFuIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZQotICB1bmRlcmx5aW5nIG9iamVjdC4KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e0ludmFsaWRDaGFyYWN0ZXJFcnJ9Ci0gIFRoaXMgZXhjZXB0aW9uIGlzIHJhaXNlZCB3aGVuIGEgc3RyaW5nIHBhcmFtZXRlciBjb250YWlucyBhCi0gIGNoYXJhY3RlciB0aGF0IGlzIG5vdCBwZXJtaXR0ZWQgaW4gdGhlIGNvbnRleHQgaXQncyBiZWluZyB1c2VkIGluIGJ5Ci0gIHRoZSBYTUwgMS4wIHJlY29tbWVuZGF0aW9uLiAgRm9yIGV4YW1wbGUsIGF0dGVtcHRpbmcgdG8gY3JlYXRlIGFuCi0gIFxjbGFzc3tFbGVtZW50fSBub2RlIHdpdGggYSBzcGFjZSBpbiB0aGUgZWxlbWVudCB0eXBlIG5hbWUgd2lsbAotICBjYXVzZSB0aGlzIGVycm9yIHRvIGJlIHJhaXNlZC4KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e0ludmFsaWRNb2RpZmljYXRpb25FcnJ9Ci0gIFJhaXNlZCB3aGVuIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBtb2RpZnkgdGhlIHR5cGUgb2YgYSBub2RlLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317SW52YWxpZFN0YXRlRXJyfQotICBSYWlzZWQgd2hlbiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gdXNlIGFuIG9iamVjdCB0aGF0IGlzIG5vdCBkZWZpbmVkIG9yIGlzIG5vCi0gIGxvbmdlciB1c2FibGUuCi1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtOYW1lc3BhY2VFcnJ9Ci0gIElmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBjaGFuZ2UgYW55IG9iamVjdCBpbiBhIHdheSB0aGF0IGlzIG5vdAotICBwZXJtaXR0ZWQgd2l0aCByZWdhcmQgdG8gdGhlCi0gIFxjaXRldGl0bGVbaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbC1uYW1lcy9de05hbWVzcGFjZXMgaW4gWE1MfQotICByZWNvbW1lbmRhdGlvbiwgdGhpcyBleGNlcHRpb24gaXMgcmFpc2VkLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317Tm90Rm91bmRFcnJ9Ci0gIEV4Y2VwdGlvbiB3aGVuIGEgbm9kZSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgcmVmZXJlbmNlZCBjb250ZXh0LiAgRm9yCi0gIGV4YW1wbGUsIFxtZXRob2R7TmFtZWROb2RlTWFwLnJlbW92ZU5hbWVkSXRlbSgpfSB3aWxsIHJhaXNlIHRoaXMgaWYKLSAgdGhlIG5vZGUgcGFzc2VkIGluIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAuCi1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtOb3RTdXBwb3J0ZWRFcnJ9Ci0gIFJhaXNlZCB3aGVuIHRoZSBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSByZXF1ZXN0ZWQgdHlwZQotICBvZiBvYmplY3Qgb3Igb3BlcmF0aW9uLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317Tm9EYXRhQWxsb3dlZEVycn0KLSAgVGhpcyBpcyByYWlzZWQgaWYgZGF0YSBpcyBzcGVjaWZpZWQgZm9yIGEgbm9kZSB3aGljaCBkb2VzIG5vdAotICBzdXBwb3J0IGRhdGEuCi0gICUgWFhYICBhIGJldHRlciBleHBsYW5hdGlvbiBpcyBuZWVkZWQhCi1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtOb01vZGlmaWNhdGlvbkFsbG93ZWRFcnJ9Ci0gIFJhaXNlZCBvbiBhdHRlbXB0cyB0byBtb2RpZnkgYW4gb2JqZWN0IHdoZXJlIG1vZGlmaWNhdGlvbnMgYXJlIG5vdAotICBhbGxvd2VkIChzdWNoIGFzIGZvciByZWFkLW9ubHkgbm9kZXMpLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317U3ludGF4RXJyfQotICBSYWlzZWQgd2hlbiBhbiBpbnZhbGlkIG9yIGlsbGVnYWwgc3RyaW5nIGlzIHNwZWNpZmllZC4KLSAgJSBYWFggIGhvdyBpcyB0aGlzIGRpZmZlcmVudCBmcm9tIEludmFsaWRDaGFyYWN0ZXJFcnIgPz8/Ci1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtXcm9uZ0RvY3VtZW50RXJyfQotICBSYWlzZWQgd2hlbiBhIG5vZGUgaXMgaW5zZXJ0ZWQgaW4gYSBkaWZmZXJlbnQgZG9jdW1lbnQgdGhhbiBpdAotICBjdXJyZW50bHkgYmVsb25ncyB0bywgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdXBwb3J0Ci0gIG1pZ3JhdGluZyB0aGUgbm9kZSBmcm9tIG9uZSBkb2N1bWVudCB0byB0aGUgb3RoZXIuCi1cZW5ke2V4Y2Rlc2N9Ci0KLVRoZSBleGNlcHRpb24gY29kZXMgZGVmaW5lZCBpbiB0aGUgRE9NIHJlY29tbWVuZGF0aW9uIG1hcCB0byB0aGUKLWV4Y2VwdGlvbnMgZGVzY3JpYmVkIGFib3ZlIGFjY29yZGluZyB0byB0aGlzIHRhYmxlOgotCi1cYmVnaW57dGFibGVpaX17bHxsfXtjb25zdGFudH17Q29uc3RhbnR9e0V4Y2VwdGlvbn0KLSAgXGxpbmVpaXtET01TVFJJTkdfU0laRV9FUlJ9e1xleGNlcHRpb257RG9tc3RyaW5nU2l6ZUVycn19Ci0gIFxsaW5laWl7SElFUkFSQ0hZX1JFUVVFU1RfRVJSfXtcZXhjZXB0aW9ue0hpZXJhcmNoeVJlcXVlc3RFcnJ9fQotICBcbGluZWlpe0lOREVYX1NJWkVfRVJSfXtcZXhjZXB0aW9ue0luZGV4U2l6ZUVycn19Ci0gIFxsaW5laWl7SU5VU0VfQVRUUklCVVRFX0VSUn17XGV4Y2VwdGlvbntJbnVzZUF0dHJpYnV0ZUVycn19Ci0gIFxsaW5laWl7SU5WQUxJRF9BQ0NFU1NfRVJSfXtcZXhjZXB0aW9ue0ludmFsaWRBY2Nlc3NFcnJ9fQotICBcbGluZWlpe0lOVkFMSURfQ0hBUkFDVEVSX0VSUn17XGV4Y2VwdGlvbntJbnZhbGlkQ2hhcmFjdGVyRXJyfX0KLSAgXGxpbmVpaXtJTlZBTElEX01PRElGSUNBVElPTl9FUlJ9e1xleGNlcHRpb257SW52YWxpZE1vZGlmaWNhdGlvbkVycn19Ci0gIFxsaW5laWl7SU5WQUxJRF9TVEFURV9FUlJ9e1xleGNlcHRpb257SW52YWxpZFN0YXRlRXJyfX0KLSAgXGxpbmVpaXtOQU1FU1BBQ0VfRVJSfXtcZXhjZXB0aW9ue05hbWVzcGFjZUVycn19Ci0gIFxsaW5laWl7Tk9UX0ZPVU5EX0VSUn17XGV4Y2VwdGlvbntOb3RGb3VuZEVycn19Ci0gIFxsaW5laWl7Tk9UX1NVUFBPUlRFRF9FUlJ9e1xleGNlcHRpb257Tm90U3VwcG9ydGVkRXJyfX0KLSAgXGxpbmVpaXtOT19EQVRBX0FMTE9XRURfRVJSfXtcZXhjZXB0aW9ue05vRGF0YUFsbG93ZWRFcnJ9fQotICBcbGluZWlpe05PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUn17XGV4Y2VwdGlvbntOb01vZGlmaWNhdGlvbkFsbG93ZWRFcnJ9fQotICBcbGluZWlpe1NZTlRBWF9FUlJ9e1xleGNlcHRpb257U3ludGF4RXJyfX0KLSAgXGxpbmVpaXtXUk9OR19ET0NVTUVOVF9FUlJ9e1xleGNlcHRpb257V3JvbmdEb2N1bWVudEVycn19Ci1cZW5ke3RhYmxlaWl9Ci0KLQotXHN1YnNlY3Rpb257Q29uZm9ybWFuY2UgXGxhYmVse2RvbS1jb25mb3JtYW5jZX19Ci0KLVRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIGNvbmZvcm1hbmNlIHJlcXVpcmVtZW50cyBhbmQgcmVsYXRpb25zaGlwcwotYmV0d2VlbiB0aGUgUHl0aG9uIERPTSBBUEksIHRoZSBXM0MgRE9NIHJlY29tbWVuZGF0aW9ucywgYW5kIHRoZSBPTUcKLUlETCBtYXBwaW5nIGZvciBQeXRob24uCi0KLQotXHN1YnN1YnNlY3Rpb257VHlwZSBNYXBwaW5nIFxsYWJlbHtkb20tdHlwZS1tYXBwaW5nfX0KLQotVGhlIHByaW1pdGl2ZSBJREwgdHlwZXMgdXNlZCBpbiB0aGUgRE9NIHNwZWNpZmljYXRpb24gYXJlIG1hcHBlZCB0bwotUHl0aG9uIHR5cGVzIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHRhYmxlLgotCi1cYmVnaW57dGFibGVpaX17bHxsfXtjb2RlfXtJREwgVHlwZX17UHl0aG9uIFR5cGV9Ci0gIFxsaW5laWl7Ym9vbGVhbn17XGNvZGV7SW50ZWdlclR5cGV9ICh3aXRoIGEgdmFsdWUgb2YgXGNvZGV7MH0gb3IgXGNvZGV7MX0pfQotICBcbGluZWlpe2ludH17XGNvZGV7SW50ZWdlclR5cGV9fQotICBcbGluZWlpe2xvbmcgaW50fXtcY29kZXtJbnRlZ2VyVHlwZX19Ci0gIFxsaW5laWl7dW5zaWduZWQgaW50fXtcY29kZXtJbnRlZ2VyVHlwZX19Ci1cZW5ke3RhYmxlaWl9Ci0KLUFkZGl0aW9uYWxseSwgdGhlIFxjbGFzc3tET01TdHJpbmd9IGRlZmluZWQgaW4gdGhlIHJlY29tbWVuZGF0aW9uIGlzCi1tYXBwZWQgdG8gYSBQeXRob24gc3RyaW5nIG9yIFVuaWNvZGUgc3RyaW5nLiAgQXBwbGljYXRpb25zIHNob3VsZAotYmUgYWJsZSB0byBoYW5kbGUgVW5pY29kZSB3aGVuZXZlciBhIHN0cmluZyBpcyByZXR1cm5lZCBmcm9tIHRoZSBET00uCi0KLVRoZSBJREwgXGtleXdvcmR7bnVsbH0gdmFsdWUgaXMgbWFwcGVkIHRvIFxjb2Rle05vbmV9LCB3aGljaCBtYXkgYmUKLWFjY2VwdGVkIG9yIHByb3ZpZGVkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiB3aGVuZXZlciBca2V5d29yZHtudWxsfSBpcwotYWxsb3dlZCBieSB0aGUgQVBJLgotCi0KLVxzdWJzdWJzZWN0aW9ue0FjY2Vzc29yIE1ldGhvZHMgXGxhYmVse2RvbS1hY2Nlc3Nvci1tZXRob2RzfX0KLQotVGhlIG1hcHBpbmcgZnJvbSBPTUcgSURMIHRvIFB5dGhvbiBkZWZpbmVzIGFjY2Vzc29yIGZ1bmN0aW9ucyBmb3IgSURMCi1ca2V5d29yZHthdHRyaWJ1dGV9IGRlY2xhcmF0aW9ucyBpbiBtdWNoIHRoZSB3YXkgdGhlIEphdmEgbWFwcGluZwotZG9lcy4gIE1hcHBpbmcgdGhlIElETCBkZWNsYXJhdGlvbnMKLQotXGJlZ2lue3ZlcmJhdGltfQotcmVhZG9ubHkgYXR0cmlidXRlIHN0cmluZyBzb21lVmFsdWU7Ci0gICAgICAgICBhdHRyaWJ1dGUgc3RyaW5nIGFub3RoZXJWYWx1ZTsKLVxlbmR7dmVyYmF0aW19Ci0KLXlpZWxkcyB0aHJlZSBhY2Nlc3NvciBmdW5jdGlvbnM6ICBhIGBgZ2V0JycgbWV0aG9kIGZvcgotXG1lbWJlcntzb21lVmFsdWV9IChcbWV0aG9ke19nZXRfc29tZVZhbHVlKCl9KSwgYW5kIGBgZ2V0JycgYW5kCi1gYHNldCcnIG1ldGhvZHMgZm9yCi1cbWVtYmVye2Fub3RoZXJWYWx1ZX0gKFxtZXRob2R7X2dldF9hbm90aGVyVmFsdWUoKX0gYW5kCi1cbWV0aG9ke19zZXRfYW5vdGhlclZhbHVlKCl9KS4gIFRoZSBtYXBwaW5nLCBpbiBwYXJ0aWN1bGFyLCBkb2VzIG5vdAotcmVxdWlyZSB0aGF0IHRoZSBJREwgYXR0cmlidXRlcyBhcmUgYWNjZXNzaWJsZSBhcyBub3JtYWwgUHl0aG9uCi1hdHRyaWJ1dGVzOiAgXGNvZGV7XHZhcntvYmplY3R9LnNvbWVWYWx1ZX0gaXMgXGVtcGh7bm90fSByZXF1aXJlZCB0bwotd29yaywgYW5kIG1heSByYWlzZSBhbiBcZXhjZXB0aW9ue0F0dHJpYnV0ZUVycm9yfS4KLQotVGhlIFB5dGhvbiBET00gQVBJLCBob3dldmVyLCBcZW1waHtkb2VzfSByZXF1aXJlIHRoYXQgbm9ybWFsIGF0dHJpYnV0ZQotYWNjZXNzIHdvcmsuICBUaGlzIG1lYW5zIHRoYXQgdGhlIHR5cGljYWwgc3Vycm9nYXRlcyBnZW5lcmF0ZWQgYnkKLVB5dGhvbiBJREwgY29tcGlsZXJzIGFyZSBub3QgbGlrZWx5IHRvIHdvcmssIGFuZCB3cmFwcGVyIG9iamVjdHMgbWF5Ci1iZSBuZWVkZWQgb24gdGhlIGNsaWVudCBpZiB0aGUgRE9NIG9iamVjdHMgYXJlIGFjY2Vzc2VkIHZpYSBDT1JCQS4KLVdoaWxlIHRoaXMgZG9lcyByZXF1aXJlIHNvbWUgYWRkaXRpb25hbCBjb25zaWRlcmF0aW9uIGZvciBDT1JCQSBET00KLWNsaWVudHMsIHRoZSBpbXBsZW1lbnRlcnMgd2l0aCBleHBlcmllbmNlIHVzaW5nIERPTSBvdmVyIENPUkJBIGZyb20KLVB5dGhvbiBkbyBub3QgY29uc2lkZXIgdGhpcyBhIHByb2JsZW0uICBBdHRyaWJ1dGVzIHRoYXQgYXJlIGRlY2xhcmVkCi1ca2V5d29yZHtyZWFkb25seX0gbWF5IG5vdCByZXN0cmljdCB3cml0ZSBhY2Nlc3MgaW4gYWxsIERPTQotaW1wbGVtZW50YXRpb25zLgotCi1JbiB0aGUgUHl0aG9uIERPTSBBUEksIGFjY2Vzc29yIGZ1bmN0aW9ucyBhcmUgbm90IHJlcXVpcmVkLiAgSWYgcHJvdmlkZWQsCi10aGV5IHNob3VsZCB0YWtlIHRoZSBmb3JtIGRlZmluZWQgYnkgdGhlIFB5dGhvbiBJREwgbWFwcGluZywgYnV0Ci10aGVzZSBtZXRob2RzIGFyZSBjb25zaWRlcmVkIHVubmVjZXNzYXJ5IHNpbmNlIHRoZSBhdHRyaWJ1dGVzIGFyZQotYWNjZXNzaWJsZSBkaXJlY3RseSBmcm9tIFB5dGhvbi4gIGBgU2V0JycgYWNjZXNzb3JzIHNob3VsZCBuZXZlciBiZQotcHJvdmlkZWQgZm9yIFxrZXl3b3Jke3JlYWRvbmx5fSBhdHRyaWJ1dGVzLgotCi1UaGUgSURMIGRlZmluaXRpb25zIGRvIG5vdCBmdWxseSBlbWJvZHkgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGUgVzNDIERPTQotQVBJLCBzdWNoIGFzIHRoZSBub3Rpb24gb2YgY2VydGFpbiBvYmplY3RzLCBzdWNoIGFzIHRoZSByZXR1cm4gdmFsdWUgb2YKLVxtZXRob2R7Z2V0RWxlbWVudHNCeVRhZ05hbWUoKX0sIGJlaW5nIGBgbGl2ZScnLiAgVGhlIFB5dGhvbiBET00gQVBJCi1kb2VzIG5vdCByZXF1aXJlIGltcGxlbWVudGF0aW9ucyB0byBlbmZvcmNlIHN1Y2ggcmVxdWlyZW1lbnRzLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYi94bWxkb21taW5pZG9tLnRleCBiL0RvYy9saWIveG1sZG9tbWluaWRvbS50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MzkxNWYuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi94bWxkb21taW5pZG9tLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3htbC5kb20ubWluaWRvbX0gLS0tCi0gICAgICAgICBMaWdodHdlaWdodCBET00gaW1wbGVtZW50YXRpb259Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXt4bWwuZG9tLm1pbmlkb219Ci1cbW9kdWxlc3lub3BzaXN7TGlnaHR3ZWlnaHQgRG9jdW1lbnQgT2JqZWN0IE1vZGVsIChET00pIGltcGxlbWVudGF0aW9uLn0KLVxtb2R1bGVhdXRob3J7UGF1bCBQcmVzY29kfXtwYXVsQHByZXNjb2QubmV0fQotXHNlY3Rpb25hdXRob3J7UGF1bCBQcmVzY29kfXtwYXVsQHByZXNjb2QubmV0fQotXHNlY3Rpb25hdXRob3J7TWFydGluIHYuIExcIm93aXN9e21hcnRpbkB2LmxvZXdpcy5kZX0KLQotXHZlcnNpb25hZGRlZHsyLjB9Ci0KLVxtb2R1bGV7eG1sLmRvbS5taW5pZG9tfSBpcyBhIGxpZ2h0LXdlaWdodCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLURvY3VtZW50IE9iamVjdCBNb2RlbCBpbnRlcmZhY2UuICBJdCBpcyBpbnRlbmRlZCB0byBiZQotc2ltcGxlciB0aGFuIHRoZSBmdWxsIERPTSBhbmQgYWxzbyBzaWduaWZpY2FudGx5IHNtYWxsZXIuCi0KLURPTSBhcHBsaWNhdGlvbnMgdHlwaWNhbGx5IHN0YXJ0IGJ5IHBhcnNpbmcgc29tZSBYTUwgaW50byBhIERPTS4gIFdpdGgKLVxtb2R1bGV7eG1sLmRvbS5taW5pZG9tfSwgdGhpcyBpcyBkb25lIHRocm91Z2ggdGhlIHBhcnNlIGZ1bmN0aW9uczoKLQotXGJlZ2lue3ZlcmJhdGltfQotZnJvbSB4bWwuZG9tLm1pbmlkb20gaW1wb3J0IHBhcnNlLCBwYXJzZVN0cmluZwotCi1kb20xID0gcGFyc2UoJ2M6XFx0ZW1wXFxteWRhdGEueG1sJykgIyBwYXJzZSBhbiBYTUwgZmlsZSBieSBuYW1lCi0KLWRhdGFzb3VyY2UgPSBvcGVuKCdjOlxcdGVtcFxcbXlkYXRhLnhtbCcpCi1kb20yID0gcGFyc2UoZGF0YXNvdXJjZSkgICAjIHBhcnNlIGFuIG9wZW4gZmlsZQotCi1kb20zID0gcGFyc2VTdHJpbmcoJzxteXhtbD5Tb21lIGRhdGE8ZW1wdHkvPiBzb21lIG1vcmUgZGF0YTwvbXl4bWw+JykKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBcZnVuY3Rpb257cGFyc2UoKX0gZnVuY3Rpb24gY2FuIHRha2UgZWl0aGVyIGEgZmlsZW5hbWUgb3IgYW4gb3BlbgotZmlsZSBvYmplY3QuCi0KLVxiZWdpbntmdW5jZGVzY317cGFyc2V9e2ZpbGVuYW1lX29yX2ZpbGV7LCBwYXJzZXJ9fQotICBSZXR1cm4gYSBcY2xhc3N7RG9jdW1lbnR9IGZyb20gdGhlIGdpdmVuIGlucHV0LiBcdmFye2ZpbGVuYW1lX29yX2ZpbGV9Ci0gIG1heSBiZSBlaXRoZXIgYSBmaWxlIG5hbWUsIG9yIGEgZmlsZS1saWtlIG9iamVjdC4gXHZhcntwYXJzZXJ9LCBpZgotICBnaXZlbiwgbXVzdCBiZSBhIFNBWDIgcGFyc2VyIG9iamVjdC4gVGhpcyBmdW5jdGlvbiB3aWxsIGNoYW5nZSB0aGUKLSAgZG9jdW1lbnQgaGFuZGxlciBvZiB0aGUgcGFyc2VyIGFuZCBhY3RpdmF0ZSBuYW1lc3BhY2Ugc3VwcG9ydDsgb3RoZXIKLSAgcGFyc2VyIGNvbmZpZ3VyYXRpb24gKGxpa2Ugc2V0dGluZyBhbiBlbnRpdHkgcmVzb2x2ZXIpIG11c3QgaGF2ZSBiZWVuCi0gIGRvbmUgaW4gYWR2YW5jZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLUlmIHlvdSBoYXZlIFhNTCBpbiBhIHN0cmluZywgeW91IGNhbiB1c2UgdGhlCi1cZnVuY3Rpb257cGFyc2VTdHJpbmcoKX0gZnVuY3Rpb24gaW5zdGVhZDoKLQotXGJlZ2lue2Z1bmNkZXNjfXtwYXJzZVN0cmluZ317c3RyaW5nXG9wdGlvbmFseywgcGFyc2VyfX0KLSAgUmV0dXJuIGEgXGNsYXNze0RvY3VtZW50fSB0aGF0IHJlcHJlc2VudHMgdGhlIFx2YXJ7c3RyaW5nfS4gVGhpcwotICBtZXRob2QgY3JlYXRlcyBhIFxjbGFzc3tTdHJpbmdJT30gb2JqZWN0IGZvciB0aGUgc3RyaW5nIGFuZCBwYXNzZXMKLSAgdGhhdCBvbiB0byBcZnVuY3Rpb257cGFyc2V9LgotXGVuZHtmdW5jZGVzY30KLQotQm90aCBmdW5jdGlvbnMgcmV0dXJuIGEgXGNsYXNze0RvY3VtZW50fSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZQotY29udGVudCBvZiB0aGUgZG9jdW1lbnQuCi0KLVdoYXQgdGhlIFxmdW5jdGlvbntwYXJzZSgpfSBhbmQgXGZ1bmN0aW9ue3BhcnNlU3RyaW5nKCl9IGZ1bmN0aW9ucyBkbwotaXMgY29ubmVjdCBhbiBYTUwgcGFyc2VyIHdpdGggYSBgYERPTSBidWlsZGVyJycgdGhhdCBjYW4gYWNjZXB0IHBhcnNlCi1ldmVudHMgZnJvbSBhbnkgU0FYIHBhcnNlciBhbmQgY29udmVydCB0aGVtIGludG8gYSBET00gdHJlZS4gIFRoZSBuYW1lCi1vZiB0aGUgZnVuY3Rpb25zIGFyZSBwZXJoYXBzIG1pc2xlYWRpbmcsIGJ1dCBhcmUgZWFzeSB0byBncmFzcCB3aGVuCi1sZWFybmluZyB0aGUgaW50ZXJmYWNlcy4gIFRoZSBwYXJzaW5nIG9mIHRoZSBkb2N1bWVudCB3aWxsIGJlCi1jb21wbGV0ZWQgYmVmb3JlIHRoZXNlIGZ1bmN0aW9ucyByZXR1cm47IGl0J3Mgc2ltcGx5IHRoYXQgdGhlc2UKLWZ1bmN0aW9ucyBkbyBub3QgcHJvdmlkZSBhIHBhcnNlciBpbXBsZW1lbnRhdGlvbiB0aGVtc2VsdmVzLgotCi1Zb3UgY2FuIGFsc28gY3JlYXRlIGEgXGNsYXNze0RvY3VtZW50fSBieSBjYWxsaW5nIGEgbWV0aG9kIG9uIGEgYGBET00KLUltcGxlbWVudGF0aW9uJycgb2JqZWN0LiAgWW91IGNhbiBnZXQgdGhpcyBvYmplY3QgZWl0aGVyIGJ5IGNhbGxpbmcKLXRoZSBcZnVuY3Rpb257Z2V0RE9NSW1wbGVtZW50YXRpb24oKX0gZnVuY3Rpb24gaW4gdGhlCi1ccmVmbW9kdWxle3htbC5kb219IHBhY2thZ2Ugb3IgdGhlIFxtb2R1bGV7eG1sLmRvbS5taW5pZG9tfSBtb2R1bGUuCi1Vc2luZyB0aGUgaW1wbGVtZW50YXRpb24gZnJvbSB0aGUgXG1vZHVsZXt4bWwuZG9tLm1pbmlkb219IG1vZHVsZSB3aWxsCi1hbHdheXMgcmV0dXJuIGEgXGNsYXNze0RvY3VtZW50fSBpbnN0YW5jZSBmcm9tIHRoZSBtaW5pZG9tCi1pbXBsZW1lbnRhdGlvbiwgd2hpbGUgdGhlIHZlcnNpb24gZnJvbSBccmVmbW9kdWxle3htbC5kb219IG1heSBwcm92aWRlCi1hbiBhbHRlcm5hdGUgaW1wbGVtZW50YXRpb24gKHRoaXMgaXMgbGlrZWx5IGlmIHlvdSBoYXZlIHRoZQotXHVsaW5re1B5WE1MIHBhY2thZ2V9e2h0dHA6Ly9weXhtbC5zb3VyY2Vmb3JnZS5uZXQvfSBpbnN0YWxsZWQpLiAgT25jZQoteW91IGhhdmUgYSBcY2xhc3N7RG9jdW1lbnR9LCB5b3UgY2FuIGFkZCBjaGlsZCBub2RlcyB0byBpdCB0byBwb3B1bGF0ZQotdGhlIERPTToKLQotXGJlZ2lue3ZlcmJhdGltfQotZnJvbSB4bWwuZG9tLm1pbmlkb20gaW1wb3J0IGdldERPTUltcGxlbWVudGF0aW9uCi0KLWltcGwgPSBnZXRET01JbXBsZW1lbnRhdGlvbigpCi0KLW5ld2RvYyA9IGltcGwuY3JlYXRlRG9jdW1lbnQoTm9uZSwgInNvbWVfdGFnIiwgTm9uZSkKLXRvcF9lbGVtZW50ID0gbmV3ZG9jLmRvY3VtZW50RWxlbWVudAotdGV4dCA9IG5ld2RvYy5jcmVhdGVUZXh0Tm9kZSgnU29tZSB0ZXh0dWFsIGNvbnRlbnQuJykKLXRvcF9lbGVtZW50LmFwcGVuZENoaWxkKHRleHQpCi1cZW5ke3ZlcmJhdGltfQotCi1PbmNlIHlvdSBoYXZlIGEgRE9NIGRvY3VtZW50IG9iamVjdCwgeW91IGNhbiBhY2Nlc3MgdGhlIHBhcnRzIG9mIHlvdXIKLVhNTCBkb2N1bWVudCB0aHJvdWdoIGl0cyBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzLiAgVGhlc2UgcHJvcGVydGllcyBhcmUKLWRlZmluZWQgaW4gdGhlIERPTSBzcGVjaWZpY2F0aW9uLiAgVGhlIG1haW4gcHJvcGVydHkgb2YgdGhlIGRvY3VtZW50Ci1vYmplY3QgaXMgdGhlIFxtZW1iZXJ7ZG9jdW1lbnRFbGVtZW50fSBwcm9wZXJ0eS4gIEl0IGdpdmVzIHlvdSB0aGUKLW1haW4gZWxlbWVudCBpbiB0aGUgWE1MIGRvY3VtZW50OiB0aGUgb25lIHRoYXQgaG9sZHMgYWxsIG90aGVycy4gIEhlcmUKLWlzIGFuIGV4YW1wbGUgcHJvZ3JhbToKLQotXGJlZ2lue3ZlcmJhdGltfQotZG9tMyA9IHBhcnNlU3RyaW5nKCI8bXl4bWw+U29tZSBkYXRhPC9teXhtbD4iKQotYXNzZXJ0IGRvbTMuZG9jdW1lbnRFbGVtZW50LnRhZ05hbWUgPT0gIm15eG1sIgotXGVuZHt2ZXJiYXRpbX0KLQotV2hlbiB5b3UgYXJlIGZpbmlzaGVkIHdpdGggYSBET00sIHlvdSBzaG91bGQgY2xlYW4gaXQgdXAuICBUaGlzIGlzCi1uZWNlc3NhcnkgYmVjYXVzZSBzb21lIHZlcnNpb25zIG9mIFB5dGhvbiBkbyBub3Qgc3VwcG9ydCBnYXJiYWdlCi1jb2xsZWN0aW9uIG9mIG9iamVjdHMgdGhhdCByZWZlciB0byBlYWNoIG90aGVyIGluIGEgY3ljbGUuICBVbnRpbCB0aGlzCi1yZXN0cmljdGlvbiBpcyByZW1vdmVkIGZyb20gYWxsIHZlcnNpb25zIG9mIFB5dGhvbiwgaXQgaXMgc2FmZXN0IHRvCi13cml0ZSB5b3VyIGNvZGUgYXMgaWYgY3ljbGVzIHdvdWxkIG5vdCBiZSBjbGVhbmVkIHVwLgotCi1UaGUgd2F5IHRvIGNsZWFuIHVwIGEgRE9NIGlzIHRvIGNhbGwgaXRzIFxtZXRob2R7dW5saW5rKCl9IG1ldGhvZDoKLQotXGJlZ2lue3ZlcmJhdGltfQotZG9tMS51bmxpbmsoKQotZG9tMi51bmxpbmsoKQotZG9tMy51bmxpbmsoKQotXGVuZHt2ZXJiYXRpbX0KLQotXG1ldGhvZHt1bmxpbmsoKX0gaXMgYSBcbW9kdWxle3htbC5kb20ubWluaWRvbX0tc3BlY2lmaWMgZXh0ZW5zaW9uIHRvCi10aGUgRE9NIEFQSS4gIEFmdGVyIGNhbGxpbmcgXG1ldGhvZHt1bmxpbmsoKX0gb24gYSBub2RlLCB0aGUgbm9kZSBhbmQKLWl0cyBkZXNjZW5kYW50cyBhcmUgZXNzZW50aWFsbHkgdXNlbGVzcy4KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWV0aXRsZVtodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtRE9NLUxldmVsLTEvXXtEb2N1bWVudCBPYmplY3QKLSAgICAgICAgICAgIE1vZGVsIChET00pIExldmVsIDEgU3BlY2lmaWNhdGlvbn0KLSAgICAgICAgICAge1RoZSBXM0MgcmVjb21tZW5kYXRpb24gZm9yIHRoZQotICAgICAgICAgICAgRE9NIHN1cHBvcnRlZCBieSBcbW9kdWxle3htbC5kb20ubWluaWRvbX0ufQotXGVuZHtzZWVhbHNvfQotCi0KLVxzdWJzZWN0aW9ue0RPTSBPYmplY3RzIFxsYWJlbHtkb20tb2JqZWN0c319Ci0KLVRoZSBkZWZpbml0aW9uIG9mIHRoZSBET00gQVBJIGZvciBQeXRob24gaXMgZ2l2ZW4gYXMgcGFydCBvZiB0aGUKLVxyZWZtb2R1bGV7eG1sLmRvbX0gbW9kdWxlIGRvY3VtZW50YXRpb24uICBUaGlzIHNlY3Rpb24gbGlzdHMgdGhlCi1kaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBBUEkgYW5kIFxyZWZtb2R1bGV7eG1sLmRvbS5taW5pZG9tfS4KLQotCi1cYmVnaW57bWV0aG9kZGVzY31bTm9kZV17dW5saW5rfXt9Ci1CcmVhayBpbnRlcm5hbCByZWZlcmVuY2VzIHdpdGhpbiB0aGUgRE9NIHNvIHRoYXQgaXQgd2lsbCBiZSBnYXJiYWdlCi1jb2xsZWN0ZWQgb24gdmVyc2lvbnMgb2YgUHl0aG9uIHdpdGhvdXQgY3ljbGljIEdDLiAgRXZlbiB3aGVuIGN5Y2xpYwotR0MgaXMgYXZhaWxhYmxlLCB1c2luZyB0aGlzIGNhbiBtYWtlIGxhcmdlIGFtb3VudHMgb2YgbWVtb3J5IGF2YWlsYWJsZQotc29vbmVyLCBzbyBjYWxsaW5nIHRoaXMgb24gRE9NIG9iamVjdHMgYXMgc29vbiBhcyB0aGV5IGFyZSBubyBsb25nZXIKLW5lZWRlZCBpcyBnb29kIHByYWN0aWNlLiAgVGhpcyBvbmx5IG5lZWRzIHRvIGJlIGNhbGxlZCBvbiB0aGUKLVxjbGFzc3tEb2N1bWVudH0gb2JqZWN0LCBidXQgbWF5IGJlIGNhbGxlZCBvbiBjaGlsZCBub2RlcyB0byBkaXNjYXJkCi1jaGlsZHJlbiBvZiB0aGF0IG5vZGUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtOb2RlXXt3cml0ZXhtbH17d3JpdGVyXG9wdGlvbmFseyxpbmRlbnQ9IiJcb3B0aW9uYWx7LGFkZGluZGVudD0iIlxvcHRpb25hbHssbmV3bD0iIn19fX0KLVdyaXRlIFhNTCB0byB0aGUgd3JpdGVyIG9iamVjdC4gIFRoZSB3cml0ZXIgc2hvdWxkIGhhdmUgYQotXG1ldGhvZHt3cml0ZSgpfSBtZXRob2Qgd2hpY2ggbWF0Y2hlcyB0aGF0IG9mIHRoZSBmaWxlIG9iamVjdAotaW50ZXJmYWNlLiAgVGhlIFx2YXJ7aW5kZW50fSBwYXJhbWV0ZXIgaXMgdGhlIGluZGVudGF0aW9uIG9mIHRoZSBjdXJyZW50Ci1ub2RlLiAgVGhlIFx2YXJ7YWRkaW5kZW50fSBwYXJhbWV0ZXIgaXMgdGhlIGluY3JlbWVudGFsIGluZGVudGF0aW9uIHRvIHVzZQotZm9yIHN1Ym5vZGVzIG9mIHRoZSBjdXJyZW50IG9uZS4gIFRoZSBcdmFye25ld2x9IHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlCi1zdHJpbmcgdG8gdXNlIHRvIHRlcm1pbmF0ZSBuZXdsaW5lcy4KLQotXHZlcnNpb25jaGFuZ2VkW1RoZSBvcHRpb25hbCBrZXl3b3JkIHBhcmFtZXRlcnMKLVx2YXJ7aW5kZW50fSwgXHZhcnthZGRpbmRlbnR9LCBhbmQgXHZhcntuZXdsfSB3ZXJlIGFkZGVkIHRvIHN1cHBvcnQgcHJldHR5Ci1vdXRwdXRdezIuMX0KLQotXHZlcnNpb25jaGFuZ2VkW0ZvciB0aGUgXGNsYXNze0RvY3VtZW50fSBub2RlLCBhbiBhZGRpdGlvbmFsIGtleXdvcmQKLWFyZ3VtZW50IFx2YXJ7ZW5jb2Rpbmd9IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGVuY29kaW5nIGZpZWxkIG9mIHRoZSBYTUwKLWhlYWRlcl17Mi4zfQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTm9kZV17dG94bWx9e1xvcHRpb25hbHtlbmNvZGluZ319Ci1SZXR1cm4gdGhlIFhNTCB0aGF0IHRoZSBET00gcmVwcmVzZW50cyBhcyBhIHN0cmluZy4KLQotV2l0aCBubyBhcmd1bWVudCwgdGhlIFhNTCBoZWFkZXIgZG9lcyBub3Qgc3BlY2lmeSBhbiBlbmNvZGluZywgYW5kIHRoZQotcmVzdWx0IGlzIFVuaWNvZGUgc3RyaW5nIGlmIHRoZSBkZWZhdWx0IGVuY29kaW5nIGNhbm5vdCByZXByZXNlbnQgYWxsCi1jaGFyYWN0ZXJzIGluIHRoZSBkb2N1bWVudC4gRW5jb2RpbmcgdGhpcyBzdHJpbmcgaW4gYW4gZW5jb2Rpbmcgb3RoZXIKLXRoYW4gVVRGLTggaXMgbGlrZWx5IGluY29ycmVjdCwgc2luY2UgVVRGLTggaXMgdGhlIGRlZmF1bHQgZW5jb2Rpbmcgb2YKLVhNTC4KLQotV2l0aCBhbiBleHBsaWNpdCBcdmFye2VuY29kaW5nfSBhcmd1bWVudCwgdGhlIHJlc3VsdCBpcyBhIGJ5dGUgc3RyaW5nCi1pbiB0aGUgc3BlY2lmaWVkIGVuY29kaW5nLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHRoaXMgYXJndW1lbnQgaXMKLWFsd2F5cyBzcGVjaWZpZWQuIFRvIGF2b2lkIFxleGNlcHRpb257VW5pY29kZUVycm9yfSBleGNlcHRpb25zIGluIGNhc2Ugb2YKLXVucmVwcmVzZW50YWJsZSB0ZXh0IGRhdGEsIHRoZSBlbmNvZGluZyBhcmd1bWVudCBzaG91bGQgYmUgc3BlY2lmaWVkCi1hcyAidXRmLTgiLgotCi1cdmVyc2lvbmNoYW5nZWRbdGhlIFx2YXJ7ZW5jb2Rpbmd9IGFyZ3VtZW50IHdhcyBpbnRyb2R1Y2VkXXsyLjN9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtOb2RlXXt0b3ByZXR0eXhtbH17XG9wdGlvbmFse2luZGVudFxvcHRpb25hbHssIG5ld2x9fX0KLVJldHVybiBhIHByZXR0eS1wcmludGVkIHZlcnNpb24gb2YgdGhlIGRvY3VtZW50LiBcdmFye2luZGVudH0gc3BlY2lmaWVzCi10aGUgaW5kZW50YXRpb24gc3RyaW5nIGFuZCBkZWZhdWx0cyB0byBhIHRhYnVsYXRvcjsgXHZhcntuZXdsfSBzcGVjaWZpZXMKLXRoZSBzdHJpbmcgZW1pdHRlZCBhdCB0aGUgZW5kIG9mIGVhY2ggbGluZSBhbmQgZGVmYXVsdHMgdG8gXGNvZGV7XGUgbn0uCi0KLVx2ZXJzaW9uYWRkZWR7Mi4xfQotXHZlcnNpb25jaGFuZ2VkW3RoZSBlbmNvZGluZyBhcmd1bWVudDsgc2VlIFxtZXRob2R7dG94bWwoKX1dezIuM30KLVxlbmR7bWV0aG9kZGVzY30KLQotVGhlIGZvbGxvd2luZyBzdGFuZGFyZCBET00gbWV0aG9kcyBoYXZlIHNwZWNpYWwgY29uc2lkZXJhdGlvbnMgd2l0aAotXHJlZm1vZHVsZXt4bWwuZG9tLm1pbmlkb219OgotCi1cYmVnaW57bWV0aG9kZGVzY31bTm9kZV17Y2xvbmVOb2RlfXtkZWVwfQotQWx0aG91Z2ggdGhpcyBtZXRob2Qgd2FzIHByZXNlbnQgaW4gdGhlIHZlcnNpb24gb2YKLVxyZWZtb2R1bGV7eG1sLmRvbS5taW5pZG9tfSBwYWNrYWdlZCB3aXRoIFB5dGhvbiAyLjAsIGl0IHdhcyBzZXJpb3VzbHkKLWJyb2tlbi4gIFRoaXMgaGFzIGJlZW4gY29ycmVjdGVkIGZvciBzdWJzZXF1ZW50IHJlbGVhc2VzLgotXGVuZHttZXRob2RkZXNjfQotCi0KLVxzdWJzZWN0aW9ue0RPTSBFeGFtcGxlIFxsYWJlbHtkb20tZXhhbXBsZX19Ci0KLVRoaXMgZXhhbXBsZSBwcm9ncmFtIGlzIGEgZmFpcmx5IHJlYWxpc3RpYyBleGFtcGxlIG9mIGEgc2ltcGxlCi1wcm9ncmFtLiBJbiB0aGlzIHBhcnRpY3VsYXIgY2FzZSwgd2UgZG8gbm90IHRha2UgbXVjaCBhZHZhbnRhZ2UKLW9mIHRoZSBmbGV4aWJpbGl0eSBvZiB0aGUgRE9NLgotCi1cdmVyYmF0aW1pbnB1dHttaW5pZG9tLWV4YW1wbGUucHl9Ci0KLQotXHN1YnNlY3Rpb257bWluaWRvbSBhbmQgdGhlIERPTSBzdGFuZGFyZCBcbGFiZWx7bWluaWRvbS1hbmQtZG9tfX0KLQotVGhlIFxyZWZtb2R1bGV7eG1sLmRvbS5taW5pZG9tfSBtb2R1bGUgaXMgZXNzZW50aWFsbHkgYSBET00KLTEuMC1jb21wYXRpYmxlIERPTSB3aXRoIHNvbWUgRE9NIDIgZmVhdHVyZXMgKHByaW1hcmlseSBuYW1lc3BhY2UKLWZlYXR1cmVzKS4KLQotVXNhZ2Ugb2YgdGhlIERPTSBpbnRlcmZhY2UgaW4gUHl0aG9uIGlzIHN0cmFpZ2h0LWZvcndhcmQuICBUaGUKLWZvbGxvd2luZyBtYXBwaW5nIHJ1bGVzIGFwcGx5OgotCi1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtIEludGVyZmFjZXMgYXJlIGFjY2Vzc2VkIHRocm91Z2ggaW5zdGFuY2Ugb2JqZWN0cy4gQXBwbGljYXRpb25zCi0gICAgICBzaG91bGQgbm90IGluc3RhbnRpYXRlIHRoZSBjbGFzc2VzIHRoZW1zZWx2ZXM7IHRoZXkgc2hvdWxkIHVzZQotICAgICAgdGhlIGNyZWF0b3IgZnVuY3Rpb25zIGF2YWlsYWJsZSBvbiB0aGUgXGNsYXNze0RvY3VtZW50fSBvYmplY3QuCi0gICAgICBEZXJpdmVkIGludGVyZmFjZXMgc3VwcG9ydCBhbGwgb3BlcmF0aW9ucyAoYW5kIGF0dHJpYnV0ZXMpIGZyb20KLSAgICAgIHRoZSBiYXNlIGludGVyZmFjZXMsIHBsdXMgYW55IG5ldyBvcGVyYXRpb25zLgotCi1caXRlbSBPcGVyYXRpb25zIGFyZSB1c2VkIGFzIG1ldGhvZHMuIFNpbmNlIHRoZSBET00gdXNlcyBvbmx5Ci0gICAgICBca2V5d29yZHtpbn0gcGFyYW1ldGVycywgdGhlIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluIG5vcm1hbAotICAgICAgb3JkZXIgKGZyb20gbGVmdCB0byByaWdodCkuICAgVGhlcmUgYXJlIG5vIG9wdGlvbmFsCi0gICAgICBhcmd1bWVudHMuIFxrZXl3b3Jke3ZvaWR9IG9wZXJhdGlvbnMgcmV0dXJuIFxjb2Rle05vbmV9LgotCi1caXRlbSBJREwgYXR0cmlidXRlcyBtYXAgdG8gaW5zdGFuY2UgYXR0cmlidXRlcy4gRm9yIGNvbXBhdGliaWxpdHkKLSAgICAgIHdpdGggdGhlIE9NRyBJREwgbGFuZ3VhZ2UgbWFwcGluZyBmb3IgUHl0aG9uLCBhbiBhdHRyaWJ1dGUKLSAgICAgIFxjb2Rle2Zvb30gY2FuIGFsc28gYmUgYWNjZXNzZWQgdGhyb3VnaCBhY2Nlc3NvciBtZXRob2RzCi0gICAgICBcbWV0aG9ke19nZXRfZm9vKCl9IGFuZCBcbWV0aG9ke19zZXRfZm9vKCl9LiAgXGtleXdvcmR7cmVhZG9ubHl9Ci0gICAgICBhdHRyaWJ1dGVzIG11c3Qgbm90IGJlIGNoYW5nZWQ7IHRoaXMgaXMgbm90IGVuZm9yY2VkIGF0Ci0gICAgICBydW50aW1lLgotCi1caXRlbSBUaGUgdHlwZXMgXGNvZGV7c2hvcnQgaW50fSwgXGNvZGV7dW5zaWduZWQgaW50fSwgXGNvZGV7dW5zaWduZWQKLSAgICAgIGxvbmcgbG9uZ30sIGFuZCBcY29kZXtib29sZWFufSBhbGwgbWFwIHRvIFB5dGhvbiBpbnRlZ2VyCi0gICAgICBvYmplY3RzLgotCi1caXRlbSBUaGUgdHlwZSBcY29kZXtET01TdHJpbmd9IG1hcHMgdG8gUHl0aG9uIHN0cmluZ3MuCi0gICAgICBccmVmbW9kdWxle3htbC5kb20ubWluaWRvbX0gc3VwcG9ydHMgZWl0aGVyIGJ5dGUgb3IgVW5pY29kZQotICAgICAgc3RyaW5ncywgYnV0IHdpbGwgbm9ybWFsbHkgcHJvZHVjZSBVbmljb2RlIHN0cmluZ3MuICBWYWx1ZXMKLSAgICAgIG9mIHR5cGUgXGNvZGV7RE9NU3RyaW5nfSBtYXkgYWxzbyBiZSBcY29kZXtOb25lfSB3aGVyZSBhbGxvd2VkCi0gICAgICB0byBoYXZlIHRoZSBJREwgXGNvZGV7bnVsbH0gdmFsdWUgYnkgdGhlIERPTSBzcGVjaWZpY2F0aW9uIGZyb20KLSAgICAgIHRoZSBXM0MuCi0KLVxpdGVtIFxrZXl3b3Jke2NvbnN0fSBkZWNsYXJhdGlvbnMgbWFwIHRvIHZhcmlhYmxlcyBpbiB0aGVpcgotICAgICAgcmVzcGVjdGl2ZSBzY29wZQotICAgICAgKGUuZy4gXGNvZGV7eG1sLmRvbS5taW5pZG9tLk5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFfSk7Ci0gICAgICB0aGV5IG11c3Qgbm90IGJlIGNoYW5nZWQuCi0KLVxpdGVtIFxjb2Rle0RPTUV4Y2VwdGlvbn0gaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgaW4KLSAgICAgIFxyZWZtb2R1bGV7eG1sLmRvbS5taW5pZG9tfS4gIEluc3RlYWQsCi0gICAgICBccmVmbW9kdWxle3htbC5kb20ubWluaWRvbX0gdXNlcyBzdGFuZGFyZCBQeXRob24gZXhjZXB0aW9ucyBzdWNoCi0gICAgICBhcyBcZXhjZXB0aW9ue1R5cGVFcnJvcn0gYW5kIFxleGNlcHRpb257QXR0cmlidXRlRXJyb3J9LgotCi1caXRlbSBcY2xhc3N7Tm9kZUxpc3R9IG9iamVjdHMgYXJlIGltcGxlbWVudGVkIHVzaW5nIFB5dGhvbidzIGJ1aWx0LWluCi0gICAgICBsaXN0IHR5cGUuICBTdGFydGluZyB3aXRoIFB5dGhvbiAyLjIsIHRoZXNlIG9iamVjdHMgcHJvdmlkZSB0aGUKLSAgICAgIGludGVyZmFjZSBkZWZpbmVkIGluIHRoZSBET00gc3BlY2lmaWNhdGlvbiwgYnV0IHdpdGggZWFybGllcgotICAgICAgdmVyc2lvbnMgb2YgUHl0aG9uIHRoZXkgZG8gbm90IHN1cHBvcnQgdGhlIG9mZmljaWFsIEFQSS4gIFRoZXkKLSAgICAgIGFyZSwgaG93ZXZlciwgbXVjaCBtb3JlIGBgUHl0aG9uaWMnJyB0aGFuIHRoZSBpbnRlcmZhY2UgZGVmaW5lZAotICAgICAgaW4gdGhlIFczQyByZWNvbW1lbmRhdGlvbnMuCi1cZW5ke2l0ZW1pemV9Ci0KLQotVGhlIGZvbGxvd2luZyBpbnRlcmZhY2VzIGhhdmUgbm8gaW1wbGVtZW50YXRpb24gaW4KLVxyZWZtb2R1bGV7eG1sLmRvbS5taW5pZG9tfToKLQotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSBcY2xhc3N7RE9NVGltZVN0YW1wfQotCi1caXRlbSBcY2xhc3N7RG9jdW1lbnRUeXBlfSAoYWRkZWQgaW4gUHl0aG9uIDIuMSkKLQotXGl0ZW0gXGNsYXNze0RPTUltcGxlbWVudGF0aW9ufSAoYWRkZWQgaW4gUHl0aG9uIDIuMSkKLQotXGl0ZW0gXGNsYXNze0NoYXJhY3RlckRhdGF9Ci0KLVxpdGVtIFxjbGFzc3tDREFUQVNlY3Rpb259Ci0KLVxpdGVtIFxjbGFzc3tOb3RhdGlvbn0KLQotXGl0ZW0gXGNsYXNze0VudGl0eX0KLQotXGl0ZW0gXGNsYXNze0VudGl0eVJlZmVyZW5jZX0KLQotXGl0ZW0gXGNsYXNze0RvY3VtZW50RnJhZ21lbnR9Ci1cZW5ke2l0ZW1pemV9Ci0KLU1vc3Qgb2YgdGhlc2UgcmVmbGVjdCBpbmZvcm1hdGlvbiBpbiB0aGUgWE1MIGRvY3VtZW50IHRoYXQgaXMgbm90IG9mCi1nZW5lcmFsIHV0aWxpdHkgdG8gbW9zdCBET00gdXNlcnMuCmRpZmYgLS1naXQgYS9Eb2MvbGliL3htbGRvbXB1bGxkb20udGV4IGIvRG9jL2xpYi94bWxkb21wdWxsZG9tLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJjZTY2Ny4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL3htbGRvbXB1bGxkb20udGV4CisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXt4bWwuZG9tLnB1bGxkb219IC0tLQotICAgICAgICAgU3VwcG9ydCBmb3IgYnVpbGRpbmcgcGFydGlhbCBET00gdHJlZXN9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXt4bWwuZG9tLnB1bGxkb219Ci1cbW9kdWxlc3lub3BzaXN7U3VwcG9ydCBmb3IgYnVpbGRpbmcgcGFydGlhbCBET00gdHJlZXMgZnJvbSBTQVggZXZlbnRzLn0KLVxtb2R1bGVhdXRob3J7UGF1bCBQcmVzY29kfXtwYXVsQHByZXNjb2QubmV0fQotCi1cdmVyc2lvbmFkZGVkezIuMH0KLQotXG1vZHVsZXt4bWwuZG9tLnB1bGxkb219IGFsbG93cyBidWlsZGluZyBvbmx5IHNlbGVjdGVkIHBvcnRpb25zIG9mIGEKLURvY3VtZW50IE9iamVjdCBNb2RlbCByZXByZXNlbnRhdGlvbiBvZiBhIGRvY3VtZW50IGZyb20gU0FYIGV2ZW50cy4KLQotCi1cYmVnaW57Y2xhc3NkZXNjfXtQdWxsRE9NfXtcb3B0aW9uYWx7ZG9jdW1lbnRGYWN0b3J5fX0KLSAgXGNsYXNze3htbC5zYXguaGFuZGxlci5Db250ZW50SGFuZGxlcn0gaW1wbGVtZW50YXRpb24gdGhhdCAuLi4KLVxlbmR7Y2xhc3NkZXNjfQotCi0KLVxiZWdpbntjbGFzc2Rlc2N9e0RPTUV2ZW50U3RyZWFtfXtzdHJlYW0sIHBhcnNlciwgYnVmc2l6ZX0KLSAgLi4uCi1cZW5ke2NsYXNzZGVzY30KLQotCi1cYmVnaW57Y2xhc3NkZXNjfXtTQVgyRE9NfXtcb3B0aW9uYWx7ZG9jdW1lbnRGYWN0b3J5fX0KLSAgXGNsYXNze3htbC5zYXguaGFuZGxlci5Db250ZW50SGFuZGxlcn0gaW1wbGVtZW50YXRpb24gdGhhdCAuLi4KLVxlbmR7Y2xhc3NkZXNjfQotCi0KLVxiZWdpbntmdW5jZGVzY317cGFyc2V9e3N0cmVhbV9vcl9zdHJpbmdcb3B0aW9uYWx7LAotICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyXG9wdGlvbmFseywgYnVmc2l6ZX19fQotICAuLi4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue2Z1bmNkZXNjfXtwYXJzZVN0cmluZ317c3RyaW5nXG9wdGlvbmFseywgcGFyc2VyfX0KLSAgLi4uCi1cZW5ke2Z1bmNkZXNjfQotCi0KLVxiZWdpbntkYXRhZGVzY317ZGVmYXVsdF9idWZzaXplfQotICBEZWZhdWx0IHZhbHVlIGZvciB0aGUgXHZhcntidWZzaXplfSBwYXJhbWV0ZXIgdG8gXGZ1bmN0aW9ue3BhcnNlKCl9LgotICBcdmVyc2lvbmNoYW5nZWRbVGhlIHZhbHVlIG9mIHRoaXMgdmFyaWFibGUgY2FuIGJlIGNoYW5nZWQgYmVmb3JlCi0gICAgICAgICAgICAgICAgICBjYWxsaW5nIFxmdW5jdGlvbntwYXJzZSgpfSBhbmQgdGhlIG5ldyB2YWx1ZSB3aWxsCi0gICAgICAgICAgICAgICAgICB0YWtlIGVmZmVjdF17Mi4xfQotXGVuZHtkYXRhZGVzY30KLQotCi1cc3Vic2VjdGlvbntET01FdmVudFN0cmVhbSBPYmplY3RzIFxsYWJlbHtkb21ldmVudHN0cmVhbS1vYmplY3RzfX0KLQotCi1cYmVnaW57bWV0aG9kZGVzY31bRE9NRXZlbnRTdHJlYW1de2dldEV2ZW50fXt9Ci0gIC4uLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRE9NRXZlbnRTdHJlYW1de2V4cGFuZE5vZGV9e25vZGV9Ci0gIC4uLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRE9NRXZlbnRTdHJlYW1de3Jlc2V0fXt9Ci0gIC4uLgotXGVuZHttZXRob2RkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi94bWxldHJlZS50ZXggYi9Eb2MvbGliL3htbGV0cmVlLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg5MDYyZC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL3htbGV0cmVlLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7eG1sLmV0cmVlfSAtLS0NCi0gICAgICAgICBUaGUgRWxlbWVudFRyZWUgQVBJIGZvciBYTUx9DQotDQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e3htbC5ldHJlZX0NCi1cbW9kdWxlc3lub3BzaXN7UGFja2FnZSBjb250YWluaW5nIGNvbW1vbiBFbGVtZW50VHJlZSBtb2R1bGVzLn0NCi1cbW9kdWxlYXV0aG9ye0ZyZWRyaWsgTHVuZGh9e2ZyZWRyaWtAcHl0aG9ud2FyZS5jb219DQotDQotXHZlcnNpb25hZGRlZHsyLjV9DQotDQotVGhlIEVsZW1lbnRUcmVlIHBhY2thZ2UgaXMgYSBzaW1wbGUsIGVmZmljaWVudCwgYW5kIHF1aXRlIHBvcHVsYXINCi1saWJyYXJ5IGZvciBYTUwgbWFuaXB1bGF0aW9uIGluIFB5dGhvbi4NCi0NCi1UaGUgXG1vZHVsZXt4bWwuZXRyZWV9IHBhY2thZ2UgY29udGFpbnMgdGhlIG1vc3QgY29tbW9uIGNvbXBvbmVudHMNCi1mcm9tIHRoZSBFbGVtZW50VHJlZSBBUEkgbGlicmFyeS4NCi1JbiB0aGUgY3VycmVudCByZWxlYXNlLCB0aGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIFxtb2R1bGV7RWxlbWVudFRyZWV9LA0KLVxtb2R1bGV7RWxlbWVudFBhdGh9LCBhbmQgXG1vZHVsZXtFbGVtZW50SW5jbHVkZX0gbW9kdWxlcyBmcm9tIHRoZSBmdWxsDQotRWxlbWVudFRyZWUgZGlzdHJpYnV0aW9uLg0KLQ0KLSUgWFhYIFRvIGJlIGNvbnRpbnVlZCENCi0NCi1cYmVnaW57c2VlYWxzb30NCi1cc2VldGl0bGVbaHR0cDovL2VmZmJvdC5vcmcvdGFnL2VsZW1lbnR0cmVlXQ0KLSAgICAgICAge0VsZW1lbnRUcmVlIE92ZXJ2aWV3fQ0KLSAgICAgICAge1RoZSBob21lIHBhZ2UgZm9yIFxtb2R1bGV7RWxlbWVudFRyZWV9LiAgVGhpcyBpbmNsdWRlcyBsaW5rcw0KLSAgICAgICAgIHRvIGFkZGl0aW9uYWwgZG9jdW1lbnRhdGlvbiwgYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb25zLCBhbmQNCi0gICAgICAgICBvdGhlciBhZGQtb25zLn0NCi1cZW5ke3NlZWFsc299DQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi94bWxzYXgudGV4IGIvRG9jL2xpYi94bWxzYXgudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzhjMjc5Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIveG1sc2F4LnRleAorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3htbC5zYXh9IC0tLQotICAgICAgICAgU3VwcG9ydCBmb3IgU0FYMiBwYXJzZXJzfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17eG1sLnNheH0KLVxtb2R1bGVzeW5vcHNpc3tQYWNrYWdlIGNvbnRhaW5pbmcgU0FYMiBiYXNlIGNsYXNzZXMgYW5kIGNvbnZlbmllbmNlCi0gICAgICAgICAgICAgICAgZnVuY3Rpb25zLn0KLVxtb2R1bGVhdXRob3J7TGFycyBNYXJpdXMgR2Fyc2hvbH17bGFyc2dhQGdhcnNob2wucHJpdi5ub30KLVxzZWN0aW9uYXV0aG9ye0ZyZWQgTC4gRHJha2UsIEpyLn17ZmRyYWtlQGFjbS5vcmd9Ci1cc2VjdGlvbmF1dGhvcntNYXJ0aW4gdi4gTFwib3dpc317bWFydGluQHYubG9ld2lzLmRlfQotCi1cdmVyc2lvbmFkZGVkezIuMH0KLQotCi1UaGUgXG1vZHVsZXt4bWwuc2F4fSBwYWNrYWdlIHByb3ZpZGVzIGEgbnVtYmVyIG9mIG1vZHVsZXMgd2hpY2gKLWltcGxlbWVudCB0aGUgU2ltcGxlIEFQSSBmb3IgWE1MIChTQVgpIGludGVyZmFjZSBmb3IgUHl0aG9uLiAgVGhlCi1wYWNrYWdlIGl0c2VsZiBwcm92aWRlcyB0aGUgU0FYIGV4Y2VwdGlvbnMgYW5kIHRoZSBjb252ZW5pZW5jZQotZnVuY3Rpb25zIHdoaWNoIHdpbGwgYmUgbW9zdCB1c2VkIGJ5IHVzZXJzIG9mIHRoZSBTQVggQVBJLgotCi1UaGUgY29udmVuaWVuY2UgZnVuY3Rpb25zIGFyZToKLQotXGJlZ2lue2Z1bmNkZXNjfXttYWtlX3BhcnNlcn17XG9wdGlvbmFse3BhcnNlcl9saXN0fX0KLSAgQ3JlYXRlIGFuZCByZXR1cm4gYSBTQVggXGNsYXNze1hNTFJlYWRlcn0gb2JqZWN0LiAgVGhlIGZpcnN0IHBhcnNlcgotICBmb3VuZCB3aWxsIGJlIHVzZWQuICBJZiBcdmFye3BhcnNlcl9saXN0fSBpcyBwcm92aWRlZCwgaXQgbXVzdCBiZSBhCi0gIHNlcXVlbmNlIG9mIHN0cmluZ3Mgd2hpY2ggbmFtZSBtb2R1bGVzIHRoYXQgaGF2ZSBhIGZ1bmN0aW9uIG5hbWVkCi0gIFxmdW5jdGlvbntjcmVhdGVfcGFyc2VyKCl9LiAgTW9kdWxlcyBsaXN0ZWQgaW4gXHZhcntwYXJzZXJfbGlzdH0KLSAgd2lsbCBiZSB1c2VkIGJlZm9yZSBtb2R1bGVzIGluIHRoZSBkZWZhdWx0IGxpc3Qgb2YgcGFyc2Vycy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317cGFyc2V9e2ZpbGVuYW1lX29yX3N0cmVhbSwgaGFuZGxlclxvcHRpb25hbHssIGVycm9yX2hhbmRsZXJ9fQotICBDcmVhdGUgYSBTQVggcGFyc2VyIGFuZCB1c2UgaXQgdG8gcGFyc2UgYSBkb2N1bWVudC4gIFRoZSBkb2N1bWVudCwKLSAgcGFzc2VkIGluIGFzIFx2YXJ7ZmlsZW5hbWVfb3Jfc3RyZWFtfSwgY2FuIGJlIGEgZmlsZW5hbWUgb3IgYSBmaWxlCi0gIG9iamVjdC4gIFRoZSBcdmFye2hhbmRsZXJ9IHBhcmFtZXRlciBuZWVkcyB0byBiZSBhIFNBWAotICBcY2xhc3N7Q29udGVudEhhbmRsZXJ9IGluc3RhbmNlLiAgSWYgXHZhcntlcnJvcl9oYW5kbGVyfSBpcyBnaXZlbiwKLSAgaXQgbXVzdCBiZSBhIFNBWCBcY2xhc3N7RXJyb3JIYW5kbGVyfSBpbnN0YW5jZTsgaWYgb21pdHRlZCwgCi0gIFxleGNlcHRpb257U0FYUGFyc2VFeGNlcHRpb259IHdpbGwgYmUgcmFpc2VkIG9uIGFsbCBlcnJvcnMuICBUaGVyZQotICBpcyBubyByZXR1cm4gdmFsdWU7IGFsbCB3b3JrIG11c3QgYmUgZG9uZSBieSB0aGUgXHZhcntoYW5kbGVyfQotICBwYXNzZWQgaW4uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3BhcnNlU3RyaW5nfXtzdHJpbmcsIGhhbmRsZXJcb3B0aW9uYWx7LCBlcnJvcl9oYW5kbGVyfX0KLSAgU2ltaWxhciB0byBcZnVuY3Rpb257cGFyc2UoKX0sIGJ1dCBwYXJzZXMgZnJvbSBhIGJ1ZmZlciBcdmFye3N0cmluZ30KLSAgcmVjZWl2ZWQgYXMgYSBwYXJhbWV0ZXIuCi1cZW5ke2Z1bmNkZXNjfQotCi1BIHR5cGljYWwgU0FYIGFwcGxpY2F0aW9uIHVzZXMgdGhyZWUga2luZHMgb2Ygb2JqZWN0czogcmVhZGVycywKLWhhbmRsZXJzIGFuZCBpbnB1dCBzb3VyY2VzLiAgYGBSZWFkZXInJyBpbiB0aGlzIGNvbnRleHQgaXMgYW5vdGhlcgotdGVybSBmb3IgcGFyc2VyLCBpLmUuXCBzb21lIHBpZWNlIG9mIGNvZGUgdGhhdCByZWFkcyB0aGUgYnl0ZXMgb3IKLWNoYXJhY3RlcnMgZnJvbSB0aGUgaW5wdXQgc291cmNlLCBhbmQgcHJvZHVjZXMgYSBzZXF1ZW5jZSBvZiBldmVudHMuCi1UaGUgZXZlbnRzIHRoZW4gZ2V0IGRpc3RyaWJ1dGVkIHRvIHRoZSBoYW5kbGVyIG9iamVjdHMsIGkuZS5cIHRoZQotcmVhZGVyIGludm9rZXMgYSBtZXRob2Qgb24gdGhlIGhhbmRsZXIuICBBIFNBWCBhcHBsaWNhdGlvbiBtdXN0Ci10aGVyZWZvcmUgb2J0YWluIGEgcmVhZGVyIG9iamVjdCwgY3JlYXRlIG9yIG9wZW4gdGhlIGlucHV0IHNvdXJjZXMsCi1jcmVhdGUgdGhlIGhhbmRsZXJzLCBhbmQgY29ubmVjdCB0aGVzZSBvYmplY3RzIGFsbCB0b2dldGhlci4gIEFzIHRoZQotZmluYWwgc3RlcCBvZiBwcmVwYXJhdGlvbiwgdGhlIHJlYWRlciBpcyBjYWxsZWQgdG8gcGFyc2UgdGhlIGlucHV0LgotRHVyaW5nIHBhcnNpbmcsIG1ldGhvZHMgb24gdGhlIGhhbmRsZXIgb2JqZWN0cyBhcmUgY2FsbGVkIGJhc2VkIG9uCi1zdHJ1Y3R1cmFsIGFuZCBzeW50YWN0aWMgZXZlbnRzIGZyb20gdGhlIGlucHV0IGRhdGEuCi0KLUZvciB0aGVzZSBvYmplY3RzLCBvbmx5IHRoZSBpbnRlcmZhY2VzIGFyZSByZWxldmFudDsgdGhleSBhcmUgbm9ybWFsbHkKLW5vdCBpbnN0YW50aWF0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGl0c2VsZi4gIFNpbmNlIFB5dGhvbiBkb2VzIG5vdCBoYXZlCi1hbiBleHBsaWNpdCBub3Rpb24gb2YgaW50ZXJmYWNlLCB0aGV5IGFyZSBmb3JtYWxseSBpbnRyb2R1Y2VkIGFzCi1jbGFzc2VzLCBidXQgYXBwbGljYXRpb25zIG1heSB1c2UgaW1wbGVtZW50YXRpb25zIHdoaWNoIGRvIG5vdCBpbmhlcml0Ci1mcm9tIHRoZSBwcm92aWRlZCBjbGFzc2VzLiAgVGhlIFxjbGFzc3tJbnB1dFNvdXJjZX0sIFxjbGFzc3tMb2NhdG9yfSwKLVxjbGFzc3tBdHRyaWJ1dGVzfSwgXGNsYXNze0F0dHJpYnV0ZXNOU30sIGFuZAotXGNsYXNze1hNTFJlYWRlcn0gaW50ZXJmYWNlcyBhcmUgZGVmaW5lZCBpbiB0aGUgbW9kdWxlCi1ccmVmbW9kdWxle3htbC5zYXgueG1scmVhZGVyfS4gIFRoZSBoYW5kbGVyIGludGVyZmFjZXMgYXJlIGRlZmluZWQgaW4KLVxyZWZtb2R1bGV7eG1sLnNheC5oYW5kbGVyfS4gIEZvciBjb252ZW5pZW5jZSwgXGNsYXNze0lucHV0U291cmNlfQotKHdoaWNoIGlzIG9mdGVuIGluc3RhbnRpYXRlZCBkaXJlY3RseSkgYW5kIHRoZSBoYW5kbGVyIGNsYXNzZXMgYXJlCi1hbHNvIGF2YWlsYWJsZSBmcm9tIFxtb2R1bGV7eG1sLnNheH0uICBUaGVzZSBpbnRlcmZhY2VzIGFyZSBkZXNjcmliZWQKLWJlbG93LgotCi1JbiBhZGRpdGlvbiB0byB0aGVzZSBjbGFzc2VzLCBcbW9kdWxle3htbC5zYXh9IHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcKLWV4Y2VwdGlvbiBjbGFzc2VzLgotCi1cYmVnaW57ZXhjY2xhc3NkZXNjfXtTQVhFeGNlcHRpb259e21zZ1xvcHRpb25hbHssIGV4Y2VwdGlvbn19Ci0gIEVuY2Fwc3VsYXRlIGFuIFhNTCBlcnJvciBvciB3YXJuaW5nLiAgVGhpcyBjbGFzcyBjYW4gY29udGFpbiBiYXNpYwotICBlcnJvciBvciB3YXJuaW5nIGluZm9ybWF0aW9uIGZyb20gZWl0aGVyIHRoZSBYTUwgcGFyc2VyIG9yIHRoZQotICBhcHBsaWNhdGlvbjogaXQgY2FuIGJlIHN1YmNsYXNzZWQgdG8gcHJvdmlkZSBhZGRpdGlvbmFsCi0gIGZ1bmN0aW9uYWxpdHkgb3IgdG8gYWRkIGxvY2FsaXphdGlvbi4gIE5vdGUgdGhhdCBhbHRob3VnaCB0aGUKLSAgaGFuZGxlcnMgZGVmaW5lZCBpbiB0aGUgXGNsYXNze0Vycm9ySGFuZGxlcn0gaW50ZXJmYWNlIHJlY2VpdmUKLSAgaW5zdGFuY2VzIG9mIHRoaXMgZXhjZXB0aW9uLCBpdCBpcyBub3QgcmVxdWlyZWQgdG8gYWN0dWFsbHkgcmFpc2UKLSAgdGhlIGV4Y2VwdGlvbiAtLS0gaXQgaXMgYWxzbyB1c2VmdWwgYXMgYSBjb250YWluZXIgZm9yIGluZm9ybWF0aW9uLgotCi0gIFdoZW4gaW5zdGFudGlhdGVkLCBcdmFye21zZ30gc2hvdWxkIGJlIGEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24KLSAgb2YgdGhlIGVycm9yLiAgVGhlIG9wdGlvbmFsIFx2YXJ7ZXhjZXB0aW9ufSBwYXJhbWV0ZXIsIGlmIGdpdmVuLAotICBzaG91bGQgYmUgXGNvZGV7Tm9uZX0gb3IgYW4gZXhjZXB0aW9uIHRoYXQgd2FzIGNhdWdodCBieSB0aGUgcGFyc2luZwotICBjb2RlIGFuZCBpcyBiZWluZyBwYXNzZWQgYWxvbmcgYXMgaW5mb3JtYXRpb24uCi0KLSAgVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgdGhlIG90aGVyIFNBWCBleGNlcHRpb24gY2xhc3Nlcy4KLVxlbmR7ZXhjY2xhc3NkZXNjfQotCi1cYmVnaW57ZXhjY2xhc3NkZXNjfXtTQVhQYXJzZUV4Y2VwdGlvbn17bXNnLCBleGNlcHRpb24sIGxvY2F0b3J9Ci0gIFN1YmNsYXNzIG9mIFxleGNlcHRpb257U0FYRXhjZXB0aW9ufSByYWlzZWQgb24gcGFyc2UgZXJyb3JzLgotICBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhcmUgcGFzc2VkIHRvIHRoZSBtZXRob2RzIG9mIHRoZSBTQVgKLSAgXGNsYXNze0Vycm9ySGFuZGxlcn0gaW50ZXJmYWNlIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0gIHBhcnNlIGVycm9yLiAgVGhpcyBjbGFzcyBzdXBwb3J0cyB0aGUgU0FYIFxjbGFzc3tMb2NhdG9yfSBpbnRlcmZhY2UKLSAgYXMgd2VsbCBhcyB0aGUgXGNsYXNze1NBWEV4Y2VwdGlvbn0gaW50ZXJmYWNlLgotXGVuZHtleGNjbGFzc2Rlc2N9Ci0KLVxiZWdpbntleGNjbGFzc2Rlc2N9e1NBWE5vdFJlY29nbml6ZWRFeGNlcHRpb259e21zZ1xvcHRpb25hbHssIGV4Y2VwdGlvbn19Ci0gIFN1YmNsYXNzIG9mIFxleGNlcHRpb257U0FYRXhjZXB0aW9ufSByYWlzZWQgd2hlbiBhIFNBWAotICBcY2xhc3N7WE1MUmVhZGVyfSBpcyBjb25mcm9udGVkIHdpdGggYW4gdW5yZWNvZ25pemVkIGZlYXR1cmUgb3IKLSAgcHJvcGVydHkuICBTQVggYXBwbGljYXRpb25zIGFuZCBleHRlbnNpb25zIG1heSB1c2UgdGhpcyBjbGFzcyBmb3IKLSAgc2ltaWxhciBwdXJwb3Nlcy4KLVxlbmR7ZXhjY2xhc3NkZXNjfQotCi1cYmVnaW57ZXhjY2xhc3NkZXNjfXtTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb259e21zZ1xvcHRpb25hbHssIGV4Y2VwdGlvbn19Ci0gIFN1YmNsYXNzIG9mIFxleGNlcHRpb257U0FYRXhjZXB0aW9ufSByYWlzZWQgd2hlbiBhIFNBWAotICBcY2xhc3N7WE1MUmVhZGVyfSBpcyBhc2tlZCB0byBlbmFibGUgYSBmZWF0dXJlIHRoYXQgaXMgbm90Ci0gIHN1cHBvcnRlZCwgb3IgdG8gc2V0IGEgcHJvcGVydHkgdG8gYSB2YWx1ZSB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbgotICBkb2VzIG5vdCBzdXBwb3J0LiAgU0FYIGFwcGxpY2F0aW9ucyBhbmQgZXh0ZW5zaW9ucyBtYXkgdXNlIHRoaXMKLSAgY2xhc3MgZm9yIHNpbWlsYXIgcHVycG9zZXMuCi1cZW5ke2V4Y2NsYXNzZGVzY30KLQotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZXRpdGxlW2h0dHA6Ly93d3cuc2F4cHJvamVjdC5vcmcvXXtTQVg6IFRoZSBTaW1wbGUgQVBJIGZvcgotICAgICAgICAgICAgWE1MfXtUaGlzIHNpdGUgaXMgdGhlIGZvY2FsIHBvaW50IGZvciB0aGUgZGVmaW5pdGlvbiBvZgotICAgICAgICAgICAgdGhlIFNBWCBBUEkuICBJdCBwcm92aWRlcyBhIEphdmEgaW1wbGVtZW50YXRpb24gYW5kIG9ubGluZQotICAgICAgICAgICAgZG9jdW1lbnRhdGlvbi4gIExpbmtzIHRvIGltcGxlbWVudGF0aW9ucyBhbmQgaGlzdG9yaWNhbAotICAgICAgICAgICAgaW5mb3JtYXRpb24gYXJlIGFsc28gYXZhaWxhYmxlLn0KLQotICBcc2VlbW9kdWxle3htbC5zYXguaGFuZGxlcn17RGVmaW5pdGlvbnMgb2YgdGhlIGludGVyZmFjZXMgZm9yCi0gICAgICAgICAgICAgYXBwbGljYXRpb24tcHJvdmlkZWQgb2JqZWN0cy59Ci0KLSAgXHNlZW1vZHVsZXt4bWwuc2F4LnNheHV0aWxzfXtDb252ZW5pZW5jZSBmdW5jdGlvbnMgZm9yIHVzZSBpbiBTQVgKLSAgICAgICAgICAgICBhcHBsaWNhdGlvbnMufQotCi0gIFxzZWVtb2R1bGV7eG1sLnNheC54bWxyZWFkZXJ9e0RlZmluaXRpb25zIG9mIHRoZSBpbnRlcmZhY2VzIGZvcgotICAgICAgICAgICAgIHBhcnNlci1wcm92aWRlZCBvYmplY3RzLn0KLVxlbmR7c2VlYWxzb30KLQotCi1cc3Vic2VjdGlvbntTQVhFeGNlcHRpb24gT2JqZWN0cyBcbGFiZWx7c2F4LWV4Y2VwdGlvbi1vYmplY3RzfX0KLQotVGhlIFxjbGFzc3tTQVhFeGNlcHRpb259IGV4Y2VwdGlvbiBjbGFzcyBzdXBwb3J0cyB0aGUgZm9sbG93aW5nCi1tZXRob2RzOgotCi1cYmVnaW57bWV0aG9kZGVzY31bU0FYRXhjZXB0aW9uXXtnZXRNZXNzYWdlfXt9Ci0gIFJldHVybiBhIGh1bWFuLXJlYWRhYmxlIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgZXJyb3IgY29uZGl0aW9uLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bU0FYRXhjZXB0aW9uXXtnZXRFeGNlcHRpb259e30KLSAgUmV0dXJuIGFuIGVuY2Fwc3VsYXRlZCBleGNlcHRpb24gb2JqZWN0LCBvciBcY29kZXtOb25lfS4KLVxlbmR7bWV0aG9kZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIveG1sc2F4aGFuZGxlci50ZXggYi9Eb2MvbGliL3htbHNheGhhbmRsZXIudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2M3MmU3Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIveG1sc2F4aGFuZGxlci50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwzODEgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXt4bWwuc2F4LmhhbmRsZXJ9IC0tLQotICAgICAgICAgQmFzZSBjbGFzc2VzIGZvciBTQVggaGFuZGxlcnN9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXt4bWwuc2F4LmhhbmRsZXJ9Ci1cbW9kdWxlc3lub3BzaXN7QmFzZSBjbGFzc2VzIGZvciBTQVggZXZlbnQgaGFuZGxlcnMufQotXHNlY3Rpb25hdXRob3J7TWFydGluIHYuIExcIm93aXN9e21hcnRpbkB2LmxvZXdpcy5kZX0KLVxtb2R1bGVhdXRob3J7TGFycyBNYXJpdXMgR2Fyc2hvbH17bGFyc2dhQGdhcnNob2wucHJpdi5ub30KLQotXHZlcnNpb25hZGRlZHsyLjB9Ci0KLQotVGhlIFNBWCBBUEkgZGVmaW5lcyBmb3VyIGtpbmRzIG9mIGhhbmRsZXJzOiBjb250ZW50IGhhbmRsZXJzLCBEVEQKLWhhbmRsZXJzLCBlcnJvciBoYW5kbGVycywgYW5kIGVudGl0eSByZXNvbHZlcnMuIEFwcGxpY2F0aW9ucyBub3JtYWxseQotb25seSBuZWVkIHRvIGltcGxlbWVudCB0aG9zZSBpbnRlcmZhY2VzIHdob3NlIGV2ZW50cyB0aGV5IGFyZQotaW50ZXJlc3RlZCBpbjsgdGhleSBjYW4gaW1wbGVtZW50IHRoZSBpbnRlcmZhY2VzIGluIGEgc2luZ2xlIG9iamVjdCBvcgotaW4gbXVsdGlwbGUgb2JqZWN0cy4gSGFuZGxlciBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGluaGVyaXQgZnJvbSB0aGUKLWJhc2UgY2xhc3NlcyBwcm92aWRlZCBpbiB0aGUgbW9kdWxlIFxtb2R1bGV7eG1sLnNheC5oYW5kbGVyfSwgc28gdGhhdCBhbGwKLW1ldGhvZHMgZ2V0IGRlZmF1bHQgaW1wbGVtZW50YXRpb25zLgotCi1cYmVnaW57Y2xhc3NkZXNjKn17Q29udGVudEhhbmRsZXJ9Ci0gIFRoaXMgaXMgdGhlIG1haW4gY2FsbGJhY2sgaW50ZXJmYWNlIGluIFNBWCwgYW5kIHRoZSBvbmUgbW9zdAotICBpbXBvcnRhbnQgdG8gYXBwbGljYXRpb25zLiBUaGUgb3JkZXIgb2YgZXZlbnRzIGluIHRoaXMgaW50ZXJmYWNlCi0gIG1pcnJvcnMgdGhlIG9yZGVyIG9mIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgZG9jdW1lbnQuCi1cZW5ke2NsYXNzZGVzYyp9Ci0KLVxiZWdpbntjbGFzc2Rlc2MqfXtEVERIYW5kbGVyfQotICBIYW5kbGUgRFREIGV2ZW50cy4KLQotICBUaGlzIGludGVyZmFjZSBzcGVjaWZpZXMgb25seSB0aG9zZSBEVEQgZXZlbnRzIHJlcXVpcmVkIGZvciBiYXNpYwotICBwYXJzaW5nICh1bnBhcnNlZCBlbnRpdGllcyBhbmQgYXR0cmlidXRlcykuCi1cZW5ke2NsYXNzZGVzYyp9Ci0KLVxiZWdpbntjbGFzc2Rlc2MqfXtFbnRpdHlSZXNvbHZlcn0KLSBCYXNpYyBpbnRlcmZhY2UgZm9yIHJlc29sdmluZyBlbnRpdGllcy4gSWYgeW91IGNyZWF0ZSBhbiBvYmplY3QKLSBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UsIHRoZW4gcmVnaXN0ZXIgdGhlIG9iamVjdCB3aXRoIHlvdXIKLSBQYXJzZXIsIHRoZSBwYXJzZXIgd2lsbCBjYWxsIHRoZSBtZXRob2QgaW4geW91ciBvYmplY3QgdG8gcmVzb2x2ZSBhbGwKLSBleHRlcm5hbCBlbnRpdGllcy4KLVxlbmR7Y2xhc3NkZXNjKn0KLQotXGJlZ2lue2NsYXNzZGVzYyp9e0Vycm9ySGFuZGxlcn0KLSAgSW50ZXJmYWNlIHVzZWQgYnkgdGhlIHBhcnNlciB0byBwcmVzZW50IGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2VzCi0gIHRvIHRoZSBhcHBsaWNhdGlvbi4gIFRoZSBtZXRob2RzIG9mIHRoaXMgb2JqZWN0IGNvbnRyb2wgd2hldGhlciBlcnJvcnMKLSAgYXJlIGltbWVkaWF0ZWx5IGNvbnZlcnRlZCB0byBleGNlcHRpb25zIG9yIGFyZSBoYW5kbGVkIGluIHNvbWUgb3RoZXIKLSAgd2F5LgotXGVuZHtjbGFzc2Rlc2MqfQotCi1JbiBhZGRpdGlvbiB0byB0aGVzZSBjbGFzc2VzLCBcbW9kdWxle3htbC5zYXguaGFuZGxlcn0gcHJvdmlkZXMKLXN5bWJvbGljIGNvbnN0YW50cyBmb3IgdGhlIGZlYXR1cmUgYW5kIHByb3BlcnR5IG5hbWVzLgotCi1cYmVnaW57ZGF0YWRlc2N9e2ZlYXR1cmVfbmFtZXNwYWNlc30KLSAgVmFsdWU6IFxjb2RleyJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyJ9XFwKLSAgdHJ1ZTogUGVyZm9ybSBOYW1lc3BhY2UgcHJvY2Vzc2luZy5cXAotICBmYWxzZTogT3B0aW9uYWxseSBkbyBub3QgcGVyZm9ybSBOYW1lc3BhY2UgcHJvY2Vzc2luZwotICAgICAgICAgKGltcGxpZXMgbmFtZXNwYWNlLXByZWZpeGVzOyBkZWZhdWx0KS5cXAotICBhY2Nlc3M6IChwYXJzaW5nKSByZWFkLW9ubHk7IChub3QgcGFyc2luZykgcmVhZC93cml0ZQotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtmZWF0dXJlX25hbWVzcGFjZV9wcmVmaXhlc30KLSAgVmFsdWU6IFxjb2RleyJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlLXByZWZpeGVzIn1cXAotICB0cnVlOiBSZXBvcnQgdGhlIG9yaWdpbmFsIHByZWZpeGVkIG5hbWVzIGFuZCBhdHRyaWJ1dGVzIHVzZWQgZm9yIE5hbWVzcGFjZQotICAgICAgICBkZWNsYXJhdGlvbnMuXFwKLSAgZmFsc2U6IERvIG5vdCByZXBvcnQgYXR0cmlidXRlcyB1c2VkIGZvciBOYW1lc3BhY2UgZGVjbGFyYXRpb25zLCBhbmQKLSAgICAgICAgIG9wdGlvbmFsbHkgZG8gbm90IHJlcG9ydCBvcmlnaW5hbCBwcmVmaXhlZCBuYW1lcyAoZGVmYXVsdCkuXFwKLSAgYWNjZXNzOiAocGFyc2luZykgcmVhZC1vbmx5OyAobm90IHBhcnNpbmcpIHJlYWQvd3JpdGUgIAotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtmZWF0dXJlX3N0cmluZ19pbnRlcm5pbmd9Ci0gIFZhbHVlOiBcY29kZXsiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL3N0cmluZy1pbnRlcm5pbmcifVxcCi0gIHRydWU6IEFsbCBlbGVtZW50IG5hbWVzLCBwcmVmaXhlcywgYXR0cmlidXRlIG5hbWVzLCBOYW1lc3BhY2UgVVJJcywgYW5kCi0gICAgICAgIGxvY2FsIG5hbWVzIGFyZSBpbnRlcm5lZCB1c2luZyB0aGUgYnVpbHQtaW4gaW50ZXJuIGZ1bmN0aW9uLlxcCi0gIGZhbHNlOiBOYW1lcyBhcmUgbm90IG5lY2Vzc2FyaWx5IGludGVybmVkLCBhbHRob3VnaCB0aGV5IG1heSBiZSAoZGVmYXVsdCkuXFwKLSAgYWNjZXNzOiAocGFyc2luZykgcmVhZC1vbmx5OyAobm90IHBhcnNpbmcpIHJlYWQvd3JpdGUKLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317ZmVhdHVyZV92YWxpZGF0aW9ufQotICBWYWx1ZTogXGNvZGV7Imh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIn1cXAotICB0cnVlOiBSZXBvcnQgYWxsIHZhbGlkYXRpb24gZXJyb3JzIChpbXBsaWVzIGV4dGVybmFsLWdlbmVyYWwtZW50aXRpZXMgYW5kCi0gICAgICAgIGV4dGVybmFsLXBhcmFtZXRlci1lbnRpdGllcykuXFwKLSAgZmFsc2U6IERvIG5vdCByZXBvcnQgdmFsaWRhdGlvbiBlcnJvcnMuXFwKLSAgYWNjZXNzOiAocGFyc2luZykgcmVhZC1vbmx5OyAobm90IHBhcnNpbmcpIHJlYWQvd3JpdGUKLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317ZmVhdHVyZV9leHRlcm5hbF9nZXN9Ci0gIFZhbHVlOiBcY29kZXsiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL2V4dGVybmFsLWdlbmVyYWwtZW50aXRpZXMifVxcCi0gIHRydWU6IEluY2x1ZGUgYWxsIGV4dGVybmFsIGdlbmVyYWwgKHRleHQpIGVudGl0aWVzLlxcCi0gIGZhbHNlOiBEbyBub3QgaW5jbHVkZSBleHRlcm5hbCBnZW5lcmFsIGVudGl0aWVzLlxcCi0gIGFjY2VzczogKHBhcnNpbmcpIHJlYWQtb25seTsgKG5vdCBwYXJzaW5nKSByZWFkL3dyaXRlCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e2ZlYXR1cmVfZXh0ZXJuYWxfcGVzfQotICBWYWx1ZTogXGNvZGV7Imh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9leHRlcm5hbC1wYXJhbWV0ZXItZW50aXRpZXMifVxcCi0gIHRydWU6IEluY2x1ZGUgYWxsIGV4dGVybmFsIHBhcmFtZXRlciBlbnRpdGllcywgaW5jbHVkaW5nIHRoZSBleHRlcm5hbAotICAgICAgICBEVEQgc3Vic2V0LlxcCi0gIGZhbHNlOiBEbyBub3QgaW5jbHVkZSBhbnkgZXh0ZXJuYWwgcGFyYW1ldGVyIGVudGl0aWVzLCBldmVuIHRoZSBleHRlcm5hbAotICAgICAgICAgRFREIHN1YnNldC5cXAotICBhY2Nlc3M6IChwYXJzaW5nKSByZWFkLW9ubHk7IChub3QgcGFyc2luZykgcmVhZC93cml0ZQotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXthbGxfZmVhdHVyZXN9Ci0gIExpc3Qgb2YgYWxsIGZlYXR1cmVzLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtwcm9wZXJ0eV9sZXhpY2FsX2hhbmRsZXJ9Ci0gIFZhbHVlOiBcY29kZXsiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIn1cXAotICBkYXRhIHR5cGU6IHhtbC5zYXguc2F4MmxpYi5MZXhpY2FsSGFuZGxlciAobm90IHN1cHBvcnRlZCBpbiBQeXRob24gMilcXAotICBkZXNjcmlwdGlvbjogQW4gb3B0aW9uYWwgZXh0ZW5zaW9uIGhhbmRsZXIgZm9yIGxleGljYWwgZXZlbnRzIGxpa2UgY29tbWVudHMuXFwKLSAgYWNjZXNzOiByZWFkL3dyaXRlCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e3Byb3BlcnR5X2RlY2xhcmF0aW9uX2hhbmRsZXJ9Ci0gIFZhbHVlOiBcY29kZXsiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvZGVjbGFyYXRpb24taGFuZGxlciJ9XFwKLSAgZGF0YSB0eXBlOiB4bWwuc2F4LnNheDJsaWIuRGVjbEhhbmRsZXIgKG5vdCBzdXBwb3J0ZWQgaW4gUHl0aG9uIDIpXFwKLSAgZGVzY3JpcHRpb246IEFuIG9wdGlvbmFsIGV4dGVuc2lvbiBoYW5kbGVyIGZvciBEVEQtcmVsYXRlZCBldmVudHMgb3RoZXIKLSAgICAgICAgICAgICAgIHRoYW4gbm90YXRpb25zIGFuZCB1bnBhcnNlZCBlbnRpdGllcy5cXAotICBhY2Nlc3M6IHJlYWQvd3JpdGUKLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317cHJvcGVydHlfZG9tX25vZGV9Ci0gIFZhbHVlOiBcY29kZXsiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvZG9tLW5vZGUifVxcCi0gIGRhdGEgdHlwZTogb3JnLnczYy5kb20uTm9kZSAobm90IHN1cHBvcnRlZCBpbiBQeXRob24gMikgXFwKLSAgZGVzY3JpcHRpb246IFdoZW4gcGFyc2luZywgdGhlIGN1cnJlbnQgRE9NIG5vZGUgYmVpbmcgdmlzaXRlZCBpZiB0aGlzIGlzCi0gICAgICAgICAgICAgICBhIERPTSBpdGVyYXRvcjsgd2hlbiBub3QgcGFyc2luZywgdGhlIHJvb3QgRE9NIG5vZGUgZm9yCi0gICAgICAgICAgICAgICBpdGVyYXRpb24uXFwKLSAgYWNjZXNzOiAocGFyc2luZykgcmVhZC1vbmx5OyAobm90IHBhcnNpbmcpIHJlYWQvd3JpdGUgIAotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtwcm9wZXJ0eV94bWxfc3RyaW5nfQotICBWYWx1ZTogXGNvZGV7Imh0dHA6Ly94bWwub3JnL3NheC9wcm9wZXJ0aWVzL3htbC1zdHJpbmcifVxcCi0gIGRhdGEgdHlwZTogU3RyaW5nXFwKLSAgZGVzY3JpcHRpb246IFRoZSBsaXRlcmFsIHN0cmluZyBvZiBjaGFyYWN0ZXJzIHRoYXQgd2FzIHRoZSBzb3VyY2UgZm9yCi0gICAgICAgICAgICAgICB0aGUgY3VycmVudCBldmVudC5cXAotICBhY2Nlc3M6IHJlYWQtb25seQotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXthbGxfcHJvcGVydGllc30KLSAgTGlzdCBvZiBhbGwga25vd24gcHJvcGVydHkgbmFtZXMuCi1cZW5ke2RhdGFkZXNjfQotCi0KLVxzdWJzZWN0aW9ue0NvbnRlbnRIYW5kbGVyIE9iamVjdHMgXGxhYmVse2NvbnRlbnQtaGFuZGxlci1vYmplY3RzfX0KLQotVXNlcnMgYXJlIGV4cGVjdGVkIHRvIHN1YmNsYXNzIFxjbGFzc3tDb250ZW50SGFuZGxlcn0gdG8gc3VwcG9ydCB0aGVpcgotYXBwbGljYXRpb24uICBUaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIGNhbGxlZCBieSB0aGUgcGFyc2VyIG9uIHRoZQotYXBwcm9wcmlhdGUgZXZlbnRzIGluIHRoZSBpbnB1dCBkb2N1bWVudDoKLQotXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRlbnRIYW5kbGVyXXtzZXREb2N1bWVudExvY2F0b3J9e2xvY2F0b3J9Ci0gIENhbGxlZCBieSB0aGUgcGFyc2VyIHRvIGdpdmUgdGhlIGFwcGxpY2F0aW9uIGEgbG9jYXRvciBmb3IgbG9jYXRpbmcKLSAgdGhlIG9yaWdpbiBvZiBkb2N1bWVudCBldmVudHMuCi0gIAotICBTQVggcGFyc2VycyBhcmUgc3Ryb25nbHkgZW5jb3VyYWdlZCAodGhvdWdoIG5vdCBhYnNvbHV0ZWx5IHJlcXVpcmVkKQotICB0byBzdXBwbHkgYSBsb2NhdG9yOiBpZiBpdCBkb2VzIHNvLCBpdCBtdXN0IHN1cHBseSB0aGUgbG9jYXRvciB0bwotICB0aGUgYXBwbGljYXRpb24gYnkgaW52b2tpbmcgdGhpcyBtZXRob2QgYmVmb3JlIGludm9raW5nIGFueSBvZiB0aGUKLSAgb3RoZXIgbWV0aG9kcyBpbiB0aGUgRG9jdW1lbnRIYW5kbGVyIGludGVyZmFjZS4KLSAgCi0gIFRoZSBsb2NhdG9yIGFsbG93cyB0aGUgYXBwbGljYXRpb24gdG8gZGV0ZXJtaW5lIHRoZSBlbmQgcG9zaXRpb24gb2YKLSAgYW55IGRvY3VtZW50LXJlbGF0ZWQgZXZlbnQsIGV2ZW4gaWYgdGhlIHBhcnNlciBpcyBub3QgcmVwb3J0aW5nIGFuCi0gIGVycm9yLiBUeXBpY2FsbHksIHRoZSBhcHBsaWNhdGlvbiB3aWxsIHVzZSB0aGlzIGluZm9ybWF0aW9uIGZvcgotICByZXBvcnRpbmcgaXRzIG93biBlcnJvcnMgKHN1Y2ggYXMgY2hhcmFjdGVyIGNvbnRlbnQgdGhhdCBkb2VzIG5vdAotICBtYXRjaCBhbiBhcHBsaWNhdGlvbidzIGJ1c2luZXNzIHJ1bGVzKS4gVGhlIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5Ci0gIHRoZSBsb2NhdG9yIGlzIHByb2JhYmx5IG5vdCBzdWZmaWNpZW50IGZvciB1c2Ugd2l0aCBhIHNlYXJjaCBlbmdpbmUuCi0gIAotICBOb3RlIHRoYXQgdGhlIGxvY2F0b3Igd2lsbCByZXR1cm4gY29ycmVjdCBpbmZvcm1hdGlvbiBvbmx5IGR1cmluZwotICB0aGUgaW52b2NhdGlvbiBvZiB0aGUgZXZlbnRzIGluIHRoaXMgaW50ZXJmYWNlLiBUaGUgYXBwbGljYXRpb24KLSAgc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBhdCBhbnkgb3RoZXIgdGltZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRlbnRIYW5kbGVyXXtzdGFydERvY3VtZW50fXt9Ci0gIFJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIHRoZSBiZWdpbm5pbmcgb2YgYSBkb2N1bWVudC4KLSAgICAgICAgCi0gIFRoZSBTQVggcGFyc2VyIHdpbGwgaW52b2tlIHRoaXMgbWV0aG9kIG9ubHkgb25jZSwgYmVmb3JlIGFueSBvdGhlcgotICBtZXRob2RzIGluIHRoaXMgaW50ZXJmYWNlIG9yIGluIERUREhhbmRsZXIgKGV4Y2VwdCBmb3IKLSAgXG1ldGhvZHtzZXREb2N1bWVudExvY2F0b3IoKX0pLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29udGVudEhhbmRsZXJde2VuZERvY3VtZW50fXt9Ci0gIFJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIHRoZSBlbmQgb2YgYSBkb2N1bWVudC4KLSAgICAgICAgCi0gIFRoZSBTQVggcGFyc2VyIHdpbGwgaW52b2tlIHRoaXMgbWV0aG9kIG9ubHkgb25jZSwgYW5kIGl0IHdpbGwgYmUgdGhlCi0gIGxhc3QgbWV0aG9kIGludm9rZWQgZHVyaW5nIHRoZSBwYXJzZS4gVGhlIHBhcnNlciBzaGFsbCBub3QgaW52b2tlCi0gIHRoaXMgbWV0aG9kIHVudGlsIGl0IGhhcyBlaXRoZXIgYWJhbmRvbmVkIHBhcnNpbmcgKGJlY2F1c2Ugb2YgYW4KLSAgdW5yZWNvdmVyYWJsZSBlcnJvcikgb3IgcmVhY2hlZCB0aGUgZW5kIG9mIGlucHV0LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29udGVudEhhbmRsZXJde3N0YXJ0UHJlZml4TWFwcGluZ317cHJlZml4LCB1cml9Ci0gIEJlZ2luIHRoZSBzY29wZSBvZiBhIHByZWZpeC1VUkkgTmFtZXNwYWNlIG1hcHBpbmcuCi0gICAgICAgIAotICBUaGUgaW5mb3JtYXRpb24gZnJvbSB0aGlzIGV2ZW50IGlzIG5vdCBuZWNlc3NhcnkgZm9yIG5vcm1hbAotICBOYW1lc3BhY2UgcHJvY2Vzc2luZzogdGhlIFNBWCBYTUwgcmVhZGVyIHdpbGwgYXV0b21hdGljYWxseSByZXBsYWNlCi0gIHByZWZpeGVzIGZvciBlbGVtZW50IGFuZCBhdHRyaWJ1dGUgbmFtZXMgd2hlbiB0aGUKLSAgXGNvZGV7ZmVhdHVyZV9uYW1lc3BhY2VzfSBmZWF0dXJlIGlzIGVuYWJsZWQgKHRoZSBkZWZhdWx0KS4KLQotJSUgWFhYIFRoaXMgaXMgbm90IHJlYWxseSB0aGUgZGVmYXVsdCwgaXMgaXQ/IE12TAotICAKLSAgVGhlcmUgYXJlIGNhc2VzLCBob3dldmVyLCB3aGVuIGFwcGxpY2F0aW9ucyBuZWVkIHRvIHVzZSBwcmVmaXhlcyBpbgotICBjaGFyYWN0ZXIgZGF0YSBvciBpbiBhdHRyaWJ1dGUgdmFsdWVzLCB3aGVyZSB0aGV5IGNhbm5vdCBzYWZlbHkgYmUKLSAgZXhwYW5kZWQgYXV0b21hdGljYWxseTsgdGhlIFxtZXRob2R7c3RhcnRQcmVmaXhNYXBwaW5nKCl9IGFuZAotICBcbWV0aG9ke2VuZFByZWZpeE1hcHBpbmcoKX0gZXZlbnRzIHN1cHBseSB0aGUgaW5mb3JtYXRpb24gdG8gdGhlCi0gIGFwcGxpY2F0aW9uIHRvIGV4cGFuZCBwcmVmaXhlcyBpbiB0aG9zZSBjb250ZXh0cyBpdHNlbGYsIGlmCi0gIG5lY2Vzc2FyeS4KLSAgCi0gIE5vdGUgdGhhdCBcbWV0aG9ke3N0YXJ0UHJlZml4TWFwcGluZygpfSBhbmQKLSAgXG1ldGhvZHtlbmRQcmVmaXhNYXBwaW5nKCl9IGV2ZW50cyBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUgcHJvcGVybHkKLSAgbmVzdGVkIHJlbGF0aXZlIHRvIGVhY2gtb3RoZXI6IGFsbCBcbWV0aG9ke3N0YXJ0UHJlZml4TWFwcGluZygpfQotICBldmVudHMgd2lsbCBvY2N1ciBiZWZvcmUgdGhlIGNvcnJlc3BvbmRpbmcgXG1ldGhvZHtzdGFydEVsZW1lbnQoKX0KLSAgZXZlbnQsIGFuZCBhbGwgXG1ldGhvZHtlbmRQcmVmaXhNYXBwaW5nKCl9IGV2ZW50cyB3aWxsIG9jY3VyIGFmdGVyCi0gIHRoZSBjb3JyZXNwb25kaW5nIFxtZXRob2R7ZW5kRWxlbWVudCgpfSBldmVudCwgYnV0IHRoZWlyIG9yZGVyIGlzCi0gIG5vdCBndWFyYW50ZWVkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29udGVudEhhbmRsZXJde2VuZFByZWZpeE1hcHBpbmd9e3ByZWZpeH0KLSAgRW5kIHRoZSBzY29wZSBvZiBhIHByZWZpeC1VUkkgbWFwcGluZy4KLQotICBTZWUgXG1ldGhvZHtzdGFydFByZWZpeE1hcHBpbmcoKX0gZm9yIGRldGFpbHMuIFRoaXMgZXZlbnQgd2lsbAotICBhbHdheXMgb2NjdXIgYWZ0ZXIgdGhlIGNvcnJlc3BvbmRpbmcgXG1ldGhvZHtlbmRFbGVtZW50KCl9IGV2ZW50LAotICBidXQgdGhlIG9yZGVyIG9mIFxtZXRob2R7ZW5kUHJlZml4TWFwcGluZygpfSBldmVudHMgaXMgbm90IG90aGVyd2lzZQotICBndWFyYW50ZWVkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29udGVudEhhbmRsZXJde3N0YXJ0RWxlbWVudH17bmFtZSwgYXR0cnN9Ci0gIFNpZ25hbHMgdGhlIHN0YXJ0IG9mIGFuIGVsZW1lbnQgaW4gbm9uLW5hbWVzcGFjZSBtb2RlLgotCi0gIFRoZSBcdmFye25hbWV9IHBhcmFtZXRlciBjb250YWlucyB0aGUgcmF3IFhNTCAxLjAgbmFtZSBvZiB0aGUKLSAgZWxlbWVudCB0eXBlIGFzIGEgc3RyaW5nIGFuZCB0aGUgXHZhcnthdHRyc30gcGFyYW1ldGVyIGhvbGRzIGFuCi0gIG9iamVjdCBvZiB0aGUgXHVsaW5re1xjbGFzc3tBdHRyaWJ1dGVzfQotICBpbnRlcmZhY2V9e2F0dHJpYnV0ZXMtb2JqZWN0cy5odG1sfSBjb250YWluaW5nIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZQotICBlbGVtZW50LiAgVGhlIG9iamVjdCBwYXNzZWQgYXMgXHZhcnthdHRyc30gbWF5IGJlIHJlLXVzZWQgYnkgdGhlCi0gIHBhcnNlcjsgaG9sZGluZyBvbiB0byBhIHJlZmVyZW5jZSB0byBpdCBpcyBub3QgYSByZWxpYWJsZSB3YXkgdG8KLSAga2VlcCBhIGNvcHkgb2YgdGhlIGF0dHJpYnV0ZXMuICBUbyBrZWVwIGEgY29weSBvZiB0aGUgYXR0cmlidXRlcywKLSAgdXNlIHRoZSBcbWV0aG9ke2NvcHkoKX0gbWV0aG9kIG9mIHRoZSBcdmFye2F0dHJzfSBvYmplY3QuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb250ZW50SGFuZGxlcl17ZW5kRWxlbWVudH17bmFtZX0KLSAgU2lnbmFscyB0aGUgZW5kIG9mIGFuIGVsZW1lbnQgaW4gbm9uLW5hbWVzcGFjZSBtb2RlLgotCi0gIFRoZSBcdmFye25hbWV9IHBhcmFtZXRlciBjb250YWlucyB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0eXBlLCBqdXN0Ci0gIGFzIHdpdGggdGhlIFxtZXRob2R7c3RhcnRFbGVtZW50KCl9IGV2ZW50LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29udGVudEhhbmRsZXJde3N0YXJ0RWxlbWVudE5TfXtuYW1lLCBxbmFtZSwgYXR0cnN9Ci0gIFNpZ25hbHMgdGhlIHN0YXJ0IG9mIGFuIGVsZW1lbnQgaW4gbmFtZXNwYWNlIG1vZGUuCi0KLSAgVGhlIFx2YXJ7bmFtZX0gcGFyYW1ldGVyIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHR5cGUgYXMgYQotICBcY29kZXsoXHZhcnt1cml9LCBcdmFye2xvY2FsbmFtZX0pfSB0dXBsZSwgdGhlIFx2YXJ7cW5hbWV9IHBhcmFtZXRlcgotICBjb250YWlucyB0aGUgcmF3IFhNTCAxLjAgbmFtZSB1c2VkIGluIHRoZSBzb3VyY2UgZG9jdW1lbnQsIGFuZCB0aGUKLSAgXHZhcnthdHRyc30gcGFyYW1ldGVyIGhvbGRzIGFuIGluc3RhbmNlIG9mIHRoZQotICBcdWxpbmt7XGNsYXNze0F0dHJpYnV0ZXNOU30gaW50ZXJmYWNlfXthdHRyaWJ1dGVzLW5zLW9iamVjdHMuaHRtbH0KLSAgY29udGFpbmluZyB0aGUgYXR0cmlidXRlcyBvZiB0aGUgZWxlbWVudC4gIElmIG5vIG5hbWVzcGFjZSBpcwotICBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQsIHRoZSBcdmFye3VyaX0gY29tcG9uZW50IG9mIFx2YXJ7bmFtZX0KLSAgd2lsbCBiZSBcY29kZXtOb25lfS4gIFRoZSBvYmplY3QgcGFzc2VkIGFzIFx2YXJ7YXR0cnN9IG1heSBiZQotICByZS11c2VkIGJ5IHRoZSBwYXJzZXI7IGhvbGRpbmcgb24gdG8gYSByZWZlcmVuY2UgdG8gaXQgaXMgbm90IGEKLSAgcmVsaWFibGUgd2F5IHRvIGtlZXAgYSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGVzLiAgVG8ga2VlcCBhIGNvcHkgb2YKLSAgdGhlIGF0dHJpYnV0ZXMsIHVzZSB0aGUgXG1ldGhvZHtjb3B5KCl9IG1ldGhvZCBvZiB0aGUgXHZhcnthdHRyc30KLSAgb2JqZWN0LgotCi0gIFBhcnNlcnMgbWF5IHNldCB0aGUgXHZhcntxbmFtZX0gcGFyYW1ldGVyIHRvIFxjb2Rle05vbmV9LCB1bmxlc3MgdGhlCi0gIFxjb2Rle2ZlYXR1cmVfbmFtZXNwYWNlX3ByZWZpeGVzfSBmZWF0dXJlIGlzIGFjdGl2YXRlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRlbnRIYW5kbGVyXXtlbmRFbGVtZW50TlN9e25hbWUsIHFuYW1lfQotICBTaWduYWxzIHRoZSBlbmQgb2YgYW4gZWxlbWVudCBpbiBuYW1lc3BhY2UgbW9kZS4KLQotICBUaGUgXHZhcntuYW1lfSBwYXJhbWV0ZXIgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdHlwZSwganVzdAotICBhcyB3aXRoIHRoZSBcbWV0aG9ke3N0YXJ0RWxlbWVudE5TKCl9IG1ldGhvZCwgbGlrZXdpc2UgdGhlCi0gIFx2YXJ7cW5hbWV9IHBhcmFtZXRlci4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRlbnRIYW5kbGVyXXtjaGFyYWN0ZXJzfXtjb250ZW50fQotICBSZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiBjaGFyYWN0ZXIgZGF0YS4KLSAgICAgICAgCi0gIFRoZSBQYXJzZXIgd2lsbCBjYWxsIHRoaXMgbWV0aG9kIHRvIHJlcG9ydCBlYWNoIGNodW5rIG9mIGNoYXJhY3RlcgotICBkYXRhLiBTQVggcGFyc2VycyBtYXkgcmV0dXJuIGFsbCBjb250aWd1b3VzIGNoYXJhY3RlciBkYXRhIGluIGEKLSAgc2luZ2xlIGNodW5rLCBvciB0aGV5IG1heSBzcGxpdCBpdCBpbnRvIHNldmVyYWwgY2h1bmtzOyBob3dldmVyLCBhbGwKLSAgb2YgdGhlIGNoYXJhY3RlcnMgaW4gYW55IHNpbmdsZSBldmVudCBtdXN0IGNvbWUgZnJvbSB0aGUgc2FtZQotICBleHRlcm5hbCBlbnRpdHkgc28gdGhhdCB0aGUgTG9jYXRvciBwcm92aWRlcyB1c2VmdWwgaW5mb3JtYXRpb24uCi0KLSAgXHZhcntjb250ZW50fSBtYXkgYmUgYSBVbmljb2RlIHN0cmluZyBvciBhIGJ5dGUgc3RyaW5nOyB0aGUKLSAgXGNvZGV7ZXhwYXR9IHJlYWRlciBtb2R1bGUgcHJvZHVjZXMgYWx3YXlzIFVuaWNvZGUgc3RyaW5ncy4KLQotICBcbm90ZXtUaGUgZWFybGllciBTQVggMSBpbnRlcmZhY2UgcHJvdmlkZWQgYnkgdGhlIFB5dGhvbgotICBYTUwgU3BlY2lhbCBJbnRlcmVzdCBHcm91cCB1c2VkIGEgbW9yZSBKYXZhLWxpa2UgaW50ZXJmYWNlIGZvciB0aGlzCi0gIG1ldGhvZC4gIFNpbmNlIG1vc3QgcGFyc2VycyB1c2VkIGZyb20gUHl0aG9uIGRpZCBub3QgdGFrZSBhZHZhbnRhZ2UKLSAgb2YgdGhlIG9sZGVyIGludGVyZmFjZSwgdGhlIHNpbXBsZXIgc2lnbmF0dXJlIHdhcyBjaG9zZW4gdG8gcmVwbGFjZQotICBpdC4gIFRvIGNvbnZlcnQgb2xkIGNvZGUgdG8gdGhlIG5ldyBpbnRlcmZhY2UsIHVzZSBcdmFye2NvbnRlbnR9Ci0gIGluc3RlYWQgb2Ygc2xpY2luZyBjb250ZW50IHdpdGggdGhlIG9sZCBcdmFye29mZnNldH0gYW5kCi0gIFx2YXJ7bGVuZ3RofSBwYXJhbWV0ZXJzLn0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRlbnRIYW5kbGVyXXtpZ25vcmFibGVXaGl0ZXNwYWNlfXt3aGl0ZXNwYWNlfQotICBSZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiBpZ25vcmFibGUgd2hpdGVzcGFjZSBpbiBlbGVtZW50IGNvbnRlbnQuCi0gICAgICAgIAotICBWYWxpZGF0aW5nIFBhcnNlcnMgbXVzdCB1c2UgdGhpcyBtZXRob2QgdG8gcmVwb3J0IGVhY2ggY2h1bmsKLSAgb2YgaWdub3JhYmxlIHdoaXRlc3BhY2UgKHNlZSB0aGUgVzNDIFhNTCAxLjAgcmVjb21tZW5kYXRpb24sCi0gIHNlY3Rpb24gMi4xMCk6IG5vbi12YWxpZGF0aW5nIHBhcnNlcnMgbWF5IGFsc28gdXNlIHRoaXMgbWV0aG9kCi0gIGlmIHRoZXkgYXJlIGNhcGFibGUgb2YgcGFyc2luZyBhbmQgdXNpbmcgY29udGVudCBtb2RlbHMuCi0gIAotICBTQVggcGFyc2VycyBtYXkgcmV0dXJuIGFsbCBjb250aWd1b3VzIHdoaXRlc3BhY2UgaW4gYSBzaW5nbGUKLSAgY2h1bmssIG9yIHRoZXkgbWF5IHNwbGl0IGl0IGludG8gc2V2ZXJhbCBjaHVua3M7IGhvd2V2ZXIsIGFsbAotICBvZiB0aGUgY2hhcmFjdGVycyBpbiBhbnkgc2luZ2xlIGV2ZW50IG11c3QgY29tZSBmcm9tIHRoZSBzYW1lCi0gIGV4dGVybmFsIGVudGl0eSwgc28gdGhhdCB0aGUgTG9jYXRvciBwcm92aWRlcyB1c2VmdWwKLSAgaW5mb3JtYXRpb24uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb250ZW50SGFuZGxlcl17cHJvY2Vzc2luZ0luc3RydWN0aW9ufXt0YXJnZXQsIGRhdGF9Ci0gIFJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4KLSAgICAgICAgCi0gIFRoZSBQYXJzZXIgd2lsbCBpbnZva2UgdGhpcyBtZXRob2Qgb25jZSBmb3IgZWFjaCBwcm9jZXNzaW5nCi0gIGluc3RydWN0aW9uIGZvdW5kOiBub3RlIHRoYXQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgbWF5IG9jY3VyCi0gIGJlZm9yZSBvciBhZnRlciB0aGUgbWFpbiBkb2N1bWVudCBlbGVtZW50LgotCi0gIEEgU0FYIHBhcnNlciBzaG91bGQgbmV2ZXIgcmVwb3J0IGFuIFhNTCBkZWNsYXJhdGlvbiAoWE1MIDEuMCwKLSAgc2VjdGlvbiAyLjgpIG9yIGEgdGV4dCBkZWNsYXJhdGlvbiAoWE1MIDEuMCwgc2VjdGlvbiA0LjMuMSkgdXNpbmcKLSAgdGhpcyBtZXRob2QuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb250ZW50SGFuZGxlcl17c2tpcHBlZEVudGl0eX17bmFtZX0KLSAgUmVjZWl2ZSBub3RpZmljYXRpb24gb2YgYSBza2lwcGVkIGVudGl0eS4KLSAgICAgICAgCi0gIFRoZSBQYXJzZXIgd2lsbCBpbnZva2UgdGhpcyBtZXRob2Qgb25jZSBmb3IgZWFjaCBlbnRpdHkKLSAgc2tpcHBlZC4gTm9uLXZhbGlkYXRpbmcgcHJvY2Vzc29ycyBtYXkgc2tpcCBlbnRpdGllcyBpZiB0aGV5IGhhdmUKLSAgbm90IHNlZW4gdGhlIGRlY2xhcmF0aW9ucyAoYmVjYXVzZSwgZm9yIGV4YW1wbGUsIHRoZSBlbnRpdHkgd2FzCi0gIGRlY2xhcmVkIGluIGFuIGV4dGVybmFsIERURCBzdWJzZXQpLiBBbGwgcHJvY2Vzc29ycyBtYXkgc2tpcAotICBleHRlcm5hbCBlbnRpdGllcywgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZXMgb2YgdGhlCi0gIFxjb2Rle2ZlYXR1cmVfZXh0ZXJuYWxfZ2VzfSBhbmQgdGhlCi0gIFxjb2Rle2ZlYXR1cmVfZXh0ZXJuYWxfcGVzfSBwcm9wZXJ0aWVzLgotXGVuZHttZXRob2RkZXNjfQotCi0KLVxzdWJzZWN0aW9ue0RUREhhbmRsZXIgT2JqZWN0cyBcbGFiZWx7ZHRkLWhhbmRsZXItb2JqZWN0c319Ci0KLVxjbGFzc3tEVERIYW5kbGVyfSBpbnN0YW5jZXMgcHJvdmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtEVERIYW5kbGVyXXtub3RhdGlvbkRlY2x9e25hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZH0KLSAgSGFuZGxlIGEgbm90YXRpb24gZGVjbGFyYXRpb24gZXZlbnQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtEVERIYW5kbGVyXXt1bnBhcnNlZEVudGl0eURlY2x9e25hbWUsIHB1YmxpY0lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtSWQsIG5kYXRhfQotICBIYW5kbGUgYW4gdW5wYXJzZWQgZW50aXR5IGRlY2xhcmF0aW9uIGV2ZW50LgotXGVuZHttZXRob2RkZXNjfQotCi0KLVxzdWJzZWN0aW9ue0VudGl0eVJlc29sdmVyIE9iamVjdHMgXGxhYmVse2VudGl0eS1yZXNvbHZlci1vYmplY3RzfX0KLQotXGJlZ2lue21ldGhvZGRlc2N9W0VudGl0eVJlc29sdmVyXXtyZXNvbHZlRW50aXR5fXtwdWJsaWNJZCwgc3lzdGVtSWR9Ci0gIFJlc29sdmUgdGhlIHN5c3RlbSBpZGVudGlmaWVyIG9mIGFuIGVudGl0eSBhbmQgcmV0dXJuIGVpdGhlciB0aGUKLSAgc3lzdGVtIGlkZW50aWZpZXIgdG8gcmVhZCBmcm9tIGFzIGEgc3RyaW5nLCBvciBhbiBJbnB1dFNvdXJjZSB0bwotICByZWFkIGZyb20uIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgXHZhcntzeXN0ZW1JZH0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLQotXHN1YnNlY3Rpb257RXJyb3JIYW5kbGVyIE9iamVjdHMgXGxhYmVse3NheC1lcnJvci1oYW5kbGVyfX0KLQotT2JqZWN0cyB3aXRoIHRoaXMgaW50ZXJmYWNlIGFyZSB1c2VkIHRvIHJlY2VpdmUgZXJyb3IgYW5kIHdhcm5pbmcKLWluZm9ybWF0aW9uIGZyb20gdGhlIFxjbGFzc3tYTUxSZWFkZXJ9LiAgSWYgeW91IGNyZWF0ZSBhbiBvYmplY3QgdGhhdAotaW1wbGVtZW50cyB0aGlzIGludGVyZmFjZSwgdGhlbiByZWdpc3RlciB0aGUgb2JqZWN0IHdpdGggeW91cgotXGNsYXNze1hNTFJlYWRlcn0sIHRoZSBwYXJzZXIgd2lsbCBjYWxsIHRoZSBtZXRob2RzIGluIHlvdXIgb2JqZWN0IHRvCi1yZXBvcnQgYWxsIHdhcm5pbmdzIGFuZCBlcnJvcnMuIFRoZXJlIGFyZSB0aHJlZSBsZXZlbHMgb2YgZXJyb3JzCi1hdmFpbGFibGU6IHdhcm5pbmdzLCAocG9zc2libHkpIHJlY292ZXJhYmxlIGVycm9ycywgYW5kIHVucmVjb3ZlcmFibGUKLWVycm9ycy4gIEFsbCBtZXRob2RzIHRha2UgYSBcZXhjZXB0aW9ue1NBWFBhcnNlRXhjZXB0aW9ufSBhcyB0aGUgb25seQotcGFyYW1ldGVyLiAgRXJyb3JzIGFuZCB3YXJuaW5ncyBtYXkgYmUgY29udmVydGVkIHRvIGFuIGV4Y2VwdGlvbiBieQotcmFpc2luZyB0aGUgcGFzc2VkLWluIGV4Y2VwdGlvbiBvYmplY3QuCi0KLVxiZWdpbnttZXRob2RkZXNjfVtFcnJvckhhbmRsZXJde2Vycm9yfXtleGNlcHRpb259Ci0gIENhbGxlZCB3aGVuIHRoZSBwYXJzZXIgZW5jb3VudGVycyBhIHJlY292ZXJhYmxlIGVycm9yLiAgSWYgdGhpcyBtZXRob2QKLSAgZG9lcyBub3QgcmFpc2UgYW4gZXhjZXB0aW9uLCBwYXJzaW5nIG1heSBjb250aW51ZSwgYnV0IGZ1cnRoZXIgZG9jdW1lbnQKLSAgaW5mb3JtYXRpb24gc2hvdWxkIG5vdCBiZSBleHBlY3RlZCBieSB0aGUgYXBwbGljYXRpb24uICBBbGxvd2luZyB0aGUKLSAgcGFyc2VyIHRvIGNvbnRpbnVlIG1heSBhbGxvdyBhZGRpdGlvbmFsIGVycm9ycyB0byBiZSBkaXNjb3ZlcmVkIGluIHRoZQotICBpbnB1dCBkb2N1bWVudC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0Vycm9ySGFuZGxlcl17ZmF0YWxFcnJvcn17ZXhjZXB0aW9ufQotICBDYWxsZWQgd2hlbiB0aGUgcGFyc2VyIGVuY291bnRlcnMgYW4gZXJyb3IgaXQgY2Fubm90IHJlY292ZXIgZnJvbTsKLSAgcGFyc2luZyBpcyBleHBlY3RlZCB0byB0ZXJtaW5hdGUgd2hlbiB0aGlzIG1ldGhvZCByZXR1cm5zLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bRXJyb3JIYW5kbGVyXXt3YXJuaW5nfXtleGNlcHRpb259Ci0gIENhbGxlZCB3aGVuIHRoZSBwYXJzZXIgcHJlc2VudHMgbWlub3Igd2FybmluZyBpbmZvcm1hdGlvbiB0byB0aGUKLSAgYXBwbGljYXRpb24uICBQYXJzaW5nIGlzIGV4cGVjdGVkIHRvIGNvbnRpbnVlIHdoZW4gdGhpcyBtZXRob2QgcmV0dXJucywKLSAgYW5kIGRvY3VtZW50IGluZm9ybWF0aW9uIHdpbGwgY29udGludWUgdG8gYmUgcGFzc2VkIHRvIHRoZSBhcHBsaWNhdGlvbi4KLSAgUmFpc2luZyBhbiBleGNlcHRpb24gaW4gdGhpcyBtZXRob2Qgd2lsbCBjYXVzZSBwYXJzaW5nIHRvIGVuZC4KLVxlbmR7bWV0aG9kZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIveG1sc2F4cmVhZGVyLnRleCBiL0RvYy9saWIveG1sc2F4cmVhZGVyLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY2OTU4MS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL3htbHNheHJlYWRlci50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwzNTEgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXt4bWwuc2F4LnhtbHJlYWRlcn0gLS0tCi0gICAgICAgICBJbnRlcmZhY2UgZm9yIFhNTCBwYXJzZXJzfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17eG1sLnNheC54bWxyZWFkZXJ9Ci1cbW9kdWxlc3lub3BzaXN7SW50ZXJmYWNlIHdoaWNoIFNBWC1jb21wbGlhbnQgWE1MIHBhcnNlcnMgbXVzdCBpbXBsZW1lbnQufQotXHNlY3Rpb25hdXRob3J7TWFydGluIHYuIExcIm93aXN9e21hcnRpbkB2LmxvZXdpcy5kZX0KLVxtb2R1bGVhdXRob3J7TGFycyBNYXJpdXMgR2Fyc2hvbH17bGFyc2dhQGdhcnNob2wucHJpdi5ub30KLQotXHZlcnNpb25hZGRlZHsyLjB9Ci0KLQotU0FYIHBhcnNlcnMgaW1wbGVtZW50IHRoZSBcY2xhc3N7WE1MUmVhZGVyfSBpbnRlcmZhY2UuIFRoZXkgYXJlCi1pbXBsZW1lbnRlZCBpbiBhIFB5dGhvbiBtb2R1bGUsIHdoaWNoIG11c3QgcHJvdmlkZSBhIGZ1bmN0aW9uCi1cZnVuY3Rpb257Y3JlYXRlX3BhcnNlcigpfS4gVGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIGJ5IAotXGZ1bmN0aW9ue3htbC5zYXgubWFrZV9wYXJzZXIoKX0gd2l0aCBubyBhcmd1bWVudHMgdG8gY3JlYXRlIGEgbmV3IAotcGFyc2VyIG9iamVjdC4KLQotXGJlZ2lue2NsYXNzZGVzY317WE1MUmVhZGVyfXt9Ci0gIEJhc2UgY2xhc3Mgd2hpY2ggY2FuIGJlIGluaGVyaXRlZCBieSBTQVggcGFyc2Vycy4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtJbmNyZW1lbnRhbFBhcnNlcn17fQotICBJbiBzb21lIGNhc2VzLCBpdCBpcyBkZXNpcmFibGUgbm90IHRvIHBhcnNlIGFuIGlucHV0IHNvdXJjZSBhdCBvbmNlLAotICBidXQgdG8gZmVlZCBjaHVua3Mgb2YgdGhlIGRvY3VtZW50IGFzIHRoZXkgZ2V0IGF2YWlsYWJsZS4gTm90ZSB0aGF0Ci0gIHRoZSByZWFkZXIgd2lsbCBub3JtYWxseSBub3QgcmVhZCB0aGUgZW50aXJlIGZpbGUsIGJ1dCByZWFkIGl0IGluCi0gIGNodW5rcyBhcyB3ZWxsOyBzdGlsbCBcbWV0aG9ke3BhcnNlKCl9IHdvbid0IHJldHVybiB1bnRpbCB0aGUgZW50aXJlCi0gIGRvY3VtZW50IGlzIHByb2Nlc3NlZC4gU28gdGhlc2UgaW50ZXJmYWNlcyBzaG91bGQgYmUgdXNlZCBpZiB0aGUKLSAgYmxvY2tpbmcgYmVoYXZpb3VyIG9mIFxtZXRob2R7cGFyc2UoKX0gaXMgbm90IGRlc2lyYWJsZS4KLQotICBXaGVuIHRoZSBwYXJzZXIgaXMgaW5zdGFudGlhdGVkIGl0IGlzIHJlYWR5IHRvIGJlZ2luIGFjY2VwdGluZyBkYXRhCi0gIGZyb20gdGhlIGZlZWQgbWV0aG9kIGltbWVkaWF0ZWx5LiBBZnRlciBwYXJzaW5nIGhhcyBiZWVuIGZpbmlzaGVkCi0gIHdpdGggYSBjYWxsIHRvIGNsb3NlIHRoZSByZXNldCBtZXRob2QgbXVzdCBiZSBjYWxsZWQgdG8gbWFrZSB0aGUKLSAgcGFyc2VyIHJlYWR5IHRvIGFjY2VwdCBuZXcgZGF0YSwgZWl0aGVyIGZyb20gZmVlZCBvciB1c2luZyB0aGUgcGFyc2UKLSAgbWV0aG9kLgotCi0gIE5vdGUgdGhhdCB0aGVzZSBtZXRob2RzIG11c3QgXGVtcGh7bm90fSBiZSBjYWxsZWQgZHVyaW5nIHBhcnNpbmcsCi0gIHRoYXQgaXMsIGFmdGVyIHBhcnNlIGhhcyBiZWVuIGNhbGxlZCBhbmQgYmVmb3JlIGl0IHJldHVybnMuCi0KLSAgQnkgZGVmYXVsdCwgdGhlIGNsYXNzIGFsc28gaW1wbGVtZW50cyB0aGUgcGFyc2UgbWV0aG9kIG9mIHRoZQotICBYTUxSZWFkZXIgaW50ZXJmYWNlIHVzaW5nIHRoZSBmZWVkLCBjbG9zZSBhbmQgcmVzZXQgbWV0aG9kcyBvZiB0aGUKLSAgSW5jcmVtZW50YWxQYXJzZXIgaW50ZXJmYWNlIGFzIGEgY29udmVuaWVuY2UgdG8gU0FYIDIuMCBkcml2ZXIKLSAgd3JpdGVycy4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtMb2NhdG9yfXt9Ci0gIEludGVyZmFjZSBmb3IgYXNzb2NpYXRpbmcgYSBTQVggZXZlbnQgd2l0aCBhIGRvY3VtZW50IGxvY2F0aW9uLiBBCi0gIGxvY2F0b3Igb2JqZWN0IHdpbGwgcmV0dXJuIHZhbGlkIHJlc3VsdHMgb25seSBkdXJpbmcgY2FsbHMgdG8KLSAgRG9jdW1lbnRIYW5kbGVyIG1ldGhvZHM7IGF0IGFueSBvdGhlciB0aW1lLCB0aGUgcmVzdWx0cyBhcmUKLSAgdW5wcmVkaWN0YWJsZS4gSWYgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSwgbWV0aG9kcyBtYXkgcmV0dXJuCi0gIFxjb2Rle05vbmV9LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0lucHV0U291cmNlfXtcb3B0aW9uYWx7c3lzdGVtSWR9fQotICBFbmNhcHN1bGF0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgYnkgdGhlIFxjbGFzc3tYTUxSZWFkZXJ9IHRvCi0gIHJlYWQgZW50aXRpZXMuCi0KLSAgVGhpcyBjbGFzcyBtYXkgaW5jbHVkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHVibGljIGlkZW50aWZpZXIsCi0gIHN5c3RlbSBpZGVudGlmaWVyLCBieXRlIHN0cmVhbSAocG9zc2libHkgd2l0aCBjaGFyYWN0ZXIgZW5jb2RpbmcKLSAgaW5mb3JtYXRpb24pIGFuZC9vciB0aGUgY2hhcmFjdGVyIHN0cmVhbSBvZiBhbiBlbnRpdHkuCi0KLSAgQXBwbGljYXRpb25zIHdpbGwgY3JlYXRlIG9iamVjdHMgb2YgdGhpcyBjbGFzcyBmb3IgdXNlIGluIHRoZQotICBcbWV0aG9ke1hNTFJlYWRlci5wYXJzZSgpfSBtZXRob2QgYW5kIGZvciByZXR1cm5pbmcgZnJvbQotICBFbnRpdHlSZXNvbHZlci5yZXNvbHZlRW50aXR5LgotCi0gIEFuIFxjbGFzc3tJbnB1dFNvdXJjZX0gYmVsb25ncyB0byB0aGUgYXBwbGljYXRpb24sIHRoZQotICBcY2xhc3N7WE1MUmVhZGVyfSBpcyBub3QgYWxsb3dlZCB0byBtb2RpZnkgXGNsYXNze0lucHV0U291cmNlfSBvYmplY3RzCi0gIHBhc3NlZCB0byBpdCBmcm9tIHRoZSBhcHBsaWNhdGlvbiwgYWx0aG91Z2ggaXQgbWF5IG1ha2UgY29waWVzIGFuZAotICBtb2RpZnkgdGhvc2UuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317QXR0cmlidXRlc0ltcGx9e2F0dHJzfQotICBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBcdWxpbmt7XGNsYXNze0F0dHJpYnV0ZXN9Ci0gIGludGVyZmFjZX17YXR0cmlidXRlcy1vYmplY3RzLmh0bWx9IChzZWUKLSAgc2VjdGlvbn5ccmVme2F0dHJpYnV0ZXMtb2JqZWN0c30pLiAgVGhpcyBpcyBhIGRpY3Rpb25hcnktbGlrZQotICBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGUgZWxlbWVudCBhdHRyaWJ1dGVzIGluIGEKLSAgXG1ldGhvZHtzdGFydEVsZW1lbnQoKX0gY2FsbC4gSW4gYWRkaXRpb24gdG8gdGhlIG1vc3QgdXNlZnVsCi0gIGRpY3Rpb25hcnkgb3BlcmF0aW9ucywgaXQgc3VwcG9ydHMgYSBudW1iZXIgb2Ygb3RoZXIgbWV0aG9kcyBhcwotICBkZXNjcmliZWQgYnkgdGhlIGludGVyZmFjZS4gT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHNob3VsZCBiZQotICBpbnN0YW50aWF0ZWQgYnkgcmVhZGVyczsgXHZhcnthdHRyc30gbXVzdCBiZSBhIGRpY3Rpb25hcnktbGlrZQotICBvYmplY3QgY29udGFpbmluZyBhIG1hcHBpbmcgZnJvbSBhdHRyaWJ1dGUgbmFtZXMgdG8gYXR0cmlidXRlCi0gIHZhbHVlcy4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtBdHRyaWJ1dGVzTlNJbXBsfXthdHRycywgcW5hbWVzfQotICBOYW1lc3BhY2UtYXdhcmUgdmFyaWFudCBvZiBcY2xhc3N7QXR0cmlidXRlc0ltcGx9LCB3aGljaCB3aWxsIGJlCi0gIHBhc3NlZCB0byBcbWV0aG9ke3N0YXJ0RWxlbWVudE5TKCl9LiBJdCBpcyBkZXJpdmVkIGZyb20KLSAgXGNsYXNze0F0dHJpYnV0ZXNJbXBsfSwgYnV0IHVuZGVyc3RhbmRzIGF0dHJpYnV0ZSBuYW1lcyBhcwotICB0d28tdHVwbGVzIG9mIFx2YXJ7bmFtZXNwYWNlVVJJfSBhbmQgXHZhcntsb2NhbG5hbWV9LiBJbiBhZGRpdGlvbiwKLSAgaXQgcHJvdmlkZXMgYSBudW1iZXIgb2YgbWV0aG9kcyBleHBlY3RpbmcgcXVhbGlmaWVkIG5hbWVzIGFzIHRoZXkKLSAgYXBwZWFyIGluIHRoZSBvcmlnaW5hbCBkb2N1bWVudC4gIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUKLSAgXHVsaW5re1xjbGFzc3tBdHRyaWJ1dGVzTlN9IGludGVyZmFjZX17YXR0cmlidXRlcy1ucy1vYmplY3RzLmh0bWx9Ci0gIChzZWUgc2VjdGlvbn5ccmVme2F0dHJpYnV0ZXMtbnMtb2JqZWN0c30pLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLQotXHN1YnNlY3Rpb257WE1MUmVhZGVyIE9iamVjdHMgXGxhYmVse3htbHJlYWRlci1vYmplY3RzfX0KLQotVGhlIFxjbGFzc3tYTUxSZWFkZXJ9IGludGVyZmFjZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtYTUxSZWFkZXJde3BhcnNlfXtzb3VyY2V9Ci0gIFByb2Nlc3MgYW4gaW5wdXQgc291cmNlLCBwcm9kdWNpbmcgU0FYIGV2ZW50cy4gVGhlIFx2YXJ7c291cmNlfQotICBvYmplY3QgY2FuIGJlIGEgc3lzdGVtIGlkZW50aWZpZXIgKGEgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZQotICBpbnB1dCBzb3VyY2UgLS0gdHlwaWNhbGx5IGEgZmlsZSBuYW1lIG9yIGFuIFVSTCksIGEgZmlsZS1saWtlCi0gIG9iamVjdCwgb3IgYW4gXGNsYXNze0lucHV0U291cmNlfSBvYmplY3QuIFdoZW4gXG1ldGhvZHtwYXJzZSgpfQotICByZXR1cm5zLCB0aGUgaW5wdXQgaXMgY29tcGxldGVseSBwcm9jZXNzZWQsIGFuZCB0aGUgcGFyc2VyIG9iamVjdAotICBjYW4gYmUgZGlzY2FyZGVkIG9yIHJlc2V0LiBBcyBhIGxpbWl0YXRpb24sIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uCi0gIG9ubHkgYWNjZXB0cyBieXRlIHN0cmVhbXM7IHByb2Nlc3Npbmcgb2YgY2hhcmFjdGVyIHN0cmVhbXMgaXMgZm9yCi0gIGZ1cnRoZXIgc3R1ZHkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtYTUxSZWFkZXJde2dldENvbnRlbnRIYW5kbGVyfXt9Ci0gIFJldHVybiB0aGUgY3VycmVudCBcY2xhc3N7Q29udGVudEhhbmRsZXJ9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bWE1MUmVhZGVyXXtzZXRDb250ZW50SGFuZGxlcn17aGFuZGxlcn0KLSAgU2V0IHRoZSBjdXJyZW50IFxjbGFzc3tDb250ZW50SGFuZGxlcn0uICBJZiBubwotICBcY2xhc3N7Q29udGVudEhhbmRsZXJ9IGlzIHNldCwgY29udGVudCBldmVudHMgd2lsbCBiZSBkaXNjYXJkZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtYTUxSZWFkZXJde2dldERUREhhbmRsZXJ9e30KLSAgUmV0dXJuIHRoZSBjdXJyZW50IFxjbGFzc3tEVERIYW5kbGVyfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1hNTFJlYWRlcl17c2V0RFRESGFuZGxlcn17aGFuZGxlcn0KLSAgU2V0IHRoZSBjdXJyZW50IFxjbGFzc3tEVERIYW5kbGVyfS4gIElmIG5vIFxjbGFzc3tEVERIYW5kbGVyfSBpcwotICBzZXQsIERURCBldmVudHMgd2lsbCBiZSBkaXNjYXJkZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtYTUxSZWFkZXJde2dldEVudGl0eVJlc29sdmVyfXt9Ci0gIFJldHVybiB0aGUgY3VycmVudCBcY2xhc3N7RW50aXR5UmVzb2x2ZXJ9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bWE1MUmVhZGVyXXtzZXRFbnRpdHlSZXNvbHZlcn17aGFuZGxlcn0KLSAgU2V0IHRoZSBjdXJyZW50IFxjbGFzc3tFbnRpdHlSZXNvbHZlcn0uICBJZiBubwotICBcY2xhc3N7RW50aXR5UmVzb2x2ZXJ9IGlzIHNldCwgYXR0ZW1wdHMgdG8gcmVzb2x2ZSBhbiBleHRlcm5hbAotICBlbnRpdHkgd2lsbCByZXN1bHQgaW4gb3BlbmluZyB0aGUgc3lzdGVtIGlkZW50aWZpZXIgZm9yIHRoZSBlbnRpdHksCi0gIGFuZCBmYWlsIGlmIGl0IGlzIG5vdCBhdmFpbGFibGUuIAotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bWE1MUmVhZGVyXXtnZXRFcnJvckhhbmRsZXJ9e30KLSAgUmV0dXJuIHRoZSBjdXJyZW50IFxjbGFzc3tFcnJvckhhbmRsZXJ9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bWE1MUmVhZGVyXXtzZXRFcnJvckhhbmRsZXJ9e2hhbmRsZXJ9Ci0gIFNldCB0aGUgY3VycmVudCBlcnJvciBoYW5kbGVyLiAgSWYgbm8gXGNsYXNze0Vycm9ySGFuZGxlcn0gaXMgc2V0LAotICBlcnJvcnMgd2lsbCBiZSByYWlzZWQgYXMgZXhjZXB0aW9ucywgYW5kIHdhcm5pbmdzIHdpbGwgYmUgcHJpbnRlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1hNTFJlYWRlcl17c2V0TG9jYWxlfXtsb2NhbGV9Ci0gIEFsbG93IGFuIGFwcGxpY2F0aW9uIHRvIHNldCB0aGUgbG9jYWxlIGZvciBlcnJvcnMgYW5kIHdhcm5pbmdzLiAKLSAgIAotICBTQVggcGFyc2VycyBhcmUgbm90IHJlcXVpcmVkIHRvIHByb3ZpZGUgbG9jYWxpemF0aW9uIGZvciBlcnJvcnMgYW5kCi0gIHdhcm5pbmdzOyBpZiB0aGV5IGNhbm5vdCBzdXBwb3J0IHRoZSByZXF1ZXN0ZWQgbG9jYWxlLCBob3dldmVyLCB0aGV5Ci0gIG11c3QgdGhyb3cgYSBTQVggZXhjZXB0aW9uLiAgQXBwbGljYXRpb25zIG1heSByZXF1ZXN0IGEgbG9jYWxlIGNoYW5nZQotICBpbiB0aGUgbWlkZGxlIG9mIGEgcGFyc2UuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtYTUxSZWFkZXJde2dldEZlYXR1cmV9e2ZlYXR1cmVuYW1lfQotICBSZXR1cm4gdGhlIGN1cnJlbnQgc2V0dGluZyBmb3IgZmVhdHVyZSBcdmFye2ZlYXR1cmVuYW1lfS4gIElmIHRoZQotICBmZWF0dXJlIGlzIG5vdCByZWNvZ25pemVkLCBcZXhjZXB0aW9ue1NBWE5vdFJlY29nbml6ZWRFeGNlcHRpb259IGlzCi0gIHJhaXNlZC4gVGhlIHdlbGwta25vd24gZmVhdHVyZW5hbWVzIGFyZSBsaXN0ZWQgaW4gdGhlIG1vZHVsZQotICBcbW9kdWxle3htbC5zYXguaGFuZGxlcn0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtYTUxSZWFkZXJde3NldEZlYXR1cmV9e2ZlYXR1cmVuYW1lLCB2YWx1ZX0KLSAgU2V0IHRoZSBcdmFye2ZlYXR1cmVuYW1lfSB0byBcdmFye3ZhbHVlfS4gSWYgdGhlIGZlYXR1cmUgaXMgbm90Ci0gIHJlY29nbml6ZWQsIFxleGNlcHRpb257U0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbn0gaXMgcmFpc2VkLiBJZiB0aGUKLSAgZmVhdHVyZSBvciBpdHMgc2V0dGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBwYXJzZXIsCi0gIFx2YXJ7U0FYTm90U3VwcG9ydGVkRXhjZXB0aW9ufSBpcyByYWlzZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtYTUxSZWFkZXJde2dldFByb3BlcnR5fXtwcm9wZXJ0eW5hbWV9Ci0gIFJldHVybiB0aGUgY3VycmVudCBzZXR0aW5nIGZvciBwcm9wZXJ0eSBcdmFye3Byb3BlcnR5bmFtZX0uIElmIHRoZQotICBwcm9wZXJ0eSBpcyBub3QgcmVjb2duaXplZCwgYSBcZXhjZXB0aW9ue1NBWE5vdFJlY29nbml6ZWRFeGNlcHRpb259Ci0gIGlzIHJhaXNlZC4gVGhlIHdlbGwta25vd24gcHJvcGVydHluYW1lcyBhcmUgbGlzdGVkIGluIHRoZSBtb2R1bGUKLSAgXG1vZHVsZXt4bWwuc2F4LmhhbmRsZXJ9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bWE1MUmVhZGVyXXtzZXRQcm9wZXJ0eX17cHJvcGVydHluYW1lLCB2YWx1ZX0KLSAgU2V0IHRoZSBcdmFye3Byb3BlcnR5bmFtZX0gdG8gXHZhcnt2YWx1ZX0uIElmIHRoZSBwcm9wZXJ0eSBpcyBub3QKLSAgcmVjb2duaXplZCwgXGV4Y2VwdGlvbntTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9ufSBpcyByYWlzZWQuIElmIHRoZQotICBwcm9wZXJ0eSBvciBpdHMgc2V0dGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBwYXJzZXIsCi0gIFx2YXJ7U0FYTm90U3VwcG9ydGVkRXhjZXB0aW9ufSBpcyByYWlzZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLQotXHN1YnNlY3Rpb257SW5jcmVtZW50YWxQYXJzZXIgT2JqZWN0cwotICAgICAgICAgICAgXGxhYmVse2luY3JlbWVudGFsLXBhcnNlci1vYmplY3RzfX0KLQotSW5zdGFuY2VzIG9mIFxjbGFzc3tJbmNyZW1lbnRhbFBhcnNlcn0gb2ZmZXIgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsCi1tZXRob2RzOgotCi1cYmVnaW57bWV0aG9kZGVzY31bSW5jcmVtZW50YWxQYXJzZXJde2ZlZWR9e2RhdGF9Ci0gIFByb2Nlc3MgYSBjaHVuayBvZiBcdmFye2RhdGF9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSW5jcmVtZW50YWxQYXJzZXJde2Nsb3NlfXt9Ci0gIEFzc3VtZSB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC4gVGhhdCB3aWxsIGNoZWNrIHdlbGwtZm9ybWVkbmVzcwotICBjb25kaXRpb25zIHRoYXQgY2FuIGJlIGNoZWNrZWQgb25seSBhdCB0aGUgZW5kLCBpbnZva2UgaGFuZGxlcnMsIGFuZAotICBtYXkgY2xlYW4gdXAgcmVzb3VyY2VzIGFsbG9jYXRlZCBkdXJpbmcgcGFyc2luZy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0luY3JlbWVudGFsUGFyc2VyXXtyZXNldH17fQotICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgY2xvc2UgaGFzIGJlZW4gY2FsbGVkIHRvIHJlc2V0IHRoZQotICBwYXJzZXIgc28gdGhhdCBpdCBpcyByZWFkeSB0byBwYXJzZSBuZXcgZG9jdW1lbnRzLiBUaGUgcmVzdWx0cyBvZgotICBjYWxsaW5nIHBhcnNlIG9yIGZlZWQgYWZ0ZXIgY2xvc2Ugd2l0aG91dCBjYWxsaW5nIHJlc2V0IGFyZQotICB1bmRlZmluZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLQotXHN1YnNlY3Rpb257TG9jYXRvciBPYmplY3RzIFxsYWJlbHtsb2NhdG9yLW9iamVjdHN9fQotCi1JbnN0YW5jZXMgb2YgXGNsYXNze0xvY2F0b3J9IHByb3ZpZGUgdGhlc2UgbWV0aG9kczoKLQotXGJlZ2lue21ldGhvZGRlc2N9W0xvY2F0b3Jde2dldENvbHVtbk51bWJlcn17fQotICBSZXR1cm4gdGhlIGNvbHVtbiBudW1iZXIgd2hlcmUgdGhlIGN1cnJlbnQgZXZlbnQgZW5kcy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0xvY2F0b3Jde2dldExpbmVOdW1iZXJ9e30KLSAgUmV0dXJuIHRoZSBsaW5lIG51bWJlciB3aGVyZSB0aGUgY3VycmVudCBldmVudCBlbmRzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTG9jYXRvcl17Z2V0UHVibGljSWR9e30KLSAgUmV0dXJuIHRoZSBwdWJsaWMgaWRlbnRpZmllciBmb3IgdGhlIGN1cnJlbnQgZXZlbnQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtMb2NhdG9yXXtnZXRTeXN0ZW1JZH17fQotICBSZXR1cm4gdGhlIHN5c3RlbSBpZGVudGlmaWVyIGZvciB0aGUgY3VycmVudCBldmVudC4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cc3Vic2VjdGlvbntJbnB1dFNvdXJjZSBPYmplY3RzIFxsYWJlbHtpbnB1dC1zb3VyY2Utb2JqZWN0c319Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtJbnB1dFNvdXJjZV17c2V0UHVibGljSWR9e2lkfQotICBTZXRzIHRoZSBwdWJsaWMgaWRlbnRpZmllciBvZiB0aGlzIFxjbGFzc3tJbnB1dFNvdXJjZX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtJbnB1dFNvdXJjZV17Z2V0UHVibGljSWR9e30KLSAgUmV0dXJucyB0aGUgcHVibGljIGlkZW50aWZpZXIgb2YgdGhpcyBcY2xhc3N7SW5wdXRTb3VyY2V9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSW5wdXRTb3VyY2Vde3NldFN5c3RlbUlkfXtpZH0KLSAgU2V0cyB0aGUgc3lzdGVtIGlkZW50aWZpZXIgb2YgdGhpcyBcY2xhc3N7SW5wdXRTb3VyY2V9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSW5wdXRTb3VyY2Vde2dldFN5c3RlbUlkfXt9Ci0gIFJldHVybnMgdGhlIHN5c3RlbSBpZGVudGlmaWVyIG9mIHRoaXMgXGNsYXNze0lucHV0U291cmNlfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0lucHV0U291cmNlXXtzZXRFbmNvZGluZ317ZW5jb2Rpbmd9Ci0gIFNldHMgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBvZiB0aGlzIFxjbGFzc3tJbnB1dFNvdXJjZX0uCi0KLSAgVGhlIGVuY29kaW5nIG11c3QgYmUgYSBzdHJpbmcgYWNjZXB0YWJsZSBmb3IgYW4gWE1MIGVuY29kaW5nCi0gIGRlY2xhcmF0aW9uIChzZWUgc2VjdGlvbiA0LjMuMyBvZiB0aGUgWE1MIHJlY29tbWVuZGF0aW9uKS4KLSAKLSAgVGhlIGVuY29kaW5nIGF0dHJpYnV0ZSBvZiB0aGUgXGNsYXNze0lucHV0U291cmNlfSBpcyBpZ25vcmVkIGlmIHRoZQotICBcY2xhc3N7SW5wdXRTb3VyY2V9IGFsc28gY29udGFpbnMgYSBjaGFyYWN0ZXIgc3RyZWFtLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSW5wdXRTb3VyY2Vde2dldEVuY29kaW5nfXt9Ci0gIEdldCB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIG9mIHRoaXMgSW5wdXRTb3VyY2UuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtJbnB1dFNvdXJjZV17c2V0Qnl0ZVN0cmVhbX17Ynl0ZWZpbGV9Ci0gIFNldCB0aGUgYnl0ZSBzdHJlYW0gKGEgUHl0aG9uIGZpbGUtbGlrZSBvYmplY3Qgd2hpY2ggZG9lcyBub3QKLSAgcGVyZm9ybSBieXRlLXRvLWNoYXJhY3RlciBjb252ZXJzaW9uKSBmb3IgdGhpcyBpbnB1dCBzb3VyY2UuCi0gIAotICBUaGUgU0FYIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIGlmIHRoZXJlIGlzIGFsc28gYSBjaGFyYWN0ZXIgc3RyZWFtCi0gIHNwZWNpZmllZCwgYnV0IGl0IHdpbGwgdXNlIGEgYnl0ZSBzdHJlYW0gaW4gcHJlZmVyZW5jZSB0byBvcGVuaW5nIGEKLSAgVVJJIGNvbm5lY3Rpb24gaXRzZWxmLgotICAKLSAgSWYgdGhlIGFwcGxpY2F0aW9uIGtub3dzIHRoZSBjaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgdGhlIGJ5dGUgc3RyZWFtLAotICBpdCBzaG91bGQgc2V0IGl0IHdpdGggdGhlIHNldEVuY29kaW5nIG1ldGhvZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0lucHV0U291cmNlXXtnZXRCeXRlU3RyZWFtfXt9Ci0gIEdldCB0aGUgYnl0ZSBzdHJlYW0gZm9yIHRoaXMgaW5wdXQgc291cmNlLgotICAgICAgICAKLSAgVGhlIGdldEVuY29kaW5nIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIGZvciB0aGlzCi0gIGJ5dGUgc3RyZWFtLCBvciBOb25lIGlmIHVua25vd24uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtJbnB1dFNvdXJjZV17c2V0Q2hhcmFjdGVyU3RyZWFtfXtjaGFyZmlsZX0KLSAgU2V0IHRoZSBjaGFyYWN0ZXIgc3RyZWFtIGZvciB0aGlzIGlucHV0IHNvdXJjZS4gKFRoZSBzdHJlYW0gbXVzdCBiZQotICBhIFB5dGhvbiAxLjYgVW5pY29kZS13cmFwcGVkIGZpbGUtbGlrZSB0aGF0IHBlcmZvcm1zIGNvbnZlcnNpb24gdG8KLSAgVW5pY29kZSBzdHJpbmdzLikKLSAgCi0gIElmIHRoZXJlIGlzIGEgY2hhcmFjdGVyIHN0cmVhbSBzcGVjaWZpZWQsIHRoZSBTQVggcGFyc2VyIHdpbGwgaWdub3JlCi0gIGFueSBieXRlIHN0cmVhbSBhbmQgd2lsbCBub3QgYXR0ZW1wdCB0byBvcGVuIGEgVVJJIGNvbm5lY3Rpb24gdG8gdGhlCi0gIHN5c3RlbSBpZGVudGlmaWVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSW5wdXRTb3VyY2Vde2dldENoYXJhY3RlclN0cmVhbX17fQotICBHZXQgdGhlIGNoYXJhY3RlciBzdHJlYW0gZm9yIHRoaXMgaW5wdXQgc291cmNlLgotXGVuZHttZXRob2RkZXNjfQotCi0KLVxzdWJzZWN0aW9ue1RoZSBcY2xhc3N7QXR0cmlidXRlc30gSW50ZXJmYWNlIFxsYWJlbHthdHRyaWJ1dGVzLW9iamVjdHN9fQotCi1cY2xhc3N7QXR0cmlidXRlc30gb2JqZWN0cyBpbXBsZW1lbnQgYSBwb3J0aW9uIG9mIHRoZSBtYXBwaW5nCi1wcm90b2NvbCwgaW5jbHVkaW5nIHRoZSBtZXRob2RzIFxtZXRob2R7Y29weSgpfSwgXG1ldGhvZHtnZXQoKX0sCi1cbWV0aG9ke2hhc19rZXkoKX0sIFxtZXRob2R7aXRlbXMoKX0sIFxtZXRob2R7a2V5cygpfSwgYW5kCi1cbWV0aG9ke3ZhbHVlcygpfS4gIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgYWxzbyBwcm92aWRlZDoKLQotXGJlZ2lue21ldGhvZGRlc2N9W0F0dHJpYnV0ZXNde2dldExlbmd0aH17fQotICBSZXR1cm4gdGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQXR0cmlidXRlc117Z2V0TmFtZXN9e30KLSAgUmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgYXR0cmlidXRlcy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0F0dHJpYnV0ZXNde2dldFR5cGV9e25hbWV9Ci0gIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZSBcdmFye25hbWV9LCB3aGljaCBpcyBub3JtYWxseQotICBcY29kZXsnQ0RBVEEnfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0F0dHJpYnV0ZXNde2dldFZhbHVlfXtuYW1lfQotICBSZXR1cm4gdGhlIHZhbHVlIG9mIGF0dHJpYnV0ZSBcdmFye25hbWV9LgotXGVuZHttZXRob2RkZXNjfQotCi0lIGdldFZhbHVlQnlRTmFtZSwgZ2V0TmFtZUJ5UU5hbWUsIGdldFFOYW1lQnlOYW1lLCBnZXRRTmFtZXMgYXZhaWxhYmxlCi0lIGhlcmUgYWxyZWFkeSwgYnV0IGRvY3VtZW50ZWQgb25seSBmb3IgZGVyaXZlZCBjbGFzcy4KLQotCi1cc3Vic2VjdGlvbntUaGUgXGNsYXNze0F0dHJpYnV0ZXNOU30gSW50ZXJmYWNlIFxsYWJlbHthdHRyaWJ1dGVzLW5zLW9iamVjdHN9fQotCi1UaGlzIGludGVyZmFjZSBpcyBhIHN1YnR5cGUgb2YgdGhlIFx1bGlua3tcY2xhc3N7QXR0cmlidXRlc30KLWludGVyZmFjZX17YXR0cmlidXRlcy1vYmplY3RzLmh0bWx9IChzZWUKLXNlY3Rpb25+XHJlZnthdHRyaWJ1dGVzLW9iamVjdHN9KS4gIEFsbCBtZXRob2RzIHN1cHBvcnRlZCBieSB0aGF0Ci1pbnRlcmZhY2UgYXJlIGFsc28gYXZhaWxhYmxlIG9uIFxjbGFzc3tBdHRyaWJ1dGVzTlN9IG9iamVjdHMuCi0KLVRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgYWxzbyBhdmFpbGFibGU6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtBdHRyaWJ1dGVzTlNde2dldFZhbHVlQnlRTmFtZX17bmFtZX0KLSAgUmV0dXJuIHRoZSB2YWx1ZSBmb3IgYSBxdWFsaWZpZWQgbmFtZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0F0dHJpYnV0ZXNOU117Z2V0TmFtZUJ5UU5hbWV9e25hbWV9Ci0gIFJldHVybiB0aGUgXGNvZGV7KFx2YXJ7bmFtZXNwYWNlfSwgXHZhcntsb2NhbG5hbWV9KX0gcGFpciBmb3IgYQotICBxdWFsaWZpZWQgXHZhcntuYW1lfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0F0dHJpYnV0ZXNOU117Z2V0UU5hbWVCeU5hbWV9e25hbWV9Ci0gIFJldHVybiB0aGUgcXVhbGlmaWVkIG5hbWUgZm9yIGEgXGNvZGV7KFx2YXJ7bmFtZXNwYWNlfSwKLSAgXHZhcntsb2NhbG5hbWV9KX0gcGFpci4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0F0dHJpYnV0ZXNOU117Z2V0UU5hbWVzfXt9Ci0gIFJldHVybiB0aGUgcXVhbGlmaWVkIG5hbWVzIG9mIGFsbCBhdHRyaWJ1dGVzLgotXGVuZHttZXRob2RkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi94bWxzYXh1dGlscy50ZXggYi9Eb2MvbGliL3htbHNheHV0aWxzLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQyMjFmNS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL3htbHNheHV0aWxzLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7eG1sLnNheC5zYXh1dGlsc30gLS0tCi0gICAgICAgICBTQVggVXRpbGl0aWVzfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17eG1sLnNheC5zYXh1dGlsc30KLVxtb2R1bGVzeW5vcHNpc3tDb252ZW5pZW5jZSBmdW5jdGlvbnMgYW5kIGNsYXNzZXMgZm9yIHVzZSB3aXRoIFNBWC59Ci1cc2VjdGlvbmF1dGhvcntNYXJ0aW4gdi4gTFwib3dpc317bWFydGluQHYubG9ld2lzLmRlfQotXG1vZHVsZWF1dGhvcntMYXJzIE1hcml1cyBHYXJzaG9sfXtsYXJzZ2FAZ2Fyc2hvbC5wcml2Lm5vfQotCi1cdmVyc2lvbmFkZGVkezIuMH0KLQotCi1UaGUgbW9kdWxlIFxtb2R1bGV7eG1sLnNheC5zYXh1dGlsc30gY29udGFpbnMgYSBudW1iZXIgb2YgY2xhc3NlcyBhbmQKLWZ1bmN0aW9ucyB0aGF0IGFyZSBjb21tb25seSB1c2VmdWwgd2hlbiBjcmVhdGluZyBTQVggYXBwbGljYXRpb25zLAotZWl0aGVyIGluIGRpcmVjdCB1c2UsIG9yIGFzIGJhc2UgY2xhc3Nlcy4KLQotXGJlZ2lue2Z1bmNkZXNjfXtlc2NhcGV9e2RhdGFcb3B0aW9uYWx7LCBlbnRpdGllc319Ci0gIEVzY2FwZSBcY2hhcmFjdGVye1wmfSwgXGNoYXJhY3Rlcns8fSwgYW5kIFxjaGFyYWN0ZXJ7Pn0gaW4gYSBzdHJpbmcKLSAgb2YgZGF0YS4KLQotICBZb3UgY2FuIGVzY2FwZSBvdGhlciBzdHJpbmdzIG9mIGRhdGEgYnkgcGFzc2luZyBhIGRpY3Rpb25hcnkgYXMgdGhlCi0gIG9wdGlvbmFsIFx2YXJ7ZW50aXRpZXN9IHBhcmFtZXRlci4gIFRoZSBrZXlzIGFuZCB2YWx1ZXMgbXVzdCBhbGwgYmUKLSAgc3RyaW5nczsgZWFjaCBrZXkgd2lsbCBiZSByZXBsYWNlZCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIHZhbHVlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt1bmVzY2FwZX17ZGF0YVxvcHRpb25hbHssIGVudGl0aWVzfX0KLSAgVW5lc2NhcGUgXGNoYXJhY3RlcntcJmFtcDt9LCBcY2hhcmFjdGVye1wmbHQ7fSwgYW5kIFxjaGFyYWN0ZXJ7XCZndDt9Ci0gIGluIGEgc3RyaW5nIG9mIGRhdGEuCi0KLSAgWW91IGNhbiB1bmVzY2FwZSBvdGhlciBzdHJpbmdzIG9mIGRhdGEgYnkgcGFzc2luZyBhIGRpY3Rpb25hcnkgYXMgdGhlCi0gIG9wdGlvbmFsIFx2YXJ7ZW50aXRpZXN9IHBhcmFtZXRlci4gIFRoZSBrZXlzIGFuZCB2YWx1ZXMgbXVzdCBhbGwgYmUKLSAgc3RyaW5nczsgZWFjaCBrZXkgd2lsbCBiZSByZXBsYWNlZCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIHZhbHVlLgotCi0gIFx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtxdW90ZWF0dHJ9e2RhdGFcb3B0aW9uYWx7LCBlbnRpdGllc319Ci0gIFNpbWlsYXIgdG8gXGZ1bmN0aW9ue2VzY2FwZSgpfSwgYnV0IGFsc28gcHJlcGFyZXMgXHZhcntkYXRhfSB0byBiZQotICB1c2VkIGFzIGFuIGF0dHJpYnV0ZSB2YWx1ZS4gIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBxdW90ZWQgdmVyc2lvbiBvZgotICBcdmFye2RhdGF9IHdpdGggYW55IGFkZGl0aW9uYWwgcmVxdWlyZWQgcmVwbGFjZW1lbnRzLgotICBcZnVuY3Rpb257cXVvdGVhdHRyKCl9IHdpbGwgc2VsZWN0IGEgcXVvdGUgY2hhcmFjdGVyIGJhc2VkIG9uIHRoZQotICBjb250ZW50IG9mIFx2YXJ7ZGF0YX0sIGF0dGVtcHRpbmcgdG8gYXZvaWQgZW5jb2RpbmcgYW55IHF1b3RlCi0gIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZy4gIElmIGJvdGggc2luZ2xlLSBhbmQgZG91YmxlLXF1b3RlCi0gIGNoYXJhY3RlcnMgYXJlIGFscmVhZHkgaW4gXHZhcntkYXRhfSwgdGhlIGRvdWJsZS1xdW90ZSBjaGFyYWN0ZXJzCi0gIHdpbGwgYmUgZW5jb2RlZCBhbmQgXHZhcntkYXRhfSB3aWxsIGJlIHdyYXBwZWQgaW4gZG91YmxlLXF1b3Rlcy4gIFRoZQotICByZXN1bHRpbmcgc3RyaW5nIGNhbiBiZSB1c2VkIGRpcmVjdGx5IGFzIGFuIGF0dHJpYnV0ZSB2YWx1ZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHByaW50ICI8ZWxlbWVudCBhdHRyPSVzPiIgJSBxdW90ZWF0dHIoImFiICcgY2QgXCIgZWYiKQotPGVsZW1lbnQgYXR0cj0iYWIgJyBjZCAmcXVvdDsgZWYiPgotXGVuZHt2ZXJiYXRpbX0KLQotICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCB3aGVuIGdlbmVyYXRpbmcgYXR0cmlidXRlIHZhbHVlcyBmb3IgSFRNTCBvcgotICBhbnkgU0dNTCB1c2luZyB0aGUgcmVmZXJlbmNlIGNvbmNyZXRlIHN5bnRheC4KLSAgXHZlcnNpb25hZGRlZHsyLjJ9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtYTUxHZW5lcmF0b3J9e1xvcHRpb25hbHtvdXRcb3B0aW9uYWx7LCBlbmNvZGluZ319fQotICBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIFxjbGFzc3tDb250ZW50SGFuZGxlcn0gaW50ZXJmYWNlIGJ5Ci0gIHdyaXRpbmcgU0FYIGV2ZW50cyBiYWNrIGludG8gYW4gWE1MIGRvY3VtZW50LiBJbiBvdGhlciB3b3JkcywgdXNpbmcKLSAgYW4gXGNsYXNze1hNTEdlbmVyYXRvcn0gYXMgdGhlIGNvbnRlbnQgaGFuZGxlciB3aWxsIHJlcHJvZHVjZSB0aGUKLSAgb3JpZ2luYWwgZG9jdW1lbnQgYmVpbmcgcGFyc2VkLiBcdmFye291dH0gc2hvdWxkIGJlIGEgZmlsZS1saWtlCi0gIG9iamVjdCB3aGljaCB3aWxsIGRlZmF1bHQgdG8gXHZhcntzeXMuc3Rkb3V0fS4gXHZhcntlbmNvZGluZ30gaXMgdGhlCi0gIGVuY29kaW5nIG9mIHRoZSBvdXRwdXQgc3RyZWFtIHdoaWNoIGRlZmF1bHRzIHRvIFxjb2Rleydpc28tODg1OS0xJ30uCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317WE1MRmlsdGVyQmFzZX17YmFzZX0KLSAgVGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byBzaXQgYmV0d2VlbiBhbiBcY2xhc3N7WE1MUmVhZGVyfSBhbmQgdGhlCi0gIGNsaWVudCBhcHBsaWNhdGlvbidzIGV2ZW50IGhhbmRsZXJzLiAgQnkgZGVmYXVsdCwgaXQgZG9lcyBub3RoaW5nCi0gIGJ1dCBwYXNzIHJlcXVlc3RzIHVwIHRvIHRoZSByZWFkZXIgYW5kIGV2ZW50cyBvbiB0byB0aGUgaGFuZGxlcnMKLSAgdW5tb2RpZmllZCwgYnV0IHN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHNwZWNpZmljIG1ldGhvZHMgdG8gbW9kaWZ5Ci0gIHRoZSBldmVudCBzdHJlYW0gb3IgdGhlIGNvbmZpZ3VyYXRpb24gcmVxdWVzdHMgYXMgdGhleSBwYXNzIHRocm91Z2guCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtwcmVwYXJlX2lucHV0X3NvdXJjZX17c291cmNlXG9wdGlvbmFseywgYmFzZX19Ci0gIFRoaXMgZnVuY3Rpb24gdGFrZXMgYW4gaW5wdXQgc291cmNlIGFuZCBhbiBvcHRpb25hbCBiYXNlIFVSTCBhbmQKLSAgcmV0dXJucyBhIGZ1bGx5IHJlc29sdmVkIFxjbGFzc3tJbnB1dFNvdXJjZX0gb2JqZWN0IHJlYWR5IGZvcgotICByZWFkaW5nLiAgVGhlIGlucHV0IHNvdXJjZSBjYW4gYmUgZ2l2ZW4gYXMgYSBzdHJpbmcsIGEgZmlsZS1saWtlCi0gIG9iamVjdCwgb3IgYW4gXGNsYXNze0lucHV0U291cmNlfSBvYmplY3Q7IHBhcnNlcnMgd2lsbCB1c2UgdGhpcwotICBmdW5jdGlvbiB0byBpbXBsZW1lbnQgdGhlIHBvbHltb3JwaGljIFx2YXJ7c291cmNlfSBhcmd1bWVudCB0byB0aGVpcgotICBcbWV0aG9ke3BhcnNlKCl9IG1ldGhvZC4KLVxlbmR7ZnVuY2Rlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbWFjL2xpYmFlcGFjay50ZXggYi9Eb2MvbWFjL2xpYmFlcGFjay50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YTY3MmUuLjAwMDAwMDAKLS0tIGEvRG9jL21hYy9saWJhZXBhY2sudGV4CisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXthZXBhY2t9IC0tLQotICAgICAgICAgQ29udmVyc2lvbiBiZXR3ZWVuIFB5dGhvbiB2YXJpYWJsZXMgYW5kIEFwcGxlRXZlbnQgZGF0YSBjb250YWluZXJzfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17YWVwYWNrfQotICBccGxhdGZvcm17TWFjfQotJVxtb2R1bGVhdXRob3J7SmFjayBKYW5zZW4/fXtlbWFpbH0KLVxtb2R1bGVzeW5vcHNpc3tDb252ZXJzaW9uIGJldHdlZW4gUHl0aG9uIHZhcmlhYmxlcyBhbmQgQXBwbGVFdmVudAotICAgICAgICAgICAgICAgIGRhdGEgY29udGFpbmVycy59Ci1cc2VjdGlvbmF1dGhvcntWaW5jZW50IE1hcmNoZXR0aX17dmluY2VtQGVuLmNvbX0KLQotCi1UaGUgXG1vZHVsZXthZXBhY2t9IG1vZHVsZSBkZWZpbmVzIGZ1bmN0aW9ucyBmb3IgY29udmVydGluZyAocGFja2luZykKLVB5dGhvbiB2YXJpYWJsZXMgdG8gQXBwbGVFdmVudCBkZXNjcmlwdG9ycyBhbmQgYmFjayAodW5wYWNraW5nKS4KLVdpdGhpbiBQeXRob24gdGhlIEFwcGxlRXZlbnQgZGVzY3JpcHRvciBpcyBoYW5kbGVkIGJ5IFB5dGhvbiBvYmplY3RzCi1vZiBidWlsdC1pbiB0eXBlIFxjbGFzc3tBRURlc2N9LCBkZWZpbmVkIGluIG1vZHVsZSBccmVmbW9kdWxle0NhcmJvbi5BRX0uCi0KLVRoZSBcbW9kdWxle2FlcGFja30gbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6Ci0KLQotXGJlZ2lue2Z1bmNkZXNjfXtwYWNrfXt4XG9wdGlvbmFseywgZm9yY2V0eXBlfX0KLVJldHVybnMgYW4gXGNsYXNze0FFRGVzY30gb2JqZWN0ICBjb250YWluaW5nIGEgY29udmVyc2lvbiBvZiBQeXRob24KLXZhbHVlIHguIElmIFx2YXJ7Zm9yY2V0eXBlfSBpcyBwcm92aWRlZCBpdCBzcGVjaWZpZXMgdGhlIGRlc2NyaXB0b3IKLXR5cGUgb2YgdGhlIHJlc3VsdC4gT3RoZXJ3aXNlLCBhIGRlZmF1bHQgbWFwcGluZyBvZiBQeXRob24gdHlwZXMgdG8KLUFwcGxlIEV2ZW50IGRlc2NyaXB0b3IgdHlwZXMgaXMgdXNlZCwgYXMgZm9sbG93czoKLQotXGJlZ2lue3RhYmxlaWl9e2x8bH17dGV4dHJtfXtQeXRob24gdHlwZX17ZGVzY3JpcHRvciB0eXBlfQotICBcbGluZWlpe1xjbGFzc3tGU1NwZWN9fXt0eXBlRlNTfQotICBcbGluZWlpe1xjbGFzc3tGU1JlZn19e3R5cGVGU1JlZn0KLSAgXGxpbmVpaXtcY2xhc3N7QWxpYXN9fXt0eXBlQWxpYXN9Ci0gIFxsaW5laWl7aW50ZWdlcn17dHlwZUxvbmcgKDMyIGJpdCBpbnRlZ2VyKX0KLSAgXGxpbmVpaXtmbG9hdH17dHlwZUZsb2F0ICg2NCBiaXQgZmxvYXRpbmcgcG9pbnQpfQotICBcbGluZWlpe3N0cmluZ317dHlwZVRleHR9Ci0gIFxsaW5laWl7dW5pY29kZX17dHlwZVVuaWNvZGVUZXh0fQotICBcbGluZWlpe2xpc3R9e3R5cGVBRUxpc3R9Ci0gIFxsaW5laWl7ZGljdGlvbmFyeX17dHlwZUFFUmVjb3JkfQotICBcbGluZWlpe2luc3RhbmNlfXtcZW1waHtzZWUgYmVsb3d9fQotXGVuZHt0YWJsZWlpfSAgCi0gCi1JZiBcdmFye3h9IGlzIGEgUHl0aG9uIGluc3RhbmNlIHRoZW4gdGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byBjYWxsIGFuCi1cbWV0aG9ke19fYWVwYWNrX18oKX0gbWV0aG9kLiAgVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiBhbgotXGNsYXNze0FFRGVzY30gb2JqZWN0LgotCi1JZiB0aGUgY29udmVyc2lvbiBcdmFye3h9IGlzIG5vdCBkZWZpbmVkIGFib3ZlLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMKLXRoZSBQeXRob24gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgdmFsdWUgKHRoZSByZXByKCkgZnVuY3Rpb24pCi1lbmNvZGVkIGFzIGEgdGV4dCBkZXNjcmlwdG9yLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXt1bnBhY2t9e3hcb3B0aW9uYWx7LCBmb3Jtb2R1bGVuYW1lfX0KLSAgXHZhcnt4fSBtdXN0IGJlIGFuIG9iamVjdCBvZiB0eXBlIFxjbGFzc3tBRURlc2N9LiBUaGlzIGZ1bmN0aW9uCi0gIHJldHVybnMgYSBQeXRob24gb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkYXRhIGluIHRoZSBBcHBsZQotICBFdmVudCBkZXNjcmlwdG9yIFx2YXJ7eH0uIFNpbXBsZSBBcHBsZUV2ZW50IGRhdGEgdHlwZXMgKGludGVnZXIsCi0gIHRleHQsIGZsb2F0KSBhcmUgcmV0dXJuZWQgYXMgdGhlaXIgb2J2aW91cyBQeXRob24gY291bnRlcnBhcnRzLgotICBBcHBsZSBFdmVudCBsaXN0cyBhcmUgcmV0dXJuZWQgYXMgUHl0aG9uIGxpc3RzLCBhbmQgdGhlIGxpc3QKLSAgZWxlbWVudHMgYXJlIHJlY3Vyc2l2ZWx5IHVucGFja2VkLiAgT2JqZWN0IHJlZmVyZW5jZXMKLSAgKGV4LiBcY29kZXtsaW5lIDMgb2YgZG9jdW1lbnQgMX0pIGFyZSByZXR1cm5lZCBhcyBpbnN0YW5jZXMgb2YKLSAgXGNsYXNze2FldHlwZXMuT2JqZWN0U3BlY2lmaWVyfSwgdW5sZXNzIFxjb2Rle2Zvcm1vZHVsZW5hbWV9Ci0gIGlzIHNwZWNpZmllZC4gIEFwcGxlRXZlbnQgZGVzY3JpcHRvcnMgd2l0aAotICBkZXNjcmlwdG9yIHR5cGUgdHlwZUZTUyBhcmUgcmV0dXJuZWQgYXMgXGNsYXNze0ZTU3BlY30KLSAgb2JqZWN0cy4gIEFwcGxlRXZlbnQgcmVjb3JkIGRlc2NyaXB0b3JzIGFyZSByZXR1cm5lZCBhcyBQeXRob24KLSAgZGljdGlvbmFyaWVzLCB3aXRoIDQtY2hhcmFjdGVyIHN0cmluZyBrZXlzIGFuZCBlbGVtZW50cyByZWN1cnNpdmVseQotICB1bnBhY2tlZC4KLSAgCi0gIFRoZSBvcHRpb25hbCBcY29kZXtmb3Jtb2R1bGVuYW1lfSBhcmd1bWVudCBpcyB1c2VkIGJ5IHRoZSBzdHViIHBhY2thZ2VzCi0gIGdlbmVyYXRlZCBieSBcbW9kdWxle2dlbnN1aXRlbW9kdWxlfSwgYW5kIGVuc3VyZXMgdGhhdCB0aGUgT1NBIGNsYXNzZXMKLSAgZm9yIG9iamVjdCBzcGVjaWZpZXJzIGFyZSBsb29rZWQgdXAgaW4gdGhlIGNvcnJlY3QgbW9kdWxlLiBUaGlzIGVuc3VyZXMKLSAgdGhhdCBpZiwgc2F5LCB0aGUgRmluZGVyIHJldHVybnMgYW4gb2JqZWN0IHNwZWNpZmllciBmb3IgYSB3aW5kb3cKLSAgeW91IGdldCBhbiBpbnN0YW5jZSBvZiBcY29kZXtGaW5kZXIuV2luZG93fSBhbmQgbm90IGEgZ2VuZXJpYwotICBcY29kZXthZXR5cGVzLldpbmRvd30uIFRoZSBmb3JtZXIga25vd3MgYWJvdXQgYWxsIHRoZSBwcm9wZXJ0aWVzCi0gIGFuZCBlbGVtZW50cyBhIHdpbmRvdyBoYXMgaW4gdGhlIEZpbmRlciwgd2hpbGUgdGhlIGxhdHRlciBrbm93cwotICBubyBzdWNoIHRoaW5ncy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWVtb2R1bGV7Q2FyYm9uLkFFfXtCdWlsdC1pbiBhY2Nlc3MgdG8gQXBwbGUgRXZlbnQgTWFuYWdlciByb3V0aW5lcy59Ci0gIFxzZWVtb2R1bGV7YWV0eXBlc317UHl0aG9uIGRlZmluaXRpb25zIG9mIGNvZGVzIGZvciBBcHBsZSBFdmVudAotICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IgdHlwZXMufQotICBcc2VldGl0bGVbaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vdGVjaHB1YnMvbWFjL0lBQy9JQUMtMi5odG1sXXsKLSAgICAgICAgICAgIEluc2lkZSBNYWNpbnRvc2g6IEludGVyYXBwbGljYXRpb24KLSAgICAgICAgICAgIENvbW11bmljYXRpb259e0luZm9ybWF0aW9uIGFib3V0IGludGVyLXByb2Nlc3MKLSAgICAgICAgICAgIGNvbW11bmljYXRpb25zIG9uIHRoZSBNYWNpbnRvc2gufQotXGVuZHtzZWVhbHNvfQpkaWZmIC0tZ2l0IGEvRG9jL21hYy9saWJhZXRvb2xzLnRleCBiL0RvYy9tYWMvbGliYWV0b29scy50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2Mzc1NWIuLjAwMDAwMDAKLS0tIGEvRG9jL21hYy9saWJhZXRvb2xzLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7YWV0b29sc30gLS0tCi0gICAgICAgICBPU0EgY2xpZW50IHN1cHBvcnR9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXthZXRvb2xzfQotICBccGxhdGZvcm17TWFjfQotJVxtb2R1bGVhdXRob3J7SmFjayBKYW5zZW4/fXtlbWFpbH0KLVxtb2R1bGVzeW5vcHNpc3tCYXNpYyBzdXBwb3J0IGZvciBzZW5kaW5nIEFwcGxlIEV2ZW50c30KLVxzZWN0aW9uYXV0aG9ye0phY2sgSmFuc2VufXtKYWNrLkphbnNlbkBjd2kubmx9Ci0KLQotVGhlIFxtb2R1bGV7YWV0b29sc30gbW9kdWxlIGNvbnRhaW5zIHRoZSBiYXNpYyBmdW5jdGlvbmFsaXR5Ci1vbiB3aGljaCBQeXRob24gQXBwbGVTY3JpcHQgY2xpZW50IHN1cHBvcnQgaXMgYnVpbHQuIEl0IGFsc28KLWltcG9ydHMgYW5kIHJlLWV4cG9ydHMgdGhlIGNvcmUgZnVuY3Rpb25hbGl0eSBvZiB0aGUKLVxtb2R1bGV7YWV0eXBlc30gYW5kIFxtb2R1bGV7YWVwYWNrfSBtb2R1bGVzLiBUaGUgc3R1YiBwYWNrYWdlcwotZ2VuZXJhdGVkIGJ5IFxtb2R1bGV7Z2Vuc3VpdGVtb2R1bGV9IGltcG9ydCB0aGUgcmVsZXZhbnQKLXBvcnRpb25zIG9mIFxtb2R1bGV7YWV0b29sc30sIHNvIHVzdWFsbHkgeW91IGRvIG5vdCBuZWVkIHRvCi1pbXBvcnQgaXQgeW91cnNlbGYuIFRoZSBleGNlcHRpb24gdG8gdGhpcyBpcyB3aGVuIHlvdQotY2Fubm90IHVzZSBhIGdlbmVyYXRlZCBzdWl0ZSBwYWNrYWdlIGFuZCBuZWVkIGxvd2VyLWxldmVsCi1hY2Nlc3MgdG8gc2NyaXB0aW5nLgotCi1UaGUgXG1vZHVsZXthZXRvb2xzfSBtb2R1bGUgaXRzZWxmIHVzZXMgdGhlIEFwcGxlRXZlbnQgc3VwcG9ydAotcHJvdmlkZWQgYnkgdGhlIFxtb2R1bGV7Q2FyYm9uLkFFfSBtb2R1bGUuIFRoaXMgaGFzIG9uZSBkcmF3YmFjazoKLXlvdSBuZWVkIGFjY2VzcyB0byB0aGUgd2luZG93IG1hbmFnZXIsIHNlZSBzZWN0aW9uIFxyZWZ7b3N4LWd1aS1zY3JpcHRzfQotZm9yIGRldGFpbHMuIFRoaXMgcmVzdHJpY3Rpb24gbWF5IGJlIGxpZnRlZCBpbiBmdXR1cmUgcmVsZWFzZXMuCi0KLQotVGhlIFxtb2R1bGV7YWV0b29sc30gbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6Ci0KLVxiZWdpbntmdW5jZGVzY317cGFja2V2ZW50fXthZSwgcGFyYW1ldGVycywgYXR0cmlidXRlc30KLVN0b3JlcyBwYXJhbWV0ZXJzIGFuZCBhdHRyaWJ1dGVzIGluIGEgcHJlLWNyZWF0ZWQgXGNvZGV7Q2FyYm9uLkFFLkFFRGVzY30KLW9iamVjdC4gXGNvZGV7cGFyYW1ldGVyc30gYW5kIFxjb2Rle2F0dHJpYnV0ZXN9IGFyZSAKLWRpY3Rpb25hcmllcyBtYXBwaW5nIDQtY2hhcmFjdGVyIE9TQSBwYXJhbWV0ZXIga2V5cyB0byBQeXRob24gb2JqZWN0cy4gVGhlCi1vYmplY3RzIGFyZSBwYWNrZWQgdXNpbmcgXGNvZGV7YWVwYWNrLnBhY2soKX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3VucGFja2V2ZW50fXthZVxvcHRpb25hbHssIGZvcm1vZHVsZW5hbWV9fQotUmVjdXJzaXZlbHkgdW5wYWNrcyBhIFxjb2Rle0NhcmJvbi5BRS5BRURlc2N9IGV2ZW50IHRvIFB5dGhvbiBvYmplY3RzLgotVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHBhcmFtZXRlciBkaWN0aW9uYXJ5IGFuZCB0aGUgYXR0cmlidXRlIGRpY3Rpb25hcnkuCi1UaGUgXGNvZGV7Zm9ybW9kdWxlbmFtZX0gYXJndW1lbnQgaXMgdXNlZCBieSBnZW5lcmF0ZWQgc3R1YiBwYWNrYWdlcyB0bwotY29udHJvbCB3aGVyZSBBcHBsZVNjcmlwdCBjbGFzc2VzIGFyZSBsb29rZWQgdXAuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2tleXN1YnN0fXthcmd1bWVudHMsIGtleWRpY3R9Ci1Db252ZXJ0cyBhIFB5dGhvbiBrZXl3b3JkIGFyZ3VtZW50IGRpY3Rpb25hcnkgXGNvZGV7YXJndW1lbnRzfSB0bwotdGhlIGZvcm1hdCByZXF1aXJlZCBieSBcY29kZXtwYWNrZXZlbnR9IGJ5IHJlcGxhY2luZyB0aGUga2V5cywKLXdoaWNoIGFyZSBQeXRob24gaWRlbnRpZmllcnMsIGJ5IHRoZSBmb3VyLWNoYXJhY3RlciBPU0Ega2V5cyBhY2NvcmRpbmcKLXRvIHRoZSBtYXBwaW5nIHNwZWNpZmllZCBpbiBcY29kZXtrZXlkaWN0fS4gVXNlZCBieSB0aGUgZ2VuZXJhdGVkIHN1aXRlCi1wYWNrYWdlcy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZW51bXN1YnN0fXthcmd1bWVudHMsIGtleSwgZWRpY3R9Ci1JZiB0aGUgXGNvZGV7YXJndW1lbnRzfSBkaWN0aW9uYXJ5IGNvbnRhaW5zIGFuIGVudHJ5IGZvciBcY29kZXtrZXl9Ci1jb252ZXJ0IHRoZSB2YWx1ZSBmb3IgdGhhdCBlbnRyeSBhY2NvcmRpbmcgdG8gZGljdGlvbmFyeSBcY29kZXtlZGljdH0uCi1UaGlzIGNvbnZlcnRzIGh1bWFuLXJlYWRhYmxlIFB5dGhvbiBlbnVtZXJhdGlvbiBuYW1lcyB0byB0aGUgT1NBIDQtY2hhcmFjdGVyCi1jb2Rlcy4KLVVzZWQgYnkgdGhlIGdlbmVyYXRlZCBzdWl0ZQotcGFja2FnZXMuCi1cZW5ke2Z1bmNkZXNjfQotCi1UaGUgXG1vZHVsZXthZXRvb2xzfSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGNsYXNzOgotCi1cYmVnaW57Y2xhc3NkZXNjfXtUYWxrVG99e1xvcHRpb25hbHtzaWduYXR1cmU9Tm9uZSwgc3RhcnQ9MCwgdGltZW91dD0wfX0KLQotQmFzZSBjbGFzcyBmb3IgdGhlIHByb3h5IHVzZWQgdG8gdGFsayB0byBhbiBhcHBsaWNhdGlvbi4gXGNvZGV7c2lnbmF0dXJlfQotb3ZlcnJpZGVzIHRoZSBjbGFzcyBhdHRyaWJ1dGUgXGNvZGV7X3NpZ25hdHVyZX0gKHdoaWNoIGlzIHVzdWFsbHkgc2V0IGJ5IHN1YmNsYXNzZXMpCi1hbmQgaXMgdGhlIDQtY2hhciBjcmVhdG9yIGNvZGUgZGVmaW5pbmcgdGhlIGFwcGxpY2F0aW9uIHRvIHRhbGsgdG8uCi1cY29kZXtzdGFydH0gY2FuIGJlIHNldCB0byB0cnVlIHRvIGVuYWJsZSBydW5uaW5nIHRoZSBhcHBsaWNhdGlvbiBvbgotY2xhc3MgaW5zdGFudGlhdGlvbi4gXGNvZGV7dGltZW91dH0gY2FuIGJlIHNwZWNpZmllZCB0byBjaGFuZ2UgdGhlCi1kZWZhdWx0IHRpbWVvdXQgdXNlZCB3aGlsZSB3YWl0aW5nIGZvciBhbiBBcHBsZUV2ZW50IHJlcGx5LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfXtfc3RhcnR9e30KLVRlc3Qgd2hldGhlciB0aGUgYXBwbGljYXRpb24gaXMgcnVubmluZywgYW5kIGF0dGVtcHQgdG8gc3RhcnQgaXQgaWYgbm90LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317c2VuZH17Y29kZSwgc3ViY29kZVxvcHRpb25hbHssIHBhcmFtZXRlcnMsIGF0dHJpYnV0ZXN9fQotQ3JlYXRlIHRoZSBBcHBsZUV2ZW50IFxjb2Rle0NhcmJvbi5BRS5BRURlc2N9IGZvciB0aGUgdmVyYiB3aXRoCi10aGUgT1NBIGRlc2lnbmF0aW9uIFxjb2Rle2NvZGUsIHN1YmNvZGV9ICh3aGljaCBhcmUgdGhlIHVzdWFsIDQtY2hhcmFjdGVyCi1zdHJpbmdzKSwgcGFjayB0aGUgXGNvZGV7cGFyYW1ldGVyc30gYW5kIFxjb2Rle2F0dHJpYnV0ZXN9IGludG8gaXQsIHNlbmQgaXQKLXRvIHRoZSB0YXJnZXQgYXBwbGljYXRpb24sIHdhaXQgZm9yIHRoZSByZXBseSwgdW5wYWNrIHRoZSByZXBseSB3aXRoCi1cY29kZXt1bnBhY2tldmVudH0gYW5kIHJldHVybiB0aGUgcmVwbHkgYXBwbGVldmVudCwgdGhlIHVucGFja2VkIHJldHVybiB2YWx1ZXMKLWFzIGEgZGljdGlvbmFyeSBhbmQgdGhlIHJldHVybiBhdHRyaWJ1dGVzLgotXGVuZHttZXRob2RkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL21hYy9saWJhZXR5cGVzLnRleCBiL0RvYy9tYWMvbGliYWV0eXBlcy50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZDhmOGIuLjAwMDAwMDAKLS0tIGEvRG9jL21hYy9saWJhZXR5cGVzLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle2FldHlwZXN9IC0tLQotICAgICAgICAgQXBwbGVFdmVudCBvYmplY3RzfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17YWV0eXBlc30KLSAgXHBsYXRmb3Jte01hY30KLSVcbW9kdWxlYXV0aG9ye0phY2sgSmFuc2VuP317ZW1haWx9Ci1cbW9kdWxlc3lub3BzaXN7UHl0aG9uIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBBcHBsZSBFdmVudCBPYmplY3QgTW9kZWwufQotXHNlY3Rpb25hdXRob3J7VmluY2VudCBNYXJjaGV0dGl9e3ZpbmNlbUBlbi5jb219Ci0KLQotVGhlIFxtb2R1bGV7YWV0eXBlc30gZGVmaW5lcyBjbGFzc2VzIHVzZWQgdG8gcmVwcmVzZW50IEFwcGxlIEV2ZW50IGRhdGEKLWRlc2NyaXB0b3JzIGFuZCBBcHBsZSBFdmVudCBvYmplY3Qgc3BlY2lmaWVycy4KLQotQXBwbGUgRXZlbnQgZGF0YSBpcyBjb250YWluZWQgaW4gZGVzY3JpcHRvcnMsIGFuZCB0aGVzZSBkZXNjcmlwdG9ycwotYXJlIHR5cGVkLiBGb3IgbWFueSBkZXNjcmlwdG9ycyB0aGUgUHl0aG9uIHJlcHJlc2VudGF0aW9uIGlzIHNpbXBseSB0aGUKLWNvcnJlc3BvbmRpbmcgUHl0aG9uIHR5cGU6IFxjb2Rle3R5cGVUZXh0fSBpbiBPU0EgaXMgYSBQeXRob24gc3RyaW5nLAotXGNvZGV7dHlwZUZsb2F0fSBpcyBhIGZsb2F0LCBldGMuIEZvciBPU0EgdHlwZXMgdGhhdCBoYXZlIG5vIGRpcmVjdAotUHl0aG9uIGNvdW50ZXJwYXJ0IHRoaXMgbW9kdWxlIGRlY2xhcmVzIGNsYXNzZXMuIFBhY2tpbmcgYW5kIHVucGFja2luZwotaW5zdGFuY2VzIG9mIHRoZXNlIGNsYXNzZXMgaXMgaGFuZGxlZCBhdXRvbWF0aWNhbGx5IGJ5IFxtb2R1bGV7YWVwYWNrfS4KLQotQW4gb2JqZWN0IHNwZWNpZmllciBpcyBlc3NlbnRpYWxseSBhbiBhZGRyZXNzIG9mIGFuIG9iamVjdCBpbXBsZW1lbnRlZAotaW4gYSBBcHBsZSBFdmVudCBzZXJ2ZXIuIEFuIEFwcGxlIEV2ZW50IHNwZWNpZmllciBpcyB1c2VkIGFzIHRoZSBkaXJlY3QKLW9iamVjdCBmb3IgYW4gQXBwbGUgRXZlbnQgb3IgYXMgdGhlIGFyZ3VtZW50IG9mIGFuIG9wdGlvbmFsIHBhcmFtZXRlci4KLVRoZSBcbW9kdWxle2FldHlwZXN9IG1vZHVsZSBjb250YWlucyB0aGUgYmFzZSBjbGFzc2VzIGZvciBPU0EgY2xhc3NlcwotYW5kIHByb3BlcnRpZXMsIHdoaWNoIGFyZSB1c2VkIGJ5IHRoZSBwYWNrYWdlcyBnZW5lcmF0ZWQgYnkKLVxtb2R1bGV7Z2Vuc3VpdGVtb2R1bGV9IHRvIHBvcHVsYXRlIHRoZSBjbGFzc2VzIGFuZCBwcm9wZXJ0aWVzIGluIGEKLWdpdmVuIHN1aXRlLgotCi1Gb3IgcmVhc29ucyBvZiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBhbmQgZm9yIGNhc2VzIHdoZXJlIHlvdSBuZWVkIHRvCi1zY3JpcHQgYW4gYXBwbGljYXRpb24gZm9yIHdoaWNoIHlvdSBoYXZlIG5vdCBnZW5lcmF0ZWQgdGhlIHN0dWIgcGFja2FnZQotdGhpcyBtb2R1bGUgYWxzbyBjb250YWlucyBvYmplY3Qgc3BlY2lmaWVycyBmb3IgYSBudW1iZXIgb2YgY29tbW9uIE9TQQotY2xhc3NlcyBzdWNoIGFzIFxjb2Rle0RvY3VtZW50fSwgXGNvZGV7V2luZG93fSwgXGNvZGV7Q2hhcmFjdGVyfSwgZXRjLgotCi0KLQotVGhlIFxtb2R1bGV7QUVPYmplY3RzfSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGNsYXNzZXMgdG8gcmVwcmVzZW50Ci1BcHBsZSBFdmVudCBkZXNjcmlwdG9yIGRhdGE6Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1Vua25vd259e3R5cGUsIGRhdGF9Ci1UaGUgcmVwcmVzZW50YXRpb24gb2YgT1NBIGRlc2NyaXB0b3IgZGF0YSBmb3Igd2hpY2ggdGhlIFxtb2R1bGV7YWVwYWNrfQotYW5kIFxtb2R1bGV7YWV0eXBlc30gbW9kdWxlcyBoYXZlIG5vIHN1cHBvcnQsIGkuZS4gYW55dGhpbmcgdGhhdCBpcyBub3QKLXJlcHJlc2VudGVkIGJ5IHRoZSBvdGhlciBjbGFzc2VzIGhlcmUgYW5kIHRoYXQgaXMgbm90IGVxdWl2YWxlbnQgdG8gYQotc2ltcGxlIFB5dGhvbiB2YWx1ZS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtFbnVtfXtlbnVtfQotQW4gZW51bWVyYXRpb24gdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gNC1jaGFyYWN0ZXIgc3RyaW5nIHZhbHVlLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0luc2VydGlvbkxvY317b2YsIHBvc30KLVBvc2l0aW9uIFxjb2Rle3Bvc30gaW4gb2JqZWN0IFxjb2Rle29mfS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtCb29sZWFufXtib29sfQotQSBib29sZWFuLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1N0eWxlZFRleHR9e3N0eWxlLCB0ZXh0fQotVGV4dCB3aXRoIHN0eWxlIGluZm9ybWF0aW9uIChmb250LCBmYWNlLCBldGMpIGluY2x1ZGVkLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0FFVGV4dH17c2NyaXB0LCBzdHlsZSwgdGV4dH0KLVRleHQgd2l0aCBzY3JpcHQgc3lzdGVtIGFuZCBzdHlsZSBpbmZvcm1hdGlvbiBpbmNsdWRlZC4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtJbnRsVGV4dH17c2NyaXB0LCBsYW5ndWFnZSwgdGV4dH0KLVRleHQgd2l0aCBzY3JpcHQgc3lzdGVtIGFuZCBsYW5ndWFnZSBpbmZvcm1hdGlvbiBpbmNsdWRlZC4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtJbnRsV3JpdGluZ0NvZGV9e3NjcmlwdCwgbGFuZ3VhZ2V9Ci1TY3JpcHQgc3lzdGVtIGFuZCBsYW5ndWFnZSBpbmZvcm1hdGlvbi4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtRRFBvaW50fXt2LCBofQotQSBxdWlja2RyYXcgcG9pbnQuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317UURSZWN0YW5nbGV9e3YwLCBoMCwgdjEsIGgxfQotQSBxdWlja2RyYXcgcmVjdGFuZ2xlLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1JHQkNvbG9yfXtyLCBnLCBifQotQSBjb2xvci4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtUeXBlfXt0eXBlfQotQW4gT1NBIHR5cGUgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gNC1jaGFyYWN0ZXIgbmFtZS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtLZXl3b3JkfXtuYW1lfQotQW4gT1NBIGtleXdvcmQgd2l0aCB0aGUgZ2l2ZW4gNC1jaGFyYWN0ZXIgbmFtZS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtSYW5nZX17c3RhcnQsIHN0b3B9Ci1BIHJhbmdlLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e09yZGluYWx9e2Fic299Ci1Ob24tbnVtZXJpYyBhYnNvbHV0ZSBwb3NpdGlvbnMsIHN1Y2ggYXMgXGNvZGV7ImZpcnMifSwgZmlyc3QsIG9yIFxjb2RleyJtaWRkIn0sCi1taWRkbGUuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317TG9naWNhbH17bG9nYywgdGVybX0KLVRoZSBsb2dpY2FsIGV4cHJlc3Npb24gb2YgYXBwbHlpbmcgb3BlcmF0b3IgXGNvZGV7bG9nY30gdG8KLVxjb2Rle3Rlcm19LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0NvbXBhcmlzb259e29iajEsIHJlbG8sIG9iajJ9Ci1UaGUgY29tcGFyaXNvbiBcY29kZXtyZWxvfSBvZiBcY29kZXtvYmoxfSB0byBcY29kZXtvYmoyfS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1UaGUgZm9sbG93aW5nIGNsYXNzZXMgYXJlIHVzZWQgYXMgYmFzZSBjbGFzc2VzIGJ5IHRoZSBnZW5lcmF0ZWQgc3R1YgotcGFja2FnZXMgdG8gcmVwcmVzZW50IEFwcGxlU2NyaXB0IGNsYXNzZXMgYW5kIHByb3BlcnRpZXMgaW4gUHl0aG9uOgotCi1cYmVnaW57Y2xhc3NkZXNjfXtDb21wb25lbnRJdGVtfXt3aGljaFxvcHRpb25hbHssIGZyfX0KLUFic3RyYWN0IGJhc2VjbGFzcyBmb3IgYW4gT1NBIGNsYXNzLiBUaGUgc3ViY2xhc3Mgc2hvdWxkIHNldCB0aGUgY2xhc3MKLWF0dHJpYnV0ZSBcY29kZXt3YW50fSB0byB0aGUgNC1jaGFyYWN0ZXIgT1NBIGNsYXNzIGNvZGUuIEluc3RhbmNlcyBvZgotc3ViY2xhc3NlcyBvZiB0aGlzIGNsYXNzIGFyZSBlcXVpdmFsZW50IHRvIEFwcGxlU2NyaXB0IE9iamVjdAotU3BlY2lmaWVycy4gVXBvbiBpbnN0YW50aWF0aW9uIHlvdSBzaG91bGQgcGFzcyBhIHNlbGVjdG9yIGluCi1cY29kZXt3aGljaH0sIGFuZCBvcHRpb25hbGx5IGEgcGFyZW50IG9iamVjdCBpbiBcY29kZXtmcn0uCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317TlByb3BlcnR5fXtmcn0KLUFic3RyYWN0IGJhc2VjbGFzcyBmb3IgYW4gT1NBIHByb3BlcnR5LiBUaGUgc3ViY2xhc3Mgc2hvdWxkIHNldCB0aGUgY2xhc3MKLWF0dHJpYnV0ZXMgXGNvZGV7d2FudH0gYW5kIFxjb2Rle3doaWNofSB0byBkZXNpZ25hdGUgd2hpY2ggcHJvcGVydHkgd2UKLWFyZSB0YWxraW5nIGFib3V0LiBJbnN0YW5jZXMgb2Ygc3ViY2xhc3NlcyBvZiB0aGlzIGNsYXNzIGFyZSBPYmplY3QKLVNwZWNpZmllcnMuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317T2JqZWN0U3BlY2lmaWVyfXt3YW50LCBmb3JtLCBzZWxkXG9wdGlvbmFseywgZnJ9fQotQmFzZSBjbGFzcyBvZiBcY29kZXtDb21wb25lbnRJdGVtfSBhbmQgXGNvZGV7TlByb3BlcnR5fSwgYSBnZW5lcmFsCi1PU0EgT2JqZWN0IFNwZWNpZmllci4gU2VlIHRoZSBBcHBsZSBPcGVuIFNjcmlwdGluZyBBcmNoaXRlY3R1cmUKLWRvY3VtZW50YXRpb24gZm9yIHRoZSBwYXJhbWV0ZXJzLiBOb3RlIHRoYXQgdGhpcyBjbGFzcyBpcyBub3QgYWJzdHJhY3QuCi1cZW5ke2NsYXNzZGVzY30KLQpkaWZmIC0tZ2l0IGEvRG9jL21hYy9saWJhdXRvZ2lsLnRleCBiL0RvYy9tYWMvbGliYXV0b2dpbC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMmU4NzIuLjAwMDAwMDAKLS0tIGEvRG9jL21hYy9saWJhdXRvZ2lsLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7YXV0b0dJTH0gLS0tCi0gICAgICAgICBHbG9iYWwgSW50ZXJwcmV0ZXIgTG9jayBoYW5kbGluZyBpbiBldmVudCBsb29wc30KLQotXGRlY2xhcmVtb2R1bGV7ZXh0ZW5zaW9ufXthdXRvR0lMfQotICBccGxhdGZvcm17TWFjfQotXG1vZHVsZXN5bm9wc2lze0dsb2JhbCBJbnRlcnByZXRlciBMb2NrIGhhbmRsaW5nIGluIGV2ZW50IGxvb3BzLn0KLVxtb2R1bGVhdXRob3J7SnVzdCB2YW4gUm9zc3VtfXtqdXN0QGxldHRlcnJvci5jb219Ci0KLQotVGhlIFxtb2R1bGV7YXV0b0dJTH0gbW9kdWxlIHByb3ZpZGVzIGEgZnVuY3Rpb24gXGZ1bmN0aW9ue2luc3RhbGxBdXRvR0lMfSB0aGF0Ci1hdXRvbWF0aWNhbGx5IGxvY2tzIGFuZCB1bmxvY2tzIFB5dGhvbidzIEdsb2JhbCBJbnRlcnByZXRlciBMb2NrCi13aGVuIHJ1bm5pbmcgYW4gZXZlbnQgbG9vcC4KLQotXGJlZ2lue2V4Y2Rlc2N9e0F1dG9HSUxFcnJvcn0KLVJhaXNlZCBpZiB0aGUgb2JzZXJ2ZXIgY2FsbGJhY2sgY2Fubm90IGJlIGluc3RhbGxlZCwgZm9yIGV4YW1wbGUgYmVjYXVzZQotdGhlIGN1cnJlbnQgdGhyZWFkIGRvZXMgbm90IGhhdmUgYSBydW4gbG9vcC4KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtpbnN0YWxsQXV0b0dJTH17fQotCUluc3RhbGwgYW4gb2JzZXJ2ZXIgY2FsbGJhY2sgaW4gdGhlIGV2ZW50IGxvb3AgKENGUnVuTG9vcCkgZm9yIHRoZQotCWN1cnJlbnQgdGhyZWFkLCB0aGF0IHdpbGwgbG9jayBhbmQgdW5sb2NrIHRoZSBHbG9iYWwgSW50ZXJwcmV0ZXIgTG9jawotCShHSUwpIGF0IGFwcHJvcHJpYXRlIHRpbWVzLCBhbGxvd2luZyBvdGhlciBQeXRob24gdGhyZWFkcyB0byBydW4gd2hpbGUKLQl0aGUgZXZlbnQgbG9vcCBpcyBpZGxlLgotCQotCUF2YWlsYWJpbGl0eTogT1NYIDEwLjEgb3IgbGF0ZXIuCi1cZW5ke2Z1bmNkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL21hYy9saWJjb2xvcnBpY2tlci50ZXggYi9Eb2MvbWFjL2xpYmNvbG9ycGlja2VyLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk2ZTljMi4uMDAwMDAwMAotLS0gYS9Eb2MvbWFjL2xpYmNvbG9ycGlja2VyLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7Q29sb3JQaWNrZXJ9IC0tLQotICAgICAgICAgQ29sb3Igc2VsZWN0aW9uIGRpYWxvZ30KLQotXGRlY2xhcmVtb2R1bGV7ZXh0ZW5zaW9ufXtDb2xvclBpY2tlcn0KLSAgXHBsYXRmb3Jte01hY30KLVxtb2R1bGVzeW5vcHNpc3tJbnRlcmZhY2UgdG8gdGhlIHN0YW5kYXJkIGNvbG9yIHNlbGVjdGlvbiBkaWFsb2cufQotXG1vZHVsZWF1dGhvcntKdXN0IHZhbiBSb3NzdW19e2p1c3RAbGV0dGVycm9yLmNvbX0KLVxzZWN0aW9uYXV0aG9ye0ZyZWQgTC4gRHJha2UsIEpyLn17ZmRyYWtlQGFjbS5vcmd9Ci0KLQotVGhlIFxtb2R1bGV7Q29sb3JQaWNrZXJ9IG1vZHVsZSBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIHN0YW5kYXJkIGNvbG9yCi1waWNrZXIgZGlhbG9nLgotCi0KLVxiZWdpbntmdW5jZGVzY317R2V0Q29sb3J9e3Byb21wdCwgcmdifQotICBTaG93IGEgc3RhbmRhcmQgY29sb3Igc2VsZWN0aW9uIGRpYWxvZyBhbmQgYWxsb3cgdGhlIHVzZXIgdG8gc2VsZWN0Ci0gIGEgY29sb3IuICBUaGUgdXNlciBpcyBnaXZlbiBpbnN0cnVjdGlvbiBieSB0aGUgXHZhcntwcm9tcHR9IHN0cmluZywKLSAgYW5kIHRoZSBkZWZhdWx0IGNvbG9yIGlzIHNldCB0byBcdmFye3JnYn0uICBcdmFye3JnYn0gbXVzdCBiZSBhCi0gIHR1cGxlIGdpdmluZyB0aGUgcmVkLCBncmVlbiwgYW5kIGJsdWUgY29tcG9uZW50cyBvZiB0aGUgY29sb3IuCi0gIFxmdW5jdGlvbntHZXRDb2xvcigpfSByZXR1cm5zIGEgdHVwbGUgZ2l2aW5nIHRoZSB1c2VyJ3Mgc2VsZWN0ZWQKLSAgY29sb3IgYW5kIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhleSBhY2NlcHRlZCB0aGUgc2VsZWN0aW9uIG9mCi0gIGNhbmNlbGxlZC4KLVxlbmR7ZnVuY2Rlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbWFjL2xpYmZyYW1ld29yay50ZXggYi9Eb2MvbWFjL2xpYmZyYW1ld29yay50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYzc2YzEuLjAwMDAwMDAKLS0tIGEvRG9jL21hYy9saWJmcmFtZXdvcmsudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMzEyICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7RnJhbWVXb3JrfSAtLS0KLSAgICAgICAgIEludGVyYWN0aXZlIGFwcGxpY2F0aW9uIGZyYW1ld29ya30KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e0ZyYW1lV29ya30KLSAgXHBsYXRmb3Jte01hY30KLVxtb2R1bGVzeW5vcHNpc3tJbnRlcmFjdGl2ZSBhcHBsaWNhdGlvbiBmcmFtZXdvcmsufQotCi0KLVRoZSBcbW9kdWxle0ZyYW1lV29ya30gbW9kdWxlIGNvbnRhaW5zIGNsYXNzZXMgdGhhdCB0b2dldGhlciBwcm92aWRlIGEKLWZyYW1ld29yayBmb3IgYW4gaW50ZXJhY3RpdmUgTWFjaW50b3NoIGFwcGxpY2F0aW9uLiBUaGUgcHJvZ3JhbW1lcgotYnVpbGRzIGFuIGFwcGxpY2F0aW9uIGJ5IGNyZWF0aW5nIHN1YmNsYXNzZXMgdGhhdCBvdmVycmlkZSB2YXJpb3VzCi1tZXRob2RzIG9mIHRoZSBiYXNlcyBjbGFzc2VzLCB0aGVyZWJ5IGltcGxlbWVudGluZyB0aGUgZnVuY3Rpb25hbGl0eQotd2FudGVkLiBPdmVycmlkaW5nIGZ1bmN0aW9uYWxpdHkgY2FuIG9mdGVuIGJlIGRvbmUgb24gdmFyaW91cwotZGlmZmVyZW50IGxldmVscywgaS5lLiB0byBoYW5kbGUgY2xpY2tzIGluIGEgc2luZ2xlIGRpYWxvZyB3aW5kb3cgaW4gYQotbm9uLXN0YW5kYXJkIHdheSBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIG92ZXJyaWRlIHRoZSBjb21wbGV0ZSBldmVudAotaGFuZGxpbmcuCi0KLVdvcmsgb24gdGhlIFxtb2R1bGV7RnJhbWVXb3JrfSBoYXMgcHJldHR5IG11Y2ggc3RvcHBlZCwgbm93IHRoYXQKLVxtb2R1bGV7UHlPYmpDfSBpcyBhdmFpbGFibGUgZm9yIGZ1bGwgQ29jb2EgYWNjZXNzIGZyb20gUHl0aG9uLCBhbmQgdGhlCi1kb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBvbmx5IHRoZSBtb3N0IGltcG9ydGFudCBmdW5jdGlvbmFsaXR5LCBhbmQgbm90Ci1pbiB0aGUgbW9zdCBsb2dpY2FsIG1hbm5lciBhdCB0aGF0LiBFeGFtaW5lIHRoZSBzb3VyY2Ugb3IgdGhlIGV4YW1wbGVzCi1mb3IgbW9yZSBkZXRhaWxzLiAgVGhlIGZvbGxvd2luZyBhcmUgc29tZSBjb21tZW50cyBwb3N0ZWQgb24gdGhlCi1NYWNQeXRob24gbmV3c2dyb3VwIGFib3V0IHRoZSBzdHJlbmd0aHMgYW5kIGxpbWl0YXRpb25zIG9mCi1cbW9kdWxle0ZyYW1lV29ya306Ci0KLVxiZWdpbntxdW90YXRpb259Ci1UaGUgc3Ryb25nIHBvaW50IG9mIFxtb2R1bGV7RnJhbWVXb3JrfSBpcyB0aGF0IGl0IGFsbG93cyB5b3UgdG8gYnJlYWsKLWludG8gdGhlIGNvbnRyb2wtZmxvdyBhdCBtYW55IGRpZmZlcmVudCBwbGFjZXMuIFxyZWZtb2R1bGV7V30sIGZvcgotaW5zdGFuY2UsIHVzZXMgYSBkaWZmZXJlbnQgd2F5IHRvIGVuYWJsZS9kaXNhYmxlIG1lbnVzIGFuZCB0aGF0IHBsdWdzCi1yaWdodCBpbiBsZWF2aW5nIHRoZSByZXN0IGludGFjdC4gIFRoZSB3ZWFrIHBvaW50cyBvZgotXG1vZHVsZXtGcmFtZVdvcmt9IGFyZSB0aGF0IGl0IGhhcyBubyBhYnN0cmFjdCBjb21tYW5kIGludGVyZmFjZSAoYnV0Ci10aGF0IHNob3VsZG4ndCBiZSBkaWZmaWN1bHQpLCB0aGF0IGl0cyBkaWFsb2cgc3VwcG9ydCBpcyBtaW5pbWFsIGFuZAotdGhhdCBpdHMgY29udHJvbC90b29sYmFyIHN1cHBvcnQgaXMgbm9uLWV4aXN0ZW50LgotXGVuZHtxdW90YXRpb259Ci0KLQotVGhlIFxtb2R1bGV7RnJhbWVXb3JrfSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKLQotCi1cYmVnaW57ZnVuY2Rlc2N9e0FwcGxpY2F0aW9ufXt9Ci1BbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjb21wbGV0ZSBhcHBsaWNhdGlvbi4gU2VlIGJlbG93IGZvciBhCi1kZXNjcmlwdGlvbiBvZiB0aGUgbWV0aG9kcy4gVGhlIGRlZmF1bHQgXG1ldGhvZHtfX2luaXRfXygpfSByb3V0aW5lCi1jcmVhdGVzIGFuIGVtcHR5IHdpbmRvdyBkaWN0aW9uYXJ5IGFuZCBhIG1lbnUgYmFyIHdpdGggYW4gYXBwbGUgbWVudS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317TWVudUJhcn17fQotQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgbWVudWJhci4gVGhpcyBvYmplY3QgaXMgdXN1YWxseSBub3QgY3JlYXRlZAotYnkgdGhlIHVzZXIuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e01lbnV9e2JhciwgdGl0bGVcb3B0aW9uYWx7LCBhZnRlcn19Ci1BbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgbWVudS4gVXBvbiBjcmVhdGlvbiB5b3UgcGFzcyB0aGUKLVxjb2Rle01lbnVCYXJ9IHRoZSBtZW51IGFwcGVhcnMgaW4sIHRoZSBcdmFye3RpdGxlfSBzdHJpbmcgYW5kIGEKLXBvc2l0aW9uICgxLWJhc2VkKSBcdmFye2FmdGVyfSB3aGVyZSB0aGUgbWVudSBzaG91bGQgYXBwZWFyIChkZWZhdWx0OgotYXQgdGhlIGVuZCkuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e01lbnVJdGVtfXttZW51LCB0aXRsZVxvcHRpb25hbHssIHNob3J0Y3V0LCBjYWxsYmFja319Ci1DcmVhdGUgYSBtZW51IGl0ZW0gb2JqZWN0LiBUaGUgYXJndW1lbnRzIGFyZSB0aGUgbWVudSB0byBjcmVhdGUsIHRoZQotaXRlbSB0aXRsZSBzdHJpbmcgYW5kIG9wdGlvbmFsbHkgdGhlIGtleWJvYXJkIHNob3J0Y3V0Ci1hbmQgYSBjYWxsYmFjayByb3V0aW5lLiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdpdGggdGhlIGFyZ3VtZW50cwotbWVudS1pZCwgaXRlbSBudW1iZXIgd2l0aGluIG1lbnUgKDEtYmFzZWQpLCBjdXJyZW50IGZyb250IHdpbmRvdyBhbmQKLXRoZSBldmVudCByZWNvcmQuCi0KLUluc3RlYWQgb2YgYSBjYWxsYWJsZSBvYmplY3QgdGhlIGNhbGxiYWNrIGNhbiBhbHNvIGJlIGEgc3RyaW5nLiBJbgotdGhpcyBjYXNlIG1lbnUgc2VsZWN0aW9uIGNhdXNlcyB0aGUgbG9va3VwIG9mIGEgbWV0aG9kIGluIHRoZSB0b3Btb3N0Ci13aW5kb3cgYW5kIHRoZSBhcHBsaWNhdGlvbi4gVGhlIG1ldGhvZCBuYW1lIGlzIHRoZSBjYWxsYmFjayBzdHJpbmcKLXdpdGggXGNvZGV7J2RvbWVudV8nfSBwcmVwZW5kZWQuCi0KLUNhbGxpbmcgdGhlIFxjb2Rle01lbnVCYXJ9IFxtZXRob2R7Zml4bWVudWRpbXN0YXRlKCl9IG1ldGhvZCBzZXRzIHRoZQotY29ycmVjdCBkaW1taW5nIGZvciBhbGwgbWVudSBpdGVtcyBiYXNlZCBvbiB0aGUgY3VycmVudCBmcm9udCB3aW5kb3cuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e1NlcGFyYXRvcn17bWVudX0KLUFkZCBhIHNlcGFyYXRvciB0byB0aGUgZW5kIG9mIGEgbWVudS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317U3ViTWVudX17bWVudSwgbGFiZWx9Ci1DcmVhdGUgYSBzdWJtZW51IG5hbWVkIFx2YXJ7bGFiZWx9IHVuZGVyIG1lbnUgXHZhcnttZW51fS4gVGhlIG1lbnUKLW9iamVjdCBpcyByZXR1cm5lZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317V2luZG93fXtwYXJlbnR9Ci1DcmVhdGVzIGEgKG1vZGVsZXNzKSB3aW5kb3cuIFx2YXJ7UGFyZW50fSBpcyB0aGUgYXBwbGljYXRpb24gb2JqZWN0IHRvCi13aGljaCB0aGUgd2luZG93IGJlbG9uZ3MuIFRoZSB3aW5kb3cgaXMgbm90IGRpc3BsYXllZCB1bnRpbCBsYXRlci4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317RGlhbG9nV2luZG93fXtwYXJlbnR9Ci1DcmVhdGVzIGEgbW9kZWxlc3MgZGlhbG9nIHdpbmRvdy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317d2luZG93Ym91bmRzfXt3aWR0aCwgaGVpZ2h0fQotUmV0dXJuIGEgXGNvZGV7KFx2YXJ7bGVmdH0sIFx2YXJ7dG9wfSwgXHZhcntyaWdodH0sIFx2YXJ7Ym90dG9tfSl9Ci10dXBsZSBzdWl0YWJsZSBmb3IgY3JlYXRpb24gb2YgYSB3aW5kb3cgb2YgZ2l2ZW4gd2lkdGggYW5kIGhlaWdodC4gVGhlCi13aW5kb3cgd2lsbCBiZSBzdGFnZ2VyZWQgd2l0aCByZXNwZWN0IHRvIHByZXZpb3VzIHdpbmRvd3MsIGFuZCBhbgotYXR0ZW1wdCBpcyBtYWRlIHRvIGtlZXAgdGhlIHdob2xlIHdpbmRvdyBvbi1zY3JlZW4uIEhvd2V2ZXIsIHRoZSB3aW5kb3cgd2lsbAotaG93ZXZlciBhbHdheXMgYmUgdGhlIGV4YWN0IHNpemUgZ2l2ZW4sIHNvIHBhcnRzIG1heSBiZSBvZmZzY3JlZW4uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NldHdhdGNoY3Vyc29yfXt9Ci1TZXQgdGhlIG1vdXNlIGN1cnNvciB0byBhIHdhdGNoLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzZXRhcnJvd2N1cnNvcn17fQotU2V0IHRoZSBtb3VzZSBjdXJzb3IgdG8gYW4gYXJyb3cuCi1cZW5ke2Z1bmNkZXNjfQotCi0KLVxzdWJzZWN0aW9ue0FwcGxpY2F0aW9uIE9iamVjdHMgXGxhYmVse2FwcGxpY2F0aW9uLW9iamVjdHN9fQotCi1BcHBsaWNhdGlvbiBvYmplY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzLCBhbW9uZyBvdGhlcnM6Ci0KLQotXGJlZ2lue21ldGhvZGRlc2N9W0FwcGxpY2F0aW9uXXttYWtldXNlcm1lbnVzfXt9Ci1PdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB5b3UgbmVlZCBtZW51cyBpbiB5b3VyIGFwcGxpY2F0aW9uLiBBcHBlbmQgdGhlCi1tZW51cyB0byB0aGUgYXR0cmlidXRlIFxtZW1iZXJ7bWVudWJhcn0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtBcHBsaWNhdGlvbl17Z2V0YWJvdXR0ZXh0fXt9Ci1PdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZXR1cm4gYSB0ZXh0IHN0cmluZyBkZXNjcmliaW5nIHlvdXIKLWFwcGxpY2F0aW9uLiAgQWx0ZXJuYXRpdmVseSwgb3ZlcnJpZGUgdGhlIFxtZXRob2R7ZG9fYWJvdXQoKX0gbWV0aG9kCi1mb3IgbW9yZSBlbGFib3JhdGUgYGBhYm91dCcnIG1lc3NhZ2VzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQXBwbGljYXRpb25de21haW5sb29wfXtcb3B0aW9uYWx7bWFza1xvcHRpb25hbHssIHdhaXR9fX0KLVRoaXMgcm91dGluZSBpcyB0aGUgbWFpbiBldmVudCBsb29wLCBjYWxsIGl0IHRvIHNldCB5b3VyIGFwcGxpY2F0aW9uCi1yb2xsaW5nLiBcdmFye01hc2t9IGlzIHRoZSBtYXNrIG9mIGV2ZW50cyB5b3Ugd2FudCB0byBoYW5kbGUsCi1cdmFye3dhaXR9IGlzIHRoZSBudW1iZXIgb2YgdGlja3MgeW91IHdhbnQgdG8gbGVhdmUgdG8gb3RoZXIKLWNvbmN1cnJlbnQgYXBwbGljYXRpb24gKGRlZmF1bHQgMCwgd2hpY2ggaXMgcHJvYmFibHkgbm90IGEgZ29vZAotaWRlYSkuIFdoaWxlIHJhaXNpbmcgXHZhcntzZWxmfSB0byBleGl0IHRoZSBtYWlubG9vcCBpcyBzdGlsbAotc3VwcG9ydGVkIGl0IGlzIG5vdCByZWNvbW1lbmRlZDogY2FsbCBcY29kZXtzZWxmLl9xdWl0KCl9IGluc3RlYWQuCi0KLVRoZSBldmVudCBsb29wIGlzIHNwbGl0IGludG8gbWFueSBzbWFsbCBwYXJ0cywgZWFjaCBvZiB3aGljaCBjYW4gYmUKLW92ZXJyaWRkZW4uIFRoZSBkZWZhdWx0IG1ldGhvZHMgdGFrZSBjYXJlIG9mIGRpc3BhdGNoaW5nIGV2ZW50cyB0bwotd2luZG93cyBhbmQgZGlhbG9ncywgaGFuZGxpbmcgZHJhZ3MgYW5kIHJlc2l6ZXMsIEFwcGxlIEV2ZW50cywgZXZlbnRzCi1mb3Igbm9uLUZyYW1lV29yayB3aW5kb3dzLCBldGMuCi0KLUluIGdlbmVyYWwsIGFsbCBldmVudCBoYW5kbGVycyBzaG91bGQgcmV0dXJuIFxjb2RlezF9IGlmIHRoZSBldmVudCBpcyBmdWxseQotaGFuZGxlZCBhbmQgXGNvZGV7MH0gb3RoZXJ3aXNlIChiZWNhdXNlIHRoZSBmcm9udCB3aW5kb3cgd2FzIG5vdCBhIEZyYW1lV29yawotd2luZG93LCBmb3IgaW5zdGFuY2UpLiBUaGlzIGlzIG5lZWRlZCBzbyB0aGF0IHVwZGF0ZSBldmVudHMgYW5kIHN1Y2gKLWNhbiBiZSBwYXNzZWQgb24gdG8gb3RoZXIgd2luZG93cyBsaWtlIHRoZSBTaW91eCBjb25zb2xlIHdpbmRvdy4KLUNhbGxpbmcgXGZ1bmN0aW9ue01hY09TLkhhbmRsZUV2ZW50KCl9IGlzIG5vdCBhbGxvd2VkIHdpdGhpbgotXHZhcntvdXJfZGlzcGF0Y2h9IG9yIGl0cyBjYWxsZWVzLCBzaW5jZSB0aGlzIG1heSByZXN1bHQgaW4gYW4KLWluZmluaXRlIGxvb3AgaWYgdGhlIGNvZGUgaXMgY2FsbGVkIHRocm91Z2ggdGhlIFB5dGhvbiBpbm5lci1sb29wCi1ldmVudCBoYW5kbGVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQXBwbGljYXRpb25de2FzeW5jZXZlbnRzfXtvbm9mZn0KLUNhbGwgdGhpcyBtZXRob2Qgd2l0aCBhIG5vbnplcm8gcGFyYW1ldGVyIHRvIGVuYWJsZQotYXN5bmNocm9ub3VzIGV2ZW50IGhhbmRsaW5nLiBUaGlzIHdpbGwgdGVsbCB0aGUgaW5uZXIgaW50ZXJwcmV0ZXIgbG9vcAotdG8gY2FsbCB0aGUgYXBwbGljYXRpb24gZXZlbnQgaGFuZGxlciBcdmFye2FzeW5jX2Rpc3BhdGNofSB3aGVuZXZlciBldmVudHMKLWFyZSBhdmFpbGFibGUuIFRoaXMgd2lsbCBjYXVzZSBGcmFtZVdvcmsgd2luZG93IHVwZGF0ZXMgYW5kIHRoZSB1c2VyCi1pbnRlcmZhY2UgdG8gcmVtYWluIHdvcmtpbmcgZHVyaW5nIGxvbmcgY29tcHV0YXRpb25zLCBidXQgd2lsbCBzbG93IHRoZQotaW50ZXJwcmV0ZXIgZG93biBhbmQgbWF5IGNhdXNlIHN1cnByaXNpbmcgcmVzdWx0cyBpbiBub24tcmVlbnRyYW50IGNvZGUKLShzdWNoIGFzIEZyYW1lV29yayBpdHNlbGYpLiBCeSBkZWZhdWx0IFx2YXJ7YXN5bmNfZGlzcGF0Y2h9IHdpbGwgaW1tZWRpYXRlbHkKLWNhbGwgXHZhcntvdXJfZGlzcGF0Y2h9IGJ1dCB5b3UgbWF5IG92ZXJyaWRlIHRoaXMgdG8gaGFuZGxlIG9ubHkgY2VydGFpbgotZXZlbnRzIGFzeW5jaHJvbm91c2x5LiBFdmVudHMgeW91IGRvIG5vdCBoYW5kbGUgd2lsbCBiZSBwYXNzZWQgdG8gU2lvdXgKLWFuZCBzdWNoLgotCi1UaGUgb2xkIG9uL29mZiB2YWx1ZSBpcyByZXR1cm5lZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0FwcGxpY2F0aW9uXXtfcXVpdH17fQotVGVybWluYXRlIHRoZSBydW5uaW5nIFxtZXRob2R7bWFpbmxvb3AoKX0gY2FsbCBhdCB0aGUgbmV4dCBjb252ZW5pZW50Ci1tb21lbnQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtBcHBsaWNhdGlvbl17ZG9fY2hhcn17YywgZXZlbnR9Ci1UaGUgdXNlciB0eXBlZCBjaGFyYWN0ZXIgXHZhcntjfS4gVGhlIGNvbXBsZXRlIGRldGFpbHMgb2YgdGhlIGV2ZW50Ci1jYW4gYmUgZm91bmQgaW4gdGhlIFx2YXJ7ZXZlbnR9IHN0cnVjdHVyZS4gVGhpcyBtZXRob2QgY2FuIGFsc28gYmUKLXByb3ZpZGVkIGluIGEgXGNvZGV7V2luZG93fSBvYmplY3QsIHdoaWNoIG92ZXJyaWRlcyB0aGUKLWFwcGxpY2F0aW9uLXdpZGUgaGFuZGxlciBpZiB0aGUgd2luZG93IGlzIGZyb250bW9zdC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0FwcGxpY2F0aW9uXXtkb19kaWFsb2dldmVudH17ZXZlbnR9Ci1DYWxsZWQgZWFybHkgaW4gdGhlIGV2ZW50IGxvb3AgdG8gaGFuZGxlIG1vZGVsZXNzIGRpYWxvZyBldmVudHMuIFRoZQotZGVmYXVsdCBtZXRob2Qgc2ltcGx5IGRpc3BhdGNoZXMgdGhlIGV2ZW50IHRvIHRoZSByZWxldmFudCBkaWFsb2cgKG5vdAotdGhyb3VnaCB0aGUgXGNvZGV7RGlhbG9nV2luZG93fSBvYmplY3QgaW52b2x2ZWQpLiBPdmVycmlkZSBpZiB5b3UKLW5lZWQgc3BlY2lhbCBoYW5kbGluZyBvZiBkaWFsb2cgZXZlbnRzIChrZXlib2FyZCBzaG9ydGN1dHMsIGV0YykuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtBcHBsaWNhdGlvbl17aWRsZX17ZXZlbnR9Ci1DYWxsZWQgYnkgdGhlIG1haW4gZXZlbnQgbG9vcCB3aGVuIG5vIGV2ZW50cyBhcmUgYXZhaWxhYmxlLiBUaGUKLW51bGwtZXZlbnQgaXMgcGFzc2VkIChzbyB5b3UgY2FuIGxvb2sgYXQgbW91c2UgcG9zaXRpb24sIGV0YykuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLQotXHN1YnNlY3Rpb257V2luZG93IE9iamVjdHMgXGxhYmVse3dpbmRvdy1vYmplY3RzfX0KLQotV2luZG93IG9iamVjdHMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHMsIGFtb25nIG90aGVyczoKLQotXGJlZ2lue21ldGhvZGRlc2N9W1dpbmRvd117b3Blbn17fQotT3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gb3BlbiBhIHdpbmRvdy4gU3RvcmUgdGhlIE1hY09TIHdpbmRvdy1pZCBpbgotXG1lbWJlcntzZWxmLndpZH0gYW5kIGNhbGwgdGhlIFxtZXRob2R7ZG9fcG9zdG9wZW4oKX0gbWV0aG9kIHRvCi1yZWdpc3RlciB0aGUgd2luZG93IHdpdGggdGhlIHBhcmVudCBhcHBsaWNhdGlvbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1dpbmRvd117Y2xvc2V9e30KLU92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGRvIGFueSBzcGVjaWFsIHByb2Nlc3Npbmcgb24gd2luZG93Ci1jbG9zZS4gQ2FsbCB0aGUgXG1ldGhvZHtkb19wb3N0Y2xvc2UoKX0gbWV0aG9kIHRvIGNsZWFudXAgdGhlIHBhcmVudAotc3RhdGUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtXaW5kb3dde2RvX3Bvc3RyZXNpemV9e3dpZHRoLCBoZWlnaHQsIG1hY29zd2luZG93aWR9Ci1DYWxsZWQgYWZ0ZXIgdGhlIHdpbmRvdyBpcyByZXNpemVkLiBPdmVycmlkZSBpZiBtb3JlIG5lZWRzIHRvIGJlIGRvbmUKLXRoYW4gY2FsbGluZyBcY29kZXtJbnZhbFJlY3R9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bV2luZG93XXtkb19jb250ZW50Y2xpY2t9e2xvY2FsLCBtb2RpZmllcnMsIGV2ZW50fQotVGhlIHVzZXIgY2xpY2tlZCBpbiB0aGUgY29udGVudCBwYXJ0IG9mIGEgd2luZG93LiBUaGUgYXJndW1lbnRzIGFyZQotdGhlIGNvb3JkaW5hdGVzICh3aW5kb3ctcmVsYXRpdmUpLCB0aGUga2V5IG1vZGlmaWVycyBhbmQgdGhlIHJhdwotZXZlbnQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtXaW5kb3dde2RvX3VwZGF0ZX17bWFjb3N3aW5kb3dpZCwgZXZlbnR9Ci1BbiB1cGRhdGUgZXZlbnQgZm9yIHRoZSB3aW5kb3cgd2FzIHJlY2VpdmVkLiBSZWRyYXcgdGhlIHdpbmRvdy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1dpbmRvd117ZG9fYWN0aXZhdGV9e2FjdGl2YXRlLCBldmVudH0KLVRoZSB3aW5kb3cgd2FzIGFjdGl2YXRlZCAoXGNvZGV7XHZhcnthY3RpdmF0ZX0gPT0gMX0pIG9yIGRlYWN0aXZhdGVkCi0oXGNvZGV7XHZhcnthY3RpdmF0ZX0gPT0gMH0pLiBIYW5kbGUgdGhpbmdzIGxpa2UgZm9jdXMgaGlnaGxpZ2h0aW5nLAotZXRjLgotXGVuZHttZXRob2RkZXNjfQotCi0KLVxzdWJzZWN0aW9ue0NvbnRyb2xzV2luZG93IE9iamVjdCBcbGFiZWx7Y29udHJvbHN3aW5kb3ctb2JqZWN0fX0KLQotQ29udHJvbHNXaW5kb3cgb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBiZXNpZGVzIHRob3NlIG9mCi1cY29kZXtXaW5kb3d9IG9iamVjdHM6Ci0KLQotXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRyb2xzV2luZG93XXtkb19jb250cm9saGl0fXt3aW5kb3csIGNvbnRyb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjb2RlLCBldmVudH0KLVBhcnQgXHZhcntwY29kZX0gb2YgY29udHJvbCBcdmFye2NvbnRyb2x9IHdhcyBoaXQgYnkgdGhlCi11c2VyLiBUcmFja2luZyBhbmQgc3VjaCBoYXMgYWxyZWFkeSBiZWVuIHRha2VuIGNhcmUgb2YuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLQotXHN1YnNlY3Rpb257U2Nyb2xsZWRXaW5kb3cgT2JqZWN0IFxsYWJlbHtzY3JvbGxlZHdpbmRvdy1vYmplY3R9fQotCi1TY3JvbGxlZFdpbmRvdyBvYmplY3RzIGFyZSBDb250cm9sc1dpbmRvdyBvYmplY3RzIHdpdGggdGhlIGZvbGxvd2luZwotZXh0cmEgbWV0aG9kczoKLQotCi1cYmVnaW57bWV0aG9kZGVzY31bU2Nyb2xsZWRXaW5kb3dde3Njcm9sbGJhcnN9e1xvcHRpb25hbHt3YW50eFxvcHRpb25hbHssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnR5fX19Ci1DcmVhdGUgKG9yIGRlc3Ryb3kpIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIHNjcm9sbGJhcnMuIFRoZSBhcmd1bWVudHMKLXNwZWNpZnkgd2hpY2ggeW91IHdhbnQgKGRlZmF1bHQ6IGJvdGgpLiBUaGUgc2Nyb2xsYmFycyBhbHdheXMgaGF2ZQotbWluaW11bSBcY29kZXswfSBhbmQgbWF4aW11bSBcY29kZXszMjc2N30uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtTY3JvbGxlZFdpbmRvd117Z2V0c2Nyb2xsYmFydmFsdWVzfXt9Ci1Zb3UgbXVzdCBzdXBwbHkgdGhpcyBtZXRob2QuIEl0IHNob3VsZCByZXR1cm4gYSB0dXBsZSBcY29kZXsoXHZhcnt4fSwKLVx2YXJ7eX0pfSBnaXZpbmcgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIHNjcm9sbGJhcnMgKGJldHdlZW4KLVxjb2RlezB9IGFuZCBcY29kZXszMjc2N30pLiBZb3UgY2FuIHJldHVybiBcY29kZXtOb25lfSBmb3IgZWl0aGVyIHRvCi1pbmRpY2F0ZSB0aGUgd2hvbGUgZG9jdW1lbnQgaXMgdmlzaWJsZSBpbiB0aGF0IGRpcmVjdGlvbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1Njcm9sbGVkV2luZG93XXt1cGRhdGVzY3JvbGxiYXJzfXt9Ci1DYWxsIHRoaXMgbWV0aG9kIHdoZW4gdGhlIGRvY3VtZW50IGhhcyBjaGFuZ2VkLiBJdCB3aWxsIGNhbGwKLVxtZXRob2R7Z2V0c2Nyb2xsYmFydmFsdWVzKCl9IGFuZCB1cGRhdGUgdGhlIHNjcm9sbGJhcnMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtTY3JvbGxlZFdpbmRvd117c2Nyb2xsYmFyX2NhbGxiYWNrfXt3aGljaCwgd2hhdCwgdmFsdWV9Ci1TdXBwbGllZCBieSB5b3UgYW5kIGNhbGxlZCBhZnRlciB1c2VyIGludGVyYWN0aW9uLiBcdmFye3doaWNofSB3aWxsCi1iZSBcY29kZXsneCd9IG9yIFxjb2Rleyd5J30sIFx2YXJ7d2hhdH0gd2lsbCBiZSBcY29kZXsnLSd9LAotXGNvZGV7Jy0tJ30sIFxjb2RleydzZXQnfSwgXGNvZGV7JysrJ30gb3IgXGNvZGV7JysnfS4gRm9yCi1cY29kZXsnc2V0J30sIFx2YXJ7dmFsdWV9IHdpbGwgY29udGFpbiB0aGUgbmV3IHNjcm9sbGJhciBwb3NpdGlvbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1Njcm9sbGVkV2luZG93XXtzY2FsZWJhcnZhbHVlc317YWJzbWluLCBhYnNtYXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJtaW4sIGN1cm1heH0KLUF1eGlsaWFyeSBtZXRob2QgdG8gaGVscCB5b3UgY2FsY3VsYXRlIHZhbHVlcyB0byByZXR1cm4gZnJvbQotXG1ldGhvZHtnZXRzY3JvbGxiYXJ2YWx1ZXMoKX0uIFlvdSBwYXNzIGRvY3VtZW50IG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWUKLWFuZCB0b3Btb3N0IChsZWZ0bW9zdCkgYW5kIGJvdHRvbW1vc3QgKHJpZ2h0bW9zdCkgdmlzaWJsZSB2YWx1ZXMgYW5kCi1pdCByZXR1cm5zIHRoZSBjb3JyZWN0IG51bWJlciBvciBcY29kZXtOb25lfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1Njcm9sbGVkV2luZG93XXtkb19hY3RpdmF0ZX17b25vZmYsIGV2ZW50fQotVGFrZXMgY2FyZSBvZiBkaW1taW5nL2hpZ2hsaWdodGluZyBzY3JvbGxiYXJzIHdoZW4gYSB3aW5kb3cgYmVjb21lcwotZnJvbnRtb3N0LiBJZiB5b3Ugb3ZlcnJpZGUgdGhpcyBtZXRob2QsIGNhbGwgdGhpcyBvbmUgYXQgdGhlIGVuZCBvZgoteW91ciBtZXRob2QuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtTY3JvbGxlZFdpbmRvd117ZG9fcG9zdHJlc2l6ZX17d2lkdGgsIGhlaWdodCwgd2luZG93fQotTW92ZXMgc2Nyb2xsYmFycyB0byB0aGUgY29ycmVjdCBwb3NpdGlvbi4gQ2FsbCB0aGlzIG1ldGhvZCBpbml0aWFsbHkKLWlmIHlvdSBvdmVycmlkZSBpdC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1Njcm9sbGVkV2luZG93XXtkb19jb250cm9saGl0fXt3aW5kb3csIGNvbnRyb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjb2RlLCBldmVudH0KLUhhbmRsZXMgc2Nyb2xsYmFyIGludGVyYWN0aW9uLiBJZiB5b3Ugb3ZlcnJpZGUgaXQgY2FsbCB0aGlzIG1ldGhvZAotZmlyc3QsIGEgbm9uemVybyByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHRoZSBoaXQgd2FzIGluIHRoZSBzY3JvbGxiYXJzCi1hbmQgaGFzIGJlZW4gaGFuZGxlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cc3Vic2VjdGlvbntEaWFsb2dXaW5kb3cgT2JqZWN0cyBcbGFiZWx7ZGlhbG9nd2luZG93LW9iamVjdHN9fQotCi1EaWFsb2dXaW5kb3cgb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBiZXNpZGVzIHRob3NlIG9mCi1cY29kZXtXaW5kb3d9IG9iamVjdHM6Ci0KLQotXGJlZ2lue21ldGhvZGRlc2N9W0RpYWxvZ1dpbmRvd117b3Blbn17cmVzaWR9Ci1DcmVhdGUgdGhlIGRpYWxvZyB3aW5kb3csIGZyb20gdGhlIERMT0cgcmVzb3VyY2Ugd2l0aCBpZAotXHZhcntyZXNpZH0uIFRoZSBkaWFsb2cgb2JqZWN0IGlzIHN0b3JlZCBpbiBcbWVtYmVye3NlbGYud2lkfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0RpYWxvZ1dpbmRvd117ZG9faXRlbWhpdH17aXRlbSwgZXZlbnR9Ci1JdGVtIG51bWJlciBcdmFye2l0ZW19IHdhcyBoaXQuIFlvdSBhcmUgcmVzcG9uc2libGUgZm9yIHJlZHJhd2luZwotdG9nZ2xlIGJ1dHRvbnMsIGV0Yy4KLVxlbmR7bWV0aG9kZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9tYWMvbGliZ2Vuc3VpdGVtb2R1bGUudGV4IGIvRG9jL21hYy9saWJnZW5zdWl0ZW1vZHVsZS50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YWI1ODcuLjAwMDAwMDAKLS0tIGEvRG9jL21hYy9saWJnZW5zdWl0ZW1vZHVsZS50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle2dlbnN1aXRlbW9kdWxlfSAtLS0KLSAgICAgICAgIEdlbmVyYXRlIE9TQSBzdHViIHBhY2thZ2VzfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17Z2Vuc3VpdGVtb2R1bGV9Ci0gIFxwbGF0Zm9ybXtNYWN9Ci0lXG1vZHVsZWF1dGhvcntKYWNrIEphbnNlbj99e2VtYWlsfQotXG1vZHVsZXN5bm9wc2lze0NyZWF0ZSBhIHN0dWIgcGFja2FnZSBmcm9tIGFuIE9TQSBkaWN0aW9uYXJ5fQotXHNlY3Rpb25hdXRob3J7SmFjayBKYW5zZW59e0phY2suSmFuc2VuQGN3aS5ubH0KLQotVGhlIFxtb2R1bGV7Z2Vuc3VpdGVtb2R1bGV9IG1vZHVsZSBjcmVhdGVzIGEgUHl0aG9uIHBhY2thZ2UgaW1wbGVtZW50aW5nCi1zdHViIGNvZGUgZm9yIHRoZSBBcHBsZVNjcmlwdCBzdWl0ZXMgdGhhdCBhcmUgaW1wbGVtZW50ZWQgYnkgYSBzcGVjaWZpYwotYXBwbGljYXRpb24sIGFjY29yZGluZyB0byBpdHMgQXBwbGVTY3JpcHQgZGljdGlvbmFyeS4KLQotSXQgaXMgdXN1YWxseSBpbnZva2VkIGJ5IHRoZSB1c2VyIHRocm91Z2ggdGhlIFxwcm9ncmFte1B5dGhvbklERX0sIGJ1dAotaXQgY2FuIGFsc28gYmUgcnVuIGFzIGEgc2NyaXB0IGZyb20gdGhlIGNvbW1hbmQgbGluZSAocGFzcwotXGxvbmdwcm9ncmFtb3B0e2hlbHB9IGZvciBoZWxwIG9uIHRoZSBvcHRpb25zKSBvciBpbXBvcnRlZCBmcm9tIFB5dGhvbgotY29kZS4gRm9yIGFuIGV4YW1wbGUgb2YgaXRzIHVzZSBzZWUgXGZpbGV7TWFjL3NjcmlwdHMvZ2VuYWxsc3VpdGVzLnB5fQotaW4gYSBzb3VyY2UgZGlzdHJpYnV0aW9uLCB3aGljaCBnZW5lcmF0ZXMgdGhlIHN0dWIgcGFja2FnZXMgdGhhdCBhcmUKLWluY2x1ZGVkIGluIHRoZSBzdGFuZGFyZCBsaWJyYXJ5LgotCi1JdCBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgcHVibGljIGZ1bmN0aW9uczoKLQotXGJlZ2lue2Z1bmNkZXNjfXtpc19zY3JpcHRhYmxlfXthcHBsaWNhdGlvbn0KLVJldHVybnMgdHJ1ZSBpZiBcY29kZXthcHBsaWNhdGlvbn0sIHdoaWNoIHNob3VsZCBiZSBwYXNzZWQgYXMgYSBwYXRobmFtZSwKLWFwcGVhcnMgdG8gYmUgc2NyaXB0YWJsZS4gVGFrZSB0aGUgcmV0dXJuIHZhbHVlIHdpdGggYSBncmFpbiBvZiBzYWx0OgotXHByb2dyYW17SW50ZXJuZXQgRXhwbG9yZXJ9IGFwcGVhcnMgbm90IHRvIGJlIHNjcmlwdGFibGUgYnV0IGRlZmluaXRlbHkgaXMuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3Byb2Nlc3NmaWxlfXthcHBsaWNhdGlvblxvcHRpb25hbHssIG91dHB1dCwgYmFzZXBrZ25hbWUsIAotICAgICAgICBlZGl0X21vZG5hbWVzLCBjcmVhdG9yc2lnbmF0dXJlLCBkdW1wLCB2ZXJib3NlfX0KLUNyZWF0ZSBhIHN0dWIgcGFja2FnZSBmb3IgXGNvZGV7YXBwbGljYXRpb259LCB3aGljaCBzaG91bGQgYmUgcGFzc2VkIGFzCi1hIGZ1bGwgcGF0aG5hbWUuIEZvciBhIFxmaWxley5hcHB9IGJ1bmRsZSB0aGlzIGlzIHRoZSBwYXRobmFtZSB0byB0aGUKLWJ1bmRsZSwgbm90IHRvIHRoZSBleGVjdXRhYmxlIGluc2lkZSB0aGUgYnVuZGxlOyBmb3IgYW4gdW5idW5kbGVkIENGTQotYXBwbGljYXRpb24geW91IHBhc3MgdGhlIGZpbGVuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBiaW5hcnkuCi0KLVRoaXMgZnVuY3Rpb24gYXNrcyB0aGUgYXBwbGljYXRpb24gZm9yIGl0cyBPU0EgdGVybWlub2xvZ3kgcmVzb3VyY2VzLAotZGVjb2RlcyB0aGVzZSByZXNvdXJjZXMgYW5kIHVzZXMgdGhlIHJlc3VsdGFudCBkYXRhIHRvIGNyZWF0ZSB0aGUgUHl0aG9uCi1jb2RlIGZvciB0aGUgcGFja2FnZSBpbXBsZW1lbnRpbmcgdGhlIGNsaWVudCBzdHVicy4KLQotXGNvZGV7b3V0cHV0fSBpcyB0aGUgcGF0aG5hbWUgd2hlcmUgdGhlIHJlc3VsdGluZyBwYWNrYWdlIGlzIHN0b3JlZCwgaWYKLW5vdCBzcGVjaWZpZWQgYSBzdGFuZGFyZCAic2F2ZSBmaWxlIGFzIiBkaWFsb2cgaXMgcHJlc2VudGVkIHRvCi10aGUgdXNlci4gXGNvZGV7YmFzZXBrZ25hbWV9IGlzIHRoZSBiYXNlIHBhY2thZ2Ugb24gd2hpY2ggdGhpcyBwYWNrYWdlCi13aWxsIGJ1aWxkLCBhbmQgZGVmYXVsdHMgdG8gXG1vZHVsZXtTdGRTdWl0ZXN9LiBPbmx5IHdoZW4gZ2VuZXJhdGluZwotXG1vZHVsZXtTdGRTdWl0ZXN9IGl0c2VsZiBkbyB5b3UgbmVlZCB0byBzcGVjaWZ5IHRoaXMuCi1cY29kZXtlZGl0X21vZG5hbWVzfSBpcyBhIGRpY3Rpb25hcnkgdGhhdCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UKLW1vZHVsZW5hbWVzIHRoYXQgYXJlIHRvbyB1Z2x5IGFmdGVyIG5hbWUgbWFuZ2xpbmcuCi1cY29kZXtjcmVhdG9yX3NpZ25hdHVyZX0gY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIDQtY2hhciBjcmVhdG9yCi1jb2RlLCB3aGljaCBpcyBub3JtYWxseSBvYnRhaW5lZCBmcm9tIHRoZSBcZmlsZXtQa2dJbmZvfSBmaWxlIGluIHRoZQotcGFja2FnZSBvciBmcm9tIHRoZSBDRk0gZmlsZSBjcmVhdG9yIHNpZ25hdHVyZS4gV2hlbiBcY29kZXtkdW1wfSBpcwotZ2l2ZW4gaXQgc2hvdWxkIHJlZmVyIHRvIGEgZmlsZSBvYmplY3QsIGFuZCBcY29kZXtwcm9jZXNzZmlsZX0gd2lsbCBzdG9wCi1hZnRlciBkZWNvZGluZyB0aGUgcmVzb3VyY2VzIGFuZCBkdW1wIHRoZSBQeXRob24gcmVwcmVzZW50YXRpb24gb2YgdGhlCi10ZXJtaW5vbG9neSByZXNvdXJjZXMgdG8gdGhpcyBmaWxlLiBcY29kZXt2ZXJib3NlfSBzaG91bGQgYWxzbyBiZSBhIGZpbGUKLW9iamVjdCwgYW5kIHNwZWNpZnlpbmcgaXQgd2lsbCBjYXVzZSBcY29kZXtwcm9jZXNzZmlsZX0gdG8gdGVsbCB5b3Ugd2hhdAotaXQgaXMgZG9pbmcuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3Byb2Nlc3NmaWxlX2Zyb21yZXNvdXJjZX17YXBwbGljYXRpb25cb3B0aW9uYWx7LCBvdXRwdXQsIAotCWJhc2Vwa2duYW1lLCBlZGl0X21vZG5hbWVzLCBjcmVhdG9yc2lnbmF0dXJlLCBkdW1wLCB2ZXJib3NlfX0KLVRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgc2FtZSBhcyBcY29kZXtwcm9jZXNzZmlsZX0sIGV4Y2VwdCB0aGF0IGl0IHVzZXMgYQotZGlmZmVyZW50IG1ldGhvZCB0byBnZXQgdGhlIHRlcm1pbm9sb2d5IHJlc291cmNlcy4gSXQgb3BlbnMgXGNvZGV7YXBwbGljYXRpb259Ci1hcyBhIHJlc291cmNlIGZpbGUgYW5kIHJlYWRzIGFsbCBcY29kZXsiYWV0ZSJ9IGFuZCBcY29kZXsiYWV1dCJ9IHJlc291cmNlcwotZnJvbSB0aGlzIGZpbGUuCi1cZW5ke2Z1bmNkZXNjfQotCmRpZmYgLS1naXQgYS9Eb2MvbWFjL2xpYm1hYy50ZXggYi9Eb2MvbWFjL2xpYm1hYy50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZWNlOGQuLjAwMDAwMDAKLS0tIGEvRG9jL21hYy9saWJtYWMudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotCi1cc2VjdGlvbntcbW9kdWxle21hY3BhdGh9IC0tLQotICAgICAgICAgTWFjT1MgcGF0aCBtYW5pcHVsYXRpb24gZnVuY3Rpb25zfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17bWFjcGF0aH0KLSUgQ291bGQgYmUgbGFiZWxlZCBccGxhdGZvcm17TWFjfSwgYnV0IHRoZSBtb2R1bGUgc2hvdWxkIHdvcmsgYW55d2hlcmUgYW5kCi0lIGlzIGRpc3RyaWJ1dGVkIHdpdGggdGhlIHN0YW5kYXJkIGxpYnJhcnkuCi1cbW9kdWxlc3lub3BzaXN7TWFjT1MgcGF0aCBtYW5pcHVsYXRpb24gZnVuY3Rpb25zLn0KLQotCi1UaGlzIG1vZHVsZSBpcyB0aGUgTWFjIE9TIDkgKGFuZCBlYXJsaWVyKSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgXG1vZHVsZXtvcy5wYXRofQotbW9kdWxlLiBJdCBjYW4gYmUgdXNlZCB0byBtYW5pcHVsYXRlIG9sZC1zdHlsZSBNYWNpbnRvc2ggcGF0aG5hbWVzIG9uIE1hYyBPUwotWCAob3IgYW55IG90aGVyIHBsYXRmb3JtKS4KLVJlZmVyIHRvIHRoZQotXGNpdGV0aXRsZVsuLi9saWIvbGliLmh0bWxde1B5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZX0gZm9yCi1kb2N1bWVudGF0aW9uIG9mIFxtb2R1bGV7b3MucGF0aH0uCi0KLVRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgaW4gdGhpcyBtb2R1bGU6Ci1cZnVuY3Rpb257bm9ybWNhc2UoKX0sCi1cZnVuY3Rpb257bm9ybXBhdGgoKX0sCi1cZnVuY3Rpb257aXNhYnMoKX0sCi1cZnVuY3Rpb257am9pbigpfSwKLVxmdW5jdGlvbntzcGxpdCgpfSwKLVxmdW5jdGlvbntpc2RpcigpfSwKLVxmdW5jdGlvbntpc2ZpbGUoKX0sCi1cZnVuY3Rpb257d2FsaygpfSwKLVxmdW5jdGlvbntleGlzdHMoKX0uCi1Gb3Igb3RoZXIgZnVuY3Rpb25zIGF2YWlsYWJsZSBpbiBcbW9kdWxle29zLnBhdGh9IGR1bW15IGNvdW50ZXJwYXJ0cwotYXJlIGF2YWlsYWJsZS4KZGlmZiAtLWdpdCBhL0RvYy9tYWMvbGlibWFjaWMudGV4IGIvRG9jL21hYy9saWJtYWNpYy50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MDA2ZjMuLjAwMDAwMDAKLS0tIGEvRG9jL21hYy9saWJtYWNpYy50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtpY30gLS0tCi0gICAgICAgICBBY2Nlc3MgdG8gSW50ZXJuZXQgQ29uZmlnfQotCi1cZGVjbGFyZW1vZHVsZXtidWlsdGlufXtpY30KLSAgXHBsYXRmb3Jte01hY30KLVxtb2R1bGVzeW5vcHNpc3tBY2Nlc3MgdG8gSW50ZXJuZXQgQ29uZmlnLn0KLQotCi1UaGlzIG1vZHVsZSBwcm92aWRlcyBhY2Nlc3MgdG8gdmFyaW91cyBpbnRlcm5ldC1yZWxhdGVkIHByZWZlcmVuY2VzCi1zZXQgdGhyb3VnaCBccHJvZ3JhbXtTeXN0ZW0gUHJlZmVyZW5jZXN9IG9yIHRoZSBccHJvZ3JhbXtGaW5kZXJ9LgotCi1UaGVyZSBpcyBhIGxvdy1sZXZlbCBjb21wYW5pb24gbW9kdWxlCi1cbW9kdWxle2ljZ2x1ZX1ccmVmYmltb2RpbmRleHtpY2dsdWV9IHdoaWNoIHByb3ZpZGVzIHRoZSBiYXNpYwotSW50ZXJuZXQgQ29uZmlnIGFjY2VzcyBmdW5jdGlvbmFsaXR5LiAgVGhpcyBsb3ctbGV2ZWwgbW9kdWxlIGlzIG5vdAotZG9jdW1lbnRlZCwgYnV0IHRoZSBkb2NzdHJpbmdzIG9mIHRoZSByb3V0aW5lcyBkb2N1bWVudCB0aGUgcGFyYW1ldGVycwotYW5kIHRoZSByb3V0aW5lIG5hbWVzIGFyZSB0aGUgc2FtZSBhcyBmb3IgdGhlIFBhc2NhbCBvciBcQ3t9IEFQSSB0bwotSW50ZXJuZXQgQ29uZmlnLCBzbyB0aGUgc3RhbmRhcmQgSUMgcHJvZ3JhbW1lcnMnIGRvY3VtZW50YXRpb24gY2FuIGJlCi11c2VkIGlmIHRoaXMgbW9kdWxlIGlzIG5lZWRlZC4KLQotVGhlIFxtb2R1bGV7aWN9IG1vZHVsZSBkZWZpbmVzIHRoZSBcZXhjZXB0aW9ue2Vycm9yfSBleGNlcHRpb24gYW5kCi1zeW1ib2xpYyBuYW1lcyBmb3IgYWxsIGVycm9yIGNvZGVzIEludGVybmV0IENvbmZpZyBjYW4gcHJvZHVjZTsgc2VlCi10aGUgc291cmNlIGZvciBkZXRhaWxzLgotCi1cYmVnaW57ZXhjZGVzY317ZXJyb3J9Ci1FeGNlcHRpb24gcmFpc2VkIG9uIGVycm9ycyBpbiB0aGUgXG1vZHVsZXtpY30gbW9kdWxlLgotXGVuZHtleGNkZXNjfQotCi0KLVRoZSBcbW9kdWxle2ljfSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGNsYXNzIGFuZCBmdW5jdGlvbjoKLQotXGJlZ2lue2NsYXNzZGVzY317SUN9e1xvcHRpb25hbHtzaWduYXR1cmVcb3B0aW9uYWx7LCBpY319fQotQ3JlYXRlIGFuIEludGVybmV0IENvbmZpZyBvYmplY3QuIFRoZSBzaWduYXR1cmUgaXMgYSA0LWNoYXJhY3RlciBjcmVhdG9yCi1jb2RlIG9mIHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uIChkZWZhdWx0IFxjb2RleydQeXRoJ30pIHdoaWNoIG1heQotaW5mbHVlbmNlIHNvbWUgb2YgSUNzIHNldHRpbmdzLiBUaGUgb3B0aW9uYWwgXHZhcntpY30gYXJndW1lbnQgaXMgYQotbG93LWxldmVsIFxjb2Rle2ljZ2x1ZS5pY2luc3RhbmNlfSBjcmVhdGVkIGJlZm9yZWhhbmQsIHRoaXMgbWF5IGJlCi11c2VmdWwgaWYgeW91IHdhbnQgdG8gZ2V0IHByZWZlcmVuY2VzIGZyb20gYSBkaWZmZXJlbnQgY29uZmlnIGZpbGUsCi1ldGMuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtsYXVuY2h1cmx9e3VybFxvcHRpb25hbHssIGhpbnR9fQotXGZ1bmNsaW5le3BhcnNldXJsfXtkYXRhXG9wdGlvbmFseywgc3RhcnRcb3B0aW9uYWx7LCBlbmRcb3B0aW9uYWx7LCBoaW50fX19fQotXGZ1bmNsaW5le21hcGZpbGV9e2ZpbGV9Ci1cZnVuY2xpbmV7bWFwdHlwZWNyZWF0b3J9e3R5cGUsIGNyZWF0b3Jcb3B0aW9uYWx7LCBmaWxlbmFtZX19Ci1cZnVuY2xpbmV7c2V0dHlwZWNyZWF0b3J9e2ZpbGV9Ci1UaGVzZSBmdW5jdGlvbnMgYXJlIGBgc2hvcnRjdXRzJycgdG8gdGhlIG1ldGhvZHMgb2YgdGhlIHNhbWUgbmFtZSwKLWRlc2NyaWJlZCBiZWxvdy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotXHN1YnNlY3Rpb257SUMgT2JqZWN0c30KLQotXGNsYXNze0lDfSBvYmplY3RzIGhhdmUgYSBtYXBwaW5nIGludGVyZmFjZSwgaGVuY2UgdG8gb2J0YWluIHRoZSBtYWlsCi1hZGRyZXNzIHlvdSBzaW1wbHkgZ2V0IFxjb2Rle1x2YXJ7aWN9WydNYWlsQWRkcmVzcyddfS4gQXNzaWdubWVudCBhbHNvCi13b3JrcywgYW5kIGNoYW5nZXMgdGhlIG9wdGlvbiBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgotCi1UaGUgbW9kdWxlIGtub3dzIGFib3V0IHZhcmlvdXMgZGF0YXR5cGVzLCBhbmQgY29udmVydHMgdGhlIGludGVybmFsIElDCi1yZXByZXNlbnRhdGlvbiB0byBhIGBgbG9naWNhbCcnIFB5dGhvbiBkYXRhIHN0cnVjdHVyZS4gUnVubmluZyB0aGUKLVxtb2R1bGV7aWN9IG1vZHVsZSBzdGFuZGFsb25lIHdpbGwgcnVuIGEgdGVzdCBwcm9ncmFtIHRoYXQgbGlzdHMgYWxsCi1rZXlzIGFuZCB2YWx1ZXMgaW4geW91ciBJQyBkYXRhYmFzZSwgdGhpcyB3aWxsIGhhdmUgdG8gc2VydmUgYXMKLWRvY3VtZW50YXRpb24uCi0KLUlmIHRoZSBtb2R1bGUgZG9lcyBub3Qga25vdyBob3cgdG8gcmVwcmVzZW50IHRoZSBkYXRhIGl0IHJldHVybnMgYW4KLWluc3RhbmNlIG9mIHRoZSBcY29kZXtJQ09wYXF1ZURhdGF9IHR5cGUsIHdpdGggdGhlIHJhdyBkYXRhIGluIGl0cwotXG1lbWJlcntkYXRhfSBhdHRyaWJ1dGUuIE9iamVjdHMgb2YgdGhpcyB0eXBlIGFyZSBhbHNvIGFjY2VwdGFibGUgdmFsdWVzCi1mb3IgYXNzaWdubWVudC4KLQotQmVzaWRlcyB0aGUgZGljdGlvbmFyeSBpbnRlcmZhY2UsIFxjbGFzc3tJQ30gb2JqZWN0cyBoYXZlIHRoZQotZm9sbG93aW5nIG1ldGhvZHM6Ci0KLQotXGJlZ2lue21ldGhvZGRlc2N9W0lDXXtsYXVuY2h1cmx9e3VybFxvcHRpb25hbHssIGhpbnR9fQotUGFyc2UgdGhlIGdpdmVuIFVSTCwgbGF1bmNoIHRoZSBjb3JyZWN0IGFwcGxpY2F0aW9uIGFuZCBwYXNzIGl0IHRoZQotVVJMLiBUaGUgb3B0aW9uYWwgXHZhcntoaW50fSBjYW4gYmUgYSBzY2hlbWUgbmFtZSBzdWNoIGFzCi1cY29kZXsnbWFpbHRvOid9LCBpbiB3aGljaCBjYXNlIGluY29tcGxldGUgVVJMcyBhcmUgY29tcGxldGVkIHdpdGggdGhpcwotc2NoZW1lLiAgSWYgXHZhcntoaW50fSBpcyBub3QgcHJvdmlkZWQsIGluY29tcGxldGUgVVJMcyBhcmUgaW52YWxpZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0lDXXtwYXJzZXVybH17ZGF0YVxvcHRpb25hbHssIHN0YXJ0XG9wdGlvbmFseywgZW5kXG9wdGlvbmFseywgaGludH19fX0KLUZpbmQgYW4gVVJMIHNvbWV3aGVyZSBpbiBcdmFye2RhdGF9IGFuZCByZXR1cm4gc3RhcnQgcG9zaXRpb24sIGVuZAotcG9zaXRpb24gYW5kIHRoZSBVUkwuIFRoZSBvcHRpb25hbCBcdmFye3N0YXJ0fSBhbmQgXHZhcntlbmR9IGNhbiBiZQotdXNlZCB0byBsaW1pdCB0aGUgc2VhcmNoLCBzbyBmb3IgaW5zdGFuY2UgaWYgYSB1c2VyIGNsaWNrcyBpbiBhIGxvbmcKLXRleHQgZmllbGQgeW91IGNhbiBwYXNzIHRoZSB3aG9sZSB0ZXh0IGZpZWxkIGFuZCB0aGUgY2xpY2stcG9zaXRpb24gaW4KLVx2YXJ7c3RhcnR9IGFuZCB0aGlzIHJvdXRpbmUgd2lsbCByZXR1cm4gdGhlIHdob2xlIFVSTCBpbiB3aGljaCB0aGUKLXVzZXIgY2xpY2tlZC4gIEFzIGFib3ZlLCBcdmFye2hpbnR9IGlzIGFuIG9wdGlvbmFsIHNjaGVtZSB1c2VkIHRvCi1jb21wbGV0ZSBpbmNvbXBsZXRlIFVSTHMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtJQ117bWFwZmlsZX17ZmlsZX0KLVJldHVybiB0aGUgbWFwcGluZyBlbnRyeSBmb3IgdGhlIGdpdmVuIFx2YXJ7ZmlsZX0sIHdoaWNoIGNhbiBiZSBwYXNzZWQKLWFzIGVpdGhlciBhIGZpbGVuYW1lIG9yIGFuIFxmdW5jdGlvbntGU1NwZWMoKX0gcmVzdWx0LCBhbmQgd2hpY2gKLW5lZWQgbm90IGV4aXN0LgotCi1UaGUgbWFwcGluZyBlbnRyeSBpcyByZXR1cm5lZCBhcyBhIHR1cGxlIFxjb2RleyhcdmFye3ZlcnNpb259LAotXHZhcnt0eXBlfSwgXHZhcntjcmVhdG9yfSwgXHZhcntwb3N0Y3JlYXRvcn0sIFx2YXJ7ZmxhZ3N9LAotXHZhcntleHRlbnNpb259LCBcdmFye2FwcG5hbWV9LCBcdmFye3Bvc3RhcHBuYW1lfSwgXHZhcnttaW1ldHlwZX0sCi1cdmFye2VudHJ5bmFtZX0pfSwgd2hlcmUgXHZhcnt2ZXJzaW9ufSBpcyB0aGUgZW50cnkgdmVyc2lvbgotbnVtYmVyLCBcdmFye3R5cGV9IGlzIHRoZSA0LWNoYXJhY3RlciBmaWxldHlwZSwgXHZhcntjcmVhdG9yfSBpcyB0aGUKLTQtY2hhcmFjdGVyIGNyZWF0b3IgdHlwZSwgXHZhcntwb3N0Y3JlYXRvcn0gaXMgdGhlIDQtY2hhcmFjdGVyIGNyZWF0b3IKLWNvZGUgb2YgYW4KLW9wdGlvbmFsIGFwcGxpY2F0aW9uIHRvIHBvc3QtcHJvY2VzcyB0aGUgZmlsZSBhZnRlciBkb3dubG9hZGluZywKLVx2YXJ7ZmxhZ3N9IGFyZSB2YXJpb3VzIGJpdHMgc3BlY2lmeWluZyB3aGV0aGVyIHRvIHRyYW5zZmVyIGluIGJpbmFyeQotb3IgYXNjaWkgYW5kIHN1Y2gsIFx2YXJ7ZXh0ZW5zaW9ufSBpcyB0aGUgZmlsZW5hbWUgZXh0ZW5zaW9uIGZvciB0aGlzCi1maWxlIHR5cGUsIFx2YXJ7YXBwbmFtZX0gaXMgdGhlIHByaW50YWJsZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiB0bwotd2hpY2ggdGhpcyBmaWxlIGJlbG9uZ3MsIFx2YXJ7cG9zdGFwcG5hbWV9IGlzIHRoZSBuYW1lIG9mIHRoZQotcG9zdHByb2Nlc3NpbmcgYXBwbGljYXRpb24sIFx2YXJ7bWltZXR5cGV9IGlzIHRoZSBNSU1FIHR5cGUgb2YgdGhpcwotZmlsZSBhbmQgXHZhcntlbnRyeW5hbWV9IGlzIHRoZSBuYW1lIG9mIHRoaXMgZW50cnkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtJQ117bWFwdHlwZWNyZWF0b3J9e3R5cGUsIGNyZWF0b3Jcb3B0aW9uYWx7LCBmaWxlbmFtZX19Ci1SZXR1cm4gdGhlIG1hcHBpbmcgZW50cnkgZm9yIGZpbGVzIHdpdGggZ2l2ZW4gNC1jaGFyYWN0ZXIgXHZhcnt0eXBlfSBhbmQKLVx2YXJ7Y3JlYXRvcn0gY29kZXMuIFRoZSBvcHRpb25hbCBcdmFye2ZpbGVuYW1lfSBtYXkgYmUgc3BlY2lmaWVkIHRvCi1mdXJ0aGVyIGhlbHAgZmluZGluZyB0aGUgY29ycmVjdCBlbnRyeSAoaWYgdGhlIGNyZWF0b3IgY29kZSBpcwotXGNvZGV7Jz8/Pz8nfSwgZm9yIGluc3RhbmNlKS4KLQotVGhlIG1hcHBpbmcgZW50cnkgaXMgcmV0dXJuZWQgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIGZvciBcdmFye21hcGZpbGV9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bSUNde3NldHR5cGVjcmVhdG9yfXtmaWxlfQotR2l2ZW4gYW4gZXhpc3RpbmcgXHZhcntmaWxlfSwgc3BlY2lmaWVkIGVpdGhlciBhcyBhIGZpbGVuYW1lIG9yIGFzIGFuCi1cZnVuY3Rpb257RlNTcGVjKCl9IHJlc3VsdCwgc2V0IGl0cyBjcmVhdG9yIGFuZCB0eXBlIGNvcnJlY3RseSBiYXNlZAotb24gaXRzIGV4dGVuc2lvbi4gIFRoZSBmaW5kZXIgaXMgdG9sZCBhYm91dCB0aGUgY2hhbmdlLCBzbyB0aGUgZmluZGVyCi1pY29uIHdpbGwgYmUgdXBkYXRlZCBxdWlja2x5LgotXGVuZHttZXRob2RkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL21hYy9saWJtYWNvcy50ZXggYi9Eb2MvbWFjL2xpYm1hY29zLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUwYjk5Yi4uMDAwMDAwMAotLS0gYS9Eb2MvbWFjL2xpYm1hY29zLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7TWFjT1N9IC0tLQotICAgICAgICAgQWNjZXNzIHRvIE1hYyBPUyBpbnRlcnByZXRlciBmZWF0dXJlc30KLQotXGRlY2xhcmVtb2R1bGV7YnVpbHRpbn17TWFjT1N9Ci0gIFxwbGF0Zm9ybXtNYWN9Ci1cbW9kdWxlc3lub3BzaXN7QWNjZXNzIHRvIE1hYyBPUy1zcGVjaWZpYyBpbnRlcnByZXRlciBmZWF0dXJlcy59Ci0KLQotVGhpcyBtb2R1bGUgcHJvdmlkZXMgYWNjZXNzIHRvIE1hY09TIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgaW4gdGhlCi1QeXRob24gaW50ZXJwcmV0ZXIsIHN1Y2ggYXMgaG93IHRoZSBpbnRlcnByZXRlciBldmVudGxvb3AgZnVuY3Rpb25zCi1hbmQgdGhlIGxpa2UuIFVzZSB3aXRoIGNhcmUuCi0KLU5vdGUgdGhlIGNhcGl0YWxpemF0aW9uIG9mIHRoZSBtb2R1bGUgbmFtZTsgdGhpcyBpcyBhIGhpc3RvcmljYWwKLWFydGlmYWN0LgotCi1cYmVnaW57ZGF0YWRlc2N9e3J1bnRpbWVtb2RlbH0KLUFsd2F5cyBcY29kZXsnbWFjaG8nfSwgZnJvbSBQeXRob24gMi40IG9uLgotSW4gZWFybGllciB2ZXJzaW9ucyBvZiBQeXRob24gdGhlIHZhbHVlIGNvdWxkCi1hbHNvIGJlIFxjb2RleydwcGMnfSBmb3IgdGhlIGNsYXNzaWMgTWFjIE9TIDggcnVudGltZSBtb2RlbCBvcgotXGNvZGV7J2NhcmJvbid9IGZvciB0aGUgTWFjIE9TIDkgcnVudGltZSBtb2RlbC4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317bGlua21vZGVsfQotVGhlIHdheSB0aGUgaW50ZXJwcmV0ZXIgaGFzIGJlZW4gbGlua2VkLiBBcyBleHRlbnNpb24gbW9kdWxlcyBtYXkgYmUKLWluY29tcGF0aWJsZSBiZXR3ZWVuIGxpbmtpbmcgbW9kZWxzLCBwYWNrYWdlcyBjb3VsZCB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBnaXZlCi1tb3JlIGRlY2VudCBlcnJvciBtZXNzYWdlcy4gVGhlIHZhbHVlIGlzIG9uZSBvZiBcY29kZXsnc3RhdGljJ30gZm9yIGEKLXN0YXRpY2FsbHkgbGlua2VkIFB5dGhvbiwgXGNvZGV7J2ZyYW1ld29yayd9IGZvciBQeXRob24gaW4gYSBNYWMgT1MgWCBmcmFtZXdvcmssCi1cY29kZXsnc2hhcmVkJ30gZm9yIFB5dGhvbiBpbiBhIHN0YW5kYXJkIFxVTklYe30gc2hhcmVkIGxpYnJhcnkuCi1PbGRlciBQeXRob25zIGNvdWxkIGFsc28gaGF2ZSB0aGUgdmFsdWUKLVxjb2RleydjZm0nfSBmb3IgTWFjIE9TIDktY29tcGF0aWJsZSBQeXRob24uCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317RXJyb3J9Ci1UaGlzIGV4Y2VwdGlvbiBpcyByYWlzZWQgb24gTWFjT1MgZ2VuZXJhdGVkIGVycm9ycywgZWl0aGVyIGZyb20KLWZ1bmN0aW9ucyBpbiB0aGlzIG1vZHVsZSBvciBmcm9tIG90aGVyIG1hYy1zcGVjaWZpYyBtb2R1bGVzIGxpa2UgdGhlCi10b29sYm94IGludGVyZmFjZXMuIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBpbnRlZ2VyIGVycm9yIGNvZGUgKHRoZQotXGNkYXRhe09TRXJyfSB2YWx1ZSkgYW5kIGEgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4KLVN5bWJvbGljIG5hbWVzIGZvciBhbGwga25vd24gZXJyb3IgY29kZXMgYXJlIGRlZmluZWQgaW4gdGhlIHN0YW5kYXJkCi1tb2R1bGUgXHJlZm1vZHVsZXttYWNlcnJvcnN9LlxyZWZzdG1vZGluZGV4e21hY2Vycm9yc30KLVxlbmR7ZXhjZGVzY30KLQotCi1cYmVnaW57ZnVuY2Rlc2N9e0dldEVycm9yU3RyaW5nfXtlcnJub30KLVJldHVybiB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiBNYWNPUyBlcnJvciBjb2RlIFx2YXJ7ZXJybm99LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtEZWJ1Z1N0cn17bWVzc2FnZSBcb3B0aW9uYWx7LCBvYmplY3R9fQotT24gTWFjIE9TIFggdGhlIHN0cmluZyBpcyBzaW1wbHkgcHJpbnRlZCB0byBzdGRlcnIgKG9uIG9sZGVyCi1NYWMgT1Mgc3lzdGVtcyBtb3JlIGVsYWJvcmF0ZSBmdW5jdGlvbmFsaXR5IHdhcyBhdmFpbGFibGUpLAotYnV0IGl0IHByb3ZpZGVzIGEgY29udmVuaWVudCBsb2NhdGlvbiB0byBhdHRhY2ggYSBicmVha3BvaW50Ci1pbiBhIGxvdy1sZXZlbCBkZWJ1Z2dlciBsaWtlIFxwcm9ncmFte2dkYn0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e1N5c0JlZXB9e30KLVJpbmcgdGhlIGJlbGwuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e0dldFRpY2tzfXt9Ci1HZXQgdGhlIG51bWJlciBvZiBjbG9jayB0aWNrcyAoMS82MHRoIG9mIGEgc2Vjb25kKSBzaW5jZSBzeXN0ZW0gYm9vdC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317R2V0Q3JlYXRvckFuZFR5cGV9e2ZpbGV9Ci1SZXR1cm4gdGhlIGZpbGUgY3JlYXRvciBhbmQgZmlsZSB0eXBlIGFzIHR3byBmb3VyLWNoYXJhY3RlciBzdHJpbmdzLgotVGhlIFx2YXJ7ZmlsZX0gcGFyYW1ldGVyIGNhbiBiZSBhIHBhdGhuYW1lIG9yIGFuIFxjb2Rle0ZTU3BlY30gb3IgCi1cY29kZXtGU1JlZn0gb2JqZWN0LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtTZXRDcmVhdG9yQW5kVHlwZX17ZmlsZSwgY3JlYXRvciwgdHlwZX0KLVNldCB0aGUgZmlsZSBjcmVhdG9yIGFuZCBmaWxlIHR5cGUuCi1UaGUgXHZhcntmaWxlfSBwYXJhbWV0ZXIgY2FuIGJlIGEgcGF0aG5hbWUgb3IgYW4gXGNvZGV7RlNTcGVjfSBvciAKLVxjb2Rle0ZTUmVmfSBvYmplY3QuIFx2YXJ7Y3JlYXRvcn0gYW5kIFx2YXJ7dHlwZX0gbXVzdCBiZSBmb3VyIGNoYXJhY3Rlcgotc3RyaW5ncy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317b3BlbnJmfXtuYW1lIFxvcHRpb25hbHssIG1vZGV9fQotT3BlbiB0aGUgcmVzb3VyY2UgZm9yayBvZiBhIGZpbGUuIEFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgZm9yIHRoZQotYnVpbHQtaW4gZnVuY3Rpb24gXGZ1bmN0aW9ue29wZW4oKX0uIFRoZSBvYmplY3QgcmV0dXJuZWQgaGFzIGZpbGUtbGlrZQotc2VtYW50aWNzLCBidXQgaXQgaXMgbm90IGEgUHl0aG9uIGZpbGUgb2JqZWN0LCBzbyB0aGVyZSBtYXkgYmUgc3VidGxlCi1kaWZmZXJlbmNlcy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317V01BdmFpbGFibGV9e30KLUNoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHByb2Nlc3MgaGFzIGFjY2VzcyB0byB0aGUgd2luZG93IG1hbmFnZXIuCi1UaGUgbWV0aG9kIHdpbGwgcmV0dXJuIFxjb2Rle0ZhbHNlfSBpZiB0aGUgd2luZG93IG1hbmFnZXIgaXMgbm90IGF2YWlsYWJsZSwKLWZvciBpbnN0YW5jZSB3aGVuIHJ1bm5pbmcgb24gTWFjIE9TIFggU2VydmVyIG9yIHdoZW4gbG9nZ2VkIGluIHZpYSBzc2gsCi1vciB3aGVuIHRoZSBjdXJyZW50IGludGVycHJldGVyIGlzIG5vdCBydW5uaW5nIGZyb20gYSBmdWxsYmxvd24gYXBwbGljYXRpb24KLWJ1bmRsZS4gQSBzY3JpcHQgcnVucyBmcm9tIGFuIGFwcGxpY2F0aW9uIGJ1bmRsZSBlaXRoZXIgd2hlbiBpdCBoYXMgYmVlbgotc3RhcnRlZCB3aXRoIFxwcm9ncmFte3B5dGhvbnd9IGluc3RlYWQgb2YgXHByb2dyYW17cHl0aG9ufSBvciB3aGVuIHJ1bm5pbmcgCi1hcyBhbiBhcHBsZXQuCi1cZW5ke2Z1bmNkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL21hYy9saWJtYWNvc3Rvb2xzLnRleCBiL0RvYy9tYWMvbGlibWFjb3N0b29scy50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NTQ4MTEuLjAwMDAwMDAKLS0tIGEvRG9jL21hYy9saWJtYWNvc3Rvb2xzLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle21hY29zdG9vbHN9IC0tLQotICAgICAgICAgQ29udmVuaWVuY2Ugcm91dGluZXMgZm9yIGZpbGUgbWFuaXB1bGF0aW9ufQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17bWFjb3N0b29sc30KLSAgXHBsYXRmb3Jte01hY30KLVxtb2R1bGVzeW5vcHNpc3tDb252ZW5pZW5jZSByb3V0aW5lcyBmb3IgZmlsZSBtYW5pcHVsYXRpb24ufQotCi0KLVRoaXMgbW9kdWxlIGNvbnRhaW5zIHNvbWUgY29udmVuaWVuY2Ugcm91dGluZXMgZm9yIGZpbGUtbWFuaXB1bGF0aW9uCi1vbiB0aGUgTWFjaW50b3NoLiBBbGwgZmlsZSBwYXJhbWV0ZXJzIGNhbiBiZSBzcGVjaWZpZWQgYXMKLXBhdGhuYW1lcywgXGNsYXNze0ZTUmVmfSBvciBcY2xhc3N7RlNTcGVjfSBvYmplY3RzLiAgVGhpcyBtb2R1bGUKLWV4cGVjdHMgYSBmaWxlc3lzdGVtIHdoaWNoIHN1cHBvcnRzIGZvcmtlZCBmaWxlcywgc28gaXQgc2hvdWxkIG5vdAotYmUgdXNlZCBvbiBVRlMgcGFydGl0aW9ucy4KLQotVGhlIFxtb2R1bGV7bWFjb3N0b29sc30gbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6Ci0KLQotXGJlZ2lue2Z1bmNkZXNjfXtjb3B5fXtzcmMsIGRzdFxvcHRpb25hbHssIGNyZWF0ZXBhdGhcb3B0aW9uYWx7LCBjb3B5dGltZXN9fX0KLUNvcHkgZmlsZSBcdmFye3NyY30gdG8gXHZhcntkc3R9LiAgSWYgXHZhcntjcmVhdGVwYXRofSBpcyBub24temVybwotdGhlIGZvbGRlcnMgbGVhZGluZyB0byBcdmFye2RzdH0gYXJlIGNyZWF0ZWQgaWYgbmVjZXNzYXJ5LgotVGhlIG1ldGhvZCBjb3BpZXMgZGF0YSBhbmQKLXJlc291cmNlIGZvcmsgYW5kIHNvbWUgZmluZGVyIGluZm9ybWF0aW9uIChjcmVhdG9yLCB0eXBlLCBmbGFncykgYW5kCi1vcHRpb25hbGx5IHRoZSBjcmVhdGlvbiwgbW9kaWZpY2F0aW9uIGFuZCBiYWNrdXAgdGltZXMgKGRlZmF1bHQgaXMgdG8KLWNvcHkgdGhlbSkuIEN1c3RvbSBpY29ucywgY29tbWVudHMgYW5kIGljb24gcG9zaXRpb24gYXJlIG5vdCBjb3BpZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2NvcHl0cmVlfXtzcmMsIGRzdH0KLVJlY3Vyc2l2ZWx5IGNvcHkgYSBmaWxlIHRyZWUgZnJvbSBcdmFye3NyY30gdG8gXHZhcntkc3R9LCBjcmVhdGluZwotZm9sZGVycyBhcyBuZWVkZWQuIFx2YXJ7c3JjfSBhbmQgXHZhcntkc3R9IHNob3VsZCBiZSBzcGVjaWZpZWQgYXMKLXBhdGhuYW1lcy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bWthbGlhc317c3JjLCBkc3R9Ci1DcmVhdGUgYSBmaW5kZXIgYWxpYXMgXHZhcntkc3R9IHBvaW50aW5nIHRvIFx2YXJ7c3JjfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dG91Y2hlZH17ZHN0fQotVGVsbCB0aGUgZmluZGVyIHRoYXQgc29tZSBiaXRzIG9mIGZpbmRlci1pbmZvcm1hdGlvbiBzdWNoIGFzIGNyZWF0b3IKLW9yIHR5cGUgZm9yIGZpbGUgXHZhcntkc3R9IGhhcyBjaGFuZ2VkLiBUaGUgZmlsZSBjYW4gYmUgc3BlY2lmaWVkIGJ5Ci1wYXRobmFtZSBvciBmc3NwZWMuIFRoaXMgY2FsbCBzaG91bGQgdGVsbCB0aGUgZmluZGVyIHRvIHJlZHJhdyB0aGUKLWZpbGVzIGljb24uCi1cZGVwcmVjYXRlZHsyLjZ9e1RoZSBmdW5jdGlvbiBpcyBhIG5vLW9wIG9uIE9TIFgufQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtCVUZTSVp9Ci1UaGUgYnVmZmVyIHNpemUgZm9yIFxjb2Rle2NvcHl9LCBkZWZhdWx0IDEgbWVnYWJ5dGUuCi1cZW5ke2RhdGFkZXNjfQotCi1Ob3RlIHRoYXQgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgZmluZGVyIGFsaWFzZXMgaXMgbm90IHNwZWNpZmllZCBpbgotdGhlIEFwcGxlIGRvY3VtZW50YXRpb24uIEhlbmNlLCBhbGlhc2VzIGNyZWF0ZWQgd2l0aCBcZnVuY3Rpb257bWthbGlhcygpfQotY291bGQgY29uY2VpdmFibHkgaGF2ZSBpbmNvbXBhdGlibGUgYmVoYXZpb3VyIGluIHNvbWUgY2FzZXMuCi0KLQotXHNlY3Rpb257XG1vZHVsZXtmaW5kZXJ0b29sc30gLS0tCi0gICAgICAgICBUaGUgXHByb2dyYW17ZmluZGVyfSdzIEFwcGxlIEV2ZW50cyBpbnRlcmZhY2V9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtmaW5kZXJ0b29sc30KLSAgXHBsYXRmb3Jte01hY30KLVxtb2R1bGVzeW5vcHNpc3tXcmFwcGVycyBhcm91bmQgdGhlIFxwcm9ncmFte2ZpbmRlcn0ncyBBcHBsZSBFdmVudHMgaW50ZXJmYWNlLn0KLQotCi1UaGlzIG1vZHVsZSBjb250YWlucyByb3V0aW5lcyB0aGF0IGdpdmUgUHl0aG9uIHByb2dyYW1zIGFjY2VzcyB0byBzb21lCi1mdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5IHRoZSBmaW5kZXIuIFRoZXkgYXJlIGltcGxlbWVudGVkIGFzIHdyYXBwZXJzCi1hcm91bmQgdGhlIEFwcGxlRXZlbnRcaW5kZXh7QXBwbGVFdmVudHN9IGludGVyZmFjZSB0byB0aGUgZmluZGVyLgotCi1BbGwgZmlsZSBhbmQgZm9sZGVyIHBhcmFtZXRlcnMgY2FuIGJlIHNwZWNpZmllZCBlaXRoZXIgYXMgZnVsbAotcGF0aG5hbWVzLCBvciBhcyBcY2xhc3N7RlNSZWZ9IG9yIFxjbGFzc3tGU1NwZWN9IG9iamVjdHMuCi0KLVRoZSBcbW9kdWxle2ZpbmRlcnRvb2xzfSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKLQotCi1cYmVnaW57ZnVuY2Rlc2N9e2xhdW5jaH17ZmlsZX0KLVRlbGwgdGhlIGZpbmRlciB0byBsYXVuY2ggXHZhcntmaWxlfS4gV2hhdCBsYXVuY2hpbmcgbWVhbnMgZGVwZW5kcyBvbiB0aGUgZmlsZToKLWFwcGxpY2F0aW9ucyBhcmUgc3RhcnRlZCwgZm9sZGVycyBhcmUgb3BlbmVkIGFuZCBkb2N1bWVudHMgYXJlIG9wZW5lZAotaW4gdGhlIGNvcnJlY3QgYXBwbGljYXRpb24uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e1ByaW50fXtmaWxlfQotVGVsbCB0aGUgZmluZGVyIHRvIHByaW50IGEgZmlsZS4gVGhlIGJlaGF2aW91ciBpcyBpZGVudGljYWwgdG8gc2VsZWN0aW5nIHRoZSBmaWxlIGFuZCB1c2luZwotdGhlIHByaW50IGNvbW1hbmQgaW4gdGhlIGZpbmRlcidzIGZpbGUgbWVudS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y29weX17ZmlsZSwgZGVzdGRpcn0KLVRlbGwgdGhlIGZpbmRlciB0byBjb3B5IGEgZmlsZSBvciBmb2xkZXIgXHZhcntmaWxlfSB0byBmb2xkZXIKLVx2YXJ7ZGVzdGRpcn0uIFRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIFxjbGFzc3tBbGlhc30gb2JqZWN0IHBvaW50aW5nIHRvCi10aGUgbmV3IGZpbGUuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e21vdmV9e2ZpbGUsIGRlc3RkaXJ9Ci1UZWxsIHRoZSBmaW5kZXIgdG8gbW92ZSBhIGZpbGUgb3IgZm9sZGVyIFx2YXJ7ZmlsZX0gdG8gZm9sZGVyCi1cdmFye2Rlc3RkaXJ9LiBUaGUgZnVuY3Rpb24gcmV0dXJucyBhbiBcY2xhc3N7QWxpYXN9IG9iamVjdCBwb2ludGluZyB0bwotdGhlIG5ldyBmaWxlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzbGVlcH17fQotVGVsbCB0aGUgZmluZGVyIHRvIHB1dCB0aGUgTWFjaW50b3NoIHRvIHNsZWVwLCBpZiB5b3VyIG1hY2hpbmUKLXN1cHBvcnRzIGl0LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtyZXN0YXJ0fXt9Ci1UZWxsIHRoZSBmaW5kZXIgdG8gcGVyZm9ybSBhbiBvcmRlcmx5IHJlc3RhcnQgb2YgdGhlIG1hY2hpbmUuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NodXRkb3dufXt9Ci1UZWxsIHRoZSBmaW5kZXIgdG8gcGVyZm9ybSBhbiBvcmRlcmx5IHNodXRkb3duIG9mIHRoZSBtYWNoaW5lLgotXGVuZHtmdW5jZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9tYWMvbGlibWFjdWkudGV4IGIvRG9jL21hYy9saWJtYWN1aS50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNjQ5YWIuLjAwMDAwMDAKLS0tIGEvRG9jL21hYy9saWJtYWN1aS50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtFYXN5RGlhbG9nc30gLS0tCi0gICAgICAgICBCYXNpYyBNYWNpbnRvc2ggZGlhbG9nc30KLQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e0Vhc3lEaWFsb2dzfQotICBccGxhdGZvcm17TWFjfQotXG1vZHVsZXN5bm9wc2lze0Jhc2ljIE1hY2ludG9zaCBkaWFsb2dzLn0KLQotVGhlIFxtb2R1bGV7RWFzeURpYWxvZ3N9IG1vZHVsZSBjb250YWlucyBzb21lIHNpbXBsZSBkaWFsb2dzIGZvciB0aGUKLU1hY2ludG9zaC4gQWxsIHJvdXRpbmVzIHRha2UgYW4gb3B0aW9uYWwgcmVzb3VyY2UgSUQgcGFyYW1ldGVyIFx2YXJ7aWR9Ci13aXRoIHdoaWNoIG9uZSBjYW4gb3ZlcnJpZGUgdGhlIFxjb25zdGFudHtETE9HfSByZXNvdXJjZSB1c2VkIGZvciB0aGUKLWRpYWxvZywgcHJvdmlkZWQgdGhhdCB0aGUgZGlhbG9nIGl0ZW1zIGNvcnJlc3BvbmQgKGJvdGggdHlwZSBhbmQgaXRlbQotbnVtYmVyKSB0byB0aG9zZSBpbiB0aGUgZGVmYXVsdCBcY29uc3RhbnR7RExPR30gcmVzb3VyY2UuIFNlZSBzb3VyY2UKLWNvZGUgZm9yIGRldGFpbHMuCi0KLVRoZSBcbW9kdWxle0Vhc3lEaWFsb2dzfSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKLQotCi1cYmVnaW57ZnVuY2Rlc2N9e01lc3NhZ2V9e3N0clxvcHRpb25hbHssIGlkXG9wdGlvbmFseywgb2t9fX0KLURpc3BsYXlzIGEgbW9kYWwgZGlhbG9nIHdpdGggdGhlIG1lc3NhZ2UgdGV4dCBcdmFye3N0cn0sIHdoaWNoIHNob3VsZCBiZQotYXQgbW9zdCAyNTUgY2hhcmFjdGVycyBsb25nLiBUaGUgYnV0dG9uIHRleHQgZGVmYXVsdHMgdG8gYGBPSycnLCBidXQgaXMKLXNldCB0byB0aGUgc3RyaW5nIGFyZ3VtZW50IFx2YXJ7b2t9IGlmIHRoZSBsYXR0ZXIgaXMgc3VwcGxpZWQuIENvbnRyb2wKLWlzIHJldHVybmVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBgYE9LJycgYnV0dG9uLgotXGVuZHtmdW5jZGVzY30KLQotCi1cYmVnaW57ZnVuY2Rlc2N9e0Fza1N0cmluZ317cHJvbXB0XG9wdGlvbmFseywgZGVmYXVsdFxvcHRpb25hbHssCi0gICAgaWRcb3B0aW9uYWx7LCBva1xvcHRpb25hbHssIGNhbmNlbH19fX19Ci1Bc2tzIHRoZSB1c2VyIHRvIGlucHV0IGEgc3RyaW5nIHZhbHVlIHZpYSBhIG1vZGFsIGRpYWxvZy4gXHZhcntwcm9tcHR9Ci1pcyB0aGUgcHJvbXB0IG1lc3NhZ2UsIGFuZCB0aGUgb3B0aW9uYWwgXHZhcntkZWZhdWx0fSBzdXBwbGllcyB0aGUKLWluaXRpYWwgdmFsdWUgZm9yIHRoZSBzdHJpbmcgKG90aGVyd2lzZSBcY29kZXsiIn0gaXMgdXNlZCkuIFRoZSB0ZXh0IG9mCi10aGUgYGBPSycnIGFuZCBgYENhbmNlbCcnIGJ1dHRvbnMgY2FuIGJlIGNoYW5nZWQgd2l0aCB0aGUgXHZhcntva30gYW5kCi1cdmFye2NhbmNlbH0gYXJndW1lbnRzLiBBbGwgc3RyaW5ncyBjYW4gYmUgYXQgbW9zdCAyNTUgYnl0ZXMgbG9uZy4KLVxmdW5jdGlvbntBc2tTdHJpbmcoKX0gcmV0dXJucyB0aGUgc3RyaW5nIGVudGVyZWQgb3IgXGNvbnN0YW50e05vbmV9Ci1pbiBjYXNlIHRoZSB1c2VyIGNhbmNlbGxlZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue2Z1bmNkZXNjfXtBc2tQYXNzd29yZH17cHJvbXB0XG9wdGlvbmFseywgZGVmYXVsdFxvcHRpb25hbHssCi0gICAgaWRcb3B0aW9uYWx7LCBva1xvcHRpb25hbHssIGNhbmNlbH19fX19Ci1Bc2tzIHRoZSB1c2VyIHRvIGlucHV0IGEgc3RyaW5nIHZhbHVlIHZpYSBhIG1vZGFsIGRpYWxvZy4gTGlrZQotXGZ1bmN0aW9ue0Fza1N0cmluZygpfSwgYnV0IHdpdGggdGhlIHRleHQgc2hvd24gYXMgYnVsbGV0cy4gVGhlCi1hcmd1bWVudHMgaGF2ZSB0aGUgc2FtZSBtZWFuaW5nIGFzIGZvciBcZnVuY3Rpb257QXNrU3RyaW5nKCl9LgotXGVuZHtmdW5jZGVzY30KLQotCi1cYmVnaW57ZnVuY2Rlc2N9e0Fza1llc05vQ2FuY2VsfXtxdWVzdGlvblxvcHRpb25hbHssIGRlZmF1bHRcb3B0aW9uYWx7LAotICAgIHllc1xvcHRpb25hbHssIG5vXG9wdGlvbmFseywgY2FuY2VsXG9wdGlvbmFseywgaWR9fX19fX0KLVByZXNlbnRzIGEgZGlhbG9nIHdpdGggcHJvbXB0IFx2YXJ7cXVlc3Rpb259IGFuZCB0aHJlZSBidXR0b25zIGxhYmVsbGVkCi1gYFllcycnLCBgYE5vJycsIGFuZCBgYENhbmNlbCcnLiBSZXR1cm5zIFxjb2RlezF9IGZvciBgYFllcycnLCBcY29kZXswfQotZm9yIGBgTm8nJyBhbmQgXGNvZGV7LTF9IGZvciBgYENhbmNlbCcnLiBUaGUgdmFsdWUgb2YgXHZhcntkZWZhdWx0fSAob3IKLVxjb2RlezB9IGlmIFx2YXJ7ZGVmYXVsdH0gaXMgbm90IHN1cHBsaWVkKSBpcyByZXR1cm5lZCB3aGVuIHRoZQotXGtiZHtSRVRVUk59IGtleSBpcyBwcmVzc2VkLiBUaGUgdGV4dCBvZiB0aGUgYnV0dG9ucyBjYW4gYmUgY2hhbmdlZCB3aXRoCi10aGUgXHZhcnt5ZXN9LCBcdmFye25vfSwgYW5kIFx2YXJ7Y2FuY2VsfSBhcmd1bWVudHM7IHRvIHByZXZlbnQgYSBidXR0b24KLWZyb20gYXBwZWFyaW5nLCBzdXBwbHkgXGNvZGV7IiJ9IGZvciB0aGUgY29ycmVzcG9uZGluZyBhcmd1bWVudC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue2Z1bmNkZXNjfXtQcm9ncmVzc0Jhcn17XG9wdGlvbmFse3RpdGxlXG9wdGlvbmFseywgbWF4dmFsXG9wdGlvbmFseywKLSAgICBsYWJlbFxvcHRpb25hbHssIGlkfX19fX0KLURpc3BsYXlzIGEgbW9kZWxlc3MgcHJvZ3Jlc3MtYmFyIGRpYWxvZy4gVGhpcyBpcyB0aGUgY29uc3RydWN0b3IgZm9yIHRoZQotXGNsYXNze1Byb2dyZXNzQmFyfSBjbGFzcyBkZXNjcmliZWQgYmVsb3cuIFx2YXJ7dGl0bGV9IGlzIHRoZSB0ZXh0Ci1zdHJpbmcgZGlzcGxheWVkIChkZWZhdWx0IGBgV29ya2luZy4uLicnKSwgXHZhcnttYXh2YWx9IGlzIHRoZSB2YWx1ZSBhdAotd2hpY2ggcHJvZ3Jlc3MgaXMgY29tcGxldGUgKGRlZmF1bHQgXGNvZGV7MH0sIGluZGljYXRpbmcgdGhhdCBhbgotaW5kZXRlcm1pbmF0ZSBhbW91bnQgb2Ygd29yayByZW1haW5zIHRvIGJlIGRvbmUpLCBhbmQgXHZhcntsYWJlbH0gaXMKLXRoZSB0ZXh0IHRoYXQgaXMgZGlzcGxheWVkIGFib3ZlIHRoZSBwcm9ncmVzcyBiYXIgaXRzZWxmLgotXGVuZHtmdW5jZGVzY30KLQotCi1cYmVnaW57ZnVuY2Rlc2N9e0dldEFyZ3Z9e1xvcHRpb25hbHtvcHRpb25saXN0XG9wdGlvbmFsewotICAgIGNvbW1hbmRsaXN0XG9wdGlvbmFseywgYWRkb2xkZmlsZVxvcHRpb25hbHssIGFkZG5ld2ZpbGVcb3B0aW9uYWx7LAotICAgIGFkZGZvbGRlclxvcHRpb25hbHssIGlkfX19fX19fQotRGlzcGxheXMgYSBkaWFsb2cgd2hpY2ggYWlkcyB0aGUgdXNlciBpbiBjb25zdHJ1Y3RpbmcgYSBjb21tYW5kLWxpbmUKLWFyZ3VtZW50IGxpc3QuICBSZXR1cm5zIHRoZSBsaXN0IGluIFxjb2Rle3N5cy5hcmd2fSBmb3JtYXQsIHN1aXRhYmxlIGZvcgotcGFzc2luZyBhcyBhbiBhcmd1bWVudCB0byBcZnVuY3Rpb257Z2V0b3B0LmdldG9wdCgpfS4gIFx2YXJ7YWRkb2xkZmlsZX0sCi1cdmFye2FkZG5ld2ZpbGV9LCBhbmQgXHZhcnthZGRmb2xkZXJ9IGFyZSBib29sZWFuIGFyZ3VtZW50cy4gIFdoZW4KLW5vbnplcm8sIHRoZXkgZW5hYmxlIHRoZSB1c2VyIHRvIGluc2VydCBpbnRvIHRoZSBjb21tYW5kIGxpbmUgcGF0aHMgdG8KLWFuIGV4aXN0aW5nIGZpbGUsIGEgKHBvc3NpYmx5KSBub3QteWV0LWV4aXN0ZW50IGZpbGUsIGFuZCBhIGZvbGRlciwKLXJlc3BlY3RpdmVseS4gIChOb3RlOiBPcHRpb24gYXJndW1lbnRzIG11c3QgYXBwZWFyIGluIHRoZSBjb21tYW5kIGxpbmUKLWJlZm9yZSBmaWxlIGFuZCBmb2xkZXIgYXJndW1lbnRzIGluIG9yZGVyIHRvIGJlIHJlY29nbml6ZWQgYnkKLVxmdW5jdGlvbntnZXRvcHQuZ2V0b3B0KCl9LikgIEFyZ3VtZW50cyBjb250YWluaW5nIHNwYWNlcyBjYW4gYmUKLXNwZWNpZmllZCBieSBlbmNsb3NpbmcgdGhlbSB3aXRoaW4gc2luZ2xlIG9yIGRvdWJsZSBxdW90ZXMuICBBCi1cZXhjZXB0aW9ue1N5c3RlbUV4aXR9IGV4Y2VwdGlvbiBpcyByYWlzZWQgaWYgdGhlIHVzZXIgcHJlc3NlcyB0aGUKLWBgQ2FuY2VsJycgYnV0dG9uLgotCi1cdmFye29wdGlvbmxpc3R9IGlzIGEgbGlzdCB0aGF0IGRldGVybWluZXMgYSBwb3B1cCBtZW51IGZyb20gd2hpY2ggdGhlCi1hbGxvd2VkIG9wdGlvbnMgYXJlIHNlbGVjdGVkLiAgSXRzIGl0ZW1zIGNhbiB0YWtlIG9uZSBvZiB0d28gZm9ybXM6Ci1cdmFye29wdHN0cn0gb3IgXGNvZGV7KFx2YXJ7b3B0c3RyfSwgXHZhcntkZXNjcn0pfS4gIFdoZW4gcHJlc2VudCwKLVx2YXJ7ZGVzY3J9IGlzIGEgc2hvcnQgZGVzY3JpcHRpdmUgc3RyaW5nIHRoYXQgaXMgZGlzcGxheWVkIGluIHRoZQotZGlhbG9nIHdoaWxlIHRoaXMgb3B0aW9uIGlzIHNlbGVjdGVkIGluIHRoZSBwb3B1cCBtZW51LiAgVGhlCi1jb3JyZXNwb25kZW5jZSBiZXR3ZWVuIFx2YXJ7b3B0c3RyfXMgYW5kIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgaXM6Ci0KLVxiZWdpbnt0YWJsZWlpfXtsfGx9e3RleHRybX17XHZhcntvcHRzdHJ9IGZvcm1hdH17Q29tbWFuZC1saW5lIGZvcm1hdH0KLVxsaW5laWl7XGNvZGV7eH19Ci0gICAgICAge1xwcm9ncmFtb3B0ey14fSAoc2hvcnQgb3B0aW9uKX0KLVxsaW5laWl7XGNvZGV7eDp9IG9yIFxjb2Rle3g9fX0KLSAgICAgICB7XHByb2dyYW1vcHR7LXh9IChzaG9ydCBvcHRpb24gd2l0aCB2YWx1ZSl9Ci1cbGluZWlpe1xjb2Rle3h5en19Ci0gICAgICAge1xsb25ncHJvZ3JhbW9wdHt4eXp9IChsb25nIG9wdGlvbil9Ci1cbGluZWlpe1xjb2Rle3h5ejp9IG9yIFxjb2Rle3h5ej19fQotICAgICAgIHtcbG9uZ3Byb2dyYW1vcHR7eHl6fSAobG9uZyBvcHRpb24gd2l0aCB2YWx1ZSl9Ci1cZW5ke3RhYmxlaWl9Ci0KLVx2YXJ7Y29tbWFuZGxpc3R9IGlzIGEgbGlzdCBvZiBpdGVtcyBvZiB0aGUgZm9ybSBcdmFye2NtZHN0cn0gb3IKLVxjb2RleyhcdmFye2NtZHN0cn0sIFx2YXJ7ZGVzY3J9KX0sIHdoZXJlIFx2YXJ7ZGVzY3J9IGlzIGFzIGFib3ZlLiAgVGhlCi1cdmFye2NtZHN0cn1zIHdpbGwgYXBwZWFyIGluIGEgcG9wdXAgbWVudS4gIFdoZW4gY2hvc2VuLCB0aGUgdGV4dCBvZgotXHZhcntjbWRzdHJ9IHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGNvbW1hbmQgbGluZSBhcyBpcywgZXhjZXB0IHRoYXQgYQotdHJhaWxpbmcgXGNoYXJhY3Rlcns6fSBvciBcY2hhcmFjdGVyez19IChpZiBwcmVzZW50KSB3aWxsIGJlIHRyaW1tZWQKLW9mZi4KLQotXHZlcnNpb25hZGRlZHsyLjB9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e0Fza0ZpbGVGb3JPcGVufXsKLQlcb3B0aW9uYWx7bWVzc2FnZX0KLQlcb3B0aW9uYWx7LCB0eXBlTGlzdH0KLQlcb3B0aW9uYWx7LCBkZWZhdWx0TG9jYXRpb259Ci0JXG9wdGlvbmFseywgZGVmYXVsdE9wdGlvbkZsYWdzfQotCVxvcHRpb25hbHssIGxvY2F0aW9ufQotCVxvcHRpb25hbHssIGNsaWVudE5hbWV9Ci0JXG9wdGlvbmFseywgd2luZG93VGl0bGV9Ci0JXG9wdGlvbmFseywgYWN0aW9uQnV0dG9uTGFiZWx9Ci0JXG9wdGlvbmFseywgY2FuY2VsQnV0dG9uTGFiZWx9Ci0JXG9wdGlvbmFseywgcHJlZmVyZW5jZUtleX0KLQlcb3B0aW9uYWx7LCBwb3B1cEV4dGVuc2lvbn0KLQlcb3B0aW9uYWx7LCBldmVudFByb2N9Ci0JXG9wdGlvbmFseywgcHJldmlld1Byb2N9Ci0JXG9wdGlvbmFseywgZmlsdGVyUHJvY30KLQlcb3B0aW9uYWx7LCB3YW50ZWR9Ci0JfQotUG9zdCBhIGRpYWxvZyBhc2tpbmcgdGhlIHVzZXIgZm9yIGEgZmlsZSB0byBvcGVuLCBhbmQgcmV0dXJuIHRoZSBmaWxlCi1zZWxlY3RlZCBvciBcY29uc3RhbnR7Tm9uZX0gaWYgdGhlIHVzZXIgY2FuY2VsbGVkLgotXHZhcnttZXNzYWdlfSBpcyBhIHRleHQgbWVzc2FnZSB0byBkaXNwbGF5LAotXHZhcnt0eXBlTGlzdH0gaXMgYSBsaXN0IG9mIDQtY2hhciBmaWxldHlwZXMgYWxsb3dhYmxlLAotXHZhcntkZWZhdWx0TG9jYXRpb259IGlzIHRoZSBwYXRobmFtZSwgXGNsYXNze0ZTU3BlY30gb3IgXGNsYXNze0ZTUmVmfQotb2YgdGhlIGZvbGRlciB0byBzaG93IGluaXRpYWxseSwKLVx2YXJ7bG9jYXRpb259IGlzIHRoZSBcY29kZXsoeCwgeSl9IHBvc2l0aW9uIG9uIHRoZSBzY3JlZW4gd2hlcmUgdGhlCi1kaWFsb2cgaXMgc2hvd24sCi1cdmFye2FjdGlvbkJ1dHRvbkxhYmVsfSBpcyBhIHN0cmluZyB0byBzaG93IGluc3RlYWQgb2YgYGBPcGVuJycgaW4gdGhlCi1PSyBidXR0b24sCi1cdmFye2NhbmNlbEJ1dHRvbkxhYmVsfSBpcyBhIHN0cmluZyB0byBzaG93IGluc3RlYWQgb2YgYGBDYW5jZWwnJyBpbiB0aGUKLWNhbmNlbCBidXR0b24sCi1cdmFye3dhbnRlZH0gaXMgdGhlIHR5cGUgb2YgdmFsdWUgd2FudGVkIGFzIGEgcmV0dXJuOiBcY2xhc3N7c3RyfSwKLVxjbGFzc3t1bmljb2RlfSwgXGNsYXNze0ZTU3BlY30sIFxjbGFzc3tGU1JlZn0gYW5kIHN1YnR5cGVzIHRoZXJlb2YgYXJlCi1hY2NlcHRhYmxlLgotCi1caW5kZXh7TmF2aWdhdGlvbiBTZXJ2aWNlc30KLUZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBvdGhlciBhcmd1bWVudHMgcGxlYXNlIHNlZSB0aGUgQXBwbGUgTmF2aWdhdGlvbgotU2VydmljZXMgZG9jdW1lbnRhdGlvbiBhbmQgdGhlIFxtb2R1bGV7RWFzeURpYWxvZ3N9IHNvdXJjZSBjb2RlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtBc2tGaWxlRm9yU2F2ZX17Ci0JXG9wdGlvbmFse21lc3NhZ2V9Ci0JXG9wdGlvbmFseywgc2F2ZWRGaWxlTmFtZX0KLQlcb3B0aW9uYWx7LCBkZWZhdWx0TG9jYXRpb259Ci0JXG9wdGlvbmFseywgZGVmYXVsdE9wdGlvbkZsYWdzfQotCVxvcHRpb25hbHssIGxvY2F0aW9ufQotCVxvcHRpb25hbHssIGNsaWVudE5hbWV9Ci0JXG9wdGlvbmFseywgd2luZG93VGl0bGV9Ci0JXG9wdGlvbmFseywgYWN0aW9uQnV0dG9uTGFiZWx9Ci0JXG9wdGlvbmFseywgY2FuY2VsQnV0dG9uTGFiZWx9Ci0JXG9wdGlvbmFseywgcHJlZmVyZW5jZUtleX0KLQlcb3B0aW9uYWx7LCBwb3B1cEV4dGVuc2lvbn0KLQlcb3B0aW9uYWx7LCBmaWxlVHlwZX0KLQlcb3B0aW9uYWx7LCBmaWxlQ3JlYXRvcn0KLQlcb3B0aW9uYWx7LCBldmVudFByb2N9Ci0JXG9wdGlvbmFseywgd2FudGVkfQotCX0KLVBvc3QgYSBkaWFsb2cgYXNraW5nIHRoZSB1c2VyIGZvciBhIGZpbGUgdG8gc2F2ZSB0bywgYW5kIHJldHVybiB0aGUKLWZpbGUgc2VsZWN0ZWQgb3IgXGNvbnN0YW50e05vbmV9IGlmIHRoZSB1c2VyIGNhbmNlbGxlZC4KLVx2YXJ7c2F2ZWRGaWxlTmFtZX0gaXMgdGhlIGRlZmF1bHQgZm9yIHRoZSBmaWxlIG5hbWUgdG8gc2F2ZSB0byAodGhlCi1yZXR1cm4gdmFsdWUpLiBTZWUgXGZ1bmN0aW9ue0Fza0ZpbGVGb3JPcGVuKCl9IGZvciBhIGRlc2NyaXB0aW9uIG9mCi10aGUgb3RoZXIgYXJndW1lbnRzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtBc2tGb2xkZXJ9ewotCVxvcHRpb25hbHttZXNzYWdlfQotCVxvcHRpb25hbHssIGRlZmF1bHRMb2NhdGlvbn0KLQlcb3B0aW9uYWx7LCBkZWZhdWx0T3B0aW9uRmxhZ3N9Ci0JXG9wdGlvbmFseywgbG9jYXRpb259Ci0JXG9wdGlvbmFseywgY2xpZW50TmFtZX0KLQlcb3B0aW9uYWx7LCB3aW5kb3dUaXRsZX0KLQlcb3B0aW9uYWx7LCBhY3Rpb25CdXR0b25MYWJlbH0KLQlcb3B0aW9uYWx7LCBjYW5jZWxCdXR0b25MYWJlbH0KLQlcb3B0aW9uYWx7LCBwcmVmZXJlbmNlS2V5fQotCVxvcHRpb25hbHssIHBvcHVwRXh0ZW5zaW9ufQotCVxvcHRpb25hbHssIGV2ZW50UHJvY30KLQlcb3B0aW9uYWx7LCBmaWx0ZXJQcm9jfQotCVxvcHRpb25hbHssIHdhbnRlZH0KLQl9Ci1Qb3N0IGEgZGlhbG9nIGFza2luZyB0aGUgdXNlciB0byBzZWxlY3QgYSBmb2xkZXIsIGFuZCByZXR1cm4gdGhlCi1mb2xkZXIgc2VsZWN0ZWQgb3IgXGNvbnN0YW50e05vbmV9IGlmIHRoZSB1c2VyIGNhbmNlbGxlZC4gU2VlCi1cZnVuY3Rpb257QXNrRmlsZUZvck9wZW4oKX0gZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGFyZ3VtZW50cy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWV0aXRsZQotICBbaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi9DYXJib24vUmVmZXJlbmNlL05hdmlnYXRpb25fU2VydmljZXNfUmVmL10KLSAge05hdmlnYXRpb24gU2VydmljZXMgUmVmZXJlbmNlfXtQcm9ncmFtbWVyJ3MgcmVmZXJlbmNlIGRvY3VtZW50YXRpb24KLSAgZm9yIHRoZSBOYXZpZ2F0aW9uIFNlcnZpY2VzLCBhIHBhcnQgb2YgdGhlIENhcmJvbiBmcmFtZXdvcmsufQotXGVuZHtzZWVhbHNvfQotCi0KLVxzdWJzZWN0aW9ue1Byb2dyZXNzQmFyIE9iamVjdHMgXGxhYmVse3Byb2dyZXNzYmFyLW9iamVjdHN9fQotCi1cY2xhc3N7UHJvZ3Jlc3NCYXJ9IG9iamVjdHMgcHJvdmlkZSBzdXBwb3J0IGZvciBtb2RlbGVzcyBwcm9ncmVzcy1iYXIKLWRpYWxvZ3MuICBCb3RoIGRldGVybWluYXRlICh0aGVybW9tZXRlciBzdHlsZSkgYW5kIGluZGV0ZXJtaW5hdGUKLShiYXJiZXItcG9sZSBzdHlsZSkgcHJvZ3Jlc3MgYmFycyBhcmUgc3VwcG9ydGVkLiAgVGhlIGJhciB3aWxsIGJlCi1kZXRlcm1pbmF0ZSBpZiBpdHMgbWF4aW11bSB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gemVybzsgb3RoZXJ3aXNlIGl0Ci13aWxsIGJlIGluZGV0ZXJtaW5hdGUuCi1cdmVyc2lvbmNoYW5nZWRbU3VwcG9ydCBmb3IgaW5kZXRlcm1pbmF0ZS1zdHlsZSBwcm9ncmVzcyBiYXJzIHdhcwotICAgICAgICAgICAgICAgIGFkZGVkXXsyLjJ9Ci0KLVRoZSBkaWFsb2cgaXMgZGlzcGxheWVkIGltbWVkaWF0ZWx5IGFmdGVyIGNyZWF0aW9uLiBJZiB0aGUgZGlhbG9nJ3MKLWBgQ2FuY2VsJycgYnV0dG9uIGlzIHByZXNzZWQsIG9yIGlmIFxrYmR7Q21kLS59IG9yIFxrYmR7RVNDfSBpcyB0eXBlZCwKLXRoZSBkaWFsb2cgd2luZG93IGlzIGhpZGRlbiBhbmQgXGV4Y2VwdGlvbntLZXlib2FyZEludGVycnVwdH0gaXMKLXJhaXNlZCAoYnV0IG5vdGUgdGhhdCB0aGlzIHJlc3BvbnNlIGRvZXMgbm90IG9jY3VyIHVudGlsIHRoZSBwcm9ncmVzcwotYmFyIGlzIG5leHQgdXBkYXRlZCwgdHlwaWNhbGx5IHZpYSBhIGNhbGwgdG8gXG1ldGhvZHtpbmMoKX0gb3IKLVxtZXRob2R7c2V0KCl9KS4gIE90aGVyd2lzZSwgdGhlIGJhciByZW1haW5zIHZpc2libGUgdW50aWwgdGhlCi1cY2xhc3N7UHJvZ3Jlc3NCYXJ9IG9iamVjdCBpcyBkaXNjYXJkZWQuCi0KLVxjbGFzc3tQcm9ncmVzc0Jhcn0gb2JqZWN0cyBwb3NzZXNzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhbmQKLW1ldGhvZHM6Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtQcm9ncmVzc0Jhcl17Y3VydmFsfQotVGhlIGN1cnJlbnQgdmFsdWUgKG9mIHR5cGUgaW50ZWdlciBvciBsb25nIGludGVnZXIpIG9mIHRoZSBwcm9ncmVzcwotYmFyLiAgVGhlIG5vcm1hbCBhY2Nlc3MgbWV0aG9kcyBjb2VyY2UgXG1lbWJlcntjdXJ2YWx9IGJldHdlZW4KLVxjb2RlezB9IGFuZCBcbWVtYmVye21heHZhbH0uICBUaGlzIGF0dHJpYnV0ZSBzaG91bGQgbm90IGJlIGFsdGVyZWQKLWRpcmVjdGx5LgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bUHJvZ3Jlc3NCYXJde21heHZhbH0KLVRoZSBtYXhpbXVtIHZhbHVlIChvZiB0eXBlIGludGVnZXIgb3IgbG9uZyBpbnRlZ2VyKSBvZiB0aGUgcHJvZ3Jlc3MKLWJhcjsgdGhlIHByb2dyZXNzIGJhciAodGhlcm1vbWV0ZXIgc3R5bGUpIGlzIGZ1bGwgd2hlbiBcbWVtYmVye2N1cnZhbH0KLWVxdWFscyBcbWVtYmVye21heHZhbH0uICBJZiBcbWVtYmVye21heHZhbH0gaXMgXGNvZGV7MH0sIHRoZSBiYXIgd2lsbAotYmUgaW5kZXRlcm1pbmF0ZSAoYmFyYmVyLXBvbGUpLiAgVGhpcyBhdHRyaWJ1dGUgc2hvdWxkIG5vdCBiZSBhbHRlcmVkCi1kaXJlY3RseS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1Byb2dyZXNzQmFyXXt0aXRsZX17XG9wdGlvbmFse25ld3N0cn19Ci1TZXRzIHRoZSB0ZXh0IGluIHRoZSB0aXRsZSBiYXIgb2YgdGhlIHByb2dyZXNzIGRpYWxvZyB0bwotXHZhcntuZXdzdHJ9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUHJvZ3Jlc3NCYXJde2xhYmVsfXtcb3B0aW9uYWx7bmV3c3RyfX0KLVNldHMgdGhlIHRleHQgaW4gdGhlIHByb2dyZXNzIGJveCBvZiB0aGUgcHJvZ3Jlc3MgZGlhbG9nIHRvCi1cdmFye25ld3N0cn0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtQcm9ncmVzc0Jhcl17c2V0fXt2YWx1ZVxvcHRpb25hbHssIG1heH19Ci1TZXRzIHRoZSBwcm9ncmVzcyBiYXIncyBcbWVtYmVye2N1cnZhbH0gdG8gXHZhcnt2YWx1ZX0sIGFuZCBhbHNvCi1cbWVtYmVye21heHZhbH0gdG8gXHZhcnttYXh9IGlmIHRoZSBsYXR0ZXIgaXMgcHJvdmlkZWQuICBcdmFye3ZhbHVlfQotaXMgZmlyc3QgY29lcmNlZCBiZXR3ZWVuIDAgYW5kIFxtZW1iZXJ7bWF4dmFsfS4gIFRoZSB0aGVybW9tZXRlciBiYXIKLWlzIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgY2hhbmdlcywgaW5jbHVkaW5nIGEgY2hhbmdlIGZyb20KLWluZGV0ZXJtaW5hdGUgdG8gZGV0ZXJtaW5hdGUgb3IgdmljZSB2ZXJzYS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1Byb2dyZXNzQmFyXXtpbmN9e1xvcHRpb25hbHtufX0KLUluY3JlbWVudHMgdGhlIHByb2dyZXNzIGJhcidzIFxtZW1iZXJ7Y3VydmFsfSBieSBcdmFye259LCBvciBieSBcY29kZXsxfQotaWYgXHZhcntufSBpcyBub3QgcHJvdmlkZWQuICAoTm90ZSB0aGF0IFx2YXJ7bn0gbWF5IGJlIG5lZ2F0aXZlLCBpbgotd2hpY2ggY2FzZSB0aGUgZWZmZWN0IGlzIGEgZGVjcmVtZW50LikgIFRoZSBwcm9ncmVzcyBiYXIgaXMgdXBkYXRlZCB0bwotcmVmbGVjdCB0aGUgY2hhbmdlLiAgSWYgdGhlIGJhciBpcyBpbmRldGVybWluYXRlLCB0aGlzIGNhdXNlcyBvbmUKLWBgc3BpbicnIG9mIHRoZSBiYXJiZXIgcG9sZS4gIFRoZSByZXN1bHRpbmcgXG1lbWJlcntjdXJ2YWx9IGlzIGNvZXJjZWQKLWJldHdlZW4gMCBhbmQgXG1lbWJlcnttYXh2YWx9IGlmIGluY3JlbWVudGluZyBjYXVzZXMgaXQgdG8gZmFsbAotb3V0c2lkZSB0aGlzIHJhbmdlLgotXGVuZHttZXRob2RkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL21hYy9saWJtaW5pYWUudGV4IGIvRG9jL21hYy9saWJtaW5pYWUudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDgxNWYwLi4wMDAwMDAwCi0tLSBhL0RvYy9tYWMvbGlibWluaWFlLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7TWluaUFFRnJhbWV9IC0tLQotICAgICAgICAgT3BlbiBTY3JpcHRpbmcgQXJjaGl0ZWN0dXJlIHNlcnZlciBzdXBwb3J0fQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17TWluaUFFRnJhbWV9Ci0gIFxwbGF0Zm9ybXtNYWN9Ci1cbW9kdWxlc3lub3BzaXN7U3VwcG9ydCB0byBhY3QgYXMgYW4gT3BlbiBTY3JpcHRpbmcgQXJjaGl0ZWN0dXJlIChPU0EpIHNlcnZlcgotKGBgQXBwbGUgRXZlbnRzJycpLn0KLQotCi1UaGUgbW9kdWxlIFxtb2R1bGV7TWluaUFFRnJhbWV9IHByb3ZpZGVzIGEgZnJhbWV3b3JrIGZvciBhbiBhcHBsaWNhdGlvbgotdGhhdCBjYW4gZnVuY3Rpb24gYXMgYW4gT3BlbiBTY3JpcHRpbmcgQXJjaGl0ZWN0dXJlCi1caW5kZXh7T3BlbiBTY3JpcHRpbmcgQXJjaGl0ZWN0dXJlfQotKE9TQSkgc2VydmVyLCBpLmUuIHJlY2VpdmUgYW5kIHByb2Nlc3MKLUFwcGxlRXZlbnRzXGluZGV4e0FwcGxlRXZlbnRzfS4gSXQgY2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aAotXHJlZm1vZHVsZXtGcmFtZVdvcmt9XHJlZnN0bW9kaW5kZXh7RnJhbWVXb3JrfSBvciBzdGFuZGFsb25lLiBBcyBhbgotZXhhbXBsZSwgaXQgaXMgdXNlZCBpbiBccHJvZ3JhbXtQeXRob25DR0lTbGF2ZX0uCi0KLQotVGhlIFxtb2R1bGV7TWluaUFFRnJhbWV9IG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgY2xhc3NlczoKLQotCi1cYmVnaW57Y2xhc3NkZXNjfXtBRVNlcnZlcn17fQotQSBjbGFzcyB0aGF0IGhhbmRsZXMgQXBwbGVFdmVudCBkaXNwYXRjaC4gWW91ciBhcHBsaWNhdGlvbiBzaG91bGQKLXN1YmNsYXNzIHRoaXMgY2xhc3MgdG9nZXRoZXIgd2l0aCBlaXRoZXIKLVxjbGFzc3tNaW5pQXBwbGljYXRpb259IG9yCi1cY2xhc3N7RnJhbWVXb3JrLkFwcGxpY2F0aW9ufS4gWW91ciBcbWV0aG9ke19faW5pdF9fKCl9IG1ldGhvZCBzaG91bGQKLWNhbGwgdGhlIFxtZXRob2R7X19pbml0X18oKX0gbWV0aG9kIGZvciBib3RoIGNsYXNzZXMuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317TWluaUFwcGxpY2F0aW9ufXt9Ci1BIGNsYXNzIHRoYXQgaXMgbW9yZSBvciBsZXNzIGNvbXBhdGlibGUgd2l0aAotXGNsYXNze0ZyYW1lV29yay5BcHBsaWNhdGlvbn0gYnV0IHdpdGggbGVzcyBmdW5jdGlvbmFsaXR5LiBJdHMKLWV2ZW50IGxvb3Agc3VwcG9ydHMgdGhlIGFwcGxlIG1lbnUsIGNvbW1hbmQtZG90IGFuZCBBcHBsZUV2ZW50czsgb3RoZXIKLWV2ZW50cyBhcmUgcGFzc2VkIG9uIHRvIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgYW5kL29yIFNpb3V4LgotVXNlZnVsIGlmIHlvdXIgYXBwbGljYXRpb24gd2FudHMgdG8gdXNlIFxjbGFzc3tBRVNlcnZlcn0gYnV0IGRvZXMgbm90Ci1wcm92aWRlIGl0cyBvd24gd2luZG93cywgZXRjLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLQotXHN1YnNlY3Rpb257QUVTZXJ2ZXIgT2JqZWN0cyBcbGFiZWx7YWVzZXJ2ZXItb2JqZWN0c319Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtBRVNlcnZlcl17aW5zdGFsbGFlaGFuZGxlcn17Y2xhc3NlLCB0eXBlLCBjYWxsYmFja30KLUluc3RhbGxzIGFuIEFwcGxlRXZlbnQgaGFuZGxlci4gXHZhcntjbGFzc2V9IGFuZCBcdmFye3R5cGV9IGFyZSB0aGUKLWZvdXItY2hhcmFjdGVyIE9TQSBDbGFzcyBhbmQgVHlwZSBkZXNpZ25hdG9ycywgXGNvZGV7JyoqKionfSB3aWxkY2FyZHMKLWFyZSBhbGxvd2VkLiBXaGVuIGEgbWF0Y2hpbmcgQXBwbGVFdmVudCBpcyByZWNlaXZlZCB0aGUgcGFyYW1ldGVycyBhcmUKLWRlY29kZWQgYW5kIHlvdXIgY2FsbGJhY2sgaXMgaW52b2tlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0FFU2VydmVyXXtjYWxsYmFja317X29iamVjdCwgKiprd2FyZ3N9Ci1Zb3VyIGNhbGxiYWNrIGlzIGNhbGxlZCB3aXRoIHRoZSBPU0EgRGlyZWN0IE9iamVjdCBhcyBmaXJzdCBwb3NpdGlvbmFsCi1wYXJhbWV0ZXIuIFRoZSBvdGhlciBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQgYXMga2V5d29yZCBhcmd1bWVudHMsIHdpdGgKLXRoZSA0LWNoYXJhY3RlciBkZXNpZ25hdG9yIGFzIG5hbWUuIFRocmVlIGV4dHJhIGtleXdvcmQgcGFyYW1ldGVycyBhcmUKLXBhc3NlZDogXGNvZGV7X2NsYXNzfSBhbmQgXGNvZGV7X3R5cGV9IGFyZSB0aGUgQ2xhc3MgYW5kIFR5cGUKLWRlc2lnbmF0b3JzIGFuZCBcY29kZXtfYXR0cmlidXRlc30gaXMgYSBkaWN0aW9uYXJ5IHdpdGggdGhlIEFwcGxlRXZlbnQKLWF0dHJpYnV0ZXMuCi0KLVRoZSByZXR1cm4gdmFsdWUgb2YgeW91ciBtZXRob2QgaXMgcGFja2VkIHdpdGgKLVxmdW5jdGlvbnthZXRvb2xzLnBhY2tldmVudCgpfSBhbmQgc2VudCBhcyByZXBseS4KLVxlbmR7bWV0aG9kZGVzY30KLQotTm90ZSB0aGF0IHRoZXJlIGFyZSBzb21lIHNlcmlvdXMgcHJvYmxlbXMgd2l0aCB0aGUgY3VycmVudAotZGVzaWduLiBBcHBsZUV2ZW50cyB3aGljaCBoYXZlIG5vbi1pZGVudGlmaWVyIDQtY2hhcmFjdGVyIGRlc2lnbmF0b3JzCi1mb3IgYXJndW1lbnRzIGFyZSBub3QgaW1wbGVtZW50YWJsZSwgYW5kIGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZXR1cm4KLWFuIGVycm9yIHRvIHRoZSBvcmlnaW5hdG9yLiBUaGlzIHdpbGwgYmUgYWRkcmVzc2VkIGluIGEgZnV0dXJlCi1yZWxlYXNlLgpkaWZmIC0tZ2l0IGEvRG9jL21hYy9saWJzY3JhcC50ZXggYi9Eb2MvbWFjL2xpYnNjcmFwLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE0NjI3OC4uMDAwMDAwMAotLS0gYS9Eb2MvbWFjL2xpYnNjcmFwLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7Q2FyYm9uLlNjcmFwfSAtLS0gU2NyYXAgTWFuYWdlcn0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtDYXJib24uU2NyYXB9Ci0gIFxwbGF0Zm9ybXtNYWN9Ci1cbW9kdWxlc3lub3BzaXN7VGhlIFNjcmFwIE1hbmFnZXIgcHJvdmlkZXMgYmFzaWMgc2VydmljZXMgZm9yCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50aW5nIGN1dCBcJlwgcGFzdGUgYW5kIGNsaXBib2FyZCBvcGVyYXRpb25zLn0KLQotCi1UaGlzIG1vZHVsZSBpcyBvbmx5IGZ1bGx5IGF2YWlsYWJsZSBvbiBNYWNPUzkgYW5kIGVhcmxpZXIgdW5kZXIKLWNsYXNzaWMgUFBDIE1hY1B5dGhvbi4gIFZlcnkgbGltaXRlZCBmdW5jdGlvbmFsaXR5IGlzIGF2YWlsYWJsZSB1bmRlcgotQ2FyYm9uIE1hY1B5dGhvbi4KLQotVGhlIFNjcmFwXGluZGV4e1NjcmFwIE1hbmFnZXJ9IE1hbmFnZXIgc3VwcG9ydHMgdGhlIHNpbXBsZXN0IGZvcm0gb2YKLWN1dCBcJlwgcGFzdGUgb3BlcmF0aW9ucyBvbiB0aGUgTWFjaW50b3NoLiAgSXQgY2FuIGJlIHVzZSBmb3IgYm90aAotaW50ZXItIGFuZCBpbnRyYS1hcHBsaWNhdGlvbiBjbGlwYm9hcmQgb3BlcmF0aW9ucy4KLQotVGhlIFxtb2R1bGV7U2NyYXB9IG1vZHVsZSBwcm92aWRlcyBsb3ctbGV2ZWwgYWNjZXNzIHRvIHRoZSBmdW5jdGlvbnMKLW9mIHRoZSBTY3JhcCBNYW5hZ2VyLiAgSXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6Ci0KLQotXGJlZ2lue2Z1bmNkZXNjfXtJbmZvU2NyYXB9e30KLSAgUmV0dXJuIGN1cnJlbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNjcmFwLiAgVGhlIGluZm9ybWF0aW9uIGlzCi0gIGVuY29kZWQgYXMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBmaWVsZHMgXGNvZGV7KFx2YXJ7c2l6ZX0sCi0gIFx2YXJ7aGFuZGxlfSwgXHZhcntjb3VudH0sIFx2YXJ7c3RhdGV9LCBcdmFye3BhdGh9KX0uCi0KLSAgXGJlZ2lue3RhYmxlaWl9e2x8bH17dmFyfXtGaWVsZH17TWVhbmluZ30KLSAgICBcbGluZWlpe3NpemV9e1NpemUgb2YgdGhlIHNjcmFwIGluIGJ5dGVzLn0KLSAgICBcbGluZWlpe2hhbmRsZX17UmVzb3VyY2Ugb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2NyYXAufQotICAgIFxsaW5laWl7Y291bnR9e1NlcmlhbCBudW1iZXIgb2YgdGhlIHNjcmFwIGNvbnRlbnRzLn0KLSAgICBcbGluZWlpe3N0YXRlfXtJbnRlZ2VyOyBwb3NpdGl2ZSBpZiBpbiBtZW1vcnksIFxjb2RlezB9IGlmIG9uCi0gICAgICAgICAgICAgICAgICAgZGlzaywgbmVnYXRpdmUgaWYgdW5pbml0aWFsaXplZC59Ci0gICAgXGxpbmVpaXtwYXRofXtGaWxlbmFtZSBvZiB0aGUgc2NyYXAgd2hlbiBzdG9yZWQgb24gZGlzay59Ci0gIFxlbmR7dGFibGVpaX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLQotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZXRpdGxlW2h0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2RvY3VtZW50YXRpb24vbWFjL01vcmVUb29sYm94L01vcmVUb29sYm94LTEwOS5odG1sXQotICAgICAgICAgICB7U2NyYXAgTWFuYWdlcn17QXBwbGUncyBkb2N1bWVudGF0aW9uIGZvciB0aGUgU2NyYXAgTWFuYWdlcgotICAgICAgICAgICAgZ2l2ZXMgYSBsb3Qgb2YgdXNlZnVsIGluZm9ybWF0aW9uIGFib3V0IHVzaW5nIHRoZSBTY3JhcAotICAgICAgICAgICAgTWFuYWdlciBpbiBhcHBsaWNhdGlvbnMufQotXGVuZHtzZWVhbHNvfQpkaWZmIC0tZ2l0IGEvRG9jL21hYy9tYWMudGV4IGIvRG9jL21hYy9tYWMudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjE4MDU3Li4wMDAwMDAwCi0tLSBhL0RvYy9tYWMvbWFjLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLVxkb2N1bWVudGNsYXNze21hbnVhbH0KLQotXHRpdGxle01hY2ludG9zaCBMaWJyYXJ5IE1vZHVsZXN9Ci0KLVxpbnB1dHtib2lsZXJwbGF0ZX0KLQotXG1ha2VpbmRleCAgICAgICAgICAgICAgJSB0ZWxsIFxpbmRleCB0byBhY3R1YWxseSB3cml0ZSB0aGUgLmlkeCBmaWxlCi1cbWFrZW1vZGluZGV4ICAgICAgICAgICAlIC4uLiBhbmQgdGhlIG1vZHVsZSBpbmRleCBhcyB3ZWxsLgotCi0KLVxiZWdpbntkb2N1bWVudH0KLQotXG1ha2V0aXRsZQotCi1caWZodG1sCi1cY2hhcHRlcip7RnJvbnQgTWF0dGVyXGxhYmVse2Zyb250fX0KLVxmaQotCi1caW5wdXR7Y29weXJpZ2h0fQotCi1cYmVnaW57YWJzdHJhY3R9Ci0KLVxub2luZGVudAotVGhpcyBsaWJyYXJ5IHJlZmVyZW5jZSBtYW51YWwgZG9jdW1lbnRzIFB5dGhvbidzIGV4dGVuc2lvbnMgZm9yIHRoZQotTWFjaW50b3NoLiAgSXQgc2hvdWxkIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUKLVxjaXRldGl0bGVbLi4vbGliL2xpYi5odG1sXXtQeXRob24gTGlicmFyeSBSZWZlcmVuY2V9LCB3aGljaCBkb2N1bWVudHMKLXRoZSBzdGFuZGFyZCBsaWJyYXJ5IGFuZCBidWlsdC1pbiB0eXBlcy4KLQotVGhpcyBtYW51YWwgYXNzdW1lcyBiYXNpYyBrbm93bGVkZ2UgYWJvdXQgdGhlIFB5dGhvbiBsYW5ndWFnZS4gIEZvciBhbgotaW5mb3JtYWwgaW50cm9kdWN0aW9uIHRvIFB5dGhvbiwgc2VlIHRoZQotXGNpdGV0aXRsZVsuLi90dXQvdHV0Lmh0bWxde1B5dGhvbiBUdXRvcmlhbH07IHRoZQotXGNpdGV0aXRsZVsuLi9yZWYvcmVmLmh0bWxde1B5dGhvbiBSZWZlcmVuY2UgTWFudWFsfSByZW1haW5zIHRoZQotaGlnaGVzdCBhdXRob3JpdHkgb24gc3ludGFjdGljIGFuZCBzZW1hbnRpYyBxdWVzdGlvbnMuICBGaW5hbGx5LCB0aGUKLW1hbnVhbCBlbnRpdGxlZCBcY2l0ZXRpdGxlWy4uL2V4dC9leHQuaHRtbF17RXh0ZW5kaW5nIGFuZCBFbWJlZGRpbmcKLXRoZSBQeXRob24gSW50ZXJwcmV0ZXJ9IGRlc2NyaWJlcyBob3cgdG8gYWRkIG5ldyBleHRlbnNpb25zIHRvIFB5dGhvbgotYW5kIGhvdyB0byBlbWJlZCBpdCBpbiBvdGhlciBhcHBsaWNhdGlvbnMuCi0KLVxlbmR7YWJzdHJhY3R9Ci0KLVx0YWJsZW9mY29udGVudHMKLQotCi1caW5wdXR7dXNpbmcudGV4fSAgICAgICAgICAgICAgICAgICAgICAgJSBVc2luZyBQeXRob24gb24gdGhlIE1hY2ludG9zaAotCi0KLVxjaGFwdGVye01hY1B5dGhvbiBNb2R1bGVzIFxsYWJlbHttYWNweXRob24tbW9kdWxlc319Ci0KLVRoZSBmb2xsb3dpbmcgbW9kdWxlcyBhcmUgb25seSBhdmFpbGFibGUgb24gdGhlIE1hY2ludG9zaCwgYW5kIGFyZQotZG9jdW1lbnRlZCBoZXJlOgotCi1cbG9jYWxtb2R1bGV0YWJsZQotCi1caW5wdXR7bGlibWFjfQotXGlucHV0e2xpYm1hY2ljfQotXGlucHV0e2xpYm1hY29zfQotXGlucHV0e2xpYm1hY29zdG9vbHN9Ci1caW5wdXR7bGlibWFjdWl9Ci1caW5wdXR7bGliZnJhbWV3b3JrfQotXGlucHV0e2xpYmF1dG9naWx9Ci0KLVxpbnB1dHtzY3JpcHRpbmd9Ci0KLVxpbnB1dHt0b29sYm94fSAgICAgICAgICAgICAgICAgICAgICAgICAlIE1hY09TIFRvb2xib3ggTW9kdWxlcwotXGlucHV0e2xpYmNvbG9ycGlja2VyfQotCi1caW5wdXR7dW5kb2N9ICAgICAgICAgICAgICAgICAgICAgICAgICAgJSBVbmRvY3VtZW50ZWQgTW9kdWxlcwotCi1cYXBwZW5kaXgKLVxjaGFwdGVye0hpc3RvcnkgYW5kIExpY2Vuc2V9Ci1caW5wdXR7bGljZW5zZX0KLQotJQotJSAgVGhlIHVnbHkgIiViZWdpbntsYXRleG9ubHl9IiBwc2V1ZG8tZW52aXJvbm1lbnRzIGFyZSByZWFsbHkganVzdCB0bwotJSAga2VlcCBMYVRlWDJIVE1MIHF1aWV0IGR1cmluZyB0aGUgXHJlbmV3Y29tbWFuZHt9IG1hY3JvczsgdGhleSdyZQotJSAgbm90IHJlYWxseSB2YWx1YWJsZS4KLSUKLQotJWJlZ2lue2xhdGV4b25seX0KLVxyZW5ld2NvbW1hbmR7XGluZGV4bmFtZX17TW9kdWxlIEluZGV4fQotJWVuZHtsYXRleG9ubHl9Ci1caW5wdXR7bW9kbWFjLmluZH0gICAgICAlIE1vZHVsZSBJbmRleAotCi0lYmVnaW57bGF0ZXhvbmx5fQotXHJlbmV3Y29tbWFuZHtcaW5kZXhuYW1lfXtJbmRleH0KLSVlbmR7bGF0ZXhvbmx5fQotXGlucHV0e21hYy5pbmR9ICAgICAgICAgJSBJbmRleAotCi1cZW5ke2RvY3VtZW50fQpkaWZmIC0tZ2l0IGEvRG9jL21hYy9zY3JpcHRpbmcudGV4IGIvRG9jL21hYy9zY3JpcHRpbmcudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWM0OTc4Li4wMDAwMDAwCi0tLSBhL0RvYy9tYWMvc2NyaXB0aW5nLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi1cY2hhcHRlcntNYWNQeXRob24gT1NBIE1vZHVsZXMgXGxhYmVse3NjcmlwdGluZ319Ci0KLVRoaXMgY2hhcHRlciBkZXNjcmliZXMgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgdGhlIE9wZW4gU2NyaXB0aW5nCi1BcmNoaXRlY3VyZSAoT1NBLCBhbHNvIGNvbW1vbmx5IHJlZmVycmVkIHRvIGFzIEFwcGxlU2NyaXB0KSBmb3IgUHl0aG9uLCBhbGxvd2luZwoteW91IHRvIGNvbnRyb2wgc2NyaXB0YWJsZSBhcHBsaWNhdGlvbnMgZnJvbSB5b3VyIFB5dGhvbiBwcm9ncmFtLAotYW5kIHdpdGggYSBmYWlybHkgcHl0aG9uaWMgaW50ZXJmYWNlLiBEZXZlbG9wbWVudCBvbiB0aGlzIHNldCBvZiBtb2R1bGVzCi1oYXMgc3RvcHBlZCwgYW5kIGEgcmVwbGFjZW1lbnQgaXMgZXhwZWN0ZWQgZm9yIFB5dGhvbiAyLjUuCi0KLUZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSB2YXJpb3VzIGNvbXBvbmVudHMgb2YgQXBwbGVTY3JpcHQgYW5kIE9TQSwgYW5kCi10byBnZXQgYW4gdW5kZXJzdGFuZGluZyBvZiB0aGUgYXJjaGl0ZWN0dXJlIGFuZCB0ZXJtaW5vbG9neSwgeW91IHNob3VsZAotcmVhZCBBcHBsZSdzIGRvY3VtZW50YXRpb24uIFRoZSAiQXBwbGVzY3JpcHQgTGFuZ3VhZ2UgR3VpZGUiIGV4cGxhaW5zCi10aGUgY29uY2VwdHVhbCBtb2RlbCBhbmQgdGhlIHRlcm1pbm9sb2d5LCBhbmQgZG9jdW1lbnRzIHRoZSBzdGFuZGFyZAotc3VpdGUuIFRoZSAiT3BlbiBTY3JpcHRpbmcgQXJjaGl0ZWN0dXJlIiBkb2N1bWVudCBleHBsYWlucyBob3cgdG8gdXNlCi1PU0EgZnJvbSBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtbWVycyBwb2ludCBvZiB2aWV3LiBJbiB0aGUgQXBwbGUgSGVscAotVmlld2VyIHRoZXNlIGJvb2tzIGFyZSBsb2NhdGVkIGluIHRoZSBEZXZlbG9wZXIgRG9jdW1lbnRhdGlvbiwgQ29yZQotVGVjaG5vbG9naWVzIHNlY3Rpb24uCi0KLQotQXMgYW4gZXhhbXBsZSBvZiBzY3JpcHRpbmcgYW4gYXBwbGljYXRpb24sIHRoZSBmb2xsb3dpbmcgcGllY2Ugb2YKLUFwcGxlU2NyaXB0IHdpbGwgZ2V0IHRoZSBuYW1lIG9mIHRoZSBmcm9udG1vc3QgXHByb2dyYW17RmluZGVyfSB3aW5kb3cKLWFuZCBwcmludCBpdDoKLQkKLVxiZWdpbnt2ZXJiYXRpbX0KLXRlbGwgYXBwbGljYXRpb24gIkZpbmRlciIKLSAgICBnZXQgbmFtZSBvZiB3aW5kb3cgMQotZW5kIHRlbGwKLVxlbmR7dmVyYmF0aW19Ci0KLUluIFB5dGhvbiwgdGhlIGZvbGxvd2luZyBjb2RlIGZyYWdtZW50IHdpbGwgZG8gdGhlIHNhbWU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCBGaW5kZXIKLQotZiA9IEZpbmRlci5GaW5kZXIoKQotcHJpbnQgZi5nZXQoZi53aW5kb3coMSkubmFtZSkKLVxlbmR7dmVyYmF0aW19Ci0KLUFzIGRpc3RyaWJ1dGVkIHRoZSBQeXRob24gbGlicmFyeSBpbmNsdWRlcyBwYWNrYWdlcyB0aGF0IGltcGxlbWVudCB0aGUKLXN0YW5kYXJkIHN1aXRlcywgcGx1cyBwYWNrYWdlcyB0aGF0IGludGVyZmFjZSB0byBhIHNtYWxsIG51bWJlciBvZgotY29tbW9uIGFwcGxpY2F0aW9ucy4KLQotVG8gc2VuZCBBcHBsZUV2ZW50cyB0byBhbiBhcHBsaWNhdGlvbiB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIFB5dGhvbgotcGFja2FnZSBpbnRlcmZhY2luZyB0byB0aGUgdGVybWlub2xvZ3kgb2YgdGhlIGFwcGxpY2F0aW9uICh3aGF0Ci1ccHJvZ3JhbXtTY3JpcHQgRWRpdG9yfSBjYWxscyB0aGUgIkRpY3Rpb25hcnkiKS4gVGhpcyBjYW4gYmUgZG9uZSBmcm9tCi13aXRoaW4gdGhlIFxwcm9ncmFte1B5dGhvbklERX0gb3IgYnkgcnVubmluZyB0aGUKLVxmaWxle2dlbnN1aXRlbW9kdWxlLnB5fSBtb2R1bGUgYXMgYSBzdGFuZGFsb25lIHByb2dyYW0gZnJvbSB0aGUgY29tbWFuZAotbGluZS4KLQotVGhlIGdlbmVyYXRlZCBvdXRwdXQgaXMgYSBwYWNrYWdlIHdpdGggYSBudW1iZXIgb2YgbW9kdWxlcywgb25lIGZvcgotZXZlcnkgc3VpdGUgdXNlZCBpbiB0aGUgcHJvZ3JhbSBwbHVzIGFuIFxtb2R1bGV7X19pbml0X199IG1vZHVsZSB0byBnbHVlCi1pdCBhbGwgdG9nZXRoZXIuIFRoZSBQeXRob24gaW5oZXJpdGFuY2UgZ3JhcGggZm9sbG93cyB0aGUgQXBwbGVTY3JpcHQKLWluaGVyaXRhbmNlIGdyYXBoLCBzbyBpZiBhIHByb2dyYW0ncyBkaWN0aW9uYXJ5IHNwZWNpZmllcyB0aGF0IGl0Ci1pbmNsdWRlcyBzdXBwb3J0IGZvciB0aGUgU3RhbmRhcmQgU3VpdGUsIGJ1dCBleHRlbmRzIG9uZSBvciB0d28gdmVyYnMKLXdpdGggZXh0cmEgYXJndW1lbnRzIHRoZW4gdGhlIG91dHB1dCBzdWl0ZSB3aWxsIGNvbnRhaW4gYSBtb2R1bGUKLVxtb2R1bGV7U3RhbmRhcmRfU3VpdGV9IHRoYXQgaW1wb3J0cyBhbmQgcmUtZXhwb3J0cyBldmVyeXRoaW5nIGZyb20KLVxtb2R1bGV7U3RkU3VpdGVzLlN0YW5kYXJkX1N1aXRlfSBidXQgb3ZlcnJpZGVzIHRoZSBtZXRob2RzIHRoYXQgaGF2ZQotZXh0cmEgZnVuY3Rpb25hbGl0eS4gVGhlIG91dHB1dCBvZiBcbW9kdWxle2dlbnN1aXRlbW9kdWxlfSBpcyBwcmV0dHkKLXJlYWRhYmxlLCBhbmQgY29udGFpbnMgdGhlIGRvY3VtZW50YXRpb24gdGhhdCB3YXMgaW4gdGhlIG9yaWdpbmFsCi1BcHBsZVNjcmlwdCBkaWN0aW9uYXJ5IGluIFB5dGhvbiBkb2NzdHJpbmdzLCBzbyByZWFkaW5nIGl0IGlzIGEgZ29vZAotc291cmNlIG9mIGRvY3VtZW50YXRpb24uCi0KLVRoZSBvdXRwdXQgcGFja2FnZSBpbXBsZW1lbnRzIGEgbWFpbiBjbGFzcyB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlCi1wYWNrYWdlIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgQXBwbGVTY3JpcHQgdmVyYnMgYXMgbWV0aG9kcywgd2l0aCB0aGUKLWRpcmVjdCBvYmplY3QgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IGFuZCBhbGwgb3B0aW9uYWwgcGFyYW1ldGVycyBhcwota2V5d29yZCBhcmd1bWVudHMuIEFwcGxlU2NyaXB0IGNsYXNzZXMgYXJlIGFsc28gaW1wbGVtZW50ZWQgYXMgUHl0aG9uCi1jbGFzc2VzLCBhcyBhcmUgY29tcGFyaXNvbnMgYW5kIGFsbCB0aGUgb3RoZXIgdGhpbmdpZXMuCi0KLVRoZSBtYWluCi1QeXRob24gY2xhc3MgaW1wbGVtZW50aW5nIHRoZSB2ZXJicyBhbHNvIGFsbG93cyBhY2Nlc3MgdG8gdGhlIHByb3BlcnRpZXMKLWFuZCBlbGVtZW50cyBkZWNsYXJlZCBpbiB0aGUgQXBwbGVTY3JpcHQgY2xhc3MgImFwcGxpY2F0aW9uIi4gSW4gdGhlCi1jdXJyZW50IHJlbGVhc2UgdGhhdCBpcyBhcyBmYXIgYXMgdGhlIG9iamVjdCBvcmllbnRhdGlvbiBnb2VzLCBzbwotaW4gdGhlIGV4YW1wbGUgYWJvdmUgd2UgbmVlZCB0byB1c2UKLVxjb2Rle2YuZ2V0KGYud2luZG93KDEpLm5hbWUpfSBpbnN0ZWFkIG9mIHRoZSBtb3JlIFB5dGhvbmljCi1cY29kZXtmLndpbmRvdygxKS5uYW1lLmdldCgpfS4KLQotCi1JZiBhbiBBcHBsZVNjcmlwdCBpZGVudGlmaWVyIGlzIG5vdCBhIFB5dGhvbiBpZGVudGlmaWVyIHRoZSBuYW1lIGlzCi1tYW5nbGVkIGFjY29yZGluZyB0byBhIHNtYWxsIG51bWJlciBvZiBydWxlczoKLVxiZWdpbntpdGVtaXplfQotICAgIFxpdGVtIHNwYWNlcyBhcmUgcmVwbGFjZWQgd2l0aCB1bmRlcnNjb3JlcwotICAgIFxpdGVtIG90aGVyIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhcmUgcmVwbGFjZWQgd2l0aAotICAgIFxjb2Rle194eF99IHdoZXJlIFxjb2Rle3h4fSBpcyB0aGUgaGV4YWRlY2ltYWwgY2hhcmFjdGVyIHZhbHVlCi0gICAgXGl0ZW0gYW55IFB5dGhvbiByZXNlcnZlZCB3b3JkIGdldHMgYW4gdW5kZXJzY29yZSBhcHBlbmRlZAotXGVuZHtpdGVtaXplfQotCi1QeXRob24gYWxzbyBoYXMgc3VwcG9ydCBmb3IgY3JlYXRpbmcgc2NyaXB0YWJsZSBhcHBsaWNhdGlvbnMKLWluIFB5dGhvbiwgYnV0Ci1UaGUgZm9sbG93aW5nIG1vZHVsZXMgYXJlIHJlbGV2YW50IHRvIE1hY1B5dGhvbiBBcHBsZVNjcmlwdCBzdXBwb3J0OgotCi1cbG9jYWxtb2R1bGV0YWJsZQotCi1JbiBhZGRpdGlvbiwgc3VwcG9ydCBtb2R1bGVzIGhhdmUgYmVlbiBwcmUtZ2VuZXJhdGVkIGZvcgotXG1vZHVsZXtGaW5kZXJ9LCBcbW9kdWxle1Rlcm1pbmFsfSwgXG1vZHVsZXtFeHBsb3Jlcn0sCi1cbW9kdWxle05ldHNjYXBlfSwgXG1vZHVsZXtDb2RlV2Fycmlvcn0sIFxtb2R1bGV7U3lzdGVtRXZlbnRzfSBhbmQKLVxtb2R1bGV7U3RkU3VpdGVzfS4KLQotXGlucHV0e2xpYmdlbnN1aXRlbW9kdWxlfQotXGlucHV0e2xpYmFldG9vbHN9Ci1caW5wdXR7bGliYWVwYWNrfQotXGlucHV0e2xpYmFldHlwZXN9Ci1caW5wdXR7bGlibWluaWFlfQpkaWZmIC0tZ2l0IGEvRG9jL21hYy90b29sYm94LnRleCBiL0RvYy9tYWMvdG9vbGJveC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3Y2UyNGYuLjAwMDAwMDAKLS0tIGEvRG9jL21hYy90b29sYm94LnRleAorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi1cY2hhcHRlcntNYWNPUyBUb29sYm94IE1vZHVsZXMgXGxhYmVse3Rvb2xib3h9fQotCi1UaGVyZSBhcmUgYSBzZXQgb2YgbW9kdWxlcyB0aGF0IHByb3ZpZGUgaW50ZXJmYWNlcyB0byB2YXJpb3VzIE1hY09TCi10b29sYm94ZXMuICBJZiBhcHBsaWNhYmxlIHRoZSBtb2R1bGUgd2lsbCBkZWZpbmUgYSBudW1iZXIgb2YgUHl0aG9uCi1vYmplY3RzIGZvciB0aGUgdmFyaW91cyBzdHJ1Y3R1cmVzIGRlY2xhcmVkIGJ5IHRoZSB0b29sYm94LCBhbmQKLW9wZXJhdGlvbnMgd2lsbCBiZSBpbXBsZW1lbnRlZCBhcyBtZXRob2RzIG9mIHRoZSBvYmplY3QuICBPdGhlcgotb3BlcmF0aW9ucyB3aWxsIGJlIGltcGxlbWVudGVkIGFzIGZ1bmN0aW9ucyBpbiB0aGUgbW9kdWxlLiAgTm90IGFsbAotb3BlcmF0aW9ucyBwb3NzaWJsZSBpbiBDIHdpbGwgYWxzbyBiZSBwb3NzaWJsZSBpbiBQeXRob24gKGNhbGxiYWNrcwotYXJlIG9mdGVuIGEgcHJvYmxlbSksIGFuZCBwYXJhbWV0ZXJzIHdpbGwgb2NjYXNpb25hbGx5IGJlIGRpZmZlcmVudCBpbgotUHl0aG9uIChpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMsIGVzcGVjaWFsbHkpLiAgQWxsIG1ldGhvZHMgYW5kCi1mdW5jdGlvbnMgaGF2ZSBhIFxtZW1iZXJ7X19kb2NfX30gc3RyaW5nIGRlc2NyaWJpbmcgdGhlaXIgYXJndW1lbnRzCi1hbmQgcmV0dXJuIHZhbHVlcywgYW5kIGZvciBhZGRpdGlvbmFsIGRlc2NyaXB0aW9uIHlvdSBhcmUgcmVmZXJyZWQgdG8KLVxjaXRldGl0bGVbaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi9tYWNvczgvbWFjOC5odG1sXXtJbnNpZGUKLU1hY2ludG9zaH0gb3Igc2ltaWxhciB3b3Jrcy4KLQotVGhlc2UgbW9kdWxlcyBhbGwgbGl2ZSBpbiBhIHBhY2thZ2UgY2FsbGVkIFxtb2R1bGV7Q2FyYm9ufS4gRGVzcGl0ZSB0aGF0IG5hbWUKLXRoZXkgYXJlIG5vdCBhbGwgcGFydCBvZiB0aGUgQ2FyYm9uIGZyYW1ld29yazogQ0YgaXMgcmVhbGx5IGluIHRoZSBDb3JlRm91bmRhdGlvbgotZnJhbWV3b3JrIGFuZCBRdCBpcyBpbiB0aGUgUXVpY2tUaW1lIGZyYW1ld29yay4KLVRoZSBub3JtYWwgdXNlIHBhdHRlcm4gaXMKLQotXGJlZ2lue3ZlcmJhdGltfQotZnJvbSBDYXJib24gaW1wb3J0IEFFCi1cZW5ke3ZlcmJhdGltfQotCi1cc3Ryb25ne1dhcm5pbmchfSAgVGhlc2UgbW9kdWxlcyBhcmUgbm90IHlldCBkb2N1bWVudGVkLiAgSWYgeW91Ci13aXNoIHRvIGNvbnRyaWJ1dGUgZG9jdW1lbnRhdGlvbiBvZiBhbnkgb2YgdGhlc2UgbW9kdWxlcywgcGxlYXNlIGdldAotaW4gdG91Y2ggd2l0aCBcZW1haWx7ZG9jc0BweXRob24ub3JnfS4KLQotXGxvY2FsbW9kdWxldGFibGUKLQotCi0lXHNlY3Rpb257QXJndW1lbnQgSGFuZGxpbmcgZm9yIFRvb2xib3ggTW9kdWxlc30KLQotCi1cc2VjdGlvbntcbW9kdWxle0NhcmJvbi5BRX0gLS0tIEFwcGxlIEV2ZW50c30KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtDYXJib24uQUV9Ci0gIFxwbGF0Zm9ybXtNYWN9Ci1cbW9kdWxlc3lub3BzaXN7SW50ZXJmYWNlIHRvIHRoZSBBcHBsZSBFdmVudHMgdG9vbGJveC59Ci0KLVxzZWN0aW9ue1xtb2R1bGV7Q2FyYm9uLkFIfSAtLS0gQXBwbGUgSGVscH0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtDYXJib24uQUh9Ci0gIFxwbGF0Zm9ybXtNYWN9Ci1cbW9kdWxlc3lub3BzaXN7SW50ZXJmYWNlIHRvIHRoZSBBcHBsZSBIZWxwIG1hbmFnZXIufQotCi0KLVxzZWN0aW9ue1xtb2R1bGV7Q2FyYm9uLkFwcH0gLS0tIEFwcGVhcmFuY2UgTWFuYWdlcn0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtDYXJib24uQXBwfQotICBccGxhdGZvcm17TWFjfQotXG1vZHVsZXN5bm9wc2lze0ludGVyZmFjZSB0byB0aGUgQXBwZWFyYW5jZSBNYW5hZ2VyLn0KLQotCi1cc2VjdGlvbntcbW9kdWxle0NhcmJvbi5DRn0gLS0tIENvcmUgRm91bmRhdGlvbn0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtDYXJib24uQ0Z9Ci0gIFxwbGF0Zm9ybXtNYWN9Ci1cbW9kdWxlc3lub3BzaXN7SW50ZXJmYWNlIHRvIHRoZSBDb3JlIEZvdW5kYXRpb24ufQotCi1UaGUKLVxjb2Rle0NGQmFzZX0sIFxjb2Rle0NGQXJyYXl9LCBcY29kZXtDRkRhdGF9LCBcY29kZXtDRkRpY3Rpb25hcnl9LAotXGNvZGV7Q0ZTdHJpbmd9IGFuZCBcY29kZXtDRlVSTH0gb2JqZWN0cyBhcmUgc3VwcG9ydGVkLCBzb21lCi1vbmx5IHBhcnRpYWxseS4KLQotXHNlY3Rpb257XG1vZHVsZXtDYXJib24uQ0d9IC0tLSBDb3JlIEdyYXBoaWNzfQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e0NhcmJvbi5DR30KLSAgXHBsYXRmb3Jte01hY30KLVxtb2R1bGVzeW5vcHNpc3tJbnRlcmZhY2UgdG8gdGhlIENvbXBvbmVudCBNYW5hZ2VyLn0KLQotXHNlY3Rpb257XG1vZHVsZXtDYXJib24uQ2FyYm9uRXZ0fSAtLS0gQ2FyYm9uIEV2ZW50IE1hbmFnZXJ9Ci1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17Q2FyYm9uLkNhcmJvbkV2dH0KLSAgXHBsYXRmb3Jte01hY30KLVxtb2R1bGVzeW5vcHNpc3tJbnRlcmZhY2UgdG8gdGhlIENhcmJvbiBFdmVudCBNYW5hZ2VyLn0KLQotXHNlY3Rpb257XG1vZHVsZXtDYXJib24uQ219IC0tLSBDb21wb25lbnQgTWFuYWdlcn0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtDYXJib24uQ219Ci0gIFxwbGF0Zm9ybXtNYWN9Ci1cbW9kdWxlc3lub3BzaXN7SW50ZXJmYWNlIHRvIHRoZSBDb21wb25lbnQgTWFuYWdlci59Ci0KLQotXHNlY3Rpb257XG1vZHVsZXtDYXJib24uQ3RsfSAtLS0gQ29udHJvbCBNYW5hZ2VyfQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e0NhcmJvbi5DdGx9Ci0gIFxwbGF0Zm9ybXtNYWN9Ci1cbW9kdWxlc3lub3BzaXN7SW50ZXJmYWNlIHRvIHRoZSBDb250cm9sIE1hbmFnZXIufQotCi0KLVxzZWN0aW9ue1xtb2R1bGV7Q2FyYm9uLkRsZ30gLS0tIERpYWxvZyBNYW5hZ2VyfQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e0NhcmJvbi5EbGd9Ci0gIFxwbGF0Zm9ybXtNYWN9Ci1cbW9kdWxlc3lub3BzaXN7SW50ZXJmYWNlIHRvIHRoZSBEaWFsb2cgTWFuYWdlci59Ci0KLQotXHNlY3Rpb257XG1vZHVsZXtDYXJib24uRXZ0fSAtLS0gRXZlbnQgTWFuYWdlcn0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtDYXJib24uRXZ0fQotICBccGxhdGZvcm17TWFjfQotXG1vZHVsZXN5bm9wc2lze0ludGVyZmFjZSB0byB0aGUgY2xhc3NpYyBFdmVudCBNYW5hZ2VyLn0KLQotCi1cc2VjdGlvbntcbW9kdWxle0NhcmJvbi5GbX0gLS0tIEZvbnQgTWFuYWdlcn0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtDYXJib24uRm19Ci0gIFxwbGF0Zm9ybXtNYWN9Ci1cbW9kdWxlc3lub3BzaXN7SW50ZXJmYWNlIHRvIHRoZSBGb250IE1hbmFnZXIufQotCi1cc2VjdGlvbntcbW9kdWxle0NhcmJvbi5Gb2xkZXJ9IC0tLSBGb2xkZXIgTWFuYWdlcn0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtDYXJib24uRm9sZGVyfQotICBccGxhdGZvcm17TWFjfQotXG1vZHVsZXN5bm9wc2lze0ludGVyZmFjZSB0byB0aGUgRm9sZGVyIE1hbmFnZXIufQotCi0KLVxzZWN0aW9ue1xtb2R1bGV7Q2FyYm9uLkhlbHB9IC0tLSBIZWxwIE1hbmFnZXJ9Ci1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17Q2FyYm9uLkhlbHB9Ci0gIFxwbGF0Zm9ybXtNYWN9Ci1cbW9kdWxlc3lub3BzaXN7SW50ZXJmYWNlIHRvIHRoZSBDYXJib24gSGVscCBNYW5hZ2VyLn0KLQotXHNlY3Rpb257XG1vZHVsZXtDYXJib24uTGlzdH0gLS0tIExpc3QgTWFuYWdlcn0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtDYXJib24uTGlzdH0KLSAgXHBsYXRmb3Jte01hY30KLVxtb2R1bGVzeW5vcHNpc3tJbnRlcmZhY2UgdG8gdGhlIExpc3QgTWFuYWdlci59Ci0KLQotXHNlY3Rpb257XG1vZHVsZXtDYXJib24uTWVudX0gLS0tIE1lbnUgTWFuYWdlcn0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtDYXJib24uTWVudX0KLSAgXHBsYXRmb3Jte01hY30KLVxtb2R1bGVzeW5vcHNpc3tJbnRlcmZhY2UgdG8gdGhlIE1lbnUgTWFuYWdlci59Ci0KLQotXHNlY3Rpb257XG1vZHVsZXtDYXJib24uTWx0ZX0gLS0tIE11bHRpTGluZ3VhbCBUZXh0IEVkaXRvcn0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtDYXJib24uTWx0ZX0KLSAgXHBsYXRmb3Jte01hY30KLVxtb2R1bGVzeW5vcHNpc3tJbnRlcmZhY2UgdG8gdGhlIE11bHRpTGluZ3VhbCBUZXh0IEVkaXRvci59Ci0KLQotXHNlY3Rpb257XG1vZHVsZXtDYXJib24uUWR9IC0tLSBRdWlja0RyYXd9Ci1cZGVjbGFyZW1vZHVsZXtidWlsdGlufXtDYXJib24uUWR9Ci0gIFxwbGF0Zm9ybXtNYWN9Ci1cbW9kdWxlc3lub3BzaXN7SW50ZXJmYWNlIHRvIHRoZSBRdWlja0RyYXcgdG9vbGJveC59Ci0KLQotXHNlY3Rpb257XG1vZHVsZXtDYXJib24uUWRvZmZzfSAtLS0gUXVpY2tEcmF3IE9mZnNjcmVlbn0KLVxkZWNsYXJlbW9kdWxle2J1aWx0aW59e0NhcmJvbi5RZG9mZnN9Ci0gIFxwbGF0Zm9ybXtNYWN9Ci1cbW9kdWxlc3lub3BzaXN7SW50ZXJmYWNlIHRvIHRoZSBRdWlja0RyYXcgT2Zmc2NyZWVuIEFQSXMufQotCi0KLVxzZWN0aW9ue1xtb2R1bGV7Q2FyYm9uLlF0fSAtLS0gUXVpY2tUaW1lfQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e0NhcmJvbi5RdH0KLSAgXHBsYXRmb3Jte01hY30KLVxtb2R1bGVzeW5vcHNpc3tJbnRlcmZhY2UgdG8gdGhlIFF1aWNrVGltZSB0b29sYm94Ln0KLQotCi1cc2VjdGlvbntcbW9kdWxle0NhcmJvbi5SZXN9IC0tLSBSZXNvdXJjZSBNYW5hZ2VyIGFuZCBIYW5kbGVzfQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e0NhcmJvbi5SZXN9Ci0gIFxwbGF0Zm9ybXtNYWN9Ci1cbW9kdWxlc3lub3BzaXN7SW50ZXJmYWNlIHRvIHRoZSBSZXNvdXJjZSBNYW5hZ2VyIGFuZCBIYW5kbGVzLn0KLQotXHNlY3Rpb257XG1vZHVsZXtDYXJib24uU2NyYXB9IC0tLSBTY3JhcCBNYW5hZ2VyfQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e0NhcmJvbi5TY3JhcH0KLSAgXHBsYXRmb3Jte01hY30KLVxtb2R1bGVzeW5vcHNpc3tJbnRlcmZhY2UgdG8gdGhlIENhcmJvbiBTY3JhcCBNYW5hZ2VyLn0KLQotXHNlY3Rpb257XG1vZHVsZXtDYXJib24uU25kfSAtLS0gU291bmQgTWFuYWdlcn0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtDYXJib24uU25kfQotICBccGxhdGZvcm17TWFjfQotXG1vZHVsZXN5bm9wc2lze0ludGVyZmFjZSB0byB0aGUgU291bmQgTWFuYWdlci59Ci0KLQotXHNlY3Rpb257XG1vZHVsZXtDYXJib24uVEV9IC0tLSBUZXh0RWRpdH0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtDYXJib24uVEV9Ci0gIFxwbGF0Zm9ybXtNYWN9Ci1cbW9kdWxlc3lub3BzaXN7SW50ZXJmYWNlIHRvIFRleHRFZGl0Ln0KLQotCi1cc2VjdGlvbntcbW9kdWxle0NhcmJvbi5XaW59IC0tLSBXaW5kb3cgTWFuYWdlcn0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtDYXJib24uV2lufQotICBccGxhdGZvcm17TWFjfQotXG1vZHVsZXN5bm9wc2lze0ludGVyZmFjZSB0byB0aGUgV2luZG93IE1hbmFnZXIufQpkaWZmIC0tZ2l0IGEvRG9jL21hYy91bmRvYy50ZXggYi9Eb2MvbWFjL3VuZG9jLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRiZjU4OS4uMDAwMDAwMAotLS0gYS9Eb2MvbWFjL3VuZG9jLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLVxjaGFwdGVye1VuZG9jdW1lbnRlZCBNb2R1bGVzIFxsYWJlbHt1bmRvY3VtZW50ZWQtbW9kdWxlc319Ci0KLQotVGhlIG1vZHVsZXMgaW4gdGhpcyBjaGFwdGVyIGFyZSBwb29ybHkgZG9jdW1lbnRlZCAoaWYgYXQgYWxsKS4gIElmIHlvdQotd2lzaCB0byBjb250cmlidXRlIGRvY3VtZW50YXRpb24gb2YgYW55IG9mIHRoZXNlIG1vZHVsZXMsIHBsZWFzZSBnZXQgaW4KLXRvdWNoIHdpdGgKLVx1bGlua3tcZW1haWx7ZG9jc0BweXRob24ub3JnfX17bWFpbHRvOmRvY3NAcHl0aG9uLm9yZ30uCi0KLVxsb2NhbG1vZHVsZXRhYmxlCi0KLQotXHNlY3Rpb257XG1vZHVsZXthcHBsZXNpbmdsZX0gLS0tIEFwcGxlU2luZ2xlIGRlY29kZXJ9Ci1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17YXBwbGVzaW5nbGV9Ci0gIFxwbGF0Zm9ybXtNYWN9Ci1cbW9kdWxlc3lub3BzaXN7UnVkaW1lbnRhcnkgZGVjb2RlciBmb3IgQXBwbGVTaW5nbGUgZm9ybWF0IGZpbGVzLn0KLQotCi1cc2VjdGlvbntcbW9kdWxle2J1aWxkdG9vbHN9IC0tLSBIZWxwZXIgbW9kdWxlIGZvciBCdWlsZEFwcGxldCBhbmQgRnJpZW5kc30KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtidWlsZHRvb2xzfQotICBccGxhdGZvcm17TWFjfQotXG1vZHVsZXN5bm9wc2lze0hlbHBlciBtb2R1bGUgZm9yIEJ1aWxkQXBwbGV0LCBCdWlsZEFwcGxpY2F0aW9uIGFuZAotICAgICAgICAgICAgICAgIG1hY2ZyZWV6ZS59Ci0KLVxkZXByZWNhdGVkezIuNH17fQotCi1cc2VjdGlvbntcbW9kdWxle2ljb3Blbn0gLS0tIEludGVybmV0IENvbmZpZyByZXBsYWNlbWVudCBmb3IgXG1ldGhvZHtvcGVuKCl9fQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2ljb3Blbn0KLSAgXHBsYXRmb3Jte01hY30KLVxtb2R1bGVzeW5vcHNpc3tJbnRlcm5ldCBDb25maWcgcmVwbGFjZW1lbnQgZm9yIFxtZXRob2R7b3BlbigpfS59Ci0KLUltcG9ydGluZyBcbW9kdWxle2ljb3Blbn0gd2lsbCByZXBsYWNlIHRoZSBidWlsdGluIFxtZXRob2R7b3BlbigpfQotd2l0aCBhIHZlcnNpb24gdGhhdCB1c2VzIEludGVybmV0IENvbmZpZyB0byBzZXQgZmlsZSB0eXBlIGFuZCBjcmVhdG9yCi1mb3IgbmV3IGZpbGVzLgotCi0KLVxzZWN0aW9ue1xtb2R1bGV7bWFjZXJyb3JzfSAtLS0gTWFjIE9TIEVycm9yc30KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXttYWNlcnJvcnN9Ci0gIFxwbGF0Zm9ybXtNYWN9Ci1cbW9kdWxlc3lub3BzaXN7Q29uc3RhbnQgZGVmaW5pdGlvbnMgZm9yIG1hbnkgTWFjIE9TIGVycm9yIGNvZGVzLn0KLQotXG1vZHVsZXttYWNlcnJvcnN9IGNvbnRhaW5zIGNvbnN0YW50IGRlZmluaXRpb25zIGZvciBtYW55IE1hYyBPUyBlcnJvcgotY29kZXMuCi0KLQotXHNlY3Rpb257XG1vZHVsZXttYWNyZXNvdXJjZX0gLS0tIExvY2F0ZSBzY3JpcHQgcmVzb3VyY2VzfQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e21hY3Jlc291cmNlfQotICBccGxhdGZvcm17TWFjfQotXG1vZHVsZXN5bm9wc2lze0xvY2F0ZSBzY3JpcHQgcmVzb3VyY2VzLn0KLQotXG1vZHVsZXttYWNyZXNvdXJjZX0gaGVscHMgc2NyaXB0cyBmaW5kaW5nIHRoZWlyIHJlc291cmNlcywgc3VjaCBhcwotZGlhbG9ncyBhbmQgbWVudXMsIHdpdGhvdXQgcmVxdWlyaW5nIHNwZWNpYWwgY2FzZSBjb2RlIGZvciB3aGVuIHRoZQotc2NyaXB0IGlzIHJ1biB1bmRlciBNYWNQeXRob24sIGFzIGEgTWFjUHl0aG9uIGFwcGxldCBvciB1bmRlciBPU1ggUHl0aG9uLgotCi1cc2VjdGlvbntcbW9kdWxle05hdn0gLS0tIE5hdlNlcnZpY2VzIGNhbGxzfQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e05hdn0KLSAgXHBsYXRmb3Jte01hY30KLVxtb2R1bGVzeW5vcHNpc3tJbnRlcmZhY2UgdG8gTmF2aWdhdGlvbiBTZXJ2aWNlcy59Ci0KLUEgbG93LWxldmVsIGludGVyZmFjZSB0byBOYXZpZ2F0aW9uIFNlcnZpY2VzLiAKLQotXHNlY3Rpb257XG1vZHVsZXtQaXhNYXBXcmFwcGVyfSAtLS0gV3JhcHBlciBmb3IgUGl4TWFwIG9iamVjdHN9Ci1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17UGl4TWFwV3JhcHBlcn0KLSAgXHBsYXRmb3Jte01hY30KLVxtb2R1bGVzeW5vcHNpc3tXcmFwcGVyIGZvciBQaXhNYXAgb2JqZWN0cy59Ci0KLVxtb2R1bGV7UGl4TWFwV3JhcHBlcn0gd3JhcHMgYSBQaXhNYXAgb2JqZWN0IHdpdGggYSBQeXRob24gb2JqZWN0IHRoYXQKLWFsbG93cyBhY2Nlc3MgdG8gdGhlIGZpZWxkcyBieSBuYW1lLiBJdCBhbHNvIGhhcyBtZXRob2RzIHRvIGNvbnZlcnQKLXRvIGFuZCBmcm9tIFxtb2R1bGV7UElMfSBpbWFnZXMuCi0KLVxzZWN0aW9ue1xtb2R1bGV7dmlkZW9yZWFkZXJ9IC0tLSBSZWFkIFF1aWNrVGltZSBtb3ZpZXN9Ci1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17dmlkZW9yZWFkZXJ9Ci0gIFxwbGF0Zm9ybXtNYWN9Ci1cbW9kdWxlc3lub3BzaXN7UmVhZCBRdWlja1RpbWUgbW92aWVzIGZyYW1lIGJ5IGZyYW1lIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcufQotCi1cbW9kdWxle3ZpZGVvcmVhZGVyfSByZWFkcyBhbmQgZGVjb2RlcyBRdWlja1RpbWUgbW92aWVzIGFuZCBwYXNzZXMKLWEgc3RyZWFtIG9mIGltYWdlcyB0byB5b3VyIHByb2dyYW0uIEl0IGFsc28gcHJvdmlkZXMgc29tZSBzdXBwb3J0IGZvcgotYXVkaW8gdHJhY2tzLgotCi1cc2VjdGlvbntcbW9kdWxle1d9IC0tLSBXaWRnZXRzIGJ1aWx0IG9uIFxtb2R1bGV7RnJhbWVXb3JrfX0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtXfQotICBccGxhdGZvcm17TWFjfQotXG1vZHVsZXN5bm9wc2lze1dpZGdldHMgZm9yIHRoZSBNYWMsIGJ1aWx0IG9uIHRvcCBvZiBccmVmbW9kdWxle0ZyYW1lV29ya30ufQotCi1UaGUgXG1vZHVsZXtXfSB3aWRnZXRzIGFyZSB1c2VkIGV4dGVuc2l2ZWx5IGluIHRoZSBccHJvZ3JhbXtJREV9LgotCmRpZmYgLS1naXQgYS9Eb2MvbWFjL3VzaW5nLnRleCBiL0RvYy9tYWMvdXNpbmcudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTUyMmM2Li4wMDAwMDAwCi0tLSBhL0RvYy9tYWMvdXNpbmcudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLVxjaGFwdGVye1VzaW5nIFB5dGhvbiBvbiBhIE1hY2ludG9zaCBcbGFiZWx7dXNpbmd9fQotXHNlY3Rpb25hdXRob3J7Qm9iIFNhdmFnZX17Ym9ic2F2YWdlQG1hYy5jb219Ci0KLVB5dGhvbiBvbiBhIE1hY2ludG9zaCBydW5uaW5nIE1hYyBPUyBYIGlzIGluIHByaW5jaXBsZSB2ZXJ5IHNpbWlsYXIgdG8KLVB5dGhvbiBvbiBhbnkgb3RoZXIgXFVOSVh7fSBwbGF0Zm9ybSwgYnV0IHRoZXJlIGFyZSBhIG51bWJlciBvZiBhZGRpdGlvbmFsCi1mZWF0dXJlcyBzdWNoIGFzIHRoZSBJREUgYW5kIHRoZSBQYWNrYWdlIE1hbmFnZXIgdGhhdCBhcmUgd29ydGggcG9pbnRpbmcgb3V0LgotCi1QeXRob24gb24gTWFjIE9TIDkgb3IgZWFybGllciBjYW4gYmUgcXVpdGUgZGlmZmVyZW50IGZyb20gUHl0aG9uIG9uCi1cVU5JWHt9IG9yIFdpbmRvd3MsIGJ1dCBpcyBiZXlvbmQgdGhlIHNjb3BlIG9mIHRoaXMgbWFudWFsLCBhcyB0aGF0IHBsYXRmb3JtCi1pcyBubyBsb25nZXIgc3VwcG9ydGVkLCBzdGFydGluZyB3aXRoIFB5dGhvbiAyLjQuIFNlZQotXHVybHtodHRwOi8vd3d3LmN3aS5ubC9cdGV4dGFzY2lpdGlsZGUgamFjay9tYWNweXRob259IGZvciBpbnN0YWxsZXJzCi1mb3IgdGhlIGxhdGVzdCAyLjMgcmVsZWFzZSBmb3IgTWFjIE9TIDkgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbi4KLQotXHNlY3Rpb257R2V0dGluZyBhbmQgSW5zdGFsbGluZyBNYWNQeXRob24gXGxhYmVse2dldHRpbmctT1NYfX0KLQotTWFjIE9TIFggMTAuNCBjb21lcyB3aXRoIFB5dGhvbiAyLjMgcHJlLWluc3RhbGxlZCBieSBBcHBsZS4gSG93ZXZlciwgeW91IGFyZQotZW5jb3VyYWdlZCB0byBpbnN0YWxsIHRoZSBtb3N0IHJlY2VudCB2ZXJzaW9uIG9mIFB5dGhvbiBmcm9tIHRoZSBQeXRob24gd2Vic2l0ZQotKFx1cmx7aHR0cDovL3d3dy5weXRob24ub3JnfSkuIEEgYGB1bml2ZXJzYWwgYmluYXJ5JycgYnVpbGQgb2YgUHl0aG9uIDIuNSwgd2hpY2gKLXJ1bnMgbmF0aXZlbHkgb24gdGhlIE1hYydzIG5ldyBJbnRlbCBhbmQgbGVnYWN5IFBQQyBDUFUncywgaXMgYXZhaWxhYmxlIHRoZXJlLgotCi1XaGF0IHlvdSBnZXQgYWZ0ZXIgaW5zdGFsbGluZyBpcyBhIG51bWJlciBvZiB0aGluZ3M6Ci0KLVxiZWdpbntpdGVtaXplfQotXGl0ZW0gQSBcZmlsZXtNYWNQeXRob24gMi41fSBmb2xkZXIgaW4geW91ciBcZmlsZXtBcHBsaWNhdGlvbnN9IGZvbGRlci4gSW4gaGVyZQotICB5b3UgZmluZCBJRExFLCB0aGUgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgdGhhdCBpcyBhIHN0YW5kYXJkIHBhcnQgb2Ygb2ZmaWNpYWwKLSAgUHl0aG9uIGRpc3RyaWJ1dGlvbnM7IFB5dGhvbkxhdW5jaGVyLCB3aGljaCBoYW5kbGVzIGRvdWJsZS1jbGlja2luZyBQeXRob24KLSAgc2NyaXB0cyBmcm9tIHRoZSBGaW5kZXI7IGFuZCB0aGUgYGBCdWlsZCBBcHBsZXQnJyB0b29sLCB3aGljaCBhbGxvd3MgeW91IHRvCi0gIHBhY2thZ2UgUHl0aG9uIHNjcmlwdHMgYXMgc3RhbmRhbG9uZSBhcHBsaWNhdGlvbnMgb24geW91ciBzeXN0ZW0uCi0KLVxpdGVtIEEgZnJhbWV3b3JrIFxmaWxley9MaWJyYXJ5L0ZyYW1ld29ya3MvUHl0aG9uLmZyYW1ld29ya30sIHdoaWNoIGluY2x1ZGVzCi0gIHRoZSBQeXRob24gZXhlY3V0YWJsZSBhbmQgbGlicmFyaWVzLiBUaGUgaW5zdGFsbGVyIGFkZHMgdGhpcyBsb2NhdGlvbiB0byB5b3VyCi0gIHNoZWxsIHBhdGguIFRvIHVuaW5zdGFsbCBNYWNQeXRob24sIHlvdSBjYW4gc2ltcGx5IHJlbW92ZSB0aGVzZSB0aHJlZQotICB0aGluZ3MuIEEgc3ltbGluayB0byB0aGUgUHl0aG9uIGV4ZWN1dGFibGUgaXMgcGxhY2VkIGluIC91c3IvbG9jYWwvYmluLy4KLVxlbmR7aXRlbWl6ZX0KLQotVGhlIEFwcGxlLXByb3ZpZGVkIGJ1aWxkIG9mIFB5dGhvbiBpcyBpbnN0YWxsZWQgaW4KLVxmaWxley9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL1B5dGhvbi5mcmFtZXdvcmt9IGFuZCBcZmlsZXsvdXNyL2Jpbi9weXRob259LAotcmVzcGVjdGl2ZWx5LiBZb3Ugc2hvdWxkIG5ldmVyIG1vZGlmeSBvciBkZWxldGUgdGhlc2UsIGFzIHRoZXkgYXJlCi1BcHBsZS1jb250cm9sbGVkIGFuZCBhcmUgdXNlZCBieSBBcHBsZS0gb3IgdGhpcmQtcGFydHkgc29mdHdhcmUuCi0KLUlETEUgaW5jbHVkZXMgYSBoZWxwIG1lbnUgdGhhdCBhbGxvd3MgeW91IHRvIGFjY2VzcyBQeXRob24gZG9jdW1lbnRhdGlvbi4gSWYgeW91Ci1hcmUgY29tcGxldGVseSBuZXcgdG8gUHl0aG9uIHlvdSBzaG91bGQgc3RhcnQgcmVhZGluZyB0aGUgdHV0b3JpYWwgaW50cm9kdWN0aW9uCi1pbiB0aGF0IGRvY3VtZW50LgotCi1JZiB5b3UgYXJlIGZhbWlsaWFyIHdpdGggUHl0aG9uIG9uIG90aGVyIFxVTklYe30gcGxhdGZvcm1zIHlvdSBzaG91bGQgcmVhZCB0aGUKLXNlY3Rpb24gb24gcnVubmluZyBQeXRob24gc2NyaXB0cyBmcm9tIHRoZSBcVU5JWHt9IHNoZWxsLgotCi0KLVxzdWJzZWN0aW9ue0hvdyB0byBydW4gYSBQeXRob24gc2NyaXB0fQotCi1Zb3VyIGJlc3Qgd2F5IHRvIGdldCBzdGFydGVkIHdpdGggUHl0aG9uIG9uIE1hYyBPUyBYIGlzIHRocm91Z2ggdGhlIElETEUKLWludGVncmF0ZWQgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIHNlZSBzZWN0aW9uIFxyZWZ7SURFfSBhbmQgdXNlIHRoZSBIZWxwIG1lbnUKLXdoZW4gdGhlIElERSBpcyBydW5uaW5nLgotCi1JZiB5b3Ugd2FudCB0byBydW4gUHl0aG9uIHNjcmlwdHMgZnJvbSB0aGUgVGVybWluYWwgd2luZG93IGNvbW1hbmQgbGluZSBvciBmcm9tCi10aGUgRmluZGVyIHlvdSBmaXJzdCBuZWVkIGFuIGVkaXRvciB0byBjcmVhdGUgeW91ciBzY3JpcHQuIE1hYyBPUyBYIGNvbWVzIHdpdGggYQotbnVtYmVyIG9mIHN0YW5kYXJkIFxVTklYe30gY29tbWFuZCBsaW5lIGVkaXRvcnMsIFxwcm9ncmFte3ZpbX0gYW5kCi1ccHJvZ3JhbXtlbWFjc30gYW1vbmcgdGhlbS4gSWYgeW91IHdhbnQgYSBtb3JlIE1hYy1saWtlIGVkaXRvciwgXHByb2dyYW17QkJFZGl0fQotb3IgXHByb2dyYW17VGV4dFdyYW5nbGVyfSBmcm9tIEJhcmUgQm9uZXMgU29mdHdhcmUgKHNlZQotXHVybHtodHRwOi8vd3d3LmJhcmVib25lcy5jb20vcHJvZHVjdHMvYmJlZGl0L2luZGV4LnNodG1sfSkgYXJlIGdvb2QgY2hvaWNlcywgYXMKLWlzIFxwcm9ncmFte1RleHRNYXRlfSAoc2VlIFx1cmx7aHR0cDovL21hY3JvbWF0ZXMuY29tL30pLiBPdGhlciBlZGl0b3JzIGluY2x1ZGUKLVxwcm9ncmFte0d2aW19IChcdXJse2h0dHA6Ly9tYWN2aW0ub3JnfSkgYW5kIFxwcm9ncmFte0FxdWFtYWNzfQotKFx1cmx7aHR0cDovL2FxdWFtYWNzLm9yZ30pLgotCi1UbyBydW4geW91ciBzY3JpcHQgZnJvbSB0aGUgVGVybWluYWwgd2luZG93IHlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0Ci1cZmlsZXsvdXNyL2xvY2FsL2Jpbn0gaXMgaW4geW91ciBzaGVsbCBzZWFyY2ggcGF0aC4KLQotVG8gcnVuIHlvdXIgc2NyaXB0IGZyb20gdGhlIEZpbmRlciB5b3UgaGF2ZSB0d28gb3B0aW9uczoKLQotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSBEcmFnIGl0IHRvIFxwcm9ncmFte1B5dGhvbkxhdW5jaGVyfQotXGl0ZW0gU2VsZWN0IFxwcm9ncmFte1B5dGhvbkxhdW5jaGVyfSBhcyB0aGUgZGVmYXVsdCBhcHBsaWNhdGlvbiB0byBvcGVuIHlvdXIKLSAgc2NyaXB0IChvciBhbnkgLnB5IHNjcmlwdCkgdGhyb3VnaCB0aGUgZmluZGVyIEluZm8gd2luZG93IGFuZCBkb3VibGUtY2xpY2sgaXQuCi0gIFxwcm9ncmFte1B5dGhvbkxhdW5jaGVyfSBoYXMgdmFyaW91cyBwcmVmZXJlbmNlcyB0byBjb250cm9sIGhvdyB5b3VyIHNjcmlwdCBpcwotICBsYXVuY2hlZC4gT3B0aW9uLWRyYWdnaW5nIGFsbG93cyB5b3UgdG8gY2hhbmdlIHRoZXNlIGZvciBvbmUgaW52b2NhdGlvbiwgb3IKLSAgdXNlIGl0cyBQcmVmZXJlbmNlcyBtZW51IHRvIGNoYW5nZSB0aGluZ3MgZ2xvYmFsbHkuCi1cZW5ke2l0ZW1pemV9Ci0KLQotXHN1YnNlY3Rpb257UnVubmluZyBzY3JpcHRzIHdpdGggYSBHVUkgXGxhYmVse29zeC1ndWktc2NyaXB0c319Ci0KLVdpdGggb2xkZXIgdmVyc2lvbnMgb2YgUHl0aG9uLCB0aGVyZSBpcyBvbmUgTWFjIE9TIFggcXVpcmsgdGhhdCB5b3UgbmVlZCB0byBiZQotYXdhcmUgb2Y6IHByb2dyYW1zIHRoYXQgdGFsayB0byB0aGUgQXF1YSB3aW5kb3cgbWFuYWdlciAoaW4gb3RoZXIgd29yZHMsCi1hbnl0aGluZyB0aGF0IGhhcyBhIEdVSSkgbmVlZCB0byBiZSBydW4gaW4gYSBzcGVjaWFsIHdheS4gVXNlIFxwcm9ncmFte3B5dGhvbnd9Ci1pbnN0ZWFkIG9mIFxwcm9ncmFte3B5dGhvbn0gdG8gc3RhcnQgc3VjaCBzY3JpcHRzLgotCi1XaXRoIFB5dGhvbiAyLjUsIHlvdSBjYW4gdXNlIGVpdGhlciBccHJvZ3JhbXtweXRob259IG9yIFxwcm9ncmFte3B5dGhvbnd9LgotCi1cc3Vic2VjdGlvbntDb25maWd1cmF0aW9ufQotCi1QeXRob24gb24gT1MgWCBob25vcnMgYWxsIHN0YW5kYXJkIFxVTklYe30gZW52aXJvbm1lbnQgdmFyaWFibGVzIHN1Y2ggYXMKLVxlbnZ2YXJ7UFlUSE9OUEFUSH0sIGJ1dCBzZXR0aW5nIHRoZXNlIHZhcmlhYmxlcyBmb3IgcHJvZ3JhbXMgc3RhcnRlZCBmcm9tIHRoZQotRmluZGVyIGlzIG5vbi1zdGFuZGFyZCBhcyB0aGUgRmluZGVyIGRvZXMgbm90IHJlYWQgeW91ciBcZmlsZXsucHJvZmlsZX0gb3IKLVxmaWxley5jc2hyY30gYXQgc3RhcnR1cC4gWW91IG5lZWQgdG8gY3JlYXRlIGEgZmlsZSBcZmlsZXtcdGV4dGFzY2lpdGlsZGUKLSAgLy5NYWNPU1gvZW52aXJvbm1lbnQucGxpc3R9LiBTZWUgQXBwbGUncyBUZWNobmljYWwgRG9jdW1lbnQgUUExMDY3IGZvcgotZGV0YWlscy4KLQotRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaW5zdGFsbGF0aW9uIFB5dGhvbiBwYWNrYWdlcyBpbiBNYWNQeXRob24sIHNlZSBzZWN0aW9uCi1ccmVme21hYy1wYWNrYWdlLW1hbmFnZXJ9LCBgYEluc3RhbGxpbmcgQWRkaXRpb25hbCBQeXRob24gUGFja2FnZXMuJycKLQotCi1cc2VjdGlvbntUaGUgSURFXGxhYmVse0lERX19Ci0KLU1hY1B5dGhvbiBzaGlwcyB3aXRoIHRoZSBzdGFuZGFyZCBJRExFIGRldmVsb3BtZW50IGVudmlyb25tZW50LiBBIGdvb2QKLWludHJvZHVjdGlvbiB0byB1c2luZyBJRExFIGNhbiBiZSBmb3VuZCBhdAotXHVybHtodHRwOi8vaGtuLmVlY3MuYmVya2VsZXkuZWR1L35keW9vL3B5dGhvbi9pZGxlX2ludHJvL2luZGV4Lmh0bWx9LgotCi0KLVxzZWN0aW9ue0luc3RhbGxpbmcgQWRkaXRpb25hbCBQeXRob24gUGFja2FnZXMgXGxhYmVse21hYy1wYWNrYWdlLW1hbmFnZXJ9fQotCi1UaGVyZSBhcmUgc2V2ZXJhbCBtZXRob2RzIHRvIGluc3RhbGwgYWRkaXRpb25hbCBQeXRob24gcGFja2FnZXM6Ci0KLVxiZWdpbntpdGVtaXplfQotXGl0ZW0gXHVybHtodHRwOi8vcHl0aG9ubWFjLm9yZy9wYWNrYWdlcy99IGNvbnRhaW5zIHNlbGVjdGVkIGNvbXBpbGVkIHBhY2thZ2VzCi0gIGZvciBQeXRob24gMi41LCAyLjQsIGFuZCAyLjMuCi1caXRlbSBQYWNrYWdlcyBjYW4gYmUgaW5zdGFsbGVkIHZpYSB0aGUgc3RhbmRhcmQgUHl0aG9uIGRpc3R1dGlscyBtb2RlCi0gIChcc2FtcHtweXRob24gc2V0dXAucHkgaW5zdGFsbH0pLgotXGl0ZW0gTWFueSBwYWNrYWdlcyBjYW4gYWxzbyBiZSBpbnN0YWxsZWQgdmlhIHRoZSBccHJvZ3JhbXtzZXR1cHRvb2xzfQotICBleHRlbnNpb24uCi1cZW5ke2l0ZW1pemV9Ci0KLQotXHNlY3Rpb257R1VJIFByb2dyYW1taW5nIG9uIHRoZSBNYWN9Ci0KLVRoZXJlIGFyZSBzZXZlcmFsIG9wdGlvbnMgZm9yIGJ1aWxkaW5nIEdVSSBhcHBsaWNhdGlvbnMgb24gdGhlIE1hYyB3aXRoIFB5dGhvbi4KLQotXGVtcGh7UHlPYmpDfSBpcyBhIFB5dGhvbiBiaW5kaW5nIHRvIEFwcGxlJ3MgT2JqZWN0aXZlLUMvQ29jb2EgZnJhbWV3b3JrLCB3aGljaAotaXMgdGhlIGZvdW5kYXRpb24gb2YgbW9zdCBtb2Rlcm4gTWFjIGRldmVsb3BtZW50LiBJbmZvcm1hdGlvbiBvbiBQeU9iakMgaXMKLWF2YWlsYWJsZSBmcm9tIFx1cmx7aHR0cDovL3B5Ym9qYy5zb3VyY2Vmb3JnZS5uZXR9LgotCi1UaGUgc3RhbmRhcmQgUHl0aG9uIEdVSSB0b29sa2l0IGlzIFxtb2R1bGV7VGtpbnRlcn0sIGJhc2VkIG9uIHRoZSBjcm9zcy1wbGF0Zm9ybQotVGsgdG9vbGtpdCAoXHVybHtodHRwOi8vd3d3LnRjbC50a30pLiBBbiBBcXVhLW5hdGl2ZSB2ZXJzaW9uIG9mIFRrIGlzIGJ1bmRsZWQKLXdpdGggT1MgWCBieSBBcHBsZSwgYW5kIHRoZSBsYXRlc3QgdmVyc2lvbiBjYW4gYmUgZG93bmxvYWRlZCBhbmQgaW5zdGFsbGVkIGZyb20KLVx1cmx7aHR0cDovL3d3dy5hY3RpdmVzdGF0ZS5jb219OyBpdCBjYW4gYWxzbyBiZSBidWlsdCBmcm9tIHNvdXJjZS4KLQotXGVtcGh7d3hQeXRob259IGlzIGFub3RoZXIgcG9wdWxhciBjcm9zcy1wbGF0Zm9ybSBHVUkgdG9vbGtpdCB0aGF0IHJ1bnMgbmF0aXZlbHkKLW9uIE1hYyBPUyBYLiBQYWNrYWdlcyBhbmQgZG9jdW1lbnRhdGlvbiBhcmUgYXZhaWxhYmxlIGZyb20KLVx1cmx7aHR0cDovL3d3dy53eHB5dGhvbi5vcmd9LgotCi1cZW1waHtQeVF0fSBpcyBhbm90aGVyIHBvcHVsYXIgY3Jvc3MtcGxhdGZvcm0gR1VJIHRvb2xraXQgdGhhdCBydW5zIG5hdGl2ZWx5IG9uCi1NYWMgT1MgWC4gTW9yZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgYXQKLVx1cmx7aHR0cDovL3d3dy5yaXZlcmJhbmtjb21wdXRpbmcuY28udWsvcHlxdC99LgotCi0KLVxzZWN0aW9ue0Rpc3RyaWJ1dGluZyBQeXRob24gQXBwbGljYXRpb25zIG9uIHRoZSBNYWN9Ci0KLVRoZSBgYEJ1aWxkIEFwcGxldCcnIHRvb2wgdGhhdCBpcyBwbGFjZWQgaW4gdGhlIE1hY1B5dGhvbiAyLjUgZm9sZGVyIGlzIGZpbmUgZm9yCi1wYWNrYWdpbmcgc21hbGwgUHl0aG9uIHNjcmlwdHMgb24geW91ciBvd24gbWFjaGluZSB0byBydW4gYXMgYSBzdGFuZGFyZCBNYWMKLWFwcGxpY2F0aW9uLiBUaGlzIHRvb2wsIGhvd2V2ZXIsIGlzIG5vdCByb2J1c3QgZW5vdWdoIHRvIGRpc3RyaWJ1dGUgUHl0aG9uCi1hcHBsaWNhdGlvbnMgdG8gb3RoZXIgdXNlcnMuCi0KLVRoZSBzdGFuZGFyZCB0b29sIGZvciBkZXBsb3lpbmcgc3RhbmRhbG9uZSBQeXRob24gYXBwbGljYXRpb25zIG9uIHRoZSBNYWMgaXMKLVxwcm9ncmFte3B5MmFwcH0uIE1vcmUgaW5mb3JtYXRpb24gb24gaW5zdGFsbGluZyBhbmQgdXNpbmcgcHkyYXBwIGNhbiBiZSBmb3VuZAotYXQgXHVybHtodHRwOi8vdW5kZWZpbmVkLm9yZy9weXRob24vXCNweTJhcHB9LgotCi1cc2VjdGlvbntBcHBsaWNhdGlvbiBTY3JpcHRpbmd9Ci0KLVB5dGhvbiBjYW4gYWxzbyBiZSB1c2VkIHRvIHNjcmlwdCBvdGhlciBNYWMgYXBwbGljYXRpb25zIHZpYSBBcHBsZSdzIE9wZW4KLVNjcmlwdGluZyBBcmNoaXRlY3R1cmUgKE9TQSk7IHNlZQotXHVybHtodHRwOi8vYXBwc2NyaXB0LnNvdXJjZWZvcmdlLm5ldH0uIEFwcHNjcmlwdCBpcyBhIGhpZ2gtbGV2ZWwsIHVzZXItZnJpZW5kbHkKLUFwcGxlIGV2ZW50IGJyaWRnZSB0aGF0IGFsbG93cyB5b3UgdG8gY29udHJvbCBzY3JpcHRhYmxlIE1hYyBPUyBYIGFwcGxpY2F0aW9ucwotdXNpbmcgb3JkaW5hcnkgUHl0aG9uIHNjcmlwdHMuIEFwcHNjcmlwdCBtYWtlcyBQeXRob24gYSBzZXJpb3VzIGFsdGVybmF0aXZlIHRvCi1BcHBsZSdzIG93biBcZW1waHtBcHBsZVNjcmlwdH0gbGFuZ3VhZ2UgZm9yIGF1dG9tYXRpbmcgeW91ciBNYWMuIEEgcmVsYXRlZAotcGFja2FnZSwgXGVtcGh7UHlPU0F9LCBpcyBhbiBPU0EgbGFuZ3VhZ2UgY29tcG9uZW50IGZvciB0aGUgUHl0aG9uIHNjcmlwdGluZwotbGFuZ3VhZ2UsIGFsbG93aW5nIFB5dGhvbiBjb2RlIHRvIGJlIGV4ZWN1dGVkIGJ5IGFueSBPU0EtZW5hYmxlZCBhcHBsaWNhdGlvbgotKFNjcmlwdCBFZGl0b3IsIE1haWwsIGlUdW5lcywgZXRjLikuIFB5T1NBIG1ha2VzIFB5dGhvbiBhIGZ1bGwgcGVlciB0bwotQXBwbGVTY3JpcHQuCi0KLVxzZWN0aW9ue090aGVyIFJlc291cmNlc30KLQotVGhlIE1hY1B5dGhvbiBtYWlsaW5nIGxpc3QgaXMgYW4gZXhjZWxsZW50IHN1cHBvcnQgcmVzb3VyY2UgZm9yIFB5dGhvbiB1c2VycyBhbmQKLWRldmVsb3BlcnMgb24gdGhlIE1hYzoKLQotXHVybHtodHRwOi8vd3d3LnB5dGhvbi5vcmcvY29tbXVuaXR5L3NpZ3MvY3VycmVudC9weXRob25tYWMtc2lnL30KLQotQW5vdGhlciB1c2VmdWwgcmVzb3VyY2UgaXMgdGhlIE1hY1B5dGhvbiB3aWtpOgotCi1cdXJse2h0dHA6Ly93aWtpLnB5dGhvbi5vcmcvbW9pbi9NYWNQeXRob259CmRpZmYgLS1naXQgYS9Eb2MvcGFwZXItYTQvcHlwYXBlci5zdHkgYi9Eb2MvcGFwZXItYTQvcHlwYXBlci5zdHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MTVhYWQuLjAwMDAwMDAKLS0tIGEvRG9jL3BhcGVyLWE0L3B5cGFwZXIuc3R5CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotJQotJSAgQ2hhbmdlIHRoaXMgdG8gc2F5IGE0cGFwZXIgaW5zdGVhZCBvZiBsZXR0ZXJwYXBlciBpZiB5b3Ugd2FudCBBNC4KLSUKLVxuZXdjb21tYW5ke1xweUBwYXBlcn17YTRwYXBlcn0KLVxuZXdjb21tYW5ke1xweUBwdHNpemV9ezEwcHR9Ci0KLSUgIFRoZXNlIHNldCB1cCB0aGUgZm9udHMgZm9yIHRoZSBkb2N1bWVudHMuCi0lCi0lICBUaGUgInRpbWVzIiBwYWNrYWdlIG1ha2VzIHRoZSBkZWZhdWx0IGZvbnQgdGhlIFBvc3RTY3JpcHQgVGltZXMKLSUgIGZvbnQsIHdoaWNoIG1ha2VzIGZvciBzbWFsbGVyIFBvc3RTY3JpcHQgYW5kIGEgZm9udCB0aGF0IG1vcmUgcGVvcGxlIAotJSAgbGlrZS4KLSUKLSUgIFRoZSAiYXZhbnQiIHBhY2thZ2UgY2F1c2VzIHRoZSBBdmFudEdhcmRlIGZvbnQgdG8gYmUgdXNlZCBmb3IKLSUgIHNhbnMtc2VyaWYgdGV4dCwgaW5zdGVhZCBvZiB0aGUgdWdsaWVyIEhlbHZldGljYSBzZXQgdXAgYnkgdGhlICJ0aW1lcyIKLSUgIHBhY2thZ2UuCi0lCi1cUmVxdWlyZVBhY2thZ2V7dGltZXN9XHR5cGVvdXR7VXNpbmcgVGltZXMgaW5zdGVhZCBvZiBDb21wdXRlciBNb2Rlcm4ufQpkaWZmIC0tZ2l0IGEvRG9jL3BlcmwvU3lub3BzaXNUYWJsZS5wbSBiL0RvYy9wZXJsL1N5bm9wc2lzVGFibGUucG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNjVhNjcuLjAwMDAwMDAKLS0tIGEvRG9jL3BlcmwvU3lub3BzaXNUYWJsZS5wbQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLXBhY2thZ2UgU3lub3BzaXNUYWJsZTsKLQotc3ViIG5ld3sKLSAgICByZXR1cm4gYmxlc3Mge25hbWVzPT4nJywgaW5mbz0+e30sIGZpbGU9PicnfTsKLX0KLQotc3ViIGRlY2xhcmV7Ci0gICAgbXkoJHNlbGYsJG5hbWUsJGtleSwkdHlwZSkgPSBAXzsKLSAgICBpZiAoJHNlbGYtPntuYW1lc30pIHsKLSAgICAgICAgJHNlbGYtPntuYW1lc30gLj0gIiwkbmFtZSI7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAkc2VsZi0+e25hbWVzfSAuPSAiJG5hbWUiOwotICAgIH0KLSAgICAkc2VsZi0+e2luZm99eyRuYW1lfSA9ICIka2V5LCR0eXBlLCI7Ci19Ci0KLSMgVGhlICdmaWxlJyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBzdG9yZSB0aGUgZmlsZW5hbWUgb2YgdGhlIG5vZGUgaW4gd2hpY2gKLSMgdGhlIHRhYmxlIHdpbGwgYmUgcHJlc2VudGVkOyB0aGlzIGFzc3VtZXMgdGhhdCBlYWNoIHRhYmxlIHdpbGwgYmUgcHJlc2VudGVkCi0jIG9ubHkgb25jZSwgd2hpY2ggd29ya3MgZm9yIHRoZSBjdXJyZW50IHVzZSBvZiB0aGlzIG9iamVjdC4KLQotc3ViIHNldF9maWxlewotICAgIG15KCRzZWxmLCAkZmlsZW5hbWUpID0gQF87Ci0gICAgJHNlbGYtPntmaWxlfSA9ICIkZmlsZW5hbWUiOwotfQotCi1zdWIgZ2V0X2ZpbGV7Ci0gICAgbXkgJHNlbGYgPSBzaGlmdDsKLSAgICByZXR1cm4gJHNlbGYtPntmaWxlfTsKLX0KLQotc3ViIHNldF9zeW5vcHNpc3sKLSAgICBteSgkc2VsZiwkbmFtZSwkc3lub3BzaXMpID0gQF87Ci0gICAgbXkoJGtleSwkdHlwZSwkdW51c2VkKSA9IHNwbGl0ICcsJywgJHNlbGYtPntpbmZvfXskbmFtZX0sIDM7Ci0gICAgJHNlbGYtPntpbmZvfXskbmFtZX0gPSAiJGtleSwkdHlwZSwkc3lub3BzaXMiOwotfQotCi1zdWIgZ2V0ewotICAgIG15KCRzZWxmLCRuYW1lKSA9IEBfOwotICAgIHJldHVybiBzcGxpdCAvLC8sICRzZWxmLT57aW5mb317JG5hbWV9LCAzOwotfQotCi1zdWIgc2hvd3sKLSAgICBteSAkc2VsZiA9IHNoaWZ0OwotICAgIG15ICRuYW1lOwotICAgIHByaW50ICJuYW1lczogIiwgJHNlbGYtPntuYW1lc30sICJcblxuIjsKLSAgICBmb3JlYWNoICRuYW1lIChzcGxpdCAvLC8sICRzZWxmLT57bmFtZXN9KSB7Ci0gICAgICAgIG15KCRrZXksJHR5cGUsJHN5bm9wc2lzKSA9ICRzZWxmLT5nZXQoJG5hbWUpOwotICAgICAgICBwcmludCAiJG5hbWUoJGtleSkgaXMgJHR5cGU6ICRzeW5vcHNpc1xuIjsKLSAgICB9Ci19Ci0KLXN1YiB0b2h0bWx7Ci0gICAgbXkgJHNlbGYgPSBzaGlmdDsKLSAgICBteSAkb2Rkcm93ID0gMTsKLSAgICBteSAkZGF0YSA9ICI8dGFibGUgY2xhc3M9J3N5bm9wc2lzdGFibGUnIHZhbGlnbj0nYmFzZWxpbmUnPlxuIjsKLSAgICBteSAkbmFtZTsKLSAgICBmb3JlYWNoICRuYW1lIChzcGxpdCAvLC8sICRzZWxmLT57bmFtZXN9KSB7Ci0gICAgICAgIG15KCRrZXksJHR5cGUsJHN5bm9wc2lzKSA9ICRzZWxmLT5nZXQoJG5hbWUpOwotICAgICAgICBteSAkbGluayA9ICI8YSBocmVmPSdtb2R1bGUtJGtleS5odG1sJz4iOwotICAgICAgICAkc3lub3BzaXMgPX4gcy88dGV4Mmh0bWxfcGVyY2VudF9tYXJrPi8lL2c7Ci0gICAgICAgICRzeW5vcHNpcyA9fiBzLzx0ZXgyaHRtbF9hbXBlcnNhbmRfbWFyaz4vXCZhbXA7L2c7Ci0gICAgICAgICRkYXRhIC49ICgnICA8dHInCi0gICAgICAgICAgICAgICAgICAuICgkb2Rkcm93ID8gIiBjbGFzcz0nb2Rkcm93Jz5cbiAgICAgICIgOiAnPicpCi0gICAgICAgICAgICAgICAgICAuICI8dGQ+PGI+PHR0IGNsYXNzPSdtb2R1bGUnPiRsaW5rJG5hbWU8L2E+PC90dD48L2I+PC90ZD5cbiIKLSAgICAgICAgICAgICAgICAgIC4gIiAgICAgIDx0ZD5cJm5ic3A7PC90ZD5cbiIKLSAgICAgICAgICAgICAgICAgIC4gIiAgICAgIDx0ZCBjbGFzcz0nc3lub3BzaXMnPiRzeW5vcHNpczwvdGQ+PC90cj5cbiIpOwotICAgICAgICAkb2Rkcm93ID0gISRvZGRyb3c7Ci0gICAgfQotICAgICRkYXRhIC49ICI8L3RhYmxlPlxuIjsKLSAgICAkZGF0YTsKLX0KLQotCi1wYWNrYWdlIHRlc3RTeW5vcHNpc1RhYmxlOwotCi1zdWIgdGVzdHsKLSAgICAjIHRoaXMgbGl0dGxlIHRlc3QgaXMgbW9zdGx5IHRvIGRlYnVnIHRoZSBzdHVmZiBhYm92ZSwgc2luY2UgdGhpcyBpcwotICAgICMgbXkgZmlyc3QgUGVybCAib2JqZWN0Ii4KLSAgICBteSAkc3QgPSBTeW5vcHNpc1RhYmxlLT5uZXcoKTsKLSAgICAkc3QtPmRlY2xhcmUoInNhbXBsZSIsICJzYW1wbGUiLCAic3RhbmRhcmQiKTsKLSAgICAkc3QtPnNldF9zeW5vcHNpcygic2FtcGxlIiwgIlRoaXMgaXMgYSBsaXR0bGUgc3lub3BzaXMuLi4uIik7Ci0gICAgJHN0LT5kZWNsYXJlKCJjb3B5X3JlZyIsICJjb3B5cmVnIiwgInN0YW5kYXJkIik7Ci0gICAgJHN0LT5zZXRfc3lub3BzaXMoImNvcHlfcmVnIiwgInBpY2tsZSBzdXBwb3J0IHN0dWZmIik7Ci0gICAgJHN0LT5zaG93KCk7Ci0KLSAgICBwcmludCAiXG5cbiI7Ci0KLSAgICBteSAkc3QyID0gU3lub3BzaXNUYWJsZS0+bmV3KCk7Ci0gICAgJHN0Mi0+ZGVjbGFyZSgic3QybW9kdWxlIiwgInN0Mm1vZHVsZSIsICJidWlsdC1pbiIpOwotICAgICRzdDItPnNldF9zeW5vcHNpcygic3QybW9kdWxlIiwgInNpbGx5IGxpdHRsZSBzeW5vcHNpcyIpOwotICAgICRzdDItPnNob3coKTsKLX0KLQotMTsgICAgICAjIFRoaXMgbXVzdCBiZSB0aGUgbGFzdCBsaW5lIC0tIFBlcmwgaXMgYm9ndXMhCmRpZmYgLS1naXQgYS9Eb2MvcGVybC9kaXN0dXRpbHMucGVybCBiL0RvYy9wZXJsL2Rpc3R1dGlscy5wZXJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmMyZTRhLi4wMDAwMDAwCi0tLSBhL0RvYy9wZXJsL2Rpc3R1dGlscy5wZXJsCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyBMYVRlWDJIVE1MIHN1cHBvcnQgZm9yIGRpc3R1dGlscy5zdHkuCi0KLXBhY2thZ2UgbWFpbjsKLQotc3ViIGRvX2NtZF9jb21tYW5kIHsKLSAgICByZXR1cm4gdXNlX3dyYXBwZXJzKEBfWzBdLCAnPGNvZGUgY2xhc3M9ImR1LWNvbW1hbmQiPicsICc8L2NvZGU+Jyk7Ci19Ci0KLXN1YiBkb19jbWRfb3B0aW9uIHsKLSAgICByZXR1cm4gdXNlX3dyYXBwZXJzKEBfWzBdLCAnPHNwYW4gY2xhc3M9ImR1LW9wdGlvbiI+JywgJzwvc3Bhbj4nKTsKLX0KLQotc3ViIGRvX2NtZF9maWxldmFyIHsKLSAgICByZXR1cm4gdXNlX3dyYXBwZXJzKEBfWzBdLCAnPHNwYW4gY2xhc3M9ImR1LWZpbGV2YXIiPicsICc8L3NwYW4+Jyk7Ci19Ci0KLXN1YiBkb19jbWRfWFhYIHsKLSAgICByZXR1cm4gdXNlX3dyYXBwZXJzKEBfWzBdLCAnPGIgY2xhc3M9ImR1LXh4eCI+JywgJzwvYj4nKTsKLX0KLQotMTsgICMgQmFkIFBlcmwuCmRpZmYgLS1naXQgYS9Eb2MvcGVybC9ob3d0by5wZXJsIGIvRG9jL3BlcmwvaG93dG8ucGVybApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY3OTFlYi4uMDAwMDAwMAotLS0gYS9Eb2MvcGVybC9ob3d0by5wZXJsCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyAtKi0gcGVybCAtKi0KLSMKLSMgVGhpcyBpbXBsZW1lbnRzIHRoZSBQeXRob24gaG93dG8gY2xhc3MuICBBbGwgaXQgcmVhbGx5IG5lZWRzIHRvIGRvIGl0Ci0jIGxvYWQgdGhlICJweXRob24iIHN0eWxlLgotCi1wYWNrYWdlIG1haW47Ci0KLWRvX3JlcXVpcmVfcGFja2FnZSgiYXJ0aWNsZSIpOwotZG9fcmVxdWlyZV9wYWNrYWdlKCJhbGx0dCIpOwotZG9fcmVxdWlyZV9wYWNrYWdlKCJweXRob24iKTsKLQotMTsJCQkJIyBzaGVlc2guLi4uCmRpZmYgLS1naXQgYS9Eb2MvcGVybC9pc2lsby5wZXJsIGIvRG9jL3BlcmwvaXNpbG8ucGVybApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk5MGIzNi4uMDAwMDAwMAotLS0gYS9Eb2MvcGVybC9pc2lsby5wZXJsCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotcGFja2FnZSBtYWluOwotCi0kVVNJTkdfU1RZTEVTID0gMDsKLSROT19OQVZJR0FUSU9OID0gMTsKLSRJTkRFWF9DT0xVTU5TID0gMTsKLSRNT0RVTEVfSU5ERVhfQ09MVU1OUyA9IDE7Ci0KLXN1YiBjaGlsZF9saW5lIHsKLSAgICByZXR1cm4gJyc7Ci19Ci0KLTE7ICAgICAgIyBzdHVwaWQgcGVybC4uLgpkaWZmIC0tZ2l0IGEvRG9jL3BlcmwvbDJoaW5pdC5wZXJsIGIvRG9jL3BlcmwvbDJoaW5pdC5wZXJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzVkMTIzLi4wMDAwMDAwCi0tLSBhL0RvYy9wZXJsL2wyaGluaXQucGVybAorKysgL2Rldi9udWxsCkBAIC0xLDgwMSArMCwwIEBACi0jIExhVGVYMkhUTUwgc3VwcG9ydCBiYXNlIGZvciB1c2Ugd2l0aCBQeXRob24gZG9jdW1lbnRhdGlvbi4KLQotcGFja2FnZSBtYWluOwotCi11c2UgTDJob3M7Ci0KLSRIVE1MX1ZFUlNJT04gPSA0LjAxOwotJExPV0VSX0NBU0VfVEFHUyA9IDE7Ci0kTk9fRlJFTkNIX1FVT1RFUyA9IDE7Ci0KLSMgJycgaW4gXGNvZGV7Li4ufSBpcyBzdGlsbCBjb252ZXJ0ZWQsIHNvIHdlIGNhbid0IHVzZSB0aGlzIHlldC4KLSMkVVNFX0NVUkxZX1FVT1RFUyA9IDE7Ci0KLSMgRm9yY2UgVW5pY29kZSBzdXBwb3J0IHRvIGJlIGxvYWRlZDsgcmVxdWVzdCBVVEYtOCBvdXRwdXQuCi1kb19yZXF1aXJlX2V4dGVuc2lvbigndW5pY29kZScpOwotZG9fcmVxdWlyZV9leHRlbnNpb24oJ3V0ZjgnKTsKLSRIVE1MX09QVElPTlMgPSAndXRmOCc7Ci0KLSRNQVhfTElOS19ERVBUSCA9IDI7Ci0kQUREUkVTUyA9ICcnOwotCi0kTk9fRk9PVE5PREUgPSAxOwotJE5VTUJFUkVEX0ZPT1ROT1RFUyA9IDE7Ci0KLSMgUHl0aG9uIGRvY3VtZW50YXRpb24gdXNlcyBzZWN0aW9uIG51bWJlcnMgdG8gc3VwcG9ydCByZWZlcmVuY2VzIHRvIG1hdGNoCi0jIGluIHRoZSBwcmludGVkIGFuZCBvbmxpbmUgdmVyc2lvbnMuCi0jCi0kU0hPV19TRUNUSU9OX05VTUJFUlMgPSAxOwotCi0kSUNPTlNFUlZFUiA9ICcuJzsKLSRJTUFHRV9UWVBFID0gJ2dpZic7Ci0KLSMgQ29udHJvbCB3aGVyZSB0aGUgbmF2aWdhdGlvbiBiYXJzIHNob3VsZCBzaG93IHVwOgotJFRPUF9OQVZJR0FUSU9OID0gMTsKLSRCT1RUT01fTkFWSUdBVElPTiA9IDE7Ci0kQVVUT19OQVZJR0FUSU9OID0gMDsKLQotJEJPRFlURVhUID0gJyc7Ci0kQ0hJTERMSU5FID0gIlxuPHA+PGJyIC8+PC9wPjxociBjbGFzcz0nb25saW5lLW5hdmlnYXRpb24nIC8+XG4iOwotJFZFUkJPU0lUWSA9IDA7Ci0KLSMgZGVmYXVsdCAjIG9mIGNvbHVtbnMgZm9yIHRoZSBpbmRleGVzCi0kSU5ERVhfQ09MVU1OUyA9IDI7Ci0kTU9EVUxFX0lOREVYX0NPTFVNTlMgPSA0OwotCi0kSEFWRV9NT0RVTEVfSU5ERVggPSAwOwotJEhBVkVfR0VORVJBTF9JTkRFWCA9IDA7Ci0kSEFWRV9UQUJMRV9PRl9DT05URU5UUyA9IDA7Ci0KLSRBRVNPUF9NRVRBX1RZUEUgPSAnaW5mb3JtYXRpb24nOwotCi0KLSMgQSBsaXR0bGUgcGFpbmZ1bCwgYnV0IGxldHMgdXMgY2xlYW4gdXAgdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkgYSBsaXR0bGUsCi0jIGFuZCBub3QgYmUgdGllZCB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkgKGFzIGZhciBhcyBJIGNhbiB0ZWxsKS4gIFRlc3RpbmcKLSMgYW4gZXhpc3RpbmcgZGVmaW5pdGlvbiBvZiAkbXlkaXIgaXMgbmVlZGVkIHNpbmNlIGl0IGNhbm5vdCBiZSBjb21wdXRlZCB3aGVuCi0jIHJ1biB1bmRlciBta2hvd3RvIHdpdGggcmVjZW50IHZlcnNpb25zIG9mIExhVGVYMkhUTUwsIHNpbmNlIHRoaXMgZmlsZSBpcwotIyBub3QgcmVhZCBkaXJlY3RseSBieSBMYVRlWDJIVE1MIGFueSBtb3JlLiAgbWtob3d0byBpcyByZXF1aXJlZCB0byBwcmVwZW5kCi0jIHRoZSByZXF1aXJlZCBkZWZpbml0aW9uIGF0IHRoZSB0b3Agb2YgdGhlIGFjdHVhbCBpbnB1dCBmaWxlLgotIwotaWYgKCFkZWZpbmVkICRteWRpcikgewotICAgIHVzZSBDd2Q7Ci0gICAgdXNlIEZpbGU6OkJhc2VuYW1lOwotICAgICgkbXluYW1lLCAkbXlkaXIsICRteWV4dCkgPSBmaWxlcGFyc2UoX19GSUxFX18sICdcLi4qJyk7Ci0gICAgY2hvcCAkbXlkaXI7ICAgICAgICAgICAgICAgICAgICAgICAgIyByZW1vdmUgdHJhaWxpbmcgJy8nCi0gICAgJG15ZGlyID0gZ2V0Y3dkKCkgLiAiJGRkJG15ZGlyIgotICAgICAgICB1bmxlc3MgJG15ZGlyID1+IHN8Xi98L3w7Ci19Ci0kTEFURVgySFRNTFNUWUxFUyA9ICIkbXlkaXIkZW52a2V5JExBVEVYMkhUTUxTVFlMRVMiOwotcHVzaCAoQElOQywgJG15ZGlyKTsKLQotKCRteXJvb3RuYW1lLCAkbXlyb290ZGlyLCAkbXlleHQpID0gZmlsZXBhcnNlKCRteWRpciwgJ1wuLionKTsKLWNob3AgJG15cm9vdGRpcjsKLQotCi0jIEhhY2tpc2ggd2F5IHRvIGdldCB0aGUgYXBwcm9wcmlhdGUgcGFwZXItKi8gZGlyZWN0b3J5IGludG8gJFRFWElOUFVUUzsKLSMgcGFzcyBpbiB0aGUgcGFwZXIgc2l6ZSAoYTQgb3IgbGV0dGVyKSBhcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgUEFQRVIKLSMgdG8gYWRkIHRoZSByaWdodCBkaXJlY3RvcnkuICBJZiBub3QgZ2l2ZW4sIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcwotIyBhZGRlZCBpbnN0ZWFkIGZvciB1c2Ugd2l0aCBIT1dUTyBwcm9jZXNzaW5nLgotIwotaWYgKGRlZmluZWQgJEVOVnsnUEFQRVInfSkgewotICAgICRteXRleGlucHV0cyA9ICIkbXlyb290ZGlyJHtkZH1wYXBlci0kRU5WeydQQVBFUid9JGVudmtleSI7Ci19Ci1lbHNlIHsKLSAgICAkbXl0ZXhpbnB1dHMgPSBnZXRjd2QoKSAuICRlbnZrZXk7Ci19Ci0kbXl0ZXhpbnB1dHMgLj0gIiRteXJvb3RkaXIke2RkfXRleGlucHV0cyI7Ci0KLQotIyBDaGFuZ2UgdGhpcyB2YXJpYWJsZSB0byBjaGFuZ2UgdGhlIHRleHQgYWRkZWQgaW4gIkFib3V0IHRoaXMgZG9jdW1lbnQuLi4iOwotIyB0aGlzIHNob3VsZCBiZSBhbiBhYnNvbHV0ZSBwYXRobmFtZSB0byBnZXQgaXQgcmlnaHQuCi0jCi0kQUJPVVRfRklMRSA9ICIkbXlyb290ZGlyJHtkZH1odG1sJHtkZH1zdGRhYm91dC5kYXQiOwotCi0KLXN1YiBjdXN0b21fZHJpdmVyX2hvb2sgewotICAgICMKLSAgICAjIFRoaXMgYWRkcyB0aGUgZGlyZWN0b3J5IG9mIHRoZSBtYWluIGlucHV0IGZpbGUgdG8gJFRFWElOUFVUUzsgaXQKLSAgICAjIHNlZW1zIHRvIGJlIHN1ZmZpY2llbnRseSBnZW5lcmFsIHRoYXQgaXQgc2hvdWxkIGJlIGZpbmUgZm9yIEhPV1RPCi0gICAgIyBwcm9jZXNzaW5nLgotICAgICMKLSAgICAjIFhYWCBUaGlzIHN0aWxsIGlzbid0IHF1aXRlIHJpZ2h0OyB3ZSBzaG91bGQgYWN0dWFsbHkgYmUgaW5zZXJ0aW5nCi0gICAgIyAkbXl0ZXhpbnB1dHMganVzdCBiZWZvcmUgYW55IGVtcHR5IGVudHJ5IGluIFRFWElOUFVUUyBpcyBvbmUKLSAgICAjIGV4aXN0cyBpbnN0ZWFkIG9mIGp1c3QgY29uY2F0ZW5hdGluZyB0aGUgcGllY2VzIGxpa2Ugd2UgZG8gaGVyZS4KLSAgICAjCi0gICAgbXkgJGZpbGUgPSAkX1swXTsKLSAgICBteSgkam9ibmFtZSwgJGRpciwgJGV4dCkgPSBmaWxlcGFyc2UoJGZpbGUsICdcLi4qJyk7Ci0gICAgJGRpciA9IEwyaG9zLT5NYWtlX2RpcmVjdG9yeV9hYnNvbHV0ZSgkZGlyKTsKLSAgICAkZGlyID1+IHMvJGRkJC8vOwotICAgICRURVhJTlBVVFMgPSAiJGRpciRlbnZrZXkkbXl0ZXhpbnB1dHMiOwotICAgICMgUHVzaCBldmVyeXRoaW5nIGludG8gJFRFWElOUFVUUyBzaW5jZSBMYVRlWDJIVE1MIGRvZXNuJ3QgcGljawotICAgICMgdGhpcyB1cCBvbiBpdHMgb3duOyB3ZSBjbGVhciAkRU5WeydURVhJTlBVVFMnfSBzbyB0aGUgdmFsdWUgc2V0Ci0gICAgIyBmb3IgdGhpcyBieSB0aGUgbWFpbiBMYVRlWDJIVE1MIHNjcmlwdCBkb2Vzbid0IGNvbnRhaW4gZHVwbGljYXRlCi0gICAgIyBkaXJlY3Rvcmllcy4KLSAgICBpZiAoJEVOVnsnVEVYSU5QVVRTJ30pIHsKLSAgICAgICAgJFRFWElOUFVUUyAuPSAiJGVudmtleSRFTlZ7J1RFWElOUFVUUyd9IjsKLSAgICAgICAgJEVOVnsnVEVYSU5QVVRTJ30gPSB1bmRlZjsKLSAgICB9Ci0gICAgcHJpbnQgIlxuU2V0dGluZyBcJFRFWElOUFVUUyB0byAkVEVYSU5QVVRTXG4iOwotCi0gICAgIyBOb3Qgc3VyZSB3aHkgd2UgbmVlZCB0byBkZWFsIHdpdGggdGhpcyBib3RoIGhlcmUgYW5kIGF0IHRoZSB0b3AsCi0gICAgIyBidXQgdGhpcyBpcyBuZWVkZWQgdG8gYWN0dWFsbHkgbWFrZSBpdCB3b3JrLgotICAgIGRvX3JlcXVpcmVfZXh0ZW5zaW9uKCd1dGY4Jyk7Ci0gICAgJGNoYXJzZXQgPSAkdXRmOF9zdHI7Ci0gICAgJENIQVJTRVQgPSAkdXRmOF9zdHI7Ci0gICAgJFVTRV9VVEYgPSAxOwotfQotCi0KLSMgJENVU1RPTV9CVVRUT05TIGlzIG9ubHkgdXNlZCBmb3IgdGhlIG1vZHVsZSBpbmRleCBsaW5rLgotJENVU1RPTV9CVVRUT05TID0gJyc7Ci0KLXN1YiBtYWtlX25hdl9zZWN0cmVmKCQkJCkgewotICAgIG15KCRsYWJlbCwgJGxpbmt0eXBlLCAkdGl0bGUpID0gQF87Ci0gICAgaWYgKCR0aXRsZSkgewotICAgICAgICBpZiAoJHRpdGxlID1+IC9cPFthQV0gLykgewotICAgICAgICAgICAgJHRpdGxlID1+IHMvXDxbYUFdIC88YSBjbGFzcz0ic2VjdHJlZiIgcmVsPSIkbGlua3R5cGUiIC87Ci0gICAgICAgICAgICAkdGl0bGUgPX4gcy8gSFJFRj0vIGhyZWY9LzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICR0aXRsZSA9ICI8c3BhbiBjbGFzcz1cInNlY3RyZWZcIj4kdGl0bGU8L3NwYW4+IjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIjxiIGNsYXNzPVwibmF2bGFiZWxcIj4kbGFiZWw6PC9iPlxuJHRpdGxlXG4iOwotICAgIH0KLSAgICByZXR1cm4gJyc7Ci19Ci0KLUBteV9pY29uX3RhZ3MgPSAoKTsKLSRteV9pY29uX3RhZ3N7J25leHQnfSA9ICdOZXh0IFBhZ2UnOwotJG15X2ljb25fdGFnc3snbmV4dF9wYWdlJ30gPSAnTmV4dCBQYWdlJzsKLSRteV9pY29uX3RhZ3N7J3ByZXZpb3VzJ30gPSAnUHJldmlvdXMgUGFnZSc7Ci0kbXlfaWNvbl90YWdzeydwcmV2aW91c19wYWdlJ30gPSAnUHJldmlvdXMgUGFnZSc7Ci0kbXlfaWNvbl90YWdzeyd1cCd9ID0gJ1VwIE9uZSBMZXZlbCc7Ci0kbXlfaWNvbl90YWdzeydjb250ZW50cyd9ID0gJ0NvbnRlbnRzJzsKLSRteV9pY29uX3RhZ3N7J2luZGV4J30gPSAnSW5kZXgnOwotJG15X2ljb25fdGFnc3snbW9kdWxlcyd9ID0gJ01vZHVsZSBJbmRleCc7Ci0KLUBteV9pY29uX25hbWVzID0gKCk7Ci0kbXlfaWNvbl9uYW1lc3sncHJldmlvdXNfcGFnZSd9ID0gJ3ByZXZpb3VzJzsKLSRteV9pY29uX25hbWVzeyduZXh0X3BhZ2UnfSA9ICduZXh0JzsKLQotc3ViIGdldF9teV9pY29uKCQpIHsKLSAgICBteSAkbmFtZSA9ICRfWzBdOwotICAgIG15ICR0ZXh0ID0gJG15X2ljb25fdGFnc3skbmFtZX07Ci0gICAgaWYgKCRteV9pY29uX25hbWVzeyRuYW1lfSkgewotICAgICAgICAkbmFtZSA9ICRteV9pY29uX25hbWVzeyRuYW1lfTsKLSAgICB9Ci0gICAgaWYgKCR0ZXh0IGVxICcnKSB7Ci0gICAgICAgICRuYW1lID0gJ2JsYW5rJzsKLSAgICB9Ci0gICAgbXkgJGljb25zZXJ2ZXIgPSAoJElDT05TRVJWRVIgZXEgJy4nKSA/ICcnIDogIiRJQ09OU0VSVkVSLyI7Ci0gICAgcmV0dXJuICI8aW1nIHNyYz0nJGljb25zZXJ2ZXIkbmFtZS4kSU1BR0VfVFlQRSdcbiAgYm9yZGVyPScwJyIKLSAgICAgICAgICAgLiAiIGhlaWdodD0nMzInICBhbHQ9JyR0ZXh0JyB3aWR0aD0nMzInIC8+IjsKLX0KLQotc3ViIHVubGlua2lmeSgkKSB7Ci0gICAgbXkgJHRleHQgPSAiJF9bMF0iOwotICAgICR0ZXh0ID1+IHN8PC9bYUFdPnx8OwotICAgICR0ZXh0ID1+IHN8PGFccytbXj5dKj58fGk7Ci0gICAgcmV0dXJuICR0ZXh0OwotfQotCi1zdWIgdXNlX2ljb24oJCQkKSB7Ci0gICAgbXkoJHJlbCwkc3RyLCR0aXRsZSkgPSBAXzsKLSAgICBpZiAoJHN0cikgewotICAgICAgICBteSAkcyA9ICIkc3RyIjsKLSAgICAgICAgaWYgKCRzID1+IC9cPHRleDJodG1sXyhbYS16X10rKV92aXNpYmxlX21hcmtcPi8pIHsKLSAgICAgICAgICAgIG15ICRyID0gZ2V0X215X2ljb24oJDEpOwotICAgICAgICAgICAgJHMgPX4gcy9cPHRleDJodG1sX1thLXpfXStfdmlzaWJsZV9tYXJrXD4vJHIvOwotICAgICAgICB9Ci0gICAgICAgICRzID1+IHMvPFthQV0gLzxhIHJlbD0iJHJlbCIgdGl0bGU9IiR0aXRsZSJcbiAgLzsKLSAgICAgICAgJHMgPX4gcy8gSFJFRj0vIGhyZWY9LzsKLSAgICAgICAgcmV0dXJuICRzOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGdldF9teV9pY29uKCdibGFuaycpOwotICAgIH0KLX0KLQotc3ViIG1ha2VfbmF2X3BhbmVsKCkgewotICAgIG15ICRzOwotICAgICMgbmV3IGljb25pYyAgICAgICAgIHJlbCAgICAgICAgIGljb25pYyAgICAgcGFnZSB0aXRsZQotICAgIG15ICRuZXh0ICAgICA9IHVzZV9pY29uKCduZXh0JywgICAgICRORVhULCAgICAgdW5saW5raWZ5KCRORVhUX1RJVExFKSk7Ci0gICAgbXkgJHVwICAgICAgID0gdXNlX2ljb24oJ3BhcmVudCcsICAgJFVQLCAgICAgICB1bmxpbmtpZnkoJFVQX1RJVExFKSk7Ci0gICAgbXkgJHByZXZpb3VzID0gdXNlX2ljb24oJ3ByZXYnLCAgICAgJFBSRVZJT1VTLCB1bmxpbmtpZnkoJFBSRVZJT1VTX1RJVExFKSk7Ci0gICAgbXkgJGNvbnRlbnRzID0gdXNlX2ljb24oJ2NvbnRlbnRzJywgJENPTlRFTlRTLCAnVGFibGUgb2YgQ29udGVudHMnKTsKLSAgICBteSAkaW5kZXggICAgPSB1c2VfaWNvbignaW5kZXgnLCAgICAkSU5ERVgsICAgICdJbmRleCcpOwotICAgIGlmICghJENVU1RPTV9CVVRUT05TKSB7Ci0gICAgICAgICRDVVNUT01fQlVUVE9OUyA9IGdldF9teV9pY29uKCdibGFuaycpOwotICAgIH0KLSAgICAkcyA9ICgnPHRhYmxlIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjIiPicKLSAgICAgICAgICAuICJcbjx0cj4iCi0gICAgICAgICAgIyBsZWZ0LWhhbmQgc2lkZQotICAgICAgICAgIC4gIlxuPHRkIGNsYXNzPSdvbmxpbmUtbmF2aWdhdGlvbic+JHByZXZpb3VzPC90ZD4iCi0gICAgICAgICAgLiAiXG48dGQgY2xhc3M9J29ubGluZS1uYXZpZ2F0aW9uJz4kdXA8L3RkPiIKLSAgICAgICAgICAuICJcbjx0ZCBjbGFzcz0nb25saW5lLW5hdmlnYXRpb24nPiRuZXh0PC90ZD4iCi0gICAgICAgICAgIyB0aXRsZSBib3gKLSAgICAgICAgICAuICJcbjx0ZCBhbGlnbj1cImNlbnRlclwiIHdpZHRoPVwiMTAwJVwiPiR0X3RpdGxlPC90ZD4iCi0gICAgICAgICAgIyByaWdodC1oYW5kIHNpZGUKLSAgICAgICAgICAuICJcbjx0ZCBjbGFzcz0nb25saW5lLW5hdmlnYXRpb24nPiRjb250ZW50czwvdGQ+IgotICAgICAgICAgICMgbW9kdWxlIGluZGV4Ci0gICAgICAgICAgLiAiXG48dGQgY2xhc3M9J29ubGluZS1uYXZpZ2F0aW9uJz4kQ1VTVE9NX0JVVFRPTlM8L3RkPiIKLSAgICAgICAgICAuICJcbjx0ZCBjbGFzcz0nb25saW5lLW5hdmlnYXRpb24nPiRpbmRleDwvdGQ+IgotICAgICAgICAgIC4gIlxuPC90cj48L3RhYmxlPlxuIgotICAgICAgICAgICMgdGV4dHVhbCBuYXZpZ2F0aW9uCi0gICAgICAgICAgLiAiPGRpdiBjbGFzcz0nb25saW5lLW5hdmlnYXRpb24nPlxuIgotICAgICAgICAgIC4gbWFrZV9uYXZfc2VjdHJlZigiUHJldmlvdXMiLCAicHJldiIsICRQUkVWSU9VU19USVRMRSkKLSAgICAgICAgICAuIG1ha2VfbmF2X3NlY3RyZWYoIlVwIiwgInBhcmVudCIsICRVUF9USVRMRSkKLSAgICAgICAgICAuIG1ha2VfbmF2X3NlY3RyZWYoIk5leHQiLCAibmV4dCIsICRORVhUX1RJVExFKQotICAgICAgICAgIC4gIjwvZGl2PlxuIgotICAgICAgICAgICk7Ci0gICAgIyByZW1vdmUgdGhlc2U7IHRoZXkgYXJlIHVubmVjZXNzYXJ5IGFuZCBjYXVzZSBlcnJvcnMgZnJvbSB2YWxpZGF0aW9uCi0gICAgJHMgPX4gcy8gTkFNRT0idGV4Mmh0bWxcZCsiXG4gKi8gL2c7Ci0gICAgcmV0dXJuICRzOwotfQotCi1zdWIgYWRkX2NoaWxkX2xpbmtzIHsKLSAgICBteSAkdG9jID0gYWRkX3JlYWxfY2hpbGRfbGlua3MoQF8pOwotICAgICR0b2MgPX4gc3xccyo8L1thQV0+fDwvYT58ZzsKLSAgICAkdG9jID1+IHMvIE5BTUU9XCJ0ZXgyaHRtbFxkK1wiXHMqaHJlZj0vIGhyZWY9L2dpOwotICAgICR0b2MgPX4gc3w8L1VMPihccyo8QlIoIC8pPz4pP3w8L3VsPnxnaTsKLSAgICBpZiAoJHRvYyA9fiAvIE5BTUU9WyInXUNISUxEX0xJTktTWyInXS8pIHsKLSAgICAgICAgcmV0dXJuICI8ZGl2IGNsYXNzPSdvbmxpbmUtbmF2aWdhdGlvbic+XG4kdG9jPC9kaXY+XG4iOwotICAgIH0KLSAgICByZXR1cm4gJHRvYzsKLX0KLQotc3ViIGdldF92ZXJzaW9uX3RleHQoKSB7Ci0gICAgaWYgKCRQQUNLQUdFX1ZFUlNJT04gbmUgJycgJiYgJHRfZGF0ZSkgewotICAgICAgICByZXR1cm4gKCI8c3BhbiBjbGFzcz1cInJlbGVhc2UtaW5mb1wiPiIKLSAgICAgICAgICAgICAgICAuICJSZWxlYXNlICRQQUNLQUdFX1ZFUlNJT04kUkVMRUFTRV9JTkZPLCIKLSAgICAgICAgICAgICAgICAuICIgZG9jdW1lbnRhdGlvbiB1cGRhdGVkIG9uICR0X2RhdGUuPC9zcGFuPiIpOwotICAgIH0KLSAgICBpZiAoJFBBQ0tBR0VfVkVSU0lPTiBuZSAnJykgewotICAgICAgICByZXR1cm4gKCI8c3BhbiBjbGFzcz1cInJlbGVhc2UtaW5mb1wiPiIKLSAgICAgICAgICAgICAgICAuICJSZWxlYXNlICRQQUNLQUdFX1ZFUlNJT04kUkVMRUFTRV9JTkZPLjwvc3Bhbj4iKTsKLSAgICB9Ci0gICAgaWYgKCR0X2RhdGUpIHsKLSAgICAgICAgcmV0dXJuICgiPHNwYW4gY2xhc3M9XCJyZWxlYXNlLWluZm9cIj5Eb2N1bWVudGF0aW9uIHJlbGVhc2VkIG9uICIKLSAgICAgICAgICAgICAgICAuICIkdF9kYXRlLjwvc3Bhbj4iKTsKLSAgICB9Ci0gICAgcmV0dXJuICcnOwotfQotCi0KLXN1YiB0b3BfbmF2aWdhdGlvbl9wYW5lbCgpIHsKLSAgICByZXR1cm4gIlxuPGRpdiBpZD0ndG9wLW5hdmlnYXRpb24tcGFuZWwnIHhtbDppZD0ndG9wLW5hdmlnYXRpb24tcGFuZWwnPlxuIgotICAgICAgICAgICAuIG1ha2VfbmF2X3BhbmVsKCkKLSAgICAgICAgICAgLiAiPGhyIC8+PC9kaXY+XG4iOwotfQotCi1zdWIgYm90X25hdmlnYXRpb25fcGFuZWwoKSB7Ci0gICAgcmV0dXJuICJcbjxkaXYgY2xhc3M9J29ubGluZS1uYXZpZ2F0aW9uJz5cbiIKLSAgICAgICAgICAgLiAiPHA+PC9wPjxociAvPlxuIgotICAgICAgICAgICAuIG1ha2VfbmF2X3BhbmVsKCkKLSAgICAgICAgICAgLiAiPC9kaXY+XG4iCi0gICAgICAgICAgIC4gIjxociAvPlxuIgotICAgICAgICAgICAuIGdldF92ZXJzaW9uX3RleHQoKQotICAgICAgICAgICAuICJcbiI7Ci19Ci0KLXN1YiBhZGRfbGluayB7Ci0gICAgIyBSZXR1cm5zIGEgcGFpciAoaWNvbmljIGxpbmssIHRleHR1YWwgbGluaykKLSAgICBteSgkaWNvbiwgJGN1cnJlbnRfZmlsZSwgQGxpbmspID0gQF87Ci0gICAgbXkoJGR1bW15LCAkZmlsZSwgJHRpdGxlKSA9IHNwbGl0KCRkZWxpbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlY3Rpb25faW5mb3tqb2luKCcgJyxAbGluayl9KTsKLSAgICBpZiAoJGljb24gPX4gL1w8dGV4Mmh0bWxfKFtfYS16XSspX3Zpc2libGVfbWFya1w+LykgewotICAgICAgICBteSAkciA9IGdldF9teV9pY29uKCQxKTsKLSAgICAgICAgJGljb24gPX4gcy9cPHRleDJodG1sX1tfYS16XStfdmlzaWJsZV9tYXJrXD4vJHIvOwotICAgIH0KLSAgICBpZiAoJHRpdGxlICYmICgkZmlsZSBuZSAkY3VycmVudF9maWxlKSkgewotICAgICAgICAkdGl0bGUgPSBwdXJpZnkoJHRpdGxlKTsKLSAgICAgICAgJHRpdGxlID0gZ2V0X2ZpcnN0X3dvcmRzKCR0aXRsZSwgJFdPUkRTX0lOX05BVklHQVRJT05fUEFORUxfVElUTEVTKTsKLSAgICAgICAgcmV0dXJuIChtYWtlX2hyZWYoJGZpbGUsICRpY29uKSwgbWFrZV9ocmVmKCRmaWxlLCAiJHRpdGxlIikpCi0gICAgICAgIH0KLSAgICBlbHNpZiAoJGljb24gZXEgZ2V0X215X2ljb24oJ3VwJykgJiYgJEVYVEVSTkFMX1VQX0xJTkspIHsKLSAgICAgICAgcmV0dXJuIChtYWtlX2hyZWYoJEVYVEVSTkFMX1VQX0xJTkssICRpY29uKSwKLSAgICAgICAgICAgICAgICBtYWtlX2hyZWYoJEVYVEVSTkFMX1VQX0xJTkssICIkRVhURVJOQUxfVVBfVElUTEUiKSkKLSAgICAgICAgfQotICAgIGVsc2lmICgkaWNvbiBlcSBnZXRfbXlfaWNvbigncHJldmlvdXMnKQotICAgICAgICAgICAmJiAkRVhURVJOQUxfUFJFVl9MSU5LICYmICRFWFRFUk5BTF9QUkVWX1RJVExFKSB7Ci0gICAgICAgIHJldHVybiAobWFrZV9ocmVmKCRFWFRFUk5BTF9QUkVWX0xJTkssICRpY29uKSwKLSAgICAgICAgICAgICAgICBtYWtlX2hyZWYoJEVYVEVSTkFMX1BSRVZfTElOSywgIiRFWFRFUk5BTF9QUkVWX1RJVExFIikpCi0gICAgICAgIH0KLSAgICBlbHNpZiAoJGljb24gZXEgZ2V0X215X2ljb24oJ25leHQnKQotICAgICAgICAgICAmJiAkRVhURVJOQUxfRE9XTl9MSU5LICYmICRFWFRFUk5BTF9ET1dOX1RJVExFKSB7Ci0gICAgICAgIHJldHVybiAobWFrZV9ocmVmKCRFWFRFUk5BTF9ET1dOX0xJTkssICRpY29uKSwKLSAgICAgICAgICAgICAgICBtYWtlX2hyZWYoJEVYVEVSTkFMX0RPV05fTElOSywgIiRFWFRFUk5BTF9ET1dOX1RJVExFIikpCi0gICAgICAgIH0KLSAgICByZXR1cm4gKCZpbmFjdGl2ZV9pbWcoJGljb24pLCAiIik7Ci19Ci0KLXN1YiBhZGRfc3BlY2lhbF9saW5rKCQkJCkgewotICAgIG15KCRpY29uLCAkZmlsZSwgJGN1cnJlbnRfZmlsZSkgPSBAXzsKLSAgICBpZiAoJGljb24gPX4gL1w8dGV4Mmh0bWxfKFtfYS16XSspX3Zpc2libGVfbWFya1w+LykgewotICAgICAgICBteSAkciA9IGdldF9teV9pY29uKCQxKTsKLSAgICAgICAgJGljb24gPX4gcy9cPHRleDJodG1sX1tfYS16XStfdmlzaWJsZV9tYXJrXD4vJHIvOwotICAgIH0KLSAgICByZXR1cm4gKCgkZmlsZSAmJiAoJGZpbGUgbmUgJGN1cnJlbnRfZmlsZSkpCi0gICAgICAgICAgICA/IG1ha2VfaHJlZigkZmlsZSwgJGljb24pCi0gICAgICAgICAgICA6IHVuZGVmKQotfQotCi0jIFRoZSBpbWdfdGFnKCkgZnVuY3Rpb24gc2VlbXMgb25seSB0byBiZSBjYWxsZWQgd2l0aCB0aGUgcGFyYW1ldGVyCi0jICdhbmNob3JfaW52aXNpYmxlX21hcmsnLCB3aGljaCB3ZSB3YW50IHRvIHR1cm4gaW50byAnJy4gIFNpbmNlCi0jIHJlcGxhY2VfaWNvbl9tYXJrcygpIGlzIHRoZSBvbmx5IGludGVyZXN0aW5nIGNhbGxlciwgYW5kIGFsbCBpdCByZWFsbHkKLSMgZG9lcyBpcyBjYWxsIGltZ190YWcoKSwgd2UgY2FuIGp1c3QgZGVmaW5lIHRoZSBob29rIGFsdGVybmF0aXZlIHRvIGJlCi0jIGEgbm8tb3AgaW5zdGVhZC4KLSMKLXN1YiByZXBsYWNlX2ljb25zX2hvb2sge30KLQotc3ViIGRvX2NtZF9hcmFiaWMgewotICAgICMgZ2V0IHJpZCBvZiB0aGF0IG5hc3R5IDxTUEFOIENMQVNTPSJhcmFiaWMiPi4uLjwvU1BBTj4KLSAgICBteSgkY3RyLCAkdmFsLCAkaWQsICR0ZXh0KSA9ICZyZWFkX2NvdW50ZXJfdmFsdWUoJF9bMF0pOwotICAgIHJldHVybiAoJHZhbCA/IGZhcmFiaWMoJHZhbCkgOiAiMCIpIC4gJHRleHQ7Ci19Ci0KLQotc3ViIGdlbl9pbmRleF9pZCgkJCkgewotICAgICMgdGhpcyBpcyB1c2VkIHRvIGVuc3VyZSBjb21tb24gaW5kZXgga2V5IGdlbmVyYXRpb24gYW5kIGEgc3RhYmxlIHNvcnQKLSAgICBteSgkc3RyLCAkZXh0cmEpID0gQF87Ci0gICAgc3ByaW50ZignJXMjIyMlcyUwMTBkJywgJHN0ciwgJGV4dHJhLCArKyRnbG9iYWx7J21heF9pZCd9KTsKLX0KLQotc3ViIGluc2VydF9pbmRleCgkJCQkJCkgewotICAgIG15KCRtYXJrLCAkZGF0YWZpbGUsICRjb2x1bW5zLCAkbGV0dGVycywgJHByZWZpeCkgPSBAXzsKLSAgICBteSAkcHJvZyA9ICIkbXlyb290ZGlyL3Rvb2xzL2J1aWxkaW5kZXgucHkiOwotICAgIG15ICRpbmRleDsKLSAgICBpZiAoJGxldHRlcnMpIHsKLSAgICAgICAgJGluZGV4ID0gYCRwcm9nIC0tY29sdW1ucyAkY29sdW1ucyAtLWxldHRlcnMgJGRhdGFmaWxlYDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgICRpbmRleCA9IGAkcHJvZyAtLWNvbHVtbnMgJGNvbHVtbnMgJGRhdGFmaWxlYDsKLSAgICB9Ci0gICAgaWYgKCFzLyRtYXJrLyRwcmVmaXgkaW5kZXgvKSB7Ci0gICAgICAgIHByaW50ICJcbkNvdWxkIG5vdCBsb2NhdGUgaW5kZXggbWFyazogJG1hcmsiOwotICAgIH0KLX0KLQotc3ViIGFkZF9pZHgoKSB7Ci0gICAgcHJpbnQgIlxuQnVpbGRpbmcgSFRNTCBmb3IgdGhlIGluZGV4IC4uLiI7Ci0gICAgY2xvc2UoSURYRklMRSk7Ci0gICAgaW5zZXJ0X2luZGV4KCRpZHhfbWFyaywgJ2luZGV4LmRhdCcsICRJTkRFWF9DT0xVTU5TLCAxLCAnJyk7Ci19Ci0KLQotJGlkeF9tb2R1bGVfbWFyayA9ICc8dGV4Mmh0bWxfaWR4X21vZHVsZV9tYXJrPic7Ci0kaWR4X21vZHVsZV90aXRsZSA9ICdNb2R1bGUgSW5kZXgnOwotCi1zdWIgYWRkX21vZHVsZV9pZHgoKSB7Ci0gICAgcHJpbnQgIlxuQnVpbGRpbmcgSFRNTCBmb3IgdGhlIG1vZHVsZSBpbmRleCAuLi4iOwotICAgIG15ICRrZXk7Ci0gICAgbXkgJGZpcnN0ID0gMTsKLSAgICBteSAkcHJldnBsYXQgPSAnJzsKLSAgICBteSAkYWxsdGhlc2FtZSA9IDE7Ci0gICAgbXkgJHByZWZpeCA9ICcnOwotICAgIGZvcmVhY2ggJGtleSAoa2V5cyAlTW9kdWxlcykgewotICAgICAgICAka2V5ID1+IHMvPHR0PihbYS16QS1aMC05Ll9dKik8XC90dD4vJDEvOwotICAgICAgICBteSAkcGxhdCA9ICIkTW9kdWxlUGxhdGZvcm1zeyRrZXl9IjsKLSAgICAgICAgJHBsYXQgPSAnJwotICAgICAgICAgIGlmICgkcGxhdCBlcSAkSUdOT1JFX1BMQVRGT1JNX0FOTk9UQVRJT04pOwotICAgICAgICBpZiAoISRmaXJzdCkgewotICAgICAgICAgICAgJGFsbHRoZXNhbWUgPSAwCi0gICAgICAgICAgICAgIGlmICgkcHJldnBsYXQgbmUgJHBsYXQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgeyAkZmlyc3QgPSAwOyB9Ci0gICAgICAgICRwcmV2cGxhdCA9ICRwbGF0OwotICAgIH0KLSAgICBvcGVuKE1PRElEWEZJTEUsICc+bW9kaW5kZXguZGF0JykgfHwgZGllICJcbiQhXG4iOwotICAgIGZvcmVhY2ggJGtleSAoa2V5cyAlTW9kdWxlcykgewotICAgICAgICAjIGR1bXAgdGhlIGxpbmUgaW4gdGhlIGRhdGEgZmlsZTsganVzdCB1c2UgYSBkdW1teSBzZXFubyBmaWVsZAotICAgICAgICBteSAkbmtleSA9ICQxOwotICAgICAgICBteSAkbW9kaXRlbSA9ICIkTW9kdWxlc3ska2V5fSI7Ci0gICAgICAgIG15ICRwbGF0ID0gJyc7Ci0gICAgICAgICRrZXkgPX4gcy88dHQ+KFthLXpBLVowLTkuX10qKTxcL3R0Pi8kMS87Ci0gICAgICAgIGlmICgkTW9kdWxlUGxhdGZvcm1zeyRrZXl9ICYmICEkYWxsdGhlc2FtZSkgewotICAgICAgICAgICAgJHBsYXQgPSAoIiA8ZW0+KDxzcGFuIGNsYXNzPVwicGxhdGZvcm1cIj4kTW9kdWxlUGxhdGZvcm1zeyRrZXl9IgotICAgICAgICAgICAgICAgICAgICAgLiAnPC9zcGFuPik8L2VtPicpOwotICAgICAgICB9Ci0gICAgICAgIHByaW50IE1PRElEWEZJTEUgJG1vZGl0ZW0gLiAkSURYRklMRV9GSUVMRF9TRVAKLSAgICAgICAgICAgICAgLiAiPHR0IGNsYXNzPVwibW9kdWxlXCI+JGtleTwvdHQ+JHBsYXQjIyNcbiI7Ci0gICAgfQotICAgIGNsb3NlKE1PRElEWEZJTEUpOwotCi0gICAgaWYgKCRHTE9CQUxfTU9EVUxFX0lOREVYKSB7Ci0gICAgICAgICRwcmVmaXggPSA8PE1PRFVMRV9JTkRFWF9QUkVGSVg7Ci0KLTxwPiBUaGlzIGluZGV4IG9ubHkgbGlzdHMgbW9kdWxlcyBkb2N1bWVudGVkIGluIHRoaXMgbWFudWFsLgotICBUaGUgPGVtIGNsYXNzPSJjaXRldGl0bGUiPjxhIGhyZWY9IiRHTE9CQUxfTU9EVUxFX0lOREVYIj5HbG9iYWwgTW9kdWxlCi0gICAgIEluZGV4PC9hPjwvZW0+IGxpc3RzIGFsbCBtb2R1bGVzIHRoYXQgYXJlIGRvY3VtZW50ZWQgaW4gdGhpcyBzZXQKLSAgb2YgbWFudWFscy48L3A+Ci1NT0RVTEVfSU5ERVhfUFJFRklYCi0gICAgfQotICAgIGlmICghJGFsbHRoZXNhbWUpIHsKLSAgICAgICAgJHByZWZpeCAuPSA8PFBMQVRfRElTQ1VTUzsKLQotPHA+IFNvbWUgbW9kdWxlIG5hbWVzIGFyZSBmb2xsb3dlZCBieSBhbiBhbm5vdGF0aW9uIGluZGljYXRpbmcgd2hhdAotcGxhdGZvcm0gdGhleSBhcmUgYXZhaWxhYmxlIG9uLjwvcD4KLQotUExBVF9ESVNDVVNTCi0gICAgfQotICAgIGluc2VydF9pbmRleCgkaWR4X21vZHVsZV9tYXJrLCAnbW9kaW5kZXguZGF0JywgJE1PRFVMRV9JTkRFWF9DT0xVTU5TLCAwLAotICAgICAgICAgICAgICAgICAkcHJlZml4KTsKLX0KLQotIyByZXBsYWNlIGJvdGggaW5kZXhlcyBhcyBuZWVkZWQ6Ci1zdWIgYWRkX2lkeF9ob29rIHsKLSAgICBhZGRfaWR4KCkgaWYgKC8kaWR4X21hcmsvKTsKLSAgICBwcm9jZXNzX3B5dGhvbl9zdGF0ZSgpOwotICAgIGlmICgkTU9EVUxFX0lOREVYX0ZJTEUpIHsKLSAgICAgICAgbG9jYWwgKCRfKTsKLSAgICAgICAgb3BlbihNWUZJTEUsICI8JE1PRFVMRV9JTkRFWF9GSUxFIik7Ci0gICAgICAgIHN5c3JlYWQoTVlGSUxFLCAkXywgMTAyNCoxMDI0KTsKLSAgICAgICAgY2xvc2UoTVlGSUxFKTsKLSAgICAgICAgYWRkX21vZHVsZV9pZHgoKTsKLSAgICAgICAgb3BlbihNWUZJTEUsIj4kTU9EVUxFX0lOREVYX0ZJTEUiKTsKLSAgICAgICAgcHJpbnQgTVlGSUxFICRfOwotICAgICAgICBjbG9zZShNWUZJTEUpOwotICAgIH0KLX0KLQotCi0jIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBzdHVmZiwgYWRkIGxhYmVsIHRvIGFsbG93IG5hbWVkIG5vZGUgZmlsZXMgYW5kCi0jIHN1cHBvcnQgc3VwcHJlc3Npb24gb2YgdGhlIHBhZ2UgY29tcGxldGUgKGZvciBIVE1MIEhlbHAgdXNlKS4KLSRNWV9DT05URU5UU19QQUdFID0gJyc7Ci1zdWIgZG9fY21kX3RhYmxlb2Zjb250ZW50cyB7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgJFRJVExFID0gJHRvY190aXRsZTsKLSAgICAkdG9jZmlsZSA9ICRDVVJSRU5UX0ZJTEU7Ci0gICAgbXkoJGNsb3N1cmVzLCAkcmVvcGVucykgPSBwcmVzZXJ2ZV9vcGVuX3RhZ3MoKTsKLSAgICBhbmNob3JfbGFiZWwoJ2NvbnRlbnRzJywgJENVUlJFTlRfRklMRSwgJF8pOyAgICAgICAgIyB0aGlzIGlzIGFkZGVkCi0gICAgJE1ZX0NPTlRFTlRTX1BBR0UgPSAiJENVUlJFTlRfRklMRSI7Ci0gICAgam9pbignJywgIlxcdGFibGVvZmNoaWxkbGlua3Nbb2ZmXSIsICRjbG9zdXJlcwotICAgICAgICAgLCBtYWtlX3NlY3Rpb25faGVhZGluZygkdG9jX3RpdGxlLCAnaDInKSwgJHRvY19tYXJrCi0gICAgICAgICAsICRyZW9wZW5zLCAkXyk7Ci19Ci0jIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBzdHVmZiwgYWRkIGxhYmVsIHRvIGFsbG93IG5hbWVkIG5vZGUgZmlsZXMuCi1zdWIgZG9fY21kX2xpc3RvZmZpZ3VyZXMgewotICAgIGxvY2FsKCRfKSA9IEBfOwotICAgICRUSVRMRSA9ICRsb2ZfdGl0bGU7Ci0gICAgJGxvZmZpbGUgPSAkQ1VSUkVOVF9GSUxFOwotICAgIG15KCRjbG9zdXJlcywgJHJlb3BlbnMpID0gcHJlc2VydmVfb3Blbl90YWdzKCk7Ci0gICAgYW5jaG9yX2xhYmVsKCdsb2YnLCAkQ1VSUkVOVF9GSUxFLCAkXyk7ICAgICAgICAgICAgICMgdGhpcyBpcyBhZGRlZAotICAgIGpvaW4oJycsICI8YnIgLz5cbiIsICRjbG9zdXJlcwotICAgICAgICAgLCBtYWtlX3NlY3Rpb25faGVhZGluZygkbG9mX3RpdGxlLCAnaDInKSwgJGxvZl9tYXJrCi0gICAgICAgICAsICRyZW9wZW5zLCAkXyk7Ci19Ci0jIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBzdHVmZiwgYWRkIGxhYmVsIHRvIGFsbG93IG5hbWVkIG5vZGUgZmlsZXMuCi1zdWIgZG9fY21kX2xpc3RvZnRhYmxlcyB7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgJFRJVExFID0gJGxvdF90aXRsZTsKLSAgICAkbG90ZmlsZSA9ICRDVVJSRU5UX0ZJTEU7Ci0gICAgbXkoJGNsb3N1cmVzLCAkcmVvcGVucykgPSBwcmVzZXJ2ZV9vcGVuX3RhZ3MoKTsKLSAgICBhbmNob3JfbGFiZWwoJ2xvdCcsICRDVVJSRU5UX0ZJTEUsICRfKTsgICAgICAgICAgICAgIyB0aGlzIGlzIGFkZGVkCi0gICAgam9pbignJywgIjxiciAvPlxuIiwgJGNsb3N1cmVzCi0gICAgICAgICAsIG1ha2Vfc2VjdGlvbl9oZWFkaW5nKCRsb3RfdGl0bGUsICdoMicpLCAkbG90X21hcmsKLSAgICAgICAgICwgJHJlb3BlbnMsICRfKTsKLX0KLSMgSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIHN0dWZmLCBhZGQgbGFiZWwgdG8gYWxsb3cgbmFtZWQgbm9kZSBmaWxlcy4KLXN1YiBkb19jbWRfdGV4dG9odG1saW5mb3BhZ2UgewotICAgIGxvY2FsKCRfKSA9IEBfOwotICAgIGlmICgkSU5GTykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCi0gICAgICAgIGFuY2hvcl9sYWJlbCgiYWJvdXQiLCRDVVJSRU5UX0ZJTEUsJF8pOyAgICAgICAgICMgdGhpcyBpcyBhZGRlZAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCi0gICAgbXkgJHRoZV92ZXJzaW9uID0gJyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYW5kIHRoZSByZXN0IGlzCi0gICAgaWYgKCR0X2RhdGUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbW9zdGx5IG91cnMKLSAgICAgICAgJHRoZV92ZXJzaW9uID0gIixcbiR0X2RhdGUiOwotICAgICAgICBpZiAoJFBBQ0tBR0VfVkVSU0lPTikgewotICAgICAgICAgICAgJHRoZV92ZXJzaW9uIC49ICIsIFJlbGVhc2UgJFBBQ0tBR0VfVkVSU0lPTiRSRUxFQVNFX0lORk8iOwotICAgICAgICB9Ci0gICAgfQotICAgIG15ICRhYm91dDsKLSAgICBvcGVuKEFCT1VULCAiPCRBQk9VVF9GSUxFIikgfHwgZGllICJcbiQhXG4iOwotICAgIHN5c3JlYWQoQUJPVVQsICRhYm91dCwgMTAyNCoxMDI0KTsKLSAgICBjbG9zZShBQk9VVCk7Ci0gICAgJF8gPSAoKCRJTkZPID09IDEpCi0gICAgICAgICAgPyBqb2luKCcnLAotICAgICAgICAgICAgICAgICAkY2xvc2VfYWxsLAotICAgICAgICAgICAgICAgICAiPHN0cm9uZz4kdF90aXRsZTwvc3Ryb25nPiR0aGVfdmVyc2lvblxuIiwKLSAgICAgICAgICAgICAgICAgJGFib3V0LAotICAgICAgICAgICAgICAgICAkb3Blbl9hbGwsICRfKQotICAgICAgICAgIDogam9pbignJywgJGNsb3NlX2FsbCwgJElORk8sIlxuIiwgJG9wZW5fYWxsLCAkXykpOwotICAgICRfOwotfQotCi0kR0VORVJBTF9JTkRFWF9GSUxFID0gJyc7Ci0kTU9EVUxFX0lOREVYX0ZJTEUgPSAnJzsKLQotIyAkaWR4X21hcmsgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSByZWFsIGluZGV4IGF0IHRoZSBlbmQKLXN1YiBkb19jbWRfdGV4dG9odG1saW5kZXggewotICAgIGxvY2FsKCRfKSA9IEBfOwotICAgICRUSVRMRSA9ICRpZHhfdGl0bGU7Ci0gICAgJGlkeGZpbGUgPSAkQ1VSUkVOVF9GSUxFOwotICAgICRHRU5FUkFMX0lOREVYX0ZJTEUgPSAiJENVUlJFTlRfRklMRSI7Ci0gICAgaWYgKCVpbmRleF9sYWJlbHMpIHsgbWFrZV9pbmRleF9sYWJlbHMoKTsgfQotICAgIGlmICgoJFNIT1JUX0lOREVYKSAmJiAoJWluZGV4X3NlZ21lbnQpKSB7IG1ha2VfcHJlaW5kZXgoKTsgfQotICAgIGVsc2UgeyAkcHJlaW5kZXggPSAnJzsgfQotICAgIG15ICRoZWFkaW5nID0gbWFrZV9zZWN0aW9uX2hlYWRpbmcoJGlkeF90aXRsZSwgJ2gyJykgLiAkaWR4X21hcms7Ci0gICAgbXkoJHByZSwgJHBvc3QpID0gbWluaW1pemVfb3Blbl90YWdzKCRoZWFkaW5nKTsKLSAgICBhbmNob3JfbGFiZWwoJ2dlbmluZGV4JywkQ1VSUkVOVF9GSUxFLCRfKTsgICAgICAgICAgIyB0aGlzIGlzIGFkZGVkCi0gICAgcmV0dXJuICI8YnIgLz5cbiIgLiAkcHJlIC4gJF87Ci19Ci0KLSMgJGlkeF9tb2R1bGVfbWFyayB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIHJlYWwgaW5kZXggYXQgdGhlIGVuZAotc3ViIGRvX2NtZF90ZXh0b2h0bWxtb2R1bGVpbmRleCB7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgJFRJVExFID0gJGlkeF9tb2R1bGVfdGl0bGU7Ci0gICAgYW5jaG9yX2xhYmVsKCdtb2RpbmRleCcsICRDVVJSRU5UX0ZJTEUsICRfKTsKLSAgICAkTU9EVUxFX0lOREVYX0ZJTEUgPSAiJENVUlJFTlRfRklMRSI7Ci0gICAgJF8gPSAoJzxwPjwvcD4nIC4gbWFrZV9zZWN0aW9uX2hlYWRpbmcoJGlkeF9tb2R1bGVfdGl0bGUsICdoMicpCi0gICAgICAgICAgLiAkaWR4X21vZHVsZV9tYXJrIC4gJF8pOwotICAgIHJldHVybiAkXzsKLX0KLQotIyBUaGUgYmlibGlvZ3JhcGh5IGFuZCB0aGUgaW5kZXggc2hvdWxkIGJlIHRyZWF0ZWQgYXMgc2VwYXJhdGUKLSMgc2VjdGlvbnMgaW4gdGhlaXIgb3duIEhUTUwgZmlsZXMuIFRoZSBcYmlibGlvZ3JhcGh5e30gY29tbWFuZCBhY3RzCi0jIGFzIGEgc2VjdGlvbmluZyBjb21tYW5kIHRoYXQgaGFzIHRoZSBkZXNpcmVkIGVmZmVjdC4gQnV0IHdoZW4gdGhlCi0jIGJpYmxpb2dyYXBoeSBpcyBjb25zdHJ1Y3RlZCBtYW51YWxseSB1c2luZyB0aGUgdGhlYmlibGlvZ3JhcGh5Ci0jIGVudmlyb25tZW50LCBvciB3aGVuIHVzaW5nIHRoZSB0aGVpbmRleCBlbnZpcm9ubWVudCBpdCBpcyBub3QKLSMgcG9zc2libGUgdG8gdXNlIHRoZSBub3JtYWwgc2VjdGlvbmluZyBtZWNoYW5pc20uIFRoaXMgc3Vicm91dGluZQotIyBpbnNlcnRzIGEgXGJpYmxpb2dyYXBoeXt9IG9yIGEgZHVtbXkgXHRleHRvaHRtbGluZGV4IGNvbW1hbmQganVzdAotIyBiZWZvcmUgdGhlIGFwcHJvcHJpYXRlIGVudmlyb25tZW50cyB0byBmb3JjZSBzZWN0aW9uaW5nLgotCi0jIFhYWCAgIFRoaXMgKmFzc3VtZXMqIHRoYXQgaWYgdGhlcmUgYXJlIHR3byB7dGhlaW5kZXh9IGVudmlyb25tZW50cywKLSMgICAgICAgdGhlIGZpcnN0IGlzIHRoZSBtb2R1bGUgaW5kZXggYW5kIHRoZSBzZWNvbmQgaXMgdGhlIHN0YW5kYXJkCi0jICAgICAgIGluZGV4LiAgVGhpcyBpcyBzdWZmaWNpZW50IGZvciB0aGUgY3VycmVudCBQeXRob24gZG9jdW1lbnRhdGlvbiwKLSMgICAgICAgYnV0IHRoYXQncyBhYm91dCBpdC4KLQotc3ViIGFkZF9iYmxfYW5kX2lkeF9kdW1teV9jb21tYW5kcyB7Ci0gICAgbXkgJGlkID0gJGdsb2JhbHsnbWF4X2lkJ307Ci0KLSAgICBpZiAoL1tcXF10YWJsZW9mY29udGVudHMvKSB7Ci0gICAgICAgICRIQVZFX1RBQkxFX09GX0NPTlRFTlRTID0gMTsKLSAgICB9Ci0gICAgcy8oW1xcXWJlZ2luXHMqJE9cZCskQ1xzKnRoZWJpYmxpb2dyYXBoeSkvJGJibF9jbnQrKzsgJDEvZWc7Ci0gICAgcy8oW1xcXWJlZ2luXHMqJE9cZCskQ1xzKnRoZWJpYmxpb2dyYXBoeSkvJGlkKys7ICJcXGJpYmxpb2dyYXBoeSRPJGlkJEMkTyRpZCRDICQxIi9nZW87Ci0gICAgbXkoQHBhcnRzKSA9IHNwbGl0KC9cXGJlZ2luXHMqJE9cZCskQ1xzKnRoZWluZGV4Lyk7Ci0gICAgaWYgKHNjYWxhcihAcGFydHMpID09IDMpIHsKLSAgICAgICAgIyBCZSBjYXJlZnVsIHRvIHJlLXdyaXRlIHRoZSBzdHJpbmcgaW4gcGxhY2UsIHNpbmNlICRfIGlzICpub3QqCi0gICAgICAgICMgcmV0dXJuZWQgZXhwbGljaXR5OyAgKioqIG5hc3R5IHNpZGUtZWZmZWN0IGRlcGVuZGVuY3khICoqKgotICAgICAgICBwcmludCAiXG5hZGRfYmJsX2FuZF9pZHhfZHVtbXlfY29tbWFuZHMgPT0+IGFkZGluZyBnZW5lcmFsIGluZGV4IjsKLSAgICAgICAgcHJpbnQgIlxuYWRkX2JibF9hbmRfaWR4X2R1bW15X2NvbW1hbmRzID09PiBhZGRpbmcgbW9kdWxlIGluZGV4IjsKLSAgICAgICAgbXkgJHJ4ID0gIihbXFxcXF1iZWdpblxccyokT1xcZCskQ1xccyp0aGVpbmRleFtcXHNcXFNdKikiCi0gICAgICAgICAgLiAiKFtcXFxcXWJlZ2luXFxzKiRPXFxkKyRDXFxzKnRoZWluZGV4KSI7Ci0gICAgICAgIHMvJHJ4L1xcdGV4dG9odG1sbW9kdWxlaW5kZXggJDEgXFx0ZXh0b2h0bWxpbmRleCAkMi9vOwotICAgICAgICAjIEFkZCBhIGJ1dHRvbiB0byB0aGUgbmF2aWdhdGlvbiBhcmVhczoKLSAgICAgICAgJENVU1RPTV9CVVRUT05TIC49ICgnPGEgaHJlZj0ibW9kaW5kZXguaHRtbCIgdGl0bGU9Ik1vZHVsZSBJbmRleCI+JwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gZ2V0X215X2ljb24oJ21vZHVsZXMnKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJzwvYT4nKTsKLSAgICAgICAgJEhBVkVfTU9EVUxFX0lOREVYID0gMTsKLSAgICAgICAgJEhBVkVfR0VORVJBTF9JTkRFWCA9IDE7Ci0gICAgfQotICAgIGVsc2lmIChzY2FsYXIoQHBhcnRzKSA9PSAyKSB7Ci0gICAgICAgIHByaW50ICJcbmFkZF9iYmxfYW5kX2lkeF9kdW1teV9jb21tYW5kcyA9PT4gYWRkaW5nIGdlbmVyYWwgaW5kZXgiOwotICAgICAgICBteSAkcnggPSAiKFtcXFxcXWJlZ2luXFxzKiRPXFxkKyRDXFxzKnRoZWluZGV4KSI7Ci0gICAgICAgIHMvJHJ4L1xcdGV4dG9odG1saW5kZXggJDEvbzsKLSAgICAgICAgJEhBVkVfR0VORVJBTF9JTkRFWCA9IDE7Ci0gICAgfQotICAgIGVsc2lmIChzY2FsYXIoQHBhcnRzKSA9PSAxKSB7Ci0gICAgICAgIHByaW50ICJcbmFkZF9iYmxfYW5kX2lkeF9kdW1teV9jb21tYW5kcyA9PT4gbm8gaW5kZXggZm91bmQiOwotICAgICAgICAkQ1VTVE9NX0JVVFRPTlMgLj0gZ2V0X215X2ljb24oJ2JsYW5rJyk7Ci0gICAgICAgICRnbG9iYWx7J21heF9pZCd9ID0gJGlkOyAjIG5vdCBzdXJlIHdoeS4uLi4KLSAgICAgICAgcy8oW1xcXWJlZ2luXHMqJE9cZCskQ1xzKnRoZWluZGV4KS9cXHRleHRvaHRtbGluZGV4ICQxL287Ci0gICAgICAgICAgICBzL1tcXF1wcmludGluZGV4L1xcdGV4dG9odG1saW5kZXggL287Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBkaWUgIlxuXG5CYWQgbnVtYmVyIG9mIGluZGV4IGVudmlyb25tZW50cyFcblxuIjsKLSAgICB9Ci0gICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBsaWJfYWRkX2JibF9hbmRfaWR4X2R1bW15X2NvbW1hbmRzKCkKLSAgICAgICAgaWYgZGVmaW5lZCgmbGliX2FkZF9iYmxfYW5kX2lkeF9kdW1teV9jb21tYW5kcyk7Ci19Ci0KLSMgVGhlIGJpYmxpb2dyYXBoaWMgcmVmZXJlbmNlcywgdGhlIGFwcGVuZGljZXMsIHRoZSBsaXN0cyBvZiBmaWd1cmVzCi0jIGFuZCB0YWJsZXMgZXRjLiBtdXN0IGFwcGVhciBpbiB0aGUgY29udGVudHMgdGFibGUgYXQgdGhlIHNhbWUgbGV2ZWwKLSMgYXMgdGhlIG91dGVybW9zdCBzZWN0aW9uaW5nIGNvbW1hbmQuIFRoaXMgc3Vicm91dGluZSBmaW5kcyB3aGF0IGlzCi0jIHRoZSBvdXRlcm1vc3QgbGV2ZWwgYW5kIHNldHMgdGhlIGFib3ZlIHRvIHRoZSBzYW1lIGxldmVsOwotCi1zdWIgc2V0X2RlcHRoX2xldmVscyB7Ci0gICAgIyBTZXRzICRvdXRlcm1vc3RfbGV2ZWwKLSAgICBteSAkbGV2ZWw7Ci0gICAgI1JSTTogIGRvIG5vdCBhbHRlciB1c2VyLXNldCB2YWx1ZSBmb3IgICRNQVhfU1BMSVRfREVQVEgKLSAgICBmb3JlYWNoICRsZXZlbCAoInBhcnQiLCAiY2hhcHRlciIsICJzZWN0aW9uIiwgInN1YnNlY3Rpb24iLAotICAgICAgICAgICAgICAgICAgICAic3Vic3Vic2VjdGlvbiIsICJwYXJhZ3JhcGgiKSB7Ci0gICAgICAgIGxhc3QgaWYgKCgkb3V0ZXJtb3N0X2xldmVsKSA9IC9cXCgkbGV2ZWwpJGRlbGltaXRlcl9yeC8pOwotICAgIH0KLSAgICAkbGV2ZWwgPSAoJG91dGVybW9zdF9sZXZlbCA/ICRzZWN0aW9uX2NvbW1hbmRzeyRvdXRlcm1vc3RfbGV2ZWx9IDoKLSAgICAgICAgICAgICAgZG8geyRvdXRlcm1vc3RfbGV2ZWwgPSAnc2VjdGlvbic7IDM7fSk7Ci0KLSAgICAjUlJNOiAgYnV0IGNhbGN1bGF0ZSB2YWx1ZSBmb3IgJE1BWF9TUExJVF9ERVBUSCB3aGVuIGEgJFJFTF9ERVBUSCB3YXMgZ2l2ZW4KLSAgICBpZiAoJFJFTF9ERVBUSCAmJiAkTUFYX1NQTElUX0RFUFRIKSB7Ci0gICAgICAgICRNQVhfU1BMSVRfREVQVEggPSAkbGV2ZWwgKyAkTUFYX1NQTElUX0RFUFRIOwotICAgIH0gZWxzaWYgKCEoJE1BWF9TUExJVF9ERVBUSCkpIHsgJE1BWF9TUExJVF9ERVBUSCA9IDEgfTsKLQotICAgICV1bm51bWJlcmVkX3NlY3Rpb25fY29tbWFuZHMgPSAoJ3RhYmxlb2Zjb250ZW50cycgPT4gJGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpc3RvZmZpZ3VyZXMnID0+ICRsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaXN0b2Z0YWJsZXMnID0+ICRsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiaWJsaW9ncmFwaHknID0+ICRsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0b2h0bWxpbmRleCcgPT4gJGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHRvaHRtbG1vZHVsZWluZGV4JyA9PiAkbGV2ZWwpOwotICAgICRzZWN0aW9uX2hlYWRpbmdzeyd0ZXh0b2h0bWxtb2R1bGVpbmRleCd9ID0gJ2gxJzsKLQotICAgICVzZWN0aW9uX2NvbW1hbmRzID0gKCV1bm51bWJlcmVkX3NlY3Rpb25fY29tbWFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgJXNlY3Rpb25fY29tbWFuZHMpOwotCi0gICAgbWFrZV9zZWN0aW9uc19yeCgpOwotfQotCi0KLSMgVGhpcyBjaGFuZ2VzIHRoZSBtYXJrdXAgdXNlZCBmb3Ige3ZlcmJhdGltfSBlbnZpcm9ubWVudHMsIGFuZCBpcyB0aGUKLSMgYmVzdCB3YXkgSSd2ZSBmb3VuZCB0aGF0IGVuc3VyZXMgdGhlIDxkbD4gZ29lcyBvbiB0aGUgb3V0c2lkZSBvZiB0aGUKLSMgPHByZT4uLi48L3ByZT4uCi0jCi0jIE5vdGUgdGhhdCB0aGlzICptdXN0KiBiZSBkb25lIGluIHRoZSBpbml0IGZpbGUsIG5vdCB0aGUgcHl0aG9uLnBlcmwKLSMgc3R5bGUgc3VwcG9ydCBmaWxlLiAgVGhlICVkZWNsYXJhdGlvbnMgbXVzdCBiZSBzZXQgYmVmb3JlCi0jIGluaXRpYWxpemUoKSBpcyBjYWxsZWQgaW4gdGhlIG1haW4gTGFUZVgySFRNTCBzY3JpcHQgKHdoaWNoIGhhcHBlbnMKLSMgYmVmb3JlIHN0eWxlIGZpbGVzIGFyZSBsb2FkZWQpLgotIwotJWRlY2xhcmF0aW9ucyA9ICgncHJlZm9ybScgPT4gJzxkaXYgY2xhc3M9InZlcmJhdGltIj48cHJlPjwvcHJlPjwvZGl2PicsCi0gICAgICAgICAgICAgICAgICVkZWNsYXJhdGlvbnMpOwotCi0KLSMgVGhpcyBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2Ygd2hhdCdzIHByb3ZpZGVkIGJ5IExhVGVYMkhUTUw7IHNlZSB0aGUKLSMgY29tbWVudCBvbiB0aGUgbWlkZGxlIHN0YW56YSBmb3IgYW4gZXhwbGFuYXRpb24gb2Ygd2h5IHdlIGtlZXAgb3VyCi0jIG93biB2ZXJzaW9uLgotIwotIyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25jZSBvbiB0aGUgdGV4dCBvbmx5LAotIyBlbHNlIGl0IHdpbGwgImVhdCB1cCIgc2Vuc2l0aXZlIGNvbnN0cnVjdHMuCi1zdWIgdGV4dF9jbGVhbnVwIHsKLSAgICAjIE1STzogcmVwbGFjZWQgJCogd2l0aCAvbQotICAgIHMvKFxzKlxuKXszLH0vXG5cbi9nb207CSMgUmVwbGFjZSBjb25zZWN1dGl2ZSBibGFuayBsaW5lcyB3aXRoIG9uZQotICAgIHMvPChcLz8pUD5ccyooXHcpLzwkMVA+XG4kMi9nb207ICAgICAgIyBjbGVhbiB1cCBwYXJhZ3JhcGggc3RhcnRzIGFuZCBlbmRzCi0gICAgcy8kT1xkKyRDLy9nbzsJCSMgR2V0IHJpZCBvZiBicmFja2V0IGlkJ3MKLSAgICBzLyRPUFxkKyRDUC8vZ287CQkjIEdldCByaWQgb2YgcHJvY2Vzc2VkIGJyYWNrZXQgaWQncwotICAgIHMvKDwhKT8tLT8oPik/LyhsZW5ndGgoJDEpIHx8IGxlbmd0aCgkMikpID8gIiQxLS0kMiIgOiAiLSIvZ2U7Ci0gICAgIyBTcGFjaW5nIGNvbW1hbmRzCi0gICAgcy9cXCggfCQpLyAvZ287Ci0gICAgI0pLUjogVGhlcmUgc2hvdWxkIGJlIG5vIG1vcmUgY29tbWVudHMgaW4gdGhlIHNvdXJjZSBub3cuCi0gICAgI3MvKFteXFxdPyklLyQxL2dvOyAgICAgICAgIyBSZW1vdmUgdGhlIGNvbW1lbnQgY2hhcmFjdGVyCi0gICAgIyBDYW5ub3QgdHJlYXQgXCwgYXMgYSBjb21tYW5kIGJlY2F1c2UgLCBpcyBhIGRlbGltaXRlciAuLi4KLSAgICBzL1xcLC8gL2dvOwotICAgICMgUmVwbGFjZSB0aWxkZSdzIHdpdGggbm9uLWJyZWFraW5nIHNwYWNlcwotICAgIHMvICp+LyZuYnNwOy9nOwotCi0gICAgIyBUaGlzIGlzIHdoeSB3ZSBoYXZlIHRoaXMgY29weSBvZiB0aGlzIHJvdXRpbmU7IHRoZSBmb2xsb3dpbmcKLSAgICAjIGlzbid0IHNvIGRlc2lyYWJsZSBhcyB0aGUgYXV0aG9yL21haW50YWluZXJzIG9mIExhVGVYMkhUTUwgc2VlbQotICAgICMgdG8gdGhpbmsuICBJdCdzIG5vdCBjb21tZW50ZWQgb3V0IGluIHRoZSBtYWluIHNjcmlwdCwgc28gd2UgaGF2ZQotICAgICMgdG8gb3ZlcnJpZGUgdGhlIHdob2xlIHRoaW5nLiAgSW4gcGFydGljdWxhciwgd2UgZG9uJ3Qgd2FudCBlbXB0eQotICAgICMgdGFibGUgY2VsbHMgdG8gZGlzYXBwZWFyLgotCi0gICAgIyMjIERBTkdFUk9VUyA/PyAjIyMKLSAgICAjIHJlbW92ZSByZWR1bmRhbnQgKG5vdCA8UD48L1A+KSBlbXB0eSB0YWdzLCBpbmNsLiB3aXRoIGF0dHJpYnV0ZXMKLSAgICAjcy9cbj88KFteUEQgPl1bXj5dKik+XHMqPFwvXDE+Ly9nOwotICAgICNzL1xuPzwoW15QRCA+XVtePl0qKT5ccyo8XC9cMT4vL2c7Ci0gICAgIyByZW1vdmUgcmVkdW5kYW50IGVtcHR5IHRhZ3MgKG5vdCA8L1A+PFA+IG9yIDxURD4gb3IgPFRIPikKLSAgICAjcy88XC8oVFR8W15QVEhdW0EtWl0rKT48XDE+Ly9nOwotICAgICNzLzwoW15QRCBdKykoXHNbXj5dKik/PlxuKjxcL1wxPi8vZzsKLQotICAgICNKQ0woamNsLWhleCkKLSAgICAjIFJlcGxhY2UgXl4gc3BlY2lhbCBjaGFycyAoYWNjb3JkaW5nIHRvIHAuNDcgb2YgdGhlIFRlWCBib29rKQotICAgICMgVXNlZnVsIHdoZW4gY29taW5nIGZyb20gdGhlIC5hdXggZmlsZSAoZ2VybWFuIHVtbGF1dHMsIGV0Yy4pCi0gICAgcy9cXlxeKFteMC05YS1mXSkvY2hyKCg2NCtvcmQoJDEpKSYxMjcpL2dlOwotICAgIHMvXF5cXihbMC05YS1mXVswLTlhLWZdKS9jaHIoaGV4KCQxKSkvZ2U7Ci19Ci0KLSMgVGhpcyBpcyB1c2VkIHRvIG1hcCB0aGUgbGluayByZWwgYXR0cmlidXRlcyBMYVRlWDJIVE1MIHVzZXMgdG8gdGhvc2UKLSMgY3VycmVudGx5IHJlY29tbWVuZGVkIGJ5IHRoZSBXM0MuCi1zdWIgY3VzdG9tX1JFTF9ob29rIHsKLSAgICBteSgkcmVsLCRqdW5rKSA9IEBfOwotICAgIHJldHVybiAncGFyZW50JyBpZiAkcmVsIGVxICd1cCc7Ci0gICAgcmV0dXJuICdwcmV2JyBpZiAkcmVsIGVxICdwcmV2aW91cyc7Ci0gICAgcmV0dXJuICRyZWw7Ci19Ci0KLSMgVGhpcyBpcyBhZGRlZCB0byBnZXQgcmlkIG9mIHRoZSBsb25nIGNvbW1lbnQgdGhhdCBmb2xsb3dzIHRoZQotIyBkb2N0eXBlIGRlY2xhcmF0aW9uOyBNU0lFNSBvbiBOVDQgU1A0IGJhcmZzIG9uIGl0IGFuZCBkcm9wcyB0aGUKLSMgY29udGVudCBvZiB0aGUgcGFnZS4KLSRNWV9QQVJUSUFMX0hFQURFUiA9ICcnOwotc3ViIG1ha2VfaGVhZF9hbmRfYm9keSgkJCkgewotICAgIG15KCR0aXRsZSwgJGJvZHkpID0gQF87Ci0gICAgJGJvZHkgPSAiICRib2R5IiB1bmxlc3MgKCRib2R5IGVxICcnKTsKLSAgICBteSAkRFREY29tbWVudCA9ICcnOwotICAgIG15KCR2ZXJzaW9uLCAkaXNvbGFuZ3VhZ2UpID0gKCRIVE1MX1ZFUlNJT04sICdFTicpOwotICAgIG15ICVpc29sYW5ndWFnZXMgPSAoICAnZW5nbGlzaCcsICAnRU4nICAgLCAnVVNlbmdsaXNoJywgJ0VOLlVTJwotICAgICAgICAgICAgICAgICAgICAgICAgLCAnb3JpZ2luYWwnLCAnRU4nICAgLCAnZ2VybWFuJyAgICwgJ0RFJwotICAgICAgICAgICAgICAgICAgICAgICAgLCAnYXVzdHJpYW4nLCAnREUuQVQnLCAnZnJlbmNoJyAgICwgJ0ZSJwotICAgICAgICAgICAgICAgICAgICAgICAgLCAnc3BhbmlzaCcsICAnRVMnKTsKLSAgICAkaXNvbGFuZ3VhZ2UgPSAkaXNvbGFuZ3VhZ2VzeyRkZWZhdWx0X2xhbmd1YWdlfTsKLSAgICAkaXNvbGFuZ3VhZ2UgPSAnRU4nIHVubGVzcyAkaXNvbGFuZ3VhZ2U7Ci0gICAgJHRpdGxlID0gJnB1cmlmeSgkdGl0bGUsMSk7Ci0gICAgZXZhbCgiXCR0aXRsZSA9ICIuICRkZWZhdWx0X3RpdGxlICkgdW5sZXNzICgkdGl0bGUpOwotCi0gICAgIyBhbGxvdyB1c2VyLW1vZGlmaWNhdGlvbiBvZiB0aGUgPHRpdGxlPiB0YWc7IHRoYW5rcyBEYW4gWW91bmcKLSAgICBpZiAoZGVmaW5lZCAmY3VzdG9tX1RJVExFX2hvb2spIHsKLSAgICAgICAgJHRpdGxlID0gJmN1c3RvbV9USVRMRV9ob29rKCR0aXRsZSwgJHRvY19zZWNfdGl0bGUpOwotICAgIH0KLQotICAgIGlmICgkRE9DVFlQRSA9fiAvXC9cL1tcd1wuXStccyokLykgeyAjIGxhbmd1YWdlIHNwZWMgaW5jbHVkZWQKLSAgICAgICAgJERURGNvbW1lbnQgPSAiPCFET0NUWVBFIGh0bWwgUFVCTElDIFwiJERPQ1RZUEVcIj5cbiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgJERURGNvbW1lbnQgPSAiPCFET0NUWVBFIGh0bWwgUFVCTElDIFwiJERPQ1RZUEUvLyIKLSAgICAgICAgICAgIC4gKCRJU09fTEFOR1VBR0UgPyAkSVNPX0xBTkdVQUdFIDogJGlzb2xhbmd1YWdlKSAuICJcIj5cbiI7Ci0gICAgfQotICAgIGlmICgkTVlfUEFSVElBTF9IRUFERVIgZXEgJycpIHsKLSAgICAgICAgbXkgJGZhdmljb24gPSAnJzsKLSAgICAgICAgaWYgKCRGQVZPUklURVNfSUNPTikgewotICAgICAgICAgICAgbXkoJG15bmFtZSwgJG15ZGlyLCAkbXlleHQpID0gZmlsZXBhcnNlKCRGQVZPUklURVNfSUNPTiwgJ1wuLionKTsKLSAgICAgICAgICAgIG15ICRmYXZ0eXBlID0gJyc7Ci0gICAgICAgICAgICBpZiAoJG15ZXh0IGVxICcuZ2lmJyB8fCAkbXlleHQgZXEgJy5wbmcnKSB7Ci0gICAgICAgICAgICAgICAgJG15ZXh0ID1+IHMvXlsuXS8vOwotICAgICAgICAgICAgICAgICRmYXZ0eXBlID0gIiB0eXBlPVwiaW1hZ2UvJG15ZXh0XCIiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgJGZhdmljb24gPSAoCi0gICAgICAgICAgICAgICAgIlxuPGxpbmsgcmVsPVwiU0hPUlRDVVQgSUNPTlwiIGhyZWY9XCIkRkFWT1JJVEVTX0lDT05cIiIKLSAgICAgICAgICAgICAgICAuICIkZmF2dHlwZSAvPiIpOwotICAgICAgICB9Ci0gICAgICAgICRTVFlMRVNIRUVUID0gJEZJTEUuIi5jc3MiIHVubGVzcyAkU1RZTEVTSEVFVDsKLSAgICAgICAgJE1ZX1BBUlRJQUxfSEVBREVSID0gam9pbignJywKLSAgICAgICAgICAgICgkRE9DVFlQRSA/ICREVERjb21tZW50IDogJycpLAotICAgICAgICAgICAgIjxodG1sPlxuPGhlYWQ+IiwKLSAgICAgICAgICAgICgkQkFTRSA/ICJcbjxiYXNlIGhyZWY9XCIkQkFTRVwiIC8+IiA6ICcnKSwKLSAgICAgICAgICAgICJcbjxsaW5rIHJlbD1cIlNUWUxFU0hFRVRcIiBocmVmPVwiJFNUWUxFU0hFRVRcIiB0eXBlPSd0ZXh0L2NzcyciLAotICAgICAgICAgICAgIiAvPiIsCi0gICAgICAgICAgICAkZmF2aWNvbiwKLSAgICAgICAgICAgICgkRVhURVJOQUxfVVBfTElOSwotICAgICAgICAgICAgID8gKCJcbjxsaW5rIHJlbD0nc3RhcnQnIGhyZWY9JyIgLiAkRVhURVJOQUxfVVBfTElOSwotICAgICAgICAgICAgICAgIC4gKCRFWFRFUk5BTF9VUF9USVRMRSA/Ci0gICAgICAgICAgICAgICAgICAgIicgdGl0bGU9JyRFWFRFUk5BTF9VUF9USVRMRScgLz4iIDogIicgLz4iKSkKLSAgICAgICAgICAgICA6ICcnKSwKLSAgICAgICAgICAgICJcbjxsaW5rIHJlbD1cImZpcnN0XCIgaHJlZj1cIiRGSUxFLmh0bWxcIiIsCi0gICAgICAgICAgICAoJHRfdGl0bGUgPyAiIHRpdGxlPSckdF90aXRsZSciIDogJycpLAotICAgICAgICAgICAgJyAvPicsCi0gICAgICAgICAgICAoJEhBVkVfVEFCTEVfT0ZfQ09OVEVOVFMKLSAgICAgICAgICAgICA/ICgiXG48bGluayByZWw9J2NvbnRlbnRzJyBocmVmPSckTVlfQ09OVEVOVFNfUEFHRSciCi0gICAgICAgICAgICAgICAgLiAnIHRpdGxlPSJDb250ZW50cyIgLz4nKQotICAgICAgICAgICAgIDogJycpLAotICAgICAgICAgICAgKCRIQVZFX0dFTkVSQUxfSU5ERVgKLSAgICAgICAgICAgICA/ICgiXG48bGluayByZWw9J2luZGV4JyBocmVmPSckR0VORVJBTF9JTkRFWF9GSUxFJyIKLSAgICAgICAgICAgICAgICAuICIgdGl0bGU9J0luZGV4JyAvPiIpCi0gICAgICAgICAgICAgOiAnJyksCi0gICAgICAgICAgICAjIGRpc2FibGUgZm9yIG5vdyAtLSBNb3ppbGxhIGRvZXNuJ3QgZG8gd2VsbCB3aXRoIG11bHRpcGxlIGluZGV4ZXMKLSAgICAgICAgICAgICMgKCRIQVZFX01PRFVMRV9JTkRFWAotICAgICAgICAgICAgIyAgPyAoIjxsaW5rIHJlbD0iaW5kZXgiIGhyZWY9JyRNT0RVTEVfSU5ERVhfRklMRSciCi0gICAgICAgICAgICAjICAgICAuICIgdGl0bGU9J01vZHVsZSBJbmRleCcgLz5cbiIpCi0gICAgICAgICAgICAjICA6ICcnKSwKLSAgICAgICAgICAgICgkSU5GTwotICAgICAgICAgICAgICMgWFhYIFdlIGNhbiBkbyB0aGlzIHdpdGggdGhlIFB5dGhvbiB0b29scyBzaW5jZSB0aGUgQWJvdXQuLi4KLSAgICAgICAgICAgICAjIHBhZ2UgYWx3YXlzIGdldHMgY29waWVkIHRvIGFib3V0Lmh0bWwsIGV2ZW4gd2hlbiB3ZSB1c2UgdGhlCi0gICAgICAgICAgICAgIyBnZW5lcmF0ZWQgbm9kZSMjIy5odG1sIHBhZ2UgbmFtZXMuICBXb24ndCB3b3JrIHdpdGggdGhlCi0gICAgICAgICAgICAgIyByZXN0IG9mIHRoZSBQeXRob24gZG9jIHRvb2xzLgotICAgICAgICAgICAgID8gKCJcbjxsaW5rIHJlbD0nbGFzdCcgaHJlZj0nYWJvdXQuaHRtbCciCi0gICAgICAgICAgICAgICAgLiAiIHRpdGxlPSdBYm91dCB0aGlzIGRvY3VtZW50Li4uJyAvPiIKLSAgICAgICAgICAgICAgICAuICJcbjxsaW5rIHJlbD0naGVscCcgaHJlZj0nYWJvdXQuaHRtbCciCi0gICAgICAgICAgICAgICAgLiAiIHRpdGxlPSdBYm91dCB0aGlzIGRvY3VtZW50Li4uJyAvPiIpCi0gICAgICAgICAgICAgOiAnJyksCi0gICAgICAgICAgICAkbW9yZV9saW5rc19tYXJrLAotICAgICAgICAgICAgIlxuIiwKLSAgICAgICAgICAgICgkQ0hBUlNFVCAmJiAkSFRNTF9WRVJTSU9OIGdlICIyLjEiCi0gICAgICAgICAgICAgPyAoJzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyAnCi0gICAgICAgICAgICAgICAgLiAiY2hhcnNldD0kQ0hBUlNFVFwiIC8+XG4iKQotICAgICAgICAgICAgIDogJycpLAotICAgICAgICAgICAgKCRBRVNPUF9NRVRBX1RZUEUKLSAgICAgICAgICAgICA/ICI8bWV0YSBuYW1lPSdhZXNvcCcgY29udGVudD0nJEFFU09QX01FVEFfVFlQRScgLz5cbiIgOiAnJykpOwotICAgIH0KLSAgICBpZiAoISRjaGFyc2V0ICYmICRDSEFSU0VUKSB7Ci0gICAgICAgICRjaGFyc2V0ID0gJENIQVJTRVQ7Ci0gICAgICAgICRjaGFyc2V0ID1+IHMvXy9cLS9nbzsKLSAgICB9Ci0gICAgam9pbignJywKLSAgICAgICAgICRNWV9QQVJUSUFMX0hFQURFUiwKLSAgICAgICAgICI8dGl0bGU+IiwgJHRpdGxlLCAiPC90aXRsZT5cbjwvaGVhZD5cbjxib2R5JGJvZHk+Iik7Ci19Ci0KLXN1YiByZXBsYWNlX21vcmVsaW5rcyB7Ci0gICAgJG1vcmVfbGlua3MgPX4gcy8gUkVMPS8gcmVsPS9nOwotICAgICRtb3JlX2xpbmtzID1+IHMvIEhSRUY9LyBocmVmPS9nOwotICAgICRtb3JlX2xpbmtzID1+IHMvPExJTksgLzxsaW5rIC9nOwotICAgICRtb3JlX2xpbmtzID1+IHMvIj4vIiBcLz4vZzsKLSAgICAkXyA9fiBzLyRtb3JlX2xpbmtzX21hcmsvJG1vcmVfbGlua3MvZTsKLX0KLQotMTsgICAgICAjIFRoaXMgbXVzdCBiZSB0aGUgbGFzdCBsaW5lCmRpZmYgLS1naXQgYS9Eb2MvcGVybC9sdHhtYXJrdXAucGVybCBiL0RvYy9wZXJsL2x0eG1hcmt1cC5wZXJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTBmN2UxLi4wMDAwMDAwCi0tLSBhL0RvYy9wZXJsL2x0eG1hcmt1cC5wZXJsCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotIyBMYVRlWDJIVE1MIHN1cHBvcnQgZm9yIHRoZSBsdHhtYXJrdXAgcGFja2FnZS4gIERvZXNuJ3QgZG8gaW5kZXhpbmcuCi0KLXBhY2thZ2UgbWFpbjsKLQotCi1zdWIgbHR4X25leHRfYXJndW1lbnR7Ci0gICAgbXkgJHBhcmFtOwotICAgICRwYXJhbSA9IG1pc3NpbmdfYnJhY2VzKCkKLSAgICAgIHVubGVzcyAoKHMvJG5leHRfcGFpcl9wcl9yeC8kcGFyYW09JDI7JycvZW8pCi0JICAgICAgfHwocy8kbmV4dF9wYWlyX3J4LyRwYXJhbT0kMjsnJy9lbykpOwotICAgIHJldHVybiAkcGFyYW07Ci19Ci0KLQotc3ViIGRvX2NtZF9tYWNyb3sKLSAgICBsb2NhbCgkXykgPSBAXzsKLSAgICBteSAkbWFjcm8gPSBsdHhfbmV4dF9hcmd1bWVudCgpOwotICAgIHJldHVybiAiPHR0IGNsYXNzPSdtYWNybyc+JiM5MjskbWFjcm88L3R0PiIgLiAkXzsKLX0KLQotc3ViIGRvX2NtZF9lbnZ7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbXkgJGVudiA9IGx0eF9uZXh0X2FyZ3VtZW50KCk7Ci0gICAgcmV0dXJuICI8dHQgY2xhc3M9J2Vudmlyb25tZW50Jz4mIzkyOyRlbnY8L3R0PiIgLiAkXzsKLX0KLQotc3ViIGx0eF9wcm9jZXNzX3BhcmFtc3sKLSAgICAjIEhhbmRsZSBwcm9jZXNzaW5nIG9mIFxwIGFuZCBcb3AgZm9yIHBhcmFtZXRlciBzcGVjaWZpY2F0aW9ucyBmb3IKLSAgICAjIGVudmRlc2MgYW5kIG1hY3JvZGVzYy4gIEl0J3MgZG9uZSB0aGlzIHdheSB0byBhdm9pZCBkZWZpbmluZyBkb19jbWRfcCgpCi0gICAgIyBhbmQgZG9fY21kX29wKCkgZnVuY3Rpb25zLCB3aGljaCB3b3VsZCBiZSBpbnRlcnByZXRlZCBvdXRzaWRlIHRoZSBjb250ZXh0Ci0gICAgIyBpbiB3aGljaCB0aGVzZSBjb21tYW5kcyBhcmUgbGVnYWwsIGFuZCBjYXVzZSBMYVRlWDJIVE1MIHRvIHRoaW5rIHRoZXkncmUKLSAgICAjIGRlZmluZWQuICBUaGlzIHdheSwgb3RoZXIgdXNlcyBvZiBccCBhbmQgXG9wIGFyZSBwcm9wZXJseSBmbGFnZ2VkIGFzCi0gICAgIyB1bmtub3duIG1hY3Jvcy4KLSAgICBteSAkcyA9IEBfWzBdOwotICAgICRzID1+IHMlXFxvcDw8KFxkKyk+PiguKyk8PFwxPj4lPHR0Pls8L3R0Pjx2YXI+JDI8L3Zhcj48dHQ+XTwvdHQ+JTsKLSAgICB3aGlsZSAoJHMgPX4gL1xccDw8KFxkKyk+PiguKyk8PFwxPj4vKSB7Ci0JJHMgPX4gcyVcXHA8PChcZCspPj4oLispPDxcMT4+JTx0dD57PC90dD48dmFyPiQyPC92YXI+PHR0Pn08L3R0PiU7Ci0gICAgfQotICAgIHJldHVybiAkczsKLX0KLQotc3ViIGRvX2Vudl9tYWNyb2Rlc2N7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbXkgJG1hY3JvID0gbHR4X25leHRfYXJndW1lbnQoKTsKLSAgICBteSAkcGFyYW1zID0gbHR4X3Byb2Nlc3NfcGFyYW1zKGx0eF9uZXh0X2FyZ3VtZW50KCkpOwotICAgIHJldHVybiAiXG48ZGwgY2xhc3M9J21hY3JvZGVzYyc+IgotICAgICAgICAgLiAiXG48ZHQ+PGI+PHR0IGNsYXNzPSdtYWNybyc+JiM5MjskbWFjcm88L3R0PjwvYj4iCi0gICAgICAgICAuICJcbiAgICAkcGFyYW1zPC9kdD4iCi0JIC4gIlxuPGRkPiIKLQkgLiAkXwotCSAuICc8L2RkPjwvZGw+JzsKLX0KLQotc3ViIGRvX2Vudl9lbnZkZXNjewotICAgIGxvY2FsKCRfKSA9IEBfOwotICAgIG15ICRlbnYgPSBsdHhfbmV4dF9hcmd1bWVudCgpOwotICAgIG15ICRwYXJhbXMgPSBsdHhfcHJvY2Vzc19wYXJhbXMobHR4X25leHRfYXJndW1lbnQoKSk7Ci0gICAgcmV0dXJuICJcbjxkbCBjbGFzcz0nZW52ZGVzYyc+IgotICAgICAgICAgLiAiXG48ZHQ+PHR0PiYjOTI7YmVnaW57PGIgY2xhc3M9J2Vudmlyb25tZW50Jz4kZW52PC9iPn08L3R0PiIKLSAgICAgICAgIC4gIlxuICAgICRwYXJhbXMiCi0gICAgICAgICAuICJcbjxiciAvPjx0dD4mIzkyO2VuZHs8YiBjbGFzcz0nZW52aXJvbm1lbnQnPiRlbnY8L2I+fTwvdHQ+PC9kdD4iCi0JIC4gIlxuPGRkPiIKLQkgLiAkXwotCSAuICc8L2RkPjwvZGw+JzsKLX0KLQotMTsJCQkJIyBNdXN0IGVuZCB3aXRoIHRoaXMsIGJlY2F1c2UgUGVybCBpcyBib2d1cy4KZGlmZiAtLWdpdCBhL0RvYy9wZXJsL21hbnVhbC5wZXJsIGIvRG9jL3BlcmwvbWFudWFsLnBlcmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNjViMzYuLjAwMDAwMDAKLS0tIGEvRG9jL3BlcmwvbWFudWFsLnBlcmwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIC0qLSBwZXJsIC0qLQotIwotIyBUaGlzIGltcGxlbWVudHMgdGhlIFB5dGhvbiBtYW51YWwgY2xhc3MuICBBbGwgaXQgcmVhbGx5IG5lZWRzIHRvIGRvIGl0Ci0jIGxvYWQgdGhlICJweXRob24iIHN0eWxlLiAgVGhlIHN0eWxlIGNvZGUgaXMgbm90IG1vdmVkIGludG8gdGhlIGNsYXNzIGNvZGUKLSMgYXQgdGhpcyB0aW1lLCBzaW5jZSB3ZSBleHBlY3QgYWRkaXRpb25hbCBkb2N1bWVudCBjbGFzcyB0byBiZSBkZXZlbG9wZWQKLSMgZm9yIHRoZSBQeXRob24gZG9jdW1lbnRhdGlvbiBpbiB0aGUgZnV0dXJlLiAgQXBwcm9wcmlhdGUgcmVsb2NhdGlvbnMgd2lsbAotIyBiZSBtYWRlIGF0IHRoYXQgdGltZS4KLQotcGFja2FnZSBtYWluOwotCi1kb19yZXF1aXJlX3BhY2thZ2UoInJlcG9ydCIpOwotZG9fcmVxdWlyZV9wYWNrYWdlKCJhbGx0dCIpOwotZG9fcmVxdWlyZV9wYWNrYWdlKCJweXRob24iKTsKLQotMTsJCQkJIyBzaGVlc2guLi4uCmRpZmYgLS1naXQgYS9Eb2MvcGVybC9weXRob24ucGVybCBiL0RvYy9wZXJsL3B5dGhvbi5wZXJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTk0MGU2Li4wMDAwMDAwCi0tLSBhL0RvYy9wZXJsL3B5dGhvbi5wZXJsCisrKyAvZGV2L251bGwKQEAgLTEsMjE4MiArMCwwIEBACi0jIHB5dGhvbi5wZXJsIGJ5IEZyZWQgTC4gRHJha2UsIEpyLiA8ZmRyYWtlQGFjbS5vcmc+ICAgICAgICAgICAgLSotIHBlcmwgLSotCi0jCi0jIEhlYXZpbHkgYmFzZWQgb24gR3VpZG8gdmFuIFJvc3N1bSdzIG15Zm9ybWF0LnBlcmwgKG5vdyBvYnNvbGV0ZSkuCi0jCi0jIEV4dGVuc2lvbiB0byBMYVRlWDJIVE1MIGZvciBkb2N1bWVudHMgdXNpbmcgbXlmb3JtYXQuc3R5LgotIyBTdWJyb3V0aW5lcyBvZiB0aGUgZm9ybSBkb19jbWRfPG5hbWU+IGhlcmUgZGVmaW5lIHRyYW5zbGF0aW9ucwotIyBmb3IgTGFUZVggY29tbWFuZHMgXDxuYW1lPiBkZWZpbmVkIGluIHRoZSBjb3JyZXNwb25kaW5nIC5zdHkgZmlsZS4KLQotcGFja2FnZSBtYWluOwotCi11c2Ugd2FybmluZ3M7Ci11c2UgRmlsZTo6QmFzZW5hbWU7Ci0KLQotc3ViIG5leHRfYXJndW1lbnR7Ci0gICAgbXkgJHBhcmFtOwotICAgICRwYXJhbSA9IG1pc3NpbmdfYnJhY2VzKCkKLSAgICAgIHVubGVzcyAoKHMvJG5leHRfcGFpcl9wcl9yeC8kcGFyYW09JDI7JycvZW8pCi0gICAgICAgICAgICAgIHx8KHMvJG5leHRfcGFpcl9yeC8kcGFyYW09JDI7JycvZW8pKTsKLSAgICByZXR1cm4gJHBhcmFtOwotfQotCi1zdWIgbmV4dF9vcHRpb25hbF9hcmd1bWVudHsKLSAgICBteSgkcGFyYW0sICRyeCkgPSAoJycsICJeXFxzKihcXFsoW15dXSopXFxdKT8iKTsKLSAgICBzLyRyeC8kcGFyYW09JDI7JycvZW87Ci0gICAgcmV0dXJuICRwYXJhbTsKLX0KLQotc3ViIG1ha2VfaWNvbl9maWxlbmFtZSgkKXsKLSAgICBteSgkbXluYW1lLCAkbXlkaXIsICRteWV4dCkgPSBmaWxlcGFyc2UoJF9bMF0sICdcLi4qJyk7Ci0gICAgY2hvcCAkbXlkaXI7Ci0gICAgaWYgKCRteWRpciBlcSAnLicpIHsKLSAgICAgICAgJG15ZGlyID0gJElDT05TRVJWRVI7Ci0gICAgfQotICAgICRteWV4dCA9ICIuJElNQUdFX1RZUEUiCi0gICAgICB1bmxlc3MgJG15ZXh0OwotICAgIHJldHVybiAiJG15ZGlyJGRkJG15bmFtZSRteWV4dCI7Ci19Ci0KLXN1YiBnZXRfbGlua19pY29uKCQpewotICAgIG15ICR1cmwgPSAkX1swXTsKLSAgICBpZiAoJE9GRl9TSVRFX0xJTktfSUNPTiAmJiAoJHVybCA9fiAvXlstYS16QS1aMC05Ll0rOi8pKSB7Ci0gICAgICAgICMgYWJzb2x1dGUgVVJMOyBhc3N1bWUgaXQgcG9pbnRzIG9mZi1zaXRlCi0gICAgICAgIG15ICRpY29uID0gbWFrZV9pY29uX2ZpbGVuYW1lKCRPRkZfU0lURV9MSU5LX0lDT04pOwotICAgICAgICByZXR1cm4gKCIgPGltZyBzcmM9XCIkaWNvblwiXG4iCi0gICAgICAgICAgICAgICAgLiAnICBib3JkZXI9IjAiIGNsYXNzPSJvZmZzaXRlbGluayInCi0gICAgICAgICAgICAgICAgLiAoJE9GRl9TSVRFX0xJTktfSUNPTl9IRUlHSFQKLSAgICAgICAgICAgICAgICAgICA/ICIgaGVpZ2h0PVwiJE9GRl9TSVRFX0xJTktfSUNPTl9IRUlHSFRcIiIKLSAgICAgICAgICAgICAgICAgICA6ICcnKQotICAgICAgICAgICAgICAgIC4gKCRPRkZfU0lURV9MSU5LX0lDT05fV0lEVEgKLSAgICAgICAgICAgICAgICAgICA/ICIgd2lkdGg9XCIkT0ZGX1NJVEVfTElOS19JQ09OX1dJRFRIXCIiCi0gICAgICAgICAgICAgICAgICAgOiAnJykKLSAgICAgICAgICAgICAgICAuICIgYWx0PVwiW29mZi1zaXRlIGxpbmtdXCJcbiIKLSAgICAgICAgICAgICAgICAuICIgIC8+Iik7Ci0gICAgfQotICAgIHJldHVybiAnJzsKLX0KLQotIyBUaGlzIGlzIGEgZmFpcmx5IHNpbXBsZSBoYWNrOyBpdCBzdXBwb3J0cyBcbGV0IHdoZW4gaXQgaXMgdXNlZCB0byBjcmVhdGUKLSMgKG9yIHJlZGVmaW5lKSBhIG1hY3JvIHRvIGV4YWN0bHkgYmUgc29tZSBvdGhlciBtYWNybzogXGxldFxuZXduYW1lPVxvbGRuYW1lLgotIyBNYW55IHBvc3NpYmxlIHVzZXMgb2YgXGxldCBhcmVuJ3Qgc3VwcG9ydGVkIG9yIGFyZW4ndCBzdXBwb3J0ZWQgY29ycmVjdGx5LgotIwotc3ViIGRvX2NtZF9sZXR7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbXkgJG1hdGNoZWQgPSAwOwotICAgIHMvW1xcXShbYS16QS1aXSspXHMqKD1ccyopP1tcXF0oW2EtekEtWl0qKS8kbWF0Y2hlZD0xOyAnJy9lOwotICAgIGlmICgkbWF0Y2hlZCkgewotICAgICAgICBteSgkbmV3LCAkb2xkKSA9ICgkMSwgJDMpOwotICAgICAgICBldmFsICJzdWIgZG9fY21kXyRuZXcgeyBkb19jbWRfJG9sZCIgLiAnKEBfKTsgfSc7Ci0gICAgICAgIHByaW50ICJcbmRlZmluaW5nIGhhbmRsZXIgZm9yIFxcJG5ldyB1c2luZyBcXCRvbGRcbiI7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBzL1tcXF0oW2EtekEtWl0rKVxzKig9XHMqKT8oW15cXF0pLyRtYXRjaGVkPTE7ICcnL2VzOwotICAgICAgICBpZiAoJG1hdGNoZWQpIHsKLSAgICAgICAgICAgIG15KCRuZXcsICRjaGFyKSA9ICgkMSwgJDMpOwotICAgICAgICAgICAgZXZhbCAic3ViIGRvX2NtZF8kbmV3IHsgXCJcXCRjaGFyXCIgLiBcJF9bMF07IH0iOwotICAgICAgICAgICAgcHJpbnQgIlxuZGVmaW5pbmcgaGFuZGxlciBmb3IgXFwkbmV3IHRvIGluc2VydCAnJGNoYXInXG4iOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgd3JpdGVfd2FybmluZ3MoIkNvdWxkIG5vdCBpbnRlcnByZXQgXFxsZXQgY29uc3RydWN0Li4uIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuICRfOwotfQotCi0KLSMgdGhlIG9sZGVyIHZlcnNpb24gb2YgTGFUZVgySFRNTCB3ZSB1c2UgZG9lc24ndCBzdXBwb3J0IHRoaXMsIGJ1dCB3ZSB1c2UgaXQ6Ci0KLXN1YiBkb19jbWRfdGV4dGFzY2lpdGlsZGV7ICcmIzEyNjsnIC4gJF9bMF07IH0KLXN1YiBkb19jbWRfdGV4dGFzY2lpY2lyY3VteyAnXicgLiAkX1swXTsgfQotc3ViIGRvX2NtZF90ZXh0YmFyeyAnfCcgLiAkX1swXTsgfQotc3ViIGRvX2NtZF90ZXh0ZXVybyB7ICcmIzgzNjQ7JyAuICRfWzBdOyB9Ci1zdWIgZG9fY21kX3RleHRncmVhdGVyeyAnJmd0OycgLiAkX1swXTsgfQotc3ViIGRvX2NtZF90ZXh0bGVzc3sgJyZsdDsnIC4gJF9bMF07IH0KLXN1YiBkb19jbWRfdGV4dHVuZGVyc2NvcmV7ICdfJyAuICRfWzBdOyB9Ci1zdWIgZG9fY21kX2luZmluaXR5eyAnJmluZmluOycgLiAkX1swXTsgfQotc3ViIGRvX2NtZF9wbHVzbWludXN7ICcmcGx1c21uOycgLiAkX1swXTsgfQotc3ViIGRvX2NtZF9ndWlsYWJlbHsKLSAgICByZXR1cm4gdXNlX3dyYXBwZXJzKCRfWzBdLiAnPHNwYW4gY2xhc3M9Imd1aWxhYmVsIj4nLCAnPC9zcGFuPicpOyB9Ci1zdWIgZG9fY21kX21lbnVzZWxlY3Rpb257Ci0gICAgcmV0dXJuIHVzZV93cmFwcGVycygkX1swXSwgJzxzcGFuIGNsYXNzPSJndWlsYWJlbCI+JywgJzwvc3Bhbj4nKTsgfQotc3ViIGRvX2NtZF9zdWJ7Ci0gICAgcmV0dXJuICc8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9Imd1aWxhYmVsIj4nIC4gJF9bMF07IH0KLQotCi0jIHdvcmRzIHR5cGVzZXQgaW4gYSBzcGVjaWFsIHdheSAobm90IGluIEhUTUwgdGhvdWdoKQotCi1zdWIgZG9fY21kX0FCQ3sgJ0FCQycgLiAkX1swXTsgfQotc3ViIGRvX2NtZF9VTklYeyAnPHNwYW4gY2xhc3M9IlVuaXgiPlVuaXg8L3NwYW4+JyAuICRfWzBdOyB9Ci1zdWIgZG9fY21kX0xhVGVYeyAnPHNwYW4gY2xhc3M9IkxhVGVYIj5MYVRlWDwvc3Bhbj4nIC4gJF9bMF07IH0KLXN1YiBkb19jbWRfVGVYeyAnPHNwYW4gY2xhc3M9IlRlWCI+VGVYPC9zcGFuPicgLiAkX1swXTsgfQotc3ViIGRvX2NtZF9BU0NJSXsgJ0FTQ0lJJyAuICRfWzBdOyB9Ci1zdWIgZG9fY21kX1BPU0lYeyAnUE9TSVgnIC4gJF9bMF07IH0KLXN1YiBkb19jbWRfQ3sgJ0MnIC4gJF9bMF07IH0KLXN1YiBkb19jbWRfQ3BweyAnQysrJyAuICRfWzBdOyB9Ci1zdWIgZG9fY21kX0VPRnsgJ0VPRicgLiAkX1swXTsgfQotc3ViIGRvX2NtZF9OVUxMeyAnPHR0IGNsYXNzPSJjb25zdGFudCI+TlVMTDwvdHQ+JyAuICRfWzBdOyB9Ci0KLXN1YiBkb19jbWRfZXsgJyYjOTI7JyAuICRfWzBdOyB9Ci0KLSRERVZFTE9QRVJfQUREUkVTUyA9ICcnOwotJFNIT1JUX1ZFUlNJT04gPSAnJzsKLSRSRUxFQVNFX0lORk8gPSAnJzsKLSRQQUNLQUdFX1ZFUlNJT04gPSAnJzsKLQotc3ViIGRvX2NtZF92ZXJzaW9ueyAkUEFDS0FHRV9WRVJTSU9OIC4gJF9bMF07IH0KLXN1YiBkb19jbWRfc2hvcnR2ZXJzaW9ueyAkU0hPUlRfVkVSU0lPTiAuICRfWzBdOyB9Ci1zdWIgZG9fY21kX3JlbGVhc2V7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgJFBBQ0tBR0VfVkVSU0lPTiA9IG5leHRfYXJndW1lbnQoKTsKLSAgICByZXR1cm4gJF87Ci19Ci0KLXN1YiBkb19jbWRfc2V0cmVsZWFzZWluZm97Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgJFJFTEVBU0VfSU5GTyA9IG5leHRfYXJndW1lbnQoKTsKLSAgICByZXR1cm4gJF87Ci19Ci0KLXN1YiBkb19jbWRfc2V0c2hvcnR2ZXJzaW9uewotICAgIGxvY2FsKCRfKSA9IEBfOwotICAgICRTSE9SVF9WRVJTSU9OID0gbmV4dF9hcmd1bWVudCgpOwotICAgIHJldHVybiAkXzsKLX0KLQotc3ViIGRvX2NtZF9hdXRob3JhZGRyZXNzewotICAgIGxvY2FsKCRfKSA9IEBfOwotICAgICRERVZFTE9QRVJfQUREUkVTUyA9IG5leHRfYXJndW1lbnQoKTsKLSAgICByZXR1cm4gJF87Ci19Ci0KLXN1YiBkb19jbWRfaGFja3Njb3JlewotICAgIGxvY2FsKCRfKSA9IEBfOwotICAgIG5leHRfYXJndW1lbnQoKTsKLSAgICByZXR1cm4gJ18nIC4gJF87Ci19Ci0KLSMgSGVscGVyIHVzZWQgaW4gbWFueSBwbGFjZXMgdGhhdCBhcmJpdHJhcnkgY29kZS1saWtlIHRleHQgYXBwZWFyczoKLQotc3ViIGNvZGV0ZXh0KCQpewotICAgIG15ICR0ZXh0ID0gIiRfWzBdIjsKLSAgICAjIE1ha2Ugc3VyZSB0aGF0ICItLS0iIGlzIG5vdCBjb252ZXJ0ZWQgdG8gIi0tIiBsYXRlciB3aGVuCi0gICAgIyBMYVRlWDJIVE1MIHRyaWVzIGNvbnZlcnRpbmcgZW0tZGFzaGVzIGJhc2VkIG9uIHRoZSBjb252ZW50aW9uYWwKLSAgICAjIFRlWCBmb250IGxpZ2F0dXJlczoKLSAgICAkdGV4dCA9fiBzLy0tLy1cJiM0NTsvZ287Ci0gICAgcmV0dXJuICR0ZXh0OwotfQotCi1zdWIgdXNlX3dyYXBwZXJzKCQkJCl7Ci0gICAgbG9jYWwoJF8sJGJlZm9yZSwkYWZ0ZXIpID0gQF87Ci0gICAgbXkgJHN0dWZmID0gbmV4dF9hcmd1bWVudCgpOwotICAgIHJldHVybiAkYmVmb3JlIC4gJHN0dWZmIC4gJGFmdGVyIC4gJF87Ci19Ci0KLXN1YiB1c2VfY29kZV93cmFwcGVycygkJCQpewotICAgIGxvY2FsKCRfLCRiZWZvcmUsJGFmdGVyKSA9IEBfOwotICAgIG15ICRzdHVmZiA9IGNvZGV0ZXh0KG5leHRfYXJndW1lbnQoKSk7Ci0gICAgcmV0dXJuICRiZWZvcmUgLiAkc3R1ZmYgLiAkYWZ0ZXIgLiAkXzsKLX0KLQotJElOX0RFU0NfSEFORExFUiA9IDA7Ci1zdWIgZG9fY21kX29wdGlvbmFsewotICAgIGlmICgkSU5fREVTQ19IQU5ETEVSKSB7Ci0gICAgICAgIHJldHVybiB1c2Vfd3JhcHBlcnMoJF9bMF0sICI8L3Zhcj48YmlnPlxbPC9iaWc+PHZhcj4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8L3Zhcj48YmlnPlxdPC9iaWc+PHZhcj4iKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHJldHVybiB1c2Vfd3JhcHBlcnMoJF9bMF0sICI8YmlnPlxbPC9iaWc+IiwgIjxiaWc+XF08L2JpZz4iKTsKLSAgICB9Ci19Ci0KLSMgTG9naWNhbCBmb3JtYXR0aW5nIChzb21lIGJhc2VkIG9uIHRleGluZm8pLCBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgdG8KLSMgbWluaW1hbGlzdCBIVE1MLiAgVGhlICJtaW5pbWFsaXN0IiBpcyBwcmltYXJpbHkgdG8gcmVkdWNlIHRoZSBzaXplIG9mCi0jIG91dHB1dCBmaWxlcyBmb3IgdXNlcnMgdGhhdCByZWFkIHRoZW0gb3ZlciB0aGUgbmV0d29yayByYXRoZXIgdGhhbgotIyBmcm9tIGxvY2FsIHJlcG9zaXRvcmllcy4KLQotc3ViIGRvX2NtZF9weXR5cGV7IHJldHVybiAkX1swXTsgfQotc3ViIGRvX2NtZF9tYWtldmFyewotICAgIHJldHVybiB1c2Vfd3JhcHBlcnMoJF9bMF0sICc8c3BhbiBjbGFzcz0ibWFrZXZhciI+JywgJzwvc3Bhbj4nKTsgfQotc3ViIGRvX2NtZF9jb2RlewotICAgIHJldHVybiB1c2VfY29kZV93cmFwcGVycygkX1swXSwgJzxjb2RlPicsICc8L2NvZGU+Jyk7IH0KLXN1YiBkb19jbWRfbW9kdWxlewotICAgIHJldHVybiB1c2Vfd3JhcHBlcnMoJF9bMF0sICc8dHQgY2xhc3M9Im1vZHVsZSI+JywgJzwvdHQ+Jyk7IH0KLXN1YiBkb19jbWRfa2V5d29yZHsKLSAgICByZXR1cm4gdXNlX3dyYXBwZXJzKCRfWzBdLCAnPHR0IGNsYXNzPSJrZXl3b3JkIj4nLCAnPC90dD4nKTsgfQotc3ViIGRvX2NtZF9leGNlcHRpb257Ci0gICAgcmV0dXJuIHVzZV93cmFwcGVycygkX1swXSwgJzx0dCBjbGFzcz0iZXhjZXB0aW9uIj4nLCAnPC90dD4nKTsgfQotc3ViIGRvX2NtZF9jbGFzc3sKLSAgICByZXR1cm4gdXNlX3dyYXBwZXJzKCRfWzBdLCAnPHR0IGNsYXNzPSJjbGFzcyI+JywgJzwvdHQ+Jyk7IH0KLXN1YiBkb19jbWRfZnVuY3Rpb257Ci0gICAgcmV0dXJuIHVzZV93cmFwcGVycygkX1swXSwgJzx0dCBjbGFzcz0iZnVuY3Rpb24iPicsICc8L3R0PicpOyB9Ci1zdWIgZG9fY21kX2NvbnN0YW50ewotICAgIHJldHVybiB1c2Vfd3JhcHBlcnMoJF9bMF0sICc8dHQgY2xhc3M9ImNvbnN0YW50Ij4nLCAnPC90dD4nKTsgfQotc3ViIGRvX2NtZF9tZW1iZXJ7Ci0gICAgcmV0dXJuIHVzZV93cmFwcGVycygkX1swXSwgJzx0dCBjbGFzcz0ibWVtYmVyIj4nLCAnPC90dD4nKTsgfQotc3ViIGRvX2NtZF9tZXRob2R7Ci0gICAgcmV0dXJuIHVzZV93cmFwcGVycygkX1swXSwgJzx0dCBjbGFzcz0ibWV0aG9kIj4nLCAnPC90dD4nKTsgfQotc3ViIGRvX2NtZF9jZnVuY3Rpb257Ci0gICAgcmV0dXJuIHVzZV93cmFwcGVycygkX1swXSwgJzx0dCBjbGFzcz0iY2Z1bmN0aW9uIj4nLCAnPC90dD4nKTsgfQotc3ViIGRvX2NtZF9jZGF0YXsKLSAgICByZXR1cm4gdXNlX3dyYXBwZXJzKCRfWzBdLCAnPHR0IGNsYXNzPSJjZGF0YSI+JywgJzwvdHQ+Jyk7IH0KLXN1YiBkb19jbWRfY3R5cGV7Ci0gICAgcmV0dXJuIHVzZV93cmFwcGVycygkX1swXSwgJzx0dCBjbGFzcz0iY3R5cGUiPicsICc8L3R0PicpOyB9Ci1zdWIgZG9fY21kX3JlZ2V4cHsKLSAgICByZXR1cm4gdXNlX2NvZGVfd3JhcHBlcnMoJF9bMF0sICc8dHQgY2xhc3M9InJlZ2V4cCI+JywgJzwvdHQ+Jyk7IH0KLXN1YiBkb19jbWRfY2hhcmFjdGVyewotICAgIHJldHVybiB1c2VfY29kZV93cmFwcGVycygkX1swXSwgJyI8dHQgY2xhc3M9ImNoYXJhY3RlciI+JywgJzwvdHQ+IicpOyB9Ci1zdWIgZG9fY21kX3Byb2dyYW17Ci0gICAgcmV0dXJuIHVzZV93cmFwcGVycygkX1swXSwgJzxiIGNsYXNzPSJwcm9ncmFtIj4nLCAnPC9iPicpOyB9Ci1zdWIgZG9fY21kX3Byb2dyYW1vcHR7Ci0gICAgcmV0dXJuIHVzZV93cmFwcGVycygkX1swXSwgJzxiIGNsYXNzPSJwcm9ncmFtb3B0Ij4nLCAnPC9iPicpOyB9Ci1zdWIgZG9fY21kX2xvbmdwcm9ncmFtb3B0ewotICAgICMgbm90ZSB0aGF0IHRoZSAtLS0gd2lsbCBiZSBsYXRlciBjb252ZXJ0ZWQgdG8gLS0gYnkgTGFUZVgySFRNTAotICAgIHJldHVybiB1c2Vfd3JhcHBlcnMoJF9bMF0sICc8YiBjbGFzcz0icHJvZ3JhbW9wdCI+LS0tJywgJzwvYj4nKTsgfQotc3ViIGRvX2NtZF9lbWFpbHsKLSAgICByZXR1cm4gdXNlX3dyYXBwZXJzKCRfWzBdLCAnPHNwYW4gY2xhc3M9ImVtYWlsIj4nLCAnPC9zcGFuPicpOyB9Ci1zdWIgZG9fY21kX21haWxoZWFkZXJ7Ci0gICAgcmV0dXJuIHVzZV93cmFwcGVycygkX1swXSwgJzxzcGFuIGNsYXNzPSJtYWlsaGVhZGVyIj4nLCAnOjwvc3Bhbj4nKTsgfQotc3ViIGRvX2NtZF9taW1ldHlwZXsKLSAgICByZXR1cm4gdXNlX3dyYXBwZXJzKCRfWzBdLCAnPHNwYW4gY2xhc3M9Im1pbWV0eXBlIj4nLCAnPC9zcGFuPicpOyB9Ci1zdWIgZG9fY21kX3ZhcnsKLSAgICByZXR1cm4gdXNlX3dyYXBwZXJzKCRfWzBdLCAiPHZhcj4iLCAiPC92YXI+Iik7IH0KLXN1YiBkb19jbWRfZGZuewotICAgIHJldHVybiB1c2Vfd3JhcHBlcnMoJF9bMF0sICc8aSBjbGFzcz0iZGZuIj4nLCAnPC9pPicpOyB9Ci1zdWIgZG9fY21kX2VtcGh7Ci0gICAgcmV0dXJuIHVzZV93cmFwcGVycygkX1swXSwgJzxlbT4nLCAnPC9lbT4nKTsgfQotc3ViIGRvX2NtZF9maWxlewotICAgIHJldHVybiB1c2Vfd3JhcHBlcnMoJF9bMF0sICc8c3BhbiBjbGFzcz0iZmlsZSI+JywgJzwvc3Bhbj4nKTsgfQotc3ViIGRvX2NtZF9maWxlbnF7Ci0gICAgcmV0dXJuIGRvX2NtZF9maWxlKCRfWzBdKTsgfQotc3ViIGRvX2NtZF9zYW1wewotICAgIHJldHVybiB1c2VfY29kZV93cmFwcGVycygkX1swXSwgJyI8dHQgY2xhc3M9InNhbXAiPicsICc8L3R0PiInKTsgfQotc3ViIGRvX2NtZF9rYmR7Ci0gICAgcmV0dXJuIHVzZV93cmFwcGVycygkX1swXSwgJzxrYmQ+JywgJzwva2JkPicpOyB9Ci1zdWIgZG9fY21kX3N0cm9uZ3sKLSAgICByZXR1cm4gdXNlX3dyYXBwZXJzKCRfWzBdLCAnPHN0cm9uZz4nLCAnPC9zdHJvbmc+Jyk7IH0KLXN1YiBkb19jbWRfdGV4dGJmewotICAgIHJldHVybiB1c2Vfd3JhcHBlcnMoJF9bMF0sICc8Yj4nLCAnPC9iPicpOyB9Ci1zdWIgZG9fY21kX3RleHRpdHsKLSAgICByZXR1cm4gdXNlX3dyYXBwZXJzKCRfWzBdLCAnPGk+JywgJzwvaT4nKTsgfQotIyBUaGlzIGNhbiBiZSBjaGFuZ2VkL292ZXJyaWRkZW4gZm9yIHRyYW5zbGF0aW9uczoKLSVOb3RpY2VOYW1lcyA9ICgnbm90ZScgPT4gJ05vdGU6JywKLSAgICAgICAgICAgICAgICAnd2FybmluZycgPT4gJ1dhcm5pbmc6JywKLSAgICAgICAgICAgICAgICApOwotCi1zdWIgZG9fY21kX25vdGV7Ci0gICAgbXkgJGxhYmVsID0gJE5vdGljZU5hbWVzeydub3RlJ307Ci0gICAgcmV0dXJuIHVzZV93cmFwcGVycygKLSAgICAgICAgJF9bMF0sCi0gICAgICAgICI8c3BhbiBjbGFzcz1cIm5vdGVcIj48YiBjbGFzcz1cImxhYmVsXCI+JGxhYmVsPC9iPlxuIiwKLSAgICAgICAgJzwvc3Bhbj4nKTsgfQotc3ViIGRvX2NtZF93YXJuaW5newotICAgIG15ICRsYWJlbCA9ICROb3RpY2VOYW1lc3snd2FybmluZyd9OwotICAgIHJldHVybiB1c2Vfd3JhcHBlcnMoCi0gICAgICAgICRfWzBdLAotICAgICAgICAiPHNwYW4gY2xhc3M9XCJ3YXJuaW5nXCI+PGIgY2xhc3M9XCJsYWJlbFwiPiRsYWJlbDwvYj5cbiIsCi0gICAgICAgICc8L3NwYW4+Jyk7IH0KLQotc3ViIGRvX2Vudl9ub3RpY2V7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbXkgJG5vdGljZSA9IG5leHRfb3B0aW9uYWxfYXJndW1lbnQoKTsKLSAgICBpZiAoISRub3RpY2UpIHsKLSAgICAgICAgJG5vdGljZSA9ICdub3RlJzsKLSAgICB9Ci0gICAgbXkgJGxhYmVsID0gJE5vdGljZU5hbWVzeyRub3RpY2V9OwotICAgIHJldHVybiAoIjxkaXYgY2xhc3M9XCIkbm90aWNlXCI+PGIgY2xhc3M9XCJsYWJlbFwiPiRsYWJlbDwvYj5cbiIKLSAgICAgICAgICAgIC4gJF8KLSAgICAgICAgICAgIC4gJzwvZGl2PicpOwotfQotCi1zdWIgZG9fY21kX21vcmVhcmdzewotICAgIHJldHVybiAnLi4uJyAuICRfWzBdOyB9Ci1zdWIgZG9fY21kX3Vuc3BlY2lmaWVkewotICAgIHJldHVybiAnLi4uJyAuICRfWzBdOyB9Ci0KLQotc3ViIGRvX2NtZF9yZWZtb2R1bGV7Ci0gICAgIyBJbnNlcnQgdGhlIHJpZ2h0IG1hZ2ljIHRvIGp1bXAgdG8gdGhlIG1vZHVsZSBkZWZpbml0aW9uLgotICAgIGxvY2FsKCRfKSA9IEBfOwotICAgIG15ICRrZXkgPSBuZXh0X29wdGlvbmFsX2FyZ3VtZW50KCk7Ci0gICAgbXkgJG1vZHVsZSA9IG5leHRfYXJndW1lbnQoKTsKLSAgICAka2V5ID0gJG1vZHVsZQotICAgICAgICB1bmxlc3MgJGtleTsKLSAgICByZXR1cm4gIjx0dCBjbGFzcz1cIm1vZHVsZVwiPjxhIGhyZWY9XCJtb2R1bGUtJGtleS5odG1sXCI+JG1vZHVsZTwvYT48L3R0PiIKLSAgICAgIC4gJF87Ci19Ci0KLXN1YiBkb19jbWRfbmV3c2dyb3VwewotICAgIGxvY2FsKCRfKSA9IEBfOwotICAgIG15ICRuZXdzZ3JvdXAgPSBuZXh0X2FyZ3VtZW50KCk7Ci0gICAgbXkgJGljb24gPSBnZXRfbGlua19pY29uKCJuZXdzOiRuZXdzZ3JvdXAiKTsKLSAgICBteSAkc3R1ZmYgPSAoIjxhIGNsYXNzPVwibmV3c2dyb3VwXCIgaHJlZj1cIm5ld3M6JG5ld3Nncm91cFwiPiIKLSAgICAgICAgICAgICAgICAgLiAiJG5ld3Nncm91cCRpY29uPC9hPiIpOwotICAgIHJldHVybiAkc3R1ZmYgLiAkXzsKLX0KLQotc3ViIGRvX2NtZF9lbnZ2YXJ7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbXkgJGVudnZhciA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSgkbmFtZSwgJGFuYW1lLCAkYWhyZWYpID0gbmV3X2xpbmtfaW5mbygpOwotICAgICMgVGhlIDx0dD4gaGVyZSBpcyByZWFsbHkgdG8ga2VlcCBidWlsZGluZGV4LnB5IGZyb20gbWFraW5nCi0gICAgIyB0aGUgdmFyaWFibGUgbmFtZSBjYXNlLWluc2Vuc2l0aXZlLgotICAgIGFkZF9pbmRleF9lbnRyeSgiZW52aXJvbm1lbnQgdmFyaWFibGVzISRlbnZ2YXJAPHR0PiRlbnZ2YXI8L3R0PiIsCi0gICAgICAgICAgICAgICAgICAgICRhaHJlZik7Ci0gICAgYWRkX2luZGV4X2VudHJ5KCIkZW52dmFyIChlbnZpcm9ubWVudCB2YXJpYWJsZSkiLCAkYWhyZWYpOwotICAgICRhbmFtZSA9fiBzLzxhLzxhIGNsYXNzPSJlbnZ2YXIiLzsKLSAgICByZXR1cm4gIiRhbmFtZSRlbnZ2YXI8L2E+IiAuICRfOwotfQotCi1zdWIgZG9fY21kX3VybHsKLSAgICAjIHVzZSB0aGUgVVJMIGFzIGJvdGggdGV4dCBhbmQgaHlwZXJsaW5rCi0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbXkgJHVybCA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkaWNvbiA9IGdldF9saW5rX2ljb24oJHVybCk7Ci0gICAgJHVybCA9fiBzL34vJiMxMjY7L2c7Ci0gICAgcmV0dXJuICI8YSBjbGFzcz1cInVybFwiIGhyZWY9XCIkdXJsXCI+JHVybCRpY29uPC9hPiIgLiAkXzsKLX0KLQotc3ViIGRvX2NtZF9tYW5wYWdlewotICAgICMgdHdvIHBhcmFtZXRlcnM6ICBcbWFucGFnZXtuYW1lfXtzZWN0aW9ufQotICAgIGxvY2FsKCRfKSA9IEBfOwotICAgIG15ICRwYWdlID0gbmV4dF9hcmd1bWVudCgpOwotICAgIG15ICRzZWN0aW9uID0gbmV4dF9hcmd1bWVudCgpOwotICAgIHJldHVybiAiPHNwYW4gY2xhc3M9XCJtYW5wYWdlXCI+PGk+JHBhZ2U8L2k+KCRzZWN0aW9uKTwvc3Bhbj4iIC4gJF87Ci19Ci0KLSRQRVBfRk9STUFUID0gImh0dHA6Ly93d3cucHl0aG9uLm9yZy9wZXBzL3BlcC0lMDRkLmh0bWwiOwotIyRSRkNfRk9STUFUID0gImh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYyUwNGQudHh0IjsKLSRSRkNfRk9STUFUID0gImh0dHA6Ly93d3cuZmFxcy5vcmcvcmZjcy9yZmMlZC5odG1sIjsKLQotc3ViIGdldF9yZmNfdXJsKCQkKXsKLSAgICBteSgkcmZjbnVtLCAkZm9ybWF0KSA9IEBfOwotICAgIHJldHVybiBzcHJpbnRmKCRmb3JtYXQsICRyZmNudW0pOwotfQotCi1zdWIgZG9fY21kX3BlcHsKLSAgICBsb2NhbCgkXykgPSBAXzsKLSAgICBteSAkcmZjbnVtYmVyID0gbmV4dF9hcmd1bWVudCgpOwotICAgIG15ICRpZCA9ICJyZmNyZWYtIiAuICsrJGdsb2JhbHsnbWF4X2lkJ307Ci0gICAgbXkgJGhyZWYgPSBnZXRfcmZjX3VybCgkcmZjbnVtYmVyLCAkUEVQX0ZPUk1BVCk7Ci0gICAgbXkgJGljb24gPSBnZXRfbGlua19pY29uKCRocmVmKTsKLSAgICAjIFNhdmUgdGhlIHJlZmVyZW5jZQotICAgIG15ICRuc3RyID0gZ2VuX2luZGV4X2lkKCJQeXRob24gRW5oYW5jZW1lbnQgUHJvcG9zYWxzIVBFUCAkcmZjbnVtYmVyIiwgJycpOwotICAgICRpbmRleHskbnN0cn0gLj0gbWFrZV9oYWxmX2hyZWYoIiRDVVJSRU5UX0ZJTEUjJGlkIik7Ci0gICAgcmV0dXJuICgiPGEgY2xhc3M9XCJyZmNcIiBpZD0nJGlkJyB4bWw6aWQ9JyRpZCdcbiIKLSAgICAgICAgICAgIC4gImhyZWY9XCIkaHJlZlwiPlBFUCAkcmZjbnVtYmVyJGljb248L2E+IiAuICRfKTsKLX0KLQotc3ViIGRvX2NtZF9yZmN7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbXkgJHJmY251bWJlciA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkaWQgPSAicmZjcmVmLSIgLiArKyRnbG9iYWx7J21heF9pZCd9OwotICAgIG15ICRocmVmID0gZ2V0X3JmY191cmwoJHJmY251bWJlciwgJFJGQ19GT1JNQVQpOwotICAgIG15ICRpY29uID0gZ2V0X2xpbmtfaWNvbigkaHJlZik7Ci0gICAgIyBTYXZlIHRoZSByZWZlcmVuY2UKLSAgICBteSAkbnN0ciA9IGdlbl9pbmRleF9pZCgiUkZDIVJGQyAkcmZjbnVtYmVyIiwgJycpOwotICAgICRpbmRleHskbnN0cn0gLj0gbWFrZV9oYWxmX2hyZWYoIiRDVVJSRU5UX0ZJTEUjJGlkIik7Ci0gICAgcmV0dXJuICgiPGEgY2xhc3M9XCJyZmNcIiBpZD0nJGlkJyB4bWw6aWQ9JyRpZCdcbmhyZWY9XCIkaHJlZlwiPiIKLSAgICAgICAgICAgIC4gIlJGQyAkcmZjbnVtYmVyJGljb248L2E+IiAuICRfKTsKLX0KLQotc3ViIGRvX2NtZF91bGlua3sKLSAgICBsb2NhbCgkXykgPSBAXzsKLSAgICBteSAkdGV4dCA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkdXJsID0gbmV4dF9hcmd1bWVudCgpOwotICAgIHJldHVybiAiPGEgY2xhc3M9XCJ1bGlua1wiIGhyZWY9XCIkdXJsXCJcbiAgPiR0ZXh0PC9hPiIgLiAkXzsKLX0KLQotc3ViIGRvX2NtZF9jaXRldGl0bGV7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbXkgJHVybCA9IG5leHRfb3B0aW9uYWxfYXJndW1lbnQoKTsKLSAgICBteSAkdGl0bGUgPSBuZXh0X2FyZ3VtZW50KCk7Ci0gICAgbXkgJGljb24gPSBnZXRfbGlua19pY29uKCR1cmwpOwotICAgIG15ICRyZXBsID0gJyc7Ci0gICAgaWYgKCR1cmwpIHsKLSAgICAgICAgbXkgJHRpdGxldGV4dCA9IHN0cmlwX2h0bWxfbWFya3VwKCIkdGl0bGUiKTsKLSAgICAgICAgJHJlcGwgPSAoIjxlbSBjbGFzcz1cImNpdGV0aXRsZVwiPjxhXG4iCi0gICAgICAgICAgICAgICAgIC4gIiBocmVmPVwiJHVybFwiXG4iCi0gICAgICAgICAgICAgICAgIC4gIiB0aXRsZT1cIiR0aXRsZXRleHRcIlxuIgotICAgICAgICAgICAgICAgICAuICIgPiR0aXRsZSRpY29uPC9hPjwvZW0+Iik7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAkcmVwbCA9ICI8ZW0gY2xhc3M9XCJjaXRldGl0bGVcIlxuID4kdGl0bGU8L2VtPiI7Ci0gICAgfQotICAgIHJldHVybiAkcmVwbCAuICRfOwotfQotCi1zdWIgZG9fY21kX2RlcHJlY2F0ZWR7Ci0gICAgIyB0d28gcGFyYW1ldGVyczogIFxkZXByZWNhdGVke3ZlcnNpb259e3doYXR0b2RvfQotICAgIGxvY2FsKCRfKSA9IEBfOwotICAgIG15ICRyZWxlYXNlID0gbmV4dF9hcmd1bWVudCgpOwotICAgIG15ICRyZWFzb24gPSBuZXh0X2FyZ3VtZW50KCk7Ci0gICAgcmV0dXJuICgnPGRpdiBjbGFzcz0idmVyc2lvbm5vdGUiPicKLSAgICAgICAgICAgIC4gIjxiPkRlcHJlY2F0ZWQgc2luY2UgcmVsZWFzZSAkcmVsZWFzZS48L2I+IgotICAgICAgICAgICAgLiAiXG4kcmVhc29uPC9kaXY+PHA+PC9wPiIKLSAgICAgICAgICAgIC4gJF8pOwotfQotCi1zdWIgdmVyc2lvbm5vdGUoJCQpewotICAgICMgb25lIG9yIHR3byBwYXJhbWV0ZXJzOiAgXHZlcnNpb25ub3RlW2V4cGxhbmF0aW9uXXt2ZXJzaW9ufQotICAgIG15ICR0eXBlID0gJF9bMF07Ci0gICAgbG9jYWwgJF8gPSAkX1sxXTsKLSAgICBteSAkZXhwbGFuYXRpb24gPSBuZXh0X29wdGlvbmFsX2FyZ3VtZW50KCk7Ci0gICAgbXkgJHJlbGVhc2UgPSBuZXh0X2FyZ3VtZW50KCk7Ci0gICAgbXkgJGNsYXNzZXMgPSAidmVyc2lvbm5vdGUiOwotICAgIGlmICgkcmVsZWFzZSA9fiAvXihcZCspXC4vKSB7Ci0gICAgICAgICRjbGFzc2VzIC49ICIgdmVyc2lvbm5vdGUkMSI7Ci0gICAgfQotICAgIG15ICR0ZXh0ID0gIiR0eXBlIGluIHZlcnNpb24gJHJlbGVhc2UuIjsKLSAgICBpZiAoJGV4cGxhbmF0aW9uKSB7Ci0gICAgICAgICR0ZXh0ID0gIiR0eXBlIGluIHZlcnNpb24gJHJlbGVhc2U6XG4kZXhwbGFuYXRpb24uIjsKLSAgICB9Ci0gICAgcmV0dXJuICJcbjxzcGFuIGNsYXNzPVwiJGNsYXNzZXNcIiAgXG4+JHRleHQ8L3NwYW4+XG4iIC4gJF87Ci19Ci0KLXN1YiBkb19jbWRfdmVyc2lvbmFkZGVkewotICAgIHJldHVybiB2ZXJzaW9ubm90ZSgnTmV3JywgJF9bMF0pOwotfQotCi1zdWIgZG9fY21kX3ZlcnNpb25jaGFuZ2VkewotICAgIHJldHVybiB2ZXJzaW9ubm90ZSgnQ2hhbmdlZCcsICRfWzBdKTsKLX0KLQotIwotIyBUaGVzZSBmdW5jdGlvbiBoYW5kbGUgcGxhdGZvcm0gZGVwZW5kZW5jeSB0cmFja2luZy4KLSMKLXN1YiBkb19jbWRfcGxhdGZvcm17Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbXkgJHBsYXRmb3JtID0gbmV4dF9hcmd1bWVudCgpOwotICAgICRNb2R1bGVQbGF0Zm9ybXN7Ijx0dCBjbGFzcz1cIm1vZHVsZVwiPiRUSElTX01PRFVMRTwvdHQ+In0gPSAkcGxhdGZvcm07Ci0gICAgJHBsYXRmb3JtID0gIk1hY2ludG9zaCIKLSAgICAgIGlmICRwbGF0Zm9ybSBlcSAnTWFjJzsKLSAgICByZXR1cm4gIlxuPHAgY2xhc3M9XCJhdmFpbGFiaWxpdHlcIj5BdmFpbGFiaWxpdHk6IDxzcGFuIgotICAgICAgLiAiXG4gY2xhc3M9XCJwbGF0Zm9ybVwiPiRwbGF0Zm9ybTwvc3Bhbj4uPC9wPlxuIiAuICRfOwotfQotCi0kSUdOT1JFX1BMQVRGT1JNX0FOTk9UQVRJT04gPSAnJzsKLXN1YiBkb19jbWRfaWdub3JlUGxhdGZvcm1Bbm5vdGF0aW9uewotICAgIGxvY2FsKCRfKSA9IEBfOwotICAgICRJR05PUkVfUExBVEZPUk1fQU5OT1RBVElPTiA9IG5leHRfYXJndW1lbnQoKTsKLSAgICByZXR1cm4gJF87Ci19Ci0KLQotIyBpbmRleCBjb21tYW5kcwotCi0kSU5ERVhfU1VCSVRFTSA9ICIiOwotCi1zdWIgZ2V0X2luZGV4c3ViaXRlbSgpewotICAgIHJldHVybiAkSU5ERVhfU1VCSVRFTSA/ICIgJElOREVYX1NVQklURU0iIDogJyc7Ci19Ci0KLXN1YiBkb19jbWRfc2V0aW5kZXhzdWJpdGVtewotICAgIGxvY2FsKCRfKSA9IEBfOwotICAgICRJTkRFWF9TVUJJVEVNID0gbmV4dF9hcmd1bWVudCgpOwotICAgIHJldHVybiAkXzsKLX0KLQotc3ViIGRvX2NtZF93aXRoc3ViaXRlbXsKLSAgICAjIFdlIGNhbid0IHJlYWxseSBkbyB0aGUgcmlnaHQgdGhpbmcsIGJlY2F1c2UgTGFUZVgySFRNTCBkb2Vzbid0Ci0gICAgIyBkbyB0aGluZ3MgaW4gdGhlIHJpZ2h0IG9yZGVyLCBidXQgd2UgbmVlZCB0byBhdCBsZWFzdCBzdHJpcCB0aGlzIHN0dWZmCi0gICAgIyBvdXQsIGFuZCBsZWF2ZSBhbnl0aGluZyB0aGF0IHRoZSBzZWNvbmQgYXJndW1lbnQgZXhwYW5kZWQgb3V0IHRvLgotICAgICMKLSAgICBsb2NhbCgkXykgPSBAXzsKLSAgICBteSAkb2xkc3ViaXRlbSA9ICRJTkRFWF9TVUJJVEVNOwotICAgICRJTkRFWF9TVUJJVEVNID0gbmV4dF9hcmd1bWVudCgpOwotICAgIG15ICRzdHVmZiA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkYnJfaWQgPSArKyRnbG9iYWxzeydtYXhfaWQnfTsKLSAgICBteSAkbWFya2VyID0gIiRPJGJyX2lkJEMiOwotICAgICRzdHVmZiA9fiBzL15ccysvLzsKLSAgICByZXR1cm4KLSAgICAgICRzdHVmZgotICAgICAgLiAiXFxzZXRpbmRleHN1Yml0ZW0kbWFya2VyJG9sZHN1Yml0ZW0kbWFya2VyIgotICAgICAgLiAkXzsKLX0KLQotIyBUaGlzIGlzIHRoZSBwcm9sb2d1ZSBtYWNybyB3aGljaCBpcyByZXF1aXJlZCB0byBzdGFydCB3cml0aW5nIHRoZQotIyBtb2Rcam9ibmFtZS5pZHggZmlsZTsgd2UgY2FuIGp1c3QgaWdub3JlIGl0LiAgKERlZmluaW5nIHRoaXMgc3VwcHJlc3NlcwotIyBhIHdhcm5pbmcgdGhhdCBcbWFrZW1vZGluZGV4IGlzIHVua25vd24uKQotIwotc3ViIGRvX2NtZF9tYWtlbW9kaW5kZXh7IHJldHVybiAkX1swXTsgfQotCi0jIFdlJ3JlIGluIHRoZSBkb2N1bWVudCBzdWJkaXJlY3Rvcnkgd2hlbiB0aGlzIGhhcHBlbnMhCi0jCi1vcGVuKElEWEZJTEUsICc+aW5kZXguZGF0JykgfHwgZGllICJcbiQhXG4iOwotb3BlbihJTlRMQUJFTFMsICc+aW50bGFiZWxzLnBsJykgfHwgZGllICJcbiQhXG4iOwotcHJpbnQgSU5UTEFCRUxTICIlaW50ZXJuYWxfbGFiZWxzID0gKCk7XG4iOwotcHJpbnQgSU5UTEFCRUxTICIxOyAgICAgICAgICAgICAjIGhhY2sgaW4gY2FzZSB0aGVyZSBhcmUgbm8gZW50cmllc1xuXG4iOwotCi0jIFVzaW5nIFwwIGZvciB0aGlzIGlzIGJhZCBiZWNhdXNlIHdlIGNhbid0IHVzZSBjb21tb24gdG9vbHMgdG8gd29yayB3aXRoIHRoZQotIyByZXN1bHRpbmcgZmlsZXMuICBUaGluZ3MgbGlrZSBncmVwIGNhbiBiZSB1c2VmdWwgd2l0aCB0aGlzIHN0dWZmIQotIwotJElEWEZJTEVfRklFTERfU0VQID0gIlwxIjsKLQotc3ViIHdyaXRlX2lkeGZpbGUoJCQpewotICAgIG15KCRhaHJlZiwgJHN0cikgPSBAXzsKLSAgICBwcmludCBJRFhGSUxFICRhaHJlZiwgJElEWEZJTEVfRklFTERfU0VQLCAkc3RyLCAiXG4iOwotfQotCi0KLXN1YiBnZW5fbGluaygkJCl7Ci0gICAgbXkoJG5vZGUsICR0YXJnZXQpID0gQF87Ci0gICAgcHJpbnQgSU5UTEFCRUxTICJcJGludGVybmFsX2xhYmVsc3tcIiR0YXJnZXRcIn0gPSBcIi8kbm9kZVwiO1xuIjsKLSAgICByZXR1cm4gIjxhIGhyZWY9XCIkbm9kZSMkdGFyZ2V0XCI+IjsKLX0KLQotc3ViIGFkZF9pbmRleF9lbnRyeSgkJCl7Ci0gICAgIyBhZGQgYW4gZW50cnkgdG8gdGhlIGluZGV4IHN0cnVjdHVyZXM7IGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlCi0gICAgbXkoJHN0ciwgJGFocmVmKSA9IEBfOwotICAgICRzdHIgPSBnZW5faW5kZXhfaWQoJHN0ciwgJycpOwotICAgICRpbmRleHskc3RyfSAuPSAkYWhyZWY7Ci0gICAgd3JpdGVfaWR4ZmlsZSgkYWhyZWYsICRzdHIpOwotfQotCi1zdWIgbmV3X2xpbmtfbmFtZV9pbmZvKCl7Ci0gICAgbXkgJG5hbWUgPSAibDJoLSIgLiArKyRnbG9iYWxzeydtYXhfaWQnfTsKLSAgICBteSAkYWhyZWYgPSBnZW5fbGluaygkQ1VSUkVOVF9GSUxFLCAkbmFtZSk7Ci0gICAgcmV0dXJuICgkbmFtZSwgJGFocmVmKTsKLX0KLQotc3ViIG5ld19saW5rX2luZm8oKXsKLSAgICBteSgkbmFtZSwgJGFocmVmKSA9IG5ld19saW5rX25hbWVfaW5mbygpOwotICAgIG15ICRhbmFtZSA9ICI8YSBpZD0nJG5hbWUnIHhtbDppZD0nJG5hbWUnPiI7Ci0gICAgcmV0dXJuICgkbmFtZSwgJGFuYW1lLCAkYWhyZWYpOwotfQotCi0kSW5kZXhNYWNyb1BhdHRlcm4gPSAnJzsKLXN1YiBkZWZpbmVfaW5kZXhpbmdfbWFjcm8oQCl7Ci0gICAgbXkgJGNvdW50ID0gQF87Ci0gICAgbXkgJGkgPSAwOwotICAgIGZvciAoOyAkaSA8ICRjb3VudDsgKyskaSkgewotICAgICAgICBteSAkbmFtZSA9ICRfWyRpXTsKLSAgICAgICAgbXkgJGNtZCA9ICJpZHhfY21kXyRuYW1lIjsKLSAgICAgICAgZGllICJcbk5vIGZ1bmN0aW9uICRjbWQoKSBkZWZpbmVkIVxuIgotICAgICAgICAgIGlmICghZGVmaW5lZCAmJGNtZCk7Ci0gICAgICAgIGV2YWwgKCJzdWIgZG9fY21kXyRuYW1lIHsgcmV0dXJuIHByb2Nlc3NfaW5kZXhfbWFjcm9zKCIKLSAgICAgICAgICAgICAgLiAiXCRfWzBdLCAnJG5hbWUnKTsgfSIpOwotICAgICAgICBpZiAobGVuZ3RoKCRJbmRleE1hY3JvUGF0dGVybikgPT0gMCkgewotICAgICAgICAgICAgJEluZGV4TWFjcm9QYXR0ZXJuID0gIiRuYW1lIjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICRJbmRleE1hY3JvUGF0dGVybiAuPSAifCRuYW1lIjsKLSAgICAgICAgfQotICAgIH0KLX0KLQotJERFQlVHX0lOREVYSU5HID0gMDsKLXN1YiBwcm9jZXNzX2luZGV4X21hY3JvcygkJCl7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbXkgJGNtZG5hbWUgPSAkX1sxXTsgICAgICAgICMgVGhpcyBpcyB3aGF0IHRyaWdnZXJlZCB1cyBpbiB0aGUgZmlyc3QgcGxhY2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd2Uga25vdyBpdCdzIHJlYWwsIHNvIGp1c3QgcHJvY2VzcyBpdC4KLSAgICBteSgkbmFtZSwgJGFuYW1lLCAkYWhyZWYpID0gbmV3X2xpbmtfaW5mbygpOwotICAgIG15ICRjbWQgPSAiaWR4X2NtZF8kY21kbmFtZSI7Ci0gICAgcHJpbnQgIlxuSW5kZXhpbmc6IFxcJGNtZG5hbWUiCi0gICAgICBpZiAkREVCVUdfSU5ERVhJTkc7Ci0gICAgJiRjbWQoJGFocmVmKTsgICAgICAgICAgICAgICMgbW9kaWZpZXMgJF8gYW5kIGFkZHMgaW5kZXggZW50cmllcwotICAgIHdoaWxlICgvXltcc1xuXSpcXCgkSW5kZXhNYWNyb1BhdHRlcm4pPC8pIHsKLSAgICAgICAgJGNtZG5hbWUgPSAiJDEiOwotICAgICAgICBwcmludCAiIFxcJGNtZG5hbWUiCi0gICAgICAgICAgaWYgJERFQlVHX0lOREVYSU5HOwotICAgICAgICAkY21kID0gImlkeF9jbWRfJGNtZG5hbWUiOwotICAgICAgICBpZiAoIWRlZmluZWQgJiRjbWQpIHsKLSAgICAgICAgICAgIGxhc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBzL15bXHNcbl0qXFwkY21kbmFtZS8vOwotICAgICAgICAgICAgJiRjbWQoJGFocmVmKTsKLSAgICAgICAgfQotICAgIH0KLSMgWFhYIEkgZG9uJ3QgcmVtZW1iZXIgd2h5IEkgYWRkZWQgdGhpcyB0byBiZWdpbiB3aXRoLgotIyAgICAgaWYgKC9eWyBcdFxyXG5dLykgewotIyAgICAgICAgICRfID0gc3Vic3RyKCRfLCAxKTsKLSMgICAgIH0KLSAgICByZXR1cm4gIiRhbmFtZSRhbmNob3JfaW52aXNpYmxlX21hcms8L2E+IiAuICRfOwotfQotCi1kZWZpbmVfaW5kZXhpbmdfbWFjcm8oJ2luZGV4Jyk7Ci1zdWIgaWR4X2NtZF9pbmRleCgkKXsKLSAgICBteSAkc3RyID0gbmV4dF9hcmd1bWVudCgpOwotICAgIGFkZF9pbmRleF9lbnRyeSgiJHN0ciIsICRfWzBdKTsKLX0KLQotZGVmaW5lX2luZGV4aW5nX21hY3JvKCdrd2luZGV4Jyk7Ci1zdWIgaWR4X2NtZF9rd2luZGV4KCQpewotICAgIG15ICRzdHIgPSBuZXh0X2FyZ3VtZW50KCk7Ci0gICAgYWRkX2luZGV4X2VudHJ5KCI8dHQ+JHN0cjwvdHQ+IWtleXdvcmQiLCAkX1swXSk7Ci0gICAgYWRkX2luZGV4X2VudHJ5KCJrZXl3b3JkITx0dD4kc3RyPC90dD4iLCAkX1swXSk7Ci19Ci0KLWRlZmluZV9pbmRleGluZ19tYWNybygnaW5kZXhpaScpOwotc3ViIGlkeF9jbWRfaW5kZXhpaSgkKXsKLSAgICBteSAkc3RyMSA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkc3RyMiA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBhZGRfaW5kZXhfZW50cnkoIiRzdHIxISRzdHIyIiwgJF9bMF0pOwotICAgIGFkZF9pbmRleF9lbnRyeSgiJHN0cjIhJHN0cjEiLCAkX1swXSk7Ci19Ci0KLWRlZmluZV9pbmRleGluZ19tYWNybygnaW5kZXhpaWknKTsKLXN1YiBpZHhfY21kX2luZGV4aWlpKCQpewotICAgIG15ICRzdHIxID0gbmV4dF9hcmd1bWVudCgpOwotICAgIG15ICRzdHIyID0gbmV4dF9hcmd1bWVudCgpOwotICAgIG15ICRzdHIzID0gbmV4dF9hcmd1bWVudCgpOwotICAgIGFkZF9pbmRleF9lbnRyeSgiJHN0cjEhJHN0cjIgJHN0cjMiLCAkX1swXSk7Ci0gICAgYWRkX2luZGV4X2VudHJ5KCIkc3RyMiEkc3RyMywgJHN0cjEiLCAkX1swXSk7Ci0gICAgYWRkX2luZGV4X2VudHJ5KCIkc3RyMyEkc3RyMSAkc3RyMiIsICRfWzBdKTsKLX0KLQotZGVmaW5lX2luZGV4aW5nX21hY3JvKCdpbmRleGl2Jyk7Ci1zdWIgaWR4X2NtZF9pbmRleGl2KCQpewotICAgIG15ICRzdHIxID0gbmV4dF9hcmd1bWVudCgpOwotICAgIG15ICRzdHIyID0gbmV4dF9hcmd1bWVudCgpOwotICAgIG15ICRzdHIzID0gbmV4dF9hcmd1bWVudCgpOwotICAgIG15ICRzdHI0ID0gbmV4dF9hcmd1bWVudCgpOwotICAgIGFkZF9pbmRleF9lbnRyeSgiJHN0cjEhJHN0cjIgJHN0cjMgJHN0cjQiLCAkX1swXSk7Ci0gICAgYWRkX2luZGV4X2VudHJ5KCIkc3RyMiEkc3RyMyAkc3RyNCwgJHN0cjEiLCAkX1swXSk7Ci0gICAgYWRkX2luZGV4X2VudHJ5KCIkc3RyMyEkc3RyNCwgJHN0cjEgJHN0cjIiLCAkX1swXSk7Ci0gICAgYWRkX2luZGV4X2VudHJ5KCIkc3RyNCEkc3RyMSAkc3RyMiAkc3RyMyIsICRfWzBdKTsKLX0KLQotZGVmaW5lX2luZGV4aW5nX21hY3JvKCd0dGluZGV4Jyk7Ci1zdWIgaWR4X2NtZF90dGluZGV4KCQpewotICAgIG15ICRzdHIgPSBjb2RldGV4dChuZXh0X2FyZ3VtZW50KCkpOwotICAgIG15ICRlbnRyeSA9ICRzdHIgLiBnZXRfaW5kZXhzdWJpdGVtKCk7Ci0gICAgYWRkX2luZGV4X2VudHJ5KCRlbnRyeSwgJF9bMF0pOwotfQotCi1zdWIgbXlfdHlwZWRfaW5kZXhfaGVscGVyKCQkKXsKLSAgICBteSgkd29yZCwgJGFocmVmKSA9IEBfOwotICAgIG15ICRzdHIgPSBuZXh0X2FyZ3VtZW50KCk7Ci0gICAgYWRkX2luZGV4X2VudHJ5KCIkc3RyICR3b3JkIiwgJGFocmVmKTsKLSAgICBhZGRfaW5kZXhfZW50cnkoIiR3b3JkISRzdHIiLCAkYWhyZWYpOwotfQotCi1kZWZpbmVfaW5kZXhpbmdfbWFjcm8oJ3N0aW5kZXgnLCAnb3BpbmRleCcsICdleGluZGV4JywgJ29iaW5kZXgnKTsKLXN1YiBpZHhfY21kX3N0aW5kZXgoJCl7IG15X3R5cGVkX2luZGV4X2hlbHBlcignc3RhdGVtZW50JywgJF9bMF0pOyB9Ci1zdWIgaWR4X2NtZF9vcGluZGV4KCQpeyBteV90eXBlZF9pbmRleF9oZWxwZXIoJ29wZXJhdG9yJywgJF9bMF0pOyB9Ci1zdWIgaWR4X2NtZF9leGluZGV4KCQpeyBteV90eXBlZF9pbmRleF9oZWxwZXIoJ2V4Y2VwdGlvbicsICRfWzBdKTsgfQotc3ViIGlkeF9jbWRfb2JpbmRleCgkKXsgbXlfdHlwZWRfaW5kZXhfaGVscGVyKCdvYmplY3QnLCAkX1swXSk7IH0KLQotZGVmaW5lX2luZGV4aW5nX21hY3JvKCdiaWZ1bmNpbmRleCcpOwotc3ViIGlkeF9jbWRfYmlmdW5jaW5kZXgoJCl7Ci0gICAgbXkgJHN0ciA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBhZGRfaW5kZXhfZW50cnkoIjx0dCBjbGFzcz1cImZ1bmN0aW9uXCI+JHN0cigpPC90dD4gKGJ1aWx0LWluIGZ1bmN0aW9uKSIsCi0gICAgICAgICAgICAgICAgICAgICRfWzBdKTsKLX0KLQotCi1zdWIgbWFrZV9tb2RfaW5kZXhfZW50cnkoJCQpewotICAgIG15KCRzdHIsICRkZWZpbmUpID0gQF87Ci0gICAgbXkoJG5hbWUsICRhbmFtZSwgJGFocmVmKSA9IG5ld19saW5rX2luZm8oKTsKLSAgICAjIGVxdWl2YWxlbnQgb2YgYWRkX2luZGV4X2VudHJ5KCkgdXNpbmcgJGRlZmluZSBpbnN0ZWFkIG9mICcnCi0gICAgJGFocmVmID1+IHMvXCNbLV9hLXpBLVowLTldKlwiL1wiLwotICAgICAgaWYgKCRkZWZpbmUgZXEgJ0RFRicpOwotICAgICRzdHIgPSBnZW5faW5kZXhfaWQoJHN0ciwgJGRlZmluZSk7Ci0gICAgJGluZGV4eyRzdHJ9IC49ICRhaHJlZjsKLSAgICB3cml0ZV9pZHhmaWxlKCRhaHJlZiwgJHN0cik7Ci0KLSAgICBpZiAoJGRlZmluZSBlcSAnREVGJykgewotICAgICAgICAjIGFkZCB0byB0aGUgbW9kdWxlIGluZGV4Ci0gICAgICAgICRzdHIgPX4gLyg8dHQuKjxcL3R0PikvOwotICAgICAgICBteSAkbnN0ciA9ICQxOwotICAgICAgICAkTW9kdWxlc3skbnN0cn0gLj0gJGFocmVmOwotICAgIH0KLSAgICByZXR1cm4gIiRhbmFtZSRhbmNob3JfaW52aXNpYmxlX21hcmsyPC9hPiI7Ci19Ci0KLQotJFRISVNfTU9EVUxFID0gJyc7Ci0kVEhJU19DTEFTUyA9ICcnOwotCi1zdWIgZGVmaW5lX21vZHVsZSgkJCl7Ci0gICAgbXkoJHdvcmQsICRuYW1lKSA9IEBfOwotICAgIG15ICRzZWN0aW9uX3RhZyA9IGpvaW4oJycsIEBjdXJyX3NlY19pZCk7Ci0gICAgaWYgKCR3b3JkIG5lICJidWlsdC1pbiIgJiYgJHdvcmQgbmUgImV4dGVuc2lvbiIKLSAgICAgICAgJiYgJHdvcmQgbmUgInN0YW5kYXJkIiAmJiAkd29yZCBuZSAiIikgewotICAgICAgICB3cml0ZV93YXJuaW5ncygiQmFkIG1vZHVsZSB0eXBlICckd29yZCciCi0gICAgICAgICAgICAgICAgICAgICAgIC4gIiBmb3IgXFxkZWNsYXJlbW9kdWxlIChtb2R1bGUgJG5hbWUpIik7Ci0gICAgICAgICR3b3JkID0gIiI7Ci0gICAgfQotICAgICR3b3JkID0gIiR3b3JkICIgaWYgJHdvcmQ7Ci0gICAgJFRISVNfTU9EVUxFID0gIiRuYW1lIjsKLSAgICAkSU5ERVhfU1VCSVRFTSA9ICIoaW4gbW9kdWxlICRuYW1lKSI7Ci0gICAgcHJpbnQgIlskbmFtZV0iOwotICAgIHJldHVybiBtYWtlX21vZF9pbmRleF9lbnRyeSgKLSAgICAgICAgIjx0dCBjbGFzcz1cIm1vZHVsZVwiPiRuYW1lPC90dD4gKCR7d29yZH1tb2R1bGUpIiwgJ0RFRicpOwotfQotCi1zdWIgbXlfbW9kdWxlX2luZGV4X2hlbHBlcigkJCl7Ci0gICAgbG9jYWwoJHdvcmQsICRfKSA9IEBfOwotICAgIG15ICRuYW1lID0gbmV4dF9hcmd1bWVudCgpOwotICAgIHJldHVybiBkZWZpbmVfbW9kdWxlKCR3b3JkLCAkbmFtZSkgLiAkXzsKLX0KLQotc3ViIGRvX2NtZF9tb2RpbmRleHsgcmV0dXJuIG15X21vZHVsZV9pbmRleF9oZWxwZXIoJycsICRfWzBdKTsgfQotc3ViIGRvX2NtZF9iaW1vZGluZGV4eyByZXR1cm4gbXlfbW9kdWxlX2luZGV4X2hlbHBlcignYnVpbHQtaW4nLCAkX1swXSk7IH0KLXN1YiBkb19jbWRfZXhtb2RpbmRleHsgcmV0dXJuIG15X21vZHVsZV9pbmRleF9oZWxwZXIoJ2V4dGVuc2lvbicsICRfWzBdKTsgfQotc3ViIGRvX2NtZF9zdG1vZGluZGV4eyByZXR1cm4gbXlfbW9kdWxlX2luZGV4X2hlbHBlcignc3RhbmRhcmQnLCAkX1swXSk7IH0KLSMgICAgIGxvY2FsKCRfKSA9IEBfOwotIyAgICAgbXkgJG5hbWUgPSBuZXh0X2FyZ3VtZW50KCk7Ci0jICAgICByZXR1cm4gZGVmaW5lX21vZHVsZSgnc3RhbmRhcmQnLCAkbmFtZSkgLiAkXzsKLSMgfQotCi1zdWIgcmVmX21vZHVsZV9pbmRleF9oZWxwZXIoJCQpewotICAgIG15KCR3b3JkLCAkYWhyZWYpID0gQF87Ci0gICAgbXkgJHN0ciA9IG5leHRfYXJndW1lbnQoKTsKLSAgICAkd29yZCA9ICIkd29yZCAiIGlmICR3b3JkOwotICAgICRzdHIgPSAiPHR0IGNsYXNzPVwibW9kdWxlXCI+JHN0cjwvdHQ+ICgke3dvcmR9bW9kdWxlKSI7Ci0gICAgIyBjYW4ndCB1c2UgYWRkX2luZGV4X2VudHJ5KCkgc2luY2UgdGhlIDJuZCBhcmcgdG8gZ2VuX2luZGV4X2lkKCkgaXMgdXNlZDsKLSAgICAjIGp1c3QgaW5saW5lIGl0IGFsbCBoZXJlCi0gICAgJHN0ciA9IGdlbl9pbmRleF9pZCgkc3RyLCAnUkVGJyk7Ci0gICAgJGluZGV4eyRzdHJ9IC49ICRhaHJlZjsKLSAgICB3cml0ZV9pZHhmaWxlKCRhaHJlZiwgJHN0cik7Ci19Ci0KLSMgdGhlc2Ugc2hvdWxkIGJlIGFkanVzdGVkIGEgYml0Li4uLgotZGVmaW5lX2luZGV4aW5nX21hY3JvKCdyZWZtb2RpbmRleCcsICdyZWZiaW1vZGluZGV4JywKLSAgICAgICAgICAgICAgICAgICAgICAncmVmZXhtb2RpbmRleCcsICdyZWZzdG1vZGluZGV4Jyk7Ci1zdWIgaWR4X2NtZF9yZWZtb2RpbmRleCgkKXsKLSAgICByZXR1cm4gcmVmX21vZHVsZV9pbmRleF9oZWxwZXIoJycsICRfWzBdKTsgfQotc3ViIGlkeF9jbWRfcmVmYmltb2RpbmRleCgkKXsKLSAgICByZXR1cm4gcmVmX21vZHVsZV9pbmRleF9oZWxwZXIoJ2J1aWx0LWluJywgJF9bMF0pOyB9Ci1zdWIgaWR4X2NtZF9yZWZleG1vZGluZGV4KCQpewotICAgIHJldHVybiByZWZfbW9kdWxlX2luZGV4X2hlbHBlcignZXh0ZW5zaW9uJywgJF9bMF0pO30KLXN1YiBpZHhfY21kX3JlZnN0bW9kaW5kZXgoJCl7Ci0gICAgcmV0dXJuIHJlZl9tb2R1bGVfaW5kZXhfaGVscGVyKCdzdGFuZGFyZCcsICRfWzBdKTsgfQotCi1zdWIgZG9fY21kX25vZGVuYW1leyByZXR1cm4gZG9fY21kX2xhYmVsKCRfWzBdKTsgfQotCi1zdWIgaW5pdF9teWZvcm1hdCgpewotICAgICMgVGhpcyBkZXBlbmRzIG9uIHRoZSBvdmVycmlkZSBvZiB0ZXh0X2NsZWFudXAoKSBpbiBsMmhpbml0LnBlcmw7Ci0gICAgIyBpZiB0aGF0IGZ1bmN0aW9uIGNsZWFucyBvdXQgZW1wdHkgdGFncywgdGhlIGZpcnN0IHRocmVlIG9mIHRoZXNlCi0gICAgIyB2YXJpYWJsZXMgbXVzdCBiZSBzZXQgdG8gY29tbWVudHMuCi0gICAgIwotICAgICMgVGhhbmtzIHRvIERhdmUgS3VobG1hbiBmb3IgZmlndXJpbmcgd2h5IHNvbWUgbmFtZWQgYW5jaG9ycyB3ZXJlCi0gICAgIyBiZWluZyBsb3N0LgotICAgICRhbmNob3JfaW52aXNpYmxlX21hcmsgPSAnJzsKLSAgICAkYW5jaG9yX2ludmlzaWJsZV9tYXJrMiA9ICcnOwotICAgICRhbmNob3JfbWFyayA9ICcnOwotICAgICRpY29uc3snYW5jaG9yX21hcmsnfSA9ICcnOwotfQotaW5pdF9teWZvcm1hdCgpOwotCi0jIENyZWF0ZSBhbiBpbmRleCBlbnRyeSwgYnV0IGluY2x1ZGUgdGhlIHN0cmluZyBpbiB0aGUgdGFyZ2V0IGFuY2hvcgotIyBpbnN0ZWFkIG9mIHRoZSBkdW1teSBmaWxsZXIuCi0jCi1zdWIgbWFrZV9zdHJfaW5kZXhfZW50cnkoJCl7Ci0gICAgbXkgJHN0ciA9ICRfWzBdOwotICAgIG15KCRuYW1lLCAkYWhyZWYpID0gbmV3X2xpbmtfbmFtZV9pbmZvKCk7Ci0gICAgYWRkX2luZGV4X2VudHJ5KCRzdHIsICRhaHJlZik7Ci0gICAgaWYgKCRzdHIgPX4gL148W2Etel0rXGIvKSB7Ci0gICAgICAgIG15ICRzID0gIiRzdHIiOwotICAgICAgICAkcyA9fiBzL148KFthLXpdKylcYi88JDEgaWQ9JyRuYW1lJyB4bWw6aWQ9JyRuYW1lJy87Ci0gICAgICAgIHJldHVybiAkczsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHJldHVybiAiPGEgaWQ9JyRuYW1lJyB4bWw6aWQ9JyRuYW1lJz4kc3RyPC9hPiI7Ci0gICAgfQotfQotCi0KLSVUb2tlblRvVGFyZ2V0TWFwcGluZyA9ICgpOyAgICAgIyBsYW5ndWFnZTp0b2tlbiAtPiBsaW5rIHRhcmdldAotJURlZmluZWRHcmFtbWFycyA9ICgpOyAgICAgICAgICAjIGxhbmd1YWdlIC0+IGZ1bGwgZ3JhbW1hciB0ZXh0Ci0lQmFja3BhdGNoR3JhbW1hckZpbGVzID0gKCk7ICAgICMgZmlsZSAtPiAxIChoYXNoIG9mIGZpbGVzIHRvIGZpeHVwKQotCi1zdWIgZG9fY21kX3Rva2VuewotICAgIGxvY2FsKCRfKSA9IEBfOwotICAgIG15ICR0b2tlbiA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkdGFyZ2V0ID0gJFRva2VuVG9UYXJnZXRNYXBwaW5neyIkQ1VSUkVOVF9HUkFNTUFSOiR0b2tlbiJ9OwotICAgIGlmICgkdG9rZW4gZXEgJENVUlJFTlRfVE9LRU4gfHwgJENVUlJFTlRfR1JBTU1BUiBlcSAnKicpIHsKLSAgICAgICAgIyByZWN1cnNpdmUgZGVmaW5pdGlvbiBvciBkaXNwbGF5LW9ubHkgcHJvZHVjdGlvbmxpc3QKLSAgICAgICAgcmV0dXJuICIkdG9rZW4iOwotICAgIH0KLSAgICBpZiAoJHRhcmdldCBlcSAnJykgewotICAgICAgICAkdGFyZ2V0ID0gIjxweUdyYW1tYXJUb2tlbj48JENVUlJFTlRfR1JBTU1BUj48JHRva2VuPiI7Ci0gICAgICAgIGlmICghICRCYWNrcGF0Y2hHcmFtbWFyRmlsZXN7IiRDVVJSRU5UX0ZJTEUifSkgewotICAgICAgICAgICAgcHJpbnQgIkFkZGluZyAnJENVUlJFTlRfRklMRScgdG8gYmFjay1wYXRjaCBsaXN0LlxuIjsKLSAgICAgICAgfQotICAgICAgICAkQmFja3BhdGNoR3JhbW1hckZpbGVzeyIkQ1VSUkVOVF9GSUxFIn0gPSAxOwotICAgIH0KLSAgICByZXR1cm4gIjxhIGNsYXNzPSdncmFtbWFydG9rZW4nIGhyZWY9XCIkdGFyZ2V0XCI+JHRva2VuPC9hPiIgLiAkXzsKLX0KLQotc3ViIGRvX2NtZF9ncmFtbWFydG9rZW57Ci0gICAgcmV0dXJuIGRvX2NtZF90b2tlbihAXyk7Ci19Ci0KLXN1YiBkb19lbnZfcHJvZHVjdGlvbmxpc3R7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbXkgJGxhbmcgPSBuZXh0X29wdGlvbmFsX2FyZ3VtZW50KCk7Ci0gICAgbXkgJGZpbGVuYW1lID0gImdyYW1tYXItJGxhbmcudHh0IjsKLSAgICBpZiAoJGxhbmcgZXEgJycpIHsKLSAgICAgICAgJGZpbGVuYW1lID0gJ2dyYW1tYXIudHh0JzsKLSAgICB9Ci0gICAgbG9jYWwoJENVUlJFTlRfR1JBTU1BUikgPSAkbGFuZzsKLSAgICAkRGVmaW5lZEdyYW1tYXJzeyRsYW5nfSAuPSAkXzsKLSAgICByZXR1cm4gKCI8ZGw+PGRkIGNsYXNzPVwiZ3JhbW1hclwiPlxuIgotICAgICAgICAgICAgLiAiPGRpdiBjbGFzcz1cInByb2R1Y3Rpb25zXCI+XG4iCi0gICAgICAgICAgICAuICI8dGFibGU+XG4iCi0gICAgICAgICAgICAuIHRyYW5zbGF0ZV9jb21tYW5kcyh0cmFuc2xhdGVfZW52aXJvbm1lbnRzKCRfKSkKLSAgICAgICAgICAgIC4gIjwvdGFibGU+XG4iCi0gICAgICAgICAgICAuICI8L2Rpdj5cbiIKLSAgICAgICAgICAgIC4gKCgkbGFuZyBlcSAnKicpCi0gICAgICAgICAgICAgICA/ICcnCi0gICAgICAgICAgICAgICA6ICgiPGEgY2xhc3M9XCJncmFtbWFyLWZvb3RlclwiXG4iCi0gICAgICAgICAgICAgICAgICAuICIgIGhyZWY9XCIkZmlsZW5hbWVcIiB0eXBlPVwidGV4dC9wbGFpblwiXG4iCi0gICAgICAgICAgICAgICAgICAuICIgID5Eb3dubG9hZCBlbnRpcmUgZ3JhbW1hciBhcyB0ZXh0LjwvYT5cbiIpKQotICAgICAgICAgICAgLiAiPC9kZD48L2RsPiIpOwotfQotCi1zdWIgZG9fY21kX3Byb2R1Y3Rpb257Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbXkgJHRva2VuID0gbmV4dF9hcmd1bWVudCgpOwotICAgIG15ICRkZWZuID0gbmV4dF9hcmd1bWVudCgpOwotICAgIG15ICRsYW5nID0gJENVUlJFTlRfR1JBTU1BUjsKLSAgICBsb2NhbCgkQ1VSUkVOVF9UT0tFTikgPSAkdG9rZW47Ci0gICAgaWYgKCRsYW5nIGVxICcqJykgewotICAgICAgICByZXR1cm4gKCI8dHI+XG4iCi0gICAgICAgICAgICAgICAgLiAiICAgIDx0ZD4kdG9rZW48L3RkPlxuIgotICAgICAgICAgICAgICAgIC4gIiAgICA8dGQ+Ojo9PC90ZD5cbiIKLSAgICAgICAgICAgICAgICAuICIgICAgPHRkPiIKLSAgICAgICAgICAgICAgICAuIHRyYW5zbGF0ZV9jb21tYW5kcygkZGVmbikKLSAgICAgICAgICAgICAgICAuICI8L3RkPjwvdHI+IgotICAgICAgICAgICAgICAgIC4gJF8pOwotICAgIH0KLSAgICBteSAkdGFyZ2V0OwotICAgIGlmICgkbGFuZyBlcSAnJykgewotICAgICAgICAkdGFyZ2V0ID0gIiRDVVJSRU5UX0ZJTEVcI3Rvay0kdG9rZW4iOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgJHRhcmdldCA9ICIkQ1VSUkVOVF9GSUxFXCN0b2stJGxhbmctJHRva2VuIjsKLSAgICB9Ci0gICAgJFRva2VuVG9UYXJnZXRNYXBwaW5neyIkQ1VSUkVOVF9HUkFNTUFSOiR0b2tlbiJ9ID0gJHRhcmdldDsKLSAgICByZXR1cm4gKCI8dHI+XG4iCi0gICAgICAgICAgICAuICIgICAgPHRkPjxhIGlkPSd0b2stJHRva2VuJyB4bWw6aWQ9J3Rvay0kdG9rZW4nPiIKLSAgICAgICAgICAgIC4gIiR0b2tlbjwvYT48L3RkPlxuIgotICAgICAgICAgICAgLiAiICAgIDx0ZD46Oj08L3RkPlxuIgotICAgICAgICAgICAgLiAiICAgIDx0ZD4iCi0gICAgICAgICAgICAuIHRyYW5zbGF0ZV9jb21tYW5kcygkZGVmbikKLSAgICAgICAgICAgIC4gIjwvdGQ+PC90cj4iCi0gICAgICAgICAgICAuICRfKTsKLX0KLQotc3ViIGRvX2NtZF9wcm9kdWN0aW9uY29udHsKLSAgICBsb2NhbCgkXykgPSBAXzsKLSAgICBteSAkZGVmbiA9IG5leHRfYXJndW1lbnQoKTsKLSAgICAkZGVmbiA9fiBzL14oICspLycmbmJzcDsnIHggbGVuZ3RoICQxL2U7Ci0gICAgcmV0dXJuICgiPHRyPlxuIgotICAgICAgICAgICAgLiAiICAgIDx0ZD48L3RkPlxuIgotICAgICAgICAgICAgLiAiICAgIDx0ZD48L3RkPlxuIgotICAgICAgICAgICAgLiAiICAgIDx0ZD48Y29kZT4iCi0gICAgICAgICAgICAuIHRyYW5zbGF0ZV9jb21tYW5kcygkZGVmbikKLSAgICAgICAgICAgIC4gIjwvY29kZT48L3RkPjwvdHI+IgotICAgICAgICAgICAgLiAkXyk7Ci19Ci0KLXN1YiBwcm9jZXNzX2dyYW1tYXJfZmlsZXMoKXsKLSAgICBteSAkbGFuZzsKLSAgICBteSAkZmlsZW5hbWU7Ci0gICAgbG9jYWwoJF8pOwotICAgIHByaW50ICJwcm9jZXNzX2dyYW1tYXJfZmlsZXMoKVxuIjsKLSAgICBmb3JlYWNoICRsYW5nIChrZXlzICVEZWZpbmVkR3JhbW1hcnMpIHsKLSAgICAgICAgJGZpbGVuYW1lID0gImdyYW1tYXItJGxhbmcudHh0IjsKLSAgICAgICAgaWYgKCRsYW5nIGVxICcqJykgewotICAgICAgICAgICAgbmV4dDsKLSAgICAgICAgfQotICAgICAgICBpZiAoJGxhbmcgZXEgJycpIHsKLSAgICAgICAgICAgICRmaWxlbmFtZSA9ICdncmFtbWFyLnR4dCc7Ci0gICAgICAgIH0KLSAgICAgICAgb3BlbihHUkFNTUFSLCAiPiRmaWxlbmFtZSIpIHx8IGRpZSAiXG4kIVxuIjsKLSAgICAgICAgcHJpbnQgR1JBTU1BUiAiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiI7Ci0gICAgICAgIHByaW50IEdSQU1NQVIgIiMgICAgIFRoaXMgZmlsZSBpcyBvbmx5IG1lYW50IHRvIGJlIGEgZ3VpZGUsICAgICAjXG4iOwotICAgICAgICBwcmludCBHUkFNTUFSICIjICAgIGFuZCBkaWZmZXJzIGluIHNtYWxsIHdheXMgZnJvbSB0aGUgcmVhbCAgICAgI1xuIjsKLSAgICAgICAgcHJpbnQgR1JBTU1BUiAiIyAgIGdyYW1tYXIuICBUaGUgZXhhY3QgcmVmZXJlbmNlIGlzIHRoZSBmaWxlICAgICNcbiI7Ci0gICAgICAgIHByaW50IEdSQU1NQVIgIiMgIEdyYW1tYXIvR3JhbW1hciBkaXN0cmlidXRlZCB3aXRoIHRoZSBzb3VyY2UuICAjXG4iOwotICAgICAgICBwcmludCBHUkFNTUFSICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIjsKLSAgICAgICAgcHJpbnQgR1JBTU1BUiBzdHJpcF9ncmFtbWFyX21hcmt1cCgkRGVmaW5lZEdyYW1tYXJzeyRsYW5nfSk7Ci0gICAgICAgIGNsb3NlKEdSQU1NQVIpOwotICAgICAgICBwcmludCAiV3JvdGUgZ3JhbW1hciBmaWxlICRmaWxlbmFtZVxuIjsKLSAgICB9Ci0gICAgbXkgJFBBVFRFUk4gPSAnPHB5R3JhbW1hclRva2VuPjwoW14+XSopPjwoW14+XSopPic7Ci0gICAgZm9yZWFjaCAkZmlsZW5hbWUgKGtleXMgJUJhY2twYXRjaEdyYW1tYXJGaWxlcykgewotICAgICAgICBwcmludCAiXG5CYWNrLXBhdGNoaW5nIGdyYW1tYXIgbGlua3MgaW4gJGZpbGVuYW1lXG4iOwotICAgICAgICBteSAkYnVmZmVyOwotICAgICAgICBvcGVuKEdSQU1NQVIsICI8JGZpbGVuYW1lIikgfHwgZGllICJcbiQhXG4iOwotICAgICAgICAjIHJlYWQgYWxsIG9mIHRoZSBmaWxlIGludG8gdGhlIGJ1ZmZlcgotICAgICAgICBzeXNyZWFkKEdSQU1NQVIsICRidWZmZXIsIDEwMjQqMTAyNCk7Ci0gICAgICAgIGNsb3NlKEdSQU1NQVIpOwotICAgICAgICB3aGlsZSAoJGJ1ZmZlciA9fiAvJFBBVFRFUk4vKSB7Ci0gICAgICAgICAgICBteSgkbGFuZywgJHRva2VuKSA9ICgkMSwgJDIpOwotICAgICAgICAgICAgbXkgJHRhcmdldCA9ICRUb2tlblRvVGFyZ2V0TWFwcGluZ3siJGxhbmc6JHRva2VuIn07Ci0gICAgICAgICAgICBteSAkc291cmNlID0gIjxweUdyYW1tYXJUb2tlbj48JGxhbmc+PCR0b2tlbj4iOwotICAgICAgICAgICAgJGJ1ZmZlciA9fiBzLyRzb3VyY2UvJHRhcmdldC9nOwotICAgICAgICB9Ci0gICAgICAgIG9wZW4oR1JBTU1BUiwgIj4kZmlsZW5hbWUiKSB8fCBkaWUgIlxuJCFcbiI7Ci0gICAgICAgIHByaW50IEdSQU1NQVIgJGJ1ZmZlcjsKLSAgICAgICAgY2xvc2UoR1JBTU1BUik7Ci0gICAgfQotfQotCi1zdWIgc3RyaXBfZ3JhbW1hcl9tYXJrdXAoJCl7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgcy9cXHByb2R1Y3Rpb25jb250LyAgICAgICAgICAgICAgL2c7Ci0gICAgcy9cXHByb2R1Y3Rpb24oPDxcZCs+PikoLispXDEvXG4kMiA6Oj0gL2c7Ci0gICAgcy9cXHRva2VuKDw8XGQrPj4pKC4rKVwxLyQyL2c7Ci0gICAgcy9cXGUoW15hLXpBLVpdKS9cXCQxL2c7Ci0gICAgcy88PFxkKz4+Ly9nOwotICAgIHMvO1NQTWd0Oy8+L2c7Ci0gICAgcy87U1BNbHQ7LzwvZzsKLSAgICBzLztTUE1xdW90Oy9cIi9nOwotICAgIHJldHVybiAkXzsKLX0KLQotCi0kUkVGQ09VTlRTX0xPQURFRCA9IDA7Ci0KLXN1YiBsb2FkX3JlZmNvdW50cygpewotICAgICRSRUZDT1VOVFNfTE9BREVEID0gMTsKLQotICAgIG15KCRteW5hbWUsICRteWRpciwgJG15ZXh0KSA9IGZpbGVwYXJzZShfX0ZJTEVfXywgJ1wuLionKTsKLSAgICBjaG9wICRteWRpcjsgICAgICAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSB0cmFpbGluZyAnLycKLSAgICAoJG15bmFtZSwgJG15ZGlyLCAkbXlleHQpID0gZmlsZXBhcnNlKCRteWRpciwgJ1wuLionKTsKLSAgICBjaG9wICRteWRpcjsgICAgICAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSB0cmFpbGluZyAnLycKLSAgICAkbXlkaXIgPSBnZXRjd2QoKSAuICIkZGQkbXlkaXIiCi0gICAgICB1bmxlc3MgJG15ZGlyID1+IHN8Xi98L3w7Ci0gICAgbG9jYWwgJF87Ci0gICAgbXkgJGZpbGVuYW1lID0gIiRteWRpciR7ZGR9YXBpJHtkZH1yZWZjb3VudHMuZGF0IjsKLSAgICBvcGVuKFJFRkNPVU5UX0ZJTEUsICI8JGZpbGVuYW1lIikgfHwgZGllICJcbiQhXG4iOwotICAgIHByaW50ICJbbG9hZGluZyBBUEkgcmVmY291bnQgZGF0YV0iOwotICAgIHdoaWxlICg8UkVGQ09VTlRfRklMRT4pIHsKLSAgICAgICAgaWYgKC8oW2EtekEtWjAtOV9dKyk6UHlPYmplY3RcKjooW2EtekEtWjAtOV9dKik6KDB8Wy0rXTF8bnVsbCk6KC4qKSQvKSB7Ci0gICAgICAgICAgICBteSgkZnVuYywgJHBhcmFtLCAkY291bnQsICRjb21tZW50KSA9ICgkMSwgJDIsICQzLCAkNCk7Ci0gICAgICAgICAgICAjcHJpbnQgIlxuJGZ1bmMoJHBhcmFtKSAtLT4gJGNvdW50IjsKLSAgICAgICAgICAgICRSRUZDT1VOVFN7IiRmdW5jOiRwYXJhbSJ9ID0gJGNvdW50OwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdWIgZ2V0X3JlZmNvdW50KCQkKXsKLSAgICBteSgkZnVuYywgJHBhcmFtKSA9IEBfOwotICAgIGxvYWRfcmVmY291bnRzKCkKLSAgICAgICAgdW5sZXNzICRSRUZDT1VOVFNfTE9BREVEOwotICAgIHJldHVybiAkUkVGQ09VTlRTeyIkZnVuYzokcGFyYW0ifTsKLX0KLQotCi0kVExTVEFSVCA9ICc8c3BhbiBjbGFzcz0idHlwZWxhYmVsIj4nOwotJFRMRU5EICAgPSAnPC9zcGFuPiZuYnNwOyc7Ci0KLXN1YiBjZnVuY2xpbmVfaGVscGVyKCQkJCl7Ci0gICAgbXkoJHR5cGUsICRuYW1lLCAkYXJncykgPSBAXzsKLSAgICBteSAkaWR4ID0gbWFrZV9zdHJfaW5kZXhfZW50cnkoCi0gICAgICAgICI8dHQgY2xhc3M9XCJjZnVuY3Rpb25cIj4kbmFtZSgpPC90dD4iIC4gZ2V0X2luZGV4c3ViaXRlbSgpKTsKLSAgICAkaWR4ID1+IHMvIFwoLipcKS8vOwotICAgICRpZHggPX4gcy9cKFwpLy87ICAgICAgICAgICAjID8/Pz8gLSB3aHkgYm90aCBvZiB0aGVzZT8KLSAgICAkYXJncyA9fiBzLyhcc3xcKikoW2Etel9dW2Etel8wLTldKiksLyQxPHZhcj4kMjxcL3Zhcj4sL2c7Ci0gICAgJGFyZ3MgPX4gcy8oXHN8XCopKFthLXpfXVthLXpfMC05XSopJC8kMTx2YXI+JDI8XC92YXI+L3M7Ci0gICAgcmV0dXJuICgnPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+PHRyIHZhbGlnbj0iYmFzZWxpbmUiPicKLSAgICAgICAgICAgIC4gIjx0ZD48bm9icj4kdHlwZVwmbmJzcDs8Yj4kaWR4PC9iPig8L25vYnI+PC90ZD4iCi0gICAgICAgICAgICAuICI8dGQ+JGFyZ3MpPC90ZD4iCi0gICAgICAgICAgICAuICc8L3RyPjwvdGFibGU+Jyk7Ci19Ci1zdWIgZG9fY21kX2NmdW5jbGluZXsKLSAgICBsb2NhbCgkXykgPSBAXzsKLSAgICBteSAkdHlwZSA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkbmFtZSA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkYXJncyA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkc2lnaW5mbyA9IGNmdW5jbGluZV9oZWxwZXIoJHR5cGUsICRuYW1lLCAkYXJncyk7Ci0gICAgcmV0dXJuICI8ZHQ+JHNpZ2luZm9cbjxkZD4iIC4gJF87Ci19Ci1zdWIgZG9fZW52X2NmdW5jZGVzY3sKLSAgICBsb2NhbCgkXykgPSBAXzsKLSAgICBteSAkdHlwZSA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkbmFtZSA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkYXJncyA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkc2lnaW5mbyA9IGNmdW5jbGluZV9oZWxwZXIoJHR5cGUsICRuYW1lLCAkYXJncyk7Ci0gICAgbXkgJHJlc3VsdF9yYyA9IGdldF9yZWZjb3VudCgkbmFtZSwgJycpOwotICAgIG15ICRyY2luZm8gPSAnJzsKLSAgICBpZiAoJHJlc3VsdF9yYyBlcSAnKzEnKSB7Ci0gICAgICAgICRyY2luZm8gPSAnTmV3IHJlZmVyZW5jZSc7Ci0gICAgfQotICAgIGVsc2lmICgkcmVzdWx0X3JjIGVxICcwJykgewotICAgICAgICAkcmNpbmZvID0gJ0JvcnJvd2VkIHJlZmVyZW5jZSc7Ci0gICAgfQotICAgIGVsc2lmICgkcmVzdWx0X3JjIGVxICdudWxsJykgewotICAgICAgICAkcmNpbmZvID0gJ0Fsd2F5cyA8dHQgY2xhc3M9ImNvbnN0YW50Ij5OVUxMPC90dD4nOwotICAgIH0KLSAgICBpZiAoJHJjaW5mbyBuZSAnJykgewotICAgICAgICAkcmNpbmZvID0gKCAgIlxuPGRpdiBjbGFzcz1cInJlZmNvdW50LWluZm9cIj4iCi0gICAgICAgICAgICAgICAgICAgLiAiXG4gIDxzcGFuIGNsYXNzPVwibGFiZWxcIj5SZXR1cm4gdmFsdWU6PC9zcGFuPiIKLSAgICAgICAgICAgICAgICAgICAuICJcbiAgPHNwYW4gY2xhc3M9XCJ2YWx1ZVwiPiRyY2luZm8uPC9zcGFuPiIKLSAgICAgICAgICAgICAgICAgICAuICJcbjwvZGl2PiIpOwotICAgIH0KLSAgICByZXR1cm4gIjxkbD48ZHQ+JHNpZ2luZm88L2R0PlxuPGRkPiIKLSAgICAgICAgICAgLiAkcmNpbmZvCi0gICAgICAgICAgIC4gJF8KLSAgICAgICAgICAgLiAnPC9kZD48L2RsPic7Ci19Ci0KLXN1YiBkb19jbWRfY21lbWJlcmxpbmV7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbXkgJGNvbnRhaW5lciA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkdHlwZSA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkbmFtZSA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkaWR4ID0gbWFrZV9zdHJfaW5kZXhfZW50cnkoIjx0dCBjbGFzcz1cImNtZW1iZXJcIj4kbmFtZTwvdHQ+IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgKCRjb250YWluZXIgbWVtYmVyKSIpOwotICAgICRpZHggPX4gcy8gXCguKlwpLy87Ci0gICAgcmV0dXJuICI8ZHQ+JHR5cGUgPGI+JGlkeDwvYj48L2R0PlxuPGRkPiIKLSAgICAgICAgICAgLiAkXzsKLX0KLXN1YiBkb19lbnZfY21lbWJlcmRlc2N7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbXkgJGNvbnRhaW5lciA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkdHlwZSA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkbmFtZSA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkaWR4ID0gbWFrZV9zdHJfaW5kZXhfZW50cnkoIjx0dCBjbGFzcz1cImNtZW1iZXJcIj4kbmFtZTwvdHQ+IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgKCRjb250YWluZXIgbWVtYmVyKSIpOwotICAgICRpZHggPX4gcy8gXCguKlwpLy87Ci0gICAgcmV0dXJuICI8ZGw+PGR0PiR0eXBlIDxiPiRpZHg8L2I+PC9kdD5cbjxkZD4iCi0gICAgICAgICAgIC4gJF8KLSAgICAgICAgICAgLiAnPC9kbD4nOwotfQotCi1zdWIgZG9fZW52X2NzaW1wbGVtYWNyb2Rlc2N7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbXkgJG5hbWUgPSBuZXh0X2FyZ3VtZW50KCk7Ci0gICAgbXkgJGlkeCA9IG1ha2Vfc3RyX2luZGV4X2VudHJ5KCI8dHQgY2xhc3M9XCJtYWNyb1wiPiRuYW1lPC90dD4iKTsKLSAgICByZXR1cm4gIjxkbD48ZHQ+PGI+JGlkeDwvYj48L2R0PlxuPGRkPiIKLSAgICAgICAgICAgLiAkXwotICAgICAgICAgICAuICc8L2RsPicKLX0KLQotc3ViIGRvX2Vudl9jdHlwZWRlc2N7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbXkgJGluZGV4X25hbWUgPSBuZXh0X29wdGlvbmFsX2FyZ3VtZW50KCk7Ci0gICAgbXkgJHR5cGVfbmFtZSA9IG5leHRfYXJndW1lbnQoKTsKLSAgICAkaW5kZXhfbmFtZSA9ICR0eXBlX25hbWUKLSAgICAgIHVubGVzcyAkaW5kZXhfbmFtZTsKLSAgICBteSgkbmFtZSwgJGFuYW1lLCAkYWhyZWYpID0gbmV3X2xpbmtfaW5mbygpOwotICAgIGFkZF9pbmRleF9lbnRyeSgiPHR0IGNsYXNzPVwiY3R5cGVcIj4kaW5kZXhfbmFtZTwvdHQ+IChDIHR5cGUpIiwgJGFocmVmKTsKLSAgICByZXR1cm4gIjxkbD48ZHQ+PGI+PHR0IGNsYXNzPVwiY3R5cGVcIj4kYW5hbWUkdHlwZV9uYW1lPC9hPjwvdHQ+PC9iPjwvZHQ+IgotICAgICAgICAgICAuICJcbjxkZD4iCi0gICAgICAgICAgIC4gJF8KLSAgICAgICAgICAgLiAnPC9kbD4nCi19Ci0KLXN1YiBkb19lbnZfY3ZhcmRlc2N7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbXkgJHZhcl90eXBlID0gbmV4dF9hcmd1bWVudCgpOwotICAgIG15ICR2YXJfbmFtZSA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkaWR4ID0gbWFrZV9zdHJfaW5kZXhfZW50cnkoIjx0dCBjbGFzcz1cImNkYXRhXCI+JHZhcl9uYW1lPC90dD4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gZ2V0X2luZGV4c3ViaXRlbSgpKTsKLSAgICAkaWR4ID1+IHMvIFwoLipcKS8vOwotICAgIHJldHVybiAiPGRsPjxkdD4kdmFyX3R5cGUgPGI+JGlkeDwvYj48L2R0PlxuIgotICAgICAgICAgICAuICc8ZGQ+JwotICAgICAgICAgICAuICRfCi0gICAgICAgICAgIC4gJzwvZGQ+PC9kbD4nOwotfQotCi1zdWIgY29udmVydF9hcmdzKCQpewotICAgIGxvY2FsKCRJTl9ERVNDX0hBTkRMRVIpID0gMTsKLSAgICBsb2NhbCgkXykgPSBAXzsKLSAgICByZXR1cm4gdHJhbnNsYXRlX2NvbW1hbmRzKCRfKTsKLX0KLQotc3ViIGZ1bmNsaW5lX2hlbHBlcigkJCQpewotICAgIG15KCRmaXJzdCwgJGlkeGl0ZW0sICRhcmdsaXN0KSA9IEBfOwotICAgIHJldHVybiAoKCRmaXJzdCA/ICc8ZGw+JyA6ICcnKQotICAgICAgICAgICAgLiAnPGR0Pjx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPjx0ciB2YWxpZ249ImJhc2VsaW5lIj4nCi0gICAgICAgICAgICAuICJcbiAgPHRkPjxub2JyPjxiPiRpZHhpdGVtPC9iPig8L25vYnI+PC90ZD4iCi0gICAgICAgICAgICAuICJcbiAgPHRkPjx2YXI+JGFyZ2xpc3Q8L3Zhcj4pPC90ZD48L3RyPjwvdGFibGU+PC9kdD5cbjxkZD4iKTsKLX0KLQotc3ViIGRvX2Vudl9mdW5jZGVzY3sKLSAgICBsb2NhbCgkXykgPSBAXzsKLSAgICBteSAkZnVuY3Rpb25fbmFtZSA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkYXJnX2xpc3QgPSBjb252ZXJ0X2FyZ3MobmV4dF9hcmd1bWVudCgpKTsKLSAgICBteSAkaWR4ID0gbWFrZV9zdHJfaW5kZXhfZW50cnkoIjx0dCBjbGFzcz1cImZ1bmN0aW9uXCI+JGZ1bmN0aW9uX25hbWUoKSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnPC90dD4nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gZ2V0X2luZGV4c3ViaXRlbSgpKTsKLSAgICAkaWR4ID1+IHMvIFwoLipcKS8vOwotICAgICRpZHggPX4gcy9cKFwpPFwvdHQ+LzxcL3R0Pi87Ci0gICAgcmV0dXJuIGZ1bmNsaW5lX2hlbHBlcigxLCAkaWR4LCAkYXJnX2xpc3QpIC4gJF8gLiAnPC9kbD4nOwotfQotCi1zdWIgZG9fZW52X2Z1bmNkZXNjbml7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbXkgJGZ1bmN0aW9uX25hbWUgPSBuZXh0X2FyZ3VtZW50KCk7Ci0gICAgbXkgJGFyZ19saXN0ID0gY29udmVydF9hcmdzKG5leHRfYXJndW1lbnQoKSk7Ci0gICAgbXkgJHByZWZpeCA9ICI8dHQgY2xhc3M9XCJmdW5jdGlvblwiPiRmdW5jdGlvbl9uYW1lPC90dD4iOwotICAgIHJldHVybiBmdW5jbGluZV9oZWxwZXIoMSwgJHByZWZpeCwgJGFyZ19saXN0KSAuICRfIC4gJzwvZGw+JzsKLX0KLQotc3ViIGRvX2NtZF9mdW5jbGluZXsKLSAgICBsb2NhbCgkXykgPSBAXzsKLSAgICBteSAkZnVuY3Rpb25fbmFtZSA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkYXJnX2xpc3QgPSBjb252ZXJ0X2FyZ3MobmV4dF9hcmd1bWVudCgpKTsKLSAgICBteSAkcHJlZml4ID0gIjx0dCBjbGFzcz1cImZ1bmN0aW9uXCI+JGZ1bmN0aW9uX25hbWUoKTwvdHQ+IjsKLSAgICBteSAkaWR4ID0gbWFrZV9zdHJfaW5kZXhfZW50cnkoJHByZWZpeCAuIGdldF9pbmRleHN1Yml0ZW0oKSk7Ci0gICAgJHByZWZpeCA9fiBzL1woXCkvLzsKLQotICAgIHJldHVybiBmdW5jbGluZV9oZWxwZXIoMCwgJHByZWZpeCwgJGFyZ19saXN0KSAuICRfOwotfQotCi1zdWIgZG9fY21kX2Z1bmNsaW5lbml7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbXkgJGZ1bmN0aW9uX25hbWUgPSBuZXh0X2FyZ3VtZW50KCk7Ci0gICAgbXkgJGFyZ19saXN0ID0gY29udmVydF9hcmdzKG5leHRfYXJndW1lbnQoKSk7Ci0gICAgbXkgJHByZWZpeCA9ICI8dHQgY2xhc3M9XCJmdW5jdGlvblwiPiRmdW5jdGlvbl9uYW1lPC90dD4iOwotCi0gICAgcmV0dXJuIGZ1bmNsaW5lX2hlbHBlcigwLCAkcHJlZml4LCAkYXJnX2xpc3QpIC4gJF87Ci19Ci0KLSMgQ2hhbmdlIHRoaXMgZmxhZyB0byBpbmRleCB0aGUgb3Bjb2RlIGVudHJpZXMuICBJIGRvbid0IHRoaW5rIGl0J3MgdmVyeQotIyB1c2VmdWwgdG8gaW5kZXggdGhlbSwgc2luY2UgdGhleSdyZSBvbmx5IHByZXNlbnRlZCB0byBkZXNjcmliZSB0aGUgZGlzCi0jIG1vZHVsZS4KLSMKLSRJTkRFWF9PUENPREVTID0gMDsKLQotc3ViIGRvX2Vudl9vcGNvZGVkZXNjewotICAgIGxvY2FsKCRfKSA9IEBfOwotICAgIG15ICRvcGNvZGVfbmFtZSA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkYXJnX2xpc3QgPSBuZXh0X2FyZ3VtZW50KCk7Ci0gICAgbXkgJGlkeDsKLSAgICBpZiAoJElOREVYX09QQ09ERVMpIHsKLSAgICAgICAgJGlkeCA9IG1ha2Vfc3RyX2luZGV4X2VudHJ5KCI8dHQgY2xhc3M9XCJvcGNvZGVcIj4kb3Bjb2RlX25hbWU8L3R0PiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJyAoYnl0ZSBjb2RlIGluc3RydWN0aW9uKScpOwotICAgICAgICAkaWR4ID1+IHMvIFwoYnl0ZSBjb2RlIGluc3RydWN0aW9uXCkvLzsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgICRpZHggPSAiPHR0IGNsYXNzPVwib3Bjb2RlXCI+JG9wY29kZV9uYW1lPC90dD4iOwotICAgIH0KLSAgICBteSAkc3R1ZmYgPSAiPGRsPjxkdD48Yj4kaWR4PC9iPiI7Ci0gICAgaWYgKCRhcmdfbGlzdCkgewotICAgICAgICAkc3R1ZmYgLj0gIiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzx2YXI+JGFyZ19saXN0PC92YXI+IjsKLSAgICB9Ci0gICAgcmV0dXJuICRzdHVmZiAuICI8L2R0PlxuPGRkPiIgLiAkXyAuICc8L2R0PjwvZGw+JzsKLX0KLQotc3ViIGRvX2Vudl9kYXRhZGVzY3sKLSAgICBsb2NhbCgkXykgPSBAXzsKLSAgICBteSAkZGF0YW5hbWUgPSBuZXh0X2FyZ3VtZW50KCk7Ci0gICAgbXkgJGlkeCA9IG1ha2Vfc3RyX2luZGV4X2VudHJ5KCI8dHQ+JGRhdGFuYW1lPC90dD4iIC4gZ2V0X2luZGV4c3ViaXRlbSgpKTsKLSAgICAkaWR4ID1+IHMvIFwoLipcKS8vOwotICAgIHJldHVybiAiPGRsPjxkdD48Yj4kaWR4PC9iPjwvZHQ+XG48ZGQ+IgotICAgICAgICAgICAuICRfCi0gICAgICAgICAgIC4gJzwvZGQ+PC9kbD4nOwotfQotCi1zdWIgZG9fZW52X2RhdGFkZXNjbml7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbXkgJGlkeCA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBpZiAoISAkU1RSSU5HX0lOREVYX1RUKSB7Ci0gICAgICAgICRpZHggPSAiPHR0PiRpZHg8L3R0PiI7Ci0gICAgfQotICAgIHJldHVybiAiPGRsPjxkdD48Yj4kaWR4PC9iPjwvZHQ+XG48ZGQ+IiAuICRfIC4gJzwvZGQ+PC9kbD4nOwotfQotCi1zdWIgZG9fY21kX2RhdGFsaW5lewotICAgIGxvY2FsKCRfKSA9IEBfOwotICAgIG15ICRkYXRhX25hbWUgPSBuZXh0X2FyZ3VtZW50KCk7Ci0gICAgbXkgJGlkeCA9IG1ha2Vfc3RyX2luZGV4X2VudHJ5KCI8dHQ+JGRhdGFfbmFtZTwvdHQ+IiAuIGdldF9pbmRleHN1Yml0ZW0oKSk7Ci0gICAgJGlkeCA9fiBzLyBcKC4qXCkvLzsKLSAgICByZXR1cm4gIjxkdD48Yj4kaWR4PC9iPjwvZHQ+PGRkPiIgLiAkXzsKLX0KLQotc3ViIGRvX2NtZF9kYXRhbGluZW5pewotICAgIGxvY2FsKCRfKSA9IEBfOwotICAgIG15ICRkYXRhX25hbWUgPSBuZXh0X2FyZ3VtZW50KCk7Ci0gICAgcmV0dXJuICI8ZHQ+PGI+PHR0PiRkYXRhX25hbWU8L3R0PjwvYj48L2R0PjxkZD4iIC4gJF87Ci19Ci0KLXN1YiBkb19lbnZfZXhjZGVzY3sKLSAgICBsb2NhbCgkXykgPSBAXzsKLSAgICBteSAkZXhjbmFtZSA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkaWR4ID0gbWFrZV9zdHJfaW5kZXhfZW50cnkoIjx0dCBjbGFzcz1cImV4Y2VwdGlvblwiPiRleGNuYW1lPC90dD4iKTsKLSAgICByZXR1cm4gKCI8ZGw+PGR0PjxiPiR7VExTVEFSVH1leGNlcHRpb24kVExFTkQkaWR4PC9iPjwvZHQ+IgotICAgICAgICAgICAgLiAiXG48ZGQ+IgotICAgICAgICAgICAgLiAkXwotICAgICAgICAgICAgLiAnPC9kZD48L2RsPicpOwotfQotCi1zdWIgZG9fZW52X2Z1bGxsaW5laXRlbXN7IHJldHVybiBkb19lbnZfaXRlbWl6ZShAXyk7IH0KLQotCi1zdWIgaGFuZGxlX2NsYXNzbGlrZV9kZXNjcmlwdG9yKCQkKXsKLSAgICBsb2NhbCgkXywgJHdoYXQpID0gQF87Ci0gICAgJFRISVNfQ0xBU1MgPSBuZXh0X2FyZ3VtZW50KCk7Ci0gICAgbXkgJGFyZ19saXN0ID0gY29udmVydF9hcmdzKG5leHRfYXJndW1lbnQoKSk7Ci0gICAgJGlkeCA9IG1ha2Vfc3RyX2luZGV4X2VudHJ5KAotICAgICAgICAiPHR0IGNsYXNzPVwiJHdoYXRcIj4kVEhJU19DTEFTUzwvdHQ+ICgkd2hhdCBpbiAkVEhJU19NT0RVTEUpIiApOwotICAgICRpZHggPX4gcy8gXCguKlwpLy87Ci0gICAgbXkgJHByZWZpeCA9ICIkVExTVEFSVCR3aGF0JFRMRU5EJGlkeCI7Ci0gICAgcmV0dXJuIGZ1bmNsaW5lX2hlbHBlcigxLCAkcHJlZml4LCAkYXJnX2xpc3QpIC4gJF8gLiAnPC9kbD4nOwotfQotCi1zdWIgZG9fZW52X2NsYXNzZGVzY3sKLSAgICByZXR1cm4gaGFuZGxlX2NsYXNzbGlrZV9kZXNjcmlwdG9yKCRfWzBdLCAiY2xhc3MiKTsKLX0KLQotc3ViIGRvX2Vudl9jbGFzc2Rlc2NzdGFyewotICAgIGxvY2FsKCRfKSA9IEBfOwotICAgICRUSElTX0NMQVNTID0gbmV4dF9hcmd1bWVudCgpOwotICAgICRpZHggPSBtYWtlX3N0cl9pbmRleF9lbnRyeSgKLSAgICAgICAgIjx0dCBjbGFzcz1cImNsYXNzXCI+JFRISVNfQ0xBU1M8L3R0PiAoY2xhc3MgaW4gJFRISVNfTU9EVUxFKSIpOwotICAgICRpZHggPX4gcy8gXCguKlwpLy87Ci0gICAgbXkgJHByZWZpeCA9ICIke1RMU1RBUlR9Y2xhc3MkVExFTkQkaWR4IjsKLSAgICAjIENhbid0IHVzZSBmdW5jbGluZV9oZWxwZXIoKSBzaW5jZSB0aGVyZSBpcyBubyBhcmdzIGxpc3QuCi0gICAgcmV0dXJuICI8ZGw+PGR0PjxiPiRwcmVmaXg8L2I+XG48ZGQ+IiAuICRfIC4gJzwvZGw+JzsKLX0KLQotc3ViIGRvX2Vudl9leGNjbGFzc2Rlc2N7Ci0gICAgcmV0dXJuIGhhbmRsZV9jbGFzc2xpa2VfZGVzY3JpcHRvcigkX1swXSwgImV4Y2VwdGlvbiIpOwotfQotCi0KLXN1YiBkb19lbnZfbWV0aG9kZGVzY3sKLSAgICBsb2NhbCgkXykgPSBAXzsKLSAgICBteSAkY2xhc3NfbmFtZSA9IG5leHRfb3B0aW9uYWxfYXJndW1lbnQoKTsKLSAgICAkY2xhc3NfbmFtZSA9ICRUSElTX0NMQVNTCi0gICAgICAgIHVubGVzcyAkY2xhc3NfbmFtZTsKLSAgICBteSAkbWV0aG9kID0gbmV4dF9hcmd1bWVudCgpOwotICAgIG15ICRhcmdfbGlzdCA9IGNvbnZlcnRfYXJncyhuZXh0X2FyZ3VtZW50KCkpOwotICAgIG15ICRleHRyYSA9ICcnOwotICAgIGlmICgkY2xhc3NfbmFtZSkgewotICAgICAgICAkZXh0cmEgPSAiICgkY2xhc3NfbmFtZSBtZXRob2QpIjsKLSAgICB9Ci0gICAgbXkgJGlkeCA9IG1ha2Vfc3RyX2luZGV4X2VudHJ5KAotICAgICAgICAiPHR0IGNsYXNzPVwibWV0aG9kXCI+JG1ldGhvZCgpPC90dD4kZXh0cmEiKTsKLSAgICAkaWR4ID1+IHMvIFwoLipcKS8vOwotICAgICRpZHggPX4gcy9cKFwpLy87Ci0gICAgcmV0dXJuIGZ1bmNsaW5lX2hlbHBlcigxLCAkaWR4LCAkYXJnX2xpc3QpIC4gJF8gLiAnPC9kbD4nOwotfQotCi0KLXN1YiBkb19jbWRfbWV0aG9kbGluZXsKLSAgICBsb2NhbCgkXykgPSBAXzsKLSAgICBteSAkY2xhc3NfbmFtZSA9IG5leHRfb3B0aW9uYWxfYXJndW1lbnQoKTsKLSAgICAkY2xhc3NfbmFtZSA9ICRUSElTX0NMQVNTCi0gICAgICAgIHVubGVzcyAkY2xhc3NfbmFtZTsKLSAgICBteSAkbWV0aG9kID0gbmV4dF9hcmd1bWVudCgpOwotICAgIG15ICRhcmdfbGlzdCA9IGNvbnZlcnRfYXJncyhuZXh0X2FyZ3VtZW50KCkpOwotICAgIG15ICRleHRyYSA9ICcnOwotICAgIGlmICgkY2xhc3NfbmFtZSkgewotICAgICAgICAkZXh0cmEgPSAiICgkY2xhc3NfbmFtZSBtZXRob2QpIjsKLSAgICB9Ci0gICAgbXkgJGlkeCA9IG1ha2Vfc3RyX2luZGV4X2VudHJ5KAotICAgICAgICAiPHR0IGNsYXNzPVwibWV0aG9kXCI+JG1ldGhvZCgpPC90dD4kZXh0cmEiKTsKLSAgICAkaWR4ID1+IHMvIFwoLipcKS8vOwotICAgICRpZHggPX4gcy9cKFwpLy87Ci0gICAgcmV0dXJuIGZ1bmNsaW5lX2hlbHBlcigwLCAkaWR4LCAkYXJnX2xpc3QpIC4gJF87Ci19Ci0KLQotc3ViIGRvX2NtZF9tZXRob2RsaW5lbml7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbmV4dF9vcHRpb25hbF9hcmd1bWVudCgpOwotICAgIG15ICRtZXRob2QgPSBuZXh0X2FyZ3VtZW50KCk7Ci0gICAgbXkgJGFyZ19saXN0ID0gY29udmVydF9hcmdzKG5leHRfYXJndW1lbnQoKSk7Ci0gICAgcmV0dXJuIGZ1bmNsaW5lX2hlbHBlcigwLCAkbWV0aG9kLCAkYXJnX2xpc3QpIC4gJF87Ci19Ci0KLXN1YiBkb19lbnZfbWV0aG9kZGVzY25pewotICAgIGxvY2FsKCRfKSA9IEBfOwotICAgIG5leHRfb3B0aW9uYWxfYXJndW1lbnQoKTsKLSAgICBteSAkbWV0aG9kID0gbmV4dF9hcmd1bWVudCgpOwotICAgIG15ICRhcmdfbGlzdCA9IGNvbnZlcnRfYXJncyhuZXh0X2FyZ3VtZW50KCkpOwotICAgIHJldHVybiBmdW5jbGluZV9oZWxwZXIoMSwgJG1ldGhvZCwgJGFyZ19saXN0KSAuICRfIC4gJzwvZGw+JzsKLX0KLQotCi1zdWIgZG9fZW52X21lbWJlcmRlc2N7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbXkgJGNsYXNzID0gbmV4dF9vcHRpb25hbF9hcmd1bWVudCgpOwotICAgIG15ICRtZW1iZXIgPSBuZXh0X2FyZ3VtZW50KCk7Ci0gICAgJGNsYXNzID0gJFRISVNfQ0xBU1MKLSAgICAgICAgdW5sZXNzICRjbGFzczsKLSAgICBteSAkZXh0cmEgPSAnJzsKLSAgICAkZXh0cmEgPSAiICgkY2xhc3MgYXR0cmlidXRlKSIKLSAgICAgICAgaWYgKCRjbGFzcyBuZSAnJyk7Ci0gICAgbXkgJGlkeCA9IG1ha2Vfc3RyX2luZGV4X2VudHJ5KCI8dHQgY2xhc3M9XCJtZW1iZXJcIj4kbWVtYmVyPC90dD4kZXh0cmEiKTsKLSAgICAkaWR4ID1+IHMvIFwoLipcKS8vOwotICAgICRpZHggPX4gcy9cKFwpLy87Ci0gICAgcmV0dXJuICI8ZGw+PGR0PjxiPiRpZHg8L2I+PC9kdD5cbjxkZD4iIC4gJF8gLiAnPC9kbD4nOwotfQotCi0KLXN1YiBkb19jbWRfbWVtYmVybGluZXsKLSAgICBsb2NhbCgkXykgPSBAXzsKLSAgICBteSAkY2xhc3MgPSBuZXh0X29wdGlvbmFsX2FyZ3VtZW50KCk7Ci0gICAgbXkgJG1lbWJlciA9IG5leHRfYXJndW1lbnQoKTsKLSAgICAkY2xhc3MgPSAkVEhJU19DTEFTUwotICAgICAgICB1bmxlc3MgJGNsYXNzOwotICAgIG15ICRleHRyYSA9ICcnOwotICAgICRleHRyYSA9ICIgKCRjbGFzcyBhdHRyaWJ1dGUpIgotICAgICAgICBpZiAoJGNsYXNzIG5lICcnKTsKLSAgICBteSAkaWR4ID0gbWFrZV9zdHJfaW5kZXhfZW50cnkoIjx0dCBjbGFzcz1cIm1lbWJlclwiPiRtZW1iZXI8L3R0PiRleHRyYSIpOwotICAgICRpZHggPX4gcy8gXCguKlwpLy87Ci0gICAgJGlkeCA9fiBzL1woXCkvLzsKLSAgICByZXR1cm4gIjxkdD48Yj4kaWR4PC9iPjwvZHQ+PGRkPiIgLiAkXzsKLX0KLQotCi1zdWIgZG9fZW52X21lbWJlcmRlc2NuaXsKLSAgICBsb2NhbCgkXykgPSBAXzsKLSAgICBuZXh0X29wdGlvbmFsX2FyZ3VtZW50KCk7Ci0gICAgbXkgJG1lbWJlciA9IG5leHRfYXJndW1lbnQoKTsKLSAgICByZXR1cm4gIjxkbD48ZHQ+PGI+PHR0IGNsYXNzPVwibWVtYmVyXCI+JG1lbWJlcjwvdHQ+PC9iPjwvZHQ+XG48ZGQ+IgotICAgICAgICAgICAuICRfCi0gICAgICAgICAgIC4gJzwvZGQ+PC9kbD4nOwotfQotCi0KLXN1YiBkb19jbWRfbWVtYmVybGluZW5pewotICAgIGxvY2FsKCRfKSA9IEBfOwotICAgIG5leHRfb3B0aW9uYWxfYXJndW1lbnQoKTsKLSAgICBteSAkbWVtYmVyID0gbmV4dF9hcmd1bWVudCgpOwotICAgIHJldHVybiAiPGR0PjxiPjx0dCBjbGFzcz1cIm1lbWJlclwiPiRtZW1iZXI8L3R0PjwvYj48L2R0PlxuPGRkPiIgLiAkXzsKLX0KLQotCi0jIEZvciB0YWJsZXMsIHdlIGluY2x1ZGUgYSBjbGFzcyBvbiBldmVyeSBjZWxsIHRvIGFsbG93IHRoZSBDU1MgdG8gc2V0Ci0jIHRoZSB0ZXh0LWFsaWduIHByb3BlcnR5OyB0aGlzIGlzIGJlY2F1c2Ugc3VwcG9ydCBmb3Igc3R5bGluZyBjb2x1bW5zCi0jIHZpYSB0aGUgPGNvbD4gZWxlbWVudCBhcHBlYXJzIG5lYXJseSBub24tZXhpc3RhbnQgb24gZXZlbiB0aGUgbGF0ZXN0Ci0jIGJyb3dzZXJzIChNb3ppbGxhIDEuNyBpcyBzdGFibGUgYXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nKS4KLSMgSG9wZWZ1bGx5IHRoaXMgY2FuIGJlIGltcHJvdmVkIGFzIGJyb3dzZXJzIGV2b2x2ZS4KLQotQGNvbF9hbGlnbnMgPSAoJzx0ZD4nLCAnPHRkPicsICc8dGQ+JywgJzx0ZD4nLCAnPHRkPicpOwotCi0lRm9udENvbnZlcnNpb25zID0gKCdjZGF0YScgPT4gJ3R0IGNsYXNzPSJjZGF0YSInLAotICAgICAgICAgICAgICAgICAgICAnY2hhcmFjdGVyJyA9PiAndHQgY2xhc3M9ImNoYXJhY3RlciInLAotICAgICAgICAgICAgICAgICAgICAnY2xhc3MnID0+ICd0dCBjbGFzcz0iY2xhc3MiJywKLSAgICAgICAgICAgICAgICAgICAgJ2NvbW1hbmQnID0+ICdjb2RlJywKLSAgICAgICAgICAgICAgICAgICAgJ2NvbnN0YW50JyA9PiAndHQgY2xhc3M9ImNvbnN0YW50IicsCi0gICAgICAgICAgICAgICAgICAgICdleGNlcHRpb24nID0+ICd0dCBjbGFzcz0iZXhjZXB0aW9uIicsCi0gICAgICAgICAgICAgICAgICAgICdmaWxlJyA9PiAndHQgY2xhc3M9ImZpbGUiJywKLSAgICAgICAgICAgICAgICAgICAgJ2ZpbGVucScgPT4gJ3R0IGNsYXNzPSJmaWxlIicsCi0gICAgICAgICAgICAgICAgICAgICdrYmQnID0+ICdrYmQnLAotICAgICAgICAgICAgICAgICAgICAnbWVtYmVyJyA9PiAndHQgY2xhc3M9Im1lbWJlciInLAotICAgICAgICAgICAgICAgICAgICAncHJvZ3JhbW9wdCcgPT4gJ2InLAotICAgICAgICAgICAgICAgICAgICAndGV4dHJtJyA9PiAnJywKLSAgICAgICAgICAgICAgICAgICAgKTsKLQotc3ViIGZpeF9mb250KCQpewotICAgICMgZG8gYSBsaXR0bGUgbWFnaWMgb24gYSBmb250IG5hbWUgdG8gZ2V0IHRoZSByaWdodCBiZWhhdmlvciBpbiB0aGUgZmlyc3QKLSAgICAjIGNvbHVtbiBvZiB0aGUgb3V0cHV0IHRhYmxlCi0gICAgbXkgJGZvbnQgPSAkX1swXTsKLSAgICBpZiAoZGVmaW5lZCAkRm9udENvbnZlcnNpb25zeyRmb250fSkgewotICAgICAgICAkZm9udCA9ICRGb250Q29udmVyc2lvbnN7JGZvbnR9OwotICAgIH0KLSAgICByZXR1cm4gJGZvbnQ7Ci19Ci0KLXN1YiBmaWd1cmVfY29sdW1uX2FsaWdubWVudCgkKXsKLSAgICBteSAkYSA9ICRfWzBdOwotICAgIGlmICghZGVmaW5lZCAkYSkgewotICAgICAgICByZXR1cm4gJyc7Ci0gICAgfQotICAgIG15ICRtYXJrID0gc3Vic3RyKCRhLCAwLCAxKTsKLSAgICBteSAkciA9ICcnOwotICAgIGlmICgkbWFyayBlcSAnYycpCi0gICAgICB7ICRyID0gJyBjbGFzcz0iY2VudGVyIic7IH0KLSAgICBlbHNpZiAoJG1hcmsgZXEgJ3InKQotICAgICAgeyAkciA9ICcgY2xhc3M9InJpZ2h0IiAnOyB9Ci0gICAgZWxzaWYgKCRtYXJrIGVxICdsJykKLSAgICAgIHsgJHIgPSAnIGNsYXNzPSJsZWZ0IiAgJzsgfQotICAgIGVsc2lmICgkbWFyayBlcSAncCcpCi0gICAgICB7ICRyID0gJyBjbGFzcz0ibGVmdCIgICc7IH0KLSAgICByZXR1cm4gJHI7Ci19Ci0KLXN1YiBzZXR1cF9jb2x1bW5fYWxpZ25tZW50cygkKXsKLSAgICBsb2NhbCgkXykgPSBAXzsKLSAgICBteSgkczEsICRzMiwgJHMzLCAkczQsICRzNSkgPSBzcGxpdCgvW3xdLywkXyk7Ci0gICAgbXkgJGExID0gZmlndXJlX2NvbHVtbl9hbGlnbm1lbnQoJHMxKTsKLSAgICBteSAkYTIgPSBmaWd1cmVfY29sdW1uX2FsaWdubWVudCgkczIpOwotICAgIG15ICRhMyA9IGZpZ3VyZV9jb2x1bW5fYWxpZ25tZW50KCRzMyk7Ci0gICAgbXkgJGE0ID0gZmlndXJlX2NvbHVtbl9hbGlnbm1lbnQoJHM0KTsKLSAgICBteSAkYTUgPSBmaWd1cmVfY29sdW1uX2FsaWdubWVudCgkczUpOwotICAgICRjb2xfYWxpZ25zWzBdID0gIjx0ZCRhMSB2YWxpZ249XCJiYXNlbGluZVwiPiI7Ci0gICAgJGNvbF9hbGlnbnNbMV0gPSAiPHRkJGEyPiI7Ci0gICAgJGNvbF9hbGlnbnNbMl0gPSAiPHRkJGEzPiI7Ci0gICAgJGNvbF9hbGlnbnNbM10gPSAiPHRkJGE0PiI7Ci0gICAgJGNvbF9hbGlnbnNbNF0gPSAiPHRkJGE1PiI7Ci0gICAgIyByZXR1cm4gdGhlIGFsaWduZWQgaGVhZGVyIHN0YXJ0IHRhZ3MKLSAgICByZXR1cm4gKCI8dGgkYTE+IiwgIjx0aCRhMj4iLCAiPHRoJGEzPiIsICI8dGgkYTQ+IiwgIjx0aCRhNT4iKTsKLX0KLQotc3ViIGdldF90YWJsZV9jb2wxX2ZvbnRzKCl7Ci0gICAgbXkgJGZvbnQgPSAkZ2xvYmFsc3snbGluZWlmb250J307Ci0gICAgbXkoJHNmb250LCAkZWZvbnQpID0gKCcnLCAnJyk7Ci0gICAgaWYgKCRmb250KSB7Ci0gICAgICAgICRzZm9udCA9ICI8JGZvbnQ+IjsKLSAgICAgICAgJGVmb250ID0gIjwvJGZvbnQ+IjsKLSAgICAgICAgJGVmb250ID1+IHMvIC4qPi8+LzsKLSAgICB9Ci0gICAgcmV0dXJuICgkc2ZvbnQsICRlZm9udCk7Ci19Ci0KLXN1YiBkb19lbnZfdGFibGVpaXsKLSAgICBsb2NhbCgkXykgPSBAXzsKLSAgICBteSAkYXJnID0gbmV4dF9hcmd1bWVudCgpOwotICAgIG15KCR0aDEsICR0aDIsICR0aDMsICR0aDQsICR0aDUpID0gc2V0dXBfY29sdW1uX2FsaWdubWVudHMoJGFyZyk7Ci0gICAgbXkgJGZvbnQgPSBmaXhfZm9udChuZXh0X2FyZ3VtZW50KCkpOwotICAgIG15ICRoMSA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkaDIgPSBuZXh0X2FyZ3VtZW50KCk7Ci0gICAgcy9bXHNcbl0rLy87Ci0gICAgJGdsb2JhbHN7J2xpbmVpZm9udCd9ID0gJGZvbnQ7Ci0gICAgbXkgJGExID0gJGNvbF9hbGlnbnNbMF07Ci0gICAgbXkgJGEyID0gJGNvbF9hbGlnbnNbMV07Ci0gICAgcy9cXGxpbmVpaTwvXFxsaW5laWlbJGExfCRhMl08L2c7Ci0gICAgcmV0dXJuICc8ZGl2IGNsYXNzPSJjZW50ZXIiPjx0YWJsZSBjbGFzcz0icmVhbHRhYmxlIj4nCi0gICAgICAgICAgIC4gIlxuICA8dGhlYWQ+IgotICAgICAgICAgICAuICJcbiAgICA8dHI+IgotICAgICAgICAgICAuICJcbiAgICAgICR0aDEkaDE8L3RoPiIKLSAgICAgICAgICAgLiAiXG4gICAgICAkdGgyJGgyPC90aD4iCi0gICAgICAgICAgIC4gIlxuICAgICAgPC90cj4iCi0gICAgICAgICAgIC4gIlxuICAgIDwvdGhlYWQ+IgotICAgICAgICAgICAuICJcbiAgPHRib2R5PiIKLSAgICAgICAgICAgLiAkXwotICAgICAgICAgICAuICJcbiAgICA8L3Rib2R5PiIKLSAgICAgICAgICAgLiAiXG48L3RhYmxlPjwvZGl2PiI7Ci19Ci0KLXN1YiBkb19lbnZfbG9uZ3RhYmxlaWl7Ci0gICAgcmV0dXJuIGRvX2Vudl90YWJsZWlpKEBfKTsKLX0KLQotc3ViIGRvX2NtZF9saW5laWl7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbXkgJGFsaWducyA9IG5leHRfb3B0aW9uYWxfYXJndW1lbnQoKTsKLSAgICBteSAkYzEgPSBuZXh0X2FyZ3VtZW50KCk7Ci0gICAgbXkgJGMyID0gbmV4dF9hcmd1bWVudCgpOwotICAgIHMvW1xzXG5dKy8vOwotICAgIG15KCRzZm9udCwgJGVmb250KSA9IGdldF90YWJsZV9jb2wxX2ZvbnRzKCk7Ci0gICAgbXkoJGMxYWxpZ24sICRjMmFsaWduKSA9IHNwbGl0KCdcfCcsICRhbGlnbnMpOwotICAgIHJldHVybiAiXG4gICAgPHRyPiRjMWFsaWduJHNmb250JGMxJGVmb250PC90ZD5cbiIKLSAgICAgICAgICAgLiAiICAgICAgICAkYzJhbGlnbiRjMjwvdGQ+PC90cj4iCi0gICAgICAgICAgIC4gJF87Ci19Ci0KLXN1YiBkb19lbnZfdGFibGVpaWl7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbXkgJGFyZyA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSgkdGgxLCAkdGgyLCAkdGgzLCAkdGg0LCAkdGg1KSA9IHNldHVwX2NvbHVtbl9hbGlnbm1lbnRzKCRhcmcpOwotICAgIG15ICRmb250ID0gZml4X2ZvbnQobmV4dF9hcmd1bWVudCgpKTsKLSAgICBteSAkaDEgPSBuZXh0X2FyZ3VtZW50KCk7Ci0gICAgbXkgJGgyID0gbmV4dF9hcmd1bWVudCgpOwotICAgIG15ICRoMyA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBzL1tcc1xuXSsvLzsKLSAgICAkZ2xvYmFsc3snbGluZWlmb250J30gPSAkZm9udDsKLSAgICBteSAkYTEgPSAkY29sX2FsaWduc1swXTsKLSAgICBteSAkYTIgPSAkY29sX2FsaWduc1sxXTsKLSAgICBteSAkYTMgPSAkY29sX2FsaWduc1syXTsKLSAgICBzL1xcbGluZWlpaTwvXFxsaW5laWlpWyRhMXwkYTJ8JGEzXTwvZzsKLSAgICByZXR1cm4gJzxkaXYgY2xhc3M9ImNlbnRlciI+PHRhYmxlIGNsYXNzPSJyZWFsdGFibGUiPicKLSAgICAgICAgICAgLiAiXG4gIDx0aGVhZD4iCi0gICAgICAgICAgIC4gIlxuICAgIDx0cj4iCi0gICAgICAgICAgIC4gIlxuICAgICAgJHRoMSRoMTwvdGg+IgotICAgICAgICAgICAuICJcbiAgICAgICR0aDIkaDI8L3RoPiIKLSAgICAgICAgICAgLiAiXG4gICAgICAkdGgzJGgzPC90aD4iCi0gICAgICAgICAgIC4gIlxuICAgICAgPC90cj4iCi0gICAgICAgICAgIC4gIlxuICAgIDwvdGhlYWQ+IgotICAgICAgICAgICAuICJcbiAgPHRib2R5PiIKLSAgICAgICAgICAgLiAkXwotICAgICAgICAgICAuICJcbiAgICA8L3Rib2R5PiIKLSAgICAgICAgICAgLiAiXG48L3RhYmxlPjwvZGl2PiI7Ci19Ci0KLXN1YiBkb19lbnZfbG9uZ3RhYmxlaWlpewotICAgIHJldHVybiBkb19lbnZfdGFibGVpaWkoQF8pOwotfQotCi1zdWIgZG9fY21kX2xpbmVpaWl7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbXkgJGFsaWducyA9IG5leHRfb3B0aW9uYWxfYXJndW1lbnQoKTsKLSAgICBteSAkYzEgPSBuZXh0X2FyZ3VtZW50KCk7Ci0gICAgbXkgJGMyID0gbmV4dF9hcmd1bWVudCgpOwotICAgIG15ICRjMyA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBzL1tcc1xuXSsvLzsKLSAgICBteSgkc2ZvbnQsICRlZm9udCkgPSBnZXRfdGFibGVfY29sMV9mb250cygpOwotICAgIG15KCRjMWFsaWduLCAkYzJhbGlnbiwgJGMzYWxpZ24pID0gc3BsaXQoJ1x8JywgJGFsaWducyk7Ci0gICAgcmV0dXJuICJcbiAgICA8dHI+JGMxYWxpZ24kc2ZvbnQkYzEkZWZvbnQ8L3RkPlxuIgotICAgICAgICAgICAuICIgICAgICAgICRjMmFsaWduJGMyPC90ZD5cbiIKLSAgICAgICAgICAgLiAiICAgICAgICAkYzNhbGlnbiRjMzwvdGQ+PC90cj4iCi0gICAgICAgICAgIC4gJF87Ci19Ci0KLXN1YiBkb19lbnZfdGFibGVpdnsKLSAgICBsb2NhbCgkXykgPSBAXzsKLSAgICBteSAkYXJnID0gbmV4dF9hcmd1bWVudCgpOwotICAgIG15KCR0aDEsICR0aDIsICR0aDMsICR0aDQsICR0aDUpID0gc2V0dXBfY29sdW1uX2FsaWdubWVudHMoJGFyZyk7Ci0gICAgbXkgJGZvbnQgPSBmaXhfZm9udChuZXh0X2FyZ3VtZW50KCkpOwotICAgIG15ICRoMSA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkaDIgPSBuZXh0X2FyZ3VtZW50KCk7Ci0gICAgbXkgJGgzID0gbmV4dF9hcmd1bWVudCgpOwotICAgIG15ICRoNCA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBzL1tcc1xuXSsvLzsKLSAgICAkZ2xvYmFsc3snbGluZWlmb250J30gPSAkZm9udDsKLSAgICBteSAkYTEgPSAkY29sX2FsaWduc1swXTsKLSAgICBteSAkYTIgPSAkY29sX2FsaWduc1sxXTsKLSAgICBteSAkYTMgPSAkY29sX2FsaWduc1syXTsKLSAgICBteSAkYTQgPSAkY29sX2FsaWduc1szXTsKLSAgICBzL1xcbGluZWl2PC9cXGxpbmVpdlskYTF8JGEyfCRhM3wkYTRdPC9nOwotICAgIHJldHVybiAnPGRpdiBjbGFzcz0iY2VudGVyIj48dGFibGUgY2xhc3M9InJlYWx0YWJsZSI+JwotICAgICAgICAgICAuICJcbiAgPHRoZWFkPiIKLSAgICAgICAgICAgLiAiXG4gICAgPHRyPiIKLSAgICAgICAgICAgLiAiXG4gICAgICAkdGgxJGgxPC90aD4iCi0gICAgICAgICAgIC4gIlxuICAgICAgJHRoMiRoMjwvdGg+IgotICAgICAgICAgICAuICJcbiAgICAgICR0aDMkaDM8L3RoPiIKLSAgICAgICAgICAgLiAiXG4gICAgICAkdGg0JGg0PC90aD4iCi0gICAgICAgICAgIC4gIlxuICAgICAgPC90cj4iCi0gICAgICAgICAgIC4gIlxuICAgIDwvdGhlYWQ+IgotICAgICAgICAgICAuICJcbiAgPHRib2R5PiIKLSAgICAgICAgICAgLiAkXwotICAgICAgICAgICAuICJcbiAgICA8L3Rib2R5PiIKLSAgICAgICAgICAgLiAiXG48L3RhYmxlPjwvZGl2PiI7Ci19Ci0KLXN1YiBkb19lbnZfbG9uZ3RhYmxlaXZ7Ci0gICAgcmV0dXJuIGRvX2Vudl90YWJsZWl2KEBfKTsKLX0KLQotc3ViIGRvX2NtZF9saW5laXZ7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbXkgJGFsaWducyA9IG5leHRfb3B0aW9uYWxfYXJndW1lbnQoKTsKLSAgICBteSAkYzEgPSBuZXh0X2FyZ3VtZW50KCk7Ci0gICAgbXkgJGMyID0gbmV4dF9hcmd1bWVudCgpOwotICAgIG15ICRjMyA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkYzQgPSBuZXh0X2FyZ3VtZW50KCk7Ci0gICAgcy9bXHNcbl0rLy87Ci0gICAgbXkoJHNmb250LCAkZWZvbnQpID0gZ2V0X3RhYmxlX2NvbDFfZm9udHMoKTsKLSAgICBteSgkYzFhbGlnbiwgJGMyYWxpZ24sICRjM2FsaWduLCAkYzRhbGlnbikgPSBzcGxpdCgnXHwnLCAkYWxpZ25zKTsKLSAgICByZXR1cm4gIlxuICAgIDx0cj4kYzFhbGlnbiRzZm9udCRjMSRlZm9udDwvdGQ+XG4iCi0gICAgICAgICAgIC4gIiAgICAgICAgJGMyYWxpZ24kYzI8L3RkPlxuIgotICAgICAgICAgICAuICIgICAgICAgICRjM2FsaWduJGMzPC90ZD5cbiIKLSAgICAgICAgICAgLiAiICAgICAgICAkYzRhbGlnbiRjNDwvdGQ+PC90cj4iCi0gICAgICAgICAgIC4gJF87Ci19Ci0KLXN1YiBkb19lbnZfdGFibGV2ewotICAgIGxvY2FsKCRfKSA9IEBfOwotICAgIG15ICRhcmcgPSBuZXh0X2FyZ3VtZW50KCk7Ci0gICAgbXkoJHRoMSwgJHRoMiwgJHRoMywgJHRoNCwgJHRoNSkgPSBzZXR1cF9jb2x1bW5fYWxpZ25tZW50cygkYXJnKTsKLSAgICBteSAkZm9udCA9IGZpeF9mb250KG5leHRfYXJndW1lbnQoKSk7Ci0gICAgbXkgJGgxID0gbmV4dF9hcmd1bWVudCgpOwotICAgIG15ICRoMiA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkaDMgPSBuZXh0X2FyZ3VtZW50KCk7Ci0gICAgbXkgJGg0ID0gbmV4dF9hcmd1bWVudCgpOwotICAgIG15ICRoNSA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBzL1tcc1xuXSsvLzsKLSAgICAkZ2xvYmFsc3snbGluZWlmb250J30gPSAkZm9udDsKLSAgICBteSAkYTEgPSAkY29sX2FsaWduc1swXTsKLSAgICBteSAkYTIgPSAkY29sX2FsaWduc1sxXTsKLSAgICBteSAkYTMgPSAkY29sX2FsaWduc1syXTsKLSAgICBteSAkYTQgPSAkY29sX2FsaWduc1szXTsKLSAgICBteSAkYTUgPSAkY29sX2FsaWduc1s0XTsKLSAgICBzL1xcbGluZXY8L1xcbGluZXZbJGExfCRhMnwkYTN8JGE0fCRhNV08L2c7Ci0gICAgcmV0dXJuICc8ZGl2IGNsYXNzPSJjZW50ZXIiPjx0YWJsZSBjbGFzcz0icmVhbHRhYmxlIj4nCi0gICAgICAgICAgIC4gIlxuICA8dGhlYWQ+IgotICAgICAgICAgICAuICJcbiAgICA8dHI+IgotICAgICAgICAgICAuICJcbiAgICAgICR0aDEkaDE8L3RoPiIKLSAgICAgICAgICAgLiAiXG4gICAgICAkdGgyJGgyPC90aD4iCi0gICAgICAgICAgIC4gIlxuICAgICAgJHRoMyRoMzwvdGg+IgotICAgICAgICAgICAuICJcbiAgICAgICR0aDQkaDQ8L3RoPiIKLSAgICAgICAgICAgLiAiXG4gICAgICAkdGg1JGg1PC90aD4iCi0gICAgICAgICAgIC4gIlxuICAgICAgPC90cj4iCi0gICAgICAgICAgIC4gIlxuICAgIDwvdGhlYWQ+IgotICAgICAgICAgICAuICJcbiAgPHRib2R5PiIKLSAgICAgICAgICAgLiAkXwotICAgICAgICAgICAuICJcbiAgICA8L3Rib2R5PiIKLSAgICAgICAgICAgLiAiXG48L3RhYmxlPjwvZGl2PiI7Ci19Ci0KLXN1YiBkb19lbnZfbG9uZ3RhYmxldnsKLSAgICByZXR1cm4gZG9fZW52X3RhYmxldihAXyk7Ci19Ci0KLXN1YiBkb19jbWRfbGluZXZ7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbXkgJGFsaWducyA9IG5leHRfb3B0aW9uYWxfYXJndW1lbnQoKTsKLSAgICBteSAkYzEgPSBuZXh0X2FyZ3VtZW50KCk7Ci0gICAgbXkgJGMyID0gbmV4dF9hcmd1bWVudCgpOwotICAgIG15ICRjMyA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkYzQgPSBuZXh0X2FyZ3VtZW50KCk7Ci0gICAgbXkgJGM1ID0gbmV4dF9hcmd1bWVudCgpOwotICAgIHMvW1xzXG5dKy8vOwotICAgIG15KCRzZm9udCwgJGVmb250KSA9IGdldF90YWJsZV9jb2wxX2ZvbnRzKCk7Ci0gICAgbXkoJGMxYWxpZ24sICRjMmFsaWduLCAkYzNhbGlnbiwgJGM0YWxpZ24sICRjNWFsaWduKSA9IHNwbGl0KCdcfCcsJGFsaWducyk7Ci0gICAgcmV0dXJuICJcbiAgICA8dHI+JGMxYWxpZ24kc2ZvbnQkYzEkZWZvbnQ8L3RkPlxuIgotICAgICAgICAgICAuICIgICAgICAgICRjMmFsaWduJGMyPC90ZD5cbiIKLSAgICAgICAgICAgLiAiICAgICAgICAkYzNhbGlnbiRjMzwvdGQ+XG4iCi0gICAgICAgICAgIC4gIiAgICAgICAgJGM0YWxpZ24kYzQ8L3RkPlxuIgotICAgICAgICAgICAuICIgICAgICAgICRjNWFsaWduJGM1PC90ZD48L3RyPiIKLSAgICAgICAgICAgLiAkXzsKLX0KLQotCi0jIFRoZXNlIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIHRpdGxlIHBhZ2UgYXBwZWFyYW5jZTsKLSMgdGhleSBuZWVkIGEgbGl0dGxlIGJpdCBvZiBkb2N1bWVudGF0aW9uLgotIwotIyBJZiAkVElUTEVfUEFHRV9HUkFQSElDIGlzIHNldCwgaXQgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIGEgZmlsZSBpbiB0aGUKLSMgJElDT05TRVJWRVIgZGlyZWN0b3J5LCBvciBpbmNsdWRlIHBhdGggaW5mb3JtYXRpb24gKG90aGVyIHRoYW4gIi4vIikuICBUaGUKLSMgZGVmYXVsdCBpbWFnZSB0eXBlIHdpbGwgYmUgYXNzdW1lZCBpZiBhbiBleHRlbnNpb24gaXMgbm90IHByb3ZpZGVkLgotIwotIyBJZiBzcGVjaWZpZWQsIHRoZSAidGl0bGUgcGFnZSIgd2lsbCBjb250YWluIHR3byBjb2x1bXM6IG9uZSBjb250YWluaW5nIHRoZQotIyB0aXRsZS9hdXRob3IvZXRjLiwgYW5kIHRoZSBvdGhlciBjb250YWluaW5nIHRoZSBncmFwaGljLiAgVXNlIHRoZSBvdGhlcgotIyBmb3VyIHZhcmlhYmxlcyBsaXN0ZWQgaGVyZSB0byBjb250cm9sIHNwZWNpZmljIGRldGFpbHMgb2YgdGhlIGxheW91dDsgYWxsCi0jIGFyZSBvcHRpb25hbC4KLSMKLSMgJFRJVExFX1BBR0VfR1JBUEhJQyA9ICJteS1jb21wYW55LWxvZ28iOwotIyAkVElUTEVfUEFHRV9HUkFQSElDX0NPTFdJRFRIID0gIjMwJSI7Ci0jICRUSVRMRV9QQUdFX0dSQVBISUNfV0lEVEggPSAxNTA7Ci0jICRUSVRMRV9QQUdFX0dSQVBISUNfSEVJR0hUID0gMTUwOwotIyAkVElUTEVfUEFHRV9HUkFQSElDX09OX1JJR0hUID0gMDsKLQotc3ViIG1ha2VfbXlfdGl0bGVwYWdlKCl7Ci0gICAgbXkgJHRoZV90aXRsZSA9ICIiOwotICAgIGlmICgkdF90aXRsZSkgewotICAgICAgICAkdGhlX3RpdGxlIC49ICJcbjxoMT4kdF90aXRsZTwvaDE+IjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHdyaXRlX3dhcm5pbmdzKCJcblRoaXMgZG9jdW1lbnQgaGFzIG5vIHRpdGxlLiIpOwotICAgIH0KLSAgICBpZiAoJHRfYXV0aG9yKSB7Ci0gICAgICAgIGlmICgkdF9hdXRob3JVUkwpIHsKLSAgICAgICAgICAgIG15ICRocmVmID0gdHJhbnNsYXRlX2NvbW1hbmRzKCR0X2F1dGhvclVSTCk7Ci0gICAgICAgICAgICAkaHJlZiA9IG1ha2VfbmFtZWRfaHJlZignYXV0aG9yJywgJGhyZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGI+PGZvbnQgc2l6ZT1cIisyXCI+JHRfYXV0aG9yIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnPC9mb250PjwvYj4nKTsKLSAgICAgICAgICAgICR0aGVfdGl0bGUgLj0gIlxuPHA+JGhyZWY8L3A+IjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICR0aGVfdGl0bGUgLj0gKCJcbjxwPjxiPjxmb250IHNpemU9XCIrMlwiPiR0X2F1dGhvciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJzwvZm9udD48L2I+PC9wPicpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICB3cml0ZV93YXJuaW5ncygiXG5UaGVyZSBpcyBubyBhdXRob3IgZm9yIHRoaXMgZG9jdW1lbnQuIik7Ci0gICAgfQotICAgIGlmICgkdF9pbnN0aXR1dGUpIHsKLSAgICAgICAgJHRoZV90aXRsZSAuPSAiXG48cD4kdF9pbnN0aXR1dGU8L3A+IjsKLSAgICB9Ci0gICAgaWYgKCRERVZFTE9QRVJfQUREUkVTUykgewotICAgICAgICAkdGhlX3RpdGxlIC49ICJcbjxwPiRERVZFTE9QRVJfQUREUkVTUzwvcD4iOwotICAgIH0KLSAgICBpZiAoJHRfYWZmaWwpIHsKLSAgICAgICAgJHRoZV90aXRsZSAuPSAiXG48cD48aT4kdF9hZmZpbDwvaT48L3A+IjsKLSAgICB9Ci0gICAgaWYgKCR0X2RhdGUpIHsKLSAgICAgICAgJHRoZV90aXRsZSAuPSAiXG48cD4iOwotICAgICAgICBpZiAoJFBBQ0tBR0VfVkVSU0lPTikgewotICAgICAgICAgICAgJHRoZV90aXRsZSAuPSAoJzxzdHJvbmc+UmVsZWFzZSAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAuICIkUEFDS0FHRV9WRVJTSU9OJFJFTEVBU0VfSU5GTzwvc3Ryb25nPjxiciAvPlxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgJHRoZV90aXRsZSAuPSAiPHN0cm9uZz4kdF9kYXRlPC9zdHJvbmc+PC9wPiIKLSAgICB9Ci0gICAgaWYgKCR0X2FkZHJlc3MpIHsKLSAgICAgICAgJHRoZV90aXRsZSAuPSAiXG48cD4kdF9hZGRyZXNzPC9wPiI7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAkdGhlX3RpdGxlIC49ICJcbjxwPjwvcD4iOwotICAgIH0KLSAgICBpZiAoJHRfZW1haWwpIHsKLSAgICAgICAgJHRoZV90aXRsZSAuPSAiXG48cD4kdF9lbWFpbDwvcD4iOwotICAgIH0KLSAgICByZXR1cm4gJHRoZV90aXRsZTsKLX0KLQotc3ViIG1ha2VfbXlfdGl0bGVncmFwaGljKCl7Ci0gICAgbXkgJGZpbGVuYW1lID0gbWFrZV9pY29uX2ZpbGVuYW1lKCRUSVRMRV9QQUdFX0dSQVBISUMpOwotICAgIG15ICRncmFwaGljID0gIjx0ZCBjbGFzcz1cInRpdGxlZ3JhcGhpY1wiIjsKLSAgICAkZ3JhcGhpYyAuPSAiIHdpZHRoPVwiJFRJVExFX1BBR0VfR1JBUEhJQ19DT0xXSURUSFwiIgotICAgICAgaWYgKCRUSVRMRV9QQUdFX0dSQVBISUNfQ09MV0lEVEgpOwotICAgICRncmFwaGljIC49ICI+PGltZyI7Ci0gICAgJGdyYXBoaWMgLj0gIiB3aWR0aD1cIiRUSVRMRV9QQUdFX0dSQVBISUNfV0lEVEhcIiIKLSAgICAgIGlmICgkVElUTEVfUEFHRV9HUkFQSElDX1dJRFRIKTsKLSAgICAkZ3JhcGhpYyAuPSAiIGhlaWdodD1cIiRUSVRMRV9QQUdFX0dSQVBISUNfSEVJR0hUXCIiCi0gICAgICBpZiAoJFRJVExFX1BBR0VfR1JBUEhJQ19IRUlHSFQpOwotICAgICRncmFwaGljIC49ICJcbiAgc3JjPVwiJGZpbGVuYW1lXCIgLz48L3RkPlxuIjsKLSAgICByZXR1cm4gJGdyYXBoaWM7Ci19Ci0KLXN1YiBkb19jbWRfbWFrZXRpdGxlewotICAgIGxvY2FsKCRfKSA9IEBfOwotICAgIG15ICR0aGVfdGl0bGUgPSAiXG4iOwotICAgIGlmICgkRVhURVJOQUxfVVBfTElOSykgewotICAgICAgICAjIFRoaXMgZ2VuZXJhdGVzIGEgPGxpbms+IGVsZW1lbnQgaW4gdGhlIHdyb25nIHBsYWNlICh0aGUKLSAgICAgICAgIyBib2R5KSwgYnV0IEkgZG9uJ3Qgc2VlIGFueSBvdGhlciB3YXkgdG8gZ2V0IHRoaXMgZ2VuZXJhdGVkCi0gICAgICAgICMgYXQgYWxsLiAgQnJvd3NlcnMgbGlrZSBNb3ppbGxhLCB0aGF0IHN1cHBvcnQgbmF2aWdhdGlvbgotICAgICAgICAjIGxpbmtzLCBjYW4gbWFrZSB1c2Ugb2YgdGhpcy4KLSAgICAgICAgJHRoZV90aXRsZSAuPSAoIjxsaW5rIHJlbD0ndXAnIGhyZWY9JyRFWFRFUk5BTF9VUF9MSU5LJyIKLSAgICAgICAgICAgICAgICAgICAgICAgLiAoJEVYVEVSTkFMX1VQX1RJVExFCi0gICAgICAgICAgICAgICAgICAgICAgICAgID8gIiB0aXRsZT0nJEVYVEVSTkFMX1VQX1RJVExFJyIgOiAnJykKLSAgICAgICAgICAgICAgICAgICAgICAgLiAiIC8+XG4iKTsKLSAgICB9Ci0gICAgJHRoZV90aXRsZSAuPSAnPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4nOwotICAgIGlmICgkVElUTEVfUEFHRV9HUkFQSElDKSB7Ci0gICAgICAgIGlmICgkVElUTEVfUEFHRV9HUkFQSElDX09OX1JJR0hUKSB7Ci0gICAgICAgICAgICAkdGhlX3RpdGxlIC49ICgiXG48dGFibGUgYm9yZGVyPVwiMFwiIHdpZHRoPVwiMTAwJVwiPiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIjx0ciBhbGlnbj1cInJpZ2h0XCI+XG48dGQ+IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgLiBtYWtlX215X3RpdGxlcGFnZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAuICI8L3RkPlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgLiBtYWtlX215X3RpdGxlZ3JhcGhpYygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAuICI8L3RyPlxuPC90YWJsZT4iKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICR0aGVfdGl0bGUgLj0gKCJcbjx0YWJsZSBib3JkZXI9XCIwXCIgd2lkdGg9XCIxMDAlXCI+PHRyPlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgLiBtYWtlX215X3RpdGxlZ3JhcGhpYygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAuICI8dGQ+IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgLiBtYWtlX215X3RpdGxlcGFnZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAuICI8L3RkPjwvdHI+XG48L3RhYmxlPiIpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAkdGhlX3RpdGxlIC49ICgiXG48ZGl2IGNsYXNzPSdjZW50ZXInPiIKLSAgICAgICAgICAgICAgICAgICAgICAgLiBtYWtlX215X3RpdGxlcGFnZSgpCi0gICAgICAgICAgICAgICAgICAgICAgIC4gIlxuPC9kaXY+Iik7Ci0gICAgfQotICAgICR0aGVfdGl0bGUgLj0gIlxuPC9kaXY+IjsKLSAgICByZXR1cm4gJHRoZV90aXRsZSAuICRfOwotfQotCi0KLSMKLSMgIE1vZHVsZSBzeW5vcHNpcyBzdXBwb3J0Ci0jCi0KLXJlcXVpcmUgU3lub3BzaXNUYWJsZTsKLQotc3ViIGdldF9jaGFwdGVyX2lkKCl7Ci0gICAgbXkgJGlkID0gZG9fY21kX3RoZWNoYXB0ZXIoJycpOwotICAgICRpZCA9fiBzLzxTUEFOIENMQVNTPSJhcmFiaWMiPihcZCspPFwvU1BBTj4vJDEvOwotICAgICRpZCA9fiBzL1wuLy87Ci0gICAgcmV0dXJuICRpZDsKLX0KLQotIyAnY2hhcHRlcicgPT4gJ1N5bm9wc2lzVGFibGUgaW5zdGFuY2UnCi0lTW9kdWxlU3lub3BzZXMgPSAoKTsKLQotc3ViIGdldF9zeW5vcHNpc190YWJsZSgkKXsKLSAgICBteSAkY2hhcCA9ICRfWzBdOwotICAgIG15ICRrZXk7Ci0gICAgZm9yZWFjaCAka2V5IChrZXlzICVNb2R1bGVTeW5vcHNlcykgewotICAgICAgICBpZiAoJGtleSBlcSAkY2hhcCkgewotICAgICAgICAgICAgcmV0dXJuICRNb2R1bGVTeW5vcHNlc3skY2hhcH07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbXkgJHN0ID0gU3lub3BzaXNUYWJsZS0+bmV3KCk7Ci0gICAgJE1vZHVsZVN5bm9wc2VzeyRjaGFwfSA9ICRzdDsKLSAgICByZXR1cm4gJHN0OwotfQotCi1zdWIgZG9fY21kX21vZHVsZWF1dGhvcnsKLSAgICBsb2NhbCgkXykgPSBAXzsKLSAgICBuZXh0X2FyZ3VtZW50KCk7Ci0gICAgbmV4dF9hcmd1bWVudCgpOwotICAgIHJldHVybiAkXzsKLX0KLQotc3ViIGRvX2NtZF9zZWN0aW9uYXV0aG9yewotICAgIGxvY2FsKCRfKSA9IEBfOwotICAgIG5leHRfYXJndW1lbnQoKTsKLSAgICBuZXh0X2FyZ3VtZW50KCk7Ci0gICAgcmV0dXJuICRfOwotfQotCi1zdWIgZG9fY21kX2RlY2xhcmVtb2R1bGV7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbXkgJGtleSA9IG5leHRfb3B0aW9uYWxfYXJndW1lbnQoKTsKLSAgICBteSAkdHlwZSA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkbmFtZSA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkc3QgPSBnZXRfc3lub3BzaXNfdGFibGUoZ2V0X2NoYXB0ZXJfaWQoKSk7Ci0gICAgIwotICAgICRrZXkgPSAkbmFtZSB1bmxlc3MgJGtleTsKLSAgICAkdHlwZSA9ICdidWlsdC1pbicgaWYgJHR5cGUgZXEgJ2J1aWx0aW4nOwotICAgICRzdC0+ZGVjbGFyZSgkbmFtZSwgJGtleSwgJHR5cGUpOwotICAgIGRlZmluZV9tb2R1bGUoJHR5cGUsICRuYW1lKTsKLSAgICByZXR1cm4gYW5jaG9yX2xhYmVsKCJtb2R1bGUtJGtleSIsJENVUlJFTlRfRklMRSwkXykKLX0KLQotc3ViIGRvX2NtZF9tb2R1bGVzeW5vcHNpc3sKLSAgICBsb2NhbCgkXykgPSBAXzsKLSAgICBteSAkc3QgPSBnZXRfc3lub3BzaXNfdGFibGUoZ2V0X2NoYXB0ZXJfaWQoKSk7Ci0gICAgJHN0LT5zZXRfc3lub3BzaXMoJFRISVNfTU9EVUxFLCB0cmFuc2xhdGVfY29tbWFuZHMobmV4dF9hcmd1bWVudCgpKSk7Ci0gICAgcmV0dXJuICRfOwotfQotCi1zdWIgZG9fY21kX2xvY2FsbW9kdWxldGFibGV7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbXkgJGNoYXAgPSBnZXRfY2hhcHRlcl9pZCgpOwotICAgIG15ICRzdCA9IGdldF9zeW5vcHNpc190YWJsZSgkY2hhcCk7Ci0gICAgJHN0LT5zZXRfZmlsZSgiJENVUlJFTlRfRklMRSIpOwotICAgIHJldHVybiAiPHRleDJodG1sLWxvY2FsbW9kdWxldGFibGU+PCRjaGFwPlxcdGFibGVvZmNoaWxkbGlua3Nbb2ZmXSIgLiAkXzsKLX0KLQotc3ViIHByb2Nlc3NfYWxsX2xvY2FsbW9kdWxldGFibGVzKCl7Ci0gICAgbXkgJGtleTsKLSAgICBmb3JlYWNoICRrZXkgKGtleXMgJU1vZHVsZVN5bm9wc2VzKSB7Ci0gICAgICAgIG15ICRzdCA9ICRNb2R1bGVTeW5vcHNlc3ska2V5fTsKLSAgICAgICAgbXkgJGZpbGUgPSAkc3QtPmdldF9maWxlKCk7Ci0gICAgICAgIGlmICgkZmlsZSkgewotICAgICAgICAgICAgcHJvY2Vzc19sb2NhbG1vZHVsZXRhYmxlc19pbl9maWxlKCRmaWxlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHByaW50ICJcbnN5bm9wc2lzIHRhYmxlICRrZXkgaGFzIG5vIGZpbGUgYXNzb2NpYXRpb25cbiI7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN1YiBwcm9jZXNzX2xvY2FsbW9kdWxldGFibGVzX2luX2ZpbGUoJCl7Ci0gICAgbXkgJGZpbGUgPSAkX1swXTsKLSAgICBvcGVuKE1ZRklMRSwgIjwkZmlsZSIpOwotICAgIGxvY2FsKCRfKTsKLSAgICBzeXNyZWFkKE1ZRklMRSwgJF8sIDEwMjQqMTAyNCk7Ci0gICAgY2xvc2UoTVlGSUxFKTsKLSAgICAjIG5lZWQgdG8gZ2V0IGNvbnRlbnRzIG9mIGZpbGUgaW4gJF8KLSAgICB3aGlsZSAoLzx0ZXgyaHRtbC1sb2NhbG1vZHVsZXRhYmxlPjwoXGQrKT4vKSB7Ci0gICAgICAgIG15ICRtYXRjaCA9ICQmOwotICAgICAgICBteSAkY2hhcCA9ICQxOwotICAgICAgICBteSAkc3QgPSBnZXRfc3lub3BzaXNfdGFibGUoJGNoYXApOwotICAgICAgICBteSAkZGF0YSA9ICRzdC0+dG9odG1sKCk7Ci0gICAgICAgIHMvJG1hdGNoLyRkYXRhLzsKLSAgICB9Ci0gICAgb3BlbihNWUZJTEUsIj4kZmlsZSIpOwotICAgIHByaW50IE1ZRklMRSAkXzsKLSAgICBjbG9zZShNWUZJTEUpOwotfQotc3ViIHByb2Nlc3NfcHl0aG9uX3N0YXRlKCl7Ci0gICAgcHJvY2Vzc19hbGxfbG9jYWxtb2R1bGV0YWJsZXMoKTsKLSAgICBwcm9jZXNzX2dyYW1tYXJfZmlsZXMoKTsKLX0KLQotCi0jCi0jICAiU2VlIGFsc286IiAtLSByZWZlcmVuY2VzIHBsYWNlZCBhdCB0aGUgZW5kIG9mIGEgXHNlY3Rpb24KLSMKLQotc3ViIGRvX2Vudl9zZWVhbHNvewotICAgIHJldHVybiAoIjxkaXYgY2xhc3M9XCJzZWVhbHNvXCI+XG4gICIKLSAgICAgICAgICAgIC4gIjxwIGNsYXNzPVwiaGVhZGluZ1wiPlNlZSBBbHNvOjwvcD5cbiIKLSAgICAgICAgICAgIC4gJF9bMF0KLSAgICAgICAgICAgIC4gJzwvZGl2PicpOwotfQotCi1zdWIgZG9fZW52X3NlZWFsc29zdGFyewotICAgIHJldHVybiAoIjxkaXYgY2xhc3M9XCJzZWVhbHNvLXNpbXBsZVwiPlxuICAiCi0gICAgICAgICAgICAuICRfWzBdCi0gICAgICAgICAgICAuICc8L2Rpdj4nKTsKLX0KLQotc3ViIGRvX2NtZF9zZWVtb2R1bGV7Ci0gICAgIyBJbnNlcnQgdGhlIHJpZ2h0IG1hZ2ljIHRvIGp1bXAgdG8gdGhlIG1vZHVsZSBkZWZpbml0aW9uLiAgVGhpcyBzaG91bGQKLSAgICAjIHdvcmsgbW9zdCBvZiB0aGUgdGltZSwgYXQgbGVhc3QgZm9yIHJlcGVhdCBidWlsZHMuLi4uCi0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbXkgJGtleSA9IG5leHRfb3B0aW9uYWxfYXJndW1lbnQoKTsKLSAgICBteSAkbW9kdWxlID0gbmV4dF9hcmd1bWVudCgpOwotICAgIG15ICR0ZXh0ID0gbmV4dF9hcmd1bWVudCgpOwotICAgIG15ICRwZXJpb2QgPSAnLic7Ci0gICAgJGtleSA9ICRtb2R1bGUKLSAgICAgICAgdW5sZXNzICRrZXk7Ci0gICAgaWYgKCR0ZXh0ID1+IC9cLiQvKSB7Ci0gICAgICAgICRwZXJpb2QgPSAnJzsKLSAgICB9Ci0gICAgcmV0dXJuICgnPGRsIGNvbXBhY3Q9ImNvbXBhY3QiIGNsYXNzPSJzZWVtb2R1bGUiPicKLSAgICAgICAgICAgIC4gIlxuICAgIDxkdD5Nb2R1bGUgPGI+PHR0IGNsYXNzPVwibW9kdWxlXCI+IgotICAgICAgICAgICAgLiAiPGEgaHJlZj1cIm1vZHVsZS0ka2V5Lmh0bWxcIj4kbW9kdWxlPC9hPjwvdHQ+OjwvYj4iCi0gICAgICAgICAgICAuICJcbiAgICA8ZGQ+JHRleHQkcGVyaW9kXG4gIDwvZGw+IgotICAgICAgICAgICAgLiAkXyk7Ci19Ci0KLXN1YiBzdHJpcF9odG1sX21hcmt1cCgkKXsKLSAgICBteSAkc3RyID0gJF9bMF07Ci0gICAgbXkgJHMgPSAiJHN0ciI7Ci0gICAgJHMgPX4gcy88W2EtekEtWjAtOV0rKFxzK1thLXpBLVowLTldKyhccyo9XHMqKFwnW15cJ10qXCd8XCJbXlwiXSpcInxbYS16QS1aMC05XSspKT8pKlxzKj4vL2c7Ci0gICAgJHMgPX4gcy88XC9bYS16QS1aMC05XSs+Ly9nOwotICAgIHJldHVybiAkczsKLX0KLQotc3ViIGhhbmRsZV9yZmNsaWtlX3JlZmVyZW5jZSgkJCQpewotICAgIGxvY2FsKCRfLCAkd2hhdCwgJGZvcm1hdCkgPSBAXzsKLSAgICBteSAkcmZjbnVtID0gbmV4dF9hcmd1bWVudCgpOwotICAgIG15ICR0aXRsZSA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkdGV4dCA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkdXJsID0gZ2V0X3JmY191cmwoJHJmY251bSwgJGZvcm1hdCk7Ci0gICAgbXkgJGljb24gPSBnZXRfbGlua19pY29uKCR1cmwpOwotICAgIG15ICRhdHRydGl0bGUgPSBzdHJpcF9odG1sX21hcmt1cCgkdGl0bGUpOwotICAgIHJldHVybiAnPGRsIGNvbXBhY3Q9ImNvbXBhY3QiIGNsYXNzPSJzZWVyZmMiPicKLSAgICAgIC4gIlxuICAgIDxkdD48YSBocmVmPVwiJHVybFwiIgotICAgICAgLiAiXG4gICAgICAgIHRpdGxlPVwiJGF0dHJ0aXRsZVwiIgotICAgICAgLiAiXG4gICAgICAgID4kd2hhdCAkcmZjbnVtLCA8ZW0+JHRpdGxlPC9lbT4kaWNvbjwvYT4iCi0gICAgICAuICJcbiAgICA8ZGQ+JHRleHRcbiAgPC9kbD4iCi0gICAgICAuICRfOwotfQotCi1zdWIgZG9fY21kX3NlZXBlcHsKLSAgICByZXR1cm4gaGFuZGxlX3JmY2xpa2VfcmVmZXJlbmNlKCRfWzBdLCAiUEVQIiwgJFBFUF9GT1JNQVQpOwotfQotCi1zdWIgZG9fY21kX3NlZXJmY3sKLSAgICAjIFhYWCBXb3VsZCBiZSBuaWNlIHRvIGFkZCBsaW5rcyB0byB0aGUgdGV4dC9wbGFpbiBhbmQgUERGIHZlcnNpb25zLgotICAgIHJldHVybiBoYW5kbGVfcmZjbGlrZV9yZWZlcmVuY2UoJF9bMF0sICJSRkMiLCAkUkZDX0ZPUk1BVCk7Ci19Ci0KLXN1YiBkb19jbWRfc2VldGl0bGV7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbXkgJHVybCA9IG5leHRfb3B0aW9uYWxfYXJndW1lbnQoKTsKLSAgICBteSAkdGl0bGUgPSBuZXh0X2FyZ3VtZW50KCk7Ci0gICAgbXkgJHRleHQgPSBuZXh0X2FyZ3VtZW50KCk7Ci0gICAgaWYgKCR1cmwpIHsKLSAgICAgICAgbXkgJGljb24gPSBnZXRfbGlua19pY29uKCR1cmwpOwotICAgICAgICByZXR1cm4gJzxkbCBjb21wYWN0PSJjb21wYWN0IiBjbGFzcz0ic2VldGl0bGUiPicKLSAgICAgICAgICAuICJcbiAgICA8ZHQ+PGVtIGNsYXNzPVwiY2l0ZXRpdGxlXCI+PGEgaHJlZj1cIiR1cmxcIiIKLSAgICAgICAgICAuICJcbiAgICAgICAgPiR0aXRsZSRpY29uPC9hPjwvZW0+PC9kdD4iCi0gICAgICAgICAgLiAiXG4gICAgPGRkPiR0ZXh0PC9kZD5cbiAgPC9kbD4iCi0gICAgICAgICAgLiAkXzsKLSAgICB9Ci0gICAgcmV0dXJuICc8ZGwgY29tcGFjdD0iY29tcGFjdCIgY2xhc3M9InNlZXRpdGxlIj4nCi0gICAgICAuICJcbiAgICA8ZHQ+PGVtIGNsYXNzPVwiY2l0ZXRpdGxlXCIiCi0gICAgICAuICJcbiAgICAgICAgPiR0aXRsZTwvZW0+PC9kdD4iCi0gICAgICAuICJcbiAgICA8ZGQ+JHRleHQ8L2RkPlxuICA8L2RsPiIKLSAgICAgIC4gJF87Ci19Ci0KLXN1YiBkb19jbWRfc2VlbGlua3sKLSAgICBsb2NhbCgkXykgPSBAXzsKLSAgICBteSAkdXJsID0gbmV4dF9hcmd1bWVudCgpOwotICAgIG15ICRsaW5rdGV4dCA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkdGV4dCA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkaWNvbiA9IGdldF9saW5rX2ljb24oJHVybCk7Ci0gICAgcmV0dXJuICc8ZGwgY29tcGFjdD0iY29tcGFjdCIgY2xhc3M9InNlZXVybCI+JwotICAgICAgLiAiXG4gICAgPGR0PjxhIGhyZWY9JyR1cmwnIgotICAgICAgLiAiXG4gICAgICAgID4kbGlua3RleHQkaWNvbjwvYT48L2R0PiIKLSAgICAgIC4gIlxuICAgIDxkZD4kdGV4dDwvZGQ+XG4gIDwvZGw+IgotICAgICAgLiAkXzsKLX0KLQotc3ViIGRvX2NtZF9zZWV1cmx7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbXkgJHVybCA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkdGV4dCA9IG5leHRfYXJndW1lbnQoKTsKLSAgICBteSAkaWNvbiA9IGdldF9saW5rX2ljb24oJHVybCk7Ci0gICAgcmV0dXJuICc8ZGwgY29tcGFjdD0iY29tcGFjdCIgY2xhc3M9InNlZXVybCI+JwotICAgICAgLiAiXG4gICAgPGR0PjxhIGhyZWY9XCIkdXJsXCIiCi0gICAgICAuICJcbiAgICAgICAgY2xhc3M9XCJ1cmxcIj4kdXJsJGljb248L2E+PC9kdD4iCi0gICAgICAuICJcbiAgICA8ZGQ+JHRleHQ8L2RkPlxuICA8L2RsPiIKLSAgICAgIC4gJF87Ci19Ci0KLXN1YiBkb19jbWRfc2VldGV4dHsKLSAgICBsb2NhbCgkXykgPSBAXzsKLSAgICBteSAkY29udGVudCA9IG5leHRfYXJndW1lbnQoKTsKLSAgICByZXR1cm4gJzxkaXYgY2xhc3M9InNlZXRleHQiPjxwPicgLiAkY29udGVudCAuICc8L3A+PC9kaXY+JyAuICRfOwotfQotCi0KLSMKLSMgIERlZmluaXRpb24gbGlzdCBzdXBwb3J0LgotIwotCi1zdWIgZG9fZW52X2RlZmluaXRpb25zewotICAgIHJldHVybiAnPGRsIGNsYXNzPSJkZWZpbml0aW9ucyI+JyAuICRfWzBdIC4gIjwvZGw+XG4iOwotfQotCi1zdWIgZG9fY21kX3Rlcm17Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbXkgJHRlcm0gPSBuZXh0X2FyZ3VtZW50KCk7Ci0gICAgbXkoJG5hbWUsICRhbmFtZSwgJGFocmVmKSA9IG5ld19saW5rX2luZm8oKTsKLSAgICAjIGNvdWxkIGVhc2lseSBhZGQgYW4gaW5kZXggZW50cnkgaGVyZS4uLgotICAgIHJldHVybiAiPGR0PjxiPiRhbmFtZSIgLiAkdGVybSAuICI8L2E+PC9iPjwvZHQ+XG48ZGQ+IiAuICRfOwotfQotCi0KLSMgQ29tbWFuZHMgbGlzdGVkIGhlcmUgaGF2ZSBwcm9jZXNzLW9yZGVyIGRlcGVuZGVuY2llczsgdGhlc2Ugb2Z0ZW4KLSMgYXJlIHJlbGF0ZWQgdG8gaW5kZXhpbmcgb3BlcmF0aW9ucy4KLSMgWFhYIE5vdCBzdXJlIHdoeSBmdW5jbGluZW5pLCBtZXRob2RsaW5lbmksIGFuZCBzYW1wIGFyZSBoZXJlLgotIwotcHJvY2Vzc19jb21tYW5kc193cmFwX2RlZmVycmVkKDw8X1JBV19BUkdfREVGRVJSRURfQ01EU18pOwotZGVjbGFyZW1vZHVsZSAjIFtdICMge30gIyB7fQotZnVuY2xpbmUgIyB7fSAjIHt9Ci1mdW5jbGluZW5pICMge30gIyB7fQotbWVtYmVybGluZSAjIFtdICMge30KLW1ldGhvZGxpbmUgIyBbXSAjIHt9ICMge30KLW1ldGhvZGxpbmVuaSAjIFtdICMge30gIyB7fQotbW9kdWxlc3lub3BzaXMgIyB7fQotYmlmdW5jaW5kZXggIyB7fQotZXhpbmRleCAjIHt9Ci1pbmRleGlpICMge30gIyB7fQotaW5kZXhpaWkgIyB7fSAjIHt9ICMge30KLWluZGV4aXYgIyB7fSAjIHt9ICMge30gIyB7fQota3dpbmRleCAjIHt9Ci1vYmluZGV4ICMge30KLW9waW5kZXggIyB7fQotc3RpbmRleCAjIHt9Ci1wbGF0Zm9ybSAjIHt9Ci1zYW1wICMge30KLXNldGluZGV4c3ViaXRlbSAjIHt9Ci13aXRoc3ViaXRlbSAjIHt9ICMge30KLV9SQVdfQVJHX0RFRkVSUkVEX0NNRFNfCi0KLQotJGFsbHR0X3N0YXJ0ID0gJzxkaXYgY2xhc3M9InZlcmJhdGltIj48cHJlPic7Ci0kYWxsdHRfZW5kID0gJzwvcHJlPjwvZGl2Pic7Ci0KLXN1YiBkb19lbnZfYWxsdHR7Ci0gICAgbG9jYWwgKCRfKSA9IEBfOwotICAgIGxvY2FsKCRjbG9zdXJlcywkcmVvcGVucyxAb3Blbl9ibG9ja190YWdzKTsKLQotICAgICMgZ2V0IHRoZSB0YWctc3RyaW5ncyBmb3IgYWxsIG9wZW4gdGFncwotICAgIGxvY2FsKEBrZWVwX29wZW5fdGFncykgPSBAJG9wZW5fdGFnc19SOwotICAgICgkY2xvc3VyZXMsJHJlb3BlbnMpID0gJnByZXNlcnZlX29wZW5fdGFncygpIGlmIChAJG9wZW5fdGFnc19SKTsKLQotICAgICMgZ2V0IHRoZSB0YWdzIGZvciB0ZXh0LWxldmVsIHRhZ3Mgb25seQotICAgICRvcGVuX3RhZ3NfUiA9IFsgQGtlZXBfb3Blbl90YWdzIF07Ci0gICAgbG9jYWwoJGxvY2FsX2Nsb3N1cmVzLCAkbG9jYWxfcmVvcGVucyk7Ci0gICAgKCRsb2NhbF9jbG9zdXJlcywgJGxvY2FsX3Jlb3BlbnMsQG9wZW5fYmxvY2tfdGFncykKLSAgICAgID0gJnByZXNlcnZlX29wZW5fYmxvY2tfdGFncwotICAgICAgICBpZiAoQCRvcGVuX3RhZ3NfUik7Ci0KLSAgICAkb3Blbl90YWdzX1IgPSBbIEBvcGVuX2Jsb2NrX3RhZ3MgXTsKLQotICAgIGRvIHsKLSAgICAgICAgbG9jYWwoJG9wZW5fdGFnc19SKSA9IFsgQG9wZW5fYmxvY2tfdGFncyBdOwotICAgICAgICBsb2NhbChAc2F2ZV9vcGVuX3RhZ3MpID0gKCk7Ci0KLSAgICAgICAgbG9jYWwoJGNudCkgPSArKyRnbG9iYWx7J21heF9pZCd9OwotICAgICAgICAkXyA9IGpvaW4oJycsIiRPJGNudCRDXFx0dCRPIiwgKyskZ2xvYmFseydtYXhfaWQnfSwgJEMKLSAgICAgICAgICAgICAgICAsICRfICwgJE8sICRnbG9iYWx7J21heF9pZCd9LCAiJEMkTyRjbnQkQyIpOwotCi0gICAgICAgICRfID0gJnRyYW5zbGF0ZV9lbnZpcm9ubWVudHMoJF8pOwotICAgICAgICAkXyA9ICZ0cmFuc2xhdGVfY29tbWFuZHMoJF8pIGlmICgvXFwvKTsKLQotICAgICAgICAjIHJlbW92ZSBzcHVyaW91cyA8QlI+IHNvbWVvbmUgc3RpY2tzIGluOyBub3Qgc3VyZSB3aGVyZSB0aGV5Ci0gICAgICAgICMgYWN0dWFsbHkgY29tZSBmcm9tCi0gICAgICAgICMgWFhYIHRoZSByZXBsYWNlbWVudCBzcGFjZSBpcyB0aGVyZSB0byBhY2NvbW9kYXRlIHNvbWV0aGluZwotICAgICAgICAjIGJyb2tlbiB0aGF0IGluc2VydHMgYSBzcGFjZSBpbiBmcm9udCBvZiB0aGUgZmlyc3QgbGluZSBvZgotICAgICAgICAjIHRoZSBlbnZpcm9ubWVudAotICAgICAgICBzLzxCUj4vIC9naTsKLQotICAgICAgICAkXyA9IGpvaW4oJycsICRjbG9zdXJlcywgJGFsbHR0X3N0YXJ0LCAkbG9jYWxfcmVvcGVucwotICAgICAgICAgICAgICAgICwgJF8KLSAgICAgICAgICAgICAgICAsICZiYWxhbmNlX3RhZ3MoKSAjLCAkbG9jYWxfY2xvc3VyZXMKLSAgICAgICAgICAgICAgICAsICRhbGx0dF9lbmQsICRyZW9wZW5zKTsKLSAgICAgICAgdW5kZWYgJG9wZW5fdGFnc19SOyB1bmRlZiBAc2F2ZV9vcGVuX3RhZ3M7Ci0gICAgfTsKLSAgICAkb3Blbl90YWdzX1IgPSBbIEBrZWVwX29wZW5fdGFncyBdOwotICAgIHJldHVybiBjb2RldGV4dCgkXyk7Ci19Ci0KLSMgTGlzdCBvZiBhbGwgZmlsZW5hbWVzIHByb2R1Y2VkIGJ5IGRvX2NtZF92ZXJiYXRpbWlucHV0KCkKLSVWZXJiYXRpbUZpbGVzID0gKCk7Ci1AVmVyYmF0aW1PdXRwdXRzID0gKCk7Ci0KLXN1YiBnZXRfdmVyYmF0aW1fb3V0cHV0X25hbWUoJCl7Ci0gICAgbXkgJGZpbGUgPSAkX1swXTsKLSAgICAjCi0gICAgIyBSZS13cml0ZSB0aGUgc291cmNlIGZpbGVuYW1lIHRvIGFsd2F5cyB1c2UgYSAudHh0IGV4dGVuc2lvbgotICAgICMgc28gdGhhdCBXZWIgc2VydmVycyB3aWxsIHByZXNlbnQgaXQgYXMgdGV4dC9wbGFpbi4gIFRoaXMgaXMKLSAgICAjIG5lZWRlZCBzaW5jZSB0aGVyZSBpcyBubyBvdGhlciBldmVuIG1vZGVyYXRlbHkgcmVsaWFibGUgd2F5Ci0gICAgIyB0byBnZXQgdGhlIHJpZ2h0IENvbnRlbnQtVHlwZSBoZWFkZXIgb24gdGV4dCBmaWxlcyBmb3IKLSAgICAjIHNlcnZlcnMgd2hpY2ggd2UgY2FuJ3QgY29uZmlndXJlIChsaWtlIHB5dGhvbi5vcmcgbWlycm9ycykuCi0gICAgIwotICAgIGlmIChkZWZpbmVkICRWZXJiYXRpbUZpbGVzeyRmaWxlfSkgewotICAgICAgICAjIFdlJ3ZlIHNlZW4gdGhpcyBvbmUgYmVmb3JlOyByZS11c2UgdGhlIHNhbWUgb3V0cHV0IGZpbGUuCi0gICAgICAgIHJldHVybiAkVmVyYmF0aW1GaWxlc3skZmlsZX07Ci0gICAgfQotICAgIG15KCRzcmNuYW1lLCAkc3JjZGlyLCAkc3JjZXh0KSA9IGZpbGVwYXJzZSgkZmlsZSwgJ1wuLionKTsKLSAgICAkZmlsZW5hbWUgPSAiJHNyY25hbWUudHh0IjsKLSAgICAjCi0gICAgIyBXZSBuZWVkIHRvIGRldGVybWluZSBpZiBvdXIgZGVmYXVsdCBmaWxlbmFtZSBpcyBhbHJlYWR5Ci0gICAgIyBiZWluZyB1c2VkLCBhbmQgZmluZCBhIG5ldyBvbmUgaXQgaXQgaXMuICBJZiB0aGUgbmFtZSBpcyBpbgotICAgICMgdXNlZCwgdGhpcyBhbGdvcml0aG0gd2lsbCBmaXJzdCBhdHRlbXB0IHRvIGluY2x1ZGUgdGhlCi0gICAgIyBzb3VyY2UgZXh0ZW5zaW9uIGFzIHBhcnQgb2YgdGhlIG5hbWUsIGFuZCBpZiB0aGF0IGlzIGFsc28gaW4KLSAgICAjIHVzZSAoaWYgdGhlIHNhbWUgZmlsZSBpcyBpbmNsdWRlZCBtdWx0aXBsZSB0aW1lcywgb3IgaWYKLSAgICAjIGFub3RoZXIgc291cmNlIGZpbGUgaGFzIHRoYXQgYXMgdGhlIGJhc2UgbmFtZSksIGEgY291bnRlciBpcwotICAgICMgdXNlZCBpbnN0ZWFkLgotICAgICMKLSAgICBteSAkZm91bmQgPSAxOwotICBGSU5EOgotICAgIHdoaWxlICgkZm91bmQpIHsKLSAgICAgICAgZm9yZWFjaCAkZm4gKEBWZXJiYXRpbU91dHB1dHMpIHsKLSAgICAgICAgICAgIGlmICgkZm4gZXEgJGZpbGVuYW1lKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCRmb3VuZCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICRzcmNleHQgPX4gcy9eWy5dLy87ICAjIFJlbW92ZSAnLicgZnJvbSBleHRlbnNpb24KLSAgICAgICAgICAgICAgICAgICAgJGZpbGVuYW1lID0gIiRzcmNuYW1lLSRzcmNleHQudHh0IjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICRmaWxlbmFtZSA9ICIkc3JjbmFtZS0kZm91bmQudHh0IjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKyskZm91bmQ7Ci0gICAgICAgICAgICAgICAgbmV4dCBGSU5EOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICRmb3VuZCA9IDA7Ci0gICAgfQotICAgIHB1c2ggQFZlcmJhdGltT3V0cHV0cywgJGZpbGVuYW1lOwotICAgICRWZXJiYXRpbUZpbGVzeyRmaWxlfSA9ICRmaWxlbmFtZTsKLSAgICByZXR1cm4gJGZpbGVuYW1lOwotfQotCi1zdWIgZG9fY21kX3ZlcmJhdGltaW5wdXR7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgbXkgJGZuYW1lID0gbmV4dF9hcmd1bWVudCgpOwotICAgIG15ICRmaWxlOwotICAgIG15ICRmb3VuZCA9IDA7Ci0gICAgbXkgJHRleHBhdGg7Ci0gICAgIyBTZWFyY2ggVEVYSU5QVVRTIGZvciB0aGUgaW5wdXQgZmlsZSwgdGhlIHdheSB3ZSdyZSBzdXBwb3NlZCB0bzoKLSAgICBmb3JlYWNoICR0ZXhwYXRoIChzcGxpdCAvJGVudmtleS8sICRURVhJTlBVVFMpIHsKLSAgICAgICAgJGZpbGUgPSAiJHRleHBhdGgkZGQkZm5hbWUiOwotICAgICAgICBsYXN0IGlmICgkZm91bmQgPSAoLWYgJGZpbGUpKTsKLSAgICB9Ci0gICAgbXkgJGZpbGVuYW1lID0gJyc7Ci0gICAgbXkgJHRleHQ7Ci0gICAgaWYgKCRmb3VuZCkgewotICAgICAgICBvcGVuKE1ZRklMRSwgIjwkZmlsZSIpIHx8IGRpZSAiXG4kIVxuIjsKLSAgICAgICAgcmVhZChNWUZJTEUsICR0ZXh0LCAxMDI0KjEwMjQpOwotICAgICAgICBjbG9zZShNWUZJTEUpOwotICAgICAgICAkZmlsZW5hbWUgPSBnZXRfdmVyYmF0aW1fb3V0cHV0X25hbWUoJGZpbGUpOwotICAgICAgICAjIE5vdyB0aGF0IHdlIGhhdmUgYSBmaWxlbmFtZSwgd3JpdGUgaXQgb3V0LgotICAgICAgICBvcGVuKE1ZRklMRSwgIj4kZmlsZW5hbWUiKTsKLSAgICAgICAgcHJpbnQgTVlGSUxFICR0ZXh0OwotICAgICAgICBjbG9zZShNWUZJTEUpOwotICAgICAgICAjCi0gICAgICAgICMgVGhlc2UgcmV3cml0ZXMgY29udmVydCB0aGUgcmF3IHRleHQgdG8gc29tZXRoaW5nIHRoYXQgd2lsbAotICAgICAgICAjIGJlIHByb3Blcmx5IHZpc2libGUgYXMgSFRNTCBhbmQgYWxzbyB3aWxsIHBhc3MgdGhyb3VnaCB0aGUKLSAgICAgICAgIyB2YWdhcmllcyBvZiBjb252ZXJzaW9uIHRocm91Z2ggTGFUZVgySFRNTC4gIFRoZSBvcmRlciBpbgotICAgICAgICAjIHdoaWNoIHRoZSBzcGVjaWZpYyByZXdyaXRlcyBhcmUgcGVyZm9ybWVkIGlzIHNpZ25pZmljYW50LgotICAgICAgICAjCi0gICAgICAgICR0ZXh0ID1+IHMvXCYvXCZhbXA7L2c7Ci0gICAgICAgICMgVGhlc2UgbmVlZCB0byBoYXBwZW4gYmVmb3JlIHRoZSBub3JtYWwgPCBhbmQgPiByZS13cml0ZXMsCi0gICAgICAgICMgc2luY2Ugd2UgbmVlZCB0byBhdm9pZCBMYVRlWDJIVE1MJ3MgYXR0ZW1wdCB0byBwZXJmb3JtCi0gICAgICAgICMgbGlnYXR1cmUgcHJvY2Vzc2luZyB3aXRob3V0IHJlZ2FyZCB0byBjb250ZXh0IChzaW5jZSBpdAotICAgICAgICAjIGRvZXNuJ3QgaGF2ZSBmb250IGluZm9ybWF0aW9uKS4KLSAgICAgICAgJHRleHQgPX4gcy8tLS8tJlwjNDU7L2c7Ci0gICAgICAgICR0ZXh0ID1+IHMvPDwvXCZsdDtcJlwjNjA7L2c7Ci0gICAgICAgICR0ZXh0ID1+IHMvPj4vXCZndDtcJlwjNjI7L2c7Ci0gICAgICAgICMgSnVzdCBub3JtYWwgcmUtd3JpdGVzLi4uCi0gICAgICAgICR0ZXh0ID1+IHMvPC9cJmx0Oy9nOwotICAgICAgICAkdGV4dCA9fiBzLz4vXCZndDsvZzsKLSAgICAgICAgIyBUaGVzZSBsYXN0IGlzbid0IG5lZWRlZCBmb3IgdGhlIEhUTUwsIGJ1dCBpcyBuZWVkZWQgdG8gZ2V0Ci0gICAgICAgICMgcGFzdCBMYVRlWDJIVE1MIHByb2Nlc3NpbmcgVGVYIG1hY3Jvcy4gIFdlIHVzZSAmIzkyOyBpbnN0ZWFkCi0gICAgICAgICMgb2YgJnNvbDsgc2luY2UgbWFueSBicm93c2VycyBkb24ndCBzdXBwb3J0IHRoYXQuCi0gICAgICAgICR0ZXh0ID1+IHMvXFwvXCZcIzkyOy9nOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgcmV0dXJuICc8Yj5Db3VsZCBub3QgbG9jYXRlIHJlcXVlc3RlZCBmaWxlIDxpPiRmbmFtZTwvaT4hPC9iPlxuJzsKLSAgICB9Ci0gICAgbXkgJG5vdGUgPSAnRG93bmxvYWQgYXMgdGV4dC4nOwotICAgIGlmICgkZmlsZSBuZSAkZmlsZW5hbWUpIHsKLSAgICAgICAgJG5vdGUgPSAoJ0Rvd25sb2FkIGFzIHRleHQgKG9yaWdpbmFsIGZpbGUgbmFtZTogPHNwYW4gY2xhc3M9ImZpbGUiPicKLSAgICAgICAgICAgICAgICAgLiAkZm5hbWUKLSAgICAgICAgICAgICAgICAgLiAnPC9zcGFuPikuJyk7Ci0gICAgfQotICAgIHJldHVybiAoIjxkaXYgY2xhc3M9XCJ2ZXJiYXRpbVwiPlxuPHByZT4iCi0gICAgICAgICAgICAuICR0ZXh0Ci0gICAgICAgICAgICAuICI8L3ByZT5cbjxkaXYgY2xhc3M9XCJmb290ZXJcIj5cbiIKLSAgICAgICAgICAgIC4gIjxhIGhyZWY9XCIkZmlsZW5hbWVcIiB0eXBlPVwidGV4dC9wbGFpblwiIgotICAgICAgICAgICAgLiAiPiRub3RlPC9hPiIKLSAgICAgICAgICAgIC4gIlxuPC9kaXY+PC9kaXY+IgotICAgICAgICAgICAgLiAkXyk7Ci19Ci0KLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGlzIG11c3QgYmUgdGhlIGxhc3QgbGluZQpkaWZmIC0tZ2l0IGEvRG9jL3B5dGhvbi1kb2NzLnR4dCBiL0RvYy9weXRob24tZG9jcy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNDc1YjYuLjAwMDAwMDAKLS0tIGEvRG9jL3B5dGhvbi1kb2NzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi1UaGlzIG1lc3NhZ2UgaXMgYmVpbmcgc2VudCBpbiByZXNwb25zZSB0byB5b3VyIG1lc3NhZ2UgdG8gdGhlIFB5dGhvbgotZG9jdW1lbnRhdGlvbiBtYWludGFpbmVycyAoZG9jc0BweXRob24ub3JnKS4gIFlvdXIgbWVzc2FnZSB3aWxsCi1iZSBoYW5kbGVkIGJ5IGEgaHVtYW4sIGJ1dCB0aGlzIG1lc3NhZ2Ugc2VydmVzIHRvIGFuc3dlciB0aGUgbW9zdAotY29tbW9uIHF1ZXN0aW9ucyBzZW50IHRvIHRoaXMgYWRkcmVzcy4KLQotWW91IHdpbGwgb25seSByZWNlaXZlIHRoaXMgbWVzc2FnZSBpZiBpdCBoYXMgbm90IGJlZW4gc2VudCB0byB5b3UgZm9yCi1hdCBsZWFzdCB0aHJlZSBtb250aHMuCi0KLUlmIHlvdXIgcXVlc3Rpb24gaXMgYW5zd2VyZWQgYmVsb3csIHlvdSBtYXkgbm90IHJlY2VpdmUgYW4gYWRkaXRpb25hbAotbWVzc2FnZSBmcm9tIHRoZSBkb2N1bWVudGF0aW9uIG1haW50YWluZXJzLiAgSWYgeW91IGZlZWwgdGhlIGFuc3dlcnMKLWJlbG93IGFyZSBub3Qgc3VmZmljaWVudCBhbmQgeW91IGRvIG5vdCByZWNlaXZlIGFuIGFkZGl0aW9uYWwgcmVzcG9uc2UKLXdpdGhpbiBhIHdlZWssIHBsZWFzZSBkbyBzZW5kIGEgbm90ZSBsZXR0aW5nIHVzIGtub3cgdGhhdCB5b3VyCi1xdWVzdGlvbiBoYXMgbm90IGJlZW4gcHJvcGVybHkgYW5zd2VyZWQsIGFuZCBiZSBzcGVjaWZpYyByZWdhcmRpbmcKLXdoYXQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB5b3UgYXJlIGxvb2tpbmcgZm9yLgotCi0KLSAgLUZyZWQKLQotCi1GcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucyBhYm91dCB0aGUgUHl0aG9uIERvY3VtZW50YXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIDEuICBDYW4gSSBkb3dubG9hZCBIVE1ML1BERi9Qb3N0U2NyaXB0IHZlcnNpb25zIG9mIHRoZSBkb2NzPwotICAyLiAgV2hlcmUgY2FuIEkgZG93bmxvYWQgUHl0aG9uPwotICAzLiAgSSBjYW4ndCB1bnBhY2sgYSBkb3dubG9hZGVkIGNvcHkgb24gV2luZG93czsgd2hhdCBzaG91bGQgSSBkbz8KLSAgNC4gIEkgY2FuJ3QgdW5wYWNrIGEgZG93bmxvYWRlZCBjb3B5IG9uIE1hYyBPUzsgd2hhdCBzaG91bGQgSSBkbz8KLSAgNS4gIFdoYXQgY2FuIEkgdXNlIFB5dGhvbiBmb3I/Ci0gIDYuICBIb3cgZG8gSSB1c2UgbW9kdWxlL2Z1bmN0aW9uL3doYXRldmVyIFhYWD8KLSAgNy4gIFdoYXQgYWJvdXQgSlB5dGhvbj8KLSAgOC4gIEkgZm91bmQgYSBidWcgaW4gdGhlIGRvY3VtZW50YXRpb24sIHdobyBzaG91bGQgSSB0ZWxsPwotICA5LiAgQ2FuIEkgZ2V0IGFuIGFsZ29yaXRobSB0byBkbyBUSElTIGluIGxhbmd1YWdlIFRIQVQ/Ci0gMTAuICBIb3cgZG8gSSBkZWNvZGUgYW4gWFhYIGZpbGUgZnJvbSBteSBlbWFpbCBvbiBhIFlZWSBjb21wdXRlcj8KLSAxMS4gIEFjcm9iYXQgUmVhZGVyIHdvbid0IHByaW50IHRoZSBQREYuICBXaGF0J3Mgd3Jvbmc/Ci0gMTIuICBXaGVyZSBjYW4gSSBmaW5kIGRvY3VtZW50YXRpb24gaW4gbXkgbmF0aXZlIGxhbmd1YWdlPwotIDEzLiAgV2h5IGlzIFB5dGhvbiBpbnN0YWxsZWQgb24gbXkgY29tcHV0ZXI/Ci0KLQotQW5zd2VycyB0byB0aGUgUXVlc3Rpb25zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAxLiAgQ2FuIEkgZG93bmxvYWQgSFRNTC9QREYvUG9zdFNjcmlwdC88b3RoZXI+IHZlcnNpb25zIG9mIHRoZSBkb2NzPwotCi0gICAgICBZZXMuICBUaGVzZSBhcmUgYXZhaWxhYmxlIHZpYSB0aGUgV2ViIGFuZCB0cmFkaXRpb25hbCBGVFAuICBGb3IKLSAgICAgIFdlYiBhY2Nlc3MgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uLCBzZWU6Ci0KLQkgIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvCi0KLSAgICAgIEZvciBGVFAgYWNjZXNzIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBhbmQgYXJjaGl2ZXMgb2YgcHJldmlvdXMKLSAgICAgIHZlcnNpb25zLCBzZWU6Ci0KLSAgICAgICAgICBmdHAucHl0aG9uLm9yZzovcHViL3B5dGhvbi9kb2MvCi0KLSAgMi4gIFdoZXJlIGNhbiBJIGRvd25sb2FkIFB5dGhvbj8KLQotICAgICAgWW91IGNhbiBnZXQgUHl0aG9uIGluIHNvdXJjZSBmb3JtIGFuZCBhcyBhIFdpbmRvd3MgaW5zdGFsbGVyCi0gICAgICBmcm9tIHRoZSBtYWluIFB5dGhvbiB3ZWJzaXRlLiAgWW91IGNhbiBhbHNvIGZpbmQgaW5mb3JtYXRpb24KLSAgICAgIGFib3V0IHByZS1idWlsdCBwYWNrYWdlcyBmb3Igb3RoZXIgcGxhdGZvcm1zIHRoZXJlIGFzIHdlbGwuCi0KLSAgICAgIERvd25sb2FkaW5nIGluZm9ybWF0aW9uIGF0IHRoZSB3ZWJzaXRlIGlzIGF0IHRoZSBVUkw6Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG93bmxvYWQvCi0KLSAgICAgIFRoZSBzb3VyY2VzIGFuZCBXaW5kb3dzIGluc3RhbGxlciBjYW4gYmUgZG93bmxvYWRlZCBmcm9tIHRoZSBGVFAKLSAgICAgIHNpdGUgYXMgd2VsbDoKLQotICAgICAgICAgIGZ0cDovL2Z0cC5weXRob24ub3JnL3B1Yi9weXRob24vCi0KLSAgMy4gIEkgY2FuJ3QgdW5wYWNrIGEgZG93bmxvYWRlZCBhcmNoaXZlIG9uIFdpbmRvd3M7IHdoYXQgc2hvdWxkIEkgZG8/Ci0KLSAgICAgIE1ha2Ugc3VyZSB0aGUgYXJjaGl2ZSB3YXMgc2F2ZWQgd2l0aCB0aGUgLnRneiBleHRlbnNpb247IHlvdSBtYXkgCi0gICAgICBuZWVkIHRvIHdhdGNoIGNhcmVmdWxseSB3aGVuIHRlbGxpbmcgdGhlIGJyb3dzZXIgd2hlcmUgdG8gc2F2ZQotICAgICAgdGhlIGZpbGUsIGFzIHRoZSBkZWZhdWx0IG1heSBjaGFuZ2UgdGhlIGV4dGVuc2lvbiB0byAudGFyIG9yCi0gICAgICBldmVuIC5leGUuCi0KLSAgICAgIE9uY2UgeW91J3JlIHN1cmUgdGhlIGZpbGUgaGFzIHRoZSByaWdodCBleHRlbnNpb24sIHVzZSBhIHJlY2VudAotICAgICAgdmVyc2lvbiBvZiBXaW5aaXAgdG8gdXBhY2sgdGhlIGZpbGUgKHZlcnNpb24gNy4wIHdvcmtzKS4gIEdldAotICAgICAgV2luWmlwIGZyb206Ci0KLQkgIGh0dHA6Ly93d3cud2luemlwLmNvbS8KLQotICA0LiAgSSBjYW4ndCB1bnBhY2sgYSBkb3dubG9hZGVkIGFyY2hpdmUgb24gTWFjIE9TOyB3aGF0IHNob3VsZCBJIGRvPwotCi0gICAgICBTdHVmZml0IEV4cGFuZGVyIDQuNSAoYW5kIHByb2JhYmx5IG90aGVyIHZlcnNpb25zKSBjYW5ub3QgaGFuZGxlIAotICAgICAgdGhlICJ0YXIiIGFyY2hpdmUsIGFsdGhvdWdoIGl0IGNhbiBkZWNvbXByZXNzIGl0IGZyb20gdGhlIC50Z3oKLSAgICAgIGZpbGUuICBFeHBhbmRlciBFbmhhbmNlciwgd2hpY2ggeW91IGhhdmUgdG8gcGF5IGZvciwgY2FuIGhhbmRsZQotICAgICAgdGhlIHRhciBhcmNoaXZlLgotCi0gIDUuICBXaGF0IGNhbiBJIHVzZSBQeXRob24gZm9yPwotCi0gICAgICBQeXRob24gaXMgYSBnZW5lcmFsIHB1cnBvc2UgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuICBTZWUgdGhlCi0gICAgICBQeXRob24gaG9tZSBwYWdlIGF0IGh0dHA6Ly93d3cucHl0aG9uLm9yZy8gZm9yIG1vcmUgaW5mb3JtYXRpb247IAotICAgICAgaW50cm9kdWN0b3J5IG1hdGVyaWFsIGlzIGF2YWlsYWJsZSBhdDoKLQotCSAgaHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9JbnRyb3MuaHRtbAotCi0gIDYuICBIb3cgZG8gSSB1c2UgbW9kdWxlL2Z1bmN0aW9uL3doYXRldmVyIFhYWD8KLQotICAgICAgU3RhcnQgYnkgcmVhZGluZyB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgWFhYLiAgSWYgdGhlCi0gICAgICBkb2N1bWVudGF0aW9uIGRvZXNuJ3QgbWFrZSBzZW5zZSBvciBzZWVtcyBpbmNvbXBsZXRlLCBwbGVhc2UKLSAgICAgIGZpbGUgYSBzcGVjaWZpYyBidWcgcmVwb3J0IHRvIGRvY3NAcHl0aG9uLm9yZyAodGhlCi0gICAgICBhZGRyZXNzIHlvdSBzZW50IHlvdXIgcXVlc3Rpb24gdG8pLiAgT3RoZXJ3aXNlLCB5b3UgcHJvYmFibHkKLSAgICAgIHNlbnQgeW91ciBxdWVzdGlvbiB0byB0aGUgd3JvbmcgcGxhY2UgKHdoaWNoIGRvZXMgbm90IHByZWNsdWRlCi0gICAgICBhbiBhbnN3ZXIsIGlmIEkga25vdyBpdCkuCi0KLSAgICAgIElmIHlvdSdyZSBsb29raW5nIGZvciBleGFtcGxlcyBvciB0dXRvcmlhbCBpbmZvcm1hdGlvbiBvbiBob3cgdG8KLSAgICAgIHVzZSBhIHBhcnRpY3VsYXIgUHl0aG9uIGxpYnJhcnkgY29tcG9uZW50LCBjaGVjayB0aGUgRGVtby8KLSAgICAgIGRpcmVjdG9yeSBvZiB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbiBvciBXaW5kb3dzIGluc3RhbGxhdGlvbjsKLSAgICAgIHRoZXJlIG1pZ2h0IGJlIGFuIGV4YW1wbGUuICBJZiB0aGF0IGRvZXNuJ3QgaGVscCwgcG9pbnQgeW91ciBXZWIKLSAgICAgIGJyb3dzZXIgdG8gaHR0cDovL3d3dy5weXRob24ub3JnL2RvYy8gYW5kIGxvb2sgYXJvdW5kOyB0aGVyZSBtYXkKLSAgICAgIGJlIGEgbGluayB0byBzb21lIGludGVyZXN0aW5nIGV4YW1wbGVzIG9ubGluZS4gIEFmdGVyIHRoYXQsIHRyeQotICAgICAgc2VhcmNoaW5nIHRoZSBQeXRob24gV2ViIHNpdGUgYXQgaHR0cDovL3d3dy5weXRob24ub3JnL3NlYXJjaC8uCi0KLSAgICAgIElmIHlvdXIgcXVlc3Rpb24gc3RpbGwgaGFzbid0IGJlZW4gYW5zd2VyZWQsIHlvdSBtYXkgc2VuZCB5b3VyCi0gICAgICBxdWVyeSB0byB0aGUgUHl0aG9uIG5ld3Nncm91cCAoY29tcC5sYW5nLnB5dGhvbikgb3IgdGhlIG1haWxpbmcKLSAgICAgIGxpc3QgKHNlZSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvbWFpbG1hbi9saXN0aW5mby9weXRob24tbGlzdCkuCi0gICAgICBJZiB5b3UnZCByYXRoZXIgbm90IHNlbmQgeW91IG1lc3NhZ2UgdG8gYSBwdWJsaWMgZm9ydW0sIHlvdSBjYW4KLSAgICAgIHRyeSBzZW5kaW5nIGl0IHRvIHB5dGhvbi1oZWxwQHB5dGhvbi5vcmcuICAoVGhpcyBpcyB0eXBpY2FsbHkKLSAgICAgIHNsb3dlciB0aGFuIHNlbmRpbmcgeW91ciBxdWVzdGlvbiB0byB0aGUgcHVibGljIGxpc3QsIGhvd2V2ZXIuKQotCi0gIDcuICBXaGF0IGFib3V0IEp5dGhvbiBhbmQgSlB5dGhvbj8KLQotICAgICAgSWYgeW91ciBxdWVzdGlvbiBpcyBzcGVjaWZpYyB0byBKeXRob24gb3IgSlB5dGhvbiwgeW91IHNob3VsZAotICAgICAgY29uc3VsdCB0aGUgSnl0aG9uIHdlYnNpdGUgYXQ6Ci0KLQkgIGh0dHA6Ly93d3cuanl0aG9uLm9yZy8KLQotICAgICAgQ2hhbmNlcyBhcmUgdmVyeSBnb29kIHRoYXQgdGhlIHBlcnNvbiB3aG8gYW5zd2VycyBxdWVzdGlvbnMKLSAgICAgIHBvc3RlZCB0byBkb2NzQHB5dGhvbi5vcmcgZG9lc24ndCB1c2UgSnl0aG9uIHZlcnkgb2Z0ZW4sIAotICAgICAgYW5kIHdvbid0IGJlIGFibGUgdG8gZ2l2ZSB5b3UgYSBtZWFuaW5nZnVsIGFuc3dlciBiZXlvbmQgIkxvb2sKLSAgICAgIGF0IHRoZSBKeXRob24gd2Vic2l0ZS4iICBTb3JyeSwgSSBkb24ndCBoYXZlICphbGwqIHRoZSBhbnN3ZXJzIQotCi0gIDguICBJIGZvdW5kIGEgYnVnIGluIHRoZSBkb2N1bWVudGF0aW9uLCB3aG8gc2hvdWxkIEkgdGVsbD8KLQotICAgICAgSWYgeW91J3JlIHJlYWRpbmcgdGhpcywgeW91J3ZlIGZvdW5kIHRoZSByaWdodCBhZGRyZXNzISAgU2VuZAotICAgICAgYWxsIGRvY3VtZW50YXRpb24gYnVnIHJlcG9ydHMgdG8gZG9jc0BweXRob24ub3JnLiAgSWYKLSAgICAgIHlvdSBwcmVmZXIgdG8gdXNlIGEgV2ViLWJhc2VkIHJlcG9ydGluZyBtZWNoYW5pc20sIHlvdSBjYW4gdXNlCi0gICAgICB0aGUgYnVnIGRhdGFiYXNlIGF0IGh0dHA6Ly93d3cucHl0aG9uLm9yZy9weXRob24tYnVncy8uCi0KLSAgOS4gIENhbiBJIGdldCBhbiBhbGdvcml0aG0gdG8gZG8gVEhJUyBpbiBsYW5ndWFnZSBUSEFUPwotCi0gICAgICBJZiBUSEFUIGlzIFB5dGhvbiwgbG9vayBpbiB0aGUgc3RhbmRhcmQgbGlicmFyeS4gIElmIFRIQVQgaXNuJ3QKLSAgICAgIFB5dGhvbiwgdXNlIHlvdXIgZmF2b3JpdGUgSW50ZXJuZXQgc2VhcmNoIGVuZ2luZS4KLQotIDEwLiAgSG93IGRvIEkgZGVjb2RlIGFuIFhYWCBmaWxlIGZyb20gbXkgZW1haWwgb24gYSBZWVkgY29tcHV0ZXI/Ci0KLSAgICAgIEkgcmVhbGx5LCBob25lc3RseSBkbyBub3Qga25vdy4gIEkgZG9uJ3QgZXZlbiBrbm93IHdoeSB0aGlzCi0gICAgICBxdWVzdGlvbiBnZXRzIGFza2VkIGhlcmUuICBTaW5jZSBJIGRvbid0IGhhdmUgYSBZWVkgY29tcHV0ZXIsCi0gICAgICBJIGNvdWxkbid0IGV2ZW4gdHJ5IGEgZmV3IHRoaW5ncyBvdXQgZm9yIHlvdS4KLQotIDExLiAgQWNyb2JhdCBSZWFkZXIgd29uJ3QgcHJpbnQgdGhlIFBERi4gIFdoYXQncyB3cm9uZz8KLQotICAgICAgQWRvYmUgaGFzIHJlcG9ydGVkbHkgYWRtaXR0ZWQgdGhhdCB0aGVyZSBpcyBhIGJ1ZyBpbiBBY3JvYmF0IFJlYWRlcgotICAgICAgNS4wIHdoaWNoIGNhdXNlcyBpdCBub3QgdG8gcHJpbnQgYXQgbGVhc3Qgc29tZSBQREYgZmlsZXMKLSAgICAgIGdlbmVyYXRlZCBieSBwZGZUZVguICBUaGlzIHNvZnR3YXJlIGlzIHVzZWQgdG8gcHJvZHVjZSB0aGUgUERGCi0gICAgICB2ZXJzaW9uIG9mIHRoZSBQeXRob24gZG9jdW1lbnRhdGlvbiwgYW5kIG91ciBkb2N1bWVudHMKLSAgICAgIGRlZmluYXRlbHkgdHJpZ2dlciB0aGlzIGJ1ZyBpbiBBY3JvYmF0IFJlYWRlci4gIFRvIHByaW50IHRoZSBQREYKLSAgICAgIGZpbGVzLCB1c2UgQWNyb2JhdCBSZWFkZXIgNC54LCBnaG9zdHNjcmlwdCwgb3IgeHBkZi4KLQotICAgICAgSW5mb3JtYXRpb24gb24gZ2hvc3RzY3JpcHQgY2FuIGJlIGZvdW5kIGF0OgotCi0gICAgICAgICAgaHR0cDovL3d3dy5naG9zdHNjcmlwdC5jb20vCi0KLSAgICAgIEluZm9ybWF0aW9uIG9uIHhwZGYgY2FuIGJlIGZvdW5kIGF0OgotCi0gICAgICAgICAgaHR0cDovL3d3dy5mb29sYWJzLmNvbS94cGRmLwotCi0gMTIuICBXaGVyZSBjYW4gSSBmaW5kIGRvY3VtZW50YXRpb24gaW4gbXkgbmF0aXZlIGxhbmd1YWdlPwotCi0gICAgICBUaGVyZSBpcyBhIGxvdCBvZiBjb250cmlidXRlZCBkb2N1bWVudGF0aW9uIGluIGxhbmd1YWdlcyBvdGhlcgotICAgICAgdGhhbiBFbmdsaXNoLiAgU29tZSBvZiB0aGUgZG9jdW1lbnRzIGFyZSB0cmFuc2xhdGlvbnMgb2YgRW5nbGlzaAotICAgICAgZG9jdW1lbnRzLCBhbmQgb3RoZXJzIHdlcmUgb3JpZ2luYWxseSBhdXRob3JlZCBpbiBvdGhlcgotICAgICAgbGFuZ3VhZ2VzLiAgSWYgd2Uga25vdyBhYm91dCBpdCwgaXQgd2lsbCBiZSBsaXN0ZWQgYXQ6Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jL05vbkVuZ2xpc2guaHRtbAotCi0gMTMuICBXaHkgaXMgUHl0aG9uIGluc3RhbGxlZCBvbiBteSBjb21wdXRlcj8KLQotICAgICAgV2UncmUgaW5jcmVhc2luZ2x5IHNlZWluZyBQeXRob24gYmVpbmcgaW5zdGFsbGVkIG9uIGNvbXB1dGVycwotICAgICAgYXMgZGVsaXZlcmVkIGJ5IHZlbmRvcnMuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB3aHksIGFuZAotICAgICAgd2hldGhlciBpdCdzIHNhZmUgdG8gcmVtb3ZlLCBzZWUgdGhlICJXaHkgaXMgUHl0aG9uIEluc3RhbGxlZCBvbgotICAgICAgbXkgQ29tcHV0ZXI/IiBGQVEsIGZvdW5kIGF0OgotCi0gICAgICAgICAgaHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9mYXEvaW5zdGFsbGVkLwpkaWZmIC0tZ2l0IGEvRG9jL3JlZi9yZWYudGV4IGIvRG9jL3JlZi9yZWYudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2MwYWNmLi4wMDAwMDAwCi0tLSBhL0RvYy9yZWYvcmVmLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLVxkb2N1bWVudGNsYXNze21hbnVhbH0KLQotXHRpdGxle1B5dGhvbiBSZWZlcmVuY2UgTWFudWFsfQotCi1caW5wdXR7Ym9pbGVycGxhdGV9Ci0KLVxtYWtlaW5kZXgKLQotXGJlZ2lue2RvY3VtZW50fQotCi1cbWFrZXRpdGxlCi0KLVxpZmh0bWwKLVxjaGFwdGVyKntGcm9udCBNYXR0ZXJcbGFiZWx7ZnJvbnR9fQotXGZpCi0KLVxpbnB1dHtjb3B5cmlnaHR9Ci0KLVxiZWdpbnthYnN0cmFjdH0KLQotXG5vaW5kZW50Ci1QeXRob24gaXMgYW4gaW50ZXJwcmV0ZWQsIG9iamVjdC1vcmllbnRlZCwgaGlnaC1sZXZlbCBwcm9ncmFtbWluZwotbGFuZ3VhZ2Ugd2l0aCBkeW5hbWljIHNlbWFudGljcy4gIEl0cyBoaWdoLWxldmVsIGJ1aWx0IGluIGRhdGEKLXN0cnVjdHVyZXMsIGNvbWJpbmVkIHdpdGggZHluYW1pYyB0eXBpbmcgYW5kIGR5bmFtaWMgYmluZGluZywgbWFrZSBpdAotdmVyeSBhdHRyYWN0aXZlIGZvciByYXBpZCBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCwgYXMgd2VsbCBhcyBmb3IgdXNlCi1hcyBhIHNjcmlwdGluZyBvciBnbHVlIGxhbmd1YWdlIHRvIGNvbm5lY3QgZXhpc3RpbmcgY29tcG9uZW50cwotdG9nZXRoZXIuICBQeXRob24ncyBzaW1wbGUsIGVhc3kgdG8gbGVhcm4gc3ludGF4IGVtcGhhc2l6ZXMKLXJlYWRhYmlsaXR5IGFuZCB0aGVyZWZvcmUgcmVkdWNlcyB0aGUgY29zdCBvZiBwcm9ncmFtCi1tYWludGVuYW5jZS4gIFB5dGhvbiBzdXBwb3J0cyBtb2R1bGVzIGFuZCBwYWNrYWdlcywgd2hpY2ggZW5jb3VyYWdlcwotcHJvZ3JhbSBtb2R1bGFyaXR5IGFuZCBjb2RlIHJldXNlLiAgVGhlIFB5dGhvbiBpbnRlcnByZXRlciBhbmQgdGhlCi1leHRlbnNpdmUgc3RhbmRhcmQgbGlicmFyeSBhcmUgYXZhaWxhYmxlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybQotd2l0aG91dCBjaGFyZ2UgZm9yIGFsbCBtYWpvciBwbGF0Zm9ybXMsIGFuZCBjYW4gYmUgZnJlZWx5IGRpc3RyaWJ1dGVkLgotCi1UaGlzIHJlZmVyZW5jZSBtYW51YWwgZGVzY3JpYmVzIHRoZSBzeW50YXggYW5kIGBgY29yZSBzZW1hbnRpY3MnJyBvZgotdGhlIGxhbmd1YWdlLiAgSXQgaXMgdGVyc2UsIGJ1dCBhdHRlbXB0cyB0byBiZSBleGFjdCBhbmQgY29tcGxldGUuCi1UaGUgc2VtYW50aWNzIG9mIG5vbi1lc3NlbnRpYWwgYnVpbHQtaW4gb2JqZWN0IHR5cGVzIGFuZCBvZiB0aGUKLWJ1aWx0LWluIGZ1bmN0aW9ucyBhbmQgbW9kdWxlcyBhcmUgZGVzY3JpYmVkIGluIHRoZQotXGNpdGV0aXRsZVsuLi9saWIvbGliLmh0bWxde1B5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZX0uICBGb3IgYW4KLWluZm9ybWFsIGludHJvZHVjdGlvbiB0byB0aGUgbGFuZ3VhZ2UsIHNlZSB0aGUKLVxjaXRldGl0bGVbLi4vdHV0L3R1dC5odG1sXXtQeXRob24gVHV0b3JpYWx9LiAgRm9yIEMgb3IKLVxDcHB7fSBwcm9ncmFtbWVycywgdHdvIGFkZGl0aW9uYWwgbWFudWFscyBleGlzdDoKLVxjaXRldGl0bGVbLi4vZXh0L2V4dC5odG1sXXtFeHRlbmRpbmcgYW5kIEVtYmVkZGluZyB0aGUgUHl0aG9uCi1JbnRlcnByZXRlcn0gZGVzY3JpYmVzIHRoZSBoaWdoLWxldmVsIHBpY3R1cmUgb2YgaG93IHRvIHdyaXRlIGEgUHl0aG9uCi1leHRlbnNpb24gbW9kdWxlLCBhbmQgdGhlIFxjaXRldGl0bGVbLi4vYXBpL2FwaS5odG1sXXtQeXRob24vQyBBUEkKLVJlZmVyZW5jZSBNYW51YWx9IGRlc2NyaWJlcyB0aGUgaW50ZXJmYWNlcyBhdmFpbGFibGUgdG8KLUMvXENwcHt9IHByb2dyYW1tZXJzIGluIGRldGFpbC4KLQotXGVuZHthYnN0cmFjdH0KLQotXHRhYmxlb2Zjb250ZW50cwotCi1caW5wdXR7cmVmMX0JCSUgSW50cm9kdWN0aW9uCi1caW5wdXR7cmVmMn0JCSUgTGV4aWNhbCBhbmFseXNpcwotXGlucHV0e3JlZjN9CQklIERhdGEgbW9kZWwKLVxpbnB1dHtyZWY0fQkJJSBFeGVjdXRpb24gbW9kZWwKLVxpbnB1dHtyZWY1fQkJJSBFeHByZXNzaW9ucyBhbmQgY29uZGl0aW9ucwotXGlucHV0e3JlZjZ9CQklIFNpbXBsZSBzdGF0ZW1lbnRzCi1caW5wdXR7cmVmN30JCSUgQ29tcG91bmQgc3RhdGVtZW50cwotXGlucHV0e3JlZjh9CQklIFRvcC1sZXZlbCBjb21wb25lbnRzCi0KLVxhcHBlbmRpeAotCi1cY2hhcHRlcntIaXN0b3J5IGFuZCBMaWNlbnNlfQotXGlucHV0e2xpY2Vuc2V9Ci0KLVxpbnB1dHtyZWYuaW5kfQotCi1cZW5ke2RvY3VtZW50fQpkaWZmIC0tZ2l0IGEvRG9jL3JlZi9yZWYxLnRleCBiL0RvYy9yZWYvcmVmMS50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMzQ3MTYuLjAwMDAwMDAKLS0tIGEvRG9jL3JlZi9yZWYxLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi1cY2hhcHRlcntJbnRyb2R1Y3Rpb25cbGFiZWx7aW50cm9kdWN0aW9ufX0KLQotVGhpcyByZWZlcmVuY2UgbWFudWFsIGRlc2NyaWJlcyB0aGUgUHl0aG9uIHByb2dyYW1taW5nIGxhbmd1YWdlLgotSXQgaXMgbm90IGludGVuZGVkIGFzIGEgdHV0b3JpYWwuCi0KLVdoaWxlIEkgYW0gdHJ5aW5nIHRvIGJlIGFzIHByZWNpc2UgYXMgcG9zc2libGUsIEkgY2hvc2UgdG8gdXNlIEVuZ2xpc2gKLXJhdGhlciB0aGFuIGZvcm1hbCBzcGVjaWZpY2F0aW9ucyBmb3IgZXZlcnl0aGluZyBleGNlcHQgc3ludGF4IGFuZAotbGV4aWNhbCBhbmFseXNpcy4gIFRoaXMgc2hvdWxkIG1ha2UgdGhlIGRvY3VtZW50IG1vcmUgdW5kZXJzdGFuZGFibGUKLXRvIHRoZSBhdmVyYWdlIHJlYWRlciwgYnV0IHdpbGwgbGVhdmUgcm9vbSBmb3IgYW1iaWd1aXRpZXMuCi1Db25zZXF1ZW50bHksIGlmIHlvdSB3ZXJlIGNvbWluZyBmcm9tIE1hcnMgYW5kIHRyaWVkIHRvIHJlLWltcGxlbWVudAotUHl0aG9uIGZyb20gdGhpcyBkb2N1bWVudCBhbG9uZSwgeW91IG1pZ2h0IGhhdmUgdG8gZ3Vlc3MgdGhpbmdzIGFuZCBpbgotZmFjdCB5b3Ugd291bGQgcHJvYmFibHkgZW5kIHVwIGltcGxlbWVudGluZyBxdWl0ZSBhIGRpZmZlcmVudCBsYW5ndWFnZS4KLU9uIHRoZSBvdGhlciBoYW5kLCBpZiB5b3UgYXJlIHVzaW5nCi1QeXRob24gYW5kIHdvbmRlciB3aGF0IHRoZSBwcmVjaXNlIHJ1bGVzIGFib3V0IGEgcGFydGljdWxhciBhcmVhIG9mCi10aGUgbGFuZ3VhZ2UgYXJlLCB5b3Ugc2hvdWxkIGRlZmluaXRlbHkgYmUgYWJsZSB0byBmaW5kIHRoZW0gaGVyZS4KLUlmIHlvdSB3b3VsZCBsaWtlIHRvIHNlZSBhIG1vcmUgZm9ybWFsIGRlZmluaXRpb24gb2YgdGhlIGxhbmd1YWdlLAotbWF5YmUgeW91IGNvdWxkIHZvbHVudGVlciB5b3VyIHRpbWUgLS0tIG9yIGludmVudCBhIGNsb25pbmcgbWFjaGluZQotOi0pLgotCi1JdCBpcyBkYW5nZXJvdXMgdG8gYWRkIHRvbyBtYW55IGltcGxlbWVudGF0aW9uIGRldGFpbHMgdG8gYSBsYW5ndWFnZQotcmVmZXJlbmNlIGRvY3VtZW50IC0tLSB0aGUgaW1wbGVtZW50YXRpb24gbWF5IGNoYW5nZSwgYW5kIG90aGVyCi1pbXBsZW1lbnRhdGlvbnMgb2YgdGhlIHNhbWUgbGFuZ3VhZ2UgbWF5IHdvcmsgZGlmZmVyZW50bHkuICBPbiB0aGUKLW90aGVyIGhhbmQsIHRoZXJlIGlzIGN1cnJlbnRseSBvbmx5IG9uZSBQeXRob24gaW1wbGVtZW50YXRpb24gaW4KLXdpZGVzcHJlYWQgdXNlIChhbHRob3VnaCBhbHRlcm5hdGUgaW1wbGVtZW50YXRpb25zIGV4aXN0KSwgYW5kCi1pdHMgcGFydGljdWxhciBxdWlya3MgYXJlIHNvbWV0aW1lcyB3b3J0aCBiZWluZyBtZW50aW9uZWQsIGVzcGVjaWFsbHkKLXdoZXJlIHRoZSBpbXBsZW1lbnRhdGlvbiBpbXBvc2VzIGFkZGl0aW9uYWwgbGltaXRhdGlvbnMuICBUaGVyZWZvcmUsCi15b3UnbGwgZmluZCBzaG9ydCBgYGltcGxlbWVudGF0aW9uIG5vdGVzJycgc3ByaW5rbGVkIHRocm91Z2hvdXQgdGhlCi10ZXh0LgotCi1FdmVyeSBQeXRob24gaW1wbGVtZW50YXRpb24gY29tZXMgd2l0aCBhIG51bWJlciBvZiBidWlsdC1pbiBhbmQKLXN0YW5kYXJkIG1vZHVsZXMuICBUaGVzZSBhcmUgbm90IGRvY3VtZW50ZWQgaGVyZSwgYnV0IGluIHRoZSBzZXBhcmF0ZQotXGNpdGV0aXRsZVsuLi9saWIvbGliLmh0bWxde1B5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZX0gZG9jdW1lbnQuICBBIGZldwotYnVpbHQtaW4gbW9kdWxlcyBhcmUgbWVudGlvbmVkIHdoZW4gdGhleSBpbnRlcmFjdCBpbiBhIHNpZ25pZmljYW50IHdheQotd2l0aCB0aGUgbGFuZ3VhZ2UgZGVmaW5pdGlvbi4KLQotCi1cc2VjdGlvbntBbHRlcm5hdGUgSW1wbGVtZW50YXRpb25zXGxhYmVse2ltcGxlbWVudGF0aW9uc319Ci0KLVRob3VnaCB0aGVyZSBpcyBvbmUgUHl0aG9uIGltcGxlbWVudGF0aW9uIHdoaWNoIGlzIGJ5IGZhciB0aGUgbW9zdAotcG9wdWxhciwgdGhlcmUgYXJlIHNvbWUgYWx0ZXJuYXRlIGltcGxlbWVudGF0aW9ucyB3aGljaCBhcmUgb2YKLXBhcnRpY3VsYXIgaW50ZXJlc3QgdG8gZGlmZmVyZW50IGF1ZGllbmNlcy4KLQotS25vd24gaW1wbGVtZW50YXRpb25zIGluY2x1ZGU6Ci0KLVxiZWdpbntpdGVtaXplfQotXGl0ZW1bQ1B5dGhvbl0KLVRoaXMgaXMgdGhlIG9yaWdpbmFsIGFuZCBtb3N0LW1haW50YWluZWQgaW1wbGVtZW50YXRpb24gb2YgUHl0aG9uLAotd3JpdHRlbiBpbiBDLiAgTmV3IGxhbmd1YWdlIGZlYXR1cmVzIGdlbmVyYWxseSBhcHBlYXIgaGVyZSBmaXJzdC4KLQotXGl0ZW1bSnl0aG9uXQotUHl0aG9uIGltcGxlbWVudGVkIGluIEphdmEuICBUaGlzIGltcGxlbWVudGF0aW9uIGNhbiBiZSB1c2VkIGFzIGEKLXNjcmlwdGluZyBsYW5ndWFnZSBmb3IgSmF2YSBhcHBsaWNhdGlvbnMsIG9yIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZQotYXBwbGljYXRpb25zIHVzaW5nIHRoZSBKYXZhIGNsYXNzIGxpYnJhcmllcy4gIEl0IGlzIGFsc28gb2Z0ZW4gdXNlZCB0bwotY3JlYXRlIHRlc3RzIGZvciBKYXZhIGxpYnJhcmllcy4gIE1vcmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGF0Ci1cdWxpbmt7dGhlIEp5dGhvbiB3ZWJzaXRlfXtodHRwOi8vd3d3Lmp5dGhvbi5vcmcvfS4KLQotXGl0ZW1bUHl0aG9uIGZvciAuTkVUXQotVGhpcyBpbXBsZW1lbnRhdGlvbiBhY3R1YWxseSB1c2VzIHRoZSBDUHl0aG9uIGltcGxlbWVudGF0aW9uLCBidXQgaXMgYQotbWFuYWdlZCAuTkVUIGFwcGxpY2F0aW9uIGFuZCBtYWtlcyAuTkVUIGxpYnJhcmllcyBhdmFpbGFibGUuICBUaGlzIHdhcwotY3JlYXRlZCBieSBCcmlhbiBMbG95ZC4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFx1bGlua3tQeXRob24KLWZvciAuTkVUIGhvbWUgcGFnZX17aHR0cDovL3d3dy56b3BlLm9yZy9NZW1iZXJzL0JyaWFuL1B5dGhvbk5ldH0uCi0KLVxpdGVtW0lyb25QeXRob25dCi1BbiBhbHRlcm5hdGUgUHl0aG9uIGZvclwgLk5FVC4gIFVubGlrZSBQeXRob24uTkVULCB0aGlzIGlzIGEgY29tcGxldGUKLVB5dGhvbiBpbXBsZW1lbnRhdGlvbiB0aGF0IGdlbmVyYXRlcyBJTCwgYW5kIGNvbXBpbGVzIFB5dGhvbiBjb2RlCi1kaXJlY3RseSB0b1wgLk5FVCBhc3NlbWJsaWVzLiAgSXQgd2FzIGNyZWF0ZWQgYnkgSmltIEh1Z3VuaW4sIHRoZQotb3JpZ2luYWwgY3JlYXRvciBvZiBKeXRob24uICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFx1bGlua3t0aGUKLUlyb25QeXRob24gd2Vic2l0ZX17aHR0cDovL3dvcmtzcGFjZXMuZ290ZG90bmV0LmNvbS9pcm9ucHl0aG9ufS4KLQotXGl0ZW1bUHlQeV0KLUFuIGltcGxlbWVudGF0aW9uIG9mIFB5dGhvbiB3cml0dGVuIGluIFB5dGhvbjsgZXZlbiB0aGUgYnl0ZWNvZGUKLWludGVycHJldGVyIGlzIHdyaXR0ZW4gaW4gUHl0aG9uLiAgVGhpcyBpcyBleGVjdXRlZCB1c2luZyBDUHl0aG9uIGFzCi10aGUgdW5kZXJseWluZyBpbnRlcnByZXRlci4gIE9uZSBvZiB0aGUgZ29hbHMgb2YgdGhlIHByb2plY3QgaXMgdG8KLWVuY291cmFnZSBleHBlcmltZW50YXRpb24gd2l0aCB0aGUgbGFuZ3VhZ2UgaXRzZWxmIGJ5IG1ha2luZyBpdCBlYXNpZXIKLXRvIG1vZGlmeSB0aGUgaW50ZXJwcmV0ZXIgKHNpbmNlIGl0IGlzIHdyaXR0ZW4gaW4gUHl0aG9uKS4gIEFkZGl0aW9uYWwKLWluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBvbiBcdWxpbmt7dGhlIFB5UHkgcHJvamVjdCdzIGhvbWUKLXBhZ2V9e2h0dHA6Ly9jb2Rlc3BlYWsubmV0L3B5cHkvfS4KLVxlbmR7aXRlbWl6ZX0KLQotRWFjaCBvZiB0aGVzZSBpbXBsZW1lbnRhdGlvbnMgdmFyaWVzIGluIHNvbWUgd2F5IGZyb20gdGhlIGxhbmd1YWdlIGFzCi1kb2N1bWVudGVkIGluIHRoaXMgbWFudWFsLCBvciBpbnRyb2R1Y2VzIHNwZWNpZmljIGluZm9ybWF0aW9uIGJleW9uZAotd2hhdCdzIGNvdmVyZWQgaW4gdGhlIHN0YW5kYXJkIFB5dGhvbiBkb2N1bWVudGF0aW9uLiAgUGxlYXNlIHJlZmVyIHRvCi10aGUgaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgZG9jdW1lbnRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCBlbHNlIHlvdQotbmVlZCB0byBrbm93IGFib3V0IHRoZSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiB5b3UncmUgdXNpbmcuCi0KLQotXHNlY3Rpb257Tm90YXRpb25cbGFiZWx7bm90YXRpb259fQotCi1UaGUgZGVzY3JpcHRpb25zIG9mIGxleGljYWwgYW5hbHlzaXMgYW5kIHN5bnRheCB1c2UgYSBtb2RpZmllZCBCTkYKLWdyYW1tYXIgbm90YXRpb24uICBUaGlzIHVzZXMgdGhlIGZvbGxvd2luZyBzdHlsZSBvZiBkZWZpbml0aW9uOgotXGluZGV4e0JORn0KLVxpbmRleHtncmFtbWFyfQotXGluZGV4e3N5bnRheH0KLVxpbmRleHtub3RhdGlvbn0KLQotXGJlZ2lue3Byb2R1Y3Rpb25saXN0fVsqXQotICBccHJvZHVjdGlvbntuYW1lfXtcdG9rZW57bGNfbGV0dGVyfSAoXHRva2Vue2xjX2xldHRlcn0gfCAiXyIpKn0KLSAgXHByb2R1Y3Rpb257bGNfbGV0dGVyfXsiYSIuLi4ieiJ9Ci1cZW5ke3Byb2R1Y3Rpb25saXN0fQotCi1UaGUgZmlyc3QgbGluZSBzYXlzIHRoYXQgYSBcY29kZXtuYW1lfSBpcyBhbiBcY29kZXtsY19sZXR0ZXJ9IGZvbGxvd2VkIGJ5Ci1hIHNlcXVlbmNlIG9mIHplcm8gb3IgbW9yZSBcY29kZXtsY19sZXR0ZXJ9cyBhbmQgdW5kZXJzY29yZXMuICBBbgotXGNvZGV7bGNfbGV0dGVyfSBpbiB0dXJuIGlzIGFueSBvZiB0aGUgc2luZ2xlIGNoYXJhY3RlcnMgXGNoYXJhY3RlcnthfQotdGhyb3VnaCBcY2hhcmFjdGVye3p9LiAgKFRoaXMgcnVsZSBpcyBhY3R1YWxseSBhZGhlcmVkIHRvIGZvciB0aGUKLW5hbWVzIGRlZmluZWQgaW4gbGV4aWNhbCBhbmQgZ3JhbW1hciBydWxlcyBpbiB0aGlzIGRvY3VtZW50LikKLQotRWFjaCBydWxlIGJlZ2lucyB3aXRoIGEgbmFtZSAod2hpY2ggaXMgdGhlIG5hbWUgZGVmaW5lZCBieSB0aGUgcnVsZSkKLWFuZCBcY29kZXs6Oj19LiAgQSB2ZXJ0aWNhbCBiYXIgKFxjb2Rle3x9KSBpcyB1c2VkIHRvIHNlcGFyYXRlCi1hbHRlcm5hdGl2ZXM7IGl0IGlzIHRoZSBsZWFzdCBiaW5kaW5nIG9wZXJhdG9yIGluIHRoaXMgbm90YXRpb24uICBBCi1zdGFyIChcY29kZXsqfSkgbWVhbnMgemVybyBvciBtb3JlIHJlcGV0aXRpb25zIG9mIHRoZSBwcmVjZWRpbmcgaXRlbTsKLWxpa2V3aXNlLCBhIHBsdXMgKFxjb2Rleyt9KSBtZWFucyBvbmUgb3IgbW9yZSByZXBldGl0aW9ucywgYW5kIGEKLXBocmFzZSBlbmNsb3NlZCBpbiBzcXVhcmUgYnJhY2tldHMgKFxjb2Rle1sgXX0pIG1lYW5zIHplcm8gb3Igb25lCi1vY2N1cnJlbmNlcyAoaW4gb3RoZXIgd29yZHMsIHRoZSBlbmNsb3NlZCBwaHJhc2UgaXMgb3B0aW9uYWwpLiAgVGhlCi1cY29kZXsqfSBhbmQgXGNvZGV7K30gb3BlcmF0b3JzIGJpbmQgYXMgdGlnaHRseSBhcyBwb3NzaWJsZTsKLXBhcmVudGhlc2VzIGFyZSB1c2VkIGZvciBncm91cGluZy4gIExpdGVyYWwgc3RyaW5ncyBhcmUgZW5jbG9zZWQgaW4KLXF1b3Rlcy4gIFdoaXRlIHNwYWNlIGlzIG9ubHkgbWVhbmluZ2Z1bCB0byBzZXBhcmF0ZSB0b2tlbnMuCi1SdWxlcyBhcmUgbm9ybWFsbHkgY29udGFpbmVkIG9uIGEgc2luZ2xlIGxpbmU7IHJ1bGVzIHdpdGggbWFueQotYWx0ZXJuYXRpdmVzIG1heSBiZSBmb3JtYXR0ZWQgYWx0ZXJuYXRpdmVseSB3aXRoIGVhY2ggbGluZSBhZnRlciB0aGUKLWZpcnN0IGJlZ2lubmluZyB3aXRoIGEgdmVydGljYWwgYmFyLgotCi1JbiBsZXhpY2FsIGRlZmluaXRpb25zIChhcyB0aGUgZXhhbXBsZSBhYm92ZSksIHR3byBtb3JlIGNvbnZlbnRpb25zCi1hcmUgdXNlZDogVHdvIGxpdGVyYWwgY2hhcmFjdGVycyBzZXBhcmF0ZWQgYnkgdGhyZWUgZG90cyBtZWFuIGEgY2hvaWNlCi1vZiBhbnkgc2luZ2xlIGNoYXJhY3RlciBpbiB0aGUgZ2l2ZW4gKGluY2x1c2l2ZSkgcmFuZ2Ugb2YgXEFTQ0lJe30KLWNoYXJhY3RlcnMuICBBIHBocmFzZSBiZXR3ZWVuIGFuZ3VsYXIgYnJhY2tldHMgKFxjb2RlezwuLi4+fSkgZ2l2ZXMgYW4KLWluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW1ib2wgZGVmaW5lZDsgZS5nLiwgdGhpcyBjb3VsZCBiZSB1c2VkCi10byBkZXNjcmliZSB0aGUgbm90aW9uIG9mIGBjb250cm9sIGNoYXJhY3RlcicgaWYgbmVlZGVkLgotXGluZGV4e2xleGljYWwgZGVmaW5pdGlvbnN9Ci1caW5kZXh7QVNDSUlAXEFTQ0lJfQotCi1FdmVuIHRob3VnaCB0aGUgbm90YXRpb24gdXNlZCBpcyBhbG1vc3QgdGhlIHNhbWUsIHRoZXJlIGlzIGEgYmlnCi1kaWZmZXJlbmNlIGJldHdlZW4gdGhlIG1lYW5pbmcgb2YgbGV4aWNhbCBhbmQgc3ludGFjdGljIGRlZmluaXRpb25zOgotYSBsZXhpY2FsIGRlZmluaXRpb24gb3BlcmF0ZXMgb24gdGhlIGluZGl2aWR1YWwgY2hhcmFjdGVycyBvZiB0aGUKLWlucHV0IHNvdXJjZSwgd2hpbGUgYSBzeW50YXggZGVmaW5pdGlvbiBvcGVyYXRlcyBvbiB0aGUgc3RyZWFtIG9mCi10b2tlbnMgZ2VuZXJhdGVkIGJ5IHRoZSBsZXhpY2FsIGFuYWx5c2lzLiAgQWxsIHVzZXMgb2YgQk5GIGluIHRoZSBuZXh0Ci1jaGFwdGVyIChgYExleGljYWwgQW5hbHlzaXMnJykgYXJlIGxleGljYWwgZGVmaW5pdGlvbnM7IHVzZXMgaW4KLXN1YnNlcXVlbnQgY2hhcHRlcnMgYXJlIHN5bnRhY3RpYyBkZWZpbml0aW9ucy4KZGlmZiAtLWdpdCBhL0RvYy9yZWYvcmVmMi50ZXggYi9Eb2MvcmVmL3JlZjIudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjcwNjc2Li4wMDAwMDAwCi0tLSBhL0RvYy9yZWYvcmVmMi50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw3MjUgKzAsMCBAQAotXGNoYXB0ZXJ7TGV4aWNhbCBhbmFseXNpc1xsYWJlbHtsZXhpY2FsfX0KLQotQSBQeXRob24gcHJvZ3JhbSBpcyByZWFkIGJ5IGEgXGVtcGh7cGFyc2VyfS4gIElucHV0IHRvIHRoZSBwYXJzZXIgaXMgYQotc3RyZWFtIG9mIFxlbXBoe3Rva2Vuc30sIGdlbmVyYXRlZCBieSB0aGUgXGVtcGh7bGV4aWNhbCBhbmFseXplcn0uICBUaGlzCi1jaGFwdGVyIGRlc2NyaWJlcyBob3cgdGhlIGxleGljYWwgYW5hbHl6ZXIgYnJlYWtzIGEgZmlsZSBpbnRvIHRva2Vucy4KLVxpbmRleHtsZXhpY2FsIGFuYWx5c2lzfQotXGluZGV4e3BhcnNlcn0KLVxpbmRleHt0b2tlbn0KLQotUHl0aG9uIHVzZXMgdGhlIDctYml0IFxBU0NJSXt9IGNoYXJhY3RlciBzZXQgZm9yIHByb2dyYW0gdGV4dC4KLVx2ZXJzaW9uYWRkZWRbQW4gZW5jb2RpbmcgZGVjbGFyYXRpb24gY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCAKLXN0cmluZyBsaXRlcmFscyBhbmQgY29tbWVudHMgdXNlIGFuIGVuY29kaW5nIGRpZmZlcmVudCBmcm9tIEFTQ0lJXXsyLjN9Ci1Gb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHZlcnNpb25zLCBQeXRob24gb25seSB3YXJucyBpZiBpdCBmaW5kcwotOC1iaXQgY2hhcmFjdGVyczsgdGhvc2Ugd2FybmluZ3Mgc2hvdWxkIGJlIGNvcnJlY3RlZCBieSBlaXRoZXIgZGVjbGFyaW5nCi1hbiBleHBsaWNpdCBlbmNvZGluZywgb3IgdXNpbmcgZXNjYXBlIHNlcXVlbmNlcyBpZiB0aG9zZSBieXRlcyBhcmUgYmluYXJ5Ci1kYXRhLCBpbnN0ZWFkIG9mIGNoYXJhY3RlcnMuCi0KLQotVGhlIHJ1bi10aW1lIGNoYXJhY3RlciBzZXQgZGVwZW5kcyBvbiB0aGUgSS9PIGRldmljZXMgY29ubmVjdGVkIHRvIHRoZQotcHJvZ3JhbSBidXQgaXMgZ2VuZXJhbGx5IGEgc3VwZXJzZXQgb2YgXEFTQ0lJLgotCi1cc3Ryb25ne0Z1dHVyZSBjb21wYXRpYmlsaXR5IG5vdGU6fSBJdCBtYXkgYmUgdGVtcHRpbmcgdG8gYXNzdW1lIHRoYXQgdGhlCi1jaGFyYWN0ZXIgc2V0IGZvciA4LWJpdCBjaGFyYWN0ZXJzIGlzIElTTyBMYXRpbi0xIChhbiBcQVNDSUl7fQotc3VwZXJzZXQgdGhhdCBjb3ZlcnMgbW9zdCB3ZXN0ZXJuIGxhbmd1YWdlcyB0aGF0IHVzZSB0aGUgTGF0aW4KLWFscGhhYmV0KSwgYnV0IGl0IGlzIHBvc3NpYmxlIHRoYXQgaW4gdGhlIGZ1dHVyZSBVbmljb2RlIHRleHQgZWRpdG9ycwotd2lsbCBiZWNvbWUgY29tbW9uLiAgVGhlc2UgZ2VuZXJhbGx5IHVzZSB0aGUgVVRGLTggZW5jb2RpbmcsIHdoaWNoIGlzCi1hbHNvIGFuIFxBU0NJSXt9IHN1cGVyc2V0LCBidXQgd2l0aCB2ZXJ5IGRpZmZlcmVudCB1c2UgZm9yIHRoZQotY2hhcmFjdGVycyB3aXRoIG9yZGluYWxzIDEyOC0yNTUuICBXaGlsZSB0aGVyZSBpcyBubyBjb25zZW5zdXMgb24gdGhpcwotc3ViamVjdCB5ZXQsIGl0IGlzIHVud2lzZSB0byBhc3N1bWUgZWl0aGVyIExhdGluLTEgb3IgVVRGLTgsIGV2ZW4KLXRob3VnaCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBhcHBlYXJzIHRvIGZhdm9yIExhdGluLTEuICBUaGlzCi1hcHBsaWVzIGJvdGggdG8gdGhlIHNvdXJjZSBjaGFyYWN0ZXIgc2V0IGFuZCB0aGUgcnVuLXRpbWUgY2hhcmFjdGVyCi1zZXQuCi0KLQotXHNlY3Rpb257TGluZSBzdHJ1Y3R1cmVcbGFiZWx7bGluZS1zdHJ1Y3R1cmV9fQotCi1BIFB5dGhvbiBwcm9ncmFtIGlzIGRpdmlkZWQgaW50byBhIG51bWJlciBvZiBcZW1waHtsb2dpY2FsIGxpbmVzfS4KLVxpbmRleHtsaW5lIHN0cnVjdHVyZX0KLQotCi1cc3Vic2VjdGlvbntMb2dpY2FsIGxpbmVzXGxhYmVse2xvZ2ljYWx9fQotCi1UaGUgZW5kIG9mCi1hIGxvZ2ljYWwgbGluZSBpcyByZXByZXNlbnRlZCBieSB0aGUgdG9rZW4gTkVXTElORS4gIFN0YXRlbWVudHMgY2Fubm90Ci1jcm9zcyBsb2dpY2FsIGxpbmUgYm91bmRhcmllcyBleGNlcHQgd2hlcmUgTkVXTElORSBpcyBhbGxvd2VkIGJ5IHRoZQotc3ludGF4IChlLmcuLCBiZXR3ZWVuIHN0YXRlbWVudHMgaW4gY29tcG91bmQgc3RhdGVtZW50cykuCi1BIGxvZ2ljYWwgbGluZSBpcyBjb25zdHJ1Y3RlZCBmcm9tIG9uZSBvciBtb3JlIFxlbXBoe3BoeXNpY2FsIGxpbmVzfQotYnkgZm9sbG93aW5nIHRoZSBleHBsaWNpdCBvciBpbXBsaWNpdCBcZW1waHtsaW5lIGpvaW5pbmd9IHJ1bGVzLgotXGluZGV4e2xvZ2ljYWwgbGluZX0KLVxpbmRleHtwaHlzaWNhbCBsaW5lfQotXGluZGV4e2xpbmUgam9pbmluZ30KLVxpbmRleHtORVdMSU5FIHRva2VufQotCi0KLVxzdWJzZWN0aW9ue1BoeXNpY2FsIGxpbmVzXGxhYmVse3BoeXNpY2FsfX0KLQotQSBwaHlzaWNhbCBsaW5lIGlzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyB0ZXJtaW5hdGVkIGJ5IGFuIGVuZC1vZi1saW5lCi1zZXF1ZW5jZS4gIEluIHNvdXJjZSBmaWxlcywgYW55IG9mIHRoZSBzdGFuZGFyZCBwbGF0Zm9ybSBsaW5lCi10ZXJtaW5hdGlvbiBzZXF1ZW5jZXMgY2FuIGJlIHVzZWQgLSB0aGUgXFVOSVh7fSBmb3JtIHVzaW5nIFxBU0NJSXt9IExGCi0obGluZWZlZWQpLCB0aGUgV2luZG93cyBmb3JtIHVzaW5nIHRoZSBcQVNDSUl7fSBzZXF1ZW5jZSBDUiBMRiAocmV0dXJuCi1mb2xsb3dlZCBieSBsaW5lZmVlZCksIG9yIHRoZSBNYWNpbnRvc2ggZm9ybSB1c2luZyB0aGUgXEFTQ0lJe30gQ1IKLShyZXR1cm4pIGNoYXJhY3Rlci4gIEFsbCBvZiB0aGVzZSBmb3JtcyBjYW4gYmUgdXNlZCBlcXVhbGx5LCByZWdhcmRsZXNzCi1vZiBwbGF0Zm9ybS4KLQotV2hlbiBlbWJlZGRpbmcgUHl0aG9uLCBzb3VyY2UgY29kZSBzdHJpbmdzIHNob3VsZCBiZSBwYXNzZWQgdG8gUHl0aG9uCi1BUElzIHVzaW5nIHRoZSBzdGFuZGFyZCBDIGNvbnZlbnRpb25zIGZvciBuZXdsaW5lIGNoYXJhY3RlcnMgKHRoZQotXGNvZGV7XGUgbn0gY2hhcmFjdGVyLCByZXByZXNlbnRpbmcgXEFTQ0lJe30gTEYsIGlzIHRoZSBsaW5lCi10ZXJtaW5hdG9yKS4KLQotCi1cc3Vic2VjdGlvbntDb21tZW50c1xsYWJlbHtjb21tZW50c319Ci0KLUEgY29tbWVudCBzdGFydHMgd2l0aCBhIGhhc2ggY2hhcmFjdGVyIChcY29kZXtcI30pIHRoYXQgaXMgbm90IHBhcnQgb2YKLWEgc3RyaW5nIGxpdGVyYWwsIGFuZCBlbmRzIGF0IHRoZSBlbmQgb2YgdGhlIHBoeXNpY2FsIGxpbmUuICBBIGNvbW1lbnQKLXNpZ25pZmllcyB0aGUgZW5kIG9mIHRoZSBsb2dpY2FsIGxpbmUgdW5sZXNzIHRoZSBpbXBsaWNpdCBsaW5lIGpvaW5pbmcKLXJ1bGVzIGFyZSBpbnZva2VkLgotQ29tbWVudHMgYXJlIGlnbm9yZWQgYnkgdGhlIHN5bnRheDsgdGhleSBhcmUgbm90IHRva2Vucy4KLVxpbmRleHtjb21tZW50fQotXGluZGV4e2hhc2ggY2hhcmFjdGVyfQotCi0KLVxzdWJzZWN0aW9ue0VuY29kaW5nIGRlY2xhcmF0aW9uc1xsYWJlbHtlbmNvZGluZ3N9fQotXGluZGV4e3NvdXJjZSBjaGFyYWN0ZXIgc2V0fQotXGluZGV4e2VuY29kaW5nc30KLQotSWYgYSBjb21tZW50IGluIHRoZSBmaXJzdCBvciBzZWNvbmQgbGluZSBvZiB0aGUgUHl0aG9uIHNjcmlwdCBtYXRjaGVzCi10aGUgcmVndWxhciBleHByZXNzaW9uIFxyZWdleHB7Y29kaW5nWz06XVxlIHMqKFstXGUgdy5dKyl9LCB0aGlzIGNvbW1lbnQgaXMKLXByb2Nlc3NlZCBhcyBhbiBlbmNvZGluZyBkZWNsYXJhdGlvbjsgdGhlIGZpcnN0IGdyb3VwIG9mIHRoaXMKLWV4cHJlc3Npb24gbmFtZXMgdGhlIGVuY29kaW5nIG9mIHRoZSBzb3VyY2UgY29kZSBmaWxlLiBUaGUgcmVjb21tZW5kZWQKLWZvcm1zIG9mIHRoaXMgZXhwcmVzc2lvbiBhcmUKLQotXGJlZ2lue3ZlcmJhdGltfQotIyAtKi0gY29kaW5nOiA8ZW5jb2RpbmctbmFtZT4gLSotCi1cZW5ke3ZlcmJhdGltfQotCi13aGljaCBpcyByZWNvZ25pemVkIGFsc28gYnkgR05VIEVtYWNzLCBhbmQKLQotXGJlZ2lue3ZlcmJhdGltfQotIyB2aW06ZmlsZWVuY29kaW5nPTxlbmNvZGluZy1uYW1lPgotXGVuZHt2ZXJiYXRpbX0KLQotd2hpY2ggaXMgcmVjb2duaXplZCBieSBCcmFtIE1vb2xlbmFhcidzIFZJTS4gSW4gYWRkaXRpb24sIGlmIHRoZSBmaXJzdAotYnl0ZXMgb2YgdGhlIGZpbGUgYXJlIHRoZSBVVEYtOCBieXRlLW9yZGVyIG1hcmsKLShcY29kZXsnXGUgeGVmXGUgeGJiXGUgeGJmJ30pLCB0aGUgZGVjbGFyZWQgZmlsZSBlbmNvZGluZyBpcyBVVEYtOAotKHRoaXMgaXMgc3VwcG9ydGVkLCBhbW9uZyBvdGhlcnMsIGJ5IE1pY3Jvc29mdCdzIFxwcm9ncmFte25vdGVwYWR9KS4KLQotSWYgYW4gZW5jb2RpbmcgaXMgZGVjbGFyZWQsIHRoZSBlbmNvZGluZyBuYW1lIG11c3QgYmUgcmVjb2duaXplZCBieQotUHl0aG9uLiAlIFhYWCB0aGVyZSBzaG91bGQgYmUgYSBsaXN0IG9mIHN1cHBvcnRlZCBlbmNvZGluZ3MuCi1UaGUgZW5jb2RpbmcgaXMgdXNlZCBmb3IgYWxsIGxleGljYWwgYW5hbHlzaXMsIGluIHBhcnRpY3VsYXIgdG8gZmluZAotdGhlIGVuZCBvZiBhIHN0cmluZywgYW5kIHRvIGludGVycHJldCB0aGUgY29udGVudHMgb2YgVW5pY29kZSBsaXRlcmFscy4KLVN0cmluZyBsaXRlcmFscyBhcmUgY29udmVydGVkIHRvIFVuaWNvZGUgZm9yIHN5bnRhY3RpY2FsIGFuYWx5c2lzLAotdGhlbiBjb252ZXJ0ZWQgYmFjayB0byB0aGVpciBvcmlnaW5hbCBlbmNvZGluZyBiZWZvcmUgaW50ZXJwcmV0YXRpb24KLXN0YXJ0cy4gVGhlIGVuY29kaW5nIGRlY2xhcmF0aW9uIG11c3QgYXBwZWFyIG9uIGEgbGluZSBvZiBpdHMgb3duLgotCi1cc3Vic2VjdGlvbntFeHBsaWNpdCBsaW5lIGpvaW5pbmdcbGFiZWx7ZXhwbGljaXQtam9pbmluZ319Ci0KLVR3byBvciBtb3JlIHBoeXNpY2FsIGxpbmVzIG1heSBiZSBqb2luZWQgaW50byBsb2dpY2FsIGxpbmVzIHVzaW5nCi1iYWNrc2xhc2ggY2hhcmFjdGVycyAoXGNvZGV7XGV9KSwgYXMgZm9sbG93czogd2hlbiBhIHBoeXNpY2FsIGxpbmUgZW5kcwotaW4gYSBiYWNrc2xhc2ggdGhhdCBpcyBub3QgcGFydCBvZiBhIHN0cmluZyBsaXRlcmFsIG9yIGNvbW1lbnQsIGl0IGlzCi1qb2luZWQgd2l0aCB0aGUgZm9sbG93aW5nIGZvcm1pbmcgYSBzaW5nbGUgbG9naWNhbCBsaW5lLCBkZWxldGluZyB0aGUKLWJhY2tzbGFzaCBhbmQgdGhlIGZvbGxvd2luZyBlbmQtb2YtbGluZSBjaGFyYWN0ZXIuICBGb3IgZXhhbXBsZToKLVxpbmRleHtwaHlzaWNhbCBsaW5lfQotXGluZGV4e2xpbmUgam9pbmluZ30KLVxpbmRleHtsaW5lIGNvbnRpbnVhdGlvbn0KLVxpbmRleHtiYWNrc2xhc2ggY2hhcmFjdGVyfQotJQotXGJlZ2lue3ZlcmJhdGltfQotaWYgMTkwMCA8IHllYXIgPCAyMTAwIGFuZCAxIDw9IG1vbnRoIDw9IDEyIFwKLSAgIGFuZCAxIDw9IGRheSA8PSAzMSBhbmQgMCA8PSBob3VyIDwgMjQgXAotICAgYW5kIDAgPD0gbWludXRlIDwgNjAgYW5kIDAgPD0gc2Vjb25kIDwgNjA6ICAgIyBMb29rcyBsaWtlIGEgdmFsaWQgZGF0ZQotICAgICAgICByZXR1cm4gMQotXGVuZHt2ZXJiYXRpbX0KLQotQSBsaW5lIGVuZGluZyBpbiBhIGJhY2tzbGFzaCBjYW5ub3QgY2FycnkgYSBjb21tZW50LiAgQSBiYWNrc2xhc2ggZG9lcwotbm90IGNvbnRpbnVlIGEgY29tbWVudC4gIEEgYmFja3NsYXNoIGRvZXMgbm90IGNvbnRpbnVlIGEgdG9rZW4gZXhjZXB0Ci1mb3Igc3RyaW5nIGxpdGVyYWxzIChpLmUuLCB0b2tlbnMgb3RoZXIgdGhhbiBzdHJpbmcgbGl0ZXJhbHMgY2Fubm90IGJlCi1zcGxpdCBhY3Jvc3MgcGh5c2ljYWwgbGluZXMgdXNpbmcgYSBiYWNrc2xhc2gpLiAgQSBiYWNrc2xhc2ggaXMKLWlsbGVnYWwgZWxzZXdoZXJlIG9uIGEgbGluZSBvdXRzaWRlIGEgc3RyaW5nIGxpdGVyYWwuCi0KLQotXHN1YnNlY3Rpb257SW1wbGljaXQgbGluZSBqb2luaW5nXGxhYmVse2ltcGxpY2l0LWpvaW5pbmd9fQotCi1FeHByZXNzaW9ucyBpbiBwYXJlbnRoZXNlcywgc3F1YXJlIGJyYWNrZXRzIG9yIGN1cmx5IGJyYWNlcyBjYW4gYmUKLXNwbGl0IG92ZXIgbW9yZSB0aGFuIG9uZSBwaHlzaWNhbCBsaW5lIHdpdGhvdXQgdXNpbmcgYmFja3NsYXNoZXMuCi1Gb3IgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotbW9udGhfbmFtZXMgPSBbJ0phbnVhcmknLCAnRmVicnVhcmknLCAnTWFhcnQnLCAgICAgICMgVGhlc2UgYXJlIHRoZQotICAgICAgICAgICAgICAgJ0FwcmlsJywgICAnTWVpJywgICAgICAnSnVuaScsICAgICAgICMgRHV0Y2ggbmFtZXMKLSAgICAgICAgICAgICAgICdKdWxpJywgICAgJ0F1Z3VzdHVzJywgJ1NlcHRlbWJlcicsICAjIGZvciB0aGUgbW9udGhzCi0gICAgICAgICAgICAgICAnT2t0b2JlcicsICdOb3ZlbWJlcicsICdEZWNlbWJlciddICAgIyBvZiB0aGUgeWVhcgotXGVuZHt2ZXJiYXRpbX0KLQotSW1wbGljaXRseSBjb250aW51ZWQgbGluZXMgY2FuIGNhcnJ5IGNvbW1lbnRzLiAgVGhlIGluZGVudGF0aW9uIG9mIHRoZQotY29udGludWF0aW9uIGxpbmVzIGlzIG5vdCBpbXBvcnRhbnQuICBCbGFuayBjb250aW51YXRpb24gbGluZXMgYXJlCi1hbGxvd2VkLiAgVGhlcmUgaXMgbm8gTkVXTElORSB0b2tlbiBiZXR3ZWVuIGltcGxpY2l0IGNvbnRpbnVhdGlvbgotbGluZXMuICBJbXBsaWNpdGx5IGNvbnRpbnVlZCBsaW5lcyBjYW4gYWxzbyBvY2N1ciB3aXRoaW4gdHJpcGxlLXF1b3RlZAotc3RyaW5ncyAoc2VlIGJlbG93KTsgaW4gdGhhdCBjYXNlIHRoZXkgY2Fubm90IGNhcnJ5IGNvbW1lbnRzLgotCi0KLVxzdWJzZWN0aW9ue0JsYW5rIGxpbmVzIFxsYWJlbHtibGFuay1saW5lc319Ci0KLVxpbmRleHtibGFuayBsaW5lfQotQSBsb2dpY2FsIGxpbmUgdGhhdCBjb250YWlucyBvbmx5IHNwYWNlcywgdGFicywgZm9ybWZlZWRzIGFuZCBwb3NzaWJseQotYSBjb21tZW50LCBpcyBpZ25vcmVkIChpLmUuLCBubyBORVdMSU5FIHRva2VuIGlzIGdlbmVyYXRlZCkuICBEdXJpbmcKLWludGVyYWN0aXZlIGlucHV0IG9mIHN0YXRlbWVudHMsIGhhbmRsaW5nIG9mIGEgYmxhbmsgbGluZSBtYXkgZGlmZmVyCi1kZXBlbmRpbmcgb24gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSByZWFkLWV2YWwtcHJpbnQgbG9vcC4gIEluIHRoZQotc3RhbmRhcmQgaW1wbGVtZW50YXRpb24sIGFuIGVudGlyZWx5IGJsYW5rIGxvZ2ljYWwgbGluZSAoaS5lLlwgb25lCi1jb250YWluaW5nIG5vdCBldmVuIHdoaXRlc3BhY2Ugb3IgYSBjb21tZW50KSB0ZXJtaW5hdGVzIGEgbXVsdGktbGluZQotc3RhdGVtZW50LgotCi0KLVxzdWJzZWN0aW9ue0luZGVudGF0aW9uXGxhYmVse2luZGVudGF0aW9ufX0KLQotTGVhZGluZyB3aGl0ZXNwYWNlIChzcGFjZXMgYW5kIHRhYnMpIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsb2dpY2FsCi1saW5lIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgaW5kZW50YXRpb24gbGV2ZWwgb2YgdGhlIGxpbmUsIHdoaWNoIGluCi10dXJuIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBncm91cGluZyBvZiBzdGF0ZW1lbnRzLgotXGluZGV4e2luZGVudGF0aW9ufQotXGluZGV4e3doaXRlc3BhY2V9Ci1caW5kZXh7bGVhZGluZyB3aGl0ZXNwYWNlfQotXGluZGV4e3NwYWNlfQotXGluZGV4e3RhYn0KLVxpbmRleHtncm91cGluZ30KLVxpbmRleHtzdGF0ZW1lbnQgZ3JvdXBpbmd9Ci0KLUZpcnN0LCB0YWJzIGFyZSByZXBsYWNlZCAoZnJvbSBsZWZ0IHRvIHJpZ2h0KSBieSBvbmUgdG8gZWlnaHQgc3BhY2VzCi1zdWNoIHRoYXQgdGhlIHRvdGFsIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlCi1yZXBsYWNlbWVudCBpcyBhIG11bHRpcGxlIG9mCi1laWdodCAodGhpcyBpcyBpbnRlbmRlZCB0byBiZSB0aGUgc2FtZSBydWxlIGFzIHVzZWQgYnkgXFVOSVgpLiAgVGhlCi10b3RhbCBudW1iZXIgb2Ygc3BhY2VzIHByZWNlZGluZyB0aGUgZmlyc3Qgbm9uLWJsYW5rIGNoYXJhY3RlciB0aGVuCi1kZXRlcm1pbmVzIHRoZSBsaW5lJ3MgaW5kZW50YXRpb24uICBJbmRlbnRhdGlvbiBjYW5ub3QgYmUgc3BsaXQgb3ZlcgotbXVsdGlwbGUgcGh5c2ljYWwgbGluZXMgdXNpbmcgYmFja3NsYXNoZXM7IHRoZSB3aGl0ZXNwYWNlIHVwIHRvIHRoZQotZmlyc3QgYmFja3NsYXNoIGRldGVybWluZXMgdGhlIGluZGVudGF0aW9uLgotCi1cc3Ryb25ne0Nyb3NzLXBsYXRmb3JtIGNvbXBhdGliaWxpdHkgbm90ZTp9IGJlY2F1c2Ugb2YgdGhlIG5hdHVyZSBvZgotdGV4dCBlZGl0b3JzIG9uIG5vbi1VTklYIHBsYXRmb3JtcywgaXQgaXMgdW53aXNlIHRvIHVzZSBhIG1peHR1cmUgb2YKLXNwYWNlcyBhbmQgdGFicyBmb3IgdGhlIGluZGVudGF0aW9uIGluIGEgc2luZ2xlIHNvdXJjZSBmaWxlLiAgSXQKLXNob3VsZCBhbHNvIGJlIG5vdGVkIHRoYXQgZGlmZmVyZW50IHBsYXRmb3JtcyBtYXkgZXhwbGljaXRseSBsaW1pdCB0aGUKLW1heGltdW0gaW5kZW50YXRpb24gbGV2ZWwuCi0KLUEgZm9ybWZlZWQgY2hhcmFjdGVyIG1heSBiZSBwcmVzZW50IGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZTsgaXQgd2lsbAotYmUgaWdub3JlZCBmb3IgdGhlIGluZGVudGF0aW9uIGNhbGN1bGF0aW9ucyBhYm92ZS4gIEZvcm1mZWVkCi1jaGFyYWN0ZXJzIG9jY3VycmluZyBlbHNld2hlcmUgaW4gdGhlIGxlYWRpbmcgd2hpdGVzcGFjZSBoYXZlIGFuCi11bmRlZmluZWQgZWZmZWN0IChmb3IgaW5zdGFuY2UsIHRoZXkgbWF5IHJlc2V0IHRoZSBzcGFjZSBjb3VudCB0bwotemVybykuCi0KLVRoZSBpbmRlbnRhdGlvbiBsZXZlbHMgb2YgY29uc2VjdXRpdmUgbGluZXMgYXJlIHVzZWQgdG8gZ2VuZXJhdGUKLUlOREVOVCBhbmQgREVERU5UIHRva2VucywgdXNpbmcgYSBzdGFjaywgYXMgZm9sbG93cy4KLVxpbmRleHtJTkRFTlQgdG9rZW59Ci1caW5kZXh7REVERU5UIHRva2VufQotCi1CZWZvcmUgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGZpbGUgaXMgcmVhZCwgYSBzaW5nbGUgemVybyBpcyBwdXNoZWQgb24KLXRoZSBzdGFjazsgdGhpcyB3aWxsIG5ldmVyIGJlIHBvcHBlZCBvZmYgYWdhaW4uICBUaGUgbnVtYmVycyBwdXNoZWQgb24KLXRoZSBzdGFjayB3aWxsIGFsd2F5cyBiZSBzdHJpY3RseSBpbmNyZWFzaW5nIGZyb20gYm90dG9tIHRvIHRvcC4gIEF0Ci10aGUgYmVnaW5uaW5nIG9mIGVhY2ggbG9naWNhbCBsaW5lLCB0aGUgbGluZSdzIGluZGVudGF0aW9uIGxldmVsIGlzCi1jb21wYXJlZCB0byB0aGUgdG9wIG9mIHRoZSBzdGFjay4gIElmIGl0IGlzIGVxdWFsLCBub3RoaW5nIGhhcHBlbnMuCi1JZiBpdCBpcyBsYXJnZXIsIGl0IGlzIHB1c2hlZCBvbiB0aGUgc3RhY2ssIGFuZCBvbmUgSU5ERU5UIHRva2VuIGlzCi1nZW5lcmF0ZWQuICBJZiBpdCBpcyBzbWFsbGVyLCBpdCBcZW1waHttdXN0fSBiZSBvbmUgb2YgdGhlIG51bWJlcnMKLW9jY3VycmluZyBvbiB0aGUgc3RhY2s7IGFsbCBudW1iZXJzIG9uIHRoZSBzdGFjayB0aGF0IGFyZSBsYXJnZXIgYXJlCi1wb3BwZWQgb2ZmLCBhbmQgZm9yIGVhY2ggbnVtYmVyIHBvcHBlZCBvZmYgYSBERURFTlQgdG9rZW4gaXMKLWdlbmVyYXRlZC4gIEF0IHRoZSBlbmQgb2YgdGhlIGZpbGUsIGEgREVERU5UIHRva2VuIGlzIGdlbmVyYXRlZCBmb3IKLWVhY2ggbnVtYmVyIHJlbWFpbmluZyBvbiB0aGUgc3RhY2sgdGhhdCBpcyBsYXJnZXIgdGhhbiB6ZXJvLgotCi1IZXJlIGlzIGFuIGV4YW1wbGUgb2YgYSBjb3JyZWN0bHkgKHRob3VnaCBjb25mdXNpbmdseSkgaW5kZW50ZWQgcGllY2UKLW9mIFB5dGhvbiBjb2RlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1kZWYgcGVybShsKToKLSAgICAgICAgIyBDb21wdXRlIHRoZSBsaXN0IG9mIGFsbCBwZXJtdXRhdGlvbnMgb2YgbAotICAgIGlmIGxlbihsKSA8PSAxOgotICAgICAgICAgICAgICAgICAgcmV0dXJuIFtsXQotICAgIHIgPSBbXQotICAgIGZvciBpIGluIHJhbmdlKGxlbihsKSk6Ci0gICAgICAgICAgICAgcyA9IGxbOmldICsgbFtpKzE6XQotICAgICAgICAgICAgIHAgPSBwZXJtKHMpCi0gICAgICAgICAgICAgZm9yIHggaW4gcDoKLSAgICAgICAgICAgICAgci5hcHBlbmQobFtpOmkrMV0gKyB4KQotICAgIHJldHVybiByCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgdmFyaW91cyBpbmRlbnRhdGlvbiBlcnJvcnM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSBkZWYgcGVybShsKTogICAgICAgICAgICAgICAgICAgICAgICMgZXJyb3I6IGZpcnN0IGxpbmUgaW5kZW50ZWQKLWZvciBpIGluIHJhbmdlKGxlbihsKSk6ICAgICAgICAgICAgICMgZXJyb3I6IG5vdCBpbmRlbnRlZAotICAgIHMgPSBsWzppXSArIGxbaSsxOl0KLSAgICAgICAgcCA9IHBlcm0obFs6aV0gKyBsW2krMTpdKSAgICMgZXJyb3I6IHVuZXhwZWN0ZWQgaW5kZW50Ci0gICAgICAgIGZvciB4IGluIHA6Ci0gICAgICAgICAgICAgICAgci5hcHBlbmQobFtpOmkrMV0gKyB4KQotICAgICAgICAgICAgcmV0dXJuIHIgICAgICAgICAgICAgICAgIyBlcnJvcjogaW5jb25zaXN0ZW50IGRlZGVudAotXGVuZHt2ZXJiYXRpbX0KLQotKEFjdHVhbGx5LCB0aGUgZmlyc3QgdGhyZWUgZXJyb3JzIGFyZSBkZXRlY3RlZCBieSB0aGUgcGFyc2VyOyBvbmx5IHRoZQotbGFzdCBlcnJvciBpcyBmb3VuZCBieSB0aGUgbGV4aWNhbCBhbmFseXplciAtLS0gdGhlIGluZGVudGF0aW9uIG9mCi1cY29kZXtyZXR1cm4gcn0gZG9lcyBub3QgbWF0Y2ggYSBsZXZlbCBwb3BwZWQgb2ZmIHRoZSBzdGFjay4pCi0KLQotXHN1YnNlY3Rpb257V2hpdGVzcGFjZSBiZXR3ZWVuIHRva2Vuc1xsYWJlbHt3aGl0ZXNwYWNlfX0KLQotRXhjZXB0IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsb2dpY2FsIGxpbmUgb3IgaW4gc3RyaW5nIGxpdGVyYWxzLCB0aGUKLXdoaXRlc3BhY2UgY2hhcmFjdGVycyBzcGFjZSwgdGFiIGFuZCBmb3JtZmVlZCBjYW4gYmUgdXNlZAotaW50ZXJjaGFuZ2VhYmx5IHRvIHNlcGFyYXRlIHRva2Vucy4gIFdoaXRlc3BhY2UgaXMgbmVlZGVkIGJldHdlZW4gdHdvCi10b2tlbnMgb25seSBpZiB0aGVpciBjb25jYXRlbmF0aW9uIGNvdWxkIG90aGVyd2lzZSBiZSBpbnRlcnByZXRlZCBhcyBhCi1kaWZmZXJlbnQgdG9rZW4gKGUuZy4sIGFiIGlzIG9uZSB0b2tlbiwgYnV0IGEgYiBpcyB0d28gdG9rZW5zKS4KLQotCi1cc2VjdGlvbntPdGhlciB0b2tlbnNcbGFiZWx7b3RoZXItdG9rZW5zfX0KLQotQmVzaWRlcyBORVdMSU5FLCBJTkRFTlQgYW5kIERFREVOVCwgdGhlIGZvbGxvd2luZyBjYXRlZ29yaWVzIG9mIHRva2VucwotZXhpc3Q6IFxlbXBoe2lkZW50aWZpZXJzfSwgXGVtcGh7a2V5d29yZHN9LCBcZW1waHtsaXRlcmFsc30sCi1cZW1waHtvcGVyYXRvcnN9LCBhbmQgXGVtcGh7ZGVsaW1pdGVyc30uCi1XaGl0ZXNwYWNlIGNoYXJhY3RlcnMgKG90aGVyIHRoYW4gbGluZSB0ZXJtaW5hdG9ycywgZGlzY3Vzc2VkIGVhcmxpZXIpCi1hcmUgbm90IHRva2VucywgYnV0IHNlcnZlIHRvIGRlbGltaXQgdG9rZW5zLgotV2hlcmUKLWFtYmlndWl0eSBleGlzdHMsIGEgdG9rZW4gY29tcHJpc2VzIHRoZSBsb25nZXN0IHBvc3NpYmxlIHN0cmluZyB0aGF0Ci1mb3JtcyBhIGxlZ2FsIHRva2VuLCB3aGVuIHJlYWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LgotCi0KLVxzZWN0aW9ue0lkZW50aWZpZXJzIGFuZCBrZXl3b3Jkc1xsYWJlbHtpZGVudGlmaWVyc319Ci0KLUlkZW50aWZpZXJzIChhbHNvIHJlZmVycmVkIHRvIGFzIFxlbXBoe25hbWVzfSkgYXJlIGRlc2NyaWJlZCBieSB0aGUgZm9sbG93aW5nCi1sZXhpY2FsIGRlZmluaXRpb25zOgotXGluZGV4e2lkZW50aWZpZXJ9Ci1caW5kZXh7bmFtZX0KLQotXGJlZ2lue3Byb2R1Y3Rpb25saXN0fQotICBccHJvZHVjdGlvbntpZGVudGlmaWVyfQotICAgICAgICAgICAgIHsoXHRva2Vue2xldHRlcn18Il8iKSAoXHRva2Vue2xldHRlcn0gfCBcdG9rZW57ZGlnaXR9IHwgIl8iKSp9Ci0gIFxwcm9kdWN0aW9ue2xldHRlcn0KLSAgICAgICAgICAgICB7XHRva2Vue2xvd2VyY2FzZX0gfCBcdG9rZW57dXBwZXJjYXNlfX0KLSAgXHByb2R1Y3Rpb257bG93ZXJjYXNlfQotICAgICAgICAgICAgIHsiYSIuLi4ieiJ9Ci0gIFxwcm9kdWN0aW9ue3VwcGVyY2FzZX0KLSAgICAgICAgICAgICB7IkEiLi4uIloifQotICBccHJvZHVjdGlvbntkaWdpdH0KLSAgICAgICAgICAgICB7IjAiLi4uIjkifQotXGVuZHtwcm9kdWN0aW9ubGlzdH0KLQotSWRlbnRpZmllcnMgYXJlIHVubGltaXRlZCBpbiBsZW5ndGguICBDYXNlIGlzIHNpZ25pZmljYW50LgotCi0KLVxzdWJzZWN0aW9ue0tleXdvcmRzXGxhYmVse2tleXdvcmRzfX0KLQotVGhlIGZvbGxvd2luZyBpZGVudGlmaWVycyBhcmUgdXNlZCBhcyByZXNlcnZlZCB3b3Jkcywgb3IKLVxlbXBoe2tleXdvcmRzfSBvZiB0aGUgbGFuZ3VhZ2UsIGFuZCBjYW5ub3QgYmUgdXNlZCBhcyBvcmRpbmFyeQotaWRlbnRpZmllcnMuICBUaGV5IG11c3QgYmUgc3BlbGxlZCBleGFjdGx5IGFzIHdyaXR0ZW4gaGVyZTolCi1caW5kZXh7a2V5d29yZH0lCi1caW5kZXh7cmVzZXJ2ZWQgd29yZH0KLQotXGJlZ2lue3ZlcmJhdGltfQotYW5kICAgICAgIGRlZiAgICAgICBmb3IgICAgICAgaXMgICAgICAgIHJhaXNlCi1hcyAgICAgICAgZGVsICAgICAgIGZyb20gICAgICBsYW1iZGEgICAgcmV0dXJuCi1hc3NlcnQgICAgZWxpZiAgICAgIGdsb2JhbCAgICBub3QgICAgICAgdHJ5Ci1icmVhayAgICAgZWxzZSAgICAgIGlmICAgICAgICBvciAgICAgICAgd2hpbGUKLWNsYXNzICAgICBleGNlcHQgICAgaW1wb3J0ICAgIHBhc3MgICAgICB3aXRoCi1jb250aW51ZSAgZmluYWxseSAgIGluICAgICAgICBwcmludCAgICAgeWllbGQKLVxlbmR7dmVyYmF0aW19Ci0KLSUgV2hlbiBhZGRpbmcga2V5d29yZHMsIHVzZSByZXN3b3Jkcy5weSBmb3IgcmVmb3JtYXR0aW5nCi0KLVx2ZXJzaW9uY2hhbmdlZFtcY29uc3RhbnR7Tm9uZX0gYmVjYW1lIGEgY29uc3RhbnQgYW5kIGlzIG5vdwotcmVjb2duaXplZCBieSB0aGUgY29tcGlsZXIgYXMgYSBuYW1lIGZvciB0aGUgYnVpbHQtaW4gb2JqZWN0Ci1cY29uc3RhbnR7Tm9uZX0uICBBbHRob3VnaCBpdCBpcyBub3QgYSBrZXl3b3JkLCB5b3UgY2Fubm90IGFzc2lnbgotYSBkaWZmZXJlbnQgb2JqZWN0IHRvIGl0XXsyLjR9Ci0KLVx2ZXJzaW9uY2hhbmdlZFtCb3RoIFxrZXl3b3Jke2FzfSBhbmQgXGtleXdvcmR7d2l0aH0gYXJlIG9ubHkgcmVjb2duaXplZAotd2hlbiB0aGUgXGNvZGV7d2l0aF9zdGF0ZW1lbnR9IGZ1dHVyZSBmZWF0dXJlIGhhcyBiZWVuIGVuYWJsZWQuCi1JdCB3aWxsIGFsd2F5cyBiZSBlbmFibGVkIGluIFB5dGhvbiAyLjYuICBTZWUgc2VjdGlvbn5ccmVme3dpdGh9IGZvcgotZGV0YWlscy4gIE5vdGUgdGhhdCB1c2luZyBca2V5d29yZHthc30gYW5kIFxrZXl3b3Jke3dpdGh9IGFzIGlkZW50aWZpZXJzCi13aWxsIGFsd2F5cyBpc3N1ZSBhIHdhcm5pbmcsIGV2ZW4gd2hlbiB0aGUgXGNvZGV7d2l0aF9zdGF0ZW1lbnR9IGZ1dHVyZQotZGlyZWN0aXZlIGlzIG5vdCBpbiBlZmZlY3RdezIuNX0KLQotCi1cc3Vic2VjdGlvbntSZXNlcnZlZCBjbGFzc2VzIG9mIGlkZW50aWZpZXJzXGxhYmVse2lkLWNsYXNzZXN9fQotCi1DZXJ0YWluIGNsYXNzZXMgb2YgaWRlbnRpZmllcnMgKGJlc2lkZXMga2V5d29yZHMpIGhhdmUgc3BlY2lhbAotbWVhbmluZ3MuICBUaGVzZSBjbGFzc2VzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZSBwYXR0ZXJucyBvZiBsZWFkaW5nIGFuZAotdHJhaWxpbmcgdW5kZXJzY29yZSBjaGFyYWN0ZXJzOgotCi1cYmVnaW57ZGVzY3JpcHRpb259Ci0KLVxpdGVtW1xjb2Rle18qfV0KLSAgTm90IGltcG9ydGVkIGJ5IFxzYW1we2Zyb20gXHZhcnttb2R1bGV9IGltcG9ydCAqfS4gIFRoZSBzcGVjaWFsCi0gIGlkZW50aWZpZXIgXHNhbXB7X30gaXMgdXNlZCBpbiB0aGUgaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIgdG8gc3RvcmUKLSAgdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBldmFsdWF0aW9uOyBpdCBpcyBzdG9yZWQgaW4gdGhlCi0gIFxtb2R1bGV7X19idWlsdGluX199IG1vZHVsZS4gIFdoZW4gbm90IGluIGludGVyYWN0aXZlIG1vZGUsIFxzYW1we199Ci0gIGhhcyBubyBzcGVjaWFsIG1lYW5pbmcgYW5kIGlzIG5vdCBkZWZpbmVkLgotICBTZWUgc2VjdGlvbn5ccmVme2ltcG9ydH0sIGBgVGhlIFxrZXl3b3Jke2ltcG9ydH0gc3RhdGVtZW50LicnCi0KLSAgXG5vdGV7VGhlIG5hbWUgXHNhbXB7X30gaXMgb2Z0ZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoCi0gIGludGVybmF0aW9uYWxpemF0aW9uOyByZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlCi0gIFx1bGlua3tcbW9kdWxle2dldHRleHR9IG1vZHVsZX17Li4vbGliL21vZHVsZS1nZXR0ZXh0Lmh0bWx9IGZvciBtb3JlCi0gIGluZm9ybWF0aW9uIG9uIHRoaXMgY29udmVudGlvbi59Ci0KLVxpdGVtW1xjb2Rle19fKl9ffV0KLSAgU3lzdGVtLWRlZmluZWQgbmFtZXMuICBUaGVzZSBuYW1lcyBhcmUgZGVmaW5lZCBieSB0aGUgaW50ZXJwcmV0ZXIKLSAgYW5kIGl0cyBpbXBsZW1lbnRhdGlvbiAoaW5jbHVkaW5nIHRoZSBzdGFuZGFyZCBsaWJyYXJ5KTsKLSAgYXBwbGljYXRpb25zIHNob3VsZCBub3QgZXhwZWN0IHRvIGRlZmluZSBhZGRpdGlvbmFsIG5hbWVzIHVzaW5nIHRoaXMKLSAgY29udmVudGlvbi4gIFRoZSBzZXQgb2YgbmFtZXMgb2YgdGhpcyBjbGFzcyBkZWZpbmVkIGJ5IFB5dGhvbiBtYXkgYmUKLSAgZXh0ZW5kZWQgaW4gZnV0dXJlIHZlcnNpb25zLgotICBTZWUgc2VjdGlvbn5ccmVme3NwZWNpYWxuYW1lc30sIGBgU3BlY2lhbCBtZXRob2QgbmFtZXMuJycKLQotXGl0ZW1bXGNvZGV7X18qfV0KLSAgQ2xhc3MtcHJpdmF0ZSBuYW1lcy4gIE5hbWVzIGluIHRoaXMgY2F0ZWdvcnksIHdoZW4gdXNlZCB3aXRoaW4gdGhlCi0gIGNvbnRleHQgb2YgYSBjbGFzcyBkZWZpbml0aW9uLCBhcmUgcmUtd3JpdHRlbiB0byB1c2UgYSBtYW5nbGVkIGZvcm0KLSAgdG8gaGVscCBhdm9pZCBuYW1lIGNsYXNoZXMgYmV0d2VlbiBgYHByaXZhdGUnJyBhdHRyaWJ1dGVzIG9mIGJhc2UKLSAgYW5kIGRlcml2ZWQgY2xhc3Nlcy4KLSAgU2VlIHNlY3Rpb25+XHJlZnthdG9tLWlkZW50aWZpZXJzfSwgYGBJZGVudGlmaWVycyAoTmFtZXMpLicnCi0KLVxlbmR7ZGVzY3JpcHRpb259Ci0KLQotXHNlY3Rpb257TGl0ZXJhbHNcbGFiZWx7bGl0ZXJhbHN9fQotCi1MaXRlcmFscyBhcmUgbm90YXRpb25zIGZvciBjb25zdGFudCB2YWx1ZXMgb2Ygc29tZSBidWlsdC1pbiB0eXBlcy4KLVxpbmRleHtsaXRlcmFsfQotXGluZGV4e2NvbnN0YW50fQotCi0KLVxzdWJzZWN0aW9ue1N0cmluZyBsaXRlcmFsc1xsYWJlbHtzdHJpbmdzfX0KLQotU3RyaW5nIGxpdGVyYWxzIGFyZSBkZXNjcmliZWQgYnkgdGhlIGZvbGxvd2luZyBsZXhpY2FsIGRlZmluaXRpb25zOgotXGluZGV4e3N0cmluZyBsaXRlcmFsfQotCi1caW5kZXh7QVNDSUlAXEFTQ0lJfQotXGJlZ2lue3Byb2R1Y3Rpb25saXN0fQotICBccHJvZHVjdGlvbntzdHJpbmdsaXRlcmFsfQotICAgICAgICAgICAgIHtbXHRva2Vue3N0cmluZ3ByZWZpeH1dKFx0b2tlbntzaG9ydHN0cmluZ30gfCBcdG9rZW57bG9uZ3N0cmluZ30pfQotICBccHJvZHVjdGlvbntzdHJpbmdwcmVmaXh9Ci0gICAgICAgICAgICAgeyJyIiB8ICJ1IiB8ICJ1ciIgfCAiUiIgfCAiVSIgfCAiVVIiIHwgIlVyIiB8ICJ1UiJ9Ci0gIFxwcm9kdWN0aW9ue3Nob3J0c3RyaW5nfQotICAgICAgICAgICAgIHsiJyIgXHRva2Vue3Nob3J0c3RyaW5naXRlbX0qICInIgotICAgICAgICAgICAgICB8ICciJyBcdG9rZW57c2hvcnRzdHJpbmdpdGVtfSogJyInfQotICBccHJvZHVjdGlvbntsb25nc3RyaW5nfQotICAgICAgICAgICAgIHsiJycnIiBcdG9rZW57bG9uZ3N0cmluZ2l0ZW19KiAiJycnIn0KLSAgXHByb2R1Y3Rpb25jb250e3wgJyIiIicgXHRva2Vue2xvbmdzdHJpbmdpdGVtfSogJyIiIid9Ci0gIFxwcm9kdWN0aW9ue3Nob3J0c3RyaW5naXRlbX0KLSAgICAgICAgICAgICB7XHRva2Vue3Nob3J0c3RyaW5nY2hhcn0gfCBcdG9rZW57ZXNjYXBlc2VxfX0KLSAgXHByb2R1Y3Rpb257bG9uZ3N0cmluZ2l0ZW19Ci0gICAgICAgICAgICAge1x0b2tlbntsb25nc3RyaW5nY2hhcn0gfCBcdG9rZW57ZXNjYXBlc2VxfX0KLSAgXHByb2R1Y3Rpb257c2hvcnRzdHJpbmdjaGFyfQotICAgICAgICAgICAgIHs8YW55IHNvdXJjZSBjaGFyYWN0ZXIgZXhjZXB0ICJcZSIgb3IgbmV3bGluZSBvciB0aGUgcXVvdGU+fQotICBccHJvZHVjdGlvbntsb25nc3RyaW5nY2hhcn0KLSAgICAgICAgICAgICB7PGFueSBzb3VyY2UgY2hhcmFjdGVyIGV4Y2VwdCAiXGUiPn0KLSAgXHByb2R1Y3Rpb257ZXNjYXBlc2VxfQotICAgICAgICAgICAgIHsiXGUiIDxhbnkgQVNDSUkgY2hhcmFjdGVyPn0KLVxlbmR7cHJvZHVjdGlvbmxpc3R9Ci0KLU9uZSBzeW50YWN0aWMgcmVzdHJpY3Rpb24gbm90IGluZGljYXRlZCBieSB0aGVzZSBwcm9kdWN0aW9ucyBpcyB0aGF0Ci13aGl0ZXNwYWNlIGlzIG5vdCBhbGxvd2VkIGJldHdlZW4gdGhlIFxncmFtbWFydG9rZW57c3RyaW5ncHJlZml4fSBhbmQKLXRoZSByZXN0IG9mIHRoZSBzdHJpbmcgbGl0ZXJhbC4gVGhlIHNvdXJjZSBjaGFyYWN0ZXIgc2V0IGlzIGRlZmluZWQKLWJ5IHRoZSBlbmNvZGluZyBkZWNsYXJhdGlvbjsgaXQgaXMgXEFTQ0lJe30gaWYgbm8gZW5jb2RpbmcgZGVjbGFyYXRpb24KLWlzIGdpdmVuIGluIHRoZSBzb3VyY2UgZmlsZTsgc2VlIHNlY3Rpb25+XHJlZntlbmNvZGluZ3N9LgotCi1caW5kZXh7dHJpcGxlLXF1b3RlZCBzdHJpbmd9Ci1caW5kZXh7VW5pY29kZSBDb25zb3J0aXVtfQotXGluZGV4e3N0cmluZyFVbmljb2RlfQotSW4gcGxhaW4gRW5nbGlzaDogU3RyaW5nIGxpdGVyYWxzIGNhbiBiZSBlbmNsb3NlZCBpbiBtYXRjaGluZyBzaW5nbGUKLXF1b3RlcyAoXGNvZGV7J30pIG9yIGRvdWJsZSBxdW90ZXMgKFxjb2RleyJ9KS4gIFRoZXkgY2FuIGFsc28gYmUKLWVuY2xvc2VkIGluIG1hdGNoaW5nIGdyb3VwcyBvZiB0aHJlZSBzaW5nbGUgb3IgZG91YmxlIHF1b3RlcyAodGhlc2UKLWFyZSBnZW5lcmFsbHkgcmVmZXJyZWQgdG8gYXMgXGVtcGh7dHJpcGxlLXF1b3RlZCBzdHJpbmdzfSkuICBUaGUKLWJhY2tzbGFzaCAoXGNvZGV7XGV9KSBjaGFyYWN0ZXIgaXMgdXNlZCB0byBlc2NhcGUgY2hhcmFjdGVycyB0aGF0Ci1vdGhlcndpc2UgaGF2ZSBhIHNwZWNpYWwgbWVhbmluZywgc3VjaCBhcyBuZXdsaW5lLCBiYWNrc2xhc2ggaXRzZWxmLAotb3IgdGhlIHF1b3RlIGNoYXJhY3Rlci4gIFN0cmluZyBsaXRlcmFscyBtYXkgb3B0aW9uYWxseSBiZSBwcmVmaXhlZAotd2l0aCBhIGxldHRlciBcY2hhcmFjdGVye3J9IG9yIFxjaGFyYWN0ZXJ7Un07IHN1Y2ggc3RyaW5ncyBhcmUgY2FsbGVkCi1cZGZue3JhdyBzdHJpbmdzfVxpbmRleHtyYXcgc3RyaW5nfSBhbmQgdXNlIGRpZmZlcmVudCBydWxlcyBmb3IgaW50ZXJwcmV0aW5nCi1iYWNrc2xhc2ggZXNjYXBlIHNlcXVlbmNlcy4gIEEgcHJlZml4IG9mIFxjaGFyYWN0ZXJ7dX0gb3IgXGNoYXJhY3RlcntVfQotbWFrZXMgdGhlIHN0cmluZyBhIFVuaWNvZGUgc3RyaW5nLiAgVW5pY29kZSBzdHJpbmdzIHVzZSB0aGUgVW5pY29kZSBjaGFyYWN0ZXIKLXNldCBhcyBkZWZpbmVkIGJ5IHRoZSBVbmljb2RlIENvbnNvcnRpdW0gYW5kIElTT34xMDY0Ni4gIFNvbWUgYWRkaXRpb25hbAotZXNjYXBlIHNlcXVlbmNlcywgZGVzY3JpYmVkIGJlbG93LCBhcmUgYXZhaWxhYmxlIGluIFVuaWNvZGUgc3RyaW5ncy4KLVRoZSB0d28gcHJlZml4IGNoYXJhY3RlcnMgbWF5IGJlIGNvbWJpbmVkOyBpbiB0aGlzIGNhc2UsIFxjaGFyYWN0ZXJ7dX0gbXVzdAotYXBwZWFyIGJlZm9yZSBcY2hhcmFjdGVye3J9LgotCi1JbiB0cmlwbGUtcXVvdGVkIHN0cmluZ3MsCi11bmVzY2FwZWQgbmV3bGluZXMgYW5kIHF1b3RlcyBhcmUgYWxsb3dlZCAoYW5kIGFyZSByZXRhaW5lZCksIGV4Y2VwdAotdGhhdCB0aHJlZSB1bmVzY2FwZWQgcXVvdGVzIGluIGEgcm93IHRlcm1pbmF0ZSB0aGUgc3RyaW5nLiAgKEEKLWBgcXVvdGUnJyBpcyB0aGUgY2hhcmFjdGVyIHVzZWQgdG8gb3BlbiB0aGUgc3RyaW5nLCBpLmUuIGVpdGhlcgotXGNvZGV7J30gb3IgXGNvZGV7In0uKQotCi1Vbmxlc3MgYW4gXGNoYXJhY3RlcntyfSBvciBcY2hhcmFjdGVye1J9IHByZWZpeCBpcyBwcmVzZW50LCBlc2NhcGUKLXNlcXVlbmNlcyBpbiBzdHJpbmdzIGFyZSBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gcnVsZXMgc2ltaWxhcgotdG8gdGhvc2UgdXNlZCBieSBTdGFuZGFyZCBDLiAgVGhlIHJlY29nbml6ZWQgZXNjYXBlIHNlcXVlbmNlcyBhcmU6Ci1caW5kZXh7cGh5c2ljYWwgbGluZX0KLVxpbmRleHtlc2NhcGUgc2VxdWVuY2V9Ci1caW5kZXh7U3RhbmRhcmQgQ30KLVxpbmRleHtDfQotCi1cYmVnaW57dGFibGVpaWl9e2x8bHxjfXtjb2RlfXtFc2NhcGUgU2VxdWVuY2V9e01lYW5pbmd9e05vdGVzfQotXGxpbmVpaWl7XGVcdmFye25ld2xpbmV9fSB7SWdub3JlZH17fQotXGxpbmVpaWl7XGVcZX0Je0JhY2tzbGFzaCAoXGNvZGV7XGV9KX17fQotXGxpbmVpaWl7XGUnfQl7U2luZ2xlIHF1b3RlIChcY29kZXsnfSl9e30KLVxsaW5laWlpe1xlIn0Je0RvdWJsZSBxdW90ZSAoXGNvZGV7In0pfXt9Ci1cbGluZWlpaXtcZSBhfQl7XEFTQ0lJe30gQmVsbCAoQkVMKX17fQotXGxpbmVpaWl7XGUgYn0Je1xBU0NJSXt9IEJhY2tzcGFjZSAoQlMpfXt9Ci1cbGluZWlpaXtcZSBmfQl7XEFTQ0lJe30gRm9ybWZlZWQgKEZGKX17fQotXGxpbmVpaWl7XGUgbn0Je1xBU0NJSXt9IExpbmVmZWVkIChMRil9e30KLVxsaW5laWlpe1xlIE5ce1x2YXJ7bmFtZX1cfX0KLSAgICAgICAge0NoYXJhY3RlciBuYW1lZCBcdmFye25hbWV9IGluIHRoZSBVbmljb2RlIGRhdGFiYXNlIChVbmljb2RlIG9ubHkpfXt9Ci1cbGluZWlpaXtcZSByfQl7XEFTQ0lJe30gQ2FycmlhZ2UgUmV0dXJuIChDUil9e30KLVxsaW5laWlpe1xlIHR9CXtcQVNDSUl7fSBIb3Jpem9udGFsIFRhYiAoVEFCKX17fQotXGxpbmVpaWl7XGUgdVx2YXJ7eHh4eH19Ci0gICAgICAgIHtDaGFyYWN0ZXIgd2l0aCAxNi1iaXQgaGV4IHZhbHVlIFx2YXJ7eHh4eH0gKFVuaWNvZGUgb25seSl9eygxKX0KLVxsaW5laWlpe1xlIFVcdmFye3h4eHh4eHh4fX0KLSAgICAgICAge0NoYXJhY3RlciB3aXRoIDMyLWJpdCBoZXggdmFsdWUgXHZhcnt4eHh4eHh4eH0gKFVuaWNvZGUgb25seSl9eygyKX0KLVxsaW5laWlpe1xlIHZ9CXtcQVNDSUl7fSBWZXJ0aWNhbCBUYWIgKFZUKX17fQotXGxpbmVpaWl7XGVcdmFye29vb319IHtDaGFyYWN0ZXIgd2l0aCBvY3RhbCB2YWx1ZSBcdmFye29vb319eygzLDUpfQotXGxpbmVpaWl7XGUgeFx2YXJ7aGh9fSB7Q2hhcmFjdGVyIHdpdGggaGV4IHZhbHVlIFx2YXJ7aGh9fXsoNCw1KX0KLVxlbmR7dGFibGVpaWl9Ci1caW5kZXh7QVNDSUlAXEFTQ0lJfQotCi1cbm9pbmRlbnQKLU5vdGVzOgotCi1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtWygxKV0KLSAgSW5kaXZpZHVhbCBjb2RlIHVuaXRzIHdoaWNoIGZvcm0gcGFydHMgb2YgYSBzdXJyb2dhdGUgcGFpciBjYW4gYmUKLSAgZW5jb2RlZCB1c2luZyB0aGlzIGVzY2FwZSBzZXF1ZW5jZS4KLVxpdGVtWygyKV0KLSAgQW55IFVuaWNvZGUgY2hhcmFjdGVyIGNhbiBiZSBlbmNvZGVkIHRoaXMgd2F5LCBidXQgY2hhcmFjdGVycwotICBvdXRzaWRlIHRoZSBCYXNpYyBNdWx0aWxpbmd1YWwgUGxhbmUgKEJNUCkgd2lsbCBiZSBlbmNvZGVkIHVzaW5nIGEKLSAgc3Vycm9nYXRlIHBhaXIgaWYgUHl0aG9uIGlzIGNvbXBpbGVkIHRvIHVzZSAxNi1iaXQgY29kZSB1bml0cyAodGhlCi0gIGRlZmF1bHQpLiAgSW5kaXZpZHVhbCBjb2RlIHVuaXRzIHdoaWNoIGZvcm0gcGFydHMgb2YgYSBzdXJyb2dhdGUKLSAgcGFpciBjYW4gYmUgZW5jb2RlZCB1c2luZyB0aGlzIGVzY2FwZSBzZXF1ZW5jZS4KLVxpdGVtWygzKV0KLSAgQXMgaW4gU3RhbmRhcmQgQywgdXAgdG8gdGhyZWUgb2N0YWwgZGlnaXRzIGFyZSBhY2NlcHRlZC4KLVxpdGVtWyg0KV0KLSAgVW5saWtlIGluIFN0YW5kYXJkIEMsIGF0IG1vc3QgdHdvIGhleCBkaWdpdHMgYXJlIGFjY2VwdGVkLgotXGl0ZW1bKDUpXQotICBJbiBhIHN0cmluZyBsaXRlcmFsLCBoZXhhZGVjaW1hbCBhbmQgb2N0YWwgZXNjYXBlcyBkZW5vdGUgdGhlCi0gIGJ5dGUgd2l0aCB0aGUgZ2l2ZW4gdmFsdWU7IGl0IGlzIG5vdCBuZWNlc3NhcnkgdGhhdCB0aGUgYnl0ZQotICBlbmNvZGVzIGEgY2hhcmFjdGVyIGluIHRoZSBzb3VyY2UgY2hhcmFjdGVyIHNldC4gSW4gYSBVbmljb2RlCi0gIGxpdGVyYWwsIHRoZXNlIGVzY2FwZXMgZGVub3RlIGEgVW5pY29kZSBjaGFyYWN0ZXIgd2l0aCB0aGUgZ2l2ZW4KLSAgdmFsdWUuCi1cZW5ke2l0ZW1pemV9Ci0KLQotVW5saWtlIFN0YW5kYXJkIFxpbmRleHt1bnJlY29nbml6ZWQgZXNjYXBlIHNlcXVlbmNlfUMsCi1hbGwgdW5yZWNvZ25pemVkIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIGxlZnQgaW4gdGhlIHN0cmluZyB1bmNoYW5nZWQsCi1pLmUuLCBcZW1waHt0aGUgYmFja3NsYXNoIGlzIGxlZnQgaW4gdGhlIHN0cmluZ30uICAoVGhpcyBiZWhhdmlvciBpcwotdXNlZnVsIHdoZW4gZGVidWdnaW5nOiBpZiBhbiBlc2NhcGUgc2VxdWVuY2UgaXMgbWlzdHlwZWQsIHRoZQotcmVzdWx0aW5nIG91dHB1dCBpcyBtb3JlIGVhc2lseSByZWNvZ25pemVkIGFzIGJyb2tlbi4pICBJdCBpcyBhbHNvCi1pbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRoZSBlc2NhcGUgc2VxdWVuY2VzIG1hcmtlZCBhcyBgYChVbmljb2RlCi1vbmx5KScnIGluIHRoZSB0YWJsZSBhYm92ZSBmYWxsIGludG8gdGhlIGNhdGVnb3J5IG9mIHVucmVjb2duaXplZAotZXNjYXBlcyBmb3Igbm9uLVVuaWNvZGUgc3RyaW5nIGxpdGVyYWxzLgotCi1XaGVuIGFuIFxjaGFyYWN0ZXJ7cn0gb3IgXGNoYXJhY3RlcntSfSBwcmVmaXggaXMgcHJlc2VudCwgYSBjaGFyYWN0ZXIKLWZvbGxvd2luZyBhIGJhY2tzbGFzaCBpcyBpbmNsdWRlZCBpbiB0aGUgc3RyaW5nIHdpdGhvdXQgY2hhbmdlLCBhbmQgXGVtcGh7YWxsCi1iYWNrc2xhc2hlcyBhcmUgbGVmdCBpbiB0aGUgc3RyaW5nfS4gIEZvciBleGFtcGxlLCB0aGUgc3RyaW5nIGxpdGVyYWwKLVxjb2Rle3IiXGUgbiJ9IGNvbnNpc3RzIG9mIHR3byBjaGFyYWN0ZXJzOiBhIGJhY2tzbGFzaCBhbmQgYSBsb3dlcmNhc2UKLVxjaGFyYWN0ZXJ7bn0uICBTdHJpbmcgcXVvdGVzIGNhbiBiZSBlc2NhcGVkIHdpdGggYSBiYWNrc2xhc2gsIGJ1dCB0aGUKLWJhY2tzbGFzaCByZW1haW5zIGluIHRoZSBzdHJpbmc7IGZvciBleGFtcGxlLCBcY29kZXtyIlxlIiJ9IGlzIGEgdmFsaWQgc3RyaW5nCi1saXRlcmFsIGNvbnNpc3Rpbmcgb2YgdHdvIGNoYXJhY3RlcnM6IGEgYmFja3NsYXNoIGFuZCBhIGRvdWJsZSBxdW90ZTsKLVxjb2Rle3IiXGUifSBpcyBub3QgYSB2YWxpZCBzdHJpbmcgbGl0ZXJhbCAoZXZlbiBhIHJhdyBzdHJpbmcgY2Fubm90Ci1lbmQgaW4gYW4gb2RkIG51bWJlciBvZiBiYWNrc2xhc2hlcykuICBTcGVjaWZpY2FsbHksIFxlbXBoe2EgcmF3Ci1zdHJpbmcgY2Fubm90IGVuZCBpbiBhIHNpbmdsZSBiYWNrc2xhc2h9IChzaW5jZSB0aGUgYmFja3NsYXNoIHdvdWxkCi1lc2NhcGUgdGhlIGZvbGxvd2luZyBxdW90ZSBjaGFyYWN0ZXIpLiAgTm90ZSBhbHNvIHRoYXQgYSBzaW5nbGUKLWJhY2tzbGFzaCBmb2xsb3dlZCBieSBhIG5ld2xpbmUgaXMgaW50ZXJwcmV0ZWQgYXMgdGhvc2UgdHdvIGNoYXJhY3RlcnMKLWFzIHBhcnQgb2YgdGhlIHN0cmluZywgXGVtcGh7bm90fSBhcyBhIGxpbmUgY29udGludWF0aW9uLgotCi1XaGVuIGFuIFxjaGFyYWN0ZXJ7cn0gb3IgXGNoYXJhY3RlcntSfSBwcmVmaXggaXMgdXNlZCBpbiBjb25qdW5jdGlvbgotd2l0aCBhIFxjaGFyYWN0ZXJ7dX0gb3IgXGNoYXJhY3RlcntVfSBwcmVmaXgsIHRoZW4gdGhlIFxjb2Rle1xlIHVYWFhYfQotYW5kIFxjb2Rle1xlIFVYWFhYWFhYWH0gZXNjYXBlIHNlcXVlbmNlcyBhcmUgcHJvY2Vzc2VkIHdoaWxlIAotXGVtcGh7YWxsIG90aGVyIGJhY2tzbGFzaGVzIGFyZSBsZWZ0IGluIHRoZSBzdHJpbmd9LgotRm9yIGV4YW1wbGUsIHRoZSBzdHJpbmcgbGl0ZXJhbAotXGNvZGV7dXIiXGV7fXUwMDYyXGUgbiJ9IGNvbnNpc3RzIG9mIHRocmVlIFVuaWNvZGUgY2hhcmFjdGVyczogYExBVElOCi1TTUFMTCBMRVRURVIgQicsIGBSRVZFUlNFIFNPTElEVVMnLCBhbmQgYExBVElOIFNNQUxMIExFVFRFUiBOJy4KLUJhY2tzbGFzaGVzIGNhbiBiZSBlc2NhcGVkIHdpdGggYSBwcmVjZWRpbmcgYmFja3NsYXNoOyBob3dldmVyLCBib3RoCi1yZW1haW4gaW4gdGhlIHN0cmluZy4gIEFzIGEgcmVzdWx0LCBcY29kZXtcZSB1WFhYWH0gZXNjYXBlIHNlcXVlbmNlcwotYXJlIG9ubHkgcmVjb2duaXplZCB3aGVuIHRoZXJlIGFyZSBhbiBvZGQgbnVtYmVyIG9mIGJhY2tzbGFzaGVzLgotCi1cc3Vic2VjdGlvbntTdHJpbmcgbGl0ZXJhbCBjb25jYXRlbmF0aW9uXGxhYmVse3N0cmluZy1jYXRlbmF0aW9ufX0KLQotTXVsdGlwbGUgYWRqYWNlbnQgc3RyaW5nIGxpdGVyYWxzIChkZWxpbWl0ZWQgYnkgd2hpdGVzcGFjZSksIHBvc3NpYmx5Ci11c2luZyBkaWZmZXJlbnQgcXVvdGluZyBjb252ZW50aW9ucywgYXJlIGFsbG93ZWQsIGFuZCB0aGVpciBtZWFuaW5nIGlzCi10aGUgc2FtZSBhcyB0aGVpciBjb25jYXRlbmF0aW9uLiAgVGh1cywgXGNvZGV7ImhlbGxvIiAnd29ybGQnfSBpcwotZXF1aXZhbGVudCB0byBcY29kZXsiaGVsbG93b3JsZCJ9LiAgVGhpcyBmZWF0dXJlIGNhbiBiZSB1c2VkIHRvIHJlZHVjZQotdGhlIG51bWJlciBvZiBiYWNrc2xhc2hlcyBuZWVkZWQsIHRvIHNwbGl0IGxvbmcgc3RyaW5ncyBjb252ZW5pZW50bHkKLWFjcm9zcyBsb25nIGxpbmVzLCBvciBldmVuIHRvIGFkZCBjb21tZW50cyB0byBwYXJ0cyBvZiBzdHJpbmdzLCBmb3IKLWV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXJlLmNvbXBpbGUoIltBLVphLXpfXSIgICAgICAgIyBsZXR0ZXIgb3IgdW5kZXJzY29yZQotICAgICAgICAgICAiW0EtWmEtejAtOV9dKiIgICAjIGxldHRlciwgZGlnaXQgb3IgdW5kZXJzY29yZQotICAgICAgICAgICkKLVxlbmR7dmVyYmF0aW19Ci0KLU5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgaXMgZGVmaW5lZCBhdCB0aGUgc3ludGFjdGljYWwgbGV2ZWwsIGJ1dAotaW1wbGVtZW50ZWQgYXQgY29tcGlsZSB0aW1lLiAgVGhlIGArJyBvcGVyYXRvciBtdXN0IGJlIHVzZWQgdG8KLWNvbmNhdGVuYXRlIHN0cmluZyBleHByZXNzaW9ucyBhdCBydW4gdGltZS4gIEFsc28gbm90ZSB0aGF0IGxpdGVyYWwKLWNvbmNhdGVuYXRpb24gY2FuIHVzZSBkaWZmZXJlbnQgcXVvdGluZyBzdHlsZXMgZm9yIGVhY2ggY29tcG9uZW50Ci0oZXZlbiBtaXhpbmcgcmF3IHN0cmluZ3MgYW5kIHRyaXBsZSBxdW90ZWQgc3RyaW5ncykuCi0KLQotXHN1YnNlY3Rpb257TnVtZXJpYyBsaXRlcmFsc1xsYWJlbHtudW1iZXJzfX0KLQotVGhlcmUgYXJlIGZvdXIgdHlwZXMgb2YgbnVtZXJpYyBsaXRlcmFsczogcGxhaW4gaW50ZWdlcnMsIGxvbmcKLWludGVnZXJzLCBmbG9hdGluZyBwb2ludCBudW1iZXJzLCBhbmQgaW1hZ2luYXJ5IG51bWJlcnMuICBUaGVyZSBhcmUgbm8KLWNvbXBsZXggbGl0ZXJhbHMgKGNvbXBsZXggbnVtYmVycyBjYW4gYmUgZm9ybWVkIGJ5IGFkZGluZyBhIHJlYWwKLW51bWJlciBhbmQgYW4gaW1hZ2luYXJ5IG51bWJlcikuCi1caW5kZXh7bnVtYmVyfQotXGluZGV4e251bWVyaWMgbGl0ZXJhbH0KLVxpbmRleHtpbnRlZ2VyIGxpdGVyYWx9Ci1caW5kZXh7cGxhaW4gaW50ZWdlciBsaXRlcmFsfQotXGluZGV4e2xvbmcgaW50ZWdlciBsaXRlcmFsfQotXGluZGV4e2Zsb2F0aW5nIHBvaW50IGxpdGVyYWx9Ci1caW5kZXh7aGV4YWRlY2ltYWwgbGl0ZXJhbH0KLVxpbmRleHtvY3RhbCBsaXRlcmFsfQotXGluZGV4e2JpbmFyeSBsaXRlcmFsfQotXGluZGV4e2RlY2ltYWwgbGl0ZXJhbH0KLVxpbmRleHtpbWFnaW5hcnkgbGl0ZXJhbH0KLVxpbmRleHtjb21wbGV4IWxpdGVyYWx9Ci0KLU5vdGUgdGhhdCBudW1lcmljIGxpdGVyYWxzIGRvIG5vdCBpbmNsdWRlIGEgc2lnbjsgYSBwaHJhc2UgbGlrZQotXGNvZGV7LTF9IGlzIGFjdHVhbGx5IGFuIGV4cHJlc3Npb24gY29tcG9zZWQgb2YgdGhlIHVuYXJ5IG9wZXJhdG9yCi1gXGNvZGV7LX0nIGFuZCB0aGUgbGl0ZXJhbCBcY29kZXsxfS4KLQotCi1cc3Vic2VjdGlvbntJbnRlZ2VyIGxpdGVyYWxzXGxhYmVse2ludGVnZXJzfX0KLQotSW50ZWdlciBsaXRlcmFscyBhcmUgZGVzY3JpYmVkIGJ5IHRoZSBmb2xsb3dpbmcKLWxleGljYWwgZGVmaW5pdGlvbnM6Ci0KLVxiZWdpbntwcm9kdWN0aW9ubGlzdH0KLSAgXHByb2R1Y3Rpb257aW50ZWdlcn0KLSAgICAgICAgICAgICB7XHRva2Vue2RlY2ltYWxpbnRlZ2VyfSB8IFx0b2tlbntvY3RpbnRlZ2VyfSB8IFx0b2tlbntoZXhpbnRlZ2VyfX0KLSAgXHByb2R1Y3Rpb257ZGVjaW1hbGludGVnZXJ9Ci0gICAgICAgICAgICAge1x0b2tlbntub256ZXJvZGlnaXR9IFx0b2tlbntkaWdpdH0qIHwgIjAiK30KLSAgXHByb2R1Y3Rpb257b2N0aW50ZWdlcn0KLSAgICAgICAgICAgICB7IjAiICgibyIgfCAiTyIpIFx0b2tlbntvY3RkaWdpdH0rfQotICBccHJvZHVjdGlvbntoZXhpbnRlZ2VyfQotICAgICAgICAgICAgIHsiMCIgKCJ4IiB8ICJYIikgXHRva2Vue2hleGRpZ2l0fSt9Ci0gIFxwcm9kdWN0aW9ue2JpbmludGVnZXJ9Ci0gICAgICAgICAgICAgeyIwIiAoImIiIHwgIkIiKSBcdG9rZW57YmluZGlnaXR9K30KLSAgXHByb2R1Y3Rpb257bm9uemVyb2RpZ2l0fQotICAgICAgICAgICAgIHsiMSIuLi4iOSJ9Ci0gIFxwcm9kdWN0aW9ue29jdGRpZ2l0fQotICAgICAgICAgICAgIHsiMCIuLi4iNyJ9Ci0gIFxwcm9kdWN0aW9ue2hleGRpZ2l0fQotICAgICAgICAgICAgIHtcdG9rZW57ZGlnaXR9IHwgImEiLi4uImYiIHwgIkEiLi4uIkYifQotICBccHJvZHVjdGlvbntiaW5kaWdpdH0KLSAgICAgICAgICAgICB7IjAiLi4uIjEifQotXGVuZHtwcm9kdWN0aW9ubGlzdH0KLQotUGxhaW4gaW50ZWdlciBsaXRlcmFscyB0aGF0IGFyZSBhYm92ZSB0aGUgbGFyZ2VzdCByZXByZXNlbnRhYmxlIHBsYWluCi1pbnRlZ2VyIChlLmcuLCAyMTQ3NDgzNjQ3IHdoZW4gdXNpbmcgMzItYml0IGFyaXRobWV0aWMpIGFyZSBhY2NlcHRlZAotYXMgaWYgdGhleSB3ZXJlIGxvbmcgaW50ZWdlcnMgaW5zdGVhZC5cZm9vdG5vdGV7SW4gdmVyc2lvbnMgb2YgUHl0aG9uCi1wcmlvciB0byAyLjQsIG9jdGFsIGFuZCBoZXhhZGVjaW1hbCBsaXRlcmFscyBpbiB0aGUgcmFuZ2UganVzdCBhYm92ZQotdGhlIGxhcmdlc3QgcmVwcmVzZW50YWJsZSBwbGFpbiBpbnRlZ2VyIGJ1dCBiZWxvdyB0aGUgbGFyZ2VzdCB1bnNpZ25lZAotMzItYml0IG51bWJlciAob24gYSBtYWNoaW5lIHVzaW5nIDMyLWJpdCBhcml0aG1ldGljKSwgNDI5NDk2NzI5Niwgd2VyZQotdGFrZW4gYXMgdGhlIG5lZ2F0aXZlIHBsYWluIGludGVnZXIgb2J0YWluZWQgYnkgc3VidHJhY3RpbmcgNDI5NDk2NzI5NgotZnJvbSB0aGVpciB1bnNpZ25lZCB2YWx1ZS59ICBUaGVyZSBpcyBubyBsaW1pdCBmb3IgbG9uZyBpbnRlZ2VyCi1saXRlcmFscyBhcGFydCBmcm9tIHdoYXQgY2FuIGJlIHN0b3JlZCBpbiBhdmFpbGFibGUgbWVtb3J5LgotCi1Ob3RlIHRoYXQgbGVhZGluZyB6ZXJvcyBpbiBhIG5vbi16ZXJvIGRlY2ltYWwgbnVtYmVyIGFyZSBub3QgYWxsb3dlZC4KLVRoaXMgaXMgZm9yIGRpc2FtYmlndWF0aW9uIHdpdGggQy1zdHlsZSBvY3RhbCBsaXRlcmFscywgd2hpY2ggUHl0aG9uCi11c2VkIGJlZm9yZSB2ZXJzaW9uIDMuMC4KLQotU29tZSBleGFtcGxlcyBvZiBpbnRlZ2VyIGxpdGVyYWxzOgotCi1cYmVnaW57dmVyYmF0aW19Ci03ICAgICAyMTQ3NDgzNjQ3ICAgICAgICAgICAgICAgICAgICAgICAgMG8xNzcgICAgMGIxMDAxMTAxMTEKLTMgICAgIDc5MjI4MTYyNTE0MjY0MzM3NTkzNTQzOTUwMzM2ICAgICAwbzM3NyAgICAweDEwMDAwMDAwMAotICAgICAgNzkyMjgxNjI1MTQyNjQzMzc1OTM1NDM5NTAzMzYgICAgICAgICAgICAgIDB4ZGVhZGJlZWYJCQkJCQkgICAgCi1cZW5ke3ZlcmJhdGltfQotCi0KLVxzdWJzZWN0aW9ue0Zsb2F0aW5nIHBvaW50IGxpdGVyYWxzXGxhYmVse2Zsb2F0aW5nfX0KLQotRmxvYXRpbmcgcG9pbnQgbGl0ZXJhbHMgYXJlIGRlc2NyaWJlZCBieSB0aGUgZm9sbG93aW5nIGxleGljYWwKLWRlZmluaXRpb25zOgotCi1cYmVnaW57cHJvZHVjdGlvbmxpc3R9Ci0gIFxwcm9kdWN0aW9ue2Zsb2F0bnVtYmVyfQotICAgICAgICAgICAgIHtcdG9rZW57cG9pbnRmbG9hdH0gfCBcdG9rZW57ZXhwb25lbnRmbG9hdH19Ci0gIFxwcm9kdWN0aW9ue3BvaW50ZmxvYXR9Ci0gICAgICAgICAgICAge1tcdG9rZW57aW50cGFydH1dIFx0b2tlbntmcmFjdGlvbn0gfCBcdG9rZW57aW50cGFydH0gIi4ifQotICBccHJvZHVjdGlvbntleHBvbmVudGZsb2F0fQotICAgICAgICAgICAgIHsoXHRva2Vue2ludHBhcnR9IHwgXHRva2Vue3BvaW50ZmxvYXR9KQotICAgICAgICAgICAgICBcdG9rZW57ZXhwb25lbnR9fQotICBccHJvZHVjdGlvbntpbnRwYXJ0fQotICAgICAgICAgICAgIHtcdG9rZW57ZGlnaXR9K30KLSAgXHByb2R1Y3Rpb257ZnJhY3Rpb259Ci0gICAgICAgICAgICAgeyIuIiBcdG9rZW57ZGlnaXR9K30KLSAgXHByb2R1Y3Rpb257ZXhwb25lbnR9Ci0gICAgICAgICAgICAgeygiZSIgfCAiRSIpIFsiKyIgfCAiLSJdIFx0b2tlbntkaWdpdH0rfQotXGVuZHtwcm9kdWN0aW9ubGlzdH0KLQotTm90ZSB0aGF0IHRoZSBpbnRlZ2VyIGFuZCBleHBvbmVudCBwYXJ0cyBhcmUgYWx3YXlzIGludGVycHJldGVkIHVzaW5nCi1yYWRpeCAxMC4gIEZvciBleGFtcGxlLCBcc2FtcHswNzdlMDEwfSBpcyBsZWdhbCwgYW5kIGRlbm90ZXMgdGhlIHNhbWUKLW51bWJlciBhcyBcc2FtcHs3N2UxMH0uCi1UaGUgYWxsb3dlZCByYW5nZSBvZiBmbG9hdGluZyBwb2ludCBsaXRlcmFscyBpcyBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQuCi1Tb21lIGV4YW1wbGVzIG9mIGZsb2F0aW5nIHBvaW50IGxpdGVyYWxzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0zLjE0ICAgIDEwLiAgICAuMDAxICAgIDFlMTAwICAgIDMuMTRlLTEwICAgIDBlMAotXGVuZHt2ZXJiYXRpbX0KLQotTm90ZSB0aGF0IG51bWVyaWMgbGl0ZXJhbHMgZG8gbm90IGluY2x1ZGUgYSBzaWduOyBhIHBocmFzZSBsaWtlCi1cY29kZXstMX0gaXMgYWN0dWFsbHkgYW4gZXhwcmVzc2lvbiBjb21wb3NlZCBvZiB0aGUgdW5hcnkgb3BlcmF0b3IKLVxjb2Rley19IGFuZCB0aGUgbGl0ZXJhbCBcY29kZXsxfS4KLQotCi1cc3Vic2VjdGlvbntJbWFnaW5hcnkgbGl0ZXJhbHNcbGFiZWx7aW1hZ2luYXJ5fX0KLQotSW1hZ2luYXJ5IGxpdGVyYWxzIGFyZSBkZXNjcmliZWQgYnkgdGhlIGZvbGxvd2luZyBsZXhpY2FsIGRlZmluaXRpb25zOgotCi1cYmVnaW57cHJvZHVjdGlvbmxpc3R9Ci0gIFxwcm9kdWN0aW9ue2ltYWdudW1iZXJ9eyhcdG9rZW57ZmxvYXRudW1iZXJ9IHwgXHRva2Vue2ludHBhcnR9KSAoImoiIHwgIkoiKX0KLVxlbmR7cHJvZHVjdGlvbmxpc3R9Ci0KLUFuIGltYWdpbmFyeSBsaXRlcmFsIHlpZWxkcyBhIGNvbXBsZXggbnVtYmVyIHdpdGggYSByZWFsIHBhcnQgb2YKLTAuMC4gIENvbXBsZXggbnVtYmVycyBhcmUgcmVwcmVzZW50ZWQgYXMgYSBwYWlyIG9mIGZsb2F0aW5nIHBvaW50Ci1udW1iZXJzIGFuZCBoYXZlIHRoZSBzYW1lIHJlc3RyaWN0aW9ucyBvbiB0aGVpciByYW5nZS4gIFRvIGNyZWF0ZSBhCi1jb21wbGV4IG51bWJlciB3aXRoIGEgbm9uemVybyByZWFsIHBhcnQsIGFkZCBhIGZsb2F0aW5nIHBvaW50IG51bWJlcgotdG8gaXQsIGUuZy4sIFxjb2RleygzKzRqKX0uICBTb21lIGV4YW1wbGVzIG9mIGltYWdpbmFyeSBsaXRlcmFsczoKLQotXGJlZ2lue3ZlcmJhdGltfQotMy4xNGogICAxMC5qICAgIDEwaiAgICAgLjAwMWogICAxZTEwMGogIDMuMTRlLTEwaiAKLVxlbmR7dmVyYmF0aW19Ci0KLQotXHNlY3Rpb257T3BlcmF0b3JzXGxhYmVse29wZXJhdG9yc319Ci0KLVRoZSBmb2xsb3dpbmcgdG9rZW5zIGFyZSBvcGVyYXRvcnM6Ci1caW5kZXh7b3BlcmF0b3JzfQotCi1cYmVnaW57dmVyYmF0aW19Ci0rICAgICAgIC0gICAgICAgKiAgICAgICAqKiAgICAgIC8gICAgICAgLy8gICAgICAlCi08PCAgICAgID4+ICAgICAgJiAgICAgICB8ICAgICAgIF4gICAgICAgfgotPCAgICAgICA+ICAgICAgIDw9ICAgICAgPj0gICAgICA9PSAgICAgICE9Ci1cZW5ke3ZlcmJhdGltfQotCi0KLVxzZWN0aW9ue0RlbGltaXRlcnNcbGFiZWx7ZGVsaW1pdGVyc319Ci0KLVRoZSBmb2xsb3dpbmcgdG9rZW5zIHNlcnZlIGFzIGRlbGltaXRlcnMgaW4gdGhlIGdyYW1tYXI6Ci1caW5kZXh7ZGVsaW1pdGVyc30KLQotXGJlZ2lue3ZlcmJhdGltfQotKCAgICAgICApICAgICAgIFsgICAgICAgXSAgICAgICB7ICAgICAgIH0gICAgICBACi0sICAgICAgIDogICAgICAgLiAgICAgICBgICAgICAgID0gICAgICAgOwotKz0gICAgICAtPSAgICAgICo9ICAgICAgLz0gICAgICAvLz0gICAgICU9Ci0mPSAgICAgIHw9ICAgICAgXj0gICAgICA+Pj0gICAgIDw8PSAgICAgKio9Ci1cZW5ke3ZlcmJhdGltfQotCi1UaGUgcGVyaW9kIGNhbiBhbHNvIG9jY3VyIGluIGZsb2F0aW5nLXBvaW50IGFuZCBpbWFnaW5hcnkgbGl0ZXJhbHMuICBBCi1zZXF1ZW5jZSBvZiB0aHJlZSBwZXJpb2RzIGhhcyBhIHNwZWNpYWwgbWVhbmluZyBhcyBhbiBlbGxpcHNpcyBpbiBzbGljZXMuCi1UaGUgc2Vjb25kIGhhbGYgb2YgdGhlIGxpc3QsIHRoZSBhdWdtZW50ZWQgYXNzaWdubWVudCBvcGVyYXRvcnMsIHNlcnZlCi1sZXhpY2FsbHkgYXMgZGVsaW1pdGVycywgYnV0IGFsc28gcGVyZm9ybSBhbiBvcGVyYXRpb24uCi0KLVRoZSBmb2xsb3dpbmcgcHJpbnRpbmcgXEFTQ0lJe30gY2hhcmFjdGVycyBoYXZlIHNwZWNpYWwgbWVhbmluZyBhcyBwYXJ0Ci1vZiBvdGhlciB0b2tlbnMgb3IgYXJlIG90aGVyd2lzZSBzaWduaWZpY2FudCB0byB0aGUgbGV4aWNhbCBhbmFseXplcjoKLQotXGJlZ2lue3ZlcmJhdGltfQotJyAgICAgICAiICAgICAgICMgICAgICAgXAotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGZvbGxvd2luZyBwcmludGluZyBcQVNDSUl7fSBjaGFyYWN0ZXJzIGFyZSBub3QgdXNlZCBpbiBQeXRob24uICBUaGVpcgotb2NjdXJyZW5jZSBvdXRzaWRlIHN0cmluZyBsaXRlcmFscyBhbmQgY29tbWVudHMgaXMgYW4gdW5jb25kaXRpb25hbAotZXJyb3I6Ci1caW5kZXh7QVNDSUlAXEFTQ0lJfQotCi1cYmVnaW57dmVyYmF0aW19Ci0kICAgICAgID8KLVxlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvcmVmL3JlZjMudGV4IGIvRG9jL3JlZi9yZWYzLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI1NTZlNC4uMDAwMDAwMAotLS0gYS9Eb2MvcmVmL3JlZjMudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMjA5MyArMCwwIEBACi1cY2hhcHRlcntEYXRhIG1vZGVsXGxhYmVse2RhdGFtb2RlbH19Ci0KLQotXHNlY3Rpb257T2JqZWN0cywgdmFsdWVzIGFuZCB0eXBlc1xsYWJlbHtvYmplY3RzfX0KLQotXGRmbntPYmplY3RzfSBhcmUgUHl0aG9uJ3MgYWJzdHJhY3Rpb24gZm9yIGRhdGEuICBBbGwgZGF0YSBpbiBhIFB5dGhvbgotcHJvZ3JhbSBpcyByZXByZXNlbnRlZCBieSBvYmplY3RzIG9yIGJ5IHJlbGF0aW9ucyBiZXR3ZWVuIG9iamVjdHMuCi0oSW4gYSBzZW5zZSwgYW5kIGluIGNvbmZvcm1hbmNlIHRvIFZvbiBOZXVtYW5uJ3MgbW9kZWwgb2YgYQotYGBzdG9yZWQgcHJvZ3JhbSBjb21wdXRlciwnJyBjb2RlIGlzIGFsc28gcmVwcmVzZW50ZWQgYnkgb2JqZWN0cy4pCi1caW5kZXh7b2JqZWN0fQotXGluZGV4e2RhdGF9Ci0KLUV2ZXJ5IG9iamVjdCBoYXMgYW4gaWRlbnRpdHksIGEgdHlwZSBhbmQgYSB2YWx1ZS4gIEFuIG9iamVjdCdzCi1cZW1waHtpZGVudGl0eX0gbmV2ZXIgY2hhbmdlcyBvbmNlIGl0IGhhcyBiZWVuIGNyZWF0ZWQ7IHlvdSBtYXkgdGhpbmsKLW9mIGl0IGFzIHRoZSBvYmplY3QncyBhZGRyZXNzIGluIG1lbW9yeS4gIFRoZSBgXGtleXdvcmR7aXN9JyBvcGVyYXRvcgotY29tcGFyZXMgdGhlIGlkZW50aXR5IG9mIHR3byBvYmplY3RzOyB0aGUKLVxmdW5jdGlvbntpZCgpfVxiaWZ1bmNpbmRleHtpZH0gZnVuY3Rpb24gcmV0dXJucyBhbiBpbnRlZ2VyCi1yZXByZXNlbnRpbmcgaXRzIGlkZW50aXR5IChjdXJyZW50bHkgaW1wbGVtZW50ZWQgYXMgaXRzIGFkZHJlc3MpLgotQW4gb2JqZWN0J3MgXGRmbnt0eXBlfSBpcwotYWxzbyB1bmNoYW5nZWFibGUuXGZvb3Rub3Rle1NpbmNlIFB5dGhvbiAyLjIsIGEgZ3JhZHVhbCBtZXJnaW5nIG9mCi10eXBlcyBhbmQgY2xhc3NlcyBoYXMgYmVlbiBzdGFydGVkIHRoYXQgbWFrZXMgdGhpcyBhbmQgYSBmZXcgb3RoZXIKLWFzc2VydGlvbnMgbWFkZSBpbiB0aGlzIG1hbnVhbCBub3QgMTAwXCUgYWNjdXJhdGUgYW5kIGNvbXBsZXRlOgotZm9yIGV4YW1wbGUsIGl0IFxlbXBoe2lzfSBub3cgcG9zc2libGUgaW4gc29tZSBjYXNlcyB0byBjaGFuZ2UgYW4KLW9iamVjdCdzIHR5cGUsIHVuZGVyIGNlcnRhaW4gY29udHJvbGxlZCBjb25kaXRpb25zLiAgVW50aWwgdGhpcyBtYW51YWwKLXVuZGVyZ29lcyBleHRlbnNpdmUgcmV2aXNpb24sIGl0IG11c3Qgbm93IGJlIHRha2VuIGFzIGF1dGhvcml0YXRpdmUKLW9ubHkgcmVnYXJkaW5nIGBgY2xhc3NpYyBjbGFzc2VzJycsIHRoYXQgYXJlIHN0aWxsIHRoZSBkZWZhdWx0LCBmb3IKLWNvbXBhdGliaWxpdHkgcHVycG9zZXMsIGluIFB5dGhvbiAyLjIgYW5kIDIuMy4gIEZvciBtb3JlIGluZm9ybWF0aW9uLAotc2VlIFx1cmx7aHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9uZXdzdHlsZS5odG1sfS59Ci1BbiBvYmplY3QncyB0eXBlIGRldGVybWluZXMgdGhlIG9wZXJhdGlvbnMgdGhhdCB0aGUgb2JqZWN0Ci1zdXBwb3J0cyAoZS5nLiwgYGBkb2VzIGl0IGhhdmUgYSBsZW5ndGg/JycpIGFuZCBhbHNvIGRlZmluZXMgdGhlCi1wb3NzaWJsZSB2YWx1ZXMgZm9yIG9iamVjdHMgb2YgdGhhdCB0eXBlLiAgVGhlCi1cZnVuY3Rpb257dHlwZSgpfVxiaWZ1bmNpbmRleHt0eXBlfSBmdW5jdGlvbiByZXR1cm5zIGFuIG9iamVjdCdzIHR5cGUKLSh3aGljaCBpcyBhbiBvYmplY3QgaXRzZWxmKS4gIFRoZSBcZW1waHt2YWx1ZX0gb2Ygc29tZQotb2JqZWN0cyBjYW4gY2hhbmdlLiAgT2JqZWN0cyB3aG9zZSB2YWx1ZSBjYW4gY2hhbmdlIGFyZSBzYWlkIHRvIGJlCi1cZW1waHttdXRhYmxlfTsgb2JqZWN0cyB3aG9zZSB2YWx1ZSBpcyB1bmNoYW5nZWFibGUgb25jZSB0aGV5IGFyZQotY3JlYXRlZCBhcmUgY2FsbGVkIFxlbXBoe2ltbXV0YWJsZX0uCi0oVGhlIHZhbHVlIG9mIGFuIGltbXV0YWJsZSBjb250YWluZXIgb2JqZWN0IHRoYXQgY29udGFpbnMgYSByZWZlcmVuY2UKLXRvIGEgbXV0YWJsZSBvYmplY3QgY2FuIGNoYW5nZSB3aGVuIHRoZSBsYXR0ZXIncyB2YWx1ZSBpcyBjaGFuZ2VkOwotaG93ZXZlciB0aGUgY29udGFpbmVyIGlzIHN0aWxsIGNvbnNpZGVyZWQgaW1tdXRhYmxlLCBiZWNhdXNlIHRoZQotY29sbGVjdGlvbiBvZiBvYmplY3RzIGl0IGNvbnRhaW5zIGNhbm5vdCBiZSBjaGFuZ2VkLiAgU28sIGltbXV0YWJpbGl0eQotaXMgbm90IHN0cmljdGx5IHRoZSBzYW1lIGFzIGhhdmluZyBhbiB1bmNoYW5nZWFibGUgdmFsdWUsIGl0IGlzIG1vcmUKLXN1YnRsZS4pCi1BbiBvYmplY3QncyBtdXRhYmlsaXR5IGlzIGRldGVybWluZWQgYnkgaXRzIHR5cGU7IGZvciBpbnN0YW5jZSwKLW51bWJlcnMsIHN0cmluZ3MgYW5kIHR1cGxlcyBhcmUgaW1tdXRhYmxlLCB3aGlsZSBkaWN0aW9uYXJpZXMgYW5kCi1saXN0cyBhcmUgbXV0YWJsZS4KLVxpbmRleHtpZGVudGl0eSBvZiBhbiBvYmplY3R9Ci1caW5kZXh7dmFsdWUgb2YgYW4gb2JqZWN0fQotXGluZGV4e3R5cGUgb2YgYW4gb2JqZWN0fQotXGluZGV4e211dGFibGUgb2JqZWN0fQotXGluZGV4e2ltbXV0YWJsZSBvYmplY3R9Ci0KLU9iamVjdHMgYXJlIG5ldmVyIGV4cGxpY2l0bHkgZGVzdHJveWVkOyBob3dldmVyLCB3aGVuIHRoZXkgYmVjb21lCi11bnJlYWNoYWJsZSB0aGV5IG1heSBiZSBnYXJiYWdlLWNvbGxlY3RlZC4gIEFuIGltcGxlbWVudGF0aW9uIGlzCi1hbGxvd2VkIHRvIHBvc3Rwb25lIGdhcmJhZ2UgY29sbGVjdGlvbiBvciBvbWl0IGl0IGFsdG9nZXRoZXIgLS0tIGl0IGlzCi1hIG1hdHRlciBvZiBpbXBsZW1lbnRhdGlvbiBxdWFsaXR5IGhvdyBnYXJiYWdlIGNvbGxlY3Rpb24gaXMKLWltcGxlbWVudGVkLCBhcyBsb25nIGFzIG5vIG9iamVjdHMgYXJlIGNvbGxlY3RlZCB0aGF0IGFyZSBzdGlsbAotcmVhY2hhYmxlLiAgKEltcGxlbWVudGF0aW9uIG5vdGU6IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHVzZXMgYQotcmVmZXJlbmNlLWNvdW50aW5nIHNjaGVtZSB3aXRoIChvcHRpb25hbCkgZGVsYXllZCBkZXRlY3Rpb24gb2YKLWN5Y2xpY2FsbHkgbGlua2VkIGdhcmJhZ2UsIHdoaWNoIGNvbGxlY3RzIG1vc3Qgb2JqZWN0cyBhcyBzb29uIGFzIHRoZXkKLWJlY29tZSB1bnJlYWNoYWJsZSwgYnV0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGNvbGxlY3QgZ2FyYmFnZQotY29udGFpbmluZyBjaXJjdWxhciByZWZlcmVuY2VzLiAgU2VlIHRoZQotXGNpdGV0aXRsZVsuLi9saWIvbW9kdWxlLWdjLmh0bWxde1B5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZX0gZm9yCi1pbmZvcm1hdGlvbiBvbiBjb250cm9sbGluZyB0aGUgY29sbGVjdGlvbiBvZiBjeWNsaWMgZ2FyYmFnZS4pCi1caW5kZXh7Z2FyYmFnZSBjb2xsZWN0aW9ufQotXGluZGV4e3JlZmVyZW5jZSBjb3VudGluZ30KLVxpbmRleHt1bnJlYWNoYWJsZSBvYmplY3R9Ci0KLU5vdGUgdGhhdCB0aGUgdXNlIG9mIHRoZSBpbXBsZW1lbnRhdGlvbidzIHRyYWNpbmcgb3IgZGVidWdnaW5nCi1mYWNpbGl0aWVzIG1heSBrZWVwIG9iamVjdHMgYWxpdmUgdGhhdCB3b3VsZCBub3JtYWxseSBiZSBjb2xsZWN0YWJsZS4KLUFsc28gbm90ZSB0aGF0IGNhdGNoaW5nIGFuIGV4Y2VwdGlvbiB3aXRoIGEKLWBca2V5d29yZHt0cnl9Li4uXGtleXdvcmR7ZXhjZXB0fScgc3RhdGVtZW50IG1heSBrZWVwIG9iamVjdHMgYWxpdmUuCi0KLVNvbWUgb2JqZWN0cyBjb250YWluIHJlZmVyZW5jZXMgdG8gYGBleHRlcm5hbCcnIHJlc291cmNlcyBzdWNoIGFzIG9wZW4KLWZpbGVzIG9yIHdpbmRvd3MuICBJdCBpcyB1bmRlcnN0b29kIHRoYXQgdGhlc2UgcmVzb3VyY2VzIGFyZSBmcmVlZAotd2hlbiB0aGUgb2JqZWN0IGlzIGdhcmJhZ2UtY29sbGVjdGVkLCBidXQgc2luY2UgZ2FyYmFnZSBjb2xsZWN0aW9uIGlzCi1ub3QgZ3VhcmFudGVlZCB0byBoYXBwZW4sIHN1Y2ggb2JqZWN0cyBhbHNvIHByb3ZpZGUgYW4gZXhwbGljaXQgd2F5IHRvCi1yZWxlYXNlIHRoZSBleHRlcm5hbCByZXNvdXJjZSwgdXN1YWxseSBhIFxtZXRob2R7Y2xvc2UoKX0gbWV0aG9kLgotUHJvZ3JhbXMgYXJlIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGV4cGxpY2l0bHkgY2xvc2Ugc3VjaAotb2JqZWN0cy4gIFRoZSBgXGtleXdvcmR7dHJ5fS4uLlxrZXl3b3Jke2ZpbmFsbHl9JyBzdGF0ZW1lbnQgcHJvdmlkZXMKLWEgY29udmVuaWVudCB3YXkgdG8gZG8gdGhpcy4KLQotU29tZSBvYmplY3RzIGNvbnRhaW4gcmVmZXJlbmNlcyB0byBvdGhlciBvYmplY3RzOyB0aGVzZSBhcmUgY2FsbGVkCi1cZW1waHtjb250YWluZXJzfS4gIEV4YW1wbGVzIG9mIGNvbnRhaW5lcnMgYXJlIHR1cGxlcywgbGlzdHMgYW5kCi1kaWN0aW9uYXJpZXMuICBUaGUgcmVmZXJlbmNlcyBhcmUgcGFydCBvZiBhIGNvbnRhaW5lcidzIHZhbHVlLiAgSW4KLW1vc3QgY2FzZXMsIHdoZW4gd2UgdGFsayBhYm91dCB0aGUgdmFsdWUgb2YgYSBjb250YWluZXIsIHdlIGltcGx5IHRoZQotdmFsdWVzLCBub3QgdGhlIGlkZW50aXRpZXMgb2YgdGhlIGNvbnRhaW5lZCBvYmplY3RzOyBob3dldmVyLCB3aGVuIHdlCi10YWxrIGFib3V0IHRoZSBtdXRhYmlsaXR5IG9mIGEgY29udGFpbmVyLCBvbmx5IHRoZSBpZGVudGl0aWVzIG9mCi10aGUgaW1tZWRpYXRlbHkgY29udGFpbmVkIG9iamVjdHMgYXJlIGltcGxpZWQuICBTbywgaWYgYW4gaW1tdXRhYmxlCi1jb250YWluZXIgKGxpa2UgYSB0dXBsZSkKLWNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIGEgbXV0YWJsZSBvYmplY3QsIGl0cyB2YWx1ZSBjaGFuZ2VzCi1pZiB0aGF0IG11dGFibGUgb2JqZWN0IGlzIGNoYW5nZWQuCi1caW5kZXh7Y29udGFpbmVyfQotCi1UeXBlcyBhZmZlY3QgYWxtb3N0IGFsbCBhc3BlY3RzIG9mIG9iamVjdCBiZWhhdmlvci4gIEV2ZW4gdGhlIGltcG9ydGFuY2UKLW9mIG9iamVjdCBpZGVudGl0eSBpcyBhZmZlY3RlZCBpbiBzb21lIHNlbnNlOiBmb3IgaW1tdXRhYmxlIHR5cGVzLAotb3BlcmF0aW9ucyB0aGF0IGNvbXB1dGUgbmV3IHZhbHVlcyBtYXkgYWN0dWFsbHkgcmV0dXJuIGEgcmVmZXJlbmNlIHRvCi1hbnkgZXhpc3Rpbmcgb2JqZWN0IHdpdGggdGhlIHNhbWUgdHlwZSBhbmQgdmFsdWUsIHdoaWxlIGZvciBtdXRhYmxlCi1vYmplY3RzIHRoaXMgaXMgbm90IGFsbG93ZWQuICBFLmcuLCBhZnRlcgotXHNhbXB7YSA9IDE7IGIgPSAxfSwKLVxjb2Rle2F9IGFuZCBcY29kZXtifSBtYXkgb3IgbWF5IG5vdCByZWZlciB0byB0aGUgc2FtZSBvYmplY3Qgd2l0aCB0aGUKLXZhbHVlIG9uZSwgZGVwZW5kaW5nIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiwgYnV0IGFmdGVyCi1cc2FtcHtjID0gW107IGQgPSBbXX0sIFxjb2Rle2N9IGFuZCBcY29kZXtkfQotYXJlIGd1YXJhbnRlZWQgdG8gcmVmZXIgdG8gdHdvIGRpZmZlcmVudCwgdW5pcXVlLCBuZXdseSBjcmVhdGVkIGVtcHR5Ci1saXN0cy4KLShOb3RlIHRoYXQgXHNhbXB7YyA9IGQgPSBbXX0gYXNzaWducyB0aGUgc2FtZSBvYmplY3QgdG8gYm90aAotXGNvZGV7Y30gYW5kIFxjb2Rle2R9LikKLQotCi1cc2VjdGlvbntUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHlcbGFiZWx7dHlwZXN9fQotCi1CZWxvdyBpcyBhIGxpc3Qgb2YgdGhlIHR5cGVzIHRoYXQgYXJlIGJ1aWx0IGludG8gUHl0aG9uLiAgRXh0ZW5zaW9uCi1tb2R1bGVzICh3cml0dGVuIGluIEMsIEphdmEsIG9yIG90aGVyIGxhbmd1YWdlcywgZGVwZW5kaW5nIG9uCi10aGUgaW1wbGVtZW50YXRpb24pIGNhbiBkZWZpbmUgYWRkaXRpb25hbCB0eXBlcy4gIEZ1dHVyZSB2ZXJzaW9ucyBvZgotUHl0aG9uIG1heSBhZGQgdHlwZXMgdG8gdGhlIHR5cGUgaGllcmFyY2h5IChlLmcuLCByYXRpb25hbAotbnVtYmVycywgZWZmaWNpZW50bHkgc3RvcmVkIGFycmF5cyBvZiBpbnRlZ2VycywgZXRjLikuCi1caW5kZXh7dHlwZX0KLVxpbmRleGlpe2RhdGF9e3R5cGV9Ci1caW5kZXhpaXt0eXBlfXtoaWVyYXJjaHl9Ci1caW5kZXhpaXtleHRlbnNpb259e21vZHVsZX0KLVxpbmRleGlpe0N9e2xhbmd1YWdlfQotCi1Tb21lIG9mIHRoZSB0eXBlIGRlc2NyaXB0aW9ucyBiZWxvdyBjb250YWluIGEgcGFyYWdyYXBoIGxpc3RpbmcKLWBzcGVjaWFsIGF0dHJpYnV0ZXMuJyAgVGhlc2UgYXJlIGF0dHJpYnV0ZXMgdGhhdCBwcm92aWRlIGFjY2VzcyB0byB0aGUKLWltcGxlbWVudGF0aW9uIGFuZCBhcmUgbm90IGludGVuZGVkIGZvciBnZW5lcmFsIHVzZS4gIFRoZWlyIGRlZmluaXRpb24KLW1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4KLVxpbmRleHthdHRyaWJ1dGV9Ci1caW5kZXhpaXtzcGVjaWFsfXthdHRyaWJ1dGV9Ci1caW5kZXhpaWl7Z2VuZXJpY317c3BlY2lhbH17YXR0cmlidXRlfQotCi1cYmVnaW57ZGVzY3JpcHRpb259Ci0KLVxpdGVtW05vbmVdCi1UaGlzIHR5cGUgaGFzIGEgc2luZ2xlIHZhbHVlLiAgVGhlcmUgaXMgYSBzaW5nbGUgb2JqZWN0IHdpdGggdGhpcyB2YWx1ZS4KLVRoaXMgb2JqZWN0IGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlIGJ1aWx0LWluIG5hbWUgXGNvZGV7Tm9uZX0uCi1JdCBpcyB1c2VkIHRvIHNpZ25pZnkgdGhlIGFic2VuY2Ugb2YgYSB2YWx1ZSBpbiBtYW55IHNpdHVhdGlvbnMsIGUuZy4sCi1pdCBpcyByZXR1cm5lZCBmcm9tIGZ1bmN0aW9ucyB0aGF0IGRvbid0IGV4cGxpY2l0bHkgcmV0dXJuIGFueXRoaW5nLgotSXRzIHRydXRoIHZhbHVlIGlzIGZhbHNlLgotXG9iaW5kZXh7Tm9uZX0KLQotXGl0ZW1bTm90SW1wbGVtZW50ZWRdCi1UaGlzIHR5cGUgaGFzIGEgc2luZ2xlIHZhbHVlLiAgVGhlcmUgaXMgYSBzaW5nbGUgb2JqZWN0IHdpdGggdGhpcyB2YWx1ZS4KLVRoaXMgb2JqZWN0IGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlIGJ1aWx0LWluIG5hbWUgXGNvZGV7Tm90SW1wbGVtZW50ZWR9LgotTnVtZXJpYyBtZXRob2RzIGFuZCByaWNoIGNvbXBhcmlzb24gbWV0aG9kcyBtYXkgcmV0dXJuIHRoaXMgdmFsdWUgaWYKLXRoZXkgZG8gbm90IGltcGxlbWVudCB0aGUgb3BlcmF0aW9uIGZvciB0aGUgb3BlcmFuZHMgcHJvdmlkZWQuICAoVGhlCi1pbnRlcnByZXRlciB3aWxsIHRoZW4gdHJ5IHRoZSByZWZsZWN0ZWQgb3BlcmF0aW9uLCBvciBzb21lIG90aGVyCi1mYWxsYmFjaywgZGVwZW5kaW5nIG9uIHRoZSBvcGVyYXRvci4pICBJdHMgdHJ1dGggdmFsdWUgaXMgdHJ1ZS4KLVxvYmluZGV4e05vdEltcGxlbWVudGVkfQotCi1caXRlbVtFbGxpcHNpc10KLVRoaXMgdHlwZSBoYXMgYSBzaW5nbGUgdmFsdWUuICBUaGVyZSBpcyBhIHNpbmdsZSBvYmplY3Qgd2l0aCB0aGlzIHZhbHVlLgotVGhpcyBvYmplY3QgaXMgYWNjZXNzZWQgdGhyb3VnaCB0aGUgbGl0ZXJhbCBcY29kZXsuLi59IG9yIHRoZQotYnVpbHQtaW4gbmFtZSBcY29kZXtFbGxpcHNpc30uICBJdHMgdHJ1dGggdmFsdWUgaXMgdHJ1ZS4KLVxvYmluZGV4e0VsbGlwc2lzfQotCi1caXRlbVtOdW1iZXJzXQotVGhlc2UgYXJlIGNyZWF0ZWQgYnkgbnVtZXJpYyBsaXRlcmFscyBhbmQgcmV0dXJuZWQgYXMgcmVzdWx0cyBieQotYXJpdGhtZXRpYyBvcGVyYXRvcnMgYW5kIGFyaXRobWV0aWMgYnVpbHQtaW4gZnVuY3Rpb25zLiAgTnVtZXJpYwotb2JqZWN0cyBhcmUgaW1tdXRhYmxlOyBvbmNlIGNyZWF0ZWQgdGhlaXIgdmFsdWUgbmV2ZXIgY2hhbmdlcy4gIFB5dGhvbgotbnVtYmVycyBhcmUgb2YgY291cnNlIHN0cm9uZ2x5IHJlbGF0ZWQgdG8gbWF0aGVtYXRpY2FsIG51bWJlcnMsIGJ1dAotc3ViamVjdCB0byB0aGUgbGltaXRhdGlvbnMgb2YgbnVtZXJpY2FsIHJlcHJlc2VudGF0aW9uIGluIGNvbXB1dGVycy4KLVxvYmluZGV4e251bWVyaWN9Ci0KLVB5dGhvbiBkaXN0aW5ndWlzaGVzIGJldHdlZW4gaW50ZWdlcnMsIGZsb2F0aW5nIHBvaW50IG51bWJlcnMsIGFuZAotY29tcGxleCBudW1iZXJzOgotCi1cYmVnaW57ZGVzY3JpcHRpb259Ci1caXRlbVtJbnRlZ2Vyc10KLVRoZXNlIHJlcHJlc2VudCBlbGVtZW50cyBmcm9tIHRoZSBtYXRoZW1hdGljYWwgc2V0IG9mIGludGVnZXJzCi0ocG9zaXRpdmUgYW5kIG5lZ2F0aXZlKS4KLVxvYmluZGV4e2ludGVnZXJ9Ci0KLVRoZXJlIGFyZSB0aHJlZSB0eXBlcyBvZiBpbnRlZ2VyczoKLQotXGJlZ2lue2Rlc2NyaXB0aW9ufQotCi1caXRlbVtQbGFpbiBpbnRlZ2Vyc10KLVRoZXNlIHJlcHJlc2VudCBudW1iZXJzIGluIHRoZSByYW5nZSAtMjE0NzQ4MzY0OCB0aHJvdWdoIDIxNDc0ODM2NDcuCi0oVGhlIHJhbmdlIG1heSBiZSBsYXJnZXIgb24gbWFjaGluZXMgd2l0aCBhIGxhcmdlciBuYXR1cmFsIHdvcmQKLXNpemUsIGJ1dCBub3Qgc21hbGxlci4pCi1XaGVuIHRoZSByZXN1bHQgb2YgYW4gb3BlcmF0aW9uIHdvdWxkIGZhbGwgb3V0c2lkZSB0aGlzIHJhbmdlLCB0aGUKLXJlc3VsdCBpcyBub3JtYWxseSByZXR1cm5lZCBhcyBhIGxvbmcgaW50ZWdlciAoaW4gc29tZSBjYXNlcywgdGhlCi1leGNlcHRpb24gXGV4Y2VwdGlvbntPdmVyZmxvd0Vycm9yfSBpcyByYWlzZWQgaW5zdGVhZCkuCi1Gb3IgdGhlIHB1cnBvc2Ugb2Ygc2hpZnQgYW5kIG1hc2sgb3BlcmF0aW9ucywgaW50ZWdlcnMgYXJlIGFzc3VtZWQgdG8KLWhhdmUgYSBiaW5hcnksIDIncyBjb21wbGVtZW50IG5vdGF0aW9uIHVzaW5nIDMyIG9yIG1vcmUgYml0cywgYW5kCi1oaWRpbmcgbm8gYml0cyBmcm9tIHRoZSB1c2VyIChpLmUuLCBhbGwgNDI5NDk2NzI5NiBkaWZmZXJlbnQgYml0Ci1wYXR0ZXJucyBjb3JyZXNwb25kIHRvIGRpZmZlcmVudCB2YWx1ZXMpLgotXG9iaW5kZXh7cGxhaW4gaW50ZWdlcn0KLVx3aXRoc3ViaXRlbXsoYnVpbHQtaW4gZXhjZXB0aW9uKX17XHR0aW5kZXh7T3ZlcmZsb3dFcnJvcn19Ci0KLVxpdGVtW0xvbmcgaW50ZWdlcnNdCi1UaGVzZSByZXByZXNlbnQgbnVtYmVycyBpbiBhbiB1bmxpbWl0ZWQgcmFuZ2UsIHN1YmplY3QgdG8gYXZhaWxhYmxlCi0odmlydHVhbCkgbWVtb3J5IG9ubHkuICBGb3IgdGhlIHB1cnBvc2Ugb2Ygc2hpZnQgYW5kIG1hc2sgb3BlcmF0aW9ucywKLWEgYmluYXJ5IHJlcHJlc2VudGF0aW9uIGlzIGFzc3VtZWQsIGFuZCBuZWdhdGl2ZSBudW1iZXJzIGFyZQotcmVwcmVzZW50ZWQgaW4gYSB2YXJpYW50IG9mIDIncyBjb21wbGVtZW50IHdoaWNoIGdpdmVzIHRoZSBpbGx1c2lvbiBvZgotYW4gaW5maW5pdGUgc3RyaW5nIG9mIHNpZ24gYml0cyBleHRlbmRpbmcgdG8gdGhlIGxlZnQuCi1cb2JpbmRleHtsb25nIGludGVnZXJ9Ci0KLVxpdGVtW0Jvb2xlYW5zXQotVGhlc2UgcmVwcmVzZW50IHRoZSB0cnV0aCB2YWx1ZXMgRmFsc2UgYW5kIFRydWUuICBUaGUgdHdvIG9iamVjdHMKLXJlcHJlc2VudGluZyB0aGUgdmFsdWVzIEZhbHNlIGFuZCBUcnVlIGFyZSB0aGUgb25seSBCb29sZWFuIG9iamVjdHMuCi1UaGUgQm9vbGVhbiB0eXBlIGlzIGEgc3VidHlwZSBvZiBwbGFpbiBpbnRlZ2VycywgYW5kIEJvb2xlYW4gdmFsdWVzCi1iZWhhdmUgbGlrZSB0aGUgdmFsdWVzIDAgYW5kIDEsIHJlc3BlY3RpdmVseSwgaW4gYWxtb3N0IGFsbCBjb250ZXh0cywKLXRoZSBleGNlcHRpb24gYmVpbmcgdGhhdCB3aGVuIGNvbnZlcnRlZCB0byBhIHN0cmluZywgdGhlIHN0cmluZ3MKLVxjb2RleyJGYWxzZSJ9IG9yIFxjb2RleyJUcnVlIn0gYXJlIHJldHVybmVkLCByZXNwZWN0aXZlbHkuCi1cb2JpbmRleHtCb29sZWFufQotXHR0aW5kZXh7RmFsc2V9Ci1cdHRpbmRleHtUcnVlfQotCi1cZW5ke2Rlc2NyaXB0aW9ufSAlIEludGVnZXJzCi0KLVRoZSBydWxlcyBmb3IgaW50ZWdlciByZXByZXNlbnRhdGlvbiBhcmUgaW50ZW5kZWQgdG8gZ2l2ZSB0aGUgbW9zdAotbWVhbmluZ2Z1bCBpbnRlcnByZXRhdGlvbiBvZiBzaGlmdCBhbmQgbWFzayBvcGVyYXRpb25zIGludm9sdmluZwotbmVnYXRpdmUgaW50ZWdlcnMgYW5kIHRoZSBsZWFzdCBzdXJwcmlzZXMgd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiB0aGUKLXBsYWluIGFuZCBsb25nIGludGVnZXIgZG9tYWlucy4gIEFueSBvcGVyYXRpb24gZXhjZXB0IGxlZnQgc2hpZnQsCi1pZiBpdCB5aWVsZHMgYSByZXN1bHQgaW4gdGhlIHBsYWluIGludGVnZXIgZG9tYWluIHdpdGhvdXQgY2F1c2luZwotb3ZlcmZsb3csIHdpbGwgeWllbGQgdGhlIHNhbWUgcmVzdWx0IGluIHRoZSBsb25nIGludGVnZXIgZG9tYWluIG9yCi13aGVuIHVzaW5nIG1peGVkIG9wZXJhbmRzLgotXGluZGV4aWl7aW50ZWdlcn17cmVwcmVzZW50YXRpb259Ci0KLVxpdGVtW0Zsb2F0aW5nIHBvaW50IG51bWJlcnNdCi1UaGVzZSByZXByZXNlbnQgbWFjaGluZS1sZXZlbCBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuCi1Zb3UgYXJlIGF0IHRoZSBtZXJjeSBvZiB0aGUgdW5kZXJseWluZyBtYWNoaW5lIGFyY2hpdGVjdHVyZSAoYW5kCi1DIG9yIEphdmEgaW1wbGVtZW50YXRpb24pIGZvciB0aGUgYWNjZXB0ZWQgcmFuZ2UgYW5kIGhhbmRsaW5nIG9mIG92ZXJmbG93LgotUHl0aG9uIGRvZXMgbm90IHN1cHBvcnQgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBudW1iZXJzOyB0aGUKLXNhdmluZ3MgaW4gcHJvY2Vzc29yIGFuZCBtZW1vcnkgdXNhZ2UgdGhhdCBhcmUgdXN1YWxseSB0aGUgcmVhc29uIGZvciB1c2luZwotdGhlc2UgaXMgZHdhcmZlZCBieSB0aGUgb3ZlcmhlYWQgb2YgdXNpbmcgb2JqZWN0cyBpbiBQeXRob24sIHNvIHRoZXJlCi1pcyBubyByZWFzb24gdG8gY29tcGxpY2F0ZSB0aGUgbGFuZ3VhZ2Ugd2l0aCB0d28ga2luZHMgb2YgZmxvYXRpbmcKLXBvaW50IG51bWJlcnMuCi1cb2JpbmRleHtmbG9hdGluZyBwb2ludH0KLVxpbmRleGlpe2Zsb2F0aW5nIHBvaW50fXtudW1iZXJ9Ci1caW5kZXhpaXtDfXtsYW5ndWFnZX0KLVxpbmRleGlpe0phdmF9e2xhbmd1YWdlfQotCi1caXRlbVtDb21wbGV4IG51bWJlcnNdCi1UaGVzZSByZXByZXNlbnQgY29tcGxleCBudW1iZXJzIGFzIGEgcGFpciBvZiBtYWNoaW5lLWxldmVsIGRvdWJsZQotcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuICBUaGUgc2FtZSBjYXZlYXRzIGFwcGx5IGFzIGZvcgotZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gIFRoZSByZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMgb2YgYSBjb21wbGV4Ci1udW1iZXIgXGNvZGV7en0gY2FuIGJlIHJldHJpZXZlZCB0aHJvdWdoIHRoZSByZWFkLW9ubHkgYXR0cmlidXRlcwotXGNvZGV7ei5yZWFsfSBhbmQgXGNvZGV7ei5pbWFnfS4KLVxvYmluZGV4e2NvbXBsZXh9Ci1caW5kZXhpaXtjb21wbGV4fXtudW1iZXJ9Ci0KLVxlbmR7ZGVzY3JpcHRpb259ICUgTnVtYmVycwotCi0KLVxpdGVtW1NlcXVlbmNlc10KLVRoZXNlIHJlcHJlc2VudCBmaW5pdGUgb3JkZXJlZCBzZXRzIGluZGV4ZWQgYnkgbm9uLW5lZ2F0aXZlIG51bWJlcnMuCi1UaGUgYnVpbHQtaW4gZnVuY3Rpb24gXGZ1bmN0aW9ue2xlbigpfVxiaWZ1bmNpbmRleHtsZW59IHJldHVybnMgdGhlCi1udW1iZXIgb2YgaXRlbXMgb2YgYSBzZXF1ZW5jZS4KLVdoZW4gdGhlIGxlbmd0aCBvZiBhIHNlcXVlbmNlIGlzIFx2YXJ7bn0sIHRoZQotaW5kZXggc2V0IGNvbnRhaW5zIHRoZSBudW1iZXJzIDAsIDEsIFxsZG90cywgXHZhcntufS0xLiAgSXRlbQotXHZhcntpfSBvZiBzZXF1ZW5jZSBcdmFye2F9IGlzIHNlbGVjdGVkIGJ5IFxjb2Rle1x2YXJ7YX1bXHZhcntpfV19LgotXG9iaW5kZXh7c2VxdWVuY2V9Ci1caW5kZXh7aW5kZXggb3BlcmF0aW9ufQotXGluZGV4e2l0ZW0gc2VsZWN0aW9ufQotXGluZGV4e3N1YnNjcmlwdGlvbn0KLQotU2VxdWVuY2VzIGFsc28gc3VwcG9ydCBzbGljaW5nOiBcY29kZXtcdmFye2F9W1x2YXJ7aX06XHZhcntqfV19Ci1zZWxlY3RzIGFsbCBpdGVtcyB3aXRoIGluZGV4IFx2YXJ7a30gc3VjaCB0aGF0IFx2YXJ7aX0gXGNvZGV7PD19Ci1cdmFye2t9IFxjb2Rlezx9IFx2YXJ7an0uICBXaGVuIHVzZWQgYXMgYW4gZXhwcmVzc2lvbiwgYSBzbGljZSBpcyBhCi1zZXF1ZW5jZSBvZiB0aGUgc2FtZSB0eXBlLiAgVGhpcyBpbXBsaWVzIHRoYXQgdGhlIGluZGV4IHNldCBpcwotcmVudW1iZXJlZCBzbyB0aGF0IGl0IHN0YXJ0cyBhdCAwLgotXGluZGV4e3NsaWNpbmd9Ci0KLVNvbWUgc2VxdWVuY2VzIGFsc28gc3VwcG9ydCBgYGV4dGVuZGVkIHNsaWNpbmcnJyB3aXRoIGEgdGhpcmQgYGBzdGVwJycKLXBhcmFtZXRlcjogXGNvZGV7XHZhcnthfVtcdmFye2l9Olx2YXJ7an06XHZhcntrfV19IHNlbGVjdHMgYWxsIGl0ZW1zCi1vZiBcdmFye2F9IHdpdGggaW5kZXggXHZhcnt4fSB3aGVyZSBcY29kZXtcdmFye3h9ID0gXHZhcntpfSArCi1cdmFye259Klx2YXJ7a319LCBcdmFye259IFxjb2Rlez49fSBcY29kZXswfSBhbmQgXHZhcntpfSBcY29kZXs8PX0KLVx2YXJ7eH0gXGNvZGV7PH0gXHZhcntqfS4KLVxpbmRleHtleHRlbmRlZCBzbGljaW5nfQotCi1TZXF1ZW5jZXMgYXJlIGRpc3Rpbmd1aXNoZWQgYWNjb3JkaW5nIHRvIHRoZWlyIG11dGFiaWxpdHk6Ci0KLVxiZWdpbntkZXNjcmlwdGlvbn0KLQotXGl0ZW1bSW1tdXRhYmxlIHNlcXVlbmNlc10KLUFuIG9iamVjdCBvZiBhbiBpbW11dGFibGUgc2VxdWVuY2UgdHlwZSBjYW5ub3QgY2hhbmdlIG9uY2UgaXQgaXMKLWNyZWF0ZWQuICAoSWYgdGhlIG9iamVjdCBjb250YWlucyByZWZlcmVuY2VzIHRvIG90aGVyIG9iamVjdHMsCi10aGVzZSBvdGhlciBvYmplY3RzIG1heSBiZSBtdXRhYmxlIGFuZCBtYXkgYmUgY2hhbmdlZDsgaG93ZXZlciwKLXRoZSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgZGlyZWN0bHkgcmVmZXJlbmNlZCBieSBhbiBpbW11dGFibGUgb2JqZWN0Ci1jYW5ub3QgY2hhbmdlLikKLVxvYmluZGV4e2ltbXV0YWJsZSBzZXF1ZW5jZX0KLVxvYmluZGV4e2ltbXV0YWJsZX0KLQotVGhlIGZvbGxvd2luZyB0eXBlcyBhcmUgaW1tdXRhYmxlIHNlcXVlbmNlczoKLQotXGJlZ2lue2Rlc2NyaXB0aW9ufQotCi1caXRlbVtTdHJpbmdzXQotVGhlIGl0ZW1zIG9mIGEgc3RyaW5nIGFyZSBjaGFyYWN0ZXJzLiAgVGhlcmUgaXMgbm8gc2VwYXJhdGUKLWNoYXJhY3RlciB0eXBlOyBhIGNoYXJhY3RlciBpcyByZXByZXNlbnRlZCBieSBhIHN0cmluZyBvZiBvbmUgaXRlbS4KLUNoYXJhY3RlcnMgcmVwcmVzZW50IChhdCBsZWFzdCkgOC1iaXQgYnl0ZXMuICBUaGUgYnVpbHQtaW4KLWZ1bmN0aW9ucyBcZnVuY3Rpb257Y2hyKCl9XGJpZnVuY2luZGV4e2Nocn0gYW5kCi1cZnVuY3Rpb257b3JkKCl9XGJpZnVuY2luZGV4e29yZH0gY29udmVydCBiZXR3ZWVuIGNoYXJhY3RlcnMgYW5kCi1ub25uZWdhdGl2ZSBpbnRlZ2VycyByZXByZXNlbnRpbmcgdGhlIGJ5dGUgdmFsdWVzLiAgQnl0ZXMgd2l0aCB0aGUKLXZhbHVlcyAwLTEyNyB1c3VhbGx5IHJlcHJlc2VudCB0aGUgY29ycmVzcG9uZGluZyBcQVNDSUl7fSB2YWx1ZXMsIGJ1dAotdGhlIGludGVycHJldGF0aW9uIG9mIHZhbHVlcyBpcyB1cCB0byB0aGUgcHJvZ3JhbS4gIFRoZSBzdHJpbmcKLWRhdGEgdHlwZSBpcyBhbHNvIHVzZWQgdG8gcmVwcmVzZW50IGFycmF5cyBvZiBieXRlcywgZS5nLiwgdG8gaG9sZCBkYXRhCi1yZWFkIGZyb20gYSBmaWxlLgotXG9iaW5kZXh7c3RyaW5nfQotXGluZGV4e2NoYXJhY3Rlcn0KLVxpbmRleHtieXRlfQotXGluZGV4e0FTQ0lJQFxBU0NJSX0KLQotKE9uIHN5c3RlbXMgd2hvc2UgbmF0aXZlIGNoYXJhY3RlciBzZXQgaXMgbm90IFxBU0NJSSwgc3RyaW5ncyBtYXkgdXNlCi1FQkNESUMgaW4gdGhlaXIgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24sIHByb3ZpZGVkIHRoZSBmdW5jdGlvbnMKLVxmdW5jdGlvbntjaHIoKX0gYW5kIFxmdW5jdGlvbntvcmQoKX0gaW1wbGVtZW50IGEgbWFwcGluZyBiZXR3ZWVuIFxBU0NJSXt9IGFuZAotRUJDRElDLCBhbmQgc3RyaW5nIGNvbXBhcmlzb24gcHJlc2VydmVzIHRoZSBcQVNDSUl7fSBvcmRlci4KLU9yIHBlcmhhcHMgc29tZW9uZSBjYW4gcHJvcG9zZSBhIGJldHRlciBydWxlPykKLVxpbmRleHtBU0NJSUBcQVNDSUl9Ci1caW5kZXh7RUJDRElDfQotXGluZGV4e2NoYXJhY3RlciBzZXR9Ci1caW5kZXhpaXtzdHJpbmd9e2NvbXBhcmlzb259Ci1cYmlmdW5jaW5kZXh7Y2hyfQotXGJpZnVuY2luZGV4e29yZH0KLQotXGl0ZW1bVW5pY29kZV0KLVRoZSBpdGVtcyBvZiBhIFVuaWNvZGUgb2JqZWN0IGFyZSBVbmljb2RlIGNvZGUgdW5pdHMuICBBIFVuaWNvZGUgY29kZQotdW5pdCBpcyByZXByZXNlbnRlZCBieSBhIFVuaWNvZGUgb2JqZWN0IG9mIG9uZSBpdGVtIGFuZCBjYW4gaG9sZAotZWl0aGVyIGEgMTYtYml0IG9yIDMyLWJpdCB2YWx1ZSByZXByZXNlbnRpbmcgYSBVbmljb2RlIG9yZGluYWwgKHRoZQotbWF4aW11bSB2YWx1ZSBmb3IgdGhlIG9yZGluYWwgaXMgZ2l2ZW4gaW4gXGNvZGV7c3lzLm1heHVuaWNvZGV9LCBhbmQKLWRlcGVuZHMgb24gaG93IFB5dGhvbiBpcyBjb25maWd1cmVkIGF0IGNvbXBpbGUgdGltZSkuICBTdXJyb2dhdGUgcGFpcnMKLW1heSBiZSBwcmVzZW50IGluIHRoZSBVbmljb2RlIG9iamVjdCwgYW5kIHdpbGwgYmUgcmVwb3J0ZWQgYXMgdHdvCi1zZXBhcmF0ZSBpdGVtcy4gIFRoZSBidWlsdC1pbiBmdW5jdGlvbnMKLVxmdW5jdGlvbnt1bmljaHIoKX1cYmlmdW5jaW5kZXh7dW5pY2hyfSBhbmQKLVxmdW5jdGlvbntvcmQoKX1cYmlmdW5jaW5kZXh7b3JkfSBjb252ZXJ0IGJldHdlZW4gY29kZSB1bml0cyBhbmQKLW5vbm5lZ2F0aXZlIGludGVnZXJzIHJlcHJlc2VudGluZyB0aGUgVW5pY29kZSBvcmRpbmFscyBhcyBkZWZpbmVkIGluCi10aGUgVW5pY29kZSBTdGFuZGFyZCAzLjAuIENvbnZlcnNpb24gZnJvbSBhbmQgdG8gb3RoZXIgZW5jb2RpbmdzIGFyZQotcG9zc2libGUgdGhyb3VnaCB0aGUgVW5pY29kZSBtZXRob2QgXG1ldGhvZHtlbmNvZGUoKX0gYW5kIHRoZSBidWlsdC1pbgotZnVuY3Rpb24gXGZ1bmN0aW9ue3VuaWNvZGUoKX0uXGJpZnVuY2luZGV4e3VuaWNvZGV9Ci1cb2JpbmRleHt1bmljb2RlfQotXGluZGV4e2NoYXJhY3Rlcn0KLVxpbmRleHtpbnRlZ2VyfQotXGluZGV4e1VuaWNvZGV9Ci0KLVxpdGVtW1R1cGxlc10KLVRoZSBpdGVtcyBvZiBhIHR1cGxlIGFyZSBhcmJpdHJhcnkgUHl0aG9uIG9iamVjdHMuCi1UdXBsZXMgb2YgdHdvIG9yIG1vcmUgaXRlbXMgYXJlIGZvcm1lZCBieSBjb21tYS1zZXBhcmF0ZWQgbGlzdHMKLW9mIGV4cHJlc3Npb25zLiAgQSB0dXBsZSBvZiBvbmUgaXRlbSAoYSBgc2luZ2xldG9uJykgY2FuIGJlIGZvcm1lZAotYnkgYWZmaXhpbmcgYSBjb21tYSB0byBhbiBleHByZXNzaW9uIChhbiBleHByZXNzaW9uIGJ5IGl0c2VsZiBkb2VzCi1ub3QgY3JlYXRlIGEgdHVwbGUsIHNpbmNlIHBhcmVudGhlc2VzIG11c3QgYmUgdXNhYmxlIGZvciBncm91cGluZyBvZgotZXhwcmVzc2lvbnMpLiAgQW4gZW1wdHkgdHVwbGUgY2FuIGJlIGZvcm1lZCBieSBhbiBlbXB0eSBwYWlyIG9mCi1wYXJlbnRoZXNlcy4KLVxvYmluZGV4e3R1cGxlfQotXGluZGV4aWl7c2luZ2xldG9ufXt0dXBsZX0KLVxpbmRleGlpe2VtcHR5fXt0dXBsZX0KLQotXGVuZHtkZXNjcmlwdGlvbn0gJSBJbW11dGFibGUgc2VxdWVuY2VzCi0KLVxpdGVtW011dGFibGUgc2VxdWVuY2VzXQotTXV0YWJsZSBzZXF1ZW5jZXMgY2FuIGJlIGNoYW5nZWQgYWZ0ZXIgdGhleSBhcmUgY3JlYXRlZC4gIFRoZQotc3Vic2NyaXB0aW9uIGFuZCBzbGljaW5nIG5vdGF0aW9ucyBjYW4gYmUgdXNlZCBhcyB0aGUgdGFyZ2V0IG9mCi1hc3NpZ25tZW50IGFuZCBca2V5d29yZHtkZWx9IChkZWxldGUpIHN0YXRlbWVudHMuCi1cb2JpbmRleHttdXRhYmxlIHNlcXVlbmNlfQotXG9iaW5kZXh7bXV0YWJsZX0KLVxpbmRleGlpe2Fzc2lnbm1lbnR9e3N0YXRlbWVudH0KLVxpbmRleHtkZWxldGV9Ci1cc3RpbmRleHtkZWx9Ci1caW5kZXh7c3Vic2NyaXB0aW9ufQotXGluZGV4e3NsaWNpbmd9Ci0KLVRoZXJlIGlzIGN1cnJlbnRseSBhIHNpbmdsZSBpbnRyaW5zaWMgbXV0YWJsZSBzZXF1ZW5jZSB0eXBlOgotCi1cYmVnaW57ZGVzY3JpcHRpb259Ci0KLVxpdGVtW0xpc3RzXQotVGhlIGl0ZW1zIG9mIGEgbGlzdCBhcmUgYXJiaXRyYXJ5IFB5dGhvbiBvYmplY3RzLiAgTGlzdHMgYXJlIGZvcm1lZAotYnkgcGxhY2luZyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGV4cHJlc3Npb25zIGluIHNxdWFyZSBicmFja2V0cy4KLShOb3RlIHRoYXQgdGhlcmUgYXJlIG5vIHNwZWNpYWwgY2FzZXMgbmVlZGVkIHRvIGZvcm0gbGlzdHMgb2YgbGVuZ3RoIDAKLW9yIDEuKQotXG9iaW5kZXh7bGlzdH0KLQotXGVuZHtkZXNjcmlwdGlvbn0gJSBNdXRhYmxlIHNlcXVlbmNlcwotCi1UaGUgZXh0ZW5zaW9uIG1vZHVsZSBcbW9kdWxle2FycmF5fVxyZWZzdG1vZGluZGV4e2FycmF5fSBwcm92aWRlcyBhbgotYWRkaXRpb25hbCBleGFtcGxlIG9mIGEgbXV0YWJsZSBzZXF1ZW5jZSB0eXBlLgotCi0KLVxlbmR7ZGVzY3JpcHRpb259ICUgU2VxdWVuY2VzCi0KLQotXGl0ZW1bU2V0IHR5cGVzXQotVGhlc2UgcmVwcmVzZW50IHVub3JkZXJlZCwgZmluaXRlIHNldHMgb2YgdW5pcXVlLCBpbW11dGFibGUgb2JqZWN0cy4KLUFzIHN1Y2gsIHRoZXkgY2Fubm90IGJlIGluZGV4ZWQgYnkgYW55IHN1YnNjcmlwdC4gSG93ZXZlciwgdGhleSBjYW4gYmUKLWl0ZXJhdGVkIG92ZXIsIGFuZCB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gXGZ1bmN0aW9ue2xlbigpfSByZXR1cm5zIHRoZQotbnVtYmVyIG9mIGl0ZW1zIGluIGEgc2V0LiBDb21tb24gdXNlcyBmb3Igc2V0cyBhcmUKLWZhc3QgbWVtYmVyc2hpcCB0ZXN0aW5nLCByZW1vdmluZyBkdXBsaWNhdGVzIGZyb20gYSBzZXF1ZW5jZSwgYW5kCi1jb21wdXRpbmcgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbnMgc3VjaCBhcyBpbnRlcnNlY3Rpb24sIHVuaW9uLCBkaWZmZXJlbmNlLAotYW5kIHN5bW1ldHJpYyBkaWZmZXJlbmNlLgotXGJpZnVuY2luZGV4e2xlbn0KLVxvYmluZGV4e3NldCB0eXBlfQotCi1Gb3Igc2V0IGVsZW1lbnRzLCB0aGUgc2FtZSBpbW11dGFiaWxpdHkgcnVsZXMgYXBwbHkgYXMgZm9yIGRpY3Rpb25hcnkKLWtleXMuIE5vdGUgdGhhdCBudW1lcmljIHR5cGVzIG9iZXkgdGhlIG5vcm1hbCBydWxlcyBmb3IgbnVtZXJpYwotY29tcGFyaXNvbjogaWYgdHdvIG51bWJlcnMgY29tcGFyZSBlcXVhbCAoZS5nLiwgXGNvZGV7MX0gYW5kCi1cY29kZXsxLjB9KSwgb25seSBvbmUgb2YgdGhlbSBjYW4gYmUgY29udGFpbmVkIGluIGEgc2V0LgotCi1UaGVyZSBhcmUgY3VycmVudGx5IHR3byBpbnRyaW5zaWMgc2V0IHR5cGVzOgotCi1cYmVnaW57ZGVzY3JpcHRpb259Ci0KLVxpdGVtW1NldHNdCi1UaGVzZVxvYmluZGV4e3NldH0gcmVwcmVzZW50IGEgbXV0YWJsZSBzZXQuIFRoZXkgYXJlIGNyZWF0ZWQgYnkgdGhlCi1idWlsdC1pbiBcZnVuY3Rpb257c2V0KCl9IGNvbnN0cnVjdG9yIGFuZCBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcwotYnkgc2V2ZXJhbCBtZXRob2RzLCBzdWNoIGFzIFxtZXRob2R7YWRkKCl9LgotCi1caXRlbVtGcm96ZW4gc2V0c10KLVRoZXNlXG9iaW5kZXh7ZnJvemVuc2V0fSByZXByZXNlbnQgYW4gaW1tdXRhYmxlIHNldC4gVGhleSBhcmUgY3JlYXRlZCBieQotdGhlIGJ1aWx0LWluIFxmdW5jdGlvbntmcm96ZW5zZXQoKX0gY29uc3RydWN0b3IuIEFzIGEgZnJvemVuc2V0IGlzCi1pbW11dGFibGUgYW5kIGhhc2hhYmxlLCBpdCBjYW4gYmUgdXNlZCBhZ2FpbiBhcyBhbiBlbGVtZW50IG9mIGFub3RoZXIgc2V0LAotb3IgYXMgYSBkaWN0aW9uYXJ5IGtleS4KLQotXGVuZHtkZXNjcmlwdGlvbn0gJSBTZXQgdHlwZXMKLQotCi1caXRlbVtNYXBwaW5nc10KLVRoZXNlIHJlcHJlc2VudCBmaW5pdGUgc2V0cyBvZiBvYmplY3RzIGluZGV4ZWQgYnkgYXJiaXRyYXJ5IGluZGV4IHNldHMuCi1UaGUgc3Vic2NyaXB0IG5vdGF0aW9uIFxjb2Rle2Fba119IHNlbGVjdHMgdGhlIGl0ZW0gaW5kZXhlZAotYnkgXGNvZGV7a30gZnJvbSB0aGUgbWFwcGluZyBcY29kZXthfTsgdGhpcyBjYW4gYmUgdXNlZCBpbgotZXhwcmVzc2lvbnMgYW5kIGFzIHRoZSB0YXJnZXQgb2YgYXNzaWdubWVudHMgb3IgXGtleXdvcmR7ZGVsfSBzdGF0ZW1lbnRzLgotVGhlIGJ1aWx0LWluIGZ1bmN0aW9uIFxmdW5jdGlvbntsZW4oKX0gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGl0ZW1zCi1pbiBhIG1hcHBpbmcuCi1cYmlmdW5jaW5kZXh7bGVufQotXGluZGV4e3N1YnNjcmlwdGlvbn0KLVxvYmluZGV4e21hcHBpbmd9Ci0KLVRoZXJlIGlzIGN1cnJlbnRseSBhIHNpbmdsZSBpbnRyaW5zaWMgbWFwcGluZyB0eXBlOgotCi1cYmVnaW57ZGVzY3JpcHRpb259Ci0KLVxpdGVtW0RpY3Rpb25hcmllc10KLVRoZXNlXG9iaW5kZXh7ZGljdGlvbmFyeX0gcmVwcmVzZW50IGZpbml0ZSBzZXRzIG9mIG9iamVjdHMgaW5kZXhlZCBieQotbmVhcmx5IGFyYml0cmFyeSB2YWx1ZXMuICBUaGUgb25seSB0eXBlcyBvZiB2YWx1ZXMgbm90IGFjY2VwdGFibGUgYXMKLWtleXMgYXJlIHZhbHVlcyBjb250YWluaW5nIGxpc3RzIG9yIGRpY3Rpb25hcmllcyBvciBvdGhlciBtdXRhYmxlCi10eXBlcyB0aGF0IGFyZSBjb21wYXJlZCBieSB2YWx1ZSByYXRoZXIgdGhhbiBieSBvYmplY3QgaWRlbnRpdHksIHRoZQotcmVhc29uIGJlaW5nIHRoYXQgdGhlIGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbiBvZiBkaWN0aW9uYXJpZXMKLXJlcXVpcmVzIGEga2V5J3MgaGFzaCB2YWx1ZSB0byByZW1haW4gY29uc3RhbnQuCi1OdW1lcmljIHR5cGVzIHVzZWQgZm9yIGtleXMgb2JleSB0aGUgbm9ybWFsIHJ1bGVzIGZvciBudW1lcmljCi1jb21wYXJpc29uOiBpZiB0d28gbnVtYmVycyBjb21wYXJlIGVxdWFsIChlLmcuLCBcY29kZXsxfSBhbmQKLVxjb2RlezEuMH0pIHRoZW4gdGhleSBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgdG8gaW5kZXggdGhlIHNhbWUKLWRpY3Rpb25hcnkgZW50cnkuCi0KLURpY3Rpb25hcmllcyBhcmUgbXV0YWJsZTsgdGhleSBjYW4gYmUgY3JlYXRlZCBieSB0aGUKLVxjb2Rle1x7Li4uXH19IG5vdGF0aW9uIChzZWUgc2VjdGlvbn5ccmVme2RpY3R9LCBgYERpY3Rpb25hcnkKLURpc3BsYXlzJycpLgotCi1UaGUgZXh0ZW5zaW9uIG1vZHVsZXMgXG1vZHVsZXtkYm19XHJlZnN0bW9kaW5kZXh7ZGJtfSwKLVxtb2R1bGV7Z2RibX1ccmVmc3Rtb2RpbmRleHtnZGJtfSwgYW5kCi1cbW9kdWxle2JzZGRifVxyZWZzdG1vZGluZGV4e2JzZGRifSBwcm92aWRlIGFkZGl0aW9uYWwgZXhhbXBsZXMgb2YKLW1hcHBpbmcgdHlwZXMuCi0KLVxlbmR7ZGVzY3JpcHRpb259ICUgTWFwcGluZyB0eXBlcwotCi1caXRlbVtDYWxsYWJsZSB0eXBlc10KLVRoZXNlXG9iaW5kZXh7Y2FsbGFibGV9IGFyZSB0aGUgdHlwZXMgdG8gd2hpY2ggdGhlIGZ1bmN0aW9uIGNhbGwKLW9wZXJhdGlvbiAoc2VlIHNlY3Rpb25+XHJlZntjYWxsc30sIGBgQ2FsbHMnJykgY2FuIGJlIGFwcGxpZWQ6Ci1caW5kZXhpaXtmdW5jdGlvbn17Y2FsbH0KLVxpbmRleHtpbnZvY2F0aW9ufQotXGluZGV4aWl7ZnVuY3Rpb259e2FyZ3VtZW50fQotCi1cYmVnaW57ZGVzY3JpcHRpb259Ci0KLVxpdGVtW1VzZXItZGVmaW5lZCBmdW5jdGlvbnNdCi1BIHVzZXItZGVmaW5lZCBmdW5jdGlvbiBvYmplY3QgaXMgY3JlYXRlZCBieSBhIGZ1bmN0aW9uIGRlZmluaXRpb24KLShzZWUgc2VjdGlvbn5ccmVme2Z1bmN0aW9ufSwgYGBGdW5jdGlvbiBkZWZpbml0aW9ucycnKS4gIEl0IHNob3VsZCBiZQotY2FsbGVkIHdpdGggYW4gYXJndW1lbnQKLWxpc3QgY29udGFpbmluZyB0aGUgc2FtZSBudW1iZXIgb2YgaXRlbXMgYXMgdGhlIGZ1bmN0aW9uJ3MgZm9ybWFsCi1wYXJhbWV0ZXIgbGlzdC4KLVxpbmRleGlpe3VzZXItZGVmaW5lZH17ZnVuY3Rpb259Ci1cb2JpbmRleHtmdW5jdGlvbn0KLVxvYmluZGV4e3VzZXItZGVmaW5lZCBmdW5jdGlvbn0KLQotU3BlY2lhbCBhdHRyaWJ1dGVzOgotCi1cYmVnaW57dGFibGVpaWl9e2xsbH17bWVtYmVyfXtBdHRyaWJ1dGV9e01lYW5pbmd9e30KLSAgXGxpbmVpaWl7X19kb2NfX317VGhlIGZ1bmN0aW9uJ3MgZG9jdW1lbnRhdGlvbiBzdHJpbmcsIG9yCi0gICAgXGNvZGV7Tm9uZX0gaWYgdW5hdmFpbGFibGV9e1dyaXRhYmxlfQotCi0gIFxsaW5laWlpe19fbmFtZV9ffXtUaGUgZnVuY3Rpb24ncyBuYW1lfXtXcml0YWJsZX0KLQotICBcbGluZWlpaXtfX21vZHVsZV9ffXtUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRoZSBmdW5jdGlvbiB3YXMgZGVmaW5lZAotICAgIGluLCBvciBcY29kZXtOb25lfSBpZiB1bmF2YWlsYWJsZS59e1dyaXRhYmxlfQotCi0gIFxsaW5laWlpe19fZGVmYXVsdHNfX317QSB0dXBsZSBjb250YWluaW5nIGRlZmF1bHQgYXJndW1lbnQgdmFsdWVzCi0gICAgZm9yIHRob3NlIGFyZ3VtZW50cyB0aGF0IGhhdmUgZGVmYXVsdHMsIG9yIFxjb2Rle05vbmV9IGlmIG5vCi0gICAgYXJndW1lbnRzIGhhdmUgYSBkZWZhdWx0IHZhbHVlfXtXcml0YWJsZX0KLQotICBcbGluZWlpaXtfX2NvZGVfX317VGhlIGNvZGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY29tcGlsZWQKLSAgICBmdW5jdGlvbiBib2R5Ln17V3JpdGFibGV9Ci0KLSAgXGxpbmVpaWl7X19nbG9iYWxzX199e0EgcmVmZXJlbmNlIHRvIHRoZSBkaWN0aW9uYXJ5IHRoYXQgaG9sZHMgdGhlCi0gICAgZnVuY3Rpb24ncyBnbG9iYWwgdmFyaWFibGVzIC0tLSB0aGUgZ2xvYmFsIG5hbWVzcGFjZSBvZiB0aGUgbW9kdWxlCi0gICAgaW4gd2hpY2ggdGhlIGZ1bmN0aW9uIHdhcyBkZWZpbmVkLn17UmVhZC1vbmx5fQotCi0gIFxsaW5laWlpe19fZGljdF9ffXtUaGUgbmFtZXNwYWNlIHN1cHBvcnRpbmcgYXJiaXRyYXJ5IGZ1bmN0aW9uCi0gICAgYXR0cmlidXRlcy59e1dyaXRhYmxlfQotCi0gIFxsaW5laWlpe19fY2xvc3VyZV9ffXtcY29kZXtOb25lfSBvciBhIHR1cGxlIG9mIGNlbGxzIHRoYXQgY29udGFpbgotICAgIGJpbmRpbmdzIGZvciB0aGUgZnVuY3Rpb24ncyBmcmVlIHZhcmlhYmxlcy59e1JlYWQtb25seX0KLQotICBcbGluZWlpaXtfX2Fubm90YXRpb25zX199e0EgZGljdCBjb250YWluaW5nIGFubm90YXRpb25zIG9mIHBhcmFtZXRlcnMuIAotICAgIFRoZSBrZXlzIG9mIHRoZSBkaWN0IGFyZSB0aGUgcGFyYW1ldGVyIG5hbWVzLCBvciBcY29kZXsncmV0dXJuJ30KLSAgICBmb3IgdGhlIHJldHVybiBhbm5vdGF0aW9uLCBpZiBwcm92aWRlZC59e1dyaXRhYmxlfQotCi0gIFxsaW5laWlpe19fa3dkZWZhdWx0c19ffXtBIGRpY3QgY29udGFpbmluZyBkZWZhdWx0cyBmb3Iga2V5d29yZC1vbmx5Ci0gICAgcGFyYW1ldGVycy59e1dyaXRhYmxlfQotXGVuZHt0YWJsZWlpaX0KLQotTW9zdCBvZiB0aGUgYXR0cmlidXRlcyBsYWJlbGxlZCBgYFdyaXRhYmxlJycgY2hlY2sgdGhlIHR5cGUgb2YgdGhlCi1hc3NpZ25lZCB2YWx1ZS4KLQotXHZlcnNpb25jaGFuZ2VkW1xjb2Rle19fbmFtZV9ffSBpcyBub3cgd3JpdGFibGVdezIuNH0KLQotRnVuY3Rpb24gb2JqZWN0cyBhbHNvIHN1cHBvcnQgZ2V0dGluZyBhbmQgc2V0dGluZyBhcmJpdHJhcnkKLWF0dHJpYnV0ZXMsIHdoaWNoIGNhbiBiZSB1c2VkLCBmb3IgZXhhbXBsZSwgdG8gYXR0YWNoIG1ldGFkYXRhIHRvCi1mdW5jdGlvbnMuICBSZWd1bGFyIGF0dHJpYnV0ZSBkb3Qtbm90YXRpb24gaXMgdXNlZCB0byBnZXQgYW5kIHNldCBzdWNoCi1hdHRyaWJ1dGVzLiBcZW1waHtOb3RlIHRoYXQgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb25seSBzdXBwb3J0cwotZnVuY3Rpb24gYXR0cmlidXRlcyBvbiB1c2VyLWRlZmluZWQgZnVuY3Rpb25zLiAgRnVuY3Rpb24gYXR0cmlidXRlcyBvbgotYnVpbHQtaW4gZnVuY3Rpb25zIG1heSBiZSBzdXBwb3J0ZWQgaW4gdGhlIGZ1dHVyZS59Ci0KLUFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBmdW5jdGlvbidzIGRlZmluaXRpb24gY2FuIGJlIHJldHJpZXZlZAotZnJvbSBpdHMgY29kZSBvYmplY3Q7IHNlZSB0aGUgZGVzY3JpcHRpb24gb2YgaW50ZXJuYWwgdHlwZXMgYmVsb3cuCi0KLVx3aXRoc3ViaXRlbXsoZnVuY3Rpb24gYXR0cmlidXRlKX17Ci0gIFx0dGluZGV4e19fZG9jX199Ci0gIFx0dGluZGV4e19fbmFtZV9ffQotICBcdHRpbmRleHtfX21vZHVsZV9ffQotICBcdHRpbmRleHtfX2RpY3RfX30KLSAgXHR0aW5kZXh7X19kZWZhdWx0c19ffQotICBcdHRpbmRleHtfX2Nsb3N1cmVfX30KLSAgXHR0aW5kZXh7X19jb2RlX199Ci0gIFx0dGluZGV4e19fZ2xvYmFsc19ffQotICBcdHRpbmRleHtfX2Fubm90YXRpb25zX199Ci0gIFx0dGluZGV4e19fa3dkZWZhdWx0c19ffX0KLVxpbmRleGlpe2dsb2JhbH17bmFtZXNwYWNlfQotCi1caXRlbVtVc2VyLWRlZmluZWQgbWV0aG9kc10KLUEgdXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3QgY29tYmluZXMgYSBjbGFzcywgYSBjbGFzcyBpbnN0YW5jZSAob3IKLVxjb2Rle05vbmV9KSBhbmQgYW55IGNhbGxhYmxlIG9iamVjdCAobm9ybWFsbHkgYSB1c2VyLWRlZmluZWQKLWZ1bmN0aW9uKS4KLVxvYmluZGV4e21ldGhvZH0KLVxvYmluZGV4e3VzZXItZGVmaW5lZCBtZXRob2R9Ci1caW5kZXhpaXt1c2VyLWRlZmluZWR9e21ldGhvZH0KLQotU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlczogXG1lbWJlcntpbV9zZWxmfSBpcyB0aGUgY2xhc3MgaW5zdGFuY2UKLW9iamVjdCwgXG1lbWJlcntpbV9mdW5jfSBpcyB0aGUgZnVuY3Rpb24gb2JqZWN0OwotXG1lbWJlcntpbV9jbGFzc30gaXMgdGhlIGNsYXNzIG9mIFxtZW1iZXJ7aW1fc2VsZn0gZm9yIGJvdW5kIG1ldGhvZHMKLW9yIHRoZSBjbGFzcyB0aGF0IGFza2VkIGZvciB0aGUgbWV0aG9kIGZvciB1bmJvdW5kIG1ldGhvZHM7Ci1cbWVtYmVye19fZG9jX199IGlzIHRoZSBtZXRob2QncyBkb2N1bWVudGF0aW9uIChzYW1lIGFzCi1cY29kZXtpbV9mdW5jLl9fZG9jX199KTsgXG1lbWJlcntfX25hbWVfX30gaXMgdGhlIG1ldGhvZCBuYW1lIChzYW1lIGFzCi1cY29kZXtpbV9mdW5jLl9fbmFtZV9ffSk7IFxtZW1iZXJ7X19tb2R1bGVfX30gaXMgdGhlIG5hbWUgb2YgdGhlCi1tb2R1bGUgdGhlIG1ldGhvZCB3YXMgZGVmaW5lZCBpbiwgb3IgXGNvZGV7Tm9uZX0gaWYgdW5hdmFpbGFibGUuCi1cdmVyc2lvbmNoYW5nZWRbXG1lbWJlcntpbV9zZWxmfSB1c2VkIHRvIHJlZmVyIHRvIHRoZSBjbGFzcyB0aGF0Ci0gICAgICAgICAgICAgICAgZGVmaW5lZCB0aGUgbWV0aG9kXXsyLjJ9Ci1cd2l0aHN1Yml0ZW17KG1ldGhvZCBhdHRyaWJ1dGUpfXsKLSAgXHR0aW5kZXh7X19kb2NfX30KLSAgXHR0aW5kZXh7X19uYW1lX199Ci0gIFx0dGluZGV4e19fbW9kdWxlX199Ci0gIFx0dGluZGV4e2ltX2Z1bmN9Ci0gIFx0dGluZGV4e2ltX3NlbGZ9fQotCi1NZXRob2RzIGFsc28gc3VwcG9ydCBhY2Nlc3NpbmcgKGJ1dCBub3Qgc2V0dGluZykgdGhlIGFyYml0cmFyeQotZnVuY3Rpb24gYXR0cmlidXRlcyBvbiB0aGUgdW5kZXJseWluZyBmdW5jdGlvbiBvYmplY3QuCi0KLVVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0cyBtYXkgYmUgY3JlYXRlZCB3aGVuIGdldHRpbmcgYW4gYXR0cmlidXRlCi1vZiBhIGNsYXNzIChwZXJoYXBzIHZpYSBhbiBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzKSwgaWYgdGhhdCBhdHRyaWJ1dGUKLWlzIGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIG9iamVjdCwgYW4gdW5ib3VuZCB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdCwKLW9yIGEgY2xhc3MgbWV0aG9kIG9iamVjdC4KLVdoZW4gdGhlIGF0dHJpYnV0ZSBpcyBhIHVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0LCBhIG5ldwotbWV0aG9kIG9iamVjdCBpcyBvbmx5IGNyZWF0ZWQgaWYgdGhlIGNsYXNzIGZyb20gd2hpY2ggaXQgaXMgYmVpbmcKLXJldHJpZXZlZCBpcyB0aGUgc2FtZSBhcywgb3IgYSBkZXJpdmVkIGNsYXNzIG9mLCB0aGUgY2xhc3Mgc3RvcmVkCi1pbiB0aGUgb3JpZ2luYWwgbWV0aG9kIG9iamVjdDsgb3RoZXJ3aXNlLCB0aGUgb3JpZ2luYWwgbWV0aG9kIG9iamVjdAotaXMgdXNlZCBhcyBpdCBpcy4KLQotV2hlbiBhIHVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0IGlzIGNyZWF0ZWQgYnkgcmV0cmlldmluZwotYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24gb2JqZWN0IGZyb20gYSBjbGFzcywgaXRzIFxtZW1iZXJ7aW1fc2VsZn0KLWF0dHJpYnV0ZSBpcyBcY29kZXtOb25lfSBhbmQgdGhlIG1ldGhvZCBvYmplY3QgaXMgc2FpZCB0byBiZSB1bmJvdW5kLgotV2hlbiBvbmUgaXMgY3JlYXRlZCBieSByZXRyaWV2aW5nIGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIG9iamVjdAotZnJvbSBhIGNsYXNzIHZpYSBvbmUgb2YgaXRzIGluc3RhbmNlcywgaXRzIFxtZW1iZXJ7aW1fc2VsZn0gYXR0cmlidXRlCi1pcyB0aGUgaW5zdGFuY2UsIGFuZCB0aGUgbWV0aG9kIG9iamVjdCBpcyBzYWlkIHRvIGJlIGJvdW5kLgotSW4gZWl0aGVyIGNhc2UsIHRoZSBuZXcgbWV0aG9kJ3MgXG1lbWJlcntpbV9jbGFzc30gYXR0cmlidXRlCi1pcyB0aGUgY2xhc3MgZnJvbSB3aGljaCB0aGUgcmV0cmlldmFsIHRha2VzIHBsYWNlLCBhbmQKLWl0cyBcbWVtYmVye2ltX2Z1bmN9IGF0dHJpYnV0ZSBpcyB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gb2JqZWN0LgotXHdpdGhzdWJpdGVteyhtZXRob2QgYXR0cmlidXRlKX17Ci0gIFx0dGluZGV4e2ltX2NsYXNzfVx0dGluZGV4e2ltX2Z1bmN9XHR0aW5kZXh7aW1fc2VsZn19Ci0KLVdoZW4gYSB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdCBpcyBjcmVhdGVkIGJ5IHJldHJpZXZpbmcgYW5vdGhlcgotbWV0aG9kIG9iamVjdCBmcm9tIGEgY2xhc3Mgb3IgaW5zdGFuY2UsIHRoZSBiZWhhdmlvdXIgaXMgdGhlIHNhbWUKLWFzIGZvciBhIGZ1bmN0aW9uIG9iamVjdCwgZXhjZXB0IHRoYXQgdGhlIFxtZW1iZXJ7aW1fZnVuY30gYXR0cmlidXRlCi1vZiB0aGUgbmV3IGluc3RhbmNlIGlzIG5vdCB0aGUgb3JpZ2luYWwgbWV0aG9kIG9iamVjdCBidXQgaXRzCi1cbWVtYmVye2ltX2Z1bmN9IGF0dHJpYnV0ZS4KLVx3aXRoc3ViaXRlbXsobWV0aG9kIGF0dHJpYnV0ZSl9ewotICBcdHRpbmRleHtpbV9mdW5jfX0KLQotV2hlbiBhIHVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0IGlzIGNyZWF0ZWQgYnkgcmV0cmlldmluZyBhCi1jbGFzcyBtZXRob2Qgb2JqZWN0IGZyb20gYSBjbGFzcyBvciBpbnN0YW5jZSwgaXRzIFxtZW1iZXJ7aW1fc2VsZn0KLWF0dHJpYnV0ZSBpcyB0aGUgY2xhc3MgaXRzZWxmICh0aGUgc2FtZSBhcyB0aGUgXG1lbWJlcntpbV9jbGFzc30KLWF0dHJpYnV0ZSksIGFuZCBpdHMgXG1lbWJlcntpbV9mdW5jfSBhdHRyaWJ1dGUgaXMgdGhlIGZ1bmN0aW9uCi1vYmplY3QgdW5kZXJseWluZyB0aGUgY2xhc3MgbWV0aG9kLgotXHdpdGhzdWJpdGVteyhtZXRob2QgYXR0cmlidXRlKX17Ci0gIFx0dGluZGV4e2ltX2NsYXNzfVx0dGluZGV4e2ltX2Z1bmN9XHR0aW5kZXh7aW1fc2VsZn19Ci0KLVdoZW4gYW4gdW5ib3VuZCB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdCBpcyBjYWxsZWQsIHRoZSB1bmRlcmx5aW5nCi1mdW5jdGlvbiAoXG1lbWJlcntpbV9mdW5jfSkgaXMgY2FsbGVkLCB3aXRoIHRoZSByZXN0cmljdGlvbiB0aGF0IHRoZQotZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiB0aGUgcHJvcGVyIGNsYXNzCi0oXG1lbWJlcntpbV9jbGFzc30pIG9yIG9mIGEgZGVyaXZlZCBjbGFzcyB0aGVyZW9mLgotCi1XaGVuIGEgYm91bmQgdXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3QgaXMgY2FsbGVkLCB0aGUgdW5kZXJseWluZwotZnVuY3Rpb24gKFxtZW1iZXJ7aW1fZnVuY30pIGlzIGNhbGxlZCwgaW5zZXJ0aW5nIHRoZSBjbGFzcyBpbnN0YW5jZQotKFxtZW1iZXJ7aW1fc2VsZn0pIGluIGZyb250IG9mIHRoZSBhcmd1bWVudCBsaXN0LiAgRm9yIGluc3RhbmNlLCB3aGVuCi1cY2xhc3N7Q30gaXMgYSBjbGFzcyB3aGljaCBjb250YWlucyBhIGRlZmluaXRpb24gZm9yIGEgZnVuY3Rpb24KLVxtZXRob2R7ZigpfSwgYW5kIFxjb2Rle3h9IGlzIGFuIGluc3RhbmNlIG9mIFxjbGFzc3tDfSwgY2FsbGluZwotXGNvZGV7eC5mKDEpfSBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcgXGNvZGV7Qy5mKHgsIDEpfS4KLQotV2hlbiBhIHVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0IGlzIGRlcml2ZWQgZnJvbSBhIGNsYXNzIG1ldGhvZCBvYmplY3QsCi10aGUgYGBjbGFzcyBpbnN0YW5jZScnIHN0b3JlZCBpbiBcbWVtYmVye2ltX3NlbGZ9IHdpbGwgYWN0dWFsbHkgYmUgdGhlCi1jbGFzcyBpdHNlbGYsIHNvIHRoYXQgY2FsbGluZyBlaXRoZXIgXGNvZGV7eC5mKDEpfSBvciBcY29kZXtDLmYoMSl9IGlzCi1lcXVpdmFsZW50IHRvIGNhbGxpbmcgXGNvZGV7ZihDLDEpfSB3aGVyZSBcY29kZXtmfSBpcyB0aGUgdW5kZXJseWluZwotZnVuY3Rpb24uCi0KLU5vdGUgdGhhdCB0aGUgdHJhbnNmb3JtYXRpb24gZnJvbSBmdW5jdGlvbiBvYmplY3QgdG8gKHVuYm91bmQgb3IKLWJvdW5kKSBtZXRob2Qgb2JqZWN0IGhhcHBlbnMgZWFjaCB0aW1lIHRoZSBhdHRyaWJ1dGUgaXMgcmV0cmlldmVkIGZyb20KLXRoZSBjbGFzcyBvciBpbnN0YW5jZS4gIEluIHNvbWUgY2FzZXMsIGEgZnJ1aXRmdWwgb3B0aW1pemF0aW9uIGlzIHRvCi1hc3NpZ24gdGhlIGF0dHJpYnV0ZSB0byBhIGxvY2FsIHZhcmlhYmxlIGFuZCBjYWxsIHRoYXQgbG9jYWwgdmFyaWFibGUuCi1BbHNvIG5vdGljZSB0aGF0IHRoaXMgdHJhbnNmb3JtYXRpb24gb25seSBoYXBwZW5zIGZvciB1c2VyLWRlZmluZWQKLWZ1bmN0aW9uczsgb3RoZXIgY2FsbGFibGUgb2JqZWN0cyAoYW5kIGFsbCBub24tY2FsbGFibGUgb2JqZWN0cykgYXJlCi1yZXRyaWV2ZWQgd2l0aG91dCB0cmFuc2Zvcm1hdGlvbi4gIEl0IGlzIGFsc28gaW1wb3J0YW50IHRvIG5vdGUgdGhhdAotdXNlci1kZWZpbmVkIGZ1bmN0aW9ucyB3aGljaCBhcmUgYXR0cmlidXRlcyBvZiBhIGNsYXNzIGluc3RhbmNlIGFyZQotbm90IGNvbnZlcnRlZCB0byBib3VuZCBtZXRob2RzOyB0aGlzIFxlbXBoe29ubHl9IGhhcHBlbnMgd2hlbiB0aGUKLWZ1bmN0aW9uIGlzIGFuIGF0dHJpYnV0ZSBvZiB0aGUgY2xhc3MuCi0KLVxpdGVtW0dlbmVyYXRvciBmdW5jdGlvbnNcaW5kZXh7Z2VuZXJhdG9yIWZ1bmN0aW9ufVxpbmRleHtnZW5lcmF0b3IhaXRlcmF0b3J9XQotQSBmdW5jdGlvbiBvciBtZXRob2Qgd2hpY2ggdXNlcyB0aGUgXGtleXdvcmR7eWllbGR9IHN0YXRlbWVudCAoc2VlCi1zZWN0aW9uflxyZWZ7eWllbGR9LCBgYFRoZSBca2V5d29yZHt5aWVsZH0gc3RhdGVtZW50JycpIGlzIGNhbGxlZCBhCi1cZGZue2dlbmVyYXRvciBmdW5jdGlvbn0uICBTdWNoIGEgZnVuY3Rpb24sIHdoZW4gY2FsbGVkLCBhbHdheXMKLXJldHVybnMgYW4gaXRlcmF0b3Igb2JqZWN0IHdoaWNoIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgdGhlIGJvZHkgb2YKLXRoZSBmdW5jdGlvbjogIGNhbGxpbmcgdGhlIGl0ZXJhdG9yJ3MgXG1ldGhvZHtfX25leHRfXygpfSBtZXRob2Qgd2lsbAotY2F1c2UgdGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgdW50aWwgaXQgcHJvdmlkZXMgYSB2YWx1ZSB1c2luZyB0aGUKLVxrZXl3b3Jke3lpZWxkfSBzdGF0ZW1lbnQuICBXaGVuIHRoZSBmdW5jdGlvbiBleGVjdXRlcyBhCi1ca2V5d29yZHtyZXR1cm59IHN0YXRlbWVudCBvciBmYWxscyBvZmYgdGhlIGVuZCwgYQotXGV4Y2VwdGlvbntTdG9wSXRlcmF0aW9ufSBleGNlcHRpb24gaXMgcmFpc2VkIGFuZCB0aGUgaXRlcmF0b3Igd2lsbAotaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHNldCBvZiB2YWx1ZXMgdG8gYmUgcmV0dXJuZWQuCi0KLVxpdGVtW0J1aWx0LWluIGZ1bmN0aW9uc10KLUEgYnVpbHQtaW4gZnVuY3Rpb24gb2JqZWN0IGlzIGEgd3JhcHBlciBhcm91bmQgYSBDIGZ1bmN0aW9uLiAgRXhhbXBsZXMKLW9mIGJ1aWx0LWluIGZ1bmN0aW9ucyBhcmUgXGZ1bmN0aW9ue2xlbigpfSBhbmQgXGZ1bmN0aW9ue21hdGguc2luKCl9Ci0oXG1vZHVsZXttYXRofSBpcyBhIHN0YW5kYXJkIGJ1aWx0LWluIG1vZHVsZSkuCi1UaGUgbnVtYmVyIGFuZCB0eXBlIG9mIHRoZSBhcmd1bWVudHMgYXJlCi1kZXRlcm1pbmVkIGJ5IHRoZSBDIGZ1bmN0aW9uLgotU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlczogXG1lbWJlcntfX2RvY19ffSBpcyB0aGUgZnVuY3Rpb24ncwotZG9jdW1lbnRhdGlvbiBzdHJpbmcsIG9yIFxjb2Rle05vbmV9IGlmIHVuYXZhaWxhYmxlOyBcbWVtYmVye19fbmFtZV9ffQotaXMgdGhlIGZ1bmN0aW9uJ3MgbmFtZTsgXG1lbWJlcntfX3NlbGZfX30gaXMgc2V0IHRvIFxjb2Rle05vbmV9IChidXQgc2VlCi10aGUgbmV4dCBpdGVtKTsgXG1lbWJlcntfX21vZHVsZV9ffSBpcyB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRoZQotZnVuY3Rpb24gd2FzIGRlZmluZWQgaW4gb3IgXGNvZGV7Tm9uZX0gaWYgdW5hdmFpbGFibGUuCi1cb2JpbmRleHtidWlsdC1pbiBmdW5jdGlvbn0KLVxvYmluZGV4e2Z1bmN0aW9ufQotXGluZGV4aWl7Q317bGFuZ3VhZ2V9Ci0KLVxpdGVtW0J1aWx0LWluIG1ldGhvZHNdCi1UaGlzIGlzIHJlYWxseSBhIGRpZmZlcmVudCBkaXNndWlzZSBvZiBhIGJ1aWx0LWluIGZ1bmN0aW9uLCB0aGlzIHRpbWUKLWNvbnRhaW5pbmcgYW4gb2JqZWN0IHBhc3NlZCB0byB0aGUgQyBmdW5jdGlvbiBhcyBhbiBpbXBsaWNpdCBleHRyYQotYXJndW1lbnQuICBBbiBleGFtcGxlIG9mIGEgYnVpbHQtaW4gbWV0aG9kIGlzCi1cY29kZXtcdmFye2FsaXN0fS5hcHBlbmQoKX0sIGFzc3VtaW5nCi1cdmFye2FsaXN0fSBpcyBhIGxpc3Qgb2JqZWN0LgotSW4gdGhpcyBjYXNlLCB0aGUgc3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlIFxtZW1iZXJ7X19zZWxmX199IGlzIHNldAotdG8gdGhlIG9iamVjdCBkZW5vdGVkIGJ5IFx2YXJ7bGlzdH0uCi1cb2JpbmRleHtidWlsdC1pbiBtZXRob2R9Ci1cb2JpbmRleHttZXRob2R9Ci1caW5kZXhpaXtidWlsdC1pbn17bWV0aG9kfQotCi1caXRlbVtDbGFzcyBUeXBlc10KLUNsYXNzIHR5cGVzLCBvciBgYG5ldy1zdHlsZSBjbGFzc2VzLCcnIGFyZSBjYWxsYWJsZS4gIFRoZXNlIG9iamVjdHMKLW5vcm1hbGx5IGFjdCBhcyBmYWN0b3JpZXMgZm9yIG5ldyBpbnN0YW5jZXMgb2YgdGhlbXNlbHZlcywgYnV0Ci12YXJpYXRpb25zIGFyZSBwb3NzaWJsZSBmb3IgY2xhc3MgdHlwZXMgdGhhdCBvdmVycmlkZQotXG1ldGhvZHtfX25ld19fKCl9LiAgVGhlIGFyZ3VtZW50cyBvZiB0aGUgY2FsbCBhcmUgcGFzc2VkIHRvCi1cbWV0aG9ke19fbmV3X18oKX0gYW5kLCBpbiB0aGUgdHlwaWNhbCBjYXNlLCB0byBcbWV0aG9ke19faW5pdF9fKCl9IHRvCi1pbml0aWFsaXplIHRoZSBuZXcgaW5zdGFuY2UuCi0KLVxpdGVtW0NsYXNzaWMgQ2xhc3Nlc10KLUNsYXNzIG9iamVjdHMgYXJlIGRlc2NyaWJlZCBiZWxvdy4gIFdoZW4gYSBjbGFzcyBvYmplY3QgaXMgY2FsbGVkLAotYSBuZXcgY2xhc3MgaW5zdGFuY2UgKGFsc28gZGVzY3JpYmVkIGJlbG93KSBpcyBjcmVhdGVkIGFuZAotcmV0dXJuZWQuICBUaGlzIGltcGxpZXMgYSBjYWxsIHRvIHRoZSBjbGFzcydzIFxtZXRob2R7X19pbml0X18oKX0gbWV0aG9kCi1pZiBpdCBoYXMgb25lLiAgQW55IGFyZ3VtZW50cyBhcmUgcGFzc2VkIG9uIHRvIHRoZSBcbWV0aG9ke19faW5pdF9fKCl9Ci1tZXRob2QuICBJZiB0aGVyZSBpcyBubyBcbWV0aG9ke19faW5pdF9fKCl9IG1ldGhvZCwgdGhlIGNsYXNzIG11c3QgYmUgY2FsbGVkCi13aXRob3V0IGFyZ3VtZW50cy4KLVx3aXRoc3ViaXRlbXsob2JqZWN0IG1ldGhvZCl9e1x0dGluZGV4e19faW5pdF9fKCl9fQotXG9iaW5kZXh7Y2xhc3N9Ci1cb2JpbmRleHtjbGFzcyBpbnN0YW5jZX0KLVxvYmluZGV4e2luc3RhbmNlfQotXGluZGV4aWl7Y2xhc3Mgb2JqZWN0fXtjYWxsfQotCi1caXRlbVtDbGFzcyBpbnN0YW5jZXNdCi1DbGFzcyBpbnN0YW5jZXMgYXJlIGRlc2NyaWJlZCBiZWxvdy4gIENsYXNzIGluc3RhbmNlcyBhcmUgY2FsbGFibGUKLW9ubHkgd2hlbiB0aGUgY2xhc3MgaGFzIGEgXG1ldGhvZHtfX2NhbGxfXygpfSBtZXRob2Q7IFxjb2Rle3goYXJndW1lbnRzKX0KLWlzIGEgc2hvcnRoYW5kIGZvciBcY29kZXt4Ll9fY2FsbF9fKGFyZ3VtZW50cyl9LgotCi1cZW5ke2Rlc2NyaXB0aW9ufQotCi1caXRlbVtNb2R1bGVzXQotTW9kdWxlcyBhcmUgaW1wb3J0ZWQgYnkgdGhlIFxrZXl3b3Jke2ltcG9ydH0gc3RhdGVtZW50IChzZWUKLXNlY3Rpb25+XHJlZntpbXBvcnR9LCBgYFRoZSBca2V5d29yZHtpbXBvcnR9IHN0YXRlbWVudCcnKS4lCi1cc3RpbmRleHtpbXBvcnR9XG9iaW5kZXh7bW9kdWxlfQotQSBtb2R1bGUgb2JqZWN0IGhhcyBhIG5hbWVzcGFjZSBpbXBsZW1lbnRlZCBieSBhIGRpY3Rpb25hcnkgb2JqZWN0Ci0odGhpcyBpcyB0aGUgZGljdGlvbmFyeSByZWZlcmVuY2VkIGJ5IHRoZSBfX2dsb2JhbHNfXyBhdHRyaWJ1dGUgb2YKLWZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoZSBtb2R1bGUpLiAgQXR0cmlidXRlIHJlZmVyZW5jZXMgYXJlIHRyYW5zbGF0ZWQKLXRvIGxvb2t1cHMgaW4gdGhpcyBkaWN0aW9uYXJ5LCBlLmcuLCBcY29kZXttLnh9IGlzIGVxdWl2YWxlbnQgdG8KLVxjb2Rle20uX19kaWN0X19bIngiXX0uCi1BIG1vZHVsZSBvYmplY3QgZG9lcyBub3QgY29udGFpbiB0aGUgY29kZSBvYmplY3QgdXNlZCB0bwotaW5pdGlhbGl6ZSB0aGUgbW9kdWxlIChzaW5jZSBpdCBpc24ndCBuZWVkZWQgb25jZSB0aGUgaW5pdGlhbGl6YXRpb24KLWlzIGRvbmUpLgotCi1BdHRyaWJ1dGUgYXNzaWdubWVudCB1cGRhdGVzIHRoZSBtb2R1bGUncyBuYW1lc3BhY2UgZGljdGlvbmFyeSwKLWUuZy4sIFxzYW1we20ueCA9IDF9IGlzIGVxdWl2YWxlbnQgdG8gXHNhbXB7bS5fX2RpY3RfX1sieCJdID0gMX0uCi0KLVNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZTogXG1lbWJlcntfX2RpY3RfX30gaXMgdGhlIG1vZHVsZSdzCi1uYW1lc3BhY2UgYXMgYSBkaWN0aW9uYXJ5IG9iamVjdC4KLVx3aXRoc3ViaXRlbXsobW9kdWxlIGF0dHJpYnV0ZSl9e1x0dGluZGV4e19fZGljdF9ffX0KLQotUHJlZGVmaW5lZCAod3JpdGFibGUpIGF0dHJpYnV0ZXM6IFxtZW1iZXJ7X19uYW1lX199Ci1pcyB0aGUgbW9kdWxlJ3MgbmFtZTsgXG1lbWJlcntfX2RvY19ffSBpcyB0aGUKLW1vZHVsZSdzIGRvY3VtZW50YXRpb24gc3RyaW5nLCBvcgotXGNvZGV7Tm9uZX0gaWYgdW5hdmFpbGFibGU7IFxtZW1iZXJ7X19maWxlX199IGlzIHRoZSBwYXRobmFtZSBvZiB0aGUKLWZpbGUgZnJvbSB3aGljaCB0aGUgbW9kdWxlIHdhcyBsb2FkZWQsIGlmIGl0IHdhcyBsb2FkZWQgZnJvbSBhIGZpbGUuCi1UaGUgXG1lbWJlcntfX2ZpbGVfX30gYXR0cmlidXRlIGlzIG5vdCBwcmVzZW50IGZvciBDe30gbW9kdWxlcyB0aGF0IGFyZQotc3RhdGljYWxseSBsaW5rZWQgaW50byB0aGUgaW50ZXJwcmV0ZXI7IGZvciBleHRlbnNpb24gbW9kdWxlcyBsb2FkZWQKLWR5bmFtaWNhbGx5IGZyb20gYSBzaGFyZWQgbGlicmFyeSwgaXQgaXMgdGhlIHBhdGhuYW1lIG9mIHRoZSBzaGFyZWQKLWxpYnJhcnkgZmlsZS4KLVx3aXRoc3ViaXRlbXsobW9kdWxlIGF0dHJpYnV0ZSl9ewotICBcdHRpbmRleHtfX25hbWVfX30KLSAgXHR0aW5kZXh7X19kb2NfX30KLSAgXHR0aW5kZXh7X19maWxlX199fQotXGluZGV4aWl7bW9kdWxlfXtuYW1lc3BhY2V9Ci0KLVxpdGVtW0NsYXNzZXNdCi1DbGFzcyBvYmplY3RzIGFyZSBjcmVhdGVkIGJ5IGNsYXNzIGRlZmluaXRpb25zIChzZWUKLXNlY3Rpb25+XHJlZntjbGFzc30sIGBgQ2xhc3MgZGVmaW5pdGlvbnMnJykuCi1BIGNsYXNzIGhhcyBhIG5hbWVzcGFjZSBpbXBsZW1lbnRlZCBieSBhIGRpY3Rpb25hcnkgb2JqZWN0LgotQ2xhc3MgYXR0cmlidXRlIHJlZmVyZW5jZXMgYXJlIHRyYW5zbGF0ZWQgdG8KLWxvb2t1cHMgaW4gdGhpcyBkaWN0aW9uYXJ5LAotZS5nLiwgXHNhbXB7Qy54fSBpcyB0cmFuc2xhdGVkIHRvIFxzYW1we0MuX19kaWN0X19bIngiXX0uCi1XaGVuIHRoZSBhdHRyaWJ1dGUgbmFtZSBpcyBub3QgZm91bmQKLXRoZXJlLCB0aGUgYXR0cmlidXRlIHNlYXJjaCBjb250aW51ZXMgaW4gdGhlIGJhc2UgY2xhc3Nlcy4gIFRoZSBzZWFyY2gKLWlzIGRlcHRoLWZpcnN0LCBsZWZ0LXRvLXJpZ2h0IGluIHRoZSBvcmRlciBvZiBvY2N1cnJlbmNlIGluIHRoZQotYmFzZSBjbGFzcyBsaXN0LgotCi1XaGVuIGEgY2xhc3MgYXR0cmlidXRlIHJlZmVyZW5jZSAoZm9yIGNsYXNzIFxjbGFzc3tDfSwgc2F5KQotd291bGQgeWllbGQgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24gb2JqZWN0IG9yCi1hbiB1bmJvdW5kIHVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0IHdob3NlIGFzc29jaWF0ZWQgY2xhc3MgaXMgZWl0aGVyCi1cY2xhc3N7Q30gb3Igb25lIG9mIGl0cyBiYXNlIGNsYXNzZXMsIGl0IGlzIHRyYW5zZm9ybWVkIGludG8gYW4gdW5ib3VuZAotdXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3Qgd2hvc2UgXG1lbWJlcntpbV9jbGFzc30gYXR0cmlidXRlIGlzflxjbGFzc3tDfS4KLVdoZW4gaXQgd291bGQgeWllbGQgYSBjbGFzcyBtZXRob2Qgb2JqZWN0LCBpdCBpcyB0cmFuc2Zvcm1lZCBpbnRvCi1hIGJvdW5kIHVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0IHdob3NlIFxtZW1iZXJ7aW1fY2xhc3N9IGFuZAotXG1lbWJlcntpbV9zZWxmfSBhdHRyaWJ1dGVzIGFyZSBib3RoflxjbGFzc3tDfS4gIFdoZW4gaXQgd291bGQgeWllbGQKLWEgc3RhdGljIG1ldGhvZCBvYmplY3QsIGl0IGlzIHRyYW5zZm9ybWVkIGludG8gdGhlIG9iamVjdCB3cmFwcGVkCi1ieSB0aGUgc3RhdGljIG1ldGhvZCBvYmplY3QuIFNlZSBzZWN0aW9uflxyZWZ7ZGVzY3JpcHRvcnN9IGZvciBhbm90aGVyCi13YXkgaW4gd2hpY2ggYXR0cmlidXRlcyByZXRyaWV2ZWQgZnJvbSBhIGNsYXNzIG1heSBkaWZmZXIgZnJvbSB0aG9zZQotYWN0dWFsbHkgY29udGFpbmVkIGluIGl0cyBcbWVtYmVye19fZGljdF9ffS4KLVxvYmluZGV4e2NsYXNzfQotXG9iaW5kZXh7Y2xhc3MgaW5zdGFuY2V9Ci1cb2JpbmRleHtpbnN0YW5jZX0KLVxpbmRleGlpe2NsYXNzIG9iamVjdH17Y2FsbH0KLVxpbmRleHtjb250YWluZXJ9Ci1cb2JpbmRleHtkaWN0aW9uYXJ5fQotXGluZGV4aWl7Y2xhc3N9e2F0dHJpYnV0ZX0KLQotQ2xhc3MgYXR0cmlidXRlIGFzc2lnbm1lbnRzIHVwZGF0ZSB0aGUgY2xhc3MncyBkaWN0aW9uYXJ5LCBuZXZlciB0aGUKLWRpY3Rpb25hcnkgb2YgYSBiYXNlIGNsYXNzLgotXGluZGV4aWlpe2NsYXNzfXthdHRyaWJ1dGV9e2Fzc2lnbm1lbnR9Ci0KLUEgY2xhc3Mgb2JqZWN0IGNhbiBiZSBjYWxsZWQgKHNlZSBhYm92ZSkgdG8geWllbGQgYSBjbGFzcyBpbnN0YW5jZSAoc2VlCi1iZWxvdykuCi1caW5kZXhpaXtjbGFzcyBvYmplY3R9e2NhbGx9Ci0KLVNwZWNpYWwgYXR0cmlidXRlczogXG1lbWJlcntfX25hbWVfX30gaXMgdGhlIGNsYXNzIG5hbWU7Ci1cbWVtYmVye19fbW9kdWxlX199IGlzIHRoZSBtb2R1bGUgbmFtZSBpbiB3aGljaCB0aGUgY2xhc3Mgd2FzIGRlZmluZWQ7Ci1cbWVtYmVye19fZGljdF9ffSBpcyB0aGUgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBjbGFzcydzIG5hbWVzcGFjZTsKLVxtZW1iZXJ7X19iYXNlc19ffSBpcyBhIHR1cGxlIChwb3NzaWJseSBlbXB0eSBvciBhIHNpbmdsZXRvbikKLWNvbnRhaW5pbmcgdGhlIGJhc2UgY2xhc3NlcywgaW4gdGhlIG9yZGVyIG9mIHRoZWlyIG9jY3VycmVuY2UgaW4gdGhlCi1iYXNlIGNsYXNzIGxpc3Q7IFxtZW1iZXJ7X19kb2NfX30gaXMgdGhlIGNsYXNzJ3MgZG9jdW1lbnRhdGlvbiBzdHJpbmcsCi1vciBOb25lIGlmIHVuZGVmaW5lZC4KLVx3aXRoc3ViaXRlbXsoY2xhc3MgYXR0cmlidXRlKX17Ci0gIFx0dGluZGV4e19fbmFtZV9ffQotICBcdHRpbmRleHtfX21vZHVsZV9ffQotICBcdHRpbmRleHtfX2RpY3RfX30KLSAgXHR0aW5kZXh7X19iYXNlc19ffQotICBcdHRpbmRleHtfX2RvY19ffX0KLQotXGl0ZW1bQ2xhc3MgaW5zdGFuY2VzXQotQSBjbGFzcyBpbnN0YW5jZSBpcyBjcmVhdGVkIGJ5IGNhbGxpbmcgYSBjbGFzcyBvYmplY3QgKHNlZSBhYm92ZSkuCi1BIGNsYXNzIGluc3RhbmNlIGhhcyBhIG5hbWVzcGFjZSBpbXBsZW1lbnRlZCBhcyBhIGRpY3Rpb25hcnkgd2hpY2gKLWlzIHRoZSBmaXJzdCBwbGFjZSBpbiB3aGljaAotYXR0cmlidXRlIHJlZmVyZW5jZXMgYXJlIHNlYXJjaGVkLiAgV2hlbiBhbiBhdHRyaWJ1dGUgaXMgbm90IGZvdW5kCi10aGVyZSwgYW5kIHRoZSBpbnN0YW5jZSdzIGNsYXNzIGhhcyBhbiBhdHRyaWJ1dGUgYnkgdGhhdCBuYW1lLAotdGhlIHNlYXJjaCBjb250aW51ZXMgd2l0aCB0aGUgY2xhc3MgYXR0cmlidXRlcy4gIElmIGEgY2xhc3MgYXR0cmlidXRlCi1pcyBmb3VuZCB0aGF0IGlzIGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIG9iamVjdCBvciBhbiB1bmJvdW5kCi11c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdCB3aG9zZSBhc3NvY2lhdGVkIGNsYXNzIGlzIHRoZSBjbGFzcwotKGNhbGwgaXR+XGNsYXNze0N9KSBvZiB0aGUgaW5zdGFuY2UgZm9yIHdoaWNoIHRoZSBhdHRyaWJ1dGUgcmVmZXJlbmNlCi13YXMgaW5pdGlhdGVkIG9yIG9uZSBvZiBpdHMgYmFzZXMsCi1pdCBpcyB0cmFuc2Zvcm1lZCBpbnRvIGEgYm91bmQgdXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3Qgd2hvc2UKLVxtZW1iZXJ7aW1fY2xhc3N9IGF0dHJpYnV0ZSBpc35cY2xhc3N7Q30gYW5kIHdob3NlIFxtZW1iZXJ7aW1fc2VsZn0gYXR0cmlidXRlCi1pcyB0aGUgaW5zdGFuY2UuIFN0YXRpYyBtZXRob2QgYW5kIGNsYXNzIG1ldGhvZCBvYmplY3RzIGFyZSBhbHNvCi10cmFuc2Zvcm1lZCwgYXMgaWYgdGhleSBoYWQgYmVlbiByZXRyaWV2ZWQgZnJvbSBjbGFzc35cY2xhc3N7Q307Ci1zZWUgYWJvdmUgdW5kZXIgYGBDbGFzc2VzJycuIFNlZSBzZWN0aW9uflxyZWZ7ZGVzY3JpcHRvcnN9IGZvcgotYW5vdGhlciB3YXkgaW4gd2hpY2ggYXR0cmlidXRlcyBvZiBhIGNsYXNzIHJldHJpZXZlZCB2aWEgaXRzCi1pbnN0YW5jZXMgbWF5IGRpZmZlciBmcm9tIHRoZSBvYmplY3RzIGFjdHVhbGx5IHN0b3JlZCBpbiB0aGUKLWNsYXNzJ3MgXG1lbWJlcntfX2RpY3RfX30uCi1JZiBubyBjbGFzcyBhdHRyaWJ1dGUgaXMgZm91bmQsIGFuZCB0aGUgb2JqZWN0J3MgY2xhc3MgaGFzIGEKLVxtZXRob2R7X19nZXRhdHRyX18oKX0gbWV0aG9kLCB0aGF0IGlzIGNhbGxlZCB0byBzYXRpc2Z5IHRoZSBsb29rdXAuCi1cb2JpbmRleHtjbGFzcyBpbnN0YW5jZX0KLVxvYmluZGV4e2luc3RhbmNlfQotXGluZGV4aWl7Y2xhc3N9e2luc3RhbmNlfQotXGluZGV4aWl7Y2xhc3MgaW5zdGFuY2V9e2F0dHJpYnV0ZX0KLQotQXR0cmlidXRlIGFzc2lnbm1lbnRzIGFuZCBkZWxldGlvbnMgdXBkYXRlIHRoZSBpbnN0YW5jZSdzIGRpY3Rpb25hcnksCi1uZXZlciBhIGNsYXNzJ3MgZGljdGlvbmFyeS4gIElmIHRoZSBjbGFzcyBoYXMgYSBcbWV0aG9ke19fc2V0YXR0cl9fKCl9IG9yCi1cbWV0aG9ke19fZGVsYXR0cl9fKCl9IG1ldGhvZCwgdGhpcyBpcyBjYWxsZWQgaW5zdGVhZCBvZiB1cGRhdGluZyB0aGUKLWluc3RhbmNlIGRpY3Rpb25hcnkgZGlyZWN0bHkuCi1caW5kZXhpaWl7Y2xhc3MgaW5zdGFuY2V9e2F0dHJpYnV0ZX17YXNzaWdubWVudH0KLQotQ2xhc3MgaW5zdGFuY2VzIGNhbiBwcmV0ZW5kIHRvIGJlIG51bWJlcnMsIHNlcXVlbmNlcywgb3IgbWFwcGluZ3MgaWYKLXRoZXkgaGF2ZSBtZXRob2RzIHdpdGggY2VydGFpbiBzcGVjaWFsIG5hbWVzLiAgU2VlCi1zZWN0aW9uflxyZWZ7c3BlY2lhbG5hbWVzfSwgYGBTcGVjaWFsIG1ldGhvZCBuYW1lcy4nJwotXG9iaW5kZXh7bnVtZXJpY30KLVxvYmluZGV4e3NlcXVlbmNlfQotXG9iaW5kZXh7bWFwcGluZ30KLQotU3BlY2lhbCBhdHRyaWJ1dGVzOiBcbWVtYmVye19fZGljdF9ffSBpcyB0aGUgYXR0cmlidXRlCi1kaWN0aW9uYXJ5OyBcbWVtYmVye19fY2xhc3NfX30gaXMgdGhlIGluc3RhbmNlJ3MgY2xhc3MuCi1cd2l0aHN1Yml0ZW17KGluc3RhbmNlIGF0dHJpYnV0ZSl9ewotICBcdHRpbmRleHtfX2RpY3RfX30KLSAgXHR0aW5kZXh7X19jbGFzc19ffX0KLQotXGl0ZW1bRmlsZXNdCi1BIGZpbGVcb2JpbmRleHtmaWxlfSBvYmplY3QgcmVwcmVzZW50cyBhbiBvcGVuIGZpbGUuICBGaWxlIG9iamVjdHMgYXJlCi1jcmVhdGVkIGJ5IHRoZSBcZnVuY3Rpb257b3BlbigpfVxiaWZ1bmNpbmRleHtvcGVufSBidWlsdC1pbiBmdW5jdGlvbiwKLWFuZCBhbHNvIGJ5Ci1cd2l0aHN1Yml0ZW17KGluIG1vZHVsZSBvcyl9e1x0dGluZGV4e3BvcGVuKCl9fVxmdW5jdGlvbntvcy5wb3BlbigpfSwKLVxmdW5jdGlvbntvcy5mZG9wZW4oKX0sIGFuZCB0aGUKLVxtZXRob2R7bWFrZWZpbGUoKX1cd2l0aHN1Yml0ZW17KHNvY2tldCBtZXRob2QpfXtcdHRpbmRleHttYWtlZmlsZSgpfX0KLW1ldGhvZCBvZiBzb2NrZXQgb2JqZWN0cyAoYW5kIHBlcmhhcHMgYnkgb3RoZXIgZnVuY3Rpb25zIG9yIG1ldGhvZHMKLXByb3ZpZGVkIGJ5IGV4dGVuc2lvbiBtb2R1bGVzKS4gIFRoZSBvYmplY3RzCi1cdHRpbmRleHtzeXMuc3RkaW59XGNvZGV7c3lzLnN0ZGlufSwKLVx0dGluZGV4e3N5cy5zdGRvdXR9XGNvZGV7c3lzLnN0ZG91dH0gYW5kCi1cdHRpbmRleHtzeXMuc3RkZXJyfVxjb2Rle3N5cy5zdGRlcnJ9IGFyZSBpbml0aWFsaXplZCB0byBmaWxlIG9iamVjdHMKLWNvcnJlc3BvbmRpbmcgdG8gdGhlIGludGVycHJldGVyJ3Mgc3RhbmRhcmRcaW5kZXh7c3RkaW99IGlucHV0LCBvdXRwdXQKLWFuZCBlcnJvciBzdHJlYW1zLiAgU2VlIHRoZSBcY2l0ZXRpdGxlWy4uL2xpYi9saWIuaHRtbF17UHl0aG9uIExpYnJhcnkKLVJlZmVyZW5jZX0gZm9yIGNvbXBsZXRlIGRvY3VtZW50YXRpb24gb2YgZmlsZSBvYmplY3RzLgotXHdpdGhzdWJpdGVteyhpbiBtb2R1bGUgc3lzKX17Ci0gIFx0dGluZGV4e3N0ZGlufQotICBcdHRpbmRleHtzdGRvdXR9Ci0gIFx0dGluZGV4e3N0ZGVycn19Ci0KLQotXGl0ZW1bSW50ZXJuYWwgdHlwZXNdCi1BIGZldyB0eXBlcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIGludGVycHJldGVyIGFyZSBleHBvc2VkIHRvIHRoZSB1c2VyLgotVGhlaXIgZGVmaW5pdGlvbnMgbWF5IGNoYW5nZSB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGUgaW50ZXJwcmV0ZXIsCi1idXQgdGhleSBhcmUgbWVudGlvbmVkIGhlcmUgZm9yIGNvbXBsZXRlbmVzcy4KLVxpbmRleHtpbnRlcm5hbCB0eXBlfQotXGluZGV4e3R5cGVzLCBpbnRlcm5hbH0KLQotXGJlZ2lue2Rlc2NyaXB0aW9ufQotCi1caXRlbVtDb2RlIG9iamVjdHNdCi1Db2RlIG9iamVjdHMgcmVwcmVzZW50IFxlbXBoe2J5dGUtY29tcGlsZWR9IGV4ZWN1dGFibGUgUHl0aG9uIGNvZGUsIG9yCi1cZW1waHtieXRlY29kZX0uCi1UaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgY29kZQotb2JqZWN0IGFuZCBhIGZ1bmN0aW9uIG9iamVjdCBpcyB0aGF0IHRoZSBmdW5jdGlvbiBvYmplY3QgY29udGFpbnMgYW4KLWV4cGxpY2l0IHJlZmVyZW5jZSB0byB0aGUgZnVuY3Rpb24ncyBnbG9iYWxzICh0aGUgbW9kdWxlIGluIHdoaWNoIGl0Ci13YXMgZGVmaW5lZCksIHdoaWxlIGEgY29kZSBvYmplY3QgY29udGFpbnMgbm8gY29udGV4dDsKLWFsc28gdGhlIGRlZmF1bHQgYXJndW1lbnQgdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlIGZ1bmN0aW9uIG9iamVjdCwKLW5vdCBpbiB0aGUgY29kZSBvYmplY3QgKGJlY2F1c2UgdGhleSByZXByZXNlbnQgdmFsdWVzIGNhbGN1bGF0ZWQgYXQKLXJ1bi10aW1lKS4gIFVubGlrZSBmdW5jdGlvbiBvYmplY3RzLCBjb2RlIG9iamVjdHMgYXJlIGltbXV0YWJsZSBhbmQKLWNvbnRhaW4gbm8gcmVmZXJlbmNlcyAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkgdG8gbXV0YWJsZSBvYmplY3RzLgotXGluZGV4e2J5dGVjb2RlfQotXG9iaW5kZXh7Y29kZX0KLQotU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlczogXG1lbWJlcntjb19uYW1lfSBnaXZlcyB0aGUgZnVuY3Rpb24KLW5hbWU7IFxtZW1iZXJ7Y29fYXJnY291bnR9IGlzIHRoZSBudW1iZXIgb2YgcG9zaXRpb25hbCBhcmd1bWVudHMKLShpbmNsdWRpbmcgYXJndW1lbnRzIHdpdGggZGVmYXVsdCB2YWx1ZXMpOyBcbWVtYmVye2NvX25sb2NhbHN9IGlzIHRoZQotbnVtYmVyIG9mIGxvY2FsIHZhcmlhYmxlcyB1c2VkIGJ5IHRoZSBmdW5jdGlvbiAoaW5jbHVkaW5nIGFyZ3VtZW50cyk7Ci1cbWVtYmVye2NvX3Zhcm5hbWVzfSBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIHRoZSBsb2NhbAotdmFyaWFibGVzIChzdGFydGluZyB3aXRoIHRoZSBhcmd1bWVudCBuYW1lcyk7IFxtZW1iZXJ7Y29fY2VsbHZhcnN9IGlzCi1hIHR1cGxlIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIGxvY2FsIHZhcmlhYmxlcyB0aGF0IGFyZSByZWZlcmVuY2VkIGJ5Ci1uZXN0ZWQgZnVuY3Rpb25zOyBcbWVtYmVye2NvX2ZyZWV2YXJzfSBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIG5hbWVzCi1vZiBmcmVlIHZhcmlhYmxlczsgXG1lbWJlcntjb19jb2RlfSBpcyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlCi1zZXF1ZW5jZSBvZiBieXRlY29kZSBpbnN0cnVjdGlvbnM7Ci1cbWVtYmVye2NvX2NvbnN0c30gaXMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBsaXRlcmFscyB1c2VkIGJ5IHRoZQotYnl0ZWNvZGU7IFxtZW1iZXJ7Y29fbmFtZXN9IGlzIGEgdHVwbGUgY29udGFpbmluZyB0aGUgbmFtZXMgdXNlZCBieQotdGhlIGJ5dGVjb2RlOyBcbWVtYmVye2NvX2ZpbGVuYW1lfSBpcyB0aGUgZmlsZW5hbWUgZnJvbSB3aGljaCB0aGUgY29kZQotd2FzIGNvbXBpbGVkOyBcbWVtYmVye2NvX2ZpcnN0bGluZW5vfSBpcyB0aGUgZmlyc3QgbGluZSBudW1iZXIgb2YgdGhlCi1mdW5jdGlvbjsgXG1lbWJlcntjb19sbm90YWJ9IGlzIGEgc3RyaW5nIGVuY29kaW5nIHRoZSBtYXBwaW5nIGZyb20KLWJ5dGUgY29kZSBvZmZzZXRzIHRvIGxpbmUgbnVtYmVycyAoZm9yIGRldGFpbHMgc2VlIHRoZSBzb3VyY2UgY29kZSBvZgotdGhlIGludGVycHJldGVyKTsgXG1lbWJlcntjb19zdGFja3NpemV9IGlzIHRoZSByZXF1aXJlZCBzdGFjayBzaXplCi0oaW5jbHVkaW5nIGxvY2FsIHZhcmlhYmxlcyk7IFxtZW1iZXJ7Y29fZmxhZ3N9IGlzIGFuIGludGVnZXIgZW5jb2RpbmcKLWEgbnVtYmVyIG9mIGZsYWdzIGZvciB0aGUgaW50ZXJwcmV0ZXIuCi0KLVx3aXRoc3ViaXRlbXsoY29kZSBvYmplY3QgYXR0cmlidXRlKX17Ci0gIFx0dGluZGV4e2NvX2FyZ2NvdW50fQotICBcdHRpbmRleHtjb19jb2RlfQotICBcdHRpbmRleHtjb19jb25zdHN9Ci0gIFx0dGluZGV4e2NvX2ZpbGVuYW1lfQotICBcdHRpbmRleHtjb19maXJzdGxpbmVub30KLSAgXHR0aW5kZXh7Y29fZmxhZ3N9Ci0gIFx0dGluZGV4e2NvX2xub3RhYn0KLSAgXHR0aW5kZXh7Y29fbmFtZX0KLSAgXHR0aW5kZXh7Y29fbmFtZXN9Ci0gIFx0dGluZGV4e2NvX25sb2NhbHN9Ci0gIFx0dGluZGV4e2NvX3N0YWNrc2l6ZX0KLSAgXHR0aW5kZXh7Y29fdmFybmFtZXN9Ci0gIFx0dGluZGV4e2NvX2NlbGx2YXJzfQotICBcdHRpbmRleHtjb19mcmVldmFyc319Ci0KLVRoZSBmb2xsb3dpbmcgZmxhZyBiaXRzIGFyZSBkZWZpbmVkIGZvciBcbWVtYmVye2NvX2ZsYWdzfTogYml0Ci1cY29kZXsweDA0fSBpcyBzZXQgaWYgdGhlIGZ1bmN0aW9uIHVzZXMgdGhlIFxzYW1weyphcmd1bWVudHN9IHN5bnRheAotdG8gYWNjZXB0IGFuIGFyYml0cmFyeSBudW1iZXIgb2YgcG9zaXRpb25hbCBhcmd1bWVudHM7IGJpdAotXGNvZGV7MHgwOH0gaXMgc2V0IGlmIHRoZSBmdW5jdGlvbiB1c2VzIHRoZSBcc2FtcHsqKmtleXdvcmRzfSBzeW50YXgKLXRvIGFjY2VwdCBhcmJpdHJhcnkga2V5d29yZCBhcmd1bWVudHM7IGJpdCBcY29kZXsweDIwfSBpcyBzZXQgaWYgdGhlCi1mdW5jdGlvbiBpcyBhIGdlbmVyYXRvci4KLVxvYmluZGV4e2dlbmVyYXRvcn0KLQotRnV0dXJlIGZlYXR1cmUgZGVjbGFyYXRpb25zIChcc2FtcHtmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9ufSkKLWFsc28gdXNlIGJpdHMgaW4gXG1lbWJlcntjb19mbGFnc30gdG8gaW5kaWNhdGUgd2hldGhlciBhIGNvZGUgb2JqZWN0Ci13YXMgY29tcGlsZWQgd2l0aCBhIHBhcnRpY3VsYXIgZmVhdHVyZSBlbmFibGVkOiBiaXQgXGNvZGV7MHgyMDAwfSBpcwotc2V0IGlmIHRoZSBmdW5jdGlvbiB3YXMgY29tcGlsZWQgd2l0aCBmdXR1cmUgZGl2aXNpb24gZW5hYmxlZDsgYml0cwotXGNvZGV7MHgxMH0gYW5kIFxjb2RlezB4MTAwMH0gd2VyZSB1c2VkIGluIGVhcmxpZXIgdmVyc2lvbnMgb2YgUHl0aG9uLgotCi1PdGhlciBiaXRzIGluIFxtZW1iZXJ7Y29fZmxhZ3N9IGFyZSByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlLgotCi1JZlxpbmRleHtkb2N1bWVudGF0aW9uIHN0cmluZ30gYSBjb2RlIG9iamVjdCByZXByZXNlbnRzIGEgZnVuY3Rpb24sCi10aGUgZmlyc3QgaXRlbSBpbgotXG1lbWJlcntjb19jb25zdHN9IGlzIHRoZSBkb2N1bWVudGF0aW9uIHN0cmluZyBvZiB0aGUgZnVuY3Rpb24sIG9yCi1cY29kZXtOb25lfSBpZiB1bmRlZmluZWQuCi0KLVxpdGVtW0ZyYW1lIG9iamVjdHNdCi1GcmFtZSBvYmplY3RzIHJlcHJlc2VudCBleGVjdXRpb24gZnJhbWVzLiAgVGhleSBtYXkgb2NjdXIgaW4gdHJhY2ViYWNrCi1vYmplY3RzIChzZWUgYmVsb3cpLgotXG9iaW5kZXh7ZnJhbWV9Ci0KLVNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXM6IFxtZW1iZXJ7Zl9iYWNrfSBpcyB0byB0aGUgcHJldmlvdXMKLXN0YWNrIGZyYW1lICh0b3dhcmRzIHRoZSBjYWxsZXIpLCBvciBcY29kZXtOb25lfSBpZiB0aGlzIGlzIHRoZSBib3R0b20KLXN0YWNrIGZyYW1lOyBcbWVtYmVye2ZfY29kZX0gaXMgdGhlIGNvZGUgb2JqZWN0IGJlaW5nIGV4ZWN1dGVkIGluIHRoaXMKLWZyYW1lOyBcbWVtYmVye2ZfbG9jYWxzfSBpcyB0aGUgZGljdGlvbmFyeSB1c2VkIHRvIGxvb2sgdXAgbG9jYWwKLXZhcmlhYmxlczsgXG1lbWJlcntmX2dsb2JhbHN9IGlzIHVzZWQgZm9yIGdsb2JhbCB2YXJpYWJsZXM7Ci1cbWVtYmVye2ZfYnVpbHRpbnN9IGlzIHVzZWQgZm9yIGJ1aWx0LWluIChpbnRyaW5zaWMpIG5hbWVzOwotIFxtZW1iZXJ7Zl9sYXN0aX0gZ2l2ZXMgdGhlIHByZWNpc2UgaW5zdHJ1Y3Rpb24gKHRoaXMgaXMgYW4gaW5kZXggaW50bwotIHRoZSBieXRlY29kZSBzdHJpbmcgb2YgdGhlIGNvZGUgb2JqZWN0KS4KLVx3aXRoc3ViaXRlbXsoZnJhbWUgYXR0cmlidXRlKX17Ci0gIFx0dGluZGV4e2ZfYmFja30KLSAgXHR0aW5kZXh7Zl9jb2RlfQotICBcdHRpbmRleHtmX2dsb2JhbHN9Ci0gIFx0dGluZGV4e2ZfbG9jYWxzfQotICBcdHRpbmRleHtmX2xhc3RpfQotICBcdHRpbmRleHtmX2J1aWx0aW5zfX0KLQotU3BlY2lhbCB3cml0YWJsZSBhdHRyaWJ1dGVzOiBcbWVtYmVye2ZfdHJhY2V9LCBpZiBub3QgXGNvZGV7Tm9uZX0sIGlzCi1hIGZ1bmN0aW9uIGNhbGxlZCBhdCB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgY29kZSBsaW5lICh0aGlzIGlzIHVzZWQKLWJ5IHRoZSBkZWJ1Z2dlcik7IFxtZW1iZXJ7Zl9leGNfdHlwZX0sIFxtZW1iZXJ7Zl9leGNfdmFsdWV9LAotXG1lbWJlcntmX2V4Y190cmFjZWJhY2t9IHJlcHJlc2VudCB0aGUgbGFzdCBleGNlcHRpb24gcmFpc2VkIGluIHRoZQotcGFyZW50IGZyYW1lIHByb3ZpZGVkIGFub3RoZXIgZXhjZXB0aW9uIHdhcyBldmVyIHJhaXNlZCBpbiB0aGUgY3VycmVudAotZnJhbWUgKGluIGFsbCBvdGhlciBjYXNlcyB0aGV5IGFyZSBOb25lKTsgXG1lbWJlcntmX2xpbmVub30gaXMgdGhlCi1jdXJyZW50IGxpbmUgbnVtYmVyIG9mIHRoZSBmcmFtZSAtLS0gd3JpdGluZyB0byB0aGlzIGZyb20gd2l0aGluIGEKLXRyYWNlIGZ1bmN0aW9uIGp1bXBzIHRvIHRoZSBnaXZlbiBsaW5lIChvbmx5IGZvciB0aGUgYm90dG9tLW1vc3QKLWZyYW1lKS4gIEEgZGVidWdnZXIgY2FuIGltcGxlbWVudCBhIEp1bXAgY29tbWFuZCAoYWthIFNldCBOZXh0Ci1TdGF0ZW1lbnQpIGJ5IHdyaXRpbmcgdG8gZl9saW5lbm8uCi1cd2l0aHN1Yml0ZW17KGZyYW1lIGF0dHJpYnV0ZSl9ewotICBcdHRpbmRleHtmX3RyYWNlfQotICBcdHRpbmRleHtmX2V4Y190eXBlfQotICBcdHRpbmRleHtmX2V4Y192YWx1ZX0KLSAgXHR0aW5kZXh7Zl9leGNfdHJhY2ViYWNrfQotICBcdHRpbmRleHtmX2xpbmVub319Ci0KLVxpdGVtW1RyYWNlYmFjayBvYmplY3RzXSBcbGFiZWx7dHJhY2ViYWNrfQotVHJhY2ViYWNrIG9iamVjdHMgcmVwcmVzZW50IGEgc3RhY2sgdHJhY2Ugb2YgYW4gZXhjZXB0aW9uLiAgQQotdHJhY2ViYWNrIG9iamVjdCBpcyBjcmVhdGVkIHdoZW4gYW4gZXhjZXB0aW9uIG9jY3Vycy4gIFdoZW4gdGhlIHNlYXJjaAotZm9yIGFuIGV4Y2VwdGlvbiBoYW5kbGVyIHVud2luZHMgdGhlIGV4ZWN1dGlvbiBzdGFjaywgYXQgZWFjaCB1bndvdW5kCi1sZXZlbCBhIHRyYWNlYmFjayBvYmplY3QgaXMgaW5zZXJ0ZWQgaW4gZnJvbnQgb2YgdGhlIGN1cnJlbnQKLXRyYWNlYmFjay4gIFdoZW4gYW4gZXhjZXB0aW9uIGhhbmRsZXIgaXMgZW50ZXJlZCwgdGhlIHN0YWNrIHRyYWNlIGlzCi1tYWRlIGF2YWlsYWJsZSB0byB0aGUgcHJvZ3JhbS4KLShTZWUgc2VjdGlvbn5ccmVme3RyeX0sIGBgVGhlIFxjb2Rle3RyeX0gc3RhdGVtZW50LicnKQotSXQgaXMgYWNjZXNzaWJsZSBhcyB0aGUgdGhpcmQKLWl0ZW0gb2YgdGhlIHR1cGxlIHJldHVybmVkIGJ5IFxjb2Rle3N5cy5leGNfaW5mbygpfS4KLVdoZW4gdGhlIHByb2dyYW0gY29udGFpbnMgbm8gc3VpdGFibGUgaGFuZGxlciwgdGhlIHN0YWNrIHRyYWNlIGlzIHdyaXR0ZW4KLShuaWNlbHkgZm9ybWF0dGVkKSB0byB0aGUgc3RhbmRhcmQgZXJyb3Igc3RyZWFtOyBpZiB0aGUgaW50ZXJwcmV0ZXIgaXMKLWludGVyYWN0aXZlLCBpdCBpcyBhbHNvIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSB1c2VyIGFzCi1cY29kZXtzeXMubGFzdF90cmFjZWJhY2t9LgotXG9iaW5kZXh7dHJhY2ViYWNrfQotXGluZGV4aWl7c3RhY2t9e3RyYWNlfQotXGluZGV4aWl7ZXhjZXB0aW9ufXtoYW5kbGVyfQotXGluZGV4aWl7ZXhlY3V0aW9ufXtzdGFja30KLVx3aXRoc3ViaXRlbXsoaW4gbW9kdWxlIHN5cyl9ewotICBcdHRpbmRleHtleGNfaW5mb30KLSAgXHR0aW5kZXh7ZXhjX3RyYWNlYmFja30KLSAgXHR0aW5kZXh7bGFzdF90cmFjZWJhY2t9fQotXHR0aW5kZXh7c3lzLmV4Y19pbmZvfQotXHR0aW5kZXh7c3lzLmxhc3RfdHJhY2ViYWNrfQotCi1TcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzOiBcbWVtYmVye3RiX25leHR9IGlzIHRoZSBuZXh0IGxldmVsIGluIHRoZQotc3RhY2sgdHJhY2UgKHRvd2FyZHMgdGhlIGZyYW1lIHdoZXJlIHRoZSBleGNlcHRpb24gb2NjdXJyZWQpLCBvcgotXGNvZGV7Tm9uZX0gaWYgdGhlcmUgaXMgbm8gbmV4dCBsZXZlbDsgXG1lbWJlcnt0Yl9mcmFtZX0gcG9pbnRzIHRvIHRoZQotZXhlY3V0aW9uIGZyYW1lIG9mIHRoZSBjdXJyZW50IGxldmVsOyBcbWVtYmVye3RiX2xpbmVub30gZ2l2ZXMgdGhlIGxpbmUKLW51bWJlciB3aGVyZSB0aGUgZXhjZXB0aW9uIG9jY3VycmVkOyBcbWVtYmVye3RiX2xhc3RpfSBpbmRpY2F0ZXMgdGhlCi1wcmVjaXNlIGluc3RydWN0aW9uLiAgVGhlIGxpbmUgbnVtYmVyIGFuZCBsYXN0IGluc3RydWN0aW9uIGluIHRoZQotdHJhY2ViYWNrIG1heSBkaWZmZXIgZnJvbSB0aGUgbGluZSBudW1iZXIgb2YgaXRzIGZyYW1lIG9iamVjdCBpZiB0aGUKLWV4Y2VwdGlvbiBvY2N1cnJlZCBpbiBhIFxrZXl3b3Jke3RyeX0gc3RhdGVtZW50IHdpdGggbm8gbWF0Y2hpbmcKLWV4Y2VwdCBjbGF1c2Ugb3Igd2l0aCBhIGZpbmFsbHkgY2xhdXNlLgotXHdpdGhzdWJpdGVteyh0cmFjZWJhY2sgYXR0cmlidXRlKX17Ci0gIFx0dGluZGV4e3RiX25leHR9Ci0gIFx0dGluZGV4e3RiX2ZyYW1lfQotICBcdHRpbmRleHt0Yl9saW5lbm99Ci0gIFx0dGluZGV4e3RiX2xhc3RpfX0KLVxzdGluZGV4e3RyeX0KLQotXGl0ZW1bU2xpY2Ugb2JqZWN0c10KLVNsaWNlIG9iamVjdHMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IHNsaWNlcyB3aGVuIFxlbXBoe2V4dGVuZGVkIHNsaWNlCi1zeW50YXh9IGlzIHVzZWQuICBUaGlzIGlzIGEgc2xpY2UgdXNpbmcgdHdvIGNvbG9ucywgb3IgbXVsdGlwbGUgc2xpY2VzCi1vciBlbGxpcHNlcyBzZXBhcmF0ZWQgYnkgY29tbWFzLCBlLmcuLCBcY29kZXthW2k6ajpzdGVwXX0sIFxjb2Rle2FbaTpqLAotazpsXX0sIG9yIFxjb2Rle2FbLi4uLCBpOmpdfS4gIFRoZXkgYXJlIGFsc28gY3JlYXRlZCBieSB0aGUgYnVpbHQtaW4KLVxmdW5jdGlvbntzbGljZSgpfVxiaWZ1bmNpbmRleHtzbGljZX0gZnVuY3Rpb24uCi0KLVNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXM6IFxtZW1iZXJ7c3RhcnR9IGlzIHRoZSBsb3dlciBib3VuZDsKLVxtZW1iZXJ7c3RvcH0gaXMgdGhlIHVwcGVyIGJvdW5kOyBcbWVtYmVye3N0ZXB9IGlzIHRoZSBzdGVwIHZhbHVlOyBlYWNoIGlzCi1cY29kZXtOb25lfSBpZiBvbWl0dGVkLiBUaGVzZSBhdHRyaWJ1dGVzIGNhbiBoYXZlIGFueSB0eXBlLgotXHdpdGhzdWJpdGVteyhzbGljZSBvYmplY3QgYXR0cmlidXRlKX17Ci0gIFx0dGluZGV4e3N0YXJ0fQotICBcdHRpbmRleHtzdG9wfQotICBcdHRpbmRleHtzdGVwfX0KLQotU2xpY2Ugb2JqZWN0cyBzdXBwb3J0IG9uZSBtZXRob2Q6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtzbGljZV17aW5kaWNlc317c2VsZiwgbGVuZ3RofQotVGhpcyBtZXRob2QgdGFrZXMgYSBzaW5nbGUgaW50ZWdlciBhcmd1bWVudCBcdmFye2xlbmd0aH0gYW5kIGNvbXB1dGVzCi1pbmZvcm1hdGlvbiBhYm91dCB0aGUgZXh0ZW5kZWQgc2xpY2UgdGhhdCB0aGUgc2xpY2Ugb2JqZWN0IHdvdWxkCi1kZXNjcmliZSBpZiBhcHBsaWVkIHRvIGEgc2VxdWVuY2Ugb2YgXHZhcntsZW5ndGh9IGl0ZW1zLiAgSXQgcmV0dXJucyBhCi10dXBsZSBvZiB0aHJlZSBpbnRlZ2VyczsgcmVzcGVjdGl2ZWx5IHRoZXNlIGFyZSB0aGUgXHZhcntzdGFydH0gYW5kCi1cdmFye3N0b3B9IGluZGljZXMgYW5kIHRoZSBcdmFye3N0ZXB9IG9yIHN0cmlkZSBsZW5ndGggb2YgdGhlIHNsaWNlLgotTWlzc2luZyBvciBvdXQtb2YtYm91bmRzIGluZGljZXMgYXJlIGhhbmRsZWQgaW4gYSBtYW5uZXIgY29uc2lzdGVudAotd2l0aCByZWd1bGFyIHNsaWNlcy4KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotXGVuZHttZXRob2RkZXNjfQotCi1caXRlbVtTdGF0aWMgbWV0aG9kIG9iamVjdHNdCi1TdGF0aWMgbWV0aG9kIG9iamVjdHMgcHJvdmlkZSBhIHdheSBvZiBkZWZlYXRpbmcgdGhlIHRyYW5zZm9ybWF0aW9uCi1vZiBmdW5jdGlvbiBvYmplY3RzIHRvIG1ldGhvZCBvYmplY3RzIGRlc2NyaWJlZCBhYm92ZS4gQSBzdGF0aWMgbWV0aG9kCi1vYmplY3QgaXMgYSB3cmFwcGVyIGFyb3VuZCBhbnkgb3RoZXIgb2JqZWN0LCB1c3VhbGx5IGEgdXNlci1kZWZpbmVkCi1tZXRob2Qgb2JqZWN0LiBXaGVuIGEgc3RhdGljIG1ldGhvZCBvYmplY3QgaXMgcmV0cmlldmVkIGZyb20gYSBjbGFzcwotb3IgYSBjbGFzcyBpbnN0YW5jZSwgdGhlIG9iamVjdCBhY3R1YWxseSByZXR1cm5lZCBpcyB0aGUgd3JhcHBlZCBvYmplY3QsCi13aGljaCBpcyBub3Qgc3ViamVjdCB0byBhbnkgZnVydGhlciB0cmFuc2Zvcm1hdGlvbi4gU3RhdGljIG1ldGhvZAotb2JqZWN0cyBhcmUgbm90IHRoZW1zZWx2ZXMgY2FsbGFibGUsIGFsdGhvdWdoIHRoZSBvYmplY3RzIHRoZXkKLXdyYXAgdXN1YWxseSBhcmUuIFN0YXRpYyBtZXRob2Qgb2JqZWN0cyBhcmUgY3JlYXRlZCBieSB0aGUgYnVpbHQtaW4KLVxmdW5jdGlvbntzdGF0aWNtZXRob2QoKX0gY29uc3RydWN0b3IuCi0KLVxpdGVtW0NsYXNzIG1ldGhvZCBvYmplY3RzXQotQSBjbGFzcyBtZXRob2Qgb2JqZWN0LCBsaWtlIGEgc3RhdGljIG1ldGhvZCBvYmplY3QsIGlzIGEgd3JhcHBlcgotYXJvdW5kIGFub3RoZXIgb2JqZWN0IHRoYXQgYWx0ZXJzIHRoZSB3YXkgaW4gd2hpY2ggdGhhdCBvYmplY3QKLWlzIHJldHJpZXZlZCBmcm9tIGNsYXNzZXMgYW5kIGNsYXNzIGluc3RhbmNlcy4gVGhlIGJlaGF2aW91ciBvZgotY2xhc3MgbWV0aG9kIG9iamVjdHMgdXBvbiBzdWNoIHJldHJpZXZhbCBpcyBkZXNjcmliZWQgYWJvdmUsCi11bmRlciBgYFVzZXItZGVmaW5lZCBtZXRob2RzJycuIENsYXNzIG1ldGhvZCBvYmplY3RzIGFyZSBjcmVhdGVkCi1ieSB0aGUgYnVpbHQtaW4gXGZ1bmN0aW9ue2NsYXNzbWV0aG9kKCl9IGNvbnN0cnVjdG9yLgotCi1cZW5ke2Rlc2NyaXB0aW9ufSAlIEludGVybmFsIHR5cGVzCi0KLVxlbmR7ZGVzY3JpcHRpb259ICUgVHlwZXMKLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue05ldy1zdHlsZSBhbmQgY2xhc3NpYyBjbGFzc2VzfQotCi1DbGFzc2VzIGFuZCBpbnN0YW5jZXMgY29tZSBpbiB0d28gZmxhdm9yczogb2xkLXN0eWxlIG9yIGNsYXNzaWMsIGFuZCBuZXctc3R5bGUuCi0KLVVwIHRvIFB5dGhvbiAyLjEsIG9sZC1zdHlsZSBjbGFzc2VzIHdlcmUgdGhlIG9ubHkgZmxhdm91ciBhdmFpbGFibGUgdG8gdGhlCi11c2VyLiAgVGhlIGNvbmNlcHQgb2YgKG9sZC1zdHlsZSkgY2xhc3MgaXMgdW5yZWxhdGVkIHRvIHRoZSBjb25jZXB0IG9mIHR5cGU6IGlmCi1cdmFye3h9IGlzIGFuIGluc3RhbmNlIG9mIGFuIG9sZC1zdHlsZSBjbGFzcywgdGhlbiBcY29kZXt4Ll9fY2xhc3NfX30KLWRlc2lnbmF0ZXMgdGhlIGNsYXNzIG9mIFx2YXJ7eH0sIGJ1dCBcY29kZXt0eXBlKHgpfSBpcyBhbHdheXMgXGNvZGV7PHR5cGUKLSdpbnN0YW5jZSc+fS4gIFRoaXMgcmVmbGVjdHMgdGhlIGZhY3QgdGhhdCBhbGwgb2xkLXN0eWxlIGluc3RhbmNlcywKLWluZGVwZW5kZW50bHkgb2YgdGhlaXIgY2xhc3MsIGFyZSBpbXBsZW1lbnRlZCB3aXRoIGEgc2luZ2xlIGJ1aWx0LWluIHR5cGUsCi1jYWxsZWQgXGNvZGV7aW5zdGFuY2V9LgotCi1OZXctc3R5bGUgY2xhc3NlcyB3ZXJlIGludHJvZHVjZWQgaW4gUHl0aG9uIDIuMiB0byB1bmlmeSBjbGFzc2VzIGFuZCB0eXBlcy4gIEEKLW5ldy1zdHlsZSBjbGFzcyBuZWl0aGVyIG1vcmUgbm9yIGxlc3MgdGhhbiBhIHVzZXItZGVmaW5lZCB0eXBlLiAgSWYgXHZhcnt4fSBpcwotYW4gaW5zdGFuY2Ugb2YgYSBuZXctc3R5bGUgY2xhc3MsIHRoZW4gXGNvZGV7dHlwZSh4KX0gaXMgdGhlIHNhbWUgYXMKLVxjb2Rle3guX19jbGFzc19ffS4KLQotVGhlIG1ham9yIG1vdGl2YXRpb24gZm9yIGludHJvZHVjaW5nIG5ldy1zdHlsZSBjbGFzc2VzIGlzIHRvIHByb3ZpZGUgYSB1bmlmaWVkCi1vYmplY3QgbW9kZWwgd2l0aCBhIGZ1bGwgbWV0YS1tb2RlbC4gIEl0IGFsc28gaGFzIGEgbnVtYmVyIG9mIGltbWVkaWF0ZQotYmVuZWZpdHMsIGxpa2UgdGhlIGFiaWxpdHkgdG8gc3ViY2xhc3MgbW9zdCBidWlsdC1pbiB0eXBlcywgb3IgdGhlIGludHJvZHVjdGlvbgotb2YgImRlc2NyaXB0b3JzIiwgd2hpY2ggZW5hYmxlIGNvbXB1dGVkIHByb3BlcnRpZXMuCi0KLUZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMsIGNsYXNzZXMgYXJlIHN0aWxsIG9sZC1zdHlsZSBieSBkZWZhdWx0LiAgTmV3LXN0eWxlCi1jbGFzc2VzIGFyZSBjcmVhdGVkIGJ5IHNwZWNpZnlpbmcgYW5vdGhlciBuZXctc3R5bGUgY2xhc3MgKGkuZS5cIGEgdHlwZSkgYXMgYQotcGFyZW50IGNsYXNzLCBvciB0aGUgInRvcC1sZXZlbCB0eXBlIiBcY2xhc3N7b2JqZWN0fSBpZiBubyBvdGhlciBwYXJlbnQgaXMKLW5lZWRlZC4gIFRoZSBiZWhhdmlvdXIgb2YgbmV3LXN0eWxlIGNsYXNzZXMgZGlmZmVycyBmcm9tIHRoYXQgb2Ygb2xkLXN0eWxlCi1jbGFzc2VzIGluIGEgbnVtYmVyIG9mIGltcG9ydGFudCBkZXRhaWxzIGluIGFkZGl0aW9uIHRvIHdoYXQgXGZ1bmN0aW9ue3R5cGV9Ci1yZXR1cm5zLiAgU29tZSBvZiB0aGVzZSBjaGFuZ2VzIGFyZSBmdW5kYW1lbnRhbCB0byB0aGUgbmV3IG9iamVjdCBtb2RlbCwgbGlrZQotdGhlIHdheSBzcGVjaWFsIG1ldGhvZHMgYXJlIGludm9rZWQuICBPdGhlcnMgYXJlICJmaXhlcyIgdGhhdCBjb3VsZCBub3QgYmUKLWltcGxlbWVudGVkIGJlZm9yZSBmb3IgY29tcGF0aWJpbGl0eSBjb25jZXJucywgbGlrZSB0aGUgbWV0aG9kIHJlc29sdXRpb24gb3JkZXIKLWluIGNhc2Ugb2YgbXVsdGlwbGUgaW5oZXJpdGFuY2UuCi0KLVRoaXMgbWFudWFsIGlzIG5vdCB1cC10by1kYXRlIHdpdGggcmVzcGVjdCB0byBuZXctc3R5bGUgY2xhc3Nlcy4gIEZvciBub3csCi1wbGVhc2Ugc2VlIFx1cmx7aHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9uZXdzdHlsZS5odG1sfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotVGhlIHBsYW4gaXMgdG8gZXZlbnR1YWxseSBkcm9wIG9sZC1zdHlsZSBjbGFzc2VzLCBsZWF2aW5nIG9ubHkgdGhlIHNlbWFudGljcyBvZgotbmV3LXN0eWxlIGNsYXNzZXMuICBUaGlzIGNoYW5nZSB3aWxsIHByb2JhYmx5IG9ubHkgYmUgZmVhc2libGUgaW4gUHl0aG9uIDMuMC4KLVxpbmRleHtjbGFzc317bmV3LXN0eWxlfQotXGluZGV4e2NsYXNzfXtjbGFzc2ljfQotXGluZGV4e2NsYXNzfXtvbGQtc3R5bGV9Ci0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntTcGVjaWFsIG1ldGhvZCBuYW1lc1xsYWJlbHtzcGVjaWFsbmFtZXN9fQotCi1BIGNsYXNzIGNhbiBpbXBsZW1lbnQgY2VydGFpbiBvcGVyYXRpb25zIHRoYXQgYXJlIGludm9rZWQgYnkgc3BlY2lhbAotc3ludGF4IChzdWNoIGFzIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBvciBzdWJzY3JpcHRpbmcgYW5kIHNsaWNpbmcpIGJ5Ci1kZWZpbmluZyBtZXRob2RzIHdpdGggc3BlY2lhbCBuYW1lcy5caW5kZXhpaXtvcGVyYXRvcn17b3ZlcmxvYWRpbmd9Ci1UaGlzIGlzIFB5dGhvbidzIGFwcHJvYWNoIHRvIFxkZm57b3BlcmF0b3Igb3ZlcmxvYWRpbmd9LCBhbGxvd2luZwotY2xhc3NlcyB0byBkZWZpbmUgdGhlaXIgb3duIGJlaGF2aW9yIHdpdGggcmVzcGVjdCB0byBsYW5ndWFnZQotb3BlcmF0b3JzLiAgRm9yIGluc3RhbmNlLCBpZiBhIGNsYXNzIGRlZmluZXMKLWEgbWV0aG9kIG5hbWVkIFxtZXRob2R7X19nZXRpdGVtX18oKX0sIGFuZCBcY29kZXt4fSBpcyBhbiBpbnN0YW5jZSBvZgotdGhpcyBjbGFzcywgdGhlbiBcY29kZXt4W2ldfSBpcyBlcXVpdmFsZW50XGZvb3Rub3Rle1RoaXMsIGFuZCBvdGhlcgotc3RhdGVtZW50cywgYXJlIG9ubHkgcm91Z2hseSB0cnVlIGZvciBpbnN0YW5jZXMgb2YgbmV3LXN0eWxlCi1jbGFzc2VzLn0gdG8KLVxjb2Rle3guX19nZXRpdGVtX18oaSl9LiAgRXhjZXB0IHdoZXJlIG1lbnRpb25lZCwgYXR0ZW1wdHMgdG8gZXhlY3V0ZQotYW4gb3BlcmF0aW9uIHJhaXNlIGFuIGV4Y2VwdGlvbiB3aGVuIG5vIGFwcHJvcHJpYXRlIG1ldGhvZCBpcyBkZWZpbmVkLgotXHdpdGhzdWJpdGVteyhtYXBwaW5nIG9iamVjdCBtZXRob2QpfXtcdHRpbmRleHtfX2dldGl0ZW1fXygpfX0KLQotV2hlbiBpbXBsZW1lbnRpbmcgYSBjbGFzcyB0aGF0IGVtdWxhdGVzIGFueSBidWlsdC1pbiB0eXBlLCBpdCBpcwotaW1wb3J0YW50IHRoYXQgdGhlIGVtdWxhdGlvbiBvbmx5IGJlIGltcGxlbWVudGVkIHRvIHRoZSBkZWdyZWUgdGhhdCBpdAotbWFrZXMgc2Vuc2UgZm9yIHRoZSBvYmplY3QgYmVpbmcgbW9kZWxsZWQuICBGb3IgZXhhbXBsZSwgc29tZQotc2VxdWVuY2VzIG1heSB3b3JrIHdlbGwgd2l0aCByZXRyaWV2YWwgb2YgaW5kaXZpZHVhbCBlbGVtZW50cywgYnV0Ci1leHRyYWN0aW5nIGEgc2xpY2UgbWF5IG5vdCBtYWtlIHNlbnNlLiAgKE9uZSBleGFtcGxlIG9mIHRoaXMgaXMgdGhlCi1cY2xhc3N7Tm9kZUxpc3R9IGludGVyZmFjZSBpbiB0aGUgVzNDJ3MgRG9jdW1lbnQgT2JqZWN0IE1vZGVsLikKLQotCi1cc3Vic2VjdGlvbntCYXNpYyBjdXN0b21pemF0aW9uXGxhYmVse2N1c3RvbWl6YXRpb259fQotCi1cYmVnaW57bWV0aG9kZGVzY31bb2JqZWN0XXtfX25ld19ffXtjbHNcb3B0aW9uYWx7LCBcbW9yZWFyZ3N9fQotQ2FsbGVkIHRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBjbGFzcyBcdmFye2Nsc30uICBcbWV0aG9ke19fbmV3X18oKX0KLWlzIGEgc3RhdGljIG1ldGhvZCAoc3BlY2lhbC1jYXNlZCBzbyB5b3UgbmVlZCBub3QgZGVjbGFyZSBpdCBhcyBzdWNoKQotdGhhdCB0YWtlcyB0aGUgY2xhc3Mgb2Ygd2hpY2ggYW4gaW5zdGFuY2Ugd2FzIHJlcXVlc3RlZCBhcyBpdHMgZmlyc3QKLWFyZ3VtZW50LiAgVGhlIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHRob3NlIHBhc3NlZCB0byB0aGUgb2JqZWN0Ci1jb25zdHJ1Y3RvciBleHByZXNzaW9uICh0aGUgY2FsbCB0byB0aGUgY2xhc3MpLiAgVGhlIHJldHVybiB2YWx1ZSBvZgotXG1ldGhvZHtfX25ld19fKCl9IHNob3VsZCBiZSB0aGUgbmV3IG9iamVjdCBpbnN0YW5jZSAodXN1YWxseSBhbgotaW5zdGFuY2Ugb2YgXHZhcntjbHN9KS4KLQotVHlwaWNhbCBpbXBsZW1lbnRhdGlvbnMgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjbGFzcyBieSBpbnZva2luZwotdGhlIHN1cGVyY2xhc3MncyBcbWV0aG9ke19fbmV3X18oKX0gbWV0aG9kIHVzaW5nCi1cc2FtcHtzdXBlcihcdmFye2N1cnJlbnRjbGFzc30sIFx2YXJ7Y2xzfSkuX19uZXdfXyhcdmFye2Nsc31bLCAuLi5dKX0KLXdpdGggYXBwcm9wcmlhdGUgYXJndW1lbnRzIGFuZCB0aGVuIG1vZGlmeWluZyB0aGUgbmV3bHktY3JlYXRlZCBpbnN0YW5jZQotYXMgbmVjZXNzYXJ5IGJlZm9yZSByZXR1cm5pbmcgaXQuCi0KLUlmIFxtZXRob2R7X19uZXdfXygpfSByZXR1cm5zIGFuIGluc3RhbmNlIG9mIFx2YXJ7Y2xzfSwgdGhlbiB0aGUgbmV3Ci1pbnN0YW5jZSdzIFxtZXRob2R7X19pbml0X18oKX0gbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBsaWtlCi1cc2FtcHtfX2luaXRfXyhcdmFye3NlbGZ9WywgLi4uXSl9LCB3aGVyZSBcdmFye3NlbGZ9IGlzIHRoZSBuZXcgaW5zdGFuY2UKLWFuZCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgd2VyZSBwYXNzZWQgdG8KLVxtZXRob2R7X19uZXdfXygpfS4KLQotSWYgXG1ldGhvZHtfX25ld19fKCl9IGRvZXMgbm90IHJldHVybiBhbiBpbnN0YW5jZSBvZiBcdmFye2Nsc30sIHRoZW4gdGhlCi1uZXcgaW5zdGFuY2UncyBcbWV0aG9ke19faW5pdF9fKCl9IG1ldGhvZCB3aWxsIG5vdCBiZSBpbnZva2VkLgotCi1cbWV0aG9ke19fbmV3X18oKX0gaXMgaW50ZW5kZWQgbWFpbmx5IHRvIGFsbG93IHN1YmNsYXNzZXMgb2YKLWltbXV0YWJsZSB0eXBlcyAobGlrZSBpbnQsIHN0ciwgb3IgdHVwbGUpIHRvIGN1c3RvbWl6ZSBpbnN0YW5jZQotY3JlYXRpb24uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtvYmplY3Rde19faW5pdF9ffXtzZWxmXG9wdGlvbmFseywgXG1vcmVhcmdzfX0KLUNhbGxlZFxpbmRleGlpe2NsYXNzfXtjb25zdHJ1Y3Rvcn0gd2hlbiB0aGUgaW5zdGFuY2UgaXMgY3JlYXRlZC4gIFRoZQotYXJndW1lbnRzIGFyZSB0aG9zZSBwYXNzZWQgdG8gdGhlIGNsYXNzIGNvbnN0cnVjdG9yIGV4cHJlc3Npb24uICBJZiBhCi1iYXNlIGNsYXNzIGhhcyBhbiBcbWV0aG9ke19faW5pdF9fKCl9IG1ldGhvZCwgdGhlIGRlcml2ZWQgY2xhc3MncwotXG1ldGhvZHtfX2luaXRfXygpfSBtZXRob2QsIGlmIGFueSwgbXVzdCBleHBsaWNpdGx5IGNhbGwgaXQgdG8gZW5zdXJlIHByb3BlcgotaW5pdGlhbGl6YXRpb24gb2YgdGhlIGJhc2UgY2xhc3MgcGFydCBvZiB0aGUgaW5zdGFuY2U7IGZvciBleGFtcGxlOgotXHNhbXB7QmFzZUNsYXNzLl9faW5pdF9fKFx2YXJ7c2VsZn0sIFtcdmFye2FyZ3N9Li4uXSl9LiAgQXMgYSBzcGVjaWFsCi1jb25zdHJhaW50IG9uIGNvbnN0cnVjdG9ycywgbm8gdmFsdWUgbWF5IGJlIHJldHVybmVkOyBkb2luZyBzbyB3aWxsCi1jYXVzZSBhIFxleGNlcHRpb257VHlwZUVycm9yfSB0byBiZSByYWlzZWQgYXQgcnVudGltZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cYmVnaW57bWV0aG9kZGVzY31bb2JqZWN0XXtfX2RlbF9ffXtzZWxmfQotQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzIGFib3V0IHRvIGJlIGRlc3Ryb3llZC4gIFRoaXMgaXMgYWxzbwotY2FsbGVkIGEgZGVzdHJ1Y3RvclxpbmRleHtkZXN0cnVjdG9yfS4gIElmIGEgYmFzZSBjbGFzcwotaGFzIGEgXG1ldGhvZHtfX2RlbF9fKCl9IG1ldGhvZCwgdGhlIGRlcml2ZWQgY2xhc3MncyBcbWV0aG9ke19fZGVsX18oKX0KLW1ldGhvZCwgaWYgYW55LAotbXVzdCBleHBsaWNpdGx5IGNhbGwgaXQgdG8gZW5zdXJlIHByb3BlciBkZWxldGlvbiBvZiB0aGUgYmFzZSBjbGFzcwotcGFydCBvZiB0aGUgaW5zdGFuY2UuICBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgKHRob3VnaCBub3QgcmVjb21tZW5kZWQhKQotZm9yIHRoZSBcbWV0aG9ke19fZGVsX18oKX0KLW1ldGhvZCB0byBwb3N0cG9uZSBkZXN0cnVjdGlvbiBvZiB0aGUgaW5zdGFuY2UgYnkgY3JlYXRpbmcgYSBuZXcKLXJlZmVyZW5jZSB0byBpdC4gIEl0IG1heSB0aGVuIGJlIGNhbGxlZCBhdCBhIGxhdGVyIHRpbWUgd2hlbiB0aGlzIG5ldwotcmVmZXJlbmNlIGlzIGRlbGV0ZWQuICBJdCBpcyBub3QgZ3VhcmFudGVlZCB0aGF0Ci1cbWV0aG9ke19fZGVsX18oKX0gbWV0aG9kcyBhcmUgY2FsbGVkIGZvciBvYmplY3RzIHRoYXQgc3RpbGwgZXhpc3Qgd2hlbgotdGhlIGludGVycHJldGVyIGV4aXRzLgotXHN0aW5kZXh7ZGVsfQotCi1cYmVnaW57bm90aWNlfQotXHNhbXB7ZGVsIHh9IGRvZXNuJ3QgZGlyZWN0bHkgY2FsbAotXGNvZGV7eC5fX2RlbF9fKCl9IC0tLSB0aGUgZm9ybWVyIGRlY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBmb3IKLVxjb2Rle3h9IGJ5IG9uZSwgYW5kIHRoZSBsYXR0ZXIgaXMgb25seSBjYWxsZWQgd2hlbiBcY29kZXt4fSdzIHJlZmVyZW5jZQotY291bnQgcmVhY2hlcyB6ZXJvLiAgU29tZSBjb21tb24gc2l0dWF0aW9ucyB0aGF0IG1heSBwcmV2ZW50IHRoZQotcmVmZXJlbmNlIGNvdW50IG9mIGFuIG9iamVjdCBmcm9tIGdvaW5nIHRvIHplcm8gaW5jbHVkZTogY2lyY3VsYXIKLXJlZmVyZW5jZXMgYmV0d2VlbiBvYmplY3RzIChlLmcuLCBhIGRvdWJseS1saW5rZWQgbGlzdCBvciBhIHRyZWUgZGF0YQotc3RydWN0dXJlIHdpdGggcGFyZW50IGFuZCBjaGlsZCBwb2ludGVycyk7IGEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QKLW9uIHRoZSBzdGFjayBmcmFtZSBvZiBhIGZ1bmN0aW9uIHRoYXQgY2F1Z2h0IGFuIGV4Y2VwdGlvbiAodGhlCi10cmFjZWJhY2sgc3RvcmVkIGluIFxjb2Rle3N5cy5leGNfaW5mbygpWzJdfSBrZWVwcyB0aGUgc3RhY2sgZnJhbWUKLWFsaXZlKTsgb3IgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBvbiB0aGUgc3RhY2sgZnJhbWUgdGhhdCByYWlzZWQgYW4KLXVuaGFuZGxlZCBleGNlcHRpb24gaW4gaW50ZXJhY3RpdmUgbW9kZSAodGhlIHRyYWNlYmFjayBzdG9yZWQgaW4KLVxjb2Rle3N5cy5sYXN0X3RyYWNlYmFja30ga2VlcHMgdGhlIHN0YWNrIGZyYW1lIGFsaXZlKS4gIFRoZSBmaXJzdAotc2l0dWF0aW9uIGNhbiBvbmx5IGJlIHJlbWVkaWVkIGJ5IGV4cGxpY2l0bHkgYnJlYWtpbmcgdGhlIGN5Y2xlczsgdGhlCi1sYXR0ZXIgdHdvIHNpdHVhdGlvbnMgY2FuIGJlIHJlc29sdmVkIGJ5IHN0b3JpbmcgXGNvZGV7Tm9uZX0gaW4KLVxjb2Rle3N5cy5sYXN0X3RyYWNlYmFja30uICBDaXJjdWxhcgotcmVmZXJlbmNlcyB3aGljaCBhcmUgZ2FyYmFnZSBhcmUgZGV0ZWN0ZWQgd2hlbiB0aGUgb3B0aW9uIGN5Y2xlCi1kZXRlY3RvciBpcyBlbmFibGVkIChpdCdzIG9uIGJ5IGRlZmF1bHQpLCBidXQgY2FuIG9ubHkgYmUgY2xlYW5lZCB1cAotaWYgdGhlcmUgYXJlIG5vIFB5dGhvbi1sZXZlbCBcbWV0aG9ke19fZGVsX18oKX0gbWV0aG9kcyBpbnZvbHZlZC4KLVJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgXHVsaW5re1xtb2R1bGV7Z2N9Ci1tb2R1bGV9ey4uL2xpYi9tb2R1bGUtZ2MuaHRtbH0gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaG93Ci1cbWV0aG9ke19fZGVsX18oKX0gbWV0aG9kcyBhcmUgaGFuZGxlZCBieSB0aGUgY3ljbGUgZGV0ZWN0b3IsCi1wYXJ0aWN1bGFybHkgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBcY29kZXtnYXJiYWdlfSB2YWx1ZS4KLVxlbmR7bm90aWNlfQotCi1cYmVnaW57bm90aWNlfVt3YXJuaW5nXQotRHVlIHRvIHRoZSBwcmVjYXJpb3VzIGNpcmN1bXN0YW5jZXMgdW5kZXIgd2hpY2gKLVxtZXRob2R7X19kZWxfXygpfSBtZXRob2RzIGFyZSBpbnZva2VkLCBleGNlcHRpb25zIHRoYXQgb2NjdXIgZHVyaW5nIHRoZWlyCi1leGVjdXRpb24gYXJlIGlnbm9yZWQsIGFuZCBhIHdhcm5pbmcgaXMgcHJpbnRlZCB0byBcY29kZXtzeXMuc3RkZXJyfQotaW5zdGVhZC4gIEFsc28sIHdoZW4gXG1ldGhvZHtfX2RlbF9fKCl9IGlzIGludm9rZWQgaW4gcmVzcG9uc2UgdG8gYSBtb2R1bGUKLWJlaW5nIGRlbGV0ZWQgKGUuZy4sIHdoZW4gZXhlY3V0aW9uIG9mIHRoZSBwcm9ncmFtIGlzIGRvbmUpLCBvdGhlcgotZ2xvYmFscyByZWZlcmVuY2VkIGJ5IHRoZSBcbWV0aG9ke19fZGVsX18oKX0gbWV0aG9kIG1heSBhbHJlYWR5IGhhdmUgYmVlbgotZGVsZXRlZC4gIEZvciB0aGlzIHJlYXNvbiwgXG1ldGhvZHtfX2RlbF9fKCl9IG1ldGhvZHMgc2hvdWxkIGRvIHRoZQotYWJzb2x1dGUgbWluaW11bSBuZWVkZWQgdG8gbWFpbnRhaW4gZXh0ZXJuYWwgaW52YXJpYW50cy4gIFN0YXJ0aW5nIHdpdGgKLXZlcnNpb24gMS41LCBQeXRob24gZ3VhcmFudGVlcyB0aGF0IGdsb2JhbHMgd2hvc2UgbmFtZSBiZWdpbnMgd2l0aCBhIHNpbmdsZQotdW5kZXJzY29yZSBhcmUgZGVsZXRlZCBmcm9tIHRoZWlyIG1vZHVsZSBiZWZvcmUgb3RoZXIgZ2xvYmFscyBhcmUgZGVsZXRlZDsKLWlmIG5vIG90aGVyIHJlZmVyZW5jZXMgdG8gc3VjaCBnbG9iYWxzIGV4aXN0LCB0aGlzIG1heSBoZWxwIGluIGFzc3VyaW5nIHRoYXQKLWltcG9ydGVkIG1vZHVsZXMgYXJlIHN0aWxsIGF2YWlsYWJsZSBhdCB0aGUgdGltZSB3aGVuIHRoZQotXG1ldGhvZHtfX2RlbF9fKCl9IG1ldGhvZCBpcyBjYWxsZWQuCi1cZW5ke25vdGljZX0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W29iamVjdF17X19yZXByX199e3NlbGZ9Ci1DYWxsZWQgYnkgdGhlIFxmdW5jdGlvbntyZXByKCl9XGJpZnVuY2luZGV4e3JlcHJ9IGJ1aWx0LWluIGZ1bmN0aW9uCi1hbmQgYnkgc3RyaW5nIGNvbnZlcnNpb25zIChyZXZlcnNlIHF1b3RlcykgdG8gY29tcHV0ZSB0aGUgYGBvZmZpY2lhbCcnCi1zdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LiAgSWYgYXQgYWxsIHBvc3NpYmxlLCB0aGlzIHNob3VsZAotbG9vayBsaWtlIGEgdmFsaWQgUHl0aG9uIGV4cHJlc3Npb24gdGhhdCBjb3VsZCBiZSB1c2VkIHRvIHJlY3JlYXRlIGFuCi1vYmplY3Qgd2l0aCB0aGUgc2FtZSB2YWx1ZSAoZ2l2ZW4gYW4gYXBwcm9wcmlhdGUgZW52aXJvbm1lbnQpLiAgSWYKLXRoaXMgaXMgbm90IHBvc3NpYmxlLCBhIHN0cmluZyBvZiB0aGUgZm9ybSBcc2FtcHs8XHZhcnsuLi5zb21lIHVzZWZ1bAotZGVzY3JpcHRpb24uLi59Pn0gc2hvdWxkIGJlIHJldHVybmVkLiAgVGhlIHJldHVybiB2YWx1ZSBtdXN0IGJlIGEKLXN0cmluZyBvYmplY3QuCi1JZiBhIGNsYXNzIGRlZmluZXMgXG1ldGhvZHtfX3JlcHJfXygpfSBidXQgbm90IFxtZXRob2R7X19zdHJfXygpfSwKLXRoZW4gXG1ldGhvZHtfX3JlcHJfXygpfSBpcyBhbHNvIHVzZWQgd2hlbiBhbiBgYGluZm9ybWFsJycgc3RyaW5nCi1yZXByZXNlbnRhdGlvbiBvZiBpbnN0YW5jZXMgb2YgdGhhdCBjbGFzcyBpcyByZXF1aXJlZC4KLQotVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgZGVidWdnaW5nLCBzbyBpdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGUKLXJlcHJlc2VudGF0aW9uIGlzIGluZm9ybWF0aW9uLXJpY2ggYW5kIHVuYW1iaWd1b3VzLgotXGluZGV4aWl7c3RyaW5nfXtjb252ZXJzaW9ufQotXGluZGV4aWl7cmV2ZXJzZX17cXVvdGVzfQotXGluZGV4aWl7YmFja3dhcmR9e3F1b3Rlc30KLVxpbmRleHtiYWNrLXF1b3Rlc30KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W29iamVjdF17X19zdHJfX317c2VsZn0KLUNhbGxlZCBieSB0aGUgXGZ1bmN0aW9ue3N0cigpfVxiaWZ1bmNpbmRleHtzdHJ9IGJ1aWx0LWluIGZ1bmN0aW9uIGFuZAotYnkgdGhlIFxrZXl3b3Jke3ByaW50fVxzdGluZGV4e3ByaW50fSBzdGF0ZW1lbnQgdG8gY29tcHV0ZSB0aGUKLWBgaW5mb3JtYWwnJyBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LiAgVGhpcyBkaWZmZXJzIGZyb20KLVxtZXRob2R7X19yZXByX18oKX0gaW4gdGhhdCBpdCBkb2VzIG5vdCBoYXZlIHRvIGJlIGEgdmFsaWQgUHl0aG9uCi1leHByZXNzaW9uOiBhIG1vcmUgY29udmVuaWVudCBvciBjb25jaXNlIHJlcHJlc2VudGF0aW9uIG1heSBiZSB1c2VkCi1pbnN0ZWFkLiAgVGhlIHJldHVybiB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nIG9iamVjdC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W29iamVjdF17X19sdF9ffXtzZWxmLCBvdGhlcn0KLVxtZXRob2RsaW5lW29iamVjdF17X19sZV9ffXtzZWxmLCBvdGhlcn0KLVxtZXRob2RsaW5lW29iamVjdF17X19lcV9ffXtzZWxmLCBvdGhlcn0KLVxtZXRob2RsaW5lW29iamVjdF17X19uZV9ffXtzZWxmLCBvdGhlcn0KLVxtZXRob2RsaW5lW29iamVjdF17X19ndF9ffXtzZWxmLCBvdGhlcn0KLVxtZXRob2RsaW5lW29iamVjdF17X19nZV9ffXtzZWxmLCBvdGhlcn0KLVx2ZXJzaW9uYWRkZWR7Mi4xfQotVGhlc2UgYXJlIHRoZSBzby1jYWxsZWQgYGByaWNoIGNvbXBhcmlzb24nJyBtZXRob2RzLCBhbmQgYXJlIGNhbGxlZAotZm9yIGNvbXBhcmlzb24gb3BlcmF0b3JzIGluIHByZWZlcmVuY2UgdG8gXG1ldGhvZHtfX2NtcF9fKCl9IGJlbG93LgotVGhlIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gb3BlcmF0b3Igc3ltYm9scyBhbmQgbWV0aG9kIG5hbWVzIGlzIGFzCi1mb2xsb3dzOgotXGNvZGV7XHZhcnt4fTxcdmFye3l9fSBjYWxscyBcY29kZXtcdmFye3h9Ll9fbHRfXyhcdmFye3l9KX0sCi1cY29kZXtcdmFye3h9PD1cdmFye3l9fSBjYWxscyBcY29kZXtcdmFye3h9Ll9fbGVfXyhcdmFye3l9KX0sCi1cY29kZXtcdmFye3h9PT1cdmFye3l9fSBjYWxscyBcY29kZXtcdmFye3h9Ll9fZXFfXyhcdmFye3l9KX0sCi1cY29kZXtcdmFye3h9IT1cdmFye3l9fSBjYWxscyBcY29kZXtcdmFye3h9Ll9fbmVfXyhcdmFye3l9KX0sCi1cY29kZXtcdmFye3h9Plx2YXJ7eX19IGNhbGxzIFxjb2Rle1x2YXJ7eH0uX19ndF9fKFx2YXJ7eX0pfSwgYW5kCi1cY29kZXtcdmFye3h9Pj1cdmFye3l9fSBjYWxscyBcY29kZXtcdmFye3h9Ll9fZ2VfXyhcdmFye3l9KX0uCi0KLUEgcmljaCBjb21wYXJpc29uIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBzaW5nbGV0b24gXGNvZGV7Tm90SW1wbGVtZW50ZWR9IGlmIGl0Ci1kb2VzIG5vdCBpbXBsZW1lbnQgdGhlIG9wZXJhdGlvbiBmb3IgYSBnaXZlbiBwYWlyIG9mIGFyZ3VtZW50cy4KLUJ5IGNvbnZlbnRpb24sIFxjb2Rle0ZhbHNlfSBhbmQgXGNvZGV7VHJ1ZX0gYXJlIHJldHVybmVkIGZvciBhIHN1Y2Nlc3NmdWwKLWNvbXBhcmlzb24uIEhvd2V2ZXIsIHRoZXNlIG1ldGhvZHMgY2FuIHJldHVybiBhbnkgdmFsdWUsIHNvIGlmIHRoZQotY29tcGFyaXNvbiBvcGVyYXRvciBpcyB1c2VkIGluIGEgQm9vbGVhbiBjb250ZXh0IChlLmcuLCBpbiB0aGUgY29uZGl0aW9uCi1vZiBhbiBcY29kZXtpZn0gc3RhdGVtZW50KSwgUHl0aG9uIHdpbGwgY2FsbCBcZnVuY3Rpb257Ym9vbCgpfSBvbiB0aGUKLXZhbHVlIHRvIGRldGVybWluZSBpZiB0aGUgcmVzdWx0IGlzIHRydWUgb3IgZmFsc2UuCi0KLVRoZXJlIGFyZSBubyBpbXBsaWVkIHJlbGF0aW9uc2hpcHMgYW1vbmcgdGhlIGNvbXBhcmlzb24gb3BlcmF0b3JzLgotVGhlIHRydXRoIG9mIFxjb2Rle1x2YXJ7eH09PVx2YXJ7eX19IGRvZXMgbm90IGltcGx5IHRoYXQgXGNvZGV7XHZhcnt4fSE9XHZhcnt5fX0KLWlzIGZhbHNlLiAgQWNjb3JkaW5nbHksIHdoZW4gZGVmaW5pbmcgXG1ldGhvZHtfX2VxX18oKX0sIG9uZSBzaG91bGQgYWxzbwotZGVmaW5lIFxtZXRob2R7X19uZV9fKCl9IHNvIHRoYXQgdGhlIG9wZXJhdG9ycyB3aWxsIGJlaGF2ZSBhcyBleHBlY3RlZC4KLQotVGhlcmUgYXJlIG5vIHJlZmxlY3RlZCAoc3dhcHBlZC1hcmd1bWVudCkgdmVyc2lvbnMgb2YgdGhlc2UgbWV0aG9kcwotKHRvIGJlIHVzZWQgd2hlbiB0aGUgbGVmdCBhcmd1bWVudCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcGVyYXRpb24gYnV0Ci10aGUgcmlnaHQgYXJndW1lbnQgZG9lcyk7IHJhdGhlciwgXG1ldGhvZHtfX2x0X18oKX0gYW5kCi1cbWV0aG9ke19fZ3RfXygpfSBhcmUgZWFjaCBvdGhlcidzIHJlZmxlY3Rpb24sIFxtZXRob2R7X19sZV9fKCl9IGFuZAotXG1ldGhvZHtfX2dlX18oKX0gYXJlIGVhY2ggb3RoZXIncyByZWZsZWN0aW9uLCBhbmQgXG1ldGhvZHtfX2VxX18oKX0KLWFuZCBcbWV0aG9ke19fbmVfXygpfSBhcmUgdGhlaXIgb3duIHJlZmxlY3Rpb24uCi0KLUFyZ3VtZW50cyB0byByaWNoIGNvbXBhcmlzb24gbWV0aG9kcyBhcmUgbmV2ZXIgY29lcmNlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W29iamVjdF17X19jbXBfX317c2VsZiwgb3RoZXJ9Ci1DYWxsZWQgYnkgY29tcGFyaXNvbiBvcGVyYXRpb25zIGlmIHJpY2ggY29tcGFyaXNvbiAoc2VlIGFib3ZlKSBpcyBub3QKLWRlZmluZWQuICBTaG91bGQgcmV0dXJuIGEgbmVnYXRpdmUgaW50ZWdlciBpZiBcY29kZXtzZWxmIDwgb3RoZXJ9LAotemVybyBpZiBcY29kZXtzZWxmID09IG90aGVyfSwgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIFxjb2Rle3NlbGYgPgotb3RoZXJ9LiAgSWYgbm8gXG1ldGhvZHtfX2NtcF9fKCl9LCBcbWV0aG9ke19fZXFfXygpfSBvcgotXG1ldGhvZHtfX25lX18oKX0gb3BlcmF0aW9uIGlzIGRlZmluZWQsIGNsYXNzIGluc3RhbmNlcyBhcmUgY29tcGFyZWQKLWJ5IG9iamVjdCBpZGVudGl0eSAoYGBhZGRyZXNzJycpLiAgU2VlIGFsc28gdGhlIGRlc2NyaXB0aW9uIG9mCi1cbWV0aG9ke19faGFzaF9fKCl9IGZvciBzb21lIGltcG9ydGFudCBub3RlcyBvbiBjcmVhdGluZyBvYmplY3RzIHdoaWNoCi1zdXBwb3J0IGN1c3RvbSBjb21wYXJpc29uIG9wZXJhdGlvbnMgYW5kIGFyZSB1c2FibGUgYXMgZGljdGlvbmFyeQota2V5cy4KLShOb3RlOiB0aGUgcmVzdHJpY3Rpb24gdGhhdCBleGNlcHRpb25zIGFyZSBub3QgcHJvcGFnYXRlZCBieQotXG1ldGhvZHtfX2NtcF9fKCl9IGhhcyBiZWVuIHJlbW92ZWQgc2luY2UgUHl0aG9uIDEuNS4pCi1cYmlmdW5jaW5kZXh7Y21wfQotXGluZGV4e2NvbXBhcmlzb25zfQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bb2JqZWN0XXtfX3JjbXBfX317c2VsZiwgb3RoZXJ9Ci0gIFx2ZXJzaW9uY2hhbmdlZFtObyBsb25nZXIgc3VwcG9ydGVkXXsyLjF9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtvYmplY3Rde19faGFzaF9ffXtzZWxmfQotQ2FsbGVkIGZvciB0aGUga2V5IG9iamVjdCBmb3IgZGljdGlvbmFyeSBcb2JpbmRleHtkaWN0aW9uYXJ5fQotb3BlcmF0aW9ucywgYW5kIGJ5IHRoZSBidWlsdC1pbiBmdW5jdGlvbgotXGZ1bmN0aW9ue2hhc2goKX1cYmlmdW5jaW5kZXh7aGFzaH0uICBTaG91bGQgcmV0dXJuIGEgMzItYml0IGludGVnZXIKLXVzYWJsZSBhcyBhIGhhc2ggdmFsdWUKLWZvciBkaWN0aW9uYXJ5IG9wZXJhdGlvbnMuICBUaGUgb25seSByZXF1aXJlZCBwcm9wZXJ0eSBpcyB0aGF0IG9iamVjdHMKLXdoaWNoIGNvbXBhcmUgZXF1YWwgaGF2ZSB0aGUgc2FtZSBoYXNoIHZhbHVlOyBpdCBpcyBhZHZpc2VkIHRvIHNvbWVob3cKLW1peCB0b2dldGhlciAoZS5nLiwgdXNpbmcgZXhjbHVzaXZlIG9yKSB0aGUgaGFzaCB2YWx1ZXMgZm9yIHRoZQotY29tcG9uZW50cyBvZiB0aGUgb2JqZWN0IHRoYXQgYWxzbyBwbGF5IGEgcGFydCBpbiBjb21wYXJpc29uIG9mCi1vYmplY3RzLiAgSWYgYSBjbGFzcyBkb2VzIG5vdCBkZWZpbmUgYSBcbWV0aG9ke19fY21wX18oKX0gbWV0aG9kIGl0IHNob3VsZAotbm90IGRlZmluZSBhIFxtZXRob2R7X19oYXNoX18oKX0gb3BlcmF0aW9uIGVpdGhlcjsgaWYgaXQgZGVmaW5lcwotXG1ldGhvZHtfX2NtcF9fKCl9IG9yIFxtZXRob2R7X19lcV9fKCl9IGJ1dCBub3QgXG1ldGhvZHtfX2hhc2hfXygpfSwKLWl0cyBpbnN0YW5jZXMgd2lsbCBub3QgYmUgdXNhYmxlIGFzIGRpY3Rpb25hcnkga2V5cy4gIElmIGEgY2xhc3MKLWRlZmluZXMgbXV0YWJsZSBvYmplY3RzIGFuZCBpbXBsZW1lbnRzIGEgXG1ldGhvZHtfX2NtcF9fKCl9IG9yCi1cbWV0aG9ke19fZXFfXygpfSBtZXRob2QsIGl0IHNob3VsZCBub3QgaW1wbGVtZW50IFxtZXRob2R7X19oYXNoX18oKX0sCi1zaW5jZSB0aGUgZGljdGlvbmFyeSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aGF0IGEga2V5J3MgaGFzaCB2YWx1ZQotaXMgaW1tdXRhYmxlIChpZiB0aGUgb2JqZWN0J3MgaGFzaCB2YWx1ZSBjaGFuZ2VzLCBpdCB3aWxsIGJlIGluIHRoZQotd3JvbmcgaGFzaCBidWNrZXQpLgotCi1cdmVyc2lvbmNoYW5nZWRbXG1ldGhvZHtfX2hhc2hfXygpfSBtYXkgbm93IGFsc28gcmV0dXJuIGEgbG9uZwotaW50ZWdlciBvYmplY3Q7IHRoZSAzMi1iaXQgaW50ZWdlciBpcyB0aGVuIGRlcml2ZWQgZnJvbSB0aGUgaGFzaAotb2YgdGhhdCBvYmplY3RdezIuNX0KLQotXHdpdGhzdWJpdGVteyhvYmplY3QgbWV0aG9kKX17XHR0aW5kZXh7X19jbXBfXygpfX0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W29iamVjdF17X19ib29sX199e3NlbGZ9Ci1DYWxsZWQgdG8gaW1wbGVtZW50IHRydXRoIHZhbHVlIHRlc3RpbmcsIGFuZCB0aGUgYnVpbHQtaW4gb3BlcmF0aW9uCi1cY29kZXtib29sKCl9OyBzaG91bGQgcmV0dXJuIFxjb2Rle0ZhbHNlfSBvciBcY29kZXtUcnVlfS4KLVdoZW4gdGhpcyBtZXRob2QgaXMgbm90IGRlZmluZWQsIFxtZXRob2R7X19sZW5fXygpfSBpcwotY2FsbGVkLCBpZiBpdCBpcyBkZWZpbmVkIChzZWUgYmVsb3cpIGFuZCBcY29kZXtUcnVlfSBpcyByZXR1cm5lZCB3aGVuCi10aGUgbGVuZ3RoIGlzIG5vdCB6ZXJvLiAgSWYgYSBjbGFzcyBkZWZpbmVzIG5laXRoZXIKLVxtZXRob2R7X19sZW5fXygpfSBub3IgXG1ldGhvZHtfX2Jvb2xfXygpfSwgYWxsIGl0cyBpbnN0YW5jZXMgYXJlCi1jb25zaWRlcmVkIHRydWUuCi1cd2l0aHN1Yml0ZW17KG1hcHBpbmcgb2JqZWN0IG1ldGhvZCl9e1x0dGluZGV4e19fbGVuX18oKX19Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtvYmplY3Rde19fdW5pY29kZV9ffXtzZWxmfQotQ2FsbGVkIHRvIGltcGxlbWVudCBcZnVuY3Rpb257dW5pY29kZSgpfVxiaWZ1bmNpbmRleHt1bmljb2RlfSBidWlsdGluOwotc2hvdWxkIHJldHVybiBhIFVuaWNvZGUgb2JqZWN0LiBXaGVuIHRoaXMgbWV0aG9kIGlzIG5vdCBkZWZpbmVkLCBzdHJpbmcKLWNvbnZlcnNpb24gaXMgYXR0ZW1wdGVkLCBhbmQgdGhlIHJlc3VsdCBvZiBzdHJpbmcgY29udmVyc2lvbiBpcyBjb252ZXJ0ZWQKLXRvIFVuaWNvZGUgdXNpbmcgdGhlIHN5c3RlbSBkZWZhdWx0IGVuY29kaW5nLgotXGVuZHttZXRob2RkZXNjfQotCi0KLVxzdWJzZWN0aW9ue0N1c3RvbWl6aW5nIGF0dHJpYnV0ZSBhY2Nlc3NcbGFiZWx7YXR0cmlidXRlLWFjY2Vzc319Ci0KLVRoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgZGVmaW5lZCB0byBjdXN0b21pemUgdGhlIG1lYW5pbmcgb2YKLWF0dHJpYnV0ZSBhY2Nlc3MgKHVzZSBvZiwgYXNzaWdubWVudCB0bywgb3IgZGVsZXRpb24gb2YgXGNvZGV7eC5uYW1lfSkKLWZvciBjbGFzcyBpbnN0YW5jZXMuCi0KLVxiZWdpbnttZXRob2RkZXNjfVtvYmplY3Rde19fZ2V0YXR0cl9ffXtzZWxmLCBuYW1lfQotQ2FsbGVkIHdoZW4gYW4gYXR0cmlidXRlIGxvb2t1cCBoYXMgbm90IGZvdW5kIHRoZSBhdHRyaWJ1dGUgaW4gdGhlCi11c3VhbCBwbGFjZXMgKGkuZS4gaXQgaXMgbm90IGFuIGluc3RhbmNlIGF0dHJpYnV0ZSBub3IgaXMgaXQgZm91bmQgaW4KLXRoZSBjbGFzcyB0cmVlIGZvciBcY29kZXtzZWxmfSkuICBcY29kZXtuYW1lfSBpcyB0aGUgYXR0cmlidXRlIG5hbWUuCi1UaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSAoY29tcHV0ZWQpIGF0dHJpYnV0ZSB2YWx1ZSBvciByYWlzZSBhbgotXGV4Y2VwdGlvbntBdHRyaWJ1dGVFcnJvcn0gZXhjZXB0aW9uLgotCi1Ob3RlIHRoYXQgaWYgdGhlIGF0dHJpYnV0ZSBpcyBmb3VuZCB0aHJvdWdoIHRoZSBub3JtYWwgbWVjaGFuaXNtLAotXG1ldGhvZHtfX2dldGF0dHJfXygpfSBpcyBub3QgY2FsbGVkLiAgKFRoaXMgaXMgYW4gaW50ZW50aW9uYWwKLWFzeW1tZXRyeSBiZXR3ZWVuIFxtZXRob2R7X19nZXRhdHRyX18oKX0gYW5kIFxtZXRob2R7X19zZXRhdHRyX18oKX0uKQotVGhpcyBpcyBkb25lIGJvdGggZm9yIGVmZmljaWVuY3kgcmVhc29ucyBhbmQgYmVjYXVzZSBvdGhlcndpc2UKLVxtZXRob2R7X19zZXRhdHRyX18oKX0gd291bGQgaGF2ZSBubyB3YXkgdG8gYWNjZXNzIG90aGVyIGF0dHJpYnV0ZXMgb2YKLXRoZSBpbnN0YW5jZS4gIE5vdGUgdGhhdCBhdCBsZWFzdCBmb3IgaW5zdGFuY2UgdmFyaWFibGVzLCB5b3UgY2FuIGZha2UKLXRvdGFsIGNvbnRyb2wgYnkgbm90IGluc2VydGluZyBhbnkgdmFsdWVzIGluIHRoZSBpbnN0YW5jZSBhdHRyaWJ1dGUKLWRpY3Rpb25hcnkgKGJ1dCBpbnN0ZWFkIGluc2VydGluZyB0aGVtIGluIGFub3RoZXIgb2JqZWN0KS4gIFNlZSB0aGUKLVxtZXRob2R7X19nZXRhdHRyaWJ1dGVfXygpfSBtZXRob2QgYmVsb3cgZm9yIGEgd2F5IHRvIGFjdHVhbGx5IGdldAotdG90YWwgY29udHJvbCBpbiBuZXctc3R5bGUgY2xhc3Nlcy4KLVx3aXRoc3ViaXRlbXsob2JqZWN0IG1ldGhvZCl9e1x0dGluZGV4e19fc2V0YXR0cl9fKCl9fQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bb2JqZWN0XXtfX3NldGF0dHJfX317c2VsZiwgbmFtZSwgdmFsdWV9Ci1DYWxsZWQgd2hlbiBhbiBhdHRyaWJ1dGUgYXNzaWdubWVudCBpcyBhdHRlbXB0ZWQuICBUaGlzIGlzIGNhbGxlZAotaW5zdGVhZCBvZiB0aGUgbm9ybWFsIG1lY2hhbmlzbSAoaS5lLlwgc3RvcmUgdGhlIHZhbHVlIGluIHRoZSBpbnN0YW5jZQotZGljdGlvbmFyeSkuICBcdmFye25hbWV9IGlzIHRoZSBhdHRyaWJ1dGUgbmFtZSwgXHZhcnt2YWx1ZX0gaXMgdGhlCi12YWx1ZSB0byBiZSBhc3NpZ25lZCB0byBpdC4KLQotSWYgXG1ldGhvZHtfX3NldGF0dHJfXygpfSB3YW50cyB0byBhc3NpZ24gdG8gYW4gaW5zdGFuY2UgYXR0cmlidXRlLCBpdAotc2hvdWxkIG5vdCBzaW1wbHkgZXhlY3V0ZSBcc2FtcHtzZWxmLlx2YXJ7bmFtZX0gPSB2YWx1ZX0gLS0tIHRoaXMKLXdvdWxkIGNhdXNlIGEgcmVjdXJzaXZlIGNhbGwgdG8gaXRzZWxmLiAgSW5zdGVhZCwgaXQgc2hvdWxkIGluc2VydCB0aGUKLXZhbHVlIGluIHRoZSBkaWN0aW9uYXJ5IG9mIGluc3RhbmNlIGF0dHJpYnV0ZXMsIGUuZy4sCi1cc2FtcHtzZWxmLl9fZGljdF9fW1x2YXJ7bmFtZX1dID0gdmFsdWV9LiAgRm9yIG5ldy1zdHlsZSBjbGFzc2VzLAotcmF0aGVyIHRoYW4gYWNjZXNzaW5nIHRoZSBpbnN0YW5jZSBkaWN0aW9uYXJ5LCBpdCBzaG91bGQgY2FsbCB0aGUgYmFzZQotY2xhc3MgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSwgZm9yIGV4YW1wbGUsCi1cc2FtcHtvYmplY3QuX19zZXRhdHRyX18oc2VsZiwgbmFtZSwgdmFsdWUpfS4KLVx3aXRoc3ViaXRlbXsoaW5zdGFuY2UgYXR0cmlidXRlKX17XHR0aW5kZXh7X19kaWN0X199fQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bb2JqZWN0XXtfX2RlbGF0dHJfX317c2VsZiwgbmFtZX0KLUxpa2UgXG1ldGhvZHtfX3NldGF0dHJfXygpfSBidXQgZm9yIGF0dHJpYnV0ZSBkZWxldGlvbiBpbnN0ZWFkIG9mCi1hc3NpZ25tZW50LiAgVGhpcyBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCBpZiBcc2FtcHtkZWwKLW9iai5cdmFye25hbWV9fSBpcyBtZWFuaW5nZnVsIGZvciB0aGUgb2JqZWN0LgotXGVuZHttZXRob2RkZXNjfQotCi1cc3Vic3Vic2VjdGlvbntNb3JlIGF0dHJpYnV0ZSBhY2Nlc3MgZm9yIG5ldy1zdHlsZSBjbGFzc2VzIFxsYWJlbHtuZXctc3R5bGUtYXR0cmlidXRlLWFjY2Vzc319Ci0KLVRoZSBmb2xsb3dpbmcgbWV0aG9kcyBvbmx5IGFwcGx5IHRvIG5ldy1zdHlsZSBjbGFzc2VzLgotCi1cYmVnaW57bWV0aG9kZGVzY31bb2JqZWN0XXtfX2dldGF0dHJpYnV0ZV9ffXtzZWxmLCBuYW1lfQotQ2FsbGVkIHVuY29uZGl0aW9uYWxseSB0byBpbXBsZW1lbnQgYXR0cmlidXRlIGFjY2Vzc2VzIGZvciBpbnN0YW5jZXMKLW9mIHRoZSBjbGFzcy4gSWYgdGhlIGNsYXNzIGFsc28gZGVmaW5lcyBcbWV0aG9ke19fZ2V0YXR0cl9fKCl9LCB0aGUgbGF0dGVyCi13aWxsIG5vdCBiZSBjYWxsZWQgdW5sZXNzIFxtZXRob2R7X19nZXRhdHRyaWJ1dGVfXygpfSBlaXRoZXIgY2FsbHMgaXQKLWV4cGxpY2l0bHkgb3IgcmFpc2VzIGFuIFxleGNlcHRpb257QXR0cmlidXRlRXJyb3J9LgotVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgKGNvbXB1dGVkKSBhdHRyaWJ1dGUKLXZhbHVlIG9yIHJhaXNlIGFuIFxleGNlcHRpb257QXR0cmlidXRlRXJyb3J9IGV4Y2VwdGlvbi4KLUluIG9yZGVyIHRvIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbiBpbiB0aGlzIG1ldGhvZCwgaXRzCi1pbXBsZW1lbnRhdGlvbiBzaG91bGQgYWx3YXlzIGNhbGwgdGhlIGJhc2UgY2xhc3MgbWV0aG9kIHdpdGggdGhlIHNhbWUKLW5hbWUgdG8gYWNjZXNzIGFueSBhdHRyaWJ1dGVzIGl0IG5lZWRzLCBmb3IgZXhhbXBsZSwKLVxzYW1we29iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXHN1YnN1YnNlY3Rpb257SW1wbGVtZW50aW5nIERlc2NyaXB0b3JzIFxsYWJlbHtkZXNjcmlwdG9yc319Ci0KLVRoZSBmb2xsb3dpbmcgbWV0aG9kcyBvbmx5IGFwcGx5IHdoZW4gYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzCi1jb250YWluaW5nIHRoZSBtZXRob2QgKGEgc28tY2FsbGVkIFxlbXBoe2Rlc2NyaXB0b3J9IGNsYXNzKSBhcHBlYXJzIGluCi10aGUgY2xhc3MgZGljdGlvbmFyeSBvZiBhbm90aGVyIG5ldy1zdHlsZSBjbGFzcywga25vd24gYXMgdGhlCi1cZW1waHtvd25lcn0gY2xhc3MuIEluIHRoZSBleGFtcGxlcyBiZWxvdywgYGB0aGUgYXR0cmlidXRlJycgcmVmZXJzIHRvCi10aGUgYXR0cmlidXRlIHdob3NlIG5hbWUgaXMgdGhlIGtleSBvZiB0aGUgcHJvcGVydHkgaW4gdGhlIG93bmVyCi1jbGFzcycgXGNvZGV7X19kaWN0X199LiAgRGVzY3JpcHRvcnMgY2FuIG9ubHkgYmUgaW1wbGVtZW50ZWQgYXMKLW5ldy1zdHlsZSBjbGFzc2VzIHRoZW1zZWx2ZXMuCi0KLVxiZWdpbnttZXRob2RkZXNjfVtvYmplY3Rde19fZ2V0X199e3NlbGYsIGluc3RhbmNlLCBvd25lcn0KLUNhbGxlZCB0byBnZXQgdGhlIGF0dHJpYnV0ZSBvZiB0aGUgb3duZXIgY2xhc3MgKGNsYXNzIGF0dHJpYnV0ZSBhY2Nlc3MpCi1vciBvZiBhbiBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzIChpbnN0YW5jZSBhdHRyaWJ1dGUgYWNjZXNzKS4KLVx2YXJ7b3duZXJ9IGlzIGFsd2F5cyB0aGUgb3duZXIgY2xhc3MsIHdoaWxlIFx2YXJ7aW5zdGFuY2V9IGlzIHRoZQotaW5zdGFuY2UgdGhhdCB0aGUgYXR0cmlidXRlIHdhcyBhY2Nlc3NlZCB0aHJvdWdoLCBvciBcY29kZXtOb25lfSB3aGVuCi10aGUgYXR0cmlidXRlIGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlIFx2YXJ7b3duZXJ9LiAgVGhpcyBtZXRob2Qgc2hvdWxkCi1yZXR1cm4gdGhlIChjb21wdXRlZCkgYXR0cmlidXRlIHZhbHVlIG9yIHJhaXNlIGFuCi1cZXhjZXB0aW9ue0F0dHJpYnV0ZUVycm9yfSBleGNlcHRpb24uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtvYmplY3Rde19fc2V0X199e3NlbGYsIGluc3RhbmNlLCB2YWx1ZX0KLUNhbGxlZCB0byBzZXQgdGhlIGF0dHJpYnV0ZSBvbiBhbiBpbnN0YW5jZSBcdmFye2luc3RhbmNlfSBvZiB0aGUgb3duZXIKLWNsYXNzIHRvIGEgbmV3IHZhbHVlLCBcdmFye3ZhbHVlfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W29iamVjdF17X19kZWxldGVfX317c2VsZiwgaW5zdGFuY2V9Ci1DYWxsZWQgdG8gZGVsZXRlIHRoZSBhdHRyaWJ1dGUgb24gYW4gaW5zdGFuY2UgXHZhcntpbnN0YW5jZX0gb2YgdGhlCi1vd25lciBjbGFzcy4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cc3Vic3Vic2VjdGlvbntJbnZva2luZyBEZXNjcmlwdG9ycyBcbGFiZWx7ZGVzY3JpcHRvci1pbnZvY2F0aW9ufX0KLQotSW4gZ2VuZXJhbCwgYSBkZXNjcmlwdG9yIGlzIGFuIG9iamVjdCBhdHRyaWJ1dGUgd2l0aCBgYGJpbmRpbmcgYmVoYXZpb3InJywKLW9uZSB3aG9zZSBhdHRyaWJ1dGUgYWNjZXNzIGhhcyBiZWVuIG92ZXJyaWRkZW4gYnkgbWV0aG9kcyBpbiB0aGUgZGVzY3JpcHRvcgotcHJvdG9jb2w6ICBcbWV0aG9ke19fZ2V0X18oKX0sIFxtZXRob2R7X19zZXRfXygpfSwgYW5kIFxtZXRob2R7X19kZWxldGVfXygpfS4KLUlmIGFueSBvZiB0aG9zZSBtZXRob2RzIGFyZSBkZWZpbmVkIGZvciBhbiBvYmplY3QsIGl0IGlzIHNhaWQgdG8gYmUgYQotZGVzY3JpcHRvci4KLQotVGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIGF0dHJpYnV0ZSBhY2Nlc3MgaXMgdG8gZ2V0LCBzZXQsIG9yIGRlbGV0ZSB0aGUKLWF0dHJpYnV0ZSBmcm9tIGFuIG9iamVjdCdzIGRpY3Rpb25hcnkuIEZvciBpbnN0YW5jZSwgXGNvZGV7YS54fSBoYXMgYQotbG9va3VwIGNoYWluIHN0YXJ0aW5nIHdpdGggXGNvZGV7YS5fX2RpY3RfX1sneCddfSwgdGhlbgotXGNvZGV7dHlwZShhKS5fX2RpY3RfX1sneCddfSwgYW5kIGNvbnRpbnVpbmcKLXRocm91Z2ggdGhlIGJhc2UgY2xhc3NlcyBvZiBcY29kZXt0eXBlKGEpfSBleGNsdWRpbmcgbWV0YWNsYXNzZXMuCi0KLUhvd2V2ZXIsIGlmIHRoZSBsb29rZWQtdXAgdmFsdWUgaXMgYW4gb2JqZWN0IGRlZmluaW5nIG9uZSBvZiB0aGUgZGVzY3JpcHRvcgotbWV0aG9kcywgdGhlbiBQeXRob24gbWF5IG92ZXJyaWRlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGFuZCBpbnZva2UgdGhlCi1kZXNjcmlwdG9yIG1ldGhvZCBpbnN0ZWFkLiAgV2hlcmUgdGhpcyBvY2N1cnMgaW4gdGhlIHByZWNlZGVuY2UgY2hhaW4gZGVwZW5kcwotb24gd2hpY2ggZGVzY3JpcHRvciBtZXRob2RzIHdlcmUgZGVmaW5lZCBhbmQgaG93IHRoZXkgd2VyZSBjYWxsZWQuICBOb3RlIHRoYXQKLWRlc2NyaXB0b3JzIGFyZSBvbmx5IGludm9rZWQgZm9yIG5ldyBzdHlsZSBvYmplY3RzIG9yIGNsYXNzZXMKLShvbmVzIHRoYXQgc3ViY2xhc3MgXGNsYXNze29iamVjdCgpfSBvciBcY2xhc3N7dHlwZSgpfSkuCi0KLVRoZSBzdGFydGluZyBwb2ludCBmb3IgZGVzY3JpcHRvciBpbnZvY2F0aW9uIGlzIGEgYmluZGluZywgXGNvZGV7YS54fS4KLUhvdyB0aGUgYXJndW1lbnRzIGFyZSBhc3NlbWJsZWQgZGVwZW5kcyBvbiBcY29kZXthfToKLQotXGJlZ2lue2l0ZW1pemV9Ci0KLSAgXGl0ZW1bRGlyZWN0IENhbGxdIFRoZSBzaW1wbGVzdCBhbmQgbGVhc3QgY29tbW9uIGNhbGwgaXMgd2hlbiB1c2VyIGNvZGUKLSAgICBkaXJlY3RseSBpbnZva2VzIGEgZGVzY3JpcHRvciBtZXRob2Q6ICAgIFxjb2Rle3guX19nZXRfXyhhKX0uCi0KLSAgXGl0ZW1bSW5zdGFuY2UgQmluZGluZ10gIElmIGJpbmRpbmcgdG8gYSBuZXctc3R5bGUgb2JqZWN0IGluc3RhbmNlLAotICAgIFxjb2Rle2EueH0gaXMgdHJhbnNmb3JtZWQgaW50byB0aGUgY2FsbDoKLSAgICBcY29kZXt0eXBlKGEpLl9fZGljdF9fWyd4J10uX19nZXRfXyhhLCB0eXBlKGEpKX0uCi0KLSAgXGl0ZW1bQ2xhc3MgQmluZGluZ10gIElmIGJpbmRpbmcgdG8gYSBuZXctc3R5bGUgY2xhc3MsIFxjb2Rle0EueH0KLSAgICBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZSBjYWxsOiBcY29kZXtBLl9fZGljdF9fWyd4J10uX19nZXRfXyhOb25lLCBBKX0uCi0KLSAgXGl0ZW1bU3VwZXIgQmluZGluZ10gSWYgXGNvZGV7YX0gaXMgYW4gaW5zdGFuY2Ugb2YgXGNsYXNze3N1cGVyfSwKLSAgICB0aGVuIHRoZSBiaW5kaW5nIFxjb2Rle3N1cGVyKEIsIG9iaikubSgpfSBzZWFyY2hlcwotICAgIFxjb2Rle29iai5fX2NsYXNzX18uX19tcm9fX30gZm9yIHRoZSBiYXNlIGNsYXNzIFxjb2Rle0F9IGltbWVkaWF0ZWx5Ci0gICAgcHJlY2VkaW5nIFxjb2Rle0J9IGFuZCB0aGVuIGludm9rZXMgdGhlIGRlc2NyaXB0b3Igd2l0aCB0aGUgY2FsbDoKLSAgICBcY29kZXtBLl9fZGljdF9fWydtJ10uX19nZXRfXyhvYmosIEEpfS4KLQotXGVuZHtpdGVtaXplfQotCi1Gb3IgaW5zdGFuY2UgYmluZGluZ3MsIHRoZSBwcmVjZWRlbmNlIG9mIGRlc2NyaXB0b3IgaW52b2NhdGlvbiBkZXBlbmRzCi1vbiB0aGUgd2hpY2ggZGVzY3JpcHRvciBtZXRob2RzIGFyZSBkZWZpbmVkLiAgRGF0YSBkZXNjcmlwdG9ycyBkZWZpbmUKLWJvdGggXG1ldGhvZHtfX2dldF9fKCl9IGFuZCBcbWV0aG9ke19fc2V0X18oKX0uICBOb24tZGF0YSBkZXNjcmlwdG9ycyBoYXZlCi1qdXN0IHRoZSBcbWV0aG9ke19fZ2V0X18oKX0gbWV0aG9kLiAgRGF0YSBkZXNjcmlwdG9ycyBhbHdheXMgb3ZlcnJpZGUKLWEgcmVkZWZpbml0aW9uIGluIGFuIGluc3RhbmNlIGRpY3Rpb25hcnkuICBJbiBjb250cmFzdCwgbm9uLWRhdGEKLWRlc2NyaXB0b3JzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGluc3RhbmNlcy4KLQotUHl0aG9uIG1ldGhvZHMgKGluY2x1ZGluZyBcZnVuY3Rpb257c3RhdGljbWV0aG9kKCl9IGFuZCBcZnVuY3Rpb257Y2xhc3NtZXRob2QoKX0pCi1hcmUgaW1wbGVtZW50ZWQgYXMgbm9uLWRhdGEgZGVzY3JpcHRvcnMuICBBY2NvcmRpbmdseSwgaW5zdGFuY2VzIGNhbgotcmVkZWZpbmUgYW5kIG92ZXJyaWRlIG1ldGhvZHMuICBUaGlzIGFsbG93cyBpbmRpdmlkdWFsIGluc3RhbmNlcyB0byBhY3F1aXJlCi1iZWhhdmlvcnMgdGhhdCBkaWZmZXIgZnJvbSBvdGhlciBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgY2xhc3MuCi0KLVRoZSBcZnVuY3Rpb257cHJvcGVydHkoKX0gZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgYXMgYSBkYXRhIGRlc2NyaXB0b3IuCi1BY2NvcmRpbmdseSwgaW5zdGFuY2VzIGNhbm5vdCBvdmVycmlkZSB0aGUgYmVoYXZpb3Igb2YgYSBwcm9wZXJ0eS4KLQotCi1cc3Vic3Vic2VjdGlvbntfX3Nsb3RzX19cbGFiZWx7c2xvdHN9fQotCi1CeSBkZWZhdWx0LCBpbnN0YW5jZXMgb2YgYm90aCBvbGQgYW5kIG5ldy1zdHlsZSBjbGFzc2VzIGhhdmUgYSBkaWN0aW9uYXJ5Ci1mb3IgYXR0cmlidXRlIHN0b3JhZ2UuICBUaGlzIHdhc3RlcyBzcGFjZSBmb3Igb2JqZWN0cyBoYXZpbmcgdmVyeSBmZXcgaW5zdGFuY2UKLXZhcmlhYmxlcy4gIFRoZSBzcGFjZSBjb25zdW1wdGlvbiBjYW4gYmVjb21lIGFjdXRlIHdoZW4gY3JlYXRpbmcgbGFyZ2UgbnVtYmVycwotb2YgaW5zdGFuY2VzLgotCi1UaGUgZGVmYXVsdCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBkZWZpbmluZyBcdmFye19fc2xvdHNfX30gaW4gYSBuZXctc3R5bGUgY2xhc3MKLWRlZmluaXRpb24uICBUaGUgXHZhcntfX3Nsb3RzX199IGRlY2xhcmF0aW9uIHRha2VzIGEgc2VxdWVuY2Ugb2YgaW5zdGFuY2UKLXZhcmlhYmxlcyBhbmQgcmVzZXJ2ZXMganVzdCBlbm91Z2ggc3BhY2UgaW4gZWFjaCBpbnN0YW5jZSB0byBob2xkIGEgdmFsdWUKLWZvciBlYWNoIHZhcmlhYmxlLiAgU3BhY2UgaXMgc2F2ZWQgYmVjYXVzZSBcdmFye19fZGljdF9ffSBpcyBub3QgY3JlYXRlZCBmb3IKLWVhY2ggaW5zdGFuY2UuCi0KLVxiZWdpbntkYXRhZGVzY317X19zbG90c19ffQotVGhpcyBjbGFzcyB2YXJpYWJsZSBjYW4gYmUgYXNzaWduZWQgYSBzdHJpbmcsIGl0ZXJhYmxlLCBvciBzZXF1ZW5jZSBvZiBzdHJpbmdzCi13aXRoIHZhcmlhYmxlIG5hbWVzIHVzZWQgYnkgaW5zdGFuY2VzLiAgSWYgZGVmaW5lZCBpbiBhIG5ldy1zdHlsZSBjbGFzcywKLVx2YXJ7X19zbG90c19ffSByZXNlcnZlcyBzcGFjZSBmb3IgdGhlIGRlY2xhcmVkIHZhcmlhYmxlcwotYW5kIHByZXZlbnRzIHRoZSBhdXRvbWF0aWMgY3JlYXRpb24gb2YgXHZhcntfX2RpY3RfX30gYW5kIFx2YXJ7X193ZWFrcmVmX199Ci1mb3IgZWFjaCBpbnN0YW5jZS4KLVx2ZXJzaW9uYWRkZWR7Mi4yfQotXGVuZHtkYXRhZGVzY30KLQotXG5vaW5kZW50Ci1Ob3RlcyBvbiB1c2luZyBcdmFye19fc2xvdHNfX30KLQotXGJlZ2lue2l0ZW1pemV9Ci0KLVxpdGVtIFdpdGhvdXQgYSBcdmFye19fZGljdF9ffSB2YXJpYWJsZSwgaW5zdGFuY2VzIGNhbm5vdCBiZSBhc3NpZ25lZCBuZXcKLXZhcmlhYmxlcyBub3QgbGlzdGVkIGluIHRoZSBcdmFye19fc2xvdHNfX30gZGVmaW5pdGlvbi4gIEF0dGVtcHRzIHRvIGFzc2lnbgotdG8gYW4gdW5saXN0ZWQgdmFyaWFibGUgbmFtZSByYWlzZXMgXGV4Y2VwdGlvbntBdHRyaWJ1dGVFcnJvcn0uIElmIGR5bmFtaWMKLWFzc2lnbm1lbnQgb2YgbmV3IHZhcmlhYmxlcyBpcyBkZXNpcmVkLCB0aGVuIGFkZCBcY29kZXsnX19kaWN0X18nfSB0byB0aGUKLXNlcXVlbmNlIG9mIHN0cmluZ3MgaW4gdGhlIFx2YXJ7X19zbG90c19ffSBkZWNsYXJhdGlvbi4KLVx2ZXJzaW9uY2hhbmdlZFtQcmV2aW91c2x5LCBhZGRpbmcgXGNvZGV7J19fZGljdF9fJ30gdG8gdGhlIFx2YXJ7X19zbG90c19ffQotZGVjbGFyYXRpb24gd291bGQgbm90IGVuYWJsZSB0aGUgYXNzaWdubWVudCBvZiBuZXcgYXR0cmlidXRlcyBub3QKLXNwZWNpZmljYWxseSBsaXN0ZWQgaW4gdGhlIHNlcXVlbmNlIG9mIGluc3RhbmNlIHZhcmlhYmxlIG5hbWVzXXsyLjN9Ci0KLVxpdGVtIFdpdGhvdXQgYSBcdmFye19fd2Vha3JlZl9ffSB2YXJpYWJsZSBmb3IgZWFjaCBpbnN0YW5jZSwgY2xhc3NlcwotZGVmaW5pbmcgXHZhcntfX3Nsb3RzX199IGRvIG5vdCBzdXBwb3J0IHdlYWsgcmVmZXJlbmNlcyB0byBpdHMgaW5zdGFuY2VzLgotSWYgd2VhayByZWZlcmVuY2Ugc3VwcG9ydCBpcyBuZWVkZWQsIHRoZW4gYWRkIFxjb2RleydfX3dlYWtyZWZfXyd9IHRvIHRoZQotc2VxdWVuY2Ugb2Ygc3RyaW5ncyBpbiB0aGUgXHZhcntfX3Nsb3RzX199IGRlY2xhcmF0aW9uLgotXHZlcnNpb25jaGFuZ2VkW1ByZXZpb3VzbHksIGFkZGluZyBcY29kZXsnX193ZWFrcmVmX18nfSB0byB0aGUgXHZhcntfX3Nsb3RzX199Ci1kZWNsYXJhdGlvbiB3b3VsZCBub3QgZW5hYmxlIHN1cHBvcnQgZm9yIHdlYWsgcmVmZXJlbmNlc117Mi4zfQotCi1caXRlbSBcdmFye19fc2xvdHNfX30gYXJlIGltcGxlbWVudGVkIGF0IHRoZSBjbGFzcyBsZXZlbCBieSBjcmVhdGluZwotZGVzY3JpcHRvcnMgKFxyZWZ7ZGVzY3JpcHRvcnN9KSBmb3IgZWFjaCB2YXJpYWJsZSBuYW1lLiAgQXMgYSByZXN1bHQsCi1jbGFzcyBhdHRyaWJ1dGVzIGNhbm5vdCBiZSB1c2VkIHRvIHNldCBkZWZhdWx0IHZhbHVlcyBmb3IgaW5zdGFuY2UKLXZhcmlhYmxlcyBkZWZpbmVkIGJ5IFx2YXJ7X19zbG90c19ffTsgb3RoZXJ3aXNlLCB0aGUgY2xhc3MgYXR0cmlidXRlIHdvdWxkCi1vdmVyd3JpdGUgdGhlIGRlc2NyaXB0b3IgYXNzaWdubWVudC4KLQotXGl0ZW0gSWYgYSBjbGFzcyBkZWZpbmVzIGEgc2xvdCBhbHNvIGRlZmluZWQgaW4gYSBiYXNlIGNsYXNzLCB0aGUgaW5zdGFuY2UKLXZhcmlhYmxlIGRlZmluZWQgYnkgdGhlIGJhc2UgY2xhc3Mgc2xvdCBpcyBpbmFjY2Vzc2libGUgKGV4Y2VwdCBieSByZXRyaWV2aW5nCi1pdHMgZGVzY3JpcHRvciBkaXJlY3RseSBmcm9tIHRoZSBiYXNlIGNsYXNzKS4gVGhpcyByZW5kZXJzIHRoZSBtZWFuaW5nIG9mIHRoZQotcHJvZ3JhbSB1bmRlZmluZWQuICBJbiB0aGUgZnV0dXJlLCBhIGNoZWNrIG1heSBiZSBhZGRlZCB0byBwcmV2ZW50IHRoaXMuCi0KLVxpdGVtIFRoZSBhY3Rpb24gb2YgYSBcdmFye19fc2xvdHNfX30gZGVjbGFyYXRpb24gaXMgbGltaXRlZCB0byB0aGUgY2xhc3MKLXdoZXJlIGl0IGlzIGRlZmluZWQuICBBcyBhIHJlc3VsdCwgc3ViY2xhc3NlcyB3aWxsIGhhdmUgYSBcdmFye19fZGljdF9ffQotdW5sZXNzIHRoZXkgYWxzbyBkZWZpbmUgIFx2YXJ7X19zbG90c19ffS4KLQotXGl0ZW0gXHZhcntfX3Nsb3RzX199IGRvIG5vdCB3b3JrIGZvciBjbGFzc2VzIGRlcml2ZWQgZnJvbSBgYHZhcmlhYmxlLWxlbmd0aCcnCi1idWlsdC1pbiB0eXBlcyBzdWNoIGFzIFxjbGFzc3tsb25nfSwgXGNsYXNze3N0cn0gYW5kIFxjbGFzc3t0dXBsZX0uCi0KLVxpdGVtIEFueSBub24tc3RyaW5nIGl0ZXJhYmxlIG1heSBiZSBhc3NpZ25lZCB0byBcdmFye19fc2xvdHNfX30uCi1NYXBwaW5ncyBtYXkgYWxzbyBiZSB1c2VkOyBob3dldmVyLCBpbiB0aGUgZnV0dXJlLCBzcGVjaWFsIG1lYW5pbmcgbWF5Ci1iZSBhc3NpZ25lZCB0byB0aGUgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBrZXkuCi0KLVxpdGVtIFx2YXJ7X19jbGFzc19ffSBhc3NpZ25tZW50IHdvcmtzIG9ubHkgaWYgYm90aCBjbGFzc2VzIGhhdmUgdGhlCi1zYW1lIFx2YXJ7X19zbG90c19ffS4KLVx2ZXJzaW9uY2hhbmdlZFtQcmV2aW91c2x5LCBcdmFye19fY2xhc3NfX30gYXNzaWdubWVudCByYWlzZWQgYW4gZXJyb3IKLWlmIGVpdGhlciBuZXcgb3Igb2xkIGNsYXNzIGhhZCBcdmFye19fc2xvdHNfX31dezIuNn0KLQotXGVuZHtpdGVtaXplfQotCi0KLVxzdWJzZWN0aW9ue0N1c3RvbWl6aW5nIGNsYXNzIGNyZWF0aW9uXGxhYmVse21ldGFjbGFzc2VzfX0KLQotQnkgZGVmYXVsdCwgbmV3LXN0eWxlIGNsYXNzZXMgYXJlIGNvbnN0cnVjdGVkIHVzaW5nIFxmdW5jdGlvbnt0eXBlKCl9LgotQSBjbGFzcyBkZWZpbml0aW9uIGlzIHJlYWQgaW50byBhIHNlcGFyYXRlIG5hbWVzcGFjZSBhbmQgdGhlIHZhbHVlCi1vZiBjbGFzcyBuYW1lIGlzIGJvdW5kIHRvIHRoZSByZXN1bHQgb2YgXGNvZGV7dHlwZShuYW1lLCBiYXNlcywgZGljdCl9LgotCi1XaGVuIHRoZSBjbGFzcyBkZWZpbml0aW9uIGlzIHJlYWQsIGlmIFx2YXJ7X19tZXRhY2xhc3NfX30gaXMgZGVmaW5lZAotdGhlbiB0aGUgY2FsbGFibGUgYXNzaWduZWQgdG8gaXQgd2lsbCBiZSBjYWxsZWQgaW5zdGVhZCBvZiBcZnVuY3Rpb257dHlwZSgpfS4KLVRoZSBhbGxvd3MgY2xhc3NlcyBvciBmdW5jdGlvbnMgdG8gYmUgd3JpdHRlbiB3aGljaCBtb25pdG9yIG9yIGFsdGVyIHRoZSBjbGFzcwotY3JlYXRpb24gcHJvY2VzczoKLQotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSBNb2RpZnlpbmcgdGhlIGNsYXNzIGRpY3Rpb25hcnkgcHJpb3IgdG8gdGhlIGNsYXNzIGJlaW5nIGNyZWF0ZWQuCi1caXRlbSBSZXR1cm5pbmcgYW4gaW5zdGFuY2Ugb2YgYW5vdGhlciBjbGFzcyAtLSBlc3NlbnRpYWxseSBwZXJmb3JtaW5nCi10aGUgcm9sZSBvZiBhIGZhY3RvcnkgZnVuY3Rpb24uCi1cZW5ke2l0ZW1pemV9Ci0KLVxiZWdpbntkYXRhZGVzY317X19tZXRhY2xhc3NfX30KLVRoaXMgdmFyaWFibGUgY2FuIGJlIGFueSBjYWxsYWJsZSBhY2NlcHRpbmcgYXJndW1lbnRzIGZvciBcY29kZXtuYW1lfSwKLVxjb2Rle2Jhc2VzfSwgYW5kIFxjb2Rle2RpY3R9LiAgVXBvbiBjbGFzcyBjcmVhdGlvbiwgdGhlIGNhbGxhYmxlIGlzCi11c2VkIGluc3RlYWQgb2YgdGhlIGJ1aWx0LWluIFxmdW5jdGlvbnt0eXBlKCl9LgotXHZlcnNpb25hZGRlZHsyLjJ9Ci1cZW5ke2RhdGFkZXNjfQotCi1UaGUgYXBwcm9wcmlhdGUgbWV0YWNsYXNzIGlzIGRldGVybWluZWQgYnkgdGhlIGZvbGxvd2luZyBwcmVjZWRlbmNlIHJ1bGVzOgotCi1cYmVnaW57aXRlbWl6ZX0KLQotXGl0ZW0gSWYgXGNvZGV7ZGljdFsnX19tZXRhY2xhc3NfXyddfSBleGlzdHMsIGl0IGlzIHVzZWQuCi0KLVxpdGVtIE90aGVyd2lzZSwgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGJhc2UgY2xhc3MsIGl0cyBtZXRhY2xhc3MgaXMgdXNlZAotKHRoaXMgbG9va3MgZm9yIGEgXHZhcntfX2NsYXNzX199IGF0dHJpYnV0ZSBmaXJzdCBhbmQgaWYgbm90IGZvdW5kLCB1c2VzIGl0cwotdHlwZSkuCi0KLVxpdGVtIE90aGVyd2lzZSwgaWYgYSBnbG9iYWwgdmFyaWFibGUgbmFtZWQgX19tZXRhY2xhc3NfXyBleGlzdHMsIGl0IGlzIHVzZWQuCi0KLVxpdGVtIE90aGVyd2lzZSwgdGhlIG9sZC1zdHlsZSwgY2xhc3NpYyBtZXRhY2xhc3MgKHR5cGVzLkNsYXNzVHlwZSkgaXMgdXNlZC4KLQotXGVuZHtpdGVtaXplfQotCi1UaGUgcG90ZW50aWFsIHVzZXMgZm9yIG1ldGFjbGFzc2VzIGFyZSBib3VuZGxlc3MuIFNvbWUgaWRlYXMgdGhhdCBoYXZlCi1iZWVuIGV4cGxvcmVkIGluY2x1ZGluZyBsb2dnaW5nLCBpbnRlcmZhY2UgY2hlY2tpbmcsIGF1dG9tYXRpYyBkZWxlZ2F0aW9uLAotYXV0b21hdGljIHByb3BlcnR5IGNyZWF0aW9uLCBwcm94aWVzLCBmcmFtZXdvcmtzLCBhbmQgYXV0b21hdGljIHJlc291cmNlCi1sb2NraW5nL3N5bmNocm9uaXphdGlvbi4KLQotCi1cc3Vic2VjdGlvbntFbXVsYXRpbmcgY2FsbGFibGUgb2JqZWN0c1xsYWJlbHtjYWxsYWJsZS10eXBlc319Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtvYmplY3Rde19fY2FsbF9ffXtzZWxmXG9wdGlvbmFseywgYXJncy4uLn19Ci1DYWxsZWQgd2hlbiB0aGUgaW5zdGFuY2UgaXMgYGBjYWxsZWQnJyBhcyBhIGZ1bmN0aW9uOyBpZiB0aGlzIG1ldGhvZAotaXMgZGVmaW5lZCwgXGNvZGV7XHZhcnt4fShhcmcxLCBhcmcyLCAuLi4pfSBpcyBhIHNob3J0aGFuZCBmb3IKLVxjb2Rle1x2YXJ7eH0uX19jYWxsX18oYXJnMSwgYXJnMiwgLi4uKX0uCi1caW5kZXhpaXtjYWxsfXtpbnN0YW5jZX0KLVxlbmR7bWV0aG9kZGVzY30KLQotCi1cc3Vic2VjdGlvbntFbXVsYXRpbmcgY29udGFpbmVyIHR5cGVzXGxhYmVse3NlcXVlbmNlLXR5cGVzfX0KLQotVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGltcGxlbWVudCBjb250YWluZXIKLW9iamVjdHMuICBDb250YWluZXJzIHVzdWFsbHkgYXJlIHNlcXVlbmNlcyAoc3VjaCBhcyBsaXN0cyBvciB0dXBsZXMpCi1vciBtYXBwaW5ncyAobGlrZSBkaWN0aW9uYXJpZXMpLCBidXQgY2FuIHJlcHJlc2VudCBvdGhlciBjb250YWluZXJzIGFzCi13ZWxsLiAgVGhlIGZpcnN0IHNldCBvZiBtZXRob2RzIGlzIHVzZWQgZWl0aGVyIHRvIGVtdWxhdGUgYQotc2VxdWVuY2Ugb3IgdG8gZW11bGF0ZSBhIG1hcHBpbmc7IHRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgZm9yIGEKLXNlcXVlbmNlLCB0aGUgYWxsb3dhYmxlIGtleXMgc2hvdWxkIGJlIHRoZSBpbnRlZ2VycyBcdmFye2t9IGZvciB3aGljaAotXGNvZGV7MCA8PSBcdmFye2t9IDwgXHZhcntOfX0gd2hlcmUgXHZhcntOfSBpcyB0aGUgbGVuZ3RoIG9mIHRoZQotc2VxdWVuY2UsIG9yIHNsaWNlIG9iamVjdHMsIHdoaWNoIGRlZmluZSBhIHJhbmdlIG9mIGl0ZW1zLiAoRm9yIGJhY2t3YXJkcwotY29tcGF0aWJpbGl0eSwgdGhlIG1ldGhvZCBcbWV0aG9ke19fZ2V0c2xpY2VfXygpfSAoc2VlIGJlbG93KSBjYW4gYWxzbyBiZQotZGVmaW5lZCB0byBoYW5kbGUgc2ltcGxlLCBidXQgbm90IGV4dGVuZGVkIHNsaWNlcy4pIEl0IGlzIGFsc28gcmVjb21tZW5kZWQKLXRoYXQgbWFwcGluZ3MgcHJvdmlkZSB0aGUgbWV0aG9kcyBcbWV0aG9ke2tleXMoKX0sIFxtZXRob2R7dmFsdWVzKCl9LAotXG1ldGhvZHtpdGVtcygpfSwgXG1ldGhvZHtoYXNfa2V5KCl9LCBcbWV0aG9ke2dldCgpfSwgXG1ldGhvZHtjbGVhcigpfSwKLVxtZXRob2R7c2V0ZGVmYXVsdCgpfSwgXG1ldGhvZHtpdGVya2V5cygpfSwgXG1ldGhvZHtpdGVydmFsdWVzKCl9LAotXG1ldGhvZHtpdGVyaXRlbXMoKX0sIFxtZXRob2R7cG9wKCl9LCBcbWV0aG9ke3BvcGl0ZW0oKX0sCi1cbWV0aG9ke2NvcHkoKX0sIGFuZCBcbWV0aG9ke3VwZGF0ZSgpfSBiZWhhdmluZyBzaW1pbGFyIHRvIHRob3NlIGZvcgotUHl0aG9uJ3Mgc3RhbmRhcmQgZGljdGlvbmFyeSBvYmplY3RzLiAgVGhlIFxtb2R1bGV7VXNlckRpY3R9IG1vZHVsZQotcHJvdmlkZXMgYSBcY2xhc3N7RGljdE1peGlufSBjbGFzcyB0byBoZWxwIGNyZWF0ZSB0aG9zZSBtZXRob2RzCi1mcm9tIGEgYmFzZSBzZXQgb2YgXG1ldGhvZHtfX2dldGl0ZW1fXygpfSwgXG1ldGhvZHtfX3NldGl0ZW1fXygpfSwKLVxtZXRob2R7X19kZWxpdGVtX18oKX0sIGFuZCBcbWV0aG9ke2tleXMoKX0uCi1NdXRhYmxlIHNlcXVlbmNlcyBzaG91bGQgcHJvdmlkZQotbWV0aG9kcyBcbWV0aG9ke2FwcGVuZCgpfSwgXG1ldGhvZHtjb3VudCgpfSwgXG1ldGhvZHtpbmRleCgpfSwKLVxtZXRob2R7ZXh0ZW5kKCl9LAotXG1ldGhvZHtpbnNlcnQoKX0sIFxtZXRob2R7cG9wKCl9LCBcbWV0aG9ke3JlbW92ZSgpfSwgXG1ldGhvZHtyZXZlcnNlKCl9Ci1hbmQgXG1ldGhvZHtzb3J0KCl9LCBsaWtlIFB5dGhvbiBzdGFuZGFyZCBsaXN0IG9iamVjdHMuICBGaW5hbGx5LAotc2VxdWVuY2UgdHlwZXMgc2hvdWxkIGltcGxlbWVudCBhZGRpdGlvbiAobWVhbmluZyBjb25jYXRlbmF0aW9uKSBhbmQKLW11bHRpcGxpY2F0aW9uIChtZWFuaW5nIHJlcGV0aXRpb24pIGJ5IGRlZmluaW5nIHRoZSBtZXRob2RzCi1cbWV0aG9ke19fYWRkX18oKX0sIFxtZXRob2R7X19yYWRkX18oKX0sIFxtZXRob2R7X19pYWRkX18oKX0sCi1cbWV0aG9ke19fbXVsX18oKX0sIFxtZXRob2R7X19ybXVsX18oKX0gYW5kIFxtZXRob2R7X19pbXVsX18oKX0gZGVzY3JpYmVkCi1iZWxvdzsgdGhleSBzaG91bGQgbm90IGRlZmluZSBvdGhlciBudW1lcmljYWwKLW9wZXJhdG9ycy4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgYm90aCBtYXBwaW5ncyBhbmQgc2VxdWVuY2VzCi1pbXBsZW1lbnQgdGhlIFxtZXRob2R7X19jb250YWluc19fKCl9IG1ldGhvZCB0byBhbGxvdyBlZmZpY2llbnQgdXNlIG9mCi10aGUgXGNvZGV7aW59IG9wZXJhdG9yOyBmb3IgbWFwcGluZ3MsIFxjb2Rle2lufSBzaG91bGQgYmUgZXF1aXZhbGVudAotb2YgXG1ldGhvZHtoYXNfa2V5KCl9OyBmb3Igc2VxdWVuY2VzLCBpdCBzaG91bGQgc2VhcmNoIHRocm91Z2ggdGhlCi12YWx1ZXMuICBJdCBpcyBmdXJ0aGVyIHJlY29tbWVuZGVkIHRoYXQgYm90aCBtYXBwaW5ncyBhbmQgc2VxdWVuY2VzCi1pbXBsZW1lbnQgdGhlIFxtZXRob2R7X19pdGVyX18oKX0gbWV0aG9kIHRvIGFsbG93IGVmZmljaWVudCBpdGVyYXRpb24KLXRocm91Z2ggdGhlIGNvbnRhaW5lcjsgZm9yIG1hcHBpbmdzLCBcbWV0aG9ke19faXRlcl9fKCl9IHNob3VsZCBiZQotdGhlIHNhbWUgYXMgXG1ldGhvZHtpdGVya2V5cygpfTsgZm9yIHNlcXVlbmNlcywgaXQgc2hvdWxkIGl0ZXJhdGUKLXRocm91Z2ggdGhlIHZhbHVlcy4KLVx3aXRoc3ViaXRlbXsobWFwcGluZyBvYmplY3QgbWV0aG9kKX17Ci0gIFx0dGluZGV4e2tleXMoKX0KLSAgXHR0aW5kZXh7dmFsdWVzKCl9Ci0gIFx0dGluZGV4e2l0ZW1zKCl9Ci0gIFx0dGluZGV4e2l0ZXJrZXlzKCl9Ci0gIFx0dGluZGV4e2l0ZXJ2YWx1ZXMoKX0KLSAgXHR0aW5kZXh7aXRlcml0ZW1zKCl9Ci0gIFx0dGluZGV4e2hhc19rZXkoKX0KLSAgXHR0aW5kZXh7Z2V0KCl9Ci0gIFx0dGluZGV4e3NldGRlZmF1bHQoKX0KLSAgXHR0aW5kZXh7cG9wKCl9Ci0gIFx0dGluZGV4e3BvcGl0ZW0oKX0KLSAgXHR0aW5kZXh7Y2xlYXIoKX0KLSAgXHR0aW5kZXh7Y29weSgpfQotICBcdHRpbmRleHt1cGRhdGUoKX0KLSAgXHR0aW5kZXh7X19jb250YWluc19fKCl9fQotXHdpdGhzdWJpdGVteyhzZXF1ZW5jZSBvYmplY3QgbWV0aG9kKX17Ci0gIFx0dGluZGV4e2FwcGVuZCgpfQotICBcdHRpbmRleHtjb3VudCgpfQotICBcdHRpbmRleHtleHRlbmQoKX0KLSAgXHR0aW5kZXh7aW5kZXgoKX0KLSAgXHR0aW5kZXh7aW5zZXJ0KCl9Ci0gIFx0dGluZGV4e3BvcCgpfQotICBcdHRpbmRleHtyZW1vdmUoKX0KLSAgXHR0aW5kZXh7cmV2ZXJzZSgpfQotICBcdHRpbmRleHtzb3J0KCl9Ci0gIFx0dGluZGV4e19fYWRkX18oKX0KLSAgXHR0aW5kZXh7X19yYWRkX18oKX0KLSAgXHR0aW5kZXh7X19pYWRkX18oKX0KLSAgXHR0aW5kZXh7X19tdWxfXygpfQotICBcdHRpbmRleHtfX3JtdWxfXygpfQotICBcdHRpbmRleHtfX2ltdWxfXygpfQotICBcdHRpbmRleHtfX2NvbnRhaW5zX18oKX0KLSAgXHR0aW5kZXh7X19pdGVyX18oKX19Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtjb250YWluZXIgb2JqZWN0XXtfX2xlbl9ffXtzZWxmfQotQ2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYnVpbHQtaW4gZnVuY3Rpb24KLVxmdW5jdGlvbntsZW4oKX1cYmlmdW5jaW5kZXh7bGVufS4gIFNob3VsZCByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUKLW9iamVjdCwgYW4gaW50ZWdlciBcY29kZXs+PX0gMC4gIEFsc28sIGFuIG9iamVjdCB0aGF0IGRvZXNuJ3QgZGVmaW5lIGEKLVxtZXRob2R7X19ib29sX18oKX0gbWV0aG9kIGFuZCB3aG9zZSBcbWV0aG9ke19fbGVuX18oKX0gbWV0aG9kCi1yZXR1cm5zIHplcm8gaXMgY29uc2lkZXJlZCB0byBiZSBmYWxzZSBpbiBhIEJvb2xlYW4gY29udGV4dC4KLVx3aXRoc3ViaXRlbXsob2JqZWN0IG1ldGhvZCl9e1x0dGluZGV4e19fYm9vbF9fKCl9fQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bY29udGFpbmVyIG9iamVjdF17X19nZXRpdGVtX199e3NlbGYsIGtleX0KLUNhbGxlZCB0byBpbXBsZW1lbnQgZXZhbHVhdGlvbiBvZiBcY29kZXtcdmFye3NlbGZ9W1x2YXJ7a2V5fV19LgotRm9yIHNlcXVlbmNlIHR5cGVzLCB0aGUgYWNjZXB0ZWQga2V5cyBzaG91bGQgYmUgaW50ZWdlcnMgYW5kIHNsaWNlCi1vYmplY3RzLlxvYmluZGV4e3NsaWNlfSAgTm90ZSB0aGF0Ci10aGUgc3BlY2lhbCBpbnRlcnByZXRhdGlvbiBvZiBuZWdhdGl2ZSBpbmRleGVzIChpZiB0aGUgY2xhc3Mgd2lzaGVzIHRvCi1lbXVsYXRlIGEgc2VxdWVuY2UgdHlwZSkgaXMgdXAgdG8gdGhlIFxtZXRob2R7X19nZXRpdGVtX18oKX0gbWV0aG9kLgotSWYgXHZhcntrZXl9IGlzIG9mIGFuIGluYXBwcm9wcmlhdGUgdHlwZSwgXGV4Y2VwdGlvbntUeXBlRXJyb3J9IG1heSBiZQotcmFpc2VkOyBpZiBvZiBhIHZhbHVlIG91dHNpZGUgdGhlIHNldCBvZiBpbmRleGVzIGZvciB0aGUgc2VxdWVuY2UKLShhZnRlciBhbnkgc3BlY2lhbCBpbnRlcnByZXRhdGlvbiBvZiBuZWdhdGl2ZSB2YWx1ZXMpLAotXGV4Y2VwdGlvbntJbmRleEVycm9yfSBzaG91bGQgYmUgcmFpc2VkLgotRm9yIG1hcHBpbmcgdHlwZXMsIGlmIFx2YXJ7a2V5fSBpcyBtaXNzaW5nIChub3QgaW4gdGhlIGNvbnRhaW5lciksCi1cZXhjZXB0aW9ue0tleUVycm9yfSBzaG91bGQgYmUgcmFpc2VkLgotXG5vdGV7XGtleXdvcmR7Zm9yfSBsb29wcyBleHBlY3QgdGhhdCBhbgotXGV4Y2VwdGlvbntJbmRleEVycm9yfSB3aWxsIGJlIHJhaXNlZCBmb3IgaWxsZWdhbCBpbmRleGVzIHRvIGFsbG93Ci1wcm9wZXIgZGV0ZWN0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLn0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2NvbnRhaW5lciBvYmplY3Rde19fc2V0aXRlbV9ffXtzZWxmLCBrZXksIHZhbHVlfQotQ2FsbGVkIHRvIGltcGxlbWVudCBhc3NpZ25tZW50IHRvIFxjb2Rle1x2YXJ7c2VsZn1bXHZhcntrZXl9XX0uICBTYW1lCi1ub3RlIGFzIGZvciBcbWV0aG9ke19fZ2V0aXRlbV9fKCl9LiAgVGhpcyBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZAotZm9yIG1hcHBpbmdzIGlmIHRoZSBvYmplY3RzIHN1cHBvcnQgY2hhbmdlcyB0byB0aGUgdmFsdWVzIGZvciBrZXlzLCBvcgotaWYgbmV3IGtleXMgY2FuIGJlIGFkZGVkLCBvciBmb3Igc2VxdWVuY2VzIGlmIGVsZW1lbnRzIGNhbiBiZQotcmVwbGFjZWQuICBUaGUgc2FtZSBleGNlcHRpb25zIHNob3VsZCBiZSByYWlzZWQgZm9yIGltcHJvcGVyCi1cdmFye2tleX0gdmFsdWVzIGFzIGZvciB0aGUgXG1ldGhvZHtfX2dldGl0ZW1fXygpfSBtZXRob2QuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtjb250YWluZXIgb2JqZWN0XXtfX2RlbGl0ZW1fX317c2VsZiwga2V5fQotQ2FsbGVkIHRvIGltcGxlbWVudCBkZWxldGlvbiBvZiBcY29kZXtcdmFye3NlbGZ9W1x2YXJ7a2V5fV19LiAgU2FtZQotbm90ZSBhcyBmb3IgXG1ldGhvZHtfX2dldGl0ZW1fXygpfS4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQKLWZvciBtYXBwaW5ncyBpZiB0aGUgb2JqZWN0cyBzdXBwb3J0IHJlbW92YWwgb2Yga2V5cywgb3IgZm9yIHNlcXVlbmNlcwotaWYgZWxlbWVudHMgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgc2VxdWVuY2UuICBUaGUgc2FtZSBleGNlcHRpb25zCi1zaG91bGQgYmUgcmFpc2VkIGZvciBpbXByb3BlciBcdmFye2tleX0gdmFsdWVzIGFzIGZvciB0aGUKLVxtZXRob2R7X19nZXRpdGVtX18oKX0gbWV0aG9kLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bY29udGFpbmVyIG9iamVjdF17X19pdGVyX199e3NlbGZ9Ci1UaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhbiBpdGVyYXRvciBpcyByZXF1aXJlZCBmb3IgYSBjb250YWluZXIuCi1UaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGEgbmV3IGl0ZXJhdG9yIG9iamVjdCB0aGF0IGNhbiBpdGVyYXRlIG92ZXIKLWFsbCB0aGUgb2JqZWN0cyBpbiB0aGUgY29udGFpbmVyLiAgRm9yIG1hcHBpbmdzLCBpdCBzaG91bGQgaXRlcmF0ZQotb3ZlciB0aGUga2V5cyBvZiB0aGUgY29udGFpbmVyLCBhbmQgc2hvdWxkIGFsc28gYmUgbWFkZSBhdmFpbGFibGUgYXMKLXRoZSBtZXRob2QgXG1ldGhvZHtpdGVya2V5cygpfS4KLQotSXRlcmF0b3Igb2JqZWN0cyBhbHNvIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kOyB0aGV5IGFyZSByZXF1aXJlZAotdG8gcmV0dXJuIHRoZW1zZWx2ZXMuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBpdGVyYXRvciBvYmplY3RzLCBzZWUKLWBgXHVsaW5re0l0ZXJhdG9yIFR5cGVzfXsuLi9saWIvdHlwZWl0ZXIuaHRtbH0nJyBpbiB0aGUKLVxjaXRldGl0bGVbLi4vbGliL2xpYi5odG1sXXtQeXRob24gTGlicmFyeSBSZWZlcmVuY2V9LgotXGVuZHttZXRob2RkZXNjfQotCi1UaGUgbWVtYmVyc2hpcCB0ZXN0IG9wZXJhdG9ycyAoXGtleXdvcmR7aW59IGFuZCBca2V5d29yZHtub3QgaW59KSBhcmUKLW5vcm1hbGx5IGltcGxlbWVudGVkIGFzIGFuIGl0ZXJhdGlvbiB0aHJvdWdoIGEgc2VxdWVuY2UuICBIb3dldmVyLAotY29udGFpbmVyIG9iamVjdHMgY2FuIHN1cHBseSB0aGUgZm9sbG93aW5nIHNwZWNpYWwgbWV0aG9kIHdpdGggYSBtb3JlCi1lZmZpY2llbnQgaW1wbGVtZW50YXRpb24sIHdoaWNoIGFsc28gZG9lcyBub3QgcmVxdWlyZSB0aGUgb2JqZWN0IGJlIGEKLXNlcXVlbmNlLgotCi1cYmVnaW57bWV0aG9kZGVzY31bY29udGFpbmVyIG9iamVjdF17X19jb250YWluc19ffXtzZWxmLCBpdGVtfQotQ2FsbGVkIHRvIGltcGxlbWVudCBtZW1iZXJzaGlwIHRlc3Qgb3BlcmF0b3JzLiAgU2hvdWxkIHJldHVybiB0cnVlIGlmCi1cdmFye2l0ZW19IGlzIGluIFx2YXJ7c2VsZn0sIGZhbHNlIG90aGVyd2lzZS4gIEZvciBtYXBwaW5nIG9iamVjdHMsCi10aGlzIHNob3VsZCBjb25zaWRlciB0aGUga2V5cyBvZiB0aGUgbWFwcGluZyByYXRoZXIgdGhhbiB0aGUgdmFsdWVzIG9yCi10aGUga2V5LWl0ZW0gcGFpcnMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLQotXHN1YnNlY3Rpb257QWRkaXRpb25hbCBtZXRob2RzIGZvciBlbXVsYXRpb24gb2Ygc2VxdWVuY2UgdHlwZXMKLSAgXGxhYmVse3NlcXVlbmNlLW1ldGhvZHN9fQotCi1UaGUgZm9sbG93aW5nIG9wdGlvbmFsIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gZnVydGhlciBlbXVsYXRlIHNlcXVlbmNlCi1vYmplY3RzLiAgSW1tdXRhYmxlIHNlcXVlbmNlcyBtZXRob2RzIHNob3VsZCBhdCBtb3N0IG9ubHkgZGVmaW5lCi1cbWV0aG9ke19fZ2V0c2xpY2VfXygpfTsgbXV0YWJsZSBzZXF1ZW5jZXMgbWlnaHQgZGVmaW5lIGFsbCB0aHJlZQotbWV0aG9kcy4KLQotXGJlZ2lue21ldGhvZGRlc2N9W3NlcXVlbmNlIG9iamVjdF17X19nZXRzbGljZV9ffXtzZWxmLCBpLCBqfQotXGRlcHJlY2F0ZWR7Mi4wfXtTdXBwb3J0IHNsaWNlIG9iamVjdHMgYXMgcGFyYW1ldGVycyB0byB0aGUKLVxtZXRob2R7X19nZXRpdGVtX18oKX0gbWV0aG9kLn0KLUNhbGxlZCB0byBpbXBsZW1lbnQgZXZhbHVhdGlvbiBvZiBcY29kZXtcdmFye3NlbGZ9W1x2YXJ7aX06XHZhcntqfV19LgotVGhlIHJldHVybmVkIG9iamVjdCBzaG91bGQgYmUgb2YgdGhlIHNhbWUgdHlwZSBhcyBcdmFye3NlbGZ9LiAgTm90ZQotdGhhdCBtaXNzaW5nIFx2YXJ7aX0gb3IgXHZhcntqfSBpbiB0aGUgc2xpY2UgZXhwcmVzc2lvbiBhcmUgcmVwbGFjZWQKLWJ5IHplcm8gb3IgXGNvZGV7c3lzLm1heGludH0sIHJlc3BlY3RpdmVseS4gIElmIG5lZ2F0aXZlIGluZGV4ZXMgYXJlCi11c2VkIGluIHRoZSBzbGljZSwgdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UgaXMgYWRkZWQgdG8gdGhhdCBpbmRleC4KLUlmIHRoZSBpbnN0YW5jZSBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIFxtZXRob2R7X19sZW5fXygpfSBtZXRob2QsIGFuCi1cZXhjZXB0aW9ue0F0dHJpYnV0ZUVycm9yfSBpcyByYWlzZWQuCi1ObyBndWFyYW50ZWUgaXMgbWFkZSB0aGF0IGluZGV4ZXMgYWRqdXN0ZWQgdGhpcyB3YXkgYXJlIG5vdCBzdGlsbAotbmVnYXRpdmUuICBJbmRleGVzIHdoaWNoIGFyZSBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UKLWFyZSBub3QgbW9kaWZpZWQuCi1JZiBubyBcbWV0aG9ke19fZ2V0c2xpY2VfXygpfSBpcyBmb3VuZCwgYSBzbGljZQotb2JqZWN0IGlzIGNyZWF0ZWQgaW5zdGVhZCwgYW5kIHBhc3NlZCB0byBcbWV0aG9ke19fZ2V0aXRlbV9fKCl9IGluc3RlYWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtzZXF1ZW5jZSBvYmplY3Rde19fc2V0c2xpY2VfX317c2VsZiwgaSwgaiwgc2VxdWVuY2V9Ci1DYWxsZWQgdG8gaW1wbGVtZW50IGFzc2lnbm1lbnQgdG8gXGNvZGV7XHZhcntzZWxmfVtcdmFye2l9Olx2YXJ7an1dfS4KLVNhbWUgbm90ZXMgZm9yIFx2YXJ7aX0gYW5kIFx2YXJ7an0gYXMgZm9yIFxtZXRob2R7X19nZXRzbGljZV9fKCl9LgotCi1UaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBJZiBubyBcbWV0aG9ke19fc2V0c2xpY2VfXygpfSBpcyBmb3VuZCwKLW9yIGZvciBleHRlbmRlZCBzbGljaW5nIG9mIHRoZSBmb3JtCi1cY29kZXtcdmFye3NlbGZ9W1x2YXJ7aX06XHZhcntqfTpcdmFye2t9XX0sIGEKLXNsaWNlIG9iamVjdCBpcyBjcmVhdGVkLCBhbmQgcGFzc2VkIHRvIFxtZXRob2R7X19zZXRpdGVtX18oKX0sCi1pbnN0ZWFkIG9mIFxtZXRob2R7X19zZXRzbGljZV9fKCl9IGJlaW5nIGNhbGxlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W3NlcXVlbmNlIG9iamVjdF17X19kZWxzbGljZV9ffXtzZWxmLCBpLCBqfQotQ2FsbGVkIHRvIGltcGxlbWVudCBkZWxldGlvbiBvZiBcY29kZXtcdmFye3NlbGZ9W1x2YXJ7aX06XHZhcntqfV19LgotU2FtZSBub3RlcyBmb3IgXHZhcntpfSBhbmQgXHZhcntqfSBhcyBmb3IgXG1ldGhvZHtfX2dldHNsaWNlX18oKX0uCi1UaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBJZiBubyBcbWV0aG9ke19fZGVsc2xpY2VfXygpfSBpcyBmb3VuZCwKLW9yIGZvciBleHRlbmRlZCBzbGljaW5nIG9mIHRoZSBmb3JtCi1cY29kZXtcdmFye3NlbGZ9W1x2YXJ7aX06XHZhcntqfTpcdmFye2t9XX0sIGEKLXNsaWNlIG9iamVjdCBpcyBjcmVhdGVkLCBhbmQgcGFzc2VkIHRvIFxtZXRob2R7X19kZWxpdGVtX18oKX0sCi1pbnN0ZWFkIG9mIFxtZXRob2R7X19kZWxzbGljZV9fKCl9IGJlaW5nIGNhbGxlZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotTm90aWNlIHRoYXQgdGhlc2UgbWV0aG9kcyBhcmUgb25seSBpbnZva2VkIHdoZW4gYSBzaW5nbGUgc2xpY2Ugd2l0aCBhCi1zaW5nbGUgY29sb24gaXMgdXNlZCwgYW5kIHRoZSBzbGljZSBtZXRob2QgaXMgYXZhaWxhYmxlLiAgRm9yIHNsaWNlCi1vcGVyYXRpb25zIGludm9sdmluZyBleHRlbmRlZCBzbGljZSBub3RhdGlvbiwgb3IgaW4gYWJzZW5jZSBvZiB0aGUKLXNsaWNlIG1ldGhvZHMsIFxtZXRob2R7X19nZXRpdGVtX18oKX0sIFxtZXRob2R7X19zZXRpdGVtX18oKX0gb3IKLVxtZXRob2R7X19kZWxpdGVtX18oKX0gaXMgY2FsbGVkIHdpdGggYSBzbGljZSBvYmplY3QgYXMgYXJndW1lbnQuCi0KLVRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZW1vbnN0cmF0ZSBob3cgdG8gbWFrZSB5b3VyIHByb2dyYW0gb3IgbW9kdWxlCi1jb21wYXRpYmxlIHdpdGggZWFybGllciB2ZXJzaW9ucyBvZiBQeXRob24gKGFzc3VtaW5nIHRoYXQgbWV0aG9kcwotXG1ldGhvZHtfX2dldGl0ZW1fXygpfSwgXG1ldGhvZHtfX3NldGl0ZW1fXygpfSBhbmQgXG1ldGhvZHtfX2RlbGl0ZW1fXygpfQotc3VwcG9ydCBzbGljZSBvYmplY3RzIGFzIGFyZ3VtZW50cyk6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWNsYXNzIE15Q2xhc3M6Ci0gICAgLi4uCi0gICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KToKLSAgICAgICAgLi4uCi0gICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGluZGV4LCB2YWx1ZSk6Ci0gICAgICAgIC4uLgotICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBpbmRleCk6Ci0gICAgICAgIC4uLgotCi0gICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCAwKToKLSAgICAgICAgIyBUaGV5IHdvbid0IGJlIGRlZmluZWQgaWYgdmVyc2lvbiBpcyBhdCBsZWFzdCAyLjAgZmluYWwKLQotICAgICAgICBkZWYgX19nZXRzbGljZV9fKHNlbGYsIGksIGopOgotICAgICAgICAgICAgcmV0dXJuIHNlbGZbbWF4KDAsIGkpOm1heCgwLCBqKTpdCi0gICAgICAgIGRlZiBfX3NldHNsaWNlX18oc2VsZiwgaSwgaiwgc2VxKToKLSAgICAgICAgICAgIHNlbGZbbWF4KDAsIGkpOm1heCgwLCBqKTpdID0gc2VxCi0gICAgICAgIGRlZiBfX2RlbHNsaWNlX18oc2VsZiwgaSwgaik6Ci0gICAgICAgICAgICBkZWwgc2VsZlttYXgoMCwgaSk6bWF4KDAsIGopOl0KLSAgICAuLi4KLVxlbmR7dmVyYmF0aW19Ci0KLU5vdGUgdGhlIGNhbGxzIHRvIFxmdW5jdGlvbnttYXgoKX07IHRoZXNlIGFyZSBuZWNlc3NhcnkgYmVjYXVzZSBvZgotdGhlIGhhbmRsaW5nIG9mIG5lZ2F0aXZlIGluZGljZXMgYmVmb3JlIHRoZQotXG1ldGhvZHtfXypzbGljZV9fKCl9IG1ldGhvZHMgYXJlIGNhbGxlZC4gIFdoZW4gbmVnYXRpdmUgaW5kZXhlcyBhcmUKLXVzZWQsIHRoZSBcbWV0aG9ke19fKml0ZW1fXygpfSBtZXRob2RzIHJlY2VpdmUgdGhlbSBhcyBwcm92aWRlZCwgYnV0Ci10aGUgXG1ldGhvZHtfXypzbGljZV9fKCl9IG1ldGhvZHMgZ2V0IGEgYGBjb29rZWQnJyBmb3JtIG9mIHRoZSBpbmRleAotdmFsdWVzLiAgRm9yIGVhY2ggbmVnYXRpdmUgaW5kZXggdmFsdWUsIHRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlIGlzCi1hZGRlZCB0byB0aGUgaW5kZXggYmVmb3JlIGNhbGxpbmcgdGhlIG1ldGhvZCAod2hpY2ggbWF5IHN0aWxsIHJlc3VsdAotaW4gYSBuZWdhdGl2ZSBpbmRleCk7IHRoaXMgaXMgdGhlIGN1c3RvbWFyeSBoYW5kbGluZyBvZiBuZWdhdGl2ZQotaW5kZXhlcyBieSB0aGUgYnVpbHQtaW4gc2VxdWVuY2UgdHlwZXMsIGFuZCB0aGUgXG1ldGhvZHtfXyppdGVtX18oKX0KLW1ldGhvZHMgYXJlIGV4cGVjdGVkIHRvIGRvIHRoaXMgYXMgd2VsbC4gIEhvd2V2ZXIsIHNpbmNlIHRoZXkgc2hvdWxkCi1hbHJlYWR5IGJlIGRvaW5nIHRoYXQsIG5lZ2F0aXZlIGluZGV4ZXMgY2Fubm90IGJlIHBhc3NlZCBpbjsgdGhleSBtdXN0Ci1iZSBjb25zdHJhaW5lZCB0byB0aGUgYm91bmRzIG9mIHRoZSBzZXF1ZW5jZSBiZWZvcmUgYmVpbmcgcGFzc2VkIHRvCi10aGUgXG1ldGhvZHtfXyppdGVtX18oKX0gbWV0aG9kcy4KLUNhbGxpbmcgXGNvZGV7bWF4KDAsIGkpfSBjb252ZW5pZW50bHkgcmV0dXJucyB0aGUgcHJvcGVyIHZhbHVlLgotCi0KLVxzdWJzZWN0aW9ue0VtdWxhdGluZyBudW1lcmljIHR5cGVzXGxhYmVse251bWVyaWMtdHlwZXN9fQotCi1UaGUgZm9sbG93aW5nIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gZW11bGF0ZSBudW1lcmljIG9iamVjdHMuCi1NZXRob2RzIGNvcnJlc3BvbmRpbmcgdG8gb3BlcmF0aW9ucyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZQotcGFydGljdWxhciBraW5kIG9mIG51bWJlciBpbXBsZW1lbnRlZCAoZS5nLiwgYml0d2lzZSBvcGVyYXRpb25zIGZvcgotbm9uLWludGVncmFsIG51bWJlcnMpIHNob3VsZCBiZSBsZWZ0IHVuZGVmaW5lZC4KLQotXGJlZ2lue21ldGhvZGRlc2N9W251bWVyaWMgb2JqZWN0XXtfX2FkZF9ffXtzZWxmLCBvdGhlcn0KLVxtZXRob2RsaW5lW251bWVyaWMgb2JqZWN0XXtfX3N1Yl9ffXtzZWxmLCBvdGhlcn0KLVxtZXRob2RsaW5lW251bWVyaWMgb2JqZWN0XXtfX211bF9ffXtzZWxmLCBvdGhlcn0KLVxtZXRob2RsaW5lW251bWVyaWMgb2JqZWN0XXtfX2Zsb29yZGl2X199e3NlbGYsIG90aGVyfQotXG1ldGhvZGxpbmVbbnVtZXJpYyBvYmplY3Rde19fbW9kX199e3NlbGYsIG90aGVyfQotXG1ldGhvZGxpbmVbbnVtZXJpYyBvYmplY3Rde19fZGl2bW9kX199e3NlbGYsIG90aGVyfQotXG1ldGhvZGxpbmVbbnVtZXJpYyBvYmplY3Rde19fcG93X199e3NlbGYsIG90aGVyXG9wdGlvbmFseywgbW9kdWxvfX0KLVxtZXRob2RsaW5lW251bWVyaWMgb2JqZWN0XXtfX2xzaGlmdF9ffXtzZWxmLCBvdGhlcn0KLVxtZXRob2RsaW5lW251bWVyaWMgb2JqZWN0XXtfX3JzaGlmdF9ffXtzZWxmLCBvdGhlcn0KLVxtZXRob2RsaW5lW251bWVyaWMgb2JqZWN0XXtfX2FuZF9ffXtzZWxmLCBvdGhlcn0KLVxtZXRob2RsaW5lW251bWVyaWMgb2JqZWN0XXtfX3hvcl9ffXtzZWxmLCBvdGhlcn0KLVxtZXRob2RsaW5lW251bWVyaWMgb2JqZWN0XXtfX29yX199e3NlbGYsIG90aGVyfQotVGhlc2UgbWV0aG9kcyBhcmUKLWNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJpbmFyeSBhcml0aG1ldGljIG9wZXJhdGlvbnMgKFxjb2Rleyt9LAotXGNvZGV7LX0sIFxjb2Rleyp9LCBcY29kZXsvL30sIFxjb2Rle1wlfSwKLVxmdW5jdGlvbntkaXZtb2QoKX1cYmlmdW5jaW5kZXh7ZGl2bW9kfSwKLVxmdW5jdGlvbntwb3coKX1cYmlmdW5jaW5kZXh7cG93fSwgXGNvZGV7Kip9LCBcY29kZXs8PH0sCi1cY29kZXs+Pn0sIFxjb2Rle1wmfSwgXGNvZGV7XF59LCBcY29kZXt8fSkuICBGb3IgaW5zdGFuY2UsIHRvCi1ldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiBcdmFye3h9XGNvZGV7K31cdmFye3l9LCB3aGVyZSBcdmFye3h9IGlzIGFuCi1pbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXQgaGFzIGFuIFxtZXRob2R7X19hZGRfXygpfSBtZXRob2QsCi1cY29kZXtcdmFye3h9Ll9fYWRkX18oXHZhcnt5fSl9IGlzIGNhbGxlZC4gIFRoZSBcbWV0aG9ke19fZGl2bW9kX18oKX0KLW1ldGhvZCBzaG91bGQgYmUgdGhlIGVxdWl2YWxlbnQgdG8gdXNpbmcgXG1ldGhvZHtfX2Zsb29yZGl2X18oKX0gYW5kCi1cbWV0aG9ke19fbW9kX18oKX07IGl0IHNob3VsZCBub3QgYmUgcmVsYXRlZCB0byBcbWV0aG9ke19fdHJ1ZWRpdl9fKCl9Ci0oZGVzY3JpYmVkIGJlbG93KS4gIE5vdGUgdGhhdAotXG1ldGhvZHtfX3Bvd19fKCl9IHNob3VsZCBiZSBkZWZpbmVkIHRvIGFjY2VwdCBhbiBvcHRpb25hbCB0aGlyZAotYXJndW1lbnQgaWYgdGhlIHRlcm5hcnkgdmVyc2lvbiBvZiB0aGUgYnVpbHQtaW4KLVxmdW5jdGlvbntwb3coKX1cYmlmdW5jaW5kZXh7cG93fSBmdW5jdGlvbiBpcyB0byBiZSBzdXBwb3J0ZWQuCi0KLUlmIG9uZSBvZiB0aG9zZSBtZXRob2RzIGRvZXMgbm90IHN1cHBvcnQgdGhlIG9wZXJhdGlvbiB3aXRoIHRoZQotc3VwcGxpZWQgYXJndW1lbnRzLCBpdCBzaG91bGQgcmV0dXJuIFxjb2Rle05vdEltcGxlbWVudGVkfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W251bWVyaWMgb2JqZWN0XXtfX2Rpdl9ffXtzZWxmLCBvdGhlcn0KLVxtZXRob2RsaW5lW251bWVyaWMgb2JqZWN0XXtfX3RydWVkaXZfX317c2VsZiwgb3RoZXJ9Ci1UaGUgZGl2aXNpb24gb3BlcmF0b3IgKFxjb2Rley99KSBpcyBpbXBsZW1lbnRlZCBieSB0aGVzZSBtZXRob2RzLiAgVGhlCi1cbWV0aG9ke19fdHJ1ZWRpdl9fKCl9IG1ldGhvZCBpcyB1c2VkIHdoZW4gXGNvZGV7X19mdXR1cmVfXy5kaXZpc2lvbn0KLWlzIGluIGVmZmVjdCwgb3RoZXJ3aXNlIFxtZXRob2R7X19kaXZfXygpfSBpcyB1c2VkLiAgSWYgb25seSBvbmUgb2YKLXRoZXNlIHR3byBtZXRob2RzIGlzIGRlZmluZWQsIHRoZSBvYmplY3Qgd2lsbCBub3Qgc3VwcG9ydCBkaXZpc2lvbiBpbgotdGhlIGFsdGVybmF0ZSBjb250ZXh0OyBcZXhjZXB0aW9ue1R5cGVFcnJvcn0gd2lsbCBiZSByYWlzZWQgaW5zdGVhZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W251bWVyaWMgb2JqZWN0XXtfX3JhZGRfX317c2VsZiwgb3RoZXJ9Ci1cbWV0aG9kbGluZVtudW1lcmljIG9iamVjdF17X19yc3ViX199e3NlbGYsIG90aGVyfQotXG1ldGhvZGxpbmVbbnVtZXJpYyBvYmplY3Rde19fcm11bF9ffXtzZWxmLCBvdGhlcn0KLVxtZXRob2RsaW5lW251bWVyaWMgb2JqZWN0XXtfX3JkaXZfX317c2VsZiwgb3RoZXJ9Ci1cbWV0aG9kbGluZVtudW1lcmljIG9iamVjdF17X19ydHJ1ZWRpdl9ffXtzZWxmLCBvdGhlcn0KLVxtZXRob2RsaW5lW251bWVyaWMgb2JqZWN0XXtfX3JmbG9vcmRpdl9ffXtzZWxmLCBvdGhlcn0KLVxtZXRob2RsaW5lW251bWVyaWMgb2JqZWN0XXtfX3Jtb2RfX317c2VsZiwgb3RoZXJ9Ci1cbWV0aG9kbGluZVtudW1lcmljIG9iamVjdF17X19yZGl2bW9kX199e3NlbGYsIG90aGVyfQotXG1ldGhvZGxpbmVbbnVtZXJpYyBvYmplY3Rde19fcnBvd19ffXtzZWxmLCBvdGhlcn0KLVxtZXRob2RsaW5lW251bWVyaWMgb2JqZWN0XXtfX3Jsc2hpZnRfX317c2VsZiwgb3RoZXJ9Ci1cbWV0aG9kbGluZVtudW1lcmljIG9iamVjdF17X19ycnNoaWZ0X199e3NlbGYsIG90aGVyfQotXG1ldGhvZGxpbmVbbnVtZXJpYyBvYmplY3Rde19fcmFuZF9ffXtzZWxmLCBvdGhlcn0KLVxtZXRob2RsaW5lW251bWVyaWMgb2JqZWN0XXtfX3J4b3JfX317c2VsZiwgb3RoZXJ9Ci1cbWV0aG9kbGluZVtudW1lcmljIG9iamVjdF17X19yb3JfX317c2VsZiwgb3RoZXJ9Ci1UaGVzZSBtZXRob2RzIGFyZQotY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5IGFyaXRobWV0aWMgb3BlcmF0aW9ucyAoXGNvZGV7K30sCi1cY29kZXstfSwgXGNvZGV7Kn0sIFxjb2Rley99LCBcY29kZXtcJX0sCi1cZnVuY3Rpb257ZGl2bW9kKCl9XGJpZnVuY2luZGV4e2Rpdm1vZH0sCi1cZnVuY3Rpb257cG93KCl9XGJpZnVuY2luZGV4e3Bvd30sIFxjb2RleyoqfSwgXGNvZGV7PDx9LAotXGNvZGV7Pj59LCBcY29kZXtcJn0sIFxjb2Rle1xefSwgXGNvZGV7fH0pIHdpdGggcmVmbGVjdGVkCi0oc3dhcHBlZCkgb3BlcmFuZHMuICBUaGVzZSBmdW5jdGlvbnMgYXJlIG9ubHkgY2FsbGVkIGlmIHRoZSBsZWZ0Ci1vcGVyYW5kIGRvZXMgbm90IHN1cHBvcnQgdGhlIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uIGFuZCB0aGUKLW9wZXJhbmRzIGFyZSBvZiBkaWZmZXJlbnQgdHlwZXMuXGZvb3Rub3RlewotICAgIEZvciBvcGVyYW5kcyBvZiB0aGUgc2FtZSB0eXBlLCBpdCBpcyBhc3N1bWVkIHRoYXQgaWYgdGhlCi0gICAgbm9uLXJlZmxlY3RlZCBtZXRob2QgKHN1Y2ggYXMgXG1ldGhvZHtfX2FkZF9fKCl9KSBmYWlscyB0aGUKLSAgICBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCwgd2hpY2ggaXMgd2h5IHRoZSByZWZsZWN0ZWQgbWV0aG9kCi0gICAgaXMgbm90IGNhbGxlZC59Ci1Gb3IgaW5zdGFuY2UsIHRvIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uIFx2YXJ7eH1cY29kZXstfVx2YXJ7eX0sCi13aGVyZSBcdmFye3l9IGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgdGhhdCBoYXMgYW4KLVxtZXRob2R7X19yc3ViX18oKX0gbWV0aG9kLCBcY29kZXtcdmFye3l9Ll9fcnN1Yl9fKFx2YXJ7eH0pfQotaXMgY2FsbGVkIGlmIFxjb2Rle1x2YXJ7eH0uX19zdWJfXyhcdmFye3l9KX0gcmV0dXJucwotXHZhcntOb3RJbXBsZW1lbnRlZH0uCi0KLU5vdGUgdGhhdCB0ZXJuYXJ5Ci1cZnVuY3Rpb257cG93KCl9XGJpZnVuY2luZGV4e3Bvd30gd2lsbCBub3QgdHJ5IGNhbGxpbmcKLVxtZXRob2R7X19ycG93X18oKX0gKHRoZSBjb2VyY2lvbiBydWxlcyB3b3VsZCBiZWNvbWUgdG9vCi1jb21wbGljYXRlZCkuCi0KLVxub3Rle0lmIHRoZSByaWdodCBvcGVyYW5kJ3MgdHlwZSBpcyBhIHN1YmNsYXNzIG9mIHRoZSBsZWZ0IG9wZXJhbmQncwotICAgICAgdHlwZSBhbmQgdGhhdCBzdWJjbGFzcyBwcm92aWRlcyB0aGUgcmVmbGVjdGVkIG1ldGhvZCBmb3IgdGhlCi0gICAgICBvcGVyYXRpb24sIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSB0aGUgbGVmdCBvcGVyYW5kJ3MKLSAgICAgIG5vbi1yZWZsZWN0ZWQgbWV0aG9kLiAgVGhpcyBiZWhhdmlvciBhbGxvd3Mgc3ViY2xhc3NlcyB0bwotICAgICAgb3ZlcnJpZGUgdGhlaXIgYW5jZXN0b3JzJyBvcGVyYXRpb25zLn0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W251bWVyaWMgb2JqZWN0XXtfX2lhZGRfX317c2VsZiwgb3RoZXJ9Ci1cbWV0aG9kbGluZVtudW1lcmljIG9iamVjdF17X19pc3ViX199e3NlbGYsIG90aGVyfQotXG1ldGhvZGxpbmVbbnVtZXJpYyBvYmplY3Rde19faW11bF9ffXtzZWxmLCBvdGhlcn0KLVxtZXRob2RsaW5lW251bWVyaWMgb2JqZWN0XXtfX2lkaXZfX317c2VsZiwgb3RoZXJ9Ci1cbWV0aG9kbGluZVtudW1lcmljIG9iamVjdF17X19pdHJ1ZWRpdl9ffXtzZWxmLCBvdGhlcn0KLVxtZXRob2RsaW5lW251bWVyaWMgb2JqZWN0XXtfX2lmbG9vcmRpdl9ffXtzZWxmLCBvdGhlcn0KLVxtZXRob2RsaW5lW251bWVyaWMgb2JqZWN0XXtfX2ltb2RfX317c2VsZiwgb3RoZXJ9Ci1cbWV0aG9kbGluZVtudW1lcmljIG9iamVjdF17X19pcG93X199e3NlbGYsIG90aGVyXG9wdGlvbmFseywgbW9kdWxvfX0KLVxtZXRob2RsaW5lW251bWVyaWMgb2JqZWN0XXtfX2lsc2hpZnRfX317c2VsZiwgb3RoZXJ9Ci1cbWV0aG9kbGluZVtudW1lcmljIG9iamVjdF17X19pcnNoaWZ0X199e3NlbGYsIG90aGVyfQotXG1ldGhvZGxpbmVbbnVtZXJpYyBvYmplY3Rde19faWFuZF9ffXtzZWxmLCBvdGhlcn0KLVxtZXRob2RsaW5lW251bWVyaWMgb2JqZWN0XXtfX2l4b3JfX317c2VsZiwgb3RoZXJ9Ci1cbWV0aG9kbGluZVtudW1lcmljIG9iamVjdF17X19pb3JfX317c2VsZiwgb3RoZXJ9Ci1UaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBhdWdtZW50ZWQgYXJpdGhtZXRpYwotb3BlcmF0aW9ucyAoXGNvZGV7Kz19LCBcY29kZXstPX0sIFxjb2Rleyo9fSwgXGNvZGV7Lz19LCBcY29kZXsvLz19LAotXGNvZGV7XCU9fSwgXGNvZGV7Kio9fSwgXGNvZGV7PDw9fSwgXGNvZGV7Pj49fSwgXGNvZGV7XCY9fSwKLVxjb2Rle1x0ZXh0YXNjaWljaXJjdW09fSwgXGNvZGV7fD19KS4gIFRoZXNlIG1ldGhvZHMgc2hvdWxkIGF0dGVtcHQgdG8gZG8gdGhlCi1vcGVyYXRpb24gaW4tcGxhY2UgKG1vZGlmeWluZyBcdmFye3NlbGZ9KSBhbmQgcmV0dXJuIHRoZSByZXN1bHQgKHdoaWNoCi1jb3VsZCBiZSwgYnV0IGRvZXMgbm90IGhhdmUgdG8gYmUsIFx2YXJ7c2VsZn0pLiAgSWYgYSBzcGVjaWZpYyBtZXRob2QKLWlzIG5vdCBkZWZpbmVkLCB0aGUgYXVnbWVudGVkIG9wZXJhdGlvbiBmYWxscyBiYWNrIHRvIHRoZSBub3JtYWwKLW1ldGhvZHMuICBGb3IgaW5zdGFuY2UsIHRvIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uCi1cdmFye3h9XGNvZGV7Kz19XHZhcnt5fSwgd2hlcmUgXHZhcnt4fSBpcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXQKLWhhcyBhbiBcbWV0aG9ke19faWFkZF9fKCl9IG1ldGhvZCwgXGNvZGV7XHZhcnt4fS5fX2lhZGRfXyhcdmFye3l9KX0gaXMKLWNhbGxlZC4gIElmIFx2YXJ7eH0gaXMgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyB0aGF0IGRvZXMgbm90IGRlZmluZSBhCi1cbWV0aG9ke19faWFkZF9fKCl9IG1ldGhvZCwgXGNvZGV7XHZhcnt4fS5fX2FkZF9fKFx2YXJ7eX0pfSBhbmQKLVxjb2Rle1x2YXJ7eX0uX19yYWRkX18oXHZhcnt4fSl9IGFyZSBjb25zaWRlcmVkLCBhcyB3aXRoIHRoZQotZXZhbHVhdGlvbiBvZiBcdmFye3h9XGNvZGV7K31cdmFye3l9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bbnVtZXJpYyBvYmplY3Rde19fbmVnX199e3NlbGZ9Ci1cbWV0aG9kbGluZVtudW1lcmljIG9iamVjdF17X19wb3NfX317c2VsZn0KLVxtZXRob2RsaW5lW251bWVyaWMgb2JqZWN0XXtfX2Fic19ffXtzZWxmfQotXG1ldGhvZGxpbmVbbnVtZXJpYyBvYmplY3Rde19faW52ZXJ0X199e3NlbGZ9Ci1DYWxsZWQgdG8gaW1wbGVtZW50IHRoZSB1bmFyeSBhcml0aG1ldGljIG9wZXJhdGlvbnMgKFxjb2Rley19LAotXGNvZGV7K30sIFxmdW5jdGlvbnthYnMoKX1cYmlmdW5jaW5kZXh7YWJzfSBhbmQgXGNvZGV7XH57fX0pLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bbnVtZXJpYyBvYmplY3Rde19fY29tcGxleF9ffXtzZWxmfQotXG1ldGhvZGxpbmVbbnVtZXJpYyBvYmplY3Rde19faW50X199e3NlbGZ9Ci1cbWV0aG9kbGluZVtudW1lcmljIG9iamVjdF17X19sb25nX199e3NlbGZ9Ci1cbWV0aG9kbGluZVtudW1lcmljIG9iamVjdF17X19mbG9hdF9ffXtzZWxmfQotQ2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zCi1cZnVuY3Rpb257Y29tcGxleCgpfVxiaWZ1bmNpbmRleHtjb21wbGV4fSwKLVxmdW5jdGlvbntpbnQoKX1cYmlmdW5jaW5kZXh7aW50fSwgXGZ1bmN0aW9ue2xvbmcoKX1cYmlmdW5jaW5kZXh7bG9uZ30sCi1hbmQgXGZ1bmN0aW9ue2Zsb2F0KCl9XGJpZnVuY2luZGV4e2Zsb2F0fS4gIFNob3VsZCByZXR1cm4gYSB2YWx1ZSBvZgotdGhlIGFwcHJvcHJpYXRlIHR5cGUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtudW1lcmljIG9iamVjdF17X19pbmRleF9ffXtzZWxmfQotQ2FsbGVkIHRvIGltcGxlbWVudCBcZnVuY3Rpb257b3BlcmF0b3IuaW5kZXgoKX0uICBBbHNvIGNhbGxlZCB3aGVuZXZlcgotUHl0aG9uIG5lZWRzIGFuIGludGVnZXIgb2JqZWN0IChzdWNoIGFzIGluIHNsaWNpbmcsIG9yIGluIHRoZSBidWlsdC1pbgotXGZ1bmN0aW9ue2JpbigpfSwgXGZ1bmN0aW9ue2hleCgpfSBhbmQgXGZ1bmN0aW9ue29jdCgpfSBmdW5jdGlvbnMpLgotTXVzdCByZXR1cm4gYW4gaW50ZWdlciAoaW50IG9yIGxvbmcpLgotXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxzdWJzZWN0aW9ue1dpdGggU3RhdGVtZW50IENvbnRleHQgTWFuYWdlcnNcbGFiZWx7Y29udGV4dC1tYW5hZ2Vyc319Ci0KLVx2ZXJzaW9uYWRkZWR7Mi41fQotCi1BIFxkZm57Y29udGV4dCBtYW5hZ2VyfSBpcyBhbiBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZSBydW50aW1lCi1jb250ZXh0IHRvIGJlIGVzdGFibGlzaGVkIHdoZW4gZXhlY3V0aW5nIGEgXGtleXdvcmR7d2l0aH0KLXN0YXRlbWVudC4gVGhlIGNvbnRleHQgbWFuYWdlciBoYW5kbGVzIHRoZSBlbnRyeSBpbnRvLAotYW5kIHRoZSBleGl0IGZyb20sIHRoZSBkZXNpcmVkIHJ1bnRpbWUgY29udGV4dCBmb3IgdGhlIGV4ZWN1dGlvbgotb2YgdGhlIGJsb2NrIG9mIGNvZGUuICBDb250ZXh0IG1hbmFnZXJzIGFyZSBub3JtYWxseSBpbnZva2VkIHVzaW5nCi10aGUgXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50IChkZXNjcmliZWQgaW4gc2VjdGlvbn5ccmVme3dpdGh9KSwgYnV0Ci1jYW4gYWxzbyBiZSB1c2VkIGJ5IGRpcmVjdGx5IGludm9raW5nIHRoZWlyIG1ldGhvZHMuCi0KLVxzdGluZGV4e3dpdGh9Ci1caW5kZXh7Y29udGV4dCBtYW5hZ2VyfQotCi1UeXBpY2FsIHVzZXMgb2YgY29udGV4dCBtYW5hZ2VycyBpbmNsdWRlIHNhdmluZyBhbmQKLXJlc3RvcmluZyB2YXJpb3VzIGtpbmRzIG9mIGdsb2JhbCBzdGF0ZSwgbG9ja2luZyBhbmQgdW5sb2NraW5nCi1yZXNvdXJjZXMsIGNsb3Npbmcgb3BlbmVkIGZpbGVzLCBldGMuCi0KLUZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGNvbnRleHQgbWFuYWdlcnMsIHNlZQotYGBcdWxpbmt7Q29udGV4dCBUeXBlc317Li4vbGliL3R5cGVjb250ZXh0bWFuYWdlci5odG1sfScnIGluIHRoZQotXGNpdGV0aXRsZVsuLi9saWIvbGliLmh0bWxde1B5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZX0uCi0KLVxiZWdpbnttZXRob2RkZXNjfVtjb250ZXh0IG1hbmFnZXJde19fZW50ZXJfX317c2VsZn0KLUVudGVyIHRoZSBydW50aW1lIGNvbnRleHQgcmVsYXRlZCB0byB0aGlzIG9iamVjdC4gVGhlIFxrZXl3b3Jke3dpdGh9Ci1zdGF0ZW1lbnQgd2lsbCBiaW5kIHRoaXMgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIHRvIHRoZSB0YXJnZXQocykKLXNwZWNpZmllZCBpbiB0aGUgXGtleXdvcmR7YXN9IGNsYXVzZSBvZiB0aGUgc3RhdGVtZW50LCBpZiBhbnkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtjb250ZXh0IG1hbmFnZXJde19fZXhpdF9ffQote3NlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUsIHRyYWNlYmFja30KLUV4aXQgdGhlIHJ1bnRpbWUgY29udGV4dCByZWxhdGVkIHRvIHRoaXMgb2JqZWN0LiBUaGUgcGFyYW1ldGVycwotZGVzY3JpYmUgdGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGUgY29udGV4dCB0byBiZSBleGl0ZWQuIElmCi10aGUgY29udGV4dCB3YXMgZXhpdGVkIHdpdGhvdXQgYW4gZXhjZXB0aW9uLCBhbGwgdGhyZWUgYXJndW1lbnRzCi13aWxsIGJlIFxjb25zdGFudHtOb25lfS4KLQotSWYgYW4gZXhjZXB0aW9uIGlzIHN1cHBsaWVkLCBhbmQgdGhlIG1ldGhvZCB3aXNoZXMgdG8gc3VwcHJlc3MgdGhlCi1leGNlcHRpb24gKGkuZS4sIHByZXZlbnQgaXQgZnJvbSBiZWluZyBwcm9wYWdhdGVkKSwgaXQgc2hvdWxkIHJldHVybiBhCi10cnVlIHZhbHVlLiBPdGhlcndpc2UsIHRoZSBleGNlcHRpb24gd2lsbCBiZSBwcm9jZXNzZWQgbm9ybWFsbHkgdXBvbgotZXhpdCBmcm9tIHRoaXMgbWV0aG9kLgotCi1Ob3RlIHRoYXQgXG1ldGhvZHtfX2V4aXRfX30gbWV0aG9kcyBzaG91bGQgbm90IHJlcmFpc2UgdGhlIHBhc3NlZC1pbgotZXhjZXB0aW9uOyB0aGlzIGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWVwZXB7MDM0M317VGhlICJ3aXRoIiBzdGF0ZW1lbnR9Ci0gICAgICAgICB7VGhlIHNwZWNpZmljYXRpb24sIGJhY2tncm91bmQsIGFuZCBleGFtcGxlcyBmb3IgdGhlCi0gICAgICAgICAgUHl0aG9uIFxrZXl3b3Jke3dpdGh9IHN0YXRlbWVudC59Ci1cZW5ke3NlZWFsc299Ci0KZGlmZiAtLWdpdCBhL0RvYy9yZWYvcmVmNC50ZXggYi9Eb2MvcmVmL3JlZjQudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWM2MGY4Li4wMDAwMDAwCi0tLSBhL0RvYy9yZWYvcmVmNC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotXGNoYXB0ZXJ7RXhlY3V0aW9uIG1vZGVsIFxsYWJlbHtleGVjbW9kZWx9fQotXGluZGV4e2V4ZWN1dGlvbiBtb2RlbH0KLQotCi1cc2VjdGlvbntOYW1pbmcgYW5kIGJpbmRpbmcgXGxhYmVse25hbWluZ319Ci1caW5kZXhpaXtjb2RlfXtibG9ja30KLVxpbmRleHtuYW1lc3BhY2V9Ci1caW5kZXh7c2NvcGV9Ci0KLVxkZm57TmFtZXN9XGluZGV4e25hbWV9IHJlZmVyIHRvIG9iamVjdHMuICBOYW1lcyBhcmUgaW50cm9kdWNlZCBieQotbmFtZSBiaW5kaW5nIG9wZXJhdGlvbnMuICBFYWNoIG9jY3VycmVuY2Ugb2YgYSBuYW1lIGluIHRoZSBwcm9ncmFtCi10ZXh0IHJlZmVycyB0byB0aGUgXGRmbntiaW5kaW5nfVxpbmRleGlpe2JpbmRpbmd9e25hbWV9IG9mIHRoYXQgbmFtZQotZXN0YWJsaXNoZWQgaW4gdGhlIGlubmVybW9zdCBmdW5jdGlvbiBibG9jayBjb250YWluaW5nIHRoZSB1c2UuCi0KLUEgXGRmbntibG9ja31caW5kZXh7YmxvY2t9IGlzIGEgcGllY2Ugb2YgUHl0aG9uIHByb2dyYW0gdGV4dCB0aGF0IGlzCi1leGVjdXRlZCBhcyBhIHVuaXQuICBUaGUgZm9sbG93aW5nIGFyZSBibG9ja3M6IGEgbW9kdWxlLCBhIGZ1bmN0aW9uCi1ib2R5LCBhbmQgYSBjbGFzcyBkZWZpbml0aW9uLiAgRWFjaCBjb21tYW5kIHR5cGVkIGludGVyYWN0aXZlbHkgaXMgYQotYmxvY2suICBBIHNjcmlwdCBmaWxlIChhIGZpbGUgZ2l2ZW4gYXMgc3RhbmRhcmQgaW5wdXQgdG8gdGhlCi1pbnRlcnByZXRlciBvciBzcGVjaWZpZWQgb24gdGhlIGludGVycHJldGVyIGNvbW1hbmQgbGluZSB0aGUgZmlyc3QKLWFyZ3VtZW50KSBpcyBhIGNvZGUgYmxvY2suICBBIHNjcmlwdCBjb21tYW5kIChhIGNvbW1hbmQgc3BlY2lmaWVkIG9uCi10aGUgaW50ZXJwcmV0ZXIgY29tbWFuZCBsaW5lIHdpdGggdGhlIGBcc3Ryb25ney1jfScgb3B0aW9uKSBpcyBhIGNvZGUKLWJsb2NrLiAgVGhlIHN0cmluZyBhcmd1bWVudCBwYXNzZWQgdG8gdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucwotXGZ1bmN0aW9ue2V2YWwoKX0gYW5kIFxmdW5jdGlvbntleGVjKCl9IGlzIGEgY29kZSBibG9jay4KLVRoZSBleHByZXNzaW9uIHJlYWQgYW5kIGV2YWx1YXRlZCBieSB0aGUgYnVpbHQtaW4gZnVuY3Rpb24KLVxmdW5jdGlvbntpbnB1dCgpfSBpcyBhIGNvZGUgYmxvY2suCi0KLUEgY29kZSBibG9jayBpcyBleGVjdXRlZCBpbiBhbiBcZGZue2V4ZWN1dGlvbgotZnJhbWV9XGluZGV4aWl7ZXhlY3V0aW9ufXtmcmFtZX0uICBBIGZyYW1lIGNvbnRhaW5zIHNvbWUKLWFkbWluaXN0cmF0aXZlIGluZm9ybWF0aW9uICh1c2VkIGZvciBkZWJ1Z2dpbmcpIGFuZCBkZXRlcm1pbmVzIHdoZXJlCi1hbmQgaG93IGV4ZWN1dGlvbiBjb250aW51ZXMgYWZ0ZXIgdGhlIGNvZGUgYmxvY2sncyBleGVjdXRpb24gaGFzCi1jb21wbGV0ZWQuCi0KLUEgXGRmbntzY29wZX1caW5kZXh7c2NvcGV9IGRlZmluZXMgdGhlIHZpc2liaWxpdHkgb2YgYSBuYW1lIHdpdGhpbiBhCi1ibG9jay4gIElmIGEgbG9jYWwgdmFyaWFibGUgaXMgZGVmaW5lZCBpbiBhIGJsb2NrLCBpdHMgc2NvcGUgaW5jbHVkZXMKLXRoYXQgYmxvY2suICBJZiB0aGUgZGVmaW5pdGlvbiBvY2N1cnMgaW4gYSBmdW5jdGlvbiBibG9jaywgdGhlIHNjb3BlCi1leHRlbmRzIHRvIGFueSBibG9ja3MgY29udGFpbmVkIHdpdGhpbiB0aGUgZGVmaW5pbmcgb25lLCB1bmxlc3MgYQotY29udGFpbmVkIGJsb2NrIGludHJvZHVjZXMgYSBkaWZmZXJlbnQgYmluZGluZyBmb3IgdGhlIG5hbWUuICBUaGUKLXNjb3BlIG9mIG5hbWVzIGRlZmluZWQgaW4gYSBjbGFzcyBibG9jayBpcyBsaW1pdGVkIHRvIHRoZSBjbGFzcyBibG9jazsKLWl0IGRvZXMgbm90IGV4dGVuZCB0byB0aGUgY29kZSBibG9ja3Mgb2YgbWV0aG9kcy4KLQotV2hlbiBhIG5hbWUgaXMgdXNlZCBpbiBhIGNvZGUgYmxvY2ssIGl0IGlzIHJlc29sdmVkIHVzaW5nIHRoZSBuZWFyZXN0Ci1lbmNsb3Npbmcgc2NvcGUuICBUaGUgc2V0IG9mIGFsbCBzdWNoIHNjb3BlcyB2aXNpYmxlIHRvIGEgY29kZSBibG9jawotaXMgY2FsbGVkIHRoZSBibG9jaydzIFxkZm57ZW52aXJvbm1lbnR9XGluZGV4e2Vudmlyb25tZW50fS4gIAotCi1JZiBhIG5hbWUgaXMgYm91bmQgaW4gYSBibG9jaywgaXQgaXMgYSBsb2NhbCB2YXJpYWJsZSBvZiB0aGF0IGJsb2NrLgotSWYgYSBuYW1lIGlzIGJvdW5kIGF0IHRoZSBtb2R1bGUgbGV2ZWwsIGl0IGlzIGEgZ2xvYmFsIHZhcmlhYmxlLiAgKFRoZQotdmFyaWFibGVzIG9mIHRoZSBtb2R1bGUgY29kZSBibG9jayBhcmUgbG9jYWwgYW5kIGdsb2JhbC4pICBJZiBhCi12YXJpYWJsZSBpcyB1c2VkIGluIGEgY29kZSBibG9jayBidXQgbm90IGRlZmluZWQgdGhlcmUsIGl0IGlzIGEKLVxkZm57ZnJlZSB2YXJpYWJsZX1caW5kZXhpaXtmcmVlfXt2YXJpYWJsZX0uCi0KLVdoZW4gYSBuYW1lIGlzIG5vdCBmb3VuZCBhdCBhbGwsIGEKLVxleGNlcHRpb257TmFtZUVycm9yfVx3aXRoc3ViaXRlbXsoYnVpbHQtaW4KLWV4Y2VwdGlvbil9e1x0dGluZGV4e05hbWVFcnJvcn19IGV4Y2VwdGlvbiBpcyByYWlzZWQuICBJZiB0aGUgbmFtZQotcmVmZXJzIHRvIGEgbG9jYWwgdmFyaWFibGUgdGhhdCBoYXMgbm90IGJlZW4gYm91bmQsIGEKLVxleGNlcHRpb257VW5ib3VuZExvY2FsRXJyb3J9XHR0aW5kZXh7VW5ib3VuZExvY2FsRXJyb3J9IGV4Y2VwdGlvbiBpcwotcmFpc2VkLiAgXGV4Y2VwdGlvbntVbmJvdW5kTG9jYWxFcnJvcn0gaXMgYSBzdWJjbGFzcyBvZgotXGV4Y2VwdGlvbntOYW1lRXJyb3J9LgotCi1UaGUgZm9sbG93aW5nIGNvbnN0cnVjdHMgYmluZCBuYW1lczogZm9ybWFsIHBhcmFtZXRlcnMgdG8gZnVuY3Rpb25zLAotXGtleXdvcmR7aW1wb3J0fSBzdGF0ZW1lbnRzLCBjbGFzcyBhbmQgZnVuY3Rpb24gZGVmaW5pdGlvbnMgKHRoZXNlCi1iaW5kIHRoZSBjbGFzcyBvciBmdW5jdGlvbiBuYW1lIGluIHRoZSBkZWZpbmluZyBibG9jayksIGFuZCB0YXJnZXRzCi10aGF0IGFyZSBpZGVudGlmaWVycyBpZiBvY2N1cnJpbmcgaW4gYW4gYXNzaWdubWVudCwgXGtleXdvcmR7Zm9yfSBsb29wCi1oZWFkZXIsIG9yIGluIHRoZSBzZWNvbmQgcG9zaXRpb24gb2YgYW4gXGtleXdvcmR7ZXhjZXB0fSBjbGF1c2UKLWhlYWRlci4gIFRoZSBca2V5d29yZHtpbXBvcnR9IHN0YXRlbWVudCBvZiB0aGUgZm9ybSBgYFxzYW1we2Zyb20KLVxsZG90cyBpbXBvcnQgKn0nJ1xzdGluZGV4e2Zyb219IGJpbmRzIGFsbCBuYW1lcyBkZWZpbmVkIGluIHRoZQotaW1wb3J0ZWQgbW9kdWxlLCBleGNlcHQgdGhvc2UgYmVnaW5uaW5nIHdpdGggYW4gdW5kZXJzY29yZS4gIFRoaXMgZm9ybQotbWF5IG9ubHkgYmUgdXNlZCBhdCB0aGUgbW9kdWxlIGxldmVsLgotCi1BIHRhcmdldCBvY2N1cnJpbmcgaW4gYSBca2V5d29yZHtkZWx9IHN0YXRlbWVudCBpcyBhbHNvIGNvbnNpZGVyZWQgYm91bmQKLWZvciB0aGlzIHB1cnBvc2UgKHRob3VnaCB0aGUgYWN0dWFsIHNlbWFudGljcyBhcmUgdG8gdW5iaW5kIHRoZQotbmFtZSkuICBJdCBpcyBpbGxlZ2FsIHRvIHVuYmluZCBhIG5hbWUgdGhhdCBpcyByZWZlcmVuY2VkIGJ5IGFuCi1lbmNsb3Npbmcgc2NvcGU7IHRoZSBjb21waWxlciB3aWxsIHJlcG9ydCBhIFxleGNlcHRpb257U3ludGF4RXJyb3J9LgotCi1FYWNoIGFzc2lnbm1lbnQgb3IgaW1wb3J0IHN0YXRlbWVudCBvY2N1cnMgd2l0aGluIGEgYmxvY2sgZGVmaW5lZCBieSBhCi1jbGFzcyBvciBmdW5jdGlvbiBkZWZpbml0aW9uIG9yIGF0IHRoZSBtb2R1bGUgbGV2ZWwgKHRoZSB0b3AtbGV2ZWwKLWNvZGUgYmxvY2spLgotCi1JZiBhIG5hbWUgYmluZGluZyBvcGVyYXRpb24gb2NjdXJzIGFueXdoZXJlIHdpdGhpbiBhIGNvZGUgYmxvY2ssIGFsbAotdXNlcyBvZiB0aGUgbmFtZSB3aXRoaW4gdGhlIGJsb2NrIGFyZSB0cmVhdGVkIGFzIHJlZmVyZW5jZXMgdG8gdGhlCi1jdXJyZW50IGJsb2NrLiAgVGhpcyBjYW4gbGVhZCB0byBlcnJvcnMgd2hlbiBhIG5hbWUgaXMgdXNlZCB3aXRoaW4gYQotYmxvY2sgYmVmb3JlIGl0IGlzIGJvdW5kLgotVGhpcyBydWxlIGlzIHN1YnRsZS4gIFB5dGhvbiBsYWNrcyBkZWNsYXJhdGlvbnMgYW5kIGFsbG93cwotbmFtZSBiaW5kaW5nIG9wZXJhdGlvbnMgdG8gb2NjdXIgYW55d2hlcmUgd2l0aGluIGEgY29kZSBibG9jay4gIFRoZQotbG9jYWwgdmFyaWFibGVzIG9mIGEgY29kZSBibG9jayBjYW4gYmUgZGV0ZXJtaW5lZCBieSBzY2FubmluZyB0aGUKLWVudGlyZSB0ZXh0IG9mIHRoZSBibG9jayBmb3IgbmFtZSBiaW5kaW5nIG9wZXJhdGlvbnMuCi0KLUlmIHRoZSBnbG9iYWwgc3RhdGVtZW50IG9jY3VycyB3aXRoaW4gYSBibG9jaywgYWxsIHVzZXMgb2YgdGhlIG5hbWUKLXNwZWNpZmllZCBpbiB0aGUgc3RhdGVtZW50IHJlZmVyIHRvIHRoZSBiaW5kaW5nIG9mIHRoYXQgbmFtZSBpbiB0aGUKLXRvcC1sZXZlbCBuYW1lc3BhY2UuICBOYW1lcyBhcmUgcmVzb2x2ZWQgaW4gdGhlIHRvcC1sZXZlbCBuYW1lc3BhY2UgYnkKLXNlYXJjaGluZyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSwgaS5lLiB0aGUgbmFtZXNwYWNlIG9mIHRoZSBtb2R1bGUKLWNvbnRhaW5pbmcgdGhlIGNvZGUgYmxvY2ssIGFuZCB0aGUgYnVpbHRpbiBuYW1lc3BhY2UsIHRoZSBuYW1lc3BhY2Ugb2YKLXRoZSBtb2R1bGUgXG1vZHVsZXtfX2J1aWx0aW5fX30uICBUaGUgZ2xvYmFsIG5hbWVzcGFjZSBpcyBzZWFyY2hlZAotZmlyc3QuICBJZiB0aGUgbmFtZSBpcyBub3QgZm91bmQgdGhlcmUsIHRoZSBidWlsdGluIG5hbWVzcGFjZSBpcwotc2VhcmNoZWQuICBUaGUgZ2xvYmFsIHN0YXRlbWVudCBtdXN0IHByZWNlZGUgYWxsIHVzZXMgb2YgdGhlIG5hbWUuCi0KLVRoZSBidWlsdC1pbiBuYW1lc3BhY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBleGVjdXRpb24gb2YgYSBjb2RlIGJsb2NrCi1pcyBhY3R1YWxseSBmb3VuZCBieSBsb29raW5nIHVwIHRoZSBuYW1lIFxjb2Rle19fYnVpbHRpbnNfX30gaW4gaXRzCi1nbG9iYWwgbmFtZXNwYWNlOyB0aGlzIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkgb3IgYSBtb2R1bGUgKGluIHRoZQotbGF0dGVyIGNhc2UgdGhlIG1vZHVsZSdzIGRpY3Rpb25hcnkgaXMgdXNlZCkuICBCeSBkZWZhdWx0LCB3aGVuIGluIHRoZQotXG1vZHVsZXtfX21haW5fX30gbW9kdWxlLCBcY29kZXtfX2J1aWx0aW5zX199IGlzIHRoZSBidWlsdC1pbiBtb2R1bGUKLVxtb2R1bGV7X19idWlsdGluX199IChub3RlOiBubyBgcycpOyB3aGVuIGluIGFueSBvdGhlciBtb2R1bGUsCi1cY29kZXtfX2J1aWx0aW5zX199IGlzIGFuIGFsaWFzIGZvciB0aGUgZGljdGlvbmFyeSBvZiB0aGUKLVxtb2R1bGV7X19idWlsdGluX199IG1vZHVsZSBpdHNlbGYuICBcY29kZXtfX2J1aWx0aW5zX199IGNhbiBiZSBzZXQKLXRvIGEgdXNlci1jcmVhdGVkIGRpY3Rpb25hcnkgdG8gY3JlYXRlIGEgd2VhayBmb3JtIG9mIHJlc3RyaWN0ZWQKLWV4ZWN1dGlvblxpbmRleGlpe3Jlc3RyaWN0ZWR9e2V4ZWN1dGlvbn0uCi0KLVxiZWdpbntub3RpY2V9Ci0gIFVzZXJzIHNob3VsZCBub3QgdG91Y2ggXGNvZGV7X19idWlsdGluc19ffTsgaXQgaXMgc3RyaWN0bHkgYW4KLSAgaW1wbGVtZW50YXRpb24gZGV0YWlsLiAgVXNlcnMgd2FudGluZyB0byBvdmVycmlkZSB2YWx1ZXMgaW4gdGhlCi0gIGJ1aWx0LWluIG5hbWVzcGFjZSBzaG91bGQgXGtleXdvcmR7aW1wb3J0fSB0aGUgXG1vZHVsZXtfX2J1aWx0aW5fX30KLSAgKG5vIGBzJykgbW9kdWxlIGFuZCBtb2RpZnkgaXRzIGF0dHJpYnV0ZXMgYXBwcm9wcmlhdGVseS4KLVxlbmR7bm90aWNlfQotCi1UaGUgbmFtZXNwYWNlIGZvciBhIG1vZHVsZSBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgdGhlIGZpcnN0IHRpbWUgYQotbW9kdWxlIGlzIGltcG9ydGVkLiAgVGhlIG1haW4gbW9kdWxlIGZvciBhIHNjcmlwdCBpcyBhbHdheXMgY2FsbGVkCi1cbW9kdWxle19fbWFpbl9ffVxyZWZiaW1vZGluZGV4e19fbWFpbl9ffS4KLQotVGhlIGdsb2JhbCBzdGF0ZW1lbnQgaGFzIHRoZSBzYW1lIHNjb3BlIGFzIGEgbmFtZSBiaW5kaW5nIG9wZXJhdGlvbgotaW4gdGhlIHNhbWUgYmxvY2suICBJZiB0aGUgbmVhcmVzdCBlbmNsb3Npbmcgc2NvcGUgZm9yIGEgZnJlZSB2YXJpYWJsZQotY29udGFpbnMgYSBnbG9iYWwgc3RhdGVtZW50LCB0aGUgZnJlZSB2YXJpYWJsZSBpcyB0cmVhdGVkIGFzIGEgZ2xvYmFsLgotCi1BIGNsYXNzIGRlZmluaXRpb24gaXMgYW4gZXhlY3V0YWJsZSBzdGF0ZW1lbnQgdGhhdCBtYXkgdXNlIGFuZCBkZWZpbmUKLW5hbWVzLiAgVGhlc2UgcmVmZXJlbmNlcyBmb2xsb3cgdGhlIG5vcm1hbCBydWxlcyBmb3IgbmFtZSByZXNvbHV0aW9uLgotVGhlIG5hbWVzcGFjZSBvZiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBiZWNvbWVzIHRoZSBhdHRyaWJ1dGUgZGljdGlvbmFyeQotb2YgdGhlIGNsYXNzLiAgTmFtZXMgZGVmaW5lZCBhdCB0aGUgY2xhc3Mgc2NvcGUgYXJlIG5vdCB2aXNpYmxlIGluCi1tZXRob2RzLiAKLQotXHN1YnNlY3Rpb257SW50ZXJhY3Rpb24gd2l0aCBkeW5hbWljIGZlYXR1cmVzIFxsYWJlbHtkeW5hbWljLWZlYXR1cmVzfX0KLQotVGhlcmUgYXJlIHNldmVyYWwgY2FzZXMgd2hlcmUgUHl0aG9uIHN0YXRlbWVudHMgYXJlIGlsbGVnYWwgd2hlbgotdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIG5lc3RlZCBzY29wZXMgdGhhdCBjb250YWluIGZyZWUKLXZhcmlhYmxlcy4KLQotSWYgYSB2YXJpYWJsZSBpcyByZWZlcmVuY2VkIGluIGFuIGVuY2xvc2luZyBzY29wZSwgaXQgaXMgaWxsZWdhbAotdG8gZGVsZXRlIHRoZSBuYW1lLiAgQW4gZXJyb3Igd2lsbCBiZSByZXBvcnRlZCBhdCBjb21waWxlIHRpbWUuCi0KLUlmIHRoZSB3aWxkIGNhcmQgZm9ybSBvZiBpbXBvcnQgLS0tIFxzYW1we2ltcG9ydCAqfSAtLS0gaXMgdXNlZCBpbiBhCi1mdW5jdGlvbiBhbmQgdGhlIGZ1bmN0aW9uIGNvbnRhaW5zIG9yIGlzIGEgbmVzdGVkIGJsb2NrIHdpdGggZnJlZQotdmFyaWFibGVzLCB0aGUgY29tcGlsZXIgd2lsbCByYWlzZSBhIFxleGNlcHRpb257U3ludGF4RXJyb3J9LgotCi1UaGUgXGZ1bmN0aW9ue2V2YWwoKX0sIFxmdW5jdGlvbntleGVjKCl9LAotYW5kIFxmdW5jdGlvbntpbnB1dCgpfSBmdW5jdGlvbnMgZG8gbm90IGhhdmUgYWNjZXNzIHRvIHRoZQotZnVsbCBlbnZpcm9ubWVudCBmb3IgcmVzb2x2aW5nIG5hbWVzLiAgTmFtZXMgbWF5IGJlIHJlc29sdmVkIGluIHRoZQotbG9jYWwgYW5kIGdsb2JhbCBuYW1lc3BhY2VzIG9mIHRoZSBjYWxsZXIuICBGcmVlIHZhcmlhYmxlcyBhcmUgbm90Ci1yZXNvbHZlZCBpbiB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgbmFtZXNwYWNlLCBidXQgaW4gdGhlIGdsb2JhbAotbmFtZXNwYWNlLlxmb290bm90ZXtUaGlzIGxpbWl0YXRpb24gb2NjdXJzIGJlY2F1c2UgdGhlIGNvZGUgdGhhdCBpcwotICAgIGV4ZWN1dGVkIGJ5IHRoZXNlIG9wZXJhdGlvbnMgaXMgbm90IGF2YWlsYWJsZSBhdCB0aGUgdGltZSB0aGUKLSAgICBtb2R1bGUgaXMgY29tcGlsZWQufQotVGhlIFxmdW5jdGlvbntleGVjKCl9IGFuZCBcZnVuY3Rpb257ZXZhbCgpfQotZnVuY3Rpb25zIGhhdmUgb3B0aW9uYWwgYXJndW1lbnRzIHRvIG92ZXJyaWRlCi10aGUgZ2xvYmFsIGFuZCBsb2NhbCBuYW1lc3BhY2UuICBJZiBvbmx5IG9uZSBuYW1lc3BhY2UgaXMgc3BlY2lmaWVkLAotaXQgaXMgdXNlZCBmb3IgYm90aC4KLQotXHNlY3Rpb257RXhjZXB0aW9ucyBcbGFiZWx7ZXhjZXB0aW9uc319Ci1caW5kZXh7ZXhjZXB0aW9ufQotCi1FeGNlcHRpb25zIGFyZSBhIG1lYW5zIG9mIGJyZWFraW5nIG91dCBvZiB0aGUgbm9ybWFsIGZsb3cgb2YgY29udHJvbAotb2YgYSBjb2RlIGJsb2NrIGluIG9yZGVyIHRvIGhhbmRsZSBlcnJvcnMgb3Igb3RoZXIgZXhjZXB0aW9uYWwKLWNvbmRpdGlvbnMuICBBbiBleGNlcHRpb24gaXMKLVxlbXBoe3JhaXNlZH1caW5kZXh7cmFpc2UgYW4gZXhjZXB0aW9ufSBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlIGVycm9yCi1pcyBkZXRlY3RlZDsgaXQgbWF5IGJlIFxlbXBoe2hhbmRsZWR9XGluZGV4e2hhbmRsZSBhbiBleGNlcHRpb259IGJ5Ci10aGUgc3Vycm91bmRpbmcgY29kZSBibG9jayBvciBieSBhbnkgY29kZSBibG9jayB0aGF0IGRpcmVjdGx5IG9yCi1pbmRpcmVjdGx5IGludm9rZWQgdGhlIGNvZGUgYmxvY2sgd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkLgotXGluZGV4e2V4Y2VwdGlvbiBoYW5kbGVyfQotXGluZGV4e2Vycm9yc30KLVxpbmRleHtlcnJvciBoYW5kbGluZ30KLQotVGhlIFB5dGhvbiBpbnRlcnByZXRlciByYWlzZXMgYW4gZXhjZXB0aW9uIHdoZW4gaXQgZGV0ZWN0cyBhIHJ1bi10aW1lCi1lcnJvciAoc3VjaCBhcyBkaXZpc2lvbiBieSB6ZXJvKS4gIEEgUHl0aG9uIHByb2dyYW0gY2FuIGFsc28KLWV4cGxpY2l0bHkgcmFpc2UgYW4gZXhjZXB0aW9uIHdpdGggdGhlIFxrZXl3b3Jke3JhaXNlfSBzdGF0ZW1lbnQuCi1FeGNlcHRpb24gaGFuZGxlcnMgYXJlIHNwZWNpZmllZCB3aXRoIHRoZSBca2V5d29yZHt0cnl9IC4uLiBca2V5d29yZHtleGNlcHR9Ci1zdGF0ZW1lbnQuICBUaGUgXGtleXdvcmR7dHJ5fSAuLi4gXGtleXdvcmR7ZmluYWxseX0gc3RhdGVtZW50Ci1zcGVjaWZpZXMgY2xlYW51cCBjb2RlIHdoaWNoIGRvZXMgbm90IGhhbmRsZSB0aGUgZXhjZXB0aW9uLCBidXQgaXMKLWV4ZWN1dGVkIHdoZXRoZXIgYW4gZXhjZXB0aW9uIG9jY3VycmVkIG9yIG5vdCBpbiB0aGUgcHJlY2VkaW5nIGNvZGUuCi0KLVB5dGhvbiB1c2VzIHRoZSBgYHRlcm1pbmF0aW9uJydcaW5kZXh7dGVybWluYXRpb24gbW9kZWx9IG1vZGVsIG9mCi1lcnJvciBoYW5kbGluZzogYW4gZXhjZXB0aW9uIGhhbmRsZXIgY2FuIGZpbmQgb3V0IHdoYXQgaGFwcGVuZWQgYW5kCi1jb250aW51ZSBleGVjdXRpb24gYXQgYW4gb3V0ZXIgbGV2ZWwsIGJ1dCBpdCBjYW5ub3QgcmVwYWlyIHRoZSBjYXVzZQotb2YgdGhlIGVycm9yIGFuZCByZXRyeSB0aGUgZmFpbGluZyBvcGVyYXRpb24gKGV4Y2VwdCBieSByZS1lbnRlcmluZwotdGhlIG9mZmVuZGluZyBwaWVjZSBvZiBjb2RlIGZyb20gdGhlIHRvcCkuCi0KLVdoZW4gYW4gZXhjZXB0aW9uIGlzIG5vdCBoYW5kbGVkIGF0IGFsbCwgdGhlIGludGVycHJldGVyIHRlcm1pbmF0ZXMKLWV4ZWN1dGlvbiBvZiB0aGUgcHJvZ3JhbSwgb3IgcmV0dXJucyB0byBpdHMgaW50ZXJhY3RpdmUgbWFpbiBsb29wLiAgSW4KLWVpdGhlciBjYXNlLCBpdCBwcmludHMgYSBzdGFjayBiYWNrdHJhY2UsIGV4Y2VwdCB3aGVuIHRoZSBleGNlcHRpb24gaXMgCi1cZXhjZXB0aW9ue1N5c3RlbUV4aXR9XHdpdGhzdWJpdGVteyhidWlsdC1pbgotZXhjZXB0aW9uKX17XHR0aW5kZXh7U3lzdGVtRXhpdH19LgotCi1FeGNlcHRpb25zIGFyZSBpZGVudGlmaWVkIGJ5IGNsYXNzIGluc3RhbmNlcy4gIFRoZSBca2V5d29yZHtleGNlcHR9Ci1jbGF1c2UgaXMgc2VsZWN0ZWQgZGVwZW5kaW5nIG9uIHRoZSBjbGFzcyBvZiB0aGUgaW5zdGFuY2U6IGl0IG11c3QKLXJlZmVyZW5jZSB0aGUgY2xhc3Mgb2YgdGhlIGluc3RhbmNlIG9yIGEgYmFzZSBjbGFzcyB0aGVyZW9mLiAgVGhlCi1pbnN0YW5jZSBjYW4gYmUgcmVjZWl2ZWQgYnkgdGhlIGhhbmRsZXIgYW5kIGNhbiBjYXJyeSBhZGRpdGlvbmFsCi1pbmZvcm1hdGlvbiBhYm91dCB0aGUgZXhjZXB0aW9uYWwgY29uZGl0aW9uLgotCi1FeGNlcHRpb25zIGNhbiBhbHNvIGJlIGlkZW50aWZpZWQgYnkgc3RyaW5ncywgaW4gd2hpY2ggY2FzZSB0aGUKLVxrZXl3b3Jke2V4Y2VwdH0gY2xhdXNlIGlzIHNlbGVjdGVkIGJ5IG9iamVjdCBpZGVudGl0eS4gIEFuIGFyYml0cmFyeQotdmFsdWUgY2FuIGJlIHJhaXNlZCBhbG9uZyB3aXRoIHRoZSBpZGVudGlmeWluZyBzdHJpbmcgd2hpY2ggY2FuIGJlCi1wYXNzZWQgdG8gdGhlIGhhbmRsZXIuCi0KLVxiZWdpbntub3RpY2V9W3dhcm5pbmddCi1NZXNzYWdlcyB0byBleGNlcHRpb25zIGFyZSBub3QgcGFydCBvZiB0aGUgUHl0aG9uIEFQSS4gIFRoZWlyIGNvbnRlbnRzIG1heQotY2hhbmdlIGZyb20gb25lIHZlcnNpb24gb2YgUHl0aG9uIHRvIHRoZSBuZXh0IHdpdGhvdXQgd2FybmluZyBhbmQgc2hvdWxkIG5vdAotYmUgcmVsaWVkIG9uIGJ5IGNvZGUgd2hpY2ggd2lsbCBydW4gdW5kZXIgbXVsdGlwbGUgdmVyc2lvbnMgb2YgdGhlCi1pbnRlcnByZXRlci4KLVxlbmR7bm90aWNlfQotCi1TZWUgYWxzbyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIFxrZXl3b3Jke3RyeX0gc3RhdGVtZW50IGluCi1zZWN0aW9uflxyZWZ7dHJ5fSBhbmQgXGtleXdvcmR7cmFpc2V9IHN0YXRlbWVudCBpbgotc2VjdGlvbn5ccmVme3JhaXNlfS4KZGlmZiAtLWdpdCBhL0RvYy9yZWYvcmVmNS50ZXggYi9Eb2MvcmVmL3JlZjUudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWU2NmRlLi4wMDAwMDAwCi0tLSBhL0RvYy9yZWYvcmVmNS50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjczICswLDAgQEAKLVxjaGFwdGVye0V4cHJlc3Npb25zXGxhYmVse2V4cHJlc3Npb25zfX0KLVxpbmRleHtleHByZXNzaW9ufQotCi1UaGlzIGNoYXB0ZXIgZXhwbGFpbnMgdGhlIG1lYW5pbmcgb2YgdGhlIGVsZW1lbnRzIG9mIGV4cHJlc3Npb25zIGluCi1QeXRob24uCi0KLVxzdHJvbmd7U3ludGF4IE5vdGVzOn0gSW4gdGhpcyBhbmQgdGhlIGZvbGxvd2luZyBjaGFwdGVycywgZXh0ZW5kZWQKLUJORlxpbmRleHtCTkZ9IG5vdGF0aW9uIHdpbGwgYmUgdXNlZCB0byBkZXNjcmliZSBzeW50YXgsIG5vdCBsZXhpY2FsCi1hbmFseXNpcy4gIFdoZW4gKG9uZSBhbHRlcm5hdGl2ZSBvZikgYSBzeW50YXggcnVsZSBoYXMgdGhlIGZvcm0KLQotXGJlZ2lue3Byb2R1Y3Rpb25saXN0fVsqXQotICBccHJvZHVjdGlvbntuYW1lfXtcdG9rZW57b3RoZXJuYW1lfX0KLVxlbmR7cHJvZHVjdGlvbmxpc3R9Ci0KLWFuZCBubyBzZW1hbnRpY3MgYXJlIGdpdmVuLCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgZm9ybSBvZiBcY29kZXtuYW1lfQotYXJlIHRoZSBzYW1lIGFzIGZvciBcY29kZXtvdGhlcm5hbWV9LgotXGluZGV4e3N5bnRheH0KLQotCi1cc2VjdGlvbntBcml0aG1ldGljIGNvbnZlcnNpb25zXGxhYmVse2NvbnZlcnNpb25zfX0KLVxpbmRleGlpe2FyaXRobWV0aWN9e2NvbnZlcnNpb259Ci0KLVdoZW4gYSBkZXNjcmlwdGlvbiBvZiBhbiBhcml0aG1ldGljIG9wZXJhdG9yIGJlbG93IHVzZXMgdGhlIHBocmFzZQotYGB0aGUgbnVtZXJpYyBhcmd1bWVudHMgYXJlIGNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlLCcnIHRoZQotYXJndW1lbnRzIGFyZSBjb2VyY2VkIHVzaW5nIHRoZSBjb2VyY2lvbiBydWxlcyBsaXN0ZWQgYXQKLX5ccmVme2NvZXJjaW9uLXJ1bGVzfS4gIElmIGJvdGggYXJndW1lbnRzIGFyZSBzdGFuZGFyZCBudW1lcmljIHR5cGVzLAotdGhlIGZvbGxvd2luZyBjb2VyY2lvbnMgYXJlIGFwcGxpZWQ6Ci0KLVxiZWdpbntpdGVtaXplfQotXGl0ZW0JSWYgZWl0aGVyIGFyZ3VtZW50IGlzIGEgY29tcGxleCBudW1iZXIsIHRoZSBvdGhlciBpcyBjb252ZXJ0ZWQKLQl0byBjb21wbGV4OwotXGl0ZW0Jb3RoZXJ3aXNlLCBpZiBlaXRoZXIgYXJndW1lbnQgaXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIsCi0JdGhlIG90aGVyIGlzIGNvbnZlcnRlZCB0byBmbG9hdGluZyBwb2ludDsKLVxpdGVtCW90aGVyd2lzZSwgaWYgZWl0aGVyIGFyZ3VtZW50IGlzIGEgbG9uZyBpbnRlZ2VyLAotCXRoZSBvdGhlciBpcyBjb252ZXJ0ZWQgdG8gbG9uZyBpbnRlZ2VyOwotXGl0ZW0Jb3RoZXJ3aXNlLCBib3RoIG11c3QgYmUgcGxhaW4gaW50ZWdlcnMgYW5kIG5vIGNvbnZlcnNpb24KLQlpcyBuZWNlc3NhcnkuCi1cZW5ke2l0ZW1pemV9Ci0KLVNvbWUgYWRkaXRpb25hbCBydWxlcyBhcHBseSBmb3IgY2VydGFpbiBvcGVyYXRvcnMgKGUuZy4sIGEgc3RyaW5nIGxlZnQKLWFyZ3VtZW50IHRvIHRoZSBgXCUnIG9wZXJhdG9yKS4gRXh0ZW5zaW9ucyBjYW4gZGVmaW5lIHRoZWlyIG93bgotY29lcmNpb25zLgotCi0KLVxzZWN0aW9ue0F0b21zXGxhYmVse2F0b21zfX0KLVxpbmRleHthdG9tfQotCi1BdG9tcyBhcmUgdGhlIG1vc3QgYmFzaWMgZWxlbWVudHMgb2YgZXhwcmVzc2lvbnMuICBUaGUgc2ltcGxlc3QgYXRvbXMKLWFyZSBpZGVudGlmaWVycyBvciBsaXRlcmFscy4gIEZvcm1zIGVuY2xvc2VkIGluCi1yZXZlcnNlIHF1b3RlcyBvciBpbiBwYXJlbnRoZXNlcywgYnJhY2tldHMgb3IgYnJhY2VzIGFyZSBhbHNvCi1jYXRlZ29yaXplZCBzeW50YWN0aWNhbGx5IGFzIGF0b21zLiAgVGhlIHN5bnRheCBmb3IgYXRvbXMgaXM6Ci0KLVxiZWdpbntwcm9kdWN0aW9ubGlzdH0KLSAgXHByb2R1Y3Rpb257YXRvbX0KLSAgICAgICAgICAgICB7XHRva2Vue2lkZW50aWZpZXJ9IHwgXHRva2Vue2xpdGVyYWx9IHwgXHRva2Vue2VuY2xvc3VyZX19Ci0gIFxwcm9kdWN0aW9ue2VuY2xvc3VyZX0KLSAgICAgICAgICAgICB7XHRva2Vue3BhcmVudGhfZm9ybX0gfCBcdG9rZW57bGlzdF9kaXNwbGF5fX0KLSAgXHByb2R1Y3Rpb25jb250e3wgXHRva2Vue2dlbmVyYXRvcl9leHByZXNzaW9ufSB8IFx0b2tlbntkaWN0X2Rpc3BsYXl9fQotICBccHJvZHVjdGlvbmNvbnR7fCBcdG9rZW57c3RyaW5nX2NvbnZlcnNpb259IHwgXHRva2Vue3lpZWxkX2F0b219fQotXGVuZHtwcm9kdWN0aW9ubGlzdH0KLQotCi1cc3Vic2VjdGlvbntJZGVudGlmaWVycyAoTmFtZXMpXGxhYmVse2F0b20taWRlbnRpZmllcnN9fQotXGluZGV4e25hbWV9Ci1caW5kZXh7aWRlbnRpZmllcn0KLQotQW4gaWRlbnRpZmllciBvY2N1cnJpbmcgYXMgYW4gYXRvbSBpcyBhIG5hbWUuICBTZWUKLXNlY3Rpb24gXHJlZntpZGVudGlmaWVyc30gZm9yIGxleGljYWwgZGVmaW5pdGlvbiBhbmQKLXNlY3Rpb25+XHJlZntuYW1pbmd9IGZvciBkb2N1bWVudGF0aW9uIG9mIG5hbWluZyBhbmQgYmluZGluZy4KLQotV2hlbiB0aGUgbmFtZSBpcyBib3VuZCB0byBhbiBvYmplY3QsIGV2YWx1YXRpb24gb2YgdGhlIGF0b20geWllbGRzCi10aGF0IG9iamVjdC4gIFdoZW4gYSBuYW1lIGlzIG5vdCBib3VuZCwgYW4gYXR0ZW1wdCB0byBldmFsdWF0ZSBpdAotcmFpc2VzIGEgXGV4Y2VwdGlvbntOYW1lRXJyb3J9IGV4Y2VwdGlvbi4KLVxleGluZGV4e05hbWVFcnJvcn0KLQotXHN0cm9uZ3tQcml2YXRlIG5hbWUgbWFuZ2xpbmc6fQotXGluZGV4aWl7bmFtZX17bWFuZ2xpbmd9JQotXGluZGV4aWl7cHJpdmF0ZX17bmFtZXN9JQotV2hlbiBhbiBpZGVudGlmaWVyIHRoYXQgdGV4dHVhbGx5IG9jY3VycyBpbiBhIGNsYXNzIGRlZmluaXRpb24gYmVnaW5zCi13aXRoIHR3byBvciBtb3JlIHVuZGVyc2NvcmUgY2hhcmFjdGVycyBhbmQgZG9lcyBub3QgZW5kIGluIHR3byBvciBtb3JlCi11bmRlcnNjb3JlcywgaXQgaXMgY29uc2lkZXJlZCBhIFxkZm57cHJpdmF0ZSBuYW1lfSBvZiB0aGF0IGNsYXNzLgotUHJpdmF0ZSBuYW1lcyBhcmUgdHJhbnNmb3JtZWQgdG8gYSBsb25nZXIgZm9ybSBiZWZvcmUgY29kZSBpcwotZ2VuZXJhdGVkIGZvciB0aGVtLiAgVGhlIHRyYW5zZm9ybWF0aW9uIGluc2VydHMgdGhlIGNsYXNzIG5hbWUgaW4KLWZyb250IG9mIHRoZSBuYW1lLCB3aXRoIGxlYWRpbmcgdW5kZXJzY29yZXMgcmVtb3ZlZCwgYW5kIGEgc2luZ2xlCi11bmRlcnNjb3JlIGluc2VydGVkIGluIGZyb250IG9mIHRoZSBjbGFzcyBuYW1lLiAgRm9yIGV4YW1wbGUsIHRoZQotaWRlbnRpZmllciBcY29kZXtfX3NwYW19IG9jY3VycmluZyBpbiBhIGNsYXNzIG5hbWVkIFxjb2Rle0hhbX0gd2lsbCBiZQotdHJhbnNmb3JtZWQgdG8gXGNvZGV7X0hhbV9fc3BhbX0uICBUaGlzIHRyYW5zZm9ybWF0aW9uIGlzIGluZGVwZW5kZW50Ci1vZiB0aGUgc3ludGFjdGljYWwgY29udGV4dCBpbiB3aGljaCB0aGUgaWRlbnRpZmllciBpcyB1c2VkLiAgSWYgdGhlCi10cmFuc2Zvcm1lZCBuYW1lIGlzIGV4dHJlbWVseSBsb25nIChsb25nZXIgdGhhbiAyNTUgY2hhcmFjdGVycyksCi1pbXBsZW1lbnRhdGlvbiBkZWZpbmVkIHRydW5jYXRpb24gbWF5IGhhcHBlbi4gIElmIHRoZSBjbGFzcyBuYW1lCi1jb25zaXN0cyBvbmx5IG9mIHVuZGVyc2NvcmVzLCBubyB0cmFuc2Zvcm1hdGlvbiBpcyBkb25lLgotCi0KLVxzdWJzZWN0aW9ue0xpdGVyYWxzXGxhYmVse2F0b20tbGl0ZXJhbHN9fQotXGluZGV4e2xpdGVyYWx9Ci0KLVB5dGhvbiBzdXBwb3J0cyBzdHJpbmcgbGl0ZXJhbHMgYW5kIHZhcmlvdXMgbnVtZXJpYyBsaXRlcmFsczoKLQotXGJlZ2lue3Byb2R1Y3Rpb25saXN0fQotICBccHJvZHVjdGlvbntsaXRlcmFsfQotICAgICAgICAgICAgIHtcdG9rZW57c3RyaW5nbGl0ZXJhbH0gfCBcdG9rZW57aW50ZWdlcn0gfCBcdG9rZW57bG9uZ2ludGVnZXJ9fQotICBccHJvZHVjdGlvbmNvbnR7fCBcdG9rZW57ZmxvYXRudW1iZXJ9IHwgXHRva2Vue2ltYWdudW1iZXJ9fQotXGVuZHtwcm9kdWN0aW9ubGlzdH0KLQotRXZhbHVhdGlvbiBvZiBhIGxpdGVyYWwgeWllbGRzIGFuIG9iamVjdCBvZiB0aGUgZ2l2ZW4gdHlwZSAoc3RyaW5nLAotaW50ZWdlciwgbG9uZyBpbnRlZ2VyLCBmbG9hdGluZyBwb2ludCBudW1iZXIsIGNvbXBsZXggbnVtYmVyKSB3aXRoIHRoZQotZ2l2ZW4gdmFsdWUuICBUaGUgdmFsdWUgbWF5IGJlIGFwcHJveGltYXRlZCBpbiB0aGUgY2FzZSBvZiBmbG9hdGluZwotcG9pbnQgYW5kIGltYWdpbmFyeSAoY29tcGxleCkgbGl0ZXJhbHMuICBTZWUgc2VjdGlvbiBccmVme2xpdGVyYWxzfQotZm9yIGRldGFpbHMuCi0KLUFsbCBsaXRlcmFscyBjb3JyZXNwb25kIHRvIGltbXV0YWJsZSBkYXRhIHR5cGVzLCBhbmQgaGVuY2UgdGhlCi1vYmplY3QncyBpZGVudGl0eSBpcyBsZXNzIGltcG9ydGFudCB0aGFuIGl0cyB2YWx1ZS4gIE11bHRpcGxlCi1ldmFsdWF0aW9ucyBvZiBsaXRlcmFscyB3aXRoIHRoZSBzYW1lIHZhbHVlIChlaXRoZXIgdGhlIHNhbWUKLW9jY3VycmVuY2UgaW4gdGhlIHByb2dyYW0gdGV4dCBvciBhIGRpZmZlcmVudCBvY2N1cnJlbmNlKSBtYXkgb2J0YWluCi10aGUgc2FtZSBvYmplY3Qgb3IgYSBkaWZmZXJlbnQgb2JqZWN0IHdpdGggdGhlIHNhbWUgdmFsdWUuCi1caW5kZXhpaWl7aW1tdXRhYmxlfXtkYXRhfXt0eXBlfQotXGluZGV4aWl7aW1tdXRhYmxlfXtvYmplY3R9Ci0KLQotXHN1YnNlY3Rpb257UGFyZW50aGVzaXplZCBmb3Jtc1xsYWJlbHtwYXJlbnRoZXNpemVkfX0KLVxpbmRleHtwYXJlbnRoZXNpemVkIGZvcm19Ci0KLUEgcGFyZW50aGVzaXplZCBmb3JtIGlzIGFuIG9wdGlvbmFsIGV4cHJlc3Npb24gbGlzdCBlbmNsb3NlZCBpbgotcGFyZW50aGVzZXM6Ci0KLVxiZWdpbntwcm9kdWN0aW9ubGlzdH0KLSAgXHByb2R1Y3Rpb257cGFyZW50aF9mb3JtfQotICAgICAgICAgICAgIHsiKCIgW1x0b2tlbntleHByZXNzaW9uX2xpc3R9XSAiKSJ9Ci1cZW5ke3Byb2R1Y3Rpb25saXN0fQotCi1BIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbiBsaXN0IHlpZWxkcyB3aGF0ZXZlciB0aGF0IGV4cHJlc3Npb24gbGlzdAoteWllbGRzOiBpZiB0aGUgbGlzdCBjb250YWlucyBhdCBsZWFzdCBvbmUgY29tbWEsIGl0IHlpZWxkcyBhIHR1cGxlOwotb3RoZXJ3aXNlLCBpdCB5aWVsZHMgdGhlIHNpbmdsZSBleHByZXNzaW9uIHRoYXQgbWFrZXMgdXAgdGhlCi1leHByZXNzaW9uIGxpc3QuCi0KLUFuIGVtcHR5IHBhaXIgb2YgcGFyZW50aGVzZXMgeWllbGRzIGFuIGVtcHR5IHR1cGxlIG9iamVjdC4gIFNpbmNlCi10dXBsZXMgYXJlIGltbXV0YWJsZSwgdGhlIHJ1bGVzIGZvciBsaXRlcmFscyBhcHBseSAoaS5lLiwgdHdvCi1vY2N1cnJlbmNlcyBvZiB0aGUgZW1wdHkgdHVwbGUgbWF5IG9yIG1heSBub3QgeWllbGQgdGhlIHNhbWUgb2JqZWN0KS4KLVxpbmRleGlpe2VtcHR5fXt0dXBsZX0KLQotTm90ZSB0aGF0IHR1cGxlcyBhcmUgbm90IGZvcm1lZCBieSB0aGUgcGFyZW50aGVzZXMsIGJ1dCByYXRoZXIgYnkgdXNlCi1vZiB0aGUgY29tbWEgb3BlcmF0b3IuICBUaGUgZXhjZXB0aW9uIGlzIHRoZSBlbXB0eSB0dXBsZSwgZm9yIHdoaWNoCi1wYXJlbnRoZXNlcyBcZW1waHthcmV9IHJlcXVpcmVkIC0tLSBhbGxvd2luZyB1bnBhcmVudGhlc2l6ZWQgYGBub3RoaW5nJycKLWluIGV4cHJlc3Npb25zIHdvdWxkIGNhdXNlIGFtYmlndWl0aWVzIGFuZCBhbGxvdyBjb21tb24gdHlwb3MgdG8KLXBhc3MgdW5jYXVnaHQuCi1caW5kZXh7Y29tbWF9Ci1caW5kZXhpaXt0dXBsZX17ZGlzcGxheX0KLQotCi1cc3Vic2VjdGlvbntMaXN0IGRpc3BsYXlzXGxhYmVse2xpc3RzfX0KLVxpbmRleGlpe2xpc3R9e2Rpc3BsYXl9Ci1caW5kZXhpaXtsaXN0fXtjb21wcmVoZW5zaW9uc30KLQotQSBsaXN0IGRpc3BsYXkgaXMgYSBwb3NzaWJseSBlbXB0eSBzZXJpZXMgb2YgZXhwcmVzc2lvbnMgZW5jbG9zZWQgaW4KLXNxdWFyZSBicmFja2V0czoKLQotXGJlZ2lue3Byb2R1Y3Rpb25saXN0fQotICBccHJvZHVjdGlvbntsaXN0X2Rpc3BsYXl9Ci0gICAgICAgICAgICAgeyJbIiBbXHRva2Vue2V4cHJlc3Npb25fbGlzdH0gfCBcdG9rZW57bGlzdF9jb21wcmVoZW5zaW9ufV0gIl0ifQotICBccHJvZHVjdGlvbntsaXN0X2NvbXByZWhlbnNpb259Ci0gICAgICAgICAgICAge1x0b2tlbntleHByZXNzaW9ufSBcdG9rZW57bGlzdF9mb3J9fQotICBccHJvZHVjdGlvbntsaXN0X2Zvcn0KLSAgICAgICAgICAgICB7ImZvciIgXHRva2Vue3RhcmdldF9saXN0fSAiaW4iIFx0b2tlbntvbGRfZXhwcmVzc2lvbl9saXN0fQotICAgICAgICAgICAgICBbXHRva2Vue2xpc3RfaXRlcn1dfQotICBccHJvZHVjdGlvbntvbGRfZXhwcmVzc2lvbl9saXN0fQotICAgICAgICAgICAgIHtcdG9rZW57b2xkX2V4cHJlc3Npb259Ci0gICAgICAgICAgICAgIFsoIiwiIFx0b2tlbntvbGRfZXhwcmVzc2lvbn0pKyBbIiwiXV19Ci0gIFxwcm9kdWN0aW9ue2xpc3RfaXRlcn0KLSAgICAgICAgICAgICB7XHRva2Vue2xpc3RfZm9yfSB8IFx0b2tlbntsaXN0X2lmfX0KLSAgXHByb2R1Y3Rpb257bGlzdF9pZn0KLSAgICAgICAgICAgICB7ImlmIiBcdG9rZW57b2xkX2V4cHJlc3Npb259IFtcdG9rZW57bGlzdF9pdGVyfV19Ci1cZW5ke3Byb2R1Y3Rpb25saXN0fQotCi1BIGxpc3QgZGlzcGxheSB5aWVsZHMgYSBuZXcgbGlzdCBvYmplY3QuICBJdHMgY29udGVudHMgYXJlIHNwZWNpZmllZAotYnkgcHJvdmlkaW5nIGVpdGhlciBhIGxpc3Qgb2YgZXhwcmVzc2lvbnMgb3IgYSBsaXN0IGNvbXByZWhlbnNpb24uCi1caW5kZXhpaXtsaXN0fXtjb21wcmVoZW5zaW9uc30KLVdoZW4gYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBleHByZXNzaW9ucyBpcyBzdXBwbGllZCwgaXRzIGVsZW1lbnRzIGFyZQotZXZhbHVhdGVkIGZyb20gbGVmdCB0byByaWdodCBhbmQgcGxhY2VkIGludG8gdGhlIGxpc3Qgb2JqZWN0IGluIHRoYXQKLW9yZGVyLiAgV2hlbiBhIGxpc3QgY29tcHJlaGVuc2lvbiBpcyBzdXBwbGllZCwgaXQgY29uc2lzdHMgb2YgYQotc2luZ2xlIGV4cHJlc3Npb24gZm9sbG93ZWQgYnkgYXQgbGVhc3Qgb25lIFxrZXl3b3Jke2Zvcn0gY2xhdXNlIGFuZCB6ZXJvIG9yCi1tb3JlIFxrZXl3b3Jke2Zvcn0gb3IgXGtleXdvcmR7aWZ9IGNsYXVzZXMuICBJbiB0aGlzCi1jYXNlLCB0aGUgZWxlbWVudHMgb2YgdGhlIG5ldyBsaXN0IGFyZSB0aG9zZSB0aGF0IHdvdWxkIGJlIHByb2R1Y2VkCi1ieSBjb25zaWRlcmluZyBlYWNoIG9mIHRoZSBca2V5d29yZHtmb3J9IG9yIFxrZXl3b3Jke2lmfSBjbGF1c2VzIGEgYmxvY2ssCi1uZXN0aW5nIGZyb20KLWxlZnQgdG8gcmlnaHQsIGFuZCBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uIHRvIHByb2R1Y2UgYSBsaXN0IGVsZW1lbnQKLWVhY2ggdGltZSB0aGUgaW5uZXJtb3N0IGJsb2NrIGlzIHJlYWNoZWRcZm9vdG5vdGV7SW4gUHl0aG9uIDIuMywgYQotbGlzdCBjb21wcmVoZW5zaW9uICJsZWFrcyIgdGhlIGNvbnRyb2wgdmFyaWFibGVzIG9mIGVhY2gKLVxzYW1we2Zvcn0gaXQgY29udGFpbnMgaW50byB0aGUgY29udGFpbmluZyBzY29wZS4gIEhvd2V2ZXIsIHRoaXMKLWJlaGF2aW9yIGlzIGRlcHJlY2F0ZWQsIGFuZCByZWx5aW5nIG9uIGl0IHdpbGwgbm90IHdvcmsgb25jZSB0aGlzCi1idWcgaXMgZml4ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZX0uCi1cb2JpbmRleHtsaXN0fQotXGluZGV4aWl7ZW1wdHl9e2xpc3R9Ci0KLQotXHN1YnNlY3Rpb257R2VuZXJhdG9yIGV4cHJlc3Npb25zXGxhYmVse2dlbmV4cHJ9fQotXGluZGV4aWl7Z2VuZXJhdG9yfXtleHByZXNzaW9ufQotCi1BIGdlbmVyYXRvciBleHByZXNzaW9uIGlzIGEgY29tcGFjdCBnZW5lcmF0b3Igbm90YXRpb24gaW4gcGFyZW50aGVzZXM6Ci0KLVxiZWdpbntwcm9kdWN0aW9ubGlzdH0KLSAgXHByb2R1Y3Rpb257Z2VuZXJhdG9yX2V4cHJlc3Npb259Ci0gICAgICAgICAgICAgeyIoIiBcdG9rZW57ZXhwcmVzc2lvbn0gXHRva2Vue2dlbmV4cHJfZm9yfSAiKSJ9Ci0gIFxwcm9kdWN0aW9ue2dlbmV4cHJfZm9yfQotICAgICAgICAgICAgIHsiZm9yIiBcdG9rZW57dGFyZ2V0X2xpc3R9ICJpbiIgXHRva2Vue29yX3Rlc3R9Ci0gICAgICAgICAgICAgIFtcdG9rZW57Z2VuZXhwcl9pdGVyfV19Ci0gIFxwcm9kdWN0aW9ue2dlbmV4cHJfaXRlcn0KLSAgICAgICAgICAgICB7XHRva2Vue2dlbmV4cHJfZm9yfSB8IFx0b2tlbntnZW5leHByX2lmfX0KLSAgXHByb2R1Y3Rpb257Z2VuZXhwcl9pZn0KLSAgICAgICAgICAgICB7ImlmIiBcdG9rZW57b2xkX2V4cHJlc3Npb259IFtcdG9rZW57Z2VuZXhwcl9pdGVyfV19Ci1cZW5ke3Byb2R1Y3Rpb25saXN0fQotCi1BIGdlbmVyYXRvciBleHByZXNzaW9uIHlpZWxkcyBhIG5ldyBnZW5lcmF0b3Igb2JqZWN0LgotXG9iaW5kZXh7Z2VuZXJhdG9yfQotSXQgY29uc2lzdHMgb2YgYSBzaW5nbGUgZXhwcmVzc2lvbiBmb2xsb3dlZCBieSBhdCBsZWFzdCBvbmUKLVxrZXl3b3Jke2Zvcn0gY2xhdXNlIGFuZCB6ZXJvIG9yIG1vcmUgXGtleXdvcmR7Zm9yfSBvciBca2V5d29yZHtpZn0KLWNsYXVzZXMuICBUaGUgaXRlcmF0aW5nIHZhbHVlcyBvZiB0aGUgbmV3IGdlbmVyYXRvciBhcmUgdGhvc2UgdGhhdAotd291bGQgYmUgcHJvZHVjZWQgYnkgY29uc2lkZXJpbmcgZWFjaCBvZiB0aGUgXGtleXdvcmR7Zm9yfSBvcgotXGtleXdvcmR7aWZ9IGNsYXVzZXMgYSBibG9jaywgbmVzdGluZyBmcm9tIGxlZnQgdG8gcmlnaHQsIGFuZAotZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbiB0byB5aWVsZCBhIHZhbHVlIHRoYXQgaXMgcmVhY2hlZCB0aGUKLWlubmVybW9zdCBibG9jayBmb3IgZWFjaCBpdGVyYXRpb24uCi0KLVZhcmlhYmxlcyB1c2VkIGluIHRoZSBnZW5lcmF0b3IgZXhwcmVzc2lvbiBhcmUgZXZhbHVhdGVkIGxhemlseQotd2hlbiB0aGUgXG1ldGhvZHtfX25leHRfXygpfSBtZXRob2QgaXMgY2FsbGVkIGZvciBnZW5lcmF0b3Igb2JqZWN0Ci0oaW4gdGhlIHNhbWUgZmFzaGlvbiBhcyBub3JtYWwgZ2VuZXJhdG9ycykuIEhvd2V2ZXIsIHRoZSBsZWZ0bW9zdAotXGtleXdvcmR7Zm9yfSBjbGF1c2UgaXMgaW1tZWRpYXRlbHkgZXZhbHVhdGVkIHNvIHRoYXQgZXJyb3IgcHJvZHVjZWQKLWJ5IGl0IGNhbiBiZSBzZWVuIGJlZm9yZSBhbnkgb3RoZXIgcG9zc2libGUgZXJyb3IgaW4gdGhlIGNvZGUgdGhhdAotaGFuZGxlcyB0aGUgZ2VuZXJhdG9yIGV4cHJlc3Npb24uCi1TdWJzZXF1ZW50IFxrZXl3b3Jke2Zvcn0gY2xhdXNlcyBjYW5ub3QgYmUgZXZhbHVhdGVkIGltbWVkaWF0ZWx5IHNpbmNlCi10aGV5IG1heSBkZXBlbmQgb24gdGhlIHByZXZpb3VzIFxrZXl3b3Jke2Zvcn0gbG9vcC4KLUZvciBleGFtcGxlOiBcc2FtcHsoeCp5IGZvciB4IGluIHJhbmdlKDEwKSBmb3IgeSBpbiBiYXIoeCkpfS4KLQotVGhlIHBhcmVudGhlc2VzIGNhbiBiZSBvbWl0dGVkIG9uIGNhbGxzIHdpdGggb25seSBvbmUgYXJndW1lbnQuCi1TZWUgc2VjdGlvbiBccmVme2NhbGxzfSBmb3IgdGhlIGRldGFpbC4KLQotCi1cc3Vic2VjdGlvbntEaWN0aW9uYXJ5IGRpc3BsYXlzXGxhYmVse2RpY3R9fQotXGluZGV4aWl7ZGljdGlvbmFyeX17ZGlzcGxheX0KLQotQSBkaWN0aW9uYXJ5IGRpc3BsYXkgaXMgYSBwb3NzaWJseSBlbXB0eSBzZXJpZXMgb2Yga2V5L2RhdHVtIHBhaXJzCi1lbmNsb3NlZCBpbiBjdXJseSBicmFjZXM6Ci1caW5kZXh7a2V5fQotXGluZGV4e2RhdHVtfQotXGluZGV4e2tleS9kYXR1bSBwYWlyfQotCi1cYmVnaW57cHJvZHVjdGlvbmxpc3R9Ci0gIFxwcm9kdWN0aW9ue2RpY3RfZGlzcGxheX0KLSAgICAgICAgICAgICB7Ilx7IiBbXHRva2Vue2tleV9kYXR1bV9saXN0fV0gIlx9In0KLSAgXHByb2R1Y3Rpb257a2V5X2RhdHVtX2xpc3R9Ci0gICAgICAgICAgICAge1x0b2tlbntrZXlfZGF0dW19ICgiLCIgXHRva2Vue2tleV9kYXR1bX0pKiBbIiwiXX0KLSAgXHByb2R1Y3Rpb257a2V5X2RhdHVtfQotICAgICAgICAgICAgIHtcdG9rZW57ZXhwcmVzc2lvbn0gIjoiIFx0b2tlbntleHByZXNzaW9ufX0KLVxlbmR7cHJvZHVjdGlvbmxpc3R9Ci0KLUEgZGljdGlvbmFyeSBkaXNwbGF5IHlpZWxkcyBhIG5ldyBkaWN0aW9uYXJ5IG9iamVjdC4KLVxvYmluZGV4e2RpY3Rpb25hcnl9Ci0KLVRoZSBrZXkvZGF0dW0gcGFpcnMgYXJlIGV2YWx1YXRlZCBmcm9tIGxlZnQgdG8gcmlnaHQgdG8gZGVmaW5lIHRoZQotZW50cmllcyBvZiB0aGUgZGljdGlvbmFyeTogZWFjaCBrZXkgb2JqZWN0IGlzIHVzZWQgYXMgYSBrZXkgaW50byB0aGUKLWRpY3Rpb25hcnkgdG8gc3RvcmUgdGhlIGNvcnJlc3BvbmRpbmcgZGF0dW0uCi0KLVJlc3RyaWN0aW9ucyBvbiB0aGUgdHlwZXMgb2YgdGhlIGtleSB2YWx1ZXMgYXJlIGxpc3RlZCBlYXJsaWVyIGluCi1zZWN0aW9uIFxyZWZ7dHlwZXN9LiAgKFRvIHN1bW1hcml6ZSwgdGhlIGtleSB0eXBlIHNob3VsZCBiZSBoYXNoYWJsZSwKLXdoaWNoIGV4Y2x1ZGVzIGFsbCBtdXRhYmxlIG9iamVjdHMuKSAgQ2xhc2hlcyBiZXR3ZWVuIGR1cGxpY2F0ZSBrZXlzCi1hcmUgbm90IGRldGVjdGVkOyB0aGUgbGFzdCBkYXR1bSAodGV4dHVhbGx5IHJpZ2h0bW9zdCBpbiB0aGUgZGlzcGxheSkKLXN0b3JlZCBmb3IgYSBnaXZlbiBrZXkgdmFsdWUgcHJldmFpbHMuCi1caW5kZXhpaXtpbW11dGFibGV9e29iamVjdH0KLQotCi1cc3Vic2VjdGlvbntZaWVsZCBleHByZXNzaW9uc1xsYWJlbHt5aWVsZGV4cHJ9fQotXGt3aW5kZXh7eWllbGR9Ci1caW5kZXhpaXt5aWVsZH17ZXhwcmVzc2lvbn0KLVxpbmRleGlpe2dlbmVyYXRvcn17ZnVuY3Rpb259Ci0KLVxiZWdpbntwcm9kdWN0aW9ubGlzdH0KLSAgXHByb2R1Y3Rpb257eWllbGRfYXRvbX0KLSAgICAgICAgICAgICB7IigiIFx0b2tlbnt5aWVsZF9leHByZXNzaW9ufSAiKSJ9Ci0gIFxwcm9kdWN0aW9ue3lpZWxkX2V4cHJlc3Npb259Ci0gICAgICAgICAgICAgeyJ5aWVsZCIgW1x0b2tlbntleHByZXNzaW9uX2xpc3R9XX0KLVxlbmR7cHJvZHVjdGlvbmxpc3R9Ci0KLVx2ZXJzaW9uYWRkZWR7Mi41fQotCi1UaGUgXGtleXdvcmR7eWllbGR9IGV4cHJlc3Npb24gaXMgb25seSB1c2VkIHdoZW4gZGVmaW5pbmcgYSBnZW5lcmF0b3IKLWZ1bmN0aW9uLCBhbmQgY2FuIG9ubHkgYmUgdXNlZCBpbiB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIGRlZmluaXRpb24uCi1Vc2luZyBhIFxrZXl3b3Jke3lpZWxkfSBleHByZXNzaW9uIGluIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiBpcwotc3VmZmljaWVudCB0byBjYXVzZSB0aGF0IGRlZmluaXRpb24gdG8gY3JlYXRlIGEgZ2VuZXJhdG9yIGZ1bmN0aW9uCi1pbnN0ZWFkIG9mIGEgbm9ybWFsIGZ1bmN0aW9uLgotCi1XaGVuIGEgZ2VuZXJhdG9yIGZ1bmN0aW9uIGlzIGNhbGxlZCwgaXQgcmV0dXJucyBhbiBpdGVyYXRvciBrbm93biBhcyBhCi1nZW5lcmF0b3IuICBUaGF0IGdlbmVyYXRvciB0aGVuIGNvbnRyb2xzIHRoZSBleGVjdXRpb24gb2YgYSBnZW5lcmF0b3IKLWZ1bmN0aW9uLiAgVGhlIGV4ZWN1dGlvbiBzdGFydHMgd2hlbiBvbmUgb2YgdGhlIGdlbmVyYXRvcidzIG1ldGhvZHMgaXMKLWNhbGxlZC4gIEF0IHRoYXQgdGltZSwgdGhlIGV4ZWN1dGlvbiBwcm9jZWVkcyB0byB0aGUgZmlyc3QKLVxrZXl3b3Jke3lpZWxkfSBleHByZXNzaW9uLCB3aGVyZSBpdCBpcyBzdXNwZW5kZWQgYWdhaW4sIHJldHVybmluZyB0aGUKLXZhbHVlIG9mIFxncmFtbWFydG9rZW57ZXhwcmVzc2lvbl9saXN0fSB0byBnZW5lcmF0b3IncyBjYWxsZXIuICBCeQotc3VzcGVuZGVkIHdlIG1lYW4gdGhhdCBhbGwgbG9jYWwgc3RhdGUgaXMgcmV0YWluZWQsIGluY2x1ZGluZyB0aGUKLWN1cnJlbnQgYmluZGluZ3Mgb2YgbG9jYWwgdmFyaWFibGVzLCB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciwgYW5kIHRoZQotaW50ZXJuYWwgZXZhbHVhdGlvbiBzdGFjay4gIFdoZW4gdGhlIGV4ZWN1dGlvbiBpcyByZXN1bWVkIGJ5IGNhbGxpbmcKLW9uZSBvZiB0aGUgZ2VuZXJhdG9yJ3MgbWV0aG9kcywgdGhlIGZ1bmN0aW9uIGNhbiBwcm9jZWVkIGV4YWN0bHkgYXMKLWlmIHRoZSBca2V5d29yZHt5aWVsZH0gZXhwcmVzc2lvbiB3YXMganVzdCBhbm90aGVyIGV4dGVybmFsIGNhbGwuCi1UaGUgdmFsdWUgb2YgdGhlIFxrZXl3b3Jke3lpZWxkfSBleHByZXNzaW9uIGFmdGVyIHJlc3VtaW5nIGRlcGVuZHMgb24KLXRoZSBtZXRob2Qgd2hpY2ggcmVzdW1lZCB0aGUgZXhlY3V0aW9uLgotCi1caW5kZXh7Y29yb3V0aW5lfQotCi1BbGwgb2YgdGhpcyBtYWtlcyBnZW5lcmF0b3IgZnVuY3Rpb25zIHF1aXRlIHNpbWlsYXIgdG8gY29yb3V0aW5lczsgdGhleQoteWllbGQgbXVsdGlwbGUgdGltZXMsIHRoZXkgaGF2ZSBtb3JlIHRoYW4gb25lIGVudHJ5IHBvaW50IGFuZCB0aGVpcgotZXhlY3V0aW9uIGNhbiBiZSBzdXNwZW5kZWQuICBUaGUgb25seSBkaWZmZXJlbmNlIGlzIHRoYXQgYSBnZW5lcmF0b3IKLWZ1bmN0aW9uIGNhbm5vdCBjb250cm9sIHdoZXJlIHNob3VsZCB0aGUgZXhlY3V0aW9uIGNvbnRpbnVlIGFmdGVyIGl0Ci15aWVsZHM7IHRoZSBjb250cm9sIGlzIGFsd2F5cyB0cmFuc2ZlcmVkIHRvIHRoZSBnZW5lcmF0b3IncyBjYWxsZXIuCi0KLVxvYmluZGV4e2dlbmVyYXRvcn0KLQotVGhlIGZvbGxvd2luZyBnZW5lcmF0b3IncyBtZXRob2RzIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbgotb2YgYSBnZW5lcmF0b3IgZnVuY3Rpb246Ci0KLVxleGluZGV4e1N0b3BJdGVyYXRpb259Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtnZW5lcmF0b3Jde25leHR9e30KLSAgU3RhcnRzIHRoZSBleGVjdXRpb24gb2YgYSBnZW5lcmF0b3IgZnVuY3Rpb24gb3IgcmVzdW1lcyBpdCBhdCB0aGUKLSAgbGFzdCBleGVjdXRlZCBca2V5d29yZHt5aWVsZH0gZXhwcmVzc2lvbi4gIFdoZW4gYSBnZW5lcmF0b3IgZnVuY3Rpb24KLSAgaXMgcmVzdW1lZCB3aXRoIGEgXG1ldGhvZHtuZXh0KCl9IG1ldGhvZCwgdGhlIGN1cnJlbnQgXGtleXdvcmR7eWllbGR9Ci0gIGV4cHJlc3Npb24gYWx3YXlzIGV2YWx1YXRlcyB0byBcY29uc3RhbnR7Tm9uZX0uICBUaGUgZXhlY3V0aW9uIHRoZW4KLSAgY29udGludWVzIHRvIHRoZSBuZXh0IFxrZXl3b3Jke3lpZWxkfSBleHByZXNzaW9uLCB3aGVyZSB0aGUgZ2VuZXJhdG9yCi0gIGlzIHN1c3BlbmRlZCBhZ2FpbiwgYW5kIHRoZSB2YWx1ZSBvZiB0aGUKLSAgXGdyYW1tYXJ0b2tlbntleHByZXNzaW9uX2xpc3R9IGlzIHJldHVybmVkIHRvIFxtZXRob2R7bmV4dCgpfSdzCi0gIGNhbGxlci4gSWYgdGhlIGdlbmVyYXRvciBleGl0cyB3aXRob3V0IHlpZWxkaW5nIGFub3RoZXIgdmFsdWUsIGEKLSAgXGV4Y2VwdGlvbntTdG9wSXRlcmF0aW9ufSBleGNlcHRpb24gaXMgcmFpc2VkLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bZ2VuZXJhdG9yXXtzZW5kfXt2YWx1ZX0KLSAgUmVzdW1lcyB0aGUgZXhlY3V0aW9uIGFuZCBgYHNlbmRzJycgYSB2YWx1ZSBpbnRvIHRoZSBnZW5lcmF0b3IKLSAgZnVuY3Rpb24uICBUaGUgXGNvZGV7dmFsdWV9IGFyZ3VtZW50IGJlY29tZXMgdGhlIHJlc3VsdCBvZiB0aGUKLSAgY3VycmVudCBca2V5d29yZHt5aWVsZH0gZXhwcmVzc2lvbi4gIFRoZSBcbWV0aG9ke3NlbmQoKX0gbWV0aG9kCi0gIHJldHVybnMgdGhlIG5leHQgdmFsdWUgeWllbGRlZCBieSB0aGUgZ2VuZXJhdG9yLCBvciByYWlzZXMKLSAgXGV4Y2VwdGlvbntTdG9wSXRlcmF0aW9ufSBpZiB0aGUgZ2VuZXJhdG9yIGV4aXRzIHdpdGhvdXQgeWllbGRpbmcKLSAgYW5vdGhlciB2YWx1ZS4KLSAgV2hlbiBcbWV0aG9ke3NlbmQoKX0gaXMgY2FsbGVkIHRvIHN0YXJ0IHRoZSBnZW5lcmF0b3IsIGl0IG11c3QgYmUKLSAgY2FsbGVkIHdpdGggXGNvbnN0YW50e05vbmV9IGFzIHRoZSBhcmd1bWVudCwgYmVjYXVzZSB0aGVyZSBpcyBubwotICBca2V5d29yZHt5aWVsZH0gZXhwcmVzc2lvbiB0aGF0IGNvdWxkIHJlY2VpZXZlIHRoZSB2YWx1ZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2dlbmVyYXRvcl17dGhyb3d9Ci0gICAgICAgICAgICAgICAgICB7dHlwZVxvcHRpb25hbHssIHZhbHVlXG9wdGlvbmFseywgdHJhY2ViYWNrfX19Ci0gIFJhaXNlcyBhbiBleGNlcHRpb24gb2YgdHlwZSBcY29kZXt0eXBlfSBhdCB0aGUgcG9pbnQgd2hlcmUgZ2VuZXJhdG9yCi0gIHdhcyBwYXVzZWQsIGFuZCByZXR1cm5zIHRoZSBuZXh0IHZhbHVlIHlpZWxkZWQgYnkgdGhlIGdlbmVyYXRvcgotICBmdW5jdGlvbi4gIElmIHRoZSBnZW5lcmF0b3IgZXhpdHMgd2l0aG91dCB5aWVsZGluZyBhbm90aGVyIHZhbHVlLCBhCi0gIFxleGNlcHRpb257U3RvcEl0ZXJhdGlvbn0gZXhjZXB0aW9uIGlzIHJhaXNlZC4gIElmIHRoZSBnZW5lcmF0b3IKLSAgZnVuY3Rpb24gZG9lcyBub3QgY2F0Y2ggdGhlIHBhc3NlZC1pbiBleGNlcHRpb24sIG9yIHJhaXNlcyBhCi0gIGRpZmZlcmVudCBleGNlcHRpb24sIHRoZW4gdGhhdCBleGNlcHRpb24gcHJvcGFnYXRlcyB0byB0aGUgY2FsbGVyLgotXGVuZHttZXRob2RkZXNjfQotCi1cZXhpbmRleHtHZW5lcmF0b3JFeGl0fQotCi1cYmVnaW57bWV0aG9kZGVzY31bZ2VuZXJhdG9yXXtjbG9zZX17fQotICBSYWlzZXMgYSBcZXhjZXB0aW9ue0dlbmVyYXRvckV4aXR9IGF0IHRoZSBwb2ludCB3aGVyZSB0aGUgZ2VuZXJhdG9yCi0gIGZ1bmN0aW9uIHdhcyBwYXVzZWQuICBJZiB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uIHRoZW4gcmFpc2VzCi0gIFxleGNlcHRpb257U3RvcEl0ZXJhdGlvbn0gKGJ5IGV4aXRpbmcgbm9ybWFsbHksIG9yIGR1ZSB0byBhbHJlYWR5Ci0gIGJlaW5nIGNsb3NlZCkgb3IgXGV4Y2VwdGlvbntHZW5lcmF0b3JFeGl0fSAoYnkgbm90IGNhdGNoaW5nIHRoZQotICBleGNlcHRpb24pLCBjbG9zZSByZXR1cm5zIHRvIGl0cyBjYWxsZXIuICBJZiB0aGUgZ2VuZXJhdG9yIHlpZWxkcyBhCi0gIHZhbHVlLCBhIFxleGNlcHRpb257UnVudGltZUVycm9yfSBpcyByYWlzZWQuICBJZiB0aGUgZ2VuZXJhdG9yIHJhaXNlcwotICBhbnkgb3RoZXIgZXhjZXB0aW9uLCBpdCBpcyBwcm9wYWdhdGVkIHRvIHRoZSBjYWxsZXIuICBcbWV0aG9ke2Nsb3NlfQotICBkb2VzIG5vdGhpbmcgaWYgdGhlIGdlbmVyYXRvciBoYXMgYWxyZWFkeSBleGl0ZWQgZHVlIHRvIGFuIGV4Y2VwdGlvbgotICBvciBub3JtYWwgZXhpdC4KLVxlbmR7bWV0aG9kZGVzY30KLQotSGVyZSBpcyBhIHNpbXBsZSBleGFtcGxlIHRoYXQgZGVtb25zdHJhdGVzIHRoZSBiZWhhdmlvciBvZiBnZW5lcmF0b3JzCi1hbmQgZ2VuZXJhdG9yIGZ1bmN0aW9uczoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGRlZiBlY2hvKHZhbHVlPU5vbmUpOgotLi4uICAgICBwcmludCAiRXhlY3V0aW9uIHN0YXJ0cyB3aGVuICduZXh0KCknIGlzIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUuIgotLi4uICAgICB0cnk6Ci0uLi4gICAgICAgICB3aGlsZSBUcnVlOgotLi4uICAgICAgICAgICAgIHRyeToKLS4uLiAgICAgICAgICAgICAgICAgdmFsdWUgPSAoeWllbGQgdmFsdWUpCi0uLi4gICAgICAgICAgICAgZXhjZXB0IEdlbmVyYXRvckV4aXQ6Ci0uLi4gICAgICAgICAgICAgICAgICMgbmV2ZXIgY2F0Y2ggR2VuZXJhdG9yRXhpdAotLi4uICAgICAgICAgICAgICAgICByYWlzZQotLi4uICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6Ci0uLi4gICAgICAgICAgICAgICAgIHZhbHVlID0gZQotLi4uICAgICBmaW5hbGx5OgotLi4uICAgICAgICAgcHJpbnQgIkRvbid0IGZvcmdldCB0byBjbGVhbiB1cCB3aGVuICdjbG9zZSgpJyBpcyBjYWxsZWQuIgotLi4uCi0+Pj4gZ2VuZXJhdG9yID0gZWNobygxKQotPj4+IHByaW50IGdlbmVyYXRvci5uZXh0KCkKLUV4ZWN1dGlvbiBzdGFydHMgd2hlbiAnbmV4dCgpJyBpcyBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lLgotMQotPj4+IHByaW50IGdlbmVyYXRvci5uZXh0KCkKLU5vbmUKLT4+PiBwcmludCBnZW5lcmF0b3Iuc2VuZCgyKQotMgotPj4+IGdlbmVyYXRvci50aHJvdyhUeXBlRXJyb3IsICJzcGFtIikKLVR5cGVFcnJvcignc3BhbScsKQotPj4+IGdlbmVyYXRvci5jbG9zZSgpCi1Eb24ndCBmb3JnZXQgdG8gY2xlYW4gdXAgd2hlbiAnY2xvc2UoKScgaXMgY2FsbGVkLgotXGVuZHt2ZXJiYXRpbX0KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWVwZXB7MDM0Mn17Q29yb3V0aW5lcyB2aWEgRW5oYW5jZWQgR2VuZXJhdG9yc30KLSAgICAgICAgIHtUaGUgcHJvcG9zYWwgdG8gZW5oYW5jZSB0aGUgQVBJIGFuZCBzeW50YXggb2YgZ2VuZXJhdG9ycywKLSAgICAgICAgICBtYWtpbmcgdGhlbSB1c2FibGUgYXMgc2ltcGxlIGNvcm91dGluZXMufQotXGVuZHtzZWVhbHNvfQotCi0KLVxzZWN0aW9ue1ByaW1hcmllc1xsYWJlbHtwcmltYXJpZXN9fQotXGluZGV4e3ByaW1hcnl9Ci0KLVByaW1hcmllcyByZXByZXNlbnQgdGhlIG1vc3QgdGlnaHRseSBib3VuZCBvcGVyYXRpb25zIG9mIHRoZSBsYW5ndWFnZS4KLVRoZWlyIHN5bnRheCBpczoKLQotXGJlZ2lue3Byb2R1Y3Rpb25saXN0fQotICBccHJvZHVjdGlvbntwcmltYXJ5fQotICAgICAgICAgICAgIHtcdG9rZW57YXRvbX0gfCBcdG9rZW57YXR0cmlidXRlcmVmfQotICAgICAgICAgICAgICB8IFx0b2tlbntzdWJzY3JpcHRpb259IHwgXHRva2Vue3NsaWNpbmd9IHwgXHRva2Vue2NhbGx9fQotXGVuZHtwcm9kdWN0aW9ubGlzdH0KLQotCi1cc3Vic2VjdGlvbntBdHRyaWJ1dGUgcmVmZXJlbmNlc1xsYWJlbHthdHRyaWJ1dGUtcmVmZXJlbmNlc319Ci1caW5kZXhpaXthdHRyaWJ1dGV9e3JlZmVyZW5jZX0KLQotQW4gYXR0cmlidXRlIHJlZmVyZW5jZSBpcyBhIHByaW1hcnkgZm9sbG93ZWQgYnkgYSBwZXJpb2QgYW5kIGEgbmFtZToKLQotXGJlZ2lue3Byb2R1Y3Rpb25saXN0fQotICBccHJvZHVjdGlvbnthdHRyaWJ1dGVyZWZ9Ci0gICAgICAgICAgICAge1x0b2tlbntwcmltYXJ5fSAiLiIgXHRva2Vue2lkZW50aWZpZXJ9fQotXGVuZHtwcm9kdWN0aW9ubGlzdH0KLQotVGhlIHByaW1hcnkgbXVzdCBldmFsdWF0ZSB0byBhbiBvYmplY3Qgb2YgYSB0eXBlIHRoYXQgc3VwcG9ydHMKLWF0dHJpYnV0ZSByZWZlcmVuY2VzLCBlLmcuLCBhIG1vZHVsZSwgbGlzdCwgb3IgYW4gaW5zdGFuY2UuICBUaGlzCi1vYmplY3QgaXMgdGhlbiBhc2tlZCB0byBwcm9kdWNlIHRoZSBhdHRyaWJ1dGUgd2hvc2UgbmFtZSBpcyB0aGUKLWlkZW50aWZpZXIuICBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3QgYXZhaWxhYmxlLCB0aGUgZXhjZXB0aW9uCi1cZXhjZXB0aW9ue0F0dHJpYnV0ZUVycm9yfVxleGluZGV4e0F0dHJpYnV0ZUVycm9yfSBpcyByYWlzZWQuCi1PdGhlcndpc2UsIHRoZSB0eXBlIGFuZCB2YWx1ZSBvZiB0aGUgb2JqZWN0IHByb2R1Y2VkIGlzIGRldGVybWluZWQgYnkKLXRoZSBvYmplY3QuICBNdWx0aXBsZSBldmFsdWF0aW9ucyBvZiB0aGUgc2FtZSBhdHRyaWJ1dGUgcmVmZXJlbmNlIG1heQoteWllbGQgZGlmZmVyZW50IG9iamVjdHMuCi1cb2JpbmRleHttb2R1bGV9Ci1cb2JpbmRleHtsaXN0fQotCi0KLVxzdWJzZWN0aW9ue1N1YnNjcmlwdGlvbnNcbGFiZWx7c3Vic2NyaXB0aW9uc319Ci1caW5kZXh7c3Vic2NyaXB0aW9ufQotCi1BIHN1YnNjcmlwdGlvbiBzZWxlY3RzIGFuIGl0ZW0gb2YgYSBzZXF1ZW5jZSAoc3RyaW5nLCB0dXBsZSBvciBsaXN0KQotb3IgbWFwcGluZyAoZGljdGlvbmFyeSkgb2JqZWN0OgotXG9iaW5kZXh7c2VxdWVuY2V9Ci1cb2JpbmRleHttYXBwaW5nfQotXG9iaW5kZXh7c3RyaW5nfQotXG9iaW5kZXh7dHVwbGV9Ci1cb2JpbmRleHtsaXN0fQotXG9iaW5kZXh7ZGljdGlvbmFyeX0KLVxpbmRleGlpe3NlcXVlbmNlfXtpdGVtfQotCi1cYmVnaW57cHJvZHVjdGlvbmxpc3R9Ci0gIFxwcm9kdWN0aW9ue3N1YnNjcmlwdGlvbn0KLSAgICAgICAgICAgICB7XHRva2Vue3ByaW1hcnl9ICJbIiBcdG9rZW57ZXhwcmVzc2lvbl9saXN0fSAiXSJ9Ci1cZW5ke3Byb2R1Y3Rpb25saXN0fQotCi1UaGUgcHJpbWFyeSBtdXN0IGV2YWx1YXRlIHRvIGFuIG9iamVjdCBvZiBhIHNlcXVlbmNlIG9yIG1hcHBpbmcgdHlwZS4KLQotSWYgdGhlIHByaW1hcnkgaXMgYSBtYXBwaW5nLCB0aGUgZXhwcmVzc2lvbiBsaXN0IG11c3QgZXZhbHVhdGUgdG8gYW4KLW9iamVjdCB3aG9zZSB2YWx1ZSBpcyBvbmUgb2YgdGhlIGtleXMgb2YgdGhlIG1hcHBpbmcsIGFuZCB0aGUKLXN1YnNjcmlwdGlvbiBzZWxlY3RzIHRoZSB2YWx1ZSBpbiB0aGUgbWFwcGluZyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoYXQKLWtleS4gIChUaGUgZXhwcmVzc2lvbiBsaXN0IGlzIGEgdHVwbGUgZXhjZXB0IGlmIGl0IGhhcyBleGFjdGx5IG9uZQotaXRlbS4pCi0KLUlmIHRoZSBwcmltYXJ5IGlzIGEgc2VxdWVuY2UsIHRoZSBleHByZXNzaW9uIChsaXN0KSBtdXN0IGV2YWx1YXRlIHRvIGEKLXBsYWluIGludGVnZXIuICBJZiB0aGlzIHZhbHVlIGlzIG5lZ2F0aXZlLCB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZQotaXMgYWRkZWQgdG8gaXQgKHNvIHRoYXQsIGUuZy4sIFxjb2Rle3hbLTFdfSBzZWxlY3RzIHRoZSBsYXN0IGl0ZW0gb2YKLVxjb2Rle3h9LikgIFRoZSByZXN1bHRpbmcgdmFsdWUgbXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXIgbGVzcwotdGhhbiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBzZXF1ZW5jZSwgYW5kIHRoZSBzdWJzY3JpcHRpb24gc2VsZWN0cwotdGhlIGl0ZW0gd2hvc2UgaW5kZXggaXMgdGhhdCB2YWx1ZSAoY291bnRpbmcgZnJvbSB6ZXJvKS4KLQotQSBzdHJpbmcncyBpdGVtcyBhcmUgY2hhcmFjdGVycy4gIEEgY2hhcmFjdGVyIGlzIG5vdCBhIHNlcGFyYXRlIGRhdGEKLXR5cGUgYnV0IGEgc3RyaW5nIG9mIGV4YWN0bHkgb25lIGNoYXJhY3Rlci4KLVxpbmRleHtjaGFyYWN0ZXJ9Ci1caW5kZXhpaXtzdHJpbmd9e2l0ZW19Ci0KLQotXHN1YnNlY3Rpb257U2xpY2luZ3NcbGFiZWx7c2xpY2luZ3N9fQotXGluZGV4e3NsaWNpbmd9Ci1caW5kZXh7c2xpY2V9Ci0KLUEgc2xpY2luZyBzZWxlY3RzIGEgcmFuZ2Ugb2YgaXRlbXMgaW4gYSBzZXF1ZW5jZSBvYmplY3QgKGUuZy4sIGEKLXN0cmluZywgdHVwbGUgb3IgbGlzdCkuICBTbGljaW5ncyBtYXkgYmUgdXNlZCBhcyBleHByZXNzaW9ucyBvciBhcwotdGFyZ2V0cyBpbiBhc3NpZ25tZW50IG9yIFxrZXl3b3Jke2RlbH0gc3RhdGVtZW50cy4gIFRoZSBzeW50YXggZm9yIGEKLXNsaWNpbmc6Ci1cb2JpbmRleHtzZXF1ZW5jZX0KLVxvYmluZGV4e3N0cmluZ30KLVxvYmluZGV4e3R1cGxlfQotXG9iaW5kZXh7bGlzdH0KLQotXGJlZ2lue3Byb2R1Y3Rpb25saXN0fQotICBccHJvZHVjdGlvbntzbGljaW5nfQotICAgICAgICAgICAgIHtcdG9rZW57c2ltcGxlX3NsaWNpbmd9IHwgXHRva2Vue2V4dGVuZGVkX3NsaWNpbmd9fQotICBccHJvZHVjdGlvbntzaW1wbGVfc2xpY2luZ30KLSAgICAgICAgICAgICB7XHRva2Vue3ByaW1hcnl9ICJbIiBcdG9rZW57c2hvcnRfc2xpY2V9ICJdIn0KLSAgXHByb2R1Y3Rpb257ZXh0ZW5kZWRfc2xpY2luZ30KLSAgICAgICAgICAgICB7XHRva2Vue3ByaW1hcnl9ICJbIiBcdG9rZW57c2xpY2VfbGlzdH0gIl0iIH0KLSAgXHByb2R1Y3Rpb257c2xpY2VfbGlzdH0KLSAgICAgICAgICAgICB7XHRva2Vue3NsaWNlX2l0ZW19ICgiLCIgXHRva2Vue3NsaWNlX2l0ZW19KSogWyIsIl19Ci0gIFxwcm9kdWN0aW9ue3NsaWNlX2l0ZW19Ci0gICAgICAgICAgICAge1x0b2tlbntleHByZXNzaW9ufSB8IFx0b2tlbntwcm9wZXJfc2xpY2V9IHwgXHRva2Vue2VsbGlwc2lzfX0KLSAgXHByb2R1Y3Rpb257cHJvcGVyX3NsaWNlfQotICAgICAgICAgICAgIHtcdG9rZW57c2hvcnRfc2xpY2V9IHwgXHRva2Vue2xvbmdfc2xpY2V9fQotICBccHJvZHVjdGlvbntzaG9ydF9zbGljZX0KLSAgICAgICAgICAgICB7W1x0b2tlbntsb3dlcl9ib3VuZH1dICI6IiBbXHRva2Vue3VwcGVyX2JvdW5kfV19Ci0gIFxwcm9kdWN0aW9ue2xvbmdfc2xpY2V9Ci0gICAgICAgICAgICAge1x0b2tlbntzaG9ydF9zbGljZX0gIjoiIFtcdG9rZW57c3RyaWRlfV19Ci0gIFxwcm9kdWN0aW9ue2xvd2VyX2JvdW5kfQotICAgICAgICAgICAgIHtcdG9rZW57ZXhwcmVzc2lvbn19Ci0gIFxwcm9kdWN0aW9ue3VwcGVyX2JvdW5kfQotICAgICAgICAgICAgIHtcdG9rZW57ZXhwcmVzc2lvbn19Ci0gIFxwcm9kdWN0aW9ue3N0cmlkZX0KLSAgICAgICAgICAgICB7XHRva2Vue2V4cHJlc3Npb259fQotICBccHJvZHVjdGlvbntlbGxpcHNpc30KLSAgICAgICAgICAgICB7Ii4uLiJ9Ci1cZW5ke3Byb2R1Y3Rpb25saXN0fQotCi1UaGVyZSBpcyBhbWJpZ3VpdHkgaW4gdGhlIGZvcm1hbCBzeW50YXggaGVyZTogYW55dGhpbmcgdGhhdCBsb29rcyBsaWtlCi1hbiBleHByZXNzaW9uIGxpc3QgYWxzbyBsb29rcyBsaWtlIGEgc2xpY2UgbGlzdCwgc28gYW55IHN1YnNjcmlwdGlvbgotY2FuIGJlIGludGVycHJldGVkIGFzIGEgc2xpY2luZy4gIFJhdGhlciB0aGFuIGZ1cnRoZXIgY29tcGxpY2F0aW5nIHRoZQotc3ludGF4LCB0aGlzIGlzIGRpc2FtYmlndWF0ZWQgYnkgZGVmaW5pbmcgdGhhdCBpbiB0aGlzIGNhc2UgdGhlCi1pbnRlcnByZXRhdGlvbiBhcyBhIHN1YnNjcmlwdGlvbiB0YWtlcyBwcmlvcml0eSBvdmVyIHRoZQotaW50ZXJwcmV0YXRpb24gYXMgYSBzbGljaW5nICh0aGlzIGlzIHRoZSBjYXNlIGlmIHRoZSBzbGljZSBsaXN0Ci1jb250YWlucyBubyBwcm9wZXIgc2xpY2Ugbm9yIGVsbGlwc2VzKS4gIFNpbWlsYXJseSwgd2hlbiB0aGUgc2xpY2UKLWxpc3QgaGFzIGV4YWN0bHkgb25lIHNob3J0IHNsaWNlIGFuZCBubyB0cmFpbGluZyBjb21tYSwgdGhlCi1pbnRlcnByZXRhdGlvbiBhcyBhIHNpbXBsZSBzbGljaW5nIHRha2VzIHByaW9yaXR5IG92ZXIgdGhhdCBhcyBhbgotZXh0ZW5kZWQgc2xpY2luZy5caW5kZXhpaXtleHRlbmRlZH17c2xpY2luZ30KLQotVGhlIHNlbWFudGljcyBmb3IgYSBzaW1wbGUgc2xpY2luZyBhcmUgYXMgZm9sbG93cy4gIFRoZSBwcmltYXJ5IG11c3QKLWV2YWx1YXRlIHRvIGEgc2VxdWVuY2Ugb2JqZWN0LiAgVGhlIGxvd2VyIGFuZCB1cHBlciBib3VuZCBleHByZXNzaW9ucywKLWlmIHByZXNlbnQsIG11c3QgZXZhbHVhdGUgdG8gcGxhaW4gaW50ZWdlcnM7IGRlZmF1bHRzIGFyZSB6ZXJvIGFuZCB0aGUKLVxjb2Rle3N5cy5tYXhpbnR9LCByZXNwZWN0aXZlbHkuICBJZiBlaXRoZXIgYm91bmQgaXMgbmVnYXRpdmUsIHRoZQotc2VxdWVuY2UncyBsZW5ndGggaXMgYWRkZWQgdG8gaXQuICBUaGUgc2xpY2luZyBub3cgc2VsZWN0cyBhbGwgaXRlbXMKLXdpdGggaW5kZXggXHZhcntrfSBzdWNoIHRoYXQKLVxjb2Rle1x2YXJ7aX0gPD0gXHZhcntrfSA8IFx2YXJ7an19IHdoZXJlIFx2YXJ7aX0KLWFuZCBcdmFye2p9IGFyZSB0aGUgc3BlY2lmaWVkIGxvd2VyIGFuZCB1cHBlciBib3VuZHMuICBUaGlzIG1heSBiZSBhbgotZW1wdHkgc2VxdWVuY2UuICBJdCBpcyBub3QgYW4gZXJyb3IgaWYgXHZhcntpfSBvciBcdmFye2p9IGxpZSBvdXRzaWRlIHRoZQotcmFuZ2Ugb2YgdmFsaWQgaW5kZXhlcyAoc3VjaCBpdGVtcyBkb24ndCBleGlzdCBzbyB0aGV5IGFyZW4ndAotc2VsZWN0ZWQpLgotCi1UaGUgc2VtYW50aWNzIGZvciBhbiBleHRlbmRlZCBzbGljaW5nIGFyZSBhcyBmb2xsb3dzLiAgVGhlIHByaW1hcnkKLW11c3QgZXZhbHVhdGUgdG8gYSBtYXBwaW5nIG9iamVjdCwgYW5kIGl0IGlzIGluZGV4ZWQgd2l0aCBhIGtleSB0aGF0Ci1pcyBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBzbGljZSBsaXN0LCBhcyBmb2xsb3dzLiAgSWYgdGhlIHNsaWNlIGxpc3QKLWNvbnRhaW5zIGF0IGxlYXN0IG9uZSBjb21tYSwgdGhlIGtleSBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlCi1jb252ZXJzaW9uIG9mIHRoZSBzbGljZSBpdGVtczsgb3RoZXJ3aXNlLCB0aGUgY29udmVyc2lvbiBvZiB0aGUgbG9uZQotc2xpY2UgaXRlbSBpcyB0aGUga2V5LiAgVGhlIGNvbnZlcnNpb24gb2YgYSBzbGljZSBpdGVtIHRoYXQgaXMgYW4KLWV4cHJlc3Npb24gaXMgdGhhdCBleHByZXNzaW9uLiAgVGhlIGNvbnZlcnNpb24gb2YgYQotcHJvcGVyIHNsaWNlIGlzIGEgc2xpY2Ugb2JqZWN0IChzZWUgc2VjdGlvbiBccmVme3R5cGVzfSkgd2hvc2UKLVxtZW1iZXJ7c3RhcnR9LCBcbWVtYmVye3N0b3B9IGFuZCBcbWVtYmVye3N0ZXB9IGF0dHJpYnV0ZXMgYXJlIHRoZQotdmFsdWVzIG9mIHRoZSBleHByZXNzaW9ucyBnaXZlbiBhcyBsb3dlciBib3VuZCwgdXBwZXIgYm91bmQgYW5kCi1zdHJpZGUsIHJlc3BlY3RpdmVseSwgc3Vic3RpdHV0aW5nIFxjb2Rle05vbmV9IGZvciBtaXNzaW5nCi1leHByZXNzaW9ucy4KLVx3aXRoc3ViaXRlbXsoc2xpY2Ugb2JqZWN0IGF0dHJpYnV0ZSl9e1x0dGluZGV4e3N0YXJ0fQotICBcdHRpbmRleHtzdG9wfVx0dGluZGV4e3N0ZXB9fQotCi0KLVxzdWJzZWN0aW9ue0NhbGxzXGxhYmVse2NhbGxzfX0KLVxpbmRleHtjYWxsfQotCi1BIGNhbGwgY2FsbHMgYSBjYWxsYWJsZSBvYmplY3QgKGUuZy4sIGEgZnVuY3Rpb24pIHdpdGggYSBwb3NzaWJseSBlbXB0eQotc2VyaWVzIG9mIGFyZ3VtZW50czoKLVxvYmluZGV4e2NhbGxhYmxlfQotCi1cYmVnaW57cHJvZHVjdGlvbmxpc3R9Ci0gIFxwcm9kdWN0aW9ue2NhbGx9Ci0gICAgICAgICAgICAge1x0b2tlbntwcmltYXJ5fSAiKCIgW1x0b2tlbnthcmd1bWVudF9saXN0fSBbIiwiXX0KLSAgXHByb2R1Y3Rpb25jb250eyAgICAgICAgICAgIHwgXHRva2Vue2V4cHJlc3Npb259IFx0b2tlbntnZW5leHByX2Zvcn1dICIpIn0KLSAgXHByb2R1Y3Rpb257YXJndW1lbnRfbGlzdH0KLSAgICAgICAgICAgICB7XHRva2Vue3Bvc2l0aW9uYWxfYXJndW1lbnRzfSBbIiwiIFx0b2tlbntrZXl3b3JkX2FyZ3VtZW50c31dfQotICBccHJvZHVjdGlvbmNvbnR7ICAgICAgICAgICAgICAgICAgICAgWyIsIiAiKiIgXHRva2Vue2V4cHJlc3Npb259XX0KLSAgXHByb2R1Y3Rpb25jb250eyAgICAgICAgICAgICAgICAgICAgIFsiLCIgIioqIiBcdG9rZW57ZXhwcmVzc2lvbn1dfQotICBccHJvZHVjdGlvbmNvbnR7fCBcdG9rZW57a2V5d29yZF9hcmd1bWVudHN9IFsiLCIgIioiIFx0b2tlbntleHByZXNzaW9ufV19Ci0gIFxwcm9kdWN0aW9uY29udHsgICAgICAgICAgICAgICAgICAgIFsiLCIgIioqIiBcdG9rZW57ZXhwcmVzc2lvbn1dfQotICBccHJvZHVjdGlvbmNvbnR7fCAiKiIgXHRva2Vue2V4cHJlc3Npb259IFsiLCIgIioqIiBcdG9rZW57ZXhwcmVzc2lvbn1dfQotICBccHJvZHVjdGlvbmNvbnR7fCAiKioiIFx0b2tlbntleHByZXNzaW9ufX0KLSAgXHByb2R1Y3Rpb257cG9zaXRpb25hbF9hcmd1bWVudHN9Ci0gICAgICAgICAgICAge1x0b2tlbntleHByZXNzaW9ufSAoIiwiIFx0b2tlbntleHByZXNzaW9ufSkqfQotICBccHJvZHVjdGlvbntrZXl3b3JkX2FyZ3VtZW50c30KLSAgICAgICAgICAgICB7XHRva2Vue2tleXdvcmRfaXRlbX0gKCIsIiBcdG9rZW57a2V5d29yZF9pdGVtfSkqfQotICBccHJvZHVjdGlvbntrZXl3b3JkX2l0ZW19Ci0gICAgICAgICAgICAge1x0b2tlbntpZGVudGlmaWVyfSAiPSIgXHRva2Vue2V4cHJlc3Npb259fQotXGVuZHtwcm9kdWN0aW9ubGlzdH0KLQotQSB0cmFpbGluZyBjb21tYSBtYXkgYmUgcHJlc2VudCBhZnRlciB0aGUgcG9zaXRpb25hbCBhbmQga2V5d29yZAotYXJndW1lbnRzIGJ1dCBkb2VzIG5vdCBhZmZlY3QgdGhlIHNlbWFudGljcy4KLQotVGhlIHByaW1hcnkgbXVzdCBldmFsdWF0ZSB0byBhIGNhbGxhYmxlIG9iamVjdCAodXNlci1kZWZpbmVkCi1mdW5jdGlvbnMsIGJ1aWx0LWluIGZ1bmN0aW9ucywgbWV0aG9kcyBvZiBidWlsdC1pbiBvYmplY3RzLCBjbGFzcwotb2JqZWN0cywgbWV0aG9kcyBvZiBjbGFzcyBpbnN0YW5jZXMsIGFuZCBjZXJ0YWluIGNsYXNzIGluc3RhbmNlcwotdGhlbXNlbHZlcyBhcmUgY2FsbGFibGU7IGV4dGVuc2lvbnMgbWF5IGRlZmluZSBhZGRpdGlvbmFsIGNhbGxhYmxlCi1vYmplY3QgdHlwZXMpLiAgQWxsIGFyZ3VtZW50IGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgYmVmb3JlIHRoZSBjYWxsCi1pcyBhdHRlbXB0ZWQuICBQbGVhc2UgcmVmZXIgdG8gc2VjdGlvbiBccmVme2Z1bmN0aW9ufSBmb3IgdGhlIHN5bnRheAotb2YgZm9ybWFsIHBhcmFtZXRlciBsaXN0cy4KLQotSWYga2V5d29yZCBhcmd1bWVudHMgYXJlIHByZXNlbnQsIHRoZXkgYXJlIGZpcnN0IGNvbnZlcnRlZCB0bwotcG9zaXRpb25hbCBhcmd1bWVudHMsIGFzIGZvbGxvd3MuICBGaXJzdCwgYSBsaXN0IG9mIHVuZmlsbGVkIHNsb3RzIGlzCi1jcmVhdGVkIGZvciB0aGUgZm9ybWFsIHBhcmFtZXRlcnMuICBJZiB0aGVyZSBhcmUgTiBwb3NpdGlvbmFsCi1hcmd1bWVudHMsIHRoZXkgYXJlIHBsYWNlZCBpbiB0aGUgZmlyc3QgTiBzbG90cy4gIE5leHQsIGZvciBlYWNoCi1rZXl3b3JkIGFyZ3VtZW50LCB0aGUgaWRlbnRpZmllciBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUKLWNvcnJlc3BvbmRpbmcgc2xvdCAoaWYgdGhlIGlkZW50aWZpZXIgaXMgdGhlIHNhbWUgYXMgdGhlIGZpcnN0IGZvcm1hbAotcGFyYW1ldGVyIG5hbWUsIHRoZSBmaXJzdCBzbG90IGlzIHVzZWQsIGFuZCBzbyBvbikuICBJZiB0aGUgc2xvdCBpcwotYWxyZWFkeSBmaWxsZWQsIGEgXGV4Y2VwdGlvbntUeXBlRXJyb3J9IGV4Y2VwdGlvbiBpcyByYWlzZWQuCi1PdGhlcndpc2UsIHRoZSB2YWx1ZSBvZiB0aGUgYXJndW1lbnQgaXMgcGxhY2VkIGluIHRoZSBzbG90LCBmaWxsaW5nIGl0Ci0oZXZlbiBpZiB0aGUgZXhwcmVzc2lvbiBpcyBcY29kZXtOb25lfSwgaXQgZmlsbHMgdGhlIHNsb3QpLiAgV2hlbiBhbGwKLWFyZ3VtZW50cyBoYXZlIGJlZW4gcHJvY2Vzc2VkLCB0aGUgc2xvdHMgdGhhdCBhcmUgc3RpbGwgdW5maWxsZWQgYXJlCi1maWxsZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBkZWZhdWx0IHZhbHVlIGZyb20gdGhlIGZ1bmN0aW9uCi1kZWZpbml0aW9uLiAgKERlZmF1bHQgdmFsdWVzIGFyZSBjYWxjdWxhdGVkLCBvbmNlLCB3aGVuIHRoZSBmdW5jdGlvbgotaXMgZGVmaW5lZDsgdGh1cywgYSBtdXRhYmxlIG9iamVjdCBzdWNoIGFzIGEgbGlzdCBvciBkaWN0aW9uYXJ5IHVzZWQKLWFzIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSBzaGFyZWQgYnkgYWxsIGNhbGxzIHRoYXQgZG9uJ3Qgc3BlY2lmeSBhbgotYXJndW1lbnQgdmFsdWUgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHNsb3Q7IHRoaXMgc2hvdWxkIHVzdWFsbHkgYmUKLWF2b2lkZWQuKSAgSWYgdGhlcmUgYXJlIGFueSB1bmZpbGxlZCBzbG90cyBmb3Igd2hpY2ggbm8gZGVmYXVsdCB2YWx1ZQotaXMgc3BlY2lmaWVkLCBhIFxleGNlcHRpb257VHlwZUVycm9yfSBleGNlcHRpb24gaXMgcmFpc2VkLiAgT3RoZXJ3aXNlLAotdGhlIGxpc3Qgb2YgZmlsbGVkIHNsb3RzIGlzIHVzZWQgYXMgdGhlIGFyZ3VtZW50IGxpc3QgZm9yIHRoZSBjYWxsLgotCi1JZiB0aGVyZSBhcmUgbW9yZSBwb3NpdGlvbmFsIGFyZ3VtZW50cyB0aGFuIHRoZXJlIGFyZSBmb3JtYWwgcGFyYW1ldGVyCi1zbG90cywgYSBcZXhjZXB0aW9ue1R5cGVFcnJvcn0gZXhjZXB0aW9uIGlzIHJhaXNlZCwgdW5sZXNzIGEgZm9ybWFsCi1wYXJhbWV0ZXIgdXNpbmcgdGhlIHN5bnRheCBcc2FtcHsqaWRlbnRpZmllcn0gaXMgcHJlc2VudDsgaW4gdGhpcwotY2FzZSwgdGhhdCBmb3JtYWwgcGFyYW1ldGVyIHJlY2VpdmVzIGEgdHVwbGUgY29udGFpbmluZyB0aGUgZXhjZXNzCi1wb3NpdGlvbmFsIGFyZ3VtZW50cyAob3IgYW4gZW1wdHkgdHVwbGUgaWYgdGhlcmUgd2VyZSBubyBleGNlc3MKLXBvc2l0aW9uYWwgYXJndW1lbnRzKS4KLQotSWYgYW55IGtleXdvcmQgYXJndW1lbnQgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIGZvcm1hbCBwYXJhbWV0ZXIKLW5hbWUsIGEgXGV4Y2VwdGlvbntUeXBlRXJyb3J9IGV4Y2VwdGlvbiBpcyByYWlzZWQsIHVubGVzcyBhIGZvcm1hbAotcGFyYW1ldGVyIHVzaW5nIHRoZSBzeW50YXggXHNhbXB7KippZGVudGlmaWVyfSBpcyBwcmVzZW50OyBpbiB0aGlzCi1jYXNlLCB0aGF0IGZvcm1hbCBwYXJhbWV0ZXIgcmVjZWl2ZXMgYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlCi1leGNlc3Mga2V5d29yZCBhcmd1bWVudHMgKHVzaW5nIHRoZSBrZXl3b3JkcyBhcyBrZXlzIGFuZCB0aGUgYXJndW1lbnQKLXZhbHVlcyBhcyBjb3JyZXNwb25kaW5nIHZhbHVlcyksIG9yIGEgKG5ldykgZW1wdHkgZGljdGlvbmFyeSBpZiB0aGVyZQotd2VyZSBubyBleGNlc3Mga2V5d29yZCBhcmd1bWVudHMuCi0KLUlmIHRoZSBzeW50YXggXHNhbXB7KmV4cHJlc3Npb259IGFwcGVhcnMgaW4gdGhlIGZ1bmN0aW9uIGNhbGwsCi1cc2FtcHtleHByZXNzaW9ufSBtdXN0IGV2YWx1YXRlIHRvIGEgc2VxdWVuY2UuICBFbGVtZW50cyBmcm9tIHRoaXMKLXNlcXVlbmNlIGFyZSB0cmVhdGVkIGFzIGlmIHRoZXkgd2VyZSBhZGRpdGlvbmFsIHBvc2l0aW9uYWwgYXJndW1lbnRzOwotaWYgdGhlcmUgYXJlIHBvc3Rpb25hbCBhcmd1bWVudHMgXHZhcnt4MX0sLi4uLFx2YXJ7eE59ICwgYW5kCi1cc2FtcHtleHByZXNzaW9ufSBldmFsdWF0ZXMgdG8gYSBzZXF1ZW5jZSBcdmFye3kxfSwuLi4sXHZhcnt5TX0sIHRoaXMKLWlzIGVxdWl2YWxlbnQgdG8gYSBjYWxsIHdpdGggTStOIHBvc2l0aW9uYWwgYXJndW1lbnRzCi1cdmFye3gxfSwuLi4sXHZhcnt4Tn0sXHZhcnt5MX0sLi4uLFx2YXJ7eU19LgotCi1BIGNvbnNlcXVlbmNlIG9mIHRoaXMgaXMgdGhhdCBhbHRob3VnaCB0aGUgXHNhbXB7KmV4cHJlc3Npb259IHN5bnRheAotYXBwZWFycyBcZW1waHthZnRlcn0gYW55IGtleXdvcmQgYXJndW1lbnRzLCBpdCBpcyBwcm9jZXNzZWQKLVxlbXBoe2JlZm9yZX0gdGhlIGtleXdvcmQgYXJndW1lbnRzIChhbmQgdGhlCi1cc2FtcHsqKmV4cHJlc3Npb259IGFyZ3VtZW50LCBpZiBhbnkgLS0gc2VlIGJlbG93KS4gIFNvOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZGVmIGYoYSwgYik6Ci0uLi4gIHByaW50IGEsIGIKLS4uLgotPj4+IGYoYj0xLCAqKDIsKSkKLTIgMQotPj4+IGYoYT0xLCAqKDIsKSkKLVRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLSAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwotVHlwZUVycm9yOiBmKCkgZ290IG11bHRpcGxlIHZhbHVlcyBmb3Iga2V5d29yZCBhcmd1bWVudCAnYScKLT4+PiBmKDEsICooMiwpKQotMSAyCi1cZW5ke3ZlcmJhdGltfQotCi1JdCBpcyB1bnVzdWFsIGZvciBib3RoIGtleXdvcmQgYXJndW1lbnRzIGFuZCB0aGUKLVxzYW1weypleHByZXNzaW9ufSBzeW50YXggdG8gYmUgdXNlZCBpbiB0aGUgc2FtZSBjYWxsLCBzbyBpbiBwcmFjdGljZQotdGhpcyBjb25mdXNpb24gZG9lcyBub3QgYXJpc2UuCi0KLUlmIHRoZSBzeW50YXggXHNhbXB7KipleHByZXNzaW9ufSBhcHBlYXJzIGluIHRoZSBmdW5jdGlvbiBjYWxsLAotXHNhbXB7ZXhwcmVzc2lvbn0gbXVzdCBldmFsdWF0ZSB0byBhIG1hcHBpbmcsIHRoZQotY29udGVudHMgb2Ygd2hpY2ggYXJlIHRyZWF0ZWQgYXMgYWRkaXRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cy4gIEluIHRoZQotY2FzZSBvZiBhIGtleXdvcmQgYXBwZWFyaW5nIGluIGJvdGggXHNhbXB7ZXhwcmVzc2lvbn0gYW5kIGFzIGFuCi1leHBsaWNpdCBrZXl3b3JkIGFyZ3VtZW50LCBhIFxleGNlcHRpb257VHlwZUVycm9yfSBleGNlcHRpb24gaXMKLXJhaXNlZC4KLQotRm9ybWFsIHBhcmFtZXRlcnMgdXNpbmcgdGhlIHN5bnRheCBcc2FtcHsqaWRlbnRpZmllcn0gb3IKLVxzYW1weyoqaWRlbnRpZmllcn0gY2Fubm90IGJlIHVzZWQgYXMgcG9zaXRpb25hbCBhcmd1bWVudCBzbG90cyBvcgotYXMga2V5d29yZCBhcmd1bWVudCBuYW1lcy4KLQotQSBjYWxsIGFsd2F5cyByZXR1cm5zIHNvbWUgdmFsdWUsIHBvc3NpYmx5IFxjb2Rle05vbmV9LCB1bmxlc3MgaXQKLXJhaXNlcyBhbiBleGNlcHRpb24uICBIb3cgdGhpcyB2YWx1ZSBpcyBjb21wdXRlZCBkZXBlbmRzIG9uIHRoZSB0eXBlCi1vZiB0aGUgY2FsbGFibGUgb2JqZWN0LgotCi1JZiBpdCBpcy0tLQotCi1cYmVnaW57ZGVzY3JpcHRpb259Ci0KLVxpdGVtW2EgdXNlci1kZWZpbmVkIGZ1bmN0aW9uOl0gVGhlIGNvZGUgYmxvY2sgZm9yIHRoZSBmdW5jdGlvbiBpcwotZXhlY3V0ZWQsIHBhc3NpbmcgaXQgdGhlIGFyZ3VtZW50IGxpc3QuICBUaGUgZmlyc3QgdGhpbmcgdGhlIGNvZGUKLWJsb2NrIHdpbGwgZG8gaXMgYmluZCB0aGUgZm9ybWFsIHBhcmFtZXRlcnMgdG8gdGhlIGFyZ3VtZW50czsgdGhpcyBpcwotZGVzY3JpYmVkIGluIHNlY3Rpb24gXHJlZntmdW5jdGlvbn0uICBXaGVuIHRoZSBjb2RlIGJsb2NrIGV4ZWN1dGVzIGEKLVxrZXl3b3Jke3JldHVybn0gc3RhdGVtZW50LCB0aGlzIHNwZWNpZmllcyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZQotZnVuY3Rpb24gY2FsbC4KLVxpbmRleGlpe2Z1bmN0aW9ufXtjYWxsfQotXGluZGV4aWlpe3VzZXItZGVmaW5lZH17ZnVuY3Rpb259e2NhbGx9Ci1cb2JpbmRleHt1c2VyLWRlZmluZWQgZnVuY3Rpb259Ci1cb2JpbmRleHtmdW5jdGlvbn0KLQotXGl0ZW1bYSBidWlsdC1pbiBmdW5jdGlvbiBvciBtZXRob2Q6XSBUaGUgcmVzdWx0IGlzIHVwIHRvIHRoZQotaW50ZXJwcmV0ZXI7IHNlZSB0aGUgXGNpdGV0aXRsZVsuLi9saWIvYnVpbHQtaW4tZnVuY3MuaHRtbF17UHl0aG9uCi1MaWJyYXJ5IFJlZmVyZW5jZX0gZm9yIHRoZSBkZXNjcmlwdGlvbnMgb2YgYnVpbHQtaW4gZnVuY3Rpb25zIGFuZAotbWV0aG9kcy4KLVxpbmRleGlpe2Z1bmN0aW9ufXtjYWxsfQotXGluZGV4aWl7YnVpbHQtaW4gZnVuY3Rpb259e2NhbGx9Ci1caW5kZXhpaXttZXRob2R9e2NhbGx9Ci1caW5kZXhpaXtidWlsdC1pbiBtZXRob2R9e2NhbGx9Ci1cb2JpbmRleHtidWlsdC1pbiBtZXRob2R9Ci1cb2JpbmRleHtidWlsdC1pbiBmdW5jdGlvbn0KLVxvYmluZGV4e21ldGhvZH0KLVxvYmluZGV4e2Z1bmN0aW9ufQotCi1caXRlbVthIGNsYXNzIG9iamVjdDpdIEEgbmV3IGluc3RhbmNlIG9mIHRoYXQgY2xhc3MgaXMgcmV0dXJuZWQuCi1cb2JpbmRleHtjbGFzc30KLVxpbmRleGlpe2NsYXNzIG9iamVjdH17Y2FsbH0KLQotXGl0ZW1bYSBjbGFzcyBpbnN0YW5jZSBtZXRob2Q6XSBUaGUgY29ycmVzcG9uZGluZyB1c2VyLWRlZmluZWQKLWZ1bmN0aW9uIGlzIGNhbGxlZCwgd2l0aCBhbiBhcmd1bWVudCBsaXN0IHRoYXQgaXMgb25lIGxvbmdlciB0aGFuIHRoZQotYXJndW1lbnQgbGlzdCBvZiB0aGUgY2FsbDogdGhlIGluc3RhbmNlIGJlY29tZXMgdGhlIGZpcnN0IGFyZ3VtZW50LgotXG9iaW5kZXh7Y2xhc3MgaW5zdGFuY2V9Ci1cb2JpbmRleHtpbnN0YW5jZX0KLVxpbmRleGlpe2NsYXNzIGluc3RhbmNlfXtjYWxsfQotCi1caXRlbVthIGNsYXNzIGluc3RhbmNlOl0gVGhlIGNsYXNzIG11c3QgZGVmaW5lIGEgXG1ldGhvZHtfX2NhbGxfXygpfQotbWV0aG9kOyB0aGUgZWZmZWN0IGlzIHRoZW4gdGhlIHNhbWUgYXMgaWYgdGhhdCBtZXRob2Qgd2FzIGNhbGxlZC4KLVxpbmRleGlpe2luc3RhbmNlfXtjYWxsfQotXHdpdGhzdWJpdGVteyhvYmplY3QgbWV0aG9kKX17XHR0aW5kZXh7X19jYWxsX18oKX19Ci0KLVxlbmR7ZGVzY3JpcHRpb259Ci0KLQotXHNlY3Rpb257VGhlIHBvd2VyIG9wZXJhdG9yXGxhYmVse3Bvd2VyfX0KLQotVGhlIHBvd2VyIG9wZXJhdG9yIGJpbmRzIG1vcmUgdGlnaHRseSB0aGFuIHVuYXJ5IG9wZXJhdG9ycyBvbiBpdHMKLWxlZnQ7IGl0IGJpbmRzIGxlc3MgdGlnaHRseSB0aGFuIHVuYXJ5IG9wZXJhdG9ycyBvbiBpdHMgcmlnaHQuICBUaGUKLXN5bnRheCBpczoKLQotXGJlZ2lue3Byb2R1Y3Rpb25saXN0fQotICBccHJvZHVjdGlvbntwb3dlcn0KLSAgICAgICAgICAgICB7XHRva2Vue3ByaW1hcnl9IFsiKioiIFx0b2tlbnt1X2V4cHJ9XX0KLVxlbmR7cHJvZHVjdGlvbmxpc3R9Ci0KLVRodXMsIGluIGFuIHVucGFyZW50aGVzaXplZCBzZXF1ZW5jZSBvZiBwb3dlciBhbmQgdW5hcnkgb3BlcmF0b3JzLCB0aGUKLW9wZXJhdG9ycyBhcmUgZXZhbHVhdGVkIGZyb20gcmlnaHQgdG8gbGVmdCAodGhpcyBkb2VzIG5vdCBjb25zdHJhaW4KLXRoZSBldmFsdWF0aW9uIG9yZGVyIGZvciB0aGUgb3BlcmFuZHMpLgotCi1UaGUgcG93ZXIgb3BlcmF0b3IgaGFzIHRoZSBzYW1lIHNlbWFudGljcyBhcyB0aGUgYnVpbHQtaW4KLVxmdW5jdGlvbntwb3coKX0gZnVuY3Rpb24sIHdoZW4gY2FsbGVkIHdpdGggdHdvIGFyZ3VtZW50czogaXQgeWllbGRzCi1pdHMgbGVmdCBhcmd1bWVudCByYWlzZWQgdG8gdGhlIHBvd2VyIG9mIGl0cyByaWdodCBhcmd1bWVudC4gIFRoZQotbnVtZXJpYyBhcmd1bWVudHMgYXJlIGZpcnN0IGNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlLiAgVGhlIHJlc3VsdAotdHlwZSBpcyB0aGF0IG9mIHRoZSBhcmd1bWVudHMgYWZ0ZXIgY29lcmNpb24uCi0KLVdpdGggbWl4ZWQgb3BlcmFuZCB0eXBlcywgdGhlIGNvZXJjaW9uIHJ1bGVzIGZvciBiaW5hcnkgYXJpdGhtZXRpYwotb3BlcmF0b3JzIGFwcGx5LiBGb3IgaW50IGFuZCBsb25nIGludCBvcGVyYW5kcywgdGhlIHJlc3VsdCBoYXMgdGhlCi1zYW1lIHR5cGUgYXMgdGhlIG9wZXJhbmRzIChhZnRlciBjb2VyY2lvbikgdW5sZXNzIHRoZSBzZWNvbmQgYXJndW1lbnQKLWlzIG5lZ2F0aXZlOyBpbiB0aGF0IGNhc2UsIGFsbCBhcmd1bWVudHMgYXJlIGNvbnZlcnRlZCB0byBmbG9hdCBhbmQgYQotZmxvYXQgcmVzdWx0IGlzIGRlbGl2ZXJlZC4gRm9yIGV4YW1wbGUsIFxjb2RlezEwKioyfSByZXR1cm5zIFxjb2RlezEwMH0sCi1idXQgXGNvZGV7MTAqKi0yfSByZXR1cm5zIFxjb2RlezAuMDF9LiAoVGhpcyBsYXN0IGZlYXR1cmUgd2FzIGFkZGVkIGluCi1QeXRob24gMi4yLiBJbiBQeXRob24gMi4xIGFuZCBiZWZvcmUsIGlmIGJvdGggYXJndW1lbnRzIHdlcmUgb2YgaW50ZWdlcgotdHlwZXMgYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgd2FzIG5lZ2F0aXZlLCBhbiBleGNlcHRpb24gd2FzIHJhaXNlZCkuCi0KLVJhaXNpbmcgXGNvZGV7MC4wfSB0byBhIG5lZ2F0aXZlIHBvd2VyIHJlc3VsdHMgaW4gYQotXGV4Y2VwdGlvbntaZXJvRGl2aXNpb25FcnJvcn0uICBSYWlzaW5nIGEgbmVnYXRpdmUgbnVtYmVyIHRvIGEKLWZyYWN0aW9uYWwgcG93ZXIgcmVzdWx0cyBpbiBhIFxleGNlcHRpb257VmFsdWVFcnJvcn0uCi0KLQotXHNlY3Rpb257VW5hcnkgYXJpdGhtZXRpYyBvcGVyYXRpb25zIFxsYWJlbHt1bmFyeX19Ci1caW5kZXhpaWl7dW5hcnl9e2FyaXRobWV0aWN9e29wZXJhdGlvbn0KLVxpbmRleGlpaXt1bmFyeX17Yml0LXdpc2V9e29wZXJhdGlvbn0KLQotQWxsIHVuYXJ5IGFyaXRobWV0aWMgKGFuZCBiaXQtd2lzZSkgb3BlcmF0aW9ucyBoYXZlIHRoZSBzYW1lIHByaW9yaXR5OgotCi1cYmVnaW57cHJvZHVjdGlvbmxpc3R9Ci0gIFxwcm9kdWN0aW9ue3VfZXhwcn0KLSAgICAgICAgICAgICB7XHRva2Vue3Bvd2VyfSB8ICItIiBcdG9rZW57dV9leHByfQotICAgICAgICAgICAgICB8ICIrIiBcdG9rZW57dV9leHByfSB8ICJ7XH59IiBcdG9rZW57dV9leHByfX0KLVxlbmR7cHJvZHVjdGlvbmxpc3R9Ci0KLVRoZSB1bmFyeSBcY29kZXstfSAobWludXMpIG9wZXJhdG9yIHlpZWxkcyB0aGUgbmVnYXRpb24gb2YgaXRzCi1udW1lcmljIGFyZ3VtZW50LgotXGluZGV4e25lZ2F0aW9ufQotXGluZGV4e21pbnVzfQotCi1UaGUgdW5hcnkgXGNvZGV7K30gKHBsdXMpIG9wZXJhdG9yIHlpZWxkcyBpdHMgbnVtZXJpYyBhcmd1bWVudAotdW5jaGFuZ2VkLgotXGluZGV4e3BsdXN9Ci0KLVRoZSB1bmFyeSBcY29kZXtcfn0gKGludmVydCkgb3BlcmF0b3IgeWllbGRzIHRoZSBiaXQtd2lzZSBpbnZlcnNpb24KLW9mIGl0cyBwbGFpbiBvciBsb25nIGludGVnZXIgYXJndW1lbnQuICBUaGUgYml0LXdpc2UgaW52ZXJzaW9uIG9mCi1cY29kZXt4fSBpcyBkZWZpbmVkIGFzIFxjb2Rley0oeCsxKX0uICBJdCBvbmx5IGFwcGxpZXMgdG8gaW50ZWdyYWwKLW51bWJlcnMuCi1caW5kZXh7aW52ZXJzaW9ufQotCi1JbiBhbGwgdGhyZWUgY2FzZXMsIGlmIHRoZSBhcmd1bWVudCBkb2VzIG5vdCBoYXZlIHRoZSBwcm9wZXIgdHlwZSwKLWEgXGV4Y2VwdGlvbntUeXBlRXJyb3J9IGV4Y2VwdGlvbiBpcyByYWlzZWQuCi1cZXhpbmRleHtUeXBlRXJyb3J9Ci0KLQotXHNlY3Rpb257QmluYXJ5IGFyaXRobWV0aWMgb3BlcmF0aW9uc1xsYWJlbHtiaW5hcnl9fQotXGluZGV4aWlpe2JpbmFyeX17YXJpdGhtZXRpY317b3BlcmF0aW9ufQotCi1UaGUgYmluYXJ5IGFyaXRobWV0aWMgb3BlcmF0aW9ucyBoYXZlIHRoZSBjb252ZW50aW9uYWwgcHJpb3JpdHkKLWxldmVscy4gIE5vdGUgdGhhdCBzb21lIG9mIHRoZXNlIG9wZXJhdGlvbnMgYWxzbyBhcHBseSB0byBjZXJ0YWluCi1ub24tbnVtZXJpYyB0eXBlcy4gIEFwYXJ0IGZyb20gdGhlIHBvd2VyIG9wZXJhdG9yLCB0aGVyZSBhcmUgb25seSB0d28KLWxldmVscywgb25lIGZvciBtdWx0aXBsaWNhdGl2ZSBvcGVyYXRvcnMgYW5kIG9uZSBmb3IgYWRkaXRpdmUKLW9wZXJhdG9yczoKLQotXGJlZ2lue3Byb2R1Y3Rpb25saXN0fQotICBccHJvZHVjdGlvbnttX2V4cHJ9Ci0gICAgICAgICAgICAge1x0b2tlbnt1X2V4cHJ9IHwgXHRva2Vue21fZXhwcn0gIioiIFx0b2tlbnt1X2V4cHJ9Ci0gICAgICAgICAgICAgIHwgXHRva2Vue21fZXhwcn0gIi8vIiBcdG9rZW57dV9leHByfQotICAgICAgICAgICAgICB8IFx0b2tlbnttX2V4cHJ9ICIvIiBcdG9rZW57dV9leHByfX0KLSAgXHByb2R1Y3Rpb25jb250e3wgXHRva2Vue21fZXhwcn0gIlwlIiBcdG9rZW57dV9leHByfX0KLSAgXHByb2R1Y3Rpb257YV9leHByfQotICAgICAgICAgICAgIHtcdG9rZW57bV9leHByfSB8IFx0b2tlbnthX2V4cHJ9ICIrIiBcdG9rZW57bV9leHByfQotICAgICAgICAgICAgICB8IFx0b2tlbnthX2V4cHJ9ICItIiBcdG9rZW57bV9leHByfX0KLVxlbmR7cHJvZHVjdGlvbmxpc3R9Ci0KLVRoZSBcY29kZXsqfSAobXVsdGlwbGljYXRpb24pIG9wZXJhdG9yIHlpZWxkcyB0aGUgcHJvZHVjdCBvZiBpdHMKLWFyZ3VtZW50cy4gIFRoZSBhcmd1bWVudHMgbXVzdCBlaXRoZXIgYm90aCBiZSBudW1iZXJzLCBvciBvbmUgYXJndW1lbnQKLW11c3QgYmUgYW4gaW50ZWdlciAocGxhaW4gb3IgbG9uZykgYW5kIHRoZSBvdGhlciBtdXN0IGJlIGEgc2VxdWVuY2UuCi1JbiB0aGUgZm9ybWVyIGNhc2UsIHRoZSBudW1iZXJzIGFyZSBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZSBhbmQKLXRoZW4gbXVsdGlwbGllZCB0b2dldGhlci4gIEluIHRoZSBsYXR0ZXIgY2FzZSwgc2VxdWVuY2UgcmVwZXRpdGlvbiBpcwotcGVyZm9ybWVkOyBhIG5lZ2F0aXZlIHJlcGV0aXRpb24gZmFjdG9yIHlpZWxkcyBhbiBlbXB0eSBzZXF1ZW5jZS4KLVxpbmRleHttdWx0aXBsaWNhdGlvbn0KLQotVGhlIFxjb2Rley99IChkaXZpc2lvbikgYW5kIFxjb2Rley8vfSAoZmxvb3IgZGl2aXNpb24pIG9wZXJhdG9ycyB5aWVsZAotdGhlIHF1b3RpZW50IG9mIHRoZWlyIGFyZ3VtZW50cy4gIFRoZSBudW1lcmljIGFyZ3VtZW50cyBhcmUgZmlyc3QKLWNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlLiAgUGxhaW4gb3IgbG9uZyBpbnRlZ2VyIGRpdmlzaW9uIHlpZWxkcyBhbgotaW50ZWdlciBvZiB0aGUgc2FtZSB0eXBlOyB0aGUgcmVzdWx0IGlzIHRoYXQgb2YgbWF0aGVtYXRpY2FsIGRpdmlzaW9uCi13aXRoIHRoZSBgZmxvb3InIGZ1bmN0aW9uIGFwcGxpZWQgdG8gdGhlIHJlc3VsdC4gIERpdmlzaW9uIGJ5IHplcm8KLXJhaXNlcyB0aGUKLVxleGNlcHRpb257WmVyb0RpdmlzaW9uRXJyb3J9IGV4Y2VwdGlvbi4KLVxleGluZGV4e1plcm9EaXZpc2lvbkVycm9yfQotXGluZGV4e2RpdmlzaW9ufQotCi1UaGUgXGNvZGV7XCV9IChtb2R1bG8pIG9wZXJhdG9yIHlpZWxkcyB0aGUgcmVtYWluZGVyIGZyb20gdGhlCi1kaXZpc2lvbiBvZiB0aGUgZmlyc3QgYXJndW1lbnQgYnkgdGhlIHNlY29uZC4gIFRoZSBudW1lcmljIGFyZ3VtZW50cwotYXJlIGZpcnN0IGNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlLiAgQSB6ZXJvIHJpZ2h0IGFyZ3VtZW50IHJhaXNlcwotdGhlIFxleGNlcHRpb257WmVyb0RpdmlzaW9uRXJyb3J9IGV4Y2VwdGlvbi4gIFRoZSBhcmd1bWVudHMgbWF5IGJlIGZsb2F0aW5nCi1wb2ludCBudW1iZXJzLCBlLmcuLCBcY29kZXszLjE0XCUwLjd9IGVxdWFscyBcY29kZXswLjM0fSAoc2luY2UKLVxjb2RlezMuMTR9IGVxdWFscyBcY29kZXs0KjAuNyArIDAuMzR9LikgIFRoZSBtb2R1bG8gb3BlcmF0b3IgYWx3YXlzCi15aWVsZHMgYSByZXN1bHQgd2l0aCB0aGUgc2FtZSBzaWduIGFzIGl0cyBzZWNvbmQgb3BlcmFuZCAob3IgemVybyk7Ci10aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIHJlc3VsdCBpcyBzdHJpY3RseSBzbWFsbGVyIHRoYW4gdGhlIGFic29sdXRlCi12YWx1ZSBvZiB0aGUgc2Vjb25kIG9wZXJhbmRcZm9vdG5vdGV7Ci0gICAgV2hpbGUgXGNvZGV7YWJzKHhcJXkpIDwgYWJzKHkpfSBpcyB0cnVlIG1hdGhlbWF0aWNhbGx5LCBmb3IKLSAgICBmbG9hdHMgaXQgbWF5IG5vdCBiZSB0cnVlIG51bWVyaWNhbGx5IGR1ZSB0byByb3VuZG9mZi4gIEZvcgotICAgIGV4YW1wbGUsIGFuZCBhc3N1bWluZyBhIHBsYXRmb3JtIG9uIHdoaWNoIGEgUHl0aG9uIGZsb2F0IGlzIGFuCi0gICAgSUVFRSA3NTQgZG91YmxlLXByZWNpc2lvbiBudW1iZXIsIGluIG9yZGVyIHRoYXQgXGNvZGV7LTFlLTEwMCBcJSAxZTEwMH0KLSAgICBoYXZlIHRoZSBzYW1lIHNpZ24gYXMgXGNvZGV7MWUxMDB9LCB0aGUgY29tcHV0ZWQgcmVzdWx0IGlzCi0gICAgXGNvZGV7LTFlLTEwMCArIDFlMTAwfSwgd2hpY2ggaXMgbnVtZXJpY2FsbHkgZXhhY3RseSBlcXVhbAotICAgIHRvIFxjb2RlezFlMTAwfS4gIEZ1bmN0aW9uIFxmdW5jdGlvbntmbW9kKCl9IGluIHRoZSBcbW9kdWxle21hdGh9Ci0gICAgbW9kdWxlIHJldHVybnMgYSByZXN1bHQgd2hvc2Ugc2lnbiBtYXRjaGVzIHRoZSBzaWduIG9mIHRoZQotICAgIGZpcnN0IGFyZ3VtZW50IGluc3RlYWQsIGFuZCBzbyByZXR1cm5zIFxjb2Rley0xZS0xMDB9IGluIHRoaXMgY2FzZS4KLSAgICBXaGljaCBhcHByb2FjaCBpcyBtb3JlIGFwcHJvcHJpYXRlIGRlcGVuZHMgb24gdGhlIGFwcGxpY2F0aW9uLgotfS4KLVxpbmRleHttb2R1bG99Ci0KLVRoZSBpbnRlZ2VyIGRpdmlzaW9uIGFuZCBtb2R1bG8gb3BlcmF0b3JzIGFyZSBjb25uZWN0ZWQgYnkgdGhlCi1mb2xsb3dpbmcgaWRlbnRpdHk6IFxjb2Rle3ggPT0gKHgveSkqeSArICh4XCV5KX0uICBJbnRlZ2VyIGRpdmlzaW9uIGFuZAotbW9kdWxvIGFyZSBhbHNvIGNvbm5lY3RlZCB3aXRoIHRoZSBidWlsdC1pbiBmdW5jdGlvbiBcZnVuY3Rpb257ZGl2bW9kKCl9OgotXGNvZGV7ZGl2bW9kKHgsIHkpID09ICh4L3ksIHhcJXkpfS4gIFRoZXNlIGlkZW50aXRpZXMgZG9uJ3QgaG9sZCBmb3IKLWZsb2F0aW5nIHBvaW50IG51bWJlcnM7IHRoZXJlIHNpbWlsYXIgaWRlbnRpdGllcyBob2xkCi1hcHByb3hpbWF0ZWx5IHdoZXJlIFxjb2Rle3gveX0gaXMgcmVwbGFjZWQgYnkgXGNvZGV7Zmxvb3IoeC95KX0gb3IKLVxjb2Rle2Zsb29yKHgveSkgLSAxfVxmb290bm90ZXsKLSAgICBJZiB4IGlzIHZlcnkgY2xvc2UgdG8gYW4gZXhhY3QgaW50ZWdlciBtdWx0aXBsZSBvZiB5LCBpdCdzCi0gICAgcG9zc2libGUgZm9yIFxjb2Rle2Zsb29yKHgveSl9IHRvIGJlIG9uZSBsYXJnZXIgdGhhbgotICAgIFxjb2Rleyh4LXhcJXkpL3l9IGR1ZSB0byByb3VuZGluZy4gIEluIHN1Y2ggY2FzZXMsIFB5dGhvbiByZXR1cm5zCi0gICAgdGhlIGxhdHRlciByZXN1bHQsIGluIG9yZGVyIHRvIHByZXNlcnZlIHRoYXQgXGNvZGV7ZGl2bW9kKHgseSlbMF0KLSAgICAqIHkgKyB4IFwle30geX0gYmUgdmVyeSBjbG9zZSB0byBcY29kZXt4fS4KLX0uCi0KLUluIGFkZGl0aW9uIHRvIHBlcmZvcm1pbmcgdGhlIG1vZHVsbyBvcGVyYXRpb24gb24gbnVtYmVycywgdGhlIFxjb2Rle1wlfQotb3BlcmF0b3IgaXMgYWxzbyBvdmVybG9hZGVkIGJ5IHN0cmluZyBhbmQgdW5pY29kZSBvYmplY3RzIHRvIHBlcmZvcm0KLXN0cmluZyBmb3JtYXR0aW5nIChhbHNvIGtub3duIGFzIGludGVycG9sYXRpb24pLiBUaGUgc3ludGF4IGZvciBzdHJpbmcKLWZvcm1hdHRpbmcgaXMgZGVzY3JpYmVkIGluIHRoZQotXGNpdGV0aXRsZVsuLi9saWIvdHlwZXNzZXEtc3RyaW5ncy5odG1sXXtQeXRob24gTGlicmFyeSBSZWZlcmVuY2V9LAotc2VjdGlvbiBgYFNlcXVlbmNlIFR5cGVzJycuCi0KLVxkZXByZWNhdGVkezIuM317VGhlIGZsb29yIGRpdmlzaW9uIG9wZXJhdG9yLCB0aGUgbW9kdWxvIG9wZXJhdG9yLAotYW5kIHRoZSBcZnVuY3Rpb257ZGl2bW9kKCl9IGZ1bmN0aW9uIGFyZSBubyBsb25nZXIgZGVmaW5lZCBmb3IgY29tcGxleAotbnVtYmVycy4gIEluc3RlYWQsIGNvbnZlcnQgdG8gYSBmbG9hdGluZyBwb2ludCBudW1iZXIgdXNpbmcgdGhlCi1cZnVuY3Rpb257YWJzKCl9IGZ1bmN0aW9uIGlmIGFwcHJvcHJpYXRlLn0KLQotVGhlIFxjb2Rleyt9IChhZGRpdGlvbikgb3BlcmF0b3IgeWllbGRzIHRoZSBzdW0gb2YgaXRzIGFyZ3VtZW50cy4KLVRoZSBhcmd1bWVudHMgbXVzdCBlaXRoZXIgYm90aCBiZSBudW1iZXJzIG9yIGJvdGggc2VxdWVuY2VzIG9mIHRoZQotc2FtZSB0eXBlLiAgSW4gdGhlIGZvcm1lciBjYXNlLCB0aGUgbnVtYmVycyBhcmUgY29udmVydGVkIHRvIGEgY29tbW9uCi10eXBlIGFuZCB0aGVuIGFkZGVkIHRvZ2V0aGVyLiAgSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUgc2VxdWVuY2VzIGFyZQotY29uY2F0ZW5hdGVkLgotXGluZGV4e2FkZGl0aW9ufQotCi1UaGUgXGNvZGV7LX0gKHN1YnRyYWN0aW9uKSBvcGVyYXRvciB5aWVsZHMgdGhlIGRpZmZlcmVuY2Ugb2YgaXRzCi1hcmd1bWVudHMuICBUaGUgbnVtZXJpYyBhcmd1bWVudHMgYXJlIGZpcnN0IGNvbnZlcnRlZCB0byBhIGNvbW1vbgotdHlwZS4KLVxpbmRleHtzdWJ0cmFjdGlvbn0KLQotCi1cc2VjdGlvbntTaGlmdGluZyBvcGVyYXRpb25zXGxhYmVse3NoaWZ0aW5nfX0KLVxpbmRleGlpe3NoaWZ0aW5nfXtvcGVyYXRpb259Ci0KLVRoZSBzaGlmdGluZyBvcGVyYXRpb25zIGhhdmUgbG93ZXIgcHJpb3JpdHkgdGhhbiB0aGUgYXJpdGhtZXRpYwotb3BlcmF0aW9uczoKLQotXGJlZ2lue3Byb2R1Y3Rpb25saXN0fQotICBccHJvZHVjdGlvbntzaGlmdF9leHByfQotICAgICAgICAgICAgIHtcdG9rZW57YV9leHByfQotICAgICAgICAgICAgICB8IFx0b2tlbntzaGlmdF9leHByfSAoICI8PCIgfCAiPj4iICkgXHRva2Vue2FfZXhwcn19Ci1cZW5ke3Byb2R1Y3Rpb25saXN0fQotCi1UaGVzZSBvcGVyYXRvcnMgYWNjZXB0IHBsYWluIG9yIGxvbmcgaW50ZWdlcnMgYXMgYXJndW1lbnRzLiAgVGhlCi1hcmd1bWVudHMgYXJlIGNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlLiAgVGhleSBzaGlmdCB0aGUgZmlyc3QKLWFyZ3VtZW50IHRvIHRoZSBsZWZ0IG9yIHJpZ2h0IGJ5IHRoZSBudW1iZXIgb2YgYml0cyBnaXZlbiBieSB0aGUKLXNlY29uZCBhcmd1bWVudC4KLQotQSByaWdodCBzaGlmdCBieSBcdmFye259IGJpdHMgaXMgZGVmaW5lZCBhcyBkaXZpc2lvbiBieQotXGNvZGV7cG93KDIsXHZhcntufSl9LiAgQSBsZWZ0IHNoaWZ0IGJ5IFx2YXJ7bn0gYml0cyBpcyBkZWZpbmVkIGFzCi1tdWx0aXBsaWNhdGlvbiB3aXRoIFxjb2Rle3BvdygyLFx2YXJ7bn0pfTsgZm9yIHBsYWluIGludGVnZXJzIHRoZXJlIGlzCi1ubyBvdmVyZmxvdyBjaGVjayBzbyBpbiB0aGF0IGNhc2UgdGhlIG9wZXJhdGlvbiBkcm9wcyBiaXRzIGFuZCBmbGlwcwotdGhlIHNpZ24gaWYgdGhlIHJlc3VsdCBpcyBub3QgbGVzcyB0aGFuIFxjb2Rle3BvdygyLDMxKX0gaW4gYWJzb2x1dGUKLXZhbHVlLiAgTmVnYXRpdmUgc2hpZnQgY291bnRzIHJhaXNlIGEgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfQotZXhjZXB0aW9uLgotXGV4aW5kZXh7VmFsdWVFcnJvcn0KLQotCi1cc2VjdGlvbntCaW5hcnkgYml0LXdpc2Ugb3BlcmF0aW9uc1xsYWJlbHtiaXR3aXNlfX0KLVxpbmRleGlpaXtiaW5hcnl9e2JpdC13aXNlfXtvcGVyYXRpb259Ci0KLUVhY2ggb2YgdGhlIHRocmVlIGJpdHdpc2Ugb3BlcmF0aW9ucyBoYXMgYSBkaWZmZXJlbnQgcHJpb3JpdHkgbGV2ZWw6Ci0KLVxiZWdpbntwcm9kdWN0aW9ubGlzdH0KLSAgXHByb2R1Y3Rpb257YW5kX2V4cHJ9Ci0gICAgICAgICAgICAge1x0b2tlbntzaGlmdF9leHByfSB8IFx0b2tlbnthbmRfZXhwcn0gIlwmIiBcdG9rZW57c2hpZnRfZXhwcn19Ci0gIFxwcm9kdWN0aW9ue3hvcl9leHByfQotICAgICAgICAgICAgIHtcdG9rZW57YW5kX2V4cHJ9IHwgXHRva2Vue3hvcl9leHByfSAiXHRleHRhc2NpaWNpcmN1bSIgXHRva2Vue2FuZF9leHByfX0KLSAgXHByb2R1Y3Rpb257b3JfZXhwcn0KLSAgICAgICAgICAgICB7XHRva2Vue3hvcl9leHByfSB8IFx0b2tlbntvcl9leHByfSAifCIgXHRva2Vue3hvcl9leHByfX0KLVxlbmR7cHJvZHVjdGlvbmxpc3R9Ci0KLVRoZSBcY29kZXtcJn0gb3BlcmF0b3IgeWllbGRzIHRoZSBiaXR3aXNlIEFORCBvZiBpdHMgYXJndW1lbnRzLCB3aGljaAotbXVzdCBiZSBwbGFpbiBvciBsb25nIGludGVnZXJzLiAgVGhlIGFyZ3VtZW50cyBhcmUgY29udmVydGVkIHRvIGEKLWNvbW1vbiB0eXBlLgotXGluZGV4aWl7Yml0LXdpc2V9e2FuZH0KLQotVGhlIFxjb2Rle1xefSBvcGVyYXRvciB5aWVsZHMgdGhlIGJpdHdpc2UgWE9SIChleGNsdXNpdmUgT1IpIG9mIGl0cwotYXJndW1lbnRzLCB3aGljaCBtdXN0IGJlIHBsYWluIG9yIGxvbmcgaW50ZWdlcnMuICBUaGUgYXJndW1lbnRzIGFyZQotY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUuCi1caW5kZXhpaXtiaXQtd2lzZX17eG9yfQotXGluZGV4aWl7ZXhjbHVzaXZlfXtvcn0KLQotVGhlIFxjb2Rle3x9IG9wZXJhdG9yIHlpZWxkcyB0aGUgYml0d2lzZSAoaW5jbHVzaXZlKSBPUiBvZiBpdHMKLWFyZ3VtZW50cywgd2hpY2ggbXVzdCBiZSBwbGFpbiBvciBsb25nIGludGVnZXJzLiAgVGhlIGFyZ3VtZW50cyBhcmUKLWNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlLgotXGluZGV4aWl7Yml0LXdpc2V9e29yfQotXGluZGV4aWl7aW5jbHVzaXZlfXtvcn0KLQotCi1cc2VjdGlvbntDb21wYXJpc29uc1xsYWJlbHtjb21wYXJpc29uc319Ci1caW5kZXh7Y29tcGFyaXNvbn0KLQotVW5saWtlIEMsIGFsbCBjb21wYXJpc29uIG9wZXJhdGlvbnMgaW4gUHl0aG9uIGhhdmUgdGhlIHNhbWUgcHJpb3JpdHksCi13aGljaCBpcyBsb3dlciB0aGFuIHRoYXQgb2YgYW55IGFyaXRobWV0aWMsIHNoaWZ0aW5nIG9yIGJpdHdpc2UKLW9wZXJhdGlvbi4gIEFsc28gdW5saWtlIEMsIGV4cHJlc3Npb25zIGxpa2UgXGNvZGV7YSA8IGIgPCBjfSBoYXZlIHRoZQotaW50ZXJwcmV0YXRpb24gdGhhdCBpcyBjb252ZW50aW9uYWwgaW4gbWF0aGVtYXRpY3M6Ci1caW5kZXhpaXtDfXtsYW5ndWFnZX0KLQotXGJlZ2lue3Byb2R1Y3Rpb25saXN0fQotICBccHJvZHVjdGlvbntjb21wYXJpc29ufQotICAgICAgICAgICAgIHtcdG9rZW57b3JfZXhwcn0gKCBcdG9rZW57Y29tcF9vcGVyYXRvcn0gXHRva2Vue29yX2V4cHJ9ICkqfQotICBccHJvZHVjdGlvbntjb21wX29wZXJhdG9yfQotICAgICAgICAgICAgIHsiPCIgfCAiPiIgfCAiPT0iIHwgIj49IiB8ICI8PSIgfCAiIT0ifQotICBccHJvZHVjdGlvbmNvbnR7fCAiaXMiIFsibm90Il0gfCBbIm5vdCJdICJpbiJ9Ci1cZW5ke3Byb2R1Y3Rpb25saXN0fQotCi1Db21wYXJpc29ucyB5aWVsZCBib29sZWFuIHZhbHVlczogXGNvZGV7VHJ1ZX0gb3IgXGNvZGV7RmFsc2V9LgotCi1Db21wYXJpc29ucyBjYW4gYmUgY2hhaW5lZCBhcmJpdHJhcmlseSwgZS5nLiwgXGNvZGV7eCA8IHkgPD0gen0gaXMKLWVxdWl2YWxlbnQgdG8gXGNvZGV7eCA8IHkgYW5kIHkgPD0gen0sIGV4Y2VwdCB0aGF0IFxjb2Rle3l9IGlzCi1ldmFsdWF0ZWQgb25seSBvbmNlIChidXQgaW4gYm90aCBjYXNlcyBcY29kZXt6fSBpcyBub3QgZXZhbHVhdGVkIGF0IGFsbAotd2hlbiBcY29kZXt4IDwgeX0gaXMgZm91bmQgdG8gYmUgZmFsc2UpLgotXGluZGV4aWl7Y2hhaW5pbmd9e2NvbXBhcmlzb25zfQotCi1Gb3JtYWxseSwgaWYgXHZhcnthfSwgXHZhcntifSwgXHZhcntjfSwgXGxkb3RzLCBcdmFye3l9LCBcdmFye3p9IGFyZQotZXhwcmVzc2lvbnMgYW5kIFx2YXJ7b3BhfSwgXHZhcntvcGJ9LCBcbGRvdHMsIFx2YXJ7b3B5fSBhcmUgY29tcGFyaXNvbgotb3BlcmF0b3JzLCB0aGVuIFx2YXJ7YSBvcGEgYiBvcGIgY30gXGxkb3RzIFx2YXJ7eSBvcHkgen0gaXMgZXF1aXZhbGVudAotdG8gXHZhcnthIG9wYSBifSBca2V5d29yZHthbmR9IFx2YXJ7YiBvcGIgY30gXGtleXdvcmR7YW5kfSBcbGRvdHMKLVx2YXJ7eSBvcHkgen0sIGV4Y2VwdCB0aGF0IGVhY2ggZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgYXQgbW9zdCBvbmNlLgotCi1Ob3RlIHRoYXQgXHZhcnthIG9wYSBiIG9wYiBjfSBkb2Vzbid0IGltcGx5IGFueSBraW5kIG9mIGNvbXBhcmlzb24KLWJldHdlZW4gXHZhcnthfSBhbmQgXHZhcntjfSwgc28gdGhhdCwgZS5nLiwgXGNvZGV7eCA8IHkgPiB6fSBpcwotcGVyZmVjdGx5IGxlZ2FsICh0aG91Z2ggcGVyaGFwcyBub3QgcHJldHR5KS4KLQotVGhlIG9wZXJhdG9ycyBcY29kZXs8fSwgXGNvZGV7Pn0sIFxjb2Rlez09fSwgXGNvZGV7Pj19LCBcY29kZXs8PX0sIGFuZAotXGNvZGV7IT19IGNvbXBhcmUKLXRoZSB2YWx1ZXMgb2YgdHdvIG9iamVjdHMuICBUaGUgb2JqZWN0cyBuZWVkIG5vdCBoYXZlIHRoZSBzYW1lIHR5cGUuCi1JZiBib3RoIGFyZSBudW1iZXJzLCB0aGV5IGFyZSBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZS4gIE90aGVyd2lzZSwKLW9iamVjdHMgb2YgZGlmZmVyZW50IHR5cGVzIFxlbXBoe2Fsd2F5c30gY29tcGFyZSB1bmVxdWFsLCBhbmQgYXJlCi1vcmRlcmVkIGNvbnNpc3RlbnRseSBidXQgYXJiaXRyYXJpbHkuICBZb3UgY2FuIGNvbnRyb2wgY29tcGFyaXNvbgotYmVoYXZpb3Igb2Ygb2JqZWN0cyBvZiBub24tYnVpbHRpbiB0eXBlcyBieSBkZWZpbmluZyBhIFxjb2Rle19fY21wX199Ci1tZXRob2Qgb3IgcmljaCBjb21wYXJpc29uIG1ldGhvZHMgbGlrZSBcY29kZXtfX2d0X199LCBkZXNjcmliZWQgaW4KLXNlY3Rpb25+XHJlZntzcGVjaWFsbmFtZXN9LgotCi0oVGhpcyB1bnVzdWFsIGRlZmluaXRpb24gb2YgY29tcGFyaXNvbiB3YXMgdXNlZCB0byBzaW1wbGlmeSB0aGUKLWRlZmluaXRpb24gb2Ygb3BlcmF0aW9ucyBsaWtlIHNvcnRpbmcgYW5kIHRoZSBca2V5d29yZHtpbn0gYW5kCi1ca2V5d29yZHtub3QgaW59IG9wZXJhdG9ycy4gIEluIHRoZSBmdXR1cmUsIHRoZSBjb21wYXJpc29uIHJ1bGVzIGZvcgotb2JqZWN0cyBvZiBkaWZmZXJlbnQgdHlwZXMgYXJlIGxpa2VseSB0byBjaGFuZ2UuKQotCi1Db21wYXJpc29uIG9mIG9iamVjdHMgb2YgdGhlIHNhbWUgdHlwZSBkZXBlbmRzIG9uIHRoZSB0eXBlOgotCi1cYmVnaW57aXRlbWl6ZX0KLQotXGl0ZW0KLU51bWJlcnMgYXJlIGNvbXBhcmVkIGFyaXRobWV0aWNhbGx5LgotCi1caXRlbQotU3RyaW5ncyBhcmUgY29tcGFyZWQgbGV4aWNvZ3JhcGhpY2FsbHkgdXNpbmcgdGhlIG51bWVyaWMgZXF1aXZhbGVudHMKLSh0aGUgcmVzdWx0IG9mIHRoZSBidWlsdC1pbiBmdW5jdGlvbiBcZnVuY3Rpb257b3JkKCl9KSBvZiB0aGVpcgotY2hhcmFjdGVycy4gIFVuaWNvZGUgYW5kIDgtYml0IHN0cmluZ3MgYXJlIGZ1bGx5IGludGVyb3BlcmFibGUgaW4gdGhpcwotYmVoYXZpb3IuCi0KLVxpdGVtCi1UdXBsZXMgYW5kIGxpc3RzIGFyZSBjb21wYXJlZCBsZXhpY29ncmFwaGljYWxseSB1c2luZyBjb21wYXJpc29uIG9mCi1jb3JyZXNwb25kaW5nIGVsZW1lbnRzLiAgVGhpcyBtZWFucyB0aGF0IHRvIGNvbXBhcmUgZXF1YWwsIGVhY2gKLWVsZW1lbnQgbXVzdCBjb21wYXJlIGVxdWFsIGFuZCB0aGUgdHdvIHNlcXVlbmNlcyBtdXN0IGJlIG9mIHRoZSBzYW1lCi10eXBlIGFuZCBoYXZlIHRoZSBzYW1lIGxlbmd0aC4KLQotSWYgbm90IGVxdWFsLCB0aGUgc2VxdWVuY2VzIGFyZSBvcmRlcmVkIHRoZSBzYW1lIGFzIHRoZWlyIGZpcnN0Ci1kaWZmZXJpbmcgZWxlbWVudHMuICBGb3IgZXhhbXBsZSwgXGNvZGV7Y21wKFsxLDIseF0sIFsxLDIseV0pfSByZXR1cm5zCi10aGUgc2FtZSBhcyBcY29kZXtjbXAoeCx5KX0uICBJZiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IGRvZXMgbm90Ci1leGlzdCwgdGhlIHNob3J0ZXIgc2VxdWVuY2UgaXMgb3JkZXJlZCBmaXJzdCAoZm9yIGV4YW1wbGUsCi1cY29kZXtbMSwyXSA8IFsxLDIsM119KS4KLQotXGl0ZW0KLU1hcHBpbmdzIChkaWN0aW9uYXJpZXMpIGNvbXBhcmUgZXF1YWwgaWYgYW5kIG9ubHkgaWYgdGhlaXIgc29ydGVkCi0oa2V5LCB2YWx1ZSkgbGlzdHMgY29tcGFyZSBlcXVhbC5cZm9vdG5vdGV7VGhlIGltcGxlbWVudGF0aW9uIGNvbXB1dGVzCi0gICB0aGlzIGVmZmljaWVudGx5LCB3aXRob3V0IGNvbnN0cnVjdGluZyBsaXN0cyBvciBzb3J0aW5nLn0KLU91dGNvbWVzIG90aGVyIHRoYW4gZXF1YWxpdHkgYXJlIHJlc29sdmVkIGNvbnNpc3RlbnRseSwgYnV0IGFyZSBub3QKLW90aGVyd2lzZSBkZWZpbmVkLlxmb290bm90ZXtFYXJsaWVyIHZlcnNpb25zIG9mIFB5dGhvbiB1c2VkCi0gIGxleGljb2dyYXBoaWMgY29tcGFyaXNvbiBvZiB0aGUgc29ydGVkIChrZXksIHZhbHVlKSBsaXN0cywgYnV0IHRoaXMKLSAgd2FzIHZlcnkgZXhwZW5zaXZlIGZvciB0aGUgY29tbW9uIGNhc2Ugb2YgY29tcGFyaW5nIGZvciBlcXVhbGl0eS4gIEFuCi0gIGV2ZW4gZWFybGllciB2ZXJzaW9uIG9mIFB5dGhvbiBjb21wYXJlZCBkaWN0aW9uYXJpZXMgYnkgaWRlbnRpdHkgb25seSwKLSAgYnV0IHRoaXMgY2F1c2VkIHN1cnByaXNlcyBiZWNhdXNlIHBlb3BsZSBleHBlY3RlZCB0byBiZSBhYmxlIHRvIHRlc3QKLSAgYSBkaWN0aW9uYXJ5IGZvciBlbXB0aW5lc3MgYnkgY29tcGFyaW5nIGl0IHRvIFxjb2Rle1x7XH19Ln0KLQotXGl0ZW0KLU1vc3Qgb3RoZXIgb2JqZWN0cyBvZiBidWlsdGluIHR5cGVzIGNvbXBhcmUgdW5lcXVhbCB1bmxlc3MgdGhleSBhcmUKLXRoZSBzYW1lIG9iamVjdDsKLXRoZSBjaG9pY2Ugd2hldGhlciBvbmUgb2JqZWN0IGlzIGNvbnNpZGVyZWQgc21hbGxlciBvciBsYXJnZXIgdGhhbgotYW5vdGhlciBvbmUgaXMgbWFkZSBhcmJpdHJhcmlseSBidXQgY29uc2lzdGVudGx5IHdpdGhpbiBvbmUKLWV4ZWN1dGlvbiBvZiBhIHByb2dyYW0uCi0KLVxlbmR7aXRlbWl6ZX0KLQotVGhlIG9wZXJhdG9ycyBca2V5d29yZHtpbn0gYW5kIFxrZXl3b3Jke25vdCBpbn0gdGVzdCBmb3Igc2V0Ci1tZW1iZXJzaGlwLiAgXGNvZGV7XHZhcnt4fSBpbiBcdmFye3N9fSBldmFsdWF0ZXMgdG8gdHJ1ZSBpZiBcdmFye3h9Ci1pcyBhIG1lbWJlciBvZiB0aGUgc2V0IFx2YXJ7c30sIGFuZCBmYWxzZSBvdGhlcndpc2UuICBcY29kZXtcdmFye3h9Ci1ub3QgaW4gXHZhcntzfX0gcmV0dXJucyB0aGUgbmVnYXRpb24gb2YgXGNvZGV7XHZhcnt4fSBpbiBcdmFye3N9fS4KLVRoZSBzZXQgbWVtYmVyc2hpcCB0ZXN0IGhhcyB0cmFkaXRpb25hbGx5IGJlZW4gYm91bmQgdG8gc2VxdWVuY2VzOyBhbgotb2JqZWN0IGlzIGEgbWVtYmVyIG9mIGEgc2V0IGlmIHRoZSBzZXQgaXMgYSBzZXF1ZW5jZSBhbmQgY29udGFpbnMgYW4KLWVsZW1lbnQgZXF1YWwgdG8gdGhhdCBvYmplY3QuICBIb3dldmVyLCBpdCBpcyBwb3NzaWJsZSBmb3IgYW4gb2JqZWN0Ci10byBzdXBwb3J0IG1lbWJlcnNoaXAgdGVzdHMgd2l0aG91dCBiZWluZyBhIHNlcXVlbmNlLiAgSW4gcGFydGljdWxhciwKLWRpY3Rpb25hcmllcyBzdXBwb3J0IG1lbWJlcnNoaXAgdGVzdGluZyBhcyBhIG5pY2VyIHdheSBvZiBzcGVsbGluZwotXGNvZGV7XHZhcntrZXl9IGluIFx2YXJ7ZGljdH19OyBvdGhlciBtYXBwaW5nIHR5cGVzIG1heSBmb2xsb3cgc3VpdC4KLQotRm9yIHRoZSBsaXN0IGFuZCB0dXBsZSB0eXBlcywgXGNvZGV7XHZhcnt4fSBpbiBcdmFye3l9fSBpcyB0cnVlIGlmIGFuZAotb25seSBpZiB0aGVyZSBleGlzdHMgYW4gaW5kZXggXHZhcntpfSBzdWNoIHRoYXQKLVxjb2Rle1x2YXJ7eH0gPT0gXHZhcnt5fVtcdmFye2l9XX0gaXMgdHJ1ZS4KLQotRm9yIHRoZSBVbmljb2RlIGFuZCBzdHJpbmcgdHlwZXMsIFxjb2Rle1x2YXJ7eH0gaW4gXHZhcnt5fX0gaXMgdHJ1ZSBpZgotYW5kIG9ubHkgaWYgXHZhcnt4fSBpcyBhIHN1YnN0cmluZyBvZiBcdmFye3l9LiAgQW4gZXF1aXZhbGVudCB0ZXN0IGlzCi1cY29kZXt5LmZpbmQoeCkgIT0gLTF9LiAgTm90ZSwgXHZhcnt4fSBhbmQgXHZhcnt5fSBuZWVkIG5vdCBiZSB0aGUKLXNhbWUgdHlwZTsgY29uc2VxdWVudGx5LCBcY29kZXt1J2FiJyBpbiAnYWJjJ30gd2lsbCByZXR1cm4gXGNvZGV7VHJ1ZX0uCi1FbXB0eSBzdHJpbmdzIGFyZSBhbHdheXMgY29uc2lkZXJlZCB0byBiZSBhIHN1YnN0cmluZyBvZiBhbnkgb3RoZXIgc3RyaW5nLAotc28gXGNvZGV7IiIgaW4gImFiYyJ9IHdpbGwgcmV0dXJuIFxjb2Rle1RydWV9LgotXHZlcnNpb25jaGFuZ2VkW1ByZXZpb3VzbHksIFx2YXJ7eH0gd2FzIHJlcXVpcmVkIHRvIGJlIGEgc3RyaW5nIG9mCi1sZW5ndGggXGNvZGV7MX1dezIuM30KLQotRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRlZmluZSB0aGUgXG1ldGhvZHtfX2NvbnRhaW5zX18oKX0gbWV0aG9kLAotXGNvZGV7XHZhcnt4fSBpbiBcdmFye3l9fSBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmCi1cY29kZXtcdmFye3l9Ll9fY29udGFpbnNfXyhcdmFye3h9KX0gaXMgdHJ1ZS4KLQotRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRvIG5vdCBkZWZpbmUgXG1ldGhvZHtfX2NvbnRhaW5zX18oKX0gYW5kCi1kbyBkZWZpbmUgXG1ldGhvZHtfX2dldGl0ZW1fXygpfSwgXGNvZGV7XHZhcnt4fSBpbiBcdmFye3l9fSBpcyB0cnVlIGlmCi1hbmQgb25seSBpZiB0aGVyZSBpcyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGluZGV4IFx2YXJ7aX0gc3VjaCB0aGF0Ci1cY29kZXtcdmFye3h9ID09IFx2YXJ7eX1bXHZhcntpfV19LCBhbmQgYWxsIGxvd2VyIGludGVnZXIgaW5kaWNlcwotZG8gbm90IHJhaXNlIFxleGNlcHRpb257SW5kZXhFcnJvcn0gZXhjZXB0aW9uLiAoSWYgYW55IG90aGVyIGV4Y2VwdGlvbgotaXMgcmFpc2VkLCBpdCBpcyBhcyBpZiBca2V5d29yZHtpbn0gcmFpc2VkIHRoYXQgZXhjZXB0aW9uKS4KLQotVGhlIG9wZXJhdG9yIFxrZXl3b3Jke25vdCBpbn0gaXMgZGVmaW5lZCB0byBoYXZlIHRoZSBpbnZlcnNlIHRydWUgdmFsdWUKLW9mIFxrZXl3b3Jke2lufS4KLVxvcGluZGV4e2lufQotXG9waW5kZXh7bm90IGlufQotXGluZGV4aWl7bWVtYmVyc2hpcH17dGVzdH0KLVxvYmluZGV4e3NlcXVlbmNlfQotCi1UaGUgb3BlcmF0b3JzIFxrZXl3b3Jke2lzfSBhbmQgXGtleXdvcmR7aXMgbm90fSB0ZXN0IGZvciBvYmplY3QgaWRlbnRpdHk6Ci1cY29kZXtcdmFye3h9IGlzIFx2YXJ7eX19IGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgXHZhcnt4fSBhbmQgXHZhcnt5fQotYXJlIHRoZSBzYW1lIG9iamVjdC4gIFxjb2Rle1x2YXJ7eH0gaXMgbm90IFx2YXJ7eX19IHlpZWxkcyB0aGUgaW52ZXJzZQotdHJ1dGggdmFsdWUuCi1cb3BpbmRleHtpc30KLVxvcGluZGV4e2lzIG5vdH0KLVxpbmRleGlpe2lkZW50aXR5fXt0ZXN0fQotCi0KLVxzZWN0aW9ue0Jvb2xlYW4gb3BlcmF0aW9uc1xsYWJlbHtCb29sZWFuc319Ci1caW5kZXhpaXtDb25kaXRpb25hbH17ZXhwcmVzc2lvbn0KLVxpbmRleGlpe0Jvb2xlYW59e29wZXJhdGlvbn0KLQotQm9vbGVhbiBvcGVyYXRpb25zIGhhdmUgdGhlIGxvd2VzdCBwcmlvcml0eSBvZiBhbGwgUHl0aG9uIG9wZXJhdGlvbnM6Ci0KLVxiZWdpbntwcm9kdWN0aW9ubGlzdH0KLSAgXHByb2R1Y3Rpb257ZXhwcmVzc2lvbn0KLSAgICAgICAgICAgICB7XHRva2Vue2NvbmRpdGlvbmFsX2V4cHJlc3Npb259IHwgXHRva2Vue2xhbWJkYV9mb3JtfX0KLSAgXHByb2R1Y3Rpb257b2xkX2V4cHJlc3Npb259Ci0gICAgICAgICAgICAge1x0b2tlbntvcl90ZXN0fSB8IFx0b2tlbntvbGRfbGFtYmRhX2Zvcm19fQotICBccHJvZHVjdGlvbntjb25kaXRpb25hbF9leHByZXNzaW9ufQotICAgICAgICAgICAgIHtcdG9rZW57b3JfdGVzdH0gWyJpZiIgXHRva2Vue29yX3Rlc3R9ICJlbHNlIiBcdG9rZW57ZXhwcmVzc2lvbn1dfQotICBccHJvZHVjdGlvbntvcl90ZXN0fQotICAgICAgICAgICAgIHtcdG9rZW57YW5kX3Rlc3R9IHwgXHRva2Vue29yX3Rlc3R9ICJvciIgXHRva2Vue2FuZF90ZXN0fX0KLSAgXHByb2R1Y3Rpb257YW5kX3Rlc3R9Ci0gICAgICAgICAgICAge1x0b2tlbntub3RfdGVzdH0gfCBcdG9rZW57YW5kX3Rlc3R9ICJhbmQiIFx0b2tlbntub3RfdGVzdH19Ci0gIFxwcm9kdWN0aW9ue25vdF90ZXN0fQotICAgICAgICAgICAgIHtcdG9rZW57Y29tcGFyaXNvbn0gfCAibm90IiBcdG9rZW57bm90X3Rlc3R9fQotXGVuZHtwcm9kdWN0aW9ubGlzdH0KLQotSW4gdGhlIGNvbnRleHQgb2YgQm9vbGVhbiBvcGVyYXRpb25zLCBhbmQgYWxzbyB3aGVuIGV4cHJlc3Npb25zIGFyZQotdXNlZCBieSBjb250cm9sIGZsb3cgc3RhdGVtZW50cywgdGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIGludGVycHJldGVkCi1hcyBmYWxzZTogXGNvZGV7RmFsc2V9LCBcY29kZXtOb25lfSwgbnVtZXJpYyB6ZXJvIG9mIGFsbCB0eXBlcywgYW5kIGVtcHR5Ci1zdHJpbmdzIGFuZCBjb250YWluZXJzIChpbmNsdWRpbmcgc3RyaW5ncywgdHVwbGVzLCBsaXN0cywgZGljdGlvbmFyaWVzLAotc2V0cyBhbmQgZnJvemVuc2V0cykuICBBbGwgb3RoZXIgdmFsdWVzIGFyZSBpbnRlcnByZXRlZCBhcyB0cnVlLgotCi1UaGUgb3BlcmF0b3IgXGtleXdvcmR7bm90fSB5aWVsZHMgXGNvZGV7VHJ1ZX0gaWYgaXRzIGFyZ3VtZW50IGlzIGZhbHNlLAotXGNvZGV7RmFsc2V9IG90aGVyd2lzZS4KLVxvcGluZGV4e25vdH0KLQotVGhlIGV4cHJlc3Npb24gXGNvZGV7XHZhcnt4fSBpZiBcdmFye0N9IGVsc2UgXHZhcnt5fX0gZmlyc3QgZXZhbHVhdGVzCi1cdmFye0N9IChcZW1waHtub3R9IFx2YXJ7eH0pOyBpZiBcdmFye0N9IGlzIHRydWUsIFx2YXJ7eH0gaXMgZXZhbHVhdGVkIGFuZAotaXRzIHZhbHVlIGlzIHJldHVybmVkOyBvdGhlcndpc2UsIFx2YXJ7eX0gaXMgZXZhbHVhdGVkIGFuZCBpdHMgdmFsdWUgaXMKLXJldHVybmVkLiAgXHZlcnNpb25hZGRlZHsyLjV9Ci0KLVRoZSBleHByZXNzaW9uIFxjb2Rle1x2YXJ7eH0gYW5kIFx2YXJ7eX19IGZpcnN0IGV2YWx1YXRlcyBcdmFye3h9OyBpZgotXHZhcnt4fSBpcyBmYWxzZSwgaXRzIHZhbHVlIGlzIHJldHVybmVkOyBvdGhlcndpc2UsIFx2YXJ7eX0gaXMKLWV2YWx1YXRlZCBhbmQgdGhlIHJlc3VsdGluZyB2YWx1ZSBpcyByZXR1cm5lZC4KLVxvcGluZGV4e2FuZH0KLQotVGhlIGV4cHJlc3Npb24gXGNvZGV7XHZhcnt4fSBvciBcdmFye3l9fSBmaXJzdCBldmFsdWF0ZXMgXHZhcnt4fTsgaWYKLVx2YXJ7eH0gaXMgdHJ1ZSwgaXRzIHZhbHVlIGlzIHJldHVybmVkOyBvdGhlcndpc2UsIFx2YXJ7eX0gaXMKLWV2YWx1YXRlZCBhbmQgdGhlIHJlc3VsdGluZyB2YWx1ZSBpcyByZXR1cm5lZC4KLVxvcGluZGV4e29yfQotCi0oTm90ZSB0aGF0IG5laXRoZXIgXGtleXdvcmR7YW5kfSBub3IgXGtleXdvcmR7b3J9IHJlc3RyaWN0IHRoZSB2YWx1ZQotYW5kIHR5cGUgdGhleSByZXR1cm4gdG8gXGNvZGV7RmFsc2V9IGFuZCBcY29kZXtUcnVlfSwgYnV0IHJhdGhlciByZXR1cm4gdGhlCi1sYXN0IGV2YWx1YXRlZCBhcmd1bWVudC4KLVRoaXMgaXMgc29tZXRpbWVzIHVzZWZ1bCwgZS5nLiwgaWYgXGNvZGV7c30gaXMgYSBzdHJpbmcgdGhhdCBzaG91bGQgYmUKLXJlcGxhY2VkIGJ5IGEgZGVmYXVsdCB2YWx1ZSBpZiBpdCBpcyBlbXB0eSwgdGhlIGV4cHJlc3Npb24KLVxjb2Rle3Mgb3IgJ2Zvbyd9IHlpZWxkcyB0aGUgZGVzaXJlZCB2YWx1ZS4gIEJlY2F1c2UgXGtleXdvcmR7bm90fSBoYXMgdG8KLWludmVudCBhIHZhbHVlIGFueXdheSwgaXQgZG9lcyBub3QgYm90aGVyIHRvIHJldHVybiBhIHZhbHVlIG9mIHRoZQotc2FtZSB0eXBlIGFzIGl0cyBhcmd1bWVudCwgc28gZS5nLiwgXGNvZGV7bm90ICdmb28nfSB5aWVsZHMgXGNvZGV7RmFsc2V9LAotbm90IFxjb2RleycnfS4pCi0KLVxzZWN0aW9ue0xhbWJkYXNcbGFiZWx7bGFtYmRhc319Ci1caW5kZXhpaXtsYW1iZGF9e2V4cHJlc3Npb259Ci1caW5kZXhpaXtsYW1iZGF9e2Zvcm19Ci1caW5kZXhpaXthbm9ueW1vdXN9e2Z1bmN0aW9ufQotCi1cYmVnaW57cHJvZHVjdGlvbmxpc3R9Ci0gIFxwcm9kdWN0aW9ue2xhbWJkYV9mb3JtfQotICAgICAgICAgICAgIHsibGFtYmRhIiBbXHRva2Vue3BhcmFtZXRlcl9saXN0fV06IFx0b2tlbntleHByZXNzaW9ufX0KLSAgXHByb2R1Y3Rpb257b2xkX2xhbWJkYV9mb3JtfQotICAgICAgICAgICAgIHsibGFtYmRhIiBbXHRva2Vue3BhcmFtZXRlcl9saXN0fV06IFx0b2tlbntvbGRfZXhwcmVzc2lvbn19Ci1cZW5ke3Byb2R1Y3Rpb25saXN0fQotCi1MYW1iZGEgZm9ybXMgKGxhbWJkYSBleHByZXNzaW9ucykgaGF2ZSB0aGUgc2FtZSBzeW50YWN0aWMgcG9zaXRpb24gYXMKLWV4cHJlc3Npb25zLiAgVGhleSBhcmUgYSBzaG9ydGhhbmQgdG8gY3JlYXRlIGFub255bW91cyBmdW5jdGlvbnM7IHRoZQotZXhwcmVzc2lvbiBcY29kZXtsYW1iZGEgXHZhcnthcmd1bWVudHN9OiBcdmFye2V4cHJlc3Npb259fQoteWllbGRzIGEgZnVuY3Rpb24gb2JqZWN0LiAgVGhlIHVubmFtZWQgb2JqZWN0IGJlaGF2ZXMgbGlrZSBhIGZ1bmN0aW9uCi1vYmplY3QgZGVmaW5lZCB3aXRoCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLWRlZiBuYW1lKGFyZ3VtZW50cyk6Ci0gICAgcmV0dXJuIGV4cHJlc3Npb24KLVxlbmR7dmVyYmF0aW19Ci0KLVNlZSBzZWN0aW9uIFxyZWZ7ZnVuY3Rpb259IGZvciB0aGUgc3ludGF4IG9mIHBhcmFtZXRlciBsaXN0cy4gIE5vdGUKLXRoYXQgZnVuY3Rpb25zIGNyZWF0ZWQgd2l0aCBsYW1iZGEgZm9ybXMgY2Fubm90IGNvbnRhaW4gc3RhdGVtZW50cwotb3IgYW5ub3RhdGlvbnMuCi1cbGFiZWx7bGFtYmRhfQotCi1cc2VjdGlvbntFeHByZXNzaW9uIGxpc3RzXGxhYmVse2V4cHJsaXN0c319Ci1caW5kZXhpaXtleHByZXNzaW9ufXtsaXN0fQotCi1cYmVnaW57cHJvZHVjdGlvbmxpc3R9Ci0gIFxwcm9kdWN0aW9ue2V4cHJlc3Npb25fbGlzdH0KLSAgICAgICAgICAgICB7XHRva2Vue2V4cHJlc3Npb259ICggIiwiIFx0b2tlbntleHByZXNzaW9ufSApKiBbIiwiXX0KLVxlbmR7cHJvZHVjdGlvbmxpc3R9Ci0KLUFuIGV4cHJlc3Npb24gbGlzdCBjb250YWluaW5nIGF0IGxlYXN0IG9uZSBjb21tYSB5aWVsZHMgYQotdHVwbGUuICBUaGUgbGVuZ3RoIG9mIHRoZSB0dXBsZSBpcyB0aGUgbnVtYmVyIG9mIGV4cHJlc3Npb25zIGluIHRoZQotbGlzdC4gIFRoZSBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIGZyb20gbGVmdCB0byByaWdodC4KLVxvYmluZGV4e3R1cGxlfQotCi1UaGUgdHJhaWxpbmcgY29tbWEgaXMgcmVxdWlyZWQgb25seSB0byBjcmVhdGUgYSBzaW5nbGUgdHVwbGUgKGEuay5hLiBhCi1cZW1waHtzaW5nbGV0b259KTsgaXQgaXMgb3B0aW9uYWwgaW4gYWxsIG90aGVyIGNhc2VzLiAgQSBzaW5nbGUKLWV4cHJlc3Npb24gd2l0aG91dCBhIHRyYWlsaW5nIGNvbW1hIGRvZXNuJ3QgY3JlYXRlIGEKLXR1cGxlLCBidXQgcmF0aGVyIHlpZWxkcyB0aGUgdmFsdWUgb2YgdGhhdCBleHByZXNzaW9uLgotKFRvIGNyZWF0ZSBhbiBlbXB0eSB0dXBsZSwgdXNlIGFuIGVtcHR5IHBhaXIgb2YgcGFyZW50aGVzZXM6Ci1cY29kZXsoKX0uKQotXGluZGV4aWl7dHJhaWxpbmd9e2NvbW1hfQotCi1cc2VjdGlvbntFdmFsdWF0aW9uIG9yZGVyXGxhYmVse2V2YWxvcmRlcn19Ci1caW5kZXhpaXtldmFsdWF0aW9ufXtvcmRlcn0KLQotUHl0aG9uIGV2YWx1YXRlcyBleHByZXNzaW9ucyBmcm9tIGxlZnQgdG8gcmlnaHQuIE5vdGljZSB0aGF0IHdoaWxlCi1ldmFsdWF0aW5nIGFuIGFzc2lnbm1lbnQsIHRoZSByaWdodC1oYW5kIHNpZGUgaXMgZXZhbHVhdGVkIGJlZm9yZQotdGhlIGxlZnQtaGFuZCBzaWRlLgotCi1JbiB0aGUgZm9sbG93aW5nIGxpbmVzLCBleHByZXNzaW9ucyB3aWxsIGJlIGV2YWx1YXRlZCBpbiB0aGUKLWFyaXRobWV0aWMgb3JkZXIgb2YgdGhlaXIgc3VmZml4ZXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWV4cHIxLCBleHByMiwgZXhwcjMsIGV4cHI0Ci0oZXhwcjEsIGV4cHIyLCBleHByMywgZXhwcjQpCi17ZXhwcjE6IGV4cHIyLCBleHByMzogZXhwcjR9Ci1leHByMSArIGV4cHIyICogKGV4cHIzIC0gZXhwcjQpCi1mdW5jKGV4cHIxLCBleHByMiwgKmV4cHIzLCAqKmV4cHI0KQotZXhwcjMsIGV4cHI0ID0gZXhwcjEsIGV4cHIyCi1cZW5ke3ZlcmJhdGltfQotCi1cc2VjdGlvbntTdW1tYXJ5XGxhYmVse3N1bW1hcnl9fQotCi1UaGUgZm9sbG93aW5nIHRhYmxlIHN1bW1hcml6ZXMgdGhlIG9wZXJhdG9yCi1wcmVjZWRlbmNlc1xpbmRleGlpe29wZXJhdG9yfXtwcmVjZWRlbmNlfSBpbiBQeXRob24sIGZyb20gbG93ZXN0Ci1wcmVjZWRlbmNlIChsZWFzdCBiaW5kaW5nKSB0byBoaWdoZXN0IHByZWNlZGVuY2UgKG1vc3QgYmluZGluZykuCi1PcGVyYXRvcnMgaW4gdGhlIHNhbWUgYm94IGhhdmUgdGhlIHNhbWUgcHJlY2VkZW5jZS4gIFVubGVzcyB0aGUgc3ludGF4Ci1pcyBleHBsaWNpdGx5IGdpdmVuLCBvcGVyYXRvcnMgYXJlIGJpbmFyeS4gIE9wZXJhdG9ycyBpbiB0aGUgc2FtZSBib3gKLWdyb3VwIGxlZnQgdG8gcmlnaHQgKGV4Y2VwdCBmb3IgY29tcGFyaXNvbnMsIGluY2x1ZGluZyB0ZXN0cywgd2hpY2ggYWxsCi1oYXZlIHRoZSBzYW1lIHByZWNlZGVuY2UgYW5kIGNoYWluIGZyb20gbGVmdCB0byByaWdodCAtLS0gc2VlIHNlY3Rpb24KLVxyZWZ7Y29tcGFyaXNvbnN9IC0tIGFuZCBleHBvbmVudGlhdGlvbiwgd2hpY2ggZ3JvdXBzIGZyb20gcmlnaHQgdG8gbGVmdCkuCi0KLVxiZWdpbnt0YWJsZWlpfXtjfGx9e3RleHRybX17T3BlcmF0b3J9e0Rlc2NyaXB0aW9ufQotICAgIFxsaW5laWl7XGtleXdvcmR7bGFtYmRhfX0JCQl7TGFtYmRhIGV4cHJlc3Npb259Ci0gIFxobGluZQotICAgIFxsaW5laWl7XGtleXdvcmR7b3J9fQkJCXtCb29sZWFuIE9SfQotICBcaGxpbmUKLSAgICBcbGluZWlpe1xrZXl3b3Jke2FuZH19CQkJe0Jvb2xlYW4gQU5EfQotICBcaGxpbmUKLSAgICBcbGluZWlpe1xrZXl3b3Jke25vdH0gXHZhcnt4fX0JCXtCb29sZWFuIE5PVH0KLSAgXGhsaW5lCi0gICAgXGxpbmVpaXtca2V5d29yZHtpbn0sIFxrZXl3b3Jke25vdH0gXGtleXdvcmR7aW59fXtNZW1iZXJzaGlwIHRlc3RzfQotICAgIFxsaW5laWl7XGtleXdvcmR7aXN9LCBca2V5d29yZHtpcyBub3R9fXtJZGVudGl0eSB0ZXN0c30KLSAgICBcbGluZWlpe1xjb2Rlezx9LCBcY29kZXs8PX0sIFxjb2Rlez59LCBcY29kZXs+PX0sCi0gICAgICAgICAgICBcY29kZXshPX0sIFxjb2Rlez09fX0KLQkgICB7Q29tcGFyaXNvbnN9Ci0gIFxobGluZQotICAgIFxsaW5laWl7XGNvZGV7fH19CQkJCXtCaXR3aXNlIE9SfQotICBcaGxpbmUKLSAgICBcbGluZWlpe1xjb2Rle1xefX0JCQkJe0JpdHdpc2UgWE9SfQotICBcaGxpbmUKLSAgICBcbGluZWlpe1xjb2Rle1wmfX0JCQkJe0JpdHdpc2UgQU5EfQotICBcaGxpbmUKLSAgICBcbGluZWlpe1xjb2Rlezw8fSwgXGNvZGV7Pj59fQkJe1NoaWZ0c30KLSAgXGhsaW5lCi0gICAgXGxpbmVpaXtcY29kZXsrfSwgXGNvZGV7LX19e0FkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbn0KLSAgXGhsaW5lCi0gICAgXGxpbmVpaXtcY29kZXsqfSwgXGNvZGV7L30sIFxjb2Rle1wlfX0KLSAgICAgICAgICAge011bHRpcGxpY2F0aW9uLCBkaXZpc2lvbiwgcmVtYWluZGVyfQotICBcaGxpbmUKLSAgICBcbGluZWlpe1xjb2RleytcdmFye3h9fSwgXGNvZGV7LVx2YXJ7eH19fQl7UG9zaXRpdmUsIG5lZ2F0aXZlfQotICAgIFxsaW5laWl7XGNvZGV7XH5cdmFye3h9fX0JCQl7Qml0d2lzZSBub3R9Ci0gIFxobGluZQotICAgIFxsaW5laWl7XGNvZGV7Kip9fQkJCQl7RXhwb25lbnRpYXRpb259Ci0gIFxobGluZQotICAgIFxsaW5laWl7XGNvZGV7XHZhcnt4fS5cdmFye2F0dHJpYnV0ZX19fQl7QXR0cmlidXRlIHJlZmVyZW5jZX0KLSAgICBcbGluZWlpe1xjb2Rle1x2YXJ7eH1bXHZhcntpbmRleH1dfX0Je1N1YnNjcmlwdGlvbn0KLSAgICBcbGluZWlpe1xjb2Rle1x2YXJ7eH1bXHZhcntpbmRleH06XHZhcntpbmRleH1dfX0Je1NsaWNpbmd9Ci0gICAgXGxpbmVpaXtcY29kZXtcdmFye2Z9KFx2YXJ7YXJndW1lbnRzfS4uLil9fQl7RnVuY3Rpb24gY2FsbH0KLSAgXGhsaW5lCi0gICAgXGxpbmVpaXtcY29kZXsoXHZhcntleHByZXNzaW9uc31cbGRvdHMpfX0Je0JpbmRpbmcgb3IgdHVwbGUgZGlzcGxheX0KLSAgICBcbGluZWlpe1xjb2Rle1tcdmFye2V4cHJlc3Npb25zfVxsZG90c119fQl7TGlzdCBkaXNwbGF5fQotICAgIFxsaW5laWl7XGNvZGV7XHtcdmFye2tleX06XHZhcntkYXR1bX1cbGRvdHNcfX19e0RpY3Rpb25hcnkgZGlzcGxheX0KLSAgICBcbGluZWlpe1xjb2Rle2BcdmFye2V4cHJlc3Npb25zfVxsZG90c2B9fQl7U3RyaW5nIGNvbnZlcnNpb259Ci1cZW5ke3RhYmxlaWl9CmRpZmYgLS1naXQgYS9Eb2MvcmVmL3JlZjYudGV4IGIvRG9jL3JlZi9yZWY2LnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEzOTAwNS4uMDAwMDAwMAotLS0gYS9Eb2MvcmVmL3JlZjYudGV4CisrKyAvZGV2L251bGwKQEAgLTEsODE4ICswLDAgQEAKLVxjaGFwdGVye1NpbXBsZSBzdGF0ZW1lbnRzIFxsYWJlbHtzaW1wbGV9fQotXGluZGV4aWl7c2ltcGxlfXtzdGF0ZW1lbnR9Ci0KLVNpbXBsZSBzdGF0ZW1lbnRzIGFyZSBjb21wcmlzZWQgd2l0aGluIGEgc2luZ2xlIGxvZ2ljYWwgbGluZS4KLVNldmVyYWwgc2ltcGxlIHN0YXRlbWVudHMgbWF5IG9jY3VyIG9uIGEgc2luZ2xlIGxpbmUgc2VwYXJhdGVkCi1ieSBzZW1pY29sb25zLiAgVGhlIHN5bnRheCBmb3Igc2ltcGxlIHN0YXRlbWVudHMgaXM6Ci0KLVxiZWdpbntwcm9kdWN0aW9ubGlzdH0KLSAgXHByb2R1Y3Rpb257c2ltcGxlX3N0bXR9e1x0b2tlbntleHByZXNzaW9uX3N0bXR9fQotICBccHJvZHVjdGlvbmNvbnR7fCBcdG9rZW57YXNzZXJ0X3N0bXR9fQotICBccHJvZHVjdGlvbmNvbnR7fCBcdG9rZW57YXNzaWdubWVudF9zdG10fX0KLSAgXHByb2R1Y3Rpb25jb250e3wgXHRva2Vue2F1Z21lbnRlZF9hc3NpZ25tZW50X3N0bXR9fQotICBccHJvZHVjdGlvbmNvbnR7fCBcdG9rZW57cGFzc19zdG10fX0KLSAgXHByb2R1Y3Rpb25jb250e3wgXHRva2Vue2RlbF9zdG10fX0KLSAgXHByb2R1Y3Rpb25jb250e3wgXHRva2Vue3JldHVybl9zdG10fX0KLSAgXHByb2R1Y3Rpb25jb250e3wgXHRva2Vue3lpZWxkX3N0bXR9fQotICBccHJvZHVjdGlvbmNvbnR7fCBcdG9rZW57cmFpc2Vfc3RtdH19Ci0gIFxwcm9kdWN0aW9uY29udHt8IFx0b2tlbnticmVha19zdG10fX0KLSAgXHByb2R1Y3Rpb25jb250e3wgXHRva2Vue2NvbnRpbnVlX3N0bXR9fQotICBccHJvZHVjdGlvbmNvbnR7fCBcdG9rZW57aW1wb3J0X3N0bXR9fQotICBccHJvZHVjdGlvbmNvbnR7fCBcdG9rZW57Z2xvYmFsX3N0bXR9fQotXGVuZHtwcm9kdWN0aW9ubGlzdH0KLQotCi1cc2VjdGlvbntFeHByZXNzaW9uIHN0YXRlbWVudHMgXGxhYmVse2V4cHJzdG10c319Ci1caW5kZXhpaXtleHByZXNzaW9ufXtzdGF0ZW1lbnR9Ci0KLUV4cHJlc3Npb24gc3RhdGVtZW50cyBhcmUgdXNlZCAobW9zdGx5IGludGVyYWN0aXZlbHkpIHRvIGNvbXB1dGUgYW5kCi13cml0ZSBhIHZhbHVlLCBvciAodXN1YWxseSkgdG8gY2FsbCBhIHByb2NlZHVyZSAoYSBmdW5jdGlvbiB0aGF0Ci1yZXR1cm5zIG5vIG1lYW5pbmdmdWwgcmVzdWx0OyBpbiBQeXRob24sIHByb2NlZHVyZXMgcmV0dXJuIHRoZSB2YWx1ZQotXGNvZGV7Tm9uZX0pLiAgT3RoZXIgdXNlcyBvZiBleHByZXNzaW9uIHN0YXRlbWVudHMgYXJlIGFsbG93ZWQgYW5kCi1vY2Nhc2lvbmFsbHkgdXNlZnVsLiAgVGhlIHN5bnRheCBmb3IgYW4gZXhwcmVzc2lvbiBzdGF0ZW1lbnQgaXM6Ci0KLVxiZWdpbntwcm9kdWN0aW9ubGlzdH0KLSAgXHByb2R1Y3Rpb257ZXhwcmVzc2lvbl9zdG10fQotICAgICAgICAgICAgIHtcdG9rZW57ZXhwcmVzc2lvbl9saXN0fX0KLVxlbmR7cHJvZHVjdGlvbmxpc3R9Ci0KLUFuIGV4cHJlc3Npb24gc3RhdGVtZW50IGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiBsaXN0ICh3aGljaCBtYXkgYmUgYQotc2luZ2xlIGV4cHJlc3Npb24pLgotXGluZGV4aWl7ZXhwcmVzc2lvbn17bGlzdH0KLQotSW4gaW50ZXJhY3RpdmUgbW9kZSwgaWYgdGhlIHZhbHVlIGlzIG5vdCBcY29kZXtOb25lfSwgaXQgaXMgY29udmVydGVkCi10byBhIHN0cmluZyB1c2luZyB0aGUgYnVpbHQtaW4gXGZ1bmN0aW9ue3JlcHIoKX1cYmlmdW5jaW5kZXh7cmVwcn0KLWZ1bmN0aW9uIGFuZCB0aGUgcmVzdWx0aW5nIHN0cmluZyBpcyB3cml0dGVuIHRvIHN0YW5kYXJkIG91dHB1dCAoc2VlCi1zZWN0aW9uflxyZWZ7cHJpbnR9KSBvbiBhIGxpbmUgYnkgaXRzZWxmLiAgKEV4cHJlc3Npb24gc3RhdGVtZW50cwoteWllbGRpbmcgXGNvZGV7Tm9uZX0gYXJlIG5vdCB3cml0dGVuLCBzbyB0aGF0IHByb2NlZHVyZSBjYWxscyBkbyBub3QKLWNhdXNlIGFueSBvdXRwdXQuKQotXG9iaW5kZXh7Tm9uZX0KLVxpbmRleGlpe3N0cmluZ317Y29udmVyc2lvbn0KLVxpbmRleHtvdXRwdXR9Ci1caW5kZXhpaXtzdGFuZGFyZH17b3V0cHV0fQotXGluZGV4aWl7d3JpdGluZ317dmFsdWVzfQotXGluZGV4aWl7cHJvY2VkdXJlfXtjYWxsfQotCi0KLVxzZWN0aW9ue0Fzc2VydCBzdGF0ZW1lbnRzIFxsYWJlbHthc3NlcnR9fQotCi1Bc3NlcnQgc3RhdGVtZW50c1xzdGluZGV4e2Fzc2VydH0gYXJlIGEgY29udmVuaWVudCB3YXkgdG8gaW5zZXJ0Ci1kZWJ1Z2dpbmcgYXNzZXJ0aW9uc1xpbmRleGlpe2RlYnVnZ2luZ317YXNzZXJ0aW9uc30gaW50byBhIHByb2dyYW06Ci0KLVxiZWdpbntwcm9kdWN0aW9ubGlzdH0KLSAgXHByb2R1Y3Rpb257YXNzZXJ0X3N0bXR9Ci0gICAgICAgICAgICAgeyJhc3NlcnQiIFx0b2tlbntleHByZXNzaW9ufSBbIiwiIFx0b2tlbntleHByZXNzaW9ufV19Ci1cZW5ke3Byb2R1Y3Rpb25saXN0fQotCi1UaGUgc2ltcGxlIGZvcm0sIFxzYW1we2Fzc2VydCBleHByZXNzaW9ufSwgaXMgZXF1aXZhbGVudCB0bwotCi1cYmVnaW57dmVyYmF0aW19Ci1pZiBfX2RlYnVnX186Ci0gICBpZiBub3QgZXhwcmVzc2lvbjogcmFpc2UgQXNzZXJ0aW9uRXJyb3IKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBleHRlbmRlZCBmb3JtLCBcc2FtcHthc3NlcnQgZXhwcmVzc2lvbjEsIGV4cHJlc3Npb24yfSwgaXMKLWVxdWl2YWxlbnQgdG8KLQotXGJlZ2lue3ZlcmJhdGltfQotaWYgX19kZWJ1Z19fOgotICAgaWYgbm90IGV4cHJlc3Npb24xOiByYWlzZSBBc3NlcnRpb25FcnJvciwgZXhwcmVzc2lvbjIKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZXNlIGVxdWl2YWxlbmNlcyBhc3N1bWUgdGhhdCBcY29kZXtfX2RlYnVnX199XHR0aW5kZXh7X19kZWJ1Z19ffSBhbmQKLVxleGNlcHRpb257QXNzZXJ0aW9uRXJyb3J9XGV4aW5kZXh7QXNzZXJ0aW9uRXJyb3J9IHJlZmVyIHRvIHRoZSBidWlsdC1pbgotdmFyaWFibGVzIHdpdGggdGhvc2UgbmFtZXMuICBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgdGhlCi1idWlsdC1pbiB2YXJpYWJsZSBcY29kZXtfX2RlYnVnX199IGlzIFxjb2Rle1RydWV9IHVuZGVyIG5vcm1hbAotY2lyY3Vtc3RhbmNlcywgXGNvZGV7RmFsc2V9IHdoZW4gb3B0aW1pemF0aW9uIGlzIHJlcXVlc3RlZCAoY29tbWFuZCBsaW5lCi1vcHRpb24gLU8pLiAgVGhlIGN1cnJlbnQgY29kZSBnZW5lcmF0b3IgZW1pdHMgbm8gY29kZSBmb3IgYW4gYXNzZXJ0Ci1zdGF0ZW1lbnQgd2hlbiBvcHRpbWl6YXRpb24gaXMgcmVxdWVzdGVkIGF0IGNvbXBpbGUgdGltZS4gIE5vdGUgdGhhdCBpdAotaXMgdW5uZWNlc3NhcnkgdG8gaW5jbHVkZSB0aGUgc291cmNlIGNvZGUgZm9yIHRoZSBleHByZXNzaW9uIHRoYXQgZmFpbGVkCi1pbiB0aGUgZXJyb3IgbWVzc2FnZTsKLWl0IHdpbGwgYmUgZGlzcGxheWVkIGFzIHBhcnQgb2YgdGhlIHN0YWNrIHRyYWNlLgotCi1Bc3NpZ25tZW50cyB0byBcY29kZXtfX2RlYnVnX199IGFyZSBpbGxlZ2FsLiAgVGhlIHZhbHVlIGZvciB0aGUKLWJ1aWx0LWluIHZhcmlhYmxlIGlzIGRldGVybWluZWQgd2hlbiB0aGUgaW50ZXJwcmV0ZXIgc3RhcnRzLgotCi0KLVxzZWN0aW9ue0Fzc2lnbm1lbnQgc3RhdGVtZW50cyBcbGFiZWx7YXNzaWdubWVudH19Ci0KLUFzc2lnbm1lbnQgc3RhdGVtZW50c1xpbmRleGlpe2Fzc2lnbm1lbnR9e3N0YXRlbWVudH0gYXJlIHVzZWQgdG8KLShyZSliaW5kIG5hbWVzIHRvIHZhbHVlcyBhbmQgdG8gbW9kaWZ5IGF0dHJpYnV0ZXMgb3IgaXRlbXMgb2YgbXV0YWJsZQotb2JqZWN0czoKLVxpbmRleGlpe2JpbmRpbmd9e25hbWV9Ci1caW5kZXhpaXtyZWJpbmRpbmd9e25hbWV9Ci1cb2JpbmRleHttdXRhYmxlfQotXGluZGV4aWl7YXR0cmlidXRlfXthc3NpZ25tZW50fQotCi1cYmVnaW57cHJvZHVjdGlvbmxpc3R9Ci0gIFxwcm9kdWN0aW9ue2Fzc2lnbm1lbnRfc3RtdH0KLSAgICAgICAgICAgICB7KFx0b2tlbnt0YXJnZXRfbGlzdH0gIj0iKSsKLSAgICAgICAgICAgICAgKFx0b2tlbntleHByZXNzaW9uX2xpc3R9IHwgXHRva2Vue3lpZWxkX2V4cHJlc3Npb259KX0KLSAgXHByb2R1Y3Rpb257dGFyZ2V0X2xpc3R9Ci0gICAgICAgICAgICAge1x0b2tlbnt0YXJnZXR9ICgiLCIgXHRva2Vue3RhcmdldH0pKiBbIiwiXX0KLSAgXHByb2R1Y3Rpb257dGFyZ2V0fQotICAgICAgICAgICAgIHtcdG9rZW57aWRlbnRpZmllcn19Ci0gIFxwcm9kdWN0aW9uY29udHt8ICIoIiBcdG9rZW57dGFyZ2V0X2xpc3R9ICIpIn0KLSAgXHByb2R1Y3Rpb25jb250e3wgIlsiIFx0b2tlbnt0YXJnZXRfbGlzdH0gIl0ifQotICBccHJvZHVjdGlvbmNvbnR7fCBcdG9rZW57YXR0cmlidXRlcmVmfX0KLSAgXHByb2R1Y3Rpb25jb250e3wgXHRva2Vue3N1YnNjcmlwdGlvbn19Ci0gIFxwcm9kdWN0aW9uY29udHt8IFx0b2tlbntzbGljaW5nfX0KLVxlbmR7cHJvZHVjdGlvbmxpc3R9Ci0KLShTZWUgc2VjdGlvbn5ccmVme3ByaW1hcmllc30gZm9yIHRoZSBzeW50YXggZGVmaW5pdGlvbnMgZm9yIHRoZSBsYXN0Ci10aHJlZSBzeW1ib2xzLikKLQotQW4gYXNzaWdubWVudCBzdGF0ZW1lbnQgZXZhbHVhdGVzIHRoZSBleHByZXNzaW9uIGxpc3QgKHJlbWVtYmVyIHRoYXQKLXRoaXMgY2FuIGJlIGEgc2luZ2xlIGV4cHJlc3Npb24gb3IgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCwgdGhlIGxhdHRlcgoteWllbGRpbmcgYSB0dXBsZSkgYW5kIGFzc2lnbnMgdGhlIHNpbmdsZSByZXN1bHRpbmcgb2JqZWN0IHRvIGVhY2ggb2YKLXRoZSB0YXJnZXQgbGlzdHMsIGZyb20gbGVmdCB0byByaWdodC4KLVxpbmRleGlpe2V4cHJlc3Npb259e2xpc3R9Ci0KLUFzc2lnbm1lbnQgaXMgZGVmaW5lZCByZWN1cnNpdmVseSBkZXBlbmRpbmcgb24gdGhlIGZvcm0gb2YgdGhlIHRhcmdldAotKGxpc3QpLiAgV2hlbiBhIHRhcmdldCBpcyBwYXJ0IG9mIGEgbXV0YWJsZSBvYmplY3QgKGFuIGF0dHJpYnV0ZQotcmVmZXJlbmNlLCBzdWJzY3JpcHRpb24gb3Igc2xpY2luZyksIHRoZSBtdXRhYmxlIG9iamVjdCBtdXN0Ci11bHRpbWF0ZWx5IHBlcmZvcm0gdGhlIGFzc2lnbm1lbnQgYW5kIGRlY2lkZSBhYm91dCBpdHMgdmFsaWRpdHksIGFuZAotbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgYXNzaWdubWVudCBpcyB1bmFjY2VwdGFibGUuICBUaGUgcnVsZXMKLW9ic2VydmVkIGJ5IHZhcmlvdXMgdHlwZXMgYW5kIHRoZSBleGNlcHRpb25zIHJhaXNlZCBhcmUgZ2l2ZW4gd2l0aCB0aGUKLWRlZmluaXRpb24gb2YgdGhlIG9iamVjdCB0eXBlcyAoc2VlIHNlY3Rpb25+XHJlZnt0eXBlc30pLgotXGluZGV4e3RhcmdldH0KLVxpbmRleGlpe3RhcmdldH17bGlzdH0KLQotQXNzaWdubWVudCBvZiBhbiBvYmplY3QgdG8gYSB0YXJnZXQgbGlzdCBpcyByZWN1cnNpdmVseSBkZWZpbmVkIGFzCi1mb2xsb3dzLgotXGluZGV4aWlpe3RhcmdldH17bGlzdH17YXNzaWdubWVudH0KLQotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbQotSWYgdGhlIHRhcmdldCBsaXN0IGlzIGEgc2luZ2xlIHRhcmdldDogVGhlIG9iamVjdCBpcyBhc3NpZ25lZCB0byB0aGF0Ci10YXJnZXQuCi0KLVxpdGVtCi1JZiB0aGUgdGFyZ2V0IGxpc3QgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0YXJnZXRzOiBUaGUgb2JqZWN0Ci1tdXN0IGJlIGEgc2VxdWVuY2Ugd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgaXRlbXMgYXMgdGhlcmUgYXJlCi10YXJnZXRzIGluIHRoZSB0YXJnZXQgbGlzdCwgYW5kIHRoZSBpdGVtcyBhcmUgYXNzaWduZWQsIGZyb20gbGVmdCB0bwotcmlnaHQsIHRvIHRoZSBjb3JyZXNwb25kaW5nIHRhcmdldHMuICAoVGhpcyBydWxlIGlzIHJlbGF4ZWQgYXMgb2YKLVB5dGhvbiAxLjU7IGluIGVhcmxpZXIgdmVyc2lvbnMsIHRoZSBvYmplY3QgaGFkIHRvIGJlIGEgdHVwbGUuICBTaW5jZQotc3RyaW5ncyBhcmUgc2VxdWVuY2VzLCBhbiBhc3NpZ25tZW50IGxpa2UgXHNhbXB7YSwgYiA9ICJ4eSJ9IGlzCi1ub3cgbGVnYWwgYXMgbG9uZyBhcyB0aGUgc3RyaW5nIGhhcyB0aGUgcmlnaHQgbGVuZ3RoLikKLQotXGVuZHtpdGVtaXplfQotCi1Bc3NpZ25tZW50IG9mIGFuIG9iamVjdCB0byBhIHNpbmdsZSB0YXJnZXQgaXMgcmVjdXJzaXZlbHkgZGVmaW5lZCBhcwotZm9sbG93cy4KLQotXGJlZ2lue2l0ZW1pemV9ICUgbmVzdGVkCi0KLVxpdGVtCi1JZiB0aGUgdGFyZ2V0IGlzIGFuIGlkZW50aWZpZXIgKG5hbWUpOgotCi1cYmVnaW57aXRlbWl6ZX0KLQotXGl0ZW0KLUlmIHRoZSBuYW1lIGRvZXMgbm90IG9jY3VyIGluIGEgXGtleXdvcmR7Z2xvYmFsfSBzdGF0ZW1lbnQgaW4gdGhlIGN1cnJlbnQKLWNvZGUgYmxvY2s6IHRoZSBuYW1lIGlzIGJvdW5kIHRvIHRoZSBvYmplY3QgaW4gdGhlIGN1cnJlbnQgbG9jYWwKLW5hbWVzcGFjZS4KLVxzdGluZGV4e2dsb2JhbH0KLQotXGl0ZW0KLU90aGVyd2lzZTogdGhlIG5hbWUgaXMgYm91bmQgdG8gdGhlIG9iamVjdCBpbiB0aGUgY3VycmVudCBnbG9iYWwKLW5hbWVzcGFjZS4KLQotXGVuZHtpdGVtaXplfSAlIG5lc3RlZAotCi1UaGUgbmFtZSBpcyByZWJvdW5kIGlmIGl0IHdhcyBhbHJlYWR5IGJvdW5kLiAgVGhpcyBtYXkgY2F1c2UgdGhlCi1yZWZlcmVuY2UgY291bnQgZm9yIHRoZSBvYmplY3QgcHJldmlvdXNseSBib3VuZCB0byB0aGUgbmFtZSB0byByZWFjaAotemVybywgY2F1c2luZyB0aGUgb2JqZWN0IHRvIGJlIGRlYWxsb2NhdGVkIGFuZCBpdHMKLWRlc3RydWN0b3JcaW5kZXh7ZGVzdHJ1Y3Rvcn0gKGlmIGl0IGhhcyBvbmUpIHRvIGJlIGNhbGxlZC4KLQotXGl0ZW0KLUlmIHRoZSB0YXJnZXQgaXMgYSB0YXJnZXQgbGlzdCBlbmNsb3NlZCBpbiBwYXJlbnRoZXNlcyBvciBpbiBzcXVhcmUKLWJyYWNrZXRzOiBUaGUgb2JqZWN0IG11c3QgYmUgYSBzZXF1ZW5jZSB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBpdGVtcwotYXMgdGhlcmUgYXJlIHRhcmdldHMgaW4gdGhlIHRhcmdldCBsaXN0LCBhbmQgaXRzIGl0ZW1zIGFyZSBhc3NpZ25lZCwKLWZyb20gbGVmdCB0byByaWdodCwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdGFyZ2V0cy4KLQotXGl0ZW0KLUlmIHRoZSB0YXJnZXQgaXMgYW4gYXR0cmlidXRlIHJlZmVyZW5jZTogVGhlIHByaW1hcnkgZXhwcmVzc2lvbiBpbiB0aGUKLXJlZmVyZW5jZSBpcyBldmFsdWF0ZWQuICBJdCBzaG91bGQgeWllbGQgYW4gb2JqZWN0IHdpdGggYXNzaWduYWJsZQotYXR0cmlidXRlczsgaWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIFxleGNlcHRpb257VHlwZUVycm9yfSBpcyByYWlzZWQuICBUaGF0Ci1vYmplY3QgaXMgdGhlbiBhc2tlZCB0byBhc3NpZ24gdGhlIGFzc2lnbmVkIG9iamVjdCB0byB0aGUgZ2l2ZW4KLWF0dHJpYnV0ZTsgaWYgaXQgY2Fubm90IHBlcmZvcm0gdGhlIGFzc2lnbm1lbnQsIGl0IHJhaXNlcyBhbiBleGNlcHRpb24KLSh1c3VhbGx5IGJ1dCBub3QgbmVjZXNzYXJpbHkgXGV4Y2VwdGlvbntBdHRyaWJ1dGVFcnJvcn0pLgotXGluZGV4aWl7YXR0cmlidXRlfXthc3NpZ25tZW50fQotCi1caXRlbQotSWYgdGhlIHRhcmdldCBpcyBhIHN1YnNjcmlwdGlvbjogVGhlIHByaW1hcnkgZXhwcmVzc2lvbiBpbiB0aGUKLXJlZmVyZW5jZSBpcyBldmFsdWF0ZWQuICBJdCBzaG91bGQgeWllbGQgZWl0aGVyIGEgbXV0YWJsZSBzZXF1ZW5jZQotb2JqZWN0IChzdWNoIGFzIGEgbGlzdCkgb3IgYSBtYXBwaW5nIG9iamVjdCAoc3VjaCBhcyBhIGRpY3Rpb25hcnkpLiBOZXh0LAotdGhlIHN1YnNjcmlwdCBleHByZXNzaW9uIGlzIGV2YWx1YXRlZC4KLVxpbmRleGlpe3N1YnNjcmlwdGlvbn17YXNzaWdubWVudH0KLVxvYmluZGV4e211dGFibGV9Ci0KLUlmIHRoZSBwcmltYXJ5IGlzIGEgbXV0YWJsZSBzZXF1ZW5jZSBvYmplY3QgKHN1Y2ggYXMgYSBsaXN0KSwgdGhlIHN1YnNjcmlwdAotbXVzdCB5aWVsZCBhIHBsYWluIGludGVnZXIuICBJZiBpdCBpcyBuZWdhdGl2ZSwgdGhlIHNlcXVlbmNlJ3MgbGVuZ3RoCi1pcyBhZGRlZCB0byBpdC4gIFRoZSByZXN1bHRpbmcgdmFsdWUgbXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXIKLWxlc3MgdGhhbiB0aGUgc2VxdWVuY2UncyBsZW5ndGgsIGFuZCB0aGUgc2VxdWVuY2UgaXMgYXNrZWQgdG8gYXNzaWduCi10aGUgYXNzaWduZWQgb2JqZWN0IHRvIGl0cyBpdGVtIHdpdGggdGhhdCBpbmRleC4gIElmIHRoZSBpbmRleCBpcyBvdXQKLW9mIHJhbmdlLCBcZXhjZXB0aW9ue0luZGV4RXJyb3J9IGlzIHJhaXNlZCAoYXNzaWdubWVudCB0byBhIHN1YnNjcmlwdGVkCi1zZXF1ZW5jZSBjYW5ub3QgYWRkIG5ldyBpdGVtcyB0byBhIGxpc3QpLgotXG9iaW5kZXh7c2VxdWVuY2V9Ci1cb2JpbmRleHtsaXN0fQotCi1JZiB0aGUgcHJpbWFyeSBpcyBhIG1hcHBpbmcgb2JqZWN0IChzdWNoIGFzIGEgZGljdGlvbmFyeSksIHRoZSBzdWJzY3JpcHQgbXVzdAotaGF2ZSBhIHR5cGUgY29tcGF0aWJsZSB3aXRoIHRoZSBtYXBwaW5nJ3Mga2V5IHR5cGUsIGFuZCB0aGUgbWFwcGluZyBpcwotdGhlbiBhc2tlZCB0byBjcmVhdGUgYSBrZXkvZGF0dW0gcGFpciB3aGljaCBtYXBzIHRoZSBzdWJzY3JpcHQgdG8KLXRoZSBhc3NpZ25lZCBvYmplY3QuICBUaGlzIGNhbiBlaXRoZXIgcmVwbGFjZSBhbiBleGlzdGluZyBrZXkvdmFsdWUKLXBhaXIgd2l0aCB0aGUgc2FtZSBrZXkgdmFsdWUsIG9yIGluc2VydCBhIG5ldyBrZXkvdmFsdWUgcGFpciAoaWYgbm8KLWtleSB3aXRoIHRoZSBzYW1lIHZhbHVlIGV4aXN0ZWQpLgotXG9iaW5kZXh7bWFwcGluZ30KLVxvYmluZGV4e2RpY3Rpb25hcnl9Ci0KLVxpdGVtCi1JZiB0aGUgdGFyZ2V0IGlzIGEgc2xpY2luZzogVGhlIHByaW1hcnkgZXhwcmVzc2lvbiBpbiB0aGUgcmVmZXJlbmNlIGlzCi1ldmFsdWF0ZWQuICBJdCBzaG91bGQgeWllbGQgYSBtdXRhYmxlIHNlcXVlbmNlIG9iamVjdCAoc3VjaCBhcyBhIGxpc3QpLiAgVGhlCi1hc3NpZ25lZCBvYmplY3Qgc2hvdWxkIGJlIGEgc2VxdWVuY2Ugb2JqZWN0IG9mIHRoZSBzYW1lIHR5cGUuICBOZXh0LAotdGhlIGxvd2VyIGFuZCB1cHBlciBib3VuZCBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkLCBpbnNvZmFyIHRoZXkgYXJlCi1wcmVzZW50OyBkZWZhdWx0cyBhcmUgemVybyBhbmQgdGhlIHNlcXVlbmNlJ3MgbGVuZ3RoLiAgVGhlIGJvdW5kcwotc2hvdWxkIGV2YWx1YXRlIHRvIChzbWFsbCkgaW50ZWdlcnMuICBJZiBlaXRoZXIgYm91bmQgaXMgbmVnYXRpdmUsIHRoZQotc2VxdWVuY2UncyBsZW5ndGggaXMgYWRkZWQgdG8gaXQuICBUaGUgcmVzdWx0aW5nIGJvdW5kcyBhcmUgY2xpcHBlZCB0bwotbGllIGJldHdlZW4gemVybyBhbmQgdGhlIHNlcXVlbmNlJ3MgbGVuZ3RoLCBpbmNsdXNpdmUuICBGaW5hbGx5LCB0aGUKLXNlcXVlbmNlIG9iamVjdCBpcyBhc2tlZCB0byByZXBsYWNlIHRoZSBzbGljZSB3aXRoIHRoZSBpdGVtcyBvZiB0aGUKLWFzc2lnbmVkIHNlcXVlbmNlLiAgVGhlIGxlbmd0aCBvZiB0aGUgc2xpY2UgbWF5IGJlIGRpZmZlcmVudCBmcm9tIHRoZQotbGVuZ3RoIG9mIHRoZSBhc3NpZ25lZCBzZXF1ZW5jZSwgdGh1cyBjaGFuZ2luZyB0aGUgbGVuZ3RoIG9mIHRoZQotdGFyZ2V0IHNlcXVlbmNlLCBpZiB0aGUgb2JqZWN0IGFsbG93cyBpdC4KLVxpbmRleGlpe3NsaWNpbmd9e2Fzc2lnbm1lbnR9Ci0KLVxlbmR7aXRlbWl6ZX0KLSAgICAgICAgCi0oSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHRoZSBzeW50YXggZm9yIHRhcmdldHMgaXMgdGFrZW4KLXRvIGJlIHRoZSBzYW1lIGFzIGZvciBleHByZXNzaW9ucywgYW5kIGludmFsaWQgc3ludGF4IGlzIHJlamVjdGVkCi1kdXJpbmcgdGhlIGNvZGUgZ2VuZXJhdGlvbiBwaGFzZSwgY2F1c2luZyBsZXNzIGRldGFpbGVkIGVycm9yCi1tZXNzYWdlcy4pCi0KLVdBUk5JTkc6IEFsdGhvdWdoIHRoZSBkZWZpbml0aW9uIG9mIGFzc2lnbm1lbnQgaW1wbGllcyB0aGF0IG92ZXJsYXBzCi1iZXR3ZWVuIHRoZSBsZWZ0LWhhbmQgc2lkZSBhbmQgdGhlIHJpZ2h0LWhhbmQgc2lkZSBhcmUgYHNhZmUnIChmb3IgZXhhbXBsZQotXHNhbXB7YSwgYiA9IGIsIGF9IHN3YXBzIHR3byB2YXJpYWJsZXMpLCBvdmVybGFwcyBcZW1waHt3aXRoaW59IHRoZQotY29sbGVjdGlvbiBvZiBhc3NpZ25lZC10byB2YXJpYWJsZXMgYXJlIG5vdCBzYWZlISAgRm9yIGluc3RhbmNlLCB0aGUKLWZvbGxvd2luZyBwcm9ncmFtIHByaW50cyBcc2FtcHtbMCwgMl19OgotCi1cYmVnaW57dmVyYmF0aW19Ci14ID0gWzAsIDFdCi1pID0gMAotaSwgeFtpXSA9IDEsIDIKLXByaW50IHgKLVxlbmR7dmVyYmF0aW19Ci0KLQotXHN1YnNlY3Rpb257QXVnbWVudGVkIGFzc2lnbm1lbnQgc3RhdGVtZW50cyBcbGFiZWx7YXVnYXNzaWdufX0KLQotQXVnbWVudGVkIGFzc2lnbm1lbnQgaXMgdGhlIGNvbWJpbmF0aW9uLCBpbiBhIHNpbmdsZSBzdGF0ZW1lbnQsIG9mIGEgYmluYXJ5Ci1vcGVyYXRpb24gYW5kIGFuIGFzc2lnbm1lbnQgc3RhdGVtZW50OgotXGluZGV4aWl7YXVnbWVudGVkfXthc3NpZ25tZW50fQotXGluZGV4e3N0YXRlbWVudCFhc3NpZ25tZW50LCBhdWdtZW50ZWR9Ci0KLVxiZWdpbntwcm9kdWN0aW9ubGlzdH0KLSAgXHByb2R1Y3Rpb257YXVnbWVudGVkX2Fzc2lnbm1lbnRfc3RtdH0KLSAgICAgICAgICAgICB7XHRva2Vue3RhcmdldH0gXHRva2Vue2F1Z29wfQotICAgICAgICAgICAgICAoXHRva2Vue2V4cHJlc3Npb25fbGlzdH0gfCBcdG9rZW57eWllbGRfZXhwcmVzc2lvbn0pfQotICBccHJvZHVjdGlvbnthdWdvcH0KLSAgICAgICAgICAgICB7Iis9IiB8ICItPSIgfCAiKj0iIHwgIi89IiB8ICJcJT0iIHwgIioqPSJ9Ci0gIFxwcm9kdWN0aW9uY29udHt8ICI+Pj0iIHwgIjw8PSIgfCAiXCY9IiB8ICJcdGV4dGFzY2lpY2lyY3VtPSIgfCAifD0ifQotXGVuZHtwcm9kdWN0aW9ubGlzdH0KLQotKFNlZSBzZWN0aW9uflxyZWZ7cHJpbWFyaWVzfSBmb3IgdGhlIHN5bnRheCBkZWZpbml0aW9ucyBmb3IgdGhlIGxhc3QKLXRocmVlIHN5bWJvbHMuKQotCi1BbiBhdWdtZW50ZWQgYXNzaWdubWVudCBldmFsdWF0ZXMgdGhlIHRhcmdldCAod2hpY2gsIHVubGlrZSBub3JtYWwKLWFzc2lnbm1lbnQgc3RhdGVtZW50cywgY2Fubm90IGJlIGFuIHVucGFja2luZykgYW5kIHRoZSBleHByZXNzaW9uCi1saXN0LCBwZXJmb3JtcyB0aGUgYmluYXJ5IG9wZXJhdGlvbiBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiBhc3NpZ25tZW50Ci1vbiB0aGUgdHdvIG9wZXJhbmRzLCBhbmQgYXNzaWducyB0aGUgcmVzdWx0IHRvIHRoZSBvcmlnaW5hbAotdGFyZ2V0LiAgVGhlIHRhcmdldCBpcyBvbmx5IGV2YWx1YXRlZCBvbmNlLgotCi1BbiBhdWdtZW50ZWQgYXNzaWdubWVudCBleHByZXNzaW9uIGxpa2UgXGNvZGV7eCArPSAxfSBjYW4gYmUgcmV3cml0dGVuIGFzCi1cY29kZXt4ID0geCArIDF9IHRvIGFjaGlldmUgYSBzaW1pbGFyLCBidXQgbm90IGV4YWN0bHkgZXF1YWwgZWZmZWN0LiBJbiB0aGUKLWF1Z21lbnRlZCB2ZXJzaW9uLCBcY29kZXt4fSBpcyBvbmx5IGV2YWx1YXRlZCBvbmNlLiBBbHNvLCB3aGVuIHBvc3NpYmxlLCB0aGUKLWFjdHVhbCBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIFxlbXBoe2luLXBsYWNlfSwgbWVhbmluZyB0aGF0IHJhdGhlciB0aGFuCi1jcmVhdGluZyBhIG5ldyBvYmplY3QgYW5kIGFzc2lnbmluZyB0aGF0IHRvIHRoZSB0YXJnZXQsIHRoZSBvbGQgb2JqZWN0IGlzCi1tb2RpZmllZCBpbnN0ZWFkLgotCi1XaXRoIHRoZSBleGNlcHRpb24gb2YgYXNzaWduaW5nIHRvIHR1cGxlcyBhbmQgbXVsdGlwbGUgdGFyZ2V0cyBpbiBhIHNpbmdsZQotc3RhdGVtZW50LCB0aGUgYXNzaWdubWVudCBkb25lIGJ5IGF1Z21lbnRlZCBhc3NpZ25tZW50IHN0YXRlbWVudHMgaXMgaGFuZGxlZAotdGhlIHNhbWUgd2F5IGFzIG5vcm1hbCBhc3NpZ25tZW50cy4gU2ltaWxhcmx5LCB3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlCi1wb3NzaWJsZSBcZW1waHtpbi1wbGFjZX0gYmVoYXZpb3IsIHRoZSBiaW5hcnkgb3BlcmF0aW9uIHBlcmZvcm1lZCBieQotYXVnbWVudGVkIGFzc2lnbm1lbnQgaXMgdGhlIHNhbWUgYXMgdGhlIG5vcm1hbCBiaW5hcnkgb3BlcmF0aW9ucy4KLQotRm9yIHRhcmdldHMgd2hpY2ggYXJlIGF0dHJpYnV0ZSByZWZlcmVuY2VzLCB0aGUgaW5pdGlhbCB2YWx1ZSBpcwotcmV0cmlldmVkIHdpdGggYSBcbWV0aG9ke2dldGF0dHIoKX0gYW5kIHRoZSByZXN1bHQgaXMgYXNzaWduZWQgd2l0aCBhCi1cbWV0aG9ke3NldGF0dHIoKX0uICBOb3RpY2UgdGhhdCB0aGUgdHdvIG1ldGhvZHMgZG8gbm90IG5lY2Vzc2FyaWx5Ci1yZWZlciB0byB0aGUgc2FtZSB2YXJpYWJsZS4gIFdoZW4gXG1ldGhvZHtnZXRhdHRyKCl9IHJlZmVycyB0byBhIGNsYXNzCi12YXJpYWJsZSwgXG1ldGhvZHtzZXRhdHRyKCl9IHN0aWxsIHdyaXRlcyB0byBhbiBpbnN0YW5jZSB2YXJpYWJsZS4KLUZvciBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1jbGFzcyBBOgotICAgIHggPSAzICAgICMgY2xhc3MgdmFyaWFibGUKLWEgPSBBKCkKLWEueCArPSAxICAgICAjIHdyaXRlcyBhLnggYXMgNCBsZWF2aW5nIEEueCBhcyAzCi1cZW5ke3ZlcmJhdGltfQotCi0KLVxzZWN0aW9ue1RoZSBca2V5d29yZHtwYXNzfSBzdGF0ZW1lbnQgXGxhYmVse3Bhc3N9fQotXHN0aW5kZXh7cGFzc30KLQotXGJlZ2lue3Byb2R1Y3Rpb25saXN0fQotICBccHJvZHVjdGlvbntwYXNzX3N0bXR9Ci0gICAgICAgICAgICAgeyJwYXNzIn0KLVxlbmR7cHJvZHVjdGlvbmxpc3R9Ci0KLVxrZXl3b3Jke3Bhc3N9IGlzIGEgbnVsbCBvcGVyYXRpb24gLS0tIHdoZW4gaXQgaXMgZXhlY3V0ZWQsIG5vdGhpbmcKLWhhcHBlbnMuICBJdCBpcyB1c2VmdWwgYXMgYSBwbGFjZWhvbGRlciB3aGVuIGEgc3RhdGVtZW50IGlzCi1yZXF1aXJlZCBzeW50YWN0aWNhbGx5LCBidXQgbm8gY29kZSBuZWVkcyB0byBiZSBleGVjdXRlZCwgZm9yIGV4YW1wbGU6Ci1caW5kZXhpaXtudWxsfXtvcGVyYXRpb259Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWRlZiBmKGFyZyk6IHBhc3MgICAgIyBhIGZ1bmN0aW9uIHRoYXQgZG9lcyBub3RoaW5nICh5ZXQpCi0KLWNsYXNzIEM6IHBhc3MgICAgICAgIyBhIGNsYXNzIHdpdGggbm8gbWV0aG9kcyAoeWV0KQotXGVuZHt2ZXJiYXRpbX0KLQotCi1cc2VjdGlvbntUaGUgXGtleXdvcmR7ZGVsfSBzdGF0ZW1lbnQgXGxhYmVse2RlbH19Ci1cc3RpbmRleHtkZWx9Ci0KLVxiZWdpbntwcm9kdWN0aW9ubGlzdH0KLSAgXHByb2R1Y3Rpb257ZGVsX3N0bXR9Ci0gICAgICAgICAgICAgeyJkZWwiIFx0b2tlbnt0YXJnZXRfbGlzdH19Ci1cZW5ke3Byb2R1Y3Rpb25saXN0fQotCi1EZWxldGlvbiBpcyByZWN1cnNpdmVseSBkZWZpbmVkIHZlcnkgc2ltaWxhciB0byB0aGUgd2F5IGFzc2lnbm1lbnQgaXMKLWRlZmluZWQuIFJhdGhlciB0aGF0IHNwZWxsaW5nIGl0IG91dCBpbiBmdWxsIGRldGFpbHMsIGhlcmUgYXJlIHNvbWUKLWhpbnRzLgotXGluZGV4aWl7ZGVsZXRpb259e3RhcmdldH0KLVxpbmRleGlpaXtkZWxldGlvbn17dGFyZ2V0fXtsaXN0fQotCi1EZWxldGlvbiBvZiBhIHRhcmdldCBsaXN0IHJlY3Vyc2l2ZWx5IGRlbGV0ZXMgZWFjaCB0YXJnZXQsIGZyb20gbGVmdAotdG8gcmlnaHQuCi0KLURlbGV0aW9uIG9mIGEgbmFtZSByZW1vdmVzIHRoZSBiaW5kaW5nIG9mIHRoYXQgbmFtZSAKLWZyb20gdGhlIGxvY2FsIG9yIGdsb2JhbCBuYW1lc3BhY2UsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBuYW1lCi1vY2N1cnMgaW4gYSBca2V5d29yZHtnbG9iYWx9IHN0YXRlbWVudCBpbiB0aGUgc2FtZSBjb2RlIGJsb2NrLiAgSWYgdGhlCi1uYW1lIGlzIHVuYm91bmQsIGEgXGV4Y2VwdGlvbntOYW1lRXJyb3J9IGV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNlZC4KLVxzdGluZGV4e2dsb2JhbH0KLVxpbmRleGlpe3VuYmluZGluZ317bmFtZX0KLQotSXQgaXMgaWxsZWdhbCB0byBkZWxldGUgYSBuYW1lIGZyb20gdGhlIGxvY2FsIG5hbWVzcGFjZSBpZiBpdCBvY2N1cnMKLWFzIGEgZnJlZSB2YXJpYWJsZVxpbmRleGlpe2ZyZWV9e3ZhcmlhYmxlfSBpbiBhIG5lc3RlZCBibG9jay4KLQotRGVsZXRpb24gb2YgYXR0cmlidXRlIHJlZmVyZW5jZXMsIHN1YnNjcmlwdGlvbnMgYW5kIHNsaWNpbmdzCi1pcyBwYXNzZWQgdG8gdGhlIHByaW1hcnkgb2JqZWN0IGludm9sdmVkOyBkZWxldGlvbiBvZiBhIHNsaWNpbmcKLWlzIGluIGdlbmVyYWwgZXF1aXZhbGVudCB0byBhc3NpZ25tZW50IG9mIGFuIGVtcHR5IHNsaWNlIG9mIHRoZQotcmlnaHQgdHlwZSAoYnV0IGV2ZW4gdGhpcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBzbGljZWQgb2JqZWN0KS4KLVxpbmRleGlpe2F0dHJpYnV0ZX17ZGVsZXRpb259Ci0KLQotXHNlY3Rpb257VGhlIFxrZXl3b3Jke3JldHVybn0gc3RhdGVtZW50IFxsYWJlbHtyZXR1cm59fQotXHN0aW5kZXh7cmV0dXJufQotCi1cYmVnaW57cHJvZHVjdGlvbmxpc3R9Ci0gIFxwcm9kdWN0aW9ue3JldHVybl9zdG10fQotICAgICAgICAgICAgIHsicmV0dXJuIiBbXHRva2Vue2V4cHJlc3Npb25fbGlzdH1dfQotXGVuZHtwcm9kdWN0aW9ubGlzdH0KLQotXGtleXdvcmR7cmV0dXJufSBtYXkgb25seSBvY2N1ciBzeW50YWN0aWNhbGx5IG5lc3RlZCBpbiBhIGZ1bmN0aW9uCi1kZWZpbml0aW9uLCBub3Qgd2l0aGluIGEgbmVzdGVkIGNsYXNzIGRlZmluaXRpb24uCi1caW5kZXhpaXtmdW5jdGlvbn17ZGVmaW5pdGlvbn0KLVxpbmRleGlpe2NsYXNzfXtkZWZpbml0aW9ufQotCi1JZiBhbiBleHByZXNzaW9uIGxpc3QgaXMgcHJlc2VudCwgaXQgaXMgZXZhbHVhdGVkLCBlbHNlIFxjb2Rle05vbmV9Ci1pcyBzdWJzdGl0dXRlZC4KLQotXGtleXdvcmR7cmV0dXJufSBsZWF2ZXMgdGhlIGN1cnJlbnQgZnVuY3Rpb24gY2FsbCB3aXRoIHRoZSBleHByZXNzaW9uCi1saXN0IChvciBcY29kZXtOb25lfSkgYXMgcmV0dXJuIHZhbHVlLgotCi1XaGVuIFxrZXl3b3Jke3JldHVybn0gcGFzc2VzIGNvbnRyb2wgb3V0IG9mIGEgXGtleXdvcmR7dHJ5fSBzdGF0ZW1lbnQKLXdpdGggYSBca2V5d29yZHtmaW5hbGx5fSBjbGF1c2UsIHRoYXQgXGtleXdvcmR7ZmluYWxseX0gY2xhdXNlIGlzIGV4ZWN1dGVkCi1iZWZvcmUgcmVhbGx5IGxlYXZpbmcgdGhlIGZ1bmN0aW9uLgotXGt3aW5kZXh7ZmluYWxseX0KLQotSW4gYSBnZW5lcmF0b3IgZnVuY3Rpb24sIHRoZSBca2V5d29yZHtyZXR1cm59IHN0YXRlbWVudCBpcyBub3QgYWxsb3dlZAotdG8gaW5jbHVkZSBhbiBcZ3JhbW1hcnRva2Vue2V4cHJlc3Npb25fbGlzdH0uICBJbiB0aGF0IGNvbnRleHQsIGEgYmFyZQotXGtleXdvcmR7cmV0dXJufSBpbmRpY2F0ZXMgdGhhdCB0aGUgZ2VuZXJhdG9yIGlzIGRvbmUgYW5kIHdpbGwgY2F1c2UKLVxleGNlcHRpb257U3RvcEl0ZXJhdGlvbn0gdG8gYmUgcmFpc2VkLgotCi0KLVxzZWN0aW9ue1RoZSBca2V5d29yZHt5aWVsZH0gc3RhdGVtZW50IFxsYWJlbHt5aWVsZH19Ci1cc3RpbmRleHt5aWVsZH0KLQotXGJlZ2lue3Byb2R1Y3Rpb25saXN0fQotICBccHJvZHVjdGlvbnt5aWVsZF9zdG10fQotICAgICAgICAgICAgIHtcdG9rZW57eWllbGRfZXhwcmVzc2lvbn19Ci1cZW5ke3Byb2R1Y3Rpb25saXN0fQotCi1caW5kZXh7Z2VuZXJhdG9yIWZ1bmN0aW9ufQotXGluZGV4e2dlbmVyYXRvciFpdGVyYXRvcn0KLVxpbmRleHtmdW5jdGlvbiFnZW5lcmF0b3J9Ci1cZXhpbmRleHtTdG9wSXRlcmF0aW9ufQotCi1UaGUgXGtleXdvcmR7eWllbGR9IHN0YXRlbWVudCBpcyBvbmx5IHVzZWQgd2hlbiBkZWZpbmluZyBhIGdlbmVyYXRvcgotZnVuY3Rpb24sIGFuZCBpcyBvbmx5IHVzZWQgaW4gdGhlIGJvZHkgb2YgdGhlIGdlbmVyYXRvciBmdW5jdGlvbi4KLVVzaW5nIGEgXGtleXdvcmR7eWllbGR9IHN0YXRlbWVudCBpbiBhIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMKLXN1ZmZpY2llbnQgdG8gY2F1c2UgdGhhdCBkZWZpbml0aW9uIHRvIGNyZWF0ZSBhIGdlbmVyYXRvciBmdW5jdGlvbgotaW5zdGVhZCBvZiBhIG5vcm1hbCBmdW5jdGlvbi4KLQotV2hlbiBhIGdlbmVyYXRvciBmdW5jdGlvbiBpcyBjYWxsZWQsIGl0IHJldHVybnMgYW4gaXRlcmF0b3Iga25vd24gYXMgYSBnZW5lcmF0b3IKLWl0ZXJhdG9yLCBvciBtb3JlIGNvbW1vbmx5LCBhIGdlbmVyYXRvci4gIFRoZSBib2R5IG9mIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24gaXMKLWV4ZWN1dGVkIGJ5IGNhbGxpbmcgdGhlIGdlbmVyYXRvcidzIFxtZXRob2R7X19uZXh0X18oKX0gbWV0aG9kIHJlcGVhdGVkbHkgdW50aWwKLWl0IHJhaXNlcyBhbiBleGNlcHRpb24uCi0KLVdoZW4gYSBca2V5d29yZHt5aWVsZH0gc3RhdGVtZW50IGlzIGV4ZWN1dGVkLCB0aGUgc3RhdGUgb2YgdGhlIGdlbmVyYXRvciBpcwotZnJvemVuIGFuZCB0aGUgdmFsdWUgb2YgXGdyYW1tYXJ0b2tlbntleHByZXNzaW9uX2xpc3R9IGlzIHJldHVybmVkIHRvCi1cbWV0aG9ke19fbmV4dF9fKCl9J3MgY2FsbGVyLiAgQnkgYGBmcm96ZW4nJyB3ZSBtZWFuIHRoYXQgYWxsIGxvY2FsIHN0YXRlIGlzCi1yZXRhaW5lZCwgaW5jbHVkaW5nIHRoZSBjdXJyZW50IGJpbmRpbmdzIG9mIGxvY2FsIHZhcmlhYmxlcywgdGhlIGluc3RydWN0aW9uCi1wb2ludGVyLCBhbmQgdGhlIGludGVybmFsIGV2YWx1YXRpb24gc3RhY2s6IGVub3VnaCBpbmZvcm1hdGlvbiBpcyBzYXZlZCBzbyB0aGF0Ci10aGUgbmV4dCB0aW1lIFxtZXRob2R7X19uZXh0X18oKX0gaXMgaW52b2tlZCwgdGhlIGZ1bmN0aW9uIGNhbiBwcm9jZWVkIGV4YWN0bHkKLWFzIGlmIHRoZSBca2V5d29yZHt5aWVsZH0gc3RhdGVtZW50IHdlcmUganVzdCBhbm90aGVyIGV4dGVybmFsIGNhbGwuCi0KLUFzIG9mIFB5dGhvbiB2ZXJzaW9uIDIuNSwgdGhlIFxrZXl3b3Jke3lpZWxkfSBzdGF0ZW1lbnQgaXMgbm93Ci1hbGxvd2VkIGluIHRoZSBca2V5d29yZHt0cnl9IGNsYXVzZSBvZiBhIFxrZXl3b3Jke3RyeX0gLi4uXCAKLVxrZXl3b3Jke2ZpbmFsbHl9IGNvbnN0cnVjdC4gIElmIHRoZSBnZW5lcmF0b3IgaXMgbm90IHJlc3VtZWQgYmVmb3JlCi1pdCBpcyBmaW5hbGl6ZWQgKGJ5IHJlYWNoaW5nIGEgemVybyByZWZlcmVuY2UgY291bnQgb3IgYnkgYmVpbmcgZ2FyYmFnZQotY29sbGVjdGVkKSwgdGhlIGdlbmVyYXRvci1pdGVyYXRvcidzIFxtZXRob2R7Y2xvc2UoKX0gbWV0aG9kIHdpbGwgYmUKLWNhbGxlZCwgYWxsb3dpbmcgYW55IHBlbmRpbmcgXGtleXdvcmR7ZmluYWxseX0gY2xhdXNlcyB0byBleGVjdXRlLgotCi1cYmVnaW57bm90aWNlfQotSW4gUHl0aG9uIDIuMiwgdGhlIFxrZXl3b3Jke3lpZWxkfSBzdGF0ZW1lbnQgaXMgb25seSBhbGxvd2VkCi13aGVuIHRoZSBcY29kZXtnZW5lcmF0b3JzfSBmZWF0dXJlIGhhcyBiZWVuIGVuYWJsZWQuICBJdCB3aWxsIGFsd2F5cwotYmUgZW5hYmxlZCBpbiBQeXRob24gMi4zLiAgVGhpcyBcY29kZXtfX2Z1dHVyZV9ffSBpbXBvcnQgc3RhdGVtZW50IGNhbgotYmUgdXNlZCB0byBlbmFibGUgdGhlIGZlYXR1cmU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWZyb20gX19mdXR1cmVfXyBpbXBvcnQgZ2VuZXJhdG9ycwotXGVuZHt2ZXJiYXRpbX0KLVxlbmR7bm90aWNlfQotCi0KLVxiZWdpbntzZWVhbHNvfQotICBcc2VlcGVwezAyNTV9e1NpbXBsZSBHZW5lcmF0b3JzfQotICAgICAgICAge1RoZSBwcm9wb3NhbCBmb3IgYWRkaW5nIGdlbmVyYXRvcnMgYW5kIHRoZSBca2V5d29yZHt5aWVsZH0KLSAgICAgICAgICBzdGF0ZW1lbnQgdG8gUHl0aG9uLn0KLQotICBcc2VlcGVwezAzNDJ9e0Nvcm91dGluZXMgdmlhIEVuaGFuY2VkIEdlbmVyYXRvcnN9Ci0gICAgICAgICB7VGhlIHByb3Bvc2FsIHRoYXQsIGFtb25nIG90aGVyIGdlbmVyYXRvciBlbmhhbmNlbWVudHMsCi0gICAgICAgICAgcHJvcG9zZWQgYWxsb3dpbmcgXGtleXdvcmR7eWllbGR9IHRvIGFwcGVhciBpbnNpZGUgYQotICAgICAgICAgIFxrZXl3b3Jke3RyeX0gLi4uIFxrZXl3b3Jke2ZpbmFsbHl9IGJsb2NrLn0KLVxlbmR7c2VlYWxzb30KLQotCi1cc2VjdGlvbntUaGUgXGtleXdvcmR7cmFpc2V9IHN0YXRlbWVudCBcbGFiZWx7cmFpc2V9fQotXHN0aW5kZXh7cmFpc2V9Ci0KLVxiZWdpbntwcm9kdWN0aW9ubGlzdH0KLSAgXHByb2R1Y3Rpb257cmFpc2Vfc3RtdH0KLSAgICAgICAgICAgICB7InJhaXNlIiBbXHRva2Vue2V4cHJlc3Npb259IFsiLCIgXHRva2Vue2V4cHJlc3Npb259Ci0gICAgICAgICAgICAgIFsiLCIgXHRva2Vue2V4cHJlc3Npb259XV1dfQotXGVuZHtwcm9kdWN0aW9ubGlzdH0KLQotSWYgbm8gZXhwcmVzc2lvbnMgYXJlIHByZXNlbnQsIFxrZXl3b3Jke3JhaXNlfSByZS1yYWlzZXMgdGhlIGxhc3QKLWV4Y2VwdGlvbiB0aGF0IHdhcyBhY3RpdmUgaW4gdGhlIGN1cnJlbnQgc2NvcGUuICBJZiBubyBleGNlcHRpb24gaXMKLWFjdGl2ZSBpbiB0aGUgY3VycmVudCBzY29wZSwgYSBcZXhjZXB0aW9ue1R5cGVFcnJvcn0gZXhjZXB0aW9uIGlzCi1yYWlzZWQgaW5kaWNhdGluZyB0aGF0IHRoaXMgaXMgYW4gZXJyb3IgKGlmIHJ1bm5pbmcgdW5kZXIgSURMRSwgYQotXGV4Y2VwdGlvbntRdWV1ZS5FbXB0eX0gZXhjZXB0aW9uIGlzIHJhaXNlZCBpbnN0ZWFkKS4KLVxpbmRleHtleGNlcHRpb259Ci1caW5kZXhpaXtyYWlzaW5nfXtleGNlcHRpb259Ci0KLU90aGVyd2lzZSwgXGtleXdvcmR7cmFpc2V9IGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbnMgdG8gZ2V0IHRocmVlCi1vYmplY3RzLCB1c2luZyBcY29kZXtOb25lfSBhcyB0aGUgdmFsdWUgb2Ygb21pdHRlZCBleHByZXNzaW9ucy4gIFRoZQotZmlyc3QgdHdvIG9iamVjdHMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBcZW1waHt0eXBlfSBhbmQKLVxlbXBoe3ZhbHVlfSBvZiB0aGUgZXhjZXB0aW9uLgotCi1JZiB0aGUgZmlyc3Qgb2JqZWN0IGlzIGFuIGluc3RhbmNlLCB0aGUgdHlwZSBvZiB0aGUgZXhjZXB0aW9uIGlzIHRoZQotY2xhc3Mgb2YgdGhlIGluc3RhbmNlLCB0aGUgaW5zdGFuY2UgaXRzZWxmIGlzIHRoZSB2YWx1ZSwgYW5kIHRoZQotc2Vjb25kIG9iamVjdCBtdXN0IGJlIFxjb2Rle05vbmV9LgotCi1JZiB0aGUgZmlyc3Qgb2JqZWN0IGlzIGEgY2xhc3MsIGl0IGJlY29tZXMgdGhlIHR5cGUgb2YgdGhlIGV4Y2VwdGlvbi4KLVRoZSBzZWNvbmQgb2JqZWN0IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBleGNlcHRpb24gdmFsdWU6IElmIGl0IGlzCi1hbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MsIHRoZSBpbnN0YW5jZSBiZWNvbWVzIHRoZSBleGNlcHRpb24gdmFsdWUuCi1JZiB0aGUgc2Vjb25kIG9iamVjdCBpcyBhIHR1cGxlLCBpdCBpcyB1c2VkIGFzIHRoZSBhcmd1bWVudCBsaXN0IGZvcgotdGhlIGNsYXNzIGNvbnN0cnVjdG9yOyBpZiBpdCBpcyBcY29kZXtOb25lfSwgYW4gZW1wdHkgYXJndW1lbnQgbGlzdCBpcwotdXNlZCwgYW5kIGFueSBvdGhlciBvYmplY3QgaXMgdHJlYXRlZCBhcyBhIHNpbmdsZSBhcmd1bWVudCB0byB0aGUKLWNvbnN0cnVjdG9yLiAgVGhlIGluc3RhbmNlIHNvIGNyZWF0ZWQgYnkgY2FsbGluZyB0aGUgY29uc3RydWN0b3IgaXMKLXVzZWQgYXMgdGhlIGV4Y2VwdGlvbiB2YWx1ZS4KLQotSWYgYSB0aGlyZCBvYmplY3QgaXMgcHJlc2VudCBhbmQgbm90IFxjb2Rle05vbmV9LCBpdCBtdXN0IGJlIGEKLXRyYWNlYmFja1xvYmluZGV4e3RyYWNlYmFja30gb2JqZWN0IChzZWUgc2VjdGlvbn5ccmVme3RyYWNlYmFja30pLCBhbmQKLWl0IGlzIHN1YnN0aXR1dGVkIGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgbG9jYXRpb24gYXMgdGhlIHBsYWNlIHdoZXJlCi10aGUgZXhjZXB0aW9uIG9jY3VycmVkLiAgSWYgdGhlIHRoaXJkIG9iamVjdCBpcyBwcmVzZW50IGFuZCBub3QgYQotdHJhY2ViYWNrIG9iamVjdCBvciBcY29kZXtOb25lfSwgYSBcZXhjZXB0aW9ue1R5cGVFcnJvcn0gZXhjZXB0aW9uIGlzCi1yYWlzZWQuICBUaGUgdGhyZWUtZXhwcmVzc2lvbiBmb3JtIG9mIFxrZXl3b3Jke3JhaXNlfSBpcyB1c2VmdWwgdG8KLXJlLXJhaXNlIGFuIGV4Y2VwdGlvbiB0cmFuc3BhcmVudGx5IGluIGFuIGV4Y2VwdCBjbGF1c2UsIGJ1dAotXGtleXdvcmR7cmFpc2V9IHdpdGggbm8gZXhwcmVzc2lvbnMgc2hvdWxkIGJlIHByZWZlcnJlZCBpZiB0aGUKLWV4Y2VwdGlvbiB0byBiZSByZS1yYWlzZWQgd2FzIHRoZSBtb3N0IHJlY2VudGx5IGFjdGl2ZSBleGNlcHRpb24gaW4KLXRoZSBjdXJyZW50IHNjb3BlLgotCi1BZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGV4Y2VwdGlvbnMgY2FuIGJlIGZvdW5kIGluCi1zZWN0aW9uflxyZWZ7ZXhjZXB0aW9uc30sIGFuZCBpbmZvcm1hdGlvbiBhYm91dCBoYW5kbGluZyBleGNlcHRpb25zIGlzCi1pbiBzZWN0aW9uflxyZWZ7dHJ5fS4KLQotCi1cc2VjdGlvbntUaGUgXGtleXdvcmR7YnJlYWt9IHN0YXRlbWVudCBcbGFiZWx7YnJlYWt9fQotXHN0aW5kZXh7YnJlYWt9Ci0KLVxiZWdpbntwcm9kdWN0aW9ubGlzdH0KLSAgXHByb2R1Y3Rpb257YnJlYWtfc3RtdH0KLSAgICAgICAgICAgICB7ImJyZWFrIn0KLVxlbmR7cHJvZHVjdGlvbmxpc3R9Ci0KLVxrZXl3b3Jke2JyZWFrfSBtYXkgb25seSBvY2N1ciBzeW50YWN0aWNhbGx5IG5lc3RlZCBpbiBhIFxrZXl3b3Jke2Zvcn0KLW9yIFxrZXl3b3Jke3doaWxlfSBsb29wLCBidXQgbm90IG5lc3RlZCBpbiBhIGZ1bmN0aW9uIG9yIGNsYXNzIGRlZmluaXRpb24KLXdpdGhpbiB0aGF0IGxvb3AuCi1cc3RpbmRleHtmb3J9Ci1cc3RpbmRleHt3aGlsZX0KLVxpbmRleGlpe2xvb3B9e3N0YXRlbWVudH0KLQotSXQgdGVybWluYXRlcyB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgbG9vcCwgc2tpcHBpbmcgdGhlIG9wdGlvbmFsCi1ca2V5d29yZHtlbHNlfSBjbGF1c2UgaWYgdGhlIGxvb3AgaGFzIG9uZS4KLVxrd2luZGV4e2Vsc2V9Ci0KLUlmIGEgXGtleXdvcmR7Zm9yfSBsb29wIGlzIHRlcm1pbmF0ZWQgYnkgXGtleXdvcmR7YnJlYWt9LCB0aGUgbG9vcCBjb250cm9sCi10YXJnZXQga2VlcHMgaXRzIGN1cnJlbnQgdmFsdWUuCi1caW5kZXhpaXtsb29wIGNvbnRyb2x9e3RhcmdldH0KLQotV2hlbiBca2V5d29yZHticmVha30gcGFzc2VzIGNvbnRyb2wgb3V0IG9mIGEgXGtleXdvcmR7dHJ5fSBzdGF0ZW1lbnQKLXdpdGggYSBca2V5d29yZHtmaW5hbGx5fSBjbGF1c2UsIHRoYXQgXGtleXdvcmR7ZmluYWxseX0gY2xhdXNlIGlzIGV4ZWN1dGVkCi1iZWZvcmUgcmVhbGx5IGxlYXZpbmcgdGhlIGxvb3AuCi1ca3dpbmRleHtmaW5hbGx5fQotCi0KLVxzZWN0aW9ue1RoZSBca2V5d29yZHtjb250aW51ZX0gc3RhdGVtZW50IFxsYWJlbHtjb250aW51ZX19Ci1cc3RpbmRleHtjb250aW51ZX0KLQotXGJlZ2lue3Byb2R1Y3Rpb25saXN0fQotICBccHJvZHVjdGlvbntjb250aW51ZV9zdG10fQotICAgICAgICAgICAgIHsiY29udGludWUifQotXGVuZHtwcm9kdWN0aW9ubGlzdH0KLQotXGtleXdvcmR7Y29udGludWV9IG1heSBvbmx5IG9jY3VyIHN5bnRhY3RpY2FsbHkgbmVzdGVkIGluIGEgXGtleXdvcmR7Zm9yfSBvcgotXGtleXdvcmR7d2hpbGV9IGxvb3AsIGJ1dCBub3QgbmVzdGVkIGluIGEgZnVuY3Rpb24gb3IgY2xhc3MgZGVmaW5pdGlvbiBvcgotXGtleXdvcmR7ZmluYWxseX0gc3RhdGVtZW50IHdpdGhpbiB0aGF0IGxvb3AuXGZvb3Rub3Rle0l0IG1heQotb2NjdXIgd2l0aGluIGFuIFxrZXl3b3Jke2V4Y2VwdH0gb3IgXGtleXdvcmR7ZWxzZX0gY2xhdXNlLiAgVGhlCi1yZXN0cmljdGlvbiBvbiBvY2N1cnJpbmcgaW4gdGhlIFxrZXl3b3Jke3RyeX0gY2xhdXNlIGlzIGltcGxlbWVudG9yJ3MKLWxhemluZXNzIGFuZCB3aWxsIGV2ZW50dWFsbHkgYmUgbGlmdGVkLn0KLUl0IGNvbnRpbnVlcyB3aXRoIHRoZSBuZXh0IGN5Y2xlIG9mIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBsb29wLgotXHN0aW5kZXh7Zm9yfQotXHN0aW5kZXh7d2hpbGV9Ci1caW5kZXhpaXtsb29wfXtzdGF0ZW1lbnR9Ci1ca3dpbmRleHtmaW5hbGx5fQotCi0KLVxzZWN0aW9ue1RoZSBca2V5d29yZHtpbXBvcnR9IHN0YXRlbWVudCBcbGFiZWx7aW1wb3J0fX0KLVxzdGluZGV4e2ltcG9ydH0KLVxpbmRleHttb2R1bGUhaW1wb3J0aW5nfQotXGluZGV4aWl7bmFtZX17YmluZGluZ30KLVxrd2luZGV4e2Zyb219Ci0KLVxiZWdpbntwcm9kdWN0aW9ubGlzdH0KLSAgXHByb2R1Y3Rpb257aW1wb3J0X3N0bXR9Ci0gICAgICAgICAgICAgeyJpbXBvcnQiIFx0b2tlbnttb2R1bGV9IFsiYXMiIFx0b2tlbntuYW1lfV0KLSAgICAgICAgICAgICAgICAoICIsIiBcdG9rZW57bW9kdWxlfSBbImFzIiBcdG9rZW57bmFtZX1dICkqfQotICBccHJvZHVjdGlvbmNvbnR7fCAiZnJvbSIgXHRva2Vue3JlbGF0aXZlX21vZHVsZX0gImltcG9ydCIgXHRva2Vue2lkZW50aWZpZXJ9Ci0gICAgICAgICAgICAgICAgICAgIFsiYXMiIFx0b2tlbntuYW1lfV19Ci0gIFxwcm9kdWN0aW9uY29udHsgICggIiwiIFx0b2tlbntpZGVudGlmaWVyfSBbImFzIiBcdG9rZW57bmFtZX1dICkqfQotICBccHJvZHVjdGlvbmNvbnR7fCAiZnJvbSIgXHRva2Vue3JlbGF0aXZlX21vZHVsZX0gImltcG9ydCIgIigiCi0gICAgICAgICAgICAgICAgICAgIFx0b2tlbntpZGVudGlmaWVyfSBbImFzIiBcdG9rZW57bmFtZX1dfQotICBccHJvZHVjdGlvbmNvbnR7ICAoICIsIiBcdG9rZW57aWRlbnRpZmllcn0gWyJhcyIgXHRva2Vue25hbWV9XSApKiBbIiwiXSAiKSJ9Ci0gIFxwcm9kdWN0aW9uY29udHt8ICJmcm9tIiBcdG9rZW57bW9kdWxlfSAiaW1wb3J0IiAiKiJ9Ci0gIFxwcm9kdWN0aW9ue21vZHVsZX0KLSAgICAgICAgICAgICB7KFx0b2tlbntpZGVudGlmaWVyfSAiLiIpKiBcdG9rZW57aWRlbnRpZmllcn19Ci0gIFxwcm9kdWN0aW9ue3JlbGF0aXZlX21vZHVsZX0KLSAgICAgICAgICAgICB7Ii4iKiBcdG9rZW57bW9kdWxlfSB8ICIuIit9Ci0gIFxwcm9kdWN0aW9ue25hbWV9Ci0gICAgICAgICAgICAge1x0b2tlbntpZGVudGlmaWVyfX0KLVxlbmR7cHJvZHVjdGlvbmxpc3R9Ci0KLUltcG9ydCBzdGF0ZW1lbnRzIGFyZSBleGVjdXRlZCBpbiB0d28gc3RlcHM6ICgxKSBmaW5kIGEgbW9kdWxlLCBhbmQKLWluaXRpYWxpemUgaXQgaWYgbmVjZXNzYXJ5OyAoMikgZGVmaW5lIGEgbmFtZSBvciBuYW1lcyBpbiB0aGUgbG9jYWwKLW5hbWVzcGFjZSAob2YgdGhlIHNjb3BlIHdoZXJlIHRoZSBca2V5d29yZHtpbXBvcnR9IHN0YXRlbWVudCBvY2N1cnMpLgotVGhlIGZpcnN0IGZvcm0gKHdpdGhvdXQgXGtleXdvcmR7ZnJvbX0pIHJlcGVhdHMgdGhlc2Ugc3RlcHMgZm9yIGVhY2gKLWlkZW50aWZpZXIgaW4gdGhlIGxpc3QuICBUaGUgZm9ybSB3aXRoIFxrZXl3b3Jke2Zyb219IHBlcmZvcm1zIHN0ZXAKLSgxKSBvbmNlLCBhbmQgdGhlbiBwZXJmb3JtcyBzdGVwICgyKSByZXBlYXRlZGx5LgotCi1JbiB0aGlzIGNvbnRleHQsIHRvIGBgaW5pdGlhbGl6ZScnIGEgYnVpbHQtaW4gb3IgZXh0ZW5zaW9uIG1vZHVsZSBtZWFucyB0bwotY2FsbCBhbiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiB0aGF0IHRoZSBtb2R1bGUgbXVzdCBwcm92aWRlIGZvciB0aGUgcHVycG9zZQotKGluIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24sIHRoZSBmdW5jdGlvbidzIG5hbWUgaXMgb2J0YWluZWQgYnkKLXByZXBlbmRpbmcgc3RyaW5nIGBgaW5pdCcnIHRvIHRoZSBtb2R1bGUncyBuYW1lKTsgdG8gYGBpbml0aWFsaXplJycgYQotUHl0aG9uLWNvZGVkIG1vZHVsZSBtZWFucyB0byBleGVjdXRlIHRoZSBtb2R1bGUncyBib2R5LgotICAKLVRoZSBzeXN0ZW0gbWFpbnRhaW5zIGEgdGFibGUgb2YgbW9kdWxlcyB0aGF0IGhhdmUgYmVlbiBvciBhcmUgYmVpbmcKLWluaXRpYWxpemVkLAotaW5kZXhlZCBieSBtb2R1bGUgbmFtZS4gIFRoaXMgdGFibGUgaXMKLWFjY2Vzc2libGUgYXMgXGNvZGV7c3lzLm1vZHVsZXN9LiAgV2hlbiBhIG1vZHVsZSBuYW1lIGlzIGZvdW5kIGluCi10aGlzIHRhYmxlLCBzdGVwICgxKSBpcyBmaW5pc2hlZC4gIElmIG5vdCwgYSBzZWFyY2ggZm9yIGEgbW9kdWxlCi1kZWZpbml0aW9uIGlzIHN0YXJ0ZWQuICBXaGVuIGEgbW9kdWxlIGlzIGZvdW5kLCBpdCBpcyBsb2FkZWQuICBEZXRhaWxzCi1vZiB0aGUgbW9kdWxlIHNlYXJjaGluZyBhbmQgbG9hZGluZyBwcm9jZXNzIGFyZSBpbXBsZW1lbnRhdGlvbiBhbmQKLXBsYXRmb3JtIHNwZWNpZmljLiAgSXQgZ2VuZXJhbGx5IGludm9sdmVzIHNlYXJjaGluZyBmb3IgYSBgYGJ1aWx0LWluJycKLW1vZHVsZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCB0aGVuIHNlYXJjaGluZyBhIGxpc3Qgb2YgbG9jYXRpb25zCi1naXZlbiBhcyBcY29kZXtzeXMucGF0aH0uCi1cd2l0aHN1Yml0ZW17KGluIG1vZHVsZSBzeXMpfXtcdHRpbmRleHttb2R1bGVzfX0KLVx0dGluZGV4e3N5cy5tb2R1bGVzfQotXGluZGV4aWl7bW9kdWxlfXtuYW1lfQotXGluZGV4aWl7YnVpbHQtaW59e21vZHVsZX0KLVxpbmRleGlpe3VzZXItZGVmaW5lZH17bW9kdWxlfQotXHJlZmJpbW9kaW5kZXh7c3lzfQotXGluZGV4aWl7ZmlsZW5hbWV9e2V4dGVuc2lvbn0KLVxpbmRleGlpaXttb2R1bGV9e3NlYXJjaH17cGF0aH0KLQotSWYgYSBidWlsdC1pbiBtb2R1bGUgaXMgZm91bmQsXGluZGV4aWl7bW9kdWxlfXtpbml0aWFsaXphdGlvbn0gaXRzCi1idWlsdC1pbiBpbml0aWFsaXphdGlvbiBjb2RlIGlzIGV4ZWN1dGVkIGFuZCBzdGVwICgxKSBpcyBmaW5pc2hlZC4gIElmCi1ubyBtYXRjaGluZyBmaWxlIGlzIGZvdW5kLAotXGV4Y2VwdGlvbntJbXBvcnRFcnJvcn1cZXhpbmRleHtJbXBvcnRFcnJvcn0gaXMgcmFpc2VkLgotXGluZGV4e2NvZGUgYmxvY2t9SWYgYSBmaWxlIGlzIGZvdW5kLCBpdCBpcyBwYXJzZWQsCi15aWVsZGluZyBhbiBleGVjdXRhYmxlIGNvZGUgYmxvY2suICBJZiBhIHN5bnRheCBlcnJvciBvY2N1cnMsCi1cZXhjZXB0aW9ue1N5bnRheEVycm9yfVxleGluZGV4e1N5bnRheEVycm9yfSBpcyByYWlzZWQuICBPdGhlcndpc2UsIGFuCi1lbXB0eSBtb2R1bGUgb2YgdGhlIGdpdmVuIG5hbWUgaXMgY3JlYXRlZCBhbmQgaW5zZXJ0ZWQgaW4gdGhlIG1vZHVsZQotdGFibGUsIGFuZCB0aGVuIHRoZSBjb2RlIGJsb2NrIGlzIGV4ZWN1dGVkIGluIHRoZSBjb250ZXh0IG9mIHRoaXMKLW1vZHVsZS4gIEV4Y2VwdGlvbnMgZHVyaW5nIHRoaXMgZXhlY3V0aW9uIHRlcm1pbmF0ZSBzdGVwICgxKS4KLQotV2hlbiBzdGVwICgxKSBmaW5pc2hlcyB3aXRob3V0IHJhaXNpbmcgYW4gZXhjZXB0aW9uLCBzdGVwICgyKSBjYW4KLWJlZ2luLgotCi1UaGUgZmlyc3QgZm9ybSBvZiBca2V5d29yZHtpbXBvcnR9IHN0YXRlbWVudCBiaW5kcyB0aGUgbW9kdWxlIG5hbWUgaW4KLXRoZSBsb2NhbCBuYW1lc3BhY2UgdG8gdGhlIG1vZHVsZSBvYmplY3QsIGFuZCB0aGVuIGdvZXMgb24gdG8gaW1wb3J0Ci10aGUgbmV4dCBpZGVudGlmaWVyLCBpZiBhbnkuICBJZiB0aGUgbW9kdWxlIG5hbWUgaXMgZm9sbG93ZWQgYnkKLVxrZXl3b3Jke2FzfSwgdGhlIG5hbWUgZm9sbG93aW5nIFxrZXl3b3Jke2FzfSBpcyB1c2VkIGFzIHRoZSBsb2NhbAotbmFtZSBmb3IgdGhlIG1vZHVsZS4gCi0KLVRoZSBca2V5d29yZHtmcm9tfSBmb3JtIGRvZXMgbm90IGJpbmQgdGhlIG1vZHVsZSBuYW1lOiBpdCBnb2VzIHRocm91Z2ggdGhlCi1saXN0IG9mIGlkZW50aWZpZXJzLCBsb29rcyBlYWNoIG9uZSBvZiB0aGVtIHVwIGluIHRoZSBtb2R1bGUgZm91bmQgaW4gc3RlcAotKDEpLCBhbmQgYmluZHMgdGhlIG5hbWUgaW4gdGhlIGxvY2FsIG5hbWVzcGFjZSB0byB0aGUgb2JqZWN0IHRodXMgZm91bmQuIAotQXMgd2l0aCB0aGUgZmlyc3QgZm9ybSBvZiBca2V5d29yZHtpbXBvcnR9LCBhbiBhbHRlcm5hdGUgbG9jYWwgbmFtZSBjYW4gYmUKLXN1cHBsaWVkIGJ5IHNwZWNpZnlpbmcgIlxrZXl3b3Jke2FzfSBsb2NhbG5hbWUiLiAgSWYgYSBuYW1lIGlzIG5vdCBmb3VuZCwKLVxleGNlcHRpb257SW1wb3J0RXJyb3J9IGlzIHJhaXNlZC4gIElmIHRoZSBsaXN0IG9mIGlkZW50aWZpZXJzIGlzIHJlcGxhY2VkCi1ieSBhIHN0YXIgKFxjaGFyYWN0ZXJ7Kn0pLCBhbGwgcHVibGljIG5hbWVzIGRlZmluZWQgaW4gdGhlIG1vZHVsZSBhcmUKLWJvdW5kIGluIHRoZSBsb2NhbCBuYW1lc3BhY2Ugb2YgdGhlIFxrZXl3b3Jke2ltcG9ydH0gc3RhdGVtZW50Li4KLVxpbmRleGlpe25hbWV9e2JpbmRpbmd9Ci1cZXhpbmRleHtJbXBvcnRFcnJvcn0KLQotVGhlIFxlbXBoe3B1YmxpYyBuYW1lc30gZGVmaW5lZCBieSBhIG1vZHVsZSBhcmUgZGV0ZXJtaW5lZCBieSBjaGVja2luZwotdGhlIG1vZHVsZSdzIG5hbWVzcGFjZSBmb3IgYSB2YXJpYWJsZSBuYW1lZCBcY29kZXtfX2FsbF9ffTsgaWYKLWRlZmluZWQsIGl0IG11c3QgYmUgYSBzZXF1ZW5jZSBvZiBzdHJpbmdzIHdoaWNoIGFyZSBuYW1lcyBkZWZpbmVkIG9yCi1pbXBvcnRlZCBieSB0aGF0IG1vZHVsZS4gIFRoZSBuYW1lcyBnaXZlbiBpbiBcY29kZXtfX2FsbF9ffSBhcmUgYWxsCi1jb25zaWRlcmVkIHB1YmxpYyBhbmQgYXJlIHJlcXVpcmVkIHRvIGV4aXN0LiAgSWYgXGNvZGV7X19hbGxfX30gaXMgbm90Ci1kZWZpbmVkLCB0aGUgc2V0IG9mIHB1YmxpYyBuYW1lcyBpbmNsdWRlcyBhbGwgbmFtZXMgZm91bmQgaW4gdGhlCi1tb2R1bGUncyBuYW1lc3BhY2Ugd2hpY2ggZG8gbm90IGJlZ2luIHdpdGggYW4gdW5kZXJzY29yZSBjaGFyYWN0ZXIKLShcY2hhcmFjdGVye199KS4gIFxjb2Rle19fYWxsX199IHNob3VsZCBjb250YWluIHRoZSBlbnRpcmUgcHVibGljIEFQSS4KLUl0IGlzIGludGVuZGVkIHRvIGF2b2lkIGFjY2lkZW50YWxseSBleHBvcnRpbmcgaXRlbXMgdGhhdCBhcmUgbm90IHBhcnQKLW9mIHRoZSBBUEkgKHN1Y2ggYXMgbGlicmFyeSBtb2R1bGVzIHdoaWNoIHdlcmUgaW1wb3J0ZWQgYW5kIHVzZWQgd2l0aGluCi10aGUgbW9kdWxlKS4KLVx3aXRoc3ViaXRlbXsob3B0aW9uYWwgbW9kdWxlIGF0dHJpYnV0ZSl9e1x0dGluZGV4e19fYWxsX199fQotCi1UaGUgXGtleXdvcmR7ZnJvbX0gZm9ybSB3aXRoIFxzYW1weyp9IG1heSBvbmx5IG9jY3VyIGluIGEgbW9kdWxlCi1zY29wZS4gIElmIHRoZSB3aWxkIGNhcmQgZm9ybSBvZiBpbXBvcnQgLS0tIFxzYW1we2ltcG9ydCAqfSAtLS0gaXMKLXVzZWQgaW4gYSBmdW5jdGlvbiBhbmQgdGhlIGZ1bmN0aW9uIGNvbnRhaW5zIG9yIGlzIGEgbmVzdGVkIGJsb2NrIHdpdGgKLWZyZWUgdmFyaWFibGVzLCB0aGUgY29tcGlsZXIgd2lsbCByYWlzZSBhIFxleGNlcHRpb257U3ludGF4RXJyb3J9LgotCi1ca3dpbmRleHtmcm9tfQotXHN0aW5kZXh7ZnJvbX0KLQotXHN0cm9uZ3tIaWVyYXJjaGljYWwgbW9kdWxlIG5hbWVzOn1caW5kZXhpaWl7aGllcmFyY2hpY2FsfXttb2R1bGV9e25hbWVzfQotd2hlbiB0aGUgbW9kdWxlIG5hbWVzIGNvbnRhaW5zIG9uZSBvciBtb3JlIGRvdHMsIHRoZSBtb2R1bGUgc2VhcmNoCi1wYXRoIGlzIGNhcnJpZWQgb3V0IGRpZmZlcmVudGx5LiAgVGhlIHNlcXVlbmNlIG9mIGlkZW50aWZpZXJzIHVwIHRvCi10aGUgbGFzdCBkb3QgaXMgdXNlZCB0byBmaW5kIGEgYGBwYWNrYWdlJydcaW5kZXh7cGFja2FnZXN9OyB0aGUgZmluYWwKLWlkZW50aWZpZXIgaXMgdGhlbiBzZWFyY2hlZCBpbnNpZGUgdGhlIHBhY2thZ2UuICBBIHBhY2thZ2UgaXMKLWdlbmVyYWxseSBhIHN1YmRpcmVjdG9yeSBvZiBhIGRpcmVjdG9yeSBvbiBcY29kZXtzeXMucGF0aH0gdGhhdCBoYXMgYQotZmlsZSBcZmlsZXtfX2luaXRfXy5weX0uXHR0aW5kZXh7X19pbml0X18ucHl9Ci0lCi1bWFhYIENhbid0IGJlIGJvdGhlcmVkIHRvIHNwZWxsIHRoaXMgb3V0IHJpZ2h0IG5vdzsgc2VlIHRoZSBVUkwKLVx1cmx7aHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9lc3NheXMvcGFja2FnZXMuaHRtbH0gZm9yIG1vcmUgZGV0YWlscywgYWxzbwotYWJvdXQgaG93IHRoZSBtb2R1bGUgc2VhcmNoIHdvcmtzIGZyb20gaW5zaWRlIGEgcGFja2FnZS5dCi0KLVRoZSBidWlsdC1pbiBmdW5jdGlvbiBcZnVuY3Rpb257X19pbXBvcnRfXygpfSBpcyBwcm92aWRlZCB0byBzdXBwb3J0Ci1hcHBsaWNhdGlvbnMgdGhhdCBkZXRlcm1pbmUgd2hpY2ggbW9kdWxlcyBuZWVkIHRvIGJlIGxvYWRlZAotZHluYW1pY2FsbHk7IHJlZmVyIHRvIFx1bGlua3tCdWlsdC1pbgotRnVuY3Rpb25zfXsuLi9saWIvYnVpbHQtaW4tZnVuY3MuaHRtbH0gaW4gdGhlCi1cY2l0ZXRpdGxlWy4uL2xpYi9saWIuaHRtbF17UHl0aG9uIExpYnJhcnkgUmVmZXJlbmNlfSBmb3IgYWRkaXRpb25hbAotaW5mb3JtYXRpb24uCi1cYmlmdW5jaW5kZXh7X19pbXBvcnRfX30KLQotXHN1YnNlY3Rpb257RnV0dXJlIHN0YXRlbWVudHMgXGxhYmVse2Z1dHVyZX19Ci0KLUEgXGRmbntmdXR1cmUgc3RhdGVtZW50fVxpbmRleGlpe2Z1dHVyZX17c3RhdGVtZW50fSBpcyBhIGRpcmVjdGl2ZSB0bwotdGhlIGNvbXBpbGVyIHRoYXQgYSBwYXJ0aWN1bGFyIG1vZHVsZSBzaG91bGQgYmUgY29tcGlsZWQgdXNpbmcgc3ludGF4Ci1vciBzZW1hbnRpY3MgdGhhdCB3aWxsIGJlIGF2YWlsYWJsZSBpbiBhIHNwZWNpZmllZCBmdXR1cmUgcmVsZWFzZSBvZgotUHl0aG9uLiAgVGhlIGZ1dHVyZSBzdGF0ZW1lbnQgaXMgaW50ZW5kZWQgdG8gZWFzZSBtaWdyYXRpb24gdG8gZnV0dXJlCi12ZXJzaW9ucyBvZiBQeXRob24gdGhhdCBpbnRyb2R1Y2UgaW5jb21wYXRpYmxlIGNoYW5nZXMgdG8gdGhlCi1sYW5ndWFnZS4gIEl0IGFsbG93cyB1c2Ugb2YgdGhlIG5ldyBmZWF0dXJlcyBvbiBhIHBlci1tb2R1bGUgYmFzaXMKLWJlZm9yZSB0aGUgcmVsZWFzZSBpbiB3aGljaCB0aGUgZmVhdHVyZSBiZWNvbWVzIHN0YW5kYXJkLgotCi1cYmVnaW57cHJvZHVjdGlvbmxpc3R9WypdCi0gIFxwcm9kdWN0aW9ue2Z1dHVyZV9zdGF0ZW1lbnR9Ci0gICAgICAgICAgICAgeyJmcm9tIiAiX19mdXR1cmVfXyIgImltcG9ydCIgZmVhdHVyZSBbImFzIiBuYW1lXX0KLSAgXHByb2R1Y3Rpb25jb250eyAgKCIsIiBmZWF0dXJlIFsiYXMiIG5hbWVdKSp9Ci0gIFxwcm9kdWN0aW9uY29udHt8ICJmcm9tIiAiX19mdXR1cmVfXyIgImltcG9ydCIgIigiIGZlYXR1cmUgWyJhcyIgbmFtZV19Ci0gIFxwcm9kdWN0aW9uY29udHsgICgiLCIgZmVhdHVyZSBbImFzIiBuYW1lXSkqIFsiLCJdICIpIn0KLSAgXHByb2R1Y3Rpb257ZmVhdHVyZX17aWRlbnRpZmllcn0KLSAgXHByb2R1Y3Rpb257bmFtZX17aWRlbnRpZmllcn0KLVxlbmR7cHJvZHVjdGlvbmxpc3R9Ci0KLUEgZnV0dXJlIHN0YXRlbWVudCBtdXN0IGFwcGVhciBuZWFyIHRoZSB0b3Agb2YgdGhlIG1vZHVsZS4gIFRoZSBvbmx5Ci1saW5lcyB0aGF0IGNhbiBhcHBlYXIgYmVmb3JlIGEgZnV0dXJlIHN0YXRlbWVudCBhcmU6Ci0KLVxiZWdpbntpdGVtaXplfQotCi1caXRlbSB0aGUgbW9kdWxlIGRvY3N0cmluZyAoaWYgYW55KSwKLVxpdGVtIGNvbW1lbnRzLAotXGl0ZW0gYmxhbmsgbGluZXMsIGFuZAotXGl0ZW0gb3RoZXIgZnV0dXJlIHN0YXRlbWVudHMuCi0KLVxlbmR7aXRlbWl6ZX0KLQotVGhlIGZlYXR1cmVzIHJlY29nbml6ZWQgYnkgUHl0aG9uIDIuNSBhcmUgXHNhbXB7YWJzb2x1dGVfaW1wb3J0fSwKLVxzYW1we2RpdmlzaW9ufSwgXHNhbXB7Z2VuZXJhdG9yc30sIFxzYW1we25lc3RlZF9zY29wZXN9IGFuZAotXHNhbXB7d2l0aF9zdGF0ZW1lbnR9LiAgXHNhbXB7Z2VuZXJhdG9yc30gYW5kIFxzYW1we25lc3RlZF9zY29wZXN9IAotYXJlIHJlZHVuZGFudCBpbiBQeXRob24gdmVyc2lvbiAyLjMgYW5kIGFib3ZlIGJlY2F1c2UgdGhleSBhcmUgYWx3YXlzCi1lbmFibGVkLiAKLQotQSBmdXR1cmUgc3RhdGVtZW50IGlzIHJlY29nbml6ZWQgYW5kIHRyZWF0ZWQgc3BlY2lhbGx5IGF0IGNvbXBpbGUKLXRpbWU6IENoYW5nZXMgdG8gdGhlIHNlbWFudGljcyBvZiBjb3JlIGNvbnN0cnVjdHMgYXJlIG9mdGVuCi1pbXBsZW1lbnRlZCBieSBnZW5lcmF0aW5nIGRpZmZlcmVudCBjb2RlLiAgSXQgbWF5IGV2ZW4gYmUgdGhlIGNhc2UKLXRoYXQgYSBuZXcgZmVhdHVyZSBpbnRyb2R1Y2VzIG5ldyBpbmNvbXBhdGlibGUgc3ludGF4IChzdWNoIGFzIGEgbmV3Ci1yZXNlcnZlZCB3b3JkKSwgaW4gd2hpY2ggY2FzZSB0aGUgY29tcGlsZXIgbWF5IG5lZWQgdG8gcGFyc2UgdGhlCi1tb2R1bGUgZGlmZmVyZW50bHkuICBTdWNoIGRlY2lzaW9ucyBjYW5ub3QgYmUgcHVzaGVkIG9mZiB1bnRpbAotcnVudGltZS4KLQotRm9yIGFueSBnaXZlbiByZWxlYXNlLCB0aGUgY29tcGlsZXIga25vd3Mgd2hpY2ggZmVhdHVyZSBuYW1lcyBoYXZlIGJlZW4KLWRlZmluZWQsIGFuZCByYWlzZXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSBmdXR1cmUgc3RhdGVtZW50IGNvbnRhaW5zCi1hIGZlYXR1cmUgbm90IGtub3duIHRvIGl0LgotCi1UaGUgZGlyZWN0IHJ1bnRpbWUgc2VtYW50aWNzIGFyZSB0aGUgc2FtZSBhcyBmb3IgYW55IGltcG9ydCBzdGF0ZW1lbnQ6Ci10aGVyZSBpcyBhIHN0YW5kYXJkIG1vZHVsZSBcbW9kdWxle19fZnV0dXJlX199LCBkZXNjcmliZWQgbGF0ZXIsIGFuZAotaXQgd2lsbCBiZSBpbXBvcnRlZCBpbiB0aGUgdXN1YWwgd2F5IGF0IHRoZSB0aW1lIHRoZSBmdXR1cmUgc3RhdGVtZW50Ci1pcyBleGVjdXRlZC4KLQotVGhlIGludGVyZXN0aW5nIHJ1bnRpbWUgc2VtYW50aWNzIGRlcGVuZCBvbiB0aGUgc3BlY2lmaWMgZmVhdHVyZQotZW5hYmxlZCBieSB0aGUgZnV0dXJlIHN0YXRlbWVudC4KLQotTm90ZSB0aGF0IHRoZXJlIGlzIG5vdGhpbmcgc3BlY2lhbCBhYm91dCB0aGUgc3RhdGVtZW50OgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgX19mdXR1cmVfXyBbYXMgbmFtZV0KLVxlbmR7dmVyYmF0aW19Ci0KLVRoYXQgaXMgbm90IGEgZnV0dXJlIHN0YXRlbWVudDsgaXQncyBhbiBvcmRpbmFyeSBpbXBvcnQgc3RhdGVtZW50IHdpdGgKLW5vIHNwZWNpYWwgc2VtYW50aWNzIG9yIHN5bnRheCByZXN0cmljdGlvbnMuCi0KLUNvZGUgY29tcGlsZWQgYnkgY2FsbHMgdG8gdGhlIGJ1aWx0aW4gZnVuY3Rpb25zIFxmdW5jdGlvbntleGVjKCl9IGFuZAotXGZ1bmN0aW9ue2NvbXBpbGUoKX0gdGhhdCBvY2N1ciBpbiBhIG1vZHVsZQotXG1vZHVsZXtNfSBjb250YWluaW5nIGEgZnV0dXJlIHN0YXRlbWVudCB3aWxsLCBieSBkZWZhdWx0LCB1c2UgdGhlIG5ldyAKLXN5bnRheCBvciBzZW1hbnRpY3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBmdXR1cmUgc3RhdGVtZW50LiAgVGhpcyBjYW4sCi1zdGFydGluZyB3aXRoIFB5dGhvbiAyLjIgYmUgY29udHJvbGxlZCBieSBvcHRpb25hbCBhcmd1bWVudHMgdG8KLVxmdW5jdGlvbntjb21waWxlKCl9IC0tLSBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBmdW5jdGlvbiBpbiB0aGUKLVxjaXRldGl0bGVbLi4vbGliL2J1aWx0LWluLWZ1bmNzLmh0bWxde1B5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZX0gZm9yCi1kZXRhaWxzLgotCi1BIGZ1dHVyZSBzdGF0ZW1lbnQgdHlwZWQgYXQgYW4gaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIgcHJvbXB0IHdpbGwKLXRha2UgZWZmZWN0IGZvciB0aGUgcmVzdCBvZiB0aGUgaW50ZXJwcmV0ZXIgc2Vzc2lvbi4gIElmIGFuCi1pbnRlcnByZXRlciBpcyBzdGFydGVkIHdpdGggdGhlIFxwcm9ncmFtb3B0ey1pfSBvcHRpb24sIGlzIHBhc3NlZCBhCi1zY3JpcHQgbmFtZSB0byBleGVjdXRlLCBhbmQgdGhlIHNjcmlwdCBpbmNsdWRlcyBhIGZ1dHVyZSBzdGF0ZW1lbnQsIGl0Ci13aWxsIGJlIGluIGVmZmVjdCBpbiB0aGUgaW50ZXJhY3RpdmUgc2Vzc2lvbiBzdGFydGVkIGFmdGVyIHRoZSBzY3JpcHQKLWlzIGV4ZWN1dGVkLgotCi1cc2VjdGlvbntUaGUgXGtleXdvcmR7Z2xvYmFsfSBzdGF0ZW1lbnQgXGxhYmVse2dsb2JhbH19Ci1cc3RpbmRleHtnbG9iYWx9Ci0KLVxiZWdpbntwcm9kdWN0aW9ubGlzdH0KLSAgXHByb2R1Y3Rpb257Z2xvYmFsX3N0bXR9Ci0gICAgICAgICAgICAgeyJnbG9iYWwiIFx0b2tlbntpZGVudGlmaWVyfSAoIiwiIFx0b2tlbntpZGVudGlmaWVyfSkqfQotXGVuZHtwcm9kdWN0aW9ubGlzdH0KLQotVGhlIFxrZXl3b3Jke2dsb2JhbH0gc3RhdGVtZW50IGlzIGEgZGVjbGFyYXRpb24gd2hpY2ggaG9sZHMgZm9yIHRoZQotZW50aXJlIGN1cnJlbnQgY29kZSBibG9jay4gIEl0IG1lYW5zIHRoYXQgdGhlIGxpc3RlZCBpZGVudGlmaWVycyBhcmUgdG8gYmUKLWludGVycHJldGVkIGFzIGdsb2JhbHMuICBJdCB3b3VsZCBiZSBpbXBvc3NpYmxlIHRvIGFzc2lnbiB0byBhIGdsb2JhbAotdmFyaWFibGUgd2l0aG91dCBca2V5d29yZHtnbG9iYWx9LCBhbHRob3VnaCBmcmVlIHZhcmlhYmxlcyBtYXkgcmVmZXIKLXRvIGdsb2JhbHMgd2l0aG91dCBiZWluZyBkZWNsYXJlZCBnbG9iYWwuCi1caW5kZXhpaWl7Z2xvYmFsfXtuYW1lfXtiaW5kaW5nfQotCi1OYW1lcyBsaXN0ZWQgaW4gYSBca2V5d29yZHtnbG9iYWx9IHN0YXRlbWVudCBtdXN0IG5vdCBiZSB1c2VkIGluIHRoZSBzYW1lCi1jb2RlIGJsb2NrIHRleHR1YWxseSBwcmVjZWRpbmcgdGhhdCBca2V5d29yZHtnbG9iYWx9IHN0YXRlbWVudC4KLQotTmFtZXMgbGlzdGVkIGluIGEgXGtleXdvcmR7Z2xvYmFsfSBzdGF0ZW1lbnQgbXVzdCBub3QgYmUgZGVmaW5lZCBhcyBmb3JtYWwKLXBhcmFtZXRlcnMgb3IgaW4gYSBca2V5d29yZHtmb3J9IGxvb3AgY29udHJvbCB0YXJnZXQsIFxrZXl3b3Jke2NsYXNzfQotZGVmaW5pdGlvbiwgZnVuY3Rpb24gZGVmaW5pdGlvbiwgb3IgXGtleXdvcmR7aW1wb3J0fSBzdGF0ZW1lbnQuCi0KLShUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBlbmZvcmNlIHRoZSBsYXR0ZXIgdHdvCi1yZXN0cmljdGlvbnMsIGJ1dCBwcm9ncmFtcyBzaG91bGQgbm90IGFidXNlIHRoaXMgZnJlZWRvbSwgYXMgZnV0dXJlCi1pbXBsZW1lbnRhdGlvbnMgbWF5IGVuZm9yY2UgdGhlbSBvciBzaWxlbnRseSBjaGFuZ2UgdGhlIG1lYW5pbmcgb2YgdGhlCi1wcm9ncmFtLikKLQotXHN0cm9uZ3tQcm9ncmFtbWVyJ3Mgbm90ZTp9Ci10aGUgXGtleXdvcmR7Z2xvYmFsfSBpcyBhIGRpcmVjdGl2ZSB0byB0aGUgcGFyc2VyLiAgSXQKLWFwcGxpZXMgb25seSB0byBjb2RlIHBhcnNlZCBhdCB0aGUgc2FtZSB0aW1lIGFzIHRoZSBca2V5d29yZHtnbG9iYWx9Ci1zdGF0ZW1lbnQuICBJbiBwYXJ0aWN1bGFyLCBhIFxrZXl3b3Jke2dsb2JhbH0gc3RhdGVtZW50IGNvbnRhaW5lZCBpbiBhCi1zdHJpbmcgb3IgY29kZSBvYmplY3Qgc3VwcGxpZWQgdG8gdGhlIGJ1aWx0aW4gXGZ1bmN0aW9ue2V4ZWMoKX0gZnVuY3Rpb24KLWRvZXMgbm90IGFmZmVjdCB0aGUgY29kZSBibG9jayBcZW1waHtjb250YWluaW5nfSB0aGUgZnVuY3Rpb24gY2FsbCwKLWFuZCBjb2RlIGNvbnRhaW5lZCBpbiBzdWNoIGEgc3RyaW5nIGlzIHVuYWZmZWN0ZWQgYnkgXGtleXdvcmR7Z2xvYmFsfQotc3RhdGVtZW50cyBpbiB0aGUgY29kZSBjb250YWluaW5nIHRoZSBmdW5jdGlvbiBjYWxsLiAgVGhlIHNhbWUgYXBwbGllcyB0byB0aGUKLVxmdW5jdGlvbntldmFsKCl9IGFuZCBcZnVuY3Rpb257Y29tcGlsZSgpfSBmdW5jdGlvbnMuCi1cYmlmdW5jaW5kZXh7ZXhlY30KLVxiaWZ1bmNpbmRleHtldmFsfQotXGJpZnVuY2luZGV4e2NvbXBpbGV9Ci0KZGlmZiAtLWdpdCBhL0RvYy9yZWYvcmVmNy50ZXggYi9Eb2MvcmVmL3JlZjcudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mjk0NTU3Li4wMDAwMDAwCi0tLSBhL0RvYy9yZWYvcmVmNy50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw1NTIgKzAsMCBAQAotXGNoYXB0ZXJ7Q29tcG91bmQgc3RhdGVtZW50c1xsYWJlbHtjb21wb3VuZH19Ci1caW5kZXhpaXtjb21wb3VuZH17c3RhdGVtZW50fQotCi1Db21wb3VuZCBzdGF0ZW1lbnRzIGNvbnRhaW4gKGdyb3VwcyBvZikgb3RoZXIgc3RhdGVtZW50czsgdGhleSBhZmZlY3QKLW9yIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aG9zZSBvdGhlciBzdGF0ZW1lbnRzIGluIHNvbWUgd2F5LiAgSW4KLWdlbmVyYWwsIGNvbXBvdW5kIHN0YXRlbWVudHMgc3BhbiBtdWx0aXBsZSBsaW5lcywgYWx0aG91Z2ggaW4gc2ltcGxlCi1pbmNhcm5hdGlvbnMgYSB3aG9sZSBjb21wb3VuZCBzdGF0ZW1lbnQgbWF5IGJlIGNvbnRhaW5lZCBpbiBvbmUgbGluZS4KLQotVGhlIFxrZXl3b3Jke2lmfSwgXGtleXdvcmR7d2hpbGV9IGFuZCBca2V5d29yZHtmb3J9IHN0YXRlbWVudHMgaW1wbGVtZW50Ci10cmFkaXRpb25hbCBjb250cm9sIGZsb3cgY29uc3RydWN0cy4gIFxrZXl3b3Jke3RyeX0gc3BlY2lmaWVzIGV4Y2VwdGlvbgotaGFuZGxlcnMgYW5kL29yIGNsZWFudXAgY29kZSBmb3IgYSBncm91cCBvZiBzdGF0ZW1lbnRzLiAgRnVuY3Rpb24gYW5kCi1jbGFzcyBkZWZpbml0aW9ucyBhcmUgYWxzbyBzeW50YWN0aWNhbGx5IGNvbXBvdW5kIHN0YXRlbWVudHMuCi0KLUNvbXBvdW5kIHN0YXRlbWVudHMgY29uc2lzdCBvZiBvbmUgb3IgbW9yZSBgY2xhdXNlcy4nICBBIGNsYXVzZQotY29uc2lzdHMgb2YgYSBoZWFkZXIgYW5kIGEgYHN1aXRlLicgIFRoZSBjbGF1c2UgaGVhZGVycyBvZiBhCi1wYXJ0aWN1bGFyIGNvbXBvdW5kIHN0YXRlbWVudCBhcmUgYWxsIGF0IHRoZSBzYW1lIGluZGVudGF0aW9uIGxldmVsLgotRWFjaCBjbGF1c2UgaGVhZGVyIGJlZ2lucyB3aXRoIGEgdW5pcXVlbHkgaWRlbnRpZnlpbmcga2V5d29yZCBhbmQgZW5kcwotd2l0aCBhIGNvbG9uLiAgQSBzdWl0ZSBpcyBhIGdyb3VwIG9mIHN0YXRlbWVudHMgY29udHJvbGxlZCBieSBhCi1jbGF1c2UuICBBIHN1aXRlIGNhbiBiZSBvbmUgb3IgbW9yZSBzZW1pY29sb24tc2VwYXJhdGVkIHNpbXBsZQotc3RhdGVtZW50cyBvbiB0aGUgc2FtZSBsaW5lIGFzIHRoZSBoZWFkZXIsIGZvbGxvd2luZyB0aGUgaGVhZGVyJ3MKLWNvbG9uLCBvciBpdCBjYW4gYmUgb25lIG9yIG1vcmUgaW5kZW50ZWQgc3RhdGVtZW50cyBvbiBzdWJzZXF1ZW50Ci1saW5lcy4gIE9ubHkgdGhlIGxhdHRlciBmb3JtIG9mIHN1aXRlIGNhbiBjb250YWluIG5lc3RlZCBjb21wb3VuZAotc3RhdGVtZW50czsgdGhlIGZvbGxvd2luZyBpcyBpbGxlZ2FsLCBtb3N0bHkgYmVjYXVzZSBpdCB3b3VsZG4ndCBiZQotY2xlYXIgdG8gd2hpY2ggXGtleXdvcmR7aWZ9IGNsYXVzZSBhIGZvbGxvd2luZyBca2V5d29yZHtlbHNlfSBjbGF1c2Ugd291bGQKLWJlbG9uZzoKLVxpbmRleHtjbGF1c2V9Ci1caW5kZXh7c3VpdGV9Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWlmIHRlc3QxOiBpZiB0ZXN0MjogcHJpbnQgeAotXGVuZHt2ZXJiYXRpbX0KLQotQWxzbyBub3RlIHRoYXQgdGhlIHNlbWljb2xvbiBiaW5kcyB0aWdodGVyIHRoYW4gdGhlIGNvbG9uIGluIHRoaXMKLWNvbnRleHQsIHNvIHRoYXQgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLCBlaXRoZXIgYWxsIG9yIG5vbmUgb2YgdGhlCi1ca2V5d29yZHtwcmludH0gc3RhdGVtZW50cyBhcmUgZXhlY3V0ZWQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWlmIHggPCB5IDwgejogcHJpbnQgeDsgcHJpbnQgeTsgcHJpbnQgegotXGVuZHt2ZXJiYXRpbX0KLQotU3VtbWFyaXppbmc6Ci0KLVxiZWdpbntwcm9kdWN0aW9ubGlzdH0KLSAgXHByb2R1Y3Rpb257Y29tcG91bmRfc3RtdH0KLSAgICAgICAgICAgICB7XHRva2Vue2lmX3N0bXR9fQotICBccHJvZHVjdGlvbmNvbnR7fCBcdG9rZW57d2hpbGVfc3RtdH19Ci0gIFxwcm9kdWN0aW9uY29udHt8IFx0b2tlbntmb3Jfc3RtdH19Ci0gIFxwcm9kdWN0aW9uY29udHt8IFx0b2tlbnt0cnlfc3RtdH19Ci0gIFxwcm9kdWN0aW9uY29udHt8IFx0b2tlbnt3aXRoX3N0bXR9fQotICBccHJvZHVjdGlvbmNvbnR7fCBcdG9rZW57ZnVuY2RlZn19Ci0gIFxwcm9kdWN0aW9uY29udHt8IFx0b2tlbntjbGFzc2RlZn19Ci0gIFxwcm9kdWN0aW9ue3N1aXRlfQotICAgICAgICAgICAgIHtcdG9rZW57c3RtdF9saXN0fSBORVdMSU5FCi0gICAgICAgICAgICAgIHwgTkVXTElORSBJTkRFTlQgXHRva2Vue3N0YXRlbWVudH0rIERFREVOVH0KLSAgXHByb2R1Y3Rpb257c3RhdGVtZW50fQotICAgICAgICAgICAgIHtcdG9rZW57c3RtdF9saXN0fSBORVdMSU5FIHwgXHRva2Vue2NvbXBvdW5kX3N0bXR9fQotICBccHJvZHVjdGlvbntzdG10X2xpc3R9Ci0gICAgICAgICAgICAge1x0b2tlbntzaW1wbGVfc3RtdH0gKCI7IiBcdG9rZW57c2ltcGxlX3N0bXR9KSogWyI7Il19Ci1cZW5ke3Byb2R1Y3Rpb25saXN0fQotCi1Ob3RlIHRoYXQgc3RhdGVtZW50cyBhbHdheXMgZW5kIGluIGEKLVxjb2Rle05FV0xJTkV9XGluZGV4e05FV0xJTkUgdG9rZW59IHBvc3NpYmx5IGZvbGxvd2VkIGJ5IGEKLVxjb2Rle0RFREVOVH0uXGluZGV4e0RFREVOVCB0b2tlbn0gQWxzbyBub3RlIHRoYXQgb3B0aW9uYWwKLWNvbnRpbnVhdGlvbiBjbGF1c2VzIGFsd2F5cyBiZWdpbiB3aXRoIGEga2V5d29yZCB0aGF0IGNhbm5vdCBzdGFydCBhCi1zdGF0ZW1lbnQsIHRodXMgdGhlcmUgYXJlIG5vIGFtYmlndWl0aWVzICh0aGUgYGRhbmdsaW5nCi1ca2V5d29yZHtlbHNlfScgcHJvYmxlbSBpcyBzb2x2ZWQgaW4gUHl0aG9uIGJ5IHJlcXVpcmluZyBuZXN0ZWQKLVxrZXl3b3Jke2lmfSBzdGF0ZW1lbnRzIHRvIGJlIGluZGVudGVkKS4KLVxpbmRleGlpe2RhbmdsaW5nfXtlbHNlfQotCi1UaGUgZm9ybWF0dGluZyBvZiB0aGUgZ3JhbW1hciBydWxlcyBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zIHBsYWNlcwotZWFjaCBjbGF1c2Ugb24gYSBzZXBhcmF0ZSBsaW5lIGZvciBjbGFyaXR5LgotCi0KLVxzZWN0aW9ue1RoZSBca2V5d29yZHtpZn0gc3RhdGVtZW50XGxhYmVse2lmfX0KLVxzdGluZGV4e2lmfQotCi1UaGUgXGtleXdvcmR7aWZ9IHN0YXRlbWVudCBpcyB1c2VkIGZvciBjb25kaXRpb25hbCBleGVjdXRpb246Ci0KLVxiZWdpbntwcm9kdWN0aW9ubGlzdH0KLSAgXHByb2R1Y3Rpb257aWZfc3RtdH0KLSAgICAgICAgICAgICB7ImlmIiBcdG9rZW57ZXhwcmVzc2lvbn0gIjoiIFx0b2tlbntzdWl0ZX19Ci0gIFxwcm9kdWN0aW9uY29udHsoICJlbGlmIiBcdG9rZW57ZXhwcmVzc2lvbn0gIjoiIFx0b2tlbntzdWl0ZX0gKSp9Ci0gIFxwcm9kdWN0aW9uY29udHtbImVsc2UiICI6IiBcdG9rZW57c3VpdGV9XX0KLVxlbmR7cHJvZHVjdGlvbmxpc3R9Ci0KLUl0IHNlbGVjdHMgZXhhY3RseSBvbmUgb2YgdGhlIHN1aXRlcyBieSBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9ucyBvbmUKLWJ5IG9uZSB1bnRpbCBvbmUgaXMgZm91bmQgdG8gYmUgdHJ1ZSAoc2VlIHNlY3Rpb25+XHJlZntCb29sZWFuc30gZm9yCi10aGUgZGVmaW5pdGlvbiBvZiB0cnVlIGFuZCBmYWxzZSk7IHRoZW4gdGhhdCBzdWl0ZSBpcyBleGVjdXRlZCAoYW5kIG5vCi1vdGhlciBwYXJ0IG9mIHRoZSBca2V5d29yZHtpZn0gc3RhdGVtZW50IGlzIGV4ZWN1dGVkIG9yIGV2YWx1YXRlZCkuICBJZgotYWxsIGV4cHJlc3Npb25zIGFyZSBmYWxzZSwgdGhlIHN1aXRlIG9mIHRoZSBca2V5d29yZHtlbHNlfSBjbGF1c2UsIGlmCi1wcmVzZW50LCBpcyBleGVjdXRlZC4KLVxrd2luZGV4e2VsaWZ9Ci1ca3dpbmRleHtlbHNlfQotCi0KLVxzZWN0aW9ue1RoZSBca2V5d29yZHt3aGlsZX0gc3RhdGVtZW50XGxhYmVse3doaWxlfX0KLVxzdGluZGV4e3doaWxlfQotXGluZGV4aWl7bG9vcH17c3RhdGVtZW50fQotCi1UaGUgXGtleXdvcmR7d2hpbGV9IHN0YXRlbWVudCBpcyB1c2VkIGZvciByZXBlYXRlZCBleGVjdXRpb24gYXMgbG9uZwotYXMgYW4gZXhwcmVzc2lvbiBpcyB0cnVlOgotCi1cYmVnaW57cHJvZHVjdGlvbmxpc3R9Ci0gIFxwcm9kdWN0aW9ue3doaWxlX3N0bXR9Ci0gICAgICAgICAgICAgeyJ3aGlsZSIgXHRva2Vue2V4cHJlc3Npb259ICI6IiBcdG9rZW57c3VpdGV9fQotICBccHJvZHVjdGlvbmNvbnR7WyJlbHNlIiAiOiIgXHRva2Vue3N1aXRlfV19Ci1cZW5ke3Byb2R1Y3Rpb25saXN0fQotCi1UaGlzIHJlcGVhdGVkbHkgdGVzdHMgdGhlIGV4cHJlc3Npb24gYW5kLCBpZiBpdCBpcyB0cnVlLCBleGVjdXRlcyB0aGUKLWZpcnN0IHN1aXRlOyBpZiB0aGUgZXhwcmVzc2lvbiBpcyBmYWxzZSAod2hpY2ggbWF5IGJlIHRoZSBmaXJzdCB0aW1lIGl0Ci1pcyB0ZXN0ZWQpIHRoZSBzdWl0ZSBvZiB0aGUgXGtleXdvcmR7ZWxzZX0gY2xhdXNlLCBpZiBwcmVzZW50LCBpcwotZXhlY3V0ZWQgYW5kIHRoZSBsb29wIHRlcm1pbmF0ZXMuCi1ca3dpbmRleHtlbHNlfQotCi1BIFxrZXl3b3Jke2JyZWFrfSBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHRlcm1pbmF0ZXMgdGhlCi1sb29wIHdpdGhvdXQgZXhlY3V0aW5nIHRoZSBca2V5d29yZHtlbHNlfSBjbGF1c2UncyBzdWl0ZS4gIEEKLVxrZXl3b3Jke2NvbnRpbnVlfSBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHNraXBzIHRoZSByZXN0Ci1vZiB0aGUgc3VpdGUgYW5kIGdvZXMgYmFjayB0byB0ZXN0aW5nIHRoZSBleHByZXNzaW9uLgotXHN0aW5kZXh7YnJlYWt9Ci1cc3RpbmRleHtjb250aW51ZX0KLQotCi1cc2VjdGlvbntUaGUgXGtleXdvcmR7Zm9yfSBzdGF0ZW1lbnRcbGFiZWx7Zm9yfX0KLVxzdGluZGV4e2Zvcn0KLVxpbmRleGlpe2xvb3B9e3N0YXRlbWVudH0KLQotVGhlIFxrZXl3b3Jke2Zvcn0gc3RhdGVtZW50IGlzIHVzZWQgdG8gaXRlcmF0ZSBvdmVyIHRoZSBlbGVtZW50cyBvZiBhCi1zZXF1ZW5jZSAoc3VjaCBhcyBhIHN0cmluZywgdHVwbGUgb3IgbGlzdCkgb3Igb3RoZXIgaXRlcmFibGUgb2JqZWN0OgotXG9iaW5kZXh7c2VxdWVuY2V9Ci0KLVxiZWdpbntwcm9kdWN0aW9ubGlzdH0KLSAgXHByb2R1Y3Rpb257Zm9yX3N0bXR9Ci0gICAgICAgICAgICAgeyJmb3IiIFx0b2tlbnt0YXJnZXRfbGlzdH0gImluIiBcdG9rZW57ZXhwcmVzc2lvbl9saXN0fQotICAgICAgICAgICAgICAiOiIgXHRva2Vue3N1aXRlfX0KLSAgXHByb2R1Y3Rpb25jb250e1siZWxzZSIgIjoiIFx0b2tlbntzdWl0ZX1dfQotXGVuZHtwcm9kdWN0aW9ubGlzdH0KLQotVGhlIGV4cHJlc3Npb24gbGlzdCBpcyBldmFsdWF0ZWQgb25jZTsgaXQgc2hvdWxkIHlpZWxkIGFuIGl0ZXJhYmxlCi1vYmplY3QuICBBbiBpdGVyYXRvciBpcyBjcmVhdGVkIGZvciB0aGUgcmVzdWx0IG9mIHRoZQote31cY29kZXtleHByZXNzaW9uX2xpc3R9LiAgVGhlIHN1aXRlIGlzIHRoZW4gZXhlY3V0ZWQgb25jZSBmb3IgZWFjaAotaXRlbSBwcm92aWRlZCBieSB0aGUgaXRlcmF0b3IsIGluIHRoZQotb3JkZXIgb2YgYXNjZW5kaW5nIGluZGljZXMuICBFYWNoIGl0ZW0gaW4gdHVybiBpcyBhc3NpZ25lZCB0byB0aGUKLXRhcmdldCBsaXN0IHVzaW5nIHRoZSBzdGFuZGFyZCBydWxlcyBmb3IgYXNzaWdubWVudHMsIGFuZCB0aGVuIHRoZQotc3VpdGUgaXMgZXhlY3V0ZWQuICBXaGVuIHRoZSBpdGVtcyBhcmUgZXhoYXVzdGVkICh3aGljaCBpcyBpbW1lZGlhdGVseQotd2hlbiB0aGUgc2VxdWVuY2UgaXMgZW1wdHkpLCB0aGUgc3VpdGUgaW4gdGhlIFxrZXl3b3Jke2Vsc2V9IGNsYXVzZSwgaWYKLXByZXNlbnQsIGlzIGV4ZWN1dGVkLCBhbmQgdGhlIGxvb3AgdGVybWluYXRlcy4KLVxrd2luZGV4e2lufQotXGt3aW5kZXh7ZWxzZX0KLVxpbmRleGlpe3RhcmdldH17bGlzdH0KLQotQSBca2V5d29yZHticmVha30gc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSB0ZXJtaW5hdGVzIHRoZQotbG9vcCB3aXRob3V0IGV4ZWN1dGluZyB0aGUgXGtleXdvcmR7ZWxzZX0gY2xhdXNlJ3Mgc3VpdGUuICBBCi1ca2V5d29yZHtjb250aW51ZX0gc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSBza2lwcyB0aGUgcmVzdAotb2YgdGhlIHN1aXRlIGFuZCBjb250aW51ZXMgd2l0aCB0aGUgbmV4dCBpdGVtLCBvciB3aXRoIHRoZSBca2V5d29yZHtlbHNlfQotY2xhdXNlIGlmIHRoZXJlIHdhcyBubyBuZXh0IGl0ZW0uCi1cc3RpbmRleHticmVha30KLVxzdGluZGV4e2NvbnRpbnVlfQotCi1UaGUgc3VpdGUgbWF5IGFzc2lnbiB0byB0aGUgdmFyaWFibGUocykgaW4gdGhlIHRhcmdldCBsaXN0OyB0aGlzIGRvZXMKLW5vdCBhZmZlY3QgdGhlIG5leHQgaXRlbSBhc3NpZ25lZCB0byBpdC4KLQotVGhlIHRhcmdldCBsaXN0IGlzIG5vdCBkZWxldGVkIHdoZW4gdGhlIGxvb3AgaXMgZmluaXNoZWQsIGJ1dCBpZiB0aGUKLXNlcXVlbmNlIGlzIGVtcHR5LCBpdCB3aWxsIG5vdCBoYXZlIGJlZW4gYXNzaWduZWQgdG8gYXQgYWxsIGJ5IHRoZQotbG9vcC4gIEhpbnQ6IHRoZSBidWlsdC1pbiBmdW5jdGlvbiBcZnVuY3Rpb257cmFuZ2UoKX0gcmV0dXJucyBhCi1zZXF1ZW5jZSBvZiBpbnRlZ2VycyBzdWl0YWJsZSB0byBlbXVsYXRlIHRoZSBlZmZlY3Qgb2YgUGFzY2FsJ3MKLVxjb2Rle2ZvciBpIDo9IGEgdG8gYiBkb307Ci1lLmcuLCBcY29kZXtyYW5nZSgzKX0gcmV0dXJucyB0aGUgbGlzdCBcY29kZXtbMCwgMSwgMl19LgotXGJpZnVuY2luZGV4e3JhbmdlfQotXGluZGV4aWl7UGFzY2FsfXtsYW5ndWFnZX0KLQotXHdhcm5pbmd7VGhlcmUgaXMgYSBzdWJ0bGV0eSB3aGVuIHRoZSBzZXF1ZW5jZSBpcyBiZWluZyBtb2RpZmllZAotYnkgdGhlIGxvb3AgKHRoaXMgY2FuIG9ubHkgb2NjdXIgZm9yIG11dGFibGUgc2VxdWVuY2VzLCBpLmUuIGxpc3RzKS4KLUFuIGludGVybmFsIGNvdW50ZXIgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHdoaWNoIGl0ZW0gaXMgdXNlZCBuZXh0LAotYW5kIHRoaXMgaXMgaW5jcmVtZW50ZWQgb24gZWFjaCBpdGVyYXRpb24uICBXaGVuIHRoaXMgY291bnRlciBoYXMKLXJlYWNoZWQgdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UgdGhlIGxvb3AgdGVybWluYXRlcy4gIFRoaXMgbWVhbnMgdGhhdAotaWYgdGhlIHN1aXRlIGRlbGV0ZXMgdGhlIGN1cnJlbnQgKG9yIGEgcHJldmlvdXMpIGl0ZW0gZnJvbSB0aGUKLXNlcXVlbmNlLCB0aGUgbmV4dCBpdGVtIHdpbGwgYmUgc2tpcHBlZCAoc2luY2UgaXQgZ2V0cyB0aGUgaW5kZXggb2YKLXRoZSBjdXJyZW50IGl0ZW0gd2hpY2ggaGFzIGFscmVhZHkgYmVlbiB0cmVhdGVkKS4gIExpa2V3aXNlLCBpZiB0aGUKLXN1aXRlIGluc2VydHMgYW4gaXRlbSBpbiB0aGUgc2VxdWVuY2UgYmVmb3JlIHRoZSBjdXJyZW50IGl0ZW0sIHRoZQotY3VycmVudCBpdGVtIHdpbGwgYmUgdHJlYXRlZCBhZ2FpbiB0aGUgbmV4dCB0aW1lIHRocm91Z2ggdGhlIGxvb3AuCi1UaGlzIGNhbiBsZWFkIHRvIG5hc3R5IGJ1Z3MgdGhhdCBjYW4gYmUgYXZvaWRlZCBieSBtYWtpbmcgYSB0ZW1wb3JhcnkKLWNvcHkgdXNpbmcgYSBzbGljZSBvZiB0aGUgd2hvbGUgc2VxdWVuY2UsIGUuZy4sCi1caW5kZXh7bG9vcCFvdmVyIG11dGFibGUgc2VxdWVuY2V9Ci1caW5kZXh7bXV0YWJsZSBzZXF1ZW5jZSFsb29wIG92ZXJ9fQotCi1cYmVnaW57dmVyYmF0aW19Ci1mb3IgeCBpbiBhWzpdOgotICAgIGlmIHggPCAwOiBhLnJlbW92ZSh4KQotXGVuZHt2ZXJiYXRpbX0KLQotCi1cc2VjdGlvbntUaGUgXGtleXdvcmR7dHJ5fSBzdGF0ZW1lbnRcbGFiZWx7dHJ5fX0KLVxzdGluZGV4e3RyeX0KLQotVGhlIFxrZXl3b3Jke3RyeX0gc3RhdGVtZW50IHNwZWNpZmllcyBleGNlcHRpb24gaGFuZGxlcnMgYW5kL29yIGNsZWFudXAKLWNvZGUgZm9yIGEgZ3JvdXAgb2Ygc3RhdGVtZW50czoKLQotXGJlZ2lue3Byb2R1Y3Rpb25saXN0fQotICBccHJvZHVjdGlvbnt0cnlfc3RtdH0ge3RyeTFfc3RtdCB8IHRyeTJfc3RtdH0KLSAgXHByb2R1Y3Rpb257dHJ5MV9zdG10fQotICAgICAgICAgICAgIHsidHJ5IiAiOiIgXHRva2Vue3N1aXRlfX0KLSAgXHByb2R1Y3Rpb25jb250eygiZXhjZXB0IiBbXHRva2Vue2V4cHJlc3Npb259Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiLCIgXHRva2Vue3RhcmdldH1dXSAiOiIgXHRva2Vue3N1aXRlfSkrfQotICBccHJvZHVjdGlvbmNvbnR7WyJlbHNlIiAiOiIgXHRva2Vue3N1aXRlfV19Ci0gIFxwcm9kdWN0aW9uY29udHtbImZpbmFsbHkiICI6IiBcdG9rZW57c3VpdGV9XX0KLSAgXHByb2R1Y3Rpb257dHJ5Ml9zdG10fQotICAgICAgICAgICAgIHsidHJ5IiAiOiIgXHRva2Vue3N1aXRlfX0KLSAgXHByb2R1Y3Rpb25jb250eyJmaW5hbGx5IiAiOiIgXHRva2Vue3N1aXRlfX0KLVxlbmR7cHJvZHVjdGlvbmxpc3R9Ci0KLVx2ZXJzaW9uY2hhbmdlZFtJbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBQeXRob24sCi1ca2V5d29yZHt0cnl9Li4uXGtleXdvcmR7ZXhjZXB0fS4uLlxrZXl3b3Jke2ZpbmFsbHl9IGRpZCBub3Qgd29yay4KLVxrZXl3b3Jke3RyeX0uLi5ca2V5d29yZHtleGNlcHR9IGhhZCB0byBiZSBuZXN0ZWQgaW4KLVxrZXl3b3Jke3RyeX0uLi5ca2V5d29yZHtmaW5hbGx5fV17Mi41fQotCi1UaGUgXGtleXdvcmR7ZXhjZXB0fSBjbGF1c2Uocykgc3BlY2lmeSBvbmUgb3IgbW9yZSBleGNlcHRpb24gaGFuZGxlcnMuCi1XaGVuIG5vIGV4Y2VwdGlvbiBvY2N1cnMgaW4gdGhlCi1ca2V5d29yZHt0cnl9IGNsYXVzZSwgbm8gZXhjZXB0aW9uIGhhbmRsZXIgaXMgZXhlY3V0ZWQuICBXaGVuIGFuCi1leGNlcHRpb24gb2NjdXJzIGluIHRoZSBca2V5d29yZHt0cnl9IHN1aXRlLCBhIHNlYXJjaCBmb3IgYW4gZXhjZXB0aW9uCi1oYW5kbGVyIGlzIHN0YXJ0ZWQuICBUaGlzIHNlYXJjaCBpbnNwZWN0cyB0aGUgZXhjZXB0IGNsYXVzZXMgaW4gdHVybiB1bnRpbAotb25lIGlzIGZvdW5kIHRoYXQgbWF0Y2hlcyB0aGUgZXhjZXB0aW9uLiAgQW4gZXhwcmVzc2lvbi1sZXNzIGV4Y2VwdAotY2xhdXNlLCBpZiBwcmVzZW50LCBtdXN0IGJlIGxhc3Q7IGl0IG1hdGNoZXMgYW55IGV4Y2VwdGlvbi4gIEZvciBhbgotZXhjZXB0IGNsYXVzZSB3aXRoIGFuIGV4cHJlc3Npb24sIHRoYXQgZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQsIGFuZCB0aGUKLWNsYXVzZSBtYXRjaGVzIHRoZSBleGNlcHRpb24gaWYgdGhlIHJlc3VsdGluZyBvYmplY3QgaXMgYGBjb21wYXRpYmxlJycKLXdpdGggdGhlIGV4Y2VwdGlvbi4gIEFuIG9iamVjdCBpcyBjb21wYXRpYmxlIHdpdGggYW4gZXhjZXB0aW9uIGlmIGl0Ci1pcyB0aGUgY2xhc3Mgb3IgYSBiYXNlIGNsYXNzIG9mIHRoZSBleGNlcHRpb24gb2JqZWN0LCBhIHR1cGxlCi1jb250YWluaW5nIGFuIGl0ZW0gY29tcGF0aWJsZSB3aXRoIHRoZSBleGNlcHRpb24sIG9yLCBpbiB0aGUKLShkZXByZWNhdGVkKSBjYXNlIG9mIHN0cmluZyBleGNlcHRpb25zLCBpcyB0aGUgcmFpc2VkIHN0cmluZyBpdHNlbGYKLShub3RlIHRoYXQgdGhlIG9iamVjdCBpZGVudGl0aWVzIG11c3QgbWF0Y2gsIGkuZS4gaXQgbXVzdCBiZSB0aGUgc2FtZQotc3RyaW5nIG9iamVjdCwgbm90IGp1c3QgYSBzdHJpbmcgd2l0aCB0aGUgc2FtZSB2YWx1ZSkuCi1ca3dpbmRleHtleGNlcHR9Ci0KLUlmIG5vIGV4Y2VwdCBjbGF1c2UgbWF0Y2hlcyB0aGUgZXhjZXB0aW9uLCB0aGUgc2VhcmNoIGZvciBhbiBleGNlcHRpb24KLWhhbmRsZXIgY29udGludWVzIGluIHRoZSBzdXJyb3VuZGluZyBjb2RlIGFuZCBvbiB0aGUgaW52b2NhdGlvbiBzdGFjay4KLVxmb290bm90ZXtUaGUgZXhjZXB0aW9uIGlzIHByb3BvZ2F0ZWQgdG8gdGhlIGludm9jYXRpb24gc3RhY2sgb25seSBpZgotdGhlcmUgaXMgbm8gXGtleXdvcmR7ZmluYWxseX0gY2xhdXNlIHRoYXQgbmVnYXRlcyB0aGUgZXhjZXB0aW9uLn0KLQotSWYgdGhlIGV2YWx1YXRpb24gb2YgYW4gZXhwcmVzc2lvbiBpbiB0aGUgaGVhZGVyIG9mIGFuIGV4Y2VwdCBjbGF1c2UKLXJhaXNlcyBhbiBleGNlcHRpb24sIHRoZSBvcmlnaW5hbCBzZWFyY2ggZm9yIGEgaGFuZGxlciBpcyBjYW5jZWxlZAotYW5kIGEgc2VhcmNoIHN0YXJ0cyBmb3IgdGhlIG5ldyBleGNlcHRpb24gaW4gdGhlIHN1cnJvdW5kaW5nIGNvZGUgYW5kCi1vbiB0aGUgY2FsbCBzdGFjayAoaXQgaXMgdHJlYXRlZCBhcyBpZiB0aGUgZW50aXJlIFxrZXl3b3Jke3RyeX0gc3RhdGVtZW50Ci1yYWlzZWQgdGhlIGV4Y2VwdGlvbikuCi0KLVdoZW4gYSBtYXRjaGluZyBleGNlcHQgY2xhdXNlIGlzIGZvdW5kLCB0aGUgZXhjZXB0aW9uIGlzIGFzc2lnbmVkIHRvCi10aGUgdGFyZ2V0IHNwZWNpZmllZCBpbiB0aGF0IGV4Y2VwdCBjbGF1c2UsIGlmIHByZXNlbnQsIGFuZCB0aGUgZXhjZXB0Ci1jbGF1c2UncyBzdWl0ZSBpcyBleGVjdXRlZC4gIEFsbCBleGNlcHQgY2xhdXNlcyBtdXN0IGhhdmUgYW4KLWV4ZWN1dGFibGUgYmxvY2suICBXaGVuIHRoZSBlbmQgb2YgdGhpcyBibG9jayBpcyByZWFjaGVkLCBleGVjdXRpb24KLWNvbnRpbnVlcyBub3JtYWxseSBhZnRlciB0aGUgZW50aXJlIHRyeSBzdGF0ZW1lbnQuICAoVGhpcyBtZWFucyB0aGF0Ci1pZiB0d28gbmVzdGVkIGhhbmRsZXJzIGV4aXN0IGZvciB0aGUgc2FtZSBleGNlcHRpb24sIGFuZCB0aGUgZXhjZXB0aW9uCi1vY2N1cnMgaW4gdGhlIHRyeSBjbGF1c2Ugb2YgdGhlIGlubmVyIGhhbmRsZXIsIHRoZSBvdXRlciBoYW5kbGVyIHdpbGwKLW5vdCBoYW5kbGUgdGhlIGV4Y2VwdGlvbi4pCi0KLUJlZm9yZSBhbiBleGNlcHQgY2xhdXNlJ3Mgc3VpdGUgaXMgZXhlY3V0ZWQsIGRldGFpbHMgYWJvdXQgdGhlCi1leGNlcHRpb24gYXJlIHN0b3JlZCBpbiB0aGUgXG1vZHVsZXtzeXN9XHJlZmJpbW9kaW5kZXh7c3lzfSBtb2R1bGUKLWFuZCBjYW4gYmUgYWNjZXNzIHZpYSBcZnVuY3Rpb257c3lzLmV4Y19pbmZvKCl9LiBcZnVuY3Rpb257c3lzLmV4Y19pbmZvKCl9Ci1yZXR1cm5zIGEgMy10dXBsZSBjb25zaXN0aW5nIG9mOiBcY29kZXtleGNfdHlwZX0gcmVjZWl2ZXMKLXRoZSBvYmplY3QgaWRlbnRpZnlpbmcgdGhlIGV4Y2VwdGlvbjsgXGNvZGV7ZXhjX3ZhbHVlfSByZWNlaXZlcwotdGhlIGV4Y2VwdGlvbidzIHBhcmFtZXRlcjsgXGNvZGV7ZXhjX3RyYWNlYmFja30gcmVjZWl2ZXMgYQotdHJhY2ViYWNrIG9iamVjdFxvYmluZGV4e3RyYWNlYmFja30gKHNlZSBzZWN0aW9uflxyZWZ7dHJhY2ViYWNrfSkKLWlkZW50aWZ5aW5nIHRoZSBwb2ludCBpbiB0aGUgcHJvZ3JhbSB3aGVyZSB0aGUgZXhjZXB0aW9uIG9jY3VycmVkLgotXGZ1bmN0aW9ue3N5cy5leGNfaW5mbygpfSB2YWx1ZXMgYXJlIHJlc3RvcmVkIHRvIHRoZWlyIHByZXZpb3VzIHZhbHVlcwotKGJlZm9yZSB0aGUgY2FsbCkgd2hlbiByZXR1cm5pbmcgZnJvbSBhIGZ1bmN0aW9uIHRoYXQgaGFuZGxlZCBhbiBleGNlcHRpb24uCi0KLVRoZSBvcHRpb25hbCBca2V5d29yZHtlbHNlfSBjbGF1c2UgaXMgZXhlY3V0ZWQgaWYgYW5kIHdoZW4gY29udHJvbAotZmxvd3Mgb2ZmIHRoZSBlbmQgb2YgdGhlIFxrZXl3b3Jke3RyeX0gY2xhdXNlLlxmb290bm90ZXsKLSAgQ3VycmVudGx5LCBjb250cm9sIGBgZmxvd3Mgb2ZmIHRoZSBlbmQnJyBleGNlcHQgaW4gdGhlIGNhc2Ugb2YgYW4KLSAgZXhjZXB0aW9uIG9yIHRoZSBleGVjdXRpb24gb2YgYSBca2V5d29yZHtyZXR1cm59LAotICBca2V5d29yZHtjb250aW51ZX0sIG9yIFxrZXl3b3Jke2JyZWFrfSBzdGF0ZW1lbnQuCi19IEV4Y2VwdGlvbnMgaW4gdGhlIFxrZXl3b3Jke2Vsc2V9IGNsYXVzZSBhcmUgbm90IGhhbmRsZWQgYnkgdGhlCi1wcmVjZWRpbmcgXGtleXdvcmR7ZXhjZXB0fSBjbGF1c2VzLgotXGt3aW5kZXh7ZWxzZX0KLVxzdGluZGV4e3JldHVybn0KLVxzdGluZGV4e2JyZWFrfQotXHN0aW5kZXh7Y29udGludWV9Ci0KLUlmIFxrZXl3b3Jke2ZpbmFsbHl9IGlzIHByZXNlbnQsIGl0IHNwZWNpZmllcyBhIGBjbGVhbnVwJyBoYW5kbGVyLiAgVGhlCi1ca2V5d29yZHt0cnl9IGNsYXVzZSBpcyBleGVjdXRlZCwgaW5jbHVkaW5nIGFueSBca2V5d29yZHtleGNlcHR9IGFuZAotXGtleXdvcmR7ZWxzZX0gY2xhdXNlcy4gIElmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgaW4gYW55IG9mIHRoZSBjbGF1c2VzCi1hbmQgaXMgbm90IGhhbmRsZWQsIHRoZSBleGNlcHRpb24gaXMgdGVtcG9yYXJpbHkgc2F2ZWQuIFRoZQotXGtleXdvcmR7ZmluYWxseX0gY2xhdXNlIGlzIGV4ZWN1dGVkLiAgSWYgdGhlcmUgaXMgYSBzYXZlZCBleGNlcHRpb24sCi1pdCBpcyByZS1yYWlzZWQgYXQgdGhlIGVuZCBvZiB0aGUgXGtleXdvcmR7ZmluYWxseX0gY2xhdXNlLgotSWYgdGhlIFxrZXl3b3Jke2ZpbmFsbHl9IGNsYXVzZSByYWlzZXMgYW5vdGhlciBleGNlcHRpb24gb3IKLWV4ZWN1dGVzIGEgXGtleXdvcmR7cmV0dXJufSBvciBca2V5d29yZHticmVha30gc3RhdGVtZW50LCB0aGUgc2F2ZWQKLWV4Y2VwdGlvbiBpcyBsb3N0LiAgVGhlIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIHRvIHRoZQotcHJvZ3JhbSBkdXJpbmcgZXhlY3V0aW9uIG9mIHRoZSBca2V5d29yZHtmaW5hbGx5fSBjbGF1c2UuCi1ca3dpbmRleHtmaW5hbGx5fQotCi1XaGVuIGEgXGtleXdvcmR7cmV0dXJufSwgXGtleXdvcmR7YnJlYWt9IG9yIFxrZXl3b3Jke2NvbnRpbnVlfSBzdGF0ZW1lbnQgaXMKLWV4ZWN1dGVkIGluIHRoZSBca2V5d29yZHt0cnl9IHN1aXRlIG9mIGEgXGtleXdvcmR7dHJ5fS4uLlxrZXl3b3Jke2ZpbmFsbHl9Ci1zdGF0ZW1lbnQsIHRoZSBca2V5d29yZHtmaW5hbGx5fSBjbGF1c2UgaXMgYWxzbyBleGVjdXRlZCBgb24gdGhlIHdheSBvdXQuJyBBCi1ca2V5d29yZHtjb250aW51ZX0gc3RhdGVtZW50IGlzIGlsbGVnYWwgaW4gdGhlIFxrZXl3b3Jke2ZpbmFsbHl9IGNsYXVzZS4KLShUaGUgcmVhc29uIGlzIGEgcHJvYmxlbSB3aXRoIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIC0tLSB0aGlzCi1yZXN0cmljdGlvbiBtYXkgYmUgbGlmdGVkIGluIHRoZSBmdXR1cmUpLgotXHN0aW5kZXh7cmV0dXJufQotXHN0aW5kZXh7YnJlYWt9Ci1cc3RpbmRleHtjb250aW51ZX0KLQotQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBleGNlcHRpb25zIGNhbiBiZSBmb3VuZCBpbgotc2VjdGlvbn5ccmVme2V4Y2VwdGlvbnN9LCBhbmQgaW5mb3JtYXRpb24gb24gdXNpbmcgdGhlIFxrZXl3b3Jke3JhaXNlfQotc3RhdGVtZW50IHRvIGdlbmVyYXRlIGV4Y2VwdGlvbnMgbWF5IGJlIGZvdW5kIGluIHNlY3Rpb25+XHJlZntyYWlzZX0uCi0KLQotXHNlY3Rpb257VGhlIFxrZXl3b3Jke3dpdGh9IHN0YXRlbWVudFxsYWJlbHt3aXRofX0KLVxzdGluZGV4e3dpdGh9Ci0KLVx2ZXJzaW9uYWRkZWR7Mi41fQotCi1UaGUgXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50IGlzIHVzZWQgdG8gd3JhcCB0aGUgZXhlY3V0aW9uIG9mIGEgYmxvY2sKLXdpdGggbWV0aG9kcyBkZWZpbmVkIGJ5IGEgY29udGV4dCBtYW5hZ2VyIChzZWUKLXNlY3Rpb25+XHJlZntjb250ZXh0LW1hbmFnZXJzfSkuIFRoaXMgYWxsb3dzIGNvbW1vbgotXGtleXdvcmR7dHJ5fS4uLlxrZXl3b3Jke2V4Y2VwdH0uLi5ca2V5d29yZHtmaW5hbGx5fSB1c2FnZSBwYXR0ZXJucyB0bwotYmUgZW5jYXBzdWxhdGVkIGZvciBjb252ZW5pZW50IHJldXNlLgotCi1cYmVnaW57cHJvZHVjdGlvbmxpc3R9Ci0gIFxwcm9kdWN0aW9ue3dpdGhfc3RtdH0KLSAgeyJ3aXRoIiBcdG9rZW57ZXhwcmVzc2lvbn0gWyJhcyIgXHRva2Vue3RhcmdldH1dICI6IiBcdG9rZW57c3VpdGV9fQotXGVuZHtwcm9kdWN0aW9ubGlzdH0KLQotVGhlIGV4ZWN1dGlvbiBvZiB0aGUgXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50IHByb2NlZWRzIGFzIGZvbGxvd3M6Ci0KLVxiZWdpbntlbnVtZXJhdGV9Ci0KLVxpdGVtIFRoZSBjb250ZXh0IGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkIHRvIG9idGFpbiBhIGNvbnRleHQgbWFuYWdlci4KLQotXGl0ZW0gVGhlIGNvbnRleHQgbWFuYWdlcidzIFxtZXRob2R7X19lbnRlcl9fKCl9IG1ldGhvZCBpcyBpbnZva2VkLgotCi1caXRlbSBJZiBhIHRhcmdldCB3YXMgaW5jbHVkZWQgaW4gdGhlIFxrZXl3b3Jke3dpdGh9Ci1zdGF0ZW1lbnQsIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBcbWV0aG9ke19fZW50ZXJfXygpfSBpcyBhc3NpZ25lZCB0byBpdC4KLQotXG5vdGV7VGhlIFxrZXl3b3Jke3dpdGh9IHN0YXRlbWVudCBndWFyYW50ZWVzIHRoYXQgaWYgdGhlCi1cbWV0aG9ke19fZW50ZXJfXygpfSBtZXRob2QgcmV0dXJucyB3aXRob3V0IGFuIGVycm9yLCB0aGVuCi1cbWV0aG9ke19fZXhpdF9fKCl9IHdpbGwgYWx3YXlzIGJlIGNhbGxlZC4gVGh1cywgaWYgYW4gZXJyb3Igb2NjdXJzCi1kdXJpbmcgdGhlIGFzc2lnbm1lbnQgdG8gdGhlIHRhcmdldCBsaXN0LCBpdCB3aWxsIGJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMKLWFuIGVycm9yIG9jY3VycmluZyB3aXRoaW4gdGhlIHN1aXRlIHdvdWxkIGJlLiBTZWUgc3RlcCA1IGJlbG93Ln0KLQotXGl0ZW0gVGhlIHN1aXRlIGlzIGV4ZWN1dGVkLgotCi1caXRlbSBUaGUgY29udGV4dCBtYW5hZ2VyJ3MgXG1ldGhvZHtfX2V4aXRfXygpfSBtZXRob2QgaXMgaW52b2tlZC4gSWYKLWFuIGV4Y2VwdGlvbiBjYXVzZWQgdGhlIHN1aXRlIHRvIGJlIGV4aXRlZCwgaXRzIHR5cGUsIHZhbHVlLCBhbmQKLXRyYWNlYmFjayBhcmUgcGFzc2VkIGFzIGFyZ3VtZW50cyB0byBcbWV0aG9ke19fZXhpdF9fKCl9LiBPdGhlcndpc2UsCi10aHJlZSBcY29uc3RhbnR7Tm9uZX0gYXJndW1lbnRzIGFyZSBzdXBwbGllZC4KLQotSWYgdGhlIHN1aXRlIHdhcyBleGl0ZWQgZHVlIHRvIGFuIGV4Y2VwdGlvbiwgYW5kIHRoZSByZXR1cm4KLXZhbHVlIGZyb20gdGhlIFxtZXRob2R7X19leGl0X18oKX0gbWV0aG9kIHdhcyBmYWxzZSwgdGhlIGV4Y2VwdGlvbiBpcwotcmVyYWlzZWQuIElmIHRoZSByZXR1cm4gdmFsdWUgd2FzIHRydWUsIHRoZSBleGNlcHRpb24gaXMgc3VwcHJlc3NlZCwgYW5kCi1leGVjdXRpb24gY29udGludWVzIHdpdGggdGhlIHN0YXRlbWVudCBmb2xsb3dpbmcgdGhlIFxrZXl3b3Jke3dpdGh9Ci1zdGF0ZW1lbnQuCi0KLUlmIHRoZSBzdWl0ZSB3YXMgZXhpdGVkIGZvciBhbnkgcmVhc29uIG90aGVyIHRoYW4gYW4gZXhjZXB0aW9uLCB0aGUKLXJldHVybiB2YWx1ZSBmcm9tIFxtZXRob2R7X19leGl0X18oKX0gaXMgaWdub3JlZCwgYW5kIGV4ZWN1dGlvbiBwcm9jZWVkcwotYXQgdGhlIG5vcm1hbCBsb2NhdGlvbiBmb3IgdGhlIGtpbmQgb2YgZXhpdCB0aGF0IHdhcyB0YWtlbi4KLQotXGVuZHtlbnVtZXJhdGV9Ci0KLVxiZWdpbntub3RpY2V9Ci1JbiBQeXRob24gMi41LCB0aGUgXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50IGlzIG9ubHkgYWxsb3dlZAotd2hlbiB0aGUgXGNvZGV7d2l0aF9zdGF0ZW1lbnR9IGZlYXR1cmUgaGFzIGJlZW4gZW5hYmxlZC4gIEl0IHdpbGwgYWx3YXlzCi1iZSBlbmFibGVkIGluIFB5dGhvbiAyLjYuICBUaGlzIFxjb2Rle19fZnV0dXJlX199IGltcG9ydCBzdGF0ZW1lbnQgY2FuCi1iZSB1c2VkIHRvIGVuYWJsZSB0aGUgZmVhdHVyZToKLQotXGJlZ2lue3ZlcmJhdGltfQotZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB3aXRoX3N0YXRlbWVudAotXGVuZHt2ZXJiYXRpbX0KLVxlbmR7bm90aWNlfQotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZXBlcHswMzQzfXtUaGUgIndpdGgiIHN0YXRlbWVudH0KLSAgICAgICAgIHtUaGUgc3BlY2lmaWNhdGlvbiwgYmFja2dyb3VuZCwgYW5kIGV4YW1wbGVzIGZvciB0aGUKLSAgICAgICAgICBQeXRob24gXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50Ln0KLVxlbmR7c2VlYWxzb30KLQotXHNlY3Rpb257RnVuY3Rpb24gZGVmaW5pdGlvbnNcbGFiZWx7ZnVuY3Rpb259fQotXGluZGV4aWl7ZnVuY3Rpb259e2RlZmluaXRpb259Ci1cc3RpbmRleHtkZWZ9Ci0KLUEgZnVuY3Rpb24gZGVmaW5pdGlvbiBkZWZpbmVzIGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIG9iamVjdCAoc2VlCi1zZWN0aW9uflxyZWZ7dHlwZXN9KToKLVxvYmluZGV4e3VzZXItZGVmaW5lZCBmdW5jdGlvbn0KLVxvYmluZGV4e2Z1bmN0aW9ufQotCi1cYmVnaW57cHJvZHVjdGlvbmxpc3R9Ci0gIFxwcm9kdWN0aW9ue2Z1bmNkZWZ9Ci0gICAgICAgICAgICAge1tcdG9rZW57ZGVjb3JhdG9yc31dICJkZWYiIFx0b2tlbntmdW5jbmFtZX0gIigiIFtcdG9rZW57cGFyYW1ldGVyX2xpc3R9XSAiKSIKLSAgICAgICAgICAgICAgWyItPiIgXHRva2Vue2V4cHJlc3Npb259XT8KLSAgICAgICAgICAgICAgIjoiIFx0b2tlbntzdWl0ZX19Ci0gIFxwcm9kdWN0aW9ue2RlY29yYXRvcnN9Ci0gICAgICAgICAgICAge1x0b2tlbntkZWNvcmF0b3J9K30KLSAgXHByb2R1Y3Rpb257ZGVjb3JhdG9yfQotICAgICAgICAgICAgIHsiQCIgXHRva2Vue2RvdHRlZF9uYW1lfSBbIigiIFtcdG9rZW57YXJndW1lbnRfbGlzdH0gWyIsIl1dICIpIl0gTkVXTElORX0KLSAgXHByb2R1Y3Rpb257ZG90dGVkX25hbWV9Ci0gICAgICAgICAgICAge1x0b2tlbntpZGVudGlmaWVyfSAoIi4iIFx0b2tlbntpZGVudGlmaWVyfSkqfQotICBccHJvZHVjdGlvbntwYXJhbWV0ZXJfbGlzdH0KLSAgICAgICAgICAgICAgICAgeyhcdG9rZW57ZGVmcGFyYW1ldGVyfSAiLCIpKn0KLSAgXHByb2R1Y3Rpb25jb250eyh+fiIqIiBbXHRva2Vue3BhcmFtZXRlcn1dICgiLCIgXHRva2Vue2RlZnBhcmFtZXRlcn0pKn0KLSAgXHByb2R1Y3Rpb25jb250eyAgIFssICIqKiIgXHRva2Vue3BhcmFtZXRlcn1dfQotICBccHJvZHVjdGlvbmNvbnR7IHwgIioqIiBcdG9rZW57cGFyYW1ldGVyfX0KLSAgXHByb2R1Y3Rpb25jb250eyB8IFx0b2tlbntkZWZwYXJhbWV0ZXJ9IFsiLCJdICl9Ci0gIFxwcm9kdWN0aW9ue3BhcmFtZXRlcn0KLSAgICAgICAgICAgICB7XHRva2Vue2lkZW50aWZpZXJ9IFsiOiIgXHRva2Vue2V4cHJlc3Npb259XX0KLSAgXHByb2R1Y3Rpb257ZGVmcGFyYW1ldGVyfQotICAgICAgICAgICAgIHtcdG9rZW57cGFyYW1ldGVyfSBbIj0iIFx0b2tlbntleHByZXNzaW9ufV19Ci0gIFxwcm9kdWN0aW9ue2Z1bmNuYW1lfQotICAgICAgICAgICAgIHtcdG9rZW57aWRlbnRpZmllcn19Ci1cZW5ke3Byb2R1Y3Rpb25saXN0fQotCi1BIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMgYW4gZXhlY3V0YWJsZSBzdGF0ZW1lbnQuICBJdHMgZXhlY3V0aW9uIGJpbmRzCi10aGUgZnVuY3Rpb24gbmFtZSBpbiB0aGUgY3VycmVudCBsb2NhbCBuYW1lc3BhY2UgdG8gYSBmdW5jdGlvbiBvYmplY3QKLShhIHdyYXBwZXIgYXJvdW5kIHRoZSBleGVjdXRhYmxlIGNvZGUgZm9yIHRoZSBmdW5jdGlvbikuICBUaGlzCi1mdW5jdGlvbiBvYmplY3QgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsIG5hbWVzcGFjZQotYXMgdGhlIGdsb2JhbCBuYW1lc3BhY2UgdG8gYmUgdXNlZCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuCi1caW5kZXhpaXtmdW5jdGlvbn17bmFtZX0KLVxpbmRleGlpe25hbWV9e2JpbmRpbmd9Ci0KLVRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGRvZXMgbm90IGV4ZWN1dGUgdGhlIGZ1bmN0aW9uIGJvZHk7IHRoaXMgZ2V0cwotZXhlY3V0ZWQgb25seSB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuCi0KLUEgZnVuY3Rpb24gZGVmaW5pdGlvbiBtYXkgYmUgd3JhcHBlZCBieSBvbmUgb3IgbW9yZSBkZWNvcmF0b3IgZXhwcmVzc2lvbnMuCi1EZWNvcmF0b3IgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBkZWZpbmVkLCBpbiB0aGUgc2NvcGUKLXRoYXQgY29udGFpbnMgdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24uICBUaGUgcmVzdWx0IG11c3QgYmUgYSBjYWxsYWJsZSwKLXdoaWNoIGlzIGludm9rZWQgd2l0aCB0aGUgZnVuY3Rpb24gb2JqZWN0IGFzIHRoZSBvbmx5IGFyZ3VtZW50LgotVGhlIHJldHVybmVkIHZhbHVlIGlzIGJvdW5kIHRvIHRoZSBmdW5jdGlvbiBuYW1lIGluc3RlYWQgb2YgdGhlIGZ1bmN0aW9uCi1vYmplY3QuICBNdWx0aXBsZSBkZWNvcmF0b3JzIGFyZSBhcHBsaWVkIGluIG5lc3RlZCBmYXNoaW9uLgotRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZToKLQotXGJlZ2lue3ZlcmJhdGltfQotQGYxKGFyZykKLUBmMgotZGVmIGZ1bmMoKTogcGFzcwotXGVuZHt2ZXJiYXRpbX0KLQotaXMgZXF1aXZhbGVudCB0bzoKLQotXGJlZ2lue3ZlcmJhdGltfQotZGVmIGZ1bmMoKTogcGFzcwotZnVuYyA9IGYxKGFyZykoZjIoZnVuYykpCi1cZW5ke3ZlcmJhdGltfQotCi1XaGVuIG9uZSBvciBtb3JlIHBhcmFtZXRlcnMgaGF2ZSB0aGUgZm9ybSBcdmFye3BhcmFtZXRlcn0KLVxjb2Rlez19IFx2YXJ7ZXhwcmVzc2lvbn0sIHRoZSBmdW5jdGlvbiBpcyBzYWlkIHRvIGhhdmUgYGBkZWZhdWx0Ci1wYXJhbWV0ZXIgdmFsdWVzLicnICBGb3IgYSBwYXJhbWV0ZXIgd2l0aCBhCi1kZWZhdWx0IHZhbHVlLCB0aGUgY29ycmVzcG9uZGluZyBhcmd1bWVudCBtYXkgYmUgb21pdHRlZCBmcm9tIGEgY2FsbCwKLWluIHdoaWNoIGNhc2UgdGhlIHBhcmFtZXRlcidzIGRlZmF1bHQgdmFsdWUgaXMgc3Vic3RpdHV0ZWQuICBJZiBhCi1wYXJhbWV0ZXIgaGFzIGEgZGVmYXVsdCB2YWx1ZSwgYWxsIGZvbGxvd2luZyBwYXJhbWV0ZXJzIHVwIHVudGlsIHRoZSAKLWBgXGNvZGV7Kn0nJyBtdXN0IGFsc28gaGF2ZSBhIGRlZmF1bHQgdmFsdWUgLS0tIHRoaXMgaXMgYSBzeW50YWN0aWMgCi1yZXN0cmljdGlvbiB0aGF0IGlzIG5vdCBleHByZXNzZWQgYnkgdGhlIGdyYW1tYXIuCi1caW5kZXhpaWl7ZGVmYXVsdH17cGFyYW1ldGVyfXt2YWx1ZX0KLQotXHN0cm9uZ3tEZWZhdWx0IHBhcmFtZXRlciB2YWx1ZXMgYXJlIGV2YWx1YXRlZCB3aGVuIHRoZSBmdW5jdGlvbgotZGVmaW5pdGlvbiBpcyBleGVjdXRlZC59ICBUaGlzIG1lYW5zIHRoYXQgdGhlIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkCi1vbmNlLCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBkZWZpbmVkLCBhbmQgdGhhdCB0aGF0IHNhbWUKLWBgcHJlLWNvbXB1dGVkJycgdmFsdWUgaXMgdXNlZCBmb3IgZWFjaCBjYWxsLiAgVGhpcyBpcyBlc3BlY2lhbGx5Ci1pbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCB3aGVuIGEgZGVmYXVsdCBwYXJhbWV0ZXIgaXMgYSBtdXRhYmxlIG9iamVjdCwKLXN1Y2ggYXMgYSBsaXN0IG9yIGEgZGljdGlvbmFyeTogaWYgdGhlIGZ1bmN0aW9uIG1vZGlmaWVzIHRoZSBvYmplY3QKLShlLmcuIGJ5IGFwcGVuZGluZyBhbiBpdGVtIHRvIGEgbGlzdCksIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGluIGVmZmVjdAotbW9kaWZpZWQuICBUaGlzIGlzIGdlbmVyYWxseSBub3Qgd2hhdCB3YXMgaW50ZW5kZWQuICBBIHdheSBhcm91bmQgdGhpcyAKLWlzIHRvIHVzZSBcY29kZXtOb25lfSBhcyB0aGUgZGVmYXVsdCwgYW5kIGV4cGxpY2l0bHkgdGVzdCBmb3IgaXQgaW4KLXRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbiwgZS5nLjoKLQotXGJlZ2lue3ZlcmJhdGltfQotZGVmIHdoYXRzX29uX3RoZV90ZWxseShwZW5ndWluPU5vbmUpOgotICAgIGlmIHBlbmd1aW4gaXMgTm9uZToKLSAgICAgICAgcGVuZ3VpbiA9IFtdCi0gICAgcGVuZ3Vpbi5hcHBlbmQoInByb3BlcnR5IG9mIHRoZSB6b28iKQotICAgIHJldHVybiBwZW5ndWluCi1cZW5ke3ZlcmJhdGltfQotCi1GdW5jdGlvbiBjYWxsIHNlbWFudGljcyBhcmUgZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsIGluCi1zZWN0aW9uflxyZWZ7Y2FsbHN9LgotQSBmdW5jdGlvbiBjYWxsIGFsd2F5cyBhc3NpZ25zIHZhbHVlcyB0byBhbGwgcGFyYW1ldGVycyBtZW50aW9uZWQgaW4KLXRoZSBwYXJhbWV0ZXIgbGlzdCwgZWl0aGVyIGZyb20gcG9zaXRpb24gYXJndW1lbnRzLCBmcm9tIGtleXdvcmQKLWFyZ3VtZW50cywgb3IgZnJvbSBkZWZhdWx0IHZhbHVlcy4gIElmIHRoZSBmb3JtIGBgXGNvZGV7KmlkZW50aWZpZXJ9JycKLWlzIHByZXNlbnQsIGl0IGlzIGluaXRpYWxpemVkIHRvIGEgdHVwbGUgcmVjZWl2aW5nIGFueSBleGNlc3MKLXBvc2l0aW9uYWwgcGFyYW1ldGVycywgZGVmYXVsdGluZyB0byB0aGUgZW1wdHkgdHVwbGUuICBJZiB0aGUgZm9ybQotYGBcY29kZXsqKmlkZW50aWZpZXJ9JycgaXMgcHJlc2VudCwgaXQgaXMgaW5pdGlhbGl6ZWQgdG8gYSBuZXcKLWRpY3Rpb25hcnkgcmVjZWl2aW5nIGFueSBleGNlc3Mga2V5d29yZCBhcmd1bWVudHMsIGRlZmF1bHRpbmcgdG8gYQotbmV3IGVtcHR5IGRpY3Rpb25hcnkuIFBhcmFtZXRlcnMgYWZ0ZXIgYGBcY29kZXsqfScnIG9yIGBgXGNvZGV7KmlkZW50aWZpZXJ9JycKLWFyZSBrZXl3b3JkLW9ubHkgcGFyYW1ldGVycyBhbmQgbWF5IG9ubHkgYmUgcGFzc2VkIHVzZWQga2V5d29yZCBhcmd1bWVudHMuCi0KLVBhcmFtZXRlcnMgbWF5IGhhdmUgYW5ub3RhdGlvbnMgb2YgdGhlIGZvcm0gYGBcY29kZXs6IGV4cHJlc3Npb259JycKLWZvbGxvd2luZyB0aGUgcGFyYW1ldGVyIG5hbWUuIEFueSBwYXJhbWV0ZXIgbWF5IGhhdmUgYW4gYW5ub3RhdGlvbiBldmVuCi10aG9zZSBvZiB0aGUgZm9ybSBcY29kZXsqaWRlbnRpZmllcn0gb3IgXGNvZGV7KippZGVudGlmaWVyfS4KLUZ1bmN0aW9ucyBtYXkgaGF2ZSBgYHJldHVybicnIGFubm90YXRpb24gb2YgdGhlIGZvcm0gYGBcY29kZXstPiBleHByZXNzaW9ufScnCi1hZnRlciB0aGUgcGFyYW1ldGVyIGxpc3QuIFRoZXNlIGFubm90YXRpb25zIGNhbiBiZSBhbnkgdmFsaWQgUHl0aG9uCi1leHByZXNzaW9uIGFuZCBhcmUgZXZhbHVhdGVkIHdoZW4gdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMgZXhlY3V0ZWQuCi1Bbm5vdGF0aW9ucyBtYXkgYmUgZXZhbHVhdGVkIGluIGEgZGlmZmVyZW50IG9yZGVyIHRoYW4gdGhleSBhcHBlYXIgaW4gdGhlCi1zb3VyY2UgY29kZS4gVGhlIHByZXNlbmNlIG9mIGFubm90YXRpb25zIGRvZXMgbm90IGNoYW5nZSB0aGUgc2VtYW50aWNzIG9mIGEKLWZ1bmN0aW9uLiBUaGUgYW5ub3RhdGlvbiB2YWx1ZXMgYXJlIGF2YWlsYWJsZSBhcyB2YWx1ZXMgb2YgYSBkaWN0aW9uYXJ5IAota2V5ZWQgYnkgdGhlIHBhcmFtZXRlcnMnIG5hbWVzIGluIHRoZSBcbWVtYmVye19fYW5ub3RhdGlvbnNfX30KLWF0dHJpYnV0ZSBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0LgotXGluZGV4aWl7ZnVuY3Rpb259e2Fubm90YXRpb25zfQotCi1JdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGNyZWF0ZSBhbm9ueW1vdXMgZnVuY3Rpb25zIChmdW5jdGlvbnMgbm90IGJvdW5kCi10byBhIG5hbWUpLCBmb3IgaW1tZWRpYXRlIHVzZSBpbiBleHByZXNzaW9ucy4gIFRoaXMgdXNlcyBsYW1iZGEgZm9ybXMsCi1kZXNjcmliZWQgaW4gc2VjdGlvbn5ccmVme2xhbWJkYX0uICBOb3RlIHRoYXQgdGhlIGxhbWJkYSBmb3JtIGlzCi1tZXJlbHkgYSBzaG9ydGhhbmQgZm9yIGEgc2ltcGxpZmllZCBmdW5jdGlvbiBkZWZpbml0aW9uOyBhIGZ1bmN0aW9uCi1kZWZpbmVkIGluIGEgYGBca2V5d29yZHtkZWZ9Jycgc3RhdGVtZW50IGNhbiBiZSBwYXNzZWQgYXJvdW5kIG9yCi1hc3NpZ25lZCB0byBhbm90aGVyIG5hbWUganVzdCBsaWtlIGEgZnVuY3Rpb24gZGVmaW5lZCBieSBhIGxhbWJkYQotZm9ybS4gIFRoZSBgYFxrZXl3b3Jke2RlZn0nJyBmb3JtIGlzIGFjdHVhbGx5IG1vcmUgcG93ZXJmdWwgc2luY2UgaXQKLWFsbG93cyB0aGUgZXhlY3V0aW9uIG9mIG11bHRpcGxlIHN0YXRlbWVudHMgYW5kIGFubm90YXRpb25zLgotXGluZGV4aWl7bGFtYmRhfXtmb3JtfQotCi1cc3Ryb25ne1Byb2dyYW1tZXIncyBub3RlOn0gRnVuY3Rpb25zIGFyZSBmaXJzdC1jbGFzcyBvYmplY3RzLiAgQQotYGBcY29kZXtkZWZ9JycgZm9ybSBleGVjdXRlZCBpbnNpZGUgYSBmdW5jdGlvbiBkZWZpbml0aW9uIGRlZmluZXMgYQotbG9jYWwgZnVuY3Rpb24gdGhhdCBjYW4gYmUgcmV0dXJuZWQgb3IgcGFzc2VkIGFyb3VuZC4gIEZyZWUgdmFyaWFibGVzCi11c2VkIGluIHRoZSBuZXN0ZWQgZnVuY3Rpb24gY2FuIGFjY2VzcyB0aGUgbG9jYWwgdmFyaWFibGVzIG9mIHRoZQotZnVuY3Rpb24gY29udGFpbmluZyB0aGUgZGVmLiAgU2VlIHNlY3Rpb25+XHJlZntuYW1pbmd9IGZvciBkZXRhaWxzLgotCi0KLVxzZWN0aW9ue0NsYXNzIGRlZmluaXRpb25zXGxhYmVse2NsYXNzfX0KLVxpbmRleGlpe2NsYXNzfXtkZWZpbml0aW9ufQotXHN0aW5kZXh7Y2xhc3N9Ci0KLUEgY2xhc3MgZGVmaW5pdGlvbiBkZWZpbmVzIGEgY2xhc3Mgb2JqZWN0IChzZWUgc2VjdGlvbn5ccmVme3R5cGVzfSk6Ci1cb2JpbmRleHtjbGFzc30KLQotXGJlZ2lue3Byb2R1Y3Rpb25saXN0fQotICBccHJvZHVjdGlvbntjbGFzc2RlZn0KLSAgICAgICAgICAgICB7ImNsYXNzIiBcdG9rZW57Y2xhc3NuYW1lfSBbXHRva2Vue2luaGVyaXRhbmNlfV0gIjoiCi0gICAgICAgICAgICAgIFx0b2tlbntzdWl0ZX19Ci0gIFxwcm9kdWN0aW9ue2luaGVyaXRhbmNlfQotICAgICAgICAgICAgIHsiKCIgW1x0b2tlbntleHByZXNzaW9uX2xpc3R9XSAiKSJ9Ci0gIFxwcm9kdWN0aW9ue2NsYXNzbmFtZX0KLSAgICAgICAgICAgICB7XHRva2Vue2lkZW50aWZpZXJ9fQotXGVuZHtwcm9kdWN0aW9ubGlzdH0KLQotQSBjbGFzcyBkZWZpbml0aW9uIGlzIGFuIGV4ZWN1dGFibGUgc3RhdGVtZW50LiAgSXQgZmlyc3QgZXZhbHVhdGVzIHRoZQotaW5oZXJpdGFuY2UgbGlzdCwgaWYgcHJlc2VudC4gIEVhY2ggaXRlbSBpbiB0aGUgaW5oZXJpdGFuY2UgbGlzdAotc2hvdWxkIGV2YWx1YXRlIHRvIGEgY2xhc3Mgb2JqZWN0IG9yIGNsYXNzIHR5cGUgd2hpY2ggYWxsb3dzCi1zdWJjbGFzc2luZy4gIFRoZSBjbGFzcydzIHN1aXRlIGlzIHRoZW4gZXhlY3V0ZWQKLWluIGEgbmV3IGV4ZWN1dGlvbiBmcmFtZSAoc2VlIHNlY3Rpb25+XHJlZntuYW1pbmd9KSwgdXNpbmcgYSBuZXdseQotY3JlYXRlZCBsb2NhbCBuYW1lc3BhY2UgYW5kIHRoZSBvcmlnaW5hbCBnbG9iYWwgbmFtZXNwYWNlLgotKFVzdWFsbHksIHRoZSBzdWl0ZSBjb250YWlucyBvbmx5IGZ1bmN0aW9uIGRlZmluaXRpb25zLikgIFdoZW4gdGhlCi1jbGFzcydzIHN1aXRlIGZpbmlzaGVzIGV4ZWN1dGlvbiwgaXRzIGV4ZWN1dGlvbiBmcmFtZSBpcyBkaXNjYXJkZWQgYnV0Ci1pdHMgbG9jYWwgbmFtZXNwYWNlIGlzIHNhdmVkLiAgQSBjbGFzcyBvYmplY3QgaXMgdGhlbiBjcmVhdGVkIHVzaW5nCi10aGUgaW5oZXJpdGFuY2UgbGlzdCBmb3IgdGhlIGJhc2UgY2xhc3NlcyBhbmQgdGhlIHNhdmVkIGxvY2FsCi1uYW1lc3BhY2UgZm9yIHRoZSBhdHRyaWJ1dGUgZGljdGlvbmFyeS4gIFRoZSBjbGFzcyBuYW1lIGlzIGJvdW5kIHRvIHRoaXMKLWNsYXNzIG9iamVjdCBpbiB0aGUgb3JpZ2luYWwgbG9jYWwgbmFtZXNwYWNlLgotXGluZGV4e2luaGVyaXRhbmNlfQotXGluZGV4aWl7Y2xhc3N9e25hbWV9Ci1caW5kZXhpaXtuYW1lfXtiaW5kaW5nfQotXGluZGV4aWl7ZXhlY3V0aW9ufXtmcmFtZX0KLQotXHN0cm9uZ3tQcm9ncmFtbWVyJ3Mgbm90ZTp9IFZhcmlhYmxlcyBkZWZpbmVkIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uCi1hcmUgY2xhc3MgdmFyaWFibGVzOyB0aGV5IGFyZSBzaGFyZWQgYnkgYWxsIGluc3RhbmNlcy4gIFRvIGRlZmluZQotaW5zdGFuY2UgdmFyaWFibGVzLCB0aGV5IG11c3QgYmUgZ2l2ZW4gYSB2YWx1ZSBpbiB0aGUKLVxtZXRob2R7X19pbml0X18oKX0gbWV0aG9kIG9yIGluIGFub3RoZXIgbWV0aG9kLiAgQm90aCBjbGFzcyBhbmQKLWluc3RhbmNlIHZhcmlhYmxlcyBhcmUgYWNjZXNzaWJsZSB0aHJvdWdoIHRoZSBub3RhdGlvbgotYGBcY29kZXtzZWxmLm5hbWV9JycsIGFuZCBhbiBpbnN0YW5jZSB2YXJpYWJsZSBoaWRlcyBhIGNsYXNzIHZhcmlhYmxlCi13aXRoIHRoZSBzYW1lIG5hbWUgd2hlbiBhY2Nlc3NlZCBpbiB0aGlzIHdheS4gIENsYXNzIHZhcmlhYmxlcyB3aXRoCi1pbW11dGFibGUgdmFsdWVzIGNhbiBiZSB1c2VkIGFzIGRlZmF1bHRzIGZvciBpbnN0YW5jZSB2YXJpYWJsZXMuCi1Gb3IgbmV3LXN0eWxlIGNsYXNzZXMsIGRlc2NyaXB0b3JzIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBpbnN0YW5jZQotdmFyaWFibGVzIHdpdGggZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIGRldGFpbHMuCmRpZmYgLS1naXQgYS9Eb2MvcmVmL3JlZjgudGV4IGIvRG9jL3JlZi9yZWY4LnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZlNGNjNS4uMDAwMDAwMAotLS0gYS9Eb2MvcmVmL3JlZjgudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLVxjaGFwdGVye1RvcC1sZXZlbCBjb21wb25lbnRzXGxhYmVse3RvcC1sZXZlbH19Ci0KLVRoZSBQeXRob24gaW50ZXJwcmV0ZXIgY2FuIGdldCBpdHMgaW5wdXQgZnJvbSBhIG51bWJlciBvZiBzb3VyY2VzOgotZnJvbSBhIHNjcmlwdCBwYXNzZWQgdG8gaXQgYXMgc3RhbmRhcmQgaW5wdXQgb3IgYXMgcHJvZ3JhbSBhcmd1bWVudCwKLXR5cGVkIGluIGludGVyYWN0aXZlbHksIGZyb20gYSBtb2R1bGUgc291cmNlIGZpbGUsIGV0Yy4gIFRoaXMgY2hhcHRlcgotZ2l2ZXMgdGhlIHN5bnRheCB1c2VkIGluIHRoZXNlIGNhc2VzLgotXGluZGV4e2ludGVycHJldGVyfQotCi0KLVxzZWN0aW9ue0NvbXBsZXRlIFB5dGhvbiBwcm9ncmFtc1xsYWJlbHtwcm9ncmFtc319Ci1caW5kZXh7cHJvZ3JhbX0KLQotV2hpbGUgYSBsYW5ndWFnZSBzcGVjaWZpY2F0aW9uIG5lZWQgbm90IHByZXNjcmliZSBob3cgdGhlIGxhbmd1YWdlCi1pbnRlcnByZXRlciBpcyBpbnZva2VkLCBpdCBpcyB1c2VmdWwgdG8gaGF2ZSBhIG5vdGlvbiBvZiBhIGNvbXBsZXRlCi1QeXRob24gcHJvZ3JhbS4gIEEgY29tcGxldGUgUHl0aG9uIHByb2dyYW0gaXMgZXhlY3V0ZWQgaW4gYSBtaW5pbWFsbHkKLWluaXRpYWxpemVkIGVudmlyb25tZW50OiBhbGwgYnVpbHQtaW4gYW5kIHN0YW5kYXJkIG1vZHVsZXMgYXJlCi1hdmFpbGFibGUsIGJ1dCBub25lIGhhdmUgYmVlbiBpbml0aWFsaXplZCwgZXhjZXB0IGZvciBcbW9kdWxle3N5c30KLSh2YXJpb3VzIHN5c3RlbSBzZXJ2aWNlcyksIFxtb2R1bGV7X19idWlsdGluX199IChidWlsdC1pbiBmdW5jdGlvbnMsCi1leGNlcHRpb25zIGFuZCBcY29kZXtOb25lfSkgYW5kIFxtb2R1bGV7X19tYWluX199LiAgVGhlIGxhdHRlciBpcyB1c2VkCi10byBwcm92aWRlIHRoZSBsb2NhbCBhbmQgZ2xvYmFsIG5hbWVzcGFjZSBmb3IgZXhlY3V0aW9uIG9mIHRoZQotY29tcGxldGUgcHJvZ3JhbS4KLVxyZWZiaW1vZGluZGV4e3N5c30KLVxyZWZiaW1vZGluZGV4e19fbWFpbl9ffQotXHJlZmJpbW9kaW5kZXh7X19idWlsdGluX199Ci0KLVRoZSBzeW50YXggZm9yIGEgY29tcGxldGUgUHl0aG9uIHByb2dyYW0gaXMgdGhhdCBmb3IgZmlsZSBpbnB1dCwKLWRlc2NyaWJlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLgotCi1UaGUgaW50ZXJwcmV0ZXIgbWF5IGFsc28gYmUgaW52b2tlZCBpbiBpbnRlcmFjdGl2ZSBtb2RlOyBpbiB0aGlzIGNhc2UsCi1pdCBkb2VzIG5vdCByZWFkIGFuZCBleGVjdXRlIGEgY29tcGxldGUgcHJvZ3JhbSBidXQgcmVhZHMgYW5kIGV4ZWN1dGVzCi1vbmUgc3RhdGVtZW50IChwb3NzaWJseSBjb21wb3VuZCkgYXQgYSB0aW1lLiAgVGhlIGluaXRpYWwgZW52aXJvbm1lbnQKLWlzIGlkZW50aWNhbCB0byB0aGF0IG9mIGEgY29tcGxldGUgcHJvZ3JhbTsgZWFjaCBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQKLWluIHRoZSBuYW1lc3BhY2Ugb2YgXG1vZHVsZXtfX21haW5fX30uCi1caW5kZXh7aW50ZXJhY3RpdmUgbW9kZX0KLVxyZWZiaW1vZGluZGV4e19fbWFpbl9ffQotCi1VbmRlciBcVU5JWCwgYSBjb21wbGV0ZSBwcm9ncmFtIGNhbiBiZSBwYXNzZWQgdG8gdGhlIGludGVycHJldGVyIGluCi10aHJlZSBmb3Jtczogd2l0aCB0aGUgXHByb2dyYW1vcHR7LWN9IFx2YXJ7c3RyaW5nfSBjb21tYW5kIGxpbmUgb3B0aW9uLCBhcyBhCi1maWxlIHBhc3NlZCBhcyB0aGUgZmlyc3QgY29tbWFuZCBsaW5lIGFyZ3VtZW50LCBvciBhcyBzdGFuZGFyZCBpbnB1dC4KLUlmIHRoZSBmaWxlIG9yIHN0YW5kYXJkIGlucHV0IGlzIGEgdHR5IGRldmljZSwgdGhlIGludGVycHJldGVyIGVudGVycwotaW50ZXJhY3RpdmUgbW9kZTsgb3RoZXJ3aXNlLCBpdCBleGVjdXRlcyB0aGUgZmlsZSBhcyBhIGNvbXBsZXRlCi1wcm9ncmFtLgotXGluZGV4e1VOSVh9Ci1caW5kZXh7Y29tbWFuZCBsaW5lfQotXGluZGV4e3N0YW5kYXJkIGlucHV0fQotCi0KLVxzZWN0aW9ue0ZpbGUgaW5wdXRcbGFiZWx7ZmlsZS1pbnB1dH19Ci0KLUFsbCBpbnB1dCByZWFkIGZyb20gbm9uLWludGVyYWN0aXZlIGZpbGVzIGhhcyB0aGUgc2FtZSBmb3JtOgotCi1cYmVnaW57cHJvZHVjdGlvbmxpc3R9Ci0gIFxwcm9kdWN0aW9ue2ZpbGVfaW5wdXR9Ci0gICAgICAgICAgICAgeyhORVdMSU5FIHwgXHRva2Vue3N0YXRlbWVudH0pKn0KLVxlbmR7cHJvZHVjdGlvbmxpc3R9Ci0KLVRoaXMgc3ludGF4IGlzIHVzZWQgaW4gdGhlIGZvbGxvd2luZyBzaXR1YXRpb25zOgotCi1cYmVnaW57aXRlbWl6ZX0KLQotXGl0ZW0gd2hlbiBwYXJzaW5nIGEgY29tcGxldGUgUHl0aG9uIHByb2dyYW0gKGZyb20gYSBmaWxlIG9yIGZyb20gYSBzdHJpbmcpOwotCi1caXRlbSB3aGVuIHBhcnNpbmcgYSBtb2R1bGU7Ci0KLVxpdGVtIHdoZW4gcGFyc2luZyBhIHN0cmluZyBwYXNzZWQgdG8gdGhlIFxmdW5jdGlvbntleGVjKCl9IGZ1bmN0aW9uOwotCi1cZW5ke2l0ZW1pemV9Ci0KLQotXHNlY3Rpb257SW50ZXJhY3RpdmUgaW5wdXRcbGFiZWx7aW50ZXJhY3RpdmV9fQotCi1JbnB1dCBpbiBpbnRlcmFjdGl2ZSBtb2RlIGlzIHBhcnNlZCB1c2luZyB0aGUgZm9sbG93aW5nIGdyYW1tYXI6Ci0KLVxiZWdpbntwcm9kdWN0aW9ubGlzdH0KLSAgXHByb2R1Y3Rpb257aW50ZXJhY3RpdmVfaW5wdXR9Ci0gICAgICAgICAgICAge1tcdG9rZW57c3RtdF9saXN0fV0gTkVXTElORSB8IFx0b2tlbntjb21wb3VuZF9zdG10fSBORVdMSU5FfQotXGVuZHtwcm9kdWN0aW9ubGlzdH0KLQotTm90ZSB0aGF0IGEgKHRvcC1sZXZlbCkgY29tcG91bmQgc3RhdGVtZW50IG11c3QgYmUgZm9sbG93ZWQgYnkgYSBibGFuawotbGluZSBpbiBpbnRlcmFjdGl2ZSBtb2RlOyB0aGlzIGlzIG5lZWRlZCB0byBoZWxwIHRoZSBwYXJzZXIgZGV0ZWN0IHRoZQotZW5kIG9mIHRoZSBpbnB1dC4KLQotCi1cc2VjdGlvbntFeHByZXNzaW9uIGlucHV0XGxhYmVse2V4cHJlc3Npb24taW5wdXR9fQotXGluZGV4e2lucHV0fQotCi1UaGVyZSBhcmUgdHdvIGZvcm1zIG9mIGV4cHJlc3Npb24gaW5wdXQuICBCb3RoIGlnbm9yZSBsZWFkaW5nCi13aGl0ZXNwYWNlLgotVGhlIHN0cmluZyBhcmd1bWVudCB0byBcZnVuY3Rpb257ZXZhbCgpfSBtdXN0IGhhdmUgdGhlIGZvbGxvd2luZyBmb3JtOgotXGJpZnVuY2luZGV4e2V2YWx9Ci0KLVxiZWdpbntwcm9kdWN0aW9ubGlzdH0KLSAgXHByb2R1Y3Rpb257ZXZhbF9pbnB1dH0KLSAgICAgICAgICAgICB7XHRva2Vue2V4cHJlc3Npb25fbGlzdH0gTkVXTElORSp9Ci1cZW5ke3Byb2R1Y3Rpb25saXN0fQotCi1UaGUgaW5wdXQgbGluZSByZWFkIGJ5IFxmdW5jdGlvbntpbnB1dCgpfSBtdXN0IGhhdmUgdGhlIGZvbGxvd2luZyBmb3JtOgotXGJpZnVuY2luZGV4e2lucHV0fQotCi1cYmVnaW57cHJvZHVjdGlvbmxpc3R9Ci0gIFxwcm9kdWN0aW9ue2lucHV0X2lucHV0fQotICAgICAgICAgICAgIHtcdG9rZW57ZXhwcmVzc2lvbl9saXN0fSBORVdMSU5FfQotXGVuZHtwcm9kdWN0aW9ubGlzdH0KLQotTm90ZTogdG8gcmVhZCBgcmF3JyBpbnB1dCBsaW5lIHdpdGhvdXQgaW50ZXJwcmV0YXRpb24sIHlvdSBjYW4gdXNlIHRoZQotdGhlIFxtZXRob2R7cmVhZGxpbmUoKX0gbWV0aG9kIG9mIGZpbGUgb2JqZWN0cywgaW5jbHVkaW5nIFxjb2Rle3N5cy5zdGRpbn0uCi1cb2JpbmRleHtmaWxlfQotXGluZGV4e2lucHV0IXJhd30KLVx3aXRoc3ViaXRlbXsoZmlsZSBtZXRob2QpfXtcdHRpbmRleHtyZWFkbGluZSgpfX0KZGlmZiAtLWdpdCBhL0RvYy9yZWYvcmVzd29yZHMucHkgYi9Eb2MvcmVmL3Jlc3dvcmRzLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2I4ZGM4Li4wMDAwMDAwCi0tLSBhL0RvYy9yZWYvcmVzd29yZHMucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0iIiJTcGl0IG91dCB0aGUgUHl0aG9uIHJlc2VydmVkIHdvcmRzIHRhYmxlLiIiIgotCi1pbXBvcnQga2V5d29yZAotCi1uY29scyA9IDUKLQotZGVmIG1haW4oKToKLSAgICB3b3JkcyA9IGtleXdvcmQua3dsaXN0WzpdCi0gICAgd29yZHMuc29ydCgpCi0gICAgY29sd2lkdGggPSAxICsgbWF4KG1hcChsZW4sIHdvcmRzKSkKLSAgICBud29yZHMgPSBsZW4od29yZHMpCi0gICAgbnJvd3MgPSAobndvcmRzICsgbmNvbHMgLSAxKSAvLyBuY29scwotICAgIGZvciBpcm93IGluIHJhbmdlKG5yb3dzKToKLSAgICAgICAgZm9yIGljb2wgaW4gcmFuZ2UobmNvbHMpOgotICAgICAgICAgICAgaSA9IGlyb3cgKyBpY29sICogbnJvd3MKLSAgICAgICAgICAgIGlmIDAgPD0gaSA8IG53b3JkczoKLSAgICAgICAgICAgICAgICB3b3JkID0gd29yZHNbaV0KLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgd29yZCA9ICIiCi0gICAgICAgICAgICBwcmludCAiJS0qcyIgJSAoY29sd2lkdGgsIHdvcmQpLAotICAgICAgICBwcmludAotCi1tYWluKCkKZGlmZiAtLWdpdCBhL0RvYy90ZW1wbGF0ZXMvaG93dG8udGV4IGIvRG9jL3RlbXBsYXRlcy9ob3d0by50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYmIwNjUuLjAwMDAwMDAKLS0tIGEvRG9jL3RlbXBsYXRlcy9ob3d0by50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotJSBDb21wbGV0ZSBkb2N1bWVudGF0aW9uIG9uIHRoZSBleHRlbmRlZCBMYVRlWCBtYXJrdXAgdXNlZCBmb3IgUHl0aG9uCi0lIGRvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlIGluIGBgRG9jdW1lbnRpbmcgUHl0aG9uJycsIHdoaWNoIGlzIHBhcnQKLSUgb2YgdGhlIHN0YW5kYXJkIGRvY3VtZW50YXRpb24gZm9yIFB5dGhvbi4gIEl0IG1heSBiZSBmb3VuZCBvbmxpbmUKLSUgYXQ6Ci0lCi0lICAgICBodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jL2N1cnJlbnQvZG9jL2RvYy5odG1sCi0KLVxkb2N1bWVudGNsYXNze2hvd3RvfQotCi0lICBUaGlzIGlzIGEgdGVtcGxhdGUgZm9yIHNob3J0IG9yIG1lZGl1bS1zaXplIFB5dGhvbi1yZWxhdGVkIGRvY3VtZW50cywgCi0lIG1vc3RseSBub3RhYmx5IHRoZSBzZXJpZXMgb2YgSE9XVE9zLCBidXQgaXQgY2FuIGJlIHVzZWQgZm9yIGFueQotJSBkb2N1bWVudCB5b3UgbGlrZS4gICAKLQotJSBUaGUgdGl0bGUgc2hvdWxkIGJlIGRlc2NyaXB0aXZlIGVub3VnaCBmb3IgcGVvcGxlIHRvIGJlIGFibGUgdG8gZmluZAotJSB0aGUgcmVsZXZhbnQgZG9jdW1lbnQuIAotXHRpdGxle1NwYW1taWZ5aW5nIFNwcm9ja2V0cyBpbiBQeXRob259Ci0KLSUgSW5jcmVtZW50IHRoZSByZWxlYXNlIG51bWJlciB3aGVuZXZlciBzaWduaWZpY2FudCBjaGFuZ2VzIGFyZSBtYWRlLgotJSBUaGUgYXV0aG9yIGFuZC9vciBlZGl0b3IgY2FuIGRlZmluZSAnc2lnbmlmaWNhbnQnIGhvd2V2ZXIgdGhleSBsaWtlLgotXHJlbGVhc2V7MC4wMH0KLQotJSBBdCBtaW5pbXVtLCBnaXZlIHlvdXIgbmFtZSBhbmQgYW4gZW1haWwgYWRkcmVzcy4gIFlvdSBjYW4gaW5jbHVkZSBhCi0lIHNuYWlsLW1haWwgYWRkcmVzcyBpZiB5b3UgbGlrZS4KLVxhdXRob3J7TWUsICdjYXVzZSBJIHdyb3RlIGl0fQotXGF1dGhvcmFkZHJlc3N7TWUsICdjYXVzZSBJJ20gc2VsZi1lbXBsb3llZC59Ci0KLVxiZWdpbntkb2N1bWVudH0KLVxtYWtldGl0bGUKLQotJSBUaGlzIG1ha2VzIHRoZSBBYnN0cmFjdCBnbyBvbiBhIHNlcGFyYXRlIHBhZ2UgaW4gdGhlIEhUTUwgdmVyc2lvbjsKLSUgaWYgYSBjb3B5cmlnaHQgbm90aWNlIGlzIHVzZWQsIGl0IHNob3VsZCBnbyBpbW1lZGlhdGVseSBhZnRlciB0aGlzLgotJQotXGlmaHRtbAotXGNoYXB0ZXIqe0Zyb250IE1hdHRlclxsYWJlbHtmcm9udH19Ci1cZmkKLQotJSBDb3B5cmlnaHQgc3RhdGVtZW50IHNob3VsZCBnbyBoZXJlLCBpZiBuZWVkZWQuCi0lIC4uLgotCi0lIFRoZSBhYnN0cmFjdCBzaG91bGQgYmUgYSBwYXJhZ3JhcGggb3IgdHdvIGxvbmcsIGFuZCBkZXNjcmliZSB0aGUKLSUgc2NvcGUgb2YgdGhlIGRvY3VtZW50LgotXGJlZ2lue2Fic3RyYWN0fQotXG5vaW5kZW50Ci1UaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBob3cgdG8gc3BhbW1pZnkgc3Byb2NrZXRzLiAgSXQgaXMgYSB1c2VmdWwKLWV4YW1wbGUgb2YgYSBQeXRob24gSE9XVE8gZG9jdW1lbnQuICBJdCBpcyBub3QgZGVwZW5kZW50IG9uIGFueQotcGFydGljdWxhciBzcHJvY2tldCBpbXBsZW1lbnRhdGlvbiwgYW5kIGluY2x1ZGVzIGEgUHl0aG9uLWJhc2VkCi1pbXBsZW1lbnRhdGlvbiBpbiB0aGUgXG1vZHVsZXtzcHJ1bmtpdH0gbW9kdWxlLgotXGVuZHthYnN0cmFjdH0KLQotXHRhYmxlb2Zjb250ZW50cwotCi1TcGFtbWlmeWluZyBzcHJvY2tldHMgZnJvbSBQeXRob24gaXMgYm90aCBmdW4gYW5kIGVudGVydGFpbmluZy4KLUFwcGx5aW5nIHRoZSB0ZWNobmlxdWVzIGRlc2NyaWJlZCBoZXJlLCB5b3UgY2FuIGFsc28gZmlsbCB5b3VyIGhhcmQKLWRpc2sgcXVpdGUgZWZmZWN0aXZlbHkuCi0KLVxzZWN0aW9ue1doYXQgaXMgU3Byb2NrZXQgU3BhbW1pZmljYXRpb24/fQotCi1Zb3UgaGF2ZSB0byBhc2s/ICBJdCdzIHRoZSBvbmx5IHRoaW5nIHRvIGRvIHRvIHlvdXIgc3Byb2NrZXRzIQotCi0KLVxzZWN0aW9ue1doeSBVc2UgUHl0aG9uP30KLQotUHl0aG9uIGlzIGFuIGV4Y2VsbGVudCBsYW5ndWFnZSBmcm9tIHdoaWNoIHRvIHNwYW1taWZ5IHlvdXIgc3Byb2NrZXRzCi1zaW5jZSB5b3UgY2FuIGRvIGl0IG9uIGFueSBwbGF0Zm9ybS4KLQotCi1cc2VjdGlvbntTb2Z0d2FyZSBSZXF1aXJlbWVudHN9Ci0KLVlvdSBuZWVkIHRvIGhhdmUgdGhlIGZvbGxvd2luZyBzb2Z0d2FyZSBpbnN0YWxsZWQ6Ci0KLSUgVGhlIHtpdGVtaXplfSBlbnZpcm9ubWVudCB1c2VzIGEgYnVsbGV0IGZvciBlYWNoIFxpdGVtLiAgSWYgeW91IHdhbnQgdGhlIAotJSBcaXRlbSdzIG51bWJlcmVkLCB1c2UgdGhlIHtlbnVtZXJhdGV9IGVudmlyb25tZW50IGluc3RlYWQuCi1cYmVnaW57aXRlbWl6ZX0KLSAgXGl0ZW0gIFB5dGhvbiAxLjkuCi0gIFxpdGVtICBTb21lIHNwcm9ja2V0IGRlZmluaXRpb24gZmlsZXMuCi0gIFxpdGVtICBBdCBsZWFzdCBvbmUgc3Byb2NrZXQgc3lzdGVtIGltcGxlbWVudGF0aW9uLgotXGVuZHtpdGVtaXplfQotCi1Ob3RlIHRoYXQgdGhlIFxtb2R1bGV7c3BydW5raXR9IGlzIHByb3ZpZGVkIHdpdGggdGhpcyBwYWNrYWdlIGFuZAotaW1wbGVtZW50cyBBY3RpdmVTcHJvY2tldHMgaW4gUHl0aG9uLgotCi0KLSUgVGhlIHByZWNlZGluZyBzZWN0aW9ucyB3aWxsIGhhdmUgYmVlbiB3cml0dGVuIGluIGEgZ2VudGxlciwKLSUgaW50cm9kdWN0b3J5IHN0eWxlLiAgWW91IG1heSBhbHNvIHdpc2ggdG8gaW5jbHVkZSBhIHJlZmVyZW5jZQotJSBzZWN0aW9uLCBkb2N1bWVudGluZyBhbGwgdGhlIGZ1bmN0aW9ucy9leGNlcHRpb25zL2NvbnN0YW50cy4KLSUgT2Z0ZW4sIHRoZXNlIHdpbGwgYmUgcGxhY2VkIGluIHNlcGFyYXRlIGZpbGVzIGFuZCBpbnB1dCBsaWtlIHRoaXM6Ci0KLVxpbnB1dHttb2R1bGV9Ci0KLQotXGFwcGVuZGl4Ci0KLVxzZWN0aW9ue1RoaXMgaXMgYW4gQXBwZW5kaXh9Ci0KLVRvIGNyZWF0ZSBhbiBhcHBlbmRpeCBpbiBhIFB5dGhvbiBIT1dUTyBkb2N1bWVudCwgdXNlIG1hcmt1cCBsaWtlCi10aGlzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1cYXBwZW5kaXgKLQotXHNlY3Rpb257VGhpcyBpcyBhbiBBcHBlbmRpeH0KLQotVG8gY3JlYXRlIGFuIGFwcGVuZGl4IGluIGEgUHl0aG9uIEhPV1RPIGRvY3VtZW50LCAuLi4uCi0KLQotXHNlY3Rpb257VGhpcyBpcyBhbm90aGVyfQotCi1KdXN0IGFkZCBhbm90aGVyIFxzZWN0aW9ue30sIGJ1dCBkb24ndCBzYXkgXGFwcGVuZGl4IGFnYWluLgotXGVuZHt2ZXJiYXRpbX0KLQotCi1cZW5ke2RvY3VtZW50fQpkaWZmIC0tZ2l0IGEvRG9jL3RlbXBsYXRlcy9tYW51YWwudGV4IGIvRG9jL3RlbXBsYXRlcy9tYW51YWwudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWRlYzhiLi4wMDAwMDAwCi0tLSBhL0RvYy90ZW1wbGF0ZXMvbWFudWFsLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLSUgQ29tcGxldGUgZG9jdW1lbnRhdGlvbiBvbiB0aGUgZXh0ZW5kZWQgTGFUZVggbWFya3VwIHVzZWQgZm9yIFB5dGhvbgotJSBkb2N1bWVudGF0aW9uIGlzIGF2YWlsYWJsZSBpbiBgYERvY3VtZW50aW5nIFB5dGhvbicnLCB3aGljaCBpcyBwYXJ0Ci0lIG9mIHRoZSBzdGFuZGFyZCBkb2N1bWVudGF0aW9uIGZvciBQeXRob24uICBJdCBtYXkgYmUgZm91bmQgb25saW5lCi0lIGF0OgotJQotJSAgICAgaHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9jdXJyZW50L2RvYy9kb2MuaHRtbAotCi1cZG9jdW1lbnRjbGFzc3ttYW51YWx9Ci0KLVx0aXRsZXtCaWcgUHl0aG9uIE1hbnVhbH0KLQotXGF1dGhvcntZb3VyIE5hbWUgSGVyZX0KLQotJSBQbGVhc2UgYXQgbGVhc3QgaW5jbHVkZSBhIGxvbmctbGl2ZWQgZW1haWwgYWRkcmVzczsKLSUgdGhlIHJlc3QgaXMgYXQgeW91ciBkaXNjcmV0aW9uLgotXGF1dGhvcmFkZHJlc3N7Ci0JT3JnYW5pemF0aW9uIG5hbWUsIGlmIGFwcGxpY2FibGUgXFwKLQlTdHJlZXQgYWRkcmVzcywgaWYgeW91IHdhbnQgdG8gdXNlIGl0IFxcCi0JRW1haWw6IFxlbWFpbHt5b3VyLWVtYWlsQHlvdXIuZG9tYWlufQotfQotCi1cZGF0ZXtBcHJpbCAzMCwgMTk5OX0JCSUgdXBkYXRlIGJlZm9yZSByZWxlYXNlIQotCQkJCSUgVXNlIGFuIGV4cGxpY2l0IGRhdGUgc28gdGhhdCByZWZvcm1hdHRpbmcKLQkJCQklIGRvZXNuJ3QgY2F1c2UgYSBuZXcgZGF0ZSB0byBiZSB1c2VkLiAgU2V0dGluZwotCQkJCSUgdGhlIGRhdGUgdG8gXHRvZGF5IGNhbiBiZSB1c2VkIGR1cmluZyBkcmFmdAotCQkJCSUgc3RhZ2VzIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGhhbmRsZSB2ZXJzaW9ucy4KLQotXHJlbGVhc2V7eC55fQkJCSUgcmVsZWFzZSB2ZXJzaW9uOyB0aGlzIGlzIHVzZWQgdG8gZGVmaW5lIHRoZQotCQkJCSUgXHZlcnNpb24gbWFjcm8KLQotXG1ha2VpbmRleAkJCSUgdGVsbCBcaW5kZXggdG8gYWN0dWFsbHkgd3JpdGUgdGhlIC5pZHggZmlsZQotXG1ha2Vtb2RpbmRleAkJCSUgSWYgdGhpcyBjb250YWlucyBhIGxvdCBvZiBtb2R1bGUgc2VjdGlvbnMuCi0KLQotXGJlZ2lue2RvY3VtZW50fQotCi1cbWFrZXRpdGxlCi0KLSUgVGhpcyBtYWtlcyB0aGUgY29udGVudHMgbW9yZSBhY2Nlc3NpYmxlIGZyb20gdGhlIGZyb250IHBhZ2Ugb2YgdGhlIEhUTUwuCi1caWZodG1sCi1cY2hhcHRlcip7RnJvbnQgTWF0dGVyXGxhYmVse2Zyb250fX0KLVxmaQotCi0lXGlucHV0e2NvcHlyaWdodH0KLQotXGJlZ2lue2Fic3RyYWN0fQotCi1cbm9pbmRlbnQKLUJpZyBQeXRob24gaXMgYSBzcGVjaWFsIHZlcnNpb24gb2YgUHl0aG9uIGZvciB1c2VycyB3aG8gcmVxdWlyZSBsYXJnZXIgCi1rZXlzIG9uIHRoZWlyIGtleWJvYXJkcy4gIEl0IGFjY29tbW9kYXRlcyB0aGVpciBzcGVjaWFsIG5lZWRzIGJ5IC4uLgotCi1cZW5ke2Fic3RyYWN0fQotCi1cdGFibGVvZmNvbnRlbnRzCi0KLQotXGNoYXB0ZXJ7Li4ufQotCi1NeSBjaGFwdGVyLgotCi0KLVxhcHBlbmRpeAotXGNoYXB0ZXJ7Li4ufQotCi1NeSBhcHBlbmRpeC4KLQotVGhlIFxjb2Rle1xlIGFwcGVuZGl4fSBtYXJrdXAgbmVlZCBub3QgYmUgcmVwZWF0ZWQgZm9yIGFkZGl0aW9uYWwKLWFwcGVuZGljZXMuCi0KLQotJQotJSAgVGhlIHVnbHkgIiViZWdpbntsYXRleG9ubHl9IiBwc2V1ZG8tZW52aXJvbm1lbnRzIGFyZSByZWFsbHkganVzdCB0bwotJSAga2VlcCBMYVRlWDJIVE1MIHF1aWV0IGR1cmluZyB0aGUgXHJlbmV3Y29tbWFuZHt9IG1hY3JvczsgdGhleSdyZQotJSAgbm90IHJlYWxseSB2YWx1YWJsZS4KLSUKLSUgIElmIHlvdSBkb24ndCB3YW50IHRoZSBNb2R1bGUgSW5kZXgsIHlvdSBjYW4gcmVtb3ZlIGFsbCBvZiB0aGlzIHVwCi0lICB1bnRpbCB0aGUgc2Vjb25kIFxpbnB1dCBsaW5lLgotJQotJWJlZ2lue2xhdGV4b25seX0KLVxyZW5ld2NvbW1hbmR7XGluZGV4bmFtZX17TW9kdWxlIEluZGV4fQotJWVuZHtsYXRleG9ubHl9Ci1caW5wdXR7bW9kXGpvYm5hbWUuaW5kfQkJJSBNb2R1bGUgSW5kZXgKLQotJWJlZ2lue2xhdGV4b25seX0KLVxyZW5ld2NvbW1hbmR7XGluZGV4bmFtZX17SW5kZXh9Ci0lZW5ke2xhdGV4b25seX0KLVxpbnB1dHtcam9ibmFtZS5pbmR9CQkJJSBJbmRleAotCi1cZW5ke2RvY3VtZW50fQpkaWZmIC0tZ2l0IGEvRG9jL3RlbXBsYXRlcy9tb2R1bGUudGV4IGIvRG9jL3RlbXBsYXRlcy9tb2R1bGUudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWUxYjEyLi4wMDAwMDAwCi0tLSBhL0RvYy90ZW1wbGF0ZXMvbW9kdWxlLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0lIFRlbXBsYXRlIGZvciBhIGxpYnJhcnkgbWFudWFsIHNlY3Rpb24uCi0lIFBMRUFTRSBSRU1PVkUgVEhFIENPTU1FTlRTIEFGVEVSIFVTSU5HIFRIRSBURU1QTEFURQotJQotJSBDb21wbGV0ZSBkb2N1bWVudGF0aW9uIG9uIHRoZSBleHRlbmRlZCBMYVRlWCBtYXJrdXAgdXNlZCBmb3IgUHl0aG9uCi0lIGRvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlIGluIGBgRG9jdW1lbnRpbmcgUHl0aG9uJycsIHdoaWNoIGlzIHBhcnQKLSUgb2YgdGhlIHN0YW5kYXJkIGRvY3VtZW50YXRpb24gZm9yIFB5dGhvbi4gIEl0IG1heSBiZSBmb3VuZCBvbmxpbmUKLSUgYXQ6Ci0lCi0lICAgICBodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jL2N1cnJlbnQvZG9jL2RvYy5odG1sCi0KLSUgPT09PSAwLiA9PT09Ci0lIENvcHkgdGhpcyBmaWxlIHRvIDxteWRpcj4vbGliPG15bW9kdWxlPi50ZXgsIGFuZCBlZGl0IHRoYXQgZmlsZQotJSBhY2NvcmRpbmcgdG8gdGhlIGluc3RydWN0aW9ucyBiZWxvdy4KLQotCi0lID09PT0gMS4gPT09PQotJSBUaGUgc2VjdGlvbiBwcm9sb2d1ZS4gIEdpdmUgdGhlIHNlY3Rpb24gYSB0aXRsZSBhbmQgcHJvdmlkZSBzb21lCi0lIG1ldGEtaW5mb3JtYXRpb24uICBSZWZlcmVuY2VzIHRvIHRoZSBtb2R1bGUgc2hvdWxkIHVzZQotJSBccmVmYmltb2RpbmRleCwgXHJlZnN0bW9kaW5kZXgsIFxyZWZleG1vZGluZGV4IG9yIFxyZWZtb2RpbmRleCwgYXMKLSUgYXBwcm9wcmlhdGUuCi0KLVxzZWN0aW9ue1xtb2R1bGV7c3BhbX0gLS0tCi0gICAgICAgICBTaG9ydCBkZXNjcmlwdGlvbiwgZm9yIHNlY3Rpb24gdGl0bGUgYW5kIHRhYmxlIG9mIGNvbnRlbnRzfQotCi0lIENob29zZSBvbmUgb2YgdGhlc2UgdG8gc3BlY2lmeSB0aGUgbW9kdWxlIG1vZHVsZSBuYW1lLiAgSWYgdGhlcmUncwotJSBhbiB1bmRlcnNjb3JlIGluIHRoZSBuYW1lLCB1c2UKLSUgXGRlY2xhcmVtb2R1bGVbbW9kbmFtZV17Li4ufXttb2RfbmFtZX0gaW5zdGVhZC4KLSUKLVxkZWNsYXJlbW9kdWxle2J1aWx0aW59e3NwYW19CQklIHN0YW5kYXJkIGxpYnJhcnksIGluIEMKLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtzcGFtfQkJJSBzdGFuZGFyZCBsaWJyYXJ5LCBpbiBQeXRob24KLVxkZWNsYXJlbW9kdWxle2V4dGVuc2lvbn17c3BhbX0JCSUgbm90IHN0YW5kYXJkLCBpbiBDCi1cZGVjbGFyZW1vZHVsZXt9e3NwYW19CQkJJSBub3Qgc3RhbmRhcmQsIGluIFB5dGhvbgotCi0lIFBvcnRhYmlsaXR5IHN0YXRlbWVudDogIFVuY29tbWVudCBhbmQgZmlsbCBpbiB0aGUgcGFyYW1ldGVyIHRvIHNwZWNpZnkgdGhlCi0lIGF2YWlsYWJpbGl0eSBvZiB0aGUgbW9kdWxlLiAgVGhlIHBhcmFtZXRlciBjYW4gYmUgVW5peCwgSVJJWCwgU3VuT1MsIE1hYywKLSUgV2luZG93cywgb3IgbG90cyBvZiBvdGhlciBzdHVmZi4gIFdoZW4gYGBNYWMnJyBpcyBzcGVjaWZpZWQsIHRoZSBhdmFpbGFiaWxpdHkKLSUgc3RhdGVtZW50IHdpbGwgc2F5IGBgTWFjaW50b3NoJycgYW5kIHRoZSBNb2R1bGUgSW5kZXggbWF5IHNheSBgYE1hYycnLgotJSBQbGVhc2UgdXNlIGEgbmFtZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gdXNlZCB3aGVuZXZlciBhcHBsaWNhYmxlLiAgSWYgdGhpcwotJSBpcyBvbWl0dGVkLCBubyBhdmFpbGFiaWxpdHkgc3RhdGVtZW50IGlzIHByb2R1Y2VkIG9yIGltcGxpZWQuCi0lCi0lICAgXHBsYXRmb3Jte1VuaXh9Ci0KLSUgVGhlc2UgYXBwbHkgdG8gYWxsIG1vZHVsZXMsIGFuZCBtYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2U6Ci0KLVxtb2R1bGVhdXRob3J7bmFtZX17ZW1haWx9CQklIEF1dGhvciBvZiB0aGUgbW9kdWxlIGNvZGU7Ci0JCQkJCSUgb21pdCBpZiBub3Qga25vd24uCi1cc2VjdGlvbmF1dGhvcntuYW1lfXtlbWFpbH0JCSUgQXV0aG9yIG9mIHRoZSBkb2N1bWVudGF0aW9uLAotCQkJCQklIGV2ZW4gaWYgbm90IGEgbW9kdWxlIHNlY3Rpb24uCi0KLQotJSBMZWF2ZSBhdCBsZWFzdCBvbmUgYmxhbmsgbGluZSBhZnRlciB0aGlzLCB0byBzaW1wbGlmeSBhZC1ob2MgdG9vbHMKLSUgdGhhdCBhcmUgc29tZXRpbWVzIHVzZWQgdG8gbWFzc2FnZSB0aGVzZSBmaWxlcy4KLVxtb2R1bGVzeW5vcHNpc3tUaGlzIGlzIGEgb25lLWxpbmUgZGVzY3JpcHRpb24sIGZvciB0aGUgY2hhcHRlciBoZWFkZXIufQotCi0KLSUgPT09PSAyLiA9PT09Ci0lIEdpdmUgYSBzaG9ydCBvdmVydmlldyBvZiB3aGF0IHRoZSBtb2R1bGUgZG9lcy4KLSUgSWYgaXQgaXMgcGxhdGZvcm0gc3BlY2lmaWMsIG1lbnRpb24gdGhpcy4KLSUgTWVudGlvbiBvdGhlciBpbXBvcnRhbnQgcmVzdHJpY3Rpb25zIG9yIGdlbmVyYWwgb3BlcmF0aW5nIHByaW5jaXBsZXMuCi0lIEZvciBleGFtcGxlOgotCi1UaGUgXG1vZHVsZXtzcGFtfSBtb2R1bGUgZGVmaW5lcyBvcGVyYXRpb25zIGZvciBoYW5kbGluZyBjYW5zIG9mIFNwYW0uCi1JdCBrbm93cyB0aGUgZm91ciBnZW5lcmFsbHkgYXZhaWxhYmxlIFNwYW0gdmFyaWV0aWVzIGFuZCB1bmRlcnN0YW5kcwotYm90aCBjYW4gc2l6ZXMuCi0KLUJlY2F1c2Ugc3BhbWlmaWNhdGlvbiByZXF1aXJlcyBcVU5JWHt9IHByb2Nlc3MgbWFuYWdlbWVudCwgdGhlIG1vZHVsZQotaXMgb25seSBhdmFpbGFibGUgb24gZ2VudWluZSBcVU5JWHt9IHN5c3RlbXMuCi0KLQotJSA9PT09IDMuID09PT0KLSUgTGlzdCB0aGUgcHVibGljIGZ1bmN0aW9ucyBkZWZpbmVkIGJ5IHRoZSBtb2R1bGUuICBCZWdpbiB3aXRoIGEKLSUgc3RhbmRhcmQgcGhyYXNlLiAgWW91IG1heSBhbHNvIGxpc3QgdGhlIGV4Y2VwdGlvbnMgYW5kIG90aGVyIGRhdGEKLSUgaXRlbXMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlLCBpbnNvZmFyIGFzIHRoZXkgYXJlIGltcG9ydGFudCBmb3IgdGhlCi0lIHVzZXIuCi0KLVRoZSBcbW9kdWxle3NwYW19IG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgotCi0lIC0tLS0gMy4xLiAtLS0tCi0lIEZvciBlYWNoIGZ1bmN0aW9uLCB1c2UgYSBgYGZ1bmNkZXNjJycgYmxvY2suICBUaGlzIGhhcyBleGFjdGx5IHR3bwotJSBwYXJhbWV0ZXJzIChlYWNoIHBhcmFtZXRlcnMgaXMgY29udGFpbmVkIGluIGEgc2V0IG9mIGN1cmx5IGJyYWNlcyk6Ci0lIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIGZ1bmN0aW9uIG5hbWUgKHRoaXMgYXV0b21hdGljYWxseQotJSBnZW5lcmF0ZXMgYW4gaW5kZXggZW50cnkpOyB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyB0aGUgZnVuY3Rpb24ncwotJSBhcmd1bWVudCBsaXN0LiAgSWYgdGhlcmUgYXJlIG5vIGFyZ3VtZW50cywgdXNlIGFuIGVtcHR5IHBhaXIgb2YKLSUgY3VybHkgYnJhY2VzLiAgSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCwgc2VwYXJhdGUgdGhlCi0lIGFyZ3VtZW50cyB3aXRoIGJhY2tzbGFzaC1jb21tYS4gIE9wdGlvbmFsIHBhcnRzIG9mIHRoZSBwYXJhbWV0ZXIKLSUgbGlzdCBhcmUgY29udGFpbmVkIGluIFxvcHRpb25hbHsuLi59ICh0aGlzIGdlbmVyYXRlcyBhIHNldCBvZiBzcXVhcmUKLSUgYnJhY2tldHMgYXJvdW5kIGl0cyBwYXJhbWV0ZXIpLiAgQXJndW1lbnRzIGFyZSBhdXRvbWF0aWNhbGx5IHNldCBpbgotJSBpdGFsaWNzIGluIHRoZSBwYXJhbWV0ZXIgbGlzdC4gIEVhY2ggYXJndW1lbnQgc2hvdWxkIGJlIG1lbnRpb25lZCBhdAotJSBsZWFzdCBvbmNlIGluIHRoZSBkZXNjcmlwdGlvbjsgZWFjaCB1c2FnZSAoZXZlbiBpbnNpZGUgXGNvZGV7Li4ufSkKLSUgc2hvdWxkIGJlIGVuY2xvc2VkIGluIFx2YXJ7Li4ufS4KLQotXGJlZ2lue2Z1bmNkZXNjfXtvcGVufXtmaWxlbmFtZVxvcHRpb25hbHssIG1vZGVcb3B0aW9uYWx7LCBidWZmZXJzaXplfX19Ci1PcGVuIHRoZSBmaWxlIFx2YXJ7ZmlsZW5hbWV9IGFzIGEgY2FuIG9mIFNwYW0uICBUaGUgb3B0aW9uYWwKLVx2YXJ7bW9kZX0gYW5kIFx2YXJ7YnVmZmVyc2l6ZX0gYXJndW1lbnRzIHNwZWNpZnkgdGhlIHJlYWQvd3JpdGUgbW9kZQotKFxjb2RleydyJ30gKGRlZmF1bHQpIG9yIFxjb2Rleyd3J30pIGFuZCB0aGUgYnVmZmVyIHNpemUgKGRlZmF1bHQ6Ci1zeXN0ZW0gZGVwZW5kZW50KS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLSUgLS0tLSAzLjIuIC0tLS0KLSUgRGF0YSBpdGVtcyBhcmUgZGVzY3JpYmVkIHVzaW5nIGEgYGBkYXRhZGVzYycnIGJsb2NrLiAgVGhpcyBoYXMgb25seQotJSBvbmUgcGFyYW1ldGVyOiB0aGUgaXRlbSdzIG5hbWUuCi0KLVxiZWdpbntkYXRhZGVzY317Y2Fuc2l6ZX0KLVRoZSBkZWZhdWx0IGNhbiBzaXplLCBpbiBvdW5jZXMuICBMZWdhbCB2YWx1ZXMgYXJlIDcgYW5kIDEyLiAgVGhlCi1kZWZhdWx0IHZhcmllcyBwZXIgc3VwZXJtYXJrZXQuICBUaGlzIHZhcmlhYmxlIHNob3VsZCBub3QgYmUgY2hhbmdlZAotb25jZSB0aGUgXGZ1bmN0aW9ue29wZW4oKX0gZnVuY3Rpb24gaGFzIGJlZW4gY2FsbGVkLgotXGVuZHtkYXRhZGVzY30KLQotJSAtLS0gMy4zLiAtLS0KLSUgRXhjZXB0aW9ucyBhcmUgZGVzY3JpYmVkIHVzaW5nIGEgYGBleGNkZXNjJycgYmxvY2suICBUaGlzIGhhcyBvbmx5Ci0lIG9uZSBwYXJhbWV0ZXI6IHRoZSBleGNlcHRpb24gbmFtZS4gIEV4Y2VwdGlvbnMgZGVmaW5lZCBhcyBjbGFzc2VzIGluCi0lIHRoZSBzb3VyY2UgY29kZSBzaG91bGQgYmUgZG9jdW1lbnRlZCB1c2luZyB0aGlzIGVudmlyb25tZW50LCBidXQKLSUgY29uc3RydWN0b3IgcGFyYW1ldGVycyBtdXN0IGJlIG9taXR0ZWQuCi0KLVxiZWdpbntleGNkZXNjfXtlcnJvcn0KLUV4Y2VwdGlvbiByYWlzZWQgd2hlbiBhbiBvcGVyYXRpb24gZmFpbHMgZm9yIGEgU3BhbSBzcGVjaWZpYyByZWFzb24uCi1UaGUgZXhjZXB0aW9uIGFyZ3VtZW50IGlzIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHJlYXNvbiBvZiB0aGUKLWZhaWx1cmUuCi1cZW5ke2V4Y2Rlc2N9Ci0KLSUgLS0tLSAzLjQuIC0tLS0KLSUgT3RoZXIgc3RhbmRhcmQgZW52aXJvbm1lbnRzOgotJQotJSAgY2xhc3NkZXNjCS0gUHl0aG9uIGNsYXNzZXM7IHNhbWUgYXJndW1lbnRzIGFyZSBmdW5jZGVzYwotJSAgbWV0aG9kZGVzYwktIG1ldGhvZHMsIGxpa2UgZnVuY2Rlc2MgYnV0IGhhcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgCi0lCQkgIHRvIGdpdmUgdGhlIHR5cGUgbmFtZTogXGJlZ2lue21ldGhvZGRlc2N9W215dHlwZV17bmFtZX17YXJnc30KLSUJCSAgQnkgZGVmYXVsdCwgdGhlIHR5cGUgbmFtZSB3aWxsIGJlIHRoZSBuYW1lIG9mIHRoZQotJQkJICBsYXN0IGNsYXNzIGRlZmluZWQgdXNpbmcgY2xhc3NkZXNjLiAgVGhlIHR5cGUgbmFtZQotJQkJICBpcyByZXF1aXJlZCBpZiB0aGUgdHlwZSBpcyBpbXBsZW1lbnRlZCBpbiBDIChiZWNhdXNlIAotJQkJICB0aGVyZSdzIG5vIGNsYXNzZGVzYykgb3IgaWYgdGhlIGNsYXNzIGlzbid0IGRpcmVjdGx5IAotJQkJICBkb2N1bWVudGVkIChpZiBpdCdzIHByaXZhdGUpLgotJSAgbWVtYmVyZGVzYwktIGRhdGEgbWVtYmVycywgbGlrZSBkYXRhZGVzYywgYnV0IHdpdGggYW4gb3B0aW9uYWwKLSUJCSAgdHlwZSBuYW1lIGxpa2UgbWV0aG9kZGVzYy4KLQotCi0lID09PT0gNC4gPT09PQotJSBOb3cgaXMgcHJvYmFibHkgYSBnb29kIHRpbWUgZm9yIGEgY29tcGxldGUgZXhhbXBsZS4gIChBbHRlcm5hdGl2ZWx5LAotJSBhbiBleGFtcGxlIGdpdmluZyB0aGUgZmxhdm9yIG9mIHRoZSBtb2R1bGUgbWF5IGJlIGdpdmVuIGJlZm9yZSB0aGUKLSUgZGV0YWlsZWQgbGlzdCBvZiBmdW5jdGlvbnMuKQotCi1cc3Vic2VjdGlvbntFeGFtcGxlIFxsYWJlbHtzcGFtLWV4YW1wbGV9fQotCi1UaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBvcGVuIGEgY2FuIG9mIHNwYW0gdXNpbmcgdGhlCi1cbW9kdWxle3NwYW19IG1vZHVsZS4KLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGltcG9ydCBzcGFtCi0+Pj4gY2FuID0gc3BhbS5vcGVuKCcvZXRjL3Bhc3N3ZCcpCi0+Pj4gY2FuLmVtcHR5KCkKLT4+PiBjYW4uY2xvc2UoKQotXGVuZHt2ZXJiYXRpbX0KLSUgTm90ZSB0aGF0IHRoZXJlIGlzIG5vIHRyYWlsaW5nICI+Pj4gIiBwcm9tcHQgc2hvd24uCi0KLSUgPT09PSA1LiA9PT09Ci0lIElmIHlvdXIgbW9kdWxlIGRlZmluZXMgbmV3IG9iamVjdCB0eXBlcyAoZm9yIGEgYnVpbHQtaW4gbW9kdWxlKSBvcgotJSBjbGFzc2VzIChmb3IgYSBtb2R1bGUgd3JpdHRlbiBpbiBQeXRob24pLCB5b3Ugc2hvdWxkIGxpc3QgdGhlCi0lIG1ldGhvZHMgYW5kIGluc3RhbmNlIHZhcmlhYmxlcyAoaWYgYW55KSBvZiBlYWNoIHR5cGUgb3IgY2xhc3MgaW4gYQotJSBzZXBhcmF0ZSBzdWJzZWN0aW9uLgotCi1cc3Vic2VjdGlvbntTcGFtIE9iamVjdHN9Ci1cbGFiZWx7c3BhbS1vYmplY3RzfQotJSBUaGlzIGxhYmVsIGlzIGdlbmVyYWxseSB1c2VmdWwgZm9yIHJlZmVyZW5jaW5nIHRoaXMgc2VjdGlvbiwgYnV0IGlzCi0lIGFsc28gdXNlZCB0byBnaXZlIGEgZmlsZW5hbWUgd2hlbiBnZW5lcmF0aW5nIEhUTUwuCi0KLVNwYW0gb2JqZWN0cywgYXMgcmV0dXJuZWQgYnkgXGZ1bmN0aW9ue29wZW4oKX0gYWJvdmUsIGhhdmUgdGhlCi1mb2xsb3dpbmcgbWV0aG9kczoKLQotXGJlZ2lue21ldGhvZGRlc2N9W3NwYW1de2VtcHR5fXt9Ci1FbXB0eSB0aGUgY2FuIGludG8gdGhlIHRyYXNoLgotXGVuZHttZXRob2RkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL3RlbXBsYXRlcy93aGF0c25ld1hZLnRleCBiL0RvYy90ZW1wbGF0ZXMvd2hhdHNuZXdYWS50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNjJiOWMuLjAwMDAwMDAKLS0tIGEvRG9jL3RlbXBsYXRlcy93aGF0c25ld1hZLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi1cZG9jdW1lbnRjbGFzc3tob3d0b30KLVx1c2VwYWNrYWdle2Rpc3R1dGlsc30KLSUgJElkJAotCi0lIFdoZW4gY3JlYXRpbmcgYSBuZXcgYGBXaGF0J3MgTmV3JycgZG9jdW1lbnQsIGNvcHkgdGhpcyB0bwotJSAuLi93aGF0c25ldy93aGF0c25ld1hZLnRleCwgd2hlcmUgWCBpcyByZXBsYWNlZCBieSB0aGUgbWFqb3IgdmVyc2lvbgotJSBudW1iZXIgYW5kIFksIGJ5IHRoZSBtaW5vciB2ZXJzaW9uIG51bWJlciBmb3IgdGhlIHJlbGVhc2Ugb2YgUHl0aG9uCi0lIGJlaW5nIGRlc2NyaWJlZC4KLSUKLSUgVGhlIGZvbGxvd2luZyByZXBsYWNlbWVudHMgbmVlZCB0byBiZSBtYWRlIGluIHRoZSB0ZXh0OgotJQotJSBYLlkgICAtLSB0aGUgdmVyc2lvbiBvZiBQeXRob24gdGhpcyBkb2N1bWVudCBkZXNjcmliZXMKLSUgWC5ZLTEgLS0gcHJldmlvdXMgbWlub3IgcmVsZWFzZSAobm90IGEgbWFpbnRlbmFuY2UgcmVsZWFzZSkKLSUgWC5ZLTIgLS0gbWlub3IgcmVsZWFzZSBiZWZvcmUgdGhhdCBvbmUgKG9wdGlvbmFsOyBzZWFyY2ggdGhlCi0lICAgICAgICAgIHRlbXBsYXRlIHRvIHNlZSB0aGUgdXNhZ2UKLSUKLSUgT25jZSBkb25lLCB3cml0ZSBhbmQgZWRpdCB0byB5b3VyIGhlYXJ0J3MgY29udGVudCEKLQotXHRpdGxle1doYXQncyBOZXcgaW4gUHl0aG9uIFguWX0KLVxyZWxlYXNlezAuMH0KLVxhdXRob3J7WW91bmcgQXV0aG9yfQotXGF1dGhvcmFkZHJlc3N7XGVtYWlse3lhQGV4YW1wbGUuY29tfX0KLQotXGJlZ2lue2RvY3VtZW50fQotXG1ha2V0aXRsZQotXHRhYmxlb2Zjb250ZW50cwotCi1UaGlzIGFydGljbGUgZXhwbGFpbnMgdGhlIG5ldyBmZWF0dXJlcyBpbiBQeXRob24gWC5ZLiAgTm8gcmVsZWFzZSBkYXRlCi1mb3IgUHl0aG9uIFguWSBoYXMgYmVlbiBzZXQ7IGV4cGVjdCB0aGF0IHRoaXMgd2lsbCBoYXBwZW4gbmV4dCB5ZWFyLgotCi0lIENvbXBhcmUgd2l0aCBwcmV2aW91cyByZWxlYXNlIGluIDIgLSAzIHNlbnRlbmNlcyBoZXJlLgotCi1UaGlzIGFydGljbGUgZG9lc24ndCBhdHRlbXB0IHRvIHByb3ZpZGUgYSBjb21wbGV0ZSBzcGVjaWZpY2F0aW9uIG9mCi10aGUgbmV3IGZlYXR1cmVzLCBidXQgaW5zdGVhZCBwcm92aWRlcyBhIGNvbnZlbmllbnQgb3ZlcnZpZXcuICBGb3IKLWZ1bGwgZGV0YWlscywgeW91IHNob3VsZCByZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgUHl0aG9uIFguWS4KLSUgYWRkIGh5cGVybGluayB3aGVuIHRoZSBkb2N1bWVudGF0aW9uIGJlY29tZXMgYXZhaWxhYmxlIG9ubGluZS4KLUlmIHlvdSB3YW50IHRvIHVuZGVyc3RhbmQgdGhlIGNvbXBsZXRlIGltcGxlbWVudGF0aW9uIGFuZCBkZXNpZ24KLXJhdGlvbmFsZSwgcmVmZXIgdG8gdGhlIFBFUCBmb3IgYSBwYXJ0aWN1bGFyIG5ldyBmZWF0dXJlLgotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSUgTGFyZ2UsIFBFUC1sZXZlbCBmZWF0dXJlcyBhbmQgY2hhbmdlcyBzaG91bGQgYmUgZGVzY3JpYmVkIGhlcmUuCi0KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue090aGVyIExhbmd1YWdlIENoYW5nZXN9Ci0KLUhlcmUgYXJlIGFsbCBvZiB0aGUgY2hhbmdlcyB0aGF0IFB5dGhvbiBYLlkgbWFrZXMgdG8gdGhlIGNvcmUgUHl0aG9uCi1sYW5ndWFnZS4KLQotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSBUQkQKLQotXGVuZHtpdGVtaXplfQotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc3Vic2VjdGlvbntPcHRpbWl6YXRpb25zfQotCi1cYmVnaW57aXRlbWl6ZX0KLQotXGl0ZW0gT3B0aW1pemF0aW9ucyBzaG91bGQgYmUgZGVzY3JpYmVkIGhlcmUuCi0KLVxlbmR7aXRlbWl6ZX0KLQotVGhlIG5ldCByZXN1bHQgb2YgdGhlIFguWSBvcHRpbWl6YXRpb25zIGlzIHRoYXQgUHl0aG9uIFguWSBydW5zIHRoZQotcHlzdG9uZSBiZW5jaG1hcmsgYXJvdW5kIFhYXCUgZmFzdGVyIHRoYW4gUHl0aG9uIFguWS0xLiUKLSUgb25seSB1c2UgdGhlIG5leHQgbGluZSBpZiB5b3Ugd2FudCB0byBkbyB0aGUgZXh0cmEgd29yayA7KSA6Ci0lIGFuZCBZWVwlIGZhc3RlciB0aGFuIFB5dGhvbiBYLlktMi4KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257TmV3LCBJbXByb3ZlZCwgYW5kIERlcHJlY2F0ZWQgTW9kdWxlc30KLQotQXMgdXN1YWwsIFB5dGhvbidzIHN0YW5kYXJkIGxpYnJhcnkgcmVjZWl2ZWQgYSBudW1iZXIgb2YgZW5oYW5jZW1lbnRzIGFuZAotYnVnIGZpeGVzLiAgSGVyZSdzIGEgcGFydGlhbCBsaXN0IG9mIHRoZSBtb3N0IG5vdGFibGUgY2hhbmdlcywgc29ydGVkCi1hbHBoYWJldGljYWxseSBieSBtb2R1bGUgbmFtZS4gQ29uc3VsdCB0aGUKLVxmaWxle01pc2MvTkVXU30gZmlsZSBpbiB0aGUgc291cmNlIHRyZWUgZm9yIGEgbW9yZQotY29tcGxldGUgbGlzdCBvZiBjaGFuZ2VzLCBvciBsb29rIHRocm91Z2ggdGhlIENWUyBsb2dzIGZvciBhbGwgdGhlCi1kZXRhaWxzLgotCi1cYmVnaW57aXRlbWl6ZX0KLQotXGl0ZW0gRGVzY3JpcHRpb25zIGdvIGhlcmUuCi0KLVxlbmR7aXRlbWl6ZX0KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotJSB3aG9sZSBuZXcgbW9kdWxlcyBnZXQgZGVzY3JpYmVkIGluIFxzdWJzZWN0aW9ucyBoZXJlCi0KLQotJSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntCdWlsZCBhbmQgQyBBUEkgQ2hhbmdlc30KLQotQ2hhbmdlcyB0byBQeXRob24ncyBidWlsZCBwcm9jZXNzIGFuZCB0byB0aGUgQyBBUEkgaW5jbHVkZToKLQotXGJlZ2lue2l0ZW1pemV9Ci0KLVxpdGVtIERldGFpbGVkIGNoYW5nZXMgYXJlIGxpc3RlZCBoZXJlLgotCi1cZW5ke2l0ZW1pemV9Ci0KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzdWJzZWN0aW9ue1BvcnQtU3BlY2lmaWMgQ2hhbmdlc30KLQotUGxhdGZvcm0tc3BlY2lmaWMgY2hhbmdlcyBnbyBoZXJlLgotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntPdGhlciBDaGFuZ2VzIGFuZCBGaXhlcyBcbGFiZWx7c2VjdGlvbi1vdGhlcn19Ci0KLUFzIHVzdWFsLCB0aGVyZSB3ZXJlIGEgYnVuY2ggb2Ygb3RoZXIgaW1wcm92ZW1lbnRzIGFuZCBidWdmaXhlcwotc2NhdHRlcmVkIHRocm91Z2hvdXQgdGhlIHNvdXJjZSB0cmVlLiAgQSBzZWFyY2ggdGhyb3VnaCB0aGUgQ1ZTIGNoYW5nZQotbG9ncyBmaW5kcyB0aGVyZSB3ZXJlIFhYWCBwYXRjaGVzIGFwcGxpZWQgYW5kIFlZWSBidWdzIGZpeGVkIGJldHdlZW4KLVB5dGhvbiBYLlktMSBhbmQgWC5ZLiAgQm90aCBmaWd1cmVzIGFyZSBsaWtlbHkgdG8gYmUgdW5kZXJlc3RpbWF0ZXMuCi0KLVNvbWUgb2YgdGhlIG1vcmUgbm90YWJsZSBjaGFuZ2VzIGFyZToKLQotXGJlZ2lue2l0ZW1pemV9Ci0KLVxpdGVtIERldGFpbHMgZ28gaGVyZS4KLQotXGVuZHtpdGVtaXplfQotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntQb3J0aW5nIHRvIFB5dGhvbiBYLll9Ci0KLVRoaXMgc2VjdGlvbiBsaXN0cyBwcmV2aW91c2x5IGRlc2NyaWJlZCBjaGFuZ2VzIHRoYXQgbWF5IHJlcXVpcmUKLWNoYW5nZXMgdG8geW91ciBjb2RlOgotCi1cYmVnaW57aXRlbWl6ZX0KLQotXGl0ZW0gRXZlcnl0aGluZyBpcyBhbGwgaW4gdGhlIGRldGFpbHMhCi0KLVxlbmR7aXRlbWl6ZX0KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257QWNrbm93bGVkZ2VtZW50cyBcbGFiZWx7YWNrc319Ci0KLVRoZSBhdXRob3Igd291bGQgbGlrZSB0byB0aGFuayB0aGUgZm9sbG93aW5nIHBlb3BsZSBmb3Igb2ZmZXJpbmcKLXN1Z2dlc3Rpb25zLCBjb3JyZWN0aW9ucyBhbmQgYXNzaXN0YW5jZSB3aXRoIHZhcmlvdXMgZHJhZnRzIG9mIHRoaXMKLWFydGljbGU6IC4KLQotXGVuZHtkb2N1bWVudH0KZGlmZiAtLWdpdCBhL0RvYy90ZXN0cy9tYXRoLnRleCBiL0RvYy90ZXN0cy9tYXRoLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE4ODBlNS4uMDAwMDAwMAotLS0gYS9Eb2MvdGVzdHMvbWF0aC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1cZG9jdW1lbnRjbGFzc3tob3d0b30KLQotXHRpdGxle1Rlc3Qgb2YgcHl0aG9uLnN0eSB3aXRoIG1hdGh9Ci0KLVxiZWdpbntkb2N1bWVudH0KLQotXG1ha2V0aXRsZQotCi1cc2VjdGlvbntTdWJzY3JpcHRzIGluIE1hdGggTW9kZX0KLQotVGhpcyBjb250YWlucyBhbiBpbmxpbmUgZm9ybXVsYSBjb250YWluaW5nIGEgc3Vic2NyaXB0OiAkSF8yMCQuCi1UaGlzIGRpc3BsYXkgZG9lc24ndCBtYWtlIHNlbnNlLCBidXQgY29udGFpbnMgYSBzdWJzY3JpcHQgYXMgd2VsbDoKLQotJCRcc3VtXzFeMiA9IGFfeCQkCi0KLVxlbmR7ZG9jdW1lbnR9CmRpZmYgLS1naXQgYS9Eb2MvdGV4aW5wdXRzL2Rpc3R1dGlscy5zdHkgYi9Eb2MvdGV4aW5wdXRzL2Rpc3R1dGlscy5zdHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZTJlZDEuLjAwMDAwMDAKLS0tIGEvRG9jL3RleGlucHV0cy9kaXN0dXRpbHMuc3R5CisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotJQotJSBMYVRlWCBjb21tYW5kcyBhbmQgbWFjcm9zIG5lZWRlZCBmb3IgdGhlIHR3byBEaXN0dXRpbHMgbWFudWFscywKLSUgaW5zdC50ZXggYW5kIGRpc3QudGV4LgotJQotJSAkSWQkCi0lCi0KLSUgTXkgZ3JpcGUgbGlzdCBhYm91dCB0aGUgUHl0aG9uIHN0eWxlIGZpbGVzOgotJSAgKiBJIHdhbnQgaXRhbGljcyBpbiB2ZXJiYXRpbSBlbnZpcm9ubWVudHMgZm9yIHZhcmlhYmxlCi0lICAgIHRleHQgKHZlcmJhdGltLnN0eT8pCi0lICAqIEkgaGF0ZSBlc2NhcGluZyB1bmRlcnNjb3JlcyAodXJsLnN0eSBmaXhlcyB0aGlzKQotCi0lICdcY29tbWFuZCcgaXMgZm9yIERpc3R1dGlscyBjb21tYW5kcyB3aGljaCwgZGVwZW5kaW5nIG9uIHlvdXIKLSUgcGVyc3BlY3RpdmUsIGFyZSBqdXN0IGFyZ3VtZW50cyB0byB0aGUgc2V0dXAgc2NyaXB0LCBvciBzdWItCi0lIGNvbW1hbmRzIG9mIHRoZSBzZXR1cCBzY3JpcHQsIG9yIHRoZSBjbGFzc2VzIHRoYXQgaW1wbGVtZW50Ci0lIGVhY2ggImNvbW1hbmQiLgotXG5ld2NvbW1hbmR7XGNvbW1hbmR9WzFde1xjb2RleyMxfX0KLQotJSAnXG9wdGlvbicgaXMgZm9yIERpc3R1dGlscyBvcHRpb25zICppbiogdGhlIHNldHVwIHNjcmlwdC4gIENvbW1hbmQtCi0lIGxpbmUgb3B0aW9ucyAqdG8qIHRoZSBzZXR1cCBzY3JpcHQgYXJlIG1hcmtlZCB1cCBpbiB0aGUgdXN1YWwKLSUgd2F5LCBpZS4gd2l0aCAnXHByb2dyYW1vcHQnIG9yICdcbG9uZ3Byb2dyYW1vcHQnCi1cbmV3Y29tbWFuZHtcb3B0aW9ufVsxXXtcdGV4dHNme1xzbWFsbHsjMX19fQotCi0lICdcZmlsZXZhcicgaXMgZm9yIHZhcmlhYmxlIGNvbXBvbmVudHMgb2YgZmlsZS9wYXRoIG5hbWVzIC0tIGVnLgotJSB3aGVuIHlvdSBwdXQgJ3ByZWZpeCcgaW4gYSBwYXRobmFtZSwgeW91IG1hcmsgaXQgdXAgd2l0aAotJSAnXGZpbGV2YXInIHNvIHRoYXQgaXQgc3RpbGwgbG9va3MgcGF0aG5hbWUtaXNoLCBidXQgaXMKLSUgZGlzdGluZ3Vpc2hlZCBmcm9tIHRoZSBsaXRlcmFsIHBhcnQgb2YgdGhlIHBhdGguICBGcmVkIHNheXMKLSUgdGhpcyBjYW4gYmUgYWNjb21wbGlzaGVkIGp1c3QgZmluZSB3aXRoICdcdmFyJywgYnV0IEkgdmlvbGVudGx5Ci0lIGRpc2FncmVlLiAgUGlzdG9scyBhdCBkYXduIHdpbGwgc29ydCB0aGlzIG9uZSBvdXQuCi1cbmV3Y29tbWFuZHtcZmlsZXZhcn1bMV17e1x0ZXh0c2x7XGZpbGVucXsjMX19fX0KLQotJSBKdXN0IHdoaWxlIHRoZSBjb2RlIGFuZCBkb2NzIGFyZSBzdGlsbCB1bmRlciBkZXZlbG9wbWVudC4KLVxuZXdjb21tYW5ke1xYWFh9WzFde1x0ZXh0YmZ7KiojMSoqfX0KZGlmZiAtLWdpdCBhL0RvYy90ZXhpbnB1dHMvZmFuY3loZHIuc3R5IGIvRG9jL3RleGlucHV0cy9mYW5jeWhkci5zdHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMDI2ZTkuLjAwMDAwMDAKLS0tIGEvRG9jL3RleGlucHV0cy9mYW5jeWhkci5zdHkKKysrIC9kZXYvbnVsbApAQCAtMSwzMjkgKzAsMCBAQAotJSBmYW5jeWhkci5zdHkgdmVyc2lvbiAxLjk5ZAotJSBGYW5jeSBoZWFkZXJzIGFuZCBmb290ZXJzIGZvciBMYVRlWC4KLSUgUGlldCB2YW4gT29zdHJ1bSwgRGVwdCBvZiBDb21wdXRlciBTY2llbmNlLCBVbml2ZXJzaXR5IG9mIFV0cmVjaHQKLSUgUGFkdWFsYWFuIDE0LCBQLk8uIEJveCA4MC4wODksIDM1MDggVEIgVXRyZWNodCwgVGhlIE5ldGhlcmxhbmRzCi0lIFRlbGVwaG9uZTogKzMxIDMwIDI1MzIxODAuIEVtYWlsOiBwaWV0QGNzLnJ1dS5ubAotJSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSUgTElDRU5DRTogVGhpcyBpcyBmcmVlIHNvZnR3YXJlLiBZb3UgYXJlIGFsbG93ZWQgdG8gdXNlIGFuZCBkaXN0cmlidXRlCi0lIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB5b3UgbGlrZS4gWW91IGFyZSBhbHNvIGFsbG93ZWQgdG8gbWFrZSBtb2RpZmllZAotJSB2ZXJzaW9ucyBvZiBpdCwgYnV0IHlvdSBjYW4gZGlzdHJpYnV0ZSBhIG1vZGlmaWVkIHZlcnNpb24gb25seSBpZiB5b3UKLSUgY2xlYXJseSBpbmRpY2F0ZSB0aGF0IGl0IGlzIGEgbW9kaWZpZWQgdmVyc2lvbiBhbmQgdGhlIHBlcnNvbihzKSB3aG8KLSUgbW9kaWZpZWQgaXQuIFRoaXMgaW5kaWNhdGlvbiBzaG91bGQgYmUgaW4gYSBwcm9taW5lbnQgcGxhY2UsIGUuZy4gaW4gdGhlCi0lIHRvcCBvZiB0aGUgZmlsZS4gSWYgcG9zc2libGUgYSBjb250YWN0IGFkZHJlc3MsIHByZWZlcmFibHkgYnkgZW1haWwsCi0lIHNob3VsZCBiZSBnaXZlbiBmb3IgdGhlc2UgcGVyc29ucy4gSWYgdGhhdCBpcyBmZWFzaWJsZSB0aGUgbW9kaWZpY2F0aW9ucwotJSBzaG91bGQgYmUgaW5kaWNhdGVkIGluIHRoZSBzb3VyY2UgY29kZS4KLSUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0lIE1PRElGSUNBVElPTiBISVNUT1JZOgotJSBTZXAgMTYsIDE5OTQKLSUgdmVyc2lvbiAxLjQ6IENvcnJlY3Rpb24gZm9yIHVzZSB3aXRoIFxyZXZlcnNlbWFyZ2luCi0lIFNlcCAyOSwgMTk5NDoKLSUgdmVyc2lvbiAxLjU6IEFkZGVkIHRoZSBcaWZ0b3BmbG9hdCwgXGlmYm90ZmxvYXQgYW5kIFxpZmZsb2F0cGFnZSBjb21tYW5kcwotJSBPY3QgNCwgMTk5NDoKLSUgdmVyc2lvbiAxLjY6IFJlc2V0IHNpbmdsZSBzcGFjaW5nIGluIGhlYWRlcnMvZm9vdGVycyBmb3IgdXNlIHdpdGgKLSUgc2V0c3BhY2Uuc3R5IG9yIGRvdWJsZXNwYWNlLnN0eQotJSBPY3QgNCwgMTk5NDoKLSUgdmVyc2lvbiAxLjc6IGNoYW5nZWQgXGxldFxAbWtib3RoXG1hcmtib3RoIHRvCi0lIFxkZWZcQG1rYm90aHtccHJvdGVjdFxtYXJrYm90aH0gdG8gbWFrZSBpdCBtb3JlIHJvYnVzdAotJSBEZWMgNSwgMTk5NDoKLSUgdmVyc2lvbiAxLjg6IGNvcnJlY3Rpb25zIGZvciBhbXNib29rL2Ftc2FydDogZGVmaW5lIFxAY2hhcGFwcCBhbmQgKG1vcmUKLSUgaW1wb3J0YW50bHkpIHVzZSB0aGUgXGNoYXB0ZXIvc2VjdGlvbm1hcmsgZGVmaW5pdGlvbnMgZnJvbSBwc0BoZWFkaW5ncyBpZgotJSB0aGV5IGV4aXN0ICh3aGljaCBzaG91bGQgYmUgdHJ1ZSBmb3IgYWxsIHN0YW5kYXJkIGNsYXNzZXMpLgotJSBNYXkgMzEsIDE5OTU6Ci0lIHZlcnNpb24gMS45OiBUaGUgcHJvcG9zZWQgXHJlbmV3Y29tbWFuZHtcaGVhZHJ1bGV3aWR0aH17XGlmZmxvYXRwYWdlLi4uCi0lIGNvbnN0cnVjdGlvbiBpbiB0aGUgZG9jIGRpZCBub3Qgd29yayBwcm9wZXJseSB3aXRoIHRoZSBmYW5jeXBsYWluIHN0eWxlLiAKLSUgSnVuZSAxLCAxOTk1OgotJSB2ZXJzaW9uIDEuOTE6IFRoZSBkZWZpbml0aW9uIG9mIFxAbWtib3RoIHdhc24ndCByZXN0b3JlZCBvbiBzdWJzZXF1ZW50Ci0lIFxwYWdlc3R5bGV7ZmFuY3l9J3MuCi0lIEp1bmUgMSwgMTk5NToKLSUgdmVyc2lvbiAxLjkyOiBUaGUgc2VxdWVuY2UgXHBhZ2VzdHlsZXtmYW5jeXBsYWlufSBccGFnZXN0eWxle3BsYWlufQotJSBccGFnZXN0eWxle2ZhbmN5fSB3b3VsZCBlcnJvbmVvdXNseSBzZWxlY3QgdGhlIHBsYWluIHZlcnNpb24uCi0lIEp1bmUgMSwgMTk5NToKLSUgdmVyc2lvbiAxLjkzOiBcZmFuY3lwYWdlc3R5bGUgY29tbWFuZCBhZGRlZC4KLSUgRGVjIDExLCAxOTk1OgotJSB2ZXJzaW9uIDEuOTQ6IHN1Z2dlc3RlZCBieSBDb25yYWQgSHVnaGVzIDxjaHVnaGVzQG1hdGhzLnRjZC5pZT4KLSUgQ0pDSCwgRGVjIDExLCAxOTk1OiBhZGRlZCBcZm9vdHJ1bGVza2lwIHRvIGFsbG93IGNvbnRyb2wgb3ZlciBmb290cnVsZQotJSBwb3NpdGlvbiAob2xkIGhhcmRjb2RlZCB2YWx1ZSBvZiAuM1xub3JtYWxiYXNlbGluZXNraXAgaXMgZmFyIHRvbyBoaWdoCi0lIHdoZW4gdXNlZCB3aXRoIHZlcnkgc21hbGwgZm9vdGVyIGZvbnRzKS4KLSUgSmFuIDMxLCAxOTk2OgotJSB2ZXJzaW9uIDEuOTU6IGNhbGwgXEBub3JtYWxzaXplIGluIHRoZSByZXNldCBjb2RlIGlmIHRoYXQgaXMgZGVmaW5lZCwKLSUgb3RoZXJ3aXNlIFxub3JtYWxzaXplLgotJSB0aGlzIGlzIHRvIHNvbHZlIGEgcHJvYmxlbSB3aXRoIHVjdGhlc2lzLmNscywgYXMgdGhpcyBkb2Vzbid0Ci0lIGRlZmluZSBcQGN1cnJzaXplLiBVbmZvcnR1bmF0ZWx5IGZvciBsYXRleDIwOSBjYWxsaW5nIFxub3JtYWxzaXplIGRvZXNuJ3QKLSUgd29yayBhcyB0aGlzIGlzIG9wdGltaXplZCB0byBkbyB2ZXJ5IGxpdHRsZSwgc28gdGhlcmUgXEBub3JtYWxzaXplIHNob3VsZAotJSBiZSBjYWxsZWQuIEhvcGVmdWxseSB0aGlzIGNvZGUgd29ya3MgZm9yIGFsbCB2ZXJzaW9ucyBvZiBMYVRlWCBrbm93biB0bwotJSBtYW5raW5kLiAgCi0lIEFwcmlsIDI1LCAxOTk2OgotJSB2ZXJzaW9uIDEuOTY6IGluaXRpYWxpemUgXGhlYWR3aWR0aCB0byBhIG1hZ2ljIChuZWdhdGl2ZSkgdmFsdWUgdG8gY2F0Y2gKLSUgbW9zdCBjb21tb24gY2FzZXMgdGhhdCBwZW9wbGUgY2hhbmdlIGl0IGJlZm9yZSBjYWxsaW5nIFxwYWdlc3R5bGV7ZmFuY3l9LgotJSBOb3RlIGl0IGNhbid0IGJlIGluaXRpYWxpemVkIHdoZW4gcmVhZGluZyBpbiB0aGlzIGZpbGUsIGJlY2F1c2UKLSUgXHRleHR3aWR0aCBjb3VsZCBiZSBjaGFuZ2VkIGFmdGVyd2FyZHMuIFRoaXMgaXMgcXVpdGUgcHJvYmFibGUuCi0lIFdlIGFsc28gc3dpdGNoIHRvIFxNYWtlVXBwZXJjYXNlIHJhdGhlciB0aGFuIFx1cHBlcmNhc2UgYW5kIGludHJvZHVjZSBhCi0lIFxub3VwcGVyY2FzZSBjb21tYW5kIGZvciB1c2UgaW4gaGVhZGVycy4gYW5kIGZvb3RlcnMuCi0lIE1heSAzLCAxOTk2OgotJSB2ZXJzaW9uIDEuOTc6IFR3byBjaGFuZ2VzOgotJSAxLiBVbmRvIHRoZSBjaGFuZ2UgaW4gdmVyc2lvbiAxLjggKHVzaW5nIHRoZSBwYWdlc3R5bGV7aGVhZGluZ3N9IGRlZmF1bHRzCi0lIGZvciB0aGUgY2hhcHRlciBhbmQgc2VjdGlvbiBtYXJrcy4gVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBhbXNib29rIGFuZAotJSBhbXNhcnQgY2xhc3NlcyBkb24ndCBzZWVtIHRvIG5lZWQgdGhlbSBhbnltb3JlLiBNb3Jlb3ZlciB0aGUgc3RhbmRhcmQKLSUgbGF0ZXggY2xhc3NlcyBkb24ndCB1c2UgXG1hcmtib3RoIGlmIHR3b3NpZGUgaXNuJ3Qgc2VsZWN0ZWQsIGFuZCB0aGlzIGlzCi0lIGNvbmZ1c2luZyBhcyBcbGVmdG1hcmsgZG9lc24ndCB3b3JrIGFzIGV4cGVjdGVkLgotJSAyLiBpbmNsdWRlIGEgY2FsbCB0byBccHNAZW1wdHkgaW4gcHNAQGZhbmN5LiBUaGlzIGlzIHRvIHNvbHZlIGEgcHJvYmxlbQotJSBpbiB0aGUgYW1zYm9vayBhbmQgYW1zYXJ0IGNsYXNzZXMsIHRoYXQgbWFrZSBnbG9iYWwgY2hhbmdlcyB0byBcdG9wc2tpcCwKLSUgd2hpY2ggYXJlIHJlc2V0IGluIFxwc0BlbXB0eS4gSG9wZWZ1bGx5IHRoaXMgZG9lc24ndCBicmVhayBvdGhlciB0aGluZ3MuCi0lIE1heSA3LCAxOTk2OgotJSB2ZXJzaW9uIDEuOTg6Ci0lIEFkZGVkICUgYWZ0ZXIgdGhlIGxpbmUgIFxkZWZcbm91cHBlcmNhc2UKLSUgTWF5IDcsIDE5OTY6Ci0lIHZlcnNpb24gMS45OTogVGhpcyBpcyB0aGUgYWxwaGEgdmVyc2lvbiBvZiBmYW5jeWhkciAyLjAKLSUgSW50cm9kdWNlZCB0aGUgbmV3IGNvbW1hbmRzIFxmYW5jeWhlYWQsIFxmYW5jeWZvb3QsIGFuZCBcZmFuY3loZi4KLSUgQ2hhbmdlZCBcaGVhZHJ1bGV3aWR0aCwgXGZvb3RydWxld2lkdGgsIFxmb290cnVsZXNraXAgdG8KLSUgbWFjcm9zIHJhdGhlciB0aGFuIGxlbmd0aCBwYXJhbWV0ZXJzLCBJbiB0aGlzIHdheSB0aGV5IGNhbiBiZQotJSBjb25kaXRpb25hbGl6ZWQgYW5kIHRoZXkgZG9uJ3QgY29uc3VtZSBsZW5ndGggcmVnaXN0ZXJzLiBUaGVyZSBpcyBubyBuZWVkCi0lIHRvIGhhdmUgdGhlbSBhcyBsZW5ndGggcmVnaXN0ZXJzIHVubGVzcyB5b3Ugd2FudCB0byBkbyBjYWxjdWxhdGlvbnMgd2l0aAotJSB0aGVtLCB3aGljaCBpcyB1bmxpa2VseS4gTm90ZSB0aGF0IHRoaXMgbWF5IG1ha2Ugc29tZSB1c2VzIG9mIHRoZW0KLSUgaW5jb21wYXRpYmxlIChpLmUuIGlmIHlvdSBoYXZlIGEgZmlsZSB0aGF0IHVzZXMgXHNldGxlbmd0aCBvciBceHh4eD0pCi0lIE1heSAxMCwgMTk5NjoKLSUgdmVyc2lvbiAxLjk5YToKLSUgQWRkZWQgYSBmZXcgbW9yZSAlIHNpZ25zCi0lIE1heSAxMCwgMTk5NjoKLSUgdmVyc2lvbiAxLjk5YjoKLSUgQ2hhbmdlZCB0aGUgc3ludGF4IG9mIFxmQG5mb3IgdG8gYmUgcmVzaXN0ZW50IHRvIGNhdGNvZGUgY2hhbmdlcyBvZiA6PQotJSBSZW1vdmVkIHRoZSBbMV0gZnJvbSB0aGUgZGVmcyBvZiBcbGhlYWQgZXRjLiBiZWNhdXNlIHRoZSBwYXJhbWV0ZXIgaXMKLSUgY29uc3VtZWQgYnkgdGhlIFxAW3h5XWxoZWFkIGV0Yy4gbWFjcm9zLgotJSBKdW5lIDI0LCAxOTk3OgotJSB2ZXJzaW9uIDEuOTljOgotJSBjb3JyZWN0ZWQgXG5vdXBwZXJjYXNlIHRvIGFsc28gaW5jbHVkZSB0aGUgcHJvdGVjdGVkIGZvcm0gb2YgXE1ha2VVcHBlcmNhc2UKLSUgXGdsb2JhbCBhZGRlZCB0byBtYW5pcHVsYXRpb24gb2YgXGhlYWR3aWR0aC4KLSUgXGlmZm9vdG5vdGUgY29tbWFuZCBhZGRlZC4KLSUgU29tZSBjb21tZW50cyBhZGRlZCBhYm91dCBcQGZhbmN5aGVhZCBhbmQgXEBmYW5jeWZvb3QuCi0lIEF1ZyAyNCwgMTk5OAotJSB2ZXJzaW9uIDEuOTlkCi0lIENoYW5nZWQgdGhlIGRlZmF1bHQgXHBzQGVtcHR5IHRvIFxwc0BAZW1wdHkgaW4gb3JkZXIgdG8gYWxsb3cKLSUgXGZhbmN5cGFnZXN0eWxle2VtcHR5fSByZWRlZmluaXRpb24uCi0KLVxsZXRcZmFuY3lAZGVmXGdkZWYKLQotXGRlZlxpZkBtcHR5IzEjMiMze1xkZWZcdGVtcEB0eXsjMX1caWZ4XEBlbXB0eVx0ZW1wQHR5ICMyXGVsc2UjM1xmaX0KLQotJSBVc2FnZTogXEBmb3JjIFx2YXJ7Y2hhcnN0cmluZ317Y29tbWFuZCB0byBiZSBleGVjdXRlZCBmb3IgZWFjaCBjaGFyfQotJSBUaGlzIGlzIHNpbWlsYXIgdG8gTGFUZVgncyBcQHRmb3IsIGJ1dCBleHBhbmRzIHRoZSBjaGFyc3RyaW5nLgotCi1cZGVmXEBmb3JjIzEjMiMze1xleHBhbmRhZnRlclxmQHJjXGV4cGFuZGFmdGVyIzFcZXhwYW5kYWZ0ZXJ7IzJ9eyMzfX0KLVxkZWZcZkByYyMxIzIjM3tcZGVmXHRlbXBAdHl7IzJ9XGlmeFxAZW1wdHlcdGVtcEB0eVxlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcZkBAcmMjMSMyXGZAQHJjeyMzfVxmaX0KLVxkZWZcZkBAcmMjMSMyIzNcZkBAcmMjNHtcZGVmIzF7IzJ9IzRcZkByYyMxeyMzfXsjNH19Ci0KLSUgVXNhZ2U6IFxmQG5mb3JcbmFtZTo9bGlzdFxkb3tib2R5fQotJSBMaWtlIExhVGVYJ3MgXEBmb3IgYnV0IGFuIGVtcHR5IGxpc3QgaXMgdHJlYXRlZCBhcyBhIGxpc3Qgd2l0aCBhbiBlbXB0eQotJSBlbGVtZW50Ci0KLVxuZXdjb21tYW5ke1xmQG5mb3J9WzNde1xlZGVmXEBmb3J0bXB7IzJ9JQotICAgIFxleHBhbmRhZnRlclxAZm9ybG9vcCMyLFxAbmlsLFxAbmlsXEBAIzF7IzN9fQotCi0lIFVzYWdlOiBcZGVmQHVsdCBcY3N7ZGVmYXVsdHN9e2FyZ3VtZW50fQotJSBzZXRzIFxjcyB0byB0aGUgY2hhcmFjdGVycyBmcm9tIGRlZmF1bHRzIGFwcGVhcmluZyBpbiBhcmd1bWVudAotJSBvciBkZWZhdWx0cyBpZiBpdCB3b3VsZCBiZSBlbXB0eS4gQWxsIGNoYXJhY3RlcnMgYXJlIGxvd2VyY2FzZWQuCi0KLVxuZXdjb21tYW5kXGRlZkB1bHRbM117JQotICAgIFxlZGVmXHRlbXBAYXtcbG93ZXJjYXNle1xlZGVmXG5vZXhwYW5kXHRlbXBAYXsjM319fVx0ZW1wQGEKLSAgICBcZGVmIzF7fSUKLSAgICBcQGZvcmNcdG1wZkByYXsjMn0lCi0gICAgICAgIHtcZXhwYW5kYWZ0ZXJcaWZAaW5cdG1wZkByYVx0ZW1wQGF7XGVkZWYjMXsjMVx0bXBmQHJhfX17fX0lCi0gICAgXGlmeFxAZW1wdHkjMVxkZWYjMXsjMn1cZml9Ci0lIAotJSBcaWZAaW4gPGNoYXI+PHNldD48dHJ1ZWNhc2U+PGZhbHNlY2FzZT4KLSUKLVxuZXdjb21tYW5ke1xpZkBpbn1bNF17JQotICAgIFxlZGVmXHRlbXBAYXsjMn1cZGVmXHRlbXBAYiMjMSMxIyMyXHRlbXBAYntcZGVmXHRlbXBAYnsjIzF9fSUKLSAgICBcZXhwYW5kYWZ0ZXJcdGVtcEBiIzIjMVx0ZW1wQGJcaWZ4XHRlbXBAYVx0ZW1wQGIgIzRcZWxzZSAjM1xmaX0KLQotXG5ld2NvbW1hbmR7XGZhbmN5aGVhZH17XEBpZm5leHRjaGFyW3tcZkBuY3loZiBofXtcZkBuY3loZiBoW119fQotXG5ld2NvbW1hbmR7XGZhbmN5Zm9vdH17XEBpZm5leHRjaGFyW3tcZkBuY3loZiBmfXtcZkBuY3loZiBmW119fQotXG5ld2NvbW1hbmR7XGZhbmN5aGZ9e1xAaWZuZXh0Y2hhclt7XGZAbmN5aGYge319e1xmQG5jeWhmIHt9W119fQotCi0lIFRoZSBoZWFkZXIgYW5kIGZvb3RlciBmaWVsZHMgYXJlIHN0b3JlZCBpbiBjb21tYW5kIHNlcXVlbmNlcyB3aXRoCi0lIG5hbWVzIG9mIHRoZSBmb3JtOiBcZkBuY3k8eD48eT48ej4gd2l0aCA8eD4gZm9yIFtlb10sIDx5PiBmb3JtIFtsY3JdCi0lIGFuZCA8ej4gZnJvbSBbaGZdLgotCi1cZGVmXGZAbmN5aGYjMVsjMl0jM3slCi0gICAgXGRlZlx0ZW1wQGN7fSUKLSAgICBcQGZvcmNcdG1wZkByYXsjMn0lCi0gICAgICAgIHtcZXhwYW5kYWZ0ZXJcaWZAaW5cdG1wZkByYXtlb2xjcmhmLEVPTENSSEZ9JQotICAgICAgICAgICAge317XGVkZWZcdGVtcEBje1x0ZW1wQGNcdG1wZkByYX19fSUKLSAgICBcaWZ4XEBlbXB0eVx0ZW1wQGNcZWxzZQotICAgICAgICBcaWZ4XFBhY2thZ2VFcnJvclx1bmRlZmluZWQKLSAgICAgICAgXGVycm1lc3NhZ2V7SWxsZWdhbCBjaGFyIGBcdGVtcEBjJyBpbiBmYW5jeWhkciBhcmd1bWVudDoKLSAgICAgICAgICBbIzJdfVxlbHNlCi0gICAgICAgIFxQYWNrYWdlRXJyb3J7RmFuY3loZHJ9e0lsbGVnYWwgY2hhciBgXHRlbXBAYycgaW4gZmFuY3loZHIgYXJndW1lbnQ6Ci0gICAgICAgICAgWyMyXX17fVxmaQotICAgIFxmaQotICAgIFxmQG5mb3JcdGVtcEBjeyMyfSUKLSAgICAgICAge1xkZWZAdWx0XGZAQEBlb3tlb31cdGVtcEBjCi0gICAgICAgICBcZGVmQHVsdFxmQEBAbGNye2xjcn1cdGVtcEBjCi0gICAgICAgICBcZGVmQHVsdFxmQEBAaGZ7aGZ9eyMxXHRlbXBAY30lCi0gICAgICAgICBcQGZvcmNcZkBAZW9cZkBAQGVvCi0gICAgICAgICAgICAge1xAZm9yY1xmQEBsY3JcZkBAQGxjcgotICAgICAgICAgICAgICAgICB7XEBmb3JjXGZAQGhmXGZAQEBoZgotICAgICAgICAgICAgICAgICAgICAge1xleHBhbmRhZnRlclxmYW5jeUBkZWZcY3NuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgZkBuY3lcZkBAZW9cZkBAbGNyXGZAQGhmXGVuZGNzbmFtZQotICAgICAgICAgICAgICAgICAgICAgIHsjM319fX19fQotCi0lIEZhbmN5aGVhZGluZ3MgdmVyc2lvbiAxIGNvbW1hbmRzLiBUaGVzZSBhcmUgbW9yZSBvciBsZXNzIGRlcHJlY2F0ZWQsCi0lIGJ1dCB0aGV5IGNvbnRpbnVlIHRvIHdvcmsuCi0KLVxuZXdjb21tYW5ke1xsaGVhZH17XEBpZm5leHRjaGFyW3tcQHhsaGVhZH17XEB5bGhlYWR9fQotXGRlZlxAeGxoZWFkWyMxXSMye1xmYW5jeUBkZWZcZkBuY3llbGh7IzF9XGZhbmN5QGRlZlxmQG5jeW9saHsjMn19Ci1cZGVmXEB5bGhlYWQjMXtcZmFuY3lAZGVmXGZAbmN5ZWxoeyMxfVxmYW5jeUBkZWZcZkBuY3lvbGh7IzF9fQotCi1cbmV3Y29tbWFuZHtcY2hlYWR9e1xAaWZuZXh0Y2hhclt7XEB4Y2hlYWR9e1xAeWNoZWFkfX0KLVxkZWZcQHhjaGVhZFsjMV0jMntcZmFuY3lAZGVmXGZAbmN5ZWNoeyMxfVxmYW5jeUBkZWZcZkBuY3lvY2h7IzJ9fQotXGRlZlxAeWNoZWFkIzF7XGZhbmN5QGRlZlxmQG5jeWVjaHsjMX1cZmFuY3lAZGVmXGZAbmN5b2NoeyMxfX0KLQotXG5ld2NvbW1hbmR7XHJoZWFkfXtcQGlmbmV4dGNoYXJbe1xAeHJoZWFkfXtcQHlyaGVhZH19Ci1cZGVmXEB4cmhlYWRbIzFdIzJ7XGZhbmN5QGRlZlxmQG5jeWVyaHsjMX1cZmFuY3lAZGVmXGZAbmN5b3JoeyMyfX0KLVxkZWZcQHlyaGVhZCMxe1xmYW5jeUBkZWZcZkBuY3llcmh7IzF9XGZhbmN5QGRlZlxmQG5jeW9yaHsjMX19Ci0KLVxuZXdjb21tYW5ke1xsZm9vdH17XEBpZm5leHRjaGFyW3tcQHhsZm9vdH17XEB5bGZvb3R9fQotXGRlZlxAeGxmb290WyMxXSMye1xmYW5jeUBkZWZcZkBuY3llbGZ7IzF9XGZhbmN5QGRlZlxmQG5jeW9sZnsjMn19Ci1cZGVmXEB5bGZvb3QjMXtcZmFuY3lAZGVmXGZAbmN5ZWxmeyMxfVxmYW5jeUBkZWZcZkBuY3lvbGZ7IzF9fQotCi1cbmV3Y29tbWFuZHtcY2Zvb3R9e1xAaWZuZXh0Y2hhclt7XEB4Y2Zvb3R9e1xAeWNmb290fX0KLVxkZWZcQHhjZm9vdFsjMV0jMntcZmFuY3lAZGVmXGZAbmN5ZWNmeyMxfVxmYW5jeUBkZWZcZkBuY3lvY2Z7IzJ9fQotXGRlZlxAeWNmb290IzF7XGZhbmN5QGRlZlxmQG5jeWVjZnsjMX1cZmFuY3lAZGVmXGZAbmN5b2NmeyMxfX0KLQotXG5ld2NvbW1hbmR7XHJmb290fXtcQGlmbmV4dGNoYXJbe1xAeHJmb290fXtcQHlyZm9vdH19Ci1cZGVmXEB4cmZvb3RbIzFdIzJ7XGZhbmN5QGRlZlxmQG5jeWVyZnsjMX1cZmFuY3lAZGVmXGZAbmN5b3JmeyMyfX0KLVxkZWZcQHlyZm9vdCMxe1xmYW5jeUBkZWZcZkBuY3llcmZ7IzF9XGZhbmN5QGRlZlxmQG5jeW9yZnsjMX19Ci0KLVxuZXdkaW1lblxoZWFkd2lkdGgKLVxuZXdjb21tYW5ke1xoZWFkcnVsZXdpZHRofXswLjRwdH0KLVxuZXdjb21tYW5ke1xmb290cnVsZXdpZHRofXtcekBza2lwfQotXG5ld2NvbW1hbmR7XGZvb3RydWxlc2tpcH17LjNcbm9ybWFsYmFzZWxpbmVza2lwfQotCi0lIEZhbmN5cGxhaW4gc3R1ZmYgc2hvdWxkbid0IGJlIHVzZWQgYW55bW9yZSAocmF0aGVyCi0lIFxmYW5jeXBhZ2VzdHlsZXtwbGFpbn0gc2hvdWxkIGJlIHVzZWQpLCBidXQgaXQgbXVzdCBiZSBwcmVzZW50IGZvcgotJSBjb21wYXRpYmlsaXR5IHJlYXNvbnMuCi0KLVxuZXdjb21tYW5ke1xwbGFpbmhlYWRydWxld2lkdGh9e1x6QHNraXB9Ci1cbmV3Y29tbWFuZHtccGxhaW5mb290cnVsZXdpZHRofXtcekBza2lwfQotXG5ld2lmXGlmQGZhbmN5cGxhaW4gXEBmYW5jeXBsYWluZmFsc2UKLVxkZWZcZmFuY3lwbGFpbiMxIzJ7XGlmQGZhbmN5cGxhaW4jMVxlbHNlIzJcZml9Ci0KLVxoZWFkd2lkdGg9LTEyMzQ1Njc4OXNwICVtYWdpYyBjb25zdGFudAotCi0lIENvbW1hbmQgdG8gcmVzZXQgdmFyaW91cyB0aGluZ3MgaW4gdGhlIGhlYWRlcnM6Ci0lIGEuby4gIHNpbmdsZSBzcGFjaW5nICh0YWtlbiBmcm9tIHNldHNwYWNlLnN0eSkKLSUgYW5kIHRoZSBjYXRjb2RlIG9mIF5eTSAoc28gdGhhdCBlcHNmIGZpbGVzIGluIHRoZSBoZWFkZXIgd29yayBpZiBhCi0lIHZlcmJhdGltIGNyb3NzZXMgYSBwYWdlIGJvdW5kYXJ5KQotJSBJdCBhbHNvIGRlZmluZXMgYSBcbm91cHBlcmNhc2UgY29tbWFuZCB0aGF0IGRpc2FibGVzIFx1cHBlcmNhc2UgYW5kCi0lIFxNYWtldXBwZXJjYXNlLiBJdCBjYW4gb25seSBiZSB1c2VkIGluIHRoZSBoZWFkZXJzIGFuZCBmb290ZXJzLgotXGRlZlxmYW5jeUByZXNldHtccmVzdG9yZWNyCi0gXGRlZlxiYXNlbGluZXN0cmV0Y2h7MX0lCi0gXGRlZlxub3VwcGVyY2FzZSMjMXt7XGxldFx1cHBlcmNhc2VccmVsYXhcbGV0XE1ha2VVcHBlcmNhc2VccmVsYXgKLSAgICAgXGV4cGFuZGFmdGVyXGxldFxjc25hbWUgTWFrZVVwcGVyY2FzZSBcZW5kY3NuYW1lXHJlbGF4IyMxfX0lCi0gXGlmeFx1bmRlZmluZWRcQG5ld2Jhc2VsaW5lJSBORlNTIG5vdCBwcmVzZW50OyAyLjA5IG9yIDJlCi0gICBcaWZ4XEBub3JtYWxzaXplXHVuZGVmaW5lZCBcbm9ybWFsc2l6ZSAlIGZvciB1Y3RoZXNpcy5jbHMKLSAgIFxlbHNlIFxAbm9ybWFsc2l6ZSBcZmkKLSBcZWxzZSUgTkZTUyAoMi4wOSkgcHJlc2VudAotICBcQG5ld2Jhc2VsaW5lJQotIFxmaX0KLQotJSBJbml0aWFsaXphdGlvbiBvZiB0aGUgaGVhZCBhbmQgZm9vdCB0ZXh0LgotCi0lIFRoZSBkZWZhdWx0IHZhbHVlcyBzdGlsbCBjb250YWluIFxmYW5jeXBsYWluIGZvciBjb21wYXRpYmlsaXR5LgotXGZhbmN5aGZ7fSAlIGNsZWFyIGFsbAotJSBsZWZ0aGVhZCBlbXB0eSBvbiBgYHBsYWluJycgcGFnZXMsIFxyaWdodG1hcmsgb24gZXZlbiwgXGxlZnRtYXJrIG9uIG9kZCBwYWdlcwotJSBldmVuaGVhZCBlbXB0eSBvbiBgYHBsYWluJycgcGFnZXMsIFxsZWZ0bWFyayBvbiBldmVuLCBccmlnaHRtYXJrIG9uIG9kZCBwYWdlcwotXGZhbmN5aGVhZFtlbCxvcl17XGZhbmN5cGxhaW57fXtcc2xccmlnaHRtYXJrfX0KLVxmYW5jeWhlYWRbZXIsb2xde1xmYW5jeXBsYWlue317XHNsXGxlZnRtYXJrfX0KLVxmYW5jeWZvb3RbY117XHJtXHRoZXBhZ2V9ICUgcGFnZSBudW1iZXIKLQotJSBQdXQgdG9nZXRoZXIgYSBoZWFkZXIgb3IgZm9vdGVyIGdpdmVuIHRoZSBsZWZ0LCBjZW50ZXIgYW5kCi0lIHJpZ2h0IHRleHQsIGZpbGxlcnMgYXQgbGVmdCBhbmQgcmlnaHQgYW5kIGEgcnVsZS4KLSUgVGhlIFxsYXAgY29tbWFuZHMgcHV0IHRoZSB0ZXh0IGludG8gYW4gaGJveCBvZiB6ZXJvIHNpemUsCi0lIHNvIG92ZXJsYXBwaW5nIHRleHQgZG9lcyBub3QgZ2VuZXJhdGUgYW4gZXJyb3JtZXNzYWdlLgotJSBUaGVzZSBtYWNyb3MgaGF2ZSA1IHBhcmFtZXRlcnM6Ci0lIDEuIFxAbG9kZCBvciBcQHJvZGQgJSBUaGlzIGRldGVybWluZXMgYXQgd2hpY2ggc2lkZSB0aGUgaGVhZGVyIHdpbGwgc3RpY2sKLSUgICAgb3V0LgotJSAyLiBcZkBuY3lvbGgsIFxmQG5jeWVsaCwgXGZAbmN5b2xmIG9yIFxmQG5jeWVsZi4gVGhpcyBpcyB0aGUgbGVmdCBjb21wb25lbnQuCi0lIDMuIFxmQG5jeW9jaCwgXGZAbmN5ZWNoLCBcZkBuY3lvY2Ygb3IgXGZAbmN5ZWNmLiBUaGlzIGlzIHRoZSBtaWRkbGUgY29tcC4KLSUgNC4gXGZAbmN5b3JoLCBcZkBuY3llcmgsIFxmQG5jeW9yZiBvciBcZkBuY3llcmYuIFRoaXMgaXMgdGhlIHJpZ2h0IGNvbXBvbmVudC4KLSUgNS4gXEBsb2RkIG9yIFxAcm9kZCAlIFRoaXMgZGV0ZXJtaW5lcyBhdCB3aGljaCBzaWRlIHRoZSBoZWFkZXIgd2lsbCBzdGljawotJSAgICBvdXQuIFRoaXMgaXMgdGhlIHJldmVyc2Ugb2YgcGFyYW1ldGVyIG5yLiAxLiBPbmUgb2YgdGhlbSBpcyBhbHdheXMKLSUgICAgXHJlbGF4IGFuZCB0aGUgb3RoZXIgb25lIGlzIFxoc3MgKGFmdGVyIGV4cGFuc2lvbikuCi0KLVxkZWZcQGZhbmN5aGVhZCMxIzIjMyM0IzV7IzFcaGJveCB0b1xoZWFkd2lkdGh7XGZhbmN5QHJlc2V0XHZib3h7XGhib3gKLXtccmxhcHtccGFyYm94W2Jde1xoZWFkd2lkdGh9e1xyYWdnZWRyaWdodCMyXHN0cnV0fX1caGZpbGwKLVxwYXJib3hbYl17XGhlYWR3aWR0aH17XGNlbnRlcmluZyMzXHN0cnV0fVxoZmlsbAotXGxsYXB7XHBhcmJveFtiXXtcaGVhZHdpZHRofXtccmFnZ2VkbGVmdCM0XHN0cnV0fX19XGhlYWRydWxlfX0jNX0KLQotXGRlZlxAZmFuY3lmb290IzEjMiMzIzQjNXsjMVxoYm94IHRvXGhlYWR3aWR0aHtcZmFuY3lAcmVzZXRcdmJveHtcZm9vdHJ1bGUKLVxoYm94e1xybGFwe1xwYXJib3hbdF17XGhlYWR3aWR0aH17XHJhZ2dlZHJpZ2h0IzJcc3RydXR9fVxoZmlsbAotXHBhcmJveFt0XXtcaGVhZHdpZHRofXtcY2VudGVyaW5nIzNcc3RydXR9XGhmaWxsCi1cbGxhcHtccGFyYm94W3Rde1xoZWFkd2lkdGh9e1xyYWdnZWRsZWZ0IzRcc3RydXR9fX19fSM1fQotCi1cZGVmXGhlYWRydWxle3tcaWZAZmFuY3lwbGFpblxsZXRcaGVhZHJ1bGV3aWR0aFxwbGFpbmhlYWRydWxld2lkdGhcZmkKLVxocnVsZVxAaGVpZ2h0XGhlYWRydWxld2lkdGhcQHdpZHRoXGhlYWR3aWR0aCBcdnNraXAtXGhlYWRydWxld2lkdGh9fQotCi1cZGVmXGZvb3RydWxle3tcaWZAZmFuY3lwbGFpblxsZXRcZm9vdHJ1bGV3aWR0aFxwbGFpbmZvb3RydWxld2lkdGhcZmkKLVx2c2tpcC1cZm9vdHJ1bGVza2lwXHZza2lwLVxmb290cnVsZXdpZHRoCi1caHJ1bGVcQHdpZHRoXGhlYWR3aWR0aFxAaGVpZ2h0XGZvb3RydWxld2lkdGhcdnNraXBcZm9vdHJ1bGVza2lwfX0KLQotXGRlZlxwc0BmYW5jeXslCi1cQGlmdW5kZWZpbmVke0BjaGFwYXBwfXtcbGV0XEBjaGFwYXBwXGNoYXB0ZXJuYW1lfXt9JWZvciBhbXNib29rCi0lCi0lIERlZmluZSBcTWFrZVVwcGVyY2FzZSBmb3Igb2xkIExhVGVYZW4uCi0lIE5vdGU6IHdlIHVzZWQgXGRlZiByYXRoZXIgdGhhbiBcbGV0LCBzbyB0aGF0IFxsZXRcdXBwZXJjYXNlXHJlbGF4IChmcm9tCi0lIHRoZSB2ZXJzaW9uIDEgZG9jdW1lbnRhdGlvbikgd2lsbCBzdGlsbCB3b3JrLgotJQotXEBpZnVuZGVmaW5lZHtNYWtlVXBwZXJjYXNlfXtcZGVmXE1ha2VVcHBlcmNhc2V7XHVwcGVyY2FzZX19e30lCi1cQGlmdW5kZWZpbmVke2NoYXB0ZXJ9e1xkZWZcc2VjdGlvbm1hcmsjIzF7XG1hcmtib3RoCi17XE1ha2VVcHBlcmNhc2V7XGlmbnVtIFxjQHNlY251bWRlcHRoPlx6QAotIFx0aGVzZWN0aW9uXGhza2lwIDFlbVxyZWxheCBcZmkgIyMxfX17fX0lCi1cZGVmXHN1YnNlY3Rpb25tYXJrIyMxe1xtYXJrcmlnaHQge1xpZm51bSBcY0BzZWNudW1kZXB0aCA+XEBuZQotIFx0aGVzdWJzZWN0aW9uXGhza2lwIDFlbVxyZWxheCBcZmkgIyMxfX19JQote1xkZWZcY2hhcHRlcm1hcmsjIzF7XG1hcmtib3RoIHtcTWFrZVVwcGVyY2FzZXtcaWZudW0gXGNAc2VjbnVtZGVwdGg+XG1AbmUKLSBcQGNoYXBhcHBcIFx0aGVjaGFwdGVyLiBcIFxmaSAjIzF9fXt9fSUKLVxkZWZcc2VjdGlvbm1hcmsjIzF7XG1hcmtyaWdodHtcTWFrZVVwcGVyY2FzZXtcaWZudW0gXGNAc2VjbnVtZGVwdGggPlx6QAotIFx0aGVzZWN0aW9uLiBcIFxmaSAjIzF9fX19JQotJVxjc25hbWUgcHNAaGVhZGluZ3NcZW5kY3NuYW1lICUgdXNlIFxwc0BoZWFkaW5ncyBkZWZhdWx0cyBpZiB0aGV5IGV4aXN0Ci1ccHNAQGZhbmN5Ci1cZ2RlZlxwc0BmYW5jeXtcQGZhbmN5cGxhaW5mYWxzZVxwc0BAZmFuY3l9JQotJSBJbml0aWFsaXplIFxoZWFkd2lkdGggaWYgdGhlIHVzZXIgZGlkbid0Ci0lCi1caWZkaW1caGVhZHdpZHRoPDBzcAotJQotJSBUaGlzIGNhdGNoZXMgdGhlIGNhc2UgdGhhdCBcaGVhZHdpZHRoIGhhc24ndCBiZWVuIGluaXRpYWxpemVkIGFuZCB0aGUKLSUgY2FzZSB0aGF0IHRoZSB1c2VyIGFkZGVkIHNvbWV0aGluZyB0byBcaGVhZHdpZHRoIGluIHRoZSBleHBlY3RhdGlvbiB0aGF0Ci0lIGl0IHdhcyBpbml0aWFsaXplZCB0byBcdGV4dHdpZHRoLiBXZSBjb21wZW5zYXRlIHRoaXMgbm93LiBUaGlzIGxvc2VzIGlmCi0lIHRoZSB1c2VyIGludGVuZGVkIHRvIG11bHRpcGx5IGl0IGJ5IGEgZmFjdG9yLiBCdXQgdGhhdCBjYXNlIGlzIG1vcmUKLSUgbGlrZWx5IGRvbmUgYnkgc2F5aW5nIHNvbWV0aGluZyBsaWtlIFxoZWFkd2lkdGg9MS4yXHRleHR3aWR0aC4gCi0lIFRoZSBkb2Mgc2F5cyB5b3UgaGF2ZSB0byBjaGFuZ2UgXGhlYWR3aWR0aCBhZnRlciB0aGUgZmlyc3QgY2FsbCB0bwotJSBccGFnZXN0eWxle2ZhbmN5fS4gVGhpcyBjb2RlIGlzIGp1c3QgdG8gY2F0Y2ggdGhlIG1vc3QgY29tbW9uIGNhc2VzIHdlcmUKLSUgdGhhdCByZXF1aXJlbWVudCBpcyB2aW9sYXRlZC4KLSUKLSAgICBcZ2xvYmFsXGFkdmFuY2VcaGVhZHdpZHRoMTIzNDU2Nzg5c3BcZ2xvYmFsXGFkdmFuY2VcaGVhZHdpZHRoXHRleHR3aWR0aAotXGZpfQotXGRlZlxwc0BmYW5jeXBsYWlue1xwc0BmYW5jeSBcbGV0XHBzQHBsYWluXHBzQHBsYWluQGZhbmN5fQotXGRlZlxwc0BwbGFpbkBmYW5jeXtcQGZhbmN5cGxhaW50cnVlXHBzQEBmYW5jeX0KLVxsZXRccHNAQGVtcHR5XHBzQGVtcHR5Ci1cZGVmXHBzQEBmYW5jeXslCi1ccHNAQGVtcHR5ICUgVGhpcyBpcyBmb3IgYW1zYm9vay9hbXNhcnQsIHdoaWNoIGRvIHN0cmFuZ2UgdGhpbmdzIHdpdGggXHRvcHNraXAKLVxkZWZcQG1rYm90aHtccHJvdGVjdFxtYXJrYm90aH0lCi1cZGVmXEBvZGRoZWFke1xAZmFuY3loZWFkXEBsb2RkXGZAbmN5b2xoXGZAbmN5b2NoXGZAbmN5b3JoXEByb2RkfSUKLVxkZWZcQG9kZGZvb3R7XEBmYW5jeWZvb3RcQGxvZGRcZkBuY3lvbGZcZkBuY3lvY2ZcZkBuY3lvcmZcQHJvZGR9JQotXGRlZlxAZXZlbmhlYWR7XEBmYW5jeWhlYWRcQHJvZGRcZkBuY3llbGhcZkBuY3llY2hcZkBuY3llcmhcQGxvZGR9JQotXGRlZlxAZXZlbmZvb3R7XEBmYW5jeWZvb3RcQHJvZGRcZkBuY3llbGZcZkBuY3llY2ZcZkBuY3llcmZcQGxvZGR9JQotfQotXGRlZlxAbG9kZHtcaWZAcmV2ZXJzZW1hcmdpblxoc3NcZWxzZVxyZWxheFxmaX0KLVxkZWZcQHJvZGR7XGlmQHJldmVyc2VtYXJnaW5ccmVsYXhcZWxzZVxoc3NcZml9Ci0KLVxuZXdpZlxpZmZvb3Rub3RlCi1cbGV0XGxhdGV4QG1ha2Vjb2xcQG1ha2Vjb2wKLVxkZWZcQG1ha2Vjb2x7XGlmdm9pZFxmb290aW5zXGZvb3Rub3RldHJ1ZVxlbHNlXGZvb3Rub3RlZmFsc2VcZmkKLVxsZXRcdG9wZmxvYXRcQHRvcGxpc3RcbGV0XGJvdGZsb2F0XEBib3RsaXN0XGxhdGV4QG1ha2Vjb2x9Ci1cZGVmXGlmdG9wZmxvYXQjMSMye1xpZnhcdG9wZmxvYXRcZW1wdHkgIzJcZWxzZSAjMVxmaX0KLVxkZWZcaWZib3RmbG9hdCMxIzJ7XGlmeFxib3RmbG9hdFxlbXB0eSAjMlxlbHNlICMxXGZpfQotXGRlZlxpZmZsb2F0cGFnZSMxIzJ7XGlmQGZjb2xtYWRlICMxXGVsc2UgIzJcZml9Ci0KLVxuZXdjb21tYW5ke1xmYW5jeXBhZ2VzdHlsZX1bMl17JQotICBcQG5hbWVkZWZ7cHNAIzF9e1xsZXRcZmFuY3lAZGVmXGRlZiMyXHJlbGF4XHBzQGZhbmN5fX0KZGlmZiAtLWdpdCBhL0RvYy90ZXhpbnB1dHMvZm5jeWNoYXAuc3R5IGIvRG9jL3RleGlucHV0cy9mbmN5Y2hhcC5zdHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZDdiNzYuLjAwMDAwMDAKLS0tIGEvRG9jL3RleGlucHV0cy9mbmN5Y2hhcC5zdHkKKysrIC9kZXYvbnVsbApAQCAtMSw0MzMgKzAsMCBAQAotJSUlIERlcml2ZWQgZnJvbSB0aGUgb3JpZ2luYWwgZm5jeWNoYXAuc3R5LAotJSUlIGJ1dCBjaGFuZ2VkIGBgVFdFTFYnJyB0byBgYFRXRUxWRScnLgotCi0lJSUgQ29weXJpZ2h0ICAgVWxmIEEuIExpbmRncmVuCi0lJSUgICAgICAgICAgICAgRGVwYXJ0bWVudCBvZiBBcHBsaWVkIEVsZWN0cm9uaWNzCi0lJSUgICAgICAgICAgICAgQ2hhbG1lcnMgVW5pdmVyc2l0eSBvZiBUZWNobm9sb2d5Ci0lJSUgICAgICAgICAgICAgUy00MTIgOTYgR290aGVuYnVyZywgU3dlZGVuCi0lJSUgICAgICAgICAgICAgRS1tYWlsIGxpbmRncmVuQGFlLmNoYWxtZXJzLnNlCi0lJSUKLSUlJSBOb3RlICAgICAgICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbW9kaWZ5IHRoaXMgZmlsZSB1bmRlcgotJSUlICAgICAgICAgICAgIHRoZSBjb25kaXRpb24gdGhhdCBpdCBpcyBzYXZlZCB1c2luZyBhbm90aGVyCi0lJSUgICAgICAgICAgICAgZmlsZSBhbmQgcGFja2FnZSBuYW1lLgotJSUlCi0lJSUgUmV2aXNpb24gICAgMS4xCi0lJSUKLSUlJSAgICAgICAgICAgICBKYW4uIDh0aCBNb2RpZmllZCBwYWNrYWdlIG5hbWUgYmFzZSBkYXRlIG9wdGlvbgotJSUlICAgICAgICAgICAgIEphbi4gMjJ0aCBNb2RpZmllZCBGbU4gYW5kIEZtVGkgZm9yIGVycm9yIGluIGJvb2suY2xzCi0lJSUgICAgICAgICAgICAgICAgICBcTWFrZVVwcGVyY2FzZXsjfS0+e1xNYWtlVXBwZXJjYXNlI30KLSUlJSAgICAgICAgICAgICBBcHIuIDZ0aCBNb2RpZmllZCBMZW5ueSBvcHRpb24gdG8gcHJldmVudCB1bmRlc2lyZWQgCi0lJSUgICAgICAgICAgICAgICAgICBza2lwIG9mIGxpbmUuCi0lJSUgICAgICAgICAgICAgTm92LiA4dGggRml4ZWQgXEBjaGFwYXBwIGZvciBBTVMKLSUlJSAgICAgICAgICAgICBGZWIuIDExdGggRml4ZWQgYXBwZW5kaXggcHJvYmxlbSByZWxhdGVkIHRvIEJqYXJuZQotJSUlIExhc3QgbW9kaWZpZWQgICAgRmViLiAxMXRoIDE5OTgKLQotXE5lZWRzVGVYRm9ybWF0e0xhVGVYMmV9WzE5OTUvMTIvMDFdCi1cUHJvdmlkZXNQYWNrYWdle2ZuY3ljaGFwfQotICAgICAgICAgICAgIFsxOTk3LzA0LzA2IHYxLjExCi0gICAgICAgICAgICAgICAgIExhVGVYIHBhY2thZ2UgKFJldmlzZWQgY2hhcHRlcnMpXQotCi0lJSUlIERFRklOSVRJT04gT0YgQ2hhcGFwcCB2YXJpYWJsZXMKLVxuZXdjb21tYW5ke1xDTlZ9e1xodWdlXGJmc2VyaWVzfQotXG5ld2NvbW1hbmR7XENoTmFtZVZhcn1bMV17XHJlbmV3Y29tbWFuZHtcQ05WfXsjMX19Ci0KLQotJSUlJSBERUZJTklUSU9OIE9GIFRoZUNoYXB0ZXIgdmFyaWFibGVzCi1cbmV3Y29tbWFuZHtcQ05vVn17XGh1Z2VcYmZzZXJpZXN9Ci1cbmV3Y29tbWFuZHtcQ2hOdW1WYXJ9WzFde1xyZW5ld2NvbW1hbmR7XENOb1Z9eyMxfX0KLQotXG5ld2lmXGlmVUNOCi1cVUNOZmFsc2UKLVxuZXdpZlxpZkxDTgotXExDTmZhbHNlCi1cZGVmXENoTmFtZUxvd2VyQ2FzZXtcTENOdHJ1ZVxVQ05mYWxzZX0KLVxkZWZcQ2hOYW1lVXBwZXJDYXNle1xVQ050cnVlXExDTmZhbHNlfQotXGRlZlxDaE5hbWVBc0lze1xVQ05mYWxzZVxMQ05mYWxzZX0KLQotJSUlJSUgRml4IGZvciBBTVNCb29rIDk3MTAwOAotCi1cQGlmdW5kZWZpbmVke0BjaGFwYXBwfXtcbGV0XEBjaGFwYXBwXGNoYXB0ZXJuYW1lfXt9Ci0KLQotJSUlJSUgRml4IGZvciBCamFybmUgYW5kIGFwcGVuZGl4IDk4MDIxMQotCi1cbmV3aWZcaWZpbmFwcAotXGluYXBwZmFsc2UKLVxyZW5ld2NvbW1hbmRcYXBwZW5kaXh7XHBhcgotICBcc2V0Y291bnRlcntjaGFwdGVyfXswfSUKLSAgXHNldGNvdW50ZXJ7c2VjdGlvbn17MH0lCi0gIFxpbmFwcHRydWUlCi0gIFxyZW5ld2NvbW1hbmRcQGNoYXBhcHB7XGFwcGVuZGl4bmFtZX0lCi0gIFxyZW5ld2NvbW1hbmRcdGhlY2hhcHRlcntcQEFscGhcY0BjaGFwdGVyfX0KLQotJSUlJSUKLQotXG5ld2NvbW1hbmR7XEZtTn1bMV17JQotXGlmVUNOCi0gICB7XE1ha2VVcHBlcmNhc2UjMX1cTENOZmFsc2UKLVxlbHNlCi0gICBcaWZMQ04KLSAgICAgIHtcTWFrZUxvd2VyY2FzZSMxfVxVQ05mYWxzZQotICAgXGVsc2UgIzEKLSAgIFxmaQotXGZpfQotCi0KLSUlJSUgREVGSU5JVElPTiBPRiBUaXRsZSB2YXJpYWJsZXMKLVxuZXdjb21tYW5ke1xDVFZ9e1xIdWdlXGJmc2VyaWVzfQotXG5ld2NvbW1hbmR7XENoVGl0bGVWYXJ9WzFde1xyZW5ld2NvbW1hbmR7XENUVn17IzF9fQotCi0lJSUlIERFRklOSVRJT04gT0YgdGhlIGJhc2ljIHJ1bGUgd2lkdGgKLVxuZXdsZW5ndGh7XFJXfQotXHNldGxlbmd0aHtcUld9ezFwdH0KLVxuZXdjb21tYW5ke1xDaFJ1bGVXaWR0aH1bMV17XHNldGxlbmd0aHtcUld9eyMxfX0KLQotXG5ld2lmXGlmVUNUCi1cVUNUZmFsc2UKLVxuZXdpZlxpZkxDVAotXExDVGZhbHNlCi1cZGVmXENoVGl0bGVMb3dlckNhc2V7XExDVHRydWVcVUNUZmFsc2V9Ci1cZGVmXENoVGl0bGVVcHBlckNhc2V7XFVDVHRydWVcTENUZmFsc2V9Ci1cZGVmXENoVGl0bGVBc0lze1xVQ1RmYWxzZVxMQ1RmYWxzZX0KLVxuZXdjb21tYW5ke1xGbVRpfVsxXXslCi1caWZVQ1QKLQotICAge1xNYWtlVXBwZXJjYXNlIzF9XExDVGZhbHNlCi1cZWxzZQotICAgXGlmTENUCi0gICAgICB7XE1ha2VMb3dlcmNhc2UjMX1cVUNUZmFsc2UKLSAgIFxlbHNlICMxCi0gICBcZmkKLVxmaX0KLQotCi0KLVxuZXdsZW5ndGh7XG15bGVufQotXG5ld2xlbmd0aHtcbXloaX0KLVxuZXdsZW5ndGh7XHB4fQotXG5ld2xlbmd0aHtccHl9Ci1cbmV3bGVuZ3Roe1xweXl9Ci1cbmV3bGVuZ3Roe1xweHh9Ci0KLQotXGRlZlxtZ2hydWxlZmlsbCMxe1xsZWF2ZXZtb2RlXGxlYWRlcnNcaHJ1bGVcQGhlaWdodCAjMVxoZmlsbFxrZXJuXHpAfQotCi1cbmV3Y29tbWFuZHtcRE9DSH17JQotICBcQ05WXEZtTntcQGNoYXBhcHB9XHNwYWNlIFxDTm9WXHRoZWNoYXB0ZXIKLSAgXHBhclxub2JyZWFrCi0gIFx2c2tpcCAyMFxwQAotICB9Ci1cbmV3Y29tbWFuZHtcRE9USX1bMV17JQotICAgIFxDVFZcRm1UaXsjMX1ccGFyXG5vYnJlYWsKLSAgICBcdnNraXAgNDBccEAKLSAgICB9Ci1cbmV3Y29tbWFuZHtcRE9USVN9WzFdeyUKLSAgICBcQ1RWXEZtVGl7IzF9XHBhclxub2JyZWFrCi0gICAgXHZza2lwIDQwXHBACi0gICAgfQotCi0lJSUlJSUgU09OTlkgREVGCi0KLVxEZWNsYXJlT3B0aW9ue1Nvbm55fXslCi0gIFxDaE5hbWVWYXJ7XExhcmdlXHNmfQotICBcQ2hOdW1WYXJ7XEh1Z2V9Ci0gIFxDaFRpdGxlVmFye1xMYXJnZVxzZn0KLSAgXENoUnVsZVdpZHRoezAuNXB0fQotICBcQ2hOYW1lVXBwZXJDYXNlCi0gIFxyZW5ld2NvbW1hbmR7XERPQ0h9eyUKLSAgICBccmFnZ2VkbGVmdAotICAgIFxDTlZcRm1Oe1xAY2hhcGFwcH1cc3BhY2UgXENOb1ZcdGhlY2hhcHRlcgotICAgIFxwYXJcbm9icmVhawotICAgIFx2c2tpcCA0MFxwQH0KLSAgXHJlbmV3Y29tbWFuZHtcRE9USX1bMV17JQotICAgIFxDVFZccmFnZ2VkbGVmdFxtZ2hydWxlZmlsbHtcUld9XHBhclxub2JyZWFrCi0gICAgXHZza2lwIDVccEAKLSAgICBcQ1RWXEZtVGl7IzF9XHBhclxub2JyZWFrCi0gICAgXG1naHJ1bGVmaWxse1xSV31ccGFyXG5vYnJlYWsKLSAgICBcdnNraXAgNDBccEB9Ci0gIFxyZW5ld2NvbW1hbmR7XERPVElTfVsxXXslCi0gICAgXENUVlxyYWdnZWRsZWZ0XG1naHJ1bGVmaWxse1xSV31ccGFyXG5vYnJlYWsKLSAgICBcdnNraXAgNVxwQAotICAgIFxDVFZcRm1UaXsjMX1ccGFyXG5vYnJlYWsKLSAgICBcbWdocnVsZWZpbGx7XFJXfVxwYXJcbm9icmVhawotICAgIFx2c2tpcCA0MFxwQH0KLX0KLQotJSUlJSUlIExFTk5ZIERFRgotCi1cRGVjbGFyZU9wdGlvbntMZW5ueX17JQotCi0gIFxDaE5hbWVWYXJ7XGZvbnRzaXplezE0fXsxNn1cdXNlZm9udHtPVDF9e3Bodn17bX17bn1cc2VsZWN0Zm9udH0KLSAgXENoTnVtVmFye1xmb250c2l6ZXs2MH17NjJ9XHVzZWZvbnR7T1QxfXtwdG19e219e259XHNlbGVjdGZvbnR9Ci0gIFxDaFRpdGxlVmFye1xIdWdlXGJmc2VyaWVzXHJtfQotICBcQ2hSdWxlV2lkdGh7MXB0fQotICBccmVuZXdjb21tYW5ke1xET0NIfXslCi0gICAgXHNldHRvd2lkdGh7XHB4fXtcQ05WXEZtTntcQGNoYXBhcHB9fQotICAgIFxhZGR0b2xlbmd0aHtccHh9ezJwdH0KLSAgICBcc2V0dG9oZWlnaHR7XHB5fXtcQ05WXEZtTntcQGNoYXBhcHB9fQotICAgIFxhZGR0b2xlbmd0aHtccHl9ezFwdH0KLQotICAgIFxzZXR0b3dpZHRoe1xteWxlbn17XENOVlxGbU57XEBjaGFwYXBwfVxzcGFjZVxDTm9WXHRoZWNoYXB0ZXJ9Ci0gICAgXGFkZHRvbGVuZ3Roe1xteWxlbn17MXB0fQotICAgIFxzZXR0b3dpZHRoe1xweHh9e1xDTm9WXHRoZWNoYXB0ZXJ9Ci0gICAgXGFkZHRvbGVuZ3Roe1xweHh9ey0xcHR9Ci0KLSAgICBcc2V0dG9oZWlnaHR7XHB5eX17XENOb1ZcdGhlY2hhcHRlcn0KLSAgICBcYWRkdG9sZW5ndGh7XHB5eX17LTJwdH0KLSAgICBcc2V0bGVuZ3Roe1xteWhpfXtccHl5fQotICAgIFxhZGR0b2xlbmd0aHtcbXloaX17LTFccHl9Ci0gICAgXHBhcgotICAgIFxwYXJib3hbYl17XHRleHR3aWR0aH17JQotICAgIFxydWxlW1xweV17XFJXfXtcbXloaX0lCi0gICAgXGhza2lwIC1cUlclCi0gICAgXHJ1bGVbXHB5eV17XHB4fXtcUld9JQotICAgIFxoc2tpcCAtXHB4JQotICAgIFxyYWdnZWRyaWdodCUKLSAgICBcQ05WXEZtTntcQGNoYXBhcHB9XHNwYWNlXENOb1ZcdGhlY2hhcHRlciUKLSAgICBcaHNraXAxcHQlCi0gICAgXG1naHJ1bGVmaWxse1xSV30lCi0gICAgXHJ1bGV7XFJXfXtccHl5fVxwYXJcbm9icmVhayUKLSAgICBcdnNraXAgLVxiYXNlbGluZXNraXAlCi0gICAgXHZza2lwIC1ccHl5JQotICAgIFxoc2tpcCBcbXlsZW4lCi0gICAgXG1naHJ1bGVmaWxse1xSV31ccGFyXG5vYnJlYWslCi0gICAgXHZza2lwIFxweXl9JQotICAgIFx2c2tpcCAyMFxwQH0KLSAKLQotICBccmVuZXdjb21tYW5ke1xET1RJfVsxXXslCi0gICAgXHJhZ2dlZHJpZ2h0Ci0gICAgXENUVlxGbVRpeyMxfVxwYXJcbm9icmVhawotICAgIFx2c2tpcCA0MFxwQH0KLQotICBccmVuZXdjb21tYW5ke1xET1RJU31bMV17JQotICAgIFxyYWdnZWRyaWdodAotICAgIFxDVFZcRm1UaXsjMX1ccGFyXG5vYnJlYWsKLSAgICBcdnNraXAgNDBccEB9Ci0gfQotCi0KLSUlJSUlJSUgR0xFTk4gREVGCi0KLQotXERlY2xhcmVPcHRpb257R2xlbm59eyUKLSAgXENoTmFtZVZhcntcYmZzZXJpZXNcTGFyZ2Vcc2Z9Ci0gIFxDaE51bVZhcntcSHVnZX0KLSAgXENoVGl0bGVWYXJ7XGJmc2VyaWVzXExhcmdlXHJtfQotICBcQ2hSdWxlV2lkdGh7MXB0fQotICBcQ2hOYW1lVXBwZXJDYXNlCi0gIFxDaFRpdGxlVXBwZXJDYXNlCi0gIFxyZW5ld2NvbW1hbmR7XERPQ0h9eyUKLSAgICBcc2V0dG9oZWlnaHR7XG15aGl9e1xDVFZcRm1UaXtUZXN0fX0KLSAgICBcc2V0bGVuZ3Roe1xweX17XGJhc2VsaW5lc2tpcH0KLSAgICBcYWRkdG9sZW5ndGh7XHB5fXtcUld9Ci0gICAgXGFkZHRvbGVuZ3Roe1xweX17XG15aGl9Ci0gICAgXHNldGxlbmd0aHtccHl5fXtccHl9Ci0gICAgXGFkZHRvbGVuZ3Roe1xweXl9ey0xXFJXfQotICAgICAKLSAgICBccmFnZ2VkcmlnaHQKLSAgICBcQ05WXEZtTntcQGNoYXBhcHB9XHNwYWNlXENOb1ZcdGhlY2hhcHRlcgotICAgIFxoc2tpcCAzcHRcbWdocnVsZWZpbGx7XFJXfVxydWxlWy0xXHB5eV17MlxSV317XHB5fVxwYXJcbm9icmVha30KLQotICBccmVuZXdjb21tYW5ke1xET1RJfVsxXXslCi0gICAgXGFkZHRvbGVuZ3Roe1xweXl9ey00cHR9Ci0gICAgXHNldHRvaGVpZ2h0e1xteWhpfXtcQ1RWXEZtVGl7IzF9fQotICAgIFxhZGR0b2xlbmd0aHtcbXloaX17XHB5fQotICAgIFxhZGR0b2xlbmd0aHtcbXloaX17LTFcUld9Ci0gICAgXHZza2lwIC0xXHB5eQotICAgIFxydWxlezJcUld9e1xteWhpfVxtZ2hydWxlZmlsbHtcUld9XGhza2lwIDJwdAotICAgIFxyYWdnZWRsZWZ0XENUVlxGbVRpeyMxfVxwYXJcbm9icmVhawotICAgIFx2c2tpcCA4MFxwQH0KLQotICBccmVuZXdjb21tYW5ke1xET1RJU31bMV17JQotICAgIFxzZXRsZW5ndGh7XHB5fXsxMHB0fQotICAgIFxzZXRsZW5ndGh7XHB5eX17XHB5fQotICAgIFxhZGR0b2xlbmd0aHtccHl5fXtcUld9Ci0gICAgXHNldGxlbmd0aHtcbXloaX17XGJhc2VsaW5lc2tpcH0KLSAgICBcYWRkdG9sZW5ndGh7XG15aGl9e1xweXl9Ci0gICAgXG1naHJ1bGVmaWxse1xSV31ccnVsZVstMVxweV17MlxSV317XHB5eX1ccGFyXG5vYnJlYWsKLSUgICAgXGFkZHRvbGVuZ3Roe317fQotXHZza2lwIC0xXGJhc2VsaW5lc2tpcAotICAgIFxydWxlezJcUld9e1xteWhpfVxtZ2hydWxlZmlsbHtcUld9XGhza2lwIDJwdAotICAgIFxyYWdnZWRsZWZ0XENUVlxGbVRpeyMxfVxwYXJcbm9icmVhawotICAgIFx2c2tpcCA2MFxwQH0KLSAgfQotCi0lJSUlJSUlIENPTk5ZIERFRgotCi1cRGVjbGFyZU9wdGlvbntDb25ueX17JQotICBcQ2hOYW1lVXBwZXJDYXNlCi0gIFxDaFRpdGxlVXBwZXJDYXNlICAKLSAgXENoTmFtZVZhcntcY2VudGVyaW5nXEh1Z2Vccm1cYmZzZXJpZXN9Ci0gIFxDaE51bVZhcntcSHVnZX0KLSAgXENoVGl0bGVWYXJ7XGNlbnRlcmluZ1xIdWdlXHJtfQotICBcQ2hSdWxlV2lkdGh7MnB0fQotCi0gIFxyZW5ld2NvbW1hbmR7XERPQ0h9eyUKLSAgICBcbWdocnVsZWZpbGx7M1xSV31ccGFyXG5vYnJlYWsKLSAgICBcdnNraXAgLTAuNVxiYXNlbGluZXNraXAKLSAgICBcbWdocnVsZWZpbGx7XFJXfVxwYXJcbm9icmVhawotICAgIFxDTlZcRm1Oe1xAY2hhcGFwcH1cc3BhY2UgXENOb1ZcdGhlY2hhcHRlcgotICAgIFxwYXJcbm9icmVhawotICAgIFx2c2tpcCAtMC41XGJhc2VsaW5lc2tpcAotICAgfQotICBccmVuZXdjb21tYW5ke1xET1RJfVsxXXslCi0gICAgXG1naHJ1bGVmaWxse1xSV31ccGFyXG5vYnJlYWsKLSAgICBcQ1RWXEZtVGl7IzF9XHBhclxub2JyZWFrCi0gICAgXHZza2lwIDYwXHBACi0gICAgfQotICBccmVuZXdjb21tYW5ke1xET1RJU31bMV17JQotICAgIFxtZ2hydWxlZmlsbHtcUld9XHBhclxub2JyZWFrCi0gICAgXENUVlxGbVRpeyMxfVxwYXJcbm9icmVhawotICAgIFx2c2tpcCA2MFxwQAotICAgIH0KLSAgfQotCi0lJSUlJSUlIFJFSk5FIERFRgotCi1cRGVjbGFyZU9wdGlvbntSZWpuZX17JQotCi0gIFxDaE5hbWVVcHBlckNhc2UKLSAgXENoVGl0bGVVcHBlckNhc2UgIAotICBcQ2hOYW1lVmFye1xjZW50ZXJpbmdcTGFyZ2Vccm19Ci0gIFxDaE51bVZhcntcSHVnZX0KLSAgXENoVGl0bGVWYXJ7XGNlbnRlcmluZ1xIdWdlXHJtfQotICBcQ2hSdWxlV2lkdGh7MXB0fQotICBccmVuZXdjb21tYW5ke1xET0NIfXslCi0gICAgXHNldHRvaGVpZ2h0e1xweX17XENOb1ZcdGhlY2hhcHRlcn0KLSAgICBcYWRkdG9sZW5ndGh7XHB5fXstMXB0fQotICAgIFxDTlZcRm1Oe1xAY2hhcGFwcH1ccGFyXG5vYnJlYWsKLSAgICBcdnNraXAgMjBccEAKLSAgICBcc2V0bGVuZ3Roe1xteWhpfXsyXGJhc2VsaW5lc2tpcH0KLSAgICBcc2V0bGVuZ3Roe1xweH17XG15aGl9Ci0gICAgXGFkZHRvbGVuZ3Roe1xweH17LTFcUld9Ci0gICAgXHJ1bGVbLTFccHhde1xSV317XG15aGl9XG1naHJ1bGVmaWxse1xSV31caHNraXAKLSAgICAxMHB0XHJhaXNlYm94ey0wLjVccHl9e1xDTm9WXHRoZWNoYXB0ZXJ9XGhza2lwCi0xMHB0XG1naHJ1bGVmaWxse1xSV31ccnVsZVstMVxweF17XFJXfXtcbXloaX1ccGFyXG5vYnJlYWsKLSAgICAgXHZza2lwIC0xXHBACi0gICAgfQotICBccmVuZXdjb21tYW5ke1xET1RJfVsxXXslCi0gICAgXHNldGxlbmd0aHtcbXlsZW59e1x0ZXh0d2lkdGh9Ci0gICAgXGFkZHRvbGVuZ3Roe1xteWxlbn17LTJcUld9Ci0gICAge1x2cnVsZSB3aWR0aFxSV31ccGFyYm94e1xteWxlbn17XENUVlxGbVRpeyMxfX17XHZydWxlCi13aWR0aFxSV31ccGFyXG5vYnJlYWsKLSAgICBcdnNraXAKLS0xcHRccnVsZXtcUld9ezJcYmFzZWxpbmVza2lwfVxtZ2hydWxlZmlsbHtcUld9XHJ1bGV7XFJXfXsyXGJhc2VsaW5lc2tpcH0KLSAgICBcdnNraXAgNjBccEAKLSAgICB9Ci0gIFxyZW5ld2NvbW1hbmR7XERPVElTfVsxXXslCi0gICAgXHNldGxlbmd0aHtccHl9e1xmYm94cnVsZX0KLSAgICBcc2V0bGVuZ3Roe1xmYm94cnVsZX17XFJXfQotICAgIFxzZXRsZW5ndGh7XG15bGVufXtcdGV4dHdpZHRofQotICAgIFxhZGR0b2xlbmd0aHtcbXlsZW59ey0yXFJXfQotICAgIFxmYm94e1xwYXJib3h7XG15bGVufXtcdnNraXAKLTJcYmFzZWxpbmVza2lwXENUVlxGbVRpeyMxfVxwYXJcbm9icmVha1x2c2tpcCBcYmFzZWxpbmVza2lwfX0gCi0gICAgXHNldGxlbmd0aHtcZmJveHJ1bGV9e1xweX0KLSAgICBcdnNraXAgNjBccEAKLSAgICB9Ci0gIH0KLQotCi0lJSUlJSUlIEJKQVJORSBERUYKLQotXERlY2xhcmVPcHRpb257Qmphcm5lfXslCi0gIFxDaE5hbWVVcHBlckNhc2UKLSAgXENoVGl0bGVVcHBlckNhc2UgIAotICBcQ2hOYW1lVmFye1xyYWdnZWRsZWZ0XG5vcm1hbHNpemVccm19Ci0gIFxDaE51bVZhcntccmFnZ2VkbGVmdCBcYmZzZXJpZXNcTGFyZ2V9Ci0gIFxDaFRpdGxlVmFye1xyYWdnZWRsZWZ0IFxMYXJnZVxybX0KLSAgXENoUnVsZVdpZHRoezFwdH0KLQotCi0lJSBOb3RlIHRoZWNoYXB0ZXIgLT4gY0BjaGFwdGVyIGZpeCBhcHBlbmRpeCBidWcKLQotICBcbmV3Y291bnRlcntBbHBoYUNudH0KLSAgXG5ld2NvdW50ZXJ7QWxwaGFEZWNDbnR9Ci0gIFxuZXdjb21tYW5ke1xBbHBoYU5vfXslCi0gICAgXGlmY2FzZVxudW1iZXJcdGhlQWxwaGFDbnQKLSAgICAgIFxpZm51bVxjQGNoYXB0ZXI9MAotICAgICAgICBaRVJPXGVsc2V7fVxmaQotICAgIFxvciBPTkVcb3IgVFdPXG9yIFRIUkVFXG9yIEZPVVJcb3IgRklWRQotICAgIFxvciBTSVhcb3IgU0VWRU5cb3IgRUlHSFRcb3IgTklORVxvciBURU4KLSAgICBcb3IgRUxFVkVOXG9yIFRXRUxWRVxvciBUSElSVEVFTlxvciBGT1VSVEVFTlxvciBGSUZURUVOCi0gICAgXG9yIFNJWFRFRU5cb3IgU0VWRU5URUVOXG9yIEVJR0hURUVOXG9yIE5JTkVURUVOXGZpCi19Ci0KLSAgXG5ld2NvbW1hbmR7XEFscGhhRGVjTm99eyUKLSAgICBcc2V0Y291bnRlcntBbHBoYURlY0NudH17MH0KLSAgICBcQHdoaWxlbnVtXG51bWJlclx0aGVBbHBoYUNudD4wXGRvCi0gICAgICB7XGFkZHRvY291bnRlcntBbHBoYUNudH17LTEwfQotICAgICAgIFxhZGR0b2NvdW50ZXJ7QWxwaGFEZWNDbnR9ezF9fQotICAgICBcaWZudW1cbnVtYmVyXHRoZUFscGhhQ250PTAKLSAgICAgXGVsc2UKLSAgICAgICBcYWRkdG9jb3VudGVye0FscGhhRGVjQ250fXstMX0KLSAgICAgICBcYWRkdG9jb3VudGVye0FscGhhQ250fXsxMH0KLSAgICAgXGZpCi0gICAgIAotICAgICAKLSAgICBcaWZjYXNlXG51bWJlclx0aGVBbHBoYURlY0NudFxvciBURU5cb3IgVFdFTlRZXG9yIFRISVJUWVxvcgotICAgIEZPUlRZXG9yIEZJRlRZXG9yIFNJWFRZXG9yIFNFVkVOVFlcb3IgRUlHSFRZXG9yIE5JTkVUWVxmaQotICAgIH0KLSAgXG5ld2NvbW1hbmR7XFRoZUFscGhhQ2hhcHRlcn17JQotICAgIAotICAgIFxpZmluYXBwIAotICAgICAgXHRoZWNoYXB0ZXIKLSAgICBcZWxzZQotICAgICAgXHNldGNvdW50ZXJ7QWxwaGFDbnR9e1xjQGNoYXB0ZXJ9Ci0gICAgICBcaWZudW1cY0BjaGFwdGVyPDIwCi0gICAgICAgIFxBbHBoYU5vCi0gICAgICBcZWxzZQotICAgICAgICBcQWxwaGFEZWNOb1xBbHBoYU5vCi0gICAgICBcZmkKLSAgICBcZmkKLSAgICB9ICAKLSAgXHJlbmV3Y29tbWFuZHtcRE9DSH17JQotICAgIFxtZ2hydWxlZmlsbHtcUld9XHBhclxub2JyZWFrCi0gICAgXENOVlxGbU57XEBjaGFwYXBwfVxwYXJcbm9icmVhayAKLSAgICBcQ05vVlxUaGVBbHBoYUNoYXB0ZXJccGFyXG5vYnJlYWsKLSAgICBcdnNraXAgLTFcYmFzZWxpbmVza2lwXHZza2lwIDVwdFxtZ2hydWxlZmlsbHtcUld9XHBhclxub2JyZWFrCi0gICAgXHZza2lwIDIwXHBACi0gICAgfQotICBccmVuZXdjb21tYW5ke1xET1RJfVsxXXslCi0gICAgXENUVlxGbVRpeyMxfVxwYXJcbm9icmVhawotICAgIFx2c2tpcCA0MFxwQAotICAgIH0KLSAgXHJlbmV3Y29tbWFuZHtcRE9USVN9WzFdeyUKLSAgICBcQ1RWXEZtVGl7IzF9XHBhclxub2JyZWFrCi0gICAgXHZza2lwIDQwXHBACi0gICAgfQotfQotCi1cRGVjbGFyZU9wdGlvbip7JQotICBcUGFja2FnZVdhcm5pbmd7ZmFuY3ljaGFwdGVyfXt1bmtub3duIHN0eWxlIG9wdGlvbn0KLSAgfQotCi1cUHJvY2Vzc09wdGlvbnMqIFxyZWxheAotCi1cZGVmXEBtYWtlY2hhcHRlcmhlYWQjMXslCi0gIFx2c3BhY2UqezUwXHBAfSUKLSAge1xwYXJpbmRlbnQgXHpAIFxyYWdnZWRyaWdodCBcbm9ybWFsZm9udAotICAgIFxpZm51bSBcY0BzZWNudW1kZXB0aCA+XG1AbmUKLSAgICAgIFxET0NICi0gICAgXGZpCi0gICAgXGludGVybGluZXBlbmFsdHlcQE0KLSAgICBcRE9USXsjMX0KLSAgfX0KLVxkZWZcQHNjaGFwdGVyIzF7XGlmQHR3b2NvbHVtbgotICAgICAgICAgICAgICAgICAgIFxAdG9wbmV3cGFnZVtcQG1ha2VzY2hhcHRlcmhlYWR7IzF9XSUKLSAgICAgICAgICAgICAgICAgXGVsc2UKLSAgICAgICAgICAgICAgICAgICBcQG1ha2VzY2hhcHRlcmhlYWR7IzF9JQotICAgICAgICAgICAgICAgICAgIFxAYWZ0ZXJoZWFkaW5nCi0gICAgICAgICAgICAgICAgIFxmaX0KLVxkZWZcQG1ha2VzY2hhcHRlcmhlYWQjMXslCi0gIFx2c3BhY2UqezUwXHBAfSUKLSAge1xwYXJpbmRlbnQgXHpAIFxyYWdnZWRyaWdodAotICAgIFxub3JtYWxmb250Ci0gICAgXGludGVybGluZXBlbmFsdHlcQE0KLSAgICBcRE9USVN7IzF9Ci0gICAgXHZza2lwIDQwXHBACi0gIH19Ci0KLVxlbmRpbnB1dAotCi0KZGlmZiAtLWdpdCBhL0RvYy90ZXhpbnB1dHMvaG93dG8uY2xzIGIvRG9jL3RleGlucHV0cy9ob3d0by5jbHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YmViNGEuLjAwMDAwMDAKLS0tIGEvRG9jL3RleGlucHV0cy9ob3d0by5jbHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotJQotJSBob3d0by5jbHMgZm9yIHRoZSBQeXRob24gZG9jdW1lbnRhdGlvbgotJQotCi1cTmVlZHNUZVhGb3JtYXR7TGFUZVgyZX1bMTk5NS8xMi8wMV0KLVxQcm92aWRlc0NsYXNze2hvd3RvfQotICAgICAgICAgICAgIFsxOTk4LzAyLzI1IERvY3VtZW50IGNsYXNzIChQeXRob24gSE9XVE8pXQotCi1cUmVxdWlyZVBhY2thZ2V7cHlwYXBlcn0KLVxSZXF1aXJlUGFja2FnZXtmYW5jeWJveH0KLQotJSBDaGFuZ2UgdGhlIG9wdGlvbnMgaGVyZSB0byBnZXQgYSBkaWZmZXJlbnQgc2V0IG9mIGJhc2ljIG9wdGlvbnMsICBUaGlzCi0lIGlzIHdoZXJlIHRvIGFkZCB0aGluZ3MgbGlrZSAiYTRwYXBlciIgb3IgIjEwcHQiLgotJQotXExvYWRDbGFzc1tccHlAcGFwZXIsXHB5QHB0c2l6ZSx0d29zaWRlXXthcnRpY2xlfQotCi1cc2V0Y291bnRlcntzZWNudW1kZXB0aH17MX0KLQotJSBPcHRpb25hbCBwYWNrYWdlczoKLSUKLSUgSWYgcHJvY2Vzc2luZyBvZiB0aGVzZSBkb2N1bWVudHMgZmFpbHMgYXQgeW91ciBUZVggaW5zdGFsbGF0aW9uLAotJSB0aGVzZSBtYXkgYmUgY29tbWVudGVkIG91dCAoaW5kZXBlbmRlbnRseSkgdG8gbWFrZSB0aGluZ3Mgd29yay4KLSUgVGhlc2UgYXJlIGJvdGggc3VwcGxpZWQgd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSB0ZVRlWAotJSBkaXN0cmlidXRpb24uCi0lCi0lIFRoZSAiZmFuY3loZHIiIHBhY2thZ2UgbWFrZXMgbmljZXIgcGFnZSBmb290ZXJzIHJlYXNvbmFibGUgdG8KLSUgaW1wbGVtZW50LCBhbmQgaXMgdXNlZCB0byBwdXQgdGhlIGNoYXB0ZXIgYW5kIHNlY3Rpb24gaW5mb3JtYXRpb24gaW4gCi0lIHRoZSBmb290ZXJzLgotJQotXFJlcXVpcmVQYWNrYWdle2ZhbmN5aGRyfVx0eXBlb3V0e1VzaW5nIGZhbmNpZXIgZm9vdGVycyB0aGFuIHVzdWFsLn0KLQotCi0lIFJlcXVpcmVkIHBhY2thZ2U6Ci0lCi0lIFRoaXMgZ2l2ZXMgdXMgYWxsIHRoZSBQeXRob24tc3BlY2lmaWMgbWFya3VwIHRoYXQgd2UgcmVhbGx5IHdhbnQuCi0lIFRoaXMgc2hvdWxkIGNvbWUgbGFzdC4gIERvIG5vdCBjaGFuZ2UgdGhpcy4KLSUKLVxSZXF1aXJlUGFja2FnZXtweXRob259Ci0KLSUgc3VwcG9ydCBmb3IgbW9kdWxlIHN5bm9wc2lzIHNlY3Rpb25zOgotXG5ld2NvbW1hbmR7XHB5QE1vZFN5bm9wc2lzRmlsZW5hbWV9e1xqb2JuYW1lLnN5bn0KLQotCi0lIG5lZWQgdG8gZG8gb25lIG9mIHRoZXNlLi4uLgotXG5ld2NvbW1hbmR7XHB5QGRvSG9yaXpvbnRhbFJ1bGV9e1xydWxle1x0ZXh0d2lkdGh9ezFwdH19Ci0KLQotJSBDaGFuZ2UgdGhlIHRpdGxlIHBhZ2UgdG8gbG9vayBhIGJpdCBiZXR0ZXIsIGFuZCBmaXQgaW4gd2l0aCB0aGUKLSUgZm5jeWNoYXAgYGBCamFybmUnJyBzdHlsZSBhIGJpdCBiZXR0ZXIuCi0lCi1ccmVuZXdjb21tYW5ke1xtYWtldGl0bGV9ewotICBccHlAZG9Ib3Jpem9udGFsUnVsZQotICBcaWZwZGYKLSAgICBcYmVnaW5ncm91cAotICAgICUgVGhpcyBcZGVmIGlzIHJlcXVpcmVkIHRvIGRlYWwgd2l0aCBtdWx0aS1saW5lIGF1dGhvcnM7IGl0Ci0gICAgJSBjaGFuZ2VzIFxcIHRvICcsICcgKGNvbW1hLXNwYWNlKSwgbWFraW5nIGl0IHBhc3MgbXVzdGVyIGZvcgotICAgICUgZ2VuZXJhdGluZyBkb2N1bWVudCBpbmZvIGluIHRoZSBQREYgZmlsZS4KLSAgICBcZGVmXFx7LCB9Ci0gICAgXHBkZmluZm97Ci0gICAgICAvQXV0aG9yIChcQGF1dGhvcikKLSAgICAgIC9UaXRsZSAoXEB0aXRsZSkKLSAgICB9Ci0gICAgXGVuZGdyb3VwCi0gIFxmaQotICBcYmVnaW57Zmx1c2hyaWdodH0KLSAgICB7XHJtXEh1Z2VccHlASGVhZGVyRmFtaWx5IFxAdGl0bGV9IFxwYXIKLSAgICB7XGVtXGxhcmdlXHB5QEhlYWRlckZhbWlseSBccHlAcmVsZWFzZVxyZWxlYXNlaW5mb30gXHBhcgotICAgIFx2c3BhY2V7MjVwdH0KLSAgICB7XExhcmdlXHB5QEhlYWRlckZhbWlseSBcQGF1dGhvcn0gXHBhcgotICAgIFx2c3BhY2V7MjVwdH0KLSAgICBcQGRhdGUgXHBhcgotICAgIFxweUBhdXRob3JhZGRyZXNzIFxwYXIKLSAgXGVuZHtmbHVzaHJpZ2h0fQotICBcQHRoYW5rcwotICBcc2V0Y291bnRlcntmb290bm90ZX17MH0KLSAgXGxldFx0aGFua3NccmVsYXhcbGV0XG1ha2V0aXRsZVxyZWxheAotICBcZ2RlZlxAdGhhbmtze31cZ2RlZlxAYXV0aG9ye31cZ2RlZlxAdGl0bGV7fQotfQotCi0KLVxsZXRccHlAT2xkVGFibGVvZmNvbnRlbnRzPVx0YWJsZW9mY29udGVudHMKLVxyZW5ld2NvbW1hbmR7XHRhYmxlb2Zjb250ZW50c317Ci0gIFxiZWdpbmdyb3VwCi0gICAgXHBhcnNraXAgPSAwbW0KLSAgICBccHlAT2xkVGFibGVvZmNvbnRlbnRzCi0gIFxlbmRncm91cAotICBccHlAZG9Ib3Jpem9udGFsUnVsZQotICBcdnNwYWNlezEycHR9Ci0gIFxweUBkb2luZ0BwYWdlQHRhcmdldHN0cnVlCi19ICAKLQotJSBGaXggdGhlIHRoZWluZGV4IGVudmlyb25tZW50IHRvIGFkZCBhbiBlbnRyeSB0byB0aGUgVGFibGUgb2YKLSUgQ29udGVudHM7IHRoaXMgaXMgbXVjaCBuaWNlciB0aGFuIGp1c3QgaGF2aW5nIHRvIGp1bXAgdG8gdGhlIGVuZCBvZgotJSB0aGUgYm9vayBhbmQgZmxpcCBhcm91bmQsIGVzcGVjaWFsbHkgd2l0aCBtdWx0aXBsZSBpbmRleGVzLgotJQotXGxldFxweUBPbGRUaGVpbmRleD1cdGhlaW5kZXgKLVxyZW5ld2NvbW1hbmR7XHRoZWluZGV4fXsKLSAgXGNsZWFycGFnZQotICBccHlAT2xkVGhlaW5kZXgKLSAgXGFkZGNvbnRlbnRzbGluZXt0b2N9e3NlY3Rpb259e1xpbmRleG5hbWV9Ci19Ci0KLVxAaWZ1bmRlZmluZWR7ZmFuY3loZn17Ci0gIFxwYWdlc3R5bGV7cGxhaW59fXsKLSAgXHBhZ2VzdHlsZXtub3JtYWx9fQkJJSBzdGFydCB0aGlzIHdheTsgY2hhbmdlIGZvcgotXHBhZ2VudW1iZXJpbmd7YXJhYmljfQkJJSBUb0MgJiBjaGFwdGVycwotXHNldGNvdW50ZXJ7c2VjbnVtZGVwdGh9ezJ9Ci0KLVx0aGlzcGFnZXN0eWxle2VtcHR5fQpkaWZmIC0tZ2l0IGEvRG9jL3RleGlucHV0cy9sdHhtYXJrdXAuc3R5IGIvRG9jL3RleGlucHV0cy9sdHhtYXJrdXAuc3R5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2UwOGNjLi4wMDAwMDAwCi0tLSBhL0RvYy90ZXhpbnB1dHMvbHR4bWFya3VwLnN0eQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSUgQ3JlYXRlZCBieSBGcmVkIEwuIERyYWtlLCBKci4gPGZkcmFrZUBhY20ub3JnPiwgYXMgcGFydCBvZiB0aGUKLSUgUHl0aG9uIERvY3VtZW50YXRpb24gUHJvamVjdC4KLSUKLSUgRGVmaW5lIHNvbWUgc2ltcGxlIG1hcmt1cCBmb3IgdGhlIExhVGVYIGNvbW1hbmQgZG9jdW1lbnRhdGlvbjoKLQotXFByb3ZpZGVzUGFja2FnZXtsdHhtYXJrdXB9Ci1cUmVxdWlyZVBhY2thZ2V7cHl0aG9ufSAgICAgICUgZnVsbGxpbmVpdGVtcyBlbnZpcm9ubWVudAotCi0lIFRoZXNlIHR3byBtYWNyb3MgYXJlIHVzZWQgaW4gY29uc3RydWN0aW5nIHRoZSBsYXN0IHBhcmFtZXRlciB0byB0aGUKLSUgZW52ZGVzYyBhbmQgbWFjcm9kZXNjIGVudmlyb25tZW50cy4KLQotXG5ld2NvbW1hbmR7XHB5QGx0eEBvcHRwYXJhbX1bMV17e1t9XHZhcnsjMX17XX19Ci1cbmV3Y29tbWFuZHtccHlAbHR4QHBhcmFtfVsxXXtce1x2YXJ7IzF9XH19Ci0KLVxuZXdlbnZpcm9ubWVudHtlbnZkZXNjfVsyXXsKLSAgXGJlZ2lue2Z1bGxsaW5laXRlbXN9Ci0gICAgXGl0ZW1bXGNvZGV7XGUgYmVnaW5ce3tcYmZzZXJpZXMgIzF9XH17JQotICAgICAgXGxldFxvcD1ccHlAbHR4QG9wdHBhcmFtJQotICAgICAgXGxldFxwPVxweUBsdHhAcGFyYW0lCi0gICAgICBcbGV0XHVuc3BlY2lmaWVkPVxweUB1bnNwZWNpZmllZCUKLSAgICAgIFxsZXRcbW9yZWFyZ3M9XHB5QG1vcmVhcmdzJQotICAgICAgICAgIzJ9fV0KLSAgICBcaXRlbVtcY29kZXtcZSBlbmRce3tcYmZzZXJpZXMgIzF9XH19XQotICAgIFxpbmRleHsjMSBlbnZpcm9ubWVudEBccHlAaWR4Y29kZXsjMX0gZW52aXJvbm1lbnR9Ci0gICAgXGluZGV4e2Vudmlyb25tZW50cyEjMUBccHlAaWR4Y29kZXsjMX19Ci19e1xlbmR7ZnVsbGxpbmVpdGVtc319Ci0KLVxuZXdlbnZpcm9ubWVudHttYWNyb2Rlc2N9WzJdewotICBcYmVnaW57ZnVsbGxpbmVpdGVtc30KLSAgICBcaXRlbVtcY29kZXt7XGVcYmZzZXJpZXMjMX17JQotICAgICAgXGxldFxvcD1ccHlAbHR4QG9wdHBhcmFtJQotICAgICAgXGxldFxwPVxweUBsdHhAcGFyYW0lCi0gICAgICBcbGV0XHVuc3BlY2lmaWVkPVxweUB1bnNwZWNpZmllZCUKLSAgICAgIFxsZXRcbW9yZWFyZ3M9XHB5QG1vcmVhcmdzJQotICAgICAgIzJ9fV0KLSAgICBcaW5kZXh7IzFAXHB5QGlkeGNvZGV7IzF9fQotfXtcZW5ke2Z1bGxsaW5laXRlbXN9fQotCi1cbmV3Y29tbWFuZHtcZW52fVsxXXtcY29kZXsjMX19Ci1cbmV3Y29tbWFuZHtcbWFjcm99WzFde1xjb2Rle1xlIzF9fQpkaWZmIC0tZ2l0IGEvRG9jL3RleGlucHV0cy9tYW51YWwuY2xzIGIvRG9jL3RleGlucHV0cy9tYW51YWwuY2xzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGFhNDA0Li4wMDAwMDAwCi0tLSBhL0RvYy90ZXhpbnB1dHMvbWFudWFsLmNscworKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0lCi0lIG1hbnVhbC5jbHMgZm9yIHRoZSBQeXRob24gZG9jdW1lbnRhdGlvbgotJQotCi1cTmVlZHNUZVhGb3JtYXR7TGFUZVgyZX1bMTk5NS8xMi8wMV0KLVxQcm92aWRlc0NsYXNze21hbnVhbH0KLSAgICAgICAgICAgICBbMTk5OC8wMy8wMyBEb2N1bWVudCBjbGFzcyAoUHl0aG9uIG1hbnVhbCldCi0KLVxSZXF1aXJlUGFja2FnZXtweXBhcGVyfQotXFJlcXVpcmVQYWNrYWdle2ZhbmN5Ym94fQotCi0lIENoYW5nZSB0aGUgb3B0aW9ucyBoZXJlIHRvIGdldCBhIGRpZmZlcmVudCBzZXQgb2YgYmFzaWMgb3B0aW9ucywgYnV0IG9ubHkKLSUgaWYgeW91IGhhdmUgdG8uICBQYXBlciBhbmQgZm9udCBzaXplIHNob3VsZCBiZSBhZGp1c3RlZCBpbiBweXBhcGVyLnN0eS4KLSUKLVxMb2FkQ2xhc3NbXHB5QHBhcGVyLFxweUBwdHNpemUsdHdvc2lkZSxvcGVucmlnaHRde3JlcG9ydH0KLQotXHNldGNvdW50ZXJ7c2VjbnVtZGVwdGh9ezJ9Ci0KLSUgT3B0aW9uYWwgcGFja2FnZXM6Ci0lCi0lIElmIHByb2Nlc3Npbmcgb2YgdGhlc2UgZG9jdW1lbnRzIGZhaWxzIGF0IHlvdXIgVGVYIGluc3RhbGxhdGlvbiwKLSUgdGhlc2UgbWF5IGJlIGNvbW1lbnRlZCBvdXQgKGluZGVwZW5kZW50bHkpIHRvIG1ha2UgdGhpbmdzIHdvcmsuCi0lIFRoZXNlIGFyZSBib3RoIHN1cHBsaWVkIHdpdGggdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgdGVUZVgKLSUgZGlzdHJpYnV0aW9uLgotJQotJSBUaGUgImZhbmN5aGRyIiBwYWNrYWdlIG1ha2VzIG5pY2VyIHBhZ2UgZm9vdGVycyByZWFzb25hYmxlIHRvCi0lIGltcGxlbWVudCwgYW5kIGlzIHVzZWQgdG8gcHV0IHRoZSBjaGFwdGVyIGFuZCBzZWN0aW9uIGluZm9ybWF0aW9uIGluIAotJSB0aGUgZm9vdGVycy4KLSUKLVxSZXF1aXJlUGFja2FnZXtmYW5jeWhkcn1cdHlwZW91dHtVc2luZyBmYW5jaWVyIGZvb3RlcnMgdGhhbiB1c3VhbC59Ci0KLQotJSBSZXF1aXJlZCBwYWNrYWdlczoKLSUKLSUgVGhlICJmbmN5Y2hhcCIgcGFja2FnZSBpcyB1c2VkIHRvIGdldCB0aGUgbmljZSBjaGFwdGVyIGhlYWRlcnMuICBUaGUKLSUgLnN0eSBmaWxlIGlzIGRpc3RyaWJ1dGVkIHdpdGggUHl0aG9uLCBzbyB5b3Ugc2hvdWxkIG5vdCBuZWVkIHRvIGRpc2FibGUKLSUgaXQuICBZb3UnZCBhbHNvIGVuZCB1cCB3aXRoIGEgbWl4ZWQgcGFnZSBzdHlsZTsgdWdsaWVyIHRoYW4gc3RvY2sgTGFUZVghCi0lCi1cUmVxdWlyZVBhY2thZ2VbQmphcm5lXXtmbmN5Y2hhcH1cdHlwZW91dHtVc2luZyBmYW5jeSBjaGFwdGVyIGhlYWRpbmdzLn0KLSUgRG8gaG9yaXpvbnRhbCBydWxlcyBpdCB0aGlzIHdheSB0byBtYXRjaDoKLVxuZXdjb21tYW5ke1xweUBkb0hvcml6b250YWxSdWxlfXtcbWdocnVsZWZpbGx7XFJXfX0KLSUKLSUKLSUgVGhpcyBnaXZlcyB1cyBhbGwgdGhlIFB5dGhvbi1zcGVjaWZpYyBtYXJrdXAgdGhhdCB3ZSByZWFsbHkgd2FudC4KLSUgVGhpcyBzaG91bGQgY29tZSBsYXN0LiAgRG8gbm90IGNoYW5nZSB0aGlzLgotJQotXFJlcXVpcmVQYWNrYWdle3B5dGhvbn0KLQotJSBzdXBwb3J0IGZvciBtb2R1bGUgc3lub3BzaXMgc2VjdGlvbnM6Ci1cbmV3Y29tbWFuZHtccHlATW9kU3lub3BzaXNGaWxlbmFtZX17XGpvYm5hbWVcdGhlY2hhcHRlci5zeW59Ci1cbGV0XHB5QE9sZENoYXB0ZXI9XGNoYXB0ZXIKLVxyZW5ld2NvbW1hbmR7XGNoYXB0ZXJ9ewotICBccHlAUHJvY2Vzc01vZFN5bm9wc2lzCi0gIFxweUBjbG9zZU1vZFN5bm9wc2lzRmlsZQotICBccHlAT2xkQ2hhcHRlcgotfQotCi0KLSUgQ2hhbmdlIHRoZSB0aXRsZSBwYWdlIHRvIGxvb2sgYSBiaXQgYmV0dGVyLCBhbmQgZml0IGluIHdpdGggdGhlCi0lIGZuY3ljaGFwIGBgQmphcm5lJycgc3R5bGUgYSBiaXQgYmV0dGVyLgotJQotXHJlbmV3Y29tbWFuZHtcbWFrZXRpdGxlfXslCi0gIFxiZWdpbnt0aXRsZXBhZ2V9JQotICAgIFxsZXRcZm9vdG5vdGVzaXplXHNtYWxsCi0gICAgXGxldFxmb290bm90ZXJ1bGVccmVsYXgKLSAgICBccHlAZG9Ib3Jpem9udGFsUnVsZSUKLSAgICBcaWZwZGYKLSAgICAgIFxiZWdpbmdyb3VwCi0gICAgICAlIFRoaXMgXGRlZiBpcyByZXF1aXJlZCB0byBkZWFsIHdpdGggbXVsdGktbGluZSBhdXRob3JzOyBpdAotICAgICAgJSBjaGFuZ2VzIFxcIHRvICcsICcgKGNvbW1hLXNwYWNlKSwgbWFraW5nIGl0IHBhc3MgbXVzdGVyIGZvcgotICAgICAgJSBnZW5lcmF0aW5nIGRvY3VtZW50IGluZm8gaW4gdGhlIFBERiBmaWxlLgotICAgICAgXGRlZlxceywgfQotICAgICAgXHBkZmluZm97Ci0gICAgICAgIC9BdXRob3IgKFxAYXV0aG9yKQotICAgICAgICAvVGl0bGUgKFxAdGl0bGUpCi0gICAgICB9Ci0gICAgICBcZW5kZ3JvdXAKLSAgICBcZmkKLSAgICBcYmVnaW57Zmx1c2hyaWdodH0lCi0gICAgICB7XHJtXEh1Z2VccHlASGVhZGVyRmFtaWx5IFxAdGl0bGUgXHBhcn0lCi0gICAgICB7XGVtXExBUkdFXHB5QEhlYWRlckZhbWlseSBccHlAcmVsZWFzZVxyZWxlYXNlaW5mbyBccGFyfQotICAgICAgXHZmaWxsCi0gICAgICB7XExBUkdFXHB5QEhlYWRlckZhbWlseSBcQGF1dGhvciBccGFyfQotICAgICAgXHZmaWxsXHZmaWxsCi0gICAgICB7XGxhcmdlCi0gICAgICAgXEBkYXRlIFxwYXIKLSAgICAgICBcdmZpbGwKLSAgICAgICBccHlAYXV0aG9yYWRkcmVzcyBccGFyCi0gICAgICB9JQotICAgIFxlbmR7Zmx1c2hyaWdodH0lXHBhcgotICAgIFxAdGhhbmtzCi0gIFxlbmR7dGl0bGVwYWdlfSUKLSAgXHNldGNvdW50ZXJ7Zm9vdG5vdGV9ezB9JQotICBcbGV0XHRoYW5rc1xyZWxheFxsZXRcbWFrZXRpdGxlXHJlbGF4Ci0gIFxnZGVmXEB0aGFua3N7fVxnZGVmXEBhdXRob3J7fVxnZGVmXEB0aXRsZXt9Ci19Ci0KLQotJSBDYXRjaCB0aGUgZW5kIG9mIHRoZSB7YWJzdHJhY3R9IGVudmlyb25tZW50LCBidXQgaGVyZSBtYWtlIHN1cmUgdGhlCi0lIGFic3RyYWN0IGlzIGZvbGxvd2VkIGJ5IGEgYmxhbmsgcGFnZSBpZiB0aGUgJ29wZW5yaWdodCcgb3B0aW9uIGlzIHVzZWQuCi0lCi1cbGV0XHB5QE9sZEVuZEFic3RyYWN0PVxlbmRhYnN0cmFjdAotXHJlbmV3Y29tbWFuZHtcZW5kYWJzdHJhY3R9ewotICBcaWZAb3BlbnJpZ2h0Ci0gICAgXGlmb2RkXHZhbHVle3BhZ2V9Ci0gICAgICBcdHlwZW91dHtBZGRpbmcgYmxhbmsgcGFnZSBhZnRlciB0aGUgYWJzdHJhY3QufQotICAgICAgXHZmaWxccGFnZWJyZWFrCi0gICAgXGZpCi0gIFxmaQotICBccHlAT2xkRW5kQWJzdHJhY3QKLX0KLQotJSBUaGlzIHdyYXBzIHRoZSBcdGFibGVvZmNvbnRlbnRzIG1hY3JvIHdpdGggYWxsIHRoZSBtYWdpYyB0byBnZXQgdGhlCi0lIHNwYWNpbmcgcmlnaHQgYW5kIGhhdmUgdGhlIHJpZ2h0IG51bWJlciBvZiBwYWdlcyBpZiB0aGUgJ29wZW5yaWdodCcKLSUgb3B0aW9uIGhhcyBiZWVuIHVzZWQuICBUaGlzIGVsaW1pbmF0ZXMgYSBmYWlyIGFtb3VudCBvZiBjcnVkIGluIHRoZQotJSBpbmRpdmlkdWFsIGRvY3VtZW50IGZpbGVzLgotJQotXGxldFxweUBPbGRUYWJsZW9mY29udGVudHM9XHRhYmxlb2Zjb250ZW50cwotXHJlbmV3Y29tbWFuZHtcdGFibGVvZmNvbnRlbnRzfXslCi0gIFxzZXRjb3VudGVye3BhZ2V9ezF9JQotICBccGFnZWJyZWFrJQotICBccGFnZXN0eWxle3BsYWlufSUKLSAgeyUKLSAgICBccGFyc2tpcCA9IDBtbSUKLSAgICBccHlAT2xkVGFibGVvZmNvbnRlbnRzJQotICAgIFxpZkBvcGVucmlnaHQlCi0gICAgICBcaWZvZGRcdmFsdWV7cGFnZX0lCi0gICAgICAgIFx0eXBlb3V0e0FkZGluZyBibGFuayBwYWdlIGFmdGVyIHRoZSB0YWJsZSBvZiBjb250ZW50cy59JQotICAgICAgICBccGFnZWJyZWFrXGhzcGFjZXswcHR9JQotICAgICAgXGZpJQotICAgIFxmaSUKLSAgICBcY2xlYXJkb3VibGVwYWdlJQotICB9JQotICBccGFnZW51bWJlcmluZ3thcmFiaWN9JQotICBcQGlmdW5kZWZpbmVke2ZhbmN5aGZ9e317XHBhZ2VzdHlsZXtub3JtYWx9fSUKLSAgXHB5QGRvaW5nQHBhZ2VAdGFyZ2V0c3RydWUlCi19Ci0lIFRoaXMgaXMgbmVlZGVkIHRvIGdldCB0aGUgd2lkdGggb2YgdGhlIHNlY3Rpb24gIyBhcmVhIHdpZGUgZW5vdWdoIGluIHRoZQotJSBsaWJyYXJ5IHJlZmVyZW5jZS4gIERvaW5nIGl0IGhlcmUga2VlcHMgaXQgdGhlIHNhbWUgZm9yIGFsbCB0aGUgbWFudWFscy4KLSUKLVxyZW5ld2NvbW1hbmQqXGxAc2VjdGlvbntcQGRvdHRlZHRvY2xpbmV7MX17MS41ZW19ezIuNmVtfX0KLVxyZW5ld2NvbW1hbmQqXGxAc3Vic2VjdGlvbntcQGRvdHRlZHRvY2xpbmV7Mn17NC4xZW19ezMuNWVtfX0KLVxzZXRjb3VudGVye3RvY2RlcHRofXsxfQotCi0KLSUgRml4IHRoZSB0aGVpbmRleCBlbnZpcm9ubWVudCB0byBhZGQgYW4gZW50cnkgdG8gdGhlIFRhYmxlIG9mCi0lIENvbnRlbnRzOyB0aGlzIGlzIG11Y2ggbmljZXIgdGhhbiBqdXN0IGhhdmluZyB0byBqdW1wIHRvIHRoZSBlbmQgb2YKLSUgdGhlIGJvb2sgYW5kIGZsaXAgYXJvdW5kLCBlc3BlY2lhbGx5IHdpdGggbXVsdGlwbGUgaW5kZXhlcy4KLSUKLVxsZXRccHlAT2xkVGhlaW5kZXg9XHRoZWluZGV4Ci1ccmVuZXdjb21tYW5ke1x0aGVpbmRleH17Ci0gIFxjbGVhcmRvdWJsZXBhZ2UKLSAgXHB5QE9sZFRoZWluZGV4Ci0gIFxhZGRjb250ZW50c2xpbmV7dG9jfXtjaGFwdGVyfXtcaW5kZXhuYW1lfQotfQpkaWZmIC0tZ2l0IGEvRG9jL3RleGlucHV0cy9weXBhcGVyLnN0eSBiL0RvYy90ZXhpbnB1dHMvcHlwYXBlci5zdHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NTk2MzcuLjAwMDAwMDAKLS0tIGEvRG9jL3RleGlucHV0cy9weXBhcGVyLnN0eQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSUKLSUgIENoYW5nZSB0aGlzIHRvIHNheSBhNHBhcGVyIGluc3RlYWQgb2YgbGV0dGVycGFwZXIgaWYgeW91IHdhbnQgQTQuICBUaGVzZQotJSAgYXJlIHRoZSBsYXRleCBkZWZhdWx0cy4KLSUKLVxuZXdjb21tYW5ke1xweUBwYXBlcn17bGV0dGVycGFwZXJ9Ci1cbmV3Y29tbWFuZHtccHlAcHRzaXplfXsxMHB0fQotCi0lICBUaGVzZSBzZXQgdXAgdGhlIGZvbnRzIGZvciB0aGUgZG9jdW1lbnRzLgotJQotJSAgVGhlICJ0aW1lcyIgcGFja2FnZSBtYWtlcyB0aGUgZGVmYXVsdCBmb250IHRoZSBQb3N0U2NyaXB0IFRpbWVzCi0lICBmb250LCB3aGljaCBtYWtlcyBmb3Igc21hbGxlciBQb3N0U2NyaXB0IGFuZCBhIGZvbnQgdGhhdCBtb3JlIHBlb3BsZSAKLSUgIGxpa2UuCi0lCi0lICBUaGUgImF2YW50IiBwYWNrYWdlIGNhdXNlcyB0aGUgQXZhbnRHYXJkZSBmb250IHRvIGJlIHVzZWQgZm9yCi0lICBzYW5zLXNlcmlmIHRleHQsIGluc3RlYWQgb2YgdGhlIHVnbGllciBIZWx2ZXRpY2Egc2V0IHVwIGJ5IHRoZSAidGltZXMiCi0lICBwYWNrYWdlLgotJQotXFJlcXVpcmVQYWNrYWdle3RpbWVzfVx0eXBlb3V0e1VzaW5nIFRpbWVzIGluc3RlYWQgb2YgQ29tcHV0ZXIgTW9kZXJuLn0KZGlmZiAtLWdpdCBhL0RvYy90ZXhpbnB1dHMvcHl0aG9uLmlzdCBiL0RvYy90ZXhpbnB1dHMvcHl0aG9uLmlzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZmYTBmOS4uMDAwMDAwMAotLS0gYS9Eb2MvdGV4aW5wdXRzL3B5dGhvbi5pc3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1saW5lX21heCAxMDAKLWhlYWRpbmdzX2ZsYWcgMQotaGVhZGluZ19wcmVmaXggIiAgXFxiaWdsZXR0ZXIgIgotCi1wcmVhbWJsZSAiXFxiZWdpbnt0aGVpbmRleH0KLVxcZGVmXFxiaWdsZXR0ZXIjMXt7XFxMYXJnZVxcc2ZmYW1pbHkjMX1cXG5vcGFnZWJyZWFrXFx2c3BhY2V7MW1tfX0KLQotIgotCi1zeW1oZWFkX3Bvc2l0aXZlICJ7U3ltYm9sc30iCi1udW1oZWFkX3Bvc2l0aXZlICJ7TnVtYmVyc30iCmRpZmYgLS1naXQgYS9Eb2MvdGV4aW5wdXRzL3B5dGhvbi5zdHkgYi9Eb2MvdGV4aW5wdXRzL3B5dGhvbi5zdHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NDMyM2UuLjAwMDAwMDAKLS0tIGEvRG9jL3RleGlucHV0cy9weXRob24uc3R5CisrKyAvZGV2L251bGwKQEAgLTEsMTMyNyArMCwwIEBACi0lCi0lIHB5dGhvbi5zdHkgZm9yIHRoZSBQeXRob24gZG9jdW1tZW50YXRpb24gIFt3b3JrcyBvbmx5IHdpdGggTGF0ZXgyZV0KLSUKLQotXE5lZWRzVGVYRm9ybWF0e0xhVGVYMmV9WzE5OTUvMTIvMDFdCi1cUHJvdmlkZXNQYWNrYWdle3B5dGhvbn0KLSAgICAgICAgICAgICBbMTk5OC8wMS8xMSBMYVRlWCBwYWNrYWdlIChQeXRob24gbWFya3VwKV0KLQotXFJlcXVpcmVQYWNrYWdle2xvbmd0YWJsZX0KLVxSZXF1aXJlUGFja2FnZXt1bmRlcnNjb3JlfQotCi0lIFVuY29tbWVudCB0aGVzZSB0d28gbGluZXMgdG8gaWdub3JlIHRoZSBwYXBlciBzaXplIGFuZCBtYWtlIHRoZSBwYWdlIAotJSBzaXplIG1vcmUgbGlrZSBhIHR5cGljYWwgcHVibGlzaGVkIG1hbnVhbC4KLSVccmVuZXdjb21tYW5ke1xwYXBlcmhlaWdodH17OWlufQotJVxyZW5ld2NvbW1hbmR7XHBhcGVyd2lkdGh9ezguNWlufSAgICUgdHlwaWNhbCBzcXVhcmlzaCBtYW51YWwKLSVccmVuZXdjb21tYW5ke1xwYXBlcndpZHRofXs3aW59ICAgICAlIE8nUmVpbGx5IGBgUHJvZ3JhbW1taW5nIFB5dGhvbicnCi0KLSUgVGhlc2UgcGFja2FnZXMgY2FuIGJlIHVzZWQgdG8gYWRkIG1hcmdpbmFsIGFubm90YXRpb25zIHdoaWNoIGluZGljYXRlCi0lIGluZGV4IGVudHJpZXMgYW5kIGxhYmVsczsgdXNlZnVsIGZvciByZXZpZXdpbmcgdGhpcyBtZXNzeSBkb2N1bWVudGF0aW9uIQotJQotJVxSZXF1aXJlUGFja2FnZXtzaG93a2V5c30KLSVcUmVxdWlyZVBhY2thZ2V7c2hvd2lkeH0KLQotJSBJZiB3ZSBldmVyIHdhbnQgdG8gaW5kZW50IHBhcmFncmFwaHMsIHRoaXMgbmVlZHMgdG8gYmUgY2hhbmdlZC4KLSUgVGhpcyBpcyB1c2VkIGluc2lkZSB0aGUgbWFjcm9zIGRlZmluZWQgaGVyZSBpbnN0ZWFkIG9mIGNvZGluZwotJSBcbm9pbmRlbnQgZGlyZWN0bHkuCi1cbGV0XHB5QHBhcmluZGVudD1cbm9pbmRlbnQKLQotJSBmb3IgUERGIG91dHB1dCwgdXNlIG1heGltYWwgY29tcHJlc3Npb24gJiBhIGxvdCBvZiBvdGhlciBzdHVmZgotJSAodGVzdCBmb3IgUERGIHJlY29tbWVuZGVkIGJ5IFRhbm1veSBCaGF0dGFjaGFyeWEgPHRhbm1veUBxY2QubGFubC5nb3Y+KQotJQotXG5ld2lmXGlmcHlAZG9pbmdAcGFnZUB0YXJnZXRzCi1ccHlAZG9pbmdAcGFnZUB0YXJnZXRzZmFsc2UKLQotXG5ld2lmXGlmcGRmXHBkZmZhbHNlCi1caWZ4XHBkZm91dHB1dFx1bmRlZmluZWRcZWxzZVxpZmNhc2VccGRmb3V0cHV0Ci1cZWxzZQotICBccGRmdHJ1ZQotICBcaW5wdXR7cGRmY29sb3J9Ci0gIFxsZXRccHlATGlua0NvbG9yPVxOYXZ5Qmx1ZQotICBcbGV0XHB5QE5vcm1hbENvbG9yPVxCbGFjawotICBccGRmY29tcHJlc3NsZXZlbD05Ci0gIFxwZGZwYWdld2lkdGg9XHBhcGVyd2lkdGggICAgJSBwYWdlIHdpZHRoIG9mIFBERiBvdXRwdXQKLSAgXHBkZnBhZ2VoZWlnaHQ9XHBhcGVyaGVpZ2h0ICAlIHBhZ2UgaGVpZ2h0IG9mIFBERiBvdXRwdXQKLSAgJQotICAlIFBhZCB0aGUgbnVtYmVyIHdpdGggJzAnIHRvIDMgZGlnaXRzIHdpZGUgc28gbm8gcGFnZSBuYW1lIGlzIGEgcHJlZml4Ci0gICUgb2YgYW55IG90aGVyLgotICAlCi0gIFxuZXdjb21tYW5ke1xweUB0YXJnZXRub31bMV17XGlmbnVtIzE8MTAwIDBcZmlcaWZudW0jMTwxMCAwXGZpIzF9Ci0gIFxuZXdjb21tYW5ke1xweUBwYWdlbm99e1xweUB0YXJnZXRub1x0aGVwYWdlfQotICAlCi0gICUgVGhpcyBkZWZpbml0aW9uIGFsbG93cyB0aGUgZW50cmllcyBpbiB0aGUgcGFnZS12aWV3IG9mIHRoZSBUb0MgdG8gYmUKLSAgJSBhY3RpdmUgbGlua3MuICBTb21lIHdvcmssIHNvbWUgZG9uJ3QuCi0gICUKLSAgXGxldFxweUBPbGRDb250ZW50c2xpbmU9XGNvbnRlbnRzbGluZQotICAlCi0gICUgQmFja3dhcmQgY29tcGF0aWJpbGl0eSBoYWNrOiBwZGZUZVggMC4xMyBkZWZpbmVkIFxwZGZhbm5vdGxpbmssCi0gICUgYnV0IGl0IGNoYW5nZWQgdG8gXHBkZnN0YXJ0bGluayBpbiAwLjE0LiAgVGhpcyBsZXQncyB1cyB1c2UgZWl0aGVyCi0gICUgdmVyc2lvbiBhbmQgc3RpbGwgZ2V0IHVzZWZ1bCBiZWhhdmlvci4KLSAgJQotICBcQGlmdW5kZWZpbmVke3BkZnN0YXJ0bGlua317Ci0gICAgXGxldFxwZGZzdGFydGxpbms9XHBkZmFubm90bGluawotICB9e30KLSAgJQotICAlIFRoZSBccHlAcGFyaW5kZW50IGhlcmUgaXMgYSBoYWNrIC0tIHdlJ3JlIGZvcmNpbmcgcGRmVGVYIGludG8KLSAgJSBob3Jpem9udGFsIG1vZGUgc2luY2UgXHBkZnN0YXJ0bGluayByZXF1aXJlcyB0aGF0LgotICBcZGVmXHB5QHBkZnN0YXJ0bGlua3slCi0gICAgXGlmdm1vZGVccHlAcGFyaW5kZW50XGZpJQotICAgIFxwZGZzdGFydGxpbmslCi0gIH0KLSAgJQotICAlIE1hY3JvIHRoYXQgdGFrZXMgdHdvIGFyZ3M6IHRoZSBuYW1lIHRvIGxpbmsgdG8gYW5kIHRoZSBjb250ZW50IG9mCi0gICUgdGhlIGxpbmsuICBUaGlzIHRha2VzIGNhcmUgb2YgdGhlIFBERiBtYWdpYywgZ2V0dGluZyB0aGUgY29sb3JzCi0gICUgdGhlIHNhbWUgZm9yIGVhY2ggbGluaywgYW5kIGF2b2lkcyBoYXZpbmcgbG90cyBvZiBnYXJiYWdlIGFsbCBvdmVyIAotICAlIHRoaXMgc3R5bGUgZmlsZS4KLSAgXG5ld2NvbW1hbmR7XHB5QGxpbmtUb05hbWV9WzJdeyUKLSAgICBccHlAcGRmc3RhcnRsaW5rIGF0dHJ7L0JvcmRlciBbMCAwIDBdfSBnb3RvIG5hbWV7IzF9JQotICAgICAgXHB5QExpbmtDb2xvciMyXHB5QE5vcm1hbENvbG9yJQotICAgIFxwZGZlbmRsaW5rJQotICB9Ci0gICUgQ29tcHV0ZSB0aGUgcGFkZGVkIHBhZ2UgbnVtYmVyIHNlcGFyYXRlbHkgc2luY2Ugd2UgZW5kIHVwIHdpdGggYSBwYWlyIG9mCi0gICUgXHJlbGF4IHRva2VuczsgdGhpcyBnZXRzIHRoZSByaWdodCBzdHJpbmcgY29tcHV0ZWQgYW5kIHdvcmtzLgotICBccmVuZXdjb21tYW5ke1xjb250ZW50c2xpbmV9WzNdeyUKLSAgICBcZGVmXG15QHBhZ2Vub3tccHlAdGFyZ2V0bm97IzN9fSUKLSAgICBccHlAT2xkQ29udGVudHNsaW5leyMxfXtccHlAbGlua1RvTmFtZXtwYWdlXG15QHBhZ2Vub317IzJ9fXsjM30lCi0gIH0KLSAgXEF0RW5kRG9jdW1lbnR7Ci0gICAgXGRlZlxfe1xzdHJpbmdffQotICAgIFxJbnB1dElmRmlsZUV4aXN0c3tcam9ibmFtZS5ia219e1xwZGZjYXRhbG9ney9QYWdlTW9kZSAvVXNlT3V0bGluZXN9fXt9Ci0gIH0KLSAgXG5ld2NvbW1hbmR7XHB5QHRhcmdldH1bMV17JQotICAgIFxpZnB5QGRvaW5nQHBhZ2VAdGFyZ2V0cyUKLSAgICAgIHtccGRmZGVzdCBuYW1leyMxfSB4eXp9JQotICAgIFxmaSUKLSAgfQotICBcbGV0XHB5QE9sZExhYmVsPVxsYWJlbAotICBccmVuZXdjb21tYW5ke1xsYWJlbH1bMV17JQotICAgIFxweUBPbGRMYWJlbHsjMX0lCi0gICAgXHB5QHRhcmdldHtsYWJlbC0jMX0lCi0gIH0KLSAgJSBUaGlzIHN0dWZmIGFkZHMgYSBwYWdlIyBkZXN0aW5hdGlvbiB0byBldmVyeSBQREYgcGFnZSwgd2hlcmUgIyBpcyB0aHJlZQotICAlIGRpZ2l0cyB3aWRlLCBwYWRkZWQgd2l0aCBsZWFkaW5nIHplcm9zLiAgVGhpcyBkb2Vzbid0IHJlYWxseSBoZWxwIHdpdGgKLSAgJSB0aGUgZnJvbnRtYXR0ZXIsIGJ1dCBkb2VzIGZpbmUgd2l0aCB0aGUgYm9keS4KLSAgJQotICAlIFRoaXMgaXMgKmhlYXZpbHkqIGJhc2VkIG9uIHRoZSBoeXBlcnJlZiBwYWNrYWdlLgotICAlCi0gIFxkZWZcQGJlZ2luZHZpeyUKLSAgICBcdW52Ym94IFxAYmVnaW5kdmlib3gKLSAgICBcQGh5cGVyZml4aGVhZAotICB9Ci0gIFxkZWZcQGh5cGVyZml4aGVhZHslCi0gICBcbGV0XEhAb2xkQHRoZWhlYWRcQHRoZWhlYWQKLSAgICAgICBcZ2xvYmFsXGRlZlxAZm9ve1xweUB0YXJnZXR7cGFnZVxweUBwYWdlbm99fSUKLSAgICAgXGV4cGFuZGFmdGVyXGlmeFxleHBhbmRhZnRlclxAZW1wdHlcSEBvbGRAdGhlaGVhZAotICAgICAgIFxkZWZcSEBvbGRAdGhlaGVhZHtcaGZpbH1cZmkKLSAgICBcZGVmXEB0aGVoZWFke1xAZm9vXHJlbGF4XEhAb2xkQHRoZWhlYWR9JQotICB9Ci1cZmlcZmkKLQotJSBJbmNyZWFzZSBwcmludGFibGUgcGFnZSBzaXplIChjb3BpZWQgZnJvbSBmdWxscGFnZS5zdHkpCi1cdG9wbWFyZ2luIDBwdAotXGFkdmFuY2UgXHRvcG1hcmdpbiBieSAtXGhlYWRoZWlnaHQKLVxhZHZhbmNlIFx0b3BtYXJnaW4gYnkgLVxoZWFkc2VwCi0KLSUgYXR0ZW1wdCB0byB3b3JrIGEgbGl0dGxlIGJldHRlciBmb3IgQTQgdXNlcnMKLVx0ZXh0aGVpZ2h0IFxwYXBlcmhlaWdodAotXGFkdmFuY2VcdGV4dGhlaWdodCBieSAtMmluCi0KLVxvZGRzaWRlbWFyZ2luIDBwdAotXGV2ZW5zaWRlbWFyZ2luIDBwdAotJVxldmVuc2lkZW1hcmdpbiAtLjI1aW4gICUgZm9yIGBgbWFudWFsIHNpemUnJyBkb2N1bWVudHMKLVxtYXJnaW5wYXJ3aWR0aCAwLjVpbgotCi1cdGV4dHdpZHRoIFxwYXBlcndpZHRoCi1cYWR2YW5jZVx0ZXh0d2lkdGggYnkgLTJpbgotCi0KLSUgU3R5bGUgcGFyYW1ldGVycyBhbmQgbWFjcm9zIHVzZWQgYnkgbW9zdCBkb2N1bWVudHMgaGVyZQotXHJhZ2dlZGJvdHRvbQotXHNsb3BweQotXHBhcmluZGVudCA9IDBtbQotXHBhcnNraXAgPSAybW0KLVxoYmFkbmVzcyA9IDUwMDAgICAgICAgICAgICAgICAgJSBkb24ndCBwcmludCB0cml2aWFsIGdyaXBlcwotCi1ccGFnZXN0eWxle2VtcHR5fSAgICAgICAgICAgICAgICUgc3RhcnQgdGhpcyB3YXk7IGNoYW5nZSBmb3IKLVxwYWdlbnVtYmVyaW5ne3JvbWFufSAgICAgICAgICAgJSBUb0MgJiBjaGFwdGVycwotCi0lIFVzZSB0aGlzIHRvIHNldCB0aGUgZm9udCBmYW1pbHkgZm9yIGhlYWRlcnMgYW5kIG90aGVyIGRlY29yOgotXG5ld2NvbW1hbmR7XHB5QEhlYWRlckZhbWlseX17XHNmZmFtaWx5fQotCi0lIFNldCB1cCBhYnN0cmFjdCB3YXlzIHRvIGdldCB0aGUgbm9ybWFsIGFuZCBzbWFsbGVyIGZvbnQgc2l6ZXMgdGhhdAotJSB3b3JrIGV2ZW4gaW4gZm9vdG5vdGUgY29udGV4dC4KLVxuZXdpZlxpZnB5QGluZm9vdG5vdGUgXHB5QGluZm9vdG5vdGVmYWxzZQotXGxldFxweUBvbGRtYWtlZm50ZXh0XEBtYWtlZm50ZXh0Ci1cZGVmXEBtYWtlZm50ZXh0IzF7JQotICBcYmdyb3VwJQotICAgIFxweUBpbmZvb3Rub3RldHJ1ZQotICAgIFxweUBvbGRtYWtlZm50ZXh0eyMxfSUKLSAgXGVncm91cCUKLX0KLVxkZWZccHlAZGVmYXVsdHNpemV7JQotICBcaWZweUBpbmZvb3Rub3RlXGZvb3Rub3Rlc2l6ZVxlbHNlXG5vcm1hbHNpemVcZmklCi19Ci1cZGVmXHB5QHNtYWxsc2l6ZXslCi0gIFxpZnB5QGluZm9vdG5vdGVcc2NyaXB0c2l6ZVxlbHNlXHNtYWxsXGZpJQotfQotCi0lIFJlZGVmaW5lIHRoZSAnbm9ybWFsJyBoZWFkZXIvZm9vdGVyIHN0eWxlIHdoZW4gdXNpbmcgImZhbmN5aGRyIiBwYWNrYWdlOgotXEBpZnVuZGVmaW5lZHtmYW5jeWhmfXt9ewotICAlIFVzZSBccGFnZXN0eWxle25vcm1hbH0gYXMgdGhlIHByaW1hcnkgcGFnZXN0eWxlIGZvciB0ZXh0LgotICBcZmFuY3lwYWdlc3R5bGV7bm9ybWFsfXsKLSAgICBcZmFuY3loZnt9Ci0gICAgXGZhbmN5Zm9vdFtMRSxST117e1xweUBIZWFkZXJGYW1pbHlcdGhlcGFnZX19Ci0gICAgXGZhbmN5Zm9vdFtMT117e1xweUBIZWFkZXJGYW1pbHlcbm91cHBlcmNhc2V7XHJpZ2h0bWFya319fQotICAgIFxmYW5jeWZvb3RbUkVde3tccHlASGVhZGVyRmFtaWx5XG5vdXBwZXJjYXNle1xsZWZ0bWFya319fQotICAgIFxyZW5ld2NvbW1hbmR7XGhlYWRydWxld2lkdGh9ezBwdH0KLSAgICBccmVuZXdjb21tYW5ke1xmb290cnVsZXdpZHRofXswLjRwdH0KLSAgfQotICAlIFVwZGF0ZSB0aGUgcGxhaW4gc3R5bGUgc28gd2UgZ2V0IHRoZSBwYWdlIG51bWJlciAmIGZvb3RlciBsaW5lLAotICAlIGJ1dCBub3QgYSBjaGFwdGVyIG9yIHNlY3Rpb24gdGl0bGUuICBUaGlzIGlzIHRvIGtlZXAgdGhlIGZpcnN0Ci0gICUgcGFnZSBvZiBhIGNoYXB0ZXIgYW5kIHRoZSBibGFuayBwYWdlIGJldHdlZW4gY2hhcHRlcnMgYGNsZWFuLicKLSAgXGZhbmN5cGFnZXN0eWxle3BsYWlufXsKLSAgICBcZmFuY3loZnt9Ci0gICAgXGZhbmN5Zm9vdFtMRSxST117e1xweUBIZWFkZXJGYW1pbHlcdGhlcGFnZX19Ci0gICAgXHJlbmV3Y29tbWFuZHtcaGVhZHJ1bGV3aWR0aH17MHB0fQotICAgIFxyZW5ld2NvbW1hbmR7XGZvb3RydWxld2lkdGh9ezAuNHB0fQotICB9Ci0gICUgUmVkZWZpbmUgXGNsZWFyZG91YmxlcGFnZSBzbyB0aGF0IHRoZSBibGFuayBwYWdlIGJldHdlZW4gY2hhcHRlcnMKLSAgJSBnZXRzIHRoZSBwbGFpbiBzdHlsZSBhbmQgbm90IHRoZSBmYW5jeSBzdHlsZS4gIFRoaXMgaXMgZGVzY3JpYmVkCi0gICUgaW4gdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBmYW5jeWhkciBwYWNrYWdlIGJ5IFBpZXQgdm9uIE9vc3RydW0uCi0gIFxAaWZ1bmRlZmluZWR7Y2hhcHRlcn17fXsKLSAgICBccmVuZXdjb21tYW5ke1xjbGVhcmRvdWJsZXBhZ2V9ewotICAgICAgXGNsZWFycGFnZVxpZkBvcGVucmlnaHQgXGlmb2RkXGNAcGFnZVxlbHNlCi0gICAgICBcaGJveHt9Ci0gICAgICBcdGhpc3BhZ2VzdHlsZXtwbGFpbn0KLSAgICAgIFxuZXdwYWdlCi0gICAgICBcaWZAdHdvY29sdW1uXGhib3h7fVxuZXdwYWdlXGZpXGZpXGZpCi0gICAgfQotICB9Ci19Ci0KLSUgVGhpcyBzZXRzIHVwIHRoZSB7dmVyYmF0aW19IGVudmlyb25tZW50IHRvIGJlIGluZGVudGVkIGFuZCBhIG1pbmlwYWdlLAotJSBhbmQgdG8gaGF2ZSBhbGwgdGhlIG90aGVyIG1vc3RseSBuaWNlIHByb3BlcnRpZXMgdGhhdCB3ZSB3YW50IGZvcgotJSBjb2RlIHNhbXBsZXMuCi0KLVxsZXRccHlAT2xkVmVyYmF0aW09XHZlcmJhdGltCi1cbGV0XHB5QE9sZEVuZFZlcmJhdGltPVxlbmR2ZXJiYXRpbQotXFJlcXVpcmVQYWNrYWdle3ZlcmJhdGltfQotXGxldFxweUBPbGRWZXJiYXRpbUlucHV0PVx2ZXJiYXRpbWlucHV0Ci0KLSUgVmFyaWFibGUgdXNlZCBieSBiZWdpbiBjb2RlIGNvbW1hbmQKLVxuZXdsZW5ndGh7XHB5QGNvZGV3aWR0aH0KLQotXHJlbmV3Y29tbWFuZHtcdmVyYmF0aW19eyUKLSAgXHNldGxlbmd0aHtccGFyaW5kZW50fXsxY219JQotICAlIENhbGN1bGF0ZSB0aGUgdGV4dCB3aWR0aCBmb3IgdGhlIG1pbmlwYWdlOgotICBcc2V0bGVuZ3Roe1xweUBjb2Rld2lkdGh9e1xsaW5ld2lkdGh9JQotICBcYWRkdG9sZW5ndGh7XHB5QGNvZGV3aWR0aH17LVxwYXJpbmRlbnR9JQotICAlCi0gIFxwYXJcaW5kZW50JQotICBcYmVnaW57bWluaXBhZ2V9W3Rde1xweUBjb2Rld2lkdGh9JQotICAgIFxzbWFsbCUKLSAgICBccHlAT2xkVmVyYmF0aW0lCi19Ci1ccmVuZXdjb21tYW5ke1xlbmR2ZXJiYXRpbX17JQotICAgIFxweUBPbGRFbmRWZXJiYXRpbSUKLSAgXGVuZHttaW5pcGFnZX0lCi19Ci1ccmVuZXdjb21tYW5ke1x2ZXJiYXRpbWlucHV0fVsxXXslCi0gIHtcc2V0bGVuZ3Roe1xwYXJpbmRlbnR9ezFjbX0lCi0gICAlIENhbGN1bGF0ZSB0aGUgdGV4dCB3aWR0aCBmb3IgdGhlIG1pbmlwYWdlOgotICAgXHNldGxlbmd0aHtccHlAY29kZXdpZHRofXtcbGluZXdpZHRofSUKLSAgIFxhZGR0b2xlbmd0aHtccHlAY29kZXdpZHRofXstXHBhcmluZGVudH0lCi0gICAlCi0gICBcc21hbGwlCi0gICBcYmVnaW57bGlzdH17fXtcc2V0bGVuZ3Roe1xsZWZ0bWFyZ2lufXsxY219fQotICAgICBcaXRlbSUKLSAgICAgXHB5QE9sZFZlcmJhdGltSW5wdXR7IzF9JQotICAgXGVuZHtsaXN0fQotICB9JQotfQotCi0lIFRoaXMgZG9lcyBhIHNpbWlsYXIgdGhpbmcgZm9yIHRoZSB7YWxsdHR9IGVudmlyb25tZW50OgotXFJlcXVpcmVQYWNrYWdle2FsbHR0fQotXGxldFxweUBPbGRBbGxUVD1cYWxsdHQKLVxsZXRccHlAT2xkRW5kQWxsVFQ9XGVuZGFsbHR0Ci0KLVxyZW5ld2NvbW1hbmR7XGFsbHR0fXslCi0gIFxzZXRsZW5ndGh7XHBhcmluZGVudH17MWNtfSUKLSAgJSBDYWxjdWxhdGUgdGhlIHRleHQgd2lkdGggZm9yIHRoZSBtaW5pcGFnZToKLSAgXHNldGxlbmd0aHtccHlAY29kZXdpZHRofXtcbGluZXdpZHRofSUKLSAgXGFkZHRvbGVuZ3Roe1xweUBjb2Rld2lkdGh9ey1ccGFyaW5kZW50fSUKLSAgXGxldFxlPVx0ZXh0YmFja3NsYXNoJQotICAlCi0gIFxwYXJcaW5kZW50JQotICBcYmVnaW57bWluaXBhZ2V9W3Rde1xweUBjb2Rld2lkdGh9JQotICAgIFxzbWFsbCUKLSAgICBccHlAT2xkQWxsVFQlCi19Ci1ccmVuZXdjb21tYW5ke1xlbmRhbGx0dH17JQotICAgIFxweUBPbGRFbmRBbGxUVCUKLSAgXGVuZHttaW5pcGFnZX0lCi19Ci0KLQotXG5ld2NvbW1hbmR7XHB5QG1vZHVsZWJhZGtleX17ey0tanVzdC1zb21lLWp1bmstLX19Ci0KLQotJSUgIExvdHMgb2YgaW5kZXgtZW50cnkgZ2VuZXJhdGlvbiBzdXBwb3J0LgotCi0lIENvbW1hbmQgdG8gd3JhcCBhcm91bmQgc3R1ZmYgdGhhdCByZWZlcnMgdG8gZnVuY3Rpb24gLyBtb2R1bGUgLwotJSBhdHRyaWJ1dGUgbmFtZXMgIGluIHRoZSBpbmRleC4gIERlZmF1bHQgYmVoYXZpb3I6IGxpa2UgXGNvZGV7fS4gIFRvCi0lIGp1c3Qga2VlcCB0aGUgaW5kZXggZW50cmllcyBpbiB0aGUgcm9tYW4gZm9udCwgdW5jb21tZW50IHRoZSBzZWNvbmQKLSUgZGVmaW5pdGlvbjsgaXQgbWF0Y2hlcyBPJ1JlaWxseSBzdHlsZSBtb3JlLgotJQotXG5ld2NvbW1hbmR7XHB5QGlkeGNvZGV9WzFde1x0ZXh0dHR7IzF9fQotJVxyZW5ld2NvbW1hbmR7XHB5QGlkeGNvZGV9WzFdeyMxfQotCi0lIENvbW1hbmQgdG8gZ2VuZXJhdGUgdHdvIGluZGV4IGVudHJpZXMgKHVzaW5nIHN1YmVudHJpZXMpCi1cbmV3Y29tbWFuZHtcaW5kZXhpaX1bMl17XGluZGV4eyMxISMyfVxpbmRleHsjMiEjMX19Ci0KLSUgQW5kIHRocmVlIGVudHJpZXMgKHVzaW5nIG9ubHkgb25lIGxldmVsIG9mIHN1YmVudHJpZXMpCi1cbmV3Y29tbWFuZHtcaW5kZXhpaWl9WzNde1xpbmRleHsjMSEjMiAjM31caW5kZXh7IzIhIzMsICMxfVxpbmRleHsjMyEjMSAjMn19Ci0KLSUgQW5kIGZvdXIgKGFnYWluLCB1c2luZyBvbmx5IG9uZSBsZXZlbCBvZiBzdWJlbnRyaWVzKQotXG5ld2NvbW1hbmR7XGluZGV4aXZ9WzRdewotXGluZGV4eyMxISMyICMzICM0fQotXGluZGV4eyMyISMzICM0LCAjMX0KLVxpbmRleHsjMyEjNCwgIzEgIzJ9Ci1caW5kZXh7IzQhIzEgIzIgIzN9Ci19Ci0KLSUgQ29tbWFuZCB0byBnZW5lcmF0ZSBhIHJlZmVyZW5jZSB0byBhIGZ1bmN0aW9uLCBzdGF0ZW1lbnQsIGtleXdvcmQsCi0lIG9wZXJhdG9yLgotXG5ld2NvbW1hbmR7XGt3aW5kZXh9WzFde1xpbmRleGlpe2tleXdvcmR9eyMxQHtccHlAaWR4Y29kZXsjMX19fX0KLVxuZXdjb21tYW5ke1xzdGluZGV4fVsxXXtcaW5kZXhpaXtzdGF0ZW1lbnR9eyMxQHtccHlAaWR4Y29kZXsjMX19fX0KLVxuZXdjb21tYW5ke1xvcGluZGV4fVsxXXtcaW5kZXhpaXtvcGVyYXRvcn17IzFAe1xweUBpZHhjb2RleyMxfX19fQotXG5ld2NvbW1hbmR7XGV4aW5kZXh9WzFde1xpbmRleGlpe2V4Y2VwdGlvbn17IzFAe1xweUBpZHhjb2RleyMxfX19fQotXG5ld2NvbW1hbmR7XG9iaW5kZXh9WzFde1xpbmRleGlpe29iamVjdH17IzF9fQotXG5ld2NvbW1hbmR7XGJpZnVuY2luZGV4fVsxXXslCi0gIFxpbmRleHsjMUB7XHB5QGlkeGNvZGV7IzEoKX19IChidWlsdC1pbiBmdW5jdGlvbil9fQotCi0lIEFkZCBhbiBpbmRleCBlbnRyeSBmb3IgYSBtb2R1bGUKLVxuZXdjb21tYW5ke1xweUByZWZtb2R1bGV9WzJde1xpbmRleHsjMUB7XHB5QGlkeGNvZGV7IzF9fSAoIzJtb2R1bGUpfX0KLVxuZXdjb21tYW5ke1xyZWZtb2RpbmRleH1bMV17XHB5QHJlZm1vZHVsZXsjMX17fX0KLVxuZXdjb21tYW5ke1xyZWZiaW1vZGluZGV4fVsxXXtccHlAcmVmbW9kdWxleyMxfXtidWlsdC1pbiB9fQotXG5ld2NvbW1hbmR7XHJlZmV4bW9kaW5kZXh9WzFde1xweUByZWZtb2R1bGV7IzF9e2V4dGVuc2lvbiB9fQotXG5ld2NvbW1hbmR7XHJlZnN0bW9kaW5kZXh9WzFde1xweUByZWZtb2R1bGV7IzF9e3N0YW5kYXJkIH19Ci0KLSUgUmVmZXIgdG8gYSBtb2R1bGUncyBkb2N1bWVudGF0aW9uIHVzaW5nIGEgaHlwZXJsaW5rIG9mIHRoZSBtb2R1bGUncwotJSBuYW1lLCBhdCBsZWFzdCBpZiB3ZSdyZSBidWlsZGluZyBQREY6Ci1caWZwZGYKLSAgXG5ld2NvbW1hbmR7XHJlZm1vZHVsZX1bMl1bXHB5QG1vZHVsZWJhZGtleV17JQotICAgIFxpZnhccHlAbW9kdWxlYmFka2V5IzFcZGVmXHB5QG1vZHVsZWtleXsjMn1cZWxzZVxkZWZccHlAbW9kdWxla2V5eyMxfVxmaSUKLSAgICBccHlAbGlua1RvTmFtZXtsYWJlbC1tb2R1bGUtXHB5QG1vZHVsZWtleX17XG1vZHVsZXsjMn19JQotICB9Ci1cZWxzZQotICBcbmV3Y29tbWFuZHtccmVmbW9kdWxlfVsyXVtccHlAbW9kdWxlYmFka2V5XXtcbW9kdWxleyMyfX0KLVxmaQotCi0lIHN1cHBvcnQgZm9yIHRoZSBtb2R1bGUgaW5kZXgKLVxuZXdpZlxpZnB5QFVzZU1vZHVsZUluZGV4Ci1ccHlAVXNlTW9kdWxlSW5kZXhmYWxzZQotCi1cbmV3Y29tbWFuZHtcbWFrZW1vZGluZGV4fXsKLSAgXG5ld3dyaXRlXG1vZGluZGV4ZmlsZQotICBcb3Blbm91dFxtb2RpbmRleGZpbGU9bW9kXGpvYm5hbWUuaWR4Ci0gIFxweUBVc2VNb2R1bGVJbmRleHRydWUKLX0KLQotJSBBZGQgdGhlIGRlZmluaW5nIGVudHJ5IGZvciBhIG1vZHVsZQotXG5ld2NvbW1hbmR7XHB5QG1vZGluZGV4fVsyXXslCi0gIFxyZW5ld2NvbW1hbmR7XHB5QHRoaXNtb2R1bGV9eyMxfQotICBcc2V0aW5kZXhzdWJpdGVteyhpbiBtb2R1bGUgIzEpfSUKLSAgXGluZGV4eyMxQHtccHlAaWR4Y29kZXsjMX19ICgjMm1vZHVsZSl8dGV4dGJmfSUKLSAgXGlmcHlAVXNlTW9kdWxlSW5kZXglCi0gICAgXEBpZnVuZGVmaW5lZHtweUBtb2RwbGF0QFxweUB0aGlzbW9kdWxla2V5fXsKLSAgICAgIFx3cml0ZVxtb2RpbmRleGZpbGV7XHByb3RlY3RcaW5kZXhlbnRyeXsjMUB7XHRleHR0dHsjMX19fXtcdGhlcGFnZX19JQotICAgIH17XHdyaXRlXG1vZGluZGV4ZmlsZXtccHJvdGVjdFxpbmRleGVudHJ5eyMxQHtcdGV4dHR0eyMxfSAlCi0gICAgICAgIFxlbXBoeyhccHlAcGxhdGZvcm1vZltccHlAdGhpc21vZHVsZWtleV17fSl9fX17XHRoZXBhZ2V9fSUKLSAgICB9Ci0gIFxmaSUKLX0KLQotJSAqKiogWFhYICoqKiBUSEUgTkVYVCBGT1VSIE1BQ1JPUyBBUkUgTk9XIE9CU09MRVRFICEhISAqKioKLQotJSBidWlsdC1pbiAmIFB5dGhvbiBtb2R1bGVzIGluIHRoZSBtYWluIGRpc3RyaWJ1dGlvbgotXG5ld2NvbW1hbmR7XGJpbW9kaW5kZXh9WzFde1xweUBtb2RpbmRleHsjMX17YnVpbHQtaW4gfSUKLSAgXHR5cGVvdXR7KioqIE1BQ1JPIGJpbW9kaW5kZXggSVMgT0JTT0xFVEUgLS0gVVNFIGRlY2xhcmVtb2R1bGUgSU5TVEVBRCF9fQotXG5ld2NvbW1hbmR7XHN0bW9kaW5kZXh9WzFde1xweUBtb2RpbmRleHsjMX17c3RhbmRhcmQgfSUKLSAgXHR5cGVvdXR7KioqIE1BQ1JPIHN0bW9kaW5kZXggSVMgT0JTT0xFVEUgLS0gVVNFIGRlY2xhcmVtb2R1bGUgSU5TVEVBRCF9fQotCi0lIFB5dGhvbiAmIGV4dGVuc2lvbiBtb2R1bGVzIG91dHNpZGUgdGhlIG1haW4gZGlzdHJpYnV0aW9uCi1cbmV3Y29tbWFuZHtcbW9kaW5kZXh9WzFde1xweUBtb2RpbmRleHsjMX17fSUKLSAgXHR5cGVvdXR7KioqIE1BQ1JPIG1vZGluZGV4IElTIE9CU09MRVRFIC0tIFVTRSBkZWNsYXJlbW9kdWxlIElOU1RFQUQhfX0KLVxuZXdjb21tYW5ke1xleG1vZGluZGV4fVsxXXtccHlAbW9kaW5kZXh7IzF9e2V4dGVuc2lvbiB9JQotICBcdHlwZW91dHsqKiogTUFDUk8gZXhtb2RpbmRleCBJUyBPQlNPTEVURSAtLSBVU0UgZGVjbGFyZW1vZHVsZSBJTlNURUFEIX19Ci0KLSUgQWRkaXRpb25hbCBzdHJpbmcgZm9yIGFuIGluZGV4IGVudHJ5Ci1cbmV3aWZcaWZweUB1c2luZ3N1Yml0ZW1ccHlAdXNpbmdzdWJpdGVtZmFsc2UKLVxuZXdjb21tYW5ke1xweUBpbmRleHN1Yml0ZW19e30KLVxuZXdjb21tYW5ke1xzZXRpbmRleHN1Yml0ZW19WzFde1xyZW5ld2NvbW1hbmR7XHB5QGluZGV4c3ViaXRlbX17ICMxfSUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxweUB1c2luZ3N1Yml0ZW10cnVlfQotXG5ld2NvbW1hbmR7XHR0aW5kZXh9WzFdeyUKLSAgXGlmcHlAdXNpbmdzdWJpdGVtCi0gICAgXGluZGV4eyMxQHtccHlAaWR4Y29kZXsjMX19XHB5QGluZGV4c3ViaXRlbX0lCi0gIFxlbHNlJQotICAgIFxpbmRleHsjMUB7XHB5QGlkeGNvZGV7IzF9fX0lCi0gIFxmaSUKLX0KLVxuZXdjb21tYW5ke1x3aXRoc3ViaXRlbX1bMl17JQotICBcYmVnaW5ncm91cCUKLSAgICBcZGVmXHR0aW5kZXgjIzF7XGluZGV4eyMjMUB7XHB5QGlkeGNvZGV7IyMxfX0gIzF9fSUKLSAgICAjMiUKLSAgXGVuZGdyb3VwJQotfQotCi0KLSUgTW9kdWxlIHN5bm9wc2lzIHByb2Nlc3NpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUKLVxuZXdjb21tYW5ke1xweUB0aGlzY2xhc3N9e30KLVxuZXdjb21tYW5ke1xweUB0aGlzbW9kdWxlfXt9Ci1cbmV3Y29tbWFuZHtccHlAdGhpc21vZHVsZWtleX17fQotXG5ld2NvbW1hbmR7XHB5QHRoaXNtb2R1bGV0eXBlfXt9Ci0KLVxuZXdjb21tYW5ke1xweUBzdGFuZGFyZEluZGV4TW9kdWxlfVsxXXtccHlAbW9kaW5kZXh7IzF9e3N0YW5kYXJkIH19Ci1cbmV3Y29tbWFuZHtccHlAYnVpbHRpbkluZGV4TW9kdWxlfVsxXXtccHlAbW9kaW5kZXh7IzF9e2J1aWx0LWluIH19Ci1cbmV3Y29tbWFuZHtccHlAZXh0ZW5zaW9uSW5kZXhNb2R1bGV9WzFde1xweUBtb2RpbmRleHsjMX17ZXh0ZW5zaW9uIH19Ci1cbmV3Y29tbWFuZHtccHlASW5kZXhNb2R1bGV9WzFde1xweUBtb2RpbmRleHsjMX17fX0KLQotXG5ld2lmXGlmcHlASGF2ZU1vZFN5bm9wc2lzICAgICAgIFxweUBIYXZlTW9kU3lub3BzaXNmYWxzZQotXG5ld2lmXGlmcHlATW9kU3lub3BzaXNGaWxlSXNPcGVuIFxweUBNb2RTeW5vcHNpc0ZpbGVJc09wZW5mYWxzZQotXG5ld2lmXGlmcHlASGF2ZU1vZFBsYXRmb3JtICAgICAgIFxweUBIYXZlTW9kUGxhdGZvcm1mYWxzZQotCi0lIFxkZWNsYXJlbW9kdWxlW2tleV17dHlwZX17bmFtZX0KLVxuZXdjb21tYW5ke1xkZWNsYXJlbW9kdWxlfVszXVtccHlAbW9kdWxlYmFka2V5XXsKLSAgXHB5QG9wZW5Nb2RTeW5vcHNpc0ZpbGUKLSAgXHJlbmV3Y29tbWFuZHtccHlAdGhpc21vZHVsZXR5cGV9eyMyfQotICBcaWZ4XHB5QG1vZHVsZWJhZGtleSMxCi0gICAgXHJlbmV3Y29tbWFuZHtccHlAdGhpc21vZHVsZWtleX17IzN9Ci0gIFxlbHNlCi0gICAgXHJlbmV3Y29tbWFuZHtccHlAdGhpc21vZHVsZWtleX17IzF9Ci0gIFxmaQotICBcQGlmdW5kZWZpbmVke3B5QCMySW5kZXhNb2R1bGV9eyUKLSAgICBcdHlwZW91dHsqKiogTUFDUk8gZGVjbGFyZW1vZHVsZSBjYWxsZWQgd2l0aCB1bmtub3duIG1vZHVsZSB0eXBlOiBgIzInfQotICAgIFxweUBJbmRleE1vZHVsZXsjM30lCi0gIH17JQotICAgIFxjc25hbWUgcHlAIzJJbmRleE1vZHVsZVxlbmRjc25hbWV7IzN9JQotICB9Ci0gIFxsYWJlbHttb2R1bGUtXHB5QHRoaXNtb2R1bGVrZXl9Ci19Ci1cbmV3aWZcaWZweUBNb2RQbGF0Zm9ybUZpbGVJc09wZW4gXHB5QE1vZFBsYXRmb3JtRmlsZUlzT3BlbmZhbHNlCi1cbmV3Y29tbWFuZHtccHlATW9kUGxhdGZvcm1GaWxlbmFtZX17XGpvYm5hbWUucGxhfQotXG5ld2NvbW1hbmR7XHBsYXRmb3JtfVsxXXsKLSAgXGlmcHlATW9kUGxhdGZvcm1GaWxlSXNPcGVuXGVsc2UKLSAgICBcbmV3d3JpdGVccHlATW9kUGxhdGZvcm1GaWxlCi0gICAgXG9wZW5vdXRccHlATW9kUGxhdGZvcm1GaWxlPVxweUBNb2RQbGF0Zm9ybUZpbGVuYW1lCi0gICAgXHB5QE1vZFBsYXRmb3JtRmlsZUlzT3BlbnRydWUKLSAgXGZpCi19Ci1cSW5wdXRJZkZpbGVFeGlzdHN7XGpvYm5hbWUucGxhfXt9e30KLVxuZXdjb21tYW5ke1xweUBwbGF0Zm9ybW9mfVsyXVtccHlAbW9kdWxlYmFka2V5XXslCi0gIFxpZnhccHlAbW9kdWxlYmFka2V5IzEgXGRlZlxweUBrZXl7IzJ9JQotICBcZWxzZSBcZGVmXHB5QGtleXsjMX0lCi0gIFxmaSUKLSAgXGNzbmFtZSBweUBtb2RwbGF0QFxweUBrZXlcZW5kY3NuYW1lJQotfQotXG5ld2NvbW1hbmR7XGlnbm9yZVBsYXRmb3JtQW5ub3RhdGlvbn1bMV17fQotCi0lIFxtb2R1bGVhdXRob3J7bmFtZX17ZW1haWx9Ci1cbmV3Y29tbWFuZHtcbW9kdWxlYXV0aG9yfVsyXXt9Ci0KLSUgXHNlY3Rpb25hdXRob3J7bmFtZX17ZW1haWx9Ci1cbmV3Y29tbWFuZHtcc2VjdGlvbmF1dGhvcn1bMl17fQotCi0KLVxuZXdjb21tYW5ke1xweUBkZWZzeW5vcHNpc317TW9kdWxlIGhhcyBubyBzeW5vcHNpcy59Ci1cbmV3Y29tbWFuZHtccHlAbW9kdWxlc3lub3BzaXN9e1xweUBkZWZzeW5vcHNpc30KLVxuZXdjb21tYW5ke1xtb2R1bGVzeW5vcHNpc31bMV17Ci0gIFxweUBIYXZlTW9kU3lub3BzaXN0cnVlCi0gIFxyZW5ld2NvbW1hbmR7XHB5QG1vZHVsZXN5bm9wc2lzfXsjMX0KLX0KLQotJSBkZWZpbmUgdGhlIGZpbGUKLVxuZXd3cml0ZVxweUBNb2RTeW5vcHNpc0ZpbGUKLQotJSBoYWNrZWQgZnJvbSBcYWRkdG9jb250ZW50cyBmcm9tIGxhdGV4Lmx0eDoKLVxsb25nXGRlZlxweUB3cml0ZU1vZFN5bm9wc2lzRmlsZSMxeyUKLSAgXHByb3RlY3RlZEB3cml0ZVxweUBNb2RTeW5vcHNpc0ZpbGUlCi0gICAgICB7XGxldFxsYWJlbFxAZ29iYmxlIFxsZXRcaW5kZXhcQGdvYmJsZSBcbGV0XGdsb3NzYXJ5XEBnb2JibGV9JQotICAgICAge1xzdHJpbmcjMX0lCi19Ci1cbmV3Y29tbWFuZHtccHlAY2xvc2VNb2RTeW5vcHNpc0ZpbGV9ewotICBcaWZweUBNb2RTeW5vcHNpc0ZpbGVJc09wZW4KLSAgICBcY2xvc2VvdXRccHlATW9kU3lub3BzaXNGaWxlCi0gICAgXHB5QE1vZFN5bm9wc2lzRmlsZUlzT3BlbmZhbHNlCi0gIFxmaQotfQotXG5ld2NvbW1hbmR7XHB5QG9wZW5Nb2RTeW5vcHNpc0ZpbGV9ewotICBcaWZweUBNb2RTeW5vcHNpc0ZpbGVJc09wZW5cZWxzZQotICAgIFxvcGVub3V0XHB5QE1vZFN5bm9wc2lzRmlsZT1ccHlATW9kU3lub3BzaXNGaWxlbmFtZQotICAgIFxweUBNb2RTeW5vcHNpc0ZpbGVJc09wZW50cnVlCi0gIFxmaQotfQotCi1cbmV3Y29tbWFuZHtccHlAUHJvY2Vzc01vZFN5bm9wc2lzfXsKLSAgXGlmcHlASGF2ZU1vZFN5bm9wc2lzCi0gICAgXHB5QHdyaXRlTW9kU3lub3BzaXNGaWxle1xtb2R1bGVzeW5vcHNpcyUKLSAgICAgIHtccHlAdGhpc21vZHVsZWtleX17XHB5QHRoaXNtb2R1bGV9JQotICAgICAge1xweUB0aGlzbW9kdWxldHlwZX17XHB5QG1vZHVsZXN5bm9wc2lzfX0lCi0gICAgXHB5QEhhdmVNb2RTeW5vcHNpc2ZhbHNlCi0gIFxmaQotICBccmVuZXdjb21tYW5ke1xweUBtb2R1bGVzeW5vcHNpc317XHB5QGRlZnN5bm9wc2lzfQotfQotXEF0RW5kRG9jdW1lbnR7XHB5QFByb2Nlc3NNb2RTeW5vcHNpc1xweUBjbG9zZU1vZFN5bm9wc2lzRmlsZX0KLQotCi1cbG9uZ1xkZWZccHlAd3JpdGVNb2RQbGF0Zm9ybUZpbGUjMXslCi0gIFxwcm90ZWN0ZWRAd3JpdGVccHlATW9kUGxhdGZvcm1GaWxlJQotICAgIHtcbGV0XGxhYmVsXEBnb2JibGUgXGxldFxpbmRleFxAZ29iYmxlIFxsZXRcZ2xvc3NhcnlcQGdvYmJsZX0lCi0gICAge1xzdHJpbmcjMX0lCi19Ci0KLQotXG5ld2NvbW1hbmR7XGxvY2FsbW9kdWxldGFibGV9ewotICBcSWZGaWxlRXhpc3Rze1xweUBNb2RTeW5vcHNpc0ZpbGVuYW1lfXsKLSAgICBcYmVnaW57c3lub3BzaXN0YWJsZX0KLSAgICAgIFxpbnB1dHtccHlATW9kU3lub3BzaXNGaWxlbmFtZX0KLSAgICBcZW5ke3N5bm9wc2lzdGFibGV9Ci0gIH17fQotfQotCi1caWZwZGYKLSAgXG5ld2NvbW1hbmR7XHB5QE1vZFN5bm9wc2lzU3VtbWFyeX1bNF17JQotICAgIFxweUBsaW5rVG9OYW1le2xhYmVsLW1vZHVsZS0jMX17XGJmY29kZXsjMn19ICYgIzRcXAotICB9Ci1cZWxzZQotICBcbmV3Y29tbWFuZHtccHlATW9kU3lub3BzaXNTdW1tYXJ5fVs0XXtcYmZjb2RleyMyfSAmICM0XFx9Ci1cZmkKLVxuZXdlbnZpcm9ubWVudHtzeW5vcHNpc3RhYmxlfXsKLSAgJSBrZXksIG5hbWUsIHR5cGUsIHN5bm9wc2lzCi0gIFxsZXRcbW9kdWxlc3lub3BzaXM9XHB5QE1vZFN5bm9wc2lzU3VtbWFyeQotICBcYmVnaW57dGFidWxhcn17bGx9Ci19ewotICBcZW5ke3RhYnVsYXJ9Ci19Ci0lCi0lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotXG5ld2NvbW1hbmR7XHB5QHJlc2V0fXsKLSAgXHB5QHVzaW5nc3ViaXRlbWZhbHNlCi0gIFxweUBQcm9jZXNzTW9kU3lub3BzaXMKLSAgXHJlbmV3Y29tbWFuZHtccHlAdGhpc2NsYXNzfXt9Ci0gIFxyZW5ld2NvbW1hbmR7XHB5QHRoaXNtb2R1bGV9e30KLSAgXHJlbmV3Y29tbWFuZHtccHlAdGhpc21vZHVsZWtleX17fQotICBccmVuZXdjb21tYW5ke1xweUB0aGlzbW9kdWxldHlwZX17fQotfQotCi0lIEF1Z21lbnQgdGhlIHNlY3Rpb25pbmcgY29tbWFuZHMgdXNlZCB0byBnZXQgb3VyIG93biBmb250IGZhbWlseSBpbiBwbGFjZSwKLSUgYW5kIHJlc2V0IHNvbWUgaW50ZXJuYWwgZGF0YSBpdGVtczoKLVxyZW5ld2NvbW1hbmR7XHNlY3Rpb259e1xweUByZXNldCUKLSAgICAgICAgICAgICAgICAgICAgICAgIFxAc3RhcnRzZWN0aW9ue3NlY3Rpb259ezF9e1x6QH0lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTMuNWV4IFxAcGx1cyAtMWV4IFxAbWludXMgLS4yZXh9JQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezIuM2V4IFxAcGx1cy4yZXh9JQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyZXNldEBmb250XExhcmdlXHB5QEhlYWRlckZhbWlseX19Ci1ccmVuZXdjb21tYW5ke1xzdWJzZWN0aW9ufXtcQHN0YXJ0c2VjdGlvbntzdWJzZWN0aW9ufXsyfXtcekB9JQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0zLjI1ZXhcQHBsdXMgLTFleCBcQG1pbnVzIC0uMmV4fSUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxLjVleCBcQHBsdXMgLjJleH0lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJlc2V0QGZvbnRcbGFyZ2VccHlASGVhZGVyRmFtaWx5fX0KLVxyZW5ld2NvbW1hbmR7XHN1YnN1YnNlY3Rpb259e1xAc3RhcnRzZWN0aW9ue3N1YnN1YnNlY3Rpb259ezN9e1x6QH0lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTMuMjVleFxAcGx1cyAtMWV4IFxAbWludXMgLS4yZXh9JQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEuNWV4IFxAcGx1cyAuMmV4fSUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtccmVzZXRAZm9udFxub3JtYWxzaXplXHB5QEhlYWRlckZhbWlseX19Ci1ccmVuZXdjb21tYW5ke1xwYXJhZ3JhcGh9e1xAc3RhcnRzZWN0aW9ue3BhcmFncmFwaH17NH17XHpAfSUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHszLjI1ZXggXEBwbHVzMWV4IFxAbWludXMuMmV4fSUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMWVtfSUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtccmVzZXRAZm9udFxub3JtYWxzaXplXHB5QEhlYWRlckZhbWlseX19Ci1ccmVuZXdjb21tYW5ke1xzdWJwYXJhZ3JhcGh9e1xAc3RhcnRzZWN0aW9ue3N1YnBhcmFncmFwaH17NX17XHBhcmluZGVudH0lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7My4yNWV4IFxAcGx1czFleCBcQG1pbnVzIC4yZXh9JQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0xZW19JQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyZXNldEBmb250XG5vcm1hbHNpemVccHlASGVhZGVyRmFtaWx5fX0KLQotCi0lIE5vdyBmb3IgYSBsb3Qgb2Ygc2VtYW50aWNhbGx5LWxvYWRlZCBlbnZpcm9ubWVudHMgdGhhdCBkbyBhIHRvbiBvZiBtYWdpY2FsCi0lIHRoaW5ncyB0byBnZXQgdGhlIHJpZ2h0IGZvcm1hdHRpbmcgYW5kIGluZGV4IGVudHJpZXMgZm9yIHRoZSBzdHVmZiBpbgotJSBQeXRob24gbW9kdWxlcyBhbmQgQyBBUEkuCi0KLQotJSB7ZnVsbGxpbmVpdGVtc30gaXMgdXNlZCBpbiBvbmUgcGxhY2UgaW4gbGlicmVnZXgudGV4LCBidXQgaXMgcmVhbGx5IGZvcgotJSBpbnRlcm5hbCB1c2UgaW4gdGhpcyBmaWxlLgotJQotXG5ld2NvbW1hbmR7XHB5QGl0ZW1uZXdsaW5lfVsxXXslCi0gIFxAdGVtcGRpbWFcbGluZXdpZHRoJQotICBcYWR2YW5jZVxAdGVtcGRpbWEgXGxlZnRtYXJnaW5cbWFrZWJveFtcQHRlbXBkaW1hXVtsXXsjMX0lCi19Ci0KLVxuZXdlbnZpcm9ubWVudHtmdWxsbGluZWl0ZW1zfXsKLSAgXGJlZ2lue2xpc3R9e317XGxhYmVsd2lkdGggXGxlZnRtYXJnaW4gXGxhYmVsc2VwIDBwdAotICAgICAgICAgICAgICAgICBccmlnaHRtYXJnaW4gMHB0IFx0b3BzZXAgLVxwYXJza2lwIFxwYXJ0b3BzZXAgXHBhcnNraXAKLSAgICAgICAgICAgICAgICAgXGl0ZW1zZXAgLVxwYXJzZXAKLSAgICAgICAgICAgICAgICAgXGxldFxtYWtlbGFiZWw9XHB5QGl0ZW1uZXdsaW5lfQotfXtcZW5ke2xpc3R9fQotCi0lIFxvcHRpb25hbCBpcyBtb3N0bHkgZm9yIHVzZSBpbiB0aGUgYXJndW1lbnRzIHBhcmFtZXRlcnMgdG8gdGhlIHZhcmlvdXMKLSUgeypkZXNjfSBlbnZpcm9ubWVudHMgZGVmaW5lZCBiZWxvdywgYnV0IG1heSBiZSB1c2VkIGVsc2V3aGVyZS4gIEtub3duIHRvCi0lIGJlIHVzZWQgaW4gdGhlIGRlYnVnZ2VyIGNoYXB0ZXIuCi0lCi0lIFR5cGljYWwgdXNhZ2U6Ci0lCi0lICAgICBcYmVnaW57ZnVuY2Rlc2N9e215ZnVuY317cmVxcGFybVxvcHRpb25hbHssIG9wdHBhcm19fQotJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXiAgICAgICBeXl4KLSUgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIHNwYWNlIGhlcmUgICAgICAgTm8gc3BhY2UgaGVyZQotJQotJSBXaGVuIGEgZnVuY3Rpb24gaGFzIG11bHRpcGxlIG9wdGlvbmFsIHBhcmFtZXRlcnMsIFxvcHRpb25hbCBzaG91bGQgYmUKLSUgbmVzdGVkLCBub3QgY2hhaW5lZC4gIFRoaXMgaXMgcmlnaHQ6Ci0lCi0lICAgICBcYmVnaW57ZnVuY2Rlc2N9e215ZnVuY317XG9wdGlvbmFse3Bhcm0xXG9wdGlvbmFseywgcGFybTJ9fX0KLSUKLVxsZXRccHlAYmFka2V5PVxAdW5kZWZpbmVkCi0KLVxuZXdjb21tYW5ke1xvcHRpb25hbH1bMV17JQotICB7XHRleHRub3JtYWx7XExhcmdlW319eyMxfVxoc3BhY2V7MC41bW19e1x0ZXh0bm9ybWFse1xMYXJnZV19fX0KLQotJSBUaGlzIGNhbiBiZSB1c2VkIHdoZW4gYSBmdW5jdGlvbiBvciBtZXRob2QgYWNjZXB0cyBhbiB2YXJ5aW5nIG51bWJlciAKLSUgb2YgYXJndW1lbnRzLCBzdWNoIGFzIGJ5IHVzaW5nIHRoZSAqYXJncyBzeW50YXggaW4gdGhlIHBhcmFtZXRlciBsaXN0LgotXG5ld2NvbW1hbmR7XHB5QG1vcmVhcmdzfXsuLi59Ci0KLSUgVGhpcyBjYW4gYmUgdXNlZCB3aGVuIHlvdSBkb24ndCB3YW50IHRvIGRvY3VtZW50IHRoZSBwYXJhbWV0ZXJzIHRvIGEgCi0lIGZ1bmN0aW9uIG9yIG1ldGhvZCwgYnV0IHNpbXBseSBzdGF0ZSB0aGF0IGl0J3MgYW4gYWxpYXMgZm9yCi0lIHNvbWV0aGluZyBlbHNlLgotXG5ld2NvbW1hbmR7XHB5QHVuc3BlY2lmaWVkfXsuLi59Ci0KLQotXG5ld2xlbmd0aHtccHlAYXJnc3dpZHRofQotXG5ld2NvbW1hbmR7XHB5QHNpZ3BhcmFtc31bMV17JQotICBccGFyYm94W3Rde1xweUBhcmdzd2lkdGh9e1xweUB2YXJ2YXJzeyMxfVxjb2Rleyl9fX0KLVxuZXdjb21tYW5ke1xweUBzaWdsaW5lfVsyXXslCi0gIFxzZXR0b3dpZHRoe1xweUBhcmdzd2lkdGh9eyMxXGNvZGV7KH19JQotICBcYWRkdG9sZW5ndGh7XHB5QGFyZ3N3aWR0aH17LTJccHlAYXJnc3dpZHRofSUKLSAgXGFkZHRvbGVuZ3Roe1xweUBhcmdzd2lkdGh9e1x0ZXh0d2lkdGh9JQotICBcaXRlbVsjMVxjb2Rleyh9XHB5QHNpZ3BhcmFtc3sjMn1dfQotCi0lIEMgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSBcYmVnaW57Y2Z1bmNkZXNjfVtyZWZjb3VudF17dHlwZX17bmFtZX17YXJnbGlzdH0KLSUgTm90ZSB0aGF0IHRoZSBbcmVmY291bnRdIHNsb3Qgc2hvdWxkIG9ubHkgYmUgZmlsbGVkIGluIGJ5Ci0lIHRvb2xzL2Fubm8tYXBpLnB5OyBpdCBwdWxscyB0aGUgdmFsdWUgZnJvbSB0aGUgcmVmY291bnRzIGRhdGFiYXNlLgotXG5ld2NvbW1hbmR7XGNmdW5jbGluZX1bM117Ci0gIFxweUBzaWdsaW5le1xjb2RleyMxIFxiZmNvZGV7IzJ9fX17IzN9JQotICBcaW5kZXh7IzJAe1xweUBpZHhjb2RleyMyKCl9fX0KLX0KLVxuZXdlbnZpcm9ubWVudHtjZnVuY2Rlc2N9WzRdW1xweUBiYWRrZXldewotICBcYmVnaW57ZnVsbGxpbmVpdGVtc30KLSAgICBcY2Z1bmNsaW5leyMyfXsjM317IzR9Ci0gICAgXGlmeFxAdW5kZWZpbmVkIzFccmVsYXhcZWxzZSUKLSAgICAgIFxlbXBoe1JldHVybiB2YWx1ZTogXHRleHRiZnsjMX0ufVxcCi0gICAgXGZpCi19e1xlbmR7ZnVsbGxpbmVpdGVtc319Ci0KLSUgQyB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lIFxiZWdpbntjdmFyZGVzY317dHlwZX17bmFtZX0KLVxuZXdlbnZpcm9ubWVudHtjdmFyZGVzY31bMl17Ci0gIFxiZWdpbntmdWxsbGluZWl0ZW1zfQotICAgIFxpdGVtW1xjb2RleyMxIFxiZmNvZGV7IzJ9fVxpbmRleHsjMkB7XHB5QGlkeGNvZGV7IzJ9fX1dCi19e1xlbmR7ZnVsbGxpbmVpdGVtc319Ci0KLSUgQyBkYXRhIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lIFxiZWdpbntjdHlwZWRlc2N9W2luZGV4IG5hbWVde3R5cGVkZWYgbmFtZX0KLVxuZXdlbnZpcm9ubWVudHtjdHlwZWRlc2N9WzJdW1xweUBiYWRrZXldewotICBcYmVnaW57ZnVsbGxpbmVpdGVtc30KLSAgICBcaXRlbVtcYmZjb2RleyMyfSUKLSAgICBcaWZ4XEB1bmRlZmluZWQjMVxyZWxheCUKLSAgICAgIFxpbmRleHsjMkB7XHB5QGlkeGNvZGV7IzJ9fSAoQyB0eXBlKX0KLSAgICBcZWxzZSUKLSAgICAgIFxpbmRleHsjMkB7XHB5QGlkeGNvZGV7IzF9fSAoQyB0eXBlKX0KLSAgICBcZmldCi19e1xlbmR7ZnVsbGxpbmVpdGVtc319Ci0KLSUgQyB0eXBlIGZpZWxkcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lIFxiZWdpbntjbWVtYmVyZGVzY317Y29udGFpbmVyIHR5cGV9e2N0eXBlfXttZW1iZXJuYW1lfQotXG5ld2NvbW1hbmR7XGNtZW1iZXJsaW5lfVszXXsKLSAgXGl0ZW1bXGNvZGV7IzIgXGJmY29kZXsjM319XQotICBcaW5kZXh7IzNAe1xweUBpZHhjb2RleyMzfX0gKCMxIG1lbWJlcil9Ci19Ci1cbmV3ZW52aXJvbm1lbnR7Y21lbWJlcmRlc2N9WzNdewotICBcYmVnaW57ZnVsbGxpbmVpdGVtc30KLSAgICBcY21lbWJlcmxpbmV7IzF9eyMyfXsjM30KLX17XGVuZHtmdWxsbGluZWl0ZW1zfX0KLQotJSBGdW5reSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUgXGJlZ2lue2NzaW1wbGVtYWNyb2Rlc2N9e25hbWV9Ci0lIC0tICJzaW1wbGUiIGJlY2F1c2UgaXQgaGFzIG5vIGFyZ3M7IE5PVCBmb3IgY29uc3RhbnQgZGVmaW5pdGlvbnMhCi1cbmV3ZW52aXJvbm1lbnR7Y3NpbXBsZW1hY3JvZGVzY31bMV17Ci0gIFxiZWdpbntmdWxsbGluZWl0ZW1zfQotICAgIFxpdGVtW1xiZmNvZGV7IzF9XGluZGV4eyMxQHtccHlAaWR4Y29kZXsjMX19IChtYWNybyl9XQotfXtcZW5ke2Z1bGxsaW5laXRlbXN9fQotCi0lIHNpbXBsZSBmdW5jdGlvbnMgKG5vdCBtZXRob2RzKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSBcYmVnaW57ZnVuY2Rlc2N9e25hbWV9e2FyZ3N9Ci1cbmV3Y29tbWFuZHtcZnVuY2xpbmV9WzJdeyUKLSAgXGZ1bmNsaW5lbml7IzF9eyMyfSUKLSAgXGluZGV4eyMxQHtccHlAaWR4Y29kZXsjMSgpfX0gKGluIG1vZHVsZSBccHlAdGhpc21vZHVsZSl9fQotXG5ld2Vudmlyb25tZW50e2Z1bmNkZXNjfVsyXXsKLSAgXGJlZ2lue2Z1bGxsaW5laXRlbXN9Ci0gICAgXGZ1bmNsaW5leyMxfXsjMn0KLX17XGVuZHtmdWxsbGluZWl0ZW1zfX0KLQotJSBzaW1pbGFyIHRvIHtmdW5jZGVzY30sIGJ1dCBkb2Vzbid0IGFkZCB0byB0aGUgaW5kZXgKLVxuZXdjb21tYW5ke1xmdW5jbGluZW5pfVsyXXslCi0gIFxweUBzaWdsaW5le1xiZmNvZGV7IzF9fXsjMn19Ci1cbmV3ZW52aXJvbm1lbnR7ZnVuY2Rlc2NuaX1bMl17Ci0gIFxiZWdpbntmdWxsbGluZWl0ZW1zfQotICAgIFxmdW5jbGluZW5peyMxfXsjMn0KLX17XGVuZHtmdWxsbGluZWl0ZW1zfX0KLQotJSBjbGFzc2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUgXGJlZ2lue2NsYXNzZGVzY317bmFtZX17Y29uc3RydWN0b3IgYXJnc30KLVxuZXdlbnZpcm9ubWVudHtjbGFzc2Rlc2N9WzJdewotICAlIFVzaW5nIFxyZW5ld2NvbW1hbmQgZG9lc24ndCB3b3JrIGZvciB0aGlzLCBmb3IgdW5rbm93biByZWFzb25zOgotICBcZ2xvYmFsXGRlZlxweUB0aGlzY2xhc3N7IzF9Ci0gIFxiZWdpbntmdWxsbGluZWl0ZW1zfQotICAgIFxweUBzaWdsaW5le1xzdHJvbmd7Y2xhc3MgfVxiZmNvZGV7IzF9fXsjMn0lCi0gICAgXGluZGV4eyMxQHtccHlAaWR4Y29kZXsjMX19IChjbGFzcyBpbiBccHlAdGhpc21vZHVsZSl9Ci19e1xlbmR7ZnVsbGxpbmVpdGVtc319Ci0KLSUgXGJlZ2lue2NsYXNzZGVzYyp9e25hbWV9Ci1cbmV3ZW52aXJvbm1lbnR7Y2xhc3NkZXNjKn1bMV17Ci0gICUgVXNpbmcgXHJlbmV3Y29tbWFuZCBkb2Vzbid0IHdvcmsgZm9yIHRoaXMsIGZvciB1bmtub3duIHJlYXNvbnM6Ci0gIFxnbG9iYWxcZGVmXHB5QHRoaXNjbGFzc3sjMX0KLSAgXGJlZ2lue2Z1bGxsaW5laXRlbXN9Ci0gICAgXGl0ZW1bXHN0cm9uZ3tjbGFzcyB9XGNvZGV7XGJmY29kZXsjMX19JQotICAgICAgXGluZGV4eyMxQHtccHlAaWR4Y29kZXsjMX19IChjbGFzcyBpbiBccHlAdGhpc21vZHVsZSl9XQotfXtcZW5ke2Z1bGxsaW5laXRlbXN9fQotCi0lIFxiZWdpbntleGNjbGFzc2Rlc2N9e25hbWV9e2NvbnN0cnVjdG9yIGFyZ3N9Ci0lIGJ1dCBpbmRleGVzIGFzIGFuIGV4Y2VwdGlvbgotXG5ld2Vudmlyb25tZW50e2V4Y2NsYXNzZGVzY31bMl17Ci0gICUgVXNpbmcgXHJlbmV3Y29tbWFuZCBkb2Vzbid0IHdvcmsgZm9yIHRoaXMsIGZvciB1bmtub3duIHJlYXNvbnM6Ci0gIFxnbG9iYWxcZGVmXHB5QHRoaXNjbGFzc3sjMX0KLSAgXGJlZ2lue2Z1bGxsaW5laXRlbXN9Ci0gICAgXHB5QHNpZ2xpbmV7XHN0cm9uZ3tleGNlcHRpb24gfVxiZmNvZGV7IzF9fXsjMn0lCi0gICAgXGluZGV4eyMxQHtccHlAaWR4Y29kZXsjMX19IChleGNlcHRpb24gaW4gXHB5QHRoaXNtb2R1bGUpfQotfXtcZW5ke2Z1bGxsaW5laXRlbXN9fQotCi0lIFRoZXJlIGlzIG5vIGNvcnJlc3BvbmRpbmcge2V4Y2NsYXNzZGVzYyp9IGVudmlyb25tZW50LiAgVG8gZGVzY3JpYmUKLSUgYSBjbGFzcyBleGNlcHRpb24gd2l0aG91dCBwYXJhbWV0ZXJzLCB1c2UgdGhlIHtleGNkZXNjfSBlbnZpcm9ubWVudC4KLQotCi1cbGV0XHB5QGNsYXNzYmFka2V5PVxAdW5kZWZpbmVkCi0KLSUgb2JqZWN0IG1ldGhvZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lIFxiZWdpbnttZXRob2RkZXNjfVtjbGFzc25hbWVde21ldGhvZG5hbWV9e2FyZ3N9Ci1cbmV3Y29tbWFuZHtcbWV0aG9kbGluZX1bM11bXEB1bmRlZmluZWRdewotICBcbWV0aG9kbGluZW5peyMyfXsjM30KLSAgXGlmeFxAdW5kZWZpbmVkIzFccmVsYXgKLSAgICBcaW5kZXh7IzJAe1xweUBpZHhjb2RleyMyKCl9fSAoXHB5QHRoaXNjbGFzc1wgbWV0aG9kKX0KLSAgXGVsc2UKLSAgICBcaW5kZXh7IzJAe1xweUBpZHhjb2RleyMyKCl9fSAoIzEgbWV0aG9kKX0KLSAgXGZpCi19Ci1cbmV3ZW52aXJvbm1lbnR7bWV0aG9kZGVzY31bM11bXEB1bmRlZmluZWRdewotICBcYmVnaW57ZnVsbGxpbmVpdGVtc30KLSAgICBcaWZ4XEB1bmRlZmluZWQjMVxyZWxheAotICAgICAgXG1ldGhvZGxpbmV7IzJ9eyMzfQotICAgIFxlbHNlCi0gICAgICBcZGVmXHB5QHRoaXNjbGFzc3sjMX0KLSAgICAgIFxtZXRob2RsaW5leyMyfXsjM30KLSAgICBcZmkKLX17XGVuZHtmdWxsbGluZWl0ZW1zfX0KLQotJSBzaW1pbGFyIHRvIHttZXRob2RkZXNjfSwgYnV0IGRvZXNuJ3QgYWRkIHRvIHRoZSBpbmRleAotJSAobmV2ZXIgYWN0dWFsbHkgdXNlcyB0aGUgb3B0aW9uYWwgYXJndW1lbnQpCi1cbmV3Y29tbWFuZHtcbWV0aG9kbGluZW5pfVszXVtccHlAY2xhc3NiYWRrZXldeyUKLSAgXHB5QHNpZ2xpbmV7XGJmY29kZXsjMn19eyMzfX0KLVxuZXdlbnZpcm9ubWVudHttZXRob2RkZXNjbml9WzNdW1xweUBjbGFzc2JhZGtleV17Ci0gIFxiZWdpbntmdWxsbGluZWl0ZW1zfQotICAgIFxtZXRob2RsaW5lbml7IzJ9eyMzfQotfXtcZW5ke2Z1bGxsaW5laXRlbXN9fQotCi0lIG9iamVjdCBkYXRhIGF0dHJpYnV0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSBcYmVnaW57bWVtYmVyZGVzY31bY2xhc3NuYW1lXXttZW1iZXJuYW1lfQotXG5ld2NvbW1hbmR7XG1lbWJlcmxpbmV9WzJdW1xweUBjbGFzc2JhZGtleV17JQotICBcaWZ4XEB1bmRlZmluZWQjMVxyZWxheAotICAgIFxtZW1iZXJsaW5lbml7IzJ9Ci0gICAgXGluZGV4eyMyQHtccHlAaWR4Y29kZXsjMn19IChccHlAdGhpc2NsYXNzXCBhdHRyaWJ1dGUpfQotICBcZWxzZQotICAgIFxtZW1iZXJsaW5lbml7IzJ9Ci0gICAgXGluZGV4eyMyQHtccHlAaWR4Y29kZXsjMn19ICgjMSBhdHRyaWJ1dGUpfQotICBcZmkKLX0KLVxuZXdlbnZpcm9ubWVudHttZW1iZXJkZXNjfVsyXVtccHlAY2xhc3NiYWRrZXldewotICBcYmVnaW57ZnVsbGxpbmVpdGVtc30KLSAgICBcaWZ4XEB1bmRlZmluZWQjMVxyZWxheAotICAgICAgXG1lbWJlcmxpbmV7IzJ9Ci0gICAgXGVsc2UKLSAgICAgIFxkZWZccHlAdGhpc2NsYXNzeyMxfQotICAgICAgXG1lbWJlcmxpbmV7IzJ9Ci0gICAgXGZpCi19e1xlbmR7ZnVsbGxpbmVpdGVtc319Ci0KLSUgc2ltaWxhciB0byB7bWVtYmVyZGVzY30sIGJ1dCBkb2Vzbid0IGFkZCB0byB0aGUgaW5kZXgKLSUgKG5ldmVyIGFjdHVhbGx5IHVzZXMgdGhlIG9wdGlvbmFsIGFyZ3VtZW50KQotXG5ld2NvbW1hbmR7XG1lbWJlcmxpbmVuaX1bMl1bXHB5QGNsYXNzYmFka2V5XXtcaXRlbVtcYmZjb2RleyMyfV19Ci1cbmV3ZW52aXJvbm1lbnR7bWVtYmVyZGVzY25pfVsyXVtccHlAY2xhc3NiYWRrZXldewotICBcYmVnaW57ZnVsbGxpbmVpdGVtc30KLSAgICBcbWVtYmVybGluZW5peyMyfQotfXtcZW5ke2Z1bGxsaW5laXRlbXN9fQotCi0lIEZvciBleGNlcHRpb25zOiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSBcYmVnaW57ZXhjZGVzY317bmFtZX0KLSUgIC0tIGZvciBjb25zdHJ1Y3RvciBpbmZvcm1hdGlvbiwgdXNlIGV4Y2NsYXNzZGVzYyBpbnN0ZWFkCi1cbmV3ZW52aXJvbm1lbnR7ZXhjZGVzY31bMV17Ci0gIFxiZWdpbntmdWxsbGluZWl0ZW1zfQotICAgIFxpdGVtW1xzdHJvbmd7ZXhjZXB0aW9uIH1cYmZjb2RleyMxfSUKLSAgICAgICAgICBcaW5kZXh7IzFAe1xweUBpZHhjb2RleyMxfX0gKGV4Y2VwdGlvbiBpbiBccHlAdGhpc21vZHVsZSl9XQotfXtcZW5ke2Z1bGxsaW5laXRlbXN9fQotCi0lIE1vZHVsZSBkYXRhIG9yIGNvbnN0YW50czogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSBcYmVnaW57ZGF0YWRlc2N9e25hbWV9Ci1cbmV3Y29tbWFuZHtcZGF0YWxpbmV9WzFdeyUKLSAgXGRhdGFsaW5lbml7IzF9XGluZGV4eyMxQHtccHlAaWR4Y29kZXsjMX19IChkYXRhIGluIFxweUB0aGlzbW9kdWxlKX19Ci1cbmV3ZW52aXJvbm1lbnR7ZGF0YWRlc2N9WzFdewotICBcYmVnaW57ZnVsbGxpbmVpdGVtc30KLSAgICBcZGF0YWxpbmV7IzF9Ci19e1xlbmR7ZnVsbGxpbmVpdGVtc319Ci0KLSUgc2ltaWxhciB0byB7ZGF0YWRlc2N9LCBidXQgZG9lc24ndCBhZGQgdG8gdGhlIGluZGV4Ci1cbmV3Y29tbWFuZHtcZGF0YWxpbmVuaX1bMV17XGl0ZW1bXGJmY29kZXsjMX1dXG5vcGFnZWJyZWFrfQotXG5ld2Vudmlyb25tZW50e2RhdGFkZXNjbml9WzFdewotICBcYmVnaW57ZnVsbGxpbmVpdGVtc30KLSAgICBcZGF0YWxpbmVuaXsjMX0KLX17XGVuZHtmdWxsbGluZWl0ZW1zfX0KLQotJSBieXRlY29kZSBpbnN0cnVjdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUgXGJlZ2lue29wY29kZWRlc2N9e25hbWV9e3Zhcn0KLSUgLS0ge3Zhcn0gbWF5IGJlIHt9Ci1cbmV3ZW52aXJvbm1lbnR7b3Bjb2RlZGVzY31bMl17Ci0gIFxiZWdpbntmdWxsbGluZWl0ZW1zfQotICAgIFxpdGVtW1xiZmNvZGV7IzF9XHF1YWRcdmFyeyMyfV0KLX17XGVuZHtmdWxsbGluZWl0ZW1zfX0KLQotCi1cbmV3Y29tbWFuZHtcbm9kZW5hbWV9WzFde1xsYWJlbHsjMX19Ci0KLSUgRm9yIHRoZXNlIGNvbW1hbmRzLCB1c2UgXGNvbW1hbmR7fSB0byBnZXQgdGhlIHR5cG9ncmFwaHkgcmlnaHQsIG5vdCAKLSUge1xjb21tYW5kfS4gIFRoaXMgd29ya3MgYmV0dGVyIHdpdGggdGhlIHRleGluZm8gdHJhbnNsYXRpb24uCi1cbmV3Y29tbWFuZHtcQUJDfXt7XHNjIGFiY319Ci1cbmV3Y29tbWFuZHtcVU5JWH17e1xzYyBVbml4fX0KLVxuZXdjb21tYW5ke1xQT1NJWH17UE9TSVh9Ci1cbmV3Y29tbWFuZHtcQVNDSUl9e3tcc2MgYXNjaWl9fQotXG5ld2NvbW1hbmR7XENwcH17Q1xwcm90ZWN0XHJhaXNlYm94ey4xOGV4fXsrK319Ci1cbmV3Y29tbWFuZHtcQ317Q30KLVxuZXdjb21tYW5ke1xFT0Z9e3tcc2MgZW9mfX0KLVxuZXdjb21tYW5ke1xOVUxMfXtcY29uc3RhbnR7TlVMTH19Ci1cbmV3Y29tbWFuZHtcaW5maW5pdHl9e1xlbnN1cmVtYXRoe1xpbmZ0eX19Ci1cbmV3Y29tbWFuZHtccGx1c21pbnVzfXtcZW5zdXJlbWF0aHtccG19fQotCi0lIFxndWlsYWJlbHtTdGFydH0KLVxuZXdjb21tYW5ke1xndWlsYWJlbH1bMV17XHRleHRzZnsjMX19Ci0lIFxtZW51c2VsZWN0aW9ue1N0YXJ0IFxzdWIgUHJvZ3JhbXMgXHN1YiBQeXRob259Ci1cbmV3Y29tbWFuZHtcbWVudXNlbGVjdGlvbn1bMV17XGd1aWxhYmVse3tcZGVmXHN1YnsgXGVuc3VyZW1hdGh7Pn0gfSMxfX19Ci0KLSUgQWxzbyBmb3IgY29uc2lzdGVuY3k6IHNwZWxsIFB5dGhvbiAiUHl0aG9uIiwgbm90ICJweXRob24iIQotCi0lIGNvZGUgaXMgdGhlIG1vc3QgZGlmZmljdWx0IG9uZS4uLgotXG5ld2NvbW1hbmR7XGNvZGV9WzFde1x0ZXh0cm17XEB2b2JleXNwYWNlc1xAbm9saWdzXGRlZlx7e1xjaGFyYFx7fVxkZWZcfXtcY2hhcmBcfX1cZGVmXH57XGNoYXJgXH59XGRlZlxee1xjaGFyYFxefVxkZWZcZXtcY2hhcmBcXH1cZGVmXCR7XGNoYXJgXCR9XGRlZlwje1xjaGFyYFwjfVxkZWZcJntcY2hhcmBcJn1cZGVmXCV7XGNoYXJgXCV9JQotXHRleHR0dHsjMX19fQotCi1cbmV3Y29tbWFuZHtcYmZjb2RlfVsxXXtcY29kZXtcYmZzZXJpZXMjMX19ICUgYm9sZC1mYWNlZCBjb2RlIGZvbnQKLVxuZXdjb21tYW5ke1xjc2ltcGxlbWFjcm99WzFde1xjb2RleyMxfX0KLVxuZXdjb21tYW5ke1xrYmR9WzFde1xjb2RleyMxfX0KLVxuZXdjb21tYW5ke1xzYW1wfVsxXXtgXGNvZGV7IzF9J30KLVxuZXdjb21tYW5ke1x2YXJ9WzFdeyUKLSAgXGlmbW1vZGUlCi0gICAgXGhib3h7XHB5QGRlZmF1bHRzaXplXHRleHRybXtcdGV4dGl0eyMxXC99fX0lCi0gIFxlbHNlJQotICAgIFxweUBkZWZhdWx0c2l6ZVx0ZXh0cm17XHRleHRpdHsjMVwvfX0lCi0gIFxmaSUKLX0KLVxyZW5ld2NvbW1hbmR7XGVtcGh9WzFde3tcZW0gIzF9fQotXG5ld2NvbW1hbmR7XGRmbn1bMV17XGVtcGh7IzF9fQotXG5ld2NvbW1hbmR7XHN0cm9uZ31bMV17e1xiZiAjMX19Ci0lIGxldCdzIGV4cGVyaW1lbnQgd2l0aCBhIG5ldyBmb250OgotXG5ld2NvbW1hbmR7XGZpbGV9WzFde2BcZmlsZW5xeyMxfSd9Ci1cbmV3Y29tbWFuZHtcZmlsZW5xfVsxXXt7XHB5QHNtYWxsc2l6ZVx0ZXh0c2Z7XGxldFxlPVx0ZXh0YmFja3NsYXNoIzF9fX0KLQotJSBVc2UgdGhpcyBkZWYvcmVkZWYgYXBwcm9hY2ggZm9yIFx1cmx7fSBzaW5jZSBoeXBlcnJlZiBkZWZpbmVkIHRoaXMgYWxyZWFkeSwKLSUgYnV0IG9ubHkgaWYgd2UgYWN0dWFsbHkgdXNlZCBoeXBlcnJlZjoKLVxpZnBkZgotICBcbmV3Y29tbWFuZHtcdXJsfVsxXXt7JQotICAgIFxweUBwZGZzdGFydGxpbmslCi0gICAgYXR0cnsgL0JvcmRlciBbMCAwIDBdIH0lCi0gICAgdXNlcnslCi0gICAgICAvU3VidHlwZS9MaW5rJQotICAgICAgL0E8PCUKLSAgICAgIC9UeXBlL0FjdGlvbiUKLSAgICAgIC9TL1VSSSUKLSAgICAgIC9VUkkoIzEpJQotICAgICAgPj4lCi0gICAgfSUKLSAgICBccHlATGlua0NvbG9yJSAgICAgICAgICAgICAgICAgICAgICBjb2xvciBvZiB0aGUgbGluayB0ZXh0Ci0gICAgXHB5QHNtYWxsc2l6ZVxzZiAjMSUKLSAgICBccHlATm9ybWFsQ29sb3IlICAgICAgICAgICAgICAgICAgICBUdXJuIGl0IGJhY2sgb2ZmOyB0aGVzZSBhcmUgZGVjbGFyYXRpdmUKLSAgICBccGRmZW5kbGlua30lICAgICAgICAgICAgICAgICAgICAgICBhbmQgZG9uJ3QgYXBwZWFyIGJvdW5kIHRvIHRoZSBjdXJyZW50Ci0gIH0lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGluZyAiYm94Ii4KLVxlbHNlCi0gIFxuZXdjb21tYW5ke1x1cmx9WzFde1xtYm94e1xweUBzbWFsbHNpemVcdGV4dHNmeyMxfX19Ci1cZmkKLVxuZXdjb21tYW5ke1xlbWFpbH1bMV17e1xweUBzbWFsbHNpemVcdGV4dHNmeyMxfX19Ci1cbmV3Y29tbWFuZHtcbmV3c2dyb3VwfVsxXXt7XHB5QHNtYWxsc2l6ZVx0ZXh0c2Z7IzF9fX0KLQotXG5ld2NvbW1hbmR7XHB5QHZhcnZhcnN9WzFde3slCi0gIHtcbGV0XHVuc3BlY2lmaWVkPVxweUB1bnNwZWNpZmllZCUKLSAgIFxsZXRcbW9yZWFyZ3M9XHB5QG1vcmVhcmdzJQotICAgXHZhcnsjMX19fX0KLQotJSBJJ2QgcmVhbGx5IGxpa2UgdG8gZ2V0IHJpZCBvZiB0aGlzIQotXG5ld2lmXGlmdGV4aVx0ZXhpZmFsc2UKLQotJSBUaGlzIGlzIHVzZWQgdG8gZ2V0IGwyaCB0byBwdXQgdGhlIGNvcHlyaWdodCBhbmQgYWJzdHJhY3Qgb24KLSUgYSBzZXBhcmF0ZSBIVE1MIHBhZ2UuCi1cbmV3aWZcaWZodG1sXGh0bWxmYWxzZQotCi0KLSUgVGhlc2Ugc2hvdWxkIGJlIHVzZWQgZm9yIGFsbCByZWZlcmVuY2VzIHRvIGlkZW50aWZpZXJzIHdoaWNoIGFyZQotJSB1c2VkIHRvIHJlZmVyIHRvIGluc3RhbmNlcyBvZiBzcGVjaWZpYyBsYW5ndWFnZSBjb25zdHJ1Y3RzLiAgU2VlIHRoZQotJSBuYW1lcyBmb3Igc3BlY2lmaWMgc2VtYW50aWMgYXNzaWdubWVudHMuCi0lCi0lIEZvciBub3csIGRvbid0IGRvIGFueXRoaW5nIHJlYWxseSBmYW5jeSB3aXRoIHRoZW07IGp1c3QgdXNlIHRoZW0gYXMKLSUgbG9naWNhbCBtYXJrdXAuICBUaGlzIG1pZ2h0IGNoYW5nZSBpbiB0aGUgZnV0dXJlLgotJQotXG5ld2NvbW1hbmR7XG1vZHVsZX1bMV17XHRleHR0dHsjMX19Ci1cbmV3Y29tbWFuZHtca2V5d29yZH1bMV17XHRleHR0dHsjMX19Ci1cbmV3Y29tbWFuZHtcZXhjZXB0aW9ufVsxXXtcdGV4dHR0eyMxfX0KLVxuZXdjb21tYW5ke1xjbGFzc31bMV17XHRleHR0dHsjMX19Ci1cbmV3Y29tbWFuZHtcZnVuY3Rpb259WzFde1x0ZXh0dHR7IzF9fQotXG5ld2NvbW1hbmR7XG1lbWJlcn1bMV17XHRleHR0dHsjMX19Ci1cbmV3Y29tbWFuZHtcbWV0aG9kfVsxXXtcdGV4dHR0eyMxfX0KLQotXG5ld2NvbW1hbmR7XHB5dHlwZX1bMV17IzF9ICAgICAgICAgICAgICUgYnVpbHQtaW4gUHl0aG9uIHR5cGUKLQotXG5ld2NvbW1hbmR7XGNmdW5jdGlvbn1bMV17XHRleHR0dHsjMX19Ci1cbmV3Y29tbWFuZHtcY3R5cGV9WzFde1x0ZXh0dHR7IzF9fSAgICAgJSBDIHN0cnVjdCBvciB0eXBlZGVmIG5hbWUKLVxuZXdjb21tYW5ke1xjZGF0YX1bMV17XHRleHR0dHsjMX19ICAgICAlIEMgdmFyaWFibGUsIHR5cGljYWxseSBnbG9iYWwKLQotXG5ld2NvbW1hbmR7XG1haWxoZWFkZXJ9WzFde3tccHlAc21hbGxzaXplXHRleHRzZnsjMTp9fX0KLVxuZXdjb21tYW5ke1xtaW1ldHlwZX1bMV17e1xweUBzbWFsbHNpemVcdGV4dHNmeyMxfX19Ci0lIFRoZSBcISBpcyBhICJuZWdhdGl2ZSB0aGluIHNwYWNlIiBpbiBtYXRoIG1vZGUuCi1cbmV3Y29tbWFuZHtccmVnZXhwfVsxXXslCi0gIHtcdGlueSRee15cbGNlaWx9XCFcISQlCi0gICB7XHB5QGRlZmF1bHRzaXplXGNvZGV7IzF9fSUKLSAgICRcIVxyZmxvb3JcISQlCi0gIH19Ci1cbmV3Y29tbWFuZHtcZW52dmFyfVsxXXslCi0gICMxJQotICBcaW5kZXh7IzF9JQotICBcaW5kZXh7ZW52aXJvbm1lbnQgdmFyaWFibGVzIXsjMX19JQotfQotXG5ld2NvbW1hbmR7XG1ha2V2YXJ9WzFdeyMxfSAgICAgICAgICAgICUgdmFyaWFibGUgaW4gYSBNYWtlZmlsZQotXG5ld2NvbW1hbmR7XGNoYXJhY3Rlcn1bMV17XHNhbXB7IzF9fQotCi0lIGNvbnN0YW50cyBkZWZpbmVkIGluIFB5dGhvbiBtb2R1bGVzIG9yIEMgaGVhZGVycywgbm90IGxhbmd1YWdlIGNvbnN0YW50czoKLVxuZXdjb21tYW5ke1xjb25zdGFudH1bMV17XGNvZGV7IzF9fSAgICAlIG1hbmlmZXN0IGNvbnN0YW50LCBub3Qgc3ludGFjdGljCi0KLVxuZXdjb21tYW5ke1xtYW5wYWdlfVsyXXt7XGVtcGh7IzF9KCMyKX19Ci1cbmV3Y29tbWFuZHtccGVwfVsxXXtQRVAgIzFcaW5kZXh7UHl0aG9uIEVuaGFuY2VtZW50IFByb3Bvc2FscyFQRVAgIzF9fQotXG5ld2NvbW1hbmR7XHJmY31bMV17UkZDICMxXGluZGV4e1JGQyFSRkMgIzF9fQotXG5ld2NvbW1hbmR7XHByb2dyYW19WzFde1xzdHJvbmd7IzF9fQotXG5ld2NvbW1hbmR7XHByb2dyYW1vcHR9WzFde1xzdHJvbmd7IzF9fQotJSBOb3RlIHRoYXQgXGxvbmdwcm9ncmFtb3B0IHByb3ZpZGVzIHRoZSAnLS0nIQotXG5ld2NvbW1hbmR7XGxvbmdwcm9ncmFtb3B0fVsxXXtcc3Ryb25ney17fS0jMX19Ci0KLSUgXHVsaW5re2xpbmsgdGV4dH17VVJMfQotXGlmcGRmCi0gIFxuZXdjb21tYW5ke1x1bGlua31bMl17eyUKLSAgICAlIEZvciBQREYsIHdlICpzaG91bGQqIG9ubHkgZ2VuZXJhdGUgYSBsaW5rIHdoZW4gdGhlIFVSTCBpcyBhYnNvbHV0ZS4KLSAgICBccHlAcGRmc3RhcnRsaW5rJQotICAgIGF0dHJ7IC9Cb3JkZXIgWzAgMCAwXSB9JQotICAgIHVzZXJ7JQotICAgICAgL1N1YnR5cGUvTGluayUKLSAgICAgIC9BPDwlCi0gICAgICAvVHlwZS9BY3Rpb24lCi0gICAgICAvUy9VUkklCi0gICAgICAvVVJJKCMyKSUKLSAgICAgID4+JQotICAgIH0lCi0gICAgXHB5QExpbmtDb2xvciUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciBvZiB0aGUgbGluayB0ZXh0Ci0gICAgIzElCi0gICAgXHB5QE5vcm1hbENvbG9yJSAgICAgICAgICAgICAgICAgICAgVHVybiBpdCBiYWNrIG9mZjsgdGhlc2UgYXJlIGRlY2xhcmF0aXZlCi0gICAgXHBkZmVuZGxpbmt9JSAgICAgICAgICAgICAgICAgICAgICAgYW5kIGRvbid0IGFwcGVhciBib3VuZCB0byB0aGUgY3VycmVudAotICB9JSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRpbmcgImJveCIuCi1cZWxzZQotICBcbmV3Y29tbWFuZHtcdWxpbmt9WzJdeyMxfQotXGZpCi0KLSUgY2l0ZWQgdGl0bGVzOiAgXGNpdGV0aXRsZXtUaXRsZSBvZiBXb3JrfQotJSAgICAgICBvbmxpbmU6ICBcY2l0ZXRpdGxlW3VybC10by1yZXNvdXJjZV17VGl0bGUgb2YgV29ya30KLVxpZnBkZgotICBcbmV3Y29tbWFuZHtcY2l0ZXRpdGxlfVsyXVtccHlAbW9kdWxlYmFka2V5XXslCi0gICAgXGlmeFxweUBtb2R1bGViYWRrZXkjMVxlbXBoeyMyfVxlbHNlXHVsaW5re1xlbXBoeyMyfX17IzF9XGZpJQotICB9Ci1cZWxzZQotICBcbmV3Y29tbWFuZHtcY2l0ZXRpdGxlfVsyXVtVUkxde1xlbXBoeyMyfX0KLVxmaQotCi0KLQotJSBUaGlzIHZlcnNpb24gaXMgYmVpbmcgY2hlY2tlZCBpbiBmb3IgdGhlIGhpc3RvcmljYWwgcmVjb3JkOyBpdCBzaG93cwotJSBob3cgSSd2ZSBtYW5hZ2VkIHRvIGdldCBzb21lIGFzcGVjdHMgb2YgdGhpcyB0byB3b3JrLiAgSXQgd2lsbCBub3QKLSUgYmUgdXNlZCBpbiBwcmFjdGljZSwgc28gYSBzdWJzZXF1ZW50IHJldmlzaW9uIHdpbGwgY2hhbmdlIHRoaW5ncwotJSBhZ2Fpbi4gIFRoaXMgdmVyc2lvbiBoYXMgcHJvYmxlbXMsIGJ1dCBzaG93cyBob3cgdG8gZG8gc29tZXRoaW5nCi0lIHRoYXQgcHJvdmVkIG1vcmUgdGVkaW91cyB0aGFuIEknZCBleHBlY3RlZCwgc28gSSBkb24ndCB3YW50IHRvIGxvc2UKLSUgdGhlIGV4YW1wbGUgY29tcGxldGVseS4KLSUKLVxuZXdjb21tYW5ke1xncmFtbWFydG9rZW59WzFde1x0ZXh0dHR7IzF9fQotXG5ld2Vudmlyb25tZW50e3Byb2R1Y3Rpb25saXN0fVsxXVtccHlAYmFka2V5XXsKLSAgXGRlZlxvcHRpb25hbCMjMXt7XExhcmdlW30jIzF7XExhcmdlXX19Ci0gIFxkZWZccHJvZHVjdGlvbiMjMSMjMntcY29kZXsjIzF9Jjo6PSZcY29kZXsjIzJ9XFx9Ci0gIFxkZWZccHJvZHVjdGlvbmNvbnQjIzF7JiAmXGNvZGV7IyMxfVxcfQotICBcZGVmXHRva2VuIyMxeyMjMX0KLSAgXGxldFxncmFtbWFydG9rZW49XHRva2VuCi0gIFxwYXJpbmRlbnQ9MmVtCi0gIFxpbmRlbnQKLSAgXGJlZ2lue3RhYnVsYXJ9e2xjbH0KLX17JQotICBcZW5ke3RhYnVsYXJ9Ci19Ci0KLVxuZXdsZW5ndGh7XHB5QG5vdGljZWxlbmd0aH0KLQotXG5ld2NvbW1hbmR7XHB5QGhlYXZ5Ym94fXsKLSAgXHNldGxlbmd0aHtcZmJveHJ1bGV9ezJwdH0KLSAgXHNldGxlbmd0aHtcZmJveHNlcH17N3B0fQotICBcc2V0bGVuZ3Roe1xweUBub3RpY2VsZW5ndGh9e1xsaW5ld2lkdGh9Ci0gIFxhZGR0b2xlbmd0aHtccHlAbm90aWNlbGVuZ3RofXstMlxmYm94c2VwfQotICBcYWRkdG9sZW5ndGh7XHB5QG5vdGljZWxlbmd0aH17LTJcZmJveHJ1bGV9Ci0gIFxzZXRsZW5ndGh7XHNoYWRvd3NpemV9ezNwdH0KLSAgXFNib3gKLSAgXG1pbmlwYWdle1xweUBub3RpY2VsZW5ndGh9Ci19Ci1cbmV3Y29tbWFuZHtccHlAZW5kaGVhdnlib3h9ewotICBcZW5kbWluaXBhZ2UKLSAgXGVuZFNib3gKLSAgXGZib3h7XFRoZVNib3h9Ci19Ci0KLSUgYSAnbm90ZScgaXMgYXMgcGxhaW4gYXMgaXQgZ2V0czoKLVxuZXdjb21tYW5ke1xweUBub3RpY2VsYWJlbEBub3RlfXtOb3RlOn0KLVxuZXdjb21tYW5ke1xweUBub3RpY2VzdGFydEBub3RlfXt9Ci1cbmV3Y29tbWFuZHtccHlAbm90aWNlZW5kQG5vdGV9e30KLQotJSBhICd3YXJuaW5nJyBnZXRzIG1vcmUgdmlzaWJsZSBkaXN0aW5jdGlvbjoKLVxuZXdjb21tYW5ke1xweUBub3RpY2VsYWJlbEB3YXJuaW5nfXtXYXJuaW5nOn0KLVxuZXdjb21tYW5ke1xweUBub3RpY2VzdGFydEB3YXJuaW5nfXtccHlAaGVhdnlib3h9Ci1cbmV3Y29tbWFuZHtccHlAbm90aWNlZW5kQHdhcm5pbmd9e1xweUBlbmRoZWF2eWJveH0KLQotXG5ld2Vudmlyb25tZW50e25vdGljZX1bMV1bbm90ZV17Ci0gIFxkZWZccHlAbm90aWNldHlwZXsjMX0KLSAgXGNzbmFtZSBweUBub3RpY2VzdGFydEAjMVxlbmRjc25hbWUKLSAgXHBhclxzdHJvbmd7XGNzbmFtZSBweUBub3RpY2VsYWJlbEAjMVxlbmRjc25hbWV9Ci19e1xjc25hbWUgcHlAbm90aWNlZW5kQFxweUBub3RpY2V0eXBlXGVuZGNzbmFtZX0KLVxuZXdjb21tYW5ke1xub3RlfVsxXXtcc3Ryb25ne1xweUBub3RpY2VsYWJlbEBub3RlfSAjMX0KLVxuZXdjb21tYW5ke1x3YXJuaW5nfVsxXXtcc3Ryb25ne1xweUBub3RpY2VsYWJlbEB3YXJuaW5nfSAjMX0KLQotJSBEZXByZWNhdGlvbiBzdHVmZi4KLSUgU2hvdWxkIGJlIGV4dGVuZGVkIHRvIGFsbG93IGFuIGluZGV4IC8gbGlzdCBvZiBkZXByZWNhdGVkIHN0dWZmLiAgQnV0Ci0lIHRoZXJlJ3MgYSBsb3Qgb2Ygc3R1ZmYgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIG1ha2UgdGhhdCBhdXRvbWF0YWJsZS4KLSUKLSUgRmlyc3QgcGFyYW1ldGVyIGlzIHRoZSByZWxlYXNlIG51bWJlciB0aGF0IGRlcHJlY2F0ZXMgdGhlIGZlYXR1cmUsIHRoZQotJSBzZWNvbmQgaXMgdGhlIGFjdGlvbiB0aGUgc2hvdWxkIGJlIHRha2VuIGJ5IHVzZXJzIG9mIHRoZSBmZWF0dXJlLgotJQotJSBFeGFtcGxlOgotJSAgXGRlcHJlY2F0ZWR7MS41LjF9e1VzZSBcbWV0aG9ke2Zyb2JuaWNhdGUoKX0gaW5zdGVhZC59Ci0lCi1cbmV3Y29tbWFuZHtcZGVwcmVjYXRlZH1bMl17JQotICBcc3Ryb25ne0RlcHJlY2F0ZWQgc2luY2UgcmVsZWFzZSAjMS59ICAjMlxwYXJ9Ci0KLSUgTmV3IHN0dWZmLgotJSBUaGlzIHNob3VsZCBiZSB1c2VkIHRvIG1hcmsgdGhpbmdzIHdoaWNoIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUKLSUgZGV2ZWxvcG1lbnQgdHJlZSBidXQgdGhhdCBhcmVuJ3QgaW4gdGhlIHJlbGVhc2UsIGJ1dCBhcmUgZG9jdW1lbnRlZC4KLSUgVGhpcyBhbGxvd3MgcmVsZWFzZSBvZiBkb2N1bWVudGF0aW9uIHRoYXQgYWxyZWFkeSBpbmNsdWRlcyB1cGRhdGVkCi0lIGRlc2NyaXB0aW9ucy4gIFBsYWNlIGF0IGVuZCBvZiBkZXNjcmlwdG9yIGVudmlyb25tZW50LgotJQotJSBFeGFtcGxlOgotJSAgXHZlcnNpb25hZGRlZHsxLjUuMn0KLSUgIFx2ZXJzaW9uY2hhbmdlZFtzaG9ydCBleHBsYW5hdGlvbl17Mi4wfQotJQotXG5ld2NvbW1hbmR7XHZlcnNpb25hZGRlZH1bMl1bXHB5QGJhZGtleV17JQotICBcaWZ4XEB1bmRlZmluZWQjMVxyZWxheCUKLSAgICB7ICBOZXcgaW4gdmVyc2lvbiAjMi4gIH0lCi0gIFxlbHNlJQotICAgIHsgIE5ldyBpbiB2ZXJzaW9uICMyOlwgIzEuICB9JQotICBcZmklCi19Ci1cbmV3Y29tbWFuZHtcdmVyc2lvbmNoYW5nZWR9WzJdW1xweUBiYWRrZXldeyUKLSAgXGlmeFxAdW5kZWZpbmVkIzFccmVsYXglCi0gICAgeyAgQ2hhbmdlZCBpbiB2ZXJzaW9uICMyLiAgfSUKLSAgXGVsc2UlCi0gICAgeyAgQ2hhbmdlZCBpbiB2ZXJzaW9uICMyOlwgIzEuICB9JQotICBcZmklCi19Ci0KLQotJSBUYWJsZXMuCi0lCi1cbmV3ZW52aXJvbm1lbnR7dGFibGVpaX1bNF17JQotICBcYmVnaW57Y2VudGVyfSUKLSAgICBcZGVmXGxpbmVpaSMjMSMjMntcY3NuYW1lIzJcZW5kY3NuYW1leyMjMX0mIyMyXFx9JQotICAgIFxiZWdpbnt0YWJ1bGFyfXsjMX1cc3Ryb25neyMzfSZcc3Ryb25neyM0fSBcXCogXGhsaW5lJQotfXslCi0gICAgXGVuZHt0YWJ1bGFyfSUKLSAgXGVuZHtjZW50ZXJ9JQotfQotCi1cbmV3ZW52aXJvbm1lbnR7bG9uZ3RhYmxlaWl9WzRdeyUKLSAgXGJlZ2lue2NlbnRlcn0lCi0gICAgXGRlZlxsaW5laWkjIzEjIzJ7XGNzbmFtZSMyXGVuZGNzbmFtZXsjIzF9JiMjMlxcfSUKLSAgICBcYmVnaW57bG9uZ3RhYmxlfVtjXXsjMX1cc3Ryb25neyMzfSZcc3Ryb25neyM0fSBcXCogXGhsaW5lXGVuZGhlYWQlCi19eyUKLSAgICBcZW5ke2xvbmd0YWJsZX0lCi0gIFxlbmR7Y2VudGVyfSUKLX0KLQotXG5ld2Vudmlyb25tZW50e3RhYmxlaWlpfVs1XXslCi0gIFxiZWdpbntjZW50ZXJ9JQotICAgIFxkZWZcbGluZWlpaSMjMSMjMiMjM3tcY3NuYW1lIzJcZW5kY3NuYW1leyMjMX0mIyMyJiMjM1xcfSUKLSAgICBcYmVnaW57dGFidWxhcn17IzF9XHN0cm9uZ3sjM30mXHN0cm9uZ3sjNH0mXHN0cm9uZ3sjNX0gXFwlCi0gICAgICBcaGxpbmUlCi19eyUKLSAgICBcZW5ke3RhYnVsYXJ9JQotICBcZW5ke2NlbnRlcn0lCi19Ci0KLVxuZXdlbnZpcm9ubWVudHtsb25ndGFibGVpaWl9WzVdeyUKLSAgXGJlZ2lue2NlbnRlcn0lCi0gICAgXGRlZlxsaW5laWlpIyMxIyMyIyMze1xjc25hbWUjMlxlbmRjc25hbWV7IyMxfSYjIzImIyMzXFx9JQotICAgIFxiZWdpbntsb25ndGFibGV9W2NdeyMxfVxzdHJvbmd7IzN9JlxzdHJvbmd7IzR9JlxzdHJvbmd7IzV9IFxcJQotICAgICAgXGhsaW5lXGVuZGhlYWQlCi19eyUKLSAgICBcZW5ke2xvbmd0YWJsZX0lCi0gIFxlbmR7Y2VudGVyfSUKLX0KLQotXG5ld2Vudmlyb25tZW50e3RhYmxlaXZ9WzZdeyUKLSAgXGJlZ2lue2NlbnRlcn0lCi0gICAgXGRlZlxsaW5laXYjIzEjIzIjIzMjIzR7XGNzbmFtZSMyXGVuZGNzbmFtZXsjIzF9JiMjMiYjIzMmIyM0XFx9JQotICAgIFxiZWdpbnt0YWJ1bGFyfXsjMX1cc3Ryb25neyMzfSZcc3Ryb25neyM0fSZcc3Ryb25neyM1fSZcc3Ryb25neyM2fSBcXCUKLSAgICAgIFxobGluZSUKLX17JQotICAgIFxlbmR7dGFidWxhcn0lCi0gIFxlbmR7Y2VudGVyfSUKLX0KLQotXG5ld2Vudmlyb25tZW50e2xvbmd0YWJsZWl2fVs2XXslCi0gIFxiZWdpbntjZW50ZXJ9JQotICAgIFxkZWZcbGluZWl2IyMxIyMyIyMzIyM0e1xjc25hbWUjMlxlbmRjc25hbWV7IyMxfSYjIzImIyMzJiMjNFxcfSUKLSAgICBcYmVnaW57bG9uZ3RhYmxlfVtjXXsjMX1cc3Ryb25neyMzfSZcc3Ryb25neyM0fSZcc3Ryb25neyM1fSZcc3Ryb25neyM2fSUKLSAgICAgIFxcJQotICAgICAgXGhsaW5lXGVuZGhlYWQlCi19eyUKLSAgICBcZW5ke2xvbmd0YWJsZX0lCi0gIFxlbmR7Y2VudGVyfSUKLX0KLQotXG5ld2Vudmlyb25tZW50e3RhYmxldn1bN117JQotICBcYmVnaW57Y2VudGVyfSUKLSAgICBcZGVmXGxpbmV2IyMxIyMyIyMzIyM0IyM1e1xjc25hbWUjMlxlbmRjc25hbWV7IyMxfSYjIzImIyMzJiMjNCYjIzVcXH0lCi0gICAgXGJlZ2lue3RhYnVsYXJ9eyMxfVxzdHJvbmd7IzN9JlxzdHJvbmd7IzR9JlxzdHJvbmd7IzV9JlxzdHJvbmd7IzZ9JlxzdHJvbmd7Izd9IFxcJQotICAgICAgXGhsaW5lJQotfXslCi0gICAgXGVuZHt0YWJ1bGFyfSUKLSAgXGVuZHtjZW50ZXJ9JQotfQotCi1cbmV3ZW52aXJvbm1lbnR7bG9uZ3RhYmxldn1bN117JQotICBcYmVnaW57Y2VudGVyfSUKLSAgICBcZGVmXGxpbmV2IyMxIyMyIyMzIyM0IyM1e1xjc25hbWUjMlxlbmRjc25hbWV7IyMxfSYjIzImIyMzJiMjNCYjIzVcXH0lCi0gICAgXGJlZ2lue2xvbmd0YWJsZX1bY117IzF9XHN0cm9uZ3sjM30mXHN0cm9uZ3sjNH0mXHN0cm9uZ3sjNX0mXHN0cm9uZ3sjNn0mXHN0cm9uZ3sjN30lCi0gICAgICBcXCUKLSAgICAgIFxobGluZVxlbmRoZWFkJQotfXslCi0gICAgXGVuZHtsb25ndGFibGV9JQotICBcZW5ke2NlbnRlcn0lCi19Ci0KLSUgWFhYIERvbid0IHRoaW5rIHdlIGNhbiB1c2UgdGhpcyB5ZXQsIHRob3VnaCBpdCBjbGVhbnMgdXAgc29tZQotJSB0ZWRpb3VzIG1hcmt1cC4gIFRoZXJlJ3Mgbm8gZXF1aXZhbGVudCBmb3IgdGhlIEhUTUwgdHJhbnNmb3JtIHlldCwKLSUgYW5kIHRoYXQgbmVlZHMgdG8gZXhpc3QuICBJIGRvbid0IGtub3cgaG93IHRvIHdyaXRlIGl0LgotJQotJSBUaGlzIHNob3VsZCByZWFsbHkgaGF2ZSBzb21ldGhpbmcgdGhhdCBtYWtlcyBpdCBlYXNpZXIgdG8gYmluZCBhCi0lIHRhYmxlJ3MgYGBOb3RlcycnIGNvbHVtbiBhbmQgYW4gYXNzb2NpYXRlZCB0YWJsZW5vdGVzIGVudmlyb25tZW50LAotJSBhbmQgZ2VuZXJhdGVzIHRoZSByaWdodCBtYWdpYyBmb3IgZ2V0dGluZyB0aGUgbnVtYmVycyByaWdodCBpbiB0aGUKLSUgdGFibGUuCi0lCi0lIFNvIHRoaXMgaXMgcXVpdGUgaW5jb21wbGV0ZS4KLSUKLVxuZXdjb3VudGVye3B5QHRhYmxlbm90ZXNjb3VudGVyfQotXG5ld2Vudmlyb25tZW50e3RhYmxlbm90ZXN9eyUKLSAgXG5vaW5kZW50IE5vdGVzOgotICBccGFyCi0gIFxzZXRjb3VudGVye3B5QHRhYmxlbm90ZXNjb3VudGVyfXswfQotICBcYmVnaW57bGlzdH17KFxhcmFiaWN7cHlAdGFibGVub3Rlc2NvdW50ZXJ9KX0lCi0gICAgICAgICAgICAgIHtcdXNlY291bnRlcntweUB0YWJsZW5vdGVzY291bnRlcn19Ci19e1xlbmR7bGlzdH19Ci0KLQotJSBDcm9zcy1yZWZlcmVuY2luZyAoQU1LLCBuZXcgaW1wbC4gRkxEKQotJSBTYW1wbGUgdXNhZ2U6Ci0lICBcYmVnaW57c2VlYWxzb30KLSUgICAgXHNlZW1vZHVsZXtyYW5kfXtVbmlmb3JtIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLn07ICUgTW9kdWxlIHhyZWYKLSUgICAgXHNlZXRleHR7XGVtcGh7RW5jeWNsb3BlZGlhIEJyaXRhbm5pY2F9fS4gICAgICAgICAgICUgUmVmIHRvIGEgYm9vawotJSAKLSUgICAgJSBBIGZ1bmt5IGNhc2U6IG1vZHVsZSBuYW1lIGNvbnRhaW5zICdfJzsgaGF2ZSB0byBzdXBwbHkgYW4gb3B0aW9uYWwga2V5Ci0lICAgIFxzZWVtb2R1bGVbY29weXJlZ117Y29weV9yZWd9e0ludGVyZmFjZSBjb25zdHJ1Y3RvciByZWdpc3RyYXRpb24gZm9yCi0lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxtb2R1bGV7cGlja2xlfS59Ci0lICBcZW5ke3NlZWFsc299Ci0lCi0lIE5vdGUgdGhhdCB0aGUgbGFzdCBwYXJhbWV0ZXIgZm9yIFxzZWVtb2R1bGUgYW5kIFxzZWV0ZXh0IHNob3VsZCBiZSBjb21wbGV0ZQotJSBzZW50ZW5jZXMgYW5kIGJlIHRlcm1pbmF0ZWQgd2l0aCB0aGUgcHJvcGVyIHB1bmN0dWF0aW9uLgotCi1caWZwZGYKLSAgXG5ld2NvbW1hbmR7XHB5QHNlZW1vZHVsZX1bM11bXHB5QG1vZHVsZWJhZGtleV17JQotICAgIFxwYXIlCi0gICAgXGlmeFxweUBtb2R1bGViYWRrZXkjMVxkZWZccHlAbW9kdWxla2V5eyMyfVxlbHNlXGRlZlxweUBtb2R1bGVrZXl7IzF9XGZpJQotICAgIFxiZWdpbntmdWxsbGluZWl0ZW1zfQotICAgICAgXGl0ZW1bXHB5QGxpbmtUb05hbWV7bGFiZWwtbW9kdWxlLVxweUBtb2R1bGVrZXl9e01vZHVsZSBcbW9kdWxleyMyfX0KLSAgICAgICAgICAgIChzZWN0aW9uIFxyZWZ7bW9kdWxlLVxweUBtb2R1bGVrZXl9KTpdCi0gICAgICAjMwotICAgIFxlbmR7ZnVsbGxpbmVpdGVtc30KLSAgfQotXGVsc2UKLSAgXG5ld2NvbW1hbmR7XHB5QHNlZW1vZHVsZX1bM11bXHB5QG1vZHVsZWJhZGtleV17JQotICAgIFxwYXIlCi0gICAgXGlmeFxweUBtb2R1bGViYWRrZXkjMVxkZWZccHlAbW9kdWxla2V5eyMyfVxlbHNlXGRlZlxweUBtb2R1bGVrZXl7IzF9XGZpJQotICAgIFxiZWdpbntmdWxsbGluZWl0ZW1zfQotICAgICAgXGl0ZW1bTW9kdWxlIFxtb2R1bGV7IzJ9IChzZWN0aW9uIFxyZWZ7bW9kdWxlLVxweUBtb2R1bGVrZXl9KTpdCi0gICAgICAjMwotICAgIFxlbmR7ZnVsbGxpbmVpdGVtc30KLSAgfQotXGZpCi0KLSUgXHNlZWxpbmt7dXJsfXtsaW5rIHRleHR9e3doeSBpdCdzIGludGVyZXN0aW5nfQotXG5ld2NvbW1hbmR7XHB5QHNlZWxpbmt9WzNdeyUKLSAgXHBhcgotICBcYmVnaW57ZnVsbGxpbmVpdGVtc30KLSAgICBcaXRlbVtcdWxpbmt7IzJ9eyMxfV0KLSAgICAjMwotICBcZW5ke2Z1bGxsaW5laXRlbXN9Ci19Ci0lIFxzZWV0aXRsZVt1cmxde3RpdGxlfXt3aHkgaXQncyBpbnRlcmVzdGluZ30KLVxuZXdjb21tYW5ke1xweUBzZWV0aXRsZX1bM11bXHB5QG1vZHVsZWJhZGtleV17JQotICBccGFyCi0gIFxiZWdpbntmdWxsbGluZWl0ZW1zfQotICAgIFxpdGVtW1xjaXRldGl0bGV7IzJ9XQotICAgIFxpZnhccHlAbW9kdWxlYmFka2V5IzFcZWxzZQotICAgICAgXGl0ZW1be1xzbWFsbHsoXHVybHsjMX0pfX1dCi0gICAgXGZpCi0gICAgIzMKLSAgXGVuZHtmdWxsbGluZWl0ZW1zfQotfQotJSBcc2VlcGVwe251bWJlcn17dGl0bGV9e3doeSBpdCdzIGludGVyZXN0aW5nfQotXG5ld2NvbW1hbmR7XHB5QHNlZXBlcH1bM117JQotICBccGFyJQotICBcYmVnaW57ZnVsbGxpbmVpdGVtc30KLSAgICBcaXRlbVtccGVweyMxfSwgYGBcZW1waHsjMn0nJ10KLSAgICAjMwotICBcZW5ke2Z1bGxsaW5laXRlbXN9Ci19Ci0lIFxzZWVyZmN7bnVtYmVyfXt0aXRsZX17d2h5IGl0J3MgaW50ZXJlc3Rpbmd9Ci1cbmV3Y29tbWFuZHtccHlAc2VlcmZjfVszXXslCi0gIFxwYXIlCi0gIFxiZWdpbntmdWxsbGluZWl0ZW1zfQotICAgIFxpdGVtW1xyZmN7IzF9LCBgYFxlbXBoeyMyfScnXQotICAgICMzCi0gIFxlbmR7ZnVsbGxpbmVpdGVtc30KLX0KLSUgXHNlZXVybHt1cmx9e3doeSBpdCdzIGludGVyZXN0aW5nfQotXG5ld2NvbW1hbmR7XHB5QHNlZXVybH1bMl17JQotICBccGFyJQotICBcYmVnaW57ZnVsbGxpbmVpdGVtc30KLSAgICBcaXRlbVtcdXJseyMxfV0KLSAgICAjMgotICBcZW5ke2Z1bGxsaW5laXRlbXN9Ci19Ci0KLVxuZXdlbnZpcm9ubWVudHtzZWVhbHNvKn17Ci0gIFxwYXIKLSAgXGRlZlxzZWV0ZXh0IyMxe1xwYXJ7IyMxfX0KLSAgXGxldFxzZWVtb2R1bGU9XHB5QHNlZW1vZHVsZQotICBcbGV0XHNlZXBlcD1ccHlAc2VlcGVwCi0gIFxsZXRcc2VlcmZjPVxweUBzZWVyZmMKLSAgXGxldFxzZWV0aXRsZT1ccHlAc2VldGl0bGUKLSAgXGxldFxzZWV1cmw9XHB5QHNlZXVybAotICBcbGV0XHNlZWxpbms9XHB5QHNlZWxpbmsKLX17XHBhcn0KLVxuZXdlbnZpcm9ubWVudHtzZWVhbHNvfXsKLSAgXHBhcgotICBcc3Ryb25ne1NlZSBBbHNvOn0KLSAgXHBhcgotICBcZGVmXHNlZXRleHQjIzF7XHBhcnsjIzF9fQotICBcbGV0XHNlZW1vZHVsZT1ccHlAc2VlbW9kdWxlCi0gIFxsZXRcc2VlcGVwPVxweUBzZWVwZXAKLSAgXGxldFxzZWVyZmM9XHB5QHNlZXJmYwotICBcbGV0XHNlZXRpdGxlPVxweUBzZWV0aXRsZQotICBcbGV0XHNlZXVybD1ccHlAc2VldXJsCi0gIFxsZXRcc2VlbGluaz1ccHlAc2VlbGluawotfXtccGFyfQotCi0lIEFsbG93IHRoZSBQeXRob24gcmVsZWFzZSBudW1iZXIgdG8gYmUgc3BlY2lmaWVkIGluZGVwZW5kZW50bHkgb2YgdGhlCi0lIFxkYXRle30uICBUaGlzIGFsbG93cyB0aGUgZGF0ZSB0byByZWZsZWN0IHRoZSBkb2N1bWVudCdzIGRhdGUgYW5kCi0lIHJlbGVhc2UgdG8gc3BlY2lmeSB0aGUgUHl0aG9uIHJlbGVhc2UgdGhhdCBpcyBkb2N1bWVudGVkLgotJQotXG5ld2NvbW1hbmR7XHB5QHJlbGVhc2V9e30KLVxuZXdjb21tYW5ke1x2ZXJzaW9ufXt9Ci1cbmV3Y29tbWFuZHtcc2hvcnR2ZXJzaW9ufXt9Ci1cbmV3Y29tbWFuZHtccmVsZWFzZWluZm99e30KLVxuZXdjb21tYW5ke1xyZWxlYXNlbmFtZX17UmVsZWFzZX0KLVxuZXdjb21tYW5ke1xyZWxlYXNlfVsxXXslCi0gIFxyZW5ld2NvbW1hbmR7XHB5QHJlbGVhc2V9e1xyZWxlYXNlbmFtZVxzcGFjZVx2ZXJzaW9ufSUKLSAgXHJlbmV3Y29tbWFuZHtcdmVyc2lvbn17IzF9fQotXG5ld2NvbW1hbmR7XHNldHNob3J0dmVyc2lvbn1bMV17JQotICBccmVuZXdjb21tYW5ke1xzaG9ydHZlcnNpb259eyMxfX0KLVxuZXdjb21tYW5ke1xzZXRyZWxlYXNlaW5mb31bMV17JQotICBccmVuZXdjb21tYW5ke1xyZWxlYXNlaW5mb317IzF9fQotCi0lIEFsbG93IHNwZWNpZmljYXRpb24gb2YgdGhlIGF1dGhvcidzIGFkZHJlc3Mgc2VwYXJhdGVseSBmcm9tIHRoZQotJSBhdXRob3IncyBuYW1lLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBmb3JtYXQgdGhlbSBkaWZmZXJlbnRseSwgd2hpY2gKLSUgaXMgYSBnb29kIHRoaW5nLgotJQotXG5ld2NvbW1hbmR7XHB5QGF1dGhvcmFkZHJlc3N9e30KLVxuZXdjb21tYW5ke1xhdXRob3JhZGRyZXNzfVsxXXtccmVuZXdjb21tYW5ke1xweUBhdXRob3JhZGRyZXNzfXsjMX19Ci1cbGV0XGRldmVsb3BlcnNhZGRyZXNzPVxhdXRob3JhZGRyZXNzCi1cbGV0XGRldmVsb3Blcj1cYXV0aG9yCi1cbGV0XGRldmVsb3BlcnM9XGF1dGhvcgotCi0lIFRoaXMgc2V0cyB1cCB0aGUgZmFuY3kgY2hhcHRlciBoZWFkaW5ncyB0aGF0IG1ha2UgdGhlIGRvY3VtZW50cyBsb29rCi0lIGF0IGxlYXN0IGEgbGl0dGxlIGJldHRlciB0aGFuIHRoZSB1c3VhbCBMYVRlWCBvdXRwdXQuCi0lCi1cQGlmdW5kZWZpbmVke0NoVGl0bGVWYXJ9e317Ci0gIFxDaE5hbWVWYXJ7XHJhZ2dlZGxlZnRcbm9ybWFsc2l6ZVxweUBIZWFkZXJGYW1pbHl9Ci0gIFxDaE51bVZhcntccmFnZ2VkbGVmdCBcYmZzZXJpZXNcTGFyZ2VccHlASGVhZGVyRmFtaWx5fQotICBcQ2hUaXRsZVZhcntccmFnZ2VkbGVmdCBccm1cSHVnZVxweUBIZWFkZXJGYW1pbHl9Ci0gICUgVGhpcyBjcmVhdGVzIGNoYXB0ZXIgaGVhZHMgd2l0aG91dCB0aGUgbGVhZGluZyBcdnNwYWNlKnt9OgotICBcZGVmXEBtYWtlY2hhcHRlcmhlYWQjMXslCi0gICAge1xwYXJpbmRlbnQgXHpAIFxyYWdnZWRyaWdodCBcbm9ybWFsZm9udAotICAgICAgXGlmbnVtIFxjQHNlY251bWRlcHRoID5cbUBuZQotICAgICAgICBcRE9DSAotICAgICAgXGZpCi0gICAgICBcaW50ZXJsaW5lcGVuYWx0eVxATQotICAgICAgXERPVEl7IzF9Ci0gICAgfQotICB9Ci19Ci0KLQotJSBEZWZpbml0aW9uIGxpc3RzOyByZXF1ZXN0ZWQgYnkgQU1LIGZvciBIT1dUTyBkb2N1bWVudHMuICBQcm9iYWJseSB1c2VmdWwKLSUgZWxzZXdoZXJlIGFzIHdlbGwsIHNvIGtlZXAgaW4gaW4gdGhlIGdlbmVyYWwgc3R5bGUgc3VwcG9ydC4KLSUKLVxuZXdlbnZpcm9ubWVudHtkZWZpbml0aW9uc317JQotICBcYmVnaW57ZGVzY3JpcHRpb259JQotICBcZGVmXHRlcm0jIzF7XGl0ZW1bIyMxXVxtYm94e31cXCpbMG1tXX0KLX17JQotICBcZW5ke2Rlc2NyaXB0aW9ufSUKLX0KLQotJSBUZWxsIFRlWCBhYm91dCBwYXRob2xvZ2ljYWwgaHlwaGVuYXRpb24gY2FzZXM6Ci1caHlwaGVuYXRpb257QmFzZS1IVFRQLVJlLXF1ZXN0LUhhbmQtbGVyfQpkaWZmIC0tZ2l0IGEvRG9jL3RleGlucHV0cy91bmRlcnNjb3JlLnN0eSBiL0RvYy90ZXhpbnB1dHMvdW5kZXJzY29yZS5zdHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNzRiMzkuLjAwMDAwMDAKLS0tIGEvRG9jL3RleGlucHV0cy91bmRlcnNjb3JlLnN0eQorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0lIHVuZGVyc2NvcmUuc3R5ICAgICAxMi1PY3QtMjAwMSAgIERvbmFsZCBBcnNlbmVhdSAgIGFzbmRAdHJpdW1mLmNhCi0lIE1ha2UgdGhlICJfIiBjaGFyYWN0ZXIgcHJpbnQgYXMgIlx0ZXh0dW5kZXJzY29yZSIgaW4gdGV4dC4KLSUgQ29weXJpZ2h0IDE5OTgsMjAwMSBEb25hbGQgQXJzZW5lYXU7ICBEaXN0cmlidXRlIGZyZWVseSBpZiB1bmNoYW5nZWQuCi0lIEluc3RydWN0aW9ucyBmb2xsb3cgYWZ0ZXIgdGhlIGRlZmluaXRpb25zLgotCi1cUHJvdmlkZXNQYWNrYWdle3VuZGVyc2NvcmV9WzIwMDEvMTAvMTJdCi0KLVxiZWdpbmdyb3VwCi0gXGNhdGNvZGVgXF89XGFjdGl2ZQotIFxnZGVmX3slIFxyZWxheCAlIE5vIHJlbGF4IGdpdmVzIGEgc21hbGwgdnVsbmVyYWJpbGl0eSBpbiBhbGlnbm1lbnRzCi0gICBcaWZ4XGlmQHNhZmVAYWN0aXZlc1xpZnRydWUgJSBtdXN0IGJlIG91dGVybW9zdCB0ZXN0IQotICAgICAgXHN0cmluZ18lCi0gICBcZWxzZQotICAgICAgXGlmeFxwcm90ZWN0XEB0eXBlc2V0QHByb3RlY3QKLSAgICAgICAgIFxpZm1tb2RlIFxzYiBcZWxzZSBcQnJlYWthYmxlVW5kZXJzY29yZSBcZmkKLSAgICAgIFxlbHNlCi0gICAgICAgICBcaWZ4XHByb3RlY3RcQHVuZXhwYW5kYWJsZUBwcm90ZWN0IFxub2V4cGFuZF8lCi0gICAgICAgICBcZWxzZSBccHJvdGVjdF8lCi0gICAgICBcZmlcZmkKLSAgICBcZml9Ci1cZW5kZ3JvdXAKLQotJSBBdCBiZWdpbjogc2V0IGNhdGNvZGU7IGZpeCBcbG9uZyBcdHRkZWZhdWx0IHNvIEkgY2FuIHVzZSBpdCBpbiBjb21wYXJpc29uczsgCi1cQXRCZWdpbkRvY3VtZW50eyUKLSAge1xpbW1lZGlhdGVcd3JpdGVcQGF1eG91dHtcY2F0Y29kZVxudW1iZXJcc3RyaW5nYFxfIFxzdHJpbmdcYWN0aXZlfX0lCi0gIFxjYXRjb2RlXHN0cmluZ2BcX1xzdHJpbmc9XGFjdGl2ZQotICBcZWRlZlx0dGRlZmF1bHR7XHR0ZGVmYXVsdH0lCi19Ci0KLVxuZXdjb21tYW5ke1xCcmVha2FibGVVbmRlcnNjb3JlfXtcbGVhdmV2bW9kZVxub2JyZWFrXGhza2lwXHpAc2tpcAotIFxpZnhcZkBmYW1pbHlcdHRkZWZhdWx0IFxzdHJpbmdfXGVsc2UgXHRleHR1bmRlcnNjb3JlXGZpCi0gXHVzY0BkaXNjaHlwaFxub2JyZWFrXGhza2lwXHpAc2tpcH0KLQotXERlY2xhcmVSb2J1c3RDb21tYW5ke1xffXslCi0gIFxpZm1tb2RlIFxuZnNzQHRleHR7XHRleHR1bmRlcnNjb3JlfVxlbHNlIFxCcmVha2FibGVVbmRlcnNjb3JlIFxmaX0KLQotXGxldFx1c2NAZGlzY2h5cGhcQGRpc2NoeXBoCi1cRGVjbGFyZU9wdGlvbntub2h5cGhlbn17XGRlZlx1c2NAZGlzY2h5cGh7XGRpc2NyZXRpb25hcnl7fXt9e319fQotXERlY2xhcmVPcHRpb257c3RyaW5nc317XGNhdGNvZGVgXF89XGFjdGl2ZX0KLQotXFByb2Nlc3NPcHRpb25zCi1caWZudW1cY2F0Y29kZWBcXz1cYWN0aXZlXGVsc2UgXGVuZGlucHV0IFxmaQotCi0lJSUlJSUlJSAgIFJlZGVmaW5lIGNvbW1hbmRzIHRoYXQgdXNlIGNoYXJhY3RlciBzdHJpbmdzICAgJSUlJSUlJSUKLQotXEBpZnVuZGVmaW5lZHtVbmRlcnNjb3JlQ29tbWFuZHN9e1xsZXRcVW5kZXJzY29yZUNvbW1hbmRzXEBlbXB0eX17fQotXGV4cGFuZGFmdGVyXGRlZlxleHBhbmRhZnRlclxVbmRlcnNjb3JlQ29tbWFuZHNcZXhwYW5kYWZ0ZXJ7JQotICBcVW5kZXJzY29yZUNvbW1hbmRzCi0gIFxkb1xpbmNsdWRlIFxkb1xpbmNsdWRlb25seQotICBcZG9cQGlucHV0IFxkb1xAaWlucHV0IFxkb1xJbnB1dElmRmlsZUV4aXN0cwotICBcZG9ccmVmIFxkb1xwYWdlcmVmIFxkb1xuZXdsYWJlbAotICBcZG9cYmliaXRlbSBcZG9cQGJpYml0ZW0gXGRvXGNpdGUgXGRvXG5vY2l0ZSBcZG9cYmliY2l0ZQotfQotCi0lIE1hY3JvIHRvIHJlZGVmaW5lIGEgbWFjcm8gdG8gcHJlLXByb2Nlc3MgaXRzIHN0cmluZyBhcmd1bWVudAotJSB3aXRoIFxwcm90ZWN0IC0+IFxzdHJpbmcuCi1cZGVmXGRvIzF7JSBBdm9pZCBkb3VibGUgcHJvY2Vzc2luZyBpZiB1c2VyIGluY2x1ZGVzIGNvbW1hbmQgdHdpY2UhCi0gXEBpZnVuZGVmaW5lZHtVU1xzdHJpbmdfXGV4cGFuZGFmdGVyXEBnb2JibGVcc3RyaW5nIzF9eyUKLSAgIFxlZGVmXEB0ZW1wYntcbWVhbmluZyMxfSUgQ2hlY2sgaWYgbWFjcm8gaXMganVzdCBhIHByb3RlY3Rpb24gc2hlbGwuLi4KLSAgIFxkZWZcQHRlbXBje1xwcm90ZWN0fSUKLSAgIFxlZGVmXEB0ZW1wY3tcbWVhbmluZ1xAdGVtcGNcc3RyaW5nIzFcc3BhY2Vcc3BhY2V9JQotICAgXGlmeFxAdGVtcGJcQHRlbXBjICUganVzdCBhIHNoZWxsOiBob29rIGludG8gdGhlIHByb3RlY3RlZCBpbm5lciBjb21tYW5kCi0gICAgIFxleHBhbmRhZnRlclxkbwotICAgICAgIFxjc25hbWUgXGV4cGFuZGFmdGVyXEBnb2JibGVcc3RyaW5nIzEgXGV4cGFuZGFmdGVyXGVuZGNzbmFtZQotICAgXGVsc2UgJSBDaGVjayBpZiBtYWNybyB0YWtlcyBhbiBvcHRpb25hbCBhcmd1bWVudAotICAgICBcZGVmXEB0ZW1wY3tcQGlmbmV4dGNoYXJbfSUKLSAgICAgXGVkZWZcQHRlbXBhe1xkZWZcbm9leHBhbmRcQHRlbXBhIyMjIzFcbWVhbmluZ1xAdGVtcGN9JQotICAgICBcQHRlbXBhIyMyIyMzXEB0ZW1wYXsjIzJccmVsYXh9JQotICAgICBcZWRlZlxAdGVtcGJ7XG1lYW5pbmcjMVxtZWFuaW5nXEB0ZW1wY30lCi0gICAgIFxlZGVmXEB0ZW1wY3tcbm9leHBhbmRcQHRlbXBkIFxjc25hbWUKLSAgICAgICAgVVNcc3RyaW5nX1xleHBhbmRhZnRlclxAZ29iYmxlXHN0cmluZyMxXGVuZGNzbmFtZX0lCi0gICAgIFxpZiBcZXhwYW5kYWZ0ZXJcQHRlbXBhXEB0ZW1wYiBccmVsYXggMTJcQHRlbXBhICUgdGhlbiBubyBvcHRpb25hbCBhcmcKLSAgICAgICBcQHRlbXBjICMxXFVTQHByb3QKLSAgICAgXGVsc2UgICUgVGhlcmUgaXMgb3B0aW9uYWwgYXJnCi0gICAgICAgXEB0ZW1wYyAjMVxVU0Bwcm90b3B0Ci0gICAgIFxmaQotICAgXGZpCi0gfXt9fQotCi1cZGVmXEB0ZW1wZCMxIzIjM3tcbGV0IzEjMlxkZWYjMnsjMyMxfX0KLQotXGRlZlxVU0Bwcm90IzEjMntcbGV0XEBAcHJvdGVjdFxwcm90ZWN0IFxsZXRccHJvdGVjdFxzdHJpbmcKLSAgXGVkZWZcVVNAdGVtcCMjMXsjIzF7IzJ9fVxyZXN0b3JlQHByb3RlY3RcVVNAdGVtcCMxfQotXGRlZlxVU0Bwcm90b3B0IzF7XEBpZm5leHRjaGFyW3tcVVNAcHJvdGFyZyMxfXtcVVNAcHJvdCMxfX0KLVxkZWZcVVNAcHJvdGFyZyAjMVsjMl17XFVTQHByb3R7eyMxWyMyXX19fQotCi1cVW5kZXJzY29yZUNvbW1hbmRzCi1cbGV0XGRvXHJlbGF4IFxsZXRcQHRlbXBkXHJlbGF4ICAlIHVuLWRvCi0KLSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCi0KLVxlbmRpbnB1dAotCi11bmRlcnNjb3JlLnN0eSAgICAxMi1PY3QtMjAwMSAgRG9uYWxkIEFyc2VuZWF1Ci0KLUZlYXR1cmVzOgotfn5+fn5+fn5+Ci1cXyBwcmludHMgYW4gdW5kZXJzY29yZSBzbyB0aGF0IHRoZSBoeXBoZW5hdGlvbiBvZiBjb25zdGl0dWVudCB3b3JkcwotaXMgbm90IGFmZmVjdGVkIGFuZCBoeXBoZW5hdGlvbiBpcyBwZXJtaXR0ZWQgYWZ0ZXIgdGhlIHVuZGVyc2NvcmUuCi1Gb3IgZXhhbXBsZSwgImNvbXBvdW5kXF9mcmFjdHVyZSIgaHlwaGVuYXRlcyBhcyBjb20tIHBvdW5kXy0gZnJhYy0gdHVyZS4KLUlmIHlvdSBwcmVmZXIgdGhlIHVuZGVyc2NvcmUgdG8gYnJlYWsgd2l0aG91dCBhIGh5cGhlbiAoYnV0IHN0aWxsIHdpdGggCi10aGUgc2FtZSBydWxlcyBmb3IgZXhwbGljaXQgaHlwaGVuLWJyZWFrcykgdGhlbiB1c2UgdGhlIFtub2h5cGhlbl0KLXBhY2thZ2Ugb3B0aW9uLgotCi1BIHNpbXBsZSBfICBhY3RzIGp1c3QgbGlrZSBcXyBpbiB0ZXh0IG1vZGUsIGJ1dCBtYWtlcyBhIHN1YnNjcmlwdCBpbiAKLW1hdGggbW9kZTogYWN0aXZhdGlvbl9lbmVyZ3kgJEVfYSQKLQotQm90aCBmb3JtcyB1c2UgYW4gdW5kZXJzY29yZSBjaGFyYWN0ZXIgaWYgdGhlIGZvbnQgZW5jb2RpbmcgY29udGFpbnMKLW9uZSAoZS5nLiwgIlx1c2VwYWNrYWdlW1QxXXtmb250ZW5jfSIgb3IgdHlwZXdyaXRlciBmb250cyBpbiBhbnkgZW5jb2RpbmcpLAotYnV0IHRoZXkgdXNlIGEgcnVsZSBpZiB0aGUgdGhlcmUgaXMgbm8gcHJvcGVyIGNoYXJhY3Rlci4KLQotRGVmaWNpZW5jaWVzOgotfn5+fn5+fn5+fn5+fgotVGhlIHNraXBzIGFuZCBwZW5hbHRpZXMgcnVpbiBhbnkga2VybmluZyB3aXRoIHRoZSB1bmRlcnNjb3JlIGNoYXJhY3RlcgotKHdoZW4gYSBjaGFyYWN0ZXIgaXMgdXNlZCkuICBIb3dldmVyLCB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgbXVjaCwgaWYKLWFueSwgc3VjaCBrZXJuaW5nIGluIHRoZSBlYyBmb250cywgYW5kIHRoZXJlIGlzIG5ldmVyIGFueSBrZXJuaW5nIHdpdGgKLWEgcnVsZS4KLQotWW91IG11c3QgYXZvaWQgIl8iIGluIGZpbGUgbmFtZXMgYW5kIGluIGNpdGUgb3IgcmVmIHRhZ3MsIG9yIHlvdSBtdXN0IHVzZSAKLXRoZSBiYWJlbCBwYWNrYWdlLCB3aXRoIGl0cyBhY3RpdmUtY2hhcmFjdGVyIGNvbnRyb2xzLCBvciB5b3UgbXVzdCBnaXZlIAotdGhlIFtzdHJpbmdzXSBvcHRpb24sIHdoaWNoIGF0dGVtcHRzIHRvIHJlZGVmaW5lIHNldmVyYWwgY29tbWFuZHMgKGFuZCAKLW1heSBub3Qgd29yayBwZXJmZWN0bHkpLiAgRXZlbiB3aXRob3V0IHRoZSBbc3RyaW5nc10gb3B0aW9uIG9yIGJhYmVsLCB5b3UgCi1jYW4gdXNlIG9jY2FzaW9uYWwgdW5kZXJzY29yZXMgbGlrZTogIlxpbmNsdWRle2ZpbGVcc3RyaW5nX25hbWV9Ii4KLQotT3B0aW9uOiBbc3RyaW5nc10KLX5+fn5+fn5+fn5+fn5+fn5+Ci1UaGUgZGVmYXVsdCBvcGVyYXRpb24gaXMgcXVpdGUgc2ltcGxlIGFuZCBuZWVkcyBubyBjdXN0b21pemF0aW9uOyBidXQKLXlvdSBtdXN0IGF2b2lkIHVzaW5nICJfIiBpbiBhbnkgcGxhY2Ugd2hlcmUgTGFUZVggdXNlcyBhbiBhcmd1bWVudCBhcwotYSBzdHJpbmcgb2YgY2hhcmFjdGVycyBmb3Igc29tZSBjb250cm9sIGZ1bmN0aW9uIG9yIGFzIGEgbmFtZS4gIFRoZXNlCi1pbmNsdWRlIHRoZSB0YWdzIGZvciBcY2l0ZSBhbmQgXHJlZiwgZmlsZSBuYW1lcyBmb3IgXGlucHV0LCBcaW5jbHVkZSwKLWFuZCBcaW5jbHVkZWdyYXBoaWNzLCBlbnZpcm9ubWVudCBuYW1lcywgY291bnRlciBuYW1lcywgYW5kIHBsYWNlbWVudAotcGFyYW1ldGVycyAobGlrZSAiW3RdIikuICBUaGUgcHJvYmxlbSB3aXRoIHRoZXNlIGNvbnRleHRzIGlzIHRoYXQgdGhleQotYXJlIGBtb3ZpbmcgYXJndW1lbnRzJyBidXQgTGFUZVggZG9lcyBub3QgYHN3aXRjaCBvbicgdGhlIFxwcm90ZWN0Ci1tZWNoYW5pc20gZm9yIHRoZW0uCi0KLUlmIHlvdSBuZWVkIHRvIHVzZSB0aGUgdW5kZXJzY29yZSBjaGFyYWN0ZXIgaW4gdGhlc2UgcGxhY2VzLCB0aGUgcGFja2FnZQotb3B0aW9uIFtzdHJpbmdzXSBpcyBwcm92aWRlZCB0byByZWRlZmluZSBjb21tYW5kcyB0YWtpbmcgYSBzdHJpbmcgYXJndW1lbnQKLXNvIHRoYXQgdGhlIGFyZ3VtZW50IGlzIHByb3RlY3RlZCAod2l0aCBccHJvdGVjdCAtPiBcc3RyaW5nKS4gIFRoZSBsaXN0Ci1vZiBjb21tYW5kcyBpcyBnaXZlbiBpbiAiXFVuZGVyc2NvcmVDb21tYW5kcyIsIHdpdGggIlxkbyIgYmVmb3JlIGVhY2gsCi1jb3ZlcmluZyBcY2l0ZSwgXHJlZiwgXGlucHV0LCBhbmQgdGhlaXIgdmFyaWFudHMuICBOb3QgaW5jbHVkZWQgYXJlIG1hbnkKLWNvbW1hbmRzIHJlZ2FyZGluZyBmb250IG5hbWVzLCBldmVyeXRoaW5nIHdpdGggY291bnRlciBuYW1lcywgZW52aXJvbm1lbnQKLW5hbWVzLCBwYWdlIHN0eWxlcywgYW5kIHZlcnNpb25zIG9mIFxyZWYgYW5kIFxjaXRlIGRlZmluZWQgYnkgZXh0ZXJuYWwKLXBhY2thZ2VzIChlLmcuIFx2cmVmIGFuZCBcY2l0ZXllYXIpLgotCi1Zb3UgY2FuIGFkZCB0byB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgY29tbWFuZHMgYnkgZGVmaW5pbmcgXFVuZGVyc2NvcmVDb21tYW5kcwotYmVmb3JlIGxvYWRpbmcgdGhpcyBwYWNrYWdlOyBlLmcuCi0KLSAgIFx1c2VwYWNrYWdle2NoaWNhZ299Ci0gICBcbmV3Y29tbWFuZHtcVW5kZXJzY29yZUNvbW1hbmRzfXslICAgKFxjaXRlIGFscmVhZHkgZG9uZSkKLSAgICAgXGRvXGNpdGVOUCBcZG9cY2l0ZUEgXGRvXGNpdGVBTlAgXGRvXGNpdGVOIFxkb1xzaG9ydGNpdGUKLSAgICAgXGRvXHNob3J0Y2l0ZU5QIFxkb1xzaG9ydGNpdGVBIFxkb1xzaG9ydGNpdGVBTlAgXGRvXHNob3J0Y2l0ZU4KLSAgICAgXGRvXGNpdGV5ZWFyIFxkb1xjaXRleWVhck5QCi0gICB9Ci0gICBcdXNlcGFja2FnZVtzdHJpbmdzXXt1bmRlcnNjb3JlfQotCi1Ob3QgYWxsIGNvbW1hbmRzIGNhbiBiZSBzdXBwb3J0ZWQgdGhpcyB3YXkhICBPbmx5IGNvbW1hbmRzIHRoYXQgdGFrZSBhCi1zdHJpbmcgYXJndW1lbnQgKmZpcnN0KiBjYW4gYmUgcHJvdGVjdGVkLiAgT25lIG9wdGlvbmFsIGFyZ3VtZW50IGJlZm9yZQotdGhlIHN0cmluZyBhcmd1bWVudCBpcyBhbHNvIHBlcm1pdHRlZCwgYXMgZXhlbXBsaWZpZWQgYnkgXGNpdGU6IGJvdGgKLVxjaXRle3RhZ3N9IGFuZCBcY2l0ZVt0ZXh0XXt0YWdzfSBhcmUgYWxsb3dlZC4gIEEgY29tbWFuZCBsaWtlCi1cQGFkZHRvcmVzZXQgd2hpY2ggdGFrZXMgdHdvIGNvdW50ZXIgbmFtZXMgYXMgYXJndW1lbnRzIGNvdWxkIG5vdAotYmUgcHJvdGVjdGVkIGJ5IGFkZGluZyBpdCB0byBcVW5kZXJzY29yZUNvbW1hbmRzLgotCi0hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCi0hISBXaGVuIHlvdSB1c2UgdGhlIFtzdHJpbmdzXSBvcHRpb24sIHlvdSBtdXN0IGxvYWQgdGhpcyBwYWNrYWdlICEhCi0hISBsYXN0IChvciBuZWFybHkgbGFzdCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEhCi0hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCi0KLVRoZXJlIGFyZSB0d28gcmVhc29uczogMSkgVGhlIHJlZGVmaW5pdGlvbnMgZG9uZSBmb3IgcHJvdGVjdGlvbiBtdXN0IGNvbWUKLWFmdGVyIG90aGVyIHBhY2thZ2VzIGRlZmluZSB0aGVpciBjdXN0b21pemVkIHZlcnNpb25zIG9mIHRob3NlIGNvbW1hbmRzLgotMikgVGhlIFtzdHJpbmdzXSBvcHRpb24gcmVxdWlyZXMgdGhlIF8gY2hhcmFjdGVyIHRvIGJlIGFjdGl2YXRlZCBpbW1lZGlhdGVseQotaW4gb3JkZXIgZm9yIHRoZSBjaXRlIGFuZCByZWYgdGFncyB0byBiZSByZWFkIHByb3Blcmx5IGZyb20gdGhlIC5hdXggZmlsZQotYXMgcGxhaW4gc3RyaW5ncywgYW5kIHRoaXMgY2F0Y29kZSBzZXR0aW5nIG1pZ2h0IGRpc3J1cHQgb3RoZXIgcGFja2FnZXMuCi0KLVRoZSBiYWJlbCBwYWNrYWdlIGltcGxlbWVudHMgYSBwcm90ZWN0aW9uIG1lY2hhbmlzbSBmb3IgbWFueSBjb21tYW5kcywKLWFuZCB3aWxsIGJlIGEgY29tcGxldGUgZml4IGZvciBtb3N0IGRvY3VtZW50cyB3aXRob3V0IHRoZSBbc3RyaW5nc10gb3B0aW9uLgotTWFueSBhZGQtb24gcGFja2FnZXMgYXJlIGNvbXBhdGlibGUgd2l0aCBiYWJlbCwgc28gdGhleSB3aWxsIGdldCB0aGUKLXN0cmluZ3MgcHJvdGVjdGlvbiBhbHNvLiAgSG93ZXZlciwgdGhlcmUgYXJlIHNldmVyYWwgY29tbWFuZHMgdGhhdCBhcmUgCi1ub3QgY292ZXJlZCBieSBiYWJlbCwgYnV0IGNhbiBlYXNpbHkgYmUgc3VwcG9ydGVkIGJ5IHRoZSBbc3RyaW5nc10gYW5kIAotXFVuZGVyc2NvcmVDb21tYW5kcyBtZWNoYW5pc20uICBCZXdhcmUgdGhhdCB1c2luZyBib3RoIFtzdHJpbmdzXSBhbmQgYmFiZWwgCi1tYXkgbGVhZCB0byBjb25mbGljdHMsIGJ1dCBkb2VzIGFwcGVhciB0byB3b3JrIChsb2FkIGJhYmVsIGxhc3QpLgotCi1JbXBsZW1lbnRhdGlvbiBOb3RlczoKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fgotVGhlIGZpcnN0IHNldHRpbmcgb2YgIl8iIHRvIGJlIGFuIGFjdGl2ZSBjaGFyYWN0ZXIgaXMgcGVyZm9ybWVkIGluIGEgbG9jYWwKLWdyb3VwIHNvIGFzIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBvdGhlciBwYWNrYWdlcy4gIFRoZSBjYXRjb2RlIHNldHRpbmcKLWlzIHJlcGVhdGVkIHdpdGggXEF0QmVnaW5Eb2N1bWVudCBzbyB0aGUgZGVmaW5pdGlvbiBpcyBpbiBlZmZlY3QgZm9yIHRoZQotdGV4dC4gIEhvd2V2ZXIsIHRoZSBjYXRjb2RlIHNldHRpbmcgaXMgcmVwZWF0ZWQgaW1tZWRpYXRlbHkgd2hlbiB0aGUKLVtzdHJpbmdzXSBvcHRpb24gaXMgZGV0ZWN0ZWQuCi0KLVRoZSBkZWZpbml0aW9uIG9mIHRoZSBhY3RpdmUgIl8iIGlzIGVzc2VudGlhbGx5OgotICAgICAgIFxpZm1tb2RlIFxzYiBcZWxzZSBcQnJlYWthYmxlVW5kZXJzY29yZSBcZmkKLXdoZXJlICJcc2IiIHJldGFpbnMgdGhlIG5vcm1hbCBzdWJzY3JpcHQgbWVhbmluZyBvZiAiXyIgYW5kIHdoZXJlCi0iXEJyZWFrYWJsZVVuZGVyc2NvcmUiIGlzIGVzc2VudGlhbGx5ICJcXyIuICBUaGUgcmVzdCBvZiB0aGUgZGVmaW5pdGlvbgotaGFuZGxlcyB0aGUgIlxwcm90ZWN0ImlvbiB3aXRob3V0IGNhdXNpbmcgXHJlbGF4IHRvIGJlIGluc2VydGVkIGJlZm9yZQotdGhlIGNoYXJhY3Rlci4KLQotXEJyZWFrYWJsZVVuZGVyc2NvcmUgdXNlcyAiXG5vYnJlYWtcaHNraXBcekBza2lwIiB0byBzZXBhcmF0ZSB0aGUKLXVuZGVyc2NvcmUgZnJvbSBzdXJyb3VuZGluZyB3b3JkcywgdGh1cyBhbGxvd2luZyBUZVggdG8gaHlwaGVuYXRlIHRoZW0sCi1idXQgcHJldmVudGluZyBmcmVlIGJyZWFrcyBhcm91bmQgdGhlIHVuZGVyc2NvcmUuIE5leHQsIGl0IGNoZWNrcyB0aGUKLWN1cnJlbnQgZm9udCBmYW1pbHksIGFuZCB1c2VzIHRoZSB1bmRlcnNjb3JlIGNoYXJhY3RlciBmcm9tIHR0IGZvbnRzIG9yCi1vdGhlcndpc2UgXHRleHR1bmRlcnNjb3JlICh3aGljaCBpcyBhIGNoYXJhY3RlciBvciBydWxlIGRlcGVuZGluZyBvbgotdGhlIGZvbnQgZW5jb2RpbmcpLiAgQWZ0ZXIgdGhlIHVuZGVyc2NvcmUsIGl0IGluc2VydHMgYSBkaXNjcmV0aW9uYXJ5Ci1oeXBoZW5hdGlvbiBwb2ludCBhcyAiXHVzY0BkaXNjaHlwaCIsIHdoaWNoIGlzIHVzdWFsbHkganVzdCAiXC0iCi1leGNlcHQgdGhhdCBpdCBzdGlsbCB3b3JrcyBpbiB0aGUgdGFiYmluZyBlbnZpcm9ubWVudCwgYWx0aG91Z2ggaXQKLXdpbGwgZ2l2ZSAiXGRpc2NyZXRpb25hcnl7fXt9e30iIHVuZGVyIHRoZSBbbm9oeXBoZW5dIG9wdGlvbi4gIEFmdGVyCi10aGF0LCBhbm90aGVyIHBpZWNlIG9mIG5vbi1icmVha2luZyBpbnRlcndvcmQgZ2x1ZSBpcyBpbnNlcnRlZC4gCi1PcmRpbmFyaWx5LCB0aGUgY29tcGFyaXNvbiAiXGlmeFxmQGZhbWlseVx0dGRlZmF1bHQiIHdpbGwgYWx3YXlzIGZhaWwgCi1iZWNhdXNlIFx0dGRlZmF1bHQgaXMgYGxvbmcnIHdoZXJlIFxmQGZhbWlseSBpcyBub3QgKGJvb29vIGhpc3NzKSwgYnV0IAotXHR0ZGVmYXVsdCBpcyByZWRlZmluZWQgdG8gYmUgbm9uLWxvbmcgYnkgIlxBdEJlZ2luRG9jdW1lbnQiLgotCi1UaGUgIlxfIiBjb21tYW5kIGlzIHRoZW4gZGVmaW5lZCB0byB1c2UgIlxCcmVha2FibGVVbmRlcnNjb3JlIi4KLQotSWYgdGhlIFtzdHJpbmdzXSBvcHRpb24gaXMgbm90IGdpdmVuLCB0aGVuIHRoYXQgaXMgYWxsIQotCi1VbmRlciB0aGUgW3N0cmluZ3NdIG9wdGlvbiwgdGhlIGxpc3Qgb2Ygc3BlY2lhbCBjb21tYW5kcyBpcyBwcm9jZXNzZWQgdG86Ci0tIHJldGFpbiB0aGUgb3JpZ2luYWwgY29tbWFuZCBhcyBcVVNfY29tbWFuZCAoXFVTX3JlZikKLS0gcmVkZWZpbmUgdGhlIGNvbW1hbmQgYXMgXFVTQHByb3RcVVNfY29tbWFuZCBmb3Igb3JkaW5hcnkgY29tbWFuZHMKLSAgKFxyZWYgLT4gXFVTQHByb3RcVVNfcmVmKSBvciBhcyBcVVNAcHJvdG9wdFxVU19jb21tYW5kIHdoZW4gYW4gb3B0aW9uYWwKLSAgYXJndW1lbnQgaXMgcG9zc2libGUgKFxiaWJpdGVtIC0+IFxVU0Bwcm90b3B0XFVTX2JpYml0ZW0pLgotLSBzZWxmLXByb3RlY3RpbmcgY29tbWFuZHMgKFxjaXRlKSByZXRhaW4gdGhlaXIgc2VsZi1wcm90ZWN0aW9uLgotRGlhZ25vc2luZyB0aGUgc3RhdGUgb2YgdGhlIHByZS1leGlzdGluZyBjb21tYW5kIGlzIGRvbmUgYnkgcGFpbmZ1bAotY29udG9ydGlvbnMgaW52b2x2aW5nIFxtZWFuaW5nLgotCi1cVVNAcHJvdCBhbmQgXFVTQHByb3RvcHQgcmVhZCB0aGUgYXJndW1lbnQsIHByb2Nlc3MgaXQgd2l0aCBccHJvdGVjdAotZW5hYmxlZCwgdGhlbiBpbnZva2UgdGhlIHNhdmVkIFxVU19jb21tYW5kLgotCi1Nb2RpZmljYXRpb25zOgotfn5+fn5+fn5+fn5+fn4KLTEyLU9jdC0yMDAxICBCYWJlbCAoc2FmZUBhY3RpdmVzKSBjb21wYXRpYmlsaXR5IGFuZCBbbm9oeXBoZW5dIG9wdGlvbi4KLQotVGVzdCBmaWxlIGludGVncml0eTogIEFTQ0lJIDMyLTU3LCA1OC0xMjY6ICAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ci06Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4KZGlmZiAtLWdpdCBhL0RvYy90b29scy9hbm5vLWFwaS5weSBiL0RvYy90b29scy9hbm5vLWFwaS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjRiN2Y3OS4uMDAwMDAwMAotLS0gYS9Eb2MvdG9vbHMvYW5uby1hcGkucHkKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uCi0iIiJBZGQgcmVmZXJlbmNlIGNvdW50IGFubm90YXRpb25zIHRvIHRoZSBQeXRob24vQyBBUEkgUmVmZXJlbmNlLiIiIgotX192ZXJzaW9uX18gPSAnJFJldmlzaW9uJCcKLQotaW1wb3J0IGdldG9wdAotaW1wb3J0IG9zCi1pbXBvcnQgc3lzCi0KLWltcG9ydCByZWZjb3VudHMKLQotCi1QUkVGSVhfMSA9IHIiXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXsiCi1QUkVGSVhfMiA9IHIiXGJlZ2lue2NmdW5jZGVzY317UHlWYXJPYmplY3QqfXsiCi0KLQotZGVmIG1haW4oKToKLSAgICByY2ZpbGUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKHJlZmNvdW50cy5fX2ZpbGVfXyksIG9zLnBhcmRpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImFwaSIsICJyZWZjb3VudHMuZGF0IikKLSAgICBvdXRmaWxlID0gIi0iCi0gICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAibzpyOiIsIFsib3V0cHV0PSIsICJyZWZjb3VudHM9Il0pCi0gICAgZm9yIG9wdCwgYXJnIGluIG9wdHM6Ci0gICAgICAgIGlmIG9wdCBpbiAoIi1vIiwgIi0tb3V0cHV0Iik6Ci0gICAgICAgICAgICBvdXRmaWxlID0gYXJnCi0gICAgICAgIGVsaWYgb3B0IGluICgiLXIiLCAiLS1yZWZjb3VudHMiKToKLSAgICAgICAgICAgIHJjZmlsZSA9IGFyZwotICAgIHJjZGljdCA9IHJlZmNvdW50cy5sb2FkKHJjZmlsZSkKLSAgICBpZiBvdXRmaWxlID09ICItIjoKLSAgICAgICAgb3V0cHV0ID0gc3lzLnN0ZG91dAotICAgIGVsc2U6Ci0gICAgICAgIG91dHB1dCA9IG9wZW4ob3V0ZmlsZSwgInciKQotICAgIGlmIG5vdCBhcmdzOgotICAgICAgICBhcmdzID0gWyItIl0KLSAgICBmb3IgaW5maWxlIGluIGFyZ3M6Ci0gICAgICAgIGlmIGluZmlsZSA9PSAiLSI6Ci0gICAgICAgICAgICBpbnB1dCA9IHN5cy5zdGRpbgotICAgICAgICBlbHNlOgotICAgICAgICAgICAgaW5wdXQgPSBvcGVuKGluZmlsZSkKLSAgICAgICAgd2hpbGUgMToKLSAgICAgICAgICAgIGxpbmUgPSBpbnB1dC5yZWFkbGluZSgpCi0gICAgICAgICAgICBpZiBub3QgbGluZToKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgcHJlZml4ID0gTm9uZQotICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKFBSRUZJWF8xKToKLSAgICAgICAgICAgICAgICBwcmVmaXggPSBQUkVGSVhfMQotICAgICAgICAgICAgZWxpZiBsaW5lLnN0YXJ0c3dpdGgoUFJFRklYXzIpOgotICAgICAgICAgICAgICAgIHByZWZpeCA9IFBSRUZJWF8yCi0gICAgICAgICAgICBpZiBwcmVmaXg6Ci0gICAgICAgICAgICAgICAgcyA9IGxpbmVbbGVuKHByZWZpeCk6XS5zcGxpdCgnfScsIDEpWzBdCi0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBpbmZvID0gcmNkaWN0W3NdCi0gICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJObyByZWZjb3VudCBkYXRhIGZvciAlc1xuIiAlIHMpCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgaWYgaW5mby5yZXN1bHRfdHlwZSBpbiAoIlB5T2JqZWN0KiIsICJQeVZhck9iamVjdCoiKToKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIGluZm8ucmVzdWx0X3JlZnMgaXMgTm9uZToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYyA9ICJBbHdheXMgXE5VTEx7fSIKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBpbmZvLnJlc3VsdF9yZWZzIGFuZCAiTmV3IiBvciAiQm9ycm93ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSByYyArICIgcmVmZXJlbmNlIgotICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IChyIlxiZWdpbntjZnVuY2Rlc2N9WyVzXXslc317IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChyYywgaW5mby5yZXN1bHRfdHlwZSkpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsaW5lW2xlbihwcmVmaXgpOl0KLSAgICAgICAgICAgIG91dHB1dC53cml0ZShsaW5lKQotICAgICAgICBpZiBpbmZpbGUgIT0gIi0iOgotICAgICAgICAgICAgaW5wdXQuY2xvc2UoKQotICAgIGlmIG91dGZpbGUgIT0gIi0iOgotICAgICAgICBvdXRwdXQuY2xvc2UoKQotCi0KLWlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgbWFpbigpCmRpZmYgLS1naXQgYS9Eb2MvdG9vbHMvYnVpbGRpbmRleC5weSBiL0RvYy90b29scy9idWlsZGluZGV4LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZTViYTg0Li4wMDAwMDAwCi0tLSBhL0RvYy90b29scy9idWlsZGluZGV4LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLSMhIC91c3IvYmluL2VudiBweXRob24KLQotX192ZXJzaW9uX18gPSAnJFJldmlzaW9uJCcKLQotaW1wb3J0IG9zLnBhdGgKLWltcG9ydCByZQotaW1wb3J0IHN0cmluZwotaW1wb3J0IHN5cwotCi1mcm9tIHhtbC5zYXguc2F4dXRpbHMgaW1wb3J0IHF1b3RlYXR0cgotCi0KLWJhbmdfam9pbiA9ICIhIi5qb2luCi1udWxsX2pvaW4gPSAiIi5qb2luCi0KLVJFUExBQ0VNRU5UUyA9IFsKLSAgICAjIEhhY2tpc2ggd2F5IHRvIGRlYWwgd2l0aCBtYWNyb3MgcmVwbGFjZWQgd2l0aCBzaW1wbGUgdGV4dAotICAgIChyZS5jb21waWxlKHIiXFxBQkNcYiIpLCAiQUJDIiksCi0gICAgKHJlLmNvbXBpbGUociJcXEFTQ0lJXGIiKSwgIkFTQ0lJIiksCi0gICAgKHJlLmNvbXBpbGUociJcXENwcFxiIiksICJDKysiKSwKLSAgICAocmUuY29tcGlsZShyIlxcRU9GXGIiKSwgIkVPRiIpLAotICAgIChyZS5jb21waWxlKHIiXFxOVUxMXGIiKSwgIk5VTEwiKSwKLSAgICAocmUuY29tcGlsZShyIlxcUE9TSVhcYiIpLCAiUE9TSVgiKSwKLSAgICAocmUuY29tcGlsZShyIlxcVU5JWFxiIiksICJVbml4IiksCi0gICAgIyBkZWFsIHdpdGggdHVyZHMgbGVmdCBvdmVyIGZyb20gTGFUZVgySFRNTAotICAgIChyZS5jb21waWxlKHIiPCNcZCsjPiIpLCAiIiksCi0gICAgXQotCi1jbGFzcyBOb2RlOgotICAgIGNvbnRpbnVhdGlvbiA9IDAKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsaW5rLCBzdHIsIHNlcW5vKToKLSAgICAgICAgc2VsZi5saW5rcyA9IFtsaW5rXQotICAgICAgICBzZWxmLnNlcW5vID0gc2Vxbm8KLSAgICAgICAgZm9yIHBhdHRlcm4sIHJlcGxhY2VtZW50IGluIFJFUExBQ0VNRU5UUzoKLSAgICAgICAgICAgIHN0ciA9IHBhdHRlcm4uc3ViKHJlcGxhY2VtZW50LCBzdHIpCi0gICAgICAgICMgYnVpbGQgdXAgdGhlIHRleHQKLSAgICAgICAgc2VsZi50ZXh0ID0gc3BsaXRfZW50cnlfdGV4dChzdHIpCi0gICAgICAgIHNlbGYua2V5ID0gbGlzdChzcGxpdF9lbnRyeV9rZXkoc3RyKSkKLQotICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgotICAgICAgICByZXR1cm4gY21wKHNlbGYsIG90aGVyKSA9PSAwCi0KLSAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKLSAgICAgICAgcmV0dXJuIGNtcChzZWxmLCBvdGhlcikgPT0gLTEKLQotICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgotICAgICAgICByZXR1cm4gY21wKHNlbGYsIG90aGVyKSA9PSAxCi0KLSAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgICIiIkNvbXBhcmlzb24gb3BlcmF0b3IgaW5jbHVkZXMgc2VxdWVuY2UgbnVtYmVyLCBmb3IgdXNlIHdpdGgKLSAgICAgICAgbGlzdC5zb3J0KCkuIiIiCi0gICAgICAgIHJldHVybiBzZWxmLmNtcF9lbnRyeShvdGhlcikgb3IgY21wKHNlbGYuc2Vxbm8sIG90aGVyLnNlcW5vKQotCi0gICAgZGVmIGNtcF9lbnRyeShzZWxmLCBvdGhlcik6Ci0gICAgICAgICIiIkNvbXBhcmlzb24gJ29wZXJhdG9yJyB0aGF0IGlnbm9yZXMgc2VxdWVuY2UgbnVtYmVyLiIiIgotICAgICAgICBjID0gMAotICAgICAgICBmb3IgaSBpbiByYW5nZShtaW4obGVuKHNlbGYua2V5KSwgbGVuKG90aGVyLmtleSkpKToKLSAgICAgICAgICAgIGMgPSAoY21wX3BhcnQoc2VsZi5rZXlbaV0sIG90aGVyLmtleVtpXSkKLSAgICAgICAgICAgICAgICAgb3IgY21wX3BhcnQoc2VsZi50ZXh0W2ldLCBvdGhlci50ZXh0W2ldKSkKLSAgICAgICAgICAgIGlmIGM6Ci0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgcmV0dXJuIGMgb3IgY21wKHNlbGYua2V5LCBvdGhlci5rZXkpIG9yIGNtcChzZWxmLnRleHQsIG90aGVyLnRleHQpCi0KLSAgICBkZWYgX19yZXByX18oc2VsZik6Ci0gICAgICAgIHJldHVybiAiPE5vZGUgZm9yICVzICglcyk+IiAlIChiYW5nX2pvaW4oc2VsZi50ZXh0KSwgc2VsZi5zZXFubykKLQotICAgIGRlZiBfX3N0cl9fKHNlbGYpOgotICAgICAgICByZXR1cm4gYmFuZ19qb2luKHNlbGYua2V5KQotCi0gICAgZGVmIGR1bXAoc2VsZik6Ci0gICAgICAgIHJldHVybiAiJXNcMSVzIyMjJXNcbiIgXAotICAgICAgICAgICAgICAgJSAoIlwxIi5qb2luKHNlbGYubGlua3MpLAotICAgICAgICAgICAgICAgICAgYmFuZ19qb2luKHNlbGYudGV4dCksCi0gICAgICAgICAgICAgICAgICBzZWxmLnNlcW5vKQotCi0KLWRlZiBjbXBfcGFydChzMSwgczIpOgotICAgIHJlc3VsdCA9IGNtcChzMSwgczIpCi0gICAgaWYgcmVzdWx0ID09IDA6Ci0gICAgICAgIHJldHVybiAwCi0gICAgbDEgPSBzMS5sb3dlcigpCi0gICAgbDIgPSBzMi5sb3dlcigpCi0gICAgbWlubGVuID0gbWluKGxlbihzMSksIGxlbihzMikpCi0gICAgaWYgbGVuKHMxKSA8IGxlbihzMikgYW5kIGwxID09IGwyWzpsZW4oczEpXToKLSAgICAgICAgcmVzdWx0ID0gLTEKLSAgICBlbGlmIGxlbihzMikgPCBsZW4oczEpIGFuZCBsMiA9PSBsMVs6bGVuKHMyKV06Ci0gICAgICAgIHJlc3VsdCA9IDEKLSAgICBlbHNlOgotICAgICAgICByZXN1bHQgPSBjbXAobDEsIGwyKSBvciBjbXAoczEsIHMyKQotICAgIHJldHVybiByZXN1bHQKLQotCi1kZWYgc3BsaXRfZW50cnkoc3RyLCB3aGljaCk6Ci0gICAgc3R1ZmYgPSBbXQotICAgIHBhcnRzID0gc3RyLnNwbGl0KCchJykKLSAgICBwYXJ0cyA9IFtwYXJ0LnNwbGl0KCdAJykgZm9yIHBhcnQgaW4gcGFydHNdCi0gICAgZm9yIGVudHJ5IGluIHBhcnRzOgotICAgICAgICBpZiBsZW4oZW50cnkpICE9IDE6Ci0gICAgICAgICAgICBrZXkgPSBlbnRyeVt3aGljaF0KLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGtleSA9IGVudHJ5WzBdCi0gICAgICAgIHN0dWZmLmFwcGVuZChrZXkpCi0gICAgcmV0dXJuIHN0dWZmCi0KLQotX3JtdHQgPSByZS5jb21waWxlKHIiIiIoLiopPHR0KD86IGNsYXNzPVsnIl1bYS16MC05XStbIiddKT8+KC4qKTwvdHQ+KC4qKSQiIiIsCi0gICAgICAgICAgICAgICAgICAgcmUuSUdOT1JFQ0FTRSkKLV9ybXBhcmVucyA9IHJlLmNvbXBpbGUociJcKFwpIikKLQotZGVmIHNwbGl0X2VudHJ5X2tleShzdHIpOgotICAgIHBhcnRzID0gc3BsaXRfZW50cnkoc3RyLCAxKQotICAgIGZvciBpIGluIHJhbmdlKGxlbihwYXJ0cykpOgotICAgICAgICBtID0gX3JtdHQubWF0Y2gocGFydHNbaV0pCi0gICAgICAgIGlmIG06Ci0gICAgICAgICAgICBwYXJ0c1tpXSA9IG51bGxfam9pbihtLmdyb3VwKDEsIDIsIDMpKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcGFydHNbaV0gPSBwYXJ0c1tpXS5sb3dlcigpCi0gICAgICAgICMgcmVtb3ZlICcoKScgZnJvbSB0aGUga2V5OgotICAgICAgICBwYXJ0c1tpXSA9IF9ybXBhcmVucy5zdWIoJycsIHBhcnRzW2ldKQotICAgIHJldHVybiBtYXAodHJpbV9pZ25vcmVkX2xldHRlcnMsIHBhcnRzKQotCi0KLWRlZiBzcGxpdF9lbnRyeV90ZXh0KHN0cik6Ci0gICAgaWYgJzwnIGluIHN0cjoKLSAgICAgICAgbSA9IF9ybXR0Lm1hdGNoKHN0cikKLSAgICAgICAgaWYgbToKLSAgICAgICAgICAgIHN0ciA9IG51bGxfam9pbihtLmdyb3VwKDEsIDIsIDMpKQotICAgIHJldHVybiBzcGxpdF9lbnRyeShzdHIsIDEpCi0KLQotZGVmIGxvYWQoZnApOgotICAgIG5vZGVzID0gW10KLSAgICByeCA9IHJlLmNvbXBpbGUoIiguKilcMSguKikjIyMoLiopJCIpCi0gICAgd2hpbGUgMToKLSAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKLSAgICAgICAgaWYgbm90IGxpbmU6Ci0gICAgICAgICAgICBicmVhawotICAgICAgICBtID0gcngubWF0Y2gobGluZSkKLSAgICAgICAgaWYgbToKLSAgICAgICAgICAgIGxpbmssIHN0ciwgc2Vxbm8gPSBtLmdyb3VwKDEsIDIsIDMpCi0gICAgICAgICAgICBub2Rlcy5hcHBlbmQoTm9kZShsaW5rLCBzdHIsIHNlcW5vKSkKLSAgICByZXR1cm4gbm9kZXMKLQotCi1kZWYgdHJpbV9pZ25vcmVkX2xldHRlcnMocyk6Ci0gICAgIyBpZ25vcmUgJCB0byBrZWVwIGVudmlyb25tZW50IHZhcmlhYmxlcyB3aXRoIHRoZQotICAgICMgbGVhZGluZyBsZXR0ZXIgZnJvbSB0aGUgbmFtZQotICAgIGlmIHMuc3RhcnRzd2l0aCgiJCIpOgotICAgICAgICByZXR1cm4gc1sxOl0ubG93ZXIoKQotICAgIGVsc2U6Ci0gICAgICAgIHJldHVybiBzLmxvd2VyKCkKLQotZGVmIGdldF9maXJzdF9sZXR0ZXIocyk6Ci0gICAgaWYgcy5zdGFydHN3aXRoKCI8dGV4Mmh0bWxfcGVyY2VudF9tYXJrPiIpOgotICAgICAgICByZXR1cm4gIiUiCi0gICAgZWxzZToKLSAgICAgICAgcmV0dXJuIHRyaW1faWdub3JlZF9sZXR0ZXJzKHMpWzBdCi0KLQotZGVmIHNwbGl0X2xldHRlcnMobm9kZXMpOgotICAgIGxldHRlcl9ncm91cHMgPSBbXQotICAgIGlmIG5vZGVzOgotICAgICAgICBncm91cCA9IFtdCi0gICAgICAgIGFwcGVuZCA9IGdyb3VwLmFwcGVuZAotICAgICAgICBsZXR0ZXIgPSBnZXRfZmlyc3RfbGV0dGVyKG5vZGVzWzBdLnRleHRbMF0pCi0gICAgICAgIGxldHRlcl9ncm91cHMuYXBwZW5kKChsZXR0ZXIsIGdyb3VwKSkKLSAgICAgICAgZm9yIG5vZGUgaW4gbm9kZXM6Ci0gICAgICAgICAgICBubGV0dGVyID0gZ2V0X2ZpcnN0X2xldHRlcihub2RlLnRleHRbMF0pCi0gICAgICAgICAgICBpZiBsZXR0ZXIgIT0gbmxldHRlcjoKLSAgICAgICAgICAgICAgICBsZXR0ZXIgPSBubGV0dGVyCi0gICAgICAgICAgICAgICAgZ3JvdXAgPSBbXQotICAgICAgICAgICAgICAgIGxldHRlcl9ncm91cHMuYXBwZW5kKChsZXR0ZXIsIGdyb3VwKSkKLSAgICAgICAgICAgICAgICBhcHBlbmQgPSBncm91cC5hcHBlbmQKLSAgICAgICAgICAgIGFwcGVuZChub2RlKQotICAgIHJldHVybiBsZXR0ZXJfZ3JvdXBzCi0KLQotZGVmIGdyb3VwX3N5bWJvbHMoZ3JvdXBzKToKLSAgICBlbnRyaWVzID0gW10KLSAgICBpZGVudF9sZXR0ZXJzID0gc3RyaW5nLmFzY2lpX2xldHRlcnMgKyAiXyIKLSAgICB3aGlsZSBncm91cHNbMF1bMF0gbm90IGluIGlkZW50X2xldHRlcnM6Ci0gICAgICAgIGVudHJpZXMgKz0gZ3JvdXBzWzBdWzFdCi0gICAgICAgIGRlbCBncm91cHNbMF0KLSAgICBpZiBlbnRyaWVzOgotICAgICAgICBncm91cHMuaW5zZXJ0KDAsICgiU3ltYm9scyIsIGVudHJpZXMpKQotCi0KLSMgbmVlZCBhIGZ1bmN0aW9uIHRvIHNlcGFyYXRlIHRoZSBub2RlcyBpbnRvIGNvbHVtbnMuLi4KLWRlZiBzcGxpdF9jb2x1bW5zKG5vZGVzLCBjb2x1bW5zPTEpOgotICAgIGlmIGNvbHVtbnMgPD0gMToKLSAgICAgICAgcmV0dXJuIFtub2Rlc10KLSAgICAjIFRoaXMgaXMgYSByb3VnaCBoZWlnaHQ7IHdlIG1heSBoYXZlIHRvIGluY3JlYXNlIHRvIGF2b2lkIGJyZWFrcyBiZWZvcmUKLSAgICAjIGEgc3ViaXRlbS4KLSAgICBjb2xoZWlnaHQgPSBpbnQobGVuKG5vZGVzKSAvIGNvbHVtbnMpCi0gICAgbnVtbG9uZyA9IGludChsZW4obm9kZXMpICUgY29sdW1ucykKLSAgICBpZiBudW1sb25nOgotICAgICAgICBjb2xoZWlnaHQgPSBjb2xoZWlnaHQgKyAxCi0gICAgZWxzZToKLSAgICAgICAgbnVtbG9uZyA9IGNvbHVtbnMKLSAgICBjb2xzID0gW10KLSAgICBmb3IgaSBpbiByYW5nZShudW1sb25nKToKLSAgICAgICAgc3RhcnQgPSBpICogY29saGVpZ2h0Ci0gICAgICAgIGVuZCA9IHN0YXJ0ICsgY29saGVpZ2h0Ci0gICAgICAgIGNvbHMuYXBwZW5kKG5vZGVzW3N0YXJ0OmVuZF0pCi0gICAgZGVsIG5vZGVzWzplbmRdCi0gICAgY29saGVpZ2h0ID0gY29saGVpZ2h0IC0gMQotICAgIHRyeToKLSAgICAgICAgbnVtc2hvcnQgPSBpbnQobGVuKG5vZGVzKSAvIGNvbGhlaWdodCkKLSAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6Ci0gICAgICAgIGNvbHMgPSBjb2xzICsgKGNvbHVtbnMgLSBsZW4oY29scykpICogW1tdXQotICAgIGVsc2U6Ci0gICAgICAgIGZvciBpIGluIHJhbmdlKG51bXNob3J0KToKLSAgICAgICAgICAgIHN0YXJ0ID0gaSAqIGNvbGhlaWdodAotICAgICAgICAgICAgZW5kID0gc3RhcnQgKyBjb2xoZWlnaHQKLSAgICAgICAgICAgIGNvbHMuYXBwZW5kKG5vZGVzW3N0YXJ0OmVuZF0pCi0gICAgIwotICAgICMgSWYgaXRlbXMgY29udGludWUgYWNyb3NzIGNvbHVtbnMsIG1ha2Ugc3VyZSB0aGV5IGFyZSBtYXJrZWQKLSAgICAjIGFzIGNvbnRpbnVhdGlvbnMgc28gdGhlIHVzZXIga25vd3MgdG8gbG9vayBhdCB0aGUgcHJldmlvdXMgY29sdW1uLgotICAgICMKLSAgICBmb3IgaSBpbiByYW5nZShsZW4oY29scykgLSAxKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgcHJldiA9IGNvbHNbaV1bLTFdCi0gICAgICAgICAgICBuZXh0ID0gY29sc1tpICsgMV1bMF0KLSAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6Ci0gICAgICAgICAgICByZXR1cm4gY29scwotICAgICAgICBlbHNlOgotICAgICAgICAgICAgbiA9IG1pbihsZW4ocHJldi5rZXkpLCBsZW4obmV4dC5rZXkpKQotICAgICAgICAgICAgZm9yIGogaW4gcmFuZ2Uobik6Ci0gICAgICAgICAgICAgICAgaWYgcHJldi5rZXlbal0gIT0gbmV4dC5rZXlbal06Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgbmV4dC5jb250aW51YXRpb24gPSBqICsgMQotICAgIHJldHVybiBjb2xzCi0KLQotRExfTEVWRUxfSU5ERU5UID0gIiAgIgotCi1kZWYgZm9ybWF0X2NvbHVtbihub2Rlcyk6Ci0gICAgc3RyaW5ncyA9IFsiPGRsIGNvbXBhY3Q9J2NvbXBhY3QnPiJdCi0gICAgYXBwZW5kID0gc3RyaW5ncy5hcHBlbmQKLSAgICBsZXZlbCA9IDAKLSAgICBwcmV2aW91cyA9IFtdCi0gICAgZm9yIG5vZGUgaW4gbm9kZXM6Ci0gICAgICAgIGN1cnJlbnQgPSBub2RlLnRleHQKLSAgICAgICAgY291bnQgPSAwCi0gICAgICAgIGZvciBpIGluIHJhbmdlKG1pbihsZW4oY3VycmVudCksIGxlbihwcmV2aW91cykpKToKLSAgICAgICAgICAgIGlmIHByZXZpb3VzW2ldICE9IGN1cnJlbnRbaV06Ci0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGNvdW50ID0gaSArIDEKLSAgICAgICAgaWYgY291bnQgPiBsZXZlbDoKLSAgICAgICAgICAgIGFwcGVuZCgiPGRsIGNvbXBhY3Q9J2NvbXBhY3QnPiIgKiAoY291bnQgLSBsZXZlbCkgKyAiXG4iKQotICAgICAgICAgICAgbGV2ZWwgPSBjb3VudAotICAgICAgICBlbGlmIGxldmVsID4gY291bnQ6Ci0gICAgICAgICAgICBhcHBlbmQoIlxuIikKLSAgICAgICAgICAgIGFwcGVuZChsZXZlbCAqIERMX0xFVkVMX0lOREVOVCkKLSAgICAgICAgICAgIGFwcGVuZCgiPC9kbD4iICogKGxldmVsIC0gY291bnQpKQotICAgICAgICAgICAgbGV2ZWwgPSBjb3VudAotICAgICAgICAjIGVsc2U6IGxldmVsID09IGNvdW50Ci0gICAgICAgIGZvciBpIGluIHJhbmdlKGNvdW50LCBsZW4oY3VycmVudCkgLSAxKToKLSAgICAgICAgICAgIHRlcm0gPSBub2RlLnRleHRbaV0KLSAgICAgICAgICAgIGxldmVsID0gbGV2ZWwgKyAxCi0gICAgICAgICAgICBpZiBub2RlLmNvbnRpbnVhdGlvbiA+IGk6Ci0gICAgICAgICAgICAgICAgZXh0cmEgPSAiIChjb250aW51ZWQpIgotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBleHRyYSA9ICIiCi0gICAgICAgICAgICBhcHBlbmQoIlxuPGR0PiVzJXNcbjxkZD5cbiVzPGRsIGNvbXBhY3Q9J2NvbXBhY3QnPiIKLSAgICAgICAgICAgICAgICAgICAlICh0ZXJtLCBleHRyYSwgbGV2ZWwgKiBETF9MRVZFTF9JTkRFTlQpKQotICAgICAgICBhcHBlbmQoIlxuJXM8ZHQ+JXMlczwvYT4iCi0gICAgICAgICAgICAgICAlIChsZXZlbCAqIERMX0xFVkVMX0lOREVOVCwgbm9kZS5saW5rc1swXSwgbm9kZS50ZXh0Wy0xXSkpCi0gICAgICAgIGZvciBsaW5rIGluIG5vZGUubGlua3NbMTpdOgotICAgICAgICAgICAgYXBwZW5kKCIsXG4lcyAgICAlc1tMaW5rXTwvYT4iICUgKGxldmVsICogRExfTEVWRUxfSU5ERU5ULCBsaW5rKSkKLSAgICAgICAgcHJldmlvdXMgPSBjdXJyZW50Ci0gICAgYXBwZW5kKCJcbiIpCi0gICAgYXBwZW5kKCI8L2RsPiIgKiAobGV2ZWwgKyAxKSkKLSAgICByZXR1cm4gbnVsbF9qb2luKHN0cmluZ3MpCi0KLQotZGVmIGZvcm1hdF9ub2Rlcyhub2RlcywgY29sdW1ucz0xKToKLSAgICBzdHJpbmdzID0gW10KLSAgICBhcHBlbmQgPSBzdHJpbmdzLmFwcGVuZAotICAgIGlmIGNvbHVtbnMgPiAxOgotICAgICAgICBjb2xub3MgPSByYW5nZShjb2x1bW5zKQotICAgICAgICBjb2xoZWlnaHQgPSBpbnQobGVuKG5vZGVzKSAvIGNvbHVtbnMpCi0gICAgICAgIGlmIGxlbihub2RlcykgJSBjb2x1bW5zOgotICAgICAgICAgICAgY29saGVpZ2h0ID0gY29saGVpZ2h0ICsgMQotICAgICAgICBjb2x3aWR0aCA9IGludCgxMDAgLyBjb2x1bW5zKQotICAgICAgICBhcHBlbmQoJzx0YWJsZSB3aWR0aD0iMTAwJSI+PHRyIHZhbGlnbj0idG9wIj4nKQotICAgICAgICBmb3IgY29sIGluIHNwbGl0X2NvbHVtbnMobm9kZXMsIGNvbHVtbnMpOgotICAgICAgICAgICAgYXBwZW5kKCc8dGQgd2lkdGg9IiVkJSUiPlxuJyAlIGNvbHdpZHRoKQotICAgICAgICAgICAgYXBwZW5kKGZvcm1hdF9jb2x1bW4oY29sKSkKLSAgICAgICAgICAgIGFwcGVuZCgiXG48L3RkPiIpCi0gICAgICAgIGFwcGVuZCgiXG48L3RyPjwvdGFibGU+IikKLSAgICBlbHNlOgotICAgICAgICBhcHBlbmQoZm9ybWF0X2NvbHVtbihub2RlcykpCi0gICAgcmV0dXJuIG51bGxfam9pbihzdHJpbmdzKQotCi0KLWRlZiBmb3JtYXRfbGV0dGVyKGxldHRlcik6Ci0gICAgaWYgbGV0dGVyID09ICcuJzoKLSAgICAgICAgbGV0dGVybmFtZSA9ICIuIChkb3QpIgotICAgIGVsaWYgbGV0dGVyID09ICdfJzoKLSAgICAgICAgbGV0dGVybmFtZSA9ICJfICh1bmRlcnNjb3JlKSIKLSAgICBlbHNlOgotICAgICAgICBsZXR0ZXJuYW1lID0gbGV0dGVyLmNhcGl0YWxpemUoKQotICAgIHJldHVybiAiXG48aHIgLz5cbjxoMiBpZD0lcz4lczwvaDI+XG5cbiIgXAotICAgICAgICAgICAlIChxdW90ZWF0dHIoImxldHRlci0iICsgbGV0dGVyKSwgbGV0dGVybmFtZSkKLQotCi1kZWYgZm9ybWF0X2h0bWxfbGV0dGVycyhub2RlcywgY29sdW1ucywgZ3JvdXBfc3ltYm9sX25vZGVzKToKLSAgICBsZXR0ZXJfZ3JvdXBzID0gc3BsaXRfbGV0dGVycyhub2RlcykKLSAgICBpZiBncm91cF9zeW1ib2xfbm9kZXM6Ci0gICAgICAgIGdyb3VwX3N5bWJvbHMobGV0dGVyX2dyb3VwcykKLSAgICBpdGVtcyA9IFtdCi0gICAgZm9yIGxldHRlciwgbm9kZXMgaW4gbGV0dGVyX2dyb3VwczoKLSAgICAgICAgcyA9ICI8Yj48YSBocmVmPVwiI2xldHRlci0lc1wiPiVzPC9hPjwvYj4iICUgKGxldHRlciwgbGV0dGVyKQotICAgICAgICBpdGVtcy5hcHBlbmQocykKLSAgICBzID0gWyI8aHIgLz48Y2VudGVyPlxuJXM8L2NlbnRlcj5cbiIgJSAiIHxcbiIuam9pbihpdGVtcyldCi0gICAgZm9yIGxldHRlciwgbm9kZXMgaW4gbGV0dGVyX2dyb3VwczoKLSAgICAgICAgcy5hcHBlbmQoZm9ybWF0X2xldHRlcihsZXR0ZXIpKQotICAgICAgICBzLmFwcGVuZChmb3JtYXRfbm9kZXMobm9kZXMsIGNvbHVtbnMpKQotICAgIHJldHVybiBudWxsX2pvaW4ocykKLQotZGVmIGZvcm1hdF9odG1sKG5vZGVzLCBjb2x1bW5zKToKLSAgICByZXR1cm4gZm9ybWF0X25vZGVzKG5vZGVzLCBjb2x1bW5zKQotCi0KLWRlZiBjb2xsYXBzZShub2Rlcyk6Ci0gICAgIiIiQ29sbGFwc2Ugc2VxdWVuY2VzIG9mIG5vZGVzIHdpdGggbWF0Y2hpbmcga2V5cyBpbnRvIGEgc2luZ2xlIG5vZGUuCi0gICAgRGVzdHJ1Y3RpdmUuIiIiCi0gICAgaWYgbGVuKG5vZGVzKSA8IDI6Ci0gICAgICAgIHJldHVybgotICAgIHByZXYgPSBub2Rlc1swXQotICAgIGkgPSAxCi0gICAgd2hpbGUgaSA8IGxlbihub2Rlcyk6Ci0gICAgICAgIG5vZGUgPSBub2Rlc1tpXQotICAgICAgICBpZiBub3Qgbm9kZS5jbXBfZW50cnkocHJldik6Ci0gICAgICAgICAgICBwcmV2LmxpbmtzLmFwcGVuZChub2RlLmxpbmtzWzBdKQotICAgICAgICAgICAgZGVsIG5vZGVzW2ldCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBpID0gaSArIDEKLSAgICAgICAgICAgIHByZXYgPSBub2RlCi0KLQotZGVmIGR1bXAobm9kZXMsIGZwKToKLSAgICBmb3Igbm9kZSBpbiBub2RlczoKLSAgICAgICAgZnAud3JpdGUobm9kZS5kdW1wKCkpCi0KLQotZGVmIHByb2Nlc3Nfbm9kZXMobm9kZXMsIGNvbHVtbnMsIGxldHRlcnM9MCwgZ3JvdXBfc3ltYm9sX25vZGVzPTApOgotICAgIG5vZGVzLnNvcnQoKQotICAgIGNvbGxhcHNlKG5vZGVzKQotICAgIGlmIGxldHRlcnM6Ci0gICAgICAgIHJldHVybiBmb3JtYXRfaHRtbF9sZXR0ZXJzKG5vZGVzLCBjb2x1bW5zLCBncm91cF9zeW1ib2xfbm9kZXMpCi0gICAgZWxzZToKLSAgICAgICAgcmV0dXJuIGZvcm1hdF9odG1sKG5vZGVzLCBjb2x1bW5zKQotCi0KLWRlZiBtYWluKCk6Ci0gICAgaW1wb3J0IGdldG9wdAotICAgIGlmbiA9ICItIgotICAgIG9mbiA9ICItIgotICAgIGNvbHVtbnMgPSAxCi0gICAgbGV0dGVycyA9IDAKLSAgICBncm91cF9zeW1ib2xfbm9kZXMgPSAxCi0gICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAiYzpsbzoiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiY29sdW1ucz0iLCAiZG9udC1ncm91cC1zeW1ib2xzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyb3VwLXN5bWJvbHMiLCAibGV0dGVycyIsICJvdXRwdXQ9Il0pCi0gICAgZm9yIG9wdCwgdmFsIGluIG9wdHM6Ci0gICAgICAgIGlmIG9wdCBpbiAoIi1vIiwgIi0tb3V0cHV0Iik6Ci0gICAgICAgICAgICBvZm4gPSB2YWwKLSAgICAgICAgZWxpZiBvcHQgaW4gKCItYyIsICItLWNvbHVtbnMiKToKLSAgICAgICAgICAgIGNvbHVtbnMgPSBpbnQodmFsLCAxMCkKLSAgICAgICAgZWxpZiBvcHQgaW4gKCItbCIsICItLWxldHRlcnMiKToKLSAgICAgICAgICAgIGxldHRlcnMgPSAxCi0gICAgICAgIGVsaWYgb3B0ID09ICItLWdyb3VwLXN5bWJvbHMiOgotICAgICAgICAgICAgZ3JvdXBfc3ltYm9sX25vZGVzID0gMQotICAgICAgICBlbGlmIG9wdCA9PSAiLS1kb250LWdyb3VwLXN5bWJvbHMiOgotICAgICAgICAgICAgZ3JvdXBfc3ltYm9sX25vZGVzID0gMAotICAgIGlmIG5vdCBhcmdzOgotICAgICAgICBhcmdzID0gW2lmbl0KLSAgICBub2RlcyA9IFtdCi0gICAgZm9yIGZuIGluIGFyZ3M6Ci0gICAgICAgIG5vZGVzID0gbm9kZXMgKyBsb2FkKG9wZW4oZm4pKQotICAgIG51bV9ub2RlcyA9IGxlbihub2RlcykKLSAgICBodG1sID0gcHJvY2Vzc19ub2Rlcyhub2RlcywgY29sdW1ucywgbGV0dGVycywgZ3JvdXBfc3ltYm9sX25vZGVzKQotICAgIHByb2dyYW0gPSBvcy5wYXRoLmJhc2VuYW1lKHN5cy5hcmd2WzBdKQotICAgIGlmIG9mbiA9PSAiLSI6Ci0gICAgICAgIHN5cy5zdGRvdXQud3JpdGUoaHRtbCkKLSAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiXG4lczogJWQgaW5kZXggbm9kZXMiICUgKHByb2dyYW0sIG51bV9ub2RlcykpCi0gICAgZWxzZToKLSAgICAgICAgb3BlbihvZm4sICJ3Iikud3JpdGUoaHRtbCkKLSAgICAgICAgcHJpbnQoKQotICAgICAgICBwcmludCgiJXM6ICVkIGluZGV4IG5vZGVzIiAlIChwcm9ncmFtLCBudW1fbm9kZXMpKQotCi0KLWlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgbWFpbigpCmRpZmYgLS1naXQgYS9Eb2MvdG9vbHMvY2hlY2thcmdzLnBtIGIvRG9jL3Rvb2xzL2NoZWNrYXJncy5wbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA1ZDNjNi4uMDAwMDAwMAotLS0gYS9Eb2MvdG9vbHMvY2hlY2thcmdzLnBtCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLSMhIC91c3IvYmluL3BlcmwKLQotcGFja2FnZSBjaGVja2FyZ3M7Ci1yZXF1aXJlIDUuMDA0OwkJCSMgdXNlcyAiZm9yIG15ICR2YXIiCi1yZXF1aXJlIEV4cG9ydGVyOwotQElTQSA9IHF3KEV4cG9ydGVyKTsKLUBFWFBPUlQgPSBxdyhjaGVja19hcmdzIGNoZWNrX2FyZ3NfcmFuZ2UgY2hlY2tfYXJnc19hdF9sZWFzdCk7Ci11c2Ugc3RyaWN0OwotdXNlIENhcnA7Ci0KLT1oZWFkMSBOQU1FCi0KLWNoZWNrYXJncyAtLSBQcm92aWRlIHJ1ZGltZW50YXJ5IGFyZ3VtZW50IGNoZWNraW5nIGZvciBwZXJsNSBmdW5jdGlvbnMKLQotPWhlYWQxIFNZTk9QU0lTCi0KLSAgY2hlY2tfYXJncyhjQXJnc0V4cGVjdGVkLCBAXykKLSAgY2hlY2tfYXJnc19yYW5nZShjQXJnc01pbiwgY0FyZ3NNYXgsIEBfKQotICBjaGVja19hcmdzX2F0X2xlYXN0KGNBcmdzTWluLCBAXykKLXdoZXJlICJAXyIgc2hvdWxkIGJlIHN1cHBsaWVkIGxpdGVyYWxseS4KLQotPWhlYWQxIERFU0NSSVBUSU9OCi0KLUFzIHRoZSBmaXJzdCBsaW5lIG9mIHVzZXItd3JpdHRlbiBzdWJyb3V0aW5lIGZvbywgZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLSAgbXkgKCRhcmcxLCAkYXJnMikgPSBjaGVja19hcmdzKDIsIEBfKTsKLSAgbXkgKCRhcmcxLCBAcmVzdCkgPSBjaGVja19hcmdzX3JhbmdlKDEsIDQsIEBfKTsKLSAgbXkgKCRhcmcxLCBAcmVzdCkgPSBjaGVja19hcmdzX2F0X2xlYXN0KDEsIEBfKTsKLSAgbXkgQGFyZ3MgPSBjaGVja19hcmdzX2F0X2xlYXN0KDAsIEBfKTsKLQotVGhlc2UgZnVuY3Rpb25zIG1heSBhbHNvIGJlIGNhbGxlZCBmb3Igc2lkZSBlZmZlY3QgKHB1dCBhIGNhbGwgdG8gb25lCi1vZiB0aGUgZnVuY3Rpb25zIG5lYXIgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3Vicm91dGluZSksIGJ1dCB1c2luZyB0aGUKLWFyZ3VtZW50IGNoZWNrZXJzIHRvIHNldCB0aGUgYXJndW1lbnQgbGlzdCBpcyB0aGUgcmVjb21tZW5kZWQgdXNhZ2UuCi0KLVRoZSBudW1iZXIgb2YgYXJndW1lbnRzIGFuZCB0aGVpciBkZWZpbmVkbmVzcyBhcmUgY2hlY2tlZDsgaWYgdGhlIHdyb25nCi1udW1iZXIgYXJlIHJlY2VpdmVkLCB0aGUgcHJvZ3JhbSBleGl0cyB3aXRoIGFuIGVycm9yIG1lc3NhZ2UuCi0KLT1oZWFkMSBBVVRIT1IKLQotTWljaGFlbCBELiBFcm5zdCA8RjxtZXJuc3RAY3Mud2FzaGluZ3Rvbi5lZHU+PgotCi09Y3V0Ci0KLSMjIE5lZWQgdG8gY2hlY2sgdGhhdCB1c2Ugb2YgY2FsbGVyKDEpIHJlYWxseSBnaXZlcyBkZXNpcmVkIHJlc3VsdHMuCi0jIyBOZWVkIHRvIGdpdmUgaW5wdXQgY2h1bmsgaW5mb3JtYXRpb24uCi0jIyBJcyB0aGlzIG9idmlhdGVkIGJ5IFBlcmwgNS4wMDMncyBkZWNsYXJhdGlvbnM/ICBOb3QgZW50aXJlbHksIEkgdGhpbmsuCi0KLXN1YiBjaGVja19hcmdzICggJEAgKQotewotICBteSAoJG51bV9mb3JtYWxzLCBAYXJncykgPSBAXzsKLSAgbXkgKCRwYWNrLCAkZmlsZV9hcmcsICRsaW5lX2FyZywgJHN1Ym5hbWUsICRoYXNhcmdzLCAkd2FudGFycikgPSBjYWxsZXIoMSk7Ci0gIGlmIChAXyA8IDEpIHsgY3JvYWsgImNoZWNrX2FyZ3MgbmVlZHMgYXQgbGVhc3QgNyBhcmdzLCBnb3QgIiwgc2NhbGFyKEBfKSwgIjogQF9cbiAiOyB9Ci0gIGlmICgoIXdhbnRhcnJheSkgJiYgKCRudW1fZm9ybWFscyAhPSAwKSkKLSAgICB7IGNyb2FrICJjaGVja19hcmdzIGNhbGxlZCBpbiBzY2FsYXIgY29udGV4dCI7IH0KLSAgIyBDYW4ndCB1c2UgY3JvYWsgYmVsb3cgaGVyZTogaXQgd291bGQgb25seSBnbyBvdXQgdG8gY2FsbGVyLCBub3QgaXRzIGNhbGxlcgotICBteSAkbnVtX2FjdHVhbHMgPSBAYXJnczsKLSAgaWYgKCRudW1fYWN0dWFscyAhPSAkbnVtX2Zvcm1hbHMpCi0gICAgeyBkaWUgIiRmaWxlX2FyZzokbGluZV9hcmc6IGZ1bmN0aW9uICRzdWJuYW1lIGV4cGVjdGVkICRudW1fZm9ybWFscyBhcmd1bWVudCIsCi0gICAgICAoKCRudW1fZm9ybWFscyA9PSAxKSA/ICIiIDogInMiKSwKLSAgICAgICIsIGdvdCAkbnVtX2FjdHVhbHMiLAotICAgICAgKCgkbnVtX2FjdHVhbHMgPT0gMCkgPyAiIiA6ICI6IEBhcmdzIiksCi0gICAgICAiXG4iOyB9Ci0gIGZvciBteSAkaW5kZXggKDAuLiQjYXJncykKLSAgICB7IGlmICghZGVmaW5lZCgkYXJnc1skaW5kZXhdKSkKLQl7IGRpZSAiJGZpbGVfYXJnOiRsaW5lX2FyZzogZnVuY3Rpb24gJHN1Ym5hbWUgdW5kZWZpbmVkIGFyZ3VtZW50ICIsICRpbmRleCsxLCAiOiBAYXJnc1swLi4kaW5kZXgtMV1cbiI7IH0gfQotICByZXR1cm4gQGFyZ3M7Ci19Ci0KLXN1YiBjaGVja19hcmdzX3JhbmdlICggJCRAICkKLXsKLSAgbXkgKCRtaW5fZm9ybWFscywgJG1heF9mb3JtYWxzLCBAYXJncykgPSBAXzsKLSAgbXkgKCRwYWNrLCAkZmlsZV9hcmcsICRsaW5lX2FyZywgJHN1Ym5hbWUsICRoYXNhcmdzLCAkd2FudGFycikgPSBjYWxsZXIoMSk7Ci0gIGlmIChAXyA8IDIpIHsgY3JvYWsgImNoZWNrX2FyZ3NfcmFuZ2UgbmVlZHMgYXQgbGVhc3QgOCBhcmdzLCBnb3QgIiwgc2NhbGFyKEBfKSwgIjogQF8iOyB9Ci0gIGlmICgoIXdhbnRhcnJheSkgJiYgKCRtYXhfZm9ybWFscyAhPSAwKSAmJiAoJG1pbl9mb3JtYWxzICE9MCkgKQotICAgIHsgY3JvYWsgImNoZWNrX2FyZ3NfcmFuZ2UgY2FsbGVkIGluIHNjYWxhciBjb250ZXh0IjsgfQotICAjIENhbid0IHVzZSBjcm9hayBiZWxvdyBoZXJlOiBpdCB3b3VsZCBvbmx5IGdvIG91dCB0byBjYWxsZXIsIG5vdCBpdHMgY2FsbGVyCi0gIG15ICRudW1fYWN0dWFscyA9IEBhcmdzOwotICBpZiAoKCRudW1fYWN0dWFscyA8ICRtaW5fZm9ybWFscykgfHwgKCRudW1fYWN0dWFscyA+ICRtYXhfZm9ybWFscykpCi0gICAgeyBkaWUgIiRmaWxlX2FyZzokbGluZV9hcmc6IGZ1bmN0aW9uICRzdWJuYW1lIGV4cGVjdGVkICRtaW5fZm9ybWFscy0kbWF4X2Zvcm1hbHMgYXJndW1lbnRzLCBnb3QgJG51bV9hY3R1YWxzIiwKLSAgICAgICgkbnVtX2FjdHVhbHMgPT0gMCkgPyAiIiA6ICI6IEBhcmdzIiwgIlxuIjsgfQotICBmb3IgbXkgJGluZGV4ICgwLi4kI2FyZ3MpCi0gICAgeyBpZiAoIWRlZmluZWQoJGFyZ3NbJGluZGV4XSkpCi0JeyBkaWUgIiRmaWxlX2FyZzokbGluZV9hcmc6IGZ1bmN0aW9uICRzdWJuYW1lIHVuZGVmaW5lZCBhcmd1bWVudCAiLCAkaW5kZXgrMSwgIjogQGFyZ3NbMC4uJGluZGV4LTFdXG4iOyB9IH0KLSAgcmV0dXJuIEBhcmdzOwotfQotCi1zdWIgY2hlY2tfYXJnc19hdF9sZWFzdCAoICRAICkKLXsKLSAgbXkgKCRtaW5fZm9ybWFscywgQGFyZ3MpID0gQF87Ci0gIG15ICgkcGFjaywgJGZpbGVfYXJnLCAkbGluZV9hcmcsICRzdWJuYW1lLCAkaGFzYXJncywgJHdhbnRhcnIpID0gY2FsbGVyKDEpOwotICAjIERvbid0IGRvIHRoaXMsIGJlY2F1c2Ugd2Ugd2FudCBldmVyeSBzdWIgdG8gc3RhcnQgd2l0aCBhIGNhbGwgdG8gY2hlY2tfYXJncyoKLSAgIyBpZiAoJG1pbl9mb3JtYWxzID09IDApCi0gICMgICB7IGRpZSAiSXNuJ3QgaXQgcG9pbnRsZXNzIHRvIGNoZWNrIGZvciBhdCBsZWFzdCB6ZXJvIGFyZ3MgdG8gJHN1Ym5hbWU/XG4iOyB9Ci0gIGlmIChzY2FsYXIoQF8pIDwgMSkKLSAgICB7IGNyb2FrICJjaGVja19hcmdzX2F0X2xlYXN0IG5lZWRzIGF0IGxlYXN0IDEgYXJnLCBnb3QgIiwgc2NhbGFyKEBfKSwgIjogQF8iOyB9Ci0gIGlmICgoIXdhbnRhcnJheSkgJiYgKCRtaW5fZm9ybWFscyAhPSAwKSkKLSAgICB7IGNyb2FrICJjaGVja19hcmdzX2F0X2xlYXN0IGNhbGxlZCBpbiBzY2FsYXIgY29udGV4dCI7IH0KLSAgIyBDYW4ndCB1c2UgY3JvYWsgYmVsb3cgaGVyZTogaXQgd291bGQgb25seSBnbyBvdXQgdG8gY2FsbGVyLCBub3QgaXRzIGNhbGxlcgotICBteSAkbnVtX2FjdHVhbHMgPSBAYXJnczsKLSAgaWYgKCRudW1fYWN0dWFscyA8ICRtaW5fZm9ybWFscykKLSAgICB7IGRpZSAiJGZpbGVfYXJnOiRsaW5lX2FyZzogZnVuY3Rpb24gJHN1Ym5hbWUgZXhwZWN0ZWQgYXQgbGVhc3QgJG1pbl9mb3JtYWxzIGFyZ3VtZW50IiwKLSAgICAgICgkbWluX2Zvcm1hbHMgPT0gMSkgPyAiIiA6ICJzIiwKLSAgICAgICIsIGdvdCAkbnVtX2FjdHVhbHMiLAotICAgICAgKCRudW1fYWN0dWFscyA9PSAwKSA/ICIiIDogIjogQGFyZ3MiLCAiXG4iOyB9Ci0gIGZvciBteSAkaW5kZXggKDAuLiQjYXJncykKLSAgICB7IGlmICghZGVmaW5lZCgkYXJnc1skaW5kZXhdKSkKLQl7IHdhcm4gIiRmaWxlX2FyZzokbGluZV9hcmc6IGZ1bmN0aW9uICRzdWJuYW1lIHVuZGVmaW5lZCBhcmd1bWVudCAiLCAkaW5kZXgrMSwgIjogQGFyZ3NbMC4uJGluZGV4LTFdXG4iOyBsYXN0OyB9IH0KLSAgcmV0dXJuIEBhcmdzOwotfQotCi0xOwkJCQkjIHN1Y2Nlc3NmdWwgaW1wb3J0Ci1fX0VORF9fCmRpZmYgLS1naXQgYS9Eb2MvdG9vbHMvY2tsYXRleCBiL0RvYy90b29scy9ja2xhdGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzOTZlOTE0Li4wMDAwMDAwCi0tLSBhL0RvYy90b29scy9ja2xhdGV4CisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyAgLSotIGtzaCAtKi0KLQotIyBUaGlzIHNjcmlwdCAqaGVscHMqIGxvY2F0ZSBsaW5lcyBvZiBub3JtYWwgY29udGVudCB0aGF0IGVuZCBpbiAnfSc7Ci0jIHRoaXMgaXMgdXNlZnVsIHNpbmNlIExhVGVYMkhUTUwgKGF0IGxlYXN0IHRoZSBvbGQgdmVyc2lvbiB0aGF0IHdlCi0jIHVzZSkgYnJlYWtzIG9uIG1hbnkgbGluZXMgdGhhdCBlbmQgdGhhdCB3YXkuCi0jCi0jIFVzYWdlOiBja2xhdGV4IGZpbGVzLi4uIHwgbGVzcwotIwotIyAqUmVhZCogdGhlIG91dHB1dCBsb29raW5nIGZvciBzdXNwaWNpb3VzIGxpbmVzIQotCi1ncmVwIC1uICJbXiAJXX1cJCIgJEAgfCBcCi0gZ3JlcCAtdiAnXFxiZWdpbnsnIHwgXAotIGdyZXAgLXYgJ1xcZW5keycgfCBcCi0gZ3JlcCAtdiAnXFxpbnB1dHsnIHwgXAotIGdyZXAgLXYgJ1xcZG9jdW1lbnRjbGFzc3snIHwgXAotIGdyZXAgLXYgJ1xcdGl0bGV7JyB8IFwKLSBncmVwIC12ICdcXGNoYXB0ZXJ7JyB8IFwKLSBncmVwIC12ICdcXGNoYXB0ZXJcKnsnIHwgXAotIGdyZXAgLXYgJ1xcc2VjdGlvbnsnIHwgXAotIGdyZXAgLXYgJ1xcc3Vic2VjdGlvbnsnIHwgXAotIGdyZXAgLXYgJ1xcc3Vic3Vic2VjdGlvbnsnIHwgXAotIGdyZXAgLXYgJ1xcc2VjdGlvbmF1dGhvcnsnIHwgXAotIGdyZXAgLXYgJ1xcbW9kdWxlYXV0aG9yeycKLQotZXhpdCAkPwpkaWZmIC0tZ2l0IGEvRG9jL3Rvb2xzL2NtcGNzeW1zIGIvRG9jL3Rvb2xzL2NtcGNzeW1zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NWY5OTU0Li4wMDAwMDAwCi0tLSBhL0RvYy90b29scy9jbXBjc3ltcworKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uCi1mcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50Ci1pbXBvcnQgZXJybm8KLWltcG9ydCBvcwotaW1wb3J0IHJlCi1pbXBvcnQgc3lzCi1pbXBvcnQgc3RyaW5nCi0KLWlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgX2Jhc2UgPSBzeXMuYXJndlswXQotZWxzZToKLSAgICBfYmFzZSA9IF9fZmlsZV9fCi0KLV9zY3JpcHRfaG9tZSA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoX2Jhc2UpKQotCi1zcmNkaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKF9zY3JpcHRfaG9tZSkpCi0KLUVYQ0xVREVTID0gWyJiaXRzZXQuaCIsICJjU3RyaW5nSU8uaCIsICJncmFtaW5pdC5oIiwgImdyYW1tYXIuaCIsCi0gICAgICAgICAgICAibG9uZ2ludHJlcHIuaCIsICJtZXRhZ3JhbW1hci5oIiwKLSAgICAgICAgICAgICJub2RlLmgiLCAib3Bjb2RlLmgiLCAib3NkZWZzLmgiLCAicGdlbmhlYWRlcnMuaCIsCi0gICAgICAgICAgICAicHlfY3Vyc2VzLmgiLCAicGFyc2V0b2suaCIsICJzeW10YWJsZS5oIiwgInRva2VuLmgiXQotCi0KLWRlZiBsaXN0X2hlYWRlcnMoKToKLSAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGhlYWRlcnMuIiIiCi0gICAgaW5jZGlyID0gb3MucGF0aC5qb2luKHNyY2RpciwgIkluY2x1ZGUiKQotICAgIHJldHVybiBbb3MucGF0aC5qb2luKGluY2RpciwgZm4pIGZvciBmbiBpbiBvcy5saXN0ZGlyKGluY2RpcikKLSAgICAgICAgICAgIGlmIGZuLmVuZHN3aXRoKCIuaCIpIGFuZCBmbiBub3QgaW4gRVhDTFVERVNdCi0KLQotZGVmIG1hdGNoZXIocGF0dGVybik6Ci0gICAgcmV0dXJuIHJlLmNvbXBpbGUocGF0dGVybikuc2VhcmNoCi0KLU1BVENIRVJTID0gWwotICAgICMgWFhYIHRoaXMgc2hvdWxkIGFsc28gZGVhbCB3aXRoIGN0eXBlZGVzYywgY3ZhcmRlc2MgYW5kIGNtZW1iZXJkZXNjCi0gICAgbWF0Y2hlcihyIlxcYmVnaW5ce2NmdW5jZGVzY1x9XHsoP1A8cmVzdWx0PltefV0qKVx9XHsoP1A8c3ltPltefV0qKVx9eyg/UDxwYXJhbXM+W159XSopXH0iKSwKLSAgICBtYXRjaGVyKHIiXFxjZnVuY2xpbmVceyg/UDxyZXN1bHQ+W159KV0qKVx9XHsoP1A8c3ltPltefV0qKVx9eyg/UDxwYXJhbXM+W159XSopXH0iKSwKLSAgICBdCi0KLWRlZiBsaXN0X2RvY3VtZW50ZWRfaXRlbXMoKToKLSAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGV2ZXJ5dGhpbmcgdGhhdCdzIGFscmVhZHkgZG9jdW1lbnRlZC4iIiIKLSAgICBhcGlkaXIgPSBvcy5wYXRoLmpvaW4oc3JjZGlyLCAiRG9jIiwgImFwaSIpCi0gICAgZmlsZXMgPSBbZm4gZm9yIGZuIGluIG9zLmxpc3RkaXIoYXBpZGlyKSBpZiBmbi5lbmRzd2l0aCgiLnRleCIpXQotICAgIEwgPSBbXQotICAgIGZvciBmbiBpbiBmaWxlczoKLSAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4oYXBpZGlyLCBmbikKLQlkYXRhID0gb3BlbihmdWxsbmFtZSkucmVhZCgpCi0gICAgICAgIGZvciBtYXRjaGVyIGluIE1BVENIRVJTOgotICAgICAgICAgICAgcG9zID0gMAotICAgICAgICAgICAgd2hpbGUgMToKLSAgICAgICAgICAgICAgICBtID0gbWF0Y2hlcihkYXRhLCBwb3MpCi0gICAgICAgICAgICAgICAgaWYgbm90IG06IGJyZWFrCi0gICAgICAgICAgICAgICAgcG9zID0gbS5lbmQoKQotICAgICAgICAgICAgICAgIHN5bSA9IG0uZ3JvdXAoInN5bSIpCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gbS5ncm91cCgicmVzdWx0IikKLSAgICAgICAgICAgICAgICBwYXJhbXMgPSBtLmdyb3VwKCJwYXJhbXMiKQotCQkjIHJlcGxhY2UgYWxsIHdoaXRlc3BhY2Ugd2l0aCBhIHNpbmdsZSBvbmUKLQkJcGFyYW1zID0gIiAiLmpvaW4ocGFyYW1zLnNwbGl0KCkpIAotICAgICAgICAgICAgICAgIEwuYXBwZW5kKChzeW0sIHJlc3VsdCwgcGFyYW1zLCBmbikpCi0gICAgcmV0dXJuIEwKLQotZGVmIG5vcm1hbGl6ZV90eXBlKHQpOgotICAgIHQgPSB0LnN0cmlwKCkKLSAgICBzID0gdC5yZmluZCgiKiIpCi0gICAgaWYgcyAhPSAtMToKLSAgICAgICAgIyBzdHJpcCBldmVyeXRoaW5nIGFmdGVyIHRoZSBwb2ludGVyIG5hbWUKLSAgICAgICAgdCA9IHRbOnMrMV0KLSAgICAjIERyb3AgdGhlIHZhcmlhYmxlIG5hbWUKLSAgICBzID0gdC5zcGxpdCgpCi0gICAgdHlwZW5hbWVzID0gMQotICAgIGlmIGxlbihzKT4xIGFuZCBzWzBdPT0ndW5zaWduZWQnIGFuZCBzWzFdPT0naW50JzoKLSAgICAgICAgdHlwZW5hbWVzID0gMgotICAgIGlmIGxlbihzKSA+IHR5cGVuYW1lcyBhbmQgc1stMV1bMF0gaW4gc3RyaW5nLmxldHRlcnM6Ci0gICAgICAgIGRlbCBzWy0xXQotICAgIGlmIG5vdCBzOgotICAgICAgIHByaW50ICJYWFgiLCB0Ci0gICAgICAgcmV0dXJuICIiCi0gICAgIyBEcm9wIHJlZ2lzdGVyCi0gICAgaWYgc1swXSA9PSAicmVnaXN0ZXIiOgotICAgICAgICBkZWwgc1swXQotICAgICMgZGlzY2FyZCBhbGwgc3BhY2VzCi0gICAgcmV0dXJuICcnLmpvaW4ocykKLSAgICAKLWRlZiBjb21wYXJlX3R5cGUodDEsIHQyKToKLSAgICB0MSA9IG5vcm1hbGl6ZV90eXBlKHQxKQotICAgIHQyID0gbm9ybWFsaXplX3R5cGUodDIpCi0gICAgaWYgdDEgPT0gcidcbW9yZWFyZ3MnIGFuZCB0MiA9PSAnLi4uJzoKLSAgICAgICAgcmV0dXJuIEZhbHNlCi0gICAgaWYgdDEgIT0gdDI6Ci0gICAgICAgICNwcmludCAiZGlmZmVyZW50OiIsIHQxLCB0MgotICAgICAgICByZXR1cm4gRmFsc2UKLSAgICByZXR1cm4gVHJ1ZQotCi0KLWRlZiBjb21wYXJlX3R5cGVzKHJldCwgcGFyYW1zLCBocmV0LCBocGFyYW1zKToKLSAgICBpZiBub3QgY29tcGFyZV90eXBlKHJldCwgaHJldCk6Ci0gICAgICAgIHJldHVybiBGYWxzZQotICAgIHBhcmFtcyA9IHBhcmFtcy5zcGxpdCgiLCIpCi0gICAgaHBhcmFtcyA9IGhwYXJhbXMuc3BsaXQoIiwiKQotICAgIGlmIG5vdCBwYXJhbXMgYW5kIGhwYXJhbXMgPT0gWyd2b2lkJ106Ci0gICAgICAgIHJldHVybiBUcnVlCi0gICAgaWYgbm90IGhwYXJhbXMgYW5kIHBhcmFtcyA9PSBbJ3ZvaWQnXToKLSAgICAgICAgcmV0dXJuIFRydWUKLSAgICBpZiBsZW4ocGFyYW1zKSAhPSBsZW4oaHBhcmFtcyk6Ci0gICAgICAgIHJldHVybiBGYWxzZQotICAgIGZvciBwMSwgcDIgaW4gemlwKHBhcmFtcywgaHBhcmFtcyk6Ci0gICAgICAgIGlmIG5vdCBjb21wYXJlX3R5cGUocDEsIHAyKToKLSAgICAgICAgICAgIHJldHVybiBGYWxzZQotICAgIHJldHVybiBUcnVlCi0KLWRlZiBtYWluKCk6Ci0gICAgaGVhZGVycyA9IGxpc3RfaGVhZGVycygpCi0gICAgZG9jdW1lbnRlZCA9IGxpc3RfZG9jdW1lbnRlZF9pdGVtcygpCi0KLSAgICBsaW5lcyA9IFtdCi0gICAgZm9yIGggaW4gaGVhZGVyczoKLSAgICAgICAgZGF0YSA9IG9wZW4oaCkucmVhZCgpCi0gICAgICAgIGRhdGEsIG4gPSByZS5zdWJuKHIiUHlBUElfRlVOQ1woKFteKV0qKVwpIiwgciJcMSIsIGRhdGEpCi0gICAgICAgIG5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGgpCi0gICAgICAgIHdpdGggb3BlbihuYW1lLCAidyIpIGFzIGY6Ci0gICAgICAgICAgICBmLndyaXRlKGRhdGEpCi0gICAgICAgIGNtZCA9ICgiY3RhZ3MgLWYgLSAtLWZpbGUtc2NvcGU9bm8gLS1jLWtpbmRzPXAgLS1maWVsZHM9UyAiCi0gICAgICAgICAgICAgICAiLUlzdGF0aWNmb3J3YXJkIC1Jc3RhdGljaGVyZT1zdGF0aWMgIiArIG5hbWUpCi0gICAgICAgIHdpdGggb3MucG9wZW4oY21kKSBhcyBmOgotICAgICAgICAgICAgbGluZXMuZXh0ZW5kKGYucmVhZGxpbmVzKCkpCi0gICAgICAgIG9zLnVubGluayhuYW1lKQotICAgIEwgPSB7fQotICAgIHByZXZzeW0gPSBOb25lCi0gICAgZm9yIGxpbmUgaW4gbGluZXM6Ci0gICAgICAgIGlmIG5vdCBsaW5lOgotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgc3ltLCBmaWxlbmFtZSwgc2lnbmF0dXJlID0gbGluZS5zcGxpdChOb25lLCAyKQotICAgICAgICBpZiBzeW0gPT0gcHJldnN5bToKLSAgICAgICAgICAgIGNvbnRpbnVlCi0JZXhwciA9ICJcXiguKiklcyIgJSBzeW0KLQltID0gcmUuc2VhcmNoKGV4cHIsIHNpZ25hdHVyZSkKLSAgICAgICAgaWYgbm90IG06Ci0gICAgCSAgICBwcmludCAiQ291bGQgbm90IHNwbGl0IixzaWduYXR1cmUsICJ1c2luZyIsZXhwcgotCXJldHR5cGUgPSBtLmdyb3VwKDEpLnN0cmlwKCkKLQltID0gcmUuc2VhcmNoKCJzaWduYXR1cmU6XCgoW14pXSopXCkiLCBzaWduYXR1cmUpCi0JaWYgbm90IG06Ci0JICAgIHByaW50ICJDb3VsZCBub3QgZ2V0IHNpZ25hdHVyZSBmcm9tIiwgc2lnbmF0dXJlCi0JcGFyYW1zID0gbS5ncm91cCgxKQotCUxbc3ltXSA9IChyZXR0eXBlLCBwYXJhbXMpCi0KLSAgICBmb3Igc3ltLCByZXQsIHBhcmFtcywgZm4gaW4gZG9jdW1lbnRlZDoKLSAgICAgICAgaWYgc3ltIG5vdCBpbiBMOgotICAgICAgICAgICBwcmludCAiTm8gZGVjbGFyYXRpb24gZm9yICclcyciICUgc3ltCi0gICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIGhyZXQsIGhwYXJhbXMgPSBMW3N5bV0KLSAgICAgICAgaWYgbm90IGNvbXBhcmVfdHlwZXMocmV0LCBwYXJhbXMsIGhyZXQsIGhwYXJhbXMpOgotICAgICAgICAgICBwcmludCAiRGVjbGFyYXRpb24gZXJyb3IgZm9yICVzICglcyk6IiAlIChzeW0sIGZuKQotICAgICAgICAgICBwcmludCByZXQrIjogIitwYXJhbXMKLSAgICAgICAgICAgcHJpbnQgaHJldCsiOiAiK2hwYXJhbXMKLQotaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgICBtYWluKCkKZGlmZiAtLWdpdCBhL0RvYy90b29scy9jdXN0bGliLnB5IGIvRG9jL3Rvb2xzL2N1c3RsaWIucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMjRiMmMuLjAwMDAwMDAKLS0tIGEvRG9jL3Rvb2xzL2N1c3RsaWIucHkKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0jIEdlbmVyYXRlIGN1c3RsaWIudGV4LCB3aGljaCBpcyBhIHNpdGUtc3BlY2lmaWMgbGlicmFyeSBkb2N1bWVudC4KLQotIyBQaGFzZSBJOiBsaXN0IGFsbCB0aGUgdGhpbmdzIHRoYXQgY2FuIGJlIGltcG9ydGVkCi0KLWltcG9ydCBnbG9iCi1pbXBvcnQgb3MucGF0aAotaW1wb3J0IHN5cwotCi1tb2R1bGVzID0ge30KLQotZm9yIG1vZG5hbWUgaW4gc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzOgotICAgIG1vZHVsZXNbbW9kbmFtZV0gPSBtb2RuYW1lCi0KLWZvciBkaXIgaW4gc3lzLnBhdGg6Ci0gICAgIyBMb29rIGZvciAqLnB5IGZpbGVzCi0gICAgZmlsZWxpc3QgPSBnbG9iLmdsb2Iob3MucGF0aC5qb2luKGRpciwgJyoucHknKSkKLSAgICBmb3IgZmlsZSBpbiBmaWxlbGlzdDoKLSAgICAgICAgcGF0aCwgZmlsZSA9IG9zLnBhdGguc3BsaXQoZmlsZSkKLSAgICAgICAgYmFzZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChmaWxlKQotICAgICAgICBtb2R1bGVzW2Jhc2UubG93ZXIoKV0gPSBiYXNlCi0KLSAgICAjIExvb2sgZm9yIHNoYXJlZCBsaWJyYXJ5IGZpbGVzCi0gICAgZmlsZWxpc3QgPSAoZ2xvYi5nbG9iKG9zLnBhdGguam9pbihkaXIsICcqLnNvJykpICsKLSAgICAgICAgICAgICAgICBnbG9iLmdsb2Iob3MucGF0aC5qb2luKGRpciwgJyouc2wnKSkgKwotICAgICAgICAgICAgICAgIGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4oZGlyLCAnKi5vJykpICkKLSAgICBmb3IgZmlsZSBpbiBmaWxlbGlzdDoKLSAgICAgICAgcGF0aCwgZmlsZSA9IG9zLnBhdGguc3BsaXQoZmlsZSkKLSAgICAgICAgYmFzZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChmaWxlKQotICAgICAgICBpZiBiYXNlWy02Ol0gPT0gJ21vZHVsZSc6Ci0gICAgICAgICAgICBiYXNlID0gYmFzZVs6LTZdCi0gICAgICAgIG1vZHVsZXNbYmFzZS5sb3dlcigpXSA9IGJhc2UKLQotIyBNaW5vciBvZGRpdHk6IHRoZSB0eXBlcyBtb2R1bGUgaXMgZG9jdW1lbnRlZCBpbiBsaWJ0eXBlczIudGV4Ci1pZiAndHlwZXMnIGluIG1vZHVsZXM6Ci0gICAgZGVsIG1vZHVsZXNbJ3R5cGVzJ10KLSAgICBtb2R1bGVzWyd0eXBlczInXSA9IE5vbmUKLQotIyBQaGFzZSBJSTogZmluZCBhbGwgZG9jdW1lbnRhdGlvbiBmaWxlcyAobGliKi50ZXgpCi0jICAgICAgICAgICBhbmQgZWxpbWluYXRlIG1vZHVsZXMgdGhhdCBkb24ndCBoYXZlIG9uZS4KLQotZG9jcyA9IHt9Ci1maWxlbGlzdCA9IGdsb2IuZ2xvYignbGliKi50ZXgnKQotZm9yIGZpbGUgaW4gZmlsZWxpc3Q6Ci0gICAgbW9kbmFtZSA9IGZpbGVbMzotNF0KLSAgICBkb2NzW21vZG5hbWVdID0gbW9kbmFtZQotCi1tbGlzdCA9IGxpc3QobW9kdWxlcy5rZXlzKCkpCi1tbGlzdCA9IGZpbHRlcihsYW1iZGEgeCwgZG9jcz1kb2NzOiB4IGluIGRvY3MsIG1saXN0KQotbWxpc3Quc29ydCgpCi1tbGlzdCA9IG1hcChsYW1iZGEgeCwgZG9jcz1kb2NzOiBkb2NzW3hdLCBtbGlzdCkKLQotbW9kdWxlcyA9IG1saXN0Ci0KLSMgUGhhc2UgSUlJOiB3cml0ZSBjdXN0bGliLnRleAotCi0jIFdyaXRlIHRoZSBib2lsZXJwbGF0ZQotIyBYWFggc2hvdWxkIGJlIGZhbmNpZWQgdXAuCi1wcmludCgiIiJcZG9jdW1lbnRzdHlsZVt0d29zaWRlLDExcHQsbXlmb3JtYXRde3JlcG9ydH0KLVxcdGl0bGV7UHl0aG9uIExpYnJhcnkgUmVmZXJlbmNlfQotXFxpbnB1dHtib2lsZXJwbGF0ZX0KLVxcbWFrZWluZGV4ICAgICAgICAgICAgICAgICAgICAgJSB0ZWxsIFxcaW5kZXggdG8gYWN0dWFsbHkgd3JpdGUgdGhlIC5pZHggZmlsZQotXFxiZWdpbntkb2N1bWVudH0KLVxccGFnZW51bWJlcmluZ3tyb21hbn0KLVxcbWFrZXRpdGxlCi1cXGlucHV0e2NvcHlyaWdodH0KLVxcYmVnaW57YWJzdHJhY3R9Ci1cXG5vaW5kZW50IFRoaXMgaXMgYSBjdXN0b21pemVkIHZlcnNpb24gb2YgdGhlIFB5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZS4KLVxcZW5ke2Fic3RyYWN0fQotXFxwYWdlYnJlYWsKLXtcXHBhcnNraXAgPSAwbW0gXFx0YWJsZW9mY29udGVudHN9Ci1cXHBhZ2VicmVha1xccGFnZW51bWJlcmluZ3thcmFiaWN9IiIiKQotCi1mb3IgbW9kbmFtZSBpbiBtbGlzdDoKLSAgICBwcmludCgiXFxpbnB1dHtsaWIlc30iICUgKG1vZG5hbWUsKSkKLQotIyBXcml0ZSB0aGUgZW5kCi1wcmludCgiIiJcXGlucHV0e2N1c3RsaWIuaW5kfSAgICAgICAgICAgICAgICAgICAlIEluZGV4Ci1cXGVuZHtkb2N1bWVudH0iIiIpCmRpZmYgLS1naXQgYS9Eb2MvdG9vbHMvZmluZGNzeW1zIGIvRG9jL3Rvb2xzL2ZpbmRjc3ltcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDY4YzNjZS4uMDAwMDAwMAotLS0gYS9Eb2MvdG9vbHMvZmluZGNzeW1zCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLSMhIC91c3IvYmluL2VudiBweXRob24KLQotaW1wb3J0IGVycm5vCi1pbXBvcnQgb3MKLWltcG9ydCByZQotaW1wb3J0IHN5cwotCi1pZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIF9iYXNlID0gc3lzLmFyZ3ZbMF0KLWVsc2U6Ci0gICAgX2Jhc2UgPSBfX2ZpbGVfXwotCi1fc2NyaXB0X2hvbWUgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKF9iYXNlKSkKLQotc3JjZGlyID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShfc2NyaXB0X2hvbWUpKQotCi1FWENMVURFUyA9IFsiYml0c2V0LmgiLCAiY1N0cmluZ0lPLmgiLCAiZ3JhbWluaXQuaCIsICJncmFtbWFyLmgiLAotICAgICAgICAgICAgImxvbmdpbnRyZXByLmgiLCAibWV0YWdyYW1tYXIuaCIsCi0gICAgICAgICAgICAibm9kZS5oIiwgIm9wY29kZS5oIiwgIm9zZGVmcy5oIiwgInBnZW5oZWFkZXJzLmgiLAotICAgICAgICAgICAgInB5X2N1cnNlcy5oIiwgInBhcnNldG9rLmgiLCAic3ltdGFibGUuaCIsICJ0b2tlbi5oIl0KLQotCi1kZWYgbGlzdF9oZWFkZXJzKCk6Ci0gICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBoZWFkZXJzLiIiIgotICAgIGluY2RpciA9IG9zLnBhdGguam9pbihzcmNkaXIsICJJbmNsdWRlIikKLSAgICByZXR1cm4gW2ZuIGZvciBmbiBpbiBvcy5saXN0ZGlyKGluY2RpcikKLSAgICAgICAgICAgIGlmIGZuLmVuZHN3aXRoKCIuaCIpIGFuZCBmbiBub3QgaW4gRVhDTFVERVNdCi0KLQotZGVmIG1hdGNoZXIocGF0dGVybik6Ci0gICAgcmV0dXJuIHJlLmNvbXBpbGUocGF0dGVybikubWF0Y2gKLQotTUFUQ0hFUlMgPSBbCi0gICAgbWF0Y2hlcihyIlxcYmVnaW5ce2NmdW5jZGVzY1x9XHtbXntdKlx9XHsoP1A8c3ltPltee10qKVx9IiksCi0gICAgbWF0Y2hlcihyIlxcY2Z1bmNsaW5lXHtbXntdKlx9XHsoP1A8c3ltPltee10qKVx9IiksCi0gICAgbWF0Y2hlcihyIlxcYmVnaW5ce2N0eXBlZGVzY1x9KFxbW157XSpcXSk/XHsoP1A8c3ltPltee10qKVx9IiksCi0gICAgbWF0Y2hlcihyIlxcYmVnaW5ce2N2YXJkZXNjXH1ce1tee10qXH1ceyg/UDxzeW0+W157XSopXH0iKSwKLSAgICBtYXRjaGVyKHIiXFxiZWdpblx7Y21lbWJlcmRlc2NcfVx7W157XSpcfVx7KD9QPHN5bT5bXntdKilcfSIpLAotICAgIG1hdGNoZXIociJcXGNtZW1iZXJsaW5lXHtbXntdKlx9XHsoP1A8c3ltPltee10qKVx9IiksCi0gICAgbWF0Y2hlcihyIlxcYmVnaW5ce2NzaW1wbGVtYWNyb2Rlc2NcfVx7KD9QPHN5bT5bXntdKilcfSIpLAotICAgIF0KLQotCi1kZWYgbGlzdF9kb2N1bWVudGVkX2l0ZW1zKCk6Ci0gICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBldmVyeXRoaW5nIHRoYXQncyBhbHJlYWR5IGRvY3VtZW50ZWQuIiIiCi0gICAgYXBpZGlyID0gb3MucGF0aC5qb2luKHNyY2RpciwgIkRvYyIsICJhcGkiKQotICAgIGZpbGVzID0gW2ZuIGZvciBmbiBpbiBvcy5saXN0ZGlyKGFwaWRpcikgaWYgZm4uZW5kc3dpdGgoIi50ZXgiKV0KLSAgICBMID0gW10KLSAgICBmb3IgZm4gaW4gZmlsZXM6Ci0gICAgICAgIGZ1bGxuYW1lID0gb3MucGF0aC5qb2luKGFwaWRpciwgZm4pCi0gICAgICAgIGZvciBsaW5lIGluIG9wZW4oZnVsbG5hbWUpOgotICAgICAgICAgICAgbGluZSA9IGxpbmUubHN0cmlwKCkKLSAgICAgICAgICAgIGlmIG5vdCBsaW5lLnN0YXJ0c3dpdGgoIlxcIik6Ci0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIGZvciBtYXRjaGVyIGluIE1BVENIRVJTOgotICAgICAgICAgICAgICAgIG0gPSBtYXRjaGVyKGxpbmUpCi0gICAgICAgICAgICAgICAgaWYgbToKLSAgICAgICAgICAgICAgICAgICAgTC5hcHBlbmQobS5ncm91cCgic3ltIikpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgcmV0dXJuIEwKLQotZGVmIHNwbGl0X2RvY3VtZW50ZWQoYWxsLCBkb2N1bWVudGVkKToKLSAgICAiIiJTcGxpdCB0aGUgbGlzdCBvZiBhbGwgc3ltYm9scyBpbnRvIGRvY3VtZW50ZWQgYW5kIHVuZG9jdW1lbnRlZAotICAgIGNhdGVnb3JpZXMuIiIiCi0gICAgZG9jID0gW10KLSAgICB1bmRvYyA9IFtdCi0gICAgZm9yIHQgaW4gYWxsOgotICAgICAgICBpZiB0WzBdIGluIGRvY3VtZW50ZWQ6Ci0gICAgICAgICAgICBkb2MuYXBwZW5kKHQpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICB1bmRvYy5hcHBlbmQodCkKLSAgICByZXR1cm4gZG9jLCB1bmRvYwotCi1kZWYgcHJpbnRfbGlzdChMLCB0aXRsZT1Ob25lKToKLSAgICAiIiJEdW1wIGEgbGlzdCB0byBzdGRvdXQuIiIiCi0gICAgaWYgdGl0bGU6Ci0gICAgICAgIHByaW50IHRpdGxlICsgIjoiCi0gICAgICAgIHByaW50ICItIiAqIChsZW4odGl0bGUpICsgMSkKLSAgICB3ID0gMAotICAgIGZvciBzeW0sIGZpbGVuYW1lIGluIEw6Ci0gICAgICAgIHcgPSBtYXgodywgbGVuKHN5bSkpCi0gICAgaWYgdyAlIDQgPT0gMDoKLSAgICAgICAgdyArPSA0Ci0gICAgZWxzZToKLSAgICAgICAgdyArPSAoNCAtICh3ICUgNCkpCi0gICAgZm9yIHN5bSwgZmlsZW5hbWUgaW4gTDoKLSAgICAgICAgcHJpbnQgIiUtKnMlcyIgJSAodywgc3ltLCBmaWxlbmFtZSkKLQotCi1fc3Bjam9pbiA9ICcgJy5qb2luCi0KLWRlZiBtYWluKCk6Ci0gICAgYXJncyA9IHN5cy5hcmd2WzE6XQotICAgIGlmIGFyZ3M6Ci0gICAgICAgIGhlYWRlcnMgPSBhcmdzCi0gICAgICAgIGRvY3VtZW50ZWQgPSBbXQotICAgIGVsc2U6Ci0gICAgICAgIG9zLmNoZGlyKG9zLnBhdGguam9pbihzcmNkaXIsICJJbmNsdWRlIikpCi0gICAgICAgIGhlYWRlcnMgPSBsaXN0X2hlYWRlcnMoKQotICAgICAgICBkb2N1bWVudGVkID0gbGlzdF9kb2N1bWVudGVkX2l0ZW1zKCkKLQotICAgIGNtZCA9ICgiY3RhZ3MgLWYgLSAtLWZpbGUtc2NvcGU9bm8gLS1jLXR5cGVzPWRncHN0dXggIgotICAgICAgICAgICAiLUlzdGF0aWNmb3J3YXJkIC1Jc3RhdGljaGVyZT1zdGF0aWMgIgotICAgICAgICAgICArIF9zcGNqb2luKGhlYWRlcnMpKQotICAgIGZwID0gb3MucG9wZW4oY21kKQotICAgIEwgPSBbXQotICAgIHByZXZzeW0gPSBOb25lCi0gICAgd2hpbGUgMToKLSAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKLSAgICAgICAgaWYgbm90IGxpbmU6Ci0gICAgICAgICAgICBicmVhawotICAgICAgICBzeW0sIGZpbGVuYW1lID0gbGluZS5zcGxpdCgpWzoyXQotICAgICAgICBpZiBzeW0gPT0gcHJldnN5bToKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIGlmIG5vdCBzeW0uZW5kc3dpdGgoIl9IIik6Ci0gICAgICAgICAgICBMLmFwcGVuZCgoc3ltLCBmaWxlbmFtZSkpCi0gICAgICAgICAgICBwcmV2c3ltID0gc3ltCi0gICAgTC5zb3J0KCkKLSAgICBmcC5jbG9zZSgpCi0KLSAgICB0cnk6Ci0gICAgICAgIGlmIGRvY3VtZW50ZWQ6Ci0gICAgICAgICAgICBkb2N1bWVudGVkLCB1bmRvY3VtZW50ZWQgPSBzcGxpdF9kb2N1bWVudGVkKEwsIGRvY3VtZW50ZWQpCi0gICAgICAgICAgICBwcmludF9saXN0KGRvY3VtZW50ZWQsICJEb2N1bWVudGVkIHN5bWJvbHMiKQotICAgICAgICAgICAgaWYgdW5kb2N1bWVudGVkOgotICAgICAgICAgICAgICAgIHByaW50Ci0gICAgICAgICAgICAgICAgcHJpbnRfbGlzdCh1bmRvY3VtZW50ZWQsICJVbmRvY3VtZW50ZWQgc3ltYm9scyIpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwcmludF9saXN0KEwpCi0gICAgZXhjZXB0IElPRXJyb3IgYXMgZToKLSAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FUElQRToKLSAgICAgICAgICAgIHJhaXNlCi0KLQotaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgICBtYWluKCkKZGlmZiAtLWdpdCBhL0RvYy90b29scy9maW5kbW9kcmVmcyBiL0RvYy90b29scy9maW5kbW9kcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGM1ZjkzZi4uMDAwMDAwMAotLS0gYS9Eb2MvdG9vbHMvZmluZG1vZHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uCi0jICAtKi0gUHl0aG9uIC0qLQotCi1pbXBvcnQgZmlsZWlucHV0Ci1pbXBvcnQgZ2V0b3B0Ci1pbXBvcnQgZ2xvYgotaW1wb3J0IG9zCi1pbXBvcnQgcmUKLWltcG9ydCBzeXMKLQotCi1kZWNsYXJlX3J4ID0gcmUuY29tcGlsZSgKLSAgICByIlxcZGVjbGFyZW1vZHVsZSg/OlxbW2EtekEtWjAtOV0qXF0qKT97W2EtekEtWl8wLTldK317KFthLXpBLVpfMC05XSspfSIpCi0KLW1vZHVsZV9yeCA9IHJlLmNvbXBpbGUociJcXG1vZHVsZXsoW2EtekEtWl8wLTldKyl9IikKLQotZGVmIG1haW4oKToKLSAgICB0cnk6Ci0gICAgICAgIGp1c3RfbGlzdCA9IDAKLSAgICAgICAgcHJpbnRfbGluZW5vID0gMAotICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICJsbiIsIFsibGlzdCIsICJudW1iZXIiXSkKLSAgICAgICAgZm9yIG9wdCwgYXJnIGluIG9wdHM6Ci0gICAgICAgICAgICBpZiBvcHQgaW4gKCItbCIsICItLWxpc3QiKToKLSAgICAgICAgICAgICAgICBqdXN0X2xpc3QgPSAxCi0gICAgICAgICAgICBlbGlmIG9wdCBpbiAoIi1uIiwgIi0tbnVtYmVyIik6Ci0gICAgICAgICAgICAgICAgcHJpbnRfbGluZW5vID0gMQotICAgICAgICBmaWxlcyA9IGFyZ3MKLSAgICAgICAgaWYgbm90IGZpbGVzOgotICAgICAgICAgICAgZmlsZXMgPSBnbG9iLmdsb2IoIioudGV4IikKLSAgICAgICAgICAgIGZpbGVzLnNvcnQoKQotICAgICAgICBtb2R1bGVuYW1lID0gTm9uZQotICAgICAgICBmb3IgbGluZSBpbiBmaWxlaW5wdXQuaW5wdXQoZmlsZXMpOgotICAgICAgICAgICAgaWYgbGluZVs6OV0gPT0gciJcc2VjdGlvbnsiOgotICAgICAgICAgICAgICAgIG1vZHVsZW5hbWUgPSBOb25lCi0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIGlmIGxpbmVbOjE2XSA9PSByIlxtb2R1bGVzeW5vcHN5c3siOgotICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICBtID0gZGVjbGFyZV9yeC5tYXRjaChsaW5lKQotICAgICAgICAgICAgaWYgbToKLSAgICAgICAgICAgICAgICBtb2R1bGVuYW1lID0gbS5ncm91cCgxKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICBpZiBub3QgbW9kdWxlbmFtZToKLSAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgbSA9IG1vZHVsZV9yeC5zZWFyY2gobGluZSkKLSAgICAgICAgICAgIGlmIG06Ci0gICAgICAgICAgICAgICAgbmFtZSA9IG0uZ3JvdXAoMSkKLSAgICAgICAgICAgICAgICBpZiBuYW1lICE9IG1vZHVsZW5hbWU6Ci0gICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZWlucHV0LmZpbGVuYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgaWYganVzdF9saXN0OgotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgZmlsZW5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVpbnB1dC5uZXh0ZmlsZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVuYW1lID0gTm9uZQotICAgICAgICAgICAgICAgICAgICBlbGlmIHByaW50X2xpbmVubzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICIlcyglZCk6JXMiIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKGZpbGVuYW1lLCBmaWxlaW5wdXQuZmlsZWxpbmVubygpLCBsaW5lWzotMV0pCi0gICAgICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiJXM6JXMiICUgKGZpbGVuYW1lLCBsaW5lWzotMV0pCi0gICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgotICAgICAgICBzeXMuZXhpdCgxKQotCi0KLWlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgbWFpbigpCmRpZmYgLS1naXQgYS9Eb2MvdG9vbHMvZmluZHN5bXMgYi9Eb2MvdG9vbHMvZmluZHN5bXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNiMGY3MDkuLjAwMDAwMDAKLS0tIGEvRG9jL3Rvb2xzL2ZpbmRzeW1zCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotCi0jIFJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluIGJ5IFNraXAgTW9udGFuYXJvLCAyOCBNYXJjaCAyMDAyCi0KLSIiIgotZmluZHN5bXMucHkgLSB0cnkgdG8gaWRlbnRpZnkgdW5kb2N1bWVudGVkIHN5bWJvbHMgZXhwb3J0ZWQgYnkgbW9kdWxlcwotCi1Vc2FnZTogICAgZmluZHN5bXMucHkgbGlicmVmZGlyCi0KLUZvciBlYWNoIGxpYioudGV4IGZpbGUgaW4gdGhlIGxpYnJlZiBtYW51YWwgc291cmNlIGRpcmVjdG9yeSwgaWRlbnRpZnkgd2hpY2gKLW1vZHVsZSBpcyBkb2N1bWVudGVkLCBpbXBvcnQgdGhlIG1vZHVsZSBpZiBwb3NzaWJsZSwgdGhlbiBzZWFyY2ggdGhlIExhVGVYCi1zb3VyY2UgZm9yIHRoZSBzeW1ib2xzIGdsb2JhbCB0byB0aGF0IG1vZHVsZS4gIFJlcG9ydCBhbnkgdGhhdCBkb24ndCBzZWVtIHRvCi1iZSBkb2N1bWVudGVkLgotCi1DZXJ0YWluIGV4Y2VwdGlvbnMgYXJlIG1hZGUgdG8gdGhlIGxpc3Qgb2YgdW5kb2N1bWVudGVkIHN5bWJvbHM6Ci0KLSAgICAqIGRvbid0IG1lbnRpb24gc3ltYm9scyBpbiB3aGljaCBhbGwgbGV0dGVycyBhcmUgdXBwZXIgY2FzZSBvbiB0aGUKLSAgICAgIGFzc3VtcHRpb24gdGhleSBhcmUgbWFuaWZlc3QgY29uc3RhbnRzCi0KLSAgICAqIGRvbid0IG1lbnRpb24gc3ltYm9scyB0aGF0IGFyZSB0aGVtc2VsdmVzIG1vZHVsZXMKLQotICAgICogZG9uJ3QgbWVudGlvbiBzeW1ib2xzIHRoYXQgbWF0Y2ggdGhvc2UgZXhwb3J0ZWQgYnkgb3MsIG1hdGgsIHN0cmluZywKLSAgICAgIHR5cGVzLCBvciBfX2J1aWx0aW5fXyBtb2R1bGVzCi0KLUZpbmFsbHksIGlmIGEgbmFtZSBpcyBleHBvcnRlZCBieSB0aGUgbW9kdWxlIGJ1dCBmYWlscyBhIGdldGF0dHIoKSBsb29rdXAsCi10aGF0IGFub21hbHkgaXMgcmVwb3J0ZWQuCi0iIiIKLQotaW1wb3J0IF9fYnVpbHRpbl9fCi1pbXBvcnQgZ2V0b3B0Ci1pbXBvcnQgZ2xvYgotaW1wb3J0IG1hdGgKLWltcG9ydCBvcwotaW1wb3J0IHJlCi1pbXBvcnQgc3RyaW5nCi1pbXBvcnQgc3lzCi1pbXBvcnQgdHlwZXMKLWltcG9ydCB3YXJuaW5ncwotCi1kZWYgdXNhZ2UoKToKLSAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAiIiIKLXVzYWdlOiAlcyBkaXIKLXdoZXJlICdkaXInIGlzIHRoZSBMaWJyYXJ5IFJlZmVyZW5jZSBNYW51YWwgc291cmNlIGRpcmVjdG9yeS4KLSIiIiAlIG9zLnBhdGguYmFzZW5hbWUoc3lzLmFyZ3ZbMF0pCi0gICAgCi1kZWYgbWFpbigpOgotICAgIHRyeToKLSAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAiIikKLSAgICBleGNlcHQgZ2V0b3B0LmVycm9yOgotICAgICAgICB1c2FnZSgpCi0gICAgICAgIHJldHVybgotCi0gICAgaWYgbm90IGFyZ3M6Ci0gICAgICAgIHVzYWdlKCkKLSAgICAgICAgcmV0dXJuCi0KLSAgICBsaWJkaXIgPSBhcmdzWzBdCi0gICAgCi0gICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImVycm9yIikKLQotICAgIHBhdCA9IHJlLmNvbXBpbGUociJcXGRlY2xhcmVtb2R1bGVccyp7W159XSp9XHMqeyhbXn1dKil9IikKLQotICAgIG1pc3NpbmcgPSBbXQotICAgIGZpbGVsaXN0ID0gZ2xvYi5nbG9iKG9zLnBhdGguam9pbihsaWJkaXIsICJsaWIqLnRleCIpKQotICAgIGZpbGVsaXN0LnNvcnQoKQotICAgIGZvciBmIGluIGZpbGVsaXN0OgotICAgICAgICBtb2QgPSBmWzM6LTRdCi0gICAgICAgIGlmIG5vdCBtb2Q6IGNvbnRpbnVlCi0gICAgICAgIGRhdGEgPSBvcGVuKGYpLnJlYWQoKQotICAgICAgICBtb2RzID0gcmUuZmluZGFsbChwYXQsIGRhdGEpCi0gICAgICAgIGlmIG5vdCBtb2RzOgotICAgICAgICAgICAgcHJpbnQgIk5vIG1vZHVsZSBkZWNsYXJhdGlvbnMgZm91bmQgaW4iLCBmCi0gICAgICAgICAgICBjb250aW51ZQotICAgICAgICBmb3IgbW9kbmFtZSBpbiBtb2RzOgotICAgICAgICAgICAgIyBza2lwIHNwZWNpYWwgbW9kdWxlcwotICAgICAgICAgICAgaWYgbW9kbmFtZS5zdGFydHN3aXRoKCJfXyIpOgotICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgbW9kID0gX19pbXBvcnRfXyhtb2RuYW1lKQotICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAgICAgICAgIG1pc3NpbmcuYXBwZW5kKG1vZG5hbWUpCi0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIGV4Y2VwdCBEZXByZWNhdGlvbldhcm5pbmc6Ci0gICAgICAgICAgICAgICAgcHJpbnQgIkRlcHJlY2F0ZWQgbW9kdWxlOiIsIG1vZG5hbWUKLSAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgaWYgaGFzYXR0cihtb2QsICJfX2FsbF9fIik6Ci0gICAgICAgICAgICAgICAgYWxsID0gbW9kLl9fYWxsX18KLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgYWxsID0gW2sgZm9yIGsgaW4gZGlyKG1vZCkgaWYga1swXSAhPSAiXyJdCi0gICAgICAgICAgICBtZW50aW9uZWQgPSAwCi0gICAgICAgICAgICBhbGwuc29ydCgpCi0gICAgICAgICAgICBmb3IgbmFtZSBpbiBhbGw6Ci0gICAgICAgICAgICAgICAgaWYgZGF0YS5maW5kKG5hbWUpID09IC0xOgotICAgICAgICAgICAgICAgICAgICAjIGNlcnRhaW4gbmFtZXMgYXJlIHByZWRvbWluYW50bHkgdXNlZCBmb3IgdGVzdGluZwotICAgICAgICAgICAgICAgICAgICBpZiBuYW1lIGluICgibWFpbiIsInRlc3QiLCJfdGVzdCIpOgotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgICAgICAgICAgIyBpcyBpdCBzb21lIHNvcnQgb2YgbWFuaWZlc3QgY29uc3RhbnQ/Ci0gICAgICAgICAgICAgICAgICAgIGlmIG5hbWUudXBwZXIoKSA9PSBuYW1lOgotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IGdldGF0dHIobW9kLCBuYW1lKQotICAgICAgICAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiICAiLCBuYW1lLCAiZXhwb3NlZCwgYnV0IG5vdCBhbiBhdHRyaWJ1dGUiCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgICAgICAgICAjIGRvbid0IGNhcmUgYWJvdXQgbW9kdWxlcyB0aGF0IG1pZ2h0IGJlIGV4cG9zZWQKLSAgICAgICAgICAgICAgICAgICAgaWYgdHlwZShpdGVtKSA9PSB0eXBlcy5Nb2R1bGVUeXBlOgotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBhIGZldyBtb2R1bGVzIHdoaWNoIHRlbmQgdG8gYmUgaW1wb3J0IConZAotICAgICAgICAgICAgICAgICAgICBpc2dsb2JhbCA9IDAKLSAgICAgICAgICAgICAgICAgICAgZm9yIG0gaW4gKG9zLCBtYXRoLCBzdHJpbmcsIF9fYnVpbHRpbl9fLCB0eXBlcyk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKG0sIG5hbWUpIGFuZCBpdGVtID09IGdldGF0dHIobSwgbmFtZSk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnbG9iYWwgPSAxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICAgICAgaWYgaXNnbG9iYWw6IGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgICAgIGlmIG5vdCBtZW50aW9uZWQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiTm90IG1lbnRpb25lZCBpbiIsIG1vZG5hbWUsICJkb2NzOiIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbnRpb25lZCA9IDEKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiAgIiwgbmFtZQotICAgIGlmIG1pc3Npbmc6Ci0gICAgICAgIG1pc3Npbmcuc29ydCgpCi0gICAgICAgIHByaW50ICJDb3VsZCBub3QgaW1wb3J0OiIKLSAgICAgICAgcHJpbnQgIiAgIiwgIiwgIi5qb2luKG1pc3NpbmcpCi0KLWlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgdHJ5OgotICAgICAgICBtYWluKCkKLSAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6Ci0gICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL0RvYy90b29scy9maXhfaGFjayBiL0RvYy90b29scy9maXhfaGFjawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGRhZDExMS4uMDAwMDAwMAotLS0gYS9Eb2MvdG9vbHMvZml4X2hhY2sKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMhL2Jpbi9zaAotc2VkIC1lICdzL3tcXHB0dFsgCV0qXFxjaGFyWyAJXSonIiciJzEzN30vXy9nJyA8IiQxIiA+ICJAJDEiICYmIG12ICJAJDEiICQxCmRpZmYgLS1naXQgYS9Eb2MvdG9vbHMvZml4X2xpYmF1eC5zZWQgYi9Eb2MvdG9vbHMvZml4X2xpYmF1eC5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZiMzNjYzUuLjAwMDAwMDAKLS0tIGEvRG9jL3Rvb2xzL2ZpeF9saWJhdXguc2VkCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jISAvYmluL3NlZCAtZgotcy97XFx0dCAgXFxoYWNrc2NvcmUgIHt9XFxoYWNrc2NvcmUgIHt9L1xcc2VjdGNvZGV7X18vCi1zL1xcaGFja3Njb3JlICB7fVxcaGFja3Njb3JlICB7fS9fXy8KZGlmZiAtLWdpdCBhL0RvYy90b29scy9maXhpbmZvLmVsIGIvRG9jL3Rvb2xzL2ZpeGluZm8uZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2N2E3ZTMuLjAwMDAwMDAKLS0tIGEvRG9jL3Rvb2xzL2ZpeGluZm8uZWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0oZGVmdW4gZml4LXB5dGhvbi10ZXhpbmZvICgpCi0gIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCi0gIChyZXBsYWNlLXJlZ2V4cCAiXFwoQHNldGZpbGVuYW1lIFxcKVxcKFstYS16XSpcXCkkIgotCQkgICJcXDFweXRob24tXFwyLmluZm8iKQotICAocmVwbGFjZS1zdHJpbmcgIkBub2RlIEZyb250IE1hdHRlclxuQGNoYXB0ZXIgQWJzdHJhY3RcbiIKLQkJICAiQG5vZGUgQWJzdHJhY3RcbkBzZWN0aW9uIEFic3RyYWN0XG4iKQotICAobWFyay13aG9sZS1idWZmZXIpCi0gICh0ZXhpbmZvLW1hc3Rlci1tZW51ICd1cGRhdGUtYWxsLW5vZGVzKQotICAoc2F2ZS1idWZmZXIpCi0gICkJOzsgZml4LXB5dGhvbi10ZXhpbmZvCi0KLTs7IG5vdyByZWFsbHkgZG8gaXQ6Ci0oZmluZC1maWxlIChjYXIgY29tbWFuZC1saW5lLWFyZ3MtbGVmdCkpCi0oZml4LXB5dGhvbi10ZXhpbmZvKQotKGtpbGwtZW1hY3MpCmRpZmYgLS1naXQgYS9Eb2MvdG9vbHMvZ2V0cGFnZWNvdW50cyBiL0RvYy90b29scy9nZXRwYWdlY291bnRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYWRjNDcwLi4wMDAwMDAwCi0tLSBhL0RvYy90b29scy9nZXRwYWdlY291bnRzCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotIyEgL3Vzci9iaW4vZW52IHB5dGhvbgotCi0iIiJHZW5lcmF0ZSBhIHBhZ2UgY291bnQgcmVwb3J0IG9mIHRoZSBQb3N0U2NyaXB0IHZlcnNpb24gb2YgdGhlIG1hbnVhbHMuIiIiCi0KLV9fdmVyc2lvbl9fID0gJyRSZXZpc2lvbiQnCi0KLWltcG9ydCBnZXRvcHQKLWltcG9ydCBzeXMKLQotCi1jbGFzcyBQYWdlQ291bnRlcjoKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYuZG9jbGlzdCA9IFtdCi0gICAgICAgIHNlbGYudG90YWwgPSAwCi0gICAgICAgIHNlbGYudGl0bGVfd2lkdGggPSAwCi0gICAgICAgIHNlbGYudmVyc2lvbiA9ICIiCi0KLSAgICBkZWYgYWRkX2RvY3VtZW50KHNlbGYsIHByZWZpeCwgdGl0bGUpOgotICAgICAgICBjb3VudCA9IGNvdW50X3BhZ2VzKHByZWZpeCArICIucHMiKQotICAgICAgICBzZWxmLmRvY2xpc3QuYXBwZW5kKCh0aXRsZSwgcHJlZml4LCBjb3VudCkpCi0gICAgICAgIHNlbGYudGl0bGVfd2lkdGggPSBtYXgoc2VsZi50aXRsZV93aWR0aCwgbGVuKHRpdGxlKSkKLSAgICAgICAgc2VsZi50b3RhbCA9IHNlbGYudG90YWwgKyBjb3VudAotCi0gICAgZGVmIGR1bXAoc2VsZik6Ci0gICAgICAgIGZtdCA9ICIlJS0lZHMgICglJXMucHMsICUlZCBwYWdlcykiICUgc2VsZi50aXRsZV93aWR0aAotICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLmRvY2xpc3Q6Ci0gICAgICAgICAgICBwcmludCBmbXQgJSBpdGVtCi0gICAgICAgIHByaW50Ci0gICAgICAgIHByaW50ICIgIFRvdGFsIHBhZ2UgY291bnQ6ICAlZCIgJSBzZWxmLnRvdGFsCi0KLSAgICBkZWYgcGFyc2Vfb3B0aW9ucyhzZWxmKToKLSAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAicjoiLCBbInJlbGVhc2U9Il0pCi0gICAgICAgIGFzc2VydCBub3QgYXJncwotICAgICAgICBmb3Igb3B0LCBhcmcgaW4gb3B0czoKLSAgICAgICAgICAgIGlmIG9wdCBpbiAoIi1yIiwgIi0tcmVsZWFzZSIpOgotICAgICAgICAgICAgICAgIHNlbGYudmVyc2lvbiA9IGFyZwotCi0gICAgZGVmIHJ1bihzZWxmKToKLSAgICAgICAgc2VsZi5wYXJzZV9vcHRpb25zKCkKLSAgICAgICAgaWYgc2VsZi52ZXJzaW9uOgotICAgICAgICAgICAgdmVyc2lvbiA9IHNlbGYudmVyc2lvbls6M10KLSAgICAgICAgICAgIHNlbGYuYWRkX2RvY3VtZW50KCJ3aGF0c25ldyIgKyB2ZXJzaW9uLnJlcGxhY2UoIi4iLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2hhdCdzIE5ldyBpbiBQeXRob24gIiArIHZlcnNpb24pCi0gICAgICAgIGZvciBwcmVmaXgsIHRpdGxlIGluIFsKLSAgICAgICAgICAgICgiYXBpIiwgIlB5dGhvbi9DIEFQSSIpLAotICAgICAgICAgICAgKCJleHQiLCAiRXh0ZW5kaW5nIGFuZCBFbWJlZGRpbmcgdGhlIFB5dGhvbiBJbnRlcnByZXRlciIpLAotICAgICAgICAgICAgKCJsaWIiLCAiUHl0aG9uIExpYnJhcnkgUmVmZXJlbmNlIiksCi0gICAgICAgICAgICAoIm1hYyIsICJNYWNpbnRvc2ggTW9kdWxlIFJlZmVyZW5jZSIpLAotICAgICAgICAgICAgKCJyZWYiLCAiUHl0aG9uIFJlZmVyZW5jZSBNYW51YWwiKSwKLSAgICAgICAgICAgICgidHV0IiwgIlB5dGhvbiBUdXRvcmlhbCIpLAotICAgICAgICAgICAgKCJkb2MiLCAiRG9jdW1lbnRpbmcgUHl0aG9uIiksCi0gICAgICAgICAgICAoImluc3QiLCAiSW5zdGFsbGluZyBQeXRob24gTW9kdWxlcyIpLAotICAgICAgICAgICAgKCJkaXN0IiwgIkRpc3RyaWJ1dGluZyBQeXRob24gTW9kdWxlcyIpLAotICAgICAgICAgICAgXToKLSAgICAgICAgICAgIHNlbGYuYWRkX2RvY3VtZW50KHByZWZpeCwgdGl0bGUpCi0gICAgICAgIHByaW50IHNlbGYuUFJFRklYCi0gICAgICAgIHNlbGYuZHVtcCgpCi0gICAgICAgIHByaW50IHNlbGYuU1VGRklYCi0KLSAgICBQUkVGSVggPSAiIiJcCi1UaGlzIGlzIHRoZSBQb3N0U2NyaXB0IHZlcnNpb24gb2YgdGhlIHN0YW5kYXJkIFB5dGhvbiBkb2N1bWVudGF0aW9uLgotSWYgeW91IHBsYW4gdG8gcHJpbnQgdGhpcywgYmUgYXdhcmUgdGhhdCBzb21lIG9mIHRoZSBkb2N1bWVudHMgYXJlCi1sb25nLiAgSXQgaXMgZm9ybWF0dGVkIGZvciBwcmludGluZyBvbiB0d28tc2lkZWQgcGFwZXI7IGlmIHlvdSBkbyBwbGFuCi10byBwcmludCB0aGlzLCAqcGxlYXNlKiBwcmludCB0d28tc2lkZWQgaWYgeW91IGhhdmUgYSBwcmludGVyIGNhcGFibGUKLW9mIGl0ISAgVG8gbG9jYXRlIHB1Ymxpc2hlZCBjb3BpZXMgb2YgdGhlIGxhcmdlciBtYW51YWxzLCBvciBvdGhlcgotUHl0aG9uIHJlZmVyZW5jZSBtYXRlcmlhbCwgY29uc3VsdCB0aGUgUHl0aG9uIEJvb2tzdG9yZSBhdDoKLQotICAgIGh0dHA6Ly93aWtpLnB5dGhvbi5vcmcvbW9pbi9QeXRob25Cb29rcwotCi1UaGUgZm9sbG93aW5nIG1hbnVhbHMgYXJlIGluY2x1ZGVkIGluIHRoaXMgcGFja2FnZToKLSIiIgotICAgIFNVRkZJWCA9ICIiIlwKLQotCi1JZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zLCBjb21tZW50cywgb3Igc3VnZ2VzdGlvbnMgcmVnYXJkaW5nIHRoZXNlCi1kb2N1bWVudHMsIHBsZWFzZSBzZW5kIHRoZW0gdmlhIGVtYWlsIHRvIGRvY3NAcHl0aG9uLm9yZy4KLSIiIgotCi1kZWYgY291bnRfcGFnZXMoZmlsZW5hbWUpOgotICAgIGZwID0gb3BlbihmaWxlbmFtZSkKLSAgICBjb3VudCA9IDAKLSAgICB3aGlsZSAxOgotICAgICAgICBsaW5lcyA9IGZwLnJlYWRsaW5lcygxMDI0KjQwKQotICAgICAgICBpZiBub3QgbGluZXM6Ci0gICAgICAgICAgICBicmVhawotICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKLSAgICAgICAgICAgIGlmIGxpbmVbOjddID09ICIlJVBhZ2U6IjoKLSAgICAgICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMQotICAgIGZwLmNsb3NlKCkKLSAgICByZXR1cm4gY291bnQKLQotCi1kZWYgbWFpbigpOgotICAgIFBhZ2VDb3VudGVyKCkucnVuKCkKLQotaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgICBtYWluKCkKZGlmZiAtLWdpdCBhL0RvYy90b29scy9nZXR2ZXJzaW9uaW5mbyBiL0RvYy90b29scy9nZXR2ZXJzaW9uaW5mbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzE5OThkNS4uMDAwMDAwMAotLS0gYS9Eb2MvdG9vbHMvZ2V0dmVyc2lvbmluZm8KKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uCi0KLWltcG9ydCBvcwotaW1wb3J0IHJlCi1pbXBvcnQgc3lzCi0KLXRyeToKLSAgICBfX2ZpbGVfXwotZXhjZXB0IE5hbWVFcnJvcjoKLSAgICBfX2ZpbGVfXyA9IHN5cy5hcmd2WzBdCi0KLXRvb2xzID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpCi1Eb2MgPSBvcy5wYXRoLmRpcm5hbWUodG9vbHMpCi1zcmMgPSBvcy5wYXRoLmRpcm5hbWUoRG9jKQotcGF0Y2hsZXZlbF9oID0gb3MucGF0aC5qb2luKHNyYywgIkluY2x1ZGUiLCAicGF0Y2hsZXZlbC5oIikKLQotIyBUaGlzIHdvbid0IHBpY2sgb3V0IGFsbCAjZGVmaW5lcywgYnV0IGl0IHdpbGwgcGljayB1cCB0aGUgb25lcyB3ZQotIyBjYXJlIGFib3V0LgotcnggPSByZS5jb21waWxlKHIiXHMqI2RlZmluZVxzKyhbYS16QS1aXVthLXpBLVpfMC05XSopXHMrKFthLXpBLVpfMC05XSspIikKLQotZCA9IHt9Ci1mID0gb3BlbihwYXRjaGxldmVsX2gpCi1mb3IgbGluZSBpbiBmOgotICAgIG0gPSByeC5tYXRjaChsaW5lKQotICAgIGlmIG0gaXMgbm90IE5vbmU6Ci0gICAgICAgIG5hbWUsIHZhbHVlID0gbS5ncm91cCgxLCAyKQotICAgICAgICBkW25hbWVdID0gdmFsdWUKLWYuY2xvc2UoKQotCi1yZWxlYXNlID0gIiVzLiVzIiAlIChkWyJQWV9NQUpPUl9WRVJTSU9OIl0sIGRbIlBZX01JTk9SX1ZFUlNJT04iXSkKLW1pY3JvID0gaW50KGRbIlBZX01JQ1JPX1ZFUlNJT04iXSkKLXNob3J0dmVyc2lvbiA9IHJlbGVhc2UKLWlmIG1pY3JvICE9IDA6Ci0gICAgcmVsZWFzZSArPSAiLiIgKyBzdHIobWljcm8pCi1sZXZlbCA9IGRbIlBZX1JFTEVBU0VfTEVWRUwiXQotCi1zdWZmaXhlcyA9IHsKLSAgICAiUFlfUkVMRUFTRV9MRVZFTF9BTFBIQSI6ICJhIiwKLSAgICAiUFlfUkVMRUFTRV9MRVZFTF9CRVRBIjogICJiIiwKLSAgICAiUFlfUkVMRUFTRV9MRVZFTF9HQU1NQSI6ICJjIiwKLSAgICB9Ci0KLXJlbGVhc2VpbmZvID0gIiIKLWlmIGxldmVsICE9ICJQWV9SRUxFQVNFX0xFVkVMX0ZJTkFMIjoKLSAgICByZWxlYXNlaW5mbyA9IHN1ZmZpeGVzW2xldmVsXSArIHN0cihpbnQoZFsiUFlfUkVMRUFTRV9TRVJJQUwiXSkpCi0KLWRlZiB3cml0ZV9maWxlKG5hbWUsIHRleHQpOgotICAgICIiIldyaXRlIHRleHQgdG8gYSBmaWxlIGlmIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgaWYgdGV4dAotICAgIGRpZmZlcnMgZnJvbSBhbnkgZXhpc3RpbmcgY29udGVudC4iIiIKLSAgICBpZiBvcy5wYXRoLmV4aXN0cyhuYW1lKToKLSAgICAgICAgZiA9IG9wZW4obmFtZSwgInIiKQotICAgICAgICBzID0gZi5yZWFkKCkKLSAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgIGlmIHMgPT0gdGV4dDoKLSAgICAgICAgICAgIHJldHVybgotICAgIGYgPSBvcGVuKG5hbWUsICJ3IikKLSAgICBmLndyaXRlKHRleHQpCi0gICAgZi5jbG9zZSgpCi0KLXBhdGNobGV2ZWxfdGV4ID0gb3MucGF0aC5qb2luKERvYywgImNvbW1vbnRleCIsICJwYXRjaGxldmVsLnRleCIpCi0KLXdyaXRlX2ZpbGUocGF0Y2hsZXZlbF90ZXgsCi0gICAgICAgICAgICIlJSBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IC4uL3Rvb2xzL2dldHZlcnNpb25pbmZvO1xuIgotICAgICAgICAgICAiJSUgZG8gbm90IGVkaXQgbWFudWFsbHkuXG4iCi0gICAgICAgICAgICJcbiIKLSAgICAgICAgICAgIlxccmVsZWFzZXslc31cbiIKLSAgICAgICAgICAgIlxcc2V0cmVsZWFzZWluZm97JXN9XG4iCi0gICAgICAgICAgICJcXHNldHNob3J0dmVyc2lvbnslc31cbiIKLSAgICAgICAgICAgJSAocmVsZWFzZSwgcmVsZWFzZWluZm8sIHNob3J0dmVyc2lvbikpCi0KLXByaW50KHJlbGVhc2UgKyByZWxlYXNlaW5mbykKZGlmZiAtLWdpdCBhL0RvYy90b29scy9odG1sMnRleGkucGwgYi9Eb2MvdG9vbHMvaHRtbDJ0ZXhpLnBsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZGNmZDQ2Li4wMDAwMDAwCi0tLSBhL0RvYy90b29scy9odG1sMnRleGkucGwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUwICswLDAgQEAKLSMhIC91c3IvYmluL2VudiBwZXJsCi0jIGh0bWwydGV4aS5wbCAtLSBDb252ZXJ0IEhUTUwgZG9jdW1lbnRhdGlvbiB0byBUZXhpbmZvIGZvcm1hdAotIyBNaWNoYWVsIEVybnN0IDxtZXJuc3RAY3Mud2FzaGluZ3Rvbi5lZHU+Ci0jIFRpbWUtc3RhbXA6IDwxOTk5LTAxLTEyIDIxOjM0OjI3IG1lcm5zdD4KLQotIyBUaGlzIHByb2dyYW0gY29udmVydHMgSFRNTCBkb2N1bWVudGF0aW9uIHRyZWVzIGludG8gVGV4aW5mbyBmb3JtYXQuCi0jIEdpdmVuIHRoZSBuYW1lIG9mIGEgbWFpbiAob3IgY29udGVudHMpIEhUTUwgZmlsZSwgaXQgcHJvY2Vzc2VzIHRoYXQgZmlsZSwKLSMgYW5kIG90aGVyIGZpbGVzICh0cmFuc2l0aXZlbHkpIHJlZmVyZW5jZWQgYnkgaXQsIGludG8gYSBUZXhpbmZvIGZpbGUKLSMgKHdob3NlIG5hbWUgaXMgY2hvc2VuIGZyb20gdGhlIGZpbGUgb3IgZGlyZWN0b3J5IG5hbWUgb2YgdGhlIGFyZ3VtZW50KS4KLSMgRm9yIGluc3RhbmNlOgotIyAgIGh0bWwydGV4aS5wbCBhcGkvaW5kZXguaHRtbAotIyBwcm9kdWNlcyBmaWxlICJhcGkudGV4aSIuCi0KLSMgVGV4aW5mbyBmb3JtYXQgY2FuIGJlIGVhc2lseSBjb252ZXJ0ZWQgdG8gSW5mbyBmb3JtYXQgKGZvciBicm93c2luZyBpbgotIyBFbWFjcyBvciB0aGUgc3RhbmRhbG9uZSBJbmZvIGJyb3dzZXIpLCB0byBhIHByaW50ZWQgbWFudWFsLCBvciB0byBIVE1MLgotIyBUaHVzLCBodG1sMnRleGkucGwgcGVybWl0cyBjb252ZXJzaW9uIG9mIEhUTUwgZmlsZXMgdG8gSW5mbyBmb3JtYXQsIGFuZAotIyBzZWNvbmRhcmlseSBlbmFibGVzIHByb2R1Y2luZyBwcmludGVkIHZlcnNpb25zIG9mIFdlYiBwYWdlIGhpZXJhcmNoaWVzLgotCi0jIFVubGlrZSBIVE1MLCBJbmZvIGZvcm1hdCBpcyBzZWFyY2hhYmxlLiAgU2luY2UgSW5mbyBpcyBpbnRlZ3JhdGVkIGludG8KLSMgRW1hY3MsIG9uZSBjYW4gcmVhZCBkb2N1bWVudGF0aW9uIHdpdGhvdXQgc3RhcnRpbmcgYSBzZXBhcmF0ZSBXZWIKLSMgYnJvd3Nlci4gIEFkZGl0aW9uYWxseSwgSW5mbyBicm93c2VycyAoaW5jbHVkaW5nIEVtYWNzKSBjb250YWluCi0jIGNvbnZlbmllbnQgZmVhdHVyZXMgbWlzc2luZyBmcm9tIFdlYiBicm93c2Vycywgc3VjaCBhcyBlYXN5IGluZGV4IGxvb2t1cAotIyBhbmQgbW91c2UtZnJlZSBicm93c2luZy4KLQotIyBMaW1pdGF0aW9uczoKLSMgaHRtbDJ0ZXhpLnBsIGlzIGN1cnJlbnRseSB0dW5lZCB0byBsYXRleDJodG1sIG91dHB1dCAoYW5kIGl0IGNvcnJlY3RzCi0jIHNldmVyYWwgbGF0ZXgyaHRtbCBidWdzKSwgYnV0IHNob3VsZCBiZSBleHRlbnNpYmxlIHRvIGFyYml0cmFyeSBIVE1MCi0jIGRvY3VtZW50cy4gIEl0IHdpbGwgYmUgbW9zdCB1c2VmdWwgZm9yIEhUTUwgd2l0aCBhIGhpZXJhcmNoaWNhbCBzdHJ1Y3R1cmUKLSMgYW5kIGFuIGluZGV4LCBhbmQgaXQgcmVjb2duaXplcyB0aG9zZSBmZWF0dXJlcyBhcyBjcmVhdGVkIGJ5IGxhdGV4Mmh0bWwKLSMgKGFuZCBwb3NzaWJseSBieSBzb21lIG90aGVyIHRvb2xzKS4gIFRoZSBIVE1MIHRyZWUgdG8gYmUgdHJhdmVyc2VkIG11c3QKLSMgYmUgb24gbG9jYWwgZGlzaywgcmF0aGVyIHRoYW4gYmVpbmcgYWNjZXNzZWQgdmlhIEhUVFAuCi0jIFRoaXMgc2NyaXB0IHJlcXVpcmVzIHRoZSB1c2Ugb2YgImNoZWNrYXJncy5wbSIuICBUbyBlbGltaW5hdGUgdGhhdAotIyBkZXBlbmRlbmNlLCByZXBsYWNlIGNhbGxzIHRvIGNoZWNrX2FyZ3MqIGJ5IEBfICh3aGljaCBpcyBhbHdheXMgdGhlIGxhc3QKLSMgYXJndW1lbnQgdG8gdGhvc2UgZnVuY3Rpb25zKS4KLSMgQWxzbyBzZWUgdGhlICJ0byBkbyIgc2VjdGlvbiwgYmVsb3cuCi0jIENvbW1lbnRzLCBzdWdnZXN0aW9ucywgYnVnIGZpeGVzLCBhbmQgZW5oYW5jZW1lbnRzIGFyZSB3ZWxjb21lLgotCi0jIFRyb3VibGVzaG9vdGluZzoKLSMgTWFsZm9ybWVkIEhUTUwgY2FuIGNhdXNlIHRoaXMgcHJvZ3JhbSB0byBhYm9ydCwgc28KLSMgeW91IHNob3VsZCBjaGVjayB5b3VyIEhUTUwgZmlsZXMgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIGxlZ2FsLgotCi0KLSMjIwotIyMjIFR5cGljYWwgdXNhZ2UgZm9yIHRoZSBQeXRob24gZG9jdW1lbnRhdGlvbjoKLSMjIwotCi0jIChBY3R1YWxseSwgbW9zdCBvZiB0aGlzIGlzIGluIGEgTWFrZWZpbGUgaW5zdGVhZC4pCi0jIFRoZSByZXN1bHRpbmcgSW5mbyBmb3JtYXQgUHl0aG9uIGRvY3VtZW50YXRpb24gaXMgY3VycmVudGx5IGF2YWlsYWJsZSBhdAotIyBmdHA6Ly9mdHAuY3Mud2FzaGluZ3Rvbi5lZHUvaG9tZXMvbWVybnN0L3B5dGhvbi1pbmZvLnRhci5negotCi0jIEZpeCB1cCBIVE1MIHByb2JsZW1zLCBlZyA8RFQ+PERMIENPTVBBQ1Q+PEREPiBzaG91bGQgYmUgPERUPjxETCBDT01QQUNUPjxERD4uCi0KLSMgaHRtbDJ0ZXhpLnBsIC9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS9pbmRleC5odG1sCi0jIGh0bWwydGV4aS5wbCAvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9leHQvaW5kZXguaHRtbAotIyBodG1sMnRleGkucGwgL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvbGliL2luZGV4Lmh0bWwKLSMgaHRtbDJ0ZXhpLnBsIC9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL21hYy9pbmRleC5odG1sCi0jIGh0bWwydGV4aS5wbCAvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9yZWYvaW5kZXguaHRtbAotIyBodG1sMnRleGkucGwgL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvdHV0L2luZGV4Lmh0bWwKLQotIyBFZGl0IHRoZSBnZW5lcmF0ZWQgLnRleGkgZmlsZXM6Ci0jICAgKiBjaGFuZ2UgQHNldGZpbGVuYW1lIHRvIHByZWZpeCAicHl0aG9uLSIKLSMgICAqIGZpeCB1cCBhbnkgc2VjdGlvbmluZywgc3VjaCBhcyBmb3IgQWJzdHJhY3QKLSMgICAqIG1ha2UgVGV4aW5mbyBtZW51cwotIyAgICogcGVyaGFwcyByZW1vdmUgdGhlIEBkZXRhaWxtZW51IC4uLiBAZW5kIGRldGFpbG1lbnUKLSMgSW4gRW1hY3MsIHRvIGRvIGFsbCB0aGlzOgotIyAgIChwcm9nbiAoZ290by1jaGFyIChwb2ludC1taW4pKSAocmVwbGFjZS1yZWdleHAgIlxcKEBzZXRmaWxlbmFtZSBcXClcXChbLWEtel0qXFwpJCIgIlxcMXB5dGhvbi1cXDIuaW5mbyIpIChyZXBsYWNlLXN0cmluZyAiQG5vZGUgRnJvbnQgTWF0dGVyXG5AY2hhcHRlciBBYnN0cmFjdFxuIiAiQG5vZGUgQWJzdHJhY3RcbkBzZWN0aW9uIEFic3RyYWN0XG4iKSAocHJvZ24gKG1hcmstd2hvbGUtYnVmZmVyKSAodGV4aW5mby1tYXN0ZXItbWVudSAndXBkYXRlLWFsbC1ub2RlcykpIChzYXZlLWJ1ZmZlcikpCi0KLSMgbWFrZWluZm8gYXBpLnRleGkKLSMgbWFrZWluZm8gZXh0LnRleGkKLSMgbWFrZWluZm8gbGliLnRleGkKLSMgbWFrZWluZm8gbWFjLnRleGkKLSMgbWFrZWluZm8gcmVmLnRleGkKLSMgbWFrZWluZm8gdHV0LnRleGkKLQotCi0jIyMKLSMjIyBTdHJ1Y3R1cmUgb2YgdGhlIGNvZGUKLSMjIwotCi0jIFRvIGJlIHdyaXR0ZW4uLi4KLQotCi0jIyMKLSMjIyBEZXNpZ24gZGVjaXNpb25zCi0jIyMKLQotIyBTb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGxhbmd1YWdlcwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyAKLSMgVGhlIGdvYWwgaXMgSW5mbyBmaWxlczsgSSBjcmVhdGUgVGV4aW5mbywgc28gSSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0Ci0jIHRoZSBmaW5lciBkZXRhaWxzIG9mIEluZm8gZmlsZSBjcmVhdGlvbi4gIChJJ20gbm90IGV2ZW4gc3VyZSBvZiBpdHMgZXhhY3QKLSMgZm9ybWF0LikKLSMgCi0jIFdoeSBub3Qgc3RhcnQgZnJvbSBMYVRlWCByYXRoZXIgdGhhbiBIVE1MPwotIyBJIGNvdWxkIGhhY2sgbGF0ZXgyaHRtbCBpdHNlbGYgdG8gcHJvZHVjZSBUZXhpbmZvIGluc3RlYWQsIG9yIGZpeCB1cAotIyBwYXJ0cGFyc2UucHkgKHdoaWNoIGFscmVhZHkgdHJhbnNsYXRlcyBMYVRlWCB0byBUZWluZm8pLgotIyAgUHJvczoKLSMgICAqIGhhcyBoaWdoLWxldmVsIGluZm9ybWF0aW9uIHN1Y2ggYXMgaW5kZXggZW50cmllcywgb3JpZ2luYWwgZm9ybWF0dGluZwotIyAgQ29uczoKLSMgICAqIHRob3NlIHByb2dyYW1zIGFyZSBjb21wbGljYXRlZCB0byByZWFkIGFuZCB1bmRlcnN0YW5kCi0jICAgKiB0aG9zZSBwcm9ncmFtcyB0cnkgdG8gaGFuZGxlIGFyYml0cmFyeSBMYVRlWCBpbnB1dCwgdHJhY2sgY2F0Y29kZXMsCi0jICAgICBhbmQgbW9yZTogIEkgZG9uJ3Qgd2FudCB0byBnbyB0byB0aGF0IGVmZm9ydC4gIEhUTUwgaXNuJ3QgYXMgcG93ZXJmdWwKLSMgICAgIGFzIExhVGVYLCBzbyB0aGVyZSBhcmUgZmV3ZXIgc3VidGxldGllcy4KLSMgICAqIHRoZSByZXN1bHQgd291bGRuJ3Qgd29yayBmb3IgYXJiaXRyYXJ5IEhUTUwgZG9jdW1lbnRzOyBpdCB3b3VsZCBiZQotIyAgICAgbmljZSB0byBldmVudHVhbGx5IGV4dGVuZCB0aGlzIHByb2dyYW0gdG8gSFRNTCBwcm9kdWNlZCBmcm9tIERvY2Jvb2ssCi0jICAgICBGcmFtZSwgYW5kIG1vcmUuCi0KLSMgUGFyc2luZwotIyAtLS0tLS0tCi0jIAotIyBJIGRvbid0IHdhbnQgdG8gdmlldyB0aGUgdGV4dCBhcyBhIGxpbmVhciBzdHJlYW07IEknZCByYXRoZXIgcGFyc2UgdGhlCi0jIHdob2xlIHRoaW5nIGFuZCB0aGVuIGRvIHBhdHRlcm4gbWF0Y2hpbmcgb3ZlciB0aGUgcGFyc2VkIHJlcHJlc2VudGF0aW9uICh0bwotIyBmaW5kIGlkaW9tcyBzdWNoIGFzIGluZGljZXMsIGxpc3RzIG9mIGNoaWxkIG5vZGVzLCBldGMuKS4KLSMgICogUGVybCBwcm92aWRlcyBIVE1MOjpUcmVlQnVpbGRlciwgd2hpY2ggZG9lcyBqdXN0IHdoYXQgSSB3YW50LgotIyAgICAgKiBsaWJ3d3ctcGVybDogaHR0cDovL3d3dy5saW5wcm8ubm8vbHdwLwotIyAgICAgKiBUcmVlQnVpbGRlcjogSFRNTC1UcmVlLTAuNTEudGFyLmd6Ci0jICAqIFB5dGhvbiBQYXJzZXJzLCBGb3JtYXR0ZXJzLCBhbmQgV3JpdGVycyBkb24ndCByZWFsbHkgcHJvdmlkZSB0aGUgcmlnaHQKLSMgICAgaW50ZXJmYWNlIChhbmQgdGhlIHZlcnNpb24gaW4gR3JhaWwgZG9lc24ndCBjb3JyZXNwb25kIHRvIGFub3RoZXIKLSMgICAgZGlzdHJpYnV0ZWQgdmVyc2lvbiwgc28gSSdtIGNvbmZ1c2VkIGFib3V0IHdoaWNoIHRvIGJlIHVzaW5nKS4gIEkgY291bGQKLSMgICAgd3JpdGUgc29tZXRoaW5nIGluIFB5dGhvbiB0aGF0IGNyZWF0ZXMgYSBwYXJzZSB0cmVlLCBidXQgd2h5IGJvdGhlcj8KLQotIyBPdGhlciBpbXBsZW1lbnRhdGlvbiBsYW5ndWFnZSBpc3N1ZXM6Ci0jICAqIFB5dGhvbiBsYWNrcyB2YXJpYWJsZSBkZWNsYXJhdGlvbnMsIHJlYXNvbmFibGUgc2NvcGluZywgYW5kIHN0YXRpYwotIyAgICBjaGVja2luZyB0b29scy4gIEkndmUgd3JpdHRlbiBzb21lIG9mIHRoZSBsYXR0ZXIgZm9yIG15c2VsZiB0aGF0IG1ha2UKLSMgICAgbXkgUGVybCBwcm9ncmFtbWluZyBhIGxvdCBzYWZlciB0aGFuIG15IFB5dGhvbiBwcm9ncmFtbWluZyB3aWxsIGJlIHVudGlsCi0jICAgIEkgaGF2ZSBhIHNpbWlsYXIgc3VpdGUgZm9yIHRoYXQgbGFuZ3VhZ2UuCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyMgVG8gZG8KLSMjIwotCi0jIFNlY3Rpb24gbmFtZXM6Ci0jICAgRml4IHRoZSBwcm9ibGVtIHdpdGggbXVsdGlwbGUgc2VjdGlvbnMgaW4gYSBzaW5nbGUgZmlsZSAoZWcsIEFic3RyYWN0IGluCi0jICAgICBGcm9udCBNYXR0ZXIgc2VjdGlvbikuCi0jICAgRGVhbCB3aXRoIGNyb3NzLXJlZmVyZW5jZXMsIGFzIGluIC9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL3JlZi90eXBlcy5odG1sOjMxMAotIyBJbmRleDoKLSMgICBQZXJoYXBzIGRvdWJsZS1jaGVjayB0aGF0IGV2ZXJ5IHRhZyBtZW50aW9uZWQgaW4gdGhlIGluZGV4IGlzIGZvdW5kCi0jICAgICBpbiB0aGUgdGV4dC4KLSMgUHl0aG9uOiAgZW1haWwgdG8gZG9jc0BweXRob24ub3JnLCB0byBnZXQgdGhlaXIgZmVlZGJhY2suCi0jICAgQ29tcGFyZSB0byBleGlzdGluZyBsaWIvIEluZm8gbWFudWFsCi0jICAgV3JpdGUgdGhlIGhvb2tzIGludG8gaW5mby1sb29rOyByZXBsYWNlIHB5bGlibG9va3VwMS0xLnRhci5nei4KLSMgICBQb3N0cGFzcyB0byByZW1vdmUgZXh0cmEgcXVvdGF0aW9uIG1hcmtzIGFyb3VuZCB0eXBvZ3JhcGh5IGFscmVhZHkgaW4KLSMgICAgIGEgZGlmZmVyZW50IGZvbnQgKHRvIGF2b2lkIGRvdWJsZSBkZWxpbWl0ZXJzIGFzIGluICJgY29kZSciKTsgb3IKLSMgICAgIHBlcmhhcHMgY29uc2lkZXIgdXNpbmcgb25seSBmb250LWJhc2VkIG1hcmt1cCBzbyB0aGF0IHdlIGRvbid0IGdldAotIyAgICAgdGhlIGV4dHJhICpib2xkKiBhbmQgYGNvZGUnIG1hcmt1cCBpbiBJbmZvLgotCi0jIyBQZXJoYXBzIGRvbid0IHJlbHkgb24gYXV0b21hdGljIG1lYW5zIGZvciBhZGRpbmcgdXAsIG5leHQsIHByZXY7IEkgaGF2ZQotIyMgYWxsIHRoYXQgaW5mbyBhdmFpbGFibGUgdG8gbWUgYWxyZWFkeSwgc28gaXQncyBub3Qgc28gbXVjaCB0cm91YmxlIHRvCi0jIyBhZGQgaXQuICAoUmlnaHQ/KSAgQnV0IGl0IGlzICpzbyogZWFzeSB0byB1c2UgRW1hY3MgaW5zdGVhZC4uLgotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMjIFN0cmljdHVyZXMKLSMjIwotCi0jIG1hbiBIVE1MOjpUcmVlQnVpbGRlcgotIyBtYW4gSFRNTDo6UGFyc2VyCi0jIG1hbiBIVE1MOjpFbGVtZW50Ci0KLSMgcmVxdWlyZSBIVE1MOjpQYXJzZXJXQ29tbWVudDsKLXJlcXVpcmUgSFRNTDo6UGFyc2VyOwotcmVxdWlyZSBIVE1MOjpUcmVlQnVpbGRlcjsKLXJlcXVpcmUgSFRNTDo6RWxlbWVudDsKLQotdXNlIEZpbGU6OkJhc2VuYW1lOwotCi11c2Ugc3RyaWN0OwotIyB1c2UgQ2FycDsKLQotdXNlIGNoZWNrYXJnczsKLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIyBWYXJpYWJsZXMKLSMjIwotCi1teSBAc2VjdGlvbl9zdGFjayA9ICgpOwkJIyBlbGVtZW50cyBhcmUgY2hhcHRlci9zZWN0aW9uL3N1YnNlYyBub2RldGl0bGVzIChJIHRoaW5rKQotbXkgJGN1cnJlbnRfcmVmX3RkZjsJCSMgZm9yIHRoZSBmaWxlIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQ7Ci0JCQkJIyAgdXNlZCBpbiBlcnJvciBtZXNzYWdlcwotbXkgJGh0bWxfZGlyZWN0b3J5OwotbXkgJWZvb3Rub3RlczsKLQotIyBGaXJzdCBlbGVtZW50IHNob3VsZCBub3QgYmUgdXNlZC4KLW15IEBzZWN0aW9ubWFya2VyID0gKCJtYW51YWwiLCAiY2hhcHRlciIsICJzZWN0aW9uIiwgInN1YnNlY3Rpb24iLCAic3Vic3Vic2VjdGlvbiIpOwotCi1teSAlaW5saW5lX21hcmt1cCA9ICgiYiIgPT4gInN0cm9uZyIsCi0JCSAgICAgImNvZGUiID0+ICJjb2RlIiwKLQkJICAgICAiaSIgPT4gImVtcGgiLAotCQkgICAgICJrYmQiID0+ICJrYmQiLAotCQkgICAgICJzYW1wIiA9PiAic2FtcCIsCi0JCSAgICAgInN0cm9uZyIgPT4gInN0cm9uZyIsCi0JCSAgICAgInR0IiA9PiAiY29kZSIsCi0JCSAgICAgInZhciIgPT4gInZhciIpOwotCi1teSBAZGVmZXJyZWRfaW5kZXhfZW50cmllcyA9ICgpOwotCi1teSBAaW5kZXhfdGl0bGVzID0gKCk7CQkjIGxpc3Qgb2YgKGZpbGVuYW1lLCB0eXBlKSBsaXN0cwotbXkgJWluZGV4X2luZm8gPSAoIkluZGV4IiA9PiBbIlxAYmxpbmRleCIsICJibCJdLAotCQkgICJDb25jZXB0IEluZGV4IiA9PiBbIlxAY2luZGV4IiwgImNwIl0sCi0JCSAgIk1vZHVsZSBJbmRleCIgPT4gWyJcQG1kaW5kZXgiLCAibWQiXSk7Ci0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyMgTWFpbi9jb250ZW50cyBwYWdlCi0jIyMKLQotIyBQcm9jZXNzIGZpcnN0LWxldmVsIHBhZ2Ugb24gaXRzIG93biwgb3IganVzdCBhIGNvbnRlbnRzIHBhZ2U/ICBXZWxsLCBJIGRvCi0jIHdhbnQgdGhlIHRpdGxlLCBhdXRob3IsIGV0Yy4sIGFuZCB0aGUgZnJvbnQgbWF0dGVyLi4uICBGb3Igbm93LCBqdXN0IGFkZAotIyB0aGF0IGJ5IGhhbmQgYXQgdGhlIGVuZC4KLQotCi0jIGRhdGEgc3RydWN0dXJlIHBvc3NpYmlsaXRpZXM6Ci0jICAqIHRyZWUtbGlrZSAobmVlZCBzb21lIGtpbmQgb2Ygc3RhY2sgd2hlbiBwcm9jZXNzaW5nIChvciBwYXJlbnQgcG9pbnRlcnMpKQotIyAgKiBsaXN0IG9mIG5hbWUgYW5kIGRlcHRoOyByZW1lbWJlciBvbGQgYW5kIG5ldyBkZXB0aHMuCi0KLSMgRWFjaCBlbGVtZW50IGlzIGEgcmVmZXJlbmNlIHRvIGEgbGlzdCBvZiAobm9kZXRpdGxlLCBkZXB0aCwgZmlsZW5hbWUpLgotbXkgQGNvbnRlbnRzX2xpc3QgPSAoKTsKLQotIyBUaGUgcHJvYmxlbSB3aXRoIGRvaW5nIGZpeHVwcyBvbiB0aGUgZmx5IGlzIHRoYXQgc29tZSBzZWN0aW9ucyBtYXkgaGF2ZQotIyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkIChhbmQgbm8gbG9uZ2VyIGF2YWlsYWJsZSkgYnkgdGhlIHRpbWUgd2Ugbm90aWNlCi0jIG90aGVycyB3aXRoIHRoZSBzYW1lIG5hbWUuICBJdCdzIHByb2JhYmx5IGJldHRlciB0byBmdWxseSBjb25zdHJ1Y3QgdGhlCi0jIGNvbnRlbnRzIGxpc3QgKHJlYWRpbmcgaW4gYWxsIGZpbGVzIG9mIGludGVyZXN0KSB1cGZyb250OyB0aGF0IHdpbGwgYWxzbwotIyBsZXQgbWUgZG8gYSBiZXR0ZXIgam9iIHdpdGggY3Jvc3MtcmVmZXJlbmNlcywgYmVjYXVzZSBhZ2FpbiwgYWxsIGZpbGVzCi0jIHdpbGwgYWxyZWFkeSBiZSByZWFkIGluLgotbXkgJWNvbnRlbnRzX2hhc2ggPSAoKTsKLW15ICVjb250ZW50c19maXh1cHMgPSAoKTsKLQotbXkgQGN1cnJlbnRfY29udGVudHNfbGlzdCA9ICgpOwotCi0jIE1lcmdlIEBjdXJyZW50X2NvbnRlbnRzX2xpc3QgaW50byBAY29udGVudHNfbGlzdCwKLSMgYW5kIHNldCBAY3VycmVudF9jb250ZW50c19saXN0IHRvIGJlIGVtcHR5Lgotc3ViIG1lcmdlX2NvbnRlbnRzX2xpc3RzICggKQoteyBjaGVja19hcmdzKDAsIEBfKTsKLQotICAjIFRocmVlIHBvc3NpYmlsaXRpZXM6Ci0gICMgICogQGNvbnRlbnRzX2xpc3QgaXMgZW1wdHk6IHJlcGxhY2UgaXQgYnkgQGN1cnJlbnRfY29udGVudHNfbGlzdC4KLSAgIyAgKiBwcmVmaXhlcyBvZiB0aGUgdHdvIGxpc3RzIGFyZSBpZGVudGljYWw6IGRvIG5vdGhpbmcKLSAgIyAgKiBAY3VycmVudF9jb250ZW50c19saXN0IGlzIGFsbCBhdCBsb3dlciBsZXZlbCB0aGFuICRjb250ZW50c19saXN0WzBdOwotICAjICAgIHByZWZpeCBAY29udGVudHNfbGlzdCBieSBAY3VycmVudF9jb250ZW50c19saXN0Ci0KLSAgaWYgKHNjYWxhcihAY3VycmVudF9jb250ZW50c19saXN0KSA9PSAwKQotICAgIHsgZGllICJlbXB0eSBjdXJyZW50X2NvbnRlbnRzX2xpc3QiOyB9Ci0KLSAgIyAgIGlmIChzY2FsYXIoQGNvbnRlbnRzX2xpc3QpID09IDApCi0gICMgICAgIHsgQGNvbnRlbnRzX2xpc3QgPSBAY3VycmVudF9jb250ZW50c19saXN0OwotICAjICAgICAgIEBjdXJyZW50X2NvbnRlbnRzX2xpc3QgPSAoKTsKLSAgIyAgICAgICByZXR1cm47IH0KLQotICAjICAgaWYgKCgkIHskY29udGVudHNfbGlzdFswXX1bMV0pIDwgKCQgeyRjdXJyZW50X2NvbnRlbnRzX2xpc3RbMF19WzFdKSkKLSAgIyAgICAgeyB1bnNoaWZ0IEBjb250ZW50c19saXN0LCBAY3VycmVudF9jb250ZW50c19saXN0OwotICAjICAgICAgIEBjdXJyZW50X2NvbnRlbnRzX2xpc3QgPSAoKTsKLSAgIyAgICAgICByZXR1cm47IH0KLQotICBmb3IgKG15ICRpPTA7ICRpPHNjYWxhcihAY3VycmVudF9jb250ZW50c19saXN0KTsgJGkrKykKLSAgICB7IG15ICRyZWZfY190ZGYgPSAkY3VycmVudF9jb250ZW50c19saXN0WyRpXTsKLSAgICAgIGlmICgkaSA+PSBzY2FsYXIoQGNvbnRlbnRzX2xpc3QpKQotCXsgcHVzaCBAY29udGVudHNfbGlzdCwgJHJlZl9jX3RkZjsKLQkgIG15ICR0aXRsZSA9ICQgeyRyZWZfY190ZGZ9WzBdOwotCSAgaWYgKGRlZmluZWQgJGNvbnRlbnRzX2hhc2h7JHRpdGxlfSkKLQkgICAgeyAkY29udGVudHNfZml4dXBzeyR0aXRsZX0gPSAxOyB9Ci0JICBlbHNlCi0JICAgIHsgJGNvbnRlbnRzX2hhc2h7JHRpdGxlfSA9IDE7IH0KLQkgIG5leHQ7IH0KLSAgICAgIG15ICRyZWZfdGRmID0gJGNvbnRlbnRzX2xpc3RbJGldOwotICAgICAgbXkgKCR0aXRsZSwgJGRlcHRoLCAkZmlsZSkgPSBAeyRyZWZfdGRmfTsKLSAgICAgIG15ICgkY190aXRsZSwgJGNfZGVwdGgsICRjX2ZpbGUpID0gQHskcmVmX2NfdGRmfTsKLQotICAgICAgaWYgKCgkdGl0bGUgbmUgJGNfdGl0bGUpCi0JICAmJiAoJGRlcHRoIDwgJGNfZGVwdGgpCi0JICAmJiAoJGZpbGUgbmUgJGNfZmlsZSkpCi0JeyBzcGxpY2UgQGNvbnRlbnRzX2xpc3QsICRpLCAwLCAkcmVmX2NfdGRmOwotCSAgaWYgKGRlZmluZWQgJGNvbnRlbnRzX2hhc2h7JGNfdGl0bGV9KQotCSAgICB7ICRjb250ZW50c19maXh1cHN7JGNfdGl0bGV9ID0gMTsgfQotCSAgZWxzZQotCSAgICB7ICRjb250ZW50c19oYXNoeyRjX3RpdGxlfSA9IDE7IH0KLQkgIG5leHQ7IH0KLQotICAgICAgaWYgKCgkdGl0bGUgbmUgJGNfdGl0bGUpCi0JICB8fCAoJGRlcHRoICE9ICRjX2RlcHRoKQotCSAgfHwgKCRmaWxlIG5lICRjX2ZpbGUpKQotCXsgZGllICgid2hpbGUgcHJvY2Vzc2luZyAkIHskY3VycmVudF9yZWZfdGRmfVsyXSBhdCBkZXB0aCAkIHskY3VycmVudF9yZWZfdGRmfVsxXSwgbWlzbWF0Y2ggYXQgaW5kZXggJGk6IiwKLQkgICAgICAgIlxuICBtYWluOiAgPDw8JHRpdGxlPj4+ICRkZXB0aCAkZmlsZSIsCi0JICAgICAgICJcbiAgY3VycjogIDw8PCRjX3RpdGxlPj4+ICRjX2RlcHRoICRjX2ZpbGUiKTsgfQotICAgIH0KLSAgQGN1cnJlbnRfY29udGVudHNfbGlzdCA9ICgpOwotfQotCi0KLQotIyBTZXQgQGN1cnJlbnRfY29udGVudHNfbGlzdCB0byBhIGxpc3Qgb2YgKHRpdGxlLCBocmVmLCBzZWN0aW9ubGV2ZWwpOwotIyAgdGhlbiBtZXJnZSB0aGF0IGxpc3QgaW50byBAY29udGVudHNfbGlzdC4KLSMgTWF5YmUgdGhpcyBmdW5jdGlvbiBzaG91bGQgYWxzbyBwcm9kdWNlIGEgbWFwCi0jICBmcm9tIHRpdGxlIChvciBocmVmKSB0byBzZWN0aW9ubGV2ZWwgKGVnICJjaGFwdGVyIj8pLgotc3ViIHByb2Nlc3NfY2hpbGRfbGlua3MgKCAkICkKLXsgbXkgKCRoZSkgPSBjaGVja19hcmdzKDEsIEBfKTsKLQotICAjICRoZS0+ZHVtcCgpOwotICBpZiAoc2NhbGFyKEBjdXJyZW50X2NvbnRlbnRzX2xpc3QpICE9IDApCi0gICAgeyBkaWUgImN1cnJlbnRfY29udGVudHNfbGlzdCBub25lbXB0eTogQGN1cnJlbnRfY29udGVudHNfbGlzdCI7IH0KLSAgJGhlLT50cmF2ZXJzZShcJmluY3JlbWVudF9jdXJyZW50X2NvbnRlbnRzX2xpc3QsICdpZ25vcmUgdGV4dCcpOwotCi0gICMgTm9ybWFsaXplIHRoZSBkZXB0aHM7IGZvciBpbnN0YW5jZSwgY29udmVydCAxLDMsNSBpbnRvIDAsMSwyLgotICBteSAlZGVwdGhzID0gKCk7Ci0gIGZvciBteSAkcmVmX3RkZiAoQGN1cnJlbnRfY29udGVudHNfbGlzdCkKLSAgICB7ICRkZXB0aHN7JCB7JHJlZl90ZGZ9WzFdfSA9IDE7IH0KLSAgbXkgQHNvcnRlZF9kZXB0aHMgPSBzb3J0IGtleXMgJWRlcHRoczsKLSAgbXkgJGN1cnJlbnRfZGVwdGggPSBzY2FsYXIoQHNlY3Rpb25fc3RhY2spLTE7Ci0gIG15ICRjdXJyZW50X2RlcHRoXzIgPSAkIHskY3VycmVudF9yZWZfdGRmfVsxXTsKLSAgaWYgKCRjdXJyZW50X2RlcHRoICE9ICRjdXJyZW50X2RlcHRoXzIpCi0gICAgeyBkaWUgIm1pc21hdGNoIGluIGN1cnJlbnQgZGVwdGhzOiAkY3VycmVudF9kZXB0aCAkY3VycmVudF9kZXB0aF8yOyAiLCBqb2luKCIsICIsIEBzZWN0aW9uX3N0YWNrKTsgfQotICBmb3IgKG15ICRpPTA7ICRpPHNjYWxhcihAc29ydGVkX2RlcHRocyk7ICRpKyspCi0gICAgeyAkZGVwdGhzeyRzb3J0ZWRfZGVwdGhzWyRpXX0gPSAkaSArICRjdXJyZW50X2RlcHRoKzE7IH0KLSAgZm9yIG15ICRyZWZfdGRmIChAY3VycmVudF9jb250ZW50c19saXN0KQotICAgIHsgJCB7JHJlZl90ZGZ9WzFdID0gJGRlcHRoc3skIHskcmVmX3RkZn1bMV19OyB9Ci0KLSAgIyBFbGltaW5hdGUgdW5pbnRlcmVzdGluZyBzZWN0aW9ucy4gIEhhcmQtY29kZWQgaGFjayBmb3Igbm93LgotICBpZiAoJCB7JGN1cnJlbnRfY29udGVudHNfbGlzdFstMV19WzBdIGVxICJBYm91dCB0aGlzIGRvY3VtZW50IC4uLiIpCi0gICAgeyBwb3AgQGN1cnJlbnRfY29udGVudHNfbGlzdDsgfQotICBpZiAoKHNjYWxhcihAY3VycmVudF9jb250ZW50c19saXN0KSA+IDEpCi0gICAgICAmJiAoJCB7JGN1cnJlbnRfY29udGVudHNfbGlzdFsxXX1bMF0gZXEgIkNvbnRlbnRzIikpCi0gICAgeyBteSAkcmVmX2ZpcnN0X3RkZiA9IHNoaWZ0IEBjdXJyZW50X2NvbnRlbnRzX2xpc3Q7Ci0gICAgICAkY3VycmVudF9jb250ZW50c19saXN0WzBdID0gJHJlZl9maXJzdF90ZGY7IH0KLQotICBmb3IgKG15ICRpPTA7ICRpPHNjYWxhcihAY3VycmVudF9jb250ZW50c19saXN0KTsgJGkrKykKLSAgICB7IG15ICRyZWZfdGRmID0gJGN1cnJlbnRfY29udGVudHNfbGlzdFskaV07Ci0gICAgICBteSAkdGl0bGUgPSAkIHskcmVmX3RkZn1bMF07Ci0gICAgICBpZiAoZXhpc3RzICRpbmRleF9pbmZveyR0aXRsZX0pCi0JeyBteSAkaW5kZXhfZmlsZSA9ICQgeyRyZWZfdGRmfVsyXTsKLQkgIG15ICgkaW5kZXhpbmdfY29tbWFuZCwgJHN1ZmZpeCkgPSBAeyRpbmRleF9pbmZveyR0aXRsZX19OwotCSAgcHJvY2Vzc19pbmRleF9maWxlKCRpbmRleF9maWxlLCAkaW5kZXhpbmdfY29tbWFuZCk7Ci0JICBwcmludCBURVhJICJcblxAZGVmaW5kZXggJHN1ZmZpeFxuIjsKLQkgIHB1c2ggQGluZGV4X3RpdGxlcywgJHRpdGxlOwotCSAgc3BsaWNlIEBjdXJyZW50X2NvbnRlbnRzX2xpc3QsICRpLCAxOwotCSAgJGktLTsgfQotICAgICAgZWxzaWYgKCR0aXRsZSA9fiAvXGJJbmRleCQvKQotCXsgcHJpbnQgU1RERVJSICJXYXJuaW5nOiBcIiR0aXRsZVwiIG1pZ2h0IGJlIGFuIGluZGV4OyBpZiBzbywgZWRpdCBcJWluZGV4X2luZm8uXG4iOyB9IH0KLQotICBtZXJnZV9jb250ZW50c19saXN0cygpOwotCi0gICMgcHJpbnRfY29udGVudHNfbGlzdCgpOwotICAjIHByaW50X2luZGV4X2luZm8oKTsKLX0KLQotCi1zdWIgaW5jcmVtZW50X2N1cnJlbnRfY29udGVudHNfbGlzdCAoICQkJCApCi17IG15ICgkaGUsICRzdGFydGZsYWcsICRkZXB0aCkgPSBjaGVja19hcmdzKDMsIEBfKTsKLSAgaWYgKCEkc3RhcnRmbGFnKQotICAgIHsgcmV0dXJuOyB9Ci0KLSAgaWYgKCRoZS0+dGFnIGVxICJsaSIpCi0gICAgeyBteSBAbGlfY29udGVudCA9IEB7JGhlLT5jb250ZW50fTsKLSAgICAgIGlmICgkbGlfY29udGVudFswXS0+dGFnIG5lICJhIikKLQl7IGRpZSAiZmlyc3QgZWxlbWVudCBvZiA8TEk+IHNob3VsZCBiZSA8QT4iOyB9Ci0gICAgICBteSAoJG5hbWUsICRocmVmLCBAY29udGVudCkgPSBhbmNob3JfaW5mbygkbGlfY29udGVudFswXSk7Ci0gICAgICAjIHVudXNlZCAkbmFtZQotICAgICAgbXkgJHRpdGxlID0gam9pbigiIiwgY29sbGVjdF90ZXh0cygkbGlfY29udGVudFswXSkpOwotICAgICAgJHRpdGxlID0gdGV4aV9yZW1vdmVfcHVuY3R1YXRpb24oJHRpdGxlKTsKLSAgICAgICMgVGhlIHByb2JsZW0gd2l0aCB0aGVzZSBpcyB0aGF0IHRoZXkgYXJlIGZvcm1hdHRlZCBkaWZmZXJlbnRseSBpbgotICAgICAgIyBAbWVudSBhbmQgQG5vZGUhCi0gICAgICAkdGl0bGUgPX4gcy9gYC9cIi9nOwotICAgICAgJHRpdGxlID1+IHMvJycvXCIvZzsKLSAgICAgICR0aXRsZSA9fiBzLyAtLSAvIC9nOwotICAgICAgcHVzaCBAY3VycmVudF9jb250ZW50c19saXN0LCBbICR0aXRsZSwgJGRlcHRoLCAkaHJlZiBdOyB9Ci0gIHJldHVybiAxOwotfQotCi0jIFNpbXBsZSB2ZXJzaW9uIGZvciBzZWN0aW9uIHRpdGxlcwotc3ViIGh0bWxfdG9fdGV4aSAoICQgKQoteyBteSAoJGhlKSA9IGNoZWNrX2FyZ3MoMSwgQF8pOwotICBpZiAoIXJlZiAkaGUpCi0gICAgeyByZXR1cm4gJGhlOyB9Ci0KLSAgbXkgJHRhZyA9ICRoZS0+dGFnOwotICBpZiAoZXhpc3RzICRpbmxpbmVfbWFya3VweyR0YWd9KQotICAgIHsgbXkgJHJlc3VsdCA9ICJcQCRpbmxpbmVfbWFya3VweyR0YWd9XHsiOwotICAgICAgZm9yIG15ICRlbHQgKEB7JGhlLT5jb250ZW50fSkKLQl7ICRyZXN1bHQgLj0gaHRtbF90b190ZXhpKCRlbHQpOyB9Ci0gICAgICAkcmVzdWx0IC49ICJcfSI7Ci0gICAgICByZXR1cm4gJHJlc3VsdDsgfQotICBlbHNlCi0gICAgeyAkaGUtPmR1bXAoKTsKLSAgICAgIGRpZSAiaHRtbF90b190ZXhpIGNvbmZ1c2VkIGJ5IDwkdGFnPiI7IH0KLX0KLQotCi0KLXN1YiBwcmludF9jb250ZW50c19saXN0ICgpCi17IGNoZWNrX2FyZ3MoMCwgQF8pOwotICBwcmludCBTVERFUlIgIkNvbnRlbnRzIGxpc3Q6XG4iOwotICBmb3IgbXkgJHJlZl90ZGYgKEBjb250ZW50c19saXN0KQotICAgIHsgbXkgKCR0aXRsZSwgJGRlcHRoLCAkZmlsZSkgPSBAeyRyZWZfdGRmfTsKLSAgICAgIHByaW50IFNUREVSUiAiJHRpdGxlICRkZXB0aCAkZmlsZVxuIjsgfQotfQotCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyMgSW5kZXgKLSMjIwotCi1teSAkbDJoX2Jyb2tlbl9saW5rX25hbWUgPSAibDJoLSI7Ci0KLQotIyBtYXAgZnJvbSBmaWxlIHRvIChtYXAgZnJvbSBhbmNob3IgbmFtZSB0byAobGlzdCBvZiBpbmRleCB0ZXh0cykpCi0jIChUaGUgbGlzdCBpcyBuZWVkZWQgd2hlbiBhIHNpbmdsZSBMYVRlWCBjb21tYW5kIGxpa2UgXGVudnZhcgotIyBleHBhbmRzIHRvIG11bHRpcGxlIFxpbmRleCBjb21tYW5kcy4pCi1teSAlZmlsZV9pbmRleF9lbnRyaWVzID0gKCk7Ci1teSAldGhpc19pbmRleF9lbnRyaWVzOwkJIyBtYXAgZnJvbSBhbmNob3IgbmFtZSB0byAobGlzdCBvZiBpbmRleCB0ZXh0cykKLQotbXkgJWZpbGVfaW5kZXhfZW50cmllc19icm9rZW4gPSAoKTsgIyBtYXAgZnJvbSBmaWxlIHRvIChsaXN0IG9mIGluZGV4IHRleHRzKQotbXkgQHRoaXNfaW5kZXhfZW50cmllc19icm9rZW47Ci0KLW15ICRpbmRleF9wcmVmaXggPSAiIjsKLW15IEBpbmRleF9wcmVmaXhlcyA9ICgpOwotCi1teSAkdGhpc19pbmRleGluZ19jb21tYW5kOwotCi1zdWIgcHJpbnRfaW5kZXhfaW5mbyAoKQoteyBjaGVja19hcmdzKDAsIEBfKTsKLSAgbXkgKCRrZXksICR2YWwpOwotICBmb3IgbXkgJGZpbGUgKHNvcnQga2V5cyAlZmlsZV9pbmRleF9lbnRyaWVzKQotICAgIHsgbXkgJWluZGV4X2VudHJpZXMgPSAleyRmaWxlX2luZGV4X2VudHJpZXN7JGZpbGV9fTsKLSAgICAgIHByaW50IFNUREVSUiAiZmlsZTogJGZpbGVcbiI7Ci0gICAgICBmb3IgbXkgJGFuYW1lIChzb3J0IGtleXMgJWluZGV4X2VudHJpZXMpCi0JeyBteSBAZW50cmllcyA9IEB7JGluZGV4X2VudHJpZXN7JGFuYW1lfX07Ci0JICBpZiAoc2NhbGFyKEBlbnRyaWVzKSA9PSAxKQotCSAgICB7IHByaW50IFNUREVSUiAiICAkYW5hbWUgOiAkZW50cmllc1swXVxuIjsgfQotCSAgZWxzZQotCSAgICB7IHByaW50IFNUREVSUiAiICAkYW5hbWUgOiAiLCBqb2luKCJcbiAgICAgIiAuICgiICIgeCBsZW5ndGgoJGFuYW1lKSksIEBlbnRyaWVzKSwgIlxuIjsgfSB9IH0KLSAgZm9yIG15ICRmaWxlIChzb3J0IGtleXMgJWZpbGVfaW5kZXhfZW50cmllc19icm9rZW4pCi0gICAgeyBteSBAZW50cmllcyA9IEB7JGZpbGVfaW5kZXhfZW50cmllc19icm9rZW57JGZpbGV9fTsKLSAgICAgIHByaW50IFNUREVSUiAiZmlsZTogJGZpbGVcbiI7Ci0gICAgICBmb3IgbXkgJGVudHJ5IChAZW50cmllcykKLQl7IHByaW50IFNUREVSUiAiICAkZW50cnlcbiI7IH0KLSAgICB9Ci19Ci0KLQotc3ViIHByb2Nlc3NfaW5kZXhfZmlsZSAoICQkICkKLXsgbXkgKCRmaWxlLCAkaW5kZXhpbmdfY29tbWFuZCkgPSBjaGVja19hcmdzKDIsIEBfKTsKLSAgIyBwcmludCAicHJvY2Vzc19pbmRleF9maWxlICRmaWxlICRpbmRleGluZ19jb21tYW5kXG4iOwotCi0gIG15ICRoZSA9IGZpbGVfdG9fdHJlZSgkaHRtbF9kaXJlY3RvcnkgLiAkZmlsZSk7Ci0gICMgJGhlLT5kdW1wKCk7Ci0KLSAgJHRoaXNfaW5kZXhpbmdfY29tbWFuZCA9ICRpbmRleGluZ19jb21tYW5kOwotICAkaGUtPnRyYXZlcnNlKFwmcHJvY2Vzc19pZl9pbmRleF9kbF9jb21wYWN0LCAnaWdub3JlIHRleHQnKTsKLSAgdW5kZWYgJHRoaXNfaW5kZXhpbmdfY29tbWFuZDsKLSAgIyBwcmludCAicHJvY2Vzc19pbmRleF9maWxlIGRvbmVcbiI7Ci19Ci0KLQotc3ViIHByb2Nlc3NfaWZfaW5kZXhfZGxfY29tcGFjdCAoICQkJCApCi17IG15ICgkaGUsICRzdGFydGZsYWcpID0gKGNoZWNrX2FyZ3MoMywgQF8pKVswLDFdOyAjICBpZ25vcmUgZGVwdGggYXJndW1lbnQKLSAgaWYgKCEkc3RhcnRmbGFnKQotICAgIHsgcmV0dXJuOyB9Ci0KLSAgaWYgKCgkaGUtPnRhZygpIGVxICJkbCIpICYmIChkZWZpbmVkICRoZS0+YXR0cignY29tcGFjdCcpKSkKLSAgICB7IHByb2Nlc3NfaW5kZXhfZGxfY29tcGFjdCgkaGUpOwotICAgICAgcmV0dXJuIDA7IH0KLSAgZWxzZQotICAgIHsgcmV0dXJuIDE7IH0KLX0KLQotCi0jIFRoZSBlbGVtZW50cyBvZiBhIDxETCBDT01QQUNUPiBsaXN0IGZyb20gYSBMYVRlWDJIVE1MIGluZGV4OgotIyAgKiBhIHNpbmdsZSBzcGFjZTogdGV4dCB0byBiZSBpZ25vcmVkCi0jICAqIDxEVD4gZWxlbWVudHMgd2l0aCBhbiBvcHRpb25hbCA8REQ+IGVsZW1lbnQgZm9sbG93aW5nIGVhY2ggb25lCi0jICAgIFR3byB0eXBlcyBvZiA8RFQ+IGVsZW1lbnRzOgotIyAgICAgKiBGb2xsb3dlZCBieSBhIDxERD4gZWxlbWVudDogIHRoZSA8RFQ+IGNvbnRhaW5zIGEgc2luZ2xlCi0jICAgICAgIHN0cmluZywgYW5kIHRoZSA8REQ+IGNvbnRhaW5zIGEgd2hpdGVzcGFjZSBzdHJpbmcgdG8gYmUgaWdub3JlZCwgYQotIyAgICAgICA8REwgQ09NUEFDVD4gdG8gYmUgcmVjdXJzaXZlbHkgcHJvY2Vzc2VkICh3aXRoIHRoZSA8RFQ+IHN0cmluZyBhcyBhCi0jICAgICAgIHByZWZpeCksIGFuZCBhIHdoaXRlc3BhY2Ugc3RyaW5nIHRvIGJlIGlnbm9yZWQuCi0jICAgICAqIE5vdCBmb2xsb3dlZCBieSBhIDxERD4gZWxlbWVudDogIGNvbnRhaW5zIGEgbGlzdCBvZiBhbmNob3JzCi0jICAgICAgIGFuZCB0ZXh0cyAoaWdub3JlIHRoZSB0ZXh0cywgd2hpY2ggYXJlIG9ubHkgd2hpdGVzcGFjZSBhbmQgY29tbWFzKS4KLSMgICAgICAgT3B0aW9uYWxseSBjb250YWlucyBhIDxETCBDT01QQUNUPiB0byBiZSByZWN1cnNpdmVseSBwcm9jZXNzZWQgKHdpdGgKLSMgICAgICAgdGhlIDxEVD4gc3RyaW5nIGFzIGEgcHJlZml4KQotc3ViIHByb2Nlc3NfaW5kZXhfZGxfY29tcGFjdCAoICQgKQoteyBteSAoJGgpID0gY2hlY2tfYXJncygxLCBAXyk7Ci0gIG15IEBjb250ZW50ID0gQHskaC0+Y29udGVudCgpfTsKLSAgZm9yIChteSAkaSA9IDA7ICRpIDwgc2NhbGFyKEBjb250ZW50KTsgJGkrKykKLSAgICB7IG15ICR0aGlzX2hlID0gJGNvbnRlbnRbJGldOwotICAgICAgaWYgKCR0aGlzX2hlLT50YWcgbmUgImR0IikKLQl7ICR0aGlzX2hlLT5kdW1wKCk7Ci0JICBkaWUgIkV4cGVjdGVkIDxEVD4gdGFnOiAiIC4gJHRoaXNfaGUtPnRhZzsgfQotICAgICAgaWYgKCgkaSA8IHNjYWxhcihAY29udGVudCkgLSAxKSAmJiAoJGNvbnRlbnRbJGkrMV0tPnRhZyBlcSAiZGQiKSkKLQl7IHByb2Nlc3NfaW5kZXhfZHRfYW5kX2RkKCR0aGlzX2hlLCAkY29udGVudFskaSsxXSk7Ci0JICAkaSsrOwl9Ci0gICAgICBlbHNlCi0JeyBwcm9jZXNzX2luZGV4X2xvbmVfZHQoJHRoaXNfaGUpOyB9IH0gfQotCi0KLQotIyBBcmd1bWVudCBpcyBhIDxEVD4gZWxlbWVudC4gIElmIGl0IGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgYW5jaG9yLCB0aGVuCi0jIHRoZSB0ZXh0cyBvZiBhbGwgc3Vic2VxdWVudCBvbmVzIGFyZSAiW0xpbmtdIi4gIEV4YW1wbGU6Ci0jICAgICAgIDxEVD4KLSMgICAgICAgICA8QSBIUkVGPSJlbWJlZGRpbmcuaHRtbCNsMmgtMjAxIj4KLSMgICAgICAgICAgICIkUEFUSCIKLSMgICAgICAgICAiLCAiCi0jICAgICAgICAgPEEgSFJFRj0iZW1iZWRkaW5nLmh0bWwjbDJoLTIwNSI+Ci0jICAgICAgICAgICAiW0xpbmtdIgotIyBPcHRpb25hbGx5IGNvbnRhaW5zIGEgPERMIENPTVBBQ1Q+IGFzIHdlbGwuICBFeGFtcGxlOgotIyA8RFQ+Ci0jICAgPEEgSFJFRj0idHlwZXMuaHRtbCNsMmgtNjE2Ij4KLSMgICAgICJhdHRyaWJ1dGUiCi0jICAgPERMIENPTVBBQ1Q+Ci0jICAgICA8RFQ+Ci0jICAgICAgIDxBIEhSRUY9ImFzc2lnbm1lbnQuaHRtbCNsMmgtMzA3NCI+Ci0jICAgICAgICAgImFzc2lnbm1lbnQiCi0jICAgICAgICIsICIKLSMgICAgICAgPEEgSFJFRj0iYXNzaWdubWVudC5odG1sI2wyaC0zMDk5Ij4KLSMgICAgICAgICAiW0xpbmtdIgotIyAgICAgPERUPgotIyAgICAgICA8QSBIUkVGPSJ0eXBlcy5odG1sI2wyaC0iPgotIyAgICAgICAgICJhc3NpZ25tZW50LCBjbGFzcyIKLQotc3ViIHByb2Nlc3NfaW5kZXhfbG9uZV9kdCAoICQgKQoteyBteSAoJGR0KSA9IGNoZWNrX2FyZ3MoMSwgQF8pOwotICBteSBAZHRjb250ZW50ID0gQHskZHQtPmNvbnRlbnQoKX07Ci0gIG15ICRhY29udGVudDsKLSAgbXkgJGFjb250ZW50X3N1ZmZpeDsKLSAgZm9yIG15ICRhIChAZHRjb250ZW50KQotICAgIHsgaWYgKCRhIGVxICIsICIpCi0JeyBuZXh0OyB9Ci0gICAgICBpZiAoIXJlZiAkYSkKLQl7ICRkdC0+ZHVtcDsKLQkgIGRpZSAiVW5leHBlY3RlZCA8RFQ+IHN0cmluZyBlbGVtZW50OiAkYSI7IH0KLQotICAgICAgaWYgKCRhLT50YWcgZXEgImRsIikKLQl7IHB1c2ggQGluZGV4X3ByZWZpeGVzLCAkaW5kZXhfcHJlZml4OwotCSAgaWYgKCFkZWZpbmVkICRhY29udGVudF9zdWZmaXgpCi0JICAgIHsgZGllICJhY29udGVudF9zdWZmaXggbm90IHlldCBkZWZpbmVkIjsgfQotCSAgJGluZGV4X3ByZWZpeCAuPSAkYWNvbnRlbnRfc3VmZml4IC4gIiwgIjsKLQkgIHByb2Nlc3NfaW5kZXhfZGxfY29tcGFjdCgkYSk7Ci0JICAkaW5kZXhfcHJlZml4ID0gcG9wKEBpbmRleF9wcmVmaXhlcyk7Ci0JICByZXR1cm47IH0KLQotICAgICAgaWYgKCRhLT50YWcgbmUgImEiKQotCXsgJGR0LT5kdW1wOwotCSAgJGEtPmR1bXA7Ci0JICBkaWUgIkV4cGVjdGVkIGFuY2hvciBpbiBsb25lIDxEVD4iOyB9Ci0KLSAgICAgIG15ICgkYW5hbWUsICRhaHJlZiwgQGFjb250ZW50KSA9IGFuY2hvcl9pbmZvKCRhKTsKLSAgICAgICMgdW51c2VkICRhbmFtZQotICAgICAgaWYgKHNjYWxhcihAYWNvbnRlbnQpICE9IDEpCi0JeyBkaWUgIkV4cGVjdGVkIGp1c3Qgb25lIGNvbnRlbnQgb2YgPEE+IGluIDxEVD46IEBhY29udGVudCI7IH0KLSAgICAgIGlmIChyZWYgJGFjb250ZW50WzBdKQotCXsgJGFjb250ZW50WzBdLT5kdW1wOwotCSAgZGllICJFeHBlY3RlZCBzdHJpbmcgY29udGVudCBvZiA8QT4gaW4gPERUPjogJGFjb250ZW50WzBdIjsgfQotICAgICAgaWYgKCFkZWZpbmVkKCRhY29udGVudCkpCi0JeyAkYWNvbnRlbnQgPSAkaW5kZXhfcHJlZml4IC4gJGFjb250ZW50WzBdOwotCSAgJGFjb250ZW50X3N1ZmZpeCA9ICRhY29udGVudFswXTsgfQotICAgICAgZWxzaWYgKCgkYWNvbnRlbnRbMF0gbmUgIltMaW5rXSIpICYmICgkYWNvbnRlbnQgbmUgKCRpbmRleF9wcmVmaXggLiAkYWNvbnRlbnRbMF0pKSkKLQl7IGRpZSAiRGlmZmVyaW5nIGNvbnRlbnQ6IDw8PCRhY29udGVudD4+PiwgPDw8JGFjb250ZW50WzBdPj4+IjsgfQotCi0gICAgICBpZiAoIWRlZmluZWQgJGFocmVmKQotCXsgJGR0LT5kdW1wOwotCSAgZGllICJubyBIUkVGIGluIG5hY2hvciBpbiA8RFQ+IjsgfQotICAgICAgbXkgKCRhaHJlZl9maWxlLCAkYWhyZWZfbmFtZSkgPSBzcGxpdCgvXCMvLCAkYWhyZWYpOwotICAgICAgaWYgKCFkZWZpbmVkICRhaHJlZl9uYW1lKQotCXsgIyBSZWZlcmVuY2UgdG8gZW50aXJlIGZpbGUKLQkgICRhaHJlZl9uYW1lID0gIiI7IH0KLQotICAgICAgaWYgKCRhaHJlZl9uYW1lIGVxICRsMmhfYnJva2VuX2xpbmtfbmFtZSkKLQl7IGlmICghZXhpc3RzICRmaWxlX2luZGV4X2VudHJpZXNfYnJva2VueyRhaHJlZl9maWxlfSkKLQkgICAgeyAkZmlsZV9pbmRleF9lbnRyaWVzX2Jyb2tlbnskYWhyZWZfZmlsZX0gPSBbXTsgfQotCSAgcHVzaCBAeyRmaWxlX2luZGV4X2VudHJpZXNfYnJva2VueyRhaHJlZl9maWxlfX0sICIkdGhpc19pbmRleGluZ19jb21tYW5kICRhY29udGVudCI7Ci0JICBuZXh0OyB9Ci0KLSAgICAgIGlmICghZXhpc3RzICRmaWxlX2luZGV4X2VudHJpZXN7JGFocmVmX2ZpbGV9KQotCXsgJGZpbGVfaW5kZXhfZW50cmllc3skYWhyZWZfZmlsZX0gPSB7fTsgfQotICAgICAgIyBEb24ndCBkbyB0aGlzISAgSXQgYXBwZWFycyB0byBtYWtlIGEgY29weSwgd2hpY2ggaXMgbm90IGRlc2lyZWQuCi0gICAgICAjIG15ICVpbmRleF9lbnRyaWVzID0gJXskZmlsZV9pbmRleF9lbnRyaWVzeyRhaHJlZl9maWxlfX07Ci0gICAgICBpZiAoIWV4aXN0cyAkIHskZmlsZV9pbmRleF9lbnRyaWVzeyRhaHJlZl9maWxlfX17JGFocmVmX25hbWV9KQotCXsgJCB7JGZpbGVfaW5kZXhfZW50cmllc3skYWhyZWZfZmlsZX19eyRhaHJlZl9uYW1lfSA9IFtdOyB9Ci0gICAgICAjIAl7IG15ICRvbGRjb250ZW50ID0gJCB7JGZpbGVfaW5kZXhfZW50cmllc3skYWhyZWZfZmlsZX19eyRhaHJlZl9uYW1lfTsKLSAgICAgICMgCSAgaWYgKCRhY29udGVudCBlcSAkb2xkY29udGVudCkKLSAgICAgICMgCSAgICB7IGRpZSAiTXVsdGlwbGUgaWRlbnRpY2FsIGluZGV4IGVudHJpZXM/IjsgfQotICAgICAgIyAJICBkaWUgIlRyeWluZyB0byBhZGQgJGFjb250ZW50LCBidXQgYWxyZWFkeSBoYXZlIGluZGV4IGVudHJ5IHBvaW50aW5nIGF0ICRhaHJlZl9maWxlXCMkYWhyZWZfbmFtZTogJHskZmlsZV9pbmRleF9lbnRyaWVzeyRhaHJlZl9maWxlfX17JGFocmVmX25hbWV9IjsgfQotCi0gICAgICBwdXNoIEB7JCB7JGZpbGVfaW5kZXhfZW50cmllc3skYWhyZWZfZmlsZX19eyRhaHJlZl9uYW1lfX0sICIkdGhpc19pbmRleGluZ19jb21tYW5kICRhY29udGVudCI7Ci0gICAgICAjIHByaW50IFNUREVSUiAia2V5czogIiwga2V5cyAleyRmaWxlX2luZGV4X2VudHJpZXN7JGFocmVmX2ZpbGV9fSwgIlxuIjsKLSAgICB9Ci19Ci0KLXN1YiBwcm9jZXNzX2luZGV4X2R0X2FuZF9kZCAoICQkICkKLXsgbXkgKCRkdCwgJGRkKSA9IGNoZWNrX2FyZ3MoMiwgQF8pOwotICBteSAkZHRjb250ZW50OwotICB7IG15IEBkdGNvbnRlbnQgPSBAeyRkdC0+Y29udGVudCgpfTsKLSAgICBpZiAoKHNjYWxhcihAZHRjb250ZW50KSAhPSAxKSB8fCAocmVmICRkdGNvbnRlbnRbMF0pKQotICAgICAgeyAkZGQtPmR1bXA7Ci0JJGR0LT5kdW1wOwotCWRpZSAiRXhwZWN0ZWQgc2luZ2xlIHN0cmluZyAoYWN0dWFsIHNpemUgPSAiIC4gc2NhbGFyKEBkdGNvbnRlbnQpIC4gIikgaW4gY29udGVudCBvZiA8RFQ+OiBAZHRjb250ZW50IjsgfQotICAgICRkdGNvbnRlbnQgPSAkZHRjb250ZW50WzBdOwotICAgICRkdGNvbnRlbnQgPX4gcy8gKyQvLzsgfQotICBteSAkZGRjb250ZW50OwotICB7IG15IEBkZGNvbnRlbnQgPSBAeyRkZC0+Y29udGVudCgpfTsKLSAgICBpZiAoc2NhbGFyKEBkZGNvbnRlbnQpICE9IDEpCi0gICAgICB7IGRpZSAiRXhwZWN0ZWQgc2luZ2xlIDxERD4gY29udGVudCwgZ290ICIsIHNjYWxhcihAZGRjb250ZW50KSwgIiBlbGVtZW50czpcbiIsIGpvaW4oIlxuIiwgQGRkY29udGVudCksICJcbiAiOyB9Ci0gICAgJGRkY29udGVudCA9ICRkZGNvbnRlbnRbMF07IH0KLSAgaWYgKCRkZGNvbnRlbnQtPnRhZyBuZSAiZGwiKQotICAgIHsgZGllICJFeHBlY3RlZCA8REw+IGFzIGNvbnRlbnQgb2YgPEREPiwgYnV0IHNhdzogJGRkY29udGVudCI7IH0KLQotICBwdXNoIEBpbmRleF9wcmVmaXhlcywgJGluZGV4X3ByZWZpeDsKLSAgJGluZGV4X3ByZWZpeCAuPSAkZHRjb250ZW50IC4gIiwgIjsKLSAgcHJvY2Vzc19pbmRleF9kbF9jb21wYWN0KCRkZGNvbnRlbnQpOwotICAkaW5kZXhfcHJlZml4ID0gcG9wKEBpbmRleF9wcmVmaXhlcyk7Ci19Ci0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyMgT3JkaW5hcnkgc2VjdGlvbnMKLSMjIwotCi1zdWIgcHJvY2Vzc19zZWN0aW9uX2ZpbGUgKCAkJCQgKQoteyBteSAoJGZpbGUsICRkZXB0aCwgJG5vZGV0aXRsZSkgPSBjaGVja19hcmdzKDMsIEBfKTsKLSAgbXkgJGhlID0gZmlsZV90b190cmVlKCgkZmlsZSA9fiAvXlwvLykgPyAkZmlsZSA6ICRodG1sX2RpcmVjdG9yeSAuICRmaWxlKTsKLQotICAjIHByaW50IFNUREVSUiAicHJvY2Vzc19zZWN0aW9uX2ZpbGU6ICRmaWxlICRkZXB0aCAkbm9kZXRpdGxlXG4iOwotCi0gICMgRXF1aXZhbGVudGx5OgotICAjICAgd2hpbGUgKCRkZXB0aCA+PSBzY2FsYXIoQHNlY3Rpb25fc3RhY2spKSB7IHBvcChAc2VjdGlvbl9zdGFjayk7IH0KLSAgQHNlY3Rpb25fc3RhY2sgPSBAc2VjdGlvbl9zdGFja1swLi4kZGVwdGgtMV07Ci0KLSAgIyBOb3QgYSBncmVhdCBub2RlbmFtZSBmaXh1cCBzY2hlbWU7IG5lZWQgYSBtb3JlIGdsb2JhbCB2aWV3Ci0gIGlmICgoZGVmaW5lZCAkY29udGVudHNfZml4dXBzeyRub2RldGl0bGV9KQotICAgICAgJiYgKHNjYWxhcihAc2VjdGlvbl9zdGFjaykgPiAwKSkKLSAgICB7IG15ICR1cF90aXRsZSA9ICRzZWN0aW9uX3N0YWNrWyQjc2VjdGlvbl9zdGFja107Ci0gICAgICAjIGhhY2sgZm9yIFB5dGhvbiBTdGFuZGFyZCBMaWJyYXJ5Ci0gICAgICAkdXBfdGl0bGUgPX4gcy9eKEJ1aWx0LWlufFN0YW5kYXJkKSBNb2R1bGUgLy9nOwotICAgICAgbXkgKCR1cF9maXJzdF93b3JkKSA9IHNwbGl0KC8gLywgJHVwX3RpdGxlKTsKLSAgICAgICRub2RldGl0bGUgPSAiJHVwX2ZpcnN0X3dvcmQgJG5vZGV0aXRsZSI7Ci0gICAgfQotCi0gIHB1c2ggQHNlY3Rpb25fc3RhY2ssICRub2RldGl0bGU7Ci0gICMgcHJpbnQgU1RERVJSICJuZXcgc2VjdGlvbl9zdGFjazogIiwgam9pbigiLCAiLCBAc2VjdGlvbl9zdGFjayksICJcbiI7Ci0KLSAgJGhlLT50cmF2ZXJzZShcJnByb2Nlc3NfaWZfY2hpbGRfbGlua3MsICdpZ25vcmUgdGV4dCcpOwotICAlZm9vdG5vdGVzID0gKCk7Ci0gICMgJGhlLT5kdW1wOwotICAkaGUtPnRyYXZlcnNlKFwmcHJvY2Vzc19pZl9mb290bm90ZXMsICdpZ25vcmUgdGV4dCcpOwotCi0gICMgJGhlLT5kdW1wOwotCi0gIGlmIChleGlzdHMgJGZpbGVfaW5kZXhfZW50cmllc3skZmlsZX0pCi0gICAgeyAldGhpc19pbmRleF9lbnRyaWVzID0gJXskZmlsZV9pbmRleF9lbnRyaWVzeyRmaWxlfX07Ci0gICAgICAjIHByaW50IFNUREVSUiAidGhpc19pbmRleF9lbnRyaWVzOlxuICIsIGpvaW4oIlxuICIsIGtleXMgJXRoaXNfaW5kZXhfZW50cmllcyksICJcbiI7Ci0gICAgfQotICBlbHNlCi0gICAgeyAjIHByaW50IFNUREVSUiAiV2FybmluZzogbm8gaW5kZXggZW50cmllcyBmb3IgZmlsZSAkZmlsZVxuIjsKLSAgICAgICV0aGlzX2luZGV4X2VudHJpZXMgPSAoKTsgfQotCi0gIGlmIChleGlzdHMgJGZpbGVfaW5kZXhfZW50cmllc19icm9rZW57JGZpbGV9KQotICAgIHsgQHRoaXNfaW5kZXhfZW50cmllc19icm9rZW4gPSBAeyRmaWxlX2luZGV4X2VudHJpZXNfYnJva2VueyRmaWxlfX07IH0KLSAgZWxzZQotICAgIHsgIyBwcmludCBTVERFUlIgIldhcm5pbmc6IG5vIGluZGV4IGVudHJpZXMgZm9yIGZpbGUgJGZpbGVcbiI7Ci0gICAgICBAdGhpc19pbmRleF9lbnRyaWVzX2Jyb2tlbiA9ICgpOyB9Ci0KLQotICBpZiAoJGhlLT50YWcoKSBuZSAiaHRtbCIpCi0gICAgeyBkaWUgIkV4cGVjdGVkIDxIVE1MPiBhdCB0b3AgbGV2ZWwiOyB9Ci0gIG15IEBjb250ZW50ID0gQHskaGUtPmNvbnRlbnQoKX07Ci0gIGlmICgoIXJlZiAkY29udGVudFswXSkgb3IgKCRjb250ZW50WzBdLT50YWcgbmUgImhlYWQiKSkKLSAgICB7ICRoZS0+ZHVtcDsKLSAgICAgIGRpZSAiPEhFQUQ+IG5vdCBmaXJzdCBlbGVtZW50IG9mIDxIVE1MPiI7IH0KLSAgaWYgKCghcmVmICRjb250ZW50WzFdKSBvciAoJGNvbnRlbnRbMV0tPnRhZyBuZSAiYm9keSIpKQotICAgIHsgJGhlLT5kdW1wOwotICAgICAgZGllICI8Qk9EWT4gbm90IHNlY29uZCBlbGVtZW50IG9mIDxIVE1MPiI7IH0KLQotICAkY29udGVudFsxXS0+dHJhdmVyc2UoXCZvdXRwdXRfYm9keSk7Ci19Ci0KLSMgc3RhY2sgb2YgdGhpbmdzIHdlJ3JlIGluc2lkZSB0aGF0IGFyZSBwcmV2ZW50aW5nIGluZGV4aW5nIGZyb20gb2NjdXJyaW5nIG5vdy4KLSMgVGhlc2UgYXJlICJoMSIsICJoMiIsICJoMyIsICJoNCIsICJoNSIsICJoNiIsICJkdCIgKGFuZCBwb3NzaWJseSBvdGhlcnM/KQotbXkgQGluZGV4X2RlZmVycmVycyA9ICgpOwotCi1zdWIgcHVzaF9vcl9wb3BfaW5kZXhfZGVmZXJyZXJzICggJCQgKQoteyBteSAoJHRhZywgJHN0YXJ0ZmxhZykgPSBjaGVja19hcmdzKDIsIEBfKTsKLSAgaWYgKCRzdGFydGZsYWcpCi0gICAgeyBwdXNoIEBpbmRleF9kZWZlcnJlcnMsICR0YWc7IH0KLSAgZWxzZQotICAgIHsgbXkgJG9sZF9kZWZlcnJlciA9IHBvcCBAaW5kZXhfZGVmZXJyZXJzOwotICAgICAgaWYgKCR0YWcgbmUgJG9sZF9kZWZlcnJlcikKLQl7IGRpZSAiRXhwZWN0ZWQgJHRhZyBhdCB0b3Agb2YgaW5kZXhfZGVmZXJyZXJzIGJ1dCBzYXcgJG9sZF9kZWZlcnJlcjsgcmVtYWluZGVyID0gIiwgam9pbigiICIsIEBpbmRleF9kZWZlcnJlcnMpOyB9Ci0gICAgICBkb19kZWZlcnJlZF9pbmRleF9lbnRyaWVzKCk7IH0KLX0KLQotCi1zdWIgbGFiZWxfYWRkX2luZGV4X2VudHJpZXMgKCAkOyQgKQoteyBteSAoJGxhYmVsLCAkaGUpID0gY2hlY2tfYXJnc19yYW5nZSgxLCAyLCBAXyk7Ci0gICMgcHJpbnQgKChleGlzdHMgJHRoaXNfaW5kZXhfZW50cmllc3skbGFiZWx9KSA/ICIqIiA6ICIgIiksICIgbGFiZWxfYWRkX2luZGV4X2VudHJpZXMgJGxhYmVsXG4iOwotICAjICRoZSBpcyB0aGUgYW5jaG9yIGVsZW1lbnQKLSAgaWYgKGV4aXN0cyAkdGhpc19pbmRleF9lbnRyaWVzeyRsYWJlbH0pCi0gICAgeyBwdXNoIEBkZWZlcnJlZF9pbmRleF9lbnRyaWVzLCBAeyR0aGlzX2luZGV4X2VudHJpZXN7JGxhYmVsfX07Ci0gICAgICByZXR1cm47IH0KLQotICBpZiAoJGxhYmVsIGVxICRsMmhfYnJva2VuX2xpbmtfbmFtZSkKLSAgICB7ICMgVHJ5IHRvIGZpbmQgc29tZSB0ZXh0IHRvIHVzZSBpbiBndWVzc2luZyB3aGljaCBsaW5rcyBzaG91bGQgcG9pbnQgaGVyZQotICAgICAgIyBJIHNob3VsZCBwcm9iYWJseSBvbmx5IGxvb2sgYXQgdGhlIHByZXZpb3VzIGVsZW1lbnQsIG9yIGlmIHRoYXQgaXMKLSAgICAgICMgYWxsIHB1bmN0dWF0aW9uLCB0aGUgb25lIGJlZm9yZSBpdDsgY29sbGVjdGluZyBhbGwgdGhlIHByZXZpb3VzIHRleHRzCi0gICAgICAjIGlzIGEgYml0IG9mIG92ZXJraWxsLgotICAgICAgbXkgQGFuY2hvcl90ZXh0cyA9IGNvbGxlY3RfdGV4dHMoJGhlKTsKLSAgICAgIG15IEBwcmV2aW91c190ZXh0cyA9IGNvbGxlY3RfdGV4dHMoJGhlLT5wYXJlbnQsICRoZSk7Ci0gICAgICAjIDQgZWxlbWVudHMgaXMgYXJiaXRyYXJ5OyBvdWdodCB0byBmaWx0ZXIgb3V0IHB1bmN0dWF0aW9uIGFuZCBzbWFsbCB3b3JkcwotICAgICAgIyBmaXJzdCwgdGhlbiBwZXJoYXBzIGtlZXAgZmV3ZXIuICBQZXJoYXBzIGFsc28gZmlsdGVyIG91dCBmb3JtYXR0aW5nIHNvCi0gICAgICAjIHRoYXQgd2UgY2FuIHNlZSBhIGxhcmdlciBjaHVuayBvZiB0ZXh0PyAgKFByb2JhYmx5IG5vdC4pCi0gICAgICAjIEFsc28gcGVyaGFwcyBzaG91bGQgZG8gZnVydGhlciBjaHVua2luZyBpbnRvIHdvcmRzLCBpbiBjYXNlIHRoZQotICAgICAgIyBpbmRleCB0ZXJtIGlzbid0IGEgY2h1bmsgb2YgaXRzIG93biAoZWcsIHdhcyBpbiA8dHQ+Li4uPC90dD4uCi0gICAgICBteSBAY2FuZGlkYXRlX3RleHRzID0gKEBhbmNob3JfdGV4dHMsIChyZXZlcnNlKEBwcmV2aW91c190ZXh0cykpWzAuLm1pbigzLCQjcHJldmlvdXNfdGV4dHMpXSk7Ci0KLSAgICAgIG15ICRndWVzc2VkID0gMDsKLSAgICAgIGZvciBteSAkdGV4dCAoQGNhbmRpZGF0ZV90ZXh0cykKLQl7ICMgbXkgJG9yaWdfdGV4dCA9ICR0ZXh0OwotCSAgaWYgKCR0ZXh0ID1+IC9eW1wiXGBcJygpLj8hIF0qJC8pCi0JICAgIHsgbmV4dDsgfQotCSAgaWYgKGxlbmd0aCgkdGV4dCkgPD0gMikKLQkgICAgeyBuZXh0OyB9Ci0JICAjIGhhY2sgZm9yIFB5dGhvbiBtYW51YWw7IG1heWJlIGRlZmVyIHVudGlsIGZhaWx1cmUgZmlyc3QgdGltZSBhcm91bmQ/Ci0JICAkdGV4dCA9fiBzL15zeXNcLi8vZzsKLQkgIGZvciBteSAkaXRlcm0gKEB0aGlzX2luZGV4X2VudHJpZXNfYnJva2VuKQotCSAgICB7ICMgSSBjb3VsZCB0ZXN0IGZvciB6ZXJvOiAgTGFUZVgySFRNTCdzIGZhaWx1cmVzIGluIHRoZSBQeXRob24KLQkgICAgICAjIGRvY3VtZW50YXRpb24gYXJlIG9ubHkgZm9yIGl0ZW1zIG9mIHRoZSBmb3JtICIuLi4gKGJ1aWx0LWluLi4uKSIKLQkgICAgICBpZiAoaW5kZXgoJGl0ZXJtLCAkdGV4dCkgIT0gLTEpCi0JCXsgcHVzaCBAZGVmZXJyZWRfaW5kZXhfZW50cmllcywgJGl0ZXJtOwotCQkgICMgcHJpbnQgU1RERVJSICJHdWVzc2luZyBpbmRleCB0ZXJtIGAkaXRlcm0nIGZvciB0ZXh0IGAkb3JpZ190ZXh0J1xuIjsKLQkJICAkZ3Vlc3NlZCA9IDE7Ci0JCX0gfSB9Ci0gICAgICBpZiAoISRndWVzc2VkKQotCXsgIyBwcmludCBTVERFUlIgIk5vIGd1ZXNzIGluIGAiLCBqb2luKCInOyBgIiwgQHRoaXNfaW5kZXhfZW50cmllc19icm9rZW4pLCAiJyBmb3IgdGV4dHM6XG4gYCIsIGpvaW4oIidcbiBgIiwgQGNhbmRpZGF0ZV90ZXh0cyksICInXG4iOwotCX0KLSAgICB9Ci19Ci0KLQotIyBOZWVkIHRvIGFkZCBjYWxscyB0byB0aGlzIGF0IHZhcmlvdXMgcGxhY2VzLgotIyBQZXJoYXBzIGFkZCBIVE1MOjpFbGVtZW50IGFyZ3VtZW50IGFuZCBkbyB0aGUgY2hlY2sgZm9yIGFwcHJvcHJpYXRlbmVzcwotIyBoZXJlIChpZSwgbm8gYWN0aW9uIGlmIGluc2lkZSA8SDE+LCBldGMuKS4KLXN1YiBkb19kZWZlcnJlZF9pbmRleF9lbnRyaWVzICgpCi17IGNoZWNrX2FyZ3MoMCwgQF8pOwotICBpZiAoKHNjYWxhcihAZGVmZXJyZWRfaW5kZXhfZW50cmllcykgPiAwKQotICAgICAgJiYgKHNjYWxhcihAaW5kZXhfZGVmZXJyZXJzKSA9PSAwKSkKLSAgICB7IHByaW50IFRFWEkgIlxuIiwgam9pbigiXG4iLCBAZGVmZXJyZWRfaW5kZXhfZW50cmllcyksICJcbiI7Ci0gICAgICBAZGVmZXJyZWRfaW5kZXhfZW50cmllcyA9ICgpOyB9Ci19Ci0KLW15ICR0YWJsZV9jb2x1bW5zOwkJIyB1bmRlZmluZWQgaWYgbm90IGluIGEgdGFibGUKLW15ICR0YWJsZV9maXJzdF9jb2x1bW47CQkjIGJvb2xlYW4KLQotc3ViIG91dHB1dF9ib2R5ICggJCQkICkKLXsgbXkgKCRoZSwgJHN0YXJ0ZmxhZykgPSAoY2hlY2tfYXJncygzLCBAXykpWzAsMV07ICMgIGlnbm9yZSBkZXB0aCBhcmd1bWVudAotCi0gIGlmICghcmVmICRoZSkKLSAgICB7IG15ICRzcGFjZV9pbmRleCA9IGluZGV4KCRoZSwgIiAiKTsKLSAgICAgIGlmICgkc3BhY2VfaW5kZXggIT0gLTEpCi0JeyAjIFdoeSBkb2VzCi0JICAjICAgcHJpbnQgVEVYSSB0ZXhpX3F1b3RlKHN1YnN0cigkaGUsIDAsICRzcGFjZV9pbmRleCsxKSk7Ci0JICAjIGdpdmU6ICBDYW4ndCBsb2NhdGUgb2JqZWN0IG1ldGhvZCAiVEVYSSIgdmlhIHBhY2thZ2UgInRleGlfcXVvdGUiCi0JICAjIChCZWNhdXNlIHRoZSBkZWZpbml0aW9uIHRleGlfcXVvdGUgaGFzbid0IGJlZW4gc2VlbiB5ZXQuKQotCSAgcHJpbnQgVEVYSSAmdGV4aV9xdW90ZShzdWJzdHIoJGhlLCAwLCAkc3BhY2VfaW5kZXgrMSkpOwotCSAgZG9fZGVmZXJyZWRfaW5kZXhfZW50cmllcygpOwotCSAgcHJpbnQgVEVYSSAmdGV4aV9xdW90ZShzdWJzdHIoJGhlLCAkc3BhY2VfaW5kZXgrMSkpOyB9Ci0gICAgICBlbHNlCi0JeyBwcmludCBURVhJICZ0ZXhpX3F1b3RlKCRoZSk7IH0KLSAgICAgIHJldHVybjsgfQotCi0gIG15ICR0YWcgPSAkaGUtPnRhZygpOwotCi0gICMgT3JkaW5hcnkgdGV4dCBtYXJrdXAgZmlyc3QKLSAgaWYgKGV4aXN0cyAkaW5saW5lX21hcmt1cHskdGFnfSkKLSAgICB7IGlmICgkc3RhcnRmbGFnKQotCXsgcHJpbnQgVEVYSSAiXEAkaW5saW5lX21hcmt1cHskdGFnfVx7IjsgfQotICAgICAgZWxzZQotCXsgcHJpbnQgVEVYSSAiXH0iOyB9IH0KLSAgZWxzaWYgKCR0YWcgZXEgImEiKQotICAgIHsgbXkgKCRuYW1lLCAkaHJlZiwgQGNvbnRlbnQpID0gYW5jaG9yX2luZm8oJGhlKTsKLSAgICAgIGlmICghJGhyZWYpCi0JeyAjIFRoaXMgYW5jaG9yIGlzIG9ubHkgaGVyZSBmb3IgaW5kZXhpbmcvY3Jvc3MgcmVmZXJlbmNpbmcgcHVycG9zZXMuCi0JICBpZiAoJHN0YXJ0ZmxhZykKLQkgICAgeyBsYWJlbF9hZGRfaW5kZXhfZW50cmllcygkbmFtZSwgJGhlKTsgfQotCX0KLSAgICAgIGVsc2lmICgkaHJlZiA9fiAiXihmdHB8aHR0cHxuZXdzKToiKQotCXsgaWYgKCRzdGFydGZsYWcpCi0JICAgIHsgIyBTaG91bGQgYXZvaWQgc2Vjb25kIGFyZ3VtZW50IGlmIGl0J3MgaWRlbnRpY2FsIHRvIHRoZSBVUkwuCi0JICAgICAgcHJpbnQgVEVYSSAiXEB1cmVmXHskaHJlZiwgIjsgfQotCSAgZWxzZQotCSAgICB7IHByaW50IFRFWEkgIlx9IjsgfQotCX0KLSAgICAgIGVsc2lmICgkaHJlZiA9fiAvXlwjKGZvb3RbMC05XSspJC8pCi0JeyAjIEZvb3Rub3RlCi0JICBpZiAoJHN0YXJ0ZmxhZykKLQkgICAgeyAjIENvdWxkIGRvdWJsZS1jaGVjayBuYW1lIGFuZCBjb250ZW50LCBidXQgSSdtIG5vdAotCSAgICAgICMgY3VycmVudGx5IHN0b3JpbmcgdGhhdCBpbmZvcm1hdGlvbi4KLQkgICAgICBwcmludCBURVhJICJcQGZvb3Rub3RlXHsiOwotCSAgICAgICRmb290bm90ZXN7JDF9LT50cmF2ZXJzZShcJm91dHB1dF9ib2R5KTsKLQkgICAgICBwcmludCBURVhJICJcfSI7Ci0JICAgICAgcmV0dXJuIDA7IH0gfQotICAgICAgZWxzZQotCXsgaWYgKCRzdGFydGZsYWcpCi0JICAgIHsgIyBjcm9zcy1yZWZlcmVuY2VzIGFyZSBub3QgYWN0aXZlIEluZm8gbGlua3MsIGJ1dCBubyB0ZXh0IGlzIGxvc3QKLQkgICAgICBwcmludCBTVERFUlIgIkNhbid0IGRlYWwgd2l0aCBpbnRlcm5hbCBIUkVGIGFuY2hvcnMgeWV0OlxuIjsKLQkgICAgICAkaGUtPmR1bXA7IH0KLQl9Ci0gICAgfQotICBlbHNpZiAoJHRhZyBlcSAiYnIiKQotICAgIHsgcHJpbnQgVEVYSSAiXEBcbiI7IH0KLSAgZWxzaWYgKCR0YWcgZXEgImJvZHkiKQotICAgIHsgfQotICBlbHNpZiAoJHRhZyBlcSAiY2VudGVyIikKLSAgICB7IGlmIChoYXNfc2luZ2xlX2NvbnRlbnRfc3RyaW5nKCRoZSkKLQkgICYmICgkIHskaGUtPmNvbnRlbnR9WzBdID1+IC9eICokLykpCi0JeyByZXR1cm4gMDsgfQotICAgICAgaWYgKCRzdGFydGZsYWcpCi0JeyBwcmludCBURVhJICJcblxAY2VudGVyXG4iOyB9Ci0gICAgICBlbHNlCi0JeyBwcmludCBURVhJICJcblxAZW5kIGNlbnRlclxuIjsgfQotICAgIH0KLSAgZWxzaWYgKCR0YWcgZXEgImRpdiIpCi0gICAgeyBteSAkYWxpZ24gPSAkaGUtPmF0dHIoJ2FsaWduJyk7Ci0gICAgICBpZiAoZGVmaW5lZCgkYWxpZ24pICYmICgkYWxpZ24gZXEgImNlbnRlciIpKQotCXsgaWYgKGhhc19zaW5nbGVfY29udGVudF9zdHJpbmcoJGhlKQotCSAgICAgICYmICgkIHskaGUtPmNvbnRlbnR9WzBdID1+IC9eICokLykpCi0JICAgIHsgcmV0dXJuIDA7IH0KLQkgIGlmICgkc3RhcnRmbGFnKQotCSAgICB7IHByaW50IFRFWEkgIlxuXEBjZW50ZXJcbiI7IH0KLQkgIGVsc2UKLQkgICAgeyBwcmludCBURVhJICJcblxAZW5kIGNlbnRlclxuIjsgfSB9Ci0gICAgfQotICBlbHNpZiAoJHRhZyBlcSAiZGwiKQotICAgIHsgIyBSZWNvZ25pemUgIjxkbD48ZGQ+PHByZT4gLi4uIDwvcHJlPjwvZGw+IiBwYXJhZGlnbSBmb3IgIkBleGFtcGxlIgotICAgICAgaWYgKGhhc19zaW5nbGVfY29udGVudF93aXRoX3RhZygkaGUsICJkZCIpKQotCXsgbXkgJGhlX2RkID0gJCB7JGhlLT5jb250ZW50fVswXTsKLQkgIGlmIChoYXNfc2luZ2xlX2NvbnRlbnRfd2l0aF90YWcoJGhlX2RkLCAicHJlIikpCi0JICAgIHsgbXkgJGhlX3ByZSA9ICQgeyRoZV9kZC0+Y29udGVudH1bMF07Ci0JICAgICAgcHJpbnRfcHJlKCRoZV9wcmUpOwotCSAgICAgIHJldHVybiAwOyB9IH0KLSAgICAgIGlmICgkc3RhcnRmbGFnKQotCXsgIyBDb3VsZCBleGFtaW5lIHRoZSBlbGVtZW50cywgdG8gYmUgY2xldmVyZXIgYWJvdXQgZm9ybWF0dGluZy4KLQkgICMgKEFsc28gdG8gdXNlIGZ0YWJsZSwgdnRhYmxlLi4uKQotCSAgcHJpbnQgVEVYSSAiXG5cQHRhYmxlIFxAYXNpc1xuIjsgfQotICAgICAgZWxzZQotCXsgcHJpbnQgVEVYSSAiXG5cQGVuZCB0YWJsZVxuIjsgfQotICAgIH0KLSAgZWxzaWYgKCR0YWcgZXEgImR0IikKLSAgICB7IHB1c2hfb3JfcG9wX2luZGV4X2RlZmVycmVycygkdGFnLCAkc3RhcnRmbGFnKTsKLSAgICAgIGlmICgkc3RhcnRmbGFnKQotCXsgcHJpbnQgVEVYSSAiXG5cQGl0ZW0gIjsgfQotICAgICAgZWxzZQotCXsgfSB9Ci0gIGVsc2lmICgkdGFnIGVxICJkZCIpCi0gICAgeyBpZiAoJHN0YXJ0ZmxhZykKLQl7IHByaW50IFRFWEkgIlxuIjsgfQotICAgICAgZWxzZQotCXsgfQotICAgICAgaWYgKHNjYWxhcihAaW5kZXhfZGVmZXJyZXJzKSAhPSAwKQotCXsgJGhlLT5kdW1wOwotCSAgZGllICJVbmV4cGVjdGVkIDwkdGFnPiB3aGlsZSBpbnNpZGU6ICgiIC4gam9pbigiICIsIEBpbmRleF9kZWZlcnJlcnMpIC4gIik7IGJhZCBIVE1MPyI7IH0KLSAgICAgIGRvX2RlZmVycmVkX2luZGV4X2VudHJpZXMoKTsKLSAgICB9Ci0gIGVsc2lmICgkdGFnID1+IC9eKGZvbnR8YmlnfHNtYWxsKSQvKQotICAgIHsgIyBEbyBub3RoaW5nIGZvciBub3cuCi0gICAgfQotICBlbHNpZiAoJHRhZyA9fiAvXmhbMS02XSQvKQotICAgIHsgIyBXZSBkb24ndCBuZWVkIHRoaXMgYmVjYXVzZSB3ZSBuZXZlciByZWN1cnNpdmVseSBlbnRlciB0aGUgaGVhZGluZyBjb250ZW50LgotICAgICAgIyBwdXNoX29yX3BvcF9pbmRleF9kZWZlcnJlcnMoJHRhZywgJHN0YXJ0ZmxhZyk7Ci0gICAgICBteSAkc2VjbmFtZSA9ICIiOwotICAgICAgbXkgQHNlY2xhYmVscyA9ICgpOwotICAgICAgZm9yIG15ICRlbHQgKEB7JGhlLT5jb250ZW50fSkKLQl7IGlmICghcmVmICRlbHQpCi0JICAgIHsgJHNlY25hbWUgLj0gJGVsdDsgfQotCSAgZWxzaWYgKCRlbHQtPnRhZyBlcSAiYnIiKQotCSAgICB7IH0KLQkgIGVsc2lmICgkZWx0LT50YWcgZXEgImEiKQotCSAgICB7IG15ICgkbmFtZSwgJGhyZWYsIEBhY29udGVudCkgPSBhbmNob3JfaW5mbygkZWx0KTsKLSAgICAgICAgICAgICAgaWYgKCRocmVmKQotICAgICAgICAgICAgICAgIHsgJGhlLT5kdW1wOwotICAgICAgICAgICAgICAgICAgJGVsdC0+ZHVtcDsKLSAgICAgICAgICAgICAgICAgIGRpZSAiTm9uc2ltcGxlIGFuY2hvciBpbiA8JHRhZz4iOyB9Ci0JICAgICAgaWYgKCFkZWZpbmVkICRuYW1lKQotCQl7IGRpZSAiTm8gTkFNRSBmb3IgYW5jaG9yIGluICR0YWciOyB9Ci0JICAgICAgcHVzaCBAc2VjbGFiZWxzLCAkbmFtZTsKLQkgICAgICBmb3IgbXkgJHN1YmVsdCAoQGFjb250ZW50KQotCQl7ICRzZWNuYW1lIC49IGh0bWxfdG9fdGV4aSgkc3ViZWx0KTsgfSB9Ci0JICBlbHNlCi0JICAgIHsgJHNlY25hbWUgLj0gaHRtbF90b190ZXhpKCRlbHQpOyB9IH0KLSAgICAgIGlmICgkc2VjbmFtZSBlcSAiIikKLQl7IGRpZSAiTm8gc2VjdGlvbiBuYW1lIGluIDwkdGFnPiI7IH0KLSAgICAgIGlmIChzY2FsYXIoQHNlY3Rpb25fc3RhY2spID09IDEpCi0JeyBpZiAoJHNlY3Rpb25fc3RhY2tbLTFdIG5lICJUb3AiKQotCSAgICB7IGRpZSAiTm90IHRvcD8gJHNlY3Rpb25fc3RhY2tbLTFdIjsgfQotCSAgcHJpbnQgVEVYSSAiXEBzZXR0aXRsZSAkc2VjbmFtZVxuIjsKLQkgIHByaW50IFRFWEkgIlxAYyAlKiplbmQgb2YgaGVhZGVyXG4iOwotCSAgcHJpbnQgVEVYSSAiXG4iOwotCSAgcHJpbnQgVEVYSSAiXEBub2RlIFRvcFxuIjsKLQkgIHByaW50IFRFWEkgIlxuIjsgfQotICAgICAgZWxzZQotCXsgcHJpbnQgVEVYSSAiXG5cQG5vZGUgJHNlY3Rpb25fc3RhY2tbLTFdXG4iOwotCSAgcHJpbnQgVEVYSSAiXEAkc2VjdGlvbm1hcmtlcltzY2FsYXIoQHNlY3Rpb25fc3RhY2spLTFdICIsIHRleGlfcmVtb3ZlX3B1bmN0dWF0aW9uKCRzZWNuYW1lKSwgIlxuIjsgfQotICAgICAgZm9yIG15ICRzZWNsYWJlbCAoQHNlY2xhYmVscykKLQl7IGxhYmVsX2FkZF9pbmRleF9lbnRyaWVzKCRzZWNsYWJlbCk7IH0KLSAgICAgICMgVGhpcyBzaG91bGQgb25seSBoYXBwZW4gb25jZSBwZXIgZmlsZS4KLSAgICAgIGxhYmVsX2FkZF9pbmRleF9lbnRyaWVzKCIiKTsKLSAgICAgIGlmIChzY2FsYXIoQGluZGV4X2RlZmVycmVycykgIT0gMCkKLQl7ICRoZS0+ZHVtcDsKLQkgIGRpZSAiVW5leHBlY3RlZCA8JHRhZz4gd2hpbGUgaW5zaWRlOiAoIiAuIGpvaW4oIiAiLCBAaW5kZXhfZGVmZXJyZXJzKSAuICIpOyBiYWQgSFRNTD8iOyB9Ci0gICAgICBkb19kZWZlcnJlZF9pbmRleF9lbnRyaWVzKCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGVsc2lmICgkdGFnIGVxICJociIpCi0gICAgeyB9Ci0gIGVsc2lmICgkdGFnIGVxICJpZ25vcmUiKQotICAgIHsgIyBIYWNrIGZvciBpZ25vcmVkIGVsZW1lbnRzCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGVsc2lmICgkdGFnIGVxICJsaSIpCi0gICAgeyBpZiAoJHN0YXJ0ZmxhZykKLQl7IHByaW50IFRFWEkgIlxuXG5cQGl0ZW1cbiI7Ci0JICBkb19kZWZlcnJlZF9pbmRleF9lbnRyaWVzKCk7IH0gfQotICBlbHNpZiAoJHRhZyBlcSAib2wiKQotICAgIHsgaWYgKCRzdGFydGZsYWcpCi0JeyBwcmludCBURVhJICJcblxAZW51bWVyYXRlIFxAYnVsbGV0XG4iOyB9Ci0gICAgICBlbHNlCi0JeyBwcmludCBURVhJICJcblxAZW5kIGVudW1lcmF0ZVxuIjsgfSB9Ci0gIGVsc2lmICgkdGFnIGVxICJwIikKLSAgICB7IGlmICgkc3RhcnRmbGFnKQotCXsgcHJpbnQgVEVYSSAiXG5cbiI7IH0KLSAgICAgIGlmIChzY2FsYXIoQGluZGV4X2RlZmVycmVycykgIT0gMCkKLQl7ICRoZS0+ZHVtcDsKLQkgIGRpZSAiVW5leHBlY3RlZCA8JHRhZz4gd2hpbGUgaW5zaWRlOiAoIiAuIGpvaW4oIiAiLCBAaW5kZXhfZGVmZXJyZXJzKSAuICIpOyBiYWQgSFRNTD8iOyB9Ci0gICAgICBkb19kZWZlcnJlZF9pbmRleF9lbnRyaWVzKCk7IH0KLSAgZWxzaWYgKCR0YWcgZXEgInByZSIpCi0gICAgeyBwcmludF9wcmUoJGhlKTsKLSAgICAgIHJldHVybiAwOyB9Ci0gIGVsc2lmICgkdGFnIGVxICJ0YWJsZSIpCi0gICAgeyAjIENvdWxkIGFsc28gaW5kaWNhdGUgY29tbW9uIGZvcm1hdHRpbmcgZm9yIGZpcnN0IGNvbHVtbiwgb3IKLSAgICAgICMgZGV0ZXJtaW5lIHJlbGF0aXZlIHdpZHRocyBmb3IgY29sdW1ucyAob3IgZGV0ZXJtaW5lIGEgcHJvdG90eXBlIHJvdykKLSAgICAgIGlmICgkc3RhcnRmbGFnKQotCXsgaWYgKGRlZmluZWQgJHRhYmxlX2NvbHVtbnMpCi0JICAgIHsgJGhlLT5kdW1wOwotCSAgICAgIGRpZSAiQ2FuJ3QgZGVhbCB3aXRoIHRhYmxlIG5lc3RlZCBpbnNpZGUgJHRhYmxlX2NvbHVtbnMtY29sdW1uIHRhYmxlIjsgfQotCSAgJHRhYmxlX2NvbHVtbnMgPSB0YWJsZV9jb2x1bW5zKCRoZSk7Ci0JICBpZiAoJHRhYmxlX2NvbHVtbnMgPCAyKQotCSAgICB7ICRoZS0+ZHVtcDsKLQkgICAgICBkaWUgIkNvbHVtbiB3aXRoICR0YWJsZV9jb2x1bW5zIGNvbHVtbnM/IjsgfQotCSAgZWxzaWYgKCR0YWJsZV9jb2x1bW5zID09IDIpCi0JICAgIHsgcHJpbnQgVEVYSSAiXG5cQHRhYmxlIFxAYXNpc1xuIjsgfQotCSAgZWxzZQotCSAgICB7IHByaW50IFRFWEkgIlxuXEBtdWx0aXRhYmxlIFxAY29sdW1uZnJhY3Rpb25zIjsKLQkgICAgICBmb3IgKG15ICRpPTA7ICRpPCR0YWJsZV9jb2x1bW5zOyAkaSsrKQotCQl7IHByaW50IFRFWEkgIiAiLCAxLjAvJHRhYmxlX2NvbHVtbnM7IH0KLQkgICAgICBwcmludCBURVhJICJcbiI7IH0gfQotICAgICAgZWxzZQotCXsgaWYgKCR0YWJsZV9jb2x1bW5zID09IDIpCi0JICAgIHsgcHJpbnQgVEVYSSAiXG5cQGVuZCB0YWJsZVxuIjsgfQotCSAgZWxzZQotCSAgICB7IHByaW50IFRFWEkgIlxuXEBlbmQgbXVsdGl0YWJsZVxuIjsgfQotCSAgdW5kZWYgJHRhYmxlX2NvbHVtbnM7IH0gfQotICBlbHNpZiAoKCR0YWcgZXEgInRkIikgfHwgKCR0YWcgZXEgInRoIikpCi0gICAgeyBpZiAoJHN0YXJ0ZmxhZykKLQl7IGlmICgkdGFibGVfZmlyc3RfY29sdW1uKQotCSAgICB7IHByaW50IFRFWEkgIlxuXEBpdGVtICI7Ci0JICAgICAgJHRhYmxlX2ZpcnN0X2NvbHVtbiA9IDA7IH0KLQkgIGVsc2lmICgkdGFibGVfY29sdW1ucyA+IDIpCi0JICAgIHsgcHJpbnQgVEVYSSAiXG5cQHRhYiAiOyB9IH0KLSAgICAgIGVsc2UKLQl7IHByaW50IFRFWEkgIlxuIjsgfSB9Ci0gIGVsc2lmICgkdGFnIGVxICJ0ciIpCi0gICAgeyBpZiAoJHN0YXJ0ZmxhZykKLQl7ICR0YWJsZV9maXJzdF9jb2x1bW4gPSAxOyB9IH0KLSAgZWxzaWYgKCR0YWcgZXEgInVsIikKLSAgICB7IGlmICgkc3RhcnRmbGFnKQotCXsgcHJpbnQgVEVYSSAiXG5cQGl0ZW1pemUgXEBidWxsZXRcbiI7IH0KLSAgICAgIGVsc2UKLQl7IHByaW50IFRFWEkgIlxuXEBlbmQgaXRlbWl6ZVxuIjsgfSB9Ci0gIGVsc2UKLSAgICB7ICMgSSB1c2VkIHRvIGhhdmUgYSBuZXdsaW5lIGJlZm9yZSAib3V0cHV0X2JvZHkiIGhlcmUuCi0gICAgICBwcmludCBTVERFUlIgIm91dHB1dF9ib2R5OiBpZ25vcmluZyA8JHRhZz4gdGFnXG4iOwotICAgICAgJGhlLT5kdW1wOwotICAgICAgcmV0dXJuIDA7IH0KLQotICByZXR1cm4gMTsKLX0KLQotc3ViIHByaW50X3ByZSAoICQgKQoteyBteSAoJGhlX3ByZSkgPSBjaGVja19hcmdzKDEsIEBfKTsKLSAgaWYgKCFoYXNfc2luZ2xlX2NvbnRlbnRfc3RyaW5nKCRoZV9wcmUpKQotICAgIHsgZGllICJNdWx0aXBsZSBvciBub24tc3RyaW5nIGNvbnRlbnQgZm9yIDxQUkU+OiAiLCBAeyRoZV9wcmUtPmNvbnRlbnR9OyB9Ci0gIG15ICRwcmVfY29udGVudCA9ICQgeyRoZV9wcmUtPmNvbnRlbnR9WzBdOwotICBwcmludCBURVhJICJcblxAZXhhbXBsZSI7Ci0gIHByaW50IFRFWEkgJnRleGlfcXVvdGUoJHByZV9jb250ZW50KTsKLSAgcHJpbnQgVEVYSSAiXEBlbmQgZXhhbXBsZVxuIjsKLX0KLQotc3ViIHRhYmxlX2NvbHVtbnMgKCAkICkKLXsgbXkgKCR0YWJsZSkgPSBjaGVja19hcmdzKDEsIEBfKTsKLSAgbXkgJHJlc3VsdCA9IDA7Ci0gIGZvciBteSAkcm93IChAeyR0YWJsZS0+Y29udGVudH0pCi0gICAgeyBpZiAoJHJvdy0+dGFnIG5lICJ0ciIpCi0JeyAkdGFibGUtPmR1bXA7Ci0JICAkcm93LT5kdW1wOwotCSAgZGllICJFeHBlY3RlZCA8VFI+IGFzIHRhYmxlIHJvdy4iOyB9Ci0gICAgICAkcmVzdWx0ID0gbWF4KCRyZXN1bHQsIHNjYWxhcihAeyRyb3ctPmNvbnRlbnR9KSk7IH0KLSAgcmV0dXJuICRyZXN1bHQ7Ci19Ci0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyMgVXRpbGl0aWVzCi0jIyMKLQotc3ViIG1pbiAoICQkICkKLXsgbXkgKCR4LCAkeSkgPSBjaGVja19hcmdzKDIsIEBfKTsKLSAgcmV0dXJuICgkeCA8ICR5KSA/ICR4IDogJHk7Ci19Ci0KLXN1YiBtYXggKCAkJCApCi17IG15ICgkeCwgJHkpID0gY2hlY2tfYXJncygyLCBAXyk7Ci0gIHJldHVybiAoJHggPiAkeSkgPyAkeCA6ICR5OwotfQotCi1zdWIgZmlsZV90b190cmVlICggJCApCi17IG15ICgkZmlsZSkgPSBjaGVja19hcmdzKDEsIEBfKTsKLQotICBteSAkdHJlZSA9IG5ldyBIVE1MOjpUcmVlQnVpbGRlcjsKLSAgJHRyZWUtPmlnbm9yZV91bmtub3duKDEpOwotICAjICR0cmVlLT53YXJuKDEpOwotICAkdHJlZS0+cGFyc2VfZmlsZSgkZmlsZSk7Ci0gIGNsZWFudXBfcGFyc2VfdHJlZSgkdHJlZSk7Ci0gIHJldHVybiAkdHJlZQotfQotCi0KLXN1YiBoYXNfc2luZ2xlX2NvbnRlbnQgKCAkICkKLXsgbXkgKCRoZSkgPSBjaGVja19hcmdzKDEsIEBfKTsKLSAgaWYgKCFyZWYgJGhlKQotICAgIHsgIyByZXR1cm4gMDsKLSAgICAgIGRpZSAiTm9uLXJlZmVyZW5jZSBhcmd1bWVudDogJGhlIjsgfQotICBteSAkcmVmX2NvbnRlbnQgPSAkaGUtPmNvbnRlbnQ7Ci0gIGlmICghZGVmaW5lZCAkcmVmX2NvbnRlbnQpCi0gICAgeyByZXR1cm4gMDsgfQotICBteSBAY29udGVudCA9IEB7JHJlZl9jb250ZW50fTsKLSAgaWYgKHNjYWxhcihAY29udGVudCkgIT0gMSkKLSAgICB7IHJldHVybiAwOyB9Ci0gIHJldHVybiAxOwotfQotCi0KLSMgUmV0dXJuIHRydWUgaWYgdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQgY29udGFpbnMgb25seSBvbmUgZWxlbWVudCBpdHNlbGYsCi0jIGFuZCB0aGF0IGlubmVyIGVsZW1lbnQgaGFzIHRoZSBzcGVjaWZpZWQgdGFnLgotc3ViIGhhc19zaW5nbGVfY29udGVudF93aXRoX3RhZyAoICQkICkKLXsgbXkgKCRoZSwgJHRhZykgPSBjaGVja19hcmdzKDIsIEBfKTsKLSAgaWYgKCFoYXNfc2luZ2xlX2NvbnRlbnQoJGhlKSkKLSAgICB7IHJldHVybiAwOyB9Ci0gIG15ICRjb250ZW50ID0gJCB7JGhlLT5jb250ZW50fVswXTsKLSAgaWYgKCFyZWYgJGNvbnRlbnQpCi0gICAgeyByZXR1cm4gMDsgfQotICBteSAkY29udGVudF90YWcgPSAkY29udGVudC0+dGFnOwotICBpZiAoIWRlZmluZWQgJGNvbnRlbnRfdGFnKQotICAgIHsgcmV0dXJuIDA7IH0KLSAgcmV0dXJuICRjb250ZW50X3RhZyBlcSAkdGFnOwotfQotCi1zdWIgaGFzX3NpbmdsZV9jb250ZW50X3N0cmluZyAoICQgKQoteyBteSAoJGhlKSA9IGNoZWNrX2FyZ3MoMSwgQF8pOwotICBpZiAoIWhhc19zaW5nbGVfY29udGVudCgkaGUpKQotICAgIHsgcmV0dXJuIDA7IH0KLSAgbXkgJGNvbnRlbnQgPSAkIHskaGUtPmNvbnRlbnR9WzBdOwotICBpZiAocmVmICRjb250ZW50KQotICAgIHsgcmV0dXJuIDA7IH0KLSAgcmV0dXJuIDE7Ci19Ci0KLQotIyBSZXR1cm4gbmFtZSwgaHJlZiwgY29udGVudC4gIEZpcnN0IHR3byBtYXkgYmUgdW5kZWZpbmVkOyB0aGlyZCBpcyBhbiBhcnJheS4KLSMgSSBkb24ndCBzZWUgaG93IHRvIGRldGVybWluZSBpZiB0aGVyZSBhcmUgbW9yZSBhdHRyaWJ1dGVzLgotc3ViIGFuY2hvcl9pbmZvICggJCApCi17IG15ICgkaGUpID0gY2hlY2tfYXJncygxLCBAXyk7Ci0gIGlmICgkaGUtPnRhZyBuZSAiYSIpCi0gICAgeyAkaGUtPmR1bXA7Ci0gICAgICBkaWUgInBhc3NlZCBub24tYW5jaG9yIHRvIGFuY2hvcl9pbmZvIjsgfQotICBteSAkbmFtZSA9ICRoZS0+YXR0cignbmFtZScpOwotICBteSAkaHJlZiA9ICRoZS0+YXR0cignaHJlZicpOwotICBteSBAY29udGVudCA9ICgpOwotICB7IG15ICRyZWZfY29udGVudCA9ICRoZS0+Y29udGVudDsKLSAgICBpZiAoZGVmaW5lZCAkcmVmX2NvbnRlbnQpCi0gICAgICB7IEBjb250ZW50ID0gQHskcmVmX2NvbnRlbnR9OyB9IH0KLSAgcmV0dXJuICgkbmFtZSwgJGhyZWYsIEBjb250ZW50KTsKLX0KLQotCi1zdWIgdGV4aV9xdW90ZSAoICQgKQoteyBteSAoJHRleHQpID0gY2hlY2tfYXJncygxLCBAXyk7Ci0gICR0ZXh0ID1+IHMvKFtcQFx7XH1dKS9cQCQxL2c7Ci0gICR0ZXh0ID1+IHMvIC0tIC8gLS0tIC9nOwotICByZXR1cm4gJHRleHQ7Ci19Ci0KLSMgRWxpbWluYXRlIGJhZCBwdW5jdHVhdGlvbiAodGhhdCBjb25mdXNlcyBNYWtlaW5mbyBvciBJbmZvKSBmb3Igc2VjdGlvbiB0aXRsZXMuCi1zdWIgdGV4aV9yZW1vdmVfcHVuY3R1YXRpb24gKCAkICkKLXsgbXkgKCR0ZXh0KSA9IGNoZWNrX2FyZ3MoMSwgQF8pOwotCi0gICR0ZXh0ID1+IHMvXiArLy9nOwotICAkdGV4dCA9fiBzL1sgOl0rJC8vZzsKLSAgJHRleHQgPX4gcy9eWzEtOV1bMC05Ll0qICsvL2c7Ci0gICR0ZXh0ID1+IHMvLC8vZzsKLSAgIyBCb3RoIGVtYmVkZGVkIGNvbG9ucyBhbmQgIiAtLSAiIGNvbmZ1c2UgbWFrZWluZm8uICAoUGVyaGFwcyAiIC0tICIKLSAgIyBnZXRzIGNvbnZlcnRlZCBpbnRvICIgLSAiLCBqdXN0IGFzICItLS0iIHdvdWxkIGJlIGNvbnZlcnRlZCBpbnRvICIgLS0gIiwKLSAgIyBzbyB0aGUgbmFtZXMgZW5kIHVwIGRpZmZlcmluZy4pCi0gICMgJHRleHQgPX4gcy86LyAtLSAvZzsKLSAgJHRleHQgPX4gcy86Ly9nOwotICByZXR1cm4gJHRleHQ7Ci19Ci0KLQotIyMgRG8gbm90IHVzZSB0aGlzIGluc2lkZSBgdHJhdmVyc2UnOiAgaXQgdGhyb3dzIG9mZiB0aGUgdHJhdmVyc2FsLiAgVXNlCi0jIyBodG1sX3JlcGxhY2VfYnlfaWdub3JlIG9yIGh0bWxfcmVwbGFjZV9ieV9tZXRhIGluc3RlYWQuCi0jIFJldHVybnMgMSBpZiBzdWNjZXNzLCAwIGlmIGZhaWx1cmUuCi1zdWIgaHRtbF9yZW1vdmUgKCAkOyQgKQoteyBteSAoJGhlLCAkcGFyZW50KSA9IGNoZWNrX2FyZ3NfcmFuZ2UoMSwgMiwgQF8pOwotICBpZiAoIWRlZmluZWQgJHBhcmVudCkKLSAgICB7ICRwYXJlbnQgPSAkaGUtPnBhcmVudDsgfQotICBteSAkcmVmX3Bjb250ZW50ID0gJHBhcmVudC0+Y29udGVudDsKLSAgbXkgQHBjb250ZW50ID0gQHskcmVmX3Bjb250ZW50fTsKLSAgZm9yIChteSAkaT0wOyAkaTxzY2FsYXIoQHBjb250ZW50KTsgJGkrKykKLSAgICB7IGlmICgkcGNvbnRlbnRbJGldIGVxICRoZSkKLQl7IHNwbGljZSBAeyRyZWZfcGNvbnRlbnR9LCAkaSwgMTsKLQkgICRoZS0+cGFyZW50KHVuZGVmKTsKLQkgIHJldHVybiAxOyB9IH0KLSAgZGllICJEaWRuJ3QgZmluZCAkaGUgaW4gJHBhcmVudCI7Ci19Ci0KLQotc3ViIGh0bWxfcmVwbGFjZSAoICQkOyQgKQoteyBteSAoJG9yaWcsICRuZXcsICRwYXJlbnQpID0gY2hlY2tfYXJnc19yYW5nZSgyLCAzLCBAXyk7Ci0gIGlmICghZGVmaW5lZCAkcGFyZW50KQotICAgIHsgJHBhcmVudCA9ICRvcmlnLT5wYXJlbnQ7IH0KLSAgbXkgJHJlZl9wY29udGVudCA9ICRwYXJlbnQtPmNvbnRlbnQ7Ci0gIG15IEBwY29udGVudCA9IEB7JHJlZl9wY29udGVudH07Ci0gIGZvciAobXkgJGk9MDsgJGk8c2NhbGFyKEBwY29udGVudCk7ICRpKyspCi0gICAgeyBpZiAoJHBjb250ZW50WyRpXSBlcSAkb3JpZykKLQl7ICQgeyRyZWZfcGNvbnRlbnR9WyRpXSA9ICRuZXc7Ci0JICAkbmV3LT5wYXJlbnQoJHBhcmVudCk7Ci0JICAkb3JpZy0+cGFyZW50KHVuZGVmKTsKLQkgIHJldHVybiAxOyB9IH0KLSAgZGllICJEaWRuJ3QgZmluZCAkb3JpZyBpbiAkcGFyZW50IjsKLX0KLQotc3ViIGh0bWxfcmVwbGFjZV9ieV9tZXRhICggJDskICkKLXsgbXkgKCRvcmlnLCAkcGFyZW50KSA9IGNoZWNrX2FyZ3NfcmFuZ2UoMSwgMiwgQF8pOwotICBteSAkbWV0YSA9IG5ldyBIVE1MOjpFbGVtZW50ICJtZXRhIjsKLSAgaWYgKCFkZWZpbmVkICRwYXJlbnQpCi0gICAgeyAkcGFyZW50ID0gJG9yaWctPnBhcmVudDsgfQotICByZXR1cm4gaHRtbF9yZXBsYWNlKCRvcmlnLCAkbWV0YSwgJHBhcmVudCk7Ci19Ci0KLXN1YiBodG1sX3JlcGxhY2VfYnlfaWdub3JlICggJDskICkKLXsgbXkgKCRvcmlnLCAkcGFyZW50KSA9IGNoZWNrX2FyZ3NfcmFuZ2UoMSwgMiwgQF8pOwotICBteSAkaWdub3JlID0gbmV3IEhUTUw6OkVsZW1lbnQgImlnbm9yZSI7Ci0gIGlmICghZGVmaW5lZCAkcGFyZW50KQotICAgIHsgJHBhcmVudCA9ICRvcmlnLT5wYXJlbnQ7IH0KLSAgcmV0dXJuIGh0bWxfcmVwbGFjZSgkb3JpZywgJGlnbm9yZSwgJHBhcmVudCk7Ci19Ci0KLQotCi0jIyMKLSMjIyBDb2xsZWN0IHRleHQgZWxlbWVudHMKLSMjIwotCi1teSBAY29sbGVjdGVkX3RleHRzOwotbXkgJGNvbGxlY3RfdGV4dHNfc3RvcHBvaW50OwotbXkgJGRvbmVfY29sbGVjdGluZzsKLQotc3ViIGNvbGxlY3RfdGV4dHMgKCAkOyQgKQoteyBteSAoJHJvb3QsICRzdG9wKSA9IGNoZWNrX2FyZ3NfcmFuZ2UoMSwgMiwgQF8pOwotICAjIHByaW50IFNUREVSUiAiY29sbGVjdF90ZXh0czogJHJvb3QgJHN0b3BcbiI7Ci0gICRjb2xsZWN0X3RleHRzX3N0b3Bwb2ludCA9ICRzdG9wOwotICAkZG9uZV9jb2xsZWN0aW5nID0gMDsKLSAgQGNvbGxlY3RlZF90ZXh0cyA9ICgpOwotICAkcm9vdC0+dHJhdmVyc2UoXCZjb2xsZWN0X2lmX3RleHQpOyAjIHByb2Nlc3MgdGV4dHMKLSAgIyBwcmludCBTVERFUlIgImNvbGxlY3RfdGV4dHMgPT4gIiwgam9pbigiOzs7IiwgQGNvbGxlY3RlZF90ZXh0cyksICJcbiI7Ci0gIHJldHVybiBAY29sbGVjdGVkX3RleHRzOwotfQotCi1zdWIgY29sbGVjdF9pZl90ZXh0ICggJCQkICkKLXsgbXkgJGhlID0gKGNoZWNrX2FyZ3MoMywgQF8pKVswXTsgIyAgaWdub3JlIGRlcHRoIGFuZCBzdGFydGZsYWcgYXJndW1lbnRzCi0gIGlmICgkZG9uZV9jb2xsZWN0aW5nKQotICAgIHsgcmV0dXJuIDA7IH0KLSAgaWYgKCFkZWZpbmVkICRoZSkKLSAgICB7IHJldHVybiAwOyB9Ci0gIGlmICghcmVmICRoZSkKLSAgICB7IHB1c2ggQGNvbGxlY3RlZF90ZXh0cywgJGhlOwotICAgICAgcmV0dXJuIDA7IH0KLSAgaWYgKChkZWZpbmVkICRjb2xsZWN0X3RleHRzX3N0b3Bwb2ludCkgJiYgKCRoZSBlcSAkY29sbGVjdF90ZXh0c19zdG9wcG9pbnQpKQotICAgIHsgJGRvbmVfY29sbGVjdGluZyA9IDE7Ci0gICAgICByZXR1cm4gMDsgfQotICByZXR1cm4gMTsKLX0KLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIyBDbGVhbiB1cCBwYXJzZSB0cmVlCi0jIyMKLQotc3ViIGNsZWFudXBfcGFyc2VfdHJlZSAoICQgKQoteyBteSAoJGhlKSA9IGNoZWNrX2FyZ3MoMSwgQF8pOwotICAkaGUtPnRyYXZlcnNlKFwmZGVsZXRlX2lmX25hdmlnYXRpb24sICdpZ25vcmUgdGV4dCcpOwotICAkaGUtPnRyYXZlcnNlKFwmZGVsZXRlX2V4dHJhX3NwYWNlcywgJ2lnbm9yZSB0ZXh0Jyk7Ci0gICRoZS0+dHJhdmVyc2UoXCZtZXJnZV9kbCwgJ2lnbm9yZSB0ZXh0Jyk7Ci0gICRoZS0+dHJhdmVyc2UoXCZyZW9yZGVyX2R0X2FuZF9kbCwgJ2lnbm9yZSB0ZXh0Jyk7Ci0gIHJldHVybiAkaGU7Ci19Ci0KLQotIyMgU2ltcGxlciB2ZXJzaW9uIHRoYXQgZGVsZXRlcyBjb250ZW50cyBidXQgbm90IHRoZSBlbGVtZW50IGl0c2VsZi4KLSMgc3ViIGRlbGV0ZV9pZl9uYXZpZ2F0aW9uICggJCQkICkKLSMgeyBteSAkaGUgPSAoY2hlY2tfYXJncygzLCBAXykpWzBdOyAjIGlnbm9yZSBzdGFydGZsYWcgYW5kIGRlcHRoCi0jICAgaWYgKCgkaGUtPnRhZygpIGVxICJkaXYiKSAmJiAoJGhlLT5hdHRyKCdjbGFzcycpIGVxICduYXZpZ2F0aW9uJykpCi0jICAgICB7ICRoZS0+ZGVsZXRlKCk7Ci0jICAgICAgIHJldHVybiAwOyB9Ci0jICAgZWxzZQotIyAgICAgeyByZXR1cm4gMTsgfQotIyB9Ci0KLXN1YiBkZWxldGVfaWZfbmF2aWdhdGlvbiAoICQkJCApCi17IG15ICgkaGUsICRzdGFydGZsYWcpID0gKGNoZWNrX2FyZ3MoMywgQF8pKVswLDFdOyAjICBpZ25vcmUgZGVwdGggYXJndW1lbnQKLSAgaWYgKCEkc3RhcnRmbGFnKQotICAgIHsgcmV0dXJuOyB9Ci0KLSAgaWYgKCgkaGUtPnRhZygpIGVxICJkaXYiKSAmJiAoZGVmaW5lZCAkaGUtPmF0dHIoJ2NsYXNzJykpICYmICgkaGUtPmF0dHIoJ2NsYXNzJykgZXEgJ25hdmlnYXRpb24nKSkKLSAgICB7IG15ICRyZWZfcGNvbnRlbnQgPSAkaGUtPnBhcmVudCgpLT5jb250ZW50KCk7Ci0gICAgICAjIERvbid0IHRyeSB0byBtb2RpZnkgQHBjb250ZW50LCB3aGljaCBhcHBlYXJzIHRvIGJlIGEgQ09QWS4KLSAgICAgICMgbXkgQHBjb250ZW50ID0gQHskcmVmX3Bjb250ZW50fTsKLSAgICAgIGZvciAobXkgJGkgPSAwOyAkaTxzY2FsYXIoQHskcmVmX3Bjb250ZW50fSk7ICRpKyspCi0JeyBpZiAoJHskcmVmX3Bjb250ZW50fVskaV0gZXEgJGhlKQotCSAgICB7IHNwbGljZShAeyRyZWZfcGNvbnRlbnR9LCAkaSwgMSk7Ci0JICAgICAgbGFzdDsgfSB9Ci0gICAgICAkaGUtPmRlbGV0ZSgpOwotICAgICAgcmV0dXJuIDA7IH0KLSAgZWxzZQotICAgIHsgcmV0dXJuIDE7IH0KLX0KLQotc3ViIGRlbGV0ZV9leHRyYV9zcGFjZXMgKCAkJCQgKQoteyBteSAoJGhlLCAkc3RhcnRmbGFnKSA9IChjaGVja19hcmdzKDMsIEBfKSlbMCwxXTsgIyAgaWdub3JlIGRlcHRoIGFyZ3VtZW50Ci0gIGlmICghJHN0YXJ0ZmxhZykKLSAgICB7IHJldHVybjsgfQotCi0gIG15ICR0YWcgPSAkaGUtPnRhZzsKLSAgaWYgKCR0YWcgPX4gL14oaGVhZHxodG1sfHRhYmxlfHRyfHVsKSQvKQotICAgIHsgZGVsZXRlX2NoaWxkX3NwYWNlcygkaGUpOyB9Ci0gIGRlbGV0ZV90cmFpbGluZ19zcGFjZXMoJGhlKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLQotc3ViIGRlbGV0ZV9jaGlsZF9zcGFjZXMgKCAkICkKLXsgbXkgKCRoZSkgPSBjaGVja19hcmdzKDEsIEBfKTsKLSAgbXkgJHJlZl9jb250ZW50ID0gJGhlLT5jb250ZW50KCk7Ci0gIGZvciAobXkgJGkgPSAwOyAkaTxzY2FsYXIoQHskcmVmX2NvbnRlbnR9KTsgJGkrKykKLSAgICB7IGlmICgkIHskcmVmX2NvbnRlbnR9WyRpXSA9fiAvXiAqJC8pCi0JeyBzcGxpY2UoQHskcmVmX2NvbnRlbnR9LCAkaSwgMSk7Ci0JICAkaS0tOyB9IH0KLX0KLQotc3ViIGRlbGV0ZV90cmFpbGluZ19zcGFjZXMgKCAkICkKLXsgbXkgKCRoZSkgPSBjaGVja19hcmdzKDEsIEBfKTsKLSAgbXkgJHJlZl9jb250ZW50ID0gJGhlLT5jb250ZW50KCk7Ci0gIGlmICghIGRlZmluZWQgJHJlZl9jb250ZW50KQotICAgIHsgcmV0dXJuOyB9Ci0gICMgQ291bGQgYWxzbyBjaGVjayBmb3IgcHJldmlvdXMgZWxlbWVudCA9IC9eaFsxLTZdJC8uCi0gIGZvciAobXkgJGkgPSAwOyAkaTxzY2FsYXIoQHskcmVmX2NvbnRlbnR9KS0xOyAkaSsrKQotICAgIHsgaWYgKCQgeyRyZWZfY29udGVudH1bJGldID1+IC9eICokLykKLQl7IG15ICRuZXh0X2VsdCA9ICQgeyRyZWZfY29udGVudH1bJGkrMV07Ci0JICBpZiAoKHJlZiAkbmV4dF9lbHQpICYmICgkbmV4dF9lbHQtPnRhZyA9fiAvXihicnxkZHxkbHxkdHxocnxwfHVsKSQvKSkKLQkgICAgeyBzcGxpY2UoQHskcmVmX2NvbnRlbnR9LCAkaSwgMSk7Ci0JICAgICAgJGktLTsgfSB9IH0KLSAgaWYgKCRoZS0+dGFnID1+IC9eKGRkfGR0fF5oWzEtNl18bGl8cCkkLykKLSAgICB7IG15ICRsYXN0X2VsdCA9ICQgeyRyZWZfY29udGVudH1bJCN7JHJlZl9jb250ZW50fV07Ci0gICAgICBpZiAoKGRlZmluZWQgJGxhc3RfZWx0KSAmJiAoJGxhc3RfZWx0ID1+IC9eICokLykpCi0JeyBwb3AgQHskcmVmX2NvbnRlbnR9OyB9IH0KLX0KLQotCi0jIExhVGVYMkhUTUwgc29tZXRpbWVzIGNyZWF0ZXMKLSMgICA8RFQ+dGV4dAotIyAgIDxETCBDT01QQUNUPjxERD50ZXh0Ci0jIHdoaWNoIHNob3VsZCBhY3R1YWxseSBiZToKLSMgICA8REwgQ09NUEFDVD4KLSMgICA8RFQ+dGV4dAotIyAgIDxERD50ZXh0Ci0jIFNpbmNlIGEgPERMPiBnZXRzIGFkZGVkLCB0aGlzIGVuZHMgdXAgbG9va2luZyBsaWtlCi0jIDxQPgotIyAgIDxETD4KLSMgICAgIDxEVD4KLSMgICAgICAgdGV4dDEuLi4KLSMgICAgICAgPERMIENPTVBBQ1Q+Ci0jICAgICAgICAgPEREPgotIyAgICAgICAgICAgdGV4dDIuLi4KLSMgICAgICAgICBkdF9vcl9kZDEuLi4KLSMgICAgIGR0X29yX2RkMi4uLgotIyB3aGljaCBzaG91bGQgYmVjb21lCi0jIDxQPgotIyAgIDxETCBDT01QQUNUPgotIyAgICAgPERUPgotIyAgICAgICB0ZXh0MS4uLgotIyAgICAgPEREPgotIyAgICAgICB0ZXh0Mi4uLgotIyAgICAgZHRfb3JfZGQxLi4uCi0jICAgICBkdF9vcl9kZDIuLi4KLQotc3ViIHJlb3JkZXJfZHRfYW5kX2RsICggJCQkICkKLXsgbXkgKCRoZSwgJHN0YXJ0ZmxhZykgPSAoY2hlY2tfYXJncygzLCBAXykpWzAsMV07ICMgIGlnbm9yZSBkZXB0aCBhcmd1bWVudAotICBpZiAoISRzdGFydGZsYWcpCi0gICAgeyByZXR1cm47IH0KLQotICBpZiAoJGhlLT50YWcoKSBlcSAicCIpCi0gICAgeyBteSAkcmVmX3Bjb250ZW50ID0gJGhlLT5jb250ZW50KCk7Ci0gICAgICBpZiAoZGVmaW5lZCAkcmVmX3Bjb250ZW50KQotCXsgbXkgQHBjb250ZW50ID0gQHskcmVmX3Bjb250ZW50fTsKLQkgICMgcHJpbnQgInJlb3JkZXJfZHRfYW5kX2RsIGZvdW5kIGEgPHA+XG4iOyAkaGUtPmR1bXAoKTsKLQkgIGlmICgoc2NhbGFyKEBwY29udGVudCkgPj0gMSkKLQkgICAgICAmJiAocmVmICRwY29udGVudFswXSkgJiYgKCRwY29udGVudFswXS0+dGFnKCkgZXEgImRsIikKLQkgICAgICAmJiAkcGNvbnRlbnRbMF0tPmltcGxpY2l0KCkpCi0JICAgIHsgbXkgJHJlZl9kbGNvbnRlbnQgPSAkcGNvbnRlbnRbMF0tPmNvbnRlbnQoKTsKLQkgICAgICAjIHByaW50ICJyZW9yZGVyX2R0X2FuZF9kbCBmb3VuZCBhIDxwPiBhbmQgaW1wbGljaXQgPGRsPlxuIjsKLQkgICAgICBpZiAoZGVmaW5lZCAkcmVmX2RsY29udGVudCkKLQkJeyBteSBAZGxjb250ZW50ID0gQHskcmVmX2RsY29udGVudH07Ci0JCSAgaWYgKChzY2FsYXIoQGRsY29udGVudCkgPj0gMSkKLQkJICAgICAgJiYgKHJlZiAkZGxjb250ZW50WzBdKSAmJiAoJGRsY29udGVudFswXS0+dGFnKCkgZXEgImR0IikpCi0JCSAgICB7IG15ICRyZWZfZHRjb250ZW50ID0gJGRsY29udGVudFswXS0+Y29udGVudCgpOwotCQkgICAgICAjIHByaW50ICJyZW9yZGVyX2R0X2FuZF9kbCBmb3VuZCBhIDxwPiwgaW1wbGljaXQgPGRsPiwgYW5kIDxkdD5cbiI7Ci0JCSAgICAgIGlmIChkZWZpbmVkICRyZWZfZHRjb250ZW50KQotCQkJeyBteSBAZHRjb250ZW50ID0gQHskcmVmX2R0Y29udGVudH07Ci0JCQkgIGlmICgoc2NhbGFyKEBkdGNvbnRlbnQpID4gMCkKLQkJCSAgICAgICYmIChyZWYgJGR0Y29udGVudFskI2R0Y29udGVudF0pCi0JCQkgICAgICAmJiAoJGR0Y29udGVudFskI2R0Y29udGVudF0tPnRhZygpIGVxICJkbCIpKQotCQkJICAgIHsgbXkgJHJlZl9kbDJjb250ZW50ID0gJGR0Y29udGVudFskI2R0Y29udGVudF0tPmNvbnRlbnQoKTsKLQkJCSAgICAgICMgcHJpbnQgInJlb3JkZXJfZHRfYW5kX2RsIGZvdW5kIGEgPHA+LCBpbXBsaWNpdCA8ZGw+LCA8ZHQ+LCBhbmQgPGRsPlxuIjsKLQkJCSAgICAgIGlmIChkZWZpbmVkICRyZWZfZGwyY29udGVudCkKLQkJCQl7IG15IEBkbDJjb250ZW50ID0gQHskcmVmX2RsMmNvbnRlbnR9OwotCQkJCSAgaWYgKChzY2FsYXIoQGRsMmNvbnRlbnQpID4gMCkKLQkJCQkgICAgICAmJiAocmVmICgkZGwyY29udGVudFswXSkpCi0JCQkJICAgICAgJiYgKCRkbDJjb250ZW50WzBdLT50YWcoKSBlcSAiZGQiKSkKLQkJCSAgICB7Ci0JCQkgICAgICAjIHByaW50ICJyZW9yZGVyX2R0X2FuZF9kbCBmb3VuZCBhIDxwPiwgaW1wbGljaXQgPGRsPiwgPGR0PiwgPGRsPiwgYW5kIDxkZD5cbiI7Ci0JCQkgICAgICAjIHByaW50IFNUREVSUiAiQ0hBTkdJTkdcbiI7ICRoZS0+ZHVtcCgpOwotCQkJICAgICAgaHRtbF9yZXBsYWNlX2J5X2lnbm9yZSgkZHRjb250ZW50WyQjZHRjb250ZW50XSk7Ci0JCQkgICAgICBzcGxpY2UoQHskcmVmX2RsY29udGVudH0sIDEsIDAsIEBkbDJjb250ZW50KTsKLQkJCSAgICAgICMgcHJpbnQgU1RERVJSICJDSEFOR0VEIFRPOlxuIjsgJGhlLT5kdW1wKCk7Ci0JCQkgICAgICByZXR1cm4gMDsgIyBkb24ndCB0cmF2ZXJzZSBjaGlsZHJlbgotCQkJICAgIH0gfSB9IH0gfSB9IH0gfSB9Ci0gIHJldHVybiAxOwotfQotCi0KLSMgSWYgd2UgZmluZCBhIHBhcmFncmFwaCB0aGF0IGxvb2tzIGxpa2UKLSMgPFA+Ci0jICAgPEhSPgotIyAgIDxVTD4KLSMgdGhlbiBhY2N1bXVsYXRlIGl0cyBsaW5rcyBpbnRvIGEgY29udGVudHNfbGlzdCBhbmQgZGVsZXRlIHRoZSBwYXJhZ3JhcGguCi1zdWIgcHJvY2Vzc19pZl9jaGlsZF9saW5rcyAoICQkJCApCi17IG15ICgkaGUsICRzdGFydGZsYWcpID0gKGNoZWNrX2FyZ3MoMywgQF8pKVswLDFdOyAjICBpZ25vcmUgZGVwdGggYXJndW1lbnQKLSAgaWYgKCEkc3RhcnRmbGFnKQotICAgIHsgcmV0dXJuOyB9Ci0KLSAgaWYgKCRoZS0+dGFnKCkgZXEgInAiKQotICAgIHsgbXkgJHJlZl9jb250ZW50ID0gJGhlLT5jb250ZW50KCk7Ci0gICAgICBpZiAoZGVmaW5lZCAkcmVmX2NvbnRlbnQpCi0JeyBteSBAY29udGVudCA9IEB7JHJlZl9jb250ZW50fTsKLQkgIGlmICgoc2NhbGFyKEBjb250ZW50KSA9PSAyKQotCSAgICAgICYmIChyZWYgJGNvbnRlbnRbMF0pICYmICRjb250ZW50WzBdLT50YWcoKSBlcSAiaHIiCi0JICAgICAgJiYgKHJlZiAkY29udGVudFsxXSkgJiYgJGNvbnRlbnRbMV0tPnRhZygpIGVxICJ1bCIpCi0JICAgIHsgcHJvY2Vzc19jaGlsZF9saW5rcygkaGUpOwotCSAgICAgICRoZS0+ZGVsZXRlKCk7Ci0JICAgICAgcmV0dXJuIDA7IH0gfSB9Ci0gIHJldHVybiAxOwotfQotCi0KLSMgSWYgd2UgZmluZAotIyAgICAgPEg0PgotIyAgICAgICAiRm9vdG5vdGVzIgotIyAgICAgPERMPgotIyAgICAgICA8RFQ+Ci0jICAgICAgICAgPEEgTkFNRT0iZm9vdDU2MCI+Ci0jICAgICAgICAgICAiLi4uYm9ycm93IgotIyAgICAgICAgIDxBIEhSRUY9InJlZmNvdW50c0luUHl0aG9uLmh0bWwjdGV4Mmh0bWwyIiBOQU1FPSJmb290NTYwIj4KLSMgICAgICAgICAgICIxLjIiCi0jICAgICAgIDxERD4KLSMgICAgICAgICAiVGhlIG1ldGFwaG9yIG9mIGBgYm9ycm93aW5nJycgYSByZWZlcmVuY2UgaXMgbm90IGNvbXBsZXRlbHkgY29ycmVjdDogdGhlIG93bmVyIHN0aWxsIGhhcyBhIGNvcHkgb2YgdGhlIHJlZmVyZW5jZS4gIgotIyAgICAgICAuLi4KLSMgdGhlbiByZWNvcmQgdGhlIGZvb3Rub3RlIGluZm9ybWF0aW9uIGFuZCBkZWxldGUgdGhlIHNlY3Rpb24gYW5kIGxpc3QuCi0KLW15ICRwcm9jZXNzX2lmX2Zvb3Rub3Rlc19leHBlY3RfZGxfbmV4dCA9IDA7Ci0KLXN1YiBwcm9jZXNzX2lmX2Zvb3Rub3RlcyAoICQkJCApCi17IG15ICgkaGUsICRzdGFydGZsYWcpID0gKGNoZWNrX2FyZ3MoMywgQF8pKVswLDFdOyAjICBpZ25vcmUgZGVwdGggYXJndW1lbnQKLSAgaWYgKCEkc3RhcnRmbGFnKQotICAgIHsgcmV0dXJuOyB9Ci0KLSAgaWYgKCgkaGUtPnRhZygpIGVxICJoNCIpCi0gICAgICAmJiBoYXNfc2luZ2xlX2NvbnRlbnRfc3RyaW5nKCRoZSkKLSAgICAgICYmICgkIHskaGUtPmNvbnRlbnR9WzBdIGVxICJGb290bm90ZXMiKSkKLSAgICB7IGh0bWxfcmVwbGFjZV9ieV9pZ25vcmUoJGhlKTsKLSAgICAgICRwcm9jZXNzX2lmX2Zvb3Rub3Rlc19leHBlY3RfZGxfbmV4dCA9IDE7Ci0gICAgICByZXR1cm4gMDsgfQotCi0gIGlmICgkcHJvY2Vzc19pZl9mb290bm90ZXNfZXhwZWN0X2RsX25leHQgJiYgKCRoZS0+dGFnKCkgZXEgImRsIikpCi0gICAgeyBteSAkcmVmX2NvbnRlbnQgPSAkaGUtPmNvbnRlbnQoKTsKLSAgICAgIGlmIChkZWZpbmVkICRyZWZfY29udGVudCkKLQl7ICRwcm9jZXNzX2lmX2Zvb3Rub3Rlc19leHBlY3RfZGxfbmV4dCA9IDA7Ci0JICBteSBAY29udGVudCA9IEB7JHJlZl9jb250ZW50fTsKLQkgIGZvciAobXkgJGk9MDsgJGk8JCNjb250ZW50OyAkaSs9MikKLQkgICAgeyBteSAkaGVfZHQgPSAkY29udGVudFskaV07Ci0JICAgICAgbXkgJGhlX2RkID0gJGNvbnRlbnRbJGkrMV07Ci0JICAgICAgaWYgKCgkaGVfZHQtPnRhZyBuZSAiZHQiKSB8fCAoJGhlX2RkLT50YWcgbmUgImRkIikpCi0JCXsgJGhlLT5kdW1wOwotCQkgIGRpZSAiZXhwZWN0ZWQgPERUPiBhbmQgPEREPiBhdCBwb3NpdGlvbnMgJGkgYW5kICIsICRpKzE7IH0KLQkgICAgICBteSBAZHRfY29udGVudCA9IEB7JGhlX2R0LT5jb250ZW50KCl9OwotCSAgICAgIGlmICgoc2NhbGFyKEBkdF9jb250ZW50KSAhPSAyKQotCQkgIHx8ICgkZHRfY29udGVudFswXS0+dGFnIG5lICJhIikKLQkJICB8fCAoJGR0X2NvbnRlbnRbMV0tPnRhZyBuZSAiYSIpKQotCQl7ICRoZV9kdC0+ZHVtcDsKLQkJICBkaWUgIkV4cGVjdGVkIDIgYW5jaG9ycyBhcyBjb250ZW50IG9mIDxEVD4iOyB9Ci0JICAgICAgbXkgKCRkdDFfbmFtZSwgJGR0MV9ocmVmLCAkZHQxX2NvbnRlbnQpID0gYW5jaG9yX2luZm8oJGR0X2NvbnRlbnRbMF0pOwotCSAgICAgIG15ICgkZHQyX25hbWUsICRkdDJfaHJlZiwgJGR0Ml9jb250ZW50KSA9IGFuY2hvcl9pbmZvKCRkdF9jb250ZW50WzBdKTsKLQkgICAgICAjIHVudXNlZDogJGR0MV9ocmVmLCAkZHQxX2NvbnRlbnQsICRkdDJfaHJlZiwgJGR0Ml9jb250ZW50Ci0JICAgICAgaWYgKCRkdDFfbmFtZSBuZSAkZHQyX25hbWUpCi0JCXsgJGhlX2R0LT5kdW1wOwotCQkgIGRpZSAiRXhwZWN0ZWQgaWRlbnRpY2FsIG5hbWVzIGZvciBhbmNob3JzIjsgfQotCSAgICAgIGh0bWxfcmVwbGFjZV9ieV9pZ25vcmUoJGhlX2RkKTsKLQkgICAgICAkaGVfZGQtPnRhZygiZGl2Iik7ICMgaGFzIG5vIGVmZmVjdAotCSAgICAgICRmb290bm90ZXN7JGR0MV9uYW1lfSA9ICRoZV9kZDsgfQotCSAgaHRtbF9yZXBsYWNlX2J5X2lnbm9yZSgkaGUpOwotCSAgcmV0dXJuIDA7IH0gfQotCi0gIGlmICgkcHJvY2Vzc19pZl9mb290bm90ZXNfZXhwZWN0X2RsX25leHQpCi0gICAgeyAkaGUtPmR1bXA7Ci0gICAgICBkaWUgIkV4cGVjdGVkIDxETD4gZm9yIGZvb3Rub3RlcyBuZXh0IjsgfQotCi0gIHJldHVybiAxOwotfQotCi0KLQotIyMgTWVyZ2UgdHdvIGFkamFjZW50IHBhcmFncmFwaHMgY29udGFpbmluZyA8REw+IGl0ZW1zLCBzdWNoIGFzOgotIyAgICAgPFA+Ci0jICAgICAgIDxETD4KLSMgICAgICAgICA8RFQ+Ci0jICAgICAgICAgICAuLi4KLSMgICAgICAgICA8REQ+Ci0jICAgICAgICAgICAuLi4KLSMgICAgIDxQPgotIyAgICAgICA8REw+Ci0jICAgICAgICAgPERUPgotIyAgICAgICAgICAgLi4uCi0jICAgICAgICAgPEREPgotIyAgICAgICAgICAgLi4uCi0KLXN1YiBtZXJnZV9kbCAoICQkJCApCi17IG15ICgkaGUsICRzdGFydGZsYWcpID0gKGNoZWNrX2FyZ3MoMywgQF8pKVswLDFdOyAjICBpZ25vcmUgZGVwdGggYXJndW1lbnQKLSAgaWYgKCEkc3RhcnRmbGFnKQotICAgIHsgcmV0dXJuOyB9Ci0KLSAgbXkgJHJlZl9jb250ZW50ID0gJGhlLT5jb250ZW50OwotICBpZiAoIWRlZmluZWQgJHJlZl9jb250ZW50KQotICAgIHsgcmV0dXJuOyB9Ci0gIG15ICRpID0gMDsKLSAgd2hpbGUgKCRpIDwgc2NhbGFyKEB7JHJlZl9jb250ZW50fSktMSkKLSAgICB7IG15ICRwMSA9ICQgeyRyZWZfY29udGVudH1bJGldOwotICAgICAgaWYgKChyZWYgJHAxKSAmJiAoJHAxLT50YWcgZXEgInAiKQotCSAgJiYgaGFzX3NpbmdsZV9jb250ZW50X3dpdGhfdGFnKCRwMSwgImRsIikpCi0JeyBteSAkZGwxID0gJCB7JHAxLT5jb250ZW50fVswXTsKLQkgICMgSW4gdGhpcyBsb29wLCByaHMsIG5vdCBsaHMsIG9mIDwgY29tcGFyaXNvbiBjaGFuZ2VzLAotCSAgIyBiZWNhdXNlIHdlIGFyZSByZW1vdmluZyBlbGVtZW50cyBmcm9tIHRoZSBjb250ZW50IG9mICRoZS4KLQkgIHdoaWxlICgkaSA8IHNjYWxhcihAeyRyZWZfY29udGVudH0pLTEpCi0JICAgIHsgbXkgJHAyID0gJCB7JHJlZl9jb250ZW50fVskaSsxXTsKLQkgICAgICBpZiAoISgocmVmICRwMikgJiYgKCRwMi0+dGFnIGVxICJwIikKLQkJICAgICYmIGhhc19zaW5nbGVfY29udGVudF93aXRoX3RhZygkcDIsICJkbCIpKSkKLQkJeyBsYXN0OyB9Ci0JICAgICAgIyBNZXJnZSB0aGVzZSB0d28gZWxlbWVudHMuCi0JICAgICAgc3BsaWNlKEB7JHJlZl9jb250ZW50fSwgJGkrMSwgMSk7ICMgcmVtb3ZlICRwMgotCSAgICAgIG15ICRkbDIgPSAkIHskcDItPmNvbnRlbnR9WzBdOwotCSAgICAgICRkbDEtPnB1c2hfY29udGVudChAeyRkbDItPmNvbnRlbnR9KTsgIyBwdXQgJGRsMidzIGNvbnRlbnQgaW4gJGRsMQotCSAgICB9Ci0JICAjIGV4dHJhIGluY3JlbWVudCBiZWNhdXNlIG5leHQgZWxlbWVudCBpc24ndCBhIGNhbmRpZGF0ZSBmb3IgJHAxCi0JICAkaSsrOyB9Ci0gICAgICAkaSsrOyB9Ci0gIHJldHVybiAxOwotfQotCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyMgVGVzdGluZwotIyMjCi0KLXN1YiB0ZXN0ICggJCQgKQoteyBteSAoJGFjdGlvbiwgJGZpbGUpID0gY2hlY2tfYXJncygyLCBAXyk7Ci0KLSAgIyBHZW5lcmFsIHRlc3RpbmcKLSAgaWYgKCgkYWN0aW9uIGVxICJ2aWV3IikgfHwgKCRhY3Rpb24gZXEgIiIpKQotICAgIHsgIyAjICRmaWxlID0gIi9ob21lcy9nd3MvbWVybnN0L3d3dy9saW5rcy5odG1sIjsKLSAgICAgICMgIyAkZmlsZSA9ICIvaG9tZXMvZ3dzL21lcm5zdC93d3cvaW5kZXguaHRtbCI7Ci0gICAgICAjICMgJGZpbGUgPSAiL2hvbWVzL2Zpc2gvbWVybnN0L2phdmEvZ3VkL2RvYy9tYW51YWwuaHRtbCI7Ci0gICAgICAjICMgJGZpbGUgPSAiL3Byb2plY3RzL2NlY2lsL2NlY2lsL2RvYy9tYW51YWxzL3N0ZGxpYi1tYW4vc3RkbGliL3N0ZGxpYi5odG1sIjsKLSAgICAgICMgIyAkZmlsZSA9ICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9pbmRleC5odG1sIjsKLSAgICAgICMgJGZpbGUgPSAiL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvYXBpL2NvbXBsZXhPYmplY3RzLmh0bWwiOwotICAgICAgbXkgJHRyZWUgPSBmaWxlX3RvX3RyZWUoJGZpbGUpOwotCi0gICAgICAjIyBUZXN0aW5nCi0gICAgICAjIHByaW50IFNUREVSUiAkdHJlZS0+YXNfSFRNTDsKLSAgICAgICR0cmVlLT5kdW1wKCk7Ci0KLSAgICAgICMgcHJpbnQgU1RERVJSICR0cmVlLT50YWcoKSwgIlxuIjsKLSAgICAgICMgcHJpbnQgU1RERVJSIEB7JHRyZWUtPmNvbnRlbnQoKX0sICJcbiI7Ci0gICAgICAjIAotICAgICAgIyBmb3IgKEB7ICR0cmVlLT5leHRyYWN0X2xpbmtzKHF3KGEgaW1nKSkgfSkgewotICAgICAgIyAgIG15ICgkbGluaywgJGxpbmtlbGVtKSA9IEAkXzsKLSAgICAgICMgICBwcmludCBTVERFUlIgIiRsaW5rICIsICRsaW5rZWxlbS0+YXNfSFRNTDsKLSAgICAgICMgICB9Ci0gICAgICAjIAotICAgICAgIyBwcmludCBTVERFUlIgQHskdHJlZS0+ZXh0cmFjdF9saW5rcygpfSwgIlxuIjsKLQotICAgICAgIyBteSBAdG9wX2xldmVsX2VsdHMgPSBAeyR0cmVlLT5jb250ZW50KCl9OwotCi0gICAgICAjIGlmIHNjYWxhcihAeyR0cmVlLT5jb250ZW50KCl9KQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBlbHNpZiAoJGFjdGlvbiBlcSAicmF3IikKLSAgICB7IG15ICR0cmVlID0gbmV3IEhUTUw6OlRyZWVCdWlsZGVyOwotICAgICAgJHRyZWUtPmlnbm9yZV91bmtub3duKDEpOwotICAgICAgIyAkdHJlZS0+d2FybigxKTsKLSAgICAgICR0cmVlLT5wYXJzZV9maWxlKCRmaWxlKTsKLQotICAgICAgJHRyZWUtPmR1bXAoKTsKLQotICAgICAgIyBjbGVhbnVwX3BhcnNlX3RyZWUoJHRyZWUpOwotICAgICAgIyAkdHJlZS0+ZHVtcCgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAjIFRlc3QgZGVhbGluZyB3aXRoIGEgc2VjdGlvbi4KLSAgZWxzaWYgKCRhY3Rpb24gZXEgInNlY3Rpb24iKQotICAgIHsgIyBteSAkZmlsZTsKLSAgICAgICMgJGZpbGUgPSAiL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvYXBpL2ludHJvLmh0bWwiOwotICAgICAgIyAkZmlsZSA9ICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvaW5jbHVkZXMuaHRtbCI7Ci0gICAgICAjICRmaWxlID0gIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS9jb21wbGV4T2JqZWN0cy5odG1sIjsKLSAgICAgIHByb2Nlc3Nfc2VjdGlvbl9maWxlKCRmaWxlLCAwLCAiVGl0bGUiKTsKLSAgICB9Ci0KLSAgIyBUZXN0IGRlYWxpbmcgd2l0aCBtYW55IHNlY3Rpb25zCi0gIGVsc2lmICgwKQotICAgIHsgbXkgQGZpbGVzID0gKCIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvYWJvdXQuaHRtbCIsCi0JCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvYWJzdHJhY3QuaHRtbCIsCi0JCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvYXBpLmh0bWwiLAotCQkgICAiL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvYXBpL2NPYmplY3RzLmh0bWwiLAotCQkgICAiL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvYXBpL2NvbXBsZXhPYmplY3RzLmh0bWwiLAotCQkgICAiL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvYXBpL2NvbmNyZXRlLmh0bWwiLAotCQkgICAjICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvY29udGVudHMuaHRtbCIsCi0JCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvY291bnRpbmdSZWZzLmh0bWwiLAotCQkgICAiL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvYXBpL2RlYnVnZ2luZy5odG1sIiwKLQkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS9kaWN0T2JqZWN0cy5odG1sIiwKLQkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS9lbWJlZGRpbmcuaHRtbCIsCi0JCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvZXhjZXB0aW9uSGFuZGxpbmcuaHRtbCIsCi0JCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvZXhjZXB0aW9ucy5odG1sIiwKLQkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS9maWxlT2JqZWN0cy5odG1sIiwKLQkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS9mbG9hdE9iamVjdHMuaHRtbCIsCi0JCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvZnJvbnQuaHRtbCIsCi0JCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvZnVuZGFtZW50YWwuaHRtbCIsCi0JCSAgICMgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS9nZW5pbmRleC5odG1sIiwKLQkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS9pbXBvcnRpbmcuaHRtbCIsCi0JCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvaW5jbHVkZXMuaHRtbCIsCi0JCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvaW5kZXguaHRtbCIsCi0JCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvaW5pdGlhbGl6YXRpb24uaHRtbCIsCi0JCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvaW50T2JqZWN0cy5odG1sIiwKLQkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS9pbnRyby5odG1sIiwKLQkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS9saXN0T2JqZWN0cy5odG1sIiwKLQkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS9sb25nT2JqZWN0cy5odG1sIiwKLQkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS9tYXBPYmplY3RzLmh0bWwiLAotCQkgICAiL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvYXBpL21hcHBpbmcuaHRtbCIsCi0JCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvbmV3VHlwZXMuaHRtbCIsCi0JCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvbm9kZTI0Lmh0bWwiLAotCQkgICAiL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvYXBpL25vbmVPYmplY3QuaHRtbCIsCi0JCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvbnVtYmVyLmh0bWwiLAotCQkgICAiL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvYXBpL251bWVyaWNPYmplY3RzLmh0bWwiLAotCQkgICAiL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvYXBpL29iamVjdC5odG1sIiwKLQkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS9vYmplY3RzLmh0bWwiLAotCQkgICAiL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvYXBpL29zLmh0bWwiLAotCQkgICAiL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvYXBpL290aGVyT2JqZWN0cy5odG1sIiwKLQkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS9wcm9jZXNzQ29udHJvbC5odG1sIiwKLQkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS9yZWZjb3VudERldGFpbHMuaHRtbCIsCi0JCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvcmVmY291bnRzLmh0bWwiLAotCQkgICAiL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvYXBpL3NlcXVlbmNlLmh0bWwiLAotCQkgICAiL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvYXBpL3NlcXVlbmNlT2JqZWN0cy5odG1sIiwKLQkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS9zdGFuZGFyZEV4Y2VwdGlvbnMuaHRtbCIsCi0JCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvc3RyaW5nT2JqZWN0cy5odG1sIiwKLQkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS90aHJlYWRzLmh0bWwiLAotCQkgICAiL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvYXBpL3R1cGxlT2JqZWN0cy5odG1sIiwKLQkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS90eXBlT2JqZWN0cy5odG1sIiwKLQkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS90eXBlcy5odG1sIiwKLQkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS91dGlsaXRpZXMuaHRtbCIsCi0JCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvdmVyeWhpZ2guaHRtbCIpOwotICAgICAgZm9yIG15ICRmaWxlIChAZmlsZXMpCi0JeyBwcmludCBTVERFUlIgIlxuIiwgIj0iIHggNzUsICJcbiIsICIkZmlsZTpcbiI7Ci0JICBwcm9jZXNzX3NlY3Rpb25fZmlsZSgkZmlsZSwgMCwgIlRpdGxlIik7Ci0JfQotICAgIH0KLQotICAjIFRlc3QgZGVhbGluZyB3aXRoIGluZGV4LgotICBlbHNpZiAoJGFjdGlvbiBlcSAiaW5kZXgiKQotICAgIHsgIyBteSAkZmlsZTsKLSAgICAgICMgJGZpbGUgPSAiL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvYXBpL2dlbmluZGV4Lmh0bWwiOwotCi0gICAgICBwcm9jZXNzX2luZGV4X2ZpbGUoJGZpbGUsICJcQGNpbmRleCIpOwotICAgICAgcHJpbnRfaW5kZXhfaW5mbygpOwotICAgIH0KLQotICBlbHNlCi0gICAgeyBkaWUgIlVucmVjb2duaXplZCBhY3Rpb24gYCRhY3Rpb24nIjsgfQotfQotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMjIE1haW4gbG9vcAotIyMjCi0KLXN1YiBwcm9jZXNzX2NvbnRlbnRzX2ZpbGUgKCAkICkKLXsgbXkgKCRmaWxlKSA9IGNoZWNrX2FyZ3MoMSwgQF8pOwotCi0gICMgY291bGQgYWxzbyB1c2UgRmlsZTo6QmFzZW5hbWUKLSAgbXkgJGluZm9fZmlsZSA9ICRmaWxlOwotICAkaW5mb19maWxlID1+IHMvKFwvP2luZGV4KT9cLmh0bWwkLy87Ci0gIGlmICgkaW5mb19maWxlIGVxICIiKQotICAgIHsgY2hvbXAoJGluZm9fZmlsZSA9IGBwd2RgKTsgfQotICAkaW5mb19maWxlID1+IHMvXi4qXC8vLzsJIyBub3QgdGhlIG1vc3QgZWZmaWNpZW50IHdheSB0byByZW1vdmUgZGlycwotCi0gICRodG1sX2RpcmVjdG9yeSA9ICRmaWxlOwotICAkaHRtbF9kaXJlY3RvcnkgPX4gcy8oXC98XilbXlwvXSskLyQxLzsKLQotICBteSAkdGV4aV9maWxlID0gIiRpbmZvX2ZpbGUudGV4aSI7Ci0gIG9wZW4oVEVYSSwgIj4kdGV4aV9maWxlIik7Ci0KLSAgcHJpbnQgVEVYSSAiXFxpbnB1dCB0ZXhpbmZvICAgXEBjIC0qLXRleGluZm8tKi1cbiI7Ci0gIHByaW50IFRFWEkgIlxAYyAlKipzdGFydCBvZiBoZWFkZXJcbiI7Ci0gIHByaW50IFRFWEkgIlxAc2V0ZmlsZW5hbWUgJGluZm9fZmlsZVxuIjsKLQotICAjIDIuIFN1bW1hcnkgRGVzY3JpcHRpb24gYW5kIENvcHlyaWdodAotICAjICAgICAgVGhlICJTdW1tYXJ5IERlc2NyaXB0aW9uIGFuZCBDb3B5cmlnaHQiIHNlZ21lbnQgZGVzY3JpYmVzIHRoZQotICAjICAgICAgZG9jdW1lbnQgYW5kIGNvbnRhaW5zIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBjb3B5aW5nIHBlcm1pc3Npb25zCi0gICMgICAgICBmb3IgdGhlIEluZm8gZmlsZS4gIFRoZSBzZWdtZW50IG11c3QgYmUgZW5jbG9zZWQgYmV0d2VlbiBgQGlmaW5mbycKLSAgIyAgICAgIGFuZCBgQGVuZCBpZmluZm8nIGNvbW1hbmRzIHNvIHRoYXQgdGhlIGZvcm1hdHRlcnMgcGxhY2UgaXQgb25seSBpbgotICAjICAgICAgdGhlIEluZm8gZmlsZS4KLSAgIyAKLSAgIyBUaGUgc3VtbWFyeSBkZXNjcmlwdGlvbiBhbmQgY29weXJpZ2h0IHNlZ21lbnQgZG9lcyBub3QgYXBwZWFyIGluIHRoZQotICAjIHByaW50ZWQgZG9jdW1lbnQuCi0gICMgCi0gICMgICAgICBAaWZpbmZvCi0gICMgICAgICBUaGlzIGlzIGEgc2hvcnQgZXhhbXBsZSBvZiBhIGNvbXBsZXRlIFRleGluZm8gZmlsZS4KLSAgIyAgICAgIAotICAjICAgICAgQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTkwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAjICAgICAgQGVuZCBpZmluZm8KLQotCi0gICMgMy4gVGl0bGUgYW5kIENvcHlyaWdodAotICAjICAgICAgVGhlICJUaXRsZSBhbmQgQ29weXJpZ2h0IiBzZWdtZW50IGNvbnRhaW5zIHRoZSB0aXRsZSBhbmQgY29weXJpZ2h0Ci0gICMgICAgICBwYWdlcyBhbmQgY29weWluZyBwZXJtaXNzaW9ucyBmb3IgdGhlIHByaW50ZWQgbWFudWFsLiAgVGhlIHNlZ21lbnQKLSAgIyAgICAgIG11c3QgYmUgZW5jbG9zZWQgYmV0d2VlbiBgQHRpdGxlcGFnZScgYW5kIGBAZW5kIHRpdGxlcGFnZScKLSAgIyAgICAgIGNvbW1hbmRzLiAgVGhlIHRpdGxlIGFuZCBjb3B5cmlnaHQgcGFnZSBhcHBlYXIgb25seSBpbiB0aGUgcHJpbnRlZAotICAjICAgICAgbWFudWFsLgotICAjIAotICAjIFRoZSB0aXRsZXBhZ2Ugc2VnbWVudCBkb2VzIG5vdCBhcHBlYXIgaW4gdGhlIEluZm8gZmlsZS4KLSAgIyAKLSAgIyAgICAgIEB0aXRsZXBhZ2UKLSAgIyAgICAgIEBzcCAxMAotICAjICAgICAgQGNvbW1lbnQgVGhlIHRpdGxlIGlzIHByaW50ZWQgaW4gYSBsYXJnZSBmb250LgotICAjICAgICAgQGNlbnRlciBAdGl0bGVmb250e1NhbXBsZSBUaXRsZX0KLSAgIyAgICAgIAotICAjICAgICAgQGMgVGhlIGZvbGxvd2luZyB0d28gY29tbWFuZHMgc3RhcnQgdGhlIGNvcHlyaWdodCBwYWdlLgotICAjICAgICAgQHBhZ2UKLSAgIyAgICAgIEB2c2tpcCAwcHQgcGx1cyAxZmlsbGwKLSAgIyAgICAgIENvcHlyaWdodCBAY29weXJpZ2h0e30gMTk5MCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIyAgICAgIEBlbmQgdGl0bGVwYWdlCi0KLQotICAjIDQuIGBUb3AnIE5vZGUgYW5kIE1hc3RlciBNZW51Ci0gICMgICAgICBUaGUgIk1hc3RlciBNZW51IiBjb250YWlucyBhIGNvbXBsZXRlIG1lbnUgb2YgYWxsIHRoZSBub2RlcyBpbiB0aGUKLSAgIyAgICAgIHdob2xlIEluZm8gZmlsZS4gIEl0IGFwcGVhcnMgb25seSBpbiB0aGUgSW5mbyBmaWxlLCBpbiB0aGUgYFRvcCcKLSAgIyAgICAgIG5vZGUuCi0gICMgCi0gICMgVGhlIGBUb3AnIG5vZGUgY29udGFpbnMgdGhlIG1hc3RlciBtZW51IGZvciB0aGUgSW5mbyBmaWxlLiAgU2luY2UgYQotICAjIHByaW50ZWQgbWFudWFsIHVzZXMgYSB0YWJsZSBvZiBjb250ZW50cyByYXRoZXIgdGhhbiBhIG1lbnUsIHRoZSBtYXN0ZXIKLSAgIyBtZW51IGFwcGVhcnMgb25seSBpbiB0aGUgSW5mbyBmaWxlLgotICAjIAotICAjICAgICAgQG5vZGUgICAgVG9wLCAgICAgICBGaXJzdCBDaGFwdGVyLCAsICAgICAgICAgKGRpcikKLSAgIyAgICAgIEBjb21tZW50IG5vZGUtbmFtZSwgbmV4dCwgICAgICAgICAgcHJldmlvdXMsIHVwCi0gICMgCi0gICMgICAgICBAbWVudQotICAjICAgICAgKiBGaXJzdCBDaGFwdGVyOjogICAgVGhlIGZpcnN0IGNoYXB0ZXIgaXMgdGhlCi0gICMgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5IGNoYXB0ZXIgaW4gdGhpcyBzYW1wbGUuCi0gICMgICAgICAqIENvbmNlcHQgSW5kZXg6OiAgICBUaGlzIGluZGV4IGhhcyB0d28gZW50cmllcy4KLSAgIyAgICAgIEBlbmQgbWVudQotCi0KLQotICAkY3VycmVudF9yZWZfdGRmID0gWyAiVG9wIiwgMCwgJEFSR1ZbMF0gXTsKLSAgcHJvY2Vzc19zZWN0aW9uX2ZpbGUoJGZpbGUsIDAsICJUb3AiKTsKLSAgd2hpbGUgKHNjYWxhcihAY29udGVudHNfbGlzdCkpCi0gIHsgJGN1cnJlbnRfcmVmX3RkZiA9IHNoaWZ0IEBjb250ZW50c19saXN0OwotICAgIHByb2Nlc3Nfc2VjdGlvbl9maWxlKCQgeyRjdXJyZW50X3JlZl90ZGZ9WzJdLCAkIHskY3VycmVudF9yZWZfdGRmfVsxXSwgJCB7JGN1cnJlbnRfcmVmX3RkZn1bMF0pOwotICB9Ci0KLSAgcHJpbnQgVEVYSSAiXG4iOwotICBmb3IgbXkgJGluZGV4dGl0bGUgKEBpbmRleF90aXRsZXMpCi0gICAgeyBwcmludCBURVhJICJcQG5vZGUgJGluZGV4dGl0bGVcbiI7Ci0gICAgICBwcmludCBURVhJICJcQHVubnVtYmVyZWQgJGluZGV4dGl0bGVcbiI7Ci0gICAgICBwcmludCBURVhJICJcQHByaW50aW5kZXggJCB7JGluZGV4X2luZm97JGluZGV4dGl0bGV9fVsxXVxuIjsKLSAgICAgIHByaW50IFRFWEkgIlxuIjsgfQotCi0gIHByaW50IFRFWEkgIlxAY29udGVudHNcbiI7Ci0gIHByaW50IFRFWEkgIlxAYnllXG4iOwotICBjbG9zZShURVhJKTsKLX0KLQotIyBUaGlzIG5lZWRzIHRvIGJlIGxhc3Qgc28gZ2xvYmFsIHZhcmlhYmxlIGluaXRpYWxpemF0aW9ucyBhcmUgcmVhY2hlZC4KLQotaWYgKHNjYWxhcihAQVJHVikgPT0gMCkKLXsgZGllICJObyBhcmd1bWVudHMgc3VwcGxpZWQgdG8gaHRtbDJ0ZXhpLnBsIjsgfQotCi1pZiAoJEFSR1ZbMF0gZXEgIi10ZXN0IikKLXsgbXkgQHRlc3RfYXJncyA9IEBBUkdWWzEuLiQjQVJHVl07Ci0gIGlmIChzY2FsYXIoQHRlc3RfYXJncykgPT0gMCkKLSAgICB7IHRlc3QoIiIsICJpbmRleC5odG1sIik7IH0KLSAgZWxzaWYgKHNjYWxhcihAdGVzdF9hcmdzKSA9PSAxKQotICAgIHsgdGVzdCgiIiwgJHRlc3RfYXJnc1swXSk7IH0KLSAgZWxzaWYgKHNjYWxhcihAdGVzdF9hcmdzKSA9PSAyKQotICAgIHsgdGVzdCgkdGVzdF9hcmdzWzBdLCAkdGVzdF9hcmdzWzFdKTsgfQotICBlbHNlCi0gICAgeyBkaWUgIlRvbyBtYW55IHRlc3QgYXJndW1lbnRzIHBhc3NlZCB0byBodG1sMnRleGk6ICIsIGpvaW4oIiAiLCBAQVJHVik7IH0KLSAgZXhpdCgpOwotfQotCi1pZiAoc2NhbGFyKEBBUkdWKSAhPSAxKQoteyBkaWUgIlBhc3Mgb25lIGFyZ3VtZW50LCB0aGUgbWFpbi9jb250ZW50cyBwYWdlIjsgfQotCi1wcm9jZXNzX2NvbnRlbnRzX2ZpbGUoJEFSR1ZbMF0pOwotCi0jIGVuZCBvZiBodG1sMnRleGkucGwKZGlmZiAtLWdpdCBhL0RvYy90b29scy9pbmRmaXgucHkgYi9Eb2MvdG9vbHMvaW5kZml4LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyM2Y5ZTE3Li4wMDAwMDAwCi0tLSBhL0RvYy90b29scy9pbmRmaXgucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotIyEgL3Vzci9iaW4vZW52IHB5dGhvbgotCi0iIiJDb21iaW5lIHNpbWlsYXIgaW5kZXggZW50cmllcyBpbnRvIGFuIGVudHJ5IGFuZCBzdWJlbnRyaWVzLgotCi1Gb3IgZXhhbXBsZToKLQotICAgIFxpdGVtIHtmb29iYXJ9IChpbiBtb2R1bGUgZmxvdHopLCAyMwotICAgIFxpdGVtIHtmb29iYXJ9IChpbiBtb2R1bGUgd2hhY2tpdCksIDQzMjMKLQotYmVjb21lcwotCi0gICAgXGl0ZW0ge2Zvb2Jhcn0KLSAgICAgIFxzdWJpdGVtIGluIG1vZHVsZSBmbG90eiwgMjMKLSAgICAgIFxzdWJpdGVtIGluIG1vZHVsZSB3aGFja2l0LCA0MzIzCi0KLU5vdGUgdGhhdCBhbiBpdGVtIHdoaWNoIG1hdGNoZXMgdGhlIGZvcm1hdCBvZiBhIGNvbGxhcHNhYmxlIGl0ZW0gYnV0IHdoaWNoCi1pc24ndCBwYXJ0IG9mIGEgZ3JvdXAgb2Ygc2ltaWxhciBpdGVtcyBpcyBub3QgbW9kaWZpZWQuCi0iIiIKLV9fdmVyc2lvbl9fID0gJyRSZXZpc2lvbiQnCi0KLWltcG9ydCByZQotaW1wb3J0IGlvCi1pbXBvcnQgc3lzCi0KLQotZGVmIGNtcF9lbnRyaWVzKGUxLCBlMik6Ci0gICAgcmV0dXJuIGNtcChlMVsxXS5sb3dlcigpLCBlMlsxXS5sb3dlcigpKSBvciBjbXAoZTEsIGUyKQotCi0KLWRlZiBkdW1wX2VudHJpZXMod3JpdGUsIGVudHJpZXMpOgotICAgIGlmIGxlbihlbnRyaWVzKSA9PSAxOgotICAgICAgICB3cml0ZSgiICBcXGl0ZW0gJXMgKCVzKSVzXG4iICUgZW50cmllc1swXSkKLSAgICAgICAgcmV0dXJuCi0gICAgd3JpdGUoIiAgXGl0ZW0gJXNcbiIgJSBlbnRyaWVzWzBdWzBdKQotICAgICMgbm93IHNvcnQgdGhlc2UgaW4gYSBjYXNlIGluc2Vuc2l0aXZlIG1hbm5lcjoKLSAgICBpZiBsZW4oZW50cmllcykgPiAwOgotICAgICAgICBlbnRyaWVzLnNvcnQoY21wX2VudHJpZXMpCi0gICAgZm9yIHh4eCwgc3ViaXRlbSwgcGFnZXMgaW4gZW50cmllczoKLSAgICAgICAgd3JpdGUoIiAgICBcc3ViaXRlbSAlcyVzXG4iICUgKHN1Yml0ZW0sIHBhZ2VzKSkKLQotCi1icmVha2FibGVfcmUgPSByZS5jb21waWxlKAotICAgIHIiICBcXGl0ZW0gKC4qKSBbKF0oLiopWyldKCg/Oig/OiwgXGQrKXwoPzosIFxcW2Etel0qXHtcZCtcfSkpKykiKQotCi0KLWRlZiBwcm9jZXNzKGlmbiwgb2ZuPU5vbmUpOgotICAgIGlmIGlmbiA9PSAiLSI6Ci0gICAgICAgIGlmcCA9IHN5cy5zdGRpbgotICAgIGVsc2U6Ci0gICAgICAgIGlmcCA9IG9wZW4oaWZuKQotICAgIGlmIG9mbiBpcyBOb25lOgotICAgICAgICBvZm4gPSBpZm4KLSAgICBvZnAgPSBpby5TdHJpbmdJTygpCi0gICAgZW50cmllcyA9IFtdCi0gICAgbWF0Y2ggPSBicmVha2FibGVfcmUubWF0Y2gKLSAgICB3cml0ZSA9IG9mcC53cml0ZQotICAgIHdoaWxlIDE6Ci0gICAgICAgIGxpbmUgPSBpZnAucmVhZGxpbmUoKQotICAgICAgICBpZiBub3QgbGluZToKLSAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIG0gPSBtYXRjaChsaW5lKQotICAgICAgICBpZiBtOgotICAgICAgICAgICAgZW50cnkgPSBtLmdyb3VwKDEsIDIsIDMpCi0gICAgICAgICAgICBpZiBlbnRyaWVzIGFuZCBlbnRyaWVzWy0xXVswXSAhPSBlbnRyeVswXToKLSAgICAgICAgICAgICAgICBkdW1wX2VudHJpZXMod3JpdGUsIGVudHJpZXMpCi0gICAgICAgICAgICAgICAgZW50cmllcyA9IFtdCi0gICAgICAgICAgICBlbnRyaWVzLmFwcGVuZChlbnRyeSkKLSAgICAgICAgZWxpZiBlbnRyaWVzOgotICAgICAgICAgICAgZHVtcF9lbnRyaWVzKHdyaXRlLCBlbnRyaWVzKQotICAgICAgICAgICAgZW50cmllcyA9IFtdCi0gICAgICAgICAgICB3cml0ZShsaW5lKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgd3JpdGUobGluZSkKLSAgICBkZWwgd3JpdGUKLSAgICBkZWwgbWF0Y2gKLSAgICBpZnAuY2xvc2UoKQotICAgIGRhdGEgPSBvZnAuZ2V0dmFsdWUoKQotICAgIG9mcC5jbG9zZSgpCi0gICAgaWYgb2ZuID09ICItIjoKLSAgICAgICAgb2ZwID0gc3lzLnN0ZG91dAotICAgIGVsc2U6Ci0gICAgICAgIG9mcCA9IG9wZW4ob2ZuLCAidyIpCi0gICAgb2ZwLndyaXRlKGRhdGEpCi0gICAgb2ZwLmNsb3NlKCkKLQotCi1kZWYgbWFpbigpOgotICAgIGltcG9ydCBnZXRvcHQKLSAgICBvdXRmaWxlID0gTm9uZQotICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgIm86IikKLSAgICBmb3Igb3B0LCB2YWwgaW4gb3B0czoKLSAgICAgICAgaWYgb3B0IGluICgiLW8iLCAiLS1vdXRwdXQiKToKLSAgICAgICAgICAgIG91dGZpbGUgPSB2YWwKLSAgICBmaWxlbmFtZSA9IGFyZ3NbMF0KLSAgICBvdXRmaWxlID0gb3V0ZmlsZSBvciBmaWxlbmFtZQotICAgIHByb2Nlc3MoZmlsZW5hbWUsIG91dGZpbGUpCi0KLQotaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgICBtYWluKCkKZGlmZiAtLWdpdCBhL0RvYy90b29scy9rZXl3b3Jkcy5weSBiL0RvYy90b29scy9rZXl3b3Jkcy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjllNGIwMy4uMDAwMDAwMAotLS0gYS9Eb2MvdG9vbHMva2V5d29yZHMucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uCi0KLSMgVGhpcyBQeXRob24gcHJvZ3JhbSBzb3J0cyBhbmQgcmVmb3JtYXRzIHRoZSB0YWJsZSBvZiBrZXl3b3JkcyBpbiByZWYyLnRleAotCi1kZWYgcmF3X2lucHV0KHByb21wdCk6Ci0gICAgaW1wb3J0IHN5cwotICAgIHN5cy5zdGRvdXQud3JpdGUocHJvbXB0KQotICAgIHN5cy5zdGRvdXQuZmx1c2goKQotICAgIHJldHVybiBzeXMuc3RkaW4ucmVhZGxpbmUoKQotCi1sID0gW10KLXRyeToKLSAgICB3aGlsZSAxOgotICAgICAgICBsID0gbCArIHJhd19pbnB1dCgpLnNwbGl0KCkKLWV4Y2VwdCBFT0ZFcnJvcjoKLSAgICBwYXNzCi1sLnNvcnQoKQotZm9yIHggaW4gbFs6XToKLSAgICB3aGlsZSBsLmNvdW50KHgpID4gMTogbC5yZW1vdmUoeCkKLW5jb2xzID0gNQotbnJvd3MgPSAobGVuKGwpK25jb2xzLTEpL25jb2xzCi1mb3IgaSBpbiByYW5nZShucm93cyk6Ci0gICAgZm9yIGogaW4gcmFuZ2UoaSwgbGVuKGwpLCBucm93cyk6Ci0gICAgICAgIHByaW50KGxbal0ubGp1c3QoMTApLCBlbmQ9JyAnKQotICAgIHByaW50KCkKZGlmZiAtLWdpdCBhL0RvYy90b29scy9saXN0bW9kdWxlcyBiL0RvYy90b29scy9saXN0bW9kdWxlcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTYwNDk2Yi4uMDAwMDAwMAotLS0gYS9Eb2MvdG9vbHMvbGlzdG1vZHVsZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotIyEgL3Vzci9iaW4vZW52IHB5dGhvbgotIyAgLSotIFB5dGhvbiAtKi0KLSMKLSMgIFRoaXMgc2NyaXB0IGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHVuZG9jdW1lbnRlZCBtb2R1bGVzIGluIHRoZSBQeXRob24KLSMgIHN0YW5kYXJkIGxpYnJhcnkuICBVc2UgaXQgbGlrZSB0aGlzOgotIwotIyAgLi4uL0RvYy90b29scy9saXN0bW9kdWxlcyAtLWlnbm9yZS1mcm9tIC4uLi9Eb2MvcGFwZXItPHBhcGVyPi9tb2RsaWIuaWR4Ci0KLSIiIiUocHJvZ3JhbSlzIC0gbGlzdCBtb2R1bGVzIGluIHRoZSBQeXRob24gc3RhbmRhcmQgbGlicmFyeQotCi0tYSwgLS1hbm5vdGF0ZQkgIEFubm90YXRlIHRoZSBtb2R1bGUgbmFtZXMgd2l0aCB0aGUgc3ViZGlyZWN0b3J5IHRoZXkKLSAgICAgICAgICAgICAgICAgIGxpdmUgaW4KLS1jLCAtLWNhdGVnb3JpemUgIEdyb3VwIHRoZSBtb2R1bGVzIGJ5IHN1YmRpcmVjdG9yeQotLWkgPGZpbGU+LAotCi0tLWlnbm9yZS1mcm9tIDxmaWxlPglJZ25vcmUgdGhlIG1vZHVsZXMgbGlzdGVkIGluIDxmaWxlPi4gIDxmaWxlPiBtYXkKLSAgICAgICAgICAgICAgICAgIGNvbnRhaW4gYSBsaXN0IG9mIG1vZHVsZSBuYW1lcyBvciBhIG1vZHVsZSBpbmRleCBmaWxlCi0gICAgICAgICAgICAgICAgICBhcyBwcm9kdWNlZCB3aGVuIGZvcm1hdHRpbmcgdGhlIFB5dGhvbiBkb2N1bWVudGF0aW9uCi0gICAgICAgICAgICAgICAgICAoLmlkeCBvciAuaHRtbCBmbGF2b3IpLgotCi1JZiBuZWl0aGVyIC1hIG5vciAtYyBhcmUgZ2l2ZW4sIHRoZSBtb2R1bGVzIGFyZSBsaXN0ZWQgaW4gYWxwaGFiZXRpY2FsCi1vcmRlci4KLQotTm90ZSB0aGF0IC1hIGFuZCAtYyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgotCi1MaW1pdGF0aW9uOiBNb2R1bGVzIGxvYWRhYmxlIGFzIHNoYXJlZCBvYmplY3RzIG1heSBub3QgYmUgbGlzdGVkLAotdGhvdWdoIHRoaXMgc2NyaXB0IGF0dGVtcHRzIHRvIGxvY2F0ZSBzdWNoIG1vZHVsZXMuCi0KLSIiIgotCi1fX3ZlcnNpb25fXyA9ICckUmV2aXNpb24kJwotCi1pbXBvcnQgZ2V0b3B0Ci1pbXBvcnQgZ2xvYgotaW1wb3J0IG9zCi1pbXBvcnQgcmUKLWltcG9ydCBzeXMKLQotCi1SRU1PVkVfRElSUyA9IFsiZW5jb2RpbmdzIiwgImRpc3R1dGlscyIsCi0gICAgICAgICAgICAgICAibGliLW9sZCIsICIidGVzdCJdCi0KLQotZGVmIG1haW4oKToKLSAgICBhcmdzID0gc3lzLmFyZ3ZbMTpdCi0gICAgYW5ub3RhdGUgPSAwCi0gICAgYnVpbHRpbiA9IDAKLSAgICBjYXRlZ29yaXplID0gMAotICAgIGlnbm9yZV9kaWN0ID0ge30KLSAgICBpZ25vcmUgPSBpZ25vcmVfZGljdC5oYXNfa2V5Ci0gICAgdHJ5OgotICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdCgKLSAgICAgICAgICAgIGFyZ3MsICJhYmNoaToiLAotICAgICAgICAgICAgWyJhbm5vdGF0ZSIsICJidWlsdC1pbiIsICJjYXRlZ29yaXplIiwgImhlbHAiLCAiaWdub3JlLWZyb209Il0pCi0gICAgZXhjZXB0IGdldG9wdC5lcnJvciBhcyBtc2c6Ci0gICAgICAgIHN5cy5zdGRvdXQgPSBzeXMuc3RkZXJyCi0gICAgICAgIHByaW50IG1zZwotICAgICAgICBwcmludAotICAgICAgICB1c2FnZSgpCi0gICAgICAgIHN5cy5leGl0KDIpCi0gICAgZm9yIG9wdCwgYXJnIGluIG9wdHM6Ci0gICAgICAgIGlmIG9wdCBpbiAoIi1hIiwgIi0tYW5ub3RhdGUiKToKLSAgICAgICAgICAgIGFubm90YXRlID0gMQotICAgICAgICBlbGlmIG9wdCBpbiAoIi1iIiwgIi0tYnVpbHQtaW4iKToKLSAgICAgICAgICAgIGJ1aWx0aW4gPSAxCi0gICAgICAgIGVsaWYgb3B0IGluICgiLWMiLCAiLS1jYXRlZ29yaXplIik6Ci0gICAgICAgICAgICBjYXRlZ29yaXplID0gMQotICAgICAgICBlbGlmIG9wdCBpbiAoIi1oIiwgIi0taGVscCIpOgotICAgICAgICAgICAgdXNhZ2UoKQotICAgICAgICAgICAgc3lzLmV4aXQoKQotICAgICAgICBlbGlmIG9wdCBpbiAoIi1pIiwgIi0taWdub3JlLWZyb20iKToKLSAgICAgICAgICAgIGRhdGEgPSBvcGVuKGFyZykucmVhZCgpCi0gICAgICAgICAgICBpZiBkYXRhWzoxXSA9PSAiXFwiOgotICAgICAgICAgICAgICAgIGlnbm9yZV9mcm9tX2lkeChkYXRhLCBpZ25vcmVfZGljdCkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgaWdub3JlX2Zyb21fbW9kdWxlbGlzdChkYXRhLCBpZ25vcmVfZGljdCkKLSAgICBpZiBhcmdzIG9yIChhbm5vdGF0ZSBhbmQgY2F0ZWdvcml6ZSk6Ci0gICAgICAgIHVzYWdlKCkKLSAgICAgICAgc3lzLmV4aXQoMikKLSAgICAjCi0gICAgIyBQb3B1bGF0ZSB0aGUgZGF0YWJhc2U6Ci0gICAgIwotICAgIHNyY2RpciA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5qb2luKAotICAgICAgICBvcy5wYXRoLmRpcm5hbWUoc3lzLmFyZ3ZbMF0pLCBvcy5wYXJkaXIsIG9zLnBhcmRpcikpCi0gICAgb3MuY2hkaXIoc3JjZGlyKQotICAgIG1vZHVsZXNfYnlfbmFtZSA9IHt9Ci0gICAgbW9kdWxlc19ieV9kaXIgPSB7fQotICAgIGlmIGJ1aWx0aW46Ci0gICAgICAgIGwgPSBbXQotICAgICAgICBtb2R1bGVzX2J5X2RpclsiPGJ1aWx0aW4+Il0gPSBsCi0gICAgICAgIGZvciBuYW1lIGluIHN5cy5idWlsdGluX21vZHVsZV9uYW1lczoKLSAgICAgICAgICAgIGlmIG5vdCBpZ25vcmUobmFtZSk6Ci0gICAgICAgICAgICAgICAgbW9kdWxlc19ieV9uYW1lW25hbWVdID0gIjxidWlsdC1pbj4iCi0gICAgICAgICAgICAgICAgbC5hcHBlbmQobmFtZSkKLSAgICByeCA9IHJlLmNvbXBpbGUoIkxpYi9wbGF0LVthLXpBLVowLTldKi8iKQotICAgIGZwID0gb3MucG9wZW4oImZpbmQgTGliIC1uYW1lIFwqLnB5IC1wcmludCIsICJyIikKLSAgICB3aGlsZSAxOgotICAgICAgICBsaW5lID0gZnAucmVhZGxpbmUoKQotICAgICAgICBpZiBub3QgbGluZToKLSAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIG0gPSByeC5tYXRjaChsaW5lKQotICAgICAgICBpZiBtOgotICAgICAgICAgICAgbGluZSA9ICJMaWIvcGxhdC0qLyIgKyBsaW5lW20uZW5kKCk6XQotICAgICAgICBsaW5lID0gbGluZVs0Oi00XSAgICAgICAgICAgICAgICAjIHN0cmlwIG9mZiAnTGliLycgYW5kICcucHlcbicKLSAgICAgICAgZGlyLCBuYW1lID0gb3MucGF0aC5zcGxpdChsaW5lKQotICAgICAgICBkaXIgPSBkaXIgb3IgIjxzdGFuZGFyZD4iCi0gICAgICAgIGlmIGlnbm9yZShuYW1lKToKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIGlmIGRpciBub3QgaW4gUkVNT1ZFX0RJUlM6Ci0gICAgICAgICAgICBtb2R1bGVzX2J5X25hbWVbbmFtZV0gPSBkaXIKLSAgICAgICAgICAgIGwgPSBtb2R1bGVzX2J5X2Rpci5nZXQoZGlyLCBbXSkKLSAgICAgICAgICAgIG1vZHVsZXNfYnlfZGlyW2Rpcl0gPSBsCi0gICAgICAgICAgICBpZiBuYW1lIG5vdCBpbiBsOgotICAgICAgICAgICAgICAgIGwuYXBwZW5kKG5hbWUpCi0gICAgIyBsb2FkIHVwIGV4dGVuc2lvbiBtb2R1bGVzOgotICAgIHB3ZCA9IG9zLmdldGN3ZCgpCi0gICAgdHJ5OgotICAgICAgICBvcy5jaGRpcigiTW9kdWxlcyIpCi0gICAgICAgIGRpciA9ICI8ZXh0ZW5zaW9uPiIKLSAgICAgICAgZm9yIGxpbmUgaW4gZ2xvYi5nbG9iKCIqbW9kdWxlLmMiKToKLSAgICAgICAgICAgIG5hbWUgPSBsaW5lWzotOF0KLSAgICAgICAgICAgIGlmIGlnbm9yZShuYW1lKSBvciBtb2R1bGVzX2J5X25hbWUuaGFzX2tleShuYW1lKSBvciBuYW1lID09ICJ4eCI6Ci0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIG1vZHVsZXNfYnlfbmFtZVtuYW1lXSA9IGRpcgotICAgICAgICAgICAgbCA9IG1vZHVsZXNfYnlfZGlyLmdldChkaXIsIFtdKQotICAgICAgICAgICAgbW9kdWxlc19ieV9kaXJbZGlyXSA9IGwKLSAgICAgICAgICAgIGlmIG5hbWUgbm90IGluIGw6Ci0gICAgICAgICAgICAgICAgbC5hcHBlbmQobmFtZSkKLSAgICBmaW5hbGx5OgotICAgICAgICBvcy5jaGRpcihwd2QpCi0gICAgIwotICAgICMgRHVtcCB0aGUgcmVzdWx0czoKLSAgICAjCi0gICAgaWYgYW5ub3RhdGU6Ci0gICAgICAgIG1vZHVsZXMgPSBtb2R1bGVzX2J5X25hbWUuaXRlbXMoKQotICAgICAgICBtb2R1bGVzLnNvcnQoKQotICAgICAgICB3aWR0aCA9IG1heChtYXAobGVuLCBtb2R1bGVzX2J5X25hbWUua2V5cygpKSkKLSAgICAgICAgZm9ybWF0ID0gIiUlLSVkcyAgJSVzIiAlIHdpZHRoCi0gICAgICAgIGZvciBuYW1lLCBkaXIgaW4gbW9kdWxlczoKLSAgICAgICAgICAgIGlmIGRpciBhbmQgZGlyWzBdICE9ICI8IjoKLSAgICAgICAgICAgICAgICBwcmludCBmb3JtYXQgJSAobmFtZSwgZGlyKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBwcmludCBuYW1lCi0gICAgZWxpZiBjYXRlZ29yaXplOgotICAgICAgICBtb2R1bGVzID0gbW9kdWxlc19ieV9kaXIuaXRlbXMoKQotICAgICAgICBtb2R1bGVzLnNvcnQoKQotICAgICAgICB3aWR0aCA9IG1heChtYXAobGVuLCBtb2R1bGVzX2J5X2Rpci5rZXlzKCkpKQotICAgICAgICBmb3JtYXQgPSAiJSUtJWRzICAlJXMiICUgd2lkdGgKLSAgICAgICAgZm9yIGRpciwgbmFtZXMgaW4gbW9kdWxlczoKLSAgICAgICAgICAgIG5hbWVzLnNvcnQoKQotICAgICAgICAgICAgcHJpbnQgZm9ybWF0ICUgKGRpciwgbmFtZXNbMF0pCi0gICAgICAgICAgICBmb3IgbmFtZSBpbiBuYW1lc1sxOl06Ci0gICAgICAgICAgICAgICAgcHJpbnQgZm9ybWF0ICUgKCcnLCBuYW1lKQotICAgICAgICAgICAgcHJpbnQKLSAgICBlbHNlOgotICAgICAgICBtb2R1bGVzID0gbW9kdWxlc19ieV9uYW1lLmtleXMoKQotICAgICAgICBtb2R1bGVzLnNvcnQoKQotICAgICAgICBwcmludCAiXG4iLmpvaW4obW9kdWxlcykKLQotCi1kZWYgaWdub3JlX2Zyb21fbW9kdWxlbGlzdChkYXRhLCBpZ25vcmVfZGljdCk6Ci0gICAgZm9yIG5hbWUgaW4gZGF0YS5zcGxpdCgpOgotICAgICAgICBpZ25vcmVfZGljdFtuYW1lXSA9IG5hbWUKLQotZGVmIGlnbm9yZV9mcm9tX2lkeChkYXRhLCBpZ25vcmVfZGljdCk6Ci0gICAgZGF0YSA9IGRhdGEucmVwbGFjZShyIlxoYWNrc2NvcmUgIHt9IiwgIl8iKQotICAgIHJ4ID0gcmUuY29tcGlsZShyIlxcaW5kZXhlbnRyeVxzKnsoW15AXSopQCIpCi0gICAgZm9yIGxpbmUgaW4gZGF0YS5zcGxpdCgiXG4iKToKLSAgICAgICAgbSA9IHJ4Lm1hdGNoKGxpbmUpCi0gICAgICAgIGlmIG06Ci0gICAgICAgICAgICBuYW1lID0gbS5ncm91cCgxKQotICAgICAgICAgICAgaWdub3JlX2RpY3RbbmFtZV0gPSBuYW1lCi0KLQotZGVmIHVzYWdlKCk6Ci0gICAgdmFycyA9IHt9Ci0gICAgdmFyc1sicHJvZ3JhbSJdID0gb3MucGF0aC5iYXNlbmFtZShzeXMuYXJndlswXSkKLSAgICBwcmludCBfX2RvY19fICUgdmFycwotCi0KLWlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgbWFpbigpCmRpZmYgLS1naXQgYS9Eb2MvdG9vbHMvbGlzdG1vZHVsZXMucHkgYi9Eb2MvdG9vbHMvbGlzdG1vZHVsZXMucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhY2RmNDMuLjAwMDAwMDAKLS0tIGEvRG9jL3Rvb2xzL2xpc3Rtb2R1bGVzLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLSMgJElkJAotIwotIyBMb2NhdGUgYWxsIHN0YW5kYXJkIG1vZHVsZXMgYXZhaWxhYmxlIGluIHRoaXMgYnVpbGQuCi0jCi0jIFRoaXMgc2NyaXB0IGlzIGRlc2lnbmVkIHRvIHJ1biBvbiBQeXRob24gMS41LjIgYW5kIG5ld2VyLgotIwotIyBXcml0dGVuIGJ5IEZyZWRyaWsgTHVuZGgsIEphbnVhcnkgMjAwNQotIwotCi1pbXBvcnQgaW1wLCBzeXMsIG9zLCByZSwgdGltZQotCi1pZGVudGlmaWVyID0gInB5dGhvbi0lcy0lcyIgJSAoc3lzLnZlcnNpb25bOjNdLCBzeXMucGxhdGZvcm0pCi10aW1lc3RhbXAgPSB0aW1lLnN0cmZ0aW1lKCIlWSVtJWRUJUglTSVTWiIsIHRpbWUuZ210aW1lKHRpbWUudGltZSgpKSkKLQotIyBrbm93biB0ZXN0IHBhY2thZ2VzCi1URVNUX1BBQ0tBR0VTID0gInRlc3QuIiwgImJzZGRiLnRlc3QuIiwgImRpc3R1dGlscy50ZXN0cy4iCi0KLXRyeToKLSAgICBpbXBvcnQgcGxhdGZvcm0KLSAgICBwbGF0Zm9ybSA9IHBsYXRmb3JtLnBsYXRmb3JtKCkKLWV4Y2VwdDoKLSAgICBwbGF0Zm9ybSA9IE5vbmUgIyB1bmtub3duCi0KLXN1ZmZpeGVzID0gaW1wLmdldF9zdWZmaXhlcygpCi0KLWRlZiBnZXRfc3VmZml4KGZpbGUpOgotICAgIGZvciBzdWZmaXggaW4gc3VmZml4ZXM6Ci0gICAgICAgIGlmIGZpbGVbLWxlbihzdWZmaXhbMF0pOl0gPT0gc3VmZml4WzBdOgotICAgICAgICAgICAgcmV0dXJuIHN1ZmZpeAotICAgIHJldHVybiBOb25lCi0KLWRlZiBtYWluKCk6Ci0KLSAgICBwYXRoID0gZ2V0cGF0aCgpCi0KLSAgICBtb2R1bGVzID0ge30KLSAgICBmb3IgbSBpbiBzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXM6Ci0gICAgICAgIG1vZHVsZXNbbV0gPSBOb25lCi0KLSAgICBmb3IgcCBpbiBwYXRoOgotICAgICAgICBtb2R1bGVzLnVwZGF0ZShnZXRtb2R1bGVzKHApKQotCi0gICAga2V5cyA9IHNvcnRlZChtb2R1bGVzLmtleXMoKSkKLQotICAgICMgZmlsdGVyIG91dCBrbm93biB0ZXN0IHBhY2thZ2VzCi0gICAgZGVmIGNiKG0pOgotICAgICAgICBmb3IgZCBpbiBURVNUX1BBQ0tBR0VTOgotICAgICAgICAgICAgaWYgbVs6bGVuKGQpXSA9PSBkOgotICAgICAgICAgICAgICAgIHJldHVybiAwCi0gICAgICAgIHJldHVybiAxCi0gICAga2V5cyA9IGZpbHRlcihjYiwga2V5cykKLQotICAgIHRyeToKLSAgICAgICAgb3V0ZmlsZSA9IHN5cy5hcmd2WzFdCi0gICAgICAgIGlmIG91dGZpbGUgPT0gIi0iOgotICAgICAgICAgICAgb3V0ZmlsZSA9IE5vbmUKLSAgICAgICAgZWxpZiBvdXRmaWxlID09ICItZiI6Ci0gICAgICAgICAgICBvdXRmaWxlID0gIm1vZHVsZXMtIiArIGlkZW50aWZpZXIgKyAiLnR4dCIKLSAgICBleGNlcHQgSW5kZXhFcnJvcjoKLSAgICAgICAgb3V0ZmlsZSA9IE5vbmUKLQotICAgIGlmIG5vdCBvdXRmaWxlOgotICAgICAgICBvdXQgPSBzeXMuc3Rkb3V0Ci0gICAgZWxzZToKLSAgICAgICAgb3V0ID0gb3BlbihvdXRmaWxlLCAidyIpCi0KLSAgICBvdXQud3JpdGUoIiMgbW9kdWxlIGxpc3QgKGdlbmVyYXRlZCBieSBsaXN0bW9kdWxlcy5weSlcbiIpCi0gICAgb3V0LndyaXRlKCIjXG4iKQotICAgIG91dC53cml0ZSgiIyB0aW1lc3RhbXA9JXNcbiIgJSByZXByKHRpbWVzdGFtcCkpCi0gICAgb3V0LndyaXRlKCIjIHN5cy52ZXJzaW9uPSVzXG4iICUgcmVwcihzeXMudmVyc2lvbikpCi0gICAgb3V0LndyaXRlKCIjIHN5cy5wbGF0Zm9ybT0lc1xuIiAlIHJlcHIoc3lzLnBsYXRmb3JtKSkKLSAgICBpZiBwbGF0Zm9ybToKLSAgICAgICAgb3V0LndyaXRlKCIjIHBsYXRmb3JtPSVzXG4iICUgcmVwcihwbGF0Zm9ybSkpCi0gICAgb3V0LndyaXRlKCIjXG4iKQotCi0gICAgZm9yIGsgaW4ga2V5czoKLSAgICAgICAgb3V0LndyaXRlKGsgKyAiXG4iKQotCi0gICAgaWYgb3V0IGlzIG5vdCBzeXMuc3Rkb3V0OgotICAgICAgICBvdXQuY2xvc2UoKQotICAgICAgICBwcmludChvdXQubmFtZSwgIm9rICglZCBtb2R1bGVzKSIgJSBsZW4obW9kdWxlcykpCi0KLWRlZiBnZXRtb2R1bGVzKHApOgotICAgICMgZ2V0IG1vZHVsZXMgaW4gYSBnaXZlbiBkaXJlY3RvcnkKLSAgICBtb2R1bGVzID0ge30KLSAgICBmb3IgZiBpbiBvcy5saXN0ZGlyKHApOgotICAgICAgICBmID0gb3MucGF0aC5qb2luKHAsIGYpCi0gICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGYpOgotICAgICAgICAgICAgbSwgZSA9IG9zLnBhdGguc3BsaXRleHQoZikKLSAgICAgICAgICAgIHN1ZmZpeCA9IGdldF9zdWZmaXgoZikKLSAgICAgICAgICAgIGlmIG5vdCBzdWZmaXg6Ci0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIG0gPSBvcy5wYXRoLmJhc2VuYW1lKG0pCi0gICAgICAgICAgICBpZiByZS5jb21waWxlKCIoP2kpW2Etel9dXHcqJCIpLm1hdGNoKG0pOgotICAgICAgICAgICAgICAgIGlmIHN1ZmZpeFsyXSA9PSBpbXAuQ19FWFRFTlNJT046Ci0gICAgICAgICAgICAgICAgICAgICMgY2hlY2sgdGhhdCB0aGlzIGV4dGVuc2lvbiBjYW4gYmUgaW1wb3J0ZWQKLSAgICAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICAgICAgX19pbXBvcnRfXyhtKQotICAgICAgICAgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgICAgIG1vZHVsZXNbbV0gPSBmCi0gICAgICAgIGVsaWYgb3MucGF0aC5pc2RpcihmKToKLSAgICAgICAgICAgIG0gPSBvcy5wYXRoLmJhc2VuYW1lKGYpCi0gICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShvcy5wYXRoLmpvaW4oZiwgIl9faW5pdF9fLnB5IikpOgotICAgICAgICAgICAgICAgIGZvciBtbSwgZiBpbiBnZXRtb2R1bGVzKGYpLml0ZW1zKCk6Ci0gICAgICAgICAgICAgICAgICAgIG1vZHVsZXNbbSArICIuIiArIG1tXSA9IGYKLSAgICByZXR1cm4gbW9kdWxlcwotCi1kZWYgZ2V0cGF0aCgpOgotICAgIHBhdGggPSBtYXAob3MucGF0aC5ub3JtY2FzZSwgbWFwKG9zLnBhdGguYWJzcGF0aCwgc3lzLnBhdGhbOl0pKQotICAgICMgZ2V0IHJpZCBvZiBzaXRlIHBhY2thZ2VzCi0gICAgZm9yIHAgaW4gcGF0aDoKLSAgICAgICAgaWYgcFstMTM6XSA9PSAic2l0ZS1wYWNrYWdlcyI6Ci0gICAgICAgICAgICBkZWYgY2IocCwgc2l0ZV9wYWNrYWdlX3BhdGg9b3MucGF0aC5hYnNwYXRoKHApKToKLSAgICAgICAgICAgICAgICByZXR1cm4gcFs6bGVuKHNpdGVfcGFja2FnZV9wYXRoKV0gIT0gc2l0ZV9wYWNrYWdlX3BhdGgKLSAgICAgICAgICAgIHBhdGggPSBmaWx0ZXIoY2IsIHBhdGgpCi0gICAgICAgICAgICBicmVhawotICAgICMgZ2V0IHJpZCBvZiBub24tZXhpc3RlbnQgZGlyZWN0b3JpZXMgYW5kIHRoZSBjdXJyZW50IGRpcmVjdG9yeQotICAgIGRlZiBjYihwLCBjd2Q9b3MucGF0aC5ub3JtY2FzZShvcy5nZXRjd2QoKSkpOgotICAgICAgICByZXR1cm4gb3MucGF0aC5pc2RpcihwKSBhbmQgcCAhPSBjd2QKLSAgICBwYXRoID0gZmlsdGVyKGNiLCBwYXRoKQotICAgIHJldHVybiBwYXRoCi0KLWlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgbWFpbigpCmRpZmYgLS1naXQgYS9Eb2MvdG9vbHMvbWFrZXNlYy5zaCBiL0RvYy90b29scy9tYWtlc2VjLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MTU5ZDZmLi4wMDAwMDAwCi0tLSBhL0RvYy90b29scy9tYWtlc2VjLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jIFNpbXBsZSBsaXR0bGUgY2hlY2tlciBmb3IgaW5kaXZpZHVhbCBsaWJyZWYgbWFudWFsIHNlY3Rpb25zCi0jCi0jIHVzYWdlOiBtYWtlc2VjLnNoIHNlY3Rpb24KLSMKLQotIyBUaGlzIHNjcmlwdCBidWlsZHMgdGhlIG1pbmltYWwgZmlsZSBuZWNlc3NhcnkgdG8gcnVuIGEgc2luZ2xlIHNlY3Rpb24KLSMgdGhyb3VnaCBsYXRleCwgZG9lcyBzbywgdGhlbiBjb252ZXJ0cyB0aGUgcmVzdWx0aW5nIGR2aSBmaWxlIHRvIHBzIG9yIHBkZgotIyBhbmQgZmVlZHMgdGhlIHJlc3VsdCBpbnRvIGEgdmlld2VyLiAgSXQncyBieSBubyBtZWFucyBmb29scHJvb2YsIGJ1dCBzZWVtcwotIyB0byB3b3JrIG9rYXkgZm9yIG1lIChrbm9jayB3b29kKS4gIEl0IHN1cmUgYmVhdHMgbWFudWFsbHkgY29tbWVudGluZyBvdXQKLSMgbW9zdCBvZiB0aGUgbWFuIGxpYi50ZXggZmlsZSBhbmQgcnVubmluZyBldmVyeXRoaW5nIG1hbnVhbGx5LgotCi0jIEl0IGF0dGVtcHRzIHRvIGxvY2F0ZSBhbiBhcHByb3ByaWF0ZSBkdmkgY29udmVydGVyIGFuZCB2aWV3ZXIgZm9yIHRoZQotIyBzZWxlY3RlZCBvdXRwdXQgZm9ybWF0LiAgSXQgdW5kZXJzdGFuZHMgdGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudAotIyB2YXJpYWJsZXM6Ci0jCi0jCVBZU1JDIC0gcmVmZXJzIHRvIHRoZSByb290IG9mIHlvdXIgYnVpbGQgdHJlZSAoZGlyIGNvbnRhaW5pbmcgRG9jKQotIwlEVklDVlQgLSByZWZlcnMgdG8gYSBkdmkgY29udmVydGVyIGxpa2UgZHZpcHMgb3IgZHZpcGRmCi0jCVZJRVdFUiAtIHJlZmVycyB0byBhbiBhcHByb3ByaWF0ZSB2aWV3ZXIgZm9yIHRoZSBwcy9wZGYgZmlsZQotIwotIyBPZiB0aGUgdGhyZWUsIG9ubHkgUFlTUkMgaXMgY3VycmVudGx5IHJlcXVpcmVkLiAgVGhlIG90aGVyIHR3byBjYW4gYmUgc2V0Ci0jIHRvIHNwZWNpZnkgdW51c3VhbCB0b29scyB3aGljaCBwZXJmb3JtIHRob3NlIHRhc2tzLgotCi0jIEtub3duIGlzc3VlczoKLSMgICAtIEl0IHdvdWxkIGJlIG5pY2UgaWYgdGhlIHNjcmlwdCBjb3VsZCBkZXRlcm1pbmUgUFlTUkMgb24gaXRzIG93bi4KLSMgICAtIFNvbWV0aGluZyBhYm91dCBcc2VlYWxzb3t9cyBibG93cyB0aGUgbGF0ZXggc3RhY2ssIHNvIHRoZXkgbmVlZAotIyAgICAgdG8gYmUgY29tbWVudGVkIG91dCBmb3Igbm93LgotCi1pZiBbIHgkUFlTUkMgPSB4IF0gOyB0aGVuCi0gICAgZWNobyAiUFlTUkMgbXVzdCByZWZlciB0byB0aGUgUHl0aG9uIHNvdXJjZSB0cmVlIiAxPiYyCi0gICAgZXhpdCAxCi1maQotCi1pZiBbICEgLWQgJFBZU1JDL0RvYyBdIDsgdGhlbgotICAgIGVjaG8gIkNhbid0IGZpbmQgYSBEb2Mgc3ViZGlyZWN0b3J5IGluICRQWVNSQyIgMT4mMgotICAgIGV4aXQgMQotZmkKLQotaWYgWyAiJCMiIC1uZSAxIF0gOyB0aGVuCi0gICAgZWNobyAiTXVzdCBzcGVjaWZ5IGEgc2luZ2xlIGxpYnJlZiBtYW51YWwgc2VjdGlvbiBvbiBjbWQgbGluZSIgMT4mMgotICAgIGV4aXQgMQotZmkKLQotIyBzZXR0bGUgb24gYSBkdmkgY29udmVydGVyCi1pZiBbIHgkRFZJQ1ZUICE9IHggXSA7IHRoZW4KLSAgICBjb252ZXJ0ZXI9JERWSUNWVAotICAgIGV4dD1gZWNobyAkRFZJQ1ZUIHwgc2VkIC1lICdzL15kdmkvLydgCi0gICAgcmVzdWx0PWxpYi4kZXh0Ci1lbGlmIFsgeGB3aGljaCBkdmlwZGZgICE9IHggXSA7IHRoZW4KLSAgICBjb252ZXJ0ZXI9YHdoaWNoIGR2aXBkZmAKLSAgICBleHQ9LnBkZgotZWxpZiBbIHhgd2hpY2ggZHZpcHNgICE9IHggXSA7IHRoZW4KLSAgICBjb252ZXJ0ZXI9YHdoaWNoIGR2aXBzYAotICAgIGV4dD0ucHMKLWVsc2UKLSAgICBlY2hvICJDYW4ndCBmaW5kIGEgcmVhc29uYWJsZSBkdmkgY29udmVydGVyIiAxPiYyCi0gICAgZWNobyAiU2V0IERWSUNWVCB0byByZWZlciB0byBvbmUiIDE+JjIKLSAgICBleGl0IDEKLWZpCi0KLSMgaG93IGFib3V0IGEgdmlld2VyPwotaWYgWyB4JFZJRVdFUiAhPSB4IF0gOyB0aGVuCi0gICAgdmlld2VyPSRWSUVXRVIKLWVsaWYgWyAkZXh0ID0gIi5wcyIgLWEgeGB3aGljaCBndmAgIT0geCBdIDsgdGhlbgotICAgIHZpZXdlcj1ndgotZWxpZiBbICRleHQgPSAiLnBzIiAtYSB4YHdoaWNoIGdzYCAhPSB4IF0gOyB0aGVuCi0gICAgdmlld2VyPWdzCi1lbGlmIFsgJGV4dCA9ICIucGRmIiAtYSB4YHdoaWNoIGFjcm9yZWFkYCAhPSB4IF0gOyB0aGVuCi0gICAgdmlld2VyPWFjcm9yZWFkCi1lbGlmIFsgJGV4dCA9ICIucGRmIiAtYSAiYHVuYW1lYCIgPSAiRGFyd2luIiAtYSB4YHdoaWNoIG9wZW5gICE9IHggXSA7IHRoZW4KLSAgICB2aWV3ZXI9b3BlbgotZWxpZiBbICRleHQgPSAiLnBkZiIgLWEgeGB3aGljaCBhY3JvcmVhZGAgIT0geCBdIDsgdGhlbgotICAgIHZpZXdlcj1hY3JvcmVhZAotZWxzZQotICAgIGVjaG8gIkNhbid0IGZpbmQgYSByZWFzb25hYmxlIHZpZXdlciIgMT4mMgotICAgIGVjaG8gIlNldCBWSUVXRVIgdG8gcmVmZXIgdG8gb25lIiAxPiYyCi0gICAgZXhpdCAxCi1maQotCi0jIG1ha2Ugc3VyZSBuZWNlc3NhcnkgbGlua3MgYXJlIGluIHBsYWNlCi1mb3IgZiBpbiBob3d0by5jbHMgcHlwYXBlci5zdHkgOyBkbwotICAgIHJtIC1mICRmCi0gICAgbG4gLXMgJFBZU1JDL0RvYy8kZgotZG9uZQotCi1leHBvcnQgVEVYSU5QVVRTPS46JFBZU1JDL0RvYy90ZXhpbnB1dHM6Ci0KLSMgc3RyaXAgZXh0ZW5zaW9uIGluIGNhc2UgdGhleSBnYXZlIGZ1bGwgZmlsZW5hbWUKLWlucD1gYmFzZW5hbWUgJDEgLnRleGAKLQotIyBjcmVhdGUgdGhlIG1pbmltYWwgZnJhbWV3b3JrIG5lY2Vzc2FyeSB0byBydW4gc2VjdGlvbiB0aHJvdWdoIGxhdGV4Ci10bXBmPWxpYi50ZXgKLWNhdCA+ICR0bXBmIDw8RU9GCi1cZG9jdW1lbnRjbGFzc3ttYW51YWx9Ci0KLSUgTk9URTogdGhpcyBmaWxlIGNvbnRyb2xzIHdoaWNoIGNoYXB0ZXJzL3NlY3Rpb25zIG9mIHRoZSBsaWJyYXJ5Ci0lIG1hbnVhbCBhcmUgYWN0dWFsbHkgcHJpbnRlZC4gIEl0IGlzIGVhc3kgdG8gY3VzdG9taXplIHlvdXIgbWFudWFsCi0lIGJ5IGNvbW1lbnRpbmcgb3V0IHNlY3Rpb25zIHRoYXQgeW91IGFyZSBub3QgaW50ZXJlc3RlZCBpbi4KLQotXHRpdGxle1B5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZX0KLQotXGlucHV0e2JvaWxlcnBsYXRlfQotCi1cbWFrZWluZGV4ICAgICAgICAgICAgICAgICAgICAgICUgdGVsbCBcaW5kZXggdG8gYWN0dWFsbHkgd3JpdGUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgLmlkeCBmaWxlCi1cbWFrZW1vZGluZGV4ICAgICAgICAgICAgICAgICAgICUgLi4uIGFuZCB0aGUgbW9kdWxlIGluZGV4IGFzIHdlbGwuCi0KLQotXGJlZ2lue2RvY3VtZW50fQotCi1cbWFrZXRpdGxlCi0KLVxpZmh0bWwKLVxjaGFwdGVyKntGcm9udCBNYXR0ZXJcbGFiZWx7ZnJvbnR9fQotXGZpCi0KLVxpbnB1dHskaW5wfQotXGVuZHtkb2N1bWVudH0KLUVPRgotCi1sYXRleCAkdG1wZgotCi0kY29udmVydGVyIGxpYgotCi0kdmlld2VyIGxpYi5wZGYKLQotcm0gLWYgJHRtcGYgaG93dG8uY2xzIHB5cGFwZXIuc3R5ICouaWR4ICouc3luCi1ybSAtZiBsaWIuYXV4IGxpYi5sb2cKZGlmZiAtLWdpdCBhL0RvYy90b29scy9ta2Fja3NodG1sIGIvRG9jL3Rvb2xzL21rYWNrc2h0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFjMTI2ZTAuLjAwMDAwMDAKLS0tIGEvRG9jL3Rvb2xzL21rYWNrc2h0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uCi0jICAtKi0gUHl0aG9uIC0qLQotCi1pbXBvcnQgc3VwcG9ydAotaW1wb3J0IHN5cwotCi0KLWRlZiBjb2xsZWN0KGZwKToKLSAgICBuYW1lcyA9IFtdCi0gICAgd2hpbGUgMToKLSAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKLSAgICAgICAgaWYgbm90IGxpbmU6Ci0gICAgICAgICAgICBicmVhawotICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCi0gICAgICAgIGlmIGxpbmU6Ci0gICAgICAgICAgICBuYW1lcy5hcHBlbmQobGluZSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIG5hbWVzID0gW10KLSAgICByZXR1cm4gbmFtZXMKLQotCi1kZWYgbWFpbigpOgotICAgIG9wdGlvbnMgPSBzdXBwb3J0Lk9wdGlvbnMoKQotICAgIG9wdGlvbnMuY29sdW1ucyA9IDQKLSAgICBvcHRpb25zLnZhcmlhYmxlc1sidGl0bGUiXSA9ICJBY2tub3dsZWRnZW1lbnRzIgotICAgIG9wdGlvbnMucGFyc2Uoc3lzLmFyZ3ZbMTpdKQotICAgIG5hbWVzID0gY29sbGVjdChzeXMuc3RkaW4pCi0gICAgcGVyY29sID0gKGxlbihuYW1lcykgKyBvcHRpb25zLmNvbHVtbnMgLSAxKSAvLyBvcHRpb25zLmNvbHVtbnMKLSAgICBjb2xudW1zID0gW10KLSAgICBmb3IgaSBpbiByYW5nZShvcHRpb25zLmNvbHVtbnMpOgotICAgICAgICBjb2xudW1zLmFwcGVuZChwZXJjb2wqaSkKLSAgICBvcHRpb25zLmFlc29wX3R5cGUgPSAiaW5mb3JtYXRpb24iCi0gICAgZnAgPSBvcHRpb25zLmdldF9vdXRwdXRfZmlsZSgpCi0gICAgZnAud3JpdGUob3B0aW9ucy5nZXRfaGVhZGVyKCkucnN0cmlwKCkgKyAiXG4iKQotICAgIGZwLndyaXRlKFRIQU5LUyArICJcbiIpCi0gICAgZnAud3JpdGUoJzx0YWJsZSB3aWR0aD0iMTAwJSIgYWxpZ249ImNlbnRlciI+XG4nKQotICAgIGZvciBpIGluIHJhbmdlKHBlcmNvbCk6Ci0gICAgICAgIGZwLndyaXRlKCIgIDx0cj5cbiIpCi0gICAgICAgIGZvciBqIGluIGNvbG51bXM6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgZnAud3JpdGUoIiAgICA8dGQ+JXM8L3RkPlxuIiAlIG5hbWVzW2kgKyBqXSkKLSAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgotICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgZnAud3JpdGUoIiAgPC90cj5cbiIpCi0gICAgZnAud3JpdGUoIjwvdGFibGU+XG4iKQotICAgIGZwLndyaXRlKG9wdGlvbnMuZ2V0X2Zvb3RlcigpLnJzdHJpcCgpICsgIlxuIikKLSAgICBmcC5jbG9zZSgpCi0KLVRIQU5LUyA9ICcnJ1wKLQotPHA+VGhlc2UgcGVvcGxlIGhhdmUgY29udHJpYnV0ZWQgaW4gc29tZSB3YXkgdG8gdGhlIFB5dGhvbgotZG9jdW1lbnRhdGlvbi4gIFRoaXMgbGlzdCBpcyBwcm9iYWJseSBub3QgY29tcGxldGUgLS0gaWYgeW91IGZlZWwgdGhhdAoteW91IG9yIGFueW9uZSBlbHNlIHNob3VsZCBiZSBvbiB0aGlzIGxpc3QsIHBsZWFzZSBsZXQgdXMga25vdyAoc2VuZAotZW1haWwgdG8gPGEKLWhyZWY9Im1haWx0bzpkb2NzQHB5dGhvbi5vcmciPmRvY3NAcHl0aG9uLm9yZzwvYT4pLCBhbmQKLXdlIHdpbGwgYmUgZ2xhZCB0byBjb3JyZWN0IHRoZSBwcm9ibGVtLjwvcD4KLQotPHA+SXQgaXMgb25seSB3aXRoIHRoZSBpbnB1dCBhbmQgY29udHJpYnV0aW9ucyBvZiB0aGUgUHl0aG9uIGNvbW11bml0eQotdGhhdCBQeXRob24gaGFzIHN1Y2ggd29uZGVyZnVsIGRvY3VtZW50YXRpb24gLS0gPGI+VGhhbmsgWW91ITwvYj48L3A+Ci0KLScnJwotCi0KLWlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgbWFpbigpCmRpZmYgLS1naXQgYS9Eb2MvdG9vbHMvbWtob3d0byBiL0RvYy90b29scy9ta2hvd3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYTI1OWUwLi4wMDAwMDAwCi0tLSBhL0RvYy90b29scy9ta2hvd3RvCisrKyAvZGV2L251bGwKQEAgLTEsNjU5ICswLDAgQEAKLSMhIC91c3IvYmluL2VudiBweXRob24KLSMgIC0qLSBQeXRob24gLSotCi0iIiJ1c2FnZTogJShwcm9ncmFtKXMgW29wdGlvbnMuLi5dIGZpbGUgLi4uCi0KLU9wdGlvbnMgc3BlY2lmeWluZyBmb3JtYXRzIHRvIGJ1aWxkOgotICAgIC0taHRtbAkJSHlwZXJUZXh0IE1hcmt1cCBMYW5ndWFnZSAoZGVmYXVsdCkKLSAgICAtLXBkZgkJUG9ydGFibGUgRG9jdW1lbnQgRm9ybWF0Ci0gICAgLS1wcwkJUG9zdFNjcmlwdAotICAgIC0tZHZpCQknRGVWaWNlIEluZGVwZW50ZW50JyBmb3JtYXQgZnJvbSBUZVgKLSAgICAtLXRleHQJCUFTQ0lJIHRleHQgKHJlcXVpcmVzIGx5bngpCi0KLSAgICBNb3JlIHRoYW4gb25lIG91dHB1dCBmb3JtYXQgbWF5IGJlIHNwZWNpZmllZCwgb3IgLS1hbGwuCi0KLUhUTUwgb3B0aW9uczoKLSAgICAtLWFkZHJlc3MsIC1hCVNwZWNpZnkgYW4gYWRkcmVzcyBmb3IgcGFnZSBmb290ZXJzLgotICAgIC0tZGlyCQlTcGVjaWZ5IHRoZSBkaXJlY3RvcnkgZm9yIEhUTUwgb3V0cHV0LgotICAgIC0tbGluawkJU3BlY2lmeSB0aGUgbnVtYmVyIG9mIGxldmVscyB0byBpbmNsdWRlIG9uIGVhY2ggcGFnZS4KLSAgICAtLXNwbGl0LCAtcwkJU3BlY2lmeSBhIHNlY3Rpb24gbGV2ZWwgZm9yIHBhZ2Ugc3BsaXR0aW5nLCBkZWZhdWx0OiAlKG1heF9zcGxpdF9kZXB0aClzLgotICAgIC0taWNvbnNlcnZlciwgLWkJU3BlY2lmeSBsb2NhdGlvbiBvZiBpY29ucyAoZGVmYXVsdDogLi8pLgotICAgIC0taW1hZ2UtdHlwZQlTcGVjaWZ5IHRoZSBpbWFnZSB0eXBlIHRvIHVzZSBpbiBIVE1MIG91dHB1dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogZ2lmLCBwbmcgKGRlZmF1bHQpLgotICAgIC0tbnVtZXJpYyAgICAgICAgICAgRG9uJ3QgcmVuYW1lIHRoZSBIVE1MIGZpbGVzOyBqdXN0IGtlZXAgbm9kZSMuaHRtbCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmaWxlbmFtZXMuCi0gICAgLS1zdHlsZSAgICAgICAgICAgICBTcGVjaWZ5IHRoZSBDU1MgZmlsZSB0byB1c2UgZm9yIHRoZSBvdXRwdXQgKGZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgbm90IGEgVVJMKS4KLSAgICAtLXVwLWxpbmsgICAgICAgICAgIFVSTCB0byBhIHBhcmVudCBkb2N1bWVudC4KLSAgICAtLXVwLXRpdGxlICAgICAgICAgIFRpdGxlIG9mIGEgcGFyZW50IGRvY3VtZW50LgotICAgIC0tZmF2aWNvbiAgICAgICAgICAgSWNvbiB0byBkaXNwbGF5IGluIHRoZSBicm93c2VycyBsb2NhdGlvbiBiYXIuCi0KLU90aGVyIG9wdGlvbnM6Ci0gICAgLS1hNAkJRm9ybWF0IGZvciBBNCBwYXBlci4KLSAgICAtLWxldHRlcgkJRm9ybWF0IGZvciBVUyBsZXR0ZXIgcGFwZXIgKHRoZSBkZWZhdWx0KS4KLSAgICAtLWhlbHAsIC1ICQlTaG93IHRoaXMgdGV4dC4KLSAgICAtLWxvZ2dpbmcsIC1sCUxvZyBzdGRvdXQgYW5kIHN0ZGVyciB0byBhIGZpbGUgKCouaG93KS4KLSAgICAtLWRlYnVnZ2luZywgLUQJRWNobyBjb21tYW5kcyBhcyB0aGV5IGFyZSBleGVjdXRlZC4KLSAgICAtLWtlZXAsIC1rCQlLZWVwIHRlbXBvcmFyeSBmaWxlcyBhcm91bmQuCi0gICAgLS1xdWlldCwgLXEJCURvIG5vdCBwcmludCBjb21tYW5kIG91dHB1dCB0byBzdGRvdXQuCi0JCQkoc3RkZXJyIGlzIGFsc28gbG9zdCwgIHNvcnJ5OyBzZWUgKi5ob3cgZm9yIGVycm9ycykKLSIiIgotCi1pbXBvcnQgZ2V0b3B0Ci1pbXBvcnQgZ2xvYgotaW1wb3J0IG9zCi1pbXBvcnQgcmUKLWltcG9ydCBzaHV0aWwKLWltcG9ydCBzeXMKLQotCi1NWURJUiA9IG9zLnBhdGguYWJzcGF0aChzeXMucGF0aFswXSkKLVRPUERJUiA9IG9zLnBhdGguZGlybmFtZShNWURJUikKLQotSVNURklMRSA9IG9zLnBhdGguam9pbihUT1BESVIsICJ0ZXhpbnB1dHMiLCAicHl0aG9uLmlzdCIpCi1OT0RFMkxBQkVMX1NDUklQVCA9IG9zLnBhdGguam9pbihNWURJUiwgIm5vZGUybGFiZWwucGwiKQotTDJIX0lOSVRfRklMRSA9IG9zLnBhdGguam9pbihUT1BESVIsICJwZXJsIiwgImwyaGluaXQucGVybCIpCi0KLUJJQlRFWF9CSU5BUlkgPSAiYmlidGV4IgotRFZJUFNfQklOQVJZID0gImR2aXBzIgotTEFURVhfQklOQVJZID0gImxhdGV4IgotTEFURVgySFRNTF9CSU5BUlkgPSAibGF0ZXgyaHRtbCIKLUxZTlhfQklOQVJZID0gImx5bngiCi1NQUtFSU5ERVhfQklOQVJZID0gIm1ha2VpbmRleCIKLVBERkxBVEVYX0JJTkFSWSA9ICJwZGZsYXRleCIKLVBFUkxfQklOQVJZID0gInBlcmwiCi1QWVRIT05fQklOQVJZID0gInB5dGhvbiIKLQotCi1kZWYgdXNhZ2Uob3B0aW9ucywgZmlsZSk6Ci0gICAgcHJpbnQoX19kb2NfXyAlIG9wdGlvbnMsIGZpbGU9ZmlsZSkKLQotZGVmIGVycm9yKG9wdGlvbnMsIG1lc3NhZ2UsIGVycj0yKToKLSAgICBwcmludChtZXNzYWdlLCBmaWxlPXN5cy5zdGRlcnIpCi0gICAgcHJpbnQoZmlsZT1zeXMuc3RkZXJyKQotICAgIHVzYWdlKG9wdGlvbnMsIHN5cy5zdGRlcnIpCi0gICAgc3lzLmV4aXQoMikKLQotCi1jbGFzcyBPcHRpb25zOgotICAgIHByb2dyYW0gPSBvcy5wYXRoLmJhc2VuYW1lKHN5cy5hcmd2WzBdKQotICAgICMKLSAgICBhZGRyZXNzID0gJycKLSAgICBidWlsZGRpciA9IE5vbmUKLSAgICBkZWJ1Z2dpbmcgPSAwCi0gICAgZGlzY2FyZF90ZW1wcyA9IDEKLSAgICBoYXZlX3RlbXBzID0gMAotICAgIGljb25fc2VydmVyID0gIi4iCi0gICAgaW1hZ2VfdHlwZSA9ICJwbmciCi0gICAgbG9nZ2luZyA9IDAKLSAgICBtYXhfbGlua19kZXB0aCA9IDMKLSAgICBtYXhfc3BsaXRfZGVwdGggPSA2Ci0gICAgcGFwZXIgPSAibGV0dGVyIgotICAgIHF1aWV0ID0gMAotICAgIHJ1bnMgPSAwCi0gICAgbnVtZXJpYyA9IDAKLSAgICBnbG9iYWxfbW9kdWxlX2luZGV4ID0gTm9uZQotICAgIHN0eWxlX2ZpbGUgPSBvcy5wYXRoLmpvaW4oVE9QRElSLCAiaHRtbCIsICJzdHlsZS5jc3MiKQotICAgIGFib3V0X2ZpbGUgPSBvcy5wYXRoLmpvaW4oVE9QRElSLCAiaHRtbCIsICJhYm91dC5kYXQiKQotICAgIHVwX2xpbmsgPSBOb25lCi0gICAgdXBfdGl0bGUgPSBOb25lCi0gICAgZmF2aWNvbiA9IE5vbmUKLSAgICAjCi0gICAgIyAnZHZpcHNfc2FmZScgaXMgYSB3ZWlyZCBvcHRpb24uICBJdCBpcyB1c2VkIG1vc3RseSB0byBtYWtlCi0gICAgIyBMYVRlWDJIVE1MIG5vdCB0cnkgdG8gYmUgdG9vIHNtYXJ0IGFib3V0IHByb3RlY3RpbmcgdGhlIHVzZXIKLSAgICAjIGZyb20gYSBiYWQgdmVyc2lvbiBvZiBkdmlwcyAtLSBzb21lIHZlcnNpb25zIHdvdWxkIGNvcmUgZHVtcCBpZgotICAgICMgdGhlIHBhdGggdG8gdGhlIHNvdXJjZSBEVkkgY29udGFpbmVkIGEgZG90LCBhbmQgaXQncyBhcHBlYXJhbnRseQotICAgICMgZGlmZmljdWx0IHRvIGRldGVybWluZSBpZiB0aGUgdmVyc2lvbiBhdmFpbGFibGUgaGFzIHRoYXQgYnVnLgotICAgICMgVGhpcyBvcHRpb24gZ2V0cyBzZXQgd2hlbiBQb3N0U2NyaXB0IG91dHB1dCBpcyByZXF1ZXN0ZWQKLSAgICAjIChiZWNhdXNlIHdlJ3JlIGdvaW5nIHRvIHJ1biBkdmlwcyByZWdhcmRsZXNzLCBhbmQgd2UnbGwgZWl0aGVyCi0gICAgIyBrbm93IGl0IHN1Y2NlZWRzIGJlZm9yZSBMYVRlWDJIVE1MIGlzIHJ1biwgb3Igd2UnbGwgaGF2ZQotICAgICMgZGV0ZWN0ZWQgdGhlIGZhaWx1cmUgYW5kIGJhaWxlZCksIG9yIHRoZSB1c2VyIGFzc2VydHMgdGhhdCBpdCdzCi0gICAgIyBzYWZlIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KLSAgICAjCi0gICAgIyBTbywgd2h5IGRvZXMgTGFUZVgySFRNTCB0aGluayBpdCBhcHByb3ByaWF0ZSB0byBwcm90ZWN0IHRoZSB1c2VyCi0gICAgIyBmcm9tIGEgZHZpcHMgdGhhdCdzIG9ubHkgcG90ZW50aWFsbHkgZ29pbmcgdG8gY29yZSBkdW1wPyAgT25seQotICAgICMgYmVjYXVzZSB0aGV5IHdhbnQgdG8gYXZvaWQgZG9pbmcgYSBsb3Qgb2Ygd29yayBqdXN0IHRvIGhhdmUgdG8KLSAgICAjIGJhaWwgbGF0ZXIgd2l0aCBubyB1c2VmdWwgaW50ZXJtZWRpYXRlcy4gIFVuZm9ydHVuYXRlbHksIHRoZXkKLSAgICAjIGJhaWwgKmJlZm9yZSogdGhleSBrbm93IHdoZXRoZXIgZHZpcHMgd2lsbCBiZSBuZWVkZWQgYXQgYWxsLgotICAgICMgSSd2ZSBnb25lIGFyb3VuZCB0aGUgYnVzaCBhIGZldyB0aW1lcyB3aXRoIHRoZSBMYVRlWDJIVE1MCi0gICAgIyBkZXZlbG9wZXJzIG92ZXIgd2hldGhlciB0aGlzIGlzIGFwcHJvcHJpYXRlIGJlaGF2aW9yLCBhbmQgdGhleQotICAgICMgZG9uJ3Qgc2VlbSBpbnRlcmVzdGVkIGluIGNoYW5naW5nIHRoZWlyIHBvc2l0aW9uLgotICAgICMKLSAgICBkdmlwc19zYWZlID0gMAotICAgICMKLSAgICBERUZBVUxUX0ZPUk1BVFMgPSAoImh0bWwiLCkKLSAgICBBTExfRk9STUFUUyA9ICgiZHZpIiwgImh0bWwiLCAicGRmIiwgInBzIiwgInRleHQiKQotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBzZWxmLmZvcm1hdHMgPSBbXQotICAgICAgICBzZWxmLmwyaF9pbml0X2ZpbGVzID0gW10KLQotICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgotICAgICAgICAjIFRoaXMgaXMgdXNlZCB3aGVuIGZvcm1hdHRpbmcgdGhlIHVzYWdlIG1lc3NhZ2UuCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIGtleSkKLSAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3Ioa2V5KQotCi0gICAgZGVmIHBhcnNlKHNlbGYsIGFyZ3MpOgotICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChhcmdzLCAiSGk6YTpzOmxEa3FyOiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiYWxsIiwgInBvc3RzY3JpcHQiLCAiaGVscCIsICJpY29uc2VydmVyPSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkcmVzcz0iLCAiYTQiLCAibGV0dGVyIiwgImwyaC1pbml0PSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGluaz0iLCAic3BsaXQ9IiwgImxvZ2dpbmciLCAiZGVidWdnaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrZWVwIiwgInF1aWV0IiwgInJ1bnM9IiwgImltYWdlLXR5cGU9IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhYm91dD0iLCAibnVtZXJpYyIsICJzdHlsZT0iLCAicGFwZXI9IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1cC1saW5rPSIsICJ1cC10aXRsZT0iLCAiZGlyPSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2xvYmFsLW1vZHVsZS1pbmRleD0iLCAiZHZpcHMtc2FmZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmF2aWNvbj0iXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGxpc3Qoc2VsZi5BTExfRk9STUFUUykpCi0gICAgICAgIGZvciBvcHQsIGFyZyBpbiBvcHRzOgotICAgICAgICAgICAgaWYgb3B0ID09ICItLWFsbCI6Ci0gICAgICAgICAgICAgICAgc2VsZi5mb3JtYXRzID0gbGlzdChzZWxmLkFMTF9GT1JNQVRTKQotICAgICAgICAgICAgICAgIHNlbGYuZHZpcHNfc2FmZSA9ICJwcyIgaW4gc2VsZi5mb3JtYXRzCi0gICAgICAgICAgICBlbGlmIG9wdCBpbiAoIi1IIiwgIi0taGVscCIpOgotICAgICAgICAgICAgICAgIHVzYWdlKHNlbGYsIHN5cy5zdGRvdXQpCi0gICAgICAgICAgICAgICAgc3lzLmV4aXQoKQotICAgICAgICAgICAgZWxpZiBvcHQgPT0gIi0taWNvbnNlcnZlciI6Ci0gICAgICAgICAgICAgICAgc2VsZi5pY29uX3NlcnZlciA9IGFyZwotICAgICAgICAgICAgZWxpZiBvcHQgaW4gKCItYSIsICItLWFkZHJlc3MiKToKLSAgICAgICAgICAgICAgICBzZWxmLmFkZHJlc3MgPSBhcmcKLSAgICAgICAgICAgIGVsaWYgb3B0ID09ICItLWE0IjoKLSAgICAgICAgICAgICAgICBzZWxmLnBhcGVyID0gImE0IgotICAgICAgICAgICAgZWxpZiBvcHQgPT0gIi0tbGV0dGVyIjoKLSAgICAgICAgICAgICAgICBzZWxmLnBhcGVyID0gImxldHRlciIKLSAgICAgICAgICAgIGVsaWYgb3B0ID09ICItLWxpbmsiOgotICAgICAgICAgICAgICAgIHNlbGYubWF4X2xpbmtfZGVwdGggPSBpbnQoYXJnKQotICAgICAgICAgICAgZWxpZiBvcHQgaW4gKCItcyIsICItLXNwbGl0Iik6Ci0gICAgICAgICAgICAgICAgc2VsZi5tYXhfc3BsaXRfZGVwdGggPSBpbnQoYXJnKQotICAgICAgICAgICAgZWxpZiBvcHQgaW4gKCItbCIsICItLWxvZ2dpbmciKToKLSAgICAgICAgICAgICAgICBzZWxmLmxvZ2dpbmcgPSBzZWxmLmxvZ2dpbmcgKyAxCi0gICAgICAgICAgICBlbGlmIG9wdCBpbiAoIi1EIiwgIi0tZGVidWdnaW5nIik6Ci0gICAgICAgICAgICAgICAgc2VsZi5kZWJ1Z2dpbmcgPSBzZWxmLmRlYnVnZ2luZyArIDEKLSAgICAgICAgICAgIGVsaWYgb3B0IGluICgiLWsiLCAiLS1rZWVwIik6Ci0gICAgICAgICAgICAgICAgc2VsZi5kaXNjYXJkX3RlbXBzID0gMAotICAgICAgICAgICAgZWxpZiBvcHQgaW4gKCItcSIsICItLXF1aWV0Iik6Ci0gICAgICAgICAgICAgICAgc2VsZi5xdWlldCA9IDEKLSAgICAgICAgICAgIGVsaWYgb3B0IGluICgiLXIiLCAiLS1ydW5zIik6Ci0gICAgICAgICAgICAgICAgc2VsZi5ydW5zID0gaW50KGFyZykKLSAgICAgICAgICAgIGVsaWYgb3B0ID09ICItLWltYWdlLXR5cGUiOgotICAgICAgICAgICAgICAgIHNlbGYuaW1hZ2VfdHlwZSA9IGFyZwotICAgICAgICAgICAgZWxpZiBvcHQgPT0gIi0tYWJvdXQiOgotICAgICAgICAgICAgICAgICMgYWx3YXlzIG1ha2UgdGhpcyBhYnNvbHV0ZToKLSAgICAgICAgICAgICAgICBzZWxmLmFib3V0X2ZpbGUgPSBvcy5wYXRoLm5vcm1wYXRoKAotICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmFic3BhdGgoYXJnKSkKLSAgICAgICAgICAgIGVsaWYgb3B0ID09ICItLW51bWVyaWMiOgotICAgICAgICAgICAgICAgIHNlbGYubnVtZXJpYyA9IDEKLSAgICAgICAgICAgIGVsaWYgb3B0ID09ICItLXN0eWxlIjoKLSAgICAgICAgICAgICAgICBzZWxmLnN0eWxlX2ZpbGUgPSBvcy5wYXRoLmFic3BhdGgoYXJnKQotICAgICAgICAgICAgZWxpZiBvcHQgPT0gIi0tbDJoLWluaXQiOgotICAgICAgICAgICAgICAgIHNlbGYubDJoX2luaXRfZmlsZXMuYXBwZW5kKG9zLnBhdGguYWJzcGF0aChhcmcpKQotICAgICAgICAgICAgZWxpZiBvcHQgPT0gIi0tZmF2aWNvbiI6Ci0gICAgICAgICAgICAgICAgc2VsZi5mYXZpY29uID0gYXJnCi0gICAgICAgICAgICBlbGlmIG9wdCA9PSAiLS11cC1saW5rIjoKLSAgICAgICAgICAgICAgICBzZWxmLnVwX2xpbmsgPSBhcmcKLSAgICAgICAgICAgIGVsaWYgb3B0ID09ICItLXVwLXRpdGxlIjoKLSAgICAgICAgICAgICAgICBzZWxmLnVwX3RpdGxlID0gYXJnCi0gICAgICAgICAgICBlbGlmIG9wdCA9PSAiLS1nbG9iYWwtbW9kdWxlLWluZGV4IjoKLSAgICAgICAgICAgICAgICBzZWxmLmdsb2JhbF9tb2R1bGVfaW5kZXggPSBhcmcKLSAgICAgICAgICAgIGVsaWYgb3B0ID09ICItLWRpciI6Ci0gICAgICAgICAgICAgICAgaWYgb3Muc2VwID09ICJcXCI6Ci0gICAgICAgICAgICAgICAgICAgIGFyZyA9IHJlLnN1YigiLyIsICJcXFxcIiwgYXJnKQotICAgICAgICAgICAgICAgIHNlbGYuYnVpbGRkaXIgPSBvcy5wYXRoLmV4cGFuZHVzZXIoYXJnKQotICAgICAgICAgICAgZWxpZiBvcHQgPT0gIi0tcGFwZXIiOgotICAgICAgICAgICAgICAgIHNlbGYucGFwZXIgPSBhcmcKLSAgICAgICAgICAgIGVsaWYgb3B0ID09ICItLWR2aXBzLXNhZmUiOgotICAgICAgICAgICAgICAgIHNlbGYuZHZpcHNfc2FmZSA9IDEKLSAgICAgICAgICAgICMKLSAgICAgICAgICAgICMgRm9ybWF0IHNwZWNpZmllcnM6Ci0gICAgICAgICAgICAjCi0gICAgICAgICAgICBlbGlmIG9wdFsyOl0gaW4gc2VsZi5BTExfRk9STUFUUzoKLSAgICAgICAgICAgICAgICBzZWxmLmFkZF9mb3JtYXQob3B0WzI6XSkKLSAgICAgICAgICAgIGVsaWYgb3B0ID09ICItLXBvc3RzY3JpcHQiOgotICAgICAgICAgICAgICAgICMgc3lub255bSBmb3IgLS1wcwotICAgICAgICAgICAgICAgIHNlbGYuYWRkX2Zvcm1hdCgicHMiKQotICAgICAgICBzZWxmLmluaXRpYWxpemUoKQotICAgICAgICAjCi0gICAgICAgICMgcmV0dXJuIHRoZSBhcmdzIHRvIGFsbG93IHRoZSBjYWxsZXIgYWNjZXNzOgotICAgICAgICAjCi0gICAgICAgIHJldHVybiBhcmdzCi0KLSAgICBkZWYgYWRkX2Zvcm1hdChzZWxmLCBmb3JtYXQpOgotICAgICAgICAiIiJBZGQgYSBmb3JtYXQgdG8gdGhlIGZvcm1hdHMgbGlzdCBpZiBub3QgcHJlc2VudC4iIiIKLSAgICAgICAgaWYgbm90IGZvcm1hdCBpbiBzZWxmLmZvcm1hdHM6Ci0gICAgICAgICAgICBpZiBmb3JtYXQgPT0gInBzIjoKLSAgICAgICAgICAgICAgICAjIGFzc3VtZSB0aGlzIGlzIHNhZmUgc2luY2Ugd2UncmUgZ29pbmcgdG8gcnVuIGl0IGFueXdheQotICAgICAgICAgICAgICAgIHNlbGYuZHZpcHNfc2FmZSA9IDEKLSAgICAgICAgICAgIHNlbGYuZm9ybWF0cy5hcHBlbmQoZm9ybWF0KQotCi0gICAgZGVmIGluaXRpYWxpemUoc2VsZik6Ci0gICAgICAgICIiIkNvbXBsZXRlIGluaXRpYWxpemF0aW9uLiAgVGhpcyBpcyBuZWVkZWQgaWYgcGFyc2UoKSBpc24ndCB1c2VkLiIiIgotICAgICAgICAjIGFkZCB0aGUgZGVmYXVsdCBmb3JtYXQgaWYgbm8gZm9ybWF0cyB3ZXJlIHNwZWNpZmllZDoKLSAgICAgICAgaWYgbm90IHNlbGYuZm9ybWF0czoKLSAgICAgICAgICAgIHNlbGYuZm9ybWF0cyA9IHNlbGYuREVGQVVMVF9GT1JNQVRTCi0gICAgICAgICMgZGV0ZXJtaW5lIHRoZSBiYXNlIHNldCBvZiB0ZXhpbnB1dHMgZGlyZWN0b3JpZXM6Ci0gICAgICAgIHRleGlucHV0cyA9IG9zLmVudmlyb24uZ2V0KCJURVhJTlBVVFMiLCAiIikuc3BsaXQob3MucGF0aHNlcCkKLSAgICAgICAgaWYgbm90IHRleGlucHV0czoKLSAgICAgICAgICAgIHRleGlucHV0cyA9IFsnJ10KLSAgICAgICAgbXlkaXJzID0gW29zLnBhdGguam9pbihUT1BESVIsICJwYXBlci0iICsgc2VsZi5wYXBlciksCi0gICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oVE9QRElSLCAidGV4aW5wdXRzIiksCi0gICAgICAgICAgICAgICAgICBdCi0gICAgICAgIGlmICcnIGluIHRleGlucHV0czoKLSAgICAgICAgICAgIGkgPSB0ZXhpbnB1dHMuaW5kZXgoJycpCi0gICAgICAgICAgICB0ZXhpbnB1dHNbaTppXSA9IG15ZGlycwotICAgICAgICBlbHNlOgotICAgICAgICAgICAgdGV4aW5wdXRzICs9IG15ZGlycwotICAgICAgICBzZWxmLmJhc2VfdGV4aW5wdXRzID0gdGV4aW5wdXRzCi0gICAgICAgIGlmIHNlbGYuYnVpbGRkaXI6Ci0gICAgICAgICAgICBzZWxmLmJ1aWxkZGlyID0gb3MucGF0aC5hYnNwYXRoKHNlbGYuYnVpbGRkaXIpCi0KLQotY2xhc3MgSm9iOgotICAgIGxhdGV4X3J1bnMgPSAwCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgb3B0aW9ucywgcGF0aCk6Ci0gICAgICAgIHNlbGYub3B0aW9ucyA9IG9wdGlvbnMKLSAgICAgICAgc2VsZi5kb2N0eXBlID0gZ2V0X2RvY3R5cGUocGF0aCkKLSAgICAgICAgc2VsZi5maWxlZGlyLCBzZWxmLmRvYyA9IHNwbGl0X3BhdGhuYW1lKHBhdGgpCi0gICAgICAgIHNlbGYuYnVpbGRkaXIgPSBvcy5wYXRoLmFic3BhdGgob3B0aW9ucy5idWlsZGRpciBvciBzZWxmLmRvYykKLSAgICAgICAgaWYgKCJodG1sIiBpbiBvcHRpb25zLmZvcm1hdHMgb3IgInRleHQiIGluIG9wdGlvbnMuZm9ybWF0cyk6Ci0gICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5idWlsZGRpcik6Ci0gICAgICAgICAgICAgICAgb3MubWtkaXIoc2VsZi5idWlsZGRpcikKLSAgICAgICAgICAgIHNlbGYubG9nX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuYnVpbGRkaXIsIHNlbGYuZG9jICsgIi5ob3ciKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5sb2dfZmlsZW5hbWUgPSBvcy5wYXRoLmFic3BhdGgoc2VsZi5kb2MgKyAiLmhvdyIpCi0gICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYubG9nX2ZpbGVuYW1lKToKLSAgICAgICAgICAgIG9zLnVubGluayhzZWxmLmxvZ19maWxlbmFtZSkKLSAgICAgICAgbDJoY29uZiA9IHNlbGYuZG9jICsgIi5sMmgiCi0gICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGwyaGNvbmYpOgotICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMobDJoY29uZiArICJ+Iik6Ci0gICAgICAgICAgICAgICAgb3MudW5saW5rKGwyaGNvbmYgKyAifiIpCi0gICAgICAgICAgICBvcy5yZW5hbWUobDJoY29uZiwgbDJoY29uZiArICJ+IikKLSAgICAgICAgc2VsZi5sMmhfYXV4X2luaXRfZmlsZSA9IHNlbGYuZG9jICsgIi5sMmgiCi0gICAgICAgIHNlbGYud3JpdGVfbDJoX2F1eF9pbml0X2ZpbGUoKQotCi0gICAgZGVmIGJ1aWxkKHNlbGYpOgotICAgICAgICBzZWxmLnNldHVwX3RleGlucHV0cygpCi0gICAgICAgIGZvcm1hdHMgPSBzZWxmLm9wdGlvbnMuZm9ybWF0cwotICAgICAgICBpZiAiZHZpIiBpbiBmb3JtYXRzIG9yICJwcyIgaW4gZm9ybWF0czoKLSAgICAgICAgICAgIHNlbGYuYnVpbGRfZHZpKCkKLSAgICAgICAgaWYgInBkZiIgaW4gZm9ybWF0czoKLSAgICAgICAgICAgIHNlbGYuYnVpbGRfcGRmKCkKLSAgICAgICAgaWYgInBzIiBpbiBmb3JtYXRzOgotICAgICAgICAgICAgc2VsZi5idWlsZF9wcygpCi0gICAgICAgIGlmICJodG1sIiBpbiBmb3JtYXRzOgotICAgICAgICAgICAgc2VsZi5yZXF1aXJlX3RlbXBzKCkKLSAgICAgICAgICAgIHNlbGYuYnVpbGRfaHRtbChzZWxmLmJ1aWxkZGlyKQotICAgICAgICAgICAgaWYgc2VsZi5vcHRpb25zLmljb25fc2VydmVyID09ICIuIjoKLSAgICAgICAgICAgICAgICBwYXR0ZXJuID0gb3MucGF0aC5qb2luKFRPUERJUiwgImh0bWwiLCAiaWNvbnMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiouIiArIHNlbGYub3B0aW9ucy5pbWFnZV90eXBlKQotICAgICAgICAgICAgICAgIGltZ3MgPSBnbG9iLmdsb2IocGF0dGVybikKLSAgICAgICAgICAgICAgICBpZiBub3QgaW1nczoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi53YXJuaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBsb2NhdGUgc3VwcG9ydCBpbWFnZXMgb2YgdHlwZSAlcy4iCi0gICAgICAgICAgICAgICAgICAgICAgICAlIHJlcHIoc2VsZi5vcHRpb25zLmltYWdlX3R5cGUpKQotICAgICAgICAgICAgICAgIGZvciBmbiBpbiBpbWdzOgotICAgICAgICAgICAgICAgICAgICBuZXdfZm4gPSBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZGRpciwgb3MucGF0aC5iYXNlbmFtZShmbikpCi0gICAgICAgICAgICAgICAgICAgIHNodXRpbC5jb3B5ZmlsZShmbiwgbmV3X2ZuKQotICAgICAgICBpZiAidGV4dCIgaW4gZm9ybWF0czoKLSAgICAgICAgICAgIHNlbGYucmVxdWlyZV90ZW1wcygpCi0gICAgICAgICAgICB0ZW1wZGlyID0gc2VsZi5kb2MKLSAgICAgICAgICAgIG5lZWRfaHRtbCA9ICJodG1sIiBub3QgaW4gZm9ybWF0cwotICAgICAgICAgICAgaWYgc2VsZi5vcHRpb25zLm1heF9zcGxpdF9kZXB0aCAhPSAxOgotICAgICAgICAgICAgICAgIGZwID0gb3BlbihzZWxmLmwyaF9hdXhfaW5pdF9maWxlLCAiYSIpCi0gICAgICAgICAgICAgICAgZnAud3JpdGUoIiMgcmUtaGFjayB0aGlzIGZpbGUgZm9yIC0tdGV4dDpcbiIpCi0gICAgICAgICAgICAgICAgbDJob3B0aW9uKGZwLCAiTUFYX1NQTElUX0RFUFRIIiwgIjEiKQotICAgICAgICAgICAgICAgIGZwLndyaXRlKCIxO1xuIikKLSAgICAgICAgICAgICAgICBmcC5jbG9zZSgpCi0gICAgICAgICAgICAgICAgdGVtcGRpciA9IHNlbGYuZG9jICsgIi10ZW1wLWh0bWwiCi0gICAgICAgICAgICAgICAgbmVlZF9odG1sID0gMQotICAgICAgICAgICAgaWYgbmVlZF9odG1sOgotICAgICAgICAgICAgICAgIHNlbGYuYnVpbGRfaHRtbCh0ZW1wZGlyLCBtYXhfc3BsaXRfZGVwdGg9MSkKLSAgICAgICAgICAgIHNlbGYuYnVpbGRfdGV4dCh0ZW1wZGlyKQotICAgICAgICBpZiBzZWxmLm9wdGlvbnMuZGlzY2FyZF90ZW1wczoKLSAgICAgICAgICAgIHNlbGYuY2xlYW51cCgpCi0KLSAgICBkZWYgc2V0dXBfdGV4aW5wdXRzKHNlbGYpOgotICAgICAgICB0ZXhpbnB1dHMgPSBbc2VsZi5maWxlZGlyXSArIHNlbGYub3B0aW9ucy5iYXNlX3RleGlucHV0cwotICAgICAgICBvcy5lbnZpcm9uWyJURVhJTlBVVFMiXSA9IG9zLnBhdGhzZXAuam9pbih0ZXhpbnB1dHMpCi0gICAgICAgIHNlbGYubWVzc2FnZSgiVEVYSU5QVVRTPSIgKyBvcy5lbnZpcm9uWyJURVhJTlBVVFMiXSkKLQotICAgIGRlZiBidWlsZF9hdXgoc2VsZiwgYmluYXJ5PU5vbmUpOgotICAgICAgICBpZiBiaW5hcnkgaXMgTm9uZToKLSAgICAgICAgICAgIGJpbmFyeSA9IExBVEVYX0JJTkFSWQotICAgICAgICBuZXdfaW5kZXgoICAgIiVzLmluZCIgJSBzZWxmLmRvYywgImdlbmluZGV4IikKLSAgICAgICAgbmV3X2luZGV4KCJtb2Qlcy5pbmQiICUgc2VsZi5kb2MsICJtb2RpbmRleCIpCi0gICAgICAgIHNlbGYucnVuKCIlcyAlcyIgJSAoYmluYXJ5LCBzZWxmLmRvYykpCi0gICAgICAgIHNlbGYudXNlX2JpYnRleCA9IGNoZWNrX2Zvcl9iaWJ0ZXgoc2VsZi5kb2MgKyAiLmF1eCIpCi0gICAgICAgIHNlbGYubGF0ZXhfcnVucyA9IDEKLQotICAgIGRlZiBidWlsZF9kdmkoc2VsZik6Ci0gICAgICAgIHNlbGYudXNlX2xhdGV4KExBVEVYX0JJTkFSWSkKLQotICAgIGRlZiBidWlsZF9wZGYoc2VsZik6Ci0gICAgICAgIHNlbGYudXNlX2xhdGV4KFBERkxBVEVYX0JJTkFSWSkKLQotICAgIGRlZiB1c2VfbGF0ZXgoc2VsZiwgYmluYXJ5KToKLSAgICAgICAgc2VsZi5yZXF1aXJlX3RlbXBzKGJpbmFyeT1iaW5hcnkpCi0gICAgICAgIGlmIHNlbGYubGF0ZXhfcnVucyA8IDI6Ci0gICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZSgibW9kJXMuaWR4IiAlIHNlbGYuZG9jKToKLSAgICAgICAgICAgICAgICBzZWxmLnJ1bigiJXMgbW9kJXMuaWR4IiAlIChNQUtFSU5ERVhfQklOQVJZLCBzZWxmLmRvYykpCi0gICAgICAgICAgICB1c2VfaW5kZml4ID0gMAotICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoc2VsZi5kb2MgKyAiLmlkeCIpOgotICAgICAgICAgICAgICAgIHVzZV9pbmRmaXggPSAxCi0gICAgICAgICAgICAgICAgIyBjYWxsIHRvIERvYy90b29scy9maXhfaGFjayBvbWl0dGVkOyBkb2Vzbid0IGFwcGVhciBuZWNlc3NhcnkKLSAgICAgICAgICAgICAgICBzZWxmLnJ1bigiJXMgJXMuaWR4IiAlIChNQUtFSU5ERVhfQklOQVJZLCBzZWxmLmRvYykpCi0gICAgICAgICAgICAgICAgaW1wb3J0IGluZGZpeAotICAgICAgICAgICAgICAgIGluZGZpeC5wcm9jZXNzKHNlbGYuZG9jICsgIi5pbmQiKQotICAgICAgICAgICAgaWYgc2VsZi51c2VfYmlidGV4OgotICAgICAgICAgICAgICAgIHNlbGYucnVuKCIlcyAlcyIgJSAoQklCVEVYX0JJTkFSWSwgc2VsZi5kb2MpKQotICAgICAgICAgICAgc2VsZi5wcm9jZXNzX3N5bm9wc2lzX2ZpbGVzKCkKLSAgICAgICAgICAgIHNlbGYucnVuKCIlcyAlcyIgJSAoYmluYXJ5LCBzZWxmLmRvYykpCi0gICAgICAgICAgICBzZWxmLmxhdGV4X3J1bnMgPSBzZWxmLmxhdGV4X3J1bnMgKyAxCi0gICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZSgibW9kJXMuaWR4IiAlIHNlbGYuZG9jKToKLSAgICAgICAgICAgICAgICBzZWxmLnJ1bigiJXMgLXMgJXMgbW9kJXMuaWR4IgotICAgICAgICAgICAgICAgICAgICAgICAgICUgKE1BS0VJTkRFWF9CSU5BUlksIElTVEZJTEUsIHNlbGYuZG9jKSkKLSAgICAgICAgICAgIGlmIHVzZV9pbmRmaXg6Ci0gICAgICAgICAgICAgICAgc2VsZi5ydW4oIiVzIC1zICVzICVzLmlkeCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAlIChNQUtFSU5ERVhfQklOQVJZLCBJU1RGSUxFLCBzZWxmLmRvYykpCi0gICAgICAgICAgICAgICAgaW5kZml4LnByb2Nlc3Moc2VsZi5kb2MgKyAiLmluZCIpCi0gICAgICAgICAgICBzZWxmLnByb2Nlc3Nfc3lub3BzaXNfZmlsZXMoKQotICAgICAgICAjCi0gICAgICAgICMgYW5kIG5vdyBmaW5pc2ggaXQgb2ZmOgotICAgICAgICAjCi0gICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHNlbGYuZG9jICsgIi50b2MiKSBhbmQgYmluYXJ5ID09IFBERkxBVEVYX0JJTkFSWToKLSAgICAgICAgICAgIGltcG9ydCB0b2MyYmttCi0gICAgICAgICAgICBpZiBzZWxmLmRvY3R5cGUgPT0gIm1hbnVhbCI6Ci0gICAgICAgICAgICAgICAgYmlncGFydCA9ICJjaGFwdGVyIgotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBiaWdwYXJ0ID0gInNlY3Rpb24iCi0gICAgICAgICAgICB0b2MyYmttLnByb2Nlc3Moc2VsZi5kb2MgKyAiLnRvYyIsIHNlbGYuZG9jICsgIi5ia20iLCBiaWdwYXJ0KQotICAgICAgICBpZiBzZWxmLnVzZV9iaWJ0ZXg6Ci0gICAgICAgICAgICBzZWxmLnJ1bigiJXMgJXMiICUgKEJJQlRFWF9CSU5BUlksIHNlbGYuZG9jKSkKLSAgICAgICAgc2VsZi5ydW4oIiVzICVzIiAlIChiaW5hcnksIHNlbGYuZG9jKSkKLSAgICAgICAgc2VsZi5sYXRleF9ydW5zID0gc2VsZi5sYXRleF9ydW5zICsgMQotCi0gICAgZGVmIHByb2Nlc3Nfc3lub3BzaXNfZmlsZXMoc2VsZik6Ci0gICAgICAgIHN5bm9wc2lzX2ZpbGVzID0gZ2xvYi5nbG9iKHNlbGYuZG9jICsgIiouc3luIikKLSAgICAgICAgZm9yIHBhdGggaW4gc3lub3BzaXNfZmlsZXM6Ci0gICAgICAgICAgICB1bmlxaWZ5X21vZHVsZV90YWJsZShwYXRoKQotCi0gICAgZGVmIGJ1aWxkX3BzKHNlbGYpOgotICAgICAgICBzZWxmLnJ1bigiJXMgLU4wIC1vICVzLnBzICVzIiAlIChEVklQU19CSU5BUlksIHNlbGYuZG9jLCBzZWxmLmRvYykpCi0KLSAgICBkZWYgYnVpbGRfaHRtbChzZWxmLCBidWlsZGRpciwgbWF4X3NwbGl0X2RlcHRoPU5vbmUpOgotICAgICAgICBpZiBtYXhfc3BsaXRfZGVwdGggaXMgTm9uZToKLSAgICAgICAgICAgIG1heF9zcGxpdF9kZXB0aCA9IHNlbGYub3B0aW9ucy5tYXhfc3BsaXRfZGVwdGgKLSAgICAgICAgdGV4ZmlsZSA9IE5vbmUKLSAgICAgICAgZm9yIHAgaW4gb3MuZW52aXJvblsiVEVYSU5QVVRTIl0uc3BsaXQob3MucGF0aHNlcCk6Ci0gICAgICAgICAgICBmbiA9IG9zLnBhdGguam9pbihwLCBzZWxmLmRvYyArICIudGV4IikKLSAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGZuKToKLSAgICAgICAgICAgICAgICB0ZXhmaWxlID0gZm4KLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICBpZiBub3QgdGV4ZmlsZToKLSAgICAgICAgICAgIHNlbGYud2FybmluZygiQ291bGQgbm90IGxvY2F0ZSAlcy50ZXg7IGFib3J0aW5nLiIgJSBzZWxmLmRvYykKLSAgICAgICAgICAgIHN5cy5leGl0KDEpCi0gICAgICAgICMgcmVtb3ZlIGxlYWRpbmcgLi8gKG9yIGVxdWl2Lik7IG1pZ2h0IGF2b2lkIHByb2JsZW1zIHcvIGR2aXBzCi0gICAgICAgIGlmIHRleGZpbGVbOjJdID09IG9zLmN1cmRpciArIG9zLnNlcDoKLSAgICAgICAgICAgIHRleGZpbGUgPSB0ZXhmaWxlWzI6XQotICAgICAgICAjIGJ1aWxkIHRoZSBjb21tYW5kIGxpbmUgYW5kIHJ1biBMYVRlWDJIVE1MOgotICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihidWlsZGRpcik6Ci0gICAgICAgICAgICBvcy5ta2RpcihidWlsZGRpcikKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGZvciBmbmFtZSBpbiBnbG9iLmdsb2Iob3MucGF0aC5qb2luKGJ1aWxkZGlyLCAiKi5odG1sIikpOgotICAgICAgICAgICAgICAgIG9zLnVubGluayhmbmFtZSkKLSAgICAgICAgYXJncyA9IFtMQVRFWDJIVE1MX0JJTkFSWSwKLSAgICAgICAgICAgICAgICAiLWluaXRfZmlsZSIsIHNlbGYubDJoX2F1eF9pbml0X2ZpbGUsCi0gICAgICAgICAgICAgICAgIi1kaXIiLCBidWlsZGRpciwKLSAgICAgICAgICAgICAgICB0ZXhmaWxlCi0gICAgICAgICAgICAgICAgXQotICAgICAgICBzZWxmLnJ1bigiICIuam9pbihhcmdzKSkgICAgICMgWFhYIG5lZWQgcXVvdGluZyEKLSAgICAgICAgIyAuLi4gcG9zdHByb2Nlc3MKLSAgICAgICAgc2h1dGlsLmNvcHlmaWxlKHNlbGYub3B0aW9ucy5zdHlsZV9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGJ1aWxkZGlyLCBzZWxmLmRvYyArICIuY3NzIikpCi0gICAgICAgIHNodXRpbC5jb3B5ZmlsZShvcy5wYXRoLmpvaW4oYnVpbGRkaXIsIHNlbGYuZG9jICsgIi5odG1sIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oYnVpbGRkaXIsICJpbmRleC5odG1sIikpCi0gICAgICAgIGlmIG1heF9zcGxpdF9kZXB0aCAhPSAxOgotICAgICAgICAgICAgbGFiZWxfZmlsZSA9IG9zLnBhdGguam9pbihidWlsZGRpciwgImxhYmVscy5wbCIpCi0gICAgICAgICAgICBmcCA9IG9wZW4obGFiZWxfZmlsZSkKLSAgICAgICAgICAgIGFib3V0X25vZGUgPSBOb25lCi0gICAgICAgICAgICB0YXJnZXQgPSAiID0gcS9hYm91dC87XG4iCi0gICAgICAgICAgICB4ID0gbGVuKHRhcmdldCkKLSAgICAgICAgICAgIHdoaWxlIDE6Ci0gICAgICAgICAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKLSAgICAgICAgICAgICAgICBpZiBub3QgbGluZToKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICBpZiBsaW5lWy14Ol0gPT0gdGFyZ2V0OgotICAgICAgICAgICAgICAgICAgICBsaW5lID0gZnAucmVhZGxpbmUoKQotICAgICAgICAgICAgICAgICAgICBtID0gcmUuc2VhcmNoKHIiXHwobm9kZVxkK1wuW2Etel0rKVx8IiwgbGluZSkKLSAgICAgICAgICAgICAgICAgICAgYWJvdXRfbm9kZSA9IG0uZ3JvdXAoMSkKLSAgICAgICAgICAgICAgICAgICAgc2h1dGlsLmNvcHlmaWxlKG9zLnBhdGguam9pbihidWlsZGRpciwgYWJvdXRfbm9kZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oYnVpbGRkaXIsICJhYm91dC5odG1sIikpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBpZiBub3Qgc2VsZi5vcHRpb25zLm51bWVyaWM6Ci0gICAgICAgICAgICAgICAgcHdkID0gb3MuZ2V0Y3dkKCkKLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIG9zLmNoZGlyKGJ1aWxkZGlyKQotICAgICAgICAgICAgICAgICAgICBzZWxmLnJ1bigiJXMgJXMgKi5odG1sIiAlIChQRVJMX0JJTkFSWSwgTk9ERTJMQUJFTF9TQ1JJUFQpKQotICAgICAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgICAgIG9zLmNoZGlyKHB3ZCkKLSAgICAgICAgIyBUaGVzZSBmaWxlcyBuZWVkIHRvIGJlIGNsZWFuZWQgdXAgaGVyZSBzaW5jZSBidWlsZGRpciB0aGVyZQotICAgICAgICAjIGNhbiBiZSBtb3JlIHRoYW4gb25lLCBzbyB3ZSBjbGVhbiBlYWNoIG9mIHRoZW0uCi0gICAgICAgIGlmIHNlbGYub3B0aW9ucy5kaXNjYXJkX3RlbXBzOgotICAgICAgICAgICAgZm9yIGZuIGluICgiaW1hZ2VzLnRleCIsICJpbWFnZXMubG9nIiwgImltYWdlcy5hdXgiKToKLSAgICAgICAgICAgICAgICBzYWZlX3VubGluayhvcy5wYXRoLmpvaW4oYnVpbGRkaXIsIGZuKSkKLQotICAgIGRlZiBidWlsZF90ZXh0KHNlbGYsIHRlbXBkaXI9Tm9uZSk6Ci0gICAgICAgIGlmIHRlbXBkaXIgaXMgTm9uZToKLSAgICAgICAgICAgIHRlbXBkaXIgPSBzZWxmLmRvYwotICAgICAgICBpbmRleGZpbGUgPSBvcy5wYXRoLmpvaW4odGVtcGRpciwgImluZGV4Lmh0bWwiKQotICAgICAgICBzZWxmLnJ1bigiJXMgLW5vbGlzdCAtZHVtcCAlcyA+JXMudHh0IgotICAgICAgICAgICAgICAgICAlIChMWU5YX0JJTkFSWSwgaW5kZXhmaWxlLCBzZWxmLmRvYykpCi0KLSAgICBkZWYgcmVxdWlyZV90ZW1wcyhzZWxmLCBiaW5hcnk9Tm9uZSk6Ci0gICAgICAgIGlmIG5vdCBzZWxmLmxhdGV4X3J1bnM6Ci0gICAgICAgICAgICBzZWxmLmJ1aWxkX2F1eChiaW5hcnk9YmluYXJ5KQotCi0gICAgZGVmIHdyaXRlX2wyaF9hdXhfaW5pdF9maWxlKHNlbGYpOgotICAgICAgICBvcHRpb25zID0gc2VsZi5vcHRpb25zCi0gICAgICAgIGZwID0gb3BlbihzZWxmLmwyaF9hdXhfaW5pdF9maWxlLCAidyIpCi0gICAgICAgIGQgPSBzdHJpbmdfdG9fcGVybChvcy5wYXRoLmRpcm5hbWUoTDJIX0lOSVRfRklMRSkpCi0gICAgICAgIGZwLndyaXRlKCJwYWNrYWdlIG1haW47XG4iCi0gICAgICAgICAgICAgICAgICJwdXNoIChASU5DLCAnJXMnKTtcbiIKLSAgICAgICAgICAgICAgICAgIiRteWRpciA9ICclcyc7XG4iCi0gICAgICAgICAgICAgICAgICUgKGQsIGQpKQotICAgICAgICBmcC53cml0ZShvcGVuKEwySF9JTklUX0ZJTEUpLnJlYWQoKSkKLSAgICAgICAgZm9yIGZpbGVuYW1lIGluIG9wdGlvbnMubDJoX2luaXRfZmlsZXM6Ci0gICAgICAgICAgICBmcC53cml0ZSgiXG4jIGluaXRpYWxpemF0aW9uIGNvZGUgaW5jb3Jwb3JhdGVkIGZyb206XG4jICIpCi0gICAgICAgICAgICBmcC53cml0ZShmaWxlbmFtZSkKLSAgICAgICAgICAgIGZwLndyaXRlKCJcbiIpCi0gICAgICAgICAgICBmcC53cml0ZShvcGVuKGZpbGVuYW1lKS5yZWFkKCkpCi0gICAgICAgIGZwLndyaXRlKCJcbiIKLSAgICAgICAgICAgICAgICAgIiMgYXV4aWxsYXJ5IGluaXQgZmlsZSBmb3IgbGF0ZXgyaHRtbFxuIgotICAgICAgICAgICAgICAgICAiIyBnZW5lcmF0ZWQgYnkgbWtob3d0b1xuIgotICAgICAgICAgICAgICAgICAiJE5PX0FVVE9fTElOSyA9IDE7XG4iCi0gICAgICAgICAgICAgICAgICkKLSAgICAgICAgbDJob3B0aW9uKGZwLCAiQUJPVVRfRklMRSIsIG9wdGlvbnMuYWJvdXRfZmlsZSkKLSAgICAgICAgbDJob3B0aW9uKGZwLCAiSUNPTlNFUlZFUiIsIG9wdGlvbnMuaWNvbl9zZXJ2ZXIpCi0gICAgICAgIGwyaG9wdGlvbihmcCwgIklNQUdFX1RZUEUiLCBvcHRpb25zLmltYWdlX3R5cGUpCi0gICAgICAgIGwyaG9wdGlvbihmcCwgIkFERFJFU1MiLCBvcHRpb25zLmFkZHJlc3MpCi0gICAgICAgIGwyaG9wdGlvbihmcCwgIk1BWF9MSU5LX0RFUFRIIiwgb3B0aW9ucy5tYXhfbGlua19kZXB0aCkKLSAgICAgICAgbDJob3B0aW9uKGZwLCAiTUFYX1NQTElUX0RFUFRIIiwgb3B0aW9ucy5tYXhfc3BsaXRfZGVwdGgpCi0gICAgICAgIGwyaG9wdGlvbihmcCwgIkVYVEVSTkFMX1VQX0xJTksiLCBvcHRpb25zLnVwX2xpbmspCi0gICAgICAgIGwyaG9wdGlvbihmcCwgIkVYVEVSTkFMX1VQX1RJVExFIiwgb3B0aW9ucy51cF90aXRsZSkKLSAgICAgICAgbDJob3B0aW9uKGZwLCAiRkFWT1JJVEVTX0lDT04iLCBvcHRpb25zLmZhdmljb24pCi0gICAgICAgIGwyaG9wdGlvbihmcCwgIkdMT0JBTF9NT0RVTEVfSU5ERVgiLCBvcHRpb25zLmdsb2JhbF9tb2R1bGVfaW5kZXgpCi0gICAgICAgIGwyaG9wdGlvbihmcCwgIkRWSVBTX1NBRkUiLCBvcHRpb25zLmR2aXBzX3NhZmUpCi0gICAgICAgIGZwLndyaXRlKCIxO1xuIikKLSAgICAgICAgZnAuY2xvc2UoKQotCi0gICAgZGVmIGNsZWFudXAoc2VsZik6Ci0gICAgICAgIHNlbGYuX19oYXZlX3RlbXBzID0gMAotICAgICAgICBmb3IgcGF0dGVybiBpbiAoIiVzLmF1eCIsICIlcy5sb2ciLCAiJXMub3V0IiwgIiVzLnRvYyIsICIlcy5ia20iLAotICAgICAgICAgICAgICAgICAgICAgICAgIiVzLmlkeCIsICIlcy5pbGciLCAiJXMuaW5kIiwgIiVzLnBsYSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiJXMuYmJsIiwgIiVzLmJsZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAibW9kJXMuaWR4IiwgIm1vZCVzLmluZCIsICJtb2Qlcy5pbGciLAotICAgICAgICAgICAgICAgICAgICAgICAgKToKLSAgICAgICAgICAgIHNhZmVfdW5saW5rKHBhdHRlcm4gJSBzZWxmLmRvYykKLSAgICAgICAgbWFwKHNhZmVfdW5saW5rLCBnbG9iLmdsb2Ioc2VsZi5kb2MgKyAiKi5zeW4iKSkKLSAgICAgICAgZm9yIHNwZWMgaW4gKCJJTUcqIiwgIioucGwiLCAiV0FSTklOR1MiLCAiaW5kZXguZGF0IiwgIm1vZGluZGV4LmRhdCIpOgotICAgICAgICAgICAgcGF0dGVybiA9IG9zLnBhdGguam9pbihzZWxmLmRvYywgc3BlYykKLSAgICAgICAgICAgIG1hcChzYWZlX3VubGluaywgZ2xvYi5nbG9iKHBhdHRlcm4pKQotICAgICAgICBpZiAiZHZpIiBub3QgaW4gc2VsZi5vcHRpb25zLmZvcm1hdHM6Ci0gICAgICAgICAgICBzYWZlX3VubGluayhzZWxmLmRvYyArICIuZHZpIikKLSAgICAgICAgaWYgb3MucGF0aC5pc2RpcihzZWxmLmRvYyArICItdGVtcC1odG1sIik6Ci0gICAgICAgICAgICBzaHV0aWwucm10cmVlKHNlbGYuZG9jICsgIi10ZW1wLWh0bWwiLCBpZ25vcmVfZXJyb3JzPTEpCi0gICAgICAgIGlmIG5vdCBzZWxmLm9wdGlvbnMubG9nZ2luZzoKLSAgICAgICAgICAgIG9zLnVubGluayhzZWxmLmxvZ19maWxlbmFtZSkKLSAgICAgICAgaWYgbm90IHNlbGYub3B0aW9ucy5kZWJ1Z2dpbmc6Ci0gICAgICAgICAgICBvcy51bmxpbmsoc2VsZi5sMmhfYXV4X2luaXRfZmlsZSkKLQotICAgIGRlZiBydW4oc2VsZiwgY29tbWFuZCk6Ci0gICAgICAgIHNlbGYubWVzc2FnZShjb21tYW5kKQotICAgICAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgid2luIik6Ci0gICAgICAgICAgICByYyA9IG9zLnN5c3RlbShjb21tYW5kKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmMgPSBvcy5zeXN0ZW0oIiglcykgPC9kZXYvbnVsbCA+PiVzIDI+JjEiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAlIChjb21tYW5kLCBzZWxmLmxvZ19maWxlbmFtZSkpCi0gICAgICAgIGlmIHJjOgotICAgICAgICAgICAgc2VsZi53YXJuaW5nKAotICAgICAgICAgICAgICAgICJTZXNzaW9uIHRyYW5zY3JpcHQgYW5kIGVycm9yIG1lc3NhZ2VzIGFyZSBpbiAlcy4iCi0gICAgICAgICAgICAgICAgJSBzZWxmLmxvZ19maWxlbmFtZSkKLSAgICAgICAgICAgIHJlc3VsdCA9IDEKLSAgICAgICAgICAgIGlmIGhhc2F0dHIob3MsICJXSUZFWElURUQiKToKLSAgICAgICAgICAgICAgICBpZiBvcy5XSUZFWElURUQocmMpOgotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBvcy5XRVhJVFNUQVRVUyhyYykKLSAgICAgICAgICAgICAgICAgICAgc2VsZi53YXJuaW5nKCJFeGl0ZWQgd2l0aCBzdGF0dXMgJXMuIiAlIHJlc3VsdCkKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBzZWxmLndhcm5pbmcoIktpbGxlZCBieSBzaWduYWwgJXMuIiAlIG9zLldTVE9QU0lHKHJjKSkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi53YXJuaW5nKCJSZXR1cm4gY29kZTogJXMiICUgcmMpCi0gICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJUaGUgcmVsZXZhbnQgbGluZXMgZnJvbSB0aGUgdHJhbnNjcmlwdCBhcmU6XG4iKQotICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiLSIgKiA3MiArICJcbiIpCi0gICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlbGluZXMoZ2V0X3J1bl90cmFuc2NyaXB0KHNlbGYubG9nX2ZpbGVuYW1lKSkKLSAgICAgICAgICAgIHN5cy5leGl0KHJlc3VsdCkKLQotICAgIGRlZiBtZXNzYWdlKHNlbGYsIG1zZyk6Ci0gICAgICAgIG1zZyA9ICIrKysgIiArIG1zZwotICAgICAgICBpZiBub3Qgc2VsZi5vcHRpb25zLnF1aWV0OgotICAgICAgICAgICAgcHJpbnQobXNnKQotICAgICAgICBzZWxmLmxvZyhtc2cgKyAiXG4iKQotCi0gICAgZGVmIHdhcm5pbmcoc2VsZiwgbXNnKToKLSAgICAgICAgbXNnID0gIioqKiAlc1xuIiAlIG1zZwotICAgICAgICBzeXMuc3RkZXJyLndyaXRlKG1zZykKLSAgICAgICAgc2VsZi5sb2cobXNnKQotCi0gICAgZGVmIGxvZyhzZWxmLCBtc2cpOgotICAgICAgICBmcCA9IG9wZW4oc2VsZi5sb2dfZmlsZW5hbWUsICJhIikKLSAgICAgICAgZnAud3JpdGUobXNnKQotICAgICAgICBmcC5jbG9zZSgpCi0KLQotZGVmIGdldF9ydW5fdHJhbnNjcmlwdChmaWxlbmFtZSk6Ci0gICAgIiIiUmV0dXJuIGxpbmVzIGZyb20gdGhlIHRyYW5zY3JpcHQgZmlsZSBmb3IgdGhlIG1vc3QgcmVjZW50IHJ1bigpIGNhbGwuIiIiCi0gICAgZnAgPSBvcGVuKGZpbGVuYW1lKQotICAgIGxpbmVzID0gZnAucmVhZGxpbmVzKCkKLSAgICBmcC5jbG9zZSgpCi0gICAgbGluZXMucmV2ZXJzZSgpCi0gICAgTCA9IFtdCi0gICAgZm9yIGxpbmUgaW4gbGluZXM6Ci0gICAgICAgIEwuYXBwZW5kKGxpbmUpCi0gICAgICAgIGlmIGxpbmVbOjRdID09ICIrKysgIjoKLSAgICAgICAgICAgIGJyZWFrCi0gICAgTC5yZXZlcnNlKCkKLSAgICByZXR1cm4gTAotCi0KLWRlZiBzYWZlX3VubGluayhwYXRoKToKLSAgICAiIiJVbmxpbmsgYSBmaWxlIHdpdGhvdXQgcmFpc2luZyBhbiBlcnJvciBpZiBpdCBkb2Vzbid0IGV4aXN0LiIiIgotICAgIHRyeToKLSAgICAgICAgb3MudW5saW5rKHBhdGgpCi0gICAgZXhjZXB0IG9zLmVycm9yOgotICAgICAgICBwYXNzCi0KLQotZGVmIHNwbGl0X3BhdGhuYW1lKHBhdGgpOgotICAgIHBhdGggPSBvcy5wYXRoLmFic3BhdGgocGF0aCkKLSAgICBkaXJuYW1lLCBiYXNlbmFtZSA9IG9zLnBhdGguc3BsaXQocGF0aCkKLSAgICBpZiBiYXNlbmFtZVstNDpdID09ICIudGV4IjoKLSAgICAgICAgYmFzZW5hbWUgPSBiYXNlbmFtZVs6LTRdCi0gICAgcmV0dXJuIGRpcm5hbWUsIGJhc2VuYW1lCi0KLQotX2RvY3R5cGVfcnggPSByZS5jb21waWxlKHIiXFxkb2N1bWVudGNsYXNzKD86XFtbXl1dKlxdKT97KFthLXpBLVpdKil9IikKLWRlZiBnZXRfZG9jdHlwZShwYXRoKToKLSAgICBmcCA9IG9wZW4ocGF0aCkKLSAgICBkb2N0eXBlID0gTm9uZQotICAgIHdoaWxlIDE6Ci0gICAgICAgIGxpbmUgPSBmcC5yZWFkbGluZSgpCi0gICAgICAgIGlmIG5vdCBsaW5lOgotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgbSA9IF9kb2N0eXBlX3J4Lm1hdGNoKGxpbmUpCi0gICAgICAgIGlmIG06Ci0gICAgICAgICAgICBkb2N0eXBlID0gbS5ncm91cCgxKQotICAgICAgICAgICAgYnJlYWsKLSAgICBmcC5jbG9zZSgpCi0gICAgcmV0dXJuIGRvY3R5cGUKLQotCi1kZWYgbWFpbigpOgotICAgIG9wdGlvbnMgPSBPcHRpb25zKCkKLSAgICB0cnk6Ci0gICAgICAgIGFyZ3MgPSBvcHRpb25zLnBhcnNlKHN5cy5hcmd2WzE6XSkKLSAgICBleGNlcHQgZ2V0b3B0LmVycm9yIGFzIG1zZzoKLSAgICAgICAgZXJyb3Iob3B0aW9ucywgbXNnKQotICAgIGlmIG5vdCBhcmdzOgotICAgICAgICAjIGF0dGVtcHQgdG8gbG9jYXRlIHNpbmdsZSAudGV4IGZpbGUgaW4gY3VycmVudCBkaXJlY3Rvcnk6Ci0gICAgICAgIGFyZ3MgPSBnbG9iLmdsb2IoIioudGV4IikKLSAgICAgICAgaWYgbm90IGFyZ3M6Ci0gICAgICAgICAgICBlcnJvcihvcHRpb25zLCAiTm8gZmlsZSB0byBwcm9jZXNzLiIpCi0gICAgICAgIGlmIGxlbihhcmdzKSA+IDE6Ci0gICAgICAgICAgICBlcnJvcihvcHRpb25zLCAiQ291bGQgbm90IGRlZHVjZSB3aGljaCBmaWxlcyBzaG91bGQgYmUgcHJvY2Vzc2VkLiIpCi0gICAgIwotICAgICMgcGFyYW1ldGVycyBhcmUgcHJvY2Vzc2VkLCBsZXQncyBnbyEKLSAgICAjCi0gICAgZm9yIHBhdGggaW4gYXJnczoKLSAgICAgICAgSm9iKG9wdGlvbnMsIHBhdGgpLmJ1aWxkKCkKLQotCi1kZWYgbDJob3B0aW9uKGZwLCBvcHRpb24sIHZhbHVlKToKLSAgICBpZiB2YWx1ZToKLSAgICAgICAgZnAud3JpdGUoJyQlcyA9ICIlcyI7XG4nICUgKG9wdGlvbiwgc3RyaW5nX3RvX3Blcmwoc3RyKHZhbHVlKSkpKQotCi0KLV90b19wZXJsID0ge30KLWZvciBjIGluIG1hcChjaHIsIHJhbmdlKDEsIDI1NikpOgotICAgIF90b19wZXJsW2NdID0gYwotX3RvX3BlcmxbIkAiXSA9ICJcXEAiCi1fdG9fcGVybFsiJCJdID0gIlxcJCIKLV90b19wZXJsWyciJ10gPSAnXFwiJwotCi1kZWYgc3RyaW5nX3RvX3Blcmwocyk6Ci0gICAgcmV0dXJuICcnLmpvaW4obWFwKF90b19wZXJsLmdldCwgcykpCi0KLQotZGVmIGNoZWNrX2Zvcl9iaWJ0ZXgoZmlsZW5hbWUpOgotICAgIGZwID0gb3BlbihmaWxlbmFtZSkKLSAgICBwb3MgPSBmcC5yZWFkKCkuZmluZChyIlxiaWJkYXRheyIpCi0gICAgZnAuY2xvc2UoKQotICAgIHJldHVybiBwb3MgPj0gMAotCi1kZWYgdW5pcWlmeV9tb2R1bGVfdGFibGUoZmlsZW5hbWUpOgotICAgIGxpbmVzID0gb3BlbihmaWxlbmFtZSkucmVhZGxpbmVzKCkKLSAgICBpZiBsZW4obGluZXMpID4gMToKLSAgICAgICAgaWYgbGluZXNbLTFdID09IGxpbmVzWy0yXToKLSAgICAgICAgICAgIGRlbCBsaW5lc1stMV0KLSAgICBvcGVuKGZpbGVuYW1lLCAidyIpLndyaXRlbGluZXMobGluZXMpCi0KLQotZGVmIG5ld19pbmRleChmaWxlbmFtZSwgbGFiZWw9ImdlbmluZGV4Iik6Ci0gICAgZnAgPSBvcGVuKGZpbGVuYW1lLCAidyIpCi0gICAgZnAud3JpdGUociIiIlwKLVxiZWdpbnt0aGVpbmRleH0KLVxsYWJlbHslc30KLVxlbmR7dGhlaW5kZXh9Ci0iIiIgJSBsYWJlbCkKLSAgICBmcC5jbG9zZSgpCi0KLQotaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgICBtYWluKCkKZGlmZiAtLWdpdCBhL0RvYy90b29scy9ta2luZm8gYi9Eb2MvdG9vbHMvbWtpbmZvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZTc1MTY4Li4wMDAwMDAwCi0tLSBhL0RvYy90b29scy9ta2luZm8KKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0jISAvYmluL3NoCi0jICAtKi0gS3NoIC0qLQotCi0jICBTY3JpcHQgdG8gZHJpdmUgdGhlIEhUTUwtaW5mbyBjb252ZXJzaW9uIHByb2Nlc3MuCi0jICBQYXNzIGluIHVwdG8gdGhyZWUgcGFyYW1ldGVyczoKLSMgIC0gdGhlIG5hbWUgb2YgdGhlIG1haW4gdGV4IGZpbGUKLSMgIC0gdGhlIG5hbWUgb2YgdGhlIG91dHB1dCBmaWxlIGluIHRleGkgZm9ybWF0IChvcHRpb25hbCkKLSMgIC0gdGhlIG5hbWUgb2YgdGhlIG91dHB1dCBmaWxlIGluIGluZm8gZm9ybWF0IChvcHRpb25hbCkKLSMKLSMgIFdyaXR0ZW4gYnkgRnJlZCBMLiBEcmFrZSwgSnIuIDxmZHJha2VAYWNtLm9yZz4KLQotRU1BQ1M9JHtFTUFDUzotZW1hY3N9Ci1NQUtFSU5GTz0ke01BS0VJTkZPOi1tYWtlaW5mb30KLQotCi0jIE5vcm1hbGl6ZSBmaWxlIG5hbWUgc2luY2Ugc29tZXRoaW5nIGNhbGxlZCBieSBodG1sMnRleGkucGwgc2VlbXMgdG8KLSMgc2NyZXcgdXAgd2l0aCByZWxhdGl2ZSBwYXRoIG5hbWVzLgotRklMRU5BTUU9IiQxIgotRE9DRElSPWBkaXJuYW1lICIkRklMRU5BTUUiYAotRE9DRklMRT1gYmFzZW5hbWUgIiRGSUxFTkFNRSJgCi1ET0NOQU1FPWBiYXNlbmFtZSAiJEZJTEVOQU1FIiAudGV4YAotaWYgWyAkIyAtZ3QgMSBdOyB0aGVuCi0gICAgVEVYSU5BTUU9IiQyIgotZWxzZQotICAgIFRFWElOQU1FPSJweXRob24tJERPQ05BTUUudGV4aSIKLWZpCi1pZiBbICQjIC1ndCAyIF07IHRoZW4KLSAgICBJTkZPTkFNRT0iJDMiCi1lbHNlCi0gICAgSU5GT05BTUU9InB5dGhvbi0kRE9DTkFNRS5pbmZvIgotZmkKLQotIyBOb3cgYnVpbGQgdGhlIHJlYWwgZGlyZWN0b3J5IG5hbWVzLCBhbmQgbG9jYXRlIG91ciBzdXBwb3J0IHN0dWZmOgotV09SS0RJUj1gcHdkYAotY2QgYGRpcm5hbWUgJDBgCi1UT09MU0RJUj1gcHdkYAotY2QgJERPQ0RJUgotRE9DRElSPWBwd2RgCi1jZCAkV09SS0RJUgotCi1DT01NT05ESVI9ImBkaXJuYW1lICRET0NESVJgL2NvbW1vbnRleCIKLQotCi1ydW4oKSB7Ci0gICAgIyBzaG93IHdoYXQgd2UncmUgZG9pbmcsIGxpa2UgbWFrZSBkb2VzOgotICAgIGVjaG8gIiQqIgotICAgICIkQCIgfHwgZXhpdCAkPwotfQotCi0KLSMgZ2VuZXJhdGUgdGhlIFRleGluZm8gZmlsZToKLQotcnVuICRFTUFDUyAtYmF0Y2ggLXEgLS1uby1zaXRlLWZpbGUgLWwgJFRPT0xTRElSL3B5MnRleGkuZWwgXAotICAgIC0tZXZhbCAiKHNldHEgcHkydGV4aS1kaXJzICcoXCIkRE9DRElSXCIgXCIkQ09NTU9ORElSXCIgXCIuLi90ZXhpbnB1dHNcIikpIiBcCi0gICAgLS1ldmFsICIoc2V0cSBweTJ0ZXhpLXRleGktZmlsZS1uYW1lIFwiJFRFWElOQU1FXCIpIiBcCi0gICAgLS1ldmFsICIoc2V0cSBweTJ0ZXhpLWluZm8tZmlsZS1uYW1lIFwiJElORk9OQU1FXCIpIiBcCi0gICAgLS1ldmFsICIocHkydGV4aSBcIiRET0NESVIvJERPQ0ZJTEVcIikiIFwKLSAgICAtZiBraWxsLWVtYWNzCi1lY2hvIERvbmUKLQotCi0jIGdlbmVyYXRlIHRoZSAuaW5mbyBmaWxlczoKLQotcnVuICRNQUtFSU5GTyAtLWZvb3Rub3RlLXN0eWxlIGVuZCAtLWZpbGwtY29sdW1uIDcyIFwKLQkgICAgICAtLXBhcmFncmFwaC1pbmRlbnQgMCAtLW91dHB1dD0kSU5GT05BTUUgJFRFWElOQU1FCmRpZmYgLS1naXQgYS9Eb2MvdG9vbHMvbWttb2RpbmRleCBiL0RvYy90b29scy9ta21vZGluZGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZGM5ZDQyLi4wMDAwMDAwCi0tLSBhL0RvYy90b29scy9ta21vZGluZGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLSMhIC91c3IvYmluL2VudiBweXRob24KLSMgIC0qLSBQeXRob24gLSotCi0KLSIiInVzYWdlOiAlKHByb2dyYW0pcyBbb3B0aW9uc10gZmlsZS4uLgotCi1TdXBwb3J0ZWQgb3B0aW9uczoKLQotICAgIC0tYWRkcmVzcyBhZGRyCi0gICAgLWEgYWRkciAgICAgICAgIFNldCB0aGUgYWRkcmVzcyB0ZXh0IHRvIGluY2x1ZGUgYXQgdGhlIGVuZCBvZiB0aGUgZ2VuZXJhdGVkCi0gICAgICAgICAgICAgICAgICAgIEhUTUw7IHRoaXMgc2hvdWxkIGJlIHVzZWQgZm9yIGNvbnRhY3QgaW5mb3JtYXRpb24uCi0gICAgLS1jb2x1bW5zIGNvbHMKLSAgICAtYyBjb2xzICAgICAgICAgU2V0IHRoZSBudW1iZXIgb2YgY29sdW1ucyBlYWNoIGluZGV4IHNlY3Rpb24gc2hvdWxkIGJlCi0gICAgICAgICAgICAgICAgICAgIGRpc3BsYXllZCBpbi4gIFRoZSBkZWZhdWx0IGlzIDEuCi0gICAgLS1oZWxwCi0gICAgLWggICAgICAgICAgICAgIERpc3BsYXkgdGhpcyBoZWxwIG1lc3NhZ2UuCi0gICAgLS1sZXR0ZXJzCi0gICAgLWwgICAgICAgICAgICAgIFNwbGl0IHRoZSBvdXRwdXQgaW50byBzZWN0aW9ucyBieSBsZXR0ZXIuCi0gICAgLS1vdXRwdXQgZmlsZQotICAgIC1vIGZpbGUgICAgICAgICBXcml0ZSBvdXRwdXQgdG8gJ2ZpbGUnIGluc3RlYWQgb2Ygc3RhbmRhcmQgb3V0LgotICAgIC0taWNvbnNlcnZlciBpcyBVc2UgJ2lzJyBhcyB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgaWNvbnMgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uIGJhci4gIFRoZSBkZWZhdWx0IGlzICdpY29ucycuCi0gICAgLS10aXRsZSBzdHIgICAgIFNldCB0aGUgcGFnZSB0aXRsZSB0byAnc3RyJy4gIFRoZSBkZWZhdWx0IGlzICdHbG9iYWwKLSAgICAgICAgICAgICAgICAgICAgTW9kdWxlIEluZGV4Jy4KLSAgICAtLXVwbGluayB1cmwgICAgU2V0IHRoZSB1cHdhcmQgbGluayBVUkwuICBUaGUgZGVmYXVsdCBpcyAnLi8nLgotICAgIC0tdXB0aXRsZSBzdHIgICBTZXQgdGhlIHVwd2FyZCBsaW5rIHRpdGxlLiAgVGhlIGRlZmF1bHQgaXMgJ1B5dGhvbgotICAgICAgICAgICAgICAgICAgICBEb2N1bWVudGF0aW9uIEluZGV4Jy4KLSIiIgotaW1wb3J0IG9zCi1pbXBvcnQgcmUKLWltcG9ydCBzeXMKLQotZnJvbSB4bWwuc2F4LnNheHV0aWxzIGltcG9ydCBxdW90ZWF0dHIKLQotaW1wb3J0IGJ1aWxkaW5kZXgKLWltcG9ydCBzdXBwb3J0Ci0KLQotY2xhc3MgSW5kZXhPcHRpb25zKHN1cHBvcnQuT3B0aW9ucyk6Ci0gICAgYWVzb3BfdHlwZSA9ICJsaW5rcyIKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc3VwcG9ydC5PcHRpb25zLl9faW5pdF9fKHNlbGYpCi0gICAgICAgIHNlbGYuYWRkX2FyZ3MoImwiLCBbImxldHRlcnMiXSkKLSAgICAgICAgc2VsZi5sZXR0ZXJzID0gMAotCi0gICAgZGVmIGhhbmRsZV9vcHRpb24oc2VsZiwgb3B0LCB2YWwpOgotICAgICAgICBpZiBvcHQgaW4gKCItbCIsICItLWxldHRlcnMiKToKLSAgICAgICAgICAgIHNlbGYubGV0dGVycyA9IDEKLQotICAgIGRlZiB1c2FnZShzZWxmKToKLSAgICAgICAgcHJvZ3JhbSA9IG9zLnBhdGguYmFzZW5hbWUoc3lzLmFyZ3ZbMF0pCi0gICAgICAgIHByaW50KF9fZG9jX18gJSB7InByb2dyYW0iOiBwcm9ncmFtfSkKLQotICAgIGxpbmtzID0gWwotICAgICAgICAoJ2F1dGhvcicsICdhY2tzLmh0bWwnLCAgJ0Fja25vd2xlZGdlbWVudHMnKSwKLSAgICAgICAgKCdoZWxwJywgICAnYWJvdXQuaHRtbCcsICdBYm91dCB0aGUgUHl0aG9uIERvY3VtZW50YXRpb24nKSwKLSAgICAgICAgXQotCi0gICAgZGVmIGdldF9oZWFkZXIoc2VsZik6Ci0gICAgICAgIGhlYWRlciA9IHN1cHBvcnQuT3B0aW9ucy5nZXRfaGVhZGVyKHNlbGYpCi0gICAgICAgIHMgPSAnJwotICAgICAgICBmb3IgcmVsLCBocmVmLCB0aXRsZSBpbiBzZWxmLmxpbmtzOgotICAgICAgICAgICAgcyArPSAnPGxpbmsgcmVsPSIlcyIgaHJlZj0iJXMiJyAlIChyZWwsIGhyZWYpCi0gICAgICAgICAgICBpZiB0aXRsZToKLSAgICAgICAgICAgICAgICBzICs9ICcgdGl0bGU9JyArIHF1b3RlYXR0cih0aXRsZSkKLSAgICAgICAgICAgIHMgKz0gJz5cbiAgJwotICAgICAgICByZXR1cm4gaGVhZGVyLnJlcGxhY2UoIjxsaW5rICIsIHMgKyAiPGxpbmsgIiwgMSkKLQotCi1jbGFzcyBOb2RlKGJ1aWxkaW5kZXguTm9kZSk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGxpbmssIHN0ciwgc2Vxbm8sIHBsYXRpbmZvKToKLSAgICAgICAgc2VsZi5hbm5vdGF0aW9uID0gcGxhdGluZm8gb3IgTm9uZQotICAgICAgICBpZiBzdHJbMF1bLTU6XSA9PSAiPC90dD4iOgotICAgICAgICAgICAgc3RyID0gc3RyWzotNV0KLSAgICAgICAgc2VsZi5tb2RuYW1lID0gc3RyCi0gICAgICAgIGJ1aWxkaW5kZXguTm9kZS5fX2luaXRfXyhzZWxmLCBsaW5rLCBzZWxmLm1vZG5hbWUsIHNlcW5vKQotICAgICAgICBpZiBwbGF0aW5mbzoKLSAgICAgICAgICAgIHMgPSAnPHR0IGNsYXNzPSJtb2R1bGUiPiVzPC90dD4gJXMnIFwKLSAgICAgICAgICAgICAgICAlIChzZWxmLm1vZG5hbWUsIHNlbGYuYW5ub3RhdGlvbikKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHMgPSAnPHR0IGNsYXNzPSJtb2R1bGUiPiVzPC90dD4nICUgc3RyCi0gICAgICAgIHNlbGYudGV4dCA9IFtzXQotCi0gICAgZGVmIF9fc3RyX18oc2VsZik6Ci0gICAgICAgIGlmIHNlbGYuYW5ub3RhdGlvbjoKLSAgICAgICAgICAgIHJldHVybiAnPHR0IGNsYXNzPSJtb2R1bGUiPiVzPC90dD4gJXMnIFwKLSAgICAgICAgICAgICAgICAgICAlIChzZWxmLm1vZG5hbWUsIHNlbGYuYW5ub3RhdGlvbikKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiAnPHR0IGNsYXNzPSJtb2R1bGUiPiVzPC90dD4nICUgc2VsZi5tb2RuYW1lCi0KLV9yeCA9IHJlLmNvbXBpbGUoCi0gICAgIjxkdD48YSBocmVmPVsnXCJdKG1vZHVsZS0uKlwuaHRtbCkoPzojbDJoLVxkKyk/WydcIl0+IgotICAgICI8dHQgY2xhc3M9WydcIl1tb2R1bGVbJ1wiXT4oW2EtekEtWl9dW2EtekEtWjAtOV8uXSopPC90dD5ccyooPGVtPiIKLSAgICAiXCg8c3BhbiBjbGFzcz1bJ1wiXXBsYXRmb3JtWydcIl0+Lio8L3NwYW4+XCk8L2VtPik/PC9hPiIpCi0KLWRlZiBtYWluKCk6Ci0gICAgb3B0aW9ucyA9IEluZGV4T3B0aW9ucygpCi0gICAgb3B0aW9ucy52YXJpYWJsZXNbInRpdGxlIl0gPSAiR2xvYmFsIE1vZHVsZSBJbmRleCIKLSAgICBvcHRpb25zLnBhcnNlKHN5cy5hcmd2WzE6XSkKLSAgICBhcmdzID0gb3B0aW9ucy5hcmdzCi0gICAgaWYgbm90IGFyZ3M6Ci0gICAgICAgIGFyZ3MgPSBbIi0iXQotICAgICMKLSAgICAjIENvbGxlY3QgdGhlIGlucHV0IGRhdGE6Ci0gICAgIwotICAgIG5vZGVzID0gW10KLSAgICBoYXNfcGxhdF9mbGFnID0gMAotICAgIGZvciBpZm4gaW4gYXJnczoKLSAgICAgICAgaWYgaWZuID09ICItIjoKLSAgICAgICAgICAgIGlmcCA9IHN5cy5zdGRpbgotICAgICAgICAgICAgZGlybmFtZSA9ICcnCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBpZnAgPSBvcGVuKGlmbikKLSAgICAgICAgICAgIGRpcm5hbWUgPSBvcy5wYXRoLmRpcm5hbWUoaWZuKQotICAgICAgICB3aGlsZSAxOgotICAgICAgICAgICAgbGluZSA9IGlmcC5yZWFkbGluZSgpCi0gICAgICAgICAgICBpZiBub3QgbGluZToKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgbSA9IF9yeC5tYXRjaChsaW5lKQotICAgICAgICAgICAgaWYgbToKLSAgICAgICAgICAgICAgICAjIFRoaXMgbGluZSBzcGVjaWZpZXMgYSBtb2R1bGUhCi0gICAgICAgICAgICAgICAgYmFzZW5hbWUsIG1vZG5hbWUsIHBsYXRpbmZvID0gbS5ncm91cCgxLCAyLCAzKQotICAgICAgICAgICAgICAgIGhhc19wbGF0X2ZsYWcgPSBoYXNfcGxhdF9mbGFnIG9yIHBsYXRpbmZvCi0gICAgICAgICAgICAgICAgbGlua2ZpbGUgPSBvcy5wYXRoLmpvaW4oZGlybmFtZSwgYmFzZW5hbWUpCi0gICAgICAgICAgICAgICAgbm9kZXMuYXBwZW5kKE5vZGUoJzxhIGhyZWY9IiVzIj4nICUgbGlua2ZpbGUsIG1vZG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKG5vZGVzKSwgcGxhdGluZm8pKQotICAgICAgICBpZnAuY2xvc2UoKQotICAgICMKLSAgICAjIEdlbmVyYXRlIGFsbCBvdXRwdXQ6Ci0gICAgIwotICAgIG51bV9ub2RlcyA9IGxlbihub2RlcykKLSAgICAjIEhlcmUncyB0aGUgSFRNTCBnZW5lcmF0aW9uOgotICAgIHBhcnRzID0gW29wdGlvbnMuZ2V0X2hlYWRlcigpLAotICAgICAgICAgICAgIGJ1aWxkaW5kZXgucHJvY2Vzc19ub2Rlcyhub2Rlcywgb3B0aW9ucy5jb2x1bW5zLCBvcHRpb25zLmxldHRlcnMpLAotICAgICAgICAgICAgIG9wdGlvbnMuZ2V0X2Zvb3RlcigpLAotICAgICAgICAgICAgIF0KLSAgICBpZiBoYXNfcGxhdF9mbGFnOgotICAgICAgICBwYXJ0cy5pbnNlcnQoMSwgUExBVF9ESVNDVVNTKQotICAgIGh0bWwgPSAnJy5qb2luKHBhcnRzKQotICAgIHByb2dyYW0gPSBvcy5wYXRoLmJhc2VuYW1lKHN5cy5hcmd2WzBdKQotICAgIGZwID0gb3B0aW9ucy5nZXRfb3V0cHV0X2ZpbGUoKQotICAgIGZwLndyaXRlKGh0bWwucnN0cmlwKCkgKyAiXG4iKQotICAgIGlmIG9wdGlvbnMub3V0cHV0ZmlsZSA9PSAiLSI6Ci0gICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIiVzOiAlZCBpbmRleCBub2Rlc1xuIiAlIChwcm9ncmFtLCBudW1fbm9kZXMpKQotICAgIGVsc2U6Ci0gICAgICAgIHByaW50KCkKLSAgICAgICAgcHJpbnQoIiVzOiAlZCBpbmRleCBub2RlcyIgJSAocHJvZ3JhbSwgbnVtX25vZGVzKSkKLQotCi1QTEFUX0RJU0NVU1MgPSAiIiIKLTxwPiBTb21lIG1vZHVsZSBuYW1lcyBhcmUgZm9sbG93ZWQgYnkgYW4gYW5ub3RhdGlvbiBpbmRpY2F0aW5nIHdoYXQKLXBsYXRmb3JtIHRoZXkgYXJlIGF2YWlsYWJsZSBvbi48L3A+Ci0KLSIiIgotCi0KLWlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgbWFpbigpCmRpZmYgLS1naXQgYS9Eb2MvdG9vbHMvbWtwa2dsaXN0IGIvRG9jL3Rvb2xzL21rcGtnbGlzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWExZmQ3OC4uMDAwMDAwMAotLS0gYS9Eb2MvdG9vbHMvbWtwa2dsaXN0CisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotIyEgL3Vzci9iaW4vZW52IHB5dGhvbgotIwotIyBTaW1wbGUgc2NyaXB0IHRvIGNyZWF0ZSB0aGUgdGFibGUgdGhhdCBsaXN0cyB0aGUgcGFja2FnZXMgYXZhaWxhYmxlCi0jIGZvciBkb3dubG9hZC4gIFRoaXMgZXhwZWN0cyB0aGUgZG93bmxvYWRhYmxlIGZpbGVzIGFuZCB0aGUgTWFrZWZpbGUKLSMgdG8gYmUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgotIwotIyBUaGUgb3V0cHV0IG9mIHRoaXMgc2NyaXB0IGNhbiBiZSBwYXN0ZWQgZGlyZWN0bHkgaW50byB0aGUgZG93bmxvYWQKLSMgcGFnZSBmb3IgdGhlIGRvY3VtZW50YXRpb24uCi0KLWltcG9ydCBvcwotaW1wb3J0IHN5cwotCi1mcm9tIG9zLnBhdGggaW1wb3J0IGlzZmlsZQotCi0KLVBLR19UWVBFUyA9IFsKLSAgICAjIGh1bWFuIG5hbWUsIGZpbGVuYW1lIHByZWZpeAotICAgICgiSFRNTCIsICJodG1sIiksCi0gICAgKCJQREYgKFVTLUxldHRlcikiLCAicGRmLWxldHRlciIpLAotICAgICgiUERGIChBNCkiLCAicGRmLWE0IiksCi0gICAgKCJQb3N0U2NyaXB0IChVUy1MZXR0ZXIpIiwgInBvc3RzY3JpcHQtbGV0dGVyIiksCi0gICAgKCJQb3N0U2NyaXB0IChBNCkiLCAicG9zdHNjcmlwdC1hNCIpLAotICAgICgiR05VIGluZm8iLCAiaW5mbyIpLAotICAgICgiaVNpbG8iLCAiaXNpbG8iKSwKLSAgICAoIkxhVGVYIiwgImxhdGV4IiksCi0gICAgXQotCi1nZXR2ZXJzaW9uaW5mbyA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAiZ2V0dmVyc2lvbmluZm8iKQotZnAgPSBvcy5wb3BlbignIiVzIiAiJXMiJyAlIChzeXMuZXhlY3V0YWJsZSwgZ2V0dmVyc2lvbmluZm8pLCAiciIpCi1yZWxlYXNlID0gZnAucmVhZGxpbmUoKS5zdHJpcCgpCi1mcC5jbG9zZSgpCi0KLXByaW50ICcnJ1wKLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIzIiBhbGlnbj0iY2VudGVyIj4KLSAgPHRoZWFkPgotICAgIDx0ciBiZ2NvbG9yPSIjOTljY2ZmIj48dGggcm93c3Bhbj0iMiI+Q29udGVudDwvdGg+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIzIj5Gb3JtYXQ8L3RoPjwvdHI+Ci0gICAgPHRyIGJnY29sb3I9IiM5OWNjZmYiPjx0aD5aSVA8L3RoPjx0aD5HWmlwPC90aD48dGg+QlppcDI8L3RoPjwvdHI+Ci0gICAgPC90aGVhZD4KLSAgPHRib2R5PicnJwotCi0jIGZvcm1hdHRlZCB1c2luZyBGSUxFX1RFTVBMQVRFICUgKHJlbGVhc2UsIHByZWZpeCwgcmVsZWFzZSwgZXh0ZW5zaW9uKQotRklMRV9URU1QTEFURSA9ICcnJ1wKLSAgICAgICAgPHRkPjxhIGhyZWY9Ii4uLy4uL2Z0cC9weXRob24vZG9jLyVzLyVzLSVzJXMiCi0gICAgICAgICAgICA+JWRLPC9hPjwvdGQ+JycnCi0KLU5PX0ZJTEVfVEVNUExBVEUgPSAnJydcCi0gICAgICAgIDx0ZD4mbmJzcDs8L3RkPicnJwotCi1kZWYgZ2V0X3NpemUocHJlZml4LCBleHQpOgotICAgIGZuID0gIiVzLSVzJXMiICUgKHByZWZpeCwgcmVsZWFzZSwgZXh0KQotICAgIHJldHVybiBpbnQocm91bmQob3MucGF0aC5nZXRzaXplKGZuKSAvIDEwMjQuMCkpCi0KLWRlZiBnZXRfZmlsZV9jZWxsKHByZWZpeCwgZXh0LCBoYXZlKToKLSAgICBpZiBoYXZlOgotICAgICAgICBrYiA9IGdldF9zaXplKHByZWZpeCwgZXh0KQotICAgICAgICByZXR1cm4gRklMRV9URU1QTEFURSAlIChyZWxlYXNlLCBwcmVmaXgsIHJlbGVhc2UsIGV4dCwga2IpCi0gICAgZWxzZToKLSAgICAgICAgcmV0dXJuIE5PX0ZJTEVfVEVNUExBVEUKLQotZm9yIG5hbWUsIHByZWZpeCBpbiBQS0dfVFlQRVM6Ci0gICAgemlwX2ZuID0gIiVzLSVzLnppcCIgJSAocHJlZml4LCByZWxlYXNlKQotICAgIHRnel9mbiA9ICIlcy0lcy50Z3oiICUgKHByZWZpeCwgcmVsZWFzZSkKLSAgICBiejJfZm4gPSAiJXMtJXMudGFyLmJ6MiIgJSAocHJlZml4LCByZWxlYXNlKQotCi0gICAgaGF2ZV96aXAgPSBpc2ZpbGUoemlwX2ZuKQotICAgIGhhdmVfdGd6ID0gaXNmaWxlKHRnel9mbikKLSAgICBoYXZlX2J6MiA9IGlzZmlsZShiejJfZm4pCi0KLSAgICBoYXZlX3NvbWUgPSBoYXZlX3ppcCBvciBoYXZlX3RneiBvciBoYXZlX2J6MgotCi0gICAgaWYgbm90IGhhdmVfc29tZToKLSAgICAgICAgcHJpbnQgIiAgICA8IS0tIgotICAgIHByaW50ICIgICAgPHRyPjx0ZD4lczwvdGQ+IiAlIG5hbWUKLSAgICBwcmludCBnZXRfZmlsZV9jZWxsKHByZWZpeCwgIi56aXAiLCBoYXZlX3ppcCkKLSAgICBwcmludCBnZXRfZmlsZV9jZWxsKHByZWZpeCwgIi50Z3oiLCBoYXZlX3RneikKLSAgICBwcmludCBnZXRfZmlsZV9jZWxsKHByZWZpeCwgIi50YXIuYnoyIiwgaGF2ZV9iejIpCi0gICAgcHJpbnQgIiAgICAgIDwvdHI+IgotICAgIGlmIG5vdCBoYXZlX3NvbWU6Ci0gICAgICAgIHByaW50ICIgICAgICAtLT4iCi0KLXByaW50ICcnJ1wKLSAgICA8L3Rib2R5PgotPC90YWJsZT4KLScnJwpkaWZmIC0tZ2l0IGEvRG9jL3Rvb2xzL21rc291cmNlcGtnIGIvRG9jL3Rvb2xzL21rc291cmNlcGtnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZDViZDczLi4wMDAwMDAwCi0tLSBhL0RvYy90b29scy9ta3NvdXJjZXBrZworKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uCi0jICAtKi0gUHl0aG9uIC0qLQotCi0iIiIlKHByb2dyYW0pcyAtIHNjcmlwdCB0byBjcmVhdGUgdGhlIGxhdGV4IHNvdXJjZSBkaXN0cmlidXRpb24KLQotdXNhZ2U6Ci0gICAgICUocHJvZ3JhbSlzIFstdHwtLXRvb2xzXSByZWxlYXNlIFt0YWddCi0KLXdpdGggLXR8LS10b29sczogIGRvZXNuJ3QgaW5jbHVkZSB0aGUgZG9jdW1lbnRzLCBvbmx5IHRoZSBmcmFtZXdvcmsKLQotd2l0aG91dCBbdGFnXTogIGdlbmVyYXRlIGZyb20gdGhlIGN1cnJlbnQgdmVyc2lvbiB0aGF0J3MgY2hlY2tlZCBpbgotICAgICAJICAgKCpOT1QqIHdoYXQncyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkhKQotCi13aXRoIFt0YWddOiAgZ2VuZXJhdGUgZnJvbSB0aGUgbmFtZWQgdGFnCi0iIiIKLSMqIHNob3VsZCBiZSBtb2RpZmllZCB0byBnZXQgdGhlIFB5dGhvbiB2ZXJzaW9uIG51bWJlciBhdXRvbWF0aWNhbGx5Ci0jICBmcm9tIHRoZSBNYWtlZmlsZSBvciBzb21lcGxhY2UuCi0KLWltcG9ydCBnZXRvcHQKLWltcG9ydCBnbG9iCi1pbXBvcnQgb3MKLWltcG9ydCByZQotaW1wb3J0IHNodXRpbAotaW1wb3J0IHN5cwotaW1wb3J0IHRlbXBmaWxlCi0KLXRyeToKLSAgICBfX2ZpbGVfXwotZXhjZXB0IE5hbWVFcnJvcjoKLSAgICBfX2ZpbGVfXyA9IHN5cy5hcmd2WzBdCi0KLXRvb2xzID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpCi1Eb2MgPSBvcy5wYXRoLmRpcm5hbWUodG9vbHMpCi1wYXRjaGxldmVsX3RleCA9IG9zLnBhdGguam9pbihEb2MsICJjb21tb250ZXgiLCAicGF0Y2hsZXZlbC50ZXgiKQotCi1xdWlldCA9IDAKLXJ4ID0gcmUuY29tcGlsZShyIjpleHQ6KD86W2EtekEtWjAtOV0rQCk/Y3ZzXC4oW2EtekEtWjAtOV0rKS5zb3VyY2Vmb3JnZS5uZXQ6IgotICAgICAgICAgICAgICAgIHIiL2N2c3Jvb3QvXDEiKQotCi0KLWRlZiBtYWluKCk6Ci0gICAgIGdsb2JhbCBxdWlldAotICAgICBhbm9ueW1vdXMgPSBGYWxzZQotICAgICB0cnk6Ci0gICAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAiQWFiZ3R6cSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJhbGwiLCAiYnppcDIiLCAiZ3ppcCIsICJ0b29scyIsICJ6aXAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicXVpZXQiLCAiYW5vbnltb3VzIl0pCi0gICAgIGV4Y2VwdCBnZXRvcHQuZXJyb3IgYXMgZToKLSAgICAgICAgICB1c2FnZSh3YXJuaW5nPXN0cihlKSkKLSAgICAgICAgICBzeXMuZXhpdCgyKQotICAgICBpZiBsZW4oYXJncykgbm90IGluICgxLCAyKToKLSAgICAgICAgICB1c2FnZSh3YXJuaW5nPSJ3cm9uZyBudW1iZXIgb2YgcGFyYW1ldGVycyIpCi0gICAgICAgICAgc3lzLmV4aXQoMikKLSAgICAgdG9vbHMgPSAwCi0gICAgIGZvcm1hdHMgPSB7fQotICAgICBmb3Igb3B0LCBhcmcgaW4gb3B0czoKLSAgICAgICAgICBpZiBvcHQgaW4gKCItdCIsICItLXRvb2xzIik6Ci0gICAgICAgICAgICAgICB0b29scyA9IDEKLSAgICAgICAgICBlbGlmIG9wdCBpbiAoIi1xIiwgIi0tcXVpZXQiKToKLSAgICAgICAgICAgICAgIHF1aWV0ID0gcXVpZXQgKyAxCi0gICAgICAgICAgZWxpZiBvcHQgaW4gKCItYiIsICItLWJ6aXAyIik6Ci0gICAgICAgICAgICAgICBmb3JtYXRzWyJiemlwMiJdID0gMQotICAgICAgICAgIGVsaWYgb3B0IGluICgiLWciLCAiLS1nemlwIik6Ci0gICAgICAgICAgICAgICBmb3JtYXRzWyJnemlwIl0gPSAxCi0gICAgICAgICAgZWxpZiBvcHQgaW4gKCIteiIsICItLXppcCIpOgotICAgICAgICAgICAgICAgZm9ybWF0c1siemlwIl0gPSAxCi0gICAgICAgICAgZWxpZiBvcHQgaW4gKCItYSIsICItLWFsbCIpOgotICAgICAgICAgICAgICAgZm9ybWF0c1siYnppcDIiXSA9IDEKLSAgICAgICAgICAgICAgIGZvcm1hdHNbImd6aXAiXSA9IDEKLSAgICAgICAgICAgICAgIGZvcm1hdHNbInppcCJdID0gMQotICAgICAgICAgIGVsaWYgb3B0IGluICgiLUEiLCAiLS1hbm9ueW1vdXMiKToKLSAgICAgICAgICAgICAgIGFub255bW91cyA9IFRydWUKLSAgICAgaWYgZm9ybWF0czoKLSAgICAgICAgICAjIG1ha2Ugb3JkZXIgaHVtYW4tcHJlZGljdGFibGUKLSAgICAgICAgICBmb3JtYXRzID0gZm9ybWF0cy5rZXlzKCkKLSAgICAgICAgICBmb3JtYXRzLnNvcnQoKQotICAgICBlbHNlOgotICAgICAgICAgIGZvcm1hdHMgPSBbImd6aXAiXQotICAgICByZWxlYXNlID0gYXJnc1swXQotICAgICBzdm50YWcgPSBOb25lCi0gICAgIGlmIGxlbihhcmdzKSA+IDE6Ci0gICAgICAgICAgc3ZudGFnID0gYXJnc1sxXQotICAgICB0ZW1wZGlyID0gdGVtcGZpbGUubWt0ZW1wKCkKLSAgICAgb3MubWtkaXIodGVtcGRpcikKLSAgICAgcGtnZGlyID0gb3MucGF0aC5qb2luKHRlbXBkaXIsICJQeXRob24tRG9jcy0iICsgcmVsZWFzZSkKLSAgICAgcHdkID0gb3MuZ2V0Y3dkKCkKLSAgICAgbXlkaXIgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKHN5cy5hcmd2WzBdKSkKLSAgICAgb3MuY2hkaXIodGVtcGRpcikKLSAgICAgaWYgbm90IHF1aWV0OgotICAgICAgICAgIHByaW50ICItLS0gY3VycmVudCBkaXJlY3RvcnkgaXM6IiwgdGVtcGRpcgotICAgICBpZiBub3Qgc3ZudGFnOgotICAgICAgICAgc3ZudGFnID0gInRydW5rIgotICAgICBzdm5iYXNlID0gImh0dHA6Ly9zdm4ucHl0aG9uLm9yZy9wcm9qZWN0cy9weXRob24iCi0gICAgIHJ1bigic3ZuIGV4cG9ydCAlcy8lcy9Eb2MgUHl0aG9uLURvY3MtJXMiCi0gICAgICAgICAlIChzdm5iYXNlLCBzdm50YWcsIHJlbGVhc2UpKQotCi0gICAgICMgQ29weSBpbiB0aGUgdmVyc2lvbiBpbmZvcm10YXRpb24sIGlmIHdlJ3JlIG5vdCBqdXN0IGdvaW5nIHRvCi0gICAgICMgcmlwIGl0IGJhY2sgb3V0OgotICAgICBpZiBub3QgdG9vbHM6Ci0gICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHBhdGNobGV2ZWxfdGV4KToKLSAgICAgICAgICAgICAgIHJ1bihvcy5wYXRoLmpvaW4oaGVyZSwgImdldHZlcnNpb25pbmZvIikpCi0gICAgICAgICAgZGVzdCA9IG9zLnBhdGguam9pbigiUHl0aG9uLURvY3MtIiArIHJlbGVhc2UsICJjb21tb250ZXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhdGNobGV2ZWwudGV4IikKLSAgICAgICAgICBzaHV0aWwuY29weWZpbGUocGF0Y2hsZXZlbF90ZXgsIGRlc3QpCi0KLSAgICAgIyBDb3B5IGluIHRoZSBsaWNlbnNlIGZpbGU6Ci0gICAgIExJQ0VOU0UgPSBvcy5wYXRoLm5vcm1wYXRoKAotICAgICAgICAgIG9zLnBhdGguam9pbihteWRpciwgb3MucGFyZGlyLCBvcy5wYXJkaXIsICJMSUNFTlNFIikpCi0gICAgIHNodXRpbC5jb3B5ZmlsZShMSUNFTlNFLCAiTElDRU5TRSIpCi0gICAgIGlmIHRvb2xzOgotICAgICAgICAgIGFyY2hpdmUgPSAiZG9jdG9vbHMtIiArIHJlbGVhc2UKLSAgICAgICAgICAjIHdlIGRvbid0IHdhbnQgdGhlIGFjdHVhbCBkb2N1bWVudHMgaW4gdGhpcyBjYXNlOgotICAgICAgICAgIGZvciBkIGluICgiYXBpIiwgImRpc3QiLCAiZG9jIiwgImV4dCIsICJpbnN0IiwKLSAgICAgICAgICAgICAgICAgICAgImxpYiIsICJtYWMiLCAicmVmIiwgInR1dCIsICJjb21tb250ZXgiKToKLSAgICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUob3MucGF0aC5qb2luKHBrZ2RpciwgZCkpCi0gICAgIGVsc2U6Ci0gICAgICAgICAgYXJjaGl2ZSA9ICJsYXRleC0iICsgcmVsZWFzZQotCi0gICAgICMgWFhYIHNob3VsZCBhbHNvIHJlbW92ZSB0aGUgLmN2c2lnbm9yZSBmaWxlcyBhdCB0aGlzIHBvaW50Ci0KLSAgICAgb3MuY2hkaXIodGVtcGRpcikKLSAgICAgYXJjaGl2ZSA9IG9zLnBhdGguam9pbihwd2QsIGFyY2hpdmUpCi0gICAgIGZvciBmb3JtYXQgaW4gZm9ybWF0czoKLSAgICAgICAgICBpZiBmb3JtYXQgPT0gImJ6aXAyIjoKLSAgICAgICAgICAgICAgIHJ1bigidGFyIGNmIC0gUHl0aG9uLURvY3MtJXMgfCBiemlwMiAtOSA+JXMudGFyLmJ6MiIKLSAgICAgICAgICAgICAgICAgICAlIChyZWxlYXNlLCBhcmNoaXZlKSkKLSAgICAgICAgICBlbGlmIGZvcm1hdCA9PSAiZ3ppcCI6Ci0gICAgICAgICAgICAgICBydW4oInRhciBjZiAtIFB5dGhvbi1Eb2NzLSVzIHwgZ3ppcCAtOSA+JXMudGd6IgotICAgICAgICAgICAgICAgICAgICUgKHJlbGVhc2UsIGFyY2hpdmUpKQotICAgICAgICAgIGVsaWYgZm9ybWF0ID09ICJ6aXAiOgotICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoYXJjaGl2ZSArICIuemlwIik6Ci0gICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhhcmNoaXZlICsgIi56aXAiKQotICAgICAgICAgICAgICAgcnVuKCJ6aXAgLXEgLXI5ICVzLnppcCBQeXRob24tRG9jcy0lcyIKLSAgICAgICAgICAgICAgICAgICAlIChhcmNoaXZlLCByZWxlYXNlKSkKLQotICAgICAjIGNsZWFuIHVwIHRoZSB3b3JrIGFyZWE6Ci0gICAgIG9zLmNoZGlyKHB3ZCkKLSAgICAgc2h1dGlsLnJtdHJlZSh0ZW1wZGlyKQotCi0KLWRlZiBydW4oY21kKToKLSAgICAgaWYgcXVpZXQgPCAyOgotICAgICAgICAgIHByaW50ICIrKysiLCBjbWQKLSAgICAgaWYgcXVpZXQ6Ci0gICAgICAgICAgY21kID0gIiVzID4vZGV2L251bGwiICUgY21kCi0gICAgIHJjID0gb3Muc3lzdGVtKGNtZCkKLSAgICAgaWYgcmM6Ci0gICAgICAgICAgc3lzLmV4aXQocmMpCi0KLQotZGVmIHVzYWdlKHdhcm5pbmc9Tm9uZSk6Ci0gICAgIHN0ZG91dCA9IHN5cy5zdGRvdXQKLSAgICAgc3lzLnN0ZG91dCA9IHN5cy5zdGRlcnIKLSAgICAgcHJvZ3JhbSA9IG9zLnBhdGguYmFzZW5hbWUoc3lzLmFyZ3ZbMF0pCi0gICAgIHRyeToKLSAgICAgICAgICBpZiB3YXJuaW5nOgotICAgICAgICAgICAgICAgcHJpbnQgIiVzOiAlc1xuIiAlIChwcm9ncmFtLCB3YXJuaW5nKQotICAgICAgICAgIHByaW50IF9fZG9jX18gJSB7InByb2dyYW0iOiBwcm9ncmFtfQotICAgICBmaW5hbGx5OgotICAgICAgICAgIHN5cy5zdGRvdXQgPSBzdGRvdXQKLQotCi1pZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgICBtYWluKCkKZGlmZiAtLWdpdCBhL0RvYy90b29scy9ub2RlMmxhYmVsLnBsIGIvRG9jL3Rvb2xzL25vZGUybGFiZWwucGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY0OTFiMjAuLjAwMDAwMDAKLS0tIGEvRG9jL3Rvb2xzL25vZGUybGFiZWwucGwKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0jISAvdXNyL2Jpbi9lbnYgcGVybAotCi0jIE9uIEN5Z3dpbiwgd2UgYWN0dWFsbHkgaGF2ZSB0byBnZW5lcmF0ZSBhIHRlbXBvcmFyeSBmaWxlIHdoZW4gZG9pbmcKLSMgdGhlIGlucGxhY2UgZWRpdCwgb3Igd2UnbGwgZ2V0IHBlcm1pc3Npb24gZXJyb3JzLiAgTm90IHN1cmUgd2hvJ3MKLSMgYnVnIHRoaXMgaXMsIGV4Y2VwdCB0aGF0IGl0IGlzbid0IG91cnMuICBUbyBkZWFsIHdpdGggdGhpcywgd2UKLSMgZ2VuZXJhdGUgYmFja3VwcyBkdXJpbmcgdGhlIGVkaXQgcGhhc2UgYW5kIHJlbW92ZSB0aGVtIGF0IHRoZSBlbmQuCi0jCi11c2UgRW5nbGlzaDsKLSRJTlBMQUNFX0VESVQgPSAnLmJhayc7Ci0KLSMgcmVhZCB0aGUgbGFiZWxzLCB0aGVuIHJldmVyc2UgdGhlIG1hcHBpbmdzCi1yZXF1aXJlICJsYWJlbHMucGwiOwotCi0lbm9kZXMgPSAoKTsKLW15ICRrZXk7Ci0jIHNvcnQgc28gdGhhdCB3ZSBnZXQgYSBjb25zaXN0ZW50IGFzc2lnbm1lbnQgZm9yIG5vZGVzIHdpdGggbXVsdGlwbGUgbGFiZWxzIAotZm9yZWFjaCAkbGFiZWwgKHNvcnQga2V5cyAlZXh0ZXJuYWxfbGFiZWxzKSB7Ci0gICMKLSAgIyBJZiB0aGUgbGFiZWwgY2FuJ3QgYmUgdXNlZCBhcyBhIGZpbGVuYW1lIG9uIG5vbi1Vbml4IHBsYXRmb3JtcywKLSAgIyBza2lwIGl0LiAgU3VjaCBsYWJlbHMgbWF5IGJlIHVzZWQgaW50ZXJuYWxseSB3aXRoaW4gdGhlIGRvY3VtZW50YXRpb24sCi0gICMgYnV0IHdpbGwgbmV2ZXIgYmUgdXNlZCBmb3IgZmlsZW5hbWUgZ2VuZXJhdGlvbi4KLSAgIwotICBpZiAoJGxhYmVsID1+IC9eKFstLmEtekEtWjAtOV0rKSQvKSB7Ci0gICAgJGtleSA9ICRleHRlcm5hbF9sYWJlbHN7JGxhYmVsfTsKLSAgICAka2V5ID1+IHN8Xi98fDsKLSAgICAkbm9kZXN7JGtleX0gPSAkbGFiZWw7Ci0gIH0KLX0KLQotIyBUaGlzIGFkZHMgdGhlICJpbnRlcm5hbCIgbGFiZWxzIGFkZGVkIGZvciBpbmRleGluZy4gIFRoZXNlIGxhYmVscyB3aWxsIG5vdAotIyBiZSB1c2VkIGZvciBmaWxlIG5hbWVzLgotcmVxdWlyZSAiaW50bGFiZWxzLnBsIjsKLWZvcmVhY2ggJGxhYmVsIChrZXlzICVpbnRlcm5hbF9sYWJlbHMpIHsKLSAgJGtleSA9ICRpbnRlcm5hbF9sYWJlbHN7JGxhYmVsfTsKLSAgJGtleSA9fiBzfF4vfHw7Ci0gIGlmIChkZWZpbmVkKCRub2Rlc3ska2V5fSkpIHsKLSAgICAkbm9kZXN7JGxhYmVsfSA9ICRub2Rlc3ska2V5fTsKLSAgfQotfQotCi0jIGNvbGxlY3QgbGFiZWxzIHRoYXQgaGF2ZSBiZWVuIHVzZWQKLSVuZXduYW1lcyA9ICgpOwotCi13aGlsZSAoPD4pIHsKLSAgIyBkb24ndCB3YW50IHRvIGRvIG9uZSBzLy8vIHBlciBsaW5lIHBlciBub2RlCi0gICMgc28gbG9vayBmb3IgbGluZXMgd2l0aCBocmVmcywgdGhlbiBkbyBzLy8vIG9uIG5vZGVzIHByZXNlbnQKLSAgaWYgKC8oSFJFRnxocmVmKT1bXCJcJ11ub2RlXGQrXC5odG1sW1wjXCJcJ10vKSB7Ci0gICAgQHBhcnRzID0gc3BsaXQoLyhIUkVGfGhyZWYpXD1bXCJcJ10vKTsKLSAgICBzaGlmdCBAcGFydHM7Ci0gICAgZm9yICRub2RlIChAcGFydHMpIHsKLSAgICAgICRub2RlID1+IHMvW1wjXCJcJ10uKiQvL2c7Ci0gICAgICBjaG9tcCgkbm9kZSk7Ci0gICAgICBpZiAoZGVmaW5lZCgkbm9kZXN7JG5vZGV9KSkgewotCSRsYWJlbCA9ICRub2Rlc3skbm9kZX07Ci0JaWYgKHMvKEhSRUZ8aHJlZik9KFtcIlwnXSkkbm9kZShbXCNcIlwnXSkvaHJlZj0kMiRsYWJlbC5odG1sJDMvZykgewotCSAgcy8oSFJFRnxocmVmKT0oW1wiXCddKSRsYWJlbC5odG1sL2hyZWY9JDIkbGFiZWwuaHRtbC9nOwotCSAgJG5ld25hbWVzeyRub2RlfSA9ICIkbGFiZWwuaHRtbCI7Ci0JfQotICAgICAgfQotICAgIH0KLSAgfQotICBwcmludDsKLX0KLQotZm9yZWFjaCAkb2xkbmFtZSAoa2V5cyAlbmV3bmFtZXMpIHsKLSAgcmVuYW1lKCRvbGRuYW1lLCAkbmV3bmFtZXN7JG9sZG5hbWV9KTsKLX0KLQotZm9yZWFjaCAkZmlsZW5hbWUgKGdsb2IoJyouYmFrJykpIHsKLSAgdW5saW5rKCRmaWxlbmFtZSk7Ci19CmRpZmYgLS1naXQgYS9Eb2MvdG9vbHMvcHJlY2htLnB5IGIvRG9jL3Rvb2xzL3ByZWNobS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI0ZWVhMC4uMDAwMDAwMAotLS0gYS9Eb2MvdG9vbHMvcHJlY2htLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNTE5ICswLDAgQEAKLSIiIgotICAgIE1ha2VzIHRoZSBuZWNlc2FyeSBmaWxlcyB0byBjb252ZXJ0IGZyb20gcGxhaW4gaHRtbCBvZgotICAgIFB5dGhvbiAxLjUgYW5kIDEuNS54IERvY3VtZW50YXRpb24gdG8KLSAgICBNaWNyb3NvZnQgSFRNTCBIZWxwIGZvcm1hdCB2ZXJzaW9uIDEuMQotICAgIERvZXNuJ3QgY2hhbmdlIHRoZSBodG1sJ3MgZG9jcy4KLQotICAgIGJ5IGhlcm5hbi5mb2ZmYW5pQGluYW1lLmNvbQotICAgIG5vIGNvcHlyaWdodCBhbmQgbm8gcmVzcG9uc2FiaWxpdGllcy4KLQotICAgIG1vZGlmaWVkIGJ5IERhbGUgTmFnYXRhIGZvciBQeXRob24gMS41LjIKLQotICAgIFJlbmFtZWQgZnJvbSBtYWtlX2NobS5weSB0byBwcmVjaG0ucHksIGFuZCBjaGVja2VkIGludG8gdGhlIFB5dGhvbgotICAgIHByb2plY3QsIDE5LUFwci0yMDAyIGJ5IFRpbSBQZXRlcnMuICBBc3NvcnRlZCBtb2RpZmljYXRpb25zIGJ5IFRpbQotICAgIGFuZCBGcmVkIERyYWtlLiAgT2J0YWluZWQgZnJvbSBSb2JpbiBEdW5uJ3MgLmNobSBwYWNrYWdpbmcgb2YgdGhlCi0gICAgUHl0aG9uIDIuMiBkb2NzLCBhdCA8aHR0cDovL2FsbGR1bm4uY29tL3B5dGhvbi8+LgotIiIiCi0KLWltcG9ydCBzeXMKLWltcG9ydCBvcwotZnJvbSBmb3JtYXR0ZXIgaW1wb3J0IE51bGxXcml0ZXIsIEFic3RyYWN0Rm9ybWF0dGVyCi1mcm9tIGh0bWxsaWIgaW1wb3J0IEhUTUxQYXJzZXIKLWltcG9ydCBnZXRvcHQKLWltcG9ydCBjZ2kKLQotdXNhZ2VfbW9kZSA9ICcnJwotVXNhZ2U6IHByZWNobS5weSBbLWNdIFsta10gWy1wXSBbLXYgMS41Wy54XV0gZmlsZW5hbWUKLSAgICAtYzogZG9lcyBub3QgYnVpbGQgZmlsZW5hbWUuaGhjIChUYWJsZSBvZiBDb250ZW50cykKLSAgICAtazogZG9lcyBub3QgYnVpbGQgZmlsZW5hbWUuaGhrIChJbmRleCkKLSAgICAtcDogZG9lcyBub3QgYnVpbGQgZmlsZW5hbWUuaGhwIChQcm9qZWN0IEZpbGUpCi0gICAgLXYgMS41Wy54XTogbWFrZXMgaGVscCBmb3IgdGhlIHB5dGhvbiAxLjVbLnhdIGRvY3MKLSAgICAgICAgKGRlZmF1bHQgaXMgcHl0aG9uIDEuNS4yIGRvY3MpCi0nJycKLQotIyBQcm9qZWN0IGZpbGUgKCouaGhwKSB0ZW1wbGF0ZS4gICdhcmNoJyBpcyB0aGUgZmlsZSBiYXNlbmFtZSAobGlrZQotIyB0aGUgcHl0aGxwIGluIHB5dGhscC5oaHApOyAndmVyc2lvbicgaXMgdGhlIGRvYyB2ZXJzaW9uIG51bWJlciAobGlrZQotIyB0aGUgMi4yIGluIFB5dGhvbiAyLjIpLgotIyBUaGUgbWFnaWNhbCBudW1iZXJzIGluIHRoZSBsb25nIGxpbmUgdW5kZXIgW1dJTkRPV1NdIHNldCBtb3N0IG9mIHRoZQotIyB1c2VyLXZpc2libGUgZmVhdHVyZXMgKHZpc2libGUgYnV0dG9ucywgdGFicywgZXRjKS4KLSMgQWJvdXQgMHgxMDM4NGU6ICBUaGlzIGRlZmluZXMgdGhlIGJ1dHRvbnMgaW4gdGhlIGhlbHAgdmlld2VyLiAgVGhlCi0jIGZvbGxvd2luZyBkZWZucyBhcmUgdGFrZW4gZnJvbSBodG1saGVscC5oLiAgTm90IGFsbCBwb3NzaWJpbGl0aWVzCi0jIGFjdHVhbGx5IHdvcmssIGFuZCBub3QgYWxsIHRob3NlIHRoYXQgd29yayBhcmUgYXZhaWxhYmxlIGZyb20gdGhlIEhlbHAKLSMgV29ya3Nob3AgR1VJLiAgSW4gcGFydGljdWxhciwgdGhlIFpvb20vRm9udCBidXR0b24gd29ya3MgYW5kIGlzIG5vdAotIyBhdmFpbGFibGUgZnJvbSB0aGUgR1VJLiAgVGhlIG9uZXMgd2UncmUgdXNpbmcgYXJlIG1hcmtlZCB3aXRoICd4JzoKLSMKLSMgICAgMHgwMDAwMDIgICBIaWRlL1Nob3cgICB4Ci0jICAgIDB4MDAwMDA0ICAgQmFjayAgICAgICAgeAotIyAgICAweDAwMDAwOCAgIEZvcndhcmQgICAgIHgKLSMgICAgMHgwMDAwMTAgICBTdG9wCi0jICAgIDB4MDAwMDIwICAgUmVmcmVzaAotIyAgICAweDAwMDA0MCAgIEhvbWUgICAgICAgIHgKLSMgICAgMHgwMDAwODAgICBGb3J3YXJkCi0jICAgIDB4MDAwMTAwICAgQmFjawotIyAgICAweDAwMDIwMCAgIE5vdGVzCi0jICAgIDB4MDAwNDAwICAgQ29udGVudHMKLSMgICAgMHgwMDA4MDAgICBMb2NhdGUgICAgICB4Ci0jICAgIDB4MDAxMDAwICAgT3B0aW9ucyAgICAgeAotIyAgICAweDAwMjAwMCAgIFByaW50ICAgICAgIHgKLSMgICAgMHgwMDQwMDAgICBJbmRleAotIyAgICAweDAwODAwMCAgIFNlYXJjaAotIyAgICAweDAxMDAwMCAgIEhpc3RvcnkKLSMgICAgMHgwMjAwMDAgICBGYXZvcml0ZXMKLSMgICAgMHgwNDAwMDAgICBKdW1wIDEKLSMgICAgMHgwODAwMDAgICBKdW1wIDIKLSMgICAgMHgxMDAwMDAgICBab29tL0ZvbnQgICB4Ci0jICAgIDB4MjAwMDAwICAgVE9DIE5leHQKLSMgICAgMHg0MDAwMDAgICBUT0MgUHJldgotCi1wcm9qZWN0X3RlbXBsYXRlID0gJycnCi1bT1BUSU9OU10KLUNvbXBpbGVkIGZpbGU9JShhcmNoKXMuY2htCi1Db250ZW50cyBmaWxlPSUoYXJjaClzLmhoYwotRGVmYXVsdCBXaW5kb3c9JShhcmNoKXMKLURlZmF1bHQgdG9waWM9aW5kZXguaHRtbAotRGlzcGxheSBjb21waWxlIHByb2dyZXNzPU5vCi1GdWxsIHRleHQgc2VhcmNoIHN0b3AgbGlzdCBmaWxlPSUoYXJjaClzLnN0cAotRnVsbC10ZXh0IHNlYXJjaD1ZZXMKLUluZGV4IGZpbGU9JShhcmNoKXMuaGhrCi1MYW5ndWFnZT0weDQwOQotVGl0bGU9UHl0aG9uICUodmVyc2lvbilzIERvY3VtZW50YXRpb24KLQotW1dJTkRPV1NdCi0lKGFyY2gpcz0iUHl0aG9uICUodmVyc2lvbilzIERvY3VtZW50YXRpb24iLCIlKGFyY2gpcy5oaGMiLCIlKGFyY2gpcy5oaGsiLFwKLSJpbmRleC5odG1sIiwiaW5kZXguaHRtbCIsLCwsLDB4NjM1MjAsMjIwLDB4MTAzODRlLFswLDAsMTAyNCw3NjhdLCwsLCwsLDAKLQotW0ZJTEVTXQotJycnCi0KLWNvbnRlbnRzX2hlYWRlciA9ICcnJ1wKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1pY3Jvc29mdCZyZWc7IEhUTUwgSGVscCBXb3Jrc2hvcCA0LjEiPgotPCEtLSBTaXRlbWFwIDEuMCAtLT4KLTwvSEVBRD48Qk9EWT4KLTxPQkpFQ1QgdHlwZT0idGV4dC9zaXRlIHByb3BlcnRpZXMiPgotICAgICAgICA8cGFyYW0gbmFtZT0iV2luZG93IFN0eWxlcyIgdmFsdWU9IjB4ODAxMjI3Ij4KLSAgICAgICAgPHBhcmFtIG5hbWU9IkltYWdlVHlwZSIgdmFsdWU9IkZvbGRlciI+Ci08L09CSkVDVD4KLTxVTD4KLScnJwotCi1jb250ZW50c19mb290ZXIgPSAnJydcCi08L1VMPjwvQk9EWT48L0hUTUw+Ci0nJycKLQotb2JqZWN0X3NpdGVtYXAgPSAnJydcCi08T0JKRUNUIHR5cGU9InRleHQvc2l0ZW1hcCI+Ci0gICAgPHBhcmFtIG5hbWU9Ik5hbWUiIHZhbHVlPSIlcyI+Ci0gICAgPHBhcmFtIG5hbWU9IkxvY2FsIiB2YWx1ZT0iJXMiPgotPC9PQkpFQ1Q+Ci0nJycKLQotIyBMaXN0IG9mIHdvcmRzIHRoZSBmdWxsIHRleHQgc2VhcmNoIGZhY2lsaXR5IHNob3VsZG4ndCBpbmRleC4gIFRoaXMKLSMgYmVjb21lcyBmaWxlIEFSQ0guc3RwLiAgTm90ZSB0aGF0IHRoaXMgbGlzdCBtdXN0IGJlIHByZXR0eSBzbWFsbCEKLSMgRGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBNUyBkb2NzIGNsYWltIHRoZSBmaWxlIGhhcyBhIG1heGltdW0gc2l6ZSBvZgotIyAyNTYgb3IgNTEyIGJ5dGVzIChpbmNsdWRpbmcgXHJcbiBhdCB0aGUgZW5kIG9mIGVhY2ggbGluZSkuCi0jIE5vdGUgdGhhdCAiYW5kIiwgIm9yIiwgIm5vdCIgYW5kICJuZWFyIiBhcmUgb3BlcmF0b3JzIGluIHRoZSBzZWFyY2gKLSMgbGFuZ3VhZ2UsIHNvIG5vIHBvaW50IGluZGV4aW5nIHRoZW0gZXZlbiBpZiB3ZSB3YW50ZWQgdG8uCi1zdG9wX2xpc3QgPSAnJycKLWEgIGFuZCAgYXJlICBhcyAgYXQKLWJlICBidXQgIGJ5Ci1mb3IKLWlmICBpbiAgaW50byAgaXMgIGl0Ci1uZWFyICBubyAgbm90Ci1vZiAgb24gIG9yCi1zdWNoCi10aGF0ICB0aGUgIHRoZWlyICB0aGVuICB0aGVyZSAgdGhlc2UgIHRoZXkgIHRoaXMgIHRvCi13YXMgIHdpbGwgIHdpdGgKLScnJwotCi0jIHMgaXMgYSBzdHJpbmcgb3IgTm9uZS4gIElmIE5vbmUgb3IgZW1wdHksIHJldHVybiBOb25lLiAgRWxzZSB0YWNrICcuaHRtbCcKLSMgb24gdG8gdGhlIGVuZCwgdW5sZXNzIGl0J3MgYWxyZWFkeSB0aGVyZS4KLWRlZiBhZGRodG1sKHMpOgotICAgIGlmIHM6Ci0gICAgICAgIGlmIG5vdCBzLmVuZHN3aXRoKCcuaHRtbCcpOgotICAgICAgICAgICAgcyArPSAnLmh0bWwnCi0gICAgcmV0dXJuIHMKLQotIyBDb252ZW5pZW5jZSBjbGFzcyB0byBob2xkIGluZm8gYWJvdXQgImEgYm9vayIgaW4gSFRNTEhlbHAgdGVybXMgPT0gYSBkb2MKLSMgZGlyZWN0b3J5IGluIFB5dGhvbiB0ZXJtcy4KLWNsYXNzIEJvb2s6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGRpcmVjdG9yeSwgdGl0bGUsIGZpcnN0cGFnZSwKLSAgICAgICAgICAgICAgICAgY29udGVudHBhZ2U9Tm9uZSwgaW5kZXhwYWdlPU5vbmUpOgotICAgICAgICBzZWxmLmRpcmVjdG9yeSAgID0gZGlyZWN0b3J5Ci0gICAgICAgIHNlbGYudGl0bGUgICAgICAgPSB0aXRsZQotICAgICAgICBzZWxmLmZpcnN0cGFnZSAgID0gYWRkaHRtbChmaXJzdHBhZ2UpCi0gICAgICAgIHNlbGYuY29udGVudHBhZ2UgPSBhZGRodG1sKGNvbnRlbnRwYWdlKQotICAgICAgICBzZWxmLmluZGV4cGFnZSAgID0gYWRkaHRtbChpbmRleHBhZ2UpCi0KLSMgTGlicmFyeSBEb2MgbGlzdCBvZiBib29rczoKLSMgZWFjaCAnYm9vaycgOiAoRGlyLCBUaXRsZSwgRmlyc3QgcGFnZSwgQ29udGVudCBwYWdlLCBJbmRleCBwYWdlKQotc3VwcG9ydGVkX2xpYnJhcmllcyA9IHsKLSAgICAnMi41JzoKLSAgICBbCi0gICAgICAgIEJvb2soJy4nLCAnTWFpbiBwYWdlJywgJ2luZGV4JyksCi0gICAgICAgIEJvb2soJy4nLCAnR2xvYmFsIE1vZHVsZSBJbmRleCcsICdtb2RpbmRleCcpLAotICAgICAgICBCb29rKCd3aGF0c25ldycsICJXaGF0J3MgTmV3IiwgJ2luZGV4JywgJ2NvbnRlbnRzJyksCi0gICAgICAgIEJvb2soJ3R1dCcsJ1R1dG9yaWFsJywndHV0Jywnbm9kZTInKSwKLSAgICAgICAgQm9vaygnbGliJywnTGlicmFyeSBSZWZlcmVuY2UnLCdsaWInLCdjb250ZW50cycsJ2dlbmluZGV4JyksCi0gICAgICAgIEJvb2soJ3JlZicsJ0xhbmd1YWdlIFJlZmVyZW5jZScsJ3JlZicsJ2NvbnRlbnRzJywnZ2VuaW5kZXgnKSwKLSAgICAgICAgQm9vaygnbWFjJywnTWFjaW50b3NoIFJlZmVyZW5jZScsJ21hYycsJ2NvbnRlbnRzJywnZ2VuaW5kZXgnKSwKLSAgICAgICAgQm9vaygnZXh0JywnRXh0ZW5kaW5nIGFuZCBFbWJlZGRpbmcnLCdleHQnLCdjb250ZW50cycpLAotICAgICAgICBCb29rKCdhcGknLCdQeXRob24vQyBBUEknLCdhcGknLCdjb250ZW50cycsJ2dlbmluZGV4JyksCi0gICAgICAgIEJvb2soJ2RvYycsJ0RvY3VtZW50aW5nIFB5dGhvbicsJ2RvYycsJ2NvbnRlbnRzJyksCi0gICAgICAgIEJvb2soJ2luc3QnLCdJbnN0YWxsaW5nIFB5dGhvbiBNb2R1bGVzJywgJ2luc3QnLCAnaW5kZXgnKSwKLSAgICAgICAgQm9vaygnZGlzdCcsJ0Rpc3RyaWJ1dGluZyBQeXRob24gTW9kdWxlcycsICdkaXN0JywgJ2luZGV4JywgJ2dlbmluZGV4JyksCi0gICAgXSwKLQotICAgICcyLjQnOgotICAgIFsKLSAgICAgICAgQm9vaygnLicsICdNYWluIHBhZ2UnLCAnaW5kZXgnKSwKLSAgICAgICAgQm9vaygnLicsICdHbG9iYWwgTW9kdWxlIEluZGV4JywgJ21vZGluZGV4JyksCi0gICAgICAgIEJvb2soJ3doYXRzbmV3JywgIldoYXQncyBOZXciLCAnaW5kZXgnLCAnY29udGVudHMnKSwKLSAgICAgICAgQm9vaygndHV0JywnVHV0b3JpYWwnLCd0dXQnLCdub2RlMicpLAotICAgICAgICBCb29rKCdsaWInLCdMaWJyYXJ5IFJlZmVyZW5jZScsJ2xpYicsJ2NvbnRlbnRzJywnZ2VuaW5kZXgnKSwKLSAgICAgICAgQm9vaygncmVmJywnTGFuZ3VhZ2UgUmVmZXJlbmNlJywncmVmJywnY29udGVudHMnLCdnZW5pbmRleCcpLAotICAgICAgICBCb29rKCdtYWMnLCdNYWNpbnRvc2ggUmVmZXJlbmNlJywnbWFjJywnY29udGVudHMnLCdnZW5pbmRleCcpLAotICAgICAgICBCb29rKCdleHQnLCdFeHRlbmRpbmcgYW5kIEVtYmVkZGluZycsJ2V4dCcsJ2NvbnRlbnRzJyksCi0gICAgICAgIEJvb2soJ2FwaScsJ1B5dGhvbi9DIEFQSScsJ2FwaScsJ2NvbnRlbnRzJywnZ2VuaW5kZXgnKSwKLSAgICAgICAgQm9vaygnZG9jJywnRG9jdW1lbnRpbmcgUHl0aG9uJywnZG9jJywnY29udGVudHMnKSwKLSAgICAgICAgQm9vaygnaW5zdCcsJ0luc3RhbGxpbmcgUHl0aG9uIE1vZHVsZXMnLCAnaW5zdCcsICdpbmRleCcpLAotICAgICAgICBCb29rKCdkaXN0JywnRGlzdHJpYnV0aW5nIFB5dGhvbiBNb2R1bGVzJywgJ2Rpc3QnLCAnaW5kZXgnLCAnZ2VuaW5kZXgnKSwKLSAgICBdLAotCi0gICAgJzIuMyc6Ci0gICAgWwotICAgICAgICBCb29rKCcuJywgJ01haW4gcGFnZScsICdpbmRleCcpLAotICAgICAgICBCb29rKCcuJywgJ0dsb2JhbCBNb2R1bGUgSW5kZXgnLCAnbW9kaW5kZXgnKSwKLSAgICAgICAgQm9vaygnd2hhdHNuZXcnLCAiV2hhdCdzIE5ldyIsICdpbmRleCcsICdjb250ZW50cycpLAotICAgICAgICBCb29rKCd0dXQnLCdUdXRvcmlhbCcsJ3R1dCcsJ25vZGUyJyksCi0gICAgICAgIEJvb2soJ2xpYicsJ0xpYnJhcnkgUmVmZXJlbmNlJywnbGliJywnY29udGVudHMnLCdnZW5pbmRleCcpLAotICAgICAgICBCb29rKCdyZWYnLCdMYW5ndWFnZSBSZWZlcmVuY2UnLCdyZWYnLCdjb250ZW50cycsJ2dlbmluZGV4JyksCi0gICAgICAgIEJvb2soJ21hYycsJ01hY2ludG9zaCBSZWZlcmVuY2UnLCdtYWMnLCdjb250ZW50cycsJ2dlbmluZGV4JyksCi0gICAgICAgIEJvb2soJ2V4dCcsJ0V4dGVuZGluZyBhbmQgRW1iZWRkaW5nJywnZXh0JywnY29udGVudHMnKSwKLSAgICAgICAgQm9vaygnYXBpJywnUHl0aG9uL0MgQVBJJywnYXBpJywnY29udGVudHMnLCdnZW5pbmRleCcpLAotICAgICAgICBCb29rKCdkb2MnLCdEb2N1bWVudGluZyBQeXRob24nLCdkb2MnLCdjb250ZW50cycpLAotICAgICAgICBCb29rKCdpbnN0JywnSW5zdGFsbGluZyBQeXRob24gTW9kdWxlcycsICdpbnN0JywgJ2luZGV4JyksCi0gICAgICAgIEJvb2soJ2Rpc3QnLCdEaXN0cmlidXRpbmcgUHl0aG9uIE1vZHVsZXMnLCAnZGlzdCcsICdpbmRleCcpLAotICAgIF0sCi0KLSAgICAnMi4yJzoKLSAgICBbCi0gICAgICAgIEJvb2soJy4nLCAnTWFpbiBwYWdlJywgJ2luZGV4JyksCi0gICAgICAgIEJvb2soJy4nLCAnR2xvYmFsIE1vZHVsZSBJbmRleCcsICdtb2RpbmRleCcpLAotICAgICAgICBCb29rKCd3aGF0c25ldycsICJXaGF0J3MgTmV3IiwgJ2luZGV4JywgJ2NvbnRlbnRzJyksCi0gICAgICAgIEJvb2soJ3R1dCcsJ1R1dG9yaWFsJywndHV0Jywnbm9kZTInKSwKLSAgICAgICAgQm9vaygnbGliJywnTGlicmFyeSBSZWZlcmVuY2UnLCdsaWInLCdjb250ZW50cycsJ2dlbmluZGV4JyksCi0gICAgICAgIEJvb2soJ3JlZicsJ0xhbmd1YWdlIFJlZmVyZW5jZScsJ3JlZicsJ2NvbnRlbnRzJywnZ2VuaW5kZXgnKSwKLSAgICAgICAgQm9vaygnbWFjJywnTWFjaW50b3NoIFJlZmVyZW5jZScsJ21hYycsJ2NvbnRlbnRzJywnZ2VuaW5kZXgnKSwKLSAgICAgICAgQm9vaygnZXh0JywnRXh0ZW5kaW5nIGFuZCBFbWJlZGRpbmcnLCdleHQnLCdjb250ZW50cycpLAotICAgICAgICBCb29rKCdhcGknLCdQeXRob24vQyBBUEknLCdhcGknLCdjb250ZW50cycsJ2dlbmluZGV4JyksCi0gICAgICAgIEJvb2soJ2RvYycsJ0RvY3VtZW50aW5nIFB5dGhvbicsJ2RvYycsJ2NvbnRlbnRzJyksCi0gICAgICAgIEJvb2soJ2luc3QnLCdJbnN0YWxsaW5nIFB5dGhvbiBNb2R1bGVzJywgJ2luc3QnLCAnaW5kZXgnKSwKLSAgICAgICAgQm9vaygnZGlzdCcsJ0Rpc3RyaWJ1dGluZyBQeXRob24gTW9kdWxlcycsICdkaXN0JywgJ2luZGV4JyksCi0gICAgXSwKLQotICAgICcyLjEuMSc6Ci0gICAgWwotICAgICAgICBCb29rKCcuJywgJ01haW4gcGFnZScsICdpbmRleCcpLAotICAgICAgICBCb29rKCcuJywgJ0dsb2JhbCBNb2R1bGUgSW5kZXgnLCAnbW9kaW5kZXgnKSwKLSAgICAgICAgQm9vaygndHV0JywnVHV0b3JpYWwnLCd0dXQnLCdub2RlMicpLAotICAgICAgICBCb29rKCdsaWInLCdMaWJyYXJ5IFJlZmVyZW5jZScsJ2xpYicsJ2NvbnRlbnRzJywnZ2VuaW5kZXgnKSwKLSAgICAgICAgQm9vaygncmVmJywnTGFuZ3VhZ2UgUmVmZXJlbmNlJywncmVmJywnY29udGVudHMnLCdnZW5pbmRleCcpLAotICAgICAgICBCb29rKCdtYWMnLCdNYWNpbnRvc2ggUmVmZXJlbmNlJywnbWFjJywnY29udGVudHMnLCdnZW5pbmRleCcpLAotICAgICAgICBCb29rKCdleHQnLCdFeHRlbmRpbmcgYW5kIEVtYmVkZGluZycsJ2V4dCcsJ2NvbnRlbnRzJyksCi0gICAgICAgIEJvb2soJ2FwaScsJ1B5dGhvbi9DIEFQSScsJ2FwaScsJ2NvbnRlbnRzJywnZ2VuaW5kZXgnKSwKLSAgICAgICAgQm9vaygnZG9jJywnRG9jdW1lbnRpbmcgUHl0aG9uJywnZG9jJywnY29udGVudHMnKSwKLSAgICAgICAgQm9vaygnaW5zdCcsJ0luc3RhbGxpbmcgUHl0aG9uIE1vZHVsZXMnLCAnaW5zdCcsICdpbmRleCcpLAotICAgICAgICBCb29rKCdkaXN0JywnRGlzdHJpYnV0aW5nIFB5dGhvbiBNb2R1bGVzJywgJ2Rpc3QnLCAnaW5kZXgnKSwKLSAgICBdLAotCi0gICAgJzIuMC4wJzoKLSAgICBbCi0gICAgICAgIEJvb2soJy4nLCAnR2xvYmFsIE1vZHVsZSBJbmRleCcsICdtb2RpbmRleCcpLAotICAgICAgICBCb29rKCd0dXQnLCdUdXRvcmlhbCcsJ3R1dCcsJ25vZGUyJyksCi0gICAgICAgIEJvb2soJ2xpYicsJ0xpYnJhcnkgUmVmZXJlbmNlJywnbGliJywnY29udGVudHMnLCdnZW5pbmRleCcpLAotICAgICAgICBCb29rKCdyZWYnLCdMYW5ndWFnZSBSZWZlcmVuY2UnLCdyZWYnLCdjb250ZW50cycsJ2dlbmluZGV4JyksCi0gICAgICAgIEJvb2soJ21hYycsJ01hY2ludG9zaCBSZWZlcmVuY2UnLCdtYWMnLCdjb250ZW50cycsJ2dlbmluZGV4JyksCi0gICAgICAgIEJvb2soJ2V4dCcsJ0V4dGVuZGluZyBhbmQgRW1iZWRkaW5nJywnZXh0JywnY29udGVudHMnKSwKLSAgICAgICAgQm9vaygnYXBpJywnUHl0aG9uL0MgQVBJJywnYXBpJywnY29udGVudHMnLCdnZW5pbmRleCcpLAotICAgICAgICBCb29rKCdkb2MnLCdEb2N1bWVudGluZyBQeXRob24nLCdkb2MnLCdjb250ZW50cycpLAotICAgICAgICBCb29rKCdpbnN0JywnSW5zdGFsbGluZyBQeXRob24gTW9kdWxlcycsICdpbnN0JywgJ2NvbnRlbnRzJyksCi0gICAgICAgIEJvb2soJ2Rpc3QnLCdEaXN0cmlidXRpbmcgUHl0aG9uIE1vZHVsZXMnLCAnZGlzdCcsICdjb250ZW50cycpLAotICAgIF0sCi0KLSAgICAjIDxkbmFnYXRhQGNyZW8uY29tPiBBcHIgMTcvOTk6IGxpYnJhcnkgZm9yIDEuNS4yIHZlcnNpb246Ci0gICAgIyA8aGVybmFuLmZvZmZhbmlAaW5hbWUuY29tPiBNYXkgMDEvOTk6IGxpYnJhcnkgZm9yIDEuNS4yICgwNC8zMC85OSk6Ci0gICAgJzEuNS4yJzoKLSAgICBbCi0gICAgICAgIEJvb2soJ3R1dCcsJ1R1dG9yaWFsJywndHV0Jywnbm9kZTInKSwKLSAgICAgICAgQm9vaygnbGliJywnTGlicmFyeSBSZWZlcmVuY2UnLCdsaWInLCdjb250ZW50cycsJ2dlbmluZGV4JyksCi0gICAgICAgIEJvb2soJ3JlZicsJ0xhbmd1YWdlIFJlZmVyZW5jZScsJ3JlZicsJ2NvbnRlbnRzJywnZ2VuaW5kZXgnKSwKLSAgICAgICAgQm9vaygnbWFjJywnTWFjaW50b3NoIFJlZmVyZW5jZScsJ21hYycsJ2NvbnRlbnRzJywnZ2VuaW5kZXgnKSwKLSAgICAgICAgQm9vaygnZXh0JywnRXh0ZW5kaW5nIGFuZCBFbWJlZGRpbmcnLCdleHQnLCdjb250ZW50cycpLAotICAgICAgICBCb29rKCdhcGknLCdQeXRob24vQyBBUEknLCdhcGknLCdjb250ZW50cycsJ2dlbmluZGV4JyksCi0gICAgICAgIEJvb2soJ2RvYycsJ0RvY3VtZW50aW5nIFB5dGhvbicsJ2RvYycsJ2NvbnRlbnRzJykKLSAgICBdLAotCi0gICAgIyBsaWJyYXJ5IGZvciAxLjUuMSB2ZXJzaW9uOgotICAgICcxLjUuMSc6Ci0gICAgWwotICAgICAgICBCb29rKCd0dXQnLCdUdXRvcmlhbCcsJ3R1dCcsJ2NvbnRlbnRzJyksCi0gICAgICAgIEJvb2soJ2xpYicsJ0xpYnJhcnkgUmVmZXJlbmNlJywnbGliJywnY29udGVudHMnLCdnZW5pbmRleCcpLAotICAgICAgICBCb29rKCdyZWYnLCdMYW5ndWFnZSBSZWZlcmVuY2UnLCdyZWYtMScsJ3JlZi0yJywncmVmLTExJyksCi0gICAgICAgIEJvb2soJ2V4dCcsJ0V4dGVuZGluZyBhbmQgRW1iZWRkaW5nJywnZXh0JywnY29udGVudHMnKSwKLSAgICAgICAgQm9vaygnYXBpJywnUHl0aG9uL0MgQVBJJywnYXBpJywnY29udGVudHMnLCdnZW5pbmRleCcpCi0gICAgXSwKLQotICAgICMgbGlicmFyeSBmb3IgMS41IHZlcnNpb246Ci0gICAgJzEuNSc6Ci0gICAgWwotICAgICAgICBCb29rKCd0dXQnLCdUdXRvcmlhbCcsJ3R1dCcsJ25vZGUxJyksCi0gICAgICAgIEJvb2soJ2xpYicsJ0xpYnJhcnkgUmVmZXJlbmNlJywnbGliJywnbm9kZTEnLCdub2RlMjY4JyksCi0gICAgICAgIEJvb2soJ3JlZicsJ0xhbmd1YWdlIFJlZmVyZW5jZScsJ3JlZi0xJywncmVmLTInLCdyZWYtMTEnKSwKLSAgICAgICAgQm9vaygnZXh0JywnRXh0ZW5kaW5nIGFuZCBFbWJlZGRpbmcnLCdleHQnLCdub2RlMScpLAotICAgICAgICBCb29rKCdhcGknLCdQeXRob24vQyBBUEknLCdhcGknLCdub2RlMScsJ25vZGU0OCcpCi0gICAgXQotfQotCi0jIEFsbW9zdE51bGxXcml0ZXIgZG9lc24ndCBwcmludCBhbnl0aGluZzsgaXQganVzdCBhcnJhbmdlcyB0byBzYXZlIHRoZQotIyB0ZXh0IHNlbnQgdG8gc2VuZF9mbG93aW5nX2RhdGEoKS4gIFRoaXMgaXMgdXNlZCB0byBjYXB0dXJlIHRoZSB0ZXh0Ci0jIGJldHdlZW4gYW4gYW5jaG9yIGJlZ2luL2VuZCBwYWlyLCBlLmcuIGZvciBUT0MgZW50cmllcy4KLQotY2xhc3MgQWxtb3N0TnVsbFdyaXRlcihOdWxsV3JpdGVyKToKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgTnVsbFdyaXRlci5fX2luaXRfXyhzZWxmKQotICAgICAgICBzZWxmLnNhdmVkX2NsZWFyKCkKLQotICAgIGRlZiBzZW5kX2Zsb3dpbmdfZGF0YShzZWxmLCBkYXRhKToKLSAgICAgICAgc3RyaXBwZWQgPSBkYXRhLnN0cmlwKCkKLSAgICAgICAgaWYgc3RyaXBwZWQ6ICAgICMgZG9uJ3QgYm90aGVyIHRvIHNhdmUgcnVucyBvZiB3aGl0ZXNwYWNlCi0gICAgICAgICAgICBzZWxmLnNhdmVkLmFwcGVuZChzdHJpcHBlZCkKLQotICAgICMgRm9yZ2V0IGFsbCBzYXZlZCB0ZXh0LgotICAgIGRlZiBzYXZlZF9jbGVhcihzZWxmKToKLSAgICAgICAgc2VsZi5zYXZlZCA9IFtdCi0KLSAgICAjIFJldHVybiBhbGwgc2F2ZWQgdGV4dCBhcyBhIHN0cmluZy4KLSAgICBkZWYgc2F2ZWRfZ2V0KHNlbGYpOgotICAgICAgICByZXR1cm4gJyAnLmpvaW4oc2VsZi5zYXZlZCkKLQotY2xhc3MgSGVscEh0bWxQYXJzZXIoSFRNTFBhcnNlcik6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgZm9ybWF0dGVyLCBwYXRoLCBvdXRwdXQpOgotICAgICAgICBIVE1MUGFyc2VyLl9faW5pdF9fKHNlbGYsIGZvcm1hdHRlcikKLSAgICAgICAgc2VsZi5wYXRoID0gcGF0aCAgICAjIHJlbGF0aXZlIHBhdGgKLSAgICAgICAgc2VsZi5mdCA9IG91dHB1dCAgICAjIG91dHB1dCBmaWxlCi0gICAgICAgIHNlbGYuaW5kZW50ID0gMCAgICAgIyBudW1iZXIgb2YgdGFicyBmb3IgcHJldHR5IHByaW50aW5nIG9mIGZpbGVzCi0gICAgICAgIHNlbGYucHJvYyA9IEZhbHNlICAgIyBUcnVlIHdoZW4gYWN0aXZlbHkgcHJvY2Vzc2luZywgZWxzZSBGYWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKGhlYWRlcnMsIGZvb3RlcnMsIGV0YykKLSAgICAgICAgIyBYWFggVGhpcyBzaG91bGRuJ3QgbmVlZCB0byBiZSBhIHN0YWNrIC0tIGFuY2hvcnMgc2hvdWxkbid0IG5lc3QuCi0gICAgICAgICMgWFhYIFNlZSBTRiBidWcgPGh0dHA6Ly93d3cucHl0aG9uLm9yZy9zZi81NDY1Nzk+LgotICAgICAgICBzZWxmLmhyZWZzdGFjayA9IFtdICMgc3RhY2sgb2YgaHJlZnMgZnJvbSBhbmNob3IgYmVnaW5zCi0KLSAgICBkZWYgYmVnaW5fZ3JvdXAoc2VsZik6Ci0gICAgICAgIHNlbGYuaW5kZW50ICs9IDEKLSAgICAgICAgc2VsZi5wcm9jID0gVHJ1ZQotCi0gICAgZGVmIGZpbmlzaF9ncm91cChzZWxmKToKLSAgICAgICAgc2VsZi5pbmRlbnQgLT0gMQotICAgICAgICAjIHN0b3AgcHJvY2Vzc2luZyB3aGVuIGJhY2sgdG8gdG9wIGxldmVsCi0gICAgICAgIHNlbGYucHJvYyA9IHNlbGYuaW5kZW50ID4gMAotCi0gICAgZGVmIGFuY2hvcl9iZ24oc2VsZiwgaHJlZiwgbmFtZSwgdHlwZSk6Ci0gICAgICAgIGlmIHNlbGYucHJvYzoKLSAgICAgICAgICAgICMgWFhYIFNlZSBTRiBidWcgPGh0dHA6Ly93d3cucHl0aG9uLm9yZy9zZi81NDY1Nzk+LgotICAgICAgICAgICAgIyBYWFggaW5kZXguaHRtbCBmb3IgdGhlIDIuMi4xIGxhbmd1YWdlIHJlZmVyZW5jZSBtYW51YWwgY29udGFpbnMKLSAgICAgICAgICAgICMgWFhYIG5lc3RlZCA8YT48L2E+IHRhZ3MgaW4gdGhlIGVudHJ5IGZvciB0aGUgc2VjdGlvbiBvbiBibGFuawotICAgICAgICAgICAgIyBYWFggbGluZXMuICBXZSB3YW50IHRvIGlnbm9yZSB0aGUgbmVzdGVkIHBhcnQgY29tcGxldGVseS4KLSAgICAgICAgICAgIGlmIGxlbihzZWxmLmhyZWZzdGFjaykgPT0gMDoKLSAgICAgICAgICAgICAgICBzZWxmLnNhdmVkX2NsZWFyKCkKLSAgICAgICAgICAgICAgICBzZWxmLmhyZWZzdGFjay5hcHBlbmQoaHJlZikKLQotICAgIGRlZiBhbmNob3JfZW5kKHNlbGYpOgotICAgICAgICBpZiBzZWxmLnByb2M6Ci0gICAgICAgICAgICAjIFhYWCBTZWUgWFhYIGFib3ZlLgotICAgICAgICAgICAgaWYgc2VsZi5ocmVmc3RhY2s6Ci0gICAgICAgICAgICAgICAgdGl0bGUgPSBjZ2kuZXNjYXBlKHNlbGYuc2F2ZWRfZ2V0KCksIFRydWUpCi0gICAgICAgICAgICAgICAgcGF0aCA9IHNlbGYucGF0aCArICcvJyArIHNlbGYuaHJlZnN0YWNrLnBvcCgpCi0gICAgICAgICAgICAgICAgc2VsZi50YWIob2JqZWN0X3NpdGVtYXAgJSAodGl0bGUsIHBhdGgpKQotCi0gICAgZGVmIHN0YXJ0X2RsKHNlbGYsIGF0cl92YWwpOgotICAgICAgICBzZWxmLmJlZ2luX2dyb3VwKCkKLQotICAgIGRlZiBlbmRfZGwoc2VsZik6Ci0gICAgICAgIHNlbGYuZmluaXNoX2dyb3VwKCkKLQotICAgIGRlZiBkb19kdChzZWxmLCBhdHJfdmFsKToKLSAgICAgICAgIyBubyB0cmFpbGluZyBuZXdsaW5lIG9uIHB1cnBvc2UhCi0gICAgICAgIHNlbGYudGFiKCI8TEk+IikKLQotICAgICMgV3JpdGUgdGV4dCB0byBvdXRwdXQgZmlsZS4KLSAgICBkZWYgd3JpdGUoc2VsZiwgdGV4dCk6Ci0gICAgICAgIHNlbGYuZnQud3JpdGUodGV4dCkKLQotICAgICMgV3JpdGUgdGV4dCB0byBvdXRwdXQgZmlsZSBhZnRlciBpbmRlbnRpbmcgYnkgc2VsZi5pbmRlbnQgdGFicy4KLSAgICBkZWYgdGFiKHNlbGYsIHRleHQ9JycpOgotICAgICAgICBzZWxmLndyaXRlKCdcdCcgKiBzZWxmLmluZGVudCkKLSAgICAgICAgaWYgdGV4dDoKLSAgICAgICAgICAgIHNlbGYud3JpdGUodGV4dCkKLQotICAgICMgRm9yZ2V0IGFsbCBzYXZlZCB0ZXh0LgotICAgIGRlZiBzYXZlZF9jbGVhcihzZWxmKToKLSAgICAgICAgc2VsZi5mb3JtYXR0ZXIud3JpdGVyLnNhdmVkX2NsZWFyKCkKLQotICAgICMgUmV0dXJuIGFsbCBzYXZlZCB0ZXh0IGFzIGEgc3RyaW5nLgotICAgIGRlZiBzYXZlZF9nZXQoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLmZvcm1hdHRlci53cml0ZXIuc2F2ZWRfZ2V0KCkKLQotY2xhc3MgSWR4SGxwSHRtbFBhcnNlcihIZWxwSHRtbFBhcnNlcik6Ci0gICAgIyBub3RoaW5nIHNwZWNpYWwgaGVyZSwgc2VlbXMgZW5vdWdoIHdpdGggcGFyZW50IGNsYXNzCi0gICAgcGFzcwotCi1jbGFzcyBUb2NIbHBIdG1sUGFyc2VyKEhlbHBIdG1sUGFyc2VyKToKLQotICAgIGRlZiBzdGFydF9kbChzZWxmLCBhdHJfdmFsKToKLSAgICAgICAgc2VsZi5iZWdpbl9ncm91cCgpCi0gICAgICAgIHNlbGYudGFiKCc8VUw+XG4nKQotCi0gICAgZGVmIGVuZF9kbChzZWxmKToKLSAgICAgICAgc2VsZi5maW5pc2hfZ3JvdXAoKQotICAgICAgICBzZWxmLnRhYignPC9VTD5cbicpCi0KLSAgICBkZWYgc3RhcnRfdWwoc2VsZiwgYXRyX3ZhbCk6Ci0gICAgICAgIHNlbGYuYmVnaW5fZ3JvdXAoKQotICAgICAgICBzZWxmLnRhYignPFVMPlxuJykKLQotICAgIGRlZiBlbmRfdWwoc2VsZik6Ci0gICAgICAgIHNlbGYuZmluaXNoX2dyb3VwKCkKLSAgICAgICAgc2VsZi50YWIoJzwvVUw+XG4nKQotCi0gICAgZGVmIGRvX2xpKHNlbGYsIGF0cl92YWwpOgotICAgICAgICAjIG5vIHRyYWlsaW5nIG5ld2xpbmUgb24gcHVycG9zZSEKLSAgICAgICAgc2VsZi50YWIoIjxMST4iKQotCi1kZWYgaW5kZXgocGF0aCwgaW5kZXhwYWdlLCBvdXRwdXQpOgotICAgIHBhcnNlciA9IElkeEhscEh0bWxQYXJzZXIoQWJzdHJhY3RGb3JtYXR0ZXIoQWxtb3N0TnVsbFdyaXRlcigpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsIG91dHB1dCkKLSAgICBmID0gb3BlbihwYXRoICsgJy8nICsgaW5kZXhwYWdlKQotICAgIHBhcnNlci5mZWVkKGYucmVhZCgpKQotICAgIHBhcnNlci5jbG9zZSgpCi0gICAgZi5jbG9zZSgpCi0KLWRlZiBjb250ZW50KHBhdGgsIGNvbnRlbnRwYWdlLCBvdXRwdXQpOgotICAgIHBhcnNlciA9IFRvY0hscEh0bWxQYXJzZXIoQWJzdHJhY3RGb3JtYXR0ZXIoQWxtb3N0TnVsbFdyaXRlcigpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsIG91dHB1dCkKLSAgICBmID0gb3BlbihwYXRoICsgJy8nICsgY29udGVudHBhZ2UpCi0gICAgcGFyc2VyLmZlZWQoZi5yZWFkKCkpCi0gICAgcGFyc2VyLmNsb3NlKCkKLSAgICBmLmNsb3NlKCkKLQotZGVmIGRvX2luZGV4KGxpYnJhcnksIG91dHB1dCk6Ci0gICAgb3V0cHV0LndyaXRlKCc8VUw+XG4nKQotICAgIGZvciBib29rIGluIGxpYnJhcnk6Ci0gICAgICAgIHByaW50KCdcdCcsIGJvb2sudGl0bGUsICctJywgYm9vay5pbmRleHBhZ2UpCi0gICAgICAgIGlmIGJvb2suaW5kZXhwYWdlOgotICAgICAgICAgICAgaW5kZXgoYm9vay5kaXJlY3RvcnksIGJvb2suaW5kZXhwYWdlLCBvdXRwdXQpCi0gICAgb3V0cHV0LndyaXRlKCc8L1VMPlxuJykKLQotZGVmIGRvX2NvbnRlbnQobGlicmFyeSwgdmVyc2lvbiwgb3V0cHV0KToKLSAgICBvdXRwdXQud3JpdGUoY29udGVudHNfaGVhZGVyKQotICAgIGZvciBib29rIGluIGxpYnJhcnk6Ci0gICAgICAgIHByaW50KCdcdCcsIGJvb2sudGl0bGUsICctJywgYm9vay5maXJzdHBhZ2UpCi0gICAgICAgIHBhdGggPSBib29rLmRpcmVjdG9yeSArICIvIiArIGJvb2suZmlyc3RwYWdlCi0gICAgICAgIG91dHB1dC53cml0ZSgnPExJPicpCi0gICAgICAgIG91dHB1dC53cml0ZShvYmplY3Rfc2l0ZW1hcCAlIChib29rLnRpdGxlLCBwYXRoKSkKLSAgICAgICAgaWYgYm9vay5jb250ZW50cGFnZToKLSAgICAgICAgICAgIGNvbnRlbnQoYm9vay5kaXJlY3RvcnksIGJvb2suY29udGVudHBhZ2UsIG91dHB1dCkKLSAgICBvdXRwdXQud3JpdGUoY29udGVudHNfZm9vdGVyKQotCi0jIEZpbGwgaW4gdGhlIFtGSUxFU10gc2VjdGlvbiBvZiB0aGUgcHJvamVjdCAoLmhocCkgZmlsZS4KLSMgJ2xpYnJhcnknIGlzIHRoZSBsaXN0IG9mIGRpcmVjdG9yeSBkZXNjcmlwdGlvbiB0dXBsZXMgZnJvbQotIyBzdXBwb3J0ZWRfbGlicmFyaWVzIGZvciB0aGUgdmVyc2lvbiBvZiB0aGUgZG9jcyBnZXR0aW5nIGdlbmVyYXRlZC4KLWRlZiBkb19wcm9qZWN0KGxpYnJhcnksIG91dHB1dCwgYXJjaCwgdmVyc2lvbik6Ci0gICAgb3V0cHV0LndyaXRlKHByb2plY3RfdGVtcGxhdGUgJSBsb2NhbHMoKSkKLSAgICBwYXRoc2VlbiA9IHt9Ci0gICAgZm9yIGJvb2sgaW4gbGlicmFyeToKLSAgICAgICAgZGlyZWN0b3J5ID0gYm9vay5kaXJlY3RvcnkKLSAgICAgICAgcGF0aCA9IGRpcmVjdG9yeSArICdcXCVzXG4nCi0gICAgICAgIGZvciBwYWdlIGluIG9zLmxpc3RkaXIoZGlyZWN0b3J5KToKLSAgICAgICAgICAgIGlmIHBhZ2UuZW5kc3dpdGgoJy5odG1sJykgb3IgcGFnZS5lbmRzd2l0aCgnLmNzcycpOgotICAgICAgICAgICAgICAgIGZ1bGxwYXRoID0gcGF0aCAlIHBhZ2UKLSAgICAgICAgICAgICAgICBpZiBmdWxscGF0aCBub3QgaW4gcGF0aHNlZW46Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZShmdWxscGF0aCkKLSAgICAgICAgICAgICAgICAgICAgcGF0aHNlZW5bZnVsbHBhdGhdID0gVHJ1ZQotCi1kZWYgb3BlbmZpbGUoZmlsZSk6Ci0gICAgdHJ5OgotICAgICAgICBwID0gb3BlbihmaWxlLCAidyIpCi0gICAgZXhjZXB0IElPRXJyb3IgYXMgbXNnOgotICAgICAgICBwcmludChmaWxlLCAiOiIsIG1zZykKLSAgICAgICAgc3lzLmV4aXQoMSkKLSAgICByZXR1cm4gcAotCi1kZWYgdXNhZ2UoKToKLSAgICBwcmludCh1c2FnZV9tb2RlKQotICAgIHN5cy5leGl0KDApCi0KLWRlZiBkb19pdChhcmdzID0gTm9uZSk6Ci0gICAgaWYgbm90IGFyZ3M6Ci0gICAgICAgIGFyZ3MgPSBzeXMuYXJndlsxOl0KLQotICAgIGlmIG5vdCBhcmdzOgotICAgICAgICB1c2FnZSgpCi0KLSAgICB0cnk6Ci0gICAgICAgIG9wdGxpc3QsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KGFyZ3MsICdja3B2OicpCi0gICAgZXhjZXB0IGdldG9wdC5lcnJvciBhcyBtc2c6Ci0gICAgICAgIHByaW50KG1zZykKLSAgICAgICAgdXNhZ2UoKQotCi0gICAgaWYgbm90IGFyZ3Mgb3IgbGVuKGFyZ3MpID4gMToKLSAgICAgICAgdXNhZ2UoKQotICAgIGFyY2ggPSBhcmdzWzBdCi0KLSAgICB2ZXJzaW9uID0gTm9uZQotICAgIGZvciBvcHQgaW4gb3B0bGlzdDoKLSAgICAgICAgaWYgb3B0WzBdID09ICctdic6Ci0gICAgICAgICAgICB2ZXJzaW9uID0gb3B0WzFdCi0gICAgICAgICAgICBicmVhawotICAgIGlmIG5vdCB2ZXJzaW9uOgotICAgICAgICB1c2FnZSgpCi0KLSAgICBsaWJyYXJ5ID0gc3VwcG9ydGVkX2xpYnJhcmllc1t2ZXJzaW9uXQotCi0gICAgaWYgbm90ICgoJy1wJywnJykgaW4gb3B0bGlzdCk6Ci0gICAgICAgIGZuYW1lID0gYXJjaCArICcuc3RwJwotICAgICAgICBmID0gb3BlbmZpbGUoZm5hbWUpCi0gICAgICAgIHByaW50KCJCdWlsZGluZyBzdG9wbGlzdCIsIGZuYW1lLCAiLi4uIikKLSAgICAgICAgd29yZHMgPSBzdG9wX2xpc3Quc3BsaXQoKQotICAgICAgICB3b3Jkcy5zb3J0KCkKLSAgICAgICAgZm9yIHdvcmQgaW4gd29yZHM6Ci0gICAgICAgICAgICBwcmludCh3b3JkLCBmaWxlPWYpCi0gICAgICAgIGYuY2xvc2UoKQotCi0gICAgICAgIGYgPSBvcGVuZmlsZShhcmNoICsgJy5oaHAnKQotICAgICAgICBwcmludCgiQnVpbGRpbmcgUHJvamVjdC4uLiIpCi0gICAgICAgIGRvX3Byb2plY3QobGlicmFyeSwgZiwgYXJjaCwgdmVyc2lvbikKLSAgICAgICAgaWYgdmVyc2lvbiA9PSAnMi4wLjAnOgotICAgICAgICAgICAgZm9yIGltYWdlIGluIG9zLmxpc3RkaXIoJ2ljb25zJyk6Ci0gICAgICAgICAgICAgICAgZi53cml0ZSgnaWNvbnMnKyAnXFwnICsgaW1hZ2UgKyAnXG4nKQotCi0gICAgICAgIGYuY2xvc2UoKQotCi0gICAgaWYgbm90ICgoJy1jJywnJykgaW4gb3B0bGlzdCk6Ci0gICAgICAgIGYgPSBvcGVuZmlsZShhcmNoICsgJy5oaGMnKQotICAgICAgICBwcmludCgiQnVpbGRpbmcgVGFibGUgb2YgQ29udGVudC4uLiIpCi0gICAgICAgIGRvX2NvbnRlbnQobGlicmFyeSwgdmVyc2lvbiwgZikKLSAgICAgICAgZi5jbG9zZSgpCi0KLSAgICBpZiBub3QgKCgnLWsnLCcnKSBpbiBvcHRsaXN0KToKLSAgICAgICAgZiA9IG9wZW5maWxlKGFyY2ggKyAnLmhoaycpCi0gICAgICAgIHByaW50KCJCdWlsZGluZyBJbmRleC4uLiIpCi0gICAgICAgIGRvX2luZGV4KGxpYnJhcnksIGYpCi0gICAgICAgIGYuY2xvc2UoKQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIGRvX2l0KCkKZGlmZiAtLWdpdCBhL0RvYy90b29scy9wdXNoLWRvY3Muc2ggYi9Eb2MvdG9vbHMvcHVzaC1kb2NzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyOGE0YjMxLi4wMDAwMDAwCi0tLSBhL0RvYy90b29scy9wdXNoLWRvY3Muc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jICBTY3JpcHQgdG8gcHVzaCBkb2NzIGZyb20gbXkgZGV2ZWxvcG1lbnQgYXJlYSB0byBTb3VyY2VGb3JnZSwgd2hlcmUgdGhlCi0jICB1cGRhdGUtZG9jcy5zaCBzY3JpcHQgdW5wYWNrcyB0aGVtIGludG8gdGhlaXIgZmluYWwgZGVzdGluYXRpb24uCi0KLVRBUkdFVEhPU1Q9d3d3LnB5dGhvbi5vcmcKLVRBUkdFVERJUj0vdXNyL2hvbWUvZmRyYWtlL3RtcAotCi1QS0dUWVBFPSJiemlwIiAgIyBtdXN0IGJlIG9uZSBvZjogYnppcCwgdGFyLCB6aXAgICgidGFyIiBpbXBsaWVzIGd6aXApCi0KLVRBUkdFVD0iJFRBUkdFVEhPU1Q6JFRBUkdFVERJUiIKLQotQUREUkVTU0VTPSdweXRob24tZGV2QHB5dGhvbi5vcmcgZG9jLXNpZ0BweXRob24ub3JnIHB5dGhvbi1saXN0QHB5dGhvbi5vcmcnCi0KLVRPT0xESVI9ImBkaXJuYW1lICQwYCIKLVZFUlNJT049YCRUT09MRElSL2dldHZlcnNpb25pbmZvYAotCi0jIFNldCAkRVhUUkEgdG8gc29tZXRoaW5nIG5vbi1lbXB0eSBpZiB0aGlzIGlzIGEgbm9uLXRydW5rIHZlcnNpb246Ci1FWFRSQT1gZWNobyAiJFZFUlNJT04iIHwgc2VkICdzL15bMC05XVswLTldKlwuWzAtOV1bMC05XSovLydgCi0KLWlmIGVjaG8gIiRFWFRSQSIgfCBncmVwIC1xICdbLl0nIDsgdGhlbgotICAgIERPQ0xBQkVMPSJtYWludGVuYW5jZSIKLSAgICBET0NUWVBFPSJtYWludCIKLWVsc2UKLSAgICBET0NMQUJFTD0iZGV2ZWxvcG1lbnQiCi0gICAgRE9DVFlQRT0iZGV2ZWwiCi1maQotCi1ET0NUWVBFX1NQRUNJRklFRD1mYWxzZQotRVhQTEFOQVRJT049JycKLUFOTk9VTkNFPXRydWUKLQotZ2V0b3B0IC1UID4vZGV2L251bGwKLWlmIFsgJD8gLWVxIDQgXSA7IHRoZW4KLSAgICAjIFdlIGhhdmUgYSBzdWZmaWNpZW50bHkgdXNlZnVsIGdldG9wdCgxKSBpbXBsZW1lbnRhdGlvbi4KLSAgICBldmFsICJzZXQgLS0gYGdldG9wdCAtc3NoIG06cDpxdDpGOiBcIiRAXCJgIgotZWxzZQotICAgICMgVGhpcyB2ZXJzaW9uIG9mIGdldG9wdCBkb2Vzbid0IHN1cHBvcnQgcXVvdGluZyBvZiBsb25nIG9wdGlvbnMKLSAgICAjIHdpdGggc3BhY2VzLCBzbyBsZXQncyBub3QgcmVseSBvbiBpdCBhdCBhbGwuCi0gICAgOgotZmkKLQotd2hpbGUgWyAiJCMiIC1ndCAwIF0gOyBkbwotICBjYXNlICIkMSIgaW4KLSAgICAgIC1tKQotICAgICAgICAgIEVYUExBTkFUSU9OPSIkMiIKLSAgICAgICAgICBzaGlmdCAyCi0gICAgICAgICAgOzsKLSAgICAgIC1wKQotICAgICAgICAgIFBLR1RZUEU9IiQyIgotICAgICAgICAgIHNoaWZ0IDEKLSAgICAgICAgICA7OwotICAgICAgLXEpCi0gICAgICAgICAgQU5OT1VOQ0U9ZmFsc2UKLSAgICAgICAgICBzaGlmdCAxCi0gICAgICAgICAgOzsKLSAgICAgIC10KQotICAgICAgICAgIERPQ1RZUEU9IiQyIgotICAgICAgICAgIERPQ1RZUEVfU1BFQ0lGSUVEPXRydWUKLSAgICAgICAgICBzaGlmdCAyCi0gICAgICAgICAgOzsKLSAgICAgIC1GKQotICAgICAgICAgIEVYUExBTkFUSU9OPSJgY2F0ICQyYCIKLSAgICAgICAgICBzaGlmdCAyCi0gICAgICAgICAgOzsKLSAgICAgIC0tKQotICAgICAgICAgIHNoaWZ0IDEKLSAgICAgICAgICBicmVhawotICAgICAgICAgIDs7Ci0gICAgICAtKikKLSAgICAgICAgICBlY2hvICJVbmtub3duIG9wdGlvbjogJDEiID4mMgotICAgICAgICAgIGV4aXQgMgotICAgICAgICAgIDs7Ci0gICAgICAqKQotICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgOzsKLSAgZXNhYwotZG9uZQotaWYgWyAiJDEiIF0gOyB0aGVuCi0gICAgaWYgWyAiJEVYUExBTkFUSU9OIiBdIDsgdGhlbgotICAgICAgICBlY2hvICJFeHBsYW5hdGlvbiBtYXkgb25seSBiZSBnaXZlbiBvbmNlISIgPiYyCi0gICAgICAgIGV4aXQgMgotICAgIGZpCi0gICAgRVhQTEFOQVRJT049IiQxIgotICAgIHNoaWZ0Ci1maQotCi1TVEFSVD0iYHB3ZGAiCi1NWURJUj0iYGRpcm5hbWUgJDBgIgotY2QgIiRNWURJUiIKLU1ZRElSPSJgcHdkYCIKLQotaWYgWyAiJFBLR1RZUEUiID0gYnppcCBdIDsgdGhlbgotICAgIFBLR0VYVD10YXIuYnoyCi1lbGlmIFsgIiRQS0dUWVBFIiA9IHRhciBdIDsgdGhlbgotICAgIFBLR0VYVD10Z3oKLWVsaWYgWyAiJFBLR1RZUEUiID0gemlwIF0gOyB0aGVuCi0gICAgUEtHRVhUPXppcAotZWxzZQotICAgIGVjaG8gMT4mMiAidW5zdXBwb3J0ZWQgcGFja2FnZSB0eXBlOiAkUEtHVFlQRSIKLSAgICBleGl0IDIKLWZpCi0KLSMgc3dpdGNoIHRvIC4uLi9Eb2MvCi1jZCAuLgotCi0jIElmICRET0NUWVBFIHdhcyBub3Qgc3BlY2lmaWVkIGV4cGxpY2l0bHksIGxvb2sgZm9yIC5kb2N0eXBlIGluCi0jIC4uLi9Eb2MvIGFuZCB1c2UgdGhlIGNvbnRlbnQgb2YgdGhhdCBmaWxlIGlmIHByZXNlbnQuCi1pZiAkRE9DVFlQRV9TUEVDSUZJRUQgOyB0aGVuCi0gICAgOgotZWxpZiBbIC1mIC5kb2N0eXBlIF0gOyB0aGVuCi0gICAgRE9DVFlQRT0iYGNhdCAuZG9jdHlwZWAiCi1maQotCi1tYWtlIC0tbm8tcHJpbnQtZGlyZWN0b3J5ICR7UEtHVFlQRX1odG1sIHx8IGV4aXQgJD8KLVBBQ0tBR0U9Imh0bWwtJFZFUlNJT04uJFBLR0VYVCIKLXNjcCAiJFBBQ0tBR0UiIHRvb2xzL3VwZGF0ZS1kb2NzLnNoICRUQVJHRVQvIHx8IGV4aXQgJD8KLXNzaCAiJFRBUkdFVEhPU1QiIHRtcC91cGRhdGUtZG9jcy5zaCAkRE9DVFlQRSAkUEFDS0FHRSAnJiYnIHJtIHRtcC91cGRhdGUtZG9jcy5zaCB8fCBleGl0ICQ/Ci0KLWlmICRBTk5PVU5DRSA7IHRoZW4KLSAgICBzZW5kbWFpbCAkQUREUkVTU0VTIDw8RU9GCi1UbzogJEFERFJFU1NFUwotRnJvbTogIkZyZWQgTC4gRHJha2UiIDxmZHJha2VAYWNtLm9yZz4KLVN1YmplY3Q6IFskRE9DTEFCRUwgZG9jIHVwZGF0ZXNdCi1YLU5vLUFyY2hpdmU6IHllcwotCi1UaGUgJERPQ0xBQkVMIHZlcnNpb24gb2YgdGhlIGRvY3VtZW50YXRpb24gaGFzIGJlZW4gdXBkYXRlZDoKLQotICAgIGh0dHA6Ly8kVEFSR0VUSE9TVC9kZXYvZG9jLyRET0NUWVBFLwotCi0kRVhQTEFOQVRJT04KLQotQSBkb3dubG9hZGFibGUgcGFja2FnZSBjb250YWluaW5nIHRoZSBIVE1MIGlzIGFsc28gYXZhaWxhYmxlOgotCi0gICAgaHR0cDovLyRUQVJHRVRIT1NUL2Rldi9kb2MvcHl0aG9uLWRvY3MtJERPQ1RZUEUuJFBLR0VYVAotRU9GCi0gICAgZXhpdCAkPwotZmkKZGlmZiAtLWdpdCBhL0RvYy90b29scy9weTJ0ZXhpLmVsIGIvRG9jL3Rvb2xzL3B5MnRleGkuZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNDIzNGYuLjAwMDAwMDAKLS0tIGEvRG9jL3Rvb2xzL3B5MnRleGkuZWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NzAgKzAsMCBAQAotOzs7IHB5MnRleGkuZWwgLS0gQ29udmVyc2lvbiBvZiBQeXRob24gTGFUZVggZG9jdW1lbnRhdGlvbiB0byBUZXhpbmZvCi0KLTs7IENvcHlyaWdodCAoQykgMjAwNiAgSmVyb2VuIERla2tlcnMgPGplcm9lbkBkZWtrZXJzLmN4PgotOzsgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAxLCAyMDAyIE1pbGFuIFphbWF6YWwKLQotOzsgQXV0aG9yOiBNaWxhbiBaYW1hemFsIDxwZG1AemFtYXphbC5vcmc+Ci07OyBWZXJzaW9uOiAkSWQkCi07OyBLZXl3b3JkczogcHl0aG9uCi0KLTs7IENPUFlSSUdIVCBOT1RJQ0UKLTs7Ci07OyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotOzsgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLTs7IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCi07OyB2ZXJzaW9uLgotOzsKLTs7IFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLTs7IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCi07OyBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLTs7IGZvciBtb3JlIGRldGFpbHMuCi07OwotOzsgWW91IGNhbiBmaW5kIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhdAotOzsgaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCi07OyBvciB5b3UgY2FuIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwKLTs7IFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLTs7OyBDb21tZW50YXJ5OgotCi07OyBUaGlzIGlzIGEgUSZEIGhhY2sgZm9yIGNvbnZlcnNpb24gb2YgUHl0aG9uIG1hbnVhbHMgdG8gb24tbGluZSBoZWxwIGZvcm1hdC4KLTs7IEkgZGVzcGVyYXRlbHkgbmVlZGVkIHVzYWJsZSBvbmxpbmUgZG9jdW1lbnRhIGZvciBQeXRob24sIHNvIEkgd3JvdGUgdGhpcy4KLTs7IFRoZSByZXN1bHQgY29kZSBpcyB1Z2x5IGFuZCBuZWVkIG5vdCBjb250YWluIGNvbXBsZXRlIGluZm9ybWF0aW9uIGZyb20KLTs7IFB5dGhvbiBtYW51YWxzLiAgSSBhcG9sb2dpemUgZm9yIG15IGlnbm9yYW5jZSwgZXNwZWNpYWxseSBpZ25vcmFuY2UgdG8KLTs7IHB5dGhvbi5zdHkuICBJbXByb3ZlbWVudHMgb2YgdGhpcyBjb252ZXJ0b3IgYXJlIHdlbGNvbWVkLgotCi07OyBIb3cgdG8gdXNlIGl0OgotOzsgTG9hZCB0aGlzIGZpbGUgYW5kIGFwcGx5IGBNLXggcHkydGV4aScuICBZb3Ugd2lsbCBiZSBhc2tlZCBmb3IgbmFtZSBvZiBhCi07OyBmaWxlIHRvIGJlIGNvbnZlcnRlZC4KLQotOzsgV2hlcmUgdG8gZmluZCBpdDoKLTs7IE5ldyB2ZXJzaW9ucyBvZiB0aGlzIGNvZGUgbWlnaHQgYmUgZm91bmQgYXQKLTs7IGh0dHA6Ly93d3cuemFtYXphbC5vcmcvc29mdHdhcmUvcHl0aG9uL3B5MnRleGkvIC4KLQotOzs7IENvZGU6Ci0KLQotKHJlcXVpcmUgJ3RleGluZm8pCi0oZXZhbC13aGVuLWNvbXBpbGUKLSAgKHJlcXVpcmUgJ2NsKSkKLQotCi0oZGVmdmFyIHB5MnRleGktcHl0aG9uLXZlcnNpb24gIjIuMiIKLSAgIldoYXQgdG8gc3Vic3RpdHV0ZSBmb3IgdGhlIFxcdmVyc2lvbiBtYWNyby4iKQotCi0oZGVmdmFyIHB5MnRleGktcHl0aG9uLXNob3J0LXZlcnNpb24KLSAgKHByb2duCi0gICAgKHN0cmluZy1tYXRjaCAiWzAtOV0rXFwuWzAtOV0rIiBweTJ0ZXhpLXB5dGhvbi12ZXJzaW9uKQotICAgIChtYXRjaC1zdHJpbmcgMCBweTJ0ZXhpLXB5dGhvbi12ZXJzaW9uKSkKLSAgIlNob3J0IHZlcnNpb24gbnVtYmVyLCB1c3VhbGx5IHNldCBieSB0aGUgTGFUZVggY29tbWFuZHMuIikKLQotKGRlZnZhciBweTJ0ZXhpLXRleGktZmlsZS1uYW1lIG5pbAotICAiSWYgbm9uLW5pbCwgdGhhdCBzdHJpbmcgaXMgdXNlZCBhcyB0aGUgbmFtZSBvZiB0aGUgVGV4aW5mbyBmaWxlLgotT3RoZXJ3aXNlIGEgZ2VuZXJhdGVkIFRleGluZm8gZmlsZSBuYW1lIGlzIHVzZWQuIikKLQotKGRlZnZhciBweTJ0ZXhpLWluZm8tZmlsZS1uYW1lIG5pbAotICAiSWYgbm9uLW5pbCwgdGhhdCBzdHJpbmcgaXMgdXNlZCBhcyB0aGUgbmFtZSBvZiB0aGUgSW5mbyBmaWxlLgotT3RoZXJ3aXNlIGEgZ2VuZXJhdGVkIEluZm8gZmlsZSBuYW1lIGlzIHVzZWQuIikKLQotKGRlZnZhciBweTJ0ZXhpLXN0b3Atb24tcHJvYmxlbXMgbmlsCi0gICIqSWYgbm9uLW5pbCwgc3RvcCB3aGVuIHlvdSBlbmNvdXRlciBzb2Z0IHByb2JsZW0uIikKLQotKGRlZmNvbnN0IHB5MnRleGktZW52aXJvbm1lbnRzCi0gICcoKCJhYnN0cmFjdCIgMCAiQHF1b3RhdGlvbiIgIkBlbmQgcXVvdGF0aW9uXG4iKQotICAgICgiY2VudGVyIiAwICIiICIiKQotICAgICgiY2Z1bmNkZXNjIiAzCi0gICAgIChwcm9nbiAoc2V0cSBmaW5kZXggdCkKLQkgICAgIlxuQHRhYmxlIEBjb2RlXG5AaXRlbSBcXDEgXFwyKFxcMylcbkBmaW5kZXggXFwyXG4iKQotICAgICAiQGVuZCB0YWJsZVxuIikKLSAgICAoImNtZW1iZXJkZXNjIiAzCi0gICAgICJcbkB0YWJsZSBAY29kZVxuQGl0ZW0gXFwyIFxcM1xuIgotICAgICAiQGVuZCB0YWJsZVxuIikKLSAgICAoImNsYXNzZGVzYyIgMgotICAgICAocHJvZ24gKHNldHEgb2JpbmRleCB0KQotCSAgICAiXG5AdGFibGUgQGNvZGVcbkBpdGVtIFxcMShcXDIpXG5Ab2JpbmRleCBcXDFcbiIpCi0gICAgICJAZW5kIHRhYmxlXG4iKQotICAgICgiY2xhc3NkZXNjKiIgMQotICAgICAocHJvZ24gKHNldHEgb2JpbmRleCB0KQotCSAgICAiXG5AdGFibGUgQGNvZGVcbkBpdGVtIFxcMVxuQG9iaW5kZXggXFwxXG4iKQotICAgICAiQGVuZCB0YWJsZVxuIikKLSAgICAoImNvbW1lbnQiIDAgIlxuQGlnbm9yZVxuIiAiXG5AZW5kIGlnbm9yZVxuIikKLSAgICAoImNzaW1wbGVtYWNyb2Rlc2MiIDEKLSAgICAgKHByb2duIChzZXRxIGNpbmRleCB0KQotCSAgICAiXG5AdGFibGUgQGNvZGVcbkBpdGVtIFxcMVxuQGNpbmRleCBcXDFcbiIpCi0gICAgICJAZW5kIHRhYmxlXG4iKSAgICAgCi0gICAgKCJjdHlwZWRlc2MiIDEKLSAgICAgKHByb2duIChzZXRxIGNpbmRleCB0KQotCSAgICAiXG5AdGFibGUgQGNvZGVcbkBpdGVtIFxcMVxuQGNpbmRleCBcXDFcbiIpCi0gICAgICJAZW5kIHRhYmxlXG4iKQotICAgICgiY3ZhcmRlc2MiIDIKLSAgICAgKHByb2duIChzZXRxIGZpbmRleCB0KQotCSAgICAiXG5AdGFibGUgQGNvZGVcbkBpdGVtIFxcMSBcXDJcbkBmaW5kZXggXFwyXG4iKQotICAgICAiQGVuZCB0YWJsZVxuIikKLSAgICAoImRhdGFkZXNjIiAxCi0gICAgIChwcm9nbiAoc2V0cSBmaW5kZXggdCkKLQkgICAgIlxuQHRhYmxlIEBjb2RlXG5AaXRlbSBcXDFcbkBmaW5kZXggXFwxXG4iKQotICAgICAiQGVuZCB0YWJsZVxuIikKLSAgICAoImRhdGFkZXNjbmkiIDEgIlxuQHRhYmxlIEBjb2RlXG5AaXRlbSBcXDFcbiIgIkBlbmQgdGFibGVcbiIpCi0gICAgKCJkZWZpbml0aW9ucyIgMCAiQHRhYmxlIEBkZm4iICJAZW5kIHRhYmxlXG4iKQotICAgICgiZGVzY3JpcHRpb24iIDAgIkB0YWJsZSBAc2FtcCIgIkBlbmQgdGFibGVcbiIpCi0gICAgKCJkaXNwbGF5bWF0aCIgMCAiIiAiIikKLSAgICAoImRvY3VtZW50IiAwCi0gICAgIChjb25jYXQgIkBkZWZjb2RlaW5kZXggbW9cbiIKLQkgICAgICJAZGVmY29kZWluZGV4IG9iXG4iCi0JICAgICAiQHRpdGxlcGFnZVxuIgotCSAgICAgKGZvcm1hdCAiQHRpdGxlICIgdGl0bGUgIlxuIikKLQkgICAgIChmb3JtYXQgIkBhdXRob3IgIiBhdXRob3IgIlxuIikKLQkgICAgICJAcGFnZVxuIgotCSAgICAgYXV0aG9yLWFkZHJlc3MKLQkgICAgICJAZW5kIHRpdGxlcGFnZVxuIgotCSAgICAgIkBub2RlIFRvcCwgLCAsIChkaXIpXG4iKQotICAgICAoY29uY2F0ICJAaW5kaWNlc1xuIgotCSAgICAgIkBjb250ZW50c1xuIgotCSAgICAgIkBieWVcbiIpKQotICAgICgiZW51bWVyYXRlIiAwICJAZW51bWVyYXRlIiAiQGVuZCBlbnVtZXJhdGUiKQotICAgICgiZW52ZGVzYyIgMiAoY29uY2F0ICJcbkB0YWJsZSBAY29kZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiXG5AaXRlbSBAYmFja3NsYXNoe31iZWdpbkB7XFwxQH1cXDIiKQotICAgICAiQGVuZCB0YWJsZVxuIikKLSAgICAoImV4Y2Rlc2MiIDEKLSAgICAgKHByb2duIChzZXRxIG9iaW5kZXggdCkKLQkgICAgIlxuQHRhYmxlIEBjb2RlXG5AaXRlbSBcXDFcbkBvYmluZGV4IFxcMVxuIikKLSAgICAgIkBlbmQgdGFibGVcbiIpCi0gICAgKCJleGNjbGFzc2Rlc2MiIDIKLSAgICAgKHByb2duIChzZXRxIG9iaW5kZXggdCkKLQkgICAgIlxuQHRhYmxlIEBjb2RlXG5AaXRlbSBcXDEoXFwyKVxuQG9iaW5kZXggXFwxXG4iKQotICAgICAiQGVuZCB0YWJsZVxuIikKLSAgICAoImZsdXNobGVmdCIgMCAiIiAiIikKLSAgICAoImZ1bGxsaW5laXRlbXMiIDAgIlxuQHRhYmxlIEBjb2RlXG4iICJAZW5kIHRhYmxlXG4iKQotICAgICgiZnVuY2Rlc2MiIDIKLSAgICAgKHByb2duIChzZXRxIGZpbmRleCB0KQotCSAgICAiXG5AdGFibGUgQGNvZGVcbkBpdGVtIFxcMShcXDIpXG5AZmluZGV4IFxcMVxuIikKLSAgICAgIkBlbmQgdGFibGVcbiIpCi0gICAgKCJmdW5jZGVzY25pIiAyICJcbkB0YWJsZSBAY29kZVxuQGl0ZW0gXFwxKFxcMilcbiIgIkBlbmQgdGFibGVcbiIpCi0gICAgKCJpdGVtaXplIiAwICJAaXRlbWl6ZSBAYnVsbGV0IiAiQGVuZCBpdGVtaXplXG4iKQotICAgICgibGlzdCIgMiAiXG5AdGFibGUgQGNvZGVcbiIgIkBlbmQgdGFibGVcbiIpCi0gICAgKCJsb25ndGFibGVpaSIgNCAoY29uY2F0ICJAbXVsdGl0YWJsZSBAY29sdW1uZnJhY3Rpb25zIC41IC41XG4iCi0JCQkgICAgICJAaXRlbSBcXDMgQHRhYiBcXDRcbiIKLQkJCSAgICAgIkBpdGVtIC0tLS0tLS0gQHRhYiAtLS0tLS0gXG4iKQotICAgICAiQGVuZCBtdWx0aXRhYmxlXG4iKQotICAgICgibG9uZ3RhYmxlaWlpIiA1IChjb25jYXQgIkBtdWx0aXRhYmxlIEBjb2x1bW5mcmFjdGlvbnMgLjMzIC4zMyAuMzNcbiIKLQkJCSAgICAgICJAaXRlbSBcXDMgQHRhYiBcXDQgQHRhYiBcXDVcbiIKLQkJCSAgICAgICJAaXRlbSAtLS0tLS0tIEB0YWIgLS0tLS0tIEB0YWIgLS0tLS0tXG4iKQotICAgICAiQGVuZCBtdWx0aXRhYmxlXG4iKQotICAgICgibWFjcm9kZXNjIiAyIChjb25jYXQgIlxuQHRhYmxlIEBjb2RlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuQGl0ZW0gXFwxQHtcXDJAfSIpCi0gICAgICJAZW5kIHRhYmxlXG4iKQotICAgICgibWVtYmVyZGVzYyIgMQotICAgICAocHJvZ24gKHNldHEgZmluZGV4IHQpCi0JICAgICJcbkB0YWJsZSBAY29kZVxuQGl0ZW0gXFwxXG5AZmluZGV4IFxcMVxuIikKLSAgICAgIkBlbmQgdGFibGVcbiIpCi0gICAgKCJtZW1iZXJkZXNjbmkiIDEgIlxuQHRhYmxlIEBjb2RlXG5AaXRlbSBcXDFcbiIgIkBlbmQgdGFibGVcbiIpCi0gICAgKCJtZXRob2RkZXNjIiAyCi0gICAgIChwcm9nbiAoc2V0cSBmaW5kZXggdCkKLQkgICAgIlxuQHRhYmxlIEBjb2RlXG5AaXRlbSBcXDEoXFwyKVxuQGZpbmRleCBcXDFcbiIpCi0gICAgICJAZW5kIHRhYmxlXG4iKQotICAgICgibWV0aG9kZGVzY25pIiAyICJcbkB0YWJsZSBAY29kZVxuQGl0ZW0gXFwxKFxcMilcbiIgIkBlbmQgdGFibGVcbiIpCi0gICAgKCJub3RpY2UiIDAgIkBlbXBoe05vdGljZTp9ICIgIiIpCi0gICAgKCJvcGNvZGVkZXNjIiAyCi0gICAgIChwcm9nbiAoc2V0cSBmaW5kZXggdCkKLQkgICAgIlxuQHRhYmxlIEBjb2RlXG5AaXRlbSBcXDEgXFwyXG5AZmluZGV4IFxcMVxuIikKLSAgICAgIkBlbmQgdGFibGVcbiIpCi0gICAgKCJwcm9kdWN0aW9ubGlzdCIgMCAiXG5AdGFibGUgQGNvZGVcbiIgIkBlbmQgdGFibGVcbiIpCi0gICAgKCJxdW90YXRpb24iIDAgIkBxdW90YXRpb24iICJAZW5kIHF1b3RhdGlvbiIpCi0gICAgKCJxdW90ZSIgMCAiQHF1b3RhdGlvbiIgIkBlbmQgcXVvdGF0aW9uIikKLSAgICAoInNlZWFsc28iIDAgIlNlZSBhbHNvOlxuQHRhYmxlIEBlbXBoXG4iICJAZW5kIHRhYmxlXG4iKQotICAgICgic2VlYWxzbyoiIDAgIkB0YWJsZSBAZW1waFxuIiAiQGVuZCB0YWJsZVxuIikKLSAgICAoInNsb3BweXBhciIgMCAiIiAiIikKLSAgICAoInNtYWxsIiAwICIiICIiKQotICAgICgidGFibGVpaSIgNCAoY29uY2F0ICJAbXVsdGl0YWJsZSBAY29sdW1uZnJhY3Rpb25zIC41IC41XG4iCi0JCQkgIkBpdGVtIFxcMyBAdGFiIFxcNFxuIgotCQkJICJAaXRlbSAtLS0tLS0tIEB0YWIgLS0tLS0tIFxuIikKLSAgICAgIkBlbmQgbXVsdGl0YWJsZVxuIikKLSAgICAoInRhYmxlaWlpIiA1IChjb25jYXQgIkBtdWx0aXRhYmxlIEBjb2x1bW5mcmFjdGlvbnMgLjMzIC4zMyAuMzNcbiIKLQkJCSAiQGl0ZW0gXFwzIEB0YWIgXFw0IEB0YWIgXFw1XG4iCi0JCQkgIkBpdGVtIC0tLS0tLS0gQHRhYiAtLS0tLS0gQHRhYiAtLS0tLS1cbiIpCi0gICAgICJAZW5kIG11bHRpdGFibGVcbiIpCi0gICAgKCJ0YWJsZWl2IiA2IChjb25jYXQKLQkJICAiQG11bHRpdGFibGUgQGNvbHVtbmZyYWN0aW9ucyAuMjUgLjI1IC4yNSAuMjVcbiIKLQkJICAiQGl0ZW0gXFwzIEB0YWIgXFw0IEB0YWIgXFw1IEB0YWIgXFw2XG4iCi0JCSAgIkBpdGVtIC0tLS0tLS0gQHRhYiAtLS0tLS0tIEB0YWIgLS0tLS0tLSBAdGFiIC0tLS0tLS1cbiIpCi0gICAgICJAZW5kIG11bHRpdGFibGVcbiIpCi0gICAgKCJ0YWJsZXYiIDcgKGNvbmNhdAotCQkgIkBtdWx0aXRhYmxlIEBjb2x1bW5mcmFjdGlvbnMgLjIwIC4yMCAuMjAgLjIwIC4yMFxuIgotCQkgIkBpdGVtIFxcMyBAdGFiIFxcNCBAdGFiIFxcNSBAdGFiIFxcNiBAdGFiIFxcN1xuIgotCQkgIkBpdGVtIC0tLS0tLS0gQHRhYiAtLS0tLS0tIEB0YWIgLS0tLS0tLSBAdGFiIC0tLS0tLS0gQHRhYiAtLS0tLS0tXG4iKQotICAgICAiQGVuZCBtdWx0aXRhYmxlXG4iKQotICAgICgiYWxsdHQiIDAgIkBleGFtcGxlIiAiQGVuZCBleGFtcGxlIikKLSAgICApCi0gICJBc3NvY2lhdGl2ZSBsaXN0IGRlZmluaW5nIHN1YnN0aXR1dGlvbnMgZm9yIGVudmlyb25tZW50cy4KLUVhY2ggbGlzdCBpdGVtIGlzIG9mIHRoZSBmb3JtIChFTlZJUk9OTUVOVCBBUkdOVU0gQkVHSU4gRU5EKSB3aGVyZToKLS0gRU5WSVJPTk1FTlQgaXMgTGFUZVggZW52aXJvbm1lbnQgbmFtZQotLSBBUkdOVU0gaXMgbnVtYmVyIG9mIChyZXF1aXJlZCkgbWFjcm8gYXJndW1lbnRzCi0tIEJFR0lOIGlzIHN1YnN0aXR1dGlvbiBmb3IgXGJlZ2lue0VOVklST05NRU5UfQotLSBFTkQgaXMgc3Vic3RpdHV0aW9uIGZvciBcZW5ke0VOVklST05NRU5UfQotQm90aCBCRUdJTiBhbmQgRU5EIGFyZSBldmFsZWQuICBNb3Jlb3ZlciwgeW91IGNhbiByZWZlcmVuY2UgYXJndW1lbnRzIHRocm91Z2gKLVxOIHJlZ3VsYXIgZXhwcmVzc2lvbiBub3RhdGlvbiBpbiBzdHJpbmdzIG9mIEJFR0lOLiIpCi0KLShkZWZjb25zdCBweTJ0ZXhpLWNvbW1hbmRzCi0gICcoKCJBQSIgMCAiQEFBe30iKQotICAgICgiYWEiIDAgIkBhYXt9IikKLSAgICAoIkFCQyIgMCAiQUJDIikKLSAgICAoImFwcGVuZGl4IiAwIChwcm9nbiAoc2V0cSBhcHBlbmRpeCB0KSAiIikpCi0gICAgKCJBU0NJSSIgMCAiQVNDSUkiKQotICAgICgiYXV0aG9yIiAxIChwcm9nbiAoc2V0cSBhdXRob3IgKG1hdGNoLXN0cmluZyAxIHN0cmluZykpICIiKSkKLSAgICAoImF1dGhvcmFkZHJlc3MiIDEKLSAgICAgKHByb2duIChzZXRxIGF1dGhvci1hZGRyZXNzIChtYXRjaC1zdHJpbmcgMSBzdHJpbmcpKSAiIikpCi0gICAgKCJiIiAxICJAd3tcXDF9IikKLSAgICAoImJhY2tzbGFzaCIgMCAiQGJhY2tzbGFzaHt9IikKLSAgICAoImJmIiAwICJAZGVzdHJveSIpCi0gICAgKCJiaWZ1bmNpbmRleCIgMSAocHJvZ24gKHNldHEgZmluZGV4IHQpICJAZmluZGV4e1xcMX0BIikpCi0gICAgKCJDIiAwICJDIikKLSAgICAoImMiIDAgIkAsIikKLSAgICAoImNhdGNvZGUiIDAgIiIpCi0gICAgKCJjZGF0YSIgMSAiQGNvZGV7XFwxfSIpCi0gICAgKCJjZW50ZXJsaW5lIiAxICJAY2VudGVyIFxcMSIpCi0gICAgKCJjZnVuY2xpbmUiIDMgIkBpdGVteCBcXDEgXFwyKFxcMylcbkBmaW5kZXggXFwyIikKLSAgICAoImNmdW5jdGlvbiIgMSAiQGNvZGV7XFwxfSIpCi0gICAgKCJjaGFwdGVyIiAxIChmb3JtYXQgIkBub2RlIFxcMVxuQCVzIFxcMVxuIgotCQkJIChpZiBhcHBlbmRpeCAiYXBwZW5kaXgiICJjaGFwdGVyIikpKQotICAgICgiY2hhcHRlcioiIDEgIkBub2RlIFxcMVxuQHVubnVtYmVyZWQgXFwxXG4iKQotICAgICgiY2hhcmFjdGVyIiAxICJAc2FtcHtcXDF9IikKLSAgICAoImNpdGV0aXRsZSIgMSAiQHJlZntUb3AsLCxcXDF9IikKLSAgICAoImNsYXNzIiAxICJAY29kZXtcXDF9IikKLSAgICAoImNtZW1iZXJsaW5lIiAzICJAaXRlbXggXFwyIFxcM1xuIikKLSAgICAoImNvZGUiIDEgIkBjb2Rle1xcMX0iKQotICAgICgiY29tbWFuZCIgMSAiQGNvbW1hbmR7XFwxfSIpCi0gICAgKCJjb25zdGFudCIgMSAiQGNvZGV7XFwxfSIpCi0gICAgKCJjb3B5cmlnaHQiIDEgIkBjb3B5cmlnaHR7fSIpCi0gICAgKCJDcHAiIDAgIkMrKyIpCi0gICAgKCJjc2ltcGxlbWFjcm8iIDEgIkBjb2Rle1xcMX0iKQotICAgICgiY3R5cGUiIDEgIkBjb2Rle1xcMX0iKQotICAgICgiZGF0YWxpbmUiIDEgKHByb2duIChzZXRxIGZpbmRleCB0KSAiQGl0ZW0gXFwxXG5AZmluZGV4IFxcMVxuIikpCi0gICAgKCJkYXRlIiAxICJcXDEiKQotICAgICgiZGVjbGFyZW1vZHVsZSIgMiAocHJvZ24gKHNldHEgY2luZGV4IHQpICJAbGFiZWx7XFwyfUBjaW5kZXh7XFwyfQEiKSkKLSAgICAoImRlcHJlY2F0ZWQiIDIgIkBlbXBoe1RoaXMgaXMgZGVwcmVjYXRlZCBpbiBQeXRob24gXFwxLiAgXFwyfVxuXG4iKQotICAgICgiZGZuIiAxICJAZGZue1xcMX0iKQotICAgICgiZG9jdW1lbnRjbGFzcyIgMSBweTJ0ZXhpLW1hZ2ljKQotICAgICgiZSIgMCAiQGJhY2tzbGFzaHt9IikKLSAgICAoImVsc2UiIDAgKGNvbmNhdCAiQGVuZCBpZmluZm9cbkAiIChzZXRxIGxhc3QtaWYgImlmdGV4IikpKQotICAgICgiZW52IiAxICJAY29kZXtcXDF9IikKLSAgICAoIkVPRiIgMCAiQGNvZGV7RU9GfSIpCi0gICAgKCJlbWFpbCIgMSAiQGVtYWlse1xcMX0iKQotICAgICgiZW0iIDEgIkBlbXBoe1xcMX0iKQotICAgICgiZW1waCIgMSAiQGVtcGh7XFwxfSIpCi0gICAgKCJlbnZ2YXIiIDEgIkBlbnZ7XFwxfSIpCi0gICAgKCJleGNlcHRpb24iIDEgIkBjb2Rle1xcMX0iKQotICAgICgiZXhpbmRleCIgMSAocHJvZ24gKHNldHEgb2JpbmRleCB0KSAiQG9iaW5kZXh7XFwxfQEiKSkKLSAgICAoImZpIiAwIChpZiAoZXF1YWwgbGFzdC1pZiAiaWZ4IikgIiIgKGNvbmNhdCAiQGVuZCAiIGxhc3QtaWYpKSkKLSAgICAoImZpbGUiIDEgIkBmaWxle1xcMX0iKQotICAgICgiZmlsZW5xIiAxICJAZmlsZXtcXDF9IikKLSAgICAoImZpbGV2YXIiIDEgIkBmaWxle0B2YXJ7XFwxfX0iKQotICAgICgiZm9vdG5vdGUiIDEgIkBmb290bm90ZXtcXDF9IikKLSAgICAoImZyYWMiIDAgIiIpCi0gICAgKCJmdW5jbGluZSIgMiAocHJvZ24gKHNldHEgZmluZGV4IHQpICJAaXRlbSBcXDEgXFwyXG5AZmluZGV4IFxcMQEiKSkKLSAgICAoImZ1bmNsaW5lbmkiIDIgIkBpdGVtIFxcMSBcXDIiKQotICAgICgiZnVuY3Rpb24iIDEgIkBjb2Rle1xcMX0iKQotICAgICgiZ3JhbW1hcnRva2VuIiAxICJAY29kZXtcXDF9IikKLSAgICAoImd1aWxhYmVsIiAxICJAc3Ryb25ne1xcMX0iKQotICAgICgiaGxpbmUiIDAgIiIpCi0gICAgKCJpZngiIDAgKHByb2duIChzZXRxIGxhc3QtaWYgImlmeCIpICIiKSkKLSAgICAoImlmaHRtbCIgMCAoY29uY2F0ICJAIiAoc2V0cSBsYXN0LWlmICJpZmluZm8iKSkpCi0gICAgKCJpZnRleGkiIDAgKGNvbmNhdCAiQCIgKHNldHEgbGFzdC1pZiAiaWZpbmZvIikpKQotICAgICgiaW5kZXgiIDEgKHByb2duIChzZXRxIGNpbmRleCB0KSAiQGNpbmRleHtcXDF9ASIpKQotICAgICgiaW5kZXhpaSIgMiAocHJvZ24gKHNldHEgY2luZGV4IHQpICJAY2luZGV4e1xcMSBcXDJ9ASIpKQotICAgICgiaW5kZXhpaWkiIDMgKHByb2duIChzZXRxIGNpbmRleCB0KSAiQGNpbmRleHtcXDEgXFwyIFxcM30BIikpCi0gICAgKCJpbmRleGl2IiAzIChwcm9nbiAoc2V0cSBjaW5kZXggdCkgIkBjaW5kZXh7XFwxIFxcMiBcXDMgXFw0fQEiKSkKLSAgICAoImluZmluaXR5IiAwICJAZW1waHtpbmZpbml0eX0iKQotICAgICgiaXQiIDAgIkBkZXN0cm95IikKLSAgICAoImtiZCIgMSAiQGtleXtcXDF9IikKLSAgICAoImtleXdvcmQiIDEgIkBjb2Rle1xcMX0iKQotICAgICgia3dpbmRleCIgMSAocHJvZ24gKHNldHEgY2luZGV4IHQpICJAY2luZGV4e1xcMX0BIikpCi0gICAgKCJsYWJlbCIgMSAiQGxhYmVse1xcMX0iKQotICAgICgiTGFyZ2UiIDAgIiIpCi0gICAgKCJMYVRlWCIgMCAiTGFAVGVYe30iKQotICAgICgibGFyZ2UiIDAgIiIpCi0gICAgKCJsZG90cyIgMCAiQGRvdHN7fSIpCi0gICAgKCJsZWZ0bGluZSIgMSAiXFwxIikKLSAgICAoImxlcSIgMCAiPD0iKQotICAgICgibGluZWlpIiAyICJAaXRlbSBcXDEgQHRhYiBcXDIiKQotICAgICgibGluZWlpaSIgMyAiQGl0ZW0gXFwxIEB0YWIgXFwyIEB0YWIgXFwzIikKLSAgICAoImxpbmVpdiIgNCAiQGl0ZW0gXFwxIEB0YWIgXFwyIEB0YWIgXFwzIEB0YWIgXFw0IikKLSAgICAoImxpbmV2IiA1ICJAaXRlbSBcXDEgQHRhYiBcXDIgQHRhYiBcXDMgQHRhYiBcXDQgQHRhYiBcXDUiKQotICAgICgibG9jYWxsaW5ld2lkdGgiIDAgIiIpCi0gICAgKCJsb2NhbG1vZHVsZXRhYmxlIiAwICIiKQotICAgICgibG9uZ3Byb2dyYW1vcHQiIDEgIkBvcHRpb257LS1cXDF9IikKLSAgICAoIm1hY3JvIiAxICJAY29kZXtAYmFja3NsYXNoe31cXDF9IikKLSAgICAoIm1haWxoZWFkZXIiIDEgIkBjb2Rle1xcMX0iKQotICAgICgibWFrZWluZGV4IiAwICIiKQotICAgICgibWFrZW1vZGluZGV4IiAwICIiKQotICAgICgibWFrZXRpdGxlIiAwIChjb25jYXQgIkB0b3AgIiB0aXRsZSAiXG4iKSkKLSAgICAoIm1ha2V2YXIiIDEgIkBjb2Rle1xcMX0iKQotICAgICgibWFucGFnZSIgMiAiQHNhbXB7XFwxKFxcMil9IikKLSAgICAoIm1ib3giIDEgIkB3e1xcMX0iKQotICAgICgibWVtYmVyIiAxICJAY29kZXtcXDF9IikKLSAgICAoIm1lbWJlcmxpbmUiIDEgIkBpdGVtIFxcMVxuQGZpbmRleCBcXDFcbiIpCi0gICAgKCJtZW51c2VsZWN0aW9uIiAxICJAc2FtcHtcXDF9IikKLSAgICAoIm1ldGhvZCIgMSAiQGNvZGV7XFwxfSIpCi0gICAgKCJtZXRob2RsaW5lIiAyIChwcm9nbiAoc2V0cSBtb2luZGV4IHQpICJAaXRlbSBcXDEoXFwyKVxuQG1vaW5kZXggXFwxXG4iKSkKLSAgICAoIm1ldGhvZGxpbmVuaSIgMiAiQGl0ZW0gXFwxKFxcMilcbiIpCi0gICAgKCJtaW1ldHlwZSIgMSAiQHNhbXB7XFwxfSIpCi0gICAgKCJtb2R1bGUiIDEgIkBzYW1we1xcMX0iKQotICAgICgibW9kdWxlYXV0aG9yIiAyICIiKQotICAgICgibW9kdWxlc3lub3BzaXMiIDEgIlxcMSIpCi0gICAgKCJtb3JlYXJncyIgMCAiQGRvdHN7fSIpCi0gICAgKCJuIiAwICJAYmFja3NsYXNoe31uIikKLSAgICAoIm5ld2NvbW1hbmQiIDIgIiIpCi0gICAgKCJuZXdsZW5ndGgiIDEgIiIpCi0gICAgKCJuZXdzZ3JvdXAiIDEgIkBzYW1we1xcMX0iKQotICAgICgibm9kZW5hbWUiIDEKLSAgICAgKHNhdmUtZXhjdXJzaW9uCi0gICAgICAgKHNhdmUtbWF0Y2gtZGF0YQotCSAocmUtc2VhcmNoLWJhY2t3YXJkICJeQG5vZGUgIikpCi0gICAgICAgKGRlbGV0ZS1yZWdpb24gKHBvaW50KSAoc2F2ZS1leGN1cnNpb24gKGVuZC1vZi1saW5lKSAocG9pbnQpKSkKLSAgICAgICAoaW5zZXJ0ICJAbm9kZSAiIChtYXRjaC1zdHJpbmcgMSBzdHJpbmcpKQotICAgICAgICIiKSkKLSAgICAoIm5vaW5kZW50IiAwICJAbm9pbmRlbnQgIikKLSAgICAoIm5vdGUiIDEgIkBlbXBoe05vdGU6fSBcXDEiKQotICAgICgiTlVMTCIgMCAiQGNvZGV7TlVMTH0iKQotICAgICgib2JpbmRleCIgMSAocHJvZ24gKHNldHEgb2JpbmRleCB0KSAiQG9iaW5kZXh7XFwxfQEiKSkKLSAgICAoIm9waW5kZXgiIDEgKHByb2duIChzZXRxIGNpbmRleCB0KSAiQGNpbmRleHtcXDF9ASIpKQotICAgICgib3B0aW9uIiAxICJAb3B0aW9ue1xcMX0iKQotICAgICgib3B0aW9uYWwiIDEgIltcXDFdIikKLSAgICAoInBhcmFncmFwaCIgMSAiQHN1YnN1YmhlYWRpbmcgXFwxIikKLSAgICAoInBlcCIgMSAocHJvZ24gKHNldHEgY2luZGV4IHQpICJQRVBAIFxcMUBjaW5kZXggUEVQIFxcMVxuIikpCi0gICAgKCJwaSIgMCAicGkiKQotICAgICgicGxhdGZvcm0iIDEgIiIpCi0gICAgKCJwbHVzbWludXMiIDAgIistIikKLSAgICAoIlBPU0lYIiAwICJQT1NJWCIpCi0gICAgKCJwcm9kdWN0aW9uIiAyICJAaXRlbSBcXDEgXFwyIikKLSAgICAoInByb2R1Y3Rpb25jb250IiAxICJAaXRlbSBAd3t9IFxcMSIpCi0gICAgKCJwcm9ncmFtIiAxICJAY29tbWFuZHtcXDF9IikKLSAgICAoInByb2dyYW1vcHQiIDEgIkBvcHRpb257XFwxfSIpCi0gICAgKCJwcm90ZWN0IiAwICIiKQotICAgICgicHl0eXBlIiAxICJAY29kZXtcXDF9IikKLSAgICAoInJlZiIgMSAiQHJlZntcXDF9IikKLSAgICAoInJlZmJpbW9kaW5kZXgiIDEgKHByb2duIChzZXRxIG1vaW5kZXggdCkgIkBtb2luZGV4e1xcMX0BIikpCi0gICAgKCJyZWZtb2RpbmRleCIgMSAocHJvZ24gKHNldHEgbW9pbmRleCB0KSAiQG1vaW5kZXh7XFwxfQEiKSkKLSAgICAoInJlZm1vZHVsZSIgMSAiQHNhbXB7XFwxfSIpCi0gICAgKCJyZWZzdG1vZGluZGV4IiAxIChwcm9nbiAoc2V0cSBtb2luZGV4IHQpICJAbW9pbmRleHtcXDF9ASIpKQotICAgICgicmVnZXhwIiAxICJcIlxcMVwiIikKLSAgICAoInJlbGVhc2UiIDEKLSAgICAgKHByb2duIChzZXRxIHB5MnRleGktcHl0aG9uLXZlcnNpb24gKG1hdGNoLXN0cmluZyAxIHN0cmluZykpICIiKSkKLSAgICAoInJlbmV3Y29tbWFuZCIgMiAiIikKLSAgICAoInJmYyIgMSAocHJvZ24gKHNldHEgY2luZGV4IHQpICJSRkNAIFxcMUBjaW5kZXggUkZDIFxcMVxuIikpCi0gICAgKCJybSIgMCAiQGRlc3Ryb3kiKQotICAgICgic2FtcCIgMSAiQHNhbXB7XFwxfSIpCi0gICAgKCJzZWN0aW9uIiAxIChsZXQgKChzdHIgKG1hdGNoLXN0cmluZyAxIHN0cmluZykpKQotCQkgICAoc2F2ZS1tYXRjaC1kYXRhCi0JCSAgICAgKGlmIChzdHJpbmctbWF0Y2ggIlxcKC4qXFwpWyBcdFxuXSotLS1bIFx0XG5dKlxcKC4qXFwpIgotCQkJCSAgICAgICBzdHIpCi0JCQkgKGZvcm1hdAotCQkJICAiQG5vZGUgJXNcbkBzZWN0aW9uICVzXG4iCi0JCQkgIChweTJ0ZXhpLWJhY2tzbGFzaC1xdW90ZSAobWF0Y2gtc3RyaW5nIDEgc3RyKSkKLQkJCSAgKHB5MnRleGktYmFja3NsYXNoLXF1b3RlIChtYXRjaC1zdHJpbmcgMiBzdHIpKSkKLQkJICAgICAgICJAbm9kZSBcXDFcbkBzZWN0aW9uIFxcMVxuIikpKSkKLSAgICAoInNlY3Rpb25hdXRob3IiIDIgIiIpCi0gICAgKCJzZWVsaW5rIiAzICJcbkB0YWJsZSBAdXJsXG5AaXRlbSBAc3Ryb25ne1xcMX1cbihcXDIpXG5cXDNcbkBlbmQgdGFibGVcbiIpCi0gICAgKCJzZWVtb2R1bGUiIDIgIkByZWZ7XFwxfSBcXDIiKQotICAgICgic2VlcGVwIiAzICJcbkB0YWJsZSBAc3Ryb25nXG5AaXRlbSBQRVBcXDEgXFwyXG5cXDNcbkBlbmQgdGFibGVcbiIpCi0gICAgKCJzZWVyZmMiIDMgIlxuQHRhYmxlIEBzdHJvbmdcbkBpdGVtIFJGQ1xcMSBcXDJcblxcM1xuQGVuZCB0YWJsZVxuIikKLSAgICAoInNlZXRleHQiIDEgIlxcMSIpCi0gICAgKCJzZWV0aXRsZSIgMSAiQGNpdGV7XFwxfSIpCi0gICAgKCJzZWV1cmwiIDIgIlxuQHRhYmxlIEB1cmxcbkBpdGVtIFxcMVxuXFwyXG5AZW5kIHRhYmxlXG4iKQotICAgICgic2V0aW5kZXhzdWJpdGVtIiAxIChwcm9nbiAoc2V0cSBjaW5kZXggdCkgIkBjaW5kZXggXFwxASIpKQotICAgICgic2V0bGVuZ3RoIiAyICIiKQotICAgICgic2V0cmVsZWFzZWluZm8iIDEgKHByb2duIChzZXRxIHB5MnRleGktcmVsZWFzZWluZm8gIiIpKSkKLSAgICAoInNldHNob3J0dmVyc2lvbiIgMQotICAgICAocHJvZ24gKHNldHEgcHkydGV4aS1weXRob24tc2hvcnQtdmVyc2lvbiAobWF0Y2gtc3RyaW5nIDEgc3RyaW5nKSkgIiIpKQotICAgICgic2hvcnR2ZXJzaW9uIiAwIHB5MnRleGktcHl0aG9uLXNob3J0LXZlcnNpb24pCi0gICAgKCJzcXJ0IiAwICIiKQotICAgICgic3RpbmRleCIgMSAocHJvZ24gKHNldHEgY2luZGV4IHQpICJAY2luZGV4e1xcMX0BIikpCi0gICAgKCJzdG1vZGluZGV4IiAxIChwcm9nbiAoc2V0cSBtb2luZGV4IHQpICJAbW9pbmRleHtcXDF9ASIpKQotICAgICgic3Ryb25nIiAxICJAc3Ryb25ne1xcMX0iKQotICAgICgic3ViIiAwICIvIikKLSAgICAoInN1YnNlY3Rpb24iIDEgIkBub2RlIFxcMVxuQHN1YnNlY3Rpb24gXFwxXG4iKQotICAgICgic3Vic3Vic2VjdGlvbiIgMSAiQG5vZGUgXFwxXG5Ac3Vic3Vic2VjdGlvbiBcXDFcbiIpCi0gICAgKCJzdW0iIDAgIiIpCi0gICAgKCJ0YWJsZW9mY29udGVudHMiIDAgIiIpCi0gICAgKCJ0ZXJtIiAxICJAaXRlbSBcXDEiKQotICAgICgiVGVYIiAwICJAVGVYe30iKQotICAgICgidGV4dGFzY2lpdGlsZGUiIDAgIn4iKQotICAgICgidGV4dGFzY2lpY2lyY3VtIiAwICJeIikKLSAgICAoInRleHRiYWNrc2xhc2giIDAgIkBiYWNrc2xhc2h7fSIpCi0gICAgKCJ0ZXh0YmFyIiAwICJ8IikKLSAgICAoInRleHRiZiIgMSAiQHN0cm9uZ3tcXDF9IikKLSAgICAoInRleHRldXJvIiAwICJAZXVyb3t9IikKLSAgICA7IFVuZm9ydHVuYXRlbHksIHRoaXMgYWx0ZXJuYXRlIHNwZWxsaW5nIGRvZXNuJ3QgYWN0dWFsbHkgYXBwbHkgdG8KLSAgICA7IHRoZSB1c2FnZSBmb3VuZCBpbiBQeXRob24gVHV0b3JpYWwsIHdoaWNoIGFjdHVhbGx5IHJlcXVpcmVzIGEKLSAgICA7IEV1cm8gc3ltYm9sIHRvIG1ha2Ugc2Vuc2UsIHNvIHRoaXMgaXMgY29tbWVudGVkIG91dCBhcyB3ZWxsLgotICAgIDsgKCJ0ZXh0ZXVybyIgMCAiRXVybyAiKQotICAgICgidGV4dGdyZWF0ZXIiIDAgIj4iKQotICAgICgidGV4dGl0IiAxICJAaXtcXDF9IikKLSAgICAoInRleHRsZXNzIiAwICI8IikKLSAgICAoInRleHRybSIgMSAiXFwxIikKLSAgICAoInRleHR0dCIgMSAiQGNvZGV7XFwxfSIpCi0gICAgKCJ0ZXh0dW5kZXJzY29yZSIgMCAiXyIpCi0gICAgKCJ0aWxkZSIgMCAifiIpCi0gICAgKCJ0aXRsZSIgMSAocHJvZ24gKHNldHEgdGl0bGUgKG1hdGNoLXN0cmluZyAxIHN0cmluZykpICJAc2V0dGl0bGUgXFwxIikpCi0gICAgKCJ0b2RheSIgMCAiQHRvZGF5e30iKQotICAgICgidG9rZW4iIDEgIkBjb2Rle1xcMX0iKQotICAgICgidHQiIDAgIkBkZXN0cm95IikKLSAgICAoInR0aW5kZXgiIDEgKHByb2duIChzZXRxIGNpbmRleCB0KSAiQGNpbmRleHtcXDF9ASIpKQotICAgICgidSIgMCAiQGJhY2tzbGFzaHt9dSIpCi0gICAgKCJ1bGluayIgMiAiXFwxIikKLSAgICAoIlVOSVgiIDAgIlVOSVgiKQotICAgICgidW5kZWZpbmVkIiAwICIiKQotICAgICgidW5zcGVjaWZpZWQiIDAgIkBkb3Rze30iKQotICAgICgidXJsIiAxICJAdXJse1xcMX0iKQotICAgICgidXNlcGFja2FnZSIgMSAiIikKLSAgICAoInZhciIgMSAiQHZhcntcXDF9IikKLSAgICAoInZlcmJhdGltaW5wdXQiIDEgIkBjb2Rle1xcMX0iKQotICAgICgidmVyc2lvbiIgMCBweTJ0ZXhpLXB5dGhvbi12ZXJzaW9uKQotICAgICgidmVyc2lvbmFkZGVkIiAxICJAZW1waHtBZGRlZCBpbiBQeXRob24gdmVyc2lvbiBcXDF9IikKLSAgICAoInZlcnNpb25jaGFuZ2VkIiAxICJAZW1waHtDaGFuZ2VkIGluIFB5dGhvbiB2ZXJzaW9uIFxcMX0iKQotICAgICgidnNraXAiIDEgIiIpCi0gICAgKCJ2c3BhY2UiIDEgIiIpCi0gICAgKCJ3YXJuaW5nIiAxICJAZW1waHtcXDF9IikKLSAgICAoIndpdGhzdWJpdGVtIiAyICJcXDIiKQotICAgICgiWFhYIiAxICJAc3Ryb25ne1xcMX0iKSkKLSAgIkFzc29jaWF0aXZlIGxpc3Qgb2YgY29tbWFuZCBzdWJzdGl0dXRpb25zLgotRWFjaCBsaXN0IGl0ZW0gaXMgb2YgdGhlIGZvcm0gKENPTU1BTkQgQVJHTlVNIFNVQlNUSVRVVElPTikgd2hlcmU6Ci0tIENPTU1BTkQgaXMgTGFUZVggY29tbWFuZCBuYW1lCi0tIEFSR05VTSBpcyBudW1iZXIgb2YgKHJlcXVpcmVkKSBjb21tYW5kIGFyZ3VtZW50cwotLSBTVUJTVElUVVRJT04gc3Vic3RpdHV0aW9uIGZvciB0aGUgY29tbWFuZC4gIEl0IGlzIGV2YWxlZCBhbmQgeW91IGNhbgotICByZWZlcmVuY2UgY29tbWFuZCBhcmd1bWVudHMgdGhyb3VnaCB0aGUgXFxOIHJlZ2V4cCBub3RhdGlvbiBpbiBzdHJpbmdzLiIpCi0KLShkZWZ2YXIgcHkydGV4aS1tYWdpYyAiQGRvY3VtZW50Y2xhc3NcbiIKLSAgIlwiTWFnaWNcIiBzdHJpbmcgZm9yIGF1eGlsaWFyeSBpbnNlcnRpb24gYXQgdGhlIGJlZ2lubmluZyBvZiBkb2N1bWVudC4iKQotCi0oZGVmdmFyIHB5MnRleGktZGlycyAnKCIuLyIgIi4uL3RleGlucHV0cy8iKQotICAiV2hlcmUgdG8gc2VhcmNoIExhVGVYIGlucHV0IGZpbGVzLiIpCi0KLShkZWZ2YXIgcHkydGV4aS1idWZmZXIgIipweTJ0ZXhpKiIKLSAgIlRoZSBuYW1lIG9mIGEgYnVmZmVyIHdoZXJlIFRleGluZm8gaXMgZ2VuZXJhdGVkLiIpCi0KLShkZWZjb25zdCBweTJ0ZXhpLXhlbWFjcyAoc3RyaW5nLW1hdGNoICJeWEVtYWNzIiAoZW1hY3MtdmVyc2lvbikpCi0gICJSdW5uaW5nIHVuZGVyIFhFbWFjcz8iKQotCi0KLShkZWZtYWNybyBweTJ0ZXhpLXNlYXJjaCAocmVnZXhwICZyZXN0IGJvZHkpCi0gIGAocHJvZ24KLSAgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKLSAgICAgKHdoaWxlIChyZS1zZWFyY2gtZm9yd2FyZCAscmVnZXhwIG5pbCB0KQotICAgICAgICxAYm9keSkpKQotCi0oZGVmbWFjcm8gcHkydGV4aS1zZWFyY2gtc2FmZSAocmVnZXhwICZyZXN0IGJvZHkpCi0gIGAocHkydGV4aS1zZWFyY2ggLHJlZ2V4cAotICAgICh1bmxlc3MgKHB5MnRleGktcHJvdGVjdGVkKQotICAgICAgLEBib2R5KSkpCi0KLQotKGRlZnVuIHB5MnRleGktbWVzc2FnZSAobWVzc2FnZSkKLSAgIlJlcG9ydCBtZXNzYWdlIGFuZCBzdG9wIGlmIGBweTJ0ZXhpLXN0b3Atb24tcHJvYmxlbXMnIGlzIG5vbi1uaWwuIgotICAoaWYgcHkydGV4aS1zdG9wLW9uLXByb2JsZW1zCi0gICAgICAoZXJyb3IgbWVzc2FnZSkKLSAgICAobWVzc2FnZSBtZXNzYWdlKSkpCi0KLQotKGRlZnVuIHB5MnRleGktYmFja3NsYXNoLXF1b3RlIChzdHJpbmcpCi0gICJEb3VibGUgYmFja3NsYWhlcyBpbiBTVFJJTkcuIgotICAobGV0ICgoaSAwKSkKLSAgICAoc2F2ZS1tYXRjaC1kYXRhCi0gICAgICAod2hpbGUgKHNldHEgaSAoc3RyaW5nLW1hdGNoICJcXFxcIiBzdHJpbmcgaSkpCi0JKHNldHEgc3RyaW5nIChyZXBsYWNlLW1hdGNoICJcXFxcXFxcXCIgdCBuaWwgc3RyaW5nKSkKLQkoc2V0cSBpICgrIGkgMikpKSkKLSAgICBzdHJpbmcpKQotCi0KLShkZWZ1biBweTJ0ZXhpIChmaWxlKQotICAiQ29udmVydCBQeXRob24gTGFUZVggZG9jdW1lbnRhdGlvbiBGSUxFIHRvIFRleGluZm8uIgotICAoaW50ZXJhY3RpdmUgImZGaWxlIHRvIGNvbnZlcnQ6ICIpCi0gIChzd2l0Y2gtdG8tYnVmZmVyIChnZXQtYnVmZmVyLWNyZWF0ZSBweTJ0ZXhpLWJ1ZmZlcikpCi0gIChlcmFzZS1idWZmZXIpCi0gIChpbnNlcnQtZmlsZSBmaWxlKQotICAobGV0ICgoY2FzZS1mb2xkLXNlYXJjaCBuaWwpCi0JKHRpdGxlICIiKQotCShhdXRob3IgIiIpCi0JKGF1dGhvci1hZGRyZXNzICIiKQotCShhcHBlbmRpeCBuaWwpCi0JKGZpbmRleCBuaWwpCi0JKG9iaW5kZXggbmlsKQotCShjaW5kZXggbmlsKQotCShtb2luZGV4IG5pbCkKLQlsYXN0LWlmKQotICAgIChweTJ0ZXhpLXByb2Nlc3MtdmVyYmF0aW1zKQotICAgIChweTJ0ZXhpLXByb2Nlc3MtY29tbWVudHMpCi0gICAgKHB5MnRleGktcHJvY2Vzcy1pbmNsdWRlcykKLSAgICAocHkydGV4aS1wcm9jZXNzLWZ1bm55YXMpCi0gICAgKHB5MnRleGktcHJvY2Vzcy1lbnZpcm9ubWVudHMpCi0gICAgKHB5MnRleGktcHJvY2Vzcy1jb21tYW5kcykKLSAgICAocHkydGV4aS1maXgtaW5kZW50YXRpb24pCi0gICAgKHB5MnRleGktZml4LW5vZGVzKQotICAgIChweTJ0ZXhpLWZpeC1yZWZlcmVuY2VzKQotICAgIChweTJ0ZXhpLWZpeC1pbmRpY2VzKQotICAgIChweTJ0ZXhpLXByb2Nlc3Mtc2ltcGxlLWNvbW1hbmRzKQotICAgIChweTJ0ZXhpLWZpeC1mb250cykKLSAgICAocHkydGV4aS1maXgtYnJhY2VzKQotICAgIChweTJ0ZXhpLWZpeC1iYWNrc2xhc2hlcykKLSAgICAocHkydGV4aS1kZXN0cm95LWVtcHRpZXMpCi0gICAgKHB5MnRleGktZml4LW5ld2xpbmVzKQotICAgIChweTJ0ZXhpLWFkanVzdC1sZXZlbCkpCi0gIChsZXQqICgodGV4aS1maWxlLW5hbWUgKG9yIHB5MnRleGktdGV4aS1maWxlLW5hbWUKLQkJCSAgICAgKHB5MnRleGktdGV4aS1maWxlLW5hbWUgZmlsZSkpKQotCSAoaW5mby1maWxlLW5hbWUgKG9yIHB5MnRleGktaW5mby1maWxlLW5hbWUKLQkJCSAgICAgKHB5MnRleGktaW5mby1maWxlLW5hbWUgdGV4aS1maWxlLW5hbWUpKSkpCi0gICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKLSAgICAod2hlbiAobG9va2luZy1hdCBweTJ0ZXhpLW1hZ2ljKQotICAgICAgKGRlbGV0ZS1yZWdpb24gKHBvaW50KSAocHJvZ24gKGJlZ2lubmluZy1vZi1saW5lIDIpIChwb2ludCkpKQotICAgICAgKGluc2VydCAiXFxpbnB1dCB0ZXhpbmZvIEBjIC0qLXRleGluZm8tKi1cbiIpCi0gICAgICAoaW5zZXJ0ICJAc2V0ZmlsZW5hbWUgIiBpbmZvLWZpbGUtbmFtZSkpCi0gICAgKHdoZW4gKHJlLXNlYXJjaC1mb3J3YXJkICJAY2hhcHRlciIgbmlsIHQpCi0gICAgICAodGV4aW5mby1hbGwtbWVudXMtdXBkYXRlIHQpKQotICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCi0gICAgKHdyaXRlLWZpbGUgdGV4aS1maWxlLW5hbWUpCi0gICAgKG1lc3NhZ2UgKGZvcm1hdCAiWW91IGNhbiBhcHBseSBgbWFrZWluZm8gJXMnIG5vdy4iIHRleGktZmlsZS1uYW1lKSkpKQotCi0KLShkZWZ1biBweTJ0ZXhpLXRleGktZmlsZS1uYW1lIChmaWxlbmFtZSkKLSAgIkdlbmVyYXRlIG5hbWUgb2YgVGV4aW5mbyBmaWxlIGZyb20gb3JpZ2luYWwgZmlsZSBuYW1lIEZJTEVOQU1FLiIKLSAgKGNvbmNhdCBmaWxlbmFtZQotCSAgKGlmIChzdHJpbmctbWF0Y2ggIlxcLnRleCQiIGZpbGVuYW1lKSAiaSIgIi50ZXhpIikpKQotCi0KLShkZWZ1biBweTJ0ZXhpLWluZm8tZmlsZS1uYW1lIChmaWxlbmFtZSkKLSAgIkdlbmVyYXRlIG5hbWUgb2YgaW5mbyBmaWxlIGZyb20gb3JpZ2luYWwgZmlsZSBuYW1lIEZJTEVOQU1FLiIKLSAgKHNldHEgZmlsZW5hbWUgKGV4cGFuZC1maWxlLW5hbWUgZmlsZW5hbWUpKQotICAobGV0ICgoZGlyZWN0b3J5IChmaWxlLW5hbWUtZGlyZWN0b3J5IGZpbGVuYW1lKSkKLQkoYmFzZW5hbWUgKGZpbGUtbmFtZS1ub25kaXJlY3RvcnkgZmlsZW5hbWUpKSkKLSAgICAoY29uY2F0IGRpcmVjdG9yeSAicHl0aG9uLSIKLQkgICAgKHN1YnN0cmluZyBiYXNlbmFtZSAwICgtIChsZW5ndGggYmFzZW5hbWUpIDQpKSAiaW5mbyIpKSkKLQotCi0oZGVmdW4gcHkydGV4aS1wcm9jZXNzLXZlcmJhdGltcyAoKQotICAiUHJvY2VzcyBhbmQgcHJvdGVjdCB2ZXJiYXRpbSBlbnZpcm9ubWVudHMuIgotICAobGV0IChkZWxpbWl0ZXIKLQliZWcKLQllbmQpCi0gICAgKHB5MnRleGktc2VhcmNoLXNhZmUgIlxcXFxiZWdpbntcXCh2ZXJiYXRpbVxcfGRpc3BsYXltYXRoXFwpfSIKLSAgICAgICh3aGVuIChzYXZlLWV4Y3Vyc2lvbgotCSAgICAgIDsgTWFrZSBzdXJlIHdlIGFyZW4ndCBsb29raW5nIGF0IGEgY29tbWVudGVkIG91dCB2ZXJzaW9uCi0JICAgICAgOyBvZiBhIHZlcmJhdGltIGVudmlyb25tZW50Ci0JICAgICAgKGJlZ2lubmluZy1vZi1saW5lKQotCSAgICAgIChub3QgKGxvb2tpbmctYXQgIiUiKSkpCi0JKHJlcGxhY2UtbWF0Y2ggIkBleGFtcGxlICIpCi0JKHNldHEgYmVnIChjb3B5LW1hcmtlciAocG9pbnQpIG5pbCkpCi0JKHJlLXNlYXJjaC1mb3J3YXJkICJcXFxcZW5ke1xcKHZlcmJhdGltXFx8ZGlzcGxheW1hdGhcXCl9IikKLQkoc2V0cSBlbmQgKGNvcHktbWFya2VyIChtYXRjaC1iZWdpbm5pbmcgMCkgbmlsKSkKLQkocmVwbGFjZS1tYXRjaCAiQGVuZCBleGFtcGxlIikKLQkocHkydGV4aS10ZXhpbmZvLWVzY2FwZSBiZWcgZW5kKQotCShwdXQtdGV4dC1wcm9wZXJ0eSAoLSBiZWcgKGxlbmd0aCAiQGV4YW1wbGUgIikpCi0JCQkgICAoKyBlbmQgKGxlbmd0aCAiQGVuZCBleGFtcGxlIikpCi0JCQkgICAncHkydGV4aS1wcm90ZWN0ZWQgdCkpKQotICAgIChweTJ0ZXhpLXNlYXJjaC1zYWZlICJcXFxcdmVyYlxcKFteYS16XVxcKSIKLSAgICAgIChzZXRxIGRlbGltaXRlciAobWF0Y2gtc3RyaW5nIDEpKQotICAgICAgKHJlcGxhY2UtbWF0Y2ggIkBjb2RleyIpCi0gICAgICAoc2V0cSBiZWcgKGNvcHktbWFya2VyIChwb2ludCkgbmlsKSkKLSAgICAgIChyZS1zZWFyY2gtZm9yd2FyZCAocmVnZXhwLXF1b3RlIGRlbGltaXRlcikpCi0gICAgICAoc2V0cSBlbmQgKGNvcHktbWFya2VyIChtYXRjaC1iZWdpbm5pbmcgMCkgbmlsKSkKLSAgICAgIChyZXBsYWNlLW1hdGNoICJ9IikKLSAgICAgIChwdXQtdGV4dC1wcm9wZXJ0eSAoLSBiZWcgKGxlbmd0aCAiQGNvZGV7IikpICgrIGVuZCAobGVuZ3RoICJ9IikpCi0JCQkgJ3B5MnRleGktcHJvdGVjdGVkIHQpCi0gICAgICAocHkydGV4aS10ZXhpbmZvLWVzY2FwZSBiZWcgZW5kKSkpKQotCi0KLShkZWZ1biBweTJ0ZXhpLXByb2Nlc3MtY29tbWVudHMgKCkKLSAgIlJlbW92ZSBjb21tZW50cy4iCi0gIChsZXQgKHBvaW50KQotICAgIChweTJ0ZXhpLXNlYXJjaC1zYWZlICIlIgotICAgICAgKHNldHEgcG9pbnQgKHBvaW50KSkKLSAgICAgICh3aGVuIChzYXZlLWV4Y3Vyc2lvbgotCSAgICAgIChyZS1zZWFyY2gtYmFja3dhcmQgIlxcKF5cXHxbXlxcXVxcKFxcXFxcXFxcXFwpKlxcKSVcXD0iIG5pbCB0KSkKLQkoZGVsZXRlLXJlZ2lvbiAoMS0gcG9pbnQpCi0JCSAgICAgICAoc2F2ZS1leGN1cnNpb24gKGJlZ2lubmluZy1vZi1saW5lIDIpIChwb2ludCkpKSkpKSkKLQotCi0oZGVmdW4gcHkydGV4aS1wcm9jZXNzLWluY2x1ZGVzICgpCi0gICJJbmNsdWRlIExhVGVYIGlucHV0IGZpbGVzLgotRG8gbm90IGluY2x1ZGUgLmluZCBmaWxlcy4iCi0gIChsZXQgKChwYXRoIChmaWxlLW5hbWUtZGlyZWN0b3J5IGZpbGUpKQotCWZpbGVuYW1lCi0JZGlycwotCWluY2x1ZGVmaWxlKQotICAgIChweTJ0ZXhpLXNlYXJjaC1zYWZlICJcXFxcaW5wdXR7XFwoW159XStcXCl9IgotICAgICAgKHNldHEgZmlsZW5hbWUgKG1hdGNoLXN0cmluZyAxKSkKLSAgICAgICh1bmxlc3MgKHNhdmUtbWF0Y2gtZGF0YSAoc3RyaW5nLW1hdGNoICJcXC50ZXgkIiBmaWxlbmFtZSkpCi0JKHNldHEgZmlsZW5hbWUgKGNvbmNhdCBmaWxlbmFtZSAiLnRleCIpKSkKLSAgICAgIChzZXRxIGluY2x1ZGVmaWxlIChzYXZlLW1hdGNoLWRhdGEKLQkJCSAgKHN0cmluZy1tYXRjaCAiXFwuaW5kXFwudGV4JCIgZmlsZW5hbWUpKSkKLSAgICAgIChzZXRxIGRpcnMgcHkydGV4aS1kaXJzKQotICAgICAgKHdoaWxlIChhbmQgKG5vdCBpbmNsdWRlZmlsZSkgZGlycykKLQkoc2V0cSBpbmNsdWRlZmlsZQotICAgICAgICAgICAgICAoY29uY2F0IChmaWxlLW5hbWUtYXMtZGlyZWN0b3J5IChjYXIgZGlycykpIGZpbGVuYW1lKSkKLSAgICAgICAgKGlmIChub3QgKGZpbGUtbmFtZS1hYnNvbHV0ZS1wIGluY2x1ZGVmaWxlKSkKLSAgICAgICAgICAgIChzZXRxIGluY2x1ZGVmaWxlCi0gICAgICAgICAgICAgICAgICAoY29uY2F0IChmaWxlLW5hbWUtYXMtZGlyZWN0b3J5IHBhdGgpIGluY2x1ZGVmaWxlKSkpCi0JKHVubGVzcyAoZmlsZS1leGlzdHMtcCBpbmNsdWRlZmlsZSkKLSAgICAgICAgICAoc2V0cSBpbmNsdWRlZmlsZSBuaWwpCi0JICAoc2V0cSBkaXJzIChjZHIgZGlycykpKSkKLSAgICAgIChpZiBpbmNsdWRlZmlsZQotCSAgKHNhdmUtcmVzdHJpY3Rpb24KLQkgICAgKG5hcnJvdy10by1yZWdpb24gKG1hdGNoLWJlZ2lubmluZyAwKSAobWF0Y2gtZW5kIDApKQotCSAgICAoZGVsZXRlLXJlZ2lvbiAocG9pbnQtbWluKSAocG9pbnQtbWF4KSkKLQkgICAgKHdoZW4gKHN0cmluZ3AgaW5jbHVkZWZpbGUpCi0JICAgICAgKGluc2VydC1maWxlLWNvbnRlbnRzIGluY2x1ZGVmaWxlKQotCSAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCi0JICAgICAgKGluc2VydCAiXG4iKQotCSAgICAgIChweTJ0ZXhpLXByb2Nlc3MtdmVyYmF0aW1zKQotCSAgICAgIChweTJ0ZXhpLXByb2Nlc3MtY29tbWVudHMpCi0JICAgICAgKHB5MnRleGktcHJvY2Vzcy1pbmNsdWRlcykpKQotCShyZXBsYWNlLW1hdGNoIChmb3JtYXQgIlxcXFxlbXBoe0luY2x1ZGVkIGZpbGUgJXN9IiBmaWxlbmFtZSkpCi0JKHB5MnRleGktbWVzc2FnZSAoZm9ybWF0ICJJbnB1dCBmaWxlICVzIG5vdCBmb3VuZCIgZmlsZW5hbWUpKSkpKSkKLQotCi0oZGVmdW4gcHkydGV4aS1wcm9jZXNzLWZ1bm55YXMgKCkKLSAgIkNvbnZlcnQgQHMuIgotICAocHkydGV4aS1zZWFyY2gtc2FmZSAiQCIKLSAgICAocmVwbGFjZS1tYXRjaCAiQEAiKSkpCi0KLQotKGRlZnVuIHB5MnRleGktcHJvY2Vzcy1lbnZpcm9ubWVudHMgKCkKLSAgIlByb2Nlc3MgTGFUZVggZW52aXJvbm1lbnRzLiIKLSAgKGxldCAoKHN0YWNrICgpKQotCWtpbmQKLQllbnZpcm9ubWVudAotCXBhcmFtZXRlcgotCWFyZ3VtZW50cwotCW4KLQlzdHJpbmcKLQlkZXNjcmlwdGlvbikKLSAgICAocHkydGV4aS1zZWFyY2gtc2FmZSAoY29uY2F0ICJcXFxcXFwoYmVnaW5cXHxlbmRcXHxpdGVtXFwpIgotCQkJCSAiXFwoe1xcKFtefV0qXFwpfVxcfFtbXVxcKFteXV0qXFwpW11dXFx8XFwpIikKLSAgICAgIChzZXRxIGtpbmQgKG1hdGNoLXN0cmluZyAxKQotCSAgICBlbnZpcm9ubWVudCAobWF0Y2gtc3RyaW5nIDMpCi0JICAgIHBhcmFtZXRlciAobWF0Y2gtc3RyaW5nIDQpKQotICAgICAgKHJlcGxhY2UtbWF0Y2ggIiIpCi0gICAgICAoY29uZAotICAgICAgICgoc3RyaW5nPSBraW5kICJiZWdpbiIpCi0JKHNldHEgZGVzY3JpcHRpb24gKGFzc29jIGVudmlyb25tZW50IHB5MnRleGktZW52aXJvbm1lbnRzKSkKLQkoaWYgZGVzY3JpcHRpb24KLQkgICAgKHByb2duCi0JICAgICAgKHNldHEgbiAoY2FkciBkZXNjcmlwdGlvbikpCi0JICAgICAgKHNldHEgZGVzY3JpcHRpb24gKGNkZHIgZGVzY3JpcHRpb24pKQotCSAgICAgIChzZXRxIHN0cmluZyAocHkydGV4aS10ZXgtYXJndW1lbnRzIG4pKQotCSAgICAgIChzdHJpbmctbWF0Y2ggKHB5MnRleGktcmVnZXhwIG4pIHN0cmluZykKLQkJCQkgICAgICA7IGluY29ycmVjdCBidXQgc3VmZmljaWVudAotCSAgICAgIChpbnNlcnQgKHJlcGxhY2UtbWF0Y2ggKGV2YWwgKGNhciBkZXNjcmlwdGlvbikpCi0JCQkJICAgICB0IG5pbCBzdHJpbmcpKQotCSAgICAgIChzZXRxIHN0YWNrIChjb25zIChjYWRyIGRlc2NyaXB0aW9uKSBzdGFjaykpKQotCSAgKHB5MnRleGktbWVzc2FnZSAoZm9ybWF0ICJVbmtub3duIGVudmlyb25tZW50OiAlcyIgZW52aXJvbm1lbnQpKQotCSAgKHNldHEgc3RhY2sgKGNvbnMgIiIgc3RhY2spKSkpCi0gICAgICAgKChzdHJpbmc9IGtpbmQgImVuZCIpCi0JKGluc2VydCAoZXZhbCAoY2FyIHN0YWNrKSkpCi0JKHNldHEgc3RhY2sgKGNkciBzdGFjaykpKQotICAgICAgICgoc3RyaW5nPSBraW5kICJpdGVtIikKLQkoaW5zZXJ0ICJcbkBpdGVtICIgKG9yIHBhcmFtZXRlciAiIikgIlxuIikpKSkKLSAgICAod2hlbiBzdGFjawotICAgICAgKHB5MnRleGktbWVzc2FnZSAoZm9ybWF0ICJVbmNsb3NlZCBlbnZpcm9ubWVudDogJXMiIChjYXIgc3RhY2spKSkpKSkKLQotCi0oZGVmdW4gcHkydGV4aS1wcm9jZXNzLWNvbW1hbmRzICgpCi0gICJQcm9jZXNzIExhVGVYIGNvbW1hbmRzLiIKLSAgKGxldCAoZG9uZQotCWNvbW1hbmQKLQljb21tYW5kLWluZm8KLQlzdHJpbmcKLQluKQotICAgICh3aGlsZSAobm90IGRvbmUpCi0gICAgICAoc2V0cSBkb25lIHQpCi0gICAgICAocHkydGV4aS1zZWFyY2gtc2FmZSAiXFxcXFxcKFthLXpBLVoqXStcXClcXChcXFtbXl1dKlxcXVxcKT8iCi0JKHNldHEgY29tbWFuZCAobWF0Y2gtc3RyaW5nIDEpKQotCShzZXRxIGNvbW1hbmQtaW5mbyAoYXNzb2MgY29tbWFuZCBweTJ0ZXhpLWNvbW1hbmRzKSkKLQkoaWYgY29tbWFuZC1pbmZvCi0JICAgIChwcm9nbgotCSAgICAgIChzZXRxIGRvbmUgbmlsKQotCSAgICAgIChyZXBsYWNlLW1hdGNoICIiKQotCSAgICAgIChzZXRxIGNvbW1hbmQtaW5mbyAoY2RyIGNvbW1hbmQtaW5mbykpCi0JICAgICAgKHNldHEgbiAoY2FyIGNvbW1hbmQtaW5mbykpCi0JICAgICAgKHNldHEgc3RyaW5nIChweTJ0ZXhpLXRleC1hcmd1bWVudHMgbikpCi0JICAgICAgKHN0cmluZy1tYXRjaCAocHkydGV4aS1yZWdleHAgbikgc3RyaW5nKQotCQkJCSAgICAgIDsgaW5jb3JyZWN0IGJ1dCBzdWZmaWNpZW50Ci0JICAgICAgKGluc2VydCAocmVwbGFjZS1tYXRjaCAoZXZhbCAoY2FkciBjb21tYW5kLWluZm8pKQotCQkJCSAgICAgdCBuaWwgc3RyaW5nKSkpCi0JICAocHkydGV4aS1tZXNzYWdlIChmb3JtYXQgIlVua25vd24gY29tbWFuZDogJXMgKG5vdCBwcm9jZXNzZWQpIgotCQkJCSAgIGNvbW1hbmQpKSkpKSkpCi0KLQotKGRlZnVuIHB5MnRleGktYXJndW1lbnQtcGF0dGVybiAoY291bnQpCi0gIChsZXQgKChmaWxsZXIgIlxcKD86W157fV1cXHxcXFxce1xcfFxcXFx9XFwpKiIpKQotICAgIChpZiAoPD0gY291bnQgMCkKLQlmaWxsZXIKLSAgICAgIChjb25jYXQgZmlsbGVyICJcXCg/OnsiCi0JICAgICAgKHB5MnRleGktYXJndW1lbnQtcGF0dGVybiAoMS0gY291bnQpKQotCSAgICAgICJ9IiBmaWxsZXIgIlxcKSoiIGZpbGxlcikpKSkKLShkZWZjb25zdCBweTJ0ZXhpLXRleC1hcmd1bWVudAotICAoY29uY2F0Ci0gICAie1xcKCIKLSAgIChweTJ0ZXhpLWFyZ3VtZW50LXBhdHRlcm4gMTApCTtyZWFsbHkgYXQgbGVhc3QgMTAhCi0gICAiXFwpfVsgXHQlQGNcbl0qIikKLSAgIlJlZ2V4cCBkZXNjcmliaW5nIExhVGVYIGNvbW1hbmQgYXJndW1lbnQgaW5jbHVkaW5nIGFyZ3VtZW50IHNlcGFyYXRvcnMuIikKLQotCi0oZGVmdW4gcHkydGV4aS1yZWdleHAgKG4pCi0gICJNYWtlIHJlZ2V4cCBtYXRjaGluZyBOIExhVGVYIGNvbW1hbmQgYXJndW1lbnRzLiIKLSAgKGlmICg9IG4gMCkKLSAgICAgICIiCi0gICAgKGxldCAoKHJlZ2V4cCAiXltee10qIikpCi0gICAgICAod2hpbGUgKD4gbiAwKQotCShzZXRxIHJlZ2V4cCAoY29uY2F0IHJlZ2V4cCBweTJ0ZXhpLXRleC1hcmd1bWVudCkpCi0JKHNldHEgbiAoMS0gbikpKQotICAgICAgcmVnZXhwKSkpCi0KLQotKGRlZnVuIHB5MnRleGktdGV4LWFyZ3VtZW50cyAobikKLSAgIlJlbW92ZSBOIExhVGVYIGNvbW1hbmQgYXJndW1lbnRzIGFuZCByZXR1cm4gdGhlbSBhcyBhIHN0cmluZy4iCi0gIChsZXQgKChwb2ludCAocG9pbnQpKQotCShpIDApCi0JcmVzdWx0Ci0JbWF0Y2gpCi0gICAgKGlmICg9IG4gMCkKLQkocHJvZ24KLQkgICh3aGVuIChyZS1zZWFyY2gtZm9yd2FyZCAiXFw9XFwoe31cXHwgKlxcKSIgbmlsIHQpCi0JICAgIChyZXBsYWNlLW1hdGNoICIiKSkKLQkgICIiKQotICAgICAgKHdoaWxlICg+IG4gMCkKLQkodW5sZXNzIChyZS1zZWFyY2gtZm9yd2FyZAotCQkgIlxcKFxcPVxcfFteXFxcXF1cXClcXChcXFxcXFxcXFxcKSpcXChbe31dXFwpIiBuaWwgdCkKLQkgIChkZWJ1ZykpCi0JKGlmIChzdHJpbmc9IChtYXRjaC1zdHJpbmcgMykgInsiKQotCSAgICAoc2V0cSBpICgxKyBpKSkKLQkgIChzZXRxIGkgKDEtIGkpKQotCSAgKHdoZW4gKDw9IGkgMCkKLQkgICAgKHNldHEgbiAoMS0gbikpKSkpCi0gICAgICAoc2V0cSByZXN1bHQgKGJ1ZmZlci1zdWJzdHJpbmctbm8tcHJvcGVydGllcyBwb2ludCAocG9pbnQpKSkKLSAgICAgICh3aGlsZSAoc3RyaW5nLW1hdGNoICJcblsgXHRdKiIgcmVzdWx0KQotCShzZXRxIHJlc3VsdCAocmVwbGFjZS1tYXRjaCAiICIgdCBuaWwgcmVzdWx0KSkpCi0gICAgICAoZGVsZXRlLXJlZ2lvbiBwb2ludCAocG9pbnQpKQotICAgICAgcmVzdWx0KSkpCi0KLQotKGRlZnVuIHB5MnRleGktcHJvY2Vzcy1zaW1wbGUtY29tbWFuZHMgKCkKLSAgIlJlcGxhY2Ugc2luZ2xlIGNoYXJhY3RlciBMYVRlWCBjb21tYW5kcy4iCi0gIChsZXQgKGNoYXIpCi0gICAgKHB5MnRleGktc2VhcmNoLXNhZmUgIlxcXFxcXChbXmEtel1cXCkiCi0gICAgICAoc2V0cSBjaGFyIChtYXRjaC1zdHJpbmcgMSkpCi0gICAgICAocmVwbGFjZS1tYXRjaCAoZm9ybWF0ICIlcyVzIgotCQkJICAgICAoaWYgKG9yIChzdHJpbmc9IGNoYXIgInsiKQotCQkJCSAgICAgKHN0cmluZz0gY2hhciAifSIpCi0JCQkJICAgICAoc3RyaW5nPSBjaGFyICIgIikpCi0JCQkJICJAIgotCQkJICAgICAgICIiKQotCQkJICAgICAoaWYgKHN0cmluZz0gY2hhciAiXFwiKQotCQkJCSAiXFxcXCIKLQkJCSAgICAgICBjaGFyKSkpKSkpCi0KLQotKGRlZnVuIHB5MnRleGktZml4LWluZGVudGF0aW9uICgpCi0gICJSZW1vdmUgd2hpdGUgc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBvZiBsaW5lcy4iCi0gIChweTJ0ZXhpLXNlYXJjaC1zYWZlICJeWyBcdF0rIgotICAgIChyZXBsYWNlLW1hdGNoICIiKSkpCi0KLQotKGRlZnVuIHB5MnRleGktZml4LW5vZGVzICgpCi0gICJSZW1vdmUgdW53YW50ZWQgY2hhcmFjdGVycyBmcm9tIG5vZGVzIGFuZCBtYWtlIG5vZGVzIHVuaXF1ZS4iCi0gIChsZXQgKChub2RlcyAobWFrZS1oYXNoLXRhYmxlIDp0ZXN0ICdlcXVhbCkpCi0JaWQKLQljb3VudGVyCi0Jc3RyaW5nCi0JbGFiZWwKLQlpbmRleCkKLSAgICAocHkydGV4aS1zZWFyY2ggIl5Abm9kZSArXFwoLipcXCkkIgotICAgICAgKHNldHEgc3RyaW5nIChtYXRjaC1zdHJpbmcgMSkpCi0gICAgICAoaWYgcHkydGV4aS14ZW1hY3MKLQkgIChyZXBsYWNlLW1hdGNoICJAbm9kZSAiIHQpCi0JKHJlcGxhY2UtbWF0Y2ggIiIgdCBuaWwgbmlsIDEpKQotICAgICAgKHdoaWxlIChzdHJpbmctbWF0Y2ggIkBsYWJlbHtbXn1dKn0iIHN0cmluZykKLQkoc2V0cSBsYWJlbCAobWF0Y2gtc3RyaW5nIDAgc3RyaW5nKSkKLQkoc2V0cSBzdHJpbmcgKHJlcGxhY2UtbWF0Y2ggIiIgdCBuaWwgc3RyaW5nKSkpCi0gICAgICAod2hpbGUgKHN0cmluZy1tYXRjaCAiQC4uP2luZGV4e1tefV0qfQEiIHN0cmluZykKLQkoc2V0cSBpbmRleCAobWF0Y2gtc3RyaW5nIDAgc3RyaW5nKSkKLQkoc2V0cSBzdHJpbmcgKHJlcGxhY2UtbWF0Y2ggIiIgdCBuaWwgc3RyaW5nKSkpCi0gICAgICAod2hpbGUgKHN0cmluZy1tYXRjaCAiQFthLXpBLVpdK1xcfFt7fSgpOl1cXHxgYFxcfCcnIiBzdHJpbmcpCi0JKHNldHEgc3RyaW5nIChyZXBsYWNlLW1hdGNoICIiIHQgbmlsIHN0cmluZykpKQotICAgICAgKHdoaWxlIChzdHJpbmctbWF0Y2ggIiAtLSAiIHN0cmluZykKLQkoc2V0cSBzdHJpbmcgKHJlcGxhY2UtbWF0Y2ggIiAtICIgdCBuaWwgc3RyaW5nKSkpCi0gICAgICAod2hpbGUgKHN0cmluZy1tYXRjaCAiXFwuIiBzdHJpbmcpCi0JKHNldHEgc3RyaW5nIChyZXBsYWNlLW1hdGNoICIiIHQgbmlsIHN0cmluZykpKQotICAgICAgKHdoZW4gKHN0cmluZy1tYXRjaCAiICskIiBzdHJpbmcpCi0JKHNldHEgc3RyaW5nIChyZXBsYWNlLW1hdGNoICIiIHQgbmlsIHN0cmluZykpKQotICAgICAgKHdoZW4gKHN0cmluZy1tYXRjaCAiXlxcKEJ1aWx0LWluXFx8U3RhbmRhcmRcXCkgTW9kdWxlIFxcfFRoZSAiIHN0cmluZykKLQkoc2V0cSBzdHJpbmcgKHJlcGxhY2UtbWF0Y2ggIiIgdCBuaWwgc3RyaW5nKSkpCi0gICAgICAoc3RyaW5nLW1hdGNoICJeW14sXSsiIHN0cmluZykKLSAgICAgIChzZXRxIGlkIChtYXRjaC1zdHJpbmcgMCBzdHJpbmcpKQotICAgICAgKHNldHEgY291bnRlciAoZ2V0aGFzaCBpZCBub2RlcykpCi0gICAgICAoaWYgY291bnRlcgotCSAgKHByb2duCi0JICAgIChzZXRxIGNvdW50ZXIgKDErIGNvdW50ZXIpKQotCSAgICAoc2V0cSBzdHJpbmcgKHJlcGxhY2UtbWF0Y2ggKGZvcm1hdCAiXFwmICVkIiBjb3VudGVyKQotCQkJCQl0IG5pbCBzdHJpbmcpKSkKLQkoc2V0cSBjb3VudGVyIDEpKQotICAgICAgKHNldGYgKGdldGhhc2ggaWQgbm9kZXMpIGNvdW50ZXIpCi0gICAgICAoaW5zZXJ0IHN0cmluZykKLSAgICAgIChiZWdpbm5pbmctb2YtbGluZSAzKQotICAgICAgKHdoZW4gbGFiZWwKLQkoaW5zZXJ0IGxhYmVsICJcbiIpKQotICAgICAgKHdoZW4gaW5kZXgKLQkoaW5zZXJ0IGluZGV4ICJcbiIpKSkpKQotCi0KLShkZWZ1biBweTJ0ZXhpLWZpeC1yZWZlcmVuY2VzICgpCi0gICJQcm9jZXNzIGxhYmVscyBhbmQgbWFrZSByZWZlcmVuY2VzIHRvIHBvaW50IHRvIGFwcHJvcHJpYXRlIG5vZGVzLiIKLSAgKGxldCAoKGxhYmVscyAoKSkKLQlub2RlKQotICAgIChweTJ0ZXhpLXNlYXJjaC1zYWZlICJAbGFiZWx7XFwoW159XSpcXCl9IgotICAgICAgKHNldHEgbm9kZSAoc2F2ZS1leGN1cnNpb24KLQkJICAgKHNhdmUtbWF0Y2gtZGF0YQotCQkgICAgIChhbmQgKHJlLXNlYXJjaC1iYWNrd2FyZCAiQG5vZGUgK1xcKFteLFxuXStcXCkiIG5pbCB0KQotCQkJICAobWF0Y2gtc3RyaW5nIDEpKSkpKQotICAgICAgKHdoZW4gbm9kZQotCShzZXRxIGxhYmVscyAoY29ucyAoY29ucyAobWF0Y2gtc3RyaW5nIDEpIG5vZGUpIGxhYmVscykpKQotICAgICAgKHJlcGxhY2UtbWF0Y2ggIiIpKQotICAgIChweTJ0ZXhpLXNlYXJjaC1zYWZlICJAcmVme1xcKFtefV0qXFwpfSIKLSAgICAgIChzZXRxIG5vZGUgKGFzc29jIChtYXRjaC1zdHJpbmcgMSkgbGFiZWxzKSkKLSAgICAgIChyZXBsYWNlLW1hdGNoICIiKQotICAgICAgKHdoZW4gbm9kZQotCShpbnNlcnQgKGZvcm1hdCAiQHJlZnslc30iIChjZHIgbm9kZSkpKSkpKSkKLQotCi0oZGVmdW4gcHkydGV4aS1maXgtaW5kaWNlcyAoKQotICAiUmVtb3ZlIHVud2FudGVkIGNoYXJhY3RlcnMgZnJvbSBAKmluZGV4IGNvbW1hbmRzIGFuZCBjcmVhdGUgZmluYWwgaW5kaWNlcy4iCi0gIChweTJ0ZXhpLXNlYXJjaC1zYWZlICJALi4/aW5kZXhcXD5bXlxuAV0qXFwoAVxcKVxuIgotICAgIChyZXBsYWNlLW1hdGNoICIiIHQgbmlsIG5pbCAxKSkKLSAgKHB5MnRleGktc2VhcmNoLXNhZmUgIkAuLj9pbmRleFxcPlteXG4BXSpcXCgBXFwpIgotICAgIChyZXBsYWNlLW1hdGNoICJcbiIgdCBuaWwgbmlsIDEpKQotICAocHkydGV4aS1zZWFyY2gtc2FmZSAiQC4uP2luZGV4XFwoe1xcKVxcKFtefV0rXFwpXFwofStcXCkiCi0gICAgKHJlcGxhY2UtbWF0Y2ggIiAiIHQgbmlsIG5pbCAxKQotICAgIChyZXBsYWNlLW1hdGNoICIiIHQgbmlsIG5pbCAzKQotICAgIChsZXQgKChzdHJpbmcgKG1hdGNoLXN0cmluZyAyKSkpCi0gICAgICAoc2F2ZS1tYXRjaC1kYXRhCi0JKHdoaWxlIChzdHJpbmctbWF0Y2ggIkBbYS16XSt7IiBzdHJpbmcpCi0JICAoc2V0cSBzdHJpbmcgKHJlcGxhY2UtbWF0Y2ggIiIgbmlsIG5pbCBzdHJpbmcpKSkKLQkod2hpbGUgKHN0cmluZy1tYXRjaCAieyIgc3RyaW5nKQotCSAgKHNldHEgc3RyaW5nIChyZXBsYWNlLW1hdGNoICIiIG5pbCBuaWwgc3RyaW5nKSkpKQotICAgICAgKHJlcGxhY2UtbWF0Y2ggc3RyaW5nIHQgdCBuaWwgMikpKQotICAocHkydGV4aS1zZWFyY2gtc2FmZSAiQC4uP2luZGV4XFw+LipcXChbe31dXFx8QFthLXpdKlxcKSIKLSAgICAocmVwbGFjZS1tYXRjaCAiIiB0IG5pbCBuaWwgMSkKLSAgICAoZ290by1jaGFyIChtYXRjaC1iZWdpbm5pbmcgMCkpKQotICAocHkydGV4aS1zZWFyY2gtc2FmZSAiW15cbl1cXChcXClALi4/aW5kZXhcXD4iCi0gICAgKHJlcGxhY2UtbWF0Y2ggIlxuIiB0IG5pbCBuaWwgMSkpCi0gIChnb3RvLWNoYXIgKHBvaW50LW1heCkpCi0gIChyZS1zZWFyY2gtYmFja3dhcmQgIkBpbmRpY2VzIikKLSAgKHJlcGxhY2UtbWF0Y2ggIiIpCi0gIChpbnNlcnQgKGlmIG1vaW5kZXgKLQkgICAgICAoY29uY2F0ICJAbm9kZSBNb2R1bGUgSW5kZXhcbiIKLQkJICAgICAgIkB1bm51bWJlcmVkIE1vZHVsZSBJbmRleFxuIgotCQkgICAgICAiQHByaW50aW5kZXggbW9cbiIpCi0JICAgICIiKQotCSAgKGlmIG9iaW5kZXgKLQkgICAgICAoY29uY2F0ICJAbm9kZSBDbGFzcy1FeGNlcHRpb24tT2JqZWN0IEluZGV4XG4iCi0JCSAgICAgICJAdW5udW1iZXJlZCBDbGFzcywgRXhjZXB0aW9uLCBhbmQgT2JqZWN0IEluZGV4XG4iCi0JCSAgICAgICJAcHJpbnRpbmRleCBvYlxuIikKLQkgICAgIiIpCi0JICAoaWYgZmluZGV4Ci0JICAgICAgKGNvbmNhdCAiQG5vZGUgRnVuY3Rpb24tTWV0aG9kLVZhcmlhYmxlIEluZGV4XG4iCi0JCSAgICAgICJAdW5udW1iZXJlZCBGdW5jdGlvbiwgTWV0aG9kLCBhbmQgVmFyaWFibGUgSW5kZXhcbiIKLQkJICAgICAgIkBwcmludGluZGV4IGZuXG4iKQotCSAgICAiIikKLQkgIChpZiBjaW5kZXgKLQkgICAgICAoY29uY2F0ICJAbm9kZSBNaXNjZWxsYW5lb3VzIEluZGV4XG4iCi0JCSAgICAgICJAdW5udW1iZXJlZCBNaXNjZWxsYW5lb3VzIEluZGV4XG4iCi0JCSAgICAgICJAcHJpbnRpbmRleCBjcFxuIikKLQkgICAgIiIpKSkKLQotCi0oZGVmdW4gcHkydGV4aS1maXgtYmFja3NsYXNoZXMgKCkKLSAgIk1ha2UgYmFja3NsYXNoZXMgZnJvbSBhdXhpbGlhcnkgY29tbWFuZHMuIgotICAocHkydGV4aS1zZWFyY2gtc2FmZSAiQGJhY2tzbGFzaHt9IgotICAgIChyZXBsYWNlLW1hdGNoICJcXFxcIikpKQotCi0KLShkZWZ1biBweTJ0ZXhpLWZpeC1mb250cyAoKQotICAiUmVtb3ZlIGdhcmJhZ2UgYWZ0ZXIgdW5zdHJ1Y3R1cmVkIGZvbnQgY29tbWFuZHMuIgotICAobGV0IChzdHJpbmcpCi0gICAgKHB5MnRleGktc2VhcmNoLXNhZmUgIkBkZXN0cm95IgotICAgICAgKHJlcGxhY2UtbWF0Y2ggIiIpCi0gICAgICAod2hlbiAoZXEgKHByZWNlZGluZy1jaGFyKSA/eykKLQkoZm9yd2FyZC1jaGFyIC0xKQotCShzZXRxIHN0cmluZyAocHkydGV4aS10ZXgtYXJndW1lbnRzIDEpKQotCShpbnNlcnQgKHN1YnN0cmluZyBzdHJpbmcgMSAoMS0gKGxlbmd0aCBzdHJpbmcpKSkpKSkpKQotCi0KLShkZWZ1biBweTJ0ZXhpLWZpeC1icmFjZXMgKCkKLSAgIkVzY2FwZSBicmFjZXMgZm9yIFRleGluZm8uIgotICAocHkydGV4aS1zZWFyY2ggIntAe30iCi0gICAgKHJlcGxhY2UtbWF0Y2ggIkB7IikpCi0gIChweTJ0ZXhpLXNlYXJjaCAie0B9fSIKLSAgICAocmVwbGFjZS1tYXRjaCAiQH0iKSkKLSAgKGxldCAoc3RyaW5nKQotICAgIChweTJ0ZXhpLXNlYXJjaCAieyIKLSAgICAgICAodW5sZXNzIChvciAocHkydGV4aS1wcm90ZWN0ZWQpCi0JCSAgIChzYXZlLWV4Y3Vyc2lvbgotCQkgICAgIChyZS1zZWFyY2gtYmFja3dhcmQKLQkJICAgICAgIkBcXChbYS16QS1aXSpcXHxtdWx0aXRhYmxlLipcXCl7XFw9IiBuaWwgdCkpKQotCSAoZm9yd2FyZC1jaGFyIC0xKQotCSAoc2V0cSBzdHJpbmcgKHB5MnRleGktdGV4LWFyZ3VtZW50cyAxKSkKLQkgKGluc2VydCAiQCIgKHN1YnN0cmluZyBzdHJpbmcgMCAoMS0gKGxlbmd0aCBzdHJpbmcpKSkgIkB9IikpKSkpCi0KLQotKGRlZnVuIHB5MnRleGktZml4LW5ld2xpbmVzICgpCi0gICJSZW1vdmUgZXh0cmEgbmV3bGluZXMuIgotICAocHkydGV4aS1zZWFyY2ggIlxuXG5cbisiCi0gICAgKHJlcGxhY2UtbWF0Y2ggIlxuXG4iKSkKLSAgKHB5MnRleGktc2VhcmNoLXNhZmUgIkBpdGVtLipcblxuIgotICAgIChkZWxldGUtYmFja3dhcmQtY2hhciAxKSkKLSAgKHB5MnRleGktc2VhcmNoICJAZW5kIGV4YW1wbGUiCi0gICAgKHVubGVzcyAobG9va2luZy1hdCAiXG5cbiIpCi0gICAgICAoaW5zZXJ0ICJcbiIpKSkpCi0KLQotKGRlZnVuIHB5MnRleGktZGVzdHJveS1lbXB0aWVzICgpCi0gICJSZW1vdmUgYWxsIGNvbW1lbnRzLgotVGhpcyBhdm9pZHMgc29tZSBtYWtlaW5mbyBlcnJvcnMuIgotICAocHkydGV4aS1zZWFyY2ggIkBjXFw+IgotICAgICh1bmxlc3MgKGVxIChweTJ0ZXhpLXByb3RlY3RlZCkgdCkKLSAgICAgIChkZWxldGUtcmVnaW9uICgtIChwb2ludCkgMikgKHNhdmUtZXhjdXJzaW9uIChlbmQtb2YtbGluZSkgKHBvaW50KSkpCi0gICAgICAoY29uZAotICAgICAgICgobG9va2luZy1hdCAiXG5cbiIpCi0JKGRlbGV0ZS1jaGFyIDEpKQotICAgICAgICgoc2F2ZS1leGN1cnNpb24gKHJlLXNlYXJjaC1iYWNrd2FyZCAiXlsgXHRdKlxcPSIgbmlsIHQpKQotCShkZWxldGUtcmVnaW9uIChzYXZlLWV4Y3Vyc2lvbiAoYmVnaW5uaW5nLW9mLWxpbmUpIChwb2ludCkpCi0JCSAgICAgICAoMSsgKHBvaW50KSkpKSkpKSkKLQotCi0oZGVmdW4gcHkydGV4aS1hZGp1c3QtbGV2ZWwgKCkKLSAgIkluY3JlYXNlIGhlYWRpbmcgbGV2ZWwgdG8gQGNoYXB0ZXIsIGlmIG5lZWRlZC4KLVRoaXMgaXMgb25seSBuZWVkZWQgZm9yIGRpc3R1dGlscywgc28gaXQgaGFzIGEgdmVyeSBzaW1wbGUgZm9ybSBvbmx5LiIKLSAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKLSAgKHVubGVzcyAocmUtc2VhcmNoLWZvcndhcmQgIkBjaGFwdGVyXFw+IiBuaWwgdCkKLSAgICAocHkydGV4aS1zZWFyY2gtc2FmZSAiQHNlY3Rpb25cXD4iCi0gICAgICAocmVwbGFjZS1tYXRjaCAiQGNoYXB0ZXIiIHQpKQotICAgIChweTJ0ZXhpLXNlYXJjaC1zYWZlICJAXFwoc3ViXFwpXFwoc3ViXFwpP3NlY3Rpb25cXD4iCi0gICAgICAocmVwbGFjZS1tYXRjaCAiIiBuaWwgbmlsIG5pbCAxKSkpKQotCi0KLShkZWZ1biBweTJ0ZXhpLXRleGluZm8tZXNjYXBlIChiZWcgZW5kKQotICAiRXNjYXBlIFRleGluZm8gc3BlY2lhbCBjaGFyYWN0ZXJzIGluIHJlZ2lvbi4iCi0gIChzYXZlLWV4Y3Vyc2lvbgotICAgIChnb3RvLWNoYXIgYmVnKQotICAgICh3aGlsZSAocmUtc2VhcmNoLWZvcndhcmQgIltAe31dIiBlbmQgdCkKLSAgICAgIChyZXBsYWNlLW1hdGNoICJAXFwmIikpKSkKLQotCi0oZGVmdW4gcHkydGV4aS1wcm90ZWN0ZWQgKCkKLSAgIlJldHVybiBwcm90ZWN0aW9uIHN0YXR1cyBvZiB0aGUgcG9pbnQgYmVmb3JlIGN1cnJlbnQgcG9pbnQuIgotICAoZ2V0LXRleHQtcHJvcGVydHkgKDEtIChwb2ludCkpICdweTJ0ZXhpLXByb3RlY3RlZCkpCi0KLQotOzs7IEFubm91bmNlCi0KLShwcm92aWRlICdweTJ0ZXhpKQotCi0KLTs7OyBweTJ0ZXhpLmVsIGVuZHMgaGVyZQpkaWZmIC0tZ2l0IGEvRG9jL3Rvb2xzL3JlZmNvdW50cy5weSBiL0RvYy90b29scy9yZWZjb3VudHMucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZmIwNzMuLjAwMDAwMDAKLS0tIGEvRG9jL3Rvb2xzL3JlZmNvdW50cy5weQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLSIiIlN1cHBvcnQgZnVuY3Rpb25zIGZvciBsb2FkaW5nIHRoZSByZWZlcmVuY2UgY291bnQgZGF0YSBmaWxlLiIiIgotX192ZXJzaW9uX18gPSAnJFJldmlzaW9uJCcKLQotaW1wb3J0IG9zCi1pbXBvcnQgc3lzCi0KLQotIyBEZXRlcm1pbmUgdGhlIGV4cGVjdGVkIGxvY2F0aW9uIG9mIHRoZSByZWZlcmVuY2UgY291bnQgZmlsZToKLXRyeToKLSAgICBwID0gb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKQotZXhjZXB0IE5hbWVFcnJvcjoKLSAgICBwID0gb3MucGF0aC5kaXJuYW1lKHN5cy5hcmd2WzBdKQotcCA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5qb2luKG9zLmdldGN3ZCgpLCBwLCBvcy5wYXJkaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFwaSIsICJyZWZjb3VudHMuZGF0IikpCi1ERUZBVUxUX1BBVEggPSBwCi1kZWwgcAotCi0KLWRlZiBsb2FkKHBhdGg9REVGQVVMVF9QQVRIKToKLSAgICByZXR1cm4gbG9hZGZpbGUob3BlbihwYXRoKSkKLQotCi1kZWYgbG9hZGZpbGUoZnApOgotICAgIGQgPSB7fQotICAgIHdoaWxlIDE6Ci0gICAgICAgIGxpbmUgPSBmcC5yZWFkbGluZSgpCi0gICAgICAgIGlmIG5vdCBsaW5lOgotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQotICAgICAgICBpZiBsaW5lWzoxXSBpbiAoIiIsICIjIik6Ci0gICAgICAgICAgICAjIGJsYW5rIGxpbmVzIGFuZCBjb21tZW50cwotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgcGFydHMgPSBsaW5lLnNwbGl0KCI6IiwgNCkKLSAgICAgICAgaWYgbGVuKHBhcnRzKSAhPSA1OgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiTm90IGVub3VnaCBmaWVsZHMgaW4gJXIiICUgbGluZSkKLSAgICAgICAgZnVuY3Rpb24sIHR5cGUsIGFyZywgcmVmY291bnQsIGNvbW1lbnQgPSBwYXJ0cwotICAgICAgICBpZiByZWZjb3VudCA9PSAibnVsbCI6Ci0gICAgICAgICAgICByZWZjb3VudCA9IE5vbmUKLSAgICAgICAgZWxpZiByZWZjb3VudDoKLSAgICAgICAgICAgIHJlZmNvdW50ID0gaW50KHJlZmNvdW50KQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmVmY291bnQgPSBOb25lCi0gICAgICAgICMKLSAgICAgICAgIyBHZXQgdGhlIGVudHJ5LCBjcmVhdGluZyBpdCBpZiBuZWVkZWQ6Ci0gICAgICAgICMKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZW50cnkgPSBkW2Z1bmN0aW9uXQotICAgICAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgICAgICBlbnRyeSA9IGRbZnVuY3Rpb25dID0gRW50cnkoZnVuY3Rpb24pCi0gICAgICAgICMKLSAgICAgICAgIyBVcGRhdGUgdGhlIGVudHJ5IHdpdGggdGhlIG5ldyBwYXJhbWV0ZXIgb3IgdGhlIHJlc3VsdCBpbmZvcm1hdGlvbi4KLSAgICAgICAgIwotICAgICAgICBpZiBhcmc6Ci0gICAgICAgICAgICBlbnRyeS5hcmdzLmFwcGVuZCgoYXJnLCB0eXBlLCByZWZjb3VudCkpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBlbnRyeS5yZXN1bHRfdHlwZSA9IHR5cGUKLSAgICAgICAgICAgIGVudHJ5LnJlc3VsdF9yZWZzID0gcmVmY291bnQKLSAgICByZXR1cm4gZAotCi0KLWNsYXNzIEVudHJ5OgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKLSAgICAgICAgc2VsZi5uYW1lID0gbmFtZQotICAgICAgICBzZWxmLmFyZ3MgPSBbXQotICAgICAgICBzZWxmLnJlc3VsdF90eXBlID0gJycKLSAgICAgICAgc2VsZi5yZXN1bHRfcmVmcyA9IE5vbmUKLQotCi1kZWYgZHVtcChkKToKLSAgICAiIiJEdW1wIHRoZSBkYXRhIGluIHRoZSAnY2Fub25pY2FsJyBmb3JtYXQsIHdpdGggZnVuY3Rpb25zIGluCi0gICAgc29ydGVkIG9yZGVyLiIiIgotICAgIGl0ZW1zID0gc29ydGVkKGQuaXRlbXMoKSkKLSAgICBmaXJzdCA9IDEKLSAgICBmb3IgaywgZW50cnkgaW4gaXRlbXM6Ci0gICAgICAgIGlmIGZpcnN0OgotICAgICAgICAgICAgZmlyc3QgPSAwCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwcmludCgpCi0gICAgICAgIHMgPSBlbnRyeS5uYW1lICsgIjolczolczolczoiCi0gICAgICAgIGlmIGVudHJ5LnJlc3VsdF9yZWZzIGlzIE5vbmU6Ci0gICAgICAgICAgICByID0gIiIKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHIgPSBlbnRyeS5yZXN1bHRfcmVmcwotICAgICAgICBwcmludChzICUgKGVudHJ5LnJlc3VsdF90eXBlLCAiIiwgcikpCi0gICAgICAgIGZvciB0LCBuLCByIGluIGVudHJ5LmFyZ3M6Ci0gICAgICAgICAgICBpZiByIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgciA9ICIiCi0gICAgICAgICAgICBwcmludChzICUgKHQsIG4sIHIpKQotCi0KLWRlZiBtYWluKCk6Ci0gICAgZCA9IGxvYWQoKQotICAgIGR1bXAoZCkKLQotCi1pZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvRG9jL3Rvb2xzL3Jld3JpdGUucHkgYi9Eb2MvdG9vbHMvcmV3cml0ZS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFjZGQ5OS4uMDAwMDAwMAotLS0gYS9Eb2MvdG9vbHMvcmV3cml0ZS5weQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLSIiIlNpbXBsZSBzY3JpcHQgdG8gcmVwbGFjZSBAREFURUAgYW5kIGZyaWVuZHMgd2l0aCByZWFsIGluZm9ybWF0aW9uLgotCi1Vc2FnZTogIHJld3JpdGUucHkgYm9pbGVycGxhdGUudGV4IFtWQVI9dmFsdWVdIC4uLiA8dGVtcGxhdGUgPm91dHB1dAotIiIiCi0KLWltcG9ydCBzeXMKLWltcG9ydCB0aW1lCi0KLQotZGVmIGdldF9pbmZvKGZwKToKLSAgICBzID0gZnAucmVhZCgpCi0KLSAgICBkID0ge30KLSAgICBzdGFydCA9IHMuZmluZChyIlxkYXRleyIpCi0gICAgaWYgc3RhcnQgPj0gMDoKLSAgICAgICAgZW5kID0gcy5maW5kKCJ9Iiwgc3RhcnQpCi0gICAgICAgIGRhdGUgPSBzW3N0YXJ0KzY6ZW5kXQotICAgICAgICBpZiBkYXRlID09IHIiXHRvZGF5IjoKLSAgICAgICAgICAgIGRhdGUgPSB0aW1lLnN0cmZ0aW1lKCIlQiAlZCwgJVkiLCB0aW1lLmxvY2FsdGltZSh0aW1lLnRpbWUoKSkpCi0gICAgICAgIGRbIkRBVEUiXSA9IGRhdGUKLSAgICByZXR1cm4gZAotCi0KLWRlZiBtYWluKCk6Ci0gICAgcyA9IHN5cy5zdGRpbi5yZWFkKCkKLSAgICBpZiAiQCIgaW4gczoKLSAgICAgICAgIyB5ZXMsIHdlIGFjdHVsbHkgbmVlZCB0byBsb2FkIHRoZSByZXBsYWNlbWVudCB2YWx1ZXMKLSAgICAgICAgZCA9IGdldF9pbmZvKG9wZW4oc3lzLmFyZ3ZbMV0pKQotICAgICAgICBmb3IgYXJnIGluIHN5cy5hcmd2WzI6XToKLSAgICAgICAgICAgIG5hbWUsIHZhbHVlID0gYXJnLnNwbGl0KCI9IiwgMSkKLSAgICAgICAgICAgIGRbbmFtZV0gPSB2YWx1ZQotICAgICAgICBzdGFydCA9IDAKLSAgICAgICAgd2hpbGUgMToKLSAgICAgICAgICAgIHN0YXJ0ID0gcy5maW5kKCJAIiwgc3RhcnQpCi0gICAgICAgICAgICBpZiBzdGFydCA8IDA6Ci0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGVuZCA9IHMuZmluZCgiQCIsIHN0YXJ0KzEpCi0gICAgICAgICAgICBuYW1lID0gc1tzdGFydCsxOmVuZF0KLSAgICAgICAgICAgIGlmIG5hbWU6Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBkLmdldChuYW1lKQotICAgICAgICAgICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gZW5kICsgMQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIHMgPSBzWzpzdGFydF0gKyB2YWx1ZSArIHNbZW5kKzE6XQotICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHN0YXJ0ICsgbGVuKHZhbHVlKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAjICJAQCIgLS0+ICJAIgotICAgICAgICAgICAgICAgIHMgPSBzWzpzdGFydF0gKyBzW2VuZDpdCi0gICAgICAgICAgICAgICAgc3RhcnQgPSBlbmQKLSAgICBzeXMuc3Rkb3V0LndyaXRlKHMpCi0KLQotaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgICBtYWluKCkKZGlmZiAtLWdpdCBhL0RvYy90b29scy9zZ21sY29udi9NYWtlZmlsZSBiL0RvYy90b29scy9zZ21sY29udi9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIyMjkzMy4uMDAwMDAwMAotLS0gYS9Eb2MvdG9vbHMvc2dtbGNvbnYvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0jIFNpbXBsZSBtYWtlZmlsZSB0byBjb250cm9sIFhNTCBnZW5lcmF0aW9uIGZvciB0aGUgZW50aXJlIGRvY3VtZW50IHRyZWUuCi0jIFRoaXMgc2hvdWxkIGJlIHVzZWQgZnJvbSB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeSAoRG9jLyksIG5vdCB0aGUgZGlyZWN0b3J5Ci0jIHRoYXQgYWN0dWFsbHkgY29udGFpbnMgdGhpcyBmaWxlOgotIwotIyAgJCBwd2QKLSMgIC4uLi9Eb2MKLSMgICQgbWFrZSAtZiB0b29scy9zZ21sY29udi9NYWtlZmlsZQotCi1UT1BESVI9LgotVE9PTFNESVI9dG9vbHMKLQotU0dNTFJVTEVTPS4uLyQoVE9PTFNESVIpL3NnbWxjb252L21ha2UucnVsZXMKLSMgVGhlICdpbnN0JyBhbmQgJ3R1dCcgZGlyZWN0b3JpZXMgYnJlYWsgdGhlIGNvbnZlcnNpb24sIHNvIHNraXAgdGhlbSBmb3Igbm93LgotU1VCRElSUz1hcGkgZGlzdCBleHQgbGliIG1hYyByZWYKLVNVQk1BS0U9JChNQUtFKSAtZiAkKFNHTUxSVUxFUykgVE9PTFNESVI9Li4vJChUT09MU0RJUikKLQotYWxsOgl4bWwKLQotLlBIT05ZOiBlc2lzIHhtbAotLlBIT05ZOiAkKFNVQkRJUlMpCi0KLXhtbDoKLQlmb3IgRElSIGluICQoU1VCRElSUykgOyBkbyBcCi0JICAgIChjZCAkJERJUiAmJiAkKFNVQk1BS0UpIHhtbCkgfHwgZXhpdCAkJD8gOyBkb25lCi0KLWVzaXM6Ci0JZm9yIERJUiBpbiAkKFNVQkRJUlMpIDsgZG8gXAotCSAgICAoY2QgJCRESVIgJiYgJChTVUJNQUtFKSBlc2lzKSB8fCBleGl0ICQkPyA7IGRvbmUKLQotZXNpczE6Ci0JZm9yIERJUiBpbiAkKFNVQkRJUlMpIDsgZG8gXAotCSAgICAoY2QgJCRESVIgJiYgJChTVUJNQUtFKSBlc2lzMSkgfHwgZXhpdCAkJD8gOyBkb25lCi0KLXRhcmJhbGw6ICB4bWwKLQl0YXIgY2YgLSB0b29scy9zZ21sY29udiAqLyoueG1sIHwgZ3ppcCAtOSA+eG1sLTEuNS4yYjIudGd6Ci0KLWFwaToKLQljZCBhcGkgJiYgJChTVUJNQUtFKQotCi1kaXN0OgotCWNkIGRpc3QgJiYgJChTVUJNQUtFKQotCi1leHQ6Ci0JY2QgZXh0ICYmICQoU1VCTUFLRSkKLQotaW5zdDoKLQljZCBpbnN0ICYmICQoU1VCTUFLRSkKLQotbGliOgotCWNkIGxpYiAmJiAkKFNVQk1BS0UpCi0KLW1hYzoKLQljZCBtYWMgJiYgJChTVUJNQUtFKQotCi1yZWY6Ci0JY2QgcmVmICYmICQoU1VCTUFLRSkKLQotdHV0OgotCWNkIHR1dCAmJiAkKFNVQk1BS0UpCi0KLWNsZWFuOgotCWZvciBESVIgaW4gJChTVUJESVJTKSA7IGRvIFwKLQkgICAgKGNkICQkRElSICYmICQoU1VCTUFLRSkgY2xlYW4pIHx8IGV4aXQgJCQ/IDsgZG9uZQotCi1jbG9iYmVyOgotCWZvciBESVIgaW4gJChTVUJESVJTKSA7IGRvIFwKLQkgICAgKGNkICQkRElSICYmICQoU1VCTUFLRSkgY2xvYmJlcikgfHwgZXhpdCAkJD8gOyBkb25lCmRpZmYgLS1naXQgYS9Eb2MvdG9vbHMvc2dtbGNvbnYvUkVBRE1FIGIvRG9jL3Rvb2xzL3NnbWxjb252L1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI1NjRlYi4uMDAwMDAwMAotLS0gYS9Eb2MvdG9vbHMvc2dtbGNvbnYvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotVGhlc2Ugc2NyaXB0cyBhbmQgTWFrZWZpbGUgZnJhZ21lbnQgYXJlIHVzZWQgdG8gY29udmVydCB0aGUgUHl0aG9uCi1kb2N1bWVudGF0aW9uIGluIExhVGVYIGZvcm1hdCB0byBYTUwuCi0KLVRoaXMgbWF0ZXJpYWwgaXMgcHJlbGltaW5hcnkgYW5kIGluY29tcGxldGUuICBQeXRob24gMi4wIGlzIHJlcXVpcmVkLgotCi1UbyBjb252ZXJ0IGFsbCBkb2N1bWVudHMgdG8gWE1MOgotCi0JY2QgRG9jLwotCW1ha2UgLWYgdG9vbHMvc2dtbGNvbnYvTWFrZWZpbGUKLQotVG8gY29udmVydCBvbmUgZG9jdW1lbnQgdG8gWE1MOgotCi0JY2QgRG9jLzxkb2N1bWVudC1kaXI+Ci0JbWFrZSAtZiAuLi90b29scy9zZ21sY29udi9tYWtlLnJ1bGVzIFRPT0xTRElSPS4uL3Rvb2xzCi0KLVBsZWFzZSBzZW5kIGNvbW1lbnRzIGFuZCBidWcgcmVwb3J0cyB0byBkb2NzQHB5dGhvbi5vcmcuCi0KLQotV2hhdCBkbyB0aGUgdG9vbHMgZG8/Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbGF0ZXgyZXNpcy5weQotICAgIFJlYWRzIGluIGEgY29udmVyc2lvbiBzcGVjaWZpY2F0aW9uIHdyaXR0ZW4gaW4gWE1MCi0gICAgKGNvbnZlcnNpb24ueG1sKSwgcmVhZHMgYSBMYVRlWCBkb2N1bWVudCBmcmFnbWVudCwgYW5kIGludGVycHJldHMKLSAgICB0aGUgbWFya3VwIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWNhdGlvbi4gIFRoZSBvdXRwdXQgaXMgYSBzdHJlYW0KLSAgICBvZiBFU0lTIGV2ZW50cyBsaWtlIHRob3NlIGNyZWF0ZWQgYnkgdGhlIG5zZ21scyBTR01MIHBhcnNlciwgYnV0Ci0gICAgaXMgKm5vdCogZ3VhcmFudGVlZCB0byByZXByZXNlbnQgYSBzaW5nbGUgdHJlZSEgIFRoaXMgaXMgZG9uZSB0bwotICAgIGFsbG93IGNvbnZlcnNpb24gcGVyIGVudGl0eSByYXRoZXIgdGhhbiBwZXIgZG9jdW1lbnQuICBTaW5jZSBtYW55Ci0gICAgb2YgdGhlIExhVGVYIGZpbGVzIGZvciB0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24gY29udGFpbiB0d28KLSAgICBzZWN0aW9ucyBvbiBjbG9zZWx5IHJlbGF0ZWQgbW9kdWxlcywgaXQgaXMgaW1wb3J0YW50IHRvIGFsbG93IGJvdGgKLSAgICBvZiB0aGUgcmVzdWx0aW5nIDxzZWN0aW9uPiBlbGVtZW50cyB0byBleGlzdCBpbiB0aGUgc2FtZSBvdXRwdXQKLSAgICBzdHJlYW0uICBBZGRpdGlvbmFsbHksIHNpbmNlIGNvbW1lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluIEVTSVMsCi0gICAgY29tbWVudHMgYXJlIGNvbnZlcnRlZCB0byA8Q09NTUVOVD4gZWxlbWVudHMsIHdoaWNoIG1pZ2h0IGV4aXN0IGF0Ci0gICAgdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIHRvcC1sZXZlbCBjb250ZW50IGVsZW1lbnRzLgotCi0gICAgVGhlIG91dHB1dCBvZiBsYXRleDJlc2lzLnB5IGdldHMgc2F2ZWQgYXMgPGZpbGVuYW1lPi5lc2lzMS4KLQotZG9jZml4ZXIucHkKLSAgICBUaGlzIGlzIHRoZSByZWFsbHkgcGFpbmZ1bCBwYXJ0IG9mIHRoZSBjb252ZXJzaW9uLiAgV2VsbCwgaXQncyB0aGUgCi0gICAgc2Vjb25kIHJlYWxseSBwYWluZnVsIHBhcnQsIGJ1dCBtb3JlIG9mIHRoZSBwYWluIGlzIHNwZWNpZmljIHRvCi0gICAgdGhlIHN0cnVjdHVyZSBvZiB0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24gYW5kIGRlc2lyZWQgb3V0cHV0Ci0gICAgcmF0aGVyIHRoYW4gdG8gdGhlIHBhcnNpbmcgb2YgTGFUZVggbWFya3VwLgotCi0gICAgVGhpcyBzY3JpcHQgbG9hZHMgdGhlIEVTSVMgZGF0YSBjcmVhdGVkIGJ5IGxhdGV4MmVzaXMucHkgaW50byBhCi0gICAgRE9NIGRvY3VtZW50ICpmcmFnbWVudCogKHJlbWVtYmVyLCB0aGUgbGF0ZXgyZXNpcy5weSBvdXRwdXQgbWF5Ci0gICAgbm90IGJlIHdlbGwtZm9ybWVkKS4gIE9uY2UgbG9hZGVkLCBpdCB3YWxrcyBvdmVyIHRoZSB0cmVlIG1hbnkKLSAgICB0aW1lcyBsb29raW5nIGZvciBhIHZhcmlldHkgb2YgcG9zc2libGUgc3BlY2lmaWMKLSAgICBtaWNyby1jb252ZXJzaW9ucy4gIE1vc3Qgb2YgdGhlIGNvZGUgaXMgbm90IGluIGFueSB3YXkgImdlbmVyYWwiLgotICAgIEFmdGVyIHByb2Nlc3NpbmcgdGhlIGZyYWdtZW50LCBhIG5ldyBFU0lTIGRhdGEgc3RyZWFtIGlzIHdyaXR0ZW4KLSAgICBvdXQuICBMaWtlIHRoZSBpbnB1dCwgaXQgbWF5IG5vdCByZXByZXNlbnQgYSB3ZWxsLWZvcm1lZAotICAgIGRvY3VtZW50LCBidXQgZG9lcyByZXByZXNlbnQgYSBwYXJzZWQgZW50aXR5LgotCi0gICAgVGhlIG91dHB1dCBvZiBkb2NmaXhlci5weSBpcyB3aGF0IGdldHMgc2F2ZWQgaW4gPGZpbGVuYW1lPi5lc2lzLgotCi1lc2lzMnNnbWwucHkKLSAgICBSZWFkcyBhbiBFU0lTIHN0cmVhbSBhbmQgY29udmVydCB0byBTR01MIG9yIFhNTC4gIFRoaXMgYWxzbwotICAgIGNvbnZlcnRzIDxDT01NRU5UPiBlbGVtZW50cyB0byByZWFsIGNvbW1lbnRzLiAgVGhpcyB3b3JrcyBxdWlja2x5Ci0gICAgYmVjYXVzZSB0aGVyZSdzIG5vdCBtdWNoIHRvIGFjdHVhbGx5IGRvLgpkaWZmIC0tZ2l0IGEvRG9jL3Rvb2xzL3NnbWxjb252L2NvbnZlcnNpb24ueG1sIGIvRG9jL3Rvb2xzL3NnbWxjb252L2NvbnZlcnNpb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDE1MWY0Li4wMDAwMDAwCi0tLSBhL0RvYy90b29scy9zZ21sY29udi9jb252ZXJzaW9uLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIj8+Ci08Y29udmVyc2lvbj4KLSAgPCEtLSBNaXNjZWxsYW5lb3VzLiAtLT4KLSAgPG1hY3JvIG5hbWU9ImRlY2xhcmVtb2R1bGUiPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIG9wdGlvbmFsPSJ5ZXMiLz4KLSAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiLz4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiLz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0ibW9kdWxlc3lub3BzaXMiPgotICAgIDxjb250ZW50Lz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0icGxhdGZvcm0iPgotICAgIDxjb250ZW50Lz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0iZGVwcmVjYXRlZCI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIi8+Ci0gICAgPGNvbnRlbnQvPgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJsYWJlbCI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIvPgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJub2RlbmFtZSIgb3V0cHV0bmFtZT0ibGFiZWwiPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiLz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0ibG9jYWxtb2R1bGV0YWJsZSIvPgotICA8bWFjcm8gbmFtZT0ibWFucGFnZSI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIi8+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJzZWN0aW9uIi8+Ci0gICAgPC9tYWNybz4KLSAgPG1hY3JvIG5hbWU9Im1vZHVsZSI+Ci0gICAgPGNvbnRlbnQvPgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJtb2R1bGVhdXRob3IiPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIvPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iZW1haWwiLz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0iY2l0ZXRpdGxlIj4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImhyZWYiIG9wdGlvbmFsPSJ5ZXMiLz4KLSAgICA8Y29udGVudC8+Ci0gICAgPC9tYWNybz4KLSAgPG1hY3JvIG5hbWU9InBlcCI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJudW0iLz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0icmZjIj4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im51bSIvPgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJzZWN0aW9uYXV0aG9yIiBvdXRwdXRuYW1lPSJhdXRob3IiPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIvPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iZW1haWwiLz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0iYXV0aG9yIj4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiLz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0iYXV0aG9yYWRkcmVzcyI+Ci0gICAgPGNvbnRlbnQvPgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJzaG9ydHZlcnNpb24iLz4KLSAgPG1hY3JvIG5hbWU9Im5vdGUiPgotICAgIDxjb250ZW50Lz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0id2FybmluZyI+Ci0gICAgPGNvbnRlbnQvPgotICAgIDwvbWFjcm8+Ci0gIDxlbnZpcm9ubWVudCBuYW1lPSJub3RpY2UiPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0icm9sZSIgb3B0aW9uYWw9InllcyIvPgotICAgIDwvZW52aXJvbm1lbnQ+Ci0KLSAgPG1hY3JvIG5hbWU9Im1lbnVzZWxlY3Rpb24iPgotICAgIDxjb250ZW50Lz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0ic3ViIi8+Ci0KLSAgPCEtLSBUaGVzZSBhcmUgYnJva2VuOiAgd2UgbmVlZCB0byByZS1vcmRlciB0aGUgb3B0aW9uYWwgYW5kIHJlcXVpcmVkCi0gICAgICAgcGFyYW1ldGVycywgbWFraW5nIHRoZSBvcHRpb25hbCBwYXJhbWV0ZXIgdGhlIGNvbnRlbnQgZm9yIHRoZQotICAgICAgIGVsZW1lbnQuICBsYXRleDJlc2lzLnB5IGlzIG5vdCBwb3dlcmZ1bCBlbm91Z2ggdG8gaGFuZGxlIHRoaXMuCi0gICAgLS0+Ci0gIDxtYWNybyBuYW1lPSJ2ZXJzaW9uYWRkZWQiPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5mbyIgb3B0aW9uYWw9InllcyIvPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIvPgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJ2ZXJzaW9uY2hhbmdlZCI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJpbmZvIiBvcHRpb25hbD0ieWVzIi8+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIi8+Ci0gICAgPC9tYWNybz4KLQotICA8IS0tIE1vZHVsZSByZWZlcmVuY2luZy4gLS0+Ci0gIDxtYWNybyBuYW1lPSJyZWZtb2R1bGUiIG91dHB1dG5hbWU9Im1vZHVsZSI+Ci0gICAgPCEtLSB0aGlzIGNhdXNlcyB0aGUgb3B0aW9uYWwgcGFyYW1ldGVyIHRvIFxyZWZtb2R1bGUgdG8gYmUKLSAgICAgICAgIGRpc2NhcmRlZCAtLT4KLSAgICA8YXR0cmlidXRlIG5hbWU9IiIgb3B0aW9uYWw9InllcyIvPgotICAgIDxjb250ZW50Lz4KLSAgICA8L21hY3JvPgotCi0gIDwhLS0gSW5mb3JtYXRpb24gdW5pdHMuIC0tPgotICA8IS0tIEMgdGhpbmdzLiAtLT4KLSAgPGVudmlyb25tZW50IG5hbWU9ImNmdW5jZGVzYyI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIi8+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIi8+Ci0gICAgPGNoaWxkIG5hbWU9ImFyZ3MiLz4KLSAgICA8L2Vudmlyb25tZW50PgotICA8ZW52aXJvbm1lbnQgbmFtZT0iY3NpbXBsZW1hY3JvZGVzYyI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIi8+Ci0gICAgPC9lbnZpcm9ubWVudD4KLSAgPGVudmlyb25tZW50IG5hbWU9ImN0eXBlZGVzYyI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YWciIG9wdGlvbmFsPSJ5ZXMiLz4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiLz4KLSAgICA8L2Vudmlyb25tZW50PgotICA8ZW52aXJvbm1lbnQgbmFtZT0iY3ZhcmRlc2MiPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIvPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIvPgotICAgIDwvZW52aXJvbm1lbnQ+Ci0KLSAgPCEtLSBQeXRob24gdGhpbmdzLiAtLT4KLSAgPG1hY3JvIG5hbWU9Im9wdGlvbmFsIj4KLSAgICA8Y29udGVudC8+Ci0gICAgPC9tYWNybz4KLSAgPG1hY3JvIG5hbWU9InVuc3BlY2lmaWVkIi8+Ci0gIDxtYWNybyBuYW1lPSJtb3JlYXJncyIvPgotICA8ZW52aXJvbm1lbnQgbmFtZT0iY2xhc3NkZXNjIj4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiLz4KLSAgICA8Y2hpbGQgbmFtZT0iYXJncyIvPgotICAgIDwvZW52aXJvbm1lbnQ+Ci0gIDxlbnZpcm9ubWVudCBuYW1lPSJjbGFzc2Rlc2MqIiBvdXRwdXRuYW1lPSJjbGFzc2Rlc2MiPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIvPgotICAgIDwvZW52aXJvbm1lbnQ+Ci0gIDxlbnZpcm9ubWVudCBuYW1lPSJkYXRhZGVzYyI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIi8+Ci0gICAgPC9lbnZpcm9ubWVudD4KLSAgPGVudmlyb25tZW50IG5hbWU9ImRhdGFkZXNjbmkiIG91dHB1dG5hbWU9ImRhdGFkZXNjIj4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImluZGV4Ij5ubzwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIvPgotICAgIDwvZW52aXJvbm1lbnQ+Ci0gIDxtYWNybyBuYW1lPSJkYXRhbGluZSI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIi8+Ci0gICAgPC9tYWNybz4KLSAgPGVudmlyb25tZW50IG5hbWU9ImV4Y2NsYXNzZGVzYyI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIi8+Ci0gICAgPGNoaWxkIG5hbWU9ImFyZ3MiLz4KLSAgICA8L2Vudmlyb25tZW50PgotICA8ZW52aXJvbm1lbnQgbmFtZT0iZXhjZGVzYyI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIi8+Ci0gICAgPC9lbnZpcm9ubWVudD4KLQotICA8ZW52aXJvbm1lbnQgbmFtZT0iZnVuY2Rlc2MiPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIvPgotICAgIDxjaGlsZCBuYW1lPSJhcmdzIi8+Ci0gICAgPC9lbnZpcm9ubWVudD4KLSAgPG1hY3JvIG5hbWU9ImZ1bmNsaW5lIj4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiLz4KLSAgICA8Y2hpbGQgbmFtZT0iYXJncyIvPgotICAgIDwvbWFjcm8+Ci0gIDxlbnZpcm9ubWVudCBuYW1lPSJmdW5jZGVzY25pIiBvdXRwdXRuYW1lPSJmdW5jZGVzYyI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJpbmRleCI+bm88L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiLz4KLSAgICA8Y2hpbGQgbmFtZT0iYXJncyIvPgotICAgIDwvZW52aXJvbm1lbnQ+Ci0gIDxtYWNybyBuYW1lPSJmdW5jbGluZW5pIiBvdXRwdXRuYW1lPSJmdW5jbGluZSI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJpbmRleCI+bm88L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiLz4KLSAgICA8Y2hpbGQgbmFtZT0iYXJncyIvPgotICAgIDwvbWFjcm8+Ci0KLSAgPGVudmlyb25tZW50IG5hbWU9Im1lbWJlcmRlc2MiPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIG9wdGlvbmFsPSJ5ZXMiLz4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiLz4KLSAgICA8L2Vudmlyb25tZW50PgotICA8ZW52aXJvbm1lbnQgbmFtZT0ibWVtYmVyZGVzY25pIiBvdXRwdXRuYW1lPSJtZW1iZXJkZXNjIj4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImluZGV4Ij5ubzwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIG9wdGlvbmFsPSJ5ZXMiLz4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiLz4KLSAgICA8L2Vudmlyb25tZW50PgotICA8bWFjcm8gbmFtZT0ibWVtYmVybGluZSI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIi8+Ci0gICAgPC9tYWNybz4KLQotICA8ZW52aXJvbm1lbnQgbmFtZT0ibWV0aG9kZGVzYyI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgb3B0aW9uYWw9InllcyIvPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIvPgotICAgIDxjaGlsZCBuYW1lPSJhcmdzIi8+Ci0gICAgPC9lbnZpcm9ubWVudD4KLSAgPG1hY3JvIG5hbWU9Im1ldGhvZGxpbmUiPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIG9wdGlvbmFsPSJ5ZXMiLz4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiLz4KLSAgICA8Y2hpbGQgbmFtZT0iYXJncyIvPgotICAgIDwvbWFjcm8+Ci0gIDxlbnZpcm9ubWVudCBuYW1lPSJtZXRob2RkZXNjbmkiPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5kZXgiPm5vPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgb3B0aW9uYWw9InllcyIvPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIvPgotICAgIDxjaGlsZCBuYW1lPSJhcmdzIi8+Ci0gICAgPC9lbnZpcm9ubWVudD4KLSAgPG1hY3JvIG5hbWU9Im1ldGhvZGxpbmVuaSIgb3V0cHV0bmFtZT0ibWV0aG9kbGluZSI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJpbmRleCI+bm88L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiBvcHRpb25hbD0ieWVzIi8+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIi8+Ci0gICAgPGNoaWxkIG5hbWU9ImFyZ3MiLz4KLSAgICA8L21hY3JvPgotCi0gIDxlbnZpcm9ubWVudCBuYW1lPSJvcGNvZGVkZXNjIj4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiLz4KLSAgICA8YXR0cmlidXRlIG5hbWU9InZhciIvPgotICAgIDwvZW52aXJvbm1lbnQ+Ci0KLSAgPCEtLSAiU2VlIGFsc286IiBzZWN0aW9ucy4gLS0+Ci0gIDxlbnZpcm9ubWVudCBuYW1lPSJzZWVhbHNvKiIgb3V0cHV0bmFtZT0ic2VlYWxzbyI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJzaWRlYmFyIj5ubzwvYXR0cmlidXRlPgotICAgIDwvZW52aXJvbm1lbnQ+Ci0gIDxtYWNybyBuYW1lPSJzZWVtb2R1bGUiPgotICAgIDwhLS0gdGhpcyBjYXVzZXMgdGhlIG9wdGlvbmFsIHBhcmFtZXRlciB0byBcc2VlbW9kdWxlIHRvIGJlCi0gICAgICAgICBkaXNjYXJkZWQgLS0+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSIiIG9wdGlvbmFsPSJ5ZXMiLz4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiLz4KLSAgICA8Y2hpbGQgbmFtZT0iZGVzY3JpcHRpb24iLz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0ic2VlcGVwIj4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im51bWJlciIvPgotICAgIDxjaGlsZCBuYW1lPSJ0aXRsZSIvPgotICAgIDxjaGlsZCBuYW1lPSJkZXNjcmlwdGlvbiIvPgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJzZWVyZmMiPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ibnVtYmVyIi8+Ci0gICAgPGNoaWxkIG5hbWU9InRpdGxlIi8+Ci0gICAgPGNoaWxkIG5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0gICAgPC9tYWNybz4KLSAgPG1hY3JvIG5hbWU9InNlZXRleHQiPgotICAgIDxjaGlsZCBuYW1lPSJkZXNjcmlwdGlvbiIvPgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJzZWV0aXRsZSI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJocmVmIiBvcHRpb25hbD0ieWVzIi8+Ci0gICAgPGNoaWxkIG5hbWU9InRpdGxlIi8+Ci0gICAgPGNoaWxkIG5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0gICAgPC9tYWNybz4KLSAgPG1hY3JvIG5hbWU9InNlZXVybCI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJocmVmIi8+Ci0gICAgPGNoaWxkIG5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0gICAgPC9tYWNybz4KLQotICA8IS0tIEluZGV4LWdlbmVyYXRpbmcgbWFya3VwLiAtLT4KLSAgPG1hY3JvIG5hbWU9ImluZGV4IiBvdXRwdXRuYW1lPSJpbmRleHRlcm0iPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0idGVybTEiLz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0iaW5kZXhpaSIgb3V0cHV0bmFtZT0iaW5kZXh0ZXJtIj4KLSAgICA8YXR0cmlidXRlIG5hbWU9InRlcm0xIi8+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJ0ZXJtMiIvPgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJpbmRleGlpaSIgb3V0cHV0bmFtZT0iaW5kZXh0ZXJtIj4KLSAgICA8YXR0cmlidXRlIG5hbWU9InRlcm0xIi8+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJ0ZXJtMiIvPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0idGVybTMiLz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0iaW5kZXhpdiIgb3V0cHV0bmFtZT0iaW5kZXh0ZXJtIj4KLSAgICA8YXR0cmlidXRlIG5hbWU9InRlcm0xIi8+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJ0ZXJtMiIvPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0idGVybTMiLz4KLSAgICA8YXR0cmlidXRlIG5hbWU9InRlcm00Ii8+Ci0gICAgPC9tYWNybz4KLQotICA8bWFjcm8gbmFtZT0idHRpbmRleCIgb3V0cHV0bmFtZT0iaW5kZXh0ZXJtIj4KLSAgICA8YXR0cmlidXRlIG5hbWU9InN0eWxlIj50dDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0idGVybTEiLz4KLSAgICA8L21hY3JvPgotCi0gIDxtYWNybyBuYW1lPSJyZWZtb2RpbmRleCI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJtb2R1bGUiLz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0ic3Rtb2RpbmRleCI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJtb2R1bGUiLz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0icmVmYmltb2RpbmRleCIgb3V0cHV0bmFtZT0icmVmbW9kaW5kZXgiPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ibW9kdWxlIi8+Ci0gICAgPC9tYWNybz4KLSAgPG1hY3JvIG5hbWU9InJlZmV4bW9kaW5kZXgiIG91dHB1dG5hbWU9InJlZm1vZGluZGV4Ij4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im1vZHVsZSIvPgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJyZWZzdG1vZGluZGV4IiBvdXRwdXRuYW1lPSJyZWZtb2RpbmRleCI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJtb2R1bGUiLz4KLSAgICA8L21hY3JvPgotCi0gIDxtYWNybyBuYW1lPSJiaWZ1bmNpbmRleCI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIi8+Ci0gICAgPC9tYWNybz4KLSAgPG1hY3JvIG5hbWU9ImV4aW5kZXgiPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIvPgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJvYmluZGV4Ij4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiLz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0ia3dpbmRleCI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIi8+Ci0gICAgPC9tYWNybz4KLSAgPG1hY3JvIG5hbWU9Im9waW5kZXgiPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIvPgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJzdGluZGV4Ij4KLSAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiLz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0id2l0aHN1Yml0ZW0iPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0idGV4dCIvPgotICAgIDxjb250ZW50Lz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0ic2V0aW5kZXhzdWJpdGVtIj4KLSAgICA8YXR0cmlidXRlIG5hbWU9InRleHQiLz4KLSAgICA8L21hY3JvPgotCi0gIDwhLS0gRW50aXR5IG1hbmFnZW1lbnQuIC0tPgotICA8bWFjcm8gbmFtZT0iaW5jbHVkZSIgb3V0cHV0bmFtZT0ieGk6aW5jbHVkZSI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJocmVmIi8+Ci0gICAgPC9tYWNybz4KLSAgPG1hY3JvIG5hbWU9ImlucHV0IiBvdXRwdXRuYW1lPSJ4aTppbmNsdWRlIj4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImhyZWYiLz4KLSAgICA8L21hY3JvPgotCi0gIDwhLS0gTGFyZ2Utc2NhbGUgZG9jdW1lbnQgc3RydWN0dXJlLiAtLT4KLSAgPG1hY3JvIG5hbWU9ImRvY3VtZW50Y2xhc3MiPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NuYW1lIi8+Ci0gICAgPC9tYWNybz4KLQotICA8bWFjcm8gbmFtZT0idXNlcGFja2FnZSI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJvcHRpb25zIiBvcHRpb25hbD0ieWVzIi8+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJwa2ciLz4KLSAgICA8L21hY3JvPgotCi0gIDxlbnZpcm9ubWVudCBuYW1lPSJkb2N1bWVudCIKLSAgICAgICAgICAgICAgIGVuZGNsb3Nlcz0iY2hhcHRlciBjaGFwdGVyKiBzZWN0aW9uIHNlY3Rpb24qCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNlY3Rpb24gc3Vic2VjdGlvbioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3Vic2VjdGlvbiBzdWJzdWJzZWN0aW9uKgotICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhZ3JhcGggcGFyYWdyYXBoKiBzdWJwYXJhZ3JhcGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3VicGFyYWdyYXBoKiI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJ4bWxuczp4aSIKLSAgICAgID5odHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlPC9hdHRyaWJ1dGU+Ci0gICAgPC9lbnZpcm9ubWVudD4KLQotICA8bWFjcm8gbmFtZT0iY2hhcHRlciIKLSAgICAgICAgIGNsb3Nlcz0iY2hhcHRlciBjaGFwdGVyKiBzZWN0aW9uIHNlY3Rpb24qIHN1YnNlY3Rpb24gc3Vic2VjdGlvbioKLSAgICAgICAgICAgICAgICAgc3Vic3Vic2VjdGlvbiBzdWJzdWJzZWN0aW9uKgotICAgICAgICAgICAgICAgICBwYXJhZ3JhcGggcGFyYWdyYXBoKiBzdWJwYXJhZ3JhcGggc3VicGFyYWdyYXBoKiI+Ci0gICAgPHRleHQ+Ci08L3RleHQ+Ci0gICAgPGNoaWxkIG5hbWU9InRpdGxlIi8+Ci0gICAgPGNvbnRlbnQgaW1wbGllZD0ieWVzIi8+Ci0gICAgPC9tYWNybz4KLSAgPG1hY3JvIG5hbWU9ImNoYXB0ZXIqIiBvdXRwdXRuYW1lPSJjaGFwdGVyIgotICAgICAgICAgY2xvc2VzPSJjaGFwdGVyIGNoYXB0ZXIqIHNlY3Rpb24gc2VjdGlvbiogc3Vic2VjdGlvbiBzdWJzZWN0aW9uKgotICAgICAgICAgICAgICAgICBzdWJzdWJzZWN0aW9uIHN1YnN1YnNlY3Rpb24qCi0gICAgICAgICAgICAgICAgIHBhcmFncmFwaCBwYXJhZ3JhcGgqIHN1YnBhcmFncmFwaCBzdWJwYXJhZ3JhcGgqIj4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im51bWJlcmVkIj5ubzwvYXR0cmlidXRlPgotICAgIDx0ZXh0PgotPC90ZXh0PgotICAgIDxjaGlsZCBuYW1lPSJ0aXRsZSIvPgotICAgIDxjb250ZW50IGltcGxpZWQ9InllcyIvPgotICAgIDwvbWFjcm8+Ci0KLSAgPG1hY3JvIG5hbWU9InNlY3Rpb24iCi0gICAgICAgICBjbG9zZXM9InNlY3Rpb24gc2VjdGlvbiogc3Vic2VjdGlvbiBzdWJzZWN0aW9uKgotICAgICAgICAgICAgICAgICBzdWJzdWJzZWN0aW9uIHN1YnN1YnNlY3Rpb24qCi0gICAgICAgICAgICAgICAgIHBhcmFncmFwaCBwYXJhZ3JhcGgqIHN1YnBhcmFncmFwaCBzdWJwYXJhZ3JhcGgqIj4KLSAgICA8dGV4dD4KLTwvdGV4dD4KLSAgICA8Y2hpbGQgbmFtZT0idGl0bGUiLz4KLSAgICA8Y29udGVudCBpbXBsaWVkPSJ5ZXMiLz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0ic2VjdGlvbioiIG91dHB1dG5hbWU9InNlY3Rpb24iCi0gICAgICAgICBjbG9zZXM9InNlY3Rpb24gc2VjdGlvbiogc3Vic2VjdGlvbiBzdWJzZWN0aW9uKgotICAgICAgICAgICAgICAgICBzdWJzdWJzZWN0aW9uIHN1YnN1YnNlY3Rpb24qCi0gICAgICAgICAgICAgICAgIHBhcmFncmFwaCBwYXJhZ3JhcGgqIHN1YnBhcmFncmFwaCBzdWJwYXJhZ3JhcGgqIj4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im51bWJlcmVkIj5ubzwvYXR0cmlidXRlPgotICAgIDx0ZXh0PgotPC90ZXh0PgotICAgIDxjaGlsZCBuYW1lPSJ0aXRsZSIvPgotICAgIDxjb250ZW50IGltcGxpZWQ9InllcyIvPgotICAgIDwvbWFjcm8+Ci0KLSAgPG1hY3JvIG5hbWU9InN1YnNlY3Rpb24iCi0gICAgICAgICBjbG9zZXM9InN1YnNlY3Rpb24gc3Vic2VjdGlvbiogc3Vic3Vic2VjdGlvbiBzdWJzdWJzZWN0aW9uKgotICAgICAgICAgICAgICAgICBwYXJhZ3JhcGggcGFyYWdyYXBoKiBzdWJwYXJhZ3JhcGggc3VicGFyYWdyYXBoKiI+Ci0gICAgPHRleHQ+Ci08L3RleHQ+Ci0gICAgPGNoaWxkIG5hbWU9InRpdGxlIi8+Ci0gICAgPGNvbnRlbnQgaW1wbGllZD0ieWVzIi8+Ci0gICAgPC9tYWNybz4KLSAgPG1hY3JvIG5hbWU9InN1YnNlY3Rpb24qIiBvdXRwdXRuYW1lPSJzdWJzZWN0aW9uIgotICAgICAgICAgY2xvc2VzPSJzdWJzZWN0aW9uIHN1YnNlY3Rpb24qIHN1YnN1YnNlY3Rpb24gc3Vic3Vic2VjdGlvbioKLSAgICAgICAgICAgICAgICAgcGFyYWdyYXBoIHBhcmFncmFwaCogc3VicGFyYWdyYXBoIHN1YnBhcmFncmFwaCoiPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ibnVtYmVyZWQiPm5vPC9hdHRyaWJ1dGU+Ci0gICAgPHRleHQ+Ci08L3RleHQ+Ci0gICAgPGNoaWxkIG5hbWU9InRpdGxlIi8+Ci0gICAgPGNvbnRlbnQgaW1wbGllZD0ieWVzIi8+Ci0gICAgPC9tYWNybz4KLQotICA8bWFjcm8gbmFtZT0ic3Vic3Vic2VjdGlvbiIKLSAgICAgICAgIGNsb3Nlcz0ic3Vic3Vic2VjdGlvbiBzdWJzdWJzZWN0aW9uKgotICAgICAgICAgICAgICAgICBwYXJhZ3JhcGggcGFyYWdyYXBoKiBzdWJwYXJhZ3JhcGggc3VicGFyYWdyYXBoKiI+Ci0gICAgPHRleHQ+Ci08L3RleHQ+Ci0gICAgPGNoaWxkIG5hbWU9InRpdGxlIi8+Ci0gICAgPGNvbnRlbnQgaW1wbGllZD0ieWVzIi8+Ci0gICAgPC9tYWNybz4KLSAgPG1hY3JvIG5hbWU9InN1YnN1YnNlY3Rpb24qIiBvdXRwdXRuYW1lPSJzdWJzdWJzZWN0aW9uIgotICAgICAgICAgY2xvc2VzPSJzdWJzdWJzZWN0aW9uIHN1YnN1YnNlY3Rpb24qCi0gICAgICAgICAgICAgICAgIHBhcmFncmFwaCBwYXJhZ3JhcGgqIHN1YnBhcmFncmFwaCBzdWJwYXJhZ3JhcGgqIj4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im51bWJlcmVkIj5ubzwvYXR0cmlidXRlPgotICAgIDx0ZXh0PgotPC90ZXh0PgotICAgIDxjaGlsZCBuYW1lPSJ0aXRsZSIvPgotICAgIDxjb250ZW50IGltcGxpZWQ9InllcyIvPgotICAgIDwvbWFjcm8+Ci0KLSAgPG1hY3JvIG5hbWU9InBhcmFncmFwaCIKLSAgICAgICAgIGNsb3Nlcz0icGFyYWdyYXBoIHBhcmFncmFwaCogc3VicGFyYWdyYXBoIHN1YnBhcmFncmFwaCoiPgotICAgIDx0ZXh0PgotPC90ZXh0PgotICAgIDxjaGlsZCBuYW1lPSJ0aXRsZSIvPgotICAgIDxjb250ZW50IGltcGxpZWQ9InllcyIvPgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJwYXJhZ3JhcGgqIiBvdXRwdXRuYW1lPSJwYXJhZ3JhcGgiCi0gICAgICAgICBjbG9zZXM9InBhcmFncmFwaCBwYXJhZ3JhcGgqIHN1YnBhcmFncmFwaCBzdWJwYXJhZ3JhcGgqIj4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im51bWJlcmVkIj5ubzwvYXR0cmlidXRlPgotICAgIDx0ZXh0PgotPC90ZXh0PgotICAgIDxjaGlsZCBuYW1lPSJ0aXRsZSIvPgotICAgIDxjb250ZW50IGltcGxpZWQ9InllcyIvPgotICAgIDwvbWFjcm8+Ci0KLSAgPG1hY3JvIG5hbWU9InN1YnBhcmFncmFwaCIKLSAgICAgICAgIGNsb3Nlcz0ic3VicGFyYWdyYXBoIHN1YnBhcmFncmFwaCoiPgotICAgIDx0ZXh0PgotPC90ZXh0PgotICAgIDxjaGlsZCBuYW1lPSJ0aXRsZSIvPgotICAgIDxjb250ZW50IGltcGxpZWQ9InllcyIvPgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJzdWJwYXJhZ3JhcGgqIiBvdXRwdXRuYW1lPSJzdWJwYXJhZ3JhcGgiCi0gICAgICAgICBjbG9zZXM9InN1YnBhcmFncmFwaCBzdWJwYXJhZ3JhcGgqIj4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im51bWJlcmVkIj5ubzwvYXR0cmlidXRlPgotICAgIDx0ZXh0PgotPC90ZXh0PgotICAgIDxjaGlsZCBuYW1lPSJ0aXRsZSIvPgotICAgIDxjb250ZW50IGltcGxpZWQ9InllcyIvPgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJ0aXRsZSI+Ci0gICAgPGNvbnRlbnQvPgotICAgIDwvbWFjcm8+Ci0KLSAgPG1hY3JvIG5hbWU9ImFwcGVuZGl4IiBvdXRwdXRuYW1lPSJiYWNrLW1hdHRlciIKLSAgICAgICAgIGNsb3Nlcz0iY2hhcHRlciBjaGFwdGVyKiBzZWN0aW9uIHN1YnNlY3Rpb24gc3Vic3Vic2VjdGlvbgotICAgICAgICAgICAgICAgICBwYXJhZ3JhcGggc3VicGFyYWdyYXBoIi8+Ci0KLSAgPGVudmlyb25tZW50IG5hbWU9Imxpc3QiCi0gICAgICAgICAgICAgICBlbmRjbG9zZXM9Iml0ZW0iPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iYnVsbGV0Ii8+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJpbml0Ii8+Ci0gICAgPC9lbnZpcm9ubWVudD4KLSAgPG1hY3JvIG5hbWU9Iml0ZW0iIGNsb3Nlcz0iaXRlbSI+Ci0gICAgPGNoaWxkIG5hbWU9ImxlYWRlciIgb3B0aW9uYWw9InllcyIvPgotICAgIDxjb250ZW50IGltcGxpZWQ9InllcyIvPgotICAgIDwvbWFjcm8+Ci0KLSAgPG1hY3JvIG5hbWU9InJlZiI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJyZWYiLz4KLSAgICA8L21hY3JvPgotCi0gIDxlbnZpcm9ubWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgb3V0cHV0bmFtZT0iZGVzY3JpcHRpb25saXN0IgotICAgICAgICAgICAgICAgZW5kY2xvc2VzPSJpdGVtIi8+Ci0KLSAgPGVudmlyb25tZW50IG5hbWU9ImVudW1lcmF0ZSIgb3V0cHV0bmFtZT0iZW51bWVyYXRpb24iCi0gICAgICAgICAgICAgICBlbmRjbG9zZXM9Iml0ZW0iLz4KLQotICA8ZW52aXJvbm1lbnQgbmFtZT0iZnVsbGxpbmVpdGVtcyIKLSAgICAgICAgICAgICAgIGVuZGNsb3Nlcz0iaXRlbSIvPgotCi0gIDxlbnZpcm9ubWVudCBuYW1lPSJpdGVtaXplIgotICAgICAgICAgICAgICAgZW5kY2xvc2VzPSJpdGVtIi8+Ci0KLSAgPGVudmlyb25tZW50IG5hbWU9ImRlZmluaXRpb25zIiBvdXRwdXRuYW1lPSJkZWZpbml0aW9ubGlzdCIKLSAgICAgICAgICAgICAgIGVuY2xvc2VzPSJ0ZXJtIi8+Ci0gIDxtYWNybyBuYW1lPSJ0ZXJtIiBjbG9zZXM9ImRlZmluaXRpb24iPgotICAgIDwhLS0gbm90IHJlYWxseSBvcHRpb25hbCwgYnV0IHVzZXMgdGhlIFtdIHN5bnRheCAtLT4KLSAgICA8Y2hpbGQgbmFtZT0idGVybSIgb3B0aW9uYWw9InllcyIvPgotICAgIDxjaGlsZCBuYW1lPSJkZWZpbml0aW9uIiBpbXBsaWVkPSJ5ZXMiLz4KLSAgICA8L21hY3JvPgotCi0gIDxlbnZpcm9ubWVudCBuYW1lPSJhbGx0dCIgb3V0cHV0bmFtZT0idmVyYmF0aW0iLz4KLSAgPGVudmlyb25tZW50IG5hbWU9ImNvbW1lbnQiIHZlcmJhdGltPSJ5ZXMiLz4KLSAgPGVudmlyb25tZW50IG5hbWU9InZlcmJhdGltIiB2ZXJiYXRpbT0ieWVzIi8+Ci0gIDxlbnZpcm9ubWVudCBuYW1lPSJ2ZXJiYXRpbSoiIHZlcmJhdGltPSJ5ZXMiPgotICAgIDwhLS0gbm90IHVzZWQgYW55d2hlcmUsIGJ1dCBpdCdzIGEgc3RhbmRhcmQgTGFUZVhpc20gLS0+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJzcGFjZXMiPnZpc2libGU8L2F0dHJpYnV0ZT4KLSAgICA8L2Vudmlyb25tZW50PgotICA8bWFjcm8gbmFtZT0idmVyYmF0aW1pbnB1dCIgb3VwdHV0bmFtZT0ieGk6aW5jbHVkZSI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXJzZSI+dGV4dDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iaHJlZiIvPgotICAgIDwvbWFjcm8+Ci0KLSAgPCEtLSBUYWJsZSBtYXJrdXAuIC0tPgotICA8bWFjcm8gbmFtZT0iaGxpbmUiLz4KLSAgPGVudmlyb25tZW50IG5hbWU9InRhYmxlaWkiIG91dHB1dG5hbWU9InRhYmxlIj4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImNvbHMiPjI8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImNvbHNwZWMiLz4KLSAgICA8YXR0cmlidXRlIG5hbWU9InN0eWxlIi8+Ci0gICAgPGNoaWxkIG5hbWU9ImVudHJ5Ii8+Ci0gICAgPHRleHQ+Ci0gICAgICAgICA8L3RleHQ+Ci0gICAgPGNoaWxkIG5hbWU9ImVudHJ5Ii8+Ci0gICAgPC9lbnZpcm9ubWVudD4KLSAgPGVudmlyb25tZW50IG5hbWU9Imxvbmd0YWJsZWlpIiBvdXRwdXRuYW1lPSJ0YWJsZSI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJjb2xzIj4yPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJjb2xzcGVjIi8+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJzdHlsZSIvPgotICAgIDxjaGlsZCBuYW1lPSJlbnRyeSIvPgotICAgIDx0ZXh0PgotICAgICAgICAgPC90ZXh0PgotICAgIDxjaGlsZCBuYW1lPSJlbnRyeSIvPgotICAgIDwvZW52aXJvbm1lbnQ+Ci0gIDxtYWNybyBuYW1lPSJsaW5laWkiIG91dHB1dG5hbWU9InJvdyI+Ci0gICAgPGNoaWxkIG5hbWU9ImVudHJ5Ii8+Ci0gICAgPHRleHQ+Ci0gICAgICAgICA8L3RleHQ+Ci0gICAgPGNoaWxkIG5hbWU9ImVudHJ5Ii8+Ci0gICAgPC9tYWNybz4KLQotICA8ZW52aXJvbm1lbnQgbmFtZT0idGFibGVpaWkiIG91dHB1dG5hbWU9InRhYmxlIj4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImNvbHMiPjM8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImNvbHNwZWMiLz4KLSAgICA8YXR0cmlidXRlIG5hbWU9InN0eWxlIi8+Ci0gICAgPGNoaWxkIG5hbWU9ImVudHJ5Ii8+Ci0gICAgPHRleHQ+Ci0gICAgICAgICA8L3RleHQ+Ci0gICAgPGNoaWxkIG5hbWU9ImVudHJ5Ii8+Ci0gICAgPHRleHQ+Ci0gICAgICAgICA8L3RleHQ+Ci0gICAgPGNoaWxkIG5hbWU9ImVudHJ5Ii8+Ci0gICAgPC9lbnZpcm9ubWVudD4KLSAgPGVudmlyb25tZW50IG5hbWU9Imxvbmd0YWJsZWlpaSIgb3V0cHV0bmFtZT0idGFibGUiPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29scyI+MzwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29sc3BlYyIvPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3R5bGUiLz4KLSAgICA8Y2hpbGQgbmFtZT0iZW50cnkiLz4KLSAgICA8dGV4dD4KLSAgICAgICAgIDwvdGV4dD4KLSAgICA8Y2hpbGQgbmFtZT0iZW50cnkiLz4KLSAgICA8dGV4dD4KLSAgICAgICAgIDwvdGV4dD4KLSAgICA8Y2hpbGQgbmFtZT0iZW50cnkiLz4KLSAgICA8L2Vudmlyb25tZW50PgotICA8bWFjcm8gbmFtZT0ibGluZWlpaSIgb3V0cHV0bmFtZT0icm93Ij4KLSAgICA8Y2hpbGQgbmFtZT0iZW50cnkiLz4KLSAgICA8dGV4dD4KLSAgICAgICAgIDwvdGV4dD4KLSAgICA8Y2hpbGQgbmFtZT0iZW50cnkiLz4KLSAgICA8dGV4dD4KLSAgICAgICAgIDwvdGV4dD4KLSAgICA8Y2hpbGQgbmFtZT0iZW50cnkiLz4KLSAgICA8L21hY3JvPgotCi0gIDxlbnZpcm9ubWVudCBuYW1lPSJ0YWJsZWl2IiBvdXRwdXRuYW1lPSJ0YWJsZSI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJjb2xzIj40PC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJjb2xzcGVjIi8+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJzdHlsZSIvPgotICAgIDxjaGlsZCBuYW1lPSJlbnRyeSIvPgotICAgIDx0ZXh0PgotICAgICAgICAgPC90ZXh0PgotICAgIDxjaGlsZCBuYW1lPSJlbnRyeSIvPgotICAgIDx0ZXh0PgotICAgICAgICAgPC90ZXh0PgotICAgIDxjaGlsZCBuYW1lPSJlbnRyeSIvPgotICAgIDx0ZXh0PgotICAgICAgICAgPC90ZXh0PgotICAgIDxjaGlsZCBuYW1lPSJlbnRyeSIvPgotICAgIDwvZW52aXJvbm1lbnQ+Ci0gIDxlbnZpcm9ubWVudCBuYW1lPSJsb25ndGFibGVpdiIgb3V0cHV0bmFtZT0idGFibGUiPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29scyI+NDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29sc3BlYyIvPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3R5bGUiLz4KLSAgICA8Y2hpbGQgbmFtZT0iZW50cnkiLz4KLSAgICA8dGV4dD4KLSAgICAgICAgIDwvdGV4dD4KLSAgICA8Y2hpbGQgbmFtZT0iZW50cnkiLz4KLSAgICA8dGV4dD4KLSAgICAgICAgIDwvdGV4dD4KLSAgICA8Y2hpbGQgbmFtZT0iZW50cnkiLz4KLSAgICA8dGV4dD4KLSAgICAgICAgIDwvdGV4dD4KLSAgICA8Y2hpbGQgbmFtZT0iZW50cnkiLz4KLSAgICA8L2Vudmlyb25tZW50PgotICA8bWFjcm8gbmFtZT0ibGluZWl2IiBvdXRwdXRuYW1lPSJyb3ciPgotICAgIDxjaGlsZCBuYW1lPSJlbnRyeSIvPgotICAgIDx0ZXh0PgotICAgICAgICAgPC90ZXh0PgotICAgIDxjaGlsZCBuYW1lPSJlbnRyeSIvPgotICAgIDx0ZXh0PgotICAgICAgICAgPC90ZXh0PgotICAgIDxjaGlsZCBuYW1lPSJlbnRyeSIvPgotICAgIDx0ZXh0PgotICAgICAgICAgPC90ZXh0PgotICAgIDxjaGlsZCBuYW1lPSJlbnRyeSIvPgotICAgIDwvbWFjcm8+Ci0KLSAgPGVudmlyb25tZW50IG5hbWU9InRhYmxldiIgb3V0cHV0bmFtZT0idGFibGUiPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29scyI+NDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29sc3BlYyIvPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3R5bGUiLz4KLSAgICA8Y2hpbGQgbmFtZT0iZW50cnkiLz4KLSAgICA8dGV4dD4KLSAgICAgICAgIDwvdGV4dD4KLSAgICA8Y2hpbGQgbmFtZT0iZW50cnkiLz4KLSAgICA8dGV4dD4KLSAgICAgICAgIDwvdGV4dD4KLSAgICA8Y2hpbGQgbmFtZT0iZW50cnkiLz4KLSAgICA8dGV4dD4KLSAgICAgICAgIDwvdGV4dD4KLSAgICA8Y2hpbGQgbmFtZT0iZW50cnkiLz4KLSAgICA8L2Vudmlyb25tZW50PgotICA8ZW52aXJvbm1lbnQgbmFtZT0ibG9uZ3RhYmxldiIgb3V0cHV0bmFtZT0idGFibGUiPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29scyI+NDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29sc3BlYyIvPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3R5bGUiLz4KLSAgICA8Y2hpbGQgbmFtZT0iZW50cnkiLz4KLSAgICA8dGV4dD4KLSAgICAgICAgIDwvdGV4dD4KLSAgICA8Y2hpbGQgbmFtZT0iZW50cnkiLz4KLSAgICA8dGV4dD4KLSAgICAgICAgIDwvdGV4dD4KLSAgICA8Y2hpbGQgbmFtZT0iZW50cnkiLz4KLSAgICA8dGV4dD4KLSAgICAgICAgIDwvdGV4dD4KLSAgICA8Y2hpbGQgbmFtZT0iZW50cnkiLz4KLSAgICA8dGV4dD4KLSAgICAgICAgIDwvdGV4dD4KLSAgICA8Y2hpbGQgbmFtZT0iZW50cnkiLz4KLSAgICA8L2Vudmlyb25tZW50PgotICA8bWFjcm8gbmFtZT0ibGluZXYiIG91dHB1dG5hbWU9InJvdyI+Ci0gICAgPGNoaWxkIG5hbWU9ImVudHJ5Ii8+Ci0gICAgPHRleHQ+Ci0gICAgICAgICA8L3RleHQ+Ci0gICAgPGNoaWxkIG5hbWU9ImVudHJ5Ii8+Ci0gICAgPHRleHQ+Ci0gICAgICAgICA8L3RleHQ+Ci0gICAgPGNoaWxkIG5hbWU9ImVudHJ5Ii8+Ci0gICAgPHRleHQ+Ci0gICAgICAgICA8L3RleHQ+Ci0gICAgPGNoaWxkIG5hbWU9ImVudHJ5Ii8+Ci0gICAgPHRleHQ+Ci0gICAgICAgICA8L3RleHQ+Ci0gICAgPGNoaWxkIG5hbWU9ImVudHJ5Ii8+Ci0gICAgPC9tYWNybz4KLQotICA8IS0tIFRoZXNlIGFyZSBoYW5kbGVkIGF0IGEgbGF0ZXIgdHJhbnNsYXRpb24gc3RhZ2UsIGF0IGxlYXN0IGZvciBub3cuIC0tPgotICA8bWFjcm8gbmFtZT0iQ3BwIiBvdXRwdXRuYW1lPSIiPgotICAgIDx0ZXh0PkMrKzwvdGV4dD4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0iZ2VxIiBvdXRwdXRuYW1lPSIiPgotICAgIDxlbnRpdHlyZWYgbmFtZT0iZ2VxIi8+Ci0gICAgPC9tYWNybz4KLSAgPG1hY3JvIG5hbWU9ImluZmluaXR5IiBvdXRwdXRuYW1lPSIiPgotICAgIDxlbnRpdHlyZWYgbmFtZT0iaW5maW4iLz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0iTGFUZVgiIG91dHB1dG5hbWU9IiI+Ci0gICAgPHRleHQ+TGFUZVg8L3RleHQ+Ci0gICAgPC9tYWNybz4KLSAgPG1hY3JvIG5hbWU9Imxkb3RzIiBvdXRwdXRuYW1lPSIiPgotICAgIDx0ZXh0Pi4uLjwvdGV4dD4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0ibGVxIiBvdXRwdXRuYW1lPSIiPgotICAgIDxlbnRpdHlyZWYgbmFtZT0ibGVxIi8+Ci0gICAgPC9tYWNybz4KLSAgPG1hY3JvIG5hbWU9InBsdXNtaW51cyIgb3V0cHV0bmFtZT0iIj4KLSAgICA8ZW50aXR5cmVmIG5hbWU9InBsdXNtbiIvPgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJUZVgiIG91dHB1dG5hbWU9IiI+Ci0gICAgPHRleHQ+VGVYPC90ZXh0PgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJ2ZXJzaW9uIi8+Ci0KLSAgPCEtLSBEaXN0dXRpbHMgdGhpbmdzLiAtLT4KLSAgPG1hY3JvIG5hbWU9ImNvbW1hbmQiPgotICAgIDxjb250ZW50Lz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0ib3B0aW9uIj4KLSAgICA8Y29udGVudC8+Ci0gICAgPC9tYWNybz4KLSAgPG1hY3JvIG5hbWU9ImZpbGV2YXIiIG91dHB1dG5hbWU9InZhciI+Ci0gICAgPGNvbnRlbnQvPgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJYWFgiIG91dHB1dG5hbWU9ImVkaXRvcmlhbC1jb21tZW50Ij4KLSAgICA8Y29udGVudC8+Ci0gICAgPC9tYWNybz4KLQotICA8IS0tIEdyYW1tYXIgcHJvZHVjdGlvbiBsaXN0cyAtLT4KLSAgPGVudmlyb25tZW50IG5hbWU9InByb2R1Y3Rpb25saXN0Ij4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImdyYW1tYXIiIG9wdGlvbmFsPSJ5ZXMiLz4KLSAgICA8L2Vudmlyb25tZW50PgotICA8bWFjcm8gbmFtZT0icHJvZHVjdGlvbiI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJ0b2tlbiIvPgotICAgIDxjb250ZW50Lz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0icHJvZHVjdGlvbmNvbnQiPgotICAgIDxjb250ZW50Lz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0idG9rZW4iIG91dHB1dG5hbWU9ImdyYW1tYXJ0b2tlbiI+Ci0gICAgPGNvbnRlbnQvPgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJncmFtbWFydG9rZW4iPgotICAgIDxjb250ZW50Lz4KLSAgICA8L21hY3JvPgotCi0gIDwhLS0gTWlzYy4gLS0+Ci0gIDxtYWNybyBuYW1lPSJlbXBoIj4KLSAgICA8Y29udGVudC8+Ci0gICAgPC9tYWNybz4KLSAgPG1hY3JvIG5hbWU9InN0cm9uZyI+Ci0gICAgPGNvbnRlbnQvPgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJ0ZXh0cm0iPgotICAgIDxjb250ZW50Lz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0idGV4dHR0Ij4KLSAgICA8Y29udGVudC8+Ci0gICAgPC9tYWNybz4KLSAgPG1hY3JvIG5hbWU9ImNvZGUiPgotICAgIDxjb250ZW50Lz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0iZXhjZXB0aW9uIj4KLSAgICA8Y29udGVudC8+Ci0gICAgPC9tYWNybz4KLSAgPG1hY3JvIG5hbWU9ImtleXdvcmQiPgotICAgIDxjb250ZW50Lz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0ic2FtcCI+Ci0gICAgPGNvbnRlbnQvPgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJjbGFzcyI+Ci0gICAgPGNvbnRlbnQvPgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJjZGF0YSI+Ci0gICAgPGNvbnRlbnQvPgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJjZnVuY3Rpb24iPgotICAgIDxjb250ZW50Lz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0iY3NpbXBsZW1hY3JvIj4KLSAgICA8Y29udGVudC8+Ci0gICAgPC9tYWNybz4KLSAgPG1hY3JvIG5hbWU9ImN0eXBlIj4KLSAgICA8Y29udGVudC8+Ci0gICAgPC9tYWNybz4KLSAgPG1hY3JvIG5hbWU9InB5dHlwZSI+Ci0gICAgPGNvbnRlbnQvPgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJjaGFyYWN0ZXIiPgotICAgIDxjb250ZW50Lz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0iY29uc3RhbnQiPgotICAgIDxjb250ZW50Lz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0iZW52dmFyIiBvdXRwdXRuYW1lPSJlbnZhciI+Ci0gICAgPGNvbnRlbnQvPgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJmaWxlIiBvdXRwdXRuYW1lPSJmaWxlbmFtZSI+Ci0gICAgPGNvbnRlbnQvPgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJmaWxlbnEiIG91dHB1dG5hbWU9ImZpbGVuYW1lIj4KLSAgICA8YXR0cmlidXRlIG5hbWU9InF1b3RlIj5ubzwvYXR0cmlidXRlPgotICAgIDxjb250ZW50Lz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0iZnVuY3Rpb24iPgotICAgIDxjb250ZW50Lz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0ia2JkIiBvdXRwdXRuYW1lPSJrZXlzeW0iPgotICAgIDxjb250ZW50Lz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0ibWFpbGhlYWRlciI+Ci0gICAgPGNvbnRlbnQvPgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJtYWtldmFyIj4KLSAgICA8Y29udGVudC8+Ci0gICAgPC9tYWNybz4KLSAgPG1hY3JvIG5hbWU9Im1ldGhvZCI+Ci0gICAgPGNvbnRlbnQvPgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJtZW1iZXIiPgotICAgIDxjb250ZW50Lz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0ibWltZXR5cGUiPgotICAgIDxjb250ZW50Lz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0ibmV3c2dyb3VwIj4KLSAgICA8Y29udGVudC8+Ci0gICAgPC9tYWNybz4KLSAgPG1hY3JvIG5hbWU9InByb2dyYW0iIG91dHB1dG5hbWU9ImNvbW1hbmQiPgotICAgIDxjb250ZW50Lz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0icHJvZ3JhbW9wdCIgb3V0cHV0bmFtZT0ib3B0aW9uIj4KLSAgICA8Y29udGVudC8+Ci0gICAgPC9tYWNybz4KLSAgPG1hY3JvIG5hbWU9Imxvbmdwcm9ncmFtb3B0IiBvdXRwdXRuYW1lPSJsb25nb3B0aW9uIj4KLSAgICA8Y29udGVudC8+Ci0gICAgPC9tYWNybz4KLSAgPG1hY3JvIG5hbWU9InJlZ2V4cCI+Ci0gICAgPGNvbnRlbnQvPgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJ2YXIiPgotICAgIDxjb250ZW50Lz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0iZW1haWwiPgotICAgIDxjb250ZW50Lz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0idWxpbmsiPgotICAgIDwhLS0gb3JkZXIgb2YgdGhlIHBhcmFtZXRlcnMgbWFrZXMgdGhpcyBkaWZmaWN1bHQ7Ci0gICAgICAgICB3ZSdsbCBuZWVkIHRvIGZpeCBpdCB1cCB0byA8dWxpbmsgaHJlZj0iLi4uIj4uLi48L3VsaW5rPgotICAgICAgICAgaW4gZG9jZml4ZXIucHkuCi0gICAgICAtLT4KLSAgICA8Y2hpbGQgbmFtZT0idGV4dCIvPgotICAgIDxjaGlsZCBuYW1lPSJocmVmIi8+Ci0gICAgPC9tYWNybz4KLSAgPG1hY3JvIG5hbWU9InVybCI+Ci0gICAgPGNvbnRlbnQvPgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJmb290bm90ZSI+Ci0gICAgPGNvbnRlbnQvPgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJkZm4iIG91dHB1dG5hbWU9ImRlZmluZWR0ZXJtIj4KLSAgICA8Y29udGVudC8+Ci0gICAgPC9tYWNybz4KLQotICA8bWFjcm8gbmFtZT0ibWJveCI+Ci0gICAgPGNvbnRlbnQvPgotICAgIDwvbWFjcm8+Ci0KLSAgPCEtLSBtaW5pbWFsIG1hdGggc3R1ZmYgdG8gZ2V0IGJ5IC0tPgotICA8bWFjcm8gbmFtZT0icGkiLz4KLSAgPG1hY3JvIG5hbWU9InNxcnQiPgotICAgIDxjb250ZW50Lz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0iZnJhYyIgb3V0cHV0bmFtZT0iZnJhY3Rpb24iPgotICAgIDxjaGlsZCBuYW1lPSJudW1lcmF0b3IiLz4KLSAgICA8Y2hpbGQgbmFtZT0iZGVub21pbmF0b3IiLz4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0ic3VtIj4KLSAgICA8Y29udGVudC8+Ci0gICAgPC9tYWNybz4KLQotICA8bWFjcm8gbmFtZT0ibGVmdGxpbmUiIG91dHB1dG5hbWU9IiI+Ci0gICAgPGNvbnRlbnQvPgotICAgIDwvbWFjcm8+Ci0KLSAgPCEtLSBDb252ZXJzaW9ucyB0byB0ZXh0OyBwZXJoYXBzIGNvdWxkIGJlIGRpZmZlcmVudD8gIFRoZXJlJ3MgLS0+Ci0gIDwhLS0gbm8gd2F5IGZvciBhIHN0eWxlIHNoZWV0IHRvIHdvcmsgd2l0aCB0aGVzZSB0aGlzIHdheS4JIC0tPgotICA8bWFjcm8gbmFtZT0iQUJDIiBvdXRwdXRuYW1lPSIiPgotICAgIDx0ZXh0PkFCQzwvdGV4dD4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0iQVNDSUkiIG91dHB1dG5hbWU9IiI+Ci0gICAgPHRleHQ+QVNDSUk8L3RleHQ+Ci0gICAgPC9tYWNybz4KLSAgPG1hY3JvIG5hbWU9IkMiIG91dHB1dG5hbWU9IiI+Ci0gICAgPHRleHQ+QzwvdGV4dD4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0iRU9GIiBvdXRwdXRuYW1lPSIiPgotICAgIDx0ZXh0PkVPRjwvdGV4dD4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0iZSIgb3V0cHV0bmFtZT0iIj4KLSAgICA8dGV4dD5cPC90ZXh0PgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJOVUxMIiBvdXRwdXRuYW1lPSJjb25zdGFudCI+Ci0gICAgPHRleHQ+TlVMTDwvdGV4dD4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0iUE9TSVgiIG91dHB1dG5hbWU9IiI+Ci0gICAgPHRleHQ+UE9TSVg8L3RleHQ+Ci0gICAgPC9tYWNybz4KLSAgPG1hY3JvIG5hbWU9IlVOSVgiIG91dHB1dG5hbWU9IiI+Ci0gICAgPHRleHQ+VW5peDwvdGV4dD4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0idGV4dGFzY2lpY2lyY3VtIiBvdXRwdXRuYW1lPSIiPgotICAgIDx0ZXh0Pl48L3RleHQ+Ci0gICAgPC9tYWNybz4KLSAgPG1hY3JvIG5hbWU9InRleHRhc2NpaXRpbGRlIiBvdXRwdXRuYW1lPSIiPgotICAgIDx0ZXh0Pn48L3RleHQ+Ci0gICAgPC9tYWNybz4KLSAgPG1hY3JvIG5hbWU9InRleHRiYWNrc2xhc2giIG91dHB1dG5hbWU9IiI+Ci0gICAgPHRleHQ+XDwvdGV4dD4KLSAgICA8L21hY3JvPgotICA8bWFjcm8gbmFtZT0idGV4dGJhciIgb3V0cHV0bmFtZT0iIj4KLSAgICA8dGV4dD58PC90ZXh0PgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJ0ZXh0Z3JlYXRlciIgb3V0cHV0bmFtZT0iIj4KLSAgICA8dGV4dD4mZ3Q7PC90ZXh0PgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJ0ZXh0bGVzcyIgb3V0cHV0bmFtZT0iIj4KLSAgICA8dGV4dD4mbHQ7PC90ZXh0PgotICAgIDwvbWFjcm8+Ci0KLSAgPCEtLSBUaGVzZSB3aWxsIGVuZCB1cCBkaXNhcHBlYXJpbmcgYXMgd2VsbCEgLS0+Ci0gIDxtYWNybyBuYW1lPSJjYXRjb2RlIiBvdXRwdXRuYW1lPSIiLz4KLSAgPG1hY3JvIG5hbWU9ImZpIiBvdXRwdXRuYW1lPSIiLz4KLSAgPG1hY3JvIG5hbWU9ImlmaHRtbCIgb3V0cHV0bmFtZT0iIi8+Ci0gIDxtYWNybyBuYW1lPSJpbmRleG5hbWUiIG91dHB1dG5hbWU9IiIvPgotICA8bWFjcm8gbmFtZT0ibGFiZWx3aWR0aCIgb3V0cHV0bmFtZT0iIi8+Ci0gIDxtYWNybyBuYW1lPSJsYXJnZSIgb3V0cHV0bmFtZT0iIi8+Ci0gIDxtYWNybyBuYW1lPSJsZWZ0bWFyZ2luIiBvdXRwdXRuYW1lPSIiLz4KLSAgPG1hY3JvIG5hbWU9Im1ha2VpbmRleCIgb3V0cHV0bmFtZT0iIi8+Ci0gIDxtYWNybyBuYW1lPSJtYWtlbW9kaW5kZXgiIG91dHB1dG5hbWU9IiIvPgotICA8bWFjcm8gbmFtZT0ibWFrZXRpdGxlIiBvdXRwdXRuYW1lPSIiLz4KLSAgPG1hY3JvIG5hbWU9Im5vaW5kZW50IiBvdXRwdXRuYW1lPSIiLz4KLSAgPG1hY3JvIG5hbWU9InByb3RlY3QiIG91dHB1dG5hbWU9IiIvPgotICA8bWFjcm8gbmFtZT0idGV4dHdpZHRoIi8+Ci0gIDxtYWNybyBuYW1lPSJyZW5ld2NvbW1hbmQiPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWFjcm8iLz4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im5hcmdzIiBvcHRpb25hbD0ieWVzIi8+Ci0gICAgPGNvbnRlbnQvPgotICAgIDwvbWFjcm8+Ci0gIDxtYWNybyBuYW1lPSJ0YWJsZW9mY29udGVudHMiIG91dHB1dG5hbWU9IiIvPgotICA8bWFjcm8gbmFtZT0idnNwYWNlIj4KLSAgICA8YXR0cmlidXRlIG5hbWU9InNpemUiLz4KLSAgICA8L21hY3JvPgotPC9jb252ZXJzaW9uPgpkaWZmIC0tZ2l0IGEvRG9jL3Rvb2xzL3NnbWxjb252L2RvY2ZpeGVyLnB5IGIvRG9jL3Rvb2xzL3NnbWxjb252L2RvY2ZpeGVyLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NDU5ZmEyLi4wMDAwMDAwCi0tLSBhL0RvYy90b29scy9zZ21sY29udi9kb2NmaXhlci5weQorKysgL2Rldi9udWxsCkBAIC0xLDEwNzIgKzAsMCBAQAotIyEgL3Vzci9iaW4vZW52IHB5dGhvbgotCi0iIiJQZXJmb3JtIG1hc3NpdmUgdHJhbnNmb3JtYXRpb25zIG9uIGEgZG9jdW1lbnQgdHJlZSBjcmVhdGVkIGZyb20gdGhlIExhVGVYCi1vZiB0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24sIGFuZCBkdW1wIHRoZSBFU0lTIGRhdGEgZm9yIHRoZSB0cmFuc2Zvcm1lZCB0cmVlLgotIiIiCi0KLQotaW1wb3J0IGVycm5vCi1pbXBvcnQgZXNpc3Rvb2xzCi1pbXBvcnQgcmUKLWltcG9ydCBzeXMKLWltcG9ydCB4bWwuZG9tCi1pbXBvcnQgeG1sLmRvbS5taW5pZG9tCi0KLUVMRU1FTlQgPSB4bWwuZG9tLk5vZGUuRUxFTUVOVF9OT0RFCi1FTlRJVFlfUkVGRVJFTkNFID0geG1sLmRvbS5Ob2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERQotVEVYVCA9IHhtbC5kb20uTm9kZS5URVhUX05PREUKLQotCi1jbGFzcyBDb252ZXJzaW9uRXJyb3IoRXhjZXB0aW9uKToKLSAgICBwYXNzCi0KLQotZXdyaXRlID0gc3lzLnN0ZGVyci53cml0ZQotdHJ5OgotICAgICMgV2UgY2FuIG9ubHkgZG8gdGhpcyB0cmljayBvbiBVbml4IChpZiB0cHV0IGlzIG9uICRQQVRIKSEKLSAgICBpZiBzeXMucGxhdGZvcm0gIT0gInBvc2l4IiBvciBub3Qgc3lzLnN0ZGVyci5pc2F0dHkoKToKLSAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IKLSAgICBpbXBvcnQgY29tbWFuZHMKLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICBid3JpdGUgPSBld3JpdGUKLWVsc2U6Ci0gICAgZGVmIGJ3cml0ZShzLCBCT0xET049Y29tbWFuZHMuZ2V0b3V0cHV0KCJ0cHV0IGJvbGQiKSwKLSAgICAgICAgICAgICAgIEJPTERPRkY9Y29tbWFuZHMuZ2V0b3V0cHV0KCJ0cHV0IHNncjAiKSk6Ci0gICAgICAgIGV3cml0ZSgiJXMlcyVzIiAlIChCT0xET04sIHMsIEJPTERPRkYpKQotCi0KLVBBUkFfRUxFTUVOVCA9ICJwYXJhIgotCi1ERUJVR19QQVJBX0ZJWEVSID0gMAotCi1pZiBERUJVR19QQVJBX0ZJWEVSOgotICAgIGRlZiBwYXJhX21zZyhzKToKLSAgICAgICAgZXdyaXRlKCIqKiogJXNcbiIgJSBzKQotZWxzZToKLSAgICBkZWYgcGFyYV9tc2cocyk6Ci0gICAgICAgIHBhc3MKLQotCi1kZWYgZ2V0X2ZpcnN0X2VsZW1lbnQoZG9jLCBnaSk6Ci0gICAgZm9yIG4gaW4gZG9jLmNoaWxkTm9kZXM6Ci0gICAgICAgIGlmIG4ubm9kZU5hbWUgPT0gZ2k6Ci0gICAgICAgICAgICByZXR1cm4gbgotCi1kZWYgZXh0cmFjdF9maXJzdF9lbGVtZW50KGRvYywgZ2kpOgotICAgIG5vZGUgPSBnZXRfZmlyc3RfZWxlbWVudChkb2MsIGdpKQotICAgIGlmIG5vZGUgaXMgbm90IE5vbmU6Ci0gICAgICAgIGRvYy5yZW1vdmVDaGlsZChub2RlKQotICAgIHJldHVybiBub2RlCi0KLQotZGVmIGdldF9kb2N1bWVudEVsZW1lbnQobm9kZSk6Ci0gICAgcmVzdWx0ID0gTm9uZQotICAgIGZvciBjaGlsZCBpbiBub2RlLmNoaWxkTm9kZXM6Ci0gICAgICAgIGlmIGNoaWxkLm5vZGVUeXBlID09IEVMRU1FTlQ6Ci0gICAgICAgICAgICByZXN1bHQgPSBjaGlsZAotICAgIHJldHVybiByZXN1bHQKLQotCi1kZWYgc2V0X3RhZ05hbWUoZWxlbSwgZ2kpOgotICAgIGVsZW0ubm9kZU5hbWUgPSBlbGVtLnRhZ05hbWUgPSBnaQotCi0KLWRlZiBmaW5kX2FsbF9lbGVtZW50cyhkb2MsIGdpKToKLSAgICBub2RlcyA9IFtdCi0gICAgaWYgZG9jLm5vZGVOYW1lID09IGdpOgotICAgICAgICBub2Rlcy5hcHBlbmQoZG9jKQotICAgIGZvciBjaGlsZCBpbiBkb2MuY2hpbGROb2RlczoKLSAgICAgICAgaWYgY2hpbGQubm9kZVR5cGUgPT0gRUxFTUVOVDoKLSAgICAgICAgICAgIGlmIGNoaWxkLnRhZ05hbWUgPT0gZ2k6Ci0gICAgICAgICAgICAgICAgbm9kZXMuYXBwZW5kKGNoaWxkKQotICAgICAgICAgICAgZm9yIG5vZGUgaW4gY2hpbGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZ2kpOgotICAgICAgICAgICAgICAgIG5vZGVzLmFwcGVuZChub2RlKQotICAgIHJldHVybiBub2RlcwotCi1kZWYgZmluZF9hbGxfY2hpbGRfZWxlbWVudHMoZG9jLCBnaSk6Ci0gICAgbm9kZXMgPSBbXQotICAgIGZvciBjaGlsZCBpbiBkb2MuY2hpbGROb2RlczoKLSAgICAgICAgaWYgY2hpbGQubm9kZU5hbWUgPT0gZ2k6Ci0gICAgICAgICAgICBub2Rlcy5hcHBlbmQoY2hpbGQpCi0gICAgcmV0dXJuIG5vZGVzCi0KLQotZGVmIGZpbmRfYWxsX2VsZW1lbnRzX2Zyb21fc2V0KGRvYywgZ2lfc2V0KToKLSAgICByZXR1cm4gX19maW5kX2FsbF9lbGVtZW50c19mcm9tX3NldChkb2MsIGdpX3NldCwgW10pCi0KLWRlZiBfX2ZpbmRfYWxsX2VsZW1lbnRzX2Zyb21fc2V0KGRvYywgZ2lfc2V0LCBub2Rlcyk6Ci0gICAgaWYgZG9jLm5vZGVOYW1lIGluIGdpX3NldDoKLSAgICAgICAgbm9kZXMuYXBwZW5kKGRvYykKLSAgICBmb3IgY2hpbGQgaW4gZG9jLmNoaWxkTm9kZXM6Ci0gICAgICAgIGlmIGNoaWxkLm5vZGVUeXBlID09IEVMRU1FTlQ6Ci0gICAgICAgICAgICBfX2ZpbmRfYWxsX2VsZW1lbnRzX2Zyb21fc2V0KGNoaWxkLCBnaV9zZXQsIG5vZGVzKQotICAgIHJldHVybiBub2RlcwotCi0KLWRlZiBzaW1wbGlmeShkb2MsIGZyYWdtZW50KToKLSAgICAjIFRyeSB0byByYXRpb25hbGl6ZSB0aGUgZG9jdW1lbnQgYSBiaXQsIHNpbmNlIHRoZXNlIHRoaW5ncyBhcmUgc2ltcGx5Ci0gICAgIyBub3QgdmFsaWQgU0dNTC9YTUwgZG9jdW1lbnRzIGFzIHRoZXkgc3RhbmQsIGFuZCBuZWVkIGEgbGl0dGxlIHdvcmsuCi0gICAgZG9jdW1lbnRjbGFzcyA9ICJkb2N1bWVudCIKLSAgICBpbnB1dHMgPSBbXQotICAgIG5vZGUgPSBleHRyYWN0X2ZpcnN0X2VsZW1lbnQoZnJhZ21lbnQsICJkb2N1bWVudGNsYXNzIikKLSAgICBpZiBub2RlIGlzIG5vdCBOb25lOgotICAgICAgICBkb2N1bWVudGNsYXNzID0gbm9kZS5nZXRBdHRyaWJ1dGUoImNsYXNzbmFtZSIpCi0gICAgbm9kZSA9IGV4dHJhY3RfZmlyc3RfZWxlbWVudChmcmFnbWVudCwgInRpdGxlIikKLSAgICBpZiBub2RlIGlzIG5vdCBOb25lOgotICAgICAgICBpbnB1dHMuYXBwZW5kKG5vZGUpCi0gICAgIyB1cGRhdGUgdGhlIG5hbWUgb2YgdGhlIHJvb3QgZWxlbWVudAotICAgIG5vZGUgPSBnZXRfZmlyc3RfZWxlbWVudChmcmFnbWVudCwgImRvY3VtZW50IikKLSAgICBpZiBub2RlIGlzIG5vdCBOb25lOgotICAgICAgICBzZXRfdGFnTmFtZShub2RlLCBkb2N1bWVudGNsYXNzKQotICAgICAgICAjIE1vdmUgZXZlcnl0aGluZyB0aGF0IGNvbWVzIGJlZm9yZSB0aGlzIG5vZGUgaW50byB0aGlzIG5vZGU7Ci0gICAgICAgICMgdGhpcyB3aWxsIGJlIHRoZSBkb2N1bWVudCBlbGVtZW50LgotICAgICAgICBub2RlbGlzdCA9IGZyYWdtZW50LmNoaWxkTm9kZXMKLSAgICAgICAgcG9pbnQgPSBub2RlLmZpcnN0Q2hpbGQKLSAgICAgICAgd2hpbGUgbm90IG5vZGVsaXN0WzBdLmlzU2FtZU5vZGUobm9kZSk6Ci0gICAgICAgICAgICBub2RlLmluc2VydEJlZm9yZShub2RlbGlzdFswXSwgcG9pbnQpCi0gICAgd2hpbGUgMToKLSAgICAgICAgbm9kZSA9IGV4dHJhY3RfZmlyc3RfZWxlbWVudChmcmFnbWVudCwgImlucHV0IikKLSAgICAgICAgaWYgbm9kZSBpcyBOb25lOgotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgaW5wdXRzLmFwcGVuZChub2RlKQotICAgIGlmIGlucHV0czoKLSAgICAgICAgZG9jZWxlbSA9IGdldF9kb2N1bWVudEVsZW1lbnQoZnJhZ21lbnQpCi0gICAgICAgIGlucHV0cy5yZXZlcnNlKCkKLSAgICAgICAgZm9yIG5vZGUgaW4gaW5wdXRzOgotICAgICAgICAgICAgdGV4dCA9IGRvYy5jcmVhdGVUZXh0Tm9kZSgiXG4iKQotICAgICAgICAgICAgZG9jZWxlbS5pbnNlcnRCZWZvcmUodGV4dCwgZG9jZWxlbS5maXJzdENoaWxkKQotICAgICAgICAgICAgZG9jZWxlbS5pbnNlcnRCZWZvcmUobm9kZSwgdGV4dCkKLSAgICAgICAgZG9jZWxlbS5pbnNlcnRCZWZvcmUoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiIpLCBkb2NlbGVtLmZpcnN0Q2hpbGQpCi0gICAgd2hpbGUgZnJhZ21lbnQuZmlyc3RDaGlsZCBhbmQgZnJhZ21lbnQuZmlyc3RDaGlsZC5ub2RlVHlwZSA9PSBURVhUOgotICAgICAgICBmcmFnbWVudC5yZW1vdmVDaGlsZChmcmFnbWVudC5maXJzdENoaWxkKQotCi0KLWRlZiBjbGVhbnVwX3Jvb3RfdGV4dChkb2MpOgotICAgIGRpc2NhcmRzID0gW10KLSAgICBza2lwID0gMAotICAgIGZvciBuIGluIGRvYy5jaGlsZE5vZGVzOgotICAgICAgICBwcmV2c2tpcCA9IHNraXAKLSAgICAgICAgc2tpcCA9IDAKLSAgICAgICAgaWYgbi5ub2RlVHlwZSA9PSBURVhUIGFuZCBub3QgcHJldnNraXA6Ci0gICAgICAgICAgICBkaXNjYXJkcy5hcHBlbmQobikKLSAgICAgICAgZWxpZiBuLm5vZGVOYW1lID09ICJDT01NRU5UIjoKLSAgICAgICAgICAgIHNraXAgPSAxCi0gICAgZm9yIG5vZGUgaW4gZGlzY2FyZHM6Ci0gICAgICAgIGRvYy5yZW1vdmVDaGlsZChub2RlKQotCi0KLURFU0NSSVBUT1JfRUxFTUVOVFMgPSAoCi0gICAgImNmdW5jZGVzYyIsICJjdmFyZGVzYyIsICJjdHlwZWRlc2MiLAotICAgICJjbGFzc2Rlc2MiLCAibWVtYmVyZGVzYyIsICJtZW1iZXJkZXNjbmkiLCAibWV0aG9kZGVzYyIsICJtZXRob2RkZXNjbmkiLAotICAgICJleGNkZXNjIiwgImZ1bmNkZXNjIiwgImZ1bmNkZXNjbmkiLCAib3Bjb2RlZGVzYyIsCi0gICAgImRhdGFkZXNjIiwgImRhdGFkZXNjbmkiLAotICAgICkKLQotZGVmIGZpeHVwX2Rlc2NyaXB0b3JzKGRvYywgZnJhZ21lbnQpOgotICAgIHNlY3Rpb25zID0gZmluZF9hbGxfZWxlbWVudHMoZnJhZ21lbnQsICJzZWN0aW9uIikKLSAgICBmb3Igc2VjdGlvbiBpbiBzZWN0aW9uczoKLSAgICAgICAgZmluZF9hbmRfZml4X2Rlc2NyaXB0b3JzKGRvYywgc2VjdGlvbikKLQotCi1kZWYgZmluZF9hbmRfZml4X2Rlc2NyaXB0b3JzKGRvYywgY29udGFpbmVyKToKLSAgICBjaGlsZHJlbiA9IGNvbnRhaW5lci5jaGlsZE5vZGVzCi0gICAgZm9yIGNoaWxkIGluIGNoaWxkcmVuOgotICAgICAgICBpZiBjaGlsZC5ub2RlVHlwZSA9PSBFTEVNRU5UOgotICAgICAgICAgICAgdGFnTmFtZSA9IGNoaWxkLnRhZ05hbWUKLSAgICAgICAgICAgIGlmIHRhZ05hbWUgaW4gREVTQ1JJUFRPUl9FTEVNRU5UUzoKLSAgICAgICAgICAgICAgICByZXdyaXRlX2Rlc2NyaXB0b3IoZG9jLCBjaGlsZCkKLSAgICAgICAgICAgIGVsaWYgdGFnTmFtZSA9PSAic3Vic2VjdGlvbiI6Ci0gICAgICAgICAgICAgICAgZmluZF9hbmRfZml4X2Rlc2NyaXB0b3JzKGRvYywgY2hpbGQpCi0KLQotZGVmIHJld3JpdGVfZGVzY3JpcHRvcihkb2MsIGRlc2NyaXB0b3IpOgotICAgICMKLSAgICAjIERvIHRoZXNlIHRoaW5nczoKLSAgICAjICAgMS4gQWRkIGFuICJpbmRleD0nbm8nIiBhdHRyaWJ1dGUgdG8gdGhlIGVsZW1lbnQgaWYgdGhlIHRhZ05hbWUKLSAgICAjICAgICAgZW5kcyBpbiAnbmknLCByZW1vdmluZyB0aGUgJ25pJyBmcm9tIHRoZSBuYW1lLgotICAgICMgICAyLiBDcmVhdGUgYSA8c2lnbmF0dXJlPiBmcm9tIHRoZSBuYW1lIGF0dHJpYnV0ZQotICAgICMgICAyYS5DcmVhdGUgYW4gPGFyZ3M+IGlmIGl0IGFwcGVhcnMgdG8gYmUgYXZhaWxhYmxlLgotICAgICMgICAzLiBDcmVhdGUgYWRkaXRpb25hbCA8c2lnbmF0dXJlPnMgZnJvbSA8KmxpbmV7LG5pfT4gZWxlbWVudHMsCi0gICAgIyAgICAgIGlmIGZvdW5kLgotICAgICMgICA0LiBJZiBhIDx2ZXJzaW9uYWRkZWQ+IGlzIGZvdW5kLCBtb3ZlIGl0IHRvIGFuIGF0dHJpYnV0ZSBvbiB0aGUKLSAgICAjICAgICAgZGVzY3JpcHRvci4KLSAgICAjICAgNS4gTW92ZSByZW1haW5pbmcgY2hpbGQgbm9kZXMgdG8gYSA8ZGVzY3JpcHRpb24+IGVsZW1lbnQuCi0gICAgIyAgIDYuIFB1dCBpdCBiYWNrIHRvZ2V0aGVyLgotICAgICMKLSAgICAjIDEuCi0gICAgZGVzY25hbWUgPSBkZXNjcmlwdG9yLnRhZ05hbWUKLSAgICBpbmRleCA9IGRlc2NyaXB0b3IuZ2V0QXR0cmlidXRlKCJuYW1lIikgIT0gIm5vIgotICAgIGRlc2N0eXBlID0gZGVzY25hbWVbOi00XSAjIHJlbW92ZSAnZGVzYycKLSAgICBsaW5lbmFtZSA9IGRlc2N0eXBlICsgImxpbmUiCi0gICAgaWYgbm90IGluZGV4OgotICAgICAgICBsaW5lbmFtZSA9IGxpbmVuYW1lICsgIm5pIgotICAgICMgMi4KLSAgICBzaWduYXR1cmUgPSBkb2MuY3JlYXRlRWxlbWVudCgic2lnbmF0dXJlIikKLSAgICBuYW1lID0gZG9jLmNyZWF0ZUVsZW1lbnQoIm5hbWUiKQotICAgIHNpZ25hdHVyZS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlxuICAgICIpKQotICAgIHNpZ25hdHVyZS5hcHBlbmRDaGlsZChuYW1lKQotICAgIG5hbWUuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKGRlc2NyaXB0b3IuZ2V0QXR0cmlidXRlKCJuYW1lIikpKQotICAgIGRlc2NyaXB0b3IucmVtb3ZlQXR0cmlidXRlKCJuYW1lIikKLSAgICAjIDJhLgotICAgIGlmIGRlc2NyaXB0b3IuaGFzQXR0cmlidXRlKCJ2YXIiKToKLSAgICAgICAgaWYgZGVzY25hbWUgIT0gIm9wY29kZWRlc2MiOgotICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJnb3QgJ3ZhcicgYXR0cmlidXRlIG9uIGRlc2NyaXB0b3Igb3RoZXIgdGhhbiBvcGNvZGVkZXNjIikKLSAgICAgICAgdmFyaWFibGUgPSBkZXNjcmlwdG9yLmdldEF0dHJpYnV0ZSgidmFyIikKLSAgICAgICAgaWYgdmFyaWFibGU6Ci0gICAgICAgICAgICBhcmdzID0gZG9jLmNyZWF0ZUVsZW1lbnQoImFyZ3MiKQotICAgICAgICAgICAgYXJncy5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUodmFyaWFibGUpKQotICAgICAgICAgICAgc2lnbmF0dXJlLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiXG4gICAgIikpCi0gICAgICAgICAgICBzaWduYXR1cmUuYXBwZW5kQ2hpbGQoYXJncykKLSAgICAgICAgZGVzY3JpcHRvci5yZW1vdmVBdHRyaWJ1dGUoInZhciIpCi0gICAgbmV3Y2hpbGRyZW4gPSBbc2lnbmF0dXJlXQotICAgIGNoaWxkcmVuID0gZGVzY3JpcHRvci5jaGlsZE5vZGVzCi0gICAgcG9zID0gc2tpcF9sZWFkaW5nX25vZGVzKGNoaWxkcmVuKQotICAgIGlmIHBvcyA8IGxlbihjaGlsZHJlbik6Ci0gICAgICAgIGNoaWxkID0gY2hpbGRyZW5bcG9zXQotICAgICAgICBpZiBjaGlsZC5ub2RlTmFtZSA9PSAiYXJncyI6Ci0gICAgICAgICAgICAjIG1vdmUgPGFyZ3M+IHRvIDxzaWduYXR1cmU+LCBvciByZW1vdmUgaWYgZW1wdHk6Ci0gICAgICAgICAgICBjaGlsZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNoaWxkKQotICAgICAgICAgICAgaWYgbGVuKGNoaWxkLmNoaWxkTm9kZXMpOgotICAgICAgICAgICAgICAgIHNpZ25hdHVyZS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlxuICAgICIpKQotICAgICAgICAgICAgICAgIHNpZ25hdHVyZS5hcHBlbmRDaGlsZChjaGlsZCkKLSAgICBzaWduYXR1cmUuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiAgIikpCi0gICAgIyAzLCA0LgotICAgIHBvcyA9IHNraXBfbGVhZGluZ19ub2RlcyhjaGlsZHJlbiwgcG9zKQotICAgIHdoaWxlIHBvcyA8IGxlbihjaGlsZHJlbikgXAotICAgICAgICAgIGFuZCBjaGlsZHJlbltwb3NdLm5vZGVOYW1lIGluIChsaW5lbmFtZSwgInZlcnNpb25hZGRlZCIpOgotICAgICAgICBpZiBjaGlsZHJlbltwb3NdLnRhZ05hbWUgPT0gbGluZW5hbWU6Ci0gICAgICAgICAgICAjIHRoaXMgaXMgcmVhbGx5IGEgc3VwcGxlbWVudGFsIHNpZ25hdHVyZSwgY3JlYXRlIDxzaWduYXR1cmU+Ci0gICAgICAgICAgICBvbGRjaGlsZCA9IGNoaWxkcmVuW3Bvc10uY2xvbmVOb2RlKDEpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgc2lnID0gbWV0aG9kbGluZV90b19zaWduYXR1cmUoZG9jLCBjaGlsZHJlbltwb3NdKQotICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICAgICAgICAgIHByaW50KG9sZGNoaWxkLnRveG1sKCkpCi0gICAgICAgICAgICAgICAgcmFpc2UKLSAgICAgICAgICAgIG5ld2NoaWxkcmVuLmFwcGVuZChzaWcpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAjIDx2ZXJzaW9uYWRkZWQgYWRkZWQ9Li4uPgotICAgICAgICAgICAgZGVzY3JpcHRvci5zZXRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgImFkZGVkIiwgY2hpbGRyZW5bcG9zXS5nZXRBdHRyaWJ1dGUoInZlcnNpb24iKSkKLSAgICAgICAgcG9zID0gc2tpcF9sZWFkaW5nX25vZGVzKGNoaWxkcmVuLCBwb3MgKyAxKQotICAgICMgNS4KLSAgICBkZXNjcmlwdGlvbiA9IGRvYy5jcmVhdGVFbGVtZW50KCJkZXNjcmlwdGlvbiIpCi0gICAgZGVzY3JpcHRpb24uYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiIpKQotICAgIG5ld2NoaWxkcmVuLmFwcGVuZChkZXNjcmlwdGlvbikKLSAgICBtb3ZlX2NoaWxkcmVuKGRlc2NyaXB0b3IsIGRlc2NyaXB0aW9uLCBwb3MpCi0gICAgbGFzdCA9IGRlc2NyaXB0aW9uLmNoaWxkTm9kZXNbLTFdCi0gICAgaWYgbGFzdC5ub2RlVHlwZSA9PSBURVhUOgotICAgICAgICBsYXN0LmRhdGEgPSBsYXN0LmRhdGEucnN0cmlwKCkgKyAiXG4gICIKLSAgICAjIDYuCi0gICAgIyBzaG91bGQgaGF2ZSBub3RoaW5nIGJ1dCB3aGl0ZXNwYWNlIGFuZCBzaWduYXR1cmUgbGluZXMgaW4gPGRlc2NyaXB0b3I+OwotICAgICMgZGlzY2FyZCB0aGVtCi0gICAgd2hpbGUgZGVzY3JpcHRvci5jaGlsZE5vZGVzOgotICAgICAgICBkZXNjcmlwdG9yLnJlbW92ZUNoaWxkKGRlc2NyaXB0b3IuY2hpbGROb2Rlc1swXSkKLSAgICBmb3Igbm9kZSBpbiBuZXdjaGlsZHJlbjoKLSAgICAgICAgZGVzY3JpcHRvci5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlxuICAiKSkKLSAgICAgICAgZGVzY3JpcHRvci5hcHBlbmRDaGlsZChub2RlKQotICAgIGRlc2NyaXB0b3IuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiIpKQotCi0KLWRlZiBtZXRob2RsaW5lX3RvX3NpZ25hdHVyZShkb2MsIG1ldGhvZGxpbmUpOgotICAgIHNpZ25hdHVyZSA9IGRvYy5jcmVhdGVFbGVtZW50KCJzaWduYXR1cmUiKQotICAgIHNpZ25hdHVyZS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlxuICAgICIpKQotICAgIG5hbWUgPSBkb2MuY3JlYXRlRWxlbWVudCgibmFtZSIpCi0gICAgbmFtZS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUobWV0aG9kbGluZS5nZXRBdHRyaWJ1dGUoIm5hbWUiKSkpCi0gICAgbWV0aG9kbGluZS5yZW1vdmVBdHRyaWJ1dGUoIm5hbWUiKQotICAgIHNpZ25hdHVyZS5hcHBlbmRDaGlsZChuYW1lKQotICAgIGlmIGxlbihtZXRob2RsaW5lLmNoaWxkTm9kZXMpOgotICAgICAgICBhcmdzID0gZG9jLmNyZWF0ZUVsZW1lbnQoImFyZ3MiKQotICAgICAgICBzaWduYXR1cmUuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiAgICAiKSkKLSAgICAgICAgc2lnbmF0dXJlLmFwcGVuZENoaWxkKGFyZ3MpCi0gICAgICAgIG1vdmVfY2hpbGRyZW4obWV0aG9kbGluZSwgYXJncykKLSAgICBzaWduYXR1cmUuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiAgIikpCi0gICAgcmV0dXJuIHNpZ25hdHVyZQotCi0KLWRlZiBtb3ZlX2NoaWxkcmVuKG9yaWdpbiwgZGVzdCwgc3RhcnQ9MCk6Ci0gICAgY2hpbGRyZW4gPSBvcmlnaW4uY2hpbGROb2RlcwotICAgIHdoaWxlIHN0YXJ0IDwgbGVuKGNoaWxkcmVuKToKLSAgICAgICAgbm9kZSA9IGNoaWxkcmVuW3N0YXJ0XQotICAgICAgICBvcmlnaW4ucmVtb3ZlQ2hpbGQobm9kZSkKLSAgICAgICAgZGVzdC5hcHBlbmRDaGlsZChub2RlKQotCi0KLWRlZiBoYW5kbGVfYXBwZW5kaXgoZG9jLCBmcmFnbWVudCk6Ci0gICAgIyBtdXN0IGJlIGNhbGxlZCBhZnRlciBzaW1wbGZ5KCkgaWYgZG9jdW1lbnQgaXMgbXVsdGktcm9vdGVkIHRvIGJlZ2luIHdpdGgKLSAgICBkb2NlbGVtID0gZ2V0X2RvY3VtZW50RWxlbWVudChmcmFnbWVudCkKLSAgICB0b3BsZXZlbCA9IGRvY2VsZW0udGFnTmFtZSA9PSAibWFudWFsIiBhbmQgImNoYXB0ZXIiIG9yICJzZWN0aW9uIgotICAgIGFwcGVuZGljZXMgPSAwCi0gICAgbm9kZXMgPSBbXQotICAgIGZvciBub2RlIGluIGRvY2VsZW0uY2hpbGROb2RlczoKLSAgICAgICAgaWYgYXBwZW5kaWNlczoKLSAgICAgICAgICAgIG5vZGVzLmFwcGVuZChub2RlKQotICAgICAgICBlbGlmIG5vZGUubm9kZVR5cGUgPT0gRUxFTUVOVDoKLSAgICAgICAgICAgIGFwcG5vZGVzID0gbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYXBwZW5kaXgiKQotICAgICAgICAgICAgaWYgYXBwbm9kZXM6Ci0gICAgICAgICAgICAgICAgYXBwZW5kaWNlcyA9IDEKLSAgICAgICAgICAgICAgICBwYXJlbnQgPSBhcHBub2Rlc1swXS5wYXJlbnROb2RlCi0gICAgICAgICAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKGFwcG5vZGVzWzBdKQotICAgICAgICAgICAgICAgIHBhcmVudC5ub3JtYWxpemUoKQotICAgIGlmIG5vZGVzOgotICAgICAgICBtYXAoZG9jZWxlbS5yZW1vdmVDaGlsZCwgbm9kZXMpCi0gICAgICAgIGRvY2VsZW0uYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJcblxuXG4iKSkKLSAgICAgICAgYmFjayA9IGRvYy5jcmVhdGVFbGVtZW50KCJiYWNrLW1hdHRlciIpCi0gICAgICAgIGRvY2VsZW0uYXBwZW5kQ2hpbGQoYmFjaykKLSAgICAgICAgYmFjay5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlxuIikpCi0gICAgICAgIHdoaWxlIG5vZGVzIGFuZCBub2Rlc1swXS5ub2RlVHlwZSA9PSBURVhUIFwKLSAgICAgICAgICAgICAgYW5kIG5vdCBub2Rlc1swXS5kYXRhLnN0cmlwKCk6Ci0gICAgICAgICAgICBkZWwgbm9kZXNbMF0KLSAgICAgICAgbWFwKGJhY2suYXBwZW5kQ2hpbGQsIG5vZGVzKQotICAgICAgICBkb2NlbGVtLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiXG4iKSkKLQotCi1kZWYgaGFuZGxlX2xhYmVscyhkb2MsIGZyYWdtZW50KToKLSAgICBmb3IgbGFiZWwgaW4gZmluZF9hbGxfZWxlbWVudHMoZnJhZ21lbnQsICJsYWJlbCIpOgotICAgICAgICBpZCA9IGxhYmVsLmdldEF0dHJpYnV0ZSgiaWQiKQotICAgICAgICBpZiBub3QgaWQ6Ci0gICAgICAgICAgICBjb250aW51ZQotICAgICAgICBwYXJlbnQgPSBsYWJlbC5wYXJlbnROb2RlCi0gICAgICAgIHBhcmVudFRhZ05hbWUgPSBwYXJlbnQudGFnTmFtZQotICAgICAgICBpZiBwYXJlbnRUYWdOYW1lID09ICJ0aXRsZSI6Ci0gICAgICAgICAgICBwYXJlbnQucGFyZW50Tm9kZS5zZXRBdHRyaWJ1dGUoImlkIiwgaWQpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwYXJlbnQuc2V0QXR0cmlidXRlKCJpZCIsIGlkKQotICAgICAgICAjIG5vdywgcmVtb3ZlIDxsYWJlbCBpZD0iLi4uIi8+IGZyb20gcGFyZW50OgotICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQobGFiZWwpCi0gICAgICAgIGlmIHBhcmVudFRhZ05hbWUgPT0gInRpdGxlIjoKLSAgICAgICAgICAgIHBhcmVudC5ub3JtYWxpemUoKQotICAgICAgICAgICAgY2hpbGRyZW4gPSBwYXJlbnQuY2hpbGROb2RlcwotICAgICAgICAgICAgaWYgY2hpbGRyZW5bLTFdLm5vZGVUeXBlID09IFRFWFQ6Ci0gICAgICAgICAgICAgICAgY2hpbGRyZW5bLTFdLmRhdGEgPSBjaGlsZHJlblstMV0uZGF0YS5yc3RyaXAoKQotCi0KLWRlZiBmaXh1cF90cmFpbGluZ193aGl0ZXNwYWNlKGRvYywgZnJhZ21lbnQsIHdzbWFwKToKLSAgICBxdWV1ZSA9IFtmcmFnbWVudF0KLSAgICBmaXh1cHMgPSBbXQotICAgIHdoaWxlIHF1ZXVlOgotICAgICAgICBub2RlID0gcXVldWVbMF0KLSAgICAgICAgZGVsIHF1ZXVlWzBdCi0gICAgICAgIGlmIG5vZGUubm9kZU5hbWUgaW4gd3NtYXA6Ci0gICAgICAgICAgICBmaXh1cHMuYXBwZW5kKG5vZGUpCi0gICAgICAgIGZvciBjaGlsZCBpbiBub2RlLmNoaWxkTm9kZXM6Ci0gICAgICAgICAgICBpZiBjaGlsZC5ub2RlVHlwZSA9PSBFTEVNRU5UOgotICAgICAgICAgICAgICAgIHF1ZXVlLmFwcGVuZChjaGlsZCkKLQotICAgICMgcmV2ZXJzZSB0aGUgbGlzdCB0byBwcm9jZXNzIGZyb20gdGhlIGluc2lkZSBvdXQKLSAgICBmaXh1cHMucmV2ZXJzZSgpCi0gICAgZm9yIG5vZGUgaW4gZml4dXBzOgotICAgICAgICBub2RlLnBhcmVudE5vZGUubm9ybWFsaXplKCkKLSAgICAgICAgbGFzdGNoaWxkID0gbm9kZS5sYXN0Q2hpbGQKLSAgICAgICAgYmVmb3JlLCBhZnRlciA9IHdzbWFwW25vZGUudGFnTmFtZV0KLSAgICAgICAgaWYgbGFzdGNoaWxkLm5vZGVUeXBlID09IFRFWFQ6Ci0gICAgICAgICAgICBkYXRhID0gbGFzdGNoaWxkLmRhdGEucnN0cmlwKCkgKyBiZWZvcmUKLSAgICAgICAgICAgIGxhc3RjaGlsZC5kYXRhID0gZGF0YQotICAgICAgICBub3JtID0gMAotICAgICAgICBpZiB3c21hcFtub2RlLnRhZ05hbWVdOgotICAgICAgICAgICAgbmV4dG5vZGUgPSBub2RlLm5leHRTaWJsaW5nCi0gICAgICAgICAgICBpZiBuZXh0bm9kZSBhbmQgbmV4dG5vZGUubm9kZVR5cGUgPT0gVEVYVDoKLSAgICAgICAgICAgICAgICBuZXh0bm9kZS5kYXRhID0gYWZ0ZXIgKyBuZXh0bm9kZS5kYXRhLmxzdHJpcCgpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHdzbm9kZSA9IGRvYy5jcmVhdGVUZXh0Tm9kZShhZnRlcikKLSAgICAgICAgICAgICAgICBub2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHdzbm9kZSwgbmV4dG5vZGUpCi0gICAgICAgICMgaGFjayB0byBnZXQgdGhlIHRpdGxlIGluIHBsYWNlOgotICAgICAgICBpZiBub2RlLnRhZ05hbWUgPT0gInRpdGxlIiBcCi0gICAgICAgICAgIGFuZCBub2RlLnBhcmVudE5vZGUuZmlyc3RDaGlsZC5ub2RlVHlwZSA9PSBFTEVNRU5UOgotICAgICAgICAgICAgbm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkb2MuY3JlYXRlVGV4dE5vZGUoIlxuICAiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpCi0gICAgICAgICAgICBub2RlLnBhcmVudE5vZGUubm9ybWFsaXplKCkKLQotCi1kZWYgbm9ybWFsaXplKGRvYyk6Ci0gICAgZm9yIG5vZGUgaW4gZG9jLmNoaWxkTm9kZXM6Ci0gICAgICAgIGlmIG5vZGUubm9kZVR5cGUgPT0gRUxFTUVOVDoKLSAgICAgICAgICAgIG5vZGUubm9ybWFsaXplKCkKLQotCi1kZWYgY2xlYW51cF90cmFpbGluZ19wYXJlbnMoZG9jLCBlbGVtZW50X25hbWVzKToKLSAgICBkID0ge30KLSAgICBmb3IgZ2kgaW4gZWxlbWVudF9uYW1lczoKLSAgICAgICAgZFtnaV0gPSBnaQotICAgIHJld3JpdGVfZWxlbWVudCA9IGQuaGFzX2tleQotICAgIHF1ZXVlID0gW25vZGUgZm9yIG5vZGUgaW4gZG9jLmNoaWxkTm9kZXMgaWYgbm9kZS5ub2RlVHlwZSA9PSBFTEVNRU5UXQotICAgIHdoaWxlIHF1ZXVlOgotICAgICAgICBub2RlID0gcXVldWVbMF0KLSAgICAgICAgZGVsIHF1ZXVlWzBdCi0gICAgICAgIGlmIHJld3JpdGVfZWxlbWVudChub2RlLnRhZ05hbWUpOgotICAgICAgICAgICAgbGFzdGNoaWxkID0gbm9kZS5sYXN0Q2hpbGQKLSAgICAgICAgICAgIGlmIGxhc3RjaGlsZCBhbmQgbGFzdGNoaWxkLm5vZGVUeXBlID09IFRFWFQ6Ci0gICAgICAgICAgICAgICAgZGF0YSA9IGxhc3RjaGlsZC5kYXRhCi0gICAgICAgICAgICAgICAgaWYgZGF0YS5lbmRzd2l0aCgiKCkiKToKLSAgICAgICAgICAgICAgICAgICAgbGFzdGNoaWxkLmRhdGEgPSBkYXRhWzotMl0KLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGZvciBjaGlsZCBpbiBub2RlLmNoaWxkTm9kZXM6Ci0gICAgICAgICAgICAgICAgaWYgY2hpbGQubm9kZVR5cGUgPT0gRUxFTUVOVDoKLSAgICAgICAgICAgICAgICAgICAgcXVldWUuYXBwZW5kKGNoaWxkKQotCi0KLWRlZiBjb250ZW50c19tYXRjaChsZWZ0LCByaWdodCk6Ci0gICAgbGVmdF9jaGlsZHJlbiA9IGxlZnQuY2hpbGROb2RlcwotICAgIHJpZ2h0X2NoaWxkcmVuID0gcmlnaHQuY2hpbGROb2RlcwotICAgIGlmIGxlbihsZWZ0X2NoaWxkcmVuKSAhPSBsZW4ocmlnaHRfY2hpbGRyZW4pOgotICAgICAgICByZXR1cm4gMAotICAgIGZvciBsLCByIGluIG1hcChOb25lLCBsZWZ0X2NoaWxkcmVuLCByaWdodF9jaGlsZHJlbik6Ci0gICAgICAgIG5vZGVUeXBlID0gbC5ub2RlVHlwZQotICAgICAgICBpZiBub2RlVHlwZSAhPSByLm5vZGVUeXBlOgotICAgICAgICAgICAgcmV0dXJuIDAKLSAgICAgICAgaWYgbm9kZVR5cGUgPT0gRUxFTUVOVDoKLSAgICAgICAgICAgIGlmIGwudGFnTmFtZSAhPSByLnRhZ05hbWU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDAKLSAgICAgICAgICAgICMgc2hvdWxkIGNoZWNrIGF0dHJpYnV0ZXMsIGJ1dCB0aGF0J3Mgbm90IGEgcHJvYmxlbSBoZXJlCi0gICAgICAgICAgICBpZiBub3QgY29udGVudHNfbWF0Y2gobCwgcik6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDAKLSAgICAgICAgZWxpZiBub2RlVHlwZSA9PSBURVhUOgotICAgICAgICAgICAgaWYgbC5kYXRhICE9IHIuZGF0YToKLSAgICAgICAgICAgICAgICByZXR1cm4gMAotICAgICAgICBlbHNlOgotICAgICAgICAgICAgIyBub3QgcXVpdGUgcmlnaHQsIGJ1dCBnb29kIGVub3VnaAotICAgICAgICAgICAgcmV0dXJuIDAKLSAgICByZXR1cm4gMQotCi0KLWRlZiBjcmVhdGVfbW9kdWxlX2luZm8oZG9jLCBzZWN0aW9uKToKLSAgICAjIEhlYXZ5LgotICAgIG5vZGUgPSBleHRyYWN0X2ZpcnN0X2VsZW1lbnQoc2VjdGlvbiwgIm1vZHVsZXN5bm9wc2lzIikKLSAgICBpZiBub2RlIGlzIE5vbmU6Ci0gICAgICAgIHJldHVybgotICAgIHNldF90YWdOYW1lKG5vZGUsICJzeW5vcHNpcyIpCi0gICAgbGFzdGNoaWxkID0gbm9kZS5jaGlsZE5vZGVzWy0xXQotICAgIGlmIGxhc3RjaGlsZC5ub2RlVHlwZSA9PSBURVhUIFwKLSAgICAgICBhbmQgbGFzdGNoaWxkLmRhdGFbLTE6XSA9PSAiLiI6Ci0gICAgICAgIGxhc3RjaGlsZC5kYXRhID0gbGFzdGNoaWxkLmRhdGFbOi0xXQotICAgIG1vZGF1dGhvciA9IGV4dHJhY3RfZmlyc3RfZWxlbWVudChzZWN0aW9uLCAibW9kdWxlYXV0aG9yIikKLSAgICBpZiBtb2RhdXRob3I6Ci0gICAgICAgIHNldF90YWdOYW1lKG1vZGF1dGhvciwgImF1dGhvciIpCi0gICAgICAgIG1vZGF1dGhvci5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoCi0gICAgICAgICAgICBtb2RhdXRob3IuZ2V0QXR0cmlidXRlKCJuYW1lIikpKQotICAgICAgICBtb2RhdXRob3IucmVtb3ZlQXR0cmlidXRlKCJuYW1lIikKLSAgICBwbGF0Zm9ybSA9IGV4dHJhY3RfZmlyc3RfZWxlbWVudChzZWN0aW9uLCAicGxhdGZvcm0iKQotICAgIGlmIHNlY3Rpb24udGFnTmFtZSA9PSAic2VjdGlvbiI6Ci0gICAgICAgIG1vZGluZm9fcG9zID0gMgotICAgICAgICBtb2RpbmZvID0gZG9jLmNyZWF0ZUVsZW1lbnQoIm1vZHVsZWluZm8iKQotICAgICAgICBtb2RkZWNsID0gZXh0cmFjdF9maXJzdF9lbGVtZW50KHNlY3Rpb24sICJkZWNsYXJlbW9kdWxlIikKLSAgICAgICAgbmFtZSA9IE5vbmUKLSAgICAgICAgaWYgbW9kZGVjbDoKLSAgICAgICAgICAgIG1vZGluZm8uYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiAgICAiKSkKLSAgICAgICAgICAgIG5hbWUgPSBtb2RkZWNsLmF0dHJpYnV0ZXNbIm5hbWUiXS52YWx1ZQotICAgICAgICAgICAgbmFtZW5vZGUgPSBkb2MuY3JlYXRlRWxlbWVudCgibmFtZSIpCi0gICAgICAgICAgICBuYW1lbm9kZS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUobmFtZSkpCi0gICAgICAgICAgICBtb2RpbmZvLmFwcGVuZENoaWxkKG5hbWVub2RlKQotICAgICAgICAgICAgdHlwZSA9IG1vZGRlY2wuYXR0cmlidXRlcy5nZXQoInR5cGUiKQotICAgICAgICAgICAgaWYgdHlwZToKLSAgICAgICAgICAgICAgICB0eXBlID0gdHlwZS52YWx1ZQotICAgICAgICAgICAgICAgIG1vZGluZm8uYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiAgICAiKSkKLSAgICAgICAgICAgICAgICB0eXBlbm9kZSA9IGRvYy5jcmVhdGVFbGVtZW50KCJ0eXBlIikKLSAgICAgICAgICAgICAgICB0eXBlbm9kZS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUodHlwZSkpCi0gICAgICAgICAgICAgICAgbW9kaW5mby5hcHBlbmRDaGlsZCh0eXBlbm9kZSkKLSAgICAgICAgdmVyc2lvbmFkZGVkID0gZXh0cmFjdF9maXJzdF9lbGVtZW50KHNlY3Rpb24sICJ2ZXJzaW9uYWRkZWQiKQotICAgICAgICBpZiB2ZXJzaW9uYWRkZWQ6Ci0gICAgICAgICAgICBtb2RpbmZvLnNldEF0dHJpYnV0ZSgiYWRkZWQiLCB2ZXJzaW9uYWRkZWQuZ2V0QXR0cmlidXRlKCJ2ZXJzaW9uIikpCi0gICAgICAgIHRpdGxlID0gZ2V0X2ZpcnN0X2VsZW1lbnQoc2VjdGlvbiwgInRpdGxlIikKLSAgICAgICAgaWYgdGl0bGU6Ci0gICAgICAgICAgICBjaGlsZHJlbiA9IHRpdGxlLmNoaWxkTm9kZXMKLSAgICAgICAgICAgIGlmIGxlbihjaGlsZHJlbikgPj0gMiBcCi0gICAgICAgICAgICAgICBhbmQgY2hpbGRyZW5bMF0ubm9kZU5hbWUgPT0gIm1vZHVsZSIgXAotICAgICAgICAgICAgICAgYW5kIGNoaWxkcmVuWzBdLmNoaWxkTm9kZXNbMF0uZGF0YSA9PSBuYW1lOgotICAgICAgICAgICAgICAgICMgdGhpcyBpcyBpdDsgbW9ycGggdGhlIDx0aXRsZT4gaW50byA8c2hvcnQtc3lub3BzaXM+Ci0gICAgICAgICAgICAgICAgZmlyc3RfZGF0YSA9IGNoaWxkcmVuWzFdCi0gICAgICAgICAgICAgICAgaWYgZmlyc3RfZGF0YS5kYXRhWzo0XSA9PSAiIC0tLSI6Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0X2RhdGEuZGF0YSA9IGZpcnN0X2RhdGEuZGF0YVs0Ol0ubHN0cmlwKCkKLSAgICAgICAgICAgICAgICBzZXRfdGFnTmFtZSh0aXRsZSwgInNob3J0LXN5bm9wc2lzIikKLSAgICAgICAgICAgICAgICBpZiBjaGlsZHJlblstMV0ubm9kZVR5cGUgPT0gVEVYVCBcCi0gICAgICAgICAgICAgICAgICAgYW5kIGNoaWxkcmVuWy0xXS5kYXRhWy0xOl0gPT0gIi4iOgotICAgICAgICAgICAgICAgICAgICBjaGlsZHJlblstMV0uZGF0YSA9IGNoaWxkcmVuWy0xXS5kYXRhWzotMV0KLSAgICAgICAgICAgICAgICBzZWN0aW9uLnJlbW92ZUNoaWxkKHRpdGxlKQotICAgICAgICAgICAgICAgIHNlY3Rpb24ucmVtb3ZlQ2hpbGQoc2VjdGlvbi5jaGlsZE5vZGVzWzBdKQotICAgICAgICAgICAgICAgIHRpdGxlLnJlbW92ZUNoaWxkKGNoaWxkcmVuWzBdKQotICAgICAgICAgICAgICAgIG1vZGluZm9fcG9zID0gMAotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBld3JpdGUoIm1vZHVsZSBuYW1lIGluIHRpdGxlIGRvZXNuJ3QgbWF0Y2giCi0gICAgICAgICAgICAgICAgICAgICAgICIgPGRlY2xhcmVtb2R1bGUvPjsgbm8gPHNob3J0LXN5bm9wc2lzLz5cbiIpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBld3JpdGUoIlVuZXhwZWN0ZWQgY29uZGl0aW9uOiA8c2VjdGlvbi8+IHdpdGhvdXQgPHRpdGxlLz5cbiIpCi0gICAgICAgIG1vZGluZm8uYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiAgICAiKSkKLSAgICAgICAgbW9kaW5mby5hcHBlbmRDaGlsZChub2RlKQotICAgICAgICBpZiB0aXRsZSBhbmQgbm90IGNvbnRlbnRzX21hdGNoKHRpdGxlLCBub2RlKToKLSAgICAgICAgICAgICMgVGhlIHNob3J0IHN5bm9wc2lzIGlzIGFjdHVhbGx5IGRpZmZlcmVudCwKLSAgICAgICAgICAgICMgYW5kIG5lZWRzIHRvIGJlIHN0b3JlZDoKLSAgICAgICAgICAgIG1vZGluZm8uYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiAgICAiKSkKLSAgICAgICAgICAgIG1vZGluZm8uYXBwZW5kQ2hpbGQodGl0bGUpCi0gICAgICAgIGlmIG1vZGF1dGhvcjoKLSAgICAgICAgICAgIG1vZGluZm8uYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiAgICAiKSkKLSAgICAgICAgICAgIG1vZGluZm8uYXBwZW5kQ2hpbGQobW9kYXV0aG9yKQotICAgICAgICBpZiBwbGF0Zm9ybToKLSAgICAgICAgICAgIG1vZGluZm8uYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiAgICAiKSkKLSAgICAgICAgICAgIG1vZGluZm8uYXBwZW5kQ2hpbGQocGxhdGZvcm0pCi0gICAgICAgIG1vZGluZm8uYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiAgIikpCi0gICAgICAgIHNlY3Rpb24uaW5zZXJ0QmVmb3JlKG1vZGluZm8sIHNlY3Rpb24uY2hpbGROb2Rlc1ttb2RpbmZvX3Bvc10pCi0gICAgICAgIHNlY3Rpb24uaW5zZXJ0QmVmb3JlKGRvYy5jcmVhdGVUZXh0Tm9kZSgiXG4gICIpLCBtb2RpbmZvKQotICAgICAgICAjCi0gICAgICAgICMgVGhlIHJlc3Qgb2YgdGhpcyByZW1vdmVzIGV4dHJhIG5ld2xpbmVzIGZyb20gd2hlcmUgd2UgY3V0IG91dAotICAgICAgICAjIGEgbG90IG9mIGVsZW1lbnRzLiAgQSBsb3Qgb2YgY29kZSBmb3IgbWluaW1hbCB2YWx1ZSwgYnV0IGtlZXBzCi0gICAgICAgICMga2VlcHMgdGhlIGdlbmVyYXRlZCAqTUwgZnJvbSBiZWluZyB0b28gZnVubnkgbG9va2luZy4KLSAgICAgICAgIwotICAgICAgICBzZWN0aW9uLm5vcm1hbGl6ZSgpCi0gICAgICAgIGNoaWxkcmVuID0gc2VjdGlvbi5jaGlsZE5vZGVzCi0gICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihjaGlsZHJlbikpOgotICAgICAgICAgICAgbm9kZSA9IGNoaWxkcmVuW2ldCi0gICAgICAgICAgICBpZiBub2RlLm5vZGVOYW1lID09ICJtb2R1bGVpbmZvIjoKLSAgICAgICAgICAgICAgICBuZXh0bm9kZSA9IGNoaWxkcmVuW2krMV0KLSAgICAgICAgICAgICAgICBpZiBuZXh0bm9kZS5ub2RlVHlwZSA9PSBURVhUOgotICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmV4dG5vZGUuZGF0YQotICAgICAgICAgICAgICAgICAgICBzID0gZGF0YS5sc3RyaXAoKQotICAgICAgICAgICAgICAgICAgICBpZiBsZW4ocykgPCAobGVuKGRhdGEpIC0gNCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXh0bm9kZS5kYXRhID0gIlxuXG5cbiIgKyBzCi0KLQotZGVmIGNsZWFudXBfc3lub3BzZXMoZG9jLCBmcmFnbWVudCk6Ci0gICAgZm9yIG5vZGUgaW4gZmluZF9hbGxfZWxlbWVudHMoZnJhZ21lbnQsICJzZWN0aW9uIik6Ci0gICAgICAgIGNyZWF0ZV9tb2R1bGVfaW5mbyhkb2MsIG5vZGUpCi0KLQotZGVmIGZpeHVwX3RhYmxlX3N0cnVjdHVyZXMoZG9jLCBmcmFnbWVudCk6Ci0gICAgZm9yIHRhYmxlIGluIGZpbmRfYWxsX2VsZW1lbnRzKGZyYWdtZW50LCAidGFibGUiKToKLSAgICAgICAgZml4dXBfdGFibGUoZG9jLCB0YWJsZSkKLQotCi1kZWYgZml4dXBfdGFibGUoZG9jLCB0YWJsZSk6Ci0gICAgIyBjcmVhdGUgdGhlIHRhYmxlIGhlYWQKLSAgICB0aGVhZCA9IGRvYy5jcmVhdGVFbGVtZW50KCJ0aGVhZCIpCi0gICAgcm93ID0gZG9jLmNyZWF0ZUVsZW1lbnQoInJvdyIpCi0gICAgbW92ZV9lbGVtZW50c19ieV9uYW1lKGRvYywgdGFibGUsIHJvdywgImVudHJ5IikKLSAgICB0aGVhZC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlxuICAgICIpKQotICAgIHRoZWFkLmFwcGVuZENoaWxkKHJvdykKLSAgICB0aGVhZC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlxuICAgICIpKQotICAgICMgY3JlYXRlIHRoZSB0YWJsZSBib2R5Ci0gICAgdGJvZHkgPSBkb2MuY3JlYXRlRWxlbWVudCgidGJvZHkiKQotICAgIHByZXZfcm93ID0gTm9uZQotICAgIGxhc3Rfd2FzX2hsaW5lID0gMAotICAgIGNoaWxkcmVuID0gdGFibGUuY2hpbGROb2RlcwotICAgIGZvciBjaGlsZCBpbiBjaGlsZHJlbjoKLSAgICAgICAgaWYgY2hpbGQubm9kZVR5cGUgPT0gRUxFTUVOVDoKLSAgICAgICAgICAgIHRhZ05hbWUgPSBjaGlsZC50YWdOYW1lCi0gICAgICAgICAgICBpZiB0YWdOYW1lID09ICJobGluZSIgYW5kIHByZXZfcm93IGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIHByZXZfcm93LnNldEF0dHJpYnV0ZSgicm93c2VwIiwgIjEiKQotICAgICAgICAgICAgZWxpZiB0YWdOYW1lID09ICJyb3ciOgotICAgICAgICAgICAgICAgIHByZXZfcm93ID0gY2hpbGQKLSAgICAjIHNhdmUgdGhlIHJvd3M6Ci0gICAgdGJvZHkuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiAgICAiKSkKLSAgICBtb3ZlX2VsZW1lbnRzX2J5X25hbWUoZG9jLCB0YWJsZSwgdGJvZHksICJyb3ciLCBzZXA9IlxuICAgICIpCi0gICAgIyBhbmQgdG9zcyB0aGUgcmVzdDoKLSAgICB3aGlsZSBjaGlsZHJlbjoKLSAgICAgICAgY2hpbGQgPSBjaGlsZHJlblswXQotICAgICAgICBub2RlVHlwZSA9IGNoaWxkLm5vZGVUeXBlCi0gICAgICAgIGlmIG5vZGVUeXBlID09IFRFWFQ6Ci0gICAgICAgICAgICBpZiBjaGlsZC5kYXRhLnN0cmlwKCk6Ci0gICAgICAgICAgICAgICAgcmFpc2UgQ29udmVyc2lvbkVycm9yKCJ1bmV4cGVjdGVkIGZyZWUgZGF0YSBpbiA8JXM+OiAlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAodGFibGUudGFnTmFtZSwgY2hpbGQuZGF0YSkpCi0gICAgICAgICAgICB0YWJsZS5yZW1vdmVDaGlsZChjaGlsZCkKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIGlmIG5vZGVUeXBlID09IEVMRU1FTlQ6Ci0gICAgICAgICAgICBpZiBjaGlsZC50YWdOYW1lICE9ICJobGluZSI6Ci0gICAgICAgICAgICAgICAgcmFpc2UgQ29udmVyc2lvbkVycm9yKAotICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCA8JXM+IGluIHRhYmxlIiAlIGNoaWxkLnRhZ05hbWUpCi0gICAgICAgICAgICB0YWJsZS5yZW1vdmVDaGlsZChjaGlsZCkKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIHJhaXNlIENvbnZlcnNpb25FcnJvcigKLSAgICAgICAgICAgICJ1bmV4cGVjdGVkICVzIG5vZGUgaW4gdGFibGUiICUgY2hpbGQuX19jbGFzc19fLl9fbmFtZV9fKQotICAgICMgbm90aGluZyBsZWZ0IGluIHRoZSA8dGFibGU+OyBhZGQgdGhlIDx0aGVhZD4gYW5kIDx0Ym9keT4KLSAgICB0Z3JvdXAgPSBkb2MuY3JlYXRlRWxlbWVudCgidGdyb3VwIikKLSAgICB0Z3JvdXAuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiAgIikpCi0gICAgdGdyb3VwLmFwcGVuZENoaWxkKHRoZWFkKQotICAgIHRncm91cC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlxuICAiKSkKLSAgICB0Z3JvdXAuYXBwZW5kQ2hpbGQodGJvZHkpCi0gICAgdGdyb3VwLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiXG4gICIpKQotICAgIHRhYmxlLmFwcGVuZENoaWxkKHRncm91cCkKLSAgICAjIG5vdyBtYWtlIHRoZSA8ZW50cnk+cyBsb29rIG5pY2U6Ci0gICAgZm9yIHJvdyBpbiB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgicm93Iik6Ci0gICAgICAgIGZpeHVwX3Jvdyhkb2MsIHJvdykKLQotCi1kZWYgZml4dXBfcm93KGRvYywgcm93KToKLSAgICBlbnRyaWVzID0gW10KLSAgICBtYXAoZW50cmllcy5hcHBlbmQsIHJvdy5jaGlsZE5vZGVzWzE6XSkKLSAgICBmb3IgZW50cnkgaW4gZW50cmllczoKLSAgICAgICAgcm93Lmluc2VydEJlZm9yZShkb2MuY3JlYXRlVGV4dE5vZGUoIlxuICAgICAgICAgIiksIGVudHJ5KQotIyAgICByb3cuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiAgICAgICIpKQotCi0KLWRlZiBtb3ZlX2VsZW1lbnRzX2J5X25hbWUoZG9jLCBzb3VyY2UsIGRlc3QsIG5hbWUsIHNlcD1Ob25lKToKLSAgICBub2RlcyA9IFtdCi0gICAgZm9yIGNoaWxkIGluIHNvdXJjZS5jaGlsZE5vZGVzOgotICAgICAgICBpZiBjaGlsZC5ub2RlTmFtZSA9PSBuYW1lOgotICAgICAgICAgICAgbm9kZXMuYXBwZW5kKGNoaWxkKQotICAgIGZvciBub2RlIGluIG5vZGVzOgotICAgICAgICBzb3VyY2UucmVtb3ZlQ2hpbGQobm9kZSkKLSAgICAgICAgZGVzdC5hcHBlbmRDaGlsZChub2RlKQotICAgICAgICBpZiBzZXA6Ci0gICAgICAgICAgICBkZXN0LmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZShzZXApKQotCi0KLVJFQ1VSU0VfSU5UT19QQVJBX0NPTlRBSU5FUlMgPSAoCi0gICAgImNoYXB0ZXIiLCAiYWJzdHJhY3QiLCAiZW51bWVyYXRlIiwKLSAgICAic2VjdGlvbiIsICJzdWJzZWN0aW9uIiwgInN1YnN1YnNlY3Rpb24iLAotICAgICJwYXJhZ3JhcGgiLCAic3VicGFyYWdyYXBoIiwgImJhY2stbWF0dGVyIiwKLSAgICAiaG93dG8iLCAibWFudWFsIiwKLSAgICAiaXRlbSIsICJpdGVtaXplIiwgImZ1bGxsaW5laXRlbXMiLCAiZW51bWVyYXRpb24iLCAiZGVzY3JpcHRpb25saXN0IiwKLSAgICAiZGVmaW5pdGlvbmxpc3QiLCAiZGVmaW5pdGlvbiIsCi0gICAgKQotCi1QQVJBX0xFVkVMX0VMRU1FTlRTID0gKAotICAgICJtb2R1bGVpbmZvIiwgInRpdGxlIiwgInZlcmJhdGltIiwgImVudW1lcmF0ZSIsICJpdGVtIiwKLSAgICAiaW50ZXJwcmV0ZXItc2Vzc2lvbiIsICJiYWNrLW1hdHRlciIsICJpbnRlcmFjdGl2ZS1zZXNzaW9uIiwKLSAgICAib3Bjb2RlZGVzYyIsICJjbGFzc2Rlc2MiLCAiZGF0YWRlc2MiLAotICAgICJjZnVuY2Rlc2MiLCAiY3R5cGVkZXNjIiwgImN2YXJkZXNjIiwKLSAgICAiZnVuY2Rlc2MiLCAibWV0aG9kZGVzYyIsICJleGNkZXNjIiwgIm1lbWJlcmRlc2MiLCAibWVtYmRlcmRlc2NuaSIsCi0gICAgImZ1bmNkZXNjbmkiLCAibWV0aG9kZGVzY25pIiwgImV4Y2Rlc2NuaSIsCi0gICAgInRhYmxlaWkiLCAidGFibGVpaWkiLCAidGFibGVpdiIsICJsb2NhbG1vZHVsZXRhYmxlIiwKLSAgICAic2VjdGlvbmF1dGhvciIsICJzZWVhbHNvIiwgIml0ZW1pemUiLAotICAgICMgaW5jbHVkZSA8cGFyYT4sIHNvIHdlIGNhbiBqdXN0IGRvIGl0IGFnYWluIHRvIGdldCBzdWJzZXF1ZW50IHBhcmFzOgotICAgIFBBUkFfRUxFTUVOVCwKLSAgICApCi0KLVBBUkFfTEVWRUxfUFJFQ0VFREVSUyA9ICgKLSAgICAic2V0aW5kZXhzdWJpdGVtIiwgImF1dGhvciIsCi0gICAgInN0aW5kZXgiLCAib2JpbmRleCIsICJDT01NRU5UIiwgImxhYmVsIiwgInhpOmluY2x1ZGUiLCAidGl0bGUiLAotICAgICJ2ZXJzaW9uYWRkZWQiLCAidmVyc2lvbmNoYW5nZWQiLCAiZGVjbGFyZW1vZHVsZSIsICJtb2R1bGVzeW5vcHNpcyIsCi0gICAgIm1vZHVsZWF1dGhvciIsICJpbmRleHRlcm0iLCAibGVhZGVyIiwKLSAgICApCi0KLQotZGVmIGZpeHVwX3BhcmFzKGRvYywgZnJhZ21lbnQpOgotICAgIGZvciBjaGlsZCBpbiBmcmFnbWVudC5jaGlsZE5vZGVzOgotICAgICAgICBpZiBjaGlsZC5ub2RlTmFtZSBpbiBSRUNVUlNFX0lOVE9fUEFSQV9DT05UQUlORVJTOgotICAgICAgICAgICAgZml4dXBfcGFyYXNfaGVscGVyKGRvYywgY2hpbGQpCi0gICAgZGVzY3JpcHRpb25zID0gZmluZF9hbGxfZWxlbWVudHMoZnJhZ21lbnQsICJkZXNjcmlwdGlvbiIpCi0gICAgZm9yIGRlc2NyaXB0aW9uIGluIGRlc2NyaXB0aW9uczoKLSAgICAgICAgZml4dXBfcGFyYXNfaGVscGVyKGRvYywgZGVzY3JpcHRpb24pCi0KLQotZGVmIGZpeHVwX3BhcmFzX2hlbHBlcihkb2MsIGNvbnRhaW5lciwgZGVwdGg9MCk6Ci0gICAgIyBkb2N1bWVudCBpcyBhbHJlYWR5IG5vcm1hbGl6ZWQKLSAgICBjaGlsZHJlbiA9IGNvbnRhaW5lci5jaGlsZE5vZGVzCi0gICAgc3RhcnQgPSBza2lwX2xlYWRpbmdfbm9kZXMoY2hpbGRyZW4pCi0gICAgd2hpbGUgbGVuKGNoaWxkcmVuKSA+IHN0YXJ0OgotICAgICAgICBpZiBjaGlsZHJlbltzdGFydF0ubm9kZU5hbWUgaW4gUkVDVVJTRV9JTlRPX1BBUkFfQ09OVEFJTkVSUzoKLSAgICAgICAgICAgICMgU29tZXRoaW5nIHRvIHJlY3Vyc2UgaW50bzoKLSAgICAgICAgICAgIGZpeHVwX3BhcmFzX2hlbHBlcihkb2MsIGNoaWxkcmVuW3N0YXJ0XSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgICMgUGFyYWdyYXBoIG1hdGVyaWFsOgotICAgICAgICAgICAgYnVpbGRfcGFyYShkb2MsIGNvbnRhaW5lciwgc3RhcnQsIGxlbihjaGlsZHJlbikpCi0gICAgICAgICAgICBpZiBERUJVR19QQVJBX0ZJWEVSIGFuZCBkZXB0aCA9PSAxMDoKLSAgICAgICAgICAgICAgICBzeXMuZXhpdCgxKQotICAgICAgICBzdGFydCA9IHNraXBfbGVhZGluZ19ub2RlcyhjaGlsZHJlbiwgc3RhcnQgKyAxKQotCi0KLWRlZiBidWlsZF9wYXJhKGRvYywgcGFyZW50LCBzdGFydCwgaSk6Ci0gICAgY2hpbGRyZW4gPSBwYXJlbnQuY2hpbGROb2RlcwotICAgIGFmdGVyID0gc3RhcnQgKyAxCi0gICAgaGF2ZV9sYXN0ID0gMAotICAgIEJSRUFLX0VMRU1FTlRTID0gUEFSQV9MRVZFTF9FTEVNRU5UUyArIFJFQ1VSU0VfSU5UT19QQVJBX0NPTlRBSU5FUlMKLSAgICAjIENvbGxlY3QgYWxsIGNoaWxkcmVuIHVudGlsIFxuXG4rIGlzIGZvdW5kIGluIGEgdGV4dCBub2RlIG9yIGEKLSAgICAjIG1lbWJlciBvZiBCUkVBS19FTEVNRU5UUyBpcyBmb3VuZC4KLSAgICBmb3IgaiBpbiByYW5nZShzdGFydCwgaSk6Ci0gICAgICAgIGFmdGVyID0gaiArIDEKLSAgICAgICAgY2hpbGQgPSBjaGlsZHJlbltqXQotICAgICAgICBub2RlVHlwZSA9IGNoaWxkLm5vZGVUeXBlCi0gICAgICAgIGlmIG5vZGVUeXBlID09IEVMRU1FTlQ6Ci0gICAgICAgICAgICBpZiBjaGlsZC50YWdOYW1lIGluIEJSRUFLX0VMRU1FTlRTOgotICAgICAgICAgICAgICAgIGFmdGVyID0gagotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIGVsaWYgbm9kZVR5cGUgPT0gVEVYVDoKLSAgICAgICAgICAgIHBvcyA9IGNoaWxkLmRhdGEuZmluZCgiXG5cbiIpCi0gICAgICAgICAgICBpZiBwb3MgPT0gMDoKLSAgICAgICAgICAgICAgICBhZnRlciA9IGoKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgaWYgcG9zID49IDE6Ci0gICAgICAgICAgICAgICAgY2hpbGQuc3BsaXRUZXh0KHBvcykKLSAgICAgICAgICAgICAgICBicmVhawotICAgIGVsc2U6Ci0gICAgICAgIGhhdmVfbGFzdCA9IDEKLSAgICBpZiAoc3RhcnQgKyAxKSA+IGFmdGVyOgotICAgICAgICByYWlzZSBDb252ZXJzaW9uRXJyb3IoCi0gICAgICAgICAgICAiYnVpbGRfcGFyYSgpIGNvdWxkIG5vdCBpZGVudGlmeSBjb250ZW50IHRvIHR1cm4gaW50byBhIHBhcmFncmFwaCIpCi0gICAgaWYgY2hpbGRyZW5bYWZ0ZXIgLSAxXS5ub2RlVHlwZSA9PSBURVhUOgotICAgICAgICAjIHdlIG1heSBuZWVkIHRvIHNwbGl0IG9mZiB0cmFpbGluZyB3aGl0ZSBzcGFjZToKLSAgICAgICAgY2hpbGQgPSBjaGlsZHJlblthZnRlciAtIDFdCi0gICAgICAgIGRhdGEgPSBjaGlsZC5kYXRhCi0gICAgICAgIGlmIGRhdGEucnN0cmlwKCkgIT0gZGF0YToKLSAgICAgICAgICAgIGhhdmVfbGFzdCA9IDAKLSAgICAgICAgICAgIGNoaWxkLnNwbGl0VGV4dChsZW4oZGF0YS5yc3RyaXAoKSkpCi0gICAgcGFyYSA9IGRvYy5jcmVhdGVFbGVtZW50KFBBUkFfRUxFTUVOVCkKLSAgICBwcmV2ID0gTm9uZQotICAgIGluZGV4ZXMgPSByYW5nZShzdGFydCwgYWZ0ZXIpCi0gICAgaW5kZXhlcy5yZXZlcnNlKCkKLSAgICBmb3IgaiBpbiBpbmRleGVzOgotICAgICAgICBub2RlID0gcGFyZW50LmNoaWxkTm9kZXNbal0KLSAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKG5vZGUpCi0gICAgICAgIHBhcmEuaW5zZXJ0QmVmb3JlKG5vZGUsIHByZXYpCi0gICAgICAgIHByZXYgPSBub2RlCi0gICAgaWYgaGF2ZV9sYXN0OgotICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQocGFyYSkKLSAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiXG5cbiIpKQotICAgICAgICByZXR1cm4gbGVuKHBhcmVudC5jaGlsZE5vZGVzKQotICAgIGVsc2U6Ci0gICAgICAgIG5leHRub2RlID0gcGFyZW50LmNoaWxkTm9kZXNbc3RhcnRdCi0gICAgICAgIGlmIG5leHRub2RlLm5vZGVUeXBlID09IFRFWFQ6Ci0gICAgICAgICAgICBpZiBuZXh0bm9kZS5kYXRhIGFuZCBuZXh0bm9kZS5kYXRhWzBdICE9ICJcbiI6Ci0gICAgICAgICAgICAgICAgbmV4dG5vZGUuZGF0YSA9ICJcbiIgKyBuZXh0bm9kZS5kYXRhCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBuZXdub2RlID0gZG9jLmNyZWF0ZVRleHROb2RlKCJcbiIpCi0gICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5ld25vZGUsIG5leHRub2RlKQotICAgICAgICAgICAgbmV4dG5vZGUgPSBuZXdub2RlCi0gICAgICAgICAgICBzdGFydCA9IHN0YXJ0ICsgMQotICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKHBhcmEsIG5leHRub2RlKQotICAgICAgICByZXR1cm4gc3RhcnQgKyAxCi0KLQotZGVmIHNraXBfbGVhZGluZ19ub2RlcyhjaGlsZHJlbiwgc3RhcnQ9MCk6Ci0gICAgIiIiUmV0dXJuIGluZGV4IGludG8gY2hpbGRyZW4gb2YgYSBub2RlIGF0IHdoaWNoIHBhcmFncmFwaCBidWlsZGluZyBzaG91bGQKLSAgICBiZWdpbiBvciBhIHJlY3Vyc2l2ZSBjYWxsIHRvIGZpeHVwX3BhcmFzX2hlbHBlcigpIHNob3VsZCBiZSBtYWRlIChmb3IKLSAgICBzdWJzZWN0aW9ucywgZXRjLikuCi0KLSAgICBXaGVuIHRoZSByZXR1cm4gdmFsdWUgPj0gbGVuKGNoaWxkcmVuKSwgd2UndmUgYnVpbHQgYWxsIHRoZSBwYXJhcyB3ZSBjYW4KLSAgICBmcm9tIHRoaXMgbGlzdCBvZiBjaGlsZHJlbi4KLSAgICAiIiIKLSAgICBpID0gbGVuKGNoaWxkcmVuKQotICAgIHdoaWxlIGkgPiBzdGFydDoKLSAgICAgICAgIyBza2lwIG92ZXIgbGVhZGluZyBjb21tZW50cyBhbmQgd2hpdGVzcGFjZToKLSAgICAgICAgY2hpbGQgPSBjaGlsZHJlbltzdGFydF0KLSAgICAgICAgbm9kZVR5cGUgPSBjaGlsZC5ub2RlVHlwZQotICAgICAgICBpZiBub2RlVHlwZSA9PSBURVhUOgotICAgICAgICAgICAgZGF0YSA9IGNoaWxkLmRhdGEKLSAgICAgICAgICAgIHNob3J0ZW5lZCA9IGRhdGEubHN0cmlwKCkKLSAgICAgICAgICAgIGlmIHNob3J0ZW5lZDoKLSAgICAgICAgICAgICAgICBpZiBkYXRhICE9IHNob3J0ZW5lZDoKLSAgICAgICAgICAgICAgICAgICAgIyBicmVhayBpbnRvIHR3byBub2Rlczogd2hpdGVzcGFjZSBhbmQgbm9uLXdoaXRlc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3BsaXRUZXh0KGxlbihkYXRhKSAtIGxlbihzaG9ydGVuZWQpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnQgKyAxCi0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0Ci0gICAgICAgICAgICAjIGFsbCB3aGl0ZXNwYWNlLCBqdXN0IHNraXAKLSAgICAgICAgZWxpZiBub2RlVHlwZSA9PSBFTEVNRU5UOgotICAgICAgICAgICAgdGFnTmFtZSA9IGNoaWxkLnRhZ05hbWUKLSAgICAgICAgICAgIGlmIHRhZ05hbWUgaW4gUkVDVVJTRV9JTlRPX1BBUkFfQ09OVEFJTkVSUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnQKLSAgICAgICAgICAgIGlmIHRhZ05hbWUgbm90IGluIFBBUkFfTEVWRUxfRUxFTUVOVFMgKyBQQVJBX0xFVkVMX1BSRUNFRURFUlM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0Ci0gICAgICAgIHN0YXJ0ID0gc3RhcnQgKyAxCi0gICAgcmV0dXJuIHN0YXJ0Ci0KLQotZGVmIGZpeHVwX3JmY19yZWZlcmVuY2VzKGRvYywgZnJhZ21lbnQpOgotICAgIGZvciByZmNub2RlIGluIGZpbmRfYWxsX2VsZW1lbnRzX2Zyb21fc2V0KGZyYWdtZW50LCAoInBlcCIsICJyZmMiKSk6Ci0gICAgICAgIHJmY25vZGUuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKAotICAgICAgICAgICAgcmZjbm9kZS50YWdOYW1lLnVwcGVyKCkgKyAiICIgKyByZmNub2RlLmdldEF0dHJpYnV0ZSgibnVtIikpKQotCi0KLWRlZiBmaXh1cF9zaWduYXR1cmVzKGRvYywgZnJhZ21lbnQpOgotICAgIGZvciBjaGlsZCBpbiBmcmFnbWVudC5jaGlsZE5vZGVzOgotICAgICAgICBpZiBjaGlsZC5ub2RlVHlwZSA9PSBFTEVNRU5UOgotICAgICAgICAgICAgYXJncyA9IGNoaWxkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhcmdzIikKLSAgICAgICAgICAgIGZvciBhcmcgaW4gYXJnczoKLSAgICAgICAgICAgICAgICByZXdyaXRlX2FyZ3MoZG9jLCBhcmcpCi0gICAgICAgICAgICBhcmdzID0gY2hpbGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImNvbnN0cnVjdG9yLWFyZ3MiKQotICAgICAgICAgICAgZm9yIGFyZyBpbiBhcmdzOgotICAgICAgICAgICAgICAgIHJld3JpdGVfYXJncyhkb2MsIGFyZykKLQotZGVmIHJld3JpdGVfYXJncyhkb2MsIGFyZ2xpc3QpOgotICAgIGZpeHVwX2FyZ3MoZG9jLCBhcmdsaXN0KQotICAgIGFyZ2xpc3Qubm9ybWFsaXplKCkKLSAgICBpZiBhcmdsaXN0LmNoaWxkTm9kZXMubGVuZ3RoID09IDEgYW5kIGFyZ2xpc3QuZmlyc3RDaGlsZC5ub2RlVHlwZSA9PSBURVhUOgotICAgICAgICBub2RlID0gYXJnbGlzdC5maXJzdENoaWxkCi0gICAgICAgIG5vZGUuZGF0YSA9ICcgJy5qb2luKG5vZGUuZGF0YS5zcGxpdCgpKQotCi1kZWYgZml4dXBfYXJncyhkb2MsIGFyZ2xpc3QpOgotICAgIGZvciBjaGlsZCBpbiBhcmdsaXN0LmNoaWxkTm9kZXM6Ci0gICAgICAgIGlmIGNoaWxkLm5vZGVOYW1lID09ICJvcHRpb25hbCI6Ci0gICAgICAgICAgICAjIGZvdW5kIGl0OyBmaXggYW5kIHJldHVybgotICAgICAgICAgICAgYXJnbGlzdC5pbnNlcnRCZWZvcmUoZG9jLmNyZWF0ZVRleHROb2RlKCJbIiksIGNoaWxkKQotICAgICAgICAgICAgb3B0a2lkcyA9IGNoaWxkLmNoaWxkTm9kZXMKLSAgICAgICAgICAgIHdoaWxlIG9wdGtpZHM6Ci0gICAgICAgICAgICAgICAgYXJnbGlzdC5pbnNlcnRCZWZvcmUoY2hpbGQuZmlyc3RDaGlsZCwgY2hpbGQpCi0gICAgICAgICAgICBhcmdsaXN0Lmluc2VydEJlZm9yZShkb2MuY3JlYXRlVGV4dE5vZGUoIl0iKSwgY2hpbGQpCi0gICAgICAgICAgICBhcmdsaXN0LnJlbW92ZUNoaWxkKGNoaWxkKQotICAgICAgICAgICAgcmV0dXJuIGZpeHVwX2FyZ3MoZG9jLCBhcmdsaXN0KQotCi0KLWRlZiBmaXh1cF9zZWN0aW9uYXV0aG9ycyhkb2MsIGZyYWdtZW50KToKLSAgICBmb3Igc2VjdGF1dGggaW4gZmluZF9hbGxfZWxlbWVudHMoZnJhZ21lbnQsICJzZWN0aW9uYXV0aG9yIik6Ci0gICAgICAgIHNlY3Rpb24gPSBzZWN0YXV0aC5wYXJlbnROb2RlCi0gICAgICAgIHNlY3Rpb24ucmVtb3ZlQ2hpbGQoc2VjdGF1dGgpCi0gICAgICAgIHNldF90YWdOYW1lKHNlY3RhdXRoLCAiYXV0aG9yIikKLSAgICAgICAgc2VjdGF1dGguYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKAotICAgICAgICAgICAgc2VjdGF1dGguZ2V0QXR0cmlidXRlKCJuYW1lIikpKQotICAgICAgICBzZWN0YXV0aC5yZW1vdmVBdHRyaWJ1dGUoIm5hbWUiKQotICAgICAgICBhZnRlciA9IHNlY3Rpb24uY2hpbGROb2Rlc1syXQotICAgICAgICB0aXRsZSA9IHNlY3Rpb24uY2hpbGROb2Rlc1sxXQotICAgICAgICBpZiB0aXRsZS5ub2RlTmFtZSAhPSAidGl0bGUiOgotICAgICAgICAgICAgYWZ0ZXIgPSBzZWN0aW9uLmNoaWxkTm9kZXNbMF0KLSAgICAgICAgc2VjdGlvbi5pbnNlcnRCZWZvcmUoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiAgIiksIGFmdGVyKQotICAgICAgICBzZWN0aW9uLmluc2VydEJlZm9yZShzZWN0YXV0aCwgYWZ0ZXIpCi0KLQotZGVmIGZpeHVwX3ZlcmJhdGltcyhkb2MpOgotICAgIGZvciB2ZXJiYXRpbSBpbiBmaW5kX2FsbF9lbGVtZW50cyhkb2MsICJ2ZXJiYXRpbSIpOgotICAgICAgICBjaGlsZCA9IHZlcmJhdGltLmNoaWxkTm9kZXNbMF0KLSAgICAgICAgaWYgY2hpbGQubm9kZVR5cGUgPT0gVEVYVCBcCi0gICAgICAgICAgIGFuZCBjaGlsZC5kYXRhLmxzdHJpcCgpLnN0YXJ0c3dpdGgoIj4+PiIpOgotICAgICAgICAgICAgc2V0X3RhZ05hbWUodmVyYmF0aW0sICJpbnRlcmFjdGl2ZS1zZXNzaW9uIikKLQotCi1kZWYgYWRkX25vZGVfaWRzKGZyYWdtZW50LCBjb3VudGVyPTApOgotICAgIGZyYWdtZW50Lm5vZGVfaWQgPSBjb3VudGVyCi0gICAgZm9yIG5vZGUgaW4gZnJhZ21lbnQuY2hpbGROb2RlczoKLSAgICAgICAgY291bnRlciA9IGNvdW50ZXIgKyAxCi0gICAgICAgIGlmIG5vZGUubm9kZVR5cGUgPT0gRUxFTUVOVDoKLSAgICAgICAgICAgIGNvdW50ZXIgPSBhZGRfbm9kZV9pZHMobm9kZSwgY291bnRlcikKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIG5vZGUubm9kZV9pZCA9IGNvdW50ZXIKLSAgICByZXR1cm4gY291bnRlciArIDEKLQotCi1kZWYgZml4dXBfdWxpbmsoZG9jLCBmcmFnbWVudCk6Ci0gICAgZm9yIHVsaW5rIGluIGZpbmRfYWxsX2VsZW1lbnRzKGZyYWdtZW50LCAidWxpbmsiKToKLSAgICAgICAgY2hpbGRyZW4gPSB1bGluay5jaGlsZE5vZGVzCi0gICAgICAgIGFzc2VydCBsZW4oY2hpbGRyZW4pID09IDIKLSAgICAgICAgdGV4dCA9IGNoaWxkcmVuWzBdCi0gICAgICAgIGhyZWYgPSBjaGlsZHJlblsxXQotICAgICAgICBocmVmLm5vcm1hbGl6ZSgpCi0gICAgICAgIGFzc2VydCBsZW4oaHJlZi5jaGlsZE5vZGVzKSA9PSAxCi0gICAgICAgIGFzc2VydCBocmVmLmNoaWxkTm9kZXNbMF0ubm9kZVR5cGUgPT0gVEVYVAotICAgICAgICB1cmwgPSBocmVmLmNoaWxkTm9kZXNbMF0uZGF0YQotICAgICAgICB1bGluay5zZXRBdHRyaWJ1dGUoImhyZWYiLCB1cmwpCi0gICAgICAgIHVsaW5rLnJlbW92ZUNoaWxkKGhyZWYpCi0gICAgICAgIGNvbnRlbnQgPSB0ZXh0LmNoaWxkTm9kZXMKLSAgICAgICAgd2hpbGUgbGVuKGNvbnRlbnQpOgotICAgICAgICAgICAgdWxpbmsuYXBwZW5kQ2hpbGQoY29udGVudFswXSkKLSAgICAgICAgdWxpbmsucmVtb3ZlQ2hpbGQodGV4dCkKLQotCi1SRUZNT0RJTkRFWF9FTEVNRU5UUyA9ICgncmVmbW9kaW5kZXgnLCAncmVmYmltb2RpbmRleCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAncmVmZXhtb2RpbmRleCcsICdyZWZzdG1vZGluZGV4JykKLQotZGVmIGZpeHVwX3JlZm1vZGluZGV4ZXMoZnJhZ21lbnQpOgotICAgICMgTG9jYXRlIDxyZWYqbW9kaW5kZXg+Li4uPC8+IGNvLWxvY2F0ZWQgd2l0aCA8bW9kdWxlPi4uLjwvPiwgYW5kCi0gICAgIyByZW1vdmUgdGhlIDxyZWYqbW9kaW5kZXg+LCByZXBsYWNpbmcgaXQgd2l0aCBpbmRleD1pbmRleCBvbiB0aGUKLSAgICAjIDxtb2R1bGU+IGVsZW1lbnQuCi0gICAgbm9kZXMgPSBmaW5kX2FsbF9lbGVtZW50c19mcm9tX3NldChmcmFnbWVudCwgUkVGTU9ESU5ERVhfRUxFTUVOVFMpCi0gICAgZCA9IHt9Ci0gICAgZm9yIG5vZGUgaW4gbm9kZXM6Ci0gICAgICAgIHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZQotICAgICAgICBkW3BhcmVudC5ub2RlX2lkXSA9IHBhcmVudAotICAgIGRlbCBub2RlcwotICAgIG1hcChmaXh1cF9yZWZtb2RpbmRleGVzX2NodW5rLCBkLnZhbHVlcygpKQotCi0KLWRlZiBmaXh1cF9yZWZtb2RpbmRleGVzX2NodW5rKGNvbnRhaW5lcik6Ci0gICAgIyBub2RlIGlzIHByb2JhYmx5IGEgPHBhcmE+OyBsZXQncyBzZWUgaG93IG9mdGVuIGl0IGlzbid0OgotICAgIGlmIGNvbnRhaW5lci50YWdOYW1lICE9IFBBUkFfRUxFTUVOVDoKLSAgICAgICAgYndyaXRlKCItLS0gZml4dXBfcmVmbW9kaW5kZXhlc19jaHVuayglcylcbiIgJSBjb250YWluZXIpCi0gICAgbW9kdWxlX2VudHJpZXMgPSBmaW5kX2FsbF9lbGVtZW50cyhjb250YWluZXIsICJtb2R1bGUiKQotICAgIGlmIG5vdCBtb2R1bGVfZW50cmllczoKLSAgICAgICAgcmV0dXJuCi0gICAgaW5kZXhfZW50cmllcyA9IGZpbmRfYWxsX2VsZW1lbnRzX2Zyb21fc2V0KGNvbnRhaW5lciwgUkVGTU9ESU5ERVhfRUxFTUVOVFMpCi0gICAgcmVtb3ZlcyA9IFtdCi0gICAgZm9yIGVudHJ5IGluIGluZGV4X2VudHJpZXM6Ci0gICAgICAgIGNoaWxkcmVuID0gZW50cnkuY2hpbGROb2RlcwotICAgICAgICBpZiBsZW4oY2hpbGRyZW4pICE9IDA6Ci0gICAgICAgICAgICBid3JpdGUoIi0tLSB1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBmb3IgJXMgbm9kZTpcbiIKLSAgICAgICAgICAgICAgICAgICAlIGVudHJ5LnRhZ05hbWUpCi0gICAgICAgICAgICBld3JpdGUoZW50cnkudG94bWwoKSArICJcbiIpCi0gICAgICAgICAgICBjb250aW51ZQotICAgICAgICBmb3VuZCA9IDAKLSAgICAgICAgbW9kdWxlX25hbWUgPSBlbnRyeS5nZXRBdHRyaWJ1dGUoIm1vZHVsZSIpCi0gICAgICAgIGZvciBub2RlIGluIG1vZHVsZV9lbnRyaWVzOgotICAgICAgICAgICAgaWYgbGVuKG5vZGUuY2hpbGROb2RlcykgIT0gMToKLSAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgdGhpc19uYW1lID0gbm9kZS5jaGlsZE5vZGVzWzBdLmRhdGEKLSAgICAgICAgICAgIGlmIHRoaXNfbmFtZSA9PSBtb2R1bGVfbmFtZToKLSAgICAgICAgICAgICAgICBmb3VuZCA9IDEKLSAgICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgiaW5kZXgiLCAieWVzIikKLSAgICAgICAgaWYgZm91bmQ6Ci0gICAgICAgICAgICByZW1vdmVzLmFwcGVuZChlbnRyeSkKLSAgICBmb3Igbm9kZSBpbiByZW1vdmVzOgotICAgICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQobm9kZSkKLQotCi1kZWYgZml4dXBfYmlmdW5jaW5kZXhlcyhmcmFnbWVudCk6Ci0gICAgbm9kZXMgPSBmaW5kX2FsbF9lbGVtZW50cyhmcmFnbWVudCwgJ2JpZnVuY2luZGV4JykKLSAgICBkID0ge30KLSAgICAjIG1ha2Ugc3VyZSB0aGF0IGVhY2ggcGFyZW50IGlzIG9ubHkgcHJvY2Vzc2VkIG9uY2U6Ci0gICAgZm9yIG5vZGUgaW4gbm9kZXM6Ci0gICAgICAgIHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZQotICAgICAgICBkW3BhcmVudC5ub2RlX2lkXSA9IHBhcmVudAotICAgIGRlbCBub2RlcwotICAgIG1hcChmaXh1cF9iaWZ1bmNpbmRleGVzX2NodW5rLCBkLnZhbHVlcygpKQotCi0KLWRlZiBmaXh1cF9iaWZ1bmNpbmRleGVzX2NodW5rKGNvbnRhaW5lcik6Ci0gICAgcmVtb3ZlcyA9IFtdCi0gICAgZW50cmllcyA9IGZpbmRfYWxsX2NoaWxkX2VsZW1lbnRzKGNvbnRhaW5lciwgImJpZnVuY2luZGV4IikKLSAgICBmdW5jdGlvbl9lbnRyaWVzID0gZmluZF9hbGxfY2hpbGRfZWxlbWVudHMoY29udGFpbmVyLCAiZnVuY3Rpb24iKQotICAgIGZvciBlbnRyeSBpbiBlbnRyaWVzOgotICAgICAgICBmdW5jdGlvbl9uYW1lID0gZW50cnkuZ2V0QXR0cmlidXRlKCJuYW1lIikKLSAgICAgICAgZm91bmQgPSAwCi0gICAgICAgIGZvciBmdW5jX2VudHJ5IGluIGZ1bmN0aW9uX2VudHJpZXM6Ci0gICAgICAgICAgICB0MiA9IGZ1bmNfZW50cnkuY2hpbGROb2Rlc1swXS5kYXRhCi0gICAgICAgICAgICBpZiB0MlstMjpdICE9ICIoKSI6Ci0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIHQyID0gdDJbOi0yXQotICAgICAgICAgICAgaWYgdDIgPT0gZnVuY3Rpb25fbmFtZToKLSAgICAgICAgICAgICAgICBmdW5jX2VudHJ5LnNldEF0dHJpYnV0ZSgiaW5kZXgiLCAieWVzIikKLSAgICAgICAgICAgICAgICBmdW5jX2VudHJ5LnNldEF0dHJpYnV0ZSgibW9kdWxlIiwgIl9fYnVpbHRpbl9fIikKLSAgICAgICAgICAgICAgICBpZiBub3QgZm91bmQ6Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gMQotICAgICAgICAgICAgICAgICAgICByZW1vdmVzLmFwcGVuZChlbnRyeSkKLSAgICBmb3IgZW50cnkgaW4gcmVtb3ZlczoKLSAgICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKGVudHJ5KQotCi0KLWRlZiBqb2luX2FkamFjZW50X2VsZW1lbnRzKGNvbnRhaW5lciwgZ2kpOgotICAgIHF1ZXVlID0gW2NvbnRhaW5lcl0KLSAgICB3aGlsZSBxdWV1ZToKLSAgICAgICAgcGFyZW50ID0gcXVldWUucG9wKCkKLSAgICAgICAgaSA9IDAKLSAgICAgICAgY2hpbGRyZW4gPSBwYXJlbnQuY2hpbGROb2RlcwotICAgICAgICBuY2hpbGRyZW4gPSBsZW4oY2hpbGRyZW4pCi0gICAgICAgIHdoaWxlIGkgPCAobmNoaWxkcmVuIC0gMSk6Ci0gICAgICAgICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldCi0gICAgICAgICAgICBpZiBjaGlsZC5ub2RlTmFtZSA9PSBnaToKLSAgICAgICAgICAgICAgICBpZiBjaGlsZHJlbltpKzFdLm5vZGVOYW1lID09IGdpOgotICAgICAgICAgICAgICAgICAgICBld3JpdGUoIi0tLSBtZXJnaW5nIHR3byA8JXMvPiBlbGVtZW50c1xuIiAlIGdpKQotICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldCi0gICAgICAgICAgICAgICAgICAgIG5leHRjaGlsZCA9IGNoaWxkcmVuW2krMV0KLSAgICAgICAgICAgICAgICAgICAgbmV4dGNoaWxkcmVuID0gbmV4dGNoaWxkLmNoaWxkTm9kZXMKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgbGVuKG5leHRjaGlsZHJlbik6Ci0gICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gbmV4dGNoaWxkcmVuWzBdCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXh0Y2hpbGQucmVtb3ZlQ2hpbGQobm9kZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmFwcGVuZENoaWxkKG5vZGUpCi0gICAgICAgICAgICAgICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChuZXh0Y2hpbGQpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICBpZiBjaGlsZC5ub2RlVHlwZSA9PSBFTEVNRU5UOgotICAgICAgICAgICAgICAgIHF1ZXVlLmFwcGVuZChjaGlsZCkKLSAgICAgICAgICAgIGkgPSBpICsgMQotCi0KLV90b2tlbl9yeCA9IHJlLmNvbXBpbGUociJbYS16QS1aXVthLXpBLVowLTkuLV0qJCIpCi0KLWRlZiB3cml0ZV9lc2lzKGRvYywgb2ZwLCBrbm93bmVtcHR5KToKLSAgICBmb3Igbm9kZSBpbiBkb2MuY2hpbGROb2RlczoKLSAgICAgICAgbm9kZVR5cGUgPSBub2RlLm5vZGVUeXBlCi0gICAgICAgIGlmIG5vZGVUeXBlID09IEVMRU1FTlQ6Ci0gICAgICAgICAgICBnaSA9IG5vZGUudGFnTmFtZQotICAgICAgICAgICAgaWYga25vd25lbXB0eShnaSk6Ci0gICAgICAgICAgICAgICAgaWYgbm9kZS5oYXNDaGlsZE5vZGVzKCk6Ci0gICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImRlY2xhcmVkLWVtcHR5IG5vZGUgPCVzPiBoYXMgY2hpbGRyZW4iICUgZ2kpCi0gICAgICAgICAgICAgICAgb2ZwLndyaXRlKCJlXG4iKQotICAgICAgICAgICAgZm9yIGssIHZhbHVlIGluIG5vZGUuYXR0cmlidXRlcy5pdGVtcygpOgotICAgICAgICAgICAgICAgIGlmIF90b2tlbl9yeC5tYXRjaCh2YWx1ZSk6Ci0gICAgICAgICAgICAgICAgICAgIGR0eXBlID0gIlRPS0VOIgotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIGR0eXBlID0gIkNEQVRBIgotICAgICAgICAgICAgICAgIG9mcC53cml0ZSgiQSVzICVzICVzXG4iICUgKGssIGR0eXBlLCBlc2lzdG9vbHMuZW5jb2RlKHZhbHVlKSkpCi0gICAgICAgICAgICBvZnAud3JpdGUoIiglc1xuIiAlIGdpKQotICAgICAgICAgICAgd3JpdGVfZXNpcyhub2RlLCBvZnAsIGtub3duZW1wdHkpCi0gICAgICAgICAgICBvZnAud3JpdGUoIiklc1xuIiAlIGdpKQotICAgICAgICBlbGlmIG5vZGVUeXBlID09IFRFWFQ6Ci0gICAgICAgICAgICBvZnAud3JpdGUoIi0lc1xuIiAlIGVzaXN0b29scy5lbmNvZGUobm9kZS5kYXRhKSkKLSAgICAgICAgZWxpZiBub2RlVHlwZSA9PSBFTlRJVFlfUkVGRVJFTkNFOgotICAgICAgICAgICAgb2ZwLndyaXRlKCImJXNcbiIgJSBub2RlLm5vZGVOYW1lKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJ1bnN1cHBvcnRlZCBub2RlIHR5cGU6ICVzIiAlIG5vZGVUeXBlKQotCi0KLWRlZiBjb252ZXJ0KGlmcCwgb2ZwKToKLSAgICBldmVudHMgPSBlc2lzdG9vbHMucGFyc2UoaWZwKQotICAgIHRva3R5cGUsIGRvYyA9IGV2ZW50cy5nZXRFdmVudCgpCi0gICAgZnJhZ21lbnQgPSBkb2MuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpCi0gICAgZXZlbnRzLmV4cGFuZE5vZGUoZnJhZ21lbnQpCi0KLSAgICBub3JtYWxpemUoZnJhZ21lbnQpCi0gICAgc2ltcGxpZnkoZG9jLCBmcmFnbWVudCkKLSAgICBoYW5kbGVfbGFiZWxzKGRvYywgZnJhZ21lbnQpCi0gICAgaGFuZGxlX2FwcGVuZGl4KGRvYywgZnJhZ21lbnQpCi0gICAgZml4dXBfdHJhaWxpbmdfd2hpdGVzcGFjZShkb2MsIGZyYWdtZW50LCB7Ci0gICAgICAgICMgZWxlbWVudCAtPiAoYmVmb3JlLWVuZC10YWcsIGFmdGVyLWVuZC10YWcpCi0gICAgICAgICJhYnN0cmFjdCI6ICgiXG4iLCAiXG4iKSwKLSAgICAgICAgInRpdGxlIjogKCIiLCAiXG4iKSwKLSAgICAgICAgImNoYXB0ZXIiOiAoIlxuIiwgIlxuXG5cbiIpLAotICAgICAgICAic2VjdGlvbiI6ICgiXG4iLCAiXG5cblxuIiksCi0gICAgICAgICJzdWJzZWN0aW9uIjogKCJcbiIsICJcblxuIiksCi0gICAgICAgICJzdWJzdWJzZWN0aW9uIjogKCJcbiIsICJcblxuIiksCi0gICAgICAgICJwYXJhZ3JhcGgiOiAoIlxuIiwgIlxuXG4iKSwKLSAgICAgICAgInN1YnBhcmFncmFwaCI6ICgiXG4iLCAiXG5cbiIpLAotICAgICAgICAiZGVzY3JpcHRpb24iOiAoIlxuIiwgIlxuXG4iKSwKLSAgICAgICAgImVudW1lcmF0aW9uIjogKCJcbiIsICJcblxuIiksCi0gICAgICAgICJpdGVtIjogKCJcbiIsICJcblxuIiksCi0gICAgICAgIH0pCi0gICAgY2xlYW51cF9yb290X3RleHQoZG9jKQotICAgIGNsZWFudXBfdHJhaWxpbmdfcGFyZW5zKGZyYWdtZW50LCBbImZ1bmN0aW9uIiwgIm1ldGhvZCIsICJjZnVuY3Rpb24iXSkKLSAgICBjbGVhbnVwX3N5bm9wc2VzKGRvYywgZnJhZ21lbnQpCi0gICAgZml4dXBfZGVzY3JpcHRvcnMoZG9jLCBmcmFnbWVudCkKLSAgICBmaXh1cF92ZXJiYXRpbXMoZnJhZ21lbnQpCi0gICAgbm9ybWFsaXplKGZyYWdtZW50KQotICAgIGZpeHVwX3BhcmFzKGRvYywgZnJhZ21lbnQpCi0gICAgZml4dXBfc2VjdGlvbmF1dGhvcnMoZG9jLCBmcmFnbWVudCkKLSAgICBmaXh1cF90YWJsZV9zdHJ1Y3R1cmVzKGRvYywgZnJhZ21lbnQpCi0gICAgZml4dXBfcmZjX3JlZmVyZW5jZXMoZG9jLCBmcmFnbWVudCkKLSAgICBmaXh1cF9zaWduYXR1cmVzKGRvYywgZnJhZ21lbnQpCi0gICAgZml4dXBfdWxpbmsoZG9jLCBmcmFnbWVudCkKLSAgICBhZGRfbm9kZV9pZHMoZnJhZ21lbnQpCi0gICAgZml4dXBfcmVmbW9kaW5kZXhlcyhmcmFnbWVudCkKLSAgICBmaXh1cF9iaWZ1bmNpbmRleGVzKGZyYWdtZW50KQotICAgICMgVGFrZSBjYXJlIG9mIHVnbHkgaGFja3MgaW4gdGhlIExhVGVYIG1hcmt1cCB0byBhdm9pZCBMYVRlWCBhbmQKLSAgICAjIExhVGVYMkhUTUwgc2NyZXdpbmcgd2l0aCBHTlUtc3R5bGUgbG9uZyBvcHRpb25zICh0aGUgJy0tJyBwcm9ibGVtKS4KLSAgICBqb2luX2FkamFjZW50X2VsZW1lbnRzKGZyYWdtZW50LCAib3B0aW9uIikKLSAgICAjIEF0dGVtcHQgdG8gYXZvaWQgdHJhaWxpbmcgYmxhbmsgbGluZXM6Ci0gICAgZnJhZ21lbnQubm9ybWFsaXplKCkKLSAgICBpZiBmcmFnbWVudC5sYXN0Q2hpbGQuZGF0YVstMTpdID09ICJcbiI6Ci0gICAgICAgIGZyYWdtZW50Lmxhc3RDaGlsZC5kYXRhID0gZnJhZ21lbnQubGFzdENoaWxkLmRhdGEucnN0cmlwKCkgKyAiXG4iCi0gICAgIwotICAgIGQgPSB7fQotICAgIGZvciBnaSBpbiBldmVudHMucGFyc2VyLmdldF9lbXB0aWVzKCk6Ci0gICAgICAgIGRbZ2ldID0gZ2kKLSAgICBmb3Iga2V5IGluICgiYXV0aG9yIiwgInBlcCIsICJyZmMiKToKLSAgICAgICAgaWYga2V5IGluIGQ6Ci0gICAgICAgICAgICBkZWwgZFtrZXldCi0gICAga25vd25lbXB0eSA9IGQuaGFzX2tleQotICAgICMKLSAgICB0cnk6Ci0gICAgICAgIHdyaXRlX2VzaXMoZnJhZ21lbnQsIG9mcCwga25vd25lbXB0eSkKLSAgICBleGNlcHQgSU9FcnJvciBhcyBlOgotICAgICAgICAoZXJyLCBtc2cpID0gZQotICAgICAgICAjIElnbm9yZSBFUElQRTsgaXQganVzdCBtZWFucyB0aGF0IHdob2V2ZXIgd2UncmUgd3JpdGluZyB0byBzdG9wcGVkCi0gICAgICAgICMgcmVhZGluZy4gIFRoZSByZXN0IG9mIHRoZSBvdXRwdXQgd291bGQgYmUgaWdub3JlZC4gIEFsbCBvdGhlciBlcnJvcnMKLSAgICAgICAgIyBzaG91bGQgc3RpbGwgYmUgcmVwb3J0ZWQsCi0gICAgICAgIGlmIGVyciAhPSBlcnJuby5FUElQRToKLSAgICAgICAgICAgIHJhaXNlCi0KLQotZGVmIG1haW4oKToKLSAgICBpZiBsZW4oc3lzLmFyZ3YpID09IDE6Ci0gICAgICAgIGlmcCA9IHN5cy5zdGRpbgotICAgICAgICBvZnAgPSBzeXMuc3Rkb3V0Ci0gICAgZWxpZiBsZW4oc3lzLmFyZ3YpID09IDI6Ci0gICAgICAgIGlmcCA9IG9wZW4oc3lzLmFyZ3ZbMV0pCi0gICAgICAgIG9mcCA9IHN5cy5zdGRvdXQKLSAgICBlbGlmIGxlbihzeXMuYXJndikgPT0gMzoKLSAgICAgICAgaWZwID0gb3BlbihzeXMuYXJndlsxXSkKLSAgICAgICAgaW1wb3J0IGlvCi0gICAgICAgIG9mcCA9IGlvLlN0cmluZ0lPKCkKLSAgICBlbHNlOgotICAgICAgICB1c2FnZSgpCi0gICAgICAgIHN5cy5leGl0KDIpCi0gICAgY29udmVydChpZnAsIG9mcCkKLSAgICBpZiBsZW4oc3lzLmFyZ3YpID09IDM6Ci0gICAgICAgIGZwID0gb3BlbihzeXMuYXJndlsyXSwgInciKQotICAgICAgICBmcC53cml0ZShvZnAuZ2V0dmFsdWUoKSkKLSAgICAgICAgZnAuY2xvc2UoKQotICAgICAgICBvZnAuY2xvc2UoKQotCi0KLWlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgbWFpbigpCmRpZmYgLS1naXQgYS9Eb2MvdG9vbHMvc2dtbGNvbnYvZXNpczJzZ21sLnB5IGIvRG9jL3Rvb2xzL3NnbWxjb252L2VzaXMyc2dtbC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTBlYzgzYS4uMDAwMDAwMAotLS0gYS9Eb2MvdG9vbHMvc2dtbGNvbnYvZXNpczJzZ21sLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLSMhIC91c3IvYmluL2VudiBweXRob24KLQotIiIiQ29udmVydCBFU0lTIGV2ZW50cyB0byBTR01MIG9yIFhNTCBtYXJrdXAuCi0KLVRoaXMgaXMgbGltaXRlZCwgYnV0IHNlZW1zIHN1ZmZpY2llbnQgZm9yIHRoZSBFU0lTIGdlbmVyYXRlZCBieSB0aGUKLWxhdGV4MmVzaXMucHkgc2NyaXB0IHdoZW4gcnVuIG92ZXIgdGhlIFB5dGhvbiBkb2N1bWVudGF0aW9uLgotIiIiCi0KLSMgVGhpcyBzaG91bGQgaGF2ZSBhbiBleHBsaWNpdCBvcHRpb24gdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgKklOUFVUKiB3YXMKLSMgZ2VuZXJhdGVkIGZyb20gYW4gU0dNTCBvciBhbiBYTUwgYXBwbGljYXRpb24uCi0KLWltcG9ydCBlcnJubwotaW1wb3J0IG9zCi1pbXBvcnQgcmUKLWltcG9ydCBzdHJpbmcKLQotZnJvbSB4bWwuc2F4LnNheHV0aWxzIGltcG9ydCBlc2NhcGUKLQotaW1wb3J0IGVzaXN0b29scwotCi0KLUFVVE9DTE9TRSA9ICgpCi0KLUVNUFRJRVNfRklMRU5BTUUgPSAiLi4vc2dtbC9lbXB0aWVzLmRhdCIKLUxJU1RfRU1QVElFUyA9IDAKLQotCi1fZWxlbV9tYXAgPSB7fQotX2F0dHJfbWFwID0ge30KLV90b2tlbl9tYXAgPSB7fQotCi1fbm9ybWFsaXplX2Nhc2UgPSBzdHIKLQotZGVmIG1hcF9naShzZ21sZ2ksIG1hcCk6Ci0gICAgdW5jYXNlZCA9IF9ub3JtYWxpemVfY2FzZShzZ21sZ2kpCi0gICAgdHJ5OgotICAgICAgICByZXR1cm4gbWFwW3VuY2FzZWRdCi0gICAgZXhjZXB0IEluZGV4RXJyb3I6Ci0gICAgICAgIG1hcFt1bmNhc2VkXSA9IHNnbWxnaQotICAgICAgICByZXR1cm4gc2dtbGdpCi0KLWRlZiBudWxsX21hcF9naShzZ21sZ2ksIG1hcCk6Ci0gICAgcmV0dXJuIHNnbWxnaQotCi0KLWRlZiBmb3JtYXRfYXR0cnMoYXR0cnMsIHhtbD0wKToKLSAgICBhdHRycyA9IHNvcnRlZChhdHRycy5pdGVtcygpKQotICAgIHBhcnRzID0gW10KLSAgICBhcHBlbmQgPSBwYXJ0cy5hcHBlbmQKLSAgICBmb3IgbmFtZSwgdmFsdWUgaW4gYXR0cnM6Ci0gICAgICAgIGlmIHhtbDoKLSAgICAgICAgICAgIGFwcGVuZCgnJXM9IiVzIicgJSAobmFtZSwgZXNjYXBlKHZhbHVlKSkpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAjIHRoaXMgaXMgYSBsaXR0bGUgYm9ndXMsIGJ1dCBzaG91bGQgZG8gZm9yIG5vdwotICAgICAgICAgICAgaWYgbmFtZSA9PSB2YWx1ZSBhbmQgaXNubXRva2VuKHZhbHVlKToKLSAgICAgICAgICAgICAgICBhcHBlbmQodmFsdWUpCi0gICAgICAgICAgICBlbGlmIGlzdG9rZW4odmFsdWUpOgotICAgICAgICAgICAgICAgIGlmIHZhbHVlID09ICJubyIgKyBuYW1lOgotICAgICAgICAgICAgICAgICAgICBhcHBlbmQodmFsdWUpCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kKCIlcz0lcyIgJSAobmFtZSwgdmFsdWUpKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBhcHBlbmQoJyVzPSIlcyInICUgKG5hbWUsIGVzY2FwZSh2YWx1ZSkpKQotICAgIGlmIHBhcnRzOgotICAgICAgICBwYXJ0cy5pbnNlcnQoMCwgJycpCi0gICAgcmV0dXJuICIgIi5qb2luKHBhcnRzKQotCi0KLV9ubXRva2VuX3J4ID0gcmUuY29tcGlsZSgiW2Etel1bLS5fYS16MC05XSokIiwgcmUuSUdOT1JFQ0FTRSkKLWRlZiBpc25tdG9rZW4ocyk6Ci0gICAgcmV0dXJuIF9ubXRva2VuX3J4Lm1hdGNoKHMpIGlzIG5vdCBOb25lCi0KLV90b2tlbl9yeCA9IHJlLmNvbXBpbGUoIlthLXowLTldWy0uX2EtejAtOV0qJCIsIHJlLklHTk9SRUNBU0UpCi1kZWYgaXN0b2tlbihzKToKLSAgICByZXR1cm4gX3Rva2VuX3J4Lm1hdGNoKHMpIGlzIG5vdCBOb25lCi0KLQotZGVmIGNvbnZlcnQoaWZwLCBvZnAsIHhtbD0wLCBhdXRvY2xvc2U9KCksIHZlcmJhdGltcz0oKSk6Ci0gICAgaWYgeG1sOgotICAgICAgICBhdXRvY2xvc2UgPSAoKQotICAgIGF0dHJzID0ge30KLSAgICBsYXN0b3BlbmVkID0gTm9uZQotICAgIGtub3duZW1wdGllcyA9IFtdCi0gICAga25vd25lbXB0eSA9IDAKLSAgICBsYXN0ZW1wdHkgPSAwCi0gICAgaW52ZXJiYXRpbSA9IDAKLSAgICB3aGlsZSAxOgotICAgICAgICBsaW5lID0gaWZwLnJlYWRsaW5lKCkKLSAgICAgICAgaWYgbm90IGxpbmU6Ci0gICAgICAgICAgICBicmVhawotCi0gICAgICAgIHR5cGUgPSBsaW5lWzBdCi0gICAgICAgIGRhdGEgPSBsaW5lWzE6XQotICAgICAgICBpZiBkYXRhIGFuZCBkYXRhWy0xXSA9PSAiXG4iOgotICAgICAgICAgICAgZGF0YSA9IGRhdGFbOi0xXQotICAgICAgICBpZiB0eXBlID09ICItIjoKLSAgICAgICAgICAgIGRhdGEgPSBlc2lzdG9vbHMuZGVjb2RlKGRhdGEpCi0gICAgICAgICAgICBkYXRhID0gZXNjYXBlKGRhdGEpCi0gICAgICAgICAgICBpZiBub3QgaW52ZXJiYXRpbToKLSAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5yZXBsYWNlKCItLS0iLCAiJm1kYXNoOyIpCi0gICAgICAgICAgICBvZnAud3JpdGUoZGF0YSkKLSAgICAgICAgICAgIGlmICJcbiIgaW4gZGF0YToKLSAgICAgICAgICAgICAgICBsYXN0b3BlbmVkID0gTm9uZQotICAgICAgICAgICAga25vd25lbXB0eSA9IDAKLSAgICAgICAgICAgIGxhc3RlbXB0eSA9IDAKLSAgICAgICAgZWxpZiB0eXBlID09ICIoIjoKLSAgICAgICAgICAgIGlmIGRhdGEgPT0gIkNPTU1FTlQiOgotICAgICAgICAgICAgICAgIG9mcC53cml0ZSgiPCEtLSIpCi0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIGRhdGEgPSBtYXBfZ2koZGF0YSwgX2VsZW1fbWFwKQotICAgICAgICAgICAgaWYga25vd25lbXB0eSBhbmQgeG1sOgotICAgICAgICAgICAgICAgIG9mcC53cml0ZSgiPCVzJXMvPiIgJSAoZGF0YSwgZm9ybWF0X2F0dHJzKGF0dHJzLCB4bWwpKSkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgb2ZwLndyaXRlKCI8JXMlcz4iICUgKGRhdGEsIGZvcm1hdF9hdHRycyhhdHRycywgeG1sKSkpCi0gICAgICAgICAgICBpZiBrbm93bmVtcHR5IGFuZCBkYXRhIG5vdCBpbiBrbm93bmVtcHRpZXM6Ci0gICAgICAgICAgICAgICAgIyBhY2N1bXVsYXRlIGtub3dsZWRnZSEKLSAgICAgICAgICAgICAgICBrbm93bmVtcHRpZXMuYXBwZW5kKGRhdGEpCi0gICAgICAgICAgICBhdHRycyA9IHt9Ci0gICAgICAgICAgICBsYXN0b3BlbmVkID0gZGF0YQotICAgICAgICAgICAgbGFzdGVtcHR5ID0ga25vd25lbXB0eQotICAgICAgICAgICAga25vd25lbXB0eSA9IDAKLSAgICAgICAgICAgIGludmVyYmF0aW0gPSBkYXRhIGluIHZlcmJhdGltcwotICAgICAgICBlbGlmIHR5cGUgPT0gIikiOgotICAgICAgICAgICAgaWYgZGF0YSA9PSAiQ09NTUVOVCI6Ci0gICAgICAgICAgICAgICAgb2ZwLndyaXRlKCItLT4iKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICBkYXRhID0gbWFwX2dpKGRhdGEsIF9lbGVtX21hcCkKLSAgICAgICAgICAgIGlmIHhtbDoKLSAgICAgICAgICAgICAgICBpZiBub3QgbGFzdGVtcHR5OgotICAgICAgICAgICAgICAgICAgICBvZnAud3JpdGUoIjwvJXM+IiAlIGRhdGEpCi0gICAgICAgICAgICBlbGlmIGRhdGEgbm90IGluIGtub3duZW1wdGllczoKLSAgICAgICAgICAgICAgICBpZiBkYXRhIGluIGF1dG9jbG9zZToKLSAgICAgICAgICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgICAgIGVsaWYgbGFzdG9wZW5lZCA9PSBkYXRhOgotICAgICAgICAgICAgICAgICAgICBvZnAud3JpdGUoIjwvPiIpCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgb2ZwLndyaXRlKCI8LyVzPiIgJSBkYXRhKQotICAgICAgICAgICAgbGFzdG9wZW5lZCA9IE5vbmUKLSAgICAgICAgICAgIGxhc3RlbXB0eSA9IDAKLSAgICAgICAgICAgIGludmVyYmF0aW0gPSAwCi0gICAgICAgIGVsaWYgdHlwZSA9PSAiQSI6Ci0gICAgICAgICAgICBuYW1lLCB0eXBlLCB2YWx1ZSA9IGRhdGEuc3BsaXQoIiAiLCAyKQotICAgICAgICAgICAgbmFtZSA9IG1hcF9naShuYW1lLCBfYXR0cl9tYXApCi0gICAgICAgICAgICBhdHRyc1tuYW1lXSA9IGVzaXN0b29scy5kZWNvZGUodmFsdWUpCi0gICAgICAgIGVsaWYgdHlwZSA9PSAiZSI6Ci0gICAgICAgICAgICBrbm93bmVtcHR5ID0gMQotICAgICAgICBlbGlmIHR5cGUgPT0gIiYiOgotICAgICAgICAgICAgb2ZwLndyaXRlKCImJXM7IiAlIGRhdGEpCi0gICAgICAgICAgICBrbm93bmVtcHR5ID0gMAotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJ1bnJlY29nbml6ZWQgRVNJUyBldmVudCB0eXBlOiAnJXMnIiAlIHR5cGUpCi0KLSAgICBpZiBMSVNUX0VNUFRJRVM6Ci0gICAgICAgIGR1bXBfZW1wdHlfZWxlbWVudF9uYW1lcyhrbm93bmVtcHRpZXMpCi0KLQotZGVmIGR1bXBfZW1wdHlfZWxlbWVudF9uYW1lcyhrbm93bmVtcHRpZXMpOgotICAgIGQgPSB7fQotICAgIGZvciBnaSBpbiBrbm93bmVtcHRpZXM6Ci0gICAgICAgIGRbZ2ldID0gZ2kKLSAgICBrbm93bmVtcHRpZXMuYXBwZW5kKCIiKQotICAgIGlmIG9zLnBhdGguaXNmaWxlKEVNUFRJRVNfRklMRU5BTUUpOgotICAgICAgICBmcCA9IG9wZW4oRU1QVElFU19GSUxFTkFNRSkKLSAgICAgICAgd2hpbGUgMToKLSAgICAgICAgICAgIGxpbmUgPSBmcC5yZWFkbGluZSgpCi0gICAgICAgICAgICBpZiBub3QgbGluZToKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgZ2kgPSBsaW5lLnN0cmlwKCkKLSAgICAgICAgICAgIGlmIGdpOgotICAgICAgICAgICAgICAgIGRbZ2ldID0gZ2kKLSAgICBmcCA9IG9wZW4oRU1QVElFU19GSUxFTkFNRSwgInciKQotICAgIGdpbGlzdCA9IHNvcnRlZChkLmtleXMoKSkKLSAgICBmcC53cml0ZSgiXG4iLmpvaW4oZ2lsaXN0KSkKLSAgICBmcC53cml0ZSgiXG4iKQotICAgIGZwLmNsb3NlKCkKLQotCi1kZWYgdXBkYXRlX2dpX21hcChtYXAsIG5hbWVzLCBmcm9tc2dtbD0xKToKLSAgICBmb3IgbmFtZSBpbiBuYW1lcy5zcGxpdCgiLCIpOgotICAgICAgICBpZiBmcm9tc2dtbDoKLSAgICAgICAgICAgIHVuY2FzZWQgPSBuYW1lLmxvd2VyKCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHVuY2FzZWQgPSBuYW1lCi0gICAgICAgIG1hcFt1bmNhc2VkXSA9IG5hbWUKLQotCi1kZWYgbWFpbigpOgotICAgIGltcG9ydCBnZXRvcHQKLSAgICBpbXBvcnQgc3lzCi0gICAgIwotICAgIGF1dG9jbG9zZSA9IEFVVE9DTE9TRQotICAgIHhtbCA9IDEKLSAgICB4bWxkZWNsID0gMAotICAgIGVsZW1fbmFtZXMgPSAnJwotICAgIGF0dHJfbmFtZXMgPSAnJwotICAgIHZhbHVlX25hbWVzID0gJycKLSAgICB2ZXJiYXRpbXMgPSAoJ3ZlcmJhdGltJywgJ2ludGVyYWN0aXZlLXNlc3Npb24nKQotICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgImFkZXN4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImF1dG9jbG9zZT0iLCAiZGVjbGFyZSIsICJzZ21sIiwgInhtbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbGVtZW50cy1tYXA9IiwgImF0dHJpYnV0ZXMtbWFwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlcy1tYXA9Il0pCi0gICAgZm9yIG9wdCwgYXJnIGluIG9wdHM6Ci0gICAgICAgIGlmIG9wdCBpbiAoIi1kIiwgIi0tZGVjbGFyZSIpOgotICAgICAgICAgICAgeG1sZGVjbCA9IDEKLSAgICAgICAgZWxpZiBvcHQgPT0gIi1lIjoKLSAgICAgICAgICAgIGdsb2JhbCBMSVNUX0VNUFRJRVMKLSAgICAgICAgICAgIExJU1RfRU1QVElFUyA9IDEKLSAgICAgICAgZWxpZiBvcHQgaW4gKCItcyIsICItLXNnbWwiKToKLSAgICAgICAgICAgIHhtbCA9IDAKLSAgICAgICAgZWxpZiBvcHQgaW4gKCIteCIsICItLXhtbCIpOgotICAgICAgICAgICAgeG1sID0gMQotICAgICAgICBlbGlmIG9wdCBpbiAoIi1hIiwgIi0tYXV0b2Nsb3NlIik6Ci0gICAgICAgICAgICBhdXRvY2xvc2UgPSBhcmcuc3BsaXQoIiwiKQotICAgICAgICBlbGlmIG9wdCA9PSAiLS1lbGVtZW50cy1tYXAiOgotICAgICAgICAgICAgZWxlbV9uYW1lcyA9ICgiJXMsJXMiICUgKGVsZW1fbmFtZXMsIGFyZykpWzE6XQotICAgICAgICBlbGlmIG9wdCA9PSAiLS1hdHRyaWJ1dGVzLW1hcCI6Ci0gICAgICAgICAgICBhdHRyX25hbWVzID0gKCIlcywlcyIgJSAoYXR0cl9uYW1lcywgYXJnKSlbMTpdCi0gICAgICAgIGVsaWYgb3B0ID09ICItLXZhbHVlcy1tYXAiOgotICAgICAgICAgICAgdmFsdWVfbmFtZXMgPSAoIiVzLCVzIiAlICh2YWx1ZV9uYW1lcywgYXJnKSlbMTpdCi0gICAgIwotICAgICMgb3BlbiBpbnB1dCBzdHJlYW1zOgotICAgICMKLSAgICBpZiBsZW4oYXJncykgPT0gMDoKLSAgICAgICAgaWZwID0gc3lzLnN0ZGluCi0gICAgICAgIG9mcCA9IHN5cy5zdGRvdXQKLSAgICBlbGlmIGxlbihhcmdzKSA9PSAxOgotICAgICAgICBpZnAgPSBvcGVuKGFyZ3NbMF0pCi0gICAgICAgIG9mcCA9IHN5cy5zdGRvdXQKLSAgICBlbGlmIGxlbihhcmdzKSA9PSAyOgotICAgICAgICBpZnAgPSBvcGVuKGFyZ3NbMF0pCi0gICAgICAgIG9mcCA9IG9wZW4oYXJnc1sxXSwgInciKQotICAgIGVsc2U6Ci0gICAgICAgIHVzYWdlKCkKLSAgICAgICAgc3lzLmV4aXQoMikKLSAgICAjCi0gICAgIyBzZXR1cCB0aGUgbmFtZSBtYXBzOgotICAgICMKLSAgICBpZiBlbGVtX25hbWVzIG9yIGF0dHJfbmFtZXMgb3IgdmFsdWVfbmFtZXM6Ci0gICAgICAgICMgYXNzdW1lIHRoZSBvcmlnaW4gd2FzIFNHTUw7IGlnbm9yZSBjYXNlIG9mIHRoZSBuYW1lcyBmcm9tIHRoZSBFU0lTCi0gICAgICAgICMgc3RyZWFtIGJ1dCBzZXQgdXAgY29udmVyc2lvbiB0YWJsZXMgdG8gZ2V0IHRoZSBjYXNlIHJpZ2h0IG9uIG91dHB1dAotICAgICAgICBnbG9iYWwgX25vcm1hbGl6ZV9jYXNlCi0gICAgICAgIF9ub3JtYWxpemVfY2FzZSA9IHN0cmluZy5sb3dlcgotICAgICAgICB1cGRhdGVfZ2lfbWFwKF9lbGVtX21hcCwgZWxlbV9uYW1lcy5zcGxpdCgiLCIpKQotICAgICAgICB1cGRhdGVfZ2lfbWFwKF9hdHRyX21hcCwgYXR0cl9uYW1lcy5zcGxpdCgiLCIpKQotICAgICAgICB1cGRhdGVfZ2lfbWFwKF92YWx1ZXNfbWFwLCB2YWx1ZV9uYW1lcy5zcGxpdCgiLCIpKQotICAgIGVsc2U6Ci0gICAgICAgIGdsb2JhbCBtYXBfZ2kKLSAgICAgICAgbWFwX2dpID0gbnVsbF9tYXBfZ2kKLSAgICAjCi0gICAgIyBydW4gdGhlIGNvbnZlcnNpb246Ci0gICAgIwotICAgIHRyeToKLSAgICAgICAgaWYgeG1sIGFuZCB4bWxkZWNsOgotICAgICAgICAgICAgb3BmLndyaXRlKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc284ODU5LTEiPz5cbicpCi0gICAgICAgIGNvbnZlcnQoaWZwLCBvZnAsIHhtbD14bWwsIGF1dG9jbG9zZT1hdXRvY2xvc2UsIHZlcmJhdGltcz12ZXJiYXRpbXMpCi0gICAgZXhjZXB0IElPRXJyb3IgYXMgZToKLSAgICAgICAgKGVyciwgbXNnKSA9IGUKLSAgICAgICAgaWYgZXJyICE9IGVycm5vLkVQSVBFOgotICAgICAgICAgICAgcmFpc2UKLQotCi1pZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvRG9jL3Rvb2xzL3NnbWxjb252L2VzaXN0b29scy5weSBiL0RvYy90b29scy9zZ21sY29udi9lc2lzdG9vbHMucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZjQ1OGUuLjAwMDAwMDAKLS0tIGEvRG9jL3Rvb2xzL3NnbWxjb252L2VzaXN0b29scy5weQorKysgL2Rldi9udWxsCkBAIC0xLDMxMiArMCwwIEBACi0iIiJNaXNjZWxsYW5lb3VzIHV0aWxpdHkgZnVuY3Rpb25zIHVzZWZ1bCBmb3IgZGVhbGluZyB3aXRoIEVTSVMgc3RyZWFtcy4iIiIKLQotaW1wb3J0IHJlCi0KLWltcG9ydCB4bWwuZG9tLnB1bGxkb20KLQotaW1wb3J0IHhtbC5zYXgKLWltcG9ydCB4bWwuc2F4LmhhbmRsZXIKLWltcG9ydCB4bWwuc2F4LnhtbHJlYWRlcgotCi0KLV9kYXRhX21hdGNoID0gcmUuY29tcGlsZShyIlteXFxdW15cXF0qIikubWF0Y2gKLQotZGVmIGRlY29kZShzKToKLSAgICByID0gJycKLSAgICB3aGlsZSBzOgotICAgICAgICBtID0gX2RhdGFfbWF0Y2gocykKLSAgICAgICAgaWYgbToKLSAgICAgICAgICAgIHIgPSByICsgbS5ncm91cCgpCi0gICAgICAgICAgICBzID0gc1ttLmVuZCgpOl0KLSAgICAgICAgZWxpZiBzWzFdID09ICJcXCI6Ci0gICAgICAgICAgICByID0gciArICJcXCIKLSAgICAgICAgICAgIHMgPSBzWzI6XQotICAgICAgICBlbGlmIHNbMV0gPT0gIm4iOgotICAgICAgICAgICAgciA9IHIgKyAiXG4iCi0gICAgICAgICAgICBzID0gc1syOl0KLSAgICAgICAgZWxpZiBzWzFdID09ICIlIjoKLSAgICAgICAgICAgIHMgPSBzWzI6XQotICAgICAgICAgICAgbiwgcyA9IHMuc3BsaXQoIjsiLCAxKQotICAgICAgICAgICAgciA9IHIgKyB1bmljaHIoaW50KG4pKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2FuJ3QgaGFuZGxlICVyIiAlIHMpCi0gICAgcmV0dXJuIHIKLQotCi1fY2hhcm1hcCA9IHt9Ci1mb3IgYyBpbiByYW5nZSgxMjgpOgotICAgIF9jaGFybWFwW2NocihjKV0gPSBjaHIoYykKLSAgICBfY2hhcm1hcFt1bmljaHIoYyArIDEyOCldID0gY2hyKGMgKyAxMjgpCi1fY2hhcm1hcFsiXG4iXSA9IHIiXG4iCi1fY2hhcm1hcFsiXFwiXSA9IHIiXFwiCi1kZWwgYwotCi1fbnVsbF9qb2luID0gJycuam9pbgotZGVmIGVuY29kZShzKToKLSAgICB0cnk6Ci0gICAgICAgIHJldHVybiBfbnVsbF9qb2luKG1hcChfY2hhcm1hcC5nZXQsIHMpKQotICAgIGV4Y2VwdCBUeXBlRXJyb3I6Ci0gICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiY291bGQgbm90IGVuY29kZSAlcjogJXIiICUgKHMsIG1hcChfY2hhcm1hcC5nZXQsIHMpKSkKLQotCi1jbGFzcyBFU0lTUmVhZGVyKHhtbC5zYXgueG1scmVhZGVyLlhNTFJlYWRlcik6Ci0gICAgIiIiU0FYIFJlYWRlciB3aGljaCByZWFkcyBmcm9tIGFuIEVTSVMgc3RyZWFtLgotCi0gICAgTm8gdmVyaWZpY2F0aW9uIG9mIHRoZSBkb2N1bWVudCBzdHJ1Y3R1cmUgaXMgcGVyZm9ybWVkIGJ5IHRoZQotICAgIHJlYWRlcjsgYSBnZW5lcmFsIHZlcmlmaWVyIGNvdWxkIGJlIHVzZWQgYXMgdGhlIHRhcmdldAotICAgIENvbnRlbnRIYW5kbGVyIGluc3RhbmNlLgotCi0gICAgIiIiCi0gICAgX2RlY2xfaGFuZGxlciA9IE5vbmUKLSAgICBfbGV4aWNhbF9oYW5kbGVyID0gTm9uZQotCi0gICAgX3B1YmxpY19pZCA9IE5vbmUKLSAgICBfc3lzdGVtX2lkID0gTm9uZQotCi0gICAgX2J1ZmZlciA9ICIiCi0gICAgX2lzX2VtcHR5ID0gMAotICAgIF9saW5lbm8gPSAwCi0gICAgX3N0YXJ0ZWQgPSAwCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgY29udGVudEhhbmRsZXI9Tm9uZSwgZXJyb3JIYW5kbGVyPU5vbmUpOgotICAgICAgICB4bWwuc2F4LnhtbHJlYWRlci5YTUxSZWFkZXIuX19pbml0X18oc2VsZikKLSAgICAgICAgc2VsZi5fYXR0cnMgPSB7fQotICAgICAgICBzZWxmLl9hdHRyaWJ1dGVzID0gQXR0cmlidXRlcyhzZWxmLl9hdHRycykKLSAgICAgICAgc2VsZi5fbG9jYXRvciA9IExvY2F0b3IoKQotICAgICAgICBzZWxmLl9lbXB0aWVzID0ge30KLSAgICAgICAgaWYgY29udGVudEhhbmRsZXI6Ci0gICAgICAgICAgICBzZWxmLnNldENvbnRlbnRIYW5kbGVyKGNvbnRlbnRIYW5kbGVyKQotICAgICAgICBpZiBlcnJvckhhbmRsZXI6Ci0gICAgICAgICAgICBzZWxmLnNldEVycm9ySGFuZGxlcihlcnJvckhhbmRsZXIpCi0KLSAgICBkZWYgZ2V0X2VtcHRpZXMoc2VsZik6Ci0gICAgICAgIHJldHVybiBsaXN0KHNlbGYuX2VtcHRpZXMua2V5cygpKQotCi0gICAgIwotICAgICMgIFhNTFJlYWRlciBpbnRlcmZhY2UKLSAgICAjCi0KLSAgICBkZWYgcGFyc2Uoc2VsZiwgc291cmNlKToKLSAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCi0gICAgICAgIHNlbGYuX2xvY2F0b3IuX3B1YmxpY19pZCA9IHNvdXJjZS5nZXRQdWJsaWNJZCgpCi0gICAgICAgIHNlbGYuX2xvY2F0b3IuX3N5c3RlbV9pZCA9IHNvdXJjZS5nZXRTeXN0ZW1JZCgpCi0gICAgICAgIGZwID0gc291cmNlLmdldEJ5dGVTdHJlYW0oKQotICAgICAgICBoYW5kbGVyID0gc2VsZi5nZXRDb250ZW50SGFuZGxlcigpCi0gICAgICAgIGlmIGhhbmRsZXI6Ci0gICAgICAgICAgICBoYW5kbGVyLnN0YXJ0RG9jdW1lbnQoKQotICAgICAgICBsaW5lbm8gPSAwCi0gICAgICAgIHdoaWxlIDE6Ci0gICAgICAgICAgICB0b2tlbiwgZGF0YSA9IHNlbGYuX2dldF90b2tlbihmcCkKLSAgICAgICAgICAgIGlmIHRva2VuIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGxpbmVubyA9IGxpbmVubyArIDEKLSAgICAgICAgICAgIHNlbGYuX2xvY2F0b3IuX2xpbmVubyA9IGxpbmVubwotICAgICAgICAgICAgc2VsZi5faGFuZGxlX3Rva2VuKHRva2VuLCBkYXRhKQotICAgICAgICBoYW5kbGVyID0gc2VsZi5nZXRDb250ZW50SGFuZGxlcigpCi0gICAgICAgIGlmIGhhbmRsZXI6Ci0gICAgICAgICAgICBoYW5kbGVyLnN0YXJ0RG9jdW1lbnQoKQotCi0gICAgZGVmIGZlZWQoc2VsZiwgZGF0YSk6Ci0gICAgICAgIGlmIG5vdCBzZWxmLl9zdGFydGVkOgotICAgICAgICAgICAgaGFuZGxlciA9IHNlbGYuZ2V0Q29udGVudEhhbmRsZXIoKQotICAgICAgICAgICAgaWYgaGFuZGxlcjoKLSAgICAgICAgICAgICAgICBoYW5kbGVyLnN0YXJ0RG9jdW1lbnQoKQotICAgICAgICAgICAgc2VsZi5fc3RhcnRlZCA9IDEKLSAgICAgICAgZGF0YSA9IHNlbGYuX2J1ZmZlciArIGRhdGEKLSAgICAgICAgc2VsZi5fYnVmZmVyID0gTm9uZQotICAgICAgICBsaW5lcyA9IGRhdGEuc3BsaXQoIlxuIikKLSAgICAgICAgaWYgbGluZXM6Ci0gICAgICAgICAgICBmb3IgbGluZSBpbiBsaW5lc1s6LTFdOgotICAgICAgICAgICAgICAgIHNlbGYuX2xpbmVubyA9IHNlbGYuX2xpbmVubyArIDEKLSAgICAgICAgICAgICAgICBzZWxmLl9sb2NhdG9yLl9saW5lbm8gPSBzZWxmLl9saW5lbm8KLSAgICAgICAgICAgICAgICBpZiBub3QgbGluZToKLSAgICAgICAgICAgICAgICAgICAgZSA9IHhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiRVNJUyBpbnB1dCBsaW5lIGNvbnRhaW5zIG5vIHRva2VuIHR5cGUgbWFyayIsCi0gICAgICAgICAgICAgICAgICAgICAgICBOb25lLCBzZWxmLl9sb2NhdG9yKQotICAgICAgICAgICAgICAgICAgICBzZWxmLmdldEVycm9ySGFuZGxlcigpLmVycm9yKGUpCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5faGFuZGxlX3Rva2VuKGxpbmVbMF0sIGxpbmVbMTpdKQotICAgICAgICAgICAgc2VsZi5fYnVmZmVyID0gbGluZXNbLTFdCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLl9idWZmZXIgPSAiIgotCi0gICAgZGVmIGNsb3NlKHNlbGYpOgotICAgICAgICBoYW5kbGVyID0gc2VsZi5nZXRDb250ZW50SGFuZGxlcigpCi0gICAgICAgIGlmIGhhbmRsZXI6Ci0gICAgICAgICAgICBoYW5kbGVyLmVuZERvY3VtZW50KCkKLSAgICAgICAgc2VsZi5fYnVmZmVyID0gIiIKLQotICAgIGRlZiBfZ2V0X3Rva2VuKHNlbGYsIGZwKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKLSAgICAgICAgZXhjZXB0IElPRXJyb3IgYXMgZToKLSAgICAgICAgICAgIGUgPSBTQVhFeGNlcHRpb24oIkkvTyBlcnJvciByZWFkaW5nIGlucHV0IHN0cmVhbSIsIGUpCi0gICAgICAgICAgICBzZWxmLmdldEVycm9ySGFuZGxlcigpLmZhdGFsRXJyb3IoZSkKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBpZiBub3QgbGluZToKLSAgICAgICAgICAgIHJldHVybiBOb25lLCBOb25lCi0gICAgICAgIGlmIGxpbmVbLTFdID09ICJcbiI6Ci0gICAgICAgICAgICBsaW5lID0gbGluZVs6LTFdCi0gICAgICAgIGlmIG5vdCBsaW5lOgotICAgICAgICAgICAgZSA9IHhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIkVTSVMgaW5wdXQgbGluZSBjb250YWlucyBubyB0b2tlbiB0eXBlIG1hcmsiLAotICAgICAgICAgICAgICAgIE5vbmUsIHNlbGYuX2xvY2F0b3IpCi0gICAgICAgICAgICBzZWxmLmdldEVycm9ySGFuZGxlcigpLmVycm9yKGUpCi0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgcmV0dXJuIGxpbmVbMF0sIGxpbmVbMTpdCi0KLSAgICBkZWYgX2hhbmRsZV90b2tlbihzZWxmLCB0b2tlbiwgZGF0YSk6Ci0gICAgICAgIGhhbmRsZXIgPSBzZWxmLmdldENvbnRlbnRIYW5kbGVyKCkKLSAgICAgICAgaWYgdG9rZW4gPT0gJy0nOgotICAgICAgICAgICAgaWYgZGF0YSBhbmQgaGFuZGxlcjoKLSAgICAgICAgICAgICAgICBoYW5kbGVyLmNoYXJhY3RlcnMoZGVjb2RlKGRhdGEpKQotICAgICAgICBlbGlmIHRva2VuID09ICcpJzoKLSAgICAgICAgICAgIGlmIGhhbmRsZXI6Ci0gICAgICAgICAgICAgICAgaGFuZGxlci5lbmRFbGVtZW50KGRlY29kZShkYXRhKSkKLSAgICAgICAgZWxpZiB0b2tlbiA9PSAnKCc6Ci0gICAgICAgICAgICBpZiBzZWxmLl9pc19lbXB0eToKLSAgICAgICAgICAgICAgICBzZWxmLl9lbXB0aWVzW2RhdGFdID0gMQotICAgICAgICAgICAgICAgIHNlbGYuX2lzX2VtcHR5ID0gMAotICAgICAgICAgICAgaWYgaGFuZGxlcjoKLSAgICAgICAgICAgICAgICBoYW5kbGVyLnN0YXJ0RWxlbWVudChkYXRhLCBzZWxmLl9hdHRyaWJ1dGVzKQotICAgICAgICAgICAgc2VsZi5fYXR0cnMuY2xlYXIoKQotICAgICAgICBlbGlmIHRva2VuID09ICdBJzoKLSAgICAgICAgICAgIG5hbWUsIHZhbHVlID0gZGF0YS5zcGxpdCgnICcsIDEpCi0gICAgICAgICAgICBpZiB2YWx1ZSAhPSAiSU1QTElFRCI6Ci0gICAgICAgICAgICAgICAgdHlwZSwgdmFsdWUgPSB2YWx1ZS5zcGxpdCgnICcsIDEpCi0gICAgICAgICAgICAgICAgc2VsZi5fYXR0cnNbbmFtZV0gPSAoZGVjb2RlKHZhbHVlKSwgdHlwZSkKLSAgICAgICAgZWxpZiB0b2tlbiA9PSAnJic6Ci0gICAgICAgICAgICAjIGVudGl0eSByZWZlcmVuY2UgaW4gU0FYPwotICAgICAgICAgICAgcGFzcwotICAgICAgICBlbGlmIHRva2VuID09ICc/JzoKLSAgICAgICAgICAgIGlmIGhhbmRsZXI6Ci0gICAgICAgICAgICAgICAgaWYgJyAnIGluIGRhdGE6Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldCwgZGF0YSA9IGRhdGEuc3BsaXQoTm9uZSwgMSkKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICB0YXJnZXQsIGRhdGEgPSBkYXRhLCAiIgotICAgICAgICAgICAgICAgIGhhbmRsZXIucHJvY2Vzc2luZ0luc3RydWN0aW9uKHRhcmdldCwgZGVjb2RlKGRhdGEpKQotICAgICAgICBlbGlmIHRva2VuID09ICdOJzoKLSAgICAgICAgICAgIGhhbmRsZXIgPSBzZWxmLmdldERUREhhbmRsZXIoKQotICAgICAgICAgICAgaWYgaGFuZGxlcjoKLSAgICAgICAgICAgICAgICBoYW5kbGVyLm5vdGF0aW9uRGVjbChkYXRhLCBzZWxmLl9wdWJsaWNfaWQsIHNlbGYuX3N5c3RlbV9pZCkKLSAgICAgICAgICAgIHNlbGYuX3B1YmxpY19pZCA9IE5vbmUKLSAgICAgICAgICAgIHNlbGYuX3N5c3RlbV9pZCA9IE5vbmUKLSAgICAgICAgZWxpZiB0b2tlbiA9PSAncCc6Ci0gICAgICAgICAgICBzZWxmLl9wdWJsaWNfaWQgPSBkZWNvZGUoZGF0YSkKLSAgICAgICAgZWxpZiB0b2tlbiA9PSAncyc6Ci0gICAgICAgICAgICBzZWxmLl9zeXN0ZW1faWQgPSBkZWNvZGUoZGF0YSkKLSAgICAgICAgZWxpZiB0b2tlbiA9PSAnZSc6Ci0gICAgICAgICAgICBzZWxmLl9pc19lbXB0eSA9IDEKLSAgICAgICAgZWxpZiB0b2tlbiA9PSAnQyc6Ci0gICAgICAgICAgICBwYXNzCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBlID0gU0FYUGFyc2VFeGNlcHRpb24oInVua25vd24gRVNJUyB0b2tlbiBpbiBldmVudCBzdHJlYW0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsIHNlbGYuX2xvY2F0b3IpCi0gICAgICAgICAgICBzZWxmLmdldEVycm9ySGFuZGxlcigpLmVycm9yKGUpCi0KLSAgICBkZWYgc2V0Q29udGVudEhhbmRsZXIoc2VsZiwgaGFuZGxlcik6Ci0gICAgICAgIG9sZCA9IHNlbGYuZ2V0Q29udGVudEhhbmRsZXIoKQotICAgICAgICBpZiBvbGQ6Ci0gICAgICAgICAgICBvbGQuc2V0RG9jdW1lbnRMb2NhdG9yKE5vbmUpCi0gICAgICAgIGlmIGhhbmRsZXI6Ci0gICAgICAgICAgICBoYW5kbGVyLnNldERvY3VtZW50TG9jYXRvcihzZWxmLl9sb2NhdG9yKQotICAgICAgICB4bWwuc2F4LnhtbHJlYWRlci5YTUxSZWFkZXIuc2V0Q29udGVudEhhbmRsZXIoc2VsZiwgaGFuZGxlcikKLQotICAgIGRlZiBnZXRQcm9wZXJ0eShzZWxmLCBwcm9wZXJ0eSk6Ci0gICAgICAgIGlmIHByb3BlcnR5ID09IHhtbC5zYXguaGFuZGxlci5wcm9wZXJ0eV9sZXhpY2FsX2hhbmRsZXI6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fbGV4aWNhbF9oYW5kbGVyCi0KLSAgICAgICAgZWxpZiBwcm9wZXJ0eSA9PSB4bWwuc2F4LmhhbmRsZXIucHJvcGVydHlfZGVjbGFyYXRpb25faGFuZGxlcjoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl9kZWNsX2hhbmRsZXIKLQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgeG1sLnNheC5TQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uKCJ1bmtub3duIHByb3BlcnR5ICVyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHByb3BlcnR5LCApKQotCi0gICAgZGVmIHNldFByb3BlcnR5KHNlbGYsIHByb3BlcnR5LCB2YWx1ZSk6Ci0gICAgICAgIGlmIHByb3BlcnR5ID09IHhtbC5zYXguaGFuZGxlci5wcm9wZXJ0eV9sZXhpY2FsX2hhbmRsZXI6Ci0gICAgICAgICAgICBpZiBzZWxmLl9sZXhpY2FsX2hhbmRsZXI6Ci0gICAgICAgICAgICAgICAgc2VsZi5fbGV4aWNhbF9oYW5kbGVyLnNldERvY3VtZW50TG9jYXRvcihOb25lKQotICAgICAgICAgICAgaWYgdmFsdWU6Ci0gICAgICAgICAgICAgICAgdmFsdWUuc2V0RG9jdW1lbnRMb2NhdG9yKHNlbGYuX2xvY2F0b3IpCi0gICAgICAgICAgICBzZWxmLl9sZXhpY2FsX2hhbmRsZXIgPSB2YWx1ZQotCi0gICAgICAgIGVsaWYgcHJvcGVydHkgPT0geG1sLnNheC5oYW5kbGVyLnByb3BlcnR5X2RlY2xhcmF0aW9uX2hhbmRsZXI6Ci0gICAgICAgICAgICBpZiBzZWxmLl9kZWNsX2hhbmRsZXI6Ci0gICAgICAgICAgICAgICAgc2VsZi5fZGVjbF9oYW5kbGVyLnNldERvY3VtZW50TG9jYXRvcihOb25lKQotICAgICAgICAgICAgaWYgdmFsdWU6Ci0gICAgICAgICAgICAgICAgdmFsdWUuc2V0RG9jdW1lbnRMb2NhdG9yKHNlbGYuX2xvY2F0b3IpCi0gICAgICAgICAgICBzZWxmLl9kZWNsX2hhbmRsZXIgPSB2YWx1ZQotCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByYWlzZSB4bWwuc2F4LlNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24oKQotCi0gICAgZGVmIGdldEZlYXR1cmUoc2VsZiwgZmVhdHVyZSk6Ci0gICAgICAgIGlmIGZlYXR1cmUgPT0geG1sLnNheC5oYW5kbGVyLmZlYXR1cmVfbmFtZXNwYWNlczoKLSAgICAgICAgICAgIHJldHVybiAxCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4geG1sLnNheC54bWxyZWFkZXIuWE1MUmVhZGVyLmdldEZlYXR1cmUoc2VsZiwgZmVhdHVyZSkKLQotICAgIGRlZiBzZXRGZWF0dXJlKHNlbGYsIGZlYXR1cmUsIGVuYWJsZWQpOgotICAgICAgICBpZiBmZWF0dXJlID09IHhtbC5zYXguaGFuZGxlci5mZWF0dXJlX25hbWVzcGFjZXM6Ci0gICAgICAgICAgICBwYXNzCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICB4bWwuc2F4LnhtbHJlYWRlci5YTUxSZWFkZXIuc2V0RmVhdHVyZShzZWxmLCBmZWF0dXJlLCBlbmFibGVkKQotCi0KLWNsYXNzIEF0dHJpYnV0ZXMoeG1sLnNheC54bWxyZWFkZXIuQXR0cmlidXRlc0ltcGwpOgotICAgICMgc2VsZi5fYXR0cnMgaGFzIHRoZSBmb3JtIHtuYW1lOiAodmFsdWUsIHR5cGUpfQotCi0gICAgZGVmIGdldFR5cGUoc2VsZiwgbmFtZSk6Ci0gICAgICAgIHJldHVybiBzZWxmLl9hdHRyc1tuYW1lXVsxXQotCi0gICAgZGVmIGdldFZhbHVlKHNlbGYsIG5hbWUpOgotICAgICAgICByZXR1cm4gc2VsZi5fYXR0cnNbbmFtZV1bMF0KLQotICAgIGRlZiBnZXRWYWx1ZUJ5UU5hbWUoc2VsZiwgbmFtZSk6Ci0gICAgICAgIHJldHVybiBzZWxmLl9hdHRyc1tuYW1lXVswXQotCi0gICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIG5hbWUpOgotICAgICAgICByZXR1cm4gc2VsZi5fYXR0cnNbbmFtZV1bMF0KLQotICAgIGRlZiBnZXQoc2VsZiwgbmFtZSwgZGVmYXVsdD1Ob25lKToKLSAgICAgICAgaWYgbmFtZSBpbiBzZWxmLl9hdHRyczoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl9hdHRyc1tuYW1lXVswXQotICAgICAgICByZXR1cm4gZGVmYXVsdAotCi0gICAgZGVmIGl0ZW1zKHNlbGYpOgotICAgICAgICBMID0gW10KLSAgICAgICAgZm9yIG5hbWUsICh2YWx1ZSwgdHlwZSkgaW4gc2VsZi5fYXR0cnMuaXRlbXMoKToKLSAgICAgICAgICAgIEwuYXBwZW5kKChuYW1lLCB2YWx1ZSkpCi0gICAgICAgIHJldHVybiBMCi0KLSAgICBkZWYgdmFsdWVzKHNlbGYpOgotICAgICAgICBMID0gW10KLSAgICAgICAgZm9yIHZhbHVlLCB0eXBlIGluIGxpc3Qoc2VsZi5fYXR0cnMudmFsdWVzKCkpOgotICAgICAgICAgICAgTC5hcHBlbmQodmFsdWUpCi0gICAgICAgIHJldHVybiBMCi0KLQotY2xhc3MgTG9jYXRvcih4bWwuc2F4LnhtbHJlYWRlci5Mb2NhdG9yKToKLSAgICBfbGluZW5vID0gLTEKLSAgICBfcHVibGljX2lkID0gTm9uZQotICAgIF9zeXN0ZW1faWQgPSBOb25lCi0KLSAgICBkZWYgZ2V0TGluZU51bWJlcihzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuX2xpbmVubwotCi0gICAgZGVmIGdldFB1YmxpY0lkKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5fcHVibGljX2lkCi0KLSAgICBkZWYgZ2V0U3lzdGVtSWQoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLl9zeXN0ZW1faWQKLQotCi1kZWYgcGFyc2Uoc3RyZWFtX29yX3N0cmluZywgcGFyc2VyPU5vbmUpOgotICAgIGlmIHR5cGUoc3RyZWFtX29yX3N0cmluZykgaW4gW3R5cGUoIiIpLCB0eXBlKHUiIildOgotICAgICAgICBzdHJlYW0gPSBvcGVuKHN0cmVhbV9vcl9zdHJpbmcpCi0gICAgZWxzZToKLSAgICAgICAgc3RyZWFtID0gc3RyZWFtX29yX3N0cmluZwotICAgIGlmIG5vdCBwYXJzZXI6Ci0gICAgICAgIHBhcnNlciA9IEVTSVNSZWFkZXIoKQotICAgIHJldHVybiB4bWwuZG9tLnB1bGxkb20uRE9NRXZlbnRTdHJlYW0oc3RyZWFtLCBwYXJzZXIsICgyICoqIDE0KSAtIDIwKQpkaWZmIC0tZ2l0IGEvRG9jL3Rvb2xzL3NnbWxjb252L2xhdGV4MmVzaXMucHkgYi9Eb2MvdG9vbHMvc2dtbGNvbnYvbGF0ZXgyZXNpcy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2VlODZlMy4uMDAwMDAwMAotLS0gYS9Eb2MvdG9vbHMvc2dtbGNvbnYvbGF0ZXgyZXNpcy5weQorKysgL2Rldi9udWxsCkBAIC0xLDU2NiArMCwwIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uCi0KLSIiIkdlbmVyYXRlIEVTSVMgZXZlbnRzIGJhc2VkIG9uIGEgTGFUZVggc291cmNlIGRvY3VtZW50IGFuZAotY29uZmlndXJhdGlvbiBkYXRhLgotCi1UaGUgY29udmVyc2lvbiBpcyBub3Qgc3Ryb25nIGVub3VnaCB0byB3b3JrIHdpdGggYXJiaXRyYXJ5IExhVGVYCi1kb2N1bWVudHM7IGl0IGhhcyBvbmx5IGJlZW4gZGVzaWduZWQgdG8gd29yayB3aXRoIHRoZSBoaWdobHkgc3R5bGl6ZWQKLW1hcmt1cCB1c2VkIGluIHRoZSBzdGFuZGFyZCBQeXRob24gZG9jdW1lbnRhdGlvbi4gIEEgbG90IG9mCi1pbmZvcm1hdGlvbiBhYm91dCBzcGVjaWZpYyBtYXJrdXAgaXMgZW5jb2RlZCBpbiB0aGUgY29udHJvbCB0YWJsZQotcGFzc2VkIHRvIHRoZSBjb252ZXJ0KCkgZnVuY3Rpb247IGNoYW5naW5nIHRoaXMgdGFibGUgY2FuIGFsbG93IHRoaXMKLXRvb2wgdG8gc3VwcG9ydCBhZGRpdGlvbmFsIExhVGVYIG1hcmt1cHMuCi0KLVRoZSBmb3JtYXQgb2YgdGhlIHRhYmxlIGlzIGxhcmdlbHkgdW5kb2N1bWVudGVkOyBzZWUgdGhlIGNvbW1lbnRlZAotaGVhZGVycyB3aGVyZSB0aGUgdGFibGUgaXMgc3BlY2lmaWVkIGluIG1haW4oKS4gIFRoZXJlIGlzIG5vIHByb3Zpc2lvbgotdG8gbG9hZCBhbiBhbHRlcm5hdGUgdGFibGUgZnJvbSBhbiBleHRlcm5hbCBmaWxlLgotIiIiCi0KLWltcG9ydCBlcnJubwotaW1wb3J0IGdldG9wdAotaW1wb3J0IG9zCi1pbXBvcnQgcmUKLWltcG9ydCBzeXMKLWltcG9ydCB4bWwuc2F4Ci1pbXBvcnQgeG1sLnNheC5zYXh1dGlscwotCi1mcm9tIGVzaXN0b29scyBpbXBvcnQgZW5jb2RlCi0KLQotREVCVUcgPSAwCi0KLQotY2xhc3MgTGFUZVhGb3JtYXRFcnJvcihFeGNlcHRpb24pOgotICAgIHBhc3MKLQotCi1jbGFzcyBMYVRlWFN0YWNrRXJyb3IoTGFUZVhGb3JtYXRFcnJvcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGZvdW5kLCBzdGFjayk6Ci0gICAgICAgIG1zZyA9ICJlbnZpcm9ubWVudCBjbG9zZSBmb3IgJXMgZG9lc24ndCBtYXRjaDtcbiAgc3RhY2sgPSAlcyIgXAotICAgICAgICAgICAgICAlIChmb3VuZCwgc3RhY2spCi0gICAgICAgIHNlbGYuZm91bmQgPSBmb3VuZAotICAgICAgICBzZWxmLnN0YWNrID0gc3RhY2tbOl0KLSAgICAgICAgTGFUZVhGb3JtYXRFcnJvci5fX2luaXRfXyhzZWxmLCBtc2cpCi0KLQwKLV9iZWdpbl9lbnZfcnggPSByZS5jb21waWxlKHIiW1xcXWJlZ2lueyhbXn1dKil9IikKLV9lbmRfZW52X3J4ID0gcmUuY29tcGlsZShyIltcXF1lbmR7KFtefV0qKX0iKQotX2JlZ2luX21hY3JvX3J4ID0gcmUuY29tcGlsZShyIltcXF0oW2EtekEtWl0rWypdPykgPyh7fFxzKlxuPykiKQotX2NvbW1lbnRfcnggPSByZS5jb21waWxlKCIlKyA/KC4qKVxuWyBcdF0qIikKLV90ZXh0X3J4ID0gcmUuY29tcGlsZShyIlteXX4lXFx7fV0rIikKLV9vcHRpb25hbF9yeCA9IHJlLmNvbXBpbGUociJccypbW10oW15dXSopW11dIiwgcmUuTVVMVElMSU5FKQotIyBfcGFyYW1ldGVyX3J4IGlzIHRoaXMgY29tcGxpY2F0ZWQgdG8gYWxsb3cgey4uLn0gaW5zaWRlIGEgcGFyYW1ldGVyOwotIyB0aGlzIGlzIHVzZWZ1bCB0byBtYXRjaCB0YWJ1bGFyIGxheW91dCBzcGVjaWZpY2F0aW9ucyBsaWtlIHtjfHB7MjRwdH19Ci1fcGFyYW1ldGVyX3J4ID0gcmUuY29tcGlsZSgiWyBcbl0qeygoW157fX1dfHtbXn1dKn0pKil9IikKLV90b2tlbl9yeCA9IHJlLmNvbXBpbGUociJbYS16QS1aXVthLXpBLVowLTkuLV0qJCIpCi1fc3RhcnRfZ3JvdXBfcnggPSByZS5jb21waWxlKCJbIFxuXSp7IikKLV9zdGFydF9vcHRpb25hbF9yeCA9IHJlLmNvbXBpbGUoIlsgXG5dKltbXSIpCi0KLQotRVNDQVBFRF9DSEFSUyA9ICIkJSNeIHt9Jn4iCi0KLQotZGVmIGRiZ21zZyhtc2cpOgotICAgIGlmIERFQlVHOgotICAgICAgICBzeXMuc3RkZXJyLndyaXRlKG1zZyArICJcbiIpCi0KLWRlZiBwdXNoaW5nKG5hbWUsIHBvaW50LCBkZXB0aCk6Ci0gICAgZGJnbXNnKCJwdXNoaW5nIDwlcz4gYXQgJXMiICUgKG5hbWUsIHBvaW50KSkKLQotZGVmIHBvcHBpbmcobmFtZSwgcG9pbnQsIGRlcHRoKToKLSAgICBkYmdtc2coInBvcHBpbmcgPC8lcz4gYXQgJXMiICUgKG5hbWUsIHBvaW50KSkKLQotCi1jbGFzcyBfU3RhY2sobGlzdCk6Ci0gICAgZGVmIGFwcGVuZChzZWxmLCBlbnRyeSk6Ci0gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGVudHJ5LCBzdHIpOgotICAgICAgICAgICAgcmFpc2UgTGFUZVhGb3JtYXRFcnJvcigiY2Fubm90IHB1c2ggbm9uLXN0cmluZyBvbiBzdGFjazogJXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKGVudHJ5LCApKQotICAgICAgICAjZGJnbXNnKCIlczwlcz4iICUgKCIgIipsZW4oc2VsZi5kYXRhKSwgZW50cnkpKQotICAgICAgICBsaXN0LmFwcGVuZChzZWxmLCBlbnRyeSkKLQotICAgIGRlZiBwb3Aoc2VsZiwgaW5kZXg9LTEpOgotICAgICAgICBlbnRyeSA9IHNlbGZbaW5kZXhdCi0gICAgICAgIGRlbCBzZWxmW2luZGV4XQotICAgICAgICAjZGJnbXNnKCIlczwvJXM+IiAlICgiICIgKiBsZW4oc2VsZiksIGVudHJ5KSkKLQotICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBpbmRleCk6Ci0gICAgICAgIGVudHJ5ID0gc2VsZltpbmRleF0KLSAgICAgICAgbGlzdC5fX2RlbGl0ZW1fXyhzZWxmLCBpbmRleCkKLSAgICAgICAgI2RiZ21zZygiJXM8LyVzPiIgJSAoIiAiICogbGVuKHNlbGYpLCBlbnRyeSkpCi0KLQotZGVmIG5ld19zdGFjaygpOgotICAgIGlmIERFQlVHOgotICAgICAgICByZXR1cm4gX1N0YWNrKCkKLSAgICBlbHNlOgotICAgICAgICByZXR1cm4gW10KLQotDAotY2xhc3MgQ29udmVyc2lvbjoKLSAgICBkZWYgX19pbml0X18oc2VsZiwgaWZwLCBvZnAsIHRhYmxlKToKLSAgICAgICAgc2VsZi53cml0ZSA9IG9mcC53cml0ZQotICAgICAgICBzZWxmLm9mcCA9IG9mcAotICAgICAgICBzZWxmLnRhYmxlID0gdGFibGUKLSAgICAgICAgTCA9IFtzLnJzdHJpcCgpIGZvciBzIGluIGlmcC5yZWFkbGluZXMoKV0KLSAgICAgICAgTC5hcHBlbmQoIiIpCi0gICAgICAgIHNlbGYubGluZSA9ICJcbiIuam9pbihMKQotICAgICAgICBzZWxmLnByZWFtYmxlID0gMQotCi0gICAgZGVmIGNvbnZlcnQoc2VsZik6Ci0gICAgICAgIHNlbGYuc3ViY29udmVydCgpCi0KLSAgICBkZWYgc3ViY29udmVydChzZWxmLCBlbmRjaGFyPU5vbmUsIGRlcHRoPTApOgotICAgICAgICAjCi0gICAgICAgICMgUGFyc2VzIGNvbnRlbnQsIGluY2x1ZGluZyBzdWItc3RydWN0dXJlcywgdW50aWwgdGhlIGNoYXJhY3RlcgotICAgICAgICAjICdlbmRjaGFyJyBpcyBmb3VuZCAod2l0aCBubyBvcGVuIHN0cnVjdHVyZXMpLCBvciB1bnRpbCB0aGUgZW5kCi0gICAgICAgICMgb2YgdGhlIGlucHV0IGRhdGEgaXMgZW5kY2hhciBpcyBOb25lLgotICAgICAgICAjCi0gICAgICAgIHN0YWNrID0gbmV3X3N0YWNrKCkKLSAgICAgICAgbGluZSA9IHNlbGYubGluZQotICAgICAgICB3aGlsZSBsaW5lOgotICAgICAgICAgICAgaWYgbGluZVswXSA9PSBlbmRjaGFyIGFuZCBub3Qgc3RhY2s6Ci0gICAgICAgICAgICAgICAgc2VsZi5saW5lID0gbGluZQotICAgICAgICAgICAgICAgIHJldHVybiBsaW5lCi0gICAgICAgICAgICBtID0gX2NvbW1lbnRfcngubWF0Y2gobGluZSkKLSAgICAgICAgICAgIGlmIG06Ci0gICAgICAgICAgICAgICAgdGV4dCA9IG0uZ3JvdXAoMSkKLSAgICAgICAgICAgICAgICBpZiB0ZXh0OgotICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCIoQ09NTUVOVFxuLSAlcyBcbilDT01NRU5UXG4tXFxuXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSBlbmNvZGUodGV4dCkpCi0gICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbbS5lbmQoKTpdCi0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIG0gPSBfYmVnaW5fZW52X3J4Lm1hdGNoKGxpbmUpCi0gICAgICAgICAgICBpZiBtOgotICAgICAgICAgICAgICAgIG5hbWUgPSBtLmdyb3VwKDEpCi0gICAgICAgICAgICAgICAgZW50cnkgPSBzZWxmLmdldF9lbnZfZW50cnkobmFtZSkKLSAgICAgICAgICAgICAgICAjIHJlLXdyaXRlIHRvIHVzZSB0aGUgbWFjcm8gaGFuZGxlcgotICAgICAgICAgICAgICAgIGxpbmUgPSByIlwlcyAlcyIgJSAobmFtZSwgbGluZVttLmVuZCgpOl0pCi0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIG0gPSBfZW5kX2Vudl9yeC5tYXRjaChsaW5lKQotICAgICAgICAgICAgaWYgbToKLSAgICAgICAgICAgICAgICAjIGVuZCBvZiBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIGVudm5hbWUgPSBtLmdyb3VwKDEpCi0gICAgICAgICAgICAgICAgZW50cnkgPSBzZWxmLmdldF9lbnRyeShlbnZuYW1lKQotICAgICAgICAgICAgICAgIHdoaWxlIHN0YWNrIGFuZCBlbnZuYW1lICE9IHN0YWNrWy0xXSBcCi0gICAgICAgICAgICAgICAgICAgICAgYW5kIHN0YWNrWy0xXSBpbiBlbnRyeS5lbmRjbG9zZXM6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoIiklc1xuIiAlIHN0YWNrLnBvcCgpKQotICAgICAgICAgICAgICAgIGlmIHN0YWNrIGFuZCBlbnZuYW1lID09IHN0YWNrWy0xXToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgiKSVzXG4iICUgZW50cnkub3V0cHV0bmFtZSkKLSAgICAgICAgICAgICAgICAgICAgZGVsIHN0YWNrWy0xXQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIHJhaXNlIExhVGVYU3RhY2tFcnJvcihlbnZuYW1lLCBzdGFjaykKLSAgICAgICAgICAgICAgICBsaW5lID0gbGluZVttLmVuZCgpOl0KLSAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgbSA9IF9iZWdpbl9tYWNyb19yeC5tYXRjaChsaW5lKQotICAgICAgICAgICAgaWYgbToKLSAgICAgICAgICAgICAgICAjIHN0YXJ0IG9mIG1hY3JvCi0gICAgICAgICAgICAgICAgbWFjcm9uYW1lID0gbS5ncm91cCgxKQotICAgICAgICAgICAgICAgIGlmIG1hY3JvbmFtZSA9PSAiYyI6Ci0gICAgICAgICAgICAgICAgICAgICMgVWdoISAgVGhpcyBpcyBhIGNvbWJpbmluZyBjaGFyYWN0ZXIuLi4KLSAgICAgICAgICAgICAgICAgICAgZW5kcG9zID0gbS5lbmQoKQotICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbWJpbmluZ19jaGFyKCJjIiwgbGluZVtlbmRwb3NdKQotICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZVtlbmRwb3MgKyAxOl0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgICAgICBlbnRyeSA9IHNlbGYuZ2V0X2VudHJ5KG1hY3JvbmFtZSkKLSAgICAgICAgICAgICAgICBpZiBlbnRyeS52ZXJiYXRpbToKLSAgICAgICAgICAgICAgICAgICAgIyBtYWdpYyBjYXNlIQotICAgICAgICAgICAgICAgICAgICBwb3MgPSBsaW5lLmZpbmQoIlxcZW5keyVzfSIgJSBtYWNyb25hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRleHQgPSBsaW5lW20uZW5kKDEpOnBvc10KLSAgICAgICAgICAgICAgICAgICAgc3RhY2suYXBwZW5kKGVudHJ5Lm5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoIiglc1xuIiAlIGVudHJ5Lm91dHB1dG5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoIi0lc1xuIiAlIGVuY29kZSh0ZXh0KSkKLSAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgiKSVzXG4iICUgZW50cnkub3V0cHV0bmFtZSkKLSAgICAgICAgICAgICAgICAgICAgc3RhY2sucG9wKCkKLSAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbcG9zICsgbGVuKCJcXGVuZHslc30iICUgbWFjcm9uYW1lKTpdCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgd2hpbGUgc3RhY2sgYW5kIHN0YWNrWy0xXSBpbiBlbnRyeS5jbG9zZXM6Ci0gICAgICAgICAgICAgICAgICAgIHRvcCA9IHN0YWNrLnBvcCgpCi0gICAgICAgICAgICAgICAgICAgIHRvcGVudHJ5ID0gc2VsZi5nZXRfZW50cnkodG9wKQotICAgICAgICAgICAgICAgICAgICBpZiB0b3BlbnRyeS5vdXRwdXRuYW1lOgotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgiKSVzXG4tXFxuXG4iICUgdG9wZW50cnkub3V0cHV0bmFtZSkKLSAgICAgICAgICAgICAgICAjCi0gICAgICAgICAgICAgICAgaWYgZW50cnkub3V0cHV0bmFtZSBhbmQgZW50cnkuZW1wdHk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoImVcbiIpCi0gICAgICAgICAgICAgICAgIwotICAgICAgICAgICAgICAgIHBhcmFtcywgb3B0aW9uYWwsIGVtcHR5ID0gc2VsZi5zdGFydF9tYWNybyhtYWNyb25hbWUpCi0gICAgICAgICAgICAgICAgIyByaXAgb2ZmIHRoZSBtYWNyb25hbWUKLSAgICAgICAgICAgICAgICBpZiBwYXJhbXM6Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lW20uZW5kKDEpOl0KLSAgICAgICAgICAgICAgICBlbGlmIGVtcHR5OgotICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZVttLmVuZCgxKTpdCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbbS5lbmQoKTpdCi0gICAgICAgICAgICAgICAgb3BlbmVkID0gMAotICAgICAgICAgICAgICAgIGltcGxpZWRfY29udGVudCA9IDAKLQotICAgICAgICAgICAgICAgICMgaGFuZGxlIGF0dHJpYnV0ZSBtYXBwaW5ncyBoZXJlOgotICAgICAgICAgICAgICAgIGZvciBwZW50cnkgaW4gcGFyYW1zOgotICAgICAgICAgICAgICAgICAgICBpZiBwZW50cnkudHlwZSA9PSAiYXR0cmlidXRlIjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBlbnRyeS5vcHRpb25hbDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtID0gX29wdGlvbmFsX3J4Lm1hdGNoKGxpbmUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbSBhbmQgZW50cnkub3V0cHV0bmFtZToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbbS5lbmQoKTpdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZHVtcF9hdHRyKHBlbnRyeSwgbS5ncm91cCgxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgcGVudHJ5LnRleHQgYW5kIGVudHJ5Lm91dHB1dG5hbWU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB2YWx1ZSBzdXBwbGllZCBieSBjb252ZXJzaW9uIHNwZWM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kdW1wX2F0dHIocGVudHJ5LCBwZW50cnkudGV4dCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbSA9IF9wYXJhbWV0ZXJfcngubWF0Y2gobGluZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgbToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgTGFUZVhGb3JtYXRFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3VsZCBub3QgZXh0cmFjdCBwYXJhbWV0ZXIgJXMgZm9yICVzOiAlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHBlbnRyeS5uYW1lLCBtYWNyb25hbWUsIGxpbmVbOjEwMF0pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGVudHJ5Lm91dHB1dG5hbWU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZHVtcF9hdHRyKHBlbnRyeSwgbS5ncm91cCgxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZVttLmVuZCgpOl0KLSAgICAgICAgICAgICAgICAgICAgZWxpZiBwZW50cnkudHlwZSA9PSAiY2hpbGQiOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgcGVudHJ5Lm9wdGlvbmFsOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBfb3B0aW9uYWxfcngubWF0Y2gobGluZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBtOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZVttLmVuZCgpOl0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZW50cnkub3V0cHV0bmFtZSBhbmQgbm90IG9wZW5lZDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5lZCA9IDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoIiglc1xuIiAlIGVudHJ5Lm91dHB1dG5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5hcHBlbmQobWFjcm9uYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5hcHBlbmQocGVudHJ5Lm5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoIiglc1xuIiAlIHBlbnRyeS5uYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCItJXNcbiIgJSBlbmNvZGUobS5ncm91cCgxKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoIiklc1xuIiAlIHBlbnRyeS5uYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wb3AoKQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBlbnRyeS5vdXRwdXRuYW1lIGFuZCBub3Qgb3BlbmVkOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuZWQgPSAxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoIiglc1xuIiAlIGVudHJ5Lm91dHB1dG5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLmFwcGVuZChlbnRyeS5uYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoIiglc1xuIiAlIHBlbnRyeS5uYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLmFwcGVuZChwZW50cnkubmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmUgPSBza2lwX3doaXRlKGxpbmUpWzE6XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBzZWxmLnN1YmNvbnZlcnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9IiwgbGVuKHN0YWNrKSArIGRlcHRoICsgMSlbMTpdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgiKSVzXG4iICUgc3RhY2sucG9wKCkpCi0gICAgICAgICAgICAgICAgICAgIGVsaWYgcGVudHJ5LnR5cGUgPT0gImNvbnRlbnQiOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgcGVudHJ5LmltcGxpZWQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGllZF9jb250ZW50ID0gMQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBlbnRyeS5vdXRwdXRuYW1lIGFuZCBub3Qgb3BlbmVkOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuZWQgPSAxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoIiglc1xuIiAlIGVudHJ5Lm91dHB1dG5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLmFwcGVuZChlbnRyeS5uYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBza2lwX3doaXRlKGxpbmUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGluZVswXSAhPSAieyI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIExhVGVYRm9ybWF0RXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWlzc2luZyBjb250ZW50IGZvciAiICsgbWFjcm9uYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGluZSA9IGxpbmVbMTpdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IHNlbGYuc3ViY29udmVydCgifSIsIGxlbihzdGFjaykgKyBkZXB0aCArIDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGluZSBhbmQgbGluZVswXSA9PSAifSI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lWzE6XQotICAgICAgICAgICAgICAgICAgICBlbGlmIHBlbnRyeS50eXBlID09ICJ0ZXh0IiBhbmQgcGVudHJ5LnRleHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiBlbnRyeS5vdXRwdXRuYW1lIGFuZCBub3Qgb3BlbmVkOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5lZCA9IDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5hcHBlbmQoZW50cnkubmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCIoJXNcbiIgJSBlbnRyeS5vdXRwdXRuYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgI2RiZ21zZygiLS0tIHRleHQ6ICVyIiAlIHBlbnRyeS50ZXh0KQotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgiLSVzXG4iICUgZW5jb2RlKHBlbnRyeS50ZXh0KSkKLSAgICAgICAgICAgICAgICAgICAgZWxpZiBwZW50cnkudHlwZSA9PSAiZW50aXR5cmVmIjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoIiYlc1xuIiAlIHBlbnRyeS5uYW1lKQotICAgICAgICAgICAgICAgIGlmIGVudHJ5Lm91dHB1dG5hbWU6Ci0gICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcGVuZWQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCIoJXNcbiIgJSBlbnRyeS5vdXRwdXRuYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2suYXBwZW5kKGVudHJ5Lm5hbWUpCi0gICAgICAgICAgICAgICAgICAgIGlmIG5vdCBpbXBsaWVkX2NvbnRlbnQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCIpJXNcbiIgJSBlbnRyeS5vdXRwdXRuYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucG9wKCkKLSAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgaWYgbGluZVswXSA9PSBlbmRjaGFyIGFuZCBub3Qgc3RhY2s6Ci0gICAgICAgICAgICAgICAgc2VsZi5saW5lID0gbGluZVsxOl0KLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5saW5lCi0gICAgICAgICAgICBpZiBsaW5lWzBdID09ICJ9IjoKLSAgICAgICAgICAgICAgICAjIGVuZCBvZiBtYWNybyBvciBncm91cAotICAgICAgICAgICAgICAgIG1hY3JvbmFtZSA9IHN0YWNrWy0xXQotICAgICAgICAgICAgICAgIGlmIG1hY3JvbmFtZToKLSAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbiA9IHNlbGYudGFibGVbbWFjcm9uYW1lXQotICAgICAgICAgICAgICAgICAgICBpZiBjb252ZXJzaW9uLm91dHB1dG5hbWU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAjIG90aGVyd2lzZSwgaXQgd2FzIGp1c3QgYSBiYXJlIGdyb3VwCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCIpJXNcbiIgJSBjb252ZXJzaW9uLm91dHB1dG5hbWUpCi0gICAgICAgICAgICAgICAgZGVsIHN0YWNrWy0xXQotICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lWzE6XQotICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICBpZiBsaW5lWzBdID09ICJ+IjoKLSAgICAgICAgICAgICAgICAjIGRvbid0IHdvcnJ5IGFib3V0IHRoZSAidGllIiBhc3BlY3Qgb2YgdGhpcyBjb21tYW5kCi0gICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbMTpdCi0gICAgICAgICAgICAgICAgc2VsZi53cml0ZSgiLSBcbiIpCi0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIGlmIGxpbmVbMF0gPT0gInsiOgotICAgICAgICAgICAgICAgIHN0YWNrLmFwcGVuZCgiIikKLSAgICAgICAgICAgICAgICBsaW5lID0gbGluZVsxOl0KLSAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgaWYgbGluZVswXSA9PSAiXFwiIGFuZCBsaW5lWzFdIGluIEVTQ0FQRURfQ0hBUlM6Ci0gICAgICAgICAgICAgICAgc2VsZi53cml0ZSgiLSVzXG4iICUgZW5jb2RlKGxpbmVbMV0pKQotICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lWzI6XQotICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICBpZiBsaW5lWzoyXSA9PSByIlxcIjoKLSAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCIoQlJFQUtcbilCUkVBS1xuIikKLSAgICAgICAgICAgICAgICBsaW5lID0gbGluZVsyOl0KLSAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgaWYgbGluZVs6Ml0gPT0gciJcXyI6Ci0gICAgICAgICAgICAgICAgbGluZSA9ICJfIiArIGxpbmVbMjpdCi0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIGlmIGxpbmVbOjJdIGluIChyIlwnIiwgcidcIicpOgotICAgICAgICAgICAgICAgICMgY29tYmluaW5nIGNoYXJhY3RlcnMuLi4KLSAgICAgICAgICAgICAgICBzZWxmLmNvbWJpbmluZ19jaGFyKGxpbmVbMV0sIGxpbmVbMl0pCi0gICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbMzpdCi0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIG0gPSBfdGV4dF9yeC5tYXRjaChsaW5lKQotICAgICAgICAgICAgaWYgbToKLSAgICAgICAgICAgICAgICB0ZXh0ID0gZW5jb2RlKG0uZ3JvdXAoKSkKLSAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCItJXNcbiIgJSB0ZXh0KQotICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lW20uZW5kKCk6XQotICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAjIHNwZWNpYWwgY2FzZSBiZWNhdXNlIG9mIFxpdGVtW10KLSAgICAgICAgICAgICMgWFhYIGNhbiB3ZSBheGUgdGhpcz8/PwotICAgICAgICAgICAgaWYgbGluZVswXSA9PSAiXSI6Ci0gICAgICAgICAgICAgICAgc2VsZi53cml0ZSgiLV1cbiIpCi0gICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbMTpdCi0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgICMgYXZvaWQgaW5maW5pdGUgbG9vcHMKLSAgICAgICAgICAgIGV4dHJhID0gIiIKLSAgICAgICAgICAgIGlmIGxlbihsaW5lKSA+IDEwMDoKLSAgICAgICAgICAgICAgICBleHRyYSA9ICIuLi4iCi0gICAgICAgICAgICByYWlzZSBMYVRlWEZvcm1hdEVycm9yKCJjb3VsZCBub3QgaWRlbnRpZnkgbWFya3VwOiAlciVzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChsaW5lWzoxMDBdLCBleHRyYSkpCi0gICAgICAgIHdoaWxlIHN0YWNrOgotICAgICAgICAgICAgZW50cnkgPSBzZWxmLmdldF9lbnRyeShzdGFja1stMV0pCi0gICAgICAgICAgICBpZiBlbnRyeS5jbG9zZXM6Ci0gICAgICAgICAgICAgICAgc2VsZi53cml0ZSgiKSVzXG4tJXNcbiIgJSAoZW50cnkub3V0cHV0bmFtZSwgZW5jb2RlKCJcbiIpKSkKLSAgICAgICAgICAgICAgICBkZWwgc3RhY2tbLTFdCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIGlmIHN0YWNrOgotICAgICAgICAgICAgcmFpc2UgTGFUZVhGb3JtYXRFcnJvcigiZWxlbWVudHMgcmVtYWluIG9uIHN0YWNrOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgIi5qb2luKHN0YWNrKSkKLSAgICAgICAgIyBvdGhlcndpc2Ugd2UganVzdCByYW4gb3V0IG9mIGlucHV0IGhlcmUuLi4KLQotICAgICMgVGhpcyBpcyBhIHJlYWxseSBsaW1pdGVkIHRhYmxlIG9mIGNvbWJpbmF0aW9ucywgYnV0IGl0IHdpbGwgaGF2ZQotICAgICMgdG8gZG8gZm9yIG5vdy4KLSAgICBfY29tYmluYXRpb25zID0gewotICAgICAgICAoImMiLCAiYyIpOiAweDAwRTcsCi0gICAgICAgICgiJyIsICJlIik6IDB4MDBFOSwKLSAgICAgICAgKCciJywgIm8iKTogMHgwMEY2LAotICAgICAgICB9Ci0KLSAgICBkZWYgY29tYmluaW5nX2NoYXIoc2VsZiwgcHJlZml4LCBjaGFyKToKLSAgICAgICAgb3JkaW5hbCA9IHNlbGYuX2NvbWJpbmF0aW9uc1socHJlZml4LCBjaGFyKV0KLSAgICAgICAgc2VsZi53cml0ZSgiLVxcJSUlZDtcbiIgJSBvcmRpbmFsKQotCi0gICAgZGVmIHN0YXJ0X21hY3JvKHNlbGYsIG5hbWUpOgotICAgICAgICBjb252ZXJzaW9uID0gc2VsZi5nZXRfZW50cnkobmFtZSkKLSAgICAgICAgcGFyYW1ldGVycyA9IGNvbnZlcnNpb24ucGFyYW1ldGVycwotICAgICAgICBvcHRpb25hbCA9IHBhcmFtZXRlcnMgYW5kIHBhcmFtZXRlcnNbMF0ub3B0aW9uYWwKLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnMsIG9wdGlvbmFsLCBjb252ZXJzaW9uLmVtcHR5Ci0KLSAgICBkZWYgZ2V0X2VudHJ5KHNlbGYsIG5hbWUpOgotICAgICAgICBlbnRyeSA9IHNlbGYudGFibGUuZ2V0KG5hbWUpCi0gICAgICAgIGlmIGVudHJ5IGlzIE5vbmU6Ci0gICAgICAgICAgICBkYmdtc2coImdldF9lbnRyeSglcikgZmFpbGluZzsgYnVpbGRpbmcgZGVmYXVsdCBlbnRyeSEiICUgKG5hbWUsICkpCi0gICAgICAgICAgICAjIG5vdCBkZWZpbmVkOyBidWlsZCBhIGRlZmF1bHQgZW50cnk6Ci0gICAgICAgICAgICBlbnRyeSA9IFRhYmxlRW50cnkobmFtZSkKLSAgICAgICAgICAgIGVudHJ5Lmhhc19jb250ZW50ID0gMQotICAgICAgICAgICAgZW50cnkucGFyYW1ldGVycy5hcHBlbmQoUGFyYW1ldGVyKCJjb250ZW50IikpCi0gICAgICAgICAgICBzZWxmLnRhYmxlW25hbWVdID0gZW50cnkKLSAgICAgICAgcmV0dXJuIGVudHJ5Ci0KLSAgICBkZWYgZ2V0X2Vudl9lbnRyeShzZWxmLCBuYW1lKToKLSAgICAgICAgZW50cnkgPSBzZWxmLnRhYmxlLmdldChuYW1lKQotICAgICAgICBpZiBlbnRyeSBpcyBOb25lOgotICAgICAgICAgICAgIyBub3QgZGVmaW5lZDsgYnVpbGQgYSBkZWZhdWx0IGVudHJ5OgotICAgICAgICAgICAgZW50cnkgPSBUYWJsZUVudHJ5KG5hbWUsIDEpCi0gICAgICAgICAgICBlbnRyeS5oYXNfY29udGVudCA9IDEKLSAgICAgICAgICAgIGVudHJ5LnBhcmFtZXRlcnMuYXBwZW5kKFBhcmFtZXRlcigiY29udGVudCIpKQotICAgICAgICAgICAgZW50cnkucGFyYW1ldGVyc1stMV0uaW1wbGllZCA9IDEKLSAgICAgICAgICAgIHNlbGYudGFibGVbbmFtZV0gPSBlbnRyeQotICAgICAgICBlbGlmIG5vdCBlbnRyeS5lbnZpcm9ubWVudDoKLSAgICAgICAgICAgIHJhaXNlIExhVGVYRm9ybWF0RXJyb3IoCi0gICAgICAgICAgICAgICAgbmFtZSArICIgaXMgZGVmaW5lZCBhcyBhIG1hY3JvOyBleHBlY3RlZCBlbnZpcm9ubWVudCIpCi0gICAgICAgIHJldHVybiBlbnRyeQotCi0gICAgZGVmIGR1bXBfYXR0cihzZWxmLCBwZW50cnksIHZhbHVlKToKLSAgICAgICAgaWYgbm90IChwZW50cnkubmFtZSBhbmQgdmFsdWUpOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIGlmIF90b2tlbl9yeC5tYXRjaCh2YWx1ZSk6Ci0gICAgICAgICAgICBkdHlwZSA9ICJUT0tFTiIKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGR0eXBlID0gIkNEQVRBIgotICAgICAgICBzZWxmLndyaXRlKCJBJXMgJXMgJXNcbiIgJSAocGVudHJ5Lm5hbWUsIGR0eXBlLCBlbmNvZGUodmFsdWUpKSkKLQotCi1kZWYgY29udmVydChpZnAsIG9mcCwgdGFibGUpOgotICAgIGMgPSBDb252ZXJzaW9uKGlmcCwgb2ZwLCB0YWJsZSkKLSAgICB0cnk6Ci0gICAgICAgIGMuY29udmVydCgpCi0gICAgZXhjZXB0IElPRXJyb3IgYXMgZToKLSAgICAgICAgKGVyciwgbXNnKSA9IGUKLSAgICAgICAgaWYgZXJyICE9IGVycm5vLkVQSVBFOgotICAgICAgICAgICAgcmFpc2UKLQotCi1kZWYgc2tpcF93aGl0ZShsaW5lKToKLSAgICB3aGlsZSBsaW5lIGFuZCBsaW5lWzBdIGluICIgJVxuXHRcciI6Ci0gICAgICAgIGxpbmUgPSBsaW5lWzE6XS5sc3RyaXAoKQotICAgIHJldHVybiBsaW5lCi0KLQotCi1jbGFzcyBUYWJsZUVudHJ5OgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBlbnZpcm9ubWVudD0wKToKLSAgICAgICAgc2VsZi5uYW1lID0gbmFtZQotICAgICAgICBzZWxmLm91dHB1dG5hbWUgPSBuYW1lCi0gICAgICAgIHNlbGYuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudAotICAgICAgICBzZWxmLmVtcHR5ID0gbm90IGVudmlyb25tZW50Ci0gICAgICAgIHNlbGYuaGFzX2NvbnRlbnQgPSAwCi0gICAgICAgIHNlbGYudmVyYmF0aW0gPSAwCi0gICAgICAgIHNlbGYuYXV0b19jbG9zZSA9IDAKLSAgICAgICAgc2VsZi5wYXJhbWV0ZXJzID0gW10KLSAgICAgICAgc2VsZi5jbG9zZXMgPSBbXQotICAgICAgICBzZWxmLmVuZGNsb3NlcyA9IFtdCi0KLWNsYXNzIFBhcmFtZXRlcjoKLSAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZSwgbmFtZT1Ob25lLCBvcHRpb25hbD0wKToKLSAgICAgICAgc2VsZi50eXBlID0gdHlwZQotICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCi0gICAgICAgIHNlbGYub3B0aW9uYWwgPSBvcHRpb25hbAotICAgICAgICBzZWxmLnRleHQgPSAnJwotICAgICAgICBzZWxmLmltcGxpZWQgPSAwCi0KLQotY2xhc3MgVGFibGVIYW5kbGVyKHhtbC5zYXguaGFuZGxlci5Db250ZW50SGFuZGxlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBzZWxmLl9fdGFibGUgPSB7fQotICAgICAgICBzZWxmLl9fYnVmZmVyID0gJycKLSAgICAgICAgc2VsZi5fX21ldGhvZHMgPSB7fQotCi0gICAgZGVmIGdldF90YWJsZShzZWxmKToKLSAgICAgICAgZm9yIGVudHJ5IGluIHNlbGYuX190YWJsZS52YWx1ZXMoKToKLSAgICAgICAgICAgIGlmIGVudHJ5LmVudmlyb25tZW50IGFuZCBub3QgZW50cnkuaGFzX2NvbnRlbnQ6Ci0gICAgICAgICAgICAgICAgcCA9IFBhcmFtZXRlcigiY29udGVudCIpCi0gICAgICAgICAgICAgICAgcC5pbXBsaWVkID0gMQotICAgICAgICAgICAgICAgIGVudHJ5LnBhcmFtZXRlcnMuYXBwZW5kKHApCi0gICAgICAgICAgICAgICAgZW50cnkuaGFzX2NvbnRlbnQgPSAxCi0gICAgICAgIHJldHVybiBzZWxmLl9fdGFibGUKLQotICAgIGRlZiBzdGFydEVsZW1lbnQoc2VsZiwgdGFnLCBhdHRycyk6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHN0YXJ0LCBlbmQgPSBzZWxmLl9fbWV0aG9kc1t0YWddCi0gICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgICAgIHN0YXJ0ID0gZ2V0YXR0cihzZWxmLCAic3RhcnRfIiArIHRhZywgTm9uZSkKLSAgICAgICAgICAgIGVuZCA9IGdldGF0dHIoc2VsZiwgImVuZF8iICsgdGFnLCBOb25lKQotICAgICAgICAgICAgc2VsZi5fX21ldGhvZHNbdGFnXSA9IChzdGFydCwgZW5kKQotICAgICAgICBpZiBzdGFydDoKLSAgICAgICAgICAgIHN0YXJ0KGF0dHJzKQotCi0gICAgZGVmIGVuZEVsZW1lbnQoc2VsZiwgdGFnKToKLSAgICAgICAgc3RhcnQsIGVuZCA9IHNlbGYuX19tZXRob2RzW3RhZ10KLSAgICAgICAgaWYgZW5kOgotICAgICAgICAgICAgZW5kKCkKLQotICAgIGRlZiBlbmREb2N1bWVudChzZWxmKToKLSAgICAgICAgc2VsZi5fX21ldGhvZHMuY2xlYXIoKQotCi0gICAgZGVmIGNoYXJhY3RlcnMoc2VsZiwgZGF0YSk6Ci0gICAgICAgIHNlbGYuX19idWZmZXIgKz0gZGF0YQotCi0gICAgZGVmIHN0YXJ0X2Vudmlyb25tZW50KHNlbGYsIGF0dHJzKToKLSAgICAgICAgbmFtZSA9IGF0dHJzWyJuYW1lIl0KLSAgICAgICAgc2VsZi5fX2N1cnJlbnQgPSBUYWJsZUVudHJ5KG5hbWUsIGVudmlyb25tZW50PTEpCi0gICAgICAgIHNlbGYuX19jdXJyZW50LnZlcmJhdGltID0gYXR0cnMuZ2V0KCJ2ZXJiYXRpbSIpID09ICJ5ZXMiCi0gICAgICAgIGlmICJvdXRwdXRuYW1lIiBpbiBhdHRyczoKLSAgICAgICAgICAgIHNlbGYuX19jdXJyZW50Lm91dHB1dG5hbWUgPSBhdHRycy5nZXQoIm91dHB1dG5hbWUiKQotICAgICAgICBzZWxmLl9fY3VycmVudC5lbmRjbG9zZXMgPSBhdHRycy5nZXQoImVuZGNsb3NlcyIsICIiKS5zcGxpdCgpCi0gICAgZGVmIGVuZF9lbnZpcm9ubWVudChzZWxmKToKLSAgICAgICAgc2VsZi5lbmRfbWFjcm8oKQotCi0gICAgZGVmIHN0YXJ0X21hY3JvKHNlbGYsIGF0dHJzKToKLSAgICAgICAgbmFtZSA9IGF0dHJzWyJuYW1lIl0KLSAgICAgICAgc2VsZi5fX2N1cnJlbnQgPSBUYWJsZUVudHJ5KG5hbWUpCi0gICAgICAgIHNlbGYuX19jdXJyZW50LmNsb3NlcyA9IGF0dHJzLmdldCgiY2xvc2VzIiwgIiIpLnNwbGl0KCkKLSAgICAgICAgaWYgIm91dHB1dG5hbWUiIGluIGF0dHJzOgotICAgICAgICAgICAgc2VsZi5fX2N1cnJlbnQub3V0cHV0bmFtZSA9IGF0dHJzLmdldCgib3V0cHV0bmFtZSIpCi0gICAgZGVmIGVuZF9tYWNybyhzZWxmKToKLSAgICAgICAgbmFtZSA9IHNlbGYuX19jdXJyZW50Lm5hbWUKLSAgICAgICAgaWYgbmFtZSBpbiBzZWxmLl9fdGFibGU6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJuYW1lICVyIGFscmVhZHkgaW4gdXNlIiAlIChuYW1lLCkpCi0gICAgICAgIHNlbGYuX190YWJsZVtuYW1lXSA9IHNlbGYuX19jdXJyZW50Ci0gICAgICAgIHNlbGYuX19jdXJyZW50ID0gTm9uZQotCi0gICAgZGVmIHN0YXJ0X2F0dHJpYnV0ZShzZWxmLCBhdHRycyk6Ci0gICAgICAgIG5hbWUgPSBhdHRycy5nZXQoIm5hbWUiKQotICAgICAgICBvcHRpb25hbCA9IGF0dHJzLmdldCgib3B0aW9uYWwiKSA9PSAieWVzIgotICAgICAgICBpZiBuYW1lOgotICAgICAgICAgICAgcCA9IFBhcmFtZXRlcigiYXR0cmlidXRlIiwgbmFtZSwgb3B0aW9uYWw9b3B0aW9uYWwpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwID0gUGFyYW1ldGVyKCJhdHRyaWJ1dGUiLCBvcHRpb25hbD1vcHRpb25hbCkKLSAgICAgICAgc2VsZi5fX2N1cnJlbnQucGFyYW1ldGVycy5hcHBlbmQocCkKLSAgICAgICAgc2VsZi5fX2J1ZmZlciA9ICcnCi0gICAgZGVmIGVuZF9hdHRyaWJ1dGUoc2VsZik6Ci0gICAgICAgIHNlbGYuX19jdXJyZW50LnBhcmFtZXRlcnNbLTFdLnRleHQgPSBzZWxmLl9fYnVmZmVyCi0KLSAgICBkZWYgc3RhcnRfZW50aXR5cmVmKHNlbGYsIGF0dHJzKToKLSAgICAgICAgbmFtZSA9IGF0dHJzWyJuYW1lIl0KLSAgICAgICAgcCA9IFBhcmFtZXRlcigiZW50aXR5cmVmIiwgbmFtZSkKLSAgICAgICAgc2VsZi5fX2N1cnJlbnQucGFyYW1ldGVycy5hcHBlbmQocCkKLQotICAgIGRlZiBzdGFydF9jaGlsZChzZWxmLCBhdHRycyk6Ci0gICAgICAgIG5hbWUgPSBhdHRyc1sibmFtZSJdCi0gICAgICAgIHAgPSBQYXJhbWV0ZXIoImNoaWxkIiwgbmFtZSwgYXR0cnMuZ2V0KCJvcHRpb25hbCIpID09ICJ5ZXMiKQotICAgICAgICBzZWxmLl9fY3VycmVudC5wYXJhbWV0ZXJzLmFwcGVuZChwKQotICAgICAgICBzZWxmLl9fY3VycmVudC5lbXB0eSA9IDAKLQotICAgIGRlZiBzdGFydF9jb250ZW50KHNlbGYsIGF0dHJzKToKLSAgICAgICAgcCA9IFBhcmFtZXRlcigiY29udGVudCIpCi0gICAgICAgIHAuaW1wbGllZCA9IGF0dHJzLmdldCgiaW1wbGllZCIpID09ICJ5ZXMiCi0gICAgICAgIGlmIHNlbGYuX19jdXJyZW50LmVudmlyb25tZW50OgotICAgICAgICAgICAgcC5pbXBsaWVkID0gMQotICAgICAgICBzZWxmLl9fY3VycmVudC5wYXJhbWV0ZXJzLmFwcGVuZChwKQotICAgICAgICBzZWxmLl9fY3VycmVudC5oYXNfY29udGVudCA9IDEKLSAgICAgICAgc2VsZi5fX2N1cnJlbnQuZW1wdHkgPSAwCi0KLSAgICBkZWYgc3RhcnRfdGV4dChzZWxmLCBhdHRycyk6Ci0gICAgICAgIHNlbGYuX19jdXJyZW50LmVtcHR5ID0gMAotICAgICAgICBzZWxmLl9fYnVmZmVyID0gJycKLSAgICBkZWYgZW5kX3RleHQoc2VsZik6Ci0gICAgICAgIHAgPSBQYXJhbWV0ZXIoInRleHQiKQotICAgICAgICBwLnRleHQgPSBzZWxmLl9fYnVmZmVyCi0gICAgICAgIHNlbGYuX19jdXJyZW50LnBhcmFtZXRlcnMuYXBwZW5kKHApCi0KLQotZGVmIGxvYWRfdGFibGUoZnApOgotICAgIGNoID0gVGFibGVIYW5kbGVyKCkKLSAgICB4bWwuc2F4LnBhcnNlKGZwLCBjaCkKLSAgICByZXR1cm4gY2guZ2V0X3RhYmxlKCkKLQotCi1kZWYgbWFpbigpOgotICAgIGdsb2JhbCBERUJVRwotICAgICMKLSAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICJEIiwgWyJkZWJ1ZyJdKQotICAgIGZvciBvcHQsIGFyZyBpbiBvcHRzOgotICAgICAgICBpZiBvcHQgaW4gKCItRCIsICItLWRlYnVnIik6Ci0gICAgICAgICAgICBERUJVRyArPSAxCi0gICAgaWYgbGVuKGFyZ3MpID09IDA6Ci0gICAgICAgIGlmcCA9IHN5cy5zdGRpbgotICAgICAgICBvZnAgPSBzeXMuc3Rkb3V0Ci0gICAgZWxpZiBsZW4oYXJncykgPT0gMToKLSAgICAgICAgaWZwID0gb3BlbihhcmdzWzBdKQotICAgICAgICBvZnAgPSBzeXMuc3Rkb3V0Ci0gICAgZWxpZiBsZW4oYXJncykgPT0gMjoKLSAgICAgICAgaWZwID0gb3BlbihhcmdzWzBdKQotICAgICAgICBvZnAgPSBvcGVuKGFyZ3NbMV0sICJ3IikKLSAgICBlbHNlOgotICAgICAgICB1c2FnZSgpCi0gICAgICAgIHN5cy5leGl0KDIpCi0KLSAgICB0YWJsZSA9IGxvYWRfdGFibGUob3Blbihvcy5wYXRoLmpvaW4oc3lzLnBhdGhbMF0sICdjb252ZXJzaW9uLnhtbCcpKSkKLSAgICBjb252ZXJ0KGlmcCwgb2ZwLCB0YWJsZSkKLQotCi1pZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvRG9jL3Rvb2xzL3NnbWxjb252L21ha2UucnVsZXMgYi9Eb2MvdG9vbHMvc2dtbGNvbnYvbWFrZS5ydWxlcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM1NzljNS4uMDAwMDAwMAotLS0gYS9Eb2MvdG9vbHMvc2dtbGNvbnYvbWFrZS5ydWxlcworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMgLSotIG1ha2VmaWxlIC0qLQotIwotIyBFeHRyYSBtYWdpYyBuZWVkZWQgYnkgdGhlIExhVGVYLT5YTUwgY29udmVyc2lvbiBwcm9jZXNzLiAgVGhpcyByZXF1aXJlcwotIyAkKFRPT0xTRElSKSB0byBiZSBwcm9wZXJseSBkZWZpbmVkLgotCi1ET0NGSVhFUj0JJChUT09MU0RJUikvc2dtbGNvbnYvZG9jZml4ZXIucHkKLUVTSVMyTUw9CSQoVE9PTFNESVIpL3NnbWxjb252L2VzaXMyc2dtbC5weQotTEFURVgyRVNJUz0JJChUT09MU0RJUikvc2dtbGNvbnYvbGF0ZXgyZXNpcy5weQotQ09OVkVSU0lPTj0JJChUT09MU0RJUikvc2dtbGNvbnYvY29udmVyc2lvbi54bWwKLQotRVNJU1RBUkdFVFM9CSQocGF0c3Vic3QgJS50ZXgsJS5lc2lzLCQod2lsZGNhcmQgKi50ZXgpKQotRVNJUzFUQVJHRVRTPQkkKHBhdHN1YnN0ICUudGV4LCUuZXNpczEsJCh3aWxkY2FyZCAqLnRleCkpCi1YTUxUQVJHRVRTPQkkKHBhdHN1YnN0ICUudGV4LCUueG1sLCQod2lsZGNhcmQgKi50ZXgpKQotCi1MMkVGTEFHUz0KLQotYWxsOgl4bWwKLQotZXNpczoJJChFU0lTVEFSR0VUUykKLWVzaXMxOgkkKEVTSVMxVEFSR0VUUykKLXhtbDoJJChYTUxUQVJHRVRTKQotCi1FU0lTVE9PTFM9CSQoVE9PTFNESVIpL3NnbWxjb252L2VzaXN0b29scy5weQotCi0kKEVTSVNUQVJHRVRTKTogJChMQVRFWDJFU0lTKSAkKERPQ0ZJWEVSKSAkKEVTSVNUT09MUykgJChDT05WRVJTSU9OKQotJChFU0lTMVRBUkdFVFMpOiAkKExBVEVYMkVTSVMpICQoQ09OVkVSU0lPTikKLSMgVGhpcyB2YXJpYW50IGlzIGVhc2llciB0byB3b3JrIHdpdGggd2hpbGUgZGVidWdnaW5nIHRoZSBjb252ZXJzaW9uIHNwZWM6Ci0jJChFU0lTVEFSR0VUUyk6ICQoTEFURVgyRVNJUykgJChET0NGSVhFUikgJChFU0lTVE9PTFMpCi0kKFhNTFRBUkdFVFMpOiAkKEVTSVMyTUwpCi0KLQotLlNVRkZJWEVTOiAuZXNpcyAuZXNpczEgLnRleCAueG1sCi0KLS50ZXguZXNpczE6Ci0JJChMQVRFWDJFU0lTKSAkKEwyRUZMQUdTKSAkPCAkQAotCi0uZXNpczEuZXNpczoKLQkkKERPQ0ZJWEVSKSAkPCAkQAotCi0uZXNpcy54bWw6Ci0JJChFU0lTMk1MKSAtLXhtbCAkPCAkQAotCi0KLWNsZWFuOgotCXJtIC1mICouZXNpcyAqLmVzaXMxCi0KLWNsb2JiZXI6IGNsZWFuCi0Jcm0gLWYgKi54bWwKZGlmZiAtLWdpdCBhL0RvYy90b29scy9zdXBwb3J0LnB5IGIvRG9jL3Rvb2xzL3N1cHBvcnQucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNGNhZmEuLjAwMDAwMDAKLS0tIGEvRG9jL3Rvb2xzL3N1cHBvcnQucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotIiIiTWlzY2VsbGFuZW91cyBzdXBwb3J0IGNvZGUgc2hhcmVkIGJ5IHNvbWUgb2YgdGhlIHRvb2wgc2NyaXB0cy4KLQotVGhpcyBpbmNsdWRlcyBvcHRpb24gcGFyc2luZyBjb2RlLCBIVE1MIGZvcm1hdHRpbmcgY29kZSwgYW5kIGEgY291cGxlIG9mCi11c2VmdWwgaGVscGVycy4KLQotIiIiCi1fX3ZlcnNpb25fXyA9ICckUmV2aXNpb24kJwotCi0KLWltcG9ydCBnZXRvcHQKLWltcG9ydCBvcy5wYXRoCi1pbXBvcnQgc3lzCi0KLQotY2xhc3MgT3B0aW9uczoKLSAgICBfX3Nob3J0X2FyZ3MgPSAiYTpjOmhvOiIKLSAgICBfX2xvbmdfYXJncyA9IFsKLSAgICAgICAgIyBzY3JpcHQgY29udHJvbHMKLSAgICAgICAgImNvbHVtbnM9IiwgImhlbHAiLCAib3V0cHV0PSIsCi0KLSAgICAgICAgIyBjb250ZW50IGNvbXBvbmVudHMKLSAgICAgICAgImFkZHJlc3M9IiwgImljb25zZXJ2ZXI9IiwgImZhdmljb249IiwKLSAgICAgICAgInRpdGxlPSIsICJ1cGxpbms9IiwgInVwdGl0bGU9IiwKLSAgICAgICAgImltYWdlLXR5cGU9IiwKLSAgICAgICAgXQotCi0gICAgb3V0cHV0ZmlsZSA9ICItIgotICAgIGNvbHVtbnMgPSAxCi0gICAgbGV0dGVycyA9IDAKLSAgICB1cGxpbmsgPSAiaW5kZXguaHRtbCIKLSAgICB1cHRpdGxlID0gIlB5dGhvbiBEb2N1bWVudGF0aW9uIEluZGV4IgotICAgIGZhdmljb24gPSBOb25lCi0KLSAgICAjIFRoZSAiQWVzb3AgTWV0YSBUYWciIGlzIHBvb3JseSBkZXNjcmliZWQsIGFuZCBtYXkgb25seSBiZSB1c2VkCi0gICAgIyBieSB0aGUgQWVzb3Agc2VhcmNoIGVuZ2luZSAod3d3LmFlc29wLmNvbSksIGJ1dCBkb2Vzbid0IGh1cnQuCi0gICAgIwotICAgICMgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHZhbHVlcyB0aGlzIG1heSB0YWtlIHRvIHJvdWdobHkgY2F0ZWdvcml6ZQotICAgICMgYSBwYWdlLiAgQSBwYWdlIHNob3VsZCBiZSBtYXJrZWQgYWNjb3JkaW5nIHRvIGl0cyBwcmltYXJ5Ci0gICAgIyBjYXRlZ29yeS4gIEtub3duIHZhbHVlcyBhcmU6Ci0gICAgIyAgICdwZXJzb25hbCcgICAgLS0gcGVyc29uYWwtaW5mbwotICAgICMgICAnaW5mb3JtYXRpb24nIC0tIGluZm9ybWF0aW9uCi0gICAgIyAgICdpbnRlcmFjdGl2ZScgLS0gaW50ZXJhY3RpdmUgbWVkaWEKLSAgICAjICAgJ211bHRpbWVkaWEnICAtLSBtdWx0aW1lZGlhIHByZXNlbmV0YXRpb24gKG5vbi1zYWxlcykKLSAgICAjICAgJ3NhbGVzJyAgICAgICAtLSBzYWxlcyBtYXRlcmlhbAotICAgICMgICAnbGlua3MnICAgICAgIC0tIGxpbmtzIHRvIG90aGVyIGluZm9ybWF0aW9uIHBhZ2VzCi0gICAgIwotICAgICMgU2V0dGluZyB0aGUgYWVzb3BfdHlwZSB2YWx1ZSB0byBvbmUgb2YgdGhlc2Ugc3RyaW5ncyB3aWxsIGNhdXNlCi0gICAgIyBnZXRfaGVhZGVyKCkgdG8gYWRkIHRoZSBhcHByb3ByaWF0ZSA8bWV0YT4gdGFnIHRvIHRoZSA8aGVhZD4uCi0gICAgIwotICAgIGFlc29wX3R5cGUgPSBOb25lCi0KLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYuYXJncyA9IFtdCi0gICAgICAgIHNlbGYudmFyaWFibGVzID0geyJhZGRyZXNzIjogIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJpY29uc2VydmVyIjogImljb25zIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImltZ3R5cGUiOiAicG5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkdsb2JhbCBNb2R1bGUgSW5kZXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICBkZWYgYWRkX2FyZ3Moc2VsZiwgc2hvcnQ9Tm9uZSwgbG9uZz1Ob25lKToKLSAgICAgICAgaWYgc2hvcnQ6Ci0gICAgICAgICAgICBzZWxmLl9fc2hvcnRfYXJncyA9IHNlbGYuX19zaG9ydF9hcmdzICsgc2hvcnQKLSAgICAgICAgaWYgbG9uZzoKLSAgICAgICAgICAgIHNlbGYuX19sb25nX2FyZ3MgPSBzZWxmLl9fbG9uZ19hcmdzICsgbG9uZwotCi0gICAgZGVmIHBhcnNlKHNlbGYsIGFyZ3MpOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChhcmdzLCBzZWxmLl9fc2hvcnRfYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX19sb25nX2FyZ3MpCi0gICAgICAgIGV4Y2VwdCBnZXRvcHQuZXJyb3I6Ci0gICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc3lzLnN0ZGVycgotICAgICAgICAgICAgc2VsZi51c2FnZSgpCi0gICAgICAgICAgICBzeXMuZXhpdCgyKQotICAgICAgICBzZWxmLmFyZ3MgPSBzZWxmLmFyZ3MgKyBhcmdzCi0gICAgICAgIGZvciBvcHQsIHZhbCBpbiBvcHRzOgotICAgICAgICAgICAgaWYgb3B0IGluICgiLWEiLCAiLS1hZGRyZXNzIik6Ci0gICAgICAgICAgICAgICAgdmFsID0gdmFsLnN0cmlwKCkKLSAgICAgICAgICAgICAgICBpZiB2YWw6Ci0gICAgICAgICAgICAgICAgICAgIHZhbCA9ICI8YWRkcmVzcz5cbiVzXG48L2FkZHJlc3M+XG4iICUgdmFsCi0gICAgICAgICAgICAgICAgICAgIHNlbGYudmFyaWFibGVzWyJhZGRyZXNzIl0gPSB2YWwKLSAgICAgICAgICAgIGVsaWYgb3B0IGluICgiLWgiLCAiLS1oZWxwIik6Ci0gICAgICAgICAgICAgICAgc2VsZi51c2FnZSgpCi0gICAgICAgICAgICAgICAgc3lzLmV4aXQoKQotICAgICAgICAgICAgZWxpZiBvcHQgaW4gKCItbyIsICItLW91dHB1dCIpOgotICAgICAgICAgICAgICAgIHNlbGYub3V0cHV0ZmlsZSA9IHZhbAotICAgICAgICAgICAgZWxpZiBvcHQgaW4gKCItYyIsICItLWNvbHVtbnMiKToKLSAgICAgICAgICAgICAgICBzZWxmLmNvbHVtbnMgPSBpbnQodmFsKQotICAgICAgICAgICAgZWxpZiBvcHQgPT0gIi0tdGl0bGUiOgotICAgICAgICAgICAgICAgIHNlbGYudmFyaWFibGVzWyJ0aXRsZSJdID0gdmFsLnN0cmlwKCkKLSAgICAgICAgICAgIGVsaWYgb3B0ID09ICItLXVwbGluayI6Ci0gICAgICAgICAgICAgICAgc2VsZi51cGxpbmsgPSB2YWwuc3RyaXAoKQotICAgICAgICAgICAgZWxpZiBvcHQgPT0gIi0tdXB0aXRsZSI6Ci0gICAgICAgICAgICAgICAgc2VsZi51cHRpdGxlID0gdmFsLnN0cmlwKCkKLSAgICAgICAgICAgIGVsaWYgb3B0ID09ICItLWljb25zZXJ2ZXIiOgotICAgICAgICAgICAgICAgIHNlbGYudmFyaWFibGVzWyJpY29uc2VydmVyIl0gPSB2YWwuc3RyaXAoKSBvciAiLiIKLSAgICAgICAgICAgIGVsaWYgb3B0ID09ICItLWZhdmljb24iOgotICAgICAgICAgICAgICAgIHNlbGYuZmF2aWNvbiA9IHZhbC5zdHJpcCgpCi0gICAgICAgICAgICBlbGlmIG9wdCA9PSAiLS1pbWFnZS10eXBlIjoKLSAgICAgICAgICAgICAgICBzZWxmLnZhcmlhYmxlc1siaW1ndHlwZSJdID0gdmFsLnN0cmlwKCkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfb3B0aW9uKG9wdCwgdmFsKQotICAgICAgICBpZiBzZWxmLnVwbGluayBhbmQgc2VsZi51cHRpdGxlOgotICAgICAgICAgICAgc2VsZi52YXJpYWJsZXNbInVwbGlua2FsdCJdID0gInVwIgotICAgICAgICAgICAgc2VsZi52YXJpYWJsZXNbInVwbGlua2ljb24iXSA9ICJ1cCIKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYudmFyaWFibGVzWyJ1cGxpbmthbHQiXSA9ICIiCi0gICAgICAgICAgICBzZWxmLnZhcmlhYmxlc1sidXBsaW5raWNvbiJdID0gImJsYW5rIgotICAgICAgICBzZWxmLnZhcmlhYmxlc1sidXBsaW5rIl0gPSBzZWxmLnVwbGluawotICAgICAgICBzZWxmLnZhcmlhYmxlc1sidXB0aXRsZSJdID0gc2VsZi51cHRpdGxlCi0KLSAgICBkZWYgaGFuZGxlX29wdGlvbihzZWxmLCBvcHQsIHZhbCk6Ci0gICAgICAgIHJhaXNlIGdldG9wdC5lcnJvcigib3B0aW9uICVzIG5vdCByZWNvZ25pemVkIiAlIG9wdCkKLQotICAgIGRlZiBnZXRfaGVhZGVyKHNlbGYpOgotICAgICAgICBzID0gSEVBRCAlIHNlbGYudmFyaWFibGVzCi0gICAgICAgIGlmIHNlbGYudXBsaW5rOgotICAgICAgICAgICAgaWYgc2VsZi51cHRpdGxlOgotICAgICAgICAgICAgICAgIGxpbmsgPSAoJzxsaW5rIHJlbD0idXAiIGhyZWY9IiVzIiB0aXRsZT0iJXMiPlxuICAnCi0gICAgICAgICAgICAgICAgICAgICAgICAnPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iJXMiIHRpdGxlPSIlcyI+JwotICAgICAgICAgICAgICAgICAgICAgICAgJSAoc2VsZi51cGxpbmssIHNlbGYudXB0aXRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudXBsaW5rLCBzZWxmLnVwdGl0bGUpKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBsaW5rID0gKCc8bGluayByZWw9InVwIiBocmVmPSIlcyI+XG4gICcKLSAgICAgICAgICAgICAgICAgICAgICAgICc8bGluayByZWw9InN0YXJ0IiBocmVmPSIlcyI+JwotICAgICAgICAgICAgICAgICAgICAgICAgJSAoc2VsZi51cGxpbmssIHNlbGYudXBsaW5rKSkKLSAgICAgICAgICAgIHJlcGwgPSAiICAlc1xuPC9oZWFkPiIgJSBsaW5rCi0gICAgICAgICAgICBzID0gcy5yZXBsYWNlKCI8L2hlYWQ+IiwgcmVwbCwgMSkKLSAgICAgICAgaWYgc2VsZi5hZXNvcF90eXBlOgotICAgICAgICAgICAgbWV0YSA9ICc8bWV0YSBuYW1lPSJhZXNvcCIgY29udGVudD0iJXMiPlxuICAnICUgc2VsZi5hZXNvcF90eXBlCi0gICAgICAgICAgICAjIEluc2VydCB0aGlzIGluIHRoZSBtaWRkbGUgb2YgdGhlIGhlYWQgdGhhdCdzIGJlZW4KLSAgICAgICAgICAgICMgZ2VuZXJhdGVkIHNvIGZhciwga2VlcGluZyA8bWV0YT4gYW5kIDxsaW5rPiBlbGVtZW50cyBpbgotICAgICAgICAgICAgIyBuZWF0IGdyb3VwczoKLSAgICAgICAgICAgIHMgPSBzLnJlcGxhY2UoIjxsaW5rICIsIG1ldGEgKyAiPGxpbmsgIiwgMSkKLSAgICAgICAgaWYgc2VsZi5mYXZpY29uOgotICAgICAgICAgICAgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChzZWxmLmZhdmljb24pWzFdCi0gICAgICAgICAgICBpZiBleHQgaW4gKCIuZ2lmIiwgIi5wbmciKToKLSAgICAgICAgICAgICAgICB0eXBlID0gJyB0eXBlPSJpbWFnZS8lcyInICUgZXh0WzE6XQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICB0eXBlID0gJycKLSAgICAgICAgICAgIGxpbmsgPSAoJzxsaW5rIHJlbD0iU0hPUlRDVVQgSUNPTiIgaHJlZj0iJXMiJXM+XG4gICcKLSAgICAgICAgICAgICAgICAgICAgJSAoc2VsZi5mYXZpY29uLCB0eXBlKSkKLSAgICAgICAgICAgIHMgPSBzLnJlcGxhY2UoIjxsaW5rICIsIGxpbmsgKyAiPGxpbmsgIiwgMSkKLSAgICAgICAgcmV0dXJuIHMKLQotICAgIGRlZiBnZXRfZm9vdGVyKHNlbGYpOgotICAgICAgICByZXR1cm4gVEFJTCAlIHNlbGYudmFyaWFibGVzCi0KLSAgICBkZWYgZ2V0X291dHB1dF9maWxlKHNlbGYsIGZpbGVuYW1lPU5vbmUpOgotICAgICAgICBpZiBmaWxlbmFtZSBpcyBOb25lOgotICAgICAgICAgICAgZmlsZW5hbWUgPSBzZWxmLm91dHB1dGZpbGUKLSAgICAgICAgaWYgZmlsZW5hbWUgPT0gIi0iOgotICAgICAgICAgICAgcmV0dXJuIHN5cy5zdGRvdXQKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBvcGVuKGZpbGVuYW1lLCAidyIpCi0KLQotTkFWSUdBVElPTiA9ICcnJ1wKLTxkaXYgY2xhc3M9Im5hdmlnYXRpb24iPgotPHRhYmxlIHdpZHRoPSIxMDAlJSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIyIj4KLTx0cj4KLTx0ZD48aW1nIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIiBhbHQ9IiIKLSBzcmM9IiUoaWNvbnNlcnZlcilzL2JsYW5rLiUoaW1ndHlwZSlzIj48L3RkPgotPHRkPjxhIGhyZWY9IiUodXBsaW5rKXMiCi0gdGl0bGU9IiUodXB0aXRsZSlzIj48aW1nIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIgotIGFsdD0iJSh1cGxpbmthbHQpcyIKLSBzcmM9IiUoaWNvbnNlcnZlcilzLyUodXBsaW5raWNvbilzLiUoaW1ndHlwZSlzIj48L2E+PC90ZD4KLTx0ZD48aW1nIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIiBhbHQ9IiIKLSBzcmM9IiUoaWNvbnNlcnZlcilzL2JsYW5rLiUoaW1ndHlwZSlzIj48L3RkPgotPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlJSI+JSh0aXRsZSlzPC90ZD4KLTx0ZD48aW1nIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIiBhbHQ9IiIKLSBzcmM9IiUoaWNvbnNlcnZlcilzL2JsYW5rLiUoaW1ndHlwZSlzIj48L3RkPgotPHRkPjxpbWcgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiIGFsdD0iIgotIHNyYz0iJShpY29uc2VydmVyKXMvYmxhbmsuJShpbWd0eXBlKXMiPjwvdGQ+Ci08dGQ+PGltZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCIgYWx0PSIiCi0gc3JjPSIlKGljb25zZXJ2ZXIpcy9ibGFuay4lKGltZ3R5cGUpcyI+PC90ZD4KLTwvdHI+PC90YWJsZT4KLTxiIGNsYXNzPSJuYXZsYWJlbCI+VXA6PC9iPiA8c3BhbiBjbGFzcz0ic2VjdHJlZiI+PGEgaHJlZj0iJSh1cGxpbmspcyIKLSB0aXRsZT0iJSh1cHRpdGxlKXMiPiUodXB0aXRsZSlzPC9BPjwvc3Bhbj4KLTxicj48L2Rpdj4KLScnJwotCi1IRUFEID0gJycnXAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci0gIDx0aXRsZT4lKHRpdGxlKXM8L3RpdGxlPgotICA8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iJSh0aXRsZSlzIj4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gIDxsaW5rIHJlbD0iU1RZTEVTSEVFVCIgaHJlZj0ibGliL2xpYi5jc3MiPgotPC9oZWFkPgotPGJvZHk+Ci0nJycgKyBOQVZJR0FUSU9OICsgJycnXAotPGhyPgotCi08aDI+JSh0aXRsZSlzPC9oMj4KLQotJycnCi0KLVRBSUwgPSAiPGhyPlxuIiArIE5BVklHQVRJT04gKyAnJydcCi0lKGFkZHJlc3MpczwvYm9keT4KLTwvaHRtbD4KLScnJwpkaWZmIC0tZ2l0IGEvRG9jL3Rvb2xzL3RvYzJia20ucHkgYi9Eb2MvdG9vbHMvdG9jMmJrbS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWI2NjliYS4uMDAwMDAwMAotLS0gYS9Eb2MvdG9vbHMvdG9jMmJrbS5weQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uCi0KLSIiIkNvbnZlcnQgYSBMYVRlWCAudG9jIGZpbGUgdG8gc29tZSBQREZUZVggbWFnaWMgdG8gY3JlYXRlIHRoYXQgbmVhdCBvdXRsaW5lLgotCi1UaGUgb3V0cHV0IGZpbGUgaGFzIGFuIGV4dGVuc2lvbiBvZiAnLmJrbScgaW5zdGVhZCBvZiAnLm91dCcsIHNpbmNlIGh5cGVycmVmCi1hbHJlYWR5IHVzZXMgdGhhdCBleHRlbnNpb24uCi0iIiIKLQotaW1wb3J0IGdldG9wdAotaW1wb3J0IG9zCi1pbXBvcnQgcmUKLWltcG9ydCBzdHJpbmcKLWltcG9ydCBzeXMKLQotCi0jIEVuY2ggaXRlbSBpbiBhbiBlbnRyeSBpcyBhIHR1cGxlIG9mOgotIwotIyAgIFNlY3Rpb24gIywgIFRpdGxlIFN0cmluZywgIFBhZ2UgIywgIExpc3Qgb2YgU3ViLWVudHJpZXMKLSMKLSMgVGhlIHJldHVybiB2YWx1ZSBvZiBwYXJzZV90b2MoKSBpcyBzdWNoIGEgdHVwbGUuCi0KLWNsaW5lX3JlID0gciIiIl4KLVxcY29udGVudHNsaW5lXCBceyhbYS16XSopfSAgICAgICAgICAgICAjIHR5cGUgb2Ygc2VjdGlvbiBpbiAkMQotXHsoPzpcXG51bWJlcmxpbmVcIFx7KFswLTkuQS1aXSspfSk/ICAgICAjIHNlY3Rpb24gbnVtYmVyCi0oLiopfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aXRsZSBzdHJpbmcKLVx7KFxkKyl9JCIiIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBhZ2UgbnVtYmVyCi0KLWNsaW5lX3J4ID0gcmUuY29tcGlsZShjbGluZV9yZSwgcmUuVkVSQk9TRSkKLQotT1VURVJfVE9fSU5ORVIgPSAtMQotCi1fdHJhbnNpdGlvbl9tYXAgPSB7Ci0gICAgKCdjaGFwdGVyJywgJ3NlY3Rpb24nKTogT1VURVJfVE9fSU5ORVIsCi0gICAgKCdzZWN0aW9uJywgJ3N1YnNlY3Rpb24nKTogT1VURVJfVE9fSU5ORVIsCi0gICAgKCdzdWJzZWN0aW9uJywgJ3N1YnN1YnNlY3Rpb24nKTogT1VURVJfVE9fSU5ORVIsCi0gICAgKCdzdWJzdWJzZWN0aW9uJywgJ3N1YnNlY3Rpb24nKTogMSwKLSAgICAoJ3N1YnNlY3Rpb24nLCAnc2VjdGlvbicpOiAxLAotICAgICgnc2VjdGlvbicsICdjaGFwdGVyJyk6IDEsCi0gICAgKCdzdWJzZWN0aW9uJywgJ2NoYXB0ZXInKTogMiwKLSAgICAoJ3N1YnN1YnNlY3Rpb24nLCAnc2VjdGlvbicpOiAyLAotICAgICgnc3Vic3Vic2VjdGlvbicsICdjaGFwdGVyJyk6IDMsCi0gICAgfQotCi1JTkNMVURFRF9MRVZFTFMgPSAoImNoYXB0ZXIiLCAic2VjdGlvbiIsICJzdWJzZWN0aW9uIiwgInN1YnN1YnNlY3Rpb24iKQotCi0KLWNsYXNzIEJhZFNlY3Rpb25OZXN0aW5nKEV4Y2VwdGlvbik6Ci0gICAgIiIiUmFpc2VkIGZvciB1bnN1cHBvcnRlZCBzZWN0aW9uIGxldmVsIHRyYW5zaXRpb25zLiIiIgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGxldmVsLCBuZXdzZWN0aW9uLCBwYXRoLCBsaW5lbm8pOgotICAgICAgICBzZWxmLmxldmVsID0gbGV2ZWwKLSAgICAgICAgc2VsZi5uZXdzZWN0aW9uID0gbmV3c2VjdGlvbgotICAgICAgICBzZWxmLnBhdGggPSBwYXRoCi0gICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCi0KLSAgICBkZWYgX19zdHJfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuICgiaWxsZWdhbCB0cmFuc2l0aW9uIGZyb20gJXMgdG8gJXMgYXQgJXMgKGxpbmUgJXMpIgotICAgICAgICAgICAgICAgICUgKHNlbGYubGV2ZWwsIHNlbGYubmV3c2VjdGlvbiwgc2VsZi5wYXRoLCBzZWxmLmxpbmVubykpCi0KLQotZGVmIHBhcnNlX3RvYyhmcCwgYmlncGFydD1Ob25lKToKLSAgICB0b2MgPSB0b3AgPSBbXQotICAgIHN0YWNrID0gW3RvY10KLSAgICBsZXZlbCA9IGJpZ3BhcnQgb3IgJ2NoYXB0ZXInCi0gICAgbGluZW5vID0gMAotICAgIHdoaWxlIDE6Ci0gICAgICAgIGxpbmUgPSBmcC5yZWFkbGluZSgpCi0gICAgICAgIGlmIG5vdCBsaW5lOgotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgbGluZW5vID0gbGluZW5vICsgMQotICAgICAgICBtID0gY2xpbmVfcngubWF0Y2gobGluZSkKLSAgICAgICAgaWYgbToKLSAgICAgICAgICAgIHN0eXBlLCBzbnVtLCB0aXRsZSwgcGFnZW5vID0gbS5ncm91cCgxLCAyLCAzLCA0KQotICAgICAgICAgICAgdGl0bGUgPSBjbGVhbl90aXRsZSh0aXRsZSkKLSAgICAgICAgICAgIGVudHJ5ID0gKHN0eXBlLCBzbnVtLCB0aXRsZSwgaW50KHBhZ2VubyksIFtdKQotICAgICAgICAgICAgaWYgc3R5cGUgPT0gbGV2ZWw6Ci0gICAgICAgICAgICAgICAgdG9jLmFwcGVuZChlbnRyeSkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgaWYgc3R5cGUgbm90IGluIElOQ0xVREVEX0xFVkVMUzoKLSAgICAgICAgICAgICAgICAgICAgIyB3ZSBkb24ndCB3YW50IHBhcmFncmFwaHMgJiBzdWJwYXJhZ3JhcGhzCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBfdHJhbnNpdGlvbl9tYXBbKGxldmVsLCBzdHlwZSldCi0gICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICAgICAgICAgICAgICByYWlzZSBCYWRTZWN0aW9uTmVzdGluZyhsZXZlbCwgc3R5cGUsIGZwLm5hbWUsIGxpbmVubykKLSAgICAgICAgICAgICAgICBpZiBkaXJlY3Rpb24gPT0gT1VURVJfVE9fSU5ORVI6Ci0gICAgICAgICAgICAgICAgICAgIHRvYyA9IHRvY1stMV1bLTFdCi0gICAgICAgICAgICAgICAgICAgIHN0YWNrLmluc2VydCgwLCB0b2MpCi0gICAgICAgICAgICAgICAgICAgIHRvYy5hcHBlbmQoZW50cnkpCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoZGlyZWN0aW9uKToKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBzdGFja1swXQotICAgICAgICAgICAgICAgICAgICAgICAgdG9jID0gc3RhY2tbMF0KLSAgICAgICAgICAgICAgICAgICAgdG9jLmFwcGVuZChlbnRyeSkKLSAgICAgICAgICAgICAgICBsZXZlbCA9IHN0eXBlCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJsLiVzOiAiICsgbGluZSkKLSAgICByZXR1cm4gdG9wCi0KLQotaGFja3Njb3JlX3J4ID0gcmUuY29tcGlsZShyIlxcaGFja3Njb3JlXHMqe1tefV0qfSIpCi1yYWlzZWJveF9yeCA9IHJlLmNvbXBpbGUociJcXHJhaXNlYm94XHMqe1tefV0qfSIpCi10aXRsZV9yeCA9IHJlLmNvbXBpbGUociJcXChbYS16QS1aXSkrXHMrIikKLXRpdGxlX3RyYW5zID0gc3RyaW5nLm1ha2V0cmFucygiIiwgIiIpCi0KLWRlZiBjbGVhbl90aXRsZSh0aXRsZSk6Ci0gICAgdGl0bGUgPSByYWlzZWJveF9yeC5zdWIoIiIsIHRpdGxlKQotICAgIHRpdGxlID0gaGFja3Njb3JlX3J4LnN1YihyIlxcXyIsIHRpdGxlKQotICAgIHBvcyA9IDAKLSAgICB3aGlsZSAxOgotICAgICAgICBtID0gdGl0bGVfcnguc2VhcmNoKHRpdGxlLCBwb3MpCi0gICAgICAgIGlmIG06Ci0gICAgICAgICAgICBzdGFydCA9IG0uc3RhcnQoKQotICAgICAgICAgICAgaWYgdGl0bGVbc3RhcnQ6c3RhcnQrMTVdICE9ICJcXHRleHR1bmRlcnNjb3JlIjoKLSAgICAgICAgICAgICAgICB0aXRsZSA9IHRpdGxlWzpzdGFydF0gKyB0aXRsZVttLmVuZCgpOl0KLSAgICAgICAgICAgIHBvcyA9IHN0YXJ0ICsgMQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgYnJlYWsKLSAgICB0aXRsZSA9IHRpdGxlLnRyYW5zbGF0ZSh0aXRsZV90cmFucywgInt9IikKLSAgICByZXR1cm4gdGl0bGUKLQotCi1kZWYgd3JpdGVfdG9jKHRvYywgZnApOgotICAgIGZvciBlbnRyeSBpbiB0b2M6Ci0gICAgICAgIHdyaXRlX3RvY19lbnRyeShlbnRyeSwgZnAsIDApCi0KLWRlZiB3cml0ZV90b2NfZW50cnkoZW50cnksIGZwLCBsYXllcik6Ci0gICAgc3R5cGUsIHNudW0sIHRpdGxlLCBwYWdlbm8sIHRvYyA9IGVudHJ5Ci0gICAgcyA9ICJcXHBkZm91dGxpbmUgZ290byBuYW1le3BhZ2UlMDNkfSIgJSBwYWdlbm8KLSAgICBpZiB0b2M6Ci0gICAgICAgIHMgPSAiJXMgY291bnQgLSVkIiAlIChzLCBsZW4odG9jKSkKLSAgICBpZiBzbnVtOgotICAgICAgICB0aXRsZSA9ICIlcyAlcyIgJSAoc251bSwgdGl0bGUpCi0gICAgcyA9ICIlcyB7JXN9XG4iICUgKHMsIHRpdGxlKQotICAgIGZwLndyaXRlKHMpCi0gICAgZm9yIGVudHJ5IGluIHRvYzoKLSAgICAgICAgd3JpdGVfdG9jX2VudHJ5KGVudHJ5LCBmcCwgbGF5ZXIgKyAxKQotCi0KLWRlZiBwcm9jZXNzKGlmbiwgb2ZuLCBiaWdwYXJ0PU5vbmUpOgotICAgIHRvYyA9IHBhcnNlX3RvYyhvcGVuKGlmbiksIGJpZ3BhcnQpCi0gICAgd3JpdGVfdG9jKHRvYywgb3BlbihvZm4sICJ3IikpCi0KLQotZGVmIG1haW4oKToKLSAgICBiaWdwYXJ0ID0gTm9uZQotICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgImM6IikKLSAgICBpZiBvcHRzOgotICAgICAgICBiaWdwYXJ0ID0gb3B0c1swXVsxXQotICAgIGlmIG5vdCBhcmdzOgotICAgICAgICB1c2FnZSgpCi0gICAgICAgIHN5cy5leGl0KDIpCi0gICAgZm9yIGZpbGVuYW1lIGluIGFyZ3M6Ci0gICAgICAgIGJhc2UsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoZmlsZW5hbWUpCi0gICAgICAgIGV4dCA9IGV4dCBvciAiLnRvYyIKLSAgICAgICAgcHJvY2VzcyhiYXNlICsgZXh0LCBiYXNlICsgIi5ia20iLCBiaWdwYXJ0KQotCi0KLWlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgbWFpbigpCmRpZmYgLS1naXQgYS9Eb2MvdG9vbHMvdW5kb2Nfc3ltYm9scy5weSBiL0RvYy90b29scy91bmRvY19zeW1ib2xzLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGNiOTQxLi4wMDAwMDAwCi0tLSBhL0RvYy90b29scy91bmRvY19zeW1ib2xzLnB5CisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotIyEgL3Vzci9iaW4vZW52IHB5dGhvbgotCi0iIiJcCi1UaGlzIHNjcmlwdCBwcmludHMgb3V0IGEgbGlzdCBvZiB1bmRvY3VtZW50ZWQgc3ltYm9scyBmb3VuZCBpbgotUHl0aG9uIGluY2x1ZGUgZmlsZXMsIHByZWZpeGVkIGJ5IHRoZWlyIHRhZyBraW5kLgotCi1QYXNzIFB5dGhvbidzIGluY2x1ZGUgZmlsZXMgdG8gY3RhZ3MsIHBhcnNlIHRoZSBvdXRwdXQgaW50byBhCi1kaWN0aW9uYXJ5IG1hcHBpbmcgc3ltYm9sIG5hbWVzIHRvIHRhZyBraW5kcy4KLQotVGhlbiwgdGhlIC50ZXggZmlsZXMgZnJvbSBQeXRob24gZG9jcyBhcmUgcmVhZCBpbnRvIGEgZ2lhbnQgc3RyaW5nLgotCi1GaW5hbGx5IGFsbCBzeW1ib2xzIG5vdCBmb3VuZCBpbiB0aGUgZG9jcyBhcmUgd3JpdHRlbiB0byBzdGFuZGFyZAotb3V0cHV0LCBwcmVmaXhlZCB3aXRoIHRoZWlyIHRhZyBraW5kLgotIiIiCi0KLSMgV2hpY2gga2luZCBvZiB0YWdzIGRvIHdlIG5lZWQ/Ci1UQUdfS0lORFMgPSAiZHBzdCIKLQotIyBEb2Mgc2VjdGlvbnMgdG8gdXNlCi1ET0NTRUNUSU9OUyA9IFsiYXBpIl0jIFsiYXBpIiwgImV4dCJdCi0KLSMgT25seSBwcmludCBzeW1ib2xzIHN0YXJ0aW5nIHdpdGggdGhpcyBwcmVmaXgsCi0jIHRvIGdldCBhbGwgc3ltYm9scywgdXNlIGFuIGVtcHR5IHN0cmluZwotUFJFRklYRVMgPSAoIlB5IiwgIlBZIikKLQotSU5DTFVERVBBVFRFUk4gPSAiKi5oIgotCi0jIGVuZCBvZiBjdXN0b21pemF0aW9uIHNlY3Rpb24KLQotCi0jIFRlc3RlZCB3aXRoIEVYVUJFUkFOVCBDVEFHUwotIyBzZWUgaHR0cDovL2N0YWdzLnNvdXJjZWZvcmdlLm5ldAotIwotIyBjdGFncyBmaWVsZHMgYXJlIHNlcGFyYXRlZCBieSB0YWJzLgotIyBUaGUgZmlyc3QgZmllbGQgaXMgdGhlIG5hbWUsIHRoZSBsYXN0IGZpZWxkIHRoZSB0eXBlOgotIyBkIG1hY3JvIGRlZmluaXRpb25zIChhbmQgI3VuZGVmIG5hbWVzKQotIyBlIGVudW1lcmF0b3JzCi0jIGYgZnVuY3Rpb24gZGVmaW5pdGlvbnMKLSMgZyBlbnVtZXJhdGlvbiBuYW1lcwotIyBtIGNsYXNzLCBzdHJ1Y3QsIG9yIHVuaW9uIG1lbWJlcnMKLSMgbiBuYW1lc3BhY2VzCi0jIHAgZnVuY3Rpb24gcHJvdG90eXBlcyBhbmQgZGVjbGFyYXRpb25zCi0jIHMgc3RydWN0dXJlIG5hbWVzCi0jIHQgdHlwZWRlZnMKLSMgdSB1bmlvbiBuYW1lcwotIyB2IHZhcmlhYmxlIGRlZmluaXRpb25zCi0jIHggZXh0ZXJuIGFuZCBmb3J3YXJkIHZhcmlhYmxlIGRlY2xhcmF0aW9ucwotCi1pbXBvcnQgb3MsIGdsb2IsIHJlLCBzeXMKLQotZGVmIGZpbmRuYW1lcyhmaWxlLCBwcmVmaXhlcz0oKSk6Ci0gICAgbmFtZXMgPSB7fQotICAgIGZvciBsaW5lIGluIGZpbGU6Ci0gICAgICAgIGlmIGxpbmVbMF0gPT0gJyEnOgotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgZmllbGRzID0gbGluZS5zcGxpdCgpCi0gICAgICAgIG5hbWUsIHRhZyA9IGZpZWxkc1swXSwgZmllbGRzWy0xXQotICAgICAgICBpZiB0YWcgPT0gJ2QnIGFuZCBuYW1lLmVuZHN3aXRoKCdfSCcpOgotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgaWYgcHJlZml4ZXM6Ci0gICAgICAgICAgICBzdyA9IG5hbWUuc3RhcnRzd2l0aAotICAgICAgICAgICAgZm9yIHByZWZpeCBpbiBwcmVmaXhlczoKLSAgICAgICAgICAgICAgICBpZiBzdyhwcmVmaXgpOgotICAgICAgICAgICAgICAgICAgICBuYW1lc1tuYW1lXSA9IHRhZwotICAgICAgICBlbHNlOgotICAgICAgICAgICAgbmFtZXNbbmFtZV0gPSB0YWcKLSAgICByZXR1cm4gbmFtZXMKLQotZGVmIHByaW50X3VuZG9jX3N5bWJvbHMocHJlZml4LCBkb2NkaXIsIGluY2Rpcik6Ci0gICAgZG9jcyA9IFtdCi0KLSAgICBmb3Igc2VjdCBpbiBET0NTRUNUSU9OUzoKLSAgICAgICAgZm9yIGZpbGUgaW4gZ2xvYi5nbG9iKG9zLnBhdGguam9pbihkb2NkaXIsIHNlY3QsICIqLnRleCIpKToKLSAgICAgICAgICAgIGRvY3MuYXBwZW5kKG9wZW4oZmlsZSkucmVhZCgpKQotCi0gICAgZG9jcyA9ICJcbiIuam9pbihkb2NzKQotCi0gICAgaW5jZmlsZXMgPSBvcy5wYXRoLmpvaW4oaW5jZGlyLCBJTkNMVURFUEFUVEVSTikKLQotICAgIGZwID0gb3MucG9wZW4oImN0YWdzIC1JUHlBUElfRlVOQyAtSVB5X0dDQ19BVFRSSUJVVEUgLS1jLXR5cGVzPSVzIC1mIC0gJXMiCi0gICAgICAgICAgICAgICAgICAlIChUQUdfS0lORFMsIGluY2ZpbGVzKSkKLSAgICBkaWN0ID0gZmluZG5hbWVzKGZwLCBwcmVmaXgpCi0gICAgbmFtZXMgPSBzb3J0ZWQoZGljdC5rZXlzKCkpCi0gICAgZm9yIG5hbWUgaW4gbmFtZXM6Ci0gICAgICAgIGlmIG5vdCByZS5zZWFyY2goIiVzXFxXIiAlIG5hbWUsIGRvY3MpOgotICAgICAgICAgICAgcHJpbnQoZGljdFtuYW1lXSwgbmFtZSkKLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICBzcmNkaXIgPSBvcy5wYXRoLmRpcm5hbWUoc3lzLmFyZ3ZbMF0pCi0gICAgaW5jZGlyID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmpvaW4oc3JjZGlyLCAiLi4vLi4vSW5jbHVkZSIpKQotICAgIGRvY2RpciA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5qb2luKHNyY2RpciwgIi4uIikpCi0KLSAgICBwcmludF91bmRvY19zeW1ib2xzKFBSRUZJWEVTLCBkb2NkaXIsIGluY2RpcikKZGlmZiAtLWdpdCBhL0RvYy90b29scy91cGRhdGUtZG9jcy5zaCBiL0RvYy90b29scy91cGRhdGUtZG9jcy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjU5OWM2NC4uMDAwMDAwMAotLS0gYS9Eb2MvdG9vbHMvdXBkYXRlLWRvY3Muc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgU2NyaXB0IHdoaWNoIGluc3RhbGxzIGEgZGV2ZWxvcG1lbnQgc25hcHNob3Qgb2YgdGhlIGRvY3VtZW50YXRpb24KLSMgaW50byB0aGUgZGV2ZWxvcG1lbnQgd2Vic2l0ZS4KLSMKLSMgVGhlIHB1c2gtZG9jcy5zaCBzY3JpcHQgcHVzaGVzIHRoaXMgdG8gdGhlIHNlcnZlciB3aGVuIG5lZWRlZAotIyBhbmQgcmVtb3ZlcyBpdCB3aGVuIGRvbmUuCi0KLWlmIFsgLXogIiRIT01FIiBdIDsgdGhlbgotICAgIEhPTUU9YGdyZXAgIiRMT0dOQU1FIiAvZXRjL3Bhc3N3ZCB8IHNlZCAnc3xeLio6XChbXjpdKlwpOlteOl0qJHxcMXwnYAotICAgIGV4cG9ydCBIT01FCi1maQotCi1ET0NUWVBFPSIkMSIKLVVQREFURVM9IiRIT01FL3RtcC8kMiIKLQotVE1QRElSPSIkJC1kb2NzIgotCi1jZCAvZnRwL2Z0cC5weXRob24ub3JnL3B1Yi93d3cucHl0aG9uLm9yZy9kZXYvZG9jLyB8fCBleGl0ICQ/Ci1ta2RpciAkVE1QRElSIHx8IGV4aXQgJD8KLWNkICRUTVBESVIgfHwgZXhpdCAkPwotKGJ6aXAyIC1kYyAiJFVQREFURVMiIHwgdGFyIHhmIC0pIHx8IGV4aXQgJD8KLWNkIC4uIHx8IGV4aXQgJD8KLQotaWYgWyAtZCAkRE9DVFlQRSBdIDsgdGhlbgotICAgIG12ICRET0NUWVBFICRET0NUWVBFLXRlbXAKLWZpCi1tdiAkVE1QRElSL1B5dGhvbi1Eb2NzLSogJERPQ1RZUEUKLXJtZGlyICRUTVBESVIKLXJtIC1yZiAkRE9DVFlQRS10ZW1wIHx8IGV4aXQgJD8KLW12ICIkVVBEQVRFUyIgcHl0aG9uLWRvY3MtJERPQ1RZUEUudGFyLmJ6MiB8fCBleGl0ICQ/CmRpZmYgLS1naXQgYS9Eb2MvdG9vbHMvd2hpY2hsaWJzIGIvRG9jL3Rvb2xzL3doaWNobGlicwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTBkNDRlZS4uMDAwMDAwMAotLS0gYS9Eb2MvdG9vbHMvd2hpY2hsaWJzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIS9iaW4vc2gKLXNlZCAtbiAncyVeXFxpbnB1dHtcKGxpYlthLXpBLVowLTlfXSpcKX0uKiUuLi9saWIvXDEudGV4JXAnIC4uL2xpYi9saWIudGV4CmRpZmYgLS1naXQgYS9Eb2MvdHV0L2dsb3NzYXJ5LnRleCBiL0RvYy90dXQvZ2xvc3NhcnkudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTk0MTZiLi4wMDAwMDAwCi0tLSBhL0RvYy90dXQvZ2xvc3NhcnkudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMzI3ICswLDAgQEAKLVxjaGFwdGVye0dsb3NzYXJ5XGxhYmVse2dsb3NzYXJ5fX0KLQotJSUlIGtlZXAgdGhlIGVudHJpZXMgc29ydGVkIGFuZCBpbmNsdWRlIGF0IGxlYXN0IG9uZSBcaW5kZXh7fSBpdGVtIGZvciBlYWNoCi0lJSUgY3Jvc3MtcmVmZXJlbmNlcyBhcmUgbWFya2VkIHdpdGggXGVtcGh7ZW50cnl9Ci0KLVxiZWdpbntkZXNjcmlwdGlvbn0KLQotCi1caW5kZXh7Pj4+fQotXGl0ZW1bXGNvZGV7Pj4+fV0KLVRoZSB0eXBpY2FsIFB5dGhvbiBwcm9tcHQgb2YgdGhlIGludGVyYWN0aXZlIHNoZWxsLiAgT2Z0ZW4gc2VlbiBmb3IKLWNvZGUgZXhhbXBsZXMgdGhhdCBjYW4gYmUgdHJpZWQgcmlnaHQgYXdheSBpbiB0aGUgaW50ZXJwcmV0ZXIuCi0KLVxpbmRleHsuLi59Ci1caXRlbVtcY29kZXsuXGNvZGV7Ln0ufV0KLVRoZSB0eXBpY2FsIFB5dGhvbiBwcm9tcHQgb2YgdGhlIGludGVyYWN0aXZlIHNoZWxsIHdoZW4gZW50ZXJpbmcgY29kZQotZm9yIGFuIGluZGVudGVkIGNvZGUgYmxvY2suCi0KLVxpbmRleHtCREZMfQotXGl0ZW1bQkRGTF0KLUJlbmV2b2xlbnQgRGljdGF0b3IgRm9yIExpZmUsIGEuay5hLiBcdWxpbmt7R3VpZG8gdmFuCi1Sb3NzdW19e2h0dHA6Ly93d3cucHl0aG9uLm9yZy9cdGV4dGFzY2lpdGlsZGV7fWd1aWRvL30sIFB5dGhvbidzIGNyZWF0b3IuCi0KLVxpbmRleHtieXRlIGNvZGV9Ci1caXRlbVtieXRlIGNvZGVdCi1UaGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgYSBQeXRob24gcHJvZ3JhbSBpbiB0aGUgaW50ZXJwcmV0ZXIuCi1UaGUgYnl0ZSBjb2RlIGlzIGFsc28gY2FjaGVkIGluIFxjb2Rley5weWN9IGFuZCBcY29kZXsucHlvfQotZmlsZXMgc28gdGhhdCBleGVjdXRpbmcgdGhlIHNhbWUgZmlsZSBpcyBmYXN0ZXIgdGhlIHNlY29uZCB0aW1lCi0ocmVjb21waWxhdGlvbiBmcm9tIHNvdXJjZSB0byBieXRlIGNvZGUgY2FuIGJlIGF2b2lkZWQpLiAgVGhpcwotYGBpbnRlcm1lZGlhdGUgbGFuZ3VhZ2UnJyBpcyBzYWlkIHRvIHJ1biBvbiBhIGBgdmlydHVhbAotbWFjaGluZScnIHRoYXQgY2FsbHMgdGhlIHN1YnJvdXRpbmVzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBieXRlY29kZS4KLQotXGluZGV4e2NsYXNzaWMgY2xhc3N9Ci1caXRlbVtjbGFzc2ljIGNsYXNzXQotQW55IGNsYXNzIHdoaWNoIGRvZXMgbm90IGluaGVyaXQgZnJvbSBcY2xhc3N7b2JqZWN0fS4gIFNlZQotXGVtcGh7bmV3LXN0eWxlIGNsYXNzfS4KLQotXGluZGV4e2NvbXBsZXggbnVtYmVyfQotXGl0ZW1bY29tcGxleCBudW1iZXJdCi1BbiBleHRlbnNpb24gb2YgdGhlIGZhbWlsaWFyIHJlYWwgbnVtYmVyIHN5c3RlbSBpbiB3aGljaCBhbGwgbnVtYmVycyBhcmUKLWV4cHJlc3NlZCBhcyBhIHN1bSBvZiBhIHJlYWwgcGFydCBhbmQgYW4gaW1hZ2luYXJ5IHBhcnQuICBJbWFnaW5hcnkgbnVtYmVycwotYXJlIHJlYWwgbXVsdGlwbGVzIG9mIHRoZSBpbWFnaW5hcnkgdW5pdCAodGhlIHNxdWFyZSByb290IG9mIHt9XGNvZGV7LTF9KSwKLW9mdGVuIHdyaXR0ZW4ge31cY29kZXtpfSBpbiBtYXRoZW1hdGljcyBvciB7fVxjb2Rle2p9IGluIGVuZ2luZWVyaW5nLgotUHl0aG9uIGhhcyBidWlsdGluIHN1cHBvcnQgZm9yIGNvbXBsZXggbnVtYmVycywgd2hpY2ggYXJlIHdyaXR0ZW4gd2l0aCB0aGlzCi1sYXR0ZXIgbm90YXRpb247IHRoZSBpbWFnaW5hcnkgcGFydCBpcyB3cml0dGVuIHdpdGggYSB7fVxjb2Rle2p9IHN1ZmZpeCwKLWUuZy4sIHt9XGNvZGV7Mysxan0uICBUbyBnZXQgYWNjZXNzIHRvIGNvbXBsZXggZXF1aXZhbGVudHMgb2YgdGhlCi17fVxtb2R1bGV7bWF0aH0gbW9kdWxlLCB1c2Uge31cbW9kdWxle2NtYXRofS4gIFVzZSBvZiBjb21wbGV4IG51bWJlcnMgaXMgYQotZmFpcmx5IGFkdmFuY2VkIG1hdGhlbWF0aWNhbCBmZWF0dXJlLiAgSWYgeW91J3JlIG5vdCBhd2FyZSBvZiBhIG5lZWQgZm9yIHRoZW0sCi1pdCdzIGFsbW9zdCBjZXJ0YWluIHlvdSBjYW4gc2FmZWx5IGlnbm9yZSB0aGVtLgotCi1caW5kZXh7ZGVzY3JpcHRvcn0KLVxpdGVtW2Rlc2NyaXB0b3JdCi1BbnkgXGVtcGh7bmV3LXN0eWxlfSBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZSBtZXRob2RzCi17fVxtZXRob2R7X19nZXRfXygpfSwgXG1ldGhvZHtfX3NldF9fKCl9LCBvciBcbWV0aG9ke19fZGVsZXRlX18oKX0uCi1XaGVuIGEgY2xhc3MgYXR0cmlidXRlIGlzIGEgZGVzY3JpcHRvciwgaXRzIHNwZWNpYWwgYmluZGluZyBiZWhhdmlvcgotaXMgdHJpZ2dlcmVkIHVwb24gYXR0cmlidXRlIGxvb2t1cC4gIE5vcm1hbGx5LCB3cml0aW5nIFx2YXJ7YS5ifSBsb29rcwotdXAgdGhlIG9iamVjdCBcdmFye2J9IGluIHRoZSBjbGFzcyBkaWN0aW9uYXJ5IGZvciBcdmFye2F9LCBidXQgaWYKLXt9XHZhcntifSBpcyBhIGRlc2NyaXB0b3IsIHRoZSBkZWZpbmVkIG1ldGhvZCBnZXRzIGNhbGxlZC4KLVVuZGVyc3RhbmRpbmcgZGVzY3JpcHRvcnMgaXMgYSBrZXkgdG8gYSBkZWVwIHVuZGVyc3RhbmRpbmcgb2YgUHl0aG9uCi1iZWNhdXNlIHRoZXkgYXJlIHRoZSBiYXNpcyBmb3IgbWFueSBmZWF0dXJlcyBpbmNsdWRpbmcgZnVuY3Rpb25zLAotbWV0aG9kcywgcHJvcGVydGllcywgY2xhc3MgbWV0aG9kcywgc3RhdGljIG1ldGhvZHMsIGFuZCByZWZlcmVuY2UgdG8KLXN1cGVyIGNsYXNzZXMuCi0KLVxpbmRleHtkaWN0aW9uYXJ5fQotXGl0ZW1bZGljdGlvbmFyeV0KLUFuIGFzc29jaWF0aXZlIGFycmF5LCB3aGVyZSBhcmJpdHJhcnkga2V5cyBhcmUgbWFwcGVkIHRvIHZhbHVlcy4gIFRoZQotdXNlIG9mIFxjbGFzc3tkaWN0fSBtdWNoIHJlc2VtYmxlcyB0aGF0IGZvciBcY2xhc3N7bGlzdH0sIGJ1dCB0aGUga2V5cwotY2FuIGJlIGFueSBvYmplY3Qgd2l0aCBhIFxtZXRob2R7X19oYXNoX18oKX0gZnVuY3Rpb24sIG5vdCBqdXN0Ci1pbnRlZ2VycyBzdGFydGluZyBmcm9tIHplcm8uICBDYWxsZWQgYSBoYXNoIGluIFBlcmwuCi0KLVxpbmRleHtkdWNrLXR5cGluZ30KLVxpdGVtW2R1Y2stdHlwaW5nXQotUHl0aG9uaWMgcHJvZ3JhbW1pbmcgc3R5bGUgdGhhdCBkZXRlcm1pbmVzIGFuIG9iamVjdCdzIHR5cGUgYnkgaW5zcGVjdGlvbgotb2YgaXRzIG1ldGhvZCBvciBhdHRyaWJ1dGUgc2lnbmF0dXJlIHJhdGhlciB0aGFuIGJ5IGV4cGxpY2l0IHJlbGF0aW9uc2hpcAotdG8gc29tZSB0eXBlIG9iamVjdCAoIklmIGl0IGxvb2tzIGxpa2UgYSBkdWNrIGFuZCBxdWFja3MgbGlrZSBhIGR1Y2ssIGl0Ci1tdXN0IGJlIGEgZHVjay4iKSAgQnkgZW1waGFzaXppbmcgaW50ZXJmYWNlcyByYXRoZXIgdGhhbiBzcGVjaWZpYyB0eXBlcywKLXdlbGwtZGVzaWduZWQgY29kZSBpbXByb3ZlcyBpdHMgZmxleGliaWxpdHkgYnkgYWxsb3dpbmcgcG9seW1vcnBoaWMKLXN1YnN0aXR1dGlvbi4gIER1Y2stdHlwaW5nIGF2b2lkcyB0ZXN0cyB1c2luZyBcZnVuY3Rpb257dHlwZSgpfSBvcgotXGZ1bmN0aW9ue2lzaW5zdGFuY2UoKX0uIEluc3RlYWQsIGl0IHR5cGljYWxseSBlbXBsb3lzCi1cZnVuY3Rpb257aGFzYXR0cigpfSB0ZXN0cyBvciB7fVxlbXBoe0VBRlB9IHByb2dyYW1taW5nLgotCi1caW5kZXh7RUFGUH0KLVxpdGVtW0VBRlBdCi1FYXNpZXIgdG8gYXNrIGZvciBmb3JnaXZlbmVzcyB0aGFuIHBlcm1pc3Npb24uICBUaGlzIGNvbW1vbiBQeXRob24KLWNvZGluZyBzdHlsZSBhc3N1bWVzIHRoZSBleGlzdGVuY2Ugb2YgdmFsaWQga2V5cyBvciBhdHRyaWJ1dGVzIGFuZAotY2F0Y2hlcyBleGNlcHRpb25zIGlmIHRoZSBhc3N1bXB0aW9uIHByb3ZlcyBmYWxzZS4gIFRoaXMgY2xlYW4gYW5kCi1mYXN0IHN0eWxlIGlzIGNoYXJhY3Rlcml6ZWQgYnkgdGhlIHByZXNlbmNlIG9mIG1hbnkgXGtleXdvcmR7dHJ5fSBhbmQKLXt9XGtleXdvcmR7ZXhjZXB0fSBzdGF0ZW1lbnRzLiAgVGhlIHRlY2huaXF1ZSBjb250cmFzdHMgd2l0aCB0aGUKLXt9XGVtcGh7TEJZTH0gc3R5bGUgdGhhdCBpcyBjb21tb24gaW4gbWFueSBvdGhlciBsYW5ndWFnZXMgc3VjaCBhcyBDLgotCi1caW5kZXh7X19mdXR1cmVfX30KLVxpdGVtW19fZnV0dXJlX19dCi1BIHBzZXVkbyBtb2R1bGUgd2hpY2ggcHJvZ3JhbW1lcnMgY2FuIHVzZSB0byBlbmFibGUgbmV3IGxhbmd1YWdlCi1mZWF0dXJlcyB3aGljaCBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCBpbnRlcnByZXRlci4KLVRvIGVuYWJsZSBcY29kZXtuZXdfZmVhdHVyZX0KLQotXGJlZ2lue3ZlcmJhdGltfQotZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBuZXdfZmVhdHVyZQotXGVuZHt2ZXJiYXRpbX0KLQotQnkgaW1wb3J0aW5nIHRoZSBcdWxpbmt7XG1vZHVsZXtfX2Z1dHVyZV9ffX17Li4vbGliL21vZHVsZS1mdXR1cmUuaHRtbH0KLW1vZHVsZSBhbmQgZXZhbHVhdGluZyBpdHMgdmFyaWFibGVzLCB5b3UgY2FuIHNlZSB3aGVuIGEgbmV3IGZlYXR1cmUKLXdhcyBmaXJzdCBhZGRlZCB0byB0aGUgbGFuZ3VhZ2UgYW5kIHdoZW4gaXQgd2lsbCBiZWNvbWUgdGhlIGRlZmF1bHQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgX19mdXR1cmVfXwotPj4+IF9fZnV0dXJlX18uZGl2aXNpb24KLV9GZWF0dXJlKCgyLCAyLCAwLCAnYWxwaGEnLCAyKSwgKDMsIDAsIDAsICdhbHBoYScsIDApLCA4MTkyKQotXGVuZHt2ZXJiYXRpbX0KLQotXGluZGV4e2dlbmVyYXRvcn0KLVxpdGVtW2dlbmVyYXRvcl0KLUEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuIGl0ZXJhdG9yLiAgSXQgbG9va3MgbGlrZSBhIG5vcm1hbCBmdW5jdGlvbiBleGNlcHQKLXRoYXQgdmFsdWVzIGFyZSByZXR1cm5lZCB0byB0aGUgY2FsbGVyIHVzaW5nIGEgXGtleXdvcmR7eWllbGR9IHN0YXRlbWVudAotaW5zdGVhZCBvZiBhIHt9XGtleXdvcmR7cmV0dXJufSBzdGF0ZW1lbnQuICBHZW5lcmF0b3IgZnVuY3Rpb25zIG9mdGVuCi1jb250YWluIG9uZSBvciBtb3JlIHt9XGtleXdvcmR7Zm9yfSBvciBca2V5d29yZHt3aGlsZX0gbG9vcHMgdGhhdAotXGtleXdvcmR7eWllbGR9IGVsZW1lbnRzIGJhY2sgdG8gdGhlIGNhbGxlci4gIFRoZSBmdW5jdGlvbiBleGVjdXRpb24gaXMKLXN0b3BwZWQgYXQgdGhlIHt9XGtleXdvcmR7eWllbGR9IGtleXdvcmQgKHJldHVybmluZyB0aGUgcmVzdWx0KSBhbmQgaXMKLXJlc3VtZWQgdGhlcmUgd2hlbiB0aGUgbmV4dCBlbGVtZW50IGlzIHJlcXVlc3RlZCBieSBjYWxsaW5nIHRoZQotXG1ldGhvZHtfX25leHRfXygpfSBtZXRob2Qgb2YgdGhlIHJldHVybmVkIGl0ZXJhdG9yLgotCi1caW5kZXh7Z2VuZXJhdG9yIGV4cHJlc3Npb259Ci1caXRlbVtnZW5lcmF0b3IgZXhwcmVzc2lvbl0KLUFuIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIGEgZ2VuZXJhdG9yLiAgSXQgbG9va3MgbGlrZSBhIG5vcm1hbCBleHByZXNzaW9uCi1mb2xsb3dlZCBieSBhIFxrZXl3b3Jke2Zvcn0gZXhwcmVzc2lvbiBkZWZpbmluZyBhIGxvb3AgdmFyaWFibGUsIHJhbmdlLCBhbmQKLWFuIG9wdGlvbmFsIFxrZXl3b3Jke2lmfSBleHByZXNzaW9uLiAgVGhlIGNvbWJpbmVkIGV4cHJlc3Npb24gZ2VuZXJhdGVzCi12YWx1ZXMgZm9yIGFuIGVuY2xvc2luZyBmdW5jdGlvbjoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHN1bShpKmkgZm9yIGkgaW4gcmFuZ2UoMTApKSAgICAgICAgICMgc3VtIG9mIHNxdWFyZXMgMCwgMSwgNCwgLi4uIDgxCi0yODUKLVxlbmR7dmVyYmF0aW19Ci0KLVxpbmRleHtHSUx9Ci1caXRlbVtHSUxdCi1TZWUgXGVtcGh7Z2xvYmFsIGludGVycHJldGVyIGxvY2t9LgotCi1caW5kZXh7Z2xvYmFsIGludGVycHJldGVyIGxvY2t9Ci1caXRlbVtnbG9iYWwgaW50ZXJwcmV0ZXIgbG9ja10KLVRoZSBsb2NrIHVzZWQgYnkgUHl0aG9uIHRocmVhZHMgdG8gYXNzdXJlIHRoYXQgb25seSBvbmUgdGhyZWFkIGNhbiBiZQotcnVuIGF0IGEgdGltZS4gIFRoaXMgc2ltcGxpZmllcyBQeXRob24gYnkgYXNzdXJpbmcgdGhhdCBubyB0d28KLXByb2Nlc3NlcyBjYW4gYWNjZXNzIHRoZSBzYW1lIG1lbW9yeSBhdCB0aGUgc2FtZSB0aW1lLiAgTG9ja2luZyB0aGUKLWVudGlyZSBpbnRlcnByZXRlciBtYWtlcyBpdCBlYXNpZXIgZm9yIHRoZSBpbnRlcnByZXRlciB0byBiZQotbXVsdGktdGhyZWFkZWQsIGF0IHRoZSBleHBlbnNlIG9mIHNvbWUgcGFyYWxsZWxpc20gb24gbXVsdGktcHJvY2Vzc29yCi1tYWNoaW5lcy4gIEVmZm9ydHMgaGF2ZSBiZWVuIG1hZGUgaW4gdGhlIHBhc3QgdG8gY3JlYXRlIGEKLWBgZnJlZS10aHJlYWRlZCcnIGludGVycHJldGVyIChvbmUgd2hpY2ggbG9ja3Mgc2hhcmVkIGRhdGEgYXQgYSBtdWNoCi1maW5lciBncmFudWxhcml0eSksIGJ1dCBwZXJmb3JtYW5jZSBzdWZmZXJlZCBpbiB0aGUgY29tbW9uCi1zaW5nbGUtcHJvY2Vzc29yIGNhc2UuCi0KLVxpbmRleHtJRExFfQotXGl0ZW1bSURMRV0KLUFuIEludGVncmF0ZWQgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgZm9yIFB5dGhvbi4gIElETEUgaXMgYQotYmFzaWMgZWRpdG9yIGFuZCBpbnRlcnByZXRlciBlbnZpcm9ubWVudCB0aGF0IHNoaXBzIHdpdGggdGhlIHN0YW5kYXJkCi1kaXN0cmlidXRpb24gb2YgUHl0aG9uLiAgR29vZCBmb3IgYmVnaW5uZXJzLCBpdCBhbHNvIHNlcnZlcyBhcyBjbGVhcgotZXhhbXBsZSBjb2RlIGZvciB0aG9zZSB3YW50aW5nIHRvIGltcGxlbWVudCBhIG1vZGVyYXRlbHkKLXNvcGhpc3RpY2F0ZWQsIG11bHRpLXBsYXRmb3JtIEdVSSBhcHBsaWNhdGlvbi4KLQotXGluZGV4e2ltbXV0YWJsZX0KLVxpdGVtW2ltbXV0YWJsZV0KLUFuIG9iamVjdCB3aXRoIGZpeGVkIHZhbHVlLiAgSW1tdXRhYmxlIG9iamVjdHMgYXJlIG51bWJlcnMsIHN0cmluZ3Mgb3IKLXR1cGxlcyAoYW5kIG1vcmUpLiAgU3VjaCBhbiBvYmplY3QgY2Fubm90IGJlIGFsdGVyZWQuICBBIG5ldyBvYmplY3QKLWhhcyB0byBiZSBjcmVhdGVkIGlmIGEgZGlmZmVyZW50IHZhbHVlIGhhcyB0byBiZSBzdG9yZWQuICBUaGV5IHBsYXkgYW4KLWltcG9ydGFudCByb2xlIGluIHBsYWNlcyB3aGVyZSBhIGNvbnN0YW50IGhhc2ggdmFsdWUgaXMgbmVlZGVkLCBmb3IKLWV4YW1wbGUgYXMgYSBrZXkgaW4gYSBkaWN0aW9uYXJ5LgotCi1caW5kZXh7aW50ZWdlciBkaXZpc2lvbn0KLVxpdGVtW2ludGVnZXIgZGl2aXNpb25dCi1NYXRoZW1hdGljYWwgZGl2aXNpb24gaW5jbHVkaW5nIGFueSByZW1haW5kZXIuICBUaGUgcmVzdWx0IHdpbGwgYWx3YXlzCi1iZSBhIGZsb2F0LiAgRm9yIGV4YW1wbGUsIHRoZSBleHByZXNzaW9uIFxjb2RlezExLzR9IGV2YWx1YXRlcyB0byBcY29kZXsyLjc1fS4KLUludGVnZXIgZGl2aXNpb24gY2FuIGJlIGZvcmNlZCBieSB1c2luZyB0aGUgXGNvZGV7Ly99IG9wZXJhdG9yIGluc3RlYWQKLW9mIHRoZSBcY29kZXsvfSBvcGVyYXRvci4KLQotXGluZGV4e2ludGVyYWN0aXZlfQotXGl0ZW1baW50ZXJhY3RpdmVdCi1QeXRob24gaGFzIGFuIGludGVyYWN0aXZlIGludGVycHJldGVyIHdoaWNoIG1lYW5zIHRoYXQgeW91IGNhbiB0cnkgb3V0Ci10aGluZ3MgYW5kIGltbWVkaWF0ZWx5IHNlZSB0aGVpciByZXN1bHRzLiAgSnVzdCBsYXVuY2ggXGNvZGV7cHl0aG9ufSB3aXRoIG5vCi1hcmd1bWVudHMgKHBvc3NpYmx5IGJ5IHNlbGVjdGluZyBpdCBmcm9tIHlvdXIgY29tcHV0ZXIncyBtYWluIG1lbnUpLgotSXQgaXMgYSB2ZXJ5IHBvd2VyZnVsIHdheSB0byB0ZXN0IG91dCBuZXcgaWRlYXMgb3IgaW5zcGVjdCBtb2R1bGVzIGFuZAotcGFja2FnZXMgKHJlbWVtYmVyIFxjb2Rle2hlbHAoeCl9KS4KLQotXGluZGV4e2ludGVycHJldGVkfQotXGl0ZW1baW50ZXJwcmV0ZWRdCi1QeXRob24gaXMgYW4gaW50ZXJwcmV0ZWQgbGFuZ3VhZ2UsIGFzIG9wcG9zZWQgdG8gYSBjb21waWxlZCBvbmUuICBUaGlzIG1lYW5zCi10aGF0IHRoZSBzb3VyY2UgZmlsZXMgY2FuIGJlIHJ1biBkaXJlY3RseSB3aXRob3V0IGZpcnN0IGNyZWF0aW5nIGFuCi1leGVjdXRhYmxlIHdoaWNoIGlzIHRoZW4gcnVuLiAgSW50ZXJwcmV0ZWQgbGFuZ3VhZ2VzIHR5cGljYWxseSBoYXZlIGEKLXNob3J0ZXIgZGV2ZWxvcG1lbnQvZGVidWcgY3ljbGUgdGhhbiBjb21waWxlZCBvbmVzLCB0aG91Z2ggdGhlaXIgcHJvZ3JhbXMKLWdlbmVyYWxseSBhbHNvIHJ1biBtb3JlIHNsb3dseS4gIFNlZSBhbHNvIHt9XGVtcGh7aW50ZXJhY3RpdmV9LgotCi1caW5kZXh7aXRlcmFibGV9Ci1caXRlbVtpdGVyYWJsZV0KLUEgY29udGFpbmVyIG9iamVjdCBjYXBhYmxlIG9mIHJldHVybmluZyBpdHMgbWVtYmVycyBvbmUgYXQgYSB0aW1lLgotRXhhbXBsZXMgb2YgaXRlcmFibGVzIGluY2x1ZGUgYWxsIHNlcXVlbmNlIHR5cGVzIChzdWNoIGFzIFxjbGFzc3tsaXN0fSwKLXt9XGNsYXNze3N0cn0sIGFuZCBcY2xhc3N7dHVwbGV9KSBhbmQgc29tZSBub24tc2VxdWVuY2UgdHlwZXMgbGlrZQote31cY2xhc3N7ZGljdH0gYW5kIFxjbGFzc3tmaWxlfSBhbmQgb2JqZWN0cyBvZiBhbnkgY2xhc3NlcyB5b3UgZGVmaW5lCi13aXRoIGFuIFxtZXRob2R7X19pdGVyX18oKX0gb3IgXG1ldGhvZHtfX2dldGl0ZW1fXygpfSBtZXRob2QuICBJdGVyYWJsZXMKLWNhbiBiZSB1c2VkIGluIGEgXGtleXdvcmR7Zm9yfSBsb29wIGFuZCBpbiBtYW55IG90aGVyIHBsYWNlcyB3aGVyZSBhCi1zZXF1ZW5jZSBpcyBuZWVkZWQgKFxmdW5jdGlvbnt6aXAoKX0sIFxmdW5jdGlvbnttYXAoKX0sIC4uLikuICBXaGVuIGFuCi1pdGVyYWJsZSBvYmplY3QgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBidWlsdGluIGZ1bmN0aW9uCi17fVxmdW5jdGlvbntpdGVyKCl9LCBpdCByZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciB0aGUgb2JqZWN0LiAgVGhpcwotaXRlcmF0b3IgaXMgZ29vZCBmb3Igb25lIHBhc3Mgb3ZlciB0aGUgc2V0IG9mIHZhbHVlcy4gIFdoZW4gdXNpbmcKLWl0ZXJhYmxlcywgaXQgaXMgdXN1YWxseSBub3QgbmVjZXNzYXJ5IHRvIGNhbGwgXGZ1bmN0aW9ue2l0ZXIoKX0gb3IKLWRlYWwgd2l0aCBpdGVyYXRvciBvYmplY3RzIHlvdXJzZWxmLiAgVGhlIFxjb2Rle2Zvcn0gc3RhdGVtZW50IGRvZXMKLXRoYXQgYXV0b21hdGljYWxseSBmb3IgeW91LCBjcmVhdGluZyBhIHRlbXBvcmFyeSB1bm5hbWVkIHZhcmlhYmxlIHRvCi1ob2xkIHRoZSBpdGVyYXRvciBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBsb29wLiAgU2VlIGFsc28KLXt9XGVtcGh7aXRlcmF0b3J9LCBcZW1waHtzZXF1ZW5jZX0sIGFuZCBcZW1waHtnZW5lcmF0b3J9LgotCi1caW5kZXh7aXRlcmF0b3J9Ci1caXRlbVtpdGVyYXRvcl0KLUFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBzdHJlYW0gb2YgZGF0YS4gIFJlcGVhdGVkIGNhbGxzIHRvIHRoZQotaXRlcmF0b3IncyBcbWV0aG9ke19fbmV4dF9fKCl9IG1ldGhvZCByZXR1cm4gc3VjY2Vzc2l2ZSBpdGVtcyBpbiB0aGUKLXN0cmVhbS4gIFdoZW4gbm8gbW9yZSBkYXRhIGlzIGF2YWlsYWJsZSBhIFxleGNlcHRpb257U3RvcEl0ZXJhdGlvbn0KLWV4Y2VwdGlvbiBpcyByYWlzZWQgaW5zdGVhZC4gIEF0IHRoaXMgcG9pbnQsIHRoZSBpdGVyYXRvciBvYmplY3QgaXMKLWV4aGF1c3RlZCBhbmQgYW55IGZ1cnRoZXIgY2FsbHMgdG8gaXRzIFxtZXRob2R7X19uZXh0X18oKX0gbWV0aG9kIGp1c3QKLXJhaXNlIFxleGNlcHRpb257U3RvcEl0ZXJhdGlvbn0gYWdhaW4uICBJdGVyYXRvcnMgYXJlIHJlcXVpcmVkIHRvIGhhdmUKLWFuIFxtZXRob2R7X19pdGVyX18oKX0gbWV0aG9kIHRoYXQgcmV0dXJucyB0aGUgaXRlcmF0b3Igb2JqZWN0Ci1pdHNlbGYgc28gZXZlcnkgaXRlcmF0b3IgaXMgYWxzbyBpdGVyYWJsZSBhbmQgbWF5IGJlIHVzZWQgaW4gbW9zdAotcGxhY2VzIHdoZXJlIG90aGVyIGl0ZXJhYmxlcyBhcmUgYWNjZXB0ZWQuICBPbmUgbm90YWJsZSBleGNlcHRpb24gaXMKLWNvZGUgdGhhdCBhdHRlbXB0cyBtdWx0aXBsZSBpdGVyYXRpb24gcGFzc2VzLiAgQSBjb250YWluZXIgb2JqZWN0Ci0oc3VjaCBhcyBhIFxjbGFzc3tsaXN0fSkgcHJvZHVjZXMgYSBmcmVzaCBuZXcgaXRlcmF0b3IgZWFjaCB0aW1lIHlvdQotcGFzcyBpdCB0byB0aGUgXGZ1bmN0aW9ue2l0ZXIoKX0gZnVuY3Rpb24gb3IgdXNlIGl0IGluIGEKLXt9XGtleXdvcmR7Zm9yfSBsb29wLiAgQXR0ZW1wdGluZyB0aGlzIHdpdGggYW4gaXRlcmF0b3Igd2lsbCBqdXN0Ci1yZXR1cm4gdGhlIHNhbWUgZXhoYXVzdGVkIGl0ZXJhdG9yIG9iamVjdCB1c2VkIGluIHRoZSBwcmV2aW91cyBpdGVyYXRpb24KLXBhc3MsIG1ha2luZyBpdCBhcHBlYXIgbGlrZSBhbiBlbXB0eSBjb250YWluZXIuCi0KLVxpbmRleHtMQllMfQotXGl0ZW1bTEJZTF0KLUxvb2sgYmVmb3JlIHlvdSBsZWFwLiAgVGhpcyBjb2Rpbmcgc3R5bGUgZXhwbGljaXRseSB0ZXN0cyBmb3IKLXByZS1jb25kaXRpb25zIGJlZm9yZSBtYWtpbmcgY2FsbHMgb3IgbG9va3Vwcy4gIFRoaXMgc3R5bGUgY29udHJhc3RzCi13aXRoIHRoZSBcZW1waHtFQUZQfSBhcHByb2FjaCBhbmQgaXMgY2hhcmFjdGVyaXplZCBieSB0aGUgcHJlc2VuY2Ugb2YKLW1hbnkgXGtleXdvcmR7aWZ9IHN0YXRlbWVudHMuCi0KLVxpbmRleHtsaXN0IGNvbXByZWhlbnNpb259Ci1caXRlbVtsaXN0IGNvbXByZWhlbnNpb25dCi1BIGNvbXBhY3Qgd2F5IHRvIHByb2Nlc3MgYWxsIG9yIGEgc3Vic2V0IG9mIGVsZW1lbnRzIGluIGEgc2VxdWVuY2UgYW5kCi1yZXR1cm4gYSBsaXN0IHdpdGggdGhlIHJlc3VsdHMuICBcY29kZXtyZXN1bHQgPSBbIjB4XCUwMngiCi1cJSB4IGZvciB4IGluIHJhbmdlKDI1NikgaWYgeCBcJSAyID09IDBdfSBnZW5lcmF0ZXMgYSBsaXN0IG9mIHN0cmluZ3MKLWNvbnRhaW5pbmcgaGV4IG51bWJlcnMgKDB4Li4pIHRoYXQgYXJlIGV2ZW4gYW5kIGluIHRoZSByYW5nZSBmcm9tIDAgdG8gMjU1LgotVGhlIFxrZXl3b3Jke2lmfSBjbGF1c2UgaXMgb3B0aW9uYWwuICBJZiBvbWl0dGVkLCBhbGwgZWxlbWVudHMgaW4KLXt9XGNvZGV7cmFuZ2UoMjU2KX0gYXJlIHByb2Nlc3NlZC4KLQotXGluZGV4e21hcHBpbmd9Ci1caXRlbVttYXBwaW5nXQotQSBjb250YWluZXIgb2JqZWN0IChzdWNoIGFzIFxjbGFzc3tkaWN0fSkgdGhhdCBzdXBwb3J0cyBhcmJpdHJhcnkga2V5Ci1sb29rdXBzIHVzaW5nIHRoZSBzcGVjaWFsIG1ldGhvZCBcbWV0aG9ke19fZ2V0aXRlbV9fKCl9LgotCi1caW5kZXh7bWV0YWNsYXNzfQotXGl0ZW1bbWV0YWNsYXNzXQotVGhlIGNsYXNzIG9mIGEgY2xhc3MuICBDbGFzcyBkZWZpbml0aW9ucyBjcmVhdGUgYSBjbGFzcyBuYW1lLCBhIGNsYXNzCi1kaWN0aW9uYXJ5LCBhbmQgYSBsaXN0IG9mIGJhc2UgY2xhc3Nlcy4gIFRoZSBtZXRhY2xhc3MgaXMgcmVzcG9uc2libGUKLWZvciB0YWtpbmcgdGhvc2UgdGhyZWUgYXJndW1lbnRzIGFuZCBjcmVhdGluZyB0aGUgY2xhc3MuICBNb3N0IG9iamVjdAotb3JpZW50ZWQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIHByb3ZpZGUgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLiAgV2hhdAotbWFrZXMgUHl0aG9uIHNwZWNpYWwgaXMgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBjcmVhdGUgY3VzdG9tCi1tZXRhY2xhc3Nlcy4gIE1vc3QgdXNlcnMgbmV2ZXIgbmVlZCB0aGlzIHRvb2wsIGJ1dCB3aGVuIHRoZSBuZWVkCi1hcmlzZXMsIG1ldGFjbGFzc2VzIGNhbiBwcm92aWRlIHBvd2VyZnVsLCBlbGVnYW50IHNvbHV0aW9ucy4gIFRoZXkKLWhhdmUgYmVlbiB1c2VkIGZvciBsb2dnaW5nIGF0dHJpYnV0ZSBhY2Nlc3MsIGFkZGluZyB0aHJlYWQtc2FmZXR5LAotdHJhY2tpbmcgb2JqZWN0IGNyZWF0aW9uLCBpbXBsZW1lbnRpbmcgc2luZ2xldG9ucywgYW5kIG1hbnkgb3RoZXIKLXRhc2tzLgotCi1caW5kZXh7bXV0YWJsZX0KLVxpdGVtW211dGFibGVdCi1NdXRhYmxlIG9iamVjdHMgY2FuIGNoYW5nZSB0aGVpciB2YWx1ZSBidXQga2VlcCB0aGVpciBcZnVuY3Rpb257aWQoKX0uCi1TZWUgYWxzbyBcZW1waHtpbW11dGFibGV9LgotCi1caW5kZXh7bmFtZXNwYWNlfQotXGl0ZW1bbmFtZXNwYWNlXQotVGhlIHBsYWNlIHdoZXJlIGEgdmFyaWFibGUgaXMgc3RvcmVkLiAgTmFtZXNwYWNlcyBhcmUgaW1wbGVtZW50ZWQgYXMKLWRpY3Rpb25hcmllcy4gIFRoZXJlIGFyZSB0aGUgbG9jYWwsIGdsb2JhbCBhbmQgYnVpbHRpbiBuYW1lc3BhY2VzCi1hcyB3ZWxsIGFzIG5lc3RlZCBuYW1lc3BhY2VzIGluIG9iamVjdHMgKGluIG1ldGhvZHMpLiAgTmFtZXNwYWNlcyBzdXBwb3J0Ci1tb2R1bGFyaXR5IGJ5IHByZXZlbnRpbmcgbmFtaW5nIGNvbmZsaWN0cy4gIEZvciBpbnN0YW5jZSwgdGhlCi1mdW5jdGlvbnMgXGZ1bmN0aW9ue19fYnVpbHRpbl9fLm9wZW4oKX0gYW5kIFxmdW5jdGlvbntvcy5vcGVuKCl9IGFyZQotZGlzdGluZ3Vpc2hlZCBieSB0aGVpciBuYW1lc3BhY2VzLiAgTmFtZXNwYWNlcyBhbHNvIGFpZCByZWFkYWJpbGl0eQotYW5kIG1haW50YWluYWJpbGl0eSBieSBtYWtpbmcgaXQgY2xlYXIgd2hpY2ggbW9kdWxlIGltcGxlbWVudHMgYQotZnVuY3Rpb24uICBGb3IgaW5zdGFuY2UsIHdyaXRpbmcgXGZ1bmN0aW9ue3JhbmRvbS5zZWVkKCl9IG9yCi17fVxmdW5jdGlvbntpdGVydG9vbHMuaXppcCgpfSBtYWtlcyBpdCBjbGVhciB0aGF0IHRob3NlIGZ1bmN0aW9ucyBhcmUKLWltcGxlbWVudGVkIGJ5IHRoZSBcdWxpbmt7XG1vZHVsZXtyYW5kb219fXsuLi9saWIvbW9kdWxlLXJhbmRvbS5odG1sfQotYW5kIFx1bGlua3tcbW9kdWxle2l0ZXJ0b29sc319ey4uL2xpYi9tb2R1bGUtaXRlcnRvb2xzLmh0bWx9IG1vZHVsZXMKLXJlc3BlY3RpdmVseS4KLQotXGluZGV4e25lc3RlZCBzY29wZX0KLVxpdGVtW25lc3RlZCBzY29wZV0KLVRoZSBhYmlsaXR5IHRvIHJlZmVyIHRvIGEgdmFyaWFibGUgaW4gYW4gZW5jbG9zaW5nIGRlZmluaXRpb24uICBGb3IKLWluc3RhbmNlLCBhIGZ1bmN0aW9uIGRlZmluZWQgaW5zaWRlIGFub3RoZXIgZnVuY3Rpb24gY2FuIHJlZmVyIHRvCi12YXJpYWJsZXMgaW4gdGhlIG91dGVyIGZ1bmN0aW9uLiAgTm90ZSB0aGF0IG5lc3RlZCBzY29wZXMgd29yayBvbmx5Ci1mb3IgcmVmZXJlbmNlIGFuZCBub3QgZm9yIGFzc2lnbm1lbnQgd2hpY2ggd2lsbCBhbHdheXMgd3JpdGUgdG8gdGhlCi1pbm5lcm1vc3Qgc2NvcGUuICBJbiBjb250cmFzdCwgbG9jYWwgdmFyaWFibGVzIGJvdGggcmVhZCBhbmQgd3JpdGUgaW4KLXRoZSBpbm5lcm1vc3Qgc2NvcGUuICBMaWtld2lzZSwgZ2xvYmFsIHZhcmlhYmxlcyByZWFkIGFuZCB3cml0ZSB0byB0aGUKLWdsb2JhbCBuYW1lc3BhY2UuCi0KLVxpbmRleHtuZXctc3R5bGUgY2xhc3N9Ci1caXRlbVtuZXctc3R5bGUgY2xhc3NdCi1BbnkgY2xhc3MgdGhhdCBpbmhlcml0cyBmcm9tIFxjbGFzc3tvYmplY3R9LiAgVGhpcyBpbmNsdWRlcyBhbGwKLWJ1aWx0LWluIHR5cGVzIGxpa2UgXGNsYXNze2xpc3R9IGFuZCBcY2xhc3N7ZGljdH0uICBPbmx5IG5ldy1zdHlsZQotY2xhc3NlcyBjYW4gdXNlIFB5dGhvbidzIG5ld2VyLCB2ZXJzYXRpbGUgZmVhdHVyZXMgbGlrZQote31cbWV0aG9ke19fc2xvdHNfX30sIGRlc2NyaXB0b3JzLCBwcm9wZXJ0aWVzLAotXG1ldGhvZHtfX2dldGF0dHJpYnV0ZV9fKCl9LCBjbGFzcyBtZXRob2RzLCBhbmQgc3RhdGljIG1ldGhvZHMuCi0KLVxpbmRleHtQeXRob24zMDAwfQotXGl0ZW1bUHl0aG9uMzAwMF0KLUEgbXl0aGljYWwgcHl0aG9uIHJlbGVhc2UsIG5vdCByZXF1aXJlZCB0byBiZSBiYWNrd2FyZCBjb21wYXRpYmxlLCB3aXRoCi10ZWxlcGF0aGljIGludGVyZmFjZS4KLQotXGluZGV4e19fc2xvdHNfX30KLVxpdGVtW19fc2xvdHNfX10KLUEgZGVjbGFyYXRpb24gaW5zaWRlIGEgXGVtcGh7bmV3LXN0eWxlIGNsYXNzfSB0aGF0IHNhdmVzIG1lbW9yeSBieQotcHJlLWRlY2xhcmluZyBzcGFjZSBmb3IgaW5zdGFuY2UgYXR0cmlidXRlcyBhbmQgZWxpbWluYXRpbmcgaW5zdGFuY2UKLWRpY3Rpb25hcmllcy4gIFRob3VnaCBwb3B1bGFyLCB0aGUgdGVjaG5pcXVlIGlzIHNvbWV3aGF0IHRyaWNreSB0byBnZXQKLXJpZ2h0IGFuZCBpcyBiZXN0IHJlc2VydmVkIGZvciByYXJlIGNhc2VzIHdoZXJlIHRoZXJlIGFyZSBsYXJnZQotbnVtYmVycyBvZiBpbnN0YW5jZXMgaW4gYSBtZW1vcnktY3JpdGljYWwgYXBwbGljYXRpb24uCi0KLVxpbmRleHtzZXF1ZW5jZX0KLVxpdGVtW3NlcXVlbmNlXQotQW4gXGVtcGh7aXRlcmFibGV9IHdoaWNoIHN1cHBvcnRzIGVmZmljaWVudCBlbGVtZW50IGFjY2VzcyB1c2luZwotaW50ZWdlciBpbmRpY2VzIHZpYSB0aGUgXG1ldGhvZHtfX2dldGl0ZW1fXygpfSBhbmQKLXt9XG1ldGhvZHtfX2xlbl9fKCl9IHNwZWNpYWwgbWV0aG9kcy4gIFNvbWUgYnVpbHQtaW4gc2VxdWVuY2UgdHlwZXMKLWFyZSBcY2xhc3N7bGlzdH0sIFxjbGFzc3tzdHJ9LCBcY2xhc3N7dHVwbGV9LCBhbmQgXGNsYXNze3VuaWNvZGV9LgotTm90ZSB0aGF0IFxjbGFzc3tkaWN0fSBhbHNvIHN1cHBvcnRzIFxtZXRob2R7X19nZXRpdGVtX18oKX0gYW5kCi17fVxtZXRob2R7X19sZW5fXygpfSwgYnV0IGlzIGNvbnNpZGVyZWQgYSBtYXBwaW5nIHJhdGhlciB0aGFuIGEKLXNlcXVlbmNlIGJlY2F1c2UgdGhlIGxvb2t1cHMgdXNlIGFyYml0cmFyeSBcZW1waHtpbW11dGFibGV9IGtleXMKLXJhdGhlciB0aGFuIGludGVnZXJzLgotCi1caW5kZXh7WmVuIG9mIFB5dGhvbn0KLVxpdGVtW1plbiBvZiBQeXRob25dCi1MaXN0aW5nIG9mIFB5dGhvbiBkZXNpZ24gcHJpbmNpcGxlcyBhbmQgcGhpbG9zb3BoaWVzIHRoYXQgYXJlIGhlbHBmdWwKLWluIHVuZGVyc3RhbmRpbmcgYW5kIHVzaW5nIHRoZSBsYW5ndWFnZS4gIFRoZSBsaXN0aW5nIGNhbiBiZSBmb3VuZCBieQotdHlwaW5nIGBgXGNvZGV7aW1wb3J0IHRoaXN9JycgYXQgdGhlIGludGVyYWN0aXZlIHByb21wdC4KLQotXGVuZHtkZXNjcmlwdGlvbn0KZGlmZiAtLWdpdCBhL0RvYy90dXQvdHV0LnRleCBiL0RvYy90dXQvdHV0LnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM5Y2Q0Ny4uMDAwMDAwMAotLS0gYS9Eb2MvdHV0L3R1dC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw1OTM1ICswLDAgQEAKLVxkb2N1bWVudGNsYXNze21hbnVhbH0KLVx1c2VwYWNrYWdlW1QxXXtmb250ZW5jfQotXHVzZXBhY2thZ2V7dGV4dGNvbXB9Ci0KLSUgVGhpbmdzIHRvIGRvOgotJSBTaG91bGQgcmVhbGx5IG1vdmUgdGhlIFB5dGhvbiBzdGFydHVwIGZpbGUgaW5mbyB0byBhbiBhcHBlbmRpeAotCi1cdGl0bGV7UHl0aG9uIFR1dG9yaWFsfQotCi1caW5wdXR7Ym9pbGVycGxhdGV9Ci0KLVxtYWtlaW5kZXgKLQotXGJlZ2lue2RvY3VtZW50fQotCi1cbWFrZXRpdGxlCi0KLVxpZmh0bWwKLVxjaGFwdGVyKntGcm9udCBNYXR0ZXJcbGFiZWx7ZnJvbnR9fQotXGZpCi0KLVxpbnB1dHtjb3B5cmlnaHR9Ci0KLVxiZWdpbnthYnN0cmFjdH0KLQotXG5vaW5kZW50Ci1QeXRob24gaXMgYW4gZWFzeSB0byBsZWFybiwgcG93ZXJmdWwgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuICBJdCBoYXMKLWVmZmljaWVudCBoaWdoLWxldmVsIGRhdGEgc3RydWN0dXJlcyBhbmQgYSBzaW1wbGUgYnV0IGVmZmVjdGl2ZQotYXBwcm9hY2ggdG8gb2JqZWN0LW9yaWVudGVkIHByb2dyYW1taW5nLiAgUHl0aG9uJ3MgZWxlZ2FudCBzeW50YXggYW5kCi1keW5hbWljIHR5cGluZywgdG9nZXRoZXIgd2l0aCBpdHMgaW50ZXJwcmV0ZWQgbmF0dXJlLCBtYWtlIGl0IGFuIGlkZWFsIAotbGFuZ3VhZ2UgZm9yIHNjcmlwdGluZyBhbmQgcmFwaWQgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQgaW4gbWFueSBhcmVhcyAKLW9uIG1vc3QgcGxhdGZvcm1zLgotCi1UaGUgUHl0aG9uIGludGVycHJldGVyIGFuZCB0aGUgZXh0ZW5zaXZlIHN0YW5kYXJkIGxpYnJhcnkgYXJlIGZyZWVseQotYXZhaWxhYmxlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybSBmb3IgYWxsIG1ham9yIHBsYXRmb3JtcyBmcm9tIHRoZQotUHl0aG9uIFdlYiBzaXRlLCBcdXJse2h0dHA6Ly93d3cucHl0aG9uLm9yZy99LCBhbmQgbWF5IGJlIGZyZWVseQotZGlzdHJpYnV0ZWQuICBUaGUgc2FtZSBzaXRlIGFsc28gY29udGFpbnMgZGlzdHJpYnV0aW9ucyBvZiBhbmQKLXBvaW50ZXJzIHRvIG1hbnkgZnJlZSB0aGlyZCBwYXJ0eSBQeXRob24gbW9kdWxlcywgcHJvZ3JhbXMgYW5kIHRvb2xzLAotYW5kIGFkZGl0aW9uYWwgZG9jdW1lbnRhdGlvbi4KLQotVGhlIFB5dGhvbiBpbnRlcnByZXRlciBpcyBlYXNpbHkgZXh0ZW5kZWQgd2l0aCBuZXcgZnVuY3Rpb25zIGFuZCBkYXRhCi10eXBlcyBpbXBsZW1lbnRlZCBpbiBDIG9yIFxDcHB7fSAob3Igb3RoZXIgbGFuZ3VhZ2VzIGNhbGxhYmxlIGZyb20gQykuCi1QeXRob24gaXMgYWxzbyBzdWl0YWJsZSBhcyBhbiBleHRlbnNpb24gbGFuZ3VhZ2UgZm9yIGN1c3RvbWl6YWJsZQotYXBwbGljYXRpb25zLgotCi1UaGlzIHR1dG9yaWFsIGludHJvZHVjZXMgdGhlIHJlYWRlciBpbmZvcm1hbGx5IHRvIHRoZSBiYXNpYyBjb25jZXB0cwotYW5kIGZlYXR1cmVzIG9mIHRoZSBQeXRob24gbGFuZ3VhZ2UgYW5kIHN5c3RlbS4gIEl0IGhlbHBzIHRvIGhhdmUgYQotUHl0aG9uIGludGVycHJldGVyIGhhbmR5IGZvciBoYW5kcy1vbiBleHBlcmllbmNlLCBidXQgYWxsIGV4YW1wbGVzIGFyZQotc2VsZi1jb250YWluZWQsIHNvIHRoZSB0dXRvcmlhbCBjYW4gYmUgcmVhZCBvZmYtbGluZSBhcyB3ZWxsLgotCi1Gb3IgYSBkZXNjcmlwdGlvbiBvZiBzdGFuZGFyZCBvYmplY3RzIGFuZCBtb2R1bGVzLCBzZWUgdGhlCi1cY2l0ZXRpdGxlWy4uL2xpYi9saWIuaHRtbF17UHl0aG9uIExpYnJhcnkgUmVmZXJlbmNlfSBkb2N1bWVudC4gIFRoZQotXGNpdGV0aXRsZVsuLi9yZWYvcmVmLmh0bWxde1B5dGhvbiBSZWZlcmVuY2UgTWFudWFsfSBnaXZlcyBhIG1vcmUKLWZvcm1hbCBkZWZpbml0aW9uIG9mIHRoZSBsYW5ndWFnZS4gIFRvIHdyaXRlIGV4dGVuc2lvbnMgaW4gQyBvcgotXENwcCwgcmVhZCBcY2l0ZXRpdGxlWy4uL2V4dC9leHQuaHRtbF17RXh0ZW5kaW5nIGFuZCBFbWJlZGRpbmcgdGhlCi1QeXRob24gSW50ZXJwcmV0ZXJ9IGFuZCBcY2l0ZXRpdGxlWy4uL2FwaS9hcGkuaHRtbF17UHl0aG9uL0MgQVBJCi1SZWZlcmVuY2V9LiAgVGhlcmUgYXJlIGFsc28gc2V2ZXJhbCBib29rcyBjb3ZlcmluZyBQeXRob24gaW4gZGVwdGguCi0KLVRoaXMgdHV0b3JpYWwgZG9lcyBub3QgYXR0ZW1wdCB0byBiZSBjb21wcmVoZW5zaXZlIGFuZCBjb3ZlciBldmVyeQotc2luZ2xlIGZlYXR1cmUsIG9yIGV2ZW4gZXZlcnkgY29tbW9ubHkgdXNlZCBmZWF0dXJlLiAgSW5zdGVhZCwgaXQKLWludHJvZHVjZXMgbWFueSBvZiBQeXRob24ncyBtb3N0IG5vdGV3b3J0aHkgZmVhdHVyZXMsIGFuZCB3aWxsIGdpdmUKLXlvdSBhIGdvb2QgaWRlYSBvZiB0aGUgbGFuZ3VhZ2UncyBmbGF2b3IgYW5kIHN0eWxlLiAgQWZ0ZXIgcmVhZGluZyBpdCwKLXlvdSB3aWxsIGJlIGFibGUgdG8gcmVhZCBhbmQgd3JpdGUgUHl0aG9uIG1vZHVsZXMgYW5kIHByb2dyYW1zLCBhbmQKLXlvdSB3aWxsIGJlIHJlYWR5IHRvIGxlYXJuIG1vcmUgYWJvdXQgdGhlIHZhcmlvdXMgUHl0aG9uIGxpYnJhcnkKLW1vZHVsZXMgZGVzY3JpYmVkIGluIHRoZSBcY2l0ZXRpdGxlWy4uL2xpYi9saWIuaHRtbF17UHl0aG9uIExpYnJhcnkKLVJlZmVyZW5jZX0uCi0KLVxlbmR7YWJzdHJhY3R9Ci0KLVx0YWJsZW9mY29udGVudHMKLQotCi1cY2hhcHRlcntXaGV0dGluZyBZb3VyIEFwcGV0aXRlIFxsYWJlbHtpbnRyb319Ci0KLUlmIHlvdSBkbyBtdWNoIHdvcmsgb24gY29tcHV0ZXJzLCBldmVudHVhbGx5IHlvdSBmaW5kIHRoYXQgdGhlcmUncwotc29tZSB0YXNrIHlvdSdkIGxpa2UgdG8gYXV0b21hdGUuICBGb3IgZXhhbXBsZSwgeW91IG1heSB3aXNoIHRvCi1wZXJmb3JtIGEgc2VhcmNoLWFuZC1yZXBsYWNlIG92ZXIgYSBsYXJnZSBudW1iZXIgb2YgdGV4dCBmaWxlcywgb3IKLXJlbmFtZSBhbmQgcmVhcnJhbmdlIGEgYnVuY2ggb2YgcGhvdG8gZmlsZXMgaW4gYSBjb21wbGljYXRlZCB3YXkuCi1QZXJoYXBzIHlvdSdkIGxpa2UgdG8gd3JpdGUgYSBzbWFsbCBjdXN0b20gZGF0YWJhc2UsIG9yIGEgc3BlY2lhbGl6ZWQKLUdVSSBhcHBsaWNhdGlvbiwgb3IgYSBzaW1wbGUgZ2FtZS4KLQotSWYgeW91J3JlIGEgcHJvZmVzc2lvbmFsIHNvZnR3YXJlIGRldmVsb3BlciwgeW91IG1heSBoYXZlIHRvIHdvcmsgd2l0aAotc2V2ZXJhbCBDL1xDcHAvSmF2YSBsaWJyYXJpZXMgYnV0IGZpbmQgdGhlIHVzdWFsCi13cml0ZS9jb21waWxlL3Rlc3QvcmUtY29tcGlsZSBjeWNsZSBpcyB0b28gc2xvdy4gIFBlcmhhcHMgeW91J3JlCi13cml0aW5nIGEgdGVzdCBzdWl0ZSBmb3Igc3VjaCBhIGxpYnJhcnkgYW5kIGZpbmQgd3JpdGluZyB0aGUgdGVzdGluZwotY29kZSBhIHRlZGlvdXMgdGFzay4gIE9yIG1heWJlIHlvdSd2ZSB3cml0dGVuIGEgcHJvZ3JhbSB0aGF0IGNvdWxkIHVzZQotYW4gZXh0ZW5zaW9uIGxhbmd1YWdlLCBhbmQgeW91IGRvbid0IHdhbnQgdG8gZGVzaWduIGFuZCBpbXBsZW1lbnQgYQotd2hvbGUgbmV3IGxhbmd1YWdlIGZvciB5b3VyIGFwcGxpY2F0aW9uLgotCi1QeXRob24gaXMganVzdCB0aGUgbGFuZ3VhZ2UgZm9yIHlvdS4KLQotWW91IGNvdWxkIHdyaXRlIGEge1xVTklYfSBzaGVsbCBzY3JpcHQgb3IgV2luZG93cyBiYXRjaCBmaWxlcyBmb3Igc29tZQotb2YgdGhlc2UgdGFza3MsIGJ1dCBzaGVsbCBzY3JpcHRzIGFyZSBiZXN0IGF0IG1vdmluZyBhcm91bmQgZmlsZXMgYW5kCi1jaGFuZ2luZyB0ZXh0IGRhdGEsIG5vdCB3ZWxsLXN1aXRlZCBmb3IgR1VJIGFwcGxpY2F0aW9ucyBvciBnYW1lcy4KLVlvdSBjb3VsZCB3cml0ZSBhIEMve1xDcHB9L0phdmEgcHJvZ3JhbSwgYnV0IGl0IGNhbiB0YWtlIGEgbG90IG9mCi1kZXZlbG9wbWVudCB0aW1lIHRvIGdldCBldmVuIGEgZmlyc3QtZHJhZnQgcHJvZ3JhbS4gIFB5dGhvbiBpcyBzaW1wbGVyCi10byB1c2UsIGF2YWlsYWJsZSBvbiBXaW5kb3dzLCBNYWNPUyBYLCBhbmQge1xVTklYfSBvcGVyYXRpbmcgc3lzdGVtcywKLWFuZCB3aWxsIGhlbHAgeW91IGdldCB0aGUgam9iIGRvbmUgbW9yZSBxdWlja2x5LgotCi1QeXRob24gaXMgc2ltcGxlIHRvIHVzZSwgYnV0IGl0IGlzIGEgcmVhbCBwcm9ncmFtbWluZyBsYW5ndWFnZSwKLW9mZmVyaW5nIG11Y2ggbW9yZSBzdHJ1Y3R1cmUgYW5kIHN1cHBvcnQgZm9yIGxhcmdlIHByb2dyYW1zIHRoYW4gc2hlbGwKLXNjcmlwdHMgb3IgYmF0Y2ggZmlsZXMgY2FuIG9mZmVyLiAgT24gdGhlIG90aGVyIGhhbmQsIFB5dGhvbiBhbHNvCi1vZmZlcnMgbXVjaCBtb3JlIGVycm9yIGNoZWNraW5nIHRoYW4gQywgYW5kLCBiZWluZyBhCi1cZW1waHt2ZXJ5LWhpZ2gtbGV2ZWwgbGFuZ3VhZ2V9LCBpdCBoYXMgaGlnaC1sZXZlbCBkYXRhIHR5cGVzIGJ1aWx0Ci1pbiwgc3VjaCBhcyBmbGV4aWJsZSBhcnJheXMgYW5kIGRpY3Rpb25hcmllcy4gIEJlY2F1c2Ugb2YgaXRzIG1vcmUKLWdlbmVyYWwgZGF0YSB0eXBlcyBQeXRob24gaXMgYXBwbGljYWJsZSB0byBhIG11Y2ggbGFyZ2VyIHByb2JsZW0KLWRvbWFpbiB0aGFuIEF3ayBvciBldmVuIFBlcmwsIHlldCBtYW55IHRoaW5ncyBhcmUgYXQKLWxlYXN0IGFzIGVhc3kgaW4gUHl0aG9uIGFzIGluIHRob3NlIGxhbmd1YWdlcy4KLQotUHl0aG9uIGFsbG93cyB5b3UgdG8gc3BsaXQgeW91ciBwcm9ncmFtIGludG8gbW9kdWxlcyB0aGF0IGNhbiBiZQotcmV1c2VkIGluIG90aGVyIFB5dGhvbiBwcm9ncmFtcy4gIEl0IGNvbWVzIHdpdGggYSBsYXJnZSBjb2xsZWN0aW9uIG9mCi1zdGFuZGFyZCBtb2R1bGVzIHRoYXQgeW91IGNhbiB1c2UgYXMgdGhlIGJhc2lzIG9mIHlvdXIgcHJvZ3JhbXMgLS0tIG9yCi1hcyBleGFtcGxlcyB0byBzdGFydCBsZWFybmluZyB0byBwcm9ncmFtIGluIFB5dGhvbi4gIFNvbWUgb2YgdGhlc2UKLW1vZHVsZXMgcHJvdmlkZSB0aGluZ3MgbGlrZSBmaWxlIEkvTywgc3lzdGVtIGNhbGxzLAotc29ja2V0cywgYW5kIGV2ZW4gaW50ZXJmYWNlcyB0byBncmFwaGljYWwgdXNlciBpbnRlcmZhY2UgdG9vbGtpdHMgbGlrZSBUay4gIAotCi1QeXRob24gaXMgYW4gaW50ZXJwcmV0ZWQgbGFuZ3VhZ2UsIHdoaWNoIGNhbiBzYXZlIHlvdSBjb25zaWRlcmFibGUgdGltZQotZHVyaW5nIHByb2dyYW0gZGV2ZWxvcG1lbnQgYmVjYXVzZSBubyBjb21waWxhdGlvbiBhbmQgbGlua2luZyBpcwotbmVjZXNzYXJ5LiAgVGhlIGludGVycHJldGVyIGNhbiBiZSB1c2VkIGludGVyYWN0aXZlbHksIHdoaWNoIG1ha2VzIGl0Ci1lYXN5IHRvIGV4cGVyaW1lbnQgd2l0aCBmZWF0dXJlcyBvZiB0aGUgbGFuZ3VhZ2UsIHRvIHdyaXRlIHRocm93LWF3YXkKLXByb2dyYW1zLCBvciB0byB0ZXN0IGZ1bmN0aW9ucyBkdXJpbmcgYm90dG9tLXVwIHByb2dyYW0gZGV2ZWxvcG1lbnQuCi1JdCBpcyBhbHNvIGEgaGFuZHkgZGVzayBjYWxjdWxhdG9yLgotCi1QeXRob24gZW5hYmxlcyBwcm9ncmFtcyB0byBiZSB3cml0dGVuIGNvbXBhY3RseSBhbmQgcmVhZGFibHkuICBQcm9ncmFtcwotd3JpdHRlbiBpbiBQeXRob24gYXJlIHR5cGljYWxseSBtdWNoIHNob3J0ZXIgdGhhbiBlcXVpdmFsZW50IEMsIAotXENwcHt9LCBvciBKYXZhIHByb2dyYW1zLCBmb3Igc2V2ZXJhbCByZWFzb25zOgotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbQotdGhlIGhpZ2gtbGV2ZWwgZGF0YSB0eXBlcyBhbGxvdyB5b3UgdG8gZXhwcmVzcyBjb21wbGV4IG9wZXJhdGlvbnMgaW4gYQotc2luZ2xlIHN0YXRlbWVudDsKLVxpdGVtCi1zdGF0ZW1lbnQgZ3JvdXBpbmcgaXMgZG9uZSBieSBpbmRlbnRhdGlvbiBpbnN0ZWFkIG9mIGJlZ2lubmluZyBhbmQgZW5kaW5nCi1icmFja2V0czsKLVxpdGVtCi1ubyB2YXJpYWJsZSBvciBhcmd1bWVudCBkZWNsYXJhdGlvbnMgYXJlIG5lY2Vzc2FyeS4KLVxlbmR7aXRlbWl6ZX0KLQotUHl0aG9uIGlzIFxlbXBoe2V4dGVuc2libGV9OiBpZiB5b3Uga25vdyBob3cgdG8gcHJvZ3JhbSBpbiBDIGl0IGlzIGVhc3kKLXRvIGFkZCBhIG5ldyBidWlsdC1pbiBmdW5jdGlvbiBvciBtb2R1bGUgdG8gdGhlIGludGVycHJldGVyLCBlaXRoZXIgdG8KLXBlcmZvcm0gY3JpdGljYWwgb3BlcmF0aW9ucyBhdCBtYXhpbXVtIHNwZWVkLCBvciB0byBsaW5rIFB5dGhvbgotcHJvZ3JhbXMgdG8gbGlicmFyaWVzIHRoYXQgbWF5IG9ubHkgYmUgYXZhaWxhYmxlIGluIGJpbmFyeSBmb3JtIChzdWNoCi1hcyBhIHZlbmRvci1zcGVjaWZpYyBncmFwaGljcyBsaWJyYXJ5KS4gIE9uY2UgeW91IGFyZSByZWFsbHkgaG9va2VkLAoteW91IGNhbiBsaW5rIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgaW50byBhbiBhcHBsaWNhdGlvbiB3cml0dGVuIGluIEMKLWFuZCB1c2UgaXQgYXMgYW4gZXh0ZW5zaW9uIG9yIGNvbW1hbmQgbGFuZ3VhZ2UgZm9yIHRoYXQgYXBwbGljYXRpb24uCi0KLUJ5IHRoZSB3YXksIHRoZSBsYW5ndWFnZSBpcyBuYW1lZCBhZnRlciB0aGUgQkJDIHNob3cgYGBNb250eSBQeXRob24ncwotRmx5aW5nIENpcmN1cycnIGFuZCBoYXMgbm90aGluZyB0byBkbyB3aXRoIG5hc3R5IHJlcHRpbGVzLiAgTWFraW5nCi1yZWZlcmVuY2VzIHRvIE1vbnR5IFB5dGhvbiBza2l0cyBpbiBkb2N1bWVudGF0aW9uIGlzIG5vdCBvbmx5IGFsbG93ZWQsCi1pdCBpcyBlbmNvdXJhZ2VkIQotCi0lXHNlY3Rpb257V2hlcmUgRnJvbSBIZXJlIFxsYWJlbHt3aGVyZX19Ci0KLU5vdyB0aGF0IHlvdSBhcmUgYWxsIGV4Y2l0ZWQgYWJvdXQgUHl0aG9uLCB5b3UnbGwgd2FudCB0byBleGFtaW5lIGl0Ci1pbiBzb21lIG1vcmUgZGV0YWlsLiAgU2luY2UgdGhlIGJlc3Qgd2F5IHRvIGxlYXJuIGEgbGFuZ3VhZ2UgaXMKLXRvIHVzZSBpdCwgdGhlIHR1dG9yaWFsIGludml0ZXMgeW91IHRvIHBsYXkgd2l0aCB0aGUgUHl0aG9uIGludGVycHJldGVyCi1hcyB5b3UgcmVhZC4KLQotSW4gdGhlIG5leHQgY2hhcHRlciwgdGhlIG1lY2hhbmljcyBvZiB1c2luZyB0aGUgaW50ZXJwcmV0ZXIgYXJlCi1leHBsYWluZWQuICBUaGlzIGlzIHJhdGhlciBtdW5kYW5lIGluZm9ybWF0aW9uLCBidXQgZXNzZW50aWFsIGZvcgotdHJ5aW5nIG91dCB0aGUgZXhhbXBsZXMgc2hvd24gbGF0ZXIuCi0KLVRoZSByZXN0IG9mIHRoZSB0dXRvcmlhbCBpbnRyb2R1Y2VzIHZhcmlvdXMgZmVhdHVyZXMgb2YgdGhlIFB5dGhvbgotbGFuZ3VhZ2UgYW5kIHN5c3RlbSB0aHJvdWdoIGV4YW1wbGVzLCBiZWdpbm5pbmcgd2l0aCBzaW1wbGUKLWV4cHJlc3Npb25zLCBzdGF0ZW1lbnRzIGFuZCBkYXRhIHR5cGVzLCB0aHJvdWdoIGZ1bmN0aW9ucyBhbmQgbW9kdWxlcywKLWFuZCBmaW5hbGx5IHRvdWNoaW5nIHVwb24gYWR2YW5jZWQgY29uY2VwdHMgbGlrZSBleGNlcHRpb25zCi1hbmQgdXNlci1kZWZpbmVkIGNsYXNzZXMuCi0KLVxjaGFwdGVye1VzaW5nIHRoZSBQeXRob24gSW50ZXJwcmV0ZXIgXGxhYmVse3VzaW5nfX0KLQotXHNlY3Rpb257SW52b2tpbmcgdGhlIEludGVycHJldGVyIFxsYWJlbHtpbnZva2luZ319Ci0KLVRoZSBQeXRob24gaW50ZXJwcmV0ZXIgaXMgdXN1YWxseSBpbnN0YWxsZWQgYXMKLVxmaWxley91c3IvbG9jYWwvYmluL3B5dGhvbn0gb24gdGhvc2UgbWFjaGluZXMgd2hlcmUgaXQgaXMgYXZhaWxhYmxlOwotcHV0dGluZyBcZmlsZXsvdXNyL2xvY2FsL2Jpbn0gaW4geW91ciBcVU5JWHt9IHNoZWxsJ3Mgc2VhcmNoIHBhdGgKLW1ha2VzIGl0IHBvc3NpYmxlIHRvIHN0YXJ0IGl0IGJ5IHR5cGluZyB0aGUgY29tbWFuZAotCi1cYmVnaW57dmVyYmF0aW19Ci1weXRob24KLVxlbmR7dmVyYmF0aW19Ci0KLXRvIHRoZSBzaGVsbC4gIFNpbmNlIHRoZSBjaG9pY2Ugb2YgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgaW50ZXJwcmV0ZXIKLWxpdmVzIGlzIGFuIGluc3RhbGxhdGlvbiBvcHRpb24sIG90aGVyIHBsYWNlcyBhcmUgcG9zc2libGU7IGNoZWNrIHdpdGgKLXlvdXIgbG9jYWwgUHl0aG9uIGd1cnUgb3Igc3lzdGVtIGFkbWluaXN0cmF0b3IuICAoRS5nLiwKLVxmaWxley91c3IvbG9jYWwvcHl0aG9ufSBpcyBhIHBvcHVsYXIgYWx0ZXJuYXRpdmUgbG9jYXRpb24uKQotCi1PbiBXaW5kb3dzIG1hY2hpbmVzLCB0aGUgUHl0aG9uIGluc3RhbGxhdGlvbiBpcyB1c3VhbGx5IHBsYWNlZCBpbgotXGZpbGV7QzpcZSBQeXRob24zMH0sIHRob3VnaCB5b3UgY2FuIGNoYW5nZSB0aGlzIHdoZW4geW91J3JlIHJ1bm5pbmcKLXRoZSBpbnN0YWxsZXIuICBUbyBhZGQgdGhpcyBkaXJlY3RvcnkgdG8geW91ciBwYXRoLCAKLXlvdSBjYW4gdHlwZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQgaW50byB0aGUgY29tbWFuZCBwcm9tcHQgaW4gYSBET1MgYm94OgotCi1cYmVnaW57dmVyYmF0aW19Ci1zZXQgcGF0aD0lcGF0aCU7QzpccHl0aG9uMzAKLVxlbmR7dmVyYmF0aW19Ci0KLQotVHlwaW5nIGFuIGVuZC1vZi1maWxlIGNoYXJhY3RlciAoXGtiZHtDb250cm9sLUR9IG9uIFxVTklYLAotXGtiZHtDb250cm9sLVp9IG9uIFdpbmRvd3MpIGF0IHRoZSBwcmltYXJ5IHByb21wdCBjYXVzZXMgdGhlCi1pbnRlcnByZXRlciB0byBleGl0IHdpdGggYSB6ZXJvIGV4aXQgc3RhdHVzLiAgSWYgdGhhdCBkb2Vzbid0IHdvcmssCi15b3UgY2FuIGV4aXQgdGhlIGludGVycHJldGVyIGJ5IHR5cGluZyB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOgotXHNhbXB7aW1wb3J0IHN5czsgc3lzLmV4aXQoKX0uCi0KLVRoZSBpbnRlcnByZXRlcidzIGxpbmUtZWRpdGluZyBmZWF0dXJlcyB1c3VhbGx5IGFyZW4ndCB2ZXJ5Ci1zb3BoaXN0aWNhdGVkLiAgT24gXFVOSVgsIHdob2V2ZXIgaW5zdGFsbGVkIHRoZSBpbnRlcnByZXRlciBtYXkgaGF2ZQotZW5hYmxlZCBzdXBwb3J0IGZvciB0aGUgR05VIHJlYWRsaW5lIGxpYnJhcnksIHdoaWNoIGFkZHMgbW9yZQotZWxhYm9yYXRlIGludGVyYWN0aXZlIGVkaXRpbmcgYW5kIGhpc3RvcnkgZmVhdHVyZXMuIFBlcmhhcHMgdGhlCi1xdWlja2VzdCBjaGVjayB0byBzZWUgd2hldGhlciBjb21tYW5kIGxpbmUgZWRpdGluZyBpcyBzdXBwb3J0ZWQgaXMKLXR5cGluZyBDb250cm9sLVAgdG8gdGhlIGZpcnN0IFB5dGhvbiBwcm9tcHQgeW91IGdldC4gIElmIGl0IGJlZXBzLCB5b3UKLWhhdmUgY29tbWFuZCBsaW5lIGVkaXRpbmc7IHNlZSBBcHBlbmRpeCBccmVme2ludGVyYWN0aW5nfSBmb3IgYW4KLWludHJvZHVjdGlvbiB0byB0aGUga2V5cy4gIElmIG5vdGhpbmcgYXBwZWFycyB0byBoYXBwZW4sIG9yIGlmCi1cY29kZXtcXlB9IGlzIGVjaG9lZCwgY29tbWFuZCBsaW5lIGVkaXRpbmcgaXNuJ3QgYXZhaWxhYmxlOyB5b3UnbGwKLW9ubHkgYmUgYWJsZSB0byB1c2UgYmFja3NwYWNlIHRvIHJlbW92ZSBjaGFyYWN0ZXJzIGZyb20gdGhlIGN1cnJlbnQKLWxpbmUuCi0KLVRoZSBpbnRlcnByZXRlciBvcGVyYXRlcyBzb21ld2hhdCBsaWtlIHRoZSBcVU5JWHt9IHNoZWxsOiB3aGVuIGNhbGxlZAotd2l0aCBzdGFuZGFyZCBpbnB1dCBjb25uZWN0ZWQgdG8gYSB0dHkgZGV2aWNlLCBpdCByZWFkcyBhbmQgZXhlY3V0ZXMKLWNvbW1hbmRzIGludGVyYWN0aXZlbHk7IHdoZW4gY2FsbGVkIHdpdGggYSBmaWxlIG5hbWUgYXJndW1lbnQgb3Igd2l0aAotYSBmaWxlIGFzIHN0YW5kYXJkIGlucHV0LCBpdCByZWFkcyBhbmQgZXhlY3V0ZXMgYSBcZW1waHtzY3JpcHR9IGZyb20KLXRoYXQgZmlsZS4gCi0KLUEgc2Vjb25kIHdheSBvZiBzdGFydGluZyB0aGUgaW50ZXJwcmV0ZXIgaXMKLVxzYW1we1xwcm9ncmFte3B5dGhvbn0gXHByb2dyYW1vcHR7LWN9IFx2YXJ7Y29tbWFuZH0gW2FyZ10gLi4ufSwgd2hpY2gKLWV4ZWN1dGVzIHRoZSBzdGF0ZW1lbnQocykgaW4gXHZhcntjb21tYW5kfSwgYW5hbG9nb3VzIHRvIHRoZSBzaGVsbCdzCi1ccHJvZ3JhbW9wdHstY30gb3B0aW9uLiAgU2luY2UgUHl0aG9uIHN0YXRlbWVudHMgb2Z0ZW4gY29udGFpbiBzcGFjZXMKLW9yIG90aGVyIGNoYXJhY3RlcnMgdGhhdCBhcmUgc3BlY2lhbCB0byB0aGUgc2hlbGwsIGl0IGlzIGJlc3QgdG8gcXVvdGUgCi1cdmFye2NvbW1hbmR9IGluIGl0cyBlbnRpcmV0eSB3aXRoIGRvdWJsZSBxdW90ZXMuCi0KLVNvbWUgUHl0aG9uIG1vZHVsZXMgYXJlIGFsc28gdXNlZnVsIGFzIHNjcmlwdHMuICBUaGVzZSBjYW4gYmUgaW52b2tlZCB1c2luZwotXHNhbXB7XHByb2dyYW17cHl0aG9ufSBccHJvZ3JhbW9wdHstbX0gXHZhcnttb2R1bGV9IFthcmddIC4uLn0sIHdoaWNoCi1leGVjdXRlcyB0aGUgc291cmNlIGZpbGUgZm9yIFx2YXJ7bW9kdWxlfSBhcyBpZiB5b3UgaGFkIHNwZWxsZWQgb3V0IGl0cwotZnVsbCBuYW1lIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0KLU5vdGUgdGhhdCB0aGVyZSBpcyBhIGRpZmZlcmVuY2UgYmV0d2VlbiBcc2FtcHtweXRob24gZmlsZX0gYW5kCi1cc2FtcHtweXRob24gPGZpbGV9LiAgSW4gdGhlIGxhdHRlciBjYXNlLCBpbnB1dCByZXF1ZXN0cyBmcm9tIHRoZQotcHJvZ3JhbSwgc3VjaCBhcyBjYWxsaW5nIFxjb2Rle3N5cy5zdGRpbi5yZWFkKCl9LCBhcmUKLXNhdGlzZmllZCBmcm9tIFxlbXBoe2ZpbGV9LiAgU2luY2UgdGhpcyBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gcmVhZAotdW50aWwgdGhlIGVuZCBieSB0aGUgcGFyc2VyIGJlZm9yZSB0aGUgcHJvZ3JhbSBzdGFydHMgZXhlY3V0aW5nLCB0aGUKLXByb2dyYW0gd2lsbCBlbmNvdW50ZXIgZW5kLW9mLWZpbGUgaW1tZWRpYXRlbHkuICBJbiB0aGUgZm9ybWVyIGNhc2UKLSh3aGljaCBpcyB1c3VhbGx5IHdoYXQgeW91IHdhbnQpIHRoZXkgYXJlIHNhdGlzZmllZCBmcm9tIHdoYXRldmVyIGZpbGUKLW9yIGRldmljZSBpcyBjb25uZWN0ZWQgdG8gc3RhbmRhcmQgaW5wdXQgb2YgdGhlIFB5dGhvbiBpbnRlcnByZXRlci4KLQotV2hlbiBhIHNjcmlwdCBmaWxlIGlzIHVzZWQsIGl0IGlzIHNvbWV0aW1lcyB1c2VmdWwgdG8gYmUgYWJsZSB0byBydW4KLXRoZSBzY3JpcHQgYW5kIGVudGVyIGludGVyYWN0aXZlIG1vZGUgYWZ0ZXJ3YXJkcy4gIFRoaXMgY2FuIGJlIGRvbmUgYnkKLXBhc3NpbmcgXHByb2dyYW1vcHR7LWl9IGJlZm9yZSB0aGUgc2NyaXB0LiAgKFRoaXMgZG9lcyBub3Qgd29yayBpZiB0aGUKLXNjcmlwdCBpcyByZWFkIGZyb20gc3RhbmRhcmQgaW5wdXQsIGZvciB0aGUgc2FtZSByZWFzb24gYXMgZXhwbGFpbmVkCi1pbiB0aGUgcHJldmlvdXMgcGFyYWdyYXBoLikKLQotXHN1YnNlY3Rpb257QXJndW1lbnQgUGFzc2luZyBcbGFiZWx7YXJnUGFzc2luZ319Ci0KLVdoZW4ga25vd24gdG8gdGhlIGludGVycHJldGVyLCB0aGUgc2NyaXB0IG5hbWUgYW5kIGFkZGl0aW9uYWwKLWFyZ3VtZW50cyB0aGVyZWFmdGVyIGFyZSBwYXNzZWQgdG8gdGhlIHNjcmlwdCBpbiB0aGUgdmFyaWFibGUKLVxjb2Rle3N5cy5hcmd2fSwgd2hpY2ggaXMgYSBsaXN0IG9mIHN0cmluZ3MuICBJdHMgbGVuZ3RoIGlzIGF0IGxlYXN0Ci1vbmU7IHdoZW4gbm8gc2NyaXB0IGFuZCBubyBhcmd1bWVudHMgYXJlIGdpdmVuLCBcY29kZXtzeXMuYXJndlswXX0gaXMKLWFuIGVtcHR5IHN0cmluZy4gIFdoZW4gdGhlIHNjcmlwdCBuYW1lIGlzIGdpdmVuIGFzIFxjb2RleyctJ30gKG1lYW5pbmcgCi1zdGFuZGFyZCBpbnB1dCksIFxjb2Rle3N5cy5hcmd2WzBdfSBpcyBzZXQgdG8gXGNvZGV7Jy0nfS4gIFdoZW4KLVxwcm9ncmFtb3B0ey1jfSBcdmFye2NvbW1hbmR9IGlzIHVzZWQsIFxjb2Rle3N5cy5hcmd2WzBdfSBpcyBzZXQgdG8KLVxjb2RleyctYyd9LiAgV2hlbiBccHJvZ3JhbW9wdHstbX0gXHZhcnttb2R1bGV9IGlzIHVzZWQsIFxjb2Rle3N5cy5hcmd2WzBdfSAKLWlzIHNldCB0byB0aGUgZnVsbCBuYW1lIG9mIHRoZSBsb2NhdGVkIG1vZHVsZS4gIE9wdGlvbnMgZm91bmQgYWZ0ZXIgCi1ccHJvZ3JhbW9wdHstY30gXHZhcntjb21tYW5kfSBvciBccHJvZ3JhbW9wdHstbX0gXHZhcnttb2R1bGV9IGFyZSBub3QgY29uc3VtZWQgCi1ieSB0aGUgUHl0aG9uIGludGVycHJldGVyJ3Mgb3B0aW9uIHByb2Nlc3NpbmcgYnV0IGxlZnQgaW4gXGNvZGV7c3lzLmFyZ3Z9IGZvciAKLXRoZSBjb21tYW5kIG9yIG1vZHVsZSB0byBoYW5kbGUuCi0KLVxzdWJzZWN0aW9ue0ludGVyYWN0aXZlIE1vZGUgXGxhYmVse2ludGVyYWN0aXZlfX0KLQotV2hlbiBjb21tYW5kcyBhcmUgcmVhZCBmcm9tIGEgdHR5LCB0aGUgaW50ZXJwcmV0ZXIgaXMgc2FpZCB0byBiZSBpbgotXGVtcGh7aW50ZXJhY3RpdmUgbW9kZX0uICBJbiB0aGlzIG1vZGUgaXQgcHJvbXB0cyBmb3IgdGhlIG5leHQgY29tbWFuZAotd2l0aCB0aGUgXGVtcGh7cHJpbWFyeSBwcm9tcHR9LCB1c3VhbGx5IHRocmVlIGdyZWF0ZXItdGhhbiBzaWducwotKFxzYW1wez4+Pn59KTsgZm9yIGNvbnRpbnVhdGlvbiBsaW5lcyBpdCBwcm9tcHRzIHdpdGggdGhlCi1cZW1waHtzZWNvbmRhcnkgcHJvbXB0fSwgYnkgZGVmYXVsdCB0aHJlZSBkb3RzIChcc2FtcHsuLi5+fSkuCi1UaGUgaW50ZXJwcmV0ZXIgcHJpbnRzIGEgd2VsY29tZSBtZXNzYWdlIHN0YXRpbmcgaXRzIHZlcnNpb24gbnVtYmVyCi1hbmQgYSBjb3B5cmlnaHQgbm90aWNlIGJlZm9yZSBwcmludGluZyB0aGUgZmlyc3QgcHJvbXB0OgotCi1cYmVnaW57dmVyYmF0aW19Ci1weXRob24KLVB5dGhvbiAxLjUuMmIyICgjMSwgRmViIDI4IDE5OTksIDAwOjAyOjA2KSAgW0dDQyAyLjguMV0gb24gc3Vub3M1Ci1Db3B5cmlnaHQgMTk5MS0xOTk1IFN0aWNodGluZyBNYXRoZW1hdGlzY2ggQ2VudHJ1bSwgQW1zdGVyZGFtCi0+Pj4KLVxlbmR7dmVyYmF0aW19Ci0KLUNvbnRpbnVhdGlvbiBsaW5lcyBhcmUgbmVlZGVkIHdoZW4gZW50ZXJpbmcgYSBtdWx0aS1saW5lIGNvbnN0cnVjdC4KLUFzIGFuIGV4YW1wbGUsIHRha2UgYSBsb29rIGF0IHRoaXMgXGtleXdvcmR7aWZ9IHN0YXRlbWVudDoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHRoZV93b3JsZF9pc19mbGF0ID0gMQotPj4+IGlmIHRoZV93b3JsZF9pc19mbGF0OgotLi4uICAgICBwcmludCAiQmUgY2FyZWZ1bCBub3QgdG8gZmFsbCBvZmYhIgotLi4uIAotQmUgY2FyZWZ1bCBub3QgdG8gZmFsbCBvZmYhCi1cZW5ke3ZlcmJhdGltfQotCi0KLVxzZWN0aW9ue1RoZSBJbnRlcnByZXRlciBhbmQgSXRzIEVudmlyb25tZW50IFxsYWJlbHtpbnRlcnB9fQotCi1cc3Vic2VjdGlvbntFcnJvciBIYW5kbGluZyBcbGFiZWx7ZXJyb3J9fQotCi1XaGVuIGFuIGVycm9yIG9jY3VycywgdGhlIGludGVycHJldGVyIHByaW50cyBhbiBlcnJvcgotbWVzc2FnZSBhbmQgYSBzdGFjayB0cmFjZS4gIEluIGludGVyYWN0aXZlIG1vZGUsIGl0IHRoZW4gcmV0dXJucyB0bwotdGhlIHByaW1hcnkgcHJvbXB0OyB3aGVuIGlucHV0IGNhbWUgZnJvbSBhIGZpbGUsIGl0IGV4aXRzIHdpdGggYQotbm9uemVybyBleGl0IHN0YXR1cyBhZnRlciBwcmludGluZwotdGhlIHN0YWNrIHRyYWNlLiAgKEV4Y2VwdGlvbnMgaGFuZGxlZCBieSBhbiBca2V5d29yZHtleGNlcHR9IGNsYXVzZSBpbiBhCi1ca2V5d29yZHt0cnl9IHN0YXRlbWVudCBhcmUgbm90IGVycm9ycyBpbiB0aGlzIGNvbnRleHQuKSAgU29tZSBlcnJvcnMgYXJlCi11bmNvbmRpdGlvbmFsbHkgZmF0YWwgYW5kIGNhdXNlIGFuIGV4aXQgd2l0aCBhIG5vbnplcm8gZXhpdDsgdGhpcwotYXBwbGllcyB0byBpbnRlcm5hbCBpbmNvbnNpc3RlbmNpZXMgYW5kIHNvbWUgY2FzZXMgb2YgcnVubmluZyBvdXQgb2YKLW1lbW9yeS4gIEFsbCBlcnJvciBtZXNzYWdlcyBhcmUgd3JpdHRlbiB0byB0aGUgc3RhbmRhcmQgZXJyb3Igc3RyZWFtOwotbm9ybWFsIG91dHB1dCBmcm9tIGV4ZWN1dGVkIGNvbW1hbmRzIGlzIHdyaXR0ZW4gdG8gc3RhbmRhcmQKLW91dHB1dC4KLQotVHlwaW5nIHRoZSBpbnRlcnJ1cHQgY2hhcmFjdGVyICh1c3VhbGx5IENvbnRyb2wtQyBvciBERUwpIHRvIHRoZQotcHJpbWFyeSBvciBzZWNvbmRhcnkgcHJvbXB0IGNhbmNlbHMgdGhlIGlucHV0IGFuZCByZXR1cm5zIHRvIHRoZQotcHJpbWFyeSBwcm9tcHQuXGZvb3Rub3RlewotICAgICAgICBBIHByb2JsZW0gd2l0aCB0aGUgR05VIFJlYWRsaW5lIHBhY2thZ2UgbWF5IHByZXZlbnQgdGhpcy4KLX0KLVR5cGluZyBhbiBpbnRlcnJ1cHQgd2hpbGUgYSBjb21tYW5kIGlzIGV4ZWN1dGluZyByYWlzZXMgdGhlCi1cZXhjZXB0aW9ue0tleWJvYXJkSW50ZXJydXB0fSBleGNlcHRpb24sIHdoaWNoIG1heSBiZSBoYW5kbGVkIGJ5IGEKLVxrZXl3b3Jke3RyeX0gc3RhdGVtZW50LgotCi1cc3Vic2VjdGlvbntFeGVjdXRhYmxlIFB5dGhvbiBTY3JpcHRzIFxsYWJlbHtzY3JpcHRzfX0KLQotT24gQlNEJ2lzaCBcVU5JWHt9IHN5c3RlbXMsIFB5dGhvbiBzY3JpcHRzIGNhbiBiZSBtYWRlIGRpcmVjdGx5Ci1leGVjdXRhYmxlLCBsaWtlIHNoZWxsIHNjcmlwdHMsIGJ5IHB1dHRpbmcgdGhlIGxpbmUKLQotXGJlZ2lue3ZlcmJhdGltfQotIyEgL3Vzci9iaW4vZW52IHB5dGhvbgotXGVuZHt2ZXJiYXRpbX0KLQotKGFzc3VtaW5nIHRoYXQgdGhlIGludGVycHJldGVyIGlzIG9uIHRoZSB1c2VyJ3MgXGVudnZhcntQQVRIfSkgYXQgdGhlCi1iZWdpbm5pbmcgb2YgdGhlIHNjcmlwdCBhbmQgZ2l2aW5nIHRoZSBmaWxlIGFuIGV4ZWN1dGFibGUgbW9kZS4gIFRoZQotXHNhbXB7XCMhfSBtdXN0IGJlIHRoZSBmaXJzdCB0d28gY2hhcmFjdGVycyBvZiB0aGUgZmlsZS4gIE9uIHNvbWUKLXBsYXRmb3JtcywgdGhpcyBmaXJzdCBsaW5lIG11c3QgZW5kIHdpdGggYSBcVU5JWC1zdHlsZSBsaW5lIGVuZGluZwotKFxjaGFyYWN0ZXJ7XGUgbn0pLCBub3QgYSBNYWMgT1MgKFxjaGFyYWN0ZXJ7XGUgcn0pIG9yIFdpbmRvd3MKLShcY2hhcmFjdGVye1xlIHJcZSBufSkgbGluZSBlbmRpbmcuICBOb3RlIHRoYXQKLXRoZSBoYXNoLCBvciBwb3VuZCwgY2hhcmFjdGVyLCBcY2hhcmFjdGVye1wjfSwgaXMgdXNlZCB0byBzdGFydCBhCi1jb21tZW50IGluIFB5dGhvbi4KLQotVGhlIHNjcmlwdCBjYW4gYmUgZ2l2ZW4gYW4gZXhlY3V0YWJsZSBtb2RlLCBvciBwZXJtaXNzaW9uLCB1c2luZyB0aGUKLVxwcm9ncmFte2NobW9kfSBjb21tYW5kOgotCi1cYmVnaW57dmVyYmF0aW19Ci0kIGNobW9kICt4IG15c2NyaXB0LnB5Ci1cZW5ke3ZlcmJhdGltfSAlICQgPC0tIGJvdyB0byBmb250LWxvY2sKLQotCi1cc3Vic2VjdGlvbntTb3VyY2UgQ29kZSBFbmNvZGluZ30KLQotSXQgaXMgcG9zc2libGUgdG8gdXNlIGVuY29kaW5ncyBkaWZmZXJlbnQgdGhhbiBcQVNDSUl7fSBpbiBQeXRob24gc291cmNlCi1maWxlcy4gVGhlIGJlc3Qgd2F5IHRvIGRvIGl0IGlzIHRvIHB1dCBvbmUgbW9yZSBzcGVjaWFsIGNvbW1lbnQgbGluZQotcmlnaHQgYWZ0ZXIgdGhlIFxjb2Rle1wjIX0gbGluZSB0byBkZWZpbmUgdGhlIHNvdXJjZSBmaWxlIGVuY29kaW5nOgotCi1cYmVnaW57YWxsdHR9Ci0jIC0qLSBjb2Rpbmc6IFx2YXJ7ZW5jb2Rpbmd9IC0qLSAKLVxlbmR7YWxsdHR9Ci0KLVdpdGggdGhhdCBkZWNsYXJhdGlvbiwgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHNvdXJjZSBmaWxlIHdpbGwgYmUgdHJlYXRlZCBhcwotaGF2aW5nIHRoZSBlbmNvZGluZyBcdmFye2VuY29kaW5nfSwgYW5kIGl0IHdpbGwgYmUKLXBvc3NpYmxlIHRvIGRpcmVjdGx5IHdyaXRlIFVuaWNvZGUgc3RyaW5nIGxpdGVyYWxzIGluIHRoZSBzZWxlY3RlZAotZW5jb2RpbmcuICBUaGUgbGlzdCBvZiBwb3NzaWJsZSBlbmNvZGluZ3MgY2FuIGJlIGZvdW5kIGluIHRoZQotXGNpdGV0aXRsZVsuLi9saWIvbGliLmh0bWxde1B5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZX0sIGluIHRoZSBzZWN0aW9uCi1vbiBcdWxpbmt7XG1vZHVsZXtjb2RlY3N9fXsuLi9saWIvbW9kdWxlLWNvZGVjcy5odG1sfS4KLQotRm9yIGV4YW1wbGUsIHRvIHdyaXRlIFVuaWNvZGUgbGl0ZXJhbHMgaW5jbHVkaW5nIHRoZSBFdXJvIGN1cnJlbmN5Ci1zeW1ib2wsIHRoZSBJU08tODg1OS0xNSBlbmNvZGluZyBjYW4gYmUgdXNlZCwgd2l0aCB0aGUgRXVybyBzeW1ib2wKLWhhdmluZyB0aGUgb3JkaW5hbCB2YWx1ZSAxNjQuICBUaGlzIHNjcmlwdCB3aWxsIHByaW50IHRoZSB2YWx1ZSA4MzY0Ci0odGhlIFVuaWNvZGUgY29kZXBvaW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIEV1cm8gc3ltYm9sKSBhbmQgdGhlbgotZXhpdDoKLQotXGJlZ2lue2FsbHR0fQotIyAtKi0gY29kaW5nOiBpc28tODg1OS0xNSAtKi0KLQotY3VycmVuY3kgPSB1Ilx0ZXh0ZXVybyIKLXByaW50IG9yZChjdXJyZW5jeSkKLVxlbmR7YWxsdHR9Ci0KLUlmIHlvdXIgZWRpdG9yIHN1cHBvcnRzIHNhdmluZyBmaWxlcyBhcyBcY29kZXtVVEYtOH0gd2l0aCBhIFVURi04Ci1cZW1waHtieXRlIG9yZGVyIG1hcmt9IChha2EgQk9NKSwgeW91IGNhbiB1c2UgdGhhdCBpbnN0ZWFkIG9mIGFuCi1lbmNvZGluZyBkZWNsYXJhdGlvbi4gSURMRSBzdXBwb3J0cyB0aGlzIGNhcGFiaWxpdHkgaWYKLVxjb2Rle09wdGlvbnMvR2VuZXJhbC9EZWZhdWx0IFNvdXJjZSBFbmNvZGluZy9VVEYtOH0gaXMgc2V0LiBOb3RpY2UKLXRoYXQgdGhpcyBzaWduYXR1cmUgaXMgbm90IHVuZGVyc3Rvb2QgaW4gb2xkZXIgUHl0aG9uIHJlbGVhc2VzICgyLjIKLWFuZCBlYXJsaWVyKSwgYW5kIGFsc28gbm90IHVuZGVyc3Rvb2QgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0gZm9yCi1zY3JpcHQgZmlsZXMgd2l0aCBcY29kZXtcIyF9IGxpbmVzIChvbmx5IHVzZWQgb24gXFVOSVh7fSBzeXN0ZW1zKS4KLQotQnkgdXNpbmcgVVRGLTggKGVpdGhlciB0aHJvdWdoIHRoZSBzaWduYXR1cmUgb3IgYW4gZW5jb2RpbmcKLWRlY2xhcmF0aW9uKSwgY2hhcmFjdGVycyBvZiBtb3N0IGxhbmd1YWdlcyBpbiB0aGUgd29ybGQgY2FuIGJlIHVzZWQKLXNpbXVsdGFuZW91c2x5IGluIHN0cmluZyBsaXRlcmFscyBhbmQgY29tbWVudHMuICBVc2luZyBub24tXEFTQ0lJe30KLWNoYXJhY3RlcnMgaW4gaWRlbnRpZmllcnMgaXMgbm90IHN1cHBvcnRlZC4gVG8gZGlzcGxheSBhbGwgdGhlc2UKLWNoYXJhY3RlcnMgcHJvcGVybHksIHlvdXIgZWRpdG9yIG11c3QgcmVjb2duaXplIHRoYXQgdGhlIGZpbGUgaXMKLVVURi04LCBhbmQgaXQgbXVzdCB1c2UgYSBmb250IHRoYXQgc3VwcG9ydHMgYWxsIHRoZSBjaGFyYWN0ZXJzIGluIHRoZQotZmlsZS4KLQotXHN1YnNlY3Rpb257VGhlIEludGVyYWN0aXZlIFN0YXJ0dXAgRmlsZSBcbGFiZWx7c3RhcnR1cH19Ci0KLSUgWFhYIFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGR1bXBlZCBpbiBhbiBhcHBlbmRpeCwgc2luY2UgbW9zdCBwZW9wbGUKLSUgZG9uJ3QgdXNlIFB5dGhvbiBpbnRlcmFjdGl2ZWx5IGluIG5vbi10cml2aWFsIHdheXMuCi0KLVdoZW4geW91IHVzZSBQeXRob24gaW50ZXJhY3RpdmVseSwgaXQgaXMgZnJlcXVlbnRseSBoYW5keSB0byBoYXZlIHNvbWUKLXN0YW5kYXJkIGNvbW1hbmRzIGV4ZWN1dGVkIGV2ZXJ5IHRpbWUgdGhlIGludGVycHJldGVyIGlzIHN0YXJ0ZWQuICBZb3UKLWNhbiBkbyB0aGlzIGJ5IHNldHRpbmcgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZWQKLVxlbnZ2YXJ7UFlUSE9OU1RBUlRVUH0gdG8gdGhlIG5hbWUgb2YgYSBmaWxlIGNvbnRhaW5pbmcgeW91ciBzdGFydC11cAotY29tbWFuZHMuICBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIFxmaWxley5wcm9maWxlfSBmZWF0dXJlIG9mIHRoZQotXFVOSVh7fSBzaGVsbHMuCi0KLVRoaXMgZmlsZSBpcyBvbmx5IHJlYWQgaW4gaW50ZXJhY3RpdmUgc2Vzc2lvbnMsIG5vdCB3aGVuIFB5dGhvbiByZWFkcwotY29tbWFuZHMgZnJvbSBhIHNjcmlwdCwgYW5kIG5vdCB3aGVuIFxmaWxley9kZXYvdHR5fSBpcyBnaXZlbiBhcyB0aGUKLWV4cGxpY2l0IHNvdXJjZSBvZiBjb21tYW5kcyAod2hpY2ggb3RoZXJ3aXNlIGJlaGF2ZXMgbGlrZSBhbgotaW50ZXJhY3RpdmUgc2Vzc2lvbikuICBJdCBpcyBleGVjdXRlZCBpbiB0aGUgc2FtZSBuYW1lc3BhY2Ugd2hlcmUKLWludGVyYWN0aXZlIGNvbW1hbmRzIGFyZSBleGVjdXRlZCwgc28gdGhhdCBvYmplY3RzIHRoYXQgaXQgZGVmaW5lcyBvcgotaW1wb3J0cyBjYW4gYmUgdXNlZCB3aXRob3V0IHF1YWxpZmljYXRpb24gaW4gdGhlIGludGVyYWN0aXZlIHNlc3Npb24uCi1Zb3UgY2FuIGFsc28gY2hhbmdlIHRoZSBwcm9tcHRzIFxjb2Rle3N5cy5wczF9IGFuZCBcY29kZXtzeXMucHMyfSBpbgotdGhpcyBmaWxlLgotCi1JZiB5b3Ugd2FudCB0byByZWFkIGFuIGFkZGl0aW9uYWwgc3RhcnQtdXAgZmlsZSBmcm9tIHRoZSBjdXJyZW50Ci1kaXJlY3RvcnksIHlvdSBjYW4gcHJvZ3JhbSB0aGlzIGluIHRoZSBnbG9iYWwgc3RhcnQtdXAgZmlsZSB1c2luZyBjb2RlCi1saWtlIFxzYW1we2lmIG9zLnBhdGguaXNmaWxlKCcucHl0aG9ucmMucHknKToKLWV4ZWMob3BlbignLnB5dGhvbnJjLnB5JykpLnJlYWQoKX0uICBJZiB5b3Ugd2FudCB0byB1c2UgdGhlIHN0YXJ0dXAgZmlsZSBpbiBhCi1zY3JpcHQsIHlvdSBtdXN0IGRvIHRoaXMgZXhwbGljaXRseSBpbiB0aGUgc2NyaXB0OgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgb3MKLWZpbGVuYW1lID0gb3MuZW52aXJvbi5nZXQoJ1BZVEhPTlNUQVJUVVAnKQotaWYgZmlsZW5hbWUgYW5kIG9zLnBhdGguaXNmaWxlKGZpbGVuYW1lKToKLSAgICBleGVjKG9wZW4oZmlsZW5hbWUpLnJlYWQoKSkKLVxlbmR7dmVyYmF0aW19Ci0KLQotXGNoYXB0ZXJ7QW4gSW5mb3JtYWwgSW50cm9kdWN0aW9uIHRvIFB5dGhvbiBcbGFiZWx7aW5mb3JtYWx9fQotCi1JbiB0aGUgZm9sbG93aW5nIGV4YW1wbGVzLCBpbnB1dCBhbmQgb3V0cHV0IGFyZSBkaXN0aW5ndWlzaGVkIGJ5IHRoZQotcHJlc2VuY2Ugb3IgYWJzZW5jZSBvZiBwcm9tcHRzIChcc2FtcHs+Pj5+fSBhbmQgXHNhbXB7Li4ufn0pOiB0byByZXBlYXQKLXRoZSBleGFtcGxlLCB5b3UgbXVzdCB0eXBlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIHByb21wdCwgd2hlbiB0aGUKLXByb21wdCBhcHBlYXJzOyBsaW5lcyB0aGF0IGRvIG5vdCBiZWdpbiB3aXRoIGEgcHJvbXB0IGFyZSBvdXRwdXQgZnJvbQotdGhlIGludGVycHJldGVyLiAlCi0lXGZvb3Rub3RlewotJSAgICAgICAgSSdkIHByZWZlciB0byB1c2UgZGlmZmVyZW50IGZvbnRzIHRvIGRpc3Rpbmd1aXNoIGlucHV0Ci0lICAgICAgICBmcm9tIG91dHB1dCwgYnV0IHRoZSBhbW91bnQgb2YgTGFUZVggaGFja2luZyB0aGF0IHdvdWxkIHJlcXVpcmUKLSUgICAgICAgIGlzIGN1cnJlbnRseSBiZXlvbmQgbXkgYWJpbGl0eS4KLSV9Ci1Ob3RlIHRoYXQgYSBzZWNvbmRhcnkgcHJvbXB0IG9uIGEgbGluZSBieSBpdHNlbGYgaW4gYW4gZXhhbXBsZSBtZWFucwoteW91IG11c3QgdHlwZSBhIGJsYW5rIGxpbmU7IHRoaXMgaXMgdXNlZCB0byBlbmQgYSBtdWx0aS1saW5lIGNvbW1hbmQuCi0KLU1hbnkgb2YgdGhlIGV4YW1wbGVzIGluIHRoaXMgbWFudWFsLCBldmVuIHRob3NlIGVudGVyZWQgYXQgdGhlCi1pbnRlcmFjdGl2ZSBwcm9tcHQsIGluY2x1ZGUgY29tbWVudHMuICBDb21tZW50cyBpbiBQeXRob24gc3RhcnQgd2l0aAotdGhlIGhhc2ggY2hhcmFjdGVyLCBcY2hhcmFjdGVye1wjfSwgYW5kIGV4dGVuZCB0byB0aGUgZW5kIG9mIHRoZQotcGh5c2ljYWwgbGluZS4gIEEgY29tbWVudCBtYXkgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUgb3IKLWZvbGxvd2luZyB3aGl0ZXNwYWNlIG9yIGNvZGUsIGJ1dCBub3Qgd2l0aGluIGEgc3RyaW5nIGxpdGVyYWwuICBBIGhhc2ggCi1jaGFyYWN0ZXIgd2l0aGluIGEgc3RyaW5nIGxpdGVyYWwgaXMganVzdCBhIGhhc2ggY2hhcmFjdGVyLgotCi1Tb21lIGV4YW1wbGVzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0jIHRoaXMgaXMgdGhlIGZpcnN0IGNvbW1lbnQKLVNQQU0gPSAxICAgICAgICAgICAgICAgICAjIGFuZCB0aGlzIGlzIHRoZSBzZWNvbmQgY29tbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICMgLi4uIGFuZCBub3cgYSB0aGlyZCEKLVNUUklORyA9ICIjIFRoaXMgaXMgbm90IGEgY29tbWVudC4iCi1cZW5ke3ZlcmJhdGltfQotCi0KLVxzZWN0aW9ue1VzaW5nIFB5dGhvbiBhcyBhIENhbGN1bGF0b3IgXGxhYmVse2NhbGN1bGF0b3J9fQotCi1MZXQncyB0cnkgc29tZSBzaW1wbGUgUHl0aG9uIGNvbW1hbmRzLiAgU3RhcnQgdGhlIGludGVycHJldGVyIGFuZCB3YWl0Ci1mb3IgdGhlIHByaW1hcnkgcHJvbXB0LCBcc2FtcHs+Pj5+fS4gIChJdCBzaG91bGRuJ3QgdGFrZSBsb25nLikKLQotXHN1YnNlY3Rpb257TnVtYmVycyBcbGFiZWx7bnVtYmVyc319Ci0KLVRoZSBpbnRlcnByZXRlciBhY3RzIGFzIGEgc2ltcGxlIGNhbGN1bGF0b3I6IHlvdSBjYW4gdHlwZSBhbgotZXhwcmVzc2lvbiBhdCBpdCBhbmQgaXQgd2lsbCB3cml0ZSB0aGUgdmFsdWUuICBFeHByZXNzaW9uIHN5bnRheCBpcwotc3RyYWlnaHRmb3J3YXJkOiB0aGUgb3BlcmF0b3JzIFxjb2Rleyt9LCBcY29kZXstfSwgXGNvZGV7Kn0gYW5kCi1cY29kZXsvfSB3b3JrIGp1c3QgbGlrZSBpbiBtb3N0IG90aGVyIGxhbmd1YWdlcyAoZm9yIGV4YW1wbGUsIFBhc2NhbAotb3IgQyk7IHBhcmVudGhlc2VzIGNhbiBiZSB1c2VkIGZvciBncm91cGluZy4gIEZvciBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gMisyCi00Ci0+Pj4gIyBUaGlzIGlzIGEgY29tbWVudAotLi4uIDIrMgotNAotPj4+IDIrMiAgIyBhbmQgYSBjb21tZW50IG9uIHRoZSBzYW1lIGxpbmUgYXMgY29kZQotNAotPj4+ICg1MC01KjYpLzQKLTUKLT4+PiAjIEludGVnZXIgZGl2aXNpb24gcmV0dXJucyB0aGUgZmxvb3I6Ci0uLi4gNy8zCi0yCi0+Pj4gNy8tMwotLTMKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBlcXVhbCBzaWduIChcY2hhcmFjdGVyez19KSBpcyB1c2VkIHRvIGFzc2lnbiBhIHZhbHVlIHRvIGEgdmFyaWFibGUuCi1BZnRlcndhcmRzLCBubyByZXN1bHQgaXMgZGlzcGxheWVkIGJlZm9yZSB0aGUgbmV4dCBpbnRlcmFjdGl2ZSBwcm9tcHQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiB3aWR0aCA9IDIwCi0+Pj4gaGVpZ2h0ID0gNSo5Ci0+Pj4gd2lkdGggKiBoZWlnaHQKLTkwMAotXGVuZHt2ZXJiYXRpbX0KLQotQSB2YWx1ZSBjYW4gYmUgYXNzaWduZWQgdG8gc2V2ZXJhbCB2YXJpYWJsZXMgc2ltdWx0YW5lb3VzbHk6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiB4ID0geSA9IHogPSAwICAjIFplcm8geCwgeSBhbmQgegotPj4+IHgKLTAKLT4+PiB5Ci0wCi0+Pj4gegotMAotXGVuZHt2ZXJiYXRpbX0KLQotVGhlcmUgaXMgZnVsbCBzdXBwb3J0IGZvciBmbG9hdGluZyBwb2ludDsgb3BlcmF0b3JzIHdpdGggbWl4ZWQgdHlwZQotb3BlcmFuZHMgY29udmVydCB0aGUgaW50ZWdlciBvcGVyYW5kIHRvIGZsb2F0aW5nIHBvaW50OgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gMyAqIDMuNzUgLyAxLjUKLTcuNQotPj4+IDcuMCAvIDIKLTMuNQotXGVuZHt2ZXJiYXRpbX0KLQotQ29tcGxleCBudW1iZXJzIGFyZSBhbHNvIHN1cHBvcnRlZDsgaW1hZ2luYXJ5IG51bWJlcnMgYXJlIHdyaXR0ZW4gd2l0aAotYSBzdWZmaXggb2YgXHNhbXB7an0gb3IgXHNhbXB7Sn0uICBDb21wbGV4IG51bWJlcnMgd2l0aCBhIG5vbnplcm8KLXJlYWwgY29tcG9uZW50IGFyZSB3cml0dGVuIGFzIFxzYW1weyhcdmFye3JlYWx9K1x2YXJ7aW1hZ31qKX0sIG9yIGNhbgotYmUgY3JlYXRlZCB3aXRoIHRoZSBcc2FtcHtjb21wbGV4KFx2YXJ7cmVhbH0sIFx2YXJ7aW1hZ30pfSBmdW5jdGlvbi4KLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IDFqICogMUoKLSgtMSswaikKLT4+PiAxaiAqIGNvbXBsZXgoMCwxKQotKC0xKzBqKQotPj4+IDMrMWoqMwotKDMrM2opCi0+Pj4gKDMrMWopKjMKLSg5KzNqKQotPj4+ICgxKzJqKS8oMSsxaikKLSgxLjUrMC41aikKLVxlbmR7dmVyYmF0aW19Ci0KLUNvbXBsZXggbnVtYmVycyBhcmUgYWx3YXlzIHJlcHJlc2VudGVkIGFzIHR3byBmbG9hdGluZyBwb2ludCBudW1iZXJzLAotdGhlIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0LiAgVG8gZXh0cmFjdCB0aGVzZSBwYXJ0cyBmcm9tIGEgY29tcGxleAotbnVtYmVyIFx2YXJ7en0sIHVzZSBcY29kZXtcdmFye3p9LnJlYWx9IGFuZCBcY29kZXtcdmFye3p9LmltYWd9LiAgCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBhPTEuNSswLjVqCi0+Pj4gYS5yZWFsCi0xLjUKLT4+PiBhLmltYWcKLTAuNQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGNvbnZlcnNpb24gZnVuY3Rpb25zIHRvIGZsb2F0aW5nIHBvaW50IGFuZCBpbnRlZ2VyCi0oXGZ1bmN0aW9ue2Zsb2F0KCl9LCBcZnVuY3Rpb257aW50KCl9IGFuZCBcZnVuY3Rpb257bG9uZygpfSkgZG9uJ3QKLXdvcmsgZm9yIGNvbXBsZXggbnVtYmVycyAtLS0gdGhlcmUgaXMgbm8gb25lIGNvcnJlY3Qgd2F5IHRvIGNvbnZlcnQgYQotY29tcGxleCBudW1iZXIgdG8gYSByZWFsIG51bWJlci4gIFVzZSBcY29kZXthYnMoXHZhcnt6fSl9IHRvIGdldCBpdHMKLW1hZ25pdHVkZSAoYXMgYSBmbG9hdCkgb3IgXGNvZGV7ei5yZWFsfSB0byBnZXQgaXRzIHJlYWwgcGFydC4KLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGE9My4wKzQuMGoKLT4+PiBmbG9hdChhKQotVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/Ci1UeXBlRXJyb3I6IGNhbid0IGNvbnZlcnQgY29tcGxleCB0byBmbG9hdDsgdXNlIGFicyh6KQotPj4+IGEucmVhbAotMy4wCi0+Pj4gYS5pbWFnCi00LjAKLT4+PiBhYnMoYSkgICMgc3FydChhLnJlYWwqKjIgKyBhLmltYWcqKjIpCi01LjAKLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotSW4gaW50ZXJhY3RpdmUgbW9kZSwgdGhlIGxhc3QgcHJpbnRlZCBleHByZXNzaW9uIGlzIGFzc2lnbmVkIHRvIHRoZQotdmFyaWFibGUgXGNvZGV7X30uICBUaGlzIG1lYW5zIHRoYXQgd2hlbiB5b3UgYXJlIHVzaW5nIFB5dGhvbiBhcyBhCi1kZXNrIGNhbGN1bGF0b3IsIGl0IGlzIHNvbWV3aGF0IGVhc2llciB0byBjb250aW51ZSBjYWxjdWxhdGlvbnMsIGZvcgotZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHRheCA9IDEyLjUgLyAxMDAKLT4+PiBwcmljZSA9IDEwMC41MAotPj4+IHByaWNlICogdGF4Ci0xMi41NjI1Ci0+Pj4gcHJpY2UgKyBfCi0xMTMuMDYyNQotPj4+IHJvdW5kKF8sIDIpCi0xMTMuMDYKLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotVGhpcyB2YXJpYWJsZSBzaG91bGQgYmUgdHJlYXRlZCBhcyByZWFkLW9ubHkgYnkgdGhlIHVzZXIuICBEb24ndAotZXhwbGljaXRseSBhc3NpZ24gYSB2YWx1ZSB0byBpdCAtLS0geW91IHdvdWxkIGNyZWF0ZSBhbiBpbmRlcGVuZGVudAotbG9jYWwgdmFyaWFibGUgd2l0aCB0aGUgc2FtZSBuYW1lIG1hc2tpbmcgdGhlIGJ1aWx0LWluIHZhcmlhYmxlIHdpdGgKLWl0cyBtYWdpYyBiZWhhdmlvci4KLQotXHN1YnNlY3Rpb257U3RyaW5ncyBcbGFiZWx7c3RyaW5nc319Ci0KLUJlc2lkZXMgbnVtYmVycywgUHl0aG9uIGNhbiBhbHNvIG1hbmlwdWxhdGUgc3RyaW5ncywgd2hpY2ggY2FuIGJlCi1leHByZXNzZWQgaW4gc2V2ZXJhbCB3YXlzLiAgVGhleSBjYW4gYmUgZW5jbG9zZWQgaW4gc2luZ2xlIHF1b3RlcyBvcgotZG91YmxlIHF1b3RlczoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+ICdzcGFtIGVnZ3MnCi0nc3BhbSBlZ2dzJwotPj4+ICdkb2VzblwndCcKLSJkb2Vzbid0IgotPj4+ICJkb2Vzbid0IgotImRvZXNuJ3QiCi0+Pj4gJyJZZXMsIiBoZSBzYWlkLicKLSciWWVzLCIgaGUgc2FpZC4nCi0+Pj4gIlwiWWVzLFwiIGhlIHNhaWQuIgotJyJZZXMsIiBoZSBzYWlkLicKLT4+PiAnIklzblwndCwiIHNoZSBzYWlkLicKLSciSXNuXCd0LCIgc2hlIHNhaWQuJwotXGVuZHt2ZXJiYXRpbX0KLQotU3RyaW5nIGxpdGVyYWxzIGNhbiBzcGFuIG11bHRpcGxlIGxpbmVzIGluIHNldmVyYWwgd2F5cy4gIENvbnRpbnVhdGlvbgotbGluZXMgY2FuIGJlIHVzZWQsIHdpdGggYSBiYWNrc2xhc2ggYXMgdGhlIGxhc3QgY2hhcmFjdGVyIG9uIHRoZSBsaW5lCi1pbmRpY2F0aW5nIHRoYXQgdGhlIG5leHQgbGluZSBpcyBhIGxvZ2ljYWwgY29udGludWF0aW9uIG9mIHRoZSBsaW5lOgotCi1cYmVnaW57dmVyYmF0aW19Ci1oZWxsbyA9ICJUaGlzIGlzIGEgcmF0aGVyIGxvbmcgc3RyaW5nIGNvbnRhaW5pbmdcblwKLXNldmVyYWwgbGluZXMgb2YgdGV4dCBqdXN0IGFzIHlvdSB3b3VsZCBkbyBpbiBDLlxuXAotICAgIE5vdGUgdGhhdCB3aGl0ZXNwYWNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgaXNcCi0gc2lnbmlmaWNhbnQuIgotCi1wcmludCBoZWxsbwotXGVuZHt2ZXJiYXRpbX0KLQotTm90ZSB0aGF0IG5ld2xpbmVzIHN0aWxsIG5lZWQgdG8gYmUgZW1iZWRkZWQgaW4gdGhlIHN0cmluZyB1c2luZwotXGNvZGV7XGUgbn07IHRoZSBuZXdsaW5lIGZvbGxvd2luZyB0aGUgdHJhaWxpbmcgYmFja3NsYXNoIGlzCi1kaXNjYXJkZWQuICBUaGlzIGV4YW1wbGUgd291bGQgcHJpbnQgdGhlIGZvbGxvd2luZzoKLQotXGJlZ2lue3ZlcmJhdGltfQotVGhpcyBpcyBhIHJhdGhlciBsb25nIHN0cmluZyBjb250YWluaW5nCi1zZXZlcmFsIGxpbmVzIG9mIHRleHQganVzdCBhcyB5b3Ugd291bGQgZG8gaW4gQy4KLSAgICBOb3RlIHRoYXQgd2hpdGVzcGFjZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIGlzIHNpZ25pZmljYW50LgotXGVuZHt2ZXJiYXRpbX0KLQotSWYgd2UgbWFrZSB0aGUgc3RyaW5nIGxpdGVyYWwgYSBgYHJhdycnIHN0cmluZywgaG93ZXZlciwgdGhlCi1cY29kZXtcZSBufSBzZXF1ZW5jZXMgYXJlIG5vdCBjb252ZXJ0ZWQgdG8gbmV3bGluZXMsIGJ1dCB0aGUgYmFja3NsYXNoCi1hdCB0aGUgZW5kIG9mIHRoZSBsaW5lLCBhbmQgdGhlIG5ld2xpbmUgY2hhcmFjdGVyIGluIHRoZSBzb3VyY2UsIGFyZQotYm90aCBpbmNsdWRlZCBpbiB0aGUgc3RyaW5nIGFzIGRhdGEuICBUaHVzLCB0aGUgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotaGVsbG8gPSByIlRoaXMgaXMgYSByYXRoZXIgbG9uZyBzdHJpbmcgY29udGFpbmluZ1xuXAotc2V2ZXJhbCBsaW5lcyBvZiB0ZXh0IG11Y2ggYXMgeW91IHdvdWxkIGRvIGluIEMuIgotCi1wcmludCBoZWxsbwotXGVuZHt2ZXJiYXRpbX0KLQotd291bGQgcHJpbnQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLVRoaXMgaXMgYSByYXRoZXIgbG9uZyBzdHJpbmcgY29udGFpbmluZ1xuXAotc2V2ZXJhbCBsaW5lcyBvZiB0ZXh0IG11Y2ggYXMgeW91IHdvdWxkIGRvIGluIEMuCi1cZW5ke3ZlcmJhdGltfQotCi1Pciwgc3RyaW5ncyBjYW4gYmUgc3Vycm91bmRlZCBpbiBhIHBhaXIgb2YgbWF0Y2hpbmcgdHJpcGxlLXF1b3RlczoKLVxjb2RleyIiIn0gb3IgXGNvZGV7J1xjb2Rleyd9J30uICBFbmQgb2YgbGluZXMgZG8gbm90IG5lZWQgdG8gYmUgZXNjYXBlZAotd2hlbiB1c2luZyB0cmlwbGUtcXVvdGVzLCBidXQgdGhleSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBzdHJpbmcuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLXByaW50ICIiIgotVXNhZ2U6IHRoaW5neSBbT1BUSU9OU10gCi0gICAgIC1oICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGlzIHVzYWdlIG1lc3NhZ2UKLSAgICAgLUggaG9zdG5hbWUgICAgICAgICAgICAgICBIb3N0bmFtZSB0byBjb25uZWN0IHRvCi0iIiIKLVxlbmR7dmVyYmF0aW19Ci0KLXByb2R1Y2VzIHRoZSBmb2xsb3dpbmcgb3V0cHV0OgotCi1cYmVnaW57dmVyYmF0aW19Ci1Vc2FnZTogdGhpbmd5IFtPUFRJT05TXSAKLSAgICAgLWggICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IHRoaXMgdXNhZ2UgbWVzc2FnZQotICAgICAtSCBob3N0bmFtZSAgICAgICAgICAgICAgIEhvc3RuYW1lIHRvIGNvbm5lY3QgdG8KLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBpbnRlcnByZXRlciBwcmludHMgdGhlIHJlc3VsdCBvZiBzdHJpbmcgb3BlcmF0aW9ucyBpbiB0aGUgc2FtZSB3YXkKLWFzIHRoZXkgYXJlIHR5cGVkIGZvciBpbnB1dDogaW5zaWRlIHF1b3RlcywgYW5kIHdpdGggcXVvdGVzIGFuZCBvdGhlcgotZnVubnkgY2hhcmFjdGVycyBlc2NhcGVkIGJ5IGJhY2tzbGFzaGVzLCB0byBzaG93IHRoZSBwcmVjaXNlCi12YWx1ZS4gIFRoZSBzdHJpbmcgaXMgZW5jbG9zZWQgaW4gZG91YmxlIHF1b3RlcyBpZiB0aGUgc3RyaW5nIGNvbnRhaW5zCi1hIHNpbmdsZSBxdW90ZSBhbmQgbm8gZG91YmxlIHF1b3RlcywgZWxzZSBpdCdzIGVuY2xvc2VkIGluIHNpbmdsZQotcXVvdGVzLiAgKFRoZSBca2V5d29yZHtwcmludH0gc3RhdGVtZW50LCBkZXNjcmliZWQgbGF0ZXIsIGNhbiBiZSB1c2VkCi10byB3cml0ZSBzdHJpbmdzIHdpdGhvdXQgcXVvdGVzIG9yIGVzY2FwZXMuKQotCi1TdHJpbmdzIGNhbiBiZSBjb25jYXRlbmF0ZWQgKGdsdWVkIHRvZ2V0aGVyKSB3aXRoIHRoZQotXGNvZGV7K30gb3BlcmF0b3IsIGFuZCByZXBlYXRlZCB3aXRoIFxjb2Rleyp9OgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gd29yZCA9ICdIZWxwJyArICdBJwotPj4+IHdvcmQKLSdIZWxwQScKLT4+PiAnPCcgKyB3b3JkKjUgKyAnPicKLSc8SGVscEFIZWxwQUhlbHBBSGVscEFIZWxwQT4nCi1cZW5ke3ZlcmJhdGltfQotCi1Ud28gc3RyaW5nIGxpdGVyYWxzIG5leHQgdG8gZWFjaCBvdGhlciBhcmUgYXV0b21hdGljYWxseSBjb25jYXRlbmF0ZWQ7Ci10aGUgZmlyc3QgbGluZSBhYm92ZSBjb3VsZCBhbHNvIGhhdmUgYmVlbiB3cml0dGVuIFxzYW1we3dvcmQgPSAnSGVscCcKLSdBJ307IHRoaXMgb25seSB3b3JrcyB3aXRoIHR3byBsaXRlcmFscywgbm90IHdpdGggYXJiaXRyYXJ5IHN0cmluZwotZXhwcmVzc2lvbnM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiAnc3RyJyAnaW5nJyAgICAgICAgICAgICAgICAgICAjICA8LSAgVGhpcyBpcyBvawotJ3N0cmluZycKLT4+PiAnc3RyJy5zdHJpcCgpICsgJ2luZycgICAjICA8LSAgVGhpcyBpcyBvawotJ3N0cmluZycKLT4+PiAnc3RyJy5zdHJpcCgpICdpbmcnICAgICAjICA8LSAgVGhpcyBpcyBpbnZhbGlkCi0gIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KLSAgICAnc3RyJy5zdHJpcCgpICdpbmcnCi0gICAgICAgICAgICAgICAgICAgICAgXgotU3ludGF4RXJyb3I6IGludmFsaWQgc3ludGF4Ci1cZW5ke3ZlcmJhdGltfQotCi1TdHJpbmdzIGNhbiBiZSBzdWJzY3JpcHRlZCAoaW5kZXhlZCk7IGxpa2UgaW4gQywgdGhlIGZpcnN0IGNoYXJhY3Rlcgotb2YgYSBzdHJpbmcgaGFzIHN1YnNjcmlwdCAoaW5kZXgpIDAuICBUaGVyZSBpcyBubyBzZXBhcmF0ZSBjaGFyYWN0ZXIKLXR5cGU7IGEgY2hhcmFjdGVyIGlzIHNpbXBseSBhIHN0cmluZyBvZiBzaXplIG9uZS4gIExpa2UgaW4gSWNvbiwKLXN1YnN0cmluZ3MgY2FuIGJlIHNwZWNpZmllZCB3aXRoIHRoZSBcZW1waHtzbGljZSBub3RhdGlvbn06IHR3byBpbmRpY2VzCi1zZXBhcmF0ZWQgYnkgYSBjb2xvbi4KLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHdvcmRbNF0KLSdBJwotPj4+IHdvcmRbMDoyXQotJ0hlJwotPj4+IHdvcmRbMjo0XQotJ2xwJwotXGVuZHt2ZXJiYXRpbX0KLQotU2xpY2UgaW5kaWNlcyBoYXZlIHVzZWZ1bCBkZWZhdWx0czsgYW4gb21pdHRlZCBmaXJzdCBpbmRleCBkZWZhdWx0cyB0bwotemVybywgYW4gb21pdHRlZCBzZWNvbmQgaW5kZXggZGVmYXVsdHMgdG8gdGhlIHNpemUgb2YgdGhlIHN0cmluZyBiZWluZwotc2xpY2VkLgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gd29yZFs6Ml0gICAgIyBUaGUgZmlyc3QgdHdvIGNoYXJhY3RlcnMKLSdIZScKLT4+PiB3b3JkWzI6XSAgICAjIEV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSBmaXJzdCB0d28gY2hhcmFjdGVycwotJ2xwQScKLVxlbmR7dmVyYmF0aW19Ci0KLVVubGlrZSBhIEMgc3RyaW5nLCBQeXRob24gc3RyaW5ncyBjYW5ub3QgYmUgY2hhbmdlZC4gIEFzc2lnbmluZyB0byBhbiAKLWluZGV4ZWQgcG9zaXRpb24gaW4gdGhlIHN0cmluZyByZXN1bHRzIGluIGFuIGVycm9yOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gd29yZFswXSA9ICd4JwotVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/Ci1UeXBlRXJyb3I6IG9iamVjdCBkb2Vzbid0IHN1cHBvcnQgaXRlbSBhc3NpZ25tZW50Ci0+Pj4gd29yZFs6MV0gPSAnU3BsYXQnCi1UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KLVR5cGVFcnJvcjogb2JqZWN0IGRvZXNuJ3Qgc3VwcG9ydCBzbGljZSBhc3NpZ25tZW50Ci1cZW5ke3ZlcmJhdGltfQotCi1Ib3dldmVyLCBjcmVhdGluZyBhIG5ldyBzdHJpbmcgd2l0aCB0aGUgY29tYmluZWQgY29udGVudCBpcyBlYXN5IGFuZAotZWZmaWNpZW50OgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gJ3gnICsgd29yZFsxOl0KLSd4ZWxwQScKLT4+PiAnU3BsYXQnICsgd29yZFs0XQotJ1NwbGF0QScKLVxlbmR7dmVyYmF0aW19Ci0KLUhlcmUncyBhIHVzZWZ1bCBpbnZhcmlhbnQgb2Ygc2xpY2Ugb3BlcmF0aW9uczoKLVxjb2Rle3NbOmldICsgc1tpOl19IGVxdWFscyBcY29kZXtzfS4KLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHdvcmRbOjJdICsgd29yZFsyOl0KLSdIZWxwQScKLT4+PiB3b3JkWzozXSArIHdvcmRbMzpdCi0nSGVscEEnCi1cZW5ke3ZlcmJhdGltfQotCi1EZWdlbmVyYXRlIHNsaWNlIGluZGljZXMgYXJlIGhhbmRsZWQgZ3JhY2VmdWxseTogYW4gaW5kZXggdGhhdCBpcyB0b28KLWxhcmdlIGlzIHJlcGxhY2VkIGJ5IHRoZSBzdHJpbmcgc2l6ZSwgYW4gdXBwZXIgYm91bmQgc21hbGxlciB0aGFuIHRoZQotbG93ZXIgYm91bmQgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiB3b3JkWzE6MTAwXQotJ2VscEEnCi0+Pj4gd29yZFsxMDpdCi0nJwotPj4+IHdvcmRbMjoxXQotJycKLVxlbmR7dmVyYmF0aW19Ci0KLUluZGljZXMgbWF5IGJlIG5lZ2F0aXZlIG51bWJlcnMsIHRvIHN0YXJ0IGNvdW50aW5nIGZyb20gdGhlIHJpZ2h0LgotRm9yIGV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiB3b3JkWy0xXSAgICAgIyBUaGUgbGFzdCBjaGFyYWN0ZXIKLSdBJwotPj4+IHdvcmRbLTJdICAgICAjIFRoZSBsYXN0LWJ1dC1vbmUgY2hhcmFjdGVyCi0ncCcKLT4+PiB3b3JkWy0yOl0gICAgIyBUaGUgbGFzdCB0d28gY2hhcmFjdGVycwotJ3BBJwotPj4+IHdvcmRbOi0yXSAgICAjIEV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSBsYXN0IHR3byBjaGFyYWN0ZXJzCi0nSGVsJwotXGVuZHt2ZXJiYXRpbX0KLQotQnV0IG5vdGUgdGhhdCAtMCBpcyByZWFsbHkgdGhlIHNhbWUgYXMgMCwgc28gaXQgZG9lcyBub3QgY291bnQgZnJvbQotdGhlIHJpZ2h0IQotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gd29yZFstMF0gICAgICMgKHNpbmNlIC0wIGVxdWFscyAwKQotJ0gnCi1cZW5ke3ZlcmJhdGltfQotCi1PdXQtb2YtcmFuZ2UgbmVnYXRpdmUgc2xpY2UgaW5kaWNlcyBhcmUgdHJ1bmNhdGVkLCBidXQgZG9uJ3QgdHJ5IHRoaXMKLWZvciBzaW5nbGUtZWxlbWVudCAobm9uLXNsaWNlKSBpbmRpY2VzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gd29yZFstMTAwOl0KLSdIZWxwQScKLT4+PiB3b3JkWy0xMF0gICAgIyBlcnJvcgotVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/Ci1JbmRleEVycm9yOiBzdHJpbmcgaW5kZXggb3V0IG9mIHJhbmdlCi1cZW5ke3ZlcmJhdGltfQotCi1PbmUgd2F5IHRvIHJlbWVtYmVyIGhvdyBzbGljZXMgd29yayBpcyB0byB0aGluayBvZiB0aGUgaW5kaWNlcyBhcwotcG9pbnRpbmcgXGVtcGh7YmV0d2Vlbn0gY2hhcmFjdGVycywgd2l0aCB0aGUgbGVmdCBlZGdlIG9mIHRoZSBmaXJzdAotY2hhcmFjdGVyIG51bWJlcmVkIDAuICBUaGVuIHRoZSByaWdodCBlZGdlIG9mIHRoZSBsYXN0IGNoYXJhY3RlciBvZiBhCi1zdHJpbmcgb2YgXHZhcntufSBjaGFyYWN0ZXJzIGhhcyBpbmRleCBcdmFye259LCBmb3IgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotICstLS0rLS0tKy0tLSstLS0rLS0tKyAKLSB8IEggfCBlIHwgbCB8IHAgfCBBIHwKLSArLS0tKy0tLSstLS0rLS0tKy0tLSsgCi0gMCAgIDEgICAyICAgMyAgIDQgICA1IAotLTUgIC00ICAtMyAgLTIgIC0xCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgZmlyc3Qgcm93IG9mIG51bWJlcnMgZ2l2ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBpbmRpY2VzIDAuLi41IGluCi10aGUgc3RyaW5nOyB0aGUgc2Vjb25kIHJvdyBnaXZlcyB0aGUgY29ycmVzcG9uZGluZyBuZWdhdGl2ZSBpbmRpY2VzLgotVGhlIHNsaWNlIGZyb20gXHZhcntpfSB0byBcdmFye2p9IGNvbnNpc3RzIG9mIGFsbCBjaGFyYWN0ZXJzIGJldHdlZW4KLXRoZSBlZGdlcyBsYWJlbGVkIFx2YXJ7aX0gYW5kIFx2YXJ7an0sIHJlc3BlY3RpdmVseS4KLQotRm9yIG5vbi1uZWdhdGl2ZSBpbmRpY2VzLCB0aGUgbGVuZ3RoIG9mIGEgc2xpY2UgaXMgdGhlIGRpZmZlcmVuY2Ugb2YKLXRoZSBpbmRpY2VzLCBpZiBib3RoIGFyZSB3aXRoaW4gYm91bmRzLiAgRm9yIGV4YW1wbGUsIHRoZSBsZW5ndGggb2YKLVxjb2Rle3dvcmRbMTozXX0gaXMgMi4KLQotVGhlIGJ1aWx0LWluIGZ1bmN0aW9uIFxmdW5jdGlvbntsZW4oKX0gcmV0dXJucyB0aGUgbGVuZ3RoIG9mIGEgc3RyaW5nOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gcyA9ICdzdXBlcmNhbGlmcmFnaWxpc3RpY2V4cGlhbGlkb2Npb3VzJwotPj4+IGxlbihzKQotMzQKLVxlbmR7dmVyYmF0aW19Ci0KLQotXGJlZ2lue3NlZWFsc299Ci0gIFxzZWV0aXRsZVsuLi9saWIvdHlwZXNzZXEuaHRtbF17U2VxdWVuY2UgVHlwZXN9JQotICAgICAgICAgICB7U3RyaW5ncywgYW5kIHRoZSBVbmljb2RlIHN0cmluZ3MgZGVzY3JpYmVkIGluIHRoZSBuZXh0Ci0gICAgICAgICAgICBzZWN0aW9uLCBhcmUgZXhhbXBsZXMgb2YgXGVtcGh7c2VxdWVuY2UgdHlwZXN9LCBhbmQKLSAgICAgICAgICAgIHN1cHBvcnQgdGhlIGNvbW1vbiBvcGVyYXRpb25zIHN1cHBvcnRlZCBieSBzdWNoIHR5cGVzLn0KLSAgXHNlZXRpdGxlWy4uL2xpYi9zdHJpbmctbWV0aG9kcy5odG1sXXtTdHJpbmcgTWV0aG9kc30lCi0gICAgICAgICAgIHtCb3RoIHN0cmluZ3MgYW5kIFVuaWNvZGUgc3RyaW5ncyBzdXBwb3J0IGEgbGFyZ2UgbnVtYmVyIG9mCi0gICAgICAgICAgICBtZXRob2RzIGZvciBiYXNpYyB0cmFuc2Zvcm1hdGlvbnMgYW5kIHNlYXJjaGluZy59Ci0gIFxzZWV0aXRsZVsuLi9saWIvdHlwZXNzZXEtc3RyaW5ncy5odG1sXXtTdHJpbmcgRm9ybWF0dGluZyBPcGVyYXRpb25zfSUKLSAgICAgICAgICAge1RoZSBmb3JtYXR0aW5nIG9wZXJhdGlvbnMgaW52b2tlZCB3aGVuIHN0cmluZ3MgYW5kIFVuaWNvZGUKLSAgICAgICAgICAgIHN0cmluZ3MgYXJlIHRoZSBsZWZ0IG9wZXJhbmQgb2YgdGhlIFxjb2Rle1wlfSBvcGVyYXRvciBhcmUKLSAgICAgICAgICAgIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBoZXJlLn0KLVxlbmR7c2VlYWxzb30KLQotCi1cc3Vic2VjdGlvbntVbmljb2RlIFN0cmluZ3MgXGxhYmVse3VuaWNvZGVTdHJpbmdzfX0KLVxzZWN0aW9uYXV0aG9ye01hcmMtQW5kcmUgTGVtYnVyZ317bWFsQGxlbWJ1cmcuY29tfQotCi1TdGFydGluZyB3aXRoIFB5dGhvbiAyLjAgYSBuZXcgZGF0YSB0eXBlIGZvciBzdG9yaW5nIHRleHQgZGF0YSBpcwotYXZhaWxhYmxlIHRvIHRoZSBwcm9ncmFtbWVyOiB0aGUgVW5pY29kZSBvYmplY3QuIEl0IGNhbiBiZSB1c2VkIHRvCi1zdG9yZSBhbmQgbWFuaXB1bGF0ZSBVbmljb2RlIGRhdGEgKHNlZSBcdXJse2h0dHA6Ly93d3cudW5pY29kZS5vcmcvfSkKLWFuZCBpbnRlZ3JhdGVzIHdlbGwgd2l0aCB0aGUgZXhpc3Rpbmcgc3RyaW5nIG9iamVjdHMsIHByb3ZpZGluZwotYXV0by1jb252ZXJzaW9ucyB3aGVyZSBuZWNlc3NhcnkuCi0KLVVuaWNvZGUgaGFzIHRoZSBhZHZhbnRhZ2Ugb2YgcHJvdmlkaW5nIG9uZSBvcmRpbmFsIGZvciBldmVyeSBjaGFyYWN0ZXIKLWluIGV2ZXJ5IHNjcmlwdCB1c2VkIGluIG1vZGVybiBhbmQgYW5jaWVudCB0ZXh0cy4gUHJldmlvdXNseSwgdGhlcmUKLXdlcmUgb25seSAyNTYgcG9zc2libGUgb3JkaW5hbHMgZm9yIHNjcmlwdCBjaGFyYWN0ZXJzLiBUZXh0cyB3ZXJlCi10eXBpY2FsbHkgYm91bmQgdG8gYSBjb2RlIHBhZ2Ugd2hpY2ggbWFwcGVkIHRoZSBvcmRpbmFscyB0byBzY3JpcHQKLWNoYXJhY3RlcnMuIFRoaXMgbGVhZCB0byB2ZXJ5IG11Y2ggY29uZnVzaW9uIGVzcGVjaWFsbHkgd2l0aCByZXNwZWN0Ci10byBpbnRlcm5hdGlvbmFsaXphdGlvbiAodXN1YWxseSB3cml0dGVuIGFzIFxzYW1we2kxOG59IC0tLQotXGNoYXJhY3RlcntpfSArIDE4IGNoYXJhY3RlcnMgKyBcY2hhcmFjdGVye259KSBvZiBzb2Z0d2FyZS4gIFVuaWNvZGUKLXNvbHZlcyB0aGVzZSBwcm9ibGVtcyBieSBkZWZpbmluZyBvbmUgY29kZSBwYWdlIGZvciBhbGwgc2NyaXB0cy4KLQotQ3JlYXRpbmcgVW5pY29kZSBzdHJpbmdzIGluIFB5dGhvbiBpcyBqdXN0IGFzIHNpbXBsZSBhcyBjcmVhdGluZwotbm9ybWFsIHN0cmluZ3M6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiB1J0hlbGxvIFdvcmxkICEnCi11J0hlbGxvIFdvcmxkICEnCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgc21hbGwgXGNoYXJhY3Rlcnt1fSBpbiBmcm9udCBvZiB0aGUgcXVvdGUgaW5kaWNhdGVzIHRoYXQgYQotVW5pY29kZSBzdHJpbmcgaXMgc3VwcG9zZWQgdG8gYmUgY3JlYXRlZC4gSWYgeW91IHdhbnQgdG8gaW5jbHVkZQotc3BlY2lhbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcsIHlvdSBjYW4gZG8gc28gYnkgdXNpbmcgdGhlIFB5dGhvbgotXGVtcGh7VW5pY29kZS1Fc2NhcGV9IGVuY29kaW5nLiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93OgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gdSdIZWxsb1x1MDAyMFdvcmxkICEnCi11J0hlbGxvIFdvcmxkICEnCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgZXNjYXBlIHNlcXVlbmNlIFxjb2Rle1xlIHUwMDIwfSBpbmRpY2F0ZXMgdG8gaW5zZXJ0IHRoZSBVbmljb2RlCi1jaGFyYWN0ZXIgd2l0aCB0aGUgb3JkaW5hbCB2YWx1ZSAweDAwMjAgKHRoZSBzcGFjZSBjaGFyYWN0ZXIpIGF0IHRoZQotZ2l2ZW4gcG9zaXRpb24uCi0KLU90aGVyIGNoYXJhY3RlcnMgYXJlIGludGVycHJldGVkIGJ5IHVzaW5nIHRoZWlyIHJlc3BlY3RpdmUgb3JkaW5hbAotdmFsdWVzIGRpcmVjdGx5IGFzIFVuaWNvZGUgb3JkaW5hbHMuICBJZiB5b3UgaGF2ZSBsaXRlcmFsIHN0cmluZ3MKLWluIHRoZSBzdGFuZGFyZCBMYXRpbi0xIGVuY29kaW5nIHRoYXQgaXMgdXNlZCBpbiBtYW55IFdlc3Rlcm4gY291bnRyaWVzLAoteW91IHdpbGwgZmluZCBpdCBjb252ZW5pZW50IHRoYXQgdGhlIGxvd2VyIDI1NiBjaGFyYWN0ZXJzCi1vZiBVbmljb2RlIGFyZSB0aGUgc2FtZSBhcyB0aGUgMjU2IGNoYXJhY3RlcnMgb2YgTGF0aW4tMS4KLQotRm9yIGV4cGVydHMsIHRoZXJlIGlzIGFsc28gYSByYXcgbW9kZSBqdXN0IGxpa2UgdGhlIG9uZSBmb3Igbm9ybWFsCi1zdHJpbmdzLiBZb3UgaGF2ZSB0byBwcmVmaXggdGhlIG9wZW5pbmcgcXVvdGUgd2l0aCAndXInIHRvIGhhdmUKLVB5dGhvbiB1c2UgdGhlIFxlbXBoe1Jhdy1Vbmljb2RlLUVzY2FwZX0gZW5jb2RpbmcuIEl0IHdpbGwgb25seSBhcHBseQotdGhlIGFib3ZlIFxjb2Rle1xlIHVYWFhYfSBjb252ZXJzaW9uIGlmIHRoZXJlIGlzIGFuIHVuZXZlbiBudW1iZXIgb2YKLWJhY2tzbGFzaGVzIGluIGZyb250IG9mIHRoZSBzbWFsbCAndScuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiB1cidIZWxsb1x1MDAyMFdvcmxkICEnCi11J0hlbGxvIFdvcmxkICEnCi0+Pj4gdXInSGVsbG9cXHUwMDIwV29ybGQgIScKLXUnSGVsbG9cXFxcdTAwMjBXb3JsZCAhJwotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIHJhdyBtb2RlIGlzIG1vc3QgdXNlZnVsIHdoZW4geW91IGhhdmUgdG8gZW50ZXIgbG90cyBvZgotYmFja3NsYXNoZXMsIGFzIGNhbiBiZSBuZWNlc3NhcnkgaW4gcmVndWxhciBleHByZXNzaW9ucy4KLQotQXBhcnQgZnJvbSB0aGVzZSBzdGFuZGFyZCBlbmNvZGluZ3MsIFB5dGhvbiBwcm92aWRlcyBhIHdob2xlIHNldCBvZgotb3RoZXIgd2F5cyBvZiBjcmVhdGluZyBVbmljb2RlIHN0cmluZ3Mgb24gdGhlIGJhc2lzIG9mIGEga25vd24KLWVuY29kaW5nLiAKLQotVGhlIGJ1aWx0LWluIGZ1bmN0aW9uIFxmdW5jdGlvbnt1bmljb2RlKCl9XGJpZnVuY2luZGV4e3VuaWNvZGV9IHByb3ZpZGVzCi1hY2Nlc3MgdG8gYWxsIHJlZ2lzdGVyZWQgVW5pY29kZSBjb2RlY3MgKENPZGVycyBhbmQgREVDb2RlcnMpLiBTb21lIG9mCi10aGUgbW9yZSB3ZWxsIGtub3duIGVuY29kaW5ncyB3aGljaCB0aGVzZSBjb2RlY3MgY2FuIGNvbnZlcnQgYXJlCi1cZW1waHtMYXRpbi0xfSwgXGVtcGh7QVNDSUl9LCBcZW1waHtVVEYtOH0sIGFuZCBcZW1waHtVVEYtMTZ9LgotVGhlIGxhdHRlciB0d28gYXJlIHZhcmlhYmxlLWxlbmd0aCBlbmNvZGluZ3MgdGhhdCBzdG9yZSBlYWNoIFVuaWNvZGUKLWNoYXJhY3RlciBpbiBvbmUgb3IgbW9yZSBieXRlcy4gVGhlIGRlZmF1bHQgZW5jb2RpbmcgaXMKLW5vcm1hbGx5IHNldCB0byBcQVNDSUksIHdoaWNoIHBhc3NlcyB0aHJvdWdoIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlCi0wIHRvIDEyNyBhbmQgcmVqZWN0cyBhbnkgb3RoZXIgY2hhcmFjdGVycyB3aXRoIGFuIGVycm9yLgotV2hlbiBhIFVuaWNvZGUgc3RyaW5nIGlzIHByaW50ZWQsIHdyaXR0ZW4gdG8gYSBmaWxlLCBvciBjb252ZXJ0ZWQKLXdpdGggXGZ1bmN0aW9ue3N0cigpfSwgY29udmVyc2lvbiB0YWtlcyBwbGFjZSB1c2luZyB0aGlzIGRlZmF1bHQgZW5jb2RpbmcuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiB1ImFiYyIKLXUnYWJjJwotPj4+IHN0cih1ImFiYyIpCi0nYWJjJwotPj4+IHUi5Pb8IgotdSdceGU0XHhmNlx4ZmMnCi0+Pj4gc3RyKHUi5Pb8IikKLVRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLSAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwotVW5pY29kZUVuY29kZUVycm9yOiAnYXNjaWknIGNvZGVjIGNhbid0IGVuY29kZSBjaGFyYWN0ZXJzIGluIHBvc2l0aW9uIDAtMjogb3JkaW5hbCBub3QgaW4gcmFuZ2UoMTI4KQotXGVuZHt2ZXJiYXRpbX0KLQotVG8gY29udmVydCBhIFVuaWNvZGUgc3RyaW5nIGludG8gYW4gOC1iaXQgc3RyaW5nIHVzaW5nIGEgc3BlY2lmaWMKLWVuY29kaW5nLCBVbmljb2RlIG9iamVjdHMgcHJvdmlkZSBhbiBcZnVuY3Rpb257ZW5jb2RlKCl9IG1ldGhvZAotdGhhdCB0YWtlcyBvbmUgYXJndW1lbnQsIHRoZSBuYW1lIG9mIHRoZSBlbmNvZGluZy4gIExvd2VyY2FzZSBuYW1lcwotZm9yIGVuY29kaW5ncyBhcmUgcHJlZmVycmVkLgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gdSLk9vwiLmVuY29kZSgndXRmLTgnKQotJ1x4YzNceGE0XHhjM1x4YjZceGMzXHhiYycKLVxlbmR7dmVyYmF0aW19Ci0KLUlmIHlvdSBoYXZlIGRhdGEgaW4gYSBzcGVjaWZpYyBlbmNvZGluZyBhbmQgd2FudCB0byBwcm9kdWNlIGEKLWNvcnJlc3BvbmRpbmcgVW5pY29kZSBzdHJpbmcgZnJvbSBpdCwgeW91IGNhbiB1c2UgdGhlCi1cZnVuY3Rpb257dW5pY29kZSgpfSBmdW5jdGlvbiB3aXRoIHRoZSBlbmNvZGluZyBuYW1lIGFzIHRoZSBzZWNvbmQKLWFyZ3VtZW50LgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gdW5pY29kZSgnXHhjM1x4YTRceGMzXHhiNlx4YzNceGJjJywgJ3V0Zi04JykKLXUnXHhlNFx4ZjZceGZjJwotXGVuZHt2ZXJiYXRpbX0KLQotXHN1YnNlY3Rpb257TGlzdHMgXGxhYmVse2xpc3RzfX0KLQotUHl0aG9uIGtub3dzIGEgbnVtYmVyIG9mIFxlbXBoe2NvbXBvdW5kfSBkYXRhIHR5cGVzLCB1c2VkIHRvIGdyb3VwCi10b2dldGhlciBvdGhlciB2YWx1ZXMuICBUaGUgbW9zdCB2ZXJzYXRpbGUgaXMgdGhlIFxlbXBoe2xpc3R9LCB3aGljaAotY2FuIGJlIHdyaXR0ZW4gYXMgYSBsaXN0IG9mIGNvbW1hLXNlcGFyYXRlZCB2YWx1ZXMgKGl0ZW1zKSBiZXR3ZWVuCi1zcXVhcmUgYnJhY2tldHMuICBMaXN0IGl0ZW1zIG5lZWQgbm90IGFsbCBoYXZlIHRoZSBzYW1lIHR5cGUuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBhID0gWydzcGFtJywgJ2VnZ3MnLCAxMDAsIDEyMzRdCi0+Pj4gYQotWydzcGFtJywgJ2VnZ3MnLCAxMDAsIDEyMzRdCi1cZW5ke3ZlcmJhdGltfQotCi1MaWtlIHN0cmluZyBpbmRpY2VzLCBsaXN0IGluZGljZXMgc3RhcnQgYXQgMCwgYW5kIGxpc3RzIGNhbiBiZSBzbGljZWQsCi1jb25jYXRlbmF0ZWQgYW5kIHNvIG9uOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gYVswXQotJ3NwYW0nCi0+Pj4gYVszXQotMTIzNAotPj4+IGFbLTJdCi0xMDAKLT4+PiBhWzE6LTFdCi1bJ2VnZ3MnLCAxMDBdCi0+Pj4gYVs6Ml0gKyBbJ2JhY29uJywgMioyXQotWydzcGFtJywgJ2VnZ3MnLCAnYmFjb24nLCA0XQotPj4+IDMqYVs6M10gKyBbJ0JvbyEnXQotWydzcGFtJywgJ2VnZ3MnLCAxMDAsICdzcGFtJywgJ2VnZ3MnLCAxMDAsICdzcGFtJywgJ2VnZ3MnLCAxMDAsICdCb28hJ10KLVxlbmR7dmVyYmF0aW19Ci0KLVVubGlrZSBzdHJpbmdzLCB3aGljaCBhcmUgXGVtcGh7aW1tdXRhYmxlfSwgaXQgaXMgcG9zc2libGUgdG8gY2hhbmdlCi1pbmRpdmlkdWFsIGVsZW1lbnRzIG9mIGEgbGlzdDoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGEKLVsnc3BhbScsICdlZ2dzJywgMTAwLCAxMjM0XQotPj4+IGFbMl0gPSBhWzJdICsgMjMKLT4+PiBhCi1bJ3NwYW0nLCAnZWdncycsIDEyMywgMTIzNF0KLVxlbmR7dmVyYmF0aW19Ci0KLUFzc2lnbm1lbnQgdG8gc2xpY2VzIGlzIGFsc28gcG9zc2libGUsIGFuZCB0aGlzIGNhbiBldmVuIGNoYW5nZSB0aGUgc2l6ZQotb2YgdGhlIGxpc3Qgb3IgY2xlYXIgaXQgZW50aXJlbHk6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiAjIFJlcGxhY2Ugc29tZSBpdGVtczoKLS4uLiBhWzA6Ml0gPSBbMSwgMTJdCi0+Pj4gYQotWzEsIDEyLCAxMjMsIDEyMzRdCi0+Pj4gIyBSZW1vdmUgc29tZToKLS4uLiBhWzA6Ml0gPSBbXQotPj4+IGEKLVsxMjMsIDEyMzRdCi0+Pj4gIyBJbnNlcnQgc29tZToKLS4uLiBhWzE6MV0gPSBbJ2JsZXRjaCcsICd4eXp6eSddCi0+Pj4gYQotWzEyMywgJ2JsZXRjaCcsICd4eXp6eScsIDEyMzRdCi0+Pj4gIyBJbnNlcnQgKGEgY29weSBvZikgaXRzZWxmIGF0IHRoZSBiZWdpbm5pbmcKLT4+PiBhWzowXSA9IGEKLT4+PiBhCi1bMTIzLCAnYmxldGNoJywgJ3h5enp5JywgMTIzNCwgMTIzLCAnYmxldGNoJywgJ3h5enp5JywgMTIzNF0KLT4+PiAjIENsZWFyIHRoZSBsaXN0OiByZXBsYWNlIGFsbCBpdGVtcyB3aXRoIGFuIGVtcHR5IGxpc3QKLT4+PiBhWzpdID0gW10KLT4+PiBhCi1bXQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGJ1aWx0LWluIGZ1bmN0aW9uIFxmdW5jdGlvbntsZW4oKX0gYWxzbyBhcHBsaWVzIHRvIGxpc3RzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gbGVuKGEpCi04Ci1cZW5ke3ZlcmJhdGltfQotCi1JdCBpcyBwb3NzaWJsZSB0byBuZXN0IGxpc3RzIChjcmVhdGUgbGlzdHMgY29udGFpbmluZyBvdGhlciBsaXN0cyksCi1mb3IgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHEgPSBbMiwgM10KLT4+PiBwID0gWzEsIHEsIDRdCi0+Pj4gbGVuKHApCi0zCi0+Pj4gcFsxXQotWzIsIDNdCi0+Pj4gcFsxXVswXQotMgotPj4+IHBbMV0uYXBwZW5kKCd4dHJhJykgICAgICMgU2VlIHNlY3Rpb24gNS4xCi0+Pj4gcAotWzEsIFsyLCAzLCAneHRyYSddLCA0XQotPj4+IHEKLVsyLCAzLCAneHRyYSddCi1cZW5ke3ZlcmJhdGltfQotCi1Ob3RlIHRoYXQgaW4gdGhlIGxhc3QgZXhhbXBsZSwgXGNvZGV7cFsxXX0gYW5kIFxjb2Rle3F9IHJlYWxseSByZWZlciB0bwotdGhlIHNhbWUgb2JqZWN0ISAgV2UnbGwgY29tZSBiYWNrIHRvIFxlbXBoe29iamVjdCBzZW1hbnRpY3N9IGxhdGVyLgotCi1cc2VjdGlvbntGaXJzdCBTdGVwcyBUb3dhcmRzIFByb2dyYW1taW5nIFxsYWJlbHtmaXJzdFN0ZXBzfX0KLQotT2YgY291cnNlLCB3ZSBjYW4gdXNlIFB5dGhvbiBmb3IgbW9yZSBjb21wbGljYXRlZCB0YXNrcyB0aGFuIGFkZGluZwotdHdvIGFuZCB0d28gdG9nZXRoZXIuICBGb3IgaW5zdGFuY2UsIHdlIGNhbiB3cml0ZSBhbiBpbml0aWFsCi1zdWItc2VxdWVuY2Ugb2YgdGhlIFxlbXBoe0ZpYm9uYWNjaX0gc2VyaWVzIGFzIGZvbGxvd3M6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiAjIEZpYm9uYWNjaSBzZXJpZXM6Ci0uLi4gIyB0aGUgc3VtIG9mIHR3byBlbGVtZW50cyBkZWZpbmVzIHRoZSBuZXh0Ci0uLi4gYSwgYiA9IDAsIDEKLT4+PiB3aGlsZSBiIDwgMTA6Ci0uLi4gICAgICAgcHJpbnQgYgotLi4uICAgICAgIGEsIGIgPSBiLCBhK2IKLS4uLiAKLTEKLTEKLTIKLTMKLTUKLTgKLVxlbmR7dmVyYmF0aW19Ci0KLVRoaXMgZXhhbXBsZSBpbnRyb2R1Y2VzIHNldmVyYWwgbmV3IGZlYXR1cmVzLgotCi1cYmVnaW57aXRlbWl6ZX0KLQotXGl0ZW0KLVRoZSBmaXJzdCBsaW5lIGNvbnRhaW5zIGEgXGVtcGh7bXVsdGlwbGUgYXNzaWdubWVudH06IHRoZSB2YXJpYWJsZXMKLVxjb2Rle2F9IGFuZCBcY29kZXtifSBzaW11bHRhbmVvdXNseSBnZXQgdGhlIG5ldyB2YWx1ZXMgMCBhbmQgMS4gIE9uIHRoZQotbGFzdCBsaW5lIHRoaXMgaXMgdXNlZCBhZ2FpbiwgZGVtb25zdHJhdGluZyB0aGF0IHRoZSBleHByZXNzaW9ucyBvbgotdGhlIHJpZ2h0LWhhbmQgc2lkZSBhcmUgYWxsIGV2YWx1YXRlZCBmaXJzdCBiZWZvcmUgYW55IG9mIHRoZQotYXNzaWdubWVudHMgdGFrZSBwbGFjZS4gIFRoZSByaWdodC1oYW5kIHNpZGUgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCAKLWZyb20gdGhlIGxlZnQgdG8gdGhlIHJpZ2h0LgotCi1caXRlbQotVGhlIFxrZXl3b3Jke3doaWxlfSBsb29wIGV4ZWN1dGVzIGFzIGxvbmcgYXMgdGhlIGNvbmRpdGlvbiAoaGVyZToKLVxjb2Rle2IgPCAxMH0pIHJlbWFpbnMgdHJ1ZS4gIEluIFB5dGhvbiwgbGlrZSBpbiBDLCBhbnkgbm9uLXplcm8KLWludGVnZXIgdmFsdWUgaXMgdHJ1ZTsgemVybyBpcyBmYWxzZS4gIFRoZSBjb25kaXRpb24gbWF5IGFsc28gYmUgYQotc3RyaW5nIG9yIGxpc3QgdmFsdWUsIGluIGZhY3QgYW55IHNlcXVlbmNlOyBhbnl0aGluZyB3aXRoIGEgbm9uLXplcm8KLWxlbmd0aCBpcyB0cnVlLCBlbXB0eSBzZXF1ZW5jZXMgYXJlIGZhbHNlLiAgVGhlIHRlc3QgdXNlZCBpbiB0aGUKLWV4YW1wbGUgaXMgYSBzaW1wbGUgY29tcGFyaXNvbi4gIFRoZSBzdGFuZGFyZCBjb21wYXJpc29uIG9wZXJhdG9ycyBhcmUKLXdyaXR0ZW4gdGhlIHNhbWUgYXMgaW4gQzogXGNvZGV7PH0gKGxlc3MgdGhhbiksIFxjb2Rlez59IChncmVhdGVyIHRoYW4pLAotXGNvZGV7PT19IChlcXVhbCB0byksIFxjb2Rlezw9fSAobGVzcyB0aGFuIG9yIGVxdWFsIHRvKSwKLVxjb2Rlez49fSAoZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvKSBhbmQgXGNvZGV7IT19IChub3QgZXF1YWwgdG8pLgotCi1caXRlbQotVGhlIFxlbXBoe2JvZHl9IG9mIHRoZSBsb29wIGlzIFxlbXBoe2luZGVudGVkfTogaW5kZW50YXRpb24gaXMgUHl0aG9uJ3MKLXdheSBvZiBncm91cGluZyBzdGF0ZW1lbnRzLiAgUHl0aG9uIGRvZXMgbm90ICh5ZXQhKSBwcm92aWRlIGFuCi1pbnRlbGxpZ2VudCBpbnB1dCBsaW5lIGVkaXRpbmcgZmFjaWxpdHksIHNvIHlvdSBoYXZlIHRvIHR5cGUgYSB0YWIgb3IKLXNwYWNlKHMpIGZvciBlYWNoIGluZGVudGVkIGxpbmUuICBJbiBwcmFjdGljZSB5b3Ugd2lsbCBwcmVwYXJlIG1vcmUKLWNvbXBsaWNhdGVkIGlucHV0IGZvciBQeXRob24gd2l0aCBhIHRleHQgZWRpdG9yOyBtb3N0IHRleHQgZWRpdG9ycyBoYXZlCi1hbiBhdXRvLWluZGVudCBmYWNpbGl0eS4gIFdoZW4gYSBjb21wb3VuZCBzdGF0ZW1lbnQgaXMgZW50ZXJlZAotaW50ZXJhY3RpdmVseSwgaXQgbXVzdCBiZSBmb2xsb3dlZCBieSBhIGJsYW5rIGxpbmUgdG8gaW5kaWNhdGUKLWNvbXBsZXRpb24gKHNpbmNlIHRoZSBwYXJzZXIgY2Fubm90IGd1ZXNzIHdoZW4geW91IGhhdmUgdHlwZWQgdGhlIGxhc3QKLWxpbmUpLiAgTm90ZSB0aGF0IGVhY2ggbGluZSB3aXRoaW4gYSBiYXNpYyBibG9jayBtdXN0IGJlIGluZGVudGVkIGJ5Ci10aGUgc2FtZSBhbW91bnQuCi0KLVxpdGVtCi1UaGUgXGtleXdvcmR7cHJpbnR9IHN0YXRlbWVudCB3cml0ZXMgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uKHMpIGl0IGlzCi1naXZlbi4gIEl0IGRpZmZlcnMgZnJvbSBqdXN0IHdyaXRpbmcgdGhlIGV4cHJlc3Npb24geW91IHdhbnQgdG8gd3JpdGUKLShhcyB3ZSBkaWQgZWFybGllciBpbiB0aGUgY2FsY3VsYXRvciBleGFtcGxlcykgaW4gdGhlIHdheSBpdCBoYW5kbGVzCi1tdWx0aXBsZSBleHByZXNzaW9ucyBhbmQgc3RyaW5ncy4gIFN0cmluZ3MgYXJlIHByaW50ZWQgd2l0aG91dCBxdW90ZXMsCi1hbmQgYSBzcGFjZSBpcyBpbnNlcnRlZCBiZXR3ZWVuIGl0ZW1zLCBzbyB5b3UgY2FuIGZvcm1hdCB0aGluZ3MgbmljZWx5LAotbGlrZSB0aGlzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gaSA9IDI1NioyNTYKLT4+PiBwcmludCAnVGhlIHZhbHVlIG9mIGkgaXMnLCBpCi1UaGUgdmFsdWUgb2YgaSBpcyA2NTUzNgotXGVuZHt2ZXJiYXRpbX0KLQotQSB0cmFpbGluZyBjb21tYSBhdm9pZHMgdGhlIG5ld2xpbmUgYWZ0ZXIgdGhlIG91dHB1dDoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGEsIGIgPSAwLCAxCi0+Pj4gd2hpbGUgYiA8IDEwMDA6Ci0uLi4gICAgIHByaW50IGIsCi0uLi4gICAgIGEsIGIgPSBiLCBhK2IKLS4uLiAKLTEgMSAyIDMgNSA4IDEzIDIxIDM0IDU1IDg5IDE0NCAyMzMgMzc3IDYxMCA5ODcKLVxlbmR7dmVyYmF0aW19Ci0KLU5vdGUgdGhhdCB0aGUgaW50ZXJwcmV0ZXIgaW5zZXJ0cyBhIG5ld2xpbmUgYmVmb3JlIGl0IHByaW50cyB0aGUgbmV4dAotcHJvbXB0IGlmIHRoZSBsYXN0IGxpbmUgd2FzIG5vdCBjb21wbGV0ZWQuCi0KLVxlbmR7aXRlbWl6ZX0KLQotCi1cY2hhcHRlcntNb3JlIENvbnRyb2wgRmxvdyBUb29scyBcbGFiZWx7bW9yZUNvbnRyb2x9fQotCi1CZXNpZGVzIHRoZSBca2V5d29yZHt3aGlsZX0gc3RhdGVtZW50IGp1c3QgaW50cm9kdWNlZCwgUHl0aG9uIGtub3dzCi10aGUgdXN1YWwgY29udHJvbCBmbG93IHN0YXRlbWVudHMga25vd24gZnJvbSBvdGhlciBsYW5ndWFnZXMsIHdpdGgKLXNvbWUgdHdpc3RzLgotCi1cc2VjdGlvbntca2V5d29yZHtpZn0gU3RhdGVtZW50cyBcbGFiZWx7aWZ9fQotCi1QZXJoYXBzIHRoZSBtb3N0IHdlbGwta25vd24gc3RhdGVtZW50IHR5cGUgaXMgdGhlCi1ca2V5d29yZHtpZn0gc3RhdGVtZW50LiAgRm9yIGV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBkZWYgcmF3X2lucHV0KHByb21wdCk6Ci0uLi4gICAgIGltcG9ydCBzeXMKLS4uLiAgICAgc3lzLnN0ZG91dC53cml0ZShwcm9tcHQpCi0uLi4gICAgIHN5cy5zdGRvdXQuZmx1c2goKQotLi4uICAgICByZXR1cm4gc3lzLnN0ZGluLnJlYWRsaW5lKCkKLS4uLiAKLT4+PiB4ID0gaW50KHJhd19pbnB1dCgiUGxlYXNlIGVudGVyIGFuIGludGVnZXI6ICIpKQotPj4+IGlmIHggPCAwOgotLi4uICAgICAgeCA9IDAKLS4uLiAgICAgIHByaW50ICdOZWdhdGl2ZSBjaGFuZ2VkIHRvIHplcm8nCi0uLi4gZWxpZiB4ID09IDA6Ci0uLi4gICAgICBwcmludCAnWmVybycKLS4uLiBlbGlmIHggPT0gMToKLS4uLiAgICAgIHByaW50ICdTaW5nbGUnCi0uLi4gZWxzZToKLS4uLiAgICAgIHByaW50ICdNb3JlJwotLi4uIAotXGVuZHt2ZXJiYXRpbX0KLQotVGhlcmUgY2FuIGJlIHplcm8gb3IgbW9yZSBca2V5d29yZHtlbGlmfSBwYXJ0cywgYW5kIHRoZQotXGtleXdvcmR7ZWxzZX0gcGFydCBpcyBvcHRpb25hbC4gIFRoZSBrZXl3b3JkIGBca2V5d29yZHtlbGlmfScgaXMKLXNob3J0IGZvciBgZWxzZSBpZicsIGFuZCBpcyB1c2VmdWwgdG8gYXZvaWQgZXhjZXNzaXZlIGluZGVudGF0aW9uLiAgQW4gCi1ca2V5d29yZHtpZn0gXGxkb3RzXCBca2V5d29yZHtlbGlmfSBcbGRvdHNcIFxrZXl3b3Jke2VsaWZ9IFxsZG90c1wgc2VxdWVuY2UKLSUgICAgV2VpcmQgc3BhY2luZ3MgaGFwcGVuIGhlcmUgaWYgdGhlIHdyYXBwaW5nIG9mIHRoZSBzb3VyY2UgdGV4dAotJSAgICBnZXRzIGNoYW5nZWQgaW4gdGhlIHdyb25nIHdheS4KLWlzIGEgc3Vic3RpdHV0ZSBmb3IgdGhlIFxrZXl3b3Jke3N3aXRjaH0gb3IKLVxrZXl3b3Jke2Nhc2V9IHN0YXRlbWVudHMgZm91bmQgaW4gb3RoZXIgbGFuZ3VhZ2VzLgotCi0KLVxzZWN0aW9ue1xrZXl3b3Jke2Zvcn0gU3RhdGVtZW50cyBcbGFiZWx7Zm9yfX0KLQotVGhlIFxrZXl3b3Jke2Zvcn1cc3RpbmRleHtmb3J9IHN0YXRlbWVudCBpbiBQeXRob24gZGlmZmVycyBhIGJpdCBmcm9tCi13aGF0IHlvdSBtYXkgYmUgdXNlZCB0byBpbiBDIG9yIFBhc2NhbC4gIFJhdGhlciB0aGFuIGFsd2F5cwotaXRlcmF0aW5nIG92ZXIgYW4gYXJpdGhtZXRpYyBwcm9ncmVzc2lvbiBvZiBudW1iZXJzIChsaWtlIGluIFBhc2NhbCksCi1vciBnaXZpbmcgdGhlIHVzZXIgdGhlIGFiaWxpdHkgdG8gZGVmaW5lIGJvdGggdGhlIGl0ZXJhdGlvbiBzdGVwIGFuZAotaGFsdGluZyBjb25kaXRpb24gKGFzIEMpLCBQeXRob24ncwotXGtleXdvcmR7Zm9yfVxzdGluZGV4e2Zvcn0gc3RhdGVtZW50IGl0ZXJhdGVzIG92ZXIgdGhlIGl0ZW1zIG9mIGFueQotc2VxdWVuY2UgKGEgbGlzdCBvciBhIHN0cmluZyksIGluIHRoZSBvcmRlciB0aGF0IHRoZXkgYXBwZWFyIGluCi10aGUgc2VxdWVuY2UuICBGb3IgZXhhbXBsZSAobm8gcHVuIGludGVuZGVkKToKLSUgT25lIHN1Z2dlc3Rpb24gd2FzIHRvIGdpdmUgYSByZWFsIEMgZXhhbXBsZSBoZXJlLCBidXQgdGhhdCBtYXkgb25seQotJSBzZXJ2ZSB0byBjb25mdXNlIG5vbi1DIHByb2dyYW1tZXJzLgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gIyBNZWFzdXJlIHNvbWUgc3RyaW5nczoKLS4uLiBhID0gWydjYXQnLCAnd2luZG93JywgJ2RlZmVuZXN0cmF0ZSddCi0+Pj4gZm9yIHggaW4gYToKLS4uLiAgICAgcHJpbnQgeCwgbGVuKHgpCi0uLi4gCi1jYXQgMwotd2luZG93IDYKLWRlZmVuZXN0cmF0ZSAxMgotXGVuZHt2ZXJiYXRpbX0KLQotSXQgaXMgbm90IHNhZmUgdG8gbW9kaWZ5IHRoZSBzZXF1ZW5jZSBiZWluZyBpdGVyYXRlZCBvdmVyIGluIHRoZSBsb29wCi0odGhpcyBjYW4gb25seSBoYXBwZW4gZm9yIG11dGFibGUgc2VxdWVuY2UgdHlwZXMsIHN1Y2ggYXMgbGlzdHMpLiAgSWYKLXlvdSBuZWVkIHRvIG1vZGlmeSB0aGUgbGlzdCB5b3UgYXJlIGl0ZXJhdGluZyBvdmVyIChmb3IgZXhhbXBsZSwgdG8KLWR1cGxpY2F0ZSBzZWxlY3RlZCBpdGVtcykgeW91IG11c3QgaXRlcmF0ZSBvdmVyIGEgY29weS4gIFRoZSBzbGljZQotbm90YXRpb24gbWFrZXMgdGhpcyBwYXJ0aWN1bGFybHkgY29udmVuaWVudDoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGZvciB4IGluIGFbOl06ICMgbWFrZSBhIHNsaWNlIGNvcHkgb2YgdGhlIGVudGlyZSBsaXN0Ci0uLi4gICAgaWYgbGVuKHgpID4gNjogYS5pbnNlcnQoMCwgeCkKLS4uLiAKLT4+PiBhCi1bJ2RlZmVuZXN0cmF0ZScsICdjYXQnLCAnd2luZG93JywgJ2RlZmVuZXN0cmF0ZSddCi1cZW5ke3ZlcmJhdGltfQotCi0KLVxzZWN0aW9ue1RoZSBcZnVuY3Rpb257cmFuZ2UoKX0gRnVuY3Rpb24gXGxhYmVse3JhbmdlfX0KLQotSWYgeW91IGRvIG5lZWQgdG8gaXRlcmF0ZSBvdmVyIGEgc2VxdWVuY2Ugb2YgbnVtYmVycywgdGhlIGJ1aWx0LWluCi1mdW5jdGlvbiBcZnVuY3Rpb257cmFuZ2UoKX0gY29tZXMgaW4gaGFuZHkuICBJdCBnZW5lcmF0ZXMgbGlzdHMKLWNvbnRhaW5pbmcgYXJpdGhtZXRpYyBwcm9ncmVzc2lvbnM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiByYW5nZSgxMCkKLVswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5XQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGdpdmVuIGVuZCBwb2ludCBpcyBuZXZlciBwYXJ0IG9mIHRoZSBnZW5lcmF0ZWQgbGlzdDsKLVxjb2Rle3JhbmdlKDEwKX0gZ2VuZXJhdGVzIGEgbGlzdCBvZiAxMCB2YWx1ZXMsIHRoZSBsZWdhbAotaW5kaWNlcyBmb3IgaXRlbXMgb2YgYSBzZXF1ZW5jZSBvZiBsZW5ndGggMTAuICBJdCBpcyBwb3NzaWJsZSB0byBsZXQKLXRoZSByYW5nZSBzdGFydCBhdCBhbm90aGVyIG51bWJlciwgb3IgdG8gc3BlY2lmeSBhIGRpZmZlcmVudCBpbmNyZW1lbnQKLShldmVuIG5lZ2F0aXZlOyBzb21ldGltZXMgdGhpcyBpcyBjYWxsZWQgdGhlIGBzdGVwJyk6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiByYW5nZSg1LCAxMCkKLVs1LCA2LCA3LCA4LCA5XQotPj4+IHJhbmdlKDAsIDEwLCAzKQotWzAsIDMsIDYsIDldCi0+Pj4gcmFuZ2UoLTEwLCAtMTAwLCAtMzApCi1bLTEwLCAtNDAsIC03MF0KLVxlbmR7dmVyYmF0aW19Ci0KLVRvIGl0ZXJhdGUgb3ZlciB0aGUgaW5kaWNlcyBvZiBhIHNlcXVlbmNlLCBjb21iaW5lCi1cZnVuY3Rpb257cmFuZ2UoKX0gYW5kIFxmdW5jdGlvbntsZW4oKX0gYXMgZm9sbG93czoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGEgPSBbJ01hcnknLCAnaGFkJywgJ2EnLCAnbGl0dGxlJywgJ2xhbWInXQotPj4+IGZvciBpIGluIHJhbmdlKGxlbihhKSk6Ci0uLi4gICAgIHByaW50IGksIGFbaV0KLS4uLiAKLTAgTWFyeQotMSBoYWQKLTIgYQotMyBsaXR0bGUKLTQgbGFtYgotXGVuZHt2ZXJiYXRpbX0KLQotCi1cc2VjdGlvbntca2V5d29yZHticmVha30gYW5kIFxrZXl3b3Jke2NvbnRpbnVlfSBTdGF0ZW1lbnRzLCBhbmQKLSAgICAgICAgIFxrZXl3b3Jke2Vsc2V9IENsYXVzZXMgb24gTG9vcHMKLSAgICAgICAgIFxsYWJlbHticmVha319Ci0KLVRoZSBca2V5d29yZHticmVha30gc3RhdGVtZW50LCBsaWtlIGluIEMsIGJyZWFrcyBvdXQgb2YgdGhlIHNtYWxsZXN0Ci1lbmNsb3NpbmcgXGtleXdvcmR7Zm9yfSBvciBca2V5d29yZHt3aGlsZX0gbG9vcC4KLQotVGhlIFxrZXl3b3Jke2NvbnRpbnVlfSBzdGF0ZW1lbnQsIGFsc28gYm9ycm93ZWQgZnJvbSBDLCBjb250aW51ZXMKLXdpdGggdGhlIG5leHQgaXRlcmF0aW9uIG9mIHRoZSBsb29wLgotCi1Mb29wIHN0YXRlbWVudHMgbWF5IGhhdmUgYW4gXGNvZGV7ZWxzZX0gY2xhdXNlOyBpdCBpcyBleGVjdXRlZCB3aGVuCi10aGUgbG9vcCB0ZXJtaW5hdGVzIHRocm91Z2ggZXhoYXVzdGlvbiBvZiB0aGUgbGlzdCAod2l0aAotXGtleXdvcmR7Zm9yfSkgb3Igd2hlbiB0aGUgY29uZGl0aW9uIGJlY29tZXMgZmFsc2UgKHdpdGgKLVxrZXl3b3Jke3doaWxlfSksIGJ1dCBub3Qgd2hlbiB0aGUgbG9vcCBpcyB0ZXJtaW5hdGVkIGJ5IGEKLVxrZXl3b3Jke2JyZWFrfSBzdGF0ZW1lbnQuICBUaGlzIGlzIGV4ZW1wbGlmaWVkIGJ5IHRoZSBmb2xsb3dpbmcgbG9vcCwKLXdoaWNoIHNlYXJjaGVzIGZvciBwcmltZSBudW1iZXJzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZm9yIG4gaW4gcmFuZ2UoMiwgMTApOgotLi4uICAgICBmb3IgeCBpbiByYW5nZSgyLCBuKToKLS4uLiAgICAgICAgIGlmIG4gJSB4ID09IDA6Ci0uLi4gICAgICAgICAgICAgcHJpbnQgbiwgJ2VxdWFscycsIHgsICcqJywgbi94Ci0uLi4gICAgICAgICAgICAgYnJlYWsKLS4uLiAgICAgZWxzZToKLS4uLiAgICAgICAgICMgbG9vcCBmZWxsIHRocm91Z2ggd2l0aG91dCBmaW5kaW5nIGEgZmFjdG9yCi0uLi4gICAgICAgICBwcmludCBuLCAnaXMgYSBwcmltZSBudW1iZXInCi0uLi4gCi0yIGlzIGEgcHJpbWUgbnVtYmVyCi0zIGlzIGEgcHJpbWUgbnVtYmVyCi00IGVxdWFscyAyICogMgotNSBpcyBhIHByaW1lIG51bWJlcgotNiBlcXVhbHMgMiAqIDMKLTcgaXMgYSBwcmltZSBudW1iZXIKLTggZXF1YWxzIDIgKiA0Ci05IGVxdWFscyAzICogMwotXGVuZHt2ZXJiYXRpbX0KLQotCi1cc2VjdGlvbntca2V5d29yZHtwYXNzfSBTdGF0ZW1lbnRzIFxsYWJlbHtwYXNzfX0KLQotVGhlIFxrZXl3b3Jke3Bhc3N9IHN0YXRlbWVudCBkb2VzIG5vdGhpbmcuCi1JdCBjYW4gYmUgdXNlZCB3aGVuIGEgc3RhdGVtZW50IGlzIHJlcXVpcmVkIHN5bnRhY3RpY2FsbHkgYnV0IHRoZQotcHJvZ3JhbSByZXF1aXJlcyBubyBhY3Rpb24uCi1Gb3IgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHdoaWxlIFRydWU6Ci0uLi4gICAgICAgcGFzcyAjIEJ1c3ktd2FpdCBmb3Iga2V5Ym9hcmQgaW50ZXJydXB0Ci0uLi4gCi1cZW5ke3ZlcmJhdGltfQotCi0KLVxzZWN0aW9ue0RlZmluaW5nIEZ1bmN0aW9ucyBcbGFiZWx7ZnVuY3Rpb25zfX0KLQotV2UgY2FuIGNyZWF0ZSBhIGZ1bmN0aW9uIHRoYXQgd3JpdGVzIHRoZSBGaWJvbmFjY2kgc2VyaWVzIHRvIGFuCi1hcmJpdHJhcnkgYm91bmRhcnk6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBkZWYgZmliKG4pOiAgICAjIHdyaXRlIEZpYm9uYWNjaSBzZXJpZXMgdXAgdG8gbgotLi4uICAgICAiIiJQcmludCBhIEZpYm9uYWNjaSBzZXJpZXMgdXAgdG8gbi4iIiIKLS4uLiAgICAgYSwgYiA9IDAsIDEKLS4uLiAgICAgd2hpbGUgYiA8IG46Ci0uLi4gICAgICAgICBwcmludCBiLAotLi4uICAgICAgICAgYSwgYiA9IGIsIGErYgotLi4uIAotPj4+ICMgTm93IGNhbGwgdGhlIGZ1bmN0aW9uIHdlIGp1c3QgZGVmaW5lZDoKLS4uLiBmaWIoMjAwMCkKLTEgMSAyIDMgNSA4IDEzIDIxIDM0IDU1IDg5IDE0NCAyMzMgMzc3IDYxMCA5ODcgMTU5NwotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGtleXdvcmQgXGtleXdvcmR7ZGVmfSBpbnRyb2R1Y2VzIGEgZnVuY3Rpb24gXGVtcGh7ZGVmaW5pdGlvbn0uICBJdAotbXVzdCBiZSBmb2xsb3dlZCBieSB0aGUgZnVuY3Rpb24gbmFtZSBhbmQgdGhlIHBhcmVudGhlc2l6ZWQgbGlzdCBvZgotZm9ybWFsIHBhcmFtZXRlcnMuICBUaGUgc3RhdGVtZW50cyB0aGF0IGZvcm0gdGhlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uCi1zdGFydCBhdCB0aGUgbmV4dCBsaW5lLCBhbmQgbXVzdCBiZSBpbmRlbnRlZC4gIFRoZSBmaXJzdCBzdGF0ZW1lbnQgb2YKLXRoZSBmdW5jdGlvbiBib2R5IGNhbiBvcHRpb25hbGx5IGJlIGEgc3RyaW5nIGxpdGVyYWw7IHRoaXMgc3RyaW5nCi1saXRlcmFsIGlzIHRoZSBmdW5jdGlvbidzIFxpbmRleHtkb2N1bWVudGF0aW9uIHN0cmluZ3N9ZG9jdW1lbnRhdGlvbgotc3RyaW5nLCBvciBcZGZue2RvY3N0cmluZ30uXGluZGV4e2RvY3N0cmluZ3N9XGluZGV4e3N0cmluZ3MsIGRvY3VtZW50YXRpb259Ci0KLVRoZXJlIGFyZSB0b29scyB3aGljaCB1c2UgZG9jc3RyaW5ncyB0byBhdXRvbWF0aWNhbGx5IHByb2R1Y2Ugb25saW5lCi1vciBwcmludGVkIGRvY3VtZW50YXRpb24sIG9yIHRvIGxldCB0aGUgdXNlciBpbnRlcmFjdGl2ZWx5IGJyb3dzZQotdGhyb3VnaCBjb2RlOyBpdCdzIGdvb2QgcHJhY3RpY2UgdG8gaW5jbHVkZSBkb2NzdHJpbmdzIGluIGNvZGUgdGhhdAoteW91IHdyaXRlLCBzbyB0cnkgdG8gbWFrZSBhIGhhYml0IG9mIGl0LgotCi1UaGUgXGVtcGh7ZXhlY3V0aW9ufSBvZiBhIGZ1bmN0aW9uIGludHJvZHVjZXMgYSBuZXcgc3ltYm9sIHRhYmxlIHVzZWQKLWZvciB0aGUgbG9jYWwgdmFyaWFibGVzIG9mIHRoZSBmdW5jdGlvbi4gIE1vcmUgcHJlY2lzZWx5LCBhbGwgdmFyaWFibGUKLWFzc2lnbm1lbnRzIGluIGEgZnVuY3Rpb24gc3RvcmUgdGhlIHZhbHVlIGluIHRoZSBsb2NhbCBzeW1ib2wgdGFibGU7Ci13aGVyZWFzIHZhcmlhYmxlIHJlZmVyZW5jZXMgZmlyc3QgbG9vayBpbiB0aGUgbG9jYWwgc3ltYm9sIHRhYmxlLCB0aGVuCi1pbiB0aGUgZ2xvYmFsIHN5bWJvbCB0YWJsZSwgYW5kIHRoZW4gaW4gdGhlIHRhYmxlIG9mIGJ1aWx0LWluIG5hbWVzLgotVGh1cywgIGdsb2JhbCB2YXJpYWJsZXMgY2Fubm90IGJlIGRpcmVjdGx5IGFzc2lnbmVkIGEgdmFsdWUgd2l0aGluIGEKLWZ1bmN0aW9uICh1bmxlc3MgbmFtZWQgaW4gYSBca2V5d29yZHtnbG9iYWx9IHN0YXRlbWVudCksIGFsdGhvdWdoCi10aGV5IG1heSBiZSByZWZlcmVuY2VkLgotCi1UaGUgYWN0dWFsIHBhcmFtZXRlcnMgKGFyZ3VtZW50cykgdG8gYSBmdW5jdGlvbiBjYWxsIGFyZSBpbnRyb2R1Y2VkIGluCi10aGUgbG9jYWwgc3ltYm9sIHRhYmxlIG9mIHRoZSBjYWxsZWQgZnVuY3Rpb24gd2hlbiBpdCBpcyBjYWxsZWQ7IHRodXMsCi1hcmd1bWVudHMgYXJlIHBhc3NlZCB1c2luZyBcZW1waHtjYWxsIGJ5IHZhbHVlfSAod2hlcmUgdGhlCi1cZW1waHt2YWx1ZX0gaXMgYWx3YXlzIGFuIG9iamVjdCBcZW1waHtyZWZlcmVuY2V9LCBub3QgdGhlIHZhbHVlIG9mCi10aGUgb2JqZWN0KS5cZm9vdG5vdGV7Ci0gICAgICAgICBBY3R1YWxseSwgXGVtcGh7Y2FsbCBieSBvYmplY3QgcmVmZXJlbmNlfSB3b3VsZCBiZSBhIGJldHRlcgotICAgICAgICAgZGVzY3JpcHRpb24sIHNpbmNlIGlmIGEgbXV0YWJsZSBvYmplY3QgaXMgcGFzc2VkLCB0aGUgY2FsbGVyCi0gICAgICAgICB3aWxsIHNlZSBhbnkgY2hhbmdlcyB0aGUgY2FsbGVlIG1ha2VzIHRvIGl0IChpdGVtcwotICAgICAgICAgaW5zZXJ0ZWQgaW50byBhIGxpc3QpLgotfSBXaGVuIGEgZnVuY3Rpb24gY2FsbHMgYW5vdGhlciBmdW5jdGlvbiwgYSBuZXcgbG9jYWwgc3ltYm9sIHRhYmxlIGlzCi1jcmVhdGVkIGZvciB0aGF0IGNhbGwuCi0KLUEgZnVuY3Rpb24gZGVmaW5pdGlvbiBpbnRyb2R1Y2VzIHRoZSBmdW5jdGlvbiBuYW1lIGluIHRoZSBjdXJyZW50Ci1zeW1ib2wgdGFibGUuICBUaGUgdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIG5hbWUKLWhhcyBhIHR5cGUgdGhhdCBpcyByZWNvZ25pemVkIGJ5IHRoZSBpbnRlcnByZXRlciBhcyBhIHVzZXItZGVmaW5lZAotZnVuY3Rpb24uICBUaGlzIHZhbHVlIGNhbiBiZSBhc3NpZ25lZCB0byBhbm90aGVyIG5hbWUgd2hpY2ggY2FuIHRoZW4KLWFsc28gYmUgdXNlZCBhcyBhIGZ1bmN0aW9uLiAgVGhpcyBzZXJ2ZXMgYXMgYSBnZW5lcmFsIHJlbmFtaW5nCi1tZWNoYW5pc206Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBmaWIKLTxmdW5jdGlvbiBmaWIgYXQgMTAwNDJlZDA+Ci0+Pj4gZiA9IGZpYgotPj4+IGYoMTAwKQotMSAxIDIgMyA1IDggMTMgMjEgMzQgNTUgODkKLVxlbmR7dmVyYmF0aW19Ci0KLVlvdSBtaWdodCBvYmplY3QgdGhhdCBcY29kZXtmaWJ9IGlzIG5vdCBhIGZ1bmN0aW9uIGJ1dCBhIHByb2NlZHVyZS4gIEluCi1QeXRob24sIGxpa2UgaW4gQywgcHJvY2VkdXJlcyBhcmUganVzdCBmdW5jdGlvbnMgdGhhdCBkb24ndCByZXR1cm4gYQotdmFsdWUuICBJbiBmYWN0LCB0ZWNobmljYWxseSBzcGVha2luZywgcHJvY2VkdXJlcyBkbyByZXR1cm4gYSB2YWx1ZSwKLWFsYmVpdCBhIHJhdGhlciBib3Jpbmcgb25lLiAgVGhpcyB2YWx1ZSBpcyBjYWxsZWQgXGNvZGV7Tm9uZX0gKGl0J3MgYQotYnVpbHQtaW4gbmFtZSkuICBXcml0aW5nIHRoZSB2YWx1ZSBcY29kZXtOb25lfSBpcyBub3JtYWxseSBzdXBwcmVzc2VkIGJ5Ci10aGUgaW50ZXJwcmV0ZXIgaWYgaXQgd291bGQgYmUgdGhlIG9ubHkgdmFsdWUgd3JpdHRlbi4gIFlvdSBjYW4gc2VlIGl0Ci1pZiB5b3UgcmVhbGx5IHdhbnQgdG86Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBwcmludCBmaWIoMCkKLU5vbmUKLVxlbmR7dmVyYmF0aW19Ci0KLUl0IGlzIHNpbXBsZSB0byB3cml0ZSBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGxpc3Qgb2YgdGhlIG51bWJlcnMgb2YKLXRoZSBGaWJvbmFjY2kgc2VyaWVzLCBpbnN0ZWFkIG9mIHByaW50aW5nIGl0OgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZGVmIGZpYjIobik6ICMgcmV0dXJuIEZpYm9uYWNjaSBzZXJpZXMgdXAgdG8gbgotLi4uICAgICAiIiJSZXR1cm4gYSBsaXN0IGNvbnRhaW5pbmcgdGhlIEZpYm9uYWNjaSBzZXJpZXMgdXAgdG8gbi4iIiIKLS4uLiAgICAgcmVzdWx0ID0gW10KLS4uLiAgICAgYSwgYiA9IDAsIDEKLS4uLiAgICAgd2hpbGUgYiA8IG46Ci0uLi4gICAgICAgICByZXN1bHQuYXBwZW5kKGIpICAgICMgc2VlIGJlbG93Ci0uLi4gICAgICAgICBhLCBiID0gYiwgYStiCi0uLi4gICAgIHJldHVybiByZXN1bHQKLS4uLiAKLT4+PiBmMTAwID0gZmliMigxMDApICAgICMgY2FsbCBpdAotPj4+IGYxMDAgICAgICAgICAgICAgICAgIyB3cml0ZSB0aGUgcmVzdWx0Ci1bMSwgMSwgMiwgMywgNSwgOCwgMTMsIDIxLCAzNCwgNTUsIDg5XQotXGVuZHt2ZXJiYXRpbX0KLQotVGhpcyBleGFtcGxlLCBhcyB1c3VhbCwgZGVtb25zdHJhdGVzIHNvbWUgbmV3IFB5dGhvbiBmZWF0dXJlczoKLQotXGJlZ2lue2l0ZW1pemV9Ci0KLVxpdGVtCi1UaGUgXGtleXdvcmR7cmV0dXJufSBzdGF0ZW1lbnQgcmV0dXJucyB3aXRoIGEgdmFsdWUgZnJvbSBhIGZ1bmN0aW9uLgotXGtleXdvcmR7cmV0dXJufSB3aXRob3V0IGFuIGV4cHJlc3Npb24gYXJndW1lbnQgcmV0dXJucyBcY29kZXtOb25lfS4KLUZhbGxpbmcgb2ZmIHRoZSBlbmQgb2YgYSBwcm9jZWR1cmUgYWxzbyByZXR1cm5zIFxjb2Rle05vbmV9LgotCi1caXRlbQotVGhlIHN0YXRlbWVudCBcY29kZXtyZXN1bHQuYXBwZW5kKGIpfSBjYWxscyBhIFxlbXBoe21ldGhvZH0gb2YgdGhlIGxpc3QKLW9iamVjdCBcY29kZXtyZXN1bHR9LiAgQSBtZXRob2QgaXMgYSBmdW5jdGlvbiB0aGF0IGBiZWxvbmdzJyB0byBhbgotb2JqZWN0IGFuZCBpcyBuYW1lZCBcY29kZXtvYmoubWV0aG9kbmFtZX0sIHdoZXJlIFxjb2Rle29ian0gaXMgc29tZQotb2JqZWN0ICh0aGlzIG1heSBiZSBhbiBleHByZXNzaW9uKSwgYW5kIFxjb2Rle21ldGhvZG5hbWV9IGlzIHRoZSBuYW1lCi1vZiBhIG1ldGhvZCB0aGF0IGlzIGRlZmluZWQgYnkgdGhlIG9iamVjdCdzIHR5cGUuICBEaWZmZXJlbnQgdHlwZXMKLWRlZmluZSBkaWZmZXJlbnQgbWV0aG9kcy4gIE1ldGhvZHMgb2YgZGlmZmVyZW50IHR5cGVzIG1heSBoYXZlIHRoZQotc2FtZSBuYW1lIHdpdGhvdXQgY2F1c2luZyBhbWJpZ3VpdHkuICAoSXQgaXMgcG9zc2libGUgdG8gZGVmaW5lIHlvdXIKLW93biBvYmplY3QgdHlwZXMgYW5kIG1ldGhvZHMsIHVzaW5nIFxlbXBoe2NsYXNzZXN9LCBhcyBkaXNjdXNzZWQgbGF0ZXIKLWluIHRoaXMgdHV0b3JpYWwuKQotVGhlIG1ldGhvZCBcbWV0aG9ke2FwcGVuZCgpfSBzaG93biBpbiB0aGUgZXhhbXBsZSBpcyBkZWZpbmVkIGZvcgotbGlzdCBvYmplY3RzOyBpdCBhZGRzIGEgbmV3IGVsZW1lbnQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdC4gIEluIHRoaXMKLWV4YW1wbGUgaXQgaXMgZXF1aXZhbGVudCB0byBcc2FtcHtyZXN1bHQgPSByZXN1bHQgKyBbYl19LCBidXQgbW9yZQotZWZmaWNpZW50LgotCi1cZW5ke2l0ZW1pemV9Ci0KLVxzZWN0aW9ue01vcmUgb24gRGVmaW5pbmcgRnVuY3Rpb25zIFxsYWJlbHtkZWZpbmluZ319Ci0KLUl0IGlzIGFsc28gcG9zc2libGUgdG8gZGVmaW5lIGZ1bmN0aW9ucyB3aXRoIGEgdmFyaWFibGUgbnVtYmVyIG9mCi1hcmd1bWVudHMuICBUaGVyZSBhcmUgdGhyZWUgZm9ybXMsIHdoaWNoIGNhbiBiZSBjb21iaW5lZC4KLQotXHN1YnNlY3Rpb257RGVmYXVsdCBBcmd1bWVudCBWYWx1ZXMgXGxhYmVse2RlZmF1bHRBcmdzfX0KLQotVGhlIG1vc3QgdXNlZnVsIGZvcm0gaXMgdG8gc3BlY2lmeSBhIGRlZmF1bHQgdmFsdWUgZm9yIG9uZSBvciBtb3JlCi1hcmd1bWVudHMuICBUaGlzIGNyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBjYWxsZWQgd2l0aCBmZXdlcgotYXJndW1lbnRzIHRoYW4gaXQgaXMgZGVmaW5lZCB0byBhbGxvdy4gIEZvciBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1kZWYgcmF3X2lucHV0KHByb21wdCk6Ci0gICAgaW1wb3J0IHN5cwotICAgIHN5cy5zdGRvdXQud3JpdGUocHJvbXB0KQotICAgIHN5cy5zdGRvdXQuZmx1c2goKQotICAgIHJldHVybiBzeXMuc3RkaW4ucmVhZGxpbmUoKQotCi1kZWYgYXNrX29rKHByb21wdCwgcmV0cmllcz00LCBjb21wbGFpbnQ9J1llcyBvciBubywgcGxlYXNlIScpOgotICAgIHdoaWxlIFRydWU6Ci0gICAgICAgIG9rID0gcmF3X2lucHV0KHByb21wdCkKLSAgICAgICAgaWYgb2sgaW4gKCd5JywgJ3llJywgJ3llcycpOiByZXR1cm4gVHJ1ZQotICAgICAgICBpZiBvayBpbiAoJ24nLCAnbm8nLCAnbm9wJywgJ25vcGUnKTogcmV0dXJuIEZhbHNlCi0gICAgICAgIHJldHJpZXMgPSByZXRyaWVzIC0gMQotICAgICAgICBpZiByZXRyaWVzIDwgMDogcmFpc2UgSU9FcnJvciwgJ3JlZnVzZW5payB1c2VyJwotICAgICAgICBwcmludCBjb21wbGFpbnQKLVxlbmR7dmVyYmF0aW19Ci0KLVRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBlaXRoZXIgbGlrZSB0aGlzOgotXGNvZGV7YXNrX29rKCdEbyB5b3UgcmVhbGx5IHdhbnQgdG8gcXVpdD8nKX0gb3IgbGlrZSB0aGlzOgotXGNvZGV7YXNrX29rKCdPSyB0byBvdmVyd3JpdGUgdGhlIGZpbGU/JywgMil9LgotCi1UaGlzIGV4YW1wbGUgYWxzbyBpbnRyb2R1Y2VzIHRoZSBca2V5d29yZHtpbn0ga2V5d29yZC4gVGhpcyB0ZXN0cwotd2hldGhlciBvciBub3QgYSBzZXF1ZW5jZSBjb250YWlucyBhIGNlcnRhaW4gdmFsdWUuCi0KLVRoZSBkZWZhdWx0IHZhbHVlcyBhcmUgZXZhbHVhdGVkIGF0IHRoZSBwb2ludCBvZiBmdW5jdGlvbiBkZWZpbml0aW9uCi1pbiB0aGUgXGVtcGh7ZGVmaW5pbmd9IHNjb3BlLCBzbyB0aGF0Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWkgPSA1Ci0KLWRlZiBmKGFyZz1pKToKLSAgICBwcmludCBhcmcKLQotaSA9IDYKLWYoKQotXGVuZHt2ZXJiYXRpbX0KLQotd2lsbCBwcmludCBcY29kZXs1fS4KLQotXHN0cm9uZ3tJbXBvcnRhbnQgd2FybmluZzp9ICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBldmFsdWF0ZWQgb25seSBvbmNlLgotVGhpcyBtYWtlcyBhIGRpZmZlcmVuY2Ugd2hlbiB0aGUgZGVmYXVsdCBpcyBhIG11dGFibGUgb2JqZWN0IHN1Y2ggYXMgYQotbGlzdCwgZGljdGlvbmFyeSwgb3IgaW5zdGFuY2VzIG9mIG1vc3QgY2xhc3Nlcy4gIEZvciBleGFtcGxlLCB0aGUKLWZvbGxvd2luZyBmdW5jdGlvbiBhY2N1bXVsYXRlcyB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byBpdCBvbgotc3Vic2VxdWVudCBjYWxsczoKLQotXGJlZ2lue3ZlcmJhdGltfQotZGVmIGYoYSwgTD1bXSk6Ci0gICAgTC5hcHBlbmQoYSkKLSAgICByZXR1cm4gTAotCi1wcmludCBmKDEpCi1wcmludCBmKDIpCi1wcmludCBmKDMpCi1cZW5ke3ZlcmJhdGltfQotCi1UaGlzIHdpbGwgcHJpbnQKLQotXGJlZ2lue3ZlcmJhdGltfQotWzFdCi1bMSwgMl0KLVsxLCAyLCAzXQotXGVuZHt2ZXJiYXRpbX0KLQotSWYgeW91IGRvbid0IHdhbnQgdGhlIGRlZmF1bHQgdG8gYmUgc2hhcmVkIGJldHdlZW4gc3Vic2VxdWVudCBjYWxscywKLXlvdSBjYW4gd3JpdGUgdGhlIGZ1bmN0aW9uIGxpa2UgdGhpcyBpbnN0ZWFkOgotCi1cYmVnaW57dmVyYmF0aW19Ci1kZWYgZihhLCBMPU5vbmUpOgotICAgIGlmIEwgaXMgTm9uZToKLSAgICAgICAgTCA9IFtdCi0gICAgTC5hcHBlbmQoYSkKLSAgICByZXR1cm4gTAotXGVuZHt2ZXJiYXRpbX0KLQotXHN1YnNlY3Rpb257S2V5d29yZCBBcmd1bWVudHMgXGxhYmVse2tleXdvcmRBcmdzfX0KLQotRnVuY3Rpb25zIGNhbiBhbHNvIGJlIGNhbGxlZCB1c2luZwota2V5d29yZCBhcmd1bWVudHMgb2YgdGhlIGZvcm0gXHNhbXB7XHZhcntrZXl3b3JkfSA9IFx2YXJ7dmFsdWV9fS4gIEZvcgotaW5zdGFuY2UsIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb246Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWRlZiBwYXJyb3Qodm9sdGFnZSwgc3RhdGU9J2Egc3RpZmYnLCBhY3Rpb249J3Zvb20nLCB0eXBlPSdOb3J3ZWdpYW4gQmx1ZScpOgotICAgIHByaW50ICItLSBUaGlzIHBhcnJvdCB3b3VsZG4ndCIsIGFjdGlvbiwKLSAgICBwcmludCAiaWYgeW91IHB1dCIsIHZvbHRhZ2UsICJ2b2x0cyB0aHJvdWdoIGl0LiIKLSAgICBwcmludCAiLS0gTG92ZWx5IHBsdW1hZ2UsIHRoZSIsIHR5cGUKLSAgICBwcmludCAiLS0gSXQncyIsIHN0YXRlLCAiISIKLVxlbmR7dmVyYmF0aW19Ci0KLWNvdWxkIGJlIGNhbGxlZCBpbiBhbnkgb2YgdGhlIGZvbGxvd2luZyB3YXlzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1wYXJyb3QoMTAwMCkKLXBhcnJvdChhY3Rpb24gPSAnVk9PT09PTScsIHZvbHRhZ2UgPSAxMDAwMDAwKQotcGFycm90KCdhIHRob3VzYW5kJywgc3RhdGUgPSAncHVzaGluZyB1cCB0aGUgZGFpc2llcycpCi1wYXJyb3QoJ2EgbWlsbGlvbicsICdiZXJlZnQgb2YgbGlmZScsICdqdW1wJykKLVxlbmR7dmVyYmF0aW19Ci0KLWJ1dCB0aGUgZm9sbG93aW5nIGNhbGxzIHdvdWxkIGFsbCBiZSBpbnZhbGlkOgotCi1cYmVnaW57dmVyYmF0aW19Ci1wYXJyb3QoKSAgICAgICAgICAgICAgICAgICAgICMgcmVxdWlyZWQgYXJndW1lbnQgbWlzc2luZwotcGFycm90KHZvbHRhZ2U9NS4wLCAnZGVhZCcpICAjIG5vbi1rZXl3b3JkIGFyZ3VtZW50IGZvbGxvd2luZyBrZXl3b3JkCi1wYXJyb3QoMTEwLCB2b2x0YWdlPTIyMCkgICAgICMgZHVwbGljYXRlIHZhbHVlIGZvciBhcmd1bWVudAotcGFycm90KGFjdG9yPSdKb2huIENsZWVzZScpICAjIHVua25vd24ga2V5d29yZAotXGVuZHt2ZXJiYXRpbX0KLQotSW4gZ2VuZXJhbCwgYW4gYXJndW1lbnQgbGlzdCBtdXN0IGhhdmUgYW55IHBvc2l0aW9uYWwgYXJndW1lbnRzCi1mb2xsb3dlZCBieSBhbnkga2V5d29yZCBhcmd1bWVudHMsIHdoZXJlIHRoZSBrZXl3b3JkcyBtdXN0IGJlIGNob3NlbgotZnJvbSB0aGUgZm9ybWFsIHBhcmFtZXRlciBuYW1lcy4gIEl0J3Mgbm90IGltcG9ydGFudCB3aGV0aGVyIGEgZm9ybWFsCi1wYXJhbWV0ZXIgaGFzIGEgZGVmYXVsdCB2YWx1ZSBvciBub3QuICBObyBhcmd1bWVudCBtYXkgcmVjZWl2ZSBhCi12YWx1ZSBtb3JlIHRoYW4gb25jZSAtLS0gZm9ybWFsIHBhcmFtZXRlciBuYW1lcyBjb3JyZXNwb25kaW5nIHRvCi1wb3NpdGlvbmFsIGFyZ3VtZW50cyBjYW5ub3QgYmUgdXNlZCBhcyBrZXl3b3JkcyBpbiB0aGUgc2FtZSBjYWxscy4KLUhlcmUncyBhbiBleGFtcGxlIHRoYXQgZmFpbHMgZHVlIHRvIHRoaXMgcmVzdHJpY3Rpb246Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBkZWYgZnVuY3Rpb24oYSk6Ci0uLi4gICAgIHBhc3MKLS4uLiAKLT4+PiBmdW5jdGlvbigwLCBhPTApCi1UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KLVR5cGVFcnJvcjogZnVuY3Rpb24oKSBnb3QgbXVsdGlwbGUgdmFsdWVzIGZvciBrZXl3b3JkIGFyZ3VtZW50ICdhJwotXGVuZHt2ZXJiYXRpbX0KLQotV2hlbiBhIGZpbmFsIGZvcm1hbCBwYXJhbWV0ZXIgb2YgdGhlIGZvcm0gXGNvZGV7KipcdmFye25hbWV9fSBpcwotcHJlc2VudCwgaXQgcmVjZWl2ZXMgYSBcdWxpbmt7ZGljdGlvbmFyeX17Li4vbGliL3R5cGVzbWFwcGluZy5odG1sfQotY29udGFpbmluZyBhbGwga2V5d29yZCBhcmd1bWVudHMgZXhjZXB0IGZvciB0aG9zZSBjb3JyZXNwb25kaW5nIHRvCi1hIGZvcm1hbCBwYXJhbWV0ZXIuICBUaGlzIG1heSBiZQotY29tYmluZWQgd2l0aCBhIGZvcm1hbCBwYXJhbWV0ZXIgb2YgdGhlIGZvcm0KLVxjb2RleypcdmFye25hbWV9fSAoZGVzY3JpYmVkIGluIHRoZSBuZXh0IHN1YnNlY3Rpb24pIHdoaWNoIHJlY2VpdmVzIGEKLXR1cGxlIGNvbnRhaW5pbmcgdGhlIHBvc2l0aW9uYWwgYXJndW1lbnRzIGJleW9uZCB0aGUgZm9ybWFsIHBhcmFtZXRlcgotbGlzdC4gIChcY29kZXsqXHZhcntuYW1lfX0gbXVzdCBvY2N1ciBiZWZvcmUgXGNvZGV7KipcdmFye25hbWV9fS4pCi1Gb3IgZXhhbXBsZSwgaWYgd2UgZGVmaW5lIGEgZnVuY3Rpb24gbGlrZSB0aGlzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1kZWYgY2hlZXNlc2hvcChraW5kLCAqYXJndW1lbnRzLCAqKmtleXdvcmRzKToKLSAgICBwcmludCAiLS0gRG8geW91IGhhdmUgYW55Iiwga2luZCwgJz8nCi0gICAgcHJpbnQgIi0tIEknbSBzb3JyeSwgd2UncmUgYWxsIG91dCBvZiIsIGtpbmQKLSAgICBmb3IgYXJnIGluIGFyZ3VtZW50czogcHJpbnQgYXJnCi0gICAgcHJpbnQgJy0nKjQwCi0gICAga2V5cyA9IGtleXdvcmRzLmtleXMoKQotICAgIGtleXMuc29ydCgpCi0gICAgZm9yIGt3IGluIGtleXM6IHByaW50IGt3LCAnOicsIGtleXdvcmRzW2t3XQotXGVuZHt2ZXJiYXRpbX0KLQotSXQgY291bGQgYmUgY2FsbGVkIGxpa2UgdGhpczoKLQotXGJlZ2lue3ZlcmJhdGltfQotY2hlZXNlc2hvcCgnTGltYnVyZ2VyJywgIkl0J3MgdmVyeSBydW5ueSwgc2lyLiIsCi0gICAgICAgICAgICJJdCdzIHJlYWxseSB2ZXJ5LCBWRVJZIHJ1bm55LCBzaXIuIiwKLSAgICAgICAgICAgY2xpZW50PSdKb2huIENsZWVzZScsCi0gICAgICAgICAgIHNob3BrZWVwZXI9J01pY2hhZWwgUGFsaW4nLAotICAgICAgICAgICBza2V0Y2g9J0NoZWVzZSBTaG9wIFNrZXRjaCcpCi1cZW5ke3ZlcmJhdGltfQotCi1hbmQgb2YgY291cnNlIGl0IHdvdWxkIHByaW50OgotCi1cYmVnaW57dmVyYmF0aW19Ci0tLSBEbyB5b3UgaGF2ZSBhbnkgTGltYnVyZ2VyID8KLS0tIEknbSBzb3JyeSwgd2UncmUgYWxsIG91dCBvZiBMaW1idXJnZXIKLUl0J3MgdmVyeSBydW5ueSwgc2lyLgotSXQncyByZWFsbHkgdmVyeSwgVkVSWSBydW5ueSwgc2lyLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY2xpZW50IDogSm9obiBDbGVlc2UKLXNob3BrZWVwZXIgOiBNaWNoYWVsIFBhbGluCi1za2V0Y2ggOiBDaGVlc2UgU2hvcCBTa2V0Y2gKLVxlbmR7dmVyYmF0aW19Ci0KLU5vdGUgdGhhdCB0aGUgXG1ldGhvZHtzb3J0KCl9IG1ldGhvZCBvZiB0aGUgbGlzdCBvZiBrZXl3b3JkIGFyZ3VtZW50Ci1uYW1lcyBpcyBjYWxsZWQgYmVmb3JlIHByaW50aW5nIHRoZSBjb250ZW50cyBvZiB0aGUgXGNvZGV7a2V5d29yZHN9Ci1kaWN0aW9uYXJ5OyBpZiB0aGlzIGlzIG5vdCBkb25lLCB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGFyZ3VtZW50cyBhcmUKLXByaW50ZWQgaXMgdW5kZWZpbmVkLgotCi0KLVxzdWJzZWN0aW9ue0FyYml0cmFyeSBBcmd1bWVudCBMaXN0cyBcbGFiZWx7YXJiaXRyYXJ5QXJnc319Ci0KLUZpbmFsbHksIHRoZSBsZWFzdCBmcmVxdWVudGx5IHVzZWQgb3B0aW9uIGlzIHRvIHNwZWNpZnkgdGhhdCBhCi1mdW5jdGlvbiBjYW4gYmUgY2FsbGVkIHdpdGggYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBhcmd1bWVudHMuICBUaGVzZQotYXJndW1lbnRzIHdpbGwgYmUgd3JhcHBlZCB1cCBpbiBhIHR1cGxlLiAgQmVmb3JlIHRoZSB2YXJpYWJsZSBudW1iZXIKLW9mIGFyZ3VtZW50cywgemVybyBvciBtb3JlIG5vcm1hbCBhcmd1bWVudHMgbWF5IG9jY3VyLgotCi1cYmVnaW57dmVyYmF0aW19Ci1kZWYgZnByaW50ZihmaWxlLCBmb3JtYXQsICphcmdzKToKLSAgICBmaWxlLndyaXRlKGZvcm1hdCAlIGFyZ3MpCi1cZW5ke3ZlcmJhdGltfQotCi0KLVxzdWJzZWN0aW9ue1VucGFja2luZyBBcmd1bWVudCBMaXN0cyBcbGFiZWx7dW5wYWNraW5nLWFyZ3VtZW50c319Ci0KLVRoZSByZXZlcnNlIHNpdHVhdGlvbiBvY2N1cnMgd2hlbiB0aGUgYXJndW1lbnRzIGFyZSBhbHJlYWR5IGluIGEgbGlzdAotb3IgdHVwbGUgYnV0IG5lZWQgdG8gYmUgdW5wYWNrZWQgZm9yIGEgZnVuY3Rpb24gY2FsbCByZXF1aXJpbmcgc2VwYXJhdGUKLXBvc2l0aW9uYWwgYXJndW1lbnRzLiAgRm9yIGluc3RhbmNlLCB0aGUgYnVpbHQtaW4gXGZ1bmN0aW9ue3JhbmdlKCl9Ci1mdW5jdGlvbiBleHBlY3RzIHNlcGFyYXRlIFx2YXJ7c3RhcnR9IGFuZCBcdmFye3N0b3B9IGFyZ3VtZW50cy4gIElmIHRoZXkKLWFyZSBub3QgYXZhaWxhYmxlIHNlcGFyYXRlbHksIHdyaXRlIHRoZSBmdW5jdGlvbiBjYWxsIHdpdGggdGhlIAotXGNvZGV7Kn0tb3BlcmF0b3IgdG8gdW5wYWNrIHRoZSBhcmd1bWVudHMgb3V0IG9mIGEgbGlzdCBvciB0dXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHJhbmdlKDMsIDYpICAgICAgICAgICAgICMgbm9ybWFsIGNhbGwgd2l0aCBzZXBhcmF0ZSBhcmd1bWVudHMKLVszLCA0LCA1XQotPj4+IGFyZ3MgPSBbMywgNl0KLT4+PiByYW5nZSgqYXJncykgICAgICAgICAgICAjIGNhbGwgd2l0aCBhcmd1bWVudHMgdW5wYWNrZWQgZnJvbSBhIGxpc3QKLVszLCA0LCA1XQotXGVuZHt2ZXJiYXRpbX0KLQotSW4gdGhlIHNhbWUgZmFzaGlvbiwgZGljdGlvbmFyaWVzIGNhbiBkZWxpdmVyIGtleXdvcmQgYXJndW1lbnRzIHdpdGggdGhlCi1cY29kZXsqKn0tb3BlcmF0b3I6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBkZWYgcGFycm90KHZvbHRhZ2UsIHN0YXRlPSdhIHN0aWZmJywgYWN0aW9uPSd2b29tJyk6Ci0uLi4gICAgIHByaW50ICItLSBUaGlzIHBhcnJvdCB3b3VsZG4ndCIsIGFjdGlvbiwKLS4uLiAgICAgcHJpbnQgImlmIHlvdSBwdXQiLCB2b2x0YWdlLCAidm9sdHMgdGhyb3VnaCBpdC4iLAotLi4uICAgICBwcmludCAiRSdzIiwgc3RhdGUsICIhIgotLi4uCi0+Pj4gZCA9IHsidm9sdGFnZSI6ICJmb3VyIG1pbGxpb24iLCAic3RhdGUiOiAiYmxlZWRpbicgZGVtaXNlZCIsICJhY3Rpb24iOiAiVk9PTSJ9Ci0+Pj4gcGFycm90KCoqZCkKLS0tIFRoaXMgcGFycm90IHdvdWxkbid0IFZPT00gaWYgeW91IHB1dCBmb3VyIG1pbGxpb24gdm9sdHMgdGhyb3VnaCBpdC4gRSdzIGJsZWVkaW4nIGRlbWlzZWQgIQotXGVuZHt2ZXJiYXRpbX0KLQotCi1cc3Vic2VjdGlvbntMYW1iZGEgRm9ybXMgXGxhYmVse2xhbWJkYX19Ci0KLUJ5IHBvcHVsYXIgZGVtYW5kLCBhIGZldyBmZWF0dXJlcyBjb21tb25seSBmb3VuZCBpbiBmdW5jdGlvbmFsCi1wcm9ncmFtbWluZyBsYW5ndWFnZXMgbGlrZSBMaXNwIGhhdmUgYmVlbiBhZGRlZCB0byBQeXRob24uICBXaXRoIHRoZQotXGtleXdvcmR7bGFtYmRhfSBrZXl3b3JkLCBzbWFsbCBhbm9ueW1vdXMgZnVuY3Rpb25zIGNhbiBiZSBjcmVhdGVkLgotSGVyZSdzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBzdW0gb2YgaXRzIHR3byBhcmd1bWVudHM6Ci1cc2FtcHtsYW1iZGEgYSwgYjogYStifS4gIExhbWJkYSBmb3JtcyBjYW4gYmUgdXNlZCB3aGVyZXZlciBmdW5jdGlvbgotb2JqZWN0cyBhcmUgcmVxdWlyZWQuICBUaGV5IGFyZSBzeW50YWN0aWNhbGx5IHJlc3RyaWN0ZWQgdG8gYSBzaW5nbGUKLWV4cHJlc3Npb24uICBTZW1hbnRpY2FsbHksIHRoZXkgYXJlIGp1c3Qgc3ludGFjdGljIHN1Z2FyIGZvciBhIG5vcm1hbAotZnVuY3Rpb24gZGVmaW5pdGlvbi4gIExpa2UgbmVzdGVkIGZ1bmN0aW9uIGRlZmluaXRpb25zLCBsYW1iZGEgZm9ybXMKLWNhbiByZWZlcmVuY2UgdmFyaWFibGVzIGZyb20gdGhlIGNvbnRhaW5pbmcgc2NvcGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBkZWYgbWFrZV9pbmNyZW1lbnRvcihuKToKLS4uLiAgICAgcmV0dXJuIGxhbWJkYSB4OiB4ICsgbgotLi4uCi0+Pj4gZiA9IG1ha2VfaW5jcmVtZW50b3IoNDIpCi0+Pj4gZigwKQotNDIKLT4+PiBmKDEpCi00MwotXGVuZHt2ZXJiYXRpbX0KLQotCi1cc3Vic2VjdGlvbntEb2N1bWVudGF0aW9uIFN0cmluZ3MgXGxhYmVse2RvY3N0cmluZ3N9fQotCi1UaGVyZSBhcmUgZW1lcmdpbmcgY29udmVudGlvbnMgYWJvdXQgdGhlIGNvbnRlbnQgYW5kIGZvcm1hdHRpbmcgb2YKLWRvY3VtZW50YXRpb24gc3RyaW5ncy4KLVxpbmRleHtkb2NzdHJpbmdzfVxpbmRleHtkb2N1bWVudGF0aW9uIHN0cmluZ3N9Ci1caW5kZXh7c3RyaW5ncywgZG9jdW1lbnRhdGlvbn0KLQotVGhlIGZpcnN0IGxpbmUgc2hvdWxkIGFsd2F5cyBiZSBhIHNob3J0LCBjb25jaXNlIHN1bW1hcnkgb2YgdGhlCi1vYmplY3QncyBwdXJwb3NlLiAgRm9yIGJyZXZpdHksIGl0IHNob3VsZCBub3QgZXhwbGljaXRseSBzdGF0ZSB0aGUKLW9iamVjdCdzIG5hbWUgb3IgdHlwZSwgc2luY2UgdGhlc2UgYXJlIGF2YWlsYWJsZSBieSBvdGhlciBtZWFucwotKGV4Y2VwdCBpZiB0aGUgbmFtZSBoYXBwZW5zIHRvIGJlIGEgdmVyYiBkZXNjcmliaW5nIGEgZnVuY3Rpb24ncwotb3BlcmF0aW9uKS4gIFRoaXMgbGluZSBzaG91bGQgYmVnaW4gd2l0aCBhIGNhcGl0YWwgbGV0dGVyIGFuZCBlbmQgd2l0aAotYSBwZXJpb2QuCi0KLUlmIHRoZXJlIGFyZSBtb3JlIGxpbmVzIGluIHRoZSBkb2N1bWVudGF0aW9uIHN0cmluZywgdGhlIHNlY29uZCBsaW5lCi1zaG91bGQgYmUgYmxhbmssIHZpc3VhbGx5IHNlcGFyYXRpbmcgdGhlIHN1bW1hcnkgZnJvbSB0aGUgcmVzdCBvZiB0aGUKLWRlc2NyaXB0aW9uLiAgVGhlIGZvbGxvd2luZyBsaW5lcyBzaG91bGQgYmUgb25lIG9yIG1vcmUgcGFyYWdyYXBocwotZGVzY3JpYmluZyB0aGUgb2JqZWN0J3MgY2FsbGluZyBjb252ZW50aW9ucywgaXRzIHNpZGUgZWZmZWN0cywgZXRjLgotCi1UaGUgUHl0aG9uIHBhcnNlciBkb2VzIG5vdCBzdHJpcCBpbmRlbnRhdGlvbiBmcm9tIG11bHRpLWxpbmUgc3RyaW5nCi1saXRlcmFscyBpbiBQeXRob24sIHNvIHRvb2xzIHRoYXQgcHJvY2VzcyBkb2N1bWVudGF0aW9uIGhhdmUgdG8gc3RyaXAKLWluZGVudGF0aW9uIGlmIGRlc2lyZWQuICBUaGlzIGlzIGRvbmUgdXNpbmcgdGhlIGZvbGxvd2luZyBjb252ZW50aW9uLgotVGhlIGZpcnN0IG5vbi1ibGFuayBsaW5lIFxlbXBoe2FmdGVyfSB0aGUgZmlyc3QgbGluZSBvZiB0aGUgc3RyaW5nCi1kZXRlcm1pbmVzIHRoZSBhbW91bnQgb2YgaW5kZW50YXRpb24gZm9yIHRoZSBlbnRpcmUgZG9jdW1lbnRhdGlvbgotc3RyaW5nLiAgKFdlIGNhbid0IHVzZSB0aGUgZmlyc3QgbGluZSBzaW5jZSBpdCBpcyBnZW5lcmFsbHkgYWRqYWNlbnQKLXRvIHRoZSBzdHJpbmcncyBvcGVuaW5nIHF1b3RlcyBzbyBpdHMgaW5kZW50YXRpb24gaXMgbm90IGFwcGFyZW50IGluCi10aGUgc3RyaW5nIGxpdGVyYWwuKSAgV2hpdGVzcGFjZSBgYGVxdWl2YWxlbnQnJyB0byB0aGlzIGluZGVudGF0aW9uIGlzCi10aGVuIHN0cmlwcGVkIGZyb20gdGhlIHN0YXJ0IG9mIGFsbCBsaW5lcyBvZiB0aGUgc3RyaW5nLiAgTGluZXMgdGhhdAotYXJlIGluZGVudGVkIGxlc3Mgc2hvdWxkIG5vdCBvY2N1ciwgYnV0IGlmIHRoZXkgb2NjdXIgYWxsIHRoZWlyCi1sZWFkaW5nIHdoaXRlc3BhY2Ugc2hvdWxkIGJlIHN0cmlwcGVkLiAgRXF1aXZhbGVuY2Ugb2Ygd2hpdGVzcGFjZQotc2hvdWxkIGJlIHRlc3RlZCBhZnRlciBleHBhbnNpb24gb2YgdGFicyAodG8gOCBzcGFjZXMsIG5vcm1hbGx5KS4KLQotSGVyZSBpcyBhbiBleGFtcGxlIG9mIGEgbXVsdGktbGluZSBkb2NzdHJpbmc6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBkZWYgbXlfZnVuY3Rpb24oKToKLS4uLiAgICAgIiIiRG8gbm90aGluZywgYnV0IGRvY3VtZW50IGl0LgotLi4uIAotLi4uICAgICBObywgcmVhbGx5LCBpdCBkb2Vzbid0IGRvIGFueXRoaW5nLgotLi4uICAgICAiIiIKLS4uLiAgICAgcGFzcwotLi4uIAotPj4+IHByaW50IG15X2Z1bmN0aW9uLl9fZG9jX18KLURvIG5vdGhpbmcsIGJ1dCBkb2N1bWVudCBpdC4KLQotICAgIE5vLCByZWFsbHksIGl0IGRvZXNuJ3QgZG8gYW55dGhpbmcuCi0gICAgCi1cZW5ke3ZlcmJhdGltfQotCi0KLQotXGNoYXB0ZXJ7RGF0YSBTdHJ1Y3R1cmVzIFxsYWJlbHtzdHJ1Y3R1cmVzfX0KLQotVGhpcyBjaGFwdGVyIGRlc2NyaWJlcyBzb21lIHRoaW5ncyB5b3UndmUgbGVhcm5lZCBhYm91dCBhbHJlYWR5IGluCi1tb3JlIGRldGFpbCwgYW5kIGFkZHMgc29tZSBuZXcgdGhpbmdzIGFzIHdlbGwuCi0KLQotXHNlY3Rpb257TW9yZSBvbiBMaXN0cyBcbGFiZWx7bW9yZUxpc3RzfX0KLQotVGhlIGxpc3QgZGF0YSB0eXBlIGhhcyBzb21lIG1vcmUgbWV0aG9kcy4gIEhlcmUgYXJlIGFsbCBvZiB0aGUgbWV0aG9kcwotb2YgbGlzdCBvYmplY3RzOgotCi1cYmVnaW57bWV0aG9kZGVzY31bbGlzdF17YXBwZW5kfXt4fQotQWRkIGFuIGl0ZW0gdG8gdGhlIGVuZCBvZiB0aGUgbGlzdDsKLWVxdWl2YWxlbnQgdG8gXGNvZGV7YVtsZW4oYSk6XSA9IFtcdmFye3h9XX0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtsaXN0XXtleHRlbmR9e0x9Ci1FeHRlbmQgdGhlIGxpc3QgYnkgYXBwZW5kaW5nIGFsbCB0aGUgaXRlbXMgaW4gdGhlIGdpdmVuIGxpc3Q7Ci1lcXVpdmFsZW50IHRvIFxjb2Rle2FbbGVuKGEpOl0gPSBcdmFye0x9fS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2xpc3Rde2luc2VydH17aSwgeH0KLUluc2VydCBhbiBpdGVtIGF0IGEgZ2l2ZW4gcG9zaXRpb24uICBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIGluZGV4Ci1vZiB0aGUgZWxlbWVudCBiZWZvcmUgd2hpY2ggdG8gaW5zZXJ0LCBzbyBcY29kZXthLmluc2VydCgwLCBcdmFye3h9KX0KLWluc2VydHMgYXQgdGhlIGZyb250IG9mIHRoZSBsaXN0LCBhbmQgXGNvZGV7YS5pbnNlcnQobGVuKGEpLCBcdmFye3h9KX0KLWlzIGVxdWl2YWxlbnQgdG8gXGNvZGV7YS5hcHBlbmQoXHZhcnt4fSl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bbGlzdF17cmVtb3ZlfXt4fQotUmVtb3ZlIHRoZSBmaXJzdCBpdGVtIGZyb20gdGhlIGxpc3Qgd2hvc2UgdmFsdWUgaXMgXHZhcnt4fS4KLUl0IGlzIGFuIGVycm9yIGlmIHRoZXJlIGlzIG5vIHN1Y2ggaXRlbS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2xpc3Rde3BvcH17XG9wdGlvbmFse2l9fQotUmVtb3ZlIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBpbiB0aGUgbGlzdCwgYW5kIHJldHVybiBpdC4gIElmCi1ubyBpbmRleCBpcyBzcGVjaWZpZWQsIFxjb2Rle2EucG9wKCl9IHJlbW92ZXMgYW5kIHJldHVybnMgdGhlIGxhc3QgaXRlbQotaW4gdGhlIGxpc3QuICAoVGhlIHNxdWFyZSBicmFja2V0cwotYXJvdW5kIHRoZSBcdmFye2l9IGluIHRoZSBtZXRob2Qgc2lnbmF0dXJlIGRlbm90ZSB0aGF0IHRoZSBwYXJhbWV0ZXIKLWlzIG9wdGlvbmFsLCBub3QgdGhhdCB5b3Ugc2hvdWxkIHR5cGUgc3F1YXJlIGJyYWNrZXRzIGF0IHRoYXQKLXBvc2l0aW9uLiAgWW91IHdpbGwgc2VlIHRoaXMgbm90YXRpb24gZnJlcXVlbnRseSBpbiB0aGUKLVxjaXRldGl0bGVbLi4vbGliL2xpYi5odG1sXXtQeXRob24gTGlicmFyeSBSZWZlcmVuY2V9LikKLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2xpc3Rde2luZGV4fXt4fQotUmV0dXJuIHRoZSBpbmRleCBpbiB0aGUgbGlzdCBvZiB0aGUgZmlyc3QgaXRlbSB3aG9zZSB2YWx1ZSBpcyBcdmFye3h9LgotSXQgaXMgYW4gZXJyb3IgaWYgdGhlcmUgaXMgbm8gc3VjaCBpdGVtLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bbGlzdF17Y291bnR9e3h9Ci1SZXR1cm4gdGhlIG51bWJlciBvZiB0aW1lcyBcdmFye3h9IGFwcGVhcnMgaW4gdGhlIGxpc3QuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtsaXN0XXtzb3J0fXt9Ci1Tb3J0IHRoZSBpdGVtcyBvZiB0aGUgbGlzdCwgaW4gcGxhY2UuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtsaXN0XXtyZXZlcnNlfXt9Ci1SZXZlcnNlIHRoZSBlbGVtZW50cyBvZiB0aGUgbGlzdCwgaW4gcGxhY2UuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLUFuIGV4YW1wbGUgdGhhdCB1c2VzIG1vc3Qgb2YgdGhlIGxpc3QgbWV0aG9kczoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGEgPSBbNjYuMjUsIDMzMywgMzMzLCAxLCAxMjM0LjVdCi0+Pj4gcHJpbnQgYS5jb3VudCgzMzMpLCBhLmNvdW50KDY2LjI1KSwgYS5jb3VudCgneCcpCi0yIDEgMAotPj4+IGEuaW5zZXJ0KDIsIC0xKQotPj4+IGEuYXBwZW5kKDMzMykKLT4+PiBhCi1bNjYuMjUsIDMzMywgLTEsIDMzMywgMSwgMTIzNC41LCAzMzNdCi0+Pj4gYS5pbmRleCgzMzMpCi0xCi0+Pj4gYS5yZW1vdmUoMzMzKQotPj4+IGEKLVs2Ni4yNSwgLTEsIDMzMywgMSwgMTIzNC41LCAzMzNdCi0+Pj4gYS5yZXZlcnNlKCkKLT4+PiBhCi1bMzMzLCAxMjM0LjUsIDEsIDMzMywgLTEsIDY2LjI1XQotPj4+IGEuc29ydCgpCi0+Pj4gYQotWy0xLCAxLCA2Ni4yNSwgMzMzLCAzMzMsIDEyMzQuNV0KLVxlbmR7dmVyYmF0aW19Ci0KLQotXHN1YnNlY3Rpb257VXNpbmcgTGlzdHMgYXMgU3RhY2tzIFxsYWJlbHtsaXN0cy1hcy1zdGFja3N9fQotXHNlY3Rpb25hdXRob3J7S2EtUGluZyBZZWV9e3BpbmdAbGZ3Lm9yZ30KLQotVGhlIGxpc3QgbWV0aG9kcyBtYWtlIGl0IHZlcnkgZWFzeSB0byB1c2UgYSBsaXN0IGFzIGEgc3RhY2ssIHdoZXJlIHRoZQotbGFzdCBlbGVtZW50IGFkZGVkIGlzIHRoZSBmaXJzdCBlbGVtZW50IHJldHJpZXZlZCAoYGBsYXN0LWluLAotZmlyc3Qtb3V0JycpLiAgVG8gYWRkIGFuIGl0ZW0gdG8gdGhlIHRvcCBvZiB0aGUgc3RhY2ssIHVzZQotXG1ldGhvZHthcHBlbmQoKX0uICBUbyByZXRyaWV2ZSBhbiBpdGVtIGZyb20gdGhlIHRvcCBvZiB0aGUgc3RhY2ssIHVzZQotXG1ldGhvZHtwb3AoKX0gd2l0aG91dCBhbiBleHBsaWNpdCBpbmRleC4gIEZvciBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gc3RhY2sgPSBbMywgNCwgNV0KLT4+PiBzdGFjay5hcHBlbmQoNikKLT4+PiBzdGFjay5hcHBlbmQoNykKLT4+PiBzdGFjawotWzMsIDQsIDUsIDYsIDddCi0+Pj4gc3RhY2sucG9wKCkKLTcKLT4+PiBzdGFjawotWzMsIDQsIDUsIDZdCi0+Pj4gc3RhY2sucG9wKCkKLTYKLT4+PiBzdGFjay5wb3AoKQotNQotPj4+IHN0YWNrCi1bMywgNF0KLVxlbmR7dmVyYmF0aW19Ci0KLQotXHN1YnNlY3Rpb257VXNpbmcgTGlzdHMgYXMgUXVldWVzIFxsYWJlbHtsaXN0cy1hcy1xdWV1ZXN9fQotXHNlY3Rpb25hdXRob3J7S2EtUGluZyBZZWV9e3BpbmdAbGZ3Lm9yZ30KLQotWW91IGNhbiBhbHNvIHVzZSBhIGxpc3QgY29udmVuaWVudGx5IGFzIGEgcXVldWUsIHdoZXJlIHRoZSBmaXJzdAotZWxlbWVudCBhZGRlZCBpcyB0aGUgZmlyc3QgZWxlbWVudCByZXRyaWV2ZWQgKGBgZmlyc3QtaW4sCi1maXJzdC1vdXQnJykuICBUbyBhZGQgYW4gaXRlbSB0byB0aGUgYmFjayBvZiB0aGUgcXVldWUsIHVzZQotXG1ldGhvZHthcHBlbmQoKX0uICBUbyByZXRyaWV2ZSBhbiBpdGVtIGZyb20gdGhlIGZyb250IG9mIHRoZSBxdWV1ZSwKLXVzZSBcbWV0aG9ke3BvcCgpfSB3aXRoIFxjb2RlezB9IGFzIHRoZSBpbmRleC4gIEZvciBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gcXVldWUgPSBbIkVyaWMiLCAiSm9obiIsICJNaWNoYWVsIl0KLT4+PiBxdWV1ZS5hcHBlbmQoIlRlcnJ5IikgICAgICAgICAgICMgVGVycnkgYXJyaXZlcwotPj4+IHF1ZXVlLmFwcGVuZCgiR3JhaGFtIikgICAgICAgICAgIyBHcmFoYW0gYXJyaXZlcwotPj4+IHF1ZXVlLnBvcCgwKQotJ0VyaWMnCi0+Pj4gcXVldWUucG9wKDApCi0nSm9obicKLT4+PiBxdWV1ZQotWydNaWNoYWVsJywgJ1RlcnJ5JywgJ0dyYWhhbSddCi1cZW5ke3ZlcmJhdGltfQotCi0KLVxzdWJzZWN0aW9ue0Z1bmN0aW9uYWwgUHJvZ3JhbW1pbmcgVG9vbHMgXGxhYmVse2Z1bmN0aW9uYWx9fQotCi1UaGVyZSBhcmUgdHdvIGJ1aWx0LWluIGZ1bmN0aW9ucyB0aGF0IGFyZSB2ZXJ5IHVzZWZ1bCB3aGVuIHVzZWQgd2l0aAotbGlzdHM6IFxmdW5jdGlvbntmaWx0ZXIoKX0gYW5kIFxmdW5jdGlvbnttYXAoKX0uCi0KLVxzYW1we2ZpbHRlcihcdmFye2Z1bmN0aW9ufSwgXHZhcntzZXF1ZW5jZX0pfSByZXR1cm5zIGEgc2VxdWVuY2UKLWNvbnNpc3Rpbmcgb2YgdGhvc2UgaXRlbXMgZnJvbSB0aGUKLXNlcXVlbmNlIGZvciB3aGljaCBcY29kZXtcdmFye2Z1bmN0aW9ufShcdmFye2l0ZW19KX0gaXMgdHJ1ZS4KLUlmIFx2YXJ7c2VxdWVuY2V9IGlzIGEgXGNsYXNze3N0cmluZ30gb3IgXGNsYXNze3R1cGxlfSwgdGhlIHJlc3VsdCB3aWxsCi1iZSBvZiB0aGUgc2FtZSB0eXBlOyBvdGhlcndpc2UsIGl0IGlzIGFsd2F5cyBhIFxjbGFzc3tsaXN0fS4KLUZvciBleGFtcGxlLCB0byBjb21wdXRlIHNvbWUgcHJpbWVzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZGVmIGYoeCk6IHJldHVybiB4ICUgMiAhPSAwIGFuZCB4ICUgMyAhPSAwCi0uLi4KLT4+PiBmaWx0ZXIoZiwgcmFuZ2UoMiwgMjUpKQotWzUsIDcsIDExLCAxMywgMTcsIDE5LCAyM10KLVxlbmR7dmVyYmF0aW19Ci0KLVxzYW1we21hcChcdmFye2Z1bmN0aW9ufSwgXHZhcntzZXF1ZW5jZX0pfSBjYWxscwotXGNvZGV7XHZhcntmdW5jdGlvbn0oXHZhcntpdGVtfSl9IGZvciBlYWNoIG9mIHRoZSBzZXF1ZW5jZSdzIGl0ZW1zIGFuZAotcmV0dXJucyBhIGxpc3Qgb2YgdGhlIHJldHVybiB2YWx1ZXMuICBGb3IgZXhhbXBsZSwgdG8gY29tcHV0ZSBzb21lCi1jdWJlczoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGRlZiBjdWJlKHgpOiByZXR1cm4geCp4KngKLS4uLgotPj4+IG1hcChjdWJlLCByYW5nZSgxLCAxMSkpCi1bMSwgOCwgMjcsIDY0LCAxMjUsIDIxNiwgMzQzLCA1MTIsIDcyOSwgMTAwMF0KLVxlbmR7dmVyYmF0aW19Ci0KLU1vcmUgdGhhbiBvbmUgc2VxdWVuY2UgbWF5IGJlIHBhc3NlZDsgdGhlIGZ1bmN0aW9uIG11c3QgdGhlbiBoYXZlIGFzCi1tYW55IGFyZ3VtZW50cyBhcyB0aGVyZSBhcmUgc2VxdWVuY2VzIGFuZCBpcyBjYWxsZWQgd2l0aCB0aGUKLWNvcnJlc3BvbmRpbmcgaXRlbSBmcm9tIGVhY2ggc2VxdWVuY2UgKG9yIFxjb2Rle05vbmV9IGlmIHNvbWUgc2VxdWVuY2UKLWlzIHNob3J0ZXIgdGhhbiBhbm90aGVyKS4gIEZvciBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gc2VxID0gcmFuZ2UoOCkKLT4+PiBkZWYgYWRkKHgsIHkpOiByZXR1cm4geCt5Ci0uLi4KLT4+PiBtYXAoYWRkLCBzZXEsIHNlcSkKLVswLCAyLCA0LCA2LCA4LCAxMCwgMTIsIDE0XQotXGVuZHt2ZXJiYXRpbX0KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotCi1cc3Vic2VjdGlvbntMaXN0IENvbXByZWhlbnNpb25zfQotCi1MaXN0IGNvbXByZWhlbnNpb25zIHByb3ZpZGUgYSBjb25jaXNlIHdheSB0byBjcmVhdGUgbGlzdHMgd2l0aG91dCByZXNvcnRpbmcKLXRvIHVzZSBvZiBcZnVuY3Rpb257bWFwKCl9LCBcZnVuY3Rpb257ZmlsdGVyKCl9IGFuZC9vciBca2V5d29yZHtsYW1iZGF9LgotVGhlIHJlc3VsdGluZyBsaXN0IGRlZmluaXRpb24gdGVuZHMgb2Z0ZW4gdG8gYmUgY2xlYXJlciB0aGFuIGxpc3RzIGJ1aWx0Ci11c2luZyB0aG9zZSBjb25zdHJ1Y3RzLiAgRWFjaCBsaXN0IGNvbXByZWhlbnNpb24gY29uc2lzdHMgb2YgYW4gZXhwcmVzc2lvbgotZm9sbG93ZWQgYnkgYSBca2V5d29yZHtmb3J9IGNsYXVzZSwgdGhlbiB6ZXJvIG9yIG1vcmUgXGtleXdvcmR7Zm9yfSBvcgotXGtleXdvcmR7aWZ9IGNsYXVzZXMuICBUaGUgcmVzdWx0IHdpbGwgYmUgYSBsaXN0IHJlc3VsdGluZyBmcm9tIGV2YWx1YXRpbmcKLXRoZSBleHByZXNzaW9uIGluIHRoZSBjb250ZXh0IG9mIHRoZSBca2V5d29yZHtmb3J9IGFuZCBca2V5d29yZHtpZn0gY2xhdXNlcwotd2hpY2ggZm9sbG93IGl0LiAgSWYgdGhlIGV4cHJlc3Npb24gd291bGQgZXZhbHVhdGUgdG8gYSB0dXBsZSwgaXQgbXVzdCBiZQotcGFyZW50aGVzaXplZC4KLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGZyZXNoZnJ1aXQgPSBbJyAgYmFuYW5hJywgJyAgbG9nYW5iZXJyeSAnLCAncGFzc2lvbiBmcnVpdCAgJ10KLT4+PiBbd2VhcG9uLnN0cmlwKCkgZm9yIHdlYXBvbiBpbiBmcmVzaGZydWl0XQotWydiYW5hbmEnLCAnbG9nYW5iZXJyeScsICdwYXNzaW9uIGZydWl0J10KLT4+PiB2ZWMgPSBbMiwgNCwgNl0KLT4+PiBbMyp4IGZvciB4IGluIHZlY10KLVs2LCAxMiwgMThdCi0+Pj4gWzMqeCBmb3IgeCBpbiB2ZWMgaWYgeCA+IDNdCi1bMTIsIDE4XQotPj4+IFszKnggZm9yIHggaW4gdmVjIGlmIHggPCAyXQotW10KLT4+PiBbW3gseCoqMl0gZm9yIHggaW4gdmVjXQotW1syLCA0XSwgWzQsIDE2XSwgWzYsIDM2XV0KLT4+PiBbeCwgeCoqMiBmb3IgeCBpbiB2ZWNdCSMgZXJyb3IgLSBwYXJlbnMgcmVxdWlyZWQgZm9yIHR1cGxlcwotICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/Ci0gICAgW3gsIHgqKjIgZm9yIHggaW4gdmVjXQotICAgICAgICAgICAgICAgXgotU3ludGF4RXJyb3I6IGludmFsaWQgc3ludGF4Ci0+Pj4gWyh4LCB4KioyKSBmb3IgeCBpbiB2ZWNdCi1bKDIsIDQpLCAoNCwgMTYpLCAoNiwgMzYpXQotPj4+IHZlYzEgPSBbMiwgNCwgNl0KLT4+PiB2ZWMyID0gWzQsIDMsIC05XQotPj4+IFt4KnkgZm9yIHggaW4gdmVjMSBmb3IgeSBpbiB2ZWMyXQotWzgsIDYsIC0xOCwgMTYsIDEyLCAtMzYsIDI0LCAxOCwgLTU0XQotPj4+IFt4K3kgZm9yIHggaW4gdmVjMSBmb3IgeSBpbiB2ZWMyXQotWzYsIDUsIC03LCA4LCA3LCAtNSwgMTAsIDksIC0zXQotPj4+IFt2ZWMxW2ldKnZlYzJbaV0gZm9yIGkgaW4gcmFuZ2UobGVuKHZlYzEpKV0KLVs4LCAxMiwgLTU0XQotXGVuZHt2ZXJiYXRpbX0KLQotTGlzdCBjb21wcmVoZW5zaW9ucyBhcmUgbXVjaCBtb3JlIGZsZXhpYmxlIHRoYW4gXGZ1bmN0aW9ue21hcCgpfSBhbmQgY2FuIGJlCi1hcHBsaWVkIHRvIGNvbXBsZXggZXhwcmVzc2lvbnMgYW5kIG5lc3RlZCBmdW5jdGlvbnM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBbc3RyKHJvdW5kKDM1NS8xMTMuMCwgaSkpIGZvciBpIGluIHJhbmdlKDEsNildCi1bJzMuMScsICczLjE0JywgJzMuMTQyJywgJzMuMTQxNicsICczLjE0MTU5J10KLVxlbmR7dmVyYmF0aW19Ci0KLQotXHNlY3Rpb257VGhlIFxrZXl3b3Jke2RlbH0gc3RhdGVtZW50IFxsYWJlbHtkZWx9fQotCi1UaGVyZSBpcyBhIHdheSB0byByZW1vdmUgYW4gaXRlbSBmcm9tIGEgbGlzdCBnaXZlbiBpdHMgaW5kZXggaW5zdGVhZAotb2YgaXRzIHZhbHVlOiB0aGUgXGtleXdvcmR7ZGVsfSBzdGF0ZW1lbnQuICBUaGlzIGRpZmZlcnMgZnJvbSB0aGUKLVxtZXRob2R7cG9wKCl9IG1ldGhvZCB3aGljaCByZXR1cm5zIGEgdmFsdWUuICBUaGUgXGtleXdvcmR7ZGVsfQotc3RhdGVtZW50IGNhbiBhbHNvIGJlIHVzZWQgdG8gcmVtb3ZlIHNsaWNlcyBmcm9tIGEgbGlzdCBvciBjbGVhciB0aGUKLWVudGlyZSBsaXN0ICh3aGljaCB3ZSBkaWQgZWFybGllciBieSBhc3NpZ25tZW50IG9mIGFuIGVtcHR5IGxpc3QgdG8KLXRoZSBzbGljZSkuICBGb3IgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGEgPSBbLTEsIDEsIDY2LjI1LCAzMzMsIDMzMywgMTIzNC41XQotPj4+IGRlbCBhWzBdCi0+Pj4gYQotWzEsIDY2LjI1LCAzMzMsIDMzMywgMTIzNC41XQotPj4+IGRlbCBhWzI6NF0KLT4+PiBhCi1bMSwgNjYuMjUsIDEyMzQuNV0KLT4+PiBkZWwgYVs6XQotPj4+IGEKLVtdCi1cZW5ke3ZlcmJhdGltfQotCi1ca2V5d29yZHtkZWx9IGNhbiBhbHNvIGJlIHVzZWQgdG8gZGVsZXRlIGVudGlyZSB2YXJpYWJsZXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBkZWwgYQotXGVuZHt2ZXJiYXRpbX0KLQotUmVmZXJlbmNpbmcgdGhlIG5hbWUgXGNvZGV7YX0gaGVyZWFmdGVyIGlzIGFuIGVycm9yIChhdCBsZWFzdCB1bnRpbAotYW5vdGhlciB2YWx1ZSBpcyBhc3NpZ25lZCB0byBpdCkuICBXZSdsbCBmaW5kIG90aGVyIHVzZXMgZm9yCi1ca2V5d29yZHtkZWx9IGxhdGVyLgotCi0KLVxzZWN0aW9ue1R1cGxlcyBhbmQgU2VxdWVuY2VzIFxsYWJlbHt0dXBsZXN9fQotCi1XZSBzYXcgdGhhdCBsaXN0cyBhbmQgc3RyaW5ncyBoYXZlIG1hbnkgY29tbW9uIHByb3BlcnRpZXMsIHN1Y2ggYXMKLWluZGV4aW5nIGFuZCBzbGljaW5nIG9wZXJhdGlvbnMuICBUaGV5IGFyZSB0d28gZXhhbXBsZXMgb2YKLVx1bGlua3tcZW1waHtzZXF1ZW5jZX0gZGF0YSB0eXBlc317Li4vbGliL3R5cGVzc2VxLmh0bWx9LiAgU2luY2UKLVB5dGhvbiBpcyBhbiBldm9sdmluZyBsYW5ndWFnZSwgb3RoZXIgc2VxdWVuY2UgZGF0YSB0eXBlcyBtYXkgYmUKLWFkZGVkLiAgVGhlcmUgaXMgYWxzbyBhbm90aGVyIHN0YW5kYXJkIHNlcXVlbmNlIGRhdGEgdHlwZTogdGhlCi1cZW1waHt0dXBsZX0uCi0KLUEgdHVwbGUgY29uc2lzdHMgb2YgYSBudW1iZXIgb2YgdmFsdWVzIHNlcGFyYXRlZCBieSBjb21tYXMsIGZvcgotaW5zdGFuY2U6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiB0ID0gMTIzNDUsIDU0MzIxLCAnaGVsbG8hJwotPj4+IHRbMF0KLTEyMzQ1Ci0+Pj4gdAotKDEyMzQ1LCA1NDMyMSwgJ2hlbGxvIScpCi0+Pj4gIyBUdXBsZXMgbWF5IGJlIG5lc3RlZDoKLS4uLiB1ID0gdCwgKDEsIDIsIDMsIDQsIDUpCi0+Pj4gdQotKCgxMjM0NSwgNTQzMjEsICdoZWxsbyEnKSwgKDEsIDIsIDMsIDQsIDUpKQotXGVuZHt2ZXJiYXRpbX0KLQotQXMgeW91IHNlZSwgb24gb3V0cHV0IHR1cGxlcyBhcmUgYWx3YXlzIGVuY2xvc2VkIGluIHBhcmVudGhlc2VzLCBzbwotdGhhdCBuZXN0ZWQgdHVwbGVzIGFyZSBpbnRlcnByZXRlZCBjb3JyZWN0bHk7IHRoZXkgbWF5IGJlIGlucHV0IHdpdGgKLW9yIHdpdGhvdXQgc3Vycm91bmRpbmcgcGFyZW50aGVzZXMsIGFsdGhvdWdoIG9mdGVuIHBhcmVudGhlc2VzIGFyZQotbmVjZXNzYXJ5IGFueXdheSAoaWYgdGhlIHR1cGxlIGlzIHBhcnQgb2YgYSBsYXJnZXIgZXhwcmVzc2lvbikuCi0KLVR1cGxlcyBoYXZlIG1hbnkgdXNlcy4gIEZvciBleGFtcGxlOiAoeCwgeSkgY29vcmRpbmF0ZSBwYWlycywgZW1wbG95ZWUKLXJlY29yZHMgZnJvbSBhIGRhdGFiYXNlLCBldGMuICBUdXBsZXMsIGxpa2Ugc3RyaW5ncywgYXJlIGltbXV0YWJsZTogaXQKLWlzIG5vdCBwb3NzaWJsZSB0byBhc3NpZ24gdG8gdGhlIGluZGl2aWR1YWwgaXRlbXMgb2YgYSB0dXBsZSAoeW91IGNhbgotc2ltdWxhdGUgbXVjaCBvZiB0aGUgc2FtZSBlZmZlY3Qgd2l0aCBzbGljaW5nIGFuZCBjb25jYXRlbmF0aW9uLAotdGhvdWdoKS4gIEl0IGlzIGFsc28gcG9zc2libGUgdG8gY3JlYXRlIHR1cGxlcyB3aGljaCBjb250YWluIG11dGFibGUKLW9iamVjdHMsIHN1Y2ggYXMgbGlzdHMuCi0KLUEgc3BlY2lhbCBwcm9ibGVtIGlzIHRoZSBjb25zdHJ1Y3Rpb24gb2YgdHVwbGVzIGNvbnRhaW5pbmcgMCBvciAxCi1pdGVtczogdGhlIHN5bnRheCBoYXMgc29tZSBleHRyYSBxdWlya3MgdG8gYWNjb21tb2RhdGUgdGhlc2UuICBFbXB0eQotdHVwbGVzIGFyZSBjb25zdHJ1Y3RlZCBieSBhbiBlbXB0eSBwYWlyIG9mIHBhcmVudGhlc2VzOyBhIHR1cGxlIHdpdGgKLW9uZSBpdGVtIGlzIGNvbnN0cnVjdGVkIGJ5IGZvbGxvd2luZyBhIHZhbHVlIHdpdGggYSBjb21tYQotKGl0IGlzIG5vdCBzdWZmaWNpZW50IHRvIGVuY2xvc2UgYSBzaW5nbGUgdmFsdWUgaW4gcGFyZW50aGVzZXMpLgotVWdseSwgYnV0IGVmZmVjdGl2ZS4gIEZvciBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZW1wdHkgPSAoKQotPj4+IHNpbmdsZXRvbiA9ICdoZWxsbycsICAgICMgPC0tIG5vdGUgdHJhaWxpbmcgY29tbWEKLT4+PiBsZW4oZW1wdHkpCi0wCi0+Pj4gbGVuKHNpbmdsZXRvbikKLTEKLT4+PiBzaW5nbGV0b24KLSgnaGVsbG8nLCkKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBzdGF0ZW1lbnQgXGNvZGV7dCA9IDEyMzQ1LCA1NDMyMSwgJ2hlbGxvISd9IGlzIGFuIGV4YW1wbGUgb2YKLVxlbXBoe3R1cGxlIHBhY2tpbmd9OiB0aGUgdmFsdWVzIFxjb2RlezEyMzQ1fSwgXGNvZGV7NTQzMjF9IGFuZAotXGNvZGV7J2hlbGxvISd9IGFyZSBwYWNrZWQgdG9nZXRoZXIgaW4gYSB0dXBsZS4gIFRoZSByZXZlcnNlIG9wZXJhdGlvbgotaXMgYWxzbyBwb3NzaWJsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHgsIHksIHogPSB0Ci1cZW5ke3ZlcmJhdGltfQotCi1UaGlzIGlzIGNhbGxlZCwgYXBwcm9wcmlhdGVseSBlbm91Z2gsIFxlbXBoe3NlcXVlbmNlIHVucGFja2luZ30uCi1TZXF1ZW5jZSB1bnBhY2tpbmcgcmVxdWlyZXMgdGhlIGxpc3Qgb2YgdmFyaWFibGVzIG9uIHRoZSBsZWZ0IHRvCi1oYXZlIHRoZSBzYW1lIG51bWJlciBvZiBlbGVtZW50cyBhcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZS4gIE5vdGUKLXRoYXQgbXVsdGlwbGUgYXNzaWdubWVudCBpcyByZWFsbHkganVzdCBhIGNvbWJpbmF0aW9uIG9mIHR1cGxlIHBhY2tpbmcKLWFuZCBzZXF1ZW5jZSB1bnBhY2tpbmchCi0KLVRoZXJlIGlzIGEgc21hbGwgYml0IG9mIGFzeW1tZXRyeSBoZXJlOiAgcGFja2luZyBtdWx0aXBsZSB2YWx1ZXMKLWFsd2F5cyBjcmVhdGVzIGEgdHVwbGUsIGFuZCB1bnBhY2tpbmcgd29ya3MgZm9yIGFueSBzZXF1ZW5jZS4KLQotJSBYWFggQWRkIGEgYml0IG9uIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHVwbGVzIGFuZCBsaXN0cy4KLQotCi1cc2VjdGlvbntTZXRzIFxsYWJlbHtzZXRzfX0KLQotUHl0aG9uIGFsc28gaW5jbHVkZXMgYSBkYXRhIHR5cGUgZm9yIFxlbXBoe3NldHN9LiAgQSBzZXQgaXMgYW4gdW5vcmRlcmVkCi1jb2xsZWN0aW9uIHdpdGggbm8gZHVwbGljYXRlIGVsZW1lbnRzLiAgQmFzaWMgdXNlcyBpbmNsdWRlIG1lbWJlcnNoaXAKLXRlc3RpbmcgYW5kIGVsaW1pbmF0aW5nIGR1cGxpY2F0ZSBlbnRyaWVzLiAgU2V0IG9iamVjdHMgYWxzbyBzdXBwb3J0Ci1tYXRoZW1hdGljYWwgb3BlcmF0aW9ucyBsaWtlIHVuaW9uLCBpbnRlcnNlY3Rpb24sIGRpZmZlcmVuY2UsIGFuZAotc3ltbWV0cmljIGRpZmZlcmVuY2UuCi0KLUhlcmUgaXMgYSBicmllZiBkZW1vbnN0cmF0aW9uOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gYmFza2V0ID0gWydhcHBsZScsICdvcmFuZ2UnLCAnYXBwbGUnLCAncGVhcicsICdvcmFuZ2UnLCAnYmFuYW5hJ10KLT4+PiBmcnVpdCA9IHNldChiYXNrZXQpICAgICAgICAgICAgICAgIyBjcmVhdGUgYSBzZXQgd2l0aG91dCBkdXBsaWNhdGVzCi0+Pj4gZnJ1aXQKLXNldChbJ29yYW5nZScsICdwZWFyJywgJ2FwcGxlJywgJ2JhbmFuYSddKQotPj4+ICdvcmFuZ2UnIGluIGZydWl0ICAgICAgICAgICAgICAgICAjIGZhc3QgbWVtYmVyc2hpcCB0ZXN0aW5nCi1UcnVlCi0+Pj4gJ2NyYWJncmFzcycgaW4gZnJ1aXQKLUZhbHNlCi0KLT4+PiAjIERlbW9uc3RyYXRlIHNldCBvcGVyYXRpb25zIG9uIHVuaXF1ZSBsZXR0ZXJzIGZyb20gdHdvIHdvcmRzCi0uLi4KLT4+PiBhID0gc2V0KCdhYnJhY2FkYWJyYScpCi0+Pj4gYiA9IHNldCgnYWxhY2F6YW0nKQotPj4+IGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB1bmlxdWUgbGV0dGVycyBpbiBhCi1zZXQoWydhJywgJ3InLCAnYicsICdjJywgJ2QnXSkKLT4+PiBhIC0gYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbGV0dGVycyBpbiBhIGJ1dCBub3QgaW4gYgotc2V0KFsncicsICdkJywgJ2InXSkKLT4+PiBhIHwgYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbGV0dGVycyBpbiBlaXRoZXIgYSBvciBiCi1zZXQoWydhJywgJ2MnLCAncicsICdkJywgJ2InLCAnbScsICd6JywgJ2wnXSkKLT4+PiBhICYgYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbGV0dGVycyBpbiBib3RoIGEgYW5kIGIKLXNldChbJ2EnLCAnYyddKQotPj4+IGEgXiBiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsZXR0ZXJzIGluIGEgb3IgYiBidXQgbm90IGJvdGgKLXNldChbJ3InLCAnZCcsICdiJywgJ20nLCAneicsICdsJ10pCi1cZW5ke3ZlcmJhdGltfQotCi0KLVxzZWN0aW9ue0RpY3Rpb25hcmllcyBcbGFiZWx7ZGljdGlvbmFyaWVzfX0KLQotQW5vdGhlciB1c2VmdWwgZGF0YSB0eXBlIGJ1aWx0IGludG8gUHl0aG9uIGlzIHRoZQotXHVsaW5re1xlbXBoe2RpY3Rpb25hcnl9fXsuLi9saWIvdHlwZXNtYXBwaW5nLmh0bWx9LgotRGljdGlvbmFyaWVzIGFyZSBzb21ldGltZXMgZm91bmQgaW4gb3RoZXIgbGFuZ3VhZ2VzIGFzIGBgYXNzb2NpYXRpdmUKLW1lbW9yaWVzJycgb3IgYGBhc3NvY2lhdGl2ZSBhcnJheXMnJy4gIFVubGlrZSBzZXF1ZW5jZXMsIHdoaWNoIGFyZQotaW5kZXhlZCBieSBhIHJhbmdlIG9mIG51bWJlcnMsIGRpY3Rpb25hcmllcyBhcmUgaW5kZXhlZCBieSBcZW1waHtrZXlzfSwKLXdoaWNoIGNhbiBiZSBhbnkgaW1tdXRhYmxlIHR5cGU7IHN0cmluZ3MgYW5kIG51bWJlcnMgY2FuIGFsd2F5cyBiZQota2V5cy4gIFR1cGxlcyBjYW4gYmUgdXNlZCBhcyBrZXlzIGlmIHRoZXkgY29udGFpbiBvbmx5IHN0cmluZ3MsCi1udW1iZXJzLCBvciB0dXBsZXM7IGlmIGEgdHVwbGUgY29udGFpbnMgYW55IG11dGFibGUgb2JqZWN0IGVpdGhlcgotZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwgaXQgY2Fubm90IGJlIHVzZWQgYXMgYSBrZXkuICBZb3UgY2FuJ3QgdXNlCi1saXN0cyBhcyBrZXlzLCBzaW5jZSBsaXN0cyBjYW4gYmUgbW9kaWZpZWQgaW4gcGxhY2UgdXNpbmcKLWluZGV4IGFzc2lnbm1lbnRzLCBzbGljZSBhc3NpZ25tZW50cywgb3IgbWV0aG9kcyBsaWtlCi1cbWV0aG9ke2FwcGVuZCgpfSBhbmQgXG1ldGhvZHtleHRlbmQoKX0uCi0KLUl0IGlzIGJlc3QgdG8gdGhpbmsgb2YgYSBkaWN0aW9uYXJ5IGFzIGFuIHVub3JkZXJlZCBzZXQgb2YKLVxlbXBoe2tleTogdmFsdWV9IHBhaXJzLCB3aXRoIHRoZSByZXF1aXJlbWVudCB0aGF0IHRoZSBrZXlzIGFyZSB1bmlxdWUKLSh3aXRoaW4gb25lIGRpY3Rpb25hcnkpLgotQSBwYWlyIG9mIGJyYWNlcyBjcmVhdGVzIGFuIGVtcHR5IGRpY3Rpb25hcnk6IFxjb2Rle1x7XH19LgotUGxhY2luZyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGtleTp2YWx1ZSBwYWlycyB3aXRoaW4gdGhlCi1icmFjZXMgYWRkcyBpbml0aWFsIGtleTp2YWx1ZSBwYWlycyB0byB0aGUgZGljdGlvbmFyeTsgdGhpcyBpcyBhbHNvIHRoZQotd2F5IGRpY3Rpb25hcmllcyBhcmUgd3JpdHRlbiBvbiBvdXRwdXQuCi0KLVRoZSBtYWluIG9wZXJhdGlvbnMgb24gYSBkaWN0aW9uYXJ5IGFyZSBzdG9yaW5nIGEgdmFsdWUgd2l0aCBzb21lIGtleQotYW5kIGV4dHJhY3RpbmcgdGhlIHZhbHVlIGdpdmVuIHRoZSBrZXkuICBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGRlbGV0ZQotYSBrZXk6dmFsdWUgcGFpcgotd2l0aCBcY29kZXtkZWx9LgotSWYgeW91IHN0b3JlIHVzaW5nIGEga2V5IHRoYXQgaXMgYWxyZWFkeSBpbiB1c2UsIHRoZSBvbGQgdmFsdWUKLWFzc29jaWF0ZWQgd2l0aCB0aGF0IGtleSBpcyBmb3Jnb3R0ZW4uICBJdCBpcyBhbiBlcnJvciB0byBleHRyYWN0IGEKLXZhbHVlIHVzaW5nIGEgbm9uLWV4aXN0ZW50IGtleS4KLQotVGhlIFxtZXRob2R7a2V5cygpfSBtZXRob2Qgb2YgYSBkaWN0aW9uYXJ5IG9iamVjdCByZXR1cm5zIGEgbGlzdCBvZiBhbGwKLXRoZSBrZXlzIHVzZWQgaW4gdGhlIGRpY3Rpb25hcnksIGluIGFyYml0cmFyeSBvcmRlciAoaWYgeW91IHdhbnQgaXQKLXNvcnRlZCwganVzdCBhcHBseSB0aGUgXG1ldGhvZHtzb3J0KCl9IG1ldGhvZCB0byB0aGUgbGlzdCBvZiBrZXlzKS4gIFRvCi1jaGVjayB3aGV0aGVyIGEgc2luZ2xlIGtleSBpcyBpbiB0aGUgZGljdGlvbmFyeSwgZWl0aGVyIHVzZSB0aGUgZGljdGlvbmFyeSdzCi1cbWV0aG9ke2hhc19rZXkoKX0gbWV0aG9kIG9yIHRoZSBca2V5d29yZHtpbn0ga2V5d29yZC4KLQotSGVyZSBpcyBhIHNtYWxsIGV4YW1wbGUgdXNpbmcgYSBkaWN0aW9uYXJ5OgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gdGVsID0geydqYWNrJzogNDA5OCwgJ3NhcGUnOiA0MTM5fQotPj4+IHRlbFsnZ3VpZG8nXSA9IDQxMjcKLT4+PiB0ZWwKLXsnc2FwZSc6IDQxMzksICdndWlkbyc6IDQxMjcsICdqYWNrJzogNDA5OH0KLT4+PiB0ZWxbJ2phY2snXQotNDA5OAotPj4+IGRlbCB0ZWxbJ3NhcGUnXQotPj4+IHRlbFsnaXJ2J10gPSA0MTI3Ci0+Pj4gdGVsCi17J2d1aWRvJzogNDEyNywgJ2lydic6IDQxMjcsICdqYWNrJzogNDA5OH0KLT4+PiB0ZWwua2V5cygpCi1bJ2d1aWRvJywgJ2lydicsICdqYWNrJ10KLT4+PiB0ZWwuaGFzX2tleSgnZ3VpZG8nKQotVHJ1ZQotPj4+ICdndWlkbycgaW4gdGVsCi1UcnVlCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgXGZ1bmN0aW9ue2RpY3QoKX0gY29uc3RydWN0b3IgYnVpbGRzIGRpY3Rpb25hcmllcyBkaXJlY3RseSBmcm9tCi1saXN0cyBvZiBrZXktdmFsdWUgcGFpcnMgc3RvcmVkIGFzIHR1cGxlcy4gIFdoZW4gdGhlIHBhaXJzIGZvcm0gYQotcGF0dGVybiwgbGlzdCBjb21wcmVoZW5zaW9ucyBjYW4gY29tcGFjdGx5IHNwZWNpZnkgdGhlIGtleS12YWx1ZSBsaXN0LgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZGljdChbKCdzYXBlJywgNDEzOSksICgnZ3VpZG8nLCA0MTI3KSwgKCdqYWNrJywgNDA5OCldKQoteydzYXBlJzogNDEzOSwgJ2phY2snOiA0MDk4LCAnZ3VpZG8nOiA0MTI3fQotPj4+IGRpY3QoWyh4LCB4KioyKSBmb3IgeCBpbiAoMiwgNCwgNildKSAgICAgIyB1c2UgYSBsaXN0IGNvbXByZWhlbnNpb24KLXsyOiA0LCA0OiAxNiwgNjogMzZ9Ci1cZW5ke3ZlcmJhdGltfQotCi1MYXRlciBpbiB0aGUgdHV0b3JpYWwsIHdlIHdpbGwgbGVhcm4gYWJvdXQgR2VuZXJhdG9yIEV4cHJlc3Npb25zCi13aGljaCBhcmUgZXZlbiBiZXR0ZXIgc3VpdGVkIGZvciB0aGUgdGFzayBvZiBzdXBwbHlpbmcga2V5LXZhbHVlcyBwYWlycyB0bwotdGhlIFxmdW5jdGlvbntkaWN0KCl9IGNvbnN0cnVjdG9yLgotCi1XaGVuIHRoZSBrZXlzIGFyZSBzaW1wbGUgc3RyaW5ncywgaXQgaXMgc29tZXRpbWVzIGVhc2llciB0byBzcGVjaWZ5Ci1wYWlycyB1c2luZyBrZXl3b3JkIGFyZ3VtZW50czoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGRpY3Qoc2FwZT00MTM5LCBndWlkbz00MTI3LCBqYWNrPTQwOTgpCi17J3NhcGUnOiA0MTM5LCAnamFjayc6IDQwOTgsICdndWlkbyc6IDQxMjd9Ci1cZW5ke3ZlcmJhdGltfQotCi0KLVxzZWN0aW9ue0xvb3BpbmcgVGVjaG5pcXVlcyBcbGFiZWx7bG9vcGlkaW9tc319Ci0KLVdoZW4gbG9vcGluZyB0aHJvdWdoIGRpY3Rpb25hcmllcywgdGhlIGtleSBhbmQgY29ycmVzcG9uZGluZyB2YWx1ZSBjYW4KLWJlIHJldHJpZXZlZCBhdCB0aGUgc2FtZSB0aW1lIHVzaW5nIHRoZSBcbWV0aG9ke2l0ZXJpdGVtcygpfSBtZXRob2QuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBrbmlnaHRzID0geydnYWxsYWhhZCc6ICd0aGUgcHVyZScsICdyb2Jpbic6ICd0aGUgYnJhdmUnfQotPj4+IGZvciBrLCB2IGluIGtuaWdodHMuaXRlcml0ZW1zKCk6Ci0uLi4gICAgIHByaW50IGssIHYKLS4uLgotZ2FsbGFoYWQgdGhlIHB1cmUKLXJvYmluIHRoZSBicmF2ZQotXGVuZHt2ZXJiYXRpbX0KLSAKLVdoZW4gbG9vcGluZyB0aHJvdWdoIGEgc2VxdWVuY2UsIHRoZSBwb3NpdGlvbiBpbmRleCBhbmQgY29ycmVzcG9uZGluZwotdmFsdWUgY2FuIGJlIHJldHJpZXZlZCBhdCB0aGUgc2FtZSB0aW1lIHVzaW5nIHRoZQotXGZ1bmN0aW9ue2VudW1lcmF0ZSgpfSBmdW5jdGlvbi4KLQotXGJlZ2lue3ZlcmJhdGltfSAKLT4+PiBmb3IgaSwgdiBpbiBlbnVtZXJhdGUoWyd0aWMnLCAndGFjJywgJ3RvZSddKToKLS4uLiAgICAgcHJpbnQgaSwgdgotLi4uCi0wIHRpYwotMSB0YWMKLTIgdG9lCi1cZW5ke3ZlcmJhdGltfQotCi1UbyBsb29wIG92ZXIgdHdvIG9yIG1vcmUgc2VxdWVuY2VzIGF0IHRoZSBzYW1lIHRpbWUsIHRoZSBlbnRyaWVzCi1jYW4gYmUgcGFpcmVkIHdpdGggdGhlIFxmdW5jdGlvbnt6aXAoKX0gZnVuY3Rpb24uCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBxdWVzdGlvbnMgPSBbJ25hbWUnLCAncXVlc3QnLCAnZmF2b3JpdGUgY29sb3InXQotPj4+IGFuc3dlcnMgPSBbJ2xhbmNlbG90JywgJ3RoZSBob2x5IGdyYWlsJywgJ2JsdWUnXQotPj4+IGZvciBxLCBhIGluIHppcChxdWVzdGlvbnMsIGFuc3dlcnMpOgotLi4uICAgICBwcmludCAnV2hhdCBpcyB5b3VyICVzPyAgSXQgaXMgJXMuJyAlIChxLCBhKQotLi4uCQotV2hhdCBpcyB5b3VyIG5hbWU/ICBJdCBpcyBsYW5jZWxvdC4KLVdoYXQgaXMgeW91ciBxdWVzdD8gIEl0IGlzIHRoZSBob2x5IGdyYWlsLgotV2hhdCBpcyB5b3VyIGZhdm9yaXRlIGNvbG9yPyAgSXQgaXMgYmx1ZS4KLVxlbmR7dmVyYmF0aW19Ci0KLVRvIGxvb3Agb3ZlciBhIHNlcXVlbmNlIGluIHJldmVyc2UsIGZpcnN0IHNwZWNpZnkgdGhlIHNlcXVlbmNlCi1pbiBhIGZvcndhcmQgZGlyZWN0aW9uIGFuZCB0aGVuIGNhbGwgdGhlIFxmdW5jdGlvbntyZXZlcnNlZCgpfQotZnVuY3Rpb24uCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBmb3IgaSBpbiByZXZlcnNlZChyYW5nZSgxLDEwLDIpKToKLS4uLiAgICAgcHJpbnQgaQotLi4uCi05Ci03Ci01Ci0zCi0xCi1cZW5ke3ZlcmJhdGltfQotCi1UbyBsb29wIG92ZXIgYSBzZXF1ZW5jZSBpbiBzb3J0ZWQgb3JkZXIsIHVzZSB0aGUgXGZ1bmN0aW9ue3NvcnRlZCgpfQotZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhIG5ldyBzb3J0ZWQgbGlzdCB3aGlsZSBsZWF2aW5nIHRoZSBzb3VyY2UKLXVuYWx0ZXJlZC4KLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGJhc2tldCA9IFsnYXBwbGUnLCAnb3JhbmdlJywgJ2FwcGxlJywgJ3BlYXInLCAnb3JhbmdlJywgJ2JhbmFuYSddCi0+Pj4gZm9yIGYgaW4gc29ydGVkKHNldChiYXNrZXQpKToKLS4uLiAgICAgcHJpbnQgZgotLi4uIAkKLWFwcGxlCi1iYW5hbmEKLW9yYW5nZQotcGVhcgotXGVuZHt2ZXJiYXRpbX0KLQotXHNlY3Rpb257TW9yZSBvbiBDb25kaXRpb25zIFxsYWJlbHtjb25kaXRpb25zfX0KLQotVGhlIGNvbmRpdGlvbnMgdXNlZCBpbiBcY29kZXt3aGlsZX0gYW5kIFxjb2Rle2lmfSBzdGF0ZW1lbnRzIGNhbgotY29udGFpbiBhbnkgb3BlcmF0b3JzLCBub3QganVzdCBjb21wYXJpc29ucy4KLQotVGhlIGNvbXBhcmlzb24gb3BlcmF0b3JzIFxjb2Rle2lufSBhbmQgXGNvZGV7bm90IGlufSBjaGVjayB3aGV0aGVyIGEgdmFsdWUKLW9jY3VycyAoZG9lcyBub3Qgb2NjdXIpIGluIGEgc2VxdWVuY2UuICBUaGUgb3BlcmF0b3JzIFxjb2Rle2lzfSBhbmQKLVxjb2Rle2lzIG5vdH0gY29tcGFyZSB3aGV0aGVyIHR3byBvYmplY3RzIGFyZSByZWFsbHkgdGhlIHNhbWUgb2JqZWN0OyB0aGlzCi1vbmx5IG1hdHRlcnMgZm9yIG11dGFibGUgb2JqZWN0cyBsaWtlIGxpc3RzLiAgQWxsIGNvbXBhcmlzb24gb3BlcmF0b3JzCi1oYXZlIHRoZSBzYW1lIHByaW9yaXR5LCB3aGljaCBpcyBsb3dlciB0aGFuIHRoYXQgb2YgYWxsIG51bWVyaWNhbAotb3BlcmF0b3JzLgotCi1Db21wYXJpc29ucyBjYW4gYmUgY2hhaW5lZC4gIEZvciBleGFtcGxlLCBcY29kZXthIDwgYiA9PSBjfSB0ZXN0cwotd2hldGhlciBcY29kZXthfSBpcyBsZXNzIHRoYW4gXGNvZGV7Yn0gYW5kIG1vcmVvdmVyIFxjb2Rle2J9IGVxdWFscwotXGNvZGV7Y30uCi0KLUNvbXBhcmlzb25zIG1heSBiZSBjb21iaW5lZCB1c2luZyB0aGUgQm9vbGVhbiBvcGVyYXRvcnMgXGNvZGV7YW5kfSBhbmQKLVxjb2Rle29yfSwgYW5kIHRoZSBvdXRjb21lIG9mIGEgY29tcGFyaXNvbiAob3Igb2YgYW55IG90aGVyIEJvb2xlYW4KLWV4cHJlc3Npb24pIG1heSBiZSBuZWdhdGVkIHdpdGggXGNvZGV7bm90fS4gIFRoZXNlIGhhdmUgbG93ZXIKLXByaW9yaXRpZXMgdGhhbiBjb21wYXJpc29uIG9wZXJhdG9yczsgYmV0d2VlbiB0aGVtLCBcY29kZXtub3R9IGhhcwotdGhlIGhpZ2hlc3QgcHJpb3JpdHkgYW5kIFxjb2Rle29yfSB0aGUgbG93ZXN0LCBzbyB0aGF0Ci1cY29kZXtBIGFuZCBub3QgQiBvciBDfSBpcyBlcXVpdmFsZW50IHRvIFxjb2RleyhBIGFuZCAobm90IEIpKSBvciBDfS4KLUFzIGFsd2F5cywgcGFyZW50aGVzZXMgY2FuIGJlIHVzZWQgdG8gZXhwcmVzcyB0aGUgZGVzaXJlZCBjb21wb3NpdGlvbi4KLQotVGhlIEJvb2xlYW4gb3BlcmF0b3JzIFxjb2Rle2FuZH0gYW5kIFxjb2Rle29yfSBhcmUgc28tY2FsbGVkCi1cZW1waHtzaG9ydC1jaXJjdWl0fSBvcGVyYXRvcnM6IHRoZWlyIGFyZ3VtZW50cyBhcmUgZXZhbHVhdGVkIGZyb20KLWxlZnQgdG8gcmlnaHQsIGFuZCBldmFsdWF0aW9uIHN0b3BzIGFzIHNvb24gYXMgdGhlIG91dGNvbWUgaXMKLWRldGVybWluZWQuICBGb3IgZXhhbXBsZSwgaWYgXGNvZGV7QX0gYW5kIFxjb2Rle0N9IGFyZSB0cnVlIGJ1dAotXGNvZGV7Qn0gaXMgZmFsc2UsIFxjb2Rle0EgYW5kIEIgYW5kIEN9IGRvZXMgbm90IGV2YWx1YXRlIHRoZQotZXhwcmVzc2lvbiBcY29kZXtDfS4gIFdoZW4gdXNlZCBhcyBhIGdlbmVyYWwgdmFsdWUgYW5kIG5vdCBhcyBhCi1Cb29sZWFuLCB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgc2hvcnQtY2lyY3VpdCBvcGVyYXRvciBpcyB0aGUgbGFzdAotZXZhbHVhdGVkIGFyZ3VtZW50LgotCi1JdCBpcyBwb3NzaWJsZSB0byBhc3NpZ24gdGhlIHJlc3VsdCBvZiBhIGNvbXBhcmlzb24gb3Igb3RoZXIgQm9vbGVhbgotZXhwcmVzc2lvbiB0byBhIHZhcmlhYmxlLiAgRm9yIGV4YW1wbGUsCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBzdHJpbmcxLCBzdHJpbmcyLCBzdHJpbmczID0gJycsICdUcm9uZGhlaW0nLCAnSGFtbWVyIERhbmNlJwotPj4+IG5vbl9udWxsID0gc3RyaW5nMSBvciBzdHJpbmcyIG9yIHN0cmluZzMKLT4+PiBub25fbnVsbAotJ1Ryb25kaGVpbScKLVxlbmR7dmVyYmF0aW19Ci0KLU5vdGUgdGhhdCBpbiBQeXRob24sIHVubGlrZSBDLCBhc3NpZ25tZW50IGNhbm5vdCBvY2N1ciBpbnNpZGUgZXhwcmVzc2lvbnMuCi1DIHByb2dyYW1tZXJzIG1heSBncnVtYmxlIGFib3V0IHRoaXMsIGJ1dCBpdCBhdm9pZHMgYSBjb21tb24gY2xhc3Mgb2YKLXByb2JsZW1zIGVuY291bnRlcmVkIGluIEMgcHJvZ3JhbXM6IHR5cGluZyBcY29kZXs9fSBpbiBhbiBleHByZXNzaW9uIHdoZW4KLVxjb2Rlez09fSB3YXMgaW50ZW5kZWQuCi0KLQotXHNlY3Rpb257Q29tcGFyaW5nIFNlcXVlbmNlcyBhbmQgT3RoZXIgVHlwZXMgXGxhYmVse2NvbXBhcmluZ319Ci0KLVNlcXVlbmNlIG9iamVjdHMgbWF5IGJlIGNvbXBhcmVkIHRvIG90aGVyIG9iamVjdHMgd2l0aCB0aGUgc2FtZQotc2VxdWVuY2UgdHlwZS4gIFRoZSBjb21wYXJpc29uIHVzZXMgXGVtcGh7bGV4aWNvZ3JhcGhpY2FsfSBvcmRlcmluZzoKLWZpcnN0IHRoZSBmaXJzdCB0d28gaXRlbXMgYXJlIGNvbXBhcmVkLCBhbmQgaWYgdGhleSBkaWZmZXIgdGhpcwotZGV0ZXJtaW5lcyB0aGUgb3V0Y29tZSBvZiB0aGUgY29tcGFyaXNvbjsgaWYgdGhleSBhcmUgZXF1YWwsIHRoZSBuZXh0Ci10d28gaXRlbXMgYXJlIGNvbXBhcmVkLCBhbmQgc28gb24sIHVudGlsIGVpdGhlciBzZXF1ZW5jZSBpcyBleGhhdXN0ZWQuCi1JZiB0d28gaXRlbXMgdG8gYmUgY29tcGFyZWQgYXJlIHRoZW1zZWx2ZXMgc2VxdWVuY2VzIG9mIHRoZSBzYW1lIHR5cGUsCi10aGUgbGV4aWNvZ3JhcGhpY2FsIGNvbXBhcmlzb24gaXMgY2FycmllZCBvdXQgcmVjdXJzaXZlbHkuICBJZiBhbGwKLWl0ZW1zIG9mIHR3byBzZXF1ZW5jZXMgY29tcGFyZSBlcXVhbCwgdGhlIHNlcXVlbmNlcyBhcmUgY29uc2lkZXJlZAotZXF1YWwuICBJZiBvbmUgc2VxdWVuY2UgaXMgYW4gaW5pdGlhbCBzdWItc2VxdWVuY2Ugb2YgdGhlIG90aGVyLCB0aGUKLXNob3J0ZXIgc2VxdWVuY2UgaXMgdGhlIHNtYWxsZXIgKGxlc3Nlcikgb25lLiAgTGV4aWNvZ3JhcGhpY2FsCi1vcmRlcmluZyBmb3Igc3RyaW5ncyB1c2VzIHRoZSBcQVNDSUl7fSBvcmRlcmluZyBmb3IgaW5kaXZpZHVhbAotY2hhcmFjdGVycy4gIFNvbWUgZXhhbXBsZXMgb2YgY29tcGFyaXNvbnMgYmV0d2VlbiBzZXF1ZW5jZXMgb2YgdGhlCi1zYW1lIHR5cGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSgxLCAyLCAzKSAgICAgICAgICAgICAgPCAoMSwgMiwgNCkKLVsxLCAyLCAzXSAgICAgICAgICAgICAgPCBbMSwgMiwgNF0KLSdBQkMnIDwgJ0MnIDwgJ1Bhc2NhbCcgPCAnUHl0aG9uJwotKDEsIDIsIDMsIDQpICAgICAgICAgICA8ICgxLCAyLCA0KQotKDEsIDIpICAgICAgICAgICAgICAgICA8ICgxLCAyLCAtMSkKLSgxLCAyLCAzKSAgICAgICAgICAgICA9PSAoMS4wLCAyLjAsIDMuMCkKLSgxLCAyLCAoJ2FhJywgJ2FiJykpICAgPCAoMSwgMiwgKCdhYmMnLCAnYScpLCA0KQotXGVuZHt2ZXJiYXRpbX0KLQotTm90ZSB0aGF0IGNvbXBhcmluZyBvYmplY3RzIG9mIGRpZmZlcmVudCB0eXBlcyBpcyBsZWdhbC4gIFRoZSBvdXRjb21lCi1pcyBkZXRlcm1pbmlzdGljIGJ1dCBhcmJpdHJhcnk6IHRoZSB0eXBlcyBhcmUgb3JkZXJlZCBieSB0aGVpciBuYW1lLgotVGh1cywgYSBsaXN0IGlzIGFsd2F5cyBzbWFsbGVyIHRoYW4gYSBzdHJpbmcsIGEgc3RyaW5nIGlzIGFsd2F5cwotc21hbGxlciB0aGFuIGEgdHVwbGUsIGV0Yy4gIFxmb290bm90ZXsKLSAgICAgICAgVGhlIHJ1bGVzIGZvciBjb21wYXJpbmcgb2JqZWN0cyBvZiBkaWZmZXJlbnQgdHlwZXMgc2hvdWxkCi0gICAgICAgIG5vdCBiZSByZWxpZWQgdXBvbjsgdGhleSBtYXkgY2hhbmdlIGluIGEgZnV0dXJlIHZlcnNpb24gb2YKLSAgICAgICAgdGhlIGxhbmd1YWdlLgotfSBNaXhlZCBudW1lcmljIHR5cGVzIGFyZSBjb21wYXJlZCBhY2NvcmRpbmcgdG8gdGhlaXIgbnVtZXJpYyB2YWx1ZSwgc28KLTAgZXF1YWxzIDAuMCwgZXRjLgotCi0KLVxjaGFwdGVye01vZHVsZXMgXGxhYmVse21vZHVsZXN9fQotCi1JZiB5b3UgcXVpdCBmcm9tIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgYW5kIGVudGVyIGl0IGFnYWluLCB0aGUKLWRlZmluaXRpb25zIHlvdSBoYXZlIG1hZGUgKGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzKSBhcmUgbG9zdC4KLVRoZXJlZm9yZSwgaWYgeW91IHdhbnQgdG8gd3JpdGUgYSBzb21ld2hhdCBsb25nZXIgcHJvZ3JhbSwgeW91IGFyZQotYmV0dGVyIG9mZiB1c2luZyBhIHRleHQgZWRpdG9yIHRvIHByZXBhcmUgdGhlIGlucHV0IGZvciB0aGUgaW50ZXJwcmV0ZXIKLWFuZCBydW5uaW5nIGl0IHdpdGggdGhhdCBmaWxlIGFzIGlucHV0IGluc3RlYWQuICBUaGlzIGlzIGtub3duIGFzIGNyZWF0aW5nIGEKLVxlbXBoe3NjcmlwdH0uICBBcyB5b3VyIHByb2dyYW0gZ2V0cyBsb25nZXIsIHlvdSBtYXkgd2FudCB0byBzcGxpdCBpdAotaW50byBzZXZlcmFsIGZpbGVzIGZvciBlYXNpZXIgbWFpbnRlbmFuY2UuICBZb3UgbWF5IGFsc28gd2FudCB0byB1c2UgYQotaGFuZHkgZnVuY3Rpb24gdGhhdCB5b3UndmUgd3JpdHRlbiBpbiBzZXZlcmFsIHByb2dyYW1zIHdpdGhvdXQgY29weWluZwotaXRzIGRlZmluaXRpb24gaW50byBlYWNoIHByb2dyYW0uCi0KLVRvIHN1cHBvcnQgdGhpcywgUHl0aG9uIGhhcyBhIHdheSB0byBwdXQgZGVmaW5pdGlvbnMgaW4gYSBmaWxlIGFuZCB1c2UKLXRoZW0gaW4gYSBzY3JpcHQgb3IgaW4gYW4gaW50ZXJhY3RpdmUgaW5zdGFuY2Ugb2YgdGhlIGludGVycHJldGVyLgotU3VjaCBhIGZpbGUgaXMgY2FsbGVkIGEgXGVtcGh7bW9kdWxlfTsgZGVmaW5pdGlvbnMgZnJvbSBhIG1vZHVsZSBjYW4gYmUKLVxlbXBoe2ltcG9ydGVkfSBpbnRvIG90aGVyIG1vZHVsZXMgb3IgaW50byB0aGUgXGVtcGh7bWFpbn0gbW9kdWxlICh0aGUKLWNvbGxlY3Rpb24gb2YgdmFyaWFibGVzIHRoYXQgeW91IGhhdmUgYWNjZXNzIHRvIGluIGEgc2NyaXB0Ci1leGVjdXRlZCBhdCB0aGUgdG9wIGxldmVsCi1hbmQgaW4gY2FsY3VsYXRvciBtb2RlKS4KLQotQSBtb2R1bGUgaXMgYSBmaWxlIGNvbnRhaW5pbmcgUHl0aG9uIGRlZmluaXRpb25zIGFuZCBzdGF0ZW1lbnRzLiAgVGhlCi1maWxlIG5hbWUgaXMgdGhlIG1vZHVsZSBuYW1lIHdpdGggdGhlIHN1ZmZpeCBcZmlsZXsucHl9IGFwcGVuZGVkLiAgV2l0aGluCi1hIG1vZHVsZSwgdGhlIG1vZHVsZSdzIG5hbWUgKGFzIGEgc3RyaW5nKSBpcyBhdmFpbGFibGUgYXMgdGhlIHZhbHVlIG9mCi10aGUgZ2xvYmFsIHZhcmlhYmxlIFxjb2Rle19fbmFtZV9ffS4gIEZvciBpbnN0YW5jZSwgdXNlIHlvdXIgZmF2b3JpdGUgdGV4dAotZWRpdG9yIHRvIGNyZWF0ZSBhIGZpbGUgY2FsbGVkIFxmaWxle2ZpYm8ucHl9IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeQotd2l0aCB0aGUgZm9sbG93aW5nIGNvbnRlbnRzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0jIEZpYm9uYWNjaSBudW1iZXJzIG1vZHVsZQotCi1kZWYgZmliKG4pOiAgICAjIHdyaXRlIEZpYm9uYWNjaSBzZXJpZXMgdXAgdG8gbgotICAgIGEsIGIgPSAwLCAxCi0gICAgd2hpbGUgYiA8IG46Ci0gICAgICAgIHByaW50IGIsCi0gICAgICAgIGEsIGIgPSBiLCBhK2IKLQotZGVmIGZpYjIobik6ICMgcmV0dXJuIEZpYm9uYWNjaSBzZXJpZXMgdXAgdG8gbgotICAgIHJlc3VsdCA9IFtdCi0gICAgYSwgYiA9IDAsIDEKLSAgICB3aGlsZSBiIDwgbjoKLSAgICAgICAgcmVzdWx0LmFwcGVuZChiKQotICAgICAgICBhLCBiID0gYiwgYStiCi0gICAgcmV0dXJuIHJlc3VsdAotXGVuZHt2ZXJiYXRpbX0KLQotTm93IGVudGVyIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgYW5kIGltcG9ydCB0aGlzIG1vZHVsZSB3aXRoIHRoZQotZm9sbG93aW5nIGNvbW1hbmQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgZmlibwotXGVuZHt2ZXJiYXRpbX0KLQotVGhpcyBkb2VzIG5vdCBlbnRlciB0aGUgbmFtZXMgb2YgdGhlIGZ1bmN0aW9ucyBkZWZpbmVkIGluIFxjb2Rle2ZpYm99IAotZGlyZWN0bHkgaW4gdGhlIGN1cnJlbnQgc3ltYm9sIHRhYmxlOyBpdCBvbmx5IGVudGVycyB0aGUgbW9kdWxlIG5hbWUKLVxjb2Rle2ZpYm99IHRoZXJlLgotVXNpbmcgdGhlIG1vZHVsZSBuYW1lIHlvdSBjYW4gYWNjZXNzIHRoZSBmdW5jdGlvbnM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBmaWJvLmZpYigxMDAwKQotMSAxIDIgMyA1IDggMTMgMjEgMzQgNTUgODkgMTQ0IDIzMyAzNzcgNjEwIDk4NwotPj4+IGZpYm8uZmliMigxMDApCi1bMSwgMSwgMiwgMywgNSwgOCwgMTMsIDIxLCAzNCwgNTUsIDg5XQotPj4+IGZpYm8uX19uYW1lX18KLSdmaWJvJwotXGVuZHt2ZXJiYXRpbX0KLQotSWYgeW91IGludGVuZCB0byB1c2UgYSBmdW5jdGlvbiBvZnRlbiB5b3UgY2FuIGFzc2lnbiBpdCB0byBhIGxvY2FsIG5hbWU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBmaWIgPSBmaWJvLmZpYgotPj4+IGZpYig1MDApCi0xIDEgMiAzIDUgOCAxMyAyMSAzNCA1NSA4OSAxNDQgMjMzIDM3NwotXGVuZHt2ZXJiYXRpbX0KLQotCi1cc2VjdGlvbntNb3JlIG9uIE1vZHVsZXMgXGxhYmVse21vcmVNb2R1bGVzfX0KLQotQSBtb2R1bGUgY2FuIGNvbnRhaW4gZXhlY3V0YWJsZSBzdGF0ZW1lbnRzIGFzIHdlbGwgYXMgZnVuY3Rpb24KLWRlZmluaXRpb25zLgotVGhlc2Ugc3RhdGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gaW5pdGlhbGl6ZSB0aGUgbW9kdWxlLgotVGhleSBhcmUgZXhlY3V0ZWQgb25seSB0aGUKLVxlbXBoe2ZpcnN0fSB0aW1lIHRoZSBtb2R1bGUgaXMgaW1wb3J0ZWQgc29tZXdoZXJlLlxmb290bm90ZXsKLSAgICAgICAgSW4gZmFjdCBmdW5jdGlvbiBkZWZpbml0aW9ucyBhcmUgYWxzbyBgc3RhdGVtZW50cycgdGhhdCBhcmUKLSAgICAgICAgYGV4ZWN1dGVkJzsgdGhlIGV4ZWN1dGlvbiBlbnRlcnMgdGhlIGZ1bmN0aW9uIG5hbWUgaW4gdGhlCi0gICAgICAgIG1vZHVsZSdzIGdsb2JhbCBzeW1ib2wgdGFibGUuCi19Ci0KLUVhY2ggbW9kdWxlIGhhcyBpdHMgb3duIHByaXZhdGUgc3ltYm9sIHRhYmxlLCB3aGljaCBpcyB1c2VkIGFzIHRoZQotZ2xvYmFsIHN5bWJvbCB0YWJsZSBieSBhbGwgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1vZHVsZS4KLVRodXMsIHRoZSBhdXRob3Igb2YgYSBtb2R1bGUgY2FuIHVzZSBnbG9iYWwgdmFyaWFibGVzIGluIHRoZSBtb2R1bGUKLXdpdGhvdXQgd29ycnlpbmcgYWJvdXQgYWNjaWRlbnRhbCBjbGFzaGVzIHdpdGggYSB1c2VyJ3MgZ2xvYmFsCi12YXJpYWJsZXMuCi1PbiB0aGUgb3RoZXIgaGFuZCwgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIHlvdSBjYW4gdG91Y2ggYQotbW9kdWxlJ3MgZ2xvYmFsIHZhcmlhYmxlcyB3aXRoIHRoZSBzYW1lIG5vdGF0aW9uIHVzZWQgdG8gcmVmZXIgdG8gaXRzCi1mdW5jdGlvbnMsCi1cY29kZXttb2RuYW1lLml0ZW1uYW1lfS4KLQotTW9kdWxlcyBjYW4gaW1wb3J0IG90aGVyIG1vZHVsZXMuICBJdCBpcyBjdXN0b21hcnkgYnV0IG5vdCByZXF1aXJlZCB0bwotcGxhY2UgYWxsIFxrZXl3b3Jke2ltcG9ydH0gc3RhdGVtZW50cyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbW9kdWxlIChvcgotc2NyaXB0LCBmb3IgdGhhdCBtYXR0ZXIpLiAgVGhlIGltcG9ydGVkIG1vZHVsZSBuYW1lcyBhcmUgcGxhY2VkIGluIHRoZQotaW1wb3J0aW5nIG1vZHVsZSdzIGdsb2JhbCBzeW1ib2wgdGFibGUuCi0KLVRoZXJlIGlzIGEgdmFyaWFudCBvZiB0aGUgXGtleXdvcmR7aW1wb3J0fSBzdGF0ZW1lbnQgdGhhdCBpbXBvcnRzCi1uYW1lcyBmcm9tIGEgbW9kdWxlIGRpcmVjdGx5IGludG8gdGhlIGltcG9ydGluZyBtb2R1bGUncyBzeW1ib2wKLXRhYmxlLiAgRm9yIGV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBmcm9tIGZpYm8gaW1wb3J0IGZpYiwgZmliMgotPj4+IGZpYig1MDApCi0xIDEgMiAzIDUgOCAxMyAyMSAzNCA1NSA4OSAxNDQgMjMzIDM3NwotXGVuZHt2ZXJiYXRpbX0KLQotVGhpcyBkb2VzIG5vdCBpbnRyb2R1Y2UgdGhlIG1vZHVsZSBuYW1lIGZyb20gd2hpY2ggdGhlIGltcG9ydHMgYXJlIHRha2VuCi1pbiB0aGUgbG9jYWwgc3ltYm9sIHRhYmxlIChzbyBpbiB0aGUgZXhhbXBsZSwgXGNvZGV7Zmlib30gaXMgbm90Ci1kZWZpbmVkKS4KLQotVGhlcmUgaXMgZXZlbiBhIHZhcmlhbnQgdG8gaW1wb3J0IGFsbCBuYW1lcyB0aGF0IGEgbW9kdWxlIGRlZmluZXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBmcm9tIGZpYm8gaW1wb3J0ICoKLT4+PiBmaWIoNTAwKQotMSAxIDIgMyA1IDggMTMgMjEgMzQgNTUgODkgMTQ0IDIzMyAzNzcKLVxlbmR7dmVyYmF0aW19Ci0KLVRoaXMgaW1wb3J0cyBhbGwgbmFtZXMgZXhjZXB0IHRob3NlIGJlZ2lubmluZyB3aXRoIGFuIHVuZGVyc2NvcmUKLShcY29kZXtffSkuCi0KLVxzdWJzZWN0aW9ue0V4ZWN1dGluZyBtb2R1bGVzIGFzIHNjcmlwdHMgXGxhYmVse21vZHVsZXNBc1NjcmlwdHN9fQotCi1XaGVuIHlvdSBydW4gYSBQeXRob24gbW9kdWxlIHdpdGgKLQotXGJlZ2lue3ZlcmJhdGltfQotcHl0aG9uIGZpYm8ucHkgPGFyZ3VtZW50cz4KLVxlbmR7dmVyYmF0aW19Ci0KLXRoZSBjb2RlIGluIHRoZSBtb2R1bGUgd2lsbCBiZSBleGVjdXRlZCwganVzdCBhcyBpZiB5b3UgaW1wb3J0ZWQgaXQsIGJ1dAotd2l0aCB0aGUgXGNvZGV7X19uYW1lX199IHNldCB0byBcY29kZXsiX19tYWluX18ifS4gIFRoYXQgbWVhbnMgdGhhdCBieQotYWRkaW5nIHRoaXMgY29kZSBhdCB0aGUgZW5kIG9mIHlvdXIgbW9kdWxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIGltcG9ydCBzeXMKLSAgICBmaWIoaW50KHN5cy5hcmd2WzFdKSkKLVxlbmR7dmVyYmF0aW19Ci0KLXlvdSBjYW4gbWFrZSB0aGUgZmlsZSB1c2FibGUgYXMgYSBzY3JpcHQgYXMgd2VsbCBhcyBhbiBpbXBvcnRhYmxlIG1vZHVsZSwKLWJlY2F1c2UgdGhlIGNvZGUgdGhhdCBwYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBvbmx5IHJ1bnMgaWYgdGhlIG1vZHVsZSBpcwotZXhlY3V0ZWQgYXMgdGhlIGBgbWFpbicnIGZpbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSQgcHl0aG9uIGZpYm8ucHkgNTAKLTEgMSAyIDMgNSA4IDEzIDIxIDM0Ci1cZW5ke3ZlcmJhdGltfQotCi1JZiB0aGUgbW9kdWxlIGlzIGltcG9ydGVkLCB0aGUgY29kZSBpcyBub3QgcnVuOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gaW1wb3J0IGZpYm8KLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotVGhpcyBpcyBvZnRlbiB1c2VkIGVpdGhlciB0byBwcm92aWRlIGEgY29udmVuaWVudCB1c2VyIGludGVyZmFjZSB0byBhCi1tb2R1bGUsIG9yIGZvciB0ZXN0aW5nIHB1cnBvc2VzIChydW5uaW5nIHRoZSBtb2R1bGUgYXMgYSBzY3JpcHQgZXhlY3V0ZXMKLWEgdGVzdCBzdWl0ZSkuCi0KLQotXHN1YnNlY3Rpb257VGhlIE1vZHVsZSBTZWFyY2ggUGF0aCBcbGFiZWx7c2VhcmNoUGF0aH19Ci0KLVxpbmRleGlpaXttb2R1bGV9e3NlYXJjaH17cGF0aH0KLVdoZW4gYSBtb2R1bGUgbmFtZWQgXG1vZHVsZXtzcGFtfSBpcyBpbXBvcnRlZCwgdGhlIGludGVycHJldGVyIHNlYXJjaGVzCi1mb3IgYSBmaWxlIG5hbWVkIFxmaWxle3NwYW0ucHl9IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwKLWFuZCB0aGVuIGluIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBieQotdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFxlbnZ2YXJ7UFlUSE9OUEFUSH0uICBUaGlzIGhhcyB0aGUgc2FtZSBzeW50YXggYXMKLXRoZSBzaGVsbCB2YXJpYWJsZSBcZW52dmFye1BBVEh9LCB0aGF0IGlzLCBhIGxpc3Qgb2YKLWRpcmVjdG9yeSBuYW1lcy4gIFdoZW4gXGVudnZhcntQWVRIT05QQVRIfSBpcyBub3Qgc2V0LCBvciB3aGVuIHRoZSBmaWxlCi1pcyBub3QgZm91bmQgdGhlcmUsIHRoZSBzZWFyY2ggY29udGludWVzIGluIGFuIGluc3RhbGxhdGlvbi1kZXBlbmRlbnQKLWRlZmF1bHQgcGF0aDsgb24gXFVOSVgsIHRoaXMgaXMgdXN1YWxseSBcZmlsZXsuOi91c3IvbG9jYWwvbGliL3B5dGhvbn0uCi0KLUFjdHVhbGx5LCBtb2R1bGVzIGFyZSBzZWFyY2hlZCBpbiB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyBnaXZlbiBieSB0aGUgCi12YXJpYWJsZSBcY29kZXtzeXMucGF0aH0gd2hpY2ggaXMgaW5pdGlhbGl6ZWQgZnJvbSB0aGUgZGlyZWN0b3J5IAotY29udGFpbmluZyB0aGUgaW5wdXQgc2NyaXB0IChvciB0aGUgY3VycmVudCBkaXJlY3RvcnkpLAotXGVudnZhcntQWVRIT05QQVRIfSBhbmQgdGhlIGluc3RhbGxhdGlvbi1kZXBlbmRlbnQgZGVmYXVsdC4gIFRoaXMgYWxsb3dzCi1QeXRob24gcHJvZ3JhbXMgdGhhdCBrbm93IHdoYXQgdGhleSdyZSBkb2luZyB0byBtb2RpZnkgb3IgcmVwbGFjZSB0aGUgCi1tb2R1bGUgc2VhcmNoIHBhdGguICBOb3RlIHRoYXQgYmVjYXVzZSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlCi1zY3JpcHQgYmVpbmcgcnVuIGlzIG9uIHRoZSBzZWFyY2ggcGF0aCwgaXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlCi1zY3JpcHQgbm90IGhhdmUgdGhlIHNhbWUgbmFtZSBhcyBhIHN0YW5kYXJkIG1vZHVsZSwgb3IgUHl0aG9uIHdpbGwKLWF0dGVtcHQgdG8gbG9hZCB0aGUgc2NyaXB0IGFzIGEgbW9kdWxlIHdoZW4gdGhhdCBtb2R1bGUgaXMgaW1wb3J0ZWQuCi1UaGlzIHdpbGwgZ2VuZXJhbGx5IGJlIGFuIGVycm9yLiAgU2VlIHNlY3Rpb25+XHJlZntzdGFuZGFyZE1vZHVsZXN9LAotYGBTdGFuZGFyZCBNb2R1bGVzLCcnIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi0KLVxzdWJzZWN0aW9ue2BgQ29tcGlsZWQnJyBQeXRob24gZmlsZXN9Ci0KLUFzIGFuIGltcG9ydGFudCBzcGVlZC11cCBvZiB0aGUgc3RhcnQtdXAgdGltZSBmb3Igc2hvcnQgcHJvZ3JhbXMgdGhhdAotdXNlIGEgbG90IG9mIHN0YW5kYXJkIG1vZHVsZXMsIGlmIGEgZmlsZSBjYWxsZWQgXGZpbGV7c3BhbS5weWN9IGV4aXN0cwotaW4gdGhlIGRpcmVjdG9yeSB3aGVyZSBcZmlsZXtzcGFtLnB5fSBpcyBmb3VuZCwgdGhpcyBpcyBhc3N1bWVkIHRvCi1jb250YWluIGFuIGFscmVhZHktYGBieXRlLWNvbXBpbGVkJycgdmVyc2lvbiBvZiB0aGUgbW9kdWxlIFxtb2R1bGV7c3BhbX0uCi1UaGUgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhlIHZlcnNpb24gb2YgXGZpbGV7c3BhbS5weX0gdXNlZCB0byBjcmVhdGUKLVxmaWxle3NwYW0ucHljfSBpcyByZWNvcmRlZCBpbiBcZmlsZXtzcGFtLnB5Y30sIGFuZCB0aGUKLVxmaWxley5weWN9IGZpbGUgaXMgaWdub3JlZCBpZiB0aGVzZSBkb24ndCBtYXRjaC4KLQotTm9ybWFsbHksIHlvdSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIHRvIGNyZWF0ZSB0aGUKLVxmaWxle3NwYW0ucHljfSBmaWxlLiAgV2hlbmV2ZXIgXGZpbGV7c3BhbS5weX0gaXMgc3VjY2Vzc2Z1bGx5Ci1jb21waWxlZCwgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHdyaXRlIHRoZSBjb21waWxlZCB2ZXJzaW9uIHRvCi1cZmlsZXtzcGFtLnB5Y30uICBJdCBpcyBub3QgYW4gZXJyb3IgaWYgdGhpcyBhdHRlbXB0IGZhaWxzOyBpZiBmb3IgYW55Ci1yZWFzb24gdGhlIGZpbGUgaXMgbm90IHdyaXR0ZW4gY29tcGxldGVseSwgdGhlIHJlc3VsdGluZwotXGZpbGV7c3BhbS5weWN9IGZpbGUgd2lsbCBiZSByZWNvZ25pemVkIGFzIGludmFsaWQgYW5kIHRodXMgaWdub3JlZAotbGF0ZXIuICBUaGUgY29udGVudHMgb2YgdGhlIFxmaWxle3NwYW0ucHljfSBmaWxlIGFyZSBwbGF0Zm9ybQotaW5kZXBlbmRlbnQsIHNvIGEgUHl0aG9uIG1vZHVsZSBkaXJlY3RvcnkgY2FuIGJlIHNoYXJlZCBieSBtYWNoaW5lcyBvZgotZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMuCi0KLVNvbWUgdGlwcyBmb3IgZXhwZXJ0czoKLQotXGJlZ2lue2l0ZW1pemV9Ci0KLVxpdGVtCi1XaGVuIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgaXMgaW52b2tlZCB3aXRoIHRoZSBccHJvZ3JhbW9wdHstT30gZmxhZywKLW9wdGltaXplZCBjb2RlIGlzIGdlbmVyYXRlZCBhbmQgc3RvcmVkIGluIFxmaWxley5weW99IGZpbGVzLiAgVGhlCi1vcHRpbWl6ZXIgY3VycmVudGx5IGRvZXNuJ3QgaGVscCBtdWNoOyBpdCBvbmx5IHJlbW92ZXMKLVxrZXl3b3Jke2Fzc2VydH0gc3RhdGVtZW50cy4gIFdoZW4gXHByb2dyYW1vcHR7LU99IGlzIHVzZWQsIFxlbXBoe2FsbH0KLWJ5dGVjb2RlIGlzIG9wdGltaXplZDsgXGNvZGV7LnB5Y30gZmlsZXMgYXJlIGlnbm9yZWQgYW5kIFxjb2Rley5weX0KLWZpbGVzIGFyZSBjb21waWxlZCB0byBvcHRpbWl6ZWQgYnl0ZWNvZGUuCi0KLVxpdGVtCi1QYXNzaW5nIHR3byBccHJvZ3JhbW9wdHstT30gZmxhZ3MgdG8gdGhlIFB5dGhvbiBpbnRlcnByZXRlcgotKFxwcm9ncmFtb3B0ey1PT30pIHdpbGwgY2F1c2UgdGhlIGJ5dGVjb2RlIGNvbXBpbGVyIHRvIHBlcmZvcm0KLW9wdGltaXphdGlvbnMgdGhhdCBjb3VsZCBpbiBzb21lIHJhcmUgY2FzZXMgcmVzdWx0IGluIG1hbGZ1bmN0aW9uaW5nCi1wcm9ncmFtcy4gIEN1cnJlbnRseSBvbmx5IFxjb2Rle19fZG9jX199IHN0cmluZ3MgYXJlIHJlbW92ZWQgZnJvbSB0aGUKLWJ5dGVjb2RlLCByZXN1bHRpbmcgaW4gbW9yZSBjb21wYWN0IFxmaWxley5weW99IGZpbGVzLiAgU2luY2Ugc29tZQotcHJvZ3JhbXMgbWF5IHJlbHkgb24gaGF2aW5nIHRoZXNlIGF2YWlsYWJsZSwgeW91IHNob3VsZCBvbmx5IHVzZSB0aGlzCi1vcHRpb24gaWYgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcuCi0KLVxpdGVtCi1BIHByb2dyYW0gZG9lc24ndCBydW4gYW55IGZhc3RlciB3aGVuIGl0IGlzIHJlYWQgZnJvbSBhIFxmaWxley5weWN9IG9yCi1cZmlsZXsucHlvfSBmaWxlIHRoYW4gd2hlbiBpdCBpcyByZWFkIGZyb20gYSBcZmlsZXsucHl9IGZpbGU7IHRoZSBvbmx5Ci10aGluZyB0aGF0J3MgZmFzdGVyIGFib3V0IFxmaWxley5weWN9IG9yIFxmaWxley5weW99IGZpbGVzIGlzIHRoZQotc3BlZWQgd2l0aCB3aGljaCB0aGV5IGFyZSBsb2FkZWQuCi0KLVxpdGVtCi1XaGVuIGEgc2NyaXB0IGlzIHJ1biBieSBnaXZpbmcgaXRzIG5hbWUgb24gdGhlIGNvbW1hbmQgbGluZSwgdGhlCi1ieXRlY29kZSBmb3IgdGhlIHNjcmlwdCBpcyBuZXZlciB3cml0dGVuIHRvIGEgXGZpbGV7LnB5Y30gb3IKLVxmaWxley5weW99IGZpbGUuICBUaHVzLCB0aGUgc3RhcnR1cCB0aW1lIG9mIGEgc2NyaXB0IG1heSBiZSByZWR1Y2VkCi1ieSBtb3ZpbmcgbW9zdCBvZiBpdHMgY29kZSB0byBhIG1vZHVsZSBhbmQgaGF2aW5nIGEgc21hbGwgYm9vdHN0cmFwCi1zY3JpcHQgdGhhdCBpbXBvcnRzIHRoYXQgbW9kdWxlLiAgSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBuYW1lIGEKLVxmaWxley5weWN9IG9yIFxmaWxley5weW99IGZpbGUgZGlyZWN0bHkgb24gdGhlIGNvbW1hbmQgbGluZS4KLQotXGl0ZW0KLUl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgYSBmaWxlIGNhbGxlZCBcZmlsZXtzcGFtLnB5Y30gKG9yCi1cZmlsZXtzcGFtLnB5b30gd2hlbiBccHJvZ3JhbW9wdHstT30gaXMgdXNlZCkgd2l0aG91dCBhIGZpbGUKLVxmaWxle3NwYW0ucHl9IGZvciB0aGUgc2FtZSBtb2R1bGUuICBUaGlzIGNhbiBiZSB1c2VkIHRvIGRpc3RyaWJ1dGUgYQotbGlicmFyeSBvZiBQeXRob24gY29kZSBpbiBhIGZvcm0gdGhhdCBpcyBtb2RlcmF0ZWx5IGhhcmQgdG8gcmV2ZXJzZQotZW5naW5lZXIuCi0KLVxpdGVtCi1UaGUgbW9kdWxlIFx1bGlua3tcbW9kdWxle2NvbXBpbGVhbGx9fXsuLi9saWIvbW9kdWxlLWNvbXBpbGVhbGwuaHRtbH0lCi17fSBccmVmc3Rtb2RpbmRleHtjb21waWxlYWxsfSBjYW4gY3JlYXRlIFxmaWxley5weWN9IGZpbGVzIChvcgotXGZpbGV7LnB5b30gZmlsZXMgd2hlbiBccHJvZ3JhbW9wdHstT30gaXMgdXNlZCkgZm9yIGFsbCBtb2R1bGVzIGluIGEKLWRpcmVjdG9yeS4KLQotXGVuZHtpdGVtaXplfQotCi0KLVxzZWN0aW9ue1N0YW5kYXJkIE1vZHVsZXMgXGxhYmVse3N0YW5kYXJkTW9kdWxlc319Ci0KLVB5dGhvbiBjb21lcyB3aXRoIGEgbGlicmFyeSBvZiBzdGFuZGFyZCBtb2R1bGVzLCBkZXNjcmliZWQgaW4gYSBzZXBhcmF0ZQotZG9jdW1lbnQsIHRoZSBcY2l0ZXRpdGxlWy4uL2xpYi9saWIuaHRtbF17UHl0aG9uIExpYnJhcnkgUmVmZXJlbmNlfQotKGBgTGlicmFyeSBSZWZlcmVuY2UnJyBoZXJlYWZ0ZXIpLiAgU29tZSBtb2R1bGVzIGFyZSBidWlsdCBpbnRvIHRoZQotaW50ZXJwcmV0ZXI7IHRoZXNlIHByb3ZpZGUgYWNjZXNzIHRvIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm90IHBhcnQgb2YKLXRoZSBjb3JlIG9mIHRoZSBsYW5ndWFnZSBidXQgYXJlIG5ldmVydGhlbGVzcyBidWlsdCBpbiwgZWl0aGVyIGZvcgotZWZmaWNpZW5jeSBvciB0byBwcm92aWRlIGFjY2VzcyB0byBvcGVyYXRpbmcgc3lzdGVtIHByaW1pdGl2ZXMgc3VjaCBhcwotc3lzdGVtIGNhbGxzLiAgVGhlIHNldCBvZiBzdWNoIG1vZHVsZXMgaXMgYSBjb25maWd1cmF0aW9uIG9wdGlvbiB3aGljaAotYWxzbyBkZXBlbmRzIG9uIHRoZSB1bmRlcmx5aW5nIHBsYXRmb3JtICBGb3IgZXhhbXBsZSwKLXRoZSBcbW9kdWxle3dpbnJlZ30gbW9kdWxlIGlzIG9ubHkgcHJvdmlkZWQgb24gV2luZG93cyBzeXN0ZW1zLgotT25lIHBhcnRpY3VsYXIgbW9kdWxlIGRlc2VydmVzIHNvbWUKLWF0dGVudGlvbjogXHVsaW5re1xtb2R1bGV7c3lzfX17Li4vbGliL21vZHVsZS1zeXMuaHRtbH0lCi1ccmVmc3Rtb2RpbmRleHtzeXN9LCB3aGljaCBpcyBidWlsdCBpbnRvIGV2ZXJ5IAotUHl0aG9uIGludGVycHJldGVyLiAgVGhlIHZhcmlhYmxlcyBcY29kZXtzeXMucHMxfSBhbmQKLVxjb2Rle3N5cy5wczJ9IGRlZmluZSB0aGUgc3RyaW5ncyB1c2VkIGFzIHByaW1hcnkgYW5kIHNlY29uZGFyeQotcHJvbXB0czoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGltcG9ydCBzeXMKLT4+PiBzeXMucHMxCi0nPj4+ICcKLT4+PiBzeXMucHMyCi0nLi4uICcKLT4+PiBzeXMucHMxID0gJ0M+ICcKLUM+IHByaW50ICdZdWNrIScKLVl1Y2shCi1DPgotCi1cZW5ke3ZlcmJhdGltfQotCi1UaGVzZSB0d28gdmFyaWFibGVzIGFyZSBvbmx5IGRlZmluZWQgaWYgdGhlIGludGVycHJldGVyIGlzIGluCi1pbnRlcmFjdGl2ZSBtb2RlLgotCi1UaGUgdmFyaWFibGUgXGNvZGV7c3lzLnBhdGh9IGlzIGEgbGlzdCBvZiBzdHJpbmdzIHRoYXQgZGV0ZXJtaW5lcyB0aGUKLWludGVycHJldGVyJ3Mgc2VhcmNoIHBhdGggZm9yIG1vZHVsZXMuIEl0IGlzIGluaXRpYWxpemVkIHRvIGEgZGVmYXVsdAotcGF0aCB0YWtlbiBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBcZW52dmFye1BZVEhPTlBBVEh9LCBvciBmcm9tCi1hIGJ1aWx0LWluIGRlZmF1bHQgaWYgXGVudnZhcntQWVRIT05QQVRIfSBpcyBub3Qgc2V0LiAgWW91IGNhbiBtb2RpZnkKLWl0IHVzaW5nIHN0YW5kYXJkIGxpc3Qgb3BlcmF0aW9uczogCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgc3lzCi0+Pj4gc3lzLnBhdGguYXBwZW5kKCcvdWZzL2d1aWRvL2xpYi9weXRob24nKQotXGVuZHt2ZXJiYXRpbX0KLQotXHNlY3Rpb257VGhlIFxmdW5jdGlvbntkaXIoKX0gRnVuY3Rpb24gXGxhYmVse2Rpcn19Ci0KLVRoZSBidWlsdC1pbiBmdW5jdGlvbiBcZnVuY3Rpb257ZGlyKCl9IGlzIHVzZWQgdG8gZmluZCBvdXQgd2hpY2ggbmFtZXMKLWEgbW9kdWxlIGRlZmluZXMuICBJdCByZXR1cm5zIGEgc29ydGVkIGxpc3Qgb2Ygc3RyaW5nczoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGltcG9ydCBmaWJvLCBzeXMKLT4+PiBkaXIoZmlibykKLVsnX19uYW1lX18nLCAnZmliJywgJ2ZpYjInXQotPj4+IGRpcihzeXMpCi1bJ19fZGlzcGxheWhvb2tfXycsICdfX2RvY19fJywgJ19fZXhjZXB0aG9va19fJywgJ19fbmFtZV9fJywgJ19fc3RkZXJyX18nLAotICdfX3N0ZGluX18nLCAnX19zdGRvdXRfXycsICdfZ2V0ZnJhbWUnLCAnYXBpX3ZlcnNpb24nLCAnYXJndicsIAotICdidWlsdGluX21vZHVsZV9uYW1lcycsICdieXRlb3JkZXInLCAnY2FsbHN0YXRzJywgJ2NvcHlyaWdodCcsCi0gJ2Rpc3BsYXlob29rJywgJ2V4Y19pbmZvJywgJ2V4Y2VwdGhvb2snLAotICdleGVjX3ByZWZpeCcsICdleGVjdXRhYmxlJywgJ2V4aXQnLCAnZ2V0ZGVmYXVsdGVuY29kaW5nJywgJ2dldGRsb3BlbmZsYWdzJywKLSAnZ2V0cmVjdXJzaW9ubGltaXQnLCAnZ2V0cmVmY291bnQnLCAnaGV4dmVyc2lvbicsICdtYXhpbnQnLCAnbWF4dW5pY29kZScsCi0gJ21ldGFfcGF0aCcsICdtb2R1bGVzJywgJ3BhdGgnLCAncGF0aF9ob29rcycsICdwYXRoX2ltcG9ydGVyX2NhY2hlJywKLSAncGxhdGZvcm0nLCAncHJlZml4JywgJ3BzMScsICdwczInLCAnc2V0Y2hlY2tpbnRlcnZhbCcsICdzZXRkbG9wZW5mbGFncycsCi0gJ3NldHByb2ZpbGUnLCAnc2V0cmVjdXJzaW9ubGltaXQnLCAnc2V0dHJhY2UnLCAnc3RkZXJyJywgJ3N0ZGluJywgJ3N0ZG91dCcsCi0gJ3ZlcnNpb24nLCAndmVyc2lvbl9pbmZvJywgJ3dhcm5vcHRpb25zJ10KLVxlbmR7dmVyYmF0aW19Ci0KLVdpdGhvdXQgYXJndW1lbnRzLCBcZnVuY3Rpb257ZGlyKCl9IGxpc3RzIHRoZSBuYW1lcyB5b3UgaGF2ZSBkZWZpbmVkCi1jdXJyZW50bHk6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBhID0gWzEsIDIsIDMsIDQsIDVdCi0+Pj4gaW1wb3J0IGZpYm8KLT4+PiBmaWIgPSBmaWJvLmZpYgotPj4+IGRpcigpCi1bJ19fYnVpbHRpbnNfXycsICdfX2RvY19fJywgJ19fZmlsZV9fJywgJ19fbmFtZV9fJywgJ2EnLCAnZmliJywgJ2ZpYm8nLCAnc3lzJ10KLVxlbmR7dmVyYmF0aW19Ci0KLU5vdGUgdGhhdCBpdCBsaXN0cyBhbGwgdHlwZXMgb2YgbmFtZXM6IHZhcmlhYmxlcywgbW9kdWxlcywgZnVuY3Rpb25zLCBldGMuCi0KLVxmdW5jdGlvbntkaXIoKX0gZG9lcyBub3QgbGlzdCB0aGUgbmFtZXMgb2YgYnVpbHQtaW4gZnVuY3Rpb25zIGFuZAotdmFyaWFibGVzLiAgSWYgeW91IHdhbnQgYSBsaXN0IG9mIHRob3NlLCB0aGV5IGFyZSBkZWZpbmVkIGluIHRoZQotc3RhbmRhcmQgbW9kdWxlIFxtb2R1bGV7X19idWlsdGluX199XHJlZmJpbW9kaW5kZXh7X19idWlsdGluX199OgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gaW1wb3J0IF9fYnVpbHRpbl9fCi0+Pj4gZGlyKF9fYnVpbHRpbl9fKQotWydBcml0aG1ldGljRXJyb3InLCAnQXNzZXJ0aW9uRXJyb3InLCAnQXR0cmlidXRlRXJyb3InLCAnRGVwcmVjYXRpb25XYXJuaW5nJywKLSAnRU9GRXJyb3InLCAnRWxsaXBzaXMnLCAnRW52aXJvbm1lbnRFcnJvcicsICdFeGNlcHRpb24nLCAnRmFsc2UnLAotICdGbG9hdGluZ1BvaW50RXJyb3InLCAnRnV0dXJlV2FybmluZycsICdJT0Vycm9yJywgJ0ltcG9ydEVycm9yJywKLSAnSW5kZW50YXRpb25FcnJvcicsICdJbmRleEVycm9yJywgJ0tleUVycm9yJywgJ0tleWJvYXJkSW50ZXJydXB0JywKLSAnTG9va3VwRXJyb3InLCAnTWVtb3J5RXJyb3InLCAnTmFtZUVycm9yJywgJ05vbmUnLCAnTm90SW1wbGVtZW50ZWQnLAotICdOb3RJbXBsZW1lbnRlZEVycm9yJywgJ09TRXJyb3InLCAnT3ZlcmZsb3dFcnJvcicsIAotICdQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nJywgJ1JlZmVyZW5jZUVycm9yJywgJ1J1bnRpbWVFcnJvcicsCi0gJ1J1bnRpbWVXYXJuaW5nJywgJ1N0b3BJdGVyYXRpb24nLCAnU3ludGF4RXJyb3InLAotICdTeW50YXhXYXJuaW5nJywgJ1N5c3RlbUVycm9yJywgJ1N5c3RlbUV4aXQnLCAnVGFiRXJyb3InLCAnVHJ1ZScsCi0gJ1R5cGVFcnJvcicsICdVbmJvdW5kTG9jYWxFcnJvcicsICdVbmljb2RlRGVjb2RlRXJyb3InLAotICdVbmljb2RlRW5jb2RlRXJyb3InLCAnVW5pY29kZUVycm9yJywgJ1VuaWNvZGVUcmFuc2xhdGVFcnJvcicsCi0gJ1VzZXJXYXJuaW5nJywgJ1ZhbHVlRXJyb3InLCAnV2FybmluZycsICdXaW5kb3dzRXJyb3InLAotICdaZXJvRGl2aXNpb25FcnJvcicsICdfJywgJ19fZGVidWdfXycsICdfX2RvY19fJywgJ19faW1wb3J0X18nLAotICdfX25hbWVfXycsICdhYnMnLCAnYmFzZXN0cmluZycsICdib29sJywgJ2J1ZmZlcicsCi0gJ2NocicsICdjbGFzc21ldGhvZCcsICdjbXAnLCAnY29tcGlsZScsCi0gJ2NvbXBsZXgnLCAnY29weXJpZ2h0JywgJ2NyZWRpdHMnLCAnZGVsYXR0cicsICdkaWN0JywgJ2RpcicsICdkaXZtb2QnLAotICdlbnVtZXJhdGUnLCAnZXZhbCcsICdleGVjJywgJ2V4aXQnLCAnZmlsdGVyJywgJ2Zsb2F0JywKLSAnZnJvemVuc2V0JywgJ2dldGF0dHInLCAnZ2xvYmFscycsICdoYXNhdHRyJywgJ2hhc2gnLCAnaGVscCcsICdoZXgnLAotICdpZCcsICdpbnB1dCcsICdpbnQnLCAnaXNpbnN0YW5jZScsICdpc3N1YmNsYXNzJywgJ2l0ZXInLAotICdsZW4nLCAnbGljZW5zZScsICdsaXN0JywgJ2xvY2FscycsICdtYXAnLCAnbWF4JywgJ21pbicsCi0gJ29iamVjdCcsICdvY3QnLCAnb3BlbicsICdvcmQnLCAncG93JywgJ3Byb3BlcnR5JywgJ3F1aXQnLCAncmFuZ2UnLAotICdyZXByJywgJ3JldmVyc2VkJywgJ3JvdW5kJywgJ3NldCcsCi0gJ3NldGF0dHInLCAnc2xpY2UnLCAnc29ydGVkJywgJ3N0YXRpY21ldGhvZCcsICdzdHInLCAnc3VtJywgJ3N1cGVyJywKLSAndHVwbGUnLCAndHlwZScsICd2YXJzJywgJ3ppcCddCi1cZW5ke3ZlcmJhdGltfQotCi0KLVxzZWN0aW9ue1BhY2thZ2VzIFxsYWJlbHtwYWNrYWdlc319Ci0KLVBhY2thZ2VzIGFyZSBhIHdheSBvZiBzdHJ1Y3R1cmluZyBQeXRob24ncyBtb2R1bGUgbmFtZXNwYWNlCi1ieSB1c2luZyBgYGRvdHRlZCBtb2R1bGUgbmFtZXMnJy4gIEZvciBleGFtcGxlLCB0aGUgbW9kdWxlIG5hbWUKLVxtb2R1bGV7QS5CfSBkZXNpZ25hdGVzIGEgc3VibW9kdWxlIG5hbWVkIFxzYW1we0J9IGluIGEgcGFja2FnZSBuYW1lZAotXHNhbXB7QX0uICBKdXN0IGxpa2UgdGhlIHVzZSBvZiBtb2R1bGVzIHNhdmVzIHRoZSBhdXRob3JzIG9mIGRpZmZlcmVudAotbW9kdWxlcyBmcm9tIGhhdmluZyB0byB3b3JyeSBhYm91dCBlYWNoIG90aGVyJ3MgZ2xvYmFsIHZhcmlhYmxlIG5hbWVzLAotdGhlIHVzZSBvZiBkb3R0ZWQgbW9kdWxlIG5hbWVzIHNhdmVzIHRoZSBhdXRob3JzIG9mIG11bHRpLW1vZHVsZQotcGFja2FnZXMgbGlrZSBOdW1QeSBvciB0aGUgUHl0aG9uIEltYWdpbmcgTGlicmFyeSBmcm9tIGhhdmluZyB0byB3b3JyeQotYWJvdXQgZWFjaCBvdGhlcidzIG1vZHVsZSBuYW1lcy4KLQotU3VwcG9zZSB5b3Ugd2FudCB0byBkZXNpZ24gYSBjb2xsZWN0aW9uIG9mIG1vZHVsZXMgKGEgYGBwYWNrYWdlJycpIGZvcgotdGhlIHVuaWZvcm0gaGFuZGxpbmcgb2Ygc291bmQgZmlsZXMgYW5kIHNvdW5kIGRhdGEuICBUaGVyZSBhcmUgbWFueQotZGlmZmVyZW50IHNvdW5kIGZpbGUgZm9ybWF0cyAodXN1YWxseSByZWNvZ25pemVkIGJ5IHRoZWlyIGV4dGVuc2lvbiwKLWZvciBleGFtcGxlOiBcZmlsZXsud2F2fSwgXGZpbGV7LmFpZmZ9LCBcZmlsZXsuYXV9KSwgc28geW91IG1heSBuZWVkCi10byBjcmVhdGUgYW5kIG1haW50YWluIGEgZ3Jvd2luZyBjb2xsZWN0aW9uIG9mIG1vZHVsZXMgZm9yIHRoZQotY29udmVyc2lvbiBiZXR3ZWVuIHRoZSB2YXJpb3VzIGZpbGUgZm9ybWF0cy4gIFRoZXJlIGFyZSBhbHNvIG1hbnkKLWRpZmZlcmVudCBvcGVyYXRpb25zIHlvdSBtaWdodCB3YW50IHRvIHBlcmZvcm0gb24gc291bmQgZGF0YSAoc3VjaCBhcwotbWl4aW5nLCBhZGRpbmcgZWNobywgYXBwbHlpbmcgYW4gZXF1YWxpemVyIGZ1bmN0aW9uLCBjcmVhdGluZyBhbgotYXJ0aWZpY2lhbCBzdGVyZW8gZWZmZWN0KSwgc28gaW4gYWRkaXRpb24geW91IHdpbGwgYmUgd3JpdGluZyBhCi1uZXZlci1lbmRpbmcgc3RyZWFtIG9mIG1vZHVsZXMgdG8gcGVyZm9ybSB0aGVzZSBvcGVyYXRpb25zLiAgSGVyZSdzIGEKLXBvc3NpYmxlIHN0cnVjdHVyZSBmb3IgeW91ciBwYWNrYWdlIChleHByZXNzZWQgaW4gdGVybXMgb2YgYQotaGllcmFyY2hpY2FsIGZpbGVzeXN0ZW0pOgotCi1cYmVnaW57dmVyYmF0aW19Ci1zb3VuZC8gICAgICAgICAgICAgICAgICAgICAgICAgIFRvcC1sZXZlbCBwYWNrYWdlCi0gICAgICBfX2luaXRfXy5weSAgICAgICAgICAgICAgIEluaXRpYWxpemUgdGhlIHNvdW5kIHBhY2thZ2UKLSAgICAgIGZvcm1hdHMvICAgICAgICAgICAgICAgICAgU3VicGFja2FnZSBmb3IgZmlsZSBmb3JtYXQgY29udmVyc2lvbnMKLSAgICAgICAgICAgICAgX19pbml0X18ucHkKLSAgICAgICAgICAgICAgd2F2cmVhZC5weQotICAgICAgICAgICAgICB3YXZ3cml0ZS5weQotICAgICAgICAgICAgICBhaWZmcmVhZC5weQotICAgICAgICAgICAgICBhaWZmd3JpdGUucHkKLSAgICAgICAgICAgICAgYXVyZWFkLnB5Ci0gICAgICAgICAgICAgIGF1d3JpdGUucHkKLSAgICAgICAgICAgICAgLi4uCi0gICAgICBlZmZlY3RzLyAgICAgICAgICAgICAgICAgIFN1YnBhY2thZ2UgZm9yIHNvdW5kIGVmZmVjdHMKLSAgICAgICAgICAgICAgX19pbml0X18ucHkKLSAgICAgICAgICAgICAgZWNoby5weQotICAgICAgICAgICAgICBzdXJyb3VuZC5weQotICAgICAgICAgICAgICByZXZlcnNlLnB5Ci0gICAgICAgICAgICAgIC4uLgotICAgICAgZmlsdGVycy8gICAgICAgICAgICAgICAgICBTdWJwYWNrYWdlIGZvciBmaWx0ZXJzCi0gICAgICAgICAgICAgIF9faW5pdF9fLnB5Ci0gICAgICAgICAgICAgIGVxdWFsaXplci5weQotICAgICAgICAgICAgICB2b2NvZGVyLnB5Ci0gICAgICAgICAgICAgIGthcmFva2UucHkKLSAgICAgICAgICAgICAgLi4uCi1cZW5ke3ZlcmJhdGltfQotCi1XaGVuIGltcG9ydGluZyB0aGUgcGFja2FnZSwgUHl0aG9uIHNlYXJjaGVzIHRocm91Z2ggdGhlIGRpcmVjdG9yaWVzCi1vbiBcY29kZXtzeXMucGF0aH0gbG9va2luZyBmb3IgdGhlIHBhY2thZ2Ugc3ViZGlyZWN0b3J5LgotCi1UaGUgXGZpbGV7X19pbml0X18ucHl9IGZpbGVzIGFyZSByZXF1aXJlZCB0byBtYWtlIFB5dGhvbiB0cmVhdCB0aGUKLWRpcmVjdG9yaWVzIGFzIGNvbnRhaW5pbmcgcGFja2FnZXM7IHRoaXMgaXMgZG9uZSB0byBwcmV2ZW50Ci1kaXJlY3RvcmllcyB3aXRoIGEgY29tbW9uIG5hbWUsIHN1Y2ggYXMgXHNhbXB7c3RyaW5nfSwgZnJvbQotdW5pbnRlbnRpb25hbGx5IGhpZGluZyB2YWxpZCBtb2R1bGVzIHRoYXQgb2NjdXIgbGF0ZXIgb24gdGhlIG1vZHVsZQotc2VhcmNoIHBhdGguIEluIHRoZSBzaW1wbGVzdCBjYXNlLCBcZmlsZXtfX2luaXRfXy5weX0gY2FuIGp1c3QgYmUgYW4KLWVtcHR5IGZpbGUsIGJ1dCBpdCBjYW4gYWxzbyBleGVjdXRlIGluaXRpYWxpemF0aW9uIGNvZGUgZm9yIHRoZQotcGFja2FnZSBvciBzZXQgdGhlIFxjb2Rle19fYWxsX199IHZhcmlhYmxlLCBkZXNjcmliZWQgbGF0ZXIuCi0KLVVzZXJzIG9mIHRoZSBwYWNrYWdlIGNhbiBpbXBvcnQgaW5kaXZpZHVhbCBtb2R1bGVzIGZyb20gdGhlCi1wYWNrYWdlLCBmb3IgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IHNvdW5kLmVmZmVjdHMuZWNobwotXGVuZHt2ZXJiYXRpbX0KLQotVGhpcyBsb2FkcyB0aGUgc3VibW9kdWxlIFxtb2R1bGV7c291bmQuZWZmZWN0cy5lY2hvfS4gIEl0IG11c3QgYmUgcmVmZXJlbmNlZAotd2l0aCBpdHMgZnVsbCBuYW1lLgotCi1cYmVnaW57dmVyYmF0aW19Ci1zb3VuZC5lZmZlY3RzLmVjaG8uZWNob2ZpbHRlcihpbnB1dCwgb3V0cHV0LCBkZWxheT0wLjcsIGF0dGVuPTQpCi1cZW5ke3ZlcmJhdGltfQotCi1BbiBhbHRlcm5hdGl2ZSB3YXkgb2YgaW1wb3J0aW5nIHRoZSBzdWJtb2R1bGUgaXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWZyb20gc291bmQuZWZmZWN0cyBpbXBvcnQgZWNobwotXGVuZHt2ZXJiYXRpbX0KLQotVGhpcyBhbHNvIGxvYWRzIHRoZSBzdWJtb2R1bGUgXG1vZHVsZXtlY2hvfSwgYW5kIG1ha2VzIGl0IGF2YWlsYWJsZSB3aXRob3V0Ci1pdHMgcGFja2FnZSBwcmVmaXgsIHNvIGl0IGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWVjaG8uZWNob2ZpbHRlcihpbnB1dCwgb3V0cHV0LCBkZWxheT0wLjcsIGF0dGVuPTQpCi1cZW5ke3ZlcmJhdGltfQotCi1ZZXQgYW5vdGhlciB2YXJpYXRpb24gaXMgdG8gaW1wb3J0IHRoZSBkZXNpcmVkIGZ1bmN0aW9uIG9yIHZhcmlhYmxlIGRpcmVjdGx5OgotCi1cYmVnaW57dmVyYmF0aW19Ci1mcm9tIHNvdW5kLmVmZmVjdHMuZWNobyBpbXBvcnQgZWNob2ZpbHRlcgotXGVuZHt2ZXJiYXRpbX0KLQotQWdhaW4sIHRoaXMgbG9hZHMgdGhlIHN1Ym1vZHVsZSBcbW9kdWxle2VjaG99LCBidXQgdGhpcyBtYWtlcyBpdHMgZnVuY3Rpb24KLVxmdW5jdGlvbntlY2hvZmlsdGVyKCl9IGRpcmVjdGx5IGF2YWlsYWJsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotZWNob2ZpbHRlcihpbnB1dCwgb3V0cHV0LCBkZWxheT0wLjcsIGF0dGVuPTQpCi1cZW5ke3ZlcmJhdGltfQotCi1Ob3RlIHRoYXQgd2hlbiB1c2luZyBcY29kZXtmcm9tIFx2YXJ7cGFja2FnZX0gaW1wb3J0IFx2YXJ7aXRlbX19LCB0aGUKLWl0ZW0gY2FuIGJlIGVpdGhlciBhIHN1Ym1vZHVsZSAob3Igc3VicGFja2FnZSkgb2YgdGhlIHBhY2thZ2UsIG9yIHNvbWUgCi1vdGhlciBuYW1lIGRlZmluZWQgaW4gdGhlIHBhY2thZ2UsIGxpa2UgYSBmdW5jdGlvbiwgY2xhc3Mgb3IKLXZhcmlhYmxlLiAgVGhlIFxjb2Rle2ltcG9ydH0gc3RhdGVtZW50IGZpcnN0IHRlc3RzIHdoZXRoZXIgdGhlIGl0ZW0gaXMKLWRlZmluZWQgaW4gdGhlIHBhY2thZ2U7IGlmIG5vdCwgaXQgYXNzdW1lcyBpdCBpcyBhIG1vZHVsZSBhbmQgYXR0ZW1wdHMKLXRvIGxvYWQgaXQuICBJZiBpdCBmYWlscyB0byBmaW5kIGl0LCBhbgotXGV4Y2VwdGlvbntJbXBvcnRFcnJvcn0gZXhjZXB0aW9uIGlzIHJhaXNlZC4KLQotQ29udHJhcmlseSwgd2hlbiB1c2luZyBzeW50YXggbGlrZSBcY29kZXtpbXBvcnQKLVx2YXJ7aXRlbS5zdWJpdGVtLnN1YnN1Yml0ZW19fSwgZWFjaCBpdGVtIGV4Y2VwdCBmb3IgdGhlIGxhc3QgbXVzdCBiZQotYSBwYWNrYWdlOyB0aGUgbGFzdCBpdGVtIGNhbiBiZSBhIG1vZHVsZSBvciBhIHBhY2thZ2UgYnV0IGNhbid0IGJlIGEKLWNsYXNzIG9yIGZ1bmN0aW9uIG9yIHZhcmlhYmxlIGRlZmluZWQgaW4gdGhlIHByZXZpb3VzIGl0ZW0uCi0KLVxzdWJzZWN0aW9ue0ltcG9ydGluZyAqIEZyb20gYSBQYWNrYWdlIFxsYWJlbHtwa2ctaW1wb3J0LXN0YXJ9fQotJVRoZSBcY29kZXtfX2FsbF9ffSBBdHRyaWJ1dGUKLQotXHR0aW5kZXh7X19hbGxfX30KLU5vdyB3aGF0IGhhcHBlbnMgd2hlbiB0aGUgdXNlciB3cml0ZXMgXGNvZGV7ZnJvbSBzb3VuZC5lZmZlY3RzIGltcG9ydAotKn0/ICBJZGVhbGx5LCBvbmUgd291bGQgaG9wZSB0aGF0IHRoaXMgc29tZWhvdyBnb2VzIG91dCB0byB0aGUKLWZpbGVzeXN0ZW0sIGZpbmRzIHdoaWNoIHN1Ym1vZHVsZXMgYXJlIHByZXNlbnQgaW4gdGhlIHBhY2thZ2UsIGFuZAotaW1wb3J0cyB0aGVtIGFsbC4gIFVuZm9ydHVuYXRlbHksIHRoaXMgb3BlcmF0aW9uIGRvZXMgbm90IHdvcmsgdmVyeQotd2VsbCBvbiBXaW5kb3dzIHBsYXRmb3Jtcywgd2hlcmUgdGhlIGZpbGVzeXN0ZW0gZG9lcyBub3QKLWFsd2F5cyBoYXZlIGFjY3VyYXRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjYXNlIG9mIGEgZmlsZW5hbWUhICBPbgotdGhlc2UgcGxhdGZvcm1zLCB0aGVyZSBpcyBubyBndWFyYW50ZWVkIHdheSB0byBrbm93IHdoZXRoZXIgYSBmaWxlCi1cZmlsZXtFQ0hPLlBZfSBzaG91bGQgYmUgaW1wb3J0ZWQgYXMgYSBtb2R1bGUgXG1vZHVsZXtlY2hvfSwKLVxtb2R1bGV7RWNob30gb3IgXG1vZHVsZXtFQ0hPfS4gIChGb3IgZXhhbXBsZSwgV2luZG93cyA5NSBoYXMgdGhlCi1hbm5veWluZyBwcmFjdGljZSBvZiBzaG93aW5nIGFsbCBmaWxlIG5hbWVzIHdpdGggYSBjYXBpdGFsaXplZCBmaXJzdAotbGV0dGVyLikgIFRoZSBET1MgOCszIGZpbGVuYW1lIHJlc3RyaWN0aW9uIGFkZHMgYW5vdGhlciBpbnRlcmVzdGluZwotcHJvYmxlbSBmb3IgbG9uZyBtb2R1bGUgbmFtZXMuCi0KLVRoZSBvbmx5IHNvbHV0aW9uIGlzIGZvciB0aGUgcGFja2FnZSBhdXRob3IgdG8gcHJvdmlkZSBhbiBleHBsaWNpdAotaW5kZXggb2YgdGhlIHBhY2thZ2UuICBUaGUgaW1wb3J0IHN0YXRlbWVudCB1c2VzIHRoZSBmb2xsb3dpbmcKLWNvbnZlbnRpb246IGlmIGEgcGFja2FnZSdzIFxmaWxle19faW5pdF9fLnB5fSBjb2RlIGRlZmluZXMgYSBsaXN0Ci1uYW1lZCBcY29kZXtfX2FsbF9ffSwgaXQgaXMgdGFrZW4gdG8gYmUgdGhlIGxpc3Qgb2YgbW9kdWxlIG5hbWVzIHRoYXQKLXNob3VsZCBiZSBpbXBvcnRlZCB3aGVuIFxjb2Rle2Zyb20gXHZhcntwYWNrYWdlfSBpbXBvcnQgKn0gaXMKLWVuY291bnRlcmVkLiAgSXQgaXMgdXAgdG8gdGhlIHBhY2thZ2UgYXV0aG9yIHRvIGtlZXAgdGhpcyBsaXN0Ci11cC10by1kYXRlIHdoZW4gYSBuZXcgdmVyc2lvbiBvZiB0aGUgcGFja2FnZSBpcyByZWxlYXNlZC4gIFBhY2thZ2UKLWF1dGhvcnMgbWF5IGFsc28gZGVjaWRlIG5vdCB0byBzdXBwb3J0IGl0LCBpZiB0aGV5IGRvbid0IHNlZSBhIHVzZSBmb3IKLWltcG9ydGluZyAqIGZyb20gdGhlaXIgcGFja2FnZS4gIEZvciBleGFtcGxlLCB0aGUgZmlsZQotXGZpbGV7c291bmRzL2VmZmVjdHMvX19pbml0X18ucHl9IGNvdWxkIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBjb2RlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1fX2FsbF9fID0gWyJlY2hvIiwgInN1cnJvdW5kIiwgInJldmVyc2UiXQotXGVuZHt2ZXJiYXRpbX0KLQotVGhpcyB3b3VsZCBtZWFuIHRoYXQgXGNvZGV7ZnJvbSBzb3VuZC5lZmZlY3RzIGltcG9ydCAqfSB3b3VsZAotaW1wb3J0IHRoZSB0aHJlZSBuYW1lZCBzdWJtb2R1bGVzIG9mIHRoZSBcbW9kdWxle3NvdW5kfSBwYWNrYWdlLgotCi1JZiBcY29kZXtfX2FsbF9ffSBpcyBub3QgZGVmaW5lZCwgdGhlIHN0YXRlbWVudCBcY29kZXtmcm9tIHNvdW5kLmVmZmVjdHMKLWltcG9ydCAqfSBkb2VzIFxlbXBoe25vdH0gaW1wb3J0IGFsbCBzdWJtb2R1bGVzIGZyb20gdGhlIHBhY2thZ2UKLVxtb2R1bGV7c291bmQuZWZmZWN0c30gaW50byB0aGUgY3VycmVudCBuYW1lc3BhY2U7IGl0IG9ubHkgZW5zdXJlcyB0aGF0IHRoZQotcGFja2FnZSBcbW9kdWxle3NvdW5kLmVmZmVjdHN9IGhhcyBiZWVuIGltcG9ydGVkIChwb3NzaWJseSBydW5uaW5nIGFueQotaW5pdGlhbGl6YXRpb24gY29kZSBpbiBcZmlsZXtfX2luaXRfXy5weX0pIGFuZCB0aGVuIGltcG9ydHMgd2hhdGV2ZXIgbmFtZXMgYXJlCi1kZWZpbmVkIGluIHRoZSBwYWNrYWdlLiAgVGhpcyBpbmNsdWRlcyBhbnkgbmFtZXMgZGVmaW5lZCAoYW5kCi1zdWJtb2R1bGVzIGV4cGxpY2l0bHkgbG9hZGVkKSBieSBcZmlsZXtfX2luaXRfXy5weX0uICBJdCBhbHNvIGluY2x1ZGVzIGFueQotc3VibW9kdWxlcyBvZiB0aGUgcGFja2FnZSB0aGF0IHdlcmUgZXhwbGljaXRseSBsb2FkZWQgYnkgcHJldmlvdXMKLWltcG9ydCBzdGF0ZW1lbnRzLiAgQ29uc2lkZXIgdGhpcyBjb2RlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgc291bmQuZWZmZWN0cy5lY2hvCi1pbXBvcnQgc291bmQuZWZmZWN0cy5zdXJyb3VuZAotZnJvbSBzb3VuZC5lZmZlY3RzIGltcG9ydCAqCi1cZW5ke3ZlcmJhdGltfQotCi1JbiB0aGlzIGV4YW1wbGUsIHRoZSBlY2hvIGFuZCBzdXJyb3VuZCBtb2R1bGVzIGFyZSBpbXBvcnRlZCBpbiB0aGUKLWN1cnJlbnQgbmFtZXNwYWNlIGJlY2F1c2UgdGhleSBhcmUgZGVmaW5lZCBpbiB0aGUKLVxtb2R1bGV7c291bmQuZWZmZWN0c30gcGFja2FnZSB3aGVuIHRoZSBcY29kZXtmcm9tLi4uaW1wb3J0fSBzdGF0ZW1lbnQKLWlzIGV4ZWN1dGVkLiAgKFRoaXMgYWxzbyB3b3JrcyB3aGVuIFxjb2Rle19fYWxsX199IGlzIGRlZmluZWQuKQotCi1Ob3RlIHRoYXQgaW4gZ2VuZXJhbCB0aGUgcHJhY3RpY2Ugb2YgaW1wb3J0aW5nIFxjb2Rleyp9IGZyb20gYSBtb2R1bGUgb3IKLXBhY2thZ2UgaXMgZnJvd25lZCB1cG9uLCBzaW5jZSBpdCBvZnRlbiBjYXVzZXMgcG9vcmx5IHJlYWRhYmxlIGNvZGUuCi1Ib3dldmVyLCBpdCBpcyBva2F5IHRvIHVzZSBpdCB0byBzYXZlIHR5cGluZyBpbiBpbnRlcmFjdGl2ZSBzZXNzaW9ucywKLWFuZCBjZXJ0YWluIG1vZHVsZXMgYXJlIGRlc2lnbmVkIHRvIGV4cG9ydCBvbmx5IG5hbWVzIHRoYXQgZm9sbG93Ci1jZXJ0YWluIHBhdHRlcm5zLgotCi1SZW1lbWJlciwgdGhlcmUgaXMgbm90aGluZyB3cm9uZyB3aXRoIHVzaW5nIFxjb2Rle2Zyb20gUGFja2FnZQotaW1wb3J0IHNwZWNpZmljX3N1Ym1vZHVsZX0hICBJbiBmYWN0LCB0aGlzIGlzIHRoZQotcmVjb21tZW5kZWQgbm90YXRpb24gdW5sZXNzIHRoZSBpbXBvcnRpbmcgbW9kdWxlIG5lZWRzIHRvIHVzZQotc3VibW9kdWxlcyB3aXRoIHRoZSBzYW1lIG5hbWUgZnJvbSBkaWZmZXJlbnQgcGFja2FnZXMuCi0KLQotXHN1YnNlY3Rpb257SW50cmEtcGFja2FnZSBSZWZlcmVuY2VzfQotCi1UaGUgc3VibW9kdWxlcyBvZnRlbiBuZWVkIHRvIHJlZmVyIHRvIGVhY2ggb3RoZXIuICBGb3IgZXhhbXBsZSwgdGhlCi1cbW9kdWxle3N1cnJvdW5kfSBtb2R1bGUgbWlnaHQgdXNlIHRoZSBcbW9kdWxle2VjaG99IG1vZHVsZS4gIEluIGZhY3QsCi1zdWNoIHJlZmVyZW5jZXMgYXJlIHNvIGNvbW1vbiB0aGF0IHRoZSBca2V5d29yZHtpbXBvcnR9IHN0YXRlbWVudAotZmlyc3QgbG9va3MgaW4gdGhlIGNvbnRhaW5pbmcgcGFja2FnZSBiZWZvcmUgbG9va2luZyBpbiB0aGUgc3RhbmRhcmQKLW1vZHVsZSBzZWFyY2ggcGF0aC4gVGh1cywgdGhlIFxtb2R1bGV7c3Vycm91bmR9IG1vZHVsZSBjYW4gc2ltcGx5IHVzZQotXGNvZGV7aW1wb3J0IGVjaG99IG9yIFxjb2Rle2Zyb20gZWNobyBpbXBvcnQgZWNob2ZpbHRlcn0uICBJZiB0aGUKLWltcG9ydGVkIG1vZHVsZSBpcyBub3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgcGFja2FnZSAodGhlIHBhY2thZ2Ugb2YKLXdoaWNoIHRoZSBjdXJyZW50IG1vZHVsZSBpcyBhIHN1Ym1vZHVsZSksIHRoZSBca2V5d29yZHtpbXBvcnR9Ci1zdGF0ZW1lbnQgbG9va3MgZm9yIGEgdG9wLWxldmVsIG1vZHVsZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCi1XaGVuIHBhY2thZ2VzIGFyZSBzdHJ1Y3R1cmVkIGludG8gc3VicGFja2FnZXMgKGFzIHdpdGggdGhlCi1cbW9kdWxle3NvdW5kfSBwYWNrYWdlIGluIHRoZSBleGFtcGxlKSwgeW91IGNhbiB1c2UgYWJzb2x1dGUKLWltcG9ydHMgdG8gcmVmZXIgdG8gc3VibW9kdWxlcyBvZiBzaWJsaW5ncyBwYWNrYWdlcy4KLUZvciBleGFtcGxlLCBpZiB0aGUgbW9kdWxlIFxtb2R1bGV7c291bmQuZmlsdGVycy52b2NvZGVyfSBuZWVkcyB0bwotdXNlIHRoZSBcbW9kdWxle2VjaG99IG1vZHVsZSBpbiB0aGUgXG1vZHVsZXtzb3VuZC5lZmZlY3RzfSBwYWNrYWdlLAotaXQgY2FuIHVzZSBcY29kZXtmcm9tIHNvdW5kLmVmZmVjdHMgaW1wb3J0IGVjaG99LgotCi1TdGFydGluZyB3aXRoIFB5dGhvbiAyLjUsIGluIGFkZGl0aW9uIHRvIHRoZSBpbXBsaWNpdCByZWxhdGl2ZSBpbXBvcnRzCi1kZXNjcmliZWQgYWJvdmUsIHlvdSBjYW4gYWxzbyB3cml0ZSBleHBsaWNpdCByZWxhdGl2ZSBpbXBvcnRzIHdpdGggdGhlCi1cY29kZXtmcm9tIG1vZHVsZSBpbXBvcnQgbmFtZX0gZm9ybSBvZiBpbXBvcnQgc3RhdGVtZW50LiBUaGVzZSBleHBsaWNpdAotcmVsYXRpdmUgaW1wb3J0cyB1c2UgbGVhZGluZyBkb3RzIHRvIGluZGljYXRlIHRoZSBjdXJyZW50IGFuZCBwYXJlbnQKLXBhY2thZ2VzIGludm9sdmVkIGluIHRoZSByZWxhdGl2ZSBpbXBvcnQuIEZyb20gdGhlIFxtb2R1bGV7c3Vycm91bmR9Ci1tb2R1bGUgZm9yIGV4YW1wbGUsIHlvdSBtaWdodCB1c2U6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWZyb20gLiBpbXBvcnQgZWNobwotZnJvbSAuLiBpbXBvcnQgZm9ybWF0cwotZnJvbSAuLmZpbHRlcnMgaW1wb3J0IGVxdWFsaXplcgotXGVuZHt2ZXJiYXRpbX0KLQotTm90ZSB0aGF0IGJvdGggZXhwbGljaXQgYW5kIGltcGxpY2l0IHJlbGF0aXZlIGltcG9ydHMgYXJlIGJhc2VkIG9uIHRoZQotbmFtZSBvZiB0aGUgY3VycmVudCBtb2R1bGUuIFNpbmNlIHRoZSBuYW1lIG9mIHRoZSBtYWluIG1vZHVsZSBpcyBhbHdheXMKLVxjb2RleyJfX21haW5fXyJ9LCBtb2R1bGVzIGludGVuZGVkIGZvciB1c2UgYXMgdGhlIG1haW4gbW9kdWxlIG9mIGEKLVB5dGhvbiBhcHBsaWNhdGlvbiBzaG91bGQgYWx3YXlzIHVzZSBhYnNvbHV0ZSBpbXBvcnRzLgotCi1cc3Vic2VjdGlvbntQYWNrYWdlcyBpbiBNdWx0aXBsZSBEaXJlY3Rvcmllc30KLQotUGFja2FnZXMgc3VwcG9ydCBvbmUgbW9yZSBzcGVjaWFsIGF0dHJpYnV0ZSwgXG1lbWJlcntfX3BhdGhfX30uICBUaGlzCi1pcyBpbml0aWFsaXplZCB0byBiZSBhIGxpc3QgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5Ci1ob2xkaW5nIHRoZSBwYWNrYWdlJ3MgXGZpbGV7X19pbml0X18ucHl9IGJlZm9yZSB0aGUgY29kZSBpbiB0aGF0IGZpbGUKLWlzIGV4ZWN1dGVkLiAgVGhpcyB2YXJpYWJsZSBjYW4gYmUgbW9kaWZpZWQ7IGRvaW5nIHNvIGFmZmVjdHMgZnV0dXJlCi1zZWFyY2hlcyBmb3IgbW9kdWxlcyBhbmQgc3VicGFja2FnZXMgY29udGFpbmVkIGluIHRoZSBwYWNrYWdlLgotCi1XaGlsZSB0aGlzIGZlYXR1cmUgaXMgbm90IG9mdGVuIG5lZWRlZCwgaXQgY2FuIGJlIHVzZWQgdG8gZXh0ZW5kIHRoZQotc2V0IG9mIG1vZHVsZXMgZm91bmQgaW4gYSBwYWNrYWdlLgotCi0KLQotXGNoYXB0ZXJ7SW5wdXQgYW5kIE91dHB1dCBcbGFiZWx7aW99fQotCi1UaGVyZSBhcmUgc2V2ZXJhbCB3YXlzIHRvIHByZXNlbnQgdGhlIG91dHB1dCBvZiBhIHByb2dyYW07IGRhdGEgY2FuIGJlCi1wcmludGVkIGluIGEgaHVtYW4tcmVhZGFibGUgZm9ybSwgb3Igd3JpdHRlbiB0byBhIGZpbGUgZm9yIGZ1dHVyZSB1c2UuCi1UaGlzIGNoYXB0ZXIgd2lsbCBkaXNjdXNzIHNvbWUgb2YgdGhlIHBvc3NpYmlsaXRpZXMuCi0KLQotXHNlY3Rpb257RmFuY2llciBPdXRwdXQgRm9ybWF0dGluZyBcbGFiZWx7Zm9ybWF0dGluZ319Ci0KLVNvIGZhciB3ZSd2ZSBlbmNvdW50ZXJlZCB0d28gd2F5cyBvZiB3cml0aW5nIHZhbHVlczogXGVtcGh7ZXhwcmVzc2lvbgotc3RhdGVtZW50c30gYW5kIHRoZSBca2V5d29yZHtwcmludH0gc3RhdGVtZW50LiAgKEEgdGhpcmQgd2F5IGlzIHVzaW5nCi10aGUgXG1ldGhvZHt3cml0ZSgpfSBtZXRob2Qgb2YgZmlsZSBvYmplY3RzOyB0aGUgc3RhbmRhcmQgb3V0cHV0IGZpbGUKLWNhbiBiZSByZWZlcmVuY2VkIGFzIFxjb2Rle3N5cy5zdGRvdXR9LiAgU2VlIHRoZSBMaWJyYXJ5IFJlZmVyZW5jZSBmb3IKLW1vcmUgaW5mb3JtYXRpb24gb24gdGhpcy4pCi0KLU9mdGVuIHlvdSdsbCB3YW50IG1vcmUgY29udHJvbCBvdmVyIHRoZSBmb3JtYXR0aW5nIG9mIHlvdXIgb3V0cHV0IHRoYW4KLXNpbXBseSBwcmludGluZyBzcGFjZS1zZXBhcmF0ZWQgdmFsdWVzLiAgVGhlcmUgYXJlIHR3byB3YXlzIHRvIGZvcm1hdAoteW91ciBvdXRwdXQ7IHRoZSBmaXJzdCB3YXkgaXMgdG8gZG8gYWxsIHRoZSBzdHJpbmcgaGFuZGxpbmcgeW91cnNlbGY7Ci11c2luZyBzdHJpbmcgc2xpY2luZyBhbmQgY29uY2F0ZW5hdGlvbiBvcGVyYXRpb25zIHlvdSBjYW4gY3JlYXRlIGFueQotbGF5b3V0IHlvdSBjYW4gaW1hZ2luZS4gIFRoZSBzdGFuZGFyZCBtb2R1bGUKLVxtb2R1bGV7c3RyaW5nfVxyZWZzdG1vZGluZGV4e3N0cmluZ30gY29udGFpbnMgc29tZSB1c2VmdWwgb3BlcmF0aW9ucwotZm9yIHBhZGRpbmcgc3RyaW5ncyB0byBhIGdpdmVuIGNvbHVtbiB3aWR0aDsgdGhlc2Ugd2lsbCBiZSBkaXNjdXNzZWQKLXNob3J0bHkuICBUaGUgc2Vjb25kIHdheSBpcyB0byB1c2UgdGhlIFxjb2Rle1wlfSBvcGVyYXRvciB3aXRoIGEKLXN0cmluZyBhcyB0aGUgbGVmdCBhcmd1bWVudC4gIFRoZSBcY29kZXtcJX0gb3BlcmF0b3IgaW50ZXJwcmV0cyB0aGUKLWxlZnQgYXJndW1lbnQgbXVjaCBsaWtlIGEgXGNmdW5jdGlvbntzcHJpbnRmKCl9LXN0eWxlIGZvcm1hdAotc3RyaW5nIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHJpZ2h0IGFyZ3VtZW50LCBhbmQgcmV0dXJucyB0aGUgc3RyaW5nCi1yZXN1bHRpbmcgZnJvbSB0aGlzIGZvcm1hdHRpbmcgb3BlcmF0aW9uLgotCi1PbmUgcXVlc3Rpb24gcmVtYWlucywgb2YgY291cnNlOiBob3cgZG8geW91IGNvbnZlcnQgdmFsdWVzIHRvIHN0cmluZ3M/Ci1MdWNraWx5LCBQeXRob24gaGFzIHdheXMgdG8gY29udmVydCBhbnkgdmFsdWUgdG8gYSBzdHJpbmc6IHBhc3MgaXQgdG8KLXRoZSBcZnVuY3Rpb257cmVwcigpfSAgb3IgXGZ1bmN0aW9ue3N0cigpfSBmdW5jdGlvbnMuICBSZXZlcnNlIHF1b3RlcwotKFxjb2Rle2BgfSkgYXJlIGVxdWl2YWxlbnQgdG8gXGZ1bmN0aW9ue3JlcHIoKX0sIGJ1dCB0aGV5IGFyZSBubwotbG9uZ2VyIHVzZWQgaW4gbW9kZXJuIFB5dGhvbiBjb2RlIGFuZCB3aWxsIGxpa2VseSBub3QgYmUgaW4gZnV0dXJlCi12ZXJzaW9ucyBvZiB0aGUgbGFuZ3VhZ2UuCi0KLVRoZSBcZnVuY3Rpb257c3RyKCl9IGZ1bmN0aW9uIGlzIG1lYW50IHRvIHJldHVybiByZXByZXNlbnRhdGlvbnMgb2YKLXZhbHVlcyB3aGljaCBhcmUgZmFpcmx5IGh1bWFuLXJlYWRhYmxlLCB3aGlsZSBcZnVuY3Rpb257cmVwcigpfSBpcwotbWVhbnQgdG8gZ2VuZXJhdGUgcmVwcmVzZW50YXRpb25zIHdoaWNoIGNhbiBiZSByZWFkIGJ5IHRoZSBpbnRlcnByZXRlcgotKG9yIHdpbGwgZm9yY2UgYSBcZXhjZXB0aW9ue1N5bnRheEVycm9yfSBpZiB0aGVyZSBpcyBub3QgZXF1aXZhbGVudAotc3ludGF4KS4gIEZvciBvYmplY3RzIHdoaWNoIGRvbid0IGhhdmUgYSBwYXJ0aWN1bGFyIHJlcHJlc2VudGF0aW9uIGZvcgotaHVtYW4gY29uc3VtcHRpb24sIFxmdW5jdGlvbntzdHIoKX0gd2lsbCByZXR1cm4gdGhlIHNhbWUgdmFsdWUgYXMKLVxmdW5jdGlvbntyZXByKCl9LiAgTWFueSB2YWx1ZXMsIHN1Y2ggYXMgbnVtYmVycyBvciBzdHJ1Y3R1cmVzIGxpa2UKLWxpc3RzIGFuZCBkaWN0aW9uYXJpZXMsIGhhdmUgdGhlIHNhbWUgcmVwcmVzZW50YXRpb24gdXNpbmcgZWl0aGVyCi1mdW5jdGlvbi4gIFN0cmluZ3MgYW5kIGZsb2F0aW5nIHBvaW50IG51bWJlcnMsIGluIHBhcnRpY3VsYXIsIGhhdmUgdHdvCi1kaXN0aW5jdCByZXByZXNlbnRhdGlvbnMuCi0KLVNvbWUgZXhhbXBsZXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBzID0gJ0hlbGxvLCB3b3JsZC4nCi0+Pj4gc3RyKHMpCi0nSGVsbG8sIHdvcmxkLicKLT4+PiByZXByKHMpCi0iJ0hlbGxvLCB3b3JsZC4nIgotPj4+IHN0cigwLjEpCi0nMC4xJwotPj4+IHJlcHIoMC4xKQotJzAuMTAwMDAwMDAwMDAwMDAwMDEnCi0+Pj4geCA9IDEwICogMy4yNQotPj4+IHkgPSAyMDAgKiAyMDAKLT4+PiBzID0gJ1RoZSB2YWx1ZSBvZiB4IGlzICcgKyByZXByKHgpICsgJywgYW5kIHkgaXMgJyArIHJlcHIoeSkgKyAnLi4uJwotPj4+IHByaW50IHMKLVRoZSB2YWx1ZSBvZiB4IGlzIDMyLjUsIGFuZCB5IGlzIDQwMDAwLi4uCi0+Pj4gIyBUaGUgcmVwcigpIG9mIGEgc3RyaW5nIGFkZHMgc3RyaW5nIHF1b3RlcyBhbmQgYmFja3NsYXNoZXM6Ci0uLi4gaGVsbG8gPSAnaGVsbG8sIHdvcmxkXG4nCi0+Pj4gaGVsbG9zID0gcmVwcihoZWxsbykKLT4+PiBwcmludCBoZWxsb3MKLSdoZWxsbywgd29ybGRcbicKLT4+PiAjIFRoZSBhcmd1bWVudCB0byByZXByKCkgbWF5IGJlIGFueSBQeXRob24gb2JqZWN0OgotLi4uIHJlcHIoKHgsIHksICgnc3BhbScsICdlZ2dzJykpKQotIigzMi41LCA0MDAwMCwgKCdzcGFtJywgJ2VnZ3MnKSkiCi0+Pj4gIyByZXZlcnNlIHF1b3RlcyBhcmUgY29udmVuaWVudCBpbiBpbnRlcmFjdGl2ZSBzZXNzaW9uczoKLS4uLiBgeCwgeSwgKCdzcGFtJywgJ2VnZ3MnKWAKLSIoMzIuNSwgNDAwMDAsICgnc3BhbScsICdlZ2dzJykpIgotXGVuZHt2ZXJiYXRpbX0KLQotSGVyZSBhcmUgdHdvIHdheXMgdG8gd3JpdGUgYSB0YWJsZSBvZiBzcXVhcmVzIGFuZCBjdWJlczoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGZvciB4IGluIHJhbmdlKDEsIDExKToKLS4uLiAgICAgcHJpbnQgcmVwcih4KS5yanVzdCgyKSwgcmVwcih4KngpLnJqdXN0KDMpLAotLi4uICAgICAjIE5vdGUgdHJhaWxpbmcgY29tbWEgb24gcHJldmlvdXMgbGluZQotLi4uICAgICBwcmludCByZXByKHgqeCp4KS5yanVzdCg0KQotLi4uCi0gMSAgIDEgICAgMQotIDIgICA0ICAgIDgKLSAzICAgOSAgIDI3Ci0gNCAgMTYgICA2NAotIDUgIDI1ICAxMjUKLSA2ICAzNiAgMjE2Ci0gNyAgNDkgIDM0MwotIDggIDY0ICA1MTIKLSA5ICA4MSAgNzI5Ci0xMCAxMDAgMTAwMAotCi0+Pj4gZm9yIHggaW4gcmFuZ2UoMSwxMSk6Ci0uLi4gICAgIHByaW50ICclMmQgJTNkICU0ZCcgJSAoeCwgeCp4LCB4KngqeCkKLS4uLiAKLSAxICAgMSAgICAxCi0gMiAgIDQgICAgOAotIDMgICA5ICAgMjcKLSA0ICAxNiAgIDY0Ci0gNSAgMjUgIDEyNQotIDYgIDM2ICAyMTYKLSA3ICA0OSAgMzQzCi0gOCAgNjQgIDUxMgotIDkgIDgxICA3MjkKLTEwIDEwMCAxMDAwCi1cZW5ke3ZlcmJhdGltfQotCi0oTm90ZSB0aGF0IGluIHRoZSBmaXJzdCBleGFtcGxlLCBvbmUgc3BhY2UgYmV0d2VlbiBlYWNoIGNvbHVtbiB3YXMKLWFkZGVkIGJ5IHRoZSB3YXkgXGtleXdvcmR7cHJpbnR9IHdvcmtzOiBpdCBhbHdheXMgYWRkcyBzcGFjZXMgYmV0d2VlbgotaXRzIGFyZ3VtZW50cy4pCi0KLVRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgdGhlIFxtZXRob2R7cmp1c3QoKX0gbWV0aG9kIG9mIHN0cmluZyBvYmplY3RzLAotd2hpY2ggcmlnaHQtanVzdGlmaWVzIGEgc3RyaW5nIGluIGEgZmllbGQgb2YgYSBnaXZlbiB3aWR0aCBieSBwYWRkaW5nCi1pdCB3aXRoIHNwYWNlcyBvbiB0aGUgbGVmdC4gIFRoZXJlIGFyZSBzaW1pbGFyIG1ldGhvZHMKLVxtZXRob2R7bGp1c3QoKX0gYW5kIFxtZXRob2R7Y2VudGVyKCl9LiAgVGhlc2UKLW1ldGhvZHMgZG8gbm90IHdyaXRlIGFueXRoaW5nLCB0aGV5IGp1c3QgcmV0dXJuIGEgbmV3IHN0cmluZy4gIElmCi10aGUgaW5wdXQgc3RyaW5nIGlzIHRvbyBsb25nLCB0aGV5IGRvbid0IHRydW5jYXRlIGl0LCBidXQgcmV0dXJuIGl0Ci11bmNoYW5nZWQ7IHRoaXMgd2lsbCBtZXNzIHVwIHlvdXIgY29sdW1uIGxheS1vdXQgYnV0IHRoYXQncyB1c3VhbGx5Ci1iZXR0ZXIgdGhhbiB0aGUgYWx0ZXJuYXRpdmUsIHdoaWNoIHdvdWxkIGJlIGx5aW5nIGFib3V0IGEgdmFsdWUuICAoSWYKLXlvdSByZWFsbHkgd2FudCB0cnVuY2F0aW9uIHlvdSBjYW4gYWx3YXlzIGFkZCBhIHNsaWNlIG9wZXJhdGlvbiwgYXMgaW4KLVxzYW1we3gubGp1c3QobilbOm5dfS4pCi0KLVRoZXJlIGlzIGFub3RoZXIgbWV0aG9kLCBcbWV0aG9ke3pmaWxsKCl9LCB3aGljaCBwYWRzIGEKLW51bWVyaWMgc3RyaW5nIG9uIHRoZSBsZWZ0IHdpdGggemVyb3MuICBJdCB1bmRlcnN0YW5kcyBhYm91dCBwbHVzIGFuZAotbWludXMgc2lnbnM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiAnMTInLnpmaWxsKDUpCi0nMDAwMTInCi0+Pj4gJy0zLjE0Jy56ZmlsbCg3KQotJy0wMDMuMTQnCi0+Pj4gJzMuMTQxNTkyNjUzNTknLnpmaWxsKDUpCi0nMy4xNDE1OTI2NTM1OScKLVxlbmR7dmVyYmF0aW19Ci0KLVVzaW5nIHRoZSBcY29kZXtcJX0gb3BlcmF0b3IgbG9va3MgbGlrZSB0aGlzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gaW1wb3J0IG1hdGgKLT4+PiBwcmludCAnVGhlIHZhbHVlIG9mIFBJIGlzIGFwcHJveGltYXRlbHkgJTUuM2YuJyAlIG1hdGgucGkKLVRoZSB2YWx1ZSBvZiBQSSBpcyBhcHByb3hpbWF0ZWx5IDMuMTQyLgotXGVuZHt2ZXJiYXRpbX0KLQotSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBmb3JtYXQgaW4gdGhlIHN0cmluZywgeW91IG5lZWQgdG8gcGFzcyBhCi10dXBsZSBhcyByaWdodCBvcGVyYW5kLCBhcyBpbiB0aGlzIGV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiB0YWJsZSA9IHsnU2pvZXJkJzogNDEyNywgJ0phY2snOiA0MDk4LCAnRGNhYic6IDc2Nzh9Ci0+Pj4gZm9yIG5hbWUsIHBob25lIGluIHRhYmxlLml0ZW1zKCk6Ci0uLi4gICAgIHByaW50ICclLTEwcyA9PT4gJTEwZCcgJSAobmFtZSwgcGhvbmUpCi0uLi4gCi1KYWNrICAgICAgID09PiAgICAgICA0MDk4Ci1EY2FiICAgICAgID09PiAgICAgICA3Njc4Ci1Tam9lcmQgICAgID09PiAgICAgICA0MTI3Ci1cZW5ke3ZlcmJhdGltfQotCi1Nb3N0IGZvcm1hdHMgd29yayBleGFjdGx5IGFzIGluIEMgYW5kIHJlcXVpcmUgdGhhdCB5b3UgcGFzcyB0aGUgcHJvcGVyCi10eXBlOyBob3dldmVyLCBpZiB5b3UgZG9uJ3QgeW91IGdldCBhbiBleGNlcHRpb24sIG5vdCBhIGNvcmUgZHVtcC4KLVRoZSBcY29kZXtcJXN9IGZvcm1hdCBpcyBtb3JlIHJlbGF4ZWQ6IGlmIHRoZSBjb3JyZXNwb25kaW5nIGFyZ3VtZW50IGlzCi1ub3QgYSBzdHJpbmcgb2JqZWN0LCBpdCBpcyBjb252ZXJ0ZWQgdG8gc3RyaW5nIHVzaW5nIHRoZQotXGZ1bmN0aW9ue3N0cigpfSBidWlsdC1pbiBmdW5jdGlvbi4gIFVzaW5nIFxjb2Rleyp9IHRvIHBhc3MgdGhlIHdpZHRoCi1vciBwcmVjaXNpb24gaW4gYXMgYSBzZXBhcmF0ZSAoaW50ZWdlcikgYXJndW1lbnQgaXMgc3VwcG9ydGVkLiAgVGhlCi1DIGZvcm1hdHMgXGNvZGV7XCVufSBhbmQgXGNvZGV7XCVwfSBhcmUgbm90IHN1cHBvcnRlZC4KLQotSWYgeW91IGhhdmUgYSByZWFsbHkgbG9uZyBmb3JtYXQgc3RyaW5nIHRoYXQgeW91IGRvbid0IHdhbnQgdG8gc3BsaXQKLXVwLCBpdCB3b3VsZCBiZSBuaWNlIGlmIHlvdSBjb3VsZCByZWZlcmVuY2UgdGhlIHZhcmlhYmxlcyB0byBiZQotZm9ybWF0dGVkIGJ5IG5hbWUgaW5zdGVhZCBvZiBieSBwb3NpdGlvbi4gIFRoaXMgY2FuIGJlIGRvbmUgYnkgdXNpbmcKLWZvcm0gXGNvZGV7XCUobmFtZSlmb3JtYXR9LCBhcyBzaG93biBoZXJlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gdGFibGUgPSB7J1Nqb2VyZCc6IDQxMjcsICdKYWNrJzogNDA5OCwgJ0RjYWInOiA4NjM3Njc4fQotPj4+IHByaW50ICdKYWNrOiAlKEphY2spZDsgU2pvZXJkOiAlKFNqb2VyZClkOyBEY2FiOiAlKERjYWIpZCcgJSB0YWJsZQotSmFjazogNDA5ODsgU2pvZXJkOiA0MTI3OyBEY2FiOiA4NjM3Njc4Ci1cZW5ke3ZlcmJhdGltfQotCi1UaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgbmV3IGJ1aWx0LWluCi1cZnVuY3Rpb257dmFycygpfSBmdW5jdGlvbiwgd2hpY2ggcmV0dXJucyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBhbGwKLWxvY2FsIHZhcmlhYmxlcy4KLQotXHNlY3Rpb257UmVhZGluZyBhbmQgV3JpdGluZyBGaWxlcyBcbGFiZWx7ZmlsZXN9fQotCi0lIE9wZW5pbmcgZmlsZXMgCi1cZnVuY3Rpb257b3BlbigpfVxiaWZ1bmNpbmRleHtvcGVufSByZXR1cm5zIGEgZmlsZQotb2JqZWN0XG9iaW5kZXh7ZmlsZX0sIGFuZCBpcyBtb3N0IGNvbW1vbmx5IHVzZWQgd2l0aCB0d28gYXJndW1lbnRzOgotXHNhbXB7b3BlbihcdmFye2ZpbGVuYW1lfSwgXHZhcnttb2RlfSl9LgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZj1vcGVuKCcvdG1wL3dvcmtmaWxlJywgJ3cnKQotPj4+IHByaW50IGYKLTxvcGVuIGZpbGUgJy90bXAvd29ya2ZpbGUnLCBtb2RlICd3JyBhdCA4MGEwOTYwPgotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGZpbGVuYW1lLiAgVGhlIHNlY29uZAotYXJndW1lbnQgaXMgYW5vdGhlciBzdHJpbmcgY29udGFpbmluZyBhIGZldyBjaGFyYWN0ZXJzIGRlc2NyaWJpbmcgdGhlCi13YXkgaW4gd2hpY2ggdGhlIGZpbGUgd2lsbCBiZSB1c2VkLiAgXHZhcnttb2RlfSBjYW4gYmUgXGNvZGV7J3InfSB3aGVuCi10aGUgZmlsZSB3aWxsIG9ubHkgYmUgcmVhZCwgXGNvZGV7J3cnfSBmb3Igb25seSB3cml0aW5nIChhbiBleGlzdGluZwotZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUgd2lsbCBiZSBlcmFzZWQpLCBhbmQgXGNvZGV7J2EnfSBvcGVucyB0aGUgZmlsZQotZm9yIGFwcGVuZGluZzsgYW55IGRhdGEgd3JpdHRlbiB0byB0aGUgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvCi10aGUgZW5kLiAgXGNvZGV7J3IrJ30gb3BlbnMgdGhlIGZpbGUgZm9yIGJvdGggcmVhZGluZyBhbmQgd3JpdGluZy4KLVRoZSBcdmFye21vZGV9IGFyZ3VtZW50IGlzIG9wdGlvbmFsOyBcY29kZXsncid9IHdpbGwgYmUgYXNzdW1lZCBpZgotaXQncyBvbWl0dGVkLgotCi1PbiBXaW5kb3dzIGFuZCB0aGUgTWFjaW50b3NoLCBcY29kZXsnYid9IGFwcGVuZGVkIHRvIHRoZQotbW9kZSBvcGVucyB0aGUgZmlsZSBpbiBiaW5hcnkgbW9kZSwgc28gdGhlcmUgYXJlIGFsc28gbW9kZXMgbGlrZQotXGNvZGV7J3JiJ30sIFxjb2Rleyd3Yid9LCBhbmQgXGNvZGV7J3IrYid9LiAgV2luZG93cyBtYWtlcyBhCi1kaXN0aW5jdGlvbiBiZXR3ZWVuIHRleHQgYW5kIGJpbmFyeSBmaWxlczsgdGhlIGVuZC1vZi1saW5lIGNoYXJhY3RlcnMKLWluIHRleHQgZmlsZXMgYXJlIGF1dG9tYXRpY2FsbHkgYWx0ZXJlZCBzbGlnaHRseSB3aGVuIGRhdGEgaXMgcmVhZCBvcgotd3JpdHRlbi4gIFRoaXMgYmVoaW5kLXRoZS1zY2VuZXMgbW9kaWZpY2F0aW9uIHRvIGZpbGUgZGF0YSBpcyBmaW5lIGZvcgotXEFTQ0lJe30gdGV4dCBmaWxlcywgYnV0IGl0J2xsIGNvcnJ1cHQgYmluYXJ5IGRhdGEgbGlrZSB0aGF0IGluIFxmaWxle0pQRUd9IG9yCi1cZmlsZXtFWEV9IGZpbGVzLiAgQmUgdmVyeSBjYXJlZnVsIHRvIHVzZSBiaW5hcnkgbW9kZSB3aGVuIHJlYWRpbmcgYW5kCi13cml0aW5nIHN1Y2ggZmlsZXMuCi0KLVxzdWJzZWN0aW9ue01ldGhvZHMgb2YgRmlsZSBPYmplY3RzIFxsYWJlbHtmaWxlTWV0aG9kc319Ci0KLVRoZSByZXN0IG9mIHRoZSBleGFtcGxlcyBpbiB0aGlzIHNlY3Rpb24gd2lsbCBhc3N1bWUgdGhhdCBhIGZpbGUKLW9iamVjdCBjYWxsZWQgXGNvZGV7Zn0gaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkLgotCi1UbyByZWFkIGEgZmlsZSdzIGNvbnRlbnRzLCBjYWxsIFxjb2Rle2YucmVhZChcdmFye3NpemV9KX0sIHdoaWNoIHJlYWRzCi1zb21lIHF1YW50aXR5IG9mIGRhdGEgYW5kIHJldHVybnMgaXQgYXMgYSBzdHJpbmcuICBcdmFye3NpemV9IGlzIGFuCi1vcHRpb25hbCBudW1lcmljIGFyZ3VtZW50LiAgV2hlbiBcdmFye3NpemV9IGlzIG9taXR0ZWQgb3IgbmVnYXRpdmUsCi10aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIHdpbGwgYmUgcmVhZCBhbmQgcmV0dXJuZWQ7IGl0J3MgeW91cgotcHJvYmxlbSBpZiB0aGUgZmlsZSBpcyB0d2ljZSBhcyBsYXJnZSBhcyB5b3VyIG1hY2hpbmUncyBtZW1vcnkuCi1PdGhlcndpc2UsIGF0IG1vc3QgXHZhcntzaXplfSBieXRlcyBhcmUgcmVhZCBhbmQgcmV0dXJuZWQuICBJZiB0aGUgZW5kCi1vZiB0aGUgZmlsZSBoYXMgYmVlbiByZWFjaGVkLCBcY29kZXtmLnJlYWQoKX0gd2lsbCByZXR1cm4gYW4gZW1wdHkKLXN0cmluZyAoXGNvZGUgeyIifSkuCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZi5yZWFkKCkKLSdUaGlzIGlzIHRoZSBlbnRpcmUgZmlsZS5cbicKLT4+PiBmLnJlYWQoKQotJycKLVxlbmR7dmVyYmF0aW19Ci0KLVxjb2Rle2YucmVhZGxpbmUoKX0gcmVhZHMgYSBzaW5nbGUgbGluZSBmcm9tIHRoZSBmaWxlOyBhIG5ld2xpbmUKLWNoYXJhY3RlciAoXGNvZGV7XGUgbn0pIGlzIGxlZnQgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLCBhbmQgaXMgb25seQotb21pdHRlZCBvbiB0aGUgbGFzdCBsaW5lIG9mIHRoZSBmaWxlIGlmIHRoZSBmaWxlIGRvZXNuJ3QgZW5kIGluIGEKLW5ld2xpbmUuICBUaGlzIG1ha2VzIHRoZSByZXR1cm4gdmFsdWUgdW5hbWJpZ3VvdXM7IGlmCi1cY29kZXtmLnJlYWRsaW5lKCl9IHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLCB0aGUgZW5kIG9mIHRoZSBmaWxlIGhhcwotYmVlbiByZWFjaGVkLCB3aGlsZSBhIGJsYW5rIGxpbmUgaXMgcmVwcmVzZW50ZWQgYnkgXGNvZGV7J1xlIG4nfSwgYQotc3RyaW5nIGNvbnRhaW5pbmcgb25seSBhIHNpbmdsZSBuZXdsaW5lLiAgCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBmLnJlYWRsaW5lKCkKLSdUaGlzIGlzIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBmaWxlLlxuJwotPj4+IGYucmVhZGxpbmUoKQotJ1NlY29uZCBsaW5lIG9mIHRoZSBmaWxlXG4nCi0+Pj4gZi5yZWFkbGluZSgpCi0nJwotXGVuZHt2ZXJiYXRpbX0KLQotXGNvZGV7Zi5yZWFkbGluZXMoKX0gcmV0dXJucyBhIGxpc3QgY29udGFpbmluZyBhbGwgdGhlIGxpbmVzIG9mIGRhdGEKLWluIHRoZSBmaWxlLiAgSWYgZ2l2ZW4gYW4gb3B0aW9uYWwgcGFyYW1ldGVyIFx2YXJ7c2l6ZWhpbnR9LCBpdCByZWFkcwotdGhhdCBtYW55IGJ5dGVzIGZyb20gdGhlIGZpbGUgYW5kIGVub3VnaCBtb3JlIHRvIGNvbXBsZXRlIGEgbGluZSwgYW5kCi1yZXR1cm5zIHRoZSBsaW5lcyBmcm9tIHRoYXQuICBUaGlzIGlzIG9mdGVuIHVzZWQgdG8gYWxsb3cgZWZmaWNpZW50Ci1yZWFkaW5nIG9mIGEgbGFyZ2UgZmlsZSBieSBsaW5lcywgYnV0IHdpdGhvdXQgaGF2aW5nIHRvIGxvYWQgdGhlCi1lbnRpcmUgZmlsZSBpbiBtZW1vcnkuICBPbmx5IGNvbXBsZXRlIGxpbmVzIHdpbGwgYmUgcmV0dXJuZWQuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBmLnJlYWRsaW5lcygpCi1bJ1RoaXMgaXMgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGZpbGUuXG4nLCAnU2Vjb25kIGxpbmUgb2YgdGhlIGZpbGVcbiddCi1cZW5ke3ZlcmJhdGltfQotCi1BbiBhbHRlcm5hdGUgYXBwcm9hY2ggdG8gcmVhZGluZyBsaW5lcyBpcyB0byBsb29wIG92ZXIgdGhlIGZpbGUgb2JqZWN0LgotVGhpcyBpcyBtZW1vcnkgZWZmaWNpZW50LCBmYXN0LCBhbmQgbGVhZHMgdG8gc2ltcGxlciBjb2RlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZm9yIGxpbmUgaW4gZjoKLSAgICAgICAgcHJpbnQgbGluZSwKLSAgICAgICAgCi1UaGlzIGlzIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBmaWxlLgotU2Vjb25kIGxpbmUgb2YgdGhlIGZpbGUKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBhbHRlcm5hdGl2ZSBhcHByb2FjaCBpcyBzaW1wbGVyIGJ1dCBkb2VzIG5vdCBwcm92aWRlIGFzIGZpbmUtZ3JhaW5lZAotY29udHJvbC4gIFNpbmNlIHRoZSB0d28gYXBwcm9hY2hlcyBtYW5hZ2UgbGluZSBidWZmZXJpbmcgZGlmZmVyZW50bHksCi10aGV5IHNob3VsZCBub3QgYmUgbWl4ZWQuCi0KLVxjb2Rle2Yud3JpdGUoXHZhcntzdHJpbmd9KX0gd3JpdGVzIHRoZSBjb250ZW50cyBvZiBcdmFye3N0cmluZ30gdG8KLXRoZSBmaWxlLCByZXR1cm5pbmcgXGNvZGV7Tm9uZX0uICAKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGYud3JpdGUoJ1RoaXMgaXMgYSB0ZXN0XG4nKQotXGVuZHt2ZXJiYXRpbX0KLQotVG8gd3JpdGUgc29tZXRoaW5nIG90aGVyIHRoYW4gYSBzdHJpbmcsIGl0IG5lZWRzIHRvIGJlIGNvbnZlcnRlZCB0byBhCi1zdHJpbmcgZmlyc3Q6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiB2YWx1ZSA9ICgndGhlIGFuc3dlcicsIDQyKQotPj4+IHMgPSBzdHIodmFsdWUpCi0+Pj4gZi53cml0ZShzKQotXGVuZHt2ZXJiYXRpbX0KLQotXGNvZGV7Zi50ZWxsKCl9IHJldHVybnMgYW4gaW50ZWdlciBnaXZpbmcgdGhlIGZpbGUgb2JqZWN0J3MgY3VycmVudAotcG9zaXRpb24gaW4gdGhlIGZpbGUsIG1lYXN1cmVkIGluIGJ5dGVzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUKLWZpbGUuICBUbyBjaGFuZ2UgdGhlIGZpbGUgb2JqZWN0J3MgcG9zaXRpb24sIHVzZQotXHNhbXB7Zi5zZWVrKFx2YXJ7b2Zmc2V0fSwgXHZhcntmcm9tX3doYXR9KX0uICBUaGUgcG9zaXRpb24gaXMKLWNvbXB1dGVkIGZyb20gYWRkaW5nIFx2YXJ7b2Zmc2V0fSB0byBhIHJlZmVyZW5jZSBwb2ludDsgdGhlIHJlZmVyZW5jZQotcG9pbnQgaXMgc2VsZWN0ZWQgYnkgdGhlIFx2YXJ7ZnJvbV93aGF0fSBhcmd1bWVudC4gIEEKLVx2YXJ7ZnJvbV93aGF0fSB2YWx1ZSBvZiAwIG1lYXN1cmVzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSwgMQotdXNlcyB0aGUgY3VycmVudCBmaWxlIHBvc2l0aW9uLCBhbmQgMiB1c2VzIHRoZSBlbmQgb2YgdGhlIGZpbGUgYXMgdGhlCi1yZWZlcmVuY2UgcG9pbnQuICBcdmFye2Zyb21fd2hhdH0gY2FuIGJlIG9taXR0ZWQgYW5kIGRlZmF1bHRzIHRvIDAsCi11c2luZyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIGFzIHRoZSByZWZlcmVuY2UgcG9pbnQuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBmID0gb3BlbignL3RtcC93b3JrZmlsZScsICdyKycpCi0+Pj4gZi53cml0ZSgnMDEyMzQ1Njc4OWFiY2RlZicpCi0+Pj4gZi5zZWVrKDUpICAgICAjIEdvIHRvIHRoZSA2dGggYnl0ZSBpbiB0aGUgZmlsZQotPj4+IGYucmVhZCgxKSAgICAgICAgCi0nNScKLT4+PiBmLnNlZWsoLTMsIDIpICMgR28gdG8gdGhlIDNyZCBieXRlIGJlZm9yZSB0aGUgZW5kCi0+Pj4gZi5yZWFkKDEpCi0nZCcKLVxlbmR7dmVyYmF0aW19Ci0KLVdoZW4geW91J3JlIGRvbmUgd2l0aCBhIGZpbGUsIGNhbGwgXGNvZGV7Zi5jbG9zZSgpfSB0byBjbG9zZSBpdCBhbmQKLWZyZWUgdXAgYW55IHN5c3RlbSByZXNvdXJjZXMgdGFrZW4gdXAgYnkgdGhlIG9wZW4gZmlsZS4gIEFmdGVyIGNhbGxpbmcKLVxjb2Rle2YuY2xvc2UoKX0sIGF0dGVtcHRzIHRvIHVzZSB0aGUgZmlsZSBvYmplY3Qgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBmLmNsb3NlKCkKLT4+PiBmLnJlYWQoKQotVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/Ci1WYWx1ZUVycm9yOiBJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlCi1cZW5ke3ZlcmJhdGltfQotCi1GaWxlIG9iamVjdHMgaGF2ZSBzb21lIGFkZGl0aW9uYWwgbWV0aG9kcywgc3VjaCBhcwotXG1ldGhvZHtpc2F0dHkoKX0gYW5kIFxtZXRob2R7dHJ1bmNhdGUoKX0gd2hpY2ggYXJlIGxlc3MgZnJlcXVlbnRseQotdXNlZDsgY29uc3VsdCB0aGUgTGlicmFyeSBSZWZlcmVuY2UgZm9yIGEgY29tcGxldGUgZ3VpZGUgdG8gZmlsZQotb2JqZWN0cy4KLQotXHN1YnNlY3Rpb257VGhlIFxtb2R1bGV7cGlja2xlfSBNb2R1bGUgXGxhYmVse3BpY2tsZX19Ci1ccmVmc3Rtb2RpbmRleHtwaWNrbGV9Ci0KLVN0cmluZ3MgY2FuIGVhc2lseSBiZSB3cml0dGVuIHRvIGFuZCByZWFkIGZyb20gYSBmaWxlLiBOdW1iZXJzIHRha2UgYQotYml0IG1vcmUgZWZmb3J0LCBzaW5jZSB0aGUgXG1ldGhvZHtyZWFkKCl9IG1ldGhvZCBvbmx5IHJldHVybnMKLXN0cmluZ3MsIHdoaWNoIHdpbGwgaGF2ZSB0byBiZSBwYXNzZWQgdG8gYSBmdW5jdGlvbiBsaWtlCi1cZnVuY3Rpb257aW50KCl9LCB3aGljaCB0YWtlcyBhIHN0cmluZyBsaWtlIFxjb2RleycxMjMnfSBhbmQKLXJldHVybnMgaXRzIG51bWVyaWMgdmFsdWUgMTIzLiAgSG93ZXZlciwgd2hlbiB5b3Ugd2FudCB0byBzYXZlIG1vcmUKLWNvbXBsZXggZGF0YSB0eXBlcyBsaWtlIGxpc3RzLCBkaWN0aW9uYXJpZXMsIG9yIGNsYXNzIGluc3RhbmNlcywKLXRoaW5ncyBnZXQgYSBsb3QgbW9yZSBjb21wbGljYXRlZC4KLQotUmF0aGVyIHRoYW4gaGF2ZSB1c2VycyBiZSBjb25zdGFudGx5IHdyaXRpbmcgYW5kIGRlYnVnZ2luZyBjb2RlIHRvCi1zYXZlIGNvbXBsaWNhdGVkIGRhdGEgdHlwZXMsIFB5dGhvbiBwcm92aWRlcyBhIHN0YW5kYXJkIG1vZHVsZSBjYWxsZWQKLVx1bGlua3tcbW9kdWxle3BpY2tsZX19ey4uL2xpYi9tb2R1bGUtcGlja2xlLmh0bWx9LiAgVGhpcyBpcyBhbgotYW1hemluZyBtb2R1bGUgdGhhdCBjYW4gdGFrZSBhbG1vc3QKLWFueSBQeXRob24gb2JqZWN0IChldmVuIHNvbWUgZm9ybXMgb2YgUHl0aG9uIGNvZGUhKSwgYW5kIGNvbnZlcnQgaXQgdG8KLWEgc3RyaW5nIHJlcHJlc2VudGF0aW9uOyB0aGlzIHByb2Nlc3MgaXMgY2FsbGVkIFxkZm57cGlja2xpbmd9LiAgCi1SZWNvbnN0cnVjdGluZyB0aGUgb2JqZWN0IGZyb20gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBpcyBjYWxsZWQKLVxkZm57dW5waWNrbGluZ30uICBCZXR3ZWVuIHBpY2tsaW5nIGFuZCB1bnBpY2tsaW5nLCB0aGUgc3RyaW5nCi1yZXByZXNlbnRpbmcgdGhlIG9iamVjdCBtYXkgaGF2ZSBiZWVuIHN0b3JlZCBpbiBhIGZpbGUgb3IgZGF0YSwgb3IKLXNlbnQgb3ZlciBhIG5ldHdvcmsgY29ubmVjdGlvbiB0byBzb21lIGRpc3RhbnQgbWFjaGluZS4KLQotSWYgeW91IGhhdmUgYW4gb2JqZWN0IFxjb2Rle3h9LCBhbmQgYSBmaWxlIG9iamVjdCBcY29kZXtmfSB0aGF0J3MgYmVlbgotb3BlbmVkIGZvciB3cml0aW5nLCB0aGUgc2ltcGxlc3Qgd2F5IHRvIHBpY2tsZSB0aGUgb2JqZWN0IHRha2VzIG9ubHkKLW9uZSBsaW5lIG9mIGNvZGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXBpY2tsZS5kdW1wKHgsIGYpCi1cZW5ke3ZlcmJhdGltfQotCi1UbyB1bnBpY2tsZSB0aGUgb2JqZWN0IGFnYWluLCBpZiBcY29kZXtmfSBpcyBhIGZpbGUgb2JqZWN0IHdoaWNoIGhhcwotYmVlbiBvcGVuZWQgZm9yIHJlYWRpbmc6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXggPSBwaWNrbGUubG9hZChmKQotXGVuZHt2ZXJiYXRpbX0KLQotKFRoZXJlIGFyZSBvdGhlciB2YXJpYW50cyBvZiB0aGlzLCB1c2VkIHdoZW4gcGlja2xpbmcgbWFueSBvYmplY3RzIG9yCi13aGVuIHlvdSBkb24ndCB3YW50IHRvIHdyaXRlIHRoZSBwaWNrbGVkIGRhdGEgdG8gYSBmaWxlOyBjb25zdWx0IHRoZQotY29tcGxldGUgZG9jdW1lbnRhdGlvbiBmb3IKLVx1bGlua3tcbW9kdWxle3BpY2tsZX19ey4uL2xpYi9tb2R1bGUtcGlja2xlLmh0bWx9IGluIHRoZQotXGNpdGV0aXRsZVsuLi9saWIvXXtQeXRob24gTGlicmFyeSBSZWZlcmVuY2V9LikKLQotXHVsaW5re1xtb2R1bGV7cGlja2xlfX17Li4vbGliL21vZHVsZS1waWNrbGUuaHRtbH0gaXMgdGhlIHN0YW5kYXJkIHdheQotdG8gbWFrZSBQeXRob24gb2JqZWN0cyB3aGljaCBjYW4gYmUgc3RvcmVkIGFuZCByZXVzZWQgYnkgb3RoZXIKLXByb2dyYW1zIG9yIGJ5IGEgZnV0dXJlIGludm9jYXRpb24gb2YgdGhlIHNhbWUgcHJvZ3JhbTsgdGhlIHRlY2huaWNhbAotdGVybSBmb3IgdGhpcyBpcyBhIFxkZm57cGVyc2lzdGVudH0gb2JqZWN0LiAgQmVjYXVzZQotXHVsaW5re1xtb2R1bGV7cGlja2xlfX17Li4vbGliL21vZHVsZS1waWNrbGUuaHRtbH0gaXMgc28gd2lkZWx5IHVzZWQsCi1tYW55IGF1dGhvcnMgd2hvIHdyaXRlIFB5dGhvbiBleHRlbnNpb25zIHRha2UgY2FyZSB0byBlbnN1cmUgdGhhdCBuZXcKLWRhdGEgdHlwZXMgc3VjaCBhcyBtYXRyaWNlcyBjYW4gYmUgcHJvcGVybHkgcGlja2xlZCBhbmQgdW5waWNrbGVkLgotCi0KLQotXGNoYXB0ZXJ7RXJyb3JzIGFuZCBFeGNlcHRpb25zIFxsYWJlbHtlcnJvcnN9fQotCi1VbnRpbCBub3cgZXJyb3IgbWVzc2FnZXMgaGF2ZW4ndCBiZWVuIG1vcmUgdGhhbiBtZW50aW9uZWQsIGJ1dCBpZiB5b3UKLWhhdmUgdHJpZWQgb3V0IHRoZSBleGFtcGxlcyB5b3UgaGF2ZSBwcm9iYWJseSBzZWVuIHNvbWUuICBUaGVyZSBhcmUKLShhdCBsZWFzdCkgdHdvIGRpc3Rpbmd1aXNoYWJsZSBraW5kcyBvZiBlcnJvcnM6Ci1cZW1waHtzeW50YXggZXJyb3JzfSBhbmQgXGVtcGh7ZXhjZXB0aW9uc30uCi0KLVxzZWN0aW9ue1N5bnRheCBFcnJvcnMgXGxhYmVse3N5bnRheEVycm9yc319Ci0KLVN5bnRheCBlcnJvcnMsIGFsc28ga25vd24gYXMgcGFyc2luZyBlcnJvcnMsIGFyZSBwZXJoYXBzIHRoZSBtb3N0IGNvbW1vbgota2luZCBvZiBjb21wbGFpbnQgeW91IGdldCB3aGlsZSB5b3UgYXJlIHN0aWxsIGxlYXJuaW5nIFB5dGhvbjoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHdoaWxlIFRydWUgcHJpbnQgJ0hlbGxvIHdvcmxkJwotICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/Ci0gICAgd2hpbGUgVHJ1ZSBwcmludCAnSGVsbG8gd29ybGQnCi0gICAgICAgICAgICAgICAgICAgXgotU3ludGF4RXJyb3I6IGludmFsaWQgc3ludGF4Ci1cZW5ke3ZlcmJhdGltfQotCi1UaGUgcGFyc2VyIHJlcGVhdHMgdGhlIG9mZmVuZGluZyBsaW5lIGFuZCBkaXNwbGF5cyBhIGxpdHRsZSBgYXJyb3cnCi1wb2ludGluZyBhdCB0aGUgZWFybGllc3QgcG9pbnQgaW4gdGhlIGxpbmUgd2hlcmUgdGhlIGVycm9yIHdhcwotZGV0ZWN0ZWQuICBUaGUgZXJyb3IgaXMgY2F1c2VkIGJ5IChvciBhdCBsZWFzdCBkZXRlY3RlZCBhdCkgdGhlIHRva2VuCi1cZW1waHtwcmVjZWRpbmd9IHRoZSBhcnJvdzogaW4gdGhlIGV4YW1wbGUsIHRoZSBlcnJvciBpcyBkZXRlY3RlZCBhdAotdGhlIGtleXdvcmQgXGtleXdvcmR7cHJpbnR9LCBzaW5jZSBhIGNvbG9uIChcY2hhcmFjdGVyezp9KSBpcyBtaXNzaW5nCi1iZWZvcmUgaXQuICBGaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIGFyZSBwcmludGVkIHNvIHlvdSBrbm93IHdoZXJlIHRvCi1sb29rIGluIGNhc2UgdGhlIGlucHV0IGNhbWUgZnJvbSBhIHNjcmlwdC4KLQotXHNlY3Rpb257RXhjZXB0aW9ucyBcbGFiZWx7ZXhjZXB0aW9uc319Ci0KLUV2ZW4gaWYgYSBzdGF0ZW1lbnQgb3IgZXhwcmVzc2lvbiBpcyBzeW50YWN0aWNhbGx5IGNvcnJlY3QsIGl0IG1heQotY2F1c2UgYW4gZXJyb3Igd2hlbiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gZXhlY3V0ZSBpdC4KLUVycm9ycyBkZXRlY3RlZCBkdXJpbmcgZXhlY3V0aW9uIGFyZSBjYWxsZWQgXGVtcGh7ZXhjZXB0aW9uc30gYW5kIGFyZQotbm90IHVuY29uZGl0aW9uYWxseSBmYXRhbDogeW91IHdpbGwgc29vbiBsZWFybiBob3cgdG8gaGFuZGxlIHRoZW0gaW4KLVB5dGhvbiBwcm9ncmFtcy4gIE1vc3QgZXhjZXB0aW9ucyBhcmUgbm90IGhhbmRsZWQgYnkgcHJvZ3JhbXMsCi1ob3dldmVyLCBhbmQgcmVzdWx0IGluIGVycm9yIG1lc3NhZ2VzIGFzIHNob3duIGhlcmU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiAxMCAqICgxLzApCi1UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KLVplcm9EaXZpc2lvbkVycm9yOiBpbnRlZ2VyIGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvCi0+Pj4gNCArIHNwYW0qMwotVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/Ci1OYW1lRXJyb3I6IG5hbWUgJ3NwYW0nIGlzIG5vdCBkZWZpbmVkCi0+Pj4gJzInICsgMgotVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/Ci1UeXBlRXJyb3I6IGNhbm5vdCBjb25jYXRlbmF0ZSAnc3RyJyBhbmQgJ2ludCcgb2JqZWN0cwotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGxhc3QgbGluZSBvZiB0aGUgZXJyb3IgbWVzc2FnZSBpbmRpY2F0ZXMgd2hhdCBoYXBwZW5lZC4KLUV4Y2VwdGlvbnMgY29tZSBpbiBkaWZmZXJlbnQgdHlwZXMsIGFuZCB0aGUgdHlwZSBpcyBwcmludGVkIGFzIHBhcnQgb2YKLXRoZSBtZXNzYWdlOiB0aGUgdHlwZXMgaW4gdGhlIGV4YW1wbGUgYXJlCi1cZXhjZXB0aW9ue1plcm9EaXZpc2lvbkVycm9yfSwgXGV4Y2VwdGlvbntOYW1lRXJyb3J9IGFuZAotXGV4Y2VwdGlvbntUeXBlRXJyb3J9LgotVGhlIHN0cmluZyBwcmludGVkIGFzIHRoZSBleGNlcHRpb24gdHlwZSBpcyB0aGUgbmFtZSBvZiB0aGUgYnVpbHQtaW4KLWV4Y2VwdGlvbiB0aGF0IG9jY3VycmVkLiAgVGhpcyBpcyB0cnVlIGZvciBhbGwgYnVpbHQtaW4KLWV4Y2VwdGlvbnMsIGJ1dCBuZWVkIG5vdCBiZSB0cnVlIGZvciB1c2VyLWRlZmluZWQgZXhjZXB0aW9ucyAoYWx0aG91Z2gKLWl0IGlzIGEgdXNlZnVsIGNvbnZlbnRpb24pLgotU3RhbmRhcmQgZXhjZXB0aW9uIG5hbWVzIGFyZSBidWlsdC1pbiBpZGVudGlmaWVycyAobm90IHJlc2VydmVkCi1rZXl3b3JkcykuCi0KLVRoZSByZXN0IG9mIHRoZSBsaW5lIHByb3ZpZGVzIGRldGFpbCBiYXNlZCBvbiB0aGUgdHlwZSBvZiBleGNlcHRpb24KLWFuZCB3aGF0IGNhdXNlZCBpdC4KLQotVGhlIHByZWNlZGluZyBwYXJ0IG9mIHRoZSBlcnJvciBtZXNzYWdlIHNob3dzIHRoZSBjb250ZXh0IHdoZXJlIHRoZQotZXhjZXB0aW9uIGhhcHBlbmVkLCBpbiB0aGUgZm9ybSBvZiBhIHN0YWNrIHRyYWNlYmFjay4KLUluIGdlbmVyYWwgaXQgY29udGFpbnMgYSBzdGFjayB0cmFjZWJhY2sgbGlzdGluZyBzb3VyY2UgbGluZXM7IGhvd2V2ZXIsCi1pdCB3aWxsIG5vdCBkaXNwbGF5IGxpbmVzIHJlYWQgZnJvbSBzdGFuZGFyZCBpbnB1dC4KLQotVGhlIFxjaXRldGl0bGVbLi4vbGliL21vZHVsZS1leGNlcHRpb25zLmh0bWxde1B5dGhvbiBMaWJyYXJ5Ci1SZWZlcmVuY2V9IGxpc3RzIHRoZSBidWlsdC1pbiBleGNlcHRpb25zIGFuZCB0aGVpciBtZWFuaW5ncy4KLQotCi1cc2VjdGlvbntIYW5kbGluZyBFeGNlcHRpb25zIFxsYWJlbHtoYW5kbGluZ319Ci0KLUl0IGlzIHBvc3NpYmxlIHRvIHdyaXRlIHByb2dyYW1zIHRoYXQgaGFuZGxlIHNlbGVjdGVkIGV4Y2VwdGlvbnMuCi1Mb29rIGF0IHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgd2hpY2ggYXNrcyB0aGUgdXNlciBmb3IgaW5wdXQgdW50aWwgYQotdmFsaWQgaW50ZWdlciBoYXMgYmVlbiBlbnRlcmVkLCBidXQgYWxsb3dzIHRoZSB1c2VyIHRvIGludGVycnVwdCB0aGUKLXByb2dyYW0gKHVzaW5nIFxrYmR7Q29udHJvbC1DfSBvciB3aGF0ZXZlciB0aGUgb3BlcmF0aW5nIHN5c3RlbQotc3VwcG9ydHMpOyBub3RlIHRoYXQgYSB1c2VyLWdlbmVyYXRlZCBpbnRlcnJ1cHRpb24gaXMgc2lnbmFsbGVkIGJ5Ci1yYWlzaW5nIHRoZSBcZXhjZXB0aW9ue0tleWJvYXJkSW50ZXJydXB0fSBleGNlcHRpb24uCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBkZWYgcmF3X2lucHV0KHByb21wdCk6Ci0uLi4gICAgIGltcG9ydCBzeXMKLS4uLiAgICAgc3lzLnN0ZG91dC53cml0ZShwcm9tcHQpCi0uLi4gICAgIHN5cy5zdGRvdXQuZmx1c2goKQotLi4uICAgICByZXR1cm4gc3lzLnN0ZGluLnJlYWRsaW5lKCkKLS4uLiAKLT4+PiB3aGlsZSBUcnVlOgotLi4uICAgICB0cnk6Ci0uLi4gICAgICAgICB4ID0gaW50KHJhd19pbnB1dCgiUGxlYXNlIGVudGVyIGEgbnVtYmVyOiAiKSkKLS4uLiAgICAgICAgIGJyZWFrCi0uLi4gICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotLi4uICAgICAgICAgcHJpbnQgIk9vcHMhICBUaGF0IHdhcyBubyB2YWxpZCBudW1iZXIuICBUcnkgYWdhaW4uLi4iCi0uLi4gICAgIAotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIFxrZXl3b3Jke3RyeX0gc3RhdGVtZW50IHdvcmtzIGFzIGZvbGxvd3MuCi0KLVxiZWdpbntpdGVtaXplfQotXGl0ZW0KLUZpcnN0LCB0aGUgXGVtcGh7dHJ5IGNsYXVzZX0gKHRoZSBzdGF0ZW1lbnQocykgYmV0d2VlbiB0aGUKLVxrZXl3b3Jke3RyeX0gYW5kIFxrZXl3b3Jke2V4Y2VwdH0ga2V5d29yZHMpIGlzIGV4ZWN1dGVkLgotCi1caXRlbQotSWYgbm8gZXhjZXB0aW9uIG9jY3VycywgdGhlIFxlbXBoe2V4Y2VwdFwgY2xhdXNlfSBpcyBza2lwcGVkIGFuZAotZXhlY3V0aW9uIG9mIHRoZSBca2V5d29yZHt0cnl9IHN0YXRlbWVudCBpcyBmaW5pc2hlZC4KLQotXGl0ZW0KLUlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgZHVyaW5nIGV4ZWN1dGlvbiBvZiB0aGUgdHJ5IGNsYXVzZSwgdGhlIHJlc3Qgb2YKLXRoZSBjbGF1c2UgaXMgc2tpcHBlZC4gIFRoZW4gaWYgaXRzIHR5cGUgbWF0Y2hlcyB0aGUgZXhjZXB0aW9uIG5hbWVkCi1hZnRlciB0aGUgXGtleXdvcmR7ZXhjZXB0fSBrZXl3b3JkLCB0aGUgZXhjZXB0IGNsYXVzZSBpcyBleGVjdXRlZCwgYW5kCi10aGVuIGV4ZWN1dGlvbiBjb250aW51ZXMgYWZ0ZXIgdGhlIFxrZXl3b3Jke3RyeX0gc3RhdGVtZW50LgotCi1caXRlbQotSWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGljaCBkb2VzIG5vdCBtYXRjaCB0aGUgZXhjZXB0aW9uIG5hbWVkIGluIHRoZQotZXhjZXB0IGNsYXVzZSwgaXQgaXMgcGFzc2VkIG9uIHRvIG91dGVyIFxrZXl3b3Jke3RyeX0gc3RhdGVtZW50czsgaWYKLW5vIGhhbmRsZXIgaXMgZm91bmQsIGl0IGlzIGFuIFxlbXBoe3VuaGFuZGxlZCBleGNlcHRpb259IGFuZCBleGVjdXRpb24KLXN0b3BzIHdpdGggYSBtZXNzYWdlIGFzIHNob3duIGFib3ZlLgotCi1cZW5ke2l0ZW1pemV9Ci0KLUEgXGtleXdvcmR7dHJ5fSBzdGF0ZW1lbnQgbWF5IGhhdmUgbW9yZSB0aGFuIG9uZSBleGNlcHQgY2xhdXNlLCB0bwotc3BlY2lmeSBoYW5kbGVycyBmb3IgZGlmZmVyZW50IGV4Y2VwdGlvbnMuICBBdCBtb3N0IG9uZSBoYW5kbGVyIHdpbGwKLWJlIGV4ZWN1dGVkLiAgSGFuZGxlcnMgb25seSBoYW5kbGUgZXhjZXB0aW9ucyB0aGF0IG9jY3VyIGluIHRoZQotY29ycmVzcG9uZGluZyB0cnkgY2xhdXNlLCBub3QgaW4gb3RoZXIgaGFuZGxlcnMgb2YgdGhlIHNhbWUKLVxrZXl3b3Jke3RyeX0gc3RhdGVtZW50LiAgQW4gZXhjZXB0IGNsYXVzZSBtYXkgbmFtZSBtdWx0aXBsZSBleGNlcHRpb25zCi1hcyBhIHBhcmVudGhlc2l6ZWQgdHVwbGUsIGZvciBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0uLi4gZXhjZXB0IChSdW50aW1lRXJyb3IsIFR5cGVFcnJvciwgTmFtZUVycm9yKToKLS4uLiAgICAgcGFzcwotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGxhc3QgZXhjZXB0IGNsYXVzZSBtYXkgb21pdCB0aGUgZXhjZXB0aW9uIG5hbWUocyksIHRvIHNlcnZlIGFzIGEKLXdpbGRjYXJkLiAgVXNlIHRoaXMgd2l0aCBleHRyZW1lIGNhdXRpb24sIHNpbmNlIGl0IGlzIGVhc3kgdG8gbWFzayBhCi1yZWFsIHByb2dyYW1taW5nIGVycm9yIGluIHRoaXMgd2F5ISAgSXQgY2FuIGFsc28gYmUgdXNlZCB0byBwcmludCBhbgotZXJyb3IgbWVzc2FnZSBhbmQgdGhlbiByZS1yYWlzZSB0aGUgZXhjZXB0aW9uIChhbGxvd2luZyBhIGNhbGxlciB0bwotaGFuZGxlIHRoZSBleGNlcHRpb24gYXMgd2VsbCk6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCBzeXMKLQotdHJ5OgotICAgIGYgPSBvcGVuKCdteWZpbGUudHh0JykKLSAgICBzID0gZi5yZWFkbGluZSgpCi0gICAgaSA9IGludChzLnN0cmlwKCkpCi1leGNlcHQgSU9FcnJvciBhcyBlOgotICAgIChlcnJubywgc3RyZXJyb3IpID0gZQotICAgIHByaW50ICJJL08gZXJyb3IoJXMpOiAlcyIgJSAoZS5lcnJubywgZS5zdHJlcnJvcikKLWV4Y2VwdCBWYWx1ZUVycm9yOgotICAgIHByaW50ICJDb3VsZCBub3QgY29udmVydCBkYXRhIHRvIGFuIGludGVnZXIuIgotZXhjZXB0OgotICAgIHByaW50ICJVbmV4cGVjdGVkIGVycm9yOiIsIHN5cy5leGNfaW5mbygpWzBdCi0gICAgcmFpc2UKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBca2V5d29yZHt0cnl9IFxsZG90c1wgXGtleXdvcmR7ZXhjZXB0fSBzdGF0ZW1lbnQgaGFzIGFuIG9wdGlvbmFsCi1cZW1waHtlbHNlIGNsYXVzZX0sIHdoaWNoLCB3aGVuIHByZXNlbnQsIG11c3QgZm9sbG93IGFsbCBleGNlcHQKLWNsYXVzZXMuICBJdCBpcyB1c2VmdWwgZm9yIGNvZGUgdGhhdCBtdXN0IGJlIGV4ZWN1dGVkIGlmIHRoZSB0cnkKLWNsYXVzZSBkb2VzIG5vdCByYWlzZSBhbiBleGNlcHRpb24uICBGb3IgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotZm9yIGFyZyBpbiBzeXMuYXJndlsxOl06Ci0gICAgdHJ5OgotICAgICAgICBmID0gb3BlbihhcmcsICdyJykKLSAgICBleGNlcHQgSU9FcnJvcjoKLSAgICAgICAgcHJpbnQgJ2Nhbm5vdCBvcGVuJywgYXJnCi0gICAgZWxzZToKLSAgICAgICAgcHJpbnQgYXJnLCAnaGFzJywgbGVuKGYucmVhZGxpbmVzKCkpLCAnbGluZXMnCi0gICAgICAgIGYuY2xvc2UoKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIHVzZSBvZiB0aGUgXGtleXdvcmR7ZWxzZX0gY2xhdXNlIGlzIGJldHRlciB0aGFuIGFkZGluZyBhZGRpdGlvbmFsCi1jb2RlIHRvIHRoZSBca2V5d29yZHt0cnl9IGNsYXVzZSBiZWNhdXNlIGl0IGF2b2lkcyBhY2NpZGVudGFsbHkKLWNhdGNoaW5nIGFuIGV4Y2VwdGlvbiB0aGF0IHdhc24ndCByYWlzZWQgYnkgdGhlIGNvZGUgYmVpbmcgcHJvdGVjdGVkCi1ieSB0aGUgXGtleXdvcmR7dHJ5fSBcbGRvdHNcIFxrZXl3b3Jke2V4Y2VwdH0gc3RhdGVtZW50LgotCi0KLVdoZW4gYW4gZXhjZXB0aW9uIG9jY3VycywgaXQgbWF5IGhhdmUgYW4gYXNzb2NpYXRlZCB2YWx1ZSwgYWxzbyBrbm93biBhcwotdGhlIGV4Y2VwdGlvbidzIFxlbXBoe2FyZ3VtZW50fS4KLVRoZSBwcmVzZW5jZSBhbmQgdHlwZSBvZiB0aGUgYXJndW1lbnQgZGVwZW5kIG9uIHRoZSBleGNlcHRpb24gdHlwZS4KLQotVGhlIGV4Y2VwdCBjbGF1c2UgbWF5IHNwZWNpZnkgYSB2YXJpYWJsZSBhZnRlciB0aGUgZXhjZXB0aW9uIG5hbWUgKG9yIHR1cGxlKS4KLVRoZSB2YXJpYWJsZSBpcyBib3VuZCB0byBhbiBleGNlcHRpb24gaW5zdGFuY2Ugd2l0aCB0aGUgYXJndW1lbnRzIHN0b3JlZAotaW4gXGNvZGV7aW5zdGFuY2UuYXJnc30uICBGb3IgY29udmVuaWVuY2UsIHRoZSBleGNlcHRpb24gaW5zdGFuY2UKLWRlZmluZXMgXG1ldGhvZHtfX2dldGl0ZW1fX30gYW5kIFxtZXRob2R7X19zdHJfX30gc28gdGhlIGFyZ3VtZW50cyBjYW4KLWJlIGFjY2Vzc2VkIG9yIHByaW50ZWQgZGlyZWN0bHkgd2l0aG91dCBoYXZpbmcgdG8gcmVmZXJlbmNlIFxjb2Rley5hcmdzfS4KLQotQnV0IHVzZSBvZiBcY29kZXsuYXJnc30gaXMgZGlzY291cmFnZWQuICBJbnN0ZWFkLCB0aGUgcHJlZmVycmVkIHVzZSBpcyB0byBwYXNzCi1hIHNpbmdsZSBhcmd1bWVudCB0byBhbiBleGNlcHRpb24gKHdoaWNoIGNhbiBiZSBhIHR1cGxlIGlmIG11bHRpcGxlIGFyZ3VtZW50cwotYXJlIG5lZWRlZCkgYW5kIGhhdmUgaXQgYm91bmQgdG8gdGhlIFxjb2Rle21lc3NhZ2V9IGF0dHJpYnV0ZS4gIE9uZSBtYXkgYWxzbwotaW5zdGFudGlhdGUgYW4gZXhjZXB0aW9uIGZpcnN0IGJlZm9yZSByYWlzaW5nIGl0IGFuZCBhZGQgYW55IGF0dHJpYnV0ZXMgdG8gaXQKLWFzIGRlc2lyZWQuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiB0cnk6Ci0uLi4gICAgcmFpc2UgRXhjZXB0aW9uKCdzcGFtJywgJ2VnZ3MnKQotLi4uIGV4Y2VwdCBFeGNlcHRpb24gYXMgaW5zdDoKLS4uLiAgICBwcmludCB0eXBlKGluc3QpICAgICAjIHRoZSBleGNlcHRpb24gaW5zdGFuY2UKLS4uLiAgICBwcmludCBpbnN0LmFyZ3MgICAgICAjIGFyZ3VtZW50cyBzdG9yZWQgaW4gLmFyZ3MKLS4uLiAgICBwcmludCBpbnN0ICAgICAgICAgICAjIF9fc3RyX18gYWxsb3dzIGFyZ3MgdG8gcHJpbnRlZCBkaXJlY3RseQotLi4uICAgIHgsIHkgPSBpbnN0ICAgICAgICAgICMgX19nZXRpdGVtX18gYWxsb3dzIGFyZ3MgdG8gYmUgdW5wYWNrZWQgZGlyZWN0bHkKLS4uLiAgICBwcmludCAneCA9JywgeAotLi4uICAgIHByaW50ICd5ID0nLCB5Ci0uLi4KLTx0eXBlICdFeGNlcHRpb24nPgotKCdzcGFtJywgJ2VnZ3MnKQotKCdzcGFtJywgJ2VnZ3MnKQoteCA9IHNwYW0KLXkgPSBlZ2dzCi1cZW5ke3ZlcmJhdGltfQotCi1JZiBhbiBleGNlcHRpb24gaGFzIGFuIGFyZ3VtZW50LCBpdCBpcyBwcmludGVkIGFzIHRoZSBsYXN0IHBhcnQKLShgZGV0YWlsJykgb2YgdGhlIG1lc3NhZ2UgZm9yIHVuaGFuZGxlZCBleGNlcHRpb25zLgotCi1FeGNlcHRpb24gaGFuZGxlcnMgZG9uJ3QganVzdCBoYW5kbGUgZXhjZXB0aW9ucyBpZiB0aGV5IG9jY3VyCi1pbW1lZGlhdGVseSBpbiB0aGUgdHJ5IGNsYXVzZSwgYnV0IGFsc28gaWYgdGhleSBvY2N1ciBpbnNpZGUgZnVuY3Rpb25zCi10aGF0IGFyZSBjYWxsZWQgKGV2ZW4gaW5kaXJlY3RseSkgaW4gdGhlIHRyeSBjbGF1c2UuCi1Gb3IgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGRlZiB0aGlzX2ZhaWxzKCk6Ci0uLi4gICAgIHggPSAxLzAKLS4uLiAKLT4+PiB0cnk6Ci0uLi4gICAgIHRoaXNfZmFpbHMoKQotLi4uIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvciBhcyBkZXRhaWw6Ci0uLi4gICAgIHByaW50ICdIYW5kbGluZyBydW4tdGltZSBlcnJvcjonLCBkZXRhaWwKLS4uLiAKLUhhbmRsaW5nIHJ1bi10aW1lIGVycm9yOiBpbnRlZ2VyIGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvCi1cZW5ke3ZlcmJhdGltfQotCi0KLVxzZWN0aW9ue1JhaXNpbmcgRXhjZXB0aW9ucyBcbGFiZWx7cmFpc2luZ319Ci0KLVRoZSBca2V5d29yZHtyYWlzZX0gc3RhdGVtZW50IGFsbG93cyB0aGUgcHJvZ3JhbW1lciB0byBmb3JjZSBhCi1zcGVjaWZpZWQgZXhjZXB0aW9uIHRvIG9jY3VyLgotRm9yIGV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiByYWlzZSBOYW1lRXJyb3IsICdIaVRoZXJlJwotVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/Ci1OYW1lRXJyb3I6IEhpVGhlcmUKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBmaXJzdCBhcmd1bWVudCB0byBca2V5d29yZHtyYWlzZX0gbmFtZXMgdGhlIGV4Y2VwdGlvbiB0byBiZQotcmFpc2VkLiAgVGhlIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIGV4Y2VwdGlvbidzCi1hcmd1bWVudC4gIEFsdGVybmF0aXZlbHksIHRoZSBhYm92ZSBjb3VsZCBiZSB3cml0dGVuIGFzCi1cY29kZXtyYWlzZSBOYW1lRXJyb3IoJ0hpVGhlcmUnKX0uICBFaXRoZXIgZm9ybSB3b3JrcyBmaW5lLCBidXQgdGhlcmUKLXNlZW1zIHRvIGJlIGEgZ3Jvd2luZyBzdHlsaXN0aWMgcHJlZmVyZW5jZSBmb3IgdGhlIGxhdHRlci4KLQotSWYgeW91IG5lZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW4gZXhjZXB0aW9uIHdhcyByYWlzZWQgYnV0IGRvbid0Ci1pbnRlbmQgdG8gaGFuZGxlIGl0LCBhIHNpbXBsZXIgZm9ybSBvZiB0aGUgXGtleXdvcmR7cmFpc2V9IHN0YXRlbWVudAotYWxsb3dzIHlvdSB0byByZS1yYWlzZSB0aGUgZXhjZXB0aW9uOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gdHJ5OgotLi4uICAgICByYWlzZSBOYW1lRXJyb3IsICdIaVRoZXJlJwotLi4uIGV4Y2VwdCBOYW1lRXJyb3I6Ci0uLi4gICAgIHByaW50ICdBbiBleGNlcHRpb24gZmxldyBieSEnCi0uLi4gICAgIHJhaXNlCi0uLi4KLUFuIGV4Y2VwdGlvbiBmbGV3IGJ5IQotVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICBGaWxlICI8c3RkaW4+IiwgbGluZSAyLCBpbiA/Ci1OYW1lRXJyb3I6IEhpVGhlcmUKLVxlbmR7dmVyYmF0aW19Ci0KLQotXHNlY3Rpb257VXNlci1kZWZpbmVkIEV4Y2VwdGlvbnMgXGxhYmVse3VzZXJFeGNlcHRpb25zfX0KLQotUHJvZ3JhbXMgbWF5IG5hbWUgdGhlaXIgb3duIGV4Y2VwdGlvbnMgYnkgY3JlYXRpbmcgYSBuZXcgZXhjZXB0aW9uCi1jbGFzcy4gIEV4Y2VwdGlvbnMgc2hvdWxkIHR5cGljYWxseSBiZSBkZXJpdmVkIGZyb20gdGhlCi1cZXhjZXB0aW9ue0V4Y2VwdGlvbn0gY2xhc3MsIGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5LiAgRm9yCi1leGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gY2xhc3MgTXlFcnJvcihFeGNlcHRpb24pOgotLi4uICAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgotLi4uICAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCi0uLi4gICAgIGRlZiBfX3N0cl9fKHNlbGYpOgotLi4uICAgICAgICAgcmV0dXJuIHJlcHIoc2VsZi52YWx1ZSkKLS4uLiAKLT4+PiB0cnk6Ci0uLi4gICAgIHJhaXNlIE15RXJyb3IoMioyKQotLi4uIGV4Y2VwdCBNeUVycm9yIGFzIGU6Ci0uLi4gICAgIHByaW50ICdNeSBleGNlcHRpb24gb2NjdXJyZWQsIHZhbHVlOicsIGUudmFsdWUKLS4uLiAKLU15IGV4Y2VwdGlvbiBvY2N1cnJlZCwgdmFsdWU6IDQKLT4+PiByYWlzZSBNeUVycm9yLCAnb29wcyEnCi1UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KLV9fbWFpbl9fLk15RXJyb3I6ICdvb3BzIScKLVxlbmR7dmVyYmF0aW19Ci0KLUluIHRoaXMgZXhhbXBsZSwgdGhlIGRlZmF1bHQgXG1ldGhvZHtfX2luaXRfX30gb2YgXGNsYXNze0V4Y2VwdGlvbn0KLWhhcyBiZWVuIG92ZXJyaWRkZW4uICBUaGUgbmV3IGJlaGF2aW9yIHNpbXBseSBjcmVhdGVzIHRoZSBcdmFye3ZhbHVlfQotYXR0cmlidXRlLiAgVGhpcyByZXBsYWNlcyB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBjcmVhdGluZyB0aGUKLVx2YXJ7YXJnc30gYXR0cmlidXRlLgotCi1FeGNlcHRpb24gY2xhc3NlcyBjYW4gYmUgZGVmaW5lZCB3aGljaCBkbyBhbnl0aGluZyBhbnkgb3RoZXIgY2xhc3MgY2FuCi1kbywgYnV0IGFyZSB1c3VhbGx5IGtlcHQgc2ltcGxlLCBvZnRlbiBvbmx5IG9mZmVyaW5nIGEgbnVtYmVyIG9mCi1hdHRyaWJ1dGVzIHRoYXQgYWxsb3cgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9yIHRvIGJlIGV4dHJhY3RlZCBieQotaGFuZGxlcnMgZm9yIHRoZSBleGNlcHRpb24uICBXaGVuIGNyZWF0aW5nIGEgbW9kdWxlIHRoYXQgY2FuIHJhaXNlCi1zZXZlcmFsIGRpc3RpbmN0IGVycm9ycywgYSBjb21tb24gcHJhY3RpY2UgaXMgdG8gY3JlYXRlIGEgYmFzZSBjbGFzcwotZm9yIGV4Y2VwdGlvbnMgZGVmaW5lZCBieSB0aGF0IG1vZHVsZSwgYW5kIHN1YmNsYXNzIHRoYXQgdG8gY3JlYXRlCi1zcGVjaWZpYyBleGNlcHRpb24gY2xhc3NlcyBmb3IgZGlmZmVyZW50IGVycm9yIGNvbmRpdGlvbnM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWNsYXNzIEVycm9yKEV4Y2VwdGlvbik6Ci0gICAgIiIiQmFzZSBjbGFzcyBmb3IgZXhjZXB0aW9ucyBpbiB0aGlzIG1vZHVsZS4iIiIKLSAgICBwYXNzCi0KLWNsYXNzIElucHV0RXJyb3IoRXJyb3IpOgotICAgICIiIkV4Y2VwdGlvbiByYWlzZWQgZm9yIGVycm9ycyBpbiB0aGUgaW5wdXQuCi0KLSAgICBBdHRyaWJ1dGVzOgotICAgICAgICBleHByZXNzaW9uIC0tIGlucHV0IGV4cHJlc3Npb24gaW4gd2hpY2ggdGhlIGVycm9yIG9jY3VycmVkCi0gICAgICAgIG1lc3NhZ2UgLS0gZXhwbGFuYXRpb24gb2YgdGhlIGVycm9yCi0gICAgIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgZXhwcmVzc2lvbiwgbWVzc2FnZSk6Ci0gICAgICAgIHNlbGYuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24KLSAgICAgICAgc2VsZi5tZXNzYWdlID0gbWVzc2FnZQotCi1jbGFzcyBUcmFuc2l0aW9uRXJyb3IoRXJyb3IpOgotICAgICIiIlJhaXNlZCB3aGVuIGFuIG9wZXJhdGlvbiBhdHRlbXB0cyBhIHN0YXRlIHRyYW5zaXRpb24gdGhhdCdzIG5vdAotICAgIGFsbG93ZWQuCi0KLSAgICBBdHRyaWJ1dGVzOgotICAgICAgICBwcmV2aW91cyAtLSBzdGF0ZSBhdCBiZWdpbm5pbmcgb2YgdHJhbnNpdGlvbgotICAgICAgICBuZXh0IC0tIGF0dGVtcHRlZCBuZXcgc3RhdGUKLSAgICAgICAgbWVzc2FnZSAtLSBleHBsYW5hdGlvbiBvZiB3aHkgdGhlIHNwZWNpZmljIHRyYW5zaXRpb24gaXMgbm90IGFsbG93ZWQKLSAgICAiIiIKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcmV2aW91cywgbmV4dCwgbWVzc2FnZSk6Ci0gICAgICAgIHNlbGYucHJldmlvdXMgPSBwcmV2aW91cwotICAgICAgICBzZWxmLm5leHQgPSBuZXh0Ci0gICAgICAgIHNlbGYubWVzc2FnZSA9IG1lc3NhZ2UKLVxlbmR7dmVyYmF0aW19Ci0KLU1vc3QgZXhjZXB0aW9ucyBhcmUgZGVmaW5lZCB3aXRoIG5hbWVzIHRoYXQgZW5kIGluIGBgRXJyb3IsJycgc2ltaWxhcgotdG8gdGhlIG5hbWluZyBvZiB0aGUgc3RhbmRhcmQgZXhjZXB0aW9ucy4KLQotTWFueSBzdGFuZGFyZCBtb2R1bGVzIGRlZmluZSB0aGVpciBvd24gZXhjZXB0aW9ucyB0byByZXBvcnQgZXJyb3JzCi10aGF0IG1heSBvY2N1ciBpbiBmdW5jdGlvbnMgdGhleSBkZWZpbmUuICBNb3JlIGluZm9ybWF0aW9uIG9uIGNsYXNzZXMKLWlzIHByZXNlbnRlZCBpbiBjaGFwdGVyIFxyZWZ7Y2xhc3Nlc30sIGBgQ2xhc3Nlcy4nJwotCi0KLVxzZWN0aW9ue0RlZmluaW5nIENsZWFuLXVwIEFjdGlvbnMgXGxhYmVse2NsZWFudXB9fQotCi1UaGUgXGtleXdvcmR7dHJ5fSBzdGF0ZW1lbnQgaGFzIGFub3RoZXIgb3B0aW9uYWwgY2xhdXNlIHdoaWNoIGlzCi1pbnRlbmRlZCB0byBkZWZpbmUgY2xlYW4tdXAgYWN0aW9ucyB0aGF0IG11c3QgYmUgZXhlY3V0ZWQgdW5kZXIgYWxsCi1jaXJjdW1zdGFuY2VzLiAgRm9yIGV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiB0cnk6Ci0uLi4gICAgIHJhaXNlIEtleWJvYXJkSW50ZXJydXB0Ci0uLi4gZmluYWxseToKLS4uLiAgICAgcHJpbnQgJ0dvb2RieWUsIHdvcmxkIScKLS4uLiAKLUdvb2RieWUsIHdvcmxkIQotVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICBGaWxlICI8c3RkaW4+IiwgbGluZSAyLCBpbiA/Ci1LZXlib2FyZEludGVycnVwdAotXGVuZHt2ZXJiYXRpbX0KLQotQSBcZW1waHtmaW5hbGx5IGNsYXVzZX0gaXMgYWx3YXlzIGV4ZWN1dGVkIGJlZm9yZSBsZWF2aW5nIHRoZQotXGtleXdvcmR7dHJ5fSBzdGF0ZW1lbnQsIHdoZXRoZXIgYW4gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZCBvciBub3QuCi1XaGVuIGFuIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQgaW4gdGhlIFxrZXl3b3Jke3RyeX0gY2xhdXNlIGFuZCBoYXMgbm90Ci1iZWVuIGhhbmRsZWQgYnkgYW4gXGtleXdvcmR7ZXhjZXB0fSBjbGF1c2UgKG9yIGl0IGhhcyBvY2N1cnJlZCBpbiBhCi1ca2V5d29yZHtleGNlcHR9IG9yIFxrZXl3b3Jke2Vsc2V9IGNsYXVzZSksIGl0IGlzIHJlLXJhaXNlZCBhZnRlciB0aGUKLVxrZXl3b3Jke2ZpbmFsbHl9IGNsYXVzZSBoYXMgYmVlbiBleGVjdXRlZC4gIFRoZSBca2V5d29yZHtmaW5hbGx5fSBjbGF1c2UKLWlzIGFsc28gZXhlY3V0ZWQgYGBvbiB0aGUgd2F5IG91dCcnIHdoZW4gYW55IG90aGVyIGNsYXVzZSBvZiB0aGUKLVxrZXl3b3Jke3RyeX0gc3RhdGVtZW50IGlzIGxlZnQgdmlhIGEgXGtleXdvcmR7YnJlYWt9LCBca2V5d29yZHtjb250aW51ZX0KLW9yIFxrZXl3b3Jke3JldHVybn0gc3RhdGVtZW50LiAgQSBtb3JlIGNvbXBsaWNhdGVkIGV4YW1wbGUgKGhhdmluZwotXGtleXdvcmR7ZXhjZXB0fSBhbmQgXGtleXdvcmR7ZmluYWxseX0gY2xhdXNlcyBpbiB0aGUgc2FtZSBca2V5d29yZHt0cnl9Ci1zdGF0ZW1lbnQgd29ya3MgYXMgb2YgUHl0aG9uIDIuNSk6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBkZWYgZGl2aWRlKHgsIHkpOgotLi4uICAgICB0cnk6Ci0uLi4gICAgICAgICByZXN1bHQgPSB4IC8geQotLi4uICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6Ci0uLi4gICAgICAgICBwcmludCAiZGl2aXNpb24gYnkgemVybyEiCi0uLi4gICAgIGVsc2U6Ci0uLi4gICAgICAgICBwcmludCAicmVzdWx0IGlzIiwgcmVzdWx0Ci0uLi4gICAgIGZpbmFsbHk6Ci0uLi4gICAgICAgICBwcmludCAiZXhlY3V0aW5nIGZpbmFsbHkgY2xhdXNlIgotLi4uCi0+Pj4gZGl2aWRlKDIsIDEpCi1yZXN1bHQgaXMgMgotZXhlY3V0aW5nIGZpbmFsbHkgY2xhdXNlCi0+Pj4gZGl2aWRlKDIsIDApCi1kaXZpc2lvbiBieSB6ZXJvIQotZXhlY3V0aW5nIGZpbmFsbHkgY2xhdXNlCi0+Pj4gZGl2aWRlKCIyIiwgIjEiKQotZXhlY3V0aW5nIGZpbmFsbHkgY2xhdXNlCi1UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KLSAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMywgaW4gZGl2aWRlCi1UeXBlRXJyb3I6IHVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgLzogJ3N0cicgYW5kICdzdHInCi1cZW5ke3ZlcmJhdGltfQotCi1BcyB5b3UgY2FuIHNlZSwgdGhlIFxrZXl3b3Jke2ZpbmFsbHl9IGNsYXVzZSBpcyBleGVjdXRlZCBpbiBhbnkKLWV2ZW50LiAgVGhlIFxleGNlcHRpb257VHlwZUVycm9yfSByYWlzZWQgYnkgZGl2aWRpbmcgdHdvIHN0cmluZ3MKLWlzIG5vdCBoYW5kbGVkIGJ5IHRoZSBca2V5d29yZHtleGNlcHR9IGNsYXVzZSBhbmQgdGhlcmVmb3JlCi1yZS1yYWlzZWQgYWZ0ZXIgdGhlIFxrZXl3b3Jke2ZpbmFsbHl9IGNsYXVzZXMgaGFzIGJlZW4gZXhlY3V0ZWQuCi0KLUluIHJlYWwgd29ybGQgYXBwbGljYXRpb25zLCB0aGUgXGtleXdvcmR7ZmluYWxseX0gY2xhdXNlIGlzIHVzZWZ1bAotZm9yIHJlbGVhc2luZyBleHRlcm5hbCByZXNvdXJjZXMgKHN1Y2ggYXMgZmlsZXMgb3IgbmV0d29yayBjb25uZWN0aW9ucyksCi1yZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHVzZSBvZiB0aGUgcmVzb3VyY2Ugd2FzIHN1Y2Nlc3NmdWwuCi0KLQotXHNlY3Rpb257UHJlZGVmaW5lZCBDbGVhbi11cCBBY3Rpb25zIFxsYWJlbHtjbGVhbnVwLXdpdGh9fQotCi1Tb21lIG9iamVjdHMgZGVmaW5lIHN0YW5kYXJkIGNsZWFuLXVwIGFjdGlvbnMgdG8gYmUgdW5kZXJ0YWtlbiB3aGVuCi10aGUgb2JqZWN0IGlzIG5vIGxvbmdlciBuZWVkZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBvciBub3QgdGhlCi1vcGVyYXRpb24gdXNpbmcgdGhlIG9iamVjdCBzdWNjZWVkZWQgb3IgZmFpbGVkLgotTG9vayBhdCB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIHdoaWNoIHRyaWVzIHRvIG9wZW4gYSBmaWxlIGFuZCBwcmludAotaXRzIGNvbnRlbnRzIHRvIHRoZSBzY3JlZW4uCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLWZvciBsaW5lIGluIG9wZW4oIm15ZmlsZS50eHQiKToKLSAgICBwcmludCBsaW5lCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgcHJvYmxlbSB3aXRoIHRoaXMgY29kZSBpcyB0aGF0IGl0IGxlYXZlcyB0aGUgZmlsZSBvcGVuIGZvciBhbgotaW5kZXRlcm1pbmF0ZSBhbW91bnQgb2YgdGltZSBhZnRlciB0aGUgY29kZSBoYXMgZmluaXNoZWQgZXhlY3V0aW5nLgotVGhpcyBpcyBub3QgYW4gaXNzdWUgaW4gc2ltcGxlIHNjcmlwdHMsIGJ1dCBjYW4gYmUgYSBwcm9ibGVtIGZvcgotbGFyZ2VyIGFwcGxpY2F0aW9ucy4gVGhlIFxrZXl3b3Jke3dpdGh9IHN0YXRlbWVudCBhbGxvd3MKLW9iamVjdHMgbGlrZSBmaWxlcyB0byBiZSB1c2VkIGluIGEgd2F5IHRoYXQgZW5zdXJlcyB0aGV5IGFyZQotYWx3YXlzIGNsZWFuZWQgdXAgcHJvbXB0bHkgYW5kIGNvcnJlY3RseS4KLQotXGJlZ2lue3ZlcmJhdGltfQotd2l0aCBvcGVuKCJteWZpbGUudHh0IikgYXMgZjoKLSAgICBmb3IgbGluZSBpbiBmOgotICAgICAgICBwcmludCBsaW5lCi1cZW5ke3ZlcmJhdGltfQotCi1BZnRlciB0aGUgc3RhdGVtZW50IGlzIGV4ZWN1dGVkLCB0aGUgZmlsZSBcdmFye2Z9IGlzIGFsd2F5cyBjbG9zZWQsCi1ldmVuIGlmIGEgcHJvYmxlbSB3YXMgZW5jb3VudGVyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgbGluZXMuIE90aGVyCi1vYmplY3RzIHdoaWNoIHByb3ZpZGUgcHJlZGVmaW5lZCBjbGVhbi11cCBhY3Rpb25zIHdpbGwgaW5kaWNhdGUKLXRoaXMgaW4gdGhlaXIgZG9jdW1lbnRhdGlvbi4KLQotCi1cY2hhcHRlcntDbGFzc2VzIFxsYWJlbHtjbGFzc2VzfX0KLQotUHl0aG9uJ3MgY2xhc3MgbWVjaGFuaXNtIGFkZHMgY2xhc3NlcyB0byB0aGUgbGFuZ3VhZ2Ugd2l0aCBhIG1pbmltdW0KLW9mIG5ldyBzeW50YXggYW5kIHNlbWFudGljcy4gIEl0IGlzIGEgbWl4dHVyZSBvZiB0aGUgY2xhc3MgbWVjaGFuaXNtcwotZm91bmQgaW4gXENwcHt9IGFuZCBNb2R1bGEtMy4gIEFzIGlzIHRydWUgZm9yIG1vZHVsZXMsIGNsYXNzZXMgaW4gUHl0aG9uCi1kbyBub3QgcHV0IGFuIGFic29sdXRlIGJhcnJpZXIgYmV0d2VlbiBkZWZpbml0aW9uIGFuZCB1c2VyLCBidXQgcmF0aGVyCi1yZWx5IG9uIHRoZSBwb2xpdGVuZXNzIG9mIHRoZSB1c2VyIG5vdCB0byBgYGJyZWFrIGludG8gdGhlCi1kZWZpbml0aW9uLicnICBUaGUgbW9zdCBpbXBvcnRhbnQgZmVhdHVyZXMgb2YgY2xhc3NlcyBhcmUgcmV0YWluZWQKLXdpdGggZnVsbCBwb3dlciwgaG93ZXZlcjogdGhlIGNsYXNzIGluaGVyaXRhbmNlIG1lY2hhbmlzbSBhbGxvd3MKLW11bHRpcGxlIGJhc2UgY2xhc3NlcywgYSBkZXJpdmVkIGNsYXNzIGNhbiBvdmVycmlkZSBhbnkgbWV0aG9kcyBvZiBpdHMKLWJhc2UgY2xhc3Mgb3IgY2xhc3NlcywgYW5kIGEgbWV0aG9kIGNhbiBjYWxsIHRoZSBtZXRob2Qgb2YgYSBiYXNlIGNsYXNzIHdpdGggdGhlCi1zYW1lIG5hbWUuICBPYmplY3RzIGNhbiBjb250YWluIGFuIGFyYml0cmFyeSBhbW91bnQgb2YgcHJpdmF0ZSBkYXRhLgotCi1JbiBcQ3Bwe30gdGVybWlub2xvZ3ksIGFsbCBjbGFzcyBtZW1iZXJzIChpbmNsdWRpbmcgdGhlIGRhdGEgbWVtYmVycykgYXJlCi1cZW1waHtwdWJsaWN9LCBhbmQgYWxsIG1lbWJlciBmdW5jdGlvbnMgYXJlIFxlbXBoe3ZpcnR1YWx9LiAgVGhlcmUgYXJlCi1ubyBzcGVjaWFsIGNvbnN0cnVjdG9ycyBvciBkZXN0cnVjdG9ycy4gIEFzIGluIE1vZHVsYS0zLCB0aGVyZSBhcmUgbm8KLXNob3J0aGFuZHMgZm9yIHJlZmVyZW5jaW5nIHRoZSBvYmplY3QncyBtZW1iZXJzIGZyb20gaXRzIG1ldGhvZHM6IHRoZQotbWV0aG9kIGZ1bmN0aW9uIGlzIGRlY2xhcmVkIHdpdGggYW4gZXhwbGljaXQgZmlyc3QgYXJndW1lbnQKLXJlcHJlc2VudGluZyB0aGUgb2JqZWN0LCB3aGljaCBpcyBwcm92aWRlZCBpbXBsaWNpdGx5IGJ5IHRoZSBjYWxsLiAgQXMKLWluIFNtYWxsdGFsaywgY2xhc3NlcyB0aGVtc2VsdmVzIGFyZSBvYmplY3RzLCBhbGJlaXQgaW4gdGhlIHdpZGVyCi1zZW5zZSBvZiB0aGUgd29yZDogaW4gUHl0aG9uLCBhbGwgZGF0YSB0eXBlcyBhcmUgb2JqZWN0cy4gIFRoaXMKLXByb3ZpZGVzIHNlbWFudGljcyBmb3IgaW1wb3J0aW5nIGFuZCByZW5hbWluZy4gIFVubGlrZSAKLVxDcHB7fSBhbmQgTW9kdWxhLTMsIGJ1aWx0LWluIHR5cGVzIGNhbiBiZSB1c2VkIGFzIGJhc2UgY2xhc3NlcyBmb3IKLWV4dGVuc2lvbiBieSB0aGUgdXNlci4gIEFsc28sIGxpa2UgaW4gXENwcHt9IGJ1dCB1bmxpa2UgaW4gTW9kdWxhLTMsIG1vc3QKLWJ1aWx0LWluIG9wZXJhdG9ycyB3aXRoIHNwZWNpYWwgc3ludGF4IChhcml0aG1ldGljIG9wZXJhdG9ycywKLXN1YnNjcmlwdGluZyBldGMuKSBjYW4gYmUgcmVkZWZpbmVkIGZvciBjbGFzcyBpbnN0YW5jZXMuCi0KLVxzZWN0aW9ue0EgV29yZCBBYm91dCBUZXJtaW5vbG9neSBcbGFiZWx7dGVybWlub2xvZ3l9fQotCi1MYWNraW5nIHVuaXZlcnNhbGx5IGFjY2VwdGVkIHRlcm1pbm9sb2d5IHRvIHRhbGsgYWJvdXQgY2xhc3NlcywgSSB3aWxsCi1tYWtlIG9jY2FzaW9uYWwgdXNlIG9mIFNtYWxsdGFsayBhbmQgXENwcHt9IHRlcm1zLiAgKEkgd291bGQgdXNlIE1vZHVsYS0zCi10ZXJtcywgc2luY2UgaXRzIG9iamVjdC1vcmllbnRlZCBzZW1hbnRpY3MgYXJlIGNsb3NlciB0byB0aG9zZSBvZgotUHl0aG9uIHRoYW4gXENwcCwgYnV0IEkgZXhwZWN0IHRoYXQgZmV3IHJlYWRlcnMgaGF2ZSBoZWFyZCBvZiBpdC4pCi0KLU9iamVjdHMgaGF2ZSBpbmRpdmlkdWFsaXR5LCBhbmQgbXVsdGlwbGUgbmFtZXMgKGluIG11bHRpcGxlIHNjb3BlcykKLWNhbiBiZSBib3VuZCB0byB0aGUgc2FtZSBvYmplY3QuICBUaGlzIGlzIGtub3duIGFzIGFsaWFzaW5nIGluIG90aGVyCi1sYW5ndWFnZXMuICBUaGlzIGlzIHVzdWFsbHkgbm90IGFwcHJlY2lhdGVkIG9uIGEgZmlyc3QgZ2xhbmNlIGF0Ci1QeXRob24sIGFuZCBjYW4gYmUgc2FmZWx5IGlnbm9yZWQgd2hlbiBkZWFsaW5nIHdpdGggaW1tdXRhYmxlIGJhc2ljCi10eXBlcyAobnVtYmVycywgc3RyaW5ncywgdHVwbGVzKS4gIEhvd2V2ZXIsIGFsaWFzaW5nIGhhcyBhbgotKGludGVuZGVkISkgZWZmZWN0IG9uIHRoZSBzZW1hbnRpY3Mgb2YgUHl0aG9uIGNvZGUgaW52b2x2aW5nIG11dGFibGUKLW9iamVjdHMgc3VjaCBhcyBsaXN0cywgZGljdGlvbmFyaWVzLCBhbmQgbW9zdCB0eXBlcyByZXByZXNlbnRpbmcKLWVudGl0aWVzIG91dHNpZGUgdGhlIHByb2dyYW0gKGZpbGVzLCB3aW5kb3dzLCBldGMuKS4gIFRoaXMgaXMgdXN1YWxseQotdXNlZCB0byB0aGUgYmVuZWZpdCBvZiB0aGUgcHJvZ3JhbSwgc2luY2UgYWxpYXNlcyBiZWhhdmUgbGlrZSBwb2ludGVycwotaW4gc29tZSByZXNwZWN0cy4gIEZvciBleGFtcGxlLCBwYXNzaW5nIGFuIG9iamVjdCBpcyBjaGVhcCBzaW5jZSBvbmx5Ci1hIHBvaW50ZXIgaXMgcGFzc2VkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbjsgYW5kIGlmIGEgZnVuY3Rpb24gbW9kaWZpZXMKLWFuIG9iamVjdCBwYXNzZWQgYXMgYW4gYXJndW1lbnQsIHRoZSBjYWxsZXIgd2lsbCBzZWUgdGhlIGNoYW5nZSAtLS0gdGhpcwotZWxpbWluYXRlcyB0aGUgbmVlZCBmb3IgdHdvIGRpZmZlcmVudCBhcmd1bWVudCBwYXNzaW5nIG1lY2hhbmlzbXMgYXMgaW4KLVBhc2NhbC4KLQotCi1cc2VjdGlvbntQeXRob24gU2NvcGVzIGFuZCBOYW1lIFNwYWNlcyBcbGFiZWx7c2NvcGVzfX0KLQotQmVmb3JlIGludHJvZHVjaW5nIGNsYXNzZXMsIEkgZmlyc3QgaGF2ZSB0byB0ZWxsIHlvdSBzb21ldGhpbmcgYWJvdXQKLVB5dGhvbidzIHNjb3BlIHJ1bGVzLiAgQ2xhc3MgZGVmaW5pdGlvbnMgcGxheSBzb21lIG5lYXQgdHJpY2tzIHdpdGgKLW5hbWVzcGFjZXMsIGFuZCB5b3UgbmVlZCB0byBrbm93IGhvdyBzY29wZXMgYW5kIG5hbWVzcGFjZXMgd29yayB0bwotZnVsbHkgdW5kZXJzdGFuZCB3aGF0J3MgZ29pbmcgb24uICBJbmNpZGVudGFsbHksIGtub3dsZWRnZSBhYm91dCB0aGlzCi1zdWJqZWN0IGlzIHVzZWZ1bCBmb3IgYW55IGFkdmFuY2VkIFB5dGhvbiBwcm9ncmFtbWVyLgotCi1MZXQncyBiZWdpbiB3aXRoIHNvbWUgZGVmaW5pdGlvbnMuCi0KLUEgXGVtcGh7bmFtZXNwYWNlfSBpcyBhIG1hcHBpbmcgZnJvbSBuYW1lcyB0byBvYmplY3RzLiAgTW9zdAotbmFtZXNwYWNlcyBhcmUgY3VycmVudGx5IGltcGxlbWVudGVkIGFzIFB5dGhvbiBkaWN0aW9uYXJpZXMsIGJ1dAotdGhhdCdzIG5vcm1hbGx5IG5vdCBub3RpY2VhYmxlIGluIGFueSB3YXkgKGV4Y2VwdCBmb3IgcGVyZm9ybWFuY2UpLAotYW5kIGl0IG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4gIEV4YW1wbGVzIG9mIG5hbWVzcGFjZXMgYXJlOiB0aGUgc2V0Ci1vZiBidWlsdC1pbiBuYW1lcyAoZnVuY3Rpb25zIHN1Y2ggYXMgXGZ1bmN0aW9ue2FicygpfSwgYW5kIGJ1aWx0LWluCi1leGNlcHRpb24gbmFtZXMpOyB0aGUgZ2xvYmFsIG5hbWVzIGluIGEgbW9kdWxlOyBhbmQgdGhlIGxvY2FsIG5hbWVzIGluCi1hIGZ1bmN0aW9uIGludm9jYXRpb24uICBJbiBhIHNlbnNlIHRoZSBzZXQgb2YgYXR0cmlidXRlcyBvZiBhbiBvYmplY3QKLWFsc28gZm9ybSBhIG5hbWVzcGFjZS4gIFRoZSBpbXBvcnRhbnQgdGhpbmcgdG8ga25vdyBhYm91dCBuYW1lc3BhY2VzCi1pcyB0aGF0IHRoZXJlIGlzIGFic29sdXRlbHkgbm8gcmVsYXRpb24gYmV0d2VlbiBuYW1lcyBpbiBkaWZmZXJlbnQKLW5hbWVzcGFjZXM7IGZvciBpbnN0YW5jZSwgdHdvIGRpZmZlcmVudCBtb2R1bGVzIG1heSBib3RoIGRlZmluZSBhCi1mdW5jdGlvbiBgYG1heGltaXplJycgd2l0aG91dCBjb25mdXNpb24gLS0tIHVzZXJzIG9mIHRoZSBtb2R1bGVzIG11c3QKLXByZWZpeCBpdCB3aXRoIHRoZSBtb2R1bGUgbmFtZS4KLQotQnkgdGhlIHdheSwgSSB1c2UgdGhlIHdvcmQgXGVtcGh7YXR0cmlidXRlfSBmb3IgYW55IG5hbWUgZm9sbG93aW5nIGEKLWRvdCAtLS0gZm9yIGV4YW1wbGUsIGluIHRoZSBleHByZXNzaW9uIFxjb2Rle3oucmVhbH0sIFxjb2Rle3JlYWx9IGlzCi1hbiBhdHRyaWJ1dGUgb2YgdGhlIG9iamVjdCBcY29kZXt6fS4gIFN0cmljdGx5IHNwZWFraW5nLCByZWZlcmVuY2VzIHRvCi1uYW1lcyBpbiBtb2R1bGVzIGFyZSBhdHRyaWJ1dGUgcmVmZXJlbmNlczogaW4gdGhlIGV4cHJlc3Npb24KLVxjb2Rle21vZG5hbWUuZnVuY25hbWV9LCBcY29kZXttb2RuYW1lfSBpcyBhIG1vZHVsZSBvYmplY3QgYW5kCi1cY29kZXtmdW5jbmFtZX0gaXMgYW4gYXR0cmlidXRlIG9mIGl0LiAgSW4gdGhpcyBjYXNlIHRoZXJlIGhhcHBlbnMgdG8KLWJlIGEgc3RyYWlnaHRmb3J3YXJkIG1hcHBpbmcgYmV0d2VlbiB0aGUgbW9kdWxlJ3MgYXR0cmlidXRlcyBhbmQgdGhlCi1nbG9iYWwgbmFtZXMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlOiB0aGV5IHNoYXJlIHRoZSBzYW1lIG5hbWVzcGFjZSEKLVxmb290bm90ZXsKLSAgICAgICAgRXhjZXB0IGZvciBvbmUgdGhpbmcuICBNb2R1bGUgb2JqZWN0cyBoYXZlIGEgc2VjcmV0IHJlYWQtb25seQotICAgICAgICBhdHRyaWJ1dGUgY2FsbGVkIFxtZW1iZXJ7X19kaWN0X199IHdoaWNoIHJldHVybnMgdGhlIGRpY3Rpb25hcnkKLSAgICAgICAgdXNlZCB0byBpbXBsZW1lbnQgdGhlIG1vZHVsZSdzIG5hbWVzcGFjZTsgdGhlIG5hbWUKLSAgICAgICAgXG1lbWJlcntfX2RpY3RfX30gaXMgYW4gYXR0cmlidXRlIGJ1dCBub3QgYSBnbG9iYWwgbmFtZS4KLSAgICAgICAgT2J2aW91c2x5LCB1c2luZyB0aGlzIHZpb2xhdGVzIHRoZSBhYnN0cmFjdGlvbiBvZiBuYW1lc3BhY2UKLSAgICAgICAgaW1wbGVtZW50YXRpb24sIGFuZCBzaG91bGQgYmUgcmVzdHJpY3RlZCB0byB0aGluZ3MgbGlrZQotICAgICAgICBwb3N0LW1vcnRlbSBkZWJ1Z2dlcnMuCi19Ci0KLUF0dHJpYnV0ZXMgbWF5IGJlIHJlYWQtb25seSBvciB3cml0YWJsZS4gIEluIHRoZSBsYXR0ZXIgY2FzZSwKLWFzc2lnbm1lbnQgdG8gYXR0cmlidXRlcyBpcyBwb3NzaWJsZS4gIE1vZHVsZSBhdHRyaWJ1dGVzIGFyZSB3cml0YWJsZToKLXlvdSBjYW4gd3JpdGUgXHNhbXB7bW9kbmFtZS50aGVfYW5zd2VyID0gNDJ9LiAgV3JpdGFibGUgYXR0cmlidXRlcyBtYXkKLWFsc28gYmUgZGVsZXRlZCB3aXRoIHRoZSBca2V5d29yZHtkZWx9IHN0YXRlbWVudC4gIEZvciBleGFtcGxlLAotXHNhbXB7ZGVsIG1vZG5hbWUudGhlX2Fuc3dlcn0gd2lsbCByZW1vdmUgdGhlIGF0dHJpYnV0ZQotXG1lbWJlcnt0aGVfYW5zd2VyfSBmcm9tIHRoZSBvYmplY3QgbmFtZWQgYnkgXGNvZGV7bW9kbmFtZX0uCi0KLU5hbWUgc3BhY2VzIGFyZSBjcmVhdGVkIGF0IGRpZmZlcmVudCBtb21lbnRzIGFuZCBoYXZlIGRpZmZlcmVudAotbGlmZXRpbWVzLiAgVGhlIG5hbWVzcGFjZSBjb250YWluaW5nIHRoZSBidWlsdC1pbiBuYW1lcyBpcyBjcmVhdGVkCi13aGVuIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgc3RhcnRzIHVwLCBhbmQgaXMgbmV2ZXIgZGVsZXRlZC4gIFRoZQotZ2xvYmFsIG5hbWVzcGFjZSBmb3IgYSBtb2R1bGUgaXMgY3JlYXRlZCB3aGVuIHRoZSBtb2R1bGUgZGVmaW5pdGlvbgotaXMgcmVhZCBpbjsgbm9ybWFsbHksIG1vZHVsZSBuYW1lc3BhY2VzIGFsc28gbGFzdCB1bnRpbCB0aGUKLWludGVycHJldGVyIHF1aXRzLiAgVGhlIHN0YXRlbWVudHMgZXhlY3V0ZWQgYnkgdGhlIHRvcC1sZXZlbAotaW52b2NhdGlvbiBvZiB0aGUgaW50ZXJwcmV0ZXIsIGVpdGhlciByZWFkIGZyb20gYSBzY3JpcHQgZmlsZSBvcgotaW50ZXJhY3RpdmVseSwgYXJlIGNvbnNpZGVyZWQgcGFydCBvZiBhIG1vZHVsZSBjYWxsZWQKLVxtb2R1bGV7X19tYWluX199LCBzbyB0aGV5IGhhdmUgdGhlaXIgb3duIGdsb2JhbCBuYW1lc3BhY2UuICAoVGhlCi1idWlsdC1pbiBuYW1lcyBhY3R1YWxseSBhbHNvIGxpdmUgaW4gYSBtb2R1bGU7IHRoaXMgaXMgY2FsbGVkCi1cbW9kdWxle19fYnVpbHRpbl9ffS4pCi0KLVRoZSBsb2NhbCBuYW1lc3BhY2UgZm9yIGEgZnVuY3Rpb24gaXMgY3JlYXRlZCB3aGVuIHRoZSBmdW5jdGlvbiBpcwotY2FsbGVkLCBhbmQgZGVsZXRlZCB3aGVuIHRoZSBmdW5jdGlvbiByZXR1cm5zIG9yIHJhaXNlcyBhbiBleGNlcHRpb24KLXRoYXQgaXMgbm90IGhhbmRsZWQgd2l0aGluIHRoZSBmdW5jdGlvbi4gIChBY3R1YWxseSwgZm9yZ2V0dGluZyB3b3VsZAotYmUgYSBiZXR0ZXIgd2F5IHRvIGRlc2NyaWJlIHdoYXQgYWN0dWFsbHkgaGFwcGVucy4pICBPZiBjb3Vyc2UsCi1yZWN1cnNpdmUgaW52b2NhdGlvbnMgZWFjaCBoYXZlIHRoZWlyIG93biBsb2NhbCBuYW1lc3BhY2UuCi0KLUEgXGVtcGh7c2NvcGV9IGlzIGEgdGV4dHVhbCByZWdpb24gb2YgYSBQeXRob24gcHJvZ3JhbSB3aGVyZSBhCi1uYW1lc3BhY2UgaXMgZGlyZWN0bHkgYWNjZXNzaWJsZS4gIGBgRGlyZWN0bHkgYWNjZXNzaWJsZScnIGhlcmUgbWVhbnMKLXRoYXQgYW4gdW5xdWFsaWZpZWQgcmVmZXJlbmNlIHRvIGEgbmFtZSBhdHRlbXB0cyB0byBmaW5kIHRoZSBuYW1lIGluCi10aGUgbmFtZXNwYWNlLgotCi1BbHRob3VnaCBzY29wZXMgYXJlIGRldGVybWluZWQgc3RhdGljYWxseSwgdGhleSBhcmUgdXNlZCBkeW5hbWljYWxseS4KLUF0IGFueSB0aW1lIGR1cmluZyBleGVjdXRpb24sIHRoZXJlIGFyZSBhdCBsZWFzdCB0aHJlZSBuZXN0ZWQgc2NvcGVzIHdob3NlCi1uYW1lc3BhY2VzIGFyZSBkaXJlY3RseSBhY2Nlc3NpYmxlOiB0aGUgaW5uZXJtb3N0IHNjb3BlLCB3aGljaCBpcyBzZWFyY2hlZAotZmlyc3QsIGNvbnRhaW5zIHRoZSBsb2NhbCBuYW1lczsgdGhlIG5hbWVzcGFjZXMgb2YgYW55IGVuY2xvc2luZwotZnVuY3Rpb25zLCB3aGljaCBhcmUgc2VhcmNoZWQgc3RhcnRpbmcgd2l0aCB0aGUgbmVhcmVzdCBlbmNsb3Npbmcgc2NvcGU7Ci10aGUgbWlkZGxlIHNjb3BlLCBzZWFyY2hlZCBuZXh0LCBjb250YWlucyB0aGUgY3VycmVudCBtb2R1bGUncyBnbG9iYWwgbmFtZXM7Ci1hbmQgdGhlIG91dGVybW9zdCBzY29wZSAoc2VhcmNoZWQgbGFzdCkgaXMgdGhlIG5hbWVzcGFjZSBjb250YWluaW5nIGJ1aWx0LWluCi1uYW1lcy4KLQotSWYgYSBuYW1lIGlzIGRlY2xhcmVkIGdsb2JhbCwgdGhlbiBhbGwgcmVmZXJlbmNlcyBhbmQgYXNzaWdubWVudHMgZ28KLWRpcmVjdGx5IHRvIHRoZSBtaWRkbGUgc2NvcGUgY29udGFpbmluZyB0aGUgbW9kdWxlJ3MgZ2xvYmFsIG5hbWVzLgotT3RoZXJ3aXNlLCBhbGwgdmFyaWFibGVzIGZvdW5kIG91dHNpZGUgb2YgdGhlIGlubmVybW9zdCBzY29wZSBhcmUgcmVhZC1vbmx5Ci0oYW4gYXR0ZW1wdCB0byB3cml0ZSB0byBzdWNoIGEgdmFyaWFibGUgd2lsbCBzaW1wbHkgY3JlYXRlIGEgXGVtcGh7bmV3fQotbG9jYWwgdmFyaWFibGUgaW4gdGhlIGlubmVybW9zdCBzY29wZSwgbGVhdmluZyB0aGUgaWRlbnRpY2FsbHkgbmFtZWQKLW91dGVyIHZhcmlhYmxlIHVuY2hhbmdlZCkuCi0KLVVzdWFsbHksIHRoZSBsb2NhbCBzY29wZSByZWZlcmVuY2VzIHRoZSBsb2NhbCBuYW1lcyBvZiB0aGUgKHRleHR1YWxseSkKLWN1cnJlbnQgZnVuY3Rpb24uICBPdXRzaWRlIGZ1bmN0aW9ucywgdGhlIGxvY2FsIHNjb3BlIHJlZmVyZW5jZXMKLXRoZSBzYW1lIG5hbWVzcGFjZSBhcyB0aGUgZ2xvYmFsIHNjb3BlOiB0aGUgbW9kdWxlJ3MgbmFtZXNwYWNlLgotQ2xhc3MgZGVmaW5pdGlvbnMgcGxhY2UgeWV0IGFub3RoZXIgbmFtZXNwYWNlIGluIHRoZSBsb2NhbCBzY29wZS4KLQotSXQgaXMgaW1wb3J0YW50IHRvIHJlYWxpemUgdGhhdCBzY29wZXMgYXJlIGRldGVybWluZWQgdGV4dHVhbGx5OiB0aGUKLWdsb2JhbCBzY29wZSBvZiBhIGZ1bmN0aW9uIGRlZmluZWQgaW4gYSBtb2R1bGUgaXMgdGhhdCBtb2R1bGUncwotbmFtZXNwYWNlLCBubyBtYXR0ZXIgZnJvbSB3aGVyZSBvciBieSB3aGF0IGFsaWFzIHRoZSBmdW5jdGlvbiBpcwotY2FsbGVkLiAgT24gdGhlIG90aGVyIGhhbmQsIHRoZSBhY3R1YWwgc2VhcmNoIGZvciBuYW1lcyBpcyBkb25lCi1keW5hbWljYWxseSwgYXQgcnVuIHRpbWUgLS0tIGhvd2V2ZXIsIHRoZSBsYW5ndWFnZSBkZWZpbml0aW9uIGlzCi1ldm9sdmluZyB0b3dhcmRzIHN0YXRpYyBuYW1lIHJlc29sdXRpb24sIGF0IGBgY29tcGlsZScnIHRpbWUsIHNvIGRvbid0Ci1yZWx5IG9uIGR5bmFtaWMgbmFtZSByZXNvbHV0aW9uISAgKEluIGZhY3QsIGxvY2FsIHZhcmlhYmxlcyBhcmUKLWFscmVhZHkgZGV0ZXJtaW5lZCBzdGF0aWNhbGx5LikKLQotQSBzcGVjaWFsIHF1aXJrIG9mIFB5dGhvbiBpcyB0aGF0IGFzc2lnbm1lbnRzIGFsd2F5cyBnbyBpbnRvIHRoZQotaW5uZXJtb3N0IHNjb3BlLiAgQXNzaWdubWVudHMgZG8gbm90IGNvcHkgZGF0YSAtLS0gdGhleSBqdXN0Ci1iaW5kIG5hbWVzIHRvIG9iamVjdHMuICBUaGUgc2FtZSBpcyB0cnVlIGZvciBkZWxldGlvbnM6IHRoZSBzdGF0ZW1lbnQKLVxzYW1we2RlbCB4fSByZW1vdmVzIHRoZSBiaW5kaW5nIG9mIFxjb2Rle3h9IGZyb20gdGhlIG5hbWVzcGFjZQotcmVmZXJlbmNlZCBieSB0aGUgbG9jYWwgc2NvcGUuICBJbiBmYWN0LCBhbGwgb3BlcmF0aW9ucyB0aGF0IGludHJvZHVjZQotbmV3IG5hbWVzIHVzZSB0aGUgbG9jYWwgc2NvcGU6IGluIHBhcnRpY3VsYXIsIGltcG9ydCBzdGF0ZW1lbnRzIGFuZAotZnVuY3Rpb24gZGVmaW5pdGlvbnMgYmluZCB0aGUgbW9kdWxlIG9yIGZ1bmN0aW9uIG5hbWUgaW4gdGhlIGxvY2FsCi1zY29wZS4gIChUaGUgXGtleXdvcmR7Z2xvYmFsfSBzdGF0ZW1lbnQgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdAotcGFydGljdWxhciB2YXJpYWJsZXMgbGl2ZSBpbiB0aGUgZ2xvYmFsIHNjb3BlLikKLQotCi1cc2VjdGlvbntBIEZpcnN0IExvb2sgYXQgQ2xhc3NlcyBcbGFiZWx7Zmlyc3RDbGFzc2VzfX0KLQotQ2xhc3NlcyBpbnRyb2R1Y2UgYSBsaXR0bGUgYml0IG9mIG5ldyBzeW50YXgsIHRocmVlIG5ldyBvYmplY3QgdHlwZXMsCi1hbmQgc29tZSBuZXcgc2VtYW50aWNzLgotCi0KLVxzdWJzZWN0aW9ue0NsYXNzIERlZmluaXRpb24gU3ludGF4IFxsYWJlbHtjbGFzc0RlZmluaXRpb259fQotCi1UaGUgc2ltcGxlc3QgZm9ybSBvZiBjbGFzcyBkZWZpbml0aW9uIGxvb2tzIGxpa2UgdGhpczoKLQotXGJlZ2lue3ZlcmJhdGltfQotY2xhc3MgQ2xhc3NOYW1lOgotICAgIDxzdGF0ZW1lbnQtMT4KLSAgICAuCi0gICAgLgotICAgIC4KLSAgICA8c3RhdGVtZW50LU4+Ci1cZW5ke3ZlcmJhdGltfQotCi1DbGFzcyBkZWZpbml0aW9ucywgbGlrZSBmdW5jdGlvbiBkZWZpbml0aW9ucwotKFxrZXl3b3Jke2RlZn0gc3RhdGVtZW50cykgbXVzdCBiZSBleGVjdXRlZCBiZWZvcmUgdGhleSBoYXZlIGFueQotZWZmZWN0LiAgKFlvdSBjb3VsZCBjb25jZWl2YWJseSBwbGFjZSBhIGNsYXNzIGRlZmluaXRpb24gaW4gYSBicmFuY2gKLW9mIGFuIFxrZXl3b3Jke2lmfSBzdGF0ZW1lbnQsIG9yIGluc2lkZSBhIGZ1bmN0aW9uLikKLQotSW4gcHJhY3RpY2UsIHRoZSBzdGF0ZW1lbnRzIGluc2lkZSBhIGNsYXNzIGRlZmluaXRpb24gd2lsbCB1c3VhbGx5IGJlCi1mdW5jdGlvbiBkZWZpbml0aW9ucywgYnV0IG90aGVyIHN0YXRlbWVudHMgYXJlIGFsbG93ZWQsIGFuZCBzb21ldGltZXMKLXVzZWZ1bCAtLS0gd2UnbGwgY29tZSBiYWNrIHRvIHRoaXMgbGF0ZXIuICBUaGUgZnVuY3Rpb24gZGVmaW5pdGlvbnMKLWluc2lkZSBhIGNsYXNzIG5vcm1hbGx5IGhhdmUgYSBwZWN1bGlhciBmb3JtIG9mIGFyZ3VtZW50IGxpc3QsCi1kaWN0YXRlZCBieSB0aGUgY2FsbGluZyBjb252ZW50aW9ucyBmb3IgbWV0aG9kcyAtLS0gYWdhaW4sIHRoaXMgaXMKLWV4cGxhaW5lZCBsYXRlci4KLQotV2hlbiBhIGNsYXNzIGRlZmluaXRpb24gaXMgZW50ZXJlZCwgYSBuZXcgbmFtZXNwYWNlIGlzIGNyZWF0ZWQsIGFuZAotdXNlZCBhcyB0aGUgbG9jYWwgc2NvcGUgLS0tIHRodXMsIGFsbCBhc3NpZ25tZW50cyB0byBsb2NhbCB2YXJpYWJsZXMKLWdvIGludG8gdGhpcyBuZXcgbmFtZXNwYWNlLiAgSW4gcGFydGljdWxhciwgZnVuY3Rpb24gZGVmaW5pdGlvbnMgYmluZAotdGhlIG5hbWUgb2YgdGhlIG5ldyBmdW5jdGlvbiBoZXJlLgotCi1XaGVuIGEgY2xhc3MgZGVmaW5pdGlvbiBpcyBsZWZ0IG5vcm1hbGx5ICh2aWEgdGhlIGVuZCksIGEgXGVtcGh7Y2xhc3MKLW9iamVjdH0gaXMgY3JlYXRlZC4gIFRoaXMgaXMgYmFzaWNhbGx5IGEgd3JhcHBlciBhcm91bmQgdGhlIGNvbnRlbnRzCi1vZiB0aGUgbmFtZXNwYWNlIGNyZWF0ZWQgYnkgdGhlIGNsYXNzIGRlZmluaXRpb247IHdlJ2xsIGxlYXJuIG1vcmUKLWFib3V0IGNsYXNzIG9iamVjdHMgaW4gdGhlIG5leHQgc2VjdGlvbi4gIFRoZSBvcmlnaW5hbCBsb2NhbCBzY29wZQotKHRoZSBvbmUgaW4gZWZmZWN0IGp1c3QgYmVmb3JlIHRoZSBjbGFzcyBkZWZpbml0aW9uIHdhcyBlbnRlcmVkKSBpcwotcmVpbnN0YXRlZCwgYW5kIHRoZSBjbGFzcyBvYmplY3QgaXMgYm91bmQgaGVyZSB0byB0aGUgY2xhc3MgbmFtZSBnaXZlbgotaW4gdGhlIGNsYXNzIGRlZmluaXRpb24gaGVhZGVyIChcY2xhc3N7Q2xhc3NOYW1lfSBpbiB0aGUgZXhhbXBsZSkuCi0KLQotXHN1YnNlY3Rpb257Q2xhc3MgT2JqZWN0cyBcbGFiZWx7Y2xhc3NPYmplY3RzfX0KLQotQ2xhc3Mgb2JqZWN0cyBzdXBwb3J0IHR3byBraW5kcyBvZiBvcGVyYXRpb25zOiBhdHRyaWJ1dGUgcmVmZXJlbmNlcwotYW5kIGluc3RhbnRpYXRpb24uCi0KLVxlbXBoe0F0dHJpYnV0ZSByZWZlcmVuY2VzfSB1c2UgdGhlIHN0YW5kYXJkIHN5bnRheCB1c2VkIGZvciBhbGwKLWF0dHJpYnV0ZSByZWZlcmVuY2VzIGluIFB5dGhvbjogXGNvZGV7b2JqLm5hbWV9LiAgVmFsaWQgYXR0cmlidXRlCi1uYW1lcyBhcmUgYWxsIHRoZSBuYW1lcyB0aGF0IHdlcmUgaW4gdGhlIGNsYXNzJ3MgbmFtZXNwYWNlIHdoZW4gdGhlCi1jbGFzcyBvYmplY3Qgd2FzIGNyZWF0ZWQuICBTbywgaWYgdGhlIGNsYXNzIGRlZmluaXRpb24gbG9va2VkIGxpa2UKLXRoaXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWNsYXNzIE15Q2xhc3M6Ci0gICAgIkEgc2ltcGxlIGV4YW1wbGUgY2xhc3MiCi0gICAgaSA9IDEyMzQ1Ci0gICAgZGVmIGYoc2VsZik6Ci0gICAgICAgIHJldHVybiAnaGVsbG8gd29ybGQnCi1cZW5ke3ZlcmJhdGltfQotCi10aGVuIFxjb2Rle015Q2xhc3MuaX0gYW5kIFxjb2Rle015Q2xhc3MuZn0gYXJlIHZhbGlkIGF0dHJpYnV0ZQotcmVmZXJlbmNlcywgcmV0dXJuaW5nIGFuIGludGVnZXIgYW5kIGEgZnVuY3Rpb24gb2JqZWN0LCByZXNwZWN0aXZlbHkuCi1DbGFzcyBhdHRyaWJ1dGVzIGNhbiBhbHNvIGJlIGFzc2lnbmVkIHRvLCBzbyB5b3UgY2FuIGNoYW5nZSB0aGUgdmFsdWUKLW9mIFxjb2Rle015Q2xhc3MuaX0gYnkgYXNzaWdubWVudC4gIFxtZW1iZXJ7X19kb2NfX30gaXMgYWxzbyBhIHZhbGlkCi1hdHRyaWJ1dGUsIHJldHVybmluZyB0aGUgZG9jc3RyaW5nIGJlbG9uZ2luZyB0byB0aGUgY2xhc3M6IFxjb2RleyJBCi1zaW1wbGUgZXhhbXBsZSBjbGFzcyJ9LiAKLQotQ2xhc3MgXGVtcGh7aW5zdGFudGlhdGlvbn0gdXNlcyBmdW5jdGlvbiBub3RhdGlvbi4gIEp1c3QgcHJldGVuZCB0aGF0Ci10aGUgY2xhc3Mgb2JqZWN0IGlzIGEgcGFyYW1ldGVybGVzcyBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBuZXcKLWluc3RhbmNlIG9mIHRoZSBjbGFzcy4gIEZvciBleGFtcGxlIChhc3N1bWluZyB0aGUgYWJvdmUgY2xhc3MpOgotCi1cYmVnaW57dmVyYmF0aW19Ci14ID0gTXlDbGFzcygpCi1cZW5ke3ZlcmJhdGltfQotCi1jcmVhdGVzIGEgbmV3IFxlbXBoe2luc3RhbmNlfSBvZiB0aGUgY2xhc3MgYW5kIGFzc2lnbnMgdGhpcyBvYmplY3QgdG8KLXRoZSBsb2NhbCB2YXJpYWJsZSBcY29kZXt4fS4KLQotVGhlIGluc3RhbnRpYXRpb24gb3BlcmF0aW9uIChgYGNhbGxpbmcnJyBhIGNsYXNzIG9iamVjdCkgY3JlYXRlcyBhbgotZW1wdHkgb2JqZWN0LiAgTWFueSBjbGFzc2VzIGxpa2UgdG8gY3JlYXRlIG9iamVjdHMgd2l0aCBpbnN0YW5jZXMKLWN1c3RvbWl6ZWQgdG8gYSBzcGVjaWZpYyBpbml0aWFsIHN0YXRlLgotVGhlcmVmb3JlIGEgY2xhc3MgbWF5IGRlZmluZSBhIHNwZWNpYWwgbWV0aG9kIG5hbWVkCi1cbWV0aG9ke19faW5pdF9fKCl9LCBsaWtlIHRoaXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYuZGF0YSA9IFtdCi1cZW5ke3ZlcmJhdGltfQotCi1XaGVuIGEgY2xhc3MgZGVmaW5lcyBhbiBcbWV0aG9ke19faW5pdF9fKCl9IG1ldGhvZCwgY2xhc3MKLWluc3RhbnRpYXRpb24gYXV0b21hdGljYWxseSBpbnZva2VzIFxtZXRob2R7X19pbml0X18oKX0gZm9yIHRoZQotbmV3bHktY3JlYXRlZCBjbGFzcyBpbnN0YW5jZS4gIFNvIGluIHRoaXMgZXhhbXBsZSwgYSBuZXcsIGluaXRpYWxpemVkCi1pbnN0YW5jZSBjYW4gYmUgb2J0YWluZWQgYnk6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXggPSBNeUNsYXNzKCkKLVxlbmR7dmVyYmF0aW19Ci0KLU9mIGNvdXJzZSwgdGhlIFxtZXRob2R7X19pbml0X18oKX0gbWV0aG9kIG1heSBoYXZlIGFyZ3VtZW50cyBmb3IKLWdyZWF0ZXIgZmxleGliaWxpdHkuICBJbiB0aGF0IGNhc2UsIGFyZ3VtZW50cyBnaXZlbiB0byB0aGUgY2xhc3MKLWluc3RhbnRpYXRpb24gb3BlcmF0b3IgYXJlIHBhc3NlZCBvbiB0byBcbWV0aG9ke19faW5pdF9fKCl9LiAgRm9yCi1leGFtcGxlLAotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gY2xhc3MgQ29tcGxleDoKLS4uLiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlYWxwYXJ0LCBpbWFncGFydCk6Ci0uLi4gICAgICAgICBzZWxmLnIgPSByZWFscGFydAotLi4uICAgICAgICAgc2VsZi5pID0gaW1hZ3BhcnQKLS4uLiAKLT4+PiB4ID0gQ29tcGxleCgzLjAsIC00LjUpCi0+Pj4geC5yLCB4LmkKLSgzLjAsIC00LjUpCi1cZW5ke3ZlcmJhdGltfQotCi0KLVxzdWJzZWN0aW9ue0luc3RhbmNlIE9iamVjdHMgXGxhYmVse2luc3RhbmNlT2JqZWN0c319Ci0KLU5vdyB3aGF0IGNhbiB3ZSBkbyB3aXRoIGluc3RhbmNlIG9iamVjdHM/ICBUaGUgb25seSBvcGVyYXRpb25zCi11bmRlcnN0b29kIGJ5IGluc3RhbmNlIG9iamVjdHMgYXJlIGF0dHJpYnV0ZSByZWZlcmVuY2VzLiAgVGhlcmUgYXJlCi10d28ga2luZHMgb2YgdmFsaWQgYXR0cmlidXRlIG5hbWVzLCBkYXRhIGF0dHJpYnV0ZXMgYW5kIG1ldGhvZHMuCi0KLVxlbXBoe2RhdGEgYXR0cmlidXRlc30gY29ycmVzcG9uZCB0bwotYGBpbnN0YW5jZSB2YXJpYWJsZXMnJyBpbiBTbWFsbHRhbGssIGFuZCB0byBgYGRhdGEgbWVtYmVycycnIGluCi1cQ3BwLiAgRGF0YSBhdHRyaWJ1dGVzIG5lZWQgbm90IGJlIGRlY2xhcmVkOyBsaWtlIGxvY2FsIHZhcmlhYmxlcywKLXRoZXkgc3ByaW5nIGludG8gZXhpc3RlbmNlIHdoZW4gdGhleSBhcmUgZmlyc3QgYXNzaWduZWQgdG8uICBGb3IKLWV4YW1wbGUsIGlmIFxjb2Rle3h9IGlzIHRoZSBpbnN0YW5jZSBvZiBcY2xhc3N7TXlDbGFzc30gY3JlYXRlZCBhYm92ZSwKLXRoZSBmb2xsb3dpbmcgcGllY2Ugb2YgY29kZSB3aWxsIHByaW50IHRoZSB2YWx1ZSBcY29kZXsxNn0sIHdpdGhvdXQKLWxlYXZpbmcgYSB0cmFjZToKLQotXGJlZ2lue3ZlcmJhdGltfQoteC5jb3VudGVyID0gMQotd2hpbGUgeC5jb3VudGVyIDwgMTA6Ci0gICAgeC5jb3VudGVyID0geC5jb3VudGVyICogMgotcHJpbnQgeC5jb3VudGVyCi1kZWwgeC5jb3VudGVyCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgb3RoZXIga2luZCBvZiBpbnN0YW5jZSBhdHRyaWJ1dGUgcmVmZXJlbmNlIGlzIGEgXGVtcGh7bWV0aG9kfS4KLUEgbWV0aG9kIGlzIGEgZnVuY3Rpb24gdGhhdCBgYGJlbG9uZ3MgdG8nJyBhbgotb2JqZWN0LiAgKEluIFB5dGhvbiwgdGhlIHRlcm0gbWV0aG9kIGlzIG5vdCB1bmlxdWUgdG8gY2xhc3MgaW5zdGFuY2VzOgotb3RoZXIgb2JqZWN0IHR5cGVzIGNhbiBoYXZlIG1ldGhvZHMgYXMgd2VsbC4gIEZvciBleGFtcGxlLCBsaXN0IG9iamVjdHMgaGF2ZQotbWV0aG9kcyBjYWxsZWQgYXBwZW5kLCBpbnNlcnQsIHJlbW92ZSwgc29ydCwgYW5kIHNvIG9uLiAgSG93ZXZlciwKLWluIHRoZSBmb2xsb3dpbmcgZGlzY3Vzc2lvbiwgd2UnbGwgdXNlIHRoZSB0ZXJtIG1ldGhvZCBleGNsdXNpdmVseSB0byBtZWFuCi1tZXRob2RzIG9mIGNsYXNzIGluc3RhbmNlIG9iamVjdHMsIHVubGVzcyBleHBsaWNpdGx5IHN0YXRlZCBvdGhlcndpc2UuKQotCi1WYWxpZCBtZXRob2QgbmFtZXMgb2YgYW4gaW5zdGFuY2Ugb2JqZWN0IGRlcGVuZCBvbiBpdHMgY2xhc3MuICBCeQotZGVmaW5pdGlvbiwgYWxsIGF0dHJpYnV0ZXMgb2YgYSBjbGFzcyB0aGF0IGFyZSBmdW5jdGlvbiAKLW9iamVjdHMgZGVmaW5lIGNvcnJlc3BvbmRpbmcgbWV0aG9kcyBvZiBpdHMgaW5zdGFuY2VzLiAgU28gaW4gb3VyCi1leGFtcGxlLCBcY29kZXt4LmZ9IGlzIGEgdmFsaWQgbWV0aG9kIHJlZmVyZW5jZSwgc2luY2UKLVxjb2Rle015Q2xhc3MuZn0gaXMgYSBmdW5jdGlvbiwgYnV0IFxjb2Rle3guaX0gaXMgbm90LCBzaW5jZQotXGNvZGV7TXlDbGFzcy5pfSBpcyBub3QuICBCdXQgXGNvZGV7eC5mfSBpcyBub3QgdGhlIHNhbWUgdGhpbmcgYXMKLVxjb2Rle015Q2xhc3MuZn0gLS0tIGl0IGlzIGEgXG9iaW5kZXh7bWV0aG9kfVxlbXBoe21ldGhvZCBvYmplY3R9LCBub3QKLWEgZnVuY3Rpb24gb2JqZWN0LgotCi0KLVxzdWJzZWN0aW9ue01ldGhvZCBPYmplY3RzIFxsYWJlbHttZXRob2RPYmplY3RzfX0KLQotVXN1YWxseSwgYSBtZXRob2QgaXMgY2FsbGVkIHJpZ2h0IGFmdGVyIGl0IGlzIGJvdW5kOgotCi1cYmVnaW57dmVyYmF0aW19Ci14LmYoKQotXGVuZHt2ZXJiYXRpbX0KLQotSW4gdGhlIFxjbGFzc3tNeUNsYXNzfSBleGFtcGxlLCB0aGlzIHdpbGwgcmV0dXJuIHRoZSBzdHJpbmcgXGNvZGV7J2hlbGxvIHdvcmxkJ30uCi1Ib3dldmVyLCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNhbGwgYSBtZXRob2QgcmlnaHQgYXdheToKLVxjb2Rle3guZn0gaXMgYSBtZXRob2Qgb2JqZWN0LCBhbmQgY2FuIGJlIHN0b3JlZCBhd2F5IGFuZCBjYWxsZWQgYXQgYQotbGF0ZXIgdGltZS4gIEZvciBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci14ZiA9IHguZgotd2hpbGUgVHJ1ZToKLSAgICBwcmludCB4ZigpCi1cZW5ke3ZlcmJhdGltfQotCi13aWxsIGNvbnRpbnVlIHRvIHByaW50IFxzYW1we2hlbGxvIHdvcmxkfSB1bnRpbCB0aGUgZW5kIG9mIHRpbWUuCi0KLVdoYXQgZXhhY3RseSBoYXBwZW5zIHdoZW4gYSBtZXRob2QgaXMgY2FsbGVkPyAgWW91IG1heSBoYXZlIG5vdGljZWQKLXRoYXQgXGNvZGV7eC5mKCl9IHdhcyBjYWxsZWQgd2l0aG91dCBhbiBhcmd1bWVudCBhYm92ZSwgZXZlbiB0aG91Z2gKLXRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGZvciBcbWV0aG9ke2Z9IHNwZWNpZmllZCBhbiBhcmd1bWVudC4gIFdoYXQKLWhhcHBlbmVkIHRvIHRoZSBhcmd1bWVudD8gIFN1cmVseSBQeXRob24gcmFpc2VzIGFuIGV4Y2VwdGlvbiB3aGVuIGEKLWZ1bmN0aW9uIHRoYXQgcmVxdWlyZXMgYW4gYXJndW1lbnQgaXMgY2FsbGVkIHdpdGhvdXQgYW55IC0tLSBldmVuIGlmCi10aGUgYXJndW1lbnQgaXNuJ3QgYWN0dWFsbHkgdXNlZC4uLgotCi1BY3R1YWxseSwgeW91IG1heSBoYXZlIGd1ZXNzZWQgdGhlIGFuc3dlcjogdGhlIHNwZWNpYWwgdGhpbmcgYWJvdXQKLW1ldGhvZHMgaXMgdGhhdCB0aGUgb2JqZWN0IGlzIHBhc3NlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQgb2YgdGhlCi1mdW5jdGlvbi4gIEluIG91ciBleGFtcGxlLCB0aGUgY2FsbCBcY29kZXt4LmYoKX0gaXMgZXhhY3RseSBlcXVpdmFsZW50Ci10byBcY29kZXtNeUNsYXNzLmYoeCl9LiAgSW4gZ2VuZXJhbCwgY2FsbGluZyBhIG1ldGhvZCB3aXRoIGEgbGlzdCBvZgotXHZhcntufSBhcmd1bWVudHMgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIHRoZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uCi13aXRoIGFuIGFyZ3VtZW50IGxpc3QgdGhhdCBpcyBjcmVhdGVkIGJ5IGluc2VydGluZyB0aGUgbWV0aG9kJ3Mgb2JqZWN0Ci1iZWZvcmUgdGhlIGZpcnN0IGFyZ3VtZW50LgotCi1JZiB5b3Ugc3RpbGwgZG9uJ3QgdW5kZXJzdGFuZCBob3cgbWV0aG9kcyB3b3JrLCBhIGxvb2sgYXQgdGhlCi1pbXBsZW1lbnRhdGlvbiBjYW4gcGVyaGFwcyBjbGFyaWZ5IG1hdHRlcnMuICBXaGVuIGFuIGluc3RhbmNlCi1hdHRyaWJ1dGUgaXMgcmVmZXJlbmNlZCB0aGF0IGlzbid0IGEgZGF0YSBhdHRyaWJ1dGUsIGl0cyBjbGFzcyBpcwotc2VhcmNoZWQuICBJZiB0aGUgbmFtZSBkZW5vdGVzIGEgdmFsaWQgY2xhc3MgYXR0cmlidXRlIHRoYXQgaXMgYQotZnVuY3Rpb24gb2JqZWN0LCBhIG1ldGhvZCBvYmplY3QgaXMgY3JlYXRlZCBieSBwYWNraW5nIChwb2ludGVycyB0bykKLXRoZSBpbnN0YW5jZSBvYmplY3QgYW5kIHRoZSBmdW5jdGlvbiBvYmplY3QganVzdCBmb3VuZCB0b2dldGhlciBpbiBhbgotYWJzdHJhY3Qgb2JqZWN0OiB0aGlzIGlzIHRoZSBtZXRob2Qgb2JqZWN0LiAgV2hlbiB0aGUgbWV0aG9kIG9iamVjdCBpcwotY2FsbGVkIHdpdGggYW4gYXJndW1lbnQgbGlzdCwgaXQgaXMgdW5wYWNrZWQgYWdhaW4sIGEgbmV3IGFyZ3VtZW50Ci1saXN0IGlzIGNvbnN0cnVjdGVkIGZyb20gdGhlIGluc3RhbmNlIG9iamVjdCBhbmQgdGhlIG9yaWdpbmFsIGFyZ3VtZW50Ci1saXN0LCBhbmQgdGhlIGZ1bmN0aW9uIG9iamVjdCBpcyBjYWxsZWQgd2l0aCB0aGlzIG5ldyBhcmd1bWVudCBsaXN0LgotCi0KLVxzZWN0aW9ue1JhbmRvbSBSZW1hcmtzIFxsYWJlbHtyZW1hcmtzfX0KLQotJSBbVGhlc2Ugc2hvdWxkIHBlcmhhcHMgYmUgcGxhY2VkIG1vcmUgY2FyZWZ1bGx5Li4uXQotCi0KLURhdGEgYXR0cmlidXRlcyBvdmVycmlkZSBtZXRob2QgYXR0cmlidXRlcyB3aXRoIHRoZSBzYW1lIG5hbWU7IHRvCi1hdm9pZCBhY2NpZGVudGFsIG5hbWUgY29uZmxpY3RzLCB3aGljaCBtYXkgY2F1c2UgaGFyZC10by1maW5kIGJ1Z3MgaW4KLWxhcmdlIHByb2dyYW1zLCBpdCBpcyB3aXNlIHRvIHVzZSBzb21lIGtpbmQgb2YgY29udmVudGlvbiB0aGF0Ci1taW5pbWl6ZXMgdGhlIGNoYW5jZSBvZiBjb25mbGljdHMuICBQb3NzaWJsZSBjb252ZW50aW9ucyBpbmNsdWRlCi1jYXBpdGFsaXppbmcgbWV0aG9kIG5hbWVzLCBwcmVmaXhpbmcgZGF0YSBhdHRyaWJ1dGUgbmFtZXMgd2l0aCBhIHNtYWxsCi11bmlxdWUgc3RyaW5nIChwZXJoYXBzIGp1c3QgYW4gdW5kZXJzY29yZSksIG9yIHVzaW5nIHZlcmJzIGZvciBtZXRob2RzCi1hbmQgbm91bnMgZm9yIGRhdGEgYXR0cmlidXRlcy4KLQotCi1EYXRhIGF0dHJpYnV0ZXMgbWF5IGJlIHJlZmVyZW5jZWQgYnkgbWV0aG9kcyBhcyB3ZWxsIGFzIGJ5IG9yZGluYXJ5Ci11c2VycyAoYGBjbGllbnRzJycpIG9mIGFuIG9iamVjdC4gIEluIG90aGVyIHdvcmRzLCBjbGFzc2VzIGFyZSBub3QKLXVzYWJsZSB0byBpbXBsZW1lbnQgcHVyZSBhYnN0cmFjdCBkYXRhIHR5cGVzLiAgSW4gZmFjdCwgbm90aGluZyBpbgotUHl0aG9uIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGVuZm9yY2UgZGF0YSBoaWRpbmcgLS0tIGl0IGlzIGFsbCBiYXNlZAotdXBvbiBjb252ZW50aW9uLiAgKE9uIHRoZSBvdGhlciBoYW5kLCB0aGUgUHl0aG9uIGltcGxlbWVudGF0aW9uLAotd3JpdHRlbiBpbiBDLCBjYW4gY29tcGxldGVseSBoaWRlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgYW5kIGNvbnRyb2wKLWFjY2VzcyB0byBhbiBvYmplY3QgaWYgbmVjZXNzYXJ5OyB0aGlzIGNhbiBiZSB1c2VkIGJ5IGV4dGVuc2lvbnMgdG8KLVB5dGhvbiB3cml0dGVuIGluIEMuKQotCi0KLUNsaWVudHMgc2hvdWxkIHVzZSBkYXRhIGF0dHJpYnV0ZXMgd2l0aCBjYXJlIC0tLSBjbGllbnRzIG1heSBtZXNzIHVwCi1pbnZhcmlhbnRzIG1haW50YWluZWQgYnkgdGhlIG1ldGhvZHMgYnkgc3RhbXBpbmcgb24gdGhlaXIgZGF0YQotYXR0cmlidXRlcy4gIE5vdGUgdGhhdCBjbGllbnRzIG1heSBhZGQgZGF0YSBhdHRyaWJ1dGVzIG9mIHRoZWlyIG93biB0bwotYW4gaW5zdGFuY2Ugb2JqZWN0IHdpdGhvdXQgYWZmZWN0aW5nIHRoZSB2YWxpZGl0eSBvZiB0aGUgbWV0aG9kcywgYXMKLWxvbmcgYXMgbmFtZSBjb25mbGljdHMgYXJlIGF2b2lkZWQgLS0tIGFnYWluLCBhIG5hbWluZyBjb252ZW50aW9uIGNhbgotc2F2ZSBhIGxvdCBvZiBoZWFkYWNoZXMgaGVyZS4KLQotCi1UaGVyZSBpcyBubyBzaG9ydGhhbmQgZm9yIHJlZmVyZW5jaW5nIGRhdGEgYXR0cmlidXRlcyAob3Igb3RoZXIKLW1ldGhvZHMhKSBmcm9tIHdpdGhpbiBtZXRob2RzLiAgSSBmaW5kIHRoYXQgdGhpcyBhY3R1YWxseSBpbmNyZWFzZXMKLXRoZSByZWFkYWJpbGl0eSBvZiBtZXRob2RzOiB0aGVyZSBpcyBubyBjaGFuY2Ugb2YgY29uZnVzaW5nIGxvY2FsCi12YXJpYWJsZXMgYW5kIGluc3RhbmNlIHZhcmlhYmxlcyB3aGVuIGdsYW5jaW5nIHRocm91Z2ggYSBtZXRob2QuCi0KLQotT2Z0ZW4sIHRoZSBmaXJzdCBhcmd1bWVudCBvZiBhIG1ldGhvZCBpcyBjYWxsZWQKLVxjb2Rle3NlbGZ9LiAgVGhpcyBpcyBub3RoaW5nIG1vcmUgdGhhbiBhIGNvbnZlbnRpb246IHRoZSBuYW1lCi1cY29kZXtzZWxmfSBoYXMgYWJzb2x1dGVseSBubyBzcGVjaWFsIG1lYW5pbmcgdG8gUHl0aG9uLiAgKE5vdGUsCi1ob3dldmVyLCB0aGF0IGJ5IG5vdCBmb2xsb3dpbmcgdGhlIGNvbnZlbnRpb24geW91ciBjb2RlIG1heSBiZSBsZXNzCi1yZWFkYWJsZSB0byBvdGhlciBQeXRob24gcHJvZ3JhbW1lcnMsIGFuZCBpdCBpcyBhbHNvIGNvbmNlaXZhYmxlIHRoYXQKLWEgXGVtcGh7Y2xhc3MgYnJvd3Nlcn0gcHJvZ3JhbSBtaWdodCBiZSB3cml0dGVuIHRoYXQgcmVsaWVzIHVwb24gc3VjaCBhCi1jb252ZW50aW9uLikKLQotCi1BbnkgZnVuY3Rpb24gb2JqZWN0IHRoYXQgaXMgYSBjbGFzcyBhdHRyaWJ1dGUgZGVmaW5lcyBhIG1ldGhvZCBmb3IKLWluc3RhbmNlcyBvZiB0aGF0IGNsYXNzLiAgSXQgaXMgbm90IG5lY2Vzc2FyeSB0aGF0IHRoZSBmdW5jdGlvbgotZGVmaW5pdGlvbiBpcyB0ZXh0dWFsbHkgZW5jbG9zZWQgaW4gdGhlIGNsYXNzIGRlZmluaXRpb246IGFzc2lnbmluZyBhCi1mdW5jdGlvbiBvYmplY3QgdG8gYSBsb2NhbCB2YXJpYWJsZSBpbiB0aGUgY2xhc3MgaXMgYWxzbyBvay4gIEZvcgotZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotIyBGdW5jdGlvbiBkZWZpbmVkIG91dHNpZGUgdGhlIGNsYXNzCi1kZWYgZjEoc2VsZiwgeCwgeSk6Ci0gICAgcmV0dXJuIG1pbih4LCB4K3kpCi0KLWNsYXNzIEM6Ci0gICAgZiA9IGYxCi0gICAgZGVmIGcoc2VsZik6Ci0gICAgICAgIHJldHVybiAnaGVsbG8gd29ybGQnCi0gICAgaCA9IGcKLVxlbmR7dmVyYmF0aW19Ci0KLU5vdyBcY29kZXtmfSwgXGNvZGV7Z30gYW5kIFxjb2Rle2h9IGFyZSBhbGwgYXR0cmlidXRlcyBvZiBjbGFzcwotXGNsYXNze0N9IHRoYXQgcmVmZXIgdG8gZnVuY3Rpb24gb2JqZWN0cywgYW5kIGNvbnNlcXVlbnRseSB0aGV5IGFyZSBhbGwKLW1ldGhvZHMgb2YgaW5zdGFuY2VzIG9mIFxjbGFzc3tDfSAtLS0gXGNvZGV7aH0gYmVpbmcgZXhhY3RseSBlcXVpdmFsZW50Ci10byBcY29kZXtnfS4gIE5vdGUgdGhhdCB0aGlzIHByYWN0aWNlIHVzdWFsbHkgb25seSBzZXJ2ZXMgdG8gY29uZnVzZQotdGhlIHJlYWRlciBvZiBhIHByb2dyYW0uCi0KLQotTWV0aG9kcyBtYXkgY2FsbCBvdGhlciBtZXRob2RzIGJ5IHVzaW5nIG1ldGhvZCBhdHRyaWJ1dGVzIG9mIHRoZQotXGNvZGV7c2VsZn0gYXJndW1lbnQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWNsYXNzIEJhZzoKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYuZGF0YSA9IFtdCi0gICAgZGVmIGFkZChzZWxmLCB4KToKLSAgICAgICAgc2VsZi5kYXRhLmFwcGVuZCh4KQotICAgIGRlZiBhZGR0d2ljZShzZWxmLCB4KToKLSAgICAgICAgc2VsZi5hZGQoeCkKLSAgICAgICAgc2VsZi5hZGQoeCkKLVxlbmR7dmVyYmF0aW19Ci0KLU1ldGhvZHMgbWF5IHJlZmVyZW5jZSBnbG9iYWwgbmFtZXMgaW4gdGhlIHNhbWUgd2F5IGFzIG9yZGluYXJ5Ci1mdW5jdGlvbnMuICBUaGUgZ2xvYmFsIHNjb3BlIGFzc29jaWF0ZWQgd2l0aCBhIG1ldGhvZCBpcyB0aGUgbW9kdWxlCi1jb250YWluaW5nIHRoZSBjbGFzcyBkZWZpbml0aW9uLiAgKFRoZSBjbGFzcyBpdHNlbGYgaXMgbmV2ZXIgdXNlZCBhcyBhCi1nbG9iYWwgc2NvcGUhKSAgV2hpbGUgb25lIHJhcmVseSBlbmNvdW50ZXJzIGEgZ29vZCByZWFzb24gZm9yIHVzaW5nCi1nbG9iYWwgZGF0YSBpbiBhIG1ldGhvZCwgdGhlcmUgYXJlIG1hbnkgbGVnaXRpbWF0ZSB1c2VzIG9mIHRoZSBnbG9iYWwKLXNjb3BlOiBmb3Igb25lIHRoaW5nLCBmdW5jdGlvbnMgYW5kIG1vZHVsZXMgaW1wb3J0ZWQgaW50byB0aGUgZ2xvYmFsCi1zY29wZSBjYW4gYmUgdXNlZCBieSBtZXRob2RzLCBhcyB3ZWxsIGFzIGZ1bmN0aW9ucyBhbmQgY2xhc3NlcyBkZWZpbmVkCi1pbiBpdC4gIFVzdWFsbHksIHRoZSBjbGFzcyBjb250YWluaW5nIHRoZSBtZXRob2QgaXMgaXRzZWxmIGRlZmluZWQgaW4KLXRoaXMgZ2xvYmFsIHNjb3BlLCBhbmQgaW4gdGhlIG5leHQgc2VjdGlvbiB3ZSdsbCBmaW5kIHNvbWUgZ29vZAotcmVhc29ucyB3aHkgYSBtZXRob2Qgd291bGQgd2FudCB0byByZWZlcmVuY2UgaXRzIG93biBjbGFzcyEKLQotCi1cc2VjdGlvbntJbmhlcml0YW5jZSBcbGFiZWx7aW5oZXJpdGFuY2V9fQotCi1PZiBjb3Vyc2UsIGEgbGFuZ3VhZ2UgZmVhdHVyZSB3b3VsZCBub3QgYmUgd29ydGh5IG9mIHRoZSBuYW1lIGBgY2xhc3MnJwotd2l0aG91dCBzdXBwb3J0aW5nIGluaGVyaXRhbmNlLiAgVGhlIHN5bnRheCBmb3IgYSBkZXJpdmVkIGNsYXNzCi1kZWZpbml0aW9uIGxvb2tzIGxpa2UgdGhpczoKLQotXGJlZ2lue3ZlcmJhdGltfQotY2xhc3MgRGVyaXZlZENsYXNzTmFtZShCYXNlQ2xhc3NOYW1lKToKLSAgICA8c3RhdGVtZW50LTE+Ci0gICAgLgotICAgIC4KLSAgICAuCi0gICAgPHN0YXRlbWVudC1OPgotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIG5hbWUgXGNsYXNze0Jhc2VDbGFzc05hbWV9IG11c3QgYmUgZGVmaW5lZCBpbiBhIHNjb3BlIGNvbnRhaW5pbmcKLXRoZSBkZXJpdmVkIGNsYXNzIGRlZmluaXRpb24uICBJbiBwbGFjZSBvZiBhIGJhc2UgY2xhc3MgbmFtZSwgb3RoZXIKLWFyYml0cmFyeSBleHByZXNzaW9ucyBhcmUgYWxzbyBhbGxvd2VkLiAgVGhpcyBjYW4gYmUgdXNlZnVsLCBmb3IKLWV4YW1wbGUsIHdoZW4gdGhlIGJhc2UgY2xhc3MgaXMgZGVmaW5lZCBpbiBhbm90aGVyIG1vZHVsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotY2xhc3MgRGVyaXZlZENsYXNzTmFtZShtb2RuYW1lLkJhc2VDbGFzc05hbWUpOgotXGVuZHt2ZXJiYXRpbX0KLQotRXhlY3V0aW9uIG9mIGEgZGVyaXZlZCBjbGFzcyBkZWZpbml0aW9uIHByb2NlZWRzIHRoZSBzYW1lIGFzIGZvciBhCi1iYXNlIGNsYXNzLiAgV2hlbiB0aGUgY2xhc3Mgb2JqZWN0IGlzIGNvbnN0cnVjdGVkLCB0aGUgYmFzZSBjbGFzcyBpcwotcmVtZW1iZXJlZC4gIFRoaXMgaXMgdXNlZCBmb3IgcmVzb2x2aW5nIGF0dHJpYnV0ZSByZWZlcmVuY2VzOiBpZiBhCi1yZXF1ZXN0ZWQgYXR0cmlidXRlIGlzIG5vdCBmb3VuZCBpbiB0aGUgY2xhc3MsIHRoZSBzZWFyY2ggcHJvY2VlZHMgdG8gbG9vayBpbiB0aGUKLWJhc2UgY2xhc3MuICBUaGlzIHJ1bGUgaXMgYXBwbGllZCByZWN1cnNpdmVseSBpZiB0aGUgYmFzZSBjbGFzcyBpdHNlbGYKLWlzIGRlcml2ZWQgZnJvbSBzb21lIG90aGVyIGNsYXNzLgotCi1UaGVyZSdzIG5vdGhpbmcgc3BlY2lhbCBhYm91dCBpbnN0YW50aWF0aW9uIG9mIGRlcml2ZWQgY2xhc3NlczoKLVxjb2Rle0Rlcml2ZWRDbGFzc05hbWUoKX0gY3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY2xhc3MuICBNZXRob2QKLXJlZmVyZW5jZXMgYXJlIHJlc29sdmVkIGFzIGZvbGxvd3M6IHRoZSBjb3JyZXNwb25kaW5nIGNsYXNzIGF0dHJpYnV0ZQotaXMgc2VhcmNoZWQsIGRlc2NlbmRpbmcgZG93biB0aGUgY2hhaW4gb2YgYmFzZSBjbGFzc2VzIGlmIG5lY2Vzc2FyeSwKLWFuZCB0aGUgbWV0aG9kIHJlZmVyZW5jZSBpcyB2YWxpZCBpZiB0aGlzIHlpZWxkcyBhIGZ1bmN0aW9uIG9iamVjdC4KLQotRGVyaXZlZCBjbGFzc2VzIG1heSBvdmVycmlkZSBtZXRob2RzIG9mIHRoZWlyIGJhc2UgY2xhc3Nlcy4gIEJlY2F1c2UKLW1ldGhvZHMgaGF2ZSBubyBzcGVjaWFsIHByaXZpbGVnZXMgd2hlbiBjYWxsaW5nIG90aGVyIG1ldGhvZHMgb2YgdGhlCi1zYW1lIG9iamVjdCwgYSBtZXRob2Qgb2YgYSBiYXNlIGNsYXNzIHRoYXQgY2FsbHMgYW5vdGhlciBtZXRob2QKLWRlZmluZWQgaW4gdGhlIHNhbWUgYmFzZSBjbGFzcyBtYXkgZW5kIHVwIGNhbGxpbmcgYSBtZXRob2Qgb2YKLWEgZGVyaXZlZCBjbGFzcyB0aGF0IG92ZXJyaWRlcyBpdC4gIChGb3IgXENwcHt9IHByb2dyYW1tZXJzOiBhbGwgbWV0aG9kcwotaW4gUHl0aG9uIGFyZSBlZmZlY3RpdmVseSBca2V5d29yZHt2aXJ0dWFsfS4pCi0KLUFuIG92ZXJyaWRpbmcgbWV0aG9kIGluIGEgZGVyaXZlZCBjbGFzcyBtYXkgaW4gZmFjdCB3YW50IHRvIGV4dGVuZAotcmF0aGVyIHRoYW4gc2ltcGx5IHJlcGxhY2UgdGhlIGJhc2UgY2xhc3MgbWV0aG9kIG9mIHRoZSBzYW1lIG5hbWUuCi1UaGVyZSBpcyBhIHNpbXBsZSB3YXkgdG8gY2FsbCB0aGUgYmFzZSBjbGFzcyBtZXRob2QgZGlyZWN0bHk6IGp1c3QKLWNhbGwgXHNhbXB7QmFzZUNsYXNzTmFtZS5tZXRob2RuYW1lKHNlbGYsIGFyZ3VtZW50cyl9LiAgVGhpcyBpcwotb2NjYXNpb25hbGx5IHVzZWZ1bCB0byBjbGllbnRzIGFzIHdlbGwuICAoTm90ZSB0aGF0IHRoaXMgb25seSB3b3JrcyBpZgotdGhlIGJhc2UgY2xhc3MgaXMgZGVmaW5lZCBvciBpbXBvcnRlZCBkaXJlY3RseSBpbiB0aGUgZ2xvYmFsIHNjb3BlLikKLQotCi1cc3Vic2VjdGlvbntNdWx0aXBsZSBJbmhlcml0YW5jZSBcbGFiZWx7bXVsdGlwbGV9fQotCi1QeXRob24gc3VwcG9ydHMgYSBsaW1pdGVkIGZvcm0gb2YgbXVsdGlwbGUgaW5oZXJpdGFuY2UgYXMgd2VsbC4gIEEKLWNsYXNzIGRlZmluaXRpb24gd2l0aCBtdWx0aXBsZSBiYXNlIGNsYXNzZXMgbG9va3MgbGlrZSB0aGlzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1jbGFzcyBEZXJpdmVkQ2xhc3NOYW1lKEJhc2UxLCBCYXNlMiwgQmFzZTMpOgotICAgIDxzdGF0ZW1lbnQtMT4KLSAgICAuCi0gICAgLgotICAgIC4KLSAgICA8c3RhdGVtZW50LU4+Ci1cZW5ke3ZlcmJhdGltfQotCi1Gb3Igb2xkLXN0eWxlIGNsYXNzZXMsIHRoZSBvbmx5IHJ1bGUgaXMgZGVwdGgtZmlyc3QsCi1sZWZ0LXRvLXJpZ2h0LiAgVGh1cywgaWYgYW4gYXR0cmlidXRlIGlzIG5vdCBmb3VuZCBpbgotXGNsYXNze0Rlcml2ZWRDbGFzc05hbWV9LCBpdCBpcyBzZWFyY2hlZCBpbiBcY2xhc3N7QmFzZTF9LCB0aGVuCi0ocmVjdXJzaXZlbHkpIGluIHRoZSBiYXNlIGNsYXNzZXMgb2YgXGNsYXNze0Jhc2UxfSwgYW5kIG9ubHkgaWYgaXQgaXMKLW5vdCBmb3VuZCB0aGVyZSwgaXQgaXMgc2VhcmNoZWQgaW4gXGNsYXNze0Jhc2UyfSwgYW5kIHNvIG9uLgotCi0oVG8gc29tZSBwZW9wbGUgYnJlYWR0aCBmaXJzdCAtLS0gc2VhcmNoaW5nIFxjbGFzc3tCYXNlMn0gYW5kCi1cY2xhc3N7QmFzZTN9IGJlZm9yZSB0aGUgYmFzZSBjbGFzc2VzIG9mIFxjbGFzc3tCYXNlMX0gLS0tIGxvb2tzIG1vcmUKLW5hdHVyYWwuICBIb3dldmVyLCB0aGlzIHdvdWxkIHJlcXVpcmUgeW91IHRvIGtub3cgd2hldGhlciBhIHBhcnRpY3VsYXIKLWF0dHJpYnV0ZSBvZiBcY2xhc3N7QmFzZTF9IGlzIGFjdHVhbGx5IGRlZmluZWQgaW4gXGNsYXNze0Jhc2UxfSBvciBpbgotb25lIG9mIGl0cyBiYXNlIGNsYXNzZXMgYmVmb3JlIHlvdSBjYW4gZmlndXJlIG91dCB0aGUgY29uc2VxdWVuY2VzIG9mCi1hIG5hbWUgY29uZmxpY3Qgd2l0aCBhbiBhdHRyaWJ1dGUgb2YgXGNsYXNze0Jhc2UyfS4gIFRoZSBkZXB0aC1maXJzdAotcnVsZSBtYWtlcyBubyBkaWZmZXJlbmNlcyBiZXR3ZWVuIGRpcmVjdCBhbmQgaW5oZXJpdGVkIGF0dHJpYnV0ZXMgb2YKLVxjbGFzc3tCYXNlMX0uKQotCi1Gb3IgbmV3LXN0eWxlIGNsYXNzZXMsIHRoZSBtZXRob2QgcmVzb2x1dGlvbiBvcmRlciBjaGFuZ2VzIGR5bmFtaWNhbGx5Ci10byBzdXBwb3J0IGNvb3BlcmF0aXZlIGNhbGxzIHRvIFxmdW5jdGlvbntzdXBlcigpfS4gIFRoaXMgYXBwcm9hY2gKLWlzIGtub3duIGluIHNvbWUgb3RoZXIgbXVsdGlwbGUtaW5oZXJpdGFuY2UgbGFuZ3VhZ2VzIGFzIGNhbGwtbmV4dC1tZXRob2QKLWFuZCBpcyBtb3JlIHBvd2VyZnVsIHRoYW4gdGhlIHN1cGVyIGNhbGwgZm91bmQgaW4gc2luZ2xlLWluaGVyaXRhbmNlIGxhbmd1YWdlcy4KLQotV2l0aCBuZXctc3R5bGUgY2xhc3NlcywgZHluYW1pYyBvcmRlcmluZyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBhbGwgCi1jYXNlcyBvZiBtdWx0aXBsZSBpbmhlcml0YW5jZSBleGhpYml0IG9uZSBvciBtb3JlIGRpYW1vbmQgcmVsYXRpb25zaGlwcwotKHdoZXJlIG9uZSBhdCBsZWFzdCBvbmUgb2YgdGhlIHBhcmVudCBjbGFzc2VzIGNhbiBiZSBhY2Nlc3NlZCB0aHJvdWdoCi1tdWx0aXBsZSBwYXRocyBmcm9tIHRoZSBib3R0b21tb3N0IGNsYXNzKS4gIEZvciBleGFtcGxlLCBhbGwgbmV3LXN0eWxlCi1jbGFzc2VzIGluaGVyaXQgZnJvbSBcY2xhc3N7b2JqZWN0fSwgc28gYW55IGNhc2Ugb2YgbXVsdGlwbGUgaW5oZXJpdGFuY2UKLXByb3ZpZGVzIG1vcmUgdGhhbiBvbmUgcGF0aCB0byByZWFjaCBcY2xhc3N7b2JqZWN0fS4gIFRvIGtlZXAgdGhlCi1iYXNlIGNsYXNzZXMgZnJvbSBiZWluZyBhY2Nlc3NlZCBtb3JlIHRoYW4gb25jZSwgdGhlIGR5bmFtaWMgYWxnb3JpdGhtCi1saW5lYXJpemVzIHRoZSBzZWFyY2ggb3JkZXIgaW4gYSB3YXkgdGhhdCBwcmVzZXJ2ZXMgdGhlIGxlZnQtdG8tcmlnaHQKLW9yZGVyaW5nIHNwZWNpZmllZCBpbiBlYWNoIGNsYXNzLCB0aGF0IGNhbGxzIGVhY2ggcGFyZW50IG9ubHkgb25jZSwgYW5kCi10aGF0IGlzIG1vbm90b25pYyAobWVhbmluZyB0aGF0IGEgY2xhc3MgY2FuIGJlIHN1YmNsYXNzZWQgd2l0aG91dCBhZmZlY3RpbmcKLXRoZSBwcmVjZWRlbmNlIG9yZGVyIG9mIGl0cyBwYXJlbnRzKS4gIFRha2VuIHRvZ2V0aGVyLCB0aGVzZSBwcm9wZXJ0aWVzCi1tYWtlIGl0IHBvc3NpYmxlIHRvIGRlc2lnbiByZWxpYWJsZSBhbmQgZXh0ZW5zaWJsZSBjbGFzc2VzIHdpdGgKLW11bHRpcGxlIGluaGVyaXRhbmNlLiAgRm9yIG1vcmUgZGV0YWlsLCBzZWUgCi1cdXJse2h0dHA6Ly93d3cucHl0aG9uLm9yZy9kb3dubG9hZC9yZWxlYXNlcy8yLjMvbXJvL30uCi0KLQotXHNlY3Rpb257UHJpdmF0ZSBWYXJpYWJsZXMgXGxhYmVse3ByaXZhdGV9fQotCi1UaGVyZSBpcyBsaW1pdGVkIHN1cHBvcnQgZm9yIGNsYXNzLXByaXZhdGUKLWlkZW50aWZpZXJzLiAgQW55IGlkZW50aWZpZXIgb2YgdGhlIGZvcm0gXGNvZGV7X19zcGFtfSAoYXQgbGVhc3QgdHdvCi1sZWFkaW5nIHVuZGVyc2NvcmVzLCBhdCBtb3N0IG9uZSB0cmFpbGluZyB1bmRlcnNjb3JlKSBpcyB0ZXh0dWFsbHkKLXJlcGxhY2VkIHdpdGggXGNvZGV7X2NsYXNzbmFtZV9fc3BhbX0sIHdoZXJlIFxjb2Rle2NsYXNzbmFtZX0gaXMgdGhlCi1jdXJyZW50IGNsYXNzIG5hbWUgd2l0aCBsZWFkaW5nIHVuZGVyc2NvcmUocykgc3RyaXBwZWQuICBUaGlzIG1hbmdsaW5nCi1pcyBkb25lIHdpdGhvdXQgcmVnYXJkIHRvIHRoZSBzeW50YWN0aWMgcG9zaXRpb24gb2YgdGhlIGlkZW50aWZpZXIsIHNvCi1pdCBjYW4gYmUgdXNlZCB0byBkZWZpbmUgY2xhc3MtcHJpdmF0ZSBpbnN0YW5jZSBhbmQgY2xhc3MgdmFyaWFibGVzLAotbWV0aG9kcywgdmFyaWFibGVzIHN0b3JlZCBpbiBnbG9iYWxzLCBhbmQgZXZlbiB2YXJpYWJsZXMgc3RvcmVkIGluIGluc3RhbmNlcy4KLXByaXZhdGUgdG8gdGhpcyBjbGFzcyBvbiBpbnN0YW5jZXMgb2YgXGVtcGh7b3RoZXJ9IGNsYXNzZXMuICBUcnVuY2F0aW9uCi1tYXkgb2NjdXIgd2hlbiB0aGUgbWFuZ2xlZCBuYW1lIHdvdWxkIGJlIGxvbmdlciB0aGFuIDI1NSBjaGFyYWN0ZXJzLgotT3V0c2lkZSBjbGFzc2VzLCBvciB3aGVuIHRoZSBjbGFzcyBuYW1lIGNvbnNpc3RzIG9mIG9ubHkgdW5kZXJzY29yZXMsCi1ubyBtYW5nbGluZyBvY2N1cnMuCi0KLU5hbWUgbWFuZ2xpbmcgaXMgaW50ZW5kZWQgdG8gZ2l2ZSBjbGFzc2VzIGFuIGVhc3kgd2F5IHRvIGRlZmluZQotYGBwcml2YXRlJycgaW5zdGFuY2UgdmFyaWFibGVzIGFuZCBtZXRob2RzLCB3aXRob3V0IGhhdmluZyB0byB3b3JyeQotYWJvdXQgaW5zdGFuY2UgdmFyaWFibGVzIGRlZmluZWQgYnkgZGVyaXZlZCBjbGFzc2VzLCBvciBtdWNraW5nIHdpdGgKLWluc3RhbmNlIHZhcmlhYmxlcyBieSBjb2RlIG91dHNpZGUgdGhlIGNsYXNzLiAgTm90ZSB0aGF0IHRoZSBtYW5nbGluZwotcnVsZXMgYXJlIGRlc2lnbmVkIG1vc3RseSB0byBhdm9pZCBhY2NpZGVudHM7IGl0IHN0aWxsIGlzIHBvc3NpYmxlIGZvcgotYSBkZXRlcm1pbmVkIHNvdWwgdG8gYWNjZXNzIG9yIG1vZGlmeSBhIHZhcmlhYmxlIHRoYXQgaXMgY29uc2lkZXJlZAotcHJpdmF0ZS4gIFRoaXMgY2FuIGV2ZW4gYmUgdXNlZnVsIGluIHNwZWNpYWwgY2lyY3Vtc3RhbmNlcywgc3VjaCBhcyBpbgotdGhlIGRlYnVnZ2VyLCBhbmQgdGhhdCdzIG9uZSByZWFzb24gd2h5IHRoaXMgbG9vcGhvbGUgaXMgbm90IGNsb3NlZC4KLShCdWdsZXQ6IGRlcml2YXRpb24gb2YgYSBjbGFzcyB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGJhc2UgY2xhc3MKLW1ha2VzIHVzZSBvZiBwcml2YXRlIHZhcmlhYmxlcyBvZiB0aGUgYmFzZSBjbGFzcyBwb3NzaWJsZS4pCi0KLU5vdGljZSB0aGF0IGNvZGUgcGFzc2VkIHRvIFxjb2Rle2V4ZWMoKX0gb3IgXGNvZGV7ZXZhbCgpfQotZG9lcyBub3QgY29uc2lkZXIgdGhlIGNsYXNzbmFtZSBvZiB0aGUgaW52b2tpbmcgCi1jbGFzcyB0byBiZSB0aGUgY3VycmVudCBjbGFzczsgdGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBlZmZlY3Qgb2YgdGhlIAotXGNvZGV7Z2xvYmFsfSBzdGF0ZW1lbnQsIHRoZSBlZmZlY3Qgb2Ygd2hpY2ggaXMgbGlrZXdpc2UgcmVzdHJpY3RlZCB0byAKLWNvZGUgdGhhdCBpcyBieXRlLWNvbXBpbGVkIHRvZ2V0aGVyLiAgVGhlIHNhbWUgcmVzdHJpY3Rpb24gYXBwbGllcyB0bwotXGNvZGV7Z2V0YXR0cigpfSwgXGNvZGV7c2V0YXR0cigpfSBhbmQgXGNvZGV7ZGVsYXR0cigpfSwgYXMgd2VsbCBhcwotd2hlbiByZWZlcmVuY2luZyBcY29kZXtfX2RpY3RfX30gZGlyZWN0bHkuCi0KLQotXHNlY3Rpb257T2RkcyBhbmQgRW5kcyBcbGFiZWx7b2Rkc319Ci0KLVNvbWV0aW1lcyBpdCBpcyB1c2VmdWwgdG8gaGF2ZSBhIGRhdGEgdHlwZSBzaW1pbGFyIHRvIHRoZSBQYXNjYWwKLWBgcmVjb3JkJycgb3IgQyBgYHN0cnVjdCcnLCBidW5kbGluZyB0b2dldGhlciBhIGZldyBuYW1lZCBkYXRhCi1pdGVtcy4gIEFuIGVtcHR5IGNsYXNzIGRlZmluaXRpb24gd2lsbCBkbyBuaWNlbHk6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWNsYXNzIEVtcGxveWVlOgotICAgIHBhc3MKLQotam9obiA9IEVtcGxveWVlKCkgIyBDcmVhdGUgYW4gZW1wdHkgZW1wbG95ZWUgcmVjb3JkCi0KLSMgRmlsbCB0aGUgZmllbGRzIG9mIHRoZSByZWNvcmQKLWpvaG4ubmFtZSA9ICdKb2huIERvZScKLWpvaG4uZGVwdCA9ICdjb21wdXRlciBsYWInCi1qb2huLnNhbGFyeSA9IDEwMDAKLVxlbmR7dmVyYmF0aW19Ci0KLUEgcGllY2Ugb2YgUHl0aG9uIGNvZGUgdGhhdCBleHBlY3RzIGEgcGFydGljdWxhciBhYnN0cmFjdCBkYXRhIHR5cGUKLWNhbiBvZnRlbiBiZSBwYXNzZWQgYSBjbGFzcyB0aGF0IGVtdWxhdGVzIHRoZSBtZXRob2RzIG9mIHRoYXQgZGF0YQotdHlwZSBpbnN0ZWFkLiAgRm9yIGluc3RhbmNlLCBpZiB5b3UgaGF2ZSBhIGZ1bmN0aW9uIHRoYXQgZm9ybWF0cyBzb21lCi1kYXRhIGZyb20gYSBmaWxlIG9iamVjdCwgeW91IGNhbiBkZWZpbmUgYSBjbGFzcyB3aXRoIG1ldGhvZHMKLVxtZXRob2R7cmVhZCgpfSBhbmQgXG1ldGhvZHtyZWFkbGluZSgpfSB0aGF0IGdldCB0aGUgZGF0YSBmcm9tIGEgc3RyaW5nCi1idWZmZXIgaW5zdGVhZCwgYW5kIHBhc3MgaXQgYXMgYW4gYXJndW1lbnQuJSAgKFVuZm9ydHVuYXRlbHksIHRoaXMKLSV0ZWNobmlxdWUgaGFzIGl0cyBsaW1pdGF0aW9uczogYSBjbGFzcyBjYW4ndCBkZWZpbmUgb3BlcmF0aW9ucyB0aGF0Ci0lYXJlIGFjY2Vzc2VkIGJ5IHNwZWNpYWwgc3ludGF4IHN1Y2ggYXMgc2VxdWVuY2Ugc3Vic2NyaXB0aW5nIG9yCi0lYXJpdGhtZXRpYyBvcGVyYXRvcnMsIGFuZCBhc3NpZ25pbmcgc3VjaCBhIGBgcHNldWRvLWZpbGUnJyB0bwotJVxjb2Rle3N5cy5zdGRpbn0gd2lsbCBub3QgY2F1c2UgdGhlIGludGVycHJldGVyIHRvIHJlYWQgZnVydGhlciBpbnB1dAotJWZyb20gaXQuKQotCi0KLUluc3RhbmNlIG1ldGhvZCBvYmplY3RzIGhhdmUgYXR0cmlidXRlcywgdG9vOiBcY29kZXttLmltX3NlbGZ9IGlzIHRoZQotaW5zdGFuY2Ugb2JqZWN0IHdpdGggdGhlIG1ldGhvZCBcbWV0aG9ke219LCBhbmQgXGNvZGV7bS5pbV9mdW5jfSBpcyB0aGUKLWZ1bmN0aW9uIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBtZXRob2QuCi0KLQotXHNlY3Rpb257RXhjZXB0aW9ucyBBcmUgQ2xhc3NlcyBUb29cbGFiZWx7ZXhjZXB0aW9uQ2xhc3Nlc319Ci0KLVVzZXItZGVmaW5lZCBleGNlcHRpb25zIGFyZSBpZGVudGlmaWVkIGJ5IGNsYXNzZXMgYXMgd2VsbC4gIFVzaW5nIHRoaXMKLW1lY2hhbmlzbSBpdCBpcyBwb3NzaWJsZSB0byBjcmVhdGUgZXh0ZW5zaWJsZSBoaWVyYXJjaGllcyBvZiBleGNlcHRpb25zLgotCi1UaGVyZSBhcmUgdHdvIG5ldyB2YWxpZCAoc2VtYW50aWMpIGZvcm1zIGZvciB0aGUgcmFpc2Ugc3RhdGVtZW50OgotCi1cYmVnaW57dmVyYmF0aW19Ci1yYWlzZSBDbGFzcywgaW5zdGFuY2UKLQotcmFpc2UgaW5zdGFuY2UKLVxlbmR7dmVyYmF0aW19Ci0KLUluIHRoZSBmaXJzdCBmb3JtLCBcY29kZXtpbnN0YW5jZX0gbXVzdCBiZSBhbiBpbnN0YW5jZSBvZgotXGNsYXNze0NsYXNzfSBvciBvZiBhIGNsYXNzIGRlcml2ZWQgZnJvbSBpdC4gIFRoZSBzZWNvbmQgZm9ybSBpcyBhCi1zaG9ydGhhbmQgZm9yOgotCi1cYmVnaW57dmVyYmF0aW19Ci1yYWlzZSBpbnN0YW5jZS5fX2NsYXNzX18sIGluc3RhbmNlCi1cZW5ke3ZlcmJhdGltfQotCi1BIGNsYXNzIGluIGFuIGV4Y2VwdCBjbGF1c2UgaXMgY29tcGF0aWJsZSB3aXRoIGFuIGV4Y2VwdGlvbiBpZiBpdCBpcyB0aGUgc2FtZQotY2xhc3Mgb3IgYSBiYXNlIGNsYXNzIHRoZXJlb2YgKGJ1dCBub3QgdGhlIG90aGVyIHdheSBhcm91bmQgLS0tIGFuCi1leGNlcHQgY2xhdXNlIGxpc3RpbmcgYSBkZXJpdmVkIGNsYXNzIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggYSBiYXNlCi1jbGFzcykuICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgcHJpbnQgQiwgQywgRCBpbiB0aGF0Ci1vcmRlcjoKLQotXGJlZ2lue3ZlcmJhdGltfQotY2xhc3MgQjoKLSAgICBwYXNzCi1jbGFzcyBDKEIpOgotICAgIHBhc3MKLWNsYXNzIEQoQyk6Ci0gICAgcGFzcwotCi1mb3IgYyBpbiBbQiwgQywgRF06Ci0gICAgdHJ5OgotICAgICAgICByYWlzZSBjKCkKLSAgICBleGNlcHQgRDoKLSAgICAgICAgcHJpbnQgIkQiCi0gICAgZXhjZXB0IEM6Ci0gICAgICAgIHByaW50ICJDIgotICAgIGV4Y2VwdCBCOgotICAgICAgICBwcmludCAiQiIKLVxlbmR7dmVyYmF0aW19Ci0KLU5vdGUgdGhhdCBpZiB0aGUgZXhjZXB0IGNsYXVzZXMgd2VyZSByZXZlcnNlZCAod2l0aAotXHNhbXB7ZXhjZXB0IEJ9IGZpcnN0KSwgaXQgd291bGQgaGF2ZSBwcmludGVkIEIsIEIsIEIgLS0tIHRoZSBmaXJzdAotbWF0Y2hpbmcgZXhjZXB0IGNsYXVzZSBpcyB0cmlnZ2VyZWQuCi0KLVdoZW4gYW4gZXJyb3IgbWVzc2FnZSBpcyBwcmludGVkIGZvciBhbiB1bmhhbmRsZWQgZXhjZXB0aW9uLCB0aGUKLWV4Y2VwdGlvbidzIGNsYXNzIG5hbWUgaXMgcHJpbnRlZCwgdGhlbiBhIGNvbG9uIGFuZCBhIHNwYWNlLCBhbmQKLWZpbmFsbHkgdGhlIGluc3RhbmNlIGNvbnZlcnRlZCB0byBhIHN0cmluZyB1c2luZyB0aGUgYnVpbHQtaW4gZnVuY3Rpb24KLVxmdW5jdGlvbntzdHIoKX0uCi0KLQotXHNlY3Rpb257SXRlcmF0b3JzXGxhYmVse2l0ZXJhdG9yc319Ci0KLUJ5IG5vdyB5b3UgaGF2ZSBwcm9iYWJseSBub3RpY2VkIHRoYXQgbW9zdCBjb250YWluZXIgb2JqZWN0cyBjYW4gYmUgbG9vcGVkCi1vdmVyIHVzaW5nIGEgXGtleXdvcmR7Zm9yfSBzdGF0ZW1lbnQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWZvciBlbGVtZW50IGluIFsxLCAyLCAzXToKLSAgICBwcmludCBlbGVtZW50Ci1mb3IgZWxlbWVudCBpbiAoMSwgMiwgMyk6Ci0gICAgcHJpbnQgZWxlbWVudAotZm9yIGtleSBpbiB7J29uZSc6MSwgJ3R3byc6Mn06Ci0gICAgcHJpbnQga2V5Ci1mb3IgY2hhciBpbiAiMTIzIjoKLSAgICBwcmludCBjaGFyCi1mb3IgbGluZSBpbiBvcGVuKCJteWZpbGUudHh0Iik6Ci0gICAgcHJpbnQgbGluZQotXGVuZHt2ZXJiYXRpbX0KLQotVGhpcyBzdHlsZSBvZiBhY2Nlc3MgaXMgY2xlYXIsIGNvbmNpc2UsIGFuZCBjb252ZW5pZW50LiAgVGhlIHVzZSBvZiBpdGVyYXRvcnMKLXBlcnZhZGVzIGFuZCB1bmlmaWVzIFB5dGhvbi4gIEJlaGluZCB0aGUgc2NlbmVzLCB0aGUgXGtleXdvcmR7Zm9yfQotc3RhdGVtZW50IGNhbGxzIFxmdW5jdGlvbntpdGVyKCl9IG9uIHRoZSBjb250YWluZXIgb2JqZWN0LiAgVGhlCi1mdW5jdGlvbiByZXR1cm5zIGFuIGl0ZXJhdG9yIG9iamVjdCB0aGF0IGRlZmluZXMgdGhlIG1ldGhvZAotXG1ldGhvZHtfX25leHRfXygpfSB3aGljaCBhY2Nlc3NlcyBlbGVtZW50cyBpbiB0aGUgY29udGFpbmVyIG9uZSBhdCBhCi10aW1lLiAgV2hlbiB0aGVyZSBhcmUgbm8gbW9yZSBlbGVtZW50cywgXG1ldGhvZHtfX25leHRfXygpfSByYWlzZXMgYQotXGV4Y2VwdGlvbntTdG9wSXRlcmF0aW9ufSBleGNlcHRpb24gd2hpY2ggdGVsbHMgdGhlIFxrZXl3b3Jke2Zvcn0gbG9vcAotdG8gdGVybWluYXRlLiAgWW91IGNhbiBjYWxsIHRoZSBcbWV0aG9ke19fbmV4dF9fKCl9IG1ldGhvZCB1c2luZyB0aGUKLVxmdW5jdGlvbntuZXh0KCl9IGJ1aWx0aW47IHRoaXMgZXhhbXBsZSBzaG93cyBob3cgaXQgYWxsIHdvcmtzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gcyA9ICdhYmMnCi0+Pj4gaXQgPSBpdGVyKHMpCi0+Pj4gaXQKLTxpdGVyYXRvciBvYmplY3QgYXQgMHgwMEExREI1MD4KLT4+PiBuZXh0KGl0KQotJ2EnCi0+Pj4gbmV4dChpdCkKLSdiJwotPj4+IG5leHQoaXQpCi0nYycKLT4+PiBuZXh0KGl0KQotCi1UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KLSAgICBuZXh0KGl0KQotU3RvcEl0ZXJhdGlvbgotXGVuZHt2ZXJiYXRpbX0KLQotSGF2aW5nIHNlZW4gdGhlIG1lY2hhbmljcyBiZWhpbmQgdGhlIGl0ZXJhdG9yIHByb3RvY29sLCBpdCBpcyBlYXN5IHRvIGFkZAotaXRlcmF0b3IgYmVoYXZpb3IgdG8geW91ciBjbGFzc2VzLiAgRGVmaW5lIGEgXG1ldGhvZHtfX2l0ZXJfXygpfSBtZXRob2QKLXdoaWNoIHJldHVybnMgYW4gb2JqZWN0IHdpdGggYSBcbWV0aG9ke19fbmV4dF9fKCl9IG1ldGhvZC4gIElmIHRoZSBjbGFzcyBkZWZpbmVzCi1cbWV0aG9ke19fbmV4dF9fKCl9LCB0aGVuIFxtZXRob2R7X19pdGVyX18oKX0gY2FuIGp1c3QgcmV0dXJuIFxjb2Rle3NlbGZ9OgotCi1cYmVnaW57dmVyYmF0aW19Ci1jbGFzcyBSZXZlcnNlOgotICAgICJJdGVyYXRvciBmb3IgbG9vcGluZyBvdmVyIGEgc2VxdWVuY2UgYmFja3dhcmRzIgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhKToKLSAgICAgICAgc2VsZi5kYXRhID0gZGF0YQotICAgICAgICBzZWxmLmluZGV4ID0gbGVuKGRhdGEpCi0gICAgZGVmIF9faXRlcl9fKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZgotICAgIGRlZiBfX25leHRfXyhzZWxmKToKLSAgICAgICAgaWYgc2VsZi5pbmRleCA9PSAwOgotICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgotICAgICAgICBzZWxmLmluZGV4ID0gc2VsZi5pbmRleCAtIDEKLSAgICAgICAgcmV0dXJuIHNlbGYuZGF0YVtzZWxmLmluZGV4XQotCi0+Pj4gZm9yIGNoYXIgaW4gUmV2ZXJzZSgnc3BhbScpOgotLi4uICAgICBwcmludCBjaGFyCi0uLi4KLW0KLWEKLXAKLXMKLVxlbmR7dmVyYmF0aW19Ci0KLQotXHNlY3Rpb257R2VuZXJhdG9yc1xsYWJlbHtnZW5lcmF0b3JzfX0KLQotR2VuZXJhdG9ycyBhcmUgYSBzaW1wbGUgYW5kIHBvd2VyZnVsIHRvb2wgZm9yIGNyZWF0aW5nIGl0ZXJhdG9ycy4gIFRoZXkgYXJlCi13cml0dGVuIGxpa2UgcmVndWxhciBmdW5jdGlvbnMgYnV0IHVzZSB0aGUgXGtleXdvcmR7eWllbGR9IHN0YXRlbWVudCB3aGVuZXZlcgotdGhleSB3YW50IHRvIHJldHVybiBkYXRhLiAgRWFjaCB0aW1lIFxmdW5jdGlvbntuZXh0KCl9IGlzIGNhbGxlZCBvbiBpdCwgdGhlCi1nZW5lcmF0b3IgcmVzdW1lcyB3aGVyZSBpdCBsZWZ0LW9mZiAoaXQgcmVtZW1iZXJzIGFsbCB0aGUgZGF0YSB2YWx1ZXMgYW5kCi13aGljaCBzdGF0ZW1lbnQgd2FzIGxhc3QgZXhlY3V0ZWQpLiAgQW4gZXhhbXBsZSBzaG93cyB0aGF0IGdlbmVyYXRvcnMgY2FuCi1iZSB0cml2aWFsbHkgZWFzeSB0byBjcmVhdGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWRlZiByZXZlcnNlKGRhdGEpOgotICAgIGZvciBpbmRleCBpbiByYW5nZShsZW4oZGF0YSktMSwgLTEsIC0xKToKLSAgICAgICAgeWllbGQgZGF0YVtpbmRleF0KLQkKLT4+PiBmb3IgY2hhciBpbiByZXZlcnNlKCdnb2xmJyk6Ci0uLi4gICAgIHByaW50IGNoYXIKLS4uLgotZgotbAotbwotZwkKLVxlbmR7dmVyYmF0aW19Ci0KLUFueXRoaW5nIHRoYXQgY2FuIGJlIGRvbmUgd2l0aCBnZW5lcmF0b3JzIGNhbiBhbHNvIGJlIGRvbmUgd2l0aCBjbGFzcyBiYXNlZAotaXRlcmF0b3JzIGFzIGRlc2NyaWJlZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbi4gIFdoYXQgbWFrZXMgZ2VuZXJhdG9ycyBzbwotY29tcGFjdCBpcyB0aGF0IHRoZSBcbWV0aG9ke19faXRlcl9fKCl9IGFuZCBcbWV0aG9ke19fbmV4dF9fKCl9IG1ldGhvZHMgYXJlCi1jcmVhdGVkIGF1dG9tYXRpY2FsbHkuCi0KLUFub3RoZXIga2V5IGZlYXR1cmUgaXMgdGhhdCB0aGUgbG9jYWwgdmFyaWFibGVzIGFuZCBleGVjdXRpb24gc3RhdGUKLWFyZSBhdXRvbWF0aWNhbGx5IHNhdmVkIGJldHdlZW4gY2FsbHMuICBUaGlzIG1hZGUgdGhlIGZ1bmN0aW9uIGVhc2llciB0byB3cml0ZQotYW5kIG11Y2ggbW9yZSBjbGVhciB0aGFuIGFuIGFwcHJvYWNoIHVzaW5nIGluc3RhbmNlIHZhcmlhYmxlcyBsaWtlCi1cY29kZXtzZWxmLmluZGV4fSBhbmQgXGNvZGV7c2VsZi5kYXRhfS4KLQotSW4gYWRkaXRpb24gdG8gYXV0b21hdGljIG1ldGhvZCBjcmVhdGlvbiBhbmQgc2F2aW5nIHByb2dyYW0gc3RhdGUsIHdoZW4KLWdlbmVyYXRvcnMgdGVybWluYXRlLCB0aGV5IGF1dG9tYXRpY2FsbHkgcmFpc2UgXGV4Y2VwdGlvbntTdG9wSXRlcmF0aW9ufS4KLUluIGNvbWJpbmF0aW9uLCB0aGVzZSBmZWF0dXJlcyBtYWtlIGl0IGVhc3kgdG8gY3JlYXRlIGl0ZXJhdG9ycyB3aXRoIG5vCi1tb3JlIGVmZm9ydCB0aGFuIHdyaXRpbmcgYSByZWd1bGFyIGZ1bmN0aW9uLgotCi1cc2VjdGlvbntHZW5lcmF0b3IgRXhwcmVzc2lvbnNcbGFiZWx7Z2VuZXhwc319Ci0KLVNvbWUgc2ltcGxlIGdlbmVyYXRvcnMgY2FuIGJlIGNvZGVkIHN1Y2NpbmN0bHkgYXMgZXhwcmVzc2lvbnMgdXNpbmcgYSBzeW50YXgKLXNpbWlsYXIgdG8gbGlzdCBjb21wcmVoZW5zaW9ucyBidXQgd2l0aCBwYXJlbnRoZXNlcyBpbnN0ZWFkIG9mIGJyYWNrZXRzLiAgVGhlc2UKLWV4cHJlc3Npb25zIGFyZSBkZXNpZ25lZCBmb3Igc2l0dWF0aW9ucyB3aGVyZSB0aGUgZ2VuZXJhdG9yIGlzIHVzZWQgcmlnaHQKLWF3YXkgYnkgYW4gZW5jbG9zaW5nIGZ1bmN0aW9uLiAgR2VuZXJhdG9yIGV4cHJlc3Npb25zIGFyZSBtb3JlIGNvbXBhY3QgYnV0Ci1sZXNzIHZlcnNhdGlsZSB0aGFuIGZ1bGwgZ2VuZXJhdG9yIGRlZmluaXRpb25zIGFuZCB0ZW5kIHRvIGJlIG1vcmUgbWVtb3J5Ci1mcmllbmRseSB0aGFuIGVxdWl2YWxlbnQgbGlzdCBjb21wcmVoZW5zaW9ucy4KLQotRXhhbXBsZXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBzdW0oaSppIGZvciBpIGluIHJhbmdlKDEwKSkgICAgICAgICAgICAgICAgICMgc3VtIG9mIHNxdWFyZXMKLTI4NQotCi0+Pj4geHZlYyA9IFsxMCwgMjAsIDMwXQotPj4+IHl2ZWMgPSBbNywgNSwgM10KLT4+PiBzdW0oeCp5IGZvciB4LHkgaW4gemlwKHh2ZWMsIHl2ZWMpKSAgICAgICAgICMgZG90IHByb2R1Y3QKLTI2MAotCi0+Pj4gZnJvbSBtYXRoIGltcG9ydCBwaSwgc2luCi0+Pj4gc2luZV90YWJsZSA9IGRpY3QoKHgsIHNpbih4KnBpLzE4MCkpIGZvciB4IGluIHJhbmdlKDAsIDkxKSkKLQotPj4+IHVuaXF1ZV93b3JkcyA9IHNldCh3b3JkICBmb3IgbGluZSBpbiBwYWdlICBmb3Igd29yZCBpbiBsaW5lLnNwbGl0KCkpCi0KLT4+PiB2YWxlZGljdG9yaWFuID0gbWF4KChzdHVkZW50LmdwYSwgc3R1ZGVudC5uYW1lKSBmb3Igc3R1ZGVudCBpbiBncmFkdWF0ZXMpCi0KLT4+PiBkYXRhID0gJ2dvbGYnCi0+Pj4gbGlzdChkYXRhW2ldIGZvciBpIGluIHJhbmdlKGxlbihkYXRhKS0xLC0xLC0xKSkKLVsnZicsICdsJywgJ28nLCAnZyddCi0KLVxlbmR7dmVyYmF0aW19Ci0KLQotCi1cY2hhcHRlcntCcmllZiBUb3VyIG9mIHRoZSBTdGFuZGFyZCBMaWJyYXJ5IFxsYWJlbHticmllZlRvdXJ9fQotCi0KLVxzZWN0aW9ue09wZXJhdGluZyBTeXN0ZW0gSW50ZXJmYWNlXGxhYmVse29zLWludGVyZmFjZX19Ci0KLVRoZSBcdWxpbmt7XG1vZHVsZXtvc319ey4uL2xpYi9tb2R1bGUtb3MuaHRtbH0KLW1vZHVsZSBwcm92aWRlcyBkb3plbnMgb2YgZnVuY3Rpb25zIGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZQotb3BlcmF0aW5nIHN5c3RlbToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGltcG9ydCBvcwotPj4+IG9zLnN5c3RlbSgndGltZSAwOjAyJykKLTAKLT4+PiBvcy5nZXRjd2QoKSAgICAgICMgUmV0dXJuIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5Ci0nQzpcXFB5dGhvbjMwJwotPj4+IG9zLmNoZGlyKCcvc2VydmVyL2FjY2Vzc2xvZ3MnKQotXGVuZHt2ZXJiYXRpbX0KLQotQmUgc3VyZSB0byB1c2UgdGhlIFxzYW1we2ltcG9ydCBvc30gc3R5bGUgaW5zdGVhZCBvZgotXHNhbXB7ZnJvbSBvcyBpbXBvcnQgKn0uICBUaGlzIHdpbGwga2VlcCBcZnVuY3Rpb257b3Mub3BlbigpfSBmcm9tCi1zaGFkb3dpbmcgdGhlIGJ1aWx0aW4gXGZ1bmN0aW9ue29wZW4oKX0gZnVuY3Rpb24gd2hpY2ggb3BlcmF0ZXMgbXVjaAotZGlmZmVyZW50bHkuCi0KLVxiaWZ1bmNpbmRleHtoZWxwfQotVGhlIGJ1aWx0aW4gXGZ1bmN0aW9ue2RpcigpfSBhbmQgXGZ1bmN0aW9ue2hlbHAoKX0gZnVuY3Rpb25zIGFyZSB1c2VmdWwKLWFzIGludGVyYWN0aXZlIGFpZHMgZm9yIHdvcmtpbmcgd2l0aCBsYXJnZSBtb2R1bGVzIGxpa2UgXG1vZHVsZXtvc306Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgb3MKLT4+PiBkaXIob3MpCi08cmV0dXJucyBhIGxpc3Qgb2YgYWxsIG1vZHVsZSBmdW5jdGlvbnM+Ci0+Pj4gaGVscChvcykKLTxyZXR1cm5zIGFuIGV4dGVuc2l2ZSBtYW51YWwgcGFnZSBjcmVhdGVkIGZyb20gdGhlIG1vZHVsZSdzIGRvY3N0cmluZ3M+Ci1cZW5ke3ZlcmJhdGltfQotCi1Gb3IgZGFpbHkgZmlsZSBhbmQgZGlyZWN0b3J5IG1hbmFnZW1lbnQgdGFza3MsIHRoZSAKLVx1bGlua3tcbW9kdWxle3NodXRpbH19ey4uL2xpYi9tb2R1bGUtc2h1dGlsLmh0bWx9Ci1tb2R1bGUgcHJvdmlkZXMgYSBoaWdoZXIgbGV2ZWwgaW50ZXJmYWNlIHRoYXQgaXMgZWFzaWVyIHRvIHVzZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGltcG9ydCBzaHV0aWwKLT4+PiBzaHV0aWwuY29weWZpbGUoJ2RhdGEuZGInLCAnYXJjaGl2ZS5kYicpCi0+Pj4gc2h1dGlsLm1vdmUoJy9idWlsZC9leGVjdXRhYmxlcycsICdpbnN0YWxsZGlyJykKLVxlbmR7dmVyYmF0aW19Ci0KLQotXHNlY3Rpb257RmlsZSBXaWxkY2FyZHNcbGFiZWx7ZmlsZS13aWxkY2FyZHN9fQotCi1UaGUgXHVsaW5re1xtb2R1bGV7Z2xvYn19ey4uL2xpYi9tb2R1bGUtZ2xvYi5odG1sfQotbW9kdWxlIHByb3ZpZGVzIGEgZnVuY3Rpb24gZm9yIG1ha2luZyBmaWxlIGxpc3RzIGZyb20gZGlyZWN0b3J5Ci13aWxkY2FyZCBzZWFyY2hlczoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGltcG9ydCBnbG9iCi0+Pj4gZ2xvYi5nbG9iKCcqLnB5JykKLVsncHJpbWVzLnB5JywgJ3JhbmRvbS5weScsICdxdW90ZS5weSddCi1cZW5ke3ZlcmJhdGltfQotCi0KLVxzZWN0aW9ue0NvbW1hbmQgTGluZSBBcmd1bWVudHNcbGFiZWx7Y29tbWFuZC1saW5lLWFyZ3VtZW50c319Ci0KLUNvbW1vbiB1dGlsaXR5IHNjcmlwdHMgb2Z0ZW4gbmVlZCB0byBwcm9jZXNzIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCi1UaGVzZSBhcmd1bWVudHMgYXJlIHN0b3JlZCBpbiB0aGUKLVx1bGlua3tcbW9kdWxle3N5c319ey4uL2xpYi9tb2R1bGUtc3lzLmh0bWx9XCBtb2R1bGUncyBcdmFye2FyZ3Z9Ci1hdHRyaWJ1dGUgYXMgYSBsaXN0LiAgRm9yIGluc3RhbmNlIHRoZSBmb2xsb3dpbmcgb3V0cHV0IHJlc3VsdHMgZnJvbQotcnVubmluZyBcc2FtcHtweXRob24gZGVtby5weSBvbmUgdHdvIHRocmVlfSBhdCB0aGUgY29tbWFuZCBsaW5lOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gaW1wb3J0IHN5cwotPj4+IHByaW50IHN5cy5hcmd2Ci1bJ2RlbW8ucHknLCAnb25lJywgJ3R3bycsICd0aHJlZSddCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgXHVsaW5re1xtb2R1bGV7Z2V0b3B0fX17Li4vbGliL21vZHVsZS1nZXRvcHQuaHRtbH0KLW1vZHVsZSBwcm9jZXNzZXMgXHZhcntzeXMuYXJndn0gdXNpbmcgdGhlIGNvbnZlbnRpb25zIG9mIHRoZSBcVU5JWHt9Ci1cZnVuY3Rpb257Z2V0b3B0KCl9IGZ1bmN0aW9uLiAgTW9yZSBwb3dlcmZ1bCBhbmQgZmxleGlibGUgY29tbWFuZCBsaW5lCi1wcm9jZXNzaW5nIGlzIHByb3ZpZGVkIGJ5IHRoZQotXHVsaW5re1xtb2R1bGV7b3B0cGFyc2V9fXsuLi9saWIvbW9kdWxlLW9wdHBhcnNlLmh0bWx9IG1vZHVsZS4KLQotCi1cc2VjdGlvbntFcnJvciBPdXRwdXQgUmVkaXJlY3Rpb24gYW5kIFByb2dyYW0gVGVybWluYXRpb25cbGFiZWx7c3RkZXJyfX0KLQotVGhlIFx1bGlua3tcbW9kdWxle3N5c319ey4uL2xpYi9tb2R1bGUtc3lzLmh0bWx9Ci1tb2R1bGUgYWxzbyBoYXMgYXR0cmlidXRlcyBmb3IgXHZhcntzdGRpbn0sIFx2YXJ7c3Rkb3V0fSwgYW5kCi1cdmFye3N0ZGVycn0uICBUaGUgbGF0dGVyIGlzIHVzZWZ1bCBmb3IgZW1pdHRpbmcgd2FybmluZ3MgYW5kIGVycm9yCi1tZXNzYWdlcyB0byBtYWtlIHRoZW0gdmlzaWJsZSBldmVuIHdoZW4gXHZhcntzdGRvdXR9IGhhcyBiZWVuIHJlZGlyZWN0ZWQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBzeXMuc3RkZXJyLndyaXRlKCdXYXJuaW5nLCBsb2cgZmlsZSBub3QgZm91bmQgc3RhcnRpbmcgYSBuZXcgb25lXG4nKQotV2FybmluZywgbG9nIGZpbGUgbm90IGZvdW5kIHN0YXJ0aW5nIGEgbmV3IG9uZQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIG1vc3QgZGlyZWN0IHdheSB0byB0ZXJtaW5hdGUgYSBzY3JpcHQgaXMgdG8gdXNlIFxzYW1we3N5cy5leGl0KCl9LgotCi0KLVxzZWN0aW9ue1N0cmluZyBQYXR0ZXJuIE1hdGNoaW5nXGxhYmVse3N0cmluZy1wYXR0ZXJuLW1hdGNoaW5nfX0KLQotVGhlIFx1bGlua3tcbW9kdWxle3JlfX17Li4vbGliL21vZHVsZS1yZS5odG1sfQotbW9kdWxlIHByb3ZpZGVzIHJlZ3VsYXIgZXhwcmVzc2lvbiB0b29scyBmb3IgYWR2YW5jZWQgc3RyaW5nIHByb2Nlc3NpbmcuCi1Gb3IgY29tcGxleCBtYXRjaGluZyBhbmQgbWFuaXB1bGF0aW9uLCByZWd1bGFyIGV4cHJlc3Npb25zIG9mZmVyIHN1Y2NpbmN0LAotb3B0aW1pemVkIHNvbHV0aW9uczoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGltcG9ydCByZQotPj4+IHJlLmZpbmRhbGwocidcYmZbYS16XSonLCAnd2hpY2ggZm9vdCBvciBoYW5kIGZlbGwgZmFzdGVzdCcpCi1bJ2Zvb3QnLCAnZmVsbCcsICdmYXN0ZXN0J10KLT4+PiByZS5zdWIocicoXGJbYS16XSspIFwxJywgcidcMScsICdjYXQgaW4gdGhlIHRoZSBoYXQnKQotJ2NhdCBpbiB0aGUgaGF0JwotXGVuZHt2ZXJiYXRpbX0KLQotV2hlbiBvbmx5IHNpbXBsZSBjYXBhYmlsaXRpZXMgYXJlIG5lZWRlZCwgc3RyaW5nIG1ldGhvZHMgYXJlIHByZWZlcnJlZAotYmVjYXVzZSB0aGV5IGFyZSBlYXNpZXIgdG8gcmVhZCBhbmQgZGVidWc6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiAndGVhIGZvciB0b28nLnJlcGxhY2UoJ3RvbycsICd0d28nKQotJ3RlYSBmb3IgdHdvJwotXGVuZHt2ZXJiYXRpbX0KLQotXHNlY3Rpb257TWF0aGVtYXRpY3NcbGFiZWx7bWF0aGVtYXRpY3N9fQotCi1UaGUgXHVsaW5re1xtb2R1bGV7bWF0aH19ey4uL2xpYi9tb2R1bGUtbWF0aC5odG1sfSBtb2R1bGUgZ2l2ZXMKLWFjY2VzcyB0byB0aGUgdW5kZXJseWluZyBDIGxpYnJhcnkgZnVuY3Rpb25zIGZvciBmbG9hdGluZyBwb2ludCBtYXRoOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gaW1wb3J0IG1hdGgKLT4+PiBtYXRoLmNvcyhtYXRoLnBpIC8gNC4wKQotMC43MDcxMDY3ODExODY1NDc1NwotPj4+IG1hdGgubG9nKDEwMjQsIDIpCi0xMC4wCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgXHVsaW5re1xtb2R1bGV7cmFuZG9tfX17Li4vbGliL21vZHVsZS1yYW5kb20uaHRtbH0KLW1vZHVsZSBwcm92aWRlcyB0b29scyBmb3IgbWFraW5nIHJhbmRvbSBzZWxlY3Rpb25zOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gaW1wb3J0IHJhbmRvbQotPj4+IHJhbmRvbS5jaG9pY2UoWydhcHBsZScsICdwZWFyJywgJ2JhbmFuYSddKQotJ2FwcGxlJwotPj4+IHJhbmRvbS5zYW1wbGUocmFuZ2UoMTAwKSwgMTApICAgIyBzYW1wbGluZyB3aXRob3V0IHJlcGxhY2VtZW50Ci1bMzAsIDgzLCAxNiwgNCwgOCwgODEsIDQxLCA1MCwgMTgsIDMzXQotPj4+IHJhbmRvbS5yYW5kb20oKSAgICAjIHJhbmRvbSBmbG9hdAotMC4xNzk3MDk4NzY5MzcwNjE4NgotPj4+IHJhbmRvbS5yYW5kcmFuZ2UoNikgICAgIyByYW5kb20gaW50ZWdlciBjaG9zZW4gZnJvbSByYW5nZSg2KQotNCAgIAotXGVuZHt2ZXJiYXRpbX0KLQotCi1cc2VjdGlvbntJbnRlcm5ldCBBY2Nlc3NcbGFiZWx7aW50ZXJuZXQtYWNjZXNzfX0KLQotVGhlcmUgYXJlIGEgbnVtYmVyIG9mIG1vZHVsZXMgZm9yIGFjY2Vzc2luZyB0aGUgaW50ZXJuZXQgYW5kIHByb2Nlc3NpbmcKLWludGVybmV0IHByb3RvY29scy4gVHdvIG9mIHRoZSBzaW1wbGVzdCBhcmUKLVx1bGlua3tcbW9kdWxle3VybGxpYjJ9fXsuLi9saWIvbW9kdWxlLXVybGxpYjIuaHRtbH0KLWZvciByZXRyaWV2aW5nIGRhdGEgZnJvbSB1cmxzIGFuZAotXHVsaW5re1xtb2R1bGV7c210cGxpYn19ey4uL2xpYi9tb2R1bGUtc210cGxpYi5odG1sfSAKLWZvciBzZW5kaW5nIG1haWw6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgdXJsbGliMgotPj4+IGZvciBsaW5lIGluIHVybGxpYjIudXJsb3BlbignaHR0cDovL3R5Y2hvLnVzbm8ubmF2eS5taWwvY2dpLWJpbi90aW1lci5wbCcpOgotLi4uICAgICBpZiAnRVNUJyBpbiBsaW5lIG9yICdFRFQnIGluIGxpbmU6ICAjIGxvb2sgZm9yIEVhc3Rlcm4gVGltZQotLi4uICAgICAgICAgcHJpbnQgbGluZQotICAgIAotPEJSPk5vdi4gMjUsIDA5OjQzOjMyIFBNIEVTVAotCi0+Pj4gaW1wb3J0IHNtdHBsaWIKLT4+PiBzZXJ2ZXIgPSBzbXRwbGliLlNNVFAoJ2xvY2FsaG9zdCcpCi0+Pj4gc2VydmVyLnNlbmRtYWlsKCdzb290aHNheWVyQGV4YW1wbGUub3JnJywgJ2pjYWVzYXJAZXhhbXBsZS5vcmcnLAotIiIiVG86IGpjYWVzYXJAZXhhbXBsZS5vcmcKLUZyb206IHNvb3Roc2F5ZXJAZXhhbXBsZS5vcmcKLQotQmV3YXJlIHRoZSBJZGVzIG9mIE1hcmNoLgotIiIiKQotPj4+IHNlcnZlci5xdWl0KCkKLVxlbmR7dmVyYmF0aW19Ci0KLQotXHNlY3Rpb257RGF0ZXMgYW5kIFRpbWVzXGxhYmVse2RhdGVzLWFuZC10aW1lc319Ci0KLVRoZSBcdWxpbmt7XG1vZHVsZXtkYXRldGltZX19ey4uL2xpYi9tb2R1bGUtZGF0ZXRpbWUuaHRtbH0gbW9kdWxlCi1zdXBwbGllcyBjbGFzc2VzIGZvciBtYW5pcHVsYXRpbmcgZGF0ZXMgYW5kIHRpbWVzIGluIGJvdGggc2ltcGxlCi1hbmQgY29tcGxleCB3YXlzLiBXaGlsZSBkYXRlIGFuZCB0aW1lIGFyaXRobWV0aWMgaXMgc3VwcG9ydGVkLCB0aGUKLWZvY3VzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBvbiBlZmZpY2llbnQgbWVtYmVyIGV4dHJhY3Rpb24gZm9yCi1vdXRwdXQgZm9ybWF0dGluZyBhbmQgbWFuaXB1bGF0aW9uLiAgVGhlIG1vZHVsZSBhbHNvIHN1cHBvcnRzIG9iamVjdHMKLXRoYXQgYXJlIHRpbWV6b25lIGF3YXJlLgotCi1cYmVnaW57dmVyYmF0aW19Ci0jIGRhdGVzIGFyZSBlYXNpbHkgY29uc3RydWN0ZWQgYW5kIGZvcm1hdHRlZAotPj4+IGZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGUKLT4+PiBub3cgPSBkYXRlLnRvZGF5KCkKLT4+PiBub3cKLWRhdGV0aW1lLmRhdGUoMjAwMywgMTIsIDIpCi0+Pj4gbm93LnN0cmZ0aW1lKCIlbS0lZC0leS4gJWQgJWIgJVkgaXMgYSAlQSBvbiB0aGUgJWQgZGF5IG9mICVCLiIpCi0nMTItMDItMDMuIDAyIERlYyAyMDAzIGlzIGEgVHVlc2RheSBvbiB0aGUgMDIgZGF5IG9mIERlY2VtYmVyLicKLQotIyBkYXRlcyBzdXBwb3J0IGNhbGVuZGFyIGFyaXRobWV0aWMKLT4+PiBiaXJ0aGRheSA9IGRhdGUoMTk2NCwgNywgMzEpCi0+Pj4gYWdlID0gbm93IC0gYmlydGhkYXkKLT4+PiBhZ2UuZGF5cwotMTQzNjgKLVxlbmR7dmVyYmF0aW19Ci0KLQotXHNlY3Rpb257RGF0YSBDb21wcmVzc2lvblxsYWJlbHtkYXRhLWNvbXByZXNzaW9ufX0KLQotQ29tbW9uIGRhdGEgYXJjaGl2aW5nIGFuZCBjb21wcmVzc2lvbiBmb3JtYXRzIGFyZSBkaXJlY3RseSBzdXBwb3J0ZWQKLWJ5IG1vZHVsZXMgaW5jbHVkaW5nOgotXHVsaW5re1xtb2R1bGV7emxpYn19ey4uL2xpYi9tb2R1bGUtemxpYi5odG1sfSwKLVx1bGlua3tcbW9kdWxle2d6aXB9fXsuLi9saWIvbW9kdWxlLWd6aXAuaHRtbH0sCi1cdWxpbmt7XG1vZHVsZXtiejJ9fXsuLi9saWIvbW9kdWxlLWJ6Mi5odG1sfSwKLVx1bGlua3tcbW9kdWxle3ppcGZpbGV9fXsuLi9saWIvbW9kdWxlLXppcGZpbGUuaHRtbH0sIGFuZAotXHVsaW5re1xtb2R1bGV7dGFyZmlsZX19ey4uL2xpYi9tb2R1bGUtdGFyZmlsZS5odG1sfS4KLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGltcG9ydCB6bGliCi0+Pj4gcyA9ICd3aXRjaCB3aGljaCBoYXMgd2hpY2ggd2l0Y2hlcyB3cmlzdCB3YXRjaCcKLT4+PiBsZW4ocykKLTQxCi0+Pj4gdCA9IHpsaWIuY29tcHJlc3MocykKLT4+PiBsZW4odCkKLTM3Ci0+Pj4gemxpYi5kZWNvbXByZXNzKHQpCi0nd2l0Y2ggd2hpY2ggaGFzIHdoaWNoIHdpdGNoZXMgd3Jpc3Qgd2F0Y2gnCi0+Pj4gemxpYi5jcmMzMihzKQotMjI2ODA1OTc5Ci1cZW5ke3ZlcmJhdGltfQotCi0KLVxzZWN0aW9ue1BlcmZvcm1hbmNlIE1lYXN1cmVtZW50XGxhYmVse3BlcmZvcm1hbmNlLW1lYXN1cmVtZW50fX0KLQotU29tZSBQeXRob24gdXNlcnMgZGV2ZWxvcCBhIGRlZXAgaW50ZXJlc3QgaW4ga25vd2luZyB0aGUgcmVsYXRpdmUKLXBlcmZvcm1hbmNlIG9mIGRpZmZlcmVudCBhcHByb2FjaGVzIHRvIHRoZSBzYW1lIHByb2JsZW0uCi1QeXRob24gcHJvdmlkZXMgYSBtZWFzdXJlbWVudCB0b29sIHRoYXQgYW5zd2VycyB0aG9zZSBxdWVzdGlvbnMKLWltbWVkaWF0ZWx5LgotCi1Gb3IgZXhhbXBsZSwgaXQgbWF5IGJlIHRlbXB0aW5nIHRvIHVzZSB0aGUgdHVwbGUgcGFja2luZyBhbmQgdW5wYWNraW5nCi1mZWF0dXJlIGluc3RlYWQgb2YgdGhlIHRyYWRpdGlvbmFsIGFwcHJvYWNoIHRvIHN3YXBwaW5nIGFyZ3VtZW50cy4KLVRoZSBcdWxpbmt7XG1vZHVsZXt0aW1laXR9fXsuLi9saWIvbW9kdWxlLXRpbWVpdC5odG1sfSBtb2R1bGUKLXF1aWNrbHkgZGVtb25zdHJhdGVzIGEgbW9kZXN0IHBlcmZvcm1hbmNlIGFkdmFudGFnZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGZyb20gdGltZWl0IGltcG9ydCBUaW1lcgotPj4+IFRpbWVyKCd0PWE7IGE9YjsgYj10JywgJ2E9MTsgYj0yJykudGltZWl0KCkKLTAuNTc1MzU4Mjg2MjYwMjQ1NzcKLT4+PiBUaW1lcignYSxiID0gYixhJywgJ2E9MTsgYj0yJykudGltZWl0KCkKLTAuNTQ5NjI1MzcwODU3NzA3OTEKLVxlbmR7dmVyYmF0aW19Ci0KLUluIGNvbnRyYXN0IHRvIFxtb2R1bGV7dGltZWl0fSdzIGZpbmUgbGV2ZWwgb2YgZ3JhbnVsYXJpdHksIHRoZQotXHVsaW5re1xtb2R1bGV7cHJvZmlsZX19ey4uL2xpYi9tb2R1bGUtcHJvZmlsZS5odG1sfSBhbmQgXG1vZHVsZXtwc3RhdHN9Ci1tb2R1bGVzIHByb3ZpZGUgdG9vbHMgZm9yIGlkZW50aWZ5aW5nIHRpbWUgY3JpdGljYWwgc2VjdGlvbnMgaW4gbGFyZ2VyIGJsb2Nrcwotb2YgY29kZS4KLQotCi1cc2VjdGlvbntRdWFsaXR5IENvbnRyb2xcbGFiZWx7cXVhbGl0eS1jb250cm9sfX0KLQotT25lIGFwcHJvYWNoIGZvciBkZXZlbG9waW5nIGhpZ2ggcXVhbGl0eSBzb2Z0d2FyZSBpcyB0byB3cml0ZSB0ZXN0cyBmb3IKLWVhY2ggZnVuY3Rpb24gYXMgaXQgaXMgZGV2ZWxvcGVkIGFuZCB0byBydW4gdGhvc2UgdGVzdHMgZnJlcXVlbnRseSBkdXJpbmcKLXRoZSBkZXZlbG9wbWVudCBwcm9jZXNzLgotCi1UaGUgXHVsaW5re1xtb2R1bGV7ZG9jdGVzdH19ey4uL2xpYi9tb2R1bGUtZG9jdGVzdC5odG1sfSBtb2R1bGUgcHJvdmlkZXMKLWEgdG9vbCBmb3Igc2Nhbm5pbmcgYSBtb2R1bGUgYW5kIHZhbGlkYXRpbmcgdGVzdHMgZW1iZWRkZWQgaW4gYSBwcm9ncmFtJ3MKLWRvY3N0cmluZ3MuICBUZXN0IGNvbnN0cnVjdGlvbiBpcyBhcyBzaW1wbGUgYXMgY3V0dGluZy1hbmQtcGFzdGluZyBhCi10eXBpY2FsIGNhbGwgYWxvbmcgd2l0aCBpdHMgcmVzdWx0cyBpbnRvIHRoZSBkb2NzdHJpbmcuICBUaGlzIGltcHJvdmVzCi10aGUgZG9jdW1lbnRhdGlvbiBieSBwcm92aWRpbmcgdGhlIHVzZXIgd2l0aCBhbiBleGFtcGxlIGFuZCBpdCBhbGxvd3MgdGhlCi1kb2N0ZXN0IG1vZHVsZSB0byBtYWtlIHN1cmUgdGhlIGNvZGUgcmVtYWlucyB0cnVlIHRvIHRoZSBkb2N1bWVudGF0aW9uOgotCi1cYmVnaW57dmVyYmF0aW19Ci1kZWYgYXZlcmFnZSh2YWx1ZXMpOgotICAgICIiIkNvbXB1dGVzIHRoZSBhcml0aG1ldGljIG1lYW4gb2YgYSBsaXN0IG9mIG51bWJlcnMuCi0KLSAgICA+Pj4gcHJpbnQgYXZlcmFnZShbMjAsIDMwLCA3MF0pCi0gICAgNDAuMAotICAgICIiIgotICAgIHJldHVybiBzdW0odmFsdWVzLCAwLjApIC8gbGVuKHZhbHVlcykKLQotaW1wb3J0IGRvY3Rlc3QKLWRvY3Rlc3QudGVzdG1vZCgpICAgIyBhdXRvbWF0aWNhbGx5IHZhbGlkYXRlIHRoZSBlbWJlZGRlZCB0ZXN0cwotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIFx1bGlua3tcbW9kdWxle3VuaXR0ZXN0fX17Li4vbGliL21vZHVsZS11bml0dGVzdC5odG1sfSBtb2R1bGUgaXMgbm90Ci1hcyBlZmZvcnRsZXNzIGFzIHRoZSBcbW9kdWxle2RvY3Rlc3R9IG1vZHVsZSwgYnV0IGl0IGFsbG93cyBhIG1vcmUKLWNvbXByZWhlbnNpdmUgc2V0IG9mIHRlc3RzIHRvIGJlIG1haW50YWluZWQgaW4gYSBzZXBhcmF0ZSBmaWxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgdW5pdHRlc3QKLQotY2xhc3MgVGVzdFN0YXRpc3RpY2FsRnVuY3Rpb25zKHVuaXR0ZXN0LlRlc3RDYXNlKToKLQotICAgIGRlZiB0ZXN0X2F2ZXJhZ2Uoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXZlcmFnZShbMjAsIDMwLCA3MF0pLCA0MC4wKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKGF2ZXJhZ2UoWzEsIDUsIDddKSwgMSksIDQuMykKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIGF2ZXJhZ2UsIFtdKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGF2ZXJhZ2UsIDIwLCAzMCwgNzApCi0KLXVuaXR0ZXN0Lm1haW4oKSAjIENhbGxpbmcgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGludm9rZXMgYWxsIHRlc3RzCi1cZW5ke3ZlcmJhdGltfQotCi1cc2VjdGlvbntCYXR0ZXJpZXMgSW5jbHVkZWRcbGFiZWx7YmF0dGVyaWVzLWluY2x1ZGVkfX0KLQotUHl0aG9uIGhhcyBhIGBgYmF0dGVyaWVzIGluY2x1ZGVkJycgcGhpbG9zb3BoeS4gIFRoaXMgaXMgYmVzdCBzZWVuCi10aHJvdWdoIHRoZSBzb3BoaXN0aWNhdGVkIGFuZCByb2J1c3QgY2FwYWJpbGl0aWVzIG9mIGl0cyBsYXJnZXIKLXBhY2thZ2VzLiBGb3IgZXhhbXBsZToKLQotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSBUaGUgXHVsaW5re1xtb2R1bGV7eG1scnBjbGlifX17Li4vbGliL21vZHVsZS14bWxycGNsaWIuaHRtbH0gYW5kCi0gIFx1bGlua3tcbW9kdWxle1NpbXBsZVhNTFJQQ1NlcnZlcn19ey4uL2xpYi9tb2R1bGUtU2ltcGxlWE1MUlBDU2VydmVyLmh0bWx9Ci0gIG1vZHVsZXMgbWFrZSBpbXBsZW1lbnRpbmcgcmVtb3RlIHByb2NlZHVyZSBjYWxscyBpbnRvIGFuIGFsbW9zdCB0cml2aWFsIHRhc2suCi0gIERlc3BpdGUgdGhlIG1vZHVsZXMgbmFtZXMsIG5vIGRpcmVjdCBrbm93bGVkZ2Ugb3IgaGFuZGxpbmcgb2YgWE1MIGlzIG5lZWRlZC4KLVxpdGVtIFRoZSBcdWxpbmt7XG1vZHVsZXtlbWFpbH19ey4uL2xpYi9tb2R1bGUtZW1haWwuaHRtbH0gcGFja2FnZSBpcyBhIGxpYnJhcnkKLSAgZm9yIG1hbmFnaW5nIGVtYWlsIG1lc3NhZ2VzLCBpbmNsdWRpbmcgTUlNRSBhbmQgb3RoZXIgUkZDIDI4MjItYmFzZWQgbWVzc2FnZQotICBkb2N1bWVudHMuIFVubGlrZSBcbW9kdWxle3NtdHBsaWJ9IGFuZCBcbW9kdWxle3BvcGxpYn0gd2hpY2ggYWN0dWFsbHkgc2VuZAotICBhbmQgcmVjZWl2ZSBtZXNzYWdlcywgdGhlIGVtYWlsIHBhY2thZ2UgaGFzIGEgY29tcGxldGUgdG9vbHNldCBmb3IgYnVpbGRpbmcKLSAgb3IgZGVjb2RpbmcgY29tcGxleCBtZXNzYWdlIHN0cnVjdHVyZXMgKGluY2x1ZGluZyBhdHRhY2htZW50cykgYW5kIGZvcgotICBpbXBsZW1lbnRpbmcgaW50ZXJuZXQgZW5jb2RpbmcgYW5kIGhlYWRlciBwcm90b2NvbHMuCi1caXRlbSBUaGUgXHVsaW5re1xtb2R1bGV7eG1sLmRvbX19ey4uL2xpYi9tb2R1bGUteG1sLmRvbS5odG1sfSBhbmQKLSAgXHVsaW5re1xtb2R1bGV7eG1sLnNheH19ey4uL2xpYi9tb2R1bGUteG1sLnNheC5odG1sfSBwYWNrYWdlcyBwcm92aWRlIHJvYnVzdAotICBzdXBwb3J0IGZvciBwYXJzaW5nIHRoaXMgcG9wdWxhciBkYXRhIGludGVyY2hhbmdlIGZvcm1hdC4gTGlrZXdpc2UsIHRoZQotICBcdWxpbmt7XG1vZHVsZXtjc3Z9fXsuLi9saWIvbW9kdWxlLWNzdi5odG1sfSBtb2R1bGUgc3VwcG9ydHMgZGlyZWN0IHJlYWRzIGFuZAotICB3cml0ZXMgaW4gYSBjb21tb24gZGF0YWJhc2UgZm9ybWF0LiBUb2dldGhlciwgdGhlc2UgbW9kdWxlcyBhbmQgcGFja2FnZXMKLSAgZ3JlYXRseSBzaW1wbGlmeSBkYXRhIGludGVyY2hhbmdlIGJldHdlZW4gcHl0aG9uIGFwcGxpY2F0aW9ucyBhbmQgb3RoZXIKLSAgdG9vbHMuCi1caXRlbSBJbnRlcm5hdGlvbmFsaXphdGlvbiBpcyBzdXBwb3J0ZWQgYnkgYSBudW1iZXIgb2YgbW9kdWxlcyBpbmNsdWRpbmcKLSAgXHVsaW5re1xtb2R1bGV7Z2V0dGV4dH19ey4uL2xpYi9tb2R1bGUtZ2V0dGV4dC5odG1sfSwKLSAgXHVsaW5re1xtb2R1bGV7bG9jYWxlfX17Li4vbGliL21vZHVsZS1sb2NhbGUuaHRtbH0sIGFuZCB0aGUKLSAgXHVsaW5re1xtb2R1bGV7Y29kZWNzfX17Li4vbGliL21vZHVsZS1jb2RlY3MuaHRtbH0gcGFja2FnZS4KLVxlbmR7aXRlbWl6ZX0KLQotXGNoYXB0ZXJ7QnJpZWYgVG91ciBvZiB0aGUgU3RhbmRhcmQgTGlicmFyeSAtLSBQYXJ0IElJXGxhYmVse2JyaWVmVG91clR3b319Ci0KLVRoaXMgc2Vjb25kIHRvdXIgY292ZXJzIG1vcmUgYWR2YW5jZWQgbW9kdWxlcyB0aGF0IHN1cHBvcnQgcHJvZmVzc2lvbmFsCi1wcm9ncmFtbWluZyBuZWVkcy4gIFRoZXNlIG1vZHVsZXMgcmFyZWx5IG9jY3VyIGluIHNtYWxsIHNjcmlwdHMuCi0KLQotXHNlY3Rpb257T3V0cHV0IEZvcm1hdHRpbmdcbGFiZWx7b3V0cHV0LWZvcm1hdHRpbmd9fQotCi1UaGUgXHVsaW5re1xtb2R1bGV7cmVwcn19ey4uL2xpYi9tb2R1bGUtcmVwci5odG1sfSBtb2R1bGUgcHJvdmlkZXMgYQotdmVyc2lvbiBvZiBcZnVuY3Rpb257cmVwcigpfSBjdXN0b21pemVkIGZvciBhYmJyZXZpYXRlZCBkaXNwbGF5cyBvZiBsYXJnZQotb3IgZGVlcGx5IG5lc3RlZCBjb250YWluZXJzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgPj4+IGltcG9ydCByZXByICAgCi0gICAgPj4+IHJlcHIucmVwcihzZXQoJ3N1cGVyY2FsaWZyYWdpbGlzdGljZXhwaWFsaWRvY2lvdXMnKSkKLSAgICAic2V0KFsnYScsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAuLi5dKSIKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBcdWxpbmt7XG1vZHVsZXtwcHJpbnR9fXsuLi9saWIvbW9kdWxlLXBwcmludC5odG1sfSBtb2R1bGUgb2ZmZXJzCi1tb3JlIHNvcGhpc3RpY2F0ZWQgY29udHJvbCBvdmVyIHByaW50aW5nIGJvdGggYnVpbHQtaW4gYW5kIHVzZXIgZGVmaW5lZAotb2JqZWN0cyBpbiBhIHdheSB0aGF0IGlzIHJlYWRhYmxlIGJ5IHRoZSBpbnRlcnByZXRlci4gIFdoZW4gdGhlIHJlc3VsdAotaXMgbG9uZ2VyIHRoYW4gb25lIGxpbmUsIHRoZSBgYHByZXR0eSBwcmludGVyJycgYWRkcyBsaW5lIGJyZWFrcyBhbmQKLWluZGVudGF0aW9uIHRvIG1vcmUgY2xlYXJseSByZXZlYWwgZGF0YSBzdHJ1Y3R1cmU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICA+Pj4gaW1wb3J0IHBwcmludAotICAgID4+PiB0ID0gW1tbWydibGFjaycsICdjeWFuJ10sICd3aGl0ZScsIFsnZ3JlZW4nLCAncmVkJ11dLCBbWydtYWdlbnRhJywKLSAgICAuLi4gICAgICd5ZWxsb3cnXSwgJ2JsdWUnXV1dCi0gICAgLi4uCi0gICAgPj4+IHBwcmludC5wcHJpbnQodCwgd2lkdGg9MzApCi0gICAgW1tbWydibGFjaycsICdjeWFuJ10sCi0gICAgICAgJ3doaXRlJywKLSAgICAgICBbJ2dyZWVuJywgJ3JlZCddXSwKLSAgICAgIFtbJ21hZ2VudGEnLCAneWVsbG93J10sCi0gICAgICAgJ2JsdWUnXV1dCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgXHVsaW5re1xtb2R1bGV7dGV4dHdyYXB9fXsuLi9saWIvbW9kdWxlLXRleHR3cmFwLmh0bWx9IG1vZHVsZQotZm9ybWF0cyBwYXJhZ3JhcGhzIG9mIHRleHQgdG8gZml0IGEgZ2l2ZW4gc2NyZWVuIHdpZHRoOgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgPj4+IGltcG9ydCB0ZXh0d3JhcAotICAgID4+PiBkb2MgPSAiIiJUaGUgd3JhcCgpIG1ldGhvZCBpcyBqdXN0IGxpa2UgZmlsbCgpIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMKLSAgICAuLi4gYSBsaXN0IG9mIHN0cmluZ3MgaW5zdGVhZCBvZiBvbmUgYmlnIHN0cmluZyB3aXRoIG5ld2xpbmVzIHRvIHNlcGFyYXRlCi0gICAgLi4uIHRoZSB3cmFwcGVkIGxpbmVzLiIiIgotICAgIC4uLgotICAgID4+PiBwcmludCB0ZXh0d3JhcC5maWxsKGRvYywgd2lkdGg9NDApCi0gICAgVGhlIHdyYXAoKSBtZXRob2QgaXMganVzdCBsaWtlIGZpbGwoKQotICAgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgYSBsaXN0IG9mIHN0cmluZ3MKLSAgICBpbnN0ZWFkIG9mIG9uZSBiaWcgc3RyaW5nIHdpdGggbmV3bGluZXMKLSAgICB0byBzZXBhcmF0ZSB0aGUgd3JhcHBlZCBsaW5lcy4KLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBcdWxpbmt7XG1vZHVsZXtsb2NhbGV9fXsuLi9saWIvbW9kdWxlLWxvY2FsZS5odG1sfSBtb2R1bGUgYWNjZXNzZXMKLWEgZGF0YWJhc2Ugb2YgY3VsdHVyZSBzcGVjaWZpYyBkYXRhIGZvcm1hdHMuICBUaGUgZ3JvdXBpbmcgYXR0cmlidXRlCi1vZiBsb2NhbGUncyBmb3JtYXQgZnVuY3Rpb24gcHJvdmlkZXMgYSBkaXJlY3Qgd2F5IG9mIGZvcm1hdHRpbmcgbnVtYmVycwotd2l0aCBncm91cCBzZXBhcmF0b3JzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgPj4+IGltcG9ydCBsb2NhbGUKLSAgICA+Pj4gbG9jYWxlLnNldGxvY2FsZShsb2NhbGUuTENfQUxMLCAnRW5nbGlzaF9Vbml0ZWQgU3RhdGVzLjEyNTInKQotICAgICdFbmdsaXNoX1VuaXRlZCBTdGF0ZXMuMTI1MicKLSAgICA+Pj4gY29udiA9IGxvY2FsZS5sb2NhbGVjb252KCkgICAgICAgICAgIyBnZXQgYSBtYXBwaW5nIG9mIGNvbnZlbnRpb25zCi0gICAgPj4+IHggPSAxMjM0NTY3LjgKLSAgICA+Pj4gbG9jYWxlLmZvcm1hdCgiJWQiLCB4LCBncm91cGluZz1UcnVlKQotICAgICcxLDIzNCw1NjcnCi0gICAgPj4+IGxvY2FsZS5mb3JtYXQoIiVzJS4qZiIsIChjb252WydjdXJyZW5jeV9zeW1ib2wnXSwKLSAgICAuLi4JICAgICAgY29udlsnZnJhY19kaWdpdHMnXSwgeCksIGdyb3VwaW5nPVRydWUpCi0gICAgJyQxLDIzNCw1NjcuODAnCi1cZW5ke3ZlcmJhdGltfQotCi0KLVxzZWN0aW9ue1RlbXBsYXRpbmdcbGFiZWx7dGVtcGxhdGluZ319Ci0KLVRoZSBcdWxpbmt7XG1vZHVsZXtzdHJpbmd9fXsuLi9saWIvbW9kdWxlLXN0cmluZy5odG1sfSBtb2R1bGUgaW5jbHVkZXMgYQotdmVyc2F0aWxlIFxjbGFzc3tUZW1wbGF0ZX0gY2xhc3Mgd2l0aCBhIHNpbXBsaWZpZWQgc3ludGF4IHN1aXRhYmxlIGZvcgotZWRpdGluZyBieSBlbmQtdXNlcnMuICBUaGlzIGFsbG93cyB1c2VycyB0byBjdXN0b21pemUgdGhlaXIgYXBwbGljYXRpb25zCi13aXRob3V0IGhhdmluZyB0byBhbHRlciB0aGUgYXBwbGljYXRpb24uCi0KLVRoZSBmb3JtYXQgdXNlcyBwbGFjZWhvbGRlciBuYW1lcyBmb3JtZWQgYnkgXHNhbXB7XCR9IHdpdGggdmFsaWQgUHl0aG9uCi1pZGVudGlmaWVycyAoYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYW5kIHVuZGVyc2NvcmVzKS4gIFN1cnJvdW5kaW5nIHRoZQotcGxhY2Vob2xkZXIgd2l0aCBicmFjZXMgYWxsb3dzIGl0IHRvIGJlIGZvbGxvd2VkIGJ5IG1vcmUgYWxwaGFudW1lcmljIGxldHRlcnMKLXdpdGggbm8gaW50ZXJ2ZW5pbmcgc3BhY2VzLiAgV3JpdGluZyBcc2FtcHtcJFwkfSBjcmVhdGVzIGEgc2luZ2xlIGVzY2FwZWQKLVxzYW1we1wkfToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGZyb20gc3RyaW5nIGltcG9ydCBUZW1wbGF0ZQotPj4+IHQgPSBUZW1wbGF0ZSgnJHt2aWxsYWdlfWZvbGsgc2VuZCAkJDEwIHRvICRjYXVzZS4nKQotPj4+IHQuc3Vic3RpdHV0ZSh2aWxsYWdlPSdOb3R0aW5naGFtJywgY2F1c2U9J3RoZSBkaXRjaCBmdW5kJykKLSdOb3R0aW5naGFtZm9sayBzZW5kICQxMCB0byB0aGUgZGl0Y2ggZnVuZC4nCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgXG1ldGhvZHtzdWJzdGl0dXRlfSBtZXRob2QgcmFpc2VzIGEgXGV4Y2VwdGlvbntLZXlFcnJvcn0gd2hlbiBhCi1wbGFjZWhvbGRlciBpcyBub3Qgc3VwcGxpZWQgaW4gYSBkaWN0aW9uYXJ5IG9yIGEga2V5d29yZCBhcmd1bWVudC4gRm9yCi1tYWlsLW1lcmdlIHN0eWxlIGFwcGxpY2F0aW9ucywgdXNlciBzdXBwbGllZCBkYXRhIG1heSBiZSBpbmNvbXBsZXRlIGFuZCB0aGUKLVxtZXRob2R7c2FmZV9zdWJzdGl0dXRlfSBtZXRob2QgbWF5IGJlIG1vcmUgYXBwcm9wcmlhdGUgLS0tIGl0IHdpbGwgbGVhdmUKLXBsYWNlaG9sZGVycyB1bmNoYW5nZWQgaWYgZGF0YSBpcyBtaXNzaW5nOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gdCA9IFRlbXBsYXRlKCdSZXR1cm4gdGhlICRpdGVtIHRvICRvd25lci4nKQotPj4+IGQgPSBkaWN0KGl0ZW09J3VubGFkZW4gc3dhbGxvdycpCi0+Pj4gdC5zdWJzdGl0dXRlKGQpCi1UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gIC4gLiAuCi1LZXlFcnJvcjogJ293bmVyJwotPj4+IHQuc2FmZV9zdWJzdGl0dXRlKGQpCi0nUmV0dXJuIHRoZSB1bmxhZGVuIHN3YWxsb3cgdG8gJG93bmVyLicKLVxlbmR7dmVyYmF0aW19Ci0KLVRlbXBsYXRlIHN1YmNsYXNzZXMgY2FuIHNwZWNpZnkgYSBjdXN0b20gZGVsaW1pdGVyLiAgRm9yIGV4YW1wbGUsIGEgYmF0Y2gKLXJlbmFtaW5nIHV0aWxpdHkgZm9yIGEgcGhvdG8gYnJvd3NlciBtYXkgZWxlY3QgdG8gdXNlIHBlcmNlbnQgc2lnbnMgZm9yCi1wbGFjZWhvbGRlcnMgc3VjaCBhcyB0aGUgY3VycmVudCBkYXRlLCBpbWFnZSBzZXF1ZW5jZSBudW1iZXIsIG9yIGZpbGUgZm9ybWF0OgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gaW1wb3J0IHRpbWUsIG9zLnBhdGgsIHN5cwotPj4+IGRlZiByYXdfaW5wdXQocHJvbXB0KToKLS4uLiAgICAgc3lzLnN0ZG91dC53cml0ZShwcm9tcHQpCi0uLi4gICAgIHN5cy5zdGRvdXQuZmx1c2goKQotLi4uICAgICByZXR1cm4gc3lzLnN0ZGluLnJlYWRsaW5lKCkKLS4uLiAKLT4+PiBwaG90b2ZpbGVzID0gWydpbWdfMTA3NC5qcGcnLCAnaW1nXzEwNzYuanBnJywgJ2ltZ18xMDc3LmpwZyddCi0+Pj4gY2xhc3MgQmF0Y2hSZW5hbWUoVGVtcGxhdGUpOgotLi4uICAgICBkZWxpbWl0ZXIgPSAnJScKLT4+PiBmbXQgPSByYXdfaW5wdXQoJ0VudGVyIHJlbmFtZSBzdHlsZSAoJWQtZGF0ZSAlbi1zZXFudW0gJWYtZm9ybWF0KTogICcpCi1FbnRlciByZW5hbWUgc3R5bGUgKCVkLWRhdGUgJW4tc2VxbnVtICVmLWZvcm1hdCk6ICBBc2hsZXlfJW4lZgotCi0+Pj4gdCA9IEJhdGNoUmVuYW1lKGZtdCkKLT4+PiBkYXRlID0gdGltZS5zdHJmdGltZSgnJWQlYiV5JykKLT4+PiBmb3IgaSwgZmlsZW5hbWUgaW4gZW51bWVyYXRlKHBob3RvZmlsZXMpOgotLi4uICAgICBiYXNlLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKQotLi4uICAgICBuZXduYW1lID0gdC5zdWJzdGl0dXRlKGQ9ZGF0ZSwgbj1pLCBmPWV4dCkKLS4uLiAgICAgcHJpbnQgJyVzIC0tPiAlcycgJSAoZmlsZW5hbWUsIG5ld25hbWUpCi0KLWltZ18xMDc0LmpwZyAtLT4gQXNobGV5XzAuanBnCi1pbWdfMTA3Ni5qcGcgLS0+IEFzaGxleV8xLmpwZwotaW1nXzEwNzcuanBnIC0tPiBBc2hsZXlfMi5qcGcKLVxlbmR7dmVyYmF0aW19Ci0KLUFub3RoZXIgYXBwbGljYXRpb24gZm9yIHRlbXBsYXRpbmcgaXMgc2VwYXJhdGluZyBwcm9ncmFtIGxvZ2ljIGZyb20gdGhlCi1kZXRhaWxzIG9mIG11bHRpcGxlIG91dHB1dCBmb3JtYXRzLiAgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBzdWJzdGl0dXRlCi1jdXN0b20gdGVtcGxhdGVzIGZvciBYTUwgZmlsZXMsIHBsYWluIHRleHQgcmVwb3J0cywgYW5kIEhUTUwgd2ViIHJlcG9ydHMuCi0KLQotXHNlY3Rpb257V29ya2luZyB3aXRoIEJpbmFyeSBEYXRhIFJlY29yZCBMYXlvdXRzXGxhYmVse2JpbmFyeS1mb3JtYXRzfX0KLQotVGhlIFx1bGlua3tcbW9kdWxle3N0cnVjdH19ey4uL2xpYi9tb2R1bGUtc3RydWN0Lmh0bWx9IG1vZHVsZSBwcm92aWRlcwotXGZ1bmN0aW9ue3BhY2soKX0gYW5kIFxmdW5jdGlvbnt1bnBhY2soKX0gZnVuY3Rpb25zIGZvciB3b3JraW5nIHdpdGgKLXZhcmlhYmxlIGxlbmd0aCBiaW5hcnkgcmVjb3JkIGZvcm1hdHMuICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93Ci10byBsb29wIHRocm91Z2ggaGVhZGVyIGluZm9ybWF0aW9uIGluIGEgWklQIGZpbGUgKHdpdGggcGFjayBjb2RlcwotXGNvZGV7IkgifSBhbmQgXGNvZGV7IkwifSByZXByZXNlbnRpbmcgdHdvIGFuZCBmb3VyIGJ5dGUgdW5zaWduZWQKLW51bWJlcnMgcmVzcGVjdGl2ZWx5KToKLQotXGJlZ2lue3ZlcmJhdGltfQotICAgIGltcG9ydCBzdHJ1Y3QKLQotICAgIGRhdGEgPSBvcGVuKCdteWZpbGUuemlwJywgJ3JiJykucmVhZCgpCi0gICAgc3RhcnQgPSAwCi0gICAgZm9yIGkgaW4gcmFuZ2UoMyk6ICAgICAgICAgICAgICAgICAgICAgICMgc2hvdyB0aGUgZmlyc3QgMyBmaWxlIGhlYWRlcnMKLSAgICAgICAgc3RhcnQgKz0gMTQKLSAgICAgICAgZmllbGRzID0gc3RydWN0LnVucGFjaygnTExMSEgnLCBkYXRhW3N0YXJ0OnN0YXJ0KzE2XSkKLSAgICAgICAgY3JjMzIsIGNvbXBfc2l6ZSwgdW5jb21wX3NpemUsIGZpbGVuYW1lc2l6ZSwgZXh0cmFfc2l6ZSA9IGZpZWxkcwotCi0gICAgICAgIHN0YXJ0ICs9IDE2Ci0gICAgICAgIGZpbGVuYW1lID0gZGF0YVtzdGFydDpzdGFydCtmaWxlbmFtZXNpemVdCi0gICAgICAgIHN0YXJ0ICs9IGZpbGVuYW1lc2l6ZQotICAgICAgICBleHRyYSA9IGRhdGFbc3RhcnQ6c3RhcnQrZXh0cmFfc2l6ZV0KLSAgICAgICAgcHJpbnQgZmlsZW5hbWUsIGhleChjcmMzMiksIGNvbXBfc2l6ZSwgdW5jb21wX3NpemUKLQotICAgICAgICBzdGFydCArPSBleHRyYV9zaXplICsgY29tcF9zaXplICAgICAjIHNraXAgdG8gdGhlIG5leHQgaGVhZGVyCi1cZW5ke3ZlcmJhdGltfQotCi0KLVxzZWN0aW9ue011bHRpLXRocmVhZGluZ1xsYWJlbHttdWx0aS10aHJlYWRpbmd9fQotCi1UaHJlYWRpbmcgaXMgYSB0ZWNobmlxdWUgZm9yIGRlY291cGxpbmcgdGFza3Mgd2hpY2ggYXJlIG5vdCBzZXF1ZW50aWFsbHkKLWRlcGVuZGVudC4gIFRocmVhZHMgY2FuIGJlIHVzZWQgdG8gaW1wcm92ZSB0aGUgcmVzcG9uc2l2ZW5lc3Mgb2YKLWFwcGxpY2F0aW9ucyB0aGF0IGFjY2VwdCB1c2VyIGlucHV0IHdoaWxlIG90aGVyIHRhc2tzIHJ1biBpbiB0aGUKLWJhY2tncm91bmQuICBBIHJlbGF0ZWQgdXNlIGNhc2UgaXMgcnVubmluZyBJL08gaW4gcGFyYWxsZWwgd2l0aAotY29tcHV0YXRpb25zIGluIGFub3RoZXIgdGhyZWFkLgotCi1UaGUgZm9sbG93aW5nIGNvZGUgc2hvd3MgaG93IHRoZSBoaWdoIGxldmVsCi1cdWxpbmt7XG1vZHVsZXt0aHJlYWRpbmd9fXsuLi9saWIvbW9kdWxlLXRocmVhZGluZy5odG1sfSBtb2R1bGUgY2FuIHJ1bgotdGFza3MgaW4gYmFja2dyb3VuZCB3aGlsZSB0aGUgbWFpbiBwcm9ncmFtIGNvbnRpbnVlcyB0byBydW46Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICBpbXBvcnQgdGhyZWFkaW5nLCB6aXBmaWxlCi0KLSAgICBjbGFzcyBBc3luY1ppcCh0aHJlYWRpbmcuVGhyZWFkKToKLSAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGluZmlsZSwgb3V0ZmlsZSk6Ci0gICAgICAgICAgICB0aHJlYWRpbmcuVGhyZWFkLl9faW5pdF9fKHNlbGYpICAgICAgICAKLSAgICAgICAgICAgIHNlbGYuaW5maWxlID0gaW5maWxlCi0gICAgICAgICAgICBzZWxmLm91dGZpbGUgPSBvdXRmaWxlCi0gICAgICAgIGRlZiBydW4oc2VsZik6Ci0gICAgICAgICAgICBmID0gemlwZmlsZS5aaXBGaWxlKHNlbGYub3V0ZmlsZSwgJ3cnLCB6aXBmaWxlLlpJUF9ERUZMQVRFRCkKLSAgICAgICAgICAgIGYud3JpdGUoc2VsZi5pbmZpbGUpCi0gICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIHByaW50ICdGaW5pc2hlZCBiYWNrZ3JvdW5kIHppcCBvZjogJywgc2VsZi5pbmZpbGUKLQotICAgIGJhY2tncm91bmQgPSBBc3luY1ppcCgnbXlkYXRhLnR4dCcsICdteWFyY2hpdmUuemlwJykKLSAgICBiYWNrZ3JvdW5kLnN0YXJ0KCkKLSAgICBwcmludCAnVGhlIG1haW4gcHJvZ3JhbSBjb250aW51ZXMgdG8gcnVuIGluIGZvcmVncm91bmQuJwotICAgIAotICAgIGJhY2tncm91bmQuam9pbigpICAgICMgV2FpdCBmb3IgdGhlIGJhY2tncm91bmQgdGFzayB0byBmaW5pc2gKLSAgICBwcmludCAnTWFpbiBwcm9ncmFtIHdhaXRlZCB1bnRpbCBiYWNrZ3JvdW5kIHdhcyBkb25lLicKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBwcmluY2lwYWwgY2hhbGxlbmdlIG9mIG11bHRpLXRocmVhZGVkIGFwcGxpY2F0aW9ucyBpcyBjb29yZGluYXRpbmcKLXRocmVhZHMgdGhhdCBzaGFyZSBkYXRhIG9yIG90aGVyIHJlc291cmNlcy4gIFRvIHRoYXQgZW5kLCB0aGUgdGhyZWFkaW5nCi1tb2R1bGUgcHJvdmlkZXMgYSBudW1iZXIgb2Ygc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMgaW5jbHVkaW5nIGxvY2tzLAotZXZlbnRzLCBjb25kaXRpb24gdmFyaWFibGVzLCBhbmQgc2VtYXBob3Jlcy4KLQotV2hpbGUgdGhvc2UgdG9vbHMgYXJlIHBvd2VyZnVsLCBtaW5vciBkZXNpZ24gZXJyb3JzIGNhbiByZXN1bHQgaW4KLXByb2JsZW1zIHRoYXQgYXJlIGRpZmZpY3VsdCB0byByZXByb2R1Y2UuICBTbywgdGhlIHByZWZlcnJlZCBhcHByb2FjaAotdG8gdGFzayBjb29yZGluYXRpb24gaXMgdG8gY29uY2VudHJhdGUgYWxsIGFjY2VzcyB0byBhIHJlc291cmNlCi1pbiBhIHNpbmdsZSB0aHJlYWQgYW5kIHRoZW4gdXNlIHRoZQotXHVsaW5re1xtb2R1bGV7UXVldWV9fXsuLi9saWIvbW9kdWxlLVF1ZXVlLmh0bWx9IG1vZHVsZSB0byBmZWVkIHRoYXQKLXRocmVhZCB3aXRoIHJlcXVlc3RzIGZyb20gb3RoZXIgdGhyZWFkcy4gIEFwcGxpY2F0aW9ucyB1c2luZwotXGNsYXNze1F1ZXVlfSBvYmplY3RzIGZvciBpbnRlci10aHJlYWQgY29tbXVuaWNhdGlvbiBhbmQgY29vcmRpbmF0aW9uCi1hcmUgZWFzaWVyIHRvIGRlc2lnbiwgbW9yZSByZWFkYWJsZSwgYW5kIG1vcmUgcmVsaWFibGUuCi0KLQotXHNlY3Rpb257TG9nZ2luZ1xsYWJlbHtsb2dnaW5nfX0KLQotVGhlIFx1bGlua3tcbW9kdWxle2xvZ2dpbmd9fXsuLi9saWIvbW9kdWxlLWxvZ2dpbmcuaHRtbH0gbW9kdWxlIG9mZmVycwotYSBmdWxsIGZlYXR1cmVkIGFuZCBmbGV4aWJsZSBsb2dnaW5nIHN5c3RlbS4gIEF0IGl0cyBzaW1wbGVzdCwgbG9nCi1tZXNzYWdlcyBhcmUgc2VudCB0byBhIGZpbGUgb3IgdG8gXGNvZGV7c3lzLnN0ZGVycn06Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICBpbXBvcnQgbG9nZ2luZwotICAgIGxvZ2dpbmcuZGVidWcoJ0RlYnVnZ2luZyBpbmZvcm1hdGlvbicpCi0gICAgbG9nZ2luZy5pbmZvKCdJbmZvcm1hdGlvbmFsIG1lc3NhZ2UnKQotICAgIGxvZ2dpbmcud2FybmluZygnV2FybmluZzpjb25maWcgZmlsZSAlcyBub3QgZm91bmQnLCAnc2VydmVyLmNvbmYnKQotICAgIGxvZ2dpbmcuZXJyb3IoJ0Vycm9yIG9jY3VycmVkJykKLSAgICBsb2dnaW5nLmNyaXRpY2FsKCdDcml0aWNhbCBlcnJvciAtLSBzaHV0dGluZyBkb3duJykKLVxlbmR7dmVyYmF0aW19Ci0KLVRoaXMgcHJvZHVjZXMgdGhlIGZvbGxvd2luZyBvdXRwdXQ6IAotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgV0FSTklORzpyb290Oldhcm5pbmc6Y29uZmlnIGZpbGUgc2VydmVyLmNvbmYgbm90IGZvdW5kCi0gICAgRVJST1I6cm9vdDpFcnJvciBvY2N1cnJlZAotICAgIENSSVRJQ0FMOnJvb3Q6Q3JpdGljYWwgZXJyb3IgLS0gc2h1dHRpbmcgZG93bgotXGVuZHt2ZXJiYXRpbX0KLQotQnkgZGVmYXVsdCwgaW5mb3JtYXRpb25hbCBhbmQgZGVidWdnaW5nIG1lc3NhZ2VzIGFyZSBzdXBwcmVzc2VkIGFuZCB0aGUKLW91dHB1dCBpcyBzZW50IHRvIHN0YW5kYXJkIGVycm9yLiAgT3RoZXIgb3V0cHV0IG9wdGlvbnMgaW5jbHVkZSByb3V0aW5nCi1tZXNzYWdlcyB0aHJvdWdoIGVtYWlsLCBkYXRhZ3JhbXMsIHNvY2tldHMsIG9yIHRvIGFuIEhUVFAgU2VydmVyLiAgTmV3Ci1maWx0ZXJzIGNhbiBzZWxlY3QgZGlmZmVyZW50IHJvdXRpbmcgYmFzZWQgb24gbWVzc2FnZSBwcmlvcml0eToKLVxjb25zdGFudHtERUJVR30sIFxjb25zdGFudHtJTkZPfSwgXGNvbnN0YW50e1dBUk5JTkd9LCBcY29uc3RhbnR7RVJST1J9LAotYW5kIFxjb25zdGFudHtDUklUSUNBTH0uCi0KLVRoZSBsb2dnaW5nIHN5c3RlbSBjYW4gYmUgY29uZmlndXJlZCBkaXJlY3RseSBmcm9tIFB5dGhvbiBvciBjYW4gYmUKLWxvYWRlZCBmcm9tIGEgdXNlciBlZGl0YWJsZSBjb25maWd1cmF0aW9uIGZpbGUgZm9yIGN1c3RvbWl6ZWQgbG9nZ2luZwotd2l0aG91dCBhbHRlcmluZyB0aGUgYXBwbGljYXRpb24uCi0KLQotXHNlY3Rpb257V2VhayBSZWZlcmVuY2VzXGxhYmVse3dlYWstcmVmZXJlbmNlc319Ci0KLVB5dGhvbiBkb2VzIGF1dG9tYXRpYyBtZW1vcnkgbWFuYWdlbWVudCAocmVmZXJlbmNlIGNvdW50aW5nIGZvciBtb3N0Ci1vYmplY3RzIGFuZCBnYXJiYWdlIGNvbGxlY3Rpb24gdG8gZWxpbWluYXRlIGN5Y2xlcykuICBUaGUgbWVtb3J5IGlzCi1mcmVlZCBzaG9ydGx5IGFmdGVyIHRoZSBsYXN0IHJlZmVyZW5jZSB0byBpdCBoYXMgYmVlbiBlbGltaW5hdGVkLgotCi1UaGlzIGFwcHJvYWNoIHdvcmtzIGZpbmUgZm9yIG1vc3QgYXBwbGljYXRpb25zIGJ1dCBvY2Nhc2lvbmFsbHkgdGhlcmUKLWlzIGEgbmVlZCB0byB0cmFjayBvYmplY3RzIG9ubHkgYXMgbG9uZyBhcyB0aGV5IGFyZSBiZWluZyB1c2VkIGJ5Ci1zb21ldGhpbmcgZWxzZS4gIFVuZm9ydHVuYXRlbHksIGp1c3QgdHJhY2tpbmcgdGhlbSBjcmVhdGVzIGEgcmVmZXJlbmNlCi10aGF0IG1ha2VzIHRoZW0gcGVybWFuZW50LiAgVGhlCi1cdWxpbmt7XG1vZHVsZXt3ZWFrcmVmfX17Li4vbGliL21vZHVsZS13ZWFrcmVmLmh0bWx9IG1vZHVsZSBwcm92aWRlcwotdG9vbHMgZm9yIHRyYWNraW5nIG9iamVjdHMgd2l0aG91dCBjcmVhdGluZyBhIHJlZmVyZW5jZS4gIFdoZW4gdGhlCi1vYmplY3QgaXMgbm8gbG9uZ2VyIG5lZWRlZCwgaXQgaXMgYXV0b21hdGljYWxseSByZW1vdmVkIGZyb20gYSB3ZWFrcmVmCi10YWJsZSBhbmQgYSBjYWxsYmFjayBpcyB0cmlnZ2VyZWQgZm9yIHdlYWtyZWYgb2JqZWN0cy4gIFR5cGljYWwKLWFwcGxpY2F0aW9ucyBpbmNsdWRlIGNhY2hpbmcgb2JqZWN0cyB0aGF0IGFyZSBleHBlbnNpdmUgdG8gY3JlYXRlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgPj4+IGltcG9ydCB3ZWFrcmVmLCBnYwotICAgID4+PiBjbGFzcyBBOgotICAgIC4uLiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKLSAgICAuLi4gICAgICAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCi0gICAgLi4uICAgICBkZWYgX19yZXByX18oc2VsZik6Ci0gICAgLi4uICAgICAgICAgICAgIHJldHVybiBzdHIoc2VsZi52YWx1ZSkKLSAgICAuLi4KLSAgICA+Pj4gYSA9IEEoMTApICAgICAgICAgICAgICAgICAgICMgY3JlYXRlIGEgcmVmZXJlbmNlCi0gICAgPj4+IGQgPSB3ZWFrcmVmLldlYWtWYWx1ZURpY3Rpb25hcnkoKQotICAgID4+PiBkWydwcmltYXJ5J10gPSBhICAgICAgICAgICAgIyBkb2VzIG5vdCBjcmVhdGUgYSByZWZlcmVuY2UKLSAgICA+Pj4gZFsncHJpbWFyeSddICAgICAgICAgICAgICAgICMgZmV0Y2ggdGhlIG9iamVjdCBpZiBpdCBpcyBzdGlsbCBhbGl2ZQotICAgIDEwCi0gICAgPj4+IGRlbCBhICAgICAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSB0aGUgb25lIHJlZmVyZW5jZQotICAgID4+PiBnYy5jb2xsZWN0KCkgICAgICAgICAgICAgICAgIyBydW4gZ2FyYmFnZSBjb2xsZWN0aW9uIHJpZ2h0IGF3YXkKLSAgICAwCi0gICAgPj4+IGRbJ3ByaW1hcnknXSAgICAgICAgICAgICAgICAjIGVudHJ5IHdhcyBhdXRvbWF0aWNhbGx5IHJlbW92ZWQKLSAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gICAgICBGaWxlICI8cHlzaGVsbCMxMDg+IiwgbGluZSAxLCBpbiAtdG9wbGV2ZWwtCi0gICAgICAgIGRbJ3ByaW1hcnknXSAgICAgICAgICAgICAgICAjIGVudHJ5IHdhcyBhdXRvbWF0aWNhbGx5IHJlbW92ZWQKLSAgICAgIEZpbGUgIkM6L3B5dGhvbjMwL2xpYi93ZWFrcmVmLnB5IiwgbGluZSA0NiwgaW4gX19nZXRpdGVtX18KLSAgICAgICAgbyA9IHNlbGYuZGF0YVtrZXldKCkKLSAgICBLZXlFcnJvcjogJ3ByaW1hcnknCi1cZW5ke3ZlcmJhdGltfQotCi1cc2VjdGlvbntUb29scyBmb3IgV29ya2luZyB3aXRoIExpc3RzXGxhYmVse2xpc3QtdG9vbHN9fQotCi1NYW55IGRhdGEgc3RydWN0dXJlIG5lZWRzIGNhbiBiZSBtZXQgd2l0aCB0aGUgYnVpbHQtaW4gbGlzdCB0eXBlLgotSG93ZXZlciwgc29tZXRpbWVzIHRoZXJlIGlzIGEgbmVlZCBmb3IgYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb25zCi13aXRoIGRpZmZlcmVudCBwZXJmb3JtYW5jZSB0cmFkZS1vZmZzLgotCi1UaGUgXHVsaW5re1xtb2R1bGV7YXJyYXl9fXsuLi9saWIvbW9kdWxlLWFycmF5Lmh0bWx9IG1vZHVsZSBwcm92aWRlcyBhbgotXGNsYXNze2FycmF5KCl9IG9iamVjdCB0aGF0IGlzIGxpa2UgYSBsaXN0IHRoYXQgc3RvcmVzIG9ubHkgaG9tb2dlbm91cwotZGF0YSBhbmQgc3RvcmVzIGl0IG1vcmUgY29tcGFjdGx5LiAgVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGFuIGFycmF5Ci1vZiBudW1iZXJzIHN0b3JlZCBhcyB0d28gYnl0ZSB1bnNpZ25lZCBiaW5hcnkgbnVtYmVycyAodHlwZWNvZGUKLVxjb2RleyJIIn0pIHJhdGhlciB0aGFuIHRoZSB1c3VhbCAxNiBieXRlcyBwZXIgZW50cnkgZm9yIHJlZ3VsYXIgbGlzdHMKLW9mIHB5dGhvbiBpbnQgb2JqZWN0czoKLQotXGJlZ2lue3ZlcmJhdGltfQotICAgID4+PiBmcm9tIGFycmF5IGltcG9ydCBhcnJheQotICAgID4+PiBhID0gYXJyYXkoJ0gnLCBbNDAwMCwgMTAsIDcwMCwgMjIyMjJdKQotICAgID4+PiBzdW0oYSkKLSAgICAyNjkzMgotICAgID4+PiBhWzE6M10KLSAgICBhcnJheSgnSCcsIFsxMCwgNzAwXSkKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBcdWxpbmt7XG1vZHVsZXtjb2xsZWN0aW9uc319ey4uL2xpYi9tb2R1bGUtY29sbGVjdGlvbnMuaHRtbH0gbW9kdWxlCi1wcm92aWRlcyBhIFxjbGFzc3tkZXF1ZSgpfSBvYmplY3QgdGhhdCBpcyBsaWtlIGEgbGlzdCB3aXRoIGZhc3RlcgotYXBwZW5kcyBhbmQgcG9wcyBmcm9tIHRoZSBsZWZ0IHNpZGUgYnV0IHNsb3dlciBsb29rdXBzIGluIHRoZSBtaWRkbGUuCi1UaGVzZSBvYmplY3RzIGFyZSB3ZWxsIHN1aXRlZCBmb3IgaW1wbGVtZW50aW5nIHF1ZXVlcyBhbmQgYnJlYWR0aCBmaXJzdAotdHJlZSBzZWFyY2hlczoKLQotXGJlZ2lue3ZlcmJhdGltfQotICAgID4+PiBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZQotICAgID4+PiBkID0gZGVxdWUoWyJ0YXNrMSIsICJ0YXNrMiIsICJ0YXNrMyJdKQotICAgID4+PiBkLmFwcGVuZCgidGFzazQiKQotICAgID4+PiBwcmludCAiSGFuZGxpbmciLCBkLnBvcGxlZnQoKQotICAgIEhhbmRsaW5nIHRhc2sxCi0KLSAgICB1bnNlYXJjaGVkID0gZGVxdWUoW3N0YXJ0aW5nX25vZGVdKQotICAgIGRlZiBicmVhZHRoX2ZpcnN0X3NlYXJjaCh1bnNlYXJjaGVkKToKLSAgICAgICAgbm9kZSA9IHVuc2VhcmNoZWQucG9wbGVmdCgpCi0gICAgICAgIGZvciBtIGluIGdlbl9tb3Zlcyhub2RlKToKLSAgICAgICAgICAgIGlmIGlzX2dvYWwobSk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG0KLSAgICAgICAgICAgIHVuc2VhcmNoZWQuYXBwZW5kKG0pCi1cZW5ke3ZlcmJhdGltfQotCi1JbiBhZGRpdGlvbiB0byBhbHRlcm5hdGl2ZSBsaXN0IGltcGxlbWVudGF0aW9ucywgdGhlIGxpYnJhcnkgYWxzbyBvZmZlcnMKLW90aGVyIHRvb2xzIHN1Y2ggYXMgdGhlIFx1bGlua3tcbW9kdWxle2Jpc2VjdH19ey4uL2xpYi9tb2R1bGUtYmlzZWN0Lmh0bWx9Ci1tb2R1bGUgd2l0aCBmdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZyBzb3J0ZWQgbGlzdHM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICA+Pj4gaW1wb3J0IGJpc2VjdAotICAgID4+PiBzY29yZXMgPSBbKDEwMCwgJ3BlcmwnKSwgKDIwMCwgJ3RjbCcpLCAoNDAwLCAnbHVhJyksICg1MDAsICdweXRob24nKV0KLSAgICA+Pj4gYmlzZWN0Lmluc29ydChzY29yZXMsICgzMDAsICdydWJ5JykpCi0gICAgPj4+IHNjb3JlcwotICAgIFsoMTAwLCAncGVybCcpLCAoMjAwLCAndGNsJyksICgzMDAsICdydWJ5JyksICg0MDAsICdsdWEnKSwgKDUwMCwgJ3B5dGhvbicpXQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIFx1bGlua3tcbW9kdWxle2hlYXBxfX17Li4vbGliL21vZHVsZS1oZWFwcS5odG1sfSBtb2R1bGUgcHJvdmlkZXMKLWZ1bmN0aW9ucyBmb3IgaW1wbGVtZW50aW5nIGhlYXBzIGJhc2VkIG9uIHJlZ3VsYXIgbGlzdHMuICBUaGUgbG93ZXN0Ci12YWx1ZWQgZW50cnkgaXMgYWx3YXlzIGtlcHQgYXQgcG9zaXRpb24gemVyby4gIFRoaXMgaXMgdXNlZnVsIGZvcgotYXBwbGljYXRpb25zIHdoaWNoIHJlcGVhdGVkbHkgYWNjZXNzIHRoZSBzbWFsbGVzdCBlbGVtZW50IGJ1dCBkbyBub3QKLXdhbnQgdG8gcnVuIGEgZnVsbCBsaXN0IHNvcnQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICA+Pj4gZnJvbSBoZWFwcSBpbXBvcnQgaGVhcGlmeSwgaGVhcHBvcCwgaGVhcHB1c2gKLSAgICA+Pj4gZGF0YSA9IFsxLCAzLCA1LCA3LCA5LCAyLCA0LCA2LCA4LCAwXQotICAgID4+PiBoZWFwaWZ5KGRhdGEpICAgICAgICAgICAgICAgICAgICAgICMgcmVhcnJhbmdlIHRoZSBsaXN0IGludG8gaGVhcCBvcmRlcgotICAgID4+PiBoZWFwcHVzaChkYXRhLCAtNSkgICAgICAgICAgICAgICAgICMgYWRkIGEgbmV3IGVudHJ5Ci0gICAgPj4+IFtoZWFwcG9wKGRhdGEpIGZvciBpIGluIHJhbmdlKDMpXSAgIyBmZXRjaCB0aGUgdGhyZWUgc21hbGxlc3QgZW50cmllcwotICAgIFstNSwgMCwgMV0KLVxlbmR7dmVyYmF0aW19Ci0KLQotXHNlY3Rpb257RGVjaW1hbCBGbG9hdGluZyBQb2ludCBBcml0aG1ldGljXGxhYmVse2RlY2ltYWwtZnB9fQotCi1UaGUgXHVsaW5re1xtb2R1bGV7ZGVjaW1hbH19ey4uL2xpYi9tb2R1bGUtZGVjaW1hbC5odG1sfSBtb2R1bGUgb2ZmZXJzIGEKLVxjbGFzc3tEZWNpbWFsfSBkYXRhdHlwZSBmb3IgZGVjaW1hbCBmbG9hdGluZyBwb2ludCBhcml0aG1ldGljLiAgQ29tcGFyZWQgdG8KLXRoZSBidWlsdC1pbiBcY2xhc3N7ZmxvYXR9IGltcGxlbWVudGF0aW9uIG9mIGJpbmFyeSBmbG9hdGluZyBwb2ludCwgdGhlIG5ldwotY2xhc3MgaXMgZXNwZWNpYWxseSBoZWxwZnVsIGZvciBmaW5hbmNpYWwgYXBwbGljYXRpb25zIGFuZCBvdGhlciB1c2VzIHdoaWNoCi1yZXF1aXJlIGV4YWN0IGRlY2ltYWwgcmVwcmVzZW50YXRpb24sIGNvbnRyb2wgb3ZlciBwcmVjaXNpb24sIGNvbnRyb2wgb3Zlcgotcm91bmRpbmcgdG8gbWVldCBsZWdhbCBvciByZWd1bGF0b3J5IHJlcXVpcmVtZW50cywgdHJhY2tpbmcgb2Ygc2lnbmlmaWNhbnQKLWRlY2ltYWwgcGxhY2VzLCBvciBmb3IgYXBwbGljYXRpb25zIHdoZXJlIHRoZSB1c2VyIGV4cGVjdHMgdGhlIHJlc3VsdHMgdG8KLW1hdGNoIGNhbGN1bGF0aW9ucyBkb25lIGJ5IGhhbmQuCi0KLUZvciBleGFtcGxlLCBjYWxjdWxhdGluZyBhIDVcJXt9IHRheCBvbiBhIDcwIGNlbnQgcGhvbmUgY2hhcmdlIGdpdmVzCi1kaWZmZXJlbnQgcmVzdWx0cyBpbiBkZWNpbWFsIGZsb2F0aW5nIHBvaW50IGFuZCBiaW5hcnkgZmxvYXRpbmcgcG9pbnQuCi1UaGUgZGlmZmVyZW5jZSBiZWNvbWVzIHNpZ25pZmljYW50IGlmIHRoZSByZXN1bHRzIGFyZSByb3VuZGVkIHRvIHRoZQotbmVhcmVzdCBjZW50OgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZnJvbSBkZWNpbWFsIGltcG9ydCAqICAgICAgIAotPj4+IERlY2ltYWwoJzAuNzAnKSAqIERlY2ltYWwoJzEuMDUnKQotRGVjaW1hbCgiMC43MzUwIikKLT4+PiAuNzAgKiAxLjA1Ci0wLjczNDk5OTk5OTk5OTk5OTk5ICAgICAgIAotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIFxjbGFzc3tEZWNpbWFsfSByZXN1bHQga2VlcHMgYSB0cmFpbGluZyB6ZXJvLCBhdXRvbWF0aWNhbGx5IGluZmVycmluZyBmb3VyCi1wbGFjZSBzaWduaWZpY2FuY2UgZnJvbSBtdWx0aXBsaWNhbmRzIHdpdGggdHdvIHBsYWNlIHNpZ25pZmljYW5jZS4gIERlY2ltYWwgcmVwcm9kdWNlcwotbWF0aGVtYXRpY3MgYXMgZG9uZSBieSBoYW5kIGFuZCBhdm9pZHMgaXNzdWVzIHRoYXQgY2FuIGFyaXNlIHdoZW4gYmluYXJ5Ci1mbG9hdGluZyBwb2ludCBjYW5ub3QgZXhhY3RseSByZXByZXNlbnQgZGVjaW1hbCBxdWFudGl0aWVzLgotCi1FeGFjdCByZXByZXNlbnRhdGlvbiBlbmFibGVzIHRoZSBcY2xhc3N7RGVjaW1hbH0gY2xhc3MgdG8gcGVyZm9ybQotbW9kdWxvIGNhbGN1bGF0aW9ucyBhbmQgZXF1YWxpdHkgdGVzdHMgdGhhdCBhcmUgdW5zdWl0YWJsZSBmb3IgYmluYXJ5Ci1mbG9hdGluZyBwb2ludDoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IERlY2ltYWwoJzEuMDAnKSAlIERlY2ltYWwoJy4xMCcpCi1EZWNpbWFsKCIwLjAwIikKLT4+PiAxLjAwICUgMC4xMAotMC4wOTk5OTk5OTk5OTk5OTk5NQotICAgICAgIAotPj4+IHN1bShbRGVjaW1hbCgnMC4xJyldKjEwKSA9PSBEZWNpbWFsKCcxLjAnKQotVHJ1ZQotPj4+IHN1bShbMC4xXSoxMCkgPT0gMS4wCi1GYWxzZSAgICAgIAotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIFxtb2R1bGV7ZGVjaW1hbH0gbW9kdWxlIHByb3ZpZGVzIGFyaXRobWV0aWMgd2l0aCBhcyBtdWNoIHByZWNpc2lvbiBhcwotbmVlZGVkOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZ2V0Y29udGV4dCgpLnByZWMgPSAzNgotPj4+IERlY2ltYWwoMSkgLyBEZWNpbWFsKDcpCi1EZWNpbWFsKCIwLjE0Mjg1NzE0Mjg1NzE0Mjg1NzE0Mjg1NzE0Mjg1NzE0Mjg1NyIpCi1cZW5ke3ZlcmJhdGltfQotCi0KLQotXGNoYXB0ZXJ7V2hhdCBOb3c/IFxsYWJlbHt3aGF0Tm93fX0KLQotUmVhZGluZyB0aGlzIHR1dG9yaWFsIGhhcyBwcm9iYWJseSByZWluZm9yY2VkIHlvdXIgaW50ZXJlc3QgaW4gdXNpbmcKLVB5dGhvbiAtLS0geW91IHNob3VsZCBiZSBlYWdlciB0byBhcHBseSBQeXRob24gdG8gc29sdmluZyB5b3VyCi1yZWFsLXdvcmxkIHByb2JsZW1zLiBXaGVyZSBzaG91bGQgeW91IGdvIHRvIGxlYXJuIG1vcmU/Ci0KLVRoaXMgdHV0b3JpYWwgaXMgcGFydCBvZiBQeXRob24ncyBkb2N1bWVudGF0aW9uIHNldC4gIAotU29tZSBvdGhlciBkb2N1bWVudHMgaW4gdGhlIHNldCBhcmU6Ci0KLVxiZWdpbntpdGVtaXplfQotCi1caXRlbSBcY2l0ZXRpdGxlWy4uL2xpYi9saWIuaHRtbF17UHl0aG9uIExpYnJhcnkgUmVmZXJlbmNlfToKLQotWW91IHNob3VsZCBicm93c2UgdGhyb3VnaCB0aGlzIG1hbnVhbCwgd2hpY2ggZ2l2ZXMgY29tcGxldGUgKHRob3VnaAotdGVyc2UpIHJlZmVyZW5jZSBtYXRlcmlhbCBhYm91dCB0eXBlcywgZnVuY3Rpb25zLCBhbmQgdGhlIG1vZHVsZXMgaW4KLXRoZSBzdGFuZGFyZCBsaWJyYXJ5LiAgVGhlIHN0YW5kYXJkIFB5dGhvbiBkaXN0cmlidXRpb24gaW5jbHVkZXMgYQotXGVtcGh7bG90fSBvZiBhZGRpdGlvbmFsIGNvZGUuICBUaGVyZSBhcmUgbW9kdWxlcyB0byByZWFkIFxVTklYe30KLW1haWxib3hlcywgcmV0cmlldmUgZG9jdW1lbnRzIHZpYSBIVFRQLCBnZW5lcmF0ZSByYW5kb20gbnVtYmVycywgcGFyc2UKLWNvbW1hbmQtbGluZSBvcHRpb25zLCB3cml0ZSBDR0kgcHJvZ3JhbXMsIGNvbXByZXNzIGRhdGEsIGFuZCBtYW55IG90aGVyIHRhc2tzLgotU2tpbW1pbmcgdGhyb3VnaCB0aGUgTGlicmFyeSBSZWZlcmVuY2Ugd2lsbCBnaXZlIHlvdSBhbiBpZGVhIG9mCi13aGF0J3MgYXZhaWxhYmxlLgotCi1caXRlbSBcY2l0ZXRpdGxlWy4uL2luc3QvaW5zdC5odG1sXXtJbnN0YWxsaW5nIFB5dGhvbiBNb2R1bGVzfQotZXhwbGFpbnMgaG93IHRvIGluc3RhbGwgZXh0ZXJuYWwgbW9kdWxlcyB3cml0dGVuIGJ5IG90aGVyIFB5dGhvbgotdXNlcnMuCi0KLVxpdGVtIFxjaXRldGl0bGVbLi4vcmVmL3JlZi5odG1sXXtMYW5ndWFnZSBSZWZlcmVuY2V9OiBBIGRldGFpbGVkIAotZXhwbGFuYXRpb24gb2YgUHl0aG9uJ3Mgc3ludGF4IGFuZCBzZW1hbnRpY3MuICBJdCdzIGhlYXZ5IHJlYWRpbmcsIAotYnV0IGlzIHVzZWZ1bCBhcyBhIGNvbXBsZXRlIGd1aWRlIHRvIHRoZSBsYW5ndWFnZSBpdHNlbGYuCi0KLVxlbmR7aXRlbWl6ZX0KLQotTW9yZSBQeXRob24gcmVzb3VyY2VzOgotCi1cYmVnaW57aXRlbWl6ZX0KLQotXGl0ZW0gXHVybHtodHRwOi8vd3d3LnB5dGhvbi5vcmd9OiAgVGhlIG1ham9yIFB5dGhvbiBXZWIgc2l0ZS4gIEl0IGNvbnRhaW5zCi1jb2RlLCBkb2N1bWVudGF0aW9uLCBhbmQgcG9pbnRlcnMgdG8gUHl0aG9uLXJlbGF0ZWQgcGFnZXMgYXJvdW5kIHRoZQotV2ViLiAgVGhpcyBXZWIgc2l0ZSBpcyBtaXJyb3JlZCBpbiB2YXJpb3VzIHBsYWNlcyBhcm91bmQgdGhlCi13b3JsZCwgc3VjaCBhcyBFdXJvcGUsIEphcGFuLCBhbmQgQXVzdHJhbGlhOyBhIG1pcnJvciBtYXkgYmUgZmFzdGVyCi10aGFuIHRoZSBtYWluIHNpdGUsIGRlcGVuZGluZyBvbiB5b3VyIGdlb2dyYXBoaWNhbCBsb2NhdGlvbi4gCi0KLVxpdGVtIFx1cmx7aHR0cDovL2RvY3MucHl0aG9uLm9yZ306ICBGYXN0IGFjY2VzcyB0byBQeXRob24ncyAKLWRvY3VtZW50YXRpb24uCi0KLVxpdGVtIFx1cmx7aHR0cDovL2NoZWVzZXNob3AucHl0aG9uLm9yZ306IAotVGhlIFB5dGhvbiBQYWNrYWdlIEluZGV4LCBuaWNrbmFtZWQgdGhlIENoZWVzZSBTaG9wLCAKLWlzIGFuIGluZGV4IG9mIHVzZXItY3JlYXRlZCBQeXRob24gbW9kdWxlcyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIAotZG93bmxvYWQuICBPbmNlIHlvdSBiZWdpbiByZWxlYXNpbmcgY29kZSwgeW91IGNhbiByZWdpc3RlciBpdCAKLWhlcmUgc28gdGhhdCBvdGhlcnMgY2FuIGZpbmQgaXQuCi0KLVxpdGVtIFx1cmx7aHR0cDovL2FzcG4uYWN0aXZlc3RhdGUuY29tL0FTUE4vUHl0aG9uL0Nvb2tib29rL306IFRoZQotUHl0aG9uIENvb2tib29rIGlzIGEgc2l6YWJsZSBjb2xsZWN0aW9uIG9mIGNvZGUgZXhhbXBsZXMsIGxhcmdlcgotbW9kdWxlcywgYW5kIHVzZWZ1bCBzY3JpcHRzLiAgUGFydGljdWxhcmx5IG5vdGFibGUgY29udHJpYnV0aW9ucyBhcmUKLWNvbGxlY3RlZCBpbiBhIGJvb2sgYWxzbyB0aXRsZWQgXGNpdGV0aXRsZXtQeXRob24gQ29va2Jvb2t9IChPJ1JlaWxseQotXCYgQXNzb2NpYXRlcywgSVNCTiAwLTU5Ni0wMDc5Ny0zLikKLQotXGVuZHtpdGVtaXplfQotCi0KLUZvciBQeXRob24tcmVsYXRlZCBxdWVzdGlvbnMgYW5kIHByb2JsZW0gcmVwb3J0cywgeW91IGNhbiBwb3N0IHRvIHRoZQotbmV3c2dyb3VwIFxuZXdzZ3JvdXB7Y29tcC5sYW5nLnB5dGhvbn0sIG9yIHNlbmQgdGhlbSB0byB0aGUgbWFpbGluZwotbGlzdCBhdCBcZW1haWx7cHl0aG9uLWxpc3RAcHl0aG9uLm9yZ30uICBUaGUgbmV3c2dyb3VwIGFuZCBtYWlsaW5nIGxpc3QKLWFyZSBnYXRld2F5ZWQsIHNvIG1lc3NhZ2VzIHBvc3RlZCB0byBvbmUgd2lsbCBhdXRvbWF0aWNhbGx5IGJlCi1mb3J3YXJkZWQgdG8gdGhlIG90aGVyLiAgVGhlcmUgYXJlIGFyb3VuZCAxMjAgcG9zdGluZ3MgYSBkYXkgKHdpdGggcGVha3MKLXVwIHRvIHNldmVyYWwgaHVuZHJlZCksCi0lIFBvc3RpbmdzIGZpZ3VyZSBiYXNlZCBvbiBhdmVyYWdlIG9mIGxhc3Qgc2l4IG1vbnRocyBhY3Rpdml0eSBhcwotJSByZXBvcnRlZCBieSB3d3cuZWdyb3Vwcy5jb207IEphbi4gMjAwMCAtIEp1bmUgMjAwMDogMjEyNzIgbXNncyAvIDE4MgotJSBkYXlzID0gMTE2LjkgbXNncyAvIGRheSBhbmQgc3RlYWRpbHkgaW5jcmVhc2luZy4KLWFza2luZyAoYW5kIGFuc3dlcmluZykgcXVlc3Rpb25zLCBzdWdnZXN0aW5nIG5ldyBmZWF0dXJlcywgYW5kCi1hbm5vdW5jaW5nIG5ldyBtb2R1bGVzLiAgQmVmb3JlIHBvc3RpbmcsIGJlIHN1cmUgdG8gY2hlY2sgdGhlIGxpc3Qgb2YKLVx1bGlua3tGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uc317aHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9mYXEvfSAoYWxzbyBjYWxsZWQgdGhlIEZBUSksIG9yIGxvb2sgZm9yIGl0IGluIHRoZQotXGZpbGV7TWlzYy99IGRpcmVjdG9yeSBvZiB0aGUgUHl0aG9uIHNvdXJjZSBkaXN0cmlidXRpb24uICBNYWlsaW5nCi1saXN0IGFyY2hpdmVzIGFyZSBhdmFpbGFibGUgYXQgXHVybHtodHRwOi8vbWFpbC5weXRob24ub3JnL3BpcGVybWFpbC99LgotVGhlIEZBUSBhbnN3ZXJzIG1hbnkgb2YgdGhlIHF1ZXN0aW9ucyB0aGF0IGNvbWUgdXAgYWdhaW4gYW5kIGFnYWluLAotYW5kIG1heSBhbHJlYWR5IGNvbnRhaW4gdGhlIHNvbHV0aW9uIGZvciB5b3VyIHByb2JsZW0uCi0KLQotXGFwcGVuZGl4Ci0KLVxjaGFwdGVye0ludGVyYWN0aXZlIElucHV0IEVkaXRpbmcgYW5kIEhpc3RvcnkgU3Vic3RpdHV0aW9uXGxhYmVse2ludGVyYWN0aW5nfX0KLQotU29tZSB2ZXJzaW9ucyBvZiB0aGUgUHl0aG9uIGludGVycHJldGVyIHN1cHBvcnQgZWRpdGluZyBvZiB0aGUgY3VycmVudAotaW5wdXQgbGluZSBhbmQgaGlzdG9yeSBzdWJzdGl0dXRpb24sIHNpbWlsYXIgdG8gZmFjaWxpdGllcyBmb3VuZCBpbgotdGhlIEtvcm4gc2hlbGwgYW5kIHRoZSBHTlUgQmFzaCBzaGVsbC4gIFRoaXMgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlCi1cZW1waHtHTlUgUmVhZGxpbmV9IGxpYnJhcnksIHdoaWNoIHN1cHBvcnRzIEVtYWNzLXN0eWxlIGFuZCB2aS1zdHlsZQotZWRpdGluZy4gIFRoaXMgbGlicmFyeSBoYXMgaXRzIG93biBkb2N1bWVudGF0aW9uIHdoaWNoIEkgd29uJ3QKLWR1cGxpY2F0ZSBoZXJlOyBob3dldmVyLCB0aGUgYmFzaWNzIGFyZSBlYXNpbHkgZXhwbGFpbmVkLiAgVGhlCi1pbnRlcmFjdGl2ZSBlZGl0aW5nIGFuZCBoaXN0b3J5IGRlc2NyaWJlZCBoZXJlIGFyZSBvcHRpb25hbGx5Ci1hdmFpbGFibGUgaW4gdGhlIFxVTklYe30gYW5kIEN5Z3dpbiB2ZXJzaW9ucyBvZiB0aGUgaW50ZXJwcmV0ZXIuCi0KLVRoaXMgY2hhcHRlciBkb2VzIFxlbXBoe25vdH0gZG9jdW1lbnQgdGhlIGVkaXRpbmcgZmFjaWxpdGllcyBvZiBNYXJrCi1IYW1tb25kJ3MgUHl0aG9uV2luIHBhY2thZ2Ugb3IgdGhlIFRrLWJhc2VkIGVudmlyb25tZW50LCBJRExFLAotZGlzdHJpYnV0ZWQgd2l0aCBQeXRob24uICBUaGUgY29tbWFuZCBsaW5lIGhpc3RvcnkgcmVjYWxsIHdoaWNoCi1vcGVyYXRlcyB3aXRoaW4gRE9TIGJveGVzIG9uIE5UIGFuZCBzb21lIG90aGVyIERPUyBhbmQgV2luZG93cyBmbGF2b3JzIAotaXMgeWV0IGFub3RoZXIgYmVhc3QuCi0KLVxzZWN0aW9ue0xpbmUgRWRpdGluZyBcbGFiZWx7bGluZUVkaXRpbmd9fQotCi1JZiBzdXBwb3J0ZWQsIGlucHV0IGxpbmUgZWRpdGluZyBpcyBhY3RpdmUgd2hlbmV2ZXIgdGhlIGludGVycHJldGVyCi1wcmludHMgYSBwcmltYXJ5IG9yIHNlY29uZGFyeSBwcm9tcHQuICBUaGUgY3VycmVudCBsaW5lIGNhbiBiZSBlZGl0ZWQKLXVzaW5nIHRoZSBjb252ZW50aW9uYWwgRW1hY3MgY29udHJvbCBjaGFyYWN0ZXJzLiAgVGhlIG1vc3QgaW1wb3J0YW50Ci1vZiB0aGVzZSBhcmU6IFxrYmR7Qy1BfSAoQ29udHJvbC1BKSBtb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBiZWdpbm5pbmcKLW9mIHRoZSBsaW5lLCBca2Jke0MtRX0gdG8gdGhlIGVuZCwgXGtiZHtDLUJ9IG1vdmVzIGl0IG9uZSBwb3NpdGlvbiB0bwotdGhlIGxlZnQsIFxrYmR7Qy1GfSB0byB0aGUgcmlnaHQuICBCYWNrc3BhY2UgZXJhc2VzIHRoZSBjaGFyYWN0ZXIgdG8KLXRoZSBsZWZ0IG9mIHRoZSBjdXJzb3IsIFxrYmR7Qy1EfSB0aGUgY2hhcmFjdGVyIHRvIGl0cyByaWdodC4KLVxrYmR7Qy1LfSBraWxscyAoZXJhc2VzKSB0aGUgcmVzdCBvZiB0aGUgbGluZSB0byB0aGUgcmlnaHQgb2YgdGhlCi1jdXJzb3IsIFxrYmR7Qy1ZfSB5YW5rcyBiYWNrIHRoZSBsYXN0IGtpbGxlZCBzdHJpbmcuCi1ca2Jke0MtdW5kZXJzY29yZX0gdW5kb2VzIHRoZSBsYXN0IGNoYW5nZSB5b3UgbWFkZTsgaXQgY2FuIGJlIHJlcGVhdGVkCi1mb3IgY3VtdWxhdGl2ZSBlZmZlY3QuCi0KLVxzZWN0aW9ue0hpc3RvcnkgU3Vic3RpdHV0aW9uIFxsYWJlbHtoaXN0b3J5fX0KLQotSGlzdG9yeSBzdWJzdGl0dXRpb24gd29ya3MgYXMgZm9sbG93cy4gIEFsbCBub24tZW1wdHkgaW5wdXQgbGluZXMKLWlzc3VlZCBhcmUgc2F2ZWQgaW4gYSBoaXN0b3J5IGJ1ZmZlciwgYW5kIHdoZW4gYSBuZXcgcHJvbXB0IGlzIGdpdmVuCi15b3UgYXJlIHBvc2l0aW9uZWQgb24gYSBuZXcgbGluZSBhdCB0aGUgYm90dG9tIG9mIHRoaXMgYnVmZmVyLgotXGtiZHtDLVB9IG1vdmVzIG9uZSBsaW5lIHVwIChiYWNrKSBpbiB0aGUgaGlzdG9yeSBidWZmZXIsCi1ca2Jke0MtTn0gbW92ZXMgb25lIGRvd24uICBBbnkgbGluZSBpbiB0aGUgaGlzdG9yeSBidWZmZXIgY2FuIGJlCi1lZGl0ZWQ7IGFuIGFzdGVyaXNrIGFwcGVhcnMgaW4gZnJvbnQgb2YgdGhlIHByb21wdCB0byBtYXJrIGEgbGluZSBhcwotbW9kaWZpZWQuICBQcmVzc2luZyB0aGUgXGtiZHtSZXR1cm59IGtleSBwYXNzZXMgdGhlIGN1cnJlbnQgbGluZSB0bwotdGhlIGludGVycHJldGVyLiAgXGtiZHtDLVJ9IHN0YXJ0cyBhbiBpbmNyZW1lbnRhbCByZXZlcnNlIHNlYXJjaDsKLVxrYmR7Qy1TfSBzdGFydHMgYSBmb3J3YXJkIHNlYXJjaC4KLQotXHNlY3Rpb257S2V5IEJpbmRpbmdzIFxsYWJlbHtrZXlCaW5kaW5nc319Ci0KLVRoZSBrZXkgYmluZGluZ3MgYW5kIHNvbWUgb3RoZXIgcGFyYW1ldGVycyBvZiB0aGUgUmVhZGxpbmUgbGlicmFyeSBjYW4KLWJlIGN1c3RvbWl6ZWQgYnkgcGxhY2luZyBjb21tYW5kcyBpbiBhbiBpbml0aWFsaXphdGlvbiBmaWxlIGNhbGxlZAotXGZpbGV7XH57fS8uaW5wdXRyY30uICBLZXkgYmluZGluZ3MgaGF2ZSB0aGUgZm9ybQotCi1cYmVnaW57dmVyYmF0aW19Ci1rZXktbmFtZTogZnVuY3Rpb24tbmFtZQotXGVuZHt2ZXJiYXRpbX0KLQotb3IKLQotXGJlZ2lue3ZlcmJhdGltfQotInN0cmluZyI6IGZ1bmN0aW9uLW5hbWUKLVxlbmR7dmVyYmF0aW19Ci0KLWFuZCBvcHRpb25zIGNhbiBiZSBzZXQgd2l0aAotCi1cYmVnaW57dmVyYmF0aW19Ci1zZXQgb3B0aW9uLW5hbWUgdmFsdWUKLVxlbmR7dmVyYmF0aW19Ci0KLUZvciBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0jIEkgcHJlZmVyIHZpLXN0eWxlIGVkaXRpbmc6Ci1zZXQgZWRpdGluZy1tb2RlIHZpCi0KLSMgRWRpdCB1c2luZyBhIHNpbmdsZSBsaW5lOgotc2V0IGhvcml6b250YWwtc2Nyb2xsLW1vZGUgT24KLQotIyBSZWJpbmQgc29tZSBrZXlzOgotTWV0YS1oOiBiYWNrd2FyZC1raWxsLXdvcmQKLSJcQy11IjogdW5pdmVyc2FsLWFyZ3VtZW50Ci0iXEMteFxDLXIiOiByZS1yZWFkLWluaXQtZmlsZQotXGVuZHt2ZXJiYXRpbX0KLQotTm90ZSB0aGF0IHRoZSBkZWZhdWx0IGJpbmRpbmcgZm9yIFxrYmR7VGFifSBpbiBQeXRob24gaXMgdG8gaW5zZXJ0IGEKLVxrYmR7VGFifSBjaGFyYWN0ZXIgaW5zdGVhZCBvZiBSZWFkbGluZSdzIGRlZmF1bHQgZmlsZW5hbWUgY29tcGxldGlvbgotZnVuY3Rpb24uICBJZiB5b3UgaW5zaXN0LCB5b3UgY2FuIG92ZXJyaWRlIHRoaXMgYnkgcHV0dGluZwotCi1cYmVnaW57dmVyYmF0aW19Ci1UYWI6IGNvbXBsZXRlCi1cZW5ke3ZlcmJhdGltfQotCi1pbiB5b3VyIFxmaWxle1x+e30vLmlucHV0cmN9LiAgKE9mIGNvdXJzZSwgdGhpcyBtYWtlcyBpdCBoYXJkZXIgdG8KLXR5cGUgaW5kZW50ZWQgY29udGludWF0aW9uIGxpbmVzIGlmIHlvdSdyZSBhY2N1c3RvbWVkIHRvIHVzaW5nCi1ca2Jke1RhYn0gZm9yIHRoYXQgcHVycG9zZS4pCi0KLUF1dG9tYXRpYyBjb21wbGV0aW9uIG9mIHZhcmlhYmxlIGFuZCBtb2R1bGUgbmFtZXMgaXMgb3B0aW9uYWxseQotYXZhaWxhYmxlLiAgVG8gZW5hYmxlIGl0IGluIHRoZSBpbnRlcnByZXRlcidzIGludGVyYWN0aXZlIG1vZGUsIGFkZAotdGhlIGZvbGxvd2luZyB0byB5b3VyIHN0YXJ0dXAgZmlsZTpcZm9vdG5vdGV7Ci0gIFB5dGhvbiB3aWxsIGV4ZWN1dGUgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSBpZGVudGlmaWVkIGJ5IHRoZQotICBcZW52dmFye1BZVEhPTlNUQVJUVVB9IGVudmlyb25tZW50IHZhcmlhYmxlIHdoZW4geW91IHN0YXJ0IGFuCi0gIGludGVyYWN0aXZlIGludGVycHJldGVyLn0KLVxyZWZzdG1vZGluZGV4e3JsY29tcGxldGVyfVxyZWZiaW1vZGluZGV4e3JlYWRsaW5lfQotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgcmxjb21wbGV0ZXIsIHJlYWRsaW5lCi1yZWFkbGluZS5wYXJzZV9hbmRfYmluZCgndGFiOiBjb21wbGV0ZScpCi1cZW5ke3ZlcmJhdGltfQotCi1UaGlzIGJpbmRzIHRoZSBca2Jke1RhYn0ga2V5IHRvIHRoZSBjb21wbGV0aW9uIGZ1bmN0aW9uLCBzbyBoaXR0aW5nCi10aGUgXGtiZHtUYWJ9IGtleSB0d2ljZSBzdWdnZXN0cyBjb21wbGV0aW9uczsgaXQgbG9va3MgYXQgUHl0aG9uCi1zdGF0ZW1lbnQgbmFtZXMsIHRoZSBjdXJyZW50IGxvY2FsIHZhcmlhYmxlcywgYW5kIHRoZSBhdmFpbGFibGUgbW9kdWxlCi1uYW1lcy4gIEZvciBkb3R0ZWQgZXhwcmVzc2lvbnMgc3VjaCBhcyBcY29kZXtzdHJpbmcuYX0sIGl0IHdpbGwKLWV2YWx1YXRlIHRoZSBleHByZXNzaW9uIHVwIHRvIHRoZSBmaW5hbCBcY2hhcmFjdGVyey59IGFuZCB0aGVuCi1zdWdnZXN0IGNvbXBsZXRpb25zIGZyb20gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIHJlc3VsdGluZyBvYmplY3QuICBOb3RlCi10aGF0IHRoaXMgbWF5IGV4ZWN1dGUgYXBwbGljYXRpb24tZGVmaW5lZCBjb2RlIGlmIGFuIG9iamVjdCB3aXRoIGEKLVxtZXRob2R7X19nZXRhdHRyX18oKX0gbWV0aG9kIGlzIHBhcnQgb2YgdGhlIGV4cHJlc3Npb24uCi0KLUEgbW9yZSBjYXBhYmxlIHN0YXJ0dXAgZmlsZSBtaWdodCBsb29rIGxpa2UgdGhpcyBleGFtcGxlLiAgTm90ZSB0aGF0Ci10aGlzIGRlbGV0ZXMgdGhlIG5hbWVzIGl0IGNyZWF0ZXMgb25jZSB0aGV5IGFyZSBubyBsb25nZXIgbmVlZGVkOyB0aGlzCi1pcyBkb25lIHNpbmNlIHRoZSBzdGFydHVwIGZpbGUgaXMgZXhlY3V0ZWQgaW4gdGhlIHNhbWUgbmFtZXNwYWNlIGFzCi10aGUgaW50ZXJhY3RpdmUgY29tbWFuZHMsIGFuZCByZW1vdmluZyB0aGUgbmFtZXMgYXZvaWRzIGNyZWF0aW5nIHNpZGUKLWVmZmVjdHMgaW4gdGhlIGludGVyYWN0aXZlIGVudmlyb25tZW50LiAgWW91IG1heSBmaW5kIGl0IGNvbnZlbmllbnQKLXRvIGtlZXAgc29tZSBvZiB0aGUgaW1wb3J0ZWQgbW9kdWxlcywgc3VjaCBhcwotXHVsaW5re1xtb2R1bGV7b3N9fXsuLi9saWIvbW9kdWxlLW9zLmh0bWx9LCB3aGljaCB0dXJuCi1vdXQgdG8gYmUgbmVlZGVkIGluIG1vc3Qgc2Vzc2lvbnMgd2l0aCB0aGUgaW50ZXJwcmV0ZXIuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLSMgQWRkIGF1dG8tY29tcGxldGlvbiBhbmQgYSBzdG9yZWQgaGlzdG9yeSBmaWxlIG9mIGNvbW1hbmRzIHRvIHlvdXIgUHl0aG9uCi0jIGludGVyYWN0aXZlIGludGVycHJldGVyLiBSZXF1aXJlcyBQeXRob24gMi4wKywgcmVhZGxpbmUuIEF1dG9jb21wbGV0ZSBpcwotIyBib3VuZCB0byB0aGUgRXNjIGtleSBieSBkZWZhdWx0ICh5b3UgY2FuIGNoYW5nZSBpdCAtIHNlZSByZWFkbGluZSBkb2NzKS4KLSMKLSMgU3RvcmUgdGhlIGZpbGUgaW4gfi8ucHlzdGFydHVwLCBhbmQgc2V0IGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHBvaW50Ci0jIHRvIGl0OiAgImV4cG9ydCBQWVRIT05TVEFSVFVQPS9tYXgvaG9tZS9pdGFtYXIvLnB5c3RhcnR1cCIgaW4gYmFzaC4KLSMKLSMgTm90ZSB0aGF0IFBZVEhPTlNUQVJUVVAgZG9lcyAqbm90KiBleHBhbmQgIn4iLCBzbyB5b3UgaGF2ZSB0byBwdXQgaW4gdGhlCi0jIGZ1bGwgcGF0aCB0byB5b3VyIGhvbWUgZGlyZWN0b3J5LgotCi1pbXBvcnQgYXRleGl0Ci1pbXBvcnQgb3MKLWltcG9ydCByZWFkbGluZQotaW1wb3J0IHJsY29tcGxldGVyCi0KLWhpc3RvcnlQYXRoID0gb3MucGF0aC5leHBhbmR1c2VyKCJ+Ly5weWhpc3RvcnkiKQotCi1kZWYgc2F2ZV9oaXN0b3J5KGhpc3RvcnlQYXRoPWhpc3RvcnlQYXRoKToKLSAgICBpbXBvcnQgcmVhZGxpbmUKLSAgICByZWFkbGluZS53cml0ZV9oaXN0b3J5X2ZpbGUoaGlzdG9yeVBhdGgpCi0KLWlmIG9zLnBhdGguZXhpc3RzKGhpc3RvcnlQYXRoKToKLSAgICByZWFkbGluZS5yZWFkX2hpc3RvcnlfZmlsZShoaXN0b3J5UGF0aCkKLQotYXRleGl0LnJlZ2lzdGVyKHNhdmVfaGlzdG9yeSkKLWRlbCBvcywgYXRleGl0LCByZWFkbGluZSwgcmxjb21wbGV0ZXIsIHNhdmVfaGlzdG9yeSwgaGlzdG9yeVBhdGgKLVxlbmR7dmVyYmF0aW19Ci0KLQotXHNlY3Rpb257Q29tbWVudGFyeSBcbGFiZWx7Y29tbWVudGFyeX19Ci0KLVRoaXMgZmFjaWxpdHkgaXMgYW4gZW5vcm1vdXMgc3RlcCBmb3J3YXJkIGNvbXBhcmVkIHRvIGVhcmxpZXIgdmVyc2lvbnMKLW9mIHRoZSBpbnRlcnByZXRlcjsgaG93ZXZlciwgc29tZSB3aXNoZXMgYXJlIGxlZnQ6IEl0IHdvdWxkIGJlIG5pY2UgaWYKLXRoZSBwcm9wZXIgaW5kZW50YXRpb24gd2VyZSBzdWdnZXN0ZWQgb24gY29udGludWF0aW9uIGxpbmVzICh0aGUKLXBhcnNlciBrbm93cyBpZiBhbiBpbmRlbnQgdG9rZW4gaXMgcmVxdWlyZWQgbmV4dCkuICBUaGUgY29tcGxldGlvbgotbWVjaGFuaXNtIG1pZ2h0IHVzZSB0aGUgaW50ZXJwcmV0ZXIncyBzeW1ib2wgdGFibGUuICBBIGNvbW1hbmQgdG8KLWNoZWNrIChvciBldmVuIHN1Z2dlc3QpIG1hdGNoaW5nIHBhcmVudGhlc2VzLCBxdW90ZXMsIGV0Yy4sIHdvdWxkIGFsc28KLWJlIHVzZWZ1bC4KLQotCi1cY2hhcHRlcntGbG9hdGluZyBQb2ludCBBcml0aG1ldGljOiAgSXNzdWVzIGFuZCBMaW1pdGF0aW9uc1xsYWJlbHtmcC1pc3N1ZXN9fQotXHNlY3Rpb25hdXRob3J7VGltIFBldGVyc317dGltX29uZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXR9Ci0KLUZsb2F0aW5nLXBvaW50IG51bWJlcnMgYXJlIHJlcHJlc2VudGVkIGluIGNvbXB1dGVyIGhhcmR3YXJlIGFzCi1iYXNlIDIgKGJpbmFyeSkgZnJhY3Rpb25zLiAgRm9yIGV4YW1wbGUsIHRoZSBkZWNpbWFsIGZyYWN0aW9uCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLTAuMTI1Ci1cZW5ke3ZlcmJhdGltfQotCi1oYXMgdmFsdWUgMS8xMCArIDIvMTAwICsgNS8xMDAwLCBhbmQgaW4gdGhlIHNhbWUgd2F5IHRoZSBiaW5hcnkgZnJhY3Rpb24KLQotXGJlZ2lue3ZlcmJhdGltfQotMC4wMDEKLVxlbmR7dmVyYmF0aW19Ci0KLWhhcyB2YWx1ZSAwLzIgKyAwLzQgKyAxLzguICBUaGVzZSB0d28gZnJhY3Rpb25zIGhhdmUgaWRlbnRpY2FsIHZhbHVlcywKLXRoZSBvbmx5IHJlYWwgZGlmZmVyZW5jZSBiZWluZyB0aGF0IHRoZSBmaXJzdCBpcyB3cml0dGVuIGluIGJhc2UgMTAKLWZyYWN0aW9uYWwgbm90YXRpb24sIGFuZCB0aGUgc2Vjb25kIGluIGJhc2UgMi4KLQotVW5mb3J0dW5hdGVseSwgbW9zdCBkZWNpbWFsIGZyYWN0aW9ucyBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgZXhhY3RseSBhcwotYmluYXJ5IGZyYWN0aW9ucy4gIEEgY29uc2VxdWVuY2UgaXMgdGhhdCwgaW4gZ2VuZXJhbCwgdGhlIGRlY2ltYWwKLWZsb2F0aW5nLXBvaW50IG51bWJlcnMgeW91IGVudGVyIGFyZSBvbmx5IGFwcHJveGltYXRlZCBieSB0aGUgYmluYXJ5Ci1mbG9hdGluZy1wb2ludCBudW1iZXJzIGFjdHVhbGx5IHN0b3JlZCBpbiB0aGUgbWFjaGluZS4KLQotVGhlIHByb2JsZW0gaXMgZWFzaWVyIHRvIHVuZGVyc3RhbmQgYXQgZmlyc3QgaW4gYmFzZSAxMC4gIENvbnNpZGVyIHRoZQotZnJhY3Rpb24gMS8zLiAgWW91IGNhbiBhcHByb3hpbWF0ZSB0aGF0IGFzIGEgYmFzZSAxMCBmcmFjdGlvbjoKLQotXGJlZ2lue3ZlcmJhdGltfQotMC4zCi1cZW5ke3ZlcmJhdGltfQotCi1vciwgYmV0dGVyLAotCi1cYmVnaW57dmVyYmF0aW19Ci0wLjMzCi1cZW5ke3ZlcmJhdGltfQotCi1vciwgYmV0dGVyLAotCi1cYmVnaW57dmVyYmF0aW19Ci0wLjMzMwotXGVuZHt2ZXJiYXRpbX0KLQotYW5kIHNvIG9uLiAgTm8gbWF0dGVyIGhvdyBtYW55IGRpZ2l0cyB5b3UncmUgd2lsbGluZyB0byB3cml0ZSBkb3duLCB0aGUKLXJlc3VsdCB3aWxsIG5ldmVyIGJlIGV4YWN0bHkgMS8zLCBidXQgd2lsbCBiZSBhbiBpbmNyZWFzaW5nbHkgYmV0dGVyCi1hcHByb3hpbWF0aW9uIG9mIDEvMy4KLQotSW4gdGhlIHNhbWUgd2F5LCBubyBtYXR0ZXIgaG93IG1hbnkgYmFzZSAyIGRpZ2l0cyB5b3UncmUgd2lsbGluZyB0bwotdXNlLCB0aGUgZGVjaW1hbCB2YWx1ZSAwLjEgY2Fubm90IGJlIHJlcHJlc2VudGVkIGV4YWN0bHkgYXMgYSBiYXNlIDIKLWZyYWN0aW9uLiAgSW4gYmFzZSAyLCAxLzEwIGlzIHRoZSBpbmZpbml0ZWx5IHJlcGVhdGluZyBmcmFjdGlvbgotCi1cYmVnaW57dmVyYmF0aW19Ci0wLjAwMDExMDAxMTAwMTEwMDExMDAxMTAwMTEwMDExMDAxMTAwMTEwMDExMDAxMTAwMTEuLi4KLVxlbmR7dmVyYmF0aW19Ci0KLVN0b3AgYXQgYW55IGZpbml0ZSBudW1iZXIgb2YgYml0cywgYW5kIHlvdSBnZXQgYW4gYXBwcm94aW1hdGlvbi4gIFRoaXMKLWlzIHdoeSB5b3Ugc2VlIHRoaW5ncyBsaWtlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gMC4xCi0wLjEwMDAwMDAwMDAwMDAwMDAxCi1cZW5ke3ZlcmJhdGltfQotCi1PbiBtb3N0IG1hY2hpbmVzIHRvZGF5LCB0aGF0IGlzIHdoYXQgeW91J2xsIHNlZSBpZiB5b3UgZW50ZXIgMC4xIGF0Ci1hIFB5dGhvbiBwcm9tcHQuICBZb3UgbWF5IG5vdCwgdGhvdWdoLCBiZWNhdXNlIHRoZSBudW1iZXIgb2YgYml0cwotdXNlZCBieSB0aGUgaGFyZHdhcmUgdG8gc3RvcmUgZmxvYXRpbmctcG9pbnQgdmFsdWVzIGNhbiB2YXJ5IGFjcm9zcwotbWFjaGluZXMsIGFuZCBQeXRob24gb25seSBwcmludHMgYSBkZWNpbWFsIGFwcHJveGltYXRpb24gdG8gdGhlIHRydWUKLWRlY2ltYWwgdmFsdWUgb2YgdGhlIGJpbmFyeSBhcHByb3hpbWF0aW9uIHN0b3JlZCBieSB0aGUgbWFjaGluZS4gIE9uCi1tb3N0IG1hY2hpbmVzLCBpZiBQeXRob24gd2VyZSB0byBwcmludCB0aGUgdHJ1ZSBkZWNpbWFsIHZhbHVlIG9mCi10aGUgYmluYXJ5IGFwcHJveGltYXRpb24gc3RvcmVkIGZvciAwLjEsIGl0IHdvdWxkIGhhdmUgdG8gZGlzcGxheQotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gMC4xCi0wLjEwMDAwMDAwMDAwMDAwMDAwNTU1MTExNTEyMzEyNTc4MjcwMjExODE1ODM0MDQ1NDEwMTU2MjUKLVxlbmR7dmVyYmF0aW19Ci0KLWluc3RlYWQhICBUaGUgUHl0aG9uIHByb21wdCB1c2VzIHRoZSBidWlsdGluCi1cZnVuY3Rpb257cmVwcigpfSBmdW5jdGlvbiB0byBvYnRhaW4gYSBzdHJpbmcgdmVyc2lvbiBvZiBldmVyeXRoaW5nIGl0Ci1kaXNwbGF5cy4gIEZvciBmbG9hdHMsIFxjb2Rle3JlcHIoXHZhcntmbG9hdH0pfSByb3VuZHMgdGhlIHRydWUKLWRlY2ltYWwgdmFsdWUgdG8gMTcgc2lnbmlmaWNhbnQgZGlnaXRzLCBnaXZpbmcKLQotXGJlZ2lue3ZlcmJhdGltfQotMC4xMDAwMDAwMDAwMDAwMDAwMQotXGVuZHt2ZXJiYXRpbX0KLQotXGNvZGV7cmVwcihcdmFye2Zsb2F0fSl9IHByb2R1Y2VzIDE3IHNpZ25pZmljYW50IGRpZ2l0cyBiZWNhdXNlIGl0Ci10dXJucyBvdXQgdGhhdCdzIGVub3VnaCAob24gbW9zdCBtYWNoaW5lcykgc28gdGhhdAotXGNvZGV7ZXZhbChyZXByKFx2YXJ7eH0pKSA9PSBcdmFye3h9fSBleGFjdGx5IGZvciBhbGwgZmluaXRlIGZsb2F0cwotXHZhcnt4fSwgYnV0IHJvdW5kaW5nIHRvIDE2IGRpZ2l0cyBpcyBub3QgZW5vdWdoIHRvIG1ha2UgdGhhdCB0cnVlLgotCi1Ob3RlIHRoYXQgdGhpcyBpcyBpbiB0aGUgdmVyeSBuYXR1cmUgb2YgYmluYXJ5IGZsb2F0aW5nLXBvaW50OiB0aGlzIGlzCi1ub3QgYSBidWcgaW4gUHl0aG9uLCBhbmQgaXQgaXMgbm90IGEgYnVnIGluIHlvdXIgY29kZSBlaXRoZXIuICBZb3UnbGwKLXNlZSB0aGUgc2FtZSBraW5kIG9mIHRoaW5nIGluIGFsbCBsYW5ndWFnZXMgdGhhdCBzdXBwb3J0IHlvdXIKLWhhcmR3YXJlJ3MgZmxvYXRpbmctcG9pbnQgYXJpdGhtZXRpYyAoYWx0aG91Z2ggc29tZSBsYW5ndWFnZXMgbWF5Ci1ub3QgXGVtcGh7ZGlzcGxheX0gdGhlIGRpZmZlcmVuY2UgYnkgZGVmYXVsdCwgb3IgaW4gYWxsIG91dHB1dCBtb2RlcykuCi0KLVB5dGhvbidzIGJ1aWx0aW4gXGZ1bmN0aW9ue3N0cigpfSBmdW5jdGlvbiBwcm9kdWNlcyBvbmx5IDEyCi1zaWduaWZpY2FudCBkaWdpdHMsIGFuZCB5b3UgbWF5IHdpc2ggdG8gdXNlIHRoYXQgaW5zdGVhZC4gIEl0J3MKLXVudXN1YWwgZm9yIFxjb2Rle2V2YWwoc3RyKFx2YXJ7eH0pKX0gdG8gcmVwcm9kdWNlIFx2YXJ7eH0sIGJ1dCB0aGUKLW91dHB1dCBtYXkgYmUgbW9yZSBwbGVhc2FudCB0byBsb29rIGF0OgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gcHJpbnQgc3RyKDAuMSkKLTAuMQotXGVuZHt2ZXJiYXRpbX0KLQotSXQncyBpbXBvcnRhbnQgdG8gcmVhbGl6ZSB0aGF0IHRoaXMgaXMsIGluIGEgcmVhbCBzZW5zZSwgYW4gaWxsdXNpb246Ci10aGUgdmFsdWUgaW4gdGhlIG1hY2hpbmUgaXMgbm90IGV4YWN0bHkgMS8xMCwgeW91J3JlIHNpbXBseSByb3VuZGluZwotdGhlIFxlbXBoe2Rpc3BsYXl9IG9mIHRoZSB0cnVlIG1hY2hpbmUgdmFsdWUuCi0KLU90aGVyIHN1cnByaXNlcyBmb2xsb3cgZnJvbSB0aGlzIG9uZS4gIEZvciBleGFtcGxlLCBhZnRlciBzZWVpbmcKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IDAuMQotMC4xMDAwMDAwMDAwMDAwMDAwMQotXGVuZHt2ZXJiYXRpbX0KLQoteW91IG1heSBiZSB0ZW1wdGVkIHRvIHVzZSB0aGUgXGZ1bmN0aW9ue3JvdW5kKCl9IGZ1bmN0aW9uIHRvIGNob3AgaXQKLWJhY2sgdG8gdGhlIHNpbmdsZSBkaWdpdCB5b3UgZXhwZWN0LiAgQnV0IHRoYXQgbWFrZXMgbm8gZGlmZmVyZW5jZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHJvdW5kKDAuMSwgMSkKLTAuMTAwMDAwMDAwMDAwMDAwMDEKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBwcm9ibGVtIGlzIHRoYXQgdGhlIGJpbmFyeSBmbG9hdGluZy1wb2ludCB2YWx1ZSBzdG9yZWQgZm9yICIwLjEiCi13YXMgYWxyZWFkeSB0aGUgYmVzdCBwb3NzaWJsZSBiaW5hcnkgYXBwcm94aW1hdGlvbiB0byAxLzEwLCBzbyB0cnlpbmcKLXRvIHJvdW5kIGl0IGFnYWluIGNhbid0IG1ha2UgaXQgYmV0dGVyOiAgaXQgd2FzIGFscmVhZHkgYXMgZ29vZCBhcyBpdAotZ2V0cy4KLQotQW5vdGhlciBjb25zZXF1ZW5jZSBpcyB0aGF0IHNpbmNlIDAuMSBpcyBub3QgZXhhY3RseSAxLzEwLAotc3VtbWluZyB0ZW4gdmFsdWVzIG9mIDAuMSBtYXkgbm90IHlpZWxkIGV4YWN0bHkgMS4wLCBlaXRoZXI6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBzdW0gPSAwLjAKLT4+PiBmb3IgaSBpbiByYW5nZSgxMCk6Ci0uLi4gICAgIHN1bSArPSAwLjEKLS4uLgotPj4+IHN1bQotMC45OTk5OTk5OTk5OTk5OTk4OQotXGVuZHt2ZXJiYXRpbX0KLQotQmluYXJ5IGZsb2F0aW5nLXBvaW50IGFyaXRobWV0aWMgaG9sZHMgbWFueSBzdXJwcmlzZXMgbGlrZSB0aGlzLiAgVGhlCi1wcm9ibGVtIHdpdGggIjAuMSIgaXMgZXhwbGFpbmVkIGluIHByZWNpc2UgZGV0YWlsIGJlbG93LCBpbiB0aGUKLSJSZXByZXNlbnRhdGlvbiBFcnJvciIgc2VjdGlvbi4gIFNlZQotXGNpdGV0aXRsZVtodHRwOi8vd3d3LmxhaGV5LmNvbS9mbG9hdC5odG1de1RoZSBQZXJpbHMgb2YgRmxvYXRpbmcKLVBvaW50fSBmb3IgYSBtb3JlIGNvbXBsZXRlIGFjY291bnQgb2Ygb3RoZXIgY29tbW9uIHN1cnByaXNlcy4KLQotQXMgdGhhdCBzYXlzIG5lYXIgdGhlIGVuZCwgYGB0aGVyZSBhcmUgbm8gZWFzeSBhbnN3ZXJzLicnICBTdGlsbCwKLWRvbid0IGJlIHVuZHVseSB3YXJ5IG9mIGZsb2F0aW5nLXBvaW50ISAgVGhlIGVycm9ycyBpbiBQeXRob24gZmxvYXQKLW9wZXJhdGlvbnMgYXJlIGluaGVyaXRlZCBmcm9tIHRoZSBmbG9hdGluZy1wb2ludCBoYXJkd2FyZSwgYW5kIG9uIG1vc3QKLW1hY2hpbmVzIGFyZSBvbiB0aGUgb3JkZXIgb2Ygbm8gbW9yZSB0aGFuIDEgcGFydCBpbiAyKio1MyBwZXIKLW9wZXJhdGlvbi4gIFRoYXQncyBtb3JlIHRoYW4gYWRlcXVhdGUgZm9yIG1vc3QgdGFza3MsIGJ1dCB5b3UgZG8gbmVlZAotdG8ga2VlcCBpbiBtaW5kIHRoYXQgaXQncyBub3QgZGVjaW1hbCBhcml0aG1ldGljLCBhbmQgdGhhdCBldmVyeSBmbG9hdAotb3BlcmF0aW9uIGNhbiBzdWZmZXIgYSBuZXcgcm91bmRpbmcgZXJyb3IuCi0KLVdoaWxlIHBhdGhvbG9naWNhbCBjYXNlcyBkbyBleGlzdCwgZm9yIG1vc3QgY2FzdWFsIHVzZSBvZgotZmxvYXRpbmctcG9pbnQgYXJpdGhtZXRpYyB5b3UnbGwgc2VlIHRoZSByZXN1bHQgeW91IGV4cGVjdCBpbiB0aGUgZW5kCi1pZiB5b3Ugc2ltcGx5IHJvdW5kIHRoZSBkaXNwbGF5IG9mIHlvdXIgZmluYWwgcmVzdWx0cyB0byB0aGUgbnVtYmVyIG9mCi1kZWNpbWFsIGRpZ2l0cyB5b3UgZXhwZWN0LiAgXGZ1bmN0aW9ue3N0cigpfSB1c3VhbGx5IHN1ZmZpY2VzLCBhbmQgZm9yCi1maW5lciBjb250cm9sIHNlZSB0aGUgZGlzY3Vzc2lvbiBvZiBQeXRob24ncyBcY29kZXtcJX0gZm9ybWF0Ci1vcGVyYXRvcjogdGhlIFxjb2Rle1wlZ30sIFxjb2Rle1wlZn0gYW5kIFxjb2Rle1wlZX0gZm9ybWF0IGNvZGVzCi1zdXBwbHkgZmxleGlibGUgYW5kIGVhc3kgd2F5cyB0byByb3VuZCBmbG9hdCByZXN1bHRzIGZvciBkaXNwbGF5LgotCi0KLVxzZWN0aW9ue1JlcHJlc2VudGF0aW9uIEVycm9yCi0gICAgICAgICBcbGFiZWx7ZnAtZXJyb3J9fQotCi1UaGlzIHNlY3Rpb24gZXhwbGFpbnMgdGhlIGBgMC4xJycgZXhhbXBsZSBpbiBkZXRhaWwsIGFuZCBzaG93cyBob3cKLXlvdSBjYW4gcGVyZm9ybSBhbiBleGFjdCBhbmFseXNpcyBvZiBjYXNlcyBsaWtlIHRoaXMgeW91cnNlbGYuICBCYXNpYwotZmFtaWxpYXJpdHkgd2l0aCBiaW5hcnkgZmxvYXRpbmctcG9pbnQgcmVwcmVzZW50YXRpb24gaXMgYXNzdW1lZC4KLQotXGRmbntSZXByZXNlbnRhdGlvbiBlcnJvcn0gcmVmZXJzIHRvIHRoZSBmYWN0IHRoYXQgc29tZSAobW9zdCwgYWN0dWFsbHkpCi1kZWNpbWFsIGZyYWN0aW9ucyBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgZXhhY3RseSBhcyBiaW5hcnkgKGJhc2UgMikKLWZyYWN0aW9ucy4gIFRoaXMgaXMgdGhlIGNoaWVmIHJlYXNvbiB3aHkgUHl0aG9uIChvciBQZXJsLCBDLCBcQ3BwLAotSmF2YSwgRm9ydHJhbiwgYW5kIG1hbnkgb3RoZXJzKSBvZnRlbiB3b24ndCBkaXNwbGF5IHRoZSBleGFjdCBkZWNpbWFsCi1udW1iZXIgeW91IGV4cGVjdDoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IDAuMQotMC4xMDAwMDAwMDAwMDAwMDAwMQotXGVuZHt2ZXJiYXRpbX0KLQotV2h5IGlzIHRoYXQ/ICAxLzEwIGlzIG5vdCBleGFjdGx5IHJlcHJlc2VudGFibGUgYXMgYSBiaW5hcnkgZnJhY3Rpb24uCi1BbG1vc3QgYWxsIG1hY2hpbmVzIHRvZGF5IChOb3ZlbWJlciAyMDAwKSB1c2UgSUVFRS03NTQgZmxvYXRpbmcgcG9pbnQKLWFyaXRobWV0aWMsIGFuZCBhbG1vc3QgYWxsIHBsYXRmb3JtcyBtYXAgUHl0aG9uIGZsb2F0cyB0byBJRUVFLTc1NAotImRvdWJsZSBwcmVjaXNpb24iLiAgNzU0IGRvdWJsZXMgY29udGFpbiA1MyBiaXRzIG9mIHByZWNpc2lvbiwgc28gb24KLWlucHV0IHRoZSBjb21wdXRlciBzdHJpdmVzIHRvIGNvbnZlcnQgMC4xIHRvIHRoZSBjbG9zZXN0IGZyYWN0aW9uIGl0IGNhbgotb2YgdGhlIGZvcm0gXHZhcntKfS8yKipcdmFye059IHdoZXJlIFx2YXJ7Sn0gaXMgYW4gaW50ZWdlciBjb250YWluaW5nCi1leGFjdGx5IDUzIGJpdHMuICBSZXdyaXRpbmcKLQotXGJlZ2lue3ZlcmJhdGltfQotIDEgLyAxMCB+PSBKIC8gKDIqKk4pCi1cZW5ke3ZlcmJhdGltfQotCi1hcwotCi1cYmVnaW57dmVyYmF0aW19Ci1KIH49IDIqKk4gLyAxMAotXGVuZHt2ZXJiYXRpbX0KLQotYW5kIHJlY2FsbGluZyB0aGF0IFx2YXJ7Sn0gaGFzIGV4YWN0bHkgNTMgYml0cyAoaXMgXGNvZGV7Pj0gMioqNTJ9IGJ1dAotXGNvZGV7PCAyKio1M30pLCB0aGUgYmVzdCB2YWx1ZSBmb3IgXHZhcntOfSBpcyA1NjoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IDIqKjUyCi00NTAzNTk5NjI3MzcwNDk2TAotPj4+IDIqKjUzCi05MDA3MTk5MjU0NzQwOTkyTAotPj4+IDIqKjU2LzEwCi03MjA1NzU5NDAzNzkyNzkzTAotXGVuZHt2ZXJiYXRpbX0KLQotVGhhdCBpcywgNTYgaXMgdGhlIG9ubHkgdmFsdWUgZm9yIFx2YXJ7Tn0gdGhhdCBsZWF2ZXMgXHZhcntKfSB3aXRoCi1leGFjdGx5IDUzIGJpdHMuICBUaGUgYmVzdCBwb3NzaWJsZSB2YWx1ZSBmb3IgXHZhcntKfSBpcyB0aGVuIHRoYXQKLXF1b3RpZW50IHJvdW5kZWQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBxLCByID0gZGl2bW9kKDIqKjU2LCAxMCkKLT4+PiByCi02TAotXGVuZHt2ZXJiYXRpbX0KLQotU2luY2UgdGhlIHJlbWFpbmRlciBpcyBtb3JlIHRoYW4gaGFsZiBvZiAxMCwgdGhlIGJlc3QgYXBwcm94aW1hdGlvbiBpcwotb2J0YWluZWQgYnkgcm91bmRpbmcgdXA6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBxKzEKLTcyMDU3NTk0MDM3OTI3OTRMCi1cZW5ke3ZlcmJhdGltfQotCi1UaGVyZWZvcmUgdGhlIGJlc3QgcG9zc2libGUgYXBwcm94aW1hdGlvbiB0byAxLzEwIGluIDc1NCBkb3VibGUKLXByZWNpc2lvbiBpcyB0aGF0IG92ZXIgMioqNTYsIG9yCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLTcyMDU3NTk0MDM3OTI3OTQgLyA3MjA1NzU5NDAzNzkyNzkzNgotXGVuZHt2ZXJiYXRpbX0KLQotTm90ZSB0aGF0IHNpbmNlIHdlIHJvdW5kZWQgdXAsIHRoaXMgaXMgYWN0dWFsbHkgYSBsaXR0bGUgYml0IGxhcmdlciB0aGFuCi0xLzEwOyBpZiB3ZSBoYWQgbm90IHJvdW5kZWQgdXAsIHRoZSBxdW90aWVudCB3b3VsZCBoYXZlIGJlZW4gYSBsaXR0bGUKLWJpdCBzbWFsbGVyIHRoYW4gMS8xMC4gIEJ1dCBpbiBubyBjYXNlIGNhbiBpdCBiZSBcZW1waHtleGFjdGx5fSAxLzEwIQotCi1TbyB0aGUgY29tcHV0ZXIgbmV2ZXIgYGBzZWVzJycgMS8xMDogIHdoYXQgaXQgc2VlcyBpcyB0aGUgZXhhY3QKLWZyYWN0aW9uIGdpdmVuIGFib3ZlLCB0aGUgYmVzdCA3NTQgZG91YmxlIGFwcHJveGltYXRpb24gaXQgY2FuIGdldDoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IC4xICogMioqNTYKLTcyMDU3NTk0MDM3OTI3OTQuMAotXGVuZHt2ZXJiYXRpbX0KLQotSWYgd2UgbXVsdGlwbHkgdGhhdCBmcmFjdGlvbiBieSAxMCoqMzAsIHdlIGNhbiBzZWUgdGhlICh0cnVuY2F0ZWQpCi12YWx1ZSBvZiBpdHMgMzAgbW9zdCBzaWduaWZpY2FudCBkZWNpbWFsIGRpZ2l0czoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IDcyMDU3NTk0MDM3OTI3OTQgKiAxMCoqMzAgLyAyKio1NgotMTAwMDAwMDAwMDAwMDAwMDA1NTUxMTE1MTIzMTI1TAotXGVuZHt2ZXJiYXRpbX0KLQotbWVhbmluZyB0aGF0IHRoZSBleGFjdCBudW1iZXIgc3RvcmVkIGluIHRoZSBjb21wdXRlciBpcyBhcHByb3hpbWF0ZWx5Ci1lcXVhbCB0byB0aGUgZGVjaW1hbCB2YWx1ZSAwLjEwMDAwMDAwMDAwMDAwMDAwNTU1MTExNTEyMzEyNS4gIFJvdW5kaW5nCi10aGF0IHRvIDE3IHNpZ25pZmljYW50IGRpZ2l0cyBnaXZlcyB0aGUgMC4xMDAwMDAwMDAwMDAwMDAwMSB0aGF0IFB5dGhvbgotZGlzcGxheXMgKHdlbGwsIHdpbGwgZGlzcGxheSBvbiBhbnkgNzU0LWNvbmZvcm1pbmcgcGxhdGZvcm0gdGhhdCBkb2VzCi1iZXN0LXBvc3NpYmxlIGlucHV0IGFuZCBvdXRwdXQgY29udmVyc2lvbnMgaW4gaXRzIEMgbGlicmFyeSAtLS0geW91cnMgbWF5Ci1ub3QhKS4KLQotXGNoYXB0ZXJ7SGlzdG9yeSBhbmQgTGljZW5zZX0KLVxpbnB1dHtsaWNlbnNlfQotCi1caW5wdXR7Z2xvc3Nhcnl9Ci0KLVxpbnB1dHt0dXQuaW5kfQotCi1cZW5ke2RvY3VtZW50fQpkaWZmIC0tZ2l0IGEvRG9jL3doYXRzbmV3L3doYXRzbmV3MjAudGV4IGIvRG9jL3doYXRzbmV3L3doYXRzbmV3MjAudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjBkN2RjLi4wMDAwMDAwCi0tLSBhL0RvYy93aGF0c25ldy93aGF0c25ldzIwLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDEzMzcgKzAsMCBAQAotXGRvY3VtZW50Y2xhc3N7aG93dG99Ci0KLSUgJElkJAotCi1cdGl0bGV7V2hhdCdzIE5ldyBpbiBQeXRob24gMi4wfQotXHJlbGVhc2V7MS4wMn0KLVxhdXRob3J7QS5NLiBLdWNobGluZyBhbmQgTW9zaGUgWmFka2F9Ci1cYXV0aG9yYWRkcmVzc3sKLQlcc3Ryb25ne1B5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9ufVxcCi0JRW1haWw6IFxlbWFpbHthbWtAYW1rLmNhfSwgXGVtYWlse21vc2hlekB0d2lzdGVkbWF0cml4LmNvbX0KLX0KLVxiZWdpbntkb2N1bWVudH0KLVxtYWtldGl0bGVcdGFibGVvZmNvbnRlbnRzCi0KLVxzZWN0aW9ue0ludHJvZHVjdGlvbn0KLQotQSBuZXcgcmVsZWFzZSBvZiBQeXRob24sIHZlcnNpb24gMi4wLCB3YXMgcmVsZWFzZWQgb24gT2N0b2JlciAxNiwgMjAwMC4gVGhpcwotYXJ0aWNsZSBjb3ZlcnMgdGhlIGV4Y2l0aW5nIG5ldyBmZWF0dXJlcyBpbiAyLjAsIGhpZ2hsaWdodHMgc29tZSBvdGhlcgotdXNlZnVsIGNoYW5nZXMsIGFuZCBwb2ludHMgb3V0IGEgZmV3IGluY29tcGF0aWJsZSBjaGFuZ2VzIHRoYXQgbWF5IHJlcXVpcmUKLXJld3JpdGluZyBjb2RlLgotCi1QeXRob24ncyBkZXZlbG9wbWVudCBuZXZlciBjb21wbGV0ZWx5IHN0b3BzIGJldHdlZW4gcmVsZWFzZXMsIGFuZCBhCi1zdGVhZHkgZmxvdyBvZiBidWcgZml4ZXMgYW5kIGltcHJvdmVtZW50cyBhcmUgYWx3YXlzIGJlaW5nIHN1Ym1pdHRlZC4KLUEgaG9zdCBvZiBtaW5vciBmaXhlcywgYSBmZXcgb3B0aW1pemF0aW9ucywgYWRkaXRpb25hbCBkb2NzdHJpbmdzLCBhbmQKLWJldHRlciBlcnJvciBtZXNzYWdlcyB3ZW50IGludG8gMi4wOyB0byBsaXN0IHRoZW0gYWxsIHdvdWxkIGJlCi1pbXBvc3NpYmxlLCBidXQgdGhleSdyZSBjZXJ0YWlubHkgc2lnbmlmaWNhbnQuICBDb25zdWx0IHRoZQotcHVibGljbHktYXZhaWxhYmxlIENWUyBsb2dzIGlmIHlvdSB3YW50IHRvIHNlZSB0aGUgZnVsbCBsaXN0LiAgVGhpcwotcHJvZ3Jlc3MgaXMgZHVlIHRvIHRoZSBmaXZlIGRldmVsb3BlcnMgd29ya2luZyBmb3IgCi1QeXRob25MYWJzIGFyZSBub3cgZ2V0dGluZyBwYWlkIHRvIHNwZW5kIHRoZWlyIGRheXMgZml4aW5nIGJ1Z3MsCi1hbmQgYWxzbyBkdWUgdG8gdGhlIGltcHJvdmVkIGNvbW11bmljYXRpb24gcmVzdWx0aW5nIAotZnJvbSBtb3ZpbmcgdG8gU291cmNlRm9yZ2UuCi0KLSUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257V2hhdCBBYm91dCBQeXRob24gMS42P30KLQotUHl0aG9uIDEuNiBjYW4gYmUgdGhvdWdodCBvZiBhcyB0aGUgQ29udHJhY3R1YWwgT2JsaWdhdGlvbnMgUHl0aG9uCi1yZWxlYXNlLiAgQWZ0ZXIgdGhlIGNvcmUgZGV2ZWxvcG1lbnQgdGVhbSBsZWZ0IENOUkkgaW4gTWF5IDIwMDAsIENOUkkKLXJlcXVlc3RlZCB0aGF0IGEgMS42IHJlbGVhc2UgYmUgY3JlYXRlZCwgY29udGFpbmluZyBhbGwgdGhlIHdvcmsgb24KLVB5dGhvbiB0aGF0IGhhZCBiZWVuIHBlcmZvcm1lZCBhdCBDTlJJLiAgUHl0aG9uIDEuNiB0aGVyZWZvcmUKLXJlcHJlc2VudHMgdGhlIHN0YXRlIG9mIHRoZSBDVlMgdHJlZSBhcyBvZiBNYXkgMjAwMCwgd2l0aCB0aGUgbW9zdAotc2lnbmlmaWNhbnQgbmV3IGZlYXR1cmUgYmVpbmcgVW5pY29kZSBzdXBwb3J0LiAgRGV2ZWxvcG1lbnQgY29udGludWVkCi1hZnRlciBNYXksIG9mIGNvdXJzZSwgc28gdGhlIDEuNiB0cmVlIHJlY2VpdmVkIGEgZmV3IGZpeGVzIHRvIGVuc3VyZQotdGhhdCBpdCdzIGZvcndhcmQtY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjAuICAxLjYgaXMgdGhlcmVmb3JlIHBhcnQKLW9mIFB5dGhvbidzIGV2b2x1dGlvbiwgYW5kIG5vdCBhIHNpZGUgYnJhbmNoLgotCi1Tbywgc2hvdWxkIHlvdSB0YWtlIG11Y2ggaW50ZXJlc3QgaW4gUHl0aG9uIDEuNj8gIFByb2JhYmx5IG5vdC4gIFRoZQotMS42ZmluYWwgYW5kIDIuMGJldGExIHJlbGVhc2VzIHdlcmUgbWFkZSBvbiB0aGUgc2FtZSBkYXkgKFNlcHRlbWJlciA1LAotMjAwMCksIHRoZSBwbGFuIGJlaW5nIHRvIGZpbmFsaXplIFB5dGhvbiAyLjAgd2l0aGluIGEgbW9udGggb3Igc28uICBJZgoteW91IGhhdmUgYXBwbGljYXRpb25zIHRvIG1haW50YWluLCB0aGVyZSBzZWVtcyBsaXR0bGUgcG9pbnQgaW4KLWJyZWFraW5nIHRoaW5ncyBieSBtb3ZpbmcgdG8gMS42LCBmaXhpbmcgdGhlbSwgYW5kIHRoZW4gaGF2aW5nIGFub3RoZXIKLXJvdW5kIG9mIGJyZWFrYWdlIHdpdGhpbiBhIG1vbnRoIGJ5IG1vdmluZyB0byAyLjA7IHlvdSdyZSBiZXR0ZXIgb2ZmCi1qdXN0IGdvaW5nIHN0cmFpZ2h0IHRvIDIuMC4gIE1vc3Qgb2YgdGhlIHJlYWxseSBpbnRlcmVzdGluZyBmZWF0dXJlcwotZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQgYXJlIG9ubHkgaW4gMi4wLCBiZWNhdXNlIGEgbG90IG9mIHdvcmsgd2FzCi1kb25lIGJldHdlZW4gTWF5IGFuZCBTZXB0ZW1iZXIuICAKLQotJSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntOZXcgRGV2ZWxvcG1lbnQgUHJvY2Vzc30KLQotVGhlIG1vc3QgaW1wb3J0YW50IGNoYW5nZSBpbiBQeXRob24gMi4wIG1heSBub3QgYmUgdG8gdGhlIGNvZGUgYXQgYWxsLAotYnV0IHRvIGhvdyBQeXRob24gaXMgZGV2ZWxvcGVkOiBpbiBNYXkgMjAwMCB0aGUgUHl0aG9uIGRldmVsb3BlcnMKLWJlZ2FuIHVzaW5nIHRoZSB0b29scyBtYWRlIGF2YWlsYWJsZSBieSBTb3VyY2VGb3JnZSBmb3Igc3RvcmluZyAKLXNvdXJjZSBjb2RlLCB0cmFja2luZyBidWcgcmVwb3J0cywgYW5kIG1hbmFnaW5nIHRoZSBxdWV1ZSBvZiBwYXRjaAotc3VibWlzc2lvbnMuICBUbyByZXBvcnQgYnVncyBvciBzdWJtaXQgcGF0Y2hlcyBmb3IgUHl0aG9uIDIuMCwgdXNlIHRoZQotYnVnIHRyYWNraW5nIGFuZCBwYXRjaCBtYW5hZ2VyIHRvb2xzIGF2YWlsYWJsZSBmcm9tIFB5dGhvbidzIHByb2plY3QKLXBhZ2UsIGxvY2F0ZWQgYXQgXHVybHtodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3B5dGhvbi99LgotCi1UaGUgbW9zdCBpbXBvcnRhbnQgb2YgdGhlIHNlcnZpY2VzIG5vdyBob3N0ZWQgYXQgU291cmNlRm9yZ2UgaXMgdGhlCi1QeXRob24gQ1ZTIHRyZWUsIHRoZSB2ZXJzaW9uLWNvbnRyb2xsZWQgcmVwb3NpdG9yeSBjb250YWluaW5nIHRoZQotc291cmNlIGNvZGUgZm9yIFB5dGhvbi4gIFByZXZpb3VzbHksIHRoZXJlIHdlcmUgcm91Z2hseSA3IG9yIHNvIHBlb3BsZQotd2hvIGhhZCB3cml0ZSBhY2Nlc3MgdG8gdGhlIENWUyB0cmVlLCBhbmQgYWxsIHBhdGNoZXMgaGFkIHRvIGJlCi1pbnNwZWN0ZWQgYW5kIGNoZWNrZWQgaW4gYnkgb25lIG9mIHRoZSBwZW9wbGUgb24gdGhpcyBzaG9ydCBsaXN0LgotT2J2aW91c2x5LCB0aGlzIHdhc24ndCB2ZXJ5IHNjYWxhYmxlLiAgQnkgbW92aW5nIHRoZSBDVlMgdHJlZSB0bwotU291cmNlRm9yZ2UsIGl0IGJlY2FtZSBwb3NzaWJsZSB0byBncmFudCB3cml0ZSBhY2Nlc3MgdG8gbW9yZSBwZW9wbGU7Ci1hcyBvZiBTZXB0ZW1iZXIgMjAwMCB0aGVyZSB3ZXJlIDI3IHBlb3BsZSBhYmxlIHRvIGNoZWNrIGluIGNoYW5nZXMsIGEKLWZvdXJmb2xkIGluY3JlYXNlLiAgVGhpcyBtYWtlcyBwb3NzaWJsZSBsYXJnZS1zY2FsZSBjaGFuZ2VzIHRoYXQKLXdvdWxkbid0IGJlIGF0dGVtcHRlZCBpZiB0aGV5J2QgaGF2ZSB0byBiZSBmaWx0ZXJlZCB0aHJvdWdoIHRoZSBzbWFsbAotZ3JvdXAgb2YgY29yZSBkZXZlbG9wZXJzLiAgRm9yIGV4YW1wbGUsIG9uZSBkYXkgUGV0ZXIgU2NobmVpZGVyLUthbXAKLXRvb2sgaXQgaW50byBoaXMgaGVhZCB0byBkcm9wIEtcJlIgQyBjb21wYXRpYmlsaXR5IGFuZCBjb252ZXJ0IHRoZSBDCi1zb3VyY2UgZm9yIFB5dGhvbiB0byBBTlNJIEMuIEFmdGVyIGdldHRpbmcgYXBwcm92YWwgb24gdGhlIHB5dGhvbi1kZXYKLW1haWxpbmcgbGlzdCwgaGUgbGF1bmNoZWQgaW50byBhIGZsdXJyeSBvZiBjaGVja2lucyB0aGF0IGxhc3RlZCBhYm91dAotYSB3ZWVrLCBvdGhlciBkZXZlbG9wZXJzIGpvaW5lZCBpbiB0byBoZWxwLCBhbmQgdGhlIGpvYiB3YXMgZG9uZS4gIElmCi10aGVyZSB3ZXJlIG9ubHkgNSBwZW9wbGUgd2l0aCB3cml0ZSBhY2Nlc3MsIHByb2JhYmx5IHRoYXQgdGFzayB3b3VsZAotaGF2ZSBiZWVuIHZpZXdlZCBhcyBgYG5pY2UsIGJ1dCBub3Qgd29ydGggdGhlIHRpbWUgYW5kIGVmZm9ydCBuZWVkZWQnJwotYW5kIGl0IHdvdWxkIG5ldmVyIGhhdmUgZ290dGVuIGRvbmUuCi0KLVRoZSBzaGlmdCB0byB1c2luZyBTb3VyY2VGb3JnZSdzIHNlcnZpY2VzIGhhcyByZXN1bHRlZCBpbiBhIHJlbWFya2FibGUKLWluY3JlYXNlIGluIHRoZSBzcGVlZCBvZiBkZXZlbG9wbWVudC4gIFBhdGNoZXMgbm93IGdldCBzdWJtaXR0ZWQsCi1jb21tZW50ZWQgb24sIHJldmlzZWQgYnkgcGVvcGxlIG90aGVyIHRoYW4gdGhlIG9yaWdpbmFsIHN1Ym1pdHRlciwgYW5kCi1ib3VuY2VkIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gcGVvcGxlIHVudGlsIHRoZSBwYXRjaCBpcyBkZWVtZWQgd29ydGgKLWNoZWNraW5nIGluLiAgQnVncyBhcmUgdHJhY2tlZCBpbiBvbmUgY2VudHJhbCBsb2NhdGlvbiBhbmQgY2FuIGJlCi1hc3NpZ25lZCB0byBhIHNwZWNpZmljIHBlcnNvbiBmb3IgZml4aW5nLCBhbmQgd2UgY2FuIGNvdW50IHRoZSBudW1iZXIKLW9mIG9wZW4gYnVncyB0byBtZWFzdXJlIHByb2dyZXNzLiAgVGhpcyBkaWRuJ3QgY29tZSB3aXRob3V0IGEgY29zdDoKLWRldmVsb3BlcnMgbm93IGhhdmUgbW9yZSBlLW1haWwgdG8gZGVhbCB3aXRoLCBtb3JlIG1haWxpbmcgbGlzdHMgdG8KLWZvbGxvdywgYW5kIHNwZWNpYWwgdG9vbHMgaGFkIHRvIGJlIHdyaXR0ZW4gZm9yIHRoZSBuZXcgZW52aXJvbm1lbnQuCi1Gb3IgZXhhbXBsZSwgU291cmNlRm9yZ2Ugc2VuZHMgZGVmYXVsdCBwYXRjaCBhbmQgYnVnIG5vdGlmaWNhdGlvbgotZS1tYWlsIG1lc3NhZ2VzIHRoYXQgYXJlIGNvbXBsZXRlbHkgdW5oZWxwZnVsLCBzbyBLYS1QaW5nIFllZSB3cm90ZSBhbgotSFRNTCBzY3JlZW4tc2NyYXBlciB0aGF0IHNlbmRzIG1vcmUgdXNlZnVsIG1lc3NhZ2VzLgotCi1UaGUgZWFzZSBvZiBhZGRpbmcgY29kZSBjYXVzZWQgYSBmZXcgaW5pdGlhbCBncm93aW5nIHBhaW5zLCBzdWNoIGFzCi1jb2RlIHdhcyBjaGVja2VkIGluIGJlZm9yZSBpdCB3YXMgcmVhZHkgb3Igd2l0aG91dCBnZXR0aW5nIGNsZWFyCi1hZ3JlZW1lbnQgZnJvbSB0aGUgZGV2ZWxvcGVyIGdyb3VwLiAgVGhlIGFwcHJvdmFsIHByb2Nlc3MgdGhhdCBoYXMKLWVtZXJnZWQgaXMgc29tZXdoYXQgc2ltaWxhciB0byB0aGF0IHVzZWQgYnkgdGhlIEFwYWNoZSBncm91cC4KLURldmVsb3BlcnMgY2FuIHZvdGUgKzEsICswLCAtMCwgb3IgLTEgb24gYSBwYXRjaDsgKzEgYW5kIC0xIGRlbm90ZQotYWNjZXB0YW5jZSBvciByZWplY3Rpb24sIHdoaWxlICswIGFuZCAtMCBtZWFuIHRoZSBkZXZlbG9wZXIgaXMgbW9zdGx5Ci1pbmRpZmZlcmVudCB0byB0aGUgY2hhbmdlLCB0aG91Z2ggd2l0aCBhIHNsaWdodCBwb3NpdGl2ZSBvciBuZWdhdGl2ZQotc2xhbnQuICBUaGUgbW9zdCBzaWduaWZpY2FudCBjaGFuZ2UgZnJvbSB0aGUgQXBhY2hlIG1vZGVsIGlzIHRoYXQgdGhlCi12b3RpbmcgaXMgZXNzZW50aWFsbHkgYWR2aXNvcnksIGxldHRpbmcgR3VpZG8gdmFuIFJvc3N1bSwgd2hvIGhhcwotQmVuZXZvbGVudCBEaWN0YXRvciBGb3IgTGlmZSBzdGF0dXMsIGtub3cgd2hhdCB0aGUgZ2VuZXJhbCBvcGluaW9uIGlzLgotSGUgY2FuIHN0aWxsIGlnbm9yZSB0aGUgcmVzdWx0IG9mIGEgdm90ZSwgYW5kIGFwcHJvdmUgb3IKLXJlamVjdCBhIGNoYW5nZSBldmVuIGlmIHRoZSBjb21tdW5pdHkgZGlzYWdyZWVzIHdpdGggaGltLgotCi1Qcm9kdWNpbmcgYW4gYWN0dWFsIHBhdGNoIGlzIHRoZSBsYXN0IHN0ZXAgaW4gYWRkaW5nIGEgbmV3IGZlYXR1cmUsCi1hbmQgaXMgdXN1YWxseSBlYXN5IGNvbXBhcmVkIHRvIHRoZSBlYXJsaWVyIHRhc2sgb2YgY29taW5nIHVwIHdpdGggYQotZ29vZCBkZXNpZ24uICBEaXNjdXNzaW9ucyBvZiBuZXcgZmVhdHVyZXMgY2FuIG9mdGVuIGV4cGxvZGUgaW50bwotbGVuZ3RoeSBtYWlsaW5nIGxpc3QgdGhyZWFkcywgbWFraW5nIHRoZSBkaXNjdXNzaW9uIGhhcmQgdG8gZm9sbG93LAotYW5kIG5vIG9uZSBjYW4gcmVhZCBldmVyeSBwb3N0aW5nIHRvIHB5dGhvbi1kZXYuICBUaGVyZWZvcmUsIGEKLXJlbGF0aXZlbHkgZm9ybWFsIHByb2Nlc3MgaGFzIGJlZW4gc2V0IHVwIHRvIHdyaXRlIFB5dGhvbiBFbmhhbmNlbWVudAotUHJvcG9zYWxzIChQRVBzKSwgbW9kZWxsZWQgb24gdGhlIEludGVybmV0IFJGQyBwcm9jZXNzLiAgUEVQcyBhcmUKLWRyYWZ0IGRvY3VtZW50cyB0aGF0IGRlc2NyaWJlIGEgcHJvcG9zZWQgbmV3IGZlYXR1cmUsIGFuZCBhcmUKLWNvbnRpbnVhbGx5IHJldmlzZWQgdW50aWwgdGhlIGNvbW11bml0eSByZWFjaGVzIGEgY29uc2Vuc3VzLCBlaXRoZXIKLWFjY2VwdGluZyBvciByZWplY3RpbmcgdGhlIHByb3Bvc2FsLiAgUXVvdGluZyBmcm9tIHRoZSBpbnRyb2R1Y3Rpb24gdG8KLVBFUCAxLCBgYFBFUCBQdXJwb3NlIGFuZCBHdWlkZWxpbmVzJyc6Ci0KLVxiZWdpbntxdW90YXRpb259Ci0gICAgUEVQIHN0YW5kcyBmb3IgUHl0aG9uIEVuaGFuY2VtZW50IFByb3Bvc2FsLiAgQSBQRVAgaXMgYSBkZXNpZ24KLSAgICBkb2N1bWVudCBwcm92aWRpbmcgaW5mb3JtYXRpb24gdG8gdGhlIFB5dGhvbiBjb21tdW5pdHksIG9yCi0gICAgZGVzY3JpYmluZyBhIG5ldyBmZWF0dXJlIGZvciBQeXRob24uICBUaGUgUEVQIHNob3VsZCBwcm92aWRlIGEKLSAgICBjb25jaXNlIHRlY2huaWNhbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSBmZWF0dXJlIGFuZCBhIHJhdGlvbmFsZSBmb3IKLSAgICB0aGUgZmVhdHVyZS4KLQotICAgIFdlIGludGVuZCBQRVBzIHRvIGJlIHRoZSBwcmltYXJ5IG1lY2hhbmlzbXMgZm9yIHByb3Bvc2luZyBuZXcKLSAgICBmZWF0dXJlcywgZm9yIGNvbGxlY3RpbmcgY29tbXVuaXR5IGlucHV0IG9uIGFuIGlzc3VlLCBhbmQgZm9yCi0gICAgZG9jdW1lbnRpbmcgdGhlIGRlc2lnbiBkZWNpc2lvbnMgdGhhdCBoYXZlIGdvbmUgaW50byBQeXRob24uICBUaGUKLSAgICBQRVAgYXV0aG9yIGlzIHJlc3BvbnNpYmxlIGZvciBidWlsZGluZyBjb25zZW5zdXMgd2l0aGluIHRoZQotICAgIGNvbW11bml0eSBhbmQgZG9jdW1lbnRpbmcgZGlzc2VudGluZyBvcGluaW9ucy4KLVxlbmR7cXVvdGF0aW9ufQotCi1SZWFkIHRoZSByZXN0IG9mIFBFUCAxIGZvciB0aGUgZGV0YWlscyBvZiB0aGUgUEVQIGVkaXRvcmlhbCBwcm9jZXNzLAotc3R5bGUsIGFuZCBmb3JtYXQuICBQRVBzIGFyZSBrZXB0IGluIHRoZSBQeXRob24gQ1ZTIHRyZWUgb24KLVNvdXJjZUZvcmdlLCB0aG91Z2ggdGhleSdyZSBub3QgcGFydCBvZiB0aGUgUHl0aG9uIDIuMCBkaXN0cmlidXRpb24sCi1hbmQgYXJlIGFsc28gYXZhaWxhYmxlIGluIEhUTUwgZm9ybSBmcm9tCi1cdXJse2h0dHA6Ly93d3cucHl0aG9uLm9yZy9wZXBzL30uICBBcyBvZiBTZXB0ZW1iZXIgMjAwMCwKLXRoZXJlIGFyZSAyNSBQRVBTLCByYW5naW5nIGZyb20gUEVQIDIwMSwgYGBMb2Nrc3RlcCBJdGVyYXRpb24nJywgdG8KLVBFUCAyMjUsIGBgRWxlbWVudHdpc2UvT2JqZWN0d2lzZSBPcGVyYXRvcnMnJy4KLQotJSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntVbmljb2RlfQotCi1UaGUgbGFyZ2VzdCBuZXcgZmVhdHVyZSBpbiBQeXRob24gMi4wIGlzIGEgbmV3IGZ1bmRhbWVudGFsIGRhdGEgdHlwZToKLVVuaWNvZGUgc3RyaW5ncy4gIFVuaWNvZGUgdXNlcyAxNi1iaXQgbnVtYmVycyB0byByZXByZXNlbnQgY2hhcmFjdGVycwotaW5zdGVhZCBvZiB0aGUgOC1iaXQgbnVtYmVyIHVzZWQgYnkgQVNDSUksIG1lYW5pbmcgdGhhdCA2NSw1MzYKLWRpc3RpbmN0IGNoYXJhY3RlcnMgY2FuIGJlIHN1cHBvcnRlZC4KLQotVGhlIGZpbmFsIGludGVyZmFjZSBmb3IgVW5pY29kZSBzdXBwb3J0IHdhcyBhcnJpdmVkIGF0IHRocm91Z2gKLWNvdW50bGVzcyBvZnRlbi1zdG9ybXkgZGlzY3Vzc2lvbnMgb24gdGhlIHB5dGhvbi1kZXYgbWFpbGluZyBsaXN0LCBhbmQKLW1vc3RseSBpbXBsZW1lbnRlZCBieSBNYXJjLUFuZHJcJ2UgTGVtYnVyZywgYmFzZWQgb24gYSBVbmljb2RlIHN0cmluZwotdHlwZSBpbXBsZW1lbnRhdGlvbiBieSBGcmVkcmlrIEx1bmRoLiAgQSBkZXRhaWxlZCBleHBsYW5hdGlvbiBvZiB0aGUKLWludGVyZmFjZSB3YXMgd3JpdHRlbiB1cCBhcyBccGVwezEwMH0sIGBgUHl0aG9uIFVuaWNvZGUgSW50ZWdyYXRpb24nJy4KLVRoaXMgYXJ0aWNsZSB3aWxsIHNpbXBseSBjb3ZlciB0aGUgbW9zdCBzaWduaWZpY2FudCBwb2ludHMgYWJvdXQgdGhlCi1Vbmljb2RlIGludGVyZmFjZXMuCi0KLUluIFB5dGhvbiBzb3VyY2UgY29kZSwgVW5pY29kZSBzdHJpbmdzIGFyZSB3cml0dGVuIGFzCi1cY29kZXt1InN0cmluZyJ9LiAgQXJiaXRyYXJ5IFVuaWNvZGUgY2hhcmFjdGVycyBjYW4gYmUgd3JpdHRlbiB1c2luZyBhCi1uZXcgZXNjYXBlIHNlcXVlbmNlLCBcY29kZXtcZSB1XHZhcntISEhIfX0sIHdoZXJlIFx2YXJ7SEhISH0gaXMgYQotNC1kaWdpdCBoZXhhZGVjaW1hbCBudW1iZXIgZnJvbSAwMDAwIHRvIEZGRkYuICBUaGUgZXhpc3RpbmcKLVxjb2Rle1xlIHhcdmFye0hISEh9fSBlc2NhcGUgc2VxdWVuY2UgY2FuIGFsc28gYmUgdXNlZCwgYW5kIG9jdGFsCi1lc2NhcGVzIGNhbiBiZSB1c2VkIGZvciBjaGFyYWN0ZXJzIHVwIHRvIFUrMDFGRiwgd2hpY2ggaXMgcmVwcmVzZW50ZWQKLWJ5IFxjb2Rle1xlIDc3N30uCi0KLVVuaWNvZGUgc3RyaW5ncywganVzdCBsaWtlIHJlZ3VsYXIgc3RyaW5ncywgYXJlIGFuIGltbXV0YWJsZSBzZXF1ZW5jZQotdHlwZS4gIFRoZXkgY2FuIGJlIGluZGV4ZWQgYW5kIHNsaWNlZCwgYnV0IG5vdCBtb2RpZmllZCBpbiBwbGFjZS4KLVVuaWNvZGUgc3RyaW5ncyBoYXZlIGFuIFxtZXRob2R7ZW5jb2RlKCBcb3B0aW9uYWx7ZW5jb2Rpbmd9ICl9IG1ldGhvZAotdGhhdCByZXR1cm5zIGFuIDgtYml0IHN0cmluZyBpbiB0aGUgZGVzaXJlZCBlbmNvZGluZy4gIEVuY29kaW5ncyBhcmUKLW5hbWVkIGJ5IHN0cmluZ3MsIHN1Y2ggYXMgXGNvZGV7J2FzY2lpJ30sIFxjb2Rleyd1dGYtOCd9LAotXGNvZGV7J2lzby04ODU5LTEnfSwgb3Igd2hhdGV2ZXIuICBBIGNvZGVjIEFQSSBpcyBkZWZpbmVkIGZvcgotaW1wbGVtZW50aW5nIGFuZCByZWdpc3RlcmluZyBuZXcgZW5jb2RpbmdzIHRoYXQgYXJlIHRoZW4gYXZhaWxhYmxlCi10aHJvdWdob3V0IGEgUHl0aG9uIHByb2dyYW0uICBJZiBhbiBlbmNvZGluZyBpc24ndCBzcGVjaWZpZWQsIHRoZQotZGVmYXVsdCBlbmNvZGluZyBpcyB1c3VhbGx5IDctYml0IEFTQ0lJLCB0aG91Z2ggaXQgY2FuIGJlIGNoYW5nZWQgZm9yCi15b3VyIFB5dGhvbiBpbnN0YWxsYXRpb24gYnkgY2FsbGluZyB0aGUKLVxmdW5jdGlvbntzeXMuc2V0ZGVmYXVsdGVuY29kaW5nKFx2YXJ7ZW5jb2Rpbmd9KX0gZnVuY3Rpb24gaW4gYQotY3VzdG9taXNlZCB2ZXJzaW9uIG9mIFxmaWxle3NpdGUucHl9LgotCi1Db21iaW5pbmcgOC1iaXQgYW5kIFVuaWNvZGUgc3RyaW5ncyBhbHdheXMgY29lcmNlcyB0byBVbmljb2RlLCB1c2luZwotdGhlIGRlZmF1bHQgQVNDSUkgZW5jb2Rpbmc7IHRoZSByZXN1bHQgb2YgXGNvZGV7J2EnICsgdSdiYyd9IGlzCi1cY29kZXt1J2FiYyd9LgotCi1OZXcgYnVpbHQtaW4gZnVuY3Rpb25zIGhhdmUgYmVlbiBhZGRlZCwgYW5kIGV4aXN0aW5nIGJ1aWx0LWlucwotbW9kaWZpZWQgdG8gc3VwcG9ydCBVbmljb2RlOgotCi1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtIFxjb2Rle3VuaWNocihcdmFye2NofSl9IHJldHVybnMgYSBVbmljb2RlIHN0cmluZyAxIGNoYXJhY3RlcgotbG9uZywgY29udGFpbmluZyB0aGUgY2hhcmFjdGVyIFx2YXJ7Y2h9LgotCi1caXRlbSBcY29kZXtvcmQoXHZhcnt1fSl9LCB3aGVyZSBcdmFye3V9IGlzIGEgMS1jaGFyYWN0ZXIgcmVndWxhciBvciBVbmljb2RlIHN0cmluZywgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHRoZSBjaGFyYWN0ZXIgYXMgYW4gaW50ZWdlci4KLQotXGl0ZW0gXGNvZGV7dW5pY29kZShcdmFye3N0cmluZ30gXG9wdGlvbmFseywgXHZhcntlbmNvZGluZ319IAotXG9wdGlvbmFseywgXHZhcntlcnJvcnN9fSApIH0gY3JlYXRlcyBhIFVuaWNvZGUgc3RyaW5nIGZyb20gYW4gOC1iaXQKLXN0cmluZy4gIFxjb2Rle2VuY29kaW5nfSBpcyBhIHN0cmluZyBuYW1pbmcgdGhlIGVuY29kaW5nIHRvIHVzZS4KLVRoZSBcY29kZXtlcnJvcnN9IHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHRyZWF0bWVudCBvZiBjaGFyYWN0ZXJzIHRoYXQKLWFyZSBpbnZhbGlkIGZvciB0aGUgY3VycmVudCBlbmNvZGluZzsgcGFzc2luZyBcY29kZXsnc3RyaWN0J30gYXMgdGhlCi12YWx1ZSBjYXVzZXMgYW4gZXhjZXB0aW9uIHRvIGJlIHJhaXNlZCBvbiBhbnkgZW5jb2RpbmcgZXJyb3IsIHdoaWxlCi1cY29kZXsnaWdub3JlJ30gY2F1c2VzIGVycm9ycyB0byBiZSBzaWxlbnRseSBpZ25vcmVkIGFuZAotXGNvZGV7J3JlcGxhY2UnfSB1c2VzIFUrRkZGRCwgdGhlIG9mZmljaWFsIHJlcGxhY2VtZW50IGNoYXJhY3RlciwgaW4KLWNhc2Ugb2YgYW55IHByb2JsZW1zLgotCi1caXRlbSBUaGUgXGtleXdvcmR7ZXhlY30gc3RhdGVtZW50LCBhbmQgdmFyaW91cyBidWlsdC1pbnMgc3VjaCBhcwotXGNvZGV7ZXZhbCgpfSwgXGNvZGV7Z2V0YXR0cigpfSwgYW5kIFxjb2Rle3NldGF0dHIoKX0gd2lsbCBhbHNvCi1hY2NlcHQgVW5pY29kZSBzdHJpbmdzIGFzIHdlbGwgYXMgcmVndWxhciBzdHJpbmdzLiAgKEl0J3MgcG9zc2libGUKLXRoYXQgdGhlIHByb2Nlc3Mgb2YgZml4aW5nIHRoaXMgbWlzc2VkIHNvbWUgYnVpbHQtaW5zOyBpZiB5b3UgZmluZCBhCi1idWlsdC1pbiBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgc3RyaW5ncyBidXQgZG9lc24ndCBhY2NlcHQgVW5pY29kZQotc3RyaW5ncyBhdCBhbGwsIHBsZWFzZSByZXBvcnQgaXQgYXMgYSBidWcuKQotCi1cZW5ke2l0ZW1pemV9Ci0KLUEgbmV3IG1vZHVsZSwgXG1vZHVsZXt1bmljb2RlZGF0YX0sIHByb3ZpZGVzIGFuIGludGVyZmFjZSB0byBVbmljb2RlCi1jaGFyYWN0ZXIgcHJvcGVydGllcy4gIEZvciBleGFtcGxlLCBcY29kZXt1bmljb2RlZGF0YS5jYXRlZ29yeSh1J0EnKX0KLXJldHVybnMgdGhlIDItY2hhcmFjdGVyIHN0cmluZyAnTHUnLCB0aGUgJ0wnIGRlbm90aW5nIGl0J3MgYSBsZXR0ZXIsCi1hbmQgJ3UnIG1lYW5pbmcgdGhhdCBpdCdzIHVwcGVyY2FzZS4KLVxjb2Rle3VuaWNvZGVkYXRhLmJpZGlyZWN0aW9uYWwodSdcZSB1MDY2MCcpfSByZXR1cm5zICdBTicsIG1lYW5pbmcgdGhhdCBVKzA2NjAgaXMKLWFuIEFyYWJpYyBudW1iZXIuCi0KLVRoZSBcbW9kdWxle2NvZGVjc30gbW9kdWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyB0byBsb29rIHVwIGV4aXN0aW5nIGVuY29kaW5ncwotYW5kIHJlZ2lzdGVyIG5ldyBvbmVzLiAgVW5sZXNzIHlvdSB3YW50IHRvIGltcGxlbWVudCBhCi1uZXcgZW5jb2RpbmcsIHlvdSdsbCBtb3N0IG9mdGVuIHVzZSB0aGUKLVxmdW5jdGlvbntjb2RlY3MubG9va3VwKFx2YXJ7ZW5jb2Rpbmd9KX0gZnVuY3Rpb24sIHdoaWNoIHJldHVybnMgYQotNC1lbGVtZW50IHR1cGxlOiBcY29kZXsoXHZhcntlbmNvZGVfZnVuY30sCi1cdmFye2RlY29kZV9mdW5jfSwgXHZhcntzdHJlYW1fcmVhZGVyfSwgXHZhcntzdHJlYW1fd3JpdGVyfSl9LgotCi1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtIFx2YXJ7ZW5jb2RlX2Z1bmN9IGlzIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIFVuaWNvZGUgc3RyaW5nLCBhbmQKLXJldHVybnMgYSAyLXR1cGxlIFxjb2RleyhcdmFye3N0cmluZ30sIFx2YXJ7bGVuZ3RofSl9LiAgXHZhcntzdHJpbmd9Ci1pcyBhbiA4LWJpdCBzdHJpbmcgY29udGFpbmluZyBhIHBvcnRpb24gKHBlcmhhcHMgYWxsKSBvZiB0aGUgVW5pY29kZQotc3RyaW5nIGNvbnZlcnRlZCBpbnRvIHRoZSBnaXZlbiBlbmNvZGluZywgYW5kIFx2YXJ7bGVuZ3RofSB0ZWxscyB5b3UKLWhvdyBtdWNoIG9mIHRoZSBVbmljb2RlIHN0cmluZyB3YXMgY29udmVydGVkLgotCi1caXRlbSBcdmFye2RlY29kZV9mdW5jfSBpcyB0aGUgb3Bwb3NpdGUgb2YgXHZhcntlbmNvZGVfZnVuY30sIHRha2luZwotYW4gOC1iaXQgc3RyaW5nIGFuZCByZXR1cm5pbmcgYSAyLXR1cGxlIFxjb2RleyhcdmFye3VzdHJpbmd9LAotXHZhcntsZW5ndGh9KX0sIGNvbnNpc3Rpbmcgb2YgdGhlIHJlc3VsdGluZyBVbmljb2RlIHN0cmluZwotXHZhcnt1c3RyaW5nfSBhbmQgdGhlIGludGVnZXIgXHZhcntsZW5ndGh9IHRlbGxpbmcgaG93IG11Y2ggb2YgdGhlCi04LWJpdCBzdHJpbmcgd2FzIGNvbnN1bWVkLgotCi1caXRlbSBcdmFye3N0cmVhbV9yZWFkZXJ9IGlzIGEgY2xhc3MgdGhhdCBzdXBwb3J0cyBkZWNvZGluZyBpbnB1dCBmcm9tCi1hIHN0cmVhbS4gIFx2YXJ7c3RyZWFtX3JlYWRlcihcdmFye2ZpbGVfb2JqfSl9IHJldHVybnMgYW4gb2JqZWN0IHRoYXQKLXN1cHBvcnRzIHRoZSBcbWV0aG9ke3JlYWQoKX0sIFxtZXRob2R7cmVhZGxpbmUoKX0sIGFuZAotXG1ldGhvZHtyZWFkbGluZXMoKX0gbWV0aG9kcy4gIFRoZXNlIG1ldGhvZHMgd2lsbCBhbGwgdHJhbnNsYXRlIGZyb20KLXRoZSBnaXZlbiBlbmNvZGluZyBhbmQgcmV0dXJuIFVuaWNvZGUgc3RyaW5ncy4KLQotXGl0ZW0gXHZhcntzdHJlYW1fd3JpdGVyfSwgc2ltaWxhcmx5LCBpcyBhIGNsYXNzIHRoYXQgc3VwcG9ydHMKLWVuY29kaW5nIG91dHB1dCB0byBhIHN0cmVhbS4gIFx2YXJ7c3RyZWFtX3dyaXRlcihcdmFye2ZpbGVfb2JqfSl9Ci1yZXR1cm5zIGFuIG9iamVjdCB0aGF0IHN1cHBvcnRzIHRoZSBcbWV0aG9ke3dyaXRlKCl9IGFuZAotXG1ldGhvZHt3cml0ZWxpbmVzKCl9IG1ldGhvZHMuICBUaGVzZSBtZXRob2RzIGV4cGVjdCBVbmljb2RlIHN0cmluZ3MsCi10cmFuc2xhdGluZyB0aGVtIHRvIHRoZSBnaXZlbiBlbmNvZGluZyBvbiBvdXRwdXQuCi1cZW5ke2l0ZW1pemV9Ci0KLUZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGUgd3JpdGVzIGEgVW5pY29kZSBzdHJpbmcgaW50byBhIGZpbGUsIAotZW5jb2RpbmcgaXQgYXMgVVRGLTg6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCBjb2RlY3MKLQotdW5pc3RyID0gdSdcdTA2NjBcdTIwMDBhYiAuLi4nCi0KLShVVEY4X2VuY29kZSwgVVRGOF9kZWNvZGUsCi0gVVRGOF9zdHJlYW1yZWFkZXIsIFVURjhfc3RyZWFtd3JpdGVyKSA9IGNvZGVjcy5sb29rdXAoJ1VURi04JykKLQotb3V0cHV0ID0gVVRGOF9zdHJlYW13cml0ZXIoIG9wZW4oICcvdG1wL291dHB1dCcsICd3YicpICkKLW91dHB1dC53cml0ZSggdW5pc3RyICkKLW91dHB1dC5jbG9zZSgpCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgZm9sbG93aW5nIGNvZGUgd291bGQgdGhlbiByZWFkIFVURi04IGlucHV0IGZyb20gdGhlIGZpbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWlucHV0ID0gVVRGOF9zdHJlYW1yZWFkZXIoIG9wZW4oICcvdG1wL291dHB1dCcsICdyYicpICkKLXByaW50IHJlcHIoaW5wdXQucmVhZCgpKQotaW5wdXQuY2xvc2UoKQotXGVuZHt2ZXJiYXRpbX0KLQotVW5pY29kZS1hd2FyZSByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBhdmFpbGFibGUgdGhyb3VnaCB0aGUKLVxtb2R1bGV7cmV9IG1vZHVsZSwgd2hpY2ggaGFzIGEgbmV3IHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gY2FsbGVkCi1TUkUgd3JpdHRlbiBieSBGcmVkcmlrIEx1bmRoIG9mIFNlY3JldCBMYWJzIEFCLiAKLQotQSBcY29kZXstVX0gY29tbWFuZCBsaW5lIG9wdGlvbiB3YXMgYWRkZWQgd2hpY2ggY2F1c2VzIHRoZSBQeXRob24KLWNvbXBpbGVyIHRvIGludGVycHJldCBhbGwgc3RyaW5nIGxpdGVyYWxzIGFzIFVuaWNvZGUgc3RyaW5nIGxpdGVyYWxzLgotVGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIHRlc3RpbmcgYW5kIGZ1dHVyZS1wcm9vZmluZyB5b3VyIFB5dGhvbgotY29kZSwgc2luY2Ugc29tZSBmdXR1cmUgdmVyc2lvbiBvZiBQeXRob24gbWF5IGRyb3Agc3VwcG9ydCBmb3IgOC1iaXQKLXN0cmluZ3MgYW5kIHByb3ZpZGUgb25seSBVbmljb2RlIHN0cmluZ3MuCi0KLSUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257TGlzdCBDb21wcmVoZW5zaW9uc30KLQotTGlzdHMgYXJlIGEgd29ya2hvcnNlIGRhdGEgdHlwZSBpbiBQeXRob24sIGFuZCBtYW55IHByb2dyYW1zCi1tYW5pcHVsYXRlIGEgbGlzdCBhdCBzb21lIHBvaW50LiAgVHdvIGNvbW1vbiBvcGVyYXRpb25zIG9uIGxpc3RzIGFyZQotdG8gbG9vcCBvdmVyIHRoZW0sIGFuZCBlaXRoZXIgcGljayBvdXQgdGhlIGVsZW1lbnRzIHRoYXQgbWVldCBhCi1jZXJ0YWluIGNyaXRlcmlvbiwgb3IgYXBwbHkgc29tZSBmdW5jdGlvbiB0byBlYWNoIGVsZW1lbnQuICBGb3IKLWV4YW1wbGUsIGdpdmVuIGEgbGlzdCBvZiBzdHJpbmdzLCB5b3UgbWlnaHQgd2FudCB0byBwdWxsIG91dCBhbGwgdGhlCi1zdHJpbmdzIGNvbnRhaW5pbmcgYSBnaXZlbiBzdWJzdHJpbmcsIG9yIHN0cmlwIG9mZiB0cmFpbGluZyB3aGl0ZXNwYWNlCi1mcm9tIGVhY2ggbGluZS4gIAotCi1UaGUgZXhpc3RpbmcgXGZ1bmN0aW9ue21hcCgpfSBhbmQgXGZ1bmN0aW9ue2ZpbHRlcigpfSBmdW5jdGlvbnMgY2FuIGJlCi11c2VkIGZvciB0aGlzIHB1cnBvc2UsIGJ1dCB0aGV5IHJlcXVpcmUgYSBmdW5jdGlvbiBhcyBvbmUgb2YgdGhlaXIKLWFyZ3VtZW50cy4gIFRoaXMgaXMgZmluZSBpZiB0aGVyZSdzIGFuIGV4aXN0aW5nIGJ1aWx0LWluIGZ1bmN0aW9uIHRoYXQKLWNhbiBiZSBwYXNzZWQgZGlyZWN0bHksIGJ1dCBpZiB0aGVyZSBpc24ndCwgeW91IGhhdmUgdG8gY3JlYXRlIGEKLWxpdHRsZSBmdW5jdGlvbiB0byBkbyB0aGUgcmVxdWlyZWQgd29yaywgYW5kIFB5dGhvbidzIHNjb3BpbmcgcnVsZXMKLW1ha2UgdGhlIHJlc3VsdCB1Z2x5IGlmIHRoZSBsaXR0bGUgZnVuY3Rpb24gbmVlZHMgYWRkaXRpb25hbAotaW5mb3JtYXRpb24uICBUYWtlIHRoZSBmaXJzdCBleGFtcGxlIGluIHRoZSBwcmV2aW91cyBwYXJhZ3JhcGgsCi1maW5kaW5nIGFsbCB0aGUgc3RyaW5ncyBpbiB0aGUgbGlzdCBjb250YWluaW5nIGEgZ2l2ZW4gc3Vic3RyaW5nLiAgWW91Ci1jb3VsZCB3cml0ZSB0aGUgZm9sbG93aW5nIHRvIGRvIGl0OgotCi1cYmVnaW57dmVyYmF0aW19Ci0jIEdpdmVuIHRoZSBsaXN0IEwsIG1ha2UgYSBsaXN0IG9mIGFsbCBzdHJpbmdzIAotIyBjb250YWluaW5nIHRoZSBzdWJzdHJpbmcgUy4KLXN1Ymxpc3QgPSBmaWx0ZXIoIGxhbWJkYSBzLCBzdWJzdHJpbmc9UzogCi0gICAgICAgICAgICAgICAgICAgICBzdHJpbmcuZmluZChzLCBzdWJzdHJpbmcpICE9IC0xLAotCSAgICAgICAgICBMKQotXGVuZHt2ZXJiYXRpbX0KLQotQmVjYXVzZSBvZiBQeXRob24ncyBzY29waW5nIHJ1bGVzLCBhIGRlZmF1bHQgYXJndW1lbnQgaXMgdXNlZCBzbyB0aGF0Ci10aGUgYW5vbnltb3VzIGZ1bmN0aW9uIGNyZWF0ZWQgYnkgdGhlIFxrZXl3b3Jke2xhbWJkYX0gc3RhdGVtZW50IGtub3dzCi13aGF0IHN1YnN0cmluZyBpcyBiZWluZyBzZWFyY2hlZCBmb3IuICBMaXN0IGNvbXByZWhlbnNpb25zIG1ha2UgdGhpcwotY2xlYW5lcjoKLQotXGJlZ2lue3ZlcmJhdGltfQotc3VibGlzdCA9IFsgcyBmb3IgcyBpbiBMIGlmIHN0cmluZy5maW5kKHMsIFMpICE9IC0xIF0KLVxlbmR7dmVyYmF0aW19Ci0KLUxpc3QgY29tcHJlaGVuc2lvbnMgaGF2ZSB0aGUgZm9ybToKLQotXGJlZ2lue3ZlcmJhdGltfQotWyBleHByZXNzaW9uIGZvciBleHByIGluIHNlcXVlbmNlMSAKLSAgICAgICAgICAgICBmb3IgZXhwcjIgaW4gc2VxdWVuY2UyIC4uLgotCSAgICAgZm9yIGV4cHJOIGluIHNlcXVlbmNlTgotICAgICAgICAgICAgIGlmIGNvbmRpdGlvbiBdCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgXGtleXdvcmR7Zm9yfS4uLlxrZXl3b3Jke2lufSBjbGF1c2VzIGNvbnRhaW4gdGhlIHNlcXVlbmNlcyB0byBiZQotaXRlcmF0ZWQgb3Zlci4gIFRoZSBzZXF1ZW5jZXMgZG8gbm90IGhhdmUgdG8gYmUgdGhlIHNhbWUgbGVuZ3RoLAotYmVjYXVzZSB0aGV5IGFyZSBcZW1waHtub3R9IGl0ZXJhdGVkIG92ZXIgaW4gcGFyYWxsZWwsIGJ1dAotZnJvbSBsZWZ0IHRvIHJpZ2h0OyB0aGlzIGlzIGV4cGxhaW5lZCBtb3JlIGNsZWFybHkgaW4gdGhlIGZvbGxvd2luZwotcGFyYWdyYXBocy4gIFRoZSBlbGVtZW50cyBvZiB0aGUgZ2VuZXJhdGVkIGxpc3Qgd2lsbCBiZSB0aGUgc3VjY2Vzc2l2ZQotdmFsdWVzIG9mIFx2YXJ7ZXhwcmVzc2lvbn0uICBUaGUgZmluYWwgXGtleXdvcmR7aWZ9IGNsYXVzZSBpcwotb3B0aW9uYWw7IGlmIHByZXNlbnQsIFx2YXJ7ZXhwcmVzc2lvbn0gaXMgb25seSBldmFsdWF0ZWQgYW5kIGFkZGVkIHRvCi10aGUgcmVzdWx0IGlmIFx2YXJ7Y29uZGl0aW9ufSBpcyB0cnVlLgotCi1UbyBtYWtlIHRoZSBzZW1hbnRpY3MgdmVyeSBjbGVhciwgYSBsaXN0IGNvbXByZWhlbnNpb24gaXMgZXF1aXZhbGVudAotdG8gdGhlIGZvbGxvd2luZyBQeXRob24gY29kZToKLQotXGJlZ2lue3ZlcmJhdGltfQotZm9yIGV4cHIxIGluIHNlcXVlbmNlMToKLSAgICBmb3IgZXhwcjIgaW4gc2VxdWVuY2UyOgotICAgIC4uLgotICAgICAgICBmb3IgZXhwck4gaW4gc2VxdWVuY2VOOgotICAgICAgICAgICAgIGlmIChjb25kaXRpb24pOgotICAgICAgICAgICAgICAgICAgIyBBcHBlbmQgdGhlIHZhbHVlIG9mIAotICAgICAgICAgICAgICAgICAgIyB0aGUgZXhwcmVzc2lvbiB0byB0aGUgCi0gICAgICAgICAgICAgICAgICAjIHJlc3VsdGluZyBsaXN0LgotXGVuZHt2ZXJiYXRpbX0KLQotVGhpcyBtZWFucyB0aGF0IHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIFxrZXl3b3Jke2Zvcn0uLi5ca2V5d29yZHtpbn0gY2xhdXNlcywKLXRoZSByZXN1bHRpbmcgbGlzdCB3aWxsIGJlIGVxdWFsIHRvIHRoZSBwcm9kdWN0IG9mIHRoZSBsZW5ndGhzIG9mIGFsbAotdGhlIHNlcXVlbmNlcy4gIElmIHlvdSBoYXZlIHR3byBsaXN0cyBvZiBsZW5ndGggMywgdGhlIG91dHB1dCBsaXN0IGlzCi05IGVsZW1lbnRzIGxvbmc6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXNlcTEgPSAnYWJjJwotc2VxMiA9ICgxLDIsMykKLT4+PiBbICh4LHkpIGZvciB4IGluIHNlcTEgZm9yIHkgaW4gc2VxMl0KLVsoJ2EnLCAxKSwgKCdhJywgMiksICgnYScsIDMpLCAoJ2InLCAxKSwgKCdiJywgMiksICgnYicsIDMpLCAoJ2MnLCAxKSwKLSgnYycsIDIpLCAoJ2MnLCAzKV0KLVxlbmR7dmVyYmF0aW19Ci0KLVRvIGF2b2lkIGludHJvZHVjaW5nIGFuIGFtYmlndWl0eSBpbnRvIFB5dGhvbidzIGdyYW1tYXIsIGlmCi1cdmFye2V4cHJlc3Npb259IGlzIGNyZWF0aW5nIGEgdHVwbGUsIGl0IG11c3QgYmUgc3Vycm91bmRlZCB3aXRoCi1wYXJlbnRoZXNlcy4gIFRoZSBmaXJzdCBsaXN0IGNvbXByZWhlbnNpb24gYmVsb3cgaXMgYSBzeW50YXggZXJyb3IsCi13aGlsZSB0aGUgc2Vjb25kIG9uZSBpcyBjb3JyZWN0OgotCi1cYmVnaW57dmVyYmF0aW19Ci0jIFN5bnRheCBlcnJvcgotWyB4LHkgZm9yIHggaW4gc2VxMSBmb3IgeSBpbiBzZXEyXQotIyBDb3JyZWN0Ci1bICh4LHkpIGZvciB4IGluIHNlcTEgZm9yIHkgaW4gc2VxMl0KLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBpZGVhIG9mIGxpc3QgY29tcHJlaGVuc2lvbnMgb3JpZ2luYWxseSBjb21lcyBmcm9tIHRoZSBmdW5jdGlvbmFsCi1wcm9ncmFtbWluZyBsYW5ndWFnZSBIYXNrZWxsIChcdXJse2h0dHA6Ly93d3cuaGFza2VsbC5vcmd9KS4gIEdyZWcKLUV3aW5nIGFyZ3VlZCBtb3N0IGVmZmVjdGl2ZWx5IGZvciBhZGRpbmcgdGhlbSB0byBQeXRob24gYW5kIHdyb3RlIHRoZQotaW5pdGlhbCBsaXN0IGNvbXByZWhlbnNpb24gcGF0Y2gsIHdoaWNoIHdhcyB0aGVuIGRpc2N1c3NlZCBmb3IgYQotc2VlbWluZ2x5IGVuZGxlc3MgdGltZSBvbiB0aGUgcHl0aG9uLWRldiBtYWlsaW5nIGxpc3QgYW5kIGtlcHQKLXVwLXRvLWRhdGUgYnkgU2tpcCBNb250YW5hcm8uCi0KLSUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257QXVnbWVudGVkIEFzc2lnbm1lbnR9Ci0KLUF1Z21lbnRlZCBhc3NpZ25tZW50IG9wZXJhdG9ycywgYW5vdGhlciBsb25nLXJlcXVlc3RlZCBmZWF0dXJlLCBoYXZlCi1iZWVuIGFkZGVkIHRvIFB5dGhvbiAyLjAuICBBdWdtZW50ZWQgYXNzaWdubWVudCBvcGVyYXRvcnMgaW5jbHVkZQotXGNvZGV7Kz19LCBcY29kZXstPX0sIFxjb2Rleyo9fSwgYW5kIHNvIGZvcnRoLiAgRm9yIGV4YW1wbGUsIHRoZQotc3RhdGVtZW50IFxjb2Rle2EgKz0gMn0gaW5jcmVtZW50cyB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIAotXGNvZGV7YX0gYnkgMiwgZXF1aXZhbGVudCB0byB0aGUgc2xpZ2h0bHkgbGVuZ3RoaWVyIFxjb2Rle2EgPSBhICsgMn0uCi0KLSUgVGhlIGVtcHR5IGdyb3VwcyBiZWxvdyBwcmV2ZW50IGNvbnZlcnNpb24gdG8gZ3VpbGxlbWV0cy4KLVRoZSBmdWxsIGxpc3Qgb2Ygc3VwcG9ydGVkIGFzc2lnbm1lbnQgb3BlcmF0b3JzIGlzIFxjb2Rleys9fSwKLVxjb2Rley09fSwgXGNvZGV7Kj19LCBcY29kZXsvPX0sIFxjb2Rle1wlPX0sIFxjb2RleyoqPX0sIFxjb2Rle1wmPX0sCi1cY29kZXt8PX0sIFx2ZXJifF49fCwgXGNvZGV7Pj49fSwgYW5kIFxjb2Rlezw8PX0uICBQeXRob24gY2xhc3NlcyBjYW4KLW92ZXJyaWRlIHRoZSBhdWdtZW50ZWQgYXNzaWdubWVudCBvcGVyYXRvcnMgYnkgZGVmaW5pbmcgbWV0aG9kcyBuYW1lZAotXG1ldGhvZHtfX2lhZGRfX30sIFxtZXRob2R7X19pc3ViX199LCBldGMuICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZwotXGNsYXNze051bWJlcn0gY2xhc3Mgc3RvcmVzIGEgbnVtYmVyIGFuZCBzdXBwb3J0cyB1c2luZyArPSB0byBjcmVhdGUgYQotbmV3IGluc3RhbmNlIHdpdGggYW4gaW5jcmVtZW50ZWQgdmFsdWUuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLWNsYXNzIE51bWJlcjoKLSAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgotICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKLSAgICBkZWYgX19pYWRkX18oc2VsZiwgaW5jcmVtZW50KToKLQlyZXR1cm4gTnVtYmVyKCBzZWxmLnZhbHVlICsgaW5jcmVtZW50KQotCi1uID0gTnVtYmVyKDUpCi1uICs9IDMKLXByaW50IG4udmFsdWUKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBcbWV0aG9ke19faWFkZF9ffSBzcGVjaWFsIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCB0aGUgdmFsdWUgb2YgdGhlCi1pbmNyZW1lbnQsIGFuZCBzaG91bGQgcmV0dXJuIGEgbmV3IGluc3RhbmNlIHdpdGggYW4gYXBwcm9wcmlhdGVseQotbW9kaWZpZWQgdmFsdWU7IHRoaXMgcmV0dXJuIHZhbHVlIGlzIGJvdW5kIGFzIHRoZSBuZXcgdmFsdWUgb2YgdGhlCi12YXJpYWJsZSBvbiB0aGUgbGVmdC1oYW5kIHNpZGUuIAotCi1BdWdtZW50ZWQgYXNzaWdubWVudCBvcGVyYXRvcnMgd2VyZSBmaXJzdCBpbnRyb2R1Y2VkIGluIHRoZSBDCi1wcm9ncmFtbWluZyBsYW5ndWFnZSwgYW5kIG1vc3QgQy1kZXJpdmVkIGxhbmd1YWdlcywgc3VjaCBhcwotXHByb2dyYW17YXdrfSwgXENwcCwgSmF2YSwgUGVybCwgYW5kIFBIUCBhbHNvIHN1cHBvcnQgdGhlbS4gIFRoZSBhdWdtZW50ZWQKLWFzc2lnbm1lbnQgcGF0Y2ggd2FzIGltcGxlbWVudGVkIGJ5IFRob21hcyBXb3V0ZXJzLgotCi0lID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue1N0cmluZyBNZXRob2RzfQotCi1VbnRpbCBub3cgc3RyaW5nLW1hbmlwdWxhdGlvbiBmdW5jdGlvbmFsaXR5IHdhcyBpbiB0aGUgXG1vZHVsZXtzdHJpbmd9Ci1tb2R1bGUsIHdoaWNoIHdhcyB1c3VhbGx5IGEgZnJvbnQtZW5kIGZvciB0aGUgXG1vZHVsZXtzdHJvcH0KLW1vZHVsZSB3cml0dGVuIGluIEMuICBUaGUgYWRkaXRpb24gb2YgVW5pY29kZSBwb3NlZCBhIGRpZmZpY3VsdHkgZm9yCi10aGUgXG1vZHVsZXtzdHJvcH0gbW9kdWxlLCBiZWNhdXNlIHRoZSBmdW5jdGlvbnMgd291bGQgYWxsIG5lZWQgdG8gYmUKLXJld3JpdHRlbiBpbiBvcmRlciB0byBhY2NlcHQgZWl0aGVyIDgtYml0IG9yIFVuaWNvZGUgc3RyaW5ncy4gIEZvcgotZnVuY3Rpb25zIHN1Y2ggYXMgXGZ1bmN0aW9ue3N0cmluZy5yZXBsYWNlKCl9LCB3aGljaCB0YWtlcyAzIHN0cmluZwotYXJndW1lbnRzLCB0aGF0IG1lYW5zIGVpZ2h0IHBvc3NpYmxlIHBlcm11dGF0aW9ucywgYW5kIGNvcnJlc3BvbmRpbmdseQotY29tcGxpY2F0ZWQgY29kZS4KLQotSW5zdGVhZCwgUHl0aG9uIDIuMCBwdXNoZXMgdGhlIHByb2JsZW0gb250byB0aGUgc3RyaW5nIHR5cGUsIG1ha2luZwotc3RyaW5nIG1hbmlwdWxhdGlvbiBmdW5jdGlvbmFsaXR5IGF2YWlsYWJsZSB0aHJvdWdoIG1ldGhvZHMgb24gYm90aAotOC1iaXQgc3RyaW5ncyBhbmQgVW5pY29kZSBzdHJpbmdzLiAgCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiAnYW5kcmV3Jy5jYXBpdGFsaXplKCkKLSdBbmRyZXcnCi0+Pj4gJ2hvc3RuYW1lJy5yZXBsYWNlKCdvcycsICdsaW51eCcpCi0naGxpbnV4dG5hbWUnCi0+Pj4gJ21vc2hlJy5maW5kKCdzaCcpCi0yCi1cZW5ke3ZlcmJhdGltfQotCi1PbmUgdGhpbmcgdGhhdCBoYXNuJ3QgY2hhbmdlZCwgYSBub3Rld29ydGh5IEFwcmlsIEZvb2xzJyBqb2tlCi1ub3R3aXRoc3RhbmRpbmcsIGlzIHRoYXQgUHl0aG9uIHN0cmluZ3MgYXJlIGltbXV0YWJsZS4gVGh1cywgdGhlCi1zdHJpbmcgbWV0aG9kcyByZXR1cm4gbmV3IHN0cmluZ3MsIGFuZCBkbyBub3QgbW9kaWZ5IHRoZSBzdHJpbmcgb24KLXdoaWNoIHRoZXkgb3BlcmF0ZS4KLQotVGhlIG9sZCBcbW9kdWxle3N0cmluZ30gbW9kdWxlIGlzIHN0aWxsIGFyb3VuZCBmb3IgYmFja3dhcmRzCi1jb21wYXRpYmlsaXR5LCBidXQgaXQgbW9zdGx5IGFjdHMgYXMgYSBmcm9udC1lbmQgdG8gdGhlIG5ldyBzdHJpbmcKLW1ldGhvZHMuCi0KLVR3byBtZXRob2RzIHdoaWNoIGhhdmUgbm8gcGFyYWxsZWwgaW4gcHJlLTIuMCB2ZXJzaW9ucywgYWx0aG91Z2ggdGhleQotZGlkIGV4aXN0IGluIEpQeXRob24gZm9yIHF1aXRlIHNvbWUgdGltZSwgYXJlIFxtZXRob2R7c3RhcnRzd2l0aCgpfQotYW5kIFxtZXRob2R7ZW5kc3dpdGh9LiAgXGNvZGV7cy5zdGFydHN3aXRoKHQpfSBpcyBlcXVpdmFsZW50IHRvIFxjb2Rle3NbOmxlbih0KV0KLT09IHR9LCB3aGlsZSBcY29kZXtzLmVuZHN3aXRoKHQpfSBpcyBlcXVpdmFsZW50IHRvIFxjb2Rle3NbLWxlbih0KTpdID09IHR9LgotCi1PbmUgb3RoZXIgbWV0aG9kIHdoaWNoIGRlc2VydmVzIHNwZWNpYWwgbWVudGlvbiBpcyBcbWV0aG9ke2pvaW59LiAgVGhlCi1cbWV0aG9ke2pvaW59IG1ldGhvZCBvZiBhIHN0cmluZyByZWNlaXZlcyBvbmUgcGFyYW1ldGVyLCBhIHNlcXVlbmNlIG9mCi1zdHJpbmdzLCBhbmQgaXMgZXF1aXZhbGVudCB0byB0aGUgXGZ1bmN0aW9ue3N0cmluZy5qb2lufSBmdW5jdGlvbiBmcm9tCi10aGUgb2xkIFxtb2R1bGV7c3RyaW5nfSBtb2R1bGUsIHdpdGggdGhlIGFyZ3VtZW50cyByZXZlcnNlZC4gSW4gb3RoZXIKLXdvcmRzLCBcY29kZXtzLmpvaW4oc2VxKX0gaXMgZXF1aXZhbGVudCB0byB0aGUgb2xkCi1cY29kZXtzdHJpbmcuam9pbihzZXEsIHMpfS4KLQotJSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntHYXJiYWdlIENvbGxlY3Rpb24gb2YgQ3ljbGVzfQotCi1UaGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBQeXRob24gdXNlcyByZWZlcmVuY2UgY291bnRpbmcgdG8gaW1wbGVtZW50Ci1nYXJiYWdlIGNvbGxlY3Rpb24uICBFdmVyeSBQeXRob24gb2JqZWN0IG1haW50YWlucyBhIGNvdW50IG9mIHRoZQotbnVtYmVyIG9mIHJlZmVyZW5jZXMgcG9pbnRpbmcgdG8gaXRzZWxmLCBhbmQgYWRqdXN0cyB0aGUgY291bnQgYXMKLXJlZmVyZW5jZXMgYXJlIGNyZWF0ZWQgb3IgZGVzdHJveWVkLiAgT25jZSB0aGUgcmVmZXJlbmNlIGNvdW50IHJlYWNoZXMKLXplcm8sIHRoZSBvYmplY3QgaXMgbm8gbG9uZ2VyIGFjY2Vzc2libGUsIHNpbmNlIHlvdSBuZWVkIHRvIGhhdmUgYQotcmVmZXJlbmNlIHRvIGFuIG9iamVjdCB0byBhY2Nlc3MgaXQsIGFuZCBpZiB0aGUgY291bnQgaXMgemVybywgbm8KLXJlZmVyZW5jZXMgZXhpc3QgYW55IGxvbmdlci4gIAotCi1SZWZlcmVuY2UgY291bnRpbmcgaGFzIHNvbWUgcGxlYXNhbnQgcHJvcGVydGllczogaXQncyBlYXN5IHRvCi11bmRlcnN0YW5kIGFuZCBpbXBsZW1lbnQsIGFuZCB0aGUgcmVzdWx0aW5nIGltcGxlbWVudGF0aW9uIGlzCi1wb3J0YWJsZSwgZmFpcmx5IGZhc3QsIGFuZCByZWFjdHMgd2VsbCB3aXRoIG90aGVyIGxpYnJhcmllcyB0aGF0Ci1pbXBsZW1lbnQgdGhlaXIgb3duIG1lbW9yeSBoYW5kbGluZyBzY2hlbWVzLiAgVGhlIG1ham9yIHByb2JsZW0gd2l0aAotcmVmZXJlbmNlIGNvdW50aW5nIGlzIHRoYXQgaXQgc29tZXRpbWVzIGRvZXNuJ3QgcmVhbGlzZSB0aGF0IG9iamVjdHMKLWFyZSBubyBsb25nZXIgYWNjZXNzaWJsZSwgcmVzdWx0aW5nIGluIGEgbWVtb3J5IGxlYWsuICBUaGlzIGhhcHBlbnMKLXdoZW4gdGhlcmUgYXJlIGN5Y2xlcyBvZiByZWZlcmVuY2VzLgotCi1Db25zaWRlciB0aGUgc2ltcGxlc3QgcG9zc2libGUgY3ljbGUsIAotYSBjbGFzcyBpbnN0YW5jZSB3aGljaCBoYXMgYSByZWZlcmVuY2UgdG8gaXRzZWxmOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbnN0YW5jZSA9IFNvbWVDbGFzcygpCi1pbnN0YW5jZS5teXNlbGYgPSBpbnN0YW5jZQotXGVuZHt2ZXJiYXRpbX0KLQotQWZ0ZXIgdGhlIGFib3ZlIHR3byBsaW5lcyBvZiBjb2RlIGhhdmUgYmVlbiBleGVjdXRlZCwgdGhlIHJlZmVyZW5jZQotY291bnQgb2YgXGNvZGV7aW5zdGFuY2V9IGlzIDI7IG9uZSByZWZlcmVuY2UgaXMgZnJvbSB0aGUgdmFyaWFibGUKLW5hbWVkIFxzYW1weydpbnN0YW5jZSd9LCBhbmQgdGhlIG90aGVyIGlzIGZyb20gdGhlIFxzYW1we215c2VsZn0KLWF0dHJpYnV0ZSBvZiB0aGUgaW5zdGFuY2UuICAKLQotSWYgdGhlIG5leHQgbGluZSBvZiBjb2RlIGlzIFxjb2Rle2RlbCBpbnN0YW5jZX0sIHdoYXQgaGFwcGVucz8gIFRoZQotcmVmZXJlbmNlIGNvdW50IG9mIFxjb2Rle2luc3RhbmNlfSBpcyBkZWNyZWFzZWQgYnkgMSwgc28gaXQgaGFzIGEKLXJlZmVyZW5jZSBjb3VudCBvZiAxOyB0aGUgcmVmZXJlbmNlIGluIHRoZSBcc2FtcHtteXNlbGZ9IGF0dHJpYnV0ZQotc3RpbGwgZXhpc3RzLiAgWWV0IHRoZSBpbnN0YW5jZSBpcyBubyBsb25nZXIgYWNjZXNzaWJsZSB0aHJvdWdoIFB5dGhvbgotY29kZSwgYW5kIGl0IGNvdWxkIGJlIGRlbGV0ZWQuICBTZXZlcmFsIG9iamVjdHMgY2FuIHBhcnRpY2lwYXRlIGluIGEKLWN5Y2xlIGlmIHRoZXkgaGF2ZSByZWZlcmVuY2VzIHRvIGVhY2ggb3RoZXIsIGNhdXNpbmcgYWxsIG9mIHRoZQotb2JqZWN0cyB0byBiZSBsZWFrZWQuCi0KLVB5dGhvbiAyLjAgZml4ZXMgdGhpcyBwcm9ibGVtIGJ5IHBlcmlvZGljYWxseSBleGVjdXRpbmcgYSBjeWNsZQotZGV0ZWN0aW9uIGFsZ29yaXRobSB3aGljaCBsb29rcyBmb3IgaW5hY2Nlc3NpYmxlIGN5Y2xlcyBhbmQgZGVsZXRlcwotdGhlIG9iamVjdHMgaW52b2x2ZWQuICBBIG5ldyBcbW9kdWxle2djfSBtb2R1bGUgcHJvdmlkZXMgZnVuY3Rpb25zIHRvCi1wZXJmb3JtIGEgZ2FyYmFnZSBjb2xsZWN0aW9uLCBvYnRhaW4gZGVidWdnaW5nIHN0YXRpc3RpY3MsIGFuZCB0dW5pbmcKLXRoZSBjb2xsZWN0b3IncyBwYXJhbWV0ZXJzLgotCi1SdW5uaW5nIHRoZSBjeWNsZSBkZXRlY3Rpb24gYWxnb3JpdGhtIHRha2VzIHNvbWUgdGltZSwgYW5kIHRoZXJlZm9yZQotd2lsbCByZXN1bHQgaW4gc29tZSBhZGRpdGlvbmFsIG92ZXJoZWFkLiAgSXQgaXMgaG9wZWQgdGhhdCBhZnRlciB3ZSd2ZQotZ290dGVuIGV4cGVyaWVuY2Ugd2l0aCB0aGUgY3ljbGUgY29sbGVjdGlvbiBmcm9tIHVzaW5nIDIuMCwgUHl0aG9uIDIuMQotd2lsbCBiZSBhYmxlIHRvIG1pbmltaXplIHRoZSBvdmVyaGVhZCB3aXRoIGNhcmVmdWwgdHVuaW5nLiAgSXQncyBub3QKLXlldCBvYnZpb3VzIGhvdyBtdWNoIHBlcmZvcm1hbmNlIGlzIGxvc3QsIGJlY2F1c2UgYmVuY2htYXJraW5nIHRoaXMgaXMKLXRyaWNreSBhbmQgZGVwZW5kcyBjcnVjaWFsbHkgb24gaG93IG9mdGVuIHRoZSBwcm9ncmFtIGNyZWF0ZXMgYW5kCi1kZXN0cm95cyBvYmplY3RzLiAgVGhlIGRldGVjdGlvbiBvZiBjeWNsZXMgY2FuIGJlIGRpc2FibGVkIHdoZW4gUHl0aG9uCi1pcyBjb21waWxlZCwgaWYgeW91IGNhbid0IGFmZm9yZCBldmVuIGEgdGlueSBzcGVlZCBwZW5hbHR5IG9yIHN1c3BlY3QKLXRoYXQgdGhlIGN5Y2xlIGNvbGxlY3Rpb24gaXMgYnVnZ3ksIGJ5IHNwZWNpZnlpbmcgdGhlCi1cbG9uZ3Byb2dyYW1vcHR7d2l0aG91dC1jeWNsZS1nY30gc3dpdGNoIHdoZW4gcnVubmluZyB0aGUKLVxwcm9ncmFte2NvbmZpZ3VyZX0gc2NyaXB0LgotCi1TZXZlcmFsIHBlb3BsZSB0YWNrbGVkIHRoaXMgcHJvYmxlbSBhbmQgY29udHJpYnV0ZWQgdG8gYSBzb2x1dGlvbi4gIEFuCi1lYXJseSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY3ljbGUgZGV0ZWN0aW9uIGFwcHJvYWNoIHdhcyB3cml0dGVuIGJ5Ci1Ub2J5IEtlbHNleS4gIFRoZSBjdXJyZW50IGFsZ29yaXRobSB3YXMgc3VnZ2VzdGVkIGJ5IEVyaWMgVGllZGVtYW5uCi1kdXJpbmcgYSB2aXNpdCB0byBDTlJJLCBhbmQgR3VpZG8gdmFuIFJvc3N1bSBhbmQgTmVpbCBTY2hlbWVuYXVlcgotd3JvdGUgdHdvIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMsIHdoaWNoIHdlcmUgbGF0ZXIgaW50ZWdyYXRlZCBieQotTmVpbC4gIExvdHMgb2Ygb3RoZXIgcGVvcGxlIG9mZmVyZWQgc3VnZ2VzdGlvbnMgYWxvbmcgdGhlIHdheTsgdGhlCi1NYXJjaCAyMDAwIGFyY2hpdmVzIG9mIHRoZSBweXRob24tZGV2IG1haWxpbmcgbGlzdCBjb250YWluIG1vc3Qgb2YgdGhlCi1yZWxldmFudCBkaXNjdXNzaW9uLCBlc3BlY2lhbGx5IGluIHRoZSB0aHJlYWRzIHRpdGxlZCBgYFJlZmVyZW5jZQotY3ljbGUgY29sbGVjdGlvbiBmb3IgUHl0aG9uJycgYW5kIGBgRmluYWxpemF0aW9uIGFnYWluJycuCi0KLSUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257T3RoZXIgQ29yZSBDaGFuZ2VzfQotCi1WYXJpb3VzIG1pbm9yIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgdG8gUHl0aG9uJ3Mgc3ludGF4IGFuZCBidWlsdC1pbgotZnVuY3Rpb25zLiAgTm9uZSBvZiB0aGUgY2hhbmdlcyBhcmUgdmVyeSBmYXItcmVhY2hpbmcsIGJ1dCB0aGV5J3JlCi1oYW5keSBjb252ZW5pZW5jZXMuCi0KLVxzdWJzZWN0aW9ue01pbm9yIExhbmd1YWdlIENoYW5nZXN9Ci0KLUEgbmV3IHN5bnRheCBtYWtlcyBpdCBtb3JlIGNvbnZlbmllbnQgdG8gY2FsbCBhIGdpdmVuIGZ1bmN0aW9uCi13aXRoIGEgdHVwbGUgb2YgYXJndW1lbnRzIGFuZC9vciBhIGRpY3Rpb25hcnkgb2Yga2V5d29yZCBhcmd1bWVudHMuCi1JbiBQeXRob24gMS41IGFuZCBlYXJsaWVyLCB5b3UnZCB1c2UgdGhlIFxmdW5jdGlvbnthcHBseSgpfQotYnVpbHQtaW4gZnVuY3Rpb246IFxjb2Rle2FwcGx5KGYsIFx2YXJ7YXJnc30sIFx2YXJ7a3d9KX0gY2FsbHMgdGhlCi1mdW5jdGlvbiBcZnVuY3Rpb257ZigpfSB3aXRoIHRoZSBhcmd1bWVudCB0dXBsZSBcdmFye2FyZ3N9IGFuZCB0aGUKLWtleXdvcmQgYXJndW1lbnRzIGluIHRoZSBkaWN0aW9uYXJ5IFx2YXJ7a3d9LiAgXGZ1bmN0aW9ue2FwcGx5KCl9IAotaXMgdGhlIHNhbWUgaW4gMi4wLCBidXQgdGhhbmtzIHRvIGEgcGF0Y2ggZnJvbQotR3JlZyBFd2luZywgXGNvZGV7ZigqXHZhcnthcmdzfSwgKipcdmFye2t3fSl9IGFzIGEgc2hvcnRlcgotYW5kIGNsZWFyZXIgd2F5IHRvIGFjaGlldmUgdGhlIHNhbWUgZWZmZWN0LiAgVGhpcyBzeW50YXggaXMKLXN5bW1ldHJpY2FsIHdpdGggdGhlIHN5bnRheCBmb3IgZGVmaW5pbmcgZnVuY3Rpb25zOgotCi1cYmVnaW57dmVyYmF0aW19Ci1kZWYgZigqYXJncywgKiprdyk6Ci0gICAgIyBhcmdzIGlzIGEgdHVwbGUgb2YgcG9zaXRpb25hbCBhcmdzLAotICAgICMga3cgaXMgYSBkaWN0aW9uYXJ5IG9mIGtleXdvcmQgYXJncwotICAgIC4uLgotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIFxrZXl3b3Jke3ByaW50fSBzdGF0ZW1lbnQgY2FuIG5vdyBoYXZlIGl0cyBvdXRwdXQgZGlyZWN0ZWQgdG8gYQotZmlsZS1saWtlIG9iamVjdCBieSBmb2xsb3dpbmcgdGhlIFxrZXl3b3Jke3ByaW50fSB3aXRoIAotXHZlcmJ8Pj4gZmlsZXwsIHNpbWlsYXIgdG8gdGhlIHJlZGlyZWN0aW9uIG9wZXJhdG9yIGluIFxVTklYe30gc2hlbGxzLgotUHJldmlvdXNseSB5b3UnZCBlaXRoZXIgaGF2ZSB0byB1c2UgdGhlIFxtZXRob2R7d3JpdGUoKX0gbWV0aG9kIG9mIHRoZQotZmlsZS1saWtlIG9iamVjdCwgd2hpY2ggbGFja3MgdGhlIGNvbnZlbmllbmNlIGFuZCBzaW1wbGljaXR5IG9mCi1ca2V5d29yZHtwcmludH0sIG9yIHlvdSBjb3VsZCBhc3NpZ24gYSBuZXcgdmFsdWUgdG8gCi1cY29kZXtzeXMuc3Rkb3V0fSBhbmQgdGhlbiByZXN0b3JlIHRoZSBvbGQgdmFsdWUuICBGb3Igc2VuZGluZyBvdXRwdXQgdG8gc3RhbmRhcmQgZXJyb3IsCi1pdCdzIG11Y2ggZWFzaWVyIHRvIHdyaXRlIHRoaXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXByaW50ID4+IHN5cy5zdGRlcnIsICJXYXJuaW5nOiBhY3Rpb24gZmllbGQgbm90IHN1cHBsaWVkIgotXGVuZHt2ZXJiYXRpbX0KLQotTW9kdWxlcyBjYW4gbm93IGJlIHJlbmFtZWQgb24gaW1wb3J0aW5nIHRoZW0sIHVzaW5nIHRoZSBzeW50YXgKLVxjb2Rle2ltcG9ydCBcdmFye21vZHVsZX0gYXMgXHZhcntuYW1lfX0gb3IgXGNvZGV7ZnJvbSBcdmFye21vZHVsZX0KLWltcG9ydCBcdmFye25hbWV9IGFzIFx2YXJ7b3RoZXJuYW1lfX0uICBUaGUgcGF0Y2ggd2FzIHN1Ym1pdHRlZCBieQotVGhvbWFzIFdvdXRlcnMuCi0KLUEgbmV3IGZvcm1hdCBzdHlsZSBpcyBhdmFpbGFibGUgd2hlbiB1c2luZyB0aGUgXGNvZGV7XCV9IG9wZXJhdG9yOwotJ1wlcicgd2lsbCBpbnNlcnQgdGhlIFxmdW5jdGlvbntyZXByKCl9IG9mIGl0cyBhcmd1bWVudC4gIFRoaXMgd2FzCi1hbHNvIGFkZGVkIGZyb20gc3ltbWV0cnkgY29uc2lkZXJhdGlvbnMsIHRoaXMgdGltZSBmb3Igc3ltbWV0cnkgd2l0aAotdGhlIGV4aXN0aW5nICdcJXMnIGZvcm1hdCBzdHlsZSwgd2hpY2ggaW5zZXJ0cyB0aGUgXGZ1bmN0aW9ue3N0cigpfSBvZgotaXRzIGFyZ3VtZW50LiAgRm9yIGV4YW1wbGUsIFxjb2RleydcJXIgXCVzJyBcJSAoJ2FiYycsICdhYmMnKX0gcmV0dXJucyBhCi1zdHJpbmcgY29udGFpbmluZyBcdmVyYnwnYWJjJyBhYmN8LgotCi1QcmV2aW91c2x5IHRoZXJlIHdhcyBubyB3YXkgdG8gaW1wbGVtZW50IGEgY2xhc3MgdGhhdCBvdmVycm9kZQotUHl0aG9uJ3MgYnVpbHQtaW4gXGtleXdvcmR7aW59IG9wZXJhdG9yIGFuZCBpbXBsZW1lbnRlZCBhIGN1c3RvbQotdmVyc2lvbi4gIFxjb2Rle1x2YXJ7b2JqfSBpbiBcdmFye3NlcX19IHJldHVybnMgdHJ1ZSBpZiBcdmFye29ian0gaXMKLXByZXNlbnQgaW4gdGhlIHNlcXVlbmNlIFx2YXJ7c2VxfTsgUHl0aG9uIGNvbXB1dGVzIHRoaXMgYnkgc2ltcGx5Ci10cnlpbmcgZXZlcnkgaW5kZXggb2YgdGhlIHNlcXVlbmNlIHVudGlsIGVpdGhlciBcdmFye29ian0gaXMgZm91bmQgb3IKLWFuIFxleGNlcHRpb257SW5kZXhFcnJvcn0gaXMgZW5jb3VudGVyZWQuICBNb3NoZSBaYWRrYSBjb250cmlidXRlZCBhCi1wYXRjaCB3aGljaCBhZGRzIGEgXG1ldGhvZHtfX2NvbnRhaW5zX199IG1hZ2ljIG1ldGhvZCBmb3IgcHJvdmlkaW5nIGEKLWN1c3RvbSBpbXBsZW1lbnRhdGlvbiBmb3IgXGtleXdvcmR7aW59LiBBZGRpdGlvbmFsbHksIG5ldyBidWlsdC1pbgotb2JqZWN0cyB3cml0dGVuIGluIEMgY2FuIGRlZmluZSB3aGF0IFxrZXl3b3Jke2lufSBtZWFucyBmb3IgdGhlbSB2aWEgYQotbmV3IHNsb3QgaW4gdGhlIHNlcXVlbmNlIHByb3RvY29sLgotCi1FYXJsaWVyIHZlcnNpb25zIG9mIFB5dGhvbiB1c2VkIGEgcmVjdXJzaXZlIGFsZ29yaXRobSBmb3IgZGVsZXRpbmcKLW9iamVjdHMuICBEZWVwbHkgbmVzdGVkIGRhdGEgc3RydWN0dXJlcyBjb3VsZCBjYXVzZSB0aGUgaW50ZXJwcmV0ZXIgdG8KLWZpbGwgdXAgdGhlIEMgc3RhY2sgYW5kIGNyYXNoOyBDaHJpc3RpYW4gVGlzbWVyIHJld3JvdGUgdGhlIGRlbGV0aW9uCi1sb2dpYyB0byBmaXggdGhpcyBwcm9ibGVtLiAgT24gYSByZWxhdGVkIG5vdGUsIGNvbXBhcmluZyByZWN1cnNpdmUKLW9iamVjdHMgcmVjdXJzZWQgaW5maW5pdGVseSBhbmQgY3Jhc2hlZDsgSmVyZW15IEh5bHRvbiByZXdyb3RlIHRoZQotY29kZSB0byBubyBsb25nZXIgY3Jhc2gsIHByb2R1Y2luZyBhIHVzZWZ1bCByZXN1bHQgaW5zdGVhZC4gIEZvcgotZXhhbXBsZSwgYWZ0ZXIgdGhpcyBjb2RlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1hID0gW10KLWIgPSBbXQotYS5hcHBlbmQoYSkKLWIuYXBwZW5kKGIpCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgY29tcGFyaXNvbiBcY29kZXthPT1ifSByZXR1cm5zIHRydWUsIGJlY2F1c2UgdGhlIHR3byByZWN1cnNpdmUKLWRhdGEgc3RydWN0dXJlcyBhcmUgaXNvbW9ycGhpYy4gU2VlIHRoZSB0aHJlYWQgYGB0cmFzaGNhbgotYW5kIFBSXCM3JycgaW4gdGhlIEFwcmlsIDIwMDAgYXJjaGl2ZXMgb2YgdGhlIHB5dGhvbi1kZXYgbWFpbGluZyBsaXN0Ci1mb3IgdGhlIGRpc2N1c3Npb24gbGVhZGluZyB1cCB0byB0aGlzIGltcGxlbWVudGF0aW9uLCBhbmQgc29tZSB1c2VmdWwKLXJlbGV2YW50IGxpbmtzLiAgCi0lIFN0YXJ0aW5nIFVSTDoKLSUgaHR0cDovL3d3dy5weXRob24ub3JnL3BpcGVybWFpbC9weXRob24tZGV2LzIwMDAtQXByaWwvMDA0ODM0Lmh0bWwKLQotTm90ZSB0aGF0IGNvbXBhcmlzb25zIGNhbiBub3cgYWxzbyByYWlzZSBleGNlcHRpb25zLiBJbiBlYXJsaWVyCi12ZXJzaW9ucyBvZiBQeXRob24sIGEgY29tcGFyaXNvbiBvcGVyYXRpb24gc3VjaCBhcyBcY29kZXtjbXAoYSxiKX0KLXdvdWxkIGFsd2F5cyBwcm9kdWNlIGFuIGFuc3dlciwgZXZlbiBpZiBhIHVzZXItZGVmaW5lZAotXG1ldGhvZHtfX2NtcF9ffSBtZXRob2QgZW5jb3VudGVyZWQgYW4gZXJyb3IsIHNpbmNlIHRoZSByZXN1bHRpbmcKLWV4Y2VwdGlvbiB3b3VsZCBzaW1wbHkgYmUgc2lsZW50bHkgc3dhbGxvd2VkLgotCi1Xb3JrIGhhcyBiZWVuIGRvbmUgb24gcG9ydGluZyBQeXRob24gdG8gNjQtYml0IFdpbmRvd3Mgb24gdGhlIEl0YW5pdW0KLXByb2Nlc3NvciwgbW9zdGx5IGJ5IFRyZW50IE1pY2sgb2YgQWN0aXZlU3RhdGUuICAoQ29uZnVzaW5nbHksCi1cY29kZXtzeXMucGxhdGZvcm19IGlzIHN0aWxsIFxjb2Rleyd3aW4zMid9IG9uIFdpbjY0IGJlY2F1c2UgaXQgc2VlbXMKLXRoYXQgZm9yIGVhc2Ugb2YgcG9ydGluZywgTVMgVmlzdWFsIFxDcHB7fSB0cmVhdHMgY29kZSBhcyAzMiBiaXQgb24gSXRhbml1bS4pCi1QeXRob25XaW4gYWxzbyBzdXBwb3J0cyBXaW5kb3dzIENFOyBzZWUgdGhlIFB5dGhvbiBDRSBwYWdlIGF0Ci1cdXJse2h0dHA6Ly9zdGFyc2hpcC5weXRob24ubmV0L2NyZXcvbWhhbW1vbmQvY2UvfSBmb3IgbW9yZQotaW5mb3JtYXRpb24uCi0KLUFub3RoZXIgbmV3IHBsYXRmb3JtIGlzIERhcndpbi9NYWNPUyBYOyBpbml0aWFsIHN1cHBvcnQgZm9yIGl0IGlzIGluCi1QeXRob24gMi4wLiAgRHluYW1pYyBsb2FkaW5nIHdvcmtzLCBpZiB5b3Ugc3BlY2lmeSBgYGNvbmZpZ3VyZQotLS13aXRoLWR5bGQgLS13aXRoLXN1ZmZpeD0ueCcnLiAgQ29uc3VsdCB0aGUgUkVBRE1FIGluIHRoZSBQeXRob24KLXNvdXJjZSBkaXN0cmlidXRpb24gZm9yIG1vcmUgaW5zdHJ1Y3Rpb25zLgotCi1BbiBhdHRlbXB0IGhhcyBiZWVuIG1hZGUgdG8gYWxsZXZpYXRlIG9uZSBvZiBQeXRob24ncyB3YXJ0cywgdGhlCi1vZnRlbi1jb25mdXNpbmcgXGV4Y2VwdGlvbntOYW1lRXJyb3J9IGV4Y2VwdGlvbiB3aGVuIGNvZGUgcmVmZXJzIHRvIGEKLWxvY2FsIHZhcmlhYmxlIGJlZm9yZSB0aGUgdmFyaWFibGUgaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZS4gIEZvcgotZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlIHJhaXNlcyBhbiBleGNlcHRpb24gb24gdGhlIFxrZXl3b3Jke3ByaW50fQotc3RhdGVtZW50IGluIGJvdGggMS41LjIgYW5kIDIuMDsgaW4gMS41LjIgYSBcZXhjZXB0aW9ue05hbWVFcnJvcn0KLWV4Y2VwdGlvbiBpcyByYWlzZWQsIHdoaWxlIDIuMCByYWlzZXMgYSBuZXcKLVxleGNlcHRpb257VW5ib3VuZExvY2FsRXJyb3J9IGV4Y2VwdGlvbi4KLVxleGNlcHRpb257VW5ib3VuZExvY2FsRXJyb3J9IGlzIGEgc3ViY2xhc3Mgb2YgXGV4Y2VwdGlvbntOYW1lRXJyb3J9LAotc28gYW55IGV4aXN0aW5nIGNvZGUgdGhhdCBleHBlY3RzIFxleGNlcHRpb257TmFtZUVycm9yfSB0byBiZSByYWlzZWQKLXNob3VsZCBzdGlsbCB3b3JrLgotCi1cYmVnaW57dmVyYmF0aW19Ci1kZWYgZigpOgotICAgIHByaW50ICJpPSIsaQotICAgIGkgPSBpICsgMSAKLWYoKQotXGVuZHt2ZXJiYXRpbX0KLQotVHdvIG5ldyBleGNlcHRpb25zLCBcZXhjZXB0aW9ue1RhYkVycm9yfSBhbmQKLVxleGNlcHRpb257SW5kZW50YXRpb25FcnJvcn0sIGhhdmUgYmVlbiBpbnRyb2R1Y2VkLiAgVGhleSdyZSBib3RoCi1zdWJjbGFzc2VzIG9mIFxleGNlcHRpb257U3ludGF4RXJyb3J9LCBhbmQgYXJlIHJhaXNlZCB3aGVuIFB5dGhvbiBjb2RlCi1pcyBmb3VuZCB0byBiZSBpbXByb3Blcmx5IGluZGVudGVkLgotCi1cc3Vic2VjdGlvbntDaGFuZ2VzIHRvIEJ1aWx0LWluIEZ1bmN0aW9uc30KLQotQSBuZXcgYnVpbHQtaW4sIFxmdW5jdGlvbnt6aXAoXHZhcntzZXExfSwgXHZhcntzZXEyfSwgLi4uKX0sIGhhcyBiZWVuCi1hZGRlZC4gIFxmdW5jdGlvbnt6aXAoKX0gcmV0dXJucyBhIGxpc3Qgb2YgdHVwbGVzIHdoZXJlIGVhY2ggdHVwbGUKLWNvbnRhaW5zIHRoZSBpLXRoIGVsZW1lbnQgZnJvbSBlYWNoIG9mIHRoZSBhcmd1bWVudCBzZXF1ZW5jZXMuICBUaGUKLWRpZmZlcmVuY2UgYmV0d2VlbiBcZnVuY3Rpb257emlwKCl9IGFuZCBcY29kZXttYXAoTm9uZSwgXHZhcntzZXExfSwKLVx2YXJ7c2VxMn0pfSBpcyB0aGF0IFxmdW5jdGlvbnttYXAoKX0gcGFkcyB0aGUgc2VxdWVuY2VzIHdpdGgKLVxjb2Rle05vbmV9IGlmIHRoZSBzZXF1ZW5jZXMgYXJlbid0IGFsbCBvZiB0aGUgc2FtZSBsZW5ndGgsIHdoaWxlCi1cZnVuY3Rpb257emlwKCl9IHRydW5jYXRlcyB0aGUgcmV0dXJuZWQgbGlzdCB0byB0aGUgbGVuZ3RoIG9mIHRoZQotc2hvcnRlc3QgYXJndW1lbnQgc2VxdWVuY2UuCi0KLVRoZSBcZnVuY3Rpb257aW50KCl9IGFuZCBcZnVuY3Rpb257bG9uZygpfSBmdW5jdGlvbnMgbm93IGFjY2VwdCBhbgotb3B0aW9uYWwgYGBiYXNlJycgcGFyYW1ldGVyIHdoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEgc3RyaW5nLgotXGNvZGV7aW50KCcxMjMnLCAxMCl9IHJldHVybnMgMTIzLCB3aGlsZSBcY29kZXtpbnQoJzEyMycsIDE2KX0gcmV0dXJucwotMjkxLiAgXGNvZGV7aW50KDEyMywgMTYpfSByYWlzZXMgYSBcZXhjZXB0aW9ue1R5cGVFcnJvcn0gZXhjZXB0aW9uCi13aXRoIHRoZSBtZXNzYWdlIGBgY2FuJ3QgY29udmVydCBub24tc3RyaW5nIHdpdGggZXhwbGljaXQgYmFzZScnLgotCi1BIG5ldyB2YXJpYWJsZSBob2xkaW5nIG1vcmUgZGV0YWlsZWQgdmVyc2lvbiBpbmZvcm1hdGlvbiBoYXMgYmVlbgotYWRkZWQgdG8gdGhlIFxtb2R1bGV7c3lzfSBtb2R1bGUuICBcY29kZXtzeXMudmVyc2lvbl9pbmZvfSBpcyBhIHR1cGxlCi1cY29kZXsoXHZhcnttYWpvcn0sIFx2YXJ7bWlub3J9LCBcdmFye21pY3JvfSwgXHZhcntsZXZlbH0sCi1cdmFye3NlcmlhbH0pfSBGb3IgZXhhbXBsZSwgaW4gYSBoeXBvdGhldGljYWwgMi4wLjFiZXRhMSwKLVxjb2Rle3N5cy52ZXJzaW9uX2luZm99IHdvdWxkIGJlIFxjb2RleygyLCAwLCAxLCAnYmV0YScsIDEpfS4KLVx2YXJ7bGV2ZWx9IGlzIGEgc3RyaW5nIHN1Y2ggYXMgXGNvZGV7ImFscGhhIn0sIFxjb2RleyJiZXRhIn0sIG9yCi1cY29kZXsiZmluYWwifSBmb3IgYSBmaW5hbCByZWxlYXNlLgotCi1EaWN0aW9uYXJpZXMgaGF2ZSBhbiBvZGQgbmV3IG1ldGhvZCwgXG1ldGhvZHtzZXRkZWZhdWx0KFx2YXJ7a2V5fSwKLVx2YXJ7ZGVmYXVsdH0pfSwgd2hpY2ggYmVoYXZlcyBzaW1pbGFybHkgdG8gdGhlIGV4aXN0aW5nCi1cbWV0aG9ke2dldCgpfSBtZXRob2QuICBIb3dldmVyLCBpZiB0aGUga2V5IGlzIG1pc3NpbmcsCi1cbWV0aG9ke3NldGRlZmF1bHQoKX0gYm90aCByZXR1cm5zIHRoZSB2YWx1ZSBvZiBcdmFye2RlZmF1bHR9IGFzCi1cbWV0aG9ke2dldCgpfSB3b3VsZCBkbywgYW5kIGFsc28gaW5zZXJ0cyBpdCBpbnRvIHRoZSBkaWN0aW9uYXJ5IGFzCi10aGUgdmFsdWUgZm9yIFx2YXJ7a2V5fS4gIFRodXMsIHRoZSBmb2xsb3dpbmcgbGluZXMgb2YgY29kZToKLQotXGJlZ2lue3ZlcmJhdGltfQotaWYgZGljdC5oYXNfa2V5KCBrZXkgKTogcmV0dXJuIGRpY3Rba2V5XQotZWxzZTogCi0gICAgZGljdFtrZXldID0gW10KLSAgICByZXR1cm4gZGljdFtrZXldCi1cZW5ke3ZlcmJhdGltfQotCi1jYW4gYmUgcmVkdWNlZCB0byBhIHNpbmdsZSBcY29kZXtyZXR1cm4gZGljdC5zZXRkZWZhdWx0KGtleSwgW10pfSBzdGF0ZW1lbnQuCi0KLVRoZSBpbnRlcnByZXRlciBzZXRzIGEgbWF4aW11bSByZWN1cnNpb24gZGVwdGggaW4gb3JkZXIgdG8gY2F0Y2gKLXJ1bmF3YXkgcmVjdXJzaW9uIGJlZm9yZSBmaWxsaW5nIHRoZSBDIHN0YWNrIGFuZCBjYXVzaW5nIGEgY29yZSBkdW1wCi1vciBHUEYuLiAgUHJldmlvdXNseSB0aGlzIGxpbWl0IHdhcyBmaXhlZCB3aGVuIHlvdSBjb21waWxlZCBQeXRob24sCi1idXQgaW4gMi4wIHRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aCBjYW4gYmUgcmVhZCBhbmQgbW9kaWZpZWQgdXNpbmcKLVxmdW5jdGlvbntzeXMuZ2V0cmVjdXJzaW9ubGltaXR9IGFuZCBcZnVuY3Rpb257c3lzLnNldHJlY3Vyc2lvbmxpbWl0fS4KLVRoZSBkZWZhdWx0IHZhbHVlIGlzIDEwMDAsIGFuZCBhIHJvdWdoIG1heGltdW0gdmFsdWUgZm9yIGEgZ2l2ZW4KLXBsYXRmb3JtIGNhbiBiZSBmb3VuZCBieSBydW5uaW5nIGEgbmV3IHNjcmlwdCwKLVxmaWxle01pc2MvZmluZF9yZWN1cnNpb25saW1pdC5weX0uCi0KLSUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257UG9ydGluZyB0byAyLjB9Ci0KLU5ldyBQeXRob24gcmVsZWFzZXMgdHJ5IGhhcmQgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHByZXZpb3VzIHJlbGVhc2VzLAotYW5kIHRoZSByZWNvcmQgaGFzIGJlZW4gcHJldHR5IGdvb2QuICBIb3dldmVyLCBzb21lIGNoYW5nZXMgYXJlCi1jb25zaWRlcmVkIHVzZWZ1bCBlbm91Z2gsIHVzdWFsbHkgYmVjYXVzZSB0aGV5IGZpeCBpbml0aWFsIGRlc2lnbiBkZWNpc2lvbnMgdGhhdAotdHVybmVkIG91dCB0byBiZSBhY3RpdmVseSBtaXN0YWtlbiwgdGhhdCBicmVha2luZyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci1jYW4ndCBhbHdheXMgYmUgYXZvaWRlZC4gIFRoaXMgc2VjdGlvbiBsaXN0cyB0aGUgY2hhbmdlcyBpbiBQeXRob24gMi4wCi10aGF0IG1heSBjYXVzZSBvbGQgUHl0aG9uIGNvZGUgdG8gYnJlYWsuCi0KLVRoZSBjaGFuZ2Ugd2hpY2ggd2lsbCBwcm9iYWJseSBicmVhayB0aGUgbW9zdCBjb2RlIGlzIHRpZ2h0ZW5pbmcgdXAKLXRoZSBhcmd1bWVudHMgYWNjZXB0ZWQgYnkgc29tZSBtZXRob2RzLiAgU29tZSBtZXRob2RzIHdvdWxkIHRha2UKLW11bHRpcGxlIGFyZ3VtZW50cyBhbmQgdHJlYXQgdGhlbSBhcyBhIHR1cGxlLCBwYXJ0aWN1bGFybHkgdmFyaW91cwotbGlzdCBtZXRob2RzIHN1Y2ggYXMgXG1ldGhvZHsuYXBwZW5kKCl9IGFuZCBcbWV0aG9key5pbnNlcnQoKX0uCi1JbiBlYXJsaWVyIHZlcnNpb25zIG9mIFB5dGhvbiwgaWYgXGNvZGV7TH0gaXMgYSBsaXN0LCBcY29kZXtMLmFwcGVuZCgKLTEsMiApfSBhcHBlbmRzIHRoZSB0dXBsZSBcY29kZXsoMSwyKX0gdG8gdGhlIGxpc3QuICBJbiBQeXRob24gMi4wIHRoaXMKLWNhdXNlcyBhIFxleGNlcHRpb257VHlwZUVycm9yfSBleGNlcHRpb24gdG8gYmUgcmFpc2VkLCB3aXRoIHRoZQotbWVzc2FnZTogJ2FwcGVuZCByZXF1aXJlcyBleGFjdGx5IDEgYXJndW1lbnQ7IDIgZ2l2ZW4nLiAgVGhlIGZpeCBpcyB0bwotc2ltcGx5IGFkZCBhbiBleHRyYSBzZXQgb2YgcGFyZW50aGVzZXMgdG8gcGFzcyBib3RoIHZhbHVlcyBhcyBhIHR1cGxlOiAKLVxjb2Rle0wuYXBwZW5kKCAoMSwyKSApfS4KLQotVGhlIGVhcmxpZXIgdmVyc2lvbnMgb2YgdGhlc2UgbWV0aG9kcyB3ZXJlIG1vcmUgZm9yZ2l2aW5nIGJlY2F1c2UgdGhleQotdXNlZCBhbiBvbGQgZnVuY3Rpb24gaW4gUHl0aG9uJ3MgQyBpbnRlcmZhY2UgdG8gcGFyc2UgdGhlaXIgYXJndW1lbnRzOwotMi4wIG1vZGVybml6ZXMgdGhlbSB0byB1c2UgXGZ1bmN0aW9ue1B5QXJnX1BhcnNlVHVwbGV9LCB0aGUgY3VycmVudAotYXJndW1lbnQgcGFyc2luZyBmdW5jdGlvbiwgd2hpY2ggcHJvdmlkZXMgbW9yZSBoZWxwZnVsIGVycm9yIG1lc3NhZ2VzCi1hbmQgdHJlYXRzIG11bHRpLWFyZ3VtZW50IGNhbGxzIGFzIGVycm9ycy4gIElmIHlvdSBhYnNvbHV0ZWx5IG11c3QgdXNlCi0yLjAgYnV0IGNhbid0IGZpeCB5b3VyIGNvZGUsIHlvdSBjYW4gZWRpdCBcZmlsZXtPYmplY3RzL2xpc3RvYmplY3QuY30KLWFuZCBkZWZpbmUgdGhlIHByZXByb2Nlc3NvciBzeW1ib2wgXGNvZGV7Tk9fU1RSSUNUX0xJU1RfQVBQRU5EfSB0bwotcHJlc2VydmUgdGhlIG9sZCBiZWhhdmlvdXI7IHRoaXMgaXNuJ3QgcmVjb21tZW5kZWQuCi0KLVNvbWUgb2YgdGhlIGZ1bmN0aW9ucyBpbiB0aGUgXG1vZHVsZXtzb2NrZXR9IG1vZHVsZSBhcmUgc3RpbGwKLWZvcmdpdmluZyBpbiB0aGlzIHdheS4gIEZvciBleGFtcGxlLCBcZnVuY3Rpb257c29ja2V0LmNvbm5lY3QoCi0oJ2hvc3RuYW1lJywgMjUpICl9IGlzIHRoZSBjb3JyZWN0IGZvcm0sIHBhc3NpbmcgYSB0dXBsZSByZXByZXNlbnRpbmcKLWFuIElQIGFkZHJlc3MsIGJ1dCBcZnVuY3Rpb257c29ja2V0LmNvbm5lY3QoICdob3N0bmFtZScsIDI1ICl9IGFsc28KLXdvcmtzLiBcZnVuY3Rpb257c29ja2V0LmNvbm5lY3RfZXgoKX0gYW5kIFxmdW5jdGlvbntzb2NrZXQuYmluZCgpfSBhcmUKLXNpbWlsYXJseSBlYXN5LWdvaW5nLiAgMi4wYWxwaGExIHRpZ2h0ZW5lZCB0aGVzZSBmdW5jdGlvbnMgdXAsIGJ1dAotYmVjYXVzZSB0aGUgZG9jdW1lbnRhdGlvbiBhY3R1YWxseSB1c2VkIHRoZSBlcnJvbmVvdXMgbXVsdGlwbGUKLWFyZ3VtZW50IGZvcm0sIG1hbnkgcGVvcGxlIHdyb3RlIGNvZGUgd2hpY2ggd291bGQgYnJlYWsgd2l0aCB0aGUKLXN0cmljdGVyIGNoZWNraW5nLiAgR3ZSIGJhY2tlZCBvdXQgdGhlIGNoYW5nZXMgaW4gdGhlIGZhY2Ugb2YgcHVibGljCi1yZWFjdGlvbiwgc28gZm9yIHRoZSBcbW9kdWxle3NvY2tldH0gbW9kdWxlLCB0aGUgZG9jdW1lbnRhdGlvbiB3YXMKLWZpeGVkIGFuZCB0aGUgbXVsdGlwbGUgYXJndW1lbnQgZm9ybSBpcyBzaW1wbHkgbWFya2VkIGFzIGRlcHJlY2F0ZWQ7Ci1pdCBcZW1waHt3aWxsfSBiZSB0aWdodGVuZWQgdXAgYWdhaW4gaW4gYSBmdXR1cmUgUHl0aG9uIHZlcnNpb24uCi0KLVRoZSBcY29kZXtcZSB4fSBlc2NhcGUgaW4gc3RyaW5nIGxpdGVyYWxzIG5vdyB0YWtlcyBleGFjdGx5IDIgaGV4Ci1kaWdpdHMuICBQcmV2aW91c2x5IGl0IHdvdWxkIGNvbnN1bWUgYWxsIHRoZSBoZXggZGlnaXRzIGZvbGxvd2luZyB0aGUKLSd4JyBhbmQgdGFrZSB0aGUgbG93ZXN0IDggYml0cyBvZiB0aGUgcmVzdWx0LCBzbyBcY29kZXtcZSB4MTIzNDU2fSB3YXMKLWVxdWl2YWxlbnQgdG8gXGNvZGV7XGUgeDU2fS4KLQotVGhlIFxleGNlcHRpb257QXR0cmlidXRlRXJyb3J9IGFuZCBcZXhjZXB0aW9ue05hbWVFcnJvcn0gZXhjZXB0aW9ucwotaGF2ZSBhIG1vcmUgZnJpZW5kbHkgZXJyb3IgbWVzc2FnZSwgd2hvc2UgdGV4dCB3aWxsIGJlIHNvbWV0aGluZyBsaWtlCi1cY29kZXsnU3BhbScgaW5zdGFuY2UgaGFzIG5vIGF0dHJpYnV0ZSAnZWdncyd9IG9yIFxjb2Rle25hbWUgJ2VnZ3MnIGlzCi1ub3QgZGVmaW5lZH0uICBQcmV2aW91c2x5IHRoZSBlcnJvciBtZXNzYWdlIHdhcyBqdXN0IHRoZSBtaXNzaW5nCi1hdHRyaWJ1dGUgbmFtZSBcY29kZXtlZ2dzfSwgYW5kIGNvZGUgd3JpdHRlbiB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGlzCi1mYWN0IHdpbGwgYnJlYWsgaW4gMi4wLgotCi1Tb21lIHdvcmsgaGFzIGJlZW4gZG9uZSB0byBtYWtlIGludGVnZXJzIGFuZCBsb25nIGludGVnZXJzIGEgYml0IG1vcmUKLWludGVyY2hhbmdlYWJsZS4gIEluIDEuNS4yLCBsYXJnZS1maWxlIHN1cHBvcnQgd2FzIGFkZGVkIGZvciBTb2xhcmlzLAotdG8gYWxsb3cgcmVhZGluZyBmaWxlcyBsYXJnZXIgdGhhbiAyfkdpQjsgdGhpcyBtYWRlIHRoZSBcbWV0aG9ke3RlbGwoKX0KLW1ldGhvZCBvZiBmaWxlIG9iamVjdHMgcmV0dXJuIGEgbG9uZyBpbnRlZ2VyIGluc3RlYWQgb2YgYSByZWd1bGFyCi1pbnRlZ2VyLiAgU29tZSBjb2RlIHdvdWxkIHN1YnRyYWN0IHR3byBmaWxlIG9mZnNldHMgYW5kIGF0dGVtcHQgdG8gdXNlCi10aGUgcmVzdWx0IHRvIG11bHRpcGx5IGEgc2VxdWVuY2Ugb3Igc2xpY2UgYSBzdHJpbmcsIGJ1dCB0aGlzIHJhaXNlZCBhCi1cZXhjZXB0aW9ue1R5cGVFcnJvcn0uICBJbiAyLjAsIGxvbmcgaW50ZWdlcnMgY2FuIGJlIHVzZWQgdG8gbXVsdGlwbHkKLW9yIHNsaWNlIGEgc2VxdWVuY2UsIGFuZCBpdCdsbCBiZWhhdmUgYXMgeW91J2QgaW50dWl0aXZlbHkgZXhwZWN0IGl0Ci10bzsgXGNvZGV7M0wgKiAnYWJjJ30gcHJvZHVjZXMgJ2FiY2FiY2FiYycsIGFuZCBcY29kZXsKLSgwLDEsMiwzKVsyTDo0TF19IHByb2R1Y2VzICgyLDMpLiBMb25nIGludGVnZXJzIGNhbiBhbHNvIGJlIHVzZWQgaW4KLXZhcmlvdXMgY29udGV4dHMgd2hlcmUgcHJldmlvdXNseSBvbmx5IGludGVnZXJzIHdlcmUgYWNjZXB0ZWQsIHN1Y2gKLWFzIGluIHRoZSBcbWV0aG9ke3NlZWsoKX0gbWV0aG9kIG9mIGZpbGUgb2JqZWN0cywgYW5kIGluIHRoZSBmb3JtYXRzCi1zdXBwb3J0ZWQgYnkgdGhlIFx2ZXJifCV8IG9wZXJhdG9yIChcdmVyYnwlZHwsIFx2ZXJifCVpfCwgXHZlcmJ8JXh8LAotZXRjLikuICBGb3IgZXhhbXBsZSwgXGNvZGV7IlwlZCIgXCUgMkwqKjY0fSB3aWxsIHByb2R1Y2UgdGhlIHN0cmluZwotXHNhbXB7MTg0NDY3NDQwNzM3MDk1NTE2MTZ9LgotCi1UaGUgc3VidGxlc3QgbG9uZyBpbnRlZ2VyIGNoYW5nZSBvZiBhbGwgaXMgdGhhdCB0aGUgXGZ1bmN0aW9ue3N0cigpfQotb2YgYSBsb25nIGludGVnZXIgbm8gbG9uZ2VyIGhhcyBhIHRyYWlsaW5nICdMJyBjaGFyYWN0ZXIsIHRob3VnaAotXGZ1bmN0aW9ue3JlcHIoKX0gc3RpbGwgaW5jbHVkZXMgaXQuICBUaGUgJ0wnIGFubm95ZWQgbWFueSBwZW9wbGUgd2hvCi13YW50ZWQgdG8gcHJpbnQgbG9uZyBpbnRlZ2VycyB0aGF0IGxvb2tlZCBqdXN0IGxpa2UgcmVndWxhciBpbnRlZ2VycywKLXNpbmNlIHRoZXkgaGFkIHRvIGdvIG91dCBvZiB0aGVpciB3YXkgdG8gY2hvcCBvZmYgdGhlIGNoYXJhY3Rlci4gIFRoaXMKLWlzIG5vIGxvbmdlciBhIHByb2JsZW0gaW4gMi4wLCBidXQgY29kZSB3aGljaCBkb2VzIFxjb2Rle3N0cihsb25ndmFsKVs6LTFdfSBhbmQgYXNzdW1lcyB0aGUgJ0wnIGlzIHRoZXJlLCB3aWxsIG5vdyBsb3NlCi10aGUgZmluYWwgZGlnaXQuCi0KLVRha2luZyB0aGUgXGZ1bmN0aW9ue3JlcHIoKX0gb2YgYSBmbG9hdCBub3cgdXNlcyBhIGRpZmZlcmVudAotZm9ybWF0dGluZyBwcmVjaXNpb24gdGhhbiBcZnVuY3Rpb257c3RyKCl9LiAgXGZ1bmN0aW9ue3JlcHIoKX0gdXNlcwotXGNvZGV7XCUuMTdnfSBmb3JtYXQgc3RyaW5nIGZvciBDJ3MgXGZ1bmN0aW9ue3NwcmludGYoKX0sIHdoaWxlCi1cZnVuY3Rpb257c3RyKCl9IHVzZXMgXGNvZGV7XCUuMTJnfSBhcyBiZWZvcmUuICBUaGUgZWZmZWN0IGlzIHRoYXQgCi1cZnVuY3Rpb257cmVwcigpfSBtYXkgb2NjYXNpb25hbGx5IHNob3cgbW9yZSBkZWNpbWFsIHBsYWNlcyB0aGFuIAotXGZ1bmN0aW9ue3N0cigpfSwgZm9yIGNlcnRhaW4gbnVtYmVycy4gCi1Gb3IgZXhhbXBsZSwgdGhlIG51bWJlciA4LjEgY2FuJ3QgYmUgcmVwcmVzZW50ZWQgZXhhY3RseSBpbiBiaW5hcnksIHNvCi1cY29kZXtyZXByKDguMSl9IGlzIFxjb2Rleyc4LjA5OTk5OTk5OTk5OTk5OTYnfSwgd2hpbGUgc3RyKDguMSkgaXMKLVxjb2Rleyc4LjEnfS4KLQotVGhlIFxjb2Rley1YfSBjb21tYW5kLWxpbmUgb3B0aW9uLCB3aGljaCB0dXJuZWQgYWxsIHN0YW5kYXJkCi1leGNlcHRpb25zIGludG8gc3RyaW5ncyBpbnN0ZWFkIG9mIGNsYXNzZXMsIGhhcyBiZWVuIHJlbW92ZWQ7IHRoZQotc3RhbmRhcmQgZXhjZXB0aW9ucyB3aWxsIG5vdyBhbHdheXMgYmUgY2xhc3Nlcy4gIFRoZQotXG1vZHVsZXtleGNlcHRpb25zfSBtb2R1bGUgY29udGFpbmluZyB0aGUgc3RhbmRhcmQgZXhjZXB0aW9ucyB3YXMKLXRyYW5zbGF0ZWQgZnJvbSBQeXRob24gdG8gYSBidWlsdC1pbiBDIG1vZHVsZSwgd3JpdHRlbiBieSBCYXJyeSBXYXJzYXcKLWFuZCBGcmVkcmlrIEx1bmRoLgotCi0lIENvbW1lbnRlZCBvdXQgZm9yIG5vdyAtLSBJIGRvbid0IHRoaW5rIGFueW9uZSB3aWxsIGNhcmUuCi0lVGhlIHBhdHRlcm4gYW5kIG1hdGNoIG9iamVjdHMgcHJvdmlkZWQgYnkgU1JFIGFyZSBDIHR5cGVzLCBub3QgUHl0aG9uCi0lY2xhc3MgaW5zdGFuY2VzIGFzIGluIDEuNS4gIFRoaXMgbWVhbnMgeW91IGNhbiBubyBsb25nZXIgaW5oZXJpdCBmcm9tCi0lXGNsYXNze1JlZ2V4T2JqZWN0fSBvciBcY2xhc3N7TWF0Y2hPYmplY3R9LCBidXQgdGhhdCBzaG91bGRuJ3QgYmUgbXVjaAotJW9mIGEgcHJvYmxlbSBzaW5jZSBubyBvbmUgc2hvdWxkIGhhdmUgYmVlbiBkb2luZyB0aGF0IGluIHRoZSBmaXJzdAotJXBsYWNlLgotCi0lID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue0V4dGVuZGluZy9FbWJlZGRpbmcgQ2hhbmdlc30KLQotU29tZSBvZiB0aGUgY2hhbmdlcyBhcmUgdW5kZXIgdGhlIGNvdmVycywgYW5kIHdpbGwgb25seSBiZSBhcHBhcmVudCB0bwotcGVvcGxlIHdyaXRpbmcgQyBleHRlbnNpb24gbW9kdWxlcyBvciBlbWJlZGRpbmcgYSBQeXRob24gaW50ZXJwcmV0ZXIKLWluIGEgbGFyZ2VyIGFwcGxpY2F0aW9uLiAgSWYgeW91IGFyZW4ndCBkZWFsaW5nIHdpdGggUHl0aG9uJ3MgQyBBUEksCi15b3UgY2FuIHNhZmVseSBza2lwIHRoaXMgc2VjdGlvbi4KLQotVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBQeXRob24gQyBBUEkgd2FzIGluY3JlbWVudGVkLCBzbyBDCi1leHRlbnNpb25zIGNvbXBpbGVkIGZvciAxLjUuMiBtdXN0IGJlIHJlY29tcGlsZWQgaW4gb3JkZXIgdG8gd29yayB3aXRoCi0yLjAuICBPbiBXaW5kb3dzLCBpdCdzIG5vdCBwb3NzaWJsZSBmb3IgUHl0aG9uIDIuMCB0byBpbXBvcnQgYSB0aGlyZAotcGFydHkgZXh0ZW5zaW9uIGJ1aWx0IGZvciBQeXRob24gMS41LnggZHVlIHRvIGhvdyBXaW5kb3dzIERMTHMgd29yaywKLXNvIFB5dGhvbiB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbiBhbmQgdGhlIGltcG9ydCB3aWxsIGZhaWwuCi0KLVVzZXJzIG9mIEppbSBGdWx0b24ncyBFeHRlbnNpb25DbGFzcyBtb2R1bGUgd2lsbCBiZSBwbGVhc2VkIHRvIGZpbmQKLW91dCB0aGF0IGhvb2tzIGhhdmUgYmVlbiBhZGRlZCBzbyB0aGF0IEV4dGVuc2lvbkNsYXNzZXMgYXJlIG5vdwotc3VwcG9ydGVkIGJ5IFxmdW5jdGlvbntpc2luc3RhbmNlKCl9IGFuZCBcZnVuY3Rpb257aXNzdWJjbGFzcygpfS4KLVRoaXMgbWVhbnMgeW91IG5vIGxvbmdlciBoYXZlIHRvIHJlbWVtYmVyIHRvIHdyaXRlIGNvZGUgc3VjaCBhcwotXGNvZGV7aWYgdHlwZShvYmopID09IG15RXh0ZW5zaW9uQ2xhc3N9LCBidXQgY2FuIHVzZSB0aGUgbW9yZSBuYXR1cmFsCi1cY29kZXtpZiBpc2luc3RhbmNlKG9iaiwgbXlFeHRlbnNpb25DbGFzcyl9LgotCi1UaGUgXGZpbGV7UHl0aG9uL2ltcG9ydGRsLmN9IGZpbGUsIHdoaWNoIHdhcyBhIG1hc3Mgb2YgXCNpZmRlZnMgdG8KLXN1cHBvcnQgZHluYW1pYyBsb2FkaW5nIG9uIG1hbnkgZGlmZmVyZW50IHBsYXRmb3Jtcywgd2FzIGNsZWFuZWQgdXAKLWFuZCByZW9yZ2FuaXNlZCBieSBHcmVnIFN0ZWluLiAgXGZpbGV7aW1wb3J0ZGwuY30gaXMgbm93IHF1aXRlIHNtYWxsLAotYW5kIHBsYXRmb3JtLXNwZWNpZmljIGNvZGUgaGFzIGJlZW4gbW92ZWQgaW50byBhIGJ1bmNoIG9mCi1cZmlsZXtQeXRob24vZHlubG9hZF8qLmN9IGZpbGVzLiAgQW5vdGhlciBjbGVhbnVwOiB0aGVyZSB3ZXJlIGFsc28gYQotbnVtYmVyIG9mIFxmaWxle215Ki5ofSBmaWxlcyBpbiB0aGUgSW5jbHVkZS8gZGlyZWN0b3J5IHRoYXQgaGVsZAotdmFyaW91cyBwb3J0YWJpbGl0eSBoYWNrczsgdGhleSd2ZSBiZWVuIG1lcmdlZCBpbnRvIGEgc2luZ2xlIGZpbGUsCi1cZmlsZXtJbmNsdWRlL3B5cG9ydC5ofS4KLQotVmxhZGltaXIgTWFyYW5nb3pvdidzIGxvbmctYXdhaXRlZCBtYWxsb2MgcmVzdHJ1Y3R1cmluZyB3YXMgY29tcGxldGVkLAotdG8gbWFrZSBpdCBlYXN5IHRvIGhhdmUgdGhlIFB5dGhvbiBpbnRlcnByZXRlciB1c2UgYSBjdXN0b20gYWxsb2NhdG9yCi1pbnN0ZWFkIG9mIEMncyBzdGFuZGFyZCBcZnVuY3Rpb257bWFsbG9jKCl9LiAgRm9yIGRvY3VtZW50YXRpb24sIHJlYWQKLXRoZSBjb21tZW50cyBpbiBcZmlsZXtJbmNsdWRlL3B5bWVtLmh9IGFuZAotXGZpbGV7SW5jbHVkZS9vYmppbXBsLmh9LiAgRm9yIHRoZSBsZW5ndGh5IGRpc2N1c3Npb25zIGR1cmluZyB3aGljaAotdGhlIGludGVyZmFjZSB3YXMgaGFtbWVyZWQgb3V0LCBzZWUgdGhlIFdlYiBhcmNoaXZlcyBvZiB0aGUgJ3BhdGNoZXMnCi1hbmQgJ3B5dGhvbi1kZXYnIGxpc3RzIGF0IHB5dGhvbi5vcmcuCi0KLVJlY2VudCB2ZXJzaW9ucyBvZiB0aGUgR1VTSSBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCBmb3IgTWFjT1Mgc3VwcG9ydAotUE9TSVggdGhyZWFkcy4gIFRoZXJlZm9yZSwgUHl0aG9uJ3MgUE9TSVggdGhyZWFkaW5nIHN1cHBvcnQgbm93IHdvcmtzCi1vbiB0aGUgTWFjaW50b3NoLiAgVGhyZWFkaW5nIHN1cHBvcnQgdXNpbmcgdGhlIHVzZXItc3BhY2UgR05VIFx0ZXh0dHR7cHRofQotbGlicmFyeSB3YXMgYWxzbyBjb250cmlidXRlZC4KLQotVGhyZWFkaW5nIHN1cHBvcnQgb24gV2luZG93cyB3YXMgZW5oYW5jZWQsIHRvby4gIFdpbmRvd3Mgc3VwcG9ydHMKLXRocmVhZCBsb2NrcyB0aGF0IHVzZSBrZXJuZWwgb2JqZWN0cyBvbmx5IGluIGNhc2Ugb2YgY29udGVudGlvbjsgaW4KLXRoZSBjb21tb24gY2FzZSB3aGVuIHRoZXJlJ3Mgbm8gY29udGVudGlvbiwgdGhleSB1c2Ugc2ltcGxlciBmdW5jdGlvbnMKLXdoaWNoIGFyZSBhbiBvcmRlciBvZiBtYWduaXR1ZGUgZmFzdGVyLiAgQSB0aHJlYWRlZCB2ZXJzaW9uIG9mIFB5dGhvbgotMS41LjIgb24gTlQgaXMgdHdpY2UgYXMgc2xvdyBhcyBhbiB1bnRocmVhZGVkIHZlcnNpb247IHdpdGggdGhlIDIuMAotY2hhbmdlcywgdGhlIGRpZmZlcmVuY2UgaXMgb25seSAxMFwlLiAgVGhlc2UgaW1wcm92ZW1lbnRzIHdlcmUKLWNvbnRyaWJ1dGVkIGJ5IFlha292IE1hcmtvdml0Y2guCi0KLVB5dGhvbiAyLjAncyBzb3VyY2Ugbm93IHVzZXMgb25seSBBTlNJIEMgcHJvdG90eXBlcywgc28gY29tcGlsaW5nIFB5dGhvbiBub3cKLXJlcXVpcmVzIGFuIEFOU0kgQyBjb21waWxlciwgYW5kIGNhbiBubyBsb25nZXIgYmUgZG9uZSB1c2luZyBhIGNvbXBpbGVyIHRoYXQKLW9ubHkgc3VwcG9ydHMgS1wmUiBDLiAgCi0KLVByZXZpb3VzbHkgdGhlIFB5dGhvbiB2aXJ0dWFsIG1hY2hpbmUgdXNlZCAxNi1iaXQgbnVtYmVycyBpbiBpdHMKLWJ5dGVjb2RlLCBsaW1pdGluZyB0aGUgc2l6ZSBvZiBzb3VyY2UgZmlsZXMuICBJbiBwYXJ0aWN1bGFyLCB0aGlzCi1hZmZlY3RlZCB0aGUgbWF4aW11bSBzaXplIG9mIGxpdGVyYWwgbGlzdHMgYW5kIGRpY3Rpb25hcmllcyBpbiBQeXRob24KLXNvdXJjZTsgb2NjYXNpb25hbGx5IHBlb3BsZSB3aG8gYXJlIGdlbmVyYXRpbmcgUHl0aG9uIGNvZGUgd291bGQgcnVuCi1pbnRvIHRoaXMgbGltaXQuICBBIHBhdGNoIGJ5IENoYXJsZXMgRy4gV2FsZG1hbiByYWlzZXMgdGhlIGxpbWl0IGZyb20KLVx2ZXJifDJeMTZ8IHRvIFx2ZXJifDJeezMyfXwuCi0KLVRocmVlIG5ldyBjb252ZW5pZW5jZSBmdW5jdGlvbnMgaW50ZW5kZWQgZm9yIGFkZGluZyBjb25zdGFudHMgdG8gYQotbW9kdWxlJ3MgZGljdGlvbmFyeSBhdCBtb2R1bGUgaW5pdGlhbGl6YXRpb24gdGltZSB3ZXJlIGFkZGVkOgotXGZ1bmN0aW9ue1B5TW9kdWxlX0FkZE9iamVjdCgpfSwgXGZ1bmN0aW9ue1B5TW9kdWxlX0FkZEludENvbnN0YW50KCl9LAotYW5kIFxmdW5jdGlvbntQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudCgpfS4gIEVhY2ggb2YgdGhlc2UgZnVuY3Rpb25zCi10YWtlcyBhIG1vZHVsZSBvYmplY3QsIGEgbnVsbC10ZXJtaW5hdGVkIEMgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUKLXRvIGJlIGFkZGVkLCBhbmQgYSB0aGlyZCBhcmd1bWVudCBmb3IgdGhlIHZhbHVlIHRvIGJlIGFzc2lnbmVkIHRvIHRoZQotbmFtZS4gIFRoaXMgdGhpcmQgYXJndW1lbnQgaXMsIHJlc3BlY3RpdmVseSwgYSBQeXRob24gb2JqZWN0LCBhIEMKLWxvbmcsIG9yIGEgQyBzdHJpbmcuCi0KLUEgd3JhcHBlciBBUEkgd2FzIGFkZGVkIGZvciBcVU5JWC1zdHlsZSBzaWduYWwgaGFuZGxlcnMuCi1cZnVuY3Rpb257UHlPU19nZXRzaWcoKX0gZ2V0cyBhIHNpZ25hbCBoYW5kbGVyIGFuZAotXGZ1bmN0aW9ue1B5T1Nfc2V0c2lnKCl9IHdpbGwgc2V0IGEgbmV3IGhhbmRsZXIuCi0KLSUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257RGlzdHV0aWxzOiBNYWtpbmcgTW9kdWxlcyBFYXN5IHRvIEluc3RhbGx9Ci0KLUJlZm9yZSBQeXRob24gMi4wLCBpbnN0YWxsaW5nIG1vZHVsZXMgd2FzIGEgdGVkaW91cyBhZmZhaXIgLS0gdGhlcmUKLXdhcyBubyB3YXkgdG8gZmlndXJlIG91dCBhdXRvbWF0aWNhbGx5IHdoZXJlIFB5dGhvbiBpcyBpbnN0YWxsZWQsIG9yCi13aGF0IGNvbXBpbGVyIG9wdGlvbnMgdG8gdXNlIGZvciBleHRlbnNpb24gbW9kdWxlcy4gIFNvZnR3YXJlIGF1dGhvcnMKLWhhZCB0byBnbyB0aHJvdWdoIGFuIGFyZHVvdXMgcml0dWFsIG9mIGVkaXRpbmcgTWFrZWZpbGVzIGFuZAotY29uZmlndXJhdGlvbiBmaWxlcywgd2hpY2ggb25seSByZWFsbHkgd29yayBvbiBcVU5JWHt9IGFuZCBsZWF2ZSBXaW5kb3dzCi1hbmQgTWFjT1MgdW5zdXBwb3J0ZWQuICBQeXRob24gdXNlcnMgZmFjZWQgd2lsZGx5IGRpZmZlcmluZwotaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyB3aGljaCB2YXJpZWQgYmV0d2VlbiBkaWZmZXJlbnQgZXh0ZW5zaW9uCi1wYWNrYWdlcywgd2hpY2ggbWFkZSBhZG1pbmlzdGVyaW5nIGEgUHl0aG9uIGluc3RhbGxhdGlvbiBzb21ldGhpbmcgb2YgCi1hIGNob3JlLgotCi1UaGUgU0lHIGZvciBkaXN0cmlidXRpb24gdXRpbGl0aWVzLCBzaGVwaGVyZGVkIGJ5IEdyZWcgV2FyZCwgaGFzCi1jcmVhdGVkIHRoZSBEaXN0dXRpbHMsIGEgc3lzdGVtIHRvIG1ha2UgcGFja2FnZSBpbnN0YWxsYXRpb24gbXVjaAotZWFzaWVyLiAgVGhleSBmb3JtIHRoZSBcbW9kdWxle2Rpc3R1dGlsc30gcGFja2FnZSwgYSBuZXcgcGFydCBvZgotUHl0aG9uJ3Mgc3RhbmRhcmQgbGlicmFyeS4gSW4gdGhlIGJlc3QgY2FzZSwgaW5zdGFsbGluZyBhIFB5dGhvbgotbW9kdWxlIGZyb20gc291cmNlIHdpbGwgcmVxdWlyZSB0aGUgc2FtZSBzdGVwczogZmlyc3QgeW91IHNpbXBseSBtZWFuCi11bnBhY2sgdGhlIHRhcmJhbGwgb3IgemlwIGFyY2hpdmUsIGFuZCB0aGUgcnVuIGBgXGNvZGV7cHl0aG9uIHNldHVwLnB5Ci1pbnN0YWxsfScnLiAgVGhlIHBsYXRmb3JtIHdpbGwgYmUgYXV0b21hdGljYWxseSBkZXRlY3RlZCwgdGhlIGNvbXBpbGVyCi13aWxsIGJlIHJlY29nbml6ZWQsIEMgZXh0ZW5zaW9uIG1vZHVsZXMgd2lsbCBiZSBjb21waWxlZCwgYW5kIHRoZQotZGlzdHJpYnV0aW9uIGluc3RhbGxlZCBpbnRvIHRoZSBwcm9wZXIgZGlyZWN0b3J5LiAgT3B0aW9uYWwKLWNvbW1hbmQtbGluZSBhcmd1bWVudHMgcHJvdmlkZSBtb3JlIGNvbnRyb2wgb3ZlciB0aGUgaW5zdGFsbGF0aW9uCi1wcm9jZXNzLCB0aGUgZGlzdHV0aWxzIHBhY2thZ2Ugb2ZmZXJzIG1hbnkgcGxhY2VzIHRvIG92ZXJyaWRlIGRlZmF1bHRzCi0tLSBzZXBhcmF0aW5nIHRoZSBidWlsZCBmcm9tIHRoZSBpbnN0YWxsLCBidWlsZGluZyBvciBpbnN0YWxsaW5nIGluCi1ub24tZGVmYXVsdCBkaXJlY3RvcmllcywgYW5kIG1vcmUuCi0KLUluIG9yZGVyIHRvIHVzZSB0aGUgRGlzdHV0aWxzLCB5b3UgbmVlZCB0byB3cml0ZSBhIFxmaWxle3NldHVwLnB5fQotc2NyaXB0LiAgRm9yIHRoZSBzaW1wbGUgY2FzZSwgd2hlbiB0aGUgc29mdHdhcmUgY29udGFpbnMgb25seSAucHkKLWZpbGVzLCBhIG1pbmltYWwgXGZpbGV7c2V0dXAucHl9IGNhbiBiZSBqdXN0IGEgZmV3IGxpbmVzIGxvbmc6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IHNldHVwCi1zZXR1cCAobmFtZSA9ICJmb28iLCB2ZXJzaW9uID0gIjEuMCIsIAotICAgICAgIHB5X21vZHVsZXMgPSBbIm1vZHVsZTEiLCAibW9kdWxlMiJdKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIFxmaWxle3NldHVwLnB5fSBmaWxlIGlzbid0IG11Y2ggbW9yZSBjb21wbGljYXRlZCBpZiB0aGUgc29mdHdhcmUKLWNvbnNpc3RzIG9mIGEgZmV3IHBhY2thZ2VzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1mcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBzZXR1cAotc2V0dXAgKG5hbWUgPSAiZm9vIiwgdmVyc2lvbiA9ICIxLjAiLCAKLSAgICAgICBwYWNrYWdlcyA9IFsicGFja2FnZSIsICJwYWNrYWdlLnN1YnBhY2thZ2UiXSkKLVxlbmR7dmVyYmF0aW19Ci0KLUEgQyBleHRlbnNpb24gY2FuIGJlIHRoZSBtb3N0IGNvbXBsaWNhdGVkIGNhc2U7IGhlcmUncyBhbiBleGFtcGxlIHRha2VuIGZyb20gCi10aGUgUHlYTUwgcGFja2FnZToKLQotCi1cYmVnaW57dmVyYmF0aW19Ci1mcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBzZXR1cCwgRXh0ZW5zaW9uCi0KLWV4cGF0X2V4dGVuc2lvbiA9IEV4dGVuc2lvbigneG1sLnBhcnNlcnMucHlleHBhdCcsCi0JZGVmaW5lX21hY3JvcyA9IFsoJ1hNTF9OUycsIE5vbmUpXSwKLQlpbmNsdWRlX2RpcnMgPSBbICdleHRlbnNpb25zL2V4cGF0L3htbHRvaycsCi0JICAgICAgICAgICAgICAgICAnZXh0ZW5zaW9ucy9leHBhdC94bWxwYXJzZScgXSwKLQlzb3VyY2VzID0gWyAnZXh0ZW5zaW9ucy9weWV4cGF0LmMnLAotCSAgICAgICAgICAgICdleHRlbnNpb25zL2V4cGF0L3htbHRvay94bWx0b2suYycsCi0gCQkgICAgJ2V4dGVuc2lvbnMvZXhwYXQveG1sdG9rL3htbHJvbGUuYycsCi0gICAgICAgICAgICAgICAgICBdCi0gICAgICAgKQotc2V0dXAgKG5hbWUgPSAiUHlYTUwiLCB2ZXJzaW9uID0gIjAuNS40IiwgCi0gICAgICAgZXh0X21vZHVsZXMgPVsgZXhwYXRfZXh0ZW5zaW9uIF0gKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIERpc3R1dGlscyBjYW4gYWxzbyB0YWtlIGNhcmUgb2YgY3JlYXRpbmcgc291cmNlIGFuZCBiaW5hcnkKLWRpc3RyaWJ1dGlvbnMuICBUaGUgYGBzZGlzdCcnIGNvbW1hbmQsIHJ1biBieSBgYFxjb2Rle3B5dGhvbiBzZXR1cC5weQotc2Rpc3R9JywgYnVpbGRzIGEgc291cmNlIGRpc3RyaWJ1dGlvbiBzdWNoIGFzIFxmaWxle2Zvby0xLjAudGFyLmd6fS4KLUFkZGluZyBuZXcgY29tbWFuZHMgaXNuJ3QgZGlmZmljdWx0LCBgYGJkaXN0X3JwbScnIGFuZAotYGBiZGlzdF93aW5pbnN0JycgY29tbWFuZHMgaGF2ZSBhbHJlYWR5IGJlZW4gY29udHJpYnV0ZWQgdG8gY3JlYXRlIGFuCi1SUE0gZGlzdHJpYnV0aW9uIGFuZCBhIFdpbmRvd3MgaW5zdGFsbGVyIGZvciB0aGUgc29mdHdhcmUsCi1yZXNwZWN0aXZlbHkuICBDb21tYW5kcyB0byBjcmVhdGUgb3RoZXIgZGlzdHJpYnV0aW9uIGZvcm1hdHMgc3VjaCBhcwotRGViaWFuIHBhY2thZ2VzIGFuZCBTb2xhcmlzIFxmaWxley5wa2d9IGZpbGVzIGFyZSBpbiB2YXJpb3VzIHN0YWdlcyBvZgotZGV2ZWxvcG1lbnQuCi0KLUFsbCB0aGlzIGlzIGRvY3VtZW50ZWQgaW4gYSBuZXcgbWFudWFsLCBcdGV4dGl0e0Rpc3RyaWJ1dGluZyBQeXRob24KLU1vZHVsZXN9LCB0aGF0IGpvaW5zIHRoZSBiYXNpYyBzZXQgb2YgUHl0aG9uIGRvY3VtZW50YXRpb24uCi0KLSUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257WE1MIE1vZHVsZXN9Ci0KLVB5dGhvbiAxLjUuMiBpbmNsdWRlZCBhIHNpbXBsZSBYTUwgcGFyc2VyIGluIHRoZSBmb3JtIG9mIHRoZQotXG1vZHVsZXt4bWxsaWJ9IG1vZHVsZSwgY29udHJpYnV0ZWQgYnkgU2pvZXJkIE11bGxlbmRlci4gIFNpbmNlCi0xLjUuMidzIHJlbGVhc2UsIHR3byBkaWZmZXJlbnQgaW50ZXJmYWNlcyBmb3IgcHJvY2Vzc2luZyBYTUwgaGF2ZQotYmVjb21lIGNvbW1vbjogU0FYMiAodmVyc2lvbiAyIG9mIHRoZSBTaW1wbGUgQVBJIGZvciBYTUwpIHByb3ZpZGVzIGFuCi1ldmVudC1kcml2ZW4gaW50ZXJmYWNlIHdpdGggc29tZSBzaW1pbGFyaXRpZXMgdG8gXG1vZHVsZXt4bWxsaWJ9LCBhbmQKLXRoZSBET00gKERvY3VtZW50IE9iamVjdCBNb2RlbCkgcHJvdmlkZXMgYSB0cmVlLWJhc2VkIGludGVyZmFjZSwKLXRyYW5zZm9ybWluZyBhbiBYTUwgZG9jdW1lbnQgaW50byBhIHRyZWUgb2Ygbm9kZXMgdGhhdCBjYW4gYmUKLXRyYXZlcnNlZCBhbmQgbW9kaWZpZWQuICBQeXRob24gMi4wIGluY2x1ZGVzIGEgU0FYMiBpbnRlcmZhY2UgYW5kIGEKLXN0cmlwcGVkLWRvd24gRE9NIGludGVyZmFjZSBhcyBwYXJ0IG9mIHRoZSBcbW9kdWxle3htbH0gcGFja2FnZS4KLUhlcmUgd2Ugd2lsbCBnaXZlIGEgYnJpZWYgb3ZlcnZpZXcgb2YgdGhlc2UgbmV3IGludGVyZmFjZXM7IGNvbnN1bHQKLXRoZSBQeXRob24gZG9jdW1lbnRhdGlvbiBvciB0aGUgc291cmNlIGNvZGUgZm9yIGNvbXBsZXRlIGRldGFpbHMuCi1UaGUgUHl0aG9uIFhNTCBTSUcgaXMgYWxzbyB3b3JraW5nIG9uIGltcHJvdmVkIGRvY3VtZW50YXRpb24uCi0KLVxzdWJzZWN0aW9ue1NBWDIgU3VwcG9ydH0KLQotU0FYIGRlZmluZXMgYW4gZXZlbnQtZHJpdmVuIGludGVyZmFjZSBmb3IgcGFyc2luZyBYTUwuICBUbyB1c2UgU0FYLAoteW91IG11c3Qgd3JpdGUgYSBTQVggaGFuZGxlciBjbGFzcy4gIEhhbmRsZXIgY2xhc3NlcyBpbmhlcml0IGZyb20KLXZhcmlvdXMgY2xhc3NlcyBwcm92aWRlZCBieSBTQVgsIGFuZCBvdmVycmlkZSB2YXJpb3VzIG1ldGhvZHMgdGhhdAotd2lsbCB0aGVuIGJlIGNhbGxlZCBieSB0aGUgWE1MIHBhcnNlci4gIEZvciBleGFtcGxlLCB0aGUKLVxtZXRob2R7c3RhcnRFbGVtZW50fSBhbmQgXG1ldGhvZHtlbmRFbGVtZW50fSBtZXRob2RzIGFyZSBjYWxsZWQgZm9yCi1ldmVyeSBzdGFydGluZyBhbmQgZW5kIHRhZyBlbmNvdW50ZXJlZCBieSB0aGUgcGFyc2VyLCB0aGUKLVxtZXRob2R7Y2hhcmFjdGVycygpfSBtZXRob2QgaXMgY2FsbGVkIGZvciBldmVyeSBjaHVuayBvZiBjaGFyYWN0ZXIKLWRhdGEsIGFuZCBzbyBmb3J0aC4KLQotVGhlIGFkdmFudGFnZSBvZiB0aGUgZXZlbnQtZHJpdmVuIGFwcHJvYWNoIGlzIHRoYXQgdGhlIHdob2xlCi1kb2N1bWVudCBkb2Vzbid0IGhhdmUgdG8gYmUgcmVzaWRlbnQgaW4gbWVtb3J5IGF0IGFueSBvbmUgdGltZSwgd2hpY2gKLW1hdHRlcnMgaWYgeW91IGFyZSBwcm9jZXNzaW5nIHJlYWxseSBodWdlIGRvY3VtZW50cy4gIEhvd2V2ZXIsIHdyaXRpbmcKLXRoZSBTQVggaGFuZGxlciBjbGFzcyBjYW4gZ2V0IHZlcnkgY29tcGxpY2F0ZWQgaWYgeW91J3JlIHRyeWluZyB0bwotbW9kaWZ5IHRoZSBkb2N1bWVudCBzdHJ1Y3R1cmUgaW4gc29tZSBlbGFib3JhdGUgd2F5LgotCi1Gb3IgZXhhbXBsZSwgdGhpcyBsaXR0bGUgZXhhbXBsZSBwcm9ncmFtIGRlZmluZXMgYSBoYW5kbGVyIHRoYXQgcHJpbnRzCi1hIG1lc3NhZ2UgZm9yIGV2ZXJ5IHN0YXJ0aW5nIGFuZCBlbmRpbmcgdGFnLCBhbmQgdGhlbiBwYXJzZXMgdGhlIGZpbGUKLVxmaWxle2hhbWxldC54bWx9IHVzaW5nIGl0OgotCi1cYmVnaW57dmVyYmF0aW19Ci1mcm9tIHhtbCBpbXBvcnQgc2F4Ci0KLWNsYXNzIFNpbXBsZUhhbmRsZXIoc2F4LkNvbnRlbnRIYW5kbGVyKToKLSAgICBkZWYgc3RhcnRFbGVtZW50KHNlbGYsIG5hbWUsIGF0dHJzKToKLSAgICAgICAgcHJpbnQgJ1N0YXJ0IG9mIGVsZW1lbnQ6JywgbmFtZSwgYXR0cnMua2V5cygpCi0KLSAgICBkZWYgZW5kRWxlbWVudChzZWxmLCBuYW1lKToKLSAgICAgICAgcHJpbnQgJ0VuZCBvZiBlbGVtZW50OicsIG5hbWUKLQotIyBDcmVhdGUgYSBwYXJzZXIgb2JqZWN0Ci1wYXJzZXIgPSBzYXgubWFrZV9wYXJzZXIoKQotCi0jIFRlbGwgaXQgd2hhdCBoYW5kbGVyIHRvIHVzZQotaGFuZGxlciA9IFNpbXBsZUhhbmRsZXIoKQotcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKCBoYW5kbGVyICkKLQotIyBQYXJzZSBhIGZpbGUhCi1wYXJzZXIucGFyc2UoICdoYW1sZXQueG1sJyApCi1cZW5ke3ZlcmJhdGltfQotCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgY29uc3VsdCB0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24sIG9yIHRoZSBYTUwKLUhPV1RPIGF0IFx1cmx7aHR0cDovL3B5eG1sLnNvdXJjZWZvcmdlLm5ldC90b3BpY3MvaG93dG8veG1sLWhvd3RvLmh0bWx9LgotCi1cc3Vic2VjdGlvbntET00gU3VwcG9ydH0KLQotVGhlIERvY3VtZW50IE9iamVjdCBNb2RlbCBpcyBhIHRyZWUtYmFzZWQgcmVwcmVzZW50YXRpb24gZm9yIGFuIFhNTAotZG9jdW1lbnQuICBBIHRvcC1sZXZlbCBcY2xhc3N7RG9jdW1lbnR9IGluc3RhbmNlIGlzIHRoZSByb290IG9mIHRoZQotdHJlZSwgYW5kIGhhcyBhIHNpbmdsZSBjaGlsZCB3aGljaCBpcyB0aGUgdG9wLWxldmVsIFxjbGFzc3tFbGVtZW50fQotaW5zdGFuY2UuIFRoaXMgXGNsYXNze0VsZW1lbnR9IGhhcyBjaGlsZHJlbiBub2RlcyByZXByZXNlbnRpbmcKLWNoYXJhY3RlciBkYXRhIGFuZCBhbnkgc3ViLWVsZW1lbnRzLCB3aGljaCBtYXkgaGF2ZSBmdXJ0aGVyIGNoaWxkcmVuCi1vZiB0aGVpciBvd24sIGFuZCBzbyBmb3J0aC4gIFVzaW5nIHRoZSBET00geW91IGNhbiB0cmF2ZXJzZSB0aGUKLXJlc3VsdGluZyB0cmVlIGFueSB3YXkgeW91IGxpa2UsIGFjY2VzcyBlbGVtZW50IGFuZCBhdHRyaWJ1dGUgdmFsdWVzLAotaW5zZXJ0IGFuZCBkZWxldGUgbm9kZXMsIGFuZCBjb252ZXJ0IHRoZSB0cmVlIGJhY2sgaW50byBYTUwuCi0KLVRoZSBET00gaXMgdXNlZnVsIGZvciBtb2RpZnlpbmcgWE1MIGRvY3VtZW50cywgYmVjYXVzZSB5b3UgY2FuIGNyZWF0ZQotYSBET00gdHJlZSwgbW9kaWZ5IGl0IGJ5IGFkZGluZyBuZXcgbm9kZXMgb3IgcmVhcnJhbmdpbmcgc3VidHJlZXMsIGFuZAotdGhlbiBwcm9kdWNlIGEgbmV3IFhNTCBkb2N1bWVudCBhcyBvdXRwdXQuICBZb3UgY2FuIGFsc28gY29uc3RydWN0IGEKLURPTSB0cmVlIG1hbnVhbGx5IGFuZCBjb252ZXJ0IGl0IHRvIFhNTCwgd2hpY2ggY2FuIGJlIGEgbW9yZSBmbGV4aWJsZQotd2F5IG9mIHByb2R1Y2luZyBYTUwgb3V0cHV0IHRoYW4gc2ltcGx5IHdyaXRpbmcKLVxjb2Rlezx0YWcxPn0uLi5cY29kZXs8L3RhZzE+fSB0byBhIGZpbGUuCi0KLVRoZSBET00gaW1wbGVtZW50YXRpb24gaW5jbHVkZWQgd2l0aCBQeXRob24gbGl2ZXMgaW4gdGhlCi1cbW9kdWxle3htbC5kb20ubWluaWRvbX0gbW9kdWxlLiAgSXQncyBhIGxpZ2h0d2VpZ2h0IGltcGxlbWVudGF0aW9uIG9mCi10aGUgTGV2ZWwgMSBET00gd2l0aCBzdXBwb3J0IGZvciBYTUwgbmFtZXNwYWNlcy4gIFRoZSAKLVxmdW5jdGlvbntwYXJzZSgpfSBhbmQgXGZ1bmN0aW9ue3BhcnNlU3RyaW5nKCl9IGNvbnZlbmllbmNlCi1mdW5jdGlvbnMgYXJlIHByb3ZpZGVkIGZvciBnZW5lcmF0aW5nIGEgRE9NIHRyZWU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWZyb20geG1sLmRvbSBpbXBvcnQgbWluaWRvbQotZG9jID0gbWluaWRvbS5wYXJzZSgnaGFtbGV0LnhtbCcpCi1cZW5ke3ZlcmJhdGltfQotCi1cY29kZXtkb2N9IGlzIGEgXGNsYXNze0RvY3VtZW50fSBpbnN0YW5jZS4gIFxjbGFzc3tEb2N1bWVudH0sIGxpa2UgYWxsCi10aGUgb3RoZXIgRE9NIGNsYXNzZXMgc3VjaCBhcyBcY2xhc3N7RWxlbWVudH0gYW5kIFxjbGFzc3tUZXh0fSwgaXMgYQotc3ViY2xhc3Mgb2YgdGhlIFxjbGFzc3tOb2RlfSBiYXNlIGNsYXNzLiAgQWxsIHRoZSBub2RlcyBpbiBhIERPTSB0cmVlCi10aGVyZWZvcmUgc3VwcG9ydCBjZXJ0YWluIGNvbW1vbiBtZXRob2RzLCBzdWNoIGFzIFxtZXRob2R7dG94bWwoKX0KLXdoaWNoIHJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBub2RlCi1hbmQgaXRzIGNoaWxkcmVuLiAgRWFjaCBjbGFzcyBhbHNvIGhhcyBzcGVjaWFsIG1ldGhvZHMgb2YgaXRzIG93bjsgZm9yCi1leGFtcGxlLCBcY2xhc3N7RWxlbWVudH0gYW5kIFxjbGFzc3tEb2N1bWVudH0gaW5zdGFuY2VzIGhhdmUgYSBtZXRob2QKLXRvIGZpbmQgYWxsIGNoaWxkIGVsZW1lbnRzIHdpdGggYSBnaXZlbiB0YWcgbmFtZS4gIENvbnRpbnVpbmcgZnJvbSB0aGUKLXByZXZpb3VzIDItbGluZSBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1wZXJzbGlzdCA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSggJ1BFUlNPTkEnICkKLXByaW50IHBlcnNsaXN0WzBdLnRveG1sKCkKLXByaW50IHBlcnNsaXN0WzFdLnRveG1sKCkKLVxlbmR7dmVyYmF0aW19Ci0KLUZvciB0aGUgXHRleHRpdHtIYW1sZXR9IFhNTCBmaWxlLCB0aGUgYWJvdmUgZmV3IGxpbmVzIG91dHB1dDoKLQotXGJlZ2lue3ZlcmJhdGltfQotPFBFUlNPTkE+Q0xBVURJVVMsIGtpbmcgb2YgRGVubWFyay4gPC9QRVJTT05BPgotPFBFUlNPTkE+SEFNTEVULCBzb24gdG8gdGhlIGxhdGUsIGFuZCBuZXBoZXcgdG8gdGhlIHByZXNlbnQga2luZy48L1BFUlNPTkE+Ci1cZW5ke3ZlcmJhdGltfQotCi1UaGUgcm9vdCBlbGVtZW50IG9mIHRoZSBkb2N1bWVudCBpcyBhdmFpbGFibGUgYXMKLVxjb2Rle2RvYy5kb2N1bWVudEVsZW1lbnR9LCBhbmQgaXRzIGNoaWxkcmVuIGNhbiBiZSBlYXNpbHkgbW9kaWZpZWQKLWJ5IGRlbGV0aW5nLCBhZGRpbmcsIG9yIHJlbW92aW5nIG5vZGVzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1yb290ID0gZG9jLmRvY3VtZW50RWxlbWVudAotCi0jIFJlbW92ZSB0aGUgZmlyc3QgY2hpbGQKLXJvb3QucmVtb3ZlQ2hpbGQoIHJvb3QuY2hpbGROb2Rlc1swXSApCi0KLSMgTW92ZSB0aGUgbmV3IGZpcnN0IGNoaWxkIHRvIHRoZSBlbmQKLXJvb3QuYXBwZW5kQ2hpbGQoIHJvb3QuY2hpbGROb2Rlc1swXSApCi0KLSMgSW5zZXJ0IHRoZSBuZXcgZmlyc3QgY2hpbGQgKG9yaWdpbmFsbHksCi0jIHRoZSB0aGlyZCBjaGlsZCkgYmVmb3JlIHRoZSAyMHRoIGNoaWxkLgotcm9vdC5pbnNlcnRCZWZvcmUoIHJvb3QuY2hpbGROb2Rlc1swXSwgcm9vdC5jaGlsZE5vZGVzWzIwXSApCi1cZW5ke3ZlcmJhdGltfQotCi1BZ2FpbiwgSSB3aWxsIHJlZmVyIHlvdSB0byB0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24gZm9yIGEgY29tcGxldGUKLWxpc3Rpbmcgb2YgdGhlIGRpZmZlcmVudCBcY2xhc3N7Tm9kZX0gY2xhc3NlcyBhbmQgdGhlaXIgdmFyaW91cyBtZXRob2RzLgotCi1cc3Vic2VjdGlvbntSZWxhdGlvbnNoaXAgdG8gUHlYTUx9Ci0KLVRoZSBYTUwgU3BlY2lhbCBJbnRlcmVzdCBHcm91cCBoYXMgYmVlbiB3b3JraW5nIG9uIFhNTC1yZWxhdGVkIFB5dGhvbgotY29kZSBmb3IgYSB3aGlsZS4gIEl0cyBjb2RlIGRpc3RyaWJ1dGlvbiwgY2FsbGVkIFB5WE1MLCBpcyBhdmFpbGFibGUKLWZyb20gdGhlIFNJRydzIFdlYiBwYWdlcyBhdCBcdXJse2h0dHA6Ly93d3cucHl0aG9uLm9yZy9zaWdzL3htbC1zaWcvfS4KLVRoZSBQeVhNTCBkaXN0cmlidXRpb24gYWxzbyB1c2VkIHRoZSBwYWNrYWdlIG5hbWUgXHNhbXB7eG1sfS4gIElmCi15b3UndmUgd3JpdHRlbiBwcm9ncmFtcyB0aGF0IHVzZWQgUHlYTUwsIHlvdSdyZSBwcm9iYWJseSB3b25kZXJpbmcKLWFib3V0IGl0cyBjb21wYXRpYmlsaXR5IHdpdGggdGhlIDIuMCBcbW9kdWxle3htbH0gcGFja2FnZS4KLQotVGhlIGFuc3dlciBpcyB0aGF0IFB5dGhvbiAyLjAncyBcbW9kdWxle3htbH0gcGFja2FnZSBpc24ndCBjb21wYXRpYmxlCi13aXRoIFB5WE1MLCBidXQgY2FuIGJlIG1hZGUgY29tcGF0aWJsZSBieSBpbnN0YWxsaW5nIGEgcmVjZW50IHZlcnNpb24KLVB5WE1MLiAgTWFueSBhcHBsaWNhdGlvbnMgY2FuIGdldCBieSB3aXRoIHRoZSBYTUwgc3VwcG9ydCB0aGF0IGlzCi1pbmNsdWRlZCB3aXRoIFB5dGhvbiAyLjAsIGJ1dCBtb3JlIGNvbXBsaWNhdGVkIGFwcGxpY2F0aW9ucyB3aWxsCi1yZXF1aXJlIHRoYXQgdGhlIGZ1bGwgUHlYTUwgcGFja2FnZSB3aWxsIGJlIGluc3RhbGxlZC4gIFdoZW4KLWluc3RhbGxlZCwgUHlYTUwgdmVyc2lvbnMgMC42LjAgb3IgZ3JlYXRlciB3aWxsIHJlcGxhY2UgdGhlCi1cbW9kdWxle3htbH0gcGFja2FnZSBzaGlwcGVkIHdpdGggUHl0aG9uLCBhbmQgd2lsbCBiZSBhIHN0cmljdAotc3VwZXJzZXQgb2YgdGhlIHN0YW5kYXJkIHBhY2thZ2UsIGFkZGluZyBhIGJ1bmNoIG9mIGFkZGl0aW9uYWwKLWZlYXR1cmVzLiAgU29tZSBvZiB0aGUgYWRkaXRpb25hbCBmZWF0dXJlcyBpbiBQeVhNTCBpbmNsdWRlOgotCi1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtIDRET00sIGEgZnVsbCBET00gaW1wbGVtZW50YXRpb24KLWZyb20gRm91clRob3VnaHQsIEluYy4KLVxpdGVtIFRoZSB4bWxwcm9jIHZhbGlkYXRpbmcgcGFyc2VyLCB3cml0dGVuIGJ5IExhcnMgTWFyaXVzIEdhcnNob2wuCi1caXRlbSBUaGUgXG1vZHVsZXtzZ21sb3B9IHBhcnNlciBhY2NlbGVyYXRvciBtb2R1bGUsIHdyaXR0ZW4gYnkgRnJlZHJpayBMdW5kaC4KLVxlbmR7aXRlbWl6ZX0KLQotJSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntNb2R1bGUgY2hhbmdlc30KLQotTG90cyBvZiBpbXByb3ZlbWVudHMgYW5kIGJ1Z2ZpeGVzIHdlcmUgbWFkZSB0byBQeXRob24ncyBleHRlbnNpdmUKLXN0YW5kYXJkIGxpYnJhcnk7IHNvbWUgb2YgdGhlIGFmZmVjdGVkIG1vZHVsZXMgaW5jbHVkZQotXG1vZHVsZXtyZWFkbGluZX0sIFxtb2R1bGV7Q29uZmlnUGFyc2VyfSwgXG1vZHVsZXtjZ2l9LAotXG1vZHVsZXtjYWxlbmRhcn0sIFxtb2R1bGV7cG9zaXh9LCBcbW9kdWxle3JlYWRsaW5lfSwgXG1vZHVsZXt4bWxsaWJ9LAotXG1vZHVsZXthaWZjfSwgXG1vZHVsZXtjaHVuaywgd2F2ZX0sIFxtb2R1bGV7cmFuZG9tfSwgXG1vZHVsZXtzaGVsdmV9LAotYW5kIFxtb2R1bGV7bm50cGxpYn0uICBDb25zdWx0IHRoZSBDVlMgbG9ncyBmb3IgdGhlIGV4YWN0Ci1wYXRjaC1ieS1wYXRjaCBkZXRhaWxzLiAgCi0KLUJyaWFuIEdhbGxldyBjb250cmlidXRlZCBPcGVuU1NMIHN1cHBvcnQgZm9yIHRoZSBcbW9kdWxle3NvY2tldH0KLW1vZHVsZS4gIE9wZW5TU0wgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFNlY3VyZSBTb2NrZXQgTGF5ZXIsCi13aGljaCBlbmNyeXB0cyB0aGUgZGF0YSBiZWluZyBzZW50IG92ZXIgYSBzb2NrZXQuICBXaGVuIGNvbXBpbGluZwotUHl0aG9uLCB5b3UgY2FuIGVkaXQgXGZpbGV7TW9kdWxlcy9TZXR1cH0gdG8gaW5jbHVkZSBTU0wgc3VwcG9ydCwKLXdoaWNoIGFkZHMgYW4gYWRkaXRpb25hbCBmdW5jdGlvbiB0byB0aGUgXG1vZHVsZXtzb2NrZXR9IG1vZHVsZToKLVxmdW5jdGlvbntzb2NrZXQuc3NsKFx2YXJ7c29ja2V0fSwgXHZhcntrZXlmaWxlfSwgXHZhcntjZXJ0ZmlsZX0pfSwKLXdoaWNoIHRha2VzIGEgc29ja2V0IG9iamVjdCBhbmQgcmV0dXJucyBhbiBTU0wgc29ja2V0LiAgVGhlCi1cbW9kdWxle2h0dHBsaWJ9IGFuZCBcbW9kdWxle3VybGxpYn0gbW9kdWxlcyB3ZXJlIGFsc28gY2hhbmdlZCB0bwotc3VwcG9ydCBgYGh0dHBzOi8vJycgVVJMcywgdGhvdWdoIG5vIG9uZSBoYXMgaW1wbGVtZW50ZWQgRlRQIG9yIFNNVFAKLW92ZXIgU1NMLiAgCi0KLVRoZSBcbW9kdWxle2h0dHBsaWJ9IG1vZHVsZSBoYXMgYmVlbiByZXdyaXR0ZW4gYnkgR3JlZyBTdGVpbiB0bwotc3VwcG9ydCBIVFRQLzEuMS4gIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgMS41IHZlcnNpb24gb2YKLVxtb2R1bGV7aHR0cGxpYn0gaXMgcHJvdmlkZWQsIHRob3VnaCB1c2luZyBIVFRQLzEuMSBmZWF0dXJlcyBzdWNoIGFzCi1waXBlbGluaW5nIHdpbGwgcmVxdWlyZSByZXdyaXRpbmcgY29kZSB0byB1c2UgYSBkaWZmZXJlbnQgc2V0IG9mCi1pbnRlcmZhY2VzLgotCi1UaGUgXG1vZHVsZXtUa2ludGVyfSBtb2R1bGUgbm93IHN1cHBvcnRzIFRjbC9UayB2ZXJzaW9uIDguMSwgOC4yLCBvcgotOC4zLCBhbmQgc3VwcG9ydCBmb3IgdGhlIG9sZGVyIDcueCB2ZXJzaW9ucyBoYXMgYmVlbiBkcm9wcGVkLiAgVGhlCi1Ua2ludGVyIG1vZHVsZSBub3cgc3VwcG9ydHMgZGlzcGxheWluZyBVbmljb2RlIHN0cmluZ3MgaW4gVGsgd2lkZ2V0cy4KLUFsc28sIEZyZWRyaWsgTHVuZGggY29udHJpYnV0ZWQgYW4gb3B0aW1pemF0aW9uIHdoaWNoIG1ha2VzIG9wZXJhdGlvbnMKLWxpa2UgXGNvZGV7Y3JlYXRlX2xpbmV9IGFuZCBcY29kZXtjcmVhdGVfcG9seWdvbn0gbXVjaCBmYXN0ZXIsCi1lc3BlY2lhbGx5IHdoZW4gdXNpbmcgbG90cyBvZiBjb29yZGluYXRlcy4KLQotVGhlIFxtb2R1bGV7Y3Vyc2VzfSBtb2R1bGUgaGFzIGJlZW4gZ3JlYXRseSBleHRlbmRlZCwgc3RhcnRpbmcgZnJvbQotT2xpdmVyIEFuZHJpY2gncyBlbmhhbmNlZCB2ZXJzaW9uLCB0byBwcm92aWRlIG1hbnkgYWRkaXRpb25hbAotZnVuY3Rpb25zIGZyb20gbmN1cnNlcyBhbmQgU1lTViBjdXJzZXMsIHN1Y2ggYXMgY29sb3VyLCBhbHRlcm5hdGl2ZQotY2hhcmFjdGVyIHNldCBzdXBwb3J0LCBwYWRzLCBhbmQgbW91c2Ugc3VwcG9ydC4gIFRoaXMgbWVhbnMgdGhlIG1vZHVsZQotaXMgbm8gbG9uZ2VyIGNvbXBhdGlibGUgd2l0aCBvcGVyYXRpbmcgc3lzdGVtcyB0aGF0IG9ubHkgaGF2ZSBCU0QKLWN1cnNlcywgYnV0IHRoZXJlIGRvbid0IHNlZW0gdG8gYmUgYW55IGN1cnJlbnRseSBtYWludGFpbmVkIE9TZXMgdGhhdAotZmFsbCBpbnRvIHRoaXMgY2F0ZWdvcnkuCi0KLUFzIG1lbnRpb25lZCBpbiB0aGUgZWFybGllciBkaXNjdXNzaW9uIG9mIDIuMCdzIFVuaWNvZGUgc3VwcG9ydCwgdGhlCi11bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIG9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb25zIHByb3ZpZGVkIGJ5IHRoZQotXG1vZHVsZXtyZX0gbW9kdWxlIGhhcyBiZWVuIGNoYW5nZWQuICBTUkUsIGEgbmV3IHJlZ3VsYXIgZXhwcmVzc2lvbgotZW5naW5lIHdyaXR0ZW4gYnkgRnJlZHJpayBMdW5kaCBhbmQgcGFydGlhbGx5IGZ1bmRlZCBieSBIZXdsZXR0Ci1QYWNrYXJkLCBzdXBwb3J0cyBtYXRjaGluZyBhZ2FpbnN0IGJvdGggOC1iaXQgc3RyaW5ncyBhbmQgVW5pY29kZQotc3RyaW5ncy4KLQotJSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntOZXcgbW9kdWxlc30KLQotQSBudW1iZXIgb2YgbmV3IG1vZHVsZXMgd2VyZSBhZGRlZC4gIFdlJ2xsIHNpbXBseSBsaXN0IHRoZW0gd2l0aCBicmllZgotZGVzY3JpcHRpb25zOyBjb25zdWx0IHRoZSAyLjAgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGRldGFpbHMgb2YgYQotcGFydGljdWxhciBtb2R1bGUuCi0KLVxiZWdpbntpdGVtaXplfQotCi1caXRlbXtcbW9kdWxle2F0ZXhpdH19OiAKLUZvciByZWdpc3RlcmluZyBmdW5jdGlvbnMgdG8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgUHl0aG9uIGludGVycHJldGVyIGV4aXRzLgotQ29kZSB0aGF0IGN1cnJlbnRseSBzZXRzCi1cY29kZXtzeXMuZXhpdGZ1bmN9IGRpcmVjdGx5IHNob3VsZCBiZSBjaGFuZ2VkIHRvIAotdXNlIHRoZSBcbW9kdWxle2F0ZXhpdH0gbW9kdWxlIGluc3RlYWQsIGltcG9ydGluZyBcbW9kdWxle2F0ZXhpdH0KLWFuZCBjYWxsaW5nIFxmdW5jdGlvbnthdGV4aXQucmVnaXN0ZXIoKX0gd2l0aCAKLXRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb24gZXhpdC4KLShDb250cmlidXRlZCBieSBTa2lwIE1vbnRhbmFyby4pCi0KLVxpdGVte1xtb2R1bGV7Y29kZWNzfSwgXG1vZHVsZXtlbmNvZGluZ3N9LCBcbW9kdWxle3VuaWNvZGVkYXRhfTp9ICBBZGRlZCBhcyBwYXJ0IG9mIHRoZSBuZXcgVW5pY29kZSBzdXBwb3J0LiAKLQotXGl0ZW17XG1vZHVsZXtmaWxlY21wfTp9IFN1cGVyc2VkZXMgdGhlIG9sZCBcbW9kdWxle2NtcH0sIFxtb2R1bGV7Y21wY2FjaGV9IGFuZAotXG1vZHVsZXtkaXJjbXB9IG1vZHVsZXMsIHdoaWNoIGhhdmUgbm93IGJlY29tZSBkZXByZWNhdGVkLgotKENvbnRyaWJ1dGVkIGJ5IEdvcmRvbiBNYWNNaWxsYW4gYW5kIE1vc2hlIFphZGthLikKLQotXGl0ZW17XG1vZHVsZXtnZXR0ZXh0fTp9IFRoaXMgbW9kdWxlIHByb3ZpZGVzIGludGVybmF0aW9uYWxpemF0aW9uCi0oSTE4TikgYW5kIGxvY2FsaXphdGlvbiAoTDEwTikgc3VwcG9ydCBmb3IgUHl0aG9uIHByb2dyYW1zIGJ5Ci1wcm92aWRpbmcgYW4gaW50ZXJmYWNlIHRvIHRoZSBHTlUgZ2V0dGV4dCBtZXNzYWdlIGNhdGFsb2cgbGlicmFyeS4KLShJbnRlZ3JhdGVkIGJ5IEJhcnJ5IFdhcnNhdywgZnJvbSBzZXBhcmF0ZSBjb250cmlidXRpb25zIGJ5IE1hcnRpbiAKLXZvbn5MXCJvd2lzLCBQZXRlciBGdW5rLCBhbmQgSmFtZXMgSGVuc3RyaWRnZS4pCi0KLVxpdGVte1xtb2R1bGV7bGludXhhdWRpb2Rldn06fSBTdXBwb3J0IGZvciB0aGUgXGZpbGV7L2Rldi9hdWRpb30KLWRldmljZSBvbiBMaW51eCwgYSB0d2luIHRvIHRoZSBleGlzdGluZyBcbW9kdWxle3N1bmF1ZGlvZGV2fSBtb2R1bGUuCi0oQ29udHJpYnV0ZWQgYnkgUGV0ZXIgQm9zY2gsIHdpdGggZml4ZXMgYnkgSmVyZW15IEh5bHRvbi4pCi0KLVxpdGVte1xtb2R1bGV7bW1hcH06fSBBbiBpbnRlcmZhY2UgdG8gbWVtb3J5LW1hcHBlZCBmaWxlcyBvbiBib3RoCi1XaW5kb3dzIGFuZCBcVU5JWC4gIEEgZmlsZSdzIGNvbnRlbnRzIGNhbiBiZSBtYXBwZWQgZGlyZWN0bHkgaW50bwotbWVtb3J5LCBhdCB3aGljaCBwb2ludCBpdCBiZWhhdmVzIGxpa2UgYSBtdXRhYmxlIHN0cmluZywgc28gaXRzCi1jb250ZW50cyBjYW4gYmUgcmVhZCBhbmQgbW9kaWZpZWQuICBUaGV5IGNhbiBldmVuIGJlIHBhc3NlZCB0bwotZnVuY3Rpb25zIHRoYXQgZXhwZWN0IG9yZGluYXJ5IHN0cmluZ3MsIHN1Y2ggYXMgdGhlIFxtb2R1bGV7cmV9Ci1tb2R1bGUuIChDb250cmlidXRlZCBieSBTYW0gUnVzaGluZywgd2l0aCBzb21lIGV4dGVuc2lvbnMgYnkKLUEuTS4gS3VjaGxpbmcuKQotCi1caXRlbXtcbW9kdWxle3B5ZXhwYXR9On0gQW4gaW50ZXJmYWNlIHRvIHRoZSBFeHBhdCBYTUwgcGFyc2VyLgotKENvbnRyaWJ1dGVkIGJ5IFBhdWwgUHJlc2NvZC4pCi0KLVxpdGVte1xtb2R1bGV7cm9ib3RwYXJzZXJ9On0gUGFyc2UgYSBcZmlsZXtyb2JvdHMudHh0fSBmaWxlLCB3aGljaCBpcwotdXNlZCBmb3Igd3JpdGluZyBXZWIgc3BpZGVycyB0aGF0IHBvbGl0ZWx5IGF2b2lkIGNlcnRhaW4gYXJlYXMgb2YgYQotV2ViIHNpdGUuICBUaGUgcGFyc2VyIGFjY2VwdHMgdGhlIGNvbnRlbnRzIG9mIGEgXGZpbGV7cm9ib3RzLnR4dH0gZmlsZSwKLWJ1aWxkcyBhIHNldCBvZiBydWxlcyBmcm9tIGl0LCBhbmQgY2FuIHRoZW4gYW5zd2VyIHF1ZXN0aW9ucyBhYm91dAotdGhlIGZldGNoYWJpbGl0eSBvZiBhIGdpdmVuIFVSTC4gIChDb250cmlidXRlZCBieSBTa2lwIE1vbnRhbmFyby4pCi0KLVxpdGVte1xtb2R1bGV7dGFibmFubnl9On0gQSBtb2R1bGUvc2NyaXB0IHRvIAotY2hlY2sgUHl0aG9uIHNvdXJjZSBjb2RlIGZvciBhbWJpZ3VvdXMgaW5kZW50YXRpb24uCi0oQ29udHJpYnV0ZWQgYnkgVGltIFBldGVycy4pCi0KLVxpdGVte1xtb2R1bGV7VXNlclN0cmluZ306fSBBIGJhc2UgY2xhc3MgdXNlZnVsIGZvciBkZXJpdmluZyBvYmplY3RzIHRoYXQgYmVoYXZlIGxpa2Ugc3RyaW5ncy4gIAotCi1caXRlbXtcbW9kdWxle3dlYmJyb3dzZXJ9On0gQSBtb2R1bGUgdGhhdCBwcm92aWRlcyBhIHBsYXRmb3JtIGluZGVwZW5kZW50Ci13YXkgdG8gbGF1bmNoIGEgd2ViIGJyb3dzZXIgb24gYSBzcGVjaWZpYyBVUkwuIEZvciBlYWNoIHBsYXRmb3JtLCB2YXJpb3VzCi1icm93c2VycyBhcmUgdHJpZWQgaW4gYSBzcGVjaWZpYyBvcmRlci4gVGhlIHVzZXIgY2FuIGFsdGVyIHdoaWNoIGJyb3dzZXIKLWlzIGxhdW5jaGVkIGJ5IHNldHRpbmcgdGhlIFx2YXJ7QlJPV1NFUn0gZW52aXJvbm1lbnQgdmFyaWFibGUuIAotKE9yaWdpbmFsbHkgaW5zcGlyZWQgYnkgRXJpYyBTLiBSYXltb25kJ3MgcGF0Y2ggdG8gXG1vZHVsZXt1cmxsaWJ9Ci13aGljaCBhZGRlZCBzaW1pbGFyIGZ1bmN0aW9uYWxpdHksIGJ1dAotdGhlIGZpbmFsIG1vZHVsZSBjb21lcyBmcm9tIGNvZGUgb3JpZ2luYWxseSAKLWltcGxlbWVudGVkIGJ5IEZyZWQgRHJha2UgYXMgXGZpbGV7VG9vbHMvaWRsZS9Ccm93c2VyQ29udHJvbC5weX0sCi1hbmQgYWRhcHRlZCBmb3IgdGhlIHN0YW5kYXJkIGxpYnJhcnkgYnkgRnJlZC4pCi0KLVxpdGVte1xtb2R1bGV7X3dpbnJlZ306fSBBbiBpbnRlcmZhY2UgdG8gdGhlCi1XaW5kb3dzIHJlZ2lzdHJ5LiAgXG1vZHVsZXtfd2lucmVnfSBpcyBhbiBhZGFwdGF0aW9uIG9mIGZ1bmN0aW9ucyB0aGF0Ci1oYXZlIGJlZW4gcGFydCBvZiBQeXRob25XaW4gc2luY2UgMTk5NSwgYnV0IGhhcyBub3cgYmVlbiBhZGRlZCB0byB0aGUgY29yZSAKLWRpc3RyaWJ1dGlvbiwgYW5kIGVuaGFuY2VkIHRvIHN1cHBvcnQgVW5pY29kZS4gIAotXG1vZHVsZXtfd2lucmVnfSB3YXMgd3JpdHRlbiBieSBCaWxsIFR1dHQgYW5kIE1hcmsgSGFtbW9uZC4KLQotXGl0ZW17XG1vZHVsZXt6aXBmaWxlfTp9IEEgbW9kdWxlIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIFpJUC1mb3JtYXQKLWFyY2hpdmVzLiAgVGhlc2UgYXJlIGFyY2hpdmVzIHByb2R1Y2VkIGJ5IFxwcm9ncmFte1BLWklQfSBvbgotRE9TL1dpbmRvd3Mgb3IgXHByb2dyYW17emlwfSBvbiBcVU5JWCwgbm90IHRvIGJlIGNvbmZ1c2VkIHdpdGgKLVxwcm9ncmFte2d6aXB9LWZvcm1hdCBmaWxlcyAod2hpY2ggYXJlIHN1cHBvcnRlZCBieSB0aGUgXG1vZHVsZXtnemlwfQotbW9kdWxlKQotKENvbnRyaWJ1dGVkIGJ5IEphbWVzIEMuIEFobHN0cm9tLikKLQotXGl0ZW17XG1vZHVsZXtpbXB1dGlsfTp9IEEgbW9kdWxlIHRoYXQgcHJvdmlkZXMgYSBzaW1wbGVyIHdheSBmb3IKLXdyaXRpbmcgY3VzdG9taXNlZCBpbXBvcnQgaG9va3MsIGluIGNvbXBhcmlzb24gdG8gdGhlIGV4aXN0aW5nCi1cbW9kdWxle2lob29rc30gbW9kdWxlLiAgKEltcGxlbWVudGVkIGJ5IEdyZWcgU3RlaW4sIHdpdGggbXVjaAotZGlzY3Vzc2lvbiBvbiBweXRob24tZGV2IGFsb25nIHRoZSB3YXkuKQotCi1cZW5ke2l0ZW1pemV9Ci0KLSUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257SURMRSBJbXByb3ZlbWVudHN9Ci0KLUlETEUgaXMgdGhlIG9mZmljaWFsIFB5dGhvbiBjcm9zcy1wbGF0Zm9ybSBJREUsIHdyaXR0ZW4gdXNpbmcgVGtpbnRlci4KLVB5dGhvbiAyLjAgaW5jbHVkZXMgSURMRSAwLjYsIHdoaWNoIGFkZHMgYSBudW1iZXIgb2YgbmV3IGZlYXR1cmVzIGFuZAotaW1wcm92ZW1lbnRzLiAgQSBwYXJ0aWFsIGxpc3Q6Ci0KLVxiZWdpbntpdGVtaXplfQotXGl0ZW0gIFVJIGltcHJvdmVtZW50cyBhbmQgb3B0aW1pemF0aW9ucywKLWVzcGVjaWFsbHkgaW4gdGhlIGFyZWEgb2Ygc3ludGF4IGhpZ2hsaWdodGluZyBhbmQgYXV0by1pbmRlbnRhdGlvbi4KLQotXGl0ZW0gVGhlIGNsYXNzIGJyb3dzZXIgbm93IHNob3dzIG1vcmUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIHRvcAotbGV2ZWwgZnVuY3Rpb25zIGluIGEgbW9kdWxlLgotCi1caXRlbSBUYWIgd2lkdGggaXMgbm93IGEgdXNlciBzZXR0YWJsZSBvcHRpb24uIFdoZW4gb3BlbmluZyBhbiBleGlzdGluZyBQeXRob24KLWZpbGUsIElETEUgYXV0b21hdGljYWxseSBkZXRlY3RzIHRoZSBpbmRlbnRhdGlvbiBjb252ZW50aW9ucywgYW5kIGFkYXB0cy4KLQotXGl0ZW0gVGhlcmUgaXMgbm93IHN1cHBvcnQgZm9yIGNhbGxpbmcgYnJvd3NlcnMgb24gdmFyaW91cyBwbGF0Zm9ybXMsCi11c2VkIHRvIG9wZW4gdGhlIFB5dGhvbiBkb2N1bWVudGF0aW9uIGluIGEgYnJvd3Nlci4KLQotXGl0ZW0gSURMRSBub3cgaGFzIGEgY29tbWFuZCBsaW5lLCB3aGljaCBpcyBsYXJnZWx5IHNpbWlsYXIgdG8gCi10aGUgdmFuaWxsYSBQeXRob24gaW50ZXJwcmV0ZXIuCi0KLVxpdGVtIENhbGwgdGlwcyB3ZXJlIGFkZGVkIGluIG1hbnkgcGxhY2VzLgotCi1caXRlbSBJRExFIGNhbiBub3cgYmUgaW5zdGFsbGVkIGFzIGEgcGFja2FnZS4KLQotXGl0ZW0gSW4gdGhlIGVkaXRvciB3aW5kb3csIHRoZXJlIGlzIG5vdyBhIGxpbmUvY29sdW1uIGJhciBhdCB0aGUgYm90dG9tLgotCi1caXRlbSBUaHJlZSBuZXcga2V5c3Ryb2tlIGNvbW1hbmRzOiBDaGVjayBtb2R1bGUgKEFsdC1GNSksIEltcG9ydAotbW9kdWxlIChGNSkgYW5kIFJ1biBzY3JpcHQgKEN0cmwtRjUpLgotCi1cZW5ke2l0ZW1pemV9Ci0KLSUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257RGVsZXRlZCBhbmQgRGVwcmVjYXRlZCBNb2R1bGVzfQotCi1BIGZldyBtb2R1bGVzIGhhdmUgYmVlbiBkcm9wcGVkIGJlY2F1c2UgdGhleSdyZSBvYnNvbGV0ZSwgb3IgYmVjYXVzZQotdGhlcmUgYXJlIG5vdyBiZXR0ZXIgd2F5cyB0byBkbyB0aGUgc2FtZSB0aGluZy4gIFRoZSBcbW9kdWxle3N0ZHdpbn0KLW1vZHVsZSBpcyBnb25lOyBpdCB3YXMgZm9yIGEgcGxhdGZvcm0taW5kZXBlbmRlbnQgd2luZG93aW5nIHRvb2xraXQKLXRoYXQncyBubyBsb25nZXIgZGV2ZWxvcGVkLiAgCi0KLUEgbnVtYmVyIG9mIG1vZHVsZXMgaGF2ZSBiZWVuIG1vdmVkIHRvIHRoZQotXGZpbGV7bGliLW9sZH0gc3ViZGlyZWN0b3J5OgotXG1vZHVsZXtjbXB9LCBcbW9kdWxle2NtcGNhY2hlfSwgXG1vZHVsZXtkaXJjbXB9LCBcbW9kdWxle2R1bXB9LCAKLVxtb2R1bGV7ZmluZH0sIFxtb2R1bGV7Z3JlcH0sIFxtb2R1bGV7cGFja21haWx9LCAKLVxtb2R1bGV7cG9seX0sIFxtb2R1bGV7dXRpbH0sIFxtb2R1bGV7d2hhdHNvdW5kfSwgXG1vZHVsZXt6bW9kfS4gCi1JZiB5b3UgaGF2ZSBjb2RlIHdoaWNoIHJlbGllcyBvbiBhIG1vZHVsZSAgdGhhdCdzIGJlZW4gbW92ZWQgdG8KLVxmaWxle2xpYi1vbGR9LCB5b3UgY2FuIHNpbXBseSBhZGQgdGhhdCBkaXJlY3RvcnkgdG8gXGNvZGV7c3lzLnBhdGh9ICAKLXRvIGdldCB0aGVtIGJhY2ssIGJ1dCB5b3UncmUgZW5jb3VyYWdlZCB0byB1cGRhdGUgYW55IGNvZGUgdGhhdCB1c2VzCi10aGVzZSBtb2R1bGVzLgotCi1cc2VjdGlvbntBY2tub3dsZWRnZW1lbnRzfQotCi1UaGUgYXV0aG9ycyB3b3VsZCBsaWtlIHRvIHRoYW5rIHRoZSBmb2xsb3dpbmcgcGVvcGxlIGZvciBvZmZlcmluZwotc3VnZ2VzdGlvbnMgb24gdmFyaW91cyBkcmFmdHMgb2YgdGhpcyBhcnRpY2xlOiBEYXZpZCBCb2xlbiwgTWFyawotSGFtbW9uZCwgR3JlZ2cgSGF1c2VyLCBKZXJlbXkgSHlsdG9uLCBGcmVkcmlrIEx1bmRoLCBEZXRsZWYgTGFubmVydCwKLUFhaHogTWFydWNoLCBTa2lwIE1vbnRhbmFybywgVmxhZGltaXIgTWFyYW5nb3pvdiwgVG9iaWFzIFBvbHppbiwgR3VpZG8KLXZhbiBSb3NzdW0sIE5laWwgU2NoZW1lbmF1ZXIsIGFuZCBSdXNzIFNjaG1pZHQuCi0KLVxlbmR7ZG9jdW1lbnR9CmRpZmYgLS1naXQgYS9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyMS50ZXggYi9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyMS50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3Y2JiZTQuLjAwMDAwMDAKLS0tIGEvRG9jL3doYXRzbmV3L3doYXRzbmV3MjEudGV4CisrKyAvZGV2L251bGwKQEAgLTEsODY4ICswLDAgQEAKLVxkb2N1bWVudGNsYXNze2hvd3RvfQotCi1cdXNlcGFja2FnZXtkaXN0dXRpbHN9Ci0KLSUgJElkJAotCi1cdGl0bGV7V2hhdCdzIE5ldyBpbiBQeXRob24gMi4xfQotXHJlbGVhc2V7MS4wMX0KLVxhdXRob3J7QS5NLiBLdWNobGluZ30KLVxhdXRob3JhZGRyZXNzewotCVxzdHJvbmd7UHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb259XFwKLQlFbWFpbDogXGVtYWlse2Fta0BhbWsuY2F9Ci19Ci1cYmVnaW57ZG9jdW1lbnR9Ci1cbWFrZXRpdGxlXHRhYmxlb2Zjb250ZW50cwotCi1cc2VjdGlvbntJbnRyb2R1Y3Rpb259Ci0KLVRoaXMgYXJ0aWNsZSBleHBsYWlucyB0aGUgbmV3IGZlYXR1cmVzIGluIFB5dGhvbiAyLjEuICBXaGlsZSB0aGVyZSBhcmVuJ3QgYXMKLW1hbnkgY2hhbmdlcyBpbiAyLjEgYXMgdGhlcmUgd2VyZSBpbiBQeXRob24gMi4wLCB0aGVyZSBhcmUgc3RpbGwgc29tZQotcGxlYXNhbnQgc3VycHJpc2VzIGluIHN0b3JlLiAgMi4xIGlzIHRoZSBmaXJzdCByZWxlYXNlIHRvIGJlIHN0ZWVyZWQKLXRocm91Z2ggdGhlIHVzZSBvZiBQeXRob24gRW5oYW5jZW1lbnQgUHJvcG9zYWxzLCBvciBQRVBzLCBzbyBtb3N0IG9mCi10aGUgc2l6YWJsZSBjaGFuZ2VzIGhhdmUgYWNjb21wYW55aW5nIFBFUHMgdGhhdCBwcm92aWRlIG1vcmUgY29tcGxldGUKLWRvY3VtZW50YXRpb24gYW5kIGEgZGVzaWduIHJhdGlvbmFsZSBmb3IgdGhlIGNoYW5nZS4gIFRoaXMgYXJ0aWNsZQotZG9lc24ndCBhdHRlbXB0IHRvIGRvY3VtZW50IHRoZSBuZXcgZmVhdHVyZXMgY29tcGxldGVseSwgYnV0IHNpbXBseQotcHJvdmlkZXMgYW4gb3ZlcnZpZXcgb2YgdGhlIG5ldyBmZWF0dXJlcyBmb3IgUHl0aG9uIHByb2dyYW1tZXJzLgotUmVmZXIgdG8gdGhlIFB5dGhvbiAyLjEgZG9jdW1lbnRhdGlvbiwgb3IgdG8gdGhlIHNwZWNpZmljIFBFUCwgZm9yCi1tb3JlIGRldGFpbHMgYWJvdXQgYW55IG5ldyBmZWF0dXJlIHRoYXQgcGFydGljdWxhcmx5IGludGVyZXN0cyB5b3UuCi0KLU9uZSByZWNlbnQgZ29hbCBvZiB0aGUgUHl0aG9uIGRldmVsb3BtZW50IHRlYW0gaGFzIGJlZW4gdG8gYWNjZWxlcmF0ZQotdGhlIHBhY2Ugb2YgbmV3IHJlbGVhc2VzLCB3aXRoIGEgbmV3IHJlbGVhc2UgY29taW5nIGV2ZXJ5IDYgdG8gOQotbW9udGhzLiAyLjEgaXMgdGhlIGZpcnN0IHJlbGVhc2UgdG8gY29tZSBvdXQgYXQgdGhpcyBmYXN0ZXIgcGFjZSwgd2l0aAotdGhlIGZpcnN0IGFscGhhIGFwcGVhcmluZyBpbiBKYW51YXJ5LCAzIG1vbnRocyBhZnRlciB0aGUgZmluYWwgdmVyc2lvbgotb2YgMi4wIHdhcyByZWxlYXNlZC4KLQotVGhlIGZpbmFsIHJlbGVhc2Ugb2YgUHl0aG9uIDIuMSB3YXMgbWFkZSBvbiBBcHJpbCAxNywgMjAwMS4KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue1BFUCAyMjc6IE5lc3RlZCBTY29wZXN9Ci0KLVRoZSBsYXJnZXN0IGNoYW5nZSBpbiBQeXRob24gMi4xIGlzIHRvIFB5dGhvbidzIHNjb3BpbmcgcnVsZXMuICBJbgotUHl0aG9uIDIuMCwgYXQgYW55IGdpdmVuIHRpbWUgdGhlcmUgYXJlIGF0IG1vc3QgdGhyZWUgbmFtZXNwYWNlcyB1c2VkCi10byBsb29rIHVwIHZhcmlhYmxlIG5hbWVzOiBsb2NhbCwgbW9kdWxlLWxldmVsLCBhbmQgdGhlIGJ1aWx0LWluCi1uYW1lc3BhY2UuICBUaGlzIG9mdGVuIHN1cnByaXNlZCBwZW9wbGUgYmVjYXVzZSBpdCBkaWRuJ3QgbWF0Y2ggdGhlaXIKLWludHVpdGl2ZSBleHBlY3RhdGlvbnMuICBGb3IgZXhhbXBsZSwgYSBuZXN0ZWQgcmVjdXJzaXZlIGZ1bmN0aW9uCi1kZWZpbml0aW9uIGRvZXNuJ3Qgd29yazoKLQotXGJlZ2lue3ZlcmJhdGltfQotZGVmIGYoKToKLSAgICAuLi4KLSAgICBkZWYgZyh2YWx1ZSk6Ci0gICAgICAgIC4uLgotICAgICAgICByZXR1cm4gZyh2YWx1ZS0xKSArIDEKLSAgICAuLi4KLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBmdW5jdGlvbiBcZnVuY3Rpb257ZygpfSB3aWxsIGFsd2F5cyByYWlzZSBhIFxleGNlcHRpb257TmFtZUVycm9yfQotZXhjZXB0aW9uLCBiZWNhdXNlIHRoZSBiaW5kaW5nIG9mIHRoZSBuYW1lIFxzYW1we2d9IGlzbid0IGluIGVpdGhlcgotaXRzIGxvY2FsIG5hbWVzcGFjZSBvciBpbiB0aGUgbW9kdWxlLWxldmVsIG5hbWVzcGFjZS4gIFRoaXMgaXNuJ3QgbXVjaAotb2YgYSBwcm9ibGVtIGluIHByYWN0aWNlIChob3cgb2Z0ZW4gZG8geW91IHJlY3Vyc2l2ZWx5IGRlZmluZSBpbnRlcmlvcgotZnVuY3Rpb25zIGxpa2UgdGhpcz8pLCBidXQgdGhpcyBhbHNvIG1hZGUgdXNpbmcgdGhlIFxrZXl3b3Jke2xhbWJkYX0KLXN0YXRlbWVudCBjbHVtc2llciwgYW5kIHRoaXMgd2FzIGEgcHJvYmxlbSBpbiBwcmFjdGljZS4gIEluIGNvZGUgd2hpY2gKLXVzZXMgXGtleXdvcmR7bGFtYmRhfSB5b3UgY2FuIG9mdGVuIGZpbmQgbG9jYWwgdmFyaWFibGVzIGJlaW5nIGNvcGllZAotYnkgcGFzc2luZyB0aGVtIGFzIHRoZSBkZWZhdWx0IHZhbHVlcyBvZiBhcmd1bWVudHMuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLWRlZiBmaW5kKHNlbGYsIG5hbWUpOgotICAgICJSZXR1cm4gbGlzdCBvZiBhbnkgZW50cmllcyBlcXVhbCB0byAnbmFtZSciCi0gICAgTCA9IGZpbHRlcihsYW1iZGEgeCwgbmFtZT1uYW1lOiB4ID09IG5hbWUsCi0gICAgICAgICAgICAgICBzZWxmLmxpc3RfYXR0cmlidXRlKQotICAgIHJldHVybiBMCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgcmVhZGFiaWxpdHkgb2YgUHl0aG9uIGNvZGUgd3JpdHRlbiBpbiBhIHN0cm9uZ2x5IGZ1bmN0aW9uYWwgc3R5bGUKLXN1ZmZlcnMgZ3JlYXRseSBhcyBhIHJlc3VsdC4KLQotVGhlIG1vc3Qgc2lnbmlmaWNhbnQgY2hhbmdlIHRvIFB5dGhvbiAyLjEgaXMgdGhhdCBzdGF0aWMgc2NvcGluZyBoYXMKLWJlZW4gYWRkZWQgdG8gdGhlIGxhbmd1YWdlIHRvIGZpeCB0aGlzIHByb2JsZW0uICBBcyBhIGZpcnN0IGVmZmVjdCwKLXRoZSBcY29kZXtuYW1lPW5hbWV9IGRlZmF1bHQgYXJndW1lbnQgaXMgbm93IHVubmVjZXNzYXJ5IGluIHRoZSBhYm92ZQotZXhhbXBsZS4gIFB1dCBzaW1wbHksIHdoZW4gYSBnaXZlbiB2YXJpYWJsZSBuYW1lIGlzIG5vdCBhc3NpZ25lZCBhCi12YWx1ZSB3aXRoaW4gYSBmdW5jdGlvbiAoYnkgYW4gYXNzaWdubWVudCwgb3IgdGhlIFxrZXl3b3Jke2RlZn0sCi1ca2V5d29yZHtjbGFzc30sIG9yIFxrZXl3b3Jke2ltcG9ydH0gc3RhdGVtZW50cyksIHJlZmVyZW5jZXMgdG8gdGhlCi12YXJpYWJsZSB3aWxsIGJlIGxvb2tlZCB1cCBpbiB0aGUgbG9jYWwgbmFtZXNwYWNlIG9mIHRoZSBlbmNsb3NpbmcKLXNjb3BlLiAgQSBtb3JlIGRldGFpbGVkIGV4cGxhbmF0aW9uIG9mIHRoZSBydWxlcywgYW5kIGEgZGlzc2VjdGlvbiBvZgotdGhlIGltcGxlbWVudGF0aW9uLCBjYW4gYmUgZm91bmQgaW4gdGhlIFBFUC4KLQotVGhpcyBjaGFuZ2UgbWF5IGNhdXNlIHNvbWUgY29tcGF0aWJpbGl0eSBwcm9ibGVtcyBmb3IgY29kZSB3aGVyZSB0aGUKLXNhbWUgdmFyaWFibGUgbmFtZSBpcyB1c2VkIGJvdGggYXQgdGhlIG1vZHVsZSBsZXZlbCBhbmQgYXMgYSBsb2NhbAotdmFyaWFibGUgd2l0aGluIGEgZnVuY3Rpb24gdGhhdCBjb250YWlucyBmdXJ0aGVyIGZ1bmN0aW9uIGRlZmluaXRpb25zLgotVGhpcyBzZWVtcyByYXRoZXIgdW5saWtlbHkgdGhvdWdoLCBzaW5jZSBzdWNoIGNvZGUgd291bGQgaGF2ZSBiZWVuCi1wcmV0dHkgY29uZnVzaW5nIHRvIHJlYWQgaW4gdGhlIGZpcnN0IHBsYWNlLiAgCi0KLU9uZSBzaWRlIGVmZmVjdCBvZiB0aGUgY2hhbmdlIGlzIHRoYXQgdGhlIFxjb2Rle2Zyb20gXHZhcnttb2R1bGV9Ci1pbXBvcnQgKn0gYW5kIFxrZXl3b3Jke2V4ZWN9IHN0YXRlbWVudHMgaGF2ZSBiZWVuIG1hZGUgaWxsZWdhbCBpbnNpZGUKLWEgZnVuY3Rpb24gc2NvcGUgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zLiAgVGhlIFB5dGhvbiByZWZlcmVuY2UKLW1hbnVhbCBoYXMgc2FpZCBhbGwgYWxvbmcgdGhhdCBcY29kZXtmcm9tIFx2YXJ7bW9kdWxlfSBpbXBvcnQgKn0gaXMKLW9ubHkgbGVnYWwgYXQgdGhlIHRvcCBsZXZlbCBvZiBhIG1vZHVsZSwgYnV0IHRoZSBDUHl0aG9uIGludGVycHJldGVyCi1oYXMgbmV2ZXIgZW5mb3JjZWQgdGhpcyBiZWZvcmUuICBBcyBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZgotbmVzdGVkIHNjb3BlcywgdGhlIGNvbXBpbGVyIHdoaWNoIHR1cm5zIFB5dGhvbiBzb3VyY2UgaW50byBieXRlY29kZXMKLWhhcyB0byBnZW5lcmF0ZSBkaWZmZXJlbnQgY29kZSB0byBhY2Nlc3MgdmFyaWFibGVzIGluIGEgY29udGFpbmluZwotc2NvcGUuICBcY29kZXtmcm9tIFx2YXJ7bW9kdWxlfSBpbXBvcnQgKn0gYW5kIFxrZXl3b3Jke2V4ZWN9IG1ha2UgaXQKLWltcG9zc2libGUgZm9yIHRoZSBjb21waWxlciB0byBmaWd1cmUgdGhpcyBvdXQsIGJlY2F1c2UgdGhleSBhZGQgbmFtZXMKLXRvIHRoZSBsb2NhbCBuYW1lc3BhY2UgdGhhdCBhcmUgdW5rbm93YWJsZSBhdCBjb21waWxlIHRpbWUuCi1UaGVyZWZvcmUsIGlmIGEgZnVuY3Rpb24gY29udGFpbnMgZnVuY3Rpb24gZGVmaW5pdGlvbnMgb3IKLVxrZXl3b3Jke2xhbWJkYX0gZXhwcmVzc2lvbnMgd2l0aCBmcmVlIHZhcmlhYmxlcywgdGhlIGNvbXBpbGVyIHdpbGwKLWZsYWcgdGhpcyBieSByYWlzaW5nIGEgXGV4Y2VwdGlvbntTeW50YXhFcnJvcn0gZXhjZXB0aW9uLgotCi1UbyBtYWtlIHRoZSBwcmVjZWRpbmcgZXhwbGFuYXRpb24gYSBiaXQgY2xlYXJlciwgaGVyZSdzIGFuIGV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXggPSAxCi1kZWYgZigpOgotICAgICMgVGhlIG5leHQgbGluZSBpcyBhIHN5bnRheCBlcnJvcgotICAgIGV4ZWMgJ3g9MicgIAotICAgIGRlZiBnKCk6Ci0gICAgICAgIHJldHVybiB4Ci1cZW5ke3ZlcmJhdGltfQotCi1MaW5lIDQgY29udGFpbmluZyB0aGUgXGtleXdvcmR7ZXhlY30gc3RhdGVtZW50IGlzIGEgc3ludGF4IGVycm9yLAotc2luY2UgXGtleXdvcmR7ZXhlY30gd291bGQgZGVmaW5lIGEgbmV3IGxvY2FsIHZhcmlhYmxlIG5hbWVkIFxzYW1we3h9Ci13aG9zZSB2YWx1ZSBzaG91bGQgYmUgYWNjZXNzZWQgYnkgXGZ1bmN0aW9ue2coKX0uICAKLQotVGhpcyBzaG91bGRuJ3QgYmUgbXVjaCBvZiBhIGxpbWl0YXRpb24sIHNpbmNlIFxrZXl3b3Jke2V4ZWN9IGlzIHJhcmVseQotdXNlZCBpbiBtb3N0IFB5dGhvbiBjb2RlIChhbmQgd2hlbiBpdCBpcyB1c2VkLCBpdCdzIG9mdGVuIGEgc2lnbiBvZiBhCi1wb29yIGRlc2lnbiBhbnl3YXkpLgotCi1Db21wYXRpYmlsaXR5IGNvbmNlcm5zIGhhdmUgbGVkIHRvIG5lc3RlZCBzY29wZXMgYmVpbmcgaW50cm9kdWNlZAotZ3JhZHVhbGx5OyBpbiBQeXRob24gMi4xLCB0aGV5IGFyZW4ndCBlbmFibGVkIGJ5IGRlZmF1bHQsIGJ1dCBjYW4gYmUKLXR1cm5lZCBvbiB3aXRoaW4gYSBtb2R1bGUgYnkgdXNpbmcgYSBmdXR1cmUgc3RhdGVtZW50IGFzIGRlc2NyaWJlZCBpbgotUEVQIDIzNi4gIChTZWUgdGhlIGZvbGxvd2luZyBzZWN0aW9uIGZvciBmdXJ0aGVyIGRpc2N1c3Npb24gb2YgUEVQCi0yMzYuKSAgSW4gUHl0aG9uIDIuMiwgbmVzdGVkIHNjb3BlcyB3aWxsIGJlY29tZSB0aGUgZGVmYXVsdCBhbmQgdGhlcmUKLXdpbGwgYmUgbm8gd2F5IHRvIHR1cm4gdGhlbSBvZmYsIGJ1dCB1c2VycyB3aWxsIGhhdmUgaGFkIGFsbCBvZiAyLjEncwotbGlmZXRpbWUgdG8gZml4IGFueSBicmVha2FnZSByZXN1bHRpbmcgZnJvbSB0aGVpciBpbnRyb2R1Y3Rpb24uCi0KLVxiZWdpbntzZWVhbHNvfQotCi1cc2VlcGVwezIyN317U3RhdGljYWxseSBOZXN0ZWQgU2NvcGVzfXtXcml0dGVuIGFuZCBpbXBsZW1lbnRlZCBieQotSmVyZW15IEh5bHRvbi59Ci0KLVxlbmR7c2VlYWxzb30KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257UEVQIDIzNjogX19mdXR1cmVfXyBEaXJlY3RpdmVzfQotCi1UaGUgcmVhY3Rpb24gdG8gbmVzdGVkIHNjb3BlcyB3YXMgd2lkZXNwcmVhZCBjb25jZXJuIGFib3V0IHRoZSBkYW5nZXJzCi1vZiBicmVha2luZyBjb2RlIHdpdGggdGhlIDIuMSByZWxlYXNlLCBhbmQgaXQgd2FzIHN0cm9uZyBlbm91Z2ggdG8KLW1ha2UgdGhlIFB5dGhvbmVlcnMgdGFrZSBhIG1vcmUgY29uc2VydmF0aXZlIGFwcHJvYWNoLiAgVGhpcyBhcHByb2FjaAotY29uc2lzdHMgb2YgaW50cm9kdWNpbmcgYSBjb252ZW50aW9uIGZvciBlbmFibGluZyBvcHRpb25hbAotZnVuY3Rpb25hbGl0eSBpbiByZWxlYXNlIE4gdGhhdCB3aWxsIGJlY29tZSBjb21wdWxzb3J5IGluIHJlbGVhc2UgTisxLiAgCi0KLVRoZSBzeW50YXggdXNlcyBhIFxjb2Rle2Zyb20uLi5pbXBvcnR9IHN0YXRlbWVudCB1c2luZyB0aGUgcmVzZXJ2ZWQKLW1vZHVsZSBuYW1lIFxtb2R1bGV7X19mdXR1cmVfX30uICBOZXN0ZWQgc2NvcGVzIGNhbiBiZSBlbmFibGVkIGJ5IHRoZQotZm9sbG93aW5nIHN0YXRlbWVudDoKLQotXGJlZ2lue3ZlcmJhdGltfQotZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBuZXN0ZWRfc2NvcGVzCi1cZW5ke3ZlcmJhdGltfQotCi1XaGlsZSBpdCBsb29rcyBsaWtlIGEgbm9ybWFsIFxrZXl3b3Jke2ltcG9ydH0gc3RhdGVtZW50LCBpdCdzIG5vdDsKLXRoZXJlIGFyZSBzdHJpY3QgcnVsZXMgb24gd2hlcmUgc3VjaCBhIGZ1dHVyZSBzdGF0ZW1lbnQgY2FuIGJlIHB1dC4KLVRoZXkgY2FuIG9ubHkgYmUgYXQgdGhlIHRvcCBvZiBhIG1vZHVsZSwgYW5kIG11c3QgcHJlY2VkZSBhbnkgUHl0aG9uCi1jb2RlIG9yIHJlZ3VsYXIgXGtleXdvcmR7aW1wb3J0fSBzdGF0ZW1lbnRzLiAgVGhpcyBpcyBiZWNhdXNlIHN1Y2gKLXN0YXRlbWVudHMgY2FuIGFmZmVjdCBob3cgdGhlIFB5dGhvbiBieXRlY29kZSBjb21waWxlciBwYXJzZXMgY29kZSBhbmQKLWdlbmVyYXRlcyBieXRlY29kZSwgc28gdGhleSBtdXN0IHByZWNlZGUgYW55IHN0YXRlbWVudCB0aGF0IHdpbGwKLXJlc3VsdCBpbiBieXRlY29kZXMgYmVpbmcgcHJvZHVjZWQuCi0KLVxiZWdpbntzZWVhbHNvfQotCi1cc2VlcGVwezIzNn17QmFjayB0byB0aGUgXG1vZHVsZXtfX2Z1dHVyZV9ffX17V3JpdHRlbiBieSBUaW0gUGV0ZXJzLAotYW5kIHByaW1hcmlseSBpbXBsZW1lbnRlZCBieSBKZXJlbXkgSHlsdG9uLn0KLQotXGVuZHtzZWVhbHNvfQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257UEVQIDIwNzogUmljaCBDb21wYXJpc29uc30KLQotSW4gZWFybGllciB2ZXJzaW9ucywgUHl0aG9uJ3Mgc3VwcG9ydCBmb3IgaW1wbGVtZW50aW5nIGNvbXBhcmlzb25zIG9uCi11c2VyLWRlZmluZWQgY2xhc3NlcyBhbmQgZXh0ZW5zaW9uIHR5cGVzIHdhcyBxdWl0ZSBzaW1wbGUuIENsYXNzZXMKLWNvdWxkIGltcGxlbWVudCBhIFxtZXRob2R7X19jbXBfX30gbWV0aG9kIHRoYXQgd2FzIGdpdmVuIHR3byBpbnN0YW5jZXMKLW9mIGEgY2xhc3MsIGFuZCBjb3VsZCBvbmx5IHJldHVybiAwIGlmIHRoZXkgd2VyZSBlcXVhbCBvciArMSBvciAtMSBpZgotdGhleSB3ZXJlbid0OyB0aGUgbWV0aG9kIGNvdWxkbid0IHJhaXNlIGFuIGV4Y2VwdGlvbiBvciByZXR1cm4KLWFueXRoaW5nIG90aGVyIHRoYW4gYSBCb29sZWFuIHZhbHVlLiAgVXNlcnMgb2YgTnVtZXJpYyBQeXRob24gb2Z0ZW4KLWZvdW5kIHRoaXMgbW9kZWwgdG9vIHdlYWsgYW5kIHJlc3RyaWN0aXZlLCBiZWNhdXNlIGluIHRoZQotbnVtYmVyLWNydW5jaGluZyBwcm9ncmFtcyB0aGF0IG51bWVyaWMgUHl0aG9uIGlzIHVzZWQgZm9yLCBpdCB3b3VsZCBiZQotbW9yZSB1c2VmdWwgdG8gYmUgYWJsZSB0byBwZXJmb3JtIGVsZW1lbnR3aXNlIGNvbXBhcmlzb25zIG9mIHR3bwotbWF0cmljZXMsIHJldHVybmluZyBhIG1hdHJpeCBjb250YWluaW5nIHRoZSByZXN1bHRzIG9mIGEgZ2l2ZW4KLWNvbXBhcmlzb24gZm9yIGVhY2ggZWxlbWVudC4gIElmIHRoZSB0d28gbWF0cmljZXMgYXJlIG9mIGRpZmZlcmVudAotc2l6ZXMsIHRoZW4gdGhlIGNvbXBhcmUgaGFzIHRvIGJlIGFibGUgdG8gcmFpc2UgYW4gZXhjZXB0aW9uIHRvIHNpZ25hbAotdGhlIGVycm9yLgotCi1JbiBQeXRob24gMi4xLCByaWNoIGNvbXBhcmlzb25zIHdlcmUgYWRkZWQgaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzCi1uZWVkLiAgUHl0aG9uIGNsYXNzZXMgY2FuIG5vdyBpbmRpdmlkdWFsbHkgb3ZlcmxvYWQgZWFjaCBvZiB0aGUKLVxjb2Rlezx9LCBcY29kZXs8PX0sIFxjb2Rlez59LCBcY29kZXs+PX0sIFxjb2Rlez09fSwgYW5kIFxjb2RleyE9fQotb3BlcmF0aW9ucy4gIFRoZSBuZXcgbWFnaWMgbWV0aG9kIG5hbWVzIGFyZToKLQotXGJlZ2lue3RhYmxlaWl9e2N8bH17Y29kZX17T3BlcmF0aW9ufXtNZXRob2QgbmFtZX0KLSAgXGxpbmVpaXs8fXtcbWV0aG9ke19fbHRfX319IFxsaW5laWl7PD19e1xtZXRob2R7X19sZV9ffX0KLSAgXGxpbmVpaXs+fXtcbWV0aG9ke19fZ3RfX319IFxsaW5laWl7Pj19e1xtZXRob2R7X19nZV9ffX0KLSAgXGxpbmVpaXs9PX17XG1ldGhvZHtfX2VxX199fSBcbGluZWlpeyE9fXtcbWV0aG9ke19fbmVfX319Ci0gIFxlbmR7dGFibGVpaX0KLQotKFRoZSBtYWdpYyBtZXRob2RzIGFyZSBuYW1lZCBhZnRlciB0aGUgY29ycmVzcG9uZGluZyBGb3J0cmFuIG9wZXJhdG9ycwotXGNvZGV7LkxULn0uIFxjb2Rley5MRS59LCBcJmMuICBOdW1lcmljIHByb2dyYW1tZXJzIGFyZSBhbG1vc3QKLWNlcnRhaW5seSBxdWl0ZSBmYW1pbGlhciB3aXRoIHRoZXNlIG5hbWVzIGFuZCB3aWxsIGZpbmQgdGhlbSBlYXN5IHRvCi1yZW1lbWJlci4pCi0gCi1FYWNoIG9mIHRoZXNlIG1hZ2ljIG1ldGhvZHMgaXMgb2YgdGhlIGZvcm0gXGNvZGV7XHZhcnttZXRob2R9KHNlbGYsCi1vdGhlcil9LCB3aGVyZSBcY29kZXtzZWxmfSB3aWxsIGJlIHRoZSBvYmplY3Qgb24gdGhlIGxlZnQtaGFuZCBzaWRlIG9mCi10aGUgb3BlcmF0b3IsIHdoaWxlIFxjb2Rle290aGVyfSB3aWxsIGJlIHRoZSBvYmplY3Qgb24gdGhlIHJpZ2h0LWhhbmQKLXNpZGUuICBGb3IgZXhhbXBsZSwgdGhlIGV4cHJlc3Npb24gXGNvZGV7QSA8IEJ9IHdpbGwgY2F1c2UKLVxjb2Rle0EuX19sdF9fKEIpfSB0byBiZSBjYWxsZWQuCi0KLUVhY2ggb2YgdGhlc2UgbWFnaWMgbWV0aG9kcyBjYW4gcmV0dXJuIGFueXRoaW5nIGF0IGFsbDogYSBCb29sZWFuLCBhCi1tYXRyaXgsIGEgbGlzdCwgb3IgYW55IG90aGVyIFB5dGhvbiBvYmplY3QuICBBbHRlcm5hdGl2ZWx5IHRoZXkgY2FuCi1yYWlzZSBhbiBleGNlcHRpb24gaWYgdGhlIGNvbXBhcmlzb24gaXMgaW1wb3NzaWJsZSwgaW5jb25zaXN0ZW50LCBvcgotb3RoZXJ3aXNlIG1lYW5pbmdsZXNzLgotCi1UaGUgYnVpbHQtaW4gXGZ1bmN0aW9ue2NtcChBLEIpfSBmdW5jdGlvbiBjYW4gdXNlIHRoZSByaWNoIGNvbXBhcmlzb24KLW1hY2hpbmVyeSwgYW5kIG5vdyBhY2NlcHRzIGFuIG9wdGlvbmFsIGFyZ3VtZW50IHNwZWNpZnlpbmcgd2hpY2gKLWNvbXBhcmlzb24gb3BlcmF0aW9uIHRvIHVzZTsgdGhpcyBpcyBnaXZlbiBhcyBvbmUgb2YgdGhlIHN0cmluZ3MKLVxjb2RleyI8In0sIFxjb2RleyI8PSJ9LCBcY29kZXsiPiJ9LCBcY29kZXsiPj0ifSwgXGNvZGV7Ij09In0sIG9yCi1cY29kZXsiIT0ifS4gIElmIGNhbGxlZCB3aXRob3V0IHRoZSBvcHRpb25hbCB0aGlyZCBhcmd1bWVudCwKLVxmdW5jdGlvbntjbXAoKX0gd2lsbCBvbmx5IHJldHVybiAtMSwgMCwgb3IgKzEgYXMgaW4gcHJldmlvdXMgdmVyc2lvbnMKLW9mIFB5dGhvbjsgb3RoZXJ3aXNlIGl0IHdpbGwgY2FsbCB0aGUgYXBwcm9wcmlhdGUgbWV0aG9kIGFuZCBjYW4KLXJldHVybiBhbnkgUHl0aG9uIG9iamVjdC4KLQotVGhlcmUgYXJlIGFsc28gY29ycmVzcG9uZGluZyBjaGFuZ2VzIG9mIGludGVyZXN0IHRvIEMgcHJvZ3JhbW1lcnM7Ci10aGVyZSdzIGEgbmV3IHNsb3QgXGNvZGV7dHBfcmljaGNtcH0gaW4gdHlwZSBvYmplY3RzIGFuZCBhbiBBUEkgZm9yCi1wZXJmb3JtaW5nIGEgZ2l2ZW4gcmljaCBjb21wYXJpc29uLiAgSSB3b24ndCBjb3ZlciB0aGUgQyBBUEkgaGVyZSwgYnV0Ci13aWxsIHJlZmVyIHlvdSB0byBQRVAgMjA3LCBvciB0byAyLjEncyBDIEFQSSBkb2N1bWVudGF0aW9uLCBmb3IgdGhlCi1mdWxsIGxpc3Qgb2YgcmVsYXRlZCBmdW5jdGlvbnMuCi0KLVxiZWdpbntzZWVhbHNvfQotCi1cc2VlcGVwezIwN317UmljaCBDb21wYXJpc2lvbnN9e1dyaXR0ZW4gYnkgR3VpZG8gdmFuIFJvc3N1bSwgaGVhdmlseQotYmFzZWQgb24gZWFybGllciB3b3JrIGJ5IERhdmlkIEFzY2hlciwgYW5kIGltcGxlbWVudGVkIGJ5IEd1aWRvIHZhbgotUm9zc3VtLn0KLQotXGVuZHtzZWVhbHNvfQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257UEVQIDIzMDogV2FybmluZyBGcmFtZXdvcmt9Ci0KLU92ZXIgaXRzIDEwIHllYXJzIG9mIGV4aXN0ZW5jZSwgUHl0aG9uIGhhcyBhY2N1bXVsYXRlZCBhIGNlcnRhaW4KLW51bWJlciBvZiBvYnNvbGV0ZSBtb2R1bGVzIGFuZCBmZWF0dXJlcyBhbG9uZyB0aGUgd2F5LiAgSXQncyBkaWZmaWN1bHQKLXRvIGtub3cgd2hlbiBhIGZlYXR1cmUgaXMgc2FmZSB0byByZW1vdmUsIHNpbmNlIHRoZXJlJ3Mgbm8gd2F5IG9mCi1rbm93aW5nIGhvdyBtdWNoIGNvZGUgdXNlcyBpdCAtLS0gcGVyaGFwcyBubyBwcm9ncmFtcyBkZXBlbmQgb24gdGhlCi1mZWF0dXJlLCBvciBwZXJoYXBzIG1hbnkgZG8uICBUbyBlbmFibGUgcmVtb3Zpbmcgb2xkIGZlYXR1cmVzIGluIGEKLW1vcmUgc3RydWN0dXJlZCB3YXksIGEgd2FybmluZyBmcmFtZXdvcmsgd2FzIGFkZGVkLiAgV2hlbiB0aGUgUHl0aG9uCi1kZXZlbG9wZXJzIHdhbnQgdG8gZ2V0IHJpZCBvZiBhIGZlYXR1cmUsIGl0IHdpbGwgZmlyc3QgdHJpZ2dlciBhCi13YXJuaW5nIGluIHRoZSBuZXh0IHZlcnNpb24gb2YgUHl0aG9uLiAgVGhlIGZvbGxvd2luZyBQeXRob24gdmVyc2lvbgotY2FuIHRoZW4gZHJvcCB0aGUgZmVhdHVyZSwgYW5kIHVzZXJzIHdpbGwgaGF2ZSBoYWQgYSBmdWxsIHJlbGVhc2UKLWN5Y2xlIHRvIHJlbW92ZSB1c2VzIG9mIHRoZSBvbGQgZmVhdHVyZS4KLQotUHl0aG9uIDIuMSBhZGRzIHRoZSB3YXJuaW5nIGZyYW1ld29yayB0byBiZSB1c2VkIGluIHRoaXMgc2NoZW1lLiAgSXQKLWFkZHMgYSBcbW9kdWxle3dhcm5pbmdzfSBtb2R1bGUgdGhhdCBwcm92aWRlIGZ1bmN0aW9ucyB0byBpc3N1ZQotd2FybmluZ3MsIGFuZCB0byBmaWx0ZXIgb3V0IHdhcm5pbmdzIHRoYXQgeW91IGRvbid0IHdhbnQgdG8gYmUKLWRpc3BsYXllZC4gVGhpcmQtcGFydHkgbW9kdWxlcyBjYW4gYWxzbyB1c2UgdGhpcyBmcmFtZXdvcmsgdG8KLWRlcHJlY2F0ZSBvbGQgZmVhdHVyZXMgdGhhdCB0aGV5IG5vIGxvbmdlciB3aXNoIHRvIHN1cHBvcnQuCi0KLUZvciBleGFtcGxlLCBpbiBQeXRob24gMi4xIHRoZSBcbW9kdWxle3JlZ2V4fSBtb2R1bGUgaXMgZGVwcmVjYXRlZCwgc28KLWltcG9ydGluZyBpdCBjYXVzZXMgYSB3YXJuaW5nIHRvIGJlIHByaW50ZWQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgcmVnZXgKLV9fbWFpbl9fOjE6IERlcHJlY2F0aW9uV2FybmluZzogdGhlIHJlZ2V4IG1vZHVsZQotICAgICAgICAgaXMgZGVwcmVjYXRlZDsgcGxlYXNlIHVzZSB0aGUgcmUgbW9kdWxlCi0+Pj4KLVxlbmR7dmVyYmF0aW19Ci0KLVdhcm5pbmdzIGNhbiBiZSBpc3N1ZWQgYnkgY2FsbGluZyB0aGUgXGZ1bmN0aW9ue3dhcm5pbmdzLndhcm59Ci1mdW5jdGlvbjoKLQotXGJlZ2lue3ZlcmJhdGltfQotd2FybmluZ3Mud2FybigiZmVhdHVyZSBYIG5vIGxvbmdlciBzdXBwb3J0ZWQiKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgd2FybmluZyBtZXNzYWdlOyBhbiBhZGRpdGlvbmFsIG9wdGlvbmFsCi1wYXJhbWV0ZXJzIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwYXJ0aWN1bGFyIHdhcm5pbmcgY2F0ZWdvcnkuCi0KLUZpbHRlcnMgY2FuIGJlIGFkZGVkIHRvIGRpc2FibGUgY2VydGFpbiB3YXJuaW5nczsgYSByZWd1bGFyIGV4cHJlc3Npb24KLXBhdHRlcm4gY2FuIGJlIGFwcGxpZWQgdG8gdGhlIG1lc3NhZ2Ugb3IgdG8gdGhlIG1vZHVsZSBuYW1lIGluIG9yZGVyCi10byBzdXBwcmVzcyBhIHdhcm5pbmcuICBGb3IgZXhhbXBsZSwgeW91IG1heSBoYXZlIGEgcHJvZ3JhbSB0aGF0IHVzZXMKLXRoZSBcbW9kdWxle3JlZ2V4fSBtb2R1bGUgYW5kIG5vdCB3YW50IHRvIHNwYXJlIHRoZSB0aW1lIHRvIGNvbnZlcnQgaXQKLXRvIHVzZSB0aGUgXG1vZHVsZXtyZX0gbW9kdWxlIHJpZ2h0IG5vdy4gIFRoZSB3YXJuaW5nIGNhbiBiZQotc3VwcHJlc3NlZCBieSBjYWxsaW5nCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCB3YXJuaW5ncwotd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoYWN0aW9uID0gJ2lnbm9yZScsCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPScuKnJlZ2V4IG1vZHVsZSBpcyBkZXByZWNhdGVkJywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSA9ICdfX21haW5fXycpCi1cZW5ke3ZlcmJhdGltfQotCi1UaGlzIGFkZHMgYSBmaWx0ZXIgdGhhdCB3aWxsIGFwcGx5IG9ubHkgdG8gd2FybmluZ3Mgb2YgdGhlIGNsYXNzCi1cY2xhc3N7RGVwcmVjYXRpb25XYXJuaW5nfSB0cmlnZ2VyZWQgaW4gdGhlIFxtb2R1bGV7X19tYWluX199IG1vZHVsZSwKLWFuZCBhcHBsaWVzIGEgcmVndWxhciBleHByZXNzaW9uIHRvIG9ubHkgbWF0Y2ggdGhlIG1lc3NhZ2UgYWJvdXQgdGhlCi1cbW9kdWxle3JlZ2V4fSBtb2R1bGUgYmVpbmcgZGVwcmVjYXRlZCwgYW5kIHdpbGwgY2F1c2Ugc3VjaCB3YXJuaW5ncwotdG8gYmUgaWdub3JlZC4gIFdhcm5pbmdzIGNhbiBhbHNvIGJlIHByaW50ZWQgb25seSBvbmNlLCBwcmludGVkIGV2ZXJ5Ci10aW1lIHRoZSBvZmZlbmRpbmcgY29kZSBpcyBleGVjdXRlZCwgb3IgdHVybmVkIGludG8gZXhjZXB0aW9ucyB0aGF0Ci13aWxsIGNhdXNlIHRoZSBwcm9ncmFtIHRvIHN0b3AgKHVubGVzcyB0aGUgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0IGluCi10aGUgdXN1YWwgd2F5LCBvZiBjb3Vyc2UpLgotCi1GdW5jdGlvbnMgd2VyZSBhbHNvIGFkZGVkIHRvIFB5dGhvbidzIEMgQVBJIGZvciBpc3N1aW5nIHdhcm5pbmdzOwotcmVmZXIgdG8gUEVQIDIzMCBvciB0byBQeXRob24ncyBBUEkgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGRldGFpbHMuCi0KLVxiZWdpbntzZWVhbHNvfSAKLQotXHNlZXBlcHs1fXtHdWlkZWxpbmVzIGZvciBMYW5ndWFnZSBFdm9sdXRpb259e1dyaXR0ZW4KLWJ5IFBhdWwgUHJlc2NvZCwgdG8gc3BlY2lmeSBwcm9jZWR1cmVzIHRvIGJlIGZvbGxvd2VkIHdoZW4gcmVtb3ZpbmcKLW9sZCBmZWF0dXJlcyBmcm9tIFB5dGhvbi4gIFRoZSBwb2xpY3kgZGVzY3JpYmVkIGluIHRoaXMgUEVQIGhhc24ndAotYmVlbiBvZmZpY2lhbGx5IGFkb3B0ZWQsIGJ1dCB0aGUgZXZlbnR1YWwgcG9saWN5IHByb2JhYmx5IHdvbid0IGJlIHRvbwotZGlmZmVyZW50IGZyb20gUHJlc2NvZCdzIHByb3Bvc2FsLn0KLQotXHNlZXBlcHsyMzB9e1dhcm5pbmcgRnJhbWV3b3JrfXtXcml0dGVuIGFuZCBpbXBsZW1lbnRlZCBieSBHdWlkbyB2YW4KLVJvc3N1bS59Ci0KLVxlbmR7c2VlYWxzb30KLSAgICAKLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntQRVAgMjI5OiBOZXcgQnVpbGQgU3lzdGVtfQotCi1XaGVuIGNvbXBpbGluZyBQeXRob24sIHRoZSB1c2VyIGhhZCB0byBnbyBpbiBhbmQgZWRpdCB0aGUKLVxmaWxle01vZHVsZXMvU2V0dXB9IGZpbGUgaW4gb3JkZXIgdG8gZW5hYmxlIHZhcmlvdXMgYWRkaXRpb25hbAotbW9kdWxlczsgdGhlIGRlZmF1bHQgc2V0IGlzIHJlbGF0aXZlbHkgc21hbGwgYW5kIGxpbWl0ZWQgdG8gbW9kdWxlcwotdGhhdCBjb21waWxlIG9uIG1vc3QgXFVOSVh7fSBwbGF0Zm9ybXMuICBUaGlzIG1lYW5zIHRoYXQgb24gXFVuaXh7fQotcGxhdGZvcm1zIHdpdGggbWFueSBtb3JlIGZlYXR1cmVzLCBtb3N0IG5vdGFibHkgTGludXgsIFB5dGhvbgotaW5zdGFsbGF0aW9ucyBvZnRlbiBkb24ndCBjb250YWluIGFsbCB1c2VmdWwgbW9kdWxlcyB0aGV5IGNvdWxkLgotCi1QeXRob24gMi4wIGFkZGVkIHRoZSBEaXN0dXRpbHMsIGEgc2V0IG9mIG1vZHVsZXMgZm9yIGRpc3RyaWJ1dGluZyBhbmQKLWluc3RhbGxpbmcgZXh0ZW5zaW9ucy4gIEluIFB5dGhvbiAyLjEsIHRoZSBEaXN0dXRpbHMgYXJlIHVzZWQgdG8KLWNvbXBpbGUgbXVjaCBvZiB0aGUgc3RhbmRhcmQgbGlicmFyeSBvZiBleHRlbnNpb24gbW9kdWxlcywKLWF1dG9kZXRlY3Rpbmcgd2hpY2ggb25lcyBhcmUgc3VwcG9ydGVkIG9uIHRoZSBjdXJyZW50IG1hY2hpbmUuICBJdCdzCi1ob3BlZCB0aGF0IHRoaXMgd2lsbCBtYWtlIFB5dGhvbiBpbnN0YWxsYXRpb25zIGVhc2llciBhbmQgbW9yZQotZmVhdHVyZWZ1bC4KLQotSW5zdGVhZCBvZiBoYXZpbmcgdG8gZWRpdCB0aGUgXGZpbGV7TW9kdWxlcy9TZXR1cH0gZmlsZSBpbiBvcmRlciB0bwotZW5hYmxlIG1vZHVsZXMsIGEgXGZpbGV7c2V0dXAucHl9IHNjcmlwdCBpbiB0aGUgdG9wIGRpcmVjdG9yeSBvZiB0aGUKLVB5dGhvbiBzb3VyY2UgZGlzdHJpYnV0aW9uIGlzIHJ1biBhdCBidWlsZCB0aW1lLCBhbmQgYXR0ZW1wdHMgdG8KLWRpc2NvdmVyIHdoaWNoIG1vZHVsZXMgY2FuIGJlIGVuYWJsZWQgYnkgZXhhbWluaW5nIHRoZSBtb2R1bGVzIGFuZAotaGVhZGVyIGZpbGVzIG9uIHRoZSBzeXN0ZW0uICBJZiBhIG1vZHVsZSBpcyBjb25maWd1cmVkIGluCi1cZmlsZXtNb2R1bGVzL1NldHVwfSwgdGhlIFxmaWxle3NldHVwLnB5fSBzY3JpcHQgd29uJ3QgYXR0ZW1wdCB0bwotY29tcGlsZSB0aGF0IG1vZHVsZSBhbmQgd2lsbCBkZWZlciB0byB0aGUgXGZpbGV7TW9kdWxlcy9TZXR1cH0gZmlsZSdzCi1jb250ZW50cy4gIFRoaXMgcHJvdmlkZXMgYSB3YXkgdG8gc3BlY2lmaWMgYW55IHN0cmFuZ2UgY29tbWFuZC1saW5lCi1mbGFncyBvciBsaWJyYXJpZXMgdGhhdCBhcmUgcmVxdWlyZWQgZm9yIGEgc3BlY2lmaWMgcGxhdGZvcm0uCi0KLUluIGFub3RoZXIgZmFyLXJlYWNoaW5nIGNoYW5nZSB0byB0aGUgYnVpbGQgbWVjaGFuaXNtLCBOZWlsCi1TY2hlbWVuYXVlciByZXN0cnVjdHVyZWQgdGhpbmdzIHNvIFB5dGhvbiBub3cgdXNlcyBhIHNpbmdsZSBtYWtlZmlsZQotdGhhdCBpc24ndCByZWN1cnNpdmUsIGluc3RlYWQgb2YgbWFrZWZpbGVzIGluIHRoZSB0b3AgZGlyZWN0b3J5IGFuZCBpbgotZWFjaCBvZiB0aGUgXGZpbGV7UHl0aG9uL30sIFxmaWxle1BhcnNlci99LCBcZmlsZXtPYmplY3RzL30sIGFuZAotXGZpbGV7TW9kdWxlcy99IHN1YmRpcmVjdG9yaWVzLiAgVGhpcyBtYWtlcyBidWlsZGluZyBQeXRob24gZmFzdGVyCi1hbmQgYWxzbyBtYWtlcyBoYWNraW5nIHRoZSBNYWtlZmlsZXMgY2xlYXJlciBhbmQgc2ltcGxlci4KLQotXGJlZ2lue3NlZWFsc299IAotCi1cc2VlcGVwezIyOX17VXNpbmcgRGlzdHV0aWxzIHRvIEJ1aWxkIFB5dGhvbn17V3JpdHRlbgotYW5kIGltcGxlbWVudGVkIGJ5IEEuTS4gS3VjaGxpbmcufQotCi1cZW5ke3NlZWFsc299Ci0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntQRVAgMjA1OiBXZWFrIFJlZmVyZW5jZXN9Ci0KLVdlYWsgcmVmZXJlbmNlcywgYXZhaWxhYmxlIHRocm91Z2ggdGhlIFxtb2R1bGV7d2Vha3JlZn0gbW9kdWxlLCBhcmUgYQotbWlub3IgYnV0IHVzZWZ1bCBuZXcgZGF0YSB0eXBlIGluIHRoZSBQeXRob24gcHJvZ3JhbW1lcidzIHRvb2xib3guCi0KLVN0b3JpbmcgYSByZWZlcmVuY2UgdG8gYW4gb2JqZWN0IChzYXksIGluIGEgZGljdGlvbmFyeSBvciBhIGxpc3QpIGhhcwotdGhlIHNpZGUgZWZmZWN0IG9mIGtlZXBpbmcgdGhhdCBvYmplY3QgYWxpdmUgZm9yZXZlci4gIFRoZXJlIGFyZSBhIGZldwotc3BlY2lmaWMgY2FzZXMgd2hlcmUgdGhpcyBiZWhhdmlvdXIgaXMgdW5kZXNpcmFibGUsIG9iamVjdCBjYWNoZXMKLWJlaW5nIHRoZSBtb3N0IGNvbW1vbiBvbmUsIGFuZCBhbm90aGVyIGJlaW5nIGNpcmN1bGFyIHJlZmVyZW5jZXMgaW4KLWRhdGEgc3RydWN0dXJlcyBzdWNoIGFzIHRyZWVzLgotCi1Gb3IgZXhhbXBsZSwgY29uc2lkZXIgYSBtZW1vaXppbmcgZnVuY3Rpb24gdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YKLWFub3RoZXIgZnVuY3Rpb24gXGZ1bmN0aW9ue2YoXHZhcnt4fSl9IGJ5IHN0b3JpbmcgdGhlIGZ1bmN0aW9uJ3MKLWFyZ3VtZW50IGFuZCBpdHMgcmVzdWx0IGluIGEgZGljdGlvbmFyeToKLQotXGJlZ2lue3ZlcmJhdGltfQotX2NhY2hlID0ge30KLWRlZiBtZW1vaXplKHgpOgotICAgIGlmIF9jYWNoZS5oYXNfa2V5KHgpOgotICAgICAgICByZXR1cm4gX2NhY2hlW3hdCi0KLSAgICByZXR2YWwgPSBmKHgpCi0KLSAgICAjIENhY2hlIHRoZSByZXR1cm5lZCBvYmplY3QKLSAgICBfY2FjaGVbeF0gPSByZXR2YWwKLQotICAgIHJldHVybiByZXR2YWwKLVxlbmR7dmVyYmF0aW19Ci0KLVRoaXMgdmVyc2lvbiB3b3JrcyBmb3Igc2ltcGxlIHRoaW5ncyBzdWNoIGFzIGludGVnZXJzLCBidXQgaXQgaGFzIGEKLXNpZGUgZWZmZWN0OyB0aGUgXGNvZGV7X2NhY2hlfSBkaWN0aW9uYXJ5IGhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZQotcmV0dXJuIHZhbHVlcywgc28gdGhleSdsbCBuZXZlciBiZSBkZWFsbG9jYXRlZCB1bnRpbCB0aGUgUHl0aG9uCi1wcm9jZXNzIGV4aXRzIGFuZCBjbGVhbnMgdXAgVGhpcyBpc24ndCB2ZXJ5IG5vdGljZWFibGUgZm9yIGludGVnZXJzLAotYnV0IGlmIFxmdW5jdGlvbntmKCl9IHJldHVybnMgYW4gb2JqZWN0LCBvciBhIGRhdGEgc3RydWN0dXJlIHRoYXQKLXRha2VzIHVwIGEgbG90IG9mIG1lbW9yeSwgdGhpcyBjYW4gYmUgYSBwcm9ibGVtLgotCi1XZWFrIHJlZmVyZW5jZXMgcHJvdmlkZSBhIHdheSB0byBpbXBsZW1lbnQgYSBjYWNoZSB0aGF0IHdvbid0IGtlZXAKLW9iamVjdHMgYWxpdmUgYmV5b25kIHRoZWlyIHRpbWUuICBJZiBhbiBvYmplY3QgaXMgb25seSBhY2Nlc3NpYmxlCi10aHJvdWdoIHdlYWsgcmVmZXJlbmNlcywgdGhlIG9iamVjdCB3aWxsIGJlIGRlYWxsb2NhdGVkIGFuZCB0aGUgd2VhawotcmVmZXJlbmNlcyB3aWxsIG5vdyBpbmRpY2F0ZSB0aGF0IHRoZSBvYmplY3QgaXQgcmVmZXJyZWQgdG8gbm8gbG9uZ2VyCi1leGlzdHMuICBBIHdlYWsgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCBcdmFye29ian0gaXMgY3JlYXRlZCBieSBjYWxsaW5nCi1cY29kZXt3ciA9IHdlYWtyZWYucmVmKFx2YXJ7b2JqfSl9LiAgVGhlIG9iamVjdCBiZWluZyByZWZlcnJlZCB0byBpcwotcmV0dXJuZWQgYnkgY2FsbGluZyB0aGUgd2VhayByZWZlcmVuY2UgYXMgaWYgaXQgd2VyZSBhIGZ1bmN0aW9uOgotXGNvZGV7d3IoKX0uICBJdCB3aWxsIHJldHVybiB0aGUgcmVmZXJlbmNlZCBvYmplY3QsIG9yIFxjb2Rle05vbmV9IGlmCi10aGUgb2JqZWN0IG5vIGxvbmdlciBleGlzdHMuIAotCi1UaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHdyaXRlIGEgXGZ1bmN0aW9ue21lbW9pemUoKX0gZnVuY3Rpb24gd2hvc2UKLWNhY2hlIGRvZXNuJ3Qga2VlcCBvYmplY3RzIGFsaXZlLCBieSBzdG9yaW5nIHdlYWsgcmVmZXJlbmNlcyBpbiB0aGUKLWNhY2hlLgotCi1cYmVnaW57dmVyYmF0aW19Ci1fY2FjaGUgPSB7fQotZGVmIG1lbW9pemUoeCk6Ci0gICAgaWYgX2NhY2hlLmhhc19rZXkoeCk6Ci0gICAgICAgIG9iaiA9IF9jYWNoZVt4XSgpCi0gICAgICAgICMgSWYgd2VhayByZWZlcmVuY2Ugb2JqZWN0IHN0aWxsIGV4aXN0cywKLSAgICAgICAgIyByZXR1cm4gaXQKLSAgICAgICAgaWYgb2JqIGlzIG5vdCBOb25lOiByZXR1cm4gb2JqCi0gCi0gICAgcmV0dmFsID0gZih4KQotCi0gICAgIyBDYWNoZSBhIHdlYWsgcmVmZXJlbmNlCi0gICAgX2NhY2hlW3hdID0gd2Vha3JlZi5yZWYocmV0dmFsKQotCi0gICAgcmV0dXJuIHJldHZhbAotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIFxtb2R1bGV7d2Vha3JlZn0gbW9kdWxlIGFsc28gYWxsb3dzIGNyZWF0aW5nIHByb3h5IG9iamVjdHMgd2hpY2gKLWJlaGF2ZSBsaWtlIHdlYWsgcmVmZXJlbmNlcyAtLS0gYW4gb2JqZWN0IHJlZmVyZW5jZWQgb25seSBieSBwcm94eQotb2JqZWN0cyBpcyBkZWFsbG9jYXRlZCAtLSBidXQgaW5zdGVhZCBvZiByZXF1aXJpbmcgYW4gZXhwbGljaXQgY2FsbCB0bwotcmV0cmlldmUgdGhlIG9iamVjdCwgdGhlIHByb3h5IHRyYW5zcGFyZW50bHkgZm9yd2FyZHMgYWxsIG9wZXJhdGlvbnMKLXRvIHRoZSBvYmplY3QgYXMgbG9uZyBhcyB0aGUgb2JqZWN0IHN0aWxsIGV4aXN0cy4gIElmIHRoZSBvYmplY3QgaXMKLWRlYWxsb2NhdGVkLCBhdHRlbXB0aW5nIHRvIHVzZSBhIHByb3h5IHdpbGwgY2F1c2UgYQotXGV4Y2VwdGlvbnt3ZWFrcmVmLlJlZmVyZW5jZUVycm9yfSBleGNlcHRpb24gdG8gYmUgcmFpc2VkLgotCi1cYmVnaW57dmVyYmF0aW19Ci1wcm94eSA9IHdlYWtyZWYucHJveHkob2JqKQotcHJveHkuYXR0ciAgICMgRXF1aXZhbGVudCB0byBvYmouYXR0cgotcHJveHkubWV0aCgpICMgRXF1aXZhbGVudCB0byBvYmoubWV0aCgpCi1kZWwgb2JqCi1wcm94eS5hdHRyICAgIyByYWlzZXMgd2Vha3JlZi5SZWZlcmVuY2VFcnJvcgotXGVuZHt2ZXJiYXRpbX0KLQotXGJlZ2lue3NlZWFsc299Ci0KLVxzZWVwZXB7MjA1fXtXZWFrIFJlZmVyZW5jZXN9e1dyaXR0ZW4gYW5kIGltcGxlbWVudGVkIGJ5Ci1GcmVkfkwuIERyYWtlLH5Kci59Ci0KLVxlbmR7c2VlYWxzb30KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue1BFUCAyMzI6IEZ1bmN0aW9uIEF0dHJpYnV0ZXN9Ci0KLUluIFB5dGhvbiAyLjEsIGZ1bmN0aW9ucyBjYW4gbm93IGhhdmUgYXJiaXRyYXJ5IGluZm9ybWF0aW9uIGF0dGFjaGVkCi10byB0aGVtLiAgUGVvcGxlIHdlcmUgb2Z0ZW4gdXNpbmcgZG9jc3RyaW5ncyB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0Ci1mdW5jdGlvbnMgYW5kIG1ldGhvZHMsIGJlY2F1c2UgdGhlIFxjb2Rle19fZG9jX199IGF0dHJpYnV0ZSB3YXMgdGhlCi1vbmx5IHdheSBvZiBhdHRhY2hpbmcgYW55IGluZm9ybWF0aW9uIHRvIGEgZnVuY3Rpb24uICBGb3IgZXhhbXBsZSwgaW4KLXRoZSBab3BlIFdlYiBhcHBsaWNhdGlvbiBzZXJ2ZXIsIGZ1bmN0aW9ucyBhcmUgbWFya2VkIGFzIHNhZmUgZm9yCi1wdWJsaWMgYWNjZXNzIGJ5IGhhdmluZyBhIGRvY3N0cmluZywgYW5kIGluIEpvaG4gQXljb2NrJ3MgU1BBUksKLXBhcnNpbmcgZnJhbWV3b3JrLCBkb2NzdHJpbmdzIGhvbGQgcGFydHMgb2YgdGhlIEJORiBncmFtbWFyIHRvIGJlCi1wYXJzZWQuICBUaGlzIG92ZXJsb2FkaW5nIGlzIHVuZm9ydHVuYXRlLCBzaW5jZSBkb2NzdHJpbmdzIGFyZSByZWFsbHkKLWludGVuZGVkIHRvIGhvbGQgYSBmdW5jdGlvbidzIGRvY3VtZW50YXRpb247IGZvciBleGFtcGxlLCBpdCBtZWFucyB5b3UKLWNhbid0IHByb3Blcmx5IGRvY3VtZW50IGZ1bmN0aW9ucyBpbnRlbmRlZCBmb3IgcHJpdmF0ZSB1c2UgaW4gWm9wZS4KLQotQXJiaXRyYXJ5IGF0dHJpYnV0ZXMgY2FuIG5vdyBiZSBzZXQgYW5kIHJldHJpZXZlZCBvbiBmdW5jdGlvbnMgdXNpbmcgdGhlCi1yZWd1bGFyIFB5dGhvbiBzeW50YXg6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWRlZiBmKCk6IHBhc3MKLQotZi5wdWJsaXNoID0gMQotZi5zZWN1cmUgPSAxCi1mLmdyYW1tYXIgPSAiQSA6Oj0gQiAoQyBEKSoiCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgZGljdGlvbmFyeSBjb250YWluaW5nIGF0dHJpYnV0ZXMgY2FuIGJlIGFjY2Vzc2VkIGFzIHRoZSBmdW5jdGlvbidzCi1cbWVtYmVye19fZGljdF9ffS4gVW5saWtlIHRoZSBcbWVtYmVye19fZGljdF9ffSBhdHRyaWJ1dGUgb2YgY2xhc3MKLWluc3RhbmNlcywgaW4gZnVuY3Rpb25zIHlvdSBjYW4gYWN0dWFsbHkgYXNzaWduIGEgbmV3IGRpY3Rpb25hcnkgdG8KLVxtZW1iZXJ7X19kaWN0X199LCB0aG91Z2ggdGhlIG5ldyB2YWx1ZSBpcyByZXN0cmljdGVkIHRvIGEgcmVndWxhcgotUHl0aG9uIGRpY3Rpb25hcnk7IHlvdSBcZW1waHtjYW4ndH0gYmUgdHJpY2t5IGFuZCBzZXQgaXQgdG8gYQotXGNsYXNze1VzZXJEaWN0fSBpbnN0YW5jZSwgb3IgYW55IG90aGVyIHJhbmRvbSBvYmplY3QgdGhhdCBiZWhhdmVzCi1saWtlIGEgbWFwcGluZy4KLQotXGJlZ2lue3NlZWFsc299Ci0KLVxzZWVwZXB7MjMyfXtGdW5jdGlvbiBBdHRyaWJ1dGVzfXtXcml0dGVuIGFuZCBpbXBsZW1lbnRlZCBieSBCYXJyeQotV2Fyc2F3Ln0KLQotXGVuZHtzZWVhbHNvfQotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVxzZWN0aW9ue1BFUCAyMzU6IEltcG9ydGluZyBNb2R1bGVzIG9uIENhc2UtSW5zZW5zaXRpdmUgUGxhdGZvcm1zfQotCi1Tb21lIG9wZXJhdGluZyBzeXN0ZW1zIGhhdmUgZmlsZXN5c3RlbXMgdGhhdCBhcmUgY2FzZS1pbnNlbnNpdGl2ZSwKLU1hY09TIGFuZCBXaW5kb3dzIGJlaW5nIHRoZSBwcmltYXJ5IGV4YW1wbGVzOyBvbiB0aGVzZSBzeXN0ZW1zLCBpdCdzCi1pbXBvc3NpYmxlIHRvIGRpc3Rpbmd1aXNoIHRoZSBmaWxlbmFtZXMgXHNhbXB7RklMRS5QWX0gYW5kCi1cc2FtcHtmaWxlLnB5fSwgZXZlbiB0aG91Z2ggdGhleSBkbyBzdG9yZSB0aGUgZmlsZSdzIG5hbWUgCi1pbiBpdHMgb3JpZ2luYWwgY2FzZSAodGhleSdyZSBjYXNlLXByZXNlcnZpbmcsIHRvbykuCi0KLUluIFB5dGhvbiAyLjEsIHRoZSBca2V5d29yZHtpbXBvcnR9IHN0YXRlbWVudCB3aWxsIHdvcmsgdG8gc2ltdWxhdGUKLWNhc2Utc2Vuc2l0aXZpdHkgb24gY2FzZS1pbnNlbnNpdGl2ZSBwbGF0Zm9ybXMuICBQeXRob24gd2lsbCBub3cKLXNlYXJjaCBmb3IgdGhlIGZpcnN0IGNhc2Utc2Vuc2l0aXZlIG1hdGNoIGJ5IGRlZmF1bHQsIHJhaXNpbmcgYW4KLVxleGNlcHRpb257SW1wb3J0RXJyb3J9IGlmIG5vIHN1Y2ggZmlsZSBpcyBmb3VuZCwgc28gXGNvZGV7aW1wb3J0IGZpbGV9Ci13aWxsIG5vdCBpbXBvcnQgYSBtb2R1bGUgbmFtZWQgXHNhbXB7RklMRS5QWX0uICBDYXNlLWluc2Vuc2l0aXZlCi1tYXRjaGluZyBjYW4gYmUgcmVxdWVzdGVkIGJ5IHNldHRpbmcgdGhlIFxlbnZ2YXJ7UFlUSE9OQ0FTRU9LfSBlbnZpcm9ubWVudAotdmFyaWFibGUgYmVmb3JlIHN0YXJ0aW5nIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIuCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntQRVAgMjE3OiBJbnRlcmFjdGl2ZSBEaXNwbGF5IEhvb2t9Ci0KLVdoZW4gdXNpbmcgdGhlIFB5dGhvbiBpbnRlcnByZXRlciBpbnRlcmFjdGl2ZWx5LCB0aGUgb3V0cHV0IG9mCi1jb21tYW5kcyBpcyBkaXNwbGF5ZWQgdXNpbmcgdGhlIGJ1aWx0LWluIFxmdW5jdGlvbntyZXByKCl9IGZ1bmN0aW9uLgotSW4gUHl0aG9uIDIuMSwgdGhlIHZhcmlhYmxlIFxmdW5jdGlvbntzeXMuZGlzcGxheWhvb2t9IGNhbiBiZSBzZXQgdG8gYQotY2FsbGFibGUgb2JqZWN0IHdoaWNoIHdpbGwgYmUgY2FsbGVkIGluc3RlYWQgb2YgXGZ1bmN0aW9ue3JlcHIoKX0uCi1Gb3IgZXhhbXBsZSwgeW91IGNhbiBzZXQgaXQgdG8gYSBzcGVjaWFsIHByZXR0eS1wcmludGluZyBmdW5jdGlvbjoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+ICMgQ3JlYXRlIGEgcmVjdXJzaXZlIGRhdGEgc3RydWN0dXJlCi0uLi4gTCA9IFsxLDIsM10KLT4+PiBMLmFwcGVuZChMKQotPj4+IEwgIyBTaG93IFB5dGhvbidzIGRlZmF1bHQgb3V0cHV0Ci1bMSwgMiwgMywgWy4uLl1dCi0+Pj4gIyBVc2UgcHByaW50LnBwcmludCgpIGFzIHRoZSBkaXNwbGF5IGZ1bmN0aW9uCi0uLi4gaW1wb3J0IHN5cywgcHByaW50Ci0+Pj4gc3lzLmRpc3BsYXlob29rID0gcHByaW50LnBwcmludAotPj4+IEwKLVsxLCAyLCAzLCAgPFJlY3Vyc2lvbiBvbiBsaXN0IHdpdGggaWQ9MTM1MTQzOTk2Pl0KLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotXGJlZ2lue3NlZWFsc299Ci0KLVxzZWVwZXB7MjE3fXtEaXNwbGF5IEhvb2sgZm9yIEludGVyYWN0aXZlIFVzZX17V3JpdHRlbiBhbmQgaW1wbGVtZW50ZWQKLWJ5IE1vc2hlIFphZGthLn0KLQotXGVuZHtzZWVhbHNvfQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257UEVQIDIwODogTmV3IENvZXJjaW9uIE1vZGVsfQotCi1Ib3cgbnVtZXJpYyBjb2VyY2lvbiBpcyBkb25lIGF0IHRoZSBDIGxldmVsIHdhcyBzaWduaWZpY2FudGx5Ci1tb2RpZmllZC4gIFRoaXMgd2lsbCBvbmx5IGFmZmVjdCB0aGUgYXV0aG9ycyBvZiBDIGV4dGVuc2lvbnMgdG8KLVB5dGhvbiwgYWxsb3dpbmcgdGhlbSBtb3JlIGZsZXhpYmlsaXR5IGluIHdyaXRpbmcgZXh0ZW5zaW9uIHR5cGVzIHRoYXQKLXN1cHBvcnQgbnVtZXJpYyBvcGVyYXRpb25zLgotCi1FeHRlbnNpb24gdHlwZXMgY2FuIG5vdyBzZXQgdGhlIHR5cGUgZmxhZyBcY29kZXtQeV9UUEZMQUdTX0NIRUNLVFlQRVN9Ci1pbiB0aGVpciBcY29kZXtQeVR5cGVPYmplY3R9IHN0cnVjdHVyZSB0byBpbmRpY2F0ZSB0aGF0IHRoZXkgc3VwcG9ydAotdGhlIG5ldyBjb2VyY2lvbiBtb2RlbC4gIEluIHN1Y2ggZXh0ZW5zaW9uIHR5cGVzLCB0aGUgbnVtZXJpYyBzbG90Ci1mdW5jdGlvbnMgY2FuIG5vIGxvbmdlciBhc3N1bWUgdGhhdCB0aGV5J2xsIGJlIHBhc3NlZCB0d28gYXJndW1lbnRzIG9mCi10aGUgc2FtZSB0eXBlOyBpbnN0ZWFkIHRoZXkgbWF5IGJlIHBhc3NlZCB0d28gYXJndW1lbnRzIG9mIGRpZmZlcmluZwotdHlwZXMsIGFuZCBjYW4gdGhlbiBwZXJmb3JtIHRoZWlyIG93biBpbnRlcm5hbCBjb2VyY2lvbi4gIElmIHRoZSBzbG90Ci1mdW5jdGlvbiBpcyBwYXNzZWQgYSB0eXBlIGl0IGNhbid0IGhhbmRsZSwgaXQgY2FuIGluZGljYXRlIHRoZSBmYWlsdXJlCi1ieSByZXR1cm5pbmcgYSByZWZlcmVuY2UgdG8gdGhlIFxjb2Rle1B5X05vdEltcGxlbWVudGVkfSBzaW5nbGV0b24KLXZhbHVlLiAgVGhlIG51bWVyaWMgZnVuY3Rpb25zIG9mIHRoZSBvdGhlciB0eXBlIHdpbGwgdGhlbiBiZSB0cmllZCwKLWFuZCBwZXJoYXBzIHRoZXkgY2FuIGhhbmRsZSB0aGUgb3BlcmF0aW9uOyBpZiB0aGUgb3RoZXIgdHlwZSBhbHNvCi1yZXR1cm5zIFxjb2Rle1B5X05vdEltcGxlbWVudGVkfSwgdGhlbiBhIFxleGNlcHRpb257VHlwZUVycm9yfSB3aWxsIGJlCi1yYWlzZWQuICBOdW1lcmljIG1ldGhvZHMgd3JpdHRlbiBpbiBQeXRob24gY2FuIGFsc28gcmV0dXJuCi1cY29kZXtQeV9Ob3RJbXBsZW1lbnRlZH0sIGNhdXNpbmcgdGhlIGludGVycHJldGVyIHRvIGFjdCBhcyBpZiB0aGUKLW1ldGhvZCBkaWQgbm90IGV4aXN0IChwZXJoYXBzIHJhaXNpbmcgYSBcZXhjZXB0aW9ue1R5cGVFcnJvcn0sIHBlcmhhcHMKLXRyeWluZyBhbm90aGVyIG9iamVjdCdzIG51bWVyaWMgbWV0aG9kcykuCi0KLVxiZWdpbntzZWVhbHNvfQotCi1cc2VlcGVwezIwOH17UmV3b3JraW5nIHRoZSBDb2VyY2lvbiBNb2RlbH17V3JpdHRlbiBhbmQgaW1wbGVtZW50ZWQgYnkKLU5laWwgU2NoZW1lbmF1ZXIsIGhlYXZpbHkgYmFzZWQgdXBvbiBlYXJsaWVyIHdvcmsgYnkgTWFyYy1BbmRyXCdlCi1MZW1idXJnLiAgUmVhZCB0aGlzIHRvIHVuZGVyc3RhbmQgdGhlIGZpbmUgcG9pbnRzIG9mIGhvdyBudW1lcmljCi1vcGVyYXRpb25zIHdpbGwgbm93IGJlIHByb2Nlc3NlZCBhdCB0aGUgQyBsZXZlbC59Ci0KLVxlbmR7c2VlYWxzb30KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue1BFUCAyNDE6IE1ldGFkYXRhIGluIFB5dGhvbiBQYWNrYWdlc30KLQotQSBjb21tb24gY29tcGxhaW50IGZyb20gUHl0aG9uIHVzZXJzIGlzIHRoYXQgdGhlcmUncyBubyBzaW5nbGUgY2F0YWxvZwotb2YgYWxsIHRoZSBQeXRob24gbW9kdWxlcyBpbiBleGlzdGVuY2UuICBULn5NaWRkbGV0b24ncyBWYXVsdHMgb2YKLVBhcm5hc3N1cyBhdCBcdXJse2h0dHA6Ly93d3cudmV4Lm5ldC9wYXJuYXNzdXMvfSBhcmUgdGhlIGxhcmdlc3QKLWNhdGFsb2cgb2YgUHl0aG9uIG1vZHVsZXMsIGJ1dCByZWdpc3RlcmluZyBzb2Z0d2FyZSBhdCB0aGUgVmF1bHRzIGlzCi1vcHRpb25hbCwgYW5kIG1hbnkgcGVvcGxlIGRvbid0IGJvdGhlci4KLQotQXMgYSBmaXJzdCBzbWFsbCBzdGVwIHRvd2FyZCBmaXhpbmcgdGhlIHByb2JsZW0sIFB5dGhvbiBzb2Z0d2FyZQotcGFja2FnZWQgdXNpbmcgdGhlIERpc3R1dGlscyBcY29tbWFuZHtzZGlzdH0gY29tbWFuZCB3aWxsIGluY2x1ZGUgYQotZmlsZSBuYW1lZCBcZmlsZXtQS0ctSU5GT30gY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGFja2FnZQotc3VjaCBhcyBpdHMgbmFtZSwgdmVyc2lvbiwgYW5kIGF1dGhvciAobWV0YWRhdGEsIGluIGNhdGFsb2d1aW5nCi10ZXJtaW5vbG9neSkuICBQRVAgMjQxIGNvbnRhaW5zIHRoZSBmdWxsIGxpc3Qgb2YgZmllbGRzIHRoYXQgY2FuIGJlCi1wcmVzZW50IGluIHRoZSBcZmlsZXtQS0ctSU5GT30gZmlsZS4gIEFzIHBlb3BsZSBiZWdhbiB0byBwYWNrYWdlIHRoZWlyCi1zb2Z0d2FyZSB1c2luZyBQeXRob24gMi4xLCBtb3JlIGFuZCBtb3JlIHBhY2thZ2VzIHdpbGwgaW5jbHVkZQotbWV0YWRhdGEsIG1ha2luZyBpdCBwb3NzaWJsZSB0byBidWlsZCBhdXRvbWF0ZWQgY2F0YWxvZ3Vpbmcgc3lzdGVtcwotYW5kIGV4cGVyaW1lbnQgd2l0aCB0aGVtLiAgV2l0aCB0aGUgcmVzdWx0IGV4cGVyaWVuY2UsIHBlcmhhcHMgaXQnbGwKLWJlIHBvc3NpYmxlIHRvIGRlc2lnbiBhIHJlYWxseSBnb29kIGNhdGFsb2cgYW5kIHRoZW4gYnVpbGQgc3VwcG9ydCBmb3IKLWl0IGludG8gUHl0aG9uIDIuMi4gIEZvciBleGFtcGxlLCB0aGUgRGlzdHV0aWxzIFxjb21tYW5ke3NkaXN0fQotYW5kIFxjb21tYW5ke2JkaXN0Xyp9IGNvbW1hbmRzIGNvdWxkIHN1cHBvcnQgYSBcb3B0aW9ue3VwbG9hZH0gb3B0aW9uCi10aGF0IHdvdWxkIGF1dG9tYXRpY2FsbHkgdXBsb2FkIHlvdXIgcGFja2FnZSB0byBhIGNhdGFsb2cgc2VydmVyLiAKLQotWW91IGNhbiBzdGFydCBjcmVhdGluZyBwYWNrYWdlcyBjb250YWluaW5nIFxmaWxle1BLRy1JTkZPfSBldmVuIGlmCi15b3UncmUgbm90IHVzaW5nIFB5dGhvbiAyLjEsIHNpbmNlIGEgbmV3IHJlbGVhc2Ugb2YgdGhlIERpc3R1dGlscyB3aWxsCi1iZSBtYWRlIGZvciB1c2VycyBvZiBlYXJsaWVyIFB5dGhvbiB2ZXJzaW9ucy4gIFZlcnNpb24gMS4wLjIgb2YgdGhlCi1EaXN0dXRpbHMgaW5jbHVkZXMgdGhlIGNoYW5nZXMgZGVzY3JpYmVkIGluIFBFUCAyNDEsIGFzIHdlbGwgYXMKLXZhcmlvdXMgYnVnZml4ZXMgYW5kIGVuaGFuY2VtZW50cy4gIEl0IHdpbGwgYmUgYXZhaWxhYmxlIGZyb20gCi10aGUgRGlzdHV0aWxzIFNJRyBhdCBcdXJse2h0dHA6Ly93d3cucHl0aG9uLm9yZy9zaWdzL2Rpc3R1dGlscy1zaWcvfS4KLQotXGJlZ2lue3NlZWFsc299Ci0KLVxzZWVwZXB7MjQxfXtNZXRhZGF0YSBmb3IgUHl0aG9uIFNvZnR3YXJlIFBhY2thZ2VzfXtXcml0dGVuIGFuZAotaW1wbGVtZW50ZWQgYnkgQS5NLiBLdWNobGluZy59Ci0KLVxzZWVwZXB7MjQzfXtNb2R1bGUgUmVwb3NpdG9yeSBVcGxvYWQgTWVjaGFuaXNtfXtXcml0dGVuIGJ5IFNlYW4KLVJlaWZzY2huZWlkZXIsIHRoaXMgZHJhZnQgUEVQIGRlc2NyaWJlcyBhIHByb3Bvc2VkIG1lY2hhbmlzbSBmb3IgdXBsb2FkaW5nIAotUHl0aG9uIHBhY2thZ2VzIHRvIGEgY2VudHJhbCBzZXJ2ZXIuCi19Ci0KLVxlbmR7c2VlYWxzb30KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue05ldyBhbmQgSW1wcm92ZWQgTW9kdWxlc30KLQotXGJlZ2lue2l0ZW1pemV9Ci0KLVxpdGVtIEthLVBpbmcgWWVlIGNvbnRyaWJ1dGVkIHR3byBuZXcgbW9kdWxlczogXG1vZHVsZXtpbnNwZWN0LnB5fSwgYQotbW9kdWxlIGZvciBnZXR0aW5nIGluZm9ybWF0aW9uIGFib3V0IGxpdmUgUHl0aG9uIGNvZGUsIGFuZAotXG1vZHVsZXtweWRvYy5weX0sIGEgbW9kdWxlIGZvciBpbnRlcmFjdGl2ZWx5IGNvbnZlcnRpbmcgZG9jc3RyaW5ncyB0bwotSFRNTCBvciB0ZXh0LiAgQXMgYSBib251cywgXGZpbGV7VG9vbHMvc2NyaXB0cy9weWRvY30sIHdoaWNoIGlzIG5vdwotYXV0b21hdGljYWxseSBpbnN0YWxsZWQsIHVzZXMgXG1vZHVsZXtweWRvYy5weX0gdG8gZGlzcGxheQotZG9jdW1lbnRhdGlvbiBnaXZlbiBhIFB5dGhvbiBtb2R1bGUsIHBhY2thZ2UsIG9yIGNsYXNzIG5hbWUuICBGb3IKLWV4YW1wbGUsIFxzYW1we3B5ZG9jIHhtbC5kb219IGRpc3BsYXlzIHRoZSBmb2xsb3dpbmc6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLVB5dGhvbiBMaWJyYXJ5IERvY3VtZW50YXRpb246IHBhY2thZ2UgeG1sLmRvbSBpbiB4bWwKLSAKLU5BTUUKLSAgICB4bWwuZG9tIC0gVzNDIERvY3VtZW50IE9iamVjdCBNb2RlbCBpbXBsZW1lbnRhdGlvbiBmb3IgUHl0aG9uLgotIAotRklMRQotICAgIC91c3IvbG9jYWwvbGliL3B5dGhvbjIuMS94bWwvZG9tL19faW5pdF9fLnB5YwotIAotREVTQ1JJUFRJT04KLSAgICBUaGUgUHl0aG9uIG1hcHBpbmcgb2YgdGhlIERvY3VtZW50IE9iamVjdCBNb2RlbCBpcyBkb2N1bWVudGVkIGluIHRoZQotICAgIFB5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZSBpbiB0aGUgc2VjdGlvbiBvbiB0aGUgeG1sLmRvbSBwYWNrYWdlLgotIAotICAgIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgZm9sbG93aW5nIG1vZHVsZXM6Ci0gICAgICAuLi4KLVxlbmR7dmVyYmF0aW19Ci0KLVxmaWxle3B5ZG9jfSBhbHNvIGluY2x1ZGVzIGEgVGstYmFzZWQgaW50ZXJhY3RpdmUgaGVscCBicm93c2VyLiAgCi1cZmlsZXtweWRvY30gcXVpY2tseSBiZWNvbWVzIGFkZGljdGl2ZTsgdHJ5IGl0IG91dCEKLQotXGl0ZW0gVHdvIGRpZmZlcmVudCBtb2R1bGVzIGZvciB1bml0IHRlc3Rpbmcgd2VyZSBhZGRlZCB0byB0aGUKLXN0YW5kYXJkIGxpYnJhcnkuICBUaGUgXG1vZHVsZXtkb2N0ZXN0fSBtb2R1bGUsIGNvbnRyaWJ1dGVkIGJ5IFRpbQotUGV0ZXJzLCBwcm92aWRlcyBhIHRlc3RpbmcgZnJhbWV3b3JrIGJhc2VkIG9uIHJ1bm5pbmcgZW1iZWRkZWQKLWV4YW1wbGVzIGluIGRvY3N0cmluZ3MgYW5kIGNvbXBhcmluZyB0aGUgcmVzdWx0cyBhZ2FpbnN0IHRoZSBleHBlY3RlZAotb3V0cHV0LiAgUHlVbml0LCBjb250cmlidXRlZCBieSBTdGV2ZSBQdXJjZWxsLCBpcyBhIHVuaXQgdGVzdGluZwotZnJhbWV3b3JrIGluc3BpcmVkIGJ5IEpVbml0LCB3aGljaCB3YXMgaW4gdHVybiBhbiBhZGFwdGF0aW9uIG9mIEtlbnQKLUJlY2sncyBTbWFsbHRhbGsgdGVzdGluZyBmcmFtZXdvcmsuICBTZWUKLVx1cmx7aHR0cDovL3B5dW5pdC5zb3VyY2Vmb3JnZS5uZXQvfSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dAotUHlVbml0LgotCi1caXRlbSBUaGUgXG1vZHVsZXtkaWZmbGlifSBtb2R1bGUgY29udGFpbnMgYSBjbGFzcywKLVxjbGFzc3tTZXF1ZW5jZU1hdGNoZXJ9LCB3aGljaCBjb21wYXJlcyB0d28gc2VxdWVuY2VzIGFuZCBjb21wdXRlcyB0aGUKLWNoYW5nZXMgcmVxdWlyZWQgdG8gdHJhbnNmb3JtIG9uZSBzZXF1ZW5jZSBpbnRvIHRoZSBvdGhlci4gIEZvcgotZXhhbXBsZSwgdGhpcyBtb2R1bGUgY2FuIGJlIHVzZWQgdG8gd3JpdGUgYSB0b29sIHNpbWlsYXIgdG8gdGhlIFxVTklYe30KLVxwcm9ncmFte2RpZmZ9IHByb2dyYW0sIGFuZCBpbiBmYWN0IHRoZSBzYW1wbGUgcHJvZ3JhbQotXGZpbGV7VG9vbHMvc2NyaXB0cy9uZGlmZi5weX0gZGVtb25zdHJhdGVzIGhvdyB0byB3cml0ZSBzdWNoIGEgc2NyaXB0LiAgCi0KLVxpdGVtIFxtb2R1bGV7Y3Vyc2VzLnBhbmVsfSwgYSB3cmFwcGVyIGZvciB0aGUgcGFuZWwgbGlicmFyeSwgcGFydCBvZgotbmN1cnNlcyBhbmQgb2YgU1lTViBjdXJzZXMsIHdhcyBjb250cmlidXRlZCBieSBUaG9tYXMgR2VsbGVrdW0uICBUaGUKLXBhbmVsIGxpYnJhcnkgcHJvdmlkZXMgd2luZG93cyB3aXRoIHRoZSBhZGRpdGlvbmFsIGZlYXR1cmUgb2YgZGVwdGguCi1XaW5kb3dzIGNhbiBiZSBtb3ZlZCBoaWdoZXIgb3IgbG93ZXIgaW4gdGhlIGRlcHRoIG9yZGVyaW5nLCBhbmQgdGhlCi1wYW5lbCBsaWJyYXJ5IGZpZ3VyZXMgb3V0IHdoZXJlIHBhbmVscyBvdmVybGFwIGFuZCB3aGljaCBzZWN0aW9ucyBhcmUKLXZpc2libGUuCi0KLVxpdGVtIFRoZSBQeVhNTCBwYWNrYWdlIGhhcyBnb25lIHRocm91Z2ggYSBmZXcgcmVsZWFzZXMgc2luY2UgUHl0aG9uCi0yLjAsIGFuZCBQeXRob24gMi4xIGluY2x1ZGVzIGFuIHVwZGF0ZWQgdmVyc2lvbiBvZiB0aGUgXG1vZHVsZXt4bWx9Ci1wYWNrYWdlLiAgU29tZSBvZiB0aGUgbm90ZXdvcnRoeSBjaGFuZ2VzIGluY2x1ZGUgc3VwcG9ydCBmb3IgRXhwYXQgMS4yCi1hbmQgbGF0ZXIgdmVyc2lvbnMsIHRoZSBhYmlsaXR5IGZvciBFeHBhdCBwYXJzZXJzIHRvIGhhbmRsZSBmaWxlcyBpbgotYW55IGVuY29kaW5nIHN1cHBvcnRlZCBieSBQeXRob24sIGFuZCB2YXJpb3VzIGJ1Z2ZpeGVzIGZvciBTQVgsIERPTSwKLWFuZCB0aGUgXG1vZHVsZXttaW5pZG9tfSBtb2R1bGUuCi0KLVxpdGVtIFBpbmcgYWxzbyBjb250cmlidXRlZCBhbm90aGVyIGhvb2sgZm9yIGhhbmRsaW5nIHVuY2F1Z2h0Ci1leGNlcHRpb25zLiAgXGZ1bmN0aW9ue3N5cy5leGNlcHRob29rfSBjYW4gYmUgc2V0IHRvIGEgY2FsbGFibGUKLW9iamVjdC4gIFdoZW4gYW4gZXhjZXB0aW9uIGlzbid0IGNhdWdodCBieSBhbnkKLVxrZXl3b3Jke3RyeX0uLi5ca2V5d29yZHtleGNlcHR9IGJsb2NrcywgdGhlIGV4Y2VwdGlvbiB3aWxsIGJlIHBhc3NlZAotdG8gXGZ1bmN0aW9ue3N5cy5leGNlcHRob29rfSwgd2hpY2ggY2FuIHRoZW4gZG8gd2hhdGV2ZXIgaXQgbGlrZXMuICBBdAotdGhlIE5pbnRoIFB5dGhvbiBDb25mZXJlbmNlLCBQaW5nIGRlbW9uc3RyYXRlZCBhbiBhcHBsaWNhdGlvbiBmb3IgdGhpcwotaG9vazogcHJpbnRpbmcgYW4gZXh0ZW5kZWQgdHJhY2ViYWNrIHRoYXQgbm90IG9ubHkgbGlzdHMgdGhlIHN0YWNrCi1mcmFtZXMsIGJ1dCBhbHNvIGxpc3RzIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMgYW5kIHRoZSBsb2NhbCB2YXJpYWJsZXMKLWZvciBlYWNoIGZyYW1lLiAgCi0KLVxpdGVtIFZhcmlvdXMgZnVuY3Rpb25zIGluIHRoZSBcbW9kdWxle3RpbWV9IG1vZHVsZSwgc3VjaCBhcwotXGZ1bmN0aW9ue2FzY3RpbWUoKX0gYW5kIFxmdW5jdGlvbntsb2NhbHRpbWUoKX0sIHJlcXVpcmUgYSBmbG9hdGluZwotcG9pbnQgYXJndW1lbnQgY29udGFpbmluZyB0aGUgdGltZSBpbiBzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaC4gIFRoZQotbW9zdCBjb21tb24gdXNlIG9mIHRoZXNlIGZ1bmN0aW9ucyBpcyB0byB3b3JrIHdpdGggdGhlIGN1cnJlbnQgdGltZSwKLXNvIHRoZSBmbG9hdGluZyBwb2ludCBhcmd1bWVudCBoYXMgYmVlbiBtYWRlIG9wdGlvbmFsOyB3aGVuIGEgdmFsdWUKLWlzbid0IHByb3ZpZGVkLCB0aGUgY3VycmVudCB0aW1lIHdpbGwgYmUgdXNlZC4gIEZvciBleGFtcGxlLCBsb2cgZmlsZQotZW50cmllcyB1c3VhbGx5IG5lZWQgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgY3VycmVudCB0aW1lOyBpbiBQeXRob24KLTIuMSwgXGNvZGV7dGltZS5hc2N0aW1lKCl9IGNhbiBiZSB1c2VkLCBpbnN0ZWFkIG9mIHRoZSBsZW5ndGhpZXIKLVxjb2Rle3RpbWUuYXNjdGltZSh0aW1lLmxvY2FsdGltZSh0aW1lLnRpbWUoKSkpfSB0aGF0IHdhcyBwcmV2aW91c2x5Ci1yZXF1aXJlZC4KLSAKLVRoaXMgY2hhbmdlIHdhcyBwcm9wb3NlZCBhbmQgaW1wbGVtZW50ZWQgYnkgVGhvbWFzIFdvdXRlcnMuCi0KLVxpdGVtIFRoZSBcbW9kdWxle2Z0cGxpYn0gbW9kdWxlIG5vdyBkZWZhdWx0cyB0byByZXRyaWV2aW5nIGZpbGVzIGluCi1wYXNzaXZlIG1vZGUsIGJlY2F1c2UgcGFzc2l2ZSBtb2RlIGlzIG1vcmUgbGlrZWx5IHRvIHdvcmsgZnJvbSBiZWhpbmQKLWEgZmlyZXdhbGwuICBUaGlzIHJlcXVlc3QgY2FtZSBmcm9tIHRoZSBEZWJpYW4gYnVnIHRyYWNraW5nIHN5c3RlbSwKLXNpbmNlIG90aGVyIERlYmlhbiBwYWNrYWdlcyB1c2UgXG1vZHVsZXtmdHBsaWJ9IHRvIHJldHJpZXZlIGZpbGVzIGFuZAotdGhlbiBkb24ndCB3b3JrIGZyb20gYmVoaW5kIGEgZmlyZXdhbGwuICBJdCdzIGRlZW1lZCB1bmxpa2VseSB0aGF0Ci10aGlzIHdpbGwgY2F1c2UgcHJvYmxlbXMgZm9yIGFueW9uZSwgYmVjYXVzZSBOZXRzY2FwZSBkZWZhdWx0cyB0bwotcGFzc2l2ZSBtb2RlIGFuZCBmZXcgcGVvcGxlIGNvbXBsYWluLCBidXQgaWYgcGFzc2l2ZSBtb2RlIGlzCi11bnN1aXRhYmxlIGZvciB5b3VyIGFwcGxpY2F0aW9uIG9yIG5ldHdvcmsgc2V0dXAsIGNhbGwKLVxtZXRob2R7c2V0X3Bhc3YoMCl9IG9uIEZUUCBvYmplY3RzIHRvIGRpc2FibGUgcGFzc2l2ZSBtb2RlLgotCi1caXRlbSBTdXBwb3J0IGZvciByYXcgc29ja2V0IGFjY2VzcyBoYXMgYmVlbiBhZGRlZCB0byB0aGUKLVxtb2R1bGV7c29ja2V0fSBtb2R1bGUsIGNvbnRyaWJ1dGVkIGJ5IEdyYW50IEVkd2FyZHMuCi0KLVxpdGVtIFRoZSBcbW9kdWxle3BzdGF0c30gbW9kdWxlIG5vdyBjb250YWlucyBhIHNpbXBsZSBpbnRlcmFjdGl2ZQotc3RhdGlzdGljcyBicm93c2VyIGZvciBkaXNwbGF5aW5nIHRpbWluZyBwcm9maWxlcyBmb3IgUHl0aG9uIHByb2dyYW1zLAotaW52b2tlZCB3aGVuIHRoZSBtb2R1bGUgaXMgcnVuIGFzIGEgc2NyaXB0LiAgQ29udHJpYnV0ZWQgYnkgCi1FcmljIFMuXCBSYXltb25kLgotCi1caXRlbSBBIG5ldyBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQgZnVuY3Rpb24sIFxmdW5jdGlvbntzeXMuX2dldGZyYW1lKFxvcHRpb25hbHtkZXB0aH0pfSwKLWhhcyBiZWVuIGFkZGVkIHRvIHJldHVybiBhIGdpdmVuIGZyYW1lIG9iamVjdCBmcm9tIHRoZSBjdXJyZW50IGNhbGwgc3RhY2suCi1cZnVuY3Rpb257c3lzLl9nZXRmcmFtZSgpfSByZXR1cm5zIHRoZSBmcmFtZSBhdCB0aGUgdG9wIG9mIHRoZSBjYWxsIHN0YWNrOyAKLWlmIHRoZSBvcHRpb25hbCBpbnRlZ2VyIGFyZ3VtZW50IFx2YXJ7ZGVwdGh9IGlzIHN1cHBsaWVkLCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgZnJhbWUKLXRoYXQgaXMgXHZhcntkZXB0aH0gY2FsbHMgYmVsb3cgdGhlIHRvcCBvZiB0aGUgc3RhY2suICBGb3IgZXhhbXBsZSwgXGNvZGV7c3lzLl9nZXRmcmFtZSgxKX0KLXJldHVybnMgdGhlIGNhbGxlcidzIGZyYW1lIG9iamVjdC4KLQotVGhpcyBmdW5jdGlvbiBpcyBvbmx5IHByZXNlbnQgaW4gQ1B5dGhvbiwgbm90IGluIEp5dGhvbiBvciB0aGUgLk5FVAotaW1wbGVtZW50YXRpb24uICBVc2UgaXQgZm9yIGRlYnVnZ2luZywgYW5kIHJlc2lzdCB0aGUgdGVtcHRhdGlvbiB0bwotcHV0IGl0IGludG8gcHJvZHVjdGlvbiBjb2RlLgotCi0KLQotXGVuZHtpdGVtaXplfQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257T3RoZXIgQ2hhbmdlcyBhbmQgRml4ZXN9Ci0KLVRoZXJlIHdlcmUgcmVsYXRpdmVseSBmZXcgc21hbGxlciBjaGFuZ2VzIG1hZGUgaW4gUHl0aG9uIDIuMSBkdWUgdG8KLXRoZSBzaG9ydGVyIHJlbGVhc2UgY3ljbGUuICBBIHNlYXJjaCB0aHJvdWdoIHRoZSBDVlMgY2hhbmdlIGxvZ3MgdHVybnMKLXVwIDExNyBwYXRjaGVzIGFwcGxpZWQsIGFuZCAxMzYgYnVncyBmaXhlZDsgYm90aCBmaWd1cmVzIGFyZSBsaWtlbHkgdG8KLWJlIHVuZGVyZXN0aW1hdGVzLiAgU29tZSBvZiB0aGUgbW9yZSBub3RhYmxlIGNoYW5nZXMgYXJlOgotCi1cYmVnaW57aXRlbWl6ZX0KLQotCi1caXRlbSBBIHNwZWNpYWxpemVkIG9iamVjdCBhbGxvY2F0b3IgaXMgbm93IG9wdGlvbmFsbHkgYXZhaWxhYmxlLCB0aGF0Ci1zaG91bGQgYmUgZmFzdGVyIHRoYW4gdGhlIHN5c3RlbSBcZnVuY3Rpb257bWFsbG9jKCl9IGFuZCBoYXZlIGxlc3MKLW1lbW9yeSBvdmVyaGVhZC4gIFRoZSBhbGxvY2F0b3IgdXNlcyBDJ3MgXGZ1bmN0aW9ue21hbGxvYygpfSBmdW5jdGlvbgotdG8gZ2V0IGxhcmdlIHBvb2xzIG9mIG1lbW9yeSwgYW5kIHRoZW4gZnVsZmlsbHMgc21hbGxlciBtZW1vcnkKLXJlcXVlc3RzIGZyb20gdGhlc2UgcG9vbHMuICBJdCBjYW4gYmUgZW5hYmxlZCBieSBwcm92aWRpbmcgdGhlCi1cbG9uZ3Byb2dyYW1vcHR7d2l0aC1weW1hbGxvY30gb3B0aW9uIHRvIHRoZSBccHJvZ3JhbXtjb25maWd1cmV9IHNjcmlwdDsgc2VlCi1cZmlsZXtPYmplY3RzL29ibWFsbG9jLmN9IGZvciB0aGUgaW1wbGVtZW50YXRpb24gZGV0YWlscy4gIAotCi1BdXRob3JzIG9mIEMgZXh0ZW5zaW9uIG1vZHVsZXMgc2hvdWxkIHRlc3QgdGhlaXIgY29kZSB3aXRoIHRoZSBvYmplY3QKLWFsbG9jYXRvciBlbmFibGVkLCBiZWNhdXNlIHNvbWUgaW5jb3JyZWN0IGNvZGUgbWF5IGJyZWFrLCBjYXVzaW5nIGNvcmUKLWR1bXBzIGF0IHJ1bnRpbWUuICBUaGVyZSBhcmUgYSBidW5jaCBvZiBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMgaW4KLVB5dGhvbidzIEMgQVBJIHRoYXQgaGF2ZSBwcmV2aW91c2x5IGJlZW4ganVzdCBhbGlhc2VzIGZvciB0aGUgQwotbGlicmFyeSdzIFxmdW5jdGlvbnttYWxsb2MoKX0gYW5kIFxmdW5jdGlvbntmcmVlKCl9LCBtZWFuaW5nIHRoYXQgaWYKLXlvdSBhY2NpZGVudGFsbHkgY2FsbGVkIG1pc21hdGNoZWQgZnVuY3Rpb25zLCB0aGUgZXJyb3Igd291bGRuJ3QgYmUKLW5vdGljZWFibGUuICBXaGVuIHRoZSBvYmplY3QgYWxsb2NhdG9yIGlzIGVuYWJsZWQsIHRoZXNlIGZ1bmN0aW9ucwotYXJlbid0IGFsaWFzZXMgb2YgXGZ1bmN0aW9ue21hbGxvYygpfSBhbmQgXGZ1bmN0aW9ue2ZyZWUoKX0gYW55IG1vcmUsCi1hbmQgY2FsbGluZyB0aGUgd3JvbmcgZnVuY3Rpb24gdG8gZnJlZSBtZW1vcnkgd2lsbCBnZXQgeW91IGEgY29yZQotZHVtcC4gIEZvciBleGFtcGxlLCBpZiBtZW1vcnkgd2FzIGFsbG9jYXRlZCB1c2luZwotXGZ1bmN0aW9ue1B5TWVtX05ldygpfSwgaXQgaGFzIHRvIGJlIGZyZWVkIHVzaW5nCi1cZnVuY3Rpb257UHlNZW1fRGVsKCl9LCBub3QgXGZ1bmN0aW9ue2ZyZWUoKX0uICBBIGZldyBtb2R1bGVzIGluY2x1ZGVkCi13aXRoIFB5dGhvbiBmZWxsIGFmb3VsIG9mIHRoaXMgYW5kIGhhZCB0byBiZSBmaXhlZDsgZG91YnRsZXNzIHRoZXJlCi1hcmUgbW9yZSB0aGlyZC1wYXJ0eSBtb2R1bGVzIHRoYXQgd2lsbCBoYXZlIHRoZSBzYW1lIHByb2JsZW0uCi0KLVRoZSBvYmplY3QgYWxsb2NhdG9yIHdhcyBjb250cmlidXRlZCBieSBWbGFkaW1pciBNYXJhbmdvem92LgotCi1caXRlbSBUaGUgc3BlZWQgb2YgbGluZS1vcmllbnRlZCBmaWxlIEkvTyBoYXMgYmVlbiBpbXByb3ZlZCBiZWNhdXNlCi1wZW9wbGUgb2Z0ZW4gY29tcGxhaW4gYWJvdXQgaXRzIGxhY2sgb2Ygc3BlZWQsIGFuZCBiZWNhdXNlIGl0J3Mgb2Z0ZW4KLWJlZW4gdXNlZCBhcyBhIG5hXCJpdmUgYmVuY2htYXJrLiAgVGhlIFxtZXRob2R7cmVhZGxpbmUoKX0gbWV0aG9kIG9mCi1maWxlIG9iamVjdHMgaGFzIHRoZXJlZm9yZSBiZWVuIHJld3JpdHRlbiB0byBiZSBtdWNoIGZhc3Rlci4gIFRoZQotZXhhY3QgYW1vdW50IG9mIHRoZSBzcGVlZHVwIHdpbGwgdmFyeSBmcm9tIHBsYXRmb3JtIHRvIHBsYXRmb3JtCi1kZXBlbmRpbmcgb24gaG93IHNsb3cgdGhlIEMgbGlicmFyeSdzIFxmdW5jdGlvbntnZXRjKCl9IHdhcywgYnV0IGlzCi1hcm91bmQgNjZcJSwgYW5kIHBvdGVudGlhbGx5IG11Y2ggZmFzdGVyIG9uIHNvbWUgcGFydGljdWxhciBvcGVyYXRpbmcKLXN5c3RlbXMuICBUaW0gUGV0ZXJzIGRpZCBtdWNoIG9mIHRoZSBiZW5jaG1hcmtpbmcgYW5kIGNvZGluZyBmb3IgdGhpcwotY2hhbmdlLCBtb3RpdmF0ZWQgYnkgYSBkaXNjdXNzaW9uIGluIGNvbXAubGFuZy5weXRob24uCi0KLUEgbmV3IG1vZHVsZSBhbmQgbWV0aG9kIGZvciBmaWxlIG9iamVjdHMgd2FzIGFsc28gYWRkZWQsIGNvbnRyaWJ1dGVkCi1ieSBKZWZmIEVwbGVyLiBUaGUgbmV3IG1ldGhvZCwgXG1ldGhvZHt4cmVhZGxpbmVzKCl9LCBpcyBzaW1pbGFyIHRvCi10aGUgZXhpc3RpbmcgXGZ1bmN0aW9ue3hyYW5nZSgpfSBidWlsdC1pbi4gIFxmdW5jdGlvbnt4cmVhZGxpbmVzKCl9Ci1yZXR1cm5zIGFuIG9wYXF1ZSBzZXF1ZW5jZSBvYmplY3QgdGhhdCBvbmx5IHN1cHBvcnRzIGJlaW5nIGl0ZXJhdGVkCi1vdmVyLCByZWFkaW5nIGEgbGluZSBvbiBldmVyeSBpdGVyYXRpb24gYnV0IG5vdCByZWFkaW5nIHRoZSBlbnRpcmUKLWZpbGUgaW50byBtZW1vcnkgYXMgdGhlIGV4aXN0aW5nIFxtZXRob2R7cmVhZGxpbmVzKCl9IG1ldGhvZCBkb2VzLgotWW91J2QgdXNlIGl0IGxpa2UgdGhpczoKLQotXGJlZ2lue3ZlcmJhdGltfQotZm9yIGxpbmUgaW4gc3lzLnN0ZGluLnhyZWFkbGluZXMoKToKLSAgICAjIC4uLiBkbyBzb21ldGhpbmcgZm9yIGVhY2ggbGluZSAuLi4KLSAgICAuLi4KLVxlbmR7dmVyYmF0aW19Ci0KLUZvciBhIGZ1bGxlciBkaXNjdXNzaW9uIG9mIHRoZSBsaW5lIEkvTyBjaGFuZ2VzLCBzZWUgdGhlIHB5dGhvbi1kZXYKLXN1bW1hcnkgZm9yIEphbnVhcnkgMS0xNSwgMjAwMSBhdAotXHVybHtodHRwOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3N1bW1hcnkvMjAwMS0wMS0xLmh0bWx9LgotCi1caXRlbSBBIG5ldyBtZXRob2QsIFxtZXRob2R7cG9waXRlbSgpfSwgd2FzIGFkZGVkIHRvIGRpY3Rpb25hcmllcyB0bwotZW5hYmxlIGRlc3RydWN0aXZlbHkgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGNvbnRlbnRzIG9mIGEgZGljdGlvbmFyeTsKLXRoaXMgY2FuIGJlIGZhc3RlciBmb3IgbGFyZ2UgZGljdGlvbmFyaWVzIGJlY2F1c2UgdGhlcmUncyBubyBuZWVkIHRvCi1jb25zdHJ1Y3QgYSBsaXN0IGNvbnRhaW5pbmcgYWxsIHRoZSBrZXlzIG9yIHZhbHVlcy4KLVxjb2Rle0QucG9waXRlbSgpfSByZW1vdmVzIGEgcmFuZG9tIFxjb2RleyhcdmFye2tleX0sIFx2YXJ7dmFsdWV9KX0KLXBhaXIgZnJvbSB0aGUgZGljdGlvbmFyeX5cY29kZXtEfSBhbmQgcmV0dXJucyBpdCBhcyBhIDItdHVwbGUuICBUaGlzCi13YXMgaW1wbGVtZW50ZWQgbW9zdGx5IGJ5IFRpbSBQZXRlcnMgYW5kIEd1aWRvIHZhbiBSb3NzdW0sIGFmdGVyIGEKLXN1Z2dlc3Rpb24gYW5kIHByZWxpbWluYXJ5IHBhdGNoIGJ5IE1vc2hlIFphZGthLgotIAotXGl0ZW0gTW9kdWxlcyBjYW4gbm93IGNvbnRyb2wgd2hpY2ggbmFtZXMgYXJlIGltcG9ydGVkIHdoZW4gXGNvZGV7ZnJvbQotXHZhcnttb2R1bGV9IGltcG9ydCAqfSBpcyB1c2VkLCBieSBkZWZpbmluZyBhbiBcY29kZXtfX2FsbF9ffQotYXR0cmlidXRlIGNvbnRhaW5pbmcgYSBsaXN0IG9mIG5hbWVzIHRoYXQgd2lsbCBiZSBpbXBvcnRlZC4gIE9uZQotY29tbW9uIGNvbXBsYWludCBpcyB0aGF0IGlmIHRoZSBtb2R1bGUgaW1wb3J0cyBvdGhlciBtb2R1bGVzIHN1Y2ggYXMKLVxtb2R1bGV7c3lzfSBvciBcbW9kdWxle3N0cmluZ30sIFxjb2Rle2Zyb20gXHZhcnttb2R1bGV9IGltcG9ydCAqfQotd2lsbCBhZGQgdGhlbSB0byB0aGUgaW1wb3J0aW5nIG1vZHVsZSdzIG5hbWVzcGFjZS4gIFRvIGZpeCB0aGlzLAotc2ltcGx5IGxpc3QgdGhlIHB1YmxpYyBuYW1lcyBpbiBcY29kZXtfX2FsbF9ffToKLQotXGJlZ2lue3ZlcmJhdGltfQotIyBMaXN0IHB1YmxpYyBuYW1lcwotX19hbGxfXyA9IFsnRGF0YWJhc2UnLCAnb3BlbiddCi1cZW5ke3ZlcmJhdGltfQotCi1BIHN0cmljdGVyIHZlcnNpb24gb2YgdGhpcyBwYXRjaCB3YXMgZmlyc3Qgc3VnZ2VzdGVkIGFuZCBpbXBsZW1lbnRlZAotYnkgQmVuIFdvbGZzb24sIGJ1dCBhZnRlciBzb21lIHB5dGhvbi1kZXYgZGlzY3Vzc2lvbiwgYSB3ZWFrZXIgZmluYWwKLXZlcnNpb24gd2FzIGNoZWNrZWQgaW4uCi0KLVxpdGVtIEFwcGx5aW5nIFxmdW5jdGlvbntyZXByKCl9IHRvIHN0cmluZ3MgcHJldmlvdXNseSB1c2VkIG9jdGFsCi1lc2NhcGVzIGZvciBub24tcHJpbnRhYmxlIGNoYXJhY3RlcnM7IGZvciBleGFtcGxlLCBhIG5ld2xpbmUgd2FzCi1cY29kZXsnXGUgMDEyJ30uICBUaGlzIHdhcyBhIHZlc3RpZ2lhbCB0cmFjZSBvZiBQeXRob24ncyBDIGFuY2VzdHJ5LCBidXQKLXRvZGF5IG9jdGFsIGlzIG9mIHZlcnkgbGl0dGxlIHByYWN0aWNhbCB1c2UuICBLYS1QaW5nIFllZSBzdWdnZXN0ZWQKLXVzaW5nIGhleCBlc2NhcGVzIGluc3RlYWQgb2Ygb2N0YWwgb25lcywgYW5kIHVzaW5nIHRoZSBcY29kZXtcZSBufSwKLVxjb2Rle1xlIHR9LCBcY29kZXtcZSByfSBlc2NhcGVzIGZvciB0aGUgYXBwcm9wcmlhdGUgY2hhcmFjdGVycywgYW5kCi1pbXBsZW1lbnRlZCB0aGlzIG5ldyBmb3JtYXR0aW5nLgotCi1caXRlbSBTeW50YXggZXJyb3JzIGRldGVjdGVkIGF0IGNvbXBpbGUtdGltZSBjYW4gbm93IHJhaXNlIGV4Y2VwdGlvbnMKLWNvbnRhaW5pbmcgdGhlIGZpbGVuYW1lIGFuZCBsaW5lIG51bWJlciBvZiB0aGUgZXJyb3IsIGEgcGxlYXNhbnQgc2lkZQotZWZmZWN0IG9mIHRoZSBjb21waWxlciByZW9yZ2FuaXphdGlvbiBkb25lIGJ5IEplcmVteSBIeWx0b24uCi0KLVxpdGVtIEMgZXh0ZW5zaW9ucyB3aGljaCBpbXBvcnQgb3RoZXIgbW9kdWxlcyBoYXZlIGJlZW4gY2hhbmdlZCB0byB1c2UKLVxmdW5jdGlvbntQeUltcG9ydF9JbXBvcnRNb2R1bGUoKX0sIHdoaWNoIG1lYW5zIHRoYXQgdGhleSB3aWxsIHVzZSBhbnkKLWltcG9ydCBob29rcyB0aGF0IGhhdmUgYmVlbiBpbnN0YWxsZWQuICBUaGlzIGlzIGFsc28gZW5jb3VyYWdlZCBmb3IKLXRoaXJkLXBhcnR5IGV4dGVuc2lvbnMgdGhhdCBuZWVkIHRvIGltcG9ydCBzb21lIG90aGVyIG1vZHVsZSBmcm9tIEMKLWNvZGUuICAKLQotXGl0ZW0gVGhlIHNpemUgb2YgdGhlIFVuaWNvZGUgY2hhcmFjdGVyIGRhdGFiYXNlIHdhcyBzaHJ1bmsgYnkgYW5vdGhlcgotMzQwSyB0aGFua3MgdG8gRnJlZHJpayBMdW5kaC4KLQotXGl0ZW0gU29tZSBuZXcgcG9ydHMgd2VyZSBjb250cmlidXRlZDogTWFjT1MgWCAoYnkgU3RldmVuIE1hamV3c2tpKSwKLUN5Z3dpbiAoYnkgSmFzb24gVGlzaGxlcik7IFJJU0NPUyAoYnkgRGlldG1hciBTY2h3ZXJ0YmVyZ2VyKTsgVW5peHdhcmV+NyAKLShieSBCaWxseSBHLiBBbGxpZSkuCi0KLVxlbmR7aXRlbWl6ZX0KLQotQW5kIHRoZXJlJ3MgdGhlIHVzdWFsIGxpc3Qgb2YgbWlub3IgYnVnZml4ZXMsIG1pbm9yIG1lbW9yeSBsZWFrcywKLWRvY3N0cmluZyBlZGl0cywgYW5kIG90aGVyIHR3ZWFrcywgdG9vIGxlbmd0aHkgdG8gYmUgd29ydGggaXRlbWl6aW5nOwotc2VlIHRoZSBDVlMgbG9ncyBmb3IgdGhlIGZ1bGwgZGV0YWlscyBpZiB5b3Ugd2FudCB0aGVtLgotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntBY2tub3dsZWRnZW1lbnRzfQotCi1UaGUgYXV0aG9yIHdvdWxkIGxpa2UgdG8gdGhhbmsgdGhlIGZvbGxvd2luZyBwZW9wbGUgZm9yIG9mZmVyaW5nCi1zdWdnZXN0aW9ucyBvbiB2YXJpb3VzIGRyYWZ0cyBvZiB0aGlzIGFydGljbGU6IEdyYWVtZSBDcm9zcywgRGF2aWQKLUdvb2RnZXIsIEpheSBHcmF2ZXMsIE1pY2hhZWwgSHVkc29uLCBNYXJjLUFuZHJcJ2UgTGVtYnVyZywgRnJlZHJpawotTHVuZGgsIE5laWwgU2NoZW1lbmF1ZXIsIFRob21hcyBXb3V0ZXJzLgotCi1cZW5ke2RvY3VtZW50fQpkaWZmIC0tZ2l0IGEvRG9jL3doYXRzbmV3L3doYXRzbmV3MjIudGV4IGIvRG9jL3doYXRzbmV3L3doYXRzbmV3MjIudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmZmMDYxLi4wMDAwMDAwCi0tLSBhL0RvYy93aGF0c25ldy93aGF0c25ldzIyLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDE0NjYgKzAsMCBAQAotXGRvY3VtZW50Y2xhc3N7aG93dG99Ci0KLSUgJElkJAotCi1cdGl0bGV7V2hhdCdzIE5ldyBpbiBQeXRob24gMi4yfQotXHJlbGVhc2V7MS4wMn0KLVxhdXRob3J7QS5NLiBLdWNobGluZ30KLVxhdXRob3JhZGRyZXNzewotCVxzdHJvbmd7UHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb259XFwKLQlFbWFpbDogXGVtYWlse2Fta0BhbWsuY2F9Ci19Ci1cYmVnaW57ZG9jdW1lbnR9Ci1cbWFrZXRpdGxlXHRhYmxlb2Zjb250ZW50cwotCi1cc2VjdGlvbntJbnRyb2R1Y3Rpb259Ci0KLVRoaXMgYXJ0aWNsZSBleHBsYWlucyB0aGUgbmV3IGZlYXR1cmVzIGluIFB5dGhvbiAyLjIuMiwgcmVsZWFzZWQgb24KLU9jdG9iZXIgMTQsIDIwMDIuICBQeXRob24gMi4yLjIgaXMgYSBidWdmaXggcmVsZWFzZSBvZiBQeXRob24gMi4yLAotb3JpZ2luYWxseSByZWxlYXNlZCBvbiBEZWNlbWJlciAyMSwgMjAwMS4KLQotUHl0aG9uIDIuMiBjYW4gYmUgdGhvdWdodCBvZiBhcyB0aGUgImNsZWFudXAgcmVsZWFzZSIuICBUaGVyZSBhcmUgc29tZQotZmVhdHVyZXMgc3VjaCBhcyBnZW5lcmF0b3JzIGFuZCBpdGVyYXRvcnMgdGhhdCBhcmUgY29tcGxldGVseSBuZXcsIGJ1dAotbW9zdCBvZiB0aGUgY2hhbmdlcywgc2lnbmlmaWNhbnQgYW5kIGZhci1yZWFjaGluZyB0aG91Z2ggdGhleSBtYXkgYmUsCi1hcmUgYWltZWQgYXQgY2xlYW5pbmcgdXAgaXJyZWd1bGFyaXRpZXMgYW5kIGRhcmsgY29ybmVycyBvZiB0aGUKLWxhbmd1YWdlIGRlc2lnbi4KLQotVGhpcyBhcnRpY2xlIGRvZXNuJ3QgYXR0ZW1wdCB0byBwcm92aWRlIGEgY29tcGxldGUgc3BlY2lmaWNhdGlvbiBvZgotdGhlIG5ldyBmZWF0dXJlcywgYnV0IGluc3RlYWQgcHJvdmlkZXMgYSBjb252ZW5pZW50IG92ZXJ2aWV3LiAgRm9yCi1mdWxsIGRldGFpbHMsIHlvdSBzaG91bGQgcmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gZm9yIFB5dGhvbiAyLjIsCi1zdWNoIGFzIHRoZQotXGNpdGV0aXRsZVtodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jLzIuMi9saWIvbGliLmh0bWxde1B5dGhvbgotTGlicmFyeSBSZWZlcmVuY2V9IGFuZCB0aGUKLVxjaXRldGl0bGVbaHR0cDovL3d3dy5weXRob24ub3JnL2RvYy8yLjIvcmVmL3JlZi5odG1sXXtQeXRob24KLVJlZmVyZW5jZSBNYW51YWx9LiAgSWYgeW91IHdhbnQgdG8gdW5kZXJzdGFuZCB0aGUgY29tcGxldGUKLWltcGxlbWVudGF0aW9uIGFuZCBkZXNpZ24gcmF0aW9uYWxlIGZvciBhIGNoYW5nZSwgcmVmZXIgdG8gdGhlIFBFUCBmb3IKLWEgcGFydGljdWxhciBuZXcgZmVhdHVyZS4KLQotXGJlZ2lue3NlZWFsc299Ci0KLVxzZWV1cmx7aHR0cDovL3d3dy51bml4cmV2aWV3LmNvbS9kb2N1bWVudHMvcz0xMzU2L3VybTAxMDloLzAxMDloLmh0bX0KLXtgYFdoYXQncyBTbyBTcGVjaWFsIEFib3V0IFB5dGhvbiAyLjI/JycgaXMgYWxzbyBhYm91dCB0aGUgbmV3IDIuMgotZmVhdHVyZXMsIGFuZCB3YXMgd3JpdHRlbiBieSBDYW1lcm9uIExhaXJkIGFuZCBLYXRocnluIFNvcmFpei59Ci0KLVxlbmR7c2VlYWxzb30KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257UEVQcyAyNTIgYW5kIDI1MzogVHlwZSBhbmQgQ2xhc3MgQ2hhbmdlc30KLQotVGhlIGxhcmdlc3QgYW5kIG1vc3QgZmFyLXJlYWNoaW5nIGNoYW5nZXMgaW4gUHl0aG9uIDIuMiBhcmUgdG8KLVB5dGhvbidzIG1vZGVsIG9mIG9iamVjdHMgYW5kIGNsYXNzZXMuICBUaGUgY2hhbmdlcyBzaG91bGQgYmUgYmFja3dhcmQKLWNvbXBhdGlibGUsIHNvIGl0J3MgbGlrZWx5IHRoYXQgeW91ciBjb2RlIHdpbGwgY29udGludWUgdG8gcnVuCi11bmNoYW5nZWQsIGJ1dCB0aGUgY2hhbmdlcyBwcm92aWRlIHNvbWUgYW1hemluZyBuZXcgY2FwYWJpbGl0aWVzLgotQmVmb3JlIGJlZ2lubmluZyB0aGlzLCB0aGUgbG9uZ2VzdCBhbmQgbW9zdCBjb21wbGljYXRlZCBzZWN0aW9uIG9mCi10aGlzIGFydGljbGUsIEknbGwgcHJvdmlkZSBhbiBvdmVydmlldyBvZiB0aGUgY2hhbmdlcyBhbmQgb2ZmZXIgc29tZQotY29tbWVudHMuCi0KLUEgbG9uZyB0aW1lIGFnbyBJIHdyb3RlIGEgV2ViIHBhZ2UKLShcdXJse2h0dHA6Ly93d3cuYW1rLmNhL3B5dGhvbi93cml0aW5nL3dhcnRzLmh0bWx9KSBsaXN0aW5nIGZsYXdzIGluCi1QeXRob24ncyBkZXNpZ24uICBPbmUgb2YgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgZmxhd3Mgd2FzIHRoYXQgaXQncwotaW1wb3NzaWJsZSB0byBzdWJjbGFzcyBQeXRob24gdHlwZXMgaW1wbGVtZW50ZWQgaW4gQy4gIEluIHBhcnRpY3VsYXIsCi1pdCdzIG5vdCBwb3NzaWJsZSB0byBzdWJjbGFzcyBidWlsdC1pbiB0eXBlcywgc28geW91IGNhbid0IGp1c3QKLXN1YmNsYXNzLCBzYXksIGxpc3RzIGluIG9yZGVyIHRvIGFkZCBhIHNpbmdsZSB1c2VmdWwgbWV0aG9kIHRvIHRoZW0uCi1UaGUgXG1vZHVsZXtVc2VyTGlzdH0gbW9kdWxlIHByb3ZpZGVzIGEgY2xhc3MgdGhhdCBzdXBwb3J0cyBhbGwgb2YgdGhlCi1tZXRob2RzIG9mIGxpc3RzIGFuZCB0aGF0IGNhbiBiZSBzdWJjbGFzc2VkIGZ1cnRoZXIsIGJ1dCB0aGVyZSdzIGxvdHMKLW9mIEMgY29kZSB0aGF0IGV4cGVjdHMgYSByZWd1bGFyIFB5dGhvbiBsaXN0IGFuZCB3b24ndCBhY2NlcHQgYQotXGNsYXNze1VzZXJMaXN0fSBpbnN0YW5jZS4KLQotUHl0aG9uIDIuMiBmaXhlcyB0aGlzLCBhbmQgaW4gdGhlIHByb2Nlc3MgYWRkcyBzb21lIGV4Y2l0aW5nIG5ldwotY2FwYWJpbGl0aWVzLiAgQSBicmllZiBzdW1tYXJ5OgotCi1cYmVnaW57aXRlbWl6ZX0KLQotXGl0ZW0gWW91IGNhbiBzdWJjbGFzcyBidWlsdC1pbiB0eXBlcyBzdWNoIGFzIGxpc3RzIGFuZCBldmVuIGludGVnZXJzLAotYW5kIHlvdXIgc3ViY2xhc3NlcyBzaG91bGQgd29yayBpbiBldmVyeSBwbGFjZSB0aGF0IHJlcXVpcmVzIHRoZQotb3JpZ2luYWwgdHlwZS4KLQotXGl0ZW0gSXQncyBub3cgcG9zc2libGUgdG8gZGVmaW5lIHN0YXRpYyBhbmQgY2xhc3MgbWV0aG9kcywgaW4gYWRkaXRpb24KLXRvIHRoZSBpbnN0YW5jZSBtZXRob2RzIGF2YWlsYWJsZSBpbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBQeXRob24uCi0KLVxpdGVtIEl0J3MgYWxzbyBwb3NzaWJsZSB0byBhdXRvbWF0aWNhbGx5IGNhbGwgbWV0aG9kcyBvbiBhY2Nlc3Npbmcgb3IKLXNldHRpbmcgYW4gaW5zdGFuY2UgYXR0cmlidXRlIGJ5IHVzaW5nIGEgbmV3IG1lY2hhbmlzbSBjYWxsZWQKLVxkZm57cHJvcGVydGllc30uICBNYW55IHVzZXMgb2YgXG1ldGhvZHtfX2dldGF0dHJfX30gY2FuIGJlIHJld3JpdHRlbgotdG8gdXNlIHByb3BlcnRpZXMgaW5zdGVhZCwgbWFraW5nIHRoZSByZXN1bHRpbmcgY29kZSBzaW1wbGVyIGFuZAotZmFzdGVyLiAgQXMgYSBzbWFsbCBzaWRlIGJlbmVmaXQsIGF0dHJpYnV0ZXMgY2FuIG5vdyBoYXZlIGRvY3N0cmluZ3MsCi10b28uCi0KLVxpdGVtIFRoZSBsaXN0IG9mIGxlZ2FsIGF0dHJpYnV0ZXMgZm9yIGFuIGluc3RhbmNlIGNhbiBiZSBsaW1pdGVkIHRvIGEKLXBhcnRpY3VsYXIgc2V0IHVzaW5nIFxkZm57c2xvdHN9LCBtYWtpbmcgaXQgcG9zc2libGUgdG8gc2FmZWd1YXJkCi1hZ2FpbnN0IHR5cG9zIGFuZCBwZXJoYXBzIG1ha2UgbW9yZSBvcHRpbWl6YXRpb25zIHBvc3NpYmxlIGluIGZ1dHVyZQotdmVyc2lvbnMgb2YgUHl0aG9uLgotCi1cZW5ke2l0ZW1pemV9Ci0KLVNvbWUgdXNlcnMgaGF2ZSB2b2ljZWQgY29uY2VybiBhYm91dCBhbGwgdGhlc2UgY2hhbmdlcy4gIFN1cmUsIHRoZXkKLXNheSwgdGhlIG5ldyBmZWF0dXJlcyBhcmUgbmVhdCBhbmQgbGVuZCB0aGVtc2VsdmVzIHRvIGFsbCBzb3J0cyBvZgotdHJpY2tzIHRoYXQgd2VyZW4ndCBwb3NzaWJsZSBpbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBQeXRob24sIGJ1dAotdGhleSBhbHNvIG1ha2UgdGhlIGxhbmd1YWdlIG1vcmUgY29tcGxpY2F0ZWQuICBTb21lIHBlb3BsZSBoYXZlIHNhaWQKLXRoYXQgdGhleSd2ZSBhbHdheXMgcmVjb21tZW5kZWQgUHl0aG9uIGZvciBpdHMgc2ltcGxpY2l0eSwgYW5kIGZlZWwKLXRoYXQgaXRzIHNpbXBsaWNpdHkgaXMgYmVpbmcgbG9zdC4KLQotUGVyc29uYWxseSwgSSB0aGluayB0aGVyZSdzIG5vIG5lZWQgdG8gd29ycnkuICBNYW55IG9mIHRoZSBuZXcKLWZlYXR1cmVzIGFyZSBxdWl0ZSBlc290ZXJpYywgYW5kIHlvdSBjYW4gd3JpdGUgYSBsb3Qgb2YgUHl0aG9uIGNvZGUKLXdpdGhvdXQgZXZlciBuZWVkZWQgdG8gYmUgYXdhcmUgb2YgdGhlbS4gIFdyaXRpbmcgYSBzaW1wbGUgY2xhc3MgaXMgbm8KLW1vcmUgZGlmZmljdWx0IHRoYW4gaXQgZXZlciB3YXMsIHNvIHlvdSBkb24ndCBuZWVkIHRvIGJvdGhlciBsZWFybmluZwotb3IgdGVhY2hpbmcgdGhlbSB1bmxlc3MgdGhleSdyZSBhY3R1YWxseSBuZWVkZWQuICBTb21lIHZlcnkKLWNvbXBsaWNhdGVkIHRhc2tzIHRoYXQgd2VyZSBwcmV2aW91c2x5IG9ubHkgcG9zc2libGUgZnJvbSBDIHdpbGwgbm93Ci1iZSBwb3NzaWJsZSBpbiBwdXJlIFB5dGhvbiwgYW5kIHRvIG15IG1pbmQgdGhhdCdzIGFsbCBmb3IgdGhlIGJldHRlci4KLQotSSdtIG5vdCBnb2luZyB0byBhdHRlbXB0IHRvIGNvdmVyIGV2ZXJ5IHNpbmdsZSBjb3JuZXIgY2FzZSBhbmQgc21hbGwKLWNoYW5nZSB0aGF0IHdlcmUgcmVxdWlyZWQgdG8gbWFrZSB0aGUgbmV3IGZlYXR1cmVzIHdvcmsuICBJbnN0ZWFkIHRoaXMKLXNlY3Rpb24gd2lsbCBwYWludCBvbmx5IHRoZSBicm9hZCBzdHJva2VzLiAgU2VlIHNlY3Rpb25+XHJlZntzZWN0LXJlbGxpbmtzfSwKLWBgUmVsYXRlZCBMaW5rcycnLCBmb3IgZnVydGhlciBzb3VyY2VzIG9mIGluZm9ybWF0aW9uIGFib3V0IFB5dGhvbiAyLjIncyBuZXcKLW9iamVjdCBtb2RlbC4KLQotCi1cc3Vic2VjdGlvbntPbGQgYW5kIE5ldyBDbGFzc2VzfQotCi1GaXJzdCwgeW91IHNob3VsZCBrbm93IHRoYXQgUHl0aG9uIDIuMiByZWFsbHkgaGFzIHR3byBraW5kcyBvZgotY2xhc3NlczogY2xhc3NpYyBvciBvbGQtc3R5bGUgY2xhc3NlcywgYW5kIG5ldy1zdHlsZSBjbGFzc2VzLiAgVGhlCi1vbGQtc3R5bGUgY2xhc3MgbW9kZWwgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyB0aGUgY2xhc3MgbW9kZWwgaW4KLWVhcmxpZXIgdmVyc2lvbnMgb2YgUHl0aG9uLiAgQWxsIHRoZSBuZXcgZmVhdHVyZXMgZGVzY3JpYmVkIGluIHRoaXMKLXNlY3Rpb24gYXBwbHkgb25seSB0byBuZXctc3R5bGUgY2xhc3Nlcy4gVGhpcyBkaXZlcmdlbmNlIGlzbid0Ci1pbnRlbmRlZCB0byBsYXN0IGZvcmV2ZXI7IGV2ZW50dWFsbHkgb2xkLXN0eWxlIGNsYXNzZXMgd2lsbCBiZQotZHJvcHBlZCwgcG9zc2libHkgaW4gUHl0aG9uIDMuMC4KLQotU28gaG93IGRvIHlvdSBkZWZpbmUgYSBuZXctc3R5bGUgY2xhc3M/ICBZb3UgZG8gaXQgYnkgc3ViY2xhc3NpbmcgYW4KLWV4aXN0aW5nIG5ldy1zdHlsZSBjbGFzcy4gIE1vc3Qgb2YgUHl0aG9uJ3MgYnVpbHQtaW4gdHlwZXMsIHN1Y2ggYXMKLWludGVnZXJzLCBsaXN0cywgZGljdGlvbmFyaWVzLCBhbmQgZXZlbiBmaWxlcywgYXJlIG5ldy1zdHlsZSBjbGFzc2VzCi1ub3cuICBBIG5ldy1zdHlsZSBjbGFzcyBuYW1lZCBcY2xhc3N7b2JqZWN0fSwgdGhlIGJhc2UgY2xhc3MgZm9yIGFsbAotYnVpbHQtaW4gdHlwZXMsIGhhcyBhbHNvIGJlZW4gYWRkZWQgc28gaWYgbm8gYnVpbHQtaW4gdHlwZSBpcwotc3VpdGFibGUsIHlvdSBjYW4ganVzdCBzdWJjbGFzcyBcY2xhc3N7b2JqZWN0fToKLQotXGJlZ2lue3ZlcmJhdGltfQotY2xhc3MgQyhvYmplY3QpOgotICAgIGRlZiBfX2luaXRfXyAoc2VsZik6Ci0gICAgICAgIC4uLgotICAgIC4uLgotXGVuZHt2ZXJiYXRpbX0KLQotVGhpcyBtZWFucyB0aGF0IFxrZXl3b3Jke2NsYXNzfSBzdGF0ZW1lbnRzIHRoYXQgZG9uJ3QgaGF2ZSBhbnkgYmFzZQotY2xhc3NlcyBhcmUgYWx3YXlzIGNsYXNzaWMgY2xhc3NlcyBpbiBQeXRob24gMi4yLiAgKEFjdHVhbGx5IHlvdSBjYW4KLWFsc28gY2hhbmdlIHRoaXMgYnkgc2V0dGluZyBhIG1vZHVsZS1sZXZlbCB2YXJpYWJsZSBuYW1lZAotXG1lbWJlcntfX21ldGFjbGFzc19ffSAtLS0gc2VlIFxwZXB7MjUzfSBmb3IgdGhlIGRldGFpbHMgLS0tIGJ1dCBpdCdzCi1lYXNpZXIgdG8ganVzdCBzdWJjbGFzcyBca2V5d29yZHtvYmplY3R9LikKLQotVGhlIHR5cGUgb2JqZWN0cyBmb3IgdGhlIGJ1aWx0LWluIHR5cGVzIGFyZSBhdmFpbGFibGUgYXMgYnVpbHQtaW5zLAotbmFtZWQgdXNpbmcgYSBjbGV2ZXIgdHJpY2suICBQeXRob24gaGFzIGFsd2F5cyBoYWQgYnVpbHQtaW4gZnVuY3Rpb25zCi1uYW1lZCBcZnVuY3Rpb257aW50KCl9LCBcZnVuY3Rpb257ZmxvYXQoKX0sIGFuZCBcZnVuY3Rpb257c3RyKCl9LiAgSW4KLTIuMiwgdGhleSBhcmVuJ3QgZnVuY3Rpb25zIGFueSBtb3JlLCBidXQgdHlwZSBvYmplY3RzIHRoYXQgYmVoYXZlIGFzCi1mYWN0b3JpZXMgd2hlbiBjYWxsZWQuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbnQKLTx0eXBlICdpbnQnPgotPj4+IGludCgnMTIzJykKLTEyMwotXGVuZHt2ZXJiYXRpbX0KLQotVG8gbWFrZSB0aGUgc2V0IG9mIHR5cGVzIGNvbXBsZXRlLCBuZXcgdHlwZSBvYmplY3RzIHN1Y2ggYXMKLVxmdW5jdGlvbntkaWN0fSBhbmQgXGZ1bmN0aW9ue2ZpbGV9IGhhdmUgYmVlbiBhZGRlZC4gIEhlcmUncyBhCi1tb3JlIGludGVyZXN0aW5nIGV4YW1wbGUsIGFkZGluZyBhIFxtZXRob2R7bG9jaygpfSBtZXRob2QgdG8gZmlsZQotb2JqZWN0czoKLQotXGJlZ2lue3ZlcmJhdGltfQotY2xhc3MgTG9ja2FibGVGaWxlKGZpbGUpOgotICAgIGRlZiBsb2NrIChzZWxmLCBvcGVyYXRpb24sIGxlbmd0aD0wLCBzdGFydD0wLCB3aGVuY2U9MCk6Ci0gICAgICAgIGltcG9ydCBmY250bAotICAgICAgICByZXR1cm4gZmNudGwubG9ja2Yoc2VsZi5maWxlbm8oKSwgb3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLCBzdGFydCwgd2hlbmNlKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIG5vdy1vYnNvbGV0ZSBcbW9kdWxle3Bvc2l4ZmlsZX0gbW9kdWxlIGNvbnRhaW5lZCBhIGNsYXNzIHRoYXQKLWVtdWxhdGVkIGFsbCBvZiBhIGZpbGUgb2JqZWN0J3MgbWV0aG9kcyBhbmQgYWxzbyBhZGRlZCBhCi1cbWV0aG9ke2xvY2soKX0gbWV0aG9kLCBidXQgdGhpcyBjbGFzcyBjb3VsZG4ndCBiZSBwYXNzZWQgdG8gaW50ZXJuYWwKLWZ1bmN0aW9ucyB0aGF0IGV4cGVjdGVkIGEgYnVpbHQtaW4gZmlsZSwgc29tZXRoaW5nIHdoaWNoIGlzIHBvc3NpYmxlCi13aXRoIG91ciBuZXcgXGNsYXNze0xvY2thYmxlRmlsZX0uCi0KLQotXHN1YnNlY3Rpb257RGVzY3JpcHRvcnN9Ci0KLUluIHByZXZpb3VzIHZlcnNpb25zIG9mIFB5dGhvbiwgdGhlcmUgd2FzIG5vIGNvbnNpc3RlbnQgd2F5IHRvCi1kaXNjb3ZlciB3aGF0IGF0dHJpYnV0ZXMgYW5kIG1ldGhvZHMgd2VyZSBzdXBwb3J0ZWQgYnkgYW4gb2JqZWN0LgotVGhlcmUgd2VyZSBzb21lIGluZm9ybWFsIGNvbnZlbnRpb25zLCBzdWNoIGFzIGRlZmluaW5nCi1cbWVtYmVye19fbWVtYmVyc19ffSBhbmQgXG1lbWJlcntfX21ldGhvZHNfX30gYXR0cmlidXRlcyB0aGF0IHdlcmUKLWxpc3RzIG9mIG5hbWVzLCBidXQgb2Z0ZW4gdGhlIGF1dGhvciBvZiBhbiBleHRlbnNpb24gdHlwZSBvciBhIGNsYXNzCi13b3VsZG4ndCBib3RoZXIgdG8gZGVmaW5lIHRoZW0uICBZb3UgY291bGQgZmFsbCBiYWNrIG9uIGluc3BlY3RpbmcgdGhlCi1cbWVtYmVye19fZGljdF9ffSBvZiBhbiBvYmplY3QsIGJ1dCB3aGVuIGNsYXNzIGluaGVyaXRhbmNlIG9yIGFuCi1hcmJpdHJhcnkgXG1ldGhvZHtfX2dldGF0dHJfX30gaG9vayB3ZXJlIGluIHVzZSB0aGlzIGNvdWxkIHN0aWxsIGJlCi1pbmFjY3VyYXRlLgotCi1UaGUgb25lIGJpZyBpZGVhIHVuZGVybHlpbmcgdGhlIG5ldyBjbGFzcyBtb2RlbCBpcyB0aGF0IGFuIEFQSSBmb3IKLWRlc2NyaWJpbmcgdGhlIGF0dHJpYnV0ZXMgb2YgYW4gb2JqZWN0IHVzaW5nIFxkZm57ZGVzY3JpcHRvcnN9IGhhcwotYmVlbiBmb3JtYWxpemVkLiAgRGVzY3JpcHRvcnMgc3BlY2lmeSB0aGUgdmFsdWUgb2YgYW4gYXR0cmlidXRlLAotc3RhdGluZyB3aGV0aGVyIGl0J3MgYSBtZXRob2Qgb3IgYSBmaWVsZC4gIFdpdGggdGhlIGRlc2NyaXB0b3IgQVBJLAotc3RhdGljIG1ldGhvZHMgYW5kIGNsYXNzIG1ldGhvZHMgYmVjb21lIHBvc3NpYmxlLCBhcyB3ZWxsIGFzIG1vcmUKLWV4b3RpYyBjb25zdHJ1Y3RzLgotCi1BdHRyaWJ1dGUgZGVzY3JpcHRvcnMgYXJlIG9iamVjdHMgdGhhdCBsaXZlIGluc2lkZSBjbGFzcyBvYmplY3RzLCBhbmQKLWhhdmUgYSBmZXcgYXR0cmlidXRlcyBvZiB0aGVpciBvd246Ci0KLVxiZWdpbntpdGVtaXplfQotCi1caXRlbSBcbWVtYmVye19fbmFtZV9ffSBpcyB0aGUgYXR0cmlidXRlJ3MgbmFtZS4KLQotXGl0ZW0gXG1lbWJlcntfX2RvY19ffSBpcyB0aGUgYXR0cmlidXRlJ3MgZG9jc3RyaW5nLgotCi1caXRlbSBcbWV0aG9ke19fZ2V0X18oXHZhcntvYmplY3R9KX0gaXMgYSBtZXRob2QgdGhhdCByZXRyaWV2ZXMgdGhlCi1hdHRyaWJ1dGUgdmFsdWUgZnJvbSBcdmFye29iamVjdH0uIAotCi1caXRlbSBcbWV0aG9ke19fc2V0X18oXHZhcntvYmplY3R9LCBcdmFye3ZhbHVlfSl9IHNldHMgdGhlIGF0dHJpYnV0ZQotb24gXHZhcntvYmplY3R9IHRvIFx2YXJ7dmFsdWV9LgotCi1caXRlbSBcbWV0aG9ke19fZGVsZXRlX18oXHZhcntvYmplY3R9LCBcdmFye3ZhbHVlfSl9IGRlbGV0ZXMgdGhlIFx2YXJ7dmFsdWV9IAotYXR0cmlidXRlIG9mIFx2YXJ7b2JqZWN0fS4KLVxlbmR7aXRlbWl6ZX0KLQotRm9yIGV4YW1wbGUsIHdoZW4geW91IHdyaXRlIFxjb2Rle29iai54fSwgdGhlIHN0ZXBzIHRoYXQgUHl0aG9uCi1hY3R1YWxseSBwZXJmb3JtcyBhcmU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWRlc2NyaXB0b3IgPSBvYmouX19jbGFzc19fLngKLWRlc2NyaXB0b3IuX19nZXRfXyhvYmopCi1cZW5ke3ZlcmJhdGltfQotCi1Gb3IgbWV0aG9kcywgXG1ldGhvZHtkZXNjcmlwdG9yLl9fZ2V0X199IHJldHVybnMgYSB0ZW1wb3Jhcnkgb2JqZWN0IHRoYXQncwotY2FsbGFibGUsIGFuZCB3cmFwcyB1cCB0aGUgaW5zdGFuY2UgYW5kIHRoZSBtZXRob2QgdG8gYmUgY2FsbGVkIG9uIGl0LgotVGhpcyBpcyBhbHNvIHdoeSBzdGF0aWMgbWV0aG9kcyBhbmQgY2xhc3MgbWV0aG9kcyBhcmUgbm93IHBvc3NpYmxlOwotdGhleSBoYXZlIGRlc2NyaXB0b3JzIHRoYXQgd3JhcCB1cCBqdXN0IHRoZSBtZXRob2QsIG9yIHRoZSBtZXRob2QgYW5kCi10aGUgY2xhc3MuICBBcyBhIGJyaWVmIGV4cGxhbmF0aW9uIG9mIHRoZXNlIG5ldyBraW5kcyBvZiBtZXRob2RzLAotc3RhdGljIG1ldGhvZHMgYXJlbid0IHBhc3NlZCB0aGUgaW5zdGFuY2UsIGFuZCB0aGVyZWZvcmUgcmVzZW1ibGUKLXJlZ3VsYXIgZnVuY3Rpb25zLiAgQ2xhc3MgbWV0aG9kcyBhcmUgcGFzc2VkIHRoZSBjbGFzcyBvZiB0aGUgb2JqZWN0LAotYnV0IG5vdCB0aGUgb2JqZWN0IGl0c2VsZi4gIFN0YXRpYyBhbmQgY2xhc3MgbWV0aG9kcyBhcmUgZGVmaW5lZCBsaWtlCi10aGlzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1jbGFzcyBDKG9iamVjdCk6Ci0gICAgZGVmIGYoYXJnMSwgYXJnMik6Ci0gICAgICAgIC4uLgotICAgIGYgPSBzdGF0aWNtZXRob2QoZikKLQotICAgIGRlZiBnKGNscywgYXJnMSwgYXJnMik6Ci0gICAgICAgIC4uLgotICAgIGcgPSBjbGFzc21ldGhvZChnKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIFxmdW5jdGlvbntzdGF0aWNtZXRob2QoKX0gZnVuY3Rpb24gdGFrZXMgdGhlIGZ1bmN0aW9uCi1cZnVuY3Rpb257Zn0sIGFuZCByZXR1cm5zIGl0IHdyYXBwZWQgdXAgaW4gYSBkZXNjcmlwdG9yIHNvIGl0IGNhbiBiZQotc3RvcmVkIGluIHRoZSBjbGFzcyBvYmplY3QuICBZb3UgbWlnaHQgZXhwZWN0IHRoZXJlIHRvIGJlIHNwZWNpYWwKLXN5bnRheCBmb3IgY3JlYXRpbmcgc3VjaCBtZXRob2RzIChcY29kZXtkZWYgc3RhdGljIGYoKX0sCi1cY29kZXtkZWZzdGF0aWMgZigpfSwgb3Igc29tZXRoaW5nIGxpa2UgdGhhdCkgYnV0IG5vIHN1Y2ggc3ludGF4IGhhcwotYmVlbiBkZWZpbmVkIHlldDsgdGhhdCdzIGJlZW4gbGVmdCBmb3IgZnV0dXJlIHZlcnNpb25zIG9mIFB5dGhvbi4KLQotTW9yZSBuZXcgZmVhdHVyZXMsIHN1Y2ggYXMgc2xvdHMgYW5kIHByb3BlcnRpZXMsIGFyZSBhbHNvIGltcGxlbWVudGVkCi1hcyBuZXcga2luZHMgb2YgZGVzY3JpcHRvcnMsIGFuZCBpdCdzIG5vdCBkaWZmaWN1bHQgdG8gd3JpdGUgYQotZGVzY3JpcHRvciBjbGFzcyB0aGF0IGRvZXMgc29tZXRoaW5nIG5vdmVsLiAgRm9yIGV4YW1wbGUsIGl0IHdvdWxkIGJlCi1wb3NzaWJsZSB0byB3cml0ZSBhIGRlc2NyaXB0b3IgY2xhc3MgdGhhdCBtYWRlIGl0IHBvc3NpYmxlIHRvIHdyaXRlCi1FaWZmZWwtc3R5bGUgcHJlY29uZGl0aW9ucyBhbmQgcG9zdGNvbmRpdGlvbnMgZm9yIGEgbWV0aG9kLiAgQSBjbGFzcwotdGhhdCB1c2VkIHRoaXMgZmVhdHVyZSBtaWdodCBiZSBkZWZpbmVkIGxpa2UgdGhpczoKLQotXGJlZ2lue3ZlcmJhdGltfQotZnJvbSBlaWZmZWwgaW1wb3J0IGVpZmZlbG1ldGhvZAotCi1jbGFzcyBDKG9iamVjdCk6Ci0gICAgZGVmIGYoc2VsZiwgYXJnMSwgYXJnMik6Ci0gICAgICAgICMgVGhlIGFjdHVhbCBmdW5jdGlvbgotICAgICAgICAuLi4KLSAgICBkZWYgcHJlX2Yoc2VsZik6Ci0gICAgICAgICMgQ2hlY2sgcHJlY29uZGl0aW9ucwotICAgICAgICAuLi4KLSAgICBkZWYgcG9zdF9mKHNlbGYpOgotICAgICAgICAjIENoZWNrIHBvc3Rjb25kaXRpb25zCi0gICAgICAgIC4uLgotCi0gICAgZiA9IGVpZmZlbG1ldGhvZChmLCBwcmVfZiwgcG9zdF9mKQotXGVuZHt2ZXJiYXRpbX0KLQotTm90ZSB0aGF0IGEgcGVyc29uIHVzaW5nIHRoZSBuZXcgXGZ1bmN0aW9ue2VpZmZlbG1ldGhvZCgpfSBkb2Vzbid0Ci1oYXZlIHRvIHVuZGVyc3RhbmQgYW55dGhpbmcgYWJvdXQgZGVzY3JpcHRvcnMuICBUaGlzIGlzIHdoeSBJIHRoaW5rCi10aGUgbmV3IGZlYXR1cmVzIGRvbid0IGluY3JlYXNlIHRoZSBiYXNpYyBjb21wbGV4aXR5IG9mIHRoZSBsYW5ndWFnZS4KLVRoZXJlIHdpbGwgYmUgYSBmZXcgd2l6YXJkcyB3aG8gbmVlZCB0byBrbm93IGFib3V0IGl0IGluIG9yZGVyIHRvCi13cml0ZSBcZnVuY3Rpb257ZWlmZmVsbWV0aG9kKCl9IG9yIHRoZSBaT0RCIG9yIHdoYXRldmVyLCBidXQgbW9zdAotdXNlcnMgd2lsbCBqdXN0IHdyaXRlIGNvZGUgb24gdG9wIG9mIHRoZSByZXN1bHRpbmcgbGlicmFyaWVzIGFuZAotaWdub3JlIHRoZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLgotCi0KLVxzdWJzZWN0aW9ue011bHRpcGxlIEluaGVyaXRhbmNlOiBUaGUgRGlhbW9uZCBSdWxlfQotCi1NdWx0aXBsZSBpbmhlcml0YW5jZSBoYXMgYWxzbyBiZWVuIG1hZGUgbW9yZSB1c2VmdWwgdGhyb3VnaCBjaGFuZ2luZwotdGhlIHJ1bGVzIHVuZGVyIHdoaWNoIG5hbWVzIGFyZSByZXNvbHZlZC4gIENvbnNpZGVyIHRoaXMgc2V0IG9mIGNsYXNzZXMKLShkaWFncmFtIHRha2VuIGZyb20gXHBlcHsyNTN9IGJ5IEd1aWRvIHZhbiBSb3NzdW0pOgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgICAgICAgICAgICAgY2xhc3MgQToKLSAgICAgICAgICAgICAgICAgIF4gXiAgZGVmIHNhdmUoc2VsZik6IC4uLgotICAgICAgICAgICAgICAgICAvICAgXAotICAgICAgICAgICAgICAgIC8gICAgIFwKLSAgICAgICAgICAgICAgIC8gICAgICAgXAotICAgICAgICAgICAgICAvICAgICAgICAgXAotICAgICAgICAgIGNsYXNzIEIgICAgIGNsYXNzIEM6Ci0gICAgICAgICAgICAgIF4gICAgICAgICBeICBkZWYgc2F2ZShzZWxmKTogLi4uCi0gICAgICAgICAgICAgICBcICAgICAgIC8KLSAgICAgICAgICAgICAgICBcICAgICAvCi0gICAgICAgICAgICAgICAgIFwgICAvCi0gICAgICAgICAgICAgICAgICBcIC8KLSAgICAgICAgICAgICAgICBjbGFzcyBECi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgbG9va3VwIHJ1bGUgZm9yIGNsYXNzaWMgY2xhc3NlcyBpcyBzaW1wbGUgYnV0IG5vdCB2ZXJ5IHNtYXJ0OyB0aGUKLWJhc2UgY2xhc3NlcyBhcmUgc2VhcmNoZWQgZGVwdGgtZmlyc3QsIGdvaW5nIGZyb20gbGVmdCB0byByaWdodC4gIEEKLXJlZmVyZW5jZSB0byBcbWV0aG9ke0Quc2F2ZX0gd2lsbCBzZWFyY2ggdGhlIGNsYXNzZXMgXGNsYXNze0R9LAotXGNsYXNze0J9LCBhbmQgdGhlbiBcY2xhc3N7QX0sIHdoZXJlIFxtZXRob2R7c2F2ZSgpfSB3b3VsZCBiZSBmb3VuZAotYW5kIHJldHVybmVkLiAgXG1ldGhvZHtDLnNhdmUoKX0gd291bGQgbmV2ZXIgYmUgZm91bmQgYXQgYWxsLiAgVGhpcyBpcwotYmFkLCBiZWNhdXNlIGlmIFxjbGFzc3tDfSdzIFxtZXRob2R7c2F2ZSgpfSBtZXRob2QgaXMgc2F2aW5nIHNvbWUKLWludGVybmFsIHN0YXRlIHNwZWNpZmljIHRvIFxjbGFzc3tDfSwgbm90IGNhbGxpbmcgaXQgd2lsbCByZXN1bHQgaW4KLXRoYXQgc3RhdGUgbmV2ZXIgZ2V0dGluZyBzYXZlZC4KLQotTmV3LXN0eWxlIGNsYXNzZXMgZm9sbG93IGEgZGlmZmVyZW50IGFsZ29yaXRobSB0aGF0J3MgYSBiaXQgbW9yZQotY29tcGxpY2F0ZWQgdG8gZXhwbGFpbiwgYnV0IGRvZXMgdGhlIHJpZ2h0IHRoaW5nIGluIHRoaXMgc2l0dWF0aW9uLgotKE5vdGUgdGhhdCBQeXRob24gMi4zIGNoYW5nZXMgdGhpcyBhbGdvcml0aG0gdG8gb25lIHRoYXQgcHJvZHVjZXMgdGhlCi1zYW1lIHJlc3VsdHMgaW4gbW9zdCBjYXNlcywgYnV0IHByb2R1Y2VzIG1vcmUgdXNlZnVsIHJlc3VsdHMgZm9yCi1yZWFsbHkgY29tcGxpY2F0ZWQgaW5oZXJpdGFuY2UgZ3JhcGhzLikKLQotXGJlZ2lue2VudW1lcmF0ZX0KLQotXGl0ZW0gTGlzdCBhbGwgdGhlIGJhc2UgY2xhc3NlcywgZm9sbG93aW5nIHRoZSBjbGFzc2ljIGxvb2t1cCBydWxlIGFuZAotaW5jbHVkZSBhIGNsYXNzIG11bHRpcGxlIHRpbWVzIGlmIGl0J3MgdmlzaXRlZCByZXBlYXRlZGx5LiAgSW4gdGhlCi1hYm92ZSBleGFtcGxlLCB0aGUgbGlzdCBvZiB2aXNpdGVkIGNsYXNzZXMgaXMgW1xjbGFzc3tEfSwgXGNsYXNze0J9LAotXGNsYXNze0F9LCBcY2xhc3N7Q30sIFxjbGFzc3tBfV0uCi0KLVxpdGVtIFNjYW4gdGhlIGxpc3QgZm9yIGR1cGxpY2F0ZWQgY2xhc3Nlcy4gIElmIGFueSBhcmUgZm91bmQsIHJlbW92ZQotYWxsIGJ1dCBvbmUgb2NjdXJyZW5jZSwgbGVhdmluZyB0aGUgXGVtcGh7bGFzdH0gb25lIGluIHRoZSBsaXN0LiAgSW4KLXRoZSBhYm92ZSBleGFtcGxlLCB0aGUgbGlzdCBiZWNvbWVzIFtcY2xhc3N7RH0sIFxjbGFzc3tCfSwgXGNsYXNze0N9LAotXGNsYXNze0F9XSBhZnRlciBkcm9wcGluZyBkdXBsaWNhdGVzLgotCi1cZW5ke2VudW1lcmF0ZX0KLQotRm9sbG93aW5nIHRoaXMgcnVsZSwgcmVmZXJyaW5nIHRvIFxtZXRob2R7RC5zYXZlKCl9IHdpbGwgcmV0dXJuCi1cbWV0aG9ke0Muc2F2ZSgpfSwgd2hpY2ggaXMgdGhlIGJlaGF2aW91ciB3ZSdyZSBhZnRlci4gIFRoaXMgbG9va3VwCi1ydWxlIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgZm9sbG93ZWQgYnkgQ29tbW9uIExpc3AuICBBIG5ldyBidWlsdC1pbgotZnVuY3Rpb24sIFxmdW5jdGlvbntzdXBlcigpfSwgcHJvdmlkZXMgYSB3YXkgdG8gZ2V0IGF0IGEgY2xhc3Mncwotc3VwZXJjbGFzc2VzIHdpdGhvdXQgaGF2aW5nIHRvIHJlaW1wbGVtZW50IFB5dGhvbidzIGFsZ29yaXRobS4KLVRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgZm9ybSB3aWxsIGJlIAotXGZ1bmN0aW9ue3N1cGVyKFx2YXJ7Y2xhc3N9LCBcdmFye29ian0pfSwgd2hpY2ggcmV0dXJucyAKLWEgYm91bmQgc3VwZXJjbGFzcyBvYmplY3QgKG5vdCB0aGUgYWN0dWFsIGNsYXNzIG9iamVjdCkuICBUaGlzIGZvcm0KLXdpbGwgYmUgdXNlZCBpbiBtZXRob2RzIHRvIGNhbGwgYSBtZXRob2QgaW4gdGhlIHN1cGVyY2xhc3M7IGZvcgotZXhhbXBsZSwgXGNsYXNze0R9J3MgXG1ldGhvZHtzYXZlKCl9IG1ldGhvZCB3b3VsZCBsb29rIGxpa2UgdGhpczoKLQotXGJlZ2lue3ZlcmJhdGltfQotY2xhc3MgRCAoQixDKToKLSAgICBkZWYgc2F2ZSAoc2VsZik6Ci0JIyBDYWxsIHN1cGVyY2xhc3MgLnNhdmUoKQotICAgICAgICBzdXBlcihELCBzZWxmKS5zYXZlKCkKLSAgICAgICAgIyBTYXZlIEQncyBwcml2YXRlIGluZm9ybWF0aW9uIGhlcmUKLSAgICAgICAgLi4uCi1cZW5ke3ZlcmJhdGltfQotCi1cZnVuY3Rpb257c3VwZXIoKX0gY2FuIGFsc28gcmV0dXJuIHVuYm91bmQgc3VwZXJjbGFzcyBvYmplY3RzCi13aGVuIGNhbGxlZCBhcyBcZnVuY3Rpb257c3VwZXIoXHZhcntjbGFzc30pfSBvcgotXGZ1bmN0aW9ue3N1cGVyKFx2YXJ7Y2xhc3MxfSwgXHZhcntjbGFzczJ9KX0sIGJ1dCB0aGlzIHByb2JhYmx5IHdvbid0Ci1vZnRlbiBiZSB1c2VmdWwuCi0KLQotXHN1YnNlY3Rpb257QXR0cmlidXRlIEFjY2Vzc30KLQotQSBmYWlyIG51bWJlciBvZiBzb3BoaXN0aWNhdGVkIFB5dGhvbiBjbGFzc2VzIGRlZmluZSBob29rcyBmb3IKLWF0dHJpYnV0ZSBhY2Nlc3MgdXNpbmcgXG1ldGhvZHtfX2dldGF0dHJfX307IG1vc3QgY29tbW9ubHkgdGhpcyBpcwotZG9uZSBmb3IgY29udmVuaWVuY2UsIHRvIG1ha2UgY29kZSBtb3JlIHJlYWRhYmxlIGJ5IGF1dG9tYXRpY2FsbHkKLW1hcHBpbmcgYW4gYXR0cmlidXRlIGFjY2VzcyBzdWNoIGFzIFxjb2Rle29iai5wYXJlbnR9IGludG8gYSBtZXRob2QKLWNhbGwgc3VjaCBhcyBcY29kZXtvYmouZ2V0X3BhcmVudCgpfS4gIFB5dGhvbiAyLjIgYWRkcyBzb21lIG5ldyB3YXlzCi1vZiBjb250cm9sbGluZyBhdHRyaWJ1dGUgYWNjZXNzLgotCi1GaXJzdCwgXG1ldGhvZHtfX2dldGF0dHJfXyhcdmFye2F0dHJfbmFtZX0pfSBpcyBzdGlsbCBzdXBwb3J0ZWQgYnkKLW5ldy1zdHlsZSBjbGFzc2VzLCBhbmQgbm90aGluZyBhYm91dCBpdCBoYXMgY2hhbmdlZC4gIEFzIGJlZm9yZSwgaXQKLXdpbGwgYmUgY2FsbGVkIHdoZW4gYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGFjY2VzcyBcY29kZXtvYmouZm9vfSBhbmQgbm8KLWF0dHJpYnV0ZSBuYW1lZCBcc2FtcHtmb299IGlzIGZvdW5kIGluIHRoZSBpbnN0YW5jZSdzIGRpY3Rpb25hcnkuCi0KLU5ldy1zdHlsZSBjbGFzc2VzIGFsc28gc3VwcG9ydCBhIG5ldyBtZXRob2QsCi1cbWV0aG9ke19fZ2V0YXR0cmlidXRlX18oXHZhcnthdHRyX25hbWV9KX0uICBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuCi10aGUgdHdvIG1ldGhvZHMgaXMgdGhhdCBcbWV0aG9ke19fZ2V0YXR0cmlidXRlX199IGlzIFxlbXBoe2Fsd2F5c30KLWNhbGxlZCB3aGVuZXZlciBhbnkgYXR0cmlidXRlIGlzIGFjY2Vzc2VkLCB3aGlsZSB0aGUgb2xkCi1cbWV0aG9ke19fZ2V0YXR0cl9ffSBpcyBvbmx5IGNhbGxlZCBpZiBcc2FtcHtmb299IGlzbid0IGZvdW5kIGluIHRoZQotaW5zdGFuY2UncyBkaWN0aW9uYXJ5LgotCi1Ib3dldmVyLCBQeXRob24gMi4yJ3Mgc3VwcG9ydCBmb3IgXGRmbntwcm9wZXJ0aWVzfSB3aWxsIG9mdGVuIGJlIGEKLXNpbXBsZXIgd2F5IHRvIHRyYXAgYXR0cmlidXRlIHJlZmVyZW5jZXMuICBXcml0aW5nIGEKLVxtZXRob2R7X19nZXRhdHRyX199IG1ldGhvZCBpcyBjb21wbGljYXRlZCBiZWNhdXNlIHRvIGF2b2lkIHJlY3Vyc2lvbgoteW91IGNhbid0IHVzZSByZWd1bGFyIGF0dHJpYnV0ZSBhY2Nlc3NlcyBpbnNpZGUgdGhlbSwgYW5kIGluc3RlYWQgaGF2ZQotdG8gbWVzcyBhcm91bmQgd2l0aCB0aGUgY29udGVudHMgb2YgXG1lbWJlcntfX2RpY3RfX30uCi1cbWV0aG9ke19fZ2V0YXR0cl9ffSBtZXRob2RzIGFsc28gZW5kIHVwIGJlaW5nIGNhbGxlZCBieSBQeXRob24gd2hlbgotaXQgY2hlY2tzIGZvciBvdGhlciBtZXRob2RzIHN1Y2ggYXMgXG1ldGhvZHtfX3JlcHJfX30gb3IKLVxtZXRob2R7X19jb2VyY2VfX30sIGFuZCBzbyBoYXZlIHRvIGJlIHdyaXR0ZW4gd2l0aCB0aGlzIGluIG1pbmQuCi1GaW5hbGx5LCBjYWxsaW5nIGEgZnVuY3Rpb24gb24gZXZlcnkgYXR0cmlidXRlIGFjY2VzcyByZXN1bHRzIGluIGEKLXNpemFibGUgcGVyZm9ybWFuY2UgbG9zcy4KLQotXGNsYXNze3Byb3BlcnR5fSBpcyBhIG5ldyBidWlsdC1pbiB0eXBlIHRoYXQgcGFja2FnZXMgdXAgdGhyZWUKLWZ1bmN0aW9ucyB0aGF0IGdldCwgc2V0LCBvciBkZWxldGUgYW4gYXR0cmlidXRlLCBhbmQgYSBkb2NzdHJpbmcuICBGb3IKLWV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIGRlZmluZSBhIFxtZW1iZXJ7c2l6ZX0gYXR0cmlidXRlIHRoYXQncwotY29tcHV0ZWQsIGJ1dCBhbHNvIHNldHRhYmxlLCB5b3UgY291bGQgd3JpdGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWNsYXNzIEMob2JqZWN0KToKLSAgICBkZWYgZ2V0X3NpemUgKHNlbGYpOgotICAgICAgICByZXN1bHQgPSAuLi4gY29tcHV0YXRpb24gLi4uCi0gICAgICAgIHJldHVybiByZXN1bHQKLSAgICBkZWYgc2V0X3NpemUgKHNlbGYsIHNpemUpOgotICAgICAgICAuLi4gY29tcHV0ZSBzb21ldGhpbmcgYmFzZWQgb24gdGhlIHNpemUKLSAgICAgICAgYW5kIHNldCBpbnRlcm5hbCBzdGF0ZSBhcHByb3ByaWF0ZWx5IC4uLgotCi0gICAgIyBEZWZpbmUgYSBwcm9wZXJ0eS4gIFRoZSAnZGVsZXRlIHRoaXMgYXR0cmlidXRlJwotICAgICMgbWV0aG9kIGlzIGRlZmluZWQgYXMgTm9uZSwgc28gdGhlIGF0dHJpYnV0ZQotICAgICMgY2FuJ3QgYmUgZGVsZXRlZC4KLSAgICBzaXplID0gcHJvcGVydHkoZ2V0X3NpemUsIHNldF9zaXplLAotICAgICAgICAgICAgICAgICAgICBOb25lLAotICAgICAgICAgICAgICAgICAgICAiU3RvcmFnZSBzaXplIG9mIHRoaXMgaW5zdGFuY2UiKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhhdCBpcyBjZXJ0YWlubHkgY2xlYXJlciBhbmQgZWFzaWVyIHRvIHdyaXRlIHRoYW4gYSBwYWlyIG9mCi1cbWV0aG9ke19fZ2V0YXR0cl9ffS9cbWV0aG9ke19fc2V0YXR0cl9ffSBtZXRob2RzIHRoYXQgY2hlY2sgZm9yIHRoZQotXG1lbWJlcntzaXplfSBhdHRyaWJ1dGUgYW5kIGhhbmRsZSBpdCBzcGVjaWFsbHkgd2hpbGUgcmV0cmlldmluZyBhbGwKLW90aGVyIGF0dHJpYnV0ZXMgZnJvbSB0aGUgaW5zdGFuY2UncyBcbWVtYmVye19fZGljdF9ffS4gIEFjY2Vzc2VzIHRvCi1cbWVtYmVye3NpemV9IGFyZSBhbHNvIHRoZSBvbmx5IG9uZXMgd2hpY2ggaGF2ZSB0byBwZXJmb3JtIHRoZSB3b3JrIG9mCi1jYWxsaW5nIGEgZnVuY3Rpb24sIHNvIHJlZmVyZW5jZXMgdG8gb3RoZXIgYXR0cmlidXRlcyBydW4gYXQKLXRoZWlyIHVzdWFsIHNwZWVkLgotCi1GaW5hbGx5LCBpdCdzIHBvc3NpYmxlIHRvIGNvbnN0cmFpbiB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzIHRoYXQgY2FuIGJlCi1yZWZlcmVuY2VkIG9uIGFuIG9iamVjdCB1c2luZyB0aGUgbmV3IFxtZW1iZXJ7X19zbG90c19ffSBjbGFzcyBhdHRyaWJ1dGUuCi1QeXRob24gb2JqZWN0cyBhcmUgdXN1YWxseSB2ZXJ5IGR5bmFtaWM7IGF0IGFueSB0aW1lIGl0J3MgcG9zc2libGUgdG8KLWRlZmluZSBhIG5ldyBhdHRyaWJ1dGUgb24gYW4gaW5zdGFuY2UgYnkganVzdCBkb2luZwotXGNvZGV7b2JqLm5ld19hdHRyPTF9LiAgIEEgbmV3LXN0eWxlIGNsYXNzIGNhbiBkZWZpbmUgYSBjbGFzcyBhdHRyaWJ1dGUgbmFtZWQKLVxtZW1iZXJ7X19zbG90c19ffSB0byBsaW1pdCB0aGUgbGVnYWwgYXR0cmlidXRlcyAKLXRvIGEgcGFydGljdWxhciBzZXQgb2YgbmFtZXMuICBBbiBleGFtcGxlIHdpbGwgbWFrZSB0aGlzIGNsZWFyOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gY2xhc3MgQyhvYmplY3QpOgotLi4uICAgICBfX3Nsb3RzX18gPSAoJ3RlbXBsYXRlJywgJ25hbWUnKQotLi4uCi0+Pj4gb2JqID0gQygpCi0+Pj4gcHJpbnQgb2JqLnRlbXBsYXRlCi1Ob25lCi0+Pj4gb2JqLnRlbXBsYXRlID0gJ1Rlc3QnCi0+Pj4gcHJpbnQgb2JqLnRlbXBsYXRlCi1UZXN0Ci0+Pj4gb2JqLm5ld2F0dHIgPSBOb25lCi1UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KLUF0dHJpYnV0ZUVycm9yOiAnQycgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJ25ld2F0dHInCi1cZW5ke3ZlcmJhdGltfQotCi1Ob3RlIGhvdyB5b3UgZ2V0IGFuIFxleGNlcHRpb257QXR0cmlidXRlRXJyb3J9IG9uIHRoZSBhdHRlbXB0IHRvCi1hc3NpZ24gdG8gYW4gYXR0cmlidXRlIG5vdCBsaXN0ZWQgaW4gXG1lbWJlcntfX3Nsb3RzX199LgotCi0KLQotXHN1YnNlY3Rpb257UmVsYXRlZCBMaW5rc30KLVxsYWJlbHtzZWN0LXJlbGxpbmtzfQotCi1UaGlzIHNlY3Rpb24gaGFzIGp1c3QgYmVlbiBhIHF1aWNrIG92ZXJ2aWV3IG9mIHRoZSBuZXcgZmVhdHVyZXMsCi1naXZpbmcgZW5vdWdoIG9mIGFuIGV4cGxhbmF0aW9uIHRvIHN0YXJ0IHlvdSBwcm9ncmFtbWluZywgYnV0IG1hbnkKLWRldGFpbHMgaGF2ZSBiZWVuIHNpbXBsaWZpZWQgb3IgaWdub3JlZC4gIFdoZXJlIHNob3VsZCB5b3UgZ28gdG8gZ2V0IGEKLW1vcmUgY29tcGxldGUgcGljdHVyZT8KLQotXHVybHtodHRwOi8vd3d3LnB5dGhvbi5vcmcvMi4yL2Rlc2NyaW50cm8uaHRtbH0gaXMgYSBsZW5ndGh5IHR1dG9yaWFsCi1pbnRyb2R1Y3Rpb24gdG8gdGhlIGRlc2NyaXB0b3IgZmVhdHVyZXMsIHdyaXR0ZW4gYnkgR3VpZG8gdmFuIFJvc3N1bS4KLUlmIG15IGRlc2NyaXB0aW9uIGhhcyB3aGV0dGVkIHlvdXIgYXBwZXRpdGUsIGdvIHJlYWQgdGhpcyB0dXRvcmlhbAotbmV4dCwgYmVjYXVzZSBpdCBnb2VzIGludG8gbXVjaCBtb3JlIGRldGFpbCBhYm91dCB0aGUgbmV3IGZlYXR1cmVzCi13aGlsZSBzdGlsbCByZW1haW5pbmcgcXVpdGUgZWFzeSB0byByZWFkLgotCi1OZXh0LCB0aGVyZSBhcmUgdHdvIHJlbGV2YW50IFBFUHMsIFxwZXB7MjUyfSBhbmQgXHBlcHsyNTN9LiAgXHBlcHsyNTJ9Ci1pcyB0aXRsZWQgIk1ha2luZyBUeXBlcyBMb29rIE1vcmUgTGlrZSBDbGFzc2VzIiwgYW5kIGNvdmVycyB0aGUKLWRlc2NyaXB0b3IgQVBJLiAgXHBlcHsyNTN9IGlzIHRpdGxlZCAiU3VidHlwaW5nIEJ1aWx0LWluIFR5cGVzIiwgYW5kCi1kZXNjcmliZXMgdGhlIGNoYW5nZXMgdG8gdHlwZSBvYmplY3RzIHRoYXQgbWFrZSBpdCBwb3NzaWJsZSB0byBzdWJ0eXBlCi1idWlsdC1pbiBvYmplY3RzLiAgXHBlcHsyNTN9IGlzIHRoZSBtb3JlIGNvbXBsaWNhdGVkIFBFUCBvZiB0aGUgdHdvLAotYW5kIGF0IGEgZmV3IHBvaW50cyB0aGUgbmVjZXNzYXJ5IGV4cGxhbmF0aW9ucyBvZiB0eXBlcyBhbmQgbWV0YS10eXBlcwotbWF5IGNhdXNlIHlvdXIgaGVhZCB0byBleHBsb2RlLiAgQm90aCBQRVBzIHdlcmUgd3JpdHRlbiBhbmQKLWltcGxlbWVudGVkIGJ5IEd1aWRvIHZhbiBSb3NzdW0sIHdpdGggc3Vic3RhbnRpYWwgYXNzaXN0YW5jZSBmcm9tIHRoZQotcmVzdCBvZiB0aGUgWm9wZSBDb3JwLiB0ZWFtLgotCi1GaW5hbGx5LCB0aGVyZSdzIHRoZSB1bHRpbWF0ZSBhdXRob3JpdHk6IHRoZSBzb3VyY2UgY29kZS4gIE1vc3Qgb2YgdGhlCi1tYWNoaW5lcnkgZm9yIHRoZSB0eXBlIGhhbmRsaW5nIGlzIGluIFxmaWxle09iamVjdHMvdHlwZW9iamVjdC5jfSwgYnV0Ci15b3Ugc2hvdWxkIG9ubHkgcmVzb3J0IHRvIGl0IGFmdGVyIGFsbCBvdGhlciBhdmVudWVzIGhhdmUgYmVlbgotZXhoYXVzdGVkLCBpbmNsdWRpbmcgcG9zdGluZyBhIHF1ZXN0aW9uIHRvIHB5dGhvbi1saXN0IG9yIHB5dGhvbi1kZXYuIAotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntQRVAgMjM0OiBJdGVyYXRvcnN9Ci0KLUFub3RoZXIgc2lnbmlmaWNhbnQgYWRkaXRpb24gdG8gMi4yIGlzIGFuIGl0ZXJhdGlvbiBpbnRlcmZhY2UgYXQgYm90aAotdGhlIEMgYW5kIFB5dGhvbiBsZXZlbHMuICBPYmplY3RzIGNhbiBkZWZpbmUgaG93IHRoZXkgY2FuIGJlIGxvb3BlZAotb3ZlciBieSBjYWxsZXJzLgotCi1JbiBQeXRob24gdmVyc2lvbnMgdXAgdG8gMi4xLCB0aGUgdXN1YWwgd2F5IHRvIG1ha2UgXGNvZGV7Zm9yIGl0ZW0gaW4KLW9ian0gd29yayBpcyB0byBkZWZpbmUgYSBcbWV0aG9ke19fZ2V0aXRlbV9fKCl9IG1ldGhvZCB0aGF0IGxvb2tzCi1zb21ldGhpbmcgbGlrZSB0aGlzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0gICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KToKLSAgICAgICAgcmV0dXJuIDxuZXh0IGl0ZW0+Ci1cZW5ke3ZlcmJhdGltfQotCi1cbWV0aG9ke19fZ2V0aXRlbV9fKCl9IGlzIG1vcmUgcHJvcGVybHkgdXNlZCB0byBkZWZpbmUgYW4gaW5kZXhpbmcKLW9wZXJhdGlvbiBvbiBhbiBvYmplY3Qgc28gdGhhdCB5b3UgY2FuIHdyaXRlIFxjb2Rle29ials1XX0gdG8gcmV0cmlldmUKLXRoZSBzaXh0aCBlbGVtZW50LiAgSXQncyBhIGJpdCBtaXNsZWFkaW5nIHdoZW4geW91J3JlIHVzaW5nIHRoaXMgb25seQotdG8gc3VwcG9ydCBca2V5d29yZHtmb3J9IGxvb3BzLiAgQ29uc2lkZXIgc29tZSBmaWxlLWxpa2Ugb2JqZWN0IHRoYXQKLXdhbnRzIHRvIGJlIGxvb3BlZCBvdmVyOyB0aGUgXHZhcntpbmRleH0gcGFyYW1ldGVyIGlzIGVzc2VudGlhbGx5Ci1tZWFuaW5nbGVzcywgYXMgdGhlIGNsYXNzIHByb2JhYmx5IGFzc3VtZXMgdGhhdCBhIHNlcmllcyBvZgotXG1ldGhvZHtfX2dldGl0ZW1fXygpfSBjYWxscyB3aWxsIGJlIG1hZGUgd2l0aCBcdmFye2luZGV4fQotaW5jcmVtZW50aW5nIGJ5IG9uZSBlYWNoIHRpbWUuICBJbiBvdGhlciB3b3JkcywgdGhlIHByZXNlbmNlIG9mIHRoZQotXG1ldGhvZHtfX2dldGl0ZW1fXygpfSBtZXRob2QgZG9lc24ndCBtZWFuIHRoYXQgdXNpbmcgXGNvZGV7ZmlsZVs1XX0gCi10byByYW5kb21seSBhY2Nlc3MgdGhlIHNpeHRoIGVsZW1lbnQgd2lsbCB3b3JrLCB0aG91Z2ggaXQgcmVhbGx5IHNob3VsZC4KLQotSW4gUHl0aG9uIDIuMiwgaXRlcmF0aW9uIGNhbiBiZSBpbXBsZW1lbnRlZCBzZXBhcmF0ZWx5LCBhbmQKLVxtZXRob2R7X19nZXRpdGVtX18oKX0gbWV0aG9kcyBjYW4gYmUgbGltaXRlZCB0byBjbGFzc2VzIHRoYXQgcmVhbGx5Ci1kbyBzdXBwb3J0IHJhbmRvbSBhY2Nlc3MuICBUaGUgYmFzaWMgaWRlYSBvZiBpdGVyYXRvcnMgaXMgCi1zaW1wbGUuICBBIG5ldyBidWlsdC1pbiBmdW5jdGlvbiwgXGZ1bmN0aW9ue2l0ZXIob2JqKX0gb3IKLVxjb2Rle2l0ZXIoXHZhcntDfSwgXHZhcntzZW50aW5lbH0pfSwgaXMgdXNlZCB0byBnZXQgYW4gaXRlcmF0b3IuCi1cZnVuY3Rpb257aXRlcihvYmopfSByZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciB0aGUgb2JqZWN0IFx2YXJ7b2JqfSwKLXdoaWxlIFxjb2Rle2l0ZXIoXHZhcntDfSwgXHZhcntzZW50aW5lbH0pfSByZXR1cm5zIGFuIGl0ZXJhdG9yIHRoYXQKLXdpbGwgaW52b2tlIHRoZSBjYWxsYWJsZSBvYmplY3QgXHZhcntDfSB1bnRpbCBpdCByZXR1cm5zCi1cdmFye3NlbnRpbmVsfSB0byBzaWduYWwgdGhhdCB0aGUgaXRlcmF0b3IgaXMgZG9uZS4gIAotCi1QeXRob24gY2xhc3NlcyBjYW4gZGVmaW5lIGFuIFxtZXRob2R7X19pdGVyX18oKX0gbWV0aG9kLCB3aGljaCBzaG91bGQKLWNyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IGl0ZXJhdG9yIGZvciB0aGUgb2JqZWN0OyBpZiB0aGUgb2JqZWN0IGlzIGl0cwotb3duIGl0ZXJhdG9yLCB0aGlzIG1ldGhvZCBjYW4ganVzdCByZXR1cm4gXGNvZGV7c2VsZn0uICBJbiBwYXJ0aWN1bGFyLAotaXRlcmF0b3JzIHdpbGwgdXN1YWxseSBiZSB0aGVpciBvd24gaXRlcmF0b3JzLiAgRXh0ZW5zaW9uIHR5cGVzCi1pbXBsZW1lbnRlZCBpbiBDIGNhbiBpbXBsZW1lbnQgYSBcbWVtYmVye3RwX2l0ZXJ9IGZ1bmN0aW9uIGluIG9yZGVyIHRvCi1yZXR1cm4gYW4gaXRlcmF0b3IsIGFuZCBleHRlbnNpb24gdHlwZXMgdGhhdCB3YW50IHRvIGJlaGF2ZSBhcwotaXRlcmF0b3JzIGNhbiBkZWZpbmUgYSBcbWVtYmVye3RwX2l0ZXJuZXh0fSBmdW5jdGlvbi4KLQotU28sIGFmdGVyIGFsbCB0aGlzLCB3aGF0IGRvIGl0ZXJhdG9ycyBhY3R1YWxseSBkbz8gIFRoZXkgaGF2ZSBvbmUKLXJlcXVpcmVkIG1ldGhvZCwgXG1ldGhvZHtuZXh0KCl9LCB3aGljaCB0YWtlcyBubyBhcmd1bWVudHMgYW5kIHJldHVybnMKLXRoZSBuZXh0IHZhbHVlLiAgV2hlbiB0aGVyZSBhcmUgbm8gbW9yZSB2YWx1ZXMgdG8gYmUgcmV0dXJuZWQsIGNhbGxpbmcKLVxtZXRob2R7bmV4dCgpfSBzaG91bGQgcmFpc2UgdGhlIFxleGNlcHRpb257U3RvcEl0ZXJhdGlvbn0gZXhjZXB0aW9uLgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gTCA9IFsxLDIsM10KLT4+PiBpID0gaXRlcihMKQotPj4+IHByaW50IGkKLTxpdGVyYXRvciBvYmplY3QgYXQgMHg4MTE2ODcwPgotPj4+IGkubmV4dCgpCi0xCi0+Pj4gaS5uZXh0KCkKLTIKLT4+PiBpLm5leHQoKQotMwotPj4+IGkubmV4dCgpCi1UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KLVN0b3BJdGVyYXRpb24KLT4+PiAgICAgIAotXGVuZHt2ZXJiYXRpbX0KLQotSW4gMi4yLCBQeXRob24ncyBca2V5d29yZHtmb3J9IHN0YXRlbWVudCBubyBsb25nZXIgZXhwZWN0cyBhIHNlcXVlbmNlOwotaXQgZXhwZWN0cyBzb21ldGhpbmcgZm9yIHdoaWNoIFxmdW5jdGlvbntpdGVyKCl9IHdpbGwgcmV0dXJuIGFuIGl0ZXJhdG9yLgotRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYW5kIGNvbnZlbmllbmNlLCBhbiBpdGVyYXRvciBpcwotYXV0b21hdGljYWxseSBjb25zdHJ1Y3RlZCBmb3Igc2VxdWVuY2VzIHRoYXQgZG9uJ3QgaW1wbGVtZW50Ci1cbWV0aG9ke19faXRlcl9fKCl9IG9yIGEgXG1lbWJlcnt0cF9pdGVyfSBzbG90LCBzbyBcY29kZXtmb3IgaSBpbgotWzEsMiwzXX0gd2lsbCBzdGlsbCB3b3JrLiAgV2hlcmV2ZXIgdGhlIFB5dGhvbiBpbnRlcnByZXRlciBsb29wcyBvdmVyCi1hIHNlcXVlbmNlLCBpdCdzIGJlZW4gY2hhbmdlZCB0byB1c2UgdGhlIGl0ZXJhdG9yIHByb3RvY29sLiAgVGhpcwotbWVhbnMgeW91IGNhbiBkbyB0aGluZ3MgbGlrZSB0aGlzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gTCA9IFsxLDIsM10KLT4+PiBpID0gaXRlcihMKQotPj4+IGEsYixjID0gaQotPj4+IGEsYixjCi0oMSwgMiwgMykKLVxlbmR7dmVyYmF0aW19Ci0KLUl0ZXJhdG9yIHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQgdG8gc29tZSBvZiBQeXRob24ncyBiYXNpYyB0eXBlcy4gIAotQ2FsbGluZyBcZnVuY3Rpb257aXRlcigpfSBvbiBhIGRpY3Rpb25hcnkgd2lsbCByZXR1cm4gYW4gaXRlcmF0b3IKLXdoaWNoIGxvb3BzIG92ZXIgaXRzIGtleXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBtID0geydKYW4nOiAxLCAnRmViJzogMiwgJ01hcic6IDMsICdBcHInOiA0LCAnTWF5JzogNSwgJ0p1bic6IDYsCi0uLi4gICAgICAnSnVsJzogNywgJ0F1Zyc6IDgsICdTZXAnOiA5LCAnT2N0JzogMTAsICdOb3YnOiAxMSwgJ0RlYyc6IDEyfQotPj4+IGZvciBrZXkgaW4gbTogcHJpbnQga2V5LCBtW2tleV0KLS4uLgotTWFyIDMKLUZlYiAyCi1BdWcgOAotU2VwIDkKLU1heSA1Ci1KdW4gNgotSnVsIDcKLUphbiAxCi1BcHIgNAotTm92IDExCi1EZWMgMTIKLU9jdCAxMAotXGVuZHt2ZXJiYXRpbX0gICAgICAgICAgCi0KLVRoYXQncyBqdXN0IHRoZSBkZWZhdWx0IGJlaGF2aW91ci4gIElmIHlvdSB3YW50IHRvIGl0ZXJhdGUgb3ZlciBrZXlzLAotdmFsdWVzLCBvciBrZXkvdmFsdWUgcGFpcnMsIHlvdSBjYW4gZXhwbGljaXRseSBjYWxsIHRoZQotXG1ldGhvZHtpdGVya2V5cygpfSwgXG1ldGhvZHtpdGVydmFsdWVzKCl9LCBvciBcbWV0aG9ke2l0ZXJpdGVtcygpfQotbWV0aG9kcyB0byBnZXQgYW4gYXBwcm9wcmlhdGUgaXRlcmF0b3IuICBJbiBhIG1pbm9yIHJlbGF0ZWQgY2hhbmdlLAotdGhlIFxrZXl3b3Jke2lufSBvcGVyYXRvciBub3cgd29ya3Mgb24gZGljdGlvbmFyaWVzLCBzbwotXGNvZGV7XHZhcntrZXl9IGluIGRpY3R9IGlzIG5vdyBlcXVpdmFsZW50IHRvCi1cY29kZXtkaWN0Lmhhc19rZXkoXHZhcntrZXl9KX0uCi0KLUZpbGVzIGFsc28gcHJvdmlkZSBhbiBpdGVyYXRvciwgd2hpY2ggY2FsbHMgdGhlIFxtZXRob2R7cmVhZGxpbmUoKX0KLW1ldGhvZCB1bnRpbCB0aGVyZSBhcmUgbm8gbW9yZSBsaW5lcyBpbiB0aGUgZmlsZS4gIFRoaXMgbWVhbnMgeW91IGNhbgotbm93IHJlYWQgZWFjaCBsaW5lIG9mIGEgZmlsZSB1c2luZyBjb2RlIGxpa2UgdGhpczoKLQotXGJlZ2lue3ZlcmJhdGltfQotZm9yIGxpbmUgaW4gZmlsZToKLSAgICAjIGRvIHNvbWV0aGluZyBmb3IgZWFjaCBsaW5lCi0gICAgLi4uCi1cZW5ke3ZlcmJhdGltfQotCi1Ob3RlIHRoYXQgeW91IGNhbiBvbmx5IGdvIGZvcndhcmQgaW4gYW4gaXRlcmF0b3I7IHRoZXJlJ3Mgbm8gd2F5IHRvCi1nZXQgdGhlIHByZXZpb3VzIGVsZW1lbnQsIHJlc2V0IHRoZSBpdGVyYXRvciwgb3IgbWFrZSBhIGNvcHkgb2YgaXQuCi1BbiBpdGVyYXRvciBvYmplY3QgY291bGQgcHJvdmlkZSBzdWNoIGFkZGl0aW9uYWwgY2FwYWJpbGl0aWVzLCBidXQgdGhlCi1pdGVyYXRvciBwcm90b2NvbCBvbmx5IHJlcXVpcmVzIGEgXG1ldGhvZHtuZXh0KCl9IG1ldGhvZC4KLQotXGJlZ2lue3NlZWFsc299Ci0KLVxzZWVwZXB7MjM0fXtJdGVyYXRvcnN9e1dyaXR0ZW4gYnkgS2EtUGluZyBZZWUgYW5kIEd2UjsgaW1wbGVtZW50ZWQgCi1ieSB0aGUgUHl0aG9uIExhYnMgY3JldywgbW9zdGx5IGJ5IEd2UiBhbmQgVGltIFBldGVycy59Ci0KLVxlbmR7c2VlYWxzb30KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257UEVQIDI1NTogU2ltcGxlIEdlbmVyYXRvcnN9Ci0KLUdlbmVyYXRvcnMgYXJlIGFub3RoZXIgbmV3IGZlYXR1cmUsIG9uZSB0aGF0IGludGVyYWN0cyB3aXRoIHRoZQotaW50cm9kdWN0aW9uIG9mIGl0ZXJhdG9ycy4KLQotWW91J3JlIGRvdWJ0bGVzcyBmYW1pbGlhciB3aXRoIGhvdyBmdW5jdGlvbiBjYWxscyB3b3JrIGluIFB5dGhvbiBvcgotQy4gIFdoZW4geW91IGNhbGwgYSBmdW5jdGlvbiwgaXQgZ2V0cyBhIHByaXZhdGUgbmFtZXNwYWNlIHdoZXJlIGl0cyBsb2NhbAotdmFyaWFibGVzIGFyZSBjcmVhdGVkLiAgV2hlbiB0aGUgZnVuY3Rpb24gcmVhY2hlcyBhIFxrZXl3b3Jke3JldHVybn0KLXN0YXRlbWVudCwgdGhlIGxvY2FsIHZhcmlhYmxlcyBhcmUgZGVzdHJveWVkIGFuZCB0aGUgcmVzdWx0aW5nIHZhbHVlCi1pcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLiAgQSBsYXRlciBjYWxsIHRvIHRoZSBzYW1lIGZ1bmN0aW9uIHdpbGwgZ2V0Ci1hIGZyZXNoIG5ldyBzZXQgb2YgbG9jYWwgdmFyaWFibGVzLiAgQnV0LCB3aGF0IGlmIHRoZSBsb2NhbCB2YXJpYWJsZXMKLXdlcmVuJ3QgdGhyb3duIGF3YXkgb24gZXhpdGluZyBhIGZ1bmN0aW9uPyAgV2hhdCBpZiB5b3UgY291bGQgbGF0ZXIKLXJlc3VtZSB0aGUgZnVuY3Rpb24gd2hlcmUgaXQgbGVmdCBvZmY/ICBUaGlzIGlzIHdoYXQgZ2VuZXJhdG9ycwotcHJvdmlkZTsgdGhleSBjYW4gYmUgdGhvdWdodCBvZiBhcyByZXN1bWFibGUgZnVuY3Rpb25zLgotCi1IZXJlJ3MgdGhlIHNpbXBsZXN0IGV4YW1wbGUgb2YgYSBnZW5lcmF0b3IgZnVuY3Rpb246Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWRlZiBnZW5lcmF0ZV9pbnRzKE4pOgotICAgIGZvciBpIGluIHJhbmdlKE4pOgotICAgICAgICB5aWVsZCBpCi1cZW5ke3ZlcmJhdGltfQotCi1BIG5ldyBrZXl3b3JkLCBca2V5d29yZHt5aWVsZH0sIHdhcyBpbnRyb2R1Y2VkIGZvciBnZW5lcmF0b3JzLiAgQW55Ci1mdW5jdGlvbiBjb250YWluaW5nIGEgXGtleXdvcmR7eWllbGR9IHN0YXRlbWVudCBpcyBhIGdlbmVyYXRvcgotZnVuY3Rpb247IHRoaXMgaXMgZGV0ZWN0ZWQgYnkgUHl0aG9uJ3MgYnl0ZWNvZGUgY29tcGlsZXIgd2hpY2gKLWNvbXBpbGVzIHRoZSBmdW5jdGlvbiBzcGVjaWFsbHkgYXMgYSByZXN1bHQuICBCZWNhdXNlIGEgbmV3IGtleXdvcmQgd2FzCi1pbnRyb2R1Y2VkLCBnZW5lcmF0b3JzIG11c3QgYmUgZXhwbGljaXRseSBlbmFibGVkIGluIGEgbW9kdWxlIGJ5Ci1pbmNsdWRpbmcgYSBcY29kZXtmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGdlbmVyYXRvcnN9IHN0YXRlbWVudCBuZWFyCi10aGUgdG9wIG9mIHRoZSBtb2R1bGUncyBzb3VyY2UgY29kZS4gIEluIFB5dGhvbiAyLjMgdGhpcyBzdGF0ZW1lbnQKLXdpbGwgYmVjb21lIHVubmVjZXNzYXJ5LgotCi1XaGVuIHlvdSBjYWxsIGEgZ2VuZXJhdG9yIGZ1bmN0aW9uLCBpdCBkb2Vzbid0IHJldHVybiBhIHNpbmdsZSB2YWx1ZTsKLWluc3RlYWQgaXQgcmV0dXJucyBhIGdlbmVyYXRvciBvYmplY3QgdGhhdCBzdXBwb3J0cyB0aGUgaXRlcmF0b3IKLXByb3RvY29sLiAgT24gZXhlY3V0aW5nIHRoZSBca2V5d29yZHt5aWVsZH0gc3RhdGVtZW50LCB0aGUgZ2VuZXJhdG9yCi1vdXRwdXRzIHRoZSB2YWx1ZSBvZiBcY29kZXtpfSwgc2ltaWxhciB0byBhIFxrZXl3b3Jke3JldHVybn0KLXN0YXRlbWVudC4gIFRoZSBiaWcgZGlmZmVyZW5jZSBiZXR3ZWVuIFxrZXl3b3Jke3lpZWxkfSBhbmQgYQotXGtleXdvcmR7cmV0dXJufSBzdGF0ZW1lbnQgaXMgdGhhdCBvbiByZWFjaGluZyBhIFxrZXl3b3Jke3lpZWxkfSB0aGUKLWdlbmVyYXRvcidzIHN0YXRlIG9mIGV4ZWN1dGlvbiBpcyBzdXNwZW5kZWQgYW5kIGxvY2FsIHZhcmlhYmxlcyBhcmUKLXByZXNlcnZlZC4gIE9uIHRoZSBuZXh0IGNhbGwgdG8gdGhlIGdlbmVyYXRvcidzIFxjb2Rle25leHQoKX0gbWV0aG9kLAotdGhlIGZ1bmN0aW9uIHdpbGwgcmVzdW1lIGV4ZWN1dGluZyBpbW1lZGlhdGVseSBhZnRlciB0aGUKLVxrZXl3b3Jke3lpZWxkfSBzdGF0ZW1lbnQuICAoRm9yIGNvbXBsaWNhdGVkIHJlYXNvbnMsIHRoZQotXGtleXdvcmR7eWllbGR9IHN0YXRlbWVudCBpc24ndCBhbGxvd2VkIGluc2lkZSB0aGUgXGtleXdvcmR7dHJ5fSBibG9jawotb2YgYSBca2V5d29yZHt0cnl9Li4uXGtleXdvcmR7ZmluYWxseX0gc3RhdGVtZW50OyByZWFkIFxwZXB7MjU1fSBmb3IgYSBmdWxsCi1leHBsYW5hdGlvbiBvZiB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBca2V5d29yZHt5aWVsZH0gYW5kCi1leGNlcHRpb25zLikKLQotSGVyZSdzIGEgc2FtcGxlIHVzYWdlIG9mIHRoZSBcZnVuY3Rpb257Z2VuZXJhdGVfaW50c30gZ2VuZXJhdG9yOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZ2VuID0gZ2VuZXJhdGVfaW50cygzKQotPj4+IGdlbgotPGdlbmVyYXRvciBvYmplY3QgYXQgMHg4MTE3ZjkwPgotPj4+IGdlbi5uZXh0KCkKLTAKLT4+PiBnZW4ubmV4dCgpCi0xCi0+Pj4gZ2VuLm5leHQoKQotMgotPj4+IGdlbi5uZXh0KCkKLVRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLSAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwotICBGaWxlICI8c3RkaW4+IiwgbGluZSAyLCBpbiBnZW5lcmF0ZV9pbnRzCi1TdG9wSXRlcmF0aW9uCi1cZW5ke3ZlcmJhdGltfQotCi1Zb3UgY291bGQgZXF1YWxseSB3cml0ZSBcY29kZXtmb3IgaSBpbiBnZW5lcmF0ZV9pbnRzKDUpfSwgb3IKLVxjb2Rle2EsYixjID0gZ2VuZXJhdGVfaW50cygzKX0uCi0KLUluc2lkZSBhIGdlbmVyYXRvciBmdW5jdGlvbiwgdGhlIFxrZXl3b3Jke3JldHVybn0gc3RhdGVtZW50IGNhbiBvbmx5Ci1iZSB1c2VkIHdpdGhvdXQgYSB2YWx1ZSwgYW5kIHNpZ25hbHMgdGhlIGVuZCBvZiB0aGUgcHJvY2Vzc2lvbiBvZgotdmFsdWVzOyBhZnRlcndhcmRzIHRoZSBnZW5lcmF0b3IgY2Fubm90IHJldHVybiBhbnkgZnVydGhlciB2YWx1ZXMuCi1ca2V5d29yZHtyZXR1cm59IHdpdGggYSB2YWx1ZSwgc3VjaCBhcyBcY29kZXtyZXR1cm4gNX0sIGlzIGEgc3ludGF4Ci1lcnJvciBpbnNpZGUgYSBnZW5lcmF0b3IgZnVuY3Rpb24uICBUaGUgZW5kIG9mIHRoZSBnZW5lcmF0b3IncyByZXN1bHRzCi1jYW4gYWxzbyBiZSBpbmRpY2F0ZWQgYnkgcmFpc2luZyBcZXhjZXB0aW9ue1N0b3BJdGVyYXRpb259IG1hbnVhbGx5LAotb3IgYnkganVzdCBsZXR0aW5nIHRoZSBmbG93IG9mIGV4ZWN1dGlvbiBmYWxsIG9mZiB0aGUgYm90dG9tIG9mIHRoZQotZnVuY3Rpb24uCi0KLVlvdSBjb3VsZCBhY2hpZXZlIHRoZSBlZmZlY3Qgb2YgZ2VuZXJhdG9ycyBtYW51YWxseSBieSB3cml0aW5nIHlvdXIKLW93biBjbGFzcyBhbmQgc3RvcmluZyBhbGwgdGhlIGxvY2FsIHZhcmlhYmxlcyBvZiB0aGUgZ2VuZXJhdG9yIGFzCi1pbnN0YW5jZSB2YXJpYWJsZXMuICBGb3IgZXhhbXBsZSwgcmV0dXJuaW5nIGEgbGlzdCBvZiBpbnRlZ2VycyBjb3VsZAotYmUgZG9uZSBieSBzZXR0aW5nIFxjb2Rle3NlbGYuY291bnR9IHRvIDAsIGFuZCBoYXZpbmcgdGhlCi1cbWV0aG9ke25leHQoKX0gbWV0aG9kIGluY3JlbWVudCBcY29kZXtzZWxmLmNvdW50fSBhbmQgcmV0dXJuIGl0LgotSG93ZXZlciwgZm9yIGEgbW9kZXJhdGVseSBjb21wbGljYXRlZCBnZW5lcmF0b3IsIHdyaXRpbmcgYQotY29ycmVzcG9uZGluZyBjbGFzcyB3b3VsZCBiZSBtdWNoIG1lc3NpZXIuCi1cZmlsZXtMaWIvdGVzdC90ZXN0X2dlbmVyYXRvcnMucHl9IGNvbnRhaW5zIGEgbnVtYmVyIG9mIG1vcmUKLWludGVyZXN0aW5nIGV4YW1wbGVzLiAgVGhlIHNpbXBsZXN0IG9uZSBpbXBsZW1lbnRzIGFuIGluLW9yZGVyCi10cmF2ZXJzYWwgb2YgYSB0cmVlIHVzaW5nIGdlbmVyYXRvcnMgcmVjdXJzaXZlbHkuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLSMgQSByZWN1cnNpdmUgZ2VuZXJhdG9yIHRoYXQgZ2VuZXJhdGVzIFRyZWUgbGVhdmVzIGluIGluLW9yZGVyLgotZGVmIGlub3JkZXIodCk6Ci0gICAgaWYgdDoKLSAgICAgICAgZm9yIHggaW4gaW5vcmRlcih0LmxlZnQpOgotICAgICAgICAgICAgeWllbGQgeAotICAgICAgICB5aWVsZCB0LmxhYmVsCi0gICAgICAgIGZvciB4IGluIGlub3JkZXIodC5yaWdodCk6Ci0gICAgICAgICAgICB5aWVsZCB4Ci1cZW5ke3ZlcmJhdGltfQotCi1Ud28gb3RoZXIgZXhhbXBsZXMgaW4gXGZpbGV7TGliL3Rlc3QvdGVzdF9nZW5lcmF0b3JzLnB5fSBwcm9kdWNlCi1zb2x1dGlvbnMgZm9yIHRoZSBOLVF1ZWVucyBwcm9ibGVtIChwbGFjaW5nICROJCBxdWVlbnMgb24gYW4gJE54TiQKLWNoZXNzIGJvYXJkIHNvIHRoYXQgbm8gcXVlZW4gdGhyZWF0ZW5zIGFub3RoZXIpIGFuZCB0aGUgS25pZ2h0J3MgVG91cgotKGEgcm91dGUgdGhhdCB0YWtlcyBhIGtuaWdodCB0byBldmVyeSBzcXVhcmUgb2YgYW4gJE54TiQgY2hlc3Nib2FyZAotd2l0aG91dCB2aXNpdGluZyBhbnkgc3F1YXJlIHR3aWNlKS4gCi0KLVRoZSBpZGVhIG9mIGdlbmVyYXRvcnMgY29tZXMgZnJvbSBvdGhlciBwcm9ncmFtbWluZyBsYW5ndWFnZXMsCi1lc3BlY2lhbGx5IEljb24gKFx1cmx7aHR0cDovL3d3dy5jcy5hcml6b25hLmVkdS9pY29uL30pLCB3aGVyZSB0aGUKLWlkZWEgb2YgZ2VuZXJhdG9ycyBpcyBjZW50cmFsLiAgSW4gSWNvbiwgZXZlcnkKLWV4cHJlc3Npb24gYW5kIGZ1bmN0aW9uIGNhbGwgYmVoYXZlcyBsaWtlIGEgZ2VuZXJhdG9yLiAgT25lIGV4YW1wbGUKLWZyb20gYGBBbiBPdmVydmlldyBvZiB0aGUgSWNvbiBQcm9ncmFtbWluZyBMYW5ndWFnZScnIGF0Ci1cdXJse2h0dHA6Ly93d3cuY3MuYXJpem9uYS5lZHUvaWNvbi9kb2NzL2lwZDI2Ni5odG19IGdpdmVzIGFuIGlkZWEgb2YKLXdoYXQgdGhpcyBsb29rcyBsaWtlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1zZW50ZW5jZSA6PSAiU3RvcmUgaXQgaW4gdGhlIG5laWdoYm9yaW5nIGhhcmJvciIKLWlmIChpIDo9IGZpbmQoIm9yIiwgc2VudGVuY2UpKSA+IDUgdGhlbiB3cml0ZShpKQotXGVuZHt2ZXJiYXRpbX0KLQotSW4gSWNvbiB0aGUgXGZ1bmN0aW9ue2ZpbmQoKX0gZnVuY3Rpb24gcmV0dXJucyB0aGUgaW5kZXhlcyBhdCB3aGljaCB0aGUKLXN1YnN0cmluZyBgYG9yJycgaXMgZm91bmQ6IDMsIDIzLCAzMy4gIEluIHRoZSBca2V5d29yZHtpZn0gc3RhdGVtZW50LAotXGNvZGV7aX0gaXMgZmlyc3QgYXNzaWduZWQgYSB2YWx1ZSBvZiAzLCBidXQgMyBpcyBsZXNzIHRoYW4gNSwgc28gdGhlCi1jb21wYXJpc29uIGZhaWxzLCBhbmQgSWNvbiByZXRyaWVzIGl0IHdpdGggdGhlIHNlY29uZCB2YWx1ZSBvZiAyMy4gIDIzCi1pcyBncmVhdGVyIHRoYW4gNSwgc28gdGhlIGNvbXBhcmlzb24gbm93IHN1Y2NlZWRzLCBhbmQgdGhlIGNvZGUgcHJpbnRzCi10aGUgdmFsdWUgMjMgdG8gdGhlIHNjcmVlbi4KLQotUHl0aG9uIGRvZXNuJ3QgZ28gbmVhcmx5IGFzIGZhciBhcyBJY29uIGluIGFkb3B0aW5nIGdlbmVyYXRvcnMgYXMgYQotY2VudHJhbCBjb25jZXB0LiAgR2VuZXJhdG9ycyBhcmUgY29uc2lkZXJlZCBhIG5ldyBwYXJ0IG9mIHRoZSBjb3JlCi1QeXRob24gbGFuZ3VhZ2UsIGJ1dCBsZWFybmluZyBvciB1c2luZyB0aGVtIGlzbid0IGNvbXB1bHNvcnk7IGlmIHRoZXkKLWRvbid0IHNvbHZlIGFueSBwcm9ibGVtcyB0aGF0IHlvdSBoYXZlLCBmZWVsIGZyZWUgdG8gaWdub3JlIHRoZW0uCi1PbmUgbm92ZWwgZmVhdHVyZSBvZiBQeXRob24ncyBpbnRlcmZhY2UgYXMgY29tcGFyZWQgdG8KLUljb24ncyBpcyB0aGF0IGEgZ2VuZXJhdG9yJ3Mgc3RhdGUgaXMgcmVwcmVzZW50ZWQgYXMgYSBjb25jcmV0ZSBvYmplY3QKLSh0aGUgaXRlcmF0b3IpIHRoYXQgY2FuIGJlIHBhc3NlZCBhcm91bmQgdG8gb3RoZXIgZnVuY3Rpb25zIG9yIHN0b3JlZAotaW4gYSBkYXRhIHN0cnVjdHVyZS4KLQotXGJlZ2lue3NlZWFsc299Ci0KLVxzZWVwZXB7MjU1fXtTaW1wbGUgR2VuZXJhdG9yc317V3JpdHRlbiBieSBOZWlsIFNjaGVtZW5hdWVyLCBUaW0KLVBldGVycywgTWFnbnVzIExpZSBIZXRsYW5kLiAgSW1wbGVtZW50ZWQgbW9zdGx5IGJ5IE5laWwgU2NoZW1lbmF1ZXIKLWFuZCBUaW0gUGV0ZXJzLCB3aXRoIG90aGVyIGZpeGVzIGZyb20gdGhlIFB5dGhvbiBMYWJzIGNyZXcufQotCi1cZW5ke3NlZWFsc299Ci0KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue1BFUCAyMzc6IFVuaWZ5aW5nIExvbmcgSW50ZWdlcnMgYW5kIEludGVnZXJzfQotCi1JbiByZWNlbnQgdmVyc2lvbnMsIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHJlZ3VsYXIgaW50ZWdlcnMsIHdoaWNoCi1hcmUgMzItYml0IHZhbHVlcyBvbiBtb3N0IG1hY2hpbmVzLCBhbmQgbG9uZyBpbnRlZ2Vycywgd2hpY2ggY2FuIGJlIG9mCi1hcmJpdHJhcnkgc2l6ZSwgd2FzIGJlY29taW5nIGFuIGFubm95YW5jZS4gIEZvciBleGFtcGxlLCBvbiBwbGF0Zm9ybXMKLXRoYXQgc3VwcG9ydCBmaWxlcyBsYXJnZXIgdGhhbiBcY29kZXsyKiozMn0gYnl0ZXMsIHRoZQotXG1ldGhvZHt0ZWxsKCl9IG1ldGhvZCBvZiBmaWxlIG9iamVjdHMgaGFzIHRvIHJldHVybiBhIGxvbmcgaW50ZWdlci4KLUhvd2V2ZXIsIHRoZXJlIHdlcmUgdmFyaW91cyBiaXRzIG9mIFB5dGhvbiB0aGF0IGV4cGVjdGVkIHBsYWluCi1pbnRlZ2VycyBhbmQgd291bGQgcmFpc2UgYW4gZXJyb3IgaWYgYSBsb25nIGludGVnZXIgd2FzIHByb3ZpZGVkCi1pbnN0ZWFkLiAgRm9yIGV4YW1wbGUsIGluIFB5dGhvbiAxLjUsIG9ubHkgcmVndWxhciBpbnRlZ2VycwotY291bGQgYmUgdXNlZCBhcyBhIHNsaWNlIGluZGV4LCBhbmQgXGNvZGV7J2FiYydbMUw6XX0gd291bGQgcmFpc2UgYQotXGV4Y2VwdGlvbntUeXBlRXJyb3J9IGV4Y2VwdGlvbiB3aXRoIHRoZSBtZXNzYWdlICdzbGljZSBpbmRleCBtdXN0IGJlCi1pbnQnLgotCi1QeXRob24gMi4yIHdpbGwgc2hpZnQgdmFsdWVzIGZyb20gc2hvcnQgdG8gbG9uZyBpbnRlZ2VycyBhcyByZXF1aXJlZC4KLVRoZSAnTCcgc3VmZml4IGlzIG5vIGxvbmdlciBuZWVkZWQgdG8gaW5kaWNhdGUgYSBsb25nIGludGVnZXIgbGl0ZXJhbCwKLWFzIG5vdyB0aGUgY29tcGlsZXIgd2lsbCBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIHR5cGUuICAoVXNpbmcgdGhlICdMJwotc3VmZml4IHdpbGwgYmUgZGlzY291cmFnZWQgaW4gZnV0dXJlIDIueCB2ZXJzaW9ucyBvZiBQeXRob24sCi10cmlnZ2VyaW5nIGEgd2FybmluZyBpbiBQeXRob24gMi40LCBhbmQgcHJvYmFibHkgZHJvcHBlZCBpbiBQeXRob24KLTMuMC4pICBNYW55IG9wZXJhdGlvbnMgdGhhdCB1c2VkIHRvIHJhaXNlIGFuIFxleGNlcHRpb257T3ZlcmZsb3dFcnJvcn0KLXdpbGwgbm93IHJldHVybiBhIGxvbmcgaW50ZWdlciBhcyB0aGVpciByZXN1bHQuICBGb3IgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IDEyMzQ1Njc4OTAxMjMKLTEyMzQ1Njc4OTAxMjNMCi0+Pj4gMiAqKiA2NAotMTg0NDY3NDQwNzM3MDk1NTE2MTZMCi1cZW5ke3ZlcmJhdGltfQotCi1JbiBtb3N0IGNhc2VzLCBpbnRlZ2VycyBhbmQgbG9uZyBpbnRlZ2VycyB3aWxsIG5vdyBiZSB0cmVhdGVkCi1pZGVudGljYWxseS4gIFlvdSBjYW4gc3RpbGwgZGlzdGluZ3Vpc2ggdGhlbSB3aXRoIHRoZQotXGZ1bmN0aW9ue3R5cGUoKX0gYnVpbHQtaW4gZnVuY3Rpb24sIGJ1dCB0aGF0J3MgcmFyZWx5IG5lZWRlZC4gIAotCi1cYmVnaW57c2VlYWxzb30KLQotXHNlZXBlcHsyMzd9e1VuaWZ5aW5nIExvbmcgSW50ZWdlcnMgYW5kIEludGVnZXJzfXtXcml0dGVuIGJ5Ci1Nb3NoZSBaYWRrYSBhbmQgR3VpZG8gdmFuIFJvc3N1bS4gIEltcGxlbWVudGVkIG1vc3RseSBieSBHdWlkbyB2YW4KLVJvc3N1bS59Ci0KLVxlbmR7c2VlYWxzb30KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257UEVQIDIzODogQ2hhbmdpbmcgdGhlIERpdmlzaW9uIE9wZXJhdG9yfQotCi1UaGUgbW9zdCBjb250cm92ZXJzaWFsIGNoYW5nZSBpbiBQeXRob24gMi4yIGhlcmFsZHMgdGhlIHN0YXJ0IG9mIGFuIGVmZm9ydAotdG8gZml4IGFuIG9sZCBkZXNpZ24gZmxhdyB0aGF0J3MgYmVlbiBpbiBQeXRob24gZnJvbSB0aGUgYmVnaW5uaW5nLgotQ3VycmVudGx5IFB5dGhvbidzIGRpdmlzaW9uIG9wZXJhdG9yLCBcY29kZXsvfSwgYmVoYXZlcyBsaWtlIEMncwotZGl2aXNpb24gb3BlcmF0b3Igd2hlbiBwcmVzZW50ZWQgd2l0aCB0d28gaW50ZWdlciBhcmd1bWVudHM6IGl0Ci1yZXR1cm5zIGFuIGludGVnZXIgcmVzdWx0IHRoYXQncyB0cnVuY2F0ZWQgZG93biB3aGVuIHRoZXJlIHdvdWxkIGJlCi1hIGZyYWN0aW9uYWwgcGFydC4gIEZvciBleGFtcGxlLCBcY29kZXszLzJ9IGlzIDEsIG5vdCAxLjUsIGFuZAotXGNvZGV7KC0xKS8yfSBpcyAtMSwgbm90IC0wLjUuICBUaGlzIG1lYW5zIHRoYXQgdGhlIHJlc3VsdHMgb2YgZGl2aXNvbgotY2FuIHZhcnkgdW5leHBlY3RlZGx5IGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiB0aGUgdHdvIG9wZXJhbmRzIGFuZAotYmVjYXVzZSBQeXRob24gaXMgZHluYW1pY2FsbHkgdHlwZWQsIGl0IGNhbiBiZSBkaWZmaWN1bHQgdG8gZGV0ZXJtaW5lCi10aGUgcG9zc2libGUgdHlwZXMgb2YgdGhlIG9wZXJhbmRzLgotCi0oVGhlIGNvbnRyb3ZlcnN5IGlzIG92ZXIgd2hldGhlciB0aGlzIGlzIFxlbXBoe3JlYWxseX0gYSBkZXNpZ24gZmxhdywKLWFuZCB3aGV0aGVyIGl0J3Mgd29ydGggYnJlYWtpbmcgZXhpc3RpbmcgY29kZSB0byBmaXggdGhpcy4gIEl0J3MKLWNhdXNlZCBlbmRsZXNzIGRpc2N1c3Npb25zIG9uIHB5dGhvbi1kZXYsIGFuZCBpbiBKdWx5IDIwMDEgZXJ1cHRlZCBpbnRvIGFuCi1zdG9ybSBvZiBhY2lkbHkgc2FyY2FzdGljIHBvc3RpbmdzIG9uIFxuZXdzZ3JvdXB7Y29tcC5sYW5nLnB5dGhvbn0uIEkKLXdvbid0IGFyZ3VlIGZvciBlaXRoZXIgc2lkZSBoZXJlIGFuZCB3aWxsIHN0aWNrIHRvIGRlc2NyaWJpbmcgd2hhdCdzIAotaW1wbGVtZW50ZWQgaW4gMi4yLiAgUmVhZCBccGVwezIzOH0gZm9yIGEgc3VtbWFyeSBvZiBhcmd1bWVudHMgYW5kCi1jb3VudGVyLWFyZ3VtZW50cy4pICAKLQotQmVjYXVzZSB0aGlzIGNoYW5nZSBtaWdodCBicmVhayBjb2RlLCBpdCdzIGJlaW5nIGludHJvZHVjZWQgdmVyeQotZ3JhZHVhbGx5LiAgUHl0aG9uIDIuMiBiZWdpbnMgdGhlIHRyYW5zaXRpb24sIGJ1dCB0aGUgc3dpdGNoIHdvbid0IGJlCi1jb21wbGV0ZSB1bnRpbCBQeXRob24gMy4wLgotCi1GaXJzdCwgSSdsbCBib3Jyb3cgc29tZSB0ZXJtaW5vbG9neSBmcm9tIFxwZXB7MjM4fS4gIGBgVHJ1ZSBkaXZpc2lvbicnIGlzIHRoZQotZGl2aXNpb24gdGhhdCBtb3N0IG5vbi1wcm9ncmFtbWVycyBhcmUgZmFtaWxpYXIgd2l0aDogMy8yIGlzIDEuNSwgMS80Ci1pcyAwLjI1LCBhbmQgc28gZm9ydGguICBgYEZsb29yIGRpdmlzaW9uJycgaXMgd2hhdCBQeXRob24ncyBcY29kZXsvfQotb3BlcmF0b3IgY3VycmVudGx5IGRvZXMgd2hlbiBnaXZlbiBpbnRlZ2VyIG9wZXJhbmRzOyB0aGUgcmVzdWx0IGlzIHRoZQotZmxvb3Igb2YgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRydWUgZGl2aXNpb24uICBgYENsYXNzaWMgZGl2aXNpb24nJyBpcwotdGhlIGN1cnJlbnQgbWl4ZWQgYmVoYXZpb3VyIG9mIFxjb2Rley99OyBpdCByZXR1cm5zIHRoZSByZXN1bHQgb2YKLWZsb29yIGRpdmlzaW9uIHdoZW4gdGhlIG9wZXJhbmRzIGFyZSBpbnRlZ2VycywgYW5kIHJldHVybnMgdGhlIHJlc3VsdAotb2YgdHJ1ZSBkaXZpc2lvbiB3aGVuIG9uZSBvZiB0aGUgb3BlcmFuZHMgaXMgYSBmbG9hdGluZy1wb2ludCBudW1iZXIuCi0KLUhlcmUgYXJlIHRoZSBjaGFuZ2VzIDIuMiBpbnRyb2R1Y2VzOgotCi1cYmVnaW57aXRlbWl6ZX0KLQotXGl0ZW0gQSBuZXcgb3BlcmF0b3IsIFxjb2Rley8vfSwgaXMgdGhlIGZsb29yIGRpdmlzaW9uIG9wZXJhdG9yLgotKFllcywgd2Uga25vdyBpdCBsb29rcyBsaWtlIFxDcHAncyBjb21tZW50IHN5bWJvbC4pICBcY29kZXsvL30KLVxlbXBoe2Fsd2F5c30gcGVyZm9ybXMgZmxvb3IgZGl2aXNpb24gbm8gbWF0dGVyIHdoYXQgdGhlIHR5cGVzIG9mCi1pdHMgb3BlcmFuZHMgYXJlLCBzbyBcY29kZXsxIC8vIDJ9IGlzIDAgYW5kIFxjb2RlezEuMCAvLyAyLjB9IGlzIGFsc28KLTAuMC4KLQotXGNvZGV7Ly99IGlzIGFsd2F5cyBhdmFpbGFibGUgaW4gUHl0aG9uIDIuMjsgeW91IGRvbid0IG5lZWQgdG8gZW5hYmxlCi1pdCB1c2luZyBhIFxjb2Rle19fZnV0dXJlX199IHN0YXRlbWVudC4gIAotCi1caXRlbSBCeSBpbmNsdWRpbmcgYSBcY29kZXtmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9ufSBpbiBhCi1tb2R1bGUsIHRoZSBcY29kZXsvfSBvcGVyYXRvciB3aWxsIGJlIGNoYW5nZWQgdG8gcmV0dXJuIHRoZSByZXN1bHQgb2YKLXRydWUgZGl2aXNpb24sIHNvIFxjb2RlezEvMn0gaXMgMC41LiAgV2l0aG91dCB0aGUgXGNvZGV7X19mdXR1cmVfX30KLXN0YXRlbWVudCwgXGNvZGV7L30gc3RpbGwgbWVhbnMgY2xhc3NpYyBkaXZpc2lvbi4gIFRoZSBkZWZhdWx0IG1lYW5pbmcKLW9mIFxjb2Rley99IHdpbGwgbm90IGNoYW5nZSB1bnRpbCBQeXRob24gMy4wLiAgCi0KLVxpdGVtIENsYXNzZXMgY2FuIGRlZmluZSBtZXRob2RzIGNhbGxlZCBcbWV0aG9ke19fdHJ1ZWRpdl9ffSBhbmQKLVxtZXRob2R7X19mbG9vcmRpdl9ffSB0byBvdmVybG9hZCB0aGUgdHdvIGRpdmlzaW9uIG9wZXJhdG9ycy4gIEF0IHRoZQotQyBsZXZlbCwgdGhlcmUgYXJlIGFsc28gc2xvdHMgaW4gdGhlIFxjdHlwZXtQeU51bWJlck1ldGhvZHN9IHN0cnVjdHVyZQotc28gZXh0ZW5zaW9uIHR5cGVzIGNhbiBkZWZpbmUgdGhlIHR3byBvcGVyYXRvcnMuCi0KLVxpdGVtIFB5dGhvbiAyLjIgc3VwcG9ydHMgc29tZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGZvciB0ZXN0aW5nCi13aGV0aGVyIGNvZGUgd2lsbCB3b3JrcyB3aXRoIHRoZSBjaGFuZ2VkIGRpdmlzaW9uIHNlbWFudGljcy4gIFJ1bm5pbmcKLXB5dGhvbiB3aXRoIFxwcm9ncmFtb3B0ey1RIHdhcm59IHdpbGwgY2F1c2UgYSB3YXJuaW5nIHRvIGJlIGlzc3VlZAotd2hlbmV2ZXIgZGl2aXNpb24gaXMgYXBwbGllZCB0byB0d28gaW50ZWdlcnMuICBZb3UgY2FuIHVzZSB0aGlzIHRvCi1maW5kIGNvZGUgdGhhdCdzIGFmZmVjdGVkIGJ5IHRoZSBjaGFuZ2UgYW5kIGZpeCBpdC4gIEJ5IGRlZmF1bHQsCi1QeXRob24gMi4yIHdpbGwgc2ltcGx5IHBlcmZvcm0gY2xhc3NpYyBkaXZpc2lvbiB3aXRob3V0IGEgd2FybmluZzsgdGhlCi13YXJuaW5nIHdpbGwgYmUgdHVybmVkIG9uIGJ5IGRlZmF1bHQgaW4gUHl0aG9uIDIuMy4KLQotXGVuZHtpdGVtaXplfQotCi1cYmVnaW57c2VlYWxzb30KLQotXHNlZXBlcHsyMzh9e0NoYW5naW5nIHRoZSBEaXZpc2lvbiBPcGVyYXRvcn17V3JpdHRlbiBieSBNb3NoZSBaYWRrYSBhbmQgCi1HdWlkbyB2YW4gUm9zc3VtLiAgSW1wbGVtZW50ZWQgYnkgR3VpZG8gdmFuIFJvc3N1bS4ufQotCi1cZW5ke3NlZWFsc299Ci0KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue1VuaWNvZGUgQ2hhbmdlc30KLQotUHl0aG9uJ3MgVW5pY29kZSBzdXBwb3J0IGhhcyBiZWVuIGVuaGFuY2VkIGEgYml0IGluIDIuMi4gIFVuaWNvZGUKLXN0cmluZ3MgYXJlIHVzdWFsbHkgc3RvcmVkIGFzIFVDUy0yLCBhcyAxNi1iaXQgdW5zaWduZWQgaW50ZWdlcnMuCi1QeXRob24gMi4yIGNhbiBhbHNvIGJlIGNvbXBpbGVkIHRvIHVzZSBVQ1MtNCwgMzItYml0IHVuc2lnbmVkCi1pbnRlZ2VycywgYXMgaXRzIGludGVybmFsIGVuY29kaW5nIGJ5IHN1cHBseWluZwotXGxvbmdwcm9ncmFtb3B0e2VuYWJsZS11bmljb2RlPXVjczR9IHRvIHRoZSBjb25maWd1cmUgc2NyaXB0LiAgCi0oSXQncyBhbHNvIHBvc3NpYmxlIHRvIHNwZWNpZnkKLVxsb25ncHJvZ3JhbW9wdHtkaXNhYmxlLXVuaWNvZGV9IHRvIGNvbXBsZXRlbHkgZGlzYWJsZSBVbmljb2RlCi1zdXBwb3J0LikKLQotV2hlbiBidWlsdCB0byB1c2UgVUNTLTQgKGEgYGB3aWRlIFB5dGhvbicnKSwgdGhlIGludGVycHJldGVyIGNhbgotbmF0aXZlbHkgaGFuZGxlIFVuaWNvZGUgY2hhcmFjdGVycyBmcm9tIFUrMDAwMDAwIHRvIFUrMTEwMDAwLCBzbyB0aGUKLXJhbmdlIG9mIGxlZ2FsIHZhbHVlcyBmb3IgdGhlIFxmdW5jdGlvbnt1bmljaHIoKX0gZnVuY3Rpb24gaXMgZXhwYW5kZWQKLWFjY29yZGluZ2x5LiAgVXNpbmcgYW4gaW50ZXJwcmV0ZXIgY29tcGlsZWQgdG8gdXNlIFVDUy0yIChhIGBgbmFycm93Ci1QeXRob24nJyksIHZhbHVlcyBncmVhdGVyIHRoYW4gNjU1MzUgd2lsbCBzdGlsbCBjYXVzZQotXGZ1bmN0aW9ue3VuaWNocigpfSB0byByYWlzZSBhIFxleGNlcHRpb257VmFsdWVFcnJvcn0gZXhjZXB0aW9uLgotVGhpcyBpcyBhbGwgZGVzY3JpYmVkIGluIFxwZXB7MjYxfSwgYGBTdXBwb3J0IGZvciBgd2lkZScgVW5pY29kZQotY2hhcmFjdGVycycnOyBjb25zdWx0IGl0IGZvciBmdXJ0aGVyIGRldGFpbHMuCi0KLUFub3RoZXIgY2hhbmdlIGlzIHNpbXBsZXIgdG8gZXhwbGFpbi4gU2luY2UgdGhlaXIgaW50cm9kdWN0aW9uLAotVW5pY29kZSBzdHJpbmdzIGhhdmUgc3VwcG9ydGVkIGFuIFxtZXRob2R7ZW5jb2RlKCl9IG1ldGhvZCB0byBjb252ZXJ0Ci10aGUgc3RyaW5nIHRvIGEgc2VsZWN0ZWQgZW5jb2Rpbmcgc3VjaCBhcyBVVEYtOCBvciBMYXRpbi0xLiAgQQotc3ltbWV0cmljIFxtZXRob2R7ZGVjb2RlKFxvcHRpb25hbHtcdmFye2VuY29kaW5nfX0pfSBtZXRob2QgaGFzIGJlZW4KLWFkZGVkIHRvIDgtYml0IHN0cmluZ3MgKHRob3VnaCBub3QgdG8gVW5pY29kZSBzdHJpbmdzKSBpbiAyLjIuCi1cbWV0aG9ke2RlY29kZSgpfSBhc3N1bWVzIHRoYXQgdGhlIHN0cmluZyBpcyBpbiB0aGUgc3BlY2lmaWVkIGVuY29kaW5nCi1hbmQgZGVjb2RlcyBpdCwgcmV0dXJuaW5nIHdoYXRldmVyIGlzIHJldHVybmVkIGJ5IHRoZSBjb2RlYy4gCi0KLVVzaW5nIHRoaXMgbmV3IGZlYXR1cmUsIGNvZGVjcyBoYXZlIGJlZW4gYWRkZWQgZm9yIHRhc2tzIG5vdCBkaXJlY3RseQotcmVsYXRlZCB0byBVbmljb2RlLiAgRm9yIGV4YW1wbGUsIGNvZGVjcyBoYXZlIGJlZW4gYWRkZWQgZm9yCi11dS1lbmNvZGluZywgTUlNRSdzIGJhc2U2NCBlbmNvZGluZywgYW5kIGNvbXByZXNzaW9uIHdpdGggdGhlCi1cbW9kdWxle3psaWJ9IG1vZHVsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHMgPSAiIiJIZXJlIGlzIGEgbGVuZ3RoeSBwaWVjZSBvZiByZWR1bmRhbnQsIG92ZXJseSB2ZXJib3NlLAotLi4uIGFuZCByZXBldGl0aXZlIHRleHQuCi0uLi4gIiIiCi0+Pj4gZGF0YSA9IHMuZW5jb2RlKCd6bGliJykKLT4+PiBkYXRhCi0neFx4OWNcclx4YzlceGMxXHJceDgwIFx4MTBceDA0XHhjMD9VbC4uLicKLT4+PiBkYXRhLmRlY29kZSgnemxpYicpCi0nSGVyZSBpcyBhIGxlbmd0aHkgcGllY2Ugb2YgcmVkdW5kYW50LCBvdmVybHkgdmVyYm9zZSxcbmFuZCByZXBldGl0aXZlIHRleHQuXG4nCi0+Pj4gcHJpbnQgcy5lbmNvZGUoJ3V1JykKLWJlZ2luIDY2NiA8ZGF0YT4KLU0yJjVSOTIhSTxSIUEoJlFFO0Y9VDonREA8JkVFOFY0QDtWOEA8RjVEPTZZRDg2WVQrIiFPPUY1UjsnREAKLT49RjVSOEZdUzkyUCo4NllEKCcpRTwmNVQ6NzFJPUY0QD0mNVg9IlgqCi0KLWVuZAotPj4+ICJzaGVlc2giLmVuY29kZSgncm90LTEzJykKLSdmdXJyZnUnCi1cZW5ke3ZlcmJhdGltfQotCi1UbyBjb252ZXJ0IGEgY2xhc3MgaW5zdGFuY2UgdG8gVW5pY29kZSwgYSBcbWV0aG9ke19fdW5pY29kZV9ffSBtZXRob2QKLWNhbiBiZSBkZWZpbmVkIGJ5IGEgY2xhc3MsIGFuYWxvZ291cyB0byBcbWV0aG9ke19fc3RyX199LgotCi1cbWV0aG9ke2VuY29kZSgpfSwgXG1ldGhvZHtkZWNvZGUoKX0sIGFuZCBcbWV0aG9ke19fdW5pY29kZV9ffSB3ZXJlCi1pbXBsZW1lbnRlZCBieSBNYXJjLUFuZHJcJ2UgTGVtYnVyZy4gIFRoZSBjaGFuZ2VzIHRvIHN1cHBvcnQgdXNpbmcKLVVDUy00IGludGVybmFsbHkgd2VyZSBpbXBsZW1lbnRlZCBieSBGcmVkcmlrIEx1bmRoIGFuZCBNYXJ0aW4gdm9uCi1MXCJvd2lzLgotCi1cYmVnaW57c2VlYWxzb30KLQotXHNlZXBlcHsyNjF9e1N1cHBvcnQgZm9yIGB3aWRlJyBVbmljb2RlIGNoYXJhY3RlcnN9e1dyaXR0ZW4gYnkKLVBhdWwgUHJlc2NvZC59Ci0KLVxlbmR7c2VlYWxzb30KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257UEVQIDIyNzogTmVzdGVkIFNjb3Blc30KLQotSW4gUHl0aG9uIDIuMSwgc3RhdGljYWxseSBuZXN0ZWQgc2NvcGVzIHdlcmUgYWRkZWQgYXMgYW4gb3B0aW9uYWwKLWZlYXR1cmUsIHRvIGJlIGVuYWJsZWQgYnkgYSBcY29kZXtmcm9tIF9fZnV0dXJlX18gaW1wb3J0Ci1uZXN0ZWRfc2NvcGVzfSBkaXJlY3RpdmUuICBJbiAyLjIgbmVzdGVkIHNjb3BlcyBubyBsb25nZXIgbmVlZCB0byBiZQotc3BlY2lhbGx5IGVuYWJsZWQsIGFuZCBhcmUgbm93IGFsd2F5cyBwcmVzZW50LiAgVGhlIHJlc3Qgb2YgdGhpcyBzZWN0aW9uCi1pcyBhIGNvcHkgb2YgdGhlIGRlc2NyaXB0aW9uIG9mIG5lc3RlZCBzY29wZXMgZnJvbSBteSBgYFdoYXQncyBOZXcgaW4KLVB5dGhvbiAyLjEnJyBkb2N1bWVudDsgaWYgeW91IHJlYWQgaXQgd2hlbiAyLjEgY2FtZSBvdXQsIHlvdSBjYW4gc2tpcAotdGhlIHJlc3Qgb2YgdGhpcyBzZWN0aW9uLgotCi1UaGUgbGFyZ2VzdCBjaGFuZ2UgaW50cm9kdWNlZCBpbiBQeXRob24gMi4xLCBhbmQgbWFkZSBjb21wbGV0ZSBpbiAyLjIsCi1pcyB0byBQeXRob24ncyBzY29waW5nIHJ1bGVzLiAgSW4gUHl0aG9uIDIuMCwgYXQgYW55IGdpdmVuIHRpbWUgdGhlcmUKLWFyZSBhdCBtb3N0IHRocmVlIG5hbWVzcGFjZXMgdXNlZCB0byBsb29rIHVwIHZhcmlhYmxlIG5hbWVzOiBsb2NhbCwKLW1vZHVsZS1sZXZlbCwgYW5kIHRoZSBidWlsdC1pbiBuYW1lc3BhY2UuICBUaGlzIG9mdGVuIHN1cnByaXNlZCBwZW9wbGUKLWJlY2F1c2UgaXQgZGlkbid0IG1hdGNoIHRoZWlyIGludHVpdGl2ZSBleHBlY3RhdGlvbnMuICBGb3IgZXhhbXBsZSwgYQotbmVzdGVkIHJlY3Vyc2l2ZSBmdW5jdGlvbiBkZWZpbml0aW9uIGRvZXNuJ3Qgd29yazoKLQotXGJlZ2lue3ZlcmJhdGltfQotZGVmIGYoKToKLSAgICAuLi4KLSAgICBkZWYgZyh2YWx1ZSk6Ci0gICAgICAgIC4uLgotICAgICAgICByZXR1cm4gZyh2YWx1ZS0xKSArIDEKLSAgICAuLi4KLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBmdW5jdGlvbiBcZnVuY3Rpb257ZygpfSB3aWxsIGFsd2F5cyByYWlzZSBhIFxleGNlcHRpb257TmFtZUVycm9yfQotZXhjZXB0aW9uLCBiZWNhdXNlIHRoZSBiaW5kaW5nIG9mIHRoZSBuYW1lIFxzYW1we2d9IGlzbid0IGluIGVpdGhlcgotaXRzIGxvY2FsIG5hbWVzcGFjZSBvciBpbiB0aGUgbW9kdWxlLWxldmVsIG5hbWVzcGFjZS4gIFRoaXMgaXNuJ3QgbXVjaAotb2YgYSBwcm9ibGVtIGluIHByYWN0aWNlIChob3cgb2Z0ZW4gZG8geW91IHJlY3Vyc2l2ZWx5IGRlZmluZSBpbnRlcmlvcgotZnVuY3Rpb25zIGxpa2UgdGhpcz8pLCBidXQgdGhpcyBhbHNvIG1hZGUgdXNpbmcgdGhlIFxrZXl3b3Jke2xhbWJkYX0KLXN0YXRlbWVudCBjbHVtc2llciwgYW5kIHRoaXMgd2FzIGEgcHJvYmxlbSBpbiBwcmFjdGljZS4gIEluIGNvZGUgd2hpY2gKLXVzZXMgXGtleXdvcmR7bGFtYmRhfSB5b3UgY2FuIG9mdGVuIGZpbmQgbG9jYWwgdmFyaWFibGVzIGJlaW5nIGNvcGllZAotYnkgcGFzc2luZyB0aGVtIGFzIHRoZSBkZWZhdWx0IHZhbHVlcyBvZiBhcmd1bWVudHMuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLWRlZiBmaW5kKHNlbGYsIG5hbWUpOgotICAgICJSZXR1cm4gbGlzdCBvZiBhbnkgZW50cmllcyBlcXVhbCB0byAnbmFtZSciCi0gICAgTCA9IGZpbHRlcihsYW1iZGEgeCwgbmFtZT1uYW1lOiB4ID09IG5hbWUsCi0gICAgICAgICAgICAgICBzZWxmLmxpc3RfYXR0cmlidXRlKQotICAgIHJldHVybiBMCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgcmVhZGFiaWxpdHkgb2YgUHl0aG9uIGNvZGUgd3JpdHRlbiBpbiBhIHN0cm9uZ2x5IGZ1bmN0aW9uYWwgc3R5bGUKLXN1ZmZlcnMgZ3JlYXRseSBhcyBhIHJlc3VsdC4KLQotVGhlIG1vc3Qgc2lnbmlmaWNhbnQgY2hhbmdlIHRvIFB5dGhvbiAyLjIgaXMgdGhhdCBzdGF0aWMgc2NvcGluZyBoYXMKLWJlZW4gYWRkZWQgdG8gdGhlIGxhbmd1YWdlIHRvIGZpeCB0aGlzIHByb2JsZW0uICBBcyBhIGZpcnN0IGVmZmVjdCwKLXRoZSBcY29kZXtuYW1lPW5hbWV9IGRlZmF1bHQgYXJndW1lbnQgaXMgbm93IHVubmVjZXNzYXJ5IGluIHRoZSBhYm92ZQotZXhhbXBsZS4gIFB1dCBzaW1wbHksIHdoZW4gYSBnaXZlbiB2YXJpYWJsZSBuYW1lIGlzIG5vdCBhc3NpZ25lZCBhCi12YWx1ZSB3aXRoaW4gYSBmdW5jdGlvbiAoYnkgYW4gYXNzaWdubWVudCwgb3IgdGhlIFxrZXl3b3Jke2RlZn0sCi1ca2V5d29yZHtjbGFzc30sIG9yIFxrZXl3b3Jke2ltcG9ydH0gc3RhdGVtZW50cyksIHJlZmVyZW5jZXMgdG8gdGhlCi12YXJpYWJsZSB3aWxsIGJlIGxvb2tlZCB1cCBpbiB0aGUgbG9jYWwgbmFtZXNwYWNlIG9mIHRoZSBlbmNsb3NpbmcKLXNjb3BlLiAgQSBtb3JlIGRldGFpbGVkIGV4cGxhbmF0aW9uIG9mIHRoZSBydWxlcywgYW5kIGEgZGlzc2VjdGlvbiBvZgotdGhlIGltcGxlbWVudGF0aW9uLCBjYW4gYmUgZm91bmQgaW4gdGhlIFBFUC4KLQotVGhpcyBjaGFuZ2UgbWF5IGNhdXNlIHNvbWUgY29tcGF0aWJpbGl0eSBwcm9ibGVtcyBmb3IgY29kZSB3aGVyZSB0aGUKLXNhbWUgdmFyaWFibGUgbmFtZSBpcyB1c2VkIGJvdGggYXQgdGhlIG1vZHVsZSBsZXZlbCBhbmQgYXMgYSBsb2NhbAotdmFyaWFibGUgd2l0aGluIGEgZnVuY3Rpb24gdGhhdCBjb250YWlucyBmdXJ0aGVyIGZ1bmN0aW9uIGRlZmluaXRpb25zLgotVGhpcyBzZWVtcyByYXRoZXIgdW5saWtlbHkgdGhvdWdoLCBzaW5jZSBzdWNoIGNvZGUgd291bGQgaGF2ZSBiZWVuCi1wcmV0dHkgY29uZnVzaW5nIHRvIHJlYWQgaW4gdGhlIGZpcnN0IHBsYWNlLiAgCi0KLU9uZSBzaWRlIGVmZmVjdCBvZiB0aGUgY2hhbmdlIGlzIHRoYXQgdGhlIFxjb2Rle2Zyb20gXHZhcnttb2R1bGV9Ci1pbXBvcnQgKn0gYW5kIFxrZXl3b3Jke2V4ZWN9IHN0YXRlbWVudHMgaGF2ZSBiZWVuIG1hZGUgaWxsZWdhbCBpbnNpZGUKLWEgZnVuY3Rpb24gc2NvcGUgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zLiAgVGhlIFB5dGhvbiByZWZlcmVuY2UKLW1hbnVhbCBoYXMgc2FpZCBhbGwgYWxvbmcgdGhhdCBcY29kZXtmcm9tIFx2YXJ7bW9kdWxlfSBpbXBvcnQgKn0gaXMKLW9ubHkgbGVnYWwgYXQgdGhlIHRvcCBsZXZlbCBvZiBhIG1vZHVsZSwgYnV0IHRoZSBDUHl0aG9uIGludGVycHJldGVyCi1oYXMgbmV2ZXIgZW5mb3JjZWQgdGhpcyBiZWZvcmUuICBBcyBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZgotbmVzdGVkIHNjb3BlcywgdGhlIGNvbXBpbGVyIHdoaWNoIHR1cm5zIFB5dGhvbiBzb3VyY2UgaW50byBieXRlY29kZXMKLWhhcyB0byBnZW5lcmF0ZSBkaWZmZXJlbnQgY29kZSB0byBhY2Nlc3MgdmFyaWFibGVzIGluIGEgY29udGFpbmluZwotc2NvcGUuICBcY29kZXtmcm9tIFx2YXJ7bW9kdWxlfSBpbXBvcnQgKn0gYW5kIFxrZXl3b3Jke2V4ZWN9IG1ha2UgaXQKLWltcG9zc2libGUgZm9yIHRoZSBjb21waWxlciB0byBmaWd1cmUgdGhpcyBvdXQsIGJlY2F1c2UgdGhleSBhZGQgbmFtZXMKLXRvIHRoZSBsb2NhbCBuYW1lc3BhY2UgdGhhdCBhcmUgdW5rbm93YWJsZSBhdCBjb21waWxlIHRpbWUuCi1UaGVyZWZvcmUsIGlmIGEgZnVuY3Rpb24gY29udGFpbnMgZnVuY3Rpb24gZGVmaW5pdGlvbnMgb3IKLVxrZXl3b3Jke2xhbWJkYX0gZXhwcmVzc2lvbnMgd2l0aCBmcmVlIHZhcmlhYmxlcywgdGhlIGNvbXBpbGVyIHdpbGwKLWZsYWcgdGhpcyBieSByYWlzaW5nIGEgXGV4Y2VwdGlvbntTeW50YXhFcnJvcn0gZXhjZXB0aW9uLgotCi1UbyBtYWtlIHRoZSBwcmVjZWRpbmcgZXhwbGFuYXRpb24gYSBiaXQgY2xlYXJlciwgaGVyZSdzIGFuIGV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXggPSAxCi1kZWYgZigpOgotICAgICMgVGhlIG5leHQgbGluZSBpcyBhIHN5bnRheCBlcnJvcgotICAgIGV4ZWMgJ3g9MicgIAotICAgIGRlZiBnKCk6Ci0gICAgICAgIHJldHVybiB4Ci1cZW5ke3ZlcmJhdGltfQotCi1MaW5lIDQgY29udGFpbmluZyB0aGUgXGtleXdvcmR7ZXhlY30gc3RhdGVtZW50IGlzIGEgc3ludGF4IGVycm9yLAotc2luY2UgXGtleXdvcmR7ZXhlY30gd291bGQgZGVmaW5lIGEgbmV3IGxvY2FsIHZhcmlhYmxlIG5hbWVkIFxzYW1we3h9Ci13aG9zZSB2YWx1ZSBzaG91bGQgYmUgYWNjZXNzZWQgYnkgXGZ1bmN0aW9ue2coKX0uICAKLQotVGhpcyBzaG91bGRuJ3QgYmUgbXVjaCBvZiBhIGxpbWl0YXRpb24sIHNpbmNlIFxrZXl3b3Jke2V4ZWN9IGlzIHJhcmVseQotdXNlZCBpbiBtb3N0IFB5dGhvbiBjb2RlIChhbmQgd2hlbiBpdCBpcyB1c2VkLCBpdCdzIG9mdGVuIGEgc2lnbiBvZiBhCi1wb29yIGRlc2lnbiBhbnl3YXkpLgotCi1cYmVnaW57c2VlYWxzb30KLQotXHNlZXBlcHsyMjd9e1N0YXRpY2FsbHkgTmVzdGVkIFNjb3Blc317V3JpdHRlbiBhbmQgaW1wbGVtZW50ZWQgYnkKLUplcmVteSBIeWx0b24ufQotCi1cZW5ke3NlZWFsc299Ci0KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue05ldyBhbmQgSW1wcm92ZWQgTW9kdWxlc30KLQotXGJlZ2lue2l0ZW1pemV9Ci0KLSAgXGl0ZW0gVGhlIFxtb2R1bGV7eG1scnBjbGlifSBtb2R1bGUgd2FzIGNvbnRyaWJ1dGVkIHRvIHRoZSBzdGFuZGFyZAotICBsaWJyYXJ5IGJ5IEZyZWRyaWsgTHVuZGgsIHByb3ZpZGluZyBzdXBwb3J0IGZvciB3cml0aW5nIFhNTC1SUEMKLSAgY2xpZW50cy4gIFhNTC1SUEMgaXMgYSBzaW1wbGUgcmVtb3RlIHByb2NlZHVyZSBjYWxsIHByb3RvY29sIGJ1aWx0IG9uCi0gIHRvcCBvZiBIVFRQIGFuZCBYTUwuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHNuaXBwZXQgcmV0cmlldmVzIGEKLSAgbGlzdCBvZiBSU1MgY2hhbm5lbHMgZnJvbSB0aGUgTydSZWlsbHkgTmV0d29yaywgYW5kIHRoZW4gCi0gIGxpc3RzIHRoZSByZWNlbnQgaGVhZGxpbmVzIGZvciBvbmUgY2hhbm5lbDoKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IHhtbHJwY2xpYgotcyA9IHhtbHJwY2xpYi5TZXJ2ZXIoCi0gICAgICAnaHR0cDovL3d3dy5vcmVpbGx5bmV0LmNvbS9tZWVya2F0L3htbC1ycGMvc2VydmVyLnBocCcpCi1jaGFubmVscyA9IHMubWVlcmthdC5nZXRDaGFubmVscygpCi0jIGNoYW5uZWxzIGlzIGEgbGlzdCBvZiBkaWN0aW9uYXJpZXMsIGxpa2UgdGhpczoKLSMgW3snaWQnOiA0LCAndGl0bGUnOiAnRnJlc2htZWF0IERhaWx5IE5ld3MnfQotIyAgeydpZCc6IDE5MCwgJ3RpdGxlJzogJzMyQml0cyBPbmxpbmUnfSwKLSMgIHsnaWQnOiA0NTQ5LCAndGl0bGUnOiAnM0RHYW1lcnMnfSwgLi4uIF0KLQotIyBHZXQgdGhlIGl0ZW1zIGZvciBvbmUgY2hhbm5lbAotaXRlbXMgPSBzLm1lZXJrYXQuZ2V0SXRlbXMoIHsnY2hhbm5lbCc6IDR9ICkKLQotIyAnaXRlbXMnIGlzIGFub3RoZXIgbGlzdCBvZiBkaWN0aW9uYXJpZXMsIGxpa2UgdGhpczoKLSMgW3snbGluayc6ICdodHRwOi8vZnJlc2htZWF0Lm5ldC9yZWxlYXNlcy81MjcxOS8nLCAKLSMgICAnZGVzY3JpcHRpb24nOiAnQSB1dGlsaXR5IHdoaWNoIGNvbnZlcnRzIEhUTUwgdG8gWFNMIEZPLicsIAotIyAgICd0aXRsZSc6ICdodG1sMmZvIDAuMyAoRGVmYXVsdCknfSwgLi4uIF0KLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBcbW9kdWxle1NpbXBsZVhNTFJQQ1NlcnZlcn0gbW9kdWxlIG1ha2VzIGl0IGVhc3kgdG8gY3JlYXRlCi1zdHJhaWdodGZvcndhcmQgWE1MLVJQQyBzZXJ2ZXJzLiAgU2VlIFx1cmx7aHR0cDovL3d3dy54bWxycGMuY29tL30gZm9yCi1tb3JlIGluZm9ybWF0aW9uIGFib3V0IFhNTC1SUEMuCi0KLSAgXGl0ZW0gVGhlIG5ldyBcbW9kdWxle2htYWN9IG1vZHVsZSBpbXBsZW1lbnRzIHRoZSBITUFDCi0gIGFsZ29yaXRobSBkZXNjcmliZWQgYnkgXHJmY3syMTA0fS4KLSAgKENvbnRyaWJ1dGVkIGJ5IEdlcmhhcmQgSFwiYXJpbmcuKQotCi0gIFxpdGVtIFNldmVyYWwgZnVuY3Rpb25zIHRoYXQgb3JpZ2luYWxseSByZXR1cm5lZCBsZW5ndGh5IHR1cGxlcyBub3cKLSAgcmV0dXJuIHBzZXVkby1zZXF1ZW5jZXMgdGhhdCBzdGlsbCBiZWhhdmUgbGlrZSB0dXBsZXMgYnV0IGFsc28gaGF2ZQotICBtbmVtb25pYyBhdHRyaWJ1dGVzIHN1Y2ggYXMgbWVtYmVye3N0X210aW1lfSBvciBcbWVtYmVye3RtX3llYXJ9LgotICBUaGUgZW5oYW5jZWQgZnVuY3Rpb25zIGluY2x1ZGUgXGZ1bmN0aW9ue3N0YXQoKX0sCi0gIFxmdW5jdGlvbntmc3RhdCgpfSwgXGZ1bmN0aW9ue3N0YXR2ZnMoKX0sIGFuZCBcZnVuY3Rpb257ZnN0YXR2ZnMoKX0KLSAgaW4gdGhlIFxtb2R1bGV7b3N9IG1vZHVsZSwgYW5kIFxmdW5jdGlvbntsb2NhbHRpbWUoKX0sCi0gIFxmdW5jdGlvbntnbXRpbWUoKX0sIGFuZCBcZnVuY3Rpb257c3RycHRpbWUoKX0gaW4gdGhlIFxtb2R1bGV7dGltZX0KLSAgbW9kdWxlLiAgCi0gIAotICBGb3IgZXhhbXBsZSwgdG8gb2J0YWluIGEgZmlsZSdzIHNpemUgdXNpbmcgdGhlIG9sZCB0dXBsZXMsIHlvdSdkIGVuZAotICB1cCB3cml0aW5nIHNvbWV0aGluZyBsaWtlIFxjb2Rle2ZpbGVfc2l6ZSA9Ci0gIG9zLnN0YXQoZmlsZW5hbWUpW3N0YXQuU1RfU0laRV19LCBidXQgbm93IHRoaXMgY2FuIGJlIHdyaXR0ZW4gbW9yZQotICBjbGVhcmx5IGFzIFxjb2Rle2ZpbGVfc2l6ZSA9IG9zLnN0YXQoZmlsZW5hbWUpLnN0X3NpemV9LgotCi0gICBUaGUgb3JpZ2luYWwgcGF0Y2ggZm9yIHRoaXMgZmVhdHVyZSB3YXMgY29udHJpYnV0ZWQgYnkgTmljayBNYXRoZXdzb24uCi0KLSAgXGl0ZW0gVGhlIFB5dGhvbiBwcm9maWxlciBoYXMgYmVlbiBleHRlbnNpdmVseSByZXdvcmtlZCBhbmQgdmFyaW91cwotICBlcnJvcnMgaW4gaXRzIG91dHB1dCBoYXZlIGJlZW4gY29ycmVjdGVkLiAgKENvbnRyaWJ1dGVkIGJ5Ci0gIEZyZWR+TC4gRHJha2UsIEpyLiBhbmQgVGltIFBldGVycy4pCi0gCi0gIFxpdGVtIFRoZSBcbW9kdWxle3NvY2tldH0gbW9kdWxlIGNhbiBiZSBjb21waWxlZCB0byBzdXBwb3J0IElQdjY7Ci0gIHNwZWNpZnkgdGhlIFxsb25ncHJvZ3JhbW9wdHtlbmFibGUtaXB2Nn0gb3B0aW9uIHRvIFB5dGhvbidzIGNvbmZpZ3VyZQotICBzY3JpcHQuICAoQ29udHJpYnV0ZWQgYnkgSnVuLWljaGlybyBgYGl0b2p1bicnIEhhZ2luby4pCi0KLSAgXGl0ZW0gVHdvIG5ldyBmb3JtYXQgY2hhcmFjdGVycyB3ZXJlIGFkZGVkIHRvIHRoZSBcbW9kdWxle3N0cnVjdH0KLSAgbW9kdWxlIGZvciA2NC1iaXQgaW50ZWdlcnMgb24gcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCB0aGUgQwotICBcY3R5cGV7bG9uZyBsb25nfSB0eXBlLiAgXHNhbXB7cX0gaXMgZm9yIGEgc2lnbmVkIDY0LWJpdCBpbnRlZ2VyLAotICBhbmQgXHNhbXB7UX0gaXMgZm9yIGFuIHVuc2lnbmVkIG9uZS4gIFRoZSB2YWx1ZSBpcyByZXR1cm5lZCBpbgotICBQeXRob24ncyBsb25nIGludGVnZXIgdHlwZS4gIChDb250cmlidXRlZCBieSBUaW0gUGV0ZXJzLikKLQotICBcaXRlbSBJbiB0aGUgaW50ZXJwcmV0ZXIncyBpbnRlcmFjdGl2ZSBtb2RlLCB0aGVyZSdzIGEgbmV3IGJ1aWx0LWluCi0gIGZ1bmN0aW9uIFxmdW5jdGlvbntoZWxwKCl9IHRoYXQgdXNlcyB0aGUgXG1vZHVsZXtweWRvY30gbW9kdWxlCi0gIGludHJvZHVjZWQgaW4gUHl0aG9uIDIuMSB0byBwcm92aWRlIGludGVyYWN0aXZlIGhlbHAuCi0gIFxjb2Rle2hlbHAoXHZhcntvYmplY3R9KX0gZGlzcGxheXMgYW55IGF2YWlsYWJsZSBoZWxwIHRleHQgYWJvdXQKLSAgXHZhcntvYmplY3R9LiAgXGZ1bmN0aW9ue2hlbHAoKX0gd2l0aCBubyBhcmd1bWVudCBwdXRzIHlvdSBpbiBhbiBvbmxpbmUKLSAgaGVscCB1dGlsaXR5LCB3aGVyZSB5b3UgY2FuIGVudGVyIHRoZSBuYW1lcyBvZiBmdW5jdGlvbnMsIGNsYXNzZXMsCi0gIG9yIG1vZHVsZXMgdG8gcmVhZCB0aGVpciBoZWxwIHRleHQuCi0gIChDb250cmlidXRlZCBieSBHdWlkbyB2YW4gUm9zc3VtLCB1c2luZyBLYS1QaW5nIFllZSdzIFxtb2R1bGV7cHlkb2N9IG1vZHVsZS4pCi0KLSAgXGl0ZW0gVmFyaW91cyBidWdmaXhlcyBhbmQgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIGhhdmUgYmVlbiBtYWRlCi0gIHRvIHRoZSBTUkUgZW5naW5lIHVuZGVybHlpbmcgdGhlIFxtb2R1bGV7cmV9IG1vZHVsZS4gIEZvciBleGFtcGxlLAotICB0aGUgXGZ1bmN0aW9ue3JlLnN1YigpfSBhbmQgXGZ1bmN0aW9ue3JlLnNwbGl0KCl9IGZ1bmN0aW9ucyBoYXZlCi0gIGJlZW4gcmV3cml0dGVuIGluIEMuICBBbm90aGVyIGNvbnRyaWJ1dGVkIHBhdGNoIHNwZWVkcyB1cCBjZXJ0YWluCi0gIFVuaWNvZGUgY2hhcmFjdGVyIHJhbmdlcyBieSBhIGZhY3RvciBvZiB0d28sIGFuZCBhIG5ldyBcbWV0aG9ke2ZpbmRpdGVyKCl9IAotICBtZXRob2QgdGhhdCByZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgYWxsIHRoZSBub24tb3ZlcmxhcHBpbmcgbWF0Y2hlcyBpbiAKLSAgYSBnaXZlbiBzdHJpbmcuIAotICAoU1JFIGlzIG1haW50YWluZWQgYnkKLSAgRnJlZHJpayBMdW5kaC4gIFRoZSBCSUdDSEFSU0VUIHBhdGNoIHdhcyBjb250cmlidXRlZCBieSBNYXJ0aW4gdm9uCi0gIExcIm93aXMuKQotCi0gIFxpdGVtIFRoZSBcbW9kdWxle3NtdHBsaWJ9IG1vZHVsZSBub3cgc3VwcG9ydHMgXHJmY3syNDg3fSwgYGBTZWN1cmUKLSAgU01UUCBvdmVyIFRMUycnLCBzbyBpdCdzIG5vdyBwb3NzaWJsZSB0byBlbmNyeXB0IHRoZSBTTVRQIHRyYWZmaWMKLSAgYmV0d2VlbiBhIFB5dGhvbiBwcm9ncmFtIGFuZCB0aGUgbWFpbCB0cmFuc3BvcnQgYWdlbnQgYmVpbmcgaGFuZGVkIGEKLSAgbWVzc2FnZS4gIFxtb2R1bGV7c210cGxpYn0gYWxzbyBzdXBwb3J0cyBTTVRQIGF1dGhlbnRpY2F0aW9uLiAKLSAgKENvbnRyaWJ1dGVkIGJ5IEdlcmhhcmQgSFwiYXJpbmcuKQotCi0gIFxpdGVtIFRoZSBcbW9kdWxle2ltYXBsaWJ9IG1vZHVsZSwgbWFpbnRhaW5lZCBieSBQaWVycyBMYXVkZXIsIGhhcwotICBzdXBwb3J0IGZvciBzZXZlcmFsIG5ldyBleHRlbnNpb25zOiB0aGUgTkFNRVNQQUNFIGV4dGVuc2lvbiBkZWZpbmVkCi0gIGluIFxyZmN7MjM0Mn0sIFNPUlQsIEdFVEFDTCBhbmQgU0VUQUNMLiAgKENvbnRyaWJ1dGVkIGJ5IEFudGhvbnkKLSAgQmF4dGVyIGFuZCBNaWNoZWwgUGVsbGV0aWVyLikKLQotICBcaXRlbSBUaGUgXG1vZHVsZXtyZmM4MjJ9IG1vZHVsZSdzIHBhcnNpbmcgb2YgZW1haWwgYWRkcmVzc2VzIGlzIG5vdwotICBjb21wbGlhbnQgd2l0aCBccmZjezI4MjJ9LCBhbiB1cGRhdGUgdG8gXHJmY3s4MjJ9LiAgKFRoZSBtb2R1bGUncwotICBuYW1lIGlzIFxlbXBoe25vdH0gZ29pbmcgdG8gYmUgY2hhbmdlZCB0byBcc2FtcHtyZmMyODIyfS4pICBBIG5ldwotICBwYWNrYWdlLCBcbW9kdWxle2VtYWlsfSwgaGFzIGFsc28gYmVlbiBhZGRlZCBmb3IgcGFyc2luZyBhbmQKLSAgZ2VuZXJhdGluZyBlLW1haWwgbWVzc2FnZXMuICAoQ29udHJpYnV0ZWQgYnkgQmFycnkgV2Fyc2F3LCBhbmQKLSAgYXJpc2luZyBvdXQgb2YgaGlzIHdvcmsgb24gTWFpbG1hbi4pCi0KLSAgXGl0ZW0gVGhlIFxtb2R1bGV7ZGlmZmxpYn0gbW9kdWxlIG5vdyBjb250YWlucyBhIG5ldyBcY2xhc3N7RGlmZmVyfQotICBjbGFzcyBmb3IgcHJvZHVjaW5nIGh1bWFuLXJlYWRhYmxlIGxpc3RzIG9mIGNoYW5nZXMgKGEgYGBkZWx0YScnKQotICBiZXR3ZWVuIHR3byBzZXF1ZW5jZXMgb2YgbGluZXMgb2YgdGV4dC4gIFRoZXJlIGFyZSBhbHNvIHR3bwotICBnZW5lcmF0b3IgZnVuY3Rpb25zLCBcZnVuY3Rpb257bmRpZmYoKX0gYW5kIFxmdW5jdGlvbntyZXN0b3JlKCl9LAotICB3aGljaCByZXNwZWN0aXZlbHkgcmV0dXJuIGEgZGVsdGEgZnJvbSB0d28gc2VxdWVuY2VzLCBvciBvbmUgb2YgdGhlCi0gIG9yaWdpbmFsIHNlcXVlbmNlcyBmcm9tIGEgZGVsdGEuIChHcnVudCB3b3JrIGNvbnRyaWJ1dGVkIGJ5IERhdmlkCi0gIEdvb2RnZXIsIGZyb20gbmRpZmYucHkgY29kZSBieSBUaW0gUGV0ZXJzIHdobyB0aGVuIGRpZCB0aGUKLSAgZ2VuZXJhdG9yaXphdGlvbi4pCi0KLSAgXGl0ZW0gTmV3IGNvbnN0YW50cyBcY29uc3RhbnR7YXNjaWlfbGV0dGVyc30sCi0gIFxjb25zdGFudHthc2NpaV9sb3dlcmNhc2V9LCBhbmQgXGNvbnN0YW50e2FzY2lpX3VwcGVyY2FzZX0gd2VyZQotICBhZGRlZCB0byB0aGUgXG1vZHVsZXtzdHJpbmd9IG1vZHVsZS4gIFRoZXJlIHdlcmUgc2V2ZXJhbCBtb2R1bGVzIGluCi0gIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IHRoYXQgdXNlZCBcY29uc3RhbnR7c3RyaW5nLmxldHRlcnN9IHRvIG1lYW4gdGhlCi0gIHJhbmdlcyBBLVphLXosIGJ1dCB0aGF0IGFzc3VtcHRpb24gaXMgaW5jb3JyZWN0IHdoZW4gbG9jYWxlcyBhcmUgaW4KLSAgdXNlLCBiZWNhdXNlIFxjb25zdGFudHtzdHJpbmcubGV0dGVyc30gdmFyaWVzIGRlcGVuZGluZyBvbiB0aGUgc2V0Ci0gIG9mIGxlZ2FsIGNoYXJhY3RlcnMgZGVmaW5lZCBieSB0aGUgY3VycmVudCBsb2NhbGUuICBUaGUgYnVnZ3kKLSAgbW9kdWxlcyBoYXZlIGFsbCBiZWVuIGZpeGVkIHRvIHVzZSBcY29uc3RhbnR7YXNjaWlfbGV0dGVyc30gaW5zdGVhZC4KLSAgKFJlcG9ydGVkIGJ5IGFuIHVua25vd24gcGVyc29uOyBmaXhlZCBieSBGcmVkfkwuIERyYWtlLCBKci4pCi0KLSAgXGl0ZW0gVGhlIFxtb2R1bGV7bWltZXR5cGVzfSBtb2R1bGUgbm93IG1ha2VzIGl0IGVhc2llciB0byB1c2UKLSAgYWx0ZXJuYXRpdmUgTUlNRS10eXBlIGRhdGFiYXNlcyBieSB0aGUgYWRkaXRpb24gb2YgYQotICBcY2xhc3N7TWltZVR5cGVzfSBjbGFzcywgd2hpY2ggdGFrZXMgYSBsaXN0IG9mIGZpbGVuYW1lcyB0byBiZQotICBwYXJzZWQuICAoQ29udHJpYnV0ZWQgYnkgRnJlZH5MLiBEcmFrZSwgSnIuKQotCi0gIFxpdGVtIEEgXGNsYXNze1RpbWVyfSBjbGFzcyB3YXMgYWRkZWQgdG8gdGhlIFxtb2R1bGV7dGhyZWFkaW5nfQotICBtb2R1bGUgdGhhdCBhbGxvd3Mgc2NoZWR1bGluZyBhbiBhY3Rpdml0eSB0byBoYXBwZW4gYXQgc29tZSBmdXR1cmUKLSAgdGltZS4gIChDb250cmlidXRlZCBieSBJdGFtYXIgU2h0dWxsLVRyYXVyaW5nLikKLQotXGVuZHtpdGVtaXplfQotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntJbnRlcnByZXRlciBDaGFuZ2VzIGFuZCBGaXhlc30KLQotU29tZSBvZiB0aGUgY2hhbmdlcyBvbmx5IGFmZmVjdCBwZW9wbGUgd2hvIGRlYWwgd2l0aCB0aGUgUHl0aG9uCi1pbnRlcnByZXRlciBhdCB0aGUgQyBsZXZlbCBiZWNhdXNlIHRoZXkncmUgd3JpdGluZyBQeXRob24gZXh0ZW5zaW9uIG1vZHVsZXMsCi1lbWJlZGRpbmcgdGhlIGludGVycHJldGVyLCBvciBqdXN0IGhhY2tpbmcgb24gdGhlIGludGVycHJldGVyIGl0c2VsZi4KLUlmIHlvdSBvbmx5IHdyaXRlIFB5dGhvbiBjb2RlLCBub25lIG9mIHRoZSBjaGFuZ2VzIGRlc2NyaWJlZCBoZXJlIHdpbGwKLWFmZmVjdCB5b3UgdmVyeSBtdWNoLgotCi1cYmVnaW57aXRlbWl6ZX0KLQotICBcaXRlbSBQcm9maWxpbmcgYW5kIHRyYWNpbmcgZnVuY3Rpb25zIGNhbiBub3cgYmUgaW1wbGVtZW50ZWQgaW4gQywKLSAgd2hpY2ggY2FuIG9wZXJhdGUgYXQgbXVjaCBoaWdoZXIgc3BlZWRzIHRoYW4gUHl0aG9uLWJhc2VkIGZ1bmN0aW9ucwotICBhbmQgc2hvdWxkIHJlZHVjZSB0aGUgb3ZlcmhlYWQgb2YgcHJvZmlsaW5nIGFuZCB0cmFjaW5nLiAgVGhpcyAKLSAgd2lsbCBiZSBvZiBpbnRlcmVzdCB0byBhdXRob3JzIG9mIGRldmVsb3BtZW50IGVudmlyb25tZW50cyBmb3IKLSAgUHl0aG9uLiAgVHdvIG5ldyBDIGZ1bmN0aW9ucyB3ZXJlIGFkZGVkIHRvIFB5dGhvbidzIEFQSSwKLSAgXGNmdW5jdGlvbntQeUV2YWxfU2V0UHJvZmlsZSgpfSBhbmQgXGNmdW5jdGlvbntQeUV2YWxfU2V0VHJhY2UoKX0uCi0gIFRoZSBleGlzdGluZyBcZnVuY3Rpb257c3lzLnNldHByb2ZpbGUoKX0gYW5kCi0gIFxmdW5jdGlvbntzeXMuc2V0dHJhY2UoKX0gZnVuY3Rpb25zIHN0aWxsIGV4aXN0LCBhbmQgaGF2ZSBzaW1wbHkKLSAgYmVlbiBjaGFuZ2VkIHRvIHVzZSB0aGUgbmV3IEMtbGV2ZWwgaW50ZXJmYWNlLiAgKENvbnRyaWJ1dGVkIGJ5IEZyZWQKLSAgTC4gRHJha2UsIEpyLikKLQotICBcaXRlbSBBbm90aGVyIGxvdy1sZXZlbCBBUEksIHByaW1hcmlseSBvZiBpbnRlcmVzdCB0byBpbXBsZW1lbnRvcnMKLSAgb2YgUHl0aG9uIGRlYnVnZ2VycyBhbmQgZGV2ZWxvcG1lbnQgdG9vbHMsIHdhcyBhZGRlZC4KLSAgXGNmdW5jdGlvbntQeUludGVycHJldGVyU3RhdGVfSGVhZCgpfSBhbmQKLSAgXGNmdW5jdGlvbntQeUludGVycHJldGVyU3RhdGVfTmV4dCgpfSBsZXQgYSBjYWxsZXIgd2FsayB0aHJvdWdoIGFsbAotICB0aGUgZXhpc3RpbmcgaW50ZXJwcmV0ZXIgb2JqZWN0czsKLSAgXGNmdW5jdGlvbntQeUludGVycHJldGVyU3RhdGVfVGhyZWFkSGVhZCgpfSBhbmQKLSAgXGNmdW5jdGlvbntQeVRocmVhZFN0YXRlX05leHQoKX0gYWxsb3cgbG9vcGluZyBvdmVyIGFsbCB0aGUgdGhyZWFkCi0gIHN0YXRlcyBmb3IgYSBnaXZlbiBpbnRlcnByZXRlci4gIChDb250cmlidXRlZCBieSBEYXZpZCBCZWF6bGV5LikKLQotXGl0ZW0gVGhlIEMtbGV2ZWwgaW50ZXJmYWNlIHRvIHRoZSBnYXJiYWdlIGNvbGxlY3RvciBoYXMgYmVlbiBjaGFuZ2VkCi10byBtYWtlIGl0IGVhc2llciB0byB3cml0ZSBleHRlbnNpb24gdHlwZXMgdGhhdCBzdXBwb3J0IGdhcmJhZ2UKLWNvbGxlY3Rpb24gYW5kIHRvIGRlYnVnIG1pc3VzZXMgb2YgdGhlIGZ1bmN0aW9ucy4KLVZhcmlvdXMgZnVuY3Rpb25zIGhhdmUgc2xpZ2h0bHkgZGlmZmVyZW50IHNlbWFudGljcywgc28gYSBidW5jaCBvZgotZnVuY3Rpb25zIGhhZCB0byBiZSByZW5hbWVkLiAgRXh0ZW5zaW9ucyB0aGF0IHVzZSB0aGUgb2xkIEFQSSB3aWxsCi1zdGlsbCBjb21waWxlIGJ1dCB3aWxsIFxlbXBoe25vdH0gcGFydGljaXBhdGUgaW4gZ2FyYmFnZSBjb2xsZWN0aW9uLAotc28gdXBkYXRpbmcgdGhlbSBmb3IgMi4yIHNob3VsZCBiZSBjb25zaWRlcmVkIGZhaXJseSBoaWdoIHByaW9yaXR5LgotCi1UbyB1cGdyYWRlIGFuIGV4dGVuc2lvbiBtb2R1bGUgdG8gdGhlIG5ldyBBUEksIHBlcmZvcm0gdGhlIGZvbGxvd2luZwotc3RlcHM6Ci0KLVxiZWdpbntpdGVtaXplfQotCi1caXRlbSBSZW5hbWUgXGNmdW5jdGlvbntQeV9UUEZMQUdTX0dDfSB0byBcY2Z1bmN0aW9ue1B5VFBGTEFHU19IQVZFX0dDfS4KLQotXGl0ZW0gVXNlIFxjZnVuY3Rpb257UHlPYmplY3RfR0NfTmV3fSBvciBcY2Z1bmN0aW9ue1B5T2JqZWN0X0dDX05ld1Zhcn0gdG8KLWFsbG9jYXRlIG9iamVjdHMsIGFuZCBcY2Z1bmN0aW9ue1B5T2JqZWN0X0dDX0RlbH0gdG8gZGVhbGxvY2F0ZSB0aGVtLgotCi1caXRlbSBSZW5hbWUgXGNmdW5jdGlvbntQeU9iamVjdF9HQ19Jbml0fSB0byBcY2Z1bmN0aW9ue1B5T2JqZWN0X0dDX1RyYWNrfSBhbmQKLVxjZnVuY3Rpb257UHlPYmplY3RfR0NfRmluaX0gdG8gXGNmdW5jdGlvbntQeU9iamVjdF9HQ19VblRyYWNrfS4KLQotXGl0ZW0gUmVtb3ZlIFxjZnVuY3Rpb257UHlHQ19IRUFEX1NJWkV9IGZyb20gb2JqZWN0IHNpemUgY2FsY3VsYXRpb25zLgotCi1caXRlbSBSZW1vdmUgY2FsbHMgdG8gXGNmdW5jdGlvbntQeU9iamVjdF9BU19HQ30gYW5kIFxjZnVuY3Rpb257UHlPYmplY3RfRlJPTV9HQ30uCi0KLVxlbmR7aXRlbWl6ZX0KLQotICBcaXRlbSBBIG5ldyBcc2FtcHtldH0gZm9ybWF0IHNlcXVlbmNlIHdhcyBhZGRlZCB0bwotICBcY2Z1bmN0aW9ue1B5QXJnX1BhcnNlVHVwbGV9OyBcc2FtcHtldH0gdGFrZXMgYm90aCBhIHBhcmFtZXRlciBhbmQKLSAgYW4gZW5jb2RpbmcgbmFtZSwgYW5kIGNvbnZlcnRzIHRoZSBwYXJhbWV0ZXIgdG8gdGhlIGdpdmVuIGVuY29kaW5nCi0gIGlmIHRoZSBwYXJhbWV0ZXIgdHVybnMgb3V0IHRvIGJlIGEgVW5pY29kZSBzdHJpbmcsIG9yIGxlYXZlcyBpdAotICBhbG9uZSBpZiBpdCdzIGFuIDgtYml0IHN0cmluZywgYXNzdW1pbmcgaXQgdG8gYWxyZWFkeSBiZSBpbiB0aGUKLSAgZGVzaXJlZCBlbmNvZGluZy4gIFRoaXMgZGlmZmVycyBmcm9tIHRoZSBcc2FtcHtlc30gZm9ybWF0IGNoYXJhY3RlciwKLSAgd2hpY2ggYXNzdW1lcyB0aGF0IDgtYml0IHN0cmluZ3MgYXJlIGluIFB5dGhvbidzIGRlZmF1bHQgQVNDSUkKLSAgZW5jb2RpbmcgYW5kIGNvbnZlcnRzIHRoZW0gdG8gdGhlIHNwZWNpZmllZCBuZXcgZW5jb2RpbmcuCi0gIChDb250cmlidXRlZCBieSBNLi1BLiBMZW1idXJnLCBhbmQgdXNlZCBmb3IgdGhlIE1CQ1Mgc3VwcG9ydCBvbgotICBXaW5kb3dzIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb24uKQotCi0gIFxpdGVtIEEgZGlmZmVyZW50IGFyZ3VtZW50IHBhcnNpbmcgZnVuY3Rpb24sCi0gIFxjZnVuY3Rpb257UHlBcmdfVW5wYWNrVHVwbGUoKX0sIGhhcyBiZWVuIGFkZGVkIHRoYXQncyBzaW1wbGVyIGFuZAotICBwcmVzdW1hYmx5IGZhc3Rlci4gIEluc3RlYWQgb2Ygc3BlY2lmeWluZyBhIGZvcm1hdCBzdHJpbmcsIHRoZQotICBjYWxsZXIgc2ltcGx5IGdpdmVzIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIG51bWJlciBvZiBhcmd1bWVudHMKLSAgZXhwZWN0ZWQsIGFuZCBhIHNldCBvZiBwb2ludGVycyB0byBcY3R5cGV7UHlPYmplY3QqfSB2YXJpYWJsZXMgdGhhdAotICB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoIGFyZ3VtZW50IHZhbHVlcy4gIAotCi0gIFxpdGVtIFR3byBuZXcgZmxhZ3MgXGNvbnN0YW50e01FVEhfTk9BUkdTfSBhbmQgXGNvbnN0YW50e01FVEhfT30gYXJlCi0gICBhdmFpbGFibGUgaW4gbWV0aG9kIGRlZmluaXRpb24gdGFibGVzIHRvIHNpbXBsaWZ5IGltcGxlbWVudGF0aW9uIG9mCi0gICBtZXRob2RzIHdpdGggbm8gYXJndW1lbnRzIG9yIGEgc2luZ2xlIHVudHlwZWQgYXJndW1lbnQuIENhbGxpbmcKLSAgIHN1Y2ggbWV0aG9kcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuIGNhbGxpbmcgYSBjb3JyZXNwb25kaW5nIG1ldGhvZAotICAgdGhhdCB1c2VzIFxjb25zdGFudHtNRVRIX1ZBUkFSR1N9LiAKLSAgIEFsc28sIHRoZSBvbGQgXGNvbnN0YW50e01FVEhfT0xEQVJHU30gc3R5bGUgb2Ygd3JpdGluZyBDIG1ldGhvZHMgaXMgCi0gICBub3cgb2ZmaWNpYWxseSBkZXByZWNhdGVkLiAgCi0KLVxpdGVtCi0gICBUd28gbmV3IHdyYXBwZXIgZnVuY3Rpb25zLCBcY2Z1bmN0aW9ue1B5T1Nfc25wcmludGYoKX0gYW5kCi0gICBcY2Z1bmN0aW9ue1B5T1NfdnNucHJpbnRmKCl9IHdlcmUgYWRkZWQgdG8gcHJvdmlkZSAKLSAgIGNyb3NzLXBsYXRmb3JtIGltcGxlbWVudGF0aW9ucyBmb3IgdGhlIHJlbGF0aXZlbHkgbmV3Ci0gICBcY2Z1bmN0aW9ue3NucHJpbnRmKCl9IGFuZCBcY2Z1bmN0aW9ue3ZzbnByaW50ZigpfSBDIGxpYiBBUElzLiBJbgotICAgY29udHJhc3QgdG8gdGhlIHN0YW5kYXJkIFxjZnVuY3Rpb257c3ByaW50ZigpfSBhbmQKLSAgIFxjZnVuY3Rpb257dnNwcmludGYoKX0gZnVuY3Rpb25zLCB0aGUgUHl0aG9uIHZlcnNpb25zIGNoZWNrIHRoZQotICAgYm91bmRzIG9mIHRoZSBidWZmZXIgdXNlZCB0byBwcm90ZWN0IGFnYWluc3QgYnVmZmVyIG92ZXJydW5zLgotICAgKENvbnRyaWJ1dGVkIGJ5IE0uLUEuIExlbWJ1cmcuKQotCi0gICBcaXRlbSBUaGUgXGNmdW5jdGlvbntfUHlUdXBsZV9SZXNpemUoKX0gZnVuY3Rpb24gaGFzIGxvc3QgYW4gdW51c2VkCi0gICBwYXJhbWV0ZXIsIHNvIG5vdyBpdCB0YWtlcyAyIHBhcmFtZXRlcnMgaW5zdGVhZCBvZiAzLiAgVGhlIHRoaXJkCi0gICBhcmd1bWVudCB3YXMgbmV2ZXIgdXNlZCwgYW5kIGNhbiBzaW1wbHkgYmUgZGlzY2FyZGVkIHdoZW4gcG9ydGluZwotICAgY29kZSBmcm9tIGVhcmxpZXIgdmVyc2lvbnMgdG8gUHl0aG9uIDIuMi4KLQotXGVuZHtpdGVtaXplfQotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntPdGhlciBDaGFuZ2VzIGFuZCBGaXhlc30KLQotQXMgdXN1YWwgdGhlcmUgd2VyZSBhIGJ1bmNoIG9mIG90aGVyIGltcHJvdmVtZW50cyBhbmQgYnVnZml4ZXMKLXNjYXR0ZXJlZCB0aHJvdWdob3V0IHRoZSBzb3VyY2UgdHJlZS4gIEEgc2VhcmNoIHRocm91Z2ggdGhlIENWUyBjaGFuZ2UKLWxvZ3MgZmluZHMgdGhlcmUgd2VyZSA1MjcgcGF0Y2hlcyBhcHBsaWVkIGFuZCA2ODMgYnVncyBmaXhlZCBiZXR3ZWVuCi1QeXRob24gMi4xIGFuZCAyLjI7IDIuMi4xIGFwcGxpZWQgMTM5IHBhdGNoZXMgYW5kIGZpeGVkIDE0MyBidWdzOwotMi4yLjIgYXBwbGllZCAxMDYgcGF0Y2hlcyBhbmQgZml4ZWQgODIgYnVncy4gIFRoZXNlIGZpZ3VyZXMgYXJlIGxpa2VseQotdG8gYmUgdW5kZXJlc3RpbWF0ZXMuCi0KLVNvbWUgb2YgdGhlIG1vcmUgbm90YWJsZSBjaGFuZ2VzIGFyZToKLQotXGJlZ2lue2l0ZW1pemV9Ci0KLSAgXGl0ZW0gVGhlIGNvZGUgZm9yIHRoZSBNYWNPUyBwb3J0IGZvciBQeXRob24sIG1haW50YWluZWQgYnkgSmFjawotICBKYW5zZW4sIGlzIG5vdyBrZXB0IGluIHRoZSBtYWluIFB5dGhvbiBDVlMgdHJlZSwgYW5kIG1hbnkgY2hhbmdlcwotICBoYXZlIGJlZW4gbWFkZSB0byBzdXBwb3J0IE1hY09TflguCi0KLVRoZSBtb3N0IHNpZ25pZmljYW50IGNoYW5nZSBpcyB0aGUgYWJpbGl0eSB0byBidWlsZCBQeXRob24gYXMgYQotZnJhbWV3b3JrLCBlbmFibGVkIGJ5IHN1cHBseWluZyB0aGUgXGxvbmdwcm9ncmFtb3B0e2VuYWJsZS1mcmFtZXdvcmt9Ci1vcHRpb24gdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2hlbiBjb21waWxpbmcgUHl0aG9uLiAgQWNjb3JkaW5nIHRvCi1KYWNrIEphbnNlbiwgYGBUaGlzIGluc3RhbGxzIGEgc2VsZi1jb250YWluZWQgUHl0aG9uIGluc3RhbGxhdGlvbiBwbHVzCi10aGUgT1N+WCBmcmFtZXdvcmsgImdsdWUiIGludG8KLVxmaWxley9MaWJyYXJ5L0ZyYW1ld29ya3MvUHl0aG9uLmZyYW1ld29ya30gKG9yIGFub3RoZXIgbG9jYXRpb24gb2YKLWNob2ljZSkuICBGb3Igbm93IHRoZXJlIGlzIGxpdHRsZSBpbW1lZGlhdGUgYWRkZWQgYmVuZWZpdCB0byB0aGlzCi0oYWN0dWFsbHksIHRoZXJlIGlzIHRoZSBkaXNhZHZhbnRhZ2UgdGhhdCB5b3UgaGF2ZSB0byBjaGFuZ2UgeW91ciBQQVRICi10byBiZSBhYmxlIHRvIGZpbmQgUHl0aG9uKSwgYnV0IGl0IGlzIHRoZSBiYXNpcyBmb3IgY3JlYXRpbmcgYQotZnVsbC1ibG93biBQeXRob24gYXBwbGljYXRpb24sIHBvcnRpbmcgdGhlIE1hY1B5dGhvbiBJREUsIHBvc3NpYmx5Ci11c2luZyBQeXRob24gYXMgYSBzdGFuZGFyZCBPU0Egc2NyaXB0aW5nIGxhbmd1YWdlIGFuZCBtdWNoIG1vcmUuJycKLQotTW9zdCBvZiB0aGUgTWFjUHl0aG9uIHRvb2xib3ggbW9kdWxlcywgd2hpY2ggaW50ZXJmYWNlIHRvIE1hY09TIEFQSXMKLXN1Y2ggYXMgd2luZG93aW5nLCBRdWlja1RpbWUsIHNjcmlwdGluZywgZXRjLiBoYXZlIGJlZW4gcG9ydGVkIHRvIE9TflgsCi1idXQgdGhleSd2ZSBiZWVuIGxlZnQgY29tbWVudGVkIG91dCBpbiBcZmlsZXtzZXR1cC5weX0uICBQZW9wbGUgd2hvIHdhbnQKLXRvIGV4cGVyaW1lbnQgd2l0aCB0aGVzZSBtb2R1bGVzIGNhbiB1bmNvbW1lbnQgdGhlbSBtYW51YWxseS4KLQotJSBKYWNrJ3Mgb3JpZ2luYWwgY29tbWVudHM6Ci0lVGhlIG1haW4gY2hhbmdlIGlzIHRoZSBwb3NzaWJpbGl0eSB0byBidWlsZCBQeXRob24gYXMgYQotJWZyYW1ld29yay4gVGhpcyBpbnN0YWxscyBhIHNlbGYtY29udGFpbmVkIFB5dGhvbiBpbnN0YWxsYXRpb24gcGx1cyB0aGUKLSVPU1ggZnJhbWV3b3JrICJnbHVlIiBpbnRvIC9MaWJyYXJ5L0ZyYW1ld29ya3MvUHl0aG9uLmZyYW1ld29yayAob3IKLSVhbm90aGVyIGxvY2F0aW9uIG9mIGNob2ljZSkuIEZvciBub3cgdGhlcmUgaXMgbGl0dGxlIGltbWVkZWF0ZSBhZGRlZAotJWJlbmVmaXQgdG8gdGhpcyAoYWN0dWFsbHksIHRoZXJlIGlzIHRoZSBkaXNhZHZhbnRhZ2UgdGhhdCB5b3UgaGF2ZSB0bwotJWNoYW5nZSB5b3VyIFBBVEggdG8gYmUgYWJsZSB0byBmaW5kIFB5dGhvbiksIGJ1dCBpdCBpcyB0aGUgYmFzaXMgZm9yCi0lY3JlYXRpbmcgYSBmdWxsYmxvd24gUHl0aG9uIGFwcGxpY2F0aW9uLCBwb3J0aW5nIHRoZSBNYWNQeXRob24gSURFLAotJXBvc3NpYmx5IHVzaW5nIFB5dGhvbiBhcyBhIHN0YW5kYXJkIE9TQSBzY3JpcHRpbmcgbGFuZ3VhZ2UgYW5kIG11Y2gKLSVtb3JlLiBZb3UgZW5hYmxlIHRoaXMgd2l0aCAiY29uZmlndXJlIC0tZW5hYmxlLWZyYW1ld29yayIuCi0gCi0lVGhlIG90aGVyIGNoYW5nZSBpcyB0aGF0IG1vc3QgTWFjUHl0aG9uIHRvb2xib3ggbW9kdWxlcywgd2hpY2gKLSVpbnRlcmZhY2UgdG8gYWxsIHRoZSBNYWNPUyBBUElzIHN1Y2ggYXMgd2luZG93aW5nLCBxdWlja3RpbWUsCi0lc2NyaXB0aW5nLCBldGMuIGhhdmUgYmVlbiBwb3J0ZWQuIEFnYWluLCBtb3N0IG9mIHRoZXNlIGFyZSBub3Qgb2YKLSVpbW1lZGVhdGUgdXNlLCBhcyB0aGV5IG5lZWQgYSBmdWxsIGFwcGxpY2F0aW9uIHRvIGJlIHJlYWxseSB1c2VmdWwsIHNvCi0ldGhleSBoYXZlIGJlZW4gY29tbWVudGVkIG91dCBpbiBzZXR1cC5weS4gUGVvcGxlIHdhbnRpbmcgdG8gZXhwZXJpbWVudAotJWNhbiB1bmNvbW1lbnQgdGhlbS4gR2VzdGFsdCBhbmQgSW50ZXJuZXQgQ29uZmlnIG1vZHVsZXMgYXJlIGVuYWJsZWQgYnkKLSVkZWZhdWx0LgotICAKLSAgXGl0ZW0gS2V5d29yZCBhcmd1bWVudHMgcGFzc2VkIHRvIGJ1aWx0aW4gZnVuY3Rpb25zIHRoYXQgZG9uJ3QgdGFrZSB0aGVtCi0gIG5vdyBjYXVzZSBhIFxleGNlcHRpb257VHlwZUVycm9yfSBleGNlcHRpb24gdG8gYmUgcmFpc2VkLCB3aXRoIHRoZQotICBtZXNzYWdlICJcdmFye2Z1bmN0aW9ufSB0YWtlcyBubyBrZXl3b3JkIGFyZ3VtZW50cyIuCi0gIAotICBcaXRlbSBXZWFrIHJlZmVyZW5jZXMsIGFkZGVkIGluIFB5dGhvbiAyLjEgYXMgYW4gZXh0ZW5zaW9uIG1vZHVsZSwKLSAgYXJlIG5vdyBwYXJ0IG9mIHRoZSBjb3JlIGJlY2F1c2UgdGhleSdyZSB1c2VkIGluIHRoZSBpbXBsZW1lbnRhdGlvbgotICBvZiBuZXctc3R5bGUgY2xhc3Nlcy4gIFRoZSBcZXhjZXB0aW9ue1JlZmVyZW5jZUVycm9yfSBleGNlcHRpb24gaGFzCi0gIHRoZXJlZm9yZSBtb3ZlZCBmcm9tIHRoZSBcbW9kdWxle3dlYWtyZWZ9IG1vZHVsZSB0byBiZWNvbWUgYQotICBidWlsdC1pbiBleGNlcHRpb24uCi0KLSAgXGl0ZW0gQSBuZXcgc2NyaXB0LCBcZmlsZXtUb29scy9zY3JpcHRzL2NsZWFuZnV0dXJlLnB5fSBieSBUaW0KLSAgUGV0ZXJzLCBhdXRvbWF0aWNhbGx5IHJlbW92ZXMgb2Jzb2xldGUgXGNvZGV7X19mdXR1cmVfX30gc3RhdGVtZW50cwotICBmcm9tIFB5dGhvbiBzb3VyY2UgY29kZS4KLQotICBcaXRlbSBBbiBhZGRpdGlvbmFsIFx2YXJ7ZmxhZ3N9IGFyZ3VtZW50IGhhcyBiZWVuIGFkZGVkIHRvIHRoZQotICBidWlsdC1pbiBmdW5jdGlvbiBcZnVuY3Rpb257Y29tcGlsZSgpfSwgc28gdGhlIGJlaGF2aW91ciBvZgotICBcY29kZXtfX2Z1dHVyZV9ffSBzdGF0ZW1lbnRzIGNhbiBub3cgYmUgY29ycmVjdGx5IG9ic2VydmVkIGluCi0gIHNpbXVsYXRlZCBzaGVsbHMsIHN1Y2ggYXMgdGhvc2UgcHJlc2VudGVkIGJ5IElETEUgYW5kIG90aGVyCi0gIGRldmVsb3BtZW50IGVudmlyb25tZW50cy4gIFRoaXMgaXMgZGVzY3JpYmVkIGluIFxwZXB7MjY0fS4KLSAgKENvbnRyaWJ1dGVkIGJ5IE1pY2hhZWwgSHVkc29uLikKLQotICBcaXRlbSBUaGUgbmV3IGxpY2Vuc2UgaW50cm9kdWNlZCB3aXRoIFB5dGhvbiAxLjYgd2Fzbid0Ci0gIEdQTC1jb21wYXRpYmxlLiAgVGhpcyBpcyBmaXhlZCBieSBzb21lIG1pbm9yIHRleHR1YWwgY2hhbmdlcyB0byB0aGUKLSAgMi4yIGxpY2Vuc2UsIHNvIGl0J3Mgbm93IGxlZ2FsIHRvIGVtYmVkIFB5dGhvbiBpbnNpZGUgYSBHUExlZAotICBwcm9ncmFtIGFnYWluLiAgTm90ZSB0aGF0IFB5dGhvbiBpdHNlbGYgaXMgbm90IEdQTGVkLCBidXQgaW5zdGVhZCBpcwotICB1bmRlciBhIGxpY2Vuc2UgdGhhdCdzIGVzc2VudGlhbGx5IGVxdWl2YWxlbnQgdG8gdGhlIEJTRCBsaWNlbnNlLAotICBzYW1lIGFzIGl0IGFsd2F5cyB3YXMuICBUaGUgbGljZW5zZSBjaGFuZ2VzIHdlcmUgYWxzbyBhcHBsaWVkIHRvIHRoZQotICBQeXRob24gMi4wLjEgYW5kIDIuMS4xIHJlbGVhc2VzLgotCi0gIFxpdGVtIFdoZW4gcHJlc2VudGVkIHdpdGggYSBVbmljb2RlIGZpbGVuYW1lIG9uIFdpbmRvd3MsIFB5dGhvbiB3aWxsCi0gIG5vdyBjb252ZXJ0IGl0IHRvIGFuIE1CQ1MgZW5jb2RlZCBzdHJpbmcsIGFzIHVzZWQgYnkgdGhlIE1pY3Jvc29mdAotICBmaWxlIEFQSXMuICBBcyBNQkNTIGlzIGV4cGxpY2l0bHkgdXNlZCBieSB0aGUgZmlsZSBBUElzLCBQeXRob24ncwotICBjaG9pY2Ugb2YgQVNDSUkgYXMgdGhlIGRlZmF1bHQgZW5jb2RpbmcgdHVybnMgb3V0IHRvIGJlIGFuCi0gIGFubm95YW5jZS4gIE9uIFxVTklYLCB0aGUgbG9jYWxlJ3MgY2hhcmFjdGVyIHNldCBpcyB1c2VkIGlmCi0gIFxmdW5jdGlvbntsb2NhbGUubmxfbGFuZ2luZm8oQ09ERVNFVCl9IGlzIGF2YWlsYWJsZS4gIChXaW5kb3dzCi0gIHN1cHBvcnQgd2FzIGNvbnRyaWJ1dGVkIGJ5IE1hcmsgSGFtbW9uZCB3aXRoIGFzc2lzdGFuY2UgZnJvbQotICBNYXJjLUFuZHJcJ2UgTGVtYnVyZy4gXFVOSVh7fSBzdXBwb3J0IHdhcyBhZGRlZCBieSBNYXJ0aW4gdm9uIExcIm93aXMuKQotCi0gIFxpdGVtIExhcmdlIGZpbGUgc3VwcG9ydCBpcyBub3cgZW5hYmxlZCBvbiBXaW5kb3dzLiAgKENvbnRyaWJ1dGVkIGJ5Ci0gIFRpbSBQZXRlcnMuKQotCi0gIFxpdGVtIFRoZSBcZmlsZXtUb29scy9zY3JpcHRzL2Z0cG1pcnJvci5weX0gc2NyaXB0Ci0gIG5vdyBwYXJzZXMgYSBcZmlsZXsubmV0cmN9IGZpbGUsIGlmIHlvdSBoYXZlIG9uZS4KLSAgKENvbnRyaWJ1dGVkIGJ5IE1pa2UgUm9tYmVyZy4pIAotCi0gIFxpdGVtIFNvbWUgZmVhdHVyZXMgb2YgdGhlIG9iamVjdCByZXR1cm5lZCBieSB0aGUKLSAgXGZ1bmN0aW9ue3hyYW5nZSgpfSBmdW5jdGlvbiBhcmUgbm93IGRlcHJlY2F0ZWQsIGFuZCB0cmlnZ2VyCi0gIHdhcm5pbmdzIHdoZW4gdGhleSdyZSBhY2Nlc3NlZDsgdGhleSdsbCBkaXNhcHBlYXIgaW4gUHl0aG9uIDIuMy4KLSAgXGNsYXNze3hyYW5nZX0gb2JqZWN0cyB0cmllZCB0byBwcmV0ZW5kIHRoZXkgd2VyZSBmdWxsIHNlcXVlbmNlCi0gIHR5cGVzIGJ5IHN1cHBvcnRpbmcgc2xpY2luZywgc2VxdWVuY2UgbXVsdGlwbGljYXRpb24sIGFuZCB0aGUKLSAgXGtleXdvcmR7aW59IG9wZXJhdG9yLCBidXQgdGhlc2UgZmVhdHVyZXMgd2VyZSByYXJlbHkgdXNlZCBhbmQKLSAgdGhlcmVmb3JlIGJ1Z2d5LiAgVGhlIFxtZXRob2R7dG9saXN0KCl9IG1ldGhvZCBhbmQgdGhlCi0gIFxtZW1iZXJ7c3RhcnR9LCBcbWVtYmVye3N0b3B9LCBhbmQgXG1lbWJlcntzdGVwfSBhdHRyaWJ1dGVzIGFyZSBhbHNvCi0gIGJlaW5nIGRlcHJlY2F0ZWQuICBBdCB0aGUgQyBsZXZlbCwgdGhlIGZvdXJ0aCBhcmd1bWVudCB0byB0aGUKLSAgXGNmdW5jdGlvbntQeVJhbmdlX05ldygpfSBmdW5jdGlvbiwgXHNhbXB7cmVwZWF0fSwgaGFzIGFsc28gYmVlbgotICBkZXByZWNhdGVkLgotCi0gIFxpdGVtIFRoZXJlIHdlcmUgYSBidW5jaCBvZiBwYXRjaGVzIHRvIHRoZSBkaWN0aW9uYXJ5Ci0gIGltcGxlbWVudGF0aW9uLCBtb3N0bHkgdG8gZml4IHBvdGVudGlhbCBjb3JlIGR1bXBzIGlmIGEgZGljdGlvbmFyeQotICBjb250YWlucyBvYmplY3RzIHRoYXQgc25lYWtpbHkgY2hhbmdlZCB0aGVpciBoYXNoIHZhbHVlLCBvciBtdXRhdGVkCi0gIHRoZSBkaWN0aW9uYXJ5IHRoZXkgd2VyZSBjb250YWluZWQgaW4uIEZvciBhIHdoaWxlIHB5dGhvbi1kZXYgZmVsbAotICBpbnRvIGEgZ2VudGxlIHJoeXRobSBvZiBNaWNoYWVsIEh1ZHNvbiBmaW5kaW5nIGEgY2FzZSB0aGF0IGR1bXBlZAotICBjb3JlLCBUaW0gUGV0ZXJzIGZpeGluZyB0aGUgYnVnLCBNaWNoYWVsIGZpbmRpbmcgYW5vdGhlciBjYXNlLCBhbmQgcm91bmQKLSAgYW5kIHJvdW5kIGl0IHdlbnQuICAgCi0KLSAgXGl0ZW0gT24gV2luZG93cywgUHl0aG9uIGNhbiBub3cgYmUgY29tcGlsZWQgd2l0aCBCb3JsYW5kIEMgdGhhbmtzCi0gIHRvIGEgbnVtYmVyIG9mIHBhdGNoZXMgY29udHJpYnV0ZWQgYnkgU3RlcGhlbiBIYW5zZW4sIHRob3VnaCB0aGUKLSAgcmVzdWx0IGlzbid0IGZ1bGx5IGZ1bmN0aW9uYWwgeWV0LiAgKEJ1dCB0aGlzIFxlbXBoe2lzfSBwcm9ncmVzcy4uLikKLSAgCi0gIFxpdGVtIEFub3RoZXIgV2luZG93cyBlbmhhbmNlbWVudDogV2lzZSBTb2x1dGlvbnMgZ2VuZXJvdXNseSBvZmZlcmVkCi0gIFB5dGhvbkxhYnMgdXNlIG9mIHRoZWlyIEluc3RhbGxlck1hc3RlciA4LjEgc3lzdGVtLiAgRWFybGllcgotICBQeXRob25MYWJzIFdpbmRvd3MgaW5zdGFsbGVycyB1c2VkIFdpc2UgNS4wYSwgd2hpY2ggd2FzIGJlZ2lubmluZyB0bwotICBzaG93IGl0cyBhZ2UuICAoUGFja2FnZWQgdXAgYnkgVGltIFBldGVycy4pCi0KLSAgXGl0ZW0gRmlsZXMgZW5kaW5nIGluIFxzYW1wey5weXd9IGNhbiBub3cgYmUgaW1wb3J0ZWQgb24gV2luZG93cy4KLSAgXHNhbXB7LnB5d30gaXMgYSBXaW5kb3dzLW9ubHkgdGhpbmcsIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhIHNjcmlwdAotICBuZWVkcyB0byBiZSBydW4gdXNpbmcgUFlUSE9OVy5FWEUgaW5zdGVhZCBvZiBQWVRIT04uRVhFIGluIG9yZGVyIHRvCi0gIHByZXZlbnQgYSBET1MgY29uc29sZSBmcm9tIHBvcHBpbmcgdXAgdG8gZGlzcGxheSB0aGUgb3V0cHV0LiAgVGhpcwotICBwYXRjaCBtYWtlcyBpdCBwb3NzaWJsZSB0byBpbXBvcnQgc3VjaCBzY3JpcHRzLCBpbiBjYXNlIHRoZXkncmUgYWxzbwotICB1c2FibGUgYXMgbW9kdWxlcy4gIChJbXBsZW1lbnRlZCBieSBEYXZpZCBCb2xlbi4pCi0KLSAgXGl0ZW0gT24gcGxhdGZvcm1zIHdoZXJlIFB5dGhvbiB1c2VzIHRoZSBDIFxjZnVuY3Rpb257ZGxvcGVuKCl9IGZ1bmN0aW9uIAotICB0byBsb2FkIGV4dGVuc2lvbiBtb2R1bGVzLCBpdCdzIG5vdyBwb3NzaWJsZSB0byBzZXQgdGhlIGZsYWdzIHVzZWQgCi0gIGJ5IFxjZnVuY3Rpb257ZGxvcGVuKCl9IHVzaW5nIHRoZSBcZnVuY3Rpb257c3lzLmdldGRsb3BlbmZsYWdzKCl9IGFuZAotICBcZnVuY3Rpb257c3lzLnNldGRsb3BlbmZsYWdzKCl9IGZ1bmN0aW9ucy4gICAgKENvbnRyaWJ1dGVkIGJ5IEJyYW0gU3RvbGsuKQotCi0gIFxpdGVtIFRoZSBcZnVuY3Rpb257cG93KCl9IGJ1aWx0LWluIGZ1bmN0aW9uIG5vIGxvbmdlciBzdXBwb3J0cyAzCi0gIGFyZ3VtZW50cyB3aGVuIGZsb2F0aW5nLXBvaW50IG51bWJlcnMgYXJlIHN1cHBsaWVkLgotICBcY29kZXtwb3coXHZhcnt4fSwgXHZhcnt5fSwgXHZhcnt6fSl9IHJldHVybnMgXGNvZGV7KHgqKnkpIFwlIHp9LCBidXQKLSAgdGhpcyBpcyBuZXZlciB1c2VmdWwgZm9yIGZsb2F0aW5nIHBvaW50IG51bWJlcnMsIGFuZCB0aGUgZmluYWwKLSAgcmVzdWx0IHZhcmllcyB1bnByZWRpY3RhYmx5IGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0uICBBIGNhbGwgc3VjaAotICBhcyBcY29kZXtwb3coMi4wLCA4LjAsIDcuMCl9IHdpbGwgbm93IHJhaXNlIGEgXGV4Y2VwdGlvbntUeXBlRXJyb3J9Ci0gIGV4Y2VwdGlvbi4KLSAgCi1cZW5ke2l0ZW1pemV9Ci0KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue0Fja25vd2xlZGdlbWVudHN9Ci0KLVRoZSBhdXRob3Igd291bGQgbGlrZSB0byB0aGFuayB0aGUgZm9sbG93aW5nIHBlb3BsZSBmb3Igb2ZmZXJpbmcKLXN1Z2dlc3Rpb25zLCBjb3JyZWN0aW9ucyBhbmQgYXNzaXN0YW5jZSB3aXRoIHZhcmlvdXMgZHJhZnRzIG9mIHRoaXMKLWFydGljbGU6IEZyZWQgQnJlbW1lciwgS2VpdGggQnJpZ2dzLCBBbmRyZXcgRGFsa2UsIEZyZWR+TC4gRHJha2UsIEpyLiwKLUNhcmVsIEZlbGxpbmdlciwgRGF2aWQgR29vZGdlciwgTWFyayBIYW1tb25kLCBTdGVwaGVuIEhhbnNlbiwgTWljaGFlbAotSHVkc29uLCBKYWNrIEphbnNlbiwgTWFyYy1BbmRyXCdlIExlbWJ1cmcsIE1hcnRpbiB2b24gTFwib3dpcywgRnJlZHJpawotTHVuZGgsIE1pY2hhZWwgTWNMYXksIE5pY2sgTWF0aGV3c29uLCBQYXVsIE1vb3JlLCBHdXN0YXZvIE5pZW1leWVyLAotRG9uIE8nRG9ubmVsbCwgSm9vbmFzIFBhYWxhc21hLCBUaW0gUGV0ZXJzLCBKZW5zIFF1YWRlLCBUb20gUmVpbmhhcmR0LCBOZWlsCi1TY2hlbWVuYXVlciwgR3VpZG8gdmFuIFJvc3N1bSwgR3JlZyBXYXJkLCBFZHdhcmQgV2VsYm91cm5lLgotCi1cZW5ke2RvY3VtZW50fQpkaWZmIC0tZ2l0IGEvRG9jL3doYXRzbmV3L3doYXRzbmV3MjMudGV4IGIvRG9jL3doYXRzbmV3L3doYXRzbmV3MjMudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzkyYmUyLi4wMDAwMDAwCi0tLSBhL0RvYy93aGF0c25ldy93aGF0c25ldzIzLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDIzODAgKzAsMCBAQAotXGRvY3VtZW50Y2xhc3N7aG93dG99Ci1cdXNlcGFja2FnZXtkaXN0dXRpbHN9Ci0lICRJZCQKLQotXHRpdGxle1doYXQncyBOZXcgaW4gUHl0aG9uIDIuM30KLVxyZWxlYXNlezEuMDF9Ci1cYXV0aG9ye0EuTS5cIEt1Y2hsaW5nfQotXGF1dGhvcmFkZHJlc3N7Ci0JXHN0cm9uZ3tQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbn1cXAotCUVtYWlsOiBcZW1haWx7YW1rQGFtay5jYX0KLX0KLQotXGJlZ2lue2RvY3VtZW50fQotXG1ha2V0aXRsZQotXHRhYmxlb2Zjb250ZW50cwotCi1UaGlzIGFydGljbGUgZXhwbGFpbnMgdGhlIG5ldyBmZWF0dXJlcyBpbiBQeXRob24gMi4zLiAgUHl0aG9uIDIuMyB3YXMKLXJlbGVhc2VkIG9uIEp1bHkgMjksIDIwMDMuCi0KLVRoZSBtYWluIHRoZW1lcyBmb3IgUHl0aG9uIDIuMyBhcmUgcG9saXNoaW5nIHNvbWUgb2YgdGhlIGZlYXR1cmVzCi1hZGRlZCBpbiAyLjIsIGFkZGluZyB2YXJpb3VzIHNtYWxsIGJ1dCB1c2VmdWwgZW5oYW5jZW1lbnRzIHRvIHRoZSBjb3JlCi1sYW5ndWFnZSwgYW5kIGV4cGFuZGluZyB0aGUgc3RhbmRhcmQgbGlicmFyeS4gIFRoZSBuZXcgb2JqZWN0IG1vZGVsCi1pbnRyb2R1Y2VkIGluIHRoZSBwcmV2aW91cyB2ZXJzaW9uIGhhcyBiZW5lZml0ZWQgZnJvbSAxOCBtb250aHMgb2YKLWJ1Z2ZpeGVzIGFuZCBmcm9tIG9wdGltaXphdGlvbiBlZmZvcnRzIHRoYXQgaGF2ZSBpbXByb3ZlZCB0aGUKLXBlcmZvcm1hbmNlIG9mIG5ldy1zdHlsZSBjbGFzc2VzLiAgQSBmZXcgbmV3IGJ1aWx0LWluIGZ1bmN0aW9ucyBoYXZlCi1iZWVuIGFkZGVkIHN1Y2ggYXMgXGZ1bmN0aW9ue3N1bSgpfSBhbmQgXGZ1bmN0aW9ue2VudW1lcmF0ZSgpfS4gIFRoZQotXGtleXdvcmR7aW59IG9wZXJhdG9yIGNhbiBub3cgYmUgdXNlZCBmb3Igc3Vic3RyaW5nIHNlYXJjaGVzIChlLmcuCi1cY29kZXsiYWIiIGluICJhYmMifSByZXR1cm5zIFxjb25zdGFudHtUcnVlfSkuCi0KLVNvbWUgb2YgdGhlIG1hbnkgbmV3IGxpYnJhcnkgZmVhdHVyZXMgaW5jbHVkZSBCb29sZWFuLCBzZXQsIGhlYXAsIGFuZAotZGF0ZS90aW1lIGRhdGEgdHlwZXMsIHRoZSBhYmlsaXR5IHRvIGltcG9ydCBtb2R1bGVzIGZyb20gWklQLWZvcm1hdAotYXJjaGl2ZXMsIG1ldGFkYXRhIHN1cHBvcnQgZm9yIHRoZSBsb25nLWF3YWl0ZWQgUHl0aG9uIGNhdGFsb2csIGFuCi11cGRhdGVkIHZlcnNpb24gb2YgSURMRSwgYW5kIG1vZHVsZXMgZm9yIGxvZ2dpbmcgbWVzc2FnZXMsIHdyYXBwaW5nCi10ZXh0LCBwYXJzaW5nIENTViBmaWxlcywgcHJvY2Vzc2luZyBjb21tYW5kLWxpbmUgb3B0aW9ucywgdXNpbmcgQmVya2VsZXlEQgotZGF0YWJhc2VzLi4uICB0aGUgbGlzdCBvZiBuZXcgYW5kIGVuaGFuY2VkIG1vZHVsZXMgaXMgbGVuZ3RoeS4KLQotVGhpcyBhcnRpY2xlIGRvZXNuJ3QgYXR0ZW1wdCB0byBwcm92aWRlIGEgY29tcGxldGUgc3BlY2lmaWNhdGlvbiBvZgotdGhlIG5ldyBmZWF0dXJlcywgYnV0IGluc3RlYWQgcHJvdmlkZXMgYSBjb252ZW5pZW50IG92ZXJ2aWV3LiAgRm9yCi1mdWxsIGRldGFpbHMsIHlvdSBzaG91bGQgcmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gZm9yIFB5dGhvbiAyLjMsCi1zdWNoIGFzIHRoZSBcY2l0ZXRpdGxlWy4uL2xpYi9saWIuaHRtbF17UHl0aG9uIExpYnJhcnkgUmVmZXJlbmNlfSBhbmQKLXRoZSBcY2l0ZXRpdGxlWy4uL3JlZi9yZWYuaHRtbF17UHl0aG9uIFJlZmVyZW5jZSBNYW51YWx9LiAgSWYgeW91IHdhbnQKLXRvIHVuZGVyc3RhbmQgdGhlIGNvbXBsZXRlIGltcGxlbWVudGF0aW9uIGFuZCBkZXNpZ24gcmF0aW9uYWxlLCAKLXJlZmVyIHRvIHRoZSBQRVAgZm9yIGEgcGFydGljdWxhciBuZXcgZmVhdHVyZS4KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257UEVQIDIxODogQSBTdGFuZGFyZCBTZXQgRGF0YXR5cGV9Ci0KLVRoZSBuZXcgXG1vZHVsZXtzZXRzfSBtb2R1bGUgY29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gb2YgYSBzZXQKLWRhdGF0eXBlLiAgVGhlIFxjbGFzc3tTZXR9IGNsYXNzIGlzIGZvciBtdXRhYmxlIHNldHMsIHNldHMgdGhhdCBjYW4KLWhhdmUgbWVtYmVycyBhZGRlZCBhbmQgcmVtb3ZlZC4gIFRoZSBcY2xhc3N7SW1tdXRhYmxlU2V0fSBjbGFzcyBpcyBmb3IKLXNldHMgdGhhdCBjYW4ndCBiZSBtb2RpZmllZCwgYW5kIGluc3RhbmNlcyBvZiBcY2xhc3N7SW1tdXRhYmxlU2V0fSBjYW4KLXRoZXJlZm9yZSBiZSB1c2VkIGFzIGRpY3Rpb25hcnkga2V5cy4gIFNldHMgYXJlIGJ1aWx0IG9uIHRvcCBvZgotZGljdGlvbmFyaWVzLCBzbyB0aGUgZWxlbWVudHMgd2l0aGluIGEgc2V0IG11c3QgYmUgaGFzaGFibGUuCi0KLUhlcmUncyBhIHNpbXBsZSBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gaW1wb3J0IHNldHMKLT4+PiBTID0gc2V0cy5TZXQoWzEsMiwzXSkKLT4+PiBTCi1TZXQoWzEsIDIsIDNdKQotPj4+IDEgaW4gUwotVHJ1ZQotPj4+IDAgaW4gUwotRmFsc2UKLT4+PiBTLmFkZCg1KQotPj4+IFMucmVtb3ZlKDMpCi0+Pj4gUwotU2V0KFsxLCAyLCA1XSkKLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIHVuaW9uIGFuZCBpbnRlcnNlY3Rpb24gb2Ygc2V0cyBjYW4gYmUgY29tcHV0ZWQgd2l0aCB0aGUKLVxtZXRob2R7dW5pb24oKX0gYW5kIFxtZXRob2R7aW50ZXJzZWN0aW9uKCl9IG1ldGhvZHM7IGFuIGFsdGVybmF0aXZlCi1ub3RhdGlvbiB1c2VzIHRoZSBiaXR3aXNlIG9wZXJhdG9ycyBcY29kZXtcJn0gYW5kIFxjb2Rle3x9LgotTXV0YWJsZSBzZXRzIGFsc28gaGF2ZSBpbi1wbGFjZSB2ZXJzaW9ucyBvZiB0aGVzZSBtZXRob2RzLAotXG1ldGhvZHt1bmlvbl91cGRhdGUoKX0gYW5kIFxtZXRob2R7aW50ZXJzZWN0aW9uX3VwZGF0ZSgpfS4KLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IFMxID0gc2V0cy5TZXQoWzEsMiwzXSkKLT4+PiBTMiA9IHNldHMuU2V0KFs0LDUsNl0pCi0+Pj4gUzEudW5pb24oUzIpCi1TZXQoWzEsIDIsIDMsIDQsIDUsIDZdKQotPj4+IFMxIHwgUzIgICAgICAgICAgICAgICAgICAjIEFsdGVybmF0aXZlIG5vdGF0aW9uCi1TZXQoWzEsIDIsIDMsIDQsIDUsIDZdKQotPj4+IFMxLmludGVyc2VjdGlvbihTMikKLVNldChbXSkKLT4+PiBTMSAmIFMyICAgICAgICAgICAgICAgICAgIyBBbHRlcm5hdGl2ZSBub3RhdGlvbgotU2V0KFtdKQotPj4+IFMxLnVuaW9uX3VwZGF0ZShTMikKLT4+PiBTMQotU2V0KFsxLCAyLCAzLCA0LCA1LCA2XSkKLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotSXQncyBhbHNvIHBvc3NpYmxlIHRvIHRha2UgdGhlIHN5bW1ldHJpYyBkaWZmZXJlbmNlIG9mIHR3byBzZXRzLiAgVGhpcwotaXMgdGhlIHNldCBvZiBhbGwgZWxlbWVudHMgaW4gdGhlIHVuaW9uIHRoYXQgYXJlbid0IGluIHRoZQotaW50ZXJzZWN0aW9uLiAgQW5vdGhlciB3YXkgb2YgcHV0dGluZyBpdCBpcyB0aGF0IHRoZSBzeW1tZXRyaWMKLWRpZmZlcmVuY2UgY29udGFpbnMgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGluIGV4YWN0bHkgb25lCi1zZXQuICBBZ2FpbiwgdGhlcmUncyBhbiBhbHRlcm5hdGl2ZSBub3RhdGlvbiAoXGNvZGV7XF59KSwgYW5kIGFuCi1pbi1wbGFjZSB2ZXJzaW9uIHdpdGggdGhlIHVuZ2Fpbmx5IG5hbWUKLVxtZXRob2R7c3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlKCl9LgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gUzEgPSBzZXRzLlNldChbMSwyLDMsNF0pCi0+Pj4gUzIgPSBzZXRzLlNldChbMyw0LDUsNl0pCi0+Pj4gUzEuc3ltbWV0cmljX2RpZmZlcmVuY2UoUzIpCi1TZXQoWzEsIDIsIDUsIDZdKQotPj4+IFMxIF4gUzIKLVNldChbMSwgMiwgNSwgNl0pCi0+Pj4KLVxlbmR7dmVyYmF0aW19Ci0KLVRoZXJlIGFyZSBhbHNvIFxtZXRob2R7aXNzdWJzZXQoKX0gYW5kIFxtZXRob2R7aXNzdXBlcnNldCgpfSBtZXRob2RzCi1mb3IgY2hlY2tpbmcgd2hldGhlciBvbmUgc2V0IGlzIGEgc3Vic2V0IG9yIHN1cGVyc2V0IG9mIGFub3RoZXI6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBTMSA9IHNldHMuU2V0KFsxLDIsM10pCi0+Pj4gUzIgPSBzZXRzLlNldChbMiwzXSkKLT4+PiBTMi5pc3N1YnNldChTMSkKLVRydWUKLT4+PiBTMS5pc3N1YnNldChTMikKLUZhbHNlCi0+Pj4gUzEuaXNzdXBlcnNldChTMikKLVRydWUKLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotCi1cYmVnaW57c2VlYWxzb30KLQotXHNlZXBlcHsyMTh9e0FkZGluZyBhIEJ1aWx0LUluIFNldCBPYmplY3QgVHlwZX17UEVQIHdyaXR0ZW4gYnkgR3JlZyBWLiBXaWxzb24uCi1JbXBsZW1lbnRlZCBieSBHcmVnIFYuIFdpbHNvbiwgQWxleCBNYXJ0ZWxsaSwgYW5kIEd2Ui59Ci0KLVxlbmR7c2VlYWxzb30KLQotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntQRVAgMjU1OiBTaW1wbGUgR2VuZXJhdG9yc1xsYWJlbHtzZWN0aW9uLWdlbmVyYXRvcnN9fQotCi1JbiBQeXRob24gMi4yLCBnZW5lcmF0b3JzIHdlcmUgYWRkZWQgYXMgYW4gb3B0aW9uYWwgZmVhdHVyZSwgdG8gYmUKLWVuYWJsZWQgYnkgYSBcY29kZXtmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGdlbmVyYXRvcnN9IGRpcmVjdGl2ZS4gIEluCi0yLjMgZ2VuZXJhdG9ycyBubyBsb25nZXIgbmVlZCB0byBiZSBzcGVjaWFsbHkgZW5hYmxlZCwgYW5kIGFyZSBub3cKLWFsd2F5cyBwcmVzZW50OyB0aGlzIG1lYW5zIHRoYXQgXGtleXdvcmR7eWllbGR9IGlzIG5vdyBhbHdheXMgYQota2V5d29yZC4gIFRoZSByZXN0IG9mIHRoaXMgc2VjdGlvbiBpcyBhIGNvcHkgb2YgdGhlIGRlc2NyaXB0aW9uIG9mCi1nZW5lcmF0b3JzIGZyb20gdGhlIGBgV2hhdCdzIE5ldyBpbiBQeXRob24gMi4yJycgZG9jdW1lbnQ7IGlmIHlvdSByZWFkCi1pdCBiYWNrIHdoZW4gUHl0aG9uIDIuMiBjYW1lIG91dCwgeW91IGNhbiBza2lwIHRoZSByZXN0IG9mIHRoaXMgc2VjdGlvbi4KLQotWW91J3JlIGRvdWJ0bGVzcyBmYW1pbGlhciB3aXRoIGhvdyBmdW5jdGlvbiBjYWxscyB3b3JrIGluIFB5dGhvbiBvciBDLgotV2hlbiB5b3UgY2FsbCBhIGZ1bmN0aW9uLCBpdCBnZXRzIGEgcHJpdmF0ZSBuYW1lc3BhY2Ugd2hlcmUgaXRzIGxvY2FsCi12YXJpYWJsZXMgYXJlIGNyZWF0ZWQuICBXaGVuIHRoZSBmdW5jdGlvbiByZWFjaGVzIGEgXGtleXdvcmR7cmV0dXJufQotc3RhdGVtZW50LCB0aGUgbG9jYWwgdmFyaWFibGVzIGFyZSBkZXN0cm95ZWQgYW5kIHRoZSByZXN1bHRpbmcgdmFsdWUKLWlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuICBBIGxhdGVyIGNhbGwgdG8gdGhlIHNhbWUgZnVuY3Rpb24gd2lsbCBnZXQKLWEgZnJlc2ggbmV3IHNldCBvZiBsb2NhbCB2YXJpYWJsZXMuIEJ1dCwgd2hhdCBpZiB0aGUgbG9jYWwgdmFyaWFibGVzCi13ZXJlbid0IHRocm93biBhd2F5IG9uIGV4aXRpbmcgYSBmdW5jdGlvbj8gIFdoYXQgaWYgeW91IGNvdWxkIGxhdGVyCi1yZXN1bWUgdGhlIGZ1bmN0aW9uIHdoZXJlIGl0IGxlZnQgb2ZmPyAgVGhpcyBpcyB3aGF0IGdlbmVyYXRvcnMKLXByb3ZpZGU7IHRoZXkgY2FuIGJlIHRob3VnaHQgb2YgYXMgcmVzdW1hYmxlIGZ1bmN0aW9ucy4KLQotSGVyZSdzIHRoZSBzaW1wbGVzdCBleGFtcGxlIG9mIGEgZ2VuZXJhdG9yIGZ1bmN0aW9uOgotCi1cYmVnaW57dmVyYmF0aW19Ci1kZWYgZ2VuZXJhdGVfaW50cyhOKToKLSAgICBmb3IgaSBpbiByYW5nZShOKToKLSAgICAgICAgeWllbGQgaQotXGVuZHt2ZXJiYXRpbX0KLQotQSBuZXcga2V5d29yZCwgXGtleXdvcmR7eWllbGR9LCB3YXMgaW50cm9kdWNlZCBmb3IgZ2VuZXJhdG9ycy4gIEFueQotZnVuY3Rpb24gY29udGFpbmluZyBhIFxrZXl3b3Jke3lpZWxkfSBzdGF0ZW1lbnQgaXMgYSBnZW5lcmF0b3IKLWZ1bmN0aW9uOyB0aGlzIGlzIGRldGVjdGVkIGJ5IFB5dGhvbidzIGJ5dGVjb2RlIGNvbXBpbGVyIHdoaWNoCi1jb21waWxlcyB0aGUgZnVuY3Rpb24gc3BlY2lhbGx5IGFzIGEgcmVzdWx0LgotCi1XaGVuIHlvdSBjYWxsIGEgZ2VuZXJhdG9yIGZ1bmN0aW9uLCBpdCBkb2Vzbid0IHJldHVybiBhIHNpbmdsZSB2YWx1ZTsKLWluc3RlYWQgaXQgcmV0dXJucyBhIGdlbmVyYXRvciBvYmplY3QgdGhhdCBzdXBwb3J0cyB0aGUgaXRlcmF0b3IKLXByb3RvY29sLiAgT24gZXhlY3V0aW5nIHRoZSBca2V5d29yZHt5aWVsZH0gc3RhdGVtZW50LCB0aGUgZ2VuZXJhdG9yCi1vdXRwdXRzIHRoZSB2YWx1ZSBvZiBcY29kZXtpfSwgc2ltaWxhciB0byBhIFxrZXl3b3Jke3JldHVybn0KLXN0YXRlbWVudC4gIFRoZSBiaWcgZGlmZmVyZW5jZSBiZXR3ZWVuIFxrZXl3b3Jke3lpZWxkfSBhbmQgYQotXGtleXdvcmR7cmV0dXJufSBzdGF0ZW1lbnQgaXMgdGhhdCBvbiByZWFjaGluZyBhIFxrZXl3b3Jke3lpZWxkfSB0aGUKLWdlbmVyYXRvcidzIHN0YXRlIG9mIGV4ZWN1dGlvbiBpcyBzdXNwZW5kZWQgYW5kIGxvY2FsIHZhcmlhYmxlcyBhcmUKLXByZXNlcnZlZC4gIE9uIHRoZSBuZXh0IGNhbGwgdG8gdGhlIGdlbmVyYXRvcidzIFxjb2Rley5uZXh0KCl9IG1ldGhvZCwKLXRoZSBmdW5jdGlvbiB3aWxsIHJlc3VtZSBleGVjdXRpbmcgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlCi1ca2V5d29yZHt5aWVsZH0gc3RhdGVtZW50LiAgKEZvciBjb21wbGljYXRlZCByZWFzb25zLCB0aGUKLVxrZXl3b3Jke3lpZWxkfSBzdGF0ZW1lbnQgaXNuJ3QgYWxsb3dlZCBpbnNpZGUgdGhlIFxrZXl3b3Jke3RyeX0gYmxvY2sKLW9mIGEgXGtleXdvcmR7dHJ5fS4uLlxrZXl3b3Jke2ZpbmFsbHl9IHN0YXRlbWVudDsgcmVhZCBccGVwezI1NX0gZm9yIGEgZnVsbAotZXhwbGFuYXRpb24gb2YgdGhlIGludGVyYWN0aW9uIGJldHdlZW4gXGtleXdvcmR7eWllbGR9IGFuZAotZXhjZXB0aW9ucy4pCi0KLUhlcmUncyBhIHNhbXBsZSB1c2FnZSBvZiB0aGUgXGZ1bmN0aW9ue2dlbmVyYXRlX2ludHMoKX0gZ2VuZXJhdG9yOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZ2VuID0gZ2VuZXJhdGVfaW50cygzKQotPj4+IGdlbgotPGdlbmVyYXRvciBvYmplY3QgYXQgMHg4MTE3ZjkwPgotPj4+IGdlbi5uZXh0KCkKLTAKLT4+PiBnZW4ubmV4dCgpCi0xCi0+Pj4gZ2VuLm5leHQoKQotMgotPj4+IGdlbi5uZXh0KCkKLVRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLSAgRmlsZSAic3RkaW4iLCBsaW5lIDEsIGluID8KLSAgRmlsZSAic3RkaW4iLCBsaW5lIDIsIGluIGdlbmVyYXRlX2ludHMKLVN0b3BJdGVyYXRpb24KLVxlbmR7dmVyYmF0aW19Ci0KLVlvdSBjb3VsZCBlcXVhbGx5IHdyaXRlIFxjb2Rle2ZvciBpIGluIGdlbmVyYXRlX2ludHMoNSl9LCBvcgotXGNvZGV7YSxiLGMgPSBnZW5lcmF0ZV9pbnRzKDMpfS4KLQotSW5zaWRlIGEgZ2VuZXJhdG9yIGZ1bmN0aW9uLCB0aGUgXGtleXdvcmR7cmV0dXJufSBzdGF0ZW1lbnQgY2FuIG9ubHkKLWJlIHVzZWQgd2l0aG91dCBhIHZhbHVlLCBhbmQgc2lnbmFscyB0aGUgZW5kIG9mIHRoZSBwcm9jZXNzaW9uIG9mCi12YWx1ZXM7IGFmdGVyd2FyZHMgdGhlIGdlbmVyYXRvciBjYW5ub3QgcmV0dXJuIGFueSBmdXJ0aGVyIHZhbHVlcy4KLVxrZXl3b3Jke3JldHVybn0gd2l0aCBhIHZhbHVlLCBzdWNoIGFzIFxjb2Rle3JldHVybiA1fSwgaXMgYSBzeW50YXgKLWVycm9yIGluc2lkZSBhIGdlbmVyYXRvciBmdW5jdGlvbi4gIFRoZSBlbmQgb2YgdGhlIGdlbmVyYXRvcidzIHJlc3VsdHMKLWNhbiBhbHNvIGJlIGluZGljYXRlZCBieSByYWlzaW5nIFxleGNlcHRpb257U3RvcEl0ZXJhdGlvbn0gbWFudWFsbHksCi1vciBieSBqdXN0IGxldHRpbmcgdGhlIGZsb3cgb2YgZXhlY3V0aW9uIGZhbGwgb2ZmIHRoZSBib3R0b20gb2YgdGhlCi1mdW5jdGlvbi4KLQotWW91IGNvdWxkIGFjaGlldmUgdGhlIGVmZmVjdCBvZiBnZW5lcmF0b3JzIG1hbnVhbGx5IGJ5IHdyaXRpbmcgeW91cgotb3duIGNsYXNzIGFuZCBzdG9yaW5nIGFsbCB0aGUgbG9jYWwgdmFyaWFibGVzIG9mIHRoZSBnZW5lcmF0b3IgYXMKLWluc3RhbmNlIHZhcmlhYmxlcy4gIEZvciBleGFtcGxlLCByZXR1cm5pbmcgYSBsaXN0IG9mIGludGVnZXJzIGNvdWxkCi1iZSBkb25lIGJ5IHNldHRpbmcgXGNvZGV7c2VsZi5jb3VudH0gdG8gMCwgYW5kIGhhdmluZyB0aGUKLVxtZXRob2R7bmV4dCgpfSBtZXRob2QgaW5jcmVtZW50IFxjb2Rle3NlbGYuY291bnR9IGFuZCByZXR1cm4gaXQuCi1Ib3dldmVyLCBmb3IgYSBtb2RlcmF0ZWx5IGNvbXBsaWNhdGVkIGdlbmVyYXRvciwgd3JpdGluZyBhCi1jb3JyZXNwb25kaW5nIGNsYXNzIHdvdWxkIGJlIG11Y2ggbWVzc2llci4KLVxmaWxle0xpYi90ZXN0L3Rlc3RfZ2VuZXJhdG9ycy5weX0gY29udGFpbnMgYSBudW1iZXIgb2YgbW9yZQotaW50ZXJlc3RpbmcgZXhhbXBsZXMuICBUaGUgc2ltcGxlc3Qgb25lIGltcGxlbWVudHMgYW4gaW4tb3JkZXIKLXRyYXZlcnNhbCBvZiBhIHRyZWUgdXNpbmcgZ2VuZXJhdG9ycyByZWN1cnNpdmVseS4KLQotXGJlZ2lue3ZlcmJhdGltfQotIyBBIHJlY3Vyc2l2ZSBnZW5lcmF0b3IgdGhhdCBnZW5lcmF0ZXMgVHJlZSBsZWF2ZXMgaW4gaW4tb3JkZXIuCi1kZWYgaW5vcmRlcih0KToKLSAgICBpZiB0OgotICAgICAgICBmb3IgeCBpbiBpbm9yZGVyKHQubGVmdCk6Ci0gICAgICAgICAgICB5aWVsZCB4Ci0gICAgICAgIHlpZWxkIHQubGFiZWwKLSAgICAgICAgZm9yIHggaW4gaW5vcmRlcih0LnJpZ2h0KToKLSAgICAgICAgICAgIHlpZWxkIHgKLVxlbmR7dmVyYmF0aW19Ci0KLVR3byBvdGhlciBleGFtcGxlcyBpbiBcZmlsZXtMaWIvdGVzdC90ZXN0X2dlbmVyYXRvcnMucHl9IHByb2R1Y2UKLXNvbHV0aW9ucyBmb3IgdGhlIE4tUXVlZW5zIHByb2JsZW0gKHBsYWNpbmcgJE4kIHF1ZWVucyBvbiBhbiAkTnhOJAotY2hlc3MgYm9hcmQgc28gdGhhdCBubyBxdWVlbiB0aHJlYXRlbnMgYW5vdGhlcikgYW5kIHRoZSBLbmlnaHQncyBUb3VyCi0oYSByb3V0ZSB0aGF0IHRha2VzIGEga25pZ2h0IHRvIGV2ZXJ5IHNxdWFyZSBvZiBhbiAkTnhOJCBjaGVzc2JvYXJkCi13aXRob3V0IHZpc2l0aW5nIGFueSBzcXVhcmUgdHdpY2UpLgotCi1UaGUgaWRlYSBvZiBnZW5lcmF0b3JzIGNvbWVzIGZyb20gb3RoZXIgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLAotZXNwZWNpYWxseSBJY29uIChcdXJse2h0dHA6Ly93d3cuY3MuYXJpem9uYS5lZHUvaWNvbi99KSwgd2hlcmUgdGhlCi1pZGVhIG9mIGdlbmVyYXRvcnMgaXMgY2VudHJhbC4gIEluIEljb24sIGV2ZXJ5Ci1leHByZXNzaW9uIGFuZCBmdW5jdGlvbiBjYWxsIGJlaGF2ZXMgbGlrZSBhIGdlbmVyYXRvci4gIE9uZSBleGFtcGxlCi1mcm9tIGBgQW4gT3ZlcnZpZXcgb2YgdGhlIEljb24gUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UnJyBhdAotXHVybHtodHRwOi8vd3d3LmNzLmFyaXpvbmEuZWR1L2ljb24vZG9jcy9pcGQyNjYuaHRtfSBnaXZlcyBhbiBpZGVhIG9mCi13aGF0IHRoaXMgbG9va3MgbGlrZToKLQotXGJlZ2lue3ZlcmJhdGltfQotc2VudGVuY2UgOj0gIlN0b3JlIGl0IGluIHRoZSBuZWlnaGJvcmluZyBoYXJib3IiCi1pZiAoaSA6PSBmaW5kKCJvciIsIHNlbnRlbmNlKSkgPiA1IHRoZW4gd3JpdGUoaSkKLVxlbmR7dmVyYmF0aW19Ci0KLUluIEljb24gdGhlIFxmdW5jdGlvbntmaW5kKCl9IGZ1bmN0aW9uIHJldHVybnMgdGhlIGluZGV4ZXMgYXQgd2hpY2ggdGhlCi1zdWJzdHJpbmcgYGBvcicnIGlzIGZvdW5kOiAzLCAyMywgMzMuICBJbiB0aGUgXGtleXdvcmR7aWZ9IHN0YXRlbWVudCwKLVxjb2Rle2l9IGlzIGZpcnN0IGFzc2lnbmVkIGEgdmFsdWUgb2YgMywgYnV0IDMgaXMgbGVzcyB0aGFuIDUsIHNvIHRoZQotY29tcGFyaXNvbiBmYWlscywgYW5kIEljb24gcmV0cmllcyBpdCB3aXRoIHRoZSBzZWNvbmQgdmFsdWUgb2YgMjMuICAyMwotaXMgZ3JlYXRlciB0aGFuIDUsIHNvIHRoZSBjb21wYXJpc29uIG5vdyBzdWNjZWVkcywgYW5kIHRoZSBjb2RlIHByaW50cwotdGhlIHZhbHVlIDIzIHRvIHRoZSBzY3JlZW4uCi0KLVB5dGhvbiBkb2Vzbid0IGdvIG5lYXJseSBhcyBmYXIgYXMgSWNvbiBpbiBhZG9wdGluZyBnZW5lcmF0b3JzIGFzIGEKLWNlbnRyYWwgY29uY2VwdC4gIEdlbmVyYXRvcnMgYXJlIGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgY29yZQotUHl0aG9uIGxhbmd1YWdlLCBidXQgbGVhcm5pbmcgb3IgdXNpbmcgdGhlbSBpc24ndCBjb21wdWxzb3J5OyBpZiB0aGV5Ci1kb24ndCBzb2x2ZSBhbnkgcHJvYmxlbXMgdGhhdCB5b3UgaGF2ZSwgZmVlbCBmcmVlIHRvIGlnbm9yZSB0aGVtLgotT25lIG5vdmVsIGZlYXR1cmUgb2YgUHl0aG9uJ3MgaW50ZXJmYWNlIGFzIGNvbXBhcmVkIHRvCi1JY29uJ3MgaXMgdGhhdCBhIGdlbmVyYXRvcidzIHN0YXRlIGlzIHJlcHJlc2VudGVkIGFzIGEgY29uY3JldGUgb2JqZWN0Ci0odGhlIGl0ZXJhdG9yKSB0aGF0IGNhbiBiZSBwYXNzZWQgYXJvdW5kIHRvIG90aGVyIGZ1bmN0aW9ucyBvciBzdG9yZWQKLWluIGEgZGF0YSBzdHJ1Y3R1cmUuCi0KLVxiZWdpbntzZWVhbHNvfQotCi1cc2VlcGVwezI1NX17U2ltcGxlIEdlbmVyYXRvcnN9e1dyaXR0ZW4gYnkgTmVpbCBTY2hlbWVuYXVlciwgVGltCi1QZXRlcnMsIE1hZ251cyBMaWUgSGV0bGFuZC4gIEltcGxlbWVudGVkIG1vc3RseSBieSBOZWlsIFNjaGVtZW5hdWVyCi1hbmQgVGltIFBldGVycywgd2l0aCBvdGhlciBmaXhlcyBmcm9tIHRoZSBQeXRob24gTGFicyBjcmV3Ln0KLQotXGVuZHtzZWVhbHNvfQotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntQRVAgMjYzOiBTb3VyY2UgQ29kZSBFbmNvZGluZ3MgXGxhYmVse3NlY3Rpb24tZW5jb2RpbmdzfX0KLQotUHl0aG9uIHNvdXJjZSBmaWxlcyBjYW4gbm93IGJlIGRlY2xhcmVkIGFzIGJlaW5nIGluIGRpZmZlcmVudAotY2hhcmFjdGVyIHNldCBlbmNvZGluZ3MuICBFbmNvZGluZ3MgYXJlIGRlY2xhcmVkIGJ5IGluY2x1ZGluZyBhCi1zcGVjaWFsbHkgZm9ybWF0dGVkIGNvbW1lbnQgaW4gdGhlIGZpcnN0IG9yIHNlY29uZCBsaW5lIG9mIHRoZSBzb3VyY2UKLWZpbGUuICBGb3IgZXhhbXBsZSwgYSBVVEYtOCBmaWxlIGNhbiBiZSBkZWNsYXJlZCB3aXRoOgotCi1cYmVnaW57dmVyYmF0aW19Ci0jIS91c3IvYmluL2VudiBweXRob24KLSMgLSotIGNvZGluZzogVVRGLTggLSotCi1cZW5ke3ZlcmJhdGltfQotCi1XaXRob3V0IHN1Y2ggYW4gZW5jb2RpbmcgZGVjbGFyYXRpb24sIHRoZSBkZWZhdWx0IGVuY29kaW5nIHVzZWQgaXMKLTctYml0IEFTQ0lJLiAgRXhlY3V0aW5nIG9yIGltcG9ydGluZyBtb2R1bGVzIHRoYXQgY29udGFpbiBzdHJpbmcKLWxpdGVyYWxzIHdpdGggOC1iaXQgY2hhcmFjdGVycyBhbmQgaGF2ZSBubyBlbmNvZGluZyBkZWNsYXJhdGlvbiB3aWxsIHJlc3VsdAotaW4gYSBcZXhjZXB0aW9ue0RlcHJlY2F0aW9uV2FybmluZ30gYmVpbmcgc2lnbmFsbGVkIGJ5IFB5dGhvbiAyLjM7IGluCi0yLjQgdGhpcyB3aWxsIGJlIGEgc3ludGF4IGVycm9yLgotCi1UaGUgZW5jb2RpbmcgZGVjbGFyYXRpb24gb25seSBhZmZlY3RzIFVuaWNvZGUgc3RyaW5nIGxpdGVyYWxzLCB3aGljaAotd2lsbCBiZSBjb252ZXJ0ZWQgdG8gVW5pY29kZSB1c2luZyB0aGUgc3BlY2lmaWVkIGVuY29kaW5nLiAgTm90ZSB0aGF0Ci1QeXRob24gaWRlbnRpZmllcnMgYXJlIHN0aWxsIHJlc3RyaWN0ZWQgdG8gQVNDSUkgY2hhcmFjdGVycywgc28geW91Ci1jYW4ndCBoYXZlIHZhcmlhYmxlIG5hbWVzIHRoYXQgdXNlIGNoYXJhY3RlcnMgb3V0c2lkZSBvZiB0aGUgdXN1YWwKLWFscGhhbnVtZXJpY3MuCi0KLVxiZWdpbntzZWVhbHNvfQotCi1cc2VlcGVwezI2M317RGVmaW5pbmcgUHl0aG9uIFNvdXJjZSBDb2RlIEVuY29kaW5nc317V3JpdHRlbiBieQotTWFyYy1BbmRyXCdlIExlbWJ1cmcgYW5kIE1hcnRpbiB2b25+TFwib3dpczsgaW1wbGVtZW50ZWQgYnkgU3V6dWtpCi1IaXNhbyBhbmQgTWFydGluIHZvbn5MXCJvd2lzLn0KLQotXGVuZHtzZWVhbHNvfQotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntQRVAgMjczOiBJbXBvcnRpbmcgTW9kdWxlcyBmcm9tIFpJUCBBcmNoaXZlc30KLQotVGhlIG5ldyBcbW9kdWxle3ppcGltcG9ydH0gbW9kdWxlIGFkZHMgc3VwcG9ydCBmb3IgaW1wb3J0aW5nCi1tb2R1bGVzIGZyb20gYSBaSVAtZm9ybWF0IGFyY2hpdmUuICBZb3UgZG9uJ3QgbmVlZCB0byBpbXBvcnQgdGhlCi1tb2R1bGUgZXhwbGljaXRseTsgaXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGltcG9ydGVkIGlmIGEgWklQCi1hcmNoaXZlJ3MgZmlsZW5hbWUgaXMgYWRkZWQgdG8gXGNvZGV7c3lzLnBhdGh9LiAgRm9yIGV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWFta0BueW1hbjp+L3NyYy9weXRob24kIHVuemlwIC1sIC90bXAvZXhhbXBsZS56aXAKLUFyY2hpdmU6ICAvdG1wL2V4YW1wbGUuemlwCi0gIExlbmd0aCAgICAgRGF0ZSAgIFRpbWUgICAgTmFtZQotIC0tLS0tLS0tICAgIC0tLS0gICAtLS0tICAgIC0tLS0KLSAgICAgODQ2NyAgMTEtMjYtMDIgMjI6MzAgICBqd3p0aHJlYWRpbmcucHkKLSAtLS0tLS0tLSAgICAgICAgICAgICAgICAgICAtLS0tLS0tCi0gICAgIDg0NjcgICAgICAgICAgICAgICAgICAgMSBmaWxlCi1hbWtAbnltYW46fi9zcmMvcHl0aG9uJCAuL3B5dGhvbgotUHl0aG9uIDIuMyAoIzEsIEF1ZyAxIDIwMDMsIDE5OjU0OjMyKSAKLT4+PiBpbXBvcnQgc3lzCi0+Pj4gc3lzLnBhdGguaW5zZXJ0KDAsICcvdG1wL2V4YW1wbGUuemlwJykgICMgQWRkIC56aXAgZmlsZSB0byBmcm9udCBvZiBwYXRoCi0+Pj4gaW1wb3J0IGp3enRocmVhZGluZwotPj4+IGp3enRocmVhZGluZy5fX2ZpbGVfXwotJy90bXAvZXhhbXBsZS56aXAvand6dGhyZWFkaW5nLnB5JwotPj4+Ci1cZW5ke3ZlcmJhdGltfQotCi1BbiBlbnRyeSBpbiBcY29kZXtzeXMucGF0aH0gY2FuIG5vdyBiZSB0aGUgZmlsZW5hbWUgb2YgYSBaSVAgYXJjaGl2ZS4KLVRoZSBaSVAgYXJjaGl2ZSBjYW4gY29udGFpbiBhbnkga2luZCBvZiBmaWxlcywgYnV0IG9ubHkgZmlsZXMgbmFtZWQKLVxmaWxleyoucHl9LCBcZmlsZXsqLnB5Y30sIG9yIFxmaWxleyoucHlvfSBjYW4gYmUgaW1wb3J0ZWQuICBJZiBhbgotYXJjaGl2ZSBvbmx5IGNvbnRhaW5zIFxmaWxleyoucHl9IGZpbGVzLCBQeXRob24gd2lsbCBub3QgYXR0ZW1wdCB0bwotbW9kaWZ5IHRoZSBhcmNoaXZlIGJ5IGFkZGluZyB0aGUgY29ycmVzcG9uZGluZyBcZmlsZXsqLnB5Y30gZmlsZSwgbWVhbmluZwotdGhhdCBpZiBhIFpJUCBhcmNoaXZlIGRvZXNuJ3QgY29udGFpbiBcZmlsZXsqLnB5Y30gZmlsZXMsIGltcG9ydGluZyBtYXkgYmUKLXJhdGhlciBzbG93LgotCi1BIHBhdGggd2l0aGluIHRoZSBhcmNoaXZlIGNhbiBhbHNvIGJlIHNwZWNpZmllZCB0byBvbmx5IGltcG9ydCBmcm9tIGEKLXN1YmRpcmVjdG9yeTsgZm9yIGV4YW1wbGUsIHRoZSBwYXRoIFxmaWxley90bXAvZXhhbXBsZS56aXAvbGliL30KLXdvdWxkIG9ubHkgaW1wb3J0IGZyb20gdGhlIFxmaWxle2xpYi99IHN1YmRpcmVjdG9yeSB3aXRoaW4gdGhlCi1hcmNoaXZlLgotCi1cYmVnaW57c2VlYWxzb30KLQotXHNlZXBlcHsyNzN9e0ltcG9ydCBNb2R1bGVzIGZyb20gWmlwIEFyY2hpdmVzfXtXcml0dGVuIGJ5IEphbWVzIEMuIEFobHN0cm9tLCAKLXdobyBhbHNvIHByb3ZpZGVkIGFuIGltcGxlbWVudGF0aW9uLgotUHl0aG9uIDIuMyBmb2xsb3dzIHRoZSBzcGVjaWZpY2F0aW9uIGluIFxwZXB7MjczfSwgCi1idXQgdXNlcyBhbiBpbXBsZW1lbnRhdGlvbiB3cml0dGVuIGJ5IEp1c3QgdmFuflJvc3N1bSAKLXRoYXQgdXNlcyB0aGUgaW1wb3J0IGhvb2tzIGRlc2NyaWJlZCBpbiBccGVwezMwMn0uCi1TZWUgc2VjdGlvbn5ccmVme3NlY3Rpb24tcGVwMzAyfSBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgbmV3IGltcG9ydCBob29rcy4KLX0KLQotXGVuZHtzZWVhbHNvfQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257UEVQIDI3NzogVW5pY29kZSBmaWxlIG5hbWUgc3VwcG9ydCBmb3IgV2luZG93cyBOVH0KLQotT24gV2luZG93cyBOVCwgMjAwMCwgYW5kIFhQLCB0aGUgc3lzdGVtIHN0b3JlcyBmaWxlIG5hbWVzIGFzIFVuaWNvZGUKLXN0cmluZ3MuIFRyYWRpdGlvbmFsbHksIFB5dGhvbiBoYXMgcmVwcmVzZW50ZWQgZmlsZSBuYW1lcyBhcyBieXRlCi1zdHJpbmdzLCB3aGljaCBpcyBpbmFkZXF1YXRlIGJlY2F1c2UgaXQgcmVuZGVycyBzb21lIGZpbGUgbmFtZXMKLWluYWNjZXNzaWJsZS4KLQotUHl0aG9uIG5vdyBhbGxvd3MgdXNpbmcgYXJiaXRyYXJ5IFVuaWNvZGUgc3RyaW5ncyAod2l0aGluIHRoZQotbGltaXRhdGlvbnMgb2YgdGhlIGZpbGUgc3lzdGVtKSBmb3IgYWxsIGZ1bmN0aW9ucyB0aGF0IGV4cGVjdCBmaWxlCi1uYW1lcywgbW9zdCBub3RhYmx5IHRoZSBcZnVuY3Rpb257b3BlbigpfSBidWlsdC1pbiBmdW5jdGlvbi4gSWYgYSBVbmljb2RlCi1zdHJpbmcgaXMgcGFzc2VkIHRvIFxmdW5jdGlvbntvcy5saXN0ZGlyKCl9LCBQeXRob24gbm93IHJldHVybnMgYSBsaXN0Ci1vZiBVbmljb2RlIHN0cmluZ3MuICBBIG5ldyBmdW5jdGlvbiwgXGZ1bmN0aW9ue29zLmdldGN3ZHUoKX0sIHJldHVybnMKLXRoZSBjdXJyZW50IGRpcmVjdG9yeSBhcyBhIFVuaWNvZGUgc3RyaW5nLgotCi1CeXRlIHN0cmluZ3Mgc3RpbGwgd29yayBhcyBmaWxlIG5hbWVzLCBhbmQgb24gV2luZG93cyBQeXRob24gd2lsbAotdHJhbnNwYXJlbnRseSBjb252ZXJ0IHRoZW0gdG8gVW5pY29kZSB1c2luZyB0aGUgXGNvZGV7bWJjc30gZW5jb2RpbmcuCi0KLU90aGVyIHN5c3RlbXMgYWxzbyBhbGxvdyBVbmljb2RlIHN0cmluZ3MgYXMgZmlsZSBuYW1lcyBidXQgY29udmVydAotdGhlbSB0byBieXRlIHN0cmluZ3MgYmVmb3JlIHBhc3NpbmcgdGhlbSB0byB0aGUgc3lzdGVtLCB3aGljaCBjYW4KLWNhdXNlIGEgXGV4Y2VwdGlvbntVbmljb2RlRXJyb3J9IHRvIGJlIHJhaXNlZC4gQXBwbGljYXRpb25zIGNhbiB0ZXN0Ci13aGV0aGVyIGFyYml0cmFyeSBVbmljb2RlIHN0cmluZ3MgYXJlIHN1cHBvcnRlZCBhcyBmaWxlIG5hbWVzIGJ5Ci1jaGVja2luZyBcbWVtYmVye29zLnBhdGguc3VwcG9ydHNfdW5pY29kZV9maWxlbmFtZXN9LCBhIEJvb2xlYW4gdmFsdWUuCi0KLVVuZGVyIE1hY09TLCBcZnVuY3Rpb257b3MubGlzdGRpcigpfSBtYXkgbm93IHJldHVybiBVbmljb2RlIGZpbGVuYW1lcy4KLQotXGJlZ2lue3NlZWFsc299Ci0KLVxzZWVwZXB7Mjc3fXtVbmljb2RlIGZpbGUgbmFtZSBzdXBwb3J0IGZvciBXaW5kb3dzIE5UfXtXcml0dGVuIGJ5IE5laWwKLUhvZGdzb247IGltcGxlbWVudGVkIGJ5IE5laWwgSG9kZ3NvbiwgTWFydGluIHZvbn5MXCJvd2lzLCBhbmQgTWFyawotSGFtbW9uZC59Ci0KLVxlbmR7c2VlYWxzb30KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257UEVQIDI3ODogVW5pdmVyc2FsIE5ld2xpbmUgU3VwcG9ydH0KLQotVGhlIHRocmVlIG1ham9yIG9wZXJhdGluZyBzeXN0ZW1zIHVzZWQgdG9kYXkgYXJlIE1pY3Jvc29mdCBXaW5kb3dzLAotQXBwbGUncyBNYWNpbnRvc2ggT1MsIGFuZCB0aGUgdmFyaW91cyBcVU5JWFwgZGVyaXZhdGl2ZXMuICBBIG1pbm9yCi1pcnJpdGF0aW9uIG9mIGNyb3NzLXBsYXRmb3JtIHdvcmsgCi1pcyB0aGF0IHRoZXNlIHRocmVlIHBsYXRmb3JtcyBhbGwgdXNlIGRpZmZlcmVudCBjaGFyYWN0ZXJzCi10byBtYXJrIHRoZSBlbmRzIG9mIGxpbmVzIGluIHRleHQgZmlsZXMuICBcVU5JWFwgdXNlcyB0aGUgbGluZWZlZWQKLShBU0NJSSBjaGFyYWN0ZXIgMTApLCBNYWNPUyB1c2VzIHRoZSBjYXJyaWFnZSByZXR1cm4gKEFTQ0lJCi1jaGFyYWN0ZXIgMTMpLCBhbmQgV2luZG93cyB1c2VzIGEgdHdvLWNoYXJhY3RlciBzZXF1ZW5jZSBvZiBhCi1jYXJyaWFnZSByZXR1cm4gcGx1cyBhIG5ld2xpbmUuCi0KLVB5dGhvbidzIGZpbGUgb2JqZWN0cyBjYW4gbm93IHN1cHBvcnQgZW5kIG9mIGxpbmUgY29udmVudGlvbnMgb3RoZXIKLXRoYW4gdGhlIG9uZSBmb2xsb3dlZCBieSB0aGUgcGxhdGZvcm0gb24gd2hpY2ggUHl0aG9uIGlzIHJ1bm5pbmcuCi1PcGVuaW5nIGEgZmlsZSB3aXRoIHRoZSBtb2RlIFxjb2RleydVJ30gb3IgXGNvZGV7J3JVJ30gd2lsbCBvcGVuIGEgZmlsZQotZm9yIHJlYWRpbmcgaW4gdW5pdmVyc2FsIG5ld2xpbmUgbW9kZS4gIEFsbCB0aHJlZSBsaW5lIGVuZGluZwotY29udmVudGlvbnMgd2lsbCBiZSB0cmFuc2xhdGVkIHRvIGEgXGNoYXJhY3RlcntcZSBufSBpbiB0aGUgc3RyaW5ncwotcmV0dXJuZWQgYnkgdGhlIHZhcmlvdXMgZmlsZSBtZXRob2RzIHN1Y2ggYXMgXG1ldGhvZHtyZWFkKCl9IGFuZAotXG1ldGhvZHtyZWFkbGluZSgpfS4KLQotVW5pdmVyc2FsIG5ld2xpbmUgc3VwcG9ydCBpcyBhbHNvIHVzZWQgd2hlbiBpbXBvcnRpbmcgbW9kdWxlcyBhbmQgd2hlbgotZXhlY3V0aW5nIGEgZmlsZSB3aXRoIHRoZSBcZnVuY3Rpb257ZXhlY2ZpbGUoKX0gZnVuY3Rpb24uICBUaGlzIG1lYW5zCi10aGF0IFB5dGhvbiBtb2R1bGVzIGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBhbGwgdGhyZWUgb3BlcmF0aW5nIHN5c3RlbXMKLXdpdGhvdXQgbmVlZGluZyB0byBjb252ZXJ0IHRoZSBsaW5lLWVuZGluZ3MuCi0KLVRoaXMgZmVhdHVyZSBjYW4gYmUgZGlzYWJsZWQgd2hlbiBjb21waWxpbmcgUHl0aG9uIGJ5IHNwZWNpZnlpbmcKLXRoZSBcbG9uZ3Byb2dyYW1vcHR7d2l0aG91dC11bml2ZXJzYWwtbmV3bGluZXN9IHN3aXRjaCB3aGVuIHJ1bm5pbmcgUHl0aG9uJ3MKLVxwcm9ncmFte2NvbmZpZ3VyZX0gc2NyaXB0LgotCi1cYmVnaW57c2VlYWxzb30KLQotXHNlZXBlcHsyNzh9e1VuaXZlcnNhbCBOZXdsaW5lIFN1cHBvcnR9e1dyaXR0ZW4KLWFuZCBpbXBsZW1lbnRlZCBieSBKYWNrIEphbnNlbi59Ci0KLVxlbmR7c2VlYWxzb30KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257UEVQIDI3OTogZW51bWVyYXRlKClcbGFiZWx7c2VjdGlvbi1lbnVtZXJhdGV9fQotCi1BIG5ldyBidWlsdC1pbiBmdW5jdGlvbiwgXGZ1bmN0aW9ue2VudW1lcmF0ZSgpfSwgd2lsbCBtYWtlCi1jZXJ0YWluIGxvb3BzIGEgYml0IGNsZWFyZXIuICBcY29kZXtlbnVtZXJhdGUodGhpbmcpfSwgd2hlcmUKLVx2YXJ7dGhpbmd9IGlzIGVpdGhlciBhbiBpdGVyYXRvciBvciBhIHNlcXVlbmNlLCByZXR1cm5zIGEgaXRlcmF0b3IKLXRoYXQgd2lsbCByZXR1cm4gXGNvZGV7KDAsIFx2YXJ7dGhpbmd9WzBdKX0sIFxjb2RleygxLAotXHZhcnt0aGluZ31bMV0pfSwgXGNvZGV7KDIsIFx2YXJ7dGhpbmd9WzJdKX0sIGFuZCBzbyBmb3J0aC4gIAotCi1BIGNvbW1vbiBpZGlvbSB0byBjaGFuZ2UgZXZlcnkgZWxlbWVudCBvZiBhIGxpc3QgbG9va3MgbGlrZSB0aGlzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1mb3IgaSBpbiByYW5nZShsZW4oTCkpOgotICAgIGl0ZW0gPSBMW2ldCi0gICAgIyAuLi4gY29tcHV0ZSBzb21lIHJlc3VsdCBiYXNlZCBvbiBpdGVtIC4uLgotICAgIExbaV0gPSByZXN1bHQKLVxlbmR7dmVyYmF0aW19Ci0KLVRoaXMgY2FuIGJlIHJld3JpdHRlbiB1c2luZyBcZnVuY3Rpb257ZW51bWVyYXRlKCl9IGFzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1mb3IgaSwgaXRlbSBpbiBlbnVtZXJhdGUoTCk6Ci0gICAgIyAuLi4gY29tcHV0ZSBzb21lIHJlc3VsdCBiYXNlZCBvbiBpdGVtIC4uLgotICAgIExbaV0gPSByZXN1bHQKLVxlbmR7dmVyYmF0aW19Ci0KLQotXGJlZ2lue3NlZWFsc299Ci0KLVxzZWVwZXB7Mjc5fXtUaGUgZW51bWVyYXRlKCkgYnVpbHQtaW4gZnVuY3Rpb259e1dyaXR0ZW4KLWFuZCBpbXBsZW1lbnRlZCBieSBSYXltb25kIEQuIEhldHRpbmdlci59Ci0KLVxlbmR7c2VlYWxzb30KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257UEVQIDI4MjogVGhlIGxvZ2dpbmcgUGFja2FnZX0KLQotQSBzdGFuZGFyZCBwYWNrYWdlIGZvciB3cml0aW5nIGxvZ3MsIFxtb2R1bGV7bG9nZ2luZ30sIGhhcyBiZWVuIGFkZGVkCi10byBQeXRob24gMi4zLiAgSXQgcHJvdmlkZXMgYSBwb3dlcmZ1bCBhbmQgZmxleGlibGUgbWVjaGFuaXNtIGZvcgotZ2VuZXJhdGluZyBsb2dnaW5nIG91dHB1dCB3aGljaCBjYW4gdGhlbiBiZSBmaWx0ZXJlZCBhbmQgcHJvY2Vzc2VkIGluCi12YXJpb3VzIHdheXMuICBBIGNvbmZpZ3VyYXRpb24gZmlsZSB3cml0dGVuIGluIGEgc3RhbmRhcmQgZm9ybWF0IGNhbgotYmUgdXNlZCB0byBjb250cm9sIHRoZSBsb2dnaW5nIGJlaGF2aW9yIG9mIGEgcHJvZ3JhbS4gIFB5dGhvbgotaW5jbHVkZXMgaGFuZGxlcnMgdGhhdCB3aWxsIHdyaXRlIGxvZyByZWNvcmRzIHRvCi1zdGFuZGFyZCBlcnJvciBvciB0byBhIGZpbGUgb3Igc29ja2V0LCBzZW5kIHRoZW0gdG8gdGhlIHN5c3RlbSBsb2csIG9yCi1ldmVuIGUtbWFpbCB0aGVtIHRvIGEgcGFydGljdWxhciBhZGRyZXNzOyBvZiBjb3Vyc2UsIGl0J3MgYWxzbwotcG9zc2libGUgdG8gd3JpdGUgeW91ciBvd24gaGFuZGxlciBjbGFzc2VzLgotCi1UaGUgXGNsYXNze0xvZ2dlcn0gY2xhc3MgaXMgdGhlIHByaW1hcnkgY2xhc3MuCi1Nb3N0IGFwcGxpY2F0aW9uIGNvZGUgd2lsbCBkZWFsIHdpdGggb25lIG9yIG1vcmUgXGNsYXNze0xvZ2dlcn0KLW9iamVjdHMsIGVhY2ggb25lIHVzZWQgYnkgYSBwYXJ0aWN1bGFyIHN1YnN5c3RlbSBvZiB0aGUgYXBwbGljYXRpb24uCi1FYWNoIFxjbGFzc3tMb2dnZXJ9IGlzIGlkZW50aWZpZWQgYnkgYSBuYW1lLCBhbmQgbmFtZXMgYXJlIG9yZ2FuaXplZAotaW50byBhIGhpZXJhcmNoeSB1c2luZyBcc2FtcHsufSAgYXMgdGhlIGNvbXBvbmVudCBzZXBhcmF0b3IuICBGb3IKLWV4YW1wbGUsIHlvdSBtaWdodCBoYXZlIFxjbGFzc3tMb2dnZXJ9IGluc3RhbmNlcyBuYW1lZCBcc2FtcHtzZXJ2ZXJ9LAotXHNhbXB7c2VydmVyLmF1dGh9IGFuZCBcc2FtcHtzZXJ2ZXIubmV0d29ya30uICBUaGUgbGF0dGVyIHR3bwotaW5zdGFuY2VzIGFyZSBiZWxvdyBcc2FtcHtzZXJ2ZXJ9IGluIHRoZSBoaWVyYXJjaHkuICBUaGlzIG1lYW5zIHRoYXQKLWlmIHlvdSB0dXJuIHVwIHRoZSB2ZXJib3NpdHkgZm9yIFxzYW1we3NlcnZlcn0gb3IgZGlyZWN0IFxzYW1we3NlcnZlcn0KLW1lc3NhZ2VzIHRvIGEgZGlmZmVyZW50IGhhbmRsZXIsIHRoZSBjaGFuZ2VzIHdpbGwgYWxzbyBhcHBseSB0bwotcmVjb3JkcyBsb2dnZWQgdG8gXHNhbXB7c2VydmVyLmF1dGh9IGFuZCBcc2FtcHtzZXJ2ZXIubmV0d29ya30uCi1UaGVyZSdzIGFsc28gYSByb290IFxjbGFzc3tMb2dnZXJ9IHRoYXQncyB0aGUgcGFyZW50IG9mIGFsbCBvdGhlcgotbG9nZ2Vycy4KLQotRm9yIHNpbXBsZSB1c2VzLCB0aGUgXG1vZHVsZXtsb2dnaW5nfSBwYWNrYWdlIGNvbnRhaW5zIHNvbWUKLWNvbnZlbmllbmNlIGZ1bmN0aW9ucyB0aGF0IGFsd2F5cyB1c2UgdGhlIHJvb3QgbG9nOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgbG9nZ2luZwotCi1sb2dnaW5nLmRlYnVnKCdEZWJ1Z2dpbmcgaW5mb3JtYXRpb24nKQotbG9nZ2luZy5pbmZvKCdJbmZvcm1hdGlvbmFsIG1lc3NhZ2UnKQotbG9nZ2luZy53YXJuaW5nKCdXYXJuaW5nOmNvbmZpZyBmaWxlICVzIG5vdCBmb3VuZCcsICdzZXJ2ZXIuY29uZicpCi1sb2dnaW5nLmVycm9yKCdFcnJvciBvY2N1cnJlZCcpCi1sb2dnaW5nLmNyaXRpY2FsKCdDcml0aWNhbCBlcnJvciAtLSBzaHV0dGluZyBkb3duJykKLVxlbmR7dmVyYmF0aW19Ci0KLVRoaXMgcHJvZHVjZXMgdGhlIGZvbGxvd2luZyBvdXRwdXQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLVdBUk5JTkc6cm9vdDpXYXJuaW5nOmNvbmZpZyBmaWxlIHNlcnZlci5jb25mIG5vdCBmb3VuZAotRVJST1I6cm9vdDpFcnJvciBvY2N1cnJlZAotQ1JJVElDQUw6cm9vdDpDcml0aWNhbCBlcnJvciAtLSBzaHV0dGluZyBkb3duCi1cZW5ke3ZlcmJhdGltfQotCi1JbiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLCBpbmZvcm1hdGlvbmFsIGFuZCBkZWJ1Z2dpbmcgbWVzc2FnZXMgYXJlCi1zdXBwcmVzc2VkIGFuZCB0aGUgb3V0cHV0IGlzIHNlbnQgdG8gc3RhbmRhcmQgZXJyb3IuICBZb3UgY2FuIGVuYWJsZQotdGhlIGRpc3BsYXkgb2YgaW5mb3JtYXRpb25hbCBhbmQgZGVidWdnaW5nIG1lc3NhZ2VzIGJ5IGNhbGxpbmcgdGhlCi1cbWV0aG9ke3NldExldmVsKCl9IG1ldGhvZCBvbiB0aGUgcm9vdCBsb2dnZXIuCi0KLU5vdGljZSB0aGUgXGZ1bmN0aW9ue3dhcm5pbmcoKX0gY2FsbCdzIHVzZSBvZiBzdHJpbmcgZm9ybWF0dGluZwotb3BlcmF0b3JzOyBhbGwgb2YgdGhlIGZ1bmN0aW9ucyBmb3IgbG9nZ2luZyBtZXNzYWdlcyB0YWtlIHRoZQotYXJndW1lbnRzIFxjb2RleyhcdmFye21zZ30sIFx2YXJ7YXJnMX0sIFx2YXJ7YXJnMn0sIC4uLil9IGFuZCBsb2cgdGhlCi1zdHJpbmcgcmVzdWx0aW5nIGZyb20gXGNvZGV7XHZhcnttc2d9IFwlIChcdmFye2FyZzF9LCBcdmFye2FyZzJ9LAotLi4uKX0uCi0KLVRoZXJlJ3MgYWxzbyBhbiBcZnVuY3Rpb257ZXhjZXB0aW9uKCl9IGZ1bmN0aW9uIHRoYXQgcmVjb3JkcyB0aGUgbW9zdAotcmVjZW50IHRyYWNlYmFjay4gIEFueSBvZiB0aGUgb3RoZXIgZnVuY3Rpb25zIHdpbGwgYWxzbyByZWNvcmQgdGhlCi10cmFjZWJhY2sgaWYgeW91IHNwZWNpZnkgYSB0cnVlIHZhbHVlIGZvciB0aGUga2V5d29yZCBhcmd1bWVudAotXHZhcntleGNfaW5mb30uCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLWRlZiBmKCk6Ci0gICAgdHJ5OiAgICAxLzAKLSAgICBleGNlcHQ6IGxvZ2dpbmcuZXhjZXB0aW9uKCdQcm9ibGVtIHJlY29yZGVkJykKLQotZigpCi1cZW5ke3ZlcmJhdGltfQotCi1UaGlzIHByb2R1Y2VzIHRoZSBmb2xsb3dpbmcgb3V0cHV0OgotCi1cYmVnaW57dmVyYmF0aW19Ci1FUlJPUjpyb290OlByb2JsZW0gcmVjb3JkZWQKLVRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLSAgRmlsZSAidC5weSIsIGxpbmUgNiwgaW4gZgotICAgIDEvMAotWmVyb0RpdmlzaW9uRXJyb3I6IGludGVnZXIgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm8KLVxlbmR7dmVyYmF0aW19Ci0KLVNsaWdodGx5IG1vcmUgYWR2YW5jZWQgcHJvZ3JhbXMgd2lsbCB1c2UgYSBsb2dnZXIgb3RoZXIgdGhhbiB0aGUgcm9vdAotbG9nZ2VyLiAgVGhlIFxmdW5jdGlvbntnZXRMb2dnZXIoXHZhcntuYW1lfSl9IGZ1bmN0aW9uIGlzIHVzZWQgdG8gZ2V0Ci1hIHBhcnRpY3VsYXIgbG9nLCBjcmVhdGluZyBpdCBpZiBpdCBkb2Vzbid0IGV4aXN0IHlldC4KLVxmdW5jdGlvbntnZXRMb2dnZXIoTm9uZSl9IHJldHVybnMgdGhlIHJvb3QgbG9nZ2VyLgotCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLWxvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCdzZXJ2ZXInKQotIC4uLgotbG9nLmluZm8oJ0xpc3RlbmluZyBvbiBwb3J0ICVpJywgcG9ydCkKLSAuLi4KLWxvZy5jcml0aWNhbCgnRGlzayBmdWxsJykKLSAuLi4KLVxlbmR7dmVyYmF0aW19Ci0KLUxvZyByZWNvcmRzIGFyZSB1c3VhbGx5IHByb3BhZ2F0ZWQgdXAgdGhlIGhpZXJhcmNoeSwgc28gYSBtZXNzYWdlCi1sb2dnZWQgdG8gXHNhbXB7c2VydmVyLmF1dGh9IGlzIGFsc28gc2VlbiBieSBcc2FtcHtzZXJ2ZXJ9IGFuZAotXHNhbXB7cm9vdH0sIGJ1dCBhIFxjbGFzc3tMb2dnZXJ9IGNhbiBwcmV2ZW50IHRoaXMgYnkgc2V0dGluZyBpdHMKLVxtZW1iZXJ7cHJvcGFnYXRlfSBhdHRyaWJ1dGUgdG8gXGNvbnN0YW50e0ZhbHNlfS4KLQotVGhlcmUgYXJlIG1vcmUgY2xhc3NlcyBwcm92aWRlZCBieSB0aGUgXG1vZHVsZXtsb2dnaW5nfSBwYWNrYWdlIHRoYXQKLWNhbiBiZSBjdXN0b21pemVkLiAgV2hlbiBhIFxjbGFzc3tMb2dnZXJ9IGluc3RhbmNlIGlzIHRvbGQgdG8gbG9nIGEKLW1lc3NhZ2UsIGl0IGNyZWF0ZXMgYSBcY2xhc3N7TG9nUmVjb3JkfSBpbnN0YW5jZSB0aGF0IGlzIHNlbnQgdG8gYW55Ci1udW1iZXIgb2YgZGlmZmVyZW50IFxjbGFzc3tIYW5kbGVyfSBpbnN0YW5jZXMuICBMb2dnZXJzIGFuZCBoYW5kbGVycwotY2FuIGFsc28gaGF2ZSBhbiBhdHRhY2hlZCBsaXN0IG9mIGZpbHRlcnMsIGFuZCBlYWNoIGZpbHRlciBjYW4gY2F1c2UKLXRoZSBcY2xhc3N7TG9nUmVjb3JkfSB0byBiZSBpZ25vcmVkIG9yIGNhbiBtb2RpZnkgdGhlIHJlY29yZCBiZWZvcmUKLXBhc3NpbmcgaXQgYWxvbmcuICBXaGVuIHRoZXkncmUgZmluYWxseSBvdXRwdXQsIFxjbGFzc3tMb2dSZWNvcmR9Ci1pbnN0YW5jZXMgYXJlIGNvbnZlcnRlZCB0byB0ZXh0IGJ5IGEgXGNsYXNze0Zvcm1hdHRlcn0gY2xhc3MuICBBbGwgb2YKLXRoZXNlIGNsYXNzZXMgY2FuIGJlIHJlcGxhY2VkIGJ5IHlvdXIgb3duIHNwZWNpYWxseS13cml0dGVuIGNsYXNzZXMuCi0KLVdpdGggYWxsIG9mIHRoZXNlIGZlYXR1cmVzIHRoZSBcbW9kdWxle2xvZ2dpbmd9IHBhY2thZ2Ugc2hvdWxkIHByb3ZpZGUKLWVub3VnaCBmbGV4aWJpbGl0eSBmb3IgZXZlbiB0aGUgbW9zdCBjb21wbGljYXRlZCBhcHBsaWNhdGlvbnMuICBUaGlzCi1pcyBvbmx5IGFuIGluY29tcGxldGUgb3ZlcnZpZXcgb2YgaXRzIGZlYXR1cmVzLCBzbyBwbGVhc2Ugc2VlIHRoZQotXHVsaW5re3BhY2thZ2UncyByZWZlcmVuY2UgZG9jdW1lbnRhdGlvbn17Li4vbGliL21vZHVsZS1sb2dnaW5nLmh0bWx9Ci1mb3IgYWxsIG9mIHRoZSBkZXRhaWxzLiAgUmVhZGluZyBccGVwezI4Mn0gd2lsbCBhbHNvIGJlIGhlbHBmdWwuCi0KLQotXGJlZ2lue3NlZWFsc299Ci0KLVxzZWVwZXB7MjgyfXtBIExvZ2dpbmcgU3lzdGVtfXtXcml0dGVuIGJ5IFZpbmF5IFNhamlwIGFuZCBUcmVudCBNaWNrOwotaW1wbGVtZW50ZWQgYnkgVmluYXkgU2FqaXAufQotCi1cZW5ke3NlZWFsc299Ci0KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue1BFUCAyODU6IEEgQm9vbGVhbiBUeXBlXGxhYmVse3NlY3Rpb24tYm9vbH19Ci0KLUEgQm9vbGVhbiB0eXBlIHdhcyBhZGRlZCB0byBQeXRob24gMi4zLiAgVHdvIG5ldyBjb25zdGFudHMgd2VyZSBhZGRlZAotdG8gdGhlIFxtb2R1bGV7X19idWlsdGluX199IG1vZHVsZSwgXGNvbnN0YW50e1RydWV9IGFuZAotXGNvbnN0YW50e0ZhbHNlfS4gIChcY29uc3RhbnR7VHJ1ZX0gYW5kCi1cY29uc3RhbnR7RmFsc2V9IGNvbnN0YW50cyB3ZXJlIGFkZGVkIHRvIHRoZSBidWlsdC1pbnMKLWluIFB5dGhvbiAyLjIuMSwgYnV0IHRoZSAyLjIuMSB2ZXJzaW9ucyBhcmUgc2ltcGx5IHNldCB0byBpbnRlZ2VyIHZhbHVlcyBvZgotMSBhbmQgMCBhbmQgYXJlbid0IGEgZGlmZmVyZW50IHR5cGUuKQotCi1UaGUgdHlwZSBvYmplY3QgZm9yIHRoaXMgbmV3IHR5cGUgaXMgbmFtZWQKLVxjbGFzc3tib29sfTsgdGhlIGNvbnN0cnVjdG9yIGZvciBpdCB0YWtlcyBhbnkgUHl0aG9uIHZhbHVlIGFuZAotY29udmVydHMgaXQgdG8gXGNvbnN0YW50e1RydWV9IG9yIFxjb25zdGFudHtGYWxzZX0uCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBib29sKDEpCi1UcnVlCi0+Pj4gYm9vbCgwKQotRmFsc2UKLT4+PiBib29sKFtdKQotRmFsc2UKLT4+PiBib29sKCAoMSwpICkKLVRydWUKLVxlbmR7dmVyYmF0aW19Ci0KLU1vc3Qgb2YgdGhlIHN0YW5kYXJkIGxpYnJhcnkgbW9kdWxlcyBhbmQgYnVpbHQtaW4gZnVuY3Rpb25zIGhhdmUgYmVlbgotY2hhbmdlZCB0byByZXR1cm4gQm9vbGVhbnMuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBvYmogPSBbXQotPj4+IGhhc2F0dHIob2JqLCAnYXBwZW5kJykKLVRydWUKLT4+PiBpc2luc3RhbmNlKG9iaiwgbGlzdCkKLVRydWUKLT4+PiBpc2luc3RhbmNlKG9iaiwgdHVwbGUpCi1GYWxzZQotXGVuZHt2ZXJiYXRpbX0KLQotUHl0aG9uJ3MgQm9vbGVhbnMgd2VyZSBhZGRlZCB3aXRoIHRoZSBwcmltYXJ5IGdvYWwgb2YgbWFraW5nIGNvZGUKLWNsZWFyZXIuICBGb3IgZXhhbXBsZSwgaWYgeW91J3JlIHJlYWRpbmcgYSBmdW5jdGlvbiBhbmQgZW5jb3VudGVyIHRoZQotc3RhdGVtZW50IFxjb2Rle3JldHVybiAxfSwgeW91IG1pZ2h0IHdvbmRlciB3aGV0aGVyIHRoZSBcY29kZXsxfQotcmVwcmVzZW50cyBhIEJvb2xlYW4gdHJ1dGggdmFsdWUsIGFuIGluZGV4LCBvciBhCi1jb2VmZmljaWVudCB0aGF0IG11bHRpcGxpZXMgc29tZSBvdGhlciBxdWFudGl0eS4gIElmIHRoZSBzdGF0ZW1lbnQgaXMKLVxjb2Rle3JldHVybiBUcnVlfSwgaG93ZXZlciwgdGhlIG1lYW5pbmcgb2YgdGhlIHJldHVybiB2YWx1ZSBpcyBxdWl0ZQotY2xlYXIuCi0KLVB5dGhvbidzIEJvb2xlYW5zIHdlcmUgXGVtcGh7bm90fSBhZGRlZCBmb3IgdGhlIHNha2Ugb2Ygc3RyaWN0Ci10eXBlLWNoZWNraW5nLiAgQSB2ZXJ5IHN0cmljdCBsYW5ndWFnZSBzdWNoIGFzIFBhc2NhbCB3b3VsZCBhbHNvCi1wcmV2ZW50IHlvdSBwZXJmb3JtaW5nIGFyaXRobWV0aWMgd2l0aCBCb29sZWFucywgYW5kIHdvdWxkIHJlcXVpcmUKLXRoYXQgdGhlIGV4cHJlc3Npb24gaW4gYW4gXGtleXdvcmR7aWZ9IHN0YXRlbWVudCBhbHdheXMgZXZhbHVhdGUgdG8gYQotQm9vbGVhbiByZXN1bHQuICBQeXRob24gaXMgbm90IHRoaXMgc3RyaWN0IGFuZCBuZXZlciB3aWxsIGJlLCBhcwotXHBlcHsyODV9IGV4cGxpY2l0bHkgc2F5cy4gIFRoaXMgbWVhbnMgeW91IGNhbiBzdGlsbCB1c2UgYW55Ci1leHByZXNzaW9uIGluIGFuIFxrZXl3b3Jke2lmfSBzdGF0ZW1lbnQsIGV2ZW4gb25lcyB0aGF0IGV2YWx1YXRlIHRvIGEKLWxpc3Qgb3IgdHVwbGUgb3Igc29tZSByYW5kb20gb2JqZWN0LiAgVGhlIEJvb2xlYW4gdHlwZSBpcyBhCi1zdWJjbGFzcyBvZiB0aGUgXGNsYXNze2ludH0gY2xhc3Mgc28gdGhhdCBhcml0aG1ldGljIHVzaW5nIGEgQm9vbGVhbgotc3RpbGwgd29ya3MuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBUcnVlICsgMQotMgotPj4+IEZhbHNlICsgMQotMQotPj4+IEZhbHNlICogNzUKLTAKLT4+PiBUcnVlICogNzUKLTc1Ci1cZW5ke3ZlcmJhdGltfQotCi1UbyBzdW0gdXAgXGNvbnN0YW50e1RydWV9IGFuZCBcY29uc3RhbnR7RmFsc2V9IGluIGEgc2VudGVuY2U6IHRoZXkncmUKLWFsdGVybmF0aXZlIHdheXMgdG8gc3BlbGwgdGhlIGludGVnZXIgdmFsdWVzIDEgYW5kIDAsIHdpdGggdGhlIHNpbmdsZQotZGlmZmVyZW5jZSB0aGF0IFxmdW5jdGlvbntzdHIoKX0gYW5kIFxmdW5jdGlvbntyZXByKCl9IHJldHVybiB0aGUKLXN0cmluZ3MgXGNvZGV7J1RydWUnfSBhbmQgXGNvZGV7J0ZhbHNlJ30gaW5zdGVhZCBvZiBcY29kZXsnMSd9IGFuZAotXGNvZGV7JzAnfS4KLQotXGJlZ2lue3NlZWFsc299Ci0KLVxzZWVwZXB7Mjg1fXtBZGRpbmcgYSBib29sIHR5cGV9e1dyaXR0ZW4gYW5kIGltcGxlbWVudGVkIGJ5IEd2Ui59Ci0KLVxlbmR7c2VlYWxzb30KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257UEVQIDI5MzogQ29kZWMgRXJyb3IgSGFuZGxpbmcgQ2FsbGJhY2tzfQotCi1XaGVuIGVuY29kaW5nIGEgVW5pY29kZSBzdHJpbmcgaW50byBhIGJ5dGUgc3RyaW5nLCB1bmVuY29kYWJsZQotY2hhcmFjdGVycyBtYXkgYmUgZW5jb3VudGVyZWQuICBTbyBmYXIsIFB5dGhvbiBoYXMgYWxsb3dlZCBzcGVjaWZ5aW5nCi10aGUgZXJyb3IgcHJvY2Vzc2luZyBhcyBlaXRoZXIgYGBzdHJpY3QnJyAocmFpc2luZwotXGV4Y2VwdGlvbntVbmljb2RlRXJyb3J9KSwgYGBpZ25vcmUnJyAoc2tpcHBpbmcgdGhlIGNoYXJhY3RlciksIG9yCi1gYHJlcGxhY2UnJyAodXNpbmcgYSBxdWVzdGlvbiBtYXJrIGluIHRoZSBvdXRwdXQgc3RyaW5nKSwgd2l0aAotYGBzdHJpY3QnJyBiZWluZyB0aGUgZGVmYXVsdCBiZWhhdmlvci4gSXQgbWF5IGJlIGRlc2lyYWJsZSB0byBzcGVjaWZ5Ci1hbHRlcm5hdGl2ZSBwcm9jZXNzaW5nIG9mIHN1Y2ggZXJyb3JzLCBzdWNoIGFzIGluc2VydGluZyBhbiBYTUwKLWNoYXJhY3RlciByZWZlcmVuY2Ugb3IgSFRNTCBlbnRpdHkgcmVmZXJlbmNlIGludG8gdGhlIGNvbnZlcnRlZAotc3RyaW5nLgotCi1QeXRob24gbm93IGhhcyBhIGZsZXhpYmxlIGZyYW1ld29yayB0byBhZGQgZGlmZmVyZW50IHByb2Nlc3NpbmcKLXN0cmF0ZWdpZXMuICBOZXcgZXJyb3IgaGFuZGxlcnMgY2FuIGJlIGFkZGVkIHdpdGgKLVxmdW5jdGlvbntjb2RlY3MucmVnaXN0ZXJfZXJyb3J9LCBhbmQgY29kZWNzIHRoZW4gY2FuIGFjY2VzcyB0aGUgZXJyb3IKLWhhbmRsZXIgd2l0aCBcZnVuY3Rpb257Y29kZWNzLmxvb2t1cF9lcnJvcn0uIEFuIGVxdWl2YWxlbnQgQyBBUEkgaGFzCi1iZWVuIGFkZGVkIGZvciBjb2RlY3Mgd3JpdHRlbiBpbiBDLiBUaGUgZXJyb3IgaGFuZGxlciBnZXRzIHRoZQotbmVjZXNzYXJ5IHN0YXRlIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIHN0cmluZyBiZWluZyBjb252ZXJ0ZWQsIHRoZQotcG9zaXRpb24gaW4gdGhlIHN0cmluZyB3aGVyZSB0aGUgZXJyb3Igd2FzIGRldGVjdGVkLCBhbmQgdGhlIHRhcmdldAotZW5jb2RpbmcuICBUaGUgaGFuZGxlciBjYW4gdGhlbiBlaXRoZXIgcmFpc2UgYW4gZXhjZXB0aW9uIG9yIHJldHVybiBhCi1yZXBsYWNlbWVudCBzdHJpbmcuCi0KLVR3byBhZGRpdGlvbmFsIGVycm9yIGhhbmRsZXJzIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCB1c2luZyB0aGlzCi1mcmFtZXdvcms6IGBgYmFja3NsYXNocmVwbGFjZScnIHVzZXMgUHl0aG9uIGJhY2tzbGFzaCBxdW90aW5nIHRvCi1yZXByZXNlbnQgdW5lbmNvZGFibGUgY2hhcmFjdGVycyBhbmQgYGB4bWxjaGFycmVmcmVwbGFjZScnIGVtaXRzCi1YTUwgY2hhcmFjdGVyIHJlZmVyZW5jZXMuCi0KLVxiZWdpbntzZWVhbHNvfQotCi1cc2VlcGVwezI5M317Q29kZWMgRXJyb3IgSGFuZGxpbmcgQ2FsbGJhY2tzfXtXcml0dGVuIGFuZCBpbXBsZW1lbnRlZCBieQotV2FsdGVyIERcIm9yd2FsZC59Ci0KLVxlbmR7c2VlYWxzb30KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257UEVQIDMwMTogUGFja2FnZSBJbmRleCBhbmQgTWV0YWRhdGEgZm9yCi1EaXN0dXRpbHNcbGFiZWx7c2VjdGlvbi1wZXAzMDF9fQotCi1TdXBwb3J0IGZvciB0aGUgbG9uZy1yZXF1ZXN0ZWQgUHl0aG9uIGNhdGFsb2cgbWFrZXMgaXRzIGZpcnN0Ci1hcHBlYXJhbmNlIGluIDIuMy4KLQotVGhlIGhlYXJ0IG9mIHRoZSBjYXRhbG9nIGlzIHRoZSBuZXcgRGlzdHV0aWxzIFxjb21tYW5ke3JlZ2lzdGVyfSBjb21tYW5kLgotUnVubmluZyBcY29kZXtweXRob24gc2V0dXAucHkgcmVnaXN0ZXJ9IHdpbGwgY29sbGVjdCB0aGUgbWV0YWRhdGEKLWRlc2NyaWJpbmcgYSBwYWNrYWdlLCBzdWNoIGFzIGl0cyBuYW1lLCB2ZXJzaW9uLCBtYWludGFpbmVyLAotZGVzY3JpcHRpb24sIFwmYy4sIGFuZCBzZW5kIGl0IHRvIGEgY2VudHJhbCBjYXRhbG9nIHNlcnZlci4gIFRoZQotcmVzdWx0aW5nIGNhdGFsb2cgaXMgYXZhaWxhYmxlIGZyb20gXHVybHtodHRwOi8vd3d3LnB5dGhvbi5vcmcvcHlwaX0uCi0KLVRvIG1ha2UgdGhlIGNhdGFsb2cgYSBiaXQgbW9yZSB1c2VmdWwsIGEgbmV3IG9wdGlvbmFsCi1cdmFye2NsYXNzaWZpZXJzfSBrZXl3b3JkIGFyZ3VtZW50IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBEaXN0dXRpbHMKLVxmdW5jdGlvbntzZXR1cCgpfSBmdW5jdGlvbi4gIEEgbGlzdCBvZgotXHVsaW5re1Ryb3ZlfXtodHRwOi8vY2F0Yi5vcmcvXHRleHRhc2NpaXRpbGRlIGVzci90cm92ZS99LXN0eWxlCi1zdHJpbmdzIGNhbiBiZSBzdXBwbGllZCB0byBoZWxwIGNsYXNzaWZ5IHRoZSBzb2Z0d2FyZS4KLQotSGVyZSdzIGFuIGV4YW1wbGUgXGZpbGV7c2V0dXAucHl9IHdpdGggY2xhc3NpZmllcnMsIHdyaXR0ZW4gdG8gYmUgY29tcGF0aWJsZSAKLXdpdGggb2xkZXIgdmVyc2lvbnMgb2YgdGhlIERpc3R1dGlsczoKLQotXGJlZ2lue3ZlcmJhdGltfQotZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGNvcmUKLWt3ID0geyduYW1lJzogIlF1aXhvdGUiLAotICAgICAgJ3ZlcnNpb24nOiAiMC41LjEiLAotICAgICAgJ2Rlc2NyaXB0aW9uJzogIkEgaGlnaGx5IFB5dGhvbmljIFdlYiBhcHBsaWNhdGlvbiBmcmFtZXdvcmsiLAotICAgICAgIyAuLi4KLSAgICAgIH0KLQotaWYgKGhhc2F0dHIoY29yZSwgJ3NldHVwX2tleXdvcmRzJykgYW5kIAotICAgICdjbGFzc2lmaWVycycgaW4gY29yZS5zZXR1cF9rZXl3b3Jkcyk6Ci0gICAga3dbJ2NsYXNzaWZpZXJzJ10gPSBcCi0gICAgICAgIFsnVG9waWMgOjogSW50ZXJuZXQgOjogV1dXL0hUVFAgOjogRHluYW1pYyBDb250ZW50JywKLSAgICAgICAgICdFbnZpcm9ubWVudCA6OiBObyBJbnB1dC9PdXRwdXQgKERhZW1vbiknLAotICAgICAgICAgJ0ludGVuZGVkIEF1ZGllbmNlIDo6IERldmVsb3BlcnMnXSwKLQotY29yZS5zZXR1cCgqKmt3KQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGZ1bGwgbGlzdCBvZiBjbGFzc2lmaWVycyBjYW4gYmUgb2J0YWluZWQgYnkgcnVubmluZyAKLVx2ZXJifHB5dGhvbiBzZXR1cC5weSByZWdpc3RlciAtLWxpc3QtY2xhc3NpZmllcnN8LgotCi1cYmVnaW57c2VlYWxzb30KLQotXHNlZXBlcHszMDF9e1BhY2thZ2UgSW5kZXggYW5kIE1ldGFkYXRhIGZvciBEaXN0dXRpbHN9e1dyaXR0ZW4gYW5kCi1pbXBsZW1lbnRlZCBieSBSaWNoYXJkIEpvbmVzLn0KLQotXGVuZHtzZWVhbHNvfQotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntQRVAgMzAyOiBOZXcgSW1wb3J0IEhvb2tzIFxsYWJlbHtzZWN0aW9uLXBlcDMwMn19Ci0KLVdoaWxlIGl0J3MgYmVlbiBwb3NzaWJsZSB0byB3cml0ZSBjdXN0b20gaW1wb3J0IGhvb2tzIGV2ZXIgc2luY2UgdGhlCi1cbW9kdWxle2lob29rc30gbW9kdWxlIHdhcyBpbnRyb2R1Y2VkIGluIFB5dGhvbiAxLjMsIG5vIG9uZSBoYXMgZXZlcgotYmVlbiByZWFsbHkgaGFwcHkgd2l0aCBpdCBiZWNhdXNlIHdyaXRpbmcgbmV3IGltcG9ydCBob29rcyBpcwotZGlmZmljdWx0IGFuZCBtZXNzeS4gIFRoZXJlIGhhdmUgYmVlbiB2YXJpb3VzIHByb3Bvc2VkIGFsdGVybmF0aXZlcwotc3VjaCBhcyB0aGUgXG1vZHVsZXtpbXB1dGlsfSBhbmQgXG1vZHVsZXtpdX0gbW9kdWxlcywgYnV0IG5vbmUgb2YgdGhlbQotaGFzIGV2ZXIgZ2FpbmVkIG11Y2ggYWNjZXB0YW5jZSwgYW5kIG5vbmUgb2YgdGhlbSB3ZXJlIGVhc2lseSB1c2FibGUKLWZyb20gXEN7fSBjb2RlLgotCi1ccGVwezMwMn0gYm9ycm93cyBpZGVhcyBmcm9tIGl0cyBwcmVkZWNlc3NvcnMsIGVzcGVjaWFsbHkgZnJvbQotR29yZG9uIE1jTWlsbGFuJ3MgXG1vZHVsZXtpdX0gbW9kdWxlLiAgVGhyZWUgbmV3IGl0ZW1zIAotYXJlIGFkZGVkIHRvIHRoZSBcbW9kdWxle3N5c30gbW9kdWxlOgotCi1cYmVnaW57aXRlbWl6ZX0KLSAgXGl0ZW0gXGNvZGV7c3lzLnBhdGhfaG9va3N9IGlzIGEgbGlzdCBvZiBjYWxsYWJsZSBvYmplY3RzOyBtb3N0IAotICBvZnRlbiB0aGV5J2xsIGJlIGNsYXNzZXMuICBFYWNoIGNhbGxhYmxlIHRha2VzIGEgc3RyaW5nIGNvbnRhaW5pbmcgYQotICBwYXRoIGFuZCBlaXRoZXIgcmV0dXJucyBhbiBpbXBvcnRlciBvYmplY3QgdGhhdCB3aWxsIGhhbmRsZSBpbXBvcnRzCi0gIGZyb20gdGhpcyBwYXRoIG9yIHJhaXNlcyBhbiBcZXhjZXB0aW9ue0ltcG9ydEVycm9yfSBleGNlcHRpb24gaWYgaXQKLSAgY2FuJ3QgaGFuZGxlIHRoaXMgcGF0aC4KLQotICBcaXRlbSBcY29kZXtzeXMucGF0aF9pbXBvcnRlcl9jYWNoZX0gY2FjaGVzIGltcG9ydGVyIG9iamVjdHMgZm9yCi0gIGVhY2ggcGF0aCwgc28gXGNvZGV7c3lzLnBhdGhfaG9va3N9IHdpbGwgb25seSBuZWVkIHRvIGJlIHRyYXZlcnNlZAotICBvbmNlIGZvciBlYWNoIHBhdGguCi0KLSAgXGl0ZW0gXGNvZGV7c3lzLm1ldGFfcGF0aH0gaXMgYSBsaXN0IG9mIGltcG9ydGVyIG9iamVjdHMgdGhhdCB3aWxsCi0gIGJlIHRyYXZlcnNlZCBiZWZvcmUgXGNvZGV7c3lzLnBhdGh9IGlzIGNoZWNrZWQuICBUaGlzIGxpc3QgaXMKLSAgaW5pdGlhbGx5IGVtcHR5LCBidXQgdXNlciBjb2RlIGNhbiBhZGQgb2JqZWN0cyB0byBpdC4gIEFkZGl0aW9uYWwKLSAgYnVpbHQtaW4gYW5kIGZyb3plbiBtb2R1bGVzIGNhbiBiZSBpbXBvcnRlZCBieSBhbiBvYmplY3QgYWRkZWQgdG8KLSAgdGhpcyBsaXN0LgotCi1cZW5ke2l0ZW1pemV9Ci0KLUltcG9ydGVyIG9iamVjdHMgbXVzdCBoYXZlIGEgc2luZ2xlIG1ldGhvZCwKLVxtZXRob2R7ZmluZF9tb2R1bGUoXHZhcntmdWxsbmFtZX0sIFx2YXJ7cGF0aH09Tm9uZSl9LiAgXHZhcntmdWxsbmFtZX0KLXdpbGwgYmUgYSBtb2R1bGUgb3IgcGFja2FnZSBuYW1lLCBlLmcuIFxzYW1we3N0cmluZ30gb3IKLVxzYW1we2Rpc3R1dGlscy5jb3JlfS4gIFxtZXRob2R7ZmluZF9tb2R1bGUoKX0gbXVzdCByZXR1cm4gYSBsb2FkZXIgb2JqZWN0Ci10aGF0IGhhcyBhIHNpbmdsZSBtZXRob2QsIFxtZXRob2R7bG9hZF9tb2R1bGUoXHZhcntmdWxsbmFtZX0pfSwgdGhhdAotY3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBtb2R1bGUgb2JqZWN0LgotCi1Qc2V1ZG8tY29kZSBmb3IgUHl0aG9uJ3MgbmV3IGltcG9ydCBsb2dpYywgdGhlcmVmb3JlLCBsb29rcyBzb21ldGhpbmcKLWxpa2UgdGhpcyAoc2ltcGxpZmllZCBhIGJpdDsgc2VlIFxwZXB7MzAyfSBmb3IgdGhlIGZ1bGwgZGV0YWlscyk6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWZvciBtcCBpbiBzeXMubWV0YV9wYXRoOgotICAgIGxvYWRlciA9IG1wKGZ1bGxuYW1lKQotICAgIGlmIGxvYWRlciBpcyBub3QgTm9uZToKLSAgICAgICAgPG1vZHVsZT4gPSBsb2FkZXIubG9hZF9tb2R1bGUoZnVsbG5hbWUpCi0gICAgICAgIAotZm9yIHBhdGggaW4gc3lzLnBhdGg6Ci0gICAgZm9yIGhvb2sgaW4gc3lzLnBhdGhfaG9va3M6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGltcG9ydGVyID0gaG9vayhwYXRoKQotICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgICAgICAjIEltcG9ydEVycm9yLCBzbyB0cnkgdGhlIG90aGVyIHBhdGggaG9va3MKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGxvYWRlciA9IGltcG9ydGVyLmZpbmRfbW9kdWxlKGZ1bGxuYW1lKQotICAgICAgICAgICAgPG1vZHVsZT4gPSBsb2FkZXIubG9hZF9tb2R1bGUoZnVsbG5hbWUpCi0KLSMgTm90IGZvdW5kIQotcmFpc2UgSW1wb3J0RXJyb3IKLVxlbmR7dmVyYmF0aW19Ci0KLVxiZWdpbntzZWVhbHNvfQotCi1cc2VlcGVwezMwMn17TmV3IEltcG9ydCBIb29rc317V3JpdHRlbiBieSBKdXN0IHZhbn5Sb3NzdW0gYW5kIFBhdWwgTW9vcmUuCi1JbXBsZW1lbnRlZCBieSBKdXN0IHZhbn5Sb3NzdW0uCi19Ci0KLVxlbmR7c2VlYWxzb30KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257UEVQIDMwNTogQ29tbWEtc2VwYXJhdGVkIEZpbGVzIFxsYWJlbHtzZWN0aW9uLXBlcDMwNX19Ci0KLUNvbW1hLXNlcGFyYXRlZCBmaWxlcyBhcmUgYSBmb3JtYXQgZnJlcXVlbnRseSB1c2VkIGZvciBleHBvcnRpbmcgZGF0YQotZnJvbSBkYXRhYmFzZXMgYW5kIHNwcmVhZHNoZWV0cy4gIFB5dGhvbiAyLjMgYWRkcyBhIHBhcnNlciBmb3IKLWNvbW1hLXNlcGFyYXRlZCBmaWxlcy4KLQotQ29tbWEtc2VwYXJhdGVkIGZvcm1hdCBpcyBkZWNlcHRpdmVseSBzaW1wbGUgYXQgZmlyc3QgZ2xhbmNlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1Db3N0cywxNTAsMjAwLDMuOTUKLVxlbmR7dmVyYmF0aW19Ci0KLVJlYWQgYSBsaW5lIGFuZCBjYWxsIFxjb2Rle2xpbmUuc3BsaXQoJywnKX06IHdoYXQgY291bGQgYmUgc2ltcGxlcj8KLUJ1dCB0b3NzIGluIHN0cmluZyBkYXRhIHRoYXQgY2FuIGNvbnRhaW4gY29tbWFzLCBhbmQgdGhpbmdzIGdldCBtb3JlCi1jb21wbGljYXRlZDoKLQotXGJlZ2lue3ZlcmJhdGltfQotIkNvc3RzIiwxNTAsMjAwLDMuOTUsIkluY2x1ZGVzIHRheGVzLCBzaGlwcGluZywgYW5kIHN1bmRyeSBpdGVtcyIKLVxlbmR7dmVyYmF0aW19Ci0KLUEgYmlnIHVnbHkgcmVndWxhciBleHByZXNzaW9uIGNhbiBwYXJzZSB0aGlzLCBidXQgdXNpbmcgdGhlIG5ldyAKLVxtb2R1bGV7Y3N2fSBwYWNrYWdlIGlzIG11Y2ggc2ltcGxlcjoKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IGNzdgotCi1pbnB1dCA9IG9wZW4oJ2RhdGFmaWxlJywgJ3JiJykKLXJlYWRlciA9IGNzdi5yZWFkZXIoaW5wdXQpCi1mb3IgbGluZSBpbiByZWFkZXI6Ci0gICAgcHJpbnQgbGluZQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIFxmdW5jdGlvbntyZWFkZXJ9IGZ1bmN0aW9uIHRha2VzIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBvcHRpb25zLgotVGhlIGZpZWxkIHNlcGFyYXRvciBpc24ndCBsaW1pdGVkIHRvIHRoZSBjb21tYSBhbmQgY2FuIGJlIGNoYW5nZWQgdG8KLWFueSBjaGFyYWN0ZXIsIGFuZCBzbyBjYW4gdGhlIHF1b3RpbmcgYW5kIGxpbmUtZW5kaW5nIGNoYXJhY3RlcnMuCi0KLURpZmZlcmVudCBkaWFsZWN0cyBvZiBjb21tYS1zZXBhcmF0ZWQgZmlsZXMgY2FuIGJlIGRlZmluZWQgYW5kCi1yZWdpc3RlcmVkOyBjdXJyZW50bHkgdGhlcmUgYXJlIHR3byBkaWFsZWN0cywgYm90aCB1c2VkIGJ5IE1pY3Jvc29mdCBFeGNlbC4KLUEgc2VwYXJhdGUgXGNsYXNze2Nzdi53cml0ZXJ9IGNsYXNzIHdpbGwgZ2VuZXJhdGUgY29tbWEtc2VwYXJhdGVkIGZpbGVzCi1mcm9tIGEgc3VjY2Vzc2lvbiBvZiB0dXBsZXMgb3IgbGlzdHMsIHF1b3Rpbmcgc3RyaW5ncyB0aGF0IGNvbnRhaW4gdGhlCi1kZWxpbWl0ZXIuICAKLQotXGJlZ2lue3NlZWFsc299Ci0KLVxzZWVwZXB7MzA1fXtDU1YgRmlsZSBBUEl9e1dyaXR0ZW4gYW5kIGltcGxlbWVudGVkIAotYnkgS2V2aW4gQWx0aXMsIERhdmUgQ29sZSwgQW5kcmV3IE1jTmFtYXJhLCBTa2lwIE1vbnRhbmFybywgQ2xpZmYgV2VsbHMuCi19Ci0KLVxlbmR7c2VlYWxzb30KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue1BFUCAzMDc6IFBpY2tsZSBFbmhhbmNlbWVudHMgXGxhYmVse3NlY3Rpb24tcGVwMzA3fX0KLQotVGhlIFxtb2R1bGV7cGlja2xlfSBhbmQgXG1vZHVsZXtjUGlja2xlfSBtb2R1bGVzIHJlY2VpdmVkIHNvbWUKLWF0dGVudGlvbiBkdXJpbmcgdGhlIDIuMyBkZXZlbG9wbWVudCBjeWNsZS4gIEluIDIuMiwgbmV3LXN0eWxlIGNsYXNzZXMKLWNvdWxkIGJlIHBpY2tsZWQgd2l0aG91dCBkaWZmaWN1bHR5LCBidXQgdGhleSB3ZXJlbid0IHBpY2tsZWQgdmVyeQotY29tcGFjdGx5OyBccGVwezMwN30gcXVvdGVzIGEgdHJpdmlhbCBleGFtcGxlIHdoZXJlIGEgbmV3LXN0eWxlIGNsYXNzCi1yZXN1bHRzIGluIGEgcGlja2xlZCBzdHJpbmcgdGhyZWUgdGltZXMgbG9uZ2VyIHRoYW4gdGhhdCBmb3IgYSBjbGFzc2ljCi1jbGFzcy4KLQotVGhlIHNvbHV0aW9uIHdhcyB0byBpbnZlbnQgYSBuZXcgcGlja2xlIHByb3RvY29sLiAgVGhlCi1cZnVuY3Rpb257cGlja2xlLmR1bXBzKCl9IGZ1bmN0aW9uIGhhcyBzdXBwb3J0ZWQgYSB0ZXh0LW9yLWJpbmFyeSBmbGFnIAotZm9yIGEgbG9uZyB0aW1lLiAgSW4gMi4zLCB0aGlzIGZsYWcgaXMgcmVkZWZpbmVkIGZyb20gYSBCb29sZWFuIHRvIGFuCi1pbnRlZ2VyOiAwIGlzIHRoZSBvbGQgdGV4dC1tb2RlIHBpY2tsZSBmb3JtYXQsIDEgaXMgdGhlIG9sZCBiaW5hcnkKLWZvcm1hdCwgYW5kIG5vdyAyIGlzIGEgbmV3IDIuMy1zcGVjaWZpYyBmb3JtYXQuICBBIG5ldyBjb25zdGFudCwKLVxjb25zdGFudHtwaWNrbGUuSElHSEVTVF9QUk9UT0NPTH0sIGNhbiBiZSB1c2VkIHRvIHNlbGVjdCB0aGUgZmFuY2llc3QKLXByb3RvY29sIGF2YWlsYWJsZS4KLQotVW5waWNrbGluZyBpcyBubyBsb25nZXIgY29uc2lkZXJlZCBhIHNhZmUgb3BlcmF0aW9uLiAgMi4yJ3MKLVxtb2R1bGV7cGlja2xlfSBwcm92aWRlZCBob29rcyBmb3IgdHJ5aW5nIHRvIHByZXZlbnQgdW5zYWZlIGNsYXNzZXMKLWZyb20gYmVpbmcgdW5waWNrbGVkIChzcGVjaWZpY2FsbHksIGEKLVxtZW1iZXJ7X19zYWZlX2Zvcl91bnBpY2tsaW5nX199IGF0dHJpYnV0ZSksIGJ1dCBub25lIG9mIHRoaXMgY29kZQotd2FzIGV2ZXIgYXVkaXRlZCBhbmQgdGhlcmVmb3JlIGl0J3MgYWxsIGJlZW4gcmlwcGVkIG91dCBpbiAyLjMuICBZb3UKLXNob3VsZCBub3QgdW5waWNrbGUgdW50cnVzdGVkIGRhdGEgaW4gYW55IHZlcnNpb24gb2YgUHl0aG9uLgotCi1UbyByZWR1Y2UgdGhlIHBpY2tsaW5nIG92ZXJoZWFkIGZvciBuZXctc3R5bGUgY2xhc3NlcywgYSBuZXcgaW50ZXJmYWNlCi1mb3IgY3VzdG9taXppbmcgcGlja2xpbmcgd2FzIGFkZGVkIHVzaW5nIHRocmVlIHNwZWNpYWwgbWV0aG9kczoKLVxtZXRob2R7X19nZXRzdGF0ZV9ffSwgXG1ldGhvZHtfX3NldHN0YXRlX199LCBhbmQKLVxtZXRob2R7X19nZXRuZXdhcmdzX199LiAgQ29uc3VsdCBccGVwezMwN30gZm9yIHRoZSBmdWxsIHNlbWFudGljcyAKLW9mIHRoZXNlIG1ldGhvZHMuCi0KLUFzIGEgd2F5IHRvIGNvbXByZXNzIHBpY2tsZXMgeWV0IGZ1cnRoZXIsIGl0J3Mgbm93IHBvc3NpYmxlIHRvIHVzZQotaW50ZWdlciBjb2RlcyBpbnN0ZWFkIG9mIGxvbmcgc3RyaW5ncyB0byBpZGVudGlmeSBwaWNrbGVkIGNsYXNzZXMuCi1UaGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24gd2lsbCBtYWludGFpbiBhIGxpc3Qgb2Ygc3RhbmRhcmRpemVkCi1jb2RlczsgdGhlcmUncyBhbHNvIGEgcmFuZ2Ugb2YgY29kZXMgZm9yIHByaXZhdGUgdXNlLiAgQ3VycmVudGx5IG5vCi1jb2RlcyBoYXZlIGJlZW4gc3BlY2lmaWVkLgotCi1cYmVnaW57c2VlYWxzb30KLQotXHNlZXBlcHszMDd9e0V4dGVuc2lvbnMgdG8gdGhlIHBpY2tsZSBwcm90b2NvbH17V3JpdHRlbiBhbmQgaW1wbGVtZW50ZWQgCi1ieSBHdWlkbyB2YW4gUm9zc3VtIGFuZCBUaW0gUGV0ZXJzLn0KLQotXGVuZHtzZWVhbHNvfQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257RXh0ZW5kZWQgU2xpY2VzXGxhYmVse3NlY3Rpb24tc2xpY2VzfX0KLQotRXZlciBzaW5jZSBQeXRob24gMS40LCB0aGUgc2xpY2luZyBzeW50YXggaGFzIHN1cHBvcnRlZCBhbiBvcHRpb25hbAotdGhpcmQgYGBzdGVwJycgb3IgYGBzdHJpZGUnJyBhcmd1bWVudC4gIEZvciBleGFtcGxlLCB0aGVzZSBhcmUgYWxsCi1sZWdhbCBQeXRob24gc3ludGF4OiBcY29kZXtMWzE6MTA6Ml19LCBcY29kZXtMWzotMToxXX0sCi1cY29kZXtMWzo6LTFdfS4gIFRoaXMgd2FzIGFkZGVkIHRvIFB5dGhvbiBhdCB0aGUgcmVxdWVzdCBvZgotdGhlIGRldmVsb3BlcnMgb2YgTnVtZXJpY2FsIFB5dGhvbiwgd2hpY2ggdXNlcyB0aGUgdGhpcmQgYXJndW1lbnQKLWV4dGVuc2l2ZWx5LiAgSG93ZXZlciwgUHl0aG9uJ3MgYnVpbHQtaW4gbGlzdCwgdHVwbGUsIGFuZCBzdHJpbmcKLXNlcXVlbmNlIHR5cGVzIGhhdmUgbmV2ZXIgc3VwcG9ydGVkIHRoaXMgZmVhdHVyZSwgcmFpc2luZyBhCi1cZXhjZXB0aW9ue1R5cGVFcnJvcn0gaWYgeW91IHRyaWVkIGl0LiAgTWljaGFlbCBIdWRzb24gY29udHJpYnV0ZWQgYQotcGF0Y2ggdG8gZml4IHRoaXMgc2hvcnRjb21pbmcuCi0KLUZvciBleGFtcGxlLCB5b3UgY2FuIG5vdyBlYXNpbHkgZXh0cmFjdCB0aGUgZWxlbWVudHMgb2YgYSBsaXN0IHRoYXQKLWhhdmUgZXZlbiBpbmRleGVzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gTCA9IHJhbmdlKDEwKQotPj4+IExbOjoyXQotWzAsIDIsIDQsIDYsIDhdCi1cZW5ke3ZlcmJhdGltfQotCi1OZWdhdGl2ZSB2YWx1ZXMgYWxzbyB3b3JrIHRvIG1ha2UgYSBjb3B5IG9mIHRoZSBzYW1lIGxpc3QgaW4gcmV2ZXJzZQotb3JkZXI6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBMWzo6LTFdCi1bOSwgOCwgNywgNiwgNSwgNCwgMywgMiwgMSwgMF0KLVxlbmR7dmVyYmF0aW19Ci0KLVRoaXMgYWxzbyB3b3JrcyBmb3IgdHVwbGVzLCBhcnJheXMsIGFuZCBzdHJpbmdzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gcz0nYWJjZCcKLT4+PiBzWzo6Ml0KLSdhYycKLT4+PiBzWzo6LTFdCi0nZGNiYScKLVxlbmR7dmVyYmF0aW19Ci0KLUlmIHlvdSBoYXZlIGEgbXV0YWJsZSBzZXF1ZW5jZSBzdWNoIGFzIGEgbGlzdCBvciBhbiBhcnJheSB5b3UgY2FuCi1hc3NpZ24gdG8gb3IgZGVsZXRlIGFuIGV4dGVuZGVkIHNsaWNlLCBidXQgdGhlcmUgYXJlIHNvbWUgZGlmZmVyZW5jZXMKLWJldHdlZW4gYXNzaWdubWVudCB0byBleHRlbmRlZCBhbmQgcmVndWxhciBzbGljZXMuICBBc3NpZ25tZW50IHRvIGEKLXJlZ3VsYXIgc2xpY2UgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gYSA9IHJhbmdlKDMpCi0+Pj4gYQotWzAsIDEsIDJdCi0+Pj4gYVsxOjNdID0gWzQsIDUsIDZdCi0+Pj4gYQotWzAsIDQsIDUsIDZdCi1cZW5ke3ZlcmJhdGltfQotCi1FeHRlbmRlZCBzbGljZXMgYXJlbid0IHRoaXMgZmxleGlibGUuICBXaGVuIGFzc2lnbmluZyB0byBhbiBleHRlbmRlZAotc2xpY2UsIHRoZSBsaXN0IG9uIHRoZSByaWdodCBoYW5kIHNpZGUgb2YgdGhlIHN0YXRlbWVudCBtdXN0IGNvbnRhaW4KLXRoZSBzYW1lIG51bWJlciBvZiBpdGVtcyBhcyB0aGUgc2xpY2UgaXQgaXMgcmVwbGFjaW5nOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gYSA9IHJhbmdlKDQpCi0+Pj4gYQotWzAsIDEsIDIsIDNdCi0+Pj4gYVs6OjJdCi1bMCwgMl0KLT4+PiBhWzo6Ml0gPSBbMCwgLTFdCi0+Pj4gYQotWzAsIDEsIC0xLCAzXQotPj4+IGFbOjoyXSA9IFswLDEsMl0KLVRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLSAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwotVmFsdWVFcnJvcjogYXR0ZW1wdCB0byBhc3NpZ24gc2VxdWVuY2Ugb2Ygc2l6ZSAzIHRvIGV4dGVuZGVkIHNsaWNlIG9mIHNpemUgMgotXGVuZHt2ZXJiYXRpbX0KLQotRGVsZXRpb24gaXMgbW9yZSBzdHJhaWdodGZvcndhcmQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBhID0gcmFuZ2UoNCkKLT4+PiBhCi1bMCwgMSwgMiwgM10KLT4+PiBhWzo6Ml0KLVswLCAyXQotPj4+IGRlbCBhWzo6Ml0KLT4+PiBhCi1bMSwgM10KLVxlbmR7dmVyYmF0aW19Ci0KLU9uZSBjYW4gYWxzbyBub3cgcGFzcyBzbGljZSBvYmplY3RzIHRvIHRoZQotXG1ldGhvZHtfX2dldGl0ZW1fX30gbWV0aG9kcyBvZiB0aGUgYnVpbHQtaW4gc2VxdWVuY2VzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gcmFuZ2UoMTApLl9fZ2V0aXRlbV9fKHNsaWNlKDAsIDUsIDIpKQotWzAsIDIsIDRdCi1cZW5ke3ZlcmJhdGltfQotCi1PciB1c2Ugc2xpY2Ugb2JqZWN0cyBkaXJlY3RseSBpbiBzdWJzY3JpcHRzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gcmFuZ2UoMTApW3NsaWNlKDAsIDUsIDIpXQotWzAsIDIsIDRdCi1cZW5ke3ZlcmJhdGltfQotCi1UbyBzaW1wbGlmeSBpbXBsZW1lbnRpbmcgc2VxdWVuY2VzIHRoYXQgc3VwcG9ydCBleHRlbmRlZCBzbGljaW5nLAotc2xpY2Ugb2JqZWN0cyBub3cgaGF2ZSBhIG1ldGhvZCBcbWV0aG9ke2luZGljZXMoXHZhcntsZW5ndGh9KX0gd2hpY2gsCi1naXZlbiB0aGUgbGVuZ3RoIG9mIGEgc2VxdWVuY2UsIHJldHVybnMgYSBcY29kZXsoXHZhcntzdGFydH0sCi1cdmFye3N0b3B9LCBcdmFye3N0ZXB9KX0gdHVwbGUgdGhhdCBjYW4gYmUgcGFzc2VkIGRpcmVjdGx5IHRvCi1cZnVuY3Rpb257cmFuZ2UoKX0uCi1cbWV0aG9ke2luZGljZXMoKX0gaGFuZGxlcyBvbWl0dGVkIGFuZCBvdXQtb2YtYm91bmRzIGluZGljZXMgaW4gYQotbWFubmVyIGNvbnNpc3RlbnQgd2l0aCByZWd1bGFyIHNsaWNlcyAoYW5kIHRoaXMgaW5ub2N1b3VzIHBocmFzZSBoaWRlcwotYSB3ZWx0ZXIgb2YgY29uZnVzaW5nIGRldGFpbHMhKS4gIFRoZSBtZXRob2QgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZAotbGlrZSB0aGlzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1jbGFzcyBGYWtlU2VxOgotICAgIC4uLgotICAgIGRlZiBjYWxjX2l0ZW0oc2VsZiwgaSk6Ci0gICAgICAgIC4uLgotICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpdGVtKToKLSAgICAgICAgaWYgaXNpbnN0YW5jZShpdGVtLCBzbGljZSk6Ci0gICAgICAgICAgICBpbmRpY2VzID0gaXRlbS5pbmRpY2VzKGxlbihzZWxmKSkKLSAgICAgICAgICAgIHJldHVybiBGYWtlU2VxKFtzZWxmLmNhbGNfaXRlbShpKSBmb3IgaSBpbiByYW5nZSgqaW5kaWNlcyldKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FsY19pdGVtKGkpCi1cZW5ke3ZlcmJhdGltfQotCi1Gcm9tIHRoaXMgZXhhbXBsZSB5b3UgY2FuIGFsc28gc2VlIHRoYXQgdGhlIGJ1aWx0LWluIFxjbGFzc3tzbGljZX0KLW9iamVjdCBpcyBub3cgdGhlIHR5cGUgb2JqZWN0IGZvciB0aGUgc2xpY2UgdHlwZSwgYW5kIGlzIG5vIGxvbmdlciBhCi1mdW5jdGlvbi4gIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoIFB5dGhvbiAyLjIsIHdoZXJlIFxjbGFzc3tpbnR9LAotXGNsYXNze3N0cn0sIGV0Yy4sIHVuZGVyd2VudCB0aGUgc2FtZSBjaGFuZ2UuCi0KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue090aGVyIExhbmd1YWdlIENoYW5nZXN9Ci0KLUhlcmUgYXJlIGFsbCBvZiB0aGUgY2hhbmdlcyB0aGF0IFB5dGhvbiAyLjMgbWFrZXMgdG8gdGhlIGNvcmUgUHl0aG9uCi1sYW5ndWFnZS4KLQotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSBUaGUgXGtleXdvcmR7eWllbGR9IHN0YXRlbWVudCBpcyBub3cgYWx3YXlzIGEga2V5d29yZCwgYXMKLWRlc2NyaWJlZCBpbiBzZWN0aW9uflxyZWZ7c2VjdGlvbi1nZW5lcmF0b3JzfSBvZiB0aGlzIGRvY3VtZW50LgotCi1caXRlbSBBIG5ldyBidWlsdC1pbiBmdW5jdGlvbiBcZnVuY3Rpb257ZW51bWVyYXRlKCl9Ci13YXMgYWRkZWQsIGFzIGRlc2NyaWJlZCBpbiBzZWN0aW9uflxyZWZ7c2VjdGlvbi1lbnVtZXJhdGV9IG9mIHRoaXMKLWRvY3VtZW50LgotCi1caXRlbSBUd28gbmV3IGNvbnN0YW50cywgXGNvbnN0YW50e1RydWV9IGFuZCBcY29uc3RhbnR7RmFsc2V9IHdlcmUKLWFkZGVkIGFsb25nIHdpdGggdGhlIGJ1aWx0LWluIFxjbGFzc3tib29sfSB0eXBlLCBhcyBkZXNjcmliZWQgaW4KLXNlY3Rpb25+XHJlZntzZWN0aW9uLWJvb2x9IG9mIHRoaXMgZG9jdW1lbnQuCi0KLVxpdGVtIFRoZSBcZnVuY3Rpb257aW50KCl9IHR5cGUgY29uc3RydWN0b3Igd2lsbCBub3cgcmV0dXJuIGEgbG9uZwotaW50ZWdlciBpbnN0ZWFkIG9mIHJhaXNpbmcgYW4gXGV4Y2VwdGlvbntPdmVyZmxvd0Vycm9yfSB3aGVuIGEgc3RyaW5nCi1vciBmbG9hdGluZy1wb2ludCBudW1iZXIgaXMgdG9vIGxhcmdlIHRvIGZpdCBpbnRvIGFuIGludGVnZXIuICBUaGlzCi1jYW4gbGVhZCB0byB0aGUgcGFyYWRveGljYWwgcmVzdWx0IHRoYXQKLVxjb2Rle2lzaW5zdGFuY2UoaW50KFx2YXJ7ZXhwcmVzc2lvbn0pLCBpbnQpfSBpcyBmYWxzZSwgYnV0IHRoYXQgc2VlbXMKLXVubGlrZWx5IHRvIGNhdXNlIHByb2JsZW1zIGluIHByYWN0aWNlLgotCi1caXRlbSBCdWlsdC1pbiB0eXBlcyBub3cgc3VwcG9ydCB0aGUgZXh0ZW5kZWQgc2xpY2luZyBzeW50YXgsCi1hcyBkZXNjcmliZWQgaW4gc2VjdGlvbn5ccmVme3NlY3Rpb24tc2xpY2VzfSBvZiB0aGlzIGRvY3VtZW50LgotCi1caXRlbSBBIG5ldyBidWlsdC1pbiBmdW5jdGlvbiwgXGZ1bmN0aW9ue3N1bShcdmFye2l0ZXJhYmxlfSwgXHZhcntzdGFydH09MCl9LCAKLWFkZHMgdXAgdGhlIG51bWVyaWMgaXRlbXMgaW4gdGhlIGl0ZXJhYmxlIG9iamVjdCBhbmQgcmV0dXJucyB0aGVpciBzdW0uIAotXGZ1bmN0aW9ue3N1bSgpfSBvbmx5IGFjY2VwdHMgbnVtYmVycywgbWVhbmluZyB0aGF0IHlvdSBjYW4ndCB1c2UgaXQKLXRvIGNvbmNhdGVuYXRlIGEgYnVuY2ggb2Ygc3RyaW5ncy4gICAoQ29udHJpYnV0ZWQgYnkgQWxleAotTWFydGVsbGkuKQotCi1caXRlbSBcY29kZXtsaXN0Lmluc2VydChcdmFye3Bvc30sIFx2YXJ7dmFsdWV9KX0gdXNlZCB0byAKLWluc2VydCBcdmFye3ZhbHVlfSBhdCB0aGUgZnJvbnQgb2YgdGhlIGxpc3Qgd2hlbiBcdmFye3Bvc30gd2FzCi1uZWdhdGl2ZS4gIFRoZSBiZWhhdmlvdXIgaGFzIG5vdyBiZWVuIGNoYW5nZWQgdG8gYmUgY29uc2lzdGVudCB3aXRoCi1zbGljZSBpbmRleGluZywgc28gd2hlbiBcdmFye3Bvc30gaXMgLTEgdGhlIHZhbHVlIHdpbGwgYmUgaW5zZXJ0ZWQKLWJlZm9yZSB0aGUgbGFzdCBlbGVtZW50LCBhbmQgc28gZm9ydGguCi0KLVxpdGVtIFxjb2Rle2xpc3QuaW5kZXgoXHZhcnt2YWx1ZX0pfSwgd2hpY2ggc2VhcmNoZXMgZm9yIFx2YXJ7dmFsdWV9IAotd2l0aGluIHRoZSBsaXN0IGFuZCByZXR1cm5zIGl0cyBpbmRleCwgbm93IHRha2VzIG9wdGlvbmFsIAotXHZhcntzdGFydH0gYW5kIFx2YXJ7c3RvcH0gYXJndW1lbnRzIHRvIGxpbWl0IHRoZSBzZWFyY2ggdG8gCi1vbmx5IHBhcnQgb2YgdGhlIGxpc3QuCi0KLVxpdGVtIERpY3Rpb25hcmllcyBoYXZlIGEgbmV3IG1ldGhvZCwgXG1ldGhvZHtwb3AoXHZhcntrZXl9XG9wdGlvbmFseywKLVx2YXJ7ZGVmYXVsdH19KX0sIHRoYXQgcmV0dXJucyB0aGUgdmFsdWUgY29ycmVzcG9uZGluZyB0byBcdmFye2tleX0KLWFuZCByZW1vdmVzIHRoYXQga2V5L3ZhbHVlIHBhaXIgZnJvbSB0aGUgZGljdGlvbmFyeS4gIElmIHRoZSByZXF1ZXN0ZWQKLWtleSBpc24ndCBwcmVzZW50IGluIHRoZSBkaWN0aW9uYXJ5LCBcdmFye2RlZmF1bHR9IGlzIHJldHVybmVkIGlmIGl0J3MKLXNwZWNpZmllZCBhbmQgXGV4Y2VwdGlvbntLZXlFcnJvcn0gcmFpc2VkIGlmIGl0IGlzbid0LgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZCA9IHsxOjJ9Ci0+Pj4gZAotezE6IDJ9Ci0+Pj4gZC5wb3AoNCkKLVRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLSAgRmlsZSAic3RkaW4iLCBsaW5lIDEsIGluID8KLUtleUVycm9yOiA0Ci0+Pj4gZC5wb3AoMSkKLTIKLT4+PiBkLnBvcCgxKQotVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICBGaWxlICJzdGRpbiIsIGxpbmUgMSwgaW4gPwotS2V5RXJyb3I6ICdwb3AoKTogZGljdGlvbmFyeSBpcyBlbXB0eScKLT4+PiBkCi17fQotPj4+Ci1cZW5ke3ZlcmJhdGltfQotCi1UaGVyZSdzIGFsc28gYSBuZXcgY2xhc3MgbWV0aG9kLCAKLVxtZXRob2R7ZGljdC5mcm9ta2V5cyhcdmFye2l0ZXJhYmxlfSwgXHZhcnt2YWx1ZX0pfSwgdGhhdCAKLWNyZWF0ZXMgYSBkaWN0aW9uYXJ5IHdpdGgga2V5cyB0YWtlbiBmcm9tIHRoZSBzdXBwbGllZCBpdGVyYXRvcgotXHZhcntpdGVyYWJsZX0gYW5kIGFsbCB2YWx1ZXMgc2V0IHRvIFx2YXJ7dmFsdWV9LCBkZWZhdWx0aW5nIHRvCi1cY29kZXtOb25lfS4gIAotCi0oUGF0Y2hlcyBjb250cmlidXRlZCBieSBSYXltb25kIEhldHRpbmdlci4pCi0KLUFsc28sIHRoZSBcZnVuY3Rpb257ZGljdCgpfSBjb25zdHJ1Y3RvciBub3cgYWNjZXB0cyBrZXl3b3JkIGFyZ3VtZW50cyB0bwotc2ltcGxpZnkgY3JlYXRpbmcgc21hbGwgZGljdGlvbmFyaWVzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZGljdChyZWQ9MSwgYmx1ZT0yLCBncmVlbj0zLCBibGFjaz00KQoteydibHVlJzogMiwgJ2JsYWNrJzogNCwgJ2dyZWVuJzogMywgJ3JlZCc6IDF9ICAgIAotXGVuZHt2ZXJiYXRpbX0KLQotKENvbnRyaWJ1dGVkIGJ5IEp1c3QgdmFuflJvc3N1bS4pICAgICAgIAotCi1caXRlbSBUaGUgXGtleXdvcmR7YXNzZXJ0fSBzdGF0ZW1lbnQgbm8gbG9uZ2VyIGNoZWNrcyB0aGUgXGNvZGV7X19kZWJ1Z19ffQotZmxhZywgc28geW91IGNhbiBubyBsb25nZXIgZGlzYWJsZSBhc3NlcnRpb25zIGJ5IGFzc2lnbmluZyB0byBcY29kZXtfX2RlYnVnX199LgotUnVubmluZyBQeXRob24gd2l0aCB0aGUgXHByb2dyYW1vcHR7LU99IHN3aXRjaCB3aWxsIHN0aWxsIGdlbmVyYXRlCi1jb2RlIHRoYXQgZG9lc24ndCBleGVjdXRlIGFueSBhc3NlcnRpb25zLgotCi1caXRlbSBNb3N0IHR5cGUgb2JqZWN0cyBhcmUgbm93IGNhbGxhYmxlLCBzbyB5b3UgY2FuIHVzZSB0aGVtCi10byBjcmVhdGUgbmV3IG9iamVjdHMgc3VjaCBhcyBmdW5jdGlvbnMsIGNsYXNzZXMsIGFuZCBtb2R1bGVzLiAgKFRoaXMKLW1lYW5zIHRoYXQgdGhlIFxtb2R1bGV7bmV3fSBtb2R1bGUgY2FuIGJlIGRlcHJlY2F0ZWQgaW4gYSBmdXR1cmUKLVB5dGhvbiB2ZXJzaW9uLCBiZWNhdXNlIHlvdSBjYW4gbm93IHVzZSB0aGUgdHlwZSBvYmplY3RzIGF2YWlsYWJsZSBpbgotdGhlIFxtb2R1bGV7dHlwZXN9IG1vZHVsZS4pCi0lIFhYWCBzaG91bGQgbmV3LnB5IHVzZSBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nPwotRm9yIGV4YW1wbGUsIHlvdSBjYW4gY3JlYXRlIGEgbmV3IG1vZHVsZSBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIGNvZGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgdHlwZXMKLT4+PiBtID0gdHlwZXMuTW9kdWxlVHlwZSgnYWJjJywnZG9jc3RyaW5nJykKLT4+PiBtCi08bW9kdWxlICdhYmMnIChidWlsdC1pbik+Ci0+Pj4gbS5fX2RvY19fCi0nZG9jc3RyaW5nJwotXGVuZHt2ZXJiYXRpbX0KLQotXGl0ZW0KLUEgbmV3IHdhcm5pbmcsIFxleGNlcHRpb257UGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZ30gd2FzIGFkZGVkIHRvCi1pbmRpY2F0ZSBmZWF0dXJlcyB3aGljaCBhcmUgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcKLWRlcHJlY2F0ZWQuICBUaGUgd2FybmluZyB3aWxsIFxlbXBoe25vdH0gYmUgcHJpbnRlZCBieSBkZWZhdWx0LiAgVG8KLWNoZWNrIGZvciB1c2Ugb2YgZmVhdHVyZXMgdGhhdCB3aWxsIGJlIGRlcHJlY2F0ZWQgaW4gdGhlIGZ1dHVyZSwKLXN1cHBseSBccHJvZ3JhbW9wdHstV2Fsd2F5czo6UGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZzo6fSBvbiB0aGUKLWNvbW1hbmQgbGluZSBvciB1c2UgXGZ1bmN0aW9ue3dhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCl9LgotCi1caXRlbSBUaGUgcHJvY2VzcyBvZiBkZXByZWNhdGluZyBzdHJpbmctYmFzZWQgZXhjZXB0aW9ucywgYXMKLWluIFxjb2Rle3JhaXNlICJFcnJvciBvY2N1cnJlZCJ9LCBoYXMgYmVndW4uICBSYWlzaW5nIGEgc3RyaW5nIHdpbGwKLW5vdyB0cmlnZ2VyIFxleGNlcHRpb257UGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZ30uCi0KLVxpdGVtIFVzaW5nIFxjb2Rle05vbmV9IGFzIGEgdmFyaWFibGUgbmFtZSB3aWxsIG5vdyByZXN1bHQgaW4gYQotXGV4Y2VwdGlvbntTeW50YXhXYXJuaW5nfSB3YXJuaW5nLiAgSW4gYSBmdXR1cmUgdmVyc2lvbiBvZiBQeXRob24sCi1cY29kZXtOb25lfSBtYXkgZmluYWxseSBiZWNvbWUgYSBrZXl3b3JkLgotCi1caXRlbSBUaGUgXG1ldGhvZHt4cmVhZGxpbmVzKCl9IG1ldGhvZCBvZiBmaWxlIG9iamVjdHMsIGludHJvZHVjZWQgaW4KLVB5dGhvbiAyLjEsIGlzIG5vIGxvbmdlciBuZWNlc3NhcnkgYmVjYXVzZSBmaWxlcyBub3cgYmVoYXZlIGFzIHRoZWlyCi1vd24gaXRlcmF0b3IuICBcbWV0aG9ke3hyZWFkbGluZXMoKX0gd2FzIG9yaWdpbmFsbHkgaW50cm9kdWNlZCBhcyBhCi1mYXN0ZXIgd2F5IHRvIGxvb3Agb3ZlciBhbGwgdGhlIGxpbmVzIGluIGEgZmlsZSwgYnV0IG5vdyB5b3UgY2FuCi1zaW1wbHkgd3JpdGUgXGNvZGV7Zm9yIGxpbmUgaW4gZmlsZV9vYmp9LiAgRmlsZSBvYmplY3RzIGFsc28gaGF2ZSBhCi1uZXcgcmVhZC1vbmx5IFxtZW1iZXJ7ZW5jb2Rpbmd9IGF0dHJpYnV0ZSB0aGF0IGdpdmVzIHRoZSBlbmNvZGluZyB1c2VkCi1ieSB0aGUgZmlsZTsgVW5pY29kZSBzdHJpbmdzIHdyaXR0ZW4gdG8gdGhlIGZpbGUgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IAotY29udmVydGVkIHRvIGJ5dGVzIHVzaW5nIHRoZSBnaXZlbiBlbmNvZGluZy4KLQotXGl0ZW0gVGhlIG1ldGhvZCByZXNvbHV0aW9uIG9yZGVyIHVzZWQgYnkgbmV3LXN0eWxlIGNsYXNzZXMgaGFzCi1jaGFuZ2VkLCB0aG91Z2ggeW91J2xsIG9ubHkgbm90aWNlIHRoZSBkaWZmZXJlbmNlIGlmIHlvdSBoYXZlIGEgcmVhbGx5Ci1jb21wbGljYXRlZCBpbmhlcml0YW5jZSBoaWVyYXJjaHkuICBDbGFzc2ljIGNsYXNzZXMgYXJlIHVuYWZmZWN0ZWQgYnkKLXRoaXMgY2hhbmdlLiAgUHl0aG9uIDIuMiBvcmlnaW5hbGx5IHVzZWQgYSB0b3BvbG9naWNhbCBzb3J0IG9mIGEKLWNsYXNzJ3MgYW5jZXN0b3JzLCBidXQgMi4zIG5vdyB1c2VzIHRoZSBDMyBhbGdvcml0aG0gYXMgZGVzY3JpYmVkIGluCi10aGUgcGFwZXIgXHVsaW5re2BgQSBNb25vdG9uaWMgU3VwZXJjbGFzcyBMaW5lYXJpemF0aW9uIGZvcgotRHlsYW4nJ317aHR0cDovL3d3dy53ZWJjb20uY29tL2hhYWhyL2R5bGFuL2xpbmVhcml6YXRpb24tb29wc2xhOTYuaHRtbH0uCi1UbyB1bmRlcnN0YW5kIHRoZSBtb3RpdmF0aW9uIGZvciB0aGlzIGNoYW5nZSwgCi1yZWFkIE1pY2hlbGUgU2ltaW9uYXRvJ3MgYXJ0aWNsZSAKLVx1bGlua3tgYFB5dGhvbiAyLjMgTWV0aG9kIFJlc29sdXRpb24gT3JkZXInJ30KLSAgICAgIHtodHRwOi8vd3d3LnB5dGhvbi5vcmcvMi4zL21yby5odG1sfSwgb3IKLXJlYWQgdGhlIHRocmVhZCBvbiBweXRob24tZGV2IHN0YXJ0aW5nIHdpdGggdGhlIG1lc3NhZ2UgYXQKLVx1cmx7aHR0cDovL21haWwucHl0aG9uLm9yZy9waXBlcm1haWwvcHl0aG9uLWRldi8yMDAyLU9jdG9iZXIvMDI5MDM1Lmh0bWx9LgotU2FtdWVsZSBQZWRyb25pIGZpcnN0IHBvaW50ZWQgb3V0IHRoZSBwcm9ibGVtIGFuZCBhbHNvIGltcGxlbWVudGVkIHRoZQotZml4IGJ5IGNvZGluZyB0aGUgQzMgYWxnb3JpdGhtLgotCi1caXRlbSBQeXRob24gcnVucyBtdWx0aXRocmVhZGVkIHByb2dyYW1zIGJ5IHN3aXRjaGluZyBiZXR3ZWVuIHRocmVhZHMKLWFmdGVyIGV4ZWN1dGluZyBOIGJ5dGVjb2Rlcy4gIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBOIGhhcyBiZWVuCi1pbmNyZWFzZWQgZnJvbSAxMCB0byAxMDAgYnl0ZWNvZGVzLCBzcGVlZGluZyB1cCBzaW5nbGUtdGhyZWFkZWQKLWFwcGxpY2F0aW9ucyBieSByZWR1Y2luZyB0aGUgc3dpdGNoaW5nIG92ZXJoZWFkLiAgU29tZSBtdWx0aXRocmVhZGVkCi1hcHBsaWNhdGlvbnMgbWF5IHN1ZmZlciBzbG93ZXIgcmVzcG9uc2UgdGltZSwgYnV0IHRoYXQncyBlYXNpbHkgZml4ZWQKLWJ5IHNldHRpbmcgdGhlIGxpbWl0IGJhY2sgdG8gYSBsb3dlciBudW1iZXIgdXNpbmcKLVxmdW5jdGlvbntzeXMuc2V0Y2hlY2tpbnRlcnZhbChcdmFye059KX0uCi1UaGUgbGltaXQgY2FuIGJlIHJldHJpZXZlZCB3aXRoIHRoZSBuZXcgCi1cZnVuY3Rpb257c3lzLmdldGNoZWNraW50ZXJ2YWwoKX0gZnVuY3Rpb24uCi0KLVxpdGVtIE9uZSBtaW5vciBidXQgZmFyLXJlYWNoaW5nIGNoYW5nZSBpcyB0aGF0IHRoZSBuYW1lcyBvZiBleHRlbnNpb24KLXR5cGVzIGRlZmluZWQgYnkgdGhlIG1vZHVsZXMgaW5jbHVkZWQgd2l0aCBQeXRob24gbm93IGNvbnRhaW4gdGhlCi1tb2R1bGUgYW5kIGEgXGNoYXJhY3RlcnsufSBpbiBmcm9udCBvZiB0aGUgdHlwZSBuYW1lLiAgRm9yIGV4YW1wbGUsIGluCi1QeXRob24gMi4yLCBpZiB5b3UgY3JlYXRlZCBhIHNvY2tldCBhbmQgcHJpbnRlZCBpdHMKLVxtZW1iZXJ7X19jbGFzc19ffSwgeW91J2QgZ2V0IHRoaXMgb3V0cHV0OgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gcyA9IHNvY2tldC5zb2NrZXQoKQotPj4+IHMuX19jbGFzc19fCi08dHlwZSAnc29ja2V0Jz4KLVxlbmR7dmVyYmF0aW19Ci0KLUluIDIuMywgeW91IGdldCB0aGlzOgotXGJlZ2lue3ZlcmJhdGltfQotPj4+IHMuX19jbGFzc19fCi08dHlwZSAnX3NvY2tldC5zb2NrZXQnPgotXGVuZHt2ZXJiYXRpbX0KLQotXGl0ZW0gT25lIG9mIHRoZSBub3RlZCBpbmNvbXBhdGliaWxpdGllcyBiZXR3ZWVuIG9sZC0gYW5kIG5ldy1zdHlsZQotICBjbGFzc2VzIGhhcyBiZWVuIHJlbW92ZWQ6IHlvdSBjYW4gbm93IGFzc2lnbiB0byB0aGUKLSAgXG1lbWJlcntfX25hbWVfX30gYW5kIFxtZW1iZXJ7X19iYXNlc19ffSBhdHRyaWJ1dGVzIG9mIG5ldy1zdHlsZQotICBjbGFzc2VzLiAgVGhlcmUgYXJlIHNvbWUgcmVzdHJpY3Rpb25zIG9uIHdoYXQgY2FuIGJlIGFzc2lnbmVkIHRvCi0gIFxtZW1iZXJ7X19iYXNlc19ffSBhbG9uZyB0aGUgbGluZXMgb2YgdGhvc2UgcmVsYXRpbmcgdG8gYXNzaWduaW5nIHRvCi0gIGFuIGluc3RhbmNlJ3MgXG1lbWJlcntfX2NsYXNzX199IGF0dHJpYnV0ZS4KLQotXGVuZHtpdGVtaXplfQotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc3Vic2VjdGlvbntTdHJpbmcgQ2hhbmdlc30KLQotXGJlZ2lue2l0ZW1pemV9Ci0KLVxpdGVtIFRoZSBca2V5d29yZHtpbn0gb3BlcmF0b3Igbm93IHdvcmtzIGRpZmZlcmVudGx5IGZvciBzdHJpbmdzLgotUHJldmlvdXNseSwgd2hlbiBldmFsdWF0aW5nIFxjb2Rle1x2YXJ7WH0gaW4gXHZhcntZfX0gd2hlcmUgXHZhcntYfQotYW5kIFx2YXJ7WX0gYXJlIHN0cmluZ3MsIFx2YXJ7WH0gY291bGQgb25seSBiZSBhIHNpbmdsZSBjaGFyYWN0ZXIuCi1UaGF0J3Mgbm93IGNoYW5nZWQ7IFx2YXJ7WH0gY2FuIGJlIGEgc3RyaW5nIG9mIGFueSBsZW5ndGgsIGFuZAotXGNvZGV7XHZhcntYfSBpbiBcdmFye1l9fSB3aWxsIHJldHVybiBcY29uc3RhbnR7VHJ1ZX0gaWYgXHZhcntYfSBpcyBhCi1zdWJzdHJpbmcgb2YgXHZhcntZfS4gIElmIFx2YXJ7WH0gaXMgdGhlIGVtcHR5IHN0cmluZywgdGhlIHJlc3VsdCBpcwotYWx3YXlzIFxjb25zdGFudHtUcnVlfS4KLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+ICdhYicgaW4gJ2FiY2QnCi1UcnVlCi0+Pj4gJ2FkJyBpbiAnYWJjZCcKLUZhbHNlCi0+Pj4gJycgaW4gJ2FiY2QnCi1UcnVlCi1cZW5ke3ZlcmJhdGltfQotCi1Ob3RlIHRoYXQgdGhpcyBkb2Vzbid0IHRlbGwgeW91IHdoZXJlIHRoZSBzdWJzdHJpbmcgc3RhcnRzOyBpZiB5b3UKLW5lZWQgdGhhdCBpbmZvcm1hdGlvbiwgdXNlIHRoZSBcbWV0aG9ke2ZpbmQoKX0gc3RyaW5nIG1ldGhvZC4KLQotXGl0ZW0gVGhlIFxtZXRob2R7c3RyaXAoKX0sIFxtZXRob2R7bHN0cmlwKCl9LCBhbmQgXG1ldGhvZHtyc3RyaXAoKX0KLXN0cmluZyBtZXRob2RzIG5vdyBoYXZlIGFuIG9wdGlvbmFsIGFyZ3VtZW50IGZvciBzcGVjaWZ5aW5nIHRoZQotY2hhcmFjdGVycyB0byBzdHJpcC4gIFRoZSBkZWZhdWx0IGlzIHN0aWxsIHRvIHJlbW92ZSBhbGwgd2hpdGVzcGFjZQotY2hhcmFjdGVyczoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+ICcgICBhYmMgJy5zdHJpcCgpCi0nYWJjJwotPj4+ICc+PD48YWJjPD48Pjw+Jy5zdHJpcCgnPD4nKQotJ2FiYycKLT4+PiAnPjw+PGFiYzw+PD48PlxuJy5zdHJpcCgnPD4nKQotJ2FiYzw+PD48PlxuJwotPj4+IHUnXHU0MDAwXHU0MDAxYWJjXHU0MDAwJy5zdHJpcCh1J1x1NDAwMCcpCi11J1x1NDAwMWFiYycKLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotKFN1Z2dlc3RlZCBieSBTaW1vbiBCcnVubmluZyBhbmQgaW1wbGVtZW50ZWQgYnkgV2FsdGVyIERcIm9yd2FsZC4pCi0KLVxpdGVtIFRoZSBcbWV0aG9ke3N0YXJ0c3dpdGgoKX0gYW5kIFxtZXRob2R7ZW5kc3dpdGgoKX0KLXN0cmluZyBtZXRob2RzIG5vdyBhY2NlcHQgbmVnYXRpdmUgbnVtYmVycyBmb3IgdGhlIFx2YXJ7c3RhcnR9IGFuZCBcdmFye2VuZH0KLXBhcmFtZXRlcnMuCi0KLVxpdGVtIEFub3RoZXIgbmV3IHN0cmluZyBtZXRob2QgaXMgXG1ldGhvZHt6ZmlsbCgpfSwgb3JpZ2luYWxseSBhCi1mdW5jdGlvbiBpbiB0aGUgXG1vZHVsZXtzdHJpbmd9IG1vZHVsZS4gIFxtZXRob2R7emZpbGwoKX0gcGFkcyBhCi1udW1lcmljIHN0cmluZyB3aXRoIHplcm9zIG9uIHRoZSBsZWZ0IHVudGlsIGl0J3MgdGhlIHNwZWNpZmllZCB3aWR0aC4KLU5vdGUgdGhhdCB0aGUgXGNvZGV7XCV9IG9wZXJhdG9yIGlzIHN0aWxsIG1vcmUgZmxleGlibGUgYW5kIHBvd2VyZnVsCi10aGFuIFxtZXRob2R7emZpbGwoKX0uCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiAnNDUnLnpmaWxsKDQpCi0nMDA0NScKLT4+PiAnMTIzNDUnLnpmaWxsKDQpCi0nMTIzNDUnCi0+Pj4gJ2dvb2Z5Jy56ZmlsbCg2KQotJzBnb29meScKLVxlbmR7dmVyYmF0aW19Ci0KLShDb250cmlidXRlZCBieSBXYWx0ZXIgRFwib3J3YWxkLikKLQotXGl0ZW0gQSBuZXcgdHlwZSBvYmplY3QsIFxjbGFzc3tiYXNlc3RyaW5nfSwgaGFzIGJlZW4gYWRkZWQuCi0gICBCb3RoIDgtYml0IHN0cmluZ3MgYW5kIFVuaWNvZGUgc3RyaW5ncyBpbmhlcml0IGZyb20gdGhpcyB0eXBlLCBzbwotICAgXGNvZGV7aXNpbnN0YW5jZShvYmosIGJhc2VzdHJpbmcpfSB3aWxsIHJldHVybiBcY29uc3RhbnR7VHJ1ZX0gZm9yCi0gICBlaXRoZXIga2luZCBvZiBzdHJpbmcuICBJdCdzIGEgY29tcGxldGVseSBhYnN0cmFjdCB0eXBlLCBzbyB5b3UKLSAgIGNhbid0IGNyZWF0ZSBcY2xhc3N7YmFzZXN0cmluZ30gaW5zdGFuY2VzLgotCi1caXRlbSBJbnRlcm5lZCBzdHJpbmdzIGFyZSBubyBsb25nZXIgaW1tb3J0YWwgYW5kIHdpbGwgbm93IGJlCi1nYXJiYWdlLWNvbGxlY3RlZCBpbiB0aGUgdXN1YWwgd2F5IHdoZW4gdGhlIG9ubHkgcmVmZXJlbmNlIHRvIHRoZW0gaXMKLWZyb20gdGhlIGludGVybmFsIGRpY3Rpb25hcnkgb2YgaW50ZXJuZWQgc3RyaW5ncy4gIChJbXBsZW1lbnRlZCBieQotT3JlbiBUaXJvc2guKQotCi1cZW5ke2l0ZW1pemV9Ci0KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzdWJzZWN0aW9ue09wdGltaXphdGlvbnN9Ci0KLVxiZWdpbntpdGVtaXplfQotCi1caXRlbSBUaGUgY3JlYXRpb24gb2YgbmV3LXN0eWxlIGNsYXNzIGluc3RhbmNlcyBoYXMgYmVlbiBtYWRlIG11Y2gKLWZhc3RlcjsgdGhleSdyZSBub3cgZmFzdGVyIHRoYW4gY2xhc3NpYyBjbGFzc2VzIQotCi1caXRlbSBUaGUgXG1ldGhvZHtzb3J0KCl9IG1ldGhvZCBvZiBsaXN0IG9iamVjdHMgaGFzIGJlZW4gZXh0ZW5zaXZlbHkKLXJld3JpdHRlbiBieSBUaW0gUGV0ZXJzLCBhbmQgdGhlIGltcGxlbWVudGF0aW9uIGlzIHNpZ25pZmljYW50bHkKLWZhc3Rlci4KLQotXGl0ZW0gTXVsdGlwbGljYXRpb24gb2YgbGFyZ2UgbG9uZyBpbnRlZ2VycyBpcyBub3cgbXVjaCBmYXN0ZXIgdGhhbmtzCi10byBhbiBpbXBsZW1lbnRhdGlvbiBvZiBLYXJhdHN1YmEgbXVsdGlwbGljYXRpb24sIGFuIGFsZ29yaXRobSB0aGF0Ci1zY2FsZXMgYmV0dGVyIHRoYW4gdGhlIE8obipuKSByZXF1aXJlZCBmb3IgdGhlIGdyYWRlLXNjaG9vbAotbXVsdGlwbGljYXRpb24gYWxnb3JpdGhtLiAgKE9yaWdpbmFsIHBhdGNoIGJ5IENocmlzdG9waGVyIEEuIENyYWlnLAotYW5kIHNpZ25pZmljYW50bHkgcmV3b3JrZWQgYnkgVGltIFBldGVycy4pCi0KLVxpdGVtIFRoZSBcY29kZXtTRVRfTElORU5PfSBvcGNvZGUgaXMgbm93IGdvbmUuICBUaGlzIG1heSBwcm92aWRlIGEKLXNtYWxsIHNwZWVkIGluY3JlYXNlLCBkZXBlbmRpbmcgb24geW91ciBjb21waWxlcidzIGlkaW9zeW5jcmFzaWVzLgotU2VlIHNlY3Rpb25+XHJlZntzZWN0aW9uLW90aGVyfSBmb3IgYSBsb25nZXIgZXhwbGFuYXRpb24uCi0oUmVtb3ZlZCBieSBNaWNoYWVsIEh1ZHNvbi4pCi0KLVxpdGVtIFxmdW5jdGlvbnt4cmFuZ2UoKX0gb2JqZWN0cyBub3cgaGF2ZSB0aGVpciBvd24gaXRlcmF0b3IsIG1ha2luZwotXGNvZGV7Zm9yIGkgaW4geHJhbmdlKG4pfSBzbGlnaHRseSBmYXN0ZXIgdGhhbgotXGNvZGV7Zm9yIGkgaW4gcmFuZ2Uobil9LiAgKFBhdGNoIGJ5IFJheW1vbmQgSGV0dGluZ2VyLikKLQotXGl0ZW0gQSBudW1iZXIgb2Ygc21hbGwgcmVhcnJhbmdlbWVudHMgaGF2ZSBiZWVuIG1hZGUgaW4gdmFyaW91cwotaG90c3BvdHMgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSwgc3VjaCBhcyBpbmxpbmluZyBhIGZ1bmN0aW9uIG9yIHJlbW92aW5nCi1zb21lIGNvZGUuICAoSW1wbGVtZW50ZWQgbW9zdGx5IGJ5IEd2UiwgYnV0IGxvdHMgb2YgcGVvcGxlIGhhdmUKLWNvbnRyaWJ1dGVkIHNpbmdsZSBjaGFuZ2VzLikgICAgCi0KLVxlbmR7aXRlbWl6ZX0KLQotVGhlIG5ldCByZXN1bHQgb2YgdGhlIDIuMyBvcHRpbWl6YXRpb25zIGlzIHRoYXQgUHl0aG9uIDIuMyBydW5zIHRoZSAKLXB5c3RvbmUgYmVuY2htYXJrIGFyb3VuZCAyNVwlIGZhc3RlciB0aGFuIFB5dGhvbiAyLjIuCi0KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue05ldywgSW1wcm92ZWQsIGFuZCBEZXByZWNhdGVkIE1vZHVsZXN9Ci0KLUFzIHVzdWFsLCBQeXRob24ncyBzdGFuZGFyZCBsaWJyYXJ5IHJlY2VpdmVkIGEgbnVtYmVyIG9mIGVuaGFuY2VtZW50cyBhbmQKLWJ1ZyBmaXhlcy4gIEhlcmUncyBhIHBhcnRpYWwgbGlzdCBvZiB0aGUgbW9zdCBub3RhYmxlIGNoYW5nZXMsIHNvcnRlZAotYWxwaGFiZXRpY2FsbHkgYnkgbW9kdWxlIG5hbWUuIENvbnN1bHQgdGhlCi1cZmlsZXtNaXNjL05FV1N9IGZpbGUgaW4gdGhlIHNvdXJjZSB0cmVlIGZvciBhIG1vcmUKLWNvbXBsZXRlIGxpc3Qgb2YgY2hhbmdlcywgb3IgbG9vayB0aHJvdWdoIHRoZSBDVlMgbG9ncyBmb3IgYWxsIHRoZQotZGV0YWlscy4KLQotXGJlZ2lue2l0ZW1pemV9Ci0KLVxpdGVtIFRoZSBcbW9kdWxle2FycmF5fSBtb2R1bGUgbm93IHN1cHBvcnRzIGFycmF5cyBvZiBVbmljb2RlCi1jaGFyYWN0ZXJzIHVzaW5nIHRoZSBcY2hhcmFjdGVye3V9IGZvcm1hdCBjaGFyYWN0ZXIuICBBcnJheXMgYWxzbyBub3cKLXN1cHBvcnQgdXNpbmcgdGhlIFxjb2Rleys9fSBhc3NpZ25tZW50IG9wZXJhdG9yIHRvIGFkZCBhbm90aGVyIGFycmF5J3MKLWNvbnRlbnRzLCBhbmQgdGhlIFxjb2Rleyo9fSBhc3NpZ25tZW50IG9wZXJhdG9yIHRvIHJlcGVhdCBhbiBhcnJheS4KLShDb250cmlidXRlZCBieSBKYXNvbiBPcmVuZG9yZmYuKQotCi1caXRlbSBUaGUgXG1vZHVsZXtic2RkYn0gbW9kdWxlIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IHZlcnNpb24gNC4xLjYKLW9mIHRoZSBcdWxpbmt7UHlCU0REQn17aHR0cDovL3B5YnNkZGIuc291cmNlZm9yZ2UubmV0fSBwYWNrYWdlLAotcHJvdmlkaW5nIGEgbW9yZSBjb21wbGV0ZSBpbnRlcmZhY2UgdG8gdGhlIHRyYW5zYWN0aW9uYWwgZmVhdHVyZXMgb2YKLXRoZSBCZXJrZWxleURCIGxpYnJhcnkuCi0KLVRoZSBvbGQgdmVyc2lvbiBvZiB0aGUgbW9kdWxlIGhhcyBiZWVuIHJlbmFtZWQgdG8gCi1cbW9kdWxle2JzZGRiMTg1fSBhbmQgaXMgbm8gbG9uZ2VyIGJ1aWx0IGF1dG9tYXRpY2FsbHk7IHlvdSdsbCAKLWhhdmUgdG8gZWRpdCBcZmlsZXtNb2R1bGVzL1NldHVwfSB0byBlbmFibGUgaXQuICBOb3RlIHRoYXQgdGhlIG5ldwotXG1vZHVsZXtic2RkYn0gcGFja2FnZSBpcyBpbnRlbmRlZCB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlIAotb2xkIG1vZHVsZSwgc28gYmUgc3VyZSB0byBmaWxlIGJ1Z3MgaWYgeW91IGRpc2NvdmVyIGFueQotaW5jb21wYXRpYmlsaXRpZXMuICBXaGVuIHVwZ3JhZGluZyB0byBQeXRob24gMi4zLCBpZiB0aGUgbmV3IGludGVycHJldGVyIGlzIGNvbXBpbGVkCi13aXRoIGEgbmV3IHZlcnNpb24gb2YgCi10aGUgdW5kZXJseWluZyBCZXJrZWxleURCIGxpYnJhcnksIHlvdSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgaGF2ZSB0bwotY29udmVydCB5b3VyIGRhdGFiYXNlIGZpbGVzIHRvIHRoZSBuZXcgdmVyc2lvbi4gIFlvdSBjYW4gZG8gdGhpcwotZmFpcmx5IGVhc2lseSB3aXRoIHRoZSBuZXcgc2NyaXB0cyBcZmlsZXtkYjJwaWNrbGUucHl9IGFuZAotXGZpbGV7cGlja2xlMmRiLnB5fSB3aGljaCB5b3Ugd2lsbCBmaW5kIGluIHRoZSBkaXN0cmlidXRpb24ncwotXGZpbGV7VG9vbHMvc2NyaXB0c30gZGlyZWN0b3J5LiAgSWYgeW91J3ZlIGFscmVhZHkgYmVlbiB1c2luZyB0aGUgUHlCU0REQgotcGFja2FnZSBhbmQgaW1wb3J0aW5nIGl0IGFzIFxtb2R1bGV7YnNkZGIzfSwgeW91IHdpbGwgaGF2ZSB0byBjaGFuZ2UgeW91cgotXGNvZGV7aW1wb3J0fSBzdGF0ZW1lbnRzIHRvIGltcG9ydCBpdCBhcyBcbW9kdWxle2JzZGRifS4KLQotXGl0ZW0gVGhlIG5ldyBcbW9kdWxle2J6Mn0gbW9kdWxlIGlzIGFuIGludGVyZmFjZSB0byB0aGUgYnoyIGRhdGEKLWNvbXByZXNzaW9uIGxpYnJhcnkuICBiejItY29tcHJlc3NlZCBkYXRhIGlzIHVzdWFsbHkgc21hbGxlciB0aGFuIAotY29ycmVzcG9uZGluZyBcbW9kdWxle3psaWJ9LWNvbXByZXNzZWQgZGF0YS4gKENvbnRyaWJ1dGVkIGJ5IEd1c3Rhdm8gTmllbWV5ZXIuKQotIAotXGl0ZW0gQSBzZXQgb2Ygc3RhbmRhcmQgZGF0ZS90aW1lIHR5cGVzIGhhcyBiZWVuIGFkZGVkIGluIHRoZSBuZXcgXG1vZHVsZXtkYXRldGltZX0KLW1vZHVsZS4gIFNlZSB0aGUgZm9sbG93aW5nIHNlY3Rpb24gZm9yIG1vcmUgZGV0YWlscy4KLQotXGl0ZW0gVGhlIERpc3R1dGlscyBcY2xhc3N7RXh0ZW5zaW9ufSBjbGFzcyBub3cgc3VwcG9ydHMKLWFuIGV4dHJhIGNvbnN0cnVjdG9yIGFyZ3VtZW50IG5hbWVkIFx2YXJ7ZGVwZW5kc30gZm9yIGxpc3RpbmcKLWFkZGl0aW9uYWwgc291cmNlIGZpbGVzIHRoYXQgYW4gZXh0ZW5zaW9uIGRlcGVuZHMgb24uICBUaGlzIGxldHMKLURpc3R1dGlscyByZWNvbXBpbGUgdGhlIG1vZHVsZSBpZiBhbnkgb2YgdGhlIGRlcGVuZGVuY3kgZmlsZXMgYXJlCi1tb2RpZmllZC4gIEZvciBleGFtcGxlLCBpZiBcZmlsZXtzYW1wbW9kdWxlLmN9IGluY2x1ZGVzIHRoZSBoZWFkZXIKLWZpbGUgXGZpbGV7c2FtcGxlLmh9LCB5b3Ugd291bGQgY3JlYXRlIHRoZSBcY2xhc3N7RXh0ZW5zaW9ufSBvYmplY3QgbGlrZQotdGhpczoKLQotXGJlZ2lue3ZlcmJhdGltfQotZXh0ID0gRXh0ZW5zaW9uKCJzYW1wIiwKLSAgICAgICAgICAgICAgICBzb3VyY2VzPVsic2FtcG1vZHVsZS5jIl0sCi0gICAgICAgICAgICAgICAgZGVwZW5kcz1bInNhbXBsZS5oIl0pCi1cZW5ke3ZlcmJhdGltfQotCi1Nb2RpZnlpbmcgXGZpbGV7c2FtcGxlLmh9IHdvdWxkIHRoZW4gY2F1c2UgdGhlIG1vZHVsZSB0byBiZSByZWNvbXBpbGVkLgotKENvbnRyaWJ1dGVkIGJ5IEplcmVteSBIeWx0b24uKQotCi1caXRlbSBPdGhlciBtaW5vciBjaGFuZ2VzIHRvIERpc3R1dGlsczoKLWl0IG5vdyBjaGVja3MgZm9yIHRoZSBcZW52dmFye0NDfSwgXGVudnZhcntDRkxBR1N9LCBcZW52dmFye0NQUH0sCi1cZW52dmFye0xERkxBR1N9LCBhbmQgXGVudnZhcntDUFBGTEFHU30gZW52aXJvbm1lbnQgdmFyaWFibGVzLCB1c2luZwotdGhlbSB0byBvdmVycmlkZSB0aGUgc2V0dGluZ3MgaW4gUHl0aG9uJ3MgY29uZmlndXJhdGlvbiAoY29udHJpYnV0ZWQKLWJ5IFJvYmVydCBXZWJlcikuCi0KLVxpdGVtIFByZXZpb3VzbHkgdGhlIFxtb2R1bGV7ZG9jdGVzdH0gbW9kdWxlIHdvdWxkIG9ubHkgc2VhcmNoIHRoZQotZG9jc3RyaW5ncyBvZiBwdWJsaWMgbWV0aG9kcyBhbmQgZnVuY3Rpb25zIGZvciB0ZXN0IGNhc2VzLCBidXQgaXQgbm93Ci1hbHNvIGV4YW1pbmVzIHByaXZhdGUgb25lcyBhcyB3ZWxsLiAgVGhlIFxmdW5jdGlvbntEb2NUZXN0U3VpdGUofQotZnVuY3Rpb24gY3JlYXRlcyBhIFxjbGFzc3t1bml0dGVzdC5UZXN0U3VpdGV9IG9iamVjdCBmcm9tIGEgc2V0IG9mCi1cbW9kdWxle2RvY3Rlc3R9IHRlc3RzLgotCi1caXRlbSBUaGUgbmV3IFxmdW5jdGlvbntnYy5nZXRfcmVmZXJlbnRzKFx2YXJ7b2JqZWN0fSl9IGZ1bmN0aW9uIHJldHVybnMgYQotbGlzdCBvZiBhbGwgdGhlIG9iamVjdHMgcmVmZXJlbmNlZCBieSBcdmFye29iamVjdH0uCi0KLVxpdGVtIFRoZSBcbW9kdWxle2dldG9wdH0gbW9kdWxlIGdhaW5lZCBhIG5ldyBmdW5jdGlvbiwKLVxmdW5jdGlvbntnbnVfZ2V0b3B0KCl9LCB0aGF0IHN1cHBvcnRzIHRoZSBzYW1lIGFyZ3VtZW50cyBhcyB0aGUgZXhpc3RpbmcKLVxmdW5jdGlvbntnZXRvcHQoKX0gZnVuY3Rpb24gYnV0IHVzZXMgR05VLXN0eWxlIHNjYW5uaW5nIG1vZGUuCi1UaGUgZXhpc3RpbmcgXGZ1bmN0aW9ue2dldG9wdCgpfSBzdG9wcyBwcm9jZXNzaW5nIG9wdGlvbnMgYXMgc29vbiBhcyBhCi1ub24tb3B0aW9uIGFyZ3VtZW50IGlzIGVuY291bnRlcmVkLCBidXQgaW4gR05VLXN0eWxlIG1vZGUgcHJvY2Vzc2luZwotY29udGludWVzLCBtZWFuaW5nIHRoYXQgb3B0aW9ucyBhbmQgYXJndW1lbnRzIGNhbiBiZSBtaXhlZC4gIEZvcgotZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGdldG9wdC5nZXRvcHQoWyctZicsICdmaWxlbmFtZScsICdvdXRwdXQnLCAnLXYnXSwgJ2Y6dicpCi0oWygnLWYnLCAnZmlsZW5hbWUnKV0sIFsnb3V0cHV0JywgJy12J10pCi0+Pj4gZ2V0b3B0LmdudV9nZXRvcHQoWyctZicsICdmaWxlbmFtZScsICdvdXRwdXQnLCAnLXYnXSwgJ2Y6dicpCi0oWygnLWYnLCAnZmlsZW5hbWUnKSwgKCctdicsICcnKV0sIFsnb3V0cHV0J10pCi1cZW5ke3ZlcmJhdGltfQotCi0oQ29udHJpYnV0ZWQgYnkgUGV0ZXIgXEFBe3N0cmFuZH0uKQotCi1caXRlbSBUaGUgXG1vZHVsZXtncnB9LCBcbW9kdWxle3B3ZH0sIGFuZCBcbW9kdWxle3Jlc291cmNlfSBtb2R1bGVzCi1ub3cgcmV0dXJuIGVuaGFuY2VkIHR1cGxlczoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGltcG9ydCBncnAKLT4+PiBnID0gZ3JwLmdldGdybmFtKCdhbWsnKQotPj4+IGcuZ3JfbmFtZSwgZy5ncl9naWQKLSgnYW1rJywgNTAwKQotXGVuZHt2ZXJiYXRpbX0KLQotXGl0ZW0gVGhlIFxtb2R1bGV7Z3ppcH0gbW9kdWxlIGNhbiBub3cgaGFuZGxlIGZpbGVzIGV4Y2VlZGluZyAyfkdpQi4gIAotCi1caXRlbSBUaGUgbmV3IFxtb2R1bGV7aGVhcHF9IG1vZHVsZSBjb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBhCi1oZWFwIHF1ZXVlIGFsZ29yaXRobS4gIEEgaGVhcCBpcyBhbiBhcnJheS1saWtlIGRhdGEgc3RydWN0dXJlIHRoYXQKLWtlZXBzIGl0ZW1zIGluIGEgcGFydGlhbGx5IHNvcnRlZCBvcmRlciBzdWNoIHRoYXQsIGZvciBldmVyeSBpbmRleAotXHZhcntrfSwgXGNvZGV7aGVhcFtcdmFye2t9XSA8PSBoZWFwWzIqXHZhcntrfSsxXX0gYW5kCi1cY29kZXtoZWFwW1x2YXJ7a31dIDw9IGhlYXBbMipcdmFye2t9KzJdfS4gIFRoaXMgbWFrZXMgaXQgcXVpY2sgdG8KLXJlbW92ZSB0aGUgc21hbGxlc3QgaXRlbSwgYW5kIGluc2VydGluZyBhIG5ldyBpdGVtIHdoaWxlIG1haW50YWluaW5nCi10aGUgaGVhcCBwcm9wZXJ0eSBpcyBPKGxnfm4pLiAgKFNlZQotXHVybHtodHRwOi8vd3d3Lm5pc3QuZ292L2RhZHMvSFRNTC9wcmlvcml0eXF1ZS5odG1sfSBmb3IgbW9yZQotaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByaW9yaXR5IHF1ZXVlIGRhdGEgc3RydWN0dXJlLikKLQotVGhlIFxtb2R1bGV7aGVhcHF9IG1vZHVsZSBwcm92aWRlcyBcZnVuY3Rpb257aGVhcHB1c2goKX0gYW5kCi1cZnVuY3Rpb257aGVhcHBvcCgpfSBmdW5jdGlvbnMgZm9yIGFkZGluZyBhbmQgcmVtb3ZpbmcgaXRlbXMgd2hpbGUKLW1haW50YWluaW5nIHRoZSBoZWFwIHByb3BlcnR5IG9uIHRvcCBvZiBzb21lIG90aGVyIG11dGFibGUgUHl0aG9uCi1zZXF1ZW5jZSB0eXBlLiAgSGVyZSdzIGFuIGV4YW1wbGUgdGhhdCB1c2VzIGEgUHl0aG9uIGxpc3Q6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgaGVhcHEKLT4+PiBoZWFwID0gW10KLT4+PiBmb3IgaXRlbSBpbiBbMywgNywgNSwgMTEsIDFdOgotLi4uICAgIGhlYXBxLmhlYXBwdXNoKGhlYXAsIGl0ZW0pCi0uLi4KLT4+PiBoZWFwCi1bMSwgMywgNSwgMTEsIDddCi0+Pj4gaGVhcHEuaGVhcHBvcChoZWFwKQotMQotPj4+IGhlYXBxLmhlYXBwb3AoaGVhcCkKLTMKLT4+PiBoZWFwCi1bNSwgNywgMTFdCi1cZW5ke3ZlcmJhdGltfQotCi0oQ29udHJpYnV0ZWQgYnkgS2V2aW4gTydDb25ub3IuKQotCi1caXRlbSBUaGUgSURMRSBpbnRlZ3JhdGVkIGRldmVsb3BtZW50IGVudmlyb25tZW50IGhhcyBiZWVuIHVwZGF0ZWQKLXVzaW5nIHRoZSBjb2RlIGZyb20gdGhlIElETEVmb3JrIHByb2plY3QKLShcdXJse2h0dHA6Ly9pZGxlZm9yay5zZi5uZXR9KS4gIFRoZSBtb3N0IG5vdGFibGUgZmVhdHVyZSBpcyB0aGF0IHRoZQotY29kZSBiZWluZyBkZXZlbG9wZWQgaXMgbm93IGV4ZWN1dGVkIGluIGEgc3VicHJvY2VzcywgbWVhbmluZyB0aGF0Ci10aGVyZSdzIG5vIGxvbmdlciBhbnkgbmVlZCBmb3IgbWFudWFsIFxjb2Rle3JlbG9hZCgpfSBvcGVyYXRpb25zLgotSURMRSdzIGNvcmUgY29kZSBoYXMgYmVlbiBpbmNvcnBvcmF0ZWQgaW50byB0aGUgc3RhbmRhcmQgbGlicmFyeSBhcyB0aGUKLVxtb2R1bGV7aWRsZWxpYn0gcGFja2FnZS4KLQotXGl0ZW0gVGhlIFxtb2R1bGV7aW1hcGxpYn0gbW9kdWxlIG5vdyBzdXBwb3J0cyBJTUFQIG92ZXIgU1NMLgotKENvbnRyaWJ1dGVkIGJ5IFBpZXJzIExhdWRlciBhbmQgVGlubyBMYW5nZS4pCi0KLVxpdGVtIFRoZSBcbW9kdWxle2l0ZXJ0b29sc30gY29udGFpbnMgYSBudW1iZXIgb2YgdXNlZnVsIGZ1bmN0aW9ucyBmb3IKLXVzZSB3aXRoIGl0ZXJhdG9ycywgaW5zcGlyZWQgYnkgdmFyaW91cyBmdW5jdGlvbnMgcHJvdmlkZWQgYnkgdGhlIE1MCi1hbmQgSGFza2VsbCBsYW5ndWFnZXMuICBGb3IgZXhhbXBsZSwKLVxjb2Rle2l0ZXJ0b29scy5pZmlsdGVyKHByZWRpY2F0ZSwgaXRlcmF0b3IpfSByZXR1cm5zIGFsbCBlbGVtZW50cyBpbgotdGhlIGl0ZXJhdG9yIGZvciB3aGljaCB0aGUgZnVuY3Rpb24gXGZ1bmN0aW9ue3ByZWRpY2F0ZSgpfSByZXR1cm5zCi1cY29uc3RhbnR7VHJ1ZX0sIGFuZCBcY29kZXtpdGVydG9vbHMucmVwZWF0KG9iaiwgXHZhcntOfSl9IHJldHVybnMKLVxjb2Rle29ian0gXHZhcntOfSB0aW1lcy4gIFRoZXJlIGFyZSBhIG51bWJlciBvZiBvdGhlciBmdW5jdGlvbnMgaW4KLXRoZSBtb2R1bGU7IHNlZSB0aGUgXHVsaW5re3BhY2thZ2UncyByZWZlcmVuY2UKLWRvY3VtZW50YXRpb259ey4uL2xpYi9tb2R1bGUtaXRlcnRvb2xzLmh0bWx9IGZvciBkZXRhaWxzLgotKENvbnRyaWJ1dGVkIGJ5IFJheW1vbmQgSGV0dGluZ2VyLikKLQotXGl0ZW0gVHdvIG5ldyBmdW5jdGlvbnMgaW4gdGhlIFxtb2R1bGV7bWF0aH0gbW9kdWxlLAotXGZ1bmN0aW9ue2RlZ3JlZXMoXHZhcntyYWRzfSl9IGFuZCBcZnVuY3Rpb257cmFkaWFucyhcdmFye2RlZ3N9KX0sCi1jb252ZXJ0IGJldHdlZW4gcmFkaWFucyBhbmQgZGVncmVlcy4gIE90aGVyIGZ1bmN0aW9ucyBpbiB0aGUKLVxtb2R1bGV7bWF0aH0gbW9kdWxlIHN1Y2ggYXMgXGZ1bmN0aW9ue21hdGguc2luKCl9IGFuZAotXGZ1bmN0aW9ue21hdGguY29zKCl9IGhhdmUgYWx3YXlzIHJlcXVpcmVkIGlucHV0IHZhbHVlcyBtZWFzdXJlZCBpbgotcmFkaWFucy4gIEFsc28sIGFuIG9wdGlvbmFsIFx2YXJ7YmFzZX0gYXJndW1lbnQgd2FzIGFkZGVkIHRvCi1cZnVuY3Rpb257bWF0aC5sb2coKX0gdG8gbWFrZSBpdCBlYXNpZXIgdG8gY29tcHV0ZSBsb2dhcml0aG1zIGZvcgotYmFzZXMgb3RoZXIgdGhhbiBcY29kZXtlfSBhbmQgXGNvZGV7MTB9LiAgKENvbnRyaWJ1dGVkIGJ5IFJheW1vbmQKLUhldHRpbmdlci4pCi0KLVxpdGVtIFNldmVyYWwgbmV3IFBPU0lYIGZ1bmN0aW9ucyAoXGZ1bmN0aW9ue2dldHBnaWQoKX0sIFxmdW5jdGlvbntraWxscGcoKX0sCi1cZnVuY3Rpb257bGNob3duKCl9LCBcZnVuY3Rpb257bG9hZGF2ZygpfSwgXGZ1bmN0aW9ue21ham9yKCl9LCBcZnVuY3Rpb257bWFrZWRldigpfSwKLVxmdW5jdGlvbnttaW5vcigpfSwgYW5kIFxmdW5jdGlvbntta25vZCgpfSkgd2VyZSBhZGRlZCB0byB0aGUKLVxtb2R1bGV7cG9zaXh9IG1vZHVsZSB0aGF0IHVuZGVybGllcyB0aGUgXG1vZHVsZXtvc30gbW9kdWxlLgotKENvbnRyaWJ1dGVkIGJ5IEd1c3Rhdm8gTmllbWV5ZXIsIEdlZXJ0IEphbnNlbiwgYW5kIERlbmlzIFMuIE90a2lkYWNoLikKLQotXGl0ZW0gSW4gdGhlIFxtb2R1bGV7b3N9IG1vZHVsZSwgdGhlIFxmdW5jdGlvbnsqc3RhdCgpfSBmYW1pbHkgb2YKLWZ1bmN0aW9ucyBjYW4gbm93IHJlcG9ydCBmcmFjdGlvbnMgb2YgYSBzZWNvbmQgaW4gYSB0aW1lc3RhbXAuICBTdWNoCi10aW1lIHN0YW1wcyBhcmUgcmVwcmVzZW50ZWQgYXMgZmxvYXRzLCBzaW1pbGFyIHRvCi10aGUgdmFsdWUgcmV0dXJuZWQgYnkgXGZ1bmN0aW9ue3RpbWUudGltZSgpfS4KLQotRHVyaW5nIHRlc3RpbmcsIGl0IHdhcyBmb3VuZCB0aGF0IHNvbWUgYXBwbGljYXRpb25zIHdpbGwgYnJlYWsgaWYgdGltZQotc3RhbXBzIGFyZSBmbG9hdHMuICBGb3IgY29tcGF0aWJpbGl0eSwgd2hlbiB1c2luZyB0aGUgdHVwbGUgaW50ZXJmYWNlCi1vZiB0aGUgXGNsYXNze3N0YXRfcmVzdWx0fSB0aW1lIHN0YW1wcyB3aWxsIGJlIHJlcHJlc2VudGVkIGFzIGludGVnZXJzLgotV2hlbiB1c2luZyBuYW1lZCBmaWVsZHMgKGEgZmVhdHVyZSBmaXJzdCBpbnRyb2R1Y2VkIGluIFB5dGhvbiAyLjIpLAotdGltZSBzdGFtcHMgYXJlIHN0aWxsIHJlcHJlc2VudGVkIGFzIGludGVnZXJzLCB1bmxlc3MKLVxmdW5jdGlvbntvcy5zdGF0X2Zsb2F0X3RpbWVzKCl9IGlzIGludm9rZWQgdG8gZW5hYmxlIGZsb2F0IHJldHVybgotdmFsdWVzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gb3Muc3RhdCgiL3RtcCIpLnN0X210aW1lCi0xMDM0NzkxMjAwCi0+Pj4gb3Muc3RhdF9mbG9hdF90aW1lcyhUcnVlKQotPj4+IG9zLnN0YXQoIi90bXAiKS5zdF9tdGltZQotMTAzNDc5MTIwMC42MzM1MDE0Ci1cZW5ke3ZlcmJhdGltfQotCi1JbiBQeXRob24gMi40LCB0aGUgZGVmYXVsdCB3aWxsIGNoYW5nZSB0byBhbHdheXMgcmV0dXJuaW5nIGZsb2F0cy4KLQotQXBwbGljYXRpb24gZGV2ZWxvcGVycyBzaG91bGQgZW5hYmxlIHRoaXMgZmVhdHVyZSBvbmx5IGlmIGFsbCB0aGVpcgotbGlicmFyaWVzIHdvcmsgcHJvcGVybHkgd2hlbiBjb25mcm9udGVkIHdpdGggZmxvYXRpbmcgcG9pbnQgdGltZQotc3RhbXBzLCBvciBpZiB0aGV5IHVzZSB0aGUgdHVwbGUgQVBJLiBJZiB1c2VkLCB0aGUgZmVhdHVyZSBzaG91bGQgYmUKLWFjdGl2YXRlZCBvbiBhbiBhcHBsaWNhdGlvbiBsZXZlbCBpbnN0ZWFkIG9mIHRyeWluZyB0byBlbmFibGUgaXQgb24gYQotcGVyLXVzZSBiYXNpcy4KLQotXGl0ZW0gVGhlIFxtb2R1bGV7b3B0cGFyc2V9IG1vZHVsZSBjb250YWlucyBhIG5ldyBwYXJzZXIgZm9yIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgCi10aGF0IGNhbiBjb252ZXJ0IG9wdGlvbiB2YWx1ZXMgdG8gYSBwYXJ0aWN1bGFyIFB5dGhvbiB0eXBlIAotYW5kIHdpbGwgYXV0b21hdGljYWxseSBnZW5lcmF0ZSBhIHVzYWdlIG1lc3NhZ2UuICBTZWUgdGhlIGZvbGxvd2luZyBzZWN0aW9uIGZvciAKLW1vcmUgZGV0YWlscy4KLQotXGl0ZW0gVGhlIG9sZCBhbmQgbmV2ZXItZG9jdW1lbnRlZCBcbW9kdWxle2xpbnV4YXVkaW9kZXZ9IG1vZHVsZSBoYXMKLWJlZW4gZGVwcmVjYXRlZCwgYW5kIGEgbmV3IHZlcnNpb24gbmFtZWQgXG1vZHVsZXtvc3NhdWRpb2Rldn0gaGFzIGJlZW4KLWFkZGVkLiAgVGhlIG1vZHVsZSB3YXMgcmVuYW1lZCBiZWNhdXNlIHRoZSBPU1Mgc291bmQgZHJpdmVycyBjYW4gYmUKLXVzZWQgb24gcGxhdGZvcm1zIG90aGVyIHRoYW4gTGludXgsIGFuZCB0aGUgaW50ZXJmYWNlIGhhcyBhbHNvIGJlZW4KLXRpZGllZCBhbmQgYnJvdWdodCB1cCB0byBkYXRlIGluIHZhcmlvdXMgd2F5cy4gKENvbnRyaWJ1dGVkIGJ5IEdyZWcKLVdhcmQgYW5kIE5pY2hvbGFzIEZpdHpSb3ktRGFsZS4pCi0KLVxpdGVtIFRoZSBuZXcgXG1vZHVsZXtwbGF0Zm9ybX0gbW9kdWxlIGNvbnRhaW5zIGEgbnVtYmVyIG9mIGZ1bmN0aW9ucwotdGhhdCB0cnkgdG8gZGV0ZXJtaW5lIHZhcmlvdXMgcHJvcGVydGllcyBvZiB0aGUgcGxhdGZvcm0geW91J3JlCi1ydW5uaW5nIG9uLiAgVGhlcmUgYXJlIGZ1bmN0aW9ucyBmb3IgZ2V0dGluZyB0aGUgYXJjaGl0ZWN0dXJlLCBDUFUKLXR5cGUsIHRoZSBXaW5kb3dzIE9TIHZlcnNpb24sIGFuZCBldmVuIHRoZSBMaW51eCBkaXN0cmlidXRpb24gdmVyc2lvbi4KLShDb250cmlidXRlZCBieSBNYXJjLUFuZHJcJ2UgTGVtYnVyZy4pCi0KLVxpdGVtIFRoZSBwYXJzZXIgb2JqZWN0cyBwcm92aWRlZCBieSB0aGUgXG1vZHVsZXtweWV4cGF0fSBtb2R1bGUKLWNhbiBub3cgb3B0aW9uYWxseSBidWZmZXIgY2hhcmFjdGVyIGRhdGEsIHJlc3VsdGluZyBpbiBmZXdlciBjYWxscyB0bwoteW91ciBjaGFyYWN0ZXIgZGF0YSBoYW5kbGVyIGFuZCB0aGVyZWZvcmUgZmFzdGVyIHBlcmZvcm1hbmNlLiAgU2V0dGluZwotdGhlIHBhcnNlciBvYmplY3QncyBcbWVtYmVye2J1ZmZlcl90ZXh0fSBhdHRyaWJ1dGUgdG8gXGNvbnN0YW50e1RydWV9Ci13aWxsIGVuYWJsZSBidWZmZXJpbmcuCi0KLVxpdGVtIFRoZSBcZnVuY3Rpb257c2FtcGxlKFx2YXJ7cG9wdWxhdGlvbn0sIFx2YXJ7a30pfSBmdW5jdGlvbiB3YXMKLWFkZGVkIHRvIHRoZSBcbW9kdWxle3JhbmRvbX0gbW9kdWxlLiAgXHZhcntwb3B1bGF0aW9ufSBpcyBhIHNlcXVlbmNlIG9yCi1cY2xhc3N7eHJhbmdlfSBvYmplY3QgY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YgYSBwb3B1bGF0aW9uLCBhbmQKLVxmdW5jdGlvbntzYW1wbGUoKX0gY2hvb3NlcyBcdmFye2t9IGVsZW1lbnRzIGZyb20gdGhlIHBvcHVsYXRpb24gd2l0aG91dAotcmVwbGFjaW5nIGNob3NlbiBlbGVtZW50cy4gIFx2YXJ7a30gY2FuIGJlIGFueSB2YWx1ZSB1cCB0bwotXGNvZGV7bGVuKFx2YXJ7cG9wdWxhdGlvbn0pfS4gRm9yIGV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBkYXlzID0gWydNbycsICdUdScsICdXZScsICdUaCcsICdGcicsICdTdCcsICdTbiddCi0+Pj4gcmFuZG9tLnNhbXBsZShkYXlzLCAzKSAgICAgICMgQ2hvb3NlIDMgZWxlbWVudHMKLVsnU3QnLCAnU24nLCAnVGgnXQotPj4+IHJhbmRvbS5zYW1wbGUoZGF5cywgNykgICAgICAjIENob29zZSA3IGVsZW1lbnRzCi1bJ1R1JywgJ1RoJywgJ01vJywgJ1dlJywgJ1N0JywgJ0ZyJywgJ1NuJ10KLT4+PiByYW5kb20uc2FtcGxlKGRheXMsIDcpICAgICAgIyBDaG9vc2UgNyBhZ2FpbgotWydXZScsICdNbycsICdTbicsICdGcicsICdUdScsICdTdCcsICdUaCddCi0+Pj4gcmFuZG9tLnNhbXBsZShkYXlzLCA4KSAgICAgICMgQ2FuJ3QgY2hvb3NlIGVpZ2h0Ci1UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KLSAgRmlsZSAicmFuZG9tLnB5IiwgbGluZSA0MTQsIGluIHNhbXBsZQotICAgICAgcmFpc2UgVmFsdWVFcnJvciwgInNhbXBsZSBsYXJnZXIgdGhhbiBwb3B1bGF0aW9uIgotVmFsdWVFcnJvcjogc2FtcGxlIGxhcmdlciB0aGFuIHBvcHVsYXRpb24KLT4+PiByYW5kb20uc2FtcGxlKHhyYW5nZSgxLDEwMDAwLDIpLCAxMCkgICAjIENob29zZSB0ZW4gb2RkIG5vcy4gdW5kZXIgMTAwMDAKLVszNDA3LCAzODA1LCAxNTA1LCA3MDIzLCAyNDAxLCAyMjY3LCA5NzMzLCAzMTUxLCA4MDgzLCA5MTk1XQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIFxtb2R1bGV7cmFuZG9tfSBtb2R1bGUgbm93IHVzZXMgYSBuZXcgYWxnb3JpdGhtLCB0aGUgTWVyc2VubmUKLVR3aXN0ZXIsIGltcGxlbWVudGVkIGluIEMuICBJdCdzIGZhc3RlciBhbmQgbW9yZSBleHRlbnNpdmVseSBzdHVkaWVkCi10aGFuIHRoZSBwcmV2aW91cyBhbGdvcml0aG0uCi0KLShBbGwgY2hhbmdlcyBjb250cmlidXRlZCBieSBSYXltb25kIEhldHRpbmdlci4pCi0KLVxpdGVtIFRoZSBcbW9kdWxle3JlYWRsaW5lfSBtb2R1bGUgYWxzbyBnYWluZWQgYSBudW1iZXIgb2YgbmV3Ci1mdW5jdGlvbnM6IFxmdW5jdGlvbntnZXRfaGlzdG9yeV9pdGVtKCl9LAotXGZ1bmN0aW9ue2dldF9jdXJyZW50X2hpc3RvcnlfbGVuZ3RoKCl9LCBhbmQgXGZ1bmN0aW9ue3JlZGlzcGxheSgpfS4KLQotXGl0ZW0gVGhlIFxtb2R1bGV7cmV4ZWN9IGFuZCBcbW9kdWxle0Jhc3Rpb259IG1vZHVsZXMgaGF2ZSBiZWVuCi1kZWNsYXJlZCBkZWFkLCBhbmQgYXR0ZW1wdHMgdG8gaW1wb3J0IHRoZW0gd2lsbCBmYWlsIHdpdGggYQotXGV4Y2VwdGlvbntSdW50aW1lRXJyb3J9LiAgTmV3LXN0eWxlIGNsYXNzZXMgcHJvdmlkZSBuZXcgd2F5cyB0byBicmVhawotb3V0IG9mIHRoZSByZXN0cmljdGVkIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCBwcm92aWRlZCBieQotXG1vZHVsZXtyZXhlY30sIGFuZCBubyBvbmUgaGFzIGludGVyZXN0IGluIGZpeGluZyB0aGVtIG9yIHRpbWUgdG8gZG8KLXNvLiAgSWYgeW91IGhhdmUgYXBwbGljYXRpb25zIHVzaW5nIFxtb2R1bGV7cmV4ZWN9LCByZXdyaXRlIHRoZW0gdG8KLXVzZSBzb21ldGhpbmcgZWxzZS4KLQotKFN0aWNraW5nIHdpdGggUHl0aG9uIDIuMiBvciAyLjEgd2lsbCBub3QgbWFrZSB5b3VyIGFwcGxpY2F0aW9ucyBhbnkKLXNhZmVyIGJlY2F1c2UgdGhlcmUgYXJlIGtub3duIGJ1Z3MgaW4gdGhlIFxtb2R1bGV7cmV4ZWN9IG1vZHVsZSBpbgotdGhvc2UgdmVyc2lvbnMuICBUbyByZXBlYXQ6IGlmIHlvdSdyZSB1c2luZyBcbW9kdWxle3JleGVjfSwgc3RvcCB1c2luZwotaXQgaW1tZWRpYXRlbHkuKQotCi1caXRlbSBUaGUgXG1vZHVsZXtyb3Rvcn0gbW9kdWxlIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYmVjYXVzZSB0aGUgCi0gIGFsZ29yaXRobSBpdCB1c2VzIGZvciBlbmNyeXB0aW9uIGlzIG5vdCBiZWxpZXZlZCB0byBiZSBzZWN1cmUuICBJZgotICB5b3UgbmVlZCBlbmNyeXB0aW9uLCB1c2Ugb25lIG9mIHRoZSBzZXZlcmFsIEFFUyBQeXRob24gbW9kdWxlcwotICB0aGF0IGFyZSBhdmFpbGFibGUgc2VwYXJhdGVseS4KLQotXGl0ZW0gVGhlIFxtb2R1bGV7c2h1dGlsfSBtb2R1bGUgZ2FpbmVkIGEgXGZ1bmN0aW9ue21vdmUoXHZhcntzcmN9LAotXHZhcntkZXN0fSl9IGZ1bmN0aW9uIHRoYXQgcmVjdXJzaXZlbHkgbW92ZXMgYSBmaWxlIG9yIGRpcmVjdG9yeSB0byBhIG5ldwotbG9jYXRpb24uCi0KLVxpdGVtIFN1cHBvcnQgZm9yIG1vcmUgYWR2YW5jZWQgUE9TSVggc2lnbmFsIGhhbmRsaW5nIHdhcyBhZGRlZAotdG8gdGhlIFxtb2R1bGV7c2lnbmFsfSBidXQgdGhlbiByZW1vdmVkIGFnYWluIGFzIGl0IHByb3ZlZCBpbXBvc3NpYmxlCi10byBtYWtlIGl0IHdvcmsgcmVsaWFibHkgYWNyb3NzIHBsYXRmb3Jtcy4KLQotXGl0ZW0gVGhlIFxtb2R1bGV7c29ja2V0fSBtb2R1bGUgbm93IHN1cHBvcnRzIHRpbWVvdXRzLiAgWW91Ci1jYW4gY2FsbCB0aGUgXG1ldGhvZHtzZXR0aW1lb3V0KFx2YXJ7dH0pfSBtZXRob2Qgb24gYSBzb2NrZXQgb2JqZWN0IHRvCi1zZXQgYSB0aW1lb3V0IG9mIFx2YXJ7dH0gc2Vjb25kcy4gIFN1YnNlcXVlbnQgc29ja2V0IG9wZXJhdGlvbnMgdGhhdAotdGFrZSBsb25nZXIgdGhhbiBcdmFye3R9IHNlY29uZHMgdG8gY29tcGxldGUgd2lsbCBhYm9ydCBhbmQgcmFpc2UgYQotXGV4Y2VwdGlvbntzb2NrZXQudGltZW91dH0gZXhjZXB0aW9uLgotCi1UaGUgb3JpZ2luYWwgdGltZW91dCBpbXBsZW1lbnRhdGlvbiB3YXMgYnkgVGltIE8nTWFsbGV5LiAgTWljaGFlbAotR2lsZml4IGludGVncmF0ZWQgaXQgaW50byB0aGUgUHl0aG9uIFxtb2R1bGV7c29ja2V0fSBtb2R1bGUgYW5kCi1zaGVwaGVyZGVkIGl0IHRocm91Z2ggYSBsZW5ndGh5IHJldmlldy4gIEFmdGVyIHRoZSBjb2RlIHdhcyBjaGVja2VkCi1pbiwgR3VpZG8gdmFuflJvc3N1bSByZXdyb3RlIHBhcnRzIG9mIGl0LiAgKFRoaXMgaXMgYSBnb29kIGV4YW1wbGUgb2YKLWEgY29sbGFib3JhdGl2ZSBkZXZlbG9wbWVudCBwcm9jZXNzIGluIGFjdGlvbi4pCi0KLVxpdGVtIE9uIFdpbmRvd3MsIHRoZSBcbW9kdWxle3NvY2tldH0gbW9kdWxlIG5vdyBzaGlwcyB3aXRoIFNlY3VyZSAKLVNvY2tldHMgTGF5ZXIgKFNTTCkgc3VwcG9ydC4KLQotXGl0ZW0gVGhlIHZhbHVlIG9mIHRoZSBDIFxjb25zdGFudHtQWVRIT05fQVBJX1ZFUlNJT059IG1hY3JvIGlzIG5vdwotZXhwb3NlZCBhdCB0aGUgUHl0aG9uIGxldmVsIGFzIFxjb2Rle3N5cy5hcGlfdmVyc2lvbn0uICBUaGUgY3VycmVudAotZXhjZXB0aW9uIGNhbiBiZSBjbGVhcmVkIGJ5IGNhbGxpbmcgdGhlIG5ldyBcZnVuY3Rpb257c3lzLmV4Y19jbGVhcigpfQotZnVuY3Rpb24uCi0KLVxpdGVtIFRoZSBuZXcgXG1vZHVsZXt0YXJmaWxlfSBtb2R1bGUgCi1hbGxvd3MgcmVhZGluZyBmcm9tIGFuZCB3cml0aW5nIHRvIFxwcm9ncmFte3Rhcn0tZm9ybWF0IGFyY2hpdmUgZmlsZXMuCi0oQ29udHJpYnV0ZWQgYnkgTGFycyBHdXN0XCJhYmVsLikKLQotXGl0ZW0gVGhlIG5ldyBcbW9kdWxle3RleHR3cmFwfSBtb2R1bGUgY29udGFpbnMgZnVuY3Rpb25zIGZvciB3cmFwcGluZwotc3RyaW5ncyBjb250YWluaW5nIHBhcmFncmFwaHMgb2YgdGV4dC4gIFRoZSBcZnVuY3Rpb257d3JhcChcdmFye3RleHR9LAotXHZhcnt3aWR0aH0pfSBmdW5jdGlvbiB0YWtlcyBhIHN0cmluZyBhbmQgcmV0dXJucyBhIGxpc3QgY29udGFpbmluZwotdGhlIHRleHQgc3BsaXQgaW50byBsaW5lcyBvZiBubyBtb3JlIHRoYW4gdGhlIGNob3NlbiB3aWR0aC4gIFRoZQotXGZ1bmN0aW9ue2ZpbGwoXHZhcnt0ZXh0fSwgXHZhcnt3aWR0aH0pfSBmdW5jdGlvbiByZXR1cm5zIGEgc2luZ2xlCi1zdHJpbmcsIHJlZm9ybWF0dGVkIHRvIGZpdCBpbnRvIGxpbmVzIG5vIGxvbmdlciB0aGFuIHRoZSBjaG9zZW4gd2lkdGguCi0oQXMgeW91IGNhbiBndWVzcywgXGZ1bmN0aW9ue2ZpbGwoKX0gaXMgYnVpbHQgb24gdG9wIG9mCi1cZnVuY3Rpb257d3JhcCgpfS4gIEZvciBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gaW1wb3J0IHRleHR3cmFwCi0+Pj4gcGFyYWdyYXBoID0gIk5vdCBhIHdoaXQsIHdlIGRlZnkgYXVndXJ5OiAuLi4gbW9yZSB0ZXh0IC4uLiIKLT4+PiB0ZXh0d3JhcC53cmFwKHBhcmFncmFwaCwgNjApCi1bIk5vdCBhIHdoaXQsIHdlIGRlZnkgYXVndXJ5OiB0aGVyZSdzIGEgc3BlY2lhbCBwcm92aWRlbmNlIGluIiwKLSAidGhlIGZhbGwgb2YgYSBzcGFycm93LiBJZiBpdCBiZSBub3csICd0aXMgbm90IHRvIGNvbWU7IGlmIGl0IiwKLSAuLi5dCi0+Pj4gcHJpbnQgdGV4dHdyYXAuZmlsbChwYXJhZ3JhcGgsIDM1KQotTm90IGEgd2hpdCwgd2UgZGVmeSBhdWd1cnk6IHRoZXJlJ3MKLWEgc3BlY2lhbCBwcm92aWRlbmNlIGluIHRoZSBmYWxsIG9mCi1hIHNwYXJyb3cuIElmIGl0IGJlIG5vdywgJ3RpcyBub3QKLXRvIGNvbWU7IGlmIGl0IGJlIG5vdCB0byBjb21lLCBpdAotd2lsbCBiZSBub3c7IGlmIGl0IGJlIG5vdCBub3csIHlldAotaXQgd2lsbCBjb21lOiB0aGUgcmVhZGluZXNzIGlzIGFsbC4KLT4+PgotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIG1vZHVsZSBhbHNvIGNvbnRhaW5zIGEgXGNsYXNze1RleHRXcmFwcGVyfSBjbGFzcyB0aGF0IGFjdHVhbGx5Ci1pbXBsZW1lbnRzIHRoZSB0ZXh0IHdyYXBwaW5nIHN0cmF0ZWd5LiAgIEJvdGggdGhlCi1cY2xhc3N7VGV4dFdyYXBwZXJ9IGNsYXNzIGFuZCB0aGUgXGZ1bmN0aW9ue3dyYXAoKX0gYW5kCi1cZnVuY3Rpb257ZmlsbCgpfSBmdW5jdGlvbnMgc3VwcG9ydCBhIG51bWJlciBvZiBhZGRpdGlvbmFsIGtleXdvcmQKLWFyZ3VtZW50cyBmb3IgZmluZS10dW5pbmcgdGhlIGZvcm1hdHRpbmc7IGNvbnN1bHQgdGhlIFx1bGlua3ttb2R1bGUncwotZG9jdW1lbnRhdGlvbn17Li4vbGliL21vZHVsZS10ZXh0d3JhcC5odG1sfSBmb3IgZGV0YWlscy4KLShDb250cmlidXRlZCBieSBHcmVnIFdhcmQuKQotCi1caXRlbSBUaGUgXG1vZHVsZXt0aHJlYWR9IGFuZCBcbW9kdWxle3RocmVhZGluZ30gbW9kdWxlcyBub3cgaGF2ZQotY29tcGFuaW9uIG1vZHVsZXMsIFxtb2R1bGV7ZHVtbXlfdGhyZWFkfSBhbmQgXG1vZHVsZXtkdW1teV90aHJlYWRpbmd9LAotdGhhdCBwcm92aWRlIGEgZG8tbm90aGluZyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgXG1vZHVsZXt0aHJlYWR9Ci1tb2R1bGUncyBpbnRlcmZhY2UgZm9yIHBsYXRmb3JtcyB3aGVyZSB0aHJlYWRzIGFyZSBub3Qgc3VwcG9ydGVkLiAgVGhlCi1pbnRlbnRpb24gaXMgdG8gc2ltcGxpZnkgdGhyZWFkLWF3YXJlIG1vZHVsZXMgKG9uZXMgdGhhdCBcZW1waHtkb24ndH0KLXJlbHkgb24gdGhyZWFkcyB0byBydW4pIGJ5IHB1dHRpbmcgdGhlIGZvbGxvd2luZyBjb2RlIGF0IHRoZSB0b3A6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXRyeToKLSAgICBpbXBvcnQgdGhyZWFkaW5nIGFzIF90aHJlYWRpbmcKLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICBpbXBvcnQgZHVtbXlfdGhyZWFkaW5nIGFzIF90aHJlYWRpbmcKLVxlbmR7dmVyYmF0aW19Ci0KLUluIHRoaXMgZXhhbXBsZSwgXG1vZHVsZXtfdGhyZWFkaW5nfSBpcyB1c2VkIGFzIHRoZSBtb2R1bGUgbmFtZSB0byBtYWtlCi1pdCBjbGVhciB0aGF0IHRoZSBtb2R1bGUgYmVpbmcgdXNlZCBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIGFjdHVhbAotXG1vZHVsZXt0aHJlYWRpbmd9IG1vZHVsZS4gQ29kZSBjYW4gY2FsbCBmdW5jdGlvbnMgYW5kIHVzZSBjbGFzc2VzIGluCi1cbW9kdWxle190aHJlYWRpbmd9IHdoZXRoZXIgb3Igbm90IHRocmVhZHMgYXJlIHN1cHBvcnRlZCwgYXZvaWRpbmcgYW4KLVxrZXl3b3Jke2lmfSBzdGF0ZW1lbnQgYW5kIG1ha2luZyB0aGUgY29kZSBzbGlnaHRseSBjbGVhcmVyLiAgVGhpcwotbW9kdWxlIHdpbGwgbm90IG1hZ2ljYWxseSBtYWtlIG11bHRpdGhyZWFkZWQgY29kZSBydW4gd2l0aG91dCB0aHJlYWRzOwotY29kZSB0aGF0IHdhaXRzIGZvciBhbm90aGVyIHRocmVhZCB0byByZXR1cm4gb3IgdG8gZG8gc29tZXRoaW5nIHdpbGwKLXNpbXBseSBoYW5nIGZvcmV2ZXIuIAotCi1caXRlbSBUaGUgXG1vZHVsZXt0aW1lfSBtb2R1bGUncyBcZnVuY3Rpb257c3RycHRpbWUoKX0gZnVuY3Rpb24gaGFzCi1sb25nIGJlZW4gYW4gYW5ub3lhbmNlIGJlY2F1c2UgaXQgdXNlcyB0aGUgcGxhdGZvcm0gQyBsaWJyYXJ5J3MKLVxmdW5jdGlvbntzdHJwdGltZSgpfSBpbXBsZW1lbnRhdGlvbiwgYW5kIGRpZmZlcmVudCBwbGF0Zm9ybXMKLXNvbWV0aW1lcyBoYXZlIG9kZCBidWdzLiAgQnJldHQgQ2Fubm9uIGNvbnRyaWJ1dGVkIGEgcG9ydGFibGUKLWltcGxlbWVudGF0aW9uIHRoYXQncyB3cml0dGVuIGluIHB1cmUgUHl0aG9uIGFuZCBzaG91bGQgYmVoYXZlCi1pZGVudGljYWxseSBvbiBhbGwgcGxhdGZvcm1zLgotCi1caXRlbSBUaGUgbmV3IFxtb2R1bGV7dGltZWl0fSBtb2R1bGUgaGVscHMgbWVhc3VyZSBob3cgbG9uZyBzbmlwcGV0cwotb2YgUHl0aG9uIGNvZGUgdGFrZSB0byBleGVjdXRlLiAgVGhlIFxmaWxle3RpbWVpdC5weX0gZmlsZSBjYW4gYmUgcnVuCi1kaXJlY3RseSBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIG9yIHRoZSBtb2R1bGUncyBcY2xhc3N7VGltZXJ9IGNsYXNzCi1jYW4gYmUgaW1wb3J0ZWQgYW5kIHVzZWQgZGlyZWN0bHkuICBIZXJlJ3MgYSBzaG9ydCBleGFtcGxlIHRoYXQKLWZpZ3VyZXMgb3V0IHdoZXRoZXIgaXQncyBmYXN0ZXIgdG8gY29udmVydCBhbiA4LWJpdCBzdHJpbmcgdG8gVW5pY29kZQotYnkgYXBwZW5kaW5nIGFuIGVtcHR5IFVuaWNvZGUgc3RyaW5nIHRvIGl0IG9yIGJ5IHVzaW5nIHRoZQotXGZ1bmN0aW9ue3VuaWNvZGUoKX0gZnVuY3Rpb246Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCB0aW1laXQKLQotdGltZXIxID0gdGltZWl0LlRpbWVyKCd1bmljb2RlKCJhYmMiKScpCi10aW1lcjIgPSB0aW1laXQuVGltZXIoJyJhYmMiICsgdSIiJykKLQotIyBSdW4gdGhyZWUgdHJpYWxzCi1wcmludCB0aW1lcjEucmVwZWF0KHJlcGVhdD0zLCBudW1iZXI9MTAwMDAwKQotcHJpbnQgdGltZXIyLnJlcGVhdChyZXBlYXQ9MywgbnVtYmVyPTEwMDAwMCkKLQotIyBPbiBteSBsYXB0b3AgdGhpcyBvdXRwdXRzOgotIyBbMC4zNjgzMTc5NjE2OTI4MTAwNiwgMC4zNzQ0MTY5NDczNjQ4MDcxMywgMC4zNTMwNDg5MjA2MzE0MDg2OV0KLSMgWzAuMTc1NzQ0MDU2NzAxNjYwMTYsIDAuMTgxOTM1MDcxOTQ1MTkwNDMsIDAuMTc1NjU3OTg3NTk0NjA0NDldCi1cZW5ke3ZlcmJhdGltfQotCi1caXRlbSBUaGUgXG1vZHVsZXtUaXh9IG1vZHVsZSBoYXMgcmVjZWl2ZWQgdmFyaW91cyBidWcgZml4ZXMgYW5kCi11cGRhdGVzIGZvciB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBUaXggcGFja2FnZS4KLQotXGl0ZW0gVGhlIFxtb2R1bGV7VGtpbnRlcn0gbW9kdWxlIG5vdyB3b3JrcyB3aXRoIGEgdGhyZWFkLWVuYWJsZWQgCi12ZXJzaW9uIG9mIFRjbC4gIFRjbCdzIHRocmVhZGluZyBtb2RlbCByZXF1aXJlcyB0aGF0IHdpZGdldHMgb25seSBiZQotYWNjZXNzZWQgZnJvbSB0aGUgdGhyZWFkIGluIHdoaWNoIHRoZXkncmUgY3JlYXRlZDsgYWNjZXNzZXMgZnJvbQotYW5vdGhlciB0aHJlYWQgY2FuIGNhdXNlIFRjbCB0byBwYW5pYy4gIEZvciBjZXJ0YWluIFRjbCBpbnRlcmZhY2VzLAotXG1vZHVsZXtUa2ludGVyfSB3aWxsIG5vdyBhdXRvbWF0aWNhbGx5IGF2b2lkIHRoaXMgCi13aGVuIGEgd2lkZ2V0IGlzIGFjY2Vzc2VkIGZyb20gYSBkaWZmZXJlbnQgdGhyZWFkIGJ5IG1hcnNoYWxsaW5nIGEKLWNvbW1hbmQsIHBhc3NpbmcgaXQgdG8gdGhlIGNvcnJlY3QgdGhyZWFkLCBhbmQgd2FpdGluZyBmb3IgdGhlCi1yZXN1bHRzLiAgT3RoZXIgaW50ZXJmYWNlcyBjYW4ndCBiZSBoYW5kbGVkIGF1dG9tYXRpY2FsbHkgYnV0Ci1cbW9kdWxle1RraW50ZXJ9IHdpbGwgbm93IHJhaXNlIGFuIGV4Y2VwdGlvbiBvbiBzdWNoIGFuIGFjY2VzcyBzbyB0aGF0Ci15b3UgY2FuIGF0IGxlYXN0IGZpbmQgb3V0IGFib3V0IHRoZSBwcm9ibGVtLiAgU2VlCi1cdXJse2h0dHA6Ly9tYWlsLnB5dGhvbi5vcmcvcGlwZXJtYWlsL3B5dGhvbi1kZXYvMjAwMi1EZWNlbWJlci8wMzExMDcuaHRtbH0gJQotZm9yIGEgbW9yZSBkZXRhaWxlZCBleHBsYW5hdGlvbiBvZiB0aGlzIGNoYW5nZS4gIChJbXBsZW1lbnRlZCBieQotTWFydGluIHZvbn5MXCJvd2lzLikKLQotXGl0ZW0gQ2FsbGluZyBUY2wgbWV0aG9kcyB0aHJvdWdoIFxtb2R1bGV7X3RraW50ZXJ9IG5vIGxvbmdlciAKLXJldHVybnMgb25seSBzdHJpbmdzLiBJbnN0ZWFkLCBpZiBUY2wgcmV0dXJucyBvdGhlciBvYmplY3RzIHRob3NlCi1vYmplY3RzIGFyZSBjb252ZXJ0ZWQgdG8gdGhlaXIgUHl0aG9uIGVxdWl2YWxlbnQsIGlmIG9uZSBleGlzdHMsIG9yCi13cmFwcGVkIHdpdGggYSBcY2xhc3N7X3RraW50ZXIuVGNsX09ian0gb2JqZWN0IGlmIG5vIFB5dGhvbiBlcXVpdmFsZW50Ci1leGlzdHMuIFRoaXMgYmVoYXZpb3IgY2FuIGJlIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUKLVxtZXRob2R7d2FudG9iamVjdHMoKX0gbWV0aG9kIG9mIFxjbGFzc3t0a2FwcH0gb2JqZWN0cy4KLQotV2hlbiB1c2luZyBcbW9kdWxle190a2ludGVyfSB0aHJvdWdoIHRoZSBcbW9kdWxle1RraW50ZXJ9IG1vZHVsZSAoYXMKLW1vc3QgVGtpbnRlciBhcHBsaWNhdGlvbnMgd2lsbCksIHRoaXMgZmVhdHVyZSBpcyBhbHdheXMgYWN0aXZhdGVkLiBJdAotc2hvdWxkIG5vdCBjYXVzZSBjb21wYXRpYmlsaXR5IHByb2JsZW1zLCBzaW5jZSBUa2ludGVyIHdvdWxkIGFsd2F5cwotY29udmVydCBzdHJpbmcgcmVzdWx0cyB0byBQeXRob24gdHlwZXMgd2hlcmUgcG9zc2libGUuCi0KLUlmIGFueSBpbmNvbXBhdGliaWxpdGllcyBhcmUgZm91bmQsIHRoZSBvbGQgYmVoYXZpb3IgY2FuIGJlIHJlc3RvcmVkCi1ieSBzZXR0aW5nIHRoZSBcbWVtYmVye3dhbnRvYmplY3RzfSB2YXJpYWJsZSBpbiB0aGUgXG1vZHVsZXtUa2ludGVyfQotbW9kdWxlIHRvIGZhbHNlIGJlZm9yZSBjcmVhdGluZyB0aGUgZmlyc3QgXGNsYXNze3RrYXBwfSBvYmplY3QuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCBUa2ludGVyCi1Ua2ludGVyLndhbnRvYmplY3RzID0gMAotXGVuZHt2ZXJiYXRpbX0KLQotQW55IGJyZWFrYWdlIGNhdXNlZCBieSB0aGlzIGNoYW5nZSBzaG91bGQgYmUgcmVwb3J0ZWQgYXMgYSBidWcuCi0KLVxpdGVtIFRoZSBcbW9kdWxle1VzZXJEaWN0fSBtb2R1bGUgaGFzIGEgbmV3IFxjbGFzc3tEaWN0TWl4aW59IGNsYXNzIHdoaWNoCi1kZWZpbmVzIGFsbCBkaWN0aW9uYXJ5IG1ldGhvZHMgZm9yIGNsYXNzZXMgdGhhdCBhbHJlYWR5IGhhdmUgYSBtaW5pbXVtCi1tYXBwaW5nIGludGVyZmFjZS4gIFRoaXMgZ3JlYXRseSBzaW1wbGlmaWVzIHdyaXRpbmcgY2xhc3NlcyB0aGF0IG5lZWQKLXRvIGJlIHN1YnN0aXR1dGFibGUgZm9yIGRpY3Rpb25hcmllcywgc3VjaCBhcyB0aGUgY2xhc3NlcyBpbiAKLXRoZSBcbW9kdWxle3NoZWx2ZX0gbW9kdWxlLgotIAotQWRkaW5nIHRoZSBtaXgtaW4gYXMgYSBzdXBlcmNsYXNzIHByb3ZpZGVzIHRoZSBmdWxsIGRpY3Rpb25hcnkKLWludGVyZmFjZSB3aGVuZXZlciB0aGUgY2xhc3MgZGVmaW5lcyBcbWV0aG9ke19fZ2V0aXRlbV9ffSwKLVxtZXRob2R7X19zZXRpdGVtX199LCBcbWV0aG9ke19fZGVsaXRlbV9ffSwgYW5kIFxtZXRob2R7a2V5c30uCi1Gb3IgZXhhbXBsZToKLSAKLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgVXNlckRpY3QKLT4+PiBjbGFzcyBTZXFEaWN0KFVzZXJEaWN0LkRpY3RNaXhpbik6Ci0uLi4gICAgICIiIkRpY3Rpb25hcnkgbG9va2FsaWtlIGltcGxlbWVudGVkIHdpdGggbGlzdHMuIiIiCi0uLi4gICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLS4uLiAgICAgICAgIHNlbGYua2V5bGlzdCA9IFtdCi0uLi4gICAgICAgICBzZWxmLnZhbHVlbGlzdCA9IFtdCi0uLi4gICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgotLi4uICAgICAgICAgdHJ5OgotLi4uICAgICAgICAgICAgIGkgPSBzZWxmLmtleWxpc3QuaW5kZXgoa2V5KQotLi4uICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0uLi4gICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IKLS4uLiAgICAgICAgIHJldHVybiBzZWxmLnZhbHVlbGlzdFtpXQotLi4uICAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6Ci0uLi4gICAgICAgICB0cnk6Ci0uLi4gICAgICAgICAgICAgaSA9IHNlbGYua2V5bGlzdC5pbmRleChrZXkpCi0uLi4gICAgICAgICAgICAgc2VsZi52YWx1ZWxpc3RbaV0gPSB2YWx1ZQotLi4uICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0uLi4gICAgICAgICAgICAgc2VsZi5rZXlsaXN0LmFwcGVuZChrZXkpCi0uLi4gICAgICAgICAgICAgc2VsZi52YWx1ZWxpc3QuYXBwZW5kKHZhbHVlKQotLi4uICAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KToKLS4uLiAgICAgICAgIHRyeToKLS4uLiAgICAgICAgICAgICBpID0gc2VsZi5rZXlsaXN0LmluZGV4KGtleSkKLS4uLiAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotLi4uICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yCi0uLi4gICAgICAgICBzZWxmLmtleWxpc3QucG9wKGkpCi0uLi4gICAgICAgICBzZWxmLnZhbHVlbGlzdC5wb3AoaSkKLS4uLiAgICAgZGVmIGtleXMoc2VsZik6Ci0uLi4gICAgICAgICByZXR1cm4gbGlzdChzZWxmLmtleWxpc3QpCi0uLi4gCi0+Pj4gcyA9IFNlcURpY3QoKQotPj4+IGRpcihzKSAgICAgICMgU2VlIHRoYXQgb3RoZXIgZGljdGlvbmFyeSBtZXRob2RzIGFyZSBpbXBsZW1lbnRlZAotWydfX2NtcF9fJywgJ19fY29udGFpbnNfXycsICdfX2RlbGl0ZW1fXycsICdfX2RvY19fJywgJ19fZ2V0aXRlbV9fJywKLSAnX19pbml0X18nLCAnX19pdGVyX18nLCAnX19sZW5fXycsICdfX21vZHVsZV9fJywgJ19fcmVwcl9fJywKLSAnX19zZXRpdGVtX18nLCAnY2xlYXInLCAnZ2V0JywgJ2hhc19rZXknLCAnaXRlbXMnLCAnaXRlcml0ZW1zJywKLSAnaXRlcmtleXMnLCAnaXRlcnZhbHVlcycsICdrZXlsaXN0JywgJ2tleXMnLCAncG9wJywgJ3BvcGl0ZW0nLAotICdzZXRkZWZhdWx0JywgJ3VwZGF0ZScsICd2YWx1ZWxpc3QnLCAndmFsdWVzJ10KLVxlbmR7dmVyYmF0aW19Ci0KLShDb250cmlidXRlZCBieSBSYXltb25kIEhldHRpbmdlci4pCi0KLVxpdGVtIFRoZSBET00gaW1wbGVtZW50YXRpb24KLWluIFxtb2R1bGV7eG1sLmRvbS5taW5pZG9tfSBjYW4gbm93IGdlbmVyYXRlIFhNTCBvdXRwdXQgaW4gYQotcGFydGljdWxhciBlbmNvZGluZyBieSBwcm92aWRpbmcgYW4gb3B0aW9uYWwgZW5jb2RpbmcgYXJndW1lbnQgdG8KLXRoZSBcbWV0aG9ke3RveG1sKCl9IGFuZCBcbWV0aG9ke3RvcHJldHR5eG1sKCl9IG1ldGhvZHMgb2YgRE9NIG5vZGVzLgotCi1caXRlbSBUaGUgXG1vZHVsZXt4bWxycGNsaWJ9IG1vZHVsZSBub3cgc3VwcG9ydHMgYW4gWE1MLVJQQyBleHRlbnNpb24KLWZvciBoYW5kbGluZyBuaWwgZGF0YSB2YWx1ZXMgc3VjaCBhcyBQeXRob24ncyBcY29kZXtOb25lfS4gIE5pbCB2YWx1ZXMKLWFyZSBhbHdheXMgc3VwcG9ydGVkIG9uIHVubWFyc2hhbGxpbmcgYW4gWE1MLVJQQyByZXNwb25zZS4gIFRvCi1nZW5lcmF0ZSByZXF1ZXN0cyBjb250YWluaW5nIFxjb2Rle05vbmV9LCB5b3UgbXVzdCBzdXBwbHkgYSB0cnVlIHZhbHVlCi1mb3IgdGhlIFx2YXJ7YWxsb3dfbm9uZX0gcGFyYW1ldGVyIHdoZW4gY3JlYXRpbmcgYSBcY2xhc3N7TWFyc2hhbGxlcn0KLWluc3RhbmNlLgotCi1caXRlbSBUaGUgbmV3IFxtb2R1bGV7RG9jWE1MUlBDU2VydmVyfSBtb2R1bGUgYWxsb3dzIHdyaXRpbmcKLXNlbGYtZG9jdW1lbnRpbmcgWE1MLVJQQyBzZXJ2ZXJzLiBSdW4gaXQgaW4gZGVtbyBtb2RlIChhcyBhIHByb2dyYW0pCi10byBzZWUgaXQgaW4gYWN0aW9uLiAgIFBvaW50aW5nIHRoZSBXZWIgYnJvd3NlciB0byB0aGUgUlBDIHNlcnZlcgotcHJvZHVjZXMgcHlkb2Mtc3R5bGUgZG9jdW1lbnRhdGlvbjsgcG9pbnRpbmcgeG1scnBjbGliIHRvIHRoZQotc2VydmVyIGFsbG93cyBpbnZva2luZyB0aGUgYWN0dWFsIG1ldGhvZHMuCi0oQ29udHJpYnV0ZWQgYnkgQnJpYW4gUXVpbmxhbi4pCi0KLVxpdGVtIFN1cHBvcnQgZm9yIGludGVybmF0aW9uYWxpemVkIGRvbWFpbiBuYW1lcyAoUkZDcyAzNDU0LCAzNDkwLAotMzQ5MSwgYW5kIDM0OTIpIGhhcyBiZWVuIGFkZGVkLiBUaGUgYGBpZG5hJycgZW5jb2RpbmcgY2FuIGJlIHVzZWQKLXRvIGNvbnZlcnQgYmV0d2VlbiBhIFVuaWNvZGUgZG9tYWluIG5hbWUgYW5kIHRoZSBBU0NJSS1jb21wYXRpYmxlCi1lbmNvZGluZyAoQUNFKSBvZiB0aGF0IG5hbWUuCi0KLVxiZWdpbnthbGx0dH0KLT57fT57fT4gdSJ3d3cuQWxsaWFuY2VmcmFuXGMgY2Fpc2UubnUiLmVuY29kZSgiaWRuYSIpCi0nd3d3LnhuLS1hbGxpYW5jZWZyYW5haXNlLW5wYi5udScKLVxlbmR7YWxsdHR9Ci0KLVRoZSBcbW9kdWxle3NvY2tldH0gbW9kdWxlIGhhcyBhbHNvIGJlZW4gZXh0ZW5kZWQgdG8gdHJhbnNwYXJlbnRseQotY29udmVydCBVbmljb2RlIGhvc3RuYW1lcyB0byB0aGUgQUNFIHZlcnNpb24gYmVmb3JlIHBhc3NpbmcgdGhlbSB0bwotdGhlIEMgbGlicmFyeS4gIE1vZHVsZXMgdGhhdCBkZWFsIHdpdGggaG9zdG5hbWVzIHN1Y2ggYXMKLVxtb2R1bGV7aHR0cGxpYn0gYW5kIFxtb2R1bGV7ZnRwbGlifSkgYWxzbyBzdXBwb3J0IFVuaWNvZGUgaG9zdCBuYW1lczsKLVxtb2R1bGV7aHR0cGxpYn0gYWxzbyBzZW5kcyBIVFRQIFxzYW1we0hvc3R9IGhlYWRlcnMgdXNpbmcgdGhlIEFDRQotdmVyc2lvbiBvZiB0aGUgZG9tYWluIG5hbWUuICBcbW9kdWxle3VybGxpYn0gc3VwcG9ydHMgVW5pY29kZSBVUkxzCi13aXRoIG5vbi1BU0NJSSBob3N0IG5hbWVzIGFzIGxvbmcgYXMgdGhlIFxjb2Rle3BhdGh9IHBhcnQgb2YgdGhlIFVSTAotaXMgQVNDSUkgb25seS4KLQotVG8gaW1wbGVtZW50IHRoaXMgY2hhbmdlLCB0aGUgXG1vZHVsZXtzdHJpbmdwcmVwfSBtb2R1bGUsIHRoZSAKLVxjb2Rle21rc3RyaW5ncHJlcH0gdG9vbCBhbmQgdGhlIFxjb2Rle3B1bnljb2RlfSBlbmNvZGluZyBoYXZlIGJlZW4gYWRkZWQuICAKLQotXGVuZHtpdGVtaXplfQotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc3Vic2VjdGlvbntEYXRlL1RpbWUgVHlwZX0KLQotRGF0ZSBhbmQgdGltZSB0eXBlcyBzdWl0YWJsZSBmb3IgZXhwcmVzc2luZyB0aW1lc3RhbXBzIHdlcmUgYWRkZWQgYXMKLXRoZSBcbW9kdWxle2RhdGV0aW1lfSBtb2R1bGUuICBUaGUgdHlwZXMgZG9uJ3Qgc3VwcG9ydCBkaWZmZXJlbnQKLWNhbGVuZGFycyBvciBtYW55IGZhbmN5IGZlYXR1cmVzLCBhbmQganVzdCBzdGljayB0byB0aGUgYmFzaWNzIG9mCi1yZXByZXNlbnRpbmcgdGltZS4KLQotVGhlIHRocmVlIHByaW1hcnkgdHlwZXMgYXJlOiBcY2xhc3N7ZGF0ZX0sIHJlcHJlc2VudGluZyBhIGRheSwgbW9udGgsCi1hbmQgeWVhcjsgXGNsYXNze3RpbWV9LCBjb25zaXN0aW5nIG9mIGhvdXIsIG1pbnV0ZSwgYW5kIHNlY29uZDsgYW5kCi1cY2xhc3N7ZGF0ZXRpbWV9LCB3aGljaCBjb250YWlucyBhbGwgdGhlIGF0dHJpYnV0ZXMgb2YgYm90aAotXGNsYXNze2RhdGV9IGFuZCBcY2xhc3N7dGltZX0uICBUaGVyZSdzIGFsc28gYQotXGNsYXNze3RpbWVkZWx0YX0gY2xhc3MgcmVwcmVzZW50aW5nIGRpZmZlcmVuY2VzIGJldHdlZW4gdHdvIHBvaW50cwotaW4gdGltZSwgYW5kIHRpbWUgem9uZSBsb2dpYyBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIGluaGVyaXRpbmcgZnJvbQotdGhlIGFic3RyYWN0IFxjbGFzc3t0emluZm99IGNsYXNzLgotCi1Zb3UgY2FuIGNyZWF0ZSBpbnN0YW5jZXMgb2YgXGNsYXNze2RhdGV9IGFuZCBcY2xhc3N7dGltZX0gYnkgZWl0aGVyCi1zdXBwbHlpbmcga2V5d29yZCBhcmd1bWVudHMgdG8gdGhlIGFwcHJvcHJpYXRlIGNvbnN0cnVjdG9yLAotZS5nLiBcY29kZXtkYXRldGltZS5kYXRlKHllYXI9MTk3MiwgbW9udGg9MTAsIGRheT0xNSl9LCBvciBieSB1c2luZwotb25lIG9mIGEgbnVtYmVyIG9mIGNsYXNzIG1ldGhvZHMuICBGb3IgZXhhbXBsZSwgdGhlIFxtZXRob2R7ZGF0ZS50b2RheSgpfQotY2xhc3MgbWV0aG9kIHJldHVybnMgdGhlIGN1cnJlbnQgbG9jYWwgZGF0ZS4KLQotT25jZSBjcmVhdGVkLCBpbnN0YW5jZXMgb2YgdGhlIGRhdGUvdGltZSBjbGFzc2VzIGFyZSBhbGwgaW1tdXRhYmxlLgotVGhlcmUgYXJlIGEgbnVtYmVyIG9mIG1ldGhvZHMgZm9yIHByb2R1Y2luZyBmb3JtYXR0ZWQgc3RyaW5ncyBmcm9tCi1vYmplY3RzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gaW1wb3J0IGRhdGV0aW1lCi0+Pj4gbm93ID0gZGF0ZXRpbWUuZGF0ZXRpbWUubm93KCkKLT4+PiBub3cuaXNvZm9ybWF0KCkKLScyMDAyLTEyLTMwVDIxOjI3OjAzLjk5NDk1NicKLT4+PiBub3cuY3RpbWUoKSAgIyBPbmx5IGF2YWlsYWJsZSBvbiBkYXRlLCBkYXRldGltZQotJ01vbiBEZWMgMzAgMjE6Mjc6MDMgMjAwMicKLT4+PiBub3cuc3RyZnRpbWUoJyVZICVkICViJykKLScyMDAyIDMwIERlYycKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBcbWV0aG9ke3JlcGxhY2UoKX0gbWV0aG9kIGFsbG93cyBtb2RpZnlpbmcgb25lIG9yIG1vcmUgZmllbGRzIAotb2YgYSBcY2xhc3N7ZGF0ZX0gb3IgXGNsYXNze2RhdGV0aW1lfSBpbnN0YW5jZSwgcmV0dXJuaW5nIGEgbmV3IGluc3RhbmNlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZCA9IGRhdGV0aW1lLmRhdGV0aW1lLm5vdygpCi0+Pj4gZAotZGF0ZXRpbWUuZGF0ZXRpbWUoMjAwMiwgMTIsIDMwLCAyMiwgMTUsIDM4LCA4Mjc3MzgpCi0+Pj4gZC5yZXBsYWNlKHllYXI9MjAwMSwgaG91ciA9IDEyKQotZGF0ZXRpbWUuZGF0ZXRpbWUoMjAwMSwgMTIsIDMwLCAxMiwgMTUsIDM4LCA4Mjc3MzgpCi0+Pj4KLVxlbmR7dmVyYmF0aW19Ci0KLUluc3RhbmNlcyBjYW4gYmUgY29tcGFyZWQsIGhhc2hlZCwgYW5kIGNvbnZlcnRlZCB0byBzdHJpbmdzICh0aGUKLXJlc3VsdCBpcyB0aGUgc2FtZSBhcyB0aGF0IG9mIFxtZXRob2R7aXNvZm9ybWF0KCl9KS4gIFxjbGFzc3tkYXRlfSBhbmQKLVxjbGFzc3tkYXRldGltZX0gaW5zdGFuY2VzIGNhbiBiZSBzdWJ0cmFjdGVkIGZyb20gZWFjaCBvdGhlciwgYW5kCi1hZGRlZCB0byBcY2xhc3N7dGltZWRlbHRhfSBpbnN0YW5jZXMuICBUaGUgbGFyZ2VzdCBtaXNzaW5nIGZlYXR1cmUgaXMKLXRoYXQgdGhlcmUncyBubyBzdGFuZGFyZCBsaWJyYXJ5IHN1cHBvcnQgZm9yIHBhcnNpbmcgc3RyaW5ncyBhbmQgZ2V0dGluZyBiYWNrIGEKLVxjbGFzc3tkYXRlfSBvciBcY2xhc3N7ZGF0ZXRpbWV9LgotCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gdGhlIFx1bGlua3ttb2R1bGUncyByZWZlcmVuY2UKLWRvY3VtZW50YXRpb259ey4uL2xpYi9tb2R1bGUtZGF0ZXRpbWUuaHRtbH0uCi0oQ29udHJpYnV0ZWQgYnkgVGltIFBldGVycy4pCi0KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzdWJzZWN0aW9ue1RoZSBvcHRwYXJzZSBNb2R1bGV9Ci0KLVRoZSBcbW9kdWxle2dldG9wdH0gbW9kdWxlIHByb3ZpZGVzIHNpbXBsZSBwYXJzaW5nIG9mIGNvbW1hbmQtbGluZQotYXJndW1lbnRzLiAgVGhlIG5ldyBcbW9kdWxle29wdHBhcnNlfSBtb2R1bGUgKG9yaWdpbmFsbHkgbmFtZWQgT3B0aWspCi1wcm92aWRlcyBtb3JlIGVsYWJvcmF0ZSBjb21tYW5kLWxpbmUgcGFyc2luZyB0aGF0IGZvbGxvd3MgdGhlIFxVTklYe30KLWNvbnZlbnRpb25zLCBhdXRvbWF0aWNhbGx5IGNyZWF0ZXMgdGhlIG91dHB1dCBmb3IgXGxvbmdwcm9ncmFtb3B0e2hlbHB9LAotYW5kIGNhbiBwZXJmb3JtIGRpZmZlcmVudCBhY3Rpb25zIGZvciBkaWZmZXJlbnQgb3B0aW9ucy4KLQotWW91IHN0YXJ0IGJ5IGNyZWF0aW5nIGFuIGluc3RhbmNlIG9mIFxjbGFzc3tPcHRpb25QYXJzZXJ9IGFuZCB0ZWxsaW5nCi1pdCB3aGF0IHlvdXIgcHJvZ3JhbSdzIG9wdGlvbnMgYXJlLgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgc3lzCi1mcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXIKLQotb3AgPSBPcHRpb25QYXJzZXIoKQotb3AuYWRkX29wdGlvbignLWknLCAnLS1pbnB1dCcsCi0gICAgICAgICAgICAgIGFjdGlvbj0nc3RvcmUnLCB0eXBlPSdzdHJpbmcnLCBkZXN0PSdpbnB1dCcsCi0gICAgICAgICAgICAgIGhlbHA9J3NldCBpbnB1dCBmaWxlbmFtZScpCi1vcC5hZGRfb3B0aW9uKCctbCcsICctLWxlbmd0aCcsCi0gICAgICAgICAgICAgIGFjdGlvbj0nc3RvcmUnLCB0eXBlPSdpbnQnLCBkZXN0PSdsZW5ndGgnLAotICAgICAgICAgICAgICBoZWxwPSdzZXQgbWF4aW11bSBsZW5ndGggb2Ygb3V0cHV0JykKLVxlbmR7dmVyYmF0aW19Ci0KLVBhcnNpbmcgYSBjb21tYW5kIGxpbmUgaXMgdGhlbiBkb25lIGJ5IGNhbGxpbmcgdGhlIFxtZXRob2R7cGFyc2VfYXJncygpfQotbWV0aG9kLgotCi1cYmVnaW57dmVyYmF0aW19Ci1vcHRpb25zLCBhcmdzID0gb3AucGFyc2VfYXJncyhzeXMuYXJndlsxOl0pCi1wcmludCBvcHRpb25zCi1wcmludCBhcmdzCi1cZW5ke3ZlcmJhdGltfQotCi1UaGlzIHJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBvcHRpb24gdmFsdWVzLAotYW5kIGEgbGlzdCBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMuIAotCi1JbnZva2luZyB0aGUgc2NyaXB0IHdpdGggdGhlIHZhcmlvdXMgYXJndW1lbnRzIG5vdyB3b3JrcyBhcyB5b3UnZAotZXhwZWN0IGl0IHRvLiAgTm90ZSB0aGF0IHRoZSBsZW5ndGggYXJndW1lbnQgaXMgYXV0b21hdGljYWxseQotY29udmVydGVkIHRvIGFuIGludGVnZXIuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLSQgLi9weXRob24gb3B0LnB5IC1pIGRhdGEgYXJnMQotPFZhbHVlcyBhdCAweDQwMGNhZDRjOiB7J2lucHV0JzogJ2RhdGEnLCAnbGVuZ3RoJzogTm9uZX0+Ci1bJ2FyZzEnXQotJCAuL3B5dGhvbiBvcHQucHkgLS1pbnB1dD1kYXRhIC0tbGVuZ3RoPTQKLTxWYWx1ZXMgYXQgMHg0MDBjYWQyYzogeydpbnB1dCc6ICdkYXRhJywgJ2xlbmd0aCc6IDR9PgotW10KLSQKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBoZWxwIG1lc3NhZ2UgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZm9yIHlvdToKLQotXGJlZ2lue3ZlcmJhdGltfQotJCAuL3B5dGhvbiBvcHQucHkgLS1oZWxwCi11c2FnZTogb3B0LnB5IFtvcHRpb25zXQotCi1vcHRpb25zOgotICAtaCwgLS1oZWxwICAgICAgICAgICAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAotICAtaUlOUFVULCAtLWlucHV0PUlOUFVUCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXQgaW5wdXQgZmlsZW5hbWUKLSAgLWxMRU5HVEgsIC0tbGVuZ3RoPUxFTkdUSAotICAgICAgICAgICAgICAgICAgICAgICAgc2V0IG1heGltdW0gbGVuZ3RoIG9mIG91dHB1dAotJCAKLVxlbmR7dmVyYmF0aW19Ci0lICQgcHJldmVudCBFbWFjcyB0ZXgtbW9kZSBmcm9tIGdldHRpbmcgY29uZnVzZWQKLQotU2VlIHRoZSBcdWxpbmt7bW9kdWxlJ3MgZG9jdW1lbnRhdGlvbn17Li4vbGliL21vZHVsZS1vcHRwYXJzZS5odG1sfQotZm9yIG1vcmUgZGV0YWlscy4KLQotT3B0aWsgd2FzIHdyaXR0ZW4gYnkgR3JlZyBXYXJkLCB3aXRoIHN1Z2dlc3Rpb25zIGZyb20gdGhlIHJlYWRlcnMgb2YKLXRoZSBHZXRvcHQgU0lHLgotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntQeW1hbGxvYzogQSBTcGVjaWFsaXplZCBPYmplY3QgQWxsb2NhdG9yXGxhYmVse3NlY3Rpb24tcHltYWxsb2N9fQotCi1QeW1hbGxvYywgYSBzcGVjaWFsaXplZCBvYmplY3QgYWxsb2NhdG9yIHdyaXR0ZW4gYnkgVmxhZGltaXIKLU1hcmFuZ296b3YsIHdhcyBhIGZlYXR1cmUgYWRkZWQgdG8gUHl0aG9uIDIuMS4gIFB5bWFsbG9jIGlzIGludGVuZGVkCi10byBiZSBmYXN0ZXIgdGhhbiB0aGUgc3lzdGVtIFxjZnVuY3Rpb257bWFsbG9jKCl9IGFuZCB0byBoYXZlIGxlc3MKLW1lbW9yeSBvdmVyaGVhZCBmb3IgYWxsb2NhdGlvbiBwYXR0ZXJucyB0eXBpY2FsIG9mIFB5dGhvbiBwcm9ncmFtcy4KLVRoZSBhbGxvY2F0b3IgdXNlcyBDJ3MgXGNmdW5jdGlvbnttYWxsb2MoKX0gZnVuY3Rpb24gdG8gZ2V0IGxhcmdlCi1wb29scyBvZiBtZW1vcnkgYW5kIHRoZW4gZnVsZmlsbHMgc21hbGxlciBtZW1vcnkgcmVxdWVzdHMgZnJvbSB0aGVzZQotcG9vbHMuCi0KLUluIDIuMSBhbmQgMi4yLCBweW1hbGxvYyB3YXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIHdhc24ndAotZW5hYmxlZCBieSBkZWZhdWx0OyB5b3UgaGFkIHRvIGV4cGxpY2l0bHkgZW5hYmxlIGl0IHdoZW4gY29tcGlsaW5nCi1QeXRob24gYnkgcHJvdmlkaW5nIHRoZQotXGxvbmdwcm9ncmFtb3B0e3dpdGgtcHltYWxsb2N9IG9wdGlvbiB0byB0aGUgXHByb2dyYW17Y29uZmlndXJlfQotc2NyaXB0LiAgSW4gMi4zLCBweW1hbGxvYyBoYXMgaGFkIGZ1cnRoZXIgZW5oYW5jZW1lbnRzIGFuZCBpcyBub3cKLWVuYWJsZWQgYnkgZGVmYXVsdDsgeW91J2xsIGhhdmUgdG8gc3VwcGx5Ci1cbG9uZ3Byb2dyYW1vcHR7d2l0aG91dC1weW1hbGxvY30gdG8gZGlzYWJsZSBpdC4KLQotVGhpcyBjaGFuZ2UgaXMgdHJhbnNwYXJlbnQgdG8gY29kZSB3cml0dGVuIGluIFB5dGhvbjsgaG93ZXZlciwKLXB5bWFsbG9jIG1heSBleHBvc2UgYnVncyBpbiBDIGV4dGVuc2lvbnMuICBBdXRob3JzIG9mIEMgZXh0ZW5zaW9uCi1tb2R1bGVzIHNob3VsZCB0ZXN0IHRoZWlyIGNvZGUgd2l0aCBweW1hbGxvYyBlbmFibGVkLAotYmVjYXVzZSBzb21lIGluY29ycmVjdCBjb2RlIG1heSBjYXVzZSBjb3JlIGR1bXBzIGF0IHJ1bnRpbWUuICAKLQotVGhlcmUncyBvbmUgcGFydGljdWxhcmx5IGNvbW1vbiBlcnJvciB0aGF0IGNhdXNlcyBwcm9ibGVtcy4gIFRoZXJlIGFyZQotYSBudW1iZXIgb2YgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zIGluIFB5dGhvbidzIEMgQVBJIHRoYXQgaGF2ZQotcHJldmlvdXNseSBqdXN0IGJlZW4gYWxpYXNlcyBmb3IgdGhlIEMgbGlicmFyeSdzIFxjZnVuY3Rpb257bWFsbG9jKCl9Ci1hbmQgXGNmdW5jdGlvbntmcmVlKCl9LCBtZWFuaW5nIHRoYXQgaWYgeW91IGFjY2lkZW50YWxseSBjYWxsZWQKLW1pc21hdGNoZWQgZnVuY3Rpb25zIHRoZSBlcnJvciB3b3VsZG4ndCBiZSBub3RpY2VhYmxlLiAgV2hlbiB0aGUKLW9iamVjdCBhbGxvY2F0b3IgaXMgZW5hYmxlZCwgdGhlc2UgZnVuY3Rpb25zIGFyZW4ndCBhbGlhc2VzIG9mCi1cY2Z1bmN0aW9ue21hbGxvYygpfSBhbmQgXGNmdW5jdGlvbntmcmVlKCl9IGFueSBtb3JlLCBhbmQgY2FsbGluZyB0aGUKLXdyb25nIGZ1bmN0aW9uIHRvIGZyZWUgbWVtb3J5IG1heSBnZXQgeW91IGEgY29yZSBkdW1wLiAgRm9yIGV4YW1wbGUsCi1pZiBtZW1vcnkgd2FzIGFsbG9jYXRlZCB1c2luZyBcY2Z1bmN0aW9ue1B5T2JqZWN0X01hbGxvYygpfSwgaXQgaGFzIHRvCi1iZSBmcmVlZCB1c2luZyBcY2Z1bmN0aW9ue1B5T2JqZWN0X0ZyZWUoKX0sIG5vdCBcY2Z1bmN0aW9ue2ZyZWUoKX0uICBBCi1mZXcgbW9kdWxlcyBpbmNsdWRlZCB3aXRoIFB5dGhvbiBmZWxsIGFmb3VsIG9mIHRoaXMgYW5kIGhhZCB0byBiZQotZml4ZWQ7IGRvdWJ0bGVzcyB0aGVyZSBhcmUgbW9yZSB0aGlyZC1wYXJ0eSBtb2R1bGVzIHRoYXQgd2lsbCBoYXZlIHRoZQotc2FtZSBwcm9ibGVtLgotCi1BcyBwYXJ0IG9mIHRoaXMgY2hhbmdlLCB0aGUgY29uZnVzaW5nIG11bHRpcGxlIGludGVyZmFjZXMgZm9yCi1hbGxvY2F0aW5nIG1lbW9yeSBoYXZlIGJlZW4gY29uc29saWRhdGVkIGRvd24gaW50byB0d28gQVBJIGZhbWlsaWVzLgotTWVtb3J5IGFsbG9jYXRlZCB3aXRoIG9uZSBmYW1pbHkgbXVzdCBub3QgYmUgbWFuaXB1bGF0ZWQgd2l0aAotZnVuY3Rpb25zIGZyb20gdGhlIG90aGVyIGZhbWlseS4gIFRoZXJlIGlzIG9uZSBmYW1pbHkgZm9yIGFsbG9jYXRpbmcKLWNodW5rcyBvZiBtZW1vcnkgYW5kIGFub3RoZXIgZmFtaWx5IG9mIGZ1bmN0aW9ucyBzcGVjaWZpY2FsbHkgZm9yCi1hbGxvY2F0aW5nIFB5dGhvbiBvYmplY3RzLgotCi1cYmVnaW57aXRlbWl6ZX0KLSAgXGl0ZW0gVG8gYWxsb2NhdGUgYW5kIGZyZWUgYW4gdW5kaXN0aW5ndWlzaGVkIGNodW5rIG9mIG1lbW9yeSB1c2UKLSAgdGhlIGBgcmF3IG1lbW9yeScnIGZhbWlseTogXGNmdW5jdGlvbntQeU1lbV9NYWxsb2MoKX0sCi0gIFxjZnVuY3Rpb257UHlNZW1fUmVhbGxvYygpfSwgYW5kIFxjZnVuY3Rpb257UHlNZW1fRnJlZSgpfS4KLQotICBcaXRlbSBUaGUgYGBvYmplY3QgbWVtb3J5JycgZmFtaWx5IGlzIHRoZSBpbnRlcmZhY2UgdG8gdGhlIHB5bWFsbG9jCi0gIGZhY2lsaXR5IGRlc2NyaWJlZCBhYm92ZSBhbmQgaXMgYmlhc2VkIHRvd2FyZHMgYSBsYXJnZSBudW1iZXIgb2YKLSAgYGBzbWFsbCcnIGFsbG9jYXRpb25zOiBcY2Z1bmN0aW9ue1B5T2JqZWN0X01hbGxvY30sCi0gIFxjZnVuY3Rpb257UHlPYmplY3RfUmVhbGxvY30sIGFuZCBcY2Z1bmN0aW9ue1B5T2JqZWN0X0ZyZWV9LgotCi0gIFxpdGVtIFRvIGFsbG9jYXRlIGFuZCBmcmVlIFB5dGhvbiBvYmplY3RzLCB1c2UgdGhlIGBgb2JqZWN0JycgZmFtaWx5Ci0gIFxjZnVuY3Rpb257UHlPYmplY3RfTmV3KCl9LCBcY2Z1bmN0aW9ue1B5T2JqZWN0X05ld1ZhcigpfSwgYW5kCi0gIFxjZnVuY3Rpb257UHlPYmplY3RfRGVsKCl9LgotXGVuZHtpdGVtaXplfQotCi1UaGFua3MgdG8gbG90cyBvZiB3b3JrIGJ5IFRpbSBQZXRlcnMsIHB5bWFsbG9jIGluIDIuMyBhbHNvIHByb3ZpZGVzCi1kZWJ1Z2dpbmcgZmVhdHVyZXMgdG8gY2F0Y2ggbWVtb3J5IG92ZXJ3cml0ZXMgYW5kIGRvdWJsZWQgZnJlZXMgaW4KLWJvdGggZXh0ZW5zaW9uIG1vZHVsZXMgYW5kIGluIHRoZSBpbnRlcnByZXRlciBpdHNlbGYuICBUbyBlbmFibGUgdGhpcwotc3VwcG9ydCwgY29tcGlsZSBhIGRlYnVnZ2luZyB2ZXJzaW9uIG9mIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgYnkKLXJ1bm5pbmcgXHByb2dyYW17Y29uZmlndXJlfSB3aXRoIFxsb25ncHJvZ3JhbW9wdHt3aXRoLXB5ZGVidWd9LgotCi1UbyBhaWQgZXh0ZW5zaW9uIHdyaXRlcnMsIGEgaGVhZGVyIGZpbGUgXGZpbGV7TWlzYy9weW1lbWNvbXBhdC5ofSBpcwotZGlzdHJpYnV0ZWQgd2l0aCB0aGUgc291cmNlIHRvIFB5dGhvbiAyLjMgdGhhdCBhbGxvd3MgUHl0aG9uCi1leHRlbnNpb25zIHRvIHVzZSB0aGUgMi4zIGludGVyZmFjZXMgdG8gbWVtb3J5IGFsbG9jYXRpb24gd2hpbGUKLWNvbXBpbGluZyBhZ2FpbnN0IGFueSB2ZXJzaW9uIG9mIFB5dGhvbiBzaW5jZSAxLjUuMi4gIFlvdSB3b3VsZCBjb3B5Ci10aGUgZmlsZSBmcm9tIFB5dGhvbidzIHNvdXJjZSBkaXN0cmlidXRpb24gYW5kIGJ1bmRsZSBpdCB3aXRoIHRoZQotc291cmNlIG9mIHlvdXIgZXh0ZW5zaW9uLgotCi1cYmVnaW57c2VlYWxzb30KLQotXHNlZXVybHtodHRwOi8vY3ZzLnNvdXJjZWZvcmdlLm5ldC9jZ2ktYmluL3ZpZXdjdnMuY2dpL3B5dGhvbi9weXRob24vZGlzdC9zcmMvT2JqZWN0cy9vYm1hbGxvYy5jfQote0ZvciB0aGUgZnVsbCBkZXRhaWxzIG9mIHRoZSBweW1hbGxvYyBpbXBsZW1lbnRhdGlvbiwgc2VlCi10aGUgY29tbWVudHMgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZSBcZmlsZXtPYmplY3RzL29ibWFsbG9jLmN9IGluIHRoZQotUHl0aG9uIHNvdXJjZSBjb2RlLiAgVGhlIGFib3ZlIGxpbmsgcG9pbnRzIHRvIHRoZSBmaWxlIHdpdGhpbiB0aGUKLVNvdXJjZUZvcmdlIENWUyBicm93c2VyLn0KLQotXGVuZHtzZWVhbHNvfQotCi0KLSUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257QnVpbGQgYW5kIEMgQVBJIENoYW5nZXN9Ci0KLUNoYW5nZXMgdG8gUHl0aG9uJ3MgYnVpbGQgcHJvY2VzcyBhbmQgdG8gdGhlIEMgQVBJIGluY2x1ZGU6Ci0KLVxiZWdpbntpdGVtaXplfQotCi1caXRlbSBUaGUgY3ljbGUgZGV0ZWN0aW9uIGltcGxlbWVudGF0aW9uIHVzZWQgYnkgdGhlIGdhcmJhZ2UgY29sbGVjdGlvbgotaGFzIHByb3ZlbiB0byBiZSBzdGFibGUsIHNvIGl0J3Mgbm93IGJlZW4gbWFkZSBtYW5kYXRvcnkuICBZb3UgY2FuIG5vCi1sb25nZXIgY29tcGlsZSBQeXRob24gd2l0aG91dCBpdCwgYW5kIHRoZQotXGxvbmdwcm9ncmFtb3B0e3dpdGgtY3ljbGUtZ2N9IHN3aXRjaCB0byBccHJvZ3JhbXtjb25maWd1cmV9IGhhcyBiZWVuIHJlbW92ZWQuCi0KLVxpdGVtIFB5dGhvbiBjYW4gbm93IG9wdGlvbmFsbHkgYmUgYnVpbHQgYXMgYSBzaGFyZWQgbGlicmFyeQotKFxmaWxle2xpYnB5dGhvbjIuMy5zb30pIGJ5IHN1cHBseWluZyBcbG9uZ3Byb2dyYW1vcHR7ZW5hYmxlLXNoYXJlZH0KLXdoZW4gcnVubmluZyBQeXRob24ncyBccHJvZ3JhbXtjb25maWd1cmV9IHNjcmlwdC4gIChDb250cmlidXRlZCBieSBPbmRyZWoKLVBhbGtvdnNreS4pCi0KLVxpdGVtIFRoZSBcY3NpbXBsZW1hY3Jve0RMX0VYUE9SVH0gYW5kIFxjc2ltcGxlbWFjcm97RExfSU1QT1JUfSBtYWNyb3MKLWFyZSBub3cgZGVwcmVjYXRlZC4gIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyBmb3IgUHl0aG9uIGV4dGVuc2lvbgotbW9kdWxlcyBzaG91bGQgbm93IGJlIGRlY2xhcmVkIHVzaW5nIHRoZSBuZXcgbWFjcm8KLVxjc2ltcGxlbWFjcm97UHlNT0RJTklUX0ZVTkN9LCB3aGlsZSB0aGUgUHl0aG9uIGNvcmUgd2lsbCBnZW5lcmFsbHkKLXVzZSB0aGUgXGNzaW1wbGVtYWNyb3tQeUFQSV9GVU5DfSBhbmQgXGNzaW1wbGVtYWNyb3tQeUFQSV9EQVRBfQotbWFjcm9zLgotCi1caXRlbSBUaGUgaW50ZXJwcmV0ZXIgY2FuIGJlIGNvbXBpbGVkIHdpdGhvdXQgYW55IGRvY3N0cmluZ3MgZm9yCi10aGUgYnVpbHQtaW4gZnVuY3Rpb25zIGFuZCBtb2R1bGVzIGJ5IHN1cHBseWluZwotXGxvbmdwcm9ncmFtb3B0e3dpdGhvdXQtZG9jLXN0cmluZ3N9IHRvIHRoZSBccHJvZ3JhbXtjb25maWd1cmV9IHNjcmlwdC4KLVRoaXMgbWFrZXMgdGhlIFB5dGhvbiBleGVjdXRhYmxlIGFib3V0IDEwXCUgc21hbGxlciwgYnV0IHdpbGwgYWxzbwotbWVhbiB0aGF0IHlvdSBjYW4ndCBnZXQgaGVscCBmb3IgUHl0aG9uJ3MgYnVpbHQtaW5zLiAgKENvbnRyaWJ1dGVkIGJ5Ci1HdXN0YXZvIE5pZW1leWVyLikKLQotXGl0ZW0gVGhlIFxjZnVuY3Rpb257UHlBcmdfTm9BcmdzKCl9IG1hY3JvIGlzIG5vdyBkZXByZWNhdGVkLCBhbmQgY29kZQotdGhhdCB1c2VzIGl0IHNob3VsZCBiZSBjaGFuZ2VkLiAgRm9yIFB5dGhvbiAyLjIgYW5kIGxhdGVyLCB0aGUgbWV0aG9kCi1kZWZpbml0aW9uIHRhYmxlIGNhbiBzcGVjaWZ5IHRoZQotXGNvbnN0YW50e01FVEhfTk9BUkdTfSBmbGFnLCBzaWduYWxsaW5nIHRoYXQgdGhlcmUgYXJlIG5vIGFyZ3VtZW50cywgYW5kCi10aGUgYXJndW1lbnQgY2hlY2tpbmcgY2FuIHRoZW4gYmUgcmVtb3ZlZC4gIElmIGNvbXBhdGliaWxpdHkgd2l0aAotcHJlLTIuMiB2ZXJzaW9ucyBvZiBQeXRob24gaXMgaW1wb3J0YW50LCB0aGUgY29kZSBjb3VsZCB1c2UKLVxjb2Rle1B5QXJnX1BhcnNlVHVwbGUoXHZhcnthcmdzfSwgIiIpfSBpbnN0ZWFkLCBidXQgdGhpcyB3aWxsIGJlIHNsb3dlcgotdGhhbiB1c2luZyBcY29uc3RhbnR7TUVUSF9OT0FSR1N9LgotCi1caXRlbSBcY2Z1bmN0aW9ue1B5QXJnX1BhcnNlVHVwbGUoKX0gYWNjZXB0cyBuZXcgZm9ybWF0IGNoYXJhY3RlcnMgZm9yIHZhcmlvdXMgc2l6ZXMgb2YgdW5zaWduZWQgaW50ZWdlcnM6IFxzYW1we0J9IGZvciBcY3R5cGV7dW5zaWduZWQgY2hhcn0sCi1cc2FtcHtIfSBmb3IgXGN0eXBle3Vuc2lnbmVkIHNob3J0IGludH0sIAotXHNhbXB7SX0gZm9yIFxjdHlwZXt1bnNpZ25lZCBpbnR9LCAKLWFuZCBcc2FtcHtLfSBmb3IgXGN0eXBle3Vuc2lnbmVkIGxvbmcgbG9uZ30uCi0KLVxpdGVtIEEgbmV3IGZ1bmN0aW9uLCBcY2Z1bmN0aW9ue1B5T2JqZWN0X0RlbEl0ZW1TdHJpbmcoXHZhcnttYXBwaW5nfSwKLWNoYXIgKlx2YXJ7a2V5fSl9IHdhcyBhZGRlZCBhcyBzaG9ydGhhbmQgZm9yCi1cY29kZXtQeU9iamVjdF9EZWxJdGVtKFx2YXJ7bWFwcGluZ30sIFB5U3RyaW5nX05ldyhcdmFye2tleX0pKX0uCi0KLVxpdGVtIEZpbGUgb2JqZWN0cyBub3cgbWFuYWdlIHRoZWlyIGludGVybmFsIHN0cmluZyBidWZmZXIKLWRpZmZlcmVudGx5LCBpbmNyZWFzaW5nIGl0IGV4cG9uZW50aWFsbHkgd2hlbiBuZWVkZWQuICBUaGlzIHJlc3VsdHMgaW4KLXRoZSBiZW5jaG1hcmsgdGVzdHMgaW4gXGZpbGV7TGliL3Rlc3QvdGVzdF9idWZpby5weX0gc3BlZWRpbmcgdXAKLWNvbnNpZGVyYWJseSAoZnJvbSA1NyBzZWNvbmRzIHRvIDEuNyBzZWNvbmRzLCBhY2NvcmRpbmcgdG8gb25lCi1tZWFzdXJlbWVudCkuCi0KLVxpdGVtIEl0J3Mgbm93IHBvc3NpYmxlIHRvIGRlZmluZSBjbGFzcyBhbmQgc3RhdGljIG1ldGhvZHMgZm9yIGEgQwotZXh0ZW5zaW9uIHR5cGUgYnkgc2V0dGluZyBlaXRoZXIgdGhlIFxjb25zdGFudHtNRVRIX0NMQVNTfSBvcgotXGNvbnN0YW50e01FVEhfU1RBVElDfSBmbGFncyBpbiBhIG1ldGhvZCdzIFxjdHlwZXtQeU1ldGhvZERlZn0KLXN0cnVjdHVyZS4KLQotXGl0ZW0gUHl0aG9uIG5vdyBpbmNsdWRlcyBhIGNvcHkgb2YgdGhlIEV4cGF0IFhNTCBwYXJzZXIncyBzb3VyY2UgY29kZSwKLXJlbW92aW5nIGFueSBkZXBlbmRlbmNlIG9uIGEgc3lzdGVtIHZlcnNpb24gb3IgbG9jYWwgaW5zdGFsbGF0aW9uIG9mCi1FeHBhdC4KLQotXGl0ZW0gSWYgeW91IGR5bmFtaWNhbGx5IGFsbG9jYXRlIHR5cGUgb2JqZWN0cyBpbiB5b3VyIGV4dGVuc2lvbiwgeW91Ci1zaG91bGQgYmUgYXdhcmUgb2YgYSBjaGFuZ2UgaW4gdGhlIHJ1bGVzIHJlbGF0aW5nIHRvIHRoZQotXG1lbWJlcntfX21vZHVsZV9ffSBhbmQgXG1lbWJlcntfX25hbWVfX30gYXR0cmlidXRlcy4gIEluIHN1bW1hcnksCi15b3Ugd2lsbCB3YW50IHRvIGVuc3VyZSB0aGUgdHlwZSdzIGRpY3Rpb25hcnkgY29udGFpbnMgYQotXGNvZGV7J19fbW9kdWxlX18nfSBrZXk7IG1ha2luZyB0aGUgbW9kdWxlIG5hbWUgdGhlIHBhcnQgb2YgdGhlIHR5cGUKLW5hbWUgbGVhZGluZyB1cCB0byB0aGUgZmluYWwgcGVyaW9kIHdpbGwgbm8gbG9uZ2VyIGhhdmUgdGhlIGRlc2lyZWQKLWVmZmVjdC4gIEZvciBtb3JlIGRldGFpbCwgcmVhZCB0aGUgQVBJIHJlZmVyZW5jZSBkb2N1bWVudGF0aW9uIG9yIHRoZSAKLXNvdXJjZS4KLQotXGVuZHtpdGVtaXplfQotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc3Vic2VjdGlvbntQb3J0LVNwZWNpZmljIENoYW5nZXN9Ci0KLVN1cHBvcnQgZm9yIGEgcG9ydCB0byBJQk0ncyBPUy8yIHVzaW5nIHRoZSBFTVggcnVudGltZSBlbnZpcm9ubWVudCB3YXMKLW1lcmdlZCBpbnRvIHRoZSBtYWluIFB5dGhvbiBzb3VyY2UgdHJlZS4gIEVNWCBpcyBhIFBPU0lYIGVtdWxhdGlvbgotbGF5ZXIgb3ZlciB0aGUgT1MvMiBzeXN0ZW0gQVBJcy4gIFRoZSBQeXRob24gcG9ydCBmb3IgRU1YIHRyaWVzIHRvCi1zdXBwb3J0IGFsbCB0aGUgUE9TSVgtbGlrZSBjYXBhYmlsaXR5IGV4cG9zZWQgYnkgdGhlIEVNWCBydW50aW1lLCBhbmQKLW1vc3RseSBzdWNjZWVkczsgXGZ1bmN0aW9ue2ZvcmsoKX0gYW5kIFxmdW5jdGlvbntmY250bCgpfSBhcmUKLXJlc3RyaWN0ZWQgYnkgdGhlIGxpbWl0YXRpb25zIG9mIHRoZSB1bmRlcmx5aW5nIGVtdWxhdGlvbiBsYXllci4gIFRoZQotc3RhbmRhcmQgT1MvMiBwb3J0LCB3aGljaCB1c2VzIElCTSdzIFZpc3VhbCBBZ2UgY29tcGlsZXIsIGFsc28gZ2FpbmVkCi1zdXBwb3J0IGZvciBjYXNlLXNlbnNpdGl2ZSBpbXBvcnQgc2VtYW50aWNzIGFzIHBhcnQgb2YgdGhlIGludGVncmF0aW9uCi1vZiB0aGUgRU1YIHBvcnQgaW50byBDVlMuICAoQ29udHJpYnV0ZWQgYnkgQW5kcmV3IE1hY0ludHlyZS4pCi0KLU9uIE1hY09TLCBtb3N0IHRvb2xib3ggbW9kdWxlcyBoYXZlIGJlZW4gd2Vha2xpbmtlZCB0byBpbXByb3ZlCi1iYWNrd2FyZCBjb21wYXRpYmlsaXR5LiAgVGhpcyBtZWFucyB0aGF0IG1vZHVsZXMgd2lsbCBubyBsb25nZXIgZmFpbAotdG8gbG9hZCBpZiBhIHNpbmdsZSByb3V0aW5lIGlzIG1pc3Npbmcgb24gdGhlIGN1cnJlbnQgT1MgdmVyc2lvbi4KLUluc3RlYWQgY2FsbGluZyB0aGUgbWlzc2luZyByb3V0aW5lIHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uLgotKENvbnRyaWJ1dGVkIGJ5IEphY2sgSmFuc2VuLikKLQotVGhlIFJQTSBzcGVjIGZpbGVzLCBmb3VuZCBpbiB0aGUgXGZpbGV7TWlzYy9SUE0vfSBkaXJlY3RvcnkgaW4gdGhlCi1QeXRob24gc291cmNlIGRpc3RyaWJ1dGlvbiwgd2VyZSB1cGRhdGVkIGZvciAyLjMuICAoQ29udHJpYnV0ZWQgYnkKLVNlYW4gUmVpZnNjaG5laWRlci4pCi0KLU90aGVyIG5ldyBwbGF0Zm9ybXMgbm93IHN1cHBvcnRlZCBieSBQeXRob24gaW5jbHVkZSBBdGhlT1MKLShcdXJse2h0dHA6Ly93d3cuYXRoZW9zLmN4L30pLCBHTlUvSHVyZCwgYW5kIE9wZW5WTVMuCi0KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue090aGVyIENoYW5nZXMgYW5kIEZpeGVzIFxsYWJlbHtzZWN0aW9uLW90aGVyfX0KLQotQXMgdXN1YWwsIHRoZXJlIHdlcmUgYSBidW5jaCBvZiBvdGhlciBpbXByb3ZlbWVudHMgYW5kIGJ1Z2ZpeGVzCi1zY2F0dGVyZWQgdGhyb3VnaG91dCB0aGUgc291cmNlIHRyZWUuICBBIHNlYXJjaCB0aHJvdWdoIHRoZSBDVlMgY2hhbmdlCi1sb2dzIGZpbmRzIHRoZXJlIHdlcmUgNTIzIHBhdGNoZXMgYXBwbGllZCBhbmQgNTE0IGJ1Z3MgZml4ZWQgYmV0d2VlbgotUHl0aG9uIDIuMiBhbmQgMi4zLiAgQm90aCBmaWd1cmVzIGFyZSBsaWtlbHkgdG8gYmUgdW5kZXJlc3RpbWF0ZXMuCi0KLVNvbWUgb2YgdGhlIG1vcmUgbm90YWJsZSBjaGFuZ2VzIGFyZToKLQotXGJlZ2lue2l0ZW1pemV9Ci0KLVxpdGVtIElmIHRoZSBcZW52dmFye1BZVEhPTklOU1BFQ1R9IGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCwgdGhlCi1QeXRob24gaW50ZXJwcmV0ZXIgd2lsbCBlbnRlciB0aGUgaW50ZXJhY3RpdmUgcHJvbXB0IGFmdGVyIHJ1bm5pbmcgYQotUHl0aG9uIHByb2dyYW0sIGFzIGlmIFB5dGhvbiBoYWQgYmVlbiBpbnZva2VkIHdpdGggdGhlIFxwcm9ncmFtb3B0ey1pfQotb3B0aW9uLiBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgY2FuIGJlIHNldCBiZWZvcmUgcnVubmluZyB0aGUgUHl0aG9uCi1pbnRlcnByZXRlciwgb3IgaXQgY2FuIGJlIHNldCBieSB0aGUgUHl0aG9uIHByb2dyYW0gYXMgcGFydCBvZiBpdHMKLWV4ZWN1dGlvbi4KLQotXGl0ZW0gVGhlIFxmaWxle3JlZ3J0ZXN0LnB5fSBzY3JpcHQgbm93IHByb3ZpZGVzIGEgd2F5IHRvIGFsbG93IGBgYWxsCi1yZXNvdXJjZXMgZXhjZXB0IFx2YXJ7Zm9vfS4nJyAgQSByZXNvdXJjZSBuYW1lIHBhc3NlZCB0byB0aGUKLVxwcm9ncmFtb3B0ey11fSBvcHRpb24gY2FuIG5vdyBiZSBwcmVmaXhlZCB3aXRoIGEgaHlwaGVuCi0oXGNoYXJhY3RlcnstfSkgdG8gbWVhbiBgYHJlbW92ZSB0aGlzIHJlc291cmNlLicnICBGb3IgZXhhbXBsZSwgdGhlCi1vcHRpb24gYFxjb2Rle1xwcm9ncmFtb3B0ey11fWFsbCwtYnNkZGJ9JyBjb3VsZCBiZSB1c2VkIHRvIGVuYWJsZSB0aGUKLXVzZSBvZiBhbGwgcmVzb3VyY2VzIGV4Y2VwdCBcY29kZXtic2RkYn0uCi0KLVxpdGVtIFRoZSB0b29scyB1c2VkIHRvIGJ1aWxkIHRoZSBkb2N1bWVudGF0aW9uIG5vdyB3b3JrIHVuZGVyIEN5Z3dpbgotYXMgd2VsbCBhcyBcVU5JWC4KLQotXGl0ZW0gVGhlIFxjb2Rle1NFVF9MSU5FTk99IG9wY29kZSBoYXMgYmVlbiByZW1vdmVkLiAgQmFjayBpbiB0aGUKLW1pc3RzIG9mIHRpbWUsIHRoaXMgb3Bjb2RlIHdhcyBuZWVkZWQgdG8gcHJvZHVjZSBsaW5lIG51bWJlcnMgaW4KLXRyYWNlYmFja3MgYW5kIHN1cHBvcnQgdHJhY2UgZnVuY3Rpb25zIChmb3IsIGUuZy4sIFxtb2R1bGV7cGRifSkuCi1TaW5jZSBQeXRob24gMS41LCB0aGUgbGluZSBudW1iZXJzIGluIHRyYWNlYmFja3MgaGF2ZSBiZWVuIGNvbXB1dGVkCi11c2luZyBhIGRpZmZlcmVudCBtZWNoYW5pc20gdGhhdCB3b3JrcyB3aXRoIGBgcHl0aG9uIC1PJycuICBGb3IgUHl0aG9uCi0yLjMgTWljaGFlbCBIdWRzb24gaW1wbGVtZW50ZWQgYSBzaW1pbGFyIHNjaGVtZSB0byBkZXRlcm1pbmUgd2hlbiB0bwotY2FsbCB0aGUgdHJhY2UgZnVuY3Rpb24sIHJlbW92aW5nIHRoZSBuZWVkIGZvciBcY29kZXtTRVRfTElORU5PfQotZW50aXJlbHkuCi0KLUl0IHdvdWxkIGJlIGRpZmZpY3VsdCB0byBkZXRlY3QgYW55IHJlc3VsdGluZyBkaWZmZXJlbmNlIGZyb20gUHl0aG9uCi1jb2RlLCBhcGFydCBmcm9tIGEgc2xpZ2h0IHNwZWVkIHVwIHdoZW4gUHl0aG9uIGlzIHJ1biB3aXRob3V0Ci1ccHJvZ3JhbW9wdHstT30uCi0KLUMgZXh0ZW5zaW9ucyB0aGF0IGFjY2VzcyB0aGUgXG1lbWJlcntmX2xpbmVub30gZmllbGQgb2YgZnJhbWUgb2JqZWN0cwotc2hvdWxkIGluc3RlYWQgY2FsbCBcY29kZXtQeUNvZGVfQWRkcjJMaW5lKGYtPmZfY29kZSwgZi0+Zl9sYXN0aSl9LgotVGhpcyB3aWxsIGhhdmUgdGhlIGFkZGVkIGVmZmVjdCBvZiBtYWtpbmcgdGhlIGNvZGUgd29yayBhcyBkZXNpcmVkCi11bmRlciBgYHB5dGhvbiAtTycnIGluIGVhcmxpZXIgdmVyc2lvbnMgb2YgUHl0aG9uLgotCi1BIG5pZnR5IG5ldyBmZWF0dXJlIGlzIHRoYXQgdHJhY2UgZnVuY3Rpb25zIGNhbiBub3cgYXNzaWduIHRvIHRoZQotXG1lbWJlcntmX2xpbmVub30gYXR0cmlidXRlIG9mIGZyYW1lIG9iamVjdHMsIGNoYW5naW5nIHRoZSBsaW5lIHRoYXQKLXdpbGwgYmUgZXhlY3V0ZWQgbmV4dC4gIEEgXHNhbXB7anVtcH0gY29tbWFuZCBoYXMgYmVlbiBhZGRlZCB0byB0aGUKLVxtb2R1bGV7cGRifSBkZWJ1Z2dlciB0YWtpbmcgYWR2YW50YWdlIG9mIHRoaXMgbmV3IGZlYXR1cmUuCi0oSW1wbGVtZW50ZWQgYnkgUmljaGllIEhpbmRsZS4pCi0KLVxlbmR7aXRlbWl6ZX0KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257UG9ydGluZyB0byBQeXRob24gMi4zfQotCi1UaGlzIHNlY3Rpb24gbGlzdHMgcHJldmlvdXNseSBkZXNjcmliZWQgY2hhbmdlcyB0aGF0IG1heSByZXF1aXJlCi1jaGFuZ2VzIHRvIHlvdXIgY29kZToKLQotXGJlZ2lue2l0ZW1pemV9Ci0KLVxpdGVtIFxrZXl3b3Jke3lpZWxkfSBpcyBub3cgYWx3YXlzIGEga2V5d29yZDsgaWYgaXQncyB1c2VkIGFzIGEKLXZhcmlhYmxlIG5hbWUgaW4geW91ciBjb2RlLCBhIGRpZmZlcmVudCBuYW1lIG11c3QgYmUgY2hvc2VuLgotCi1caXRlbSBGb3Igc3RyaW5ncyBcdmFye1h9IGFuZCBcdmFye1l9LCBcY29kZXtcdmFye1h9IGluIFx2YXJ7WX19IG5vdyB3b3JrcwotaWYgXHZhcntYfSBpcyBtb3JlIHRoYW4gb25lIGNoYXJhY3RlciBsb25nLgotCi1caXRlbSBUaGUgXGZ1bmN0aW9ue2ludCgpfSB0eXBlIGNvbnN0cnVjdG9yIHdpbGwgbm93IHJldHVybiBhIGxvbmcKLWludGVnZXIgaW5zdGVhZCBvZiByYWlzaW5nIGFuIFxleGNlcHRpb257T3ZlcmZsb3dFcnJvcn0gd2hlbiBhIHN0cmluZwotb3IgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGlzIHRvbyBsYXJnZSB0byBmaXQgaW50byBhbiBpbnRlZ2VyLgotCi1caXRlbSBJZiB5b3UgaGF2ZSBVbmljb2RlIHN0cmluZ3MgdGhhdCBjb250YWluIDgtYml0IGNoYXJhY3RlcnMsIHlvdQotbXVzdCBkZWNsYXJlIHRoZSBmaWxlJ3MgZW5jb2RpbmcgKFVURi04LCBMYXRpbi0xLCBvciB3aGF0ZXZlcikgYnkKLWFkZGluZyBhIGNvbW1lbnQgdG8gdGhlIHRvcCBvZiB0aGUgZmlsZS4gIFNlZQotc2VjdGlvbn5ccmVme3NlY3Rpb24tZW5jb2RpbmdzfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotXGl0ZW0gQ2FsbGluZyBUY2wgbWV0aG9kcyB0aHJvdWdoIFxtb2R1bGV7X3RraW50ZXJ9IG5vIGxvbmdlciAKLXJldHVybnMgb25seSBzdHJpbmdzLiBJbnN0ZWFkLCBpZiBUY2wgcmV0dXJucyBvdGhlciBvYmplY3RzIHRob3NlCi1vYmplY3RzIGFyZSBjb252ZXJ0ZWQgdG8gdGhlaXIgUHl0aG9uIGVxdWl2YWxlbnQsIGlmIG9uZSBleGlzdHMsIG9yCi13cmFwcGVkIHdpdGggYSBcY2xhc3N7X3RraW50ZXIuVGNsX09ian0gb2JqZWN0IGlmIG5vIFB5dGhvbiBlcXVpdmFsZW50Ci1leGlzdHMuCi0KLVxpdGVtIExhcmdlIG9jdGFsIGFuZCBoZXggbGl0ZXJhbHMgc3VjaCBhcwotXGNvZGV7MHhmZmZmZmZmZn0gbm93IHRyaWdnZXIgYSBcZXhjZXB0aW9ue0Z1dHVyZVdhcm5pbmd9LiBDdXJyZW50bHkKLXRoZXkncmUgc3RvcmVkIGFzIDMyLWJpdCBudW1iZXJzIGFuZCByZXN1bHQgaW4gYSBuZWdhdGl2ZSB2YWx1ZSwgYnV0Ci1pbiBQeXRob24gMi40IHRoZXknbGwgYmVjb21lIHBvc2l0aXZlIGxvbmcgaW50ZWdlcnMuIAotCi0lIFRoZSBlbXB0eSBncm91cHMgYmVsb3cgcHJldmVudCBjb252ZXJzaW9uIHRvIGd1aWxsZW1ldHMuCi1UaGVyZSBhcmUgYSBmZXcgd2F5cyB0byBmaXggdGhpcyB3YXJuaW5nLiAgSWYgeW91IHJlYWxseSBuZWVkIGEKLXBvc2l0aXZlIG51bWJlciwganVzdCBhZGQgYW4gXHNhbXB7TH0gdG8gdGhlIGVuZCBvZiB0aGUgbGl0ZXJhbC4gIElmCi15b3UncmUgdHJ5aW5nIHRvIGdldCBhIDMyLWJpdCBpbnRlZ2VyIHdpdGggbG93IGJpdHMgc2V0IGFuZCBoYXZlCi1wcmV2aW91c2x5IHVzZWQgYW4gZXhwcmVzc2lvbiBzdWNoIGFzIFxjb2Rle1x0ZXh0YXNjaWl0aWxkZSgxIDx7fTwgMzEpfSwKLWl0J3MgcHJvYmFibHkKLWNsZWFyZXN0IHRvIHN0YXJ0IHdpdGggYWxsIGJpdHMgc2V0IGFuZCBjbGVhciB0aGUgZGVzaXJlZCB1cHBlciBiaXRzLgotRm9yIGV4YW1wbGUsIHRvIGNsZWFyIGp1c3QgdGhlIHRvcCBiaXQgKGJpdCAzMSksIHlvdSBjb3VsZCB3cml0ZQotXGNvZGV7MHhmZmZmZmZmZkwge1wmfXtcdGV4dGFzY2lpdGlsZGV9KDFMPHt9PDMxKX0uCi0KLVxpdGVtIFlvdSBjYW4gbm8gbG9uZ2VyIGRpc2FibGUgYXNzZXJ0aW9ucyBieSBhc3NpZ25pbmcgdG8gXGNvZGV7X19kZWJ1Z19ffS4KLQotXGl0ZW0gVGhlIERpc3R1dGlscyBcZnVuY3Rpb257c2V0dXAoKX0gZnVuY3Rpb24gaGFzIGdhaW5lZCB2YXJpb3VzIG5ldwota2V5d29yZCBhcmd1bWVudHMgc3VjaCBhcyBcdmFye2RlcGVuZHN9LiAgT2xkIHZlcnNpb25zIG9mIHRoZQotRGlzdHV0aWxzIHdpbGwgYWJvcnQgaWYgcGFzc2VkIHVua25vd24ga2V5d29yZHMuICBBIHNvbHV0aW9uIGlzIHRvIGNoZWNrCi1mb3IgdGhlIHByZXNlbmNlIG9mIHRoZSBuZXcgXGZ1bmN0aW9ue2dldF9kaXN0dXRpbF9vcHRpb25zKCl9IGZ1bmN0aW9uCi1pbiB5b3VyIFxmaWxle3NldHVwLnB5fSBhbmQgb25seSB1c2VzIHRoZSBuZXcga2V5d29yZHMKLXdpdGggYSB2ZXJzaW9uIG9mIHRoZSBEaXN0dXRpbHMgdGhhdCBzdXBwb3J0cyB0aGVtOgotCi1cYmVnaW57dmVyYmF0aW19Ci1mcm9tIGRpc3R1dGlscyBpbXBvcnQgY29yZQotCi1rdyA9IHsnc291cmNlcyc6ICdmb28uYycsIC4uLn0KLWlmIGhhc2F0dHIoY29yZSwgJ2dldF9kaXN0dXRpbF9vcHRpb25zJyk6Ci0gICAga3dbJ2RlcGVuZHMnXSA9IFsnZm9vLmgnXQotZXh0ID0gRXh0ZW5zaW9uKCoqa3cpCi1cZW5ke3ZlcmJhdGltfQotCi1caXRlbSBVc2luZyBcY29kZXtOb25lfSBhcyBhIHZhcmlhYmxlIG5hbWUgd2lsbCBub3cgcmVzdWx0IGluIGEKLVxleGNlcHRpb257U3ludGF4V2FybmluZ30gd2FybmluZy4KLQotXGl0ZW0gTmFtZXMgb2YgZXh0ZW5zaW9uIHR5cGVzIGRlZmluZWQgYnkgdGhlIG1vZHVsZXMgaW5jbHVkZWQgd2l0aAotUHl0aG9uIG5vdyBjb250YWluIHRoZSBtb2R1bGUgYW5kIGEgXGNoYXJhY3RlcnsufSBpbiBmcm9udCBvZiB0aGUgdHlwZQotbmFtZS4KLQotXGVuZHtpdGVtaXplfQotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntBY2tub3dsZWRnZW1lbnRzIFxsYWJlbHthY2tzfX0KLQotVGhlIGF1dGhvciB3b3VsZCBsaWtlIHRvIHRoYW5rIHRoZSBmb2xsb3dpbmcgcGVvcGxlIGZvciBvZmZlcmluZwotc3VnZ2VzdGlvbnMsIGNvcnJlY3Rpb25zIGFuZCBhc3Npc3RhbmNlIHdpdGggdmFyaW91cyBkcmFmdHMgb2YgdGhpcwotYXJ0aWNsZTogSmVmZiBCYXVlciwgU2ltb24gQnJ1bm5pbmcsIEJyZXR0IENhbm5vbiwgTWljaGFlbCBDaGVybXNpZGUsCi1BbmRyZXcgRGFsa2UsIFNjb3R0IERhdmlkIERhbmllbHMsIEZyZWR+TC4gRHJha2UsIEpyLiwgRGF2aWQgRnJhc2VyLCAKLUtlbGx5IEdlcmJlciwKLVJheW1vbmQgSGV0dGluZ2VyLCBNaWNoYWVsIEh1ZHNvbiwgQ2hyaXMgTGFtYmVydCwgRGV0bGVmIExhbm5lcnQsCi1NYXJ0aW4gdm9ufkxcIm93aXMsIEFuZHJldyBNYWNJbnR5cmUsIExhbG8gTWFydGlucywgQ2hhZCBOZXR6ZXIsCi1HdXN0YXZvIE5pZW1leWVyLCBOZWFsIE5vcndpdHosIEhhbnMgTm93YWssIENocmlzIFJlZWR5LCBGcmFuY2VzY28KLVJpY2NpYXJkaSwgVmluYXkgU2FqaXAsIE5laWwgU2NoZW1lbmF1ZXIsIFJvbWFuIFN1emksIEphc29uIFRpc2hsZXIsCi1KdXN0IHZhbn5Sb3NzdW0uCi0KLVxlbmR7ZG9jdW1lbnR9CmRpZmYgLS1naXQgYS9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyNC50ZXggYi9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyNC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5OWJjMGUuLjAwMDAwMDAKLS0tIGEvRG9jL3doYXRzbmV3L3doYXRzbmV3MjQudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTc1NyArMCwwIEBACi1cZG9jdW1lbnRjbGFzc3tob3d0b30KLVx1c2VwYWNrYWdle2Rpc3R1dGlsc30KLSUgJElkJAotCi0lIERvbid0IHdyaXRlIGV4dGVuc2l2ZSB0ZXh0IGZvciBuZXcgc2VjdGlvbnM7IEknbGwgZG8gdGhhdC4gIAotJSBGZWVsIGZyZWUgdG8gYWRkIGNvbW1lbnRlZC1vdXQgcmVtaW5kZXJzIG9mIHRoaW5ncyB0aGF0IG5lZWQKLSUgdG8gYmUgY292ZXJlZC4gIC0tYW1rCi0KLVx0aXRsZXtXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjR9Ci1ccmVsZWFzZXsxLjAyfQotXGF1dGhvcntBLk0uXCBLdWNobGluZ30KLVxhdXRob3JhZGRyZXNzewotCVxzdHJvbmd7UHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb259XFwKLQlFbWFpbDogXGVtYWlse2Fta0BhbWsuY2F9Ci19Ci0KLVxiZWdpbntkb2N1bWVudH0KLVxtYWtldGl0bGUKLVx0YWJsZW9mY29udGVudHMKLQotVGhpcyBhcnRpY2xlIGV4cGxhaW5zIHRoZSBuZXcgZmVhdHVyZXMgaW4gUHl0aG9uIDIuNC4xLCByZWxlYXNlZCBvbgotTWFyY2h+MzAsIDIwMDUuCi0KLVB5dGhvbiAyLjQgaXMgYSBtZWRpdW0tc2l6ZWQgcmVsZWFzZS4gIEl0IGRvZXNuJ3QgaW50cm9kdWNlIGFzIG1hbnkKLWNoYW5nZXMgYXMgdGhlIHJhZGljYWwgUHl0aG9uIDIuMiwgYnV0IGludHJvZHVjZXMgbW9yZSBmZWF0dXJlcyB0aGFuCi10aGUgY29uc2VydmF0aXZlIDIuMyByZWxlYXNlLiAgVGhlIG1vc3Qgc2lnbmlmaWNhbnQgbmV3IGxhbmd1YWdlCi1mZWF0dXJlcyBhcmUgZnVuY3Rpb24gZGVjb3JhdG9ycyBhbmQgZ2VuZXJhdG9yIGV4cHJlc3Npb25zOyBtb3N0IG90aGVyCi1jaGFuZ2VzIGFyZSB0byB0aGUgc3RhbmRhcmQgbGlicmFyeS4KLQotQWNjb3JkaW5nIHRvIHRoZSBDVlMgY2hhbmdlIGxvZ3MsIHRoZXJlIHdlcmUgNDgxIHBhdGNoZXMgYXBwbGllZCBhbmQKLTUwMiBidWdzIGZpeGVkIGJldHdlZW4gUHl0aG9uIDIuMyBhbmQgMi40LiAgQm90aCBmaWd1cmVzIGFyZSBsaWtlbHkgdG8KLWJlIHVuZGVyZXN0aW1hdGVzLgotCi1UaGlzIGFydGljbGUgZG9lc24ndCBhdHRlbXB0IHRvIHByb3ZpZGUgYSBjb21wbGV0ZSBzcGVjaWZpY2F0aW9uIG9mCi1ldmVyeSBzaW5nbGUgbmV3IGZlYXR1cmUsIGJ1dCBpbnN0ZWFkIHByb3ZpZGVzIGEgYnJpZWYgaW50cm9kdWN0aW9uIHRvCi1lYWNoIGZlYXR1cmUuICBGb3IgZnVsbCBkZXRhaWxzLCB5b3Ugc2hvdWxkIHJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uCi1mb3IgUHl0aG9uIDIuNCwgc3VjaCBhcyB0aGUgXGNpdGV0aXRsZVsuLi9saWIvbGliLmh0bWxde1B5dGhvbiBMaWJyYXJ5Ci1SZWZlcmVuY2V9IGFuZCB0aGUgXGNpdGV0aXRsZVsuLi9yZWYvcmVmLmh0bWxde1B5dGhvbiBSZWZlcmVuY2UKLU1hbnVhbH0uICBPZnRlbiB5b3Ugd2lsbCBiZSByZWZlcnJlZCB0byB0aGUgUEVQIGZvciBhIHBhcnRpY3VsYXIgbmV3Ci1mZWF0dXJlIGZvciBleHBsYW5hdGlvbnMgb2YgdGhlIGltcGxlbWVudGF0aW9uIGFuZCBkZXNpZ24gcmF0aW9uYWxlLgotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntQRVAgMjE4OiBCdWlsdC1JbiBTZXQgT2JqZWN0c30KLQotUHl0aG9uIDIuMyBpbnRyb2R1Y2VkIHRoZSBcbW9kdWxle3NldHN9IG1vZHVsZS4gIEMgaW1wbGVtZW50YXRpb25zIG9mCi1zZXQgZGF0YSB0eXBlcyBoYXZlIG5vdyBiZWVuIGFkZGVkIHRvIHRoZSBQeXRob24gY29yZSBhcyB0d28gbmV3Ci1idWlsdC1pbiB0eXBlcywgXGZ1bmN0aW9ue3NldChcdmFye2l0ZXJhYmxlfSl9IGFuZAotXGZ1bmN0aW9ue2Zyb3plbnNldChcdmFye2l0ZXJhYmxlfSl9LiAgVGhleSBwcm92aWRlIGhpZ2ggc3BlZWQKLW9wZXJhdGlvbnMgZm9yIG1lbWJlcnNoaXAgdGVzdGluZywgZm9yIGVsaW1pbmF0aW5nIGR1cGxpY2F0ZXMgZnJvbQotc2VxdWVuY2VzLCBhbmQgZm9yIG1hdGhlbWF0aWNhbCBvcGVyYXRpb25zIGxpa2UgdW5pb25zLCBpbnRlcnNlY3Rpb25zLAotZGlmZmVyZW5jZXMsIGFuZCBzeW1tZXRyaWMgZGlmZmVyZW5jZXMuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBhID0gc2V0KCdhYnJhY2FkYWJyYScpICAgICAgICAgICAgICAjIGZvcm0gYSBzZXQgZnJvbSBhIHN0cmluZwotPj4+ICd6JyBpbiBhICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZmFzdCBtZW1iZXJzaGlwIHRlc3RpbmcKLUZhbHNlCi0+Pj4gYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB1bmlxdWUgbGV0dGVycyBpbiBhCi1zZXQoWydhJywgJ3InLCAnYicsICdjJywgJ2QnXSkKLT4+PiAnJy5qb2luKGEpICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgYmFjayBpbnRvIGEgc3RyaW5nCi0nYXJiY2QnCi0KLT4+PiBiID0gc2V0KCdhbGFjYXphbScpICAgICAgICAgICAgICAgICAjIGZvcm0gYSBzZWNvbmQgc2V0Ci0+Pj4gYSAtIGIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsZXR0ZXJzIGluIGEgYnV0IG5vdCBpbiBiCi1zZXQoWydyJywgJ2QnLCAnYiddKQotPj4+IGEgfCBiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbGV0dGVycyBpbiBlaXRoZXIgYSBvciBiCi1zZXQoWydhJywgJ2MnLCAncicsICdkJywgJ2InLCAnbScsICd6JywgJ2wnXSkKLT4+PiBhICYgYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxldHRlcnMgaW4gYm90aCBhIGFuZCBiCi1zZXQoWydhJywgJ2MnXSkKLT4+PiBhIF4gYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxldHRlcnMgaW4gYSBvciBiIGJ1dCBub3QgYm90aAotc2V0KFsncicsICdkJywgJ2InLCAnbScsICd6JywgJ2wnXSkKLQotPj4+IGEuYWRkKCd6JykgICAgICAgICAgICAgICAgICAgICAgICAgICMgYWRkIGEgbmV3IGVsZW1lbnQKLT4+PiBhLnVwZGF0ZSgnd3h5JykgICAgICAgICAgICAgICAgICAgICAjIGFkZCBtdWx0aXBsZSBuZXcgZWxlbWVudHMKLT4+PiBhCi1zZXQoWydhJywgJ2MnLCAnYicsICdkJywgJ3InLCAndycsICd5JywgJ3gnLCAneiddKSAgICAgICAKLT4+PiBhLnJlbW92ZSgneCcpICAgICAgICAgICAgICAgICAgICAgICAjIHRha2Ugb25lIGVsZW1lbnQgb3V0Ci0+Pj4gYQotc2V0KFsnYScsICdjJywgJ2InLCAnZCcsICdyJywgJ3cnLCAneScsICd6J10pICAgICAgIAotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIFxmdW5jdGlvbntmcm96ZW5zZXR9IHR5cGUgaXMgYW4gaW1tdXRhYmxlIHZlcnNpb24gb2YgXGZ1bmN0aW9ue3NldH0uCi1TaW5jZSBpdCBpcyBpbW11dGFibGUgYW5kIGhhc2hhYmxlLCBpdCBtYXkgYmUgdXNlZCBhcyBhIGRpY3Rpb25hcnkga2V5IG9yCi1hcyBhIG1lbWJlciBvZiBhbm90aGVyIHNldC4gIAotCi1UaGUgXG1vZHVsZXtzZXRzfSBtb2R1bGUgcmVtYWlucyBpbiB0aGUgc3RhbmRhcmQgbGlicmFyeSwgYW5kIG1heSBiZQotdXNlZnVsIGlmIHlvdSB3aXNoIHRvIHN1YmNsYXNzIHRoZSBcY2xhc3N7U2V0fSBvciBcY2xhc3N7SW1tdXRhYmxlU2V0fQotY2xhc3Nlcy4gIFRoZXJlIGFyZSBjdXJyZW50bHkgbm8gcGxhbnMgdG8gZGVwcmVjYXRlIHRoZSBtb2R1bGUuCi0KLVxiZWdpbntzZWVhbHNvfQotXHNlZXBlcHsyMTh9e0FkZGluZyBhIEJ1aWx0LUluIFNldCBPYmplY3QgVHlwZX17T3JpZ2luYWxseSBwcm9wb3NlZCBieQotR3JlZyBXaWxzb24gYW5kIHVsdGltYXRlbHkgaW1wbGVtZW50ZWQgYnkgUmF5bW9uZCBIZXR0aW5nZXIufQotXGVuZHtzZWVhbHNvfQotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntQRVAgMjM3OiBVbmlmeWluZyBMb25nIEludGVnZXJzIGFuZCBJbnRlZ2Vyc30KLQotVGhlIGxlbmd0aHkgdHJhbnNpdGlvbiBwcm9jZXNzIGZvciB0aGlzIFBFUCwgYmVndW4gaW4gUHl0aG9uIDIuMiwKLXRha2VzIGFub3RoZXIgc3RlcCBmb3J3YXJkIGluIFB5dGhvbiAyLjQuICBJbiAyLjMsIGNlcnRhaW4gaW50ZWdlcgotb3BlcmF0aW9ucyB0aGF0IHdvdWxkIGJlaGF2ZSBkaWZmZXJlbnRseSBhZnRlciBpbnQvbG9uZyB1bmlmaWNhdGlvbgotdHJpZ2dlcmVkIFxleGNlcHRpb257RnV0dXJlV2FybmluZ30gd2FybmluZ3MgYW5kIHJldHVybmVkIHZhbHVlcwotbGltaXRlZCB0byAzMiBvciA2NCBiaXRzIChkZXBlbmRpbmcgb24geW91ciBwbGF0Zm9ybSkuICBJbiAyLjQsIHRoZXNlCi1leHByZXNzaW9ucyBubyBsb25nZXIgcHJvZHVjZSBhIHdhcm5pbmcgYW5kIGluc3RlYWQgcHJvZHVjZSBhCi1kaWZmZXJlbnQgcmVzdWx0IHRoYXQncyB1c3VhbGx5IGEgbG9uZyBpbnRlZ2VyLgotCi1UaGUgcHJvYmxlbWF0aWMgZXhwcmVzc2lvbnMgYXJlIHByaW1hcmlseSBsZWZ0IHNoaWZ0cyBhbmQgbGVuZ3RoeQotaGV4YWRlY2ltYWwgYW5kIG9jdGFsIGNvbnN0YW50cy4gIEZvciBleGFtcGxlLAotXGNvZGV7MiBcdGV4dGxlc3N7fVx0ZXh0bGVzc3t9IDMyfSByZXN1bHRzCi1pbiBhIHdhcm5pbmcgaW4gMi4zLCBldmFsdWF0aW5nIHRvIDAgb24gMzItYml0IHBsYXRmb3Jtcy4gIEluIFB5dGhvbgotMi40LCB0aGlzIGV4cHJlc3Npb24gbm93IHJldHVybnMgdGhlIGNvcnJlY3QgYW5zd2VyLCA4NTg5OTM0NTkyLgotCi1cYmVnaW57c2VlYWxzb30KLVxzZWVwZXB7MjM3fXtVbmlmeWluZyBMb25nIEludGVnZXJzIGFuZCBJbnRlZ2Vyc317T3JpZ2luYWwgUEVQCi13cml0dGVuIGJ5IE1vc2hlIFphZGthIGFuZCBHdlIuICBUaGUgY2hhbmdlcyBmb3IgMi40IHdlcmUgaW1wbGVtZW50ZWQgYnkgCi1LYWxsZSBTdmVuc3Nvbi59Ci1cZW5ke3NlZWFsc299Ci0KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue1BFUCAyODk6IEdlbmVyYXRvciBFeHByZXNzaW9uc30KLQotVGhlIGl0ZXJhdG9yIGZlYXR1cmUgaW50cm9kdWNlZCBpbiBQeXRob24gMi4yIGFuZCB0aGUKLVxtb2R1bGV7aXRlcnRvb2xzfSBtb2R1bGUgbWFrZSBpdCBlYXNpZXIgdG8gd3JpdGUgcHJvZ3JhbXMgdGhhdCBsb29wCi10aHJvdWdoIGxhcmdlIGRhdGEgc2V0cyB3aXRob3V0IGhhdmluZyB0aGUgZW50aXJlIGRhdGEgc2V0IGluIG1lbW9yeQotYXQgb25lIHRpbWUuICBMaXN0IGNvbXByZWhlbnNpb25zIGRvbid0IGZpdCBpbnRvIHRoaXMgcGljdHVyZSB2ZXJ5Ci13ZWxsIGJlY2F1c2UgdGhleSBwcm9kdWNlIGEgUHl0aG9uIGxpc3Qgb2JqZWN0IGNvbnRhaW5pbmcgYWxsIG9mIHRoZQotaXRlbXMuICBUaGlzIHVuYXZvaWRhYmx5IHB1bGxzIGFsbCBvZiB0aGUgb2JqZWN0cyBpbnRvIG1lbW9yeSwgd2hpY2gKLWNhbiBiZSBhIHByb2JsZW0gaWYgeW91ciBkYXRhIHNldCBpcyB2ZXJ5IGxhcmdlLiAgV2hlbiB0cnlpbmcgdG8gd3JpdGUKLWEgZnVuY3Rpb25hbGx5LXN0eWxlZCBwcm9ncmFtLCBpdCB3b3VsZCBiZSBuYXR1cmFsIHRvIHdyaXRlIHNvbWV0aGluZwotbGlrZToKLQotXGJlZ2lue3ZlcmJhdGltfQotbGlua3MgPSBbbGluayBmb3IgbGluayBpbiBnZXRfYWxsX2xpbmtzKCkgaWYgbm90IGxpbmsuZm9sbG93ZWRdCi1mb3IgbGluayBpbiBsaW5rczoKLSAgICAuLi4KLVxlbmR7dmVyYmF0aW19Ci0KLWluc3RlYWQgb2YgCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLWZvciBsaW5rIGluIGdldF9hbGxfbGlua3MoKToKLSAgICBpZiBsaW5rLmZvbGxvd2VkOgotICAgICAgICBjb250aW51ZQotICAgIC4uLgotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGZpcnN0IGZvcm0gaXMgbW9yZSBjb25jaXNlIGFuZCBwZXJoYXBzIG1vcmUgcmVhZGFibGUsIGJ1dCBpZgoteW91J3JlIGRlYWxpbmcgd2l0aCBhIGxhcmdlIG51bWJlciBvZiBsaW5rIG9iamVjdHMgeW91J2QgaGF2ZSB0byB3cml0ZQotdGhlIHNlY29uZCBmb3JtIHRvIGF2b2lkIGhhdmluZyBhbGwgbGluayBvYmplY3RzIGluIG1lbW9yeSBhdCB0aGUgc2FtZQotdGltZS4KLQotR2VuZXJhdG9yIGV4cHJlc3Npb25zIHdvcmsgc2ltaWxhcmx5IHRvIGxpc3QgY29tcHJlaGVuc2lvbnMgYnV0IGRvbid0Ci1tYXRlcmlhbGl6ZSB0aGUgZW50aXJlIGxpc3Q7IGluc3RlYWQgdGhleSBjcmVhdGUgYSBnZW5lcmF0b3IgdGhhdCB3aWxsCi1yZXR1cm4gZWxlbWVudHMgb25lIGJ5IG9uZS4gIFRoZSBhYm92ZSBleGFtcGxlIGNvdWxkIGJlIHdyaXR0ZW4gYXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWxpbmtzID0gKGxpbmsgZm9yIGxpbmsgaW4gZ2V0X2FsbF9saW5rcygpIGlmIG5vdCBsaW5rLmZvbGxvd2VkKQotZm9yIGxpbmsgaW4gbGlua3M6Ci0gICAgLi4uCi1cZW5ke3ZlcmJhdGltfQotCi1HZW5lcmF0b3IgZXhwcmVzc2lvbnMgYWx3YXlzIGhhdmUgdG8gYmUgd3JpdHRlbiBpbnNpZGUgcGFyZW50aGVzZXMsIGFzCi1pbiB0aGUgYWJvdmUgZXhhbXBsZS4gIFRoZSBwYXJlbnRoZXNlcyBzaWduYWxsaW5nIGEgZnVuY3Rpb24gY2FsbCBhbHNvCi1jb3VudCwgc28gaWYgeW91IHdhbnQgdG8gY3JlYXRlIGFuIGl0ZXJhdG9yIHRoYXQgd2lsbCBiZSBpbW1lZGlhdGVseQotcGFzc2VkIHRvIGEgZnVuY3Rpb24geW91IGNvdWxkIHdyaXRlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1wcmludCBzdW0ob2JqLmNvdW50IGZvciBvYmogaW4gbGlzdF9hbGxfb2JqZWN0cygpKQotXGVuZHt2ZXJiYXRpbX0KLQotR2VuZXJhdG9yIGV4cHJlc3Npb25zIGRpZmZlciBmcm9tIGxpc3QgY29tcHJlaGVuc2lvbnMgaW4gdmFyaW91cyBzbWFsbAotd2F5cy4gIE1vc3Qgbm90YWJseSwgdGhlIGxvb3AgdmFyaWFibGUgKFx2YXJ7b2JqfSBpbiB0aGUgYWJvdmUKLWV4YW1wbGUpIGlzIG5vdCBhY2Nlc3NpYmxlIG91dHNpZGUgb2YgdGhlIGdlbmVyYXRvciBleHByZXNzaW9uLiAgTGlzdAotY29tcHJlaGVuc2lvbnMgbGVhdmUgdGhlIHZhcmlhYmxlIGFzc2lnbmVkIHRvIGl0cyBsYXN0IHZhbHVlOyBmdXR1cmUKLXZlcnNpb25zIG9mIFB5dGhvbiB3aWxsIGNoYW5nZSB0aGlzLCBtYWtpbmcgbGlzdCBjb21wcmVoZW5zaW9ucyBtYXRjaAotZ2VuZXJhdG9yIGV4cHJlc3Npb25zIGluIHRoaXMgcmVzcGVjdC4KLQotXGJlZ2lue3NlZWFsc299Ci1cc2VlcGVwezI4OX17R2VuZXJhdG9yIEV4cHJlc3Npb25zfXtQcm9wb3NlZCBieSBSYXltb25kIEhldHRpbmdlciBhbmQKLWltcGxlbWVudGVkIGJ5IEppd29uIFNlbyB3aXRoIGVhcmx5IGVmZm9ydHMgc3RlZXJlZCBieSBIeWUtU2hpayBDaGFuZy59Ci1cZW5ke3NlZWFsc299Ci0KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue1BFUCAyOTI6IFNpbXBsZXIgU3RyaW5nIFN1YnN0aXR1dGlvbnN9Ci0KLVNvbWUgbmV3IGNsYXNzZXMgaW4gdGhlIHN0YW5kYXJkIGxpYnJhcnkgcHJvdmlkZSBhbiBhbHRlcm5hdGl2ZQotbWVjaGFuaXNtIGZvciBzdWJzdGl0dXRpbmcgdmFyaWFibGVzIGludG8gc3RyaW5nczsgdGhpcyBzdHlsZSBvZgotc3Vic3RpdHV0aW9uIG1heSBiZSBiZXR0ZXIgZm9yIGFwcGxpY2F0aW9ucyB3aGVyZSB1bnRyYWluZWQKLXVzZXJzIG5lZWQgdG8gZWRpdCB0ZW1wbGF0ZXMuCi0KLVRoZSB1c3VhbCB3YXkgb2Ygc3Vic3RpdHV0aW5nIHZhcmlhYmxlcyBieSBuYW1lIGlzIHRoZSBcY29kZXtcJX0KLW9wZXJhdG9yOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gJyUocGFnZSlpOiAlKHRpdGxlKXMnICUgeydwYWdlJzoyLCAndGl0bGUnOiAnVGhlIEJlc3Qgb2YgVGltZXMnfQotJzI6IFRoZSBCZXN0IG9mIFRpbWVzJwotXGVuZHt2ZXJiYXRpbX0KLQotV2hlbiB3cml0aW5nIHRoZSB0ZW1wbGF0ZSBzdHJpbmcsIGl0IGNhbiBiZSBlYXN5IHRvIGZvcmdldCB0aGUKLVxzYW1we2l9IG9yIFxzYW1we3N9IGFmdGVyIHRoZSBjbG9zaW5nIHBhcmVudGhlc2lzLiAgVGhpcyBpc24ndCBhIGJpZwotcHJvYmxlbSBpZiB0aGUgdGVtcGxhdGUgaXMgaW4gYSBQeXRob24gbW9kdWxlLCBiZWNhdXNlIHlvdSBydW4gdGhlCi1jb2RlLCBnZXQgYW4gYGBVbnN1cHBvcnRlZCBmb3JtYXQgY2hhcmFjdGVyJycgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSwKLWFuZCBmaXggdGhlIHByb2JsZW0uICBIb3dldmVyLCBjb25zaWRlciBhbiBhcHBsaWNhdGlvbiBzdWNoIGFzIE1haWxtYW4KLXdoZXJlIHRlbXBsYXRlIHN0cmluZ3Mgb3IgdHJhbnNsYXRpb25zIGFyZSBiZWluZyBlZGl0ZWQgYnkgdXNlcnMgd2hvCi1hcmVuJ3QgYXdhcmUgb2YgdGhlIFB5dGhvbiBsYW5ndWFnZS4gIFRoZSBmb3JtYXQgc3RyaW5nJ3Mgc3ludGF4IGlzCi1jb21wbGljYXRlZCB0byBleHBsYWluIHRvIHN1Y2ggdXNlcnMsIGFuZCBpZiB0aGV5IG1ha2UgYSBtaXN0YWtlLCBpdCdzCi1kaWZmaWN1bHQgdG8gcHJvdmlkZSBoZWxwZnVsIGZlZWRiYWNrIHRvIHRoZW0uCi0KLVBFUCAyOTIgYWRkcyBhIFxjbGFzc3tUZW1wbGF0ZX0gY2xhc3MgdG8gdGhlIFxtb2R1bGV7c3RyaW5nfSBtb2R1bGUKLXRoYXQgdXNlcyBcc2FtcHtcJH0gdG8gaW5kaWNhdGUgYSBzdWJzdGl0dXRpb246Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgc3RyaW5nCi0+Pj4gdCA9IHN0cmluZy5UZW1wbGF0ZSgnJHBhZ2U6ICR0aXRsZScpCi0+Pj4gdC5zdWJzdGl0dXRlKHsncGFnZSc6MiwgJ3RpdGxlJzogJ1RoZSBCZXN0IG9mIFRpbWVzJ30pCi0nMjogVGhlIEJlc3Qgb2YgVGltZXMnCi1cZW5ke3ZlcmJhdGltfQotCi0lICQgVGVybWluYXRlICQtbW9kZSBmb3IgRW1hY3MKLQotSWYgYSBrZXkgaXMgbWlzc2luZyBmcm9tIHRoZSBkaWN0aW9uYXJ5LCB0aGUgXG1ldGhvZHtzdWJzdGl0dXRlfSBtZXRob2QKLXdpbGwgcmFpc2UgYSBcZXhjZXB0aW9ue0tleUVycm9yfS4gIFRoZXJlJ3MgYWxzbyBhIFxtZXRob2R7c2FmZV9zdWJzdGl0dXRlfQotbWV0aG9kIHRoYXQgaWdub3JlcyBtaXNzaW5nIGtleXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiB0ID0gc3RyaW5nLlRlbXBsYXRlKCckcGFnZTogJHRpdGxlJykKLT4+PiB0LnNhZmVfc3Vic3RpdHV0ZSh7J3BhZ2UnOjN9KQotJzM6ICR0aXRsZScKLVxlbmR7dmVyYmF0aW19Ci0KLSUgJCBUZXJtaW5hdGUgbWF0aC1tb2RlIGZvciBFbWFjcwotCi0KLVxiZWdpbntzZWVhbHNvfQotXHNlZXBlcHsyOTJ9e1NpbXBsZXIgU3RyaW5nIFN1YnN0aXR1dGlvbnN9e1dyaXR0ZW4gYW5kIGltcGxlbWVudGVkIAotYnkgQmFycnkgV2Fyc2F3Ln0KLVxlbmR7c2VlYWxzb30KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257UEVQIDMxODogRGVjb3JhdG9ycyBmb3IgRnVuY3Rpb25zIGFuZCBNZXRob2RzfQotCi1QeXRob24gMi4yIGV4dGVuZGVkIFB5dGhvbidzIG9iamVjdCBtb2RlbCBieSBhZGRpbmcgc3RhdGljIG1ldGhvZHMgYW5kCi1jbGFzcyBtZXRob2RzLCBidXQgaXQgZGlkbid0IGV4dGVuZCBQeXRob24ncyBzeW50YXggdG8gcHJvdmlkZSBhbnkgbmV3Ci13YXkgb2YgZGVmaW5pbmcgc3RhdGljIG9yIGNsYXNzIG1ldGhvZHMuICBJbnN0ZWFkLCB5b3UgaGFkIHRvIHdyaXRlIGEKLVxrZXl3b3Jke2RlZn0gc3RhdGVtZW50IGluIHRoZSB1c3VhbCB3YXksIGFuZCBwYXNzIHRoZSByZXN1bHRpbmcKLW1ldGhvZCB0byBhIFxmdW5jdGlvbntzdGF0aWNtZXRob2QoKX0gb3IgXGZ1bmN0aW9ue2NsYXNzbWV0aG9kKCl9Ci1mdW5jdGlvbiB0aGF0IHdvdWxkIHdyYXAgdXAgdGhlIGZ1bmN0aW9uIGFzIGEgbWV0aG9kIG9mIHRoZSBuZXcgdHlwZS4KLVlvdXIgY29kZSB3b3VsZCBsb29rIGxpa2UgdGhpczoKLQotXGJlZ2lue3ZlcmJhdGltfQotY2xhc3MgQzoKLSAgIGRlZiBtZXRoIChjbHMpOgotICAgICAgIC4uLgotICAgCi0gICBtZXRoID0gY2xhc3NtZXRob2QobWV0aCkgICAjIFJlYmluZCBuYW1lIHRvIHdyYXBwZWQtdXAgY2xhc3MgbWV0aG9kCi1cZW5ke3ZlcmJhdGltfQotCi1JZiB0aGUgbWV0aG9kIHdhcyB2ZXJ5IGxvbmcsIGl0IHdvdWxkIGJlIGVhc3kgdG8gbWlzcyBvciBmb3JnZXQgdGhlCi1cZnVuY3Rpb257Y2xhc3NtZXRob2QoKX0gaW52b2NhdGlvbiBhZnRlciB0aGUgZnVuY3Rpb24gYm9keS4gIAotCi1UaGUgaW50ZW50aW9uIHdhcyBhbHdheXMgdG8gYWRkIHNvbWUgc3ludGF4IHRvIG1ha2Ugc3VjaCBkZWZpbml0aW9ucwotbW9yZSByZWFkYWJsZSwgYnV0IGF0IHRoZSB0aW1lIG9mIDIuMidzIHJlbGVhc2UgYSBnb29kIHN5bnRheCB3YXMgbm90Ci1vYnZpb3VzLiAgVG9kYXkgYSBnb29kIHN5bnRheCBcZW1waHtzdGlsbH0gaXNuJ3Qgb2J2aW91cyBidXQgdXNlcnMgYXJlCi1hc2tpbmcgZm9yIGVhc2llciBhY2Nlc3MgdG8gdGhlIGZlYXR1cmU7IGEgbmV3IHN5bnRhY3RpYyBmZWF0dXJlIGhhcwotYmVlbiBhZGRlZCB0byBtZWV0IHRoaXMgbmVlZC4KLQotVGhlIG5ldyBmZWF0dXJlIGlzIGNhbGxlZCBgYGZ1bmN0aW9uIGRlY29yYXRvcnMnJy4gIFRoZSBuYW1lIGNvbWVzCi1mcm9tIHRoZSBpZGVhIHRoYXQgXGZ1bmN0aW9ue2NsYXNzbWV0aG9kfSwgXGZ1bmN0aW9ue3N0YXRpY21ldGhvZH0sCi1hbmQgZnJpZW5kcyBhcmUgc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGEgZnVuY3Rpb24gb2JqZWN0OwotdGhleSdyZSBcZW1waHtkZWNvcmF0aW5nfSBmdW5jdGlvbnMgd2l0aCBtb3JlIGRldGFpbHMuCi0KLVRoZSBub3RhdGlvbiBib3Jyb3dzIGZyb20gSmF2YSBhbmQgdXNlcyB0aGUgXGNoYXJhY3RlcntAfSBjaGFyYWN0ZXIgYXMgYW4KLWluZGljYXRvci4gIFVzaW5nIHRoZSBuZXcgc3ludGF4LCB0aGUgZXhhbXBsZSBhYm92ZSB3b3VsZCBiZSB3cml0dGVuOgotCi1cYmVnaW57dmVyYmF0aW19Ci1jbGFzcyBDOgotCi0gICBAY2xhc3NtZXRob2QKLSAgIGRlZiBtZXRoIChjbHMpOgotICAgICAgIC4uLgotICAgCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgXGNvZGV7QGNsYXNzbWV0aG9kfSBpcyBzaG9ydGhhbmQgZm9yIHRoZQotXGNvZGV7bWV0aD1jbGFzc21ldGhvZChtZXRoKX0gYXNzaWdubWVudC4gIE1vcmUgZ2VuZXJhbGx5LCBpZiB5b3UgaGF2ZQotdGhlIGZvbGxvd2luZzoKLQotXGJlZ2lue3ZlcmJhdGltfQotQEEKLUBCCi1AQwotZGVmIGYgKCk6Ci0gICAgLi4uCi1cZW5ke3ZlcmJhdGltfQotCi1JdCdzIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZyBwcmUtZGVjb3JhdG9yIGNvZGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWRlZiBmKCk6IC4uLgotZiA9IEEoQihDKGYpKSkKLVxlbmR7dmVyYmF0aW19Ci0KLURlY29yYXRvcnMgbXVzdCBjb21lIG9uIHRoZSBsaW5lIGJlZm9yZSBhIGZ1bmN0aW9uIGRlZmluaXRpb24sIG9uZSBkZWNvcmF0b3IKLXBlciBsaW5lLCBhbmQgY2FuJ3QgYmUgb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgZGVmIHN0YXRlbWVudCwgbWVhbmluZyB0aGF0Ci1cY29kZXtAQSBkZWYgZigpOiAuLi59IGlzIGlsbGVnYWwuICBZb3UgY2FuIG9ubHkgZGVjb3JhdGUgZnVuY3Rpb24KLWRlZmluaXRpb25zLCBlaXRoZXIgYXQgdGhlIG1vZHVsZSBsZXZlbCBvciBpbnNpZGUgYSBjbGFzczsgeW91IGNhbid0Ci1kZWNvcmF0ZSBjbGFzcyBkZWZpbml0aW9ucy4KLQotQSBkZWNvcmF0b3IgaXMganVzdCBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgdGhlIGZ1bmN0aW9uIHRvIGJlIGRlY29yYXRlZCBhcyBhbgotYXJndW1lbnQgYW5kIHJldHVybnMgZWl0aGVyIHRoZSBzYW1lIGZ1bmN0aW9uIG9yIHNvbWUgbmV3IG9iamVjdC4gIFRoZQotcmV0dXJuIHZhbHVlIG9mIHRoZSBkZWNvcmF0b3IgbmVlZCBub3QgYmUgY2FsbGFibGUgKHRob3VnaCBpdCB0eXBpY2FsbHkgaXMpLAotdW5sZXNzIGZ1cnRoZXIgZGVjb3JhdG9ycyB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHJlc3VsdC4gIEl0J3MgZWFzeSB0byB3cml0ZQoteW91ciBvd24gZGVjb3JhdG9ycy4gIFRoZSBmb2xsb3dpbmcgc2ltcGxlIGV4YW1wbGUganVzdCBzZXRzIGFuIGF0dHJpYnV0ZSBvbgotdGhlIGZ1bmN0aW9uIG9iamVjdDoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGRlZiBkZWNvKGZ1bmMpOgotLi4uICAgIGZ1bmMuYXR0ciA9ICdkZWNvcmF0ZWQnCi0uLi4gICAgcmV0dXJuIGZ1bmMKLS4uLgotPj4+IEBkZWNvCi0uLi4gZGVmIGYoKTogcGFzcwotLi4uCi0+Pj4gZgotPGZ1bmN0aW9uIGYgYXQgMHg0MDJlZjBkND4KLT4+PiBmLmF0dHIKLSdkZWNvcmF0ZWQnCi0+Pj4KLVxlbmR7dmVyYmF0aW19Ci0KLUFzIGEgc2xpZ2h0bHkgbW9yZSByZWFsaXN0aWMgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBkZWNvcmF0b3IgY2hlY2tzCi10aGF0IHRoZSBzdXBwbGllZCBhcmd1bWVudCBpcyBhbiBpbnRlZ2VyOgotCi1cYmVnaW57dmVyYmF0aW19Ci1kZWYgcmVxdWlyZV9pbnQgKGZ1bmMpOgotICAgIGRlZiB3cmFwcGVyIChhcmcpOgotICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShhcmcsIGludCkKLSAgICAgICAgcmV0dXJuIGZ1bmMoYXJnKQotCi0gICAgcmV0dXJuIHdyYXBwZXIKLQotQHJlcXVpcmVfaW50Ci1kZWYgcDEgKGFyZyk6Ci0gICAgcHJpbnQgYXJnCi0KLUByZXF1aXJlX2ludAotZGVmIHAyKGFyZyk6Ci0gICAgcHJpbnQgYXJnKjIKLVxlbmR7dmVyYmF0aW19Ci0KLUFuIGV4YW1wbGUgaW4gXHBlcHszMTh9IGNvbnRhaW5zIGEgZmFuY2llciB2ZXJzaW9uIG9mIHRoaXMgaWRlYSB0aGF0Ci1sZXRzIHlvdSBib3RoIHNwZWNpZnkgdGhlIHJlcXVpcmVkIHR5cGUgYW5kIGNoZWNrIHRoZSByZXR1cm5lZCB0eXBlLgotCi1EZWNvcmF0b3IgZnVuY3Rpb25zIGNhbiB0YWtlIGFyZ3VtZW50cy4gIElmIGFyZ3VtZW50cyBhcmUgc3VwcGxpZWQsCi15b3VyIGRlY29yYXRvciBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBvbmx5IHRob3NlIGFyZ3VtZW50cyBhbmQgbXVzdAotcmV0dXJuIGEgbmV3IGRlY29yYXRvciBmdW5jdGlvbjsgdGhpcyBmdW5jdGlvbiBtdXN0IHRha2UgYSBzaW5nbGUKLWZ1bmN0aW9uIGFuZCByZXR1cm4gYSBmdW5jdGlvbiwgYXMgcHJldmlvdXNseSBkZXNjcmliZWQuICBJbiBvdGhlcgotd29yZHMsIFxjb2Rle0BBIEBCIEBDKGFyZ3MpfSBiZWNvbWVzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1kZWYgZigpOiAuLi4KLV9kZWNvID0gQyhhcmdzKQotZiA9IEEoQihfZGVjbyhmKSkpCi1cZW5ke3ZlcmJhdGltfQotCi1HZXR0aW5nIHRoaXMgcmlnaHQgY2FuIGJlIHNsaWdodGx5IGJyYWluLWJlbmRpbmcsIGJ1dCBpdCdzIG5vdCB0b28KLWRpZmZpY3VsdC4KLQotQSBzbWFsbCByZWxhdGVkIGNoYW5nZSBtYWtlcyB0aGUgXG1lbWJlcntmdW5jX25hbWV9IGF0dHJpYnV0ZSBvZgotZnVuY3Rpb25zIHdyaXRhYmxlLiAgVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBkaXNwbGF5IGZ1bmN0aW9uIG5hbWVzCi1pbiB0cmFjZWJhY2tzLCBzbyBkZWNvcmF0b3JzIHNob3VsZCBjaGFuZ2UgdGhlIG5hbWUgb2YgYW55IG5ldwotZnVuY3Rpb24gdGhhdCdzIGNvbnN0cnVjdGVkIGFuZCByZXR1cm5lZC4KLQotXGJlZ2lue3NlZWFsc299Ci1cc2VlcGVwezMxOH17RGVjb3JhdG9ycyBmb3IgRnVuY3Rpb25zLCBNZXRob2RzIGFuZCBDbGFzc2VzfXtXcml0dGVuIAotYnkgS2V2aW4gRC4gU21pdGgsIEppbSBKZXdldHQsIGFuZCBTa2lwIE1vbnRhbmFyby4gIFNldmVyYWwgcGVvcGxlCi13cm90ZSBwYXRjaGVzIGltcGxlbWVudGluZyBmdW5jdGlvbiBkZWNvcmF0b3JzLCBidXQgdGhlIG9uZSB0aGF0IHdhcwotYWN0dWFsbHkgY2hlY2tlZCBpbiB3YXMgcGF0Y2ggXCM5Nzk3MjgsIHdyaXR0ZW4gYnkgTWFyayBSdXNzZWxsLn0KLQotXHNlZXVybHtodHRwOi8vd3d3LnB5dGhvbi5vcmcvbW9pbi9QeXRob25EZWNvcmF0b3JMaWJyYXJ5fQote1RoaXMgV2lraSBwYWdlIGNvbnRhaW5zIHNldmVyYWwgZXhhbXBsZXMgb2YgZGVjb3JhdG9ycy59Ci0KLVxlbmR7c2VlYWxzb30KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257UEVQIDMyMjogUmV2ZXJzZSBJdGVyYXRpb259Ci0KLUEgbmV3IGJ1aWx0LWluIGZ1bmN0aW9uLCBcZnVuY3Rpb257cmV2ZXJzZWQoXHZhcntzZXF9KX0sIHRha2VzIGEgc2VxdWVuY2UKLWFuZCByZXR1cm5zIGFuIGl0ZXJhdG9yIHRoYXQgbG9vcHMgb3ZlciB0aGUgZWxlbWVudHMgb2YgdGhlIHNlcXVlbmNlIAotaW4gcmV2ZXJzZSBvcmRlci4gIAotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZm9yIGkgaW4gcmV2ZXJzZWQoeHJhbmdlKDEsNCkpOgotLi4uICAgIHByaW50IGkKLS4uLiAKLTMKLTIKLTEKLVxlbmR7dmVyYmF0aW19Ci0KLUNvbXBhcmVkIHRvIGV4dGVuZGVkIHNsaWNpbmcsIHN1Y2ggYXMgXGNvZGV7cmFuZ2UoMSw0KVs6Oi0xXX0sCi1cZnVuY3Rpb257cmV2ZXJzZWQoKX0gaXMgZWFzaWVyIHRvIHJlYWQsIHJ1bnMgZmFzdGVyLCBhbmQgdXNlcwotc3Vic3RhbnRpYWxseSBsZXNzIG1lbW9yeS4KLQotTm90ZSB0aGF0IFxmdW5jdGlvbntyZXZlcnNlZCgpfSBvbmx5IGFjY2VwdHMgc2VxdWVuY2VzLCBub3QgYXJiaXRyYXJ5Ci1pdGVyYXRvcnMuICBJZiB5b3Ugd2FudCB0byByZXZlcnNlIGFuIGl0ZXJhdG9yLCBmaXJzdCBjb252ZXJ0IGl0IHRvIAotYSBsaXN0IHdpdGggXGZ1bmN0aW9ue2xpc3QoKX0uCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbnB1dCA9IG9wZW4oJy9ldGMvcGFzc3dkJywgJ3InKQotPj4+IGZvciBsaW5lIGluIHJldmVyc2VkKGxpc3QoaW5wdXQpKToKLS4uLiAgIHByaW50IGxpbmUKLS4uLiAKLXJvb3Q6KjowOjA6U3lzdGVtIEFkbWluaXN0cmF0b3I6L3Zhci9yb290Oi9iaW4vdGNzaAotICAuLi4KLVxlbmR7dmVyYmF0aW19Ci0KLVxiZWdpbntzZWVhbHNvfQotXHNlZXBlcHszMjJ9e1JldmVyc2UgSXRlcmF0aW9ufXtXcml0dGVuIGFuZCBpbXBsZW1lbnRlZCBieSBSYXltb25kIEhldHRpbmdlci59Ci0KLVxlbmR7c2VlYWxzb30KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257UEVQIDMyNDogTmV3IHN1YnByb2Nlc3MgTW9kdWxlfQotCi1UaGUgc3RhbmRhcmQgbGlicmFyeSBwcm92aWRlcyBhIG51bWJlciBvZiB3YXlzIHRvIGV4ZWN1dGUgYQotc3VicHJvY2Vzcywgb2ZmZXJpbmcgZGlmZmVyZW50IGZlYXR1cmVzIGFuZCBkaWZmZXJlbnQgbGV2ZWxzIG9mCi1jb21wbGV4aXR5LiAgXGZ1bmN0aW9ue29zLnN5c3RlbShcdmFye2NvbW1hbmR9KX0gaXMgZWFzeSB0byB1c2UsIGJ1dAotc2xvdyAoaXQgcnVucyBhIHNoZWxsIHByb2Nlc3Mgd2hpY2ggZXhlY3V0ZXMgdGhlIGNvbW1hbmQpIGFuZAotZGFuZ2Vyb3VzICh5b3UgaGF2ZSB0byBiZSBjYXJlZnVsIGFib3V0IGVzY2FwaW5nIHRoZSBzaGVsbCdzCi1tZXRhY2hhcmFjdGVycykuICBUaGUgXG1vZHVsZXtwb3BlbjJ9IG1vZHVsZSBvZmZlcnMgY2xhc3NlcyB0aGF0IGNhbgotY2FwdHVyZSBzdGFuZGFyZCBvdXRwdXQgYW5kIHN0YW5kYXJkIGVycm9yIGZyb20gdGhlIHN1YnByb2Nlc3MsIGJ1dAotdGhlIG5hbWluZyBpcyBjb25mdXNpbmcuICBUaGUgXG1vZHVsZXtzdWJwcm9jZXNzfSBtb2R1bGUgY2xlYW5zIAotdGhpcyB1cCwgcHJvdmlkaW5nIGEgdW5pZmllZCBpbnRlcmZhY2UgdGhhdCBvZmZlcnMgYWxsIHRoZSBmZWF0dXJlcwoteW91IG1pZ2h0IG5lZWQuCi0KLUluc3RlYWQgb2YgXG1vZHVsZXtwb3BlbjJ9J3MgY29sbGVjdGlvbiBvZiBjbGFzc2VzLAotXG1vZHVsZXtzdWJwcm9jZXNzfSBjb250YWlucyBhIHNpbmdsZSBjbGFzcyBjYWxsZWQgXGNsYXNze1BvcGVufSAKLXdob3NlIGNvbnN0cnVjdG9yIHN1cHBvcnRzIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBrZXl3b3JkIGFyZ3VtZW50cy4KLQotXGJlZ2lue3ZlcmJhdGltfQotY2xhc3MgUG9wZW4oYXJncywgYnVmc2l6ZT0wLCBleGVjdXRhYmxlPU5vbmUsCi0JICAgIHN0ZGluPU5vbmUsIHN0ZG91dD1Ob25lLCBzdGRlcnI9Tm9uZSwKLQkgICAgcHJlZXhlY19mbj1Ob25lLCBjbG9zZV9mZHM9RmFsc2UsIHNoZWxsPUZhbHNlLAotCSAgICBjd2Q9Tm9uZSwgZW52PU5vbmUsIHVuaXZlcnNhbF9uZXdsaW5lcz1GYWxzZSwKLQkgICAgc3RhcnR1cGluZm89Tm9uZSwgY3JlYXRpb25mbGFncz0wKToKLVxlbmR7dmVyYmF0aW19Ci0KLVx2YXJ7YXJnc30gaXMgY29tbW9ubHkgYSBzZXF1ZW5jZSBvZiBzdHJpbmdzIHRoYXQgd2lsbCBiZSB0aGUKLWFyZ3VtZW50cyB0byB0aGUgcHJvZ3JhbSBleGVjdXRlZCBhcyB0aGUgc3VicHJvY2Vzcy4gIChJZiB0aGUKLVx2YXJ7c2hlbGx9IGFyZ3VtZW50IGlzIHRydWUsIFx2YXJ7YXJnc30gY2FuIGJlIGEgc3RyaW5nIHdoaWNoIHdpbGwKLXRoZW4gYmUgcGFzc2VkIG9uIHRvIHRoZSBzaGVsbCBmb3IgaW50ZXJwcmV0YXRpb24sIGp1c3QgYXMKLVxmdW5jdGlvbntvcy5zeXN0ZW0oKX0gZG9lcy4pCi0KLVx2YXJ7c3RkaW59LCBcdmFye3N0ZG91dH0sIGFuZCBcdmFye3N0ZGVycn0gc3BlY2lmeSB3aGF0IHRoZQotc3VicHJvY2VzcydzIGlucHV0LCBvdXRwdXQsIGFuZCBlcnJvciBzdHJlYW1zIHdpbGwgYmUuICBZb3UgY2FuCi1wcm92aWRlIGEgZmlsZSBvYmplY3Qgb3IgYSBmaWxlIGRlc2NyaXB0b3IsIG9yIHlvdSBjYW4gdXNlIHRoZQotY29uc3RhbnQgXGNvZGV7c3VicHJvY2Vzcy5QSVBFfSB0byBjcmVhdGUgYSBwaXBlIGJldHdlZW4gdGhlCi1zdWJwcm9jZXNzIGFuZCB0aGUgcGFyZW50LgotCi1UaGUgY29uc3RydWN0b3IgaGFzIGEgbnVtYmVyIG9mIGhhbmR5IG9wdGlvbnM6Ci0KLVxiZWdpbntpdGVtaXplfQotICBcaXRlbSBcdmFye2Nsb3NlX2Zkc30gcmVxdWVzdHMgdGhhdCBhbGwgZmlsZSBkZXNjcmlwdG9ycyBiZSBjbG9zZWQKLSAgYmVmb3JlIHJ1bm5pbmcgdGhlIHN1YnByb2Nlc3MuCi0KLSAgXGl0ZW0gXHZhcntjd2R9IHNwZWNpZmllcyB0aGUgd29ya2luZyBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlCi0gIHN1YnByb2Nlc3Mgd2lsbCBiZSBleGVjdXRlZCAoZGVmYXVsdGluZyB0byB3aGF0ZXZlciB0aGUgcGFyZW50J3MKLSAgd29ya2luZyBkaXJlY3RvcnkgaXMpLgotCi0gIFxpdGVtIFx2YXJ7ZW52fSBpcyBhIGRpY3Rpb25hcnkgc3BlY2lmeWluZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCi0KLSAgXGl0ZW0gXHZhcntwcmVleGVjX2ZufSBpcyBhIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgYmVmb3JlIHRoZQotICBjaGlsZCBpcyBzdGFydGVkLgotCi0gIFxpdGVtIFx2YXJ7dW5pdmVyc2FsX25ld2xpbmVzfSBvcGVucyB0aGUgY2hpbGQncyBpbnB1dCBhbmQgb3V0cHV0Ci0gIHVzaW5nIFB5dGhvbidzIHVuaXZlcnNhbCBuZXdsaW5lIGZlYXR1cmUuCi0KLVxlbmR7aXRlbWl6ZX0KLQotT25jZSB5b3UndmUgY3JlYXRlZCB0aGUgXGNsYXNze1BvcGVufSBpbnN0YW5jZSwgCi15b3UgY2FuIGNhbGwgaXRzIFxtZXRob2R7d2FpdCgpfSBtZXRob2QgdG8gcGF1c2UgdW50aWwgdGhlIHN1YnByb2Nlc3MKLWhhcyBleGl0ZWQsIFxtZXRob2R7cG9sbCgpfSB0byBjaGVjayBpZiBpdCdzIGV4aXRlZCB3aXRob3V0IHBhdXNpbmcsIAotb3IgXG1ldGhvZHtjb21tdW5pY2F0ZShcdmFye2RhdGF9KX0gdG8gc2VuZCB0aGUgc3RyaW5nIFx2YXJ7ZGF0YX0gdG8KLXRoZSBzdWJwcm9jZXNzJ3Mgc3RhbmRhcmQgaW5wdXQuICAgXG1ldGhvZHtjb21tdW5pY2F0ZShcdmFye2RhdGF9KX0gCi10aGVuIHJlYWRzIGFueSBkYXRhIHRoYXQgdGhlIHN1YnByb2Nlc3MgaGFzIHNlbnQgdG8gaXRzIHN0YW5kYXJkIG91dHB1dCAKLW9yIHN0YW5kYXJkIGVycm9yLCByZXR1cm5pbmcgYSB0dXBsZSBcY29kZXsoXHZhcntzdGRvdXRfZGF0YX0sCi1cdmFye3N0ZGVycl9kYXRhfSl9LgotCi1cZnVuY3Rpb257Y2FsbCgpfSBpcyBhIHNob3J0Y3V0IHRoYXQgcGFzc2VzIGl0cyBhcmd1bWVudHMgYWxvbmcgdG8gdGhlCi1cY2xhc3N7UG9wZW59IGNvbnN0cnVjdG9yLCB3YWl0cyBmb3IgdGhlIGNvbW1hbmQgdG8gY29tcGxldGUsIGFuZAotcmV0dXJucyB0aGUgc3RhdHVzIGNvZGUgb2YgdGhlIHN1YnByb2Nlc3MuICBJdCBjYW4gc2VydmUgYXMgYSBzYWZlcgotYW5hbG9nIHRvIFxmdW5jdGlvbntvcy5zeXN0ZW0oKX06Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXN0cyA9IHN1YnByb2Nlc3MuY2FsbChbJ2Rwa2cnLCAnLWknLCAnL3RtcC9uZXctcGFja2FnZS5kZWInXSkKLWlmIHN0cyA9PSAwOgotICAgICMgU3VjY2VzcwotICAgIC4uLgotZWxzZToKLSAgICAjIGRwa2cgcmV0dXJuZWQgYW4gZXJyb3IKLSAgICAuLi4KLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBjb21tYW5kIGlzIGludm9rZWQgd2l0aG91dCB1c2Ugb2YgdGhlIHNoZWxsLiAgSWYgeW91IHJlYWxseSBkbyB3YW50IHRvIAotdXNlIHRoZSBzaGVsbCwgeW91IGNhbiBhZGQgXGNvZGV7c2hlbGw9VHJ1ZX0gYXMgYSBrZXl3b3JkIGFyZ3VtZW50IGFuZCBwcm92aWRlCi1hIHN0cmluZyBpbnN0ZWFkIG9mIGEgc2VxdWVuY2U6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXN0cyA9IHN1YnByb2Nlc3MuY2FsbCgnZHBrZyAtaSAvdG1wL25ldy1wYWNrYWdlLmRlYicsIHNoZWxsPVRydWUpCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgUEVQIHRha2VzIHZhcmlvdXMgZXhhbXBsZXMgb2Ygc2hlbGwgYW5kIFB5dGhvbiBjb2RlIGFuZCBzaG93cyBob3cKLXRoZXknZCBiZSB0cmFuc2xhdGVkIGludG8gUHl0aG9uIGNvZGUgdGhhdCB1c2VzIFxtb2R1bGV7c3VicHJvY2Vzc30uIAotUmVhZGluZyB0aGlzIHNlY3Rpb24gb2YgdGhlIFBFUCBpcyBoaWdobHkgcmVjb21tZW5kZWQuCi0KLVxiZWdpbntzZWVhbHNvfQotXHNlZXBlcHszMjR9e3N1YnByb2Nlc3MgLSBOZXcgcHJvY2VzcyBtb2R1bGV9e1dyaXR0ZW4gYW5kIGltcGxlbWVudGVkIGJ5IFBldGVyIHtcQUF9c3RyYW5kLCB3aXRoIGFzc2lzdGFuY2UgZnJvbSBGcmVkcmlrIEx1bmRoIGFuZCBvdGhlcnMufQotXGVuZHtzZWVhbHNvfQotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntQRVAgMzI3OiBEZWNpbWFsIERhdGEgVHlwZX0KLQotUHl0aG9uIGhhcyBhbHdheXMgc3VwcG9ydGVkIGZsb2F0aW5nLXBvaW50IChGUCkgbnVtYmVycywgYmFzZWQgb24gdGhlCi11bmRlcmx5aW5nIEMgXGN0eXBle2RvdWJsZX0gdHlwZSwgYXMgYSBkYXRhIHR5cGUuICBIb3dldmVyLCB3aGlsZSBtb3N0Ci1wcm9ncmFtbWluZyBsYW5ndWFnZXMgcHJvdmlkZSBhIGZsb2F0aW5nLXBvaW50IHR5cGUsIG1hbnkgcGVvcGxlIChldmVuCi1wcm9ncmFtbWVycykgYXJlIHVuYXdhcmUgdGhhdCBmbG9hdGluZy1wb2ludCBudW1iZXJzIGRvbid0IHJlcHJlc2VudAotY2VydGFpbiBkZWNpbWFsIGZyYWN0aW9ucyBhY2N1cmF0ZWx5LiAgVGhlIG5ldyBcY2xhc3N7RGVjaW1hbH0gdHlwZQotY2FuIHJlcHJlc2VudCB0aGVzZSBmcmFjdGlvbnMgYWNjdXJhdGVseSwgdXAgdG8gYSB1c2VyLXNwZWNpZmllZAotcHJlY2lzaW9uIGxpbWl0LgotCi0KLVxzdWJzZWN0aW9ue1doeSBpcyBEZWNpbWFsIG5lZWRlZD99Ci0KLVRoZSBsaW1pdGF0aW9ucyBhcmlzZSBmcm9tIHRoZSByZXByZXNlbnRhdGlvbiB1c2VkIGZvciBmbG9hdGluZy1wb2ludCBudW1iZXJzLgotRlAgbnVtYmVycyBhcmUgbWFkZSB1cCBvZiB0aHJlZSBjb21wb25lbnRzOgotCi1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtIFRoZSBzaWduLCB3aGljaCBpcyBwb3NpdGl2ZSBvciBuZWdhdGl2ZS4KLVxpdGVtIFRoZSBtYW50aXNzYSwgd2hpY2ggaXMgYSBzaW5nbGUtZGlnaXQgYmluYXJ5IG51bWJlciAgCi1mb2xsb3dlZCBieSBhIGZyYWN0aW9uYWwgcGFydC4gIEZvciBleGFtcGxlLCBcY29kZXsxLjAxfSBpbiBiYXNlLTIgbm90YXRpb24KLWlzIFxjb2RlezEgKyAwLzIgKyAxLzR9LCBvciAxLjI1IGluIGRlY2ltYWwgbm90YXRpb24uCi1caXRlbSBUaGUgZXhwb25lbnQsIHdoaWNoIHRlbGxzIHdoZXJlIHRoZSBkZWNpbWFsIHBvaW50IGlzIGxvY2F0ZWQgaW4gdGhlIG51bWJlciByZXByZXNlbnRlZC4gIAotXGVuZHtpdGVtaXplfQotCi1Gb3IgZXhhbXBsZSwgdGhlIG51bWJlciAxLjI1IGhhcyBwb3NpdGl2ZSBzaWduLCBhIG1hbnRpc3NhIHZhbHVlIG9mCi0xLjAxIChpbiBiaW5hcnkpLCBhbmQgYW4gZXhwb25lbnQgb2YgMCAodGhlIGRlY2ltYWwgcG9pbnQgZG9lc24ndCBuZWVkCi10byBiZSBzaGlmdGVkKS4gIFRoZSBudW1iZXIgNSBoYXMgdGhlIHNhbWUgc2lnbiBhbmQgbWFudGlzc2EsIGJ1dCB0aGUKLWV4cG9uZW50IGlzIDIgYmVjYXVzZSB0aGUgbWFudGlzc2EgaXMgbXVsdGlwbGllZCBieSA0ICgyIHRvIHRoZSBwb3dlcgotb2YgdGhlIGV4cG9uZW50IDIpOyAxLjI1ICogNCBlcXVhbHMgNS4KLQotTW9kZXJuIHN5c3RlbXMgdXN1YWxseSBwcm92aWRlIGZsb2F0aW5nLXBvaW50IHN1cHBvcnQgdGhhdCBjb25mb3JtcyB0bwotYSBzdGFuZGFyZCBjYWxsZWQgSUVFRSA3NTQuICBDJ3MgXGN0eXBle2RvdWJsZX0gdHlwZSBpcyB1c3VhbGx5Ci1pbXBsZW1lbnRlZCBhcyBhIDY0LWJpdCBJRUVFIDc1NCBudW1iZXIsIHdoaWNoIHVzZXMgNTIgYml0cyBvZiBzcGFjZQotZm9yIHRoZSBtYW50aXNzYS4gIFRoaXMgbWVhbnMgdGhhdCBudW1iZXJzIGNhbiBvbmx5IGJlIHNwZWNpZmllZCB0byA1MgotYml0cyBvZiBwcmVjaXNpb24uICBJZiB5b3UncmUgdHJ5aW5nIHRvIHJlcHJlc2VudCBudW1iZXJzIHdob3NlCi1leHBhbnNpb24gcmVwZWF0cyBlbmRsZXNzbHksIHRoZSBleHBhbnNpb24gaXMgY3V0IG9mZiBhZnRlciA1MiBiaXRzLgotVW5mb3J0dW5hdGVseSwgbW9zdCBzb2Z0d2FyZSBuZWVkcyB0byBwcm9kdWNlIG91dHB1dCBpbiBiYXNlIDEwLCBhbmQKLWNvbW1vbiBmcmFjdGlvbnMgaW4gYmFzZSAxMCBhcmUgb2Z0ZW4gcmVwZWF0aW5nIGRlY2ltYWxzIGluIGJpbmFyeS4KLUZvciBleGFtcGxlLCAxLjEgZGVjaW1hbCBpcyBiaW5hcnkgXGNvZGV7MS4wMDAxMTAwMTEwMDExIC4uLn07IC4xID0KLTEvMTYgKyAxLzMyICsgMS8yNTYgcGx1cyBhbiBpbmZpbml0ZSBudW1iZXIgb2YgYWRkaXRpb25hbCB0ZXJtcy4gIElFRUUKLTc1NCBoYXMgdG8gY2hvcCBvZmYgdGhhdCBpbmZpbml0ZWx5IHJlcGVhdGVkIGRlY2ltYWwgYWZ0ZXIgNTIgZGlnaXRzLAotc28gdGhlIHJlcHJlc2VudGF0aW9uIGlzIHNsaWdodGx5IGluYWNjdXJhdGUuCi0KLVNvbWV0aW1lcyB5b3UgY2FuIHNlZSB0aGlzIGluYWNjdXJhY3kgd2hlbiB0aGUgbnVtYmVyIGlzIHByaW50ZWQ6Ci1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gMS4xCi0xLjEwMDAwMDAwMDAwMDAwMDEKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBpbmFjY3VyYWN5IGlzbid0IGFsd2F5cyB2aXNpYmxlIHdoZW4geW91IHByaW50IHRoZSBudW1iZXIgYmVjYXVzZQotdGhlIEZQLXRvLWRlY2ltYWwtc3RyaW5nIGNvbnZlcnNpb24gaXMgcHJvdmlkZWQgYnkgdGhlIEMgbGlicmFyeSwgYW5kCi1tb3N0IEMgbGlicmFyaWVzIHRyeSB0byBwcm9kdWNlIHNlbnNpYmxlIG91dHB1dC4gIEV2ZW4gaWYgaXQncyBub3QKLWRpc3BsYXllZCwgaG93ZXZlciwgdGhlIGluYWNjdXJhY3kgaXMgc3RpbGwgdGhlcmUgYW5kIHN1YnNlcXVlbnQKLW9wZXJhdGlvbnMgY2FuIG1hZ25pZnkgdGhlIGVycm9yLgotCi1Gb3IgbWFueSBhcHBsaWNhdGlvbnMgdGhpcyBkb2Vzbid0IG1hdHRlci4gIElmIEknbSBwbG90dGluZyBwb2ludHMgYW5kCi1kaXNwbGF5aW5nIHRoZW0gb24gbXkgbW9uaXRvciwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAxLjEgYW5kCi0xLjEwMDAwMDAwMDAwMDAwMDEgaXMgdG9vIHNtYWxsIHRvIGJlIHZpc2libGUuICBSZXBvcnRzIG9mdGVuIGxpbWl0Ci1vdXRwdXQgdG8gYSBjZXJ0YWluIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcywgYW5kIGlmIHlvdSByb3VuZCB0aGUKLW51bWJlciB0byB0d28gb3IgdGhyZWUgb3IgZXZlbiBlaWdodCBkZWNpbWFsIHBsYWNlcywgdGhlIGVycm9yIGlzCi1uZXZlciBhcHBhcmVudC4gIEhvd2V2ZXIsIGZvciBhcHBsaWNhdGlvbnMgd2hlcmUgaXQgZG9lcyBtYXR0ZXIsIAotaXQncyBhIGxvdCBvZiB3b3JrIHRvIGltcGxlbWVudCB5b3VyIG93biBjdXN0b20gYXJpdGhtZXRpYyByb3V0aW5lcy4KLQotSGVuY2UsIHRoZSBcY2xhc3N7RGVjaW1hbH0gdHlwZSB3YXMgY3JlYXRlZC4KLQotXHN1YnNlY3Rpb257VGhlIFxjbGFzc3tEZWNpbWFsfSB0eXBlfQotCi1BIG5ldyBtb2R1bGUsIFxtb2R1bGV7ZGVjaW1hbH0sIHdhcyBhZGRlZCB0byBQeXRob24ncyBzdGFuZGFyZAotbGlicmFyeS4gIEl0IGNvbnRhaW5zIHR3byBjbGFzc2VzLCBcY2xhc3N7RGVjaW1hbH0gYW5kCi1cY2xhc3N7Q29udGV4dH0uICBcY2xhc3N7RGVjaW1hbH0gaW5zdGFuY2VzIHJlcHJlc2VudCBudW1iZXJzLCBhbmQKLVxjbGFzc3tDb250ZXh0fSBpbnN0YW5jZXMgYXJlIHVzZWQgdG8gd3JhcCB1cCB2YXJpb3VzIHNldHRpbmdzIHN1Y2ggYXMKLXRoZSBwcmVjaXNpb24gYW5kIGRlZmF1bHQgcm91bmRpbmcgbW9kZS4KLQotXGNsYXNze0RlY2ltYWx9IGluc3RhbmNlcyBhcmUgaW1tdXRhYmxlLCBsaWtlIHJlZ3VsYXIgUHl0aG9uIGludGVnZXJzCi1hbmQgRlAgbnVtYmVyczsgb25jZSBpdCdzIGJlZW4gY3JlYXRlZCwgeW91IGNhbid0IGNoYW5nZSB0aGUgdmFsdWUgYW4KLWluc3RhbmNlIHJlcHJlc2VudHMuICBcY2xhc3N7RGVjaW1hbH0gaW5zdGFuY2VzIGNhbiBiZSBjcmVhdGVkIGZyb20KLWludGVnZXJzIG9yIHN0cmluZ3M6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgZGVjaW1hbAotPj4+IGRlY2ltYWwuRGVjaW1hbCgxOTcyKQotRGVjaW1hbCgiMTk3MiIpCi0+Pj4gZGVjaW1hbC5EZWNpbWFsKCIxLjEiKQotRGVjaW1hbCgiMS4xIikKLVxlbmR7dmVyYmF0aW19Ci0KLVlvdSBjYW4gYWxzbyBwcm92aWRlIHR1cGxlcyBjb250YWluaW5nIHRoZSBzaWduLCB0aGUgbWFudGlzc2EgcmVwcmVzZW50ZWQgCi1hcyBhIHR1cGxlIG9mIGRlY2ltYWwgZGlnaXRzLCBhbmQgdGhlIGV4cG9uZW50OgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZGVjaW1hbC5EZWNpbWFsKCgxLCAoMSwgNCwgNywgNSksIC0yKSkKLURlY2ltYWwoIi0xNC43NSIpCi1cZW5ke3ZlcmJhdGltfQotCi1DYXV0aW9uYXJ5IG5vdGU6IHRoZSBzaWduIGJpdCBpcyBhIEJvb2xlYW4gdmFsdWUsIHNvIDAgaXMgcG9zaXRpdmUgYW5kCi0xIGlzIG5lZ2F0aXZlLiAKLQotQ29udmVydGluZyBmcm9tIGZsb2F0aW5nLXBvaW50IG51bWJlcnMgcG9zZXMgYSBiaXQgb2YgYSBwcm9ibGVtOgotc2hvdWxkIHRoZSBGUCBudW1iZXIgcmVwcmVzZW50aW5nIDEuMSB0dXJuIGludG8gdGhlIGRlY2ltYWwgbnVtYmVyIGZvcgotZXhhY3RseSAxLjEsIG9yIGZvciAxLjEgcGx1cyB3aGF0ZXZlciBpbmFjY3VyYWNpZXMgYXJlIGludHJvZHVjZWQ/Ci1UaGUgZGVjaXNpb24gd2FzIHRvIGRvZGdlIHRoZSBpc3N1ZSBhbmQgbGVhdmUgc3VjaCBhIGNvbnZlcnNpb24gb3V0IG9mCi10aGUgQVBJLiAgSW5zdGVhZCwgeW91IHNob3VsZCBjb252ZXJ0IHRoZSBmbG9hdGluZy1wb2ludCBudW1iZXIgaW50byBhCi1zdHJpbmcgdXNpbmcgdGhlIGRlc2lyZWQgcHJlY2lzaW9uIGFuZCBwYXNzIHRoZSBzdHJpbmcgdG8gdGhlCi1cY2xhc3N7RGVjaW1hbH0gY29uc3RydWN0b3I6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBmID0gMS4xCi0+Pj4gZGVjaW1hbC5EZWNpbWFsKHN0cihmKSkKLURlY2ltYWwoIjEuMSIpCi0+Pj4gZGVjaW1hbC5EZWNpbWFsKCclLjEyZicgJSBmKQotRGVjaW1hbCgiMS4xMDAwMDAwMDAwMDAiKQotXGVuZHt2ZXJiYXRpbX0KLQotT25jZSB5b3UgaGF2ZSBcY2xhc3N7RGVjaW1hbH0gaW5zdGFuY2VzLCB5b3UgY2FuIHBlcmZvcm0gdGhlIHVzdWFsCi1tYXRoZW1hdGljYWwgb3BlcmF0aW9ucyBvbiB0aGVtLiAgT25lIGxpbWl0YXRpb246IGV4cG9uZW50aWF0aW9uCi1yZXF1aXJlcyBhbiBpbnRlZ2VyIGV4cG9uZW50OgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gYSA9IGRlY2ltYWwuRGVjaW1hbCgnMzUuNzInKQotPj4+IGIgPSBkZWNpbWFsLkRlY2ltYWwoJzEuNzMnKQotPj4+IGErYgotRGVjaW1hbCgiMzcuNDUiKQotPj4+IGEtYgotRGVjaW1hbCgiMzMuOTkiKQotPj4+IGEqYgotRGVjaW1hbCgiNjEuNzk1NiIpCi0+Pj4gYS9iCi1EZWNpbWFsKCIyMC42NDczOTg4NDM5MzA2MzU4MzgxNTAyODkwMiIpCi0+Pj4gYSAqKiAyCi1EZWNpbWFsKCIxMjc1LjkxODQiKQotPj4+IGEqKmIKLVRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLSAgLi4uCi1kZWNpbWFsLkludmFsaWRPcGVyYXRpb246IHggKiogKG5vbi1pbnRlZ2VyKQotXGVuZHt2ZXJiYXRpbX0KLQotWW91IGNhbiBjb21iaW5lIFxjbGFzc3tEZWNpbWFsfSBpbnN0YW5jZXMgd2l0aCBpbnRlZ2VycywgYnV0IG5vdCB3aXRoCi1mbG9hdGluZy1wb2ludCBudW1iZXJzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gYSArIDQKLURlY2ltYWwoIjM5LjcyIikKLT4+PiBhICsgNC41Ci1UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gIC4uLgotVHlwZUVycm9yOiBZb3UgY2FuIGludGVyYWN0IERlY2ltYWwgb25seSB3aXRoIGludCwgbG9uZyBvciBEZWNpbWFsIGRhdGEgdHlwZXMuCi0+Pj4KLVxlbmR7dmVyYmF0aW19Ci0KLVxjbGFzc3tEZWNpbWFsfSBudW1iZXJzIGNhbiBiZSB1c2VkIHdpdGggdGhlIFxtb2R1bGV7bWF0aH0gYW5kCi1cbW9kdWxle2NtYXRofSBtb2R1bGVzLCBidXQgbm90ZSB0aGF0IHRoZXknbGwgYmUgaW1tZWRpYXRlbHkgY29udmVydGVkIHRvIAotZmxvYXRpbmctcG9pbnQgbnVtYmVycyBiZWZvcmUgdGhlIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQsIHJlc3VsdGluZyBpbgotYSBwb3NzaWJsZSBsb3NzIG9mIHByZWNpc2lvbiBhbmQgYWNjdXJhY3kuICBZb3UnbGwgYWxzbyBnZXQgYmFjayBhCi1yZWd1bGFyIGZsb2F0aW5nLXBvaW50IG51bWJlciBhbmQgbm90IGEgXGNsYXNze0RlY2ltYWx9LiAgCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpbXBvcnQgbWF0aCwgY21hdGgKLT4+PiBkID0gZGVjaW1hbC5EZWNpbWFsKCcxMjM0NTY3ODkwMTIuMzQ1JykKLT4+PiBtYXRoLnNxcnQoZCkKLTM1MTM2NC4xODI4ODIwMTM0NAotPj4+IGNtYXRoLnNxcnQoLWQpCi0zNTEzNjQuMTgyODgyMDEzNDRqCi1cZW5ke3ZlcmJhdGltfQotCi1cY2xhc3N7RGVjaW1hbH0gaW5zdGFuY2VzIGhhdmUgYSBcbWV0aG9ke3NxcnQoKX0gbWV0aG9kIHRoYXQKLXJldHVybnMgYSBcY2xhc3N7RGVjaW1hbH0sIGJ1dCBpZiB5b3UgbmVlZCBvdGhlciB0aGluZ3Mgc3VjaCBhcwotdHJpZ29ub21ldHJpYyBmdW5jdGlvbnMgeW91J2xsIGhhdmUgdG8gaW1wbGVtZW50IHRoZW0uCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBkLnNxcnQoKQotRGVjaW1hbCgiMzUxMzY0LjE4Mjg4MjAxMzQ1OTIxNzcyNDUwMDEiKQotXGVuZHt2ZXJiYXRpbX0KLQotCi1cc3Vic2VjdGlvbntUaGUgXGNsYXNze0NvbnRleHR9IHR5cGV9Ci0KLUluc3RhbmNlcyBvZiB0aGUgXGNsYXNze0NvbnRleHR9IGNsYXNzIGVuY2Fwc3VsYXRlIHNldmVyYWwgc2V0dGluZ3MgZm9yIAotZGVjaW1hbCBvcGVyYXRpb25zOgotCi1cYmVnaW57aXRlbWl6ZX0KLSBcaXRlbSBcbWVtYmVye3ByZWN9IGlzIHRoZSBwcmVjaXNpb24sIHRoZSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMuCi0gXGl0ZW0gXG1lbWJlcntyb3VuZGluZ30gc3BlY2lmaWVzIHRoZSByb3VuZGluZyBtb2RlLiAgVGhlIFxtb2R1bGV7ZGVjaW1hbH0KLSAgICAgICBtb2R1bGUgaGFzIGNvbnN0YW50cyBmb3IgdGhlIHZhcmlvdXMgcG9zc2liaWxpdGllczoKLSAgICAgICBcY29uc3RhbnR7Uk9VTkRfRE9XTn0sIFxjb25zdGFudHtST1VORF9DRUlMSU5HfSwgCi0gICAgICAgXGNvbnN0YW50e1JPVU5EX0hBTEZfRVZFTn0sIGFuZCB2YXJpb3VzIG90aGVycy4KLSBcaXRlbSBcbWVtYmVye3RyYXBzfSBpcyBhIGRpY3Rpb25hcnkgc3BlY2lmeWluZyB3aGF0IGhhcHBlbnMgb24KLWVuY291bnRlcmluZyBjZXJ0YWluIGVycm9yIGNvbmRpdGlvbnM6IGVpdGhlciAgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZCBvciAKLWEgdmFsdWUgaXMgcmV0dXJuZWQuICBTb21lIGV4YW1wbGVzIG9mIGVycm9yIGNvbmRpdGlvbnMgYXJlCi1kaXZpc2lvbiBieSB6ZXJvLCBsb3NzIG9mIHByZWNpc2lvbiwgYW5kIG92ZXJmbG93LgotXGVuZHtpdGVtaXplfQotCi1UaGVyZSdzIGEgdGhyZWFkLWxvY2FsIGRlZmF1bHQgY29udGV4dCBhdmFpbGFibGUgYnkgY2FsbGluZwotXGZ1bmN0aW9ue2dldGNvbnRleHQoKX07IHlvdSBjYW4gY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgY29udGV4dAotdG8gYWx0ZXIgdGhlIGRlZmF1bHQgcHJlY2lzaW9uLCByb3VuZGluZywgb3IgdHJhcCBoYW5kbGluZy4gIFRoZQotZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgdGhlIGVmZmVjdCBvZiBjaGFuZ2luZyB0aGUgcHJlY2lzaW9uIG9mIHRoZSBkZWZhdWx0Ci1jb250ZXh0OgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZGVjaW1hbC5nZXRjb250ZXh0KCkucHJlYwotMjgKLT4+PiBkZWNpbWFsLkRlY2ltYWwoMSkgLyBkZWNpbWFsLkRlY2ltYWwoNykKLURlY2ltYWwoIjAuMTQyODU3MTQyODU3MTQyODU3MTQyODU3MTQyOSIpCi0+Pj4gZGVjaW1hbC5nZXRjb250ZXh0KCkucHJlYyA9IDkgCi0+Pj4gZGVjaW1hbC5EZWNpbWFsKDEpIC8gZGVjaW1hbC5EZWNpbWFsKDcpCi1EZWNpbWFsKCIwLjE0Mjg1NzE0MyIpCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgZGVmYXVsdCBhY3Rpb24gZm9yIGVycm9yIGNvbmRpdGlvbnMgaXMgc2VsZWN0YWJsZTsgdGhlIG1vZHVsZSBjYW4KLWVpdGhlciByZXR1cm4gYSBzcGVjaWFsIHZhbHVlIHN1Y2ggYXMgaW5maW5pdHkgb3Igbm90LWEtbnVtYmVyLCBvcgotZXhjZXB0aW9ucyBjYW4gYmUgcmFpc2VkOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZGVjaW1hbC5EZWNpbWFsKDEpIC8gZGVjaW1hbC5EZWNpbWFsKDApCi1UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gIC4uLgotZGVjaW1hbC5EaXZpc2lvbkJ5WmVybzogeCAvIDAKLT4+PiBkZWNpbWFsLmdldGNvbnRleHQoKS50cmFwc1tkZWNpbWFsLkRpdmlzaW9uQnlaZXJvXSA9IEZhbHNlCi0+Pj4gZGVjaW1hbC5EZWNpbWFsKDEpIC8gZGVjaW1hbC5EZWNpbWFsKDApCi1EZWNpbWFsKCJJbmZpbml0eSIpCi0+Pj4gCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgXGNsYXNze0NvbnRleHR9IGluc3RhbmNlIGFsc28gaGFzIHZhcmlvdXMgbWV0aG9kcyBmb3IgZm9ybWF0dGluZyAKLW51bWJlcnMgc3VjaCBhcyBcbWV0aG9ke3RvX2VuZ19zdHJpbmcoKX0gYW5kIFxtZXRob2R7dG9fc2NpX3N0cmluZygpfS4KLQotRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIFxtb2R1bGV7ZGVjaW1hbH0KLW1vZHVsZSwgd2hpY2ggaW5jbHVkZXMgYSBxdWljay1zdGFydCB0dXRvcmlhbCBhbmQgYSByZWZlcmVuY2UuCi0KLVxiZWdpbntzZWVhbHNvfQotXHNlZXBlcHszMjd9e0RlY2ltYWwgRGF0YSBUeXBlfXtXcml0dGVuIGJ5IEZhY3VuZG8gQmF0aXN0YSBhbmQgaW1wbGVtZW50ZWQKLSAgYnkgRmFjdW5kbyBCYXRpc3RhLCBFcmljIFByaWNlLCBSYXltb25kIEhldHRpbmdlciwgQWFoeiwgYW5kIFRpbSBQZXRlcnMufQotCi1cc2VldXJse2h0dHA6Ly9yZXNlYXJjaC5taWNyb3NvZnQuY29tL1x0ZXh0YXNjaWl0aWxkZSBob2xsYXNjaC9jZ2luZGV4L2NvZGluZy9pZWVlZmxvYXQuaHRtbH0KLXtBIG1vcmUgZGV0YWlsZWQgb3ZlcnZpZXcgb2YgdGhlIElFRUUtNzU0IHJlcHJlc2VudGF0aW9uLn0KLQotXHNlZXVybHtodHRwOi8vd3d3LmxhaGV5LmNvbS9mbG9hdC5odG19Ci17VGhlIGFydGljbGUgdXNlcyBGb3J0cmFuIGNvZGUgdG8gaWxsdXN0cmF0ZSBtYW55IG9mIHRoZSBwcm9ibGVtcwotdGhhdCBmbG9hdGluZy1wb2ludCBpbmFjY3VyYWN5IGNhbiBjYXVzZS59Ci0KLVxzZWV1cmx7aHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwvfQote0EgZGVzY3JpcHRpb24gb2YgYSBkZWNpbWFsLWJhc2VkIHJlcHJlc2VudGF0aW9uLiAgVGhpcyByZXByZXNlbnRhdGlvbgotaXMgYmVpbmcgcHJvcG9zZWQgYXMgYSBzdGFuZGFyZCwgYW5kIHVuZGVybGllcyB0aGUgbmV3IFB5dGhvbiBkZWNpbWFsCi10eXBlLiAgTXVjaCBvZiB0aGlzIG1hdGVyaWFsIHdhcyB3cml0dGVuIGJ5IE1pa2UgQ293bGlzaGF3LCBkZXNpZ25lciBvZiB0aGUKLVJleHggbGFuZ3VhZ2UufQotCi1cZW5ke3NlZWFsc299ICAgICAgCi0KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue1BFUCAzMjg6IE11bHRpLWxpbmUgSW1wb3J0c30KLQotT25lIGxhbmd1YWdlIGNoYW5nZSBpcyBhIHNtYWxsIHN5bnRhY3RpYyB0d2VhayBhaW1lZCBhdCBtYWtpbmcgaXQKLWVhc2llciB0byBpbXBvcnQgbWFueSBuYW1lcyBmcm9tIGEgbW9kdWxlLiAgSW4gYQotXGNvZGV7ZnJvbSBcdmFye21vZHVsZX0gaW1wb3J0IFx2YXJ7bmFtZXN9fSBzdGF0ZW1lbnQsIAotXHZhcntuYW1lc30gaXMgYSBzZXF1ZW5jZSBvZiBuYW1lcyBzZXBhcmF0ZWQgYnkgY29tbWFzLiAgSWYgdGhlIHNlcXVlbmNlIGlzIAotdmVyeSBsb25nLCB5b3UgY2FuIGVpdGhlciB3cml0ZSBtdWx0aXBsZSBpbXBvcnRzIGZyb20gdGhlIHNhbWUgbW9kdWxlLAotb3IgeW91IGNhbiB1c2UgYmFja3NsYXNoZXMgdG8gZXNjYXBlIHRoZSBsaW5lIGVuZGluZ3MgbGlrZSB0aGlzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1mcm9tIFNpbXBsZVhNTFJQQ1NlcnZlciBpbXBvcnQgU2ltcGxlWE1MUlBDU2VydmVyLFwKLSAgICAgICAgICAgIFNpbXBsZVhNTFJQQ1JlcXVlc3RIYW5kbGVyLFwKLSAgICAgICAgICAgIENHSVhNTFJQQ1JlcXVlc3RIYW5kbGVyLFwKLSAgICAgICAgICAgIHJlc29sdmVfZG90dGVkX2F0dHJpYnV0ZQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIHN5bnRhY3RpYyBjaGFuZ2UgaW4gUHl0aG9uIDIuNCBzaW1wbHkgYWxsb3dzIHB1dHRpbmcgdGhlIG5hbWVzCi13aXRoaW4gcGFyZW50aGVzZXMuICBQeXRob24gaWdub3JlcyBuZXdsaW5lcyB3aXRoaW4gYSBwYXJlbnRoZXNpemVkCi1leHByZXNzaW9uLCBzbyB0aGUgYmFja3NsYXNoZXMgYXJlIG5vIGxvbmdlciBuZWVkZWQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWZyb20gU2ltcGxlWE1MUlBDU2VydmVyIGltcG9ydCAoU2ltcGxlWE1MUlBDU2VydmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaW1wbGVYTUxSUENSZXF1ZXN0SGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0dJWE1MUlBDUmVxdWVzdEhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVfZG90dGVkX2F0dHJpYnV0ZSkKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBQRVAgYWxzbyBwcm9wb3NlcyB0aGF0IGFsbCBca2V5d29yZHtpbXBvcnR9IHN0YXRlbWVudHMgYmUgYWJzb2x1dGUKLWltcG9ydHMsIHdpdGggYSBsZWFkaW5nIFxzYW1wey59IGNoYXJhY3RlciB0byBpbmRpY2F0ZSBhIHJlbGF0aXZlCi1pbXBvcnQuICBUaGlzIHBhcnQgb2YgdGhlIFBFUCB3YXMgbm90IGltcGxlbWVudGVkIGZvciBQeXRob24gMi40LAotYnV0IHdhcyBjb21wbGV0ZWQgZm9yIFB5dGhvbiAyLjUuCi0KLVxiZWdpbntzZWVhbHNvfQotXHNlZXBlcHszMjh9e0ltcG9ydHM6IE11bHRpLUxpbmUgYW5kIEFic29sdXRlL1JlbGF0aXZlfQotICAgICAgICAgICAge1dyaXR0ZW4gYnkgQWFoei4gIE11bHRpLWxpbmUgaW1wb3J0cyB3ZXJlIGltcGxlbWVudGVkIGJ5Ci0gICAgICAgICAgICAgRGltYSBEb3JmbWFuLn0KLVxlbmR7c2VlYWxzb30KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257UEVQIDMzMTogTG9jYWxlLUluZGVwZW5kZW50IEZsb2F0L1N0cmluZyBDb252ZXJzaW9uc30KLQotVGhlIFxtb2R1bGV7bG9jYWxlfSBtb2R1bGVzIGxldHMgUHl0aG9uIHNvZnR3YXJlIHNlbGVjdCB2YXJpb3VzCi1jb252ZXJzaW9ucyBhbmQgZGlzcGxheSBjb252ZW50aW9ucyB0aGF0IGFyZSBsb2NhbGl6ZWQgdG8gYSBwYXJ0aWN1bGFyCi1jb3VudHJ5IG9yIGxhbmd1YWdlLiAgSG93ZXZlciwgdGhlIG1vZHVsZSB3YXMgY2FyZWZ1bCB0byBub3QgY2hhbmdlCi10aGUgbnVtZXJpYyBsb2NhbGUgYmVjYXVzZSB2YXJpb3VzIGZ1bmN0aW9ucyBpbiBQeXRob24ncwotaW1wbGVtZW50YXRpb24gcmVxdWlyZWQgdGhhdCB0aGUgbnVtZXJpYyBsb2NhbGUgcmVtYWluIHNldCB0byB0aGUKLVxjb2RleydDJ30gbG9jYWxlLiAgT2Z0ZW4gdGhpcyB3YXMgYmVjYXVzZSB0aGUgY29kZSB3YXMgdXNpbmcgdGhlIEMgbGlicmFyeSdzCi1cY2Z1bmN0aW9ue2F0b2YoKX0gZnVuY3Rpb24uICAKLQotTm90IHNldHRpbmcgdGhlIG51bWVyaWMgbG9jYWxlIGNhdXNlZCB0cm91YmxlIGZvciBleHRlbnNpb25zIHRoYXQgdXNlZAotdGhpcmQtcGFydHkgQyBsaWJyYXJpZXMsIGhvd2V2ZXIsIGJlY2F1c2UgdGhleSB3b3VsZG4ndCBoYXZlIHRoZQotY29ycmVjdCBsb2NhbGUgc2V0LiAgVGhlIG1vdGl2YXRpbmcgZXhhbXBsZSB3YXMgR1RLKywgd2hvc2UgdXNlcgotaW50ZXJmYWNlIHdpZGdldHMgd2VyZW4ndCBkaXNwbGF5aW5nIG51bWJlcnMgaW4gdGhlIGN1cnJlbnQgbG9jYWxlLgotCi1UaGUgc29sdXRpb24gZGVzY3JpYmVkIGluIHRoZSBQRVAgaXMgdG8gYWRkIHRocmVlIG5ldyBmdW5jdGlvbnMgdG8gdGhlCi1QeXRob24gQVBJIHRoYXQgcGVyZm9ybSBBU0NJSS1vbmx5IGNvbnZlcnNpb25zLCBpZ25vcmluZyB0aGUgbG9jYWxlCi1zZXR0aW5nOgotCi1cYmVnaW57aXRlbWl6ZX0KLSBcaXRlbSBcY2Z1bmN0aW9ue1B5T1NfYXNjaWlfc3RydG9kKFx2YXJ7c3RyfSwgXHZhcntwdHJ9KX0gCi1hbmQgXGNmdW5jdGlvbntQeU9TX2FzY2lpX2F0b2YoXHZhcntzdHJ9LCBcdmFye3B0cn0pfSAKLWJvdGggY29udmVydCBhIHN0cmluZyB0byBhIEMgXGN0eXBle2RvdWJsZX0uCi0gXGl0ZW0gXGNmdW5jdGlvbntQeU9TX2FzY2lpX2Zvcm1hdGQoXHZhcntidWZmZXJ9LCBcdmFye2J1Zl9sZW59LCBcdmFye2Zvcm1hdH0sIFx2YXJ7ZH0pfSBjb252ZXJ0cyBhIFxjdHlwZXtkb3VibGV9IHRvIGFuIEFTQ0lJIHN0cmluZy4KLVxlbmR7aXRlbWl6ZX0KLQotVGhlIGNvZGUgZm9yIHRoZXNlIGZ1bmN0aW9ucyBjYW1lIGZyb20gdGhlIEdMaWIgbGlicmFyeQotKFx1cmx7aHR0cDovL2RldmVsb3Blci5nbm9tZS5vcmcvYXJjaC9ndGsvZ2xpYi5odG1sfSksIHdob3NlCi1kZXZlbG9wZXJzIGtpbmRseSByZWxpY2Vuc2VkIHRoZSByZWxldmFudCBmdW5jdGlvbnMgYW5kIGRvbmF0ZWQgdGhlbQotdG8gdGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIFxtb2R1bGV7bG9jYWxlfSBtb2R1bGUgCi1jYW4gbm93IGNoYW5nZSB0aGUgbnVtZXJpYyBsb2NhbGUsIGxldHRpbmcgZXh0ZW5zaW9ucyBzdWNoIGFzIEdUSysgCi1wcm9kdWNlIHRoZSBjb3JyZWN0IHJlc3VsdHMuCi0KLVxiZWdpbntzZWVhbHNvfQotXHNlZXBlcHszMzF9e0xvY2FsZS1JbmRlcGVuZGVudCBGbG9hdC9TdHJpbmcgQ29udmVyc2lvbnN9Ci17V3JpdHRlbiBieSBDaHJpc3RpYW4gUi4gUmVpcywgYW5kIGltcGxlbWVudGVkIGJ5IEd1c3Rhdm8gQ2FybmVpcm8ufQotXGVuZHtzZWVhbHNvfSAgICAgIAotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257T3RoZXIgTGFuZ3VhZ2UgQ2hhbmdlc30KLQotSGVyZSBhcmUgYWxsIG9mIHRoZSBjaGFuZ2VzIHRoYXQgUHl0aG9uIDIuNCBtYWtlcyB0byB0aGUgY29yZSBQeXRob24KLWxhbmd1YWdlLgotCi1cYmVnaW57aXRlbWl6ZX0KLQotXGl0ZW0gRGVjb3JhdG9ycyBmb3IgZnVuY3Rpb25zIGFuZCBtZXRob2RzIHdlcmUgYWRkZWQgKFxwZXB7MzE4fSkuCi0KLVxpdGVtIEJ1aWx0LWluIFxmdW5jdGlvbntzZXR9IGFuZCBcZnVuY3Rpb257ZnJvemVuc2V0fSB0eXBlcyB3ZXJlIAotYWRkZWQgKFxwZXB7MjE4fSkuICBPdGhlciBuZXcgYnVpbHQtaW5zIGluY2x1ZGUgdGhlIFxmdW5jdGlvbntyZXZlcnNlZChcdmFye3NlcX0pfSBmdW5jdGlvbiAoXHBlcHszMjJ9KS4KLQotXGl0ZW0gR2VuZXJhdG9yIGV4cHJlc3Npb25zIHdlcmUgYWRkZWQgKFxwZXB7Mjg5fSkuCi0KLVxpdGVtIENlcnRhaW4gbnVtZXJpYyBleHByZXNzaW9ucyBubyBsb25nZXIgcmV0dXJuIHZhbHVlcyByZXN0cmljdGVkIHRvIDMyIG9yIDY0IGJpdHMgKFxwZXB7MjM3fSkuCi0KLVxpdGVtIFlvdSBjYW4gbm93IHB1dCBwYXJlbnRoZXNlcyBhcm91bmQgdGhlIGxpc3Qgb2YgbmFtZXMgaW4gYQotXGNvZGV7ZnJvbSBcdmFye21vZHVsZX0gaW1wb3J0IFx2YXJ7bmFtZXN9fSBzdGF0ZW1lbnQgKFxwZXB7MzI4fSkuCi0KLVxpdGVtIFRoZSBcbWV0aG9ke2RpY3QudXBkYXRlKCl9IG1ldGhvZCBub3cgYWNjZXB0cyB0aGUgc2FtZQotYXJndW1lbnQgZm9ybXMgYXMgdGhlIFxjbGFzc3tkaWN0fSBjb25zdHJ1Y3Rvci4gIFRoaXMgaW5jbHVkZXMgYW55Ci1tYXBwaW5nLCBhbnkgaXRlcmFibGUgb2Yga2V5L3ZhbHVlIHBhaXJzLCBhbmQga2V5d29yZCBhcmd1bWVudHMuCi0oQ29udHJpYnV0ZWQgYnkgUmF5bW9uZCBIZXR0aW5nZXIuKQotCi1caXRlbSBUaGUgc3RyaW5nIG1ldGhvZHMgXG1ldGhvZHtsanVzdCgpfSwgXG1ldGhvZHtyanVzdCgpfSwgYW5kCi1cbWV0aG9ke2NlbnRlcigpfSBub3cgdGFrZSBhbiBvcHRpb25hbCBhcmd1bWVudCBmb3Igc3BlY2lmeWluZyBhCi1maWxsIGNoYXJhY3RlciBvdGhlciB0aGFuIGEgc3BhY2UuCi0oQ29udHJpYnV0ZWQgYnkgUmF5bW9uZCBIZXR0aW5nZXIuKQotCi1caXRlbSBTdHJpbmdzIGFsc28gZ2FpbmVkIGFuIFxtZXRob2R7cnNwbGl0KCl9IG1ldGhvZCB0aGF0Ci13b3JrcyBsaWtlIHRoZSBcbWV0aG9ke3NwbGl0KCl9IG1ldGhvZCBidXQgc3BsaXRzIGZyb20gdGhlIGVuZCBvZgotdGhlIHN0cmluZy4gIAotKENvbnRyaWJ1dGVkIGJ5IFNlYW4gUmVpZnNjaG5laWRlci4pCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiAnd3d3LnB5dGhvbi5vcmcnLnNwbGl0KCcuJywgMSkKLVsnd3d3JywgJ3B5dGhvbi5vcmcnXQotJ3d3dy5weXRob24ub3JnJy5yc3BsaXQoJy4nLCAxKQotWyd3d3cucHl0aG9uJywgJ29yZyddICAgICAgICAKLVxlbmR7dmVyYmF0aW19ICAgICAgCi0KLVxpdGVtIFRocmVlIGtleXdvcmQgcGFyYW1ldGVycywgXHZhcntjbXB9LCBcdmFye2tleX0sIGFuZAotXHZhcntyZXZlcnNlfSwgd2VyZSBhZGRlZCB0byB0aGUgXG1ldGhvZHtzb3J0KCl9IG1ldGhvZCBvZiBsaXN0cy4KLVRoZXNlIHBhcmFtZXRlcnMgbWFrZSBzb21lIGNvbW1vbiB1c2FnZXMgb2YgXG1ldGhvZHtzb3J0KCl9IHNpbXBsZXIuCi1BbGwgb2YgdGhlc2UgcGFyYW1ldGVycyBhcmUgb3B0aW9uYWwuCi0KLUZvciB0aGUgXHZhcntjbXB9IHBhcmFtZXRlciwgdGhlIHZhbHVlIHNob3VsZCBiZSBhIGNvbXBhcmlzb24gZnVuY3Rpb24KLXRoYXQgdGFrZXMgdHdvIHBhcmFtZXRlcnMgYW5kIHJldHVybnMgLTEsIDAsIG9yICsxIGRlcGVuZGluZyBvbiBob3cKLXRoZSBwYXJhbWV0ZXJzIGNvbXBhcmUuICBUaGlzIGZ1bmN0aW9uIHdpbGwgdGhlbiBiZSB1c2VkIHRvIHNvcnQgdGhlCi1saXN0LiAgUHJldmlvdXNseSB0aGlzIHdhcyB0aGUgb25seSBwYXJhbWV0ZXIgdGhhdCBjb3VsZCBiZSBwcm92aWRlZAotdG8gXG1ldGhvZHtzb3J0KCl9LgotCi1cdmFye2tleX0gc2hvdWxkIGJlIGEgc2luZ2xlLXBhcmFtZXRlciBmdW5jdGlvbiB0aGF0IHRha2VzIGEgbGlzdAotZWxlbWVudCBhbmQgcmV0dXJucyBhIGNvbXBhcmlzb24ga2V5IGZvciB0aGUgZWxlbWVudC4gIFRoZSBsaXN0IGlzCi10aGVuIHNvcnRlZCB1c2luZyB0aGUgY29tcGFyaXNvbiBrZXlzLiAgVGhlIGZvbGxvd2luZyBleGFtcGxlIHNvcnRzIGEKLWxpc3QgY2FzZS1pbnNlbnNpdGl2ZWx5OgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gTCA9IFsnQScsICdiJywgJ2MnLCAnRCddCi0+Pj4gTC5zb3J0KCkgICAgICAgICAgICAgICAgICMgQ2FzZS1zZW5zaXRpdmUgc29ydAotPj4+IEwKLVsnQScsICdEJywgJ2InLCAnYyddCi0+Pj4gIyBVc2luZyAna2V5JyBwYXJhbWV0ZXIgdG8gc29ydCBsaXN0Ci0+Pj4gTC5zb3J0KGtleT1sYW1iZGEgeDogeC5sb3dlcigpKQotPj4+IEwKLVsnQScsICdiJywgJ2MnLCAnRCddCi0+Pj4gIyBPbGQtZmFzaGlvbmVkIHdheQotPj4+IEwuc29ydChjbXA9bGFtYmRhIHgseTogY21wKHgubG93ZXIoKSwgeS5sb3dlcigpKSkKLT4+PiBMCi1bJ0EnLCAnYicsICdjJywgJ0QnXQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGxhc3QgZXhhbXBsZSwgd2hpY2ggdXNlcyB0aGUgXHZhcntjbXB9IHBhcmFtZXRlciwgaXMgdGhlIG9sZCB3YXkKLXRvIHBlcmZvcm0gYSBjYXNlLWluc2Vuc2l0aXZlIHNvcnQuICBJdCB3b3JrcyBidXQgaXMgc2xvd2VyIHRoYW4gdXNpbmcKLWEgXHZhcntrZXl9IHBhcmFtZXRlci4gIFVzaW5nIFx2YXJ7a2V5fSBjYWxscyBcbWV0aG9ke2xvd2VyKCl9IG1ldGhvZAotb25jZSBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBsaXN0IHdoaWxlIHVzaW5nIFx2YXJ7Y21wfSB3aWxsIGNhbGwgaXQKLXR3aWNlIGZvciBlYWNoIGNvbXBhcmlzb24sIHNvIHVzaW5nIFx2YXJ7a2V5fSBzYXZlcyBvbiBpbnZvY2F0aW9ucyBvZgotdGhlIFxtZXRob2R7bG93ZXIoKX0gbWV0aG9kLgotCi1Gb3Igc2ltcGxlIGtleSBmdW5jdGlvbnMgYW5kIGNvbXBhcmlzb24gZnVuY3Rpb25zLCBpdCBpcyBvZnRlbgotcG9zc2libGUgdG8gYXZvaWQgYSBca2V5d29yZHtsYW1iZGF9IGV4cHJlc3Npb24gYnkgdXNpbmcgYW4gdW5ib3VuZAotbWV0aG9kIGluc3RlYWQuICBGb3IgZXhhbXBsZSwgdGhlIGFib3ZlIGNhc2UtaW5zZW5zaXRpdmUgc29ydCBpcyBiZXN0Ci13cml0dGVuIGFzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gTC5zb3J0KGtleT1zdHIubG93ZXIpCi0+Pj4gTAotWydBJywgJ2InLCAnYycsICdEJ10KLVxlbmR7dmVyYmF0aW19ICAgICAgIAotCi1GaW5hbGx5LCB0aGUgXHZhcntyZXZlcnNlfSBwYXJhbWV0ZXIgdGFrZXMgYSBCb29sZWFuIHZhbHVlLiAgSWYgdGhlCi12YWx1ZSBpcyB0cnVlLCB0aGUgbGlzdCB3aWxsIGJlIHNvcnRlZCBpbnRvIHJldmVyc2Ugb3JkZXIuCi1JbnN0ZWFkIG9mIFxjb2Rle0wuc29ydCgpIDsgTC5yZXZlcnNlKCl9LCB5b3UgY2FuIG5vdyB3cml0ZQotXGNvZGV7TC5zb3J0KHJldmVyc2U9VHJ1ZSl9LgotCi1UaGUgcmVzdWx0cyBvZiBzb3J0aW5nIGFyZSBub3cgZ3VhcmFudGVlZCB0byBiZSBzdGFibGUuICBUaGlzIG1lYW5zCi10aGF0IHR3byBlbnRyaWVzIHdpdGggZXF1YWwga2V5cyB3aWxsIGJlIHJldHVybmVkIGluIHRoZSBzYW1lIG9yZGVyIGFzCi10aGV5IHdlcmUgaW5wdXQuICBGb3IgZXhhbXBsZSwgeW91IGNhbiBzb3J0IGEgbGlzdCBvZiBwZW9wbGUgYnkgbmFtZSwKLWFuZCB0aGVuIHNvcnQgdGhlIGxpc3QgYnkgYWdlLCByZXN1bHRpbmcgaW4gYSBsaXN0IHNvcnRlZCBieSBhZ2Ugd2hlcmUKLXBlb3BsZSB3aXRoIHRoZSBzYW1lIGFnZSBhcmUgaW4gbmFtZS1zb3J0ZWQgb3JkZXIuCi0KLShBbGwgY2hhbmdlcyB0byBcbWV0aG9ke3NvcnQoKX0gY29udHJpYnV0ZWQgYnkgUmF5bW9uZCBIZXR0aW5nZXIuKQotCi1caXRlbSBUaGVyZSBpcyBhIG5ldyBidWlsdC1pbiBmdW5jdGlvbgotXGZ1bmN0aW9ue3NvcnRlZChcdmFye2l0ZXJhYmxlfSl9IHRoYXQgd29ya3MgbGlrZSB0aGUgaW4tcGxhY2UKLVxtZXRob2R7bGlzdC5zb3J0KCl9IG1ldGhvZCBidXQgY2FuIGJlIHVzZWQgaW4KLWV4cHJlc3Npb25zLiAgVGhlIGRpZmZlcmVuY2VzIGFyZToKLSAgXGJlZ2lue2l0ZW1pemV9Ci0gIFxpdGVtIHRoZSBpbnB1dCBtYXkgYmUgYW55IGl0ZXJhYmxlOwotICBcaXRlbSBhIG5ld2x5IGZvcm1lZCBjb3B5IGlzIHNvcnRlZCwgbGVhdmluZyB0aGUgb3JpZ2luYWwgaW50YWN0OyBhbmQKLSAgXGl0ZW0gdGhlIGV4cHJlc3Npb24gcmV0dXJucyB0aGUgbmV3IHNvcnRlZCBjb3B5Ci0gIFxlbmR7aXRlbWl6ZX0KLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IEwgPSBbOSw3LDgsMywyLDQsMSw2LDVdCi0+Pj4gWzEwK2kgZm9yIGkgaW4gc29ydGVkKEwpXSAgICAgICAjIHVzYWJsZSBpbiBhIGxpc3QgY29tcHJlaGVuc2lvbgotWzExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTldCi0+Pj4gTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9yaWdpbmFsIGlzIGxlZnQgdW5jaGFuZ2VkCi1bOSw3LDgsMywyLDQsMSw2LDVdCi0+Pj4gc29ydGVkKCdNb250eSBQeXRob24nKSAgICAgICAgICAjIGFueSBpdGVyYWJsZSBtYXkgYmUgYW4gaW5wdXQKLVsnICcsICdNJywgJ1AnLCAnaCcsICduJywgJ24nLCAnbycsICdvJywgJ3QnLCAndCcsICd5JywgJ3knXQotCi0+Pj4gIyBMaXN0IHRoZSBjb250ZW50cyBvZiBhIGRpY3Qgc29ydGVkIGJ5IGtleSB2YWx1ZXMKLT4+PiBjb2xvcm1hcCA9IGRpY3QocmVkPTEsIGJsdWU9MiwgZ3JlZW49MywgYmxhY2s9NCwgeWVsbG93PTUpCi0+Pj4gZm9yIGssIHYgaW4gc29ydGVkKGNvbG9ybWFwLml0ZXJpdGVtcygpKToKLS4uLiAgICAgcHJpbnQgaywgdgotLi4uCi1ibGFjayA0Ci1ibHVlIDIKLWdyZWVuIDMKLXJlZCAxCi15ZWxsb3cgNQotXGVuZHt2ZXJiYXRpbX0KLQotKENvbnRyaWJ1dGVkIGJ5IFJheW1vbmQgSGV0dGluZ2VyLikKLQotXGl0ZW0gSW50ZWdlciBvcGVyYXRpb25zIHdpbGwgbm8gbG9uZ2VyIHRyaWdnZXIgYW4gXGV4Y2VwdGlvbntPdmVyZmxvd1dhcm5pbmd9LgotVGhlIFxleGNlcHRpb257T3ZlcmZsb3dXYXJuaW5nfSB3YXJuaW5nIHdpbGwgZGlzYXBwZWFyIGluIFB5dGhvbiAyLjUuCi0KLVxpdGVtIFRoZSBpbnRlcnByZXRlciBnYWluZWQgYSBuZXcgc3dpdGNoLCBccHJvZ3JhbW9wdHstbX0sIHRoYXQKLXRha2VzIGEgbmFtZSwgc2VhcmNoZXMgZm9yIHRoZSBjb3JyZXNwb25kaW5nICBtb2R1bGUgb24gXGNvZGV7c3lzLnBhdGh9LAotYW5kIHJ1bnMgdGhlIG1vZHVsZSBhcyBhIHNjcmlwdC4gIEZvciBleGFtcGxlLCAKLXlvdSBjYW4gbm93IHJ1biB0aGUgUHl0aG9uIHByb2ZpbGVyIHdpdGggXGNvZGV7cHl0aG9uIC1tIHByb2ZpbGV9LgotKENvbnRyaWJ1dGVkIGJ5IE5pY2sgQ29naGxhbi4pCi0KLVxpdGVtIFRoZSBcZnVuY3Rpb257ZXZhbChcdmFye2V4cHJ9LCBcdmFye2dsb2JhbHN9LCBcdmFye2xvY2Fsc30pfQotYW5kIFxmdW5jdGlvbntleGVjZmlsZShcdmFye2ZpbGVuYW1lfSwgXHZhcntnbG9iYWxzfSwgXHZhcntsb2NhbHN9KX0KLWZ1bmN0aW9ucyBhbmQgdGhlIFxrZXl3b3Jke2V4ZWN9IHN0YXRlbWVudCBub3cgYWNjZXB0IGFueSBtYXBwaW5nIHR5cGUKLWZvciB0aGUgXHZhcntsb2NhbHN9IHBhcmFtZXRlci4gIFByZXZpb3VzbHkgdGhpcyBoYWQgdG8gYmUgYSByZWd1bGFyCi1QeXRob24gZGljdGlvbmFyeS4gIChDb250cmlidXRlZCBieSBSYXltb25kIEhldHRpbmdlci4pCi0KLVxpdGVtIFRoZSBcZnVuY3Rpb257emlwKCl9IGJ1aWx0LWluIGZ1bmN0aW9uIGFuZCBcZnVuY3Rpb257aXRlcnRvb2xzLml6aXAoKX0KLSAgbm93IHJldHVybiBhbiBlbXB0eSBsaXN0IGlmIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50cy4KLSAgUHJldmlvdXNseSB0aGV5IHJhaXNlZCBhIFxleGNlcHRpb257VHlwZUVycm9yfQotICBleGNlcHRpb24uICBUaGlzIG1ha2VzIHRoZW0gbW9yZQotICBzdWl0YWJsZSBmb3IgdXNlIHdpdGggdmFyaWFibGUgbGVuZ3RoIGFyZ3VtZW50IGxpc3RzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gZGVmIHRyYW5zcG9zZShhcnJheSk6Ci0uLi4gICAgcmV0dXJuIHppcCgqYXJyYXkpCi0uLi4KLT4+PiB0cmFuc3Bvc2UoWygxLDIsMyksICg0LDUsNildKQotWygxLCA0KSwgKDIsIDUpLCAoMywgNildCi0+Pj4gdHJhbnNwb3NlKFtdKQotW10KLVxlbmR7dmVyYmF0aW19Ci0oQ29udHJpYnV0ZWQgYnkgUmF5bW9uZCBIZXR0aW5nZXIuKQotICAgIAotXGl0ZW0gRW5jb3VudGVyaW5nIGEgZmFpbHVyZSB3aGlsZSBpbXBvcnRpbmcgYSBtb2R1bGUgbm8gbG9uZ2VyIGxlYXZlcwotYSBwYXJ0aWFsbHktaW5pdGlhbGl6ZWQgbW9kdWxlIG9iamVjdCBpbiBcY29kZXtzeXMubW9kdWxlc30uICBUaGUKLWluY29tcGxldGUgbW9kdWxlIG9iamVjdCBsZWZ0IGJlaGluZCB3b3VsZCBmb29sIGZ1cnRoZXIgaW1wb3J0cyBvZiB0aGUKLXNhbWUgbW9kdWxlIGludG8gc3VjY2VlZGluZywgbGVhZGluZyB0byBjb25mdXNpbmcgZXJyb3JzLiAgCi0oRml4ZWQgYnkgVGltIFBldGVycy4pCi0KLVxpdGVtIFxjb25zdGFudHtOb25lfSBpcyBub3cgYSBjb25zdGFudDsgY29kZSB0aGF0IGJpbmRzIGEgbmV3IHZhbHVlIHRvIAotdGhlIG5hbWUgXHNhbXB7Tm9uZX0gaXMgbm93IGEgc3ludGF4IGVycm9yLgotKENvbnRyaWJ1dGVkIGJ5IFJheW1vbmQgSGV0dGluZ2VyLikgICAgICAgCi0KLVxlbmR7aXRlbWl6ZX0KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHN1YnNlY3Rpb257T3B0aW1pemF0aW9uc30KLQotXGJlZ2lue2l0ZW1pemV9Ci0KLVxpdGVtIFRoZSBpbm5lciBsb29wcyBmb3IgbGlzdCBhbmQgdHVwbGUgc2xpY2luZwotIHdlcmUgb3B0aW1pemVkIGFuZCBub3cgcnVuIGFib3V0IG9uZS10aGlyZCBmYXN0ZXIuICBUaGUgaW5uZXIgbG9vcHMKLSBmb3IgZGljdGlvbmFyaWVzIHdlcmUgYWxzbyBvcHRpbWl6ZWQsIHJlc3VsdGluZyBpbiBwZXJmb3JtYW5jZSBib29zdHMgZm9yCi0gXG1ldGhvZHtrZXlzKCl9LCBcbWV0aG9ke3ZhbHVlcygpfSwgXG1ldGhvZHtpdGVtcygpfSwKLSBcbWV0aG9ke2l0ZXJrZXlzKCl9LCBcbWV0aG9ke2l0ZXJ2YWx1ZXMoKX0sIGFuZCBcbWV0aG9ke2l0ZXJpdGVtcygpfS4KLSAoQ29udHJpYnV0ZWQgYnkgUmF5bW9uZCBIZXR0aW5nZXIuKQotCi1caXRlbSBUaGUgbWFjaGluZXJ5IGZvciBncm93aW5nIGFuZCBzaHJpbmtpbmcgbGlzdHMgd2FzIG9wdGltaXplZCBmb3IKLSBzcGVlZCBhbmQgZm9yIHNwYWNlIGVmZmljaWVuY3kuICBBcHBlbmRpbmcgYW5kIHBvcHBpbmcgZnJvbSBsaXN0cyBub3cKLSBydW5zIGZhc3RlciBkdWUgdG8gbW9yZSBlZmZpY2llbnQgY29kZSBwYXRocyBhbmQgbGVzcyBmcmVxdWVudCB1c2Ugb2YKLSB0aGUgdW5kZXJseWluZyBzeXN0ZW0gXGNmdW5jdGlvbntyZWFsbG9jKCl9LiAgTGlzdCBjb21wcmVoZW5zaW9ucwotIGFsc28gYmVuZWZpdC4gICBcbWV0aG9ke2xpc3QuZXh0ZW5kKCl9IHdhcyBhbHNvIG9wdGltaXplZCBhbmQgbm8KLSBsb25nZXIgY29udmVydHMgaXRzIGFyZ3VtZW50IGludG8gYSB0ZW1wb3JhcnkgbGlzdCBiZWZvcmUgZXh0ZW5kaW5nCi0gdGhlIGJhc2UgbGlzdC4gIChDb250cmlidXRlZCBieSBSYXltb25kIEhldHRpbmdlci4pCi0KLVxpdGVtIFxmdW5jdGlvbntsaXN0KCl9LCBcZnVuY3Rpb257dHVwbGUoKX0sIFxmdW5jdGlvbnttYXAoKX0sCi0gIFxmdW5jdGlvbntmaWx0ZXIoKX0sIGFuZCBcZnVuY3Rpb257emlwKCl9IG5vdyBydW4gc2V2ZXJhbCB0aW1lcwotICBmYXN0ZXIgd2l0aCBub24tc2VxdWVuY2UgYXJndW1lbnRzIHRoYXQgc3VwcGx5IGEgXG1ldGhvZHtfX2xlbl9fKCl9Ci0gIG1ldGhvZC4gIChDb250cmlidXRlZCBieSBSYXltb25kIEhldHRpbmdlci4pCi0KLVxpdGVtIFRoZSBtZXRob2RzIFxtZXRob2R7bGlzdC5fX2dldGl0ZW1fXygpfSwKLSAgXG1ldGhvZHtkaWN0Ll9fZ2V0aXRlbV9fKCl9LCBhbmQgXG1ldGhvZHtkaWN0Ll9fY29udGFpbnNfXygpfSBhcmUKLSAgYXJlIG5vdyBpbXBsZW1lbnRlZCBhcyBcY2xhc3N7bWV0aG9kX2Rlc2NyaXB0b3J9IG9iamVjdHMgcmF0aGVyCi0gIHRoYW4gXGNsYXNze3dyYXBwZXJfZGVzY3JpcHRvcn0gb2JqZWN0cy4gIFRoaXMgZm9ybSBvZiAKLSAgYWNjZXNzIGRvdWJsZXMgdGhlaXIgcGVyZm9ybWFuY2UgYW5kIG1ha2VzIHRoZW0gbW9yZSBzdWl0YWJsZSBmb3IKLSAgdXNlIGFzIGFyZ3VtZW50cyB0byBmdW5jdGlvbmFsczoKLSAgXHNhbXB7bWFwKG15ZGljdC5fX2dldGl0ZW1fXywga2V5bGlzdCl9LgotICAoQ29udHJpYnV0ZWQgYnkgUmF5bW9uZCBIZXR0aW5nZXIuKQotCi1caXRlbSBBZGRlZCBhIG5ldyBvcGNvZGUsIFxjb2Rle0xJU1RfQVBQRU5EfSwgdGhhdCBzaW1wbGlmaWVzCi0gIHRoZSBnZW5lcmF0ZWQgYnl0ZWNvZGUgZm9yIGxpc3QgY29tcHJlaGVuc2lvbnMgYW5kIHNwZWVkcyB0aGVtIHVwCi0gIGJ5IGFib3V0IGEgdGhpcmQuICAoQ29udHJpYnV0ZWQgYnkgUmF5bW9uZCBIZXR0aW5nZXIuKQotCi1caXRlbSBUaGUgcGVlcGhvbGUgYnl0ZWNvZGUgb3B0aW1pemVyIGhhcyBiZWVuIGltcHJvdmVkIHRvIAotcHJvZHVjZSBzaG9ydGVyLCBmYXN0ZXIgYnl0ZWNvZGU7IHJlbWFya2FibHksIHRoZSByZXN1bHRpbmcgYnl0ZWNvZGUgaXMgCi1tb3JlIHJlYWRhYmxlLiAgKEVuaGFuY2VkIGJ5IFJheW1vbmQgSGV0dGluZ2VyLikKLQotXGl0ZW0gU3RyaW5nIGNvbmNhdGVuYXRpb25zIGluIHN0YXRlbWVudHMgb2YgdGhlIGZvcm0gXGNvZGV7cyA9IHMgKwotImFiYyJ9IGFuZCBcY29kZXtzICs9ICJhYmMifSBhcmUgbm93IHBlcmZvcm1lZCBtb3JlIGVmZmljaWVudGx5IGluCi1jZXJ0YWluIGNpcmN1bXN0YW5jZXMuICBUaGlzIG9wdGltaXphdGlvbiB3b24ndCBiZSBwcmVzZW50IGluIG90aGVyCi1QeXRob24gaW1wbGVtZW50YXRpb25zIHN1Y2ggYXMgSnl0aG9uLCBzbyB5b3Ugc2hvdWxkbid0IHJlbHkgb24gaXQ7Ci11c2luZyB0aGUgXG1ldGhvZHtqb2luKCl9IG1ldGhvZCBvZiBzdHJpbmdzIGlzIHN0aWxsIHJlY29tbWVuZGVkIHdoZW4KLXlvdSB3YW50IHRvIGVmZmljaWVudGx5IGdsdWUgYSBsYXJnZSBudW1iZXIgb2Ygc3RyaW5ncyB0b2dldGhlci4KLShDb250cmlidXRlZCBieSBBcm1pbiBSaWdvLikgICAgICAgCi0KLVxlbmR7aXRlbWl6ZX0KLQotJSBweXN0b25lIGlzIGFsbW9zdCB1c2VsZXNzIGZvciBjb21wYXJpbmcgZGlmZmVyZW50IHZlcnNpb25zIG9mIFB5dGhvbjsKLSUgaW5zdGVhZCwgaXQgZXhjZWxzIGF0IHByZWRpY3RpbmcgcmVsYXRpdmUgUHl0aG9uIHBlcmZvcm1hbmNlIG9uCi0lIGRpZmZlcmVudCBtYWNoaW5lcy4KLSUgU28sIHRoaXMgc2VjdGlvbiB3b3VsZCBiZSBtb3JlIGluZm9ybWF0aXZlIGlmIGl0IHVzZWQgb3RoZXIgdG9vbHMKLSUgc3VjaCBhcyBweWJlbmNoIGFuZCBwYXJyb3RiZW5jaC4gIEZvciBhIG1vcmUgYXBwbGljYXRpb24gb3JpZW50ZWQKLSUgYmVuY2htYXJrLCB0cnkgY29tcGFyaW5nIHRoZSB0aW1pbmdzIG9mIHRlc3RfZGVjaW1hbC5weSB1bmRlciAyLjMKLSUgYW5kIDIuNC4KLSAgICAgICAKLVRoZSBuZXQgcmVzdWx0IG9mIHRoZSAyLjQgb3B0aW1pemF0aW9ucyBpcyB0aGF0IFB5dGhvbiAyLjQgcnVucyB0aGUKLXB5c3RvbmUgYmVuY2htYXJrIGFyb3VuZCA1XCUgZmFzdGVyIHRoYW4gUHl0aG9uIDIuMyBhbmQgMzVcJSBmYXN0ZXIKLXRoYW4gUHl0aG9uIDIuMi4gIChweXN0b25lIGlzIG5vdCBhIHBhcnRpY3VsYXJseSBnb29kIGJlbmNobWFyaywgYnV0Ci1pdCdzIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgbWVhc3VyZW1lbnQgb2YgUHl0aG9uJ3MgcGVyZm9ybWFuY2UuICBZb3VyCi1vd24gYXBwbGljYXRpb25zIG1heSBzaG93IGdyZWF0ZXIgb3Igc21hbGxlciBiZW5lZml0cyBmcm9tIFB5dGhvbn4yLjQuKQotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntOZXcsIEltcHJvdmVkLCBhbmQgRGVwcmVjYXRlZCBNb2R1bGVzfQotCi1BcyB1c3VhbCwgUHl0aG9uJ3Mgc3RhbmRhcmQgbGlicmFyeSByZWNlaXZlZCBhIG51bWJlciBvZiBlbmhhbmNlbWVudHMgYW5kCi1idWcgZml4ZXMuICBIZXJlJ3MgYSBwYXJ0aWFsIGxpc3Qgb2YgdGhlIG1vc3Qgbm90YWJsZSBjaGFuZ2VzLCBzb3J0ZWQKLWFscGhhYmV0aWNhbGx5IGJ5IG1vZHVsZSBuYW1lLiBDb25zdWx0IHRoZQotXGZpbGV7TWlzYy9ORVdTfSBmaWxlIGluIHRoZSBzb3VyY2UgdHJlZSBmb3IgYSBtb3JlCi1jb21wbGV0ZSBsaXN0IG9mIGNoYW5nZXMsIG9yIGxvb2sgdGhyb3VnaCB0aGUgQ1ZTIGxvZ3MgZm9yIGFsbCB0aGUKLWRldGFpbHMuCi0KLVxiZWdpbntpdGVtaXplfQotCi1caXRlbSBUaGUgXG1vZHVsZXthc3luY29yZX0gbW9kdWxlJ3MgXGZ1bmN0aW9ue2xvb3AoKX0gZnVuY3Rpb24gbm93Ci0gICBoYXMgYSBcdmFye2NvdW50fSBwYXJhbWV0ZXIgdGhhdCBsZXRzIHlvdSBwZXJmb3JtIGEgbGltaXRlZCBudW1iZXIKLSAgIG9mIHBhc3NlcyB0aHJvdWdoIHRoZSBwb2xsaW5nIGxvb3AuICBUaGUgZGVmYXVsdCBpcyBzdGlsbCB0byBsb29wCi0gICBmb3JldmVyLgotCi1caXRlbSBUaGUgXG1vZHVsZXtiYXNlNjR9IG1vZHVsZSBub3cgaGFzIG1vcmUgY29tcGxldGUgUkZDIDM1NDggc3VwcG9ydAotICBmb3IgQmFzZTY0LCBCYXNlMzIsIGFuZCBCYXNlMTYgZW5jb2RpbmcgYW5kIGRlY29kaW5nLCBpbmNsdWRpbmcKLSAgb3B0aW9uYWwgY2FzZSBmb2xkaW5nIGFuZCBvcHRpb25hbCBhbHRlcm5hdGl2ZSBhbHBoYWJldHMuCi0gIChDb250cmlidXRlZCBieSBCYXJyeSBXYXJzYXcuKQotCi1caXRlbSBUaGUgXG1vZHVsZXtiaXNlY3R9IG1vZHVsZSBub3cgaGFzIGFuIHVuZGVybHlpbmcgQyBpbXBsZW1lbnRhdGlvbgotICAgZm9yIGltcHJvdmVkIHBlcmZvcm1hbmNlLgotICAgKENvbnRyaWJ1dGVkIGJ5IERtaXRyeSBWYXNpbGlldi4pCi0KLVxpdGVtIFRoZSBDSktDb2RlY3MgY29sbGVjdGlvbnMgb2YgRWFzdCBBc2lhbiBjb2RlY3MsIG1haW50YWluZWQKLWJ5IEh5ZS1TaGlrIENoYW5nLCB3YXMgaW50ZWdyYXRlZCBpbnRvIDIuNC4gIAotVGhlIG5ldyBlbmNvZGluZ3MgYXJlOgotCi1cYmVnaW57aXRlbWl6ZX0KLSBcaXRlbSBDaGluZXNlIChQUkMpOiBnYjIzMTIsIGdiaywgZ2IxODAzMCwgYmlnNWhrc2NzLCBoegotIFxpdGVtIENoaW5lc2UgKFJPQyk6IGJpZzUsIGNwOTUwCi0gXGl0ZW0gSmFwYW5lc2U6IGNwOTMyLCBldWMtamlzLTIwMDQsIGV1Yy1qcCwKLWV1Yy1qaXN4MDIxMywgaXNvLTIwMjItanAsIGlzby0yMDIyLWpwLTEsIGlzby0yMDIyLWpwLTIsCi0gaXNvLTIwMjItanAtMywgaXNvLTIwMjItanAtZXh0LCBpc28tMjAyMi1qcC0yMDA0LAotIHNoaWZ0LWppcywgc2hpZnQtamlzeDAyMTMsIHNoaWZ0LWppcy0yMDA0Ci0gXGl0ZW0gS29yZWFuOiBjcDk0OSwgZXVjLWtyLCBqb2hhYiwgaXNvLTIwMjIta3IKLVxlbmR7aXRlbWl6ZX0gCi0KLVxpdGVtIFNvbWUgb3RoZXIgbmV3IGVuY29kaW5ncyB3ZXJlIGFkZGVkOiBIUCBSb21hbjgsIAotSVNPXzg4NTktMTEsIElTT184ODU5LTE2LCBQQ1RQLTE1NCwgYW5kIFRJUy02MjAuCi0KLVxpdGVtIFRoZSBVVEYtOCBhbmQgVVRGLTE2IGNvZGVjcyBub3cgY29wZSBiZXR0ZXIgd2l0aCByZWNlaXZpbmcgcGFydGlhbCBpbnB1dC4KLVByZXZpb3VzbHkgdGhlIFxjbGFzc3tTdHJlYW1SZWFkZXJ9IGNsYXNzIHdvdWxkIHRyeSB0byByZWFkIG1vcmUgZGF0YSwKLW1ha2luZyBpdCBpbXBvc3NpYmxlIHRvIHJlc3VtZSBkZWNvZGluZyBmcm9tIHRoZSBzdHJlYW0uICBUaGUKLVxtZXRob2R7cmVhZCgpfSBtZXRob2Qgd2lsbCBub3cgcmV0dXJuIGFzIG11Y2ggZGF0YSBhcyBpdCBjYW4gYW5kIGZ1dHVyZQotY2FsbHMgd2lsbCByZXN1bWUgZGVjb2Rpbmcgd2hlcmUgcHJldmlvdXMgb25lcyBsZWZ0IG9mZi4gCi0oSW1wbGVtZW50ZWQgYnkgV2FsdGVyIERcIm9yd2FsZC4pCi0KLVxpdGVtIFRoZXJlIGlzIGEgbmV3IFxtb2R1bGV7Y29sbGVjdGlvbnN9IG1vZHVsZSBmb3IgCi0gICB2YXJpb3VzIHNwZWNpYWxpemVkIGNvbGxlY3Rpb24gZGF0YXR5cGVzLiAgCi0gICBDdXJyZW50bHkgaXQgY29udGFpbnMganVzdCBvbmUgdHlwZSwgXGNsYXNze2RlcXVlfSwgCi0gICBhIGRvdWJsZS1lbmRlZCBxdWV1ZSB0aGF0IHN1cHBvcnRzIGVmZmljaWVudGx5IGFkZGluZyBhbmQgcmVtb3ZpbmcKLSAgIGVsZW1lbnRzIGZyb20gZWl0aGVyIGVuZDoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCi0+Pj4gZCA9IGRlcXVlKCdnaGknKSAgICAgICAgIyBtYWtlIGEgbmV3IGRlcXVlIHdpdGggdGhyZWUgaXRlbXMKLT4+PiBkLmFwcGVuZCgnaicpICAgICAgICAgICAjIGFkZCBhIG5ldyBlbnRyeSB0byB0aGUgcmlnaHQgc2lkZQotPj4+IGQuYXBwZW5kbGVmdCgnZicpICAgICAgICMgYWRkIGEgbmV3IGVudHJ5IHRvIHRoZSBsZWZ0IHNpZGUKLT4+PiBkICAgICAgICAgICAgICAgICAgICAgICAjIHNob3cgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkZXF1ZQotZGVxdWUoWydmJywgJ2cnLCAnaCcsICdpJywgJ2onXSkKLT4+PiBkLnBvcCgpICAgICAgICAgICAgICAgICAjIHJldHVybiBhbmQgcmVtb3ZlIHRoZSByaWdodG1vc3QgaXRlbQotJ2onCi0+Pj4gZC5wb3BsZWZ0KCkgICAgICAgICAgICAgIyByZXR1cm4gYW5kIHJlbW92ZSB0aGUgbGVmdG1vc3QgaXRlbQotJ2YnCi0+Pj4gbGlzdChkKSAgICAgICAgICAgICAgICAgIyBsaXN0IHRoZSBjb250ZW50cyBvZiB0aGUgZGVxdWUKLVsnZycsICdoJywgJ2knXQotPj4+ICdoJyBpbiBkICAgICAgICAgICAgICAgICMgc2VhcmNoIHRoZSBkZXF1ZQotVHJ1ZSAgCi1cZW5ke3ZlcmJhdGltfQotCi1TZXZlcmFsIG1vZHVsZXMsIHN1Y2ggYXMgdGhlIFxtb2R1bGV7UXVldWV9IGFuZCBcbW9kdWxle3RocmVhZGluZ30KLW1vZHVsZXMsIG5vdyB0YWtlIGFkdmFudGFnZSBvZiBcY2xhc3N7Y29sbGVjdGlvbnMuZGVxdWV9IGZvciBpbXByb3ZlZAotcGVyZm9ybWFuY2UuICAoQ29udHJpYnV0ZWQgYnkgUmF5bW9uZCBIZXR0aW5nZXIuKQotCi1caXRlbSBUaGUgXG1vZHVsZXtDb25maWdQYXJzZXJ9IGNsYXNzZXMgaGF2ZSBiZWVuIGVuaGFuY2VkIHNsaWdodGx5LgotICAgVGhlIFxtZXRob2R7cmVhZCgpfSBtZXRob2Qgbm93IHJldHVybnMgYSBsaXN0IG9mIHRoZSBmaWxlcyB0aGF0Ci0gICB3ZXJlIHN1Y2Nlc3NmdWxseSBwYXJzZWQsIGFuZCB0aGUgXG1ldGhvZHtzZXQoKX0gbWV0aG9kIHJhaXNlcwotICAgXGV4Y2VwdGlvbntUeXBlRXJyb3J9IGlmIHBhc3NlZCBhIFx2YXJ7dmFsdWV9IGFyZ3VtZW50IHRoYXQgaXNuJ3QgYQotICAgc3RyaW5nLiAgIChDb250cmlidXRlZCBieSBKb2huIEJlbG1vbnRlIGFuZCBEYXZpZCBHb29kZ2VyLikKLQotXGl0ZW0gVGhlIFxtb2R1bGV7Y3Vyc2VzfSBtb2R1bGUgbm93IHN1cHBvcnRzIHRoZSBuY3Vyc2VzIGV4dGVuc2lvbiAKLSAgIFxmdW5jdGlvbnt1c2VfZGVmYXVsdF9jb2xvcnMoKX0uICBPbiBwbGF0Zm9ybXMgd2hlcmUgdGhlIHRlcm1pbmFsCi0gICBzdXBwb3J0cyB0cmFuc3BhcmVuY3ksIHRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gdXNlIGEgdHJhbnNwYXJlbnQKLSAgIGJhY2tncm91bmQuICAoQ29udHJpYnV0ZWQgYnkgSlwib3JnIExlaG1hbm4uKQotCi1caXRlbSBUaGUgXG1vZHVsZXtkaWZmbGlifSBtb2R1bGUgbm93IGluY2x1ZGVzIGFuIFxjbGFzc3tIdG1sRGlmZn0gY2xhc3MKLXRoYXQgY3JlYXRlcyBhbiBIVE1MIHRhYmxlIHNob3dpbmcgYSBzaWRlIGJ5IHNpZGUgY29tcGFyaXNvbgotb2YgdHdvIHZlcnNpb25zIG9mIGEgdGV4dC4gICAoQ29udHJpYnV0ZWQgYnkgRGFuIEdhc3MuKQotCi1caXRlbSBUaGUgXG1vZHVsZXtlbWFpbH0gcGFja2FnZSB3YXMgdXBkYXRlZCB0byB2ZXJzaW9uIDMuMCwgCi13aGljaCBkcm9wcGVkIHZhcmlvdXMgZGVwcmVjYXRlZCBBUElzIGFuZCByZW1vdmVzIHN1cHBvcnQgZm9yIFB5dGhvbgotdmVyc2lvbnMgZWFybGllciB0aGFuIDIuMy4gIFRoZSAzLjAgdmVyc2lvbiBvZiB0aGUgcGFja2FnZSB1c2VzIGEgbmV3Ci1pbmNyZW1lbnRhbCBwYXJzZXIgZm9yIE1JTUUgbWVzc2FnZXMsIGF2YWlsYWJsZSBpbiB0aGUKLVxtb2R1bGV7ZW1haWwuRmVlZFBhcnNlcn0gbW9kdWxlLiAgVGhlIG5ldyBwYXJzZXIgZG9lc24ndCByZXF1aXJlCi1yZWFkaW5nIHRoZSBlbnRpcmUgbWVzc2FnZSBpbnRvIG1lbW9yeSwgYW5kIGRvZXNuJ3QgdGhyb3cgZXhjZXB0aW9ucwotaWYgYSBtZXNzYWdlIGlzIG1hbGZvcm1lZDsgaW5zdGVhZCBpdCByZWNvcmRzIGFueSBwcm9ibGVtcyBpbiB0aGUgCi1cbWVtYmVye2RlZmVjdH0gYXR0cmlidXRlIG9mIHRoZSBtZXNzYWdlLiAgKERldmVsb3BlZCBieSBBbnRob255Ci1CYXh0ZXIsIEJhcnJ5IFdhcnNhdywgVGhvbWFzIFdvdXRlcnMsIGFuZCBvdGhlcnMuKQotCi1caXRlbSBUaGUgXG1vZHVsZXtoZWFwcX0gbW9kdWxlIGhhcyBiZWVuIGNvbnZlcnRlZCB0byBDLiAgVGhlIHJlc3VsdGluZwotICAgdGVuZm9sZCBpbXByb3ZlbWVudCBpbiBzcGVlZCBtYWtlcyB0aGUgbW9kdWxlIHN1aXRhYmxlIGZvciBoYW5kbGluZwotICAgaGlnaCB2b2x1bWVzIG9mIGRhdGEuICBJbiBhZGRpdGlvbiwgdGhlIG1vZHVsZSBoYXMgdHdvIG5ldyBmdW5jdGlvbnMKLSAgIFxmdW5jdGlvbntubGFyZ2VzdCgpfSBhbmQgXGZ1bmN0aW9ue25zbWFsbGVzdCgpfSB0aGF0IHVzZSBoZWFwcyB0bwotICAgZmluZCB0aGUgTiBsYXJnZXN0IG9yIHNtYWxsZXN0IHZhbHVlcyBpbiBhIGRhdGFzZXQgd2l0aG91dCB0aGUKLSAgIGV4cGVuc2Ugb2YgYSBmdWxsIHNvcnQuICAoQ29udHJpYnV0ZWQgYnkgUmF5bW9uZCBIZXR0aW5nZXIuKQotCi1caXRlbSBUaGUgXG1vZHVsZXtodHRwbGlifSBtb2R1bGUgbm93IGNvbnRhaW5zIGNvbnN0YW50cyBmb3IgSFRUUAotc3RhdHVzIGNvZGVzIGRlZmluZWQgaW4gdmFyaW91cyBIVFRQLXJlbGF0ZWQgUkZDIGRvY3VtZW50cy4gIENvbnN0YW50cwotaGF2ZSBuYW1lcyBzdWNoIGFzIFxjb25zdGFudHtPS30sIFxjb25zdGFudHtDUkVBVEVEfSwKLVxjb25zdGFudHtDT05USU5VRX0sIGFuZCBcY29uc3RhbnR7TU9WRURfUEVSTUFORU5UTFl9OyB1c2UgcHlkb2MgdG8KLWdldCBhIGZ1bGwgbGlzdC4gIChDb250cmlidXRlZCBieSBBbmRyZXcgRWxhbmQuKQotCi1caXRlbSBUaGUgXG1vZHVsZXtpbWFwbGlifSBtb2R1bGUgbm93IHN1cHBvcnRzIElNQVAncyBUSFJFQUQgY29tbWFuZAotKGNvbnRyaWJ1dGVkIGJ5IFl2ZXMgRGlvbm5lKSBhbmQgbmV3IFxtZXRob2R7ZGVsZXRlYWNsKCl9IGFuZAotXG1ldGhvZHtteXJpZ2h0cygpfSBtZXRob2RzIChjb250cmlidXRlZCBieSBBcm5hdWQgTWF6aW4pLgotCi1caXRlbSBUaGUgXG1vZHVsZXtpdGVydG9vbHN9IG1vZHVsZSBnYWluZWQgYQotICBcZnVuY3Rpb257Z3JvdXBieShcdmFye2l0ZXJhYmxlfVxvcHRpb25hbHssIFx2YXJ7ZnVuY319KX0gZnVuY3Rpb24uCi0gIFx2YXJ7aXRlcmFibGV9IGlzIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBpdGVyYXRlZCBvdmVyIHRvIHJldHVybiBhCi0gIHN0cmVhbSBvZiBlbGVtZW50cywgYW5kIHRoZSBvcHRpb25hbCBcdmFye2Z1bmN9IHBhcmFtZXRlciBpcyBhCi0gIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYW4gZWxlbWVudCBhbmQgcmV0dXJucyBhIGtleSB2YWx1ZTsgaWYgb21pdHRlZCwKLSAgdGhlIGtleSBpcyBzaW1wbHkgdGhlIGVsZW1lbnQgaXRzZWxmLiAgXGZ1bmN0aW9ue2dyb3VwYnkoKX0gdGhlbgotICBncm91cHMgdGhlIGVsZW1lbnRzIGludG8gc3Vic2VxdWVuY2VzIHdoaWNoIGhhdmUgbWF0Y2hpbmcgdmFsdWVzIG9mCi0gIHRoZSBrZXksIGFuZCByZXR1cm5zIGEgc2VyaWVzIG9mIDItdHVwbGVzIGNvbnRhaW5pbmcgdGhlIGtleSB2YWx1ZQotICBhbmQgYW4gaXRlcmF0b3Igb3ZlciB0aGUgc3Vic2VxdWVuY2UuCi0gCi1IZXJlJ3MgYW4gZXhhbXBsZSB0byBtYWtlIHRoaXMgY2xlYXJlci4gIFRoZSBcdmFye2tleX0gZnVuY3Rpb24gc2ltcGx5Ci1yZXR1cm5zIHdoZXRoZXIgYSBudW1iZXIgaXMgZXZlbiBvciBvZGQsIHNvIHRoZSByZXN1bHQgb2YKLVxmdW5jdGlvbntncm91cGJ5KCl9IGlzIHRvIHJldHVybiBjb25zZWN1dGl2ZSBydW5zIG9mIG9kZCBvciBldmVuCi1udW1iZXJzLgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gaW1wb3J0IGl0ZXJ0b29scwotPj4+IEwgPSBbMiwgNCwgNiwgNywgOCwgOSwgMTEsIDEyLCAxNF0KLT4+PiBmb3Iga2V5X3ZhbCwgaXQgaW4gaXRlcnRvb2xzLmdyb3VwYnkoTCwgbGFtYmRhIHg6IHggJSAyKToKLS4uLiAgICBwcmludCBrZXlfdmFsLCBsaXN0KGl0KQotLi4uIAotMCBbMiwgNCwgNl0KLTEgWzddCi0wIFs4XQotMSBbOSwgMTFdCi0wIFsxMiwgMTRdCi0+Pj4gCi1cZW5ke3ZlcmJhdGltfQotCi1cZnVuY3Rpb257Z3JvdXBieSgpfSBpcyB0eXBpY2FsbHkgdXNlZCB3aXRoIHNvcnRlZCBpbnB1dC4gIFRoZSBsb2dpYwotZm9yIFxmdW5jdGlvbntncm91cGJ5KCl9IGlzIHNpbWlsYXIgdG8gdGhlIFxVTklYe30gXGNvZGV7dW5pcX0gZmlsdGVyCi13aGljaCBtYWtlcyBpdCBoYW5keSBmb3IgZWxpbWluYXRpbmcsIGNvdW50aW5nLCBvciBpZGVudGlmeWluZwotZHVwbGljYXRlIGVsZW1lbnRzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gd29yZCA9ICdhYnJhY2FkYWJyYScKLT4+PiBsZXR0ZXJzID0gc29ydGVkKHdvcmQpICAgIyBUdXJuIHN0cmluZyBpbnRvIGEgc29ydGVkIGxpc3Qgb2YgbGV0dGVycwotPj4+IGxldHRlcnMgCi1bJ2EnLCAnYScsICdhJywgJ2EnLCAnYScsICdiJywgJ2InLCAnYycsICdkJywgJ3InLCAnciddCi0+Pj4gZm9yIGssIGcgaW4gaXRlcnRvb2xzLmdyb3VwYnkobGV0dGVycyk6Ci0uLi4gICAgcHJpbnQgaywgbGlzdChnKQotLi4uIAotYSBbJ2EnLCAnYScsICdhJywgJ2EnLCAnYSddCi1iIFsnYicsICdiJ10KLWMgWydjJ10KLWQgWydkJ10KLXIgWydyJywgJ3InXQotPj4+ICMgTGlzdCB1bmlxdWUgbGV0dGVycwotPj4+IFtrIGZvciBrLCBnIGluIGdyb3VwYnkobGV0dGVycyldICAgICAgICAgICAgICAgICAgICAgCi1bJ2EnLCAnYicsICdjJywgJ2QnLCAnciddCi0+Pj4gIyBDb3VudCBsZXR0ZXIgb2NjdXJyZW5jZXMKLT4+PiBbKGssIGxlbihsaXN0KGcpKSkgZm9yIGssIGcgaW4gZ3JvdXBieShsZXR0ZXJzKV0gICAgIAotWygnYScsIDUpLCAoJ2InLCAyKSwgKCdjJywgMSksICgnZCcsIDEpLCAoJ3InLCAyKV0KLVxlbmR7dmVyYmF0aW19Ci0KLShDb250cmlidXRlZCBieSBIeWUtU2hpayBDaGFuZy4pCi0KLVxpdGVtIFxtb2R1bGV7aXRlcnRvb2xzfSBhbHNvIGdhaW5lZCBhIGZ1bmN0aW9uIG5hbWVkCi1cZnVuY3Rpb257dGVlKFx2YXJ7aXRlcmF0b3J9LCBcdmFye059KX0gdGhhdCByZXR1cm5zIFx2YXJ7Tn0gaW5kZXBlbmRlbnQKLWl0ZXJhdG9ycyB0aGF0IHJlcGxpY2F0ZSBcdmFye2l0ZXJhdG9yfS4gIElmIFx2YXJ7Tn0gaXMgb21pdHRlZCwgdGhlCi1kZWZhdWx0IGlzIDIuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBMID0gWzEsMiwzXQotPj4+IGkxLCBpMiA9IGl0ZXJ0b29scy50ZWUoTCkKLT4+PiBpMSxpMgotKDxpdGVydG9vbHMudGVlIG9iamVjdCBhdCAweDQwMmMyMDgwPiwgPGl0ZXJ0b29scy50ZWUgb2JqZWN0IGF0IDB4NDAyYzIwOTA+KQotPj4+IGxpc3QoaTEpICAgICAgICAgICAgICAgIyBSdW4gdGhlIGZpcnN0IGl0ZXJhdG9yIHRvIGV4aGF1c3Rpb24KLVsxLCAyLCAzXQotPj4+IGxpc3QoaTIpICAgICAgICAgICAgICAgIyBSdW4gdGhlIHNlY29uZCBpdGVyYXRvciB0byBleGhhdXN0aW9uCi1bMSwgMiwgM10KLVxlbmR7dmVyYmF0aW19Ci0KLU5vdGUgdGhhdCBcZnVuY3Rpb257dGVlKCl9IGhhcyB0byBrZWVwIGNvcGllcyBvZiB0aGUgdmFsdWVzIHJldHVybmVkIAotYnkgdGhlIGl0ZXJhdG9yOyBpbiB0aGUgd29yc3QgY2FzZSwgaXQgbWF5IG5lZWQgdG8ga2VlcCBhbGwgb2YgdGhlbS4gIAotVGhpcyBzaG91bGQgdGhlcmVmb3JlIGJlIHVzZWQgY2FyZWZ1bGx5IGlmIHRoZSBsZWFkaW5nIGl0ZXJhdG9yCi1jYW4gcnVuIGZhciBhaGVhZCBvZiB0aGUgdHJhaWxpbmcgaXRlcmF0b3IgaW4gYSBsb25nIHN0cmVhbSBvZiBpbnB1dHMuCi1JZiB0aGUgc2VwYXJhdGlvbiBpcyBsYXJnZSwgdGhlbiB5b3UgbWlnaHQgYXMgd2VsbCB1c2UgCi1cZnVuY3Rpb257bGlzdCgpfSBpbnN0ZWFkLiAgV2hlbiB0aGUgaXRlcmF0b3JzIHRyYWNrIGNsb3NlbHkgd2l0aCBvbmUKLWFub3RoZXIsIFxmdW5jdGlvbnt0ZWUoKX0gaXMgaWRlYWwuICBQb3NzaWJsZSBhcHBsaWNhdGlvbnMgaW5jbHVkZQotYm9va21hcmtpbmcsIHdpbmRvd2luZywgb3IgbG9va2FoZWFkIGl0ZXJhdG9ycy4KLShDb250cmlidXRlZCBieSBSYXltb25kIEhldHRpbmdlci4pICAgICAgIAotCi1caXRlbSAgQSBudW1iZXIgb2YgZnVuY3Rpb25zIHdlcmUgYWRkZWQgdG8gdGhlIFxtb2R1bGV7bG9jYWxlfSAKLW1vZHVsZSwgc3VjaCBhcyBcZnVuY3Rpb257YmluZF90ZXh0ZG9tYWluX2NvZGVzZXQoKX0gdG8gc3BlY2lmeSBhCi1wYXJ0aWN1bGFyIGVuY29kaW5nIGFuZCBhIGZhbWlseSBvZiBcZnVuY3Rpb257bCpnZXR0ZXh0KCl9IGZ1bmN0aW9ucwotdGhhdCByZXR1cm4gbWVzc2FnZXMgaW4gdGhlIGNob3NlbiBlbmNvZGluZy4KLShDb250cmlidXRlZCBieSBHdXN0YXZvIE5pZW1leWVyLikKLQotXGl0ZW0gU29tZSBrZXl3b3JkIGFyZ3VtZW50cyB3ZXJlIGFkZGVkIHRvIHRoZSBcbW9kdWxle2xvZ2dpbmd9Ci1wYWNrYWdlJ3MgXGZ1bmN0aW9ue2Jhc2ljQ29uZmlnfSBmdW5jdGlvbiB0byBzaW1wbGlmeSBsb2cKLWNvbmZpZ3VyYXRpb24uICBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBsb2cgbWVzc2FnZXMgdG8gc3RhbmRhcmQKLWVycm9yLCBidXQgdmFyaW91cyBrZXl3b3JkIGFyZ3VtZW50cyBjYW4gYmUgc3BlY2lmaWVkIHRvIGxvZyB0byBhCi1wYXJ0aWN1bGFyIGZpbGUsIGNoYW5nZSB0aGUgbG9nZ2luZyBmb3JtYXQsIG9yIHNldCB0aGUgbG9nZ2luZyBsZXZlbC4KLUZvciBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgbG9nZ2luZwotbG9nZ2luZy5iYXNpY0NvbmZpZyhmaWxlbmFtZT0nL3Zhci9sb2cvYXBwbGljYXRpb24ubG9nJywKLSAgICBsZXZlbD0wLCAgIyBMb2cgYWxsIG1lc3NhZ2VzCi0gICAgZm9ybWF0PSclKGxldmVsbmFtZSk6JShwcm9jZXNzKTolKHRocmVhZCk6JShtZXNzYWdlKScpCSAgICAgICAgICAgIAotXGVuZHt2ZXJiYXRpbX0KLQotT3RoZXIgYWRkaXRpb25zIHRvIHRoZSBcbW9kdWxle2xvZ2dpbmd9IHBhY2thZ2UgaW5jbHVkZSBhCi1cbWV0aG9ke2xvZyhcdmFye2xldmVsfSwgXHZhcnttc2d9KX0gY29udmVuaWVuY2UgbWV0aG9kLCBhcyB3ZWxsIGFzIGEKLVxjbGFzc3tUaW1lZFJvdGF0aW5nRmlsZUhhbmRsZXJ9IGNsYXNzIHRoYXQgcm90YXRlcyBpdHMgbG9nIGZpbGVzIGF0IGEKLXRpbWVkIGludGVydmFsLiAgVGhlIG1vZHVsZSBhbHJlYWR5IGhhZCBcY2xhc3N7Um90YXRpbmdGaWxlSGFuZGxlcn0sCi13aGljaCByb3RhdGVkIGxvZ3Mgb25jZSB0aGUgZmlsZSBleGNlZWRlZCBhIGNlcnRhaW4gc2l6ZS4gIEJvdGgKLWNsYXNzZXMgZGVyaXZlIGZyb20gYSBuZXcgXGNsYXNze0Jhc2VSb3RhdGluZ0hhbmRsZXJ9IGNsYXNzIHRoYXQgY2FuCi1iZSB1c2VkIHRvIGltcGxlbWVudCBvdGhlciByb3RhdGluZyBoYW5kbGVycy4KLQotKENoYW5nZXMgaW1wbGVtZW50ZWQgYnkgVmluYXkgU2FqaXAuKQotCi1caXRlbSBUaGUgXG1vZHVsZXttYXJzaGFsfSBtb2R1bGUgbm93IHNoYXJlcyBpbnRlcm5lZCBzdHJpbmdzIG9uIHVucGFja2luZyBhIAotZGF0YSBzdHJ1Y3R1cmUuICBUaGlzIG1heSBzaHJpbmsgdGhlIHNpemUgb2YgY2VydGFpbiBwaWNrbGUgc3RyaW5ncywKLWJ1dCB0aGUgcHJpbWFyeSBlZmZlY3QgaXMgdG8gbWFrZSBcZmlsZXsucHljfSBmaWxlcyBzaWduaWZpY2FudGx5IHNtYWxsZXIuCi0oQ29udHJpYnV0ZWQgYnkgTWFydGluIHZvbn5MXCJvd2lzLikKLQotXGl0ZW0gVGhlIFxtb2R1bGV7bm50cGxpYn0gbW9kdWxlJ3MgXGNsYXNze05OVFB9IGNsYXNzIGdhaW5lZAotXG1ldGhvZHtkZXNjcmlwdGlvbigpfSBhbmQgXG1ldGhvZHtkZXNjcmlwdGlvbnMoKX0gbWV0aG9kcyB0byByZXRyaWV2ZSAKLW5ld3Nncm91cCBkZXNjcmlwdGlvbnMgZm9yIGEgc2luZ2xlIGdyb3VwIG9yIGZvciBhIHJhbmdlIG9mIGdyb3Vwcy4KLShDb250cmlidXRlZCBieSBKXCJ1cmdlbiBBLiBFcmhhcmQuKQotCi1caXRlbSBUd28gbmV3IGZ1bmN0aW9ucyB3ZXJlIGFkZGVkIHRvIHRoZSBcbW9kdWxle29wZXJhdG9yfSBtb2R1bGUsIAotXGZ1bmN0aW9ue2F0dHJnZXR0ZXIoXHZhcnthdHRyfSl9IGFuZCBcZnVuY3Rpb257aXRlbWdldHRlcihcdmFye2luZGV4fSl9LgotQm90aCBmdW5jdGlvbnMgcmV0dXJuIGNhbGxhYmxlcyB0aGF0IHRha2UgYSBzaW5nbGUgYXJndW1lbnQgYW5kIHJldHVybgotdGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIG9yIGl0ZW07IHRoZXNlIGNhbGxhYmxlcyBtYWtlIGV4Y2VsbGVudAotZGF0YSBleHRyYWN0b3JzIHdoZW4gdXNlZCB3aXRoIFxmdW5jdGlvbnttYXAoKX0gb3IKLVxmdW5jdGlvbntzb3J0ZWQoKX0uICBGb3IgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IEwgPSBbKCdjJywgMiksICgnZCcsIDEpLCAoJ2EnLCA0KSwgKCdiJywgMyldCi0+Pj4gbWFwKG9wZXJhdG9yLml0ZW1nZXR0ZXIoMCksIEwpCi1bJ2MnLCAnZCcsICdhJywgJ2InXQotPj4+IG1hcChvcGVyYXRvci5pdGVtZ2V0dGVyKDEpLCBMKQotWzIsIDEsIDQsIDNdCi0+Pj4gc29ydGVkKEwsIGtleT1vcGVyYXRvci5pdGVtZ2V0dGVyKDEpKSAjIFNvcnQgbGlzdCBieSBzZWNvbmQgdHVwbGUgaXRlbQotWygnZCcsIDEpLCAoJ2MnLCAyKSwgKCdiJywgMyksICgnYScsIDQpXQotXGVuZHt2ZXJiYXRpbX0KLQotKENvbnRyaWJ1dGVkIGJ5IFJheW1vbmQgSGV0dGluZ2VyLikgICAgICAgCi0KLVxpdGVtIFRoZSBcbW9kdWxle29wdHBhcnNlfSBtb2R1bGUgd2FzIHVwZGF0ZWQgaW4gdmFyaW91cyB3YXlzLiAgVGhlCi1tb2R1bGUgbm93IHBhc3NlcyBpdHMgbWVzc2FnZXMgdGhyb3VnaCBcZnVuY3Rpb257Z2V0dGV4dC5nZXR0ZXh0KCl9LAotbWFraW5nIGl0IHBvc3NpYmxlIHRvIGludGVybmF0aW9uYWxpemUgT3B0aWsncyBoZWxwIGFuZCBlcnJvcgotbWVzc2FnZXMuICBIZWxwIG1lc3NhZ2VzIGZvciBvcHRpb25zIGNhbiBub3cgaW5jbHVkZSB0aGUgc3RyaW5nCi1cY29kZXsnXCVkZWZhdWx0J30sIHdoaWNoIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIG9wdGlvbidzIGRlZmF1bHQKLXZhbHVlLiAgKENvbnRyaWJ1dGVkIGJ5IEdyZWcgV2FyZC4pCi0KLVxpdGVtIFRoZSBsb25nLXRlcm0gcGxhbiBpcyB0byBkZXByZWNhdGUgdGhlIFxtb2R1bGV7cmZjODIyfSBtb2R1bGUKLWluIHNvbWUgZnV0dXJlIFB5dGhvbiByZWxlYXNlIGluIGZhdm9yIG9mIHRoZSBcbW9kdWxle2VtYWlsfSBwYWNrYWdlLgotVG8gdGhpcyBlbmQsIHRoZSBcZnVuY3Rpb257ZW1haWwuVXRpbHMuZm9ybWF0ZGF0ZSgpfSBmdW5jdGlvbiBoYXMgYmVlbgotY2hhbmdlZCB0byBtYWtlIGl0IHVzYWJsZSBhcyBhIHJlcGxhY2VtZW50IGZvcgotXGZ1bmN0aW9ue3JmYzgyMi5mb3JtYXRkYXRlKCl9LiAgWW91IG1heSB3YW50IHRvIHdyaXRlIG5ldyBlLW1haWwKLXByb2Nlc3NpbmcgY29kZSB3aXRoIHRoaXMgaW4gbWluZC4gIChDaGFuZ2UgaW1wbGVtZW50ZWQgYnkgQW50aG9ueQotQmF4dGVyLikKLQotXGl0ZW0gQSBuZXcgXGZ1bmN0aW9ue3VyYW5kb20oXHZhcntufSl9IGZ1bmN0aW9uIHdhcyBhZGRlZCB0byB0aGUKLVxtb2R1bGV7b3N9IG1vZHVsZSwgcmV0dXJuaW5nIGEgc3RyaW5nIGNvbnRhaW5pbmcgXHZhcntufSBieXRlcyBvZgotcmFuZG9tIGRhdGEuICBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGFjY2VzcyB0byBwbGF0Zm9ybS1zcGVjaWZpYwotc291cmNlcyBvZiByYW5kb21uZXNzIHN1Y2ggYXMgXGZpbGV7L2Rldi91cmFuZG9tfSBvbiBMaW51eCBvciB0aGUKLVdpbmRvd3MgQ3J5cHRvQVBJLiAgKENvbnRyaWJ1dGVkIGJ5IFRyZXZvciBQZXJyaW4uKQotCi1caXRlbSBBbm90aGVyIG5ldyBmdW5jdGlvbjogXGZ1bmN0aW9ue29zLnBhdGgubGV4aXN0cyhcdmFye3BhdGh9KX0gCi1yZXR1cm5zIHRydWUgaWYgdGhlIGZpbGUgc3BlY2lmaWVkIGJ5IFx2YXJ7cGF0aH0gZXhpc3RzLCB3aGV0aGVyIG9yCi1ub3QgaXQncyBhIHN5bWJvbGljIGxpbmsuICBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgZXhpc3RpbmcKLVxmdW5jdGlvbntvcy5wYXRoLmV4aXN0cyhcdmFye3BhdGh9KX0gZnVuY3Rpb24sIHdoaWNoIHJldHVybnMgZmFsc2UgaWYgCi1cdmFye3BhdGh9IGlzIGEgc3ltbGluayB0aGF0IHBvaW50cyB0byBhIGRlc3RpbmF0aW9uIHRoYXQgZG9lc24ndCBleGlzdC4KLShDb250cmlidXRlZCBieSBCZW5pIENoZXJuaWF2c2t5LikKLQotXGl0ZW0gQSBuZXcgXGZ1bmN0aW9ue2dldHNpZCgpfSBmdW5jdGlvbiB3YXMgYWRkZWQgdG8gdGhlCi1cbW9kdWxle3Bvc2l4fSBtb2R1bGUgdGhhdCB1bmRlcmxpZXMgdGhlIFxtb2R1bGV7b3N9IG1vZHVsZS4KLShDb250cmlidXRlZCBieSBKLiBSYXlub3IuKQotCi1caXRlbSBUaGUgXG1vZHVsZXtwb3BsaWJ9IG1vZHVsZSBub3cgc3VwcG9ydHMgUE9QIG92ZXIgU1NMLiAgKENvbnRyaWJ1dGVkIGJ5Ci1IZWN0b3IgVXJ0dWJpYS4pCi0KLVxpdGVtIFRoZSBcbW9kdWxle3Byb2ZpbGV9IG1vZHVsZSBjYW4gbm93IHByb2ZpbGUgQyBleHRlbnNpb24gZnVuY3Rpb25zLgotKENvbnRyaWJ1dGVkIGJ5IE5pY2sgQmFzdGluLikKLQotXGl0ZW0gVGhlIFxtb2R1bGV7cmFuZG9tfSBtb2R1bGUgaGFzIGEgbmV3IG1ldGhvZCBjYWxsZWQKLSAgIFxtZXRob2R7Z2V0cmFuZGJpdHMoXHZhcntOfSl9IHRoYXQgcmV0dXJucyBhIGxvbmcgaW50ZWdlciBcdmFye059Ci0gICBiaXRzIGluIGxlbmd0aC4gIFRoZSBleGlzdGluZyBcbWV0aG9ke3JhbmRyYW5nZSgpfSBtZXRob2Qgbm93IHVzZXMKLSAgIFxtZXRob2R7Z2V0cmFuZGJpdHMoKX0gd2hlcmUgYXBwcm9wcmlhdGUsIG1ha2luZyBnZW5lcmF0aW9uIG9mCi0gICBhcmJpdHJhcmlseSBsYXJnZSByYW5kb20gbnVtYmVycyBtb3JlIGVmZmljaWVudC4gIChDb250cmlidXRlZCBieQotICAgUmF5bW9uZCBIZXR0aW5nZXIuKQotCi1caXRlbSBUaGUgcmVndWxhciBleHByZXNzaW9uIGxhbmd1YWdlIGFjY2VwdGVkIGJ5IHRoZSBcbW9kdWxle3JlfSBtb2R1bGUKLSAgIHdhcyBleHRlbmRlZCB3aXRoIHNpbXBsZSBjb25kaXRpb25hbCBleHByZXNzaW9ucywgd3JpdHRlbiBhcwotICAgXHJlZ2V4cHsoPyhcdmFye2dyb3VwfSlcdmFye0F9fFx2YXJ7Qn0pfS4gIFx2YXJ7Z3JvdXB9IGlzIGVpdGhlciBhCi0gICBudW1lcmljIGdyb3VwIElEIG9yIGEgZ3JvdXAgbmFtZSBkZWZpbmVkIHdpdGggXHJlZ2V4cHsoP1A8Z3JvdXA+Li4uKX0gCi0gICBlYXJsaWVyIGluIHRoZSBleHByZXNzaW9uLiAgSWYgdGhlIHNwZWNpZmllZCBncm91cCBtYXRjaGVkLCB0aGUKLSAgIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIFx2YXJ7QX0gd2lsbCBiZSB0ZXN0ZWQgYWdhaW5zdCB0aGUgc3RyaW5nOyBpZgotICAgdGhlIGdyb3VwIGRpZG4ndCBtYXRjaCwgdGhlIHBhdHRlcm4gXHZhcntCfSB3aWxsIGJlIHVzZWQgaW5zdGVhZC4KLSAgIChDb250cmlidXRlZCBieSBHdXN0YXZvIE5pZW1leWVyLikKLQotXGl0ZW0gVGhlIFxtb2R1bGV7cmV9IG1vZHVsZSBpcyBhbHNvIG5vIGxvbmdlciByZWN1cnNpdmUsIHRoYW5rcyB0byBhCi1tYXNzaXZlIGFtb3VudCBvZiB3b3JrIGJ5IEd1c3Rhdm8gTmllbWV5ZXIuICBJbiBhIHJlY3Vyc2l2ZSByZWd1bGFyCi1leHByZXNzaW9uIGVuZ2luZSwgY2VydGFpbiBwYXR0ZXJucyByZXN1bHQgaW4gYSBsYXJnZSBhbW91bnQgb2YgQwotc3RhY2sgc3BhY2UgYmVpbmcgY29uc3VtZWQsIGFuZCBpdCB3YXMgcG9zc2libGUgdG8gb3ZlcmZsb3cgdGhlIHN0YWNrLgotRm9yIGV4YW1wbGUsIGlmIHlvdSBtYXRjaGVkIGEgMzAwMDAtYnl0ZSBzdHJpbmcgb2YgXHNhbXB7YX0gY2hhcmFjdGVycwotYWdhaW5zdCB0aGUgZXhwcmVzc2lvbiBccmVnZXhweyhhfGIpK30sIG9uZSBzdGFjayBmcmFtZSB3YXMgY29uc3VtZWQKLXBlciBjaGFyYWN0ZXIuICBQeXRob24gMi4zIHRyaWVkIHRvIGNoZWNrIGZvciBzdGFjayBvdmVyZmxvdyBhbmQgcmFpc2UKLWEgXGV4Y2VwdGlvbntSdW50aW1lRXJyb3J9IGV4Y2VwdGlvbiwgYnV0IGNlcnRhaW4gcGF0dGVybnMgY291bGQKLXNpZGVzdGVwIHRoZSBjaGVja2luZyBhbmQgaWYgeW91IHdlcmUgdW5sdWNreSBQeXRob24gY291bGQgc2VnZmF1bHQuCi1QeXRob24gMi40J3MgcmVndWxhciBleHByZXNzaW9uIGVuZ2luZSBjYW4gbWF0Y2ggdGhpcyBwYXR0ZXJuIHdpdGhvdXQKLXByb2JsZW1zLgotCi1caXRlbSBUaGUgXG1vZHVsZXtzaWduYWx9IG1vZHVsZSBub3cgcGVyZm9ybXMgdGlnaHRlciBlcnJvci1jaGVja2luZwotb24gdGhlIHBhcmFtZXRlcnMgdG8gdGhlIFxmdW5jdGlvbntzaWduYWwuc2lnbmFsKCl9IGZ1bmN0aW9uLiAgRm9yCi1leGFtcGxlLCB5b3UgY2FuJ3Qgc2V0IGEgaGFuZGxlciBvbiB0aGUgXGNvbnN0YW50e1NJR0tJTEx9IHNpZ25hbDsKLXByZXZpb3VzIHZlcnNpb25zIG9mIFB5dGhvbiB3b3VsZCBxdWlldGx5IGFjY2VwdCB0aGlzLCBidXQgMi40IHdpbGwKLXJhaXNlIGEgXGV4Y2VwdGlvbntSdW50aW1lRXJyb3J9IGV4Y2VwdGlvbi4KLQotXGl0ZW0gVHdvIG5ldyBmdW5jdGlvbnMgd2VyZSBhZGRlZCB0byB0aGUgXG1vZHVsZXtzb2NrZXR9IG1vZHVsZS4KLVxmdW5jdGlvbntzb2NrZXRwYWlyKCl9IHJldHVybnMgYSBwYWlyIG9mIGNvbm5lY3RlZCBzb2NrZXRzIGFuZAotXGZ1bmN0aW9ue2dldHNlcnZieXBvcnQoXHZhcntwb3J0fSl9IGxvb2tzIHVwIHRoZSBzZXJ2aWNlIG5hbWUgZm9yIGEKLWdpdmVuIHBvcnQgbnVtYmVyLiAoQ29udHJpYnV0ZWQgYnkgRGF2ZSBDb2xlIGFuZCBCYXJyeSBXYXJzYXcuKQotCi1caXRlbSBUaGUgXGZ1bmN0aW9ue3N5cy5leGl0ZnVuYygpfSBmdW5jdGlvbiBoYXMgYmVlbiBkZXByZWNhdGVkLiAgQ29kZQotc2hvdWxkIGJlIHVzaW5nIHRoZSBleGlzdGluZyBcbW9kdWxle2F0ZXhpdH0gbW9kdWxlLCB3aGljaCBjb3JyZWN0bHkKLWhhbmRsZXMgY2FsbGluZyBtdWx0aXBsZSBleGl0IGZ1bmN0aW9ucy4gIEV2ZW50dWFsbHkKLVxmdW5jdGlvbntzeXMuZXhpdGZ1bmMoKX0gd2lsbCBiZWNvbWUgYSBwdXJlbHkgaW50ZXJuYWwgaW50ZXJmYWNlLAotYWNjZXNzZWQgb25seSBieSBcbW9kdWxle2F0ZXhpdH0uCi0KLVxpdGVtIFRoZSBcbW9kdWxle3RhcmZpbGV9IG1vZHVsZSBub3cgZ2VuZXJhdGVzIEdOVS1mb3JtYXQgdGFyIGZpbGVzCi1ieSBkZWZhdWx0LiAgKENvbnRyaWJ1dGVkIGJ5IExhcnMgR3VzdGFlYmVsLikKLQotXGl0ZW0gVGhlIFxtb2R1bGV7dGhyZWFkaW5nfSBtb2R1bGUgbm93IGhhcyBhbiBlbGVnYW50bHkgc2ltcGxlIHdheSB0byBzdXBwb3J0IAotdGhyZWFkLWxvY2FsIGRhdGEuICBUaGUgbW9kdWxlIGNvbnRhaW5zIGEgXGNsYXNze2xvY2FsfSBjbGFzcyB3aG9zZQotYXR0cmlidXRlIHZhbHVlcyBhcmUgbG9jYWwgdG8gZGlmZmVyZW50IHRocmVhZHMuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCB0aHJlYWRpbmcKLQotZGF0YSA9IHRocmVhZGluZy5sb2NhbCgpCi1kYXRhLm51bWJlciA9IDQyCi1kYXRhLnVybCA9ICgnd3d3LnB5dGhvbi5vcmcnLCA4MCkKLVxlbmR7dmVyYmF0aW19Ci0KLU90aGVyIHRocmVhZHMgY2FuIGFzc2lnbiBhbmQgcmV0cmlldmUgdGhlaXIgb3duIHZhbHVlcyBmb3IgdGhlCi1cbWVtYmVye251bWJlcn0gYW5kIFxtZW1iZXJ7dXJsfSBhdHRyaWJ1dGVzLiAgWW91IGNhbiBzdWJjbGFzcwotXGNsYXNze2xvY2FsfSB0byBpbml0aWFsaXplIGF0dHJpYnV0ZXMgb3IgdG8gYWRkIG1ldGhvZHMuCi0oQ29udHJpYnV0ZWQgYnkgSmltIEZ1bHRvbi4pCi0KLVxpdGVtIFRoZSBcbW9kdWxle3RpbWVpdH0gbW9kdWxlIG5vdyBhdXRvbWF0aWNhbGx5IGRpc2FibGVzIHBlcmlvZGljCi0gIGdhcmJhZ2UgY29sbGVjdGlvbiBkdXJpbmcgdGhlIHRpbWluZyBsb29wLiAgVGhpcyBjaGFuZ2UgbWFrZXMKLSAgY29uc2VjdXRpdmUgdGltaW5ncyBtb3JlIGNvbXBhcmFibGUuICAoQ29udHJpYnV0ZWQgYnkgUmF5bW9uZCBIZXR0aW5nZXIuKQotCi1caXRlbSBUaGUgXG1vZHVsZXt3ZWFrcmVmfSBtb2R1bGUgbm93IHN1cHBvcnRzIGEgd2lkZXIgdmFyaWV0eSBvZiBvYmplY3RzCi0gICBpbmNsdWRpbmcgUHl0aG9uIGZ1bmN0aW9ucywgY2xhc3MgaW5zdGFuY2VzLCBzZXRzLCBmcm96ZW5zZXRzLCBkZXF1ZXMsCi0gICBhcnJheXMsIGZpbGVzLCBzb2NrZXRzLCBhbmQgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gb2JqZWN0cy4KLSAgIChDb250cmlidXRlZCBieSBSYXltb25kIEhldHRpbmdlci4pCi0KLVxpdGVtIFRoZSBcbW9kdWxle3htbHJwY2xpYn0gbW9kdWxlIG5vdyBzdXBwb3J0cyBhIG11bHRpLWNhbGwgZXh0ZW5zaW9uIGZvciAKLXRyYW5zbWl0dGluZyBtdWx0aXBsZSBYTUwtUlBDIGNhbGxzIGluIGEgc2luZ2xlIEhUVFAgb3BlcmF0aW9uLgotKENvbnRyaWJ1dGVkIGJ5IEJyaWFuIFF1aW5sYW4uKQotCi1caXRlbSBUaGUgXG1vZHVsZXttcHp9LCBcbW9kdWxle3JvdG9yfSwgYW5kIFxtb2R1bGV7eHJlYWRsaW5lc30gbW9kdWxlcyBoYXZlIAotYmVlbiByZW1vdmVkLgotICAgCi1cZW5ke2l0ZW1pemV9Ci0KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSUgd2hvbGUgbmV3IG1vZHVsZXMgZ2V0IGRlc2NyaWJlZCBpbiBzdWJzZWN0aW9ucyBoZXJlCi0KLSU9PT09PT09PT09PT09PT09PT09PT0KLVxzdWJzZWN0aW9ue2Nvb2tpZWxpYn0KLQotVGhlIFxtb2R1bGV7Y29va2llbGlifSBsaWJyYXJ5IHN1cHBvcnRzIGNsaWVudC1zaWRlIGhhbmRsaW5nIGZvciBIVFRQCi1jb29raWVzLCBtaXJyb3JpbmcgdGhlIFxtb2R1bGV7Q29va2llfSBtb2R1bGUncyBzZXJ2ZXItc2lkZSBjb29raWUKLXN1cHBvcnQuIENvb2tpZXMgYXJlIHN0b3JlZCBpbiBjb29raWUgamFyczsgdGhlIGxpYnJhcnkgdHJhbnNwYXJlbnRseQotc3RvcmVzIGNvb2tpZXMgb2ZmZXJlZCBieSB0aGUgd2ViIHNlcnZlciBpbiB0aGUgY29va2llIGphciwgYW5kCi1mZXRjaGVzIHRoZSBjb29raWUgZnJvbSB0aGUgamFyIHdoZW4gY29ubmVjdGluZyB0byB0aGUgc2VydmVyLiBBcyBpbgotd2ViIGJyb3dzZXJzLCBwb2xpY3kgb2JqZWN0cyBjb250cm9sIHdoZXRoZXIgY29va2llcyBhcmUgYWNjZXB0ZWQgb3IKLW5vdC4KLQotSW4gb3JkZXIgdG8gc3RvcmUgY29va2llcyBhY3Jvc3Mgc2Vzc2lvbnMsIHR3byBpbXBsZW1lbnRhdGlvbnMgb2YKLWNvb2tpZSBqYXJzIGFyZSBwcm92aWRlZDogb25lIHRoYXQgc3RvcmVzIGNvb2tpZXMgaW4gdGhlIE5ldHNjYXBlCi1mb3JtYXQgc28gYXBwbGljYXRpb25zIGNhbiB1c2UgdGhlIE1vemlsbGEgb3IgTHlueCBjb29raWUgZmlsZXMsIGFuZAotb25lIHRoYXQgc3RvcmVzIGNvb2tpZXMgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBQZXJsIGxpYnd3dyBsaWJyYXJ5LgotCi1cbW9kdWxle3VybGxpYjJ9IGhhcyBiZWVuIGNoYW5nZWQgdG8gaW50ZXJhY3Qgd2l0aCBcbW9kdWxle2Nvb2tpZWxpYn06Ci1cY2xhc3N7SFRUUENvb2tpZVByb2Nlc3Nvcn0gbWFuYWdlcyBhIGNvb2tpZSBqYXIgdGhhdCBpcyB1c2VkIHdoZW4KLWFjY2Vzc2luZyBVUkxzLgotCi1UaGlzIG1vZHVsZSB3YXMgY29udHJpYnV0ZWQgYnkgSm9obiBKLiBMZWUuCi0KLQotJSA9PT09PT09PT09PT09PT09PT0KLVxzdWJzZWN0aW9ue2RvY3Rlc3R9Ci0KLVRoZSBcbW9kdWxle2RvY3Rlc3R9IG1vZHVsZSB1bmRlcndlbnQgY29uc2lkZXJhYmxlIHJlZmFjdG9yaW5nIHRoYW5rcwotdG8gRWR3YXJkIExvcGVyIGFuZCBUaW0gUGV0ZXJzLiAgVGVzdGluZyBjYW4gc3RpbGwgYmUgYXMgc2ltcGxlIGFzCi1ydW5uaW5nIFxmdW5jdGlvbntkb2N0ZXN0LnRlc3Rtb2QoKX0sIGJ1dCB0aGUgcmVmYWN0b3JpbmdzIGFsbG93Ci1jdXN0b21pemluZyB0aGUgbW9kdWxlJ3Mgb3BlcmF0aW9uIGluIHZhcmlvdXMgd2F5cwotCi1UaGUgbmV3IFxjbGFzc3tEb2NUZXN0RmluZGVyfSBjbGFzcyBleHRyYWN0cyB0aGUgdGVzdHMgZnJvbSBhIGdpdmVuIAotb2JqZWN0J3MgZG9jc3RyaW5nczoKLQotXGJlZ2lue3ZlcmJhdGltfQotZGVmIGYgKHgsIHkpOgotICAgICIiIj4+PiBmKDIsMikKLTQKLT4+PiBmKDMsMikKLTYKLSAgICAiIiIKLSAgICByZXR1cm4geCp5Ci0KLWZpbmRlciA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpCi0KLSMgR2V0IGxpc3Qgb2YgRG9jVGVzdCBpbnN0YW5jZXMKLXRlc3RzID0gZmluZGVyLmZpbmQoZikKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBuZXcgXGNsYXNze0RvY1Rlc3RSdW5uZXJ9IGNsYXNzIHRoZW4gcnVucyBpbmRpdmlkdWFsIHRlc3RzIGFuZCBjYW4KLXByb2R1Y2UgYSBzdW1tYXJ5IG9mIHRoZSByZXN1bHRzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1ydW5uZXIgPSBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIoKQotZm9yIHQgaW4gdGVzdHM6Ci0gICAgdHJpZWQsIGZhaWxlZCA9IHJ1bm5lci5ydW4odCkKLSAgICAKLXJ1bm5lci5zdW1tYXJpemUodmVyYm9zZT0xKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGFib3ZlIGV4YW1wbGUgcHJvZHVjZXMgdGhlIGZvbGxvd2luZyBvdXRwdXQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLTEgaXRlbXMgcGFzc2VkIGFsbCB0ZXN0czoKLSAgIDIgdGVzdHMgaW4gZgotMiB0ZXN0cyBpbiAxIGl0ZW1zLgotMiBwYXNzZWQgYW5kIDAgZmFpbGVkLgotVGVzdCBwYXNzZWQuCi1cZW5ke3ZlcmJhdGltfQotCi1cY2xhc3N7RG9jVGVzdFJ1bm5lcn0gdXNlcyBhbiBpbnN0YW5jZSBvZiB0aGUgXGNsYXNze091dHB1dENoZWNrZXJ9Ci1jbGFzcyB0byBjb21wYXJlIHRoZSBleHBlY3RlZCBvdXRwdXQgd2l0aCB0aGUgYWN0dWFsIG91dHB1dC4gIFRoaXMKLWNsYXNzIHRha2VzIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBmbGFncyB0aGF0IGN1c3RvbWl6ZSBpdHMgYmVoYXZpb3VyOwotYW1iaXRpb3VzIHVzZXJzIGNhbiBhbHNvIHdyaXRlIGEgY29tcGxldGVseSBuZXcgc3ViY2xhc3Mgb2YKLVxjbGFzc3tPdXRwdXRDaGVja2VyfS4KLQotVGhlIGRlZmF1bHQgb3V0cHV0IGNoZWNrZXIgcHJvdmlkZXMgYSBudW1iZXIgb2YgaGFuZHkgZmVhdHVyZXMuCi1Gb3IgZXhhbXBsZSwgd2l0aCB0aGUgXGNvbnN0YW50e2RvY3Rlc3QuRUxMSVBTSVN9IG9wdGlvbiBmbGFnLAotYW4gZWxsaXBzaXMgKFxzYW1wey4uLn0pIGluIHRoZSBleHBlY3RlZCBvdXRwdXQgbWF0Y2hlcyBhbnkgc3Vic3RyaW5nLCAKLW1ha2luZyBpdCBlYXNpZXIgdG8gYWNjb21tb2RhdGUgb3V0cHV0cyB0aGF0IHZhcnkgaW4gbWlub3Igd2F5czoKLQotXGJlZ2lue3ZlcmJhdGltfQotZGVmIG8gKG4pOgotICAgICIiIj4+PiBvKDEpCi08X19tYWluX18uQyBpbnN0YW5jZSBhdCAweC4uLj4KLT4+PgotIiIiCi1cZW5ke3ZlcmJhdGltfQotCi1Bbm90aGVyIHNwZWNpYWwgc3RyaW5nLCBcc2FtcHs8QkxBTktMSU5FPn0sIG1hdGNoZXMgYSBibGFuayBsaW5lOgotCi1cYmVnaW57dmVyYmF0aW19Ci1kZWYgcCAobik6Ci0gICAgIiIiPj4+IHAoMSkKLTxCTEFOS0xJTkU+Ci0+Pj4KLSIiIgotXGVuZHt2ZXJiYXRpbX0KLQotQW5vdGhlciBuZXcgY2FwYWJpbGl0eSBpcyBwcm9kdWNpbmcgYSBkaWZmLXN0eWxlIGRpc3BsYXkgb2YgdGhlIG91dHB1dAotYnkgc3BlY2lmeWluZyB0aGUgXGNvbnN0YW50e2RvY3Rlc3QuUkVQT1JUX1VESUZGfSAodW5pZmllZCBkaWZmcyksCi1cY29uc3RhbnR7ZG9jdGVzdC5SRVBPUlRfQ0RJRkZ9IChjb250ZXh0IGRpZmZzKSwgb3IKLVxjb25zdGFudHtkb2N0ZXN0LlJFUE9SVF9ORElGRn0gKGRlbHRhLXN0eWxlKSBvcHRpb24gZmxhZ3MuICBGb3IgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotZGVmIGcgKG4pOgotICAgICIiIj4+PiBnKDQpCi1oZXJlCi1pcwotYQotbGVuZ3RoeQotPj4+IiIiCi0gICAgTCA9ICdoZXJlIGlzIGEgcmF0aGVyIGxlbmd0aHkgbGlzdCBvZiB3b3Jkcycuc3BsaXQoKQotICAgIGZvciB3b3JkIGluIExbOm5dOgotICAgICAgICBwcmludCB3b3JkCi1cZW5ke3ZlcmJhdGltfQotCi1SdW5uaW5nIHRoZSBhYm92ZSBmdW5jdGlvbidzIHRlc3RzIHdpdGgKLVxjb25zdGFudHtkb2N0ZXN0LlJFUE9SVF9VRElGRn0gc3BlY2lmaWVkLCB5b3UgZ2V0IHRoZSBmb2xsb3dpbmcgb3V0cHV0OgotCi1cYmVnaW57dmVyYmF0aW19Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1GaWxlIGBgdC5weScnLCBsaW5lIDE1LCBpbiBnCi1GYWlsZWQgZXhhbXBsZToKLSAgICBnKDQpCi1EaWZmZXJlbmNlcyAodW5pZmllZCBkaWZmIHdpdGggLWV4cGVjdGVkICthY3R1YWwpOgotICAgIEBAIC0yLDMgKzIsMyBAQAotICAgICBpcwotICAgICBhCi0gICAgLWxlbmd0aHkKLSAgICArcmF0aGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1cZW5ke3ZlcmJhdGltfQotCi0KLSUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257QnVpbGQgYW5kIEMgQVBJIENoYW5nZXN9Ci0KLVNvbWUgb2YgdGhlIGNoYW5nZXMgdG8gUHl0aG9uJ3MgYnVpbGQgcHJvY2VzcyBhbmQgdG8gdGhlIEMgQVBJIGFyZToKLQotXGJlZ2lue2l0ZW1pemV9Ci0KLSAgXGl0ZW0gVGhyZWUgbmV3IGNvbnZlbmllbmNlIG1hY3JvcyB3ZXJlIGFkZGVkIGZvciBjb21tb24gcmV0dXJuCi0gIHZhbHVlcyBmcm9tIGV4dGVuc2lvbiBmdW5jdGlvbnM6IFxjc2ltcGxlbWFjcm97UHlfUkVUVVJOX05PTkV9LAotICBcY3NpbXBsZW1hY3Jve1B5X1JFVFVSTl9UUlVFfSwgYW5kIFxjc2ltcGxlbWFjcm97UHlfUkVUVVJOX0ZBTFNFfS4KLSAgKENvbnRyaWJ1dGVkIGJ5IEJyZXR0IENhbm5vbi4pCi0KLSAgXGl0ZW0gQW5vdGhlciBuZXcgbWFjcm8sIFxjc2ltcGxlbWFjcm97UHlfQ0xFQVIoXHZhcntvYmp9KX0sIAotICBkZWNyZWFzZXMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBcdmFye29ian0gYW5kIHNldHMgXHZhcntvYmp9IHRvIHRoZQotICBudWxsIHBvaW50ZXIuICAoQ29udHJpYnV0ZWQgYnkgSmltIEZ1bHRvbi4pCi0KLSAgXGl0ZW0gQSBuZXcgZnVuY3Rpb24sIFxjZnVuY3Rpb257UHlUdXBsZV9QYWNrKFx2YXJ7Tn0sIFx2YXJ7b2JqMX0sCi0gIFx2YXJ7b2JqMn0sIC4uLiwgXHZhcntvYmpOfSl9LCBjb25zdHJ1Y3RzIHR1cGxlcyBmcm9tIGEgdmFyaWFibGUKLSAgbGVuZ3RoIGFyZ3VtZW50IGxpc3Qgb2YgUHl0aG9uIG9iamVjdHMuICAoQ29udHJpYnV0ZWQgYnkgUmF5bW9uZCBIZXR0aW5nZXIuKQotCi0gIFxpdGVtIEEgbmV3IGZ1bmN0aW9uLCBcY2Z1bmN0aW9ue1B5RGljdF9Db250YWlucyhcdmFye2R9LCBcdmFye2t9KX0sCi0gIGltcGxlbWVudHMgZmFzdCBkaWN0aW9uYXJ5IGxvb2t1cHMgd2l0aG91dCBtYXNraW5nIGV4Y2VwdGlvbnMgcmFpc2VkCi0gIGR1cmluZyB0aGUgbG9vay11cCBwcm9jZXNzLiAgKENvbnRyaWJ1dGVkIGJ5IFJheW1vbmQgSGV0dGluZ2VyLikKLQotICBcaXRlbSBUaGUgXGNzaW1wbGVtYWNyb3tQeV9JU19OQU4oXHZhcntYfSl9IG1hY3JvIHJldHVybnMgMSBpZiAKLSAgaXRzIGZsb2F0IG9yIGRvdWJsZSBhcmd1bWVudCBcdmFye1h9IGlzIGEgTmFOLiAgCi0gIChDb250cmlidXRlZCBieSBUaW0gUGV0ZXJzLikKLQotICBcaXRlbSBDIGNvZGUgY2FuIGF2b2lkIHVubmVjZXNzYXJ5IGxvY2tpbmcgYnkgdXNpbmcgdGhlIG5ldwotICAgXGNmdW5jdGlvbntQeUV2YWxfVGhyZWFkc0luaXRpYWxpemVkKCl9IGZ1bmN0aW9uIHRvIHRlbGwgCi0gICBpZiBhbnkgdGhyZWFkIG9wZXJhdGlvbnMgaGF2ZSBiZWVuIHBlcmZvcm1lZC4gIElmIHRoaXMgZnVuY3Rpb24gCi0gICByZXR1cm5zIGZhbHNlLCBubyBsb2NrIG9wZXJhdGlvbnMgYXJlIG5lZWRlZC4KLSAgIChDb250cmlidXRlZCBieSBOaWNrIENvZ2hsYW4uKQotCi0gIFxpdGVtIEEgbmV3IGZ1bmN0aW9uLCBcY2Z1bmN0aW9ue1B5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzKCl9LAotICBpcyB0aGUgc2FtZSBhcyBcY2Z1bmN0aW9ue1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcygpfSBidXQgdGFrZXMgYSAKLSAgXGN0eXBle3ZhX2xpc3R9IGluc3RlYWQgb2YgYSBudW1iZXIgb2YgYXJndW1lbnRzLgotICAoQ29udHJpYnV0ZWQgYnkgR3JlZyBDaGFwbWFuLikKLQotICBcaXRlbSBBIG5ldyBtZXRob2QgZmxhZywgXGNvbnN0YW50e01FVEhfQ09FWElTVFN9LCBhbGxvd3MgYSBmdW5jdGlvbgotICBkZWZpbmVkIGluIHNsb3RzIHRvIGNvLWV4aXN0IHdpdGggYSBcY3R5cGV7UHlDRnVuY3Rpb259IGhhdmluZyB0aGUKLSAgc2FtZSBuYW1lLiAgVGhpcyBjYW4gaGFsdmUgdGhlIGFjY2VzcyB0aW1lIGZvciBhIG1ldGhvZCBzdWNoIGFzCi0gIFxtZXRob2R7c2V0Ll9fY29udGFpbnNfXygpfS4gIChDb250cmlidXRlZCBieSBSYXltb25kIEhldHRpbmdlci4pCi0KLSAgXGl0ZW0gUHl0aG9uIGNhbiBub3cgYmUgYnVpbHQgd2l0aCBhZGRpdGlvbmFsIHByb2ZpbGluZyBmb3IgdGhlCi0gIGludGVycHJldGVyIGl0c2VsZiwgaW50ZW5kZWQgYXMgYW4gYWlkIHRvIHBlb3BsZSBkZXZlbG9waW5nIHRoZQotICBQeXRob24gY29yZS4gIFByb3ZpZGluZyBcbG9uZ3Byb2dyYW1vcHR7LS1lbmFibGUtcHJvZmlsaW5nfSB0byB0aGUKLSAgXHByb2dyYW17Y29uZmlndXJlfSBzY3JpcHQgd2lsbCBsZXQgeW91IHByb2ZpbGUgdGhlIGludGVycHJldGVyIHdpdGgKLSAgXHByb2dyYW17Z3Byb2Z9LCBhbmQgcHJvdmlkaW5nIHRoZSBcbG9uZ3Byb2dyYW1vcHR7LS13aXRoLXRzY30KLSAgc3dpdGNoIGVuYWJsZXMgcHJvZmlsaW5nIHVzaW5nIHRoZSBQZW50aXVtJ3MgVGltZS1TdGFtcC1Db3VudGVyCi0gIHJlZ2lzdGVyLiAgTm90ZSB0aGF0IHRoZSBcbG9uZ3Byb2dyYW1vcHR7LS13aXRoLXRzY30gc3dpdGNoIGlzIHNsaWdodGx5Ci0gIG1pc25hbWVkLCBiZWNhdXNlIHRoZSBwcm9maWxpbmcgZmVhdHVyZSBhbHNvIHdvcmtzIG9uIHRoZSBQb3dlclBDCi0gIHBsYXRmb3JtLCB0aG91Z2ggdGhhdCBwcm9jZXNzb3IgYXJjaGl0ZWN0dXJlIGRvZXNuJ3QgY2FsbCB0aGF0Ci0gIHJlZ2lzdGVyIGBgdGhlIFRTQyByZWdpc3RlcicnLiAgKENvbnRyaWJ1dGVkIGJ5IEplcmVteSBIeWx0b24uKQotICAgIAotICBcaXRlbSBUaGUgXGN0eXBle3RyYWNlYmFja29iamVjdH0gdHlwZSBoYXMgYmVlbiByZW5hbWVkIHRvIFxjdHlwZXtQeVRyYWNlYmFja09iamVjdH0uCi0KLVxlbmR7aXRlbWl6ZX0KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHN1YnNlY3Rpb257UG9ydC1TcGVjaWZpYyBDaGFuZ2VzfQotCi1cYmVnaW57aXRlbWl6ZX0KLQotXGl0ZW0gVGhlIFdpbmRvd3MgcG9ydCBub3cgYnVpbGRzIHVuZGVyIE1TVkMrKyA3LjEgYXMgd2VsbCBhcyB2ZXJzaW9uIDYuCi0gIChDb250cmlidXRlZCBieSBNYXJ0aW4gdm9ufkxcIm93aXMuKQotCi1cZW5ke2l0ZW1pemV9Ci0KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257UG9ydGluZyB0byBQeXRob24gMi40fQotCi1UaGlzIHNlY3Rpb24gbGlzdHMgcHJldmlvdXNseSBkZXNjcmliZWQgY2hhbmdlcyB0aGF0IG1heSByZXF1aXJlCi1jaGFuZ2VzIHRvIHlvdXIgY29kZToKLQotXGJlZ2lue2l0ZW1pemV9Ci0KLVxpdGVtIExlZnQgc2hpZnRzIGFuZCBoZXhhZGVjaW1hbC9vY3RhbCBjb25zdGFudHMgdGhhdCBhcmUgdG9vIAotICBsYXJnZSBubyBsb25nZXIgdHJpZ2dlciBhIFxleGNlcHRpb257RnV0dXJlV2FybmluZ30gYW5kIHJldHVybiAKLSAgYSB2YWx1ZSBsaW1pdGVkIHRvIDMyIG9yIDY0IGJpdHM7IGluc3RlYWQgdGhleSByZXR1cm4gYSBsb25nIGludGVnZXIuCi0KLVxpdGVtIEludGVnZXIgb3BlcmF0aW9ucyB3aWxsIG5vIGxvbmdlciB0cmlnZ2VyIGFuIFxleGNlcHRpb257T3ZlcmZsb3dXYXJuaW5nfS4KLVRoZSBcZXhjZXB0aW9ue092ZXJmbG93V2FybmluZ30gd2FybmluZyB3aWxsIGRpc2FwcGVhciBpbiBQeXRob24gMi41LgotCi1caXRlbSBUaGUgXGZ1bmN0aW9ue3ppcCgpfSBidWlsdC1pbiBmdW5jdGlvbiBhbmQgXGZ1bmN0aW9ue2l0ZXJ0b29scy5pemlwKCl9Ci0gIG5vdyByZXR1cm4gIGFuIGVtcHR5IGxpc3QgaW5zdGVhZCBvZiByYWlzaW5nIGEgXGV4Y2VwdGlvbntUeXBlRXJyb3J9Ci0gIGV4Y2VwdGlvbiBpZiBjYWxsZWQgd2l0aCBubyBhcmd1bWVudHMuCi0KLVxpdGVtIFlvdSBjYW4gbm8gbG9uZ2VyIGNvbXBhcmUgdGhlIFxjbGFzc3tkYXRlfSBhbmQgXGNsYXNze2RhdGV0aW1lfQotICBpbnN0YW5jZXMgcHJvdmlkZWQgYnkgdGhlIFxtb2R1bGV7ZGF0ZXRpbWV9IG1vZHVsZS4gIFR3byAKLSAgaW5zdGFuY2VzIG9mIGRpZmZlcmVudCBjbGFzc2VzIHdpbGwgbm93IGFsd2F5cyBiZSB1bmVxdWFsLCBhbmQgCi0gIHJlbGF0aXZlIGNvbXBhcmlzb25zIChcY29kZXs8fSwgXGNvZGV7Pn0pIHdpbGwgcmFpc2UgYSBcZXhjZXB0aW9ue1R5cGVFcnJvcn0uCi0KLVxpdGVtIFxmdW5jdGlvbntkaXJjYWNoZS5saXN0ZGlyKCl9IG5vdyBwYXNzZXMgZXhjZXB0aW9ucyB0byB0aGUgY2FsbGVyCi0gICAgICBpbnN0ZWFkIG9mIHJldHVybmluZyBlbXB0eSBsaXN0cy4KLQotXGl0ZW0gXGZ1bmN0aW9ue0xleGljYWxIYW5kbGVyLnN0YXJ0RFREKCl9IHVzZWQgdG8gcmVjZWl2ZSB0aGUgcHVibGljIGFuZAotICBzeXN0ZW0gSURzIGluIHRoZSB3cm9uZyBvcmRlci4gIFRoaXMgaGFzIGJlZW4gY29ycmVjdGVkOyBhcHBsaWNhdGlvbnMKLSAgcmVseWluZyBvbiB0aGUgd3Jvbmcgb3JkZXIgbmVlZCB0byBiZSBmaXhlZC4KLQotXGl0ZW0gXGZ1bmN0aW9ue2ZjbnRsLmlvY3RsfSBub3cgd2FybnMgaWYgdGhlIFx2YXJ7bXV0YXRlfSAKLSBhcmd1bWVudCBpcyBvbWl0dGVkIGFuZCByZWxldmFudC4KLQotXGl0ZW0gVGhlIFxtb2R1bGV7dGFyZmlsZX0gbW9kdWxlIG5vdyBnZW5lcmF0ZXMgR05VLWZvcm1hdCB0YXIgZmlsZXMKLWJ5IGRlZmF1bHQuCi0KLVxpdGVtIEVuY291bnRlcmluZyBhIGZhaWx1cmUgd2hpbGUgaW1wb3J0aW5nIGEgbW9kdWxlIG5vIGxvbmdlciBsZWF2ZXMKLWEgcGFydGlhbGx5LWluaXRpYWxpemVkIG1vZHVsZSBvYmplY3QgaW4gXGNvZGV7c3lzLm1vZHVsZXN9LiAgCi0KLVxpdGVtIFxjb25zdGFudHtOb25lfSBpcyBub3cgYSBjb25zdGFudDsgY29kZSB0aGF0IGJpbmRzIGEgbmV3IHZhbHVlIHRvIAotdGhlIG5hbWUgXHNhbXB7Tm9uZX0gaXMgbm93IGEgc3ludGF4IGVycm9yLgotCi1caXRlbSBUaGUgXGZ1bmN0aW9ue3NpZ25hbHMuc2lnbmFsKCl9IGZ1bmN0aW9uIG5vdyByYWlzZXMgYQotXGV4Y2VwdGlvbntSdW50aW1lRXJyb3J9IGV4Y2VwdGlvbiBmb3IgY2VydGFpbiBpbGxlZ2FsIHZhbHVlczsKLXByZXZpb3VzbHkgdGhlc2UgZXJyb3JzIHdvdWxkIHBhc3Mgc2lsZW50bHkuICBGb3IgZXhhbXBsZSwgeW91IGNhbiBubwotbG9uZ2VyIHNldCBhIGhhbmRsZXIgb24gdGhlIFxjb25zdGFudHtTSUdLSUxMfSBzaWduYWwuCi0KLVxlbmR7aXRlbWl6ZX0KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257QWNrbm93bGVkZ2VtZW50cyBcbGFiZWx7YWNrc319Ci0KLVRoZSBhdXRob3Igd291bGQgbGlrZSB0byB0aGFuayB0aGUgZm9sbG93aW5nIHBlb3BsZSBmb3Igb2ZmZXJpbmcKLXN1Z2dlc3Rpb25zLCBjb3JyZWN0aW9ucyBhbmQgYXNzaXN0YW5jZSB3aXRoIHZhcmlvdXMgZHJhZnRzIG9mIHRoaXMKLWFydGljbGU6IEtvcmF5IENhbiwgSHllLVNoaWsgQ2hhbmcsIE1pY2hhZWwgRHljaywgUmF5bW9uZCBIZXR0aW5nZXIsCi1CcmlhbiBIdXJ0LCBIYW1pc2ggTGF3c29uLCBGcmVkcmlrIEx1bmRoLCBTZWFuIFJlaWZzY2huZWlkZXIsCi1TYWRydWRkaW4gUmVqZWIuCi0KLVxlbmR7ZG9jdW1lbnR9CmRpZmYgLS1naXQgYS9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyNS50ZXggYi9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyNS50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YmFjNDkuLjAwMDAwMDAKLS0tIGEvRG9jL3doYXRzbmV3L3doYXRzbmV3MjUudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMjUzOSArMCwwIEBACi1cZG9jdW1lbnRjbGFzc3tob3d0b30KLVx1c2VwYWNrYWdle2Rpc3R1dGlsc30KLSUgJElkJAotCi0lIEZpeCBYWFggY29tbWVudHMKLQotXHRpdGxle1doYXQncyBOZXcgaW4gUHl0aG9uIDIuNX0KLVxyZWxlYXNlezEuMDF9Ci1cYXV0aG9ye0EuTS4gS3VjaGxpbmd9Ci1cYXV0aG9yYWRkcmVzc3tcZW1haWx7YW1rQGFtay5jYX19Ci0KLVxiZWdpbntkb2N1bWVudH0KLVxtYWtldGl0bGUKLVx0YWJsZW9mY29udGVudHMKLQotVGhpcyBhcnRpY2xlIGV4cGxhaW5zIHRoZSBuZXcgZmVhdHVyZXMgaW4gUHl0aG9uIDIuNS4gIFRoZSBmaW5hbAotcmVsZWFzZSBvZiBQeXRob24gMi41IGlzIHNjaGVkdWxlZCBmb3IgQXVndXN0IDIwMDY7Ci1ccGVwezM1Nn0gZGVzY3JpYmVzIHRoZSBwbGFubmVkIHJlbGVhc2Ugc2NoZWR1bGUuCi0KLVRoZSBjaGFuZ2VzIGluIFB5dGhvbiAyLjUgYXJlIGFuIGludGVyZXN0aW5nIG1peCBvZiBsYW5ndWFnZSBhbmQKLWxpYnJhcnkgaW1wcm92ZW1lbnRzLiBUaGUgbGlicmFyeSBlbmhhbmNlbWVudHMgd2lsbCBiZSBtb3JlIGltcG9ydGFudAotdG8gUHl0aG9uJ3MgdXNlciBjb21tdW5pdHksIEkgdGhpbmssIGJlY2F1c2Ugc2V2ZXJhbCB3aWRlbHktdXNlZnVsCi1wYWNrYWdlcyB3ZXJlIGFkZGVkLiAgTmV3IG1vZHVsZXMgaW5jbHVkZSBFbGVtZW50VHJlZSBmb3IgWE1MCi1wcm9jZXNzaW5nIChzZWN0aW9uflxyZWZ7bW9kdWxlLWV0cmVlfSksIHRoZSBTUUxpdGUgZGF0YWJhc2UgbW9kdWxlCi0oc2VjdGlvbn5ccmVme21vZHVsZS1zcWxpdGV9KSwgYW5kIHRoZSBcbW9kdWxle2N0eXBlc30gbW9kdWxlIGZvcgotY2FsbGluZyBDIGZ1bmN0aW9ucyAoc2VjdGlvbn5ccmVme21vZHVsZS1jdHlwZXN9KS4KLQotVGhlIGxhbmd1YWdlIGNoYW5nZXMgYXJlIG9mIG1pZGRsaW5nIHNpZ25pZmljYW5jZS4gIFNvbWUgcGxlYXNhbnQgbmV3Ci1mZWF0dXJlcyB3ZXJlIGFkZGVkLCBidXQgbW9zdCBvZiB0aGVtIGFyZW4ndCBmZWF0dXJlcyB0aGF0IHlvdSdsbCB1c2UKLWV2ZXJ5IGRheS4gIENvbmRpdGlvbmFsIGV4cHJlc3Npb25zIHdlcmUgZmluYWxseSBhZGRlZCB0byB0aGUgbGFuZ3VhZ2UKLXVzaW5nIGEgbm92ZWwgc3ludGF4OyBzZWUgc2VjdGlvbn5ccmVme3BlcC0zMDh9LiAgVGhlIG5ldwotJ1xrZXl3b3Jke3dpdGh9JyBzdGF0ZW1lbnQgd2lsbCBtYWtlIHdyaXRpbmcgY2xlYW51cCBjb2RlIGVhc2llcgotKHNlY3Rpb25+XHJlZntwZXAtMzQzfSkuICBWYWx1ZXMgY2FuIG5vdyBiZSBwYXNzZWQgaW50byBnZW5lcmF0b3JzCi0oc2VjdGlvbn5ccmVme3BlcC0zNDJ9KS4gIEltcG9ydHMgYXJlIG5vdyB2aXNpYmxlIGFzIGVpdGhlciBhYnNvbHV0ZQotb3IgcmVsYXRpdmUgKHNlY3Rpb25+XHJlZntwZXAtMzI4fSkuICBTb21lIGNvcm5lciBjYXNlcyBvZiBleGNlcHRpb24KLWhhbmRsaW5nIGFyZSBoYW5kbGVkIGJldHRlciAoc2VjdGlvbn5ccmVme3BlcC0zNDF9KS4gIEFsbCB0aGVzZQotaW1wcm92ZW1lbnRzIGFyZSB3b3J0aHdoaWxlLCBidXQgdGhleSdyZSBpbXByb3ZlbWVudHMgdG8gb25lIHNwZWNpZmljCi1sYW5ndWFnZSBmZWF0dXJlIG9yIGFub3RoZXI7IG5vbmUgb2YgdGhlbSBhcmUgYnJvYWQgbW9kaWZpY2F0aW9ucyB0bwotUHl0aG9uJ3Mgc2VtYW50aWNzLgotCi1BcyB3ZWxsIGFzIHRoZSBsYW5ndWFnZSBhbmQgbGlicmFyeSBhZGRpdGlvbnMsIG90aGVyIGltcHJvdmVtZW50cyBhbmQKLWJ1Z2ZpeGVzIHdlcmUgbWFkZSB0aHJvdWdob3V0IHRoZSBzb3VyY2UgdHJlZS4gIEEgc2VhcmNoIHRocm91Z2ggdGhlCi1TVk4gY2hhbmdlIGxvZ3MgZmluZHMgdGhlcmUgd2VyZSAzNTMgcGF0Y2hlcyBhcHBsaWVkIGFuZCA0NTggYnVncwotZml4ZWQgYmV0d2VlbiBQeXRob24gMi40IGFuZCAyLjUuICAoQm90aCBmaWd1cmVzIGFyZSBsaWtlbHkgdG8gYmUKLXVuZGVyZXN0aW1hdGVzLikgIAotCi1UaGlzIGFydGljbGUgZG9lc24ndCB0cnkgdG8gYmUgYSBjb21wbGV0ZSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBuZXcKLWZlYXR1cmVzOyBpbnN0ZWFkIGNoYW5nZXMgYXJlIGJyaWVmbHkgaW50cm9kdWNlZCB1c2luZyBoZWxwZnVsCi1leGFtcGxlcy4gIEZvciBmdWxsIGRldGFpbHMsIHlvdSBzaG91bGQgYWx3YXlzIHJlZmVyIHRvIHRoZQotZG9jdW1lbnRhdGlvbiBmb3IgUHl0aG9uIDIuNSBhdCBcdXJse2h0dHA6Ly9kb2NzLnB5dGhvbi5vcmd9LgotSWYgeW91IHdhbnQgdG8gdW5kZXJzdGFuZCB0aGUgY29tcGxldGUgaW1wbGVtZW50YXRpb24gYW5kIGRlc2lnbgotcmF0aW9uYWxlLCByZWZlciB0byB0aGUgUEVQIGZvciBhIHBhcnRpY3VsYXIgbmV3IGZlYXR1cmUuCi0KLUNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGVycm9yIHJlcG9ydHMgZm9yIHRoaXMgZG9jdW1lbnQgYXJlCi13ZWxjb21lOyBwbGVhc2UgZS1tYWlsIHRoZW0gdG8gdGhlIGF1dGhvciBvciBvcGVuIGEgYnVnIGluIHRoZSBQeXRob24KLWJ1ZyB0cmFja2VyLgotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257UEVQIDMwODogQ29uZGl0aW9uYWwgRXhwcmVzc2lvbnNcbGFiZWx7cGVwLTMwOH19Ci0KLUZvciBhIGxvbmcgdGltZSwgcGVvcGxlIGhhdmUgYmVlbiByZXF1ZXN0aW5nIGEgd2F5IHRvIHdyaXRlCi1jb25kaXRpb25hbCBleHByZXNzaW9ucywgd2hpY2ggYXJlIGV4cHJlc3Npb25zIHRoYXQgcmV0dXJuIHZhbHVlIEEgb3IKLXZhbHVlIEIgZGVwZW5kaW5nIG9uIHdoZXRoZXIgYSBCb29sZWFuIHZhbHVlIGlzIHRydWUgb3IgZmFsc2UuICBBCi1jb25kaXRpb25hbCBleHByZXNzaW9uIGxldHMgeW91IHdyaXRlIGEgc2luZ2xlIGFzc2lnbm1lbnQgc3RhdGVtZW50Ci10aGF0IGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgdGhlIGZvbGxvd2luZzoKLQotXGJlZ2lue3ZlcmJhdGltfQotaWYgY29uZGl0aW9uOgotICAgIHggPSB0cnVlX3ZhbHVlCi1lbHNlOgotICAgIHggPSBmYWxzZV92YWx1ZQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlcmUgaGF2ZSBiZWVuIGVuZGxlc3MgdGVkaW91cyBkaXNjdXNzaW9ucyBvZiBzeW50YXggb24gYm90aAotcHl0aG9uLWRldiBhbmQgY29tcC5sYW5nLnB5dGhvbi4gIEEgdm90ZSB3YXMgZXZlbiBoZWxkIHRoYXQgZm91bmQgdGhlCi1tYWpvcml0eSBvZiB2b3RlcnMgd2FudGVkIGNvbmRpdGlvbmFsIGV4cHJlc3Npb25zIGluIHNvbWUgZm9ybSwKLWJ1dCB0aGVyZSB3YXMgbm8gc3ludGF4IHRoYXQgd2FzIHByZWZlcnJlZCBieSBhIGNsZWFyIG1ham9yaXR5LgotQ2FuZGlkYXRlcyBpbmNsdWRlZCBDJ3MgXGNvZGV7Y29uZCA/IHRydWVfdiA6IGZhbHNlX3Z9LAotXGNvZGV7aWYgY29uZCB0aGVuIHRydWVfdiBlbHNlIGZhbHNlX3Z9LCBhbmQgMTYgb3RoZXIgdmFyaWF0aW9ucy4KLQotR3VpZG8gdmFuflJvc3N1bSBldmVudHVhbGx5IGNob3NlIGEgc3VycHJpc2luZyBzeW50YXg6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXggPSB0cnVlX3ZhbHVlIGlmIGNvbmRpdGlvbiBlbHNlIGZhbHNlX3ZhbHVlCi1cZW5ke3ZlcmJhdGltfQotCi1FdmFsdWF0aW9uIGlzIHN0aWxsIGxhenkgYXMgaW4gZXhpc3RpbmcgQm9vbGVhbiBleHByZXNzaW9ucywgc28gdGhlCi1vcmRlciBvZiBldmFsdWF0aW9uIGp1bXBzIGFyb3VuZCBhIGJpdC4gIFRoZSBcdmFye2NvbmRpdGlvbn0KLWV4cHJlc3Npb24gaW4gdGhlIG1pZGRsZSBpcyBldmFsdWF0ZWQgZmlyc3QsIGFuZCB0aGUgXHZhcnt0cnVlX3ZhbHVlfQotZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgb25seSBpZiB0aGUgY29uZGl0aW9uIHdhcyB0cnVlLiAgU2ltaWxhcmx5LAotdGhlIFx2YXJ7ZmFsc2VfdmFsdWV9IGV4cHJlc3Npb24gaXMgb25seSBldmFsdWF0ZWQgd2hlbiB0aGUgY29uZGl0aW9uCi1pcyBmYWxzZS4KLQotVGhpcyBzeW50YXggbWF5IHNlZW0gc3RyYW5nZSBhbmQgYmFja3dhcmRzOyB3aHkgZG9lcyB0aGUgY29uZGl0aW9uIGdvCi1pbiB0aGUgXGVtcGh7bWlkZGxlfSBvZiB0aGUgZXhwcmVzc2lvbiwgYW5kIG5vdCBpbiB0aGUgZnJvbnQgYXMgaW4gQydzCi1cY29kZXtjID8geCA6IHl9PyAgVGhlIGRlY2lzaW9uIHdhcyBjaGVja2VkIGJ5IGFwcGx5aW5nIHRoZSBuZXcgc3ludGF4Ci10byB0aGUgbW9kdWxlcyBpbiB0aGUgc3RhbmRhcmQgbGlicmFyeSBhbmQgc2VlaW5nIGhvdyB0aGUgcmVzdWx0aW5nCi1jb2RlIHJlYWQuICBJbiBtYW55IGNhc2VzIHdoZXJlIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBpcyB1c2VkLCBvbmUKLXZhbHVlIHNlZW1zIHRvIGJlIHRoZSAnY29tbW9uIGNhc2UnIGFuZCBvbmUgdmFsdWUgaXMgYW4gJ2V4Y2VwdGlvbmFsCi1jYXNlJywgdXNlZCBvbmx5IG9uIHJhcmVyIG9jY2FzaW9ucyB3aGVuIHRoZSBjb25kaXRpb24gaXNuJ3QgbWV0LiAgVGhlCi1jb25kaXRpb25hbCBzeW50YXggbWFrZXMgdGhpcyBwYXR0ZXJuIGEgYml0IG1vcmUgb2J2aW91czoKLQotXGJlZ2lue3ZlcmJhdGltfQotY29udGVudHMgPSAoKGRvYyArICdcbicpIGlmIGRvYyBlbHNlICcnKQotXGVuZHt2ZXJiYXRpbX0KLQotSSByZWFkIHRoZSBhYm92ZSBzdGF0ZW1lbnQgYXMgbWVhbmluZyBgYGhlcmUgXHZhcntjb250ZW50c30gaXMgCi11c3VhbGx5IGFzc2lnbmVkIGEgdmFsdWUgb2YgXGNvZGV7ZG9jKydcZSBuJ307IHNvbWV0aW1lcyAKLVx2YXJ7ZG9jfSBpcyBlbXB0eSwgaW4gd2hpY2ggc3BlY2lhbCBjYXNlIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4nJyAgCi1JIGRvdWJ0IEkgd2lsbCB1c2UgY29uZGl0aW9uYWwgZXhwcmVzc2lvbnMgdmVyeSBvZnRlbiB3aGVyZSB0aGVyZSAKLWlzbid0IGEgY2xlYXIgY29tbW9uIGFuZCB1bmNvbW1vbiBjYXNlLgotCi1UaGVyZSB3YXMgc29tZSBkaXNjdXNzaW9uIG9mIHdoZXRoZXIgdGhlIGxhbmd1YWdlIHNob3VsZCByZXF1aXJlCi1zdXJyb3VuZGluZyBjb25kaXRpb25hbCBleHByZXNzaW9ucyB3aXRoIHBhcmVudGhlc2VzLiAgVGhlIGRlY2lzaW9uCi13YXMgbWFkZSB0byBcZW1waHtub3R9IHJlcXVpcmUgcGFyZW50aGVzZXMgaW4gdGhlIFB5dGhvbiBsYW5ndWFnZSdzCi1ncmFtbWFyLCBidXQgYXMgYSBtYXR0ZXIgb2Ygc3R5bGUgSSB0aGluayB5b3Ugc2hvdWxkIGFsd2F5cyB1c2UgdGhlbS4KLUNvbnNpZGVyIHRoZXNlIHR3byBzdGF0ZW1lbnRzOgotCi1cYmVnaW57dmVyYmF0aW19Ci0jIEZpcnN0IHZlcnNpb24gLS0gbm8gcGFyZW5zCi1sZXZlbCA9IDEgaWYgbG9nZ2luZyBlbHNlIDAKLQotIyBTZWNvbmQgdmVyc2lvbiAtLSB3aXRoIHBhcmVucwotbGV2ZWwgPSAoMSBpZiBsb2dnaW5nIGVsc2UgMCkKLVxlbmR7dmVyYmF0aW19Ci0KLUluIHRoZSBmaXJzdCB2ZXJzaW9uLCBJIHRoaW5rIGEgcmVhZGVyJ3MgZXllIG1pZ2h0IGdyb3VwIHRoZSBzdGF0ZW1lbnQKLWludG8gJ2xldmVsID0gMScsICdpZiBsb2dnaW5nJywgJ2Vsc2UgMCcsIGFuZCB0aGluayB0aGF0IHRoZSBjb25kaXRpb24KLWRlY2lkZXMgd2hldGhlciB0aGUgYXNzaWdubWVudCB0byBcdmFye2xldmVsfSBpcyBwZXJmb3JtZWQuICBUaGUKLXNlY29uZCB2ZXJzaW9uIHJlYWRzIGJldHRlciwgaW4gbXkgb3BpbmlvbiwgYmVjYXVzZSBpdCBtYWtlcyBpdCBjbGVhcgotdGhhdCB0aGUgYXNzaWdubWVudCBpcyBhbHdheXMgcGVyZm9ybWVkIGFuZCB0aGUgY2hvaWNlIGlzIGJlaW5nIG1hZGUKLWJldHdlZW4gdHdvIHZhbHVlcy4KLQotQW5vdGhlciByZWFzb24gZm9yIGluY2x1ZGluZyB0aGUgYnJhY2tldHM6IGEgZmV3IG9kZCBjb21iaW5hdGlvbnMgb2YKLWxpc3QgY29tcHJlaGVuc2lvbnMgYW5kIGxhbWJkYXMgY291bGQgbG9vayBsaWtlIGluY29ycmVjdCBjb25kaXRpb25hbAotZXhwcmVzc2lvbnMuIFNlZSBccGVwezMwOH0gZm9yIHNvbWUgZXhhbXBsZXMuICBJZiB5b3UgcHV0IHBhcmVudGhlc2VzCi1hcm91bmQgeW91ciBjb25kaXRpb25hbCBleHByZXNzaW9ucywgeW91IHdvbid0IHJ1biBpbnRvIHRoaXMgY2FzZS4KLQotCi1cYmVnaW57c2VlYWxzb30KLQotXHNlZXBlcHszMDh9e0NvbmRpdGlvbmFsIEV4cHJlc3Npb25zfXtQRVAgd3JpdHRlbiBieQotR3VpZG8gdmFuflJvc3N1bSBhbmQgUmF5bW9uZCBELiBIZXR0aW5nZXI7IGltcGxlbWVudGVkIGJ5IFRob21hcwotV291dGVycy59Ci0KLVxlbmR7c2VlYWxzb30KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257UEVQIDMwOTogUGFydGlhbCBGdW5jdGlvbiBBcHBsaWNhdGlvblxsYWJlbHtwZXAtMzA5fX0KLQotVGhlIFxtb2R1bGV7ZnVuY3Rvb2xzfSBtb2R1bGUgaXMgaW50ZW5kZWQgdG8gY29udGFpbiB0b29scyBmb3IKLWZ1bmN0aW9uYWwtc3R5bGUgcHJvZ3JhbW1pbmcuICAKLQotT25lIHVzZWZ1bCB0b29sIGluIHRoaXMgbW9kdWxlIGlzIHRoZSBcZnVuY3Rpb257cGFydGlhbCgpfSBmdW5jdGlvbi4KLUZvciBwcm9ncmFtcyB3cml0dGVuIGluIGEgZnVuY3Rpb25hbCBzdHlsZSwgeW91J2xsIHNvbWV0aW1lcyB3YW50IHRvCi1jb25zdHJ1Y3QgdmFyaWFudHMgb2YgZXhpc3RpbmcgZnVuY3Rpb25zIHRoYXQgaGF2ZSBzb21lIG9mIHRoZQotcGFyYW1ldGVycyBmaWxsZWQgaW4uICBDb25zaWRlciBhIFB5dGhvbiBmdW5jdGlvbiBcY29kZXtmKGEsIGIsIGMpfTsKLXlvdSBjb3VsZCBjcmVhdGUgYSBuZXcgZnVuY3Rpb24gXGNvZGV7ZyhiLCBjKX0gdGhhdCB3YXMgZXF1aXZhbGVudCB0bwotXGNvZGV7ZigxLCBiLCBjKX0uICBUaGlzIGlzIGNhbGxlZCBgYHBhcnRpYWwgZnVuY3Rpb24gYXBwbGljYXRpb24nJy4KLQotXGZ1bmN0aW9ue3BhcnRpYWx9IHRha2VzIHRoZSBhcmd1bWVudHMKLVxjb2RleyhcdmFye2Z1bmN0aW9ufSwgXHZhcnthcmcxfSwgXHZhcnthcmcyfSwgLi4uCi1cdmFye2t3YXJnMX09XHZhcnt2YWx1ZTF9LCBcdmFye2t3YXJnMn09XHZhcnt2YWx1ZTJ9KX0uICBUaGUgcmVzdWx0aW5nCi1vYmplY3QgaXMgY2FsbGFibGUsIHNvIHlvdSBjYW4ganVzdCBjYWxsIGl0IHRvIGludm9rZSBcdmFye2Z1bmN0aW9ufQotd2l0aCB0aGUgZmlsbGVkLWluIGFyZ3VtZW50cy4KLQotSGVyZSdzIGEgc21hbGwgYnV0IHJlYWxpc3RpYyBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgZnVuY3Rvb2xzCi0KLWRlZiBsb2cgKG1lc3NhZ2UsIHN1YnN5c3RlbSk6Ci0gICAgIldyaXRlIHRoZSBjb250ZW50cyBvZiAnbWVzc2FnZScgdG8gdGhlIHNwZWNpZmllZCBzdWJzeXN0ZW0uIgotICAgIHByaW50ICclczogJXMnICUgKHN1YnN5c3RlbSwgbWVzc2FnZSkKLSAgICAuLi4KLQotc2VydmVyX2xvZyA9IGZ1bmN0b29scy5wYXJ0aWFsKGxvZywgc3Vic3lzdGVtPSdzZXJ2ZXInKQotc2VydmVyX2xvZygnVW5hYmxlIHRvIG9wZW4gc29ja2V0JykKLVxlbmR7dmVyYmF0aW19Ci0KLUhlcmUncyBhbm90aGVyIGV4YW1wbGUsIGZyb20gYSBwcm9ncmFtIHRoYXQgdXNlcyBQeUdUSy4gIEhlcmUgYQotY29udGV4dC1zZW5zaXRpdmUgcG9wLXVwIG1lbnUgaXMgYmVpbmcgY29uc3RydWN0ZWQgZHluYW1pY2FsbHkuICBUaGUKLWNhbGxiYWNrIHByb3ZpZGVkIGZvciB0aGUgbWVudSBvcHRpb24gaXMgYSBwYXJ0aWFsbHkgYXBwbGllZCB2ZXJzaW9uCi1vZiB0aGUgXG1ldGhvZHtvcGVuX2l0ZW0oKX0gbWV0aG9kLCB3aGVyZSB0aGUgZmlyc3QgYXJndW1lbnQgaGFzIGJlZW4KLXByb3ZpZGVkLgotCi1cYmVnaW57dmVyYmF0aW19Ci0uLi4KLWNsYXNzIEFwcGxpY2F0aW9uOgotICAgIGRlZiBvcGVuX2l0ZW0oc2VsZiwgcGF0aCk6Ci0gICAgICAgLi4uCi0gICAgZGVmIGluaXQgKHNlbGYpOgotICAgICAgICBvcGVuX2Z1bmMgPSBmdW5jdG9vbHMucGFydGlhbChzZWxmLm9wZW5faXRlbSwgaXRlbV9wYXRoKQotICAgICAgICBwb3B1cF9tZW51LmFwcGVuZCggKCJPcGVuIiwgb3Blbl9mdW5jLCAxKSApCi1cZW5ke3ZlcmJhdGltfQotCi0KLUFub3RoZXIgZnVuY3Rpb24gaW4gdGhlIFxtb2R1bGV7ZnVuY3Rvb2xzfSBtb2R1bGUgaXMgdGhlCi1cZnVuY3Rpb257dXBkYXRlX3dyYXBwZXIoXHZhcnt3cmFwcGVyfSwgXHZhcnt3cmFwcGVkfSl9IGZ1bmN0aW9uIHRoYXQKLWhlbHBzIHlvdSB3cml0ZSB3ZWxsLWJlaGF2ZWQgZGVjb3JhdG9ycy4gIFxmdW5jdGlvbnt1cGRhdGVfd3JhcHBlcigpfQotY29waWVzIHRoZSBuYW1lLCBtb2R1bGUsIGFuZCBkb2NzdHJpbmcgYXR0cmlidXRlIHRvIGEgd3JhcHBlciBmdW5jdGlvbgotc28gdGhhdCB0cmFjZWJhY2tzIGluc2lkZSB0aGUgd3JhcHBlZCBmdW5jdGlvbiBhcmUgZWFzaWVyIHRvCi11bmRlcnN0YW5kLiAgRm9yIGV4YW1wbGUsIHlvdSBtaWdodCB3cml0ZToKLQotXGJlZ2lue3ZlcmJhdGltfQotZGVmIG15X2RlY29yYXRvcihmKToKLSAgICBkZWYgd3JhcHBlcigqYXJncywgKiprd2RzKToKLSAgICAgICAgcHJpbnQgJ0NhbGxpbmcgZGVjb3JhdGVkIGZ1bmN0aW9uJwotICAgICAgICByZXR1cm4gZigqYXJncywgKiprd2RzKQotICAgIGZ1bmN0b29scy51cGRhdGVfd3JhcHBlcih3cmFwcGVyLCBmKQotICAgIHJldHVybiB3cmFwcGVyCi1cZW5ke3ZlcmJhdGltfQotCi1cZnVuY3Rpb257d3JhcHMoKX0gaXMgYSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgdXNlZCBpbnNpZGUgeW91ciBvd24KLWRlY29yYXRvcnMgdG8gY29weSB0aGUgd3JhcHBlZCBmdW5jdGlvbidzIGluZm9ybWF0aW9uLiAgQW4gYWx0ZXJuYXRlIAotdmVyc2lvbiBvZiB0aGUgcHJldmlvdXMgZXhhbXBsZSB3b3VsZCBiZToKLQotXGJlZ2lue3ZlcmJhdGltfQotZGVmIG15X2RlY29yYXRvcihmKToKLSAgICBAZnVuY3Rvb2xzLndyYXBzKGYpCi0gICAgZGVmIHdyYXBwZXIoKmFyZ3MsICoqa3dkcyk6Ci0gICAgICAgIHByaW50ICdDYWxsaW5nIGRlY29yYXRlZCBmdW5jdGlvbicKLSAgICAgICAgcmV0dXJuIGYoKmFyZ3MsICoqa3dkcykKLSAgICByZXR1cm4gd3JhcHBlcgotXGVuZHt2ZXJiYXRpbX0KLQotXGJlZ2lue3NlZWFsc299Ci0KLVxzZWVwZXB7MzA5fXtQYXJ0aWFsIEZ1bmN0aW9uIEFwcGxpY2F0aW9ufXtQRVAgcHJvcG9zZWQgYW5kIHdyaXR0ZW4gYnkKLVBldGVyIEhhcnJpczsgaW1wbGVtZW50ZWQgYnkgSHllLVNoaWsgQ2hhbmcgYW5kIE5pY2sgQ29naGxhbiwgd2l0aAotYWRhcHRhdGlvbnMgYnkgUmF5bW9uZCBIZXR0aW5nZXIufQotCi1cZW5ke3NlZWFsc299Ci0KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue1BFUCAzMTQ6IE1ldGFkYXRhIGZvciBQeXRob24gU29mdHdhcmUgUGFja2FnZXMgdjEuMVxsYWJlbHtwZXAtMzE0fX0KLQotU29tZSBzaW1wbGUgZGVwZW5kZW5jeSBzdXBwb3J0IHdhcyBhZGRlZCB0byBEaXN0dXRpbHMuICBUaGUKLVxmdW5jdGlvbntzZXR1cCgpfSBmdW5jdGlvbiBub3cgaGFzIFxjb2Rle3JlcXVpcmVzfSwgXGNvZGV7cHJvdmlkZXN9LAotYW5kIFxjb2Rle29ic29sZXRlc30ga2V5d29yZCBwYXJhbWV0ZXJzLiAgV2hlbiB5b3UgYnVpbGQgYSBzb3VyY2UKLWRpc3RyaWJ1dGlvbiB1c2luZyB0aGUgXGNvZGV7c2Rpc3R9IGNvbW1hbmQsIHRoZSBkZXBlbmRlbmN5Ci1pbmZvcm1hdGlvbiB3aWxsIGJlIHJlY29yZGVkIGluIHRoZSBcZmlsZXtQS0ctSU5GT30gZmlsZS4KLQotQW5vdGhlciBuZXcga2V5d29yZCBwYXJhbWV0ZXIgaXMgXGNvZGV7ZG93bmxvYWRfdXJsfSwgd2hpY2ggc2hvdWxkIGJlCi1zZXQgdG8gYSBVUkwgZm9yIHRoZSBwYWNrYWdlJ3Mgc291cmNlIGNvZGUuICBUaGlzIG1lYW5zIGl0J3Mgbm93Ci1wb3NzaWJsZSB0byBsb29rIHVwIGFuIGVudHJ5IGluIHRoZSBwYWNrYWdlIGluZGV4LCBkZXRlcm1pbmUgdGhlCi1kZXBlbmRlbmNpZXMgZm9yIGEgcGFja2FnZSwgYW5kIGRvd25sb2FkIHRoZSByZXF1aXJlZCBwYWNrYWdlcy4KLQotXGJlZ2lue3ZlcmJhdGltfQotVkVSU0lPTiA9ICcxLjAnCi1zZXR1cChuYW1lPSdQeVBhY2thZ2UnLCAKLSAgICAgIHZlcnNpb249VkVSU0lPTiwKLSAgICAgIHJlcXVpcmVzPVsnbnVtYXJyYXknLCAnemxpYiAoPj0xLjEuNCknXSwKLSAgICAgIG9ic29sZXRlcz1bJ09sZFBhY2thZ2UnXQotICAgICAgZG93bmxvYWRfdXJsPSgnaHR0cDovL3d3dy5leGFtcGxlLmNvbS9weXBhY2thZ2UvZGlzdC9wa2ctJXMudGFyLmd6JwotICAgICAgICAgICAgICAgICAgICAlIFZFUlNJT04pLAotICAgICApCi1cZW5ke3ZlcmJhdGltfQotCi1Bbm90aGVyIG5ldyBlbmhhbmNlbWVudCB0byB0aGUgUHl0aG9uIHBhY2thZ2UgaW5kZXggYXQKLVx1cmx7aHR0cDovL2NoZWVzZXNob3AucHl0aG9uLm9yZ30gaXMgc3RvcmluZyBzb3VyY2UgYW5kIGJpbmFyeQotYXJjaGl2ZXMgZm9yIGEgcGFja2FnZS4gIFRoZSBuZXcgXGNvbW1hbmR7dXBsb2FkfSBEaXN0dXRpbHMgY29tbWFuZAotd2lsbCB1cGxvYWQgYSBwYWNrYWdlIHRvIHRoZSByZXBvc2l0b3J5LgotCi1CZWZvcmUgYSBwYWNrYWdlIGNhbiBiZSB1cGxvYWRlZCwgeW91IG11c3QgYmUgYWJsZSB0byBidWlsZCBhCi1kaXN0cmlidXRpb24gdXNpbmcgdGhlIFxjb21tYW5ke3NkaXN0fSBEaXN0dXRpbHMgY29tbWFuZC4gIE9uY2UgdGhhdAotd29ya3MsIHlvdSBjYW4gcnVuIFxjb2Rle3B5dGhvbiBzZXR1cC5weSB1cGxvYWR9IHRvIGFkZCB5b3VyIHBhY2thZ2UKLXRvIHRoZSBQeVBJIGFyY2hpdmUuICBPcHRpb25hbGx5IHlvdSBjYW4gR1BHLXNpZ24gdGhlIHBhY2thZ2UgYnkKLXN1cHBseWluZyB0aGUgXGxvbmdwcm9ncmFtb3B0e3NpZ259IGFuZAotXGxvbmdwcm9ncmFtb3B0e2lkZW50aXR5fSBvcHRpb25zLgotCi1QYWNrYWdlIHVwbG9hZGluZyB3YXMgaW1wbGVtZW50ZWQgYnkgTWFydGluIHZvbn5MXCJvd2lzIGFuZCBSaWNoYXJkIEpvbmVzLiAKLSAKLVxiZWdpbntzZWVhbHNvfQotCi1cc2VlcGVwezMxNH17TWV0YWRhdGEgZm9yIFB5dGhvbiBTb2Z0d2FyZSBQYWNrYWdlcyB2MS4xfXtQRVAgcHJvcG9zZWQKLWFuZCB3cml0dGVuIGJ5IEEuTS4gS3VjaGxpbmcsIFJpY2hhcmQgSm9uZXMsIGFuZCBGcmVkIERyYWtlOyAKLWltcGxlbWVudGVkIGJ5IFJpY2hhcmQgSm9uZXMgYW5kIEZyZWQgRHJha2UufQotCi1cZW5ke3NlZWFsc299Ci0KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue1BFUCAzMjg6IEFic29sdXRlIGFuZCBSZWxhdGl2ZSBJbXBvcnRzXGxhYmVse3BlcC0zMjh9fQotCi1UaGUgc2ltcGxlciBwYXJ0IG9mIFBFUCAzMjggd2FzIGltcGxlbWVudGVkIGluIFB5dGhvbiAyLjQ6IHBhcmVudGhlc2VzCi1jb3VsZCBub3cgYmUgdXNlZCB0byBlbmNsb3NlIHRoZSBuYW1lcyBpbXBvcnRlZCBmcm9tIGEgbW9kdWxlIHVzaW5nCi10aGUgXGNvZGV7ZnJvbSAuLi4gaW1wb3J0IC4uLn0gc3RhdGVtZW50LCBtYWtpbmcgaXQgZWFzaWVyIHRvIGltcG9ydAotbWFueSBkaWZmZXJlbnQgbmFtZXMuCi0KLVRoZSBtb3JlIGNvbXBsaWNhdGVkIHBhcnQgaGFzIGJlZW4gaW1wbGVtZW50ZWQgaW4gUHl0aG9uIDIuNToKLWltcG9ydGluZyBhIG1vZHVsZSBjYW4gYmUgc3BlY2lmaWVkIHRvIHVzZSBhYnNvbHV0ZSBvcgotcGFja2FnZS1yZWxhdGl2ZSBpbXBvcnRzLiAgVGhlIHBsYW4gaXMgdG8gbW92ZSB0b3dhcmQgbWFraW5nIGFic29sdXRlCi1pbXBvcnRzIHRoZSBkZWZhdWx0IGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiBQeXRob24uCi0KLUxldCdzIHNheSB5b3UgaGF2ZSBhIHBhY2thZ2UgZGlyZWN0b3J5IGxpa2UgdGhpczoKLVxiZWdpbnt2ZXJiYXRpbX0KLXBrZy8KLXBrZy9fX2luaXRfXy5weQotcGtnL21haW4ucHkKLXBrZy9zdHJpbmcucHkKLVxlbmR7dmVyYmF0aW19Ci0KLVRoaXMgZGVmaW5lcyBhIHBhY2thZ2UgbmFtZWQgXG1vZHVsZXtwa2d9IGNvbnRhaW5pbmcgdGhlCi1cbW9kdWxle3BrZy5tYWlufSBhbmQgXG1vZHVsZXtwa2cuc3RyaW5nfSBzdWJtb2R1bGVzLiAgCi0KLUNvbnNpZGVyIHRoZSBjb2RlIGluIHRoZSBcZmlsZXttYWluLnB5fSBtb2R1bGUuICBXaGF0IGhhcHBlbnMgaWYgaXQKLWV4ZWN1dGVzIHRoZSBzdGF0ZW1lbnQgXGNvZGV7aW1wb3J0IHN0cmluZ30/ICBJbiBQeXRob24gMi40IGFuZAotZWFybGllciwgaXQgd2lsbCBmaXJzdCBsb29rIGluIHRoZSBwYWNrYWdlJ3MgZGlyZWN0b3J5IHRvIHBlcmZvcm0gYQotcmVsYXRpdmUgaW1wb3J0LCBmaW5kcyBcZmlsZXtwa2cvc3RyaW5nLnB5fSwgaW1wb3J0cyB0aGUgY29udGVudHMgb2YKLXRoYXQgZmlsZSBhcyB0aGUgXG1vZHVsZXtwa2cuc3RyaW5nfSBtb2R1bGUsIGFuZCB0aGF0IG1vZHVsZSBpcyBib3VuZAotdG8gdGhlIG5hbWUgXHNhbXB7c3RyaW5nfSBpbiB0aGUgXG1vZHVsZXtwa2cubWFpbn0gbW9kdWxlJ3MgbmFtZXNwYWNlLgotCi1UaGF0J3MgZmluZSBpZiBcbW9kdWxle3BrZy5zdHJpbmd9IHdhcyB3aGF0IHlvdSB3YW50ZWQuICBCdXQgd2hhdCBpZgoteW91IHdhbnRlZCBQeXRob24ncyBzdGFuZGFyZCBcbW9kdWxle3N0cmluZ30gbW9kdWxlPyAgVGhlcmUncyBubyBjbGVhbgotd2F5IHRvIGlnbm9yZSBcbW9kdWxle3BrZy5zdHJpbmd9IGFuZCBsb29rIGZvciB0aGUgc3RhbmRhcmQgbW9kdWxlOwotZ2VuZXJhbGx5IHlvdSBoYWQgdG8gbG9vayBhdCB0aGUgY29udGVudHMgb2YgXGNvZGV7c3lzLm1vZHVsZXN9LCB3aGljaAotaXMgc2xpZ2h0bHkgdW5jbGVhbi4gICAKLUhvbGdlciBLcmVrZWwncyBcbW9kdWxle3B5LnN0ZH0gcGFja2FnZSBwcm92aWRlcyBhIHRpZGllciB3YXkgdG8gcGVyZm9ybQotaW1wb3J0cyBmcm9tIHRoZSBzdGFuZGFyZCBsaWJyYXJ5LCBcY29kZXtpbXBvcnQgcHkgOyBweS5zdGQuc3RyaW5nLmpvaW4oKX0sCi1idXQgdGhhdCBwYWNrYWdlIGlzbid0IGF2YWlsYWJsZSBvbiBhbGwgUHl0aG9uIGluc3RhbGxhdGlvbnMuCi0KLVJlYWRpbmcgY29kZSB3aGljaCByZWxpZXMgb24gcmVsYXRpdmUgaW1wb3J0cyBpcyBhbHNvIGxlc3MgY2xlYXIsCi1iZWNhdXNlIGEgcmVhZGVyIG1heSBiZSBjb25mdXNlZCBhYm91dCB3aGljaCBtb2R1bGUsIFxtb2R1bGV7c3RyaW5nfQotb3IgXG1vZHVsZXtwa2cuc3RyaW5nfSwgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZC4gIFB5dGhvbiB1c2VycyBzb29uCi1sZWFybmVkIG5vdCB0byBkdXBsaWNhdGUgdGhlIG5hbWVzIG9mIHN0YW5kYXJkIGxpYnJhcnkgbW9kdWxlcyBpbiB0aGUKLW5hbWVzIG9mIHRoZWlyIHBhY2thZ2VzJyBzdWJtb2R1bGVzLCBidXQgeW91IGNhbid0IHByb3RlY3QgYWdhaW5zdAotaGF2aW5nIHlvdXIgc3VibW9kdWxlJ3MgbmFtZSBiZWluZyB1c2VkIGZvciBhIG5ldyBtb2R1bGUgYWRkZWQgaW4gYQotZnV0dXJlIHZlcnNpb24gb2YgUHl0aG9uLgotCi1JbiBQeXRob24gMi41LCB5b3UgY2FuIHN3aXRjaCBca2V5d29yZHtpbXBvcnR9J3MgYmVoYXZpb3VyIHRvIAotYWJzb2x1dGUgaW1wb3J0cyB1c2luZyBhIFxjb2Rle2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0fQotZGlyZWN0aXZlLiAgVGhpcyBhYnNvbHV0ZS1pbXBvcnQgYmVoYXZpb3VyIHdpbGwgYmVjb21lIHRoZSBkZWZhdWx0IGluCi1hIGZ1dHVyZSB2ZXJzaW9uIChwcm9iYWJseSBQeXRob24gMi43KS4gIE9uY2UgYWJzb2x1dGUgaW1wb3J0cyAKLWFyZSB0aGUgZGVmYXVsdCwgXGNvZGV7aW1wb3J0IHN0cmluZ30gd2lsbAotYWx3YXlzIGZpbmQgdGhlIHN0YW5kYXJkIGxpYnJhcnkncyB2ZXJzaW9uLgotSXQncyBzdWdnZXN0ZWQgdGhhdCB1c2VycyBzaG91bGQgYmVnaW4gdXNpbmcgYWJzb2x1dGUgaW1wb3J0cyBhcyBtdWNoCi1hcyBwb3NzaWJsZSwgc28gaXQncyBwcmVmZXJhYmxlIHRvIGJlZ2luIHdyaXRpbmcgXGNvZGV7ZnJvbSBwa2cgaW1wb3J0Ci1zdHJpbmd9IGluIHlvdXIgY29kZS4gIAotCi1SZWxhdGl2ZSBpbXBvcnRzIGFyZSBzdGlsbCBwb3NzaWJsZSBieSBhZGRpbmcgYSBsZWFkaW5nIHBlcmlvZCAKLXRvIHRoZSBtb2R1bGUgbmFtZSB3aGVuIHVzaW5nIHRoZSBcY29kZXtmcm9tIC4uLiBpbXBvcnR9IGZvcm06Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLSMgSW1wb3J0IG5hbWVzIGZyb20gcGtnLnN0cmluZwotZnJvbSAuc3RyaW5nIGltcG9ydCBuYW1lMSwgbmFtZTIKLSMgSW1wb3J0IHBrZy5zdHJpbmcKLWZyb20gLiBpbXBvcnQgc3RyaW5nCi1cZW5ke3ZlcmJhdGltfQotCi1UaGlzIGltcG9ydHMgdGhlIFxtb2R1bGV7c3RyaW5nfSBtb2R1bGUgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQKLXBhY2thZ2UsIHNvIGluIFxtb2R1bGV7cGtnLm1haW59IHRoaXMgd2lsbCBpbXBvcnQgXHZhcntuYW1lMX0gYW5kCi1cdmFye25hbWUyfSBmcm9tIFxtb2R1bGV7cGtnLnN0cmluZ30uICBBZGRpdGlvbmFsIGxlYWRpbmcgcGVyaW9kcwotcGVyZm9ybSB0aGUgcmVsYXRpdmUgaW1wb3J0IHN0YXJ0aW5nIGZyb20gdGhlIHBhcmVudCBvZiB0aGUgY3VycmVudAotcGFja2FnZS4gIEZvciBleGFtcGxlLCBjb2RlIGluIHRoZSBcbW9kdWxle0EuQi5DfSBtb2R1bGUgY2FuIGRvOgotCi1cYmVnaW57dmVyYmF0aW19Ci1mcm9tIC4gaW1wb3J0IEQgICAgICAgICAgICAgICAgICMgSW1wb3J0cyBBLkIuRAotZnJvbSAuLiBpbXBvcnQgRSAgICAgICAgICAgICAgICAjIEltcG9ydHMgQS5FCi1mcm9tIC4uRiBpbXBvcnQgRyAgICAgICAgICAgICAgICMgSW1wb3J0cyBBLkYuRwotXGVuZHt2ZXJiYXRpbX0KLQotTGVhZGluZyBwZXJpb2RzIGNhbm5vdCBiZSB1c2VkIHdpdGggdGhlIFxjb2Rle2ltcG9ydCBcdmFye21vZG5hbWV9fSAKLWZvcm0gb2YgdGhlIGltcG9ydCBzdGF0ZW1lbnQsIG9ubHkgdGhlIFxjb2Rle2Zyb20gLi4uIGltcG9ydH0gZm9ybS4KLQotXGJlZ2lue3NlZWFsc299Ci0KLVxzZWVwZXB7MzI4fXtJbXBvcnRzOiBNdWx0aS1MaW5lIGFuZCBBYnNvbHV0ZS9SZWxhdGl2ZX0KLXtQRVAgd3JpdHRlbiBieSBBYWh6OyBpbXBsZW1lbnRlZCBieSBUaG9tYXMgV291dGVycy59Ci0KLVxzZWV1cmx7aHR0cDovL2NvZGVzcGVhay5uZXQvcHkvY3VycmVudC9kb2MvaW5kZXguaHRtbH0KLXtUaGUgcHkgbGlicmFyeSBieSBIb2xnZXIgS3Jla2VsLCB3aGljaCBjb250YWlucyB0aGUgXG1vZHVsZXtweS5zdGR9IHBhY2thZ2UufQotCi1cZW5ke3NlZWFsc299Ci0KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue1BFUCAzMzg6IEV4ZWN1dGluZyBNb2R1bGVzIGFzIFNjcmlwdHNcbGFiZWx7cGVwLTMzOH19Ci0KLVRoZSBccHJvZ3JhbW9wdHstbX0gc3dpdGNoIGFkZGVkIGluIFB5dGhvbiAyLjQgdG8gZXhlY3V0ZSBhIG1vZHVsZSBhcwotYSBzY3JpcHQgZ2FpbmVkIGEgZmV3IG1vcmUgYWJpbGl0aWVzLiAgSW5zdGVhZCBvZiBiZWluZyBpbXBsZW1lbnRlZCBpbgotQyBjb2RlIGluc2lkZSB0aGUgUHl0aG9uIGludGVycHJldGVyLCB0aGUgc3dpdGNoIG5vdyB1c2VzIGFuCi1pbXBsZW1lbnRhdGlvbiBpbiBhIG5ldyBtb2R1bGUsIFxtb2R1bGV7cnVucHl9LgotCi1UaGUgXG1vZHVsZXtydW5weX0gbW9kdWxlIGltcGxlbWVudHMgYSBtb3JlIHNvcGhpc3RpY2F0ZWQgaW1wb3J0Ci1tZWNoYW5pc20gc28gdGhhdCBpdCdzIG5vdyBwb3NzaWJsZSB0byBydW4gbW9kdWxlcyBpbiBhIHBhY2thZ2Ugc3VjaAotYXMgXG1vZHVsZXtweWNoZWNrZXIuY2hlY2tlcn0uICBUaGUgbW9kdWxlIGFsc28gc3VwcG9ydHMgYWx0ZXJuYXRpdmUKLWltcG9ydCBtZWNoYW5pc21zIHN1Y2ggYXMgdGhlIFxtb2R1bGV7emlwaW1wb3J0fSBtb2R1bGUuICBUaGlzIG1lYW5zCi15b3UgY2FuIGFkZCBhIC56aXAgYXJjaGl2ZSdzIHBhdGggdG8gXGNvZGV7c3lzLnBhdGh9IGFuZCB0aGVuIHVzZSB0aGUKLVxwcm9ncmFtb3B0ey1tfSBzd2l0Y2ggdG8gZXhlY3V0ZSBjb2RlIGZyb20gdGhlIGFyY2hpdmUuCi0KLQotXGJlZ2lue3NlZWFsc299Ci0KLVxzZWVwZXB7MzM4fXtFeGVjdXRpbmcgbW9kdWxlcyBhcyBzY3JpcHRzfXtQRVAgd3JpdHRlbiBhbmQgCi1pbXBsZW1lbnRlZCBieSBOaWNrIENvZ2hsYW4ufQotCi1cZW5ke3NlZWFsc299Ci0KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue1BFUCAzNDE6IFVuaWZpZWQgdHJ5L2V4Y2VwdC9maW5hbGx5XGxhYmVse3BlcC0zNDF9fQotCi1VbnRpbCBQeXRob24gMi41LCB0aGUgXGtleXdvcmR7dHJ5fSBzdGF0ZW1lbnQgY2FtZSBpbiB0d28KLWZsYXZvdXJzLiBZb3UgY291bGQgdXNlIGEgXGtleXdvcmR7ZmluYWxseX0gYmxvY2sgdG8gZW5zdXJlIHRoYXQgY29kZQotaXMgYWx3YXlzIGV4ZWN1dGVkLCBvciBvbmUgb3IgbW9yZSBca2V5d29yZHtleGNlcHR9IGJsb2NrcyB0byBjYXRjaCAKLXNwZWNpZmljIGV4Y2VwdGlvbnMuICBZb3UgY291bGRuJ3QgY29tYmluZSBib3RoIFxrZXl3b3Jke2V4Y2VwdH0gYmxvY2tzIGFuZCBhCi1ca2V5d29yZHtmaW5hbGx5fSBibG9jaywgYmVjYXVzZSBnZW5lcmF0aW5nIHRoZSByaWdodCBieXRlY29kZSBmb3IgdGhlCi1jb21iaW5lZCB2ZXJzaW9uIHdhcyBjb21wbGljYXRlZCBhbmQgaXQgd2Fzbid0IGNsZWFyIHdoYXQgdGhlCi1zZW1hbnRpY3Mgb2YgdGhlIGNvbWJpbmVkIHN0YXRlbWVudCBzaG91bGQgYmUuICAKLQotR3VpZG8gdmFuflJvc3N1bSBzcGVudCBzb21lIHRpbWUgd29ya2luZyB3aXRoIEphdmEsIHdoaWNoIGRvZXMgc3VwcG9ydCB0aGUKLWVxdWl2YWxlbnQgb2YgY29tYmluaW5nIFxrZXl3b3Jke2V4Y2VwdH0gYmxvY2tzIGFuZCBhCi1ca2V5d29yZHtmaW5hbGx5fSBibG9jaywgYW5kIHRoaXMgY2xhcmlmaWVkIHdoYXQgdGhlIHN0YXRlbWVudCBzaG91bGQKLW1lYW4uICBJbiBQeXRob24gMi41LCB5b3UgY2FuIG5vdyB3cml0ZToKLQotXGJlZ2lue3ZlcmJhdGltfQotdHJ5OgotICAgIGJsb2NrLTEgLi4uCi1leGNlcHQgRXhjZXB0aW9uMToKLSAgICBoYW5kbGVyLTEgLi4uCi1leGNlcHQgRXhjZXB0aW9uMjoKLSAgICBoYW5kbGVyLTIgLi4uCi1lbHNlOgotICAgIGVsc2UtYmxvY2sKLWZpbmFsbHk6Ci0gICAgZmluYWwtYmxvY2sgCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgY29kZSBpbiBcdmFye2Jsb2NrLTF9IGlzIGV4ZWN1dGVkLiAgSWYgdGhlIGNvZGUgcmFpc2VzIGFuCi1leGNlcHRpb24sIHRoZSB2YXJpb3VzIFxrZXl3b3Jke2V4Y2VwdH0gYmxvY2tzIGFyZSB0ZXN0ZWQ6IGlmIHRoZQotZXhjZXB0aW9uIGlzIG9mIGNsYXNzIFxjbGFzc3tFeGNlcHRpb24xfSwgXHZhcntoYW5kbGVyLTF9IGlzIGV4ZWN1dGVkOwotb3RoZXJ3aXNlIGlmIGl0J3Mgb2YgY2xhc3MgXGNsYXNze0V4Y2VwdGlvbjJ9LCBcdmFye2hhbmRsZXItMn0gaXMKLWV4ZWN1dGVkLCBhbmQgc28gZm9ydGguICBJZiBubyBleGNlcHRpb24gaXMgcmFpc2VkLCB0aGUKLVx2YXJ7ZWxzZS1ibG9ja30gaXMgZXhlY3V0ZWQuICAKLQotTm8gbWF0dGVyIHdoYXQgaGFwcGVuZWQgcHJldmlvdXNseSwgdGhlIFx2YXJ7ZmluYWwtYmxvY2t9IGlzIGV4ZWN1dGVkCi1vbmNlIHRoZSBjb2RlIGJsb2NrIGlzIGNvbXBsZXRlIGFuZCBhbnkgcmFpc2VkIGV4Y2VwdGlvbnMgaGFuZGxlZC4KLUV2ZW4gaWYgdGhlcmUncyBhbiBlcnJvciBpbiBhbiBleGNlcHRpb24gaGFuZGxlciBvciB0aGUKLVx2YXJ7ZWxzZS1ibG9ja30gYW5kIGEgbmV3IGV4Y2VwdGlvbiBpcyByYWlzZWQsIHRoZQotY29kZSBpbiB0aGUgXHZhcntmaW5hbC1ibG9ja30gaXMgc3RpbGwgcnVuLgotCi1cYmVnaW57c2VlYWxzb30KLQotXHNlZXBlcHszNDF9e1VuaWZ5aW5nIHRyeS1leGNlcHQgYW5kIHRyeS1maW5hbGx5fXtQRVAgd3JpdHRlbiBieSBHZW9yZyBCcmFuZGw7IAotaW1wbGVtZW50YXRpb24gYnkgVGhvbWFzIExlZS59Ci0KLVxlbmR7c2VlYWxzb30KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257UEVQIDM0MjogTmV3IEdlbmVyYXRvciBGZWF0dXJlc1xsYWJlbHtwZXAtMzQyfX0KLQotUHl0aG9uIDIuNSBhZGRzIGEgc2ltcGxlIHdheSB0byBwYXNzIHZhbHVlcyBcZW1waHtpbnRvfSBhIGdlbmVyYXRvci4KLUFzIGludHJvZHVjZWQgaW4gUHl0aG9uIDIuMywgZ2VuZXJhdG9ycyBvbmx5IHByb2R1Y2Ugb3V0cHV0OyBvbmNlIGEKLWdlbmVyYXRvcidzIGNvZGUgd2FzIGludm9rZWQgdG8gY3JlYXRlIGFuIGl0ZXJhdG9yLCB0aGVyZSB3YXMgbm8gd2F5IHRvCi1wYXNzIGFueSBuZXcgaW5mb3JtYXRpb24gaW50byB0aGUgZnVuY3Rpb24gd2hlbiBpdHMgZXhlY3V0aW9uIGlzCi1yZXN1bWVkLiAgU29tZXRpbWVzIHRoZSBhYmlsaXR5IHRvIHBhc3MgaW4gc29tZSBpbmZvcm1hdGlvbiB3b3VsZCBiZQotdXNlZnVsLiAgSGFja2lzaCBzb2x1dGlvbnMgdG8gdGhpcyBpbmNsdWRlIG1ha2luZyB0aGUgZ2VuZXJhdG9yJ3MgY29kZQotbG9vayBhdCBhIGdsb2JhbCB2YXJpYWJsZSBhbmQgdGhlbiBjaGFuZ2luZyB0aGUgZ2xvYmFsIHZhcmlhYmxlJ3MKLXZhbHVlLCBvciBwYXNzaW5nIGluIHNvbWUgbXV0YWJsZSBvYmplY3QgdGhhdCBjYWxsZXJzIHRoZW4gbW9kaWZ5LgotCi1UbyByZWZyZXNoIHlvdXIgbWVtb3J5IG9mIGJhc2ljIGdlbmVyYXRvcnMsIGhlcmUncyBhIHNpbXBsZSBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1kZWYgY291bnRlciAobWF4aW11bSk6Ci0gICAgaSA9IDAKLSAgICB3aGlsZSBpIDwgbWF4aW11bToKLSAgICAgICAgeWllbGQgaQotICAgICAgICBpICs9IDEKLVxlbmR7dmVyYmF0aW19Ci0KLVdoZW4geW91IGNhbGwgXGNvZGV7Y291bnRlcigxMCl9LCB0aGUgcmVzdWx0IGlzIGFuIGl0ZXJhdG9yIHRoYXQKLXJldHVybnMgdGhlIHZhbHVlcyBmcm9tIDAgdXAgdG8gOS4gIE9uIGVuY291bnRlcmluZyB0aGUKLVxrZXl3b3Jke3lpZWxkfSBzdGF0ZW1lbnQsIHRoZSBpdGVyYXRvciByZXR1cm5zIHRoZSBwcm92aWRlZCB2YWx1ZSBhbmQKLXN1c3BlbmRzIHRoZSBmdW5jdGlvbidzIGV4ZWN1dGlvbiwgcHJlc2VydmluZyB0aGUgbG9jYWwgdmFyaWFibGVzLgotRXhlY3V0aW9uIHJlc3VtZXMgb24gdGhlIGZvbGxvd2luZyBjYWxsIHRvIHRoZSBpdGVyYXRvcidzIAotXG1ldGhvZHtuZXh0KCl9IG1ldGhvZCwgcGlja2luZyB1cCBhZnRlciB0aGUgXGtleXdvcmR7eWllbGR9IHN0YXRlbWVudC4KLQotSW4gUHl0aG9uIDIuMywgXGtleXdvcmR7eWllbGR9IHdhcyBhIHN0YXRlbWVudDsgaXQgZGlkbid0IHJldHVybiBhbnkKLXZhbHVlLiAgSW4gMi41LCBca2V5d29yZHt5aWVsZH0gaXMgbm93IGFuIGV4cHJlc3Npb24sIHJldHVybmluZyBhCi12YWx1ZSB0aGF0IGNhbiBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9yIG90aGVyd2lzZSBvcGVyYXRlZCBvbjoKLQotXGJlZ2lue3ZlcmJhdGltfQotdmFsID0gKHlpZWxkIGkpCi1cZW5ke3ZlcmJhdGltfQotCi1JIHJlY29tbWVuZCB0aGF0IHlvdSBhbHdheXMgcHV0IHBhcmVudGhlc2VzIGFyb3VuZCBhIFxrZXl3b3Jke3lpZWxkfQotZXhwcmVzc2lvbiB3aGVuIHlvdSdyZSBkb2luZyBzb21ldGhpbmcgd2l0aCB0aGUgcmV0dXJuZWQgdmFsdWUsIGFzIGluCi10aGUgYWJvdmUgZXhhbXBsZS4gIFRoZSBwYXJlbnRoZXNlcyBhcmVuJ3QgYWx3YXlzIG5lY2Vzc2FyeSwgYnV0IGl0J3MKLWVhc2llciB0byBhbHdheXMgYWRkIHRoZW0gaW5zdGVhZCBvZiBoYXZpbmcgdG8gcmVtZW1iZXIgd2hlbiB0aGV5J3JlCi1uZWVkZWQuCi0KLShccGVwezM0Mn0gZXhwbGFpbnMgdGhlIGV4YWN0IHJ1bGVzLCB3aGljaCBhcmUgdGhhdCBhCi1ca2V5d29yZHt5aWVsZH0tZXhwcmVzc2lvbiBtdXN0IGFsd2F5cyBiZSBwYXJlbnRoZXNpemVkIGV4Y2VwdCB3aGVuIGl0Ci1vY2N1cnMgYXQgdGhlIHRvcC1sZXZlbCBleHByZXNzaW9uIG9uIHRoZSByaWdodC1oYW5kIHNpZGUgb2YgYW4KLWFzc2lnbm1lbnQuICBUaGlzIG1lYW5zIHlvdSBjYW4gd3JpdGUgXGNvZGV7dmFsID0geWllbGQgaX0gYnV0IGhhdmUgdG8KLXVzZSBwYXJlbnRoZXNlcyB3aGVuIHRoZXJlJ3MgYW4gb3BlcmF0aW9uLCBhcyBpbiBcY29kZXt2YWwgPSAoeWllbGQgaSkKLSsgMTJ9LikKLQotVmFsdWVzIGFyZSBzZW50IGludG8gYSBnZW5lcmF0b3IgYnkgY2FsbGluZyBpdHMKLVxtZXRob2R7c2VuZChcdmFye3ZhbHVlfSl9IG1ldGhvZC4gIFRoZSBnZW5lcmF0b3IncyBjb2RlIGlzIHRoZW4KLXJlc3VtZWQgYW5kIHRoZSBca2V5d29yZHt5aWVsZH0gZXhwcmVzc2lvbiByZXR1cm5zIHRoZSBzcGVjaWZpZWQKLVx2YXJ7dmFsdWV9LiAgSWYgdGhlIHJlZ3VsYXIgXG1ldGhvZHtuZXh0KCl9IG1ldGhvZCBpcyBjYWxsZWQsIHRoZQotXGtleXdvcmR7eWllbGR9IHJldHVybnMgXGNvbnN0YW50e05vbmV9LgotCi1IZXJlJ3MgdGhlIHByZXZpb3VzIGV4YW1wbGUsIG1vZGlmaWVkIHRvIGFsbG93IGNoYW5naW5nIHRoZSB2YWx1ZSBvZgotdGhlIGludGVybmFsIGNvdW50ZXIuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLWRlZiBjb3VudGVyIChtYXhpbXVtKToKLSAgICBpID0gMAotICAgIHdoaWxlIGkgPCBtYXhpbXVtOgotICAgICAgICB2YWwgPSAoeWllbGQgaSkKLSAgICAgICAgIyBJZiB2YWx1ZSBwcm92aWRlZCwgY2hhbmdlIGNvdW50ZXIKLSAgICAgICAgaWYgdmFsIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgaSA9IHZhbAotICAgICAgICBlbHNlOgotICAgICAgICAgICAgaSArPSAxCi1cZW5ke3ZlcmJhdGltfQotCi1BbmQgaGVyZSdzIGFuIGV4YW1wbGUgb2YgY2hhbmdpbmcgdGhlIGNvdW50ZXI6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBpdCA9IGNvdW50ZXIoMTApCi0+Pj4gcHJpbnQgaXQubmV4dCgpCi0wCi0+Pj4gcHJpbnQgaXQubmV4dCgpCi0xCi0+Pj4gcHJpbnQgaXQuc2VuZCg4KQotOAotPj4+IHByaW50IGl0Lm5leHQoKQotOQotPj4+IHByaW50IGl0Lm5leHQoKQotVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICBGaWxlIGBgdC5weScnLCBsaW5lIDE1LCBpbiA/Ci0gICAgcHJpbnQgaXQubmV4dCgpCi1TdG9wSXRlcmF0aW9uCi1cZW5ke3ZlcmJhdGltfQotCi1ca2V5d29yZHt5aWVsZH0gd2lsbCB1c3VhbGx5IHJldHVybiBcY29uc3RhbnR7Tm9uZX0sIHNvIHlvdQotc2hvdWxkIGFsd2F5cyBjaGVjayBmb3IgdGhpcyBjYXNlLiAgRG9uJ3QganVzdCB1c2UgaXRzIHZhbHVlIGluCi1leHByZXNzaW9ucyB1bmxlc3MgeW91J3JlIHN1cmUgdGhhdCB0aGUgXG1ldGhvZHtzZW5kKCl9IG1ldGhvZAotd2lsbCBiZSB0aGUgb25seSBtZXRob2QgdXNlZCB0byByZXN1bWUgeW91ciBnZW5lcmF0b3IgZnVuY3Rpb24uCi0KLUluIGFkZGl0aW9uIHRvIFxtZXRob2R7c2VuZCgpfSwgdGhlcmUgYXJlIHR3byBvdGhlciBuZXcgbWV0aG9kcyBvbgotZ2VuZXJhdG9yczoKLQotXGJlZ2lue2l0ZW1pemV9Ci0KLSAgXGl0ZW0gXG1ldGhvZHt0aHJvdyhcdmFye3R5cGV9LCBcdmFye3ZhbHVlfT1Ob25lLAotICBcdmFye3RyYWNlYmFja309Tm9uZSl9IGlzIHVzZWQgdG8gcmFpc2UgYW4gZXhjZXB0aW9uIGluc2lkZSB0aGUKLSAgZ2VuZXJhdG9yOyB0aGUgZXhjZXB0aW9uIGlzIHJhaXNlZCBieSB0aGUgXGtleXdvcmR7eWllbGR9IGV4cHJlc3Npb24KLSAgd2hlcmUgdGhlIGdlbmVyYXRvcidzIGV4ZWN1dGlvbiBpcyBwYXVzZWQuCi0KLSAgXGl0ZW0gXG1ldGhvZHtjbG9zZSgpfSByYWlzZXMgYSBuZXcgXGV4Y2VwdGlvbntHZW5lcmF0b3JFeGl0fQotICBleGNlcHRpb24gaW5zaWRlIHRoZSBnZW5lcmF0b3IgdG8gdGVybWluYXRlIHRoZSBpdGVyYXRpb24uICBPbgotICByZWNlaXZpbmcgdGhpcyBleGNlcHRpb24sIHRoZSBnZW5lcmF0b3IncyBjb2RlIG11c3QgZWl0aGVyIHJhaXNlCi0gIFxleGNlcHRpb257R2VuZXJhdG9yRXhpdH0gb3IgXGV4Y2VwdGlvbntTdG9wSXRlcmF0aW9ufS4gIENhdGNoaW5nCi0gIHRoZSBcZXhjZXB0aW9ue0dlbmVyYXRvckV4aXR9IGV4Y2VwdGlvbiBhbmQgcmV0dXJuaW5nIGEgdmFsdWUgaXMKLSAgaWxsZWdhbCBhbmQgd2lsbCB0cmlnZ2VyIGEgXGV4Y2VwdGlvbntSdW50aW1lRXJyb3J9OyBpZiB0aGUgZnVuY3Rpb24KLSAgcmFpc2VzIHNvbWUgb3RoZXIgZXhjZXB0aW9uLCB0aGF0IGV4Y2VwdGlvbiBpcyBwcm9wYWdhdGVkIHRvIHRoZQotICBjYWxsZXIuICBcbWV0aG9ke2Nsb3NlKCl9IHdpbGwgYWxzbyBiZSBjYWxsZWQgYnkgUHl0aG9uJ3MgZ2FyYmFnZQotICBjb2xsZWN0b3Igd2hlbiB0aGUgZ2VuZXJhdG9yIGlzIGdhcmJhZ2UtY29sbGVjdGVkLgotCi0gIElmIHlvdSBuZWVkIHRvIHJ1biBjbGVhbnVwIGNvZGUgd2hlbiBhIFxleGNlcHRpb257R2VuZXJhdG9yRXhpdH0gb2NjdXJzLAotICBJIHN1Z2dlc3QgdXNpbmcgYSBcY29kZXt0cnk6IC4uLiBmaW5hbGx5On0gc3VpdGUgaW5zdGVhZCBvZiAKLSAgY2F0Y2hpbmcgXGV4Y2VwdGlvbntHZW5lcmF0b3JFeGl0fS4KLQotXGVuZHtpdGVtaXplfQotCi1UaGUgY3VtdWxhdGl2ZSBlZmZlY3Qgb2YgdGhlc2UgY2hhbmdlcyBpcyB0byB0dXJuIGdlbmVyYXRvcnMgZnJvbQotb25lLXdheSBwcm9kdWNlcnMgb2YgaW5mb3JtYXRpb24gaW50byBib3RoIHByb2R1Y2VycyBhbmQgY29uc3VtZXJzLgotCi1HZW5lcmF0b3JzIGFsc28gYmVjb21lIFxlbXBoe2Nvcm91dGluZXN9LCBhIG1vcmUgZ2VuZXJhbGl6ZWQgZm9ybSBvZgotc3Vicm91dGluZXMuICBTdWJyb3V0aW5lcyBhcmUgZW50ZXJlZCBhdCBvbmUgcG9pbnQgYW5kIGV4aXRlZCBhdAotYW5vdGhlciBwb2ludCAodGhlIHRvcCBvZiB0aGUgZnVuY3Rpb24sIGFuZCBhIFxrZXl3b3Jke3JldHVybn0KLXN0YXRlbWVudCksIGJ1dCBjb3JvdXRpbmVzIGNhbiBiZSBlbnRlcmVkLCBleGl0ZWQsIGFuZCByZXN1bWVkIGF0Ci1tYW55IGRpZmZlcmVudCBwb2ludHMgKHRoZSBca2V5d29yZHt5aWVsZH0gc3RhdGVtZW50cykuICBXZSdsbCBoYXZlIHRvCi1maWd1cmUgb3V0IHBhdHRlcm5zIGZvciB1c2luZyBjb3JvdXRpbmVzIGVmZmVjdGl2ZWx5IGluIFB5dGhvbi4KLQotVGhlIGFkZGl0aW9uIG9mIHRoZSBcbWV0aG9ke2Nsb3NlKCl9IG1ldGhvZCBoYXMgb25lIHNpZGUgZWZmZWN0IHRoYXQKLWlzbid0IG9idmlvdXMuICBcbWV0aG9ke2Nsb3NlKCl9IGlzIGNhbGxlZCB3aGVuIGEgZ2VuZXJhdG9yIGlzCi1nYXJiYWdlLWNvbGxlY3RlZCwgc28gdGhpcyBtZWFucyB0aGUgZ2VuZXJhdG9yJ3MgY29kZSBnZXRzIG9uZSBsYXN0Ci1jaGFuY2UgdG8gcnVuIGJlZm9yZSB0aGUgZ2VuZXJhdG9yIGlzIGRlc3Ryb3llZC4gIFRoaXMgbGFzdCBjaGFuY2UKLW1lYW5zIHRoYXQgXGNvZGV7dHJ5Li4uZmluYWxseX0gc3RhdGVtZW50cyBpbiBnZW5lcmF0b3JzIGNhbiBub3cgYmUKLWd1YXJhbnRlZWQgdG8gd29yazsgdGhlIFxrZXl3b3Jke2ZpbmFsbHl9IGNsYXVzZSB3aWxsIG5vdyBhbHdheXMgZ2V0IGEKLWNoYW5jZSB0byBydW4uICBUaGUgc3ludGFjdGljIHJlc3RyaWN0aW9uIHRoYXQgeW91IGNvdWxkbid0IG1peAotXGtleXdvcmR7eWllbGR9IHN0YXRlbWVudHMgd2l0aCBhIFxjb2Rle3RyeS4uLmZpbmFsbHl9IHN1aXRlIGhhcwotdGhlcmVmb3JlIGJlZW4gcmVtb3ZlZC4gIFRoaXMgc2VlbXMgbGlrZSBhIG1pbm9yIGJpdCBvZiBsYW5ndWFnZQotdHJpdmlhLCBidXQgdXNpbmcgZ2VuZXJhdG9ycyBhbmQgXGNvZGV7dHJ5Li4uZmluYWxseX0gaXMgYWN0dWFsbHkKLW5lY2Vzc2FyeSBpbiBvcmRlciB0byBpbXBsZW1lbnQgdGhlICBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQKLWRlc2NyaWJlZCBieSBQRVAgMzQzLiAgSSdsbCBsb29rIGF0IHRoaXMgbmV3IHN0YXRlbWVudCBpbiB0aGUgZm9sbG93aW5nIAotc2VjdGlvbi4KLQotQW5vdGhlciBldmVuIG1vcmUgZXNvdGVyaWMgZWZmZWN0IG9mIHRoaXMgY2hhbmdlOiBwcmV2aW91c2x5LCB0aGUKLVxtZW1iZXJ7Z2lfZnJhbWV9IGF0dHJpYnV0ZSBvZiBhIGdlbmVyYXRvciB3YXMgYWx3YXlzIGEgZnJhbWUgb2JqZWN0LgotSXQncyBub3cgcG9zc2libGUgZm9yIFxtZW1iZXJ7Z2lfZnJhbWV9IHRvIGJlIFxjb2Rle05vbmV9Ci1vbmNlIHRoZSBnZW5lcmF0b3IgaGFzIGJlZW4gZXhoYXVzdGVkLgotCi1cYmVnaW57c2VlYWxzb30KLQotXHNlZXBlcHszNDJ9e0Nvcm91dGluZXMgdmlhIEVuaGFuY2VkIEdlbmVyYXRvcnN9e1BFUCB3cml0dGVuIGJ5IAotR3VpZG8gdmFuflJvc3N1bSBhbmQgUGhpbGxpcCBKLiBFYnk7Ci1pbXBsZW1lbnRlZCBieSBQaGlsbGlwIEouIEVieS4gIEluY2x1ZGVzIGV4YW1wbGVzIG9mIAotc29tZSBmYW5jaWVyIHVzZXMgb2YgZ2VuZXJhdG9ycyBhcyBjb3JvdXRpbmVzLgotCi1FYXJsaWVyIHZlcnNpb25zIG9mIHRoZXNlIGZlYXR1cmVzIHdlcmUgcHJvcG9zZWQgaW4gCi1ccGVwezI4OH0gYnkgUmF5bW9uZCBIZXR0aW5nZXIgYW5kIFxwZXB7MzI1fSBieSBTYW11ZWxlIFBlZHJvbmkuCi19Ci0KLVxzZWV1cmx7aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db3JvdXRpbmV9e1RoZSBXaWtpcGVkaWEgZW50cnkgZm9yIAotY29yb3V0aW5lcy59Ci0KLVxzZWV1cmx7aHR0cDovL3d3dy5zaWRoZS5vcmcvXH57fWRhbi9ibG9nL2FyY2hpdmVzLzAwMDE3OC5odG1sfXtBbgotZXhwbGFuYXRpb24gb2YgY29yb3V0aW5lcyBmcm9tIGEgUGVybCBwb2ludCBvZiB2aWV3LCB3cml0dGVuIGJ5IERhbgotU3VnYWxza2kufQotCi1cZW5ke3NlZWFsc299Ci0KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue1BFUCAzNDM6IFRoZSAnd2l0aCcgc3RhdGVtZW50XGxhYmVse3BlcC0zNDN9fQotCi1UaGUgJ1xrZXl3b3Jke3dpdGh9JyBzdGF0ZW1lbnQgY2xhcmlmaWVzIGNvZGUgdGhhdCBwcmV2aW91c2x5IHdvdWxkCi11c2UgXGNvZGV7dHJ5Li4uZmluYWxseX0gYmxvY2tzIHRvIGVuc3VyZSB0aGF0IGNsZWFuLXVwIGNvZGUgaXMKLWV4ZWN1dGVkLiAgSW4gdGhpcyBzZWN0aW9uLCBJJ2xsIGRpc2N1c3MgdGhlIHN0YXRlbWVudCBhcyBpdCB3aWxsCi1jb21tb25seSBiZSB1c2VkLiAgSW4gdGhlIG5leHQgc2VjdGlvbiwgSSdsbCBleGFtaW5lIHRoZQotaW1wbGVtZW50YXRpb24gZGV0YWlscyBhbmQgc2hvdyBob3cgdG8gd3JpdGUgb2JqZWN0cyBmb3IgdXNlIHdpdGggdGhpcwotc3RhdGVtZW50LgotCi1UaGUgJ1xrZXl3b3Jke3dpdGh9JyBzdGF0ZW1lbnQgaXMgYSBuZXcgY29udHJvbC1mbG93IHN0cnVjdHVyZSB3aG9zZQotYmFzaWMgc3RydWN0dXJlIGlzOgotCi1cYmVnaW57dmVyYmF0aW19Ci13aXRoIGV4cHJlc3Npb24gW2FzIHZhcmlhYmxlXToKLSAgICB3aXRoLWJsb2NrCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQsIGFuZCBpdCBzaG91bGQgcmVzdWx0IGluIGFuIG9iamVjdCB0aGF0Ci1zdXBwb3J0cyB0aGUgY29udGV4dCBtYW5hZ2VtZW50IHByb3RvY29sICh0aGF0IGlzLCBoYXMgXG1ldGhvZHtfX2VudGVyX18oKX0KLWFuZCBcbWV0aG9ke19fZXhpdF9fKCl9IG1ldGhvZHMuCi0KLVRoZSBvYmplY3QncyBcbWV0aG9ke19fZW50ZXJfXygpfSBpcyBjYWxsZWQgYmVmb3JlIFx2YXJ7d2l0aC1ibG9ja30gaXMKLWV4ZWN1dGVkIGFuZCB0aGVyZWZvcmUgY2FuIHJ1biBzZXQtdXAgY29kZS4gSXQgYWxzbyBtYXkgcmV0dXJuIGEgdmFsdWUKLXRoYXQgaXMgYm91bmQgdG8gdGhlIG5hbWUgXHZhcnt2YXJpYWJsZX0sIGlmIGdpdmVuLiAgKE5vdGUgY2FyZWZ1bGx5Ci10aGF0IFx2YXJ7dmFyaWFibGV9IGlzIFxlbXBoe25vdH0gYXNzaWduZWQgdGhlIHJlc3VsdCBvZiBcdmFye2V4cHJlc3Npb259LikKLQotQWZ0ZXIgZXhlY3V0aW9uIG9mIHRoZSBcdmFye3dpdGgtYmxvY2t9IGlzIGZpbmlzaGVkLCB0aGUgb2JqZWN0J3MKLVxtZXRob2R7X19leGl0X18oKX0gbWV0aG9kIGlzIGNhbGxlZCwgZXZlbiBpZiB0aGUgYmxvY2sgcmFpc2VkIGFuIGV4Y2VwdGlvbiwKLWFuZCBjYW4gdGhlcmVmb3JlIHJ1biBjbGVhbi11cCBjb2RlLgotCi1UbyBlbmFibGUgdGhlIHN0YXRlbWVudCBpbiBQeXRob24gMi41LCB5b3UgbmVlZCB0byBhZGQgdGhlIGZvbGxvd2luZwotZGlyZWN0aXZlIHRvIHlvdXIgbW9kdWxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1mcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50Ci1cZW5ke3ZlcmJhdGltfQotCi1UaGUgc3RhdGVtZW50IHdpbGwgYWx3YXlzIGJlIGVuYWJsZWQgaW4gUHl0aG9uIDIuNi4KLQotU29tZSBzdGFuZGFyZCBQeXRob24gb2JqZWN0cyBub3cgc3VwcG9ydCB0aGUgY29udGV4dCBtYW5hZ2VtZW50Ci1wcm90b2NvbCBhbmQgY2FuIGJlIHVzZWQgd2l0aCB0aGUgJ1xrZXl3b3Jke3dpdGh9JyBzdGF0ZW1lbnQuIEZpbGUKLW9iamVjdHMgYXJlIG9uZSBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci13aXRoIG9wZW4oJy9ldGMvcGFzc3dkJywgJ3InKSBhcyBmOgotICAgIGZvciBsaW5lIGluIGY6Ci0gICAgICAgIHByaW50IGxpbmUKLSAgICAgICAgLi4uIG1vcmUgcHJvY2Vzc2luZyBjb2RlIC4uLgotXGVuZHt2ZXJiYXRpbX0KLQotQWZ0ZXIgdGhpcyBzdGF0ZW1lbnQgaGFzIGV4ZWN1dGVkLCB0aGUgZmlsZSBvYmplY3QgaW4gXHZhcntmfSB3aWxsCi1oYXZlIGJlZW4gYXV0b21hdGljYWxseSBjbG9zZWQsIGV2ZW4gaWYgdGhlIFxrZXl3b3Jke2Zvcn0gbG9vcAotcmFpc2VkIGFuIGV4Y2VwdGlvbiBwYXJ0LXdheSB0aHJvdWdoIHRoZSBibG9jay4KLQotXG5vdGV7SW4gdGhpcyBjYXNlLCBcdmFye2Z9IGlzIHRoZSBzYW1lIG9iamVjdCBjcmVhdGVkIGJ5Ci0gICAgICBcZnVuY3Rpb257b3BlbigpfSwgYmVjYXVzZSBcbWV0aG9ke2ZpbGUuX19lbnRlcl9fKCl9IHJldHVybnMKLSAgICAgIFx2YXJ7c2VsZn0ufQotCi1UaGUgXG1vZHVsZXt0aHJlYWRpbmd9IG1vZHVsZSdzIGxvY2tzIGFuZCBjb25kaXRpb24gdmFyaWFibGVzIAotYWxzbyBzdXBwb3J0IHRoZSAnXGtleXdvcmR7d2l0aH0nIHN0YXRlbWVudDoKLQotXGJlZ2lue3ZlcmJhdGltfQotbG9jayA9IHRocmVhZGluZy5Mb2NrKCkKLXdpdGggbG9jazoKLSAgICAjIENyaXRpY2FsIHNlY3Rpb24gb2YgY29kZQotICAgIC4uLgotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGxvY2sgaXMgYWNxdWlyZWQgYmVmb3JlIHRoZSBibG9jayBpcyBleGVjdXRlZCBhbmQgYWx3YXlzIHJlbGVhc2VkIG9uY2UgCi10aGUgYmxvY2sgaXMgY29tcGxldGUuCi0KLVRoZSBuZXcgXGZ1bmN0aW9ue2xvY2FsY29udGV4dCgpfSBmdW5jdGlvbiBpbiB0aGUgXG1vZHVsZXtkZWNpbWFsfSBtb2R1bGUKLW1ha2VzIGl0IGVhc3kgdG8gc2F2ZSBhbmQgcmVzdG9yZSB0aGUgY3VycmVudCBkZWNpbWFsIGNvbnRleHQsIHdoaWNoCi1lbmNhcHN1bGF0ZXMgdGhlIGRlc2lyZWQgcHJlY2lzaW9uIGFuZCByb3VuZGluZyBjaGFyYWN0ZXJpc3RpY3MgZm9yCi1jb21wdXRhdGlvbnM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWZyb20gZGVjaW1hbCBpbXBvcnQgRGVjaW1hbCwgQ29udGV4dCwgbG9jYWxjb250ZXh0Ci0KLSMgRGlzcGxheXMgd2l0aCBkZWZhdWx0IHByZWNpc2lvbiBvZiAyOCBkaWdpdHMKLXYgPSBEZWNpbWFsKCc1NzgnKQotcHJpbnQgdi5zcXJ0KCkKLQotd2l0aCBsb2NhbGNvbnRleHQoQ29udGV4dChwcmVjPTE2KSk6Ci0gICAgIyBBbGwgY29kZSBpbiB0aGlzIGJsb2NrIHVzZXMgYSBwcmVjaXNpb24gb2YgMTYgZGlnaXRzLgotICAgICMgVGhlIG9yaWdpbmFsIGNvbnRleHQgaXMgcmVzdG9yZWQgb24gZXhpdGluZyB0aGUgYmxvY2suCi0gICAgcHJpbnQgdi5zcXJ0KCkKLVxlbmR7dmVyYmF0aW19Ci0KLVxzdWJzZWN0aW9ue1dyaXRpbmcgQ29udGV4dCBNYW5hZ2Vyc1xsYWJlbHtjb250ZXh0LW1hbmFnZXJzfX0KLQotVW5kZXIgdGhlIGhvb2QsIHRoZSAnXGtleXdvcmR7d2l0aH0nIHN0YXRlbWVudCBpcyBmYWlybHkgY29tcGxpY2F0ZWQuCi1Nb3N0IHBlb3BsZSB3aWxsIG9ubHkgdXNlICdca2V5d29yZHt3aXRofScgaW4gY29tcGFueSB3aXRoIGV4aXN0aW5nCi1vYmplY3RzIGFuZCBkb24ndCBuZWVkIHRvIGtub3cgdGhlc2UgZGV0YWlscywgc28geW91IGNhbiBza2lwIHRoZSByZXN0Ci1vZiB0aGlzIHNlY3Rpb24gaWYgeW91IGxpa2UuICBBdXRob3JzIG9mIG5ldyBvYmplY3RzIHdpbGwgbmVlZCB0bwotdW5kZXJzdGFuZCB0aGUgZGV0YWlscyBvZiB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBhbmQgc2hvdWxkCi1rZWVwIHJlYWRpbmcuCi0KLUEgaGlnaC1sZXZlbCBleHBsYW5hdGlvbiBvZiB0aGUgY29udGV4dCBtYW5hZ2VtZW50IHByb3RvY29sIGlzOgotCi1cYmVnaW57aXRlbWl6ZX0KLQotXGl0ZW0gVGhlIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkIGFuZCBzaG91bGQgcmVzdWx0IGluIGFuIG9iamVjdAotY2FsbGVkIGEgYGBjb250ZXh0IG1hbmFnZXInJy4gIFRoZSBjb250ZXh0IG1hbmFnZXIgbXVzdCBoYXZlCi1cbWV0aG9ke19fZW50ZXJfXygpfSBhbmQgXG1ldGhvZHtfX2V4aXRfXygpfSBtZXRob2RzLgotCi1caXRlbSBUaGUgY29udGV4dCBtYW5hZ2VyJ3MgXG1ldGhvZHtfX2VudGVyX18oKX0gbWV0aG9kIGlzIGNhbGxlZC4gIFRoZSB2YWx1ZQotcmV0dXJuZWQgaXMgYXNzaWduZWQgdG8gXHZhcntWQVJ9LiAgSWYgbm8gXGNvZGV7J2FzIFx2YXJ7VkFSfSd9IGNsYXVzZQotaXMgcHJlc2VudCwgdGhlIHZhbHVlIGlzIHNpbXBseSBkaXNjYXJkZWQuCi0KLVxpdGVtIFRoZSBjb2RlIGluIFx2YXJ7QkxPQ0t9IGlzIGV4ZWN1dGVkLgotCi1caXRlbSBJZiBcdmFye0JMT0NLfSByYWlzZXMgYW4gZXhjZXB0aW9uLCB0aGUKLVxtZXRob2R7X19leGl0X18oXHZhcnt0eXBlfSwgXHZhcnt2YWx1ZX0sIFx2YXJ7dHJhY2ViYWNrfSl9IGlzIGNhbGxlZAotd2l0aCB0aGUgZXhjZXB0aW9uIGRldGFpbHMsIHRoZSBzYW1lIHZhbHVlcyByZXR1cm5lZCBieQotXGZ1bmN0aW9ue3N5cy5leGNfaW5mbygpfS4gIFRoZSBtZXRob2QncyByZXR1cm4gdmFsdWUgY29udHJvbHMgd2hldGhlcgotdGhlIGV4Y2VwdGlvbiBpcyByZS1yYWlzZWQ6IGFueSBmYWxzZSB2YWx1ZSByZS1yYWlzZXMgdGhlIGV4Y2VwdGlvbiwKLWFuZCBcY29kZXtUcnVlfSB3aWxsIHJlc3VsdCBpbiBzdXBwcmVzc2luZyBpdC4gIFlvdSdsbCBvbmx5IHJhcmVseQotd2FudCB0byBzdXBwcmVzcyB0aGUgZXhjZXB0aW9uLCBiZWNhdXNlIGlmIHlvdSBkbwotdGhlIGF1dGhvciBvZiB0aGUgY29kZSBjb250YWluaW5nIHRoZQotJ1xrZXl3b3Jke3dpdGh9JyBzdGF0ZW1lbnQgd2lsbCBuZXZlciByZWFsaXplIGFueXRoaW5nIHdlbnQgd3JvbmcuCi0KLVxpdGVtIElmIFx2YXJ7QkxPQ0t9IGRpZG4ndCByYWlzZSBhbiBleGNlcHRpb24sIAotdGhlIFxtZXRob2R7X19leGl0X18oKX0gbWV0aG9kIGlzIHN0aWxsIGNhbGxlZCwKLWJ1dCBcdmFye3R5cGV9LCBcdmFye3ZhbHVlfSwgYW5kIFx2YXJ7dHJhY2ViYWNrfSBhcmUgYWxsIFxjb2Rle05vbmV9LgotCi1cZW5ke2l0ZW1pemV9Ci0KLUxldCdzIHRoaW5rIHRocm91Z2ggYW4gZXhhbXBsZS4gIEkgd29uJ3QgcHJlc2VudCBkZXRhaWxlZCBjb2RlIGJ1dAotd2lsbCBvbmx5IHNrZXRjaCB0aGUgbWV0aG9kcyBuZWNlc3NhcnkgZm9yIGEgZGF0YWJhc2UgdGhhdCBzdXBwb3J0cwotdHJhbnNhY3Rpb25zLgotCi0oRm9yIHBlb3BsZSB1bmZhbWlsaWFyIHdpdGggZGF0YWJhc2UgdGVybWlub2xvZ3k6IGEgc2V0IG9mIGNoYW5nZXMgdG8KLXRoZSBkYXRhYmFzZSBhcmUgZ3JvdXBlZCBpbnRvIGEgdHJhbnNhY3Rpb24uICBUcmFuc2FjdGlvbnMgY2FuIGJlCi1laXRoZXIgY29tbWl0dGVkLCBtZWFuaW5nIHRoYXQgYWxsIHRoZSBjaGFuZ2VzIGFyZSB3cml0dGVuIGludG8gdGhlCi1kYXRhYmFzZSwgb3Igcm9sbGVkIGJhY2ssIG1lYW5pbmcgdGhhdCB0aGUgY2hhbmdlcyBhcmUgYWxsIGRpc2NhcmRlZAotYW5kIHRoZSBkYXRhYmFzZSBpcyB1bmNoYW5nZWQuICBTZWUgYW55IGRhdGFiYXNlIHRleHRib29rIGZvciBtb3JlCi1pbmZvcm1hdGlvbi4pCi0KLUxldCdzIGFzc3VtZSB0aGVyZSdzIGFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBkYXRhYmFzZSBjb25uZWN0aW9uLgotT3VyIGdvYWwgd2lsbCBiZSB0byBsZXQgdGhlIHVzZXIgd3JpdGUgY29kZSBsaWtlIHRoaXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWRiX2Nvbm5lY3Rpb24gPSBEYXRhYmFzZUNvbm5lY3Rpb24oKQotd2l0aCBkYl9jb25uZWN0aW9uIGFzIGN1cnNvcjoKLSAgICBjdXJzb3IuZXhlY3V0ZSgnaW5zZXJ0IGludG8gLi4uJykKLSAgICBjdXJzb3IuZXhlY3V0ZSgnZGVsZXRlIGZyb20gLi4uJykKLSAgICAjIC4uLiBtb3JlIG9wZXJhdGlvbnMgLi4uCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIGNvbW1pdHRlZCBpZiB0aGUgY29kZSBpbiB0aGUgYmxvY2sKLXJ1bnMgZmxhd2xlc3NseSBvciByb2xsZWQgYmFjayBpZiB0aGVyZSdzIGFuIGV4Y2VwdGlvbi4KLUhlcmUncyB0aGUgYmFzaWMgaW50ZXJmYWNlCi1mb3IgXGNsYXNze0RhdGFiYXNlQ29ubmVjdGlvbn0gdGhhdCBJJ2xsIGFzc3VtZToKLQotXGJlZ2lue3ZlcmJhdGltfQotY2xhc3MgRGF0YWJhc2VDb25uZWN0aW9uOgotICAgICMgRGF0YWJhc2UgaW50ZXJmYWNlCi0gICAgZGVmIGN1cnNvciAoc2VsZik6Ci0gICAgICAgICJSZXR1cm5zIGEgY3Vyc29yIG9iamVjdCBhbmQgc3RhcnRzIGEgbmV3IHRyYW5zYWN0aW9uIgotICAgIGRlZiBjb21taXQgKHNlbGYpOgotICAgICAgICAiQ29tbWl0cyBjdXJyZW50IHRyYW5zYWN0aW9uIgotICAgIGRlZiByb2xsYmFjayAoc2VsZik6Ci0gICAgICAgICJSb2xscyBiYWNrIGN1cnJlbnQgdHJhbnNhY3Rpb24iCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgXG1ldGhvZCB7X19lbnRlcl9fKCl9IG1ldGhvZCBpcyBwcmV0dHkgZWFzeSwgaGF2aW5nIG9ubHkgdG8gc3RhcnQKLWEgbmV3IHRyYW5zYWN0aW9uLiAgRm9yIHRoaXMgYXBwbGljYXRpb24gdGhlIHJlc3VsdGluZyBjdXJzb3Igb2JqZWN0Ci13b3VsZCBiZSBhIHVzZWZ1bCByZXN1bHQsIHNvIHRoZSBtZXRob2Qgd2lsbCByZXR1cm4gaXQuICBUaGUgdXNlciBjYW4KLXRoZW4gYWRkIFxjb2Rle2FzIGN1cnNvcn0gdG8gdGhlaXIgJ1xrZXl3b3Jke3dpdGh9JyBzdGF0ZW1lbnQgdG8gYmluZAotdGhlIGN1cnNvciB0byBhIHZhcmlhYmxlIG5hbWUuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLWNsYXNzIERhdGFiYXNlQ29ubmVjdGlvbjoKLSAgICAuLi4KLSAgICBkZWYgX19lbnRlcl9fIChzZWxmKToKLSAgICAgICAgIyBDb2RlIHRvIHN0YXJ0IGEgbmV3IHRyYW5zYWN0aW9uCi0gICAgICAgIGN1cnNvciA9IHNlbGYuY3Vyc29yKCkKLSAgICAgICAgcmV0dXJuIGN1cnNvcgotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIFxtZXRob2R7X19leGl0X18oKX0gbWV0aG9kIGlzIHRoZSBtb3N0IGNvbXBsaWNhdGVkIGJlY2F1c2UgaXQncwotd2hlcmUgbW9zdCBvZiB0aGUgd29yayBoYXMgdG8gYmUgZG9uZS4gIFRoZSBtZXRob2QgaGFzIHRvIGNoZWNrIGlmIGFuCi1leGNlcHRpb24gb2NjdXJyZWQuICBJZiB0aGVyZSB3YXMgbm8gZXhjZXB0aW9uLCB0aGUgdHJhbnNhY3Rpb24gaXMKLWNvbW1pdHRlZC4gIFRoZSB0cmFuc2FjdGlvbiBpcyByb2xsZWQgYmFjayBpZiB0aGVyZSB3YXMgYW4gZXhjZXB0aW9uLgotCi1JbiB0aGUgY29kZSBiZWxvdywgZXhlY3V0aW9uIHdpbGwganVzdCBmYWxsIG9mZiB0aGUgZW5kIG9mIHRoZQotZnVuY3Rpb24sIHJldHVybmluZyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBcY29kZXtOb25lfS4gIFxjb2Rle05vbmV9IGlzCi1mYWxzZSwgc28gdGhlIGV4Y2VwdGlvbiB3aWxsIGJlIHJlLXJhaXNlZCBhdXRvbWF0aWNhbGx5LiAgSWYgeW91Ci13aXNoZWQsIHlvdSBjb3VsZCBiZSBtb3JlIGV4cGxpY2l0IGFuZCBhZGQgYSBca2V5d29yZHtyZXR1cm59Ci1zdGF0ZW1lbnQgYXQgdGhlIG1hcmtlZCBsb2NhdGlvbi4KLQotXGJlZ2lue3ZlcmJhdGltfQotY2xhc3MgRGF0YWJhc2VDb25uZWN0aW9uOgotICAgIC4uLgotICAgIGRlZiBfX2V4aXRfXyAoc2VsZiwgdHlwZSwgdmFsdWUsIHRiKToKLSAgICAgICAgaWYgdGIgaXMgTm9uZToKLSAgICAgICAgICAgICMgTm8gZXhjZXB0aW9uLCBzbyBjb21taXQKLSAgICAgICAgICAgIHNlbGYuY29tbWl0KCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgICMgRXhjZXB0aW9uIG9jY3VycmVkLCBzbyByb2xsYmFjay4KLSAgICAgICAgICAgIHNlbGYucm9sbGJhY2soKQotICAgICAgICAgICAgIyByZXR1cm4gRmFsc2UKLVxlbmR7dmVyYmF0aW19Ci0KLQotXHN1YnNlY3Rpb257VGhlIGNvbnRleHRsaWIgbW9kdWxlXGxhYmVse21vZHVsZS1jb250ZXh0bGlifX0KLQotVGhlIG5ldyBcbW9kdWxle2NvbnRleHRsaWJ9IG1vZHVsZSBwcm92aWRlcyBzb21lIGZ1bmN0aW9ucyBhbmQgYQotZGVjb3JhdG9yIHRoYXQgYXJlIHVzZWZ1bCBmb3Igd3JpdGluZyBvYmplY3RzIGZvciB1c2Ugd2l0aCB0aGUKLSdca2V5d29yZHt3aXRofScgc3RhdGVtZW50LgotCi1UaGUgZGVjb3JhdG9yIGlzIGNhbGxlZCBcZnVuY3Rpb257Y29udGV4dG1hbmFnZXJ9LCBhbmQgbGV0cyB5b3Ugd3JpdGUKLWEgc2luZ2xlIGdlbmVyYXRvciBmdW5jdGlvbiBpbnN0ZWFkIG9mIGRlZmluaW5nIGEgbmV3IGNsYXNzLiAgVGhlIGdlbmVyYXRvcgotc2hvdWxkIHlpZWxkIGV4YWN0bHkgb25lIHZhbHVlLiAgVGhlIGNvZGUgdXAgdG8gdGhlIFxrZXl3b3Jke3lpZWxkfQotd2lsbCBiZSBleGVjdXRlZCBhcyB0aGUgXG1ldGhvZHtfX2VudGVyX18oKX0gbWV0aG9kLCBhbmQgdGhlIHZhbHVlCi15aWVsZGVkIHdpbGwgYmUgdGhlIG1ldGhvZCdzIHJldHVybiB2YWx1ZSB0aGF0IHdpbGwgZ2V0IGJvdW5kIHRvIHRoZQotdmFyaWFibGUgaW4gdGhlICdca2V5d29yZHt3aXRofScgc3RhdGVtZW50J3MgXGtleXdvcmR7YXN9IGNsYXVzZSwgaWYKLWFueS4gIFRoZSBjb2RlIGFmdGVyIHRoZSBca2V5d29yZHt5aWVsZH0gd2lsbCBiZSBleGVjdXRlZCBpbiB0aGUKLVxtZXRob2R7X19leGl0X18oKX0gbWV0aG9kLiAgQW55IGV4Y2VwdGlvbiByYWlzZWQgaW4gdGhlIGJsb2NrIHdpbGwgYmUKLXJhaXNlZCBieSB0aGUgXGtleXdvcmR7eWllbGR9IHN0YXRlbWVudC4KLQotT3VyIGRhdGFiYXNlIGV4YW1wbGUgZnJvbSB0aGUgcHJldmlvdXMgc2VjdGlvbiBjb3VsZCBiZSB3cml0dGVuIAotdXNpbmcgdGhpcyBkZWNvcmF0b3IgYXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWZyb20gY29udGV4dGxpYiBpbXBvcnQgY29udGV4dG1hbmFnZXIKLQotQGNvbnRleHRtYW5hZ2VyCi1kZWYgZGJfdHJhbnNhY3Rpb24gKGNvbm5lY3Rpb24pOgotICAgIGN1cnNvciA9IGNvbm5lY3Rpb24uY3Vyc29yKCkKLSAgICB0cnk6Ci0gICAgICAgIHlpZWxkIGN1cnNvcgotICAgIGV4Y2VwdDoKLSAgICAgICAgY29ubmVjdGlvbi5yb2xsYmFjaygpCi0gICAgICAgIHJhaXNlCi0gICAgZWxzZToKLSAgICAgICAgY29ubmVjdGlvbi5jb21taXQoKQotCi1kYiA9IERhdGFiYXNlQ29ubmVjdGlvbigpCi13aXRoIGRiX3RyYW5zYWN0aW9uKGRiKSBhcyBjdXJzb3I6Ci0gICAgLi4uCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgXG1vZHVsZXtjb250ZXh0bGlifSBtb2R1bGUgYWxzbyBoYXMgYSBcZnVuY3Rpb257bmVzdGVkKFx2YXJ7bWdyMX0sCi1cdmFye21ncjJ9LCAuLi4pfSBmdW5jdGlvbiB0aGF0IGNvbWJpbmVzIGEgbnVtYmVyIG9mIGNvbnRleHQgbWFuYWdlcnMgc28geW91Ci1kb24ndCBuZWVkIHRvIHdyaXRlIG5lc3RlZCAnXGtleXdvcmR7d2l0aH0nIHN0YXRlbWVudHMuICBJbiB0aGlzCi1leGFtcGxlLCB0aGUgc2luZ2xlICdca2V5d29yZHt3aXRofScgc3RhdGVtZW50IGJvdGggc3RhcnRzIGEgZGF0YWJhc2UKLXRyYW5zYWN0aW9uIGFuZCBhY3F1aXJlcyBhIHRocmVhZCBsb2NrOgotCi1cYmVnaW57dmVyYmF0aW19Ci1sb2NrID0gdGhyZWFkaW5nLkxvY2soKQotd2l0aCBuZXN0ZWQgKGRiX3RyYW5zYWN0aW9uKGRiKSwgbG9jaykgYXMgKGN1cnNvciwgbG9ja2VkKToKLSAgICAuLi4KLVxlbmR7dmVyYmF0aW19Ci0KLUZpbmFsbHksIHRoZSBcZnVuY3Rpb257Y2xvc2luZyhcdmFye29iamVjdH0pfSBmdW5jdGlvbgotcmV0dXJucyBcdmFye29iamVjdH0gc28gdGhhdCBpdCBjYW4gYmUgYm91bmQgdG8gYSB2YXJpYWJsZSwKLWFuZCBjYWxscyBcY29kZXtcdmFye29iamVjdH0uY2xvc2UoKX0gYXQgdGhlIGVuZCBvZiB0aGUgYmxvY2suCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCB1cmxsaWIsIHN5cwotZnJvbSBjb250ZXh0bGliIGltcG9ydCBjbG9zaW5nCi0KLXdpdGggY2xvc2luZyh1cmxsaWIudXJsb3BlbignaHR0cDovL3d3dy55YWhvby5jb20nKSkgYXMgZjoKLSAgICBmb3IgbGluZSBpbiBmOgotICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKGxpbmUpCi1cZW5ke3ZlcmJhdGltfQotCi1cYmVnaW57c2VlYWxzb30KLQotXHNlZXBlcHszNDN9e1RoZSBgYHdpdGgnJyBzdGF0ZW1lbnR9e1BFUCB3cml0dGVuIGJ5IEd1aWRvIHZhbn5Sb3NzdW0KLWFuZCBOaWNrIENvZ2hsYW47IGltcGxlbWVudGVkIGJ5IE1pa2UgQmxhbmQsIEd1aWRvIHZhbn5Sb3NzdW0sIGFuZAotTmVhbCBOb3J3aXR6LiAgVGhlIFBFUCBzaG93cyB0aGUgY29kZSBnZW5lcmF0ZWQgZm9yIGEgJ1xrZXl3b3Jke3dpdGh9Jwotc3RhdGVtZW50LCB3aGljaCBjYW4gYmUgaGVscGZ1bCBpbiBsZWFybmluZyBob3cgdGhlIHN0YXRlbWVudCB3b3Jrcy59Ci0KLVxzZWV1cmx7Li4vbGliL21vZHVsZS1jb250ZXh0bGliLmh0bWx9e1RoZSBkb2N1bWVudGF0aW9uIAotZm9yIHRoZSBcbW9kdWxle2NvbnRleHRsaWJ9IG1vZHVsZS59Ci0KLVxlbmR7c2VlYWxzb30KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257UEVQIDM1MjogRXhjZXB0aW9ucyBhcyBOZXctU3R5bGUgQ2xhc3Nlc1xsYWJlbHtwZXAtMzUyfX0KLQotRXhjZXB0aW9uIGNsYXNzZXMgY2FuIG5vdyBiZSBuZXctc3R5bGUgY2xhc3Nlcywgbm90IGp1c3QgY2xhc3NpYwotY2xhc3NlcywgYW5kIHRoZSBidWlsdC1pbiBcZXhjZXB0aW9ue0V4Y2VwdGlvbn0gY2xhc3MgYW5kIGFsbCB0aGUKLXN0YW5kYXJkIGJ1aWx0LWluIGV4Y2VwdGlvbnMgKFxleGNlcHRpb257TmFtZUVycm9yfSwKLVxleGNlcHRpb257VmFsdWVFcnJvcn0sIGV0Yy4pIGFyZSBub3cgbmV3LXN0eWxlIGNsYXNzZXMuCi0KLVRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkgZm9yIGV4Y2VwdGlvbnMgaGFzIGJlZW4gcmVhcnJhbmdlZCBhIGJpdC4KLUluIDIuNSwgdGhlIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMgYXJlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1CYXNlRXhjZXB0aW9uICAgICAgICMgTmV3IGluIFB5dGhvbiAyLjUKLXwtIEtleWJvYXJkSW50ZXJydXB0Ci18LSBTeXN0ZW1FeGl0Ci18LSBFeGNlcHRpb24KLSAgIHwtIChhbGwgb3RoZXIgY3VycmVudCBidWlsdC1pbiBleGNlcHRpb25zKQotXGVuZHt2ZXJiYXRpbX0KLQotVGhpcyByZWFycmFuZ2VtZW50IHdhcyBkb25lIGJlY2F1c2UgcGVvcGxlIG9mdGVuIHdhbnQgdG8gY2F0Y2ggYWxsCi1leGNlcHRpb25zIHRoYXQgaW5kaWNhdGUgcHJvZ3JhbSBlcnJvcnMuICBcZXhjZXB0aW9ue0tleWJvYXJkSW50ZXJydXB0fSBhbmQKLVxleGNlcHRpb257U3lzdGVtRXhpdH0gYXJlbid0IGVycm9ycywgdGhvdWdoLCBhbmQgdXN1YWxseSByZXByZXNlbnQgYW4gZXhwbGljaXQKLWFjdGlvbiBzdWNoIGFzIHRoZSB1c2VyIGhpdHRpbmcgQ29udHJvbC1DIG9yIGNvZGUgY2FsbGluZwotXGZ1bmN0aW9ue3N5cy5leGl0KCl9LiAgQSBiYXJlIFxjb2Rle2V4Y2VwdDp9IHdpbGwgY2F0Y2ggYWxsIGV4Y2VwdGlvbnMsCi1zbyB5b3UgY29tbW9ubHkgbmVlZCB0byBsaXN0IFxleGNlcHRpb257S2V5Ym9hcmRJbnRlcnJ1cHR9IGFuZAotXGV4Y2VwdGlvbntTeXN0ZW1FeGl0fSBpbiBvcmRlciB0byByZS1yYWlzZSB0aGVtLiAgVGhlIHVzdWFsIHBhdHRlcm4gaXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXRyeToKLSAgICAuLi4KLWV4Y2VwdCAoS2V5Ym9hcmRJbnRlcnJ1cHQsIFN5c3RlbUV4aXQpOgotICAgIHJhaXNlCi1leGNlcHQ6IAotICAgICMgTG9nIGVycm9yLi4uICAKLSAgICAjIENvbnRpbnVlIHJ1bm5pbmcgcHJvZ3JhbS4uLgotXGVuZHt2ZXJiYXRpbX0KLQotSW4gUHl0aG9uIDIuNSwgeW91IGNhbiBub3cgd3JpdGUgXGNvZGV7ZXhjZXB0IEV4Y2VwdGlvbn0gdG8gYWNoaWV2ZQotdGhlIHNhbWUgcmVzdWx0LCBjYXRjaGluZyBhbGwgdGhlIGV4Y2VwdGlvbnMgdGhhdCB1c3VhbGx5IGluZGljYXRlIGVycm9ycyAKLWJ1dCBsZWF2aW5nIFxleGNlcHRpb257S2V5Ym9hcmRJbnRlcnJ1cHR9IGFuZAotXGV4Y2VwdGlvbntTeXN0ZW1FeGl0fSBhbG9uZS4gIEFzIGluIHByZXZpb3VzIHZlcnNpb25zLAotYSBiYXJlIFxjb2Rle2V4Y2VwdDp9IHN0aWxsIGNhdGNoZXMgYWxsIGV4Y2VwdGlvbnMuCi0KLVRoZSBnb2FsIGZvciBQeXRob24gMy4wIGlzIHRvIHJlcXVpcmUgYW55IGNsYXNzIHJhaXNlZCBhcyBhbiBleGNlcHRpb24KLXRvIGRlcml2ZSBmcm9tIFxleGNlcHRpb257QmFzZUV4Y2VwdGlvbn0gb3Igc29tZSBkZXNjZW5kYW50IG9mCi1cZXhjZXB0aW9ue0Jhc2VFeGNlcHRpb259LCBhbmQgZnV0dXJlIHJlbGVhc2VzIGluIHRoZQotUHl0aG9uIDIueCBzZXJpZXMgbWF5IGJlZ2luIHRvIGVuZm9yY2UgdGhpcyBjb25zdHJhaW50LiAgVGhlcmVmb3JlLCBJCi1zdWdnZXN0IHlvdSBiZWdpbiBtYWtpbmcgYWxsIHlvdXIgZXhjZXB0aW9uIGNsYXNzZXMgZGVyaXZlIGZyb20KLVxleGNlcHRpb257RXhjZXB0aW9ufSBub3cuICBJdCdzIGJlZW4gc3VnZ2VzdGVkIHRoYXQgdGhlIGJhcmUKLVxjb2Rle2V4Y2VwdDp9IGZvcm0gc2hvdWxkIGJlIHJlbW92ZWQgaW4gUHl0aG9uIDMuMCwgYnV0IEd1aWRvIHZhbn5Sb3NzdW0KLWhhc24ndCBkZWNpZGVkIHdoZXRoZXIgdG8gZG8gdGhpcyBvciBub3QuCi0KLVJhaXNpbmcgb2Ygc3RyaW5ncyBhcyBleGNlcHRpb25zLCBhcyBpbiB0aGUgc3RhdGVtZW50IFxjb2Rle3JhaXNlCi0iRXJyb3Igb2NjdXJyZWQifSwgaXMgZGVwcmVjYXRlZCBpbiBQeXRob24gMi41IGFuZCB3aWxsIHRyaWdnZXIgYQotd2FybmluZy4gIFRoZSBhaW0gaXMgdG8gYmUgYWJsZSB0byByZW1vdmUgdGhlIHN0cmluZy1leGNlcHRpb24gZmVhdHVyZQotaW4gYSBmZXcgcmVsZWFzZXMuCi0KLQotXGJlZ2lue3NlZWFsc299Ci0KLVxzZWVwZXB7MzUyfXtSZXF1aXJlZCBTdXBlcmNsYXNzIGZvciBFeGNlcHRpb25zfXtQRVAgd3JpdHRlbiBieSAKLUJyZXR0IENhbm5vbiBhbmQgR3VpZG8gdmFuflJvc3N1bTsgaW1wbGVtZW50ZWQgYnkgQnJldHQgQ2Fubm9uLn0KLQotXGVuZHtzZWVhbHNvfQotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntQRVAgMzUzOiBVc2luZyBzc2l6ZV90IGFzIHRoZSBpbmRleCB0eXBlXGxhYmVse3BlcC0zNTN9fQotCi1BIHdpZGUtcmFuZ2luZyBjaGFuZ2UgdG8gUHl0aG9uJ3MgQyBBUEksIHVzaW5nIGEgbmV3IAotXGN0eXBle1B5X3NzaXplX3R9IHR5cGUgZGVmaW5pdGlvbiBpbnN0ZWFkIG9mIFxjdHlwZXtpbnR9LCAKLXdpbGwgcGVybWl0IHRoZSBpbnRlcnByZXRlciB0byBoYW5kbGUgbW9yZSBkYXRhIG9uIDY0LWJpdCBwbGF0Zm9ybXMuCi1UaGlzIGNoYW5nZSBkb2Vzbid0IGFmZmVjdCBQeXRob24ncyBjYXBhY2l0eSBvbiAzMi1iaXQgcGxhdGZvcm1zLgotCi1WYXJpb3VzIHBpZWNlcyBvZiB0aGUgUHl0aG9uIGludGVycHJldGVyIHVzZWQgQydzIFxjdHlwZXtpbnR9IHR5cGUgdG8KLXN0b3JlIHNpemVzIG9yIGNvdW50czsgZm9yIGV4YW1wbGUsIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gYSBsaXN0IG9yCi10dXBsZSB3ZXJlIHN0b3JlZCBpbiBhbiBcY3R5cGV7aW50fS4gIFRoZSBDIGNvbXBpbGVycyBmb3IgbW9zdCA2NC1iaXQKLXBsYXRmb3JtcyBzdGlsbCBkZWZpbmUgXGN0eXBle2ludH0gYXMgYSAzMi1iaXQgdHlwZSwgc28gdGhhdCBtZWFudAotdGhhdCBsaXN0cyBjb3VsZCBvbmx5IGhvbGQgdXAgdG8gXGNvZGV7MioqMzEgLSAxfSA9IDIxNDc0ODM2NDcgaXRlbXMuCi0oVGhlcmUgYXJlIGFjdHVhbGx5IGEgZmV3IGRpZmZlcmVudCBwcm9ncmFtbWluZyBtb2RlbHMgdGhhdCA2NC1iaXQgQwotY29tcGlsZXJzIGNhbiB1c2UgLS0gc2VlCi1cdXJse2h0dHA6Ly93d3cudW5peC5vcmcvdmVyc2lvbjIvd2hhdHNuZXcvbHA2NF93cC5odG1sfSBmb3IgYQotZGlzY3Vzc2lvbiAtLSBidXQgdGhlIG1vc3QgY29tbW9ubHkgYXZhaWxhYmxlIG1vZGVsIGxlYXZlcyBcY3R5cGV7aW50fQotYXMgMzIgYml0cy4pCi0KLUEgbGltaXQgb2YgMjE0NzQ4MzY0NyBpdGVtcyBkb2Vzbid0IHJlYWxseSBtYXR0ZXIgb24gYSAzMi1iaXQgcGxhdGZvcm0KLWJlY2F1c2UgeW91J2xsIHJ1biBvdXQgb2YgbWVtb3J5IGJlZm9yZSBoaXR0aW5nIHRoZSBsZW5ndGggbGltaXQuCi1FYWNoIGxpc3QgaXRlbSByZXF1aXJlcyBzcGFjZSBmb3IgYSBwb2ludGVyLCB3aGljaCBpcyA0IGJ5dGVzLCBwbHVzCi1zcGFjZSBmb3IgYSBcY3R5cGV7UHlPYmplY3R9IHJlcHJlc2VudGluZyB0aGUgaXRlbS4gIDIxNDc0ODM2NDcqNCBpcwotYWxyZWFkeSBtb3JlIGJ5dGVzIHRoYW4gYSAzMi1iaXQgYWRkcmVzcyBzcGFjZSBjYW4gY29udGFpbi4KLQotSXQncyBwb3NzaWJsZSB0byBhZGRyZXNzIHRoYXQgbXVjaCBtZW1vcnkgb24gYSA2NC1iaXQgcGxhdGZvcm0sCi1ob3dldmVyLiAgVGhlIHBvaW50ZXJzIGZvciBhIGxpc3QgdGhhdCBzaXplIHdvdWxkIG9ubHkgcmVxdWlyZSAxNn5HaUIKLW9mIHNwYWNlLCBzbyBpdCdzIG5vdCB1bnJlYXNvbmFibGUgdGhhdCBQeXRob24gcHJvZ3JhbW1lcnMgbWlnaHQKLWNvbnN0cnVjdCBsaXN0cyB0aGF0IGxhcmdlLiAgVGhlcmVmb3JlLCB0aGUgUHl0aG9uIGludGVycHJldGVyIGhhZCB0bwotYmUgY2hhbmdlZCB0byB1c2Ugc29tZSB0eXBlIG90aGVyIHRoYW4gXGN0eXBle2ludH0sIGFuZCB0aGlzIHdpbGwgYmUgYQotNjQtYml0IHR5cGUgb24gNjQtYml0IHBsYXRmb3Jtcy4gIFRoZSBjaGFuZ2Ugd2lsbCBjYXVzZQotaW5jb21wYXRpYmlsaXRpZXMgb24gNjQtYml0IG1hY2hpbmVzLCBzbyBpdCB3YXMgZGVlbWVkIHdvcnRoIG1ha2luZwotdGhlIHRyYW5zaXRpb24gbm93LCB3aGlsZSB0aGUgbnVtYmVyIG9mIDY0LWJpdCB1c2VycyBpcyBzdGlsbAotcmVsYXRpdmVseSBzbWFsbC4gIChJbiA1IG9yIDEwIHllYXJzLCB3ZSBtYXkgXGVtcGh7YWxsfSBiZSBvbiA2NC1iaXQKLW1hY2hpbmVzLCBhbmQgdGhlIHRyYW5zaXRpb24gd291bGQgYmUgbW9yZSBwYWluZnVsIHRoZW4uKQotCi1UaGlzIGNoYW5nZSBtb3N0IHN0cm9uZ2x5IGFmZmVjdHMgYXV0aG9ycyBvZiBDIGV4dGVuc2lvbiBtb2R1bGVzLiAgCi1QeXRob24gc3RyaW5ncyBhbmQgY29udGFpbmVyIHR5cGVzIHN1Y2ggYXMgbGlzdHMgYW5kIHR1cGxlcyAKLW5vdyB1c2UgXGN0eXBle1B5X3NzaXplX3R9IHRvIHN0b3JlIHRoZWlyIHNpemUuICAKLUZ1bmN0aW9ucyBzdWNoIGFzIFxjZnVuY3Rpb257UHlMaXN0X1NpemUoKX0gCi1ub3cgcmV0dXJuIFxjdHlwZXtQeV9zc2l6ZV90fS4gIENvZGUgaW4gZXh0ZW5zaW9uIG1vZHVsZXMKLW1heSB0aGVyZWZvcmUgbmVlZCB0byBoYXZlIHNvbWUgdmFyaWFibGVzIGNoYW5nZWQgdG8KLVxjdHlwZXtQeV9zc2l6ZV90fS4gIAotCi1UaGUgXGNmdW5jdGlvbntQeUFyZ19QYXJzZVR1cGxlKCl9IGFuZCBcY2Z1bmN0aW9ue1B5X0J1aWxkVmFsdWUoKX0gZnVuY3Rpb25zCi1oYXZlIGEgbmV3IGNvbnZlcnNpb24gY29kZSwgXHNhbXB7bn0sIGZvciBcY3R5cGV7UHlfc3NpemVfdH0uICAKLVxjZnVuY3Rpb257UHlBcmdfUGFyc2VUdXBsZSgpfSdzIFxzYW1we3NcI30gYW5kIFxzYW1we3RcI30gc3RpbGwgb3V0cHV0Ci1cY3R5cGV7aW50fSBieSBkZWZhdWx0LCBidXQgeW91IGNhbiBkZWZpbmUgdGhlIG1hY3JvIAotXGNzaW1wbGVtYWNyb3tQWV9TU0laRV9UX0NMRUFOfSBiZWZvcmUgaW5jbHVkaW5nIFxmaWxle1B5dGhvbi5ofSAKLXRvIG1ha2UgdGhlbSByZXR1cm4gXGN0eXBle1B5X3NzaXplX3R9LgotCi1ccGVwezM1M30gaGFzIGEgc2VjdGlvbiBvbiBjb252ZXJzaW9uIGd1aWRlbGluZXMgdGhhdCAKLWV4dGVuc2lvbiBhdXRob3JzIHNob3VsZCByZWFkIHRvIGxlYXJuIGFib3V0IHN1cHBvcnRpbmcgNjQtYml0Ci1wbGF0Zm9ybXMuCi0KLVxiZWdpbntzZWVhbHNvfQotCi1cc2VlcGVwezM1M317VXNpbmcgc3NpemVfdCBhcyB0aGUgaW5kZXggdHlwZX17UEVQIHdyaXR0ZW4gYW5kIGltcGxlbWVudGVkIGJ5IE1hcnRpbiB2b25+TFwib3dpcy59Ci0KLVxlbmR7c2VlYWxzb30KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257UEVQIDM1NzogVGhlICdfX2luZGV4X18nIG1ldGhvZFxsYWJlbHtwZXAtMzU3fX0KLQotVGhlIE51bVB5IGRldmVsb3BlcnMgaGFkIGEgcHJvYmxlbSB0aGF0IGNvdWxkIG9ubHkgYmUgc29sdmVkIGJ5IGFkZGluZwotYSBuZXcgc3BlY2lhbCBtZXRob2QsIFxtZXRob2R7X19pbmRleF9ffS4gIFdoZW4gdXNpbmcgc2xpY2Ugbm90YXRpb24sCi1hcyBpbiBcY29kZXtbXHZhcntzdGFydH06XHZhcntzdG9wfTpcdmFye3N0ZXB9XX0sIHRoZSB2YWx1ZXMgb2YgdGhlCi1cdmFye3N0YXJ0fSwgXHZhcntzdG9wfSwgYW5kIFx2YXJ7c3RlcH0gaW5kZXhlcyBtdXN0IGFsbCBiZSBlaXRoZXIKLWludGVnZXJzIG9yIGxvbmcgaW50ZWdlcnMuICBOdW1QeSBkZWZpbmVzIGEgdmFyaWV0eSBvZiBzcGVjaWFsaXplZAotaW50ZWdlciB0eXBlcyBjb3JyZXNwb25kaW5nIHRvIHVuc2lnbmVkIGFuZCBzaWduZWQgaW50ZWdlcnMgb2YgOCwgMTYsCi0zMiwgYW5kIDY0IGJpdHMsIGJ1dCB0aGVyZSB3YXMgbm8gd2F5IHRvIHNpZ25hbCB0aGF0IHRoZXNlIHR5cGVzIGNvdWxkCi1iZSB1c2VkIGFzIHNsaWNlIGluZGV4ZXMuCi0KLVNsaWNpbmcgY2FuJ3QganVzdCB1c2UgdGhlIGV4aXN0aW5nIFxtZXRob2R7X19pbnRfX30gbWV0aG9kIGJlY2F1c2UKLXRoYXQgbWV0aG9kIGlzIGFsc28gdXNlZCB0byBpbXBsZW1lbnQgY29lcmNpb24gdG8gaW50ZWdlcnMuICBJZgotc2xpY2luZyB1c2VkIFxtZXRob2R7X19pbnRfX30sIGZsb2F0aW5nLXBvaW50IG51bWJlcnMgd291bGQgYWxzbwotYmVjb21lIGxlZ2FsIHNsaWNlIGluZGV4ZXMgYW5kIHRoYXQncyBjbGVhcmx5IGFuIHVuZGVzaXJhYmxlCi1iZWhhdmlvdXIuCi0KLUluc3RlYWQsIGEgbmV3IHNwZWNpYWwgbWV0aG9kIGNhbGxlZCBcbWV0aG9ke19faW5kZXhfX30gd2FzIGFkZGVkLiAgSXQKLXRha2VzIG5vIGFyZ3VtZW50cyBhbmQgcmV0dXJucyBhbiBpbnRlZ2VyIGdpdmluZyB0aGUgc2xpY2UgaW5kZXggdG8KLXVzZS4gIEZvciBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1jbGFzcyBDOgotICAgIGRlZiBfX2luZGV4X18gKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi52YWx1ZSAgCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgZWl0aGVyIGEgUHl0aG9uIGludGVnZXIgb3IgbG9uZyBpbnRlZ2VyLgotVGhlIGludGVycHJldGVyIHdpbGwgY2hlY2sgdGhhdCB0aGUgdHlwZSByZXR1cm5lZCBpcyBjb3JyZWN0LCBhbmQKLXJhaXNlcyBhIFxleGNlcHRpb257VHlwZUVycm9yfSBpZiB0aGlzIHJlcXVpcmVtZW50IGlzbid0IG1ldC4KLQotQSBjb3JyZXNwb25kaW5nIFxtZW1iZXJ7bmJfaW5kZXh9IHNsb3Qgd2FzIGFkZGVkIHRvIHRoZSBDLWxldmVsCi1cY3R5cGV7UHlOdW1iZXJNZXRob2RzfSBzdHJ1Y3R1cmUgdG8gbGV0IEMgZXh0ZW5zaW9ucyBpbXBsZW1lbnQgdGhpcwotcHJvdG9jb2wuICBcY2Z1bmN0aW9ue1B5TnVtYmVyX0luZGV4KFx2YXJ7b2JqfSl9IGNhbiBiZSB1c2VkIGluCi1leHRlbnNpb24gY29kZSB0byBjYWxsIHRoZSBcbWV0aG9ke19faW5kZXhfX30gZnVuY3Rpb24gYW5kIHJldHJpZXZlCi1pdHMgcmVzdWx0LgotCi1cYmVnaW57c2VlYWxzb30KLQotXHNlZXBlcHszNTd9e0FsbG93aW5nIEFueSBPYmplY3QgdG8gYmUgVXNlZCBmb3IgU2xpY2luZ317UEVQIHdyaXR0ZW4gCi1hbmQgaW1wbGVtZW50ZWQgYnkgVHJhdmlzIE9saXBoYW50Ln0KLQotXGVuZHtzZWVhbHNvfQotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntPdGhlciBMYW5ndWFnZSBDaGFuZ2VzXGxhYmVse290aGVyLWxhbmd9fQotCi1IZXJlIGFyZSBhbGwgb2YgdGhlIGNoYW5nZXMgdGhhdCBQeXRob24gMi41IG1ha2VzIHRvIHRoZSBjb3JlIFB5dGhvbgotbGFuZ3VhZ2UuCi0KLVxiZWdpbntpdGVtaXplfQotCi1caXRlbSBUaGUgXGNsYXNze2RpY3R9IHR5cGUgaGFzIGEgbmV3IGhvb2sgZm9yIGxldHRpbmcgc3ViY2xhc3NlcwotcHJvdmlkZSBhIGRlZmF1bHQgdmFsdWUgd2hlbiBhIGtleSBpc24ndCBjb250YWluZWQgaW4gdGhlIGRpY3Rpb25hcnkuCi1XaGVuIGEga2V5IGlzbid0IGZvdW5kLCB0aGUgZGljdGlvbmFyeSdzCi1cbWV0aG9ke19fbWlzc2luZ19fKFx2YXJ7a2V5fSl9Ci1tZXRob2Qgd2lsbCBiZSBjYWxsZWQuICBUaGlzIGhvb2sgaXMgdXNlZCB0byBpbXBsZW1lbnQKLXRoZSBuZXcgXGNsYXNze2RlZmF1bHRkaWN0fSBjbGFzcyBpbiB0aGUgXG1vZHVsZXtjb2xsZWN0aW9uc30KLW1vZHVsZS4gIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZWZpbmVzIGEgZGljdGlvbmFyeSAKLXRoYXQgcmV0dXJucyB6ZXJvIGZvciBhbnkgbWlzc2luZyBrZXk6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWNsYXNzIHplcm9kaWN0IChkaWN0KToKLSAgICBkZWYgX19taXNzaW5nX18gKHNlbGYsIGtleSk6Ci0gICAgICAgIHJldHVybiAwCi0KLWQgPSB6ZXJvZGljdCh7MToxLCAyOjJ9KQotcHJpbnQgZFsxXSwgZFsyXSAgICMgUHJpbnRzIDEsIDIKLXByaW50IGRbM10sIGRbNF0gICAjIFByaW50cyAwLCAwCi1cZW5ke3ZlcmJhdGltfQotCi1caXRlbSBCb3RoIDgtYml0IGFuZCBVbmljb2RlIHN0cmluZ3MgaGF2ZSBuZXcgXG1ldGhvZHtwYXJ0aXRpb24oc2VwKX0gCi1hbmQgXG1ldGhvZHtycGFydGl0aW9uKHNlcCl9IG1ldGhvZHMgdGhhdCBzaW1wbGlmeSBhIGNvbW1vbiB1c2UgY2FzZS4KLQotVGhlIFxtZXRob2R7ZmluZChTKX0gbWV0aG9kIGlzIG9mdGVuIHVzZWQgdG8gZ2V0IGFuIGluZGV4IHdoaWNoIGlzCi10aGVuIHVzZWQgdG8gc2xpY2UgdGhlIHN0cmluZyBhbmQgb2J0YWluIHRoZSBwaWVjZXMgdGhhdCBhcmUgYmVmb3JlCi1hbmQgYWZ0ZXIgdGhlIHNlcGFyYXRvci4gIAotXG1ldGhvZHtwYXJ0aXRpb24oc2VwKX0gY29uZGVuc2VzIHRoaXMKLXBhdHRlcm4gaW50byBhIHNpbmdsZSBtZXRob2QgY2FsbCB0aGF0IHJldHVybnMgYSAzLXR1cGxlIGNvbnRhaW5pbmcKLXRoZSBzdWJzdHJpbmcgYmVmb3JlIHRoZSBzZXBhcmF0b3IsIHRoZSBzZXBhcmF0b3IgaXRzZWxmLCBhbmQgdGhlCi1zdWJzdHJpbmcgYWZ0ZXIgdGhlIHNlcGFyYXRvci4gIElmIHRoZSBzZXBhcmF0b3IgaXNuJ3QgZm91bmQsIHRoZQotZmlyc3QgZWxlbWVudCBvZiB0aGUgdHVwbGUgaXMgdGhlIGVudGlyZSBzdHJpbmcgYW5kIHRoZSBvdGhlciB0d28KLWVsZW1lbnRzIGFyZSBlbXB0eS4gIFxtZXRob2R7cnBhcnRpdGlvbihzZXApfSBhbHNvIHJldHVybnMgYSAzLXR1cGxlCi1idXQgc3RhcnRzIHNlYXJjaGluZyBmcm9tIHRoZSBlbmQgb2YgdGhlIHN0cmluZzsgdGhlIFxzYW1we3J9IHN0YW5kcwotZm9yICdyZXZlcnNlJy4KLQotU29tZSBleGFtcGxlczoKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+ICgnaHR0cDovL3d3dy5weXRob24ub3JnJykucGFydGl0aW9uKCc6Ly8nKQotKCdodHRwJywgJzovLycsICd3d3cucHl0aG9uLm9yZycpCi0+Pj4gKCdmaWxlOi91c3Ivc2hhcmUvZG9jL2luZGV4Lmh0bWwnKS5wYXJ0aXRpb24oJzovLycpCi0oJ2ZpbGU6L3Vzci9zaGFyZS9kb2MvaW5kZXguaHRtbCcsICcnLCAnJykKLT4+PiAodSdTdWJqZWN0OiBhIHF1aWNrIHF1ZXN0aW9uJykucGFydGl0aW9uKCc6JykKLSh1J1N1YmplY3QnLCB1JzonLCB1JyBhIHF1aWNrIHF1ZXN0aW9uJykKLT4+PiAnd3d3LnB5dGhvbi5vcmcnLnJwYXJ0aXRpb24oJy4nKQotKCd3d3cucHl0aG9uJywgJy4nLCAnb3JnJykKLT4+PiAnd3d3LnB5dGhvbi5vcmcnLnJwYXJ0aXRpb24oJzonKQotKCcnLCAnJywgJ3d3dy5weXRob24ub3JnJykKLVxlbmR7dmVyYmF0aW19Ci0KLShJbXBsZW1lbnRlZCBieSBGcmVkcmlrIEx1bmRoIGZvbGxvd2luZyBhIHN1Z2dlc3Rpb24gYnkgUmF5bW9uZCBIZXR0aW5nZXIuKQotCi1caXRlbSBUaGUgXG1ldGhvZHtzdGFydHN3aXRoKCl9IGFuZCBcbWV0aG9ke2VuZHN3aXRoKCl9IG1ldGhvZHMKLW9mIHN0cmluZyB0eXBlcyBub3cgYWNjZXB0IHR1cGxlcyBvZiBzdHJpbmdzIHRvIGNoZWNrIGZvci4KLQotXGJlZ2lue3ZlcmJhdGltfQotZGVmIGlzX2ltYWdlX2ZpbGUgKGZpbGVuYW1lKToKLSAgICByZXR1cm4gZmlsZW5hbWUuZW5kc3dpdGgoKCcuZ2lmJywgJy5qcGcnLCAnLnRpZmYnKSkKLVxlbmR7dmVyYmF0aW19Ci0KLShJbXBsZW1lbnRlZCBieSBHZW9yZyBCcmFuZGwgZm9sbG93aW5nIGEgc3VnZ2VzdGlvbiBieSBUb20gTHlubi4pCi0lIFJGRSAjMTQ5MTQ4NQotCi1caXRlbSBUaGUgXGZ1bmN0aW9ue21pbigpfSBhbmQgXGZ1bmN0aW9ue21heCgpfSBidWlsdC1pbiBmdW5jdGlvbnMKLWdhaW5lZCBhIFxjb2Rle2tleX0ga2V5d29yZCBwYXJhbWV0ZXIgYW5hbG9nb3VzIHRvIHRoZSBcY29kZXtrZXl9Ci1hcmd1bWVudCBmb3IgXG1ldGhvZHtzb3J0KCl9LiAgVGhpcyBwYXJhbWV0ZXIgc3VwcGxpZXMgYSBmdW5jdGlvbiB0aGF0Ci10YWtlcyBhIHNpbmdsZSBhcmd1bWVudCBhbmQgaXMgY2FsbGVkIGZvciBldmVyeSB2YWx1ZSBpbiB0aGUgbGlzdDsKLVxmdW5jdGlvbnttaW4oKX0vXGZ1bmN0aW9ue21heCgpfSB3aWxsIHJldHVybiB0aGUgZWxlbWVudCB3aXRoIHRoZSAKLXNtYWxsZXN0L2xhcmdlc3QgcmV0dXJuIHZhbHVlIGZyb20gdGhpcyBmdW5jdGlvbi4KLUZvciBleGFtcGxlLCB0byBmaW5kIHRoZSBsb25nZXN0IHN0cmluZyBpbiBhIGxpc3QsIHlvdSBjYW4gZG86Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLUwgPSBbJ21lZGl1bScsICdsb25nZXN0JywgJ3Nob3J0J10KLSMgUHJpbnRzICdsb25nZXN0JwotcHJpbnQgbWF4KEwsIGtleT1sZW4pICAgICAgICAgICAgICAKLSMgUHJpbnRzICdzaG9ydCcsIGJlY2F1c2UgbGV4aWNvZ3JhcGhpY2FsbHkgJ3Nob3J0JyBoYXMgdGhlIGxhcmdlc3QgdmFsdWUKLXByaW50IG1heChMKSAgICAgICAgIAotXGVuZHt2ZXJiYXRpbX0KLQotKENvbnRyaWJ1dGVkIGJ5IFN0ZXZlbiBCZXRoYXJkIGFuZCBSYXltb25kIEhldHRpbmdlci4pCi0KLVxpdGVtIFR3byBuZXcgYnVpbHQtaW4gZnVuY3Rpb25zLCBcZnVuY3Rpb257YW55KCl9IGFuZAotXGZ1bmN0aW9ue2FsbCgpfSwgZXZhbHVhdGUgd2hldGhlciBhbiBpdGVyYXRvciBjb250YWlucyBhbnkgdHJ1ZSBvcgotZmFsc2UgdmFsdWVzLiAgXGZ1bmN0aW9ue2FueSgpfSByZXR1cm5zIFxjb25zdGFudHtUcnVlfSBpZiBhbnkgdmFsdWUKLXJldHVybmVkIGJ5IHRoZSBpdGVyYXRvciBpcyB0cnVlOyBvdGhlcndpc2UgaXQgd2lsbCByZXR1cm4KLVxjb25zdGFudHtGYWxzZX0uICBcZnVuY3Rpb257YWxsKCl9IHJldHVybnMgXGNvbnN0YW50e1RydWV9IG9ubHkgaWYKLWFsbCBvZiB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvciBldmFsdWF0ZSBhcyB0cnVlLgotKFN1Z2dlc3RlZCBieSBHdWlkbyB2YW5+Um9zc3VtLCBhbmQgaW1wbGVtZW50ZWQgYnkgUmF5bW9uZCBIZXR0aW5nZXIuKQotCi1caXRlbSBUaGUgcmVzdWx0IG9mIGEgY2xhc3MncyBcbWV0aG9ke19faGFzaF9fKCl9IG1ldGhvZCBjYW4gbm93IAotYmUgZWl0aGVyIGEgbG9uZyBpbnRlZ2VyIG9yIGEgcmVndWxhciBpbnRlZ2VyLiAgSWYgYSBsb25nIGludGVnZXIgaXMKLXJldHVybmVkLCB0aGUgaGFzaCBvZiB0aGF0IHZhbHVlIGlzIHRha2VuLiAgSW4gZWFybGllciB2ZXJzaW9ucyB0aGUKLWhhc2ggdmFsdWUgd2FzIHJlcXVpcmVkIHRvIGJlIGEgcmVndWxhciBpbnRlZ2VyLCBidXQgaW4gMi41IHRoZQotXGZ1bmN0aW9ue2lkKCl9IGJ1aWx0LWluIHdhcyBjaGFuZ2VkIHRvIGFsd2F5cyByZXR1cm4gbm9uLW5lZ2F0aXZlCi1udW1iZXJzLCBhbmQgdXNlcnMgb2Z0ZW4gc2VlbSB0byB1c2UgXGNvZGV7aWQoc2VsZil9IGluCi1cbWV0aG9ke19faGFzaF9fKCl9IG1ldGhvZHMgKHRob3VnaCB0aGlzIGlzIGRpc2NvdXJhZ2VkKS4KLSUgQnVnICMxNTM2MDIxCi0KLVxpdGVtIEFTQ0lJIGlzIG5vdyB0aGUgZGVmYXVsdCBlbmNvZGluZyBmb3IgbW9kdWxlcy4gIEl0J3Mgbm93IAotYSBzeW50YXggZXJyb3IgaWYgYSBtb2R1bGUgY29udGFpbnMgc3RyaW5nIGxpdGVyYWxzIHdpdGggOC1iaXQKLWNoYXJhY3RlcnMgYnV0IGRvZXNuJ3QgaGF2ZSBhbiBlbmNvZGluZyBkZWNsYXJhdGlvbi4gIEluIFB5dGhvbiAyLjQKLXRoaXMgdHJpZ2dlcmVkIGEgd2FybmluZywgbm90IGEgc3ludGF4IGVycm9yLiAgU2VlIFxwZXB7MjYzfSAKLWZvciBob3cgdG8gZGVjbGFyZSBhIG1vZHVsZSdzIGVuY29kaW5nOyBmb3IgZXhhbXBsZSwgeW91IG1pZ2h0IGFkZCAKLWEgbGluZSBsaWtlIHRoaXMgbmVhciB0aGUgdG9wIG9mIHRoZSBzb3VyY2UgZmlsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotIyAtKi0gY29kaW5nOiBsYXRpbjEgLSotCi1cZW5ke3ZlcmJhdGltfQotCi1caXRlbSBBIG5ldyB3YXJuaW5nLCBcY2xhc3N7VW5pY29kZVdhcm5pbmd9LCBpcyB0cmlnZ2VyZWQgd2hlbiAKLXlvdSBhdHRlbXB0IHRvIGNvbXBhcmUgYSBVbmljb2RlIHN0cmluZyBhbmQgYW4gOC1iaXQgc3RyaW5nIAotdGhhdCBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gVW5pY29kZSB1c2luZyB0aGUgZGVmYXVsdCBBU0NJSSBlbmNvZGluZy4gIAotVGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbiBpcyBmYWxzZToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGNocigxMjgpID09IHVuaWNocigxMjgpICAgIyBDYW4ndCBjb252ZXJ0IGNocigxMjgpIHRvIFVuaWNvZGUKLV9fbWFpbl9fOjE6IFVuaWNvZGVXYXJuaW5nOiBVbmljb2RlIGVxdWFsIGNvbXBhcmlzb24gZmFpbGVkIAotICB0byBjb252ZXJ0IGJvdGggYXJndW1lbnRzIHRvIFVuaWNvZGUgLSBpbnRlcnByZXRpbmcgdGhlbSAKLSAgYXMgYmVpbmcgdW5lcXVhbAotRmFsc2UKLT4+PiBjaHIoMTI3KSA9PSB1bmljaHIoMTI3KSAgICMgY2hyKDEyNykgY2FuIGJlIGNvbnZlcnRlZAotVHJ1ZQotXGVuZHt2ZXJiYXRpbX0KLQotUHJldmlvdXNseSB0aGlzIHdvdWxkIHJhaXNlIGEgXGNsYXNze1VuaWNvZGVEZWNvZGVFcnJvcn0gZXhjZXB0aW9uLAotYnV0IGluIDIuNSB0aGlzIGNvdWxkIHJlc3VsdCBpbiBwdXp6bGluZyBwcm9ibGVtcyB3aGVuIGFjY2Vzc2luZyBhCi1kaWN0aW9uYXJ5LiAgSWYgeW91IGxvb2tlZCB1cCBcY29kZXt1bmljaHIoMTI4KX0gYW5kIFxjb2Rle2NocigxMjgpfQotd2FzIGJlaW5nIHVzZWQgYXMgYSBrZXksIHlvdSdkIGdldCBhIFxjbGFzc3tVbmljb2RlRGVjb2RlRXJyb3J9Ci1leGNlcHRpb24uICBPdGhlciBjaGFuZ2VzIGluIDIuNSByZXN1bHRlZCBpbiB0aGlzIGV4Y2VwdGlvbiBiZWluZwotcmFpc2VkIGluc3RlYWQgb2Ygc3VwcHJlc3NlZCBieSB0aGUgY29kZSBpbiBcZmlsZXtkaWN0b2JqZWN0LmN9IHRoYXQKLWltcGxlbWVudHMgZGljdGlvbmFyaWVzLgotCi1SYWlzaW5nIGFuIGV4Y2VwdGlvbiBmb3Igc3VjaCBhIGNvbXBhcmlzb24gaXMgc3RyaWN0bHkgY29ycmVjdCwgYnV0Ci10aGUgY2hhbmdlIG1pZ2h0IGhhdmUgYnJva2VuIGNvZGUsIHNvIGluc3RlYWQgCi1cY2xhc3N7VW5pY29kZVdhcm5pbmd9IHdhcyBpbnRyb2R1Y2VkLgotCi0oSW1wbGVtZW50ZWQgYnkgTWFyYy1BbmRyXCdlIExlbWJ1cmcuKQotCi1caXRlbSBPbmUgZXJyb3IgdGhhdCBQeXRob24gcHJvZ3JhbW1lcnMgc29tZXRpbWVzIG1ha2UgaXMgZm9yZ2V0dGluZwotdG8gaW5jbHVkZSBhbiBcZmlsZXtfX2luaXRfXy5weX0gbW9kdWxlIGluIGEgcGFja2FnZSBkaXJlY3RvcnkuCi1EZWJ1Z2dpbmcgdGhpcyBtaXN0YWtlIGNhbiBiZSBjb25mdXNpbmcsIGFuZCB1c3VhbGx5IHJlcXVpcmVzIHJ1bm5pbmcKLVB5dGhvbiB3aXRoIHRoZSBccHJvZ3JhbW9wdHstdn0gc3dpdGNoIHRvIGxvZyBhbGwgdGhlIHBhdGhzIHNlYXJjaGVkLgotSW4gUHl0aG9uIDIuNSwgYSBuZXcgXGV4Y2VwdGlvbntJbXBvcnRXYXJuaW5nfSB3YXJuaW5nIGlzIHRyaWdnZXJlZCB3aGVuCi1hbiBpbXBvcnQgd291bGQgaGF2ZSBwaWNrZWQgdXAgYSBkaXJlY3RvcnkgYXMgYSBwYWNrYWdlIGJ1dCBubwotXGZpbGV7X19pbml0X18ucHl9IHdhcyBmb3VuZC4gIFRoaXMgd2FybmluZyBpcyBzaWxlbnRseSBpZ25vcmVkIGJ5IGRlZmF1bHQ7Ci1wcm92aWRlIHRoZSBccHJvZ3JhbW9wdHstV2R9IG9wdGlvbiB3aGVuIHJ1bm5pbmcgdGhlIFB5dGhvbiBleGVjdXRhYmxlCi10byBkaXNwbGF5IHRoZSB3YXJuaW5nIG1lc3NhZ2UuCi0oSW1wbGVtZW50ZWQgYnkgVGhvbWFzIFdvdXRlcnMuKQotCi1caXRlbSBUaGUgbGlzdCBvZiBiYXNlIGNsYXNzZXMgaW4gYSBjbGFzcyBkZWZpbml0aW9uIGNhbiBub3cgYmUgZW1wdHkuICAKLUFzIGFuIGV4YW1wbGUsIHRoaXMgaXMgbm93IGxlZ2FsOgotCi1cYmVnaW57dmVyYmF0aW19Ci1jbGFzcyBDKCk6Ci0gICAgcGFzcwotXGVuZHt2ZXJiYXRpbX0KLShJbXBsZW1lbnRlZCBieSBCcmV0dCBDYW5ub24uKQotCi1cZW5ke2l0ZW1pemV9Ci0KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzdWJzZWN0aW9ue0ludGVyYWN0aXZlIEludGVycHJldGVyIENoYW5nZXNcbGFiZWx7aW50ZXJhY3RpdmV9fQotCi1JbiB0aGUgaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIsIFxjb2Rle3F1aXR9IGFuZCBcY29kZXtleGl0fSAKLWhhdmUgbG9uZyBiZWVuIHN0cmluZ3Mgc28gdGhhdCBuZXcgdXNlcnMgZ2V0IGEgc29tZXdoYXQgaGVscGZ1bCBtZXNzYWdlCi13aGVuIHRoZXkgdHJ5IHRvIHF1aXQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBxdWl0Ci0nVXNlIEN0cmwtRCAoaS5lLiBFT0YpIHRvIGV4aXQuJwotXGVuZHt2ZXJiYXRpbX0KLQotSW4gUHl0aG9uIDIuNSwgXGNvZGV7cXVpdH0gYW5kIFxjb2Rle2V4aXR9IGFyZSBub3cgb2JqZWN0cyB0aGF0IHN0aWxsCi1wcm9kdWNlIHN0cmluZyByZXByZXNlbnRhdGlvbnMgb2YgdGhlbXNlbHZlcywgYnV0IGFyZSBhbHNvIGNhbGxhYmxlLgotTmV3YmllcyB3aG8gdHJ5IFxjb2Rle3F1aXQoKX0gb3IgXGNvZGV7ZXhpdCgpfSB3aWxsIG5vdyBleGl0IHRoZQotaW50ZXJwcmV0ZXIgYXMgdGhleSBleHBlY3QuICAoSW1wbGVtZW50ZWQgYnkgR2VvcmcgQnJhbmRsLikKLQotVGhlIFB5dGhvbiBleGVjdXRhYmxlIG5vdyBhY2NlcHRzIHRoZSBzdGFuZGFyZCBsb25nIG9wdGlvbnMgCi1cbG9uZ3Byb2dyYW1vcHR7aGVscH0gYW5kIFxsb25ncHJvZ3JhbW9wdHt2ZXJzaW9ufTsgb24gV2luZG93cywgCi1pdCBhbHNvIGFjY2VwdHMgdGhlIFxwcm9ncmFtb3B0ey8/fSBvcHRpb24gZm9yIGRpc3BsYXlpbmcgYSBoZWxwIG1lc3NhZ2UuCi0oSW1wbGVtZW50ZWQgYnkgR2VvcmcgQnJhbmRsLikKLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHN1YnNlY3Rpb257T3B0aW1pemF0aW9uc1xsYWJlbHtvcHRzfX0KLQotU2V2ZXJhbCBvZiB0aGUgb3B0aW1pemF0aW9ucyB3ZXJlIGRldmVsb3BlZCBhdCB0aGUgTmVlZEZvclNwZWVkCi1zcHJpbnQsIGFuIGV2ZW50IGhlbGQgaW4gUmV5a2phdmlrLCBJY2VsYW5kLCBmcm9tIE1heSAyMS0tMjggMjAwNi4KLVRoZSBzcHJpbnQgZm9jdXNlZCBvbiBzcGVlZCBlbmhhbmNlbWVudHMgdG8gdGhlIENQeXRob24gaW1wbGVtZW50YXRpb24KLWFuZCB3YXMgZnVuZGVkIGJ5IEVXVCBMTEMgd2l0aCBsb2NhbCBzdXBwb3J0IGZyb20gQ0NQIEdhbWVzLiAgVGhvc2UKLW9wdGltaXphdGlvbnMgYWRkZWQgYXQgdGhpcyBzcHJpbnQgYXJlIHNwZWNpYWxseSBtYXJrZWQgaW4gdGhlCi1mb2xsb3dpbmcgbGlzdC4KLQotXGJlZ2lue2l0ZW1pemV9Ci0KLVxpdGVtIFdoZW4gdGhleSB3ZXJlIGludHJvZHVjZWQgCi1pbiBQeXRob24gMi40LCB0aGUgYnVpbHQtaW4gXGNsYXNze3NldH0gYW5kIFxjbGFzc3tmcm96ZW5zZXR9IHR5cGVzCi13ZXJlIGJ1aWx0IG9uIHRvcCBvZiBQeXRob24ncyBkaWN0aW9uYXJ5IHR5cGUuICAKLUluIDIuNSB0aGUgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUgaGFzIGJlZW4gY3VzdG9taXplZCBmb3IgaW1wbGVtZW50aW5nIHNldHMsCi1hbmQgYXMgYSByZXN1bHQgc2V0cyB3aWxsIHVzZSBhIHRoaXJkIGxlc3MgbWVtb3J5IGFuZCBhcmUgc29tZXdoYXQgZmFzdGVyLgotKEltcGxlbWVudGVkIGJ5IFJheW1vbmQgSGV0dGluZ2VyLikKLQotXGl0ZW0gVGhlIHNwZWVkIG9mIHNvbWUgVW5pY29kZSBvcGVyYXRpb25zLCBzdWNoIGFzIGZpbmRpbmcKLXN1YnN0cmluZ3MsIHN0cmluZyBzcGxpdHRpbmcsIGFuZCBjaGFyYWN0ZXIgbWFwIGVuY29kaW5nIGFuZCBkZWNvZGluZywKLWhhcyBiZWVuIGltcHJvdmVkLiAgKFN1YnN0cmluZyBzZWFyY2ggYW5kIHNwbGl0dGluZyBpbXByb3ZlbWVudHMgd2VyZQotYWRkZWQgYnkgRnJlZHJpayBMdW5kaCBhbmQgQW5kcmV3IERhbGtlIGF0IHRoZSBOZWVkRm9yU3BlZWQKLXNwcmludC4gQ2hhcmFjdGVyIG1hcHMgd2VyZSBpbXByb3ZlZCBieSBXYWx0ZXIgRFwib3J3YWxkIGFuZAotTWFydGluIHZvbn5MXCJvd2lzLikKLSUgUGF0Y2ggMTMxMzkzOSwgMTM1OTYxOCAKLQotXGl0ZW0gVGhlIFxmdW5jdGlvbntsb25nKFx2YXJ7c3RyfSwgXHZhcntiYXNlfSl9IGZ1bmN0aW9uIGlzIG5vdwotZmFzdGVyIG9uIGxvbmcgZGlnaXQgc3RyaW5ncyBiZWNhdXNlIGZld2VyIGludGVybWVkaWF0ZSByZXN1bHRzIGFyZQotY2FsY3VsYXRlZC4gIFRoZSBwZWFrIGlzIGZvciBzdHJpbmdzIG9mIGFyb3VuZCA4MDAtLTEwMDAgZGlnaXRzIHdoZXJlIAotdGhlIGZ1bmN0aW9uIGlzIDYgdGltZXMgZmFzdGVyLgotKENvbnRyaWJ1dGVkIGJ5IEFsYW4gTWNJbnR5cmUgYW5kIGNvbW1pdHRlZCBhdCB0aGUgTmVlZEZvclNwZWVkIHNwcmludC4pCi0lIFBhdGNoIDE0NDI5MjcKLQotXGl0ZW0gSXQncyBub3cgaWxsZWdhbCB0byBtaXggaXRlcmF0aW5nIG92ZXIgYSBmaWxlIAotd2l0aCBcY29kZXtmb3IgbGluZSBpbiBcdmFye2ZpbGV9fSBhbmQgY2FsbGluZyAKLXRoZSBmaWxlIG9iamVjdCdzIFxtZXRob2R7cmVhZCgpfS9cbWV0aG9ke3JlYWRsaW5lKCl9L1xtZXRob2R7cmVhZGxpbmVzKCl9Ci1tZXRob2RzLiAgSXRlcmF0aW9uIHVzZXMgYW4gaW50ZXJuYWwgYnVmZmVyIGFuZCB0aGUgCi1cbWV0aG9ke3JlYWQqKCl9IG1ldGhvZHMgZG9uJ3QgdXNlIHRoYXQgYnVmZmVyLiAgCi1JbnN0ZWFkIHRoZXkgd291bGQgcmV0dXJuIHRoZSBkYXRhIGZvbGxvd2luZyB0aGUgYnVmZmVyLCBjYXVzaW5nIHRoZQotZGF0YSB0byBhcHBlYXIgb3V0IG9mIG9yZGVyLiAgTWl4aW5nIGl0ZXJhdGlvbiBhbmQgdGhlc2UgbWV0aG9kcyB3aWxsCi1ub3cgdHJpZ2dlciBhIFxleGNlcHRpb257VmFsdWVFcnJvcn0gZnJvbSB0aGUgXG1ldGhvZHtyZWFkKigpfSBtZXRob2QuCi0oSW1wbGVtZW50ZWQgYnkgVGhvbWFzIFdvdXRlcnMuKQotJSBQYXRjaCAxMzk3OTYwCi0KLVxpdGVtIFRoZSBcbW9kdWxle3N0cnVjdH0gbW9kdWxlIG5vdyBjb21waWxlcyBzdHJ1Y3R1cmUgZm9ybWF0IAotc3RyaW5ncyBpbnRvIGFuIGludGVybmFsIHJlcHJlc2VudGF0aW9uIGFuZCBjYWNoZXMgdGhpcwotcmVwcmVzZW50YXRpb24sIHlpZWxkaW5nIGEgMjBcJSBzcGVlZHVwLiAgKENvbnRyaWJ1dGVkIGJ5IEJvYiBJcHBvbGl0bwotYXQgdGhlIE5lZWRGb3JTcGVlZCBzcHJpbnQuKQotCi1caXRlbSBUaGUgXG1vZHVsZXtyZX0gbW9kdWxlIGdvdCBhIDEgb3IgMlwlIHNwZWVkdXAgYnkgc3dpdGNoaW5nIHRvIAotUHl0aG9uJ3MgYWxsb2NhdG9yIGZ1bmN0aW9ucyBpbnN0ZWFkIG9mIHRoZSBzeXN0ZW0ncyAKLVxjZnVuY3Rpb257bWFsbG9jKCl9IGFuZCBcY2Z1bmN0aW9ue2ZyZWUoKX0uCi0oQ29udHJpYnV0ZWQgYnkgSmFjayBEaWVkZXJpY2ggYXQgdGhlIE5lZWRGb3JTcGVlZCBzcHJpbnQuKQotCi1caXRlbSBUaGUgY29kZSBnZW5lcmF0b3IncyBwZWVwaG9sZSBvcHRpbWl6ZXIgbm93IHBlcmZvcm1zCi1zaW1wbGUgY29uc3RhbnQgZm9sZGluZyBpbiBleHByZXNzaW9ucy4gIElmIHlvdSB3cml0ZSBzb21ldGhpbmcgbGlrZQotXGNvZGV7YSA9IDIrM30sIHRoZSBjb2RlIGdlbmVyYXRvciB3aWxsIGRvIHRoZSBhcml0aG1ldGljIGFuZCBwcm9kdWNlCi1jb2RlIGNvcnJlc3BvbmRpbmcgdG8gXGNvZGV7YSA9IDV9LiAgKFByb3Bvc2VkIGFuZCBpbXBsZW1lbnRlZCAKLWJ5IFJheW1vbmQgSGV0dGluZ2VyLikKLQotXGl0ZW0gRnVuY3Rpb24gY2FsbHMgYXJlIG5vdyBmYXN0ZXIgYmVjYXVzZSBjb2RlIG9iamVjdHMgbm93IGtlZXAgCi10aGUgbW9zdCByZWNlbnRseSBmaW5pc2hlZCBmcmFtZSAoYSBgYHpvbWJpZSBmcmFtZScnKSBpbiBhbiBpbnRlcm5hbAotZmllbGQgb2YgdGhlIGNvZGUgb2JqZWN0LCByZXVzaW5nIGl0IHRoZSBuZXh0IHRpbWUgdGhlIGNvZGUgb2JqZWN0IGlzCi1pbnZva2VkLiAgKE9yaWdpbmFsIHBhdGNoIGJ5IE1pY2hhZWwgSHVkc29uLCBtb2RpZmllZCBieSBBcm1pbiBSaWdvCi1hbmQgUmljaGFyZCBKb25lczsgY29tbWl0dGVkIGF0IHRoZSBOZWVkRm9yU3BlZWQgc3ByaW50LikKLSUgUGF0Y2ggODc2MjA2Ci0KLUZyYW1lIG9iamVjdHMgYXJlIGFsc28gc2xpZ2h0bHkgc21hbGxlciwgd2hpY2ggbWF5IGltcHJvdmUgY2FjaGUgbG9jYWxpdHkKLWFuZCByZWR1Y2UgbWVtb3J5IHVzYWdlIGEgYml0LiAgKENvbnRyaWJ1dGVkIGJ5IE5lYWwgTm9yd2l0ei4pCi0lIFBhdGNoIDEzMzcwNTEKLQotXGl0ZW0gUHl0aG9uJ3MgYnVpbHQtaW4gZXhjZXB0aW9ucyBhcmUgbm93IG5ldy1zdHlsZSBjbGFzc2VzLCBhIGNoYW5nZQotdGhhdCBzcGVlZHMgdXAgaW5zdGFudGlhdGlvbiBjb25zaWRlcmFibHkuICBFeGNlcHRpb24gaGFuZGxpbmcgaW4KLVB5dGhvbiAyLjUgaXMgdGhlcmVmb3JlIGFib3V0IDMwXCUgZmFzdGVyIHRoYW4gaW4gMi40LgotKENvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgSm9uZXMsIEdlb3JnIEJyYW5kbCBhbmQgU2VhbiBSZWlmc2NobmVpZGVyIGF0Ci10aGUgTmVlZEZvclNwZWVkIHNwcmludC4pCi0KLVxpdGVtIEltcG9ydGluZyBub3cgY2FjaGVzIHRoZSBwYXRocyB0cmllZCwgcmVjb3JkaW5nIHdoZXRoZXIgCi10aGV5IGV4aXN0IG9yIG5vdCBzbyB0aGF0IHRoZSBpbnRlcnByZXRlciBtYWtlcyBmZXdlciAKLVxjZnVuY3Rpb257b3BlbigpfSBhbmQgXGNmdW5jdGlvbntzdGF0KCl9IGNhbGxzIG9uIHN0YXJ0dXAuCi0oQ29udHJpYnV0ZWQgYnkgTWFydGluIHZvbn5MXCJvd2lzIGFuZCBHZW9yZyBCcmFuZGwuKQotJSBQYXRjaCA5MjE0NjYKLQotXGVuZHtpdGVtaXplfQotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntOZXcsIEltcHJvdmVkLCBhbmQgUmVtb3ZlZCBNb2R1bGVzXGxhYmVse21vZHVsZXN9fQotCi1UaGUgc3RhbmRhcmQgbGlicmFyeSByZWNlaXZlZCBtYW55IGVuaGFuY2VtZW50cyBhbmQgYnVnIGZpeGVzIGluCi1QeXRob24gMi41LiAgSGVyZSdzIGEgcGFydGlhbCBsaXN0IG9mIHRoZSBtb3N0IG5vdGFibGUgY2hhbmdlcywgc29ydGVkCi1hbHBoYWJldGljYWxseSBieSBtb2R1bGUgbmFtZS4gQ29uc3VsdCB0aGUgXGZpbGV7TWlzYy9ORVdTfSBmaWxlIGluCi10aGUgc291cmNlIHRyZWUgZm9yIGEgbW9yZSBjb21wbGV0ZSBsaXN0IG9mIGNoYW5nZXMsIG9yIGxvb2sgdGhyb3VnaAotdGhlIFNWTiBsb2dzIGZvciBhbGwgdGhlIGRldGFpbHMuCi0KLVxiZWdpbntpdGVtaXplfQotCi1caXRlbSBUaGUgXG1vZHVsZXthdWRpb29wfSBtb2R1bGUgbm93IHN1cHBvcnRzIHRoZSBhLUxBVyBlbmNvZGluZywKLWFuZCB0aGUgY29kZSBmb3IgdS1MQVcgZW5jb2RpbmcgaGFzIGJlZW4gaW1wcm92ZWQuICAoQ29udHJpYnV0ZWQgYnkKLUxhcnMgSW1taXNjaC4pCi0KLVxpdGVtIFRoZSBcbW9kdWxle2NvZGVjc30gbW9kdWxlIGdhaW5lZCBzdXBwb3J0IGZvciBpbmNyZW1lbnRhbAotY29kZWNzLiAgVGhlIFxmdW5jdGlvbntjb2RlYy5sb29rdXAoKX0gZnVuY3Rpb24gbm93Ci1yZXR1cm5zIGEgXGNsYXNze0NvZGVjSW5mb30gaW5zdGFuY2UgaW5zdGVhZCBvZiBhIHR1cGxlLgotXGNsYXNze0NvZGVjSW5mb30gaW5zdGFuY2VzIGJlaGF2ZSBsaWtlIGEgNC10dXBsZSB0byBwcmVzZXJ2ZSBiYWNrd2FyZAotY29tcGF0aWJpbGl0eSBidXQgYWxzbyBoYXZlIHRoZSBhdHRyaWJ1dGVzIFxtZW1iZXJ7ZW5jb2RlfSwKLVxtZW1iZXJ7ZGVjb2RlfSwgXG1lbWJlcntpbmNyZW1lbnRhbGVuY29kZXJ9LCBcbWVtYmVye2luY3JlbWVudGFsZGVjb2Rlcn0sCi1cbWVtYmVye3N0cmVhbXdyaXRlcn0sIGFuZCBcbWVtYmVye3N0cmVhbXJlYWRlcn0uICBJbmNyZW1lbnRhbCBjb2RlY3MgCi1jYW4gcmVjZWl2ZSBpbnB1dCBhbmQgcHJvZHVjZSBvdXRwdXQgaW4gbXVsdGlwbGUgY2h1bmtzOyB0aGUgb3V0cHV0IGlzCi10aGUgc2FtZSBhcyBpZiB0aGUgZW50aXJlIGlucHV0IHdhcyBmZWQgdG8gdGhlIG5vbi1pbmNyZW1lbnRhbCBjb2RlYy4KLVNlZSB0aGUgXG1vZHVsZXtjb2RlY3N9IG1vZHVsZSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLgotKERlc2lnbmVkIGFuZCBpbXBsZW1lbnRlZCBieSBXYWx0ZXIgRFwib3J3YWxkLikKLSUgUGF0Y2ggIDE0MzYxMzAKLQotXGl0ZW0gVGhlIFxtb2R1bGV7Y29sbGVjdGlvbnN9IG1vZHVsZSBnYWluZWQgYSBuZXcgdHlwZSwKLVxjbGFzc3tkZWZhdWx0ZGljdH0sIHRoYXQgc3ViY2xhc3NlcyB0aGUgc3RhbmRhcmQgXGNsYXNze2RpY3R9Ci10eXBlLiAgVGhlIG5ldyB0eXBlIG1vc3RseSBiZWhhdmVzIGxpa2UgYSBkaWN0aW9uYXJ5IGJ1dCBjb25zdHJ1Y3RzIGEKLWRlZmF1bHQgdmFsdWUgd2hlbiBhIGtleSBpc24ndCBwcmVzZW50LCBhdXRvbWF0aWNhbGx5IGFkZGluZyBpdCB0byB0aGUKLWRpY3Rpb25hcnkgZm9yIHRoZSByZXF1ZXN0ZWQga2V5IHZhbHVlLgotCi1UaGUgZmlyc3QgYXJndW1lbnQgdG8gXGNsYXNze2RlZmF1bHRkaWN0fSdzIGNvbnN0cnVjdG9yIGlzIGEgZmFjdG9yeQotZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCB3aGVuZXZlciBhIGtleSBpcyByZXF1ZXN0ZWQgYnV0IG5vdCBmb3VuZC4KLVRoaXMgZmFjdG9yeSBmdW5jdGlvbiByZWNlaXZlcyBubyBhcmd1bWVudHMsIHNvIHlvdSBjYW4gdXNlIGJ1aWx0LWluCi10eXBlIGNvbnN0cnVjdG9ycyBzdWNoIGFzIFxmdW5jdGlvbntsaXN0KCl9IG9yIFxmdW5jdGlvbntpbnQoKX0uICBGb3IKLWV4YW1wbGUsIAoteW91IGNhbiBtYWtlIGFuIGluZGV4IG9mIHdvcmRzIGJhc2VkIG9uIHRoZWlyIGluaXRpYWwgbGV0dGVyIGxpa2UgdGhpczoKLQotXGJlZ2lue3ZlcmJhdGltfQotd29yZHMgPSAiIiJOZWwgbWV6em8gZGVsIGNhbW1pbiBkaSBub3N0cmEgdml0YQotbWkgcml0cm92YWkgcGVyIHVuYSBzZWx2YSBvc2N1cmEKLWNoZSBsYSBkaXJpdHRhIHZpYSBlcmEgc21hcnJpdGEiIiIubG93ZXIoKS5zcGxpdCgpCi0KLWluZGV4ID0gZGVmYXVsdGRpY3QobGlzdCkKLQotZm9yIHcgaW4gd29yZHM6Ci0gICAgaW5pdF9sZXR0ZXIgPSB3WzBdCi0gICAgaW5kZXhbaW5pdF9sZXR0ZXJdLmFwcGVuZCh3KQotXGVuZHt2ZXJiYXRpbX0KLQotUHJpbnRpbmcgXGNvZGV7aW5kZXh9IHJlc3VsdHMgaW4gdGhlIGZvbGxvd2luZyBvdXRwdXQ6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWRlZmF1bHRkaWN0KDx0eXBlICdsaXN0Jz4sIHsnYyc6IFsnY2FtbWluJywgJ2NoZSddLCAnZSc6IFsnZXJhJ10sIAotICAgICAgICAnZCc6IFsnZGVsJywgJ2RpJywgJ2Rpcml0dGEnXSwgJ20nOiBbJ21lenpvJywgJ21pJ10sIAotICAgICAgICAnbCc6IFsnbGEnXSwgJ28nOiBbJ29zY3VyYSddLCAnbic6IFsnbmVsJywgJ25vc3RyYSddLCAKLSAgICAgICAgJ3AnOiBbJ3BlciddLCAncyc6IFsnc2VsdmEnLCAnc21hcnJpdGEnXSwgCi0gICAgICAgICdyJzogWydyaXRyb3ZhaSddLCAndSc6IFsndW5hJ10sICd2JzogWyd2aXRhJywgJ3ZpYSddfQotXGVuZHt2ZXJiYXRpbX0KLQotKENvbnRyaWJ1dGVkIGJ5IEd1aWRvIHZhbn5Sb3NzdW0uKQotCi1caXRlbSBUaGUgXGNsYXNze2RlcXVlfSBkb3VibGUtZW5kZWQgcXVldWUgdHlwZSBzdXBwbGllZCBieSB0aGUKLVxtb2R1bGV7Y29sbGVjdGlvbnN9IG1vZHVsZSBub3cgaGFzIGEgXG1ldGhvZHtyZW1vdmUoXHZhcnt2YWx1ZX0pfQotbWV0aG9kIHRoYXQgcmVtb3ZlcyB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBcdmFye3ZhbHVlfSBpbiB0aGUgcXVldWUsCi1yYWlzaW5nIFxleGNlcHRpb257VmFsdWVFcnJvcn0gaWYgdGhlIHZhbHVlIGlzbid0IGZvdW5kLgotKENvbnRyaWJ1dGVkIGJ5IFJheW1vbmQgSGV0dGluZ2VyLikKLQotXGl0ZW0gTmV3IG1vZHVsZTogVGhlIFxtb2R1bGV7Y29udGV4dGxpYn0gbW9kdWxlIGNvbnRhaW5zIGhlbHBlciBmdW5jdGlvbnMgZm9yIHVzZSAKLXdpdGggdGhlIG5ldyAnXGtleXdvcmR7d2l0aH0nIHN0YXRlbWVudC4gIFNlZQotc2VjdGlvbn5ccmVme21vZHVsZS1jb250ZXh0bGlifSBmb3IgbW9yZSBhYm91dCB0aGlzIG1vZHVsZS4KLQotXGl0ZW0gTmV3IG1vZHVsZTogVGhlIFxtb2R1bGV7Y1Byb2ZpbGV9IG1vZHVsZSBpcyBhIEMgaW1wbGVtZW50YXRpb24gb2YgCi10aGUgZXhpc3RpbmcgXG1vZHVsZXtwcm9maWxlfSBtb2R1bGUgdGhhdCBoYXMgbXVjaCBsb3dlciBvdmVyaGVhZC4KLVRoZSBtb2R1bGUncyBpbnRlcmZhY2UgaXMgdGhlIHNhbWUgYXMgXG1vZHVsZXtwcm9maWxlfTogeW91IHJ1bgotXGNvZGV7Y1Byb2ZpbGUucnVuKCdtYWluKCknKX0gdG8gcHJvZmlsZSBhIGZ1bmN0aW9uLCBjYW4gc2F2ZSBwcm9maWxlCi1kYXRhIHRvIGEgZmlsZSwgZXRjLiAgSXQncyBub3QgeWV0IGtub3duIGlmIHRoZSBIb3RzaG90IHByb2ZpbGVyLAotd2hpY2ggaXMgYWxzbyB3cml0dGVuIGluIEMgYnV0IGRvZXNuJ3QgbWF0Y2ggdGhlIFxtb2R1bGV7cHJvZmlsZX0KLW1vZHVsZSdzIGludGVyZmFjZSwgd2lsbCBjb250aW51ZSB0byBiZSBtYWludGFpbmVkIGluIGZ1dHVyZSB2ZXJzaW9ucwotb2YgUHl0aG9uLiAgKENvbnRyaWJ1dGVkIGJ5IEFybWluIFJpZ28uKQotCi1BbHNvLCB0aGUgXG1vZHVsZXtwc3RhdHN9IG1vZHVsZSBmb3IgYW5hbHl6aW5nIHRoZSBkYXRhIG1lYXN1cmVkIGJ5Ci10aGUgcHJvZmlsZXIgbm93IHN1cHBvcnRzIGRpcmVjdGluZyB0aGUgb3V0cHV0IHRvIGFueSBmaWxlIG9iamVjdAotYnkgc3VwcGx5aW5nIGEgXHZhcntzdHJlYW19IGFyZ3VtZW50IHRvIHRoZSBcY2xhc3N7U3RhdHN9IGNvbnN0cnVjdG9yLgotKENvbnRyaWJ1dGVkIGJ5IFNraXAgTW9udGFuYXJvLikKLQotXGl0ZW0gVGhlIFxtb2R1bGV7Y3N2fSBtb2R1bGUsIHdoaWNoIHBhcnNlcyBmaWxlcyBpbgotY29tbWEtc2VwYXJhdGVkIHZhbHVlIGZvcm1hdCwgcmVjZWl2ZWQgc2V2ZXJhbCBlbmhhbmNlbWVudHMgYW5kIGEKLW51bWJlciBvZiBidWdmaXhlcy4gIFlvdSBjYW4gbm93IHNldCB0aGUgbWF4aW11bSBzaXplIGluIGJ5dGVzIG9mIGEKLWZpZWxkIGJ5IGNhbGxpbmcgdGhlIFxtZXRob2R7Y3N2LmZpZWxkX3NpemVfbGltaXQoXHZhcntuZXdfbGltaXR9KX0KLWZ1bmN0aW9uOyBvbWl0dGluZyB0aGUgXHZhcntuZXdfbGltaXR9IGFyZ3VtZW50IHdpbGwgcmV0dXJuIHRoZQotY3VycmVudGx5LXNldCBsaW1pdC4gIFRoZSBcY2xhc3N7cmVhZGVyfSBjbGFzcyBub3cgaGFzIGEKLVxtZW1iZXJ7bGluZV9udW19IGF0dHJpYnV0ZSB0aGF0IGNvdW50cyB0aGUgbnVtYmVyIG9mIHBoeXNpY2FsIGxpbmVzCi1yZWFkIGZyb20gdGhlIHNvdXJjZTsgcmVjb3JkcyBjYW4gc3BhbiBtdWx0aXBsZSBwaHlzaWNhbCBsaW5lcywgc28KLVxtZW1iZXJ7bGluZV9udW19IGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIHJlY29yZHMgcmVhZC4KLQotVGhlIENTViBwYXJzZXIgaXMgbm93IHN0cmljdGVyIGFib3V0IG11bHRpLWxpbmUgcXVvdGVkCi1maWVsZHMuIFByZXZpb3VzbHksIGlmIGEgbGluZSBlbmRlZCB3aXRoaW4gYSBxdW90ZWQgZmllbGQgd2l0aG91dCBhCi10ZXJtaW5hdGluZyBuZXdsaW5lIGNoYXJhY3RlciwgYSBuZXdsaW5lIHdvdWxkIGJlIGluc2VydGVkIGludG8gdGhlCi1yZXR1cm5lZCBmaWVsZC4gVGhpcyBiZWhhdmlvciBjYXVzZWQgcHJvYmxlbXMgd2hlbiByZWFkaW5nIGZpbGVzIHRoYXQKLWNvbnRhaW5lZCBjYXJyaWFnZSByZXR1cm4gY2hhcmFjdGVycyB3aXRoaW4gZmllbGRzLCBzbyB0aGUgY29kZSB3YXMKLWNoYW5nZWQgdG8gcmV0dXJuIHRoZSBmaWVsZCB3aXRob3V0IGluc2VydGluZyBuZXdsaW5lcy4gQXMgYQotY29uc2VxdWVuY2UsIGlmIG5ld2xpbmVzIGVtYmVkZGVkIHdpdGhpbiBmaWVsZHMgYXJlIGltcG9ydGFudCwgdGhlCi1pbnB1dCBzaG91bGQgYmUgc3BsaXQgaW50byBsaW5lcyBpbiBhIG1hbm5lciB0aGF0IHByZXNlcnZlcyB0aGUKLW5ld2xpbmUgY2hhcmFjdGVycy4KLQotKENvbnRyaWJ1dGVkIGJ5IFNraXAgTW9udGFuYXJvIGFuZCBBbmRyZXcgTWNOYW1hcmEuKQotCi1caXRlbSBUaGUgXGNsYXNze2RhdGV0aW1lfSBjbGFzcyBpbiB0aGUgXG1vZHVsZXtkYXRldGltZX0gCi1tb2R1bGUgbm93IGhhcyBhIFxtZXRob2R7c3RycHRpbWUoXHZhcntzdHJpbmd9LCBcdmFye2Zvcm1hdH0pfSAKLW1ldGhvZCBmb3IgcGFyc2luZyBkYXRlIHN0cmluZ3MsIGNvbnRyaWJ1dGVkIGJ5IEpvc2ggU3BvZXJyaS4KLUl0IHVzZXMgdGhlIHNhbWUgZm9ybWF0IGNoYXJhY3RlcnMgYXMgXGZ1bmN0aW9ue3RpbWUuc3RycHRpbWUoKX0gYW5kCi1cZnVuY3Rpb257dGltZS5zdHJmdGltZSgpfToKLQotXGJlZ2lue3ZlcmJhdGltfQotZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZXRpbWUKLQotdHMgPSBkYXRldGltZS5zdHJwdGltZSgnMTA6MTM6MTUgMjAwNi0wMy0wNycsCi0gICAgICAgICAgICAgICAgICAgICAgICclSDolTTolUyAlWS0lbS0lZCcpCi1cZW5ke3ZlcmJhdGltfQotCi1caXRlbSBUaGUgXG1ldGhvZHtTZXF1ZW5jZU1hdGNoZXIuZ2V0X21hdGNoaW5nX2Jsb2NrcygpfSBtZXRob2QKLWluIHRoZSBcbW9kdWxle2RpZmZsaWJ9IG1vZHVsZSBub3cgZ3VhcmFudGVlcyB0byByZXR1cm4gYSBtaW5pbWFsIGxpc3QKLW9mIGJsb2NrcyBkZXNjcmliaW5nIG1hdGNoaW5nIHN1YnNlcXVlbmNlcy4gIFByZXZpb3VzbHksIHRoZSBhbGdvcml0aG0gd291bGQKLW9jY2FzaW9uYWxseSBicmVhayBhIGJsb2NrIG9mIG1hdGNoaW5nIGVsZW1lbnRzIGludG8gdHdvIGxpc3QgZW50cmllcy4KLShFbmhhbmNlbWVudCBieSBUaW0gUGV0ZXJzLikKLQotXGl0ZW0gVGhlIFxtb2R1bGV7ZG9jdGVzdH0gbW9kdWxlIGdhaW5lZCBhIFxjb2Rle1NLSVB9IG9wdGlvbiB0aGF0Ci1rZWVwcyBhbiBleGFtcGxlIGZyb20gYmVpbmcgZXhlY3V0ZWQgYXQgYWxsLiAgVGhpcyBpcyBpbnRlbmRlZCBmb3IKLWNvZGUgc25pcHBldHMgdGhhdCBhcmUgdXNhZ2UgZXhhbXBsZXMgaW50ZW5kZWQgZm9yIHRoZSByZWFkZXIgYW5kCi1hcmVuJ3QgYWN0dWFsbHkgdGVzdCBjYXNlcy4KLQotQW4gXHZhcntlbmNvZGluZ30gcGFyYW1ldGVyIHdhcyBhZGRlZCB0byB0aGUgXGZ1bmN0aW9ue3Rlc3RmaWxlKCl9Ci1mdW5jdGlvbiBhbmQgdGhlIFxjbGFzc3tEb2NGaWxlU3VpdGV9IGNsYXNzIHRvIHNwZWNpZnkgdGhlIGZpbGUncwotZW5jb2RpbmcuICBUaGlzIG1ha2VzIGl0IGVhc2llciB0byB1c2Ugbm9uLUFTQ0lJIGNoYXJhY3RlcnMgaW4gCi10ZXN0cyBjb250YWluZWQgd2l0aGluIGEgZG9jc3RyaW5nLiAgKENvbnRyaWJ1dGVkIGJ5IEJqb3JuIFRpbGxlbml1cy4pCi0lIFBhdGNoIDEwODA3MjcKLQotXGl0ZW0gVGhlIFxtb2R1bGV7ZW1haWx9IHBhY2thZ2UgaGFzIGJlZW4gdXBkYXRlZCB0byB2ZXJzaW9uIDQuMC4KLSUgWFhYIG5lZWQgdG8gcHJvdmlkZSBzb21lIG1vcmUgZGV0YWlsIGhlcmUKLShDb250cmlidXRlZCBieSBCYXJyeSBXYXJzYXcuKQotCi1caXRlbSBUaGUgXG1vZHVsZXtmaWxlaW5wdXR9IG1vZHVsZSB3YXMgbWFkZSBtb3JlIGZsZXhpYmxlLgotVW5pY29kZSBmaWxlbmFtZXMgYXJlIG5vdyBzdXBwb3J0ZWQsIGFuZCBhIFx2YXJ7bW9kZX0gcGFyYW1ldGVyIHRoYXQKLWRlZmF1bHRzIHRvIFxjb2RleyJyIn0gd2FzIGFkZGVkIHRvIHRoZQotXGZ1bmN0aW9ue2lucHV0KCl9IGZ1bmN0aW9uIHRvIGFsbG93IG9wZW5pbmcgZmlsZXMgaW4gYmluYXJ5IG9yCi11bml2ZXJzYWwtbmV3bGluZSBtb2RlLiAgQW5vdGhlciBuZXcgcGFyYW1ldGVyLCBcdmFye29wZW5ob29rfSwKLWxldHMgeW91IHVzZSBhIGZ1bmN0aW9uIG90aGVyIHRoYW4gXGZ1bmN0aW9ue29wZW4oKX0gCi10byBvcGVuIHRoZSBpbnB1dCBmaWxlcy4gIE9uY2UgeW91J3JlIGl0ZXJhdGluZyBvdmVyIAotdGhlIHNldCBvZiBmaWxlcywgdGhlIFxjbGFzc3tGaWxlSW5wdXR9IG9iamVjdCdzIG5ldwotXG1ldGhvZHtmaWxlbm8oKX0gcmV0dXJucyB0aGUgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgY3VycmVudGx5IG9wZW5lZCBmaWxlLgotKENvbnRyaWJ1dGVkIGJ5IEdlb3JnIEJyYW5kbC4pCi0KLVxpdGVtIEluIHRoZSBcbW9kdWxle2djfSBtb2R1bGUsIHRoZSBuZXcgXGZ1bmN0aW9ue2dldF9jb3VudCgpfSBmdW5jdGlvbgotcmV0dXJucyBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgY3VycmVudCBjb2xsZWN0aW9uIGNvdW50cyBmb3IgdGhlCi10aHJlZSBHQyBnZW5lcmF0aW9ucy4gIFRoaXMgaXMgYWNjb3VudGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGdhcmJhZ2UKLWNvbGxlY3Rvcjsgd2hlbiB0aGVzZSBjb3VudHMgcmVhY2ggYSBzcGVjaWZpZWQgdGhyZXNob2xkLCBhIGdhcmJhZ2UKLWNvbGxlY3Rpb24gc3dlZXAgd2lsbCBiZSBtYWRlLiAgVGhlIGV4aXN0aW5nIFxmdW5jdGlvbntnYy5jb2xsZWN0KCl9Ci1mdW5jdGlvbiBub3cgdGFrZXMgYW4gb3B0aW9uYWwgXHZhcntnZW5lcmF0aW9ufSBhcmd1bWVudCBvZiAwLCAxLCBvciAyCi10byBzcGVjaWZ5IHdoaWNoIGdlbmVyYXRpb24gdG8gY29sbGVjdC4KLShDb250cmlidXRlZCBieSBCYXJyeSBXYXJzYXcuKQotCi1caXRlbSBUaGUgXGZ1bmN0aW9ue25zbWFsbGVzdCgpfSBhbmQgCi1cZnVuY3Rpb257bmxhcmdlc3QoKX0gZnVuY3Rpb25zIGluIHRoZSBcbW9kdWxle2hlYXBxfSBtb2R1bGUgCi1ub3cgc3VwcG9ydCBhIFxjb2Rle2tleX0ga2V5d29yZCBwYXJhbWV0ZXIgc2ltaWxhciB0byB0aGUgb25lCi1wcm92aWRlZCBieSB0aGUgXGZ1bmN0aW9ue21pbigpfS9cZnVuY3Rpb257bWF4KCl9IGZ1bmN0aW9ucwotYW5kIHRoZSBcbWV0aG9ke3NvcnQoKX0gbWV0aG9kcy4gIEZvciBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci0+Pj4gaW1wb3J0IGhlYXBxCi0+Pj4gTCA9IFsic2hvcnQiLCAnbWVkaXVtJywgJ2xvbmdlc3QnLCAnbG9uZ2VyIHN0aWxsJ10KLT4+PiBoZWFwcS5uc21hbGxlc3QoMiwgTCkgICMgUmV0dXJuIHR3byBsb3dlc3QgZWxlbWVudHMsIGxleGljb2dyYXBoaWNhbGx5Ci1bJ2xvbmdlciBzdGlsbCcsICdsb25nZXN0J10KLT4+PiBoZWFwcS5uc21hbGxlc3QoMiwgTCwga2V5PWxlbikgICAjIFJldHVybiB0d28gc2hvcnRlc3QgZWxlbWVudHMKLVsnc2hvcnQnLCAnbWVkaXVtJ10KLVxlbmR7dmVyYmF0aW19Ci0KLShDb250cmlidXRlZCBieSBSYXltb25kIEhldHRpbmdlci4pCi0KLVxpdGVtIFRoZSBcZnVuY3Rpb257aXRlcnRvb2xzLmlzbGljZSgpfSBmdW5jdGlvbiBub3cgYWNjZXB0cwotXGNvZGV7Tm9uZX0gZm9yIHRoZSBzdGFydCBhbmQgc3RlcCBhcmd1bWVudHMuICBUaGlzIG1ha2VzIGl0IG1vcmUKLWNvbXBhdGlibGUgd2l0aCB0aGUgYXR0cmlidXRlcyBvZiBzbGljZSBvYmplY3RzLCBzbyB0aGF0IHlvdSBjYW4gbm93IHdyaXRlCi10aGUgZm9sbG93aW5nOgotCi1cYmVnaW57dmVyYmF0aW19Ci1zID0gc2xpY2UoNSkgICAgICMgQ3JlYXRlIHNsaWNlIG9iamVjdAotaXRlcnRvb2xzLmlzbGljZShpdGVyYWJsZSwgcy5zdGFydCwgcy5zdG9wLCBzLnN0ZXApCi1cZW5ke3ZlcmJhdGltfQotCi0oQ29udHJpYnV0ZWQgYnkgUmF5bW9uZCBIZXR0aW5nZXIuKQotCi1caXRlbSBUaGUgXGZ1bmN0aW9ue2Zvcm1hdCgpfSBmdW5jdGlvbiBpbiB0aGUgXG1vZHVsZXtsb2NhbGV9IG1vZHVsZQotaGFzIGJlZW4gbW9kaWZpZWQgYW5kIHR3byBuZXcgZnVuY3Rpb25zIHdlcmUgYWRkZWQsCi1cZnVuY3Rpb257Zm9ybWF0X3N0cmluZygpfSBhbmQgXGZ1bmN0aW9ue2N1cnJlbmN5KCl9LgotCi1UaGUgXGZ1bmN0aW9ue2Zvcm1hdCgpfSBmdW5jdGlvbidzIFx2YXJ7dmFsfSBwYXJhbWV0ZXIgY291bGQKLXByZXZpb3VzbHkgYmUgYSBzdHJpbmcgYXMgbG9uZyBhcyBubyBtb3JlIHRoYW4gb25lIFwlY2hhciBzcGVjaWZpZXIKLWFwcGVhcmVkOyBub3cgdGhlIHBhcmFtZXRlciBtdXN0IGJlIGV4YWN0bHkgb25lIFwlY2hhciBzcGVjaWZpZXIgd2l0aAotbm8gc3Vycm91bmRpbmcgdGV4dC4gIEFuIG9wdGlvbmFsIFx2YXJ7bW9uZXRhcnl9IHBhcmFtZXRlciB3YXMgYWxzbwotYWRkZWQgd2hpY2gsIGlmIFxjb2Rle1RydWV9LCB3aWxsIHVzZSB0aGUgbG9jYWxlJ3MgcnVsZXMgZm9yCi1mb3JtYXR0aW5nIGN1cnJlbmN5IGluIHBsYWNpbmcgYSBzZXBhcmF0b3IgYmV0d2VlbiBncm91cHMgb2YgdGhyZWUKLWRpZ2l0cy4KLQotVG8gZm9ybWF0IHN0cmluZ3Mgd2l0aCBtdWx0aXBsZSBcJWNoYXIgc3BlY2lmaWVycywgdXNlIHRoZSBuZXcKLVxmdW5jdGlvbntmb3JtYXRfc3RyaW5nKCl9IGZ1bmN0aW9uIHRoYXQgd29ya3MgbGlrZSBcZnVuY3Rpb257Zm9ybWF0KCl9Ci1idXQgYWxzbyBzdXBwb3J0cyBtaXhpbmcgXCVjaGFyIHNwZWNpZmllcnMgd2l0aAotYXJiaXRyYXJ5IHRleHQuCi0KLUEgbmV3IFxmdW5jdGlvbntjdXJyZW5jeSgpfSBmdW5jdGlvbiB3YXMgYWxzbyBhZGRlZCB0aGF0IGZvcm1hdHMgYQotbnVtYmVyIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBsb2NhbGUncyBzZXR0aW5ncy4KLQotKENvbnRyaWJ1dGVkIGJ5IEdlb3JnIEJyYW5kbC4pCi0lIFBhdGNoIDExODAyOTYKLQotXGl0ZW0gVGhlIFxtb2R1bGV7bWFpbGJveH0gbW9kdWxlIHVuZGVyd2VudCBhIG1hc3NpdmUgcmV3cml0ZSB0byBhZGQKLXRoZSBjYXBhYmlsaXR5IHRvIG1vZGlmeSBtYWlsYm94ZXMgaW4gYWRkaXRpb24gdG8gcmVhZGluZyB0aGVtLiAgQSBuZXcKLXNldCBvZiBjbGFzc2VzIHRoYXQgaW5jbHVkZSBcY2xhc3N7bWJveH0sIFxjbGFzc3tNSH0sIGFuZAotXGNsYXNze01haWxkaXJ9IGFyZSB1c2VkIHRvIHJlYWQgbWFpbGJveGVzLCBhbmQgaGF2ZSBhbgotXG1ldGhvZHthZGQoXHZhcnttZXNzYWdlfSl9IG1ldGhvZCB0byBhZGQgbWVzc2FnZXMsCi1cbWV0aG9ke3JlbW92ZShcdmFye2tleX0pfSB0byByZW1vdmUgbWVzc2FnZXMsIGFuZAotXG1ldGhvZHtsb2NrKCl9L1xtZXRob2R7dW5sb2NrKCl9IHRvIGxvY2svdW5sb2NrIHRoZSBtYWlsYm94LiAgVGhlCi1mb2xsb3dpbmcgZXhhbXBsZSBjb252ZXJ0cyBhIG1haWxkaXItZm9ybWF0IG1haWxib3ggaW50byBhbiBtYm94LWZvcm1hdCBvbmU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWltcG9ydCBtYWlsYm94Ci0KLSMgJ2ZhY3Rvcnk9Tm9uZScgdXNlcyBlbWFpbC5NZXNzYWdlLk1lc3NhZ2UgYXMgdGhlIGNsYXNzIHJlcHJlc2VudGluZwotIyBpbmRpdmlkdWFsIG1lc3NhZ2VzLgotc3JjID0gbWFpbGJveC5NYWlsZGlyKCdtYWlsZGlyJywgZmFjdG9yeT1Ob25lKQotZGVzdCA9IG1haWxib3gubWJveCgnL3RtcC9tYm94JykKLQotZm9yIG1zZyBpbiBzcmM6Ci0gICAgZGVzdC5hZGQobXNnKQotXGVuZHt2ZXJiYXRpbX0KLQotKENvbnRyaWJ1dGVkIGJ5IEdyZWdvcnkgSy4gSm9obnNvbi4gIEZ1bmRpbmcgd2FzIHByb3ZpZGVkIGJ5IEdvb2dsZSdzCi0yMDA1IFN1bW1lciBvZiBDb2RlLikKLQotXGl0ZW0gTmV3IG1vZHVsZTogdGhlIFxtb2R1bGV7bXNpbGlifSBtb2R1bGUgYWxsb3dzIGNyZWF0aW5nCi1NaWNyb3NvZnQgSW5zdGFsbGVyIFxmaWxley5tc2l9IGZpbGVzIGFuZCBDQUIgZmlsZXMuICBTb21lIHN1cHBvcnQKLWZvciByZWFkaW5nIHRoZSBcZmlsZXsubXNpfSBkYXRhYmFzZSBpcyBhbHNvIGluY2x1ZGVkLgotKENvbnRyaWJ1dGVkIGJ5IE1hcnRpbiB2b25+TFwib3dpcy4pCi0KLVxpdGVtIFRoZSBcbW9kdWxle25pc30gbW9kdWxlIG5vdyBzdXBwb3J0cyBhY2Nlc3NpbmcgZG9tYWlucyBvdGhlcgotdGhhbiB0aGUgc3lzdGVtIGRlZmF1bHQgZG9tYWluIGJ5IHN1cHBseWluZyBhIFx2YXJ7ZG9tYWlufSBhcmd1bWVudCB0bwotdGhlIFxmdW5jdGlvbntuaXMubWF0Y2goKX0gYW5kIFxmdW5jdGlvbntuaXMubWFwcygpfSBmdW5jdGlvbnMuCi0oQ29udHJpYnV0ZWQgYnkgQmVuIEJlbGwuKQotCi1caXRlbSBUaGUgXG1vZHVsZXtvcGVyYXRvcn0gbW9kdWxlJ3MgXGZ1bmN0aW9ue2l0ZW1nZXR0ZXIoKX0gCi1hbmQgXGZ1bmN0aW9ue2F0dHJnZXR0ZXIoKX0gZnVuY3Rpb25zIG5vdyBzdXBwb3J0IG11bHRpcGxlIGZpZWxkcy4gIAotQSBjYWxsIHN1Y2ggYXMgXGNvZGV7b3BlcmF0b3IuYXR0cmdldHRlcignYScsICdiJyl9Ci13aWxsIHJldHVybiBhIGZ1bmN0aW9uIAotdGhhdCByZXRyaWV2ZXMgdGhlIFxtZW1iZXJ7YX0gYW5kIFxtZW1iZXJ7Yn0gYXR0cmlidXRlcy4gIENvbWJpbmluZyAKLXRoaXMgbmV3IGZlYXR1cmUgd2l0aCB0aGUgXG1ldGhvZHtzb3J0KCl9IG1ldGhvZCdzIFxjb2Rle2tleX0gcGFyYW1ldGVyIAotbGV0cyB5b3UgZWFzaWx5IHNvcnQgbGlzdHMgdXNpbmcgbXVsdGlwbGUgZmllbGRzLgotKENvbnRyaWJ1dGVkIGJ5IFJheW1vbmQgSGV0dGluZ2VyLikKLQotXGl0ZW0gVGhlIFxtb2R1bGV7b3B0cGFyc2V9IG1vZHVsZSB3YXMgdXBkYXRlZCB0byB2ZXJzaW9uIDEuNS4xIG9mIHRoZQotT3B0aWsgbGlicmFyeS4gIFRoZSBcY2xhc3N7T3B0aW9uUGFyc2VyfSBjbGFzcyBnYWluZWQgYW4KLVxtZW1iZXJ7ZXBpbG9nfSBhdHRyaWJ1dGUsIGEgc3RyaW5nIHRoYXQgd2lsbCBiZSBwcmludGVkIGFmdGVyIHRoZQotaGVscCBtZXNzYWdlLCBhbmQgYSBcbWV0aG9ke2Rlc3Ryb3koKX0gbWV0aG9kIHRvIGJyZWFrIHJlZmVyZW5jZQotY3ljbGVzIGNyZWF0ZWQgYnkgdGhlIG9iamVjdC4gKENvbnRyaWJ1dGVkIGJ5IEdyZWcgV2FyZC4pCi0KLVxpdGVtIFRoZSBcbW9kdWxle29zfSBtb2R1bGUgdW5kZXJ3ZW50IHNldmVyYWwgY2hhbmdlcy4gIFRoZQotXG1lbWJlcntzdGF0X2Zsb2F0X3RpbWVzfSB2YXJpYWJsZSBub3cgZGVmYXVsdHMgdG8gdHJ1ZSwgbWVhbmluZyB0aGF0Ci1cZnVuY3Rpb257b3Muc3RhdCgpfSB3aWxsIG5vdyByZXR1cm4gdGltZSB2YWx1ZXMgYXMgZmxvYXRzLiAgKFRoaXMKLWRvZXNuJ3QgbmVjZXNzYXJpbHkgbWVhbiB0aGF0IFxmdW5jdGlvbntvcy5zdGF0KCl9IHdpbGwgcmV0dXJuIHRpbWVzCi10aGF0IGFyZSBwcmVjaXNlIHRvIGZyYWN0aW9ucyBvZiBhIHNlY29uZDsgbm90IGFsbCBzeXN0ZW1zIHN1cHBvcnQKLXN1Y2ggcHJlY2lzaW9uLikKLQotQ29uc3RhbnRzIG5hbWVkIFxtZW1iZXJ7b3MuU0VFS19TRVR9LCBcbWVtYmVye29zLlNFRUtfQ1VSfSwgYW5kCi1cbWVtYmVye29zLlNFRUtfRU5EfSBoYXZlIGJlZW4gYWRkZWQ7IHRoZXNlIGFyZSB0aGUgcGFyYW1ldGVycyB0byB0aGUKLVxmdW5jdGlvbntvcy5sc2VlaygpfSBmdW5jdGlvbi4gIFR3byBuZXcgY29uc3RhbnRzIGZvciBsb2NraW5nIGFyZQotXG1lbWJlcntvcy5PX1NITE9DS30gYW5kIFxtZW1iZXJ7b3MuT19FWExPQ0t9LgotCi1Ud28gbmV3IGZ1bmN0aW9ucywgXGZ1bmN0aW9ue3dhaXQzKCl9IGFuZCBcZnVuY3Rpb257d2FpdDQoKX0sIHdlcmUKLWFkZGVkLiAgVGhleSdyZSBzaW1pbGFyIHRoZSBcZnVuY3Rpb257d2FpdHBpZCgpfSBmdW5jdGlvbiB3aGljaCB3YWl0cwotZm9yIGEgY2hpbGQgcHJvY2VzcyB0byBleGl0IGFuZCByZXR1cm5zIGEgdHVwbGUgb2YgdGhlIHByb2Nlc3MgSUQgYW5kCi1pdHMgZXhpdCBzdGF0dXMsIGJ1dCBcZnVuY3Rpb257d2FpdDMoKX0gYW5kIFxmdW5jdGlvbnt3YWl0NCgpfSByZXR1cm4KLWFkZGl0aW9uYWwgaW5mb3JtYXRpb24uICBcZnVuY3Rpb257d2FpdDMoKX0gZG9lc24ndCB0YWtlIGEgcHJvY2VzcyBJRAotYXMgaW5wdXQsIHNvIGl0IHdhaXRzIGZvciBhbnkgY2hpbGQgcHJvY2VzcyB0byBleGl0IGFuZCByZXR1cm5zIGEKLTMtdHVwbGUgb2YgXHZhcntwcm9jZXNzLWlkfSwgXHZhcntleGl0LXN0YXR1c30sIFx2YXJ7cmVzb3VyY2UtdXNhZ2V9Ci1hcyByZXR1cm5lZCBmcm9tIHRoZSBcZnVuY3Rpb257cmVzb3VyY2UuZ2V0cnVzYWdlKCl9IGZ1bmN0aW9uLgotXGZ1bmN0aW9ue3dhaXQ0KFx2YXJ7cGlkfSl9IGRvZXMgdGFrZSBhIHByb2Nlc3MgSUQuCi0oQ29udHJpYnV0ZWQgYnkgQ2hhZCBKLiBTY2hyb2VkZXIuKQotCi1PbiBGcmVlQlNELCB0aGUgXGZ1bmN0aW9ue29zLnN0YXQoKX0gZnVuY3Rpb24gbm93IHJldHVybnMgCi10aW1lcyB3aXRoIG5hbm9zZWNvbmQgcmVzb2x1dGlvbiwgYW5kIHRoZSByZXR1cm5lZCBvYmplY3QKLW5vdyBoYXMgXG1lbWJlcntzdF9nZW59IGFuZCBcbWVtYmVye3N0X2JpcnRodGltZX0uCi1UaGUgXG1lbWJlcntzdF9mbGFnc30gbWVtYmVyIGlzIGFsc28gYXZhaWxhYmxlLCBpZiB0aGUgcGxhdGZvcm0gc3VwcG9ydHMgaXQuCi0oQ29udHJpYnV0ZWQgYnkgQW50dGkgTG91a28gYW5kICBEaWVnbyBQZXR0ZW5cYG8uKQotJSAoUGF0Y2ggMTE4MDY5NSwgMTIxMjExNykKLQotXGl0ZW0gVGhlIFB5dGhvbiBkZWJ1Z2dlciBwcm92aWRlZCBieSB0aGUgXG1vZHVsZXtwZGJ9IG1vZHVsZQotY2FuIG5vdyBzdG9yZSBsaXN0cyBvZiBjb21tYW5kcyB0byBleGVjdXRlIHdoZW4gYSBicmVha3BvaW50IGlzCi1yZWFjaGVkIGFuZCBleGVjdXRpb24gc3RvcHMuICBPbmNlIGJyZWFrcG9pbnQgXCMxIGhhcyBiZWVuIGNyZWF0ZWQsCi1lbnRlciBcc2FtcHtjb21tYW5kcyAxfSBhbmQgZW50ZXIgYSBzZXJpZXMgb2YgY29tbWFuZHMgdG8gYmUgZXhlY3V0ZWQsCi1maW5pc2hpbmcgdGhlIGxpc3Qgd2l0aCBcc2FtcHtlbmR9LiAgVGhlIGNvbW1hbmQgbGlzdCBjYW4gaW5jbHVkZQotY29tbWFuZHMgdGhhdCByZXN1bWUgZXhlY3V0aW9uLCBzdWNoIGFzIFxzYW1we2NvbnRpbnVlfSBvcgotXHNhbXB7bmV4dH0uICAoQ29udHJpYnV0ZWQgYnkgR3JcJ2Vnb2lyZSBEb29tcy4pCi0lIFBhdGNoIDc5MDcxMAotCi1caXRlbSBUaGUgXG1vZHVsZXtwaWNrbGV9IGFuZCBcbW9kdWxle2NQaWNrbGV9IG1vZHVsZXMgbm8KLWxvbmdlciBhY2NlcHQgYSByZXR1cm4gdmFsdWUgb2YgXGNvZGV7Tm9uZX0gZnJvbSB0aGUKLVxtZXRob2R7X19yZWR1Y2VfXygpfSBtZXRob2Q7IHRoZSBtZXRob2QgbXVzdCByZXR1cm4gYSB0dXBsZSBvZgotYXJndW1lbnRzIGluc3RlYWQuICBUaGUgYWJpbGl0eSB0byByZXR1cm4gXGNvZGV7Tm9uZX0gd2FzIGRlcHJlY2F0ZWQKLWluIFB5dGhvbiAyLjQsIHNvIHRoaXMgY29tcGxldGVzIHRoZSByZW1vdmFsIG9mIHRoZSBmZWF0dXJlLgotCi1caXRlbSBUaGUgXG1vZHVsZXtwa2d1dGlsfSBtb2R1bGUsIGNvbnRhaW5pbmcgdmFyaW91cyB1dGlsaXR5Ci1mdW5jdGlvbnMgZm9yIGZpbmRpbmcgcGFja2FnZXMsIHdhcyBlbmhhbmNlZCB0byBzdXBwb3J0IFBFUCAzMDIncwotaW1wb3J0IGhvb2tzIGFuZCBub3cgYWxzbyB3b3JrcyBmb3IgcGFja2FnZXMgc3RvcmVkIGluIFpJUC1mb3JtYXQgYXJjaGl2ZXMuCi0oQ29udHJpYnV0ZWQgYnkgUGhpbGxpcCBKLiBFYnkuKQotCi1caXRlbSBUaGUgcHliZW5jaCBiZW5jaG1hcmsgc3VpdGUgYnkgTWFyYy1BbmRyXCdlfkxlbWJ1cmcgaXMgbm93Ci1pbmNsdWRlZCBpbiB0aGUgXGZpbGV7VG9vbHMvcHliZW5jaH0gZGlyZWN0b3J5LiAgVGhlIHB5YmVuY2ggc3VpdGUgaXMKLWFuIGltcHJvdmVtZW50IG9uIHRoZSBjb21tb25seSB1c2VkIFxmaWxle3B5c3RvbmUucHl9IHByb2dyYW0gYmVjYXVzZQotcHliZW5jaCBwcm92aWRlcyBhIG1vcmUgZGV0YWlsZWQgbWVhc3VyZW1lbnQgb2YgdGhlIGludGVycHJldGVyJ3MKLXNwZWVkLiAgSXQgdGltZXMgcGFydGljdWxhciBvcGVyYXRpb25zIHN1Y2ggYXMgZnVuY3Rpb24gY2FsbHMsCi10dXBsZSBzbGljaW5nLCBtZXRob2QgbG9va3VwcywgYW5kIG51bWVyaWMgb3BlcmF0aW9ucywgaW5zdGVhZCBvZgotcGVyZm9ybWluZyBtYW55IGRpZmZlcmVudCBvcGVyYXRpb25zIGFuZCByZWR1Y2luZyB0aGUgcmVzdWx0IHRvIGEKLXNpbmdsZSBudW1iZXIgYXMgXGZpbGV7cHlzdG9uZS5weX0gZG9lcy4KLQotXGl0ZW0gVGhlIFxtb2R1bGV7cHlleHBhdH0gbW9kdWxlIG5vdyB1c2VzIHZlcnNpb24gMi4wIG9mIHRoZSBFeHBhdCBwYXJzZXIuCi0oQ29udHJpYnV0ZWQgYnkgVHJlbnQgTWljay4pCi0KLVxpdGVtIFRoZSBcY2xhc3N7UXVldWV9IGNsYXNzIHByb3ZpZGVkIGJ5IHRoZSBcbW9kdWxle1F1ZXVlfSBtb2R1bGUKLWdhaW5lZCB0d28gbmV3IG1ldGhvZHMuICBcbWV0aG9ke2pvaW4oKX0gYmxvY2tzIHVudGlsIGFsbCBpdGVtcyBpbgotdGhlIHF1ZXVlIGhhdmUgYmVlbiByZXRyaWV2ZWQgYW5kIGFsbCBwcm9jZXNzaW5nIHdvcmsgb24gdGhlIGl0ZW1zIAotaGF2ZSBiZWVuIGNvbXBsZXRlZC4gIFdvcmtlciB0aHJlYWRzIGNhbGwgdGhlIG90aGVyIG5ldyBtZXRob2QsIAotXG1ldGhvZHt0YXNrX2RvbmUoKX0sIHRvIHNpZ25hbCB0aGF0IHByb2Nlc3NpbmcgZm9yIGFuIGl0ZW0gaGFzIGJlZW4KLWNvbXBsZXRlZC4gIChDb250cmlidXRlZCBieSBSYXltb25kIEhldHRpbmdlci4pCi0KLVxpdGVtIFRoZSBvbGQgXG1vZHVsZXtyZWdleH0gYW5kIFxtb2R1bGV7cmVnc3VifSBtb2R1bGVzLCB3aGljaCBoYXZlIGJlZW4gCi1kZXByZWNhdGVkIGV2ZXIgc2luY2UgUHl0aG9uIDIuMCwgaGF2ZSBmaW5hbGx5IGJlZW4gZGVsZXRlZC4gIAotT3RoZXIgZGVsZXRlZCBtb2R1bGVzOiBcbW9kdWxle3N0YXRjYWNoZX0sIFxtb2R1bGV7dHpwYXJzZX0sCi1cbW9kdWxle3docmFuZG9tfS4KLQotXGl0ZW0gQWxzbyBkZWxldGVkOiB0aGUgXGZpbGV7bGliLW9sZH0gZGlyZWN0b3J5LAotd2hpY2ggaW5jbHVkZXMgYW5jaWVudCBtb2R1bGVzIHN1Y2ggYXMgXG1vZHVsZXtkaXJjbXB9IGFuZAotXG1vZHVsZXtuaX0sIHdhcyByZW1vdmVkLiAgXGZpbGV7bGliLW9sZH0gd2Fzbid0IG9uIHRoZSBkZWZhdWx0Ci1cY29kZXtzeXMucGF0aH0sIHNvIHVubGVzcyB5b3VyIHByb2dyYW1zIGV4cGxpY2l0bHkgYWRkZWQgdGhlIGRpcmVjdG9yeSB0byAKLVxjb2Rle3N5cy5wYXRofSwgdGhpcyByZW1vdmFsIHNob3VsZG4ndCBhZmZlY3QgeW91ciBjb2RlLgotCi1caXRlbSBUaGUgXG1vZHVsZXtybGNvbXBsZXRlcn0gbW9kdWxlIGlzIG5vIGxvbmdlciAKLWRlcGVuZGVudCBvbiBpbXBvcnRpbmcgdGhlIFxtb2R1bGV7cmVhZGxpbmV9IG1vZHVsZSBhbmQKLXRoZXJlZm9yZSBub3cgd29ya3Mgb24gbm9uLXtcVU5JWH0gcGxhdGZvcm1zLgotKFBhdGNoIGZyb20gUm9iZXJ0IEtpZW5kbC4pCi0lIFBhdGNoICMxNDcyODU0Ci0KLVxpdGVtIFRoZSBcbW9kdWxle1NpbXBsZVhNTFJQQ1NlcnZlcn0gYW5kIFxtb2R1bGV7RG9jWE1MUlBDU2VydmVyfSAKLWNsYXNzZXMgbm93IGhhdmUgYSBcbWVtYmVye3JwY19wYXRoc30gYXR0cmlidXRlIHRoYXQgY29uc3RyYWlucwotWE1MLVJQQyBvcGVyYXRpb25zIHRvIGEgbGltaXRlZCBzZXQgb2YgVVJMIHBhdGhzOyB0aGUgZGVmYXVsdCBpcwotdG8gYWxsb3cgb25seSBcY29kZXsnLyd9IGFuZCBcY29kZXsnL1JQQzInfS4gIFNldHRpbmcgCi1cbWVtYmVye3JwY19wYXRoc30gdG8gXGNvZGV7Tm9uZX0gb3IgYW4gZW1wdHkgdHVwbGUgZGlzYWJsZXMgCi10aGlzIHBhdGggY2hlY2tpbmcuCi0lIEJ1ZyAjMTQ3MzA0OAotCi1caXRlbSBUaGUgXG1vZHVsZXtzb2NrZXR9IG1vZHVsZSBub3cgc3VwcG9ydHMgXGNvbnN0YW50e0FGX05FVExJTkt9Ci1zb2NrZXRzIG9uIExpbnV4LCB0aGFua3MgdG8gYSBwYXRjaCBmcm9tIFBoaWxpcHBlIEJpb25kaS4gIAotTmV0bGluayBzb2NrZXRzIGFyZSBhIExpbnV4LXNwZWNpZmljIG1lY2hhbmlzbSBmb3IgY29tbXVuaWNhdGlvbnMKLWJldHdlZW4gYSB1c2VyLXNwYWNlIHByb2Nlc3MgYW5kIGtlcm5lbCBjb2RlOyBhbiBpbnRyb2R1Y3RvcnkgCi1hcnRpY2xlIGFib3V0IHRoZW0gaXMgYXQgXHVybHtodHRwOi8vd3d3LmxpbnV4am91cm5hbC5jb20vYXJ0aWNsZS83MzU2fS4KLUluIFB5dGhvbiBjb2RlLCBuZXRsaW5rIGFkZHJlc3NlcyBhcmUgcmVwcmVzZW50ZWQgYXMgYSB0dXBsZSBvZiAyIGludGVnZXJzLCAKLVxjb2RleyhcdmFye3BpZH0sIFx2YXJ7Z3JvdXBfbWFza30pfS4KLQotVHdvIG5ldyBtZXRob2RzIG9uIHNvY2tldCBvYmplY3RzLCBcbWV0aG9ke3JlY3ZfaW50byhcdmFye2J1ZmZlcn0pfSBhbmQKLVxtZXRob2R7cmVjdmZyb21faW50byhcdmFye2J1ZmZlcn0pfSwgc3RvcmUgdGhlIHJlY2VpdmVkIGRhdGEgaW4gYW4gb2JqZWN0IAotdGhhdCBzdXBwb3J0cyB0aGUgYnVmZmVyIHByb3RvY29sIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBkYXRhIGFzIGEKLXN0cmluZy4gIFRoaXMgbWVhbnMgeW91IGNhbiBwdXQgdGhlIGRhdGEgZGlyZWN0bHkgaW50byBhbiBhcnJheSBvciBhCi1tZW1vcnktbWFwcGVkIGZpbGUuCi0KLVNvY2tldCBvYmplY3RzIGFsc28gZ2FpbmVkIFxtZXRob2R7Z2V0ZmFtaWx5KCl9LCBcbWV0aG9ke2dldHR5cGUoKX0sCi1hbmQgXG1ldGhvZHtnZXRwcm90bygpfSBhY2Nlc3NvciBtZXRob2RzIHRvIHJldHJpZXZlIHRoZSBmYW1pbHksIHR5cGUsCi1hbmQgcHJvdG9jb2wgdmFsdWVzIGZvciB0aGUgc29ja2V0LgotCi1caXRlbSBOZXcgbW9kdWxlOiB0aGUgXG1vZHVsZXtzcHdkfSBtb2R1bGUgcHJvdmlkZXMgZnVuY3Rpb25zIGZvcgotYWNjZXNzaW5nIHRoZSBzaGFkb3cgcGFzc3dvcmQgZGF0YWJhc2Ugb24gc3lzdGVtcyB0aGF0IHN1cHBvcnQgCi1zaGFkb3cgcGFzc3dvcmRzLgotCi1caXRlbSBUaGUgXG1vZHVsZXtzdHJ1Y3R9IGlzIG5vdyBmYXN0ZXIgYmVjYXVzZSBpdCAKLWNvbXBpbGVzIGZvcm1hdCBzdHJpbmdzIGludG8gXGNsYXNze1N0cnVjdH0gb2JqZWN0cwotd2l0aCBcbWV0aG9ke3BhY2soKX0gYW5kIFxtZXRob2R7dW5wYWNrKCl9IG1ldGhvZHMuICBUaGlzIGlzIHNpbWlsYXIKLXRvIGhvdyB0aGUgXG1vZHVsZXtyZX0gbW9kdWxlIGxldHMgeW91IGNyZWF0ZSBjb21waWxlZCByZWd1bGFyCi1leHByZXNzaW9uIG9iamVjdHMuICBZb3UgY2FuIHN0aWxsIHVzZSB0aGUgbW9kdWxlLWxldmVsIAotXGZ1bmN0aW9ue3BhY2soKX0gYW5kIFxmdW5jdGlvbnt1bnBhY2soKX0gZnVuY3Rpb25zOyB0aGV5J2xsIGNyZWF0ZSAKLVxjbGFzc3tTdHJ1Y3R9IG9iamVjdHMgYW5kIGNhY2hlIHRoZW0uICBPciB5b3UgY2FuIHVzZSAKLVxjbGFzc3tTdHJ1Y3R9IGluc3RhbmNlcyBkaXJlY3RseToKLQotXGJlZ2lue3ZlcmJhdGltfQotcyA9IHN0cnVjdC5TdHJ1Y3QoJ2loM3MnKQotCi1kYXRhID0gcy5wYWNrKDE5NzIsIDE4NywgJ2FiYycpCi15ZWFyLCBudW1iZXIsIG5hbWUgPSBzLnVucGFjayhkYXRhKQotXGVuZHt2ZXJiYXRpbX0KLQotWW91IGNhbiBhbHNvIHBhY2sgYW5kIHVucGFjayBkYXRhIHRvIGFuZCBmcm9tIGJ1ZmZlciBvYmplY3RzIGRpcmVjdGx5Ci11c2luZyB0aGUgXG1ldGhvZHtwYWNrX2ludG8oXHZhcntidWZmZXJ9LCBcdmFye29mZnNldH0sIFx2YXJ7djF9LAotXHZhcnt2Mn0sIC4uLil9IGFuZCBcbWV0aG9ke3VucGFja19mcm9tKFx2YXJ7YnVmZmVyfSwgXHZhcntvZmZzZXR9KX0KLW1ldGhvZHMuICBUaGlzIGxldHMgeW91IHN0b3JlIGRhdGEgZGlyZWN0bHkgaW50byBhbiBhcnJheSBvciBhCi1tZW1vcnktbWFwcGVkIGZpbGUuCi0KLShcY2xhc3N7U3RydWN0fSBvYmplY3RzIHdlcmUgaW1wbGVtZW50ZWQgYnkgQm9iIElwcG9saXRvIGF0IHRoZQotTmVlZEZvclNwZWVkIHNwcmludC4gIFN1cHBvcnQgZm9yIGJ1ZmZlciBvYmplY3RzIHdhcyBhZGRlZCBieSBNYXJ0aW4KLUJsYWlzLCBhbHNvIGF0IHRoZSBOZWVkRm9yU3BlZWQgc3ByaW50LikKLQotXGl0ZW0gVGhlIFB5dGhvbiBkZXZlbG9wZXJzIHN3aXRjaGVkIGZyb20gQ1ZTIHRvIFN1YnZlcnNpb24gZHVyaW5nIHRoZSAyLjUKLWRldmVsb3BtZW50IHByb2Nlc3MuICBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZXhhY3QgYnVpbGQgdmVyc2lvbiBpcwotYXZhaWxhYmxlIGFzIHRoZSBcY29kZXtzeXMuc3VidmVyc2lvbn0gdmFyaWFibGUsIGEgMy10dXBsZSBvZgotXGNvZGV7KFx2YXJ7aW50ZXJwcmV0ZXItbmFtZX0sIFx2YXJ7YnJhbmNoLW5hbWV9LAotXHZhcntyZXZpc2lvbi1yYW5nZX0pfS4gIEZvciBleGFtcGxlLCBhdCB0aGUgdGltZSBvZiB3cml0aW5nIG15IGNvcHkKLW9mIDIuNSB3YXMgcmVwb3J0aW5nIFxjb2RleygnQ1B5dGhvbicsICd0cnVuaycsICc0NTMxMzo0NTMxNScpfS4KLQotVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB0byBDIGV4dGVuc2lvbnMgdmlhIHRoZSAKLVxjZnVuY3Rpb257UHlfR2V0QnVpbGRJbmZvKCl9IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIAotc3RyaW5nIG9mIGJ1aWxkIGluZm9ybWF0aW9uIGxpa2UgdGhpczoKLVxjb2RleyJ0cnVuazo0NTM1NTo0NTM1Nk0sIEFwciAxMyAyMDA2LCAwNzo0MjoxOSJ9LiAgCi0oQ29udHJpYnV0ZWQgYnkgQmFycnkgV2Fyc2F3LikKLQotXGl0ZW0gQW5vdGhlciBuZXcgZnVuY3Rpb24sIFxmdW5jdGlvbntzeXMuX2N1cnJlbnRfZnJhbWVzKCl9LCByZXR1cm5zCi10aGUgY3VycmVudCBzdGFjayBmcmFtZXMgZm9yIGFsbCBydW5uaW5nIHRocmVhZHMgYXMgYSBkaWN0aW9uYXJ5Ci1tYXBwaW5nIHRocmVhZCBpZGVudGlmaWVycyB0byB0aGUgdG9wbW9zdCBzdGFjayBmcmFtZSBjdXJyZW50bHkgYWN0aXZlCi1pbiB0aGF0IHRocmVhZCBhdCB0aGUgdGltZSB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLiAgKENvbnRyaWJ1dGVkIGJ5Ci1UaW0gUGV0ZXJzLikKLQotXGl0ZW0gVGhlIFxjbGFzc3tUYXJGaWxlfSBjbGFzcyBpbiB0aGUgXG1vZHVsZXt0YXJmaWxlfSBtb2R1bGUgbm93IGhhcwotYW4gXG1ldGhvZHtleHRyYWN0YWxsKCl9IG1ldGhvZCB0aGF0IGV4dHJhY3RzIGFsbCBtZW1iZXJzIGZyb20gdGhlCi1hcmNoaXZlIGludG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuICBJdCdzIGFsc28gcG9zc2libGUgdG8gc2V0Ci1hIGRpZmZlcmVudCBkaXJlY3RvcnkgYXMgdGhlIGV4dHJhY3Rpb24gdGFyZ2V0LCBhbmQgdG8gdW5wYWNrIG9ubHkgYQotc3Vic2V0IG9mIHRoZSBhcmNoaXZlJ3MgbWVtYmVycy4KLQotVGhlIGNvbXByZXNzaW9uIHVzZWQgZm9yIGEgdGFyZmlsZSBvcGVuZWQgaW4gc3RyZWFtIG1vZGUgY2FuIG5vdyBiZQotYXV0b2RldGVjdGVkIHVzaW5nIHRoZSBtb2RlIFxjb2RleydyfConfS4KLSUgcGF0Y2ggOTE4MTAxCi0oQ29udHJpYnV0ZWQgYnkgTGFycyBHdXN0XCJhYmVsLikKLQotXGl0ZW0gVGhlIFxtb2R1bGV7dGhyZWFkaW5nfSBtb2R1bGUgbm93IGxldHMgeW91IHNldCB0aGUgc3RhY2sgc2l6ZQotdXNlZCB3aGVuIG5ldyB0aHJlYWRzIGFyZSBjcmVhdGVkLiBUaGUKLVxmdW5jdGlvbntzdGFja19zaXplKFxvcHRpb25hbHtcdmFye3NpemV9fSl9IGZ1bmN0aW9uIHJldHVybnMgdGhlCi1jdXJyZW50bHkgY29uZmlndXJlZCBzdGFjayBzaXplLCBhbmQgc3VwcGx5aW5nIHRoZSBvcHRpb25hbCBcdmFye3NpemV9Ci1wYXJhbWV0ZXIgc2V0cyBhIG5ldyB2YWx1ZS4gIE5vdCBhbGwgcGxhdGZvcm1zIHN1cHBvcnQgY2hhbmdpbmcgdGhlCi1zdGFjayBzaXplLCBidXQgV2luZG93cywgUE9TSVggdGhyZWFkaW5nLCBhbmQgT1MvMiBhbGwgZG8uCi0oQ29udHJpYnV0ZWQgYnkgQW5kcmV3IE1hY0ludHlyZS4pCi0lIFBhdGNoIDE0NTQ0ODEKLQotXGl0ZW0gVGhlIFxtb2R1bGV7dW5pY29kZWRhdGF9IG1vZHVsZSBoYXMgYmVlbiB1cGRhdGVkIHRvIHVzZSB2ZXJzaW9uIDQuMS4wCi1vZiB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgZGF0YWJhc2UuICBWZXJzaW9uIDMuMi4wIGlzIHJlcXVpcmVkIAotYnkgc29tZSBzcGVjaWZpY2F0aW9ucywgc28gaXQncyBzdGlsbCBhdmFpbGFibGUgYXMgCi1cbWVtYmVye3VuaWNvZGVkYXRhLnVjZF8zXzJfMH0uCi0KLVxpdGVtIE5ldyBtb2R1bGU6IHRoZSAgXG1vZHVsZXt1dWlkfSBtb2R1bGUgZ2VuZXJhdGVzIAotdW5pdmVyc2FsbHkgdW5pcXVlIGlkZW50aWZpZXJzIChVVUlEcykgYWNjb3JkaW5nIHRvIFxyZmN7NDEyMn0uICBUaGUKLVJGQyBkZWZpbmVzIHNldmVyYWwgZGlmZmVyZW50IFVVSUQgdmVyc2lvbnMgdGhhdCBhcmUgZ2VuZXJhdGVkIGZyb20gYQotc3RhcnRpbmcgc3RyaW5nLCBmcm9tIHN5c3RlbSBwcm9wZXJ0aWVzLCBvciBwdXJlbHkgcmFuZG9tbHkuICBUaGlzCi1tb2R1bGUgY29udGFpbnMgYSBcY2xhc3N7VVVJRH0gY2xhc3MgYW5kIAotZnVuY3Rpb25zIG5hbWVkIFxmdW5jdGlvbnt1dWlkMSgpfSwKLVxmdW5jdGlvbnt1dWlkMygpfSwgXGZ1bmN0aW9ue3V1aWQ0KCl9LCAgYW5kIAotXGZ1bmN0aW9ue3V1aWQ1KCl9IHRvIGdlbmVyYXRlIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBVVUlELiAgKFZlcnNpb24gMiBVVUlEcyAKLWFyZSBub3Qgc3BlY2lmaWVkIGluIFxyZmN7NDEyMn0gYW5kIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgbW9kdWxlLikKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGltcG9ydCB1dWlkCi0+Pj4gIyBtYWtlIGEgVVVJRCBiYXNlZCBvbiB0aGUgaG9zdCBJRCBhbmQgY3VycmVudCB0aW1lCi0+Pj4gdXVpZC51dWlkMSgpCi1VVUlEKCdhODA5OGMxYS1mODZlLTExZGEtYmQxYS0wMDExMjQ0NGJlMWUnKQotCi0+Pj4gIyBtYWtlIGEgVVVJRCB1c2luZyBhbiBNRDUgaGFzaCBvZiBhIG5hbWVzcGFjZSBVVUlEIGFuZCBhIG5hbWUKLT4+PiB1dWlkLnV1aWQzKHV1aWQuTkFNRVNQQUNFX0ROUywgJ3B5dGhvbi5vcmcnKQotVVVJRCgnNmZhNDU5ZWEtZWU4YS0zY2E0LTg5NGUtZGI3N2UxNjAzNTVlJykKLQotPj4+ICMgbWFrZSBhIHJhbmRvbSBVVUlECi0+Pj4gdXVpZC51dWlkNCgpCi1VVUlEKCcxNmZkMjcwNi04YmFmLTQzM2ItODJlYi04YzdmYWRhODQ3ZGEnKQotCi0+Pj4gIyBtYWtlIGEgVVVJRCB1c2luZyBhIFNIQS0xIGhhc2ggb2YgYSBuYW1lc3BhY2UgVVVJRCBhbmQgYSBuYW1lCi0+Pj4gdXVpZC51dWlkNSh1dWlkLk5BTUVTUEFDRV9ETlMsICdweXRob24ub3JnJykKLVVVSUQoJzg4NjMxM2UxLTNiOGEtNTM3Mi05YjkwLTBjOWFlZTE5OWU1ZCcpCi1cZW5ke3ZlcmJhdGltfQotCi0oQ29udHJpYnV0ZWQgYnkgS2EtUGluZyBZZWUuKQotCi1caXRlbSBUaGUgXG1vZHVsZXt3ZWFrcmVmfSBtb2R1bGUncyBcY2xhc3N7V2Vha0tleURpY3Rpb25hcnl9IGFuZAotXGNsYXNze1dlYWtWYWx1ZURpY3Rpb25hcnl9IHR5cGVzIGdhaW5lZCBuZXcgbWV0aG9kcyBmb3IgaXRlcmF0aW5nCi1vdmVyIHRoZSB3ZWFrIHJlZmVyZW5jZXMgY29udGFpbmVkIGluIHRoZSBkaWN0aW9uYXJ5LiAKLVxtZXRob2R7aXRlcmtleXJlZnMoKX0gYW5kIFxtZXRob2R7a2V5cmVmcygpfSBtZXRob2RzIHdlcmUKLWFkZGVkIHRvIFxjbGFzc3tXZWFrS2V5RGljdGlvbmFyeX0sIGFuZAotXG1ldGhvZHtpdGVydmFsdWVyZWZzKCl9IGFuZCBcbWV0aG9ke3ZhbHVlcmVmcygpfSB3ZXJlIGFkZGVkIHRvCi1cY2xhc3N7V2Vha1ZhbHVlRGljdGlvbmFyeX0uICAoQ29udHJpYnV0ZWQgYnkgRnJlZCBMLn5EcmFrZSwgSnIuKQotCi1caXRlbSBUaGUgXG1vZHVsZXt3ZWJicm93c2VyfSBtb2R1bGUgcmVjZWl2ZWQgYSBudW1iZXIgb2YKLWVuaGFuY2VtZW50cy4KLUl0J3Mgbm93IHVzYWJsZSBhcyBhIHNjcmlwdCB3aXRoIFxjb2Rle3B5dGhvbiAtbSB3ZWJicm93c2VyfSwgdGFraW5nIGEKLVVSTCBhcyB0aGUgYXJndW1lbnQ7IHRoZXJlIGFyZSBhIG51bWJlciBvZiBzd2l0Y2hlcyAKLXRvIGNvbnRyb2wgdGhlIGJlaGF2aW91ciAoXHByb2dyYW1vcHR7LW59IGZvciBhIG5ldyBicm93c2VyIHdpbmRvdywgCi1ccHJvZ3JhbW9wdHstdH0gZm9yIGEgbmV3IHRhYikuICBOZXcgbW9kdWxlLWxldmVsIGZ1bmN0aW9ucywKLVxmdW5jdGlvbntvcGVuX25ldygpfSBhbmQgXGZ1bmN0aW9ue29wZW5fbmV3X3RhYigpfSwgd2VyZSBhZGRlZCAKLXRvIHN1cHBvcnQgdGhpcy4gIFRoZSBtb2R1bGUncyBcZnVuY3Rpb257b3BlbigpfSBmdW5jdGlvbiBzdXBwb3J0cyBhbgotYWRkaXRpb25hbCBmZWF0dXJlLCBhbiBcdmFye2F1dG9yYWlzZX0gcGFyYW1ldGVyIHRoYXQgc2lnbmFscyB3aGV0aGVyCi10byByYWlzZSB0aGUgb3BlbiB3aW5kb3cgd2hlbiBwb3NzaWJsZS4gQSBudW1iZXIgb2YgYWRkaXRpb25hbAotYnJvd3NlcnMgd2VyZSBhZGRlZCB0byB0aGUgc3VwcG9ydGVkIGxpc3Qgc3VjaCBhcyBGaXJlZm94LCBPcGVyYSwKLUtvbnF1ZXJvciwgYW5kIGVsaW5rcy4gIChDb250cmlidXRlZCBieSBPbGVnIEJyb3l0bWFubiBhbmQgR2VvcmcKLUJyYW5kbC4pCi0lIFBhdGNoICM3NTQwMjIKLQotXGl0ZW0gVGhlIFxtb2R1bGV7eG1scnBjbGlifSBtb2R1bGUgbm93IHN1cHBvcnRzIHJldHVybmluZyAKLSAgICAgIFxjbGFzc3tkYXRldGltZX0gb2JqZWN0cyBmb3IgdGhlIFhNTC1SUEMgZGF0ZSB0eXBlLiAgU3VwcGx5IAotICAgICAgXGNvZGV7dXNlX2RhdGV0aW1lPVRydWV9IHRvIHRoZSBcZnVuY3Rpb257bG9hZHMoKX0gZnVuY3Rpb24KLSAgICAgIG9yIHRoZSBcY2xhc3N7VW5tYXJzaGFsbGVyfSBjbGFzcyB0byBlbmFibGUgdGhpcyBmZWF0dXJlLgotICAgICAgKENvbnRyaWJ1dGVkIGJ5IFNraXAgTW9udGFuYXJvLikKLSUgUGF0Y2ggMTEyMDM1MwotCi1caXRlbSBUaGUgXG1vZHVsZXt6aXBmaWxlfSBtb2R1bGUgbm93IHN1cHBvcnRzIHRoZSBaSVA2NCB2ZXJzaW9uIG9mIHRoZSAKLWZvcm1hdCwgbWVhbmluZyB0aGF0IGEgLnppcCBhcmNoaXZlIGNhbiBub3cgYmUgbGFyZ2VyIHRoYW4gNH5HaUIgYW5kCi1jYW4gY29udGFpbiBpbmRpdmlkdWFsIGZpbGVzIGxhcmdlciB0aGFuIDR+R2lCLiAgKENvbnRyaWJ1dGVkIGJ5Ci1Sb25hbGQgT3Vzc29yZW4uKQotJSBQYXRjaCAxNDQ2NDg5Ci0KLVxpdGVtIFRoZSBcbW9kdWxle3psaWJ9IG1vZHVsZSdzIFxjbGFzc3tDb21wcmVzc30gYW5kIFxjbGFzc3tEZWNvbXByZXNzfQotb2JqZWN0cyBub3cgc3VwcG9ydCBhIFxtZXRob2R7Y29weSgpfSBtZXRob2QgdGhhdCBtYWtlcyBhIGNvcHkgb2YgdGhlIAotb2JqZWN0J3MgaW50ZXJuYWwgc3RhdGUgYW5kIHJldHVybnMgYSBuZXcgCi1cY2xhc3N7Q29tcHJlc3N9IG9yIFxjbGFzc3tEZWNvbXByZXNzfSBvYmplY3QuIAotKENvbnRyaWJ1dGVkIGJ5IENocmlzIEF0TGVlLikKLSUgUGF0Y2ggMTQzNTQyMgotCi1cZW5ke2l0ZW1pemV9Ci0KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHN1YnNlY3Rpb257VGhlIGN0eXBlcyBwYWNrYWdlXGxhYmVse21vZHVsZS1jdHlwZXN9fQotCi1UaGUgXG1vZHVsZXtjdHlwZXN9IHBhY2thZ2UsIHdyaXR0ZW4gYnkgVGhvbWFzIEhlbGxlciwgaGFzIGJlZW4gYWRkZWQgCi10byB0aGUgc3RhbmRhcmQgbGlicmFyeS4gIFxtb2R1bGV7Y3R5cGVzfSBsZXRzIHlvdSBjYWxsIGFyYml0cmFyeSBmdW5jdGlvbnMgCi1pbiBzaGFyZWQgbGlicmFyaWVzIG9yIERMTHMuICBMb25nLXRpbWUgdXNlcnMgbWF5IHJlbWVtYmVyIHRoZSBcbW9kdWxle2RsfSBtb2R1bGUsIHdoaWNoIAotcHJvdmlkZXMgZnVuY3Rpb25zIGZvciBsb2FkaW5nIHNoYXJlZCBsaWJyYXJpZXMgYW5kIGNhbGxpbmcgZnVuY3Rpb25zIGluIHRoZW0uICBUaGUgXG1vZHVsZXtjdHlwZXN9IHBhY2thZ2UgaXMgbXVjaCBmYW5jaWVyLgotCi1UbyBsb2FkIGEgc2hhcmVkIGxpYnJhcnkgb3IgRExMLCB5b3UgbXVzdCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIAotXGNsYXNze0NETEx9IGNsYXNzIGFuZCBwcm92aWRlIHRoZSBuYW1lIG9yIHBhdGggb2YgdGhlIHNoYXJlZCBsaWJyYXJ5Ci1vciBETEwuICBPbmNlIHRoYXQncyBkb25lLCB5b3UgY2FuIGNhbGwgYXJiaXRyYXJ5IGZ1bmN0aW9ucwotYnkgYWNjZXNzaW5nIHRoZW0gYXMgYXR0cmlidXRlcyBvZiB0aGUgXGNsYXNze0NETEx9IG9iamVjdC4gIAotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgY3R5cGVzCi0KLWxpYmMgPSBjdHlwZXMuQ0RMTCgnbGliYy5zby42JykKLXJlc3VsdCA9IGxpYmMucHJpbnRmKCJMaW5lIG9mIG91dHB1dFxuIikKLVxlbmR7dmVyYmF0aW19Ci0KLVR5cGUgY29uc3RydWN0b3JzIGZvciB0aGUgdmFyaW91cyBDIHR5cGVzIGFyZSBwcm92aWRlZDogXGZ1bmN0aW9ue2NfaW50fSwKLVxmdW5jdGlvbntjX2Zsb2F0fSwgXGZ1bmN0aW9ue2NfZG91YmxlfSwgXGZ1bmN0aW9ue2NfY2hhcl9wfSAoZXF1aXZhbGVudCB0byBcY3R5cGV7Y2hhciAqfSksIGFuZCBzbyBmb3J0aC4gIFVubGlrZSBQeXRob24ncyB0eXBlcywgdGhlIEMgdmVyc2lvbnMgYXJlIGFsbCBtdXRhYmxlOyB5b3UgY2FuIGFzc2lnbiB0byB0aGVpciBcbWVtYmVye3ZhbHVlfSBhdHRyaWJ1dGUKLXRvIGNoYW5nZSB0aGUgd3JhcHBlZCB2YWx1ZS4gIFB5dGhvbiBpbnRlZ2VycyBhbmQgc3RyaW5ncyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkKLWNvbnZlcnRlZCB0byB0aGUgY29ycmVzcG9uZGluZyBDIHR5cGVzLCBidXQgZm9yIG90aGVyIHR5cGVzIHlvdSAKLW11c3QgY2FsbCB0aGUgY29ycmVjdCB0eXBlIGNvbnN0cnVjdG9yLiAgKEFuZCBJIG1lYW4gXGVtcGh7bXVzdH07IAotZ2V0dGluZyBpdCB3cm9uZyB3aWxsIG9mdGVuIHJlc3VsdCBpbiB0aGUgaW50ZXJwcmV0ZXIgY3Jhc2hpbmcgCi13aXRoIGEgc2VnbWVudGF0aW9uIGZhdWx0LikKLQotWW91IHNob3VsZG4ndCB1c2UgXGZ1bmN0aW9ue2NfY2hhcl9wfSB3aXRoIGEgUHl0aG9uIHN0cmluZyB3aGVuIHRoZSBDIGZ1bmN0aW9uIHdpbGwgYmUgbW9kaWZ5aW5nIHRoZSBtZW1vcnkgYXJlYSwgYmVjYXVzZSBQeXRob24gc3RyaW5ncyBhcmUgCi1zdXBwb3NlZCB0byBiZSBpbW11dGFibGU7IGJyZWFraW5nIHRoaXMgcnVsZSB3aWxsIGNhdXNlIHB1enpsaW5nIGJ1Z3MuICBXaGVuIHlvdSBuZWVkIGEgbW9kaWZpYWJsZSBtZW1vcnkgYXJlYSwKLXVzZSBcZnVuY3Rpb257Y3JlYXRlX3N0cmluZ19idWZmZXIoKX06Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXMgPSAidGhpcyBpcyBhIHN0cmluZyIKLWJ1ZiA9IGN0eXBlcy5jcmVhdGVfc3RyaW5nX2J1ZmZlcihzKQotbGliYy5zdHJmcnkoYnVmKQotXGVuZHt2ZXJiYXRpbX0KLQotQyBmdW5jdGlvbnMgYXJlIGFzc3VtZWQgdG8gcmV0dXJuIGludGVnZXJzLCBidXQgeW91IGNhbiBzZXQKLXRoZSBcbWVtYmVye3Jlc3R5cGV9IGF0dHJpYnV0ZSBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0IHRvIAotY2hhbmdlIHRoaXM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBsaWJjLmF0b2YoJzIuNzE4MjgnKQotLTE3ODM5NTc2MTYKLT4+PiBsaWJjLmF0b2YucmVzdHlwZSA9IGN0eXBlcy5jX2RvdWJsZQotPj4+IGxpYmMuYXRvZignMi43MTgyOCcpCi0yLjcxODI4Ci1cZW5ke3ZlcmJhdGltfQotCi1cbW9kdWxle2N0eXBlc30gYWxzbyBwcm92aWRlcyBhIHdyYXBwZXIgZm9yIFB5dGhvbidzIEMgQVBJIAotYXMgdGhlIFxjb2Rle2N0eXBlcy5weXRob25hcGl9IG9iamVjdC4gIFRoaXMgb2JqZWN0IGRvZXMgXGVtcGh7bm90fSAKLXJlbGVhc2UgdGhlIGdsb2JhbCBpbnRlcnByZXRlciBsb2NrIGJlZm9yZSBjYWxsaW5nIGEgZnVuY3Rpb24sIGJlY2F1c2UgdGhlIGxvY2sgbXVzdCBiZSBoZWxkIHdoZW4gY2FsbGluZyBpbnRvIHRoZSBpbnRlcnByZXRlcidzIGNvZGUuICAKLVRoZXJlJ3MgYSBcY2xhc3N7cHlfb2JqZWN0KCl9IHR5cGUgY29uc3RydWN0b3IgdGhhdCB3aWxsIGNyZWF0ZSBhIAotXGN0eXBle1B5T2JqZWN0ICp9IHBvaW50ZXIuICBBIHNpbXBsZSB1c2FnZToKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IGN0eXBlcwotCi1kID0ge30KLWN0eXBlcy5weXRob25hcGkuUHlPYmplY3RfU2V0SXRlbShjdHlwZXMucHlfb2JqZWN0KGQpLAotICAgICAgICAgIGN0eXBlcy5weV9vYmplY3QoImFiYyIpLCAgY3R5cGVzLnB5X29iamVjdCgxKSkKLSMgZCBpcyBub3cgeydhYmMnLCAxfS4KLVxlbmR7dmVyYmF0aW19Ci0KLURvbid0IGZvcmdldCB0byB1c2UgXGNsYXNze3B5X29iamVjdCgpfTsgaWYgaXQncyBvbWl0dGVkIHlvdSBlbmQgCi11cCB3aXRoIGEgc2VnbWVudGF0aW9uIGZhdWx0LgotCi1cbW9kdWxle2N0eXBlc30gaGFzIGJlZW4gYXJvdW5kIGZvciBhIHdoaWxlLCBidXQgcGVvcGxlIHN0aWxsIHdyaXRlIAotYW5kIGRpc3RyaWJ1dGlvbiBoYW5kLWNvZGVkIGV4dGVuc2lvbiBtb2R1bGVzIGJlY2F1c2UgeW91IGNhbid0IHJlbHkgb24gXG1vZHVsZXtjdHlwZXN9IGJlaW5nIHByZXNlbnQuCi1QZXJoYXBzIGRldmVsb3BlcnMgd2lsbCBiZWdpbiB0byB3cml0ZSAKLVB5dGhvbiB3cmFwcGVycyBhdG9wIGEgbGlicmFyeSBhY2Nlc3NlZCB0aHJvdWdoIFxtb2R1bGV7Y3R5cGVzfSBpbnN0ZWFkCi1vZiBleHRlbnNpb24gbW9kdWxlcywgbm93IHRoYXQgXG1vZHVsZXtjdHlwZXN9IGlzIGluY2x1ZGVkIHdpdGggY29yZSBQeXRob24uCi0KLVxiZWdpbntzZWVhbHNvfQotCi1cc2VldXJse2h0dHA6Ly9zdGFyc2hpcC5weXRob24ubmV0L2NyZXcvdGhlbGxlci9jdHlwZXMvfQote1RoZSBjdHlwZXMgd2ViIHBhZ2UsIHdpdGggYSB0dXRvcmlhbCwgcmVmZXJlbmNlLCBhbmQgRkFRLn0KLQotXHNlZXVybHsuLi9saWIvbW9kdWxlLWN0eXBlcy5odG1sfXtUaGUgZG9jdW1lbnRhdGlvbiAKLWZvciB0aGUgXG1vZHVsZXtjdHlwZXN9IG1vZHVsZS59Ci0KLVxlbmR7c2VlYWxzb30KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHN1YnNlY3Rpb257VGhlIEVsZW1lbnRUcmVlIHBhY2thZ2VcbGFiZWx7bW9kdWxlLWV0cmVlfX0KLQotQSBzdWJzZXQgb2YgRnJlZHJpayBMdW5kaCdzIEVsZW1lbnRUcmVlIGxpYnJhcnkgZm9yIHByb2Nlc3NpbmcgWE1MIGhhcwotYmVlbiBhZGRlZCB0byB0aGUgc3RhbmRhcmQgbGlicmFyeSBhcyBcbW9kdWxle3htbC5ldHJlZX0uICBUaGUKLWF2YWlsYWJsZSBtb2R1bGVzIGFyZQotXG1vZHVsZXtFbGVtZW50VHJlZX0sIFxtb2R1bGV7RWxlbWVudFBhdGh9LCBhbmQKLVxtb2R1bGV7RWxlbWVudEluY2x1ZGV9IGZyb20gRWxlbWVudFRyZWUgMS4yLjYuICAgCi1UaGUgXG1vZHVsZXtjRWxlbWVudFRyZWV9IGFjY2VsZXJhdG9yIG1vZHVsZSBpcyBhbHNvIGluY2x1ZGVkLiAKLQotVGhlIHJlc3Qgb2YgdGhpcyBzZWN0aW9uIHdpbGwgcHJvdmlkZSBhIGJyaWVmIG92ZXJ2aWV3IG9mIHVzaW5nCi1FbGVtZW50VHJlZS4gIEZ1bGwgZG9jdW1lbnRhdGlvbiBmb3IgRWxlbWVudFRyZWUgaXMgYXZhaWxhYmxlIGF0Ci1cdXJse2h0dHA6Ly9lZmZib3Qub3JnL3pvbmUvZWxlbWVudC1pbmRleC5odG19LgotCi1FbGVtZW50VHJlZSByZXByZXNlbnRzIGFuIFhNTCBkb2N1bWVudCBhcyBhIHRyZWUgb2YgZWxlbWVudCBub2Rlcy4KLVRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGRvY3VtZW50IGlzIHN0b3JlZCBhcyB0aGUgXG1lbWJlcnsudGV4dH0KLWFuZCBcbWVtYmVyey50YWlsfSBhdHRyaWJ1dGVzIG9mIAotKFRoaXMgaXMgb25lIG9mIHRoZSBtYWpvciBkaWZmZXJlbmNlcyBiZXR3ZWVuIEVsZW1lbnRUcmVlIGFuZCAKLXRoZSBEb2N1bWVudCBPYmplY3QgTW9kZWw7IGluIHRoZSBET00gdGhlcmUgYXJlIG1hbnkgZGlmZmVyZW50Ci10eXBlcyBvZiBub2RlLCBpbmNsdWRpbmcgXGNsYXNze1RleHROb2RlfS4pCi0KLVRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgcGFyc2luZyBmdW5jdGlvbiBpcyBcZnVuY3Rpb257cGFyc2UoKX0sIHRoYXQKLXRha2VzIGVpdGhlciBhIHN0cmluZyAoYXNzdW1lZCB0byBjb250YWluIGEgZmlsZW5hbWUpIG9yIGEgZmlsZS1saWtlCi1vYmplY3QgYW5kIHJldHVybnMgYW4gXGNsYXNze0VsZW1lbnRUcmVlfSBpbnN0YW5jZToKLQotXGJlZ2lue3ZlcmJhdGltfQotZnJvbSB4bWwuZXRyZWUgaW1wb3J0IEVsZW1lbnRUcmVlIGFzIEVUCi0KLXRyZWUgPSBFVC5wYXJzZSgnZXgtMS54bWwnKQotCi1mZWVkID0gdXJsbGliLnVybG9wZW4oCi0gICAgICAgICAgJ2h0dHA6Ly9wbGFuZXQucHl0aG9uLm9yZy9yc3MxMC54bWwnKQotdHJlZSA9IEVULnBhcnNlKGZlZWQpCi1cZW5ke3ZlcmJhdGltfQotCi1PbmNlIHlvdSBoYXZlIGFuIFxjbGFzc3tFbGVtZW50VHJlZX0gaW5zdGFuY2UsIHlvdQotY2FuIGNhbGwgaXRzIFxtZXRob2R7Z2V0cm9vdCgpfSBtZXRob2QgdG8gZ2V0IHRoZSByb290IFxjbGFzc3tFbGVtZW50fSBub2RlLgotCi1UaGVyZSdzIGFsc28gYW4gXGZ1bmN0aW9ue1hNTCgpfSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgc3RyaW5nIGxpdGVyYWwKLWFuZCByZXR1cm5zIGFuIFxjbGFzc3tFbGVtZW50fSBub2RlIChub3QgYW4gXGNsYXNze0VsZW1lbnRUcmVlfSkuICAKLVRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSB0aWR5IHdheSB0byBpbmNvcnBvcmF0ZSBYTUwgZnJhZ21lbnRzLAotYXBwcm9hY2hpbmcgdGhlIGNvbnZlbmllbmNlIG9mIGFuIFhNTCBsaXRlcmFsOgotCi1cYmVnaW57dmVyYmF0aW19Ci1zdmcgPSBFVC5YTUwoIiIiPHN2ZyB3aWR0aD0iMTBweCIgdmVyc2lvbj0iMS4wIj4KLSAgICAgICAgICAgICA8L3N2Zz4iIiIpCi1zdmcuc2V0KCdoZWlnaHQnLCAnMzIwcHgnKQotc3ZnLmFwcGVuZChlbGVtMSkKLVxlbmR7dmVyYmF0aW19Ci0KLUVhY2ggWE1MIGVsZW1lbnQgc3VwcG9ydHMgc29tZSBkaWN0aW9uYXJ5LWxpa2UgYW5kIHNvbWUgbGlzdC1saWtlCi1hY2Nlc3MgbWV0aG9kcy4gIERpY3Rpb25hcnktbGlrZSBvcGVyYXRpb25zIGFyZSB1c2VkIHRvIGFjY2VzcyBhdHRyaWJ1dGUKLXZhbHVlcywgYW5kIGxpc3QtbGlrZSBvcGVyYXRpb25zIGFyZSB1c2VkIHRvIGFjY2VzcyBjaGlsZCBub2Rlcy4KLQotXGJlZ2lue3RhYmxlaWl9e2N8bH17Y29kZX17T3BlcmF0aW9ufXtSZXN1bHR9Ci0gIFxsaW5laWl7ZWxlbVtuXX17UmV0dXJucyBuJ3RoIGNoaWxkIGVsZW1lbnQufQotICBcbGluZWlpe2VsZW1bbTpuXX17UmV0dXJucyBsaXN0IG9mIG0ndGggdGhyb3VnaCBuJ3RoIGNoaWxkIGVsZW1lbnRzLn0KLSAgXGxpbmVpaXtsZW4oZWxlbSl9e1JldHVybnMgbnVtYmVyIG9mIGNoaWxkIGVsZW1lbnRzLn0KLSAgXGxpbmVpaXtsaXN0KGVsZW0pfXtSZXR1cm5zIGxpc3Qgb2YgY2hpbGQgZWxlbWVudHMufQotICBcbGluZWlpe2VsZW0uYXBwZW5kKGVsZW0yKX17QWRkcyBcdmFye2VsZW0yfSBhcyBhIGNoaWxkLn0KLSAgXGxpbmVpaXtlbGVtLmluc2VydChpbmRleCwgZWxlbTIpfXtJbnNlcnRzIFx2YXJ7ZWxlbTJ9IGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24ufQotICBcbGluZWlpe2RlbCBlbGVtW25dfXtEZWxldGVzIG4ndGggY2hpbGQgZWxlbWVudC59Ci0gIFxsaW5laWl7ZWxlbS5rZXlzKCl9e1JldHVybnMgbGlzdCBvZiBhdHRyaWJ1dGUgbmFtZXMufQotICBcbGluZWlpe2VsZW0uZ2V0KG5hbWUpfXtSZXR1cm5zIHZhbHVlIG9mIGF0dHJpYnV0ZSBcdmFye25hbWV9Ln0KLSAgXGxpbmVpaXtlbGVtLnNldChuYW1lLCB2YWx1ZSl9e1NldHMgbmV3IHZhbHVlIGZvciBhdHRyaWJ1dGUgXHZhcntuYW1lfS59Ci0gIFxsaW5laWl7ZWxlbS5hdHRyaWJ9e1JldHJpZXZlcyB0aGUgZGljdGlvbmFyeSBjb250YWluaW5nIGF0dHJpYnV0ZXMufQotICBcbGluZWlpe2RlbCBlbGVtLmF0dHJpYltuYW1lXX17RGVsZXRlcyBhdHRyaWJ1dGUgXHZhcntuYW1lfS59Ci1cZW5ke3RhYmxlaWl9Ci0KLUNvbW1lbnRzIGFuZCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBhcmUgYWxzbyByZXByZXNlbnRlZCBhcwotXGNsYXNze0VsZW1lbnR9IG5vZGVzLiAgVG8gY2hlY2sgaWYgYSBub2RlIGlzIGEgY29tbWVudCBvciBwcm9jZXNzaW5nCi1pbnN0cnVjdGlvbnM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWlmIGVsZW0udGFnIGlzIEVULkNvbW1lbnQ6Ci0gICAgLi4uCi1lbGlmIGVsZW0udGFnIGlzIEVULlByb2Nlc3NpbmdJbnN0cnVjdGlvbjoKLSAgICAuLi4KLVxlbmR7dmVyYmF0aW19Ci0KLVRvIGdlbmVyYXRlIFhNTCBvdXRwdXQsIHlvdSBzaG91bGQgY2FsbCB0aGUKLVxtZXRob2R7RWxlbWVudFRyZWUud3JpdGUoKX0gbWV0aG9kLiAgTGlrZSBcZnVuY3Rpb257cGFyc2UoKX0sCi1pdCBjYW4gdGFrZSBlaXRoZXIgYSBzdHJpbmcgb3IgYSBmaWxlLWxpa2Ugb2JqZWN0OgotCi1cYmVnaW57dmVyYmF0aW19Ci0jIEVuY29kaW5nIGlzIFVTLUFTQ0lJCi10cmVlLndyaXRlKCdvdXRwdXQueG1sJykKLQotIyBFbmNvZGluZyBpcyBVVEYtOAotZiA9IG9wZW4oJ291dHB1dC54bWwnLCAndycpCi10cmVlLndyaXRlKGYsIGVuY29kaW5nPSd1dGYtOCcpCi1cZW5ke3ZlcmJhdGltfQotCi0oQ2F1dGlvbjogdGhlIGRlZmF1bHQgZW5jb2RpbmcgdXNlZCBmb3Igb3V0cHV0IGlzIEFTQ0lJLiAgRm9yIGdlbmVyYWwKLVhNTCB3b3JrLCB3aGVyZSBhbiBlbGVtZW50J3MgbmFtZSBtYXkgY29udGFpbiBhcmJpdHJhcnkgVW5pY29kZQotY2hhcmFjdGVycywgQVNDSUkgaXNuJ3QgYSB2ZXJ5IHVzZWZ1bCBlbmNvZGluZyBiZWNhdXNlIGl0IHdpbGwgcmFpc2UKLWFuIGV4Y2VwdGlvbiBpZiBhbiBlbGVtZW50J3MgbmFtZSBjb250YWlucyBhbnkgY2hhcmFjdGVycyB3aXRoIHZhbHVlcwotZ3JlYXRlciB0aGFuIDEyNy4gIFRoZXJlZm9yZSwgaXQncyBiZXN0IHRvIHNwZWNpZnkgYSBkaWZmZXJlbnQKLWVuY29kaW5nIHN1Y2ggYXMgVVRGLTggdGhhdCBjYW4gaGFuZGxlIGFueSBVbmljb2RlIGNoYXJhY3Rlci4pCi0KLVRoaXMgc2VjdGlvbiBpcyBvbmx5IGEgcGFydGlhbCBkZXNjcmlwdGlvbiBvZiB0aGUgRWxlbWVudFRyZWUgaW50ZXJmYWNlcy4KLVBsZWFzZSByZWFkIHRoZSBwYWNrYWdlJ3Mgb2ZmaWNpYWwgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgotCi1cYmVnaW57c2VlYWxzb30KLQotXHNlZXVybHtodHRwOi8vZWZmYm90Lm9yZy96b25lL2VsZW1lbnQtaW5kZXguaHRtfQote09mZmljaWFsIGRvY3VtZW50YXRpb24gZm9yIEVsZW1lbnRUcmVlLn0KLQotXGVuZHtzZWVhbHNvfQotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc3Vic2VjdGlvbntUaGUgaGFzaGxpYiBwYWNrYWdlXGxhYmVse21vZHVsZS1oYXNobGlifX0KLQotQSBuZXcgXG1vZHVsZXtoYXNobGlifSBtb2R1bGUsIHdyaXR0ZW4gYnkgR3JlZ29yeSBQLiBTbWl0aCwgCi1oYXMgYmVlbiBhZGRlZCB0byByZXBsYWNlIHRoZQotXG1vZHVsZXttZDV9IGFuZCBcbW9kdWxle3NoYX0gbW9kdWxlcy4gIFxtb2R1bGV7aGFzaGxpYn0gYWRkcyBzdXBwb3J0Ci1mb3IgYWRkaXRpb25hbCBzZWN1cmUgaGFzaGVzIChTSEEtMjI0LCBTSEEtMjU2LCBTSEEtMzg0LCBhbmQgU0hBLTUxMikuCi1XaGVuIGF2YWlsYWJsZSwgdGhlIG1vZHVsZSB1c2VzIE9wZW5TU0wgZm9yIGZhc3QgcGxhdGZvcm0gb3B0aW1pemVkCi1pbXBsZW1lbnRhdGlvbnMgb2YgYWxnb3JpdGhtcy4gIAotCi1UaGUgb2xkIFxtb2R1bGV7bWQ1fSBhbmQgXG1vZHVsZXtzaGF9IG1vZHVsZXMgc3RpbGwgZXhpc3QgYXMgd3JhcHBlcnMKLWFyb3VuZCBoYXNobGliIHRvIHByZXNlcnZlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAgVGhlIG5ldyBtb2R1bGUncwotaW50ZXJmYWNlIGlzIHZlcnkgY2xvc2UgdG8gdGhhdCBvZiB0aGUgb2xkIG1vZHVsZXMsIGJ1dCBub3QgaWRlbnRpY2FsLgotVGhlIG1vc3Qgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMKLWZvciBjcmVhdGluZyBuZXcgaGFzaGluZyBvYmplY3RzIGFyZSBuYW1lZCBkaWZmZXJlbnRseS4KLQotXGJlZ2lue3ZlcmJhdGltfQotIyBPbGQgdmVyc2lvbnMKLWggPSBtZDUubWQ1KCkgICAKLWggPSBtZDUubmV3KCkgICAKLQotIyBOZXcgdmVyc2lvbiAKLWggPSBoYXNobGliLm1kNSgpCi0KLSMgT2xkIHZlcnNpb25zCi1oID0gc2hhLnNoYSgpICAgCi1oID0gc2hhLm5ldygpICAgCi0KLSMgTmV3IHZlcnNpb24gCi1oID0gaGFzaGxpYi5zaGExKCkKLQotIyBIYXNoIHRoYXQgd2VyZW4ndCBwcmV2aW91c2x5IGF2YWlsYWJsZQotaCA9IGhhc2hsaWIuc2hhMjI0KCkKLWggPSBoYXNobGliLnNoYTI1NigpCi1oID0gaGFzaGxpYi5zaGEzODQoKQotaCA9IGhhc2hsaWIuc2hhNTEyKCkKLQotIyBBbHRlcm5hdGl2ZSBmb3JtCi1oID0gaGFzaGxpYi5uZXcoJ21kNScpICAgICAgICAgICMgUHJvdmlkZSBhbGdvcml0aG0gYXMgYSBzdHJpbmcKLVxlbmR7dmVyYmF0aW19Ci0KLU9uY2UgYSBoYXNoIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkLCBpdHMgbWV0aG9kcyBhcmUgdGhlIHNhbWUgYXMgYmVmb3JlOgotXG1ldGhvZHt1cGRhdGUoXHZhcntzdHJpbmd9KX0gaGFzaGVzIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGludG8gdGhlIAotY3VycmVudCBkaWdlc3Qgc3RhdGUsIFxtZXRob2R7ZGlnZXN0KCl9IGFuZCBcbWV0aG9ke2hleGRpZ2VzdCgpfQotcmV0dXJuIHRoZSBkaWdlc3QgdmFsdWUgYXMgYSBiaW5hcnkgc3RyaW5nIG9yIGEgc3RyaW5nIG9mIGhleCBkaWdpdHMsCi1hbmQgXG1ldGhvZHtjb3B5KCl9IHJldHVybnMgYSBuZXcgaGFzaGluZyBvYmplY3Qgd2l0aCB0aGUgc2FtZSBkaWdlc3Qgc3RhdGUuCi0KLVxiZWdpbntzZWVhbHNvfQotCi1cc2VldXJsey4uL2xpYi9tb2R1bGUtaGFzaGxpYi5odG1sfXtUaGUgZG9jdW1lbnRhdGlvbiAKLWZvciB0aGUgXG1vZHVsZXtoYXNobGlifSBtb2R1bGUufQotCi1cZW5ke3NlZWFsc299Ci0KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzdWJzZWN0aW9ue1RoZSBzcWxpdGUzIHBhY2thZ2VcbGFiZWx7bW9kdWxlLXNxbGl0ZX19Ci0KLVRoZSBweXNxbGl0ZSBtb2R1bGUgKFx1cmx7aHR0cDovL3d3dy5weXNxbGl0ZS5vcmd9KSwgYSB3cmFwcGVyIGZvciB0aGUKLVNRTGl0ZSBlbWJlZGRlZCBkYXRhYmFzZSwgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIHN0YW5kYXJkIGxpYnJhcnkgdW5kZXIKLXRoZSBwYWNrYWdlIG5hbWUgXG1vZHVsZXtzcWxpdGUzfS4gIAotCi1TUUxpdGUgaXMgYSBDIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBhIGxpZ2h0d2VpZ2h0IGRpc2stYmFzZWQgZGF0YWJhc2UKLXRoYXQgZG9lc24ndCByZXF1aXJlIGEgc2VwYXJhdGUgc2VydmVyIHByb2Nlc3MgYW5kIGFsbG93cyBhY2Nlc3NpbmcKLXRoZSBkYXRhYmFzZSB1c2luZyBhIG5vbnN0YW5kYXJkIHZhcmlhbnQgb2YgdGhlIFNRTCBxdWVyeSBsYW5ndWFnZS4KLVNvbWUgYXBwbGljYXRpb25zIGNhbiB1c2UgU1FMaXRlIGZvciBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UuICBJdCdzIGFsc28KLXBvc3NpYmxlIHRvIHByb3RvdHlwZSBhbiBhcHBsaWNhdGlvbiB1c2luZyBTUUxpdGUgYW5kIHRoZW4gcG9ydCB0aGUKLWNvZGUgdG8gYSBsYXJnZXIgZGF0YWJhc2Ugc3VjaCBhcyBQb3N0Z3JlU1FMIG9yIE9yYWNsZS4KLSAKLXB5c3FsaXRlIHdhcyB3cml0dGVuIGJ5IEdlcmhhcmQgSFwiYXJpbmcgYW5kIHByb3ZpZGVzIGEgU1FMIGludGVyZmFjZQotY29tcGxpYW50IHdpdGggdGhlIERCLUFQSSAyLjAgc3BlY2lmaWNhdGlvbiBkZXNjcmliZWQgYnkKLVxwZXB7MjQ5fS4gCi0KLUlmIHlvdSdyZSBjb21waWxpbmcgdGhlIFB5dGhvbiBzb3VyY2UgeW91cnNlbGYsIG5vdGUgdGhhdCB0aGUgc291cmNlCi10cmVlIGRvZXNuJ3QgaW5jbHVkZSB0aGUgU1FMaXRlIGNvZGUsIG9ubHkgdGhlIHdyYXBwZXIgbW9kdWxlLgotWW91J2xsIG5lZWQgdG8gaGF2ZSB0aGUgU1FMaXRlIGxpYnJhcmllcyBhbmQgaGVhZGVycyBpbnN0YWxsZWQgYmVmb3JlCi1jb21waWxpbmcgUHl0aG9uLCBhbmQgdGhlIGJ1aWxkIHByb2Nlc3Mgd2lsbCBjb21waWxlIHRoZSBtb2R1bGUgd2hlbgotdGhlIG5lY2Vzc2FyeSBoZWFkZXJzIGFyZSBhdmFpbGFibGUuCi0KLVRvIHVzZSB0aGUgbW9kdWxlLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgYSBcY2xhc3N7Q29ubmVjdGlvbn0gb2JqZWN0Ci10aGF0IHJlcHJlc2VudHMgdGhlIGRhdGFiYXNlLiAgSGVyZSB0aGUgZGF0YSB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgCi1cZmlsZXsvdG1wL2V4YW1wbGV9IGZpbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWNvbm4gPSBzcWxpdGUzLmNvbm5lY3QoJy90bXAvZXhhbXBsZScpCi1cZW5ke3ZlcmJhdGltfQotCi1Zb3UgY2FuIGFsc28gc3VwcGx5IHRoZSBzcGVjaWFsIG5hbWUgXHNhbXB7Om1lbW9yeTp9IHRvIGNyZWF0ZQotYSBkYXRhYmFzZSBpbiBSQU0uCi0KLU9uY2UgeW91IGhhdmUgYSBcY2xhc3N7Q29ubmVjdGlvbn0sIHlvdSBjYW4gY3JlYXRlIGEgXGNsYXNze0N1cnNvcn0gCi1vYmplY3QgYW5kIGNhbGwgaXRzIFxtZXRob2R7ZXhlY3V0ZSgpfSBtZXRob2QgdG8gcGVyZm9ybSBTUUwgY29tbWFuZHM6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWMgPSBjb25uLmN1cnNvcigpCi0KLSMgQ3JlYXRlIHRhYmxlCi1jLmV4ZWN1dGUoJycnY3JlYXRlIHRhYmxlIHN0b2NrcwotKGRhdGUgdGV4dCwgdHJhbnMgdGV4dCwgc3ltYm9sIHRleHQsCi0gcXR5IHJlYWwsIHByaWNlIHJlYWwpJycnKQotCi0jIEluc2VydCBhIHJvdyBvZiBkYXRhCi1jLmV4ZWN1dGUoIiIiaW5zZXJ0IGludG8gc3RvY2tzCi0gICAgICAgICAgdmFsdWVzICgnMjAwNi0wMS0wNScsJ0JVWScsJ1JIQVQnLDEwMCwzNS4xNCkiIiIpCi1cZW5ke3ZlcmJhdGltfSAgICAKLQotVXN1YWxseSB5b3VyIFNRTCBvcGVyYXRpb25zIHdpbGwgbmVlZCB0byB1c2UgdmFsdWVzIGZyb20gUHl0aG9uCi12YXJpYWJsZXMuICBZb3Ugc2hvdWxkbid0IGFzc2VtYmxlIHlvdXIgcXVlcnkgdXNpbmcgUHl0aG9uJ3Mgc3RyaW5nCi1vcGVyYXRpb25zIGJlY2F1c2UgZG9pbmcgc28gaXMgaW5zZWN1cmU7IGl0IG1ha2VzIHlvdXIgcHJvZ3JhbQotdnVsbmVyYWJsZSB0byBhbiBTUUwgaW5qZWN0aW9uIGF0dGFjay4gIAotCi1JbnN0ZWFkLCB1c2UgdGhlIERCLUFQSSdzIHBhcmFtZXRlciBzdWJzdGl0dXRpb24uICBQdXQgXHNhbXB7P30gYXMgYQotcGxhY2Vob2xkZXIgd2hlcmV2ZXIgeW91IHdhbnQgdG8gdXNlIGEgdmFsdWUsIGFuZCB0aGVuIHByb3ZpZGUgYSB0dXBsZQotb2YgdmFsdWVzIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gdGhlIGN1cnNvcidzIFxtZXRob2R7ZXhlY3V0ZSgpfQotbWV0aG9kLiAgKE90aGVyIGRhdGFiYXNlIG1vZHVsZXMgbWF5IHVzZSBhIGRpZmZlcmVudCBwbGFjZWhvbGRlciwKLXN1Y2ggYXMgXHNhbXB7XCVzfSBvciBcc2FtcHs6MX0uKSBGb3IgZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfSAgICAKLSMgTmV2ZXIgZG8gdGhpcyAtLSBpbnNlY3VyZSEKLXN5bWJvbCA9ICdJQk0nCi1jLmV4ZWN1dGUoIi4uLiB3aGVyZSBzeW1ib2wgPSAnJXMnIiAlIHN5bWJvbCkKLQotIyBEbyB0aGlzIGluc3RlYWQKLXQgPSAoc3ltYm9sLCkKLWMuZXhlY3V0ZSgnc2VsZWN0ICogZnJvbSBzdG9ja3Mgd2hlcmUgc3ltYm9sPT8nLCB0KQotCi0jIExhcmdlciBleGFtcGxlCi1mb3IgdCBpbiAoKCcyMDA2LTAzLTI4JywgJ0JVWScsICdJQk0nLCAxMDAwLCA0NS4wMCksCi0gICAgICAgICAgKCcyMDA2LTA0LTA1JywgJ0JVWScsICdNU09GVCcsIDEwMDAsIDcyLjAwKSwKLSAgICAgICAgICAoJzIwMDYtMDQtMDYnLCAnU0VMTCcsICdJQk0nLCA1MDAsIDUzLjAwKSwKLSAgICAgICAgICk6Ci0gICAgYy5leGVjdXRlKCdpbnNlcnQgaW50byBzdG9ja3MgdmFsdWVzICg/LD8sPyw/LD8pJywgdCkKLVxlbmR7dmVyYmF0aW19Ci0KLVRvIHJldHJpZXZlIGRhdGEgYWZ0ZXIgZXhlY3V0aW5nIGEgU0VMRUNUIHN0YXRlbWVudCwgeW91IGNhbiBlaXRoZXIgCi10cmVhdCB0aGUgY3Vyc29yIGFzIGFuIGl0ZXJhdG9yLCBjYWxsIHRoZSBjdXJzb3IncyBcbWV0aG9ke2ZldGNob25lKCl9Ci1tZXRob2QgdG8gcmV0cmlldmUgYSBzaW5nbGUgbWF0Y2hpbmcgcm93LCAKLW9yIGNhbGwgXG1ldGhvZHtmZXRjaGFsbCgpfSB0byBnZXQgYSBsaXN0IG9mIHRoZSBtYXRjaGluZyByb3dzLgotCi1UaGlzIGV4YW1wbGUgdXNlcyB0aGUgaXRlcmF0b3IgZm9ybToKLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGMgPSBjb25uLmN1cnNvcigpCi0+Pj4gYy5leGVjdXRlKCdzZWxlY3QgKiBmcm9tIHN0b2NrcyBvcmRlciBieSBwcmljZScpCi0+Pj4gZm9yIHJvdyBpbiBjOgotLi4uICAgIHByaW50IHJvdwotLi4uCi0odScyMDA2LTAxLTA1JywgdSdCVVknLCB1J1JIQVQnLCAxMDAsIDM1LjE0MDAwMDAwMDAwMDAwMSkKLSh1JzIwMDYtMDMtMjgnLCB1J0JVWScsIHUnSUJNJywgMTAwMCwgNDUuMCkKLSh1JzIwMDYtMDQtMDYnLCB1J1NFTEwnLCB1J0lCTScsIDUwMCwgNTMuMCkKLSh1JzIwMDYtMDQtMDUnLCB1J0JVWScsIHUnTVNPRlQnLCAxMDAwLCA3Mi4wKQotPj4+Ci1cZW5ke3ZlcmJhdGltfQotCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgU1FMIGRpYWxlY3Qgc3VwcG9ydGVkIGJ5IFNRTGl0ZSwgc2VlIAotXHVybHtodHRwOi8vd3d3LnNxbGl0ZS5vcmd9LgotCi1cYmVnaW57c2VlYWxzb30KLQotXHNlZXVybHtodHRwOi8vd3d3LnB5c3FsaXRlLm9yZ30KLXtUaGUgcHlzcWxpdGUgd2ViIHBhZ2UufQotCi1cc2VldXJse2h0dHA6Ly93d3cuc3FsaXRlLm9yZ30KLXtUaGUgU1FMaXRlIHdlYiBwYWdlOyB0aGUgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgdGhlIHN5bnRheCBhbmQgdGhlCi1hdmFpbGFibGUgZGF0YSB0eXBlcyBmb3IgdGhlIHN1cHBvcnRlZCBTUUwgZGlhbGVjdC59Ci0KLVxzZWV1cmx7Li4vbGliL21vZHVsZS1zcWxpdGUzLmh0bWx9e1RoZSBkb2N1bWVudGF0aW9uIAotZm9yIHRoZSBcbW9kdWxle3NxbGl0ZTN9IG1vZHVsZS59Ci0KLVxzZWVwZXB7MjQ5fXtEYXRhYmFzZSBBUEkgU3BlY2lmaWNhdGlvbiAyLjB9e1BFUCB3cml0dGVuIGJ5Ci1NYXJjLUFuZHJcJ2UgTGVtYnVyZy59Ci0KLVxlbmR7c2VlYWxzb30KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHN1YnNlY3Rpb257VGhlIHdzZ2lyZWYgcGFja2FnZVxsYWJlbHttb2R1bGUtd3NnaXJlZn19Ci0KLSUgWFhYIHNob3VsZCB0aGlzIGJlIGluIGEgUEVQIDMzMyBzZWN0aW9uIGluc3RlYWQ/Ci0KLVRoZSBXZWIgU2VydmVyIEdhdGV3YXkgSW50ZXJmYWNlIChXU0dJKSB2MS4wIGRlZmluZXMgYSBzdGFuZGFyZAotaW50ZXJmYWNlIGJldHdlZW4gd2ViIHNlcnZlcnMgYW5kIFB5dGhvbiB3ZWIgYXBwbGljYXRpb25zIGFuZCBpcwotZGVzY3JpYmVkIGluIFxwZXB7MzMzfS4gIFRoZSBcbW9kdWxle3dzZ2lyZWZ9IHBhY2thZ2UgaXMgYSByZWZlcmVuY2UKLWltcGxlbWVudGF0aW9uIG9mIHRoZSBXU0dJIHNwZWNpZmljYXRpb24uCi0KLVRoZSBwYWNrYWdlIGluY2x1ZGVzIGEgYmFzaWMgSFRUUCBzZXJ2ZXIgdGhhdCB3aWxsIHJ1biBhIFdTR0kKLWFwcGxpY2F0aW9uOyB0aGlzIHNlcnZlciBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBidXQgaXNuJ3QgaW50ZW5kZWQgZm9yIAotcHJvZHVjdGlvbiB1c2UuICBTZXR0aW5nIHVwIGEgc2VydmVyIHRha2VzIG9ubHkgYSBmZXcgbGluZXMgb2YgY29kZToKLQotXGJlZ2lue3ZlcmJhdGltfQotZnJvbSB3c2dpcmVmIGltcG9ydCBzaW1wbGVfc2VydmVyCi0KLXdzZ2lfYXBwID0gLi4uCi0KLWhvc3QgPSAnJwotcG9ydCA9IDgwMDAKLWh0dHBkID0gc2ltcGxlX3NlcnZlci5tYWtlX3NlcnZlcihob3N0LCBwb3J0LCB3c2dpX2FwcCkKLWh0dHBkLnNlcnZlX2ZvcmV2ZXIoKQotXGVuZHt2ZXJiYXRpbX0KLQotJSBYWFggZGlzY3VzcyBzdHJ1Y3R1cmUgb2YgV1NHSSBhcHBsaWNhdGlvbnM/ICAKLSUgWFhYIHByb3ZpZGUgYW4gZXhhbXBsZSB1c2luZyBEamFuZ28gb3Igc29tZSBvdGhlciBmcmFtZXdvcms/Ci0KLVxiZWdpbntzZWVhbHNvfQotCi1cc2VldXJse2h0dHA6Ly93d3cud3NnaS5vcmd9e0EgY2VudHJhbCB3ZWIgc2l0ZSBmb3IgV1NHSS1yZWxhdGVkIHJlc291cmNlcy59Ci0KLVxzZWVwZXB7MzMzfXtQeXRob24gV2ViIFNlcnZlciBHYXRld2F5IEludGVyZmFjZSB2MS4wfXtQRVAgd3JpdHRlbiBieQotUGhpbGxpcCBKLiBFYnkufQotCi1cZW5ke3NlZWFsc299Ci0KLQotJSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntCdWlsZCBhbmQgQyBBUEkgQ2hhbmdlc1xsYWJlbHtidWlsZC1hcGl9fQotCi1DaGFuZ2VzIHRvIFB5dGhvbidzIGJ1aWxkIHByb2Nlc3MgYW5kIHRvIHRoZSBDIEFQSSBpbmNsdWRlOgotCi1cYmVnaW57aXRlbWl6ZX0KLQotXGl0ZW0gVGhlIFB5dGhvbiBzb3VyY2UgdHJlZSB3YXMgY29udmVydGVkIGZyb20gQ1ZTIHRvIFN1YnZlcnNpb24sIAotaW4gYSBjb21wbGV4IG1pZ3JhdGlvbiBwcm9jZWR1cmUgdGhhdCB3YXMgc3VwZXJ2aXNlZCBhbmQgZmxhd2xlc3NseQotY2FycmllZCBvdXQgYnkgTWFydGluIHZvbn5MXCJvd2lzLiAgVGhlIHByb2NlZHVyZSB3YXMgZGV2ZWxvcGVkIGFzCi1ccGVwezM0N30uCi0KLVxpdGVtIENvdmVyaXR5LCBhIGNvbXBhbnkgdGhhdCBtYXJrZXRzIGEgc291cmNlIGNvZGUgYW5hbHlzaXMgdG9vbAotY2FsbGVkIFByZXZlbnQsIHByb3ZpZGVkIHRoZSByZXN1bHRzIG9mIHRoZWlyIGV4YW1pbmF0aW9uIG9mIHRoZSBQeXRob24KLXNvdXJjZSBjb2RlLiAgVGhlIGFuYWx5c2lzIGZvdW5kIGFib3V0IDYwIGJ1Z3MgdGhhdCAKLXdlcmUgcXVpY2tseSBmaXhlZC4gIE1hbnkgb2YgdGhlIGJ1Z3Mgd2VyZSByZWZjb3VudGluZyBwcm9ibGVtcywgb2Z0ZW4KLW9jY3VycmluZyBpbiBlcnJvci1oYW5kbGluZyBjb2RlLiAgU2VlCi1cdXJse2h0dHA6Ly9zY2FuLmNvdmVyaXR5LmNvbX0gZm9yIHRoZSBzdGF0aXN0aWNzLgotCi1caXRlbSBUaGUgbGFyZ2VzdCBjaGFuZ2UgdG8gdGhlIEMgQVBJIGNhbWUgZnJvbSBccGVwezM1M30sCi13aGljaCBtb2RpZmllcyB0aGUgaW50ZXJwcmV0ZXIgdG8gdXNlIGEgXGN0eXBle1B5X3NzaXplX3R9IHR5cGUKLWRlZmluaXRpb24gaW5zdGVhZCBvZiBcY3R5cGV7aW50fS4gIFNlZSB0aGUgZWFybGllcgotc2VjdGlvbn5ccmVme3BlcC0zNTN9IGZvciBhIGRpc2N1c3Npb24gb2YgdGhpcyBjaGFuZ2UuCi0KLVxpdGVtIFRoZSBkZXNpZ24gb2YgdGhlIGJ5dGVjb2RlIGNvbXBpbGVyIGhhcyBjaGFuZ2VkIGEgZ3JlYXQgZGVhbCwgCi1ubyBsb25nZXIgZ2VuZXJhdGluZyBieXRlY29kZSBieSB0cmF2ZXJzaW5nIHRoZSBwYXJzZSB0cmVlLiAgSW5zdGVhZAotdGhlIHBhcnNlIHRyZWUgaXMgY29udmVydGVkIHRvIGFuIGFic3RyYWN0IHN5bnRheCB0cmVlIChvciBBU1QpLCBhbmQgaXQgaXMgCi10aGUgYWJzdHJhY3Qgc3ludGF4IHRyZWUgdGhhdCdzIHRyYXZlcnNlZCB0byBwcm9kdWNlIHRoZSBieXRlY29kZS4KLQotSXQncyBwb3NzaWJsZSBmb3IgUHl0aG9uIGNvZGUgdG8gb2J0YWluIEFTVCBvYmplY3RzIGJ5IHVzaW5nIHRoZSAKLVxmdW5jdGlvbntjb21waWxlKCl9IGJ1aWx0LWluIGFuZCBzcGVjaWZ5aW5nIFxjb2Rle19hc3QuUHlDRl9PTkxZX0FTVH0KLWFzIHRoZSB2YWx1ZSBvZiB0aGUgCi1cdmFye2ZsYWdzfSBwYXJhbWV0ZXI6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWZyb20gX2FzdCBpbXBvcnQgUHlDRl9PTkxZX0FTVAotYXN0ID0gY29tcGlsZSgiIiJhPTAKLWZvciBpIGluIHJhbmdlKDEwKToKLSAgICBhICs9IGkKLSIiIiwgIjxzdHJpbmc+IiwgJ2V4ZWMnLCBQeUNGX09OTFlfQVNUKQotCi1hc3NpZ25tZW50ID0gYXN0LmJvZHlbMF0KLWZvcl9sb29wID0gYXN0LmJvZHlbMV0KLVxlbmR7dmVyYmF0aW19Ci0KLU5vIG9mZmljaWFsIGRvY3VtZW50YXRpb24gaGFzIGJlZW4gd3JpdHRlbiBmb3IgdGhlIEFTVCBjb2RlIHlldCwgYnV0Ci1ccGVwezMzOX0gZGlzY3Vzc2VzIHRoZSBkZXNpZ24uICBUbyBzdGFydCBsZWFybmluZyBhYm91dCB0aGUgY29kZSwgcmVhZCB0aGUKLWRlZmluaXRpb24gb2YgdGhlIHZhcmlvdXMgQVNUIG5vZGVzIGluIFxmaWxle1BhcnNlci9QeXRob24uYXNkbH0uICBBCi1QeXRob24gc2NyaXB0IHJlYWRzIHRoaXMgZmlsZSBhbmQgZ2VuZXJhdGVzIGEgc2V0IG9mIEMgc3RydWN0dXJlCi1kZWZpbml0aW9ucyBpbiBcZmlsZXtJbmNsdWRlL1B5dGhvbi1hc3QuaH0uICBUaGUKLVxjZnVuY3Rpb257UHlQYXJzZXJfQVNURnJvbVN0cmluZygpfSBhbmQKLVxjZnVuY3Rpb257UHlQYXJzZXJfQVNURnJvbUZpbGUoKX0sIGRlZmluZWQgaW4KLVxmaWxle0luY2x1ZGUvcHl0aG9ucnVuLmh9LCB0YWtlIFB5dGhvbiBzb3VyY2UgYXMgaW5wdXQgYW5kIHJldHVybiB0aGUKLXJvb3Qgb2YgYW4gQVNUIHJlcHJlc2VudGluZyB0aGUgY29udGVudHMuICBUaGlzIEFTVCBjYW4gdGhlbiBiZSB0dXJuZWQKLWludG8gYSBjb2RlIG9iamVjdCBieSBcY2Z1bmN0aW9ue1B5QVNUX0NvbXBpbGUoKX0uICBGb3IgbW9yZQotaW5mb3JtYXRpb24sIHJlYWQgdGhlIHNvdXJjZSBjb2RlLCBhbmQgdGhlbiBhc2sgcXVlc3Rpb25zIG9uCi1weXRob24tZGV2LgotCi0lIExpc3Qgb2YgbmFtZXMgdGFrZW4gZnJvbSBKZXJlbXkncyBweXRob24tZGV2IHBvc3QgYXQgCi0lIGh0dHA6Ly9tYWlsLnB5dGhvbi5vcmcvcGlwZXJtYWlsL3B5dGhvbi1kZXYvMjAwNS1PY3RvYmVyLzA1NzUwMC5odG1sCi1UaGUgQVNUIGNvZGUgd2FzIGRldmVsb3BlZCB1bmRlciBKZXJlbXkgSHlsdG9uJ3MgbWFuYWdlbWVudCwgYW5kCi1pbXBsZW1lbnRlZCBieSAoaW4gYWxwaGFiZXRpY2FsIG9yZGVyKSBCcmV0dCBDYW5ub24sIE5pY2sgQ29naGxhbiwKLUdyYW50IEVkd2FyZHMsIEpvaG4gRWhyZXNtYW4sIEt1cnQgS2Fpc2VyLCBOZWFsIE5vcndpdHosIFRpbSBQZXRlcnMsCi1Bcm1pbiBSaWdvLCBhbmQgTmVpbCBTY2hlbWVuYXVlciwgcGx1cyB0aGUgcGFydGljaXBhbnRzIGluIGEgbnVtYmVyIG9mCi1BU1Qgc3ByaW50cyBhdCBjb25mZXJlbmNlcyBzdWNoIGFzIFB5Q29uLgotIAotXGl0ZW0gRXZhbiBKb25lcydzIHBhdGNoIHRvIG9ibWFsbG9jLCBmaXJzdCBkZXNjcmliZWQgaW4gYSB0YWxrCi1hdCBQeUNvbiBEQyAyMDA1LCB3YXMgYXBwbGllZC4gIFB5dGhvbiAyLjQgYWxsb2NhdGVkIHNtYWxsIG9iamVjdHMgaW4KLTI1Nkstc2l6ZWQgYXJlbmFzLCBidXQgbmV2ZXIgZnJlZWQgYXJlbmFzLiAgV2l0aCB0aGlzIHBhdGNoLCBQeXRob24KLXdpbGwgZnJlZSBhcmVuYXMgd2hlbiB0aGV5J3JlIGVtcHR5LiAgVGhlIG5ldCBlZmZlY3QgaXMgdGhhdCBvbiBzb21lCi1wbGF0Zm9ybXMsIHdoZW4geW91IGFsbG9jYXRlIG1hbnkgb2JqZWN0cywgUHl0aG9uJ3MgbWVtb3J5IHVzYWdlIG1heQotYWN0dWFsbHkgZHJvcCB3aGVuIHlvdSBkZWxldGUgdGhlbSBhbmQgdGhlIG1lbW9yeSBtYXkgYmUgcmV0dXJuZWQgdG8KLXRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgKEltcGxlbWVudGVkIGJ5IEV2YW4gSm9uZXMsIGFuZCByZXdvcmtlZCBieSBUaW0KLVBldGVycy4pCi0KLU5vdGUgdGhhdCB0aGlzIGNoYW5nZSBtZWFucyBleHRlbnNpb24gbW9kdWxlcyBtdXN0IGJlIG1vcmUgY2FyZWZ1bAotd2hlbiBhbGxvY2F0aW5nIG1lbW9yeS4gIFB5dGhvbidzIEFQSSBoYXMgbWFueSBkaWZmZXJlbnQKLWZ1bmN0aW9ucyBmb3IgYWxsb2NhdGluZyBtZW1vcnkgdGhhdCBhcmUgZ3JvdXBlZCBpbnRvIGZhbWlsaWVzLiAgRm9yCi1leGFtcGxlLCBcY2Z1bmN0aW9ue1B5TWVtX01hbGxvYygpfSwgXGNmdW5jdGlvbntQeU1lbV9SZWFsbG9jKCl9LCBhbmQKLVxjZnVuY3Rpb257UHlNZW1fRnJlZSgpfSBhcmUgb25lIGZhbWlseSB0aGF0IGFsbG9jYXRlcyByYXcgbWVtb3J5LAotd2hpbGUgXGNmdW5jdGlvbntQeU9iamVjdF9NYWxsb2MoKX0sIFxjZnVuY3Rpb257UHlPYmplY3RfUmVhbGxvYygpfSwKLWFuZCBcY2Z1bmN0aW9ue1B5T2JqZWN0X0ZyZWUoKX0gYXJlIGFub3RoZXIgZmFtaWx5IHRoYXQncyBzdXBwb3NlZCB0bwotYmUgdXNlZCBmb3IgY3JlYXRpbmcgUHl0aG9uIG9iamVjdHMuICAKLQotUHJldmlvdXNseSB0aGVzZSBkaWZmZXJlbnQgZmFtaWxpZXMgYWxsIHJlZHVjZWQgdG8gdGhlIHBsYXRmb3JtJ3MKLVxjZnVuY3Rpb257bWFsbG9jKCl9IGFuZCBcY2Z1bmN0aW9ue2ZyZWUoKX0gZnVuY3Rpb25zLiAgVGhpcyBtZWFudCAKLWl0IGRpZG4ndCBtYXR0ZXIgaWYgeW91IGdvdCB0aGluZ3Mgd3JvbmcgYW5kIGFsbG9jYXRlZCBtZW1vcnkgd2l0aCB0aGUKLVxjZnVuY3Rpb257UHlNZW19IGZ1bmN0aW9uIGJ1dCBmcmVlZCBpdCB3aXRoIHRoZSBcY2Z1bmN0aW9ue1B5T2JqZWN0fQotZnVuY3Rpb24uICBXaXRoIDIuNSdzIGNoYW5nZXMgdG8gb2JtYWxsb2MsIHRoZXNlIGZhbWlsaWVzIG5vdyBkbyBkaWZmZXJlbnQKLXRoaW5ncyBhbmQgbWlzbWF0Y2hlcyB3aWxsIHByb2JhYmx5IHJlc3VsdCBpbiBhIHNlZ2ZhdWx0LiAgWW91IHNob3VsZAotY2FyZWZ1bGx5IHRlc3QgeW91ciBDIGV4dGVuc2lvbiBtb2R1bGVzIHdpdGggUHl0aG9uIDIuNS4KLQotXGl0ZW0gVGhlIGJ1aWx0LWluIHNldCB0eXBlcyBub3cgaGF2ZSBhbiBvZmZpY2lhbCBDIEFQSS4gIENhbGwKLVxjZnVuY3Rpb257UHlTZXRfTmV3KCl9IGFuZCBcY2Z1bmN0aW9ue1B5RnJvemVuU2V0X05ldygpfSB0byBjcmVhdGUgYQotbmV3IHNldCwgXGNmdW5jdGlvbntQeVNldF9BZGQoKX0gYW5kIFxjZnVuY3Rpb257UHlTZXRfRGlzY2FyZCgpfSB0bwotYWRkIGFuZCByZW1vdmUgZWxlbWVudHMsIGFuZCBcY2Z1bmN0aW9ue1B5U2V0X0NvbnRhaW5zfSBhbmQKLVxjZnVuY3Rpb257UHlTZXRfU2l6ZX0gdG8gZXhhbWluZSB0aGUgc2V0J3Mgc3RhdGUuCi0oQ29udHJpYnV0ZWQgYnkgUmF5bW9uZCBIZXR0aW5nZXIuKQotCi1caXRlbSBDIGNvZGUgY2FuIG5vdyBvYnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGV4YWN0IHJldmlzaW9uCi1vZiB0aGUgUHl0aG9uIGludGVycHJldGVyIGJ5IGNhbGxpbmcgdGhlIAotXGNmdW5jdGlvbntQeV9HZXRCdWlsZEluZm8oKX0gZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgCi1zdHJpbmcgb2YgYnVpbGQgaW5mb3JtYXRpb24gbGlrZSB0aGlzOgotXGNvZGV7InRydW5rOjQ1MzU1OjQ1MzU2TSwgQXByIDEzIDIwMDYsIDA3OjQyOjE5In0uICAKLShDb250cmlidXRlZCBieSBCYXJyeSBXYXJzYXcuKQotCi1caXRlbSBUd28gbmV3IG1hY3JvcyBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSBDIGZ1bmN0aW9ucyB0aGF0IGFyZQotbG9jYWwgdG8gdGhlIGN1cnJlbnQgZmlsZSBzbyB0aGF0IGEgZmFzdGVyIGNhbGxpbmcgY29udmVudGlvbiBjYW4gYmUKLXVzZWQuICBcY2Z1bmN0aW9ue1B5X0xPQ0FMKFx2YXJ7dHlwZX0pfSBkZWNsYXJlcyB0aGUgZnVuY3Rpb24gYXMKLXJldHVybmluZyBhIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgXHZhcnt0eXBlfSBhbmQgdXNlcyBhIGZhc3QtY2FsbGluZwotcXVhbGlmaWVyLiBcY2Z1bmN0aW9ue1B5X0xPQ0FMX0lOTElORShcdmFye3R5cGV9KX0gZG9lcyB0aGUgc2FtZSB0aGluZwotYW5kIGFsc28gcmVxdWVzdHMgdGhlIGZ1bmN0aW9uIGJlIGlubGluZWQuICBJZgotXGNmdW5jdGlvbntQWV9MT0NBTF9BR0dSRVNTSVZFfSBpcyBkZWZpbmVkIGJlZm9yZSBcZmlsZXtweXRob24uaH0gaXMKLWluY2x1ZGVkLCBhIHNldCBvZiBtb3JlIGFnZ3Jlc3NpdmUgb3B0aW1pemF0aW9ucyBhcmUgZW5hYmxlZCBmb3IgdGhlCi1tb2R1bGU7IHlvdSBzaG91bGQgYmVuY2htYXJrIHRoZSByZXN1bHRzIHRvIGZpbmQgb3V0IGlmIHRoZXNlCi1vcHRpbWl6YXRpb25zIGFjdHVhbGx5IG1ha2UgdGhlIGNvZGUgZmFzdGVyLiAgKENvbnRyaWJ1dGVkIGJ5IEZyZWRyaWsKLUx1bmRoIGF0IHRoZSBOZWVkRm9yU3BlZWQgc3ByaW50LikKLQotXGl0ZW0gXGNmdW5jdGlvbntQeUVycl9OZXdFeGNlcHRpb24oXHZhcntuYW1lfSwgXHZhcntiYXNlfSwKLVx2YXJ7ZGljdH0pfSBjYW4gbm93IGFjY2VwdCBhIHR1cGxlIG9mIGJhc2UgY2xhc3NlcyBhcyBpdHMgXHZhcntiYXNlfQotYXJndW1lbnQuICAoQ29udHJpYnV0ZWQgYnkgR2VvcmcgQnJhbmRsLikKLQotXGl0ZW0gVGhlIFxjZnVuY3Rpb257UHlFcnJfV2FybigpfSBmdW5jdGlvbiBmb3IgaXNzdWluZyB3YXJuaW5ncwotaXMgbm93IGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIFxjZnVuY3Rpb257UHlFcnJfV2FybkV4KGNhdGVnb3J5LAotbWVzc2FnZSwgc3RhY2tsZXZlbCl9IHdoaWNoIGxldHMgeW91IHNwZWNpZnkgdGhlIG51bWJlciBvZiBzdGFjawotZnJhbWVzIHNlcGFyYXRpbmcgdGhpcyBmdW5jdGlvbiBhbmQgdGhlIGNhbGxlci4gIEEgXHZhcntzdGFja2xldmVsfSBvZgotMSBpcyB0aGUgZnVuY3Rpb24gY2FsbGluZyBcY2Z1bmN0aW9ue1B5RXJyX1dhcm5FeCgpfSwgMiBpcyB0aGUKLWZ1bmN0aW9uIGFib3ZlIHRoYXQsIGFuZCBzbyBmb3J0aC4gIChBZGRlZCBieSBOZWFsIE5vcndpdHouKQotCi1caXRlbSBUaGUgQ1B5dGhvbiBpbnRlcnByZXRlciBpcyBzdGlsbCB3cml0dGVuIGluIEMsIGJ1dCAKLXRoZSBjb2RlIGNhbiBub3cgYmUgY29tcGlsZWQgd2l0aCBhIHtcQ3BwfSBjb21waWxlciB3aXRob3V0IGVycm9ycy4gIAotKEltcGxlbWVudGVkIGJ5IEFudGhvbnkgQmF4dGVyLCBNYXJ0aW4gdm9ufkxcIm93aXMsIFNraXAgTW9udGFuYXJvLikKLQotXGl0ZW0gVGhlIFxjZnVuY3Rpb257UHlSYW5nZV9OZXcoKX0gZnVuY3Rpb24gd2FzIHJlbW92ZWQuICBJdCB3YXMKLW5ldmVyIGRvY3VtZW50ZWQsIG5ldmVyIHVzZWQgaW4gdGhlIGNvcmUgY29kZSwgYW5kIGhhZCBkYW5nZXJvdXNseSBsYXgKLWVycm9yIGNoZWNraW5nLiAgSW4gdGhlIHVubGlrZWx5IGNhc2UgdGhhdCB5b3VyIGV4dGVuc2lvbnMgd2VyZSB1c2luZwotaXQsIHlvdSBjYW4gcmVwbGFjZSBpdCBieSBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nOgotXGJlZ2lue3ZlcmJhdGltfQotcmFuZ2UgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0KikgJlB5UmFuZ2VfVHlwZSwgImxsbCIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIHN0b3AsIHN0ZXApOwotXGVuZHt2ZXJiYXRpbX0KLQotXGVuZHtpdGVtaXplfQotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc3Vic2VjdGlvbntQb3J0LVNwZWNpZmljIENoYW5nZXNcbGFiZWx7cG9ydHN9fQotCi1cYmVnaW57aXRlbWl6ZX0KLQotXGl0ZW0gTWFjT1MgWCAoMTAuMyBhbmQgaGlnaGVyKTogZHluYW1pYyBsb2FkaW5nIG9mIG1vZHVsZXMKLW5vdyB1c2VzIHRoZSBcY2Z1bmN0aW9ue2Rsb3BlbigpfSBmdW5jdGlvbiBpbnN0ZWFkIG9mIE1hY09TLXNwZWNpZmljCi1mdW5jdGlvbnMuCi0KLVxpdGVtIE1hY09TIFg6IGEgXGxvbmdwcm9ncmFtb3B0e2VuYWJsZS11bml2ZXJzYWxzZGt9IHN3aXRjaCB3YXMgYWRkZWQKLXRvIHRoZSBccHJvZ3JhbXtjb25maWd1cmV9IHNjcmlwdCB0aGF0IGNvbXBpbGVzIHRoZSBpbnRlcnByZXRlciBhcyBhCi11bml2ZXJzYWwgYmluYXJ5IGFibGUgdG8gcnVuIG9uIGJvdGggUG93ZXJQQyBhbmQgSW50ZWwgcHJvY2Vzc29ycy4KLShDb250cmlidXRlZCBieSBSb25hbGQgT3Vzc29yZW4uKQotCi1caXRlbSBXaW5kb3dzOiBcZmlsZXsuZGxsfSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGFzIGEgZmlsZW5hbWUgZXh0ZW5zaW9uIGZvciAKLWV4dGVuc2lvbiBtb2R1bGVzLiAgXGZpbGV7LnB5ZH0gaXMgbm93IHRoZSBvbmx5IGZpbGVuYW1lIGV4dGVuc2lvbiB0aGF0IHdpbGwKLWJlIHNlYXJjaGVkIGZvci4KLQotXGVuZHtpdGVtaXplfQotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntQb3J0aW5nIHRvIFB5dGhvbiAyLjVcbGFiZWx7cG9ydGluZ319Ci0KLVRoaXMgc2VjdGlvbiBsaXN0cyBwcmV2aW91c2x5IGRlc2NyaWJlZCBjaGFuZ2VzIHRoYXQgbWF5IHJlcXVpcmUKLWNoYW5nZXMgdG8geW91ciBjb2RlOgotCi1cYmVnaW57aXRlbWl6ZX0KLQotXGl0ZW0gQVNDSUkgaXMgbm93IHRoZSBkZWZhdWx0IGVuY29kaW5nIGZvciBtb2R1bGVzLiAgSXQncyBub3cgCi1hIHN5bnRheCBlcnJvciBpZiBhIG1vZHVsZSBjb250YWlucyBzdHJpbmcgbGl0ZXJhbHMgd2l0aCA4LWJpdAotY2hhcmFjdGVycyBidXQgZG9lc24ndCBoYXZlIGFuIGVuY29kaW5nIGRlY2xhcmF0aW9uLiAgSW4gUHl0aG9uIDIuNAotdGhpcyB0cmlnZ2VyZWQgYSB3YXJuaW5nLCBub3QgYSBzeW50YXggZXJyb3IuCi0KLVxpdGVtIFByZXZpb3VzbHksIHRoZSBcbWVtYmVye2dpX2ZyYW1lfSBhdHRyaWJ1dGUgb2YgYSBnZW5lcmF0b3IKLXdhcyBhbHdheXMgYSBmcmFtZSBvYmplY3QuICBCZWNhdXNlIG9mIHRoZSBccGVwezM0Mn0gY2hhbmdlcwotZGVzY3JpYmVkIGluIHNlY3Rpb25+XHJlZntwZXAtMzQyfSwgaXQncyBub3cgcG9zc2libGUKLWZvciBcbWVtYmVye2dpX2ZyYW1lfSB0byBiZSBcY29kZXtOb25lfS4KLQotXGl0ZW0gQSBuZXcgd2FybmluZywgXGNsYXNze1VuaWNvZGVXYXJuaW5nfSwgaXMgdHJpZ2dlcmVkIHdoZW4gCi15b3UgYXR0ZW1wdCB0byBjb21wYXJlIGEgVW5pY29kZSBzdHJpbmcgYW5kIGFuIDgtYml0IHN0cmluZyB0aGF0IGNhbid0Ci1iZSBjb252ZXJ0ZWQgdG8gVW5pY29kZSB1c2luZyB0aGUgZGVmYXVsdCBBU0NJSSBlbmNvZGluZy4gIFByZXZpb3VzbHkKLXN1Y2ggY29tcGFyaXNvbnMgd291bGQgcmFpc2UgYSBcY2xhc3N7VW5pY29kZURlY29kZUVycm9yfSBleGNlcHRpb24uCi0KLVxpdGVtIExpYnJhcnk6IHRoZSBcbW9kdWxle2Nzdn0gbW9kdWxlIGlzIG5vdyBzdHJpY3RlciBhYm91dCBtdWx0aS1saW5lIHF1b3RlZAotZmllbGRzLiAgSWYgeW91ciBmaWxlcyBjb250YWluIG5ld2xpbmVzIGVtYmVkZGVkIHdpdGhpbiBmaWVsZHMsIHRoZQotaW5wdXQgc2hvdWxkIGJlIHNwbGl0IGludG8gbGluZXMgaW4gYSBtYW5uZXIgd2hpY2ggcHJlc2VydmVzIHRoZQotbmV3bGluZSBjaGFyYWN0ZXJzLgotCi1caXRlbSBMaWJyYXJ5OiB0aGUgXG1vZHVsZXtsb2NhbGV9IG1vZHVsZSdzIAotXGZ1bmN0aW9ue2Zvcm1hdCgpfSBmdW5jdGlvbidzIHdvdWxkIHByZXZpb3VzbHkgCi1hY2NlcHQgYW55IHN0cmluZyBhcyBsb25nIGFzIG5vIG1vcmUgdGhhbiBvbmUgXCVjaGFyIHNwZWNpZmllcgotYXBwZWFyZWQuICBJbiBQeXRob24gMi41LCB0aGUgYXJndW1lbnQgbXVzdCBiZSBleGFjdGx5IG9uZSBcJWNoYXIKLXNwZWNpZmllciB3aXRoIG5vIHN1cnJvdW5kaW5nIHRleHQuIAotCi1caXRlbSBMaWJyYXJ5OiBUaGUgXG1vZHVsZXtwaWNrbGV9IGFuZCBcbW9kdWxle2NQaWNrbGV9IG1vZHVsZXMgbm8KLWxvbmdlciBhY2NlcHQgYSByZXR1cm4gdmFsdWUgb2YgXGNvZGV7Tm9uZX0gZnJvbSB0aGUKLVxtZXRob2R7X19yZWR1Y2VfXygpfSBtZXRob2Q7IHRoZSBtZXRob2QgbXVzdCByZXR1cm4gYSB0dXBsZSBvZgotYXJndW1lbnRzIGluc3RlYWQuICBUaGUgbW9kdWxlcyBhbHNvIG5vIGxvbmdlciBhY2NlcHQgdGhlIGRlcHJlY2F0ZWQKLVx2YXJ7YmlufSBrZXl3b3JkIHBhcmFtZXRlci4KLQotXGl0ZW0gTGlicmFyeTogVGhlIFxtb2R1bGV7U2ltcGxlWE1MUlBDU2VydmVyfSBhbmQgXG1vZHVsZXtEb2NYTUxSUENTZXJ2ZXJ9IAotY2xhc3NlcyBub3cgaGF2ZSBhIFxtZW1iZXJ7cnBjX3BhdGhzfSBhdHRyaWJ1dGUgdGhhdCBjb25zdHJhaW5zCi1YTUwtUlBDIG9wZXJhdGlvbnMgdG8gYSBsaW1pdGVkIHNldCBvZiBVUkwgcGF0aHM7IHRoZSBkZWZhdWx0IGlzCi10byBhbGxvdyBvbmx5IFxjb2RleycvJ30gYW5kIFxjb2RleycvUlBDMid9LiAgU2V0dGluZyAKLVxtZW1iZXJ7cnBjX3BhdGhzfSB0byBcY29kZXtOb25lfSBvciBhbiBlbXB0eSB0dXBsZSBkaXNhYmxlcyAKLXRoaXMgcGF0aCBjaGVja2luZy4KLQotXGl0ZW0gQyBBUEk6IE1hbnkgZnVuY3Rpb25zIG5vdyB1c2UgXGN0eXBle1B5X3NzaXplX3R9IAotaW5zdGVhZCBvZiBcY3R5cGV7aW50fSB0byBhbGxvdyBwcm9jZXNzaW5nIG1vcmUgZGF0YSBvbiA2NC1iaXQKLW1hY2hpbmVzLiAgRXh0ZW5zaW9uIGNvZGUgbWF5IG5lZWQgdG8gbWFrZSB0aGUgc2FtZSBjaGFuZ2UgdG8gYXZvaWQKLXdhcm5pbmdzIGFuZCB0byBzdXBwb3J0IDY0LWJpdCBtYWNoaW5lcy4gIFNlZSB0aGUgZWFybGllcgotc2VjdGlvbn5ccmVme3BlcC0zNTN9IGZvciBhIGRpc2N1c3Npb24gb2YgdGhpcyBjaGFuZ2UuCi0KLVxpdGVtIEMgQVBJOiAKLVRoZSBvYm1hbGxvYyBjaGFuZ2VzIG1lYW4gdGhhdCAKLXlvdSBtdXN0IGJlIGNhcmVmdWwgdG8gbm90IG1peCB1c2FnZSAKLW9mIHRoZSBcY2Z1bmN0aW9ue1B5TWVtXyooKX0gYW5kIFxjZnVuY3Rpb257UHlPYmplY3RfKigpfQotZmFtaWxpZXMgb2YgZnVuY3Rpb25zLiBNZW1vcnkgYWxsb2NhdGVkIHdpdGggCi1vbmUgZmFtaWx5J3MgXGNmdW5jdGlvbnsqX01hbGxvYygpfSBtdXN0IGJlIAotZnJlZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBmYW1pbHkncyBcY2Z1bmN0aW9ueypfRnJlZSgpfSBmdW5jdGlvbi4KLQotXGVuZHtpdGVtaXplfQotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntBY2tub3dsZWRnZW1lbnRzIFxsYWJlbHthY2tzfX0KLQotVGhlIGF1dGhvciB3b3VsZCBsaWtlIHRvIHRoYW5rIHRoZSBmb2xsb3dpbmcgcGVvcGxlIGZvciBvZmZlcmluZwotc3VnZ2VzdGlvbnMsIGNvcnJlY3Rpb25zIGFuZCBhc3Npc3RhbmNlIHdpdGggdmFyaW91cyBkcmFmdHMgb2YgdGhpcwotYXJ0aWNsZTogR2VvcmcgQnJhbmRsLCBOaWNrIENvZ2hsYW4sIFBoaWxsaXAgSi4gRWJ5LCBMYXJzIEd1c3RcImFiZWwsCi1SYXltb25kIEhldHRpbmdlciwgUmFsZiBXLiBHcm9zc2UtS3Vuc3RsZXZlLCBLZW50IEpvaG5zb24sIElhaW4gTG93ZSwKLU1hcnRpbiB2b25+TFwib3dpcywgRnJlZHJpayBMdW5kaCwgQW5kcmV3IE1jTmFtYXJhLCBTa2lwIE1vbnRhbmFybywKLUd1c3Rhdm8gTmllbWV5ZXIsIFBhdWwgUHJlc2NvZCwgSmFtZXMgUHJ5b3IsIE1pa2UgUm92bmVyLCBTY290dAotV2Vpa2FydCwgQmFycnkgV2Fyc2F3LCBUaG9tYXMgV291dGVycy4KLQotXGVuZHtkb2N1bWVudH0KZGlmZiAtLWdpdCBhL0RvYy93aGF0c25ldy93aGF0c25ldzI2LnRleCBiL0RvYy93aGF0c25ldy93aGF0c25ldzI2LnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQyMzczZi4uMDAwMDAwMAotLS0gYS9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyNi50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotXGRvY3VtZW50Y2xhc3N7aG93dG99Ci1cdXNlcGFja2FnZXtkaXN0dXRpbHN9Ci0lICRJZCQKLQotJSBSdWxlcyBmb3IgbWFpbnRlbmFuY2U6Ci0lIAotJSAgKiBBbnlvbmUgY2FuIGFkZCB0ZXh0IHRvIHRoaXMgZG9jdW1lbnQuICBEbyBub3Qgc3BlbmQgdmVyeSBtdWNoIHRpbWUKLSUgICAgb24gdGhlIHdvcmRpbmcgb2YgeW91ciBjaGFuZ2VzLCBiZWNhdXNlIHlvdXIgdGV4dCB3aWxsIHByb2JhYmx5Ci0lICAgIGdldCByZXdyaXR0ZW4gdG8gc29tZSBkZWdyZWUuCi0lCi0lICAqIFRoZSBtYWludGFpbmVyIHdpbGwgZ28gdGhyb3VnaCBNaXNjL05FV1MgcGVyaW9kaWNhbGx5IGFuZCBhZGQKLSUgICAgY2hhbmdlczsgaXQncyB0aGVyZWZvcmUgbW9yZSBpbXBvcnRhbnQgdG8gYWRkIHlvdXIgY2hhbmdlcyB0byAKLSUgICAgTWlzYy9ORVdTIHRoYW4gdG8gdGhpcyBmaWxlLgotJQotJSAgKiBUaGlzIGlzIG5vdCBhIGNvbXBsZXRlIGxpc3Qgb2YgZXZlcnkgc2luZ2xlIGNoYW5nZTsgY29tcGxldGVuZXNzCi0lICAgIGlzIHRoZSBwdXJwb3NlIG9mIE1pc2MvTkVXUy4gIFNvbWUgY2hhbmdlcyBJIGNvbnNpZGVyIHRvbyBzbWFsbAotJSAgICBvciBlc290ZXJpYyB0byBpbmNsdWRlLiAgSWYgc3VjaCBhIGNoYW5nZSBpcyBhZGRlZCB0byB0aGUgdGV4dCwKLSUgICAgSSdsbCBqdXN0IHJlbW92ZSBpdC4gIChUaGlzIGlzIGFub3RoZXIgcmVhc29uIHlvdSBzaG91bGRuJ3Qgc3BlbmQKLSUgICAgdG9vIG11Y2ggdGltZSBvbiB3cml0aW5nIHlvdXIgYWRkaXRpb24uKQotJQotJSAgKiBJZiB5b3Ugd2FudCB0byBkcmF3IHlvdXIgbmV3IHRleHQgdG8gdGhlIGF0dGVudGlvbiBvZiB0aGUKLSUgICAgbWFpbnRhaW5lciwgYWRkICdYWFgnIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhcmFncmFwaCBvcgotJSAgICBzZWN0aW9uLgotJQotJSAgKiBJdCdzIE9LIHRvIGp1c3QgYWRkIGEgZnJhZ21lbnRhcnkgbm90ZSBhYm91dCBhIGNoYW5nZS4gIEZvcgotJSAgICBleGFtcGxlOiAiWFhYIERlc2NyaWJlIHRoZSB0cmFuc21vZ3JpZnkoKSBmdW5jdGlvbiBhZGRlZCB0byB0aGUKLSUgICAgc29ja2V0IG1vZHVsZS4iICBUaGUgbWFpbnRhaW5lciB3aWxsIHJlc2VhcmNoIHRoZSBjaGFuZ2UgYW5kCi0lICAgIHdyaXRlIHRoZSBuZWNlc3NhcnkgdGV4dC4KLSUKLSUgICogWW91IGNhbiBjb21tZW50IG91dCB5b3VyIGFkZGl0aW9ucyBpZiB5b3UgbGlrZSwgYnV0IGl0J3Mgbm90Ci0lICAgIG5lY2Vzc2FyeSAoZXNwZWNpYWxseSB3aGVuIGEgZmluYWwgcmVsZWFzZSBpcyBzb21lIG1vbnRocyBhd2F5KS4KLSUKLSUgICogQ3JlZGl0IHRoZSBhdXRob3Igb2YgYSBwYXRjaCBvciBidWdmaXguICAgSnVzdCB0aGUgbmFtZSBpcwotJSAgICBzdWZmaWNpZW50OyB0aGUgZS1tYWlsIGFkZHJlc3MgaXNuJ3QgbmVjZXNzYXJ5LgotJQotJSAgKiBJdCdzIGhlbHBmdWwgdG8gYWRkIHRoZSBidWcvcGF0Y2ggbnVtYmVyIGFzIGEgY29tbWVudDoKLSUKLSUgICAgICAgJSBQYXRjaCAxMjM0NQotJSAgICAgICBYWFggRGVzY3JpYmUgdGhlIHRyYW5zbW9ncmlmeSgpIGZ1bmN0aW9uIGFkZGVkIHRvIHRoZSBzb2NrZXQKLSUgICAgICAgbW9kdWxlLgotJSAgICAgICAoQ29udHJpYnV0ZWQgYnkgUC5ZLiBEZXZlbG9wZXIuKQotJQotJSAgICBUaGlzIHNhdmVzIHRoZSBtYWludGFpbmVyIHRoZSBlZmZvcnQgb2YgZ29pbmcgdGhyb3VnaCB0aGUgU1ZOIGxvZwotJSAgICB3aGVuIHJlc2VhcmNoaW5nIGEgY2hhbmdlLgotCi1cdGl0bGV7V2hhdCdzIE5ldyBpbiBQeXRob24gMi42fQotXHJlbGVhc2V7MC4wfQotXGF1dGhvcntBLk0uIEt1Y2hsaW5nfQotXGF1dGhvcmFkZHJlc3N7XGVtYWlse2Fta0BhbWsuY2F9fQotCi1cYmVnaW57ZG9jdW1lbnR9Ci1cbWFrZXRpdGxlCi1cdGFibGVvZmNvbnRlbnRzCi0KLVRoaXMgYXJ0aWNsZSBleHBsYWlucyB0aGUgbmV3IGZlYXR1cmVzIGluIFB5dGhvbiAyLjYuICBObyByZWxlYXNlIGRhdGUKLWZvciBQeXRob24gMi42IGhhcyBiZWVuIHNldDsgaXQgd2lsbCBwcm9iYWJseSBiZSByZWxlYXNlZCBpbiBtaWQgMjAwOC4KLQotJSBDb21wYXJlIHdpdGggcHJldmlvdXMgcmVsZWFzZSBpbiAyIC0gMyBzZW50ZW5jZXMgaGVyZS4KLQotVGhpcyBhcnRpY2xlIGRvZXNuJ3QgYXR0ZW1wdCB0byBwcm92aWRlIGEgY29tcGxldGUgc3BlY2lmaWNhdGlvbiBvZgotdGhlIG5ldyBmZWF0dXJlcywgYnV0IGluc3RlYWQgcHJvdmlkZXMgYSBjb252ZW5pZW50IG92ZXJ2aWV3LiAgRm9yCi1mdWxsIGRldGFpbHMsIHlvdSBzaG91bGQgcmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gZm9yIFB5dGhvbiAyLjYuCi0lIGFkZCBoeXBlcmxpbmsgd2hlbiB0aGUgZG9jdW1lbnRhdGlvbiBiZWNvbWVzIGF2YWlsYWJsZSBvbmxpbmUuCi1JZiB5b3Ugd2FudCB0byB1bmRlcnN0YW5kIHRoZSBjb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiBhbmQgZGVzaWduCi1yYXRpb25hbGUsIHJlZmVyIHRvIHRoZSBQRVAgZm9yIGEgcGFydGljdWxhciBuZXcgZmVhdHVyZS4KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0lIExhcmdlLCBQRVAtbGV2ZWwgZmVhdHVyZXMgYW5kIGNoYW5nZXMgc2hvdWxkIGJlIGRlc2NyaWJlZCBoZXJlLgotCi0lIFNob3VsZCB0aGVyZSBiZSBhIG5ldyBzZWN0aW9uIGhlcmUgZm9yIDNrIG1pZ3JhdGlvbj8KLSUgT3IgcGVyaGFwcyBhIG1vcmUgZ2VuZXJhbCBzZWN0aW9uIGRlc2NyaWJpbmcgbW9kdWxlIGNoYW5nZXMvZGVwcmVjYXRpb24/Ci0lIHNldHMgbW9kdWxlIGRlcHJlY2F0ZWQKLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue090aGVyIExhbmd1YWdlIENoYW5nZXN9Ci0KLUhlcmUgYXJlIGFsbCBvZiB0aGUgY2hhbmdlcyB0aGF0IFB5dGhvbiAyLjYgbWFrZXMgdG8gdGhlIGNvcmUgUHl0aG9uCi1sYW5ndWFnZS4KLQotXGJlZ2lue2l0ZW1pemV9Ci0KLSUgQnVnIDE1NjkzNTYKLVxpdGVtIEFuIG9ic2N1cmUgY2hhbmdlOiB3aGVuIHlvdSB1c2UgdGhlIHRoZSBcZnVuY3Rpb257bG9jYWxzKCl9Ci1mdW5jdGlvbiBpbnNpZGUgYSBca2V5d29yZHtjbGFzc30gc3RhdGVtZW50LCB0aGUgcmVzdWx0aW5nIGRpY3Rpb25hcnkKLW5vIGxvbmdlciByZXR1cm5zIGZyZWUgdmFyaWFibGVzLiAgKEZyZWUgdmFyaWFibGVzLCBpbiB0aGlzIGNhc2UsIGFyZQotdmFyaWFibGVzIHJlZmVycmVkIHRvIGluIHRoZSBca2V5d29yZHtjbGFzc30gc3RhdGVtZW50IAotdGhhdCBhcmVuJ3QgYXR0cmlidXRlcyBvZiB0aGUgY2xhc3MuKQotCi1cZW5ke2l0ZW1pemV9Ci0KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzdWJzZWN0aW9ue09wdGltaXphdGlvbnN9Ci0KLVxiZWdpbntpdGVtaXplfQotCi0lIFBhdGNoIDE2MjQwNTkKLVxpdGVtIEludGVybmFsbHksIGEgYml0IGlzIG5vdyBzZXQgaW4gdHlwZSBvYmplY3RzIHRvIGluZGljYXRlIHNvbWUgb2YKLXRoZSBzdGFuZGFyZCBidWlsdC1pbiB0eXBlcy4gIFRoaXMgc3BlZWRzIHVwIGNoZWNraW5nIGlmIGFuIG9iamVjdCBpcwotYSBzdWJjbGFzcyBvZiBvbmUgb2YgdGhlc2UgdHlwZXMuICAoQ29udHJpYnV0ZWQgYnkgTmVhbCBOb3J3aXR6LikKLQotXGVuZHtpdGVtaXplfQotCi1UaGUgbmV0IHJlc3VsdCBvZiB0aGUgMi42IG9wdGltaXphdGlvbnMgaXMgdGhhdCBQeXRob24gMi42IHJ1bnMgdGhlCi1weXN0b25lIGJlbmNobWFyayBhcm91bmQgWFhcJSBmYXN0ZXIgdGhhbiBQeXRob24gMi41LgotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntOZXcsIEltcHJvdmVkLCBhbmQgRGVwcmVjYXRlZCBNb2R1bGVzfQotCi1BcyB1c3VhbCwgUHl0aG9uJ3Mgc3RhbmRhcmQgbGlicmFyeSByZWNlaXZlZCBhIG51bWJlciBvZiBlbmhhbmNlbWVudHMgYW5kCi1idWcgZml4ZXMuICBIZXJlJ3MgYSBwYXJ0aWFsIGxpc3Qgb2YgdGhlIG1vc3Qgbm90YWJsZSBjaGFuZ2VzLCBzb3J0ZWQKLWFscGhhYmV0aWNhbGx5IGJ5IG1vZHVsZSBuYW1lLiBDb25zdWx0IHRoZQotXGZpbGV7TWlzYy9ORVdTfSBmaWxlIGluIHRoZSBzb3VyY2UgdHJlZSBmb3IgYSBtb3JlCi1jb21wbGV0ZSBsaXN0IG9mIGNoYW5nZXMsIG9yIGxvb2sgdGhyb3VnaCB0aGUgQ1ZTIGxvZ3MgZm9yIGFsbCB0aGUKLWRldGFpbHMuCi0KLVxiZWdpbntpdGVtaXplfQotCi1caXRlbSBOZXcgZGF0YSB0eXBlIGluIHRoZSBcbW9kdWxle2NvbGxlY3Rpb25zfSBtb2R1bGU6Ci1cY2xhc3N7TmFtZWRUdXBsZShcdmFye3R5cGVuYW1lfSwgXHZhcntmaWVsZG5hbWVzfSl9IGlzIGEgZmFjdG9yeSBmdW5jdGlvbiB0aGF0Ci1jcmVhdGVzIHN1YmNsYXNzZXMgb2YgdGhlIHN0YW5kYXJkIHR1cGxlIHdob3NlIGZpZWxkcyBhcmUgYWNjZXNzaWJsZQotYnkgbmFtZSBhcyB3ZWxsIGFzIGluZGV4LiAgRm9yIGV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXZhcl90eXBlID0gY29sbGVjdGlvbnMuTmFtZWRUdXBsZSgndmFyaWFibGUnLCAKLSAgICAgICAgICAgICAnaWQgbmFtZSB0eXBlIHNpemUnKQotdmFyID0gdmFyX3R5cGUoMSwgJ2ZyZXF1ZW5jeScsICdpbnQnLCA0KQotCi1wcmludCB2YXJbMF0sIHZhci5pZAkJIyBFcXVpdmFsZW50Ci1wcmludCB2YXJbMl0sIHZhci50eXBlICAgICAgICAgICMgRXF1aXZhbGVudAotXGVuZHt2ZXJiYXRpbX0KLQotKENvbnRyaWJ1dGVkIGJ5IFJheW1vbmQgSGV0dGluZ2VyLikKLQotXGl0ZW0gTmV3IG1ldGhvZCBpbiB0aGUgXG1vZHVsZXtjdXJzZXN9IG1vZHVsZToKLWZvciBhIHdpbmRvdywgXG1ldGhvZHtjaGdhdCgpfSBjaGFuZ2VzIHRoZSBkaXNwbGF5IGNoYXJhY3RlcnMgZm9yIGEgCi1jZXJ0YWluIG51bWJlciBvZiBjaGFyYWN0ZXJzIG9uIGEgc2luZ2xlIGxpbmUuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLSMgQm9sZGZhY2UgdGV4dCBzdGFydGluZyBhdCB5PTAseD0yMSAKLSMgYW5kIGFmZmVjdGluZyB0aGUgcmVzdCBvZiB0aGUgbGluZS4KLXN0ZHNjci5jaGdhdCgwLDIxLCBjdXJzZXMuQV9CT0xEKSAgCi1cZW5ke3ZlcmJhdGltfQotCi0oQ29udHJpYnV0ZWQgYnkgRmFiaWFuIEtyZXV0ei4pCi0KLVxpdGVtIFRoZSBcbW9kdWxle2dvcGhlcmxpYn0gbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQuCi0KLVxpdGVtIE5ldyBmdW5jdGlvbiBpbiB0aGUgXG1vZHVsZXtoZWFwcX0gbW9kdWxlOgotXGZ1bmN0aW9ue21lcmdlKGl0ZXIxLCBpdGVyMiwgLi4uKX0gCi10YWtlcyBhbnkgbnVtYmVyIG9mIGl0ZXJhYmxlcyB0aGF0IHJldHVybiBkYXRhIAotXGVtcGh7aW4gc29ydGVkIG9yZGVyfSwgCi1hbmQgCi1yZXR1cm5zIGEgbmV3IGl0ZXJhdG9yIHRoYXQgcmV0dXJucyB0aGUgY29udGVudHMgb2YKLWFsbCB0aGUgaXRlcmF0b3JzLCBhbHNvIGluIHNvcnRlZCBvcmRlci4gIEZvciBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1oZWFwcS5tZXJnZShbMSwgMywgNSwgOV0sIFsyLCA4LCAxNl0pIC0+Ci0gIFsxLCAyLCAzLCA1LCA4LCA5LCAxNl0KLVxlbmR7dmVyYmF0aW19Ci0KLShDb250cmlidXRlZCBieSBSYXltb25kIEhldHRpbmdlci4pCi0KLVxpdGVtIE5ldyBmdW5jdGlvbiBpbiB0aGUgXG1vZHVsZXtpdGVydG9vbHN9IG1vZHVsZToKLVxmdW5jdGlvbntpemlwX2xvbmdlc3QoaXRlcjEsIGl0ZXIyLCAuLi5cb3B0aW9uYWx7LCBmaWxsdmFsdWV9KX0KLW1ha2VzIHR1cGxlcyBmcm9tIGVhY2ggb2YgdGhlIGVsZW1lbnRzOyBpZiBzb21lIG9mIHRoZSBpdGVyYWJsZXMKLWFyZSBzaG9ydGVyIHRoYW4gb3RoZXJzLCB0aGUgbWlzc2luZyB2YWx1ZXMgCi1hcmUgc2V0IHRvIFx2YXJ7ZmlsbHZhbHVlfS4gIEZvciBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pdGVydG9vbHMuaXppcF9sb25nZXN0KFsxLDIsM10sIFsxLDIsMyw0LDVdKSAtPgotICBbKDEsIDEpLCAoMiwgMiksICgzLCAzKSwgKE5vbmUsIDQpLCAoTm9uZSwgNSldCi1cZW5ke3ZlcmJhdGltfQotCi0oQ29udHJpYnV0ZWQgYnkgUmF5bW9uZCBIZXR0aW5nZXIuKQotCi1caXRlbSBUaGUgXG1vZHVsZXttYWNmc30gbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQuICBUaGlzIGluIHR1cm4KLXJlcXVpcmVkIHRoZSBcZnVuY3Rpb257bWFjb3N0b29scy50b3VjaGVkKCl9IGZ1bmN0aW9uIHRvIGJlIHJlbW92ZWQKLWJlY2F1c2UgaXQgZGVwZW5kZWQgb24gdGhlIFxtb2R1bGV7bWFjZnN9IG1vZHVsZS4KLQotJSBQYXRjaCAjMTQ5MDE5MAotXGl0ZW0gTmV3IGZ1bmN0aW9ucyBpbiB0aGUgXG1vZHVsZXtwb3NpeH0gbW9kdWxlOiBcZnVuY3Rpb257Y2hmbGFncygpfQotYW5kIFxmdW5jdGlvbntsY2hmbGFncygpfSBhcmUgd3JhcHBlcnMgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHN5c3RlbQotY2FsbHMgKHdoZXJlIHRoZXkncmUgYXZhaWxhYmxlKS4gIENvbnN0YW50cyBmb3IgdGhlIGZsYWcgdmFsdWVzIGFyZQotZGVmaW5lZCBpbiB0aGUgXG1vZHVsZXtzdGF0fSBtb2R1bGU7IHNvbWUgcG9zc2libGUgdmFsdWVzIGluY2x1ZGUKLVxjb25zdGFudHtVRl9JTU1VVEFCTEV9IHRvIHNpZ25hbCB0aGUgZmlsZSBtYXkgbm90IGJlIGNoYW5nZWQgYW5kCi1cY29uc3RhbnR7VUZfQVBQRU5EfSB0byBpbmRpY2F0ZSB0aGF0IGRhdGEgY2FuIG9ubHkgYmUgYXBwZW5kZWQgdG8gdGhlCi1maWxlLiAgKENvbnRyaWJ1dGVkIGJ5IE0uIExldmluc29uLikKLQotXGl0ZW0gVGhlIFxtb2R1bGV7cmdiaW1nfSBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZC4KLQotXGl0ZW0gVGhlIFxtb2R1bGV7c210cGxpYn0gbW9kdWxlIG5vdyBzdXBwb3J0cyBTTVRQIG92ZXIgCi1TU0wgdGhhbmtzIHRvIHRoZSBhZGRpdGlvbiBvZiB0aGUgXGNsYXNze1NNVFBfU1NMfSBjbGFzcy4KLVRoaXMgY2xhc3Mgc3VwcG9ydHMgYW4gaW50ZXJmYWNlIGlkZW50aWNhbCB0byB0aGUgZXhpc3RpbmcgXGNsYXNze1NNVFB9IAotY2xhc3MuIChDb250cmlidXRlZCBieSBNb250eSBUYXlsb3IuKQotCi1caXRlbSBUaGUgXG1vZHVsZXt0ZXN0LnRlc3Rfc3VwcG9ydH0gbW9kdWxlIG5vdyBjb250YWlucyBhCi1cZnVuY3Rpb257RW52aXJvbm1lbnRWYXJHdWFyZH0gY29udGV4dCBtYW5hZ2VyIHRoYXQgCi1zdXBwb3J0cyB0ZW1wb3JhcmlseSBjaGFuZ2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kIAotYXV0b21hdGljYWxseSByZXN0b3JlcyB0aGVtIHRvIHRoZWlyIG9sZCB2YWx1ZXMuCi0oQ29udHJpYnV0ZWQgYnkgQnJldHQgQ2Fubm9uLikKLQotXGVuZHtpdGVtaXplfQotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0lIHdob2xlIG5ldyBtb2R1bGVzIGdldCBkZXNjcmliZWQgaW4gXHN1YnNlY3Rpb25zIGhlcmUKLQotCi0lID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue0J1aWxkIGFuZCBDIEFQSSBDaGFuZ2VzfQotCi1DaGFuZ2VzIHRvIFB5dGhvbidzIGJ1aWxkIHByb2Nlc3MgYW5kIHRvIHRoZSBDIEFQSSBpbmNsdWRlOgotCi1cYmVnaW57aXRlbWl6ZX0KLQotXGl0ZW0gRGV0YWlsZWQgY2hhbmdlcyBhcmUgbGlzdGVkIGhlcmUuCi0KLVxlbmR7aXRlbWl6ZX0KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHN1YnNlY3Rpb257UG9ydC1TcGVjaWZpYyBDaGFuZ2VzfQotCi1QbGF0Zm9ybS1zcGVjaWZpYyBjaGFuZ2VzIGdvIGhlcmUuCi0KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue090aGVyIENoYW5nZXMgYW5kIEZpeGVzIFxsYWJlbHtzZWN0aW9uLW90aGVyfX0KLQotQXMgdXN1YWwsIHRoZXJlIHdlcmUgYSBidW5jaCBvZiBvdGhlciBpbXByb3ZlbWVudHMgYW5kIGJ1Z2ZpeGVzCi1zY2F0dGVyZWQgdGhyb3VnaG91dCB0aGUgc291cmNlIHRyZWUuICBBIHNlYXJjaCB0aHJvdWdoIHRoZSBjaGFuZ2UKLWxvZ3MgZmluZHMgdGhlcmUgd2VyZSBYWFggcGF0Y2hlcyBhcHBsaWVkIGFuZCBZWVkgYnVncyBmaXhlZCBiZXR3ZWVuCi1QeXRob24gMi41IGFuZCAyLjYuICBCb3RoIGZpZ3VyZXMgYXJlIGxpa2VseSB0byBiZSB1bmRlcmVzdGltYXRlcy4KLQotU29tZSBvZiB0aGUgbW9yZSBub3RhYmxlIGNoYW5nZXMgYXJlOgotCi1cYmVnaW57aXRlbWl6ZX0KLQotXGl0ZW0gRGV0YWlscyBnbyBoZXJlLgotCi1cZW5ke2l0ZW1pemV9Ci0KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue1BvcnRpbmcgdG8gUHl0aG9uIDIuNn0KLQotVGhpcyBzZWN0aW9uIGxpc3RzIHByZXZpb3VzbHkgZGVzY3JpYmVkIGNoYW5nZXMgdGhhdCBtYXkgcmVxdWlyZQotY2hhbmdlcyB0byB5b3VyIGNvZGU6Ci0KLVxiZWdpbntpdGVtaXplfQotCi1caXRlbSBFdmVyeXRoaW5nIGlzIGFsbCBpbiB0aGUgZGV0YWlscyEKLQotXGVuZHtpdGVtaXplfQotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntBY2tub3dsZWRnZW1lbnRzIFxsYWJlbHthY2tzfX0KLQotVGhlIGF1dGhvciB3b3VsZCBsaWtlIHRvIHRoYW5rIHRoZSBmb2xsb3dpbmcgcGVvcGxlIGZvciBvZmZlcmluZwotc3VnZ2VzdGlvbnMsIGNvcnJlY3Rpb25zIGFuZCBhc3Npc3RhbmNlIHdpdGggdmFyaW91cyBkcmFmdHMgb2YgdGhpcwotYXJ0aWNsZTogLgotCi1cZW5ke2RvY3VtZW50fQpkaWZmIC0tZ2l0IGEvRG9jL3doYXRzbmV3L3doYXRzbmV3MzAudGV4IGIvRG9jL3doYXRzbmV3L3doYXRzbmV3MzAudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTJjYTM3Li4wMDAwMDAwCi0tLSBhL0RvYy93aGF0c25ldy93aGF0c25ldzMwLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi1cZG9jdW1lbnRjbGFzc3tob3d0b30KLVx1c2VwYWNrYWdle2Rpc3R1dGlsc30KLSUgJElkOiB3aGF0c25ldzI2LnRleCA1NTUwNiAyMDA3LTA1LTIyIDA3OjQzOjI5WiBuZWFsLm5vcndpdHogJAotCi0lIFJ1bGVzIGZvciBtYWludGVuYW5jZToKLSUgCi0lICAqIEFueW9uZSBjYW4gYWRkIHRleHQgdG8gdGhpcyBkb2N1bWVudC4gIERvIG5vdCBzcGVuZCB2ZXJ5IG11Y2ggdGltZQotJSAgICBvbiB0aGUgd29yZGluZyBvZiB5b3VyIGNoYW5nZXMsIGJlY2F1c2UgeW91ciB0ZXh0IHdpbGwgcHJvYmFibHkKLSUgICAgZ2V0IHJld3JpdHRlbiB0byBzb21lIGRlZ3JlZS4KLSUKLSUgICogVGhlIG1haW50YWluZXIgd2lsbCBnbyB0aHJvdWdoIE1pc2MvTkVXUyBwZXJpb2RpY2FsbHkgYW5kIGFkZAotJSAgICBjaGFuZ2VzOyBpdCdzIHRoZXJlZm9yZSBtb3JlIGltcG9ydGFudCB0byBhZGQgeW91ciBjaGFuZ2VzIHRvIAotJSAgICBNaXNjL05FV1MgdGhhbiB0byB0aGlzIGZpbGUuCi0lCi0lICAqIFRoaXMgaXMgbm90IGEgY29tcGxldGUgbGlzdCBvZiBldmVyeSBzaW5nbGUgY2hhbmdlOyBjb21wbGV0ZW5lc3MKLSUgICAgaXMgdGhlIHB1cnBvc2Ugb2YgTWlzYy9ORVdTLiAgU29tZSBjaGFuZ2VzIEkgY29uc2lkZXIgdG9vIHNtYWxsCi0lICAgIG9yIGVzb3RlcmljIHRvIGluY2x1ZGUuICBJZiBzdWNoIGEgY2hhbmdlIGlzIGFkZGVkIHRvIHRoZSB0ZXh0LAotJSAgICBJJ2xsIGp1c3QgcmVtb3ZlIGl0LiAgKFRoaXMgaXMgYW5vdGhlciByZWFzb24geW91IHNob3VsZG4ndCBzcGVuZAotJSAgICB0b28gbXVjaCB0aW1lIG9uIHdyaXRpbmcgeW91ciBhZGRpdGlvbi4pCi0lCi0lICAqIElmIHlvdSB3YW50IHRvIGRyYXcgeW91ciBuZXcgdGV4dCB0byB0aGUgYXR0ZW50aW9uIG9mIHRoZQotJSAgICBtYWludGFpbmVyLCBhZGQgJ1hYWCcgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFyYWdyYXBoIG9yCi0lICAgIHNlY3Rpb24uCi0lCi0lICAqIEl0J3MgT0sgdG8ganVzdCBhZGQgYSBmcmFnbWVudGFyeSBub3RlIGFib3V0IGEgY2hhbmdlLiAgRm9yCi0lICAgIGV4YW1wbGU6ICJYWFggRGVzY3JpYmUgdGhlIHRyYW5zbW9ncmlmeSgpIGZ1bmN0aW9uIGFkZGVkIHRvIHRoZQotJSAgICBzb2NrZXQgbW9kdWxlLiIgIFRoZSBtYWludGFpbmVyIHdpbGwgcmVzZWFyY2ggdGhlIGNoYW5nZSBhbmQKLSUgICAgd3JpdGUgdGhlIG5lY2Vzc2FyeSB0ZXh0LgotJQotJSAgKiBZb3UgY2FuIGNvbW1lbnQgb3V0IHlvdXIgYWRkaXRpb25zIGlmIHlvdSBsaWtlLCBidXQgaXQncyBub3QKLSUgICAgbmVjZXNzYXJ5IChlc3BlY2lhbGx5IHdoZW4gYSBmaW5hbCByZWxlYXNlIGlzIHNvbWUgbW9udGhzIGF3YXkpLgotJQotJSAgKiBDcmVkaXQgdGhlIGF1dGhvciBvZiBhIHBhdGNoIG9yIGJ1Z2ZpeC4gICBKdXN0IHRoZSBuYW1lIGlzCi0lICAgIHN1ZmZpY2llbnQ7IHRoZSBlLW1haWwgYWRkcmVzcyBpc24ndCBuZWNlc3NhcnkuCi0lCi0lICAqIEl0J3MgaGVscGZ1bCB0byBhZGQgdGhlIGJ1Zy9wYXRjaCBudW1iZXIgYXMgYSBjb21tZW50OgotJQotJSAgICAgICAlIFBhdGNoIDEyMzQ1Ci0lICAgICAgIFhYWCBEZXNjcmliZSB0aGUgdHJhbnNtb2dyaWZ5KCkgZnVuY3Rpb24gYWRkZWQgdG8gdGhlIHNvY2tldAotJSAgICAgICBtb2R1bGUuCi0lICAgICAgIChDb250cmlidXRlZCBieSBQLlkuIERldmVsb3Blci4pCi0lCi0lICAgIFRoaXMgc2F2ZXMgdGhlIG1haW50YWluZXIgdGhlIGVmZm9ydCBvZiBnb2luZyB0aHJvdWdoIHRoZSBTVk4gbG9nCi0lICAgIHdoZW4gcmVzZWFyY2hpbmcgYSBjaGFuZ2UuCi0KLVx0aXRsZXtXaGF0J3MgTmV3IGluIFB5dGhvbiAzLjB9Ci1ccmVsZWFzZXswLjB9Ci1cYXV0aG9ye0EuTS4gS3VjaGxpbmd9Ci1cYXV0aG9yYWRkcmVzc3tcZW1haWx7YW1rQGFtay5jYX19Ci0KLVxiZWdpbntkb2N1bWVudH0KLVxtYWtldGl0bGUKLVx0YWJsZW9mY29udGVudHMKLQotVGhpcyBhcnRpY2xlIGV4cGxhaW5zIHRoZSBuZXcgZmVhdHVyZXMgaW4gUHl0aG9uIDMuMC4gIE5vIHJlbGVhc2UgZGF0ZQotZm9yIFB5dGhvbiAzLjAgaGFzIGJlZW4gc2V0OyBpdCB3aWxsIHByb2JhYmx5IGJlIHJlbGVhc2VkIGluIG1pZCAyMDA4LgotCi0lIENvbXBhcmUgd2l0aCBwcmV2aW91cyByZWxlYXNlIGluIDIgLSAzIHNlbnRlbmNlcyBoZXJlLgotCi1UaGlzIGFydGljbGUgZG9lc24ndCBhdHRlbXB0IHRvIHByb3ZpZGUgYSBjb21wbGV0ZSBzcGVjaWZpY2F0aW9uIG9mCi10aGUgbmV3IGZlYXR1cmVzLCBidXQgaW5zdGVhZCBwcm92aWRlcyBhIGNvbnZlbmllbnQgb3ZlcnZpZXcuICBGb3IKLWZ1bGwgZGV0YWlscywgeW91IHNob3VsZCByZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgUHl0aG9uIDMuMC4KLSUgYWRkIGh5cGVybGluayB3aGVuIHRoZSBkb2N1bWVudGF0aW9uIGJlY29tZXMgYXZhaWxhYmxlIG9ubGluZS4KLUlmIHlvdSB3YW50IHRvIHVuZGVyc3RhbmQgdGhlIGNvbXBsZXRlIGltcGxlbWVudGF0aW9uIGFuZCBkZXNpZ24KLXJhdGlvbmFsZSwgcmVmZXIgdG8gdGhlIFBFUCBmb3IgYSBwYXJ0aWN1bGFyIG5ldyBmZWF0dXJlLgotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSUgTGFyZ2UsIFBFUC1sZXZlbCBmZWF0dXJlcyBhbmQgY2hhbmdlcyBzaG91bGQgYmUgZGVzY3JpYmVkIGhlcmUuCi0KLSUgU2hvdWxkIHRoZXJlIGJlIGEgbmV3IHNlY3Rpb24gaGVyZSBmb3IgM2sgbWlncmF0aW9uPwotJSBPciBwZXJoYXBzIGEgbW9yZSBnZW5lcmFsIHNlY3Rpb24gZGVzY3JpYmluZyBtb2R1bGUgY2hhbmdlcy9kZXByZWNhdGlvbj8KLSUgc2V0cyBtb2R1bGUgZGVwcmVjYXRlZAotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257T3RoZXIgTGFuZ3VhZ2UgQ2hhbmdlc30KLQotSGVyZSBhcmUgYWxsIG9mIHRoZSBjaGFuZ2VzIHRoYXQgUHl0aG9uIDIuNiBtYWtlcyB0byB0aGUgY29yZSBQeXRob24KLWxhbmd1YWdlLgotCi1cYmVnaW57aXRlbWl6ZX0KLQotXGl0ZW0gRGV0YWlsZWQgY2hhbmdlcyBhcmUgbGlzdGVkIGhlcmUuCi0KLVxlbmR7aXRlbWl6ZX0KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHN1YnNlY3Rpb257T3B0aW1pemF0aW9uc30KLQotXGJlZ2lue2l0ZW1pemV9Ci0KLVxpdGVtIERldGFpbGVkIGNoYW5nZXMgYXJlIGxpc3RlZCBoZXJlLgotCi1cZW5ke2l0ZW1pemV9Ci0KLVRoZSBuZXQgcmVzdWx0IG9mIHRoZSAzLjAgb3B0aW1pemF0aW9ucyBpcyB0aGF0IFB5dGhvbiAzLjAgcnVucyB0aGUKLXB5c3RvbmUgYmVuY2htYXJrIGFyb3VuZCBYWFwlIHNsb3dlciB0aGFuIFB5dGhvbiAyLjYuCi0KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue05ldywgSW1wcm92ZWQsIGFuZCBEZXByZWNhdGVkIE1vZHVsZXN9Ci0KLUFzIHVzdWFsLCBQeXRob24ncyBzdGFuZGFyZCBsaWJyYXJ5IHJlY2VpdmVkIGEgbnVtYmVyIG9mIGVuaGFuY2VtZW50cyBhbmQKLWJ1ZyBmaXhlcy4gIEhlcmUncyBhIHBhcnRpYWwgbGlzdCBvZiB0aGUgbW9zdCBub3RhYmxlIGNoYW5nZXMsIHNvcnRlZAotYWxwaGFiZXRpY2FsbHkgYnkgbW9kdWxlIG5hbWUuIENvbnN1bHQgdGhlCi1cZmlsZXtNaXNjL05FV1N9IGZpbGUgaW4gdGhlIHNvdXJjZSB0cmVlIGZvciBhIG1vcmUKLWNvbXBsZXRlIGxpc3Qgb2YgY2hhbmdlcywgb3IgbG9vayB0aHJvdWdoIHRoZSBDVlMgbG9ncyBmb3IgYWxsIHRoZQotZGV0YWlscy4KLQotXGJlZ2lue2l0ZW1pemV9Ci0KLVxpdGVtIERldGFpbGVkIGNoYW5nZXMgYXJlIGxpc3RlZCBoZXJlLgotCi1cZW5ke2l0ZW1pemV9Ci0KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSUgd2hvbGUgbmV3IG1vZHVsZXMgZ2V0IGRlc2NyaWJlZCBpbiBcc3Vic2VjdGlvbnMgaGVyZQotCi0KLSUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257QnVpbGQgYW5kIEMgQVBJIENoYW5nZXN9Ci0KLUNoYW5nZXMgdG8gUHl0aG9uJ3MgYnVpbGQgcHJvY2VzcyBhbmQgdG8gdGhlIEMgQVBJIGluY2x1ZGU6Ci0KLVxiZWdpbntpdGVtaXplfQotCi1caXRlbSBEZXRhaWxlZCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaGVyZS4KLQotXGVuZHtpdGVtaXplfQotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc3Vic2VjdGlvbntQb3J0LVNwZWNpZmljIENoYW5nZXN9Ci0KLVBsYXRmb3JtLXNwZWNpZmljIGNoYW5nZXMgZ28gaGVyZS4KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257T3RoZXIgQ2hhbmdlcyBhbmQgRml4ZXMgXGxhYmVse3NlY3Rpb24tb3RoZXJ9fQotCi1BcyB1c3VhbCwgdGhlcmUgd2VyZSBhIGJ1bmNoIG9mIG90aGVyIGltcHJvdmVtZW50cyBhbmQgYnVnZml4ZXMKLXNjYXR0ZXJlZCB0aHJvdWdob3V0IHRoZSBzb3VyY2UgdHJlZS4gIEEgc2VhcmNoIHRocm91Z2ggdGhlIGNoYW5nZQotbG9ncyBmaW5kcyB0aGVyZSB3ZXJlIFhYWCBwYXRjaGVzIGFwcGxpZWQgYW5kIFlZWSBidWdzIGZpeGVkIGJldHdlZW4KLVB5dGhvbiAyLjYgYW5kIDMuMC4gIEJvdGggZmlndXJlcyBhcmUgbGlrZWx5IHRvIGJlIHVuZGVyZXN0aW1hdGVzLgotCi1Tb21lIG9mIHRoZSBtb3JlIG5vdGFibGUgY2hhbmdlcyBhcmU6Ci0KLVxiZWdpbntpdGVtaXplfQotCi1caXRlbSBEZXRhaWxzIGdvIGhlcmUuCi0KLVxlbmR7aXRlbWl6ZX0KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257UG9ydGluZyB0byBQeXRob24gMy4wfQotCi1UaGlzIHNlY3Rpb24gbGlzdHMgcHJldmlvdXNseSBkZXNjcmliZWQgY2hhbmdlcyB0aGF0IG1heSByZXF1aXJlCi1jaGFuZ2VzIHRvIHlvdXIgY29kZToKLQotXGJlZ2lue2l0ZW1pemV9Ci0KLVxpdGVtIEV2ZXJ5dGhpbmcgaXMgYWxsIGluIHRoZSBkZXRhaWxzIQotCi1cZW5ke2l0ZW1pemV9Ci0KLQotJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue0Fja25vd2xlZGdlbWVudHMgXGxhYmVse2Fja3N9fQotCi1UaGUgYXV0aG9yIHdvdWxkIGxpa2UgdG8gdGhhbmsgdGhlIGZvbGxvd2luZyBwZW9wbGUgZm9yIG9mZmVyaW5nCi1zdWdnZXN0aW9ucywgY29ycmVjdGlvbnMgYW5kIGFzc2lzdGFuY2Ugd2l0aCB2YXJpb3VzIGRyYWZ0cyBvZiB0aGlzCi1hcnRpY2xlOiAuCi0KLVxlbmR7ZG9jdW1lbnR9Cg==