# Name: smd_lib v0.35 # Type: Library plugin # Shared function library used by smd_ plugins and others. # Author: Stef Dawson # URL: http://stefdawson.com/ # Recommended load order: 5 # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YToxMDp7czo0OiJuYW1lIjtzOjc6InNtZF9saWIiO3M6NjoiYXV0aG9yIjtzOjExOiJTdGVm IERhd3NvbiI7czoxMDoiYXV0aG9yX3VyaSI7czoyMjoiaHR0cDovL3N0ZWZkYXdzb24uY29t LyI7czo3OiJ2ZXJzaW9uIjtzOjQ6IjAuMzUiO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjU2OiJT aGFyZWQgZnVuY3Rpb24gbGlicmFyeSB1c2VkIGJ5IHNtZF8gcGx1Z2lucyBhbmQgb3RoZXJz LiI7czo0OiJjb2RlIjtzOjExMDYxOiIvLyBTb2Z0d2FyZSBlbmdpbmVlcnMgbG9vayBhd2F5 IG5vdyB1bmxlc3MgeW91IHdpc2ggdG8gYmUgaG9ycmlmaWVkIGJ5IHRoZSBhbW91bnQNCi8v IG9mIGNvdXBsaW5nIGFuZCBjb2hlc2lvbiBpbiB0aGVzZSBmdW5jdGlvbnMuIEknbSB3YXJu aW5nIHlvdS4uLiBpdCdzIG5vdCBwcmV0dHkNCmlmICghY2xhc3NfZXhpc3RzKCdzbWRfTUxQ JykpIHsNCmNsYXNzIHNtZF9NTFAgew0KCXZhciAkc21kX3N0cmluZ3M7DQoJdmFyICRzbWRf b3duZXI7DQoJdmFyICRzbWRfcHJlZml4Ow0KCXZhciAkc21kX2xhbmc7DQoJdmFyICRzbWRf ZXZlbnQ7DQoJZnVuY3Rpb24gc21kX01MUCgkcGx1ZywgJHByZWZ4LCAkc3RyYXJyYXksICRs bmc9J2VuLWdiJywgJGV2PSdwdWJsaWMnKSB7DQoJCSR0aGlzLT5zbWRfb3duZXIgPSAkcGx1 ZzsNCgkJJHRoaXMtPnNtZF9wcmVmaXggPSAkcHJlZng7DQoJCSR0aGlzLT5zbWRfc3RyaW5n cyA9ICRzdHJhcnJheTsNCgkJJHRoaXMtPnNtZF9sYW5nID0gJGxuZzsNCgkJJHRoaXMtPnNt ZF9ldmVudCA9ICRldjsNCgkJcmVnaXN0ZXJfY2FsbGJhY2soYXJyYXkoJiR0aGlzLCAnc21k X0NhbGxiYWNrJyksICdsMTBuLmVudW1lcmF0ZV9zdHJpbmdzJyk7DQoJfQ0KCWZ1bmN0aW9u IHNtZF9DYWxsYmFjaygkZXZlbnQ9J2wxMG4uZW51bWVyYXRlX3N0cmluZ3MnLCAkc3RlcD0n JywgJHByZT0wKSB7DQoJCSRyID0gYXJyYXkoDQoJCQknb3duZXInID0+ICR0aGlzLT5zbWRf b3duZXIsDQoJCQkncHJlZml4JyA9PiAkdGhpcy0+c21kX3ByZWZpeCwNCgkJCSdsYW5nJyA9 PiAkdGhpcy0+c21kX2xhbmcsDQoJCQknZXZlbnQnID0+ICR0aGlzLT5zbWRfZXZlbnQsDQoJ CQknc3RyaW5ncycgPT4gJHRoaXMtPnNtZF9zdHJpbmdzLA0KCQkpOw0KCQlyZXR1cm4gJHI7 DQoJfQ0KCS8vIEdlbmVyaWMgbG9va3VwDQoJLy8gICR3aGF0ID0ga2V5IHRvIGxvb2sgdXAN CgkvLyAgJGFyZ3MgPSBhbnkgYXJndW1lbnRzIHRoZSBrZXkgaXMgZXhwZWN0aW5nIGZvciBy ZXBsYWNlbWVudA0KCWZ1bmN0aW9uIGdUeHQoJHdoYXQsICRhcmdzID0gYXJyYXkoKSkgew0K CQlnbG9iYWwgJHRleHRhcnJheTsNCg0KCQkvLyBQcmVwYXJlIHRoZSBwcmVmaXhlZCBrZXkg Zm9yIHVzZQ0KCQkka2V5ID0gJHRoaXMtPnNtZF9wcmVmaXggLiAnLScgLiAkd2hhdDsNCgkJ JGtleSA9IHN0cnRvbG93ZXIoJGtleSk7DQoNCgkJLy8gR3JhYiBmcm9tIHRoZSBnbG9iYWwg dGV4dGFycmF5IChwb3NzaWJseSBlZGl0ZWQgYnkgTUxQKSBpZiB3ZSBjYW4NCgkJaWYoaXNz ZXQoJHRleHRhcnJheVska2V5XSkpIHsNCgkJCSRzdHIgPSAkdGV4dGFycmF5WyRrZXldOw0K CQl9IGVsc2Ugew0KCQkJLy8gVGhlIHN0cmluZyBpc24ndCBpbiB0aGUgbG9jYWxpc2VkIHRl eHRhcnJheSBzbyBmYWxsYmFjayB0byB1c2luZw0KCQkJLy8gdGhlIChub24gcHJlZml4ZWQp IHN0cmluZyBhcnJheSBpbiB0aGUgcGx1Z2luDQoJCQkka2V5ID0gc3RydG9sb3dlcigkd2hh dCk7DQoJCQkkc3RyID0gKGlzc2V0KCR0aGlzLT5zbWRfc3RyaW5nc1ska2V5XSkpID8gJHRo aXMtPnNtZF9zdHJpbmdzWyRrZXldIDogJHdoYXQ7DQoJCX0NCgkJLy8gUGVyZm9ybSBzdWJz dGl0dXRpb25zDQoJCWlmKCFlbXB0eSgkYXJncykpIHsNCgkJCSRzdHIgPSBzdHJ0cigkc3Ry LCAkYXJncyk7DQoJCX0NCg0KCQlyZXR1cm4gJHN0cjsNCgl9DQp9DQp9DQoNCmlmICghZnVu Y3Rpb25fZXhpc3RzKCJzbWRfZG9MaXN0IikpIHsNCmZ1bmN0aW9uIHNtZF9kb0xpc3QoJGxz dCwgJHJuZz10cnVlLCAkc3ViPSIiLCAkcXRlPXRydWUsICRkbG09IiwiLCAkbGF4PXRydWUp IHsNCglnbG9iYWwgJHRoaXNhcnRpY2xlLCAkdGhpc2ltYWdlLCAkdGhpc2ZpbGUsICR0aGlz bGluaywgJHByZXRleHQsICR2YXJpYWJsZTsNCg0KCSRpbmMgPSAkZXhjID0gYXJyYXkoKTsN CgkkbHN0ID0gZG9fbGlzdCgkbHN0LCAkZGxtKTsNCgkkbW9kUkUgPSAoJGxheCkgPyAnLyhc P3xcISkoW1xwe0x9XHB7Tn1ccHtQY31ccHtQZH1ccHtac31dKykvJyA6ICcvKFw/fFwhKShb XHB7TH1ccHtOfVxwe1BjfVxwe1BkfV0rKS8nIDsNCglmb3JlYWNoICgkbHN0IGFzICRpdGVt KSB7DQoJCSRtb2QgPSAwOyAvLyAwID0gaW5jbHVkZSwgMSA9IGV4Y2x1ZGUNCgkJJG51bU1v ZHMgPSBwcmVnX21hdGNoX2FsbCgkbW9kUkUsICRpdGVtLCAkbW9kcyk7DQoNCgkJZm9yICgk bW9kQ3RyID0gMDsgJG1vZEN0ciA8ICRudW1Nb2RzOyAkbW9kQ3RyKyspIHsNCgkJCS8vIG1v ZCAidHlwZSIgaXMgZ292ZXJuZWQgYnkgdGhlIGZpcnN0IG9uZSBmb3VuZCBvbmx5LiBpLmUu IGlmICJhcnRpY2xlLT9jIXMiIHdhcyB1c2VkIGluIG9uZSBmaWVsZA0KCQkJLy8gaXQgd291 bGQgYmUgYW4gImluY2x1ZGUiIG9mIHRoZSB3b3JkICJhcnRpY2xlLSIgcGx1cyB0aGUgY2F0 ZWdvcnkgYW5kIHNlY3Rpb24gY29uY2F0ZW5hdGVkDQoJCQkkbW9kID0gKCRtb2RzWzFdWzBd ID09PSAiISIpID8gMSA6IDA7DQoJCQkkbW9kQ2hhciA9ICRtb2RzWzFdWyRtb2RDdHJdOw0K CQkJJG1vZEl0ZW0gPSB0cmltKCRtb2RzWzJdWyRtb2RDdHJdKTsNCgkJCSRsb3dpdGVtID0g c3RydG9sb3dlcigkbW9kSXRlbSk7DQoJCQlpZiAoaXNzZXQoJHZhcmlhYmxlWyRsb3dpdGVt XSkpIHsNCgkJCQkkaXRlbSA9IHN0cl9yZXBsYWNlKCRtb2RDaGFyLiRtb2RJdGVtLCAkdmFy aWFibGVbJGxvd2l0ZW1dLCAkaXRlbSk7DQoJCQl9IGVsc2UgaWYgKGlzc2V0KCR0aGlzaW1h Z2VbJGxvd2l0ZW1dKSkgew0KCQkJCSRpdGVtID0gc3RyX3JlcGxhY2UoJG1vZENoYXIuJG1v ZEl0ZW0sICR0aGlzaW1hZ2VbJGxvd2l0ZW1dLCAkaXRlbSk7DQoJCQl9IGVsc2UgaWYgKGlz c2V0KCR0aGlzZmlsZVskbG93aXRlbV0pKSB7DQoJCQkJJGl0ZW0gPSBzdHJfcmVwbGFjZSgk bW9kQ2hhci4kbW9kSXRlbSwgJHRoaXNmaWxlWyRsb3dpdGVtXSwgJGl0ZW0pOw0KCQkJfSBl bHNlIGlmIChpc3NldCgkdGhpc2xpbmtbJGxvd2l0ZW1dKSkgew0KCQkJCSRpdGVtID0gc3Ry X3JlcGxhY2UoJG1vZENoYXIuJG1vZEl0ZW0sICR0aGlzbGlua1skbG93aXRlbV0sICRpdGVt KTsNCgkJCX0gZWxzZSBpZiAoYXJyYXlfa2V5X2V4aXN0cygkbG93aXRlbSwgJHByZXRleHQp KSB7DQoJCQkJJGl0ZW0gPSBzdHJfcmVwbGFjZSgkbW9kQ2hhci4kbW9kSXRlbSwgJHByZXRl eHRbJGxvd2l0ZW1dLCAkaXRlbSk7DQoJCQl9IGVsc2UgaWYgKGlzc2V0KCRfUE9TVFskbW9k SXRlbV0pKSB7DQoJCQkJJGl0ZW0gPSBzdHJfcmVwbGFjZSgkbW9kQ2hhci4kbW9kSXRlbSwg JF9QT1NUWyRtb2RJdGVtXSwgJGl0ZW0pOw0KCQkJfSBlbHNlIGlmIChpc3NldCgkX0dFVFsk bW9kSXRlbV0pKSB7DQoJCQkJJGl0ZW0gPSBzdHJfcmVwbGFjZSgkbW9kQ2hhci4kbW9kSXRl bSwgJF9HRVRbJG1vZEl0ZW1dLCAkaXRlbSk7DQoJCQl9IGVsc2UgaWYgKGlzc2V0KCRfU0VS VkVSWyRtb2RJdGVtXSkpIHsNCgkJCQkkaXRlbSA9IHN0cl9yZXBsYWNlKCRtb2RDaGFyLiRt b2RJdGVtLCAkX1NFUlZFUlskbW9kSXRlbV0sICRpdGVtKTsNCgkJCX0gZWxzZSBpZiAoaXNz ZXQoJHRoaXNhcnRpY2xlWyRsb3dpdGVtXSkpIHsNCgkJCQkkaXRlbSA9IHN0cl9yZXBsYWNl KCRtb2RDaGFyLiRtb2RJdGVtLCAkdGhpc2FydGljbGVbJGxvd2l0ZW1dLCAkaXRlbSk7DQoJ CQl9IGVsc2Ugew0KCQkJCSRpdGVtID0gc3RyX3JlcGxhY2UoJG1vZENoYXIuJG1vZEl0ZW0s ICRtb2RJdGVtLCAkaXRlbSk7DQoJCQl9DQoJCX0NCg0KCQkvLyBIYW5kbGUgcmFuZ2VzIG9m IHZhbHVlcw0KCQkkc2l0ZW0gPSBkb19saXN0KCRpdGVtLCAkZGxtKTsNCgkJZm9yZWFjaCAo JHNpdGVtIGFzICRpZHggPT4gJGVsZW0pIHsNCgkJCWlmICgkcm5nICYmIHByZWdfbWF0Y2go Jy9eKFxkKylcLShcZCspJC8nLCAkZWxlbSkpIHsNCgkJCQlsaXN0KCRsbywgJGhpKSA9IGV4 cGxvZGUoIi0iLCAkZWxlbSwgMik7DQoJCQkJJHNpdGVtWyRpZHhdID0gaW1wbG9kZSgkZGxt LCByYW5nZSgkbG8sICRoaSkpOw0KCQkJfQ0KCQl9DQoJCSRpdGVtID0gaW1wbG9kZSgkZGxt LCAkc2l0ZW0pOw0KDQoJCS8vIEl0ZW0gbWF5IGJlIGVtcHR5OyBpZ25vcmUgaXQgaWYgc28N CgkJaWYgKCRpdGVtKSB7DQoJCQkkaXRlbSA9IGRvX2xpc3QoJGl0ZW0sICRkbG0pOw0KDQoJ CQkvLyBIYW5kbGUgc3ViLWNhdGVnb3JpZXMNCgkJCWlmICgkc3ViKSB7DQoJCQkJbGlzdCgk c3VidHlwZSwgJGxldmVsKSA9IGV4cGxvZGUoIjoiLCAkc3ViKTsNCgkJCQkkbGV2ZWwgPSAo ZW1wdHkoJGxldmVsKSkgPyAwIDogJGxldmVsOw0KCQkJCSRsZXZlbCA9IChzdHJ0b2xvd2Vy KCRsZXZlbCk9PSJhbGwiKSA/IDk5OTk5IDogJGxldmVsOw0KCQkJCSRvdXRpdGVtcyA9IGFy cmF5KCk7DQoJCQkJZm9yZWFjaCAoJGl0ZW0gYXMgJGNhdCkgew0KCQkJCQkkY2F0cyA9IGdl dFRyZWUoZG9zbGFzaCgkY2F0KSwgJHN1YnR5cGUpOw0KCQkJCQlmb3JlYWNoICgkY2F0cyBh cyAkamR4ID0+ICR2YWwpIHsNCgkJCQkJCWlmICgkY2F0c1skamR4XVsnbGV2ZWwnXSA8PSAk bGV2ZWwpIHsNCgkJCQkJCQkkb3V0aXRlbXNbXSA9ICRjYXRzWyRqZHhdWyduYW1lJ107DQoJ CQkJCQl9DQoJCQkJCX0NCgkJCQl9DQoJCQkJJGl0ZW0gPSAkb3V0aXRlbXM7DQoJCQl9DQoN CgkJCS8vIFF1b3RlIGlmIGFza2VkDQoJCQkkaXRlbSA9ICgkcXRlKSA/IGRvQXJyYXkoJGl0 ZW0sICdkb1F1b3RlJykgOiAkaXRlbTsNCgkJCWlmICgkbW9kID09PSAwKSB7DQoJCQkJJGlu YyA9IGFycmF5X3VuaXF1ZShhcnJheV9tZXJnZSgkaW5jLCAkaXRlbSkpOw0KCQkJfSBlbHNl IHsNCgkJCQkkZXhjID0gYXJyYXlfdW5pcXVlKGFycmF5X21lcmdlKCRleGMsICRpdGVtKSk7 DQoJCQl9DQoJCX0NCgl9DQoJcmV0dXJuIGFycmF5KCRpbmMsICRleGMpOw0KfQ0KfQ0KDQov LyBTcGxpdCBhIHN0cmluZyBvbiBhIHBhdHRlcm4gYW5kIGFsbG93IGludGVnZXIgcmFuZ2Vz IHRvIGJlIGV4cGFuZGVkDQppZiAoIWZ1bmN0aW9uX2V4aXN0cygic21kX3NwbGl0IikpIHsN CmZ1bmN0aW9uIHNtZF9zcGxpdCgkc3RyLCAkYWxsb3dSYW5nZT10cnVlLCAkc3BsaXRhdD0i LygsfCxccykrLyIsICRwcmVnb3B0ID0gUFJFR19TUExJVF9OT19FTVBUWSkgew0KCSRyZXRh cnIgPSBhcnJheSgpOw0KCWlmICgoc3Vic3RyKCRzcGxpdGF0LDAsMSkgPT0gIi8iKSAmJiAo c3Vic3RyKCRzcGxpdGF0LCBzdHJsZW4oJHNwbGl0YXQpLTEsIDEpID09ICIvIikpIHsNCgkJ JHBhdCA9ICRzcGxpdGF0Ow0KCX0gZWxzZSB7DQoJCSRwYXQgPSAnL1snLiRzcGxpdGF0Lidd Ky8nOw0KCX0NCgkkZWxlbXMgPSBwcmVnX3NwbGl0KCRwYXQsICRzdHIsIC0xLCAkcHJlZ29w dCk7DQoJZm9yZWFjaCAoJGVsZW1zIGFzICRpdGVtKSB7DQoJCSRpdGVtID0gdHJpbSgkaXRl bSk7DQoJCSRuZWdhdGUgPSBmYWxzZTsNCgkJLy8gRG9lcyB0aGUgaXRlbSBzdGFydCB3aXRo IGEgbmVnYXRpb24gY2hhcmFjdGVyDQoJCWlmIChzdWJzdHIoJGl0ZW0sMCwxKSA9PT0gIiEi KSB7DQoJCQkkbmVnYXRlID0gdHJ1ZTsNCgkJCSRpdGVtID0gc3Vic3RyKCRpdGVtLDEpOw0K CQl9DQoJCS8vIElzIHRoZSBpdGVtIGFuIGludGVnZXIgbGlzdCByYW5nZQ0KCQlpZiAoJGFs bG93UmFuZ2UgJiYgcHJlZ19tYXRjaCgnL14oXGQrKVwtKFxkKykkLycsICRpdGVtKSkgew0K CQkJbGlzdCgkbG8sICRoaSkgPSBleHBsb2RlKCItIiwgJGl0ZW0sIDIpOw0KCQkJJHJuZyA9 IHJhbmdlKCRsbywgJGhpKTsNCgkJCS8vIFJlYXBwbHkgdGhlIG5lZ2F0aW9uIGlmIG5lY2Vz c2FyeQ0KCQkJZm9yKCRpZHggPSAwOyAkaWR4IDwgY291bnQoJHJuZyk7ICRpZHgrKykgew0K CQkJCSRybmdbJGlkeF0gPSAoKCRuZWdhdGUpID8gIiEiIDogIiIpIC4gJHJuZ1skaWR4XTsN CgkJCX0NCgkJCSRyZXRhcnIgPSBhcnJheV9tZXJnZSgkcmV0YXJyLCAkcm5nKTsNCgkJfSBl bHNlIHsNCgkJCSRyZXRhcnJbXSA9ICgoJG5lZ2F0ZSkgPyAiISIgOiAiIikgLiAkaXRlbTsN CgkJfQ0KCX0NCglyZXR1cm4gJHJldGFycjsNCn0NCn0NCg0KaWYgKCFmdW5jdGlvbl9leGlz dHMoInNtZF9kb0RibFF1b3RlIikpIHsNCmZ1bmN0aW9uIHNtZF9kb0RibFF1b3RlKCR2YWwp IHsNCglyZXR1cm4gJyInLiR2YWwuJyInOw0KfQ0KfQ0KDQppZiAoIWZ1bmN0aW9uX2V4aXN0 cygic21kX3JlbW92ZVFTVmFyIikpIHsNCmZ1bmN0aW9uIHNtZF9yZW1vdmVRU1ZhcigkdXJs LCAka2V5KSB7DQoJJHVybCA9IHByZWdfcmVwbGFjZSgnLyguKikoXD98JiknIC4gJGtleSAu ICc9W14mXSs/KCYpKC4qKS9pJywgJyQxJDIkNCcsICR1cmwgLiAnJicpOw0KCSR1cmwgPSBz dWJzdHIoJHVybCwgMCwgLTEpOw0KCXJldHVybiAoJHVybCk7DQp9DQp9DQoNCmlmICghZnVu Y3Rpb25fZXhpc3RzKCJzbWRfYWRkUVNWYXIiKSkgew0KZnVuY3Rpb24gc21kX2FkZFFTVmFy KCR1cmwsICRrZXksICR2YWx1ZSkgew0KCSR1cmwgPSBzbWRfcmVtb3ZlUVNWYXIoJHVybCwg JGtleSk7DQoJaWYgKHN0cnBvcygkdXJsLCAnPycpID09PSBmYWxzZSkgew0KCQlyZXR1cm4g KCR1cmwgLiAnPycgLiAka2V5IC4gJz0nIC4gJHZhbHVlKTsNCgl9IGVsc2Ugew0KCQlyZXR1 cm4gKCR1cmwgLiAnJicgLiAka2V5IC4gJz0nIC4gJHZhbHVlKTsNCgl9DQp9DQp9DQoNCi8v IERFUFJFQ0FURUQ6IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvbmx5DQppZiAoIWZ1 bmN0aW9uX2V4aXN0cygic21kX2dldFN1YkNhdHMiKSkgew0KZnVuY3Rpb24gc21kX2dldFN1 YkNhdHMoJHBhcmVudCwkY2F0dHlwZSkgew0KCXJldHVybiBnZXRUcmVlKCRwYXJlbnQsJGNh dHR5cGUpOyAvL2dldFRyZWUoKSBvciBnZXRUcmVlUGF0aCgpPz8NCn0NCn0NCg0KLy8gREVQ UkVDQVRFRDogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG9ubHkNCmlmICghZnVuY3Rp b25fZXhpc3RzKCJzbWRfZ2V0T3B0cyIpKSB7DQpmdW5jdGlvbiBzbWRfZ2V0T3B0cygkc3Ry LCAkYWxsb3dlZCwgJGlkcHJlZml4PSIiLCAkYWxsb3dSYW5nZT10cnVlLCAkc3BsaXRhdD0i LygsfCxccykrLyIsICRwcmVnb3B0ID0gUFJFR19TUExJVF9OT19FTVBUWSkgew0KCWdsb2Jh bCAkcHJldGV4dCwgJHRoaXNhcnRpY2xlOw0KDQoJJG91dCA9IGFycmF5KCk7DQoJJG5vdG91 dCA9IGFycmF5KCk7DQoJJG1hdGNoZXMgPSBzbWRfc3BsaXQoJHN0ciwgJGFsbG93UmFuZ2Us ICRzcGxpdGF0LCAkcHJlZ29wdCk7DQoJLy8gQW4gYXJyYXkgdGhhdCB0ZWxscyB0aGUgbG9v cCB3aGF0IHRvIGRvIHdpdGggZWFjaCBvZiB0aGUgdmFsaWQgc3RyaW5ncw0KCS8vICBhcmcx OiB0eXBlICgxPWV4YWN0IG1hdGNoLCAyPWFueXdoZXJlIHdpdGhpbiBzdHJpbmcsIDM9Y3Vz dG9tIGZpZWxkKQ0KCS8vICBhcmcyOiBwcmVmaXgsIGlmIGFueQ0KCS8vICBhcmczOiB2YXJp YWJsZSB0byBzdWJzdGl0dXRlDQoJLy8gIGFyZzQ6IGV4dHJhIGNoZWNrLCBpZiBhcHBsaWNh YmxlDQoJLy8gIGFyZzU6IHN0b3JlIGluIHRoZSBpbi9leGNsdWRlIGxpc3QgKDE9aW5jbHVk ZTsgMj1leGNsdWRlKQ0KCSRvcHQgPSBhcnJheSgNCgkJIj9jIiA9PiBhcnJheSgyLCAiIiwg JHByZXRleHRbJ2MnXSwgIjEiLCAxKSwNCgkJIiFjIiA9PiBhcnJheSgyLCAiIiwgJHByZXRl eHRbJ2MnXSwgIjEiLCAyKSwNCgkJIj9zIiA9PiBhcnJheSgyLCAiIiwgJHByZXRleHRbJ3Mn XSwgIjEiLCAxKSwNCgkJIiFzIiA9PiBhcnJheSgyLCAiIiwgJHByZXRleHRbJ3MnXSwgIjEi LCAyKSwNCgkJIj9xIiA9PiBhcnJheSgyLCAiIiwgJHByZXRleHRbJ3EnXSwgIjEiLCAxKSwN CgkJIiFxIiA9PiBhcnJheSgyLCAiIiwgJHByZXRleHRbJ3EnXSwgIjEiLCAyKSwNCgkJIj90 IiA9PiBhcnJheSgyLCAiIiwgJHRoaXNhcnRpY2xlWyd1cmxfdGl0bGUnXSwgJyR0aGlzYXJ0 aWNsZSE9TlVMTCcsIDEpLA0KCQkiIXQiID0+IGFycmF5KDIsICIiLCAkdGhpc2FydGljbGVb J3VybF90aXRsZSddLCAnJHRoaXNhcnRpY2xlIT1OVUxMJywgMiksDQoJCSI/aWQiID0+IGFy cmF5KDEsICRpZHByZWZpeCwgJHByZXRleHRbJ2lkJ10sICckdGhpc2FydGljbGUhPU5VTEwn LCAxKSwNCgkJIiFpZCIgPT4gYXJyYXkoMSwgJGlkcHJlZml4LCAkcHJldGV4dFsnaWQnXSwg JyR0aGlzYXJ0aWNsZSE9TlVMTCcsIDIpLA0KCQkiPyIgPT4gYXJyYXkoMywgIiIsICIiLCAn JHRoaXNhcnRpY2xlIT1OVUxMJywgMSksDQoJCSIhIiA9PiBhcnJheSgzLCAiIiwgIiIsICck dGhpc2FydGljbGUhPU5VTEwnLCAyKSwNCgkpOw0KDQoJZm9yICgkaWR4ID0gMDsgJGlkeCA8 IGNvdW50KCRtYXRjaGVzKTsgJGlkeCsrKSB7DQoJCSRtYXRjaGVkID0gZmFsc2U7DQoJCSR0 aGlzbWF0Y2ggPSAkbWF0Y2hlc1skaWR4XTsNCgkJZm9yZWFjaCAoJG9wdCBhcyAkdmFyID0+ ICRhcmdzKSB7DQoJCQkkb3B2YXIgPSAoJGFyZ3NbNF0gPT0gMSkgPyAib3V0IiA6ICJub3Rv dXQiOw0KCQkJc3dpdGNoICgkYXJnc1swXSkgew0KCQkJCWNhc2UgMToNCgkJCQkJaWYgKCgk dGhpc21hdGNoID09PSAkdmFyKSAmJiBpbl9hcnJheSgkdmFyLCRhbGxvd2VkKSkgew0KCQkJ CQkJJG1hdGNoZWQgPSB0cnVlOw0KCQkJCQkJaWYgKCRhcmdzWzJdICE9ICIiICYmICRhcmdz WzNdKSB7DQoJCQkJCQkJJHJlcCA9IHN0cl9yZXBsYWNlKCR2YXIsICRhcmdzWzFdLiRhcmdz WzJdLCAkdGhpc21hdGNoKTsNCgkJCQkJCQlpZiAoIWluX2FycmF5KCRyZXAsICR7JG9wdmFy fSkpIHsNCgkJCQkJCQkJJHskb3B2YXJ9W10gPSAkcmVwOw0KCQkJCQkJCX0NCgkJCQkJCX0N CgkJCQkJfQ0KCQkJCQlicmVhazsNCgkJCQljYXNlIDI6DQoJCQkJCSRwYXQgPSAnL1xcJy4k dmFyLickfFxcJy4kdmFyLidbXkEtWmEtejAtOV0vJzsNCgkJCQkJaWYgKChpc19pbnQoc21k X3ByZWdQb3MoJHBhdCwgJHRoaXNtYXRjaCwgJGZuZCkpKSAmJiBpbl9hcnJheSgkdmFyLCRh bGxvd2VkKSkgew0KCQkJCQkJJG1hdGNoZWQgPSB0cnVlOw0KCQkJCQkJaWYgKCRhcmdzWzJd ICE9ICIiICYmICRhcmdzWzNdKSB7DQoJCQkJCQkJJHJlcCA9IHN0cl9yZXBsYWNlKCR2YXIs ICRhcmdzWzFdLiRhcmdzWzJdLCAkdGhpc21hdGNoKTsNCgkJCQkJCQlpZiAoIWluX2FycmF5 KCRyZXAsICR7JG9wdmFyfSkpIHsNCgkJCQkJCQkJJHskb3B2YXJ9W10gPSAkcmVwOw0KCQkJ CQkJCX0NCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCQlicmVhazsNCgkJCQljYXNlIDM6DQoJCQkJ CSRsZW4gPSBzdHJsZW4oJHZhcik7DQoJCQkJCWlmICgoc3Vic3RyKCR0aGlzbWF0Y2gsMCwk bGVuKSA9PT0gJHZhcikgJiYgaW5fYXJyYXkoJHZhci4iZmllbGQiLCRhbGxvd2VkKSkgew0K CQkJCQkJJG1hdGNoZWQgPSB0cnVlOw0KCQkJCQkJLy8gVXNlIHRoZSBnaXZlbiBmaWVsZCBu YW1lOyB3aGljaCBtYXkgYmUgYSBjb21tYS1zZXBhcmF0ZWQgc3VibGlzdC4NCgkJCQkJCS8v IFNwbGl0IG9mZiB0aGUgZmllbGQgbmFtZSBmcm9tIHRoZSBxdWVzdGlvbiBtYXJrDQoJCQkJ CQkkZmllbGRuYW1lID0gc3Vic3RyKCR0aGlzbWF0Y2gsJGxlbik7DQoJCQkJCQlpZiAoKCRh cmdzWzNdKSAmJiAoaXNzZXQoJHRoaXNhcnRpY2xlW3N0cnRvbG93ZXIoJGZpZWxkbmFtZSld KSkpIHsNCgkJCQkJCQkkZmllbGRDb250ZW50cyA9ICR0aGlzYXJ0aWNsZVtzdHJ0b2xvd2Vy KCRmaWVsZG5hbWUpXTsNCgkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJJGZpZWxkQ29udGVudHMg PSAkZmllbGRuYW1lOw0KCQkJCQkJfQ0KCQkJCQkJaWYgKCFlbXB0eSgkZmllbGRDb250ZW50 cykpIHsNCgkJCQkJCQkkc3Vib3V0ID0gc21kX3NwbGl0KHN0cmlwX3RhZ3MoJGZpZWxkQ29u dGVudHMpLCAkYWxsb3dSYW5nZSwgJHNwbGl0YXQsICRwcmVnb3B0KTsNCgkJCQkJCQlmb3Jl YWNoICgkc3Vib3V0IGFzICRzdWJuYW1lKSB7DQoJCQkJCQkJCWlmICghaW5fYXJyYXkoJHN1 Ym5hbWUsICR7JG9wdmFyfSkpIHsNCgkJCQkJCQkJCSR7JG9wdmFyfVtdID0gJHN1Ym5hbWU7 DQoJCQkJCQkJCX0NCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQkJYnJlYWs7DQoJ CQl9DQoJCQlpZiAoJG1hdGNoZWQpIHsNCgkJCQlicmVhazsNCgkJCX0NCgkJfQ0KCQlpZiAo ISRtYXRjaGVkKSB7DQoJCQkvLyBBc3NpZ24gdGhlIHZhcmlhYmxlIHZlcmJhdGltDQoJCQlp ZiAoIWluX2FycmF5KCR0aGlzbWF0Y2gsICRvdXQpKSB7DQoJCQkJJG91dFtdID0gJHRoaXNt YXRjaDsNCgkJCX0NCgkJfQ0KCX0NCglyZXR1cm4gYXJyYXkoJG91dCwkbm90b3V0KTsNCn0N Cn0NCg0KLy8gU3RvbGVuIGZyb20gcGhwLm5ldDogc3RycG9zIHBhZ2UgY29tbWVudHMuLi4N CmlmICghZnVuY3Rpb25fZXhpc3RzKCJzbWRfcHJlZ1BvcyIpKSB7DQpmdW5jdGlvbiBzbWRf cHJlZ1Bvcygkc1BhdHRlcm4sICRzU3ViamVjdCwgJiRGb3VuZFN0cmluZywgJGlPZmZzZXQg PSAwKSB7DQoJJEZvdW5kU3RyaW5nID0gbnVsbDsNCglpZiAocHJlZ19tYXRjaCgkc1BhdHRl cm4sICRzU3ViamVjdCwgJGFNYXRjaGVzLCBQUkVHX09GRlNFVF9DQVBUVVJFLCAkaU9mZnNl dCkgPiAwKSB7DQoJCSRGb3VuZFN0cmluZyA9ICRhTWF0Y2hlc1swXVswXTsNCgkJcmV0dXJu ICRhTWF0Y2hlc1swXVsxXTsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KfQ0K fQ0KLy8uLi4gYW5kIGFycmF5X2NvbWJpbmUuLi4NCmlmICghZnVuY3Rpb25fZXhpc3RzKCJh cnJheV9jb21iaW5lIikpIHsNCglmdW5jdGlvbiBhcnJheV9jb21iaW5lKCRhcnIxLCRhcnIy KSB7DQoJCSRvdXQgPSBhcnJheSgpOw0KCQlmb3JlYWNoKCRhcnIxIGFzICRrZXkxID0+ICR2 YWx1ZTEpIHsNCgkJCSRvdXRbJHZhbHVlMV0gPSAkYXJyMlska2V5MV07DQoJCX0NCiAgIAly ZXR1cm4gJG91dDsNCgl9DQp9DQovLy4uLiBhbmQgaHRtbHNwZWNpYWxjaGFyc19kZWNvZGUN CmlmICghZnVuY3Rpb25fZXhpc3RzKCJodG1sc3BlY2lhbGNoYXJzX2RlY29kZSIpKSB7DQoJ ZnVuY3Rpb24gaHRtbHNwZWNpYWxjaGFyc19kZWNvZGUoJHN0cmluZywgJHF1b3RlX3N0eWxl ID0gRU5UX0NPTVBBVCkgew0KCQlyZXR1cm4gc3RydHIoJHN0cmluZywgYXJyYXlfZmxpcChn ZXRfaHRtbF90cmFuc2xhdGlvbl90YWJsZShIVE1MX1NQRUNJQUxDSEFSUywgJHF1b3RlX3N0 eWxlKSkpOw0KCX0NCn0iO3M6NDoidHlwZSI7czoxOiIyIjtzOjU6Im9yZGVyIjtzOjE6IjUi O3M6NDoiaGVscCI7czoxMDg2NToiCTxwPjxkaXYgaWQ9InNtZF9oZWxwIj48L3A+CgoJPGgx PnNtZF8gcGx1Z2luIGxpYnJhcnk8L2gxPgoKCTxwPk9mZmVycyBubyBwdWJsaWMgdGV4dHBh dHRlcm4gdGFncy4gSXQgaXMgc2ltcGx5IGEgc2hhcmVkIGxpYnJhcnkgb2YgY29tbW9uIGZ1 bmN0aW9ucyB1c2VkIGJ5IHNtZF8gcGx1Z2lucy48L3A+CgoJPGgyPkNoYW5nZWxvZzwvaDI+ CgoJPHVsPgoJCTxsaT52MC4xICAgMDctMDItMjUgSW5pdGlhbCBwdWJsaWMgcmVsZWFzZTwv bGk+CgkJPGxpPnYwLjIgICAwNy0wMy0wMyBBZGRlZDogPHNwYW4gY2xhc3M9ImNhcHMiPjxz cGFuIGNsYXNzPSJjYXBzIj5NTFA8L3NwYW4+PC9zcGFuPiAoTXVsdGktTGluZ3VhbCBQYWNr KSBsaWJyYXJ5IHN1cHBvcnQ8L2xpPgoJCTxsaT52MC4yMSAgMDctMDMtMDYgQWRkZWQ6IGlu dGVnZXIgcmFuZ2UgZnVuY3Rpb25hbGl0eS4gPGNvZGU+c21kX2dldEF0dHM8L2NvZGU+IG5v dyB0YWtlcyBhIFJlZ0V4IGFyZzwvbGk+CgkJPGxpPnYwLjIxYSAwNy0wMy0yMSBGaXhlZDog Q2hhcmFjdGVyIHJhbmdlcyBpZ25vcmVkICh0aGFua3MgbXJkYWxlKTwvbGk+CgkJPGxpPnYw LjIxYiAwNy0wNC0wMiBGaXhlZDogU3RpY2t5IGFydGljbGUgc3VwcG9ydCBpbiA8Y29kZT5z bWRfZ2V0QXR0czwvY29kZT4gKHRoYW5rcyBwaWVtYW4pPC9saT4KCQk8bGk+djAuMjFjIDA3 LTA3LTI5IEZpeGVkOiBOdW1lcmljIHJhbmdlcyBpbiBjYXRlZ29yaWVzICh0aGFua3Mgd29s bGUpPC9saT4KCQk8bGk+djAuMjFkIDA3LTA4LTAzIEZpeGVkOiBOZWdhdGlvbiB3aXRoIG11 bHRpcGxlIGVsZW1lbnRzPC9saT4KCQk8bGk+djAuMjFlIDA3LTA5LTE0IEZpeGVkOiBBYmls aXR5IHRvIGxlYXZlIGVtcHR5IHNwbGl0UmFuZ2UgcGFyYW1ldGVycyBpbnRhY3Q8L2xpPgoJ CTxsaT52MC4yMiAgMDctMDktMjAgRml4ZWQ6IFVuZGVmaW5lZCBpbmRleCB3YXJuaW5ncyAo dGhhbmtzIEFtYml0aW91c2xlbW9uKS4gRW5oYW5jZWQgbWF0Y2hlcyBzbyBzcGFjZXMgYXJl IGFsbG93ZWQgaW4gc3RyaW5ncyAodGhhbmtzIERyUm9nZyk8L2xpPgoJCTxsaT52MC4yMyAg MDctMDQtMDkgPHNwYW4gY2xhc3M9ImNhcHMiPkJFVEE8L3NwYW4+IDogQWRkZWQgdGhlIEZ1 enp5RmluZCBjbGFzcyBhbmQgZ2V0V29yZCBmdW5jdGlvbi4gZ2V0QXR0cygpIG5vdyBhbGxv d3MgPGNvZGU+P3E8L2NvZGU+PC9saT4KCQk8bGk+djAuMyAgIDA3LTEwLTI5IFJld3JvdGUg PGNvZGU+c21kX2dldEF0dHM8L2NvZGU+IGFzIDxjb2RlPnNtZF9nZXRPcHRzPC9jb2RlPiB0 byBhbGxvdyByZXBsYWNlZCB2YXJzIHdpdGhpbiB0ZXh0LiBEZXByZWNhdGVkIDxjb2RlPnNt ZF9nZXRBdHRzPC9jb2RlPiwgYWRkZWQgPGNvZGU+c21kX3ByZWdQb3M8L2NvZGU+LiBDaGFu Z2VkIDxjb2RlPnNtZF9zcGxpdFJhbmdlPC9jb2RlPiBhcyA8Y29kZT5zbWRfc3BsaXQ8L2Nv ZGU+IHRvIGFsbG93IHJhbmdlcyB0byBiZSBzd2l0Y2hlZCBvbiBvciBvZmYuIERlcHJlY2F0 ZWQgPGNvZGU+c21kX3NwbGl0UmFuZ2U8L2NvZGU+LiBBZGRlZCBnZW5lcmljIDxzcGFuIGNs YXNzPSJjYXBzIj5NTFA8L3NwYW4+IGNsYXNzIHN1cHBvcnQgKDxjb2RlPnNtZF9NTFA8L2Nv ZGU+KS4gRGVwcmVjYXRlZCA8Y29kZT5zbWRNTFA8L2NvZGU+IGFycmF5LCA8Y29kZT5zbWRf Z1R4dDwvY29kZT4gYW5kIDxjb2RlPnNtZF9nZXRDYWxsZXI8L2NvZGU+LiBNYWRlIDxjb2Rl PnNtZF9GdXp6eUZpbmQ8L2NvZGU+IGFuZCA8Y29kZT5zbWRfZ2V0V29yZDwvY29kZT4gb2Zm aWNpYWw8L2xpPgoJCTxsaT52MC4zMSAgMDctMTEtMjcgUmVtb3ZlZCA8Y29kZT5zbWRNTFA8 L2NvZGU+IGFycmF5LCA8Y29kZT5zbWRfZ1R4dDwvY29kZT4gYW5kIDxjb2RlPnNtZF9nZXRD YWxsZXI8L2NvZGU+LiBEZXByZWNhdGVkIDxjb2RlPnNtZF9nZXRTdWJDYXRzPC9jb2RlPi4g QWRkZWQgYSBmZXcgUEhQNCBoZWxwZXIgZnVuY3Rpb25zPC9saT4KCQk8bGk+djAuMzIgIDA4 LTAzLTI5IFJlbW92ZWQgPGNvZGU+c21kX2dldEF0dHM8L2NvZGU+IGFuZCA8Y29kZT5zbWRf Z2V0U3ViQ2F0czwvY29kZT4uIERlcHJlY2F0ZWQgPGNvZGU+c21kX2dldE9wdHM8L2NvZGU+ IGFuZCA8Y29kZT5zbWRfc3BsaXQ8L2NvZGU+LiBBZGRlZCA8Y29kZT5zbWRfZG9MaXN0PC9j b2RlPi4gTW92ZWQgdGhlIDxjb2RlPnNtZF9GdXp6eUZpbmQ8L2NvZGU+IGNsYXNzIGFuZCA8 Y29kZT5zbWRfZ2V0V29yZDwvY29kZT4gaW50byB0aGUgc21kX2Z1enp5X2ZpbmQgcGx1Z2lu IHdoZXJlIHRoZXkgc2hvdWxkIGhhdmUgYmVlbiBhbGwgYWxvbmc8L2xpPgoJCTxsaT52MC4z MyAgMDgtMTItMDIgVW5kZXByZWNhdGVkKCEpIDxjb2RlPnNtZF9zcGxpdDwvY29kZT4gc2lu Y2UgaXQmIzgyMTc7cyBhY3R1YWxseSBxdWl0ZSB1c2VmdWwgOyBleHRlbmRlZCA8Y29kZT5z bWRfZG9MaXN0PC9jb2RlPiB0byBlbmNvbXBhc3MgPGNvZGU+JHRoaXNpbWFnZTwvY29kZT4g KGZvciBmdXR1cmUpIGFuZCA8Y29kZT4kdmFyaWFibGU8L2NvZGU+IDsgZml4ZWQgYnVnIGlu IDxjb2RlPnNtZF9kb0xpc3Q8L2NvZGU+IHdoZW4gdXNpbmcgc3ViY2F0czwvbGk+CgkJPGxp PnYwLjM0ICAwOC0xMi0xMyA8Y29kZT5zbWRfZG9MaXN0PC9jb2RlPiB1c2VzIGEgdW5pY29k ZSByZWdleDwvbGk+CgkJPGxpPnYwLjM1ICAwOS0wMi0yNCA8Y29kZT5zbWRfZG9MaXN0PC9j b2RlPiBmaXhlZCByYW5nZXMgaW4gJiM4MjE2Oz8mIzgyMTc7IHZhcmlhYmxlcyAodGhhbmtz IGtvb2JzKTwvbGk+Cgk8L3VsPgoKCTxoMj5GdW5jdGlvbiBSZWZlcmVuY2U8L2gyPgoKCTxw PjxzdHJvbmc+c21kX2FkZFFTVmFyPC9zdHJvbmc+PGJyIC8+CjxzdHJvbmc+c21kX3JlbW92 ZVFTVmFyPC9zdHJvbmc+PC9wPgoKCTxwPkFkZCBvciByZW1vdmUgYSBxdWVyeSBzdHJpbmcg dmFyaWFibGUgdG8gdGhlIGdpdmVuIDxzcGFuIGNsYXNzPSJjYXBzIj5VUkw8L3NwYW4+LCB0 YWtpbmcgaW50byBhY2NvdW50IGFueSBleGlzdGluZyB2YXJpYWJsZXMgdGhhdCBtYXkgYmUg aW4gdGhlIDxzcGFuIGNsYXNzPSJjYXBzIj5VUkw8L3NwYW4+IGFscmVhZHkuICYjODIxNjtB ZGQmIzgyMTc7IHRha2VzIHRocmVlIGFyZ3VtZW50cywgJiM4MjE2O1JlbW92ZSYjODIxNzsg anVzdCB0YWtlcyB0aGUgZmlyc3QgdHdvOjwvcD4KCgk8b2w+CgkJPGxpPlRoZSA8c3BhbiBj bGFzcz0iY2FwcyI+VVJMPC9zcGFuPiBzdHJpbmcgdG8gYWRkIHRvL3JlbW92ZSBmcm9tPC9s aT4KCQk8bGk+VGhlIGlkIG9mIHRoZSBxdWVyeXN0cmluZyAodGhlIGJpdCBiZWZvcmUgdGhl ID0gc2lnbik8L2xpPgoJCTxsaT5UaGUgdmFsdWUgb2YgdGhlIG5ldyBxdWVyeXN0cmluZyAo dGhlIGJpdCBhZnRlciB0aGUgPSBzaWduKTwvbGk+Cgk8L29sPgoKCTxwPmUuZy4gPGNvZGU+ c21kX2FkZFFTVmFyKCR0aGlzYXJ0aWNsZVsmIzM5O3VybF90aXRsZSYjMzk7XSwgJiMzOTt0 cGcmIzM5OywgMTUpOzwvY29kZT4gd291bGQgYWRkIDxjb2RlPnRwZz0xNTwvY29kZT4gdG8g dGhlIGN1cnJlbnQgYXJ0aWNsZSYjODIxNztzIDxzcGFuIGNsYXNzPSJjYXBzIj5VUkw8L3Nw YW4+LiBJZiB0aGVyZSBhcmUgbm8gb3RoZXIgdmFyaWFibGVzIGN1cnJlbnRseSBpbiB0aGUg PHNwYW4gY2xhc3M9ImNhcHMiPlVSTDwvc3Bhbj4sIGl0IGlzIGFkZGVkIHdpdGggYSBxdWVz dGlvbiBtYXJrLCBvdGhlcndpc2UgaXQgaXMgYXBwZW5kZWQgd2l0aCBhbiBhbXBlcnNhbmQu PC9wPgoKCTxwPjxzdHJvbmc+c21kX2RvTGlzdDwvc3Ryb25nPjwvcD4KCgk8cD5SZXR1cm4g YW4gZXhwYW5kZWQgbGlzdCBvZiBpdGVtcyB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGll czo8L3A+CgoJPG9sPgoJCTxsaT5Bbnl0aGluZyBjb250YWluaW5nICYjODIxNjs/JiM4MjE3 OyBvciAmIzgyMTY7ISYjODIxNzsgaXMgY2hlY2tlZCBmb3IgYSBtYXRjaCB3aXRoIGEgPHNw YW4gY2xhc3M9ImNhcHMiPlRYUDwvc3Bhbj4gZmllbGQgKDxjb2RlPiZsdDt0eHA6dmFyaWFi bGUgLyZndDs8L2NvZGU+LCBpbWFnZSwgZmlsZSwgbGluaywgZ2xvYmFsIGFydGljbGUsIHVy bCA8c3BhbiBjbGFzcz0iY2FwcyI+UE9TVDwvc3Bhbj4vR0VUL1NFUlZFUiwgb3IgaW5kaXZp ZHVhbCBhcnRpY2xlLCBpbiB0aGF0IG9yZGVyKTwvbGk+CgkJPGxpPkFueSByYW5nZXMgb2Yg aXRlbXMgYXJlIGV4cGFuZGVkIChlLmcuIDQtNyA9Jmd0OyA0LDUsNiw3KSBpZiB0aGUgPGNv ZGU+cm5nPC9jb2RlPiBvcHRpb24gcGVybWl0cyBpdDwvbGk+CgkJPGxpPjxzcGFuIGNsYXNz PSJjYXBzIj5UWFA8L3NwYW4+IGZpZWxkcyBtYXkgdGhlbXNlbHZlcyBiZSBsaXN0cyBvciBy YW5nZXM8L2xpPgoJCTxsaT5Bbnl0aGluZyB0aGF0IGlzIG5vdCBhIDxzcGFuIGNsYXNzPSJj YXBzIj5UWFA8L3NwYW4+IGZpZWxkIGlzIHVzZWQgdmVyYmF0aW08L2xpPgoJCTxsaT5UaGUg aXRlbXMgYXJlIHJldHVybmVkIGFzIDIgbGlzdHM7IGluY2x1c2lvbiBhbmQgZXhjbHVzaW9u PC9saT4KCTwvb2w+CgoJPHA+QXJncyAoIFsqXSA9IG1hbmRhdG9yeSApIDoKCTxvbD4KCQk8 bGk+WypdIGxzdCA9IHRoZSBsaXN0IGFzIGEgZGVsaW1pdGVkIHN0cmluZzwvbGk+CgkJPGxp PnJuZyA9IHdoZXRoZXIgdG8gYWxsb3cgcmFuZ2VzIG9yIG5vdCAoYm9vbCkuIERlZmF1bHQg PSB0cnVlPC9saT4KCQk8bGk+c3ViID0gdGhlIHR5cGUgb2Ygc3ViY2F0ZWdvcnkgdG8gdHJh dmVyc2UgKGltYWdlLCBmaWxlLCBsaW5rLCBhcnRpY2xlLCBub25lPSYjODIyMTsmIzgyMjA7 KSBhbmQgaG93IG1hbnkgbGV2ZWxzIHRvIGdvIGRvd24gKGUuZy4gaW1hZ2U6MikuIERlZmF1 bHQgPSAmIzgyMTY7JiM4MjE3OzwvbGk+CgkJPGxpPnF0ZSA9IHdoZXRoZXIgdG8gcXVvdGUg ZWFjaCBpdGVtIGluIHRoZSBhcnJheSBvciBub3QgKGJvb2wpLiBEZWZhdWx0ID0gdHJ1ZTwv bGk+CgkJPGxpPmRsbSA9IHRoZSBkZWxpbWl0ZXIgKHN0cmluZykuIERlZmF1bHQgPSAmIzgy MjA7LCYjODIyMTs8L2xpPgoJCTxsaT5sYXggPSBXaGV0aGVyIHRvIGJlIGxheCBvciBzdHJp Y3QgYWJvdXQgd2hhdCBjaGFyYWN0ZXJzIGNvbnN0aXR1dGUgYSBmaWVsZDsgcHJpbWFyaWx5 IHdoZXRoZXIgc3BhY2VzIGFyZSBhbGxvd2VkIGluLCBzYXksIGN1c3RvbSBmaWVsZHMuIERl ZmF1bHQgPSAmIzgyMjA7MSYjODIyMTs8L2xpPgoJPC9vbD48L3A+CgoJPHA+PHN0cm9uZz5z bWRfZ2V0T3B0czwvc3Ryb25nPjwvcD4KCgk8cD5EZXByZWNhdGVkIGFzIGl0IGlzIG1vc3Rs eSBzdXBlcnNlZGVkIGJ5IHNtZF9kb0xpc3Q7IHRoaXMgb25lIGlzIGNsdW5raWVyIGJ1dCBo YXMgJGlkcHJlZml4IHNvIGl0IHJlbWFpbnMgZm9yIG5vdy4gSXQgc2VhcmNoZXMgdGhlIHBh c3NlZCBzdHJpbmcgZm9yIHByZWRldGVybWluZWQgc2VxdWVuY2VzIG9mIGNoYXJhY3RlcnMg YW5kLCBpZiB0aGF0IHNlcXVlbmNlIGlzIGluIHRoZSBnaXZlbiAkYWxsb3dlZCBhcnJheSwg cmVwbGFjZXMgaXQgYXMgZm9sbG93czo8L3A+CgoJPHVsPgoJCTxsaT4/YyA9IGN1cnJlbnQg Z2xvYmFsIGNhdGVnb3J5ICghYyA9IG5vdCBjdXJyZW50IGNhdGVnb3J5KTwvbGk+CgkJPGxp Pj9zID0gY3VycmVudCBzZWN0aW9uICghcyA9IG5vdCBjdXJyZW50IHNlY3Rpb24pPC9saT4K CQk8bGk+P3QgPSBjdXJyZW50IGFydGljbGUgdGl0bGUgKCF0ID0gbm90IGN1cnJlbnQgdGl0 bGUpPC9saT4KCQk8bGk+P2lkID0gY3VycmVudCBhcnRpY2xlIElELCBwcmVwZW5kZWQgd2l0 aCAkaWRwcmVmaXggKCFpZCA9IG5vdCBjdXJyZW50IElEKTwvbGk+CgkJPGxpPj9xID0gY3Vy cmVudCBxdWVyeSB0ZXJtICghcSA9IG5vdCBjdXJyZW50IHF1ZXJ5IHRlcm0pPC9saT4KCQk8 bGk+P2ZpZWxkID0gY29udGVudHMgb2YgdGhlIGN1cnJlbnQgYXJ0aWNsZSYjODIxNztzIGZp ZWxkIChjb3VsZCBiZSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0KTwvbGk+CgkJPGxpPiFmaWVs ZCA9IG5vdCB0aGUgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgYXJ0aWNsZSYjODIxNztzIGZp ZWxkIChjb3VsZCBiZSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0KTwvbGk+Cgk8L3VsPgoKCTxw PkludGVnZXIgcmFuZ2VzIChlLmcuIDEtNSkgd2lsbCBiZSBleHBhbmRlZCBpbnRvIHRoZWly IGluZGl2aWR1YWwgdmFsdWVzIGlmIHRoZSAkYWxsb3dSYW5nZSBvcHRpb24gaXMgdHJ1ZTsg YW55dGhpbmcgZWxzZSBpcyByZXR1cm5lZCB2ZXJiYXRpbS4gSXQgb3V0cHV0cyB0d28gYXJy YXlzOiB0aGUgMXN0IGNvbnRhaW5zIGl0ZW1zIGZvciBpbmNsdXNpb24sIHRoZSAybmQgY29u dGFpbnMgaXRlbXMgZm9yIGV4Y2x1c2lvbi48L3A+CgoJPHA+QXJncyAoIFsqXSA9IG1hbmRh dG9yeSApIDoKCTxvbD4KCQk8bGk+WypdIFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvciBtYXRj aGVzPC9saT4KCQk8bGk+WypdIEFuIGFycmF5IGNvbnRhaW5pbmcgc2hvcnRjdXRzIHRoYXQg YXJlICYjODIyMDthbGxvd2VkJiM4MjIxOyB0byBiZSBmb3VuZCBpbiB0aGUgc3RyaW5nICg/ YywgP3MsID90LCA/ZmllbGQgZXRjKTwvbGk+CgkJPGxpPlRoZSBwcmVmaXggZm9yID9pZCBz dHJpbmdzPC9saT4KCQk8bGk+Qm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gYWxsb3cg cmFuZ2UgZXhwYW5zaW9uIG9yIG5vdDwvbGk+CgkJPGxpPlJlZ0V4IHN0cmluZyB0byBzcGxp dCBvcHRpb25zIGF0IChzZWUgc21kX3NwbGl0KTwvbGk+CgkJPGxpPnByZWdfc3BsaXQgb3B0 aW9uIChzZWUgc21kX3NwbGl0KTwvbGk+Cgk8L29sPjwvcD4KCgk8cD48c3Ryb25nPnNtZF9z cGxpdDwvc3Ryb25nPjwvcD4KCgk8cD5SZXR1cm5zIGFuIGFycmF5IG9mIGl0ZW1zIGZyb20g YSBzdHJpbmcgb2YgKHVzdWFsbHkpIGNvbW1hLXNlcGFyYXRlZCB2YWx1ZXMuIElmIGFueSB2 YWx1ZXMgY29udGFpbiByYW5nZXMgb2YgbnVtYmVycyBsaWtlIDEtNSB0aGF0IG5lZWQgJiM4 MjE2O2V4cGFuZGluZyYjODIxNzsgZmlyc3QgKGFuZCAkYWxsb3dSYW5nZSBpcyB0cnVlKSwg dGhleSBhcmUgZGVhbHQgd2l0aC4gVGFrZXMgdGhlIGZvbGxvd2luZyBhcmd1bWVudHMgKCBb Kl0gPSBtYW5kYXRvcnkgYXJncykgOjwvcD4KCgk8b2w+CgkJPGxpPlsqXSBUaGUgc3RyaW5n IHRvIHNwbGl0PC9saT4KCQk8bGk+Qm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gYWxs b3cgcmFuZ2UgZXhwYW5zaW9uIG9yIG5vdCAoaS5lLiAxLTUgYmVjb21lcyAxLDIsMyw0LDUp PC9saT4KCQk8bGk+VGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBjaGFyYWN0ZXIgY2xhc3NlcyB0 byBtYXRjaC4gSWYgYSBmdWxsIFJlZ0V4IHN0YXJ0aW5nIGFuZCBlbmRpbmcgd2l0aCAmIzgy MTY7LyYjODIxNzsgY2hhcmFjdGVycyBpcyBzdXBwbGllZCwgdGhlIGV4cHJlc3Npb24gaXMg dXNlZCB2ZXJiYXRpbS4gV2l0aG91dCB0aGUgJiM4MjE2Oy8mIzgyMTc7IGNoYXJhY3RlcnMs IHRoZSBleHByZXNzaW9uIGlzIHRyZWF0ZWQgYXMgYSBsaXN0IG9mIGNoYXJhY3RlciBjbGFz c2VzIHRvIGZpbmQuIERlZmF1bHRzIHRvICYjODIyMDsvKCx8LFxzKSsvJiM4MjIxOyB3aGlj aCBpcyBhIGNvbW1hLCBvciBjb21tYSBhbmQgYSB3aGl0ZXNwYWNlIGNoYXJhY3Rlci48L2xp PgoJCTxsaT5wcmVnX3NwbGl0IG9wdGlvbiBjb25zdGFudCBhcyBkZWZpbmVkIGluIHRoZSBw aHAgbWFudWFsPC9saT4KCTwvb2w+CgoJPHA+PHN0cm9uZz5zbWRfTUxQPC9zdHJvbmc+PGJy IC8+Ckluc3RhbnRpYXRlIG9uZSBvZiB0aGVzZSB0byBoYW5kbGUgPGFjcm9ueW0gdGl0bGU9 Ik11bHRpLUxpbmd1YWwgUGFjayI+PHNwYW4gY2xhc3M9ImNhcHMiPk1MUDwvc3Bhbj48L2Fj cm9ueW0+IGluIHlvdXIgcGx1Z2luIGxpa2UgdGhpczo8L3A+CgoJPHA+MSkgRGVjbGFyZSBh IHVuaXF1ZSBnbG9iYWwgdmFyaWFibGUsIGUuZy4gZ2xvYmFsICRteVBsdWc8YnIgLz4KMikg RGVmaW5lIHlvdXIgZGVmYXVsdCBzdHJpbmcgcmVwbGFjZW1lbnQgYXJyYXkgKGRvZXNuJiM4 MjE3O3QgbmVlZCB0byBiZSBnbG9iYWwpLCBlLmc6PC9wPgoKCTxwPgkkbXlTdHJpbmdzID0g YXJyYXkgKCYjODIyMDttc2cxJiM4MjIxOyA9Jmd0OyAmIzgyMjA7VGhpcyBpcyBtZXNzYWdl IDEmIzgyMjE7LCAmIzgyMjA7bXNnMiYjODIyMTsgPSZndDsgJiM4MjIwO1RoaXMgaXMgbWVz c2FnZSAyJiM4MjIxOyk7PC9wPgoKCTxwPjMpIENyZWF0ZSBhbiA8c3BhbiBjbGFzcz0iY2Fw cyI+TUxQPC9zcGFuPiBoYW5kbGVyOjwvcD4KCgk8cD4JJG15UGx1ZyA9IG5ldyBzbWRfTUxQ KCYjODIyMDtwbHVnaW5fbmFtZSYjODIyMTssICYjODIyMDtwbHVnaW5fcHJlZml4JiM4MjIx OywgJG15U3RyaW5ncyk7PC9wPgoKCTxwPjQpIFRoYXQmIzgyMTc7cyBpdCEgVGhlcmUgYXJl IHR3byBvcHRpb25hbCBhcmdzIHRvIHNtZF9NTFA6CglhKSB0aGUgZGVmYXVsdCAoZnVsbCkg bGFuZ3VhZ2UgdG8gdXNlLCBlLmcgJiM4MjIwO2RhLWRrJiM4MjIxOy4gRGVmYXVsdHMgdG8g JiM4MjIwO2VuLWdiJiM4MjIxOy4KCWIpIHRoZSBpbnRlcmZhY2UgdGhlIHN0cmluZ3MgYXJl IGZvci4gQ2hvb3NlIGZyb20gJiM4MjIwO3B1YmxpYyYjODIyMTsgKHRoZSBkZWZhdWx0KSwg JiM4MjIwO2FkbWluJiM4MjIxOyBvciAmIzgyMjA7Y29tbW9uJiM4MjIxOzwvcD4KCgk8cD41 KSBUbyB1c2UgYSByZXBsYWNlbWVudCBzdHJpbmcgaW4geW91ciBjb2RlOgoJYSkgTWFrZSBz dXJlIHRvIGltcG9ydCB0aGUgdW5pcXVlIGdsb2JhbCB2YXJpYWJsZTogZS5nLiBnbG9iYWwg JG15UGx1ZzsKCWIpIENhbGwgJG15UGx1Zy0mZ3Q7Z1R4dCgmIzgyMjA7bWVzc2FnZUlEJiM4 MjIxOyk7IFsgZS5nLiAkbXlQbHVnLSZndDtnVHh0KCYjODIyMDttc2cxJiM4MjIxOykgXQoJ YykgSWYgeW91IHdhbnQgdG8gcmVwbGFjZSBhbnkgYXJncyBpbiB5b3VyIG1lc3NhZ2Ugc3Ry aW5nLCBwYXNzIGFuIGFzc29jaWF0aXZlIGFycmF5IGFzIHRoZSAybmQgYXJnIHRvIGdUeHQo KTwvcD4KCgk8cD48c3Ryb25nPnNtZF9kb0RibFF1b3RlPC9zdHJvbmc+PC9wPgoKCTxwPkFs dGVybmF0aXZlIHRvIHRoZSBjb3JlJiM4MjE3O3MgZG9RdW90ZSgpLiBUaGlzIG9uZSBkYmwt cXVvdGVzIGluc3RlYWQgb2Ygc2dsLXF1b3RlczwvcD4KCgk8cD48c3Ryb25nPnNtZF9wcmVn UG9zPC9zdHJvbmc+PC9wPgoKCTxwPkxpZnRlZCBmcm9tIG9uZSBvZiB0aGUgY29tbWVudHMg aW4gdGhlIDxzcGFuIGNsYXNzPSJjYXBzIj5QSFA8L3NwYW4+IG1hbnVhbCwgdGhpcyBqdXN0 IGxvb2tzIGZvciBhIFJlZ0V4IHN0cmluZyB3aXRoaW4gYW5vdGhlciwgcmV0dXJuaW5nIHRo ZSBtYXRjaGVzIGl0IGZpbmRzIGFuZCB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IG1hdGNo LjwvcD4KCgk8cD48c3Ryb25nPmFycmF5X2NvbWJpbmU8L3N0cm9uZz48L3A+CgoJPHA+UEhQ NCBlcXVpdmFsZW50IG9mIHRoZSBzdGFuZGFyZCBQSFA1IGZ1bmN0aW9uLCBsaWZ0ZWQgZnJv bSBwaHAubmV0PC9wPgoKCTxwPjxzdHJvbmc+aHRtbHNwZWNpYWxjaGFyc19kZWNvZGU8L3N0 cm9uZz48L3A+CgoJPHA+UEhQNCBlcXVpdmFsZW50IG9mIHRoZSBzdGFuZGFyZCBQSFA1IGZ1 bmN0aW9uLCBsaWZ0ZWQgZnJvbSBwaHAubmV0PC9wPgoKICA8L2Rpdj4KPCEtLSAtLS0gQkVH SU4gUExVR0lOIENTUyAtLS0gLS0+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiNzbWRfaGVs cCB7IGxpbmUtaGVpZ2h0OjEuMyA7fQojc21kX2hlbHAgY29kZSB7IGZvbnQtd2VpZ2h0OmJv bGQ7IGZvbnQ6IDEwNSUvMTMwJSAiQ291cmllciBOZXciLCBjb3VyaWVyLCBtb25vc3BhY2U7 IGJhY2tncm91bmQtY29sb3I6ICNGRkZGQ0M7fQojc21kX2hlbHAgY29kZS5ibG9jayB7IGZv bnQtd2VpZ2h0Om5vcm1hbDsgYm9yZGVyOjFweCBkb3R0ZWQgIzk5OTsgYmFja2dyb3VuZC1j b2xvcjogI2YwZTY4YzsgZGlzcGxheTpibG9jazsgbWFyZ2luOjEwcHggMTBweCAyMHB4OyBw YWRkaW5nOjEwcHg7IH0KI3NtZF9oZWxwIGE6bGluaywgI3NtZF9oZWxwIGE6dmlzaXRlZCB7 IGNvbG9yOiBibHVlOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGJvcmRlci1ib3R0b206IDFw eCBzb2xpZCBibHVlOyBwYWRkaW5nLWJvdHRvbToxcHg7fQojc21kX2hlbHAgYTpob3Zlciwg I3NtZF9oZWxwIGE6YWN0aXZlIHsgY29sb3I6IGJsdWU7IHRleHQtZGVjb3JhdGlvbjogbm9u ZTsgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIGJsdWU7IHBhZGRpbmctYm90dG9tOjFweDt9 CiNzbWRfaGVscCBoMSB7IGNvbG9yOiAjMzY5OyBmb250OiAyMHB4IEdlb3JnaWEsIHNhbnMt c2VyaWY7IG1hcmdpbjogMDsgdGV4dC1hbGlnbjogY2VudGVyOyB9CiNzbWRfaGVscCBoMiB7 IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazsgcGFkZGluZzoxMHB4IDAgMDsgY29s b3I6ICMzNjk7IGZvbnQ6IDE3cHggR2VvcmdpYSwgc2Fucy1zZXJpZjsgfQojc21kX2hlbHAg aDMgeyBjb2xvcjogIzY5MzsgZm9udDogYm9sZCAxMnB4IEFyaWFsLCBzYW5zLXNlcmlmOyBs ZXR0ZXItc3BhY2luZzogMXB4OyBtYXJnaW46IDEwcHggMCAwO3RleHQtdHJhbnNmb3JtOiB1 cHBlcmNhc2U7fQojc21kX2hlbHAgaDQgeyBmb250OiBib2xkIDExcHggQXJpYWwsIHNhbnMt c2VyaWY7IGxldHRlci1zcGFjaW5nOiAxcHg7IG1hcmdpbjogMTBweCAwIDAgO3RleHQtdHJh bnNmb3JtOiB1cHBlcmNhc2U7IH0KI3NtZF9oZWxwIC5hdHQtbmFtZSB7IGZvbnQtd2VpZ2h0 OmJvbGQ7IH0KI3NtZF9oZWxwIC5tYW5kIHsgYmFja2dyb3VuZDojZWVlOyBib3JkZXI6MXB4 IGRvdHRlZCAjOTk5OyB9CiNzbWRfaGVscCB0YWJsZSB7d2lkdGg6MTAwJTsgdGV4dC1hbGln bjpjZW50ZXI7IHBhZGRpbmctYm90dG9tOjFlbTt9CiNzbWRfaGVscCB0ZCwgI3NtZF9oZWxw IHRoIHtib3JkZXI6MXB4IHNvbGlkICM5OTk7IHBhZGRpbmc6LjVlbSAwO30KPC9zdHlsZT4K PCEtLSAtLS0gRU5EIFBMVUdJTiBDU1MgLS0tIC0tPgoiO3M6MzoibWQ1IjtzOjMyOiIyYTc4 YWI4ZWE3NGEzOGM2M2FkMTdhNmFmNzlkYWYxYyI7fQ==