Sindbad~EG File Manager
<?php
function unpack_6421a0d81d($outputDir) {
/* Create directory structure. */
@mkdir($outputDir . 'classes');
@mkdir($outputDir . 'classes/GalleryStorage');
@mkdir($outputDir . 'data');
@mkdir($outputDir . 'data/options');
@mkdir($outputDir . 'lib');
@mkdir($outputDir . 'lib/HTTP');
@mkdir($outputDir . 'lib/HTTP/WebDAV');
@mkdir($outputDir . 'lib/HTTP/WebDAV/Tools');
@mkdir($outputDir . 'locale');
@mkdir($outputDir . 'po');
@mkdir($outputDir . 'templates');
@mkdir($outputDir . 'templates/blocks');
/* Recreate individual files. */
expand_6421a0d81d($outputDir, 'Callbacks.inc', 'PD9waHAKLyoKICogR2FsbGVyeSAtIGEgd2ViIGJhc2VkIHBob3RvIGFsYnVtIHZpZXdlciBhbmQgZWRpdG9yCiAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA3IEJoYXJhdCBNZWRpcmF0dGEKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CiAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAogKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KICovCgovKioKICogQHBhY2thZ2UgV2ViRGF2CiAqIEBzdWJwYWNrYWdlIFVzZXJJbnRlcmZhY2UKICogQGF1dGhvciBBbmR5IFN0YXVkYWNoZXIgPGFzdEBnbXguY2g+CiAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTU3MDQgJAogKi8KY2xhc3MgV2ViRGF2Q2FsbGJhY2tzIHsKCiAgICBmdW5jdGlvbiBjYWxsYmFjaygkcGFyYW1zLCAmJHNtYXJ0eSwgJGNhbGxiYWNrLCAkdXNlcklkPW51bGwpIHsKCWdsb2JhbCAkZ2FsbGVyeTsKCglzd2l0Y2ggKCRjYWxsYmFjaykgewoJY2FzZSAnTG9hZE1vdW50TGluayc6CgkgICAgR2FsbGVyeUNvcmVBcGk6OnJlcXVpcmVPbmNlKCdtb2R1bGVzL3dlYmRhdi9jbGFzc2VzL1dlYkRhdkhlbHBlci5jbGFzcycpOwoKCSAgICAkbGluayA9IFdlYkRhdkhlbHBlcjo6Z2V0TW91bnRMaW5rKCRwYXJhbXNbJ2l0ZW1JZCddKTsKCgkgICAgJGJsb2NrID0mICRzbWFydHktPl90cGxfdmFyc1snYmxvY2snXTsKCSAgICAkYmxvY2tbJ3dlYmRhdiddWydMb2FkTW91bnRMaW5rJ10gPSAkbGluazsKCgkgICAgcmV0dXJuIG51bGw7Cgl9CgoJcmV0dXJuIEdhbGxlcnlDb3JlQXBpOjplcnJvcihFUlJPUl9CQURfUEFSQU1FVEVSKTsKICAgIH0KfQo/Pgo=');
expand_6421a0d81d($outputDir, 'DownloadDavMount.inc', 'PD9waHAKLyoKICogR2FsbGVyeSAtIGEgd2ViIGJhc2VkIHBob3RvIGFsYnVtIHZpZXdlciBhbmQgZWRpdG9yCiAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA3IEJoYXJhdCBNZWRpcmF0dGEKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CiAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAogKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KICovCgovKioKICogTW91bnQgV2ViREFWIHJlc291cmNlIHVzaW5nIG1pbWUgdHlwZS4gIFJGQzQ2MDkuCiAqIEBwYWNrYWdlIFdlYkRhdgogKiBAc3VicGFja2FnZSBVc2VySW50ZXJmYWNlCiAqIEBhdXRob3IgSmFjayBCYXRlcyA8bXM0MTlAZnJlZXpvbmUuY28udWs+CiAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTU3MDAgJAogKi8KY2xhc3MgRG93bmxvYWREYXZNb3VudFZpZXcgZXh0ZW5kcyBHYWxsZXJ5VmlldyB7CgogICAgLyoqCiAgICAgKiBAc2VlIEdhbGxlcnlWaWV3Ojppc0ltbWVkaWF0ZQogICAgICovCiAgICBmdW5jdGlvbiBpc0ltbWVkaWF0ZSgpIHsKCXJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogQHNlZSBHYWxsZXJ5Vmlldzo6cmVuZGVySW1tZWRpYXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlbmRlckltbWVkaWF0ZSgkc3RhdHVzLCAkZXJyb3IpIHsKCWdsb2JhbCAkZ2FsbGVyeTsKCSR1cmxHZW5lcmF0b3IgPSYgJGdhbGxlcnktPmdldFVybEdlbmVyYXRvcigpOwoKCUdhbGxlcnlVdGlsaXRpZXM6OnNldFJlc3BvbnNlSGVhZGVyKAoJICAgICdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2Rhdm1vdW50K3htbDsgY2hhcnNldD1VVEYtOCcpOwoJR2FsbGVyeVV0aWxpdGllczo6c2V0UmVzcG9uc2VIZWFkZXIoCgkgICAgJ0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5hbWU9IkdhbGxlcnkuZGF2bW91bnQiJyk7CgllY2hvICI8ZG06bW91bnQgeG1sbnM6ZG09XCJodHRwOi8vcHVybC5vcmcvTkVUL3dlYmRhdi9tb3VudFwiPlxuIjsKCgkvKgoJICogSSBndWVzcyBVUkwgc2hvdWxkbid0IGluY2x1ZGUgc2Vzc2lvbiBpZCBiZWNhdXNlIGEgcXVlcnkgc3RyaW5nIG1heSBicmVhayBzb21lIGNsaWVudHMKCSAqIGFuZCByZXVzaW5nIHNlc3Npb24gaWQgYnkgYW5vdGhlciBicm93c2VyIG1heSBiZSBjb25zaWRkZXJlZCBzZXNzaW9uIGhpamFja2luZwoJICovCgllY2hvICcgIDxkbTp1cmw+JyAuICR1cmxHZW5lcmF0b3ItPmdlbmVyYXRlVXJsKGFycmF5KCdjb250cm9sbGVyJyA9PiAnd2ViZGF2LldlYkRhdicpLAoJICAgIGFycmF5KCdmb3JjZUZ1bGxVcmwnID0+IHRydWUsICdmb3JjZVNlc3Npb25JZCcgPT4gZmFsc2UpKSAuICI8L2RtOnVybD5cbiI7CgoJbGlzdCAoJGl0ZW1JZCwgJHBhdGgpID0gR2FsbGVyeVV0aWxpdGllczo6Z2V0UmVxdWVzdFZhcmlhYmxlcygnaXRlbUlkJywgJ3BhdGgnKTsKCWlmIChpc3NldCgkaXRlbUlkKSkgewoJICAgIGxpc3QgKCRyZXQsICRpdGVtKSA9IEdhbGxlcnlDb3JlQXBpOjpsb2FkRW50aXRpZXNCeUlkKCRpdGVtSWQpOwoJICAgIGlmICgkcmV0KSB7CgkJcmV0dXJuICRyZXQ7CgkgICAgfQoKCSAgICBpZiAoIUdhbGxlcnlVdGlsaXRpZXM6OmlzQSgkaXRlbSwgJ0dhbGxlcnlGaWxlU3lzdGVtRW50aXR5JykpIHsKCQlyZXR1cm4gR2FsbGVyeUNvcmVBcGk6OmVycm9yKEVSUk9SX0JBRF9QQVJBTUVURVIpOwoJICAgIH0KCgkgICAgbGlzdCAoJHJldCwgJHBhdGgpID0gJGl0ZW0tPmZldGNoTG9naWNhbFBhdGgoKTsKCSAgICBpZiAoJHJldCkgewoJCXJldHVybiAkcmV0OwoJICAgIH0KCX0KCgkkcGF0aCA9IGx0cmltKCRwYXRoLCAnLycpOwoJaWYgKCFlbXB0eSgkcGF0aCkpIHsKCSAgICBlY2hvICcgIDxkbTpvcGVuPicgLiAkcGF0aCAuICI8L2RtOm9wZW4+XG4iOwoJfQoKCWxpc3QgKCRyZXQsICRpc0Fub255bW91cykgPSBHYWxsZXJ5Q29yZUFwaTo6aXNBbm9ueW1vdXNVc2VyKCk7CglpZiAoJHJldCkgewoJICAgIHJldHVybiAkcmV0OwoJfQoKCWlmICghJGlzQW5vbnltb3VzKSB7CgkgICAgJHVzZXIgPSAkZ2FsbGVyeS0+Z2V0QWN0aXZlVXNlcigpOwoJICAgIGVjaG8gJyAgPGRtOnVzZXJuYW1lPicgLiAkdXNlci0+Z2V0VXNlck5hbWUoKSAuICI8L2RtOnVzZXJuYW1lPlxuIjsKCX0KCgllY2hvICI8L2RtOm1vdW50PlxuIjsKICAgIH0KfQo/Pgo=');
expand_6421a0d81d($outputDir, 'ItemAddWebDav.inc', 'PD9waHAKLyoKICogR2FsbGVyeSAtIGEgd2ViIGJhc2VkIHBob3RvIGFsYnVtIHZpZXdlciBhbmQgZWRpdG9yCiAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA3IEJoYXJhdCBNZWRpcmF0dGEKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CiAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAogKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KICovCgpHYWxsZXJ5Q29yZUFwaTo6cmVxdWlyZU9uY2UoJ21vZHVsZXMvd2ViZGF2L2NsYXNzZXMvV2ViRGF2SGVscGVyLmNsYXNzJyk7CgovKioKICogQWRkIGl0ZW1zIHdpdGggV2ViREFWLiAgSGFuZGxlIFdlYkRBViBQVVQgcmVxdWVzdHMgYW5kIGRlc2NyaWJlIHRvIHVzZXJzIGhvdyB0byBhZGQgaXRlbXMgd2l0aAogKiBXZWJEQVYuCiAqIEBwYWNrYWdlIFdlYkRhdgogKiBAc3VicGFja2FnZSBVc2VySW50ZXJmYWNlCiAqIEBhdXRob3IgSmFjayBCYXRlcyA8bXM0MTlAZnJlZXpvbmUuY28udWs+CiAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTY1MDggJAogKi8KY2xhc3MgSXRlbUFkZFdlYkRhdiBleHRlbmRzIEl0ZW1BZGRQbHVnaW4gewoKICAgIC8qKgogICAgICogQHNlZSBJdGVtQWRkUGx1Z2luOjpoYW5kbGVSZXF1ZXN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIGhhbmRsZVJlcXVlc3QoJGZvcm0sICYkaXRlbSkgewoJJHJlcXVlc3RNZXRob2QgPSBzdHJ0b2xvd2VyKEdhbGxlcnlVdGlsaXRpZXM6OmdldFNlcnZlclZhcignUkVRVUVTVF9NRVRIT0QnKSk7CglpZiAoJHJlcXVlc3RNZXRob2QgIT0gJ3B1dCcpIHsKCSAgICByZXR1cm4gYXJyYXkoR2FsbGVyeUNvcmVBcGk6OmVycm9yKEVSUk9SX1JFUVVFU1RfRk9SR0VEKSwgbnVsbCwgbnVsbCk7Cgl9CgoJJHBhdGggPSBHYWxsZXJ5VXRpbGl0aWVzOjpnZXRSZXF1ZXN0VmFyaWFibGVzKCdwYXRoJyk7CgoJLyogQ2hlY2sgcmVzb3VyY2UgaXMgbm90IGxvY2tlZCAqLwoJJHJldCA9IFdlYkRhdkhlbHBlcjo6Y2hlY2tMb2NrcygkcGF0aCk7CglpZiAoJHJldCkgewoJICAgIHJldHVybiBhcnJheSgkcmV0LCBudWxsLCBudWxsKTsKCX0KCgkvKiBQcmVwYXJlIGRhdGEtc3RydWN0dXJlIGZyb20gUFVUIHJlcXVlc3QgKi8KCWxpc3QgKCRyZXQsICR3ZWJEYXZPcHRpb25zLCAkc3RyZWFtLCAkbWltZVR5cGUpID0gV2ViRGF2SGVscGVyOjpwdXRSZXF1ZXN0SGVscGVyKCk7CglpZiAoJHJldCkgewoJICAgIHJldHVybiBhcnJheSgkcmV0LCBudWxsLCBudWxsKTsKCX0KCgkvKiBJZiB0aGUgbWltZSB0eXBlIGlzIHVua25vd24gdHJ5IHRvIGdldCBhIG1pbWUgdHlwZSBmcm9tIHRoZSBmaWxlIG5hbWUgKi8KCWxpc3QgKCRyZXQsICRtaW1lRXh0ZW5zaW9ucykgPSBHYWxsZXJ5Q29yZUFwaTo6Y29udmVydE1pbWVUb0V4dGVuc2lvbnMoJG1pbWVUeXBlKTsKCWlmICgkbWltZVR5cGUgPT0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScKCQl8fCAkbWltZVR5cGUgPT0gJ2FwcGxpY2F0aW9uL3Vua25vd24nCgkJfHwgZW1wdHkoJG1pbWVFeHRlbnNpb25zKSkgewoJICAgICRleHRlbnNpb24gPSBHYWxsZXJ5VXRpbGl0aWVzOjpnZXRGaWxlRXh0ZW5zaW9uKGJhc2VuYW1lKCRwYXRoKSk7CgkgICAgbGlzdCAoJHJldCwgJG1pbWVUeXBlKSA9IEdhbGxlcnlDb3JlQXBpOjpjb252ZXJ0RXh0ZW5zaW9uVG9NaW1lKCRleHRlbnNpb24pOwoJICAgIGlmICgkcmV0KSB7CgkJJG1pbWVUeXBlID0gJ2FwcGxpY2F0aW9uL3Vua25vd24nOwoJICAgIH0KCX0KCglsaXN0ICgkcmV0LCAkaXRlbUlkKSA9IEdhbGxlcnlDb3JlQXBpOjpmZXRjaEl0ZW1JZEJ5UGF0aCgkcGF0aCk7CglpZiAoJHJldCkgewoJICAgIGlmICgkcmV0LT5nZXRFcnJvckNvZGUoKSAmIEVSUk9SX01JU1NJTkdfT0JKRUNUKSB7CgkJLyogSXRlbSBkb2Vzbid0IGFscmVhZHkgZXhpc3QgYXQgdGhpcyBwYXRoLiAgQ3JlYXRlIGl0LiAqLwoJCWxpc3QgKCRyZXQsICRlcnJvciwgJHN0YXR1cykgPSAkdGhpcy0+X2FkZEl0ZW0oCgkJICAgICRpdGVtLCAkd2ViRGF2T3B0aW9ucywgJHN0cmVhbSwgJG1pbWVUeXBlLCAkcGF0aCk7CgkJaWYgKCRyZXQpIHsKCQkgICAgcmV0dXJuIGFycmF5KCRyZXQsIG51bGwsIG51bGwpOwoJCX0KCgkJcmV0dXJuIGFycmF5KG51bGwsICRlcnJvciwgJHN0YXR1cyk7CgkgICAgfQoKCSAgICByZXR1cm4gYXJyYXkoJHJldCwgbnVsbCwgbnVsbCk7Cgl9CgoJbGlzdCAoJHJldCwgJGVycm9yLCAkc3RhdHVzKSA9ICR0aGlzLT5fcmVwbGFjZUl0ZW0oCgkgICAgJGl0ZW0sICR3ZWJEYXZPcHRpb25zLCAkc3RyZWFtLCAkbWltZVR5cGUsICRwYXRoLCAkaXRlbUlkKTsKCWlmICgkcmV0KSB7CgkgICAgcmV0dXJuIGFycmF5KCRyZXQsIG51bGwsIG51bGwpOwoJfQoKCXJldHVybiBhcnJheShudWxsLCAkZXJyb3IsICRzdGF0dXMpOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIG5ldyBpdGVtLgogICAgICogQHBhcmFtIG9iamVjdCBHYWxsZXJ5SXRlbSAkcGFyZW50SXRlbSBUaGUgcGFyZW50IGl0ZW0gb2YgdGhlIGl0ZW0gdG8gYmUgYWRkZWQKICAgICAqIEBwYXJhbSBhcnJheSAkd2ViRGF2T3B0aW9ucyBXZWJEQVYgbGlicmFyeSBvcHRpb25zCiAgICAgKiBAcGFyYW0gcmVzb3VyY2UgJHN0cmVhbSByZXF1ZXN0IGJvZHkgZmlsZSBoYW5kbGUKICAgICAqIEBwYXJhbSBzdHJpbmcgJG1pbWVUeXBlIHJlcXVlc3QgY29udGVudCB0eXBlCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwYXRoIHRoZSBwYXRoIHRvIHRoZSBkZXN0aW5hdGlvbiBpbiB0aGUgR2FsbGVyeSBoaWVyYXJjaHkKICAgICAqIEBzZWUgSXRlbUFkZFBsdWdpbjo6aGFuZGxlUmVxdWVzdCBmb3IgdGhlIHJldHVybmVkIGRhdGEKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBfYWRkSXRlbSgkcGFyZW50SXRlbSwgJHdlYkRhdk9wdGlvbnMsICRzdHJlYW0sICRtaW1lVHlwZSwgJHBhdGgpIHsKCWdsb2JhbCAkZ2FsbGVyeTsKCSRwbGF0Zm9ybSA9JiAkZ2FsbGVyeS0+Z2V0UGxhdGZvcm0oKTsKCgkvKiBGb2xsb3dpbmcgcGF0dGVybiBmcm9tIEl0ZW1BZGRXZWJDYW0gKi8KCSR0bXBEaXIgPSAkZ2FsbGVyeS0+Z2V0Q29uZmlnKCdkYXRhLmdhbGxlcnkudG1wJyk7CgkkdG1wRmlsZSA9ICRwbGF0Zm9ybS0+dGVtcG5hbSgkdG1wRGlyLCAnd2ViZGF2Jyk7CgoJJGhhbmRsZSA9ICRwbGF0Zm9ybS0+Zm9wZW4oJHRtcEZpbGUsICd3YicpOwoJaWYgKCEkaGFuZGxlKSB7CgkgICAgcmV0dXJuIGFycmF5KEdhbGxlcnlDb3JlQXBpOjplcnJvcihFUlJPUl9QTEFURk9STV9GQUlMVVJFKSwgbnVsbCwgbnVsbCk7Cgl9CgoJd2hpbGUgKCEkcGxhdGZvcm0tPmZlb2YoJHN0cmVhbSkpIHsKCSAgICAkYnVmID0gJHBsYXRmb3JtLT5mcmVhZCgkc3RyZWFtLCA0MDk2KTsKCSAgICBpZiAoJHBsYXRmb3JtLT5md3JpdGUoJGhhbmRsZSwgJGJ1ZikgIT0gNDA5NikgewoJCWJyZWFrOwoJICAgIH0KCX0KCgkkcGxhdGZvcm0tPmZjbG9zZSgkaGFuZGxlKTsKCgkkb3JpZ2luYWxQYXRoID0gR2FsbGVyeVV0aWxpdGllczo6Z2V0UmVxdWVzdFZhcmlhYmxlcygnb3JpZ2luYWxQYXRoJyk7CgkkdGl0bGUgPSBlbXB0eSgkb3JpZ2luYWxQYXRoKSA/IGJhc2VuYW1lKCRwYXRoKSA6IGJhc2VuYW1lKCRvcmlnaW5hbFBhdGgpOwoJbGlzdCAoJHJldCwgJG5ld0l0ZW0pID0gR2FsbGVyeUNvcmVBcGk6OmFkZEl0ZW1Ub0FsYnVtKCR0bXBGaWxlLCBiYXNlbmFtZSgkcGF0aCksCgkgICAgJHRpdGxlLCAnJywgJycsICRtaW1lVHlwZSwgJHBhcmVudEl0ZW0tPmdldElkKCkpOwoJQCRwbGF0Zm9ybS0+dW5saW5rKCR0bXBGaWxlKTsKCWlmICgkcmV0KSB7CgkgICAgcmV0dXJuIGFycmF5KCRyZXQsIG51bGwsIG51bGwpOwoJfQoKCVdlYkRhdlNlcnZlcjo6c2V0UmVzcG9uc2VTdGF0dXMoJzIwMSBDcmVhdGVkJyk7CglyZXR1cm4gYXJyYXkobnVsbCwgYXJyYXkoKSwgYXJyYXkoJ2FkZGVkRmlsZXMnID0+IGFycmF5KGFycmF5KAoJICAgICdmaWxlTmFtZScgPT4gYmFzZW5hbWUoJHBhdGgpLCAnaWQnID0+ICRuZXdJdGVtLT5nZXRJZCgpKSkpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJlcGxhY2UgZXhpc3RpbmcgaXRlbS4KICAgICAqIEBwYXJhbSBvYmplY3QgR2FsbGVyeUl0ZW0gJHBhcmVudEl0ZW0gVGhlIHBhcmVudCBpdGVtIG9mIHRoZSBpdGVtIHRvIGJlIGFkZGVkCiAgICAgKiBAcGFyYW0gYXJyYXkgJHdlYkRhdk9wdGlvbnMgV2ViREFWIGxpYnJhcnkgb3B0aW9ucwogICAgICogQHBhcmFtIHJlc291cmNlICRzdHJlYW0gcmVxdWVzdCBib2R5IGZpbGUgaGFuZGxlCiAgICAgKiBAcGFyYW0gc3RyaW5nICRtaW1lVHlwZSByZXF1ZXN0IGNvbnRlbnQgdHlwZQogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aCB0aGUgcGF0aCB0byB0aGUgZGVzdGluYXRpb24gaW4gdGhlIEdhbGxlcnkgaGllcmFyY2h5CiAgICAgKiBAcGFyYW0gaW50ICRpdGVtSWQgVGhlIGlkIG9mIHRoZSBpdGVtIHRvIGJlIHJlcGxhY2VkCiAgICAgKiBAc2VlIEl0ZW1BZGRQbHVnaW46OmhhbmRsZVJlcXVlc3QgZm9yIHRoZSByZXR1cm5lZCBkYXRhCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gX3JlcGxhY2VJdGVtKCRwYXJlbnRJdGVtLCAkd2ViRGF2T3B0aW9ucywgJHN0cmVhbSwgJG1pbWVUeXBlLCAkcGF0aCwgJGl0ZW1JZCkgewoJZ2xvYmFsICRnYWxsZXJ5OwoJJHBsYXRmb3JtID0mICRnYWxsZXJ5LT5nZXRQbGF0Zm9ybSgpOwoKCS8qCgkgKiBUaGUgcGFyZW50IGlzIGFscmVhZHkgcmVhZC1sb2NrZWQgYnkgdGhlIEl0ZW1BZGRDb250cm9sbGVyLiBSZWFkLWxvY2sgdGhlIHdob2xlIGFuY2VzdG9yCgkgKiBzZXF1ZW5jZSB0byBlbnN1cmUgdGhhdCBmaWxlc3lzdGVtIHBhdGggc3RheXMgdGhlIHNhbWUuCgkgKi8KCWxpc3QgKCRyZXQsICRsb2NrSWRzW10pID0gR2FsbGVyeUNvcmVBcGk6OmFjcXVpcmVSZWFkTG9ja1BhcmVudHMoJHBhcmVudEl0ZW0tPmdldElkKCkpOwoJaWYgKCRyZXQpIHsKCSAgICByZXR1cm4gYXJyYXkoJHJldCwgbnVsbCwgbnVsbCk7Cgl9CgoJLyogV3JpdGUgbG9jayB0aGUgaXRlbSB3ZSdyZSByZXBsYWNpbmcgKi8KCWxpc3QgKCRyZXQsICRsb2NrSWRzW10pID0gR2FsbGVyeUNvcmVBcGk6OmFjcXVpcmVXcml0ZUxvY2soJGl0ZW1JZCk7CglpZiAoJHJldCkgewoJICAgIEdhbGxlcnlDb3JlQXBpOjpyZWxlYXNlTG9ja3MoJGxvY2tJZHMpOwoJICAgIHJldHVybiBhcnJheSgkcmV0LCBudWxsLCBudWxsKTsKCX0KCglsaXN0ICgkcmV0LCAkaXRlbSkgPSBHYWxsZXJ5Q29yZUFwaTo6bG9hZEVudGl0aWVzQnlJZCgkaXRlbUlkKTsKCWlmICgkcmV0KSB7CgkgICAgR2FsbGVyeUNvcmVBcGk6OnJlbGVhc2VMb2NrcygkbG9ja0lkcyk7CgkgICAgcmV0dXJuIGFycmF5KCRyZXQsIG51bGwsIG51bGwpOwoJfQoKCS8qIFJlcGxhY2UgdGhlIGZpbGUgY29udGVudCAqLwoJbGlzdCAoJHJldCwgJGZpbGVQYXRoKSA9ICRpdGVtLT5mZXRjaFBhdGgoKTsKCWlmICgkcmV0KSB7CgkgICAgR2FsbGVyeUNvcmVBcGk6OnJlbGVhc2VMb2NrcygkbG9ja0lkcyk7CgkgICAgcmV0dXJuIGFycmF5KCRyZXQsIG51bGwsIG51bGwpOwoJfQoKCWlmICgoJGhhbmRsZSA9ICRwbGF0Zm9ybS0+Zm9wZW4oJGZpbGVQYXRoLCAnd2InKSkgPT09IGZhbHNlKSB7CgkgICAgR2FsbGVyeUNvcmVBcGk6OnJlbGVhc2VMb2NrcygkbG9ja0lkcyk7CgkgICAgcmV0dXJuIGFycmF5KEdhbGxlcnlDb3JlQXBpOjplcnJvcihFUlJPUl9QTEFURk9STV9GQUlMVVJFKSwgbnVsbCwgbnVsbCk7Cgl9CgoJLyogRm9ybWF0IFBVVCByZXNwb25zZSAqLwoJJHJldCA9IFdlYkRhdkhlbHBlcjo6cHV0UmVzcG9uc2VIZWxwZXIoJHdlYkRhdk9wdGlvbnMsICRoYW5kbGUpOwoJaWYgKCRyZXQpIHsKCSAgICBHYWxsZXJ5Q29yZUFwaTo6cmVsZWFzZUxvY2tzKCRsb2NrSWRzKTsKCSAgICByZXR1cm4gYXJyYXkoJHJldCwgbnVsbCwgbnVsbCk7Cgl9CgoJLyogR2V0IGEgbmV3IGl0ZW0gYnkgbWltZSB0eXBlICovCglsaXN0ICgkcmV0LCAkbmV3SXRlbSkgPSBHYWxsZXJ5Q29yZUFwaTo6bmV3SXRlbUJ5TWltZVR5cGUoJG1pbWVUeXBlKTsKCWlmICgkcmV0KSB7CgkgICAgR2FsbGVyeUNvcmVBcGk6OnJlbGVhc2VMb2NrcygkbG9ja0lkcyk7CgkgICAgcmV0dXJuIGFycmF5KCRyZXQsIG51bGwsIG51bGwpOwoJfQoJaWYgKCFpc3NldCgkbmV3SXRlbSkpIHsKCSAgICBHYWxsZXJ5Q29yZUFwaTo6cmVsZWFzZUxvY2tzKCRsb2NrSWRzKTsKCSAgICByZXR1cm4gYXJyYXkoR2FsbGVyeUNvcmVBcGk6OmVycm9yKEVSUk9SX01JU1NJTkdfT0JKRUNULCBfX0ZJTEVfXywgX19MSU5FX18sCgkJJ0ZhaWxlZCB0byBnZXQgbmV3IGl0ZW0gYnkgbWltZSB0eXBlOiAnIC4gJG1pbWVUeXBlKSwgbnVsbCwgbnVsbCk7Cgl9CgoJJHJldCA9ICRuZXdJdGVtLT5jcmVhdGUoJHBhcmVudEl0ZW0tPmdldElkKCksICRmaWxlUGF0aCwgJG1pbWVUeXBlKTsKCWlmICgkcmV0KSB7CgkgICAgR2FsbGVyeUNvcmVBcGk6OnJlbGVhc2VMb2NrcygkbG9ja0lkcyk7CgkgICAgcmV0dXJuIGFycmF5KCRyZXQsIG51bGwsIG51bGwpOwoJfQoKCS8qIE1ha2UgdGhlIG5ldyBpdGVtIGFzIGNsb3NlIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgaXRlbSBhcyBwb3NzaWJsZSAqLwoJbGlzdCAoJHJldCwgJG5ld0l0ZW0pID0gV2ViRGF2SGVscGVyOjptaXJyb3JFbnRpdHkoJGl0ZW0sICRuZXdJdGVtKTsKCWlmICgkcmV0KSB7CgkgICAgR2FsbGVyeUNvcmVBcGk6OnJlbGVhc2VMb2NrcygkbG9ja0lkcyk7CgkgICAgcmV0dXJuIGFycmF5KCRyZXQsIG51bGwsIG51bGwpOwoJfQoKCS8qIEZhbGwgYmFjayBvbiBhbiB1bmtub3duIGl0ZW0gaWYgdGhlIG5ldyBjbGFzcyBkb2Vzbid0IHN1cHBvcnQgdGhlIGZpbGUgY29udGVudCAqLwoJJHJldCA9ICRuZXdJdGVtLT5yZXNjYW4oKTsKCWlmICgkcmV0KSB7CgkgICAgaWYgKCEoJHJldC0+Z2V0RXJyb3JDb2RlKCkgJiBFUlJPUl9CQURfREFUQV9UWVBFKSkgewoJCUdhbGxlcnlDb3JlQXBpOjpyZWxlYXNlTG9ja3MoJGxvY2tJZHMpOwoJCXJldHVybiBhcnJheSgkcmV0LCBudWxsLCBudWxsKTsKCSAgICB9CgoJICAgICRnYWxsZXJ5LT5kZWJ1ZygnRXJyb3IgaW4gSXRlbUVkaXRXZWJEYXY6OmhhbmRsZVJlcXVlc3Q6ICcgLiAkbmV3SXRlbS0+Z2V0Q2xhc3NOYW1lKCkKCQkuICcgZG9lc25cJ3Qgc3VwcG9ydCB0aGUgZmlsZSBjb250ZW50LiAgRmFsbGluZyBiYWNrIG9uIGFuIHVua25vd24gaXRlbS4nKTsKCgkgICAgbGlzdCAoJHJldCwgJG5ld0l0ZW0pID0gR2FsbGVyeUNvcmVBcGk6Om5ld0ZhY3RvcnlJbnN0YW5jZUJ5SWQoJ0dhbGxlcnlFbnRpdHknLAoJCSdHYWxsZXJ5VW5rbm93bkl0ZW0nKTsKCSAgICBpZiAoJHJldCkgewoJCUdhbGxlcnlDb3JlQXBpOjpyZWxlYXNlTG9ja3MoJGxvY2tJZHMpOwoJCXJldHVybiBhcnJheSgkcmV0LCBudWxsLCBudWxsKTsKCSAgICB9CgkgICAgaWYgKCFpc3NldCgkbmV3SXRlbSkpIHsKCQlHYWxsZXJ5Q29yZUFwaTo6cmVsZWFzZUxvY2tzKCRsb2NrSWRzKTsKCQlyZXR1cm4gYXJyYXkoR2FsbGVyeUNvcmVBcGk6OmVycm9yKEVSUk9SX01JU1NJTkdfT0JKRUNULCBfX0ZJTEVfXywgX19MSU5FX18sCgkJICAgICdGYWlsZWQgdG8gZ2V0IEdhbGxlcnlVbmtub3duSXRlbSBpbnN0YW5jZScpLCBudWxsLCBudWxsKTsKCSAgICB9CgoJICAgICRyZXQgPSAkbmV3SXRlbS0+Y3JlYXRlKCRwYXJlbnRJdGVtLT5nZXRJZCgpLCAkZmlsZVBhdGgsICRtaW1lVHlwZSk7CgkgICAgaWYgKCRyZXQpIHsKCQlHYWxsZXJ5Q29yZUFwaTo6cmVsZWFzZUxvY2tzKCRsb2NrSWRzKTsKCQlyZXR1cm4gYXJyYXkoJHJldCwgbnVsbCwgbnVsbCk7CgkgICAgfQoKCSAgICAvKiBNYWtlIHRoZSBuZXcgaXRlbSBhcyBjbG9zZSBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIGl0ZW0gYXMgcG9zc2libGUgKi8KCSAgICBsaXN0ICgkcmV0LCAkbmV3SXRlbSkgPSBXZWJEYXZIZWxwZXI6Om1pcnJvckVudGl0eSgkaXRlbSwgJG5ld0l0ZW0pOwoJICAgIGlmICgkcmV0KSB7CgkJR2FsbGVyeUNvcmVBcGk6OnJlbGVhc2VMb2NrcygkbG9ja0lkcyk7CgkJcmV0dXJuIGFycmF5KCRyZXQsIG51bGwsIG51bGwpOwoJICAgIH0KCgkgICAgJHJldCA9ICRuZXdJdGVtLT5yZXNjYW4oKTsKCSAgICBpZiAoJHJldCkgewoJCUdhbGxlcnlDb3JlQXBpOjpyZWxlYXNlTG9ja3MoJGxvY2tJZHMpOwoJCXJldHVybiBhcnJheSgkcmV0LCBudWxsLCBudWxsKTsKCSAgICB9Cgl9CgoJLyogRm9sbG93IHBhdHRlcm4gZnJvbSBJdGVtQWRkV2ViQ2FtICovCgkkdG1wRGlyID0gJGdhbGxlcnktPmdldENvbmZpZygnZGF0YS5nYWxsZXJ5LnRtcCcpOwoJJHRtcEZpbGUgPSAkcGxhdGZvcm0tPnRlbXBuYW0oJHRtcERpciwgJ3dlYmRhdicpOwoKCS8qIEJhY2t1cCB0aGUgZmlsZSBjb250ZW50ICovCglpZiAoISRwbGF0Zm9ybS0+Y29weSgkZmlsZVBhdGgsICR0bXBGaWxlKSkgewoJICAgIEdhbGxlcnlDb3JlQXBpOjpyZWxlYXNlTG9ja3MoJGxvY2tJZHMpOwoJICAgIHJldHVybiBhcnJheShHYWxsZXJ5Q29yZUFwaTo6ZXJyb3IoRVJST1JfUExBVEZPUk1fRkFJTFVSRSksIG51bGwsIG51bGwpOwoJfQoKCSRyZXQgPSAkaXRlbS0+ZGVsZXRlKCk7CglpZiAoJHJldCkgewoJICAgIEAkcGxhdGZvcm0tPnVubGluaygkdG1wRmlsZSk7CgkgICAgR2FsbGVyeUNvcmVBcGk6OnJlbGVhc2VMb2NrcygkbG9ja0lkcyk7CgkgICAgcmV0dXJuIGFycmF5KCRyZXQsIG51bGwsIG51bGwpOwoJfQoKCS8qCgkgKiBSZXN0b3JlIHRoZSBmaWxlIGNvbnRlbnQuICBJZiB0aGlzIGZhaWxzLCB3ZSByb2xsYmFjayB0aGUgZGF0YWJhc2UgdHJhbnNhY3Rpb24gYnV0IHRoZQoJICogZmlsZSBjb250ZW50IGlzIG1pc3NpbmcuCgkgKi8KCWlmICghJHBsYXRmb3JtLT5jb3B5KCR0bXBGaWxlLCAkZmlsZVBhdGgpKSB7CgkgICAgQCRwbGF0Zm9ybS0+dW5saW5rKCR0bXBGaWxlKTsKCSAgICBHYWxsZXJ5Q29yZUFwaTo6cmVsZWFzZUxvY2tzKCRsb2NrSWRzKTsKCSAgICByZXR1cm4gYXJyYXkoR2FsbGVyeUNvcmVBcGk6OmVycm9yKEVSUk9SX1BMQVRGT1JNX0ZBSUxVUkUpLCBudWxsLCBudWxsKTsKCX0KCUAkcGxhdGZvcm0tPnVubGluaygkdG1wRmlsZSk7CgoJJG5ld0l0ZW0tPnNldFBlcnNpc3RlbnRGbGFnKFNUT1JBR0VfRkxBR19ORVdMWV9DUkVBVEVEKTsKCSRyZXQgPSAkbmV3SXRlbS0+c2F2ZSgpOwoJaWYgKCRyZXQpIHsKCSAgICBHYWxsZXJ5Q29yZUFwaTo6cmVsZWFzZUxvY2tzKCRsb2NrSWRzKTsKCSAgICByZXR1cm4gYXJyYXkoJHJldCwgbnVsbCwgbnVsbCk7Cgl9CgoJJHJldCA9IEdhbGxlcnlDb3JlQXBpOjphZGRFeGlzdGluZ0l0ZW1Ub0FsYnVtKCRuZXdJdGVtLCAkcGFyZW50SXRlbS0+Z2V0SWQoKSwgdHJ1ZSk7CglpZiAoJHJldCkgewoJICAgIEdhbGxlcnlDb3JlQXBpOjpyZWxlYXNlTG9ja3MoJGxvY2tJZHMpOwoJICAgIHJldHVybiBhcnJheSgkcmV0LCBudWxsLCBudWxsKTsKCX0KCgkkcmV0ID0gR2FsbGVyeUNvcmVBcGk6OnJlbGVhc2VMb2NrcygkbG9ja0lkcyk7CglpZiAoJHJldCkgewoJICAgIHJldHVybiBhcnJheSgkcmV0LCBudWxsLCBudWxsKTsKCX0KCglyZXR1cm4gYXJyYXkobnVsbCwgYXJyYXkoKSwgYXJyYXkoCgkgICAgJ2FkZGVkRmlsZXMnID0+IGFycmF5KGFycmF5KCdmaWxlTmFtZScgPT4gYmFzZW5hbWUoJHBhdGgpLAoJCQkJCSdpZCcgPT4gJG5ld0l0ZW0tPmdldElkKCkpKSkpOwogICAgfQoKICAgIC8qKgogICAgICogQHNlZSBJdGVtQWRkUGx1Z2luOjpsb2FkVGVtcGxhdGUKICAgICAqLwogICAgZnVuY3Rpb24gbG9hZFRlbXBsYXRlKCYkdGVtcGxhdGUsICYkZm9ybSwgJGl0ZW0pIHsKCXJldHVybiBhcnJheShudWxsLCAnbW9kdWxlcy93ZWJkYXYvdGVtcGxhdGVzL0l0ZW1BZGRXZWJEYXYudHBsJywgbnVsbCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAc2VlIEl0ZW1BZGRQbHVnaW46OmdldFRpdGxlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFRpdGxlKCkgewoJbGlzdCAoJHJldCwgJG1vZHVsZSkgPSBHYWxsZXJ5Q29yZUFwaTo6bG9hZFBsdWdpbignbW9kdWxlJywgJ3dlYmRhdicpOwoJaWYgKCRyZXQpIHsKCSAgICByZXR1cm4gYXJyYXkoJHJldCwgbnVsbCk7Cgl9CgoJcmV0dXJuIGFycmF5KG51bGwsICRtb2R1bGUtPnRyYW5zbGF0ZSgnV2ViREFWJykpOwogICAgfQp9Cj8+Cg==');
expand_6421a0d81d($outputDir, 'MANIFEST', 'IyAkUmV2aXNpb246IDE2NTEzICQKIyBGaWxlIGNyYzMyIGNyYzMyKGNybGYpIHNpemUgc2l6ZShjcmxmKSAgb3IgIFIgRmlsZQptb2R1bGVzL3dlYmRhdi9DYWxsYmFja3MuaW5jCTIzNTg4MTQ2NjMJMzQ1MzgyNTU2NQkxNDM5CTE0ODYKbW9kdWxlcy93ZWJkYXYvRG93bmxvYWREYXZNb3VudC5pbmMJOTI2MDk5MzY1CTE1NzM2NzQxMTYJMjc4NgkyODc4Cm1vZHVsZXMvd2ViZGF2L0l0ZW1BZGRXZWJEYXYuaW5jCTI1MjM4ODE2MjIJODQxMzM0MDc4CTEwNzgzCTExMTE2Cm1vZHVsZXMvd2ViZGF2L1dlYkRhdi5pbmMJMjk2MTM3Mjc3CTI5MTY4MTI5NTcJNzYxNAk3ODQxCm1vZHVsZXMvd2ViZGF2L1dlYkRhdk1vdW50LmluYwkxODM4NjIxNjkyCTI4MDU3NDAwNDYJMTU4NwkxNjM2Cm1vZHVsZXMvd2ViZGF2L1dlYkRhdlNpdGVBZG1pbi5pbmMJNTUzOTYwMTIyCTIyOTExNDQyMDcJMTY5OAkxNzUyCm1vZHVsZXMvd2ViZGF2L1dlYkRhdldvcmtzLmluYwkyNTc0Njk2ODA3CTM2MjE5MDYwMDIJMTMwOAkxMzUyCm1vZHVsZXMvd2ViZGF2L2NsYXNzZXMvR05VbWFrZWZpbGUJMTk5NTM2NjgxOQk4NDMwMjU2MzkJNTEJNTIKbW9kdWxlcy93ZWJkYXYvY2xhc3Nlcy9HYWxsZXJ5U3RvcmFnZS9HTlVtYWtlZmlsZQkxNDY1Nzc2NzgyCTIwMDkxNjI2MzMJNjEJNjIKbW9kdWxlcy93ZWJkYXYvY2xhc3Nlcy9HYWxsZXJ5U3RvcmFnZS9zY2hlbWEudHBsCTMzNjE0NzgxNzAJMTM4MTA2NDM2NAkyMjQxCTIzMjMKbW9kdWxlcy93ZWJkYXYvY2xhc3Nlcy9NYXBzLmluYwkzMDk3OTY5MDQxCTI0NTg2ODM1MjIJNTgwCTU4NAptb2R1bGVzL3dlYmRhdi9jbGFzc2VzL01hcHMueG1sCTM4OTQ0OTA2OQkxOTMwNDkzNTEyCTEwNDkJMTA4Nwptb2R1bGVzL3dlYmRhdi9jbGFzc2VzL1dlYkRhdkhlbHBlci5jbGFzcwk5NTI0NTA1OTkJNDcyMzg1NTUzCTU5OTA2CTYxOTAxCm1vZHVsZXMvd2ViZGF2L2NsYXNzZXMvV2ViRGF2UmV3cml0ZUhlbHBlci5jbGFzcwkxMDc1MjkwMjQJMjczMTcyMjczNwkyNDM0CTI1MTIKbW9kdWxlcy93ZWJkYXYvZGF0YS9vcHRpb25zLy5odGFjY2VzcwkxMTQyMTE2MzM3CTM1MDY1NDkwOQkxMzE2CTEzNDUKbW9kdWxlcy93ZWJkYXYvbGliL0hUVFAvV2ViREFWL1NlcnZlci5waHAJMjQ2MTYxMzU5Mwk5MzMzOTU2ODkJNzQ3NjEJNzczMDUKbW9kdWxlcy93ZWJkYXYvbGliL0hUVFAvV2ViREFWL1Rvb2xzL19wYXJzZV9sb2NraW5mby5waHAJMTE1ODcxNzEJMTQwOTQ4MDk5CTYyMTMJNjQ0Mgptb2R1bGVzL3dlYmRhdi9saWIvSFRUUC9XZWJEQVYvVG9vbHMvX3BhcnNlX3Byb3BmaW5kLnBocAkyMzk3MTg2OTYwCTE0OTkzMDcxNjMJNDU3NAk0NzM3Cm1vZHVsZXMvd2ViZGF2L2xpYi9IVFRQL1dlYkRBVi9Ub29scy9fcGFyc2VfcHJvcHBhdGNoLnBocAkzNDIyOTc0MzYzCTEyMzk3NDI0MTUJNTY4OAk1OTA0Cm1vZHVsZXMvd2ViZGF2L21vZHVsZS5pbmMJNzc1NTU1NzUJMjM1NTQzOTYxMwkxMTQ2MgkxMTg0OAptb2R1bGVzL3dlYmRhdi90ZW1wbGF0ZXMvSXRlbUFkZFdlYkRhdi50cGwJMTM1Mzk2NTg2NgkxMDc5OTc0MDk4CTM4NwkzOTYKbW9kdWxlcy93ZWJkYXYvdGVtcGxhdGVzL1dlYkRhdk1vdW50LnRwbAkyMDU3NzI3MTA0CTMyNjMzMjY2MTQJMTY3OAkxNzE5Cm1vZHVsZXMvd2ViZGF2L3RlbXBsYXRlcy9XZWJEYXZTaXRlQWRtaW4udHBsCTE4ODg2NTY3NjMJMzg5MjY1NjA0Nwk4NDg1CTg2MjYKbW9kdWxlcy93ZWJkYXYvdGVtcGxhdGVzL2Jsb2Nrcy9XZWJEYXZVcmwudHBsCTIzNTY2NTM3MDEJNDA4MjA5MzY0Ngk0MzAJNDQwCm1vZHVsZXMvd2ViZGF2L3RlbXBsYXRlcy9ibG9ja3MvYmxvY2tzLmluYwk3NDAzNTg5NDQJODI2NTQzNDMwCTEwMgkxMDcK');
expand_6421a0d81d($outputDir, 'WebDav.inc', 'PD9waHAKLyoKICogR2FsbGVyeSAtIGEgd2ViIGJhc2VkIHBob3RvIGFsYnVtIHZpZXdlciBhbmQgZWRpdG9yCiAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA3IEJoYXJhdCBNZWRpcmF0dGEKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CiAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAogKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KICovCgpHYWxsZXJ5Q29yZUFwaTo6cmVxdWlyZU9uY2UoJ21vZHVsZXMvY29yZS9JdGVtQWRkLmluYycpOwpHYWxsZXJ5Q29yZUFwaTo6cmVxdWlyZU9uY2UoJ21vZHVsZXMvd2ViZGF2L2NsYXNzZXMvV2ViRGF2SGVscGVyLmNsYXNzJyk7CgovKioKICogVGhlIFdlYkRBViBjb250cm9sbGVyIGhhbmRsZXMgYWxsIFdlYkRBViByZXF1ZXN0cy4KICogQHBhY2thZ2UgV2ViRGF2CiAqIEBzdWJwYWNrYWdlIFVzZXJJbnRlcmZhY2UKICogQGF1dGhvciBKYWNrIEJhdGVzIDxtczQxOUBmcmVlem9uZS5jby51az4KICogQHZlcnNpb24gJFJldmlzaW9uOiAxNTkzMSAkCiAqLwpjbGFzcyBXZWJEYXZDb250cm9sbGVyIGV4dGVuZHMgR2FsbGVyeUNvbnRyb2xsZXIgewoKICAgIC8qKgogICAgICogQHNlZSBHYWxsZXJ5Q29udHJvbGxlcjo6aGFuZGxlUmVxdWVzdAogICAgICovCiAgICBmdW5jdGlvbiBoYW5kbGVSZXF1ZXN0KCRmb3JtKSB7CglnbG9iYWwgJGdhbGxlcnk7CgkkcGxhdGZvcm0gPSYgJGdhbGxlcnktPmdldFBsYXRmb3JtKCk7CgoJLyoKCSAqIFN1cHByZXNzIGdlbmVyYXRpbmcgSFRNTCBlcnJvciBwYWdlcyBmb3IgV2ViREFWIGNsaWVudHMuICBFeHBsb2l0IHRoZSBmYWN0IHRoYXQgZXZlbnQKCSAqIGxpc3RlbmVycyBhcmVuJ3QgY3VycmVudGx5IHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UsIHNvIHRoaXMgZXZlbnQgbGlzdGVuZXIgaXMgb25seQoJICogcmVnaXN0ZXJlZCBmb3IgdGhpcyByZXF1ZXN0LiAgU2luY2UgdGhpcyBpcyB0aGUgV2ViREFWIGNvbnRyb2xsZXIsIHdlIGtub3cgaXQgaXMgYSBXZWJEQVYKCSAqIHJlcXVlc3QuCgkgKi8KCSRyZXQgPSBHYWxsZXJ5Q29yZUFwaTo6cmVnaXN0ZXJFdmVudExpc3RlbmVyKCdHYWxsZXJ5OjpFcnJvcicsIG5ldyBXZWJEYXZNb2R1bGUoKSwgdHJ1ZSk7CglpZiAoJHJldCkgewoJICAgIHJldHVybiBhcnJheSgkcmV0LCBudWxsKTsKCX0KCgkvKgoJICogV2luZG93cyBXZWIgRm9sZGVycyBkb2VzIG5vdCByZXNwZWN0IEhUVFAgYXV0aCByZXF1ZXN0cyBpbiBQVVQgcmVzcG9uc2VzLCBzbyB0aGUgdXNlcgoJICogd2lsbCBub3QgYmUgcHJvbXB0ZWQgdG8gbG9naW4uICBUbyB3b3JrIGFyb3VuZCB0aGlzLCByZXF1ZXN0IEhUVFAgYXV0aCBpbiBhbGwgcmVzcG9uc2VzCgkgKiB0byBhbm9ueW1vdXMgV2luZG93cyBXZWIgRm9sZGVycyByZXF1ZXN0cy4gIENvbnNlcXVlbnRseSBhbm9ueW1vdXMgdXNlcnMgY2FuJ3QgY29ubmVjdCB0bwoJICogV2ViREFWIHdpdGggV2luZG93cyBXZWIgRm9sZGVycy4KCSAqLwoJJHVzZXJBZ2VudCA9IEdhbGxlcnlVdGlsaXRpZXM6OmdldFNlcnZlclZhcignSFRUUF9VU0VSX0FHRU5UJyk7CglpZiAoc3RycG9zKCR1c2VyQWdlbnQsICdNaWNyb3NvZnQgRGF0YSBBY2Nlc3MgSW50ZXJuZXQgUHVibGlzaGluZyBQcm92aWRlciBEQVYnKSAhPT0gZmFsc2UKCQl8fCBzdHJwb3MoJHVzZXJBZ2VudCwgJ01pY3Jvc29mdC1XZWJEQVYtTWluaVJlZGlyJykgIT09IGZhbHNlKSB7CgkgICAgbGlzdCAoJHJldCwgJGlzQW5vbnltb3VzKSA9IEdhbGxlcnlDb3JlQXBpOjppc0Fub255bW91c1VzZXIoKTsKCSAgICBpZiAoJHJldCkgewoJCXJldHVybiBhcnJheSgkcmV0LCBudWxsKTsKIAkgICAgfQoJICAgIGlmICgkaXNBbm9ueW1vdXMpIHsKCQlyZXR1cm4gYXJyYXkoR2FsbGVyeUNvcmVBcGk6OmVycm9yKEVSUk9SX1BFUk1JU1NJT05fREVOSUVELCBfX0ZJTEVfXywgX19MSU5FX18sCgkJCSdXZWJEQVY6IEFub255bW91cyByZXF1ZXN0IGJ5IE1TIFdpbmRvd3MgV2ViZm9sZGVycyBXZWJEQVYgY2xpZW50IGRldGVjdGVkLicKCQkJLiAnICBVc2FiaWxpdHkgd29ya2Fyb3VuZDogUmVxdWlyZSBhdXRoIG9uIGFsbCByZXF1ZXN0cy4nKSwgbnVsbCk7CgkgICAgfQoJfQoKCS8qCgkgKiBHYWxsZXJ5Q29yZUFwaTo6YWRkSXRlbVRvQWxidW0gbm9ybWFsaXplcyBwYXRoIGNvbXBvbmVudHMgYnV0CgkgKiBHYWxsZXJ5Q29yZUFwaTo6ZmV0Y2hJdGVtSWRCeVBhdGggZG9lcyBub3QuICBUaGlzIGlzIGEgcHJvYmxlbSBmb3IgV2ViREFWIGJlY2F1c2UgR0VUCgkgKiBmb2xsb3dpbmcgYSBzdWNjZXNzZnVsIFBVVCBhdCB0aGUgc2FtZSBVUkwgc2hvdWxkIHN1Y2NlZWQuCgkgKgoJICogQW4gYWx0ZXJuYXRpdmUgaXMgdG8gY29uc2lzdGFudGx5IG5vcm1hbGl6ZSBhbGwgcmVxdWVzdHMuICBXaGlsZSB0aGlzIHNob3VsZG4ndCBicmVhayBhbnkKCSAqIGNsaWVudHMsIFBST1BGSU5EIGZvbGxvd2luZyBhIHN1Y2Nlc3NmdWwgUFVUIHNob3VsZCBzdHJpY3RseSBpbmNsdWRlIHRoZSBVUkwgb2YgdGhlIFBVVC4KCSAqCgkgKiBDb25zZXF1ZW50bHkgd2UgcmVqZWN0IGFuIGlsbGVnYWwgcGF0aCBjb21wb25lbnQuCgkgKgoJICogVGhpcyBjb25kaXRpb24gbWF5IGJlIHJlbGF4ZWQgaW4gZnV0dXJlIGlmIGl0J3MgYSBwcm9ibGVtLgoJICovCgkkcGF0aCA9IEdhbGxlcnlVdGlsaXRpZXM6OmdldFJlcXVlc3RWYXJpYWJsZXMoJ3BhdGgnKTsKCS8qKgogCSAqIEB0b2RvIFJlZmFjdG9yIHRvd2FyZHMgYSBjbGVhbmVyIGFwcHJvYWNoLCBlLmcuIHVzaW5nIGEgbWFwIGZvciBwdWJsaWMgcGF0aHMuCiAJICovCiAJR2FsbGVyeVV0aWxpdGllczo6cHV0UmVxdWVzdFZhcmlhYmxlKCdvcmlnaW5hbFBhdGgnLCAkcGF0aCk7CgkkcGF0aENvbXBvbmVudCA9IGJhc2VuYW1lKCRwYXRoKTsKCgkvKiBTcGVjaWFsIGNhc2UgdG8gc3VwcHJlc3MgTWFjICcuXycgZmlsZXMuICBJZ25vcmUgcmVxdWVzdCBidXQgcmV0dXJuIHN1Y2Nlc3MuICovCglpZiAoIXN0cm5jbXAoJHBhdGhDb21wb25lbnQsICcuXycsIDIpKSB7CgkgICAgV2ViRGF2U2VydmVyOjpzZXRSZXNwb25zZVN0YXR1cygnMjAwIE9LJyk7CgkgICAgJGhhbmRsZSA9IFdlYkRhdlNlcnZlcjo6b3BlblJlcXVlc3RCb2R5KCk7CgkgICAgd2hpbGUgKCFmZW9mKCRoYW5kbGUpKSB7CgkJZmdldHMoJGhhbmRsZSk7CgkgICAgfQoJICAgIHJldHVybiBhcnJheShHYWxsZXJ5Q29yZUFwaTo6ZXJyb3IoRVJST1JfQkFEX1BBVEgpLCBudWxsKTsKCX0KCiAJLyogU2lsZW50bHkgbGVnYWxpemUgcGF0aCBjb21wb25lbnQgKi8KIAkkcGF0aENvbXBvbmVudHMgPSBwcmVnX3NwbGl0KCcvXC8vJywgJHBhdGgsIC0xLCBQUkVHX1NQTElUX05PX0VNUFRZKTsKIAlmb3JlYWNoICgkcGF0aENvbXBvbmVudHMgYXMgJGtleSA9PiAkcGF0aENvbXBvbmVudCkgewogCSAgICAkcGF0aENvbXBvbmVudHNbJGtleV0gPSAkcGxhdGZvcm0tPmxlZ2FsaXplUGF0aENvbXBvbmVudCgkcGF0aENvbXBvbmVudCk7CiAJfQogCSRwYXRoID0gaW1wbG9kZSgnLycsICRwYXRoQ29tcG9uZW50cyk7CiAJR2FsbGVyeVV0aWxpdGllczo6cHV0UmVxdWVzdFZhcmlhYmxlKCdwYXRoJywgJHBhdGgpOwoKCSRyZXF1ZXN0TWV0aG9kID0gR2FsbGVyeVV0aWxpdGllczo6c3RyVG9Mb3dlcigKCSAgICBHYWxsZXJ5VXRpbGl0aWVzOjpnZXRTZXJ2ZXJWYXIoJ1JFUVVFU1RfTUVUSE9EJykpOwoJaWYgKCRyZXF1ZXN0TWV0aG9kID09ICdnZXQnIHx8ICRyZXF1ZXN0TWV0aG9kID09ICdoZWFkJykgewoJICAgIGlmIChlbXB0eSgkcGF0aCkpIHsKCQlsaXN0ICgkcmV0LCAkaXRlbUlkKSA9IEdhbGxlcnlDb3JlQXBpOjpnZXREZWZhdWx0QWxidW1JZCgpOwoJCWlmICgkcmV0KSB7CgkJICAgIHJldHVybiBhcnJheSgkcmV0LCBudWxsKTsKCQl9CgkgICAgfSBlbHNlIHsKCQlsaXN0ICgkcmV0LCAkaXRlbUlkKSA9IEdhbGxlcnlDb3JlQXBpOjpmZXRjaEl0ZW1JZEJ5UGF0aCgkcGF0aCk7CgkJaWYgKCRyZXQpIHsKCQkgICAgcmV0dXJuIGFycmF5KCRyZXQsIG51bGwpOwoJCX0KCSAgICB9CgoJICAgIGxpc3QgKCRyZXQsICRpdGVtKSA9IEdhbGxlcnlDb3JlQXBpOjpsb2FkRW50aXRpZXNCeUlkKCRpdGVtSWQpOwoJICAgIGlmICgkcmV0KSB7CgkJcmV0dXJuIGFycmF5KCRyZXQsIG51bGwpOwoJICAgIH0KCgkgICAgLyogVW50aWwgdGhlcmUncyBhIGJldHRlciB3YXkgdG8gZGVsZWdhdGUgdG8gU2hvdy9Eb3dubG9hZEl0ZW0gKi8KCSAgICBHYWxsZXJ5VXRpbGl0aWVzOjpwdXRSZXF1ZXN0VmFyaWFibGUoJ2l0ZW1JZCcsICRpdGVtSWQpOwoJICAgIGlmIChHYWxsZXJ5VXRpbGl0aWVzOjppc0EoJGl0ZW0sICdHYWxsZXJ5QWxidW1JdGVtJykpIHsKCQlyZXR1cm4gYXJyYXkobnVsbCwgYXJyYXkoJ2RlbGVnYXRlJyA9PiBhcnJheSgndmlldycgPT4gJ2NvcmUuU2hvd0l0ZW0nKSwKCQkJCQkgJ3N0YXR1cycgPT4gYXJyYXkoKSwKCQkJCQkgJ2Vycm9yJyA9PiBhcnJheSgpKSk7CgkgICAgfQoKCSAgICByZXR1cm4gYXJyYXkobnVsbCwgYXJyYXkoJ2RlbGVnYXRlJyA9PiBhcnJheSgndmlldycgPT4gJ2NvcmUuRG93bmxvYWRJdGVtJyksCgkJCQkgICAgICdzdGF0dXMnID0+IGFycmF5KCksCgkJCQkgICAgICdlcnJvcicgPT4gYXJyYXkoKSkpOwoJfSBlbHNlIGlmICgkcmVxdWVzdE1ldGhvZCA9PSAncHV0JykgewoJICAgIGxpc3QgKCRyZXQsICRwYXJlbnRJZCkgPSBXZWJEYXZIZWxwZXI6OmdldFBhcmVudEl0ZW1JZEJ5UGF0aCgkcGF0aCk7CgkgICAgaWYgKCRyZXQpIHsKCQlpZiAoJHJldC0+Z2V0RXJyb3JDb2RlKCkgJiBFUlJPUl9NSVNTSU5HX09CSkVDVCkgewoJCSAgICAvKgoJCSAgICAgKiBBIFBVVCB0aGF0IHdvdWxkIHJlc3VsdCBpbiB0aGUgY3JlYXRpb24gb2YgYSByZXNvdXJjZSB3aXRob3V0IGFuCgkJICAgICAqIGFwcHJvcHJpYXRlbHkgc2NvcGVkIHBhcmVudCBjb2xsZWN0aW9uIE1VU1QgZmFpbCB3aXRoIGEgNDA5CgkJICAgICAqIChDb25mbGljdCkuCgkJICAgICAqLwoJCSAgICBXZWJEYXZTZXJ2ZXI6OnNldFJlc3BvbnNlU3RhdHVzKCc0MDkgQ29uZmxpY3QnKTsKCQl9CgoJCXJldHVybiBhcnJheSgkcmV0LCBudWxsKTsKCSAgICB9CgoJICAgIC8qIFVudGlsIHRoZXJlJ3MgYSBiZXR0ZXIgd2F5IHRvIGRlbGVnYXRlIHRvIEl0ZW1BZGQgKi8KCSAgICBHYWxsZXJ5VXRpbGl0aWVzOjpwdXRSZXF1ZXN0VmFyaWFibGUoJ2l0ZW1JZCcsICRwYXJlbnRJZCk7CgkgICAgR2FsbGVyeVV0aWxpdGllczo6cHV0UmVxdWVzdFZhcmlhYmxlKCdhZGRQbHVnaW4nLCAnSXRlbUFkZFdlYkRhdicpOwoJICAgIC8qIExldCB0aGUgSXRlbUFkZFBsdWdpbiBoYW5kbGUgdGhlIHJlcGxhY2VtZW50IGZvciB0aGUgYXV0aC10b2tlbiBjaGVjayAqLwoJICAgIGxpc3QgKCRyZXQsICRkYXRhKSA9IEl0ZW1BZGRDb250cm9sbGVyOjpoYW5kbGVSZXF1ZXN0KCRmb3JtKTsKCSAgICBpZiAoJHJldCkgewoJCXJldHVybiBhcnJheSgkcmV0LCBudWxsKTsKCSAgICB9CgoJICAgIC8qCgkgICAgICogRG9uJ3Qgc2VuZCBIVFRQIHJlZGlyZWN0cyBvciBIVE1MIHN0YXR1cy9lcnJvciBiYWNrIHRvIERBViBjbGllbnRzIHNpbmNlIHdlCgkgICAgICogaGF2ZSBhbHJlYWR5IHNldCBvdXIgc3RhdHVzIGNvZGUuIEZhbGwgdGhyb3VnaCB0byB0aGUgc3RhbmRhcmQgZW1wdHkgcmV0dXJuLgoJICAgICAqLwoJfQoKCXJldHVybiBhcnJheShudWxsLCBhcnJheSgnZGVsZWdhdGUnID0+IGFycmF5KCd2aWV3JyA9PiAnd2ViZGF2LldlYkRhdicpLAoJCQkJICdzdGF0dXMnID0+IGFycmF5KCksCgkJCQkgJ2Vycm9yJyA9PiBhcnJheSgpKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAc2VlIEdhbGxlcnlDb250cm9sbGVyOjpvbWl0QXV0aFRva2VuQ2hlY2sKICAgICAqLwogICAgZnVuY3Rpb24gb21pdEF1dGhUb2tlbkNoZWNrKCkgewoJcmV0dXJuIHRydWU7CiAgICB9Cn0KCi8qKgogKiBUaGUgV2ViREFWIHZpZXcgZ2VuZXJhdGVzIFdlYkRBViByZXNwb25zZXMuCiAqLwpjbGFzcyBXZWJEYXZWaWV3IGV4dGVuZHMgR2FsbGVyeVZpZXcgewoKICAgIC8qKgogICAgICogQHNlZSBHYWxsZXJ5Vmlldzo6aXNJbW1lZGlhdGUKICAgICAqLwogICAgZnVuY3Rpb24gaXNJbW1lZGlhdGUoKSB7CglyZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIEBzZWUgR2FsbGVyeVZpZXc6OmlzQ29udHJvbGxlckxpa2UKICAgICAqLwogICAgZnVuY3Rpb24gaXNDb250cm9sbGVyTGlrZSgpIHsKCS8qIEFsdGhvdWdoIHRoaXMgdmlldyBpcyBjb250cm9sbGVyLWxpa2UsIHdlIHJldHVybiBmYWxzZSBzaW5jZSB3ZSBjYW4ndCBhZGQgYXV0aFRva2VucyAqLwoJcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogQHNlZSBHYWxsZXJ5Vmlldzo6cmVuZGVySW1tZWRpYXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlbmRlckltbWVkaWF0ZSgkc3RhdHVzLCAkZXJyb3IpIHsKCSRyZXF1ZXN0TWV0aG9kID0gR2FsbGVyeVV0aWxpdGllczo6c3RyVG9Mb3dlcigKCQlHYWxsZXJ5VXRpbGl0aWVzOjpnZXRTZXJ2ZXJWYXIoJ1JFUVVFU1RfTUVUSE9EJykpOwoJaWYgKCFpbl9hcnJheSgkcmVxdWVzdE1ldGhvZCwgYXJyYXkoJ29wdGlvbnMnLCAncHJvcGZpbmQnLCAncHJvcHBhdGNoJywgJ21rY29sJywgJ2RlbGV0ZScsCgkJCQkJICAgICdtb3ZlJywgJ2xvY2snLCAndW5sb2NrJykpKSB7CgoJICAgIC8qIElmIHdlIGp1c3QgY29tcGxldGVkIGEgUFVUIHJlcXVlc3QgYW5kIGdvdCBkZWxlZ2F0ZWQgaGVyZSwganVzdCBzaWxlbnRseSByZXR1cm4gKi8KCSAgICBpZiAoJHJlcXVlc3RNZXRob2QgPT0gJ3B1dCcpIHsKCQlyZXR1cm4gbnVsbDsKCSAgICB9CgoJICAgIHJldHVybiBHYWxsZXJ5Q29yZUFwaTo6ZXJyb3IoRVJST1JfVU5JTVBMRU1FTlRFRCk7Cgl9CgoJJHJldCA9IFdlYkRhdkhlbHBlcjo6JHJlcXVlc3RNZXRob2QoKTsKCWlmICgkcmV0KSB7CgkgICAgcmV0dXJuICRyZXQ7Cgl9CgoJcmV0dXJuIG51bGw7CiAgICB9Cn0KPz4K');
expand_6421a0d81d($outputDir, 'WebDavMount.inc', 'PD9waHAKLyoKICogR2FsbGVyeSAtIGEgd2ViIGJhc2VkIHBob3RvIGFsYnVtIHZpZXdlciBhbmQgZWRpdG9yCiAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA3IEJoYXJhdCBNZWRpcmF0dGEKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CiAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAogKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KICovCgovKioKICogU2hvdyBXZWJEQVYgbW91bnQgaW5zdHJ1Y3Rpb25zLgogKiBAcGFja2FnZSBXZWJEYXYKICogQHN1YnBhY2thZ2UgVXNlckludGVyZmFjZQogKiBAYXV0aG9yIEFuZHkgU3RhdWRhY2hlciA8YXN0QGdteC5jaD4KICogQHZlcnNpb24gJFJldmlzaW9uOiAxNTcwNCAkCiAqLwpjbGFzcyBXZWJEYXZNb3VudFZpZXcgZXh0ZW5kcyBHYWxsZXJ5VmlldyB7CiAgICAvKioKICAgICAqIEBzZWUgR2FsbGVyeVZpZXc6OmxvYWRUZW1wbGF0ZQogICAgICovCiAgICBmdW5jdGlvbiBsb2FkVGVtcGxhdGUoJiR0ZW1wbGF0ZSwgJiRmb3JtKSB7CgkkdGVtcGxhdGUtPnNldFZhcmlhYmxlKCdXZWJEYXZNb3VudCcsIGFycmF5KCdpc1ZpZXcnID0+IHRydWUpKTsKCXJldHVybiBhcnJheShudWxsLCBhcnJheSgnYm9keScgPT4gJ21vZHVsZXMvd2ViZGF2L3RlbXBsYXRlcy9XZWJEYXZNb3VudC50cGwnKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAc2VlIEdhbGxlcnlWaWV3OjpnZXRWaWV3RGVzY3JpcHRpb24KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0Vmlld0Rlc2NyaXB0aW9uKCkgewoJbGlzdCAoJHJldCwgJG1vZHVsZSkgPSBHYWxsZXJ5Q29yZUFwaTo6bG9hZFBsdWdpbignbW9kdWxlJywgJ3dlYmRhdicpOwoJaWYgKCRyZXQpIHsKCSAgICByZXR1cm4gYXJyYXkoJHJldCwgbnVsbCk7Cgl9CgoJcmV0dXJuIGFycmF5KG51bGwsICRtb2R1bGUtPnRyYW5zbGF0ZSgnTW91bnQgd2l0aCBXZWJEQVYnKSk7CiAgICB9Cn0KPz4K');
expand_6421a0d81d($outputDir, 'WebDavSiteAdmin.inc', 'PD9waHAKLyoKICogR2FsbGVyeSAtIGEgd2ViIGJhc2VkIHBob3RvIGFsYnVtIHZpZXdlciBhbmQgZWRpdG9yCiAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA3IEJoYXJhdCBNZWRpcmF0dGEKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CiAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAogKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KICovCgpHYWxsZXJ5Q29yZUFwaTo6cmVxdWlyZU9uY2UoJ21vZHVsZXMvd2ViZGF2L2NsYXNzZXMvV2ViRGF2SGVscGVyLmNsYXNzJyk7CgovKioKICogU2hvdyBjb25maWd1cmF0aW9uIHdhcm5pbmdzIGFuZCBzZXR0aW5ncyB0byBzaXRlIGFkbWlucy4KICogQHBhY2thZ2UgV2ViRGF2CiAqIEBzdWJwYWNrYWdlIFVzZXJJbnRlcmZhY2UKICogQGF1dGhvciBKYWNrIEJhdGVzIDxtczQxOUBmcmVlem9uZS5jby51az4KICogQHZlcnNpb24gJFJldmlzaW9uOiAxNTU5NCAkCiAqLwpjbGFzcyBXZWJEYXZTaXRlQWRtaW5WaWV3IGV4dGVuZHMgR2FsbGVyeVZpZXcgewoKICAgIC8qKgogICAgICogQHNlZSBHYWxsZXJ5Vmlldzo6bG9hZFRlbXBsYXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGxvYWRUZW1wbGF0ZSgmJHRlbXBsYXRlLCAmJGZvcm0pIHsKCSRyZXQgPSBHYWxsZXJ5Q29yZUFwaTo6YXNzZXJ0VXNlcklzU2l0ZUFkbWluaXN0cmF0b3IoKTsKCWlmICgkcmV0KSB7CgkgICAgcmV0dXJuIGFycmF5KCRyZXQsIG51bGwpOwoJfQoKCSRXZWJEYXZTaXRlQWRtaW4gPSBhcnJheSgpOwoKCWxpc3QgKCRyZXQsICRXZWJEYXZTaXRlQWRtaW5bJ2NvZGUnXSkgPSBXZWJEYXZIZWxwZXI6OmNoZWNrQ29uZmlndXJhdGlvbigpOwoJaWYgKCRyZXQpIHsKCSAgICByZXR1cm4gYXJyYXkoJHJldCwgbnVsbCk7Cgl9CgoJLyogUmVuZGVyIEhUTUwgYm9keSAqLwoJJHRlbXBsYXRlLT5zZXRWYXJpYWJsZSgnV2ViRGF2U2l0ZUFkbWluJywgJFdlYkRhdlNpdGVBZG1pbik7CgoJcmV0dXJuIGFycmF5KG51bGwsIGFycmF5KCdib2R5JyA9PiAnbW9kdWxlcy93ZWJkYXYvdGVtcGxhdGVzL1dlYkRhdlNpdGVBZG1pbi50cGwnKSk7CiAgICB9Cn0KPz4K');
expand_6421a0d81d($outputDir, 'WebDavWorks.inc', 'PD9waHAKLyoKICogR2FsbGVyeSAtIGEgd2ViIGJhc2VkIHBob3RvIGFsYnVtIHZpZXdlciBhbmQgZWRpdG9yCiAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA3IEJoYXJhdCBNZWRpcmF0dGEKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CiAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAogKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KICovCgovKioKICogQ2hlY2sgdGhhdCBHYWxsZXJ5IGhhbmRsZXMgV2ViREFWIHJlcXVlc3QgbWV0aG9kcy4KICogQHBhY2thZ2UgV2ViRGF2CiAqIEBzdWJwYWNrYWdlIFVzZXJJbnRlcmZhY2UKICogQGF1dGhvciBKYWNrIEJhdGVzIDxtczQxOUBmcmVlem9uZS5jby51az4KICogQHZlcnNpb24gJFJldmlzaW9uOiAxNTcxNSAkCiAqLwpjbGFzcyBXZWJEYXZXb3Jrc1ZpZXcgZXh0ZW5kcyBHYWxsZXJ5VmlldyB7CgogICAgLyoqCiAgICAgKiBAc2VlIEdhbGxlcnlWaWV3Ojppc0ltbWVkaWF0ZQogICAgICovCiAgICBmdW5jdGlvbiBpc0ltbWVkaWF0ZSgpIHsKCXJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogQHNlZSBHYWxsZXJ5Vmlldzo6cmVuZGVySW1tZWRpYXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlbmRlckltbWVkaWF0ZSgkc3RhdHVzLCAkZXJyb3IpIHsKCXByaW50ICdQQVNTX1dFQkRBVic7CiAgICB9Cn0KPz4K');
expand_6421a0d81d($outputDir, 'classes/GNUmakefile', 'aW5jbHVkZSAuLi8uLi8uLi9saWIvdG9vbHMvYmluL0dOVW1ha2VmaWxlLmNsYXNzZXMK');
expand_6421a0d81d($outputDir, 'classes/GalleryStorage/GNUmakefile', 'aW5jbHVkZSAuLi8uLi8uLi8uLi9saWIvdG9vbHMvYmluL0dOVW1ha2VmaWxlLkdhbGxlcnlTdG9yYWdlCg==');
expand_6421a0d81d($outputDir, 'classes/GalleryStorage/schema.tpl', 'IyMgbXlzcWwKIyBXZWJEYXZMb2NrTWFwCkNSRUFURSBUQUJMRSBEQl9UQUJMRV9QUkVGSVhXZWJEYXZMb2NrTWFwKAogREJfQ09MVU1OX1BSRUZJWGRlcHRoIHZhcmNoYXIoMTI4KSwKIERCX0NPTFVNTl9QUkVGSVhvd25lciB2YXJjaGFyKDEyOCksCiBEQl9DT0xVTU5fUFJFRklYZXhwaXJlcyBpbnQoMTEpLAogREJfQ09MVU1OX1BSRUZJWHRva2VuIHZhcmNoYXIoMTI4KSwKIERCX0NPTFVNTl9QUkVGSVhwYXRoIHZhcmNoYXIoMTI4KSwKIERCX0NPTFVNTl9QUkVGSVhnYWxsZXJ5TG9ja0lkIGludCgxMSkKKSBEQl9UQUJMRV9UWVBFCi8qITQwMTAwIERFRkFVTFQgQ0hBUkFDVEVSIFNFVCB1dGY4ICovOwoKSU5TRVJUIElOVE8gREJfVEFCTEVfUFJFRklYU2NoZW1hICgKIERCX0NPTFVNTl9QUkVGSVhuYW1lLAogREJfQ09MVU1OX1BSRUZJWG1ham9yLAogREJfQ09MVU1OX1BSRUZJWG1pbm9yCikgVkFMVUVTKCdXZWJEYXZMb2NrTWFwJywgMCwgMSk7CgojIyBwb3N0Z3JlcwojIFdlYkRhdkxvY2tNYXAKQ1JFQVRFIFRBQkxFIERCX1RBQkxFX1BSRUZJWFdlYkRhdkxvY2tNYXAoCiBEQl9DT0xVTU5fUFJFRklYZGVwdGggVkFSQ0hBUigxMjgpLAogREJfQ09MVU1OX1BSRUZJWG93bmVyIFZBUkNIQVIoMTI4KSwKIERCX0NPTFVNTl9QUkVGSVhleHBpcmVzIElOVEVHRVIsCiBEQl9DT0xVTU5fUFJFRklYdG9rZW4gVkFSQ0hBUigxMjgpLAogREJfQ09MVU1OX1BSRUZJWHBhdGggVkFSQ0hBUigxMjgpLAogREJfQ09MVU1OX1BSRUZJWGdhbGxlcnlMb2NrSWQgSU5URUdFUik7CgpJTlNFUlQgSU5UTyBEQl9UQUJMRV9QUkVGSVhTY2hlbWEgKAogREJfQ09MVU1OX1BSRUZJWG5hbWUsCiBEQl9DT0xVTU5fUFJFRklYbWFqb3IsCiBEQl9DT0xVTU5fUFJFRklYbWlub3IKKSBWQUxVRVMoJ1dlYkRhdkxvY2tNYXAnLCAwLCAxKTsKCiMjIG9yYWNsZQojIFdlYkRhdkxvY2tNYXAKQ1JFQVRFIFRBQkxFIERCX1RBQkxFX1BSRUZJWFdlYkRhdkxvY2tNYXAoCiBEQl9DT0xVTU5fUFJFRklYZGVwdGggVkFSQ0hBUjIoMTI4KSwKIERCX0NPTFVNTl9QUkVGSVhvd25lciBWQVJDSEFSMigxMjgpLAogREJfQ09MVU1OX1BSRUZJWGV4cGlyZXMgSU5URUdFUiwKIERCX0NPTFVNTl9QUkVGSVh0b2tlbiBWQVJDSEFSMigxMjgpLAogREJfQ09MVU1OX1BSRUZJWHBhdGggVkFSQ0hBUjIoMTI4KSwKIERCX0NPTFVNTl9QUkVGSVhnYWxsZXJ5TG9ja0lkIElOVEVHRVIpOwoKSU5TRVJUIElOVE8gREJfVEFCTEVfUFJFRklYU2NoZW1hICgKIERCX0NPTFVNTl9QUkVGSVhuYW1lLAogREJfQ09MVU1OX1BSRUZJWG1ham9yLAogREJfQ09MVU1OX1BSRUZJWG1pbm9yCikgVkFMVUVTKCdXZWJEYXZMb2NrTWFwJywgMCwgMSk7CgojIyBkYjIKIyBXZWJEYXZMb2NrTWFwCkNSRUFURSBUQUJMRSBEQl9UQUJMRV9QUkVGSVhXZWJEYXZMb2NrTWFwKAogREJfQ09MVU1OX1BSRUZJWGRlcHRoIFZBUkNIQVIoMTI4KSwKIERCX0NPTFVNTl9QUkVGSVhvd25lciBWQVJDSEFSKDEyOCksCiBEQl9DT0xVTU5fUFJFRklYZXhwaXJlcyBJTlRFR0VSLAogREJfQ09MVU1OX1BSRUZJWHRva2VuIFZBUkNIQVIoMTI4KSwKIERCX0NPTFVNTl9QUkVGSVhwYXRoIFZBUkNIQVIoMTI4KSwKIERCX0NPTFVNTl9QUkVGSVhnYWxsZXJ5TG9ja0lkIElOVEVHRVIpOwoKSU5TRVJUIElOVE8gREJfVEFCTEVfUFJFRklYU2NoZW1hICgKIERCX0NPTFVNTl9QUkVGSVhuYW1lLAogREJfQ09MVU1OX1BSRUZJWG1ham9yLAogREJfQ09MVU1OX1BSRUZJWG1pbm9yCikgVkFMVUVTKCdXZWJEYXZMb2NrTWFwJywgMCwgMSk7CgojIyBtc3NxbAojIFdlYkRhdkxvY2tNYXAKQ1JFQVRFIFRBQkxFIERCX1RBQkxFX1BSRUZJWFdlYkRhdkxvY2tNYXAoCiBEQl9DT0xVTU5fUFJFRklYZGVwdGggTlZBUkNIQVIoMTI4KSBOVUxMLAogREJfQ09MVU1OX1BSRUZJWG93bmVyIE5WQVJDSEFSKDEyOCkgTlVMTCwKIERCX0NPTFVNTl9QUkVGSVhleHBpcmVzIElOVCBOVUxMLAogREJfQ09MVU1OX1BSRUZJWHRva2VuIE5WQVJDSEFSKDEyOCkgTlVMTCwKIERCX0NPTFVNTl9QUkVGSVhwYXRoIE5WQVJDSEFSKDEyOCkgTlVMTCwKIERCX0NPTFVNTl9QUkVGSVhnYWxsZXJ5TG9ja0lkIElOVCBOVUxMKTsKCklOU0VSVCBJTlRPIERCX1RBQkxFX1BSRUZJWFNjaGVtYSAoCiBEQl9DT0xVTU5fUFJFRklYbmFtZSwKIERCX0NPTFVNTl9QUkVGSVhtYWpvciwKIERCX0NPTFVNTl9QUkVGSVhtaW5vcgopIFZBTFVFUygnV2ViRGF2TG9ja01hcCcsIDAsIDEpOwoK');
expand_6421a0d81d($outputDir, 'classes/Maps.inc', 'PD9waHAKLyogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gTWFwcy54bWwgYnkgbGliL3Rvb2xzL2Jpbi9nZW5lcmF0ZS1tYXBzLnBocCAqLwokbWFwSW5mb1snV2ViRGF2TG9ja01hcCddID0gYXJyYXkoJ2RlcHRoJz0+YXJyYXkoJ3R5cGUnPT5TVE9SQUdFX1RZUEVfU1RSSU5HLCdzaXplJz0+U1RPUkFHRV9TSVpFX01FRElVTSksJ293bmVyJz0+YXJyYXkoJ3R5cGUnPT5TVE9SQUdFX1RZUEVfU1RSSU5HLCdzaXplJz0+U1RPUkFHRV9TSVpFX01FRElVTSksJ2V4cGlyZXMnPT5hcnJheSgndHlwZSc9PlNUT1JBR0VfVFlQRV9JTlRFR0VSLCdzaXplJz0+U1RPUkFHRV9TSVpFX01FRElVTSksJ3Rva2VuJz0+YXJyYXkoJ3R5cGUnPT5TVE9SQUdFX1RZUEVfU1RSSU5HLCdzaXplJz0+U1RPUkFHRV9TSVpFX01FRElVTSksJ3BhdGgnPT5hcnJheSgndHlwZSc9PlNUT1JBR0VfVFlQRV9TVFJJTkcsJ3NpemUnPT5TVE9SQUdFX1NJWkVfTUVESVVNKSwnZ2FsbGVyeUxvY2tJZCc9PmFycmF5KCd0eXBlJz0+U1RPUkFHRV9UWVBFX0lOVEVHRVIsJ3NpemUnPT5TVE9SQUdFX1NJWkVfTUVESVVNKSk7Cj8+Cg==');
expand_6421a0d81d($outputDir, 'classes/Maps.xml', 'PCFET0NUWVBFIG1hcHMgU1lTVEVNICIuLi8uLi8uLi9saWIvdG9vbHMvZHRkL01hcHNEZWZpbml0aW9uMi4wLmR0ZCI+CjxtYXBzPgogIDxtYXA+CiAgICA8bWFwLW5hbWU+V2ViRGF2TG9ja01hcDwvbWFwLW5hbWU+CiAgICA8c2NoZW1hPgogICAgICA8c2NoZW1hLW1ham9yPjA8L3NjaGVtYS1tYWpvcj4KICAgICAgPHNjaGVtYS1taW5vcj4xPC9zY2hlbWEtbWlub3I+CiAgICA8L3NjaGVtYT4KICAgIDxtZW1iZXI+CiAgICAgIDxtZW1iZXItbmFtZT5kZXB0aDwvbWVtYmVyLW5hbWU+CiAgICAgIDxtZW1iZXItdHlwZT5TVFJJTkc8L21lbWJlci10eXBlPgogICAgICA8bWVtYmVyLXNpemU+TUVESVVNPC9tZW1iZXItc2l6ZT4KICAgIDwvbWVtYmVyPgogICAgPG1lbWJlcj4KICAgICAgPG1lbWJlci1uYW1lPm93bmVyPC9tZW1iZXItbmFtZT4KICAgICAgPG1lbWJlci10eXBlPlNUUklORzwvbWVtYmVyLXR5cGU+CiAgICAgIDxtZW1iZXItc2l6ZT5NRURJVU08L21lbWJlci1zaXplPgogICAgPC9tZW1iZXI+CiAgICA8bWVtYmVyPgogICAgICA8bWVtYmVyLW5hbWU+ZXhwaXJlczwvbWVtYmVyLW5hbWU+CiAgICAgIDxtZW1iZXItdHlwZT5JTlRFR0VSPC9tZW1iZXItdHlwZT4KICAgIDwvbWVtYmVyPgogICAgPG1lbWJlcj4KICAgICAgPG1lbWJlci1uYW1lPnRva2VuPC9tZW1iZXItbmFtZT4KICAgICAgPG1lbWJlci10eXBlPlNUUklORzwvbWVtYmVyLXR5cGU+CiAgICAgIDxtZW1iZXItc2l6ZT5NRURJVU08L21lbWJlci1zaXplPgogICAgPC9tZW1iZXI+CiAgICA8bWVtYmVyPgogICAgICA8bWVtYmVyLW5hbWU+cGF0aDwvbWVtYmVyLW5hbWU+CiAgICAgIDxtZW1iZXItdHlwZT5TVFJJTkc8L21lbWJlci10eXBlPgogICAgICA8bWVtYmVyLXNpemU+TUVESVVNPC9tZW1iZXItc2l6ZT4KICAgIDwvbWVtYmVyPgogICAgPG1lbWJlcj4KICAgICAgPG1lbWJlci1uYW1lPmdhbGxlcnlMb2NrSWQ8L21lbWJlci1uYW1lPgogICAgICA8bWVtYmVyLXR5cGU+SU5URUdFUjwvbWVtYmVyLXR5cGU+CiAgICA8L21lbWJlcj4KICA8L21hcD4KPC9tYXBzPgo=');
expand_6421a0d81d($outputDir, 'classes/WebDavHelper.class', 'PD9waHAKLyoKICogR2FsbGVyeSAtIGEgd2ViIGJhc2VkIHBob3RvIGFsYnVtIHZpZXdlciBhbmQgZWRpdG9yCiAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA3IEJoYXJhdCBNZWRpcmF0dGEKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CiAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAogKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KICovCgpHYWxsZXJ5Q29yZUFwaTo6cmVxdWlyZU9uY2UoJ21vZHVsZXMvd2ViZGF2L2xpYi9IVFRQL1dlYkRBVi9TZXJ2ZXIucGhwJyk7CgovKiBXZWJEQVYgc3RhdHVzIGNvZGVzICovCmRlZmluZSgnV0VCREFWX1NUQVRVU19OT19YTUxfUEFSU0VSJywgMHgwMDAwMDAwMik7CmRlZmluZSgnV0VCREFWX1NUQVRVU19NRVRIT0RfTk9UX0hBTkRMRUQnLCAweDAwMDAwMDA0KTsKZGVmaW5lKCdXRUJEQVZfU1RBVFVTX0hUVFBBVVRIX01PRFVMRV9ESVNBQkxFRCcsIDB4MDAwMDAwMDgpOwpkZWZpbmUoJ1dFQkRBVl9TVEFUVVNfUkVXUklURV9NT0RVTEVfRElTQUJMRUQnLCAweDAwMDAwMDEwKTsKZGVmaW5lKCdXRUJEQVZfU1RBVFVTX0NPTk5FQ1RfUlVMRV9ESVNBQkxFRCcsIDB4MDAwMDAwMjApOwpkZWZpbmUoJ1dFQkRBVl9TVEFUVVNfTUlTU0lOR19EQVZfSEVBREVSUycsIDB4MDAwMDAwNDApOwpkZWZpbmUoJ1dFQkRBVl9TVEFUVVNfQUxURVJOQVRJVkVfVVJMX0hFQURFUlMnLCAweDAwMDAwMDgwKTsKZGVmaW5lKCdXRUJEQVZfU1RBVFVTX0JBRF9SRVdSSVRFX1BBUlNFUicsIDB4MDAwMDAxMDApOwpkZWZpbmUoJ1dFQkRBVl9TVEFUVVNfT1BUSU9OU19SVUxFX0RJU0FCTEVEJywgMHgwMDAwMDIwMCk7CmRlZmluZSgnV0VCREFWX1NUQVRVU19IVFRQQVVUSF9BVVRIX1BMVUdJTlNfRElTQUJMRUQnLCAweDAwMDAwNDAwKTsKZGVmaW5lKCdXRUJEQVZfU1RBVFVTX0VSUk9SX1VOS05PV04nLCAweDgwMDAwMDAwKTsKCi8qIEdhbGxlcnkgcHJvcGVydHkgbmFtZXNwYWNlIC0gUkZDMjUxOCAxOCAqLwpkZWZpbmUoJ1dFQkRBVl9HQUxMRVJZX05BTUVTUEFDRScsICdodHRwOi8vZ2FsbGVyeTIub3JnL2Rhdi9wcm9wcy8nKTsKCi8qKgogKiBXZWJEQVYgaGVscGVyIGNsYXNzLgogKiBAcGFja2FnZSBXZWJEYXYKICogQHN1YnBhY2thZ2UgQ2xhc3NlcwogKiBAYXV0aG9yIEphY2sgQmF0ZXMgPG1zNDE5QGZyZWV6b25lLmNvLnVrPgogKiBAdmVyc2lvbiAkUmV2aXNpb246IDE2NTA4ICQKICogQHN0YXRpYwogKi8KY2xhc3MgV2ViRGF2SGVscGVyIHsKCiAgICAvKioKICAgICAqIENoZWNrIHRoaXMgbW9kdWxlJ3MgY29uZmlndXJhdGlvbi4KICAgICAqIEByZXR1cm4gYXJyYXkgb2JqZWN0IEdhbGxlcnlTdGF0dXMgYSBzdGF0dXMgY29kZQogICAgICogICAgICAgICAgICAgICBpbnQgV2ViREFWIHN0YXR1cyBjb2RlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNoZWNrQ29uZmlndXJhdGlvbigpIHsKCWdsb2JhbCAkZ2FsbGVyeTsKCSRwaHBWbSA9ICRnYWxsZXJ5LT5nZXRQaHBWbSgpOwoJJHVybEdlbmVyYXRvciA9JiAkZ2FsbGVyeS0+Z2V0VXJsR2VuZXJhdG9yKCk7CgoJJGNvZGUgPSAweDAwMDAwMDAwOwoKCWxpc3QgKCRyZXQsICRtb2R1bGVTdGF0dXMpID0gR2FsbGVyeUNvcmVBcGk6OmZldGNoUGx1Z2luTGlzdCgnbW9kdWxlJyk7CglpZiAoJHJldCkgewoJICAgIHJldHVybiBhcnJheSgkcmV0LCBudWxsKTsKCX0KCgkvKgoJICogVVJMIHJld3JpdGUgbW9kdWxlIG11c3QgYmUgZW5hYmxlZC4gIENoZWNrIGl0IHJlZ2FyZGxlc3Mgb2YgbWlzc2luZyBEQVYgaGVhZGVycyBiZWNhdXNlCgkgKiBpdCBhbHNvIGltcGxpZXMgdGhlIGNvbm5lY3QgcnVsZSBpcyBkaXNhYmxlZC4gIENoZWNrIGl0IGJlZm9yZSBjaGVja2luZyBmb3IgbWlzc2luZyBEQVYKCSAqIGhlYWRlcnMgY2F1c2VzIGJlY2F1c2UgaXQgaXMgYSBtaXNzaW5nIERBViBoZWFkZXJzIGNhdXNlLgoJICovCglpZiAoZW1wdHkoJG1vZHVsZVN0YXR1c1sncmV3cml0ZSddWydhY3RpdmUnXSkpIHsKCSAgICAkY29kZSB8PSBXRUJEQVZfU1RBVFVTX1JFV1JJVEVfTU9EVUxFX0RJU0FCTEVEOwoJfSBlbHNlIHsKCSAgICBsaXN0ICgkcmV0LCAkcmV3cml0ZUFwaSkgPSBHYWxsZXJ5Q29yZUFwaTo6bmV3RmFjdG9yeUluc3RhbmNlKCdSZXdyaXRlQXBpJyk7CgkgICAgaWYgKCRyZXQpIHsKCQlyZXR1cm4gYXJyYXkoJHJldCwgbnVsbCk7CgkgICAgfQoJICAgIGlmICghaXNzZXQoJHJld3JpdGVBcGkpKSB7CgkJcmV0dXJuIGFycmF5KEdhbGxlcnlDb3JlQXBpOjplcnJvcihFUlJPUl9DT05GSUdVUkFUSU9OX1JFUVVJUkVEKSwgbnVsbCk7CgkgICAgfQoKCSAgICBsaXN0ICgkcmV0LCAkaXNDb21wYXRpYmxlKSA9ICRyZXdyaXRlQXBpLT5pc0NvbXBhdGlibGVXaXRoQXBpKGFycmF5KDEsIDEpKTsKCSAgICBpZiAoJHJldCkgewoJCXJldHVybiBhcnJheSgkcmV0LCBudWxsKTsKCSAgICB9CgkgICAgaWYgKCEkaXNDb21wYXRpYmxlKSB7CgkJcmV0dXJuIGFycmF5KEdhbGxlcnlDb3JlQXBpOjplcnJvcihFUlJPUl9DT05GSUdVUkFUSU9OX1JFUVVJUkVEKSwgbnVsbCk7CgkgICAgfQoKCSAgICBsaXN0ICgkcmV0LCAkYWN0aXZlUnVsZXMpID0gJHJld3JpdGVBcGktPmZldGNoQWN0aXZlUnVsZXNGb3JNb2R1bGUoJ3dlYmRhdicpOwoJICAgIGlmICgkcmV0KSB7CgkJcmV0dXJuIGFycmF5KCRyZXQsIG51bGwpOwoJICAgIH0KCX0KCgkvKgoJICogQ2hlY2sgZm9yIG1pc3NpbmcgREFWIGhlYWRlcnMgY2F1c2VzIGZpcnN0IHNvIHdlIGNhbiBzaG93IHRoZSBlcnJvciB1bmtub3duIHdhcm5pbmcgaWYgbm8KCSAqIGNhdXNlcyBhcmUgZm91bmQuCgkgKi8KCWlmICghV2ViRGF2SGVscGVyOjpjaGVja0RhdkhlYWRlcnMoJHVybEdlbmVyYXRvci0+Z2VuZXJhdGVVcmwoCgkJYXJyYXkoJ2NvbnRyb2xsZXInID0+ICd3ZWJkYXYuV2ViRGF2JyksCgkJYXJyYXkoJ2ZvcmNlRnVsbFVybCcgPT4gdHJ1ZSwKCQkgICAgICAnaHRtbEVudGl0aWVzJyA9PiBmYWxzZSkpKSkgewoKCSAgICAvKiBBbHJlYWR5IGNoZWNrZWQgb25lIGNhdXNlOiBVUkwgcmV3cml0ZSBtb2R1bGUgZGlzYWJsZWQuICBDaGVjayBvdGhlciBjYXVzZXMuICovCgkgICAgaWYgKCFXZWJEYXZIZWxwZXI6OmNoZWNrRGF2SGVhZGVycygkdXJsR2VuZXJhdG9yLT5nZW5lcmF0ZVVybCgKCQkgICAgYXJyYXkoJ2hyZWYnID0+ICdtb2R1bGVzL3dlYmRhdi9kYXRhL29wdGlvbnMvJyksCgkJICAgIGFycmF5KCdmb3JjZUZ1bGxVcmwnID0+IHRydWUsCgkJCSAgJ2h0bWxFbnRpdGllcycgPT4gZmFsc2UpKSkpIHsKCQkkY29kZSB8PSBXRUJEQVZfU1RBVFVTX0FMVEVSTkFUSVZFX1VSTF9IRUFERVJTOwoJICAgIH0KCgkgICAgaWYgKCFlbXB0eSgkbW9kdWxlU3RhdHVzWydyZXdyaXRlJ11bJ2FjdGl2ZSddKSkgewoJCWlmICgkcmV3cml0ZUFwaS0+Z2V0UGFyc2VyVHlwZSgpICE9ICdwcmVHYWxsZXJ5JykgewoJCSAgICAkY29kZSB8PSBXRUJEQVZfU1RBVFVTX0JBRF9SRVdSSVRFX1BBUlNFUjsKCQl9IGVsc2UgewoJCSAgICBpZiAoIWluX2FycmF5KCdvcHRpb25zJywgJGFjdGl2ZVJ1bGVzKSkgewoJCQkkY29kZSB8PSBXRUJEQVZfU1RBVFVTX09QVElPTlNfUlVMRV9ESVNBQkxFRDsKCQkgICAgfQoJCX0KCSAgICB9CgoJICAgIC8qIE5vIGNhdXNlcyBmb3VuZCBmb3IgbWlzc2luZyBEQVYgaGVhZGVycyEgKi8KCSAgICBpZiAoISRjb2RlKSB7CgkJJGNvZGUgfD0gV0VCREFWX1NUQVRVU19FUlJPUl9VTktOT1dOOwoJICAgIH0KCgkgICAgJGNvZGUgfD0gV0VCREFWX1NUQVRVU19NSVNTSU5HX0RBVl9IRUFERVJTOwoJfQoKCS8qCgkgKiBNdXN0IHVzZSBzaG9ydCBVUkwgYmVjYXVzZSBtb3N0IFdlYkRBViBjbGllbnRzIGRvbid0IHN1cHBvcnQgcXVlcnkgc3RyaW5ncy4gIENoZWNrIGl0CgkgKiBhZnRlciBjaGVja2luZyBmb3IgbWlzc2luZyBEQVYgaGVhZGVycyBjYXVzZXMgc28gd2UgY2FuIHNob3cgdGhlIGVycm9yIHVua25vd24gd2FybmluZyBpZgoJICogbm8gY2F1c2VzIGFyZSBmb3VuZC4KCSAqLwoJaWYgKCFlbXB0eSgkbW9kdWxlU3RhdHVzWydyZXdyaXRlJ11bJ2FjdGl2ZSddKSkgewoJICAgIGlmICghaW5fYXJyYXkoJ2Nvbm5lY3QnLCAkYWN0aXZlUnVsZXMpKSB7CgkJJGNvZGUgfD0gV0VCREFWX1NUQVRVU19DT05ORUNUX1JVTEVfRElTQUJMRUQ7CgkgICAgfQoJfQoKCS8qCgkgKiBIVFRQIGF1dGggbW9kdWxlIG11c3QgYmUgZW5hYmxlZCB0byBhdXRoZW50aWNhdGUgd2l0aCBXZWJEQVYuICBDaGVjayBpdCBhZnRlciBjaGVja2luZwoJICogZm9yIG1pc3NpbmcgREFWIGhlYWRlcnMgY2F1c2VzIHNvIHdlIGNhbiBzaG93IHRoZSBlcnJvciB1bmtub3duIHdhcm5pbmcgaWYgbm8gY2F1c2VzIGFyZQoJICogZm91bmQuCgkgKi8KCWlmIChlbXB0eSgkbW9kdWxlU3RhdHVzWydodHRwYXV0aCddWydhY3RpdmUnXSkpIHsKCSAgICAkY29kZSB8PSBXRUJEQVZfU1RBVFVTX0hUVFBBVVRIX01PRFVMRV9ESVNBQkxFRDsKCX0gZWxzZSB7CgkgICAgLyogRW5zdXJlIEhUVFAgYXV0aCBpcyBlbmFibGVkICovCgkgICAgbGlzdCAoJHJldCwgJGh0dHBBdXRoSW50ZXJmYWNlKSA9CgkgICAgCUdhbGxlcnlDb3JlQXBpOjpuZXdGYWN0b3J5SW5zdGFuY2UoJ0h0dHBBdXRoSW50ZXJmYWNlXzFfMCcpOwoJICAgIGlmICgkcmV0KSB7CgkJcmV0dXJuIGFycmF5KCRyZXQsIG51bGwpOwoJICAgIH0KCSAgICBpZiAoaXNzZXQoJGh0dHBBdXRoSW50ZXJmYWNlKSkgewoJCWxpc3QgKCRyZXQsICRodHRwQXV0aFBsdWdpbkVuYWJsZWQsICRzZXJ2ZXJBdXRoUGx1Z2luRW5hYmxlZCkgPQoJCQkkaHR0cEF1dGhJbnRlcmZhY2UtPmdldENvbmZpZ3VyYXRpb24oKTsKCQlpZiAoJHJldCkgewoJCSAgICByZXR1cm4gYXJyYXkoJHJldCwgbnVsbCk7CgkJfQoJCWlmICghJGh0dHBBdXRoUGx1Z2luRW5hYmxlZCAmJiAhJHNlcnZlckF1dGhQbHVnaW5FbmFibGVkKSB7CgkJICAgICRjb2RlIHw9IFdFQkRBVl9TVEFUVVNfSFRUUEFVVEhfQVVUSF9QTFVHSU5TX0RJU0FCTEVEOwoJCX0KCSAgICB9Cgl9CgoJLyoKCSAqIENoZWNrIHRoYXQgR2FsbGVyeSBoYW5kbGVzIFdlYkRBViByZXF1ZXN0IG1ldGhvZHMuICBDaGVjayBpdCBhZnRlciBjaGVja2luZyBmb3IgbWlzc2luZwoJICogREFWIGhlYWRlcnMgY2F1c2VzIHNvIHdlIGNhbiBzaG93IHRoZSBlcnJvciB1bmtub3duIHdhcm5pbmcgaWYgbm8gY2F1c2VzIGFyZSBmb3VuZC4KCSAqLwoJZm9yZWFjaCAoYXJyYXkoJ1BST1BGSU5EJywgJ1BST1BQQVRDSCcsICdNS0NPTCcsICdERUxFVEUnLCAnUFVUJywgJ01PVkUnLCAnTE9DSycsICdVTkxPQ0snKQoJCWFzICRyZXF1ZXN0TWV0aG9kKSB7CgkgICAgaWYgKCFXZWJEYXZIZWxwZXI6OmNoZWNrUmVxdWVzdE1ldGhvZCgkcmVxdWVzdE1ldGhvZCkpIHsKCQlpZiAoJGdhbGxlcnktPmdldERlYnVnKCkpIHsKCQkgICAgJGdhbGxlcnktPmRlYnVnKCdFcnJvciBpbiBXZWJEYXZIZWxwZXI6OmNoZWNrQ29uZmlndXJhdGlvbjonCgkJCS4gJyB0aGlzIHNlcnZlciBkb2VzblwndCBwYXNzICcgLiAkcmVxdWVzdE1ldGhvZCAuICcgcmVxdWVzdHMgdG8gR2FsbGVyeS4nKTsKCQl9CgkJJGNvZGUgfD0gV0VCREFWX1NUQVRVU19NRVRIT0RfTk9UX0hBTkRMRUQ7CgkgICAgfQoJfQoKCS8qCgkgKiBUaGUgV2ViREFWIGxpYnJhcnkgcmVxdWlyZXMgYSBQSFAgWE1MIHBhcnNlci4gIENoZWNrIGl0IGFmdGVyIGNoZWNraW5nIGZvciBtaXNzaW5nIERBVgoJICogaGVhZGVycyBjYXVzZXMgc28gd2UgY2FuIHNob3cgdGhlIGVycm9yIHVua25vd24gd2FybmluZyBpZiBubyBjYXVzZXMgYXJlIGZvdW5kLgoJICovCglpZiAoISRwaHBWbS0+ZXh0ZW5zaW9uX2xvYWRlZCgneG1sJykpIHsKCSAgICAkY29kZSB8PSBXRUJEQVZfU1RBVFVTX05PX1hNTF9QQVJTRVI7Cgl9CgoJcmV0dXJuIGFycmF5KG51bGwsICRjb2RlKTsKICAgIH0KCiAgICAvKioKICAgICAqIENoZWNrIHRoYXQgR2FsbGVyeSBoYW5kbGVzIFdlYkRBViByZXF1ZXN0IG1ldGhvZHMuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRyZXF1ZXN0TWV0aG9kCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBHYWxsZXJ5IGhhbmRsZXMgdGhlIHJlcXVlc3QgbWV0aG9kCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNoZWNrUmVxdWVzdE1ldGhvZCgkcmVxdWVzdE1ldGhvZCkgewoJZ2xvYmFsICRnYWxsZXJ5OwoJJHVybEdlbmVyYXRvciA9JiAkZ2FsbGVyeS0+Z2V0VXJsR2VuZXJhdG9yKCk7CgoJbGlzdCAoJHN0YXR1cywgJGhlYWRlcnMsICRib2R5KSA9IEdhbGxlcnlDb3JlQXBpOjpyZXF1ZXN0V2ViUGFnZSgkdXJsR2VuZXJhdG9yLT5nZW5lcmF0ZVVybCgKCQlhcnJheSgndmlldycgPT4gJ3dlYmRhdi5XZWJEYXZXb3JrcycpLAoJCWFycmF5KCdmb3JjZUZ1bGxVcmwnID0+IHRydWUsCgkJICAgICAgJ2h0bWxFbnRpdGllcycgPT4gZmFsc2UpKSwgJHJlcXVlc3RNZXRob2QsIGFycmF5KCdDb250ZW50LWxlbmd0aCcgPT4gMCkpOwoKCWlmICghcHJlZ19tYXRjaCgnL15IVFRQXC9bMC05XVwuWzAtOV0gMjAwLycsICRzdGF0dXMpKSB7CgkgICAgcmV0dXJuIGZhbHNlOwoJfQoKCWlmICh0cmltKCRib2R5KSAhPSAnUEFTU19XRUJEQVYnKSB7CgkgICAgcmV0dXJuIGZhbHNlOwoJfQoKCXJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2sgdGhhdCBPUFRJT05TIHJlc3BvbnNlcyBpbmNsdWRlcyB0aGUgREFWIGhlYWRlcnMuCiAgICAgKiBAcGFyYW0gc3RyaW5nICR1cmwKICAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIE9QVElPTlMgcmVzcG9uc2VzIGluY2x1ZGUgdGhlIERBViBoZWFkZXJzCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNoZWNrRGF2SGVhZGVycygkdXJsKSB7CglsaXN0ICgkc3RhdHVzLCAkaGVhZGVycywgJGJvZHkpID0gR2FsbGVyeUNvcmVBcGk6OnJlcXVlc3RXZWJQYWdlKCR1cmwsICdPUFRJT05TJyk7CgoJaWYgKCFwcmVnX21hdGNoKCcvXkhUVFBcL1swLTldXC5bMC05XSAyMDAvJywgJHN0YXR1cykpIHsKCSAgICByZXR1cm4gZmFsc2U7Cgl9CgoJaWYgKGVtcHR5KCRoZWFkZXJzWydBbGxvdyddKSB8fCAkaGVhZGVyc1snQWxsb3cnXSAhPSAnT1BUSU9OUyxQUk9QRklORCxQUk9QUEFUQ0gsTUtDT0wsR0VUJwoJCS4gJyxIRUFELERFTEVURSxQVVQsTU9WRSxMT0NLLFVOTE9DSycpIHsKCSAgICByZXR1cm4gZmFsc2U7Cgl9CgoJaWYgKGVtcHR5KCRoZWFkZXJzWydEQVYnXSkgfHwgJGhlYWRlcnNbJ0RBViddICE9ICcxLDInKSB7CgkgICAgcmV0dXJuIGZhbHNlOwoJfQoKCWlmIChlbXB0eSgkaGVhZGVyc1snTVMtQXV0aG9yLVZpYSddKSB8fCAkaGVhZGVyc1snTVMtQXV0aG9yLVZpYSddICE9ICdEQVYnKSB7CgkgICAgcmV0dXJuIGZhbHNlOwoJfQoKCXJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhIGJyb3dzZXItc3BlY2lmYyBtb3VudCBsaW5rIGZvciB0aGUgZ2l2ZW4gaXRlbS4KICAgICAqIEBwYXJhbSBpbnQgJGl0ZW1JZAogICAgICogQHJldHVybiBhcnJheSgnaHJlZicgPT4gc3RyaW5nIHRoZSBkYXZtb3VudCBVUkwsCiAgICAgKiAgICAgICAgICAgICAgICdzY3JpcHQnIChvcHRpb25hbCkgPT4gc3RyaW5nIEphdmFTY3JpcHQgdG8gYmUgdXNlZCBhcyBvbmNsaWNrLAogICAgICogICAgICAgICAgICAgICAnYXR0cnMnID0+IGFycmF5KCkgc3RyaW5nIGFkZGl0aW9uYWwgbGluayB0YWcgYXR0cmlidXRlcykKICAgICAqLwogICAgZnVuY3Rpb24gZ2V0TW91bnRMaW5rKCRpdGVtSWQpIHsKCWdsb2JhbCAkZ2FsbGVyeTsKCSR1cmxHZW5lcmF0b3IgPSYgJGdhbGxlcnktPmdldFVybEdlbmVyYXRvcigpOwoKCSR1c2VyQWdlbnQgPSBHYWxsZXJ5VXRpbGl0aWVzOjpnZXRTZXJ2ZXJWYXIoJ0hUVFBfVVNFUl9BR0VOVCcpOwoKCSR1cmwgPSAkdXJsR2VuZXJhdG9yLT5nZW5lcmF0ZVVybChhcnJheSgnY29udHJvbGxlcicgPT4gJ3dlYmRhdi5XZWJEYXYnLAoJCQkJCQknaXRlbUlkJyA9PiAkaXRlbUlkKSwKCQkJCQkgIGFycmF5KCdmb3JjZUZ1bGxVcmwnID0+IHRydWUsCgkJCQkJCSdmb3JjZVNlc3Npb25JZCcgPT4gZmFsc2UsCgkJCQkJCSd1c2VBdXRoVG9rZW4nID0+IGZhbHNlKSk7CgkkbGlua1snYXR0cnMnXSA9ICdzdHlsZT0iYmVoYXZpb3I6IHVybCgjZGVmYXVsdCNhbmNob3JDbGljaykiIGZvbGRlcj0iJy4gJHVybCAuICciJzsKCglpZiAoc3RycG9zKCR1c2VyQWdlbnQsICdNU0lFJykgIT09IGZhbHNlKSB7CgkgICAgLyoKCSAgICAgKiBNb3VudCB3aXRoIEphdmFTY3JpcHQgb25seSBpZiB1c2luZyBNU0lFLiAgQnkgZGVmYXVsdCwgZHJvcGRvd25zIGxpbmsgdG8gZGF2bW91bnQKCSAgICAgKiByZXNvdXJjZXMuCgkgICAgICovCgkgICAgJHVybCA9ICR1cmxHZW5lcmF0b3ItPmdlbmVyYXRlVXJsKGFycmF5KCdjb250cm9sbGVyJyA9PiAnd2ViZGF2LldlYkRhdicsCgkJCQkJCSAgICAnaXRlbUlkJyA9PiAkaXRlbUlkKSwKCQkJCQkgICAgICBhcnJheSgnZm9yY2VGdWxsVXJsJyA9PiB0cnVlLAoJCQkJCQkgICAgJ2h0bWxFbnRpdGllcycgPT4gZmFsc2UsCgkJCQkJCSAgICAnZm9yY2VTZXNzaW9uSWQnID0+IGZhbHNlLAoJCQkJCQkgICAgJ3VzZUF1dGhUb2tlbicgPT4gZmFsc2UpKTsKCSAgICAkbGlua1snc2NyaXB0J10gPQoJCSAgICAidGhpcy5zdHlsZS5iZWhhdmlvciA9ICd1cmwoI2RlZmF1bHQjaHR0cEZvbGRlciknOyB0aGlzLm5hdmlnYXRlKCckdXJsJykiOwoJfQoJaWYgKHN0cnBvcygkdXNlckFnZW50LCAnS29ucXVlcm9yJykgIT09IGZhbHNlKSB7CgkgICAgLyogS29ucXVlcm9yIHN1cHBvcnRzIHdlYmRhdjovLyBVUkxzICovCgkgICAgJHVybFBhcmFtcyA9IGFycmF5KCdjb250cm9sbGVyJyA9PiAnd2ViZGF2LldlYkRhdicsICdpdGVtSWQnID0+ICRpdGVtSWQpOwoJICAgICR1cmxPcHRpb25zID0gYXJyYXkoJ3Byb3RvY29sJyA9PiAnd2ViZGF2JywgJ2ZvcmNlU2Vzc2lvbklkJyA9PiBmYWxzZSwKCQkJCSd1c2VBdXRoVG9rZW4nID0+IGZhbHNlKTsKCX0gZWxzZSB7CgkgICAgJHVybFBhcmFtcyA9IGFycmF5KCd2aWV3JyA9PiAnd2ViZGF2LkRvd25sb2FkRGF2TW91bnQnLCAnaXRlbUlkJyA9PiAkaXRlbUlkKTsKCSAgICAkdXJsT3B0aW9ucyA9IGFycmF5KCk7Cgl9CgoJJGxpbmtbJ2hyZWYnXSA9ICR1cmxHZW5lcmF0b3ItPmdlbmVyYXRlVXJsKCR1cmxQYXJhbXMsICR1cmxPcHRpb25zKTsKCglyZXR1cm4gJGxpbms7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBpZCBvZiBpdGVtIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHBhcmVudCBvZiB0aGUgZ2l2ZW4gcGF0aC4KICAgICAqIFRoZSBpdGVtIGF0IHRoZSBnaXZlbiBwYXRoIGRvZXNuJ3QgaGF2ZSB0byBleGlzdCwgYnV0IGl0cyBwYXJlbnQgaXMgZXhwZWN0ZWQgdG8gZXhpc3QuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aCwgZS5nLiAvZm9vL2JhcgogICAgICogQHJldHVybiBhcnJheSBvYmplY3QgR2FsbGVyeVN0YXR1cyBhIHN0YXR1cyBjb2RlLAogICAgICogICAgICAgICAgICAgICBpbnQgdGhlIGlkIG9mIHRoZSBwYXJlbnQgaXRlbQogICAgICovCiAgICBmdW5jdGlvbiBnZXRQYXJlbnRJdGVtSWRCeVBhdGgoJHBhdGgpIHsKCSRwYXJlbnRQYXRoID0gZGlybmFtZSgkcGF0aCk7CgoJLyogZGlybmFtZSgnZm9vJykgaXMgJy4nIGFuZCBcIGZvciBkaXJuYW1lICgnL2ZvbycpIG9uIFdpbmRvd3MgKi8KCWlmIChpbl9hcnJheSgkcGFyZW50UGF0aCwgYXJyYXkoJy4nLCAnXFwnKSkpIHsKCSAgICBsaXN0ICgkcmV0LCAkcGFyZW50SWQpID0KCQkgICAgR2FsbGVyeUNvcmVBcGk6OmdldFBsdWdpblBhcmFtZXRlcignbW9kdWxlJywgJ2NvcmUnLCAnaWQucm9vdEFsYnVtJyk7CgkgICAgaWYgKCRyZXQpIHsKCQlyZXR1cm4gYXJyYXkoJHJldCwgbnVsbCk7CgkgICAgfQoJfSBlbHNlIHsKCSAgICBsaXN0ICgkcmV0LCAkcGFyZW50SWQpID0gR2FsbGVyeUNvcmVBcGk6OmZldGNoSXRlbUlkQnlQYXRoKCRwYXJlbnRQYXRoKTsKCSAgICBpZiAoJHJldCkgewoJCXJldHVybiBhcnJheSgkcmV0LCBudWxsKTsKCSAgICB9Cgl9CgoJcmV0dXJuIGFycmF5KG51bGwsIChpbnQpJHBhcmVudElkKTsKICAgIH0KCiAgICAvKioKICAgICAqIFRha2UgdHdvIGVudGl0aWVzIG9mIHBvc3NpYmx5IGRpZmZlcmVudCBjbGFzc2VzIGFuZCBtYWtlIHRoZSBzZWNvbmQgZW50aXR5IGFzIGNsb3NlIGEgY29weSBvZgogICAgICogdGhlIGZpcnN0IGVudGl0eSBhcyBwb3NzaWJsZS4gIENvcHkgdGhlIGlkIGJ1dCBub3QgdGhlIGVudGl0eSB0eXBlIGJlY2F1c2UgdGhlIGVudGl0eSB0eXBlCiAgICAgKiBtdXN0IGFsd2F5cyBtYXRjaCB0aGUgY2xhc3MgbmFtZS4KICAgICAqIEBwYXJhbSBvYmplY3QgR2FsbGVyeUVudGl0eSAkc291cmNlRW50aXR5IGVudGl0eSB0byBjb3B5IGZyb20KICAgICAqIEBwYXJhbSBvYmplY3QgR2FsbGVyeUVudGl0eSAkbWlycm9yRW50aXR5IGVudGl0eSB0byBjb3B5IHRvCiAgICAgKiBAcmV0dXJuIGFycmF5IG9iamVjdCBHYWxsZXJ5U3RhdHVzIGEgc3RhdHVzIGNvZGUKICAgICAqICAgICAgICAgICAgICAgb2JqZWN0IEdhbGxlcnlFbnRpdHkgdGhlIG1pcnJvciBlbnRpdHkKICAgICAqLwogICAgZnVuY3Rpb24gbWlycm9yRW50aXR5KCRzb3VyY2VFbnRpdHksICRtaXJyb3JFbnRpdHkpIHsKCSRjbGFzc05hbWUgPSAkbWlycm9yQ2xhc3NOYW1lID0gJG1pcnJvckVudGl0eS0+Z2V0Q2xhc3NOYW1lKCk7CglsaXN0ICgkcmV0LCAkZW50aXR5SW5mbykgPSBHYWxsZXJ5Q29yZUFwaTo6ZGVzY3JpYmVFbnRpdHkoJGNsYXNzTmFtZSk7CglpZiAoJHJldCkgewoJICAgIHJldHVybiBhcnJheSgkcmV0LCBudWxsKTsKCX0KCglsaXN0ICgkcmV0LCAkbWVtYmVyQWNjZXNzSW5mbykgPQoJICAgIEdhbGxlcnlDb3JlQXBpOjpnZXRFeHRlcm5hbEFjY2Vzc01lbWJlckxpc3QoJGNsYXNzTmFtZSk7CglpZiAoJHJldCkgewoJICAgIHJldHVybiBhcnJheSgkcmV0LCBudWxsKTsKCX0KCS8qIFdlIG5lZWQgdG8gb3ZlcnJpZGUgaWQgYW5kIHBhdGhDb21wb25lbnQgKi8KCSRvdmVycmlkZSA9IGFycmF5KCdpZCcsICdwYXRoQ29tcG9uZW50Jyk7CgoJLyoKCSAqIFdhbGsgZG93biB0aGUgbWlycm9yIGVudGl0eSdzIGNsYXNzIGhpZXJhcmNoeSBjb3B5aW5nIGNsYXNzIG1lbWJlcnMgZnJvbSB0aGUgc291cmNlCgkgKiBlbnRpdHkgaWYgdGhleSBhcmUgZGVmaW5lZAoJICovCgl3aGlsZSAoIWVtcHR5KCRjbGFzc05hbWUpKSB7CgkgICAgZm9yZWFjaCAoJGVudGl0eUluZm9bJGNsYXNzTmFtZV1bJ21lbWJlcnMnXSBhcyAkbWVtYmVyTmFtZSA9PiAkbWVtYmVySW5mbykgewoJCWlmIChpc3NldCgkc291cmNlRW50aXR5LT4kbWVtYmVyTmFtZSkKCQkJJiYgKCFlbXB0eSgkbWVtYmVyQWNjZXNzSW5mb1skbWVtYmVyTmFtZV1bJ3dyaXRlJ10pCgkJCSAgICB8fCBpbl9hcnJheSgkbWVtYmVyTmFtZSwgJG92ZXJyaWRlKSkpIHsKCQkgICAgJG1pcnJvckVudGl0eS0+JG1lbWJlck5hbWUgPSAkc291cmNlRW50aXR5LT4kbWVtYmVyTmFtZTsKCQl9CgkgICAgfQoKCSAgICAkY2xhc3NOYW1lID0gJGVudGl0eUluZm9bJGNsYXNzTmFtZV1bJ3BhcmVudCddOwoJfQoKCS8qCgkgKiBSZXNldCB0aGUgZW50aXR5IHR5cGUgdG8gdGhlIG1pcnJvciBlbnRpdHkncyBjbGFzcyBuYW1lIGJlY2F1c2UgdGhlIGVudGl0eSB0eXBlIG11c3QKCSAqIGFsd2F5cyBtYXRjaCB0aGUgY2xhc3MgbmFtZQoJICovCgkkbWlycm9yRW50aXR5LT5lbnRpdHlUeXBlID0gJG1pcnJvckNsYXNzTmFtZTsKCglyZXR1cm4gYXJyYXkobnVsbCwgJG1pcnJvckVudGl0eSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgc2luZ2xldG9uIFdlYkRBViBzZXJ2ZXIgbGlicmFyeSBpbnN0YW5jZS4KICAgICAqCiAgICAgKiBJZiBpdCBkaWRuJ3QgbmVlZCBwYXRoIGFuZCBiYXNlVXJsLCB3ZSBjb3VsZCBlbGltaW5hdGUgYW5kIGNhbGwgbGlicmFyeSBtZXRob2RzIHN0YXRpY2x5LgogICAgICoKICAgICAqIEByZXR1cm4gb2JqZWN0IFdlYkRhdlNlcnZlciBpbnN0YW5jZQogICAgICovCiAgICBmdW5jdGlvbiAmZ2V0V2ViRGF2U2VydmVyKCkgewoJc3RhdGljICR3ZWJEYXZTZXJ2ZXI7CglpZiAoIWlzc2V0KCR3ZWJEYXZTZXJ2ZXIpKSB7CgkgICAgZ2xvYmFsICRnYWxsZXJ5OwoJICAgICR1cmxHZW5lcmF0b3IgPSYgJGdhbGxlcnktPmdldFVybEdlbmVyYXRvcigpOwoKCSAgICAkd2ViRGF2U2VydmVyID0gbmV3IFdlYkRhdlNlcnZlcigpOwoKCSAgICAvKgoJICAgICAqIE5lZWRlZCBieSBIVFRQX1dlYkRBVl9TZXJ2ZXI6OmNvcHltb3ZlX3JlcXVlc3RfaGVscGVyIGFuZAoJICAgICAqIEhUVFBfV2ViREFWX1NlcnZlcjo6X2NoZWNrX2lmX2hlYWRlcl9jb25kaXRpb25zCgkgICAgICovCgkgICAgJHBhdGggPSBHYWxsZXJ5VXRpbGl0aWVzOjpnZXRSZXF1ZXN0VmFyaWFibGVzKCdwYXRoJyk7CgkgICAgJHBhdGggPSB0cmltKCRwYXRoLCAnLycpOwoKCSAgICAkd2ViRGF2U2VydmVyLT5wYXRoID0gJHBhdGg7CgkgICAgJHdlYkRhdlNlcnZlci0+YmFzZVVybCA9IHBhcnNlX3VybCgkdXJsR2VuZXJhdG9yLT5nZW5lcmF0ZVVybCgKCQlhcnJheSgnY29udHJvbGxlcicgPT4gJ3dlYmRhdi5XZWJEYXYnKSwKCQlhcnJheSgnZm9yY2VGdWxsVXJsJyA9PiB0cnVlLAoJCSAgICAgICdodG1sRW50aXRpZXMnID0+IGZhbHNlLAoJCSAgICAgICdmb3JjZVNlc3Npb25JZCcgPT4gZmFsc2UsCgkJICAgICAgJ3VzZUF1dGhUb2tlbicgPT4gZmFsc2UpKSk7Cgl9CgoJcmV0dXJuICR3ZWJEYXZTZXJ2ZXI7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgYWN0aXZlIFdlYkRBViBsb2NrcyBhdCBzcGVjaWZpZWQgcGF0aC4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHBhdGgKICAgICAqIEBwYXJhbSBib29sZWFuICRnZXREZXNjZW5kZW50c0xvY2tzIChvcHRpb25hbCkgYWxzbyBnZXQgbG9ja3MgYXQgYW55IGRlc2NlbmRhbnQgcGF0aAogICAgICogQHJldHVybiBhcnJheSBvYmplY3QgR2FsbGVyeVN0YXR1cyBhIHN0YXR1cyBjb2RlCiAgICAgKiAgICAgICAgICAgICAgIGFycmF5IGFjdGl2ZSBXZWJEQVYgbG9ja3MgKHNjb3BlLCB0eXBlLCBkZXB0aCwgb3duZXIsIGV4cGlyZXMsIHRva2VuLCBwYXRoKQogICAgICovCiAgICBmdW5jdGlvbiBnZXRMb2NrcygkcGF0aCwgJGdldERlc2NlbmRlbnRzTG9ja3M9ZmFsc2UpIHsKCWdsb2JhbCAkZ2FsbGVyeTsKCgkvKiBXZSBoYXZlbid0IGRvbmUgYW55IGRhdGFiYXNlIGNhbGxzIHlldCwgc28gR2FsbGVyeVNxbEZyYWdtZW50IGlzbid0IGRlZmluZWQgKi8KCUdhbGxlcnlDb3JlQXBpOjpyZXF1aXJlT25jZSgnbW9kdWxlcy9jb3JlL2NsYXNzZXMvR2FsbGVyeVN0b3JhZ2UuY2xhc3MnKTsKCgkvKiBSZW1vdmUgc3RhbGUgbG9ja3MgKi8KCSRyZXQgPSBHYWxsZXJ5Q29yZUFwaTo6cmVtb3ZlTWFwRW50cnkoJ1dlYkRhdkxvY2tNYXAnLAoJICAgIGFycmF5KCdleHBpcmVzJyA9PiBuZXcgR2FsbGVyeVNxbEZyYWdtZW50KCc8ID8nLCB0aW1lKCkpKSk7CglpZiAoJHJldCkgewoJICAgIHJldHVybiBhcnJheSgkcmV0LCBudWxsKTsKCX0KCgkkZGF0YSA9IGFycmF5KCk7CgkkcXVlcnkgPSAnCgkgICAgU0VMRUNUCgkgICAgICBbV2ViRGF2TG9ja01hcDo6ZGVwdGhdLAoJICAgICAgW1dlYkRhdkxvY2tNYXA6Om93bmVyXSwKCSAgICAgIFtXZWJEYXZMb2NrTWFwOjpleHBpcmVzXSwKCSAgICAgIFtXZWJEYXZMb2NrTWFwOjp0b2tlbl0sCgkgICAgICBbV2ViRGF2TG9ja01hcDo6cGF0aF0KCSAgICBGUk9NCgkgICAgICBbV2ViRGF2TG9ja01hcF0KCSAgICBXSEVSRSc7CgoJLyoKCSAqIEhhY2tzIHRvIGdldCBhbmNlc3RvcnMnIGFuZCBkZXNjZW5kYW50cycgbG9ja3Mgd2lsbCBkaXNhcHBlYXIgd2l0aCBNUFRUIC0KCSAqIGh0dHA6Ly9jb2RleC5nYWxsZXJ5Mi5vcmcvaW5kZXgucGhwL0dhbGxlcnkyOk1vZGlmaWVkX1ByZW9yZGVyX1RyZWVfVHJhdmVyc2FsCgkgKi8KCWlmICgkZ2V0RGVzY2VuZGVudHNMb2NrcykgewoJICAgICRkYXRhW10gPSAiJHBhdGglIjsKCSAgICAkcXVlcnkgLj0gJwoJCSAgW1dlYkRhdkxvY2tNYXA6OnBhdGhdIExJS0UgPyc7Cgl9IGVsc2UgewoJICAgICRkYXRhW10gPSAkcGF0aDsKCSAgICAkcXVlcnkgLj0gJwoJCSAgW1dlYkRhdkxvY2tNYXA6OnBhdGhdID0gPyc7Cgl9CgoJJHBhdGhDb21wb25lbnRzID0gZXhwbG9kZSgnLycsICRwYXRoKTsKCSRjb3VudCA9IDA7CgoJLyogR2V0IGFuY2VzdG9ycycgbG9ja3MgKi8KCXdoaWxlIChhcnJheV9wb3AoJHBhdGhDb21wb25lbnRzKSAhPT0gbnVsbCkgewoJICAgICRkYXRhW10gPSBpbXBsb2RlKCcvJywgJHBhdGhDb21wb25lbnRzKTsKCSAgICAkY291bnQrKzsKCX0KCglpZiAoJGNvdW50KSB7CgkgICAgJHF1ZXJ5IC49ICcKCQlPUgoJCSAgKFtXZWJEYXZMb2NrTWFwOjpwYXRoXSBJTiAoJyAuIEdhbGxlcnlVdGlsaXRpZXM6Om1ha2VNYXJrZXJzKCRjb3VudCkKCQkgIC4gJykgQU5EIFtXZWJEYXZMb2NrTWFwOjpkZXB0aF0gPSBcJ2luZmluaXR5XCcpJzsKCX0KCglsaXN0ICgkcmV0LCAkcmVzdWx0cykgPSAkZ2FsbGVyeS0+c2VhcmNoKCRxdWVyeSwgJGRhdGEpOwoJaWYgKCRyZXQpIHsKCSAgICByZXR1cm4gYXJyYXkoJHJldCwgbnVsbCk7Cgl9CgoJJGxvY2tzID0gYXJyYXkoKTsKCXdoaWxlICgoJHJlc3VsdCA9ICRyZXN1bHRzLT5uZXh0UmVzdWx0KCkpICE9PSBmYWxzZSkgewoJICAgICRsb2Nrc1tdID0gYXJyYXkoJ3Njb3BlJyA9PiAnZXhjbHVzaXZlJywKCQkndHlwZScgPT4gJ3dyaXRlJywKCQknZGVwdGgnID0+ICRyZXN1bHRbMF0sCgkJJ293bmVyJyA9PiAkcmVzdWx0WzFdLAoJCSdleHBpcmVzJyA9PiAoaW50KSRyZXN1bHRbMl0sCgkJJ3Rva2VuJyA9PiAkcmVzdWx0WzNdLAoJCSdwYXRoJyA9PiAkcmVzdWx0WzRdKTsKCX0KCglyZXR1cm4gYXJyYXkobnVsbCwgJGxvY2tzKTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBhY3RpdmUgbG9ja3MgYXQgc3BlY2lmaWVkIHBhdGggb3IgYW55IGRlc2NlbmRhbnQgcGF0aC4KICAgICAqIEBzZWUgV2ViRGF2SGVscGVyOjpnZXRMb2NrcwogICAgICovCiAgICBmdW5jdGlvbiBnZXREZXNjZW5kZW50c0xvY2tzKCRwYXRoKSB7CglyZXR1cm4gV2ViRGF2SGVscGVyOjpnZXRMb2NrcygkcGF0aCwgdHJ1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGVjayBpZiB0aGVyZSBhcmUgbm8gYWN0aXZlIGxvY2tzIGF0IHRoZSBzcGVjaWZpZWQgcGF0aCwgb3IgdGhlIHJlcXVlc3QgbWF0Y2hlcyB0aGUgdG9rZW4gb2YKICAgICAqIHRoZSBhY3RpdmUgbG9jay4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHBhdGgKICAgICAqIEByZXR1cm4gYm9vbGVhbiBubyBhY3RpdmUgbG9ja3Mgb3IgdGhlIHJlcXVlc3QgbWF0Y2hlcyB0aGUgYWN0aXZlIGxvY2sKICAgICAqLwogICAgZnVuY3Rpb24gY2hlY2tMb2NrcygkcGF0aCkgewoJJHdlYkRhdlNlcnZlciA9JiBXZWJEYXZIZWxwZXI6OmdldFdlYkRhdlNlcnZlcigpOwoKICAgICAgICBsaXN0ICgkcmV0LCAkbG9ja3MpID0gV2ViRGF2SGVscGVyOjpnZXRMb2NrcygkcGF0aCk7CglpZiAoJHJldCkgewoJICAgIHJldHVybiAkcmV0OwoJfQoKCWlmICghZW1wdHkoJGxvY2tzKSAmJiAhJHdlYkRhdlNlcnZlci0+Y2hlY2tfbG9ja3NfaGVscGVyKCRsb2NrcywgJHBhdGgpKSB7CgkgICAgV2ViRGF2U2VydmVyOjpzZXRSZXNwb25zZVN0YXR1cygnNDIzIExvY2tlZCcpOwoJICAgIHJldHVybiBHYWxsZXJ5Q29yZUFwaTo6ZXJyb3IoRVJST1JfTE9DS19JTl9VU0UpOwoJfQogICAgfQoKICAgIC8qKgogICAgICogT1BUSU9OUyBoYW5kbGVyLgogICAgICogQHNlZSBIVFRQX1dlYkRBVl9TZXJ2ZXI6Om9wdGlvbnMKICAgICAqLwogICAgZnVuY3Rpb24gb3B0aW9ucygpIHsKCS8qIFRPRE86IENPUFkgbm90IGltcGxlbWVudGVkICovCglHYWxsZXJ5VXRpbGl0aWVzOjpzZXRSZXNwb25zZUhlYWRlcigKCSAgICAnQWxsb3c6IE9QVElPTlMsUFJPUEZJTkQsUFJPUFBBVENILE1LQ09MLEdFVCxIRUFELERFTEVURSxQVVQsTU9WRSxMT0NLLFVOTE9DSycpOwoJR2FsbGVyeVV0aWxpdGllczo6c2V0UmVzcG9uc2VIZWFkZXIoJ0RBVjogMSwyJyk7CglHYWxsZXJ5VXRpbGl0aWVzOjpzZXRSZXNwb25zZUhlYWRlcignQ29udGVudC1MZW5ndGg6IDAnKTsKCUdhbGxlcnlVdGlsaXRpZXM6OnNldFJlc3BvbnNlSGVhZGVyKCdNUy1BdXRob3ItVmlhOiBEQVYnKTsKICAgIH0KCiAgICAvKioKICAgICAqIFBST1BGSU5EIHJlcXVlc3QgaGVscGVyLgogICAgICoKICAgICAqIFdyYXBwZXIgYXJvdW5kIEhUVFBfV2ViREFWX1NlcnZlcjo6cHJvcGZpbmRfcmVxdWVzdF9oZWxwZXIgd2hpY2ggcHJlcGFyZXMgZGF0YS1zdHJ1Y3R1cmVzCiAgICAgKiBmcm9tIFBST1BGSU5EIHJlcXVlc3RzLgogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkgb2JqZWN0IEdhbGxlcnlTdGF0dXMgYSBzdGF0dXMgY29kZQogICAgICogICAgICAgICAgICAgICBhcnJheSBXZWJEQVYgbGlicmFyeSBvcHRpb25zCiAgICAgKiAgICAgICAgICAgICAgIGludCBtYXhpbXVtIGRlcHRoIG9mIGRlc2NlbmRhbnQgcGF0aHMKICAgICAqIEBzZWUgSFRUUF9XZWJEQVZfU2VydmVyOjpwcm9wZmluZF9yZXF1ZXN0X2hlbHBlcgogICAgICovCiAgICBmdW5jdGlvbiBwcm9wZmluZFJlcXVlc3RIZWxwZXIoKSB7Cgkkd2ViRGF2U2VydmVyID0mIFdlYkRhdkhlbHBlcjo6Z2V0V2ViRGF2U2VydmVyKCk7CgoJaWYgKCEkd2ViRGF2U2VydmVyLT5wcm9wZmluZF9yZXF1ZXN0X2hlbHBlcigkd2ViRGF2T3B0aW9ucykpIHsKCSAgICAvKiBXZWJEQVYgbGlicmFyeSBmb3VuZCBlcnJvciBpbiB0aGUgcmVxdWVzdCAqLwoJICAgIHJldHVybiBhcnJheShHYWxsZXJ5Q29yZUFwaTo6ZXJyb3IoRVJST1JfVU5LTk9XTiksIG51bGwsIG51bGwpOwoJfQoKCXJldHVybiBhcnJheShudWxsLCAkd2ViRGF2T3B0aW9ucywgJHdlYkRhdk9wdGlvbnNbJ2RlcHRoJ10pOwogICAgfQoKICAgIC8qKgogICAgICogUFJPUEZJTkQgcmVzcG9uc2UgaGVscGVyLgogICAgICoKICAgICAqIFdyYXBwZXIgYXJvdW5kIEhUVFBfV2ViREFWX1NlcnZlcjo6cHJvcGZpbmRfcmVzcG9uc2VfaGVscGVyIHdoaWNoIGZvcm1hdHMgUFJPUEZJTkQgcmVzcG9uc2VzLgogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkd2ViRGF2T3B0aW9ucyBXZWJEQVYgbGlicmFyeSBvcHRpb25zCiAgICAgKiBAcGFyYW0gYXJyYXkgJGZpbGVzIGZpbGVzIGZvciBXZWJEQVYgcmVzcG9uc2UgKHBhdGgsIHByb3BzKQogICAgICogQHBhcmFtIGFycmF5ICRuYW1lc3BhY2VzIG5hbWVzcGFjZXMgZm9yIFdlYkRBViByZXNwb25zZSAoVVJJID0+IHByZWZpeCkKICAgICAqIEBzZWUgSFRUUF9XZWJEQVZfU2VydmVyOjpwcm9wZmluZF9yZXNwb25zZV9oZWxwZXIKICAgICAqLwogICAgZnVuY3Rpb24gcHJvcGZpbmRSZXNwb25zZUhlbHBlcigkd2ViRGF2T3B0aW9ucywgJGZpbGVzLCAkbmFtZXNwYWNlcykgewoJJHdlYkRhdlNlcnZlciA9JiBXZWJEYXZIZWxwZXI6OmdldFdlYkRhdlNlcnZlcigpOwoJJHdlYkRhdk9wdGlvbnNbJ25hbWVzcGFjZXMnXSA9ICRuYW1lc3BhY2VzOwoJJHdlYkRhdlNlcnZlci0+cHJvcGZpbmRfcmVzcG9uc2VfaGVscGVyKCR3ZWJEYXZPcHRpb25zLCAkZmlsZXMpOwogICAgfQoKICAgIC8qKgogICAgICogUFJPUEZJTkQgaGFuZGxlci4KICAgICAqIEByZXR1cm4gb2JqZWN0IEdhbGxlcnlTdGF0dXMgc3RhdHVzIGNvZGUKICAgICAqLwogICAgZnVuY3Rpb24gcHJvcGZpbmQoKSB7CgkvKiBQcmVwYXJlIGRhdGEtc3RydWN0dXJlIGZyb20gUFJPUEZJTkQgcmVxdWVzdCAqLwoJbGlzdCAoJHJldCwgJHdlYkRhdk9wdGlvbnMsICRkZXB0aCkgPSBXZWJEYXZIZWxwZXI6OnByb3BmaW5kUmVxdWVzdEhlbHBlcigpOwoJaWYgKCRyZXQpIHsKCSAgICByZXR1cm4gJHJldDsKCX0KCgkkcGF0aCA9IEdhbGxlcnlVdGlsaXRpZXM6OmdldFJlcXVlc3RWYXJpYWJsZXMoJ3BhdGgnKTsKCSRwYXRoID0gdHJpbSgkcGF0aCwgJy8nKTsKCglpZiAoZW1wdHkoJHBhdGgpKSB7CgkgICAgbGlzdCAoJHJldCwgJGl0ZW1JZCkgPSBHYWxsZXJ5Q29yZUFwaTo6Z2V0RGVmYXVsdEFsYnVtSWQoKTsKCSAgICBpZiAoJHJldCkgewoJCXJldHVybiAkcmV0OwoJICAgIH0KCX0gZWxzZSB7CgkgICAgbGlzdCAoJHJldCwgJGl0ZW1JZCkgPSBHYWxsZXJ5Q29yZUFwaTo6ZmV0Y2hJdGVtSWRCeVBhdGgoJHBhdGgpOwoJICAgIGlmICgkcmV0KSB7CgkJcmV0dXJuICRyZXQ7CgkgICAgfQoJfQoKCWxpc3QgKCRyZXQsICRpdGVtKSA9IEdhbGxlcnlDb3JlQXBpOjpsb2FkRW50aXRpZXNCeUlkKCRpdGVtSWQpOwoJaWYgKCRyZXQpIHsKCSAgICByZXR1cm4gJHJldDsKCX0KCgkkZmlsZXMgPSBhcnJheSgpOwoJJHJldCA9IFdlYkRhdkhlbHBlcjo6X3Byb3BmaW5kRmlsZXMoJGl0ZW0sICRwYXRoLCAkZGVwdGgsICRmaWxlcyk7CglpZiAoJHJldCkgewoJICAgIHJldHVybiAkcmV0OwoJfQoKCSRuYW1lc3BhY2VzID0gYXJyYXkoV0VCREFWX0dBTExFUllfTkFNRVNQQUNFID0+ICdHJyk7CgoJLyogRm9ybWF0IFBST1BGSU5EIHJlc3BvbnNlICovCgkkcmV0ID0gV2ViRGF2SGVscGVyOjpwcm9wZmluZFJlc3BvbnNlSGVscGVyKCR3ZWJEYXZPcHRpb25zLCAkZmlsZXMsICRuYW1lc3BhY2VzKTsKCWlmICgkcmV0KSB7CgkgICAgcmV0dXJuICRyZXQ7Cgl9CiAgICB9CgogICAgLyoqCiAgICAgKiBQUk9QRklORCByZWN1cnNpdmUgZnVuY3Rpb24uCiAgICAgKgogICAgICogQnVpbGRzIGZpbGUgYXJyYXlzIChwYXRoLCBwcm9wcykgZnJvbSBpdGVtcyB1bnRpbCBkZXB0aCBpcyBleGhhdXN0ZWQuCiAgICAgKgogICAgICogQ291bGQgYmUgZG9uZSBpdGVyYXRpdmVseSwgYnV0IHdhaXRpbmcgZm9yIE1QVFQgZm9yIHRoZSB1bHRpbWF0ZSBzb2x1dGlvbiAtCiAgICAgKiBodHRwOi8vY29kZXguZ2FsbGVyeTIub3JnL2luZGV4LnBocC9HYWxsZXJ5MjpNb2RpZmllZF9QcmVvcmRlcl9UcmVlX1RyYXZlcnNhbAogICAgICoKICAgICAqIEBwYXJhbSBvYmplY3QgR2FsbGVyeUl0ZW0gJGl0ZW0KICAgICAqIEBwYXJhbSBzdHJpbmcgJHBhdGgKICAgICAqIEBwYXJhbSBpbnQgJGRlcHRoIG1heGltdW0gZGVwdGggb2YgZGVzY2VuZGFudCBwYXRocwogICAgICogQHBhcmFtIGFycmF5ICRmaWxlcyBmaWxlcyBmb3IgV2ViREFWIHJlc3BvbnNlIChwYXRoLCBwcm9wcykKICAgICAqIEByZXR1cm4gb2JqZWN0IEdhbGxlcnlTdGF0dXMgYSBzdGF0dXMgY29kZQogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9wcm9wZmluZEZpbGVzKCRpdGVtLCAkcGF0aCwgJGRlcHRoLCAmJGZpbGVzKSB7CgkvKiBWZXJpZnkgdGhhdCB0aGUgcHJvdmlkZWQgb2JqZWN0IGltcGxlbWVudHMgdGhlIHJlcXVpcmVkIG1ldGhvZHMgKi8KCWZvcmVhY2ggKGFycmF5KCdjcmVhdGlvblRpbWVzdGFtcCcsICd0aXRsZScsICdtb2RpZmljYXRpb25UaW1lc3RhbXAnLAoJCSdwYXRoQ29tcG9uZW50JykgYXMgJG1lbWJlck5hbWUpIHsKCSAgICBpZiAoIW1ldGhvZF9leGlzdHMoJGl0ZW0sICdnZXQnIC4gJG1lbWJlck5hbWUpKSB7CgkJcmV0dXJuIEdhbGxlcnlDb3JlQXBpOjplcnJvcihFUlJPUl9CQURfUEFSQU1FVEVSLCBfX0ZJTEVfXywgX19MSU5FX18sCgkJCSJJdGVtIG9iamVjdCBkb2VzIG5vdCBpbXBsZW1lbnQgYSBnZXR0ZXIgZm9yICckbWVtYmVyTmFtZSciKTsKCSAgICB9Cgl9CgoJJGZpbGUgPSBhcnJheSgncGF0aCcgPT4gJHBhdGgsICdwcm9wcycgPT4gYXJyYXkoKSk7CgoJLyogQnVpbGQgc3RhbmRhcmQgREFWOiBwcm9wZXJ0aWVzICovCgkkZmlsZVsncHJvcHMnXVtdID0gV2ViRGF2U2VydmVyOjpta3Byb3AoJ2NyZWF0aW9uZGF0ZScsICRpdGVtLT5nZXRDcmVhdGlvblRpbWVzdGFtcCgpKTsKCSRkaXNwbGF5TmFtZSA9ICRpdGVtLT5nZXRUaXRsZSgpOwoJaWYgKGVtcHR5KCRkaXNwbGF5TmFtZSkpIHsKCSAgICAkZGlzcGxheU5hbWUgPSAkaXRlbS0+Z2V0UGF0aENvbXBvbmVudCgpOwoJfQoJJGZpbGVbJ3Byb3BzJ11bXSA9IFdlYkRhdlNlcnZlcjo6bWtwcm9wKCdkaXNwbGF5bmFtZScsICRkaXNwbGF5TmFtZSk7CgkkZmlsZVsncHJvcHMnXVtdID0KCQlXZWJEYXZTZXJ2ZXI6Om1rcHJvcCgnZ2V0bGFzdG1vZGlmaWVkJywgJGl0ZW0tPmdldE1vZGlmaWNhdGlvblRpbWVzdGFtcCgpKTsKCgkvKgoJICogU3VwcG9ydCBleGNsdXNpdmUgd3JpdGUgbG9ja3MuCgkgKgoJICogQW55IERBViBjb21wbGlhbnQgcmVzb3VyY2UgdGhhdCBzdXBwb3J0cyB0aGUgTE9DSyBtZXRob2QgTVVTVCBzdXBwb3J0IHRoZSBzdXBwb3J0ZWRsb2NrCgkgKiBwcm9wZXJ0eS4KCSAqLwoJJGZpbGVbJ3Byb3BzJ11bXSA9IFdlYkRhdlNlcnZlcjo6bWtwcm9wKAoJICAgICdzdXBwb3J0ZWRsb2NrJywKCSAgICBhcnJheShhcnJheSgnc2NvcGUnID0+ICdleGNsdXNpdmUnLCAndHlwZScgPT4gJ3dyaXRlJykpKTsKCgkvKgoJICogV2ViRGF2SGVscGVyOjpnZXRMb2NrcyBpcyBwb3RlbnRpYWxseSBleHBlbnNpdmUuICBDb3VsZCBvcHRpbWl6ZSB0aGlzIGlmIHdlIGtuZXcKCSAqICR3ZWJEYXZPcHRpb25zWydwcm9wcyddIGRpZG4ndCBjb250YWluICdsb2NrZGlzY292ZXJ5JyBvciAnYWxscHJvcCcuCgkgKi8KCWxpc3QgKCRyZXQsICRsb2NrcykgPSBXZWJEYXZIZWxwZXI6OmdldExvY2tzKCRwYXRoKTsKCWlmICgkcmV0KSB7CgkgICAgcmV0dXJuICRyZXQ7Cgl9CgoJJGZpbGVbJ3Byb3BzJ11bXSA9IFdlYkRhdlNlcnZlcjo6bWtwcm9wKCdsb2NrZGlzY292ZXJ5JywgJGxvY2tzKTsKCglpZiAoR2FsbGVyeVV0aWxpdGllczo6aXNBKCRpdGVtLCAnR2FsbGVyeUFsYnVtSXRlbScpKSB7CgkgICAgaWYgKCFlbXB0eSgkcGF0aCkpIHsKCQkkZmlsZVsncGF0aCddID0gIiRwYXRoLyI7CgkgICAgfQoKCSAgICAkZmlsZVsncHJvcHMnXVtdID0gV2ViRGF2U2VydmVyOjpta3Byb3AoJ2dldGNvbnRlbnRsZW5ndGgnLCAwKTsKCSAgICAkZmlsZVsncHJvcHMnXVtdID0gV2ViRGF2U2VydmVyOjpta3Byb3AoJ2dldGNvbnRlbnR0eXBlJywgJ2h0dHBkL3VuaXgtZGlyZWN0b3J5Jyk7CgkgICAgJGZpbGVbJ3Byb3BzJ11bXSA9IFdlYkRhdlNlcnZlcjo6bWtwcm9wKCdyZXNvdXJjZXR5cGUnLCAnY29sbGVjdGlvbicpOwoJfSBlbHNlIHsKCSAgICAkc2l6ZSA9IDA7CgkgICAgaWYgKG1ldGhvZF9leGlzdHMoJGl0ZW0sICdnZXRTaXplJykpIHsKCQkkc2l6ZSA9ICRpdGVtLT5nZXRTaXplKCk7CgkgICAgfQoJICAgICRtaW1lVHlwZSA9ICdhcHBsaWNhdGlvbi91bmtub3duJzsKCSAgICBpZiAobWV0aG9kX2V4aXN0cygkaXRlbSwgJ2dldE1pbWVUeXBlJykpIHsKCQkkbWltZVR5cGUgPSAkaXRlbS0+Z2V0TWltZVR5cGUoKTsKCSAgICB9CgkgICAgJGZpbGVbJ3Byb3BzJ11bXSA9IFdlYkRhdlNlcnZlcjo6bWtwcm9wKCdnZXRjb250ZW50bGVuZ3RoJywgJHNpemUpOwoJICAgICRmaWxlWydwcm9wcyddW10gPSBXZWJEYXZTZXJ2ZXI6Om1rcHJvcCgnZ2V0Y29udGVudHR5cGUnLCAkbWltZVR5cGUpOwoJICAgICRmaWxlWydwcm9wcyddW10gPSBXZWJEYXZTZXJ2ZXI6Om1rcHJvcCgncmVzb3VyY2V0eXBlJywgbnVsbCk7Cgl9CgoJLyogQnVpbGQgR2FsbGVyeSBwcm9wZXJ0aWVzICovCglpZiAobWV0aG9kX2V4aXN0cygkaXRlbSwgJ2dldENsYXNzTmFtZScpKSB7CgkgICAgbGlzdCAoJHJldCwgJG1lbWJlckluZm8pID0KCQlHYWxsZXJ5Q29yZUFwaTo6Z2V0RXh0ZXJuYWxBY2Nlc3NNZW1iZXJMaXN0KCRpdGVtLT5nZXRDbGFzc05hbWUoKSk7CgkgICAgaWYgKCRyZXQpIHsKCQlyZXR1cm4gJHJldDsKCSAgICB9CgoJICAgIC8qIEtlZXAgdHJhY2sgb2YgdGhlIHByb3BlcnRpZXMgdGhhdCB3ZSBhZGQgdG8gcHJldmVudCByZXBldGl0aW9uICovCgkgICAgJGRlZmF1bHRNZW1iZXJzID0gYXJyYXkoJ3BhdGhDb21wb25lbnQnLCAnY3JlYXRpb25UaW1lc3RhbXAnLCAndGl0bGUnLAoJCQkJICAgICdtb2RpZmljYXRpb25UaW1lc3RhbXAnLCAnbWltZVR5cGUnLCAnc2l6ZScpOwoJICAgIGZvcmVhY2ggKCRtZW1iZXJJbmZvIGFzICRtZW1iZXJOYW1lID0+ICRhY2Nlc3NJbmZvKSB7CgkJJGdldHRlciA9ICdnZXQnIC4gJG1lbWJlck5hbWU7CgkJLyogT25seSBzaG93IHByb3BlcnRpZXMgdGhhdCBhcmUgbm90IGludGVuZGVkIGZvciBpbnRlcm5hbCB1c2Ugb25seSAqLwoJCWlmICgkYWNjZXNzSW5mb1sncmVhZCddICYmICFpbl9hcnJheSgkbWVtYmVyTmFtZSwgJGRlZmF1bHRNZW1iZXJzKQoJCQkmJiBtZXRob2RfZXhpc3RzKCRpdGVtLCAkZ2V0dGVyKSkgewoJCSAgICAkdmFsdWUgPSAkaXRlbS0+JGdldHRlcigpOwoJCSAgICAvKiBJZ25vcmUgYXJyYXkgdmFsdWVkIHByb3BlcnRpZXMgKi8KCQkgICAgaWYgKCFpc19hcnJheSgkdmFsdWUpICYmICFpc19vYmplY3QoJHZhbHVlKSkgewoJCQkkZmlsZVsncHJvcHMnXVtdID0gV2ViRGF2U2VydmVyOjpta3Byb3AoV0VCREFWX0dBTExFUllfTkFNRVNQQUNFLAoJCQkJCQkJCSRtZW1iZXJOYW1lLCAkdmFsdWUpOwoJCSAgICB9CgkJfQoJICAgIH0KCX0KCgkkZmlsZXNbXSA9ICRmaWxlOwoKCWlmICgkZGVwdGggPD0gMCkgewoJICAgIHJldHVybiBudWxsOwoJfQoKCWxpc3QgKCRyZXQsICRjaGlsZElkcykgPSBHYWxsZXJ5Q29yZUFwaTo6ZmV0Y2hDaGlsZEl0ZW1JZHMoJGl0ZW0pOwoJaWYgKCRyZXQpIHsKCSAgICByZXR1cm4gJHJldDsKCX0KCglpZiAoZW1wdHkoJGNoaWxkSWRzKSkgewoJICAgIHJldHVybiBudWxsOwoJfQoKCWxpc3QgKCRyZXQsICRjaGlsZEl0ZW1zKSA9IEdhbGxlcnlDb3JlQXBpOjpsb2FkRW50aXRpZXNCeUlkKCRjaGlsZElkcyk7CglpZiAoJHJldCkgewoJICAgIHJldHVybiAkcmV0OwoJfQoKCWZvcmVhY2ggKCRjaGlsZEl0ZW1zIGFzICRjaGlsZEl0ZW0pIHsKCSAgICAvKiBDb3VsZCB3ZSBzaW1wbHkgdXNlIHNvbWV0aGluZyBsaWtlICRjaGlsZEl0ZW0tPmZldGNoTG9naWNhbFBhdGg/ICovCgkgICAgJGNoaWxkUGF0aCA9ICRjaGlsZEl0ZW0tPmdldFBhdGhDb21wb25lbnQoKTsKCSAgICBpZiAoIWVtcHR5KCRwYXRoKSkgewoJCSRjaGlsZFBhdGggPSAiJHBhdGgvIiAuICRjaGlsZFBhdGg7CgkgICAgfQoKCSAgICAkcmV0ID0gV2ViRGF2SGVscGVyOjpfcHJvcGZpbmRGaWxlcygkY2hpbGRJdGVtLCAkY2hpbGRQYXRoLCAkZGVwdGggLSAxLCAkZmlsZXMpOwoJICAgIGlmICgkcmV0KSB7CgkJcmV0dXJuICRyZXQ7CgkgICAgfQoJfQoKCXJldHVybiBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogUFJPUFBBVENIIHJlcXVlc3QgaGVscGVyLgogICAgICoKICAgICAqIFdyYXBwZXIgYXJvdW5kIEhUVFBfV2ViREFWX1NlcnZlcjo6cHJvcHBhdGNoX3JlcXVlc3RfaGVscGVyIHdoaWNoIHByZXBhcmVzIGRhdGEtc3RydWN0dXJlcwogICAgICogZnJvbSBQUk9QUEFUQ0ggcmVxdWVzdHMuCiAgICAgKgogICAgICogQHJldHVybiBhcnJheSBvYmplY3QgR2FsbGVyeVN0YXR1cyBhIHN0YXR1cyBjb2RlCiAgICAgKiAgICAgICAgICAgICAgIGFycmF5IFdlYkRBViBsaWJyYXJ5IG9wdGlvbnMKICAgICAqICAgICAgICAgICAgICAgYXJyYXkgcHJvcGVydGllcyB0byBzZXQgKG5zID0+IG5hbWVzcGFjZSwgbmFtZSA9PiBuYW1lLCB2YWwgPT4gdmFsdWUpCiAgICAgKiBAc2VlIEhUVFBfV2ViREFWX1NlcnZlcjo6cHJvcHBhdGNoX3JlcXVlc3RfaGVscGVyCiAgICAgKi8KICAgIGZ1bmN0aW9uIHByb3BwYXRjaFJlcXVlc3RIZWxwZXIoKSB7Cgkkd2ViRGF2U2VydmVyID0mIFdlYkRhdkhlbHBlcjo6Z2V0V2ViRGF2U2VydmVyKCk7CgoJaWYgKCEkd2ViRGF2U2VydmVyLT5wcm9wcGF0Y2hfcmVxdWVzdF9oZWxwZXIoJHdlYkRhdk9wdGlvbnMpKSB7CgkgICAgLyogV2ViREFWIGxpYnJhcnkgZm91bmQgZXJyb3IgaW4gdGhlIHJlcXVlc3QgKi8KCSAgICByZXR1cm4gYXJyYXkoR2FsbGVyeUNvcmVBcGk6OmVycm9yKEVSUk9SX1VOS05PV04pLCBudWxsLCBudWxsKTsKCX0KCglyZXR1cm4gYXJyYXkobnVsbCwgJHdlYkRhdk9wdGlvbnMsICR3ZWJEYXZPcHRpb25zWydwcm9wcyddKTsKICAgIH0KCiAgICAvKioKICAgICAqIFBST1BQQVRDSCByZXNwb25zZSBoZWxwZXIuCiAgICAgKgogICAgICogV3JhcHBlciBhcm91bmQgSFRUUF9XZWJEQVZfU2VydmVyOjpwcm9wcGF0Y2hfcmVzcG9uc2VfaGVscGVyIHdoaWNoIGZvcm1hdHMgUFJPUFBBVENICiAgICAgKiByZXNwb25zZXMuCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICR3ZWJEYXZPcHRpb25zIFdlYkRBViBsaWJyYXJ5IG9wdGlvbnMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHBhdGgKICAgICAqIEBwYXJhbSBhcnJheSAkcHJvcHMgcHJvcGVydGllcyBzZXQgKG5zID0+IG5hbWVzcGFjZSwKICAgICAJCQkJCSAgIG5hbWUgPT4gbmFtZSwKCQkJCQkgICB2YWwgPT4gdmFsdWUsCgkJCQkJICAgc3RhdHVzID0+IHN0YXR1cykKICAgICAqIEBwYXJhbSBhcnJheSAkbmFtZXNwYWNlIG5hbWVzcGFjZXMgZm9yIFdlYkRBViByZXNwb25zZSAoVVJJID0+IHByZWZpeCkKICAgICAqIEBzZWUgSFRUUF9XZWJEQVZfU2VydmVyOjpwcm9wcGF0Y2hfcmVzcG9uc2VfaGVscGVyCiAgICAgKi8KICAgIGZ1bmN0aW9uIHByb3BwYXRjaFJlc3BvbnNlSGVscGVyKCR3ZWJEYXZPcHRpb25zLCAkcGF0aCwgJHByb3BzLCAkbmFtZXNwYWNlcykgewoJJHdlYkRhdlNlcnZlciA9JiBXZWJEYXZIZWxwZXI6OmdldFdlYkRhdlNlcnZlcigpOwoJJHdlYkRhdk9wdGlvbnNbJ3BhdGgnXSA9ICRwYXRoOwoJJHdlYkRhdk9wdGlvbnNbJ3Byb3BzJ10gPSAkcHJvcHM7Cgkkd2ViRGF2T3B0aW9uc1snbmFtZXNwYWNlcyddID0gJG5hbWVzcGFjZXM7Cgkkd2ViRGF2U2VydmVyLT5wcm9wcGF0Y2hfcmVzcG9uc2VfaGVscGVyKCR3ZWJEYXZPcHRpb25zKTsKICAgIH0KCiAgICAvKioKICAgICAqIFBST1BQQVRDSCBoYW5kbGVyLgogICAgICogQHJldHVybiBvYmplY3QgR2FsbGVyeVN0YXR1cyBhIHN0YXR1cyBjb2RlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHByb3BwYXRjaCgpIHsKCSRwYXRoID0gR2FsbGVyeVV0aWxpdGllczo6Z2V0UmVxdWVzdFZhcmlhYmxlcygncGF0aCcpOwoJJHBhdGggPSB0cmltKCRwYXRoLCAnLycpOwoKCS8qIENoZWNrIHJlc291cmNlIGlzIG5vdCBsb2NrZWQgKi8KCSRyZXQgPSBXZWJEYXZIZWxwZXI6OmNoZWNrTG9ja3MoJHBhdGgpOwoJaWYgKCRyZXQpIHsKCSAgICByZXR1cm4gJHJldDsKCX0KCglpZiAoZW1wdHkoJHBhdGgpKSB7CgkgICAgbGlzdCAoJHJldCwgJGl0ZW1JZCkgPSBHYWxsZXJ5Q29yZUFwaTo6Z2V0RGVmYXVsdEFsYnVtSWQoKTsKCSAgICBpZiAoJHJldCkgewoJCXJldHVybiAkcmV0OwoJICAgIH0KCX0gZWxzZSB7CgkgICAgbGlzdCAoJHJldCwgJGl0ZW1JZCkgPSBHYWxsZXJ5Q29yZUFwaTo6ZmV0Y2hJdGVtSWRCeVBhdGgoJHBhdGgpOwoJICAgIGlmICgkcmV0KSB7CgkJcmV0dXJuICRyZXQ7CgkgICAgfQoJfQoKCWxpc3QgKCRyZXQsICRpdGVtKSA9IEdhbGxlcnlDb3JlQXBpOjpsb2FkRW50aXRpZXNCeUlkKCRpdGVtSWQpOwoJaWYgKCRyZXQpIHsKCSAgICByZXR1cm4gJHJldDsKCX0KCgkvKiBQcmVwYXJlIGRhdGEtc3RydWN0dXJlIGZyb20gUFJPUFBBVENIIHJlcXVlc3QgKi8KCWxpc3QgKCRyZXQsICR3ZWJEYXZPcHRpb25zLCAkcHJvcHMpID0gV2ViRGF2SGVscGVyOjpwcm9wcGF0Y2hSZXF1ZXN0SGVscGVyKCk7CglpZiAoJHJldCkgewoJICAgIHJldHVybiAkcmV0OwoJfQoKCWxpc3QgKCRyZXQsICRsb2NrSWQpID0gR2FsbGVyeUNvcmVBcGk6OmFjcXVpcmVXcml0ZUxvY2soJGl0ZW1JZCk7CglpZiAoJHJldCkgewoJICAgIHJldHVybiAkcmV0OwoJfQoKCSRyZXQgPSBXZWJEYXZIZWxwZXI6Ol9zZXRJdGVtUHJvcHMoJGl0ZW0sICRwcm9wcyk7CglpZiAoJHJldCkgewoJICAgIHJldHVybiAkcmV0OwoJfQoKCWlmICgkaXRlbS0+aXNNb2RpZmllZCgpKSB7CgkgICAgJHJldCA9ICRpdGVtLT5zYXZlKCk7CgkgICAgaWYgKCRyZXQpIHsKCQlHYWxsZXJ5Q29yZUFwaTo6cmVsZWFzZUxvY2tzKCRsb2NrSWQpOwoJCXJldHVybiAkcmV0OwoJICAgIH0KCX0KCgkkcmV0ID0gR2FsbGVyeUNvcmVBcGk6OnJlbGVhc2VMb2NrcygkbG9ja0lkKTsKCWlmICgkcmV0KSB7CgkgICAgcmV0dXJuICRyZXQ7Cgl9CgoJJG5hbWVzcGFjZXMgPSBhcnJheShXRUJEQVZfR0FMTEVSWV9OQU1FU1BBQ0UgPT4gJ0cnKTsKCgkvKiBGb3JtYXQgUFJPUFBBVENIIHJlc3BvbnNlICovCgkkcmV0ID0gV2ViRGF2SGVscGVyOjpwcm9wcGF0Y2hSZXNwb25zZUhlbHBlcigkd2ViRGF2T3B0aW9ucywgJHBhdGgsICRwcm9wcywgJG5hbWVzcGFjZXMpOwoJaWYgKCRyZXQpIHsKCSAgICByZXR1cm4gJHJldDsKCX0KCglyZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBpdGVtIHByb3BlcnRpZXMKICAgICAqIEBwYXJhbSBvYmplY3QgR2FsbGVyeUl0ZW0gcmVmZXJlbmNlICRpdGVtCiAgICAgKiBAcGFyYW0gYXJyYXkgcmVmZXJlbmNlICRwcm9wb3MgREFWIGZpbGUgcHJvcGVydGllcwogICAgICogQHJldHVybiBvYmplY3QgR2FsbGVyeVN0YXR1cyBhIHN0YXR1cyBjb2RlCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9zZXRJdGVtUHJvcHMoJiRpdGVtLCAmJHByb3BzKSB7CglpZiAoIW1ldGhvZF9leGlzdHMoJGl0ZW0sICdnZXRDbGFzc05hbWUnKSkgewoJICAgIHJldHVybiBHYWxsZXJ5Q29yZUFwaTo6ZXJyb3IoRVJST1JfQkFEX1BBUkFNRVRFUik7Cgl9CgoJbGlzdCAoJHJldCwgJG1lbWJlckluZm8pID0KCQlHYWxsZXJ5Q29yZUFwaTo6Z2V0RXh0ZXJuYWxBY2Nlc3NNZW1iZXJMaXN0KCRpdGVtLT5nZXRDbGFzc05hbWUoKSk7CglpZiAoJHJldCkgewoJICAgIHJldHVybiAkcmV0OwoJfQoKCWZvcmVhY2ggKCRwcm9wcyBhcyAka2V5ID0+ICRwcm9wKSB7CgkgICAgJG5hbWUgPSAkcHJvcFsnbmFtZSddOwoJICAgIGlmICgkcHJvcFsnbnMnXSA9PSAnREFWOicpIHsKCQlpZiAoJHByb3BbJ25hbWUnXSA9PSAnZGlzcGxheW5hbWUnKSB7CgkJICAgICRuYW1lID0gJ3RpdGxlJzsKCQkgICAgLyogV2FudCB0byBzdXBwb3J0IGFueSBvdGhlciBEQVY6IHByb3BlcnRpZXM/ICovCgkJfSBlbHNlIHsKCQkgICAgJHByb3BzWyRrZXldWydzdGF0dXMnXSA9ICc0MDMgRm9yYmlkZGVuJzsKCQkgICAgY29udGludWU7CgkJfQoJICAgIH0gZWxzZSBpZiAoJHByb3BbJ25zJ10gIT0gV0VCREFWX0dBTExFUllfTkFNRVNQQUNFKSB7CgkJJHByb3BzWyRrZXldWydzdGF0dXMnXSA9ICc0MDMgRm9yYmlkZGVuJzsKCQljb250aW51ZTsKCSAgICB9CgoJICAgICRzZXR0ZXIgPSAnc2V0JyAuICRuYW1lOwoJICAgIGlmICghaXNzZXQoJG1lbWJlckluZm9bJG5hbWVdKXx8ICEkbWVtYmVySW5mb1skbmFtZV1bJ3dyaXRlJ10KCQkgICAgfHwgIW1ldGhvZF9leGlzdHMoJGl0ZW0sICRzZXR0ZXIpKSB7CgkJJHByb3BzWyRrZXldWydzdGF0dXMnXSA9ICc0MDMgRm9yYmlkZGVuJzsKCQljb250aW51ZTsKCSAgICB9CgoJICAgICRpdGVtLT4kc2V0dGVyKCRwcm9wWyd2YWx1ZSddKTsKCX0KCXJldHVybiBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogVmFsaWRhdGUgTUtDT0wgcmVxdWVzdHMuCiAgICAgKgogICAgICogQ29waWVkIGZyb20gSXRlbUFkZEFsYnVtQ29udHJvbGxlcjo6aGFuZGxlUmVxdWVzdCBmb3IgY29uc2lzdGFuY3kuICBNYXliZSBldmVudHVhbGx5IHNob3VsZAogICAgICogZ28gaW4gSXRlbUFkZEFsYnVtQ29udHJvbGxlcjo6dmFsaWRhdGVSZXF1ZXN0IG9yIGEgR2FsbGVyeUNvcmVBcGkgbWV0aG9kLgogICAgICoKICAgICAqIEBwYXJhbSBpbnQgJHBhcmVudElkIGlkIG9mIHBhcmVudCBhbGJ1bQogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aENvbXBvbmVudCBwYXRoIGNvbXBvbmVudCBvZiBuZXcgYWxidW0KICAgICAqIEByZXR1cm4gYXJyYXkgb2JqZWN0IEdhbGxlcnlTdGF0dXMgYSBzdGF0dXMgY29kZQogICAgICogICAgICAgICAgICAgICBhcnJheSBlcnJvciBzdHJpbmdzCiAgICAgKiBAc2VlIEl0ZW1BZGRBbGJ1bUNvbnRyb2xsZXI6OmhhbmRsZVJlcXVlc3QKICAgICAqLwogICAgZnVuY3Rpb24gbWtjb2xWYWxpZGF0ZUhlbHBlcigkcGFyZW50SWQsICRwYXRoQ29tcG9uZW50KSB7CglnbG9iYWwgJGdhbGxlcnk7CgkkcGxhdGZvcm0gPSYgJGdhbGxlcnktPmdldFBsYXRmb3JtKCk7CgoJJGVycm9yID0gYXJyYXkoKTsKCgkvKiBNYWtlIHN1cmUgd2UgaGF2ZSBwZXJtaXNzaW9uIGRvIGVkaXQgdGhpcyBpdGVtICovCgkkcmV0ID0gR2FsbGVyeUNvcmVBcGk6OmFzc2VydEhhc0l0ZW1QZXJtaXNzaW9uKCRwYXJlbnRJZCwgJ2NvcmUuYWRkQWxidW1JdGVtJyk7CglpZiAoJHJldCkgewoJICAgIHJldHVybiBhcnJheSgkcmV0LCBudWxsKTsKCX0KCglpZiAoZW1wdHkoJHBhdGhDb21wb25lbnQpKSB7CgkgICAgJGVycm9yW10gPSAnZm9ybVtlcnJvcl1bcGF0aENvbXBvbmVudF1bbWlzc2luZ10nOwoJfSBlbHNlIGlmICghJHBsYXRmb3JtLT5pc0xlZ2FsUGF0aENvbXBvbmVudCgkcGF0aENvbXBvbmVudCkpIHsKCSAgICAkZXJyb3JbXSA9ICdmb3JtW2Vycm9yXVtwYXRoQ29tcG9uZW50XVtpbnZhbGlkXSc7Cgl9CgoJcmV0dXJuIGFycmF5KG51bGwsICRlcnJvcik7CiAgICB9CgogICAgLyoqCiAgICAgKiBNS0NPTCBoZWxwZXIuCiAgICAgKgogICAgICogQWNxdWlyZSBsb2NrcywgY3JlYXRlIGFsYnVtIGFuZCBzZXQgcGVybWlzc2lvbnMuCiAgICAgKgogICAgICogQ29waWVkIGZyb20gSXRlbUFkZEFsYnVtQ29udHJvbGxlcjo6aGFuZGxlUmVxdWVzdCBmb3IgY29uc2lzdGFuY3kuICBNYXliZSBldmVudHVhbGx5IHNob3VsZAogICAgICogZ28gaW4gSXRlbUFkZEFsYnVtQ29udHJvbGxlcjo6cmVxdWVzdEhlbHBlciBvciBhIEdhbGxlcnlDb3JlQXBpIG1ldGhvZC4KICAgICAqCiAgICAgKiBAcGFyYW0gaW50ICRwYXJlbnRJZCBpZCBvZiBwYXJlbnQgYWxidW0KICAgICAqIEBwYXJhbSBzdHJpbmcgJHBhdGhDb21wb25lbnQgcGF0aCBjb21wb25lbnQgb2YgbmV3IGFsYnVtCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0aXRsZSB0aXRsZSBvZiBuZXcgYWxidW0KICAgICAqIEBwYXJhbSBzdHJpbmcgJHN1bW1hcnkgc3VtbWFyeSBvZiBuZXcgYWxidW0KICAgICAqIEBwYXJhbSBzdHJpbmcgJGRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uIG9mIG5ldyBhbGJ1bQogICAgICogQHBhcmFtIGFycmF5ICRrZXl3b3JkcyBrZXl3b3JkcyBvZiBuZXcgYWxidW0KICAgICAqIEByZXR1cm4gb2JqZWN0IEdhbGxlcnlTdGF0dXMgYSBzdGF0dXMgY29kZQogICAgICogQHNlZSBJdGVtQWRkQWxidW1Db250cm9sbGVyOjpoYW5kbGVSZXF1ZXN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIG1rY29sSGVscGVyKCRwYXJlbnRJZCwgJHBhdGhDb21wb25lbnQsICR0aXRsZSwgJHN1bW1hcnksICRkZXNjcmlwdGlvbiwgJGtleXdvcmRzKSB7CglsaXN0ICgkcmV0LCAkbG9ja0lkc1tdKSA9IEdhbGxlcnlDb3JlQXBpOjphY3F1aXJlUmVhZExvY2soJHBhcmVudElkKTsKCWlmICgkcmV0KSB7CgkgICAgcmV0dXJuICRyZXQ7Cgl9CgoJbGlzdCAoJHJldCwgJGFsYnVtSXRlbSkgPSBHYWxsZXJ5Q29yZUFwaTo6Y3JlYXRlQWxidW0oJHBhcmVudElkLCAkcGF0aENvbXBvbmVudCwKCSAgICAkdGl0bGUsICRzdW1tYXJ5LCAkZGVzY3JpcHRpb24sICRrZXl3b3Jkcyk7CglpZiAoJHJldCkgewoJICAgIEdhbGxlcnlDb3JlQXBpOjpyZWxlYXNlTG9ja3MoJGxvY2tJZHMpOwoJICAgIHJldHVybiAkcmV0OwoJfQoKCWlmICghaXNzZXQoJGFsYnVtSXRlbSkpIHsKCSAgICBHYWxsZXJ5Q29yZUFwaTo6cmVsZWFzZUxvY2tzKCRsb2NrSWRzKTsKCSAgICByZXR1cm4gR2FsbGVyeUNvcmVBcGk6OmVycm9yKEVSUk9SX01JU1NJTkdfT0JKRUNUKTsKCX0KCgkkcmV0ID0gR2FsbGVyeUNvcmVBcGk6OmFkZFVzZXJQZXJtaXNzaW9uKCRhbGJ1bUl0ZW0tPmdldElkKCksICRhbGJ1bUl0ZW0tPmdldE93bmVySWQoKSwKCSAgICAnY29yZS5hbGwnLCBmYWxzZSk7CglpZiAoJHJldCkgewoJICAgIEdhbGxlcnlDb3JlQXBpOjpyZWxlYXNlTG9ja3MoJGxvY2tJZHMpOwoJICAgIHJldHVybiAkcmV0OwoJfQoKCSRyZXQgPSBHYWxsZXJ5Q29yZUFwaTo6cmVsZWFzZUxvY2tzKCRsb2NrSWRzKTsKCWlmICgkcmV0KSB7CgkgICAgcmV0dXJuICRyZXQ7Cgl9CiAgICB9CgogICAgLyoqCiAgICAgKiBNS0NPTCBoYW5kbGVyLgogICAgICogQHJldHVybiBvYmplY3QgR2FsbGVyeVN0YXR1cyBhIHN0YXR1cyBjb2RlCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1rY29sKCkgewoJLyogQm9keSBwYXJzaW5nIG5vdCB5ZXQgc3VwcG9ydGVkICovCglpZiAoR2FsbGVyeVV0aWxpdGllczo6Z2V0U2VydmVyVmFyKCdDT05URU5UX0xFTkdUSCcpKSB7CgkgICAgLyoKCSAgICAgKiA0MTUgKFVuc3VwcG9ydGVkIE1lZGlhIFR5cGUpIC0gVGhlIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSByZXF1ZXN0IHR5cGUgb2YgdGhlCgkgICAgICogYm9keS4KCSAgICAgKi8KCSAgICBXZWJEYXZTZXJ2ZXI6OnNldFJlc3BvbnNlU3RhdHVzKCc0MTUgVW5zdXBwb3J0ZWQgTWVkaWEgVHlwZScpOwoJICAgIHJldHVybiBHYWxsZXJ5Q29yZUFwaTo6ZXJyb3IoRVJST1JfQkFEX1BBUkFNRVRFUik7Cgl9CgoJJHBhdGggPSBHYWxsZXJ5VXRpbGl0aWVzOjpnZXRSZXF1ZXN0VmFyaWFibGVzKCdwYXRoJyk7CgkkcGF0aCA9IHRyaW0oJHBhdGgsICcvJyk7CgoJbGlzdCAoJHJldCwgJGl0ZW1JZCkgPSBHYWxsZXJ5Q29yZUFwaTo6ZmV0Y2hJdGVtSWRCeVBhdGgoJHBhdGgpOwoJaWYgKCRyZXQgJiYgISgkcmV0LT5nZXRFcnJvckNvZGUoKSAmIEVSUk9SX01JU1NJTkdfT0JKRUNUKSkgewoJICAgIHJldHVybiAkcmV0OwoJfQoJaWYgKCEkcmV0KSB7CgkgICAgLyoKCSAgICAgKiA0MDUgKE1ldGhvZCBOb3QgQWxsb3dlZCkgLSBNS0NPTCBjYW4gb25seSBiZSBleGVjdXRlZCBvbiBhIGRlbGV0ZWQvbm9uLWV4aXN0ZW50CgkgICAgICogcmVzb3VyY2UuCgkgICAgICovCgkgICAgV2ViRGF2U2VydmVyOjpzZXRSZXNwb25zZVN0YXR1cygnNDA1IE1ldGhvZCBOb3QgQWxsb3dlZCcpOwoJICAgIHJldHVybiBHYWxsZXJ5Q29yZUFwaTo6ZXJyb3IoRVJST1JfQ09MTElTSU9OKTsKCX0KCgkkcGF0aENvbXBvbmVudCA9IGJhc2VuYW1lKCRwYXRoKTsKCglsaXN0ICgkcmV0LCAkcGFyZW50SWQpID0gV2ViRGF2SGVscGVyOjpnZXRQYXJlbnRJdGVtSWRCeVBhdGgoJHBhdGgpOwoJaWYgKCRyZXQpIHsKCSAgICBpZiAoJHJldC0+Z2V0RXJyb3JDb2RlKCkgJiBFUlJPUl9NSVNTSU5HX09CSkVDVCkgewoJCS8qCgkJICogNDA5IChDb25mbGljdCkgLSBBIHJlc291cmNlIGNhbm5vdCBiZSBjcmVhdGVkIGF0IHRoZSBkZXN0aW5hdGlvbiB1bnRpbCBvbmUgb3IKCQkgKiBtb3JlIGludGVybWVkaWF0ZSBjb2xsZWN0aW9ucyBoYXZlIGJlZW4gY3JlYXRlZC4KCQkgKi8KCQlXZWJEYXZTZXJ2ZXI6OnNldFJlc3BvbnNlU3RhdHVzKCc0MDkgQ29uZmxpY3QnKTsKCSAgICB9CgkgICAgcmV0dXJuICRyZXQ7Cgl9CgoJbGlzdCAoJHJldCwgJGVycm9yKSA9IFdlYkRhdkhlbHBlcjo6bWtjb2xWYWxpZGF0ZUhlbHBlcigkcGFyZW50SWQsICRwYXRoQ29tcG9uZW50KTsKCWlmICgkcmV0KSB7CgkgICAgcmV0dXJuICRyZXQ7Cgl9CgoJaWYgKCFlbXB0eSgkZXJyb3IpKSB7CgkgICAgZm9yZWFjaCAoJGVycm9yIGFzICRlcnJvcikgewoJCWlmICghc3RycG9zKCRlcnJvciwgJ3Blcm1pc3Npb24nKSkgewoJCSAgICByZXR1cm4gR2FsbGVyeUNvcmVBcGk6OmVycm9yKEVSUk9SX0JBRF9QQVJBTUVURVIpOwoJCX0KCSAgICB9CgoJICAgIC8qIElmIGFsbCBlcnJvcnMgd2VyZSBwZXJtaXNzaW9uIGRlbmllZCByZXR1cm4gbW9yZSBzcGVjaWZpYyBlcnJvciAqLwoJICAgIHJldHVybiBHYWxsZXJ5Q29yZUFwaTo6ZXJyb3IoRVJST1JfUEVSTUlTU0lPTl9ERU5JRUQpOwoJfQoKCSRvcmlnaW5hbFBhdGggPSBHYWxsZXJ5VXRpbGl0aWVzOjpnZXRSZXF1ZXN0VmFyaWFibGVzKCdvcmlnaW5hbFBhdGgnKTsKCSR0aXRsZSA9IGVtcHR5KCRvcmlnaW5hbFBhdGgpID8gJHBhdGhDb21wb25lbnQgOiBiYXNlbmFtZSgkb3JpZ2luYWxQYXRoKTsKCSRyZXQgPSBXZWJEYXZIZWxwZXI6Om1rY29sSGVscGVyKCRwYXJlbnRJZCwgJHBhdGhDb21wb25lbnQsICR0aXRsZSwgJycsICcnLCAnJyk7CglpZiAoJHJldCkgewoJICAgIGlmICgkcmV0LT5nZXRFcnJvckNvZGUoKSAmIEVSUk9SX0lMTEVHQUxfQ0hJTEQpIHsKCgkJLyoKCQkgKiA0MDMgKEZvcmJpZGRlbikgLSBUaGlzIGluZGljYXRlcyBhdCBsZWFzdCBvbmUgb2YgdHdvIGNvbmRpdGlvbnM6IDEpIHRoZSBzZXJ2ZXIKCQkgKiBkb2VzIG5vdCBhbGxvdyB0aGUgY3JlYXRpb24gb2YgY29sbGVjdGlvbnMgYXQgdGhlIGdpdmVuIGxvY2F0aW9uIGluIGl0cwoJCSAqIG5hbWVzcGFjZSwgb3IgMikgdGhlIHBhcmVudCBjb2xsZWN0aW9uIG9mIHRoZSBSZXF1ZXN0LVVSSSBleGlzdHMgYnV0IGNhbm5vdAoJCSAqIGFjY2VwdCBtZW1iZXJzLgoJCSAqLwoJCVdlYkRhdlNlcnZlcjo6c2V0UmVzcG9uc2VTdGF0dXMoJzQwMyBGb3JiaWRkZW4nKTsKCSAgICB9CgoJICAgIHJldHVybiAkcmV0OwoJfQoKCS8qCgkgKiAyMDEgKENyZWF0ZWQpIC0gVGhlIGNvbGxlY3Rpb24gb3Igc3RydWN0dXJlZCByZXNvdXJjZSB3YXMgY3JlYXRlZCBpbiBpdHMgZW50aXJldHkuCgkgKi8KCVdlYkRhdlNlcnZlcjo6c2V0UmVzcG9uc2VTdGF0dXMoJzIwMSBDcmVhdGVkJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBERUxFVEUgaGVscGVyLgogICAgICoKICAgICAqIEZvciBhbiBhcnJheSBvZiBpdGVtIGlkcywgZGVsZXRlIHRoZSBpdGVtcyBpZiBub3QgdGhlIHJvb3QgYWxidW0gYW5kIHRoZSB1c2VyIGhhcyBwZXJtaXNzaW9uLgogICAgICoKICAgICAqIENvcGllZCBmcm9tIEl0ZW1EZWxldGVDb250cm9sbGVyOjpoYW5kbGVSZXF1ZXN0IGZvciBjb25zaXN0YW5jeS4gIE1heWJlIGV2ZW50dWFsbHkgc2hvdWxkIGdvCiAgICAgKiBpbiBJdGVtRGVsZXRlQ29udHJvbGxlcjo6cmVxdWVzdEhlbHBlciBvciBhIEdhbGxlcnlDb3JlQXBpIG1ldGhvZC4KICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJGl0ZW1JZHMgaWRzIG9mIGl0ZW1zIHRvIGRlbGV0ZQogICAgICogQHJldHVybiBhcnJheSBvYmplY3QgR2FsbGVyeVN0YXR1cyBhIHN0YXR1cyBjb2RlCiAgICAgKiAgICAgICAgICAgICAgIGludCBudW1iZXIgb2YgaXRlbXMgZGVsZXRlZAogICAgICogQHNlZSBJdGVtRGVsZXRlQ29udHJvbGxlcjo6aGFuZGxlUmVxdWVzdAogICAgICovCiAgICBmdW5jdGlvbiBkZWxldGVIZWxwZXIoJGl0ZW1JZHMpIHsKICAgICAgICBpZiAoIWlzX2FycmF5KCRpdGVtSWRzKSkgewoJICAgICRpdGVtSWRzID0gYXJyYXkoJGl0ZW1JZHMpOwoJfQoKCS8qIEdldCB0aGUgcm9vdElkLCBzbyB3ZSBkb24ndCB0cnkgdG8gZGVsZXRlIGl0ICovCglsaXN0ICgkcmV0LCAkcm9vdElkKSA9IEdhbGxlcnlDb3JlQXBpOjpnZXREZWZhdWx0QWxidW1JZCgpOwoJaWYgKCRyZXQpIHsKCSAgICByZXR1cm4gYXJyYXkoJHJldCwgbnVsbCk7Cgl9CgoJJHJldCA9IEdhbGxlcnlDb3JlQXBpOjpzdHVkeVBlcm1pc3Npb25zKCRpdGVtSWRzKTsKCWlmICgkcmV0KSB7CgkgICAgcmV0dXJuIGFycmF5KCRyZXQsIG51bGwpOwoJfQoKCWZvcmVhY2ggKCRpdGVtSWRzIGFzICRpdGVtSWQpIHsKCSAgICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBwZXJtaXNzaW9uIHRvIGRlbGV0ZSB0aGlzIGl0ZW0gKi8KCSAgICBsaXN0ICgkcmV0LCAkcGVybWlzc2lvbnMpID0gR2FsbGVyeUNvcmVBcGk6OmdldFBlcm1pc3Npb25zKCRpdGVtSWQpOwoJICAgIGlmICgkcmV0KSB7CgkJcmV0dXJuIGFycmF5KCRyZXQsIG51bGwpOwoJICAgIH0KCgkgICAgaWYgKCFpc3NldCgkcGVybWlzc2lvbnNbJ2NvcmUuZGVsZXRlJ10pKSB7CgkJcmV0dXJuIGFycmF5KEdhbGxlcnlDb3JlQXBpOjplcnJvcihFUlJPUl9QRVJNSVNTSU9OX0RFTklFRCwgX19GSUxFX18sIF9fTElORV9fLAoJCSAgICAiRG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGRlbGV0ZSB0aGlzIGl0ZW0iKSwgbnVsbCk7CgkgICAgfQoKCSAgICAvKiBNYWtlIHN1cmUgd2UncmUgbm90IGRlbGV0aW5nIHRoZSByb290IGFsYnVtICovCgkgICAgaWYgKCRpdGVtSWQgPT0gJHJvb3RJZCkgewoJCXJldHVybiBhcnJheShHYWxsZXJ5Q29yZUFwaTo6ZXJyb3IoRVJST1JfQkFEX1BBUkFNRVRFUiwgX19GSUxFX18sIF9fTElORV9fLAoJCSAgICAiQ2FuJ3QgZGVsZXRlIHRoZSByb290IGFsYnVtIiksIG51bGwpOwoJICAgIH0KCX0KCgkvKiBJZiB3ZSdyZSBzdGlsbCBoZXJlIHRoZW4gYWxsIGFyZSBkZWxldGFibGUgKi8KCSRjb3VudCA9IDA7Cglmb3JlYWNoICgkaXRlbUlkcyBhcyAkaXRlbUlkKSB7CgkgICAgJHJldCA9IEdhbGxlcnlDb3JlQXBpOjpkZWxldGVFbnRpdHlCeUlkKCRpdGVtSWQpOwoJICAgIGlmICgkcmV0KSB7CgkJcmV0dXJuIGFycmF5KCRyZXQsIG51bGwpOwoJICAgIH0KCgkgICAgJGNvdW50Kys7Cgl9CgoJcmV0dXJuIGFycmF5KG51bGwsICRjb3VudCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBERUxFVEUgaGFuZGxlci4KICAgICAqIEByZXR1cm4gb2JqZWN0IEdhbGxlcnlTdGF0dXMgYSBzdGF0dXMgY29kZQogICAgICovCiAgICBmdW5jdGlvbiBkZWxldGUoKSB7CgkvKiBSRkMyNTE4IDkuMiBsYXN0IHBhcmFncmFwaCAqLwoJaWYgKEdhbGxlcnlVdGlsaXRpZXM6OmdldFNlcnZlclZhcignSFRUUF9ERVBUSCcpICE9IG51bGwKCQkmJiBHYWxsZXJ5VXRpbGl0aWVzOjpnZXRTZXJ2ZXJWYXIoJ0hUVFBfREVQVEgnKSAhPSAnaW5maW5pdHknKSB7CgkgICAgV2ViRGF2U2VydmVyOjpzZXRSZXNwb25zZVN0YXR1cygnNDAwIEJhZCBSZXF1ZXN0Jyk7CgkgICAgcmV0dXJuIEdhbGxlcnlDb3JlQXBpOjplcnJvcihFUlJPUl9CQURfUEFSQU1FVEVSKTsKCX0KCgkkcGF0aCA9IEdhbGxlcnlVdGlsaXRpZXM6OmdldFJlcXVlc3RWYXJpYWJsZXMoJ3BhdGgnKTsKCSRwYXRoID0gdHJpbSgkcGF0aCwgJy8nKTsKCgkvKiBDaGVjayByZXNvdXJjZSBpcyBub3QgbG9ja2VkICovCgkkcmV0ID0gV2ViRGF2SGVscGVyOjpjaGVja0xvY2tzKCRwYXRoKTsKCWlmICgkcmV0KSB7CgkgICAgcmV0dXJuICRyZXQ7Cgl9CgoJaWYgKGVtcHR5KCRwYXRoKSkgewoJICAgIGxpc3QgKCRyZXQsICRpdGVtSWQpID0gR2FsbGVyeUNvcmVBcGk6OmdldFBsdWdpblBhcmFtZXRlcignbW9kdWxlJywgJ2NvcmUnLAoJCSdpZC5yb290QWxidW0nKTsKCSAgICBpZiAoJHJldCkgewoJCXJldHVybiAkcmV0OwoJICAgIH0KCX0gZWxzZSB7CgkgICAgbGlzdCAoJHJldCwgJGl0ZW1JZCkgPSBHYWxsZXJ5Q29yZUFwaTo6ZmV0Y2hJdGVtSWRCeVBhdGgoJHBhdGgpOwoJICAgIGlmICgkcmV0KSB7CgkJcmV0dXJuICRyZXQ7CgkgICAgfQoJfQoKCWxpc3QgKCRyZXQsICRpdGVtKSA9IEdhbGxlcnlDb3JlQXBpOjpsb2FkRW50aXRpZXNCeUlkKCRpdGVtSWQpOwoJaWYgKCRyZXQpIHsKCSAgICByZXR1cm4gJHJldDsKCX0KCglsaXN0ICgkcmV0LCAkY291bnQpID0gV2ViRGF2SGVscGVyOjpkZWxldGVIZWxwZXIoJGl0ZW1JZCk7CglpZiAoJHJldCkgewoJICAgIHJldHVybiAkcmV0OwoJfQoKCS8qIFdoYXQgZG8gd2UgZG8gaWYgd2Ugd2VyZW4ndCBzdWNjZXNzZnVsPyAgTm8gdGh1bWJuYWlsLCBJIGd1ZXNzLiAqLwoJbGlzdCAoJHJldCwgJHN1Y2Nlc3MpID0gR2FsbGVyeUNvcmVBcGk6Omd1YXJhbnRlZUFsYnVtSGFzVGh1bWJuYWlsKCRpdGVtLT5nZXRQYXJlbnRJZCgpKTsKCWlmICgkcmV0KSB7CgkgICAgcmV0dXJuICRyZXQ7Cgl9CgoJV2ViRGF2U2VydmVyOjpzZXRSZXNwb25zZVN0YXR1cygnMjA0IE5vIENvbnRlbnQnKTsKCXJldHVybiBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogUFVUIHJlcXVlc3QgaGVscGVyLgogICAgICoKICAgICAqIFdyYXBwZXIgYXJvdW5kIEhUVFBfV2ViREFWX1NlcnZlcjo6cHV0X3JlcXVlc3RfaGVscGVyIHdoaWNoIHByZXBhcmVzIGRhdGEtc3RydWN0dXJlcyBmcm9tIFBVVAogICAgICogcmVxdWVzdHMuCiAgICAgKgogICAgICogQHJldHVybiBhcnJheSBvYmplY3QgR2FsbGVyeVN0YXR1cyBhIHN0YXR1cyBjb2RlCiAgICAgKiAgICAgICAgICAgICAgIGFycmF5IFdlYkRBViBsaWJyYXJ5IG9wdGlvbnMKICAgICAqICAgICAgICAgICAgICAgcmVzb3VyY2UgcmVxdWVzdCBib2R5IGZpbGUgaGFuZGxlCiAgICAgKiAgICAgICAgICAgICAgIHN0cmluZyByZXF1ZXN0IGNvbnRlbnQgdHlwZQogICAgICogQHNlZSBIVFRQX1dlYkRBVl9TZXJ2ZXI6OnB1dF9yZXF1ZXN0X2hlbHBlcgogICAgICovCiAgICBmdW5jdGlvbiBwdXRSZXF1ZXN0SGVscGVyKCkgewoJJHdlYkRhdlNlcnZlciA9JiBXZWJEYXZIZWxwZXI6OmdldFdlYkRhdlNlcnZlcigpOwoKCWlmICghJHdlYkRhdlNlcnZlci0+cHV0X3JlcXVlc3RfaGVscGVyKCR3ZWJEYXZPcHRpb25zKSkgewoJICAgIC8qIFdlYkRBViBsaWJyYXJ5IGZvdW5kIGVycm9yIGluIHRoZSByZXF1ZXN0ICovCgkgICAgcmV0dXJuIGFycmF5KEdhbGxlcnlDb3JlQXBpOjplcnJvcihFUlJPUl9VTktOT1dOKSwgbnVsbCwgbnVsbCwgbnVsbCk7Cgl9CgoJcmV0dXJuIGFycmF5KG51bGwsICR3ZWJEYXZPcHRpb25zLAoJCSAgICAgJHdlYkRhdk9wdGlvbnNbJ3N0cmVhbSddLAoJCSAgICAgJHdlYkRhdk9wdGlvbnNbJ2NvbnRlbnRfdHlwZSddKTsKICAgIH0KCiAgICAvKioKICAgICAqIFBVVCByZXNwb25zZSBoZWxwZXIuCiAgICAgKgogICAgICogV3JhcHBlciBhcm91bmQgSFRUUF9XZWJEQVZfU2VydmVyOjpwdXRfcmVzcG9uc2VfaGVscGVyIHdoaWNoIGZvcm1hdHMgUFVUIHJlc3BvbnNlcy4KICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJHdlYkRhdk9wdGlvbnMgV2ViREFWIGxpYnJhcnkgb3B0aW9ucwogICAgICogQHBhcmFtIHJlc291cmNlICRzdHJlYW0gZGVzdGluYXRpb24gZmlsZSBoYW5kbGUKICAgICAqIEBzZWUgSFRUUF9XZWJEQVZfU2VydmVyOjpwdXRfcmVzcG9uc2VfaGVscGVyCiAgICAgKi8KICAgIGZ1bmN0aW9uIHB1dFJlc3BvbnNlSGVscGVyKCR3ZWJEYXZPcHRpb25zLCAkc3RyZWFtKSB7Cgkkd2ViRGF2U2VydmVyID0mIFdlYkRhdkhlbHBlcjo6Z2V0V2ViRGF2U2VydmVyKCk7Cgkkd2ViRGF2T3B0aW9uc1snbmV3J10gPSBmYWxzZTsKCSR3ZWJEYXZTZXJ2ZXItPnB1dF9yZXNwb25zZV9oZWxwZXIoJHdlYkRhdk9wdGlvbnMsICRzdHJlYW0pOwogICAgfQoKICAgIC8qKgogICAgICogQ09QWSAvIE1PVkUgcmVxdWVzdCBoZWxwZXIuCiAgICAgKgogICAgICogV3JhcHBlciBhcm91bmQgSFRUUF9XZWJEQVZfU2VydmVyOjpjb3B5bW92ZV9yZXF1ZXN0X2hlbHBlciB3aGljaCBwcmVwYXRlcyBkYXRhLXN0cnVjdHVyZXMKICAgICAqIGZyb20gQ09QWSAvIE1PVkUgcmVxdWVzdHMuCiAgICAgKgogICAgICogQHJldHVybiBhcnJheSBvYmplY3QgR2FsbGVyeVN0YXR1cyBhIHN0YXR1cyBjb2RlCiAgICAgKiAgICAgICAgICAgICAgIGFycmF5IFdlYkRBViBsaWJyYXJ5IG9wdGlvbnMKICAgICAqICAgICAgICAgICAgICAgaW50IG1heGltdW0gZGVwdGggb2YgZGVzY2VuZGFudCBwYXRocwogICAgICogICAgICAgICAgICAgICBib29sZWFuIG92ZXJ3cml0ZSBpdGVtcyBhdCBkZXN0aW5hdGlvbiBwYXRoCiAgICAgKiAgICAgICAgICAgICAgIHN0cmluZyBkZXN0aW5hdGlvbiBwYXRoCiAgICAgKiBAc2VlIEhUVFBfV2ViREFWX1NlcnZlcjo6Y29weW1vdmVfcmVxdWVzdF9oZWxwZXIKICAgICAqLwogICAgZnVuY3Rpb24gY29weU1vdmVSZXF1ZXN0SGVscGVyKCkgewoJZ2xvYmFsICRnYWxsZXJ5OwoJJHBsYXRmb3JtID0mICRnYWxsZXJ5LT5nZXRQbGF0Zm9ybSgpOwoJJHdlYkRhdlNlcnZlciA9JiBXZWJEYXZIZWxwZXI6OmdldFdlYkRhdlNlcnZlcigpOwoKCS8qIEJvZHkgcGFyc2luZyBub3QgeWV0IHN1cHBvcnRlZCAqLwoJaWYgKEdhbGxlcnlVdGlsaXRpZXM6OmdldFNlcnZlclZhcignQ09OVEVOVF9MRU5HVEgnKSkgewoJICAgIC8qCgkgICAgICogNDE1IChVbnN1cHBvcnRlZCBNZWRpYSBUeXBlKSAtIFRoZSBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcmVxdWVzdCB0eXBlIG9mIHRoZQoJICAgICAqIGJvZHkuCgkgICAgICovCgkgICAgV2ViRGF2U2VydmVyOjpzZXRSZXNwb25zZVN0YXR1cygnNDE1IFVuc3VwcG9ydGVkIE1lZGlhIFR5cGUnKTsKCSAgICByZXR1cm4gYXJyYXkoR2FsbGVyeUNvcmVBcGk6OmVycm9yKEVSUk9SX0JBRF9QQVJBTUVURVIpLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKCX0KCglpZiAoISR3ZWJEYXZTZXJ2ZXItPmNvcHltb3ZlX3JlcXVlc3RfaGVscGVyKCR3ZWJEYXZPcHRpb25zKSkgewoJICAgIC8qIFdlYkRBViBsaWJyYXJ5IGZvdW5kIGVycm9yIGluIHRoZSByZXF1ZXN0ICovCgkgICAgcmV0dXJuIGFycmF5KEdhbGxlcnlDb3JlQXBpOjplcnJvcihFUlJPUl9VTktOT1dOKSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Cgl9CgoJLyogQ29weWluZyB0byByZW1vdGUgc2VydmVycyBub3QgeWV0IHN1cHBvcnRlZCAqLwoJaWYgKGlzc2V0KCR3ZWJEYXZPcHRpb25zWydkZXN0X3VybCddKSkgewoJICAgIC8qCgkgICAgICogNTAyIChCYWQgR2F0ZXdheSkgLSBUaGlzIG1heSBvY2N1ciB3aGVuIHRoZSBkZXN0aW5hdGlvbiBpcyBvbiBhbm90aGVyIHNlcnZlciBhbmQgdGhlCgkgICAgICogZGVzdGluYXRpb24gc2VydmVyIHJlZnVzZXMgdG8gYWNjZXB0IHRoZSByZXNvdXJjZS4KCSAgICAgKi8KCSAgICBXZWJEYXZTZXJ2ZXI6OnNldFJlc3BvbnNlU3RhdHVzKCc1MDIgQmFkIEdhdGV3YXknKTsKCSAgICByZXR1cm4gYXJyYXkoR2FsbGVyeUNvcmVBcGk6OmVycm9yKEVSUk9SX0JBRF9QQVJBTUVURVIpLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKCX0KCgkvKiBDaGVjayBkZXN0aW5hdGlvbiBpcyBsZWdhbCAqLwoJJHBhdGhDb21wb25lbnQgPSBiYXNlbmFtZSgkd2ViRGF2T3B0aW9uc1snZGVzdCddKTsKCWlmICghJHBsYXRmb3JtLT5pc0xlZ2FsUGF0aENvbXBvbmVudCgkcGF0aENvbXBvbmVudCkpIHsKCSAgICBXZWJEYXZTZXJ2ZXI6OnNldFJlc3BvbnNlU3RhdHVzKCc0MDMgRm9yYmlkZGVuJyk7CgkgICAgcmV0dXJuIGFycmF5KEdhbGxlcnlDb3JlQXBpOjplcnJvcihFUlJPUl9CQURfUEFUSCksIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwoJfQoKCXJldHVybiBhcnJheShudWxsLCAkd2ViRGF2T3B0aW9ucywKCQkgICAgICR3ZWJEYXZPcHRpb25zWydkZXB0aCddLAoJCSAgICAgJHdlYkRhdk9wdGlvbnNbJ292ZXJ3cml0ZSddLAoJCSAgICAgJHdlYkRhdk9wdGlvbnNbJ2Rlc3QnXSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBWYWxpZGF0ZSBNT1ZFIHJlcXVlc3RzLgogICAgICoKICAgICAqIENvcGllZCBmcm9tIEl0ZW1Nb3ZlQ29udHJvbGxlcjo6aGFuZGxlUmVxdWVzdCBmb3IgY29uc2lzdGFuY3kuICBNYXliZSBldmVudHVhbGx5IHNob3VsZCBnbyBpbgogICAgICogSXRlbU1vdmVDb250cm9sbGVyOjp2YWxpZGF0ZVJlcXVlc3Qgb3IgYSBHYWxsZXJ5Q29yZUFwaSBtZXRob2QuCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRpdGVtcyBpdGVtcyB0byBtb3ZlCiAgICAgKiBAcGFyYW0gb2JqZWN0IEdhbGxlcnlBbGJ1bUl0ZW0gJG5ld1BhcmVudAogICAgICogQHJldHVybiBhcnJheSBvYmplY3QgR2FsbGVyeVN0YXR1cyBhIHN0YXR1cyBjb2RlCiAgICAgKiAgICAgICAgICAgICAgIGFycmF5IGVycm9yIHN0cmluZ3MKICAgICAqIEBzZWUgSXRlbU1vdmVDb250cm9sbGVyOjpoYW5kbGVSZXF1ZXN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIG1vdmVWYWxpZGF0ZUhlbHBlcigkaXRlbXMsICRuZXdQYXJlbnQpIHsKICAgICAgICBpZiAoIWlzX2FycmF5KCRpdGVtcykpIHsKCSAgICAkaXRlbXMgPSBhcnJheSgkaXRlbXMpOwoJfQoKCSRlcnJvciA9IGFycmF5KCk7CgoJaWYgKGVtcHR5KCRuZXdQYXJlbnQpKSB7CgkgICAgJGVycm9yW10gPSAnZm9ybVtlcnJvcl1bZGVzdGluYXRpb25dW2VtcHR5XSc7Cgl9CgoJaWYgKCFlbXB0eSgkbmV3UGFyZW50KSkgewoJICAgICRuZXdQYXJlbnRJZCA9ICRuZXdQYXJlbnQtPmdldElkKCk7CgoJICAgIGxpc3QgKCRyZXQsICRwZXJtaXNzaW9ucykgPSBHYWxsZXJ5Q29yZUFwaTo6Z2V0UGVybWlzc2lvbnMoJG5ld1BhcmVudElkKTsKCSAgICBpZiAoJHJldCkgewoJCXJldHVybiBhcnJheSgkcmV0LCBudWxsKTsKCSAgICB9CgoJICAgICRjYW5BZGRJdGVtID0gaXNzZXQoJHBlcm1pc3Npb25zWydjb3JlLmFkZERhdGFJdGVtJ10pOwoJICAgICRjYW5BZGRBbGJ1bSA9IGlzc2V0KCRwZXJtaXNzaW9uc1snY29yZS5hZGRBbGJ1bUl0ZW0nXSk7CgkgICAgaWYgKCEkY2FuQWRkQWxidW0gJiYgISRjYW5BZGRJdGVtKSB7CgkJJGVycm9yW10gPSAnZm9ybVtlcnJvcl1bZGVzdGluYXRpb25dW3Blcm1pc3Npb25dJzsKCSAgICB9CgoJICAgIGlmICghR2FsbGVyeVV0aWxpdGllczo6aXNBKCRuZXdQYXJlbnQsICdHYWxsZXJ5QWxidW1JdGVtJykpIHsKCQkvKiBUaGUgdmlldyBzaG91bGQgbmV2ZXIgbGV0IHRoaXMgaGFwcGVuICovCgkJcmV0dXJuIGFycmF5KEdhbGxlcnlDb3JlQXBpOjplcnJvcihFUlJPUl9CQURfREFUQV9UWVBFKSwgbnVsbCk7CgkgICAgfQoKCSAgICAvKiBMb2FkIGRlc3RpbmF0aW9uIHBhcmVudCBpZHM6IFdlIGRvbid0IHdhbnQgcmVjdXJzaXZlIG1vdmVzICovCgkgICAgbGlzdCAoJHJldCwgJG5ld1BhcmVudEFuY2VzdG9ySWRzKSA9IEdhbGxlcnlDb3JlQXBpOjpmZXRjaFBhcmVudFNlcXVlbmNlKCRuZXdQYXJlbnRJZCk7CgkgICAgaWYgKCRyZXQpIHsKCQlyZXR1cm4gYXJyYXkoJHJldCwgbnVsbCk7CgkgICAgfQoJICAgICRuZXdQYXJlbnRBbmNlc3Rvcklkc1tdID0gJG5ld1BhcmVudElkOwoJfQoKCWZvcmVhY2ggKCRpdGVtcyBhcyAkaXRlbSkgewoJICAgICRpdGVtSWQgPSAkaXRlbS0+Z2V0SWQoKTsKCgkgICAgaWYgKCFlbXB0eSgkbmV3UGFyZW50KSkgewoKCQkvKiBDYW4ndCBtb3ZlIGludG8gYSB0cmVlIHRoYXQgaXMgaW5jbHVkZWQgaW4gdGhlIHNvdXJjZSAqLwoJCWlmIChpbl9hcnJheSgkaXRlbUlkLCAkbmV3UGFyZW50QW5jZXN0b3JJZHMpKSB7CgkJICAgICRlcnJvcltdID0gJ2Zvcm1bZXJyb3JdW3NvdXJjZV1bJyAuICRpdGVtSWQgLiAnXVtzZWxmTW92ZV0nOwoJCSAgICBjb250aW51ZTsKCQl9CgkgICAgfQoKCSAgICBsaXN0ICgkcmV0LCAkcGVybWlzc2lvbnMpID0gR2FsbGVyeUNvcmVBcGk6OmdldFBlcm1pc3Npb25zKCRpdGVtSWQpOwoJICAgIGlmICgkcmV0KSB7CgkJcmV0dXJuIGFycmF5KCRyZXQsIG51bGwpOwoJICAgIH0KCgkgICAgLyogQ2FuIHdlIGRlbGV0ZSB0aGlzIGl0ZW0gZnJvbSBoZXJlPyAqLwoJICAgIGlmICghaXNzZXQoJHBlcm1pc3Npb25zWydjb3JlLmRlbGV0ZSddKSkgewoJCSRlcnJvcltdID0gJ2Zvcm1bZXJyb3JdW3NvdXJjZV1bJyAuICRpdGVtSWQgLiAnXVtwZXJtaXNzaW9uXVtkZWxldGVdJzsKCSAgICB9CgoJICAgIGlmICghZW1wdHkoJG5ld1BhcmVudCkpIHsKCgkJLyogQ2hlY2sgaWYgdGhlIGRlc3RpbmF0aW9uIGFsbG93cyB0aGlzIHNvdXJjZSB0byBiZSBhZGRlZCAqLwoJCWlmIChHYWxsZXJ5VXRpbGl0aWVzOjppc0EoJGl0ZW0sICdHYWxsZXJ5RGF0YUl0ZW0nKSkgewoJCSAgICBpZiAoISRjYW5BZGRJdGVtKSB7CgkJCSRlcnJvcltdID0gJ2Zvcm1bZXJyb3JdW3NvdXJjZV1bJyAuICRpdGVtSWQgLiAnXVtwZXJtaXNzaW9uXVthZGREYXRhSXRlbV0nOwoJCSAgICB9CgkJfSBlbHNlIGlmIChHYWxsZXJ5VXRpbGl0aWVzOjppc0EoJGl0ZW0sICdHYWxsZXJ5QWxidW1JdGVtJykpIHsKCQkgICAgaWYgKCEkY2FuQWRkQWxidW0pIHsKCQkJJGVycm9yW10gPSAnZm9ybVtlcnJvcl1bc291cmNlXVsnIC4gJGl0ZW1JZCAuICddW3Blcm1pc3Npb25dW2FkZEFsYnVtSXRlbV0nOwoJCSAgICB9CgkJfSBlbHNlIHsKCgkJICAgIC8qIFRoZSB2aWV3IHNob3VsZCBuZXZlciBsZXQgdGhpcyBoYXBwZW4gKi8KCQkgICAgcmV0dXJuIGFycmF5KEdhbGxlcnlDb3JlQXBpOjplcnJvcihFUlJPUl9CQURfREFUQV9UWVBFKSwgbnVsbCk7CgkJfQoJICAgIH0KCX0KCglyZXR1cm4gYXJyYXkobnVsbCwgJGVycm9yKTsKICAgIH0KCiAgICAvKioKICAgICAqIE1PVkUgaGFuZGxlci4KICAgICAqCiAgICAgKiBSZW5hbWUgYW4gaXRlbSwgY2hhbmdlIGl0cyBwYXJlbnQsIG9yIGJvdGguCiAgICAgKgogICAgICogQHJldHVybiBvYmplY3QgR2FsbGVyeVN0YXR1cyBhIHN0YXR1cyBjb2RlCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1vdmUoKSB7CgkkcGF0aCA9IEdhbGxlcnlVdGlsaXRpZXM6OmdldFJlcXVlc3RWYXJpYWJsZXMoJ3BhdGgnKTsKCSRwYXRoID0gdHJpbSgkcGF0aCwgJy8nKTsKCgkvKiBDaGVjayBzb3VyY2UgaXMgbm90IGxvY2tlZCAqLwoJJHJldCA9IFdlYkRhdkhlbHBlcjo6Y2hlY2tMb2NrcygkcGF0aCk7CglpZiAoJHJldCkgewoJICAgIHJldHVybiAkcmV0OwoJfQoKCS8qIFZhbGlkYXRlIGJlZm9yZSBkZWxldGluZyBhIGNvbmZsaWN0aW5nIGl0ZW0gKi8KCWxpc3QgKCRyZXQsICRpdGVtSWQpID0gR2FsbGVyeUNvcmVBcGk6OmZldGNoSXRlbUlkQnlQYXRoKCRwYXRoKTsKCWlmICgkcmV0KSB7CgkgICAgcmV0dXJuICRyZXQ7Cgl9CgoJbGlzdCAoJHJldCwgJHJvb3RJZCkgPSBHYWxsZXJ5Q29yZUFwaTo6Z2V0UGx1Z2luUGFyYW1ldGVyKCdtb2R1bGUnLCAnY29yZScsICdpZC5yb290QWxidW0nKTsKCWlmICgkcmV0KSB7CgkgICAgcmV0dXJuICRyZXQ7Cgl9CglpZiAoJGl0ZW1JZCA9PSAkcm9vdElkKSB7CgkgICAgcmV0dXJuIEdhbGxlcnlDb3JlQXBpOjplcnJvcihFUlJPUl9CQURfUEFSQU1FVEVSKTsKCX0KCglsaXN0ICgkcmV0LCAkaXRlbSkgPSBHYWxsZXJ5Q29yZUFwaTo6bG9hZEVudGl0aWVzQnlJZCgkaXRlbUlkKTsKCWlmICgkcmV0KSB7CgkgICAgcmV0dXJuICRyZXQ7Cgl9CgoJLyogUHJlcGFyZSBkYXRhLXN0cnVjdHVyZSBmcm9tIE1PVkUgcmVxdWVzdCAqLwoJbGlzdCAoJHJldCwgJHdlYkRhdk9wdGlvbnMsICRkZXB0aCwgJG92ZXJ3cml0ZSwgJG5ld1BhdGgpID0KCSAgICBXZWJEYXZIZWxwZXI6OmNvcHlNb3ZlUmVxdWVzdEhlbHBlcigpOwoJaWYgKCRyZXQpIHsKCSAgICByZXR1cm4gJHJldDsKCX0KCgkvKiBDaGVjayBkZXN0aW5hdGlvbiBpcyBub3QgbG9ja2VkICovCgkkcmV0ID0gV2ViRGF2SGVscGVyOjpjaGVja0xvY2tzKCRuZXdQYXRoKTsKCWlmICgkcmV0KSB7CgkgICAgcmV0dXJuICRyZXQ7Cgl9CgoJaWYgKEdhbGxlcnlVdGlsaXRpZXM6OmlzQSgkaXRlbSwgJ0dhbGxlcnlBbGJ1bUl0ZW0nKSAmJiAkZGVwdGggIT0gJ2luZmluaXR5JykgewoJICAgIC8qCgkgICAgICogVGhlIE1PVkUgbWV0aG9kIG9uIGEgY29sbGVjdGlvbiBNVVNUIGFjdCBhcyBpZiBhICJEZXB0aDogaW5maW5pdHkiIGhlYWRlciB3YXMgdXNlZCBvbgoJICAgICAqIGl0LiAgQSBjbGllbnQgTVVTVCBOT1Qgc3VibWl0IGEgRGVwdGggaGVhZGVyIG9uIGEgTU9WRSBvbiBhIGNvbGxlY3Rpb24gd2l0aCBhbnkgdmFsdWUKCSAgICAgKiBidXQgImluZmluaXR5Ii4KCSAgICAgKi8KCSAgICBXZWJEYXZTZXJ2ZXI6OnNldFJlc3BvbnNlU3RhdHVzKCc0MDAgQmFkIFJlcXVlc3QnKTsKCSAgICByZXR1cm4gR2FsbGVyeUNvcmVBcGk6OmVycm9yKEVSUk9SX0JBRF9QQVJBTUVURVIpOwoJfQoKCWxpc3QgKCRyZXQsICRuZXdQYXJlbnRJZCkgPSBXZWJEYXZIZWxwZXI6OmdldFBhcmVudEl0ZW1JZEJ5UGF0aCgkbmV3UGF0aCk7CglpZiAoJHJldCkgewoJICAgIGlmICgkcmV0LT5nZXRFcnJvckNvZGUoKSAmIEVSUk9SX01JU1NJTkdfT0JKRUNUKSB7CgkJLyoKCQkgKiA0MDkgKENvbmZsaWN0KSAtIEEgcmVzb3VyY2UgY2Fubm90IGJlIGNyZWF0ZWQgYXQgdGhlIGRlc3RpbmF0aW9uIHVudGlsCgkJICogb25lIG9yIG1vcmUgaW50ZXJtZWRpYXRlIGNvbGxlY3Rpb25zIGhhdmUgYmVlbiBjcmVhdGVkLgoJCSAqLwoJCVdlYkRhdlNlcnZlcjo6c2V0UmVzcG9uc2VTdGF0dXMoJzQwOSBDb25mbGljdCcpOwoJICAgIH0KCSAgICByZXR1cm4gJHJldDsKCX0KCglsaXN0ICgkcmV0LCAkbmV3UGFyZW50KSA9IEdhbGxlcnlDb3JlQXBpOjpsb2FkRW50aXRpZXNCeUlkKCRuZXdQYXJlbnRJZCk7CglpZiAoJHJldCkgewoJICAgIHJldHVybiAkcmV0OwoJfQoKCSRwYXRoQ29tcG9uZW50ID0gYmFzZW5hbWUoJHBhdGgpOwoJJG5ld1BhdGhDb21wb25lbnQgPSBiYXNlbmFtZSgkbmV3UGF0aCk7Cgkkb2xkUGFyZW50SWQgPSAkaXRlbS0+Z2V0UGFyZW50SWQoKTsKCglpZiAoJG9sZFBhcmVudElkICE9ICRuZXdQYXJlbnRJZCkgewoJICAgIGxpc3QgKCRyZXQsICRlcnJvcikgPSBXZWJEYXZIZWxwZXI6Om1vdmVWYWxpZGF0ZUhlbHBlcigkaXRlbSwgJG5ld1BhcmVudCk7CgkgICAgaWYgKCRyZXQpIHsKCQlyZXR1cm4gJHJldDsKCSAgICB9CgkgICAgaWYgKCFlbXB0eSgkZXJyb3IpKSB7CgkJZm9yZWFjaCAoJGVycm9yIGFzICRlcnJvcikgewoJCSAgICBpZiAoIXN0cnBvcygkZXJyb3IsICdwZXJtaXNzaW9uJykpIHsKCQkJcmV0dXJuIEdhbGxlcnlDb3JlQXBpOjplcnJvcihFUlJPUl9CQURfUEFSQU1FVEVSKTsKCQkgICAgfQoJCX0KCgkJLyogSWYgYWxsIGVycm9ycyB3ZXJlIHBlcm1pc3Npb24gZGVuaWVkIHJldHVybiBtb3JlIHNwZWNpZmljIGVycm9yICovCgkJcmV0dXJuIEdhbGxlcnlDb3JlQXBpOjplcnJvcihFUlJPUl9QRVJNSVNTSU9OX0RFTklFRCk7CgkgICAgfQoJfQoKCWxpc3QgKCRyZXQsICRjb25mbGljdGluZ0l0ZW1JZCkgPSBHYWxsZXJ5Q29yZUFwaTo6ZmV0Y2hJdGVtSWRCeVBhdGgoJG5ld1BhdGgpOwoJaWYgKCRyZXQgJiYgISgkcmV0LT5nZXRFcnJvckNvZGUoKSAmIEVSUk9SX01JU1NJTkdfT0JKRUNUKSkgewoJICAgIHJldHVybiAkcmV0OwoJfQoJaWYgKCEkcmV0KSB7CgkgICAgaWYgKCEkb3ZlcndyaXRlKSB7CgkJLyoKCQkgKiA0MTIgKFByZWNvbmRpdGlvbiBGYWlsZWQpIC0gVGhlIHNlcnZlciB3YXMgdW5hYmxlIHRvIG1haW50YWluIHRoZSBsaXZlbmVzcyBvZiB0aGUKCQkgKiBwcm9wZXJ0aWVzIGxpc3RlZCBpbiB0aGUgcHJvcGVydHliZWhhdmlvciBYTUwgZWxlbWVudCBvciB0aGUgT3ZlcndyaXRlIGhlYWRlciBpcwoJCSAqICJGIiBhbmQgdGhlIHN0YXRlIG9mIHRoZSBkZXN0aW5hdGlvbiByZXNvdXJjZSBpcyBub24tbnVsbC4KCQkgKi8KCQlXZWJEYXZTZXJ2ZXI6OnNldFJlc3BvbnNlU3RhdHVzKCc0MTIgUHJlY29uZGl0aW9uIEZhaWxlZCcpOwoJCXJldHVybiBHYWxsZXJ5Q29yZUFwaTo6ZXJyb3IoRVJST1JfQ09MTElTSU9OKTsKCSAgICB9CgoJICAgIGxpc3QgKCRyZXQsICRjb3VudCkgPSBXZWJEYXZIZWxwZXI6OmRlbGV0ZUhlbHBlcigkY29uZmxpY3RpbmdJdGVtSWQpOwoJICAgIGlmICgkcmV0KSB7CgkJcmV0dXJuICRyZXQ7CgkgICAgfQoJfQoKCWlmICgkb2xkUGFyZW50SWQgIT0gJG5ld1BhcmVudElkKSB7CgkgICAgLyoKCSAgICAgKiBSZWFkIGxvY2sgYm90aCBwYXJlbnQgaGllcmFyY2hpZXMKCSAgICAgKiBUT0RPIE9wdGltaXplIHRoaXMKCSAgICAgKi8KCSAgICBsaXN0ICgkcmV0LCAkbG9ja0lkc1tdKSA9IEdhbGxlcnlDb3JlQXBpOjphY3F1aXJlUmVhZExvY2tQYXJlbnRzKCRuZXdQYXJlbnRJZCk7CgkgICAgaWYgKCRyZXQpIHsKCQlyZXR1cm4gJHJldDsKCSAgICB9CgoJICAgIGxpc3QgKCRyZXQsICRsb2NrSWRzW10pID0gR2FsbGVyeUNvcmVBcGk6OmFjcXVpcmVSZWFkTG9ja1BhcmVudHMoJG9sZFBhcmVudElkKTsKCSAgICBpZiAoJHJldCkgewoJCUdhbGxlcnlDb3JlQXBpOjpyZWxlYXNlTG9ja3MoJGxvY2tJZHMpOwoJCXJldHVybiAkcmV0OwoJICAgIH0KCgkgICAgbGlzdCAoJHJldCwgJGxvY2tJZHNbXSkgPQoJCUdhbGxlcnlDb3JlQXBpOjphY3F1aXJlUmVhZExvY2soYXJyYXkoJG5ld1BhcmVudElkLCAkb2xkUGFyZW50SWQpKTsKCSAgICBpZiAoJHJldCkgewoJCUdhbGxlcnlDb3JlQXBpOjpyZWxlYXNlTG9ja3MoJGxvY2tJZHMpOwoJCXJldHVybiAkcmV0OwoJICAgIH0KCX0KCgkvKiBXcml0ZSBsb2NrIHRoZSBpdGVtIHdlJ3JlIG1vdmluZyAqLwoJbGlzdCAoJHJldCwgJGxvY2tJZHNbXSkgPSBHYWxsZXJ5Q29yZUFwaTo6YWNxdWlyZVdyaXRlTG9jaygkaXRlbUlkKTsKCWlmICgkcmV0KSB7CgkgICAgR2FsbGVyeUNvcmVBcGk6OnJlbGVhc2VMb2NrcygkbG9ja0lkcyk7CgkgICAgcmV0dXJuICRyZXQ7Cgl9CgoJLyogUmVmcmVzaCB0aGUgaXRlbSBpbiBjYXNlIGl0IGNoYW5nZWQgYmVmb3JlIGl0IHdhcyBsb2NrZWQgKi8KCWxpc3QgKCRyZXQsICRpdGVtKSA9ICRpdGVtLT5yZWZyZXNoKCk7CglpZiAoJHJldCkgewoJICAgIEdhbGxlcnlDb3JlQXBpOjpyZWxlYXNlTG9ja3MoJGxvY2tJZHMpOwoJICAgIHJldHVybiAkcmV0OwoJfQoKCS8qIFRyeSByZW5hbWluZyBmaXJzdCAtIGlmIGl0IGZhaWxzIGl0J3MgZWFzaWVyIHRvIHVuZG8gKi8KCWlmICgkbmV3UGF0aENvbXBvbmVudCAhPSAkcGF0aENvbXBvbmVudCkgewoJICAgICRyZXQgPSAkaXRlbS0+cmVuYW1lKCRuZXdQYXRoQ29tcG9uZW50KTsKCSAgICBpZiAoJHJldCkgewoJCUdhbGxlcnlDb3JlQXBpOjpyZWxlYXNlTG9ja3MoJGxvY2tJZHMpOwoJCXJldHVybiAkcmV0OwoJICAgIH0KCX0KCglpZiAoJG5ld1BhcmVudElkICE9ICRvbGRQYXJlbnRJZCkgewoJICAgIC8qIERvIHRoZSBtb3ZlICovCgkgICAgJHJldCA9ICRpdGVtLT5tb3ZlKCRuZXdQYXJlbnRJZCk7CgkgICAgaWYgKCRyZXQpIHsKCQlpZiAoJG5ld1BhdGhDb21wb25lbnQgIT0gJHBhdGhDb21wb25lbnQpIHsKCQkgICAgJGl0ZW0tPnJlbmFtZSgkcGF0aENvbXBvbmVudCk7CgkJICAgIC8qIElnbm9yZSBjYXNjYWRpbmcgZmFpbHVyZXMgaGVyZSAqLwoJCX0KCgkJR2FsbGVyeUNvcmVBcGk6OnJlbGVhc2VMb2NrcygkbG9ja0lkcyk7CgkJcmV0dXJuICRyZXQ7CgkgICAgfQoJfQoKCSRyZXQgPSAkaXRlbS0+c2F2ZSgpOwoJaWYgKCRyZXQpIHsKCSAgICBpZiAoJG5ld1BhdGhDb21wb25lbnQgIT0gJHBhdGhDb21wb25lbnQpIHsKCQkkcmV0ID0gJGl0ZW0tPnJlbmFtZSgkcGF0aENvbXBvbmVudCk7CgkJLyogSWdub3JlIGNhc2NhZGluZyBmYWlsdXJlcyBoZXJlICovCgkgICAgfQoKCSAgICBHYWxsZXJ5Q29yZUFwaTo6cmVsZWFzZUxvY2tzKCRsb2NrSWRzKTsKCSAgICByZXR1cm4gJHJldDsKCX0KCglpZiAoJG5ld1BhcmVudElkICE9ICRvbGRQYXJlbnRJZCkgewoJICAgIGlmIChHYWxsZXJ5VXRpbGl0aWVzOjppc0EoJGl0ZW0sICdHYWxsZXJ5RGF0YUl0ZW0nKSkgewoJCS8qIFVwZGF0ZSBmb3IgZGVyaXZhdGl2ZSBwcmVmZXJlbmNlcyBvZiBuZXcgcGFyZW50ICovCgkJJHJldCA9IEdhbGxlcnlDb3JlQXBpOjphZGRFeGlzdGluZ0l0ZW1Ub0FsYnVtKCRpdGVtLCAkbmV3UGFyZW50SWQpOwoJCWlmICgkcmV0KSB7CgkJICAgIEdhbGxlcnlDb3JlQXBpOjpyZWxlYXNlTG9ja3MoJGxvY2tJZHMpOwoJCSAgICByZXR1cm4gJHJldDsKCQl9CgkgICAgfQoJfQoKCS8qIFJlbGVhc2UgYWxsIGxvY2tzICovCgkkcmV0ID0gR2FsbGVyeUNvcmVBcGk6OnJlbGVhc2VMb2NrcygkbG9ja0lkcyk7CglpZiAoJHJldCkgewoJICAgIHJldHVybiAkcmV0OwoJfQoKCS8qIEZpeCB0aHVtYm5haWwgaW50ZWdyaXR5ICovCglpZiAoJG5ld1BhcmVudElkICE9ICRvbGRQYXJlbnRJZCkgewoJICAgIC8qIFdoYXQgZG8gd2UgZG8gaWYgd2Ugd2VyZW4ndCBzdWNjZXNzZnVsPyAgTm8gdGh1bWJuYWlsLCBJIGd1ZXNzLiAqLwoJICAgIGxpc3QgKCRyZXQsICRzdWNjZXNzKSA9IEdhbGxlcnlDb3JlQXBpOjpndWFyYW50ZWVBbGJ1bUhhc1RodW1ibmFpbCgkb2xkUGFyZW50SWQpOwoJICAgIGlmICgkcmV0KSB7CgkJcmV0dXJuICRyZXQ7CgkgICAgfQoJfQoKCS8qIElmIGFuIGl0ZW0gd2FzIG92ZXJ3cml0dGVuIGZpeCB0aHVtYm5haWwgaW50ZWdyaXR5ICovCglpZiAoZW1wdHkoJGNvdW50KSkgewoJICAgIC8qCgkgICAgICogMjAxIChDcmVhdGVkKSAtIFRoZSBzb3VyY2UgcmVzb3VyY2Ugd2FzIHN1Y2Nlc3NmdWxseSBjb3BpZWQuICBUaGUgY29weSBvcGVyYXRpb24KCSAgICAgKiByZXN1bHRlZCBpbiB0aGUgY3JlYXRpb24gb2YgYSBuZXcgcmVzb3VyY2UuCgkgICAgICovCgkgICAgV2ViRGF2U2VydmVyOjpzZXRSZXNwb25zZVN0YXR1cygnMjAxIENyZWF0ZWQnKTsKCSAgICByZXR1cm4gbnVsbDsKCX0KCgkvKiBJbiBjYXNlIHdlIG9ubHkgcmVuYW1lZCB0aGUgaXRlbSAqLwoJaWYgKGVtcHR5KCRuZXdQYXJlbnRJZCkpIHsKCSAgICAkbmV3UGFyZW50SWQgPSAkaXRlbS0+Z2V0UGFyZW50SWQoKTsKCX0KCgkvKiBXaGF0IGRvIHdlIGRvIGlmIHdlIHdlcmVuJ3Qgc3VjY2Vzc2Z1bD8gIE5vIHRodW1ibmFpbCwgSSBndWVzcy4gKi8KCWxpc3QgKCRyZXQsICRzdWNjZXNzKSA9IEdhbGxlcnlDb3JlQXBpOjpndWFyYW50ZWVBbGJ1bUhhc1RodW1ibmFpbCgkbmV3UGFyZW50SWQpOwoJaWYgKCRyZXQpIHsKCSAgICByZXR1cm4gJHJldDsKCX0KCgkvKgoJICogMjA0IChObyBDb250ZW50KSAtIFRoZSBzb3VyY2UgcmVzb3VyY2Ugd2FzIHN1Y2Nlc3NmdWxseSBjb3BpZWQgdG8gYSBwcmUtZXhpc3RpbmcKCSAqIGRlc3RpbmF0aW9uIHJlc291cmNlLgoJICovCglXZWJEYXZTZXJ2ZXI6OnNldFJlc3BvbnNlU3RhdHVzKCcyMDQgTm8gQ29udGVudCcpOwoJcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBMT0NLIHJlcXVlc3QgaGVscGVyLgogICAgICoKICAgICAqIFdyYXBwZXIgYXJvdW5kIEhUVFBfV2ViREFWX1NlcnZlcjo6bG9ja19yZXF1ZXN0X2hlbHBlciB3aGljaCBwcmVwYXJlcyBkYXRhLXN0cnVjdHVyZXMgZnJvbQogICAgICogTE9DSyByZXFldXN0cy4KICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5IG9iamVjdCBHYWxsZXJ5U3RhdHVzIGEgc3RhdHVzIGNvZGUKICAgICAqICAgICAgICAgICAgICAgYXJyYXkgV2ViREFWIGxpYnJhcnkgb3B0aW9ucwogICAgICogICAgICAgICAgICAgICBzdHJpbmcgdG9rZW4gb2YgV2ViREFWIGxvY2sgdG8gcmVmcmVzaCBvciBudWxsCiAgICAgKiAgICAgICAgICAgICAgIHN0cmluZyBzY29wZSBvZiBXZWJEQVYgbG9jayAoZXhjbHVzaXZlIG9yIHNoYXJlZCkKICAgICAqICAgICAgICAgICAgICAgc3RyaW5nIHR5cGUgb2YgV2ViREFWIGxvY2sgKHJlYWQgb3Igd3JpdGUpCiAgICAgKiAgICAgICAgICAgICAgIGludCBtYXhpbXVtIGRlcHRoIG9mIGRlc2NlbmRhbnQgcGF0aHMKICAgICAqICAgICAgICAgICAgICAgc3RyaW5nIG93bmVyIG9mIFdlYkRBViBsb2NrCiAgICAgKiAgICAgICAgICAgICAgIGludCB0aW1lb3V0IG9mIFdlYkRBViBsb2NrCiAgICAgKiAgICAgICAgICAgICAgIHN0cmluZyB0b2tlbiBvZiBXZWJEQVYgbG9jayB0byBjcmVhdGUKICAgICAqIEBzZWUgSFRUUF9XZWJEQVZfU2VydmVyOjpsb2NrX3JlcXVlc3RfaGVscGVyCiAgICAgKiBAdG9kbyBTaW1wbGlmeSBmdW5jdGlvbiBzaWduYXR1cmUKICAgICAqLwogICAgZnVuY3Rpb24gbG9ja1JlcXVlc3RIZWxwZXIoKSB7Cgkkd2ViRGF2U2VydmVyID0mIFdlYkRhdkhlbHBlcjo6Z2V0V2ViRGF2U2VydmVyKCk7CgoJaWYgKCEkd2ViRGF2U2VydmVyLT5sb2NrX3JlcXVlc3RfaGVscGVyKCR3ZWJEYXZPcHRpb25zKSkgewoJICAgIC8qIFdlYkRBViBsaWJyYXJ5IGZvdW5kIGVycm9yIGluIHRoZSByZXF1ZXN0ICovCgkgICAgcmV0dXJuIGFycmF5KEdhbGxlcnlDb3JlQXBpOjplcnJvcihFUlJPUl9VTktOT1dOKSwKCQkJIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwoJfQoKCWlmIChpc3NldCgkd2ViRGF2T3B0aW9uc1sndXBkYXRlJ10pKSB7CgkgICAgcmV0dXJuIGFycmF5KG51bGwsICR3ZWJEYXZPcHRpb25zLAoJICAgIAkJICR3ZWJEYXZPcHRpb25zWyd1cGRhdGUnXSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Cgl9CgoJcmV0dXJuIGFycmF5KG51bGwsICR3ZWJEYXZPcHRpb25zLAoJCSAgICAgbnVsbCwKCQkgICAgICR3ZWJEYXZPcHRpb25zWydzY29wZSddLAoJCSAgICAgJHdlYkRhdk9wdGlvbnNbJ3R5cGUnXSwKCQkgICAgICR3ZWJEYXZPcHRpb25zWydkZXB0aCddLAoJCSAgICAgJHdlYkRhdk9wdGlvbnNbJ293bmVyJ10sCgkJICAgICAkd2ViRGF2T3B0aW9uc1sndGltZW91dCddLAoJCSAgICAgJHdlYkRhdk9wdGlvbnNbJ3Rva2VuJ10pOwogICAgfQoKICAgIC8qKgogICAgICogTE9DSyByZXNwb25zZSBoZWxwZXIuCiAgICAgKgogICAgICogV3JhcHBlciBhcm91bmQgSFRUUF9XZWJEQVZfU2VydmVyOjpsb2NrX3Jlc3BvbnNlX2hlbHBlciB3aGljaCBmb3JtYXRlcyBMT0NLIHJlc3BvbnNlcy4KICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJHdlYkRhdk9wdGlvbnMgV2ViREFWIGxpYnJhcnkgb3B0aW9ucwogICAgICogQHBhcmFtIGFycmF5ICRsb2NrcyBmb3IgcmVzcG9uc2UgKHBhdGgpCiAgICAgKiBAcGFyYW0gbWl4ZWQgJHN0YXR1cyBIVFRQIHJlc3BvbnNlIHN0YXR1cwogICAgICogQHBhcmFtIHN0cmluZyAkc2NvcGUgb2YgV2ViREFWIGxvY2sgKGV4Y2x1c2l2ZSBvciBzaGFyZWQpCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0eXBlIG9mIFdlYkRBViBsb2NrIChyZWFkIG9yIHdyaXRlKQogICAgICogQHBhcmFtIGludCAkZGVwdGggbWF4aW11bSBkZXB0aCBvZiBkZXNjZW5kYW50IHBhdGhzCiAgICAgKiBAcGFyYW0gc3RyaW5nICRvd25lciBvZiBXZWJEQVYgbG9jawogICAgICogQHBhcmFtIGludCAkdGltZW91dCBvZiBXZWJEQVYgbG9jawogICAgICogQHBhcmFtIGludCAkZXhwaXJlcyB0aW1lc3RhbXAgb2YgV2ViREFWIGxvY2sgZXhwaXJhdGlvbgogICAgICogQHBhcmFtIHN0cmluZyAkdG9rZW4gb2YgV2ViREFWIGxvY2sKICAgICAqIEBzZWUgSFRUUF9XZWJEQVZfU2VydmVyOjpsb2NrX3Jlc3BvbnNlX2hlbHBlcgogICAgICogQHRvZG8gU2ltcGxpZnkgZnVuY3Rpb24gc2lnbmF0dXJlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGxvY2tSZXNwb25zZUhlbHBlcigKCSAgICAkd2ViRGF2T3B0aW9ucywgJGxvY2tzLCAkc3RhdHVzLCAkc2NvcGUsICR0eXBlLCAkZGVwdGgsICRvd25lciwgJGV4cGlyZXMsICR0b2tlbikgewoJJHdlYkRhdlNlcnZlciA9JiBXZWJEYXZIZWxwZXI6OmdldFdlYkRhdlNlcnZlcigpOwoJJHdlYkRhdk9wdGlvbnNbJ2xvY2tzJ10gPSAkbG9ja3M7Cgkkd2ViRGF2T3B0aW9uc1snc2NvcGUnXSA9ICRzY29wZTsKCSR3ZWJEYXZPcHRpb25zWyd0eXBlJ10gPSAkdHlwZTsKCSR3ZWJEYXZPcHRpb25zWydkZXB0aCddID0gJGRlcHRoOwoJJHdlYkRhdk9wdGlvbnNbJ293bmVyJ10gPSAkb3duZXI7Cgkkd2ViRGF2T3B0aW9uc1snZXhwaXJlcyddID0gJGV4cGlyZXM7Cgkkd2ViRGF2T3B0aW9uc1sndG9rZW4nXSA9ICR0b2tlbjsKCSR3ZWJEYXZTZXJ2ZXItPmxvY2tfcmVzcG9uc2VfaGVscGVyKCR3ZWJEYXZPcHRpb25zLCAkc3RhdHVzKTsKICAgIH0KCiAgICAvKioKICAgICAqIExPQ0sgaGFuZGxlci4KICAgICAqCiAgICAgKiBXZWJEQVYgbG9ja3MgcGVyc2lzdCBiZXR3ZWVuIHJlcXVlc3RzLgogICAgICoKICAgICAqIEByZXR1cm4gb2JqZWN0IEdhbGxlcnlTdGF0dXMgYSBzdGF0dXMgY29kZQogICAgICogQHRvZG8gTWFrZSBjb3JyZXNwb25kaW5nIEdhbGxlcnkgbG9ja3MgcGVyc2lzdCBiZXR3ZWVuIHJlcXVlc3RzCiAgICAgKi8KICAgIGZ1bmN0aW9uIGxvY2soKSB7CglnbG9iYWwgJGdhbGxlcnk7CgoJJHBhdGggPSBHYWxsZXJ5VXRpbGl0aWVzOjpnZXRSZXF1ZXN0VmFyaWFibGVzKCdwYXRoJyk7CgkkcGF0aCA9IHRyaW0oJHBhdGgsICcvJyk7CgoJLyogQ2hlY2sgcmVzb3VyY2UgaXMgbm90IGxvY2tlZCAqLwoJJHJldCA9IFdlYkRhdkhlbHBlcjo6Y2hlY2tMb2NrcygkcGF0aCk7CglpZiAoJHJldCkgewoJICAgIHJldHVybiAkcmV0OwoJfQoKCS8qIFByZXBhcmUgZGF0YS1zdHJ1Y3R1cmUgZnJvbSBMT0NLIHJlcXVlc3QgKi8KCWxpc3QgKCRyZXQsICR3ZWJEYXZPcHRpb25zLCAkdXBkYXRlLCAkc2NvcGUsICR0eXBlLCAkZGVwdGgsICRvd25lciwgJHRpbWVvdXQsICR0b2tlbikgPQoJICAgIFdlYkRhdkhlbHBlcjo6bG9ja1JlcXVlc3RIZWxwZXIoKTsKCWlmICgkcmV0KSB7CgkgICAgcmV0dXJuICRyZXQ7Cgl9CgoJaWYgKGVtcHR5KCRwYXRoKSkgewoJICAgIGxpc3QgKCRyZXQsICRpdGVtSWQpID0gR2FsbGVyeUNvcmVBcGk6OmdldERlZmF1bHRBbGJ1bUlkKCk7CgkgICAgaWYgKCRyZXQpIHsKCQlyZXR1cm4gJHJldDsKCSAgICB9Cgl9IGVsc2UgewoJICAgIGxpc3QgKCRyZXQsICRpdGVtSWQpID0gR2FsbGVyeUNvcmVBcGk6OmZldGNoSXRlbUlkQnlQYXRoKCRwYXRoKTsKCSAgICBpZiAoJHJldCkgewoJCXJldHVybiAkcmV0OwoJICAgIH0KCX0KCgkvKiBSZWZyZXNoIGxvY2sgKi8KCWlmICghZW1wdHkoJHVwZGF0ZSkpIHsKCSAgICAvKiBEb24ndCBqb2luIHdpdGggdGhlIEdhbGxlcnkgbG9jayB0YWJsZSBzaW5jZSB3ZSBtaWdodCBiZSB1c2luZyBmbG9jayBzeXN0ZW0gKi8KCSAgICAkcXVlcnkgPSAnCgkJU0VMRUNUCgkJICBbV2ViRGF2TG9ja01hcDo6ZGVwdGhdLAoJCSAgW1dlYkRhdkxvY2tNYXA6Om93bmVyXSwKCQkgIFtXZWJEYXZMb2NrTWFwOjpnYWxsZXJ5TG9ja0lkXQoJCUZST00KCQkgIFtXZWJEYXZMb2NrTWFwXQoJCVdIRVJFCgkJICBbV2ViRGF2TG9ja01hcDo6cGF0aF0gPSA/CgkJQU5ECgkJICBbV2ViRGF2TG9ja01hcDo6dG9rZW5dID0gPyc7CgkgICAgbGlzdCAoJHJldCwgJHJlc3VsdHMpID0gJGdhbGxlcnktPnNlYXJjaCgkcXVlcnksIGFycmF5KCRwYXRoLCAkdXBkYXRlKSk7CgkgICAgaWYgKCRyZXQpIHsKCQlyZXR1cm4gJHJldDsKCSAgICB9CgoJICAgIC8qIFRyaWVkIHRvIHJlZnJlc2ggYSBsb2NrIHdoaWNoIG5vIGxvbmdlciBleGlzdHMgKi8KCSAgICBpZiAoKCRyZXN1bHQgPSAkcmVzdWx0cy0+bmV4dFJlc3VsdCgpKSA9PT0gZmFsc2UpIHsKCQkvKgoJCSAqIDQxMiAoUHJlY29uZGl0aW9uIEZhaWxlZCkgLSBUaGUgaW5jbHVkZWQgbG9jayB0b2tlbiB3YXMgbm90IGVuZm9yY2VhYmxlIG9uIHRoaXMKCQkgKiByZXNvdXJjZSBvciB0aGUgc2VydmVyIGNvdWxkIG5vdCBzYXRpc2Z5IHRoZSByZXF1ZXN0IGluIHRoZSBsb2NraW5mbyBYTUwgZWxlbWVudC4KCQkgKi8KCQlXZWJEYXZTZXJ2ZXI6OnNldFJlc3BvbnNlU3RhdHVzKCc0MTIgUHJlY29uZGl0aW9uIEZhaWxlZCcpOwoJCXJldHVybiBHYWxsZXJ5Q29yZUFwaTo6ZXJyb3IoRVJST1JfQkFEX1BBUkFNRVRFUik7CgkgICAgfQoKCSAgICAvKiBMb2FkIFdlYkRBViBsb2NrIGluZm9ybWF0aW9uICovCgkgICAgJHNjb3BlID0gJ2V4Y2x1c2l2ZSc7CgkgICAgJHR5cGUgPSAnd3JpdGUnOwoJICAgICRkZXB0aCA9ICRyZXN1bHRbMF07CgkgICAgJG93bmVyID0gJHJlc3VsdFsxXTsKCSAgICAkbG9ja0lkID0gJHJlc3VsdFsyXTsKCgkgICAgLyogQ2hlY2sgdGhhdCB0aGUgR2FsbGVyeSBsb2NrIGRpZG4ndCBkaXNhcHBlYXIgYmVmb3JlIHRoZSBXZWJEQVYgbG9jayAqLwoJICAgIGlmIChHYWxsZXJ5Q29yZUFwaTo6aXNXcml0ZUxvY2tlZCgkaXRlbUlkKSkgewoJCS8qIFRPRE86IE5lZWQgYW4gaW50ZXJmYWNlIHRvIHVwZGF0ZSBnX2ZyZXNoVW50aWwgZm9yIG9ubHkgJGxvY2tJZCAqLwoJICAgIH0gZWxzZSB7CgkJbGlzdCAoJHJldCwgJGxvY2tJZCkgPSBHYWxsZXJ5Q29yZUFwaTo6YWNxdWlyZVdyaXRlTG9jaygkaXRlbUlkKTsKCQlpZiAoJHJldCkgewoJCSAgICByZXR1cm4gJHJldDsKCQl9CgkgICAgfQoJfSBlbHNlIHsKCSAgICAvKiBTdXBwb3J0IG9ubHkgZXhjbHVzaXZlIHdyaXRlIGxvY2tzICovCgkgICAgaWYgKCRzY29wZSAhPSAnZXhjbHVzaXZlJyB8fCAkdHlwZSAhPSAnd3JpdGUnKSB7CgkJLyoKCQkgKiA0MTIgKFByZWNvbmRpdGlvbiBGYWlsZWQpIC0gVGhlIGluY2x1ZGVkIGxvY2sgdG9rZW4gd2FzIG5vdCBlbmZvcmNlYWJsZSBvbiB0aGlzCgkJICogcmVzb3VyY2Ugb3IgdGhlIHNlcnZlciBjb3VsZCBub3Qgc2F0aXNmeSB0aGUgcmVxdWVzdCBpbiB0aGUgbG9ja2luZm8gWE1MIGVsZW1lbnQuCgkJICovCgkJV2ViRGF2U2VydmVyOjpzZXRSZXNwb25zZVN0YXR1cygnNDEyIFByZWNvbmRpdGlvbiBGYWlsZWQnKTsKCQlyZXR1cm4gR2FsbGVyeUNvcmVBcGk6OmVycm9yKEVSUk9SX0JBRF9QQVJBTUVURVIpOwoJICAgIH0KCgkgICAgaWYgKCRkZXB0aCA9PSAnaW5maW5pdHknKSB7CgkJbGlzdCAoJHJldCwgJGxvY2tzKSA9IFdlYkRhdkhlbHBlcjo6Z2V0RGVzY2VuZGVudHNMb2NrcygkcGF0aCk7CgkJaWYgKCRyZXQpIHsKCQkgICAgcmV0dXJuICRyZXQ7CgkJfQoKCQlpZiAoIWVtcHR5KCRsb2NrcykpIHsKCQkgICAgLyogRm9ybWF0IExPQ0sgcmVzcG9uc2UgKi8KCQkgICAgcmV0dXJuIFdlYkRhdkhlbHBlcjo6bG9ja1Jlc3BvbnNlSGVscGVyKAoJCQkkd2ViRGF2T3B0aW9ucywgJGxvY2tzLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKCQl9CgkgICAgfQoKCSAgICBsaXN0ICgkcmV0LCAkbG9ja0lkKSA9IEdhbGxlcnlDb3JlQXBpOjphY3F1aXJlV3JpdGVMb2NrKCRpdGVtSWQpOwoJICAgIGlmICgkcmV0KSB7CgkJcmV0dXJuICRyZXQ7CgkgICAgfQoJfQoKCS8qIFVzZSBHYWxsZXJ5IGxvY2sgZnJlc2hVbnRpbCBmb3IgV2ViREFWIGxvY2sgdGltZW91dCAqLwoJJHF1ZXJ5ID0gJwoJICAgIFNFTEVDVAoJICAgICAgW0xvY2s6OmZyZXNoVW50aWxdCgkgICAgRlJPTQoJICAgICAgW0xvY2tdCgkgICAgV0hFUkUKCSAgICAgIFtMb2NrOjpsb2NrSWRdID0gPyc7CglsaXN0ICgkcmV0LCAkcmVzdWx0cykgPSAkZ2FsbGVyeS0+c2VhcmNoKCRxdWVyeSwgYXJyYXkoJGxvY2tJZCkpOwoJaWYgKCRyZXQpIHsKCSAgICByZXR1cm4gJHJldDsKCX0KCglpZiAoKCRyZXN1bHQgPSAkcmVzdWx0cy0+bmV4dFJlc3VsdCgpKSAhPT0gZmFsc2UpIHsKCSAgICAkZXhwaXJlcyA9ICRyZXN1bHRbMF07Cgl9IGVsc2UgewoJICAgIC8qCgkgICAgICogTWlnaHQgYmUgdXNpbmcgZmxvY2sgc3lzdGVtCgkgICAgICogVE9ETzogR2V0IGV4cGlyZXMgZnJvbSBmbG9jayBsb2NrcwoJICAgIHJldHVybiBHYWxsZXJ5Q29yZUFwaTo6ZXJyb3IoRVJST1JfTUlTU0lOR19WQUxVRSk7CgkgICAgICovCgkgICAgJGV4cGlyZXMgPSB0aW1lKCkgKyAzMDsKCX0KCgkvKiBSZWZyZXNoIGxvY2sgKi8KCWlmICghZW1wdHkoJHVwZGF0ZSkpIHsKCSAgICAkcmV0ID0gR2FsbGVyeUNvcmVBcGk6OnVwZGF0ZU1hcEVudHJ5KCdXZWJEYXZMb2NrTWFwJywKCQlhcnJheSgndG9rZW4nID0+ICR1cGRhdGUsICdwYXRoJyA9PiAkcGF0aCksCgkJYXJyYXkoJ2V4cGlyZXMnID0+ICRleHBpcmVzLCAnZ2FsbGVyeUxvY2tJZCcgPT4gJGxvY2tJZCkpOwoJICAgIGlmICgkcmV0KSB7CgkJcmV0dXJuICRyZXQ7CgkgICAgfQoJfSBlbHNlIHsKCSAgICAkcmV0ID0gR2FsbGVyeUNvcmVBcGk6OmFkZE1hcEVudHJ5KCdXZWJEYXZMb2NrTWFwJywgYXJyYXkoJ2RlcHRoJyA9PiAkZGVwdGgsCgkJJ293bmVyJyA9PiAkb3duZXIsCgkJJ2V4cGlyZXMnID0+ICRleHBpcmVzLAoJCSd0b2tlbicgPT4gJHRva2VuLAoJCSdwYXRoJyA9PiAkcGF0aCwKCQknZ2FsbGVyeUxvY2tJZCcgPT4gJGxvY2tJZCkpOwoJICAgIGlmICgkcmV0KSB7CgkJcmV0dXJuICRyZXQ7CgkgICAgfQoJfQoKCS8qIEZvcm1hdCBMT0NLIHJlc3BvbnNlICovCgkkcmV0ID0gV2ViRGF2SGVscGVyOjpsb2NrUmVzcG9uc2VIZWxwZXIoCgkgICAgJHdlYkRhdk9wdGlvbnMsIG51bGwsIHRydWUsICRzY29wZSwgJHR5cGUsICRkZXB0aCwgJG93bmVyLCAkZXhwaXJlcywgJHRva2VuKTsKCWlmICgkcmV0KSB7CgkgICAgcmV0dXJuICRyZXQ7Cgl9CiAgICB9CgogICAgLyoqCiAgICAgKiBVTkxPQ0sgcmVxdWVzdCBoZWxwZXIuCiAgICAgKgogICAgICogV3JhcHBlciBhcm91bmQgSFRUUF9XZWJEQVZfU2VydmVyOjp1bmxvY2tfcmVxdWVzdF9oZWxwZXIgd2ljaCBwcmVwYXJlcyBkYXRhLXN0cnVjdHVyZXMgZnJvbQogICAgICogVU5MT0NLIHJlcXVlc3RzLgogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkgb2JqZWN0IEdhbGxlcnlTdGF0dXMgYSBzdGF0dXMgY29kZQogICAgICogICAgICAgICAgICAgICBhcnJheSBXZWJEQVYgbGlicmFyeSBvcHRpb25zCiAgICAgKiAgICAgICAgICAgICAgIHN0cmluZyB0b2tlbiBvZiBXZWJEQVYgbG9jayB0byBjbGVhcgogICAgICogQHNlZSBIVFRQX1dlYkRBVl9TZXJ2ZXI6OnVubG9ja19yZXF1ZXN0X2hlbHBlcgogICAgICovCiAgICBmdW5jdGlvbiB1bmxvY2tSZXF1ZXN0SGVscGVyKCkgewoJJHdlYkRhdlNlcnZlciA9JiBXZWJEYXZIZWxwZXI6OmdldFdlYkRhdlNlcnZlcigpOwoKCWlmICghJHdlYkRhdlNlcnZlci0+dW5sb2NrX3JlcXVlc3RfaGVscGVyKCR3ZWJEYXZPcHRpb25zKSkgewoJICAgIC8qIFdlYkRBViBsaWJyYXJ5IGZvdW5kIGVycm9yIGluIHRoZSByZXF1ZXN0ICovCgkgICAgcmV0dXJuIGFycmF5KEdhbGxlcnlDb3JlQXBpOjplcnJvcihFUlJPUl9VTktOT1dOKSwgbnVsbCwgbnVsbCk7Cgl9CgoJcmV0dXJuIGFycmF5KG51bGwsICR3ZWJEYXZPcHRpb25zLCAkd2ViRGF2T3B0aW9uc1sndG9rZW4nXSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBVTkxPQ0sgaGFuZGxlci4KICAgICAqIEByZXR1cm4gb2JqZWN0IEdhbGxlcnlTdGF0dXMgYSBzdGF0dXMgY29kZQogICAgICovCiAgICBmdW5jdGlvbiB1bmxvY2soKSB7CglnbG9iYWwgJGdhbGxlcnk7CgoJLyogUHJlcGFyZSBkYXRhLXN0cnVjdHVyZSBmcm9tIFVOTE9DSyByZXF1ZXN0ICovCglsaXN0ICgkcmV0LCAkd2ViRGF2T3B0aW9ucywgJHRva2VuKSA9IFdlYkRhdkhlbHBlcjo6dW5sb2NrUmVxdWVzdEhlbHBlcigpOwoJaWYgKCRyZXQpIHsKCSAgICByZXR1cm4gJHJldDsKCX0KCgkkcGF0aCA9IEdhbGxlcnlVdGlsaXRpZXM6OmdldFJlcXVlc3RWYXJpYWJsZXMoJ3BhdGgnKTsKCSRwYXRoID0gdHJpbSgkcGF0aCwgJy8nKTsKCgkkcXVlcnkgPSAnCgkgICAgU0VMRUNUCgkgICAgICBbV2ViRGF2TG9ja01hcDo6Z2FsbGVyeUxvY2tJZF0KCSAgICBGUk9NCgkgICAgICBbV2ViRGF2TG9ja01hcF0KCSAgICBXSEVSRQoJICAgICAgW1dlYkRhdkxvY2tNYXA6OnBhdGhdID0gPwoJICAgIEFORAoJICAgICAgW1dlYkRhdkxvY2tNYXA6OnRva2VuXSA9ID8nOwoJbGlzdCAoJHJldCwgJHJlc3VsdHMpID0gJGdhbGxlcnktPnNlYXJjaCgkcXVlcnksIGFycmF5KCRwYXRoLCAkdG9rZW4pKTsKCWlmICgkcmV0KSB7CgkgICAgcmV0dXJuICRyZXQ7Cgl9CgoJaWYgKCgkcmVzdWx0ID0gJHJlc3VsdHMtPm5leHRSZXN1bHQoKSkgPT09IGZhbHNlKSB7CgkgICAgcmV0dXJuIEdhbGxlcnlDb3JlQXBpOjplcnJvcihFUlJPUl9NSVNTSU5HX1ZBTFVFKTsKCX0KCSRsb2NrSWQgPSAkcmVzdWx0WzBdOwoKCSRyZXQgPSBHYWxsZXJ5Q29yZUFwaTo6cmVsZWFzZUxvY2tzKCRsb2NrSWQpOwoJaWYgKCRyZXQpIHsKCSAgICByZXR1cm4gJHJldDsKCX0KCgkkcmV0ID0gR2FsbGVyeUNvcmVBcGk6OnJlbW92ZU1hcEVudHJ5KAoJICAgICdXZWJEYXZMb2NrTWFwJywgYXJyYXkoJ3Rva2VuJyA9PiAkdG9rZW4sICdwYXRoJyA9PiAkcGF0aCkpOwoJaWYgKCRyZXQpIHsKCSAgICByZXR1cm4gJHJldDsKCX0KCgkvKgoJICogVGhlIDIwNCAoTm8gQ29udGVudCkgc3RhdHVzIGNvZGUgaXMgdXNlZCBpbnN0ZWFkIG9mIDIwMCAoT0spIGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVzcG9uc2UKCSAqIGVudGl0eSBib2R5LgoJICovCglXZWJEYXZTZXJ2ZXI6OnNldFJlc3BvbnNlU3RhdHVzKCcyMDQgTm8gQ29udGVudCcpOwoJcmV0dXJuIG51bGw7CiAgICB9Cn0KCi8qKgogKiBTdWItY2xhc3Mgb2YgSFRUUF9XZWJEQVZfU2VydmVyIHdoaWNoIG92ZXJyaWRlcyBnZXRIcmVmLCBvcGVuUmVxdWVzdEJvZHksIHNldFJlc3BvbnNlSGVhZGVyIGFuZAogKiBzZXRSZXNwb25zZVN0YXR1cy4gIGdldEhyZWYgdXNlcyB0aGUgVVJMIGdlbmVyYXRvci4gIG9wZW5SZXF1ZXN0Qm9keSB1c2VzIHRoZSBwbGF0Zm9ybSwgZm9yCiAqIHRlc3RhYmlsaXR5LiAgc2V0UmVzcG9uc2VIZWFkZXIgYW5kIHNldFJlc3BvbnNlU3RhdHVzIHVzZSBHYWxsZXJ5VXRpbGl0aWVzOjpzZXRSZXNwb25zZUhlYWRlciB0bwogKiBhdm9pZCByZXNwb25zZSBoZWFkZXJzIGJlaW5nIHJlcGxhY2VkIGVsc2V3aGVyZSBpbiBHYWxsZXJ5IGFuZCBmb3IgdGVzdGFiaWxpdHksIHNpbmNlCiAqIEdhbGxlcnlVdGlsaXRpZXM6OnNldFJlc3BvbnNlSGVhZGVyIHVzZXMgJHBocFZtLT5oZWFkZXIuCiAqLwpjbGFzcyBXZWJEYXZTZXJ2ZXIgZXh0ZW5kcyBIVFRQX1dlYkRBVl9TZXJ2ZXIgewoKICAgIC8qKgogICAgICogQHNlZSBIVFRQX1dlYkRBVl9TZXJ2ZXI6OmdldEhyZWYKICAgICAqLwogICAgZnVuY3Rpb24gZ2V0SHJlZigkcGF0aCkgewoJZ2xvYmFsICRnYWxsZXJ5OwoJJHVybEdlbmVyYXRvciA9JiAkZ2FsbGVyeS0+Z2V0VXJsR2VuZXJhdG9yKCk7CgoJcmV0dXJuICR1cmxHZW5lcmF0b3ItPmdlbmVyYXRlVXJsKAoJICAgIGFycmF5KCdjb250cm9sbGVyJyA9PiAnd2ViZGF2LldlYkRhdicsICdwYXRoJyA9PiAkcGF0aCksCgkgICAgYXJyYXkoJ2ZvcmNlU2VydmVyUmVsYXRpdmVVcmwnID0+IHRydWUsCgkJICAnZm9yY2VTZXNzaW9uSWQnID0+IGZhbHNlLAoJCSAgJ3VzZUF1dGhUb2tlbicgPT4gZmFsc2UpKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBzZWUgSFRUUF9XZWJEQVZfU2VydmVyOjpvcGVuUmVxdWVzdEJvZHkKICAgICAqLwogICAgZnVuY3Rpb24gb3BlblJlcXVlc3RCb2R5KCkgewoJZ2xvYmFsICRnYWxsZXJ5OwoJJHBsYXRmb3JtID0mICRnYWxsZXJ5LT5nZXRQbGF0Zm9ybSgpOwoKCXJldHVybiAkcGxhdGZvcm0tPmZvcGVuKCdwaHA6Ly9pbnB1dCcsICdyYicpOwogICAgfQoKICAgIC8qKgogICAgICogQHNlZSBIVFRQX1dlYkRBVl9TZXJ2ZXI6OnNldFJlc3BvbnNlSGVhZGVyCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldFJlc3BvbnNlSGVhZGVyKCRoZWFkZXIsICRyZXBsYWNlPXRydWUpIHsKCUdhbGxlcnlVdGlsaXRpZXM6OnNldFJlc3BvbnNlSGVhZGVyKCRoZWFkZXIsICRyZXBsYWNlKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBzZWUgSFRUUF9XZWJEQVZfU2VydmVyOjpzZXRSZXNwb25zZVN0YXR1cwogICAgICovCiAgICBmdW5jdGlvbiBzZXRSZXNwb25zZVN0YXR1cygkc3RhdHVzLCAkcmVwbGFjZT10cnVlKSB7CglHYWxsZXJ5VXRpbGl0aWVzOjpzZXRSZXNwb25zZUhlYWRlcigiSFRUUC8xLjAgJHN0YXR1cyIsICRyZXBsYWNlKTsKICAgIH0KfQo/Pgo=');
expand_6421a0d81d($outputDir, 'classes/WebDavRewriteHelper.class', 'PD9waHAKLyoKICogR2FsbGVyeSAtIGEgd2ViIGJhc2VkIHBob3RvIGFsYnVtIHZpZXdlciBhbmQgZWRpdG9yCiAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA3IEJoYXJhdCBNZWRpcmF0dGEKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CiAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAogKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KICovCgovKioKICogQSBXZWJEQVYgaGVscGVyIGNsYXNzIGZvciBnZW5lcmF0aW5nIHNob3J0IFVSTHMgd2l0aG91dCBxdWVyeSBzdHJpbmdzLgogKiBAcGFja2FnZSBXZWJEYXYKICogQHN1YnBhY2thZ2UgQ2xhc3NlcwogKiBAYXV0aG9yIEphY2sgQmF0ZXMgPG1zNDE5QGZyZWV6b25lLmNvLnVrPgogKiBAdmVyc2lvbiAkUmV2aXNpb246IDE1NTEzICQKICogQHN0YXRpYwogKi8KY2xhc3MgV2ViRGF2UmV3cml0ZUhlbHBlciB7CgogICAgLyoqCiAgICAgKiBIYWNrZWQgdmVyc2lvbiBvZiBSZXdyaXRlU2ltcGxlSGVscGVyOjpwYXJzZXJQYXRoIHRvIHN1cHBvcnQgZWl0aGVyICdwYXRoJyBvciAnaXRlbUlkJyBhbmQKICAgICAqIGVtcHR5IHBhdGggb3IgJy8nIGZvciBzaG9ydCBVUkwgdG8gdGhlIHJvb3QgYWxidW0uICBVc2VzIHJhd3VybGVuY29kZSBpbnN0ZWFkIG9mIHVybGVuY29kZSB0bwogICAgICogZW5jb2RlICcgJyBhcyAnJTIwJywgaW5zdGVhZCBvZiAnKycuCiAgICAgKiBAc2VlIFJld3JpdGVTaW1wbGVIZWxwZXI6OnBhcnNlUGF0aAogICAgICovCiAgICBmdW5jdGlvbiBwYXJzZVBhdGgoJiR1cmwsICYkcGFyYW1zLCAmJGVudGl0eSkgewoJZ2xvYmFsICRnYWxsZXJ5OwoKCWlmIChpc3NldCgkcGFyYW1zWydpdGVtSWQnXSkpIHsKCSAgICBpZiAoIWlzc2V0KCRlbnRpdHkpKSB7CgkJJHVybEdlbmVyYXRvciA9JiAkZ2FsbGVyeS0+Z2V0VXJsR2VuZXJhdG9yKCk7CgkJJGVudGl0eSA9ICR1cmxHZW5lcmF0b3ItPmxvYWRFbnRpdHkoJHBhcmFtc1snaXRlbUlkJ10pOwoJICAgIH0KCgkgICAgaWYgKCFHYWxsZXJ5VXRpbGl0aWVzOjppc0EoJGVudGl0eSwgJ0dhbGxlcnlGaWxlU3lzdGVtRW50aXR5JykpIHsKCQlyZXR1cm47CgkgICAgfQoKCSAgICBsaXN0ICgkcmV0LCAkcGFyYW1zWydwYXRoJ10pID0gJGVudGl0eS0+ZmV0Y2hMb2dpY2FsUGF0aCgpOwoJICAgIGlmICgkcmV0KSB7CgkJcmV0dXJuOwoJICAgIH0KCgkgICAgdW5zZXQoJHBhcmFtc1snaXRlbUlkJ10pOwoJfQoKCWlmIChlbXB0eSgkcGFyYW1zWydwYXRoJ10pKSB7CgkgICAgJHBhcmFtc1sncGF0aCddID0gJyc7Cgl9IGVsc2UgewoJICAgICRwYXJhbXNbJ3BhdGgnXSA9IGx0cmltKCRwYXJhbXNbJ3BhdGgnXSwgJy8nKTsKCgkgICAgLyogcmF3dXJsZW5jb2RlIGV4Y2VwdCBmb3IgcGF0aCBzZXBhcmF0b3JzICovCgkgICAgJHBhcmFtc1sncGF0aCddID0gc3RyX3JlcGxhY2UoJyUyRicsICcvJywgcmF3dXJsZW5jb2RlKCRwYXJhbXNbJ3BhdGgnXSkpOwoJfQoKCS8qCgkgKiBXZSBhZGQgaW4gYSBsZWFkaW5nIHNsYXNoIHRvIHRoZSBwYXRoIGJlY2F1c2UgdGhlIHJ1bGUgaXMgZGVzaWduZWQgbm90IHRvIGhhdmUKCSAqIG9uZSwgc28gdGhhdCBpdCBjYW4gdHJpZ2dlciBvbiBnYWxsZXJ5Mi93LyBhbmQgZ2FsbGVyeTIvdyAoV2luZG93cyBYUCB3aWxsCgkgKiBQUk9QRklORCB0aGUgcGF0aCB3aXRob3V0IHRoZSB0cmFpbGluZyBzbGFzaAoJICovCgkkdXJsID0gc3RyX3JlcGxhY2UoJyVwYXRoJScsICcvJyAuICRwYXJhbXNbJ3BhdGgnXSwgJHVybCk7Cgl1bnNldCgkcGFyYW1zWydwYXRoJ10pOwoKCXJldHVybiB0cnVlOwogICAgfQp9Cj8+Cg==');
expand_6421a0d81d($outputDir, 'data/options/.htaccess', 'IyBUaGUgV2ViREFWIHNwZWMsIFJGQzI1MTgsIHByb21pc2VzIHRoZSBEQVYgaGVhZGVyIG9uIGFsbCBPUFRJT05TIHJlc3BvbnNlczoKIwojICAgICBUaGlzIGhlYWRlciBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVzb3VyY2Ugc3VwcG9ydHMgdGhlIERBViBzY2hlbWEgYW5kCiMgICAgIHByb3RvY29sIGFzIHNwZWNpZmllZC4gQWxsIERBViBjb21wbGlhbnQgcmVzb3VyY2VzIE1VU1QgcmV0dXJuIHRoZQojICAgICBEQVYgaGVhZGVyIG9uIGFsbCBPUFRJT05TIHJlc3BvbnNlcy4KIwojIFNvbWUgV2ViREFWIGNsaWVudHMsIGUuZy4gTWFjIE9TIFggV2ViREFWRlMsIGZhaWwgdG8gY29ubmVjdCBpZiB0aGlzIGhlYWRlcgojIGlzIG1pc3NpbmcuICBUaGUgV2ViREFWIG1vZHVsZSB3aWxsIHJldHVybiB0aGUgREFWIGhlYWRlciBvbiBhbGwgcmVzcG9uc2VzLAojIGJ1dCBzb21lIHNlcnZlciBjb25maWd1cmF0aW9ucyBkb24ndCBwYXNzIE9QVElPTlMgcmVxdWVzdHMgdG8gc2NyaXB0cywgZS5nLgojIEFwYWNoZSBkb2Vzbid0IHBhc3MgT1BUSU9OUyByZXF1ZXN0cyB0byBDR0kgc2NyaXB0czoKIyBodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM3OTgyCiMKIyBDb25zZXF1ZW50bHksIHNvbWUgV2ViREFWIGNsaWVudHMgd2lsbCB3b3JrIHdpdGggbW9kX3BocCwgYnV0IG5vdCBwaHAtY2dpLgojCiMgQWx0ZXJuYXRpdmVseSwgd2UgY2FuIHNldCB0aGUgREFWIGhlYWRlciB1c2luZyBtb2RfcmV3cml0ZSBhbmQgbW9kX2hlYWRlcnMuCiMgVGhlIEhlYWRlciBzdGF0ZW1lbnQgZG9lc24ndCBiZWxvbmcgaW4gZ2FsbGVyeTIvLmh0YWNjZXNzLCBpdCBiZWxvbmdzIGluIHRoZQojIGRpcmVjdG9yeSBvZiB0aGUgaW50ZXJwcmV0ZXIsIGkuZS4gcGhwLWNnaS4KIwojIFRvIGF2b2lkIGVkaXRpbmcgL3Vzci9saWIvY2dpLWJpbi8uaHRhY2Nlc3Mgd2UgY2FuIHVzZSB0aGUgVVJMIHJld3JpdGUgbW9kdWxlCiMgdG8gcmVkaXJlY3QgT1BUSU9OUyByZXF1ZXN0cyB0byB0aGlzIGRpcmVjdG9yeS4KIwojIFJlaW1wbGVtZW50YXRpb24gb2YgV2ViRGF2SGVscGVyOjpvcHRpb25zIHVzaW5nIG1vZF9oZWFkZXJzLgojCiMgVE9ETzogQ09QWSBub3QgaW1wbGVtZW50ZWQuCjxJZk1vZHVsZSBtb2RfaGVhZGVycy5jPgogICAgSGVhZGVyIHNldCBBbGxvdyBPUFRJT05TLFBST1BGSU5ELFBST1BQQVRDSCxNS0NPTCxHRVQsSEVBRCxERUxFVEUsUFVULE1PVkUsTE9DSyxVTkxPQ0sKICAgIEhlYWRlciBzZXQgREFWIDEsMgogICAgSGVhZGVyIHNldCBNUy1BdXRob3ItVmlhIERBVgo8L0lmTW9kdWxlPgo=');
expand_6421a0d81d($outputDir, 'lib/HTTP/WebDAV/Server.php', 'PD9waHAKLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vIHwgUEhQIFZlcnNpb24gNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAovLyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gfCBDb3B5cmlnaHQgKGMpIDE5OTctMjAwMyBUaGUgUEhQIEdyb3VwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci8vICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLyB8IFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB2ZXJzaW9uIDIuMDIgb2YgdGhlIFBIUCBsaWNlbnNlLCAgICAgIHwKLy8gfCB0aGF0IGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2UgaW4gdGhlIGZpbGUgTElDRU5TRSwgYW5kIGlzICAgICAgICB8Ci8vIHwgYXZhaWxhYmxlIGF0IHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfAovLyB8IGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzJfMDIudHh0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZiB0aGUgUEhQIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG8gICB8Ci8vIHwgb2J0YWluIGl0IHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViLCBwbGVhc2Ugc2VuZCBhIG5vdGUgdG8gICAgICAgICAgfAovLyB8IGxpY2Vuc2VAcGhwLm5ldCBzbyB3ZSBjYW4gbWFpbCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LiAgICAgICAgICAgICAgIHwKLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vIHwgQXV0aG9yczogSGFydG11dCBIb2x6Z3JhZWZlIDxoaG9semdyYUBwaHAubmV0PiAgICAgICAgICAgICAgICAgICAgICAgfAovLyB8ICAgICAgICAgIENocmlzdGlhbiBTdG9ja2VyIDxjaHJlZ3VAYml0Zmx1eC5jaD4gICAgICAgICAgICAgICAgICAgICAgIHwKLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vCi8vICRJZDogU2VydmVyLnBocCAxNTcyOSAyMDA3LTAxLTI3IDA1OjUzOjE1WiBhbmR5X3N0ICQKCnJlcXVpcmVfb25jZShkaXJuYW1lKF9fRklMRV9fKSAuICcvVG9vbHMvX3BhcnNlX3Byb3BmaW5kLnBocCcpOwpyZXF1aXJlX29uY2UoZGlybmFtZShfX0ZJTEVfXykgLiAnL1Rvb2xzL19wYXJzZV9wcm9wcGF0Y2gucGhwJyk7CnJlcXVpcmVfb25jZShkaXJuYW1lKF9fRklMRV9fKSAuICcvVG9vbHMvX3BhcnNlX2xvY2tpbmZvLnBocCcpOwoKZGVmaW5lKCdIVFRQX1dFQkRBVl9TRVJWRVJfREFUQVRZUEVfTkFNRVNQQUNFJywKICAgICd1cm46dXVpZDpjMmY0MTAxMC02NWIzLTExZDEtYTI5Zi0wMGFhMDBjMTQ4ODInKTsKCi8qKgogKiBWaXJ0dWFsIGJhc2UgY2xhc3MgZm9yIGltcGxlbWVudGluZyBXZWJEQVYgc2VydmVycwogKgogKiBXZWJEQVYgc2VydmVyIGJhc2UgY2xhc3MsIG5lZWRzIHRvIGJlIGV4dGVuZGVkIHRvIGRvIHVzZWZ1bCB3b3JrCiAqCiAqIEBwYWNrYWdlIEhUVFBfV2ViREFWX1NlcnZlcgogKiBAYXV0aG9yIEhhcnRtdXQgSG9semdyYWVmZSA8aGhvbHpncmFAcGhwLm5ldD4KICogQHZlcnNpb24gMC45OS4xZGV2CiAqLwpjbGFzcyBIVFRQX1dlYkRBVl9TZXJ2ZXIKewogICAgLy8ge3t7IE1lbWJlciBWYXJpYWJsZXMKCiAgICAvKioKICAgICAqIFVSTCBwYXRoIGZvciB0aGlzIHJlcXVlc3QKICAgICAqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICB2YXIgJHBhdGg7CgogICAgLyoqCiAgICAgKiBCYXNlIFVSTCBmb3IgdGhpcyByZXF1ZXN0CiAgICAgKgogICAgICogU2VlIFBIUCBwYXJzZV91cmwgc3RydWN0dXJlCiAgICAgKgogICAgICogQHZhciBhcnJheQogICAgICovCiAgICB2YXIgJGJhc2VVcmw7CgogICAgLyoqCiAgICAgKiBSZWFsbSBzdHJpbmcgdG8gYmUgdXNlZCBpbiBhdXRoZW50aWZpY2F0aW9uIHBvcHVwcwogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHZhciAkaHR0cF9hdXRoX3JlYWxtID0gJ1BIUCBXZWJEQVYnOwoKICAgIC8qKgogICAgICogU3RyaW5nIHRvIGJlIHVzZWQgaW4gIlgtRGF2LVBvd2VyZWQtQnkiIGhlYWRlcgogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHZhciAkZGF2X3Bvd2VyZWRfYnkgPSAnJzsKCiAgICAvKioKICAgICAqIFJlbWVtYmVyIHBhcnNlZCBJZjogKFJGQzI1MTggOS40KSBoZWFkZXIgY29uZGl0aW9ucwogICAgICoKICAgICAqIEB2YXIgYXJyYXkKICAgICAqLwogICAgdmFyICRfaWZfaGVhZGVyX3VyaXMgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogSFRUUCByZXNwb25zZSBoZWFkZXJzCiAgICAgKgogICAgICogQHZhciBhcnJheQogICAgICovCiAgICB2YXIgJGhlYWRlcnMgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogRW5jb2Rpbmcgb2YgcHJvcGVydHkgdmFsdWVzIHBhc3NlZCBpbgogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHZhciAkX3Byb3BfZW5jb2RpbmcgPSAndXRmLTgnOwoKICAgIC8vIH19fQoKICAgIC8vIHt7eyBoYW5kbGVSZXF1ZXN0CgogICAgLyoqCiAgICAgKiBIYW5kbGUgV2ViREFWIHJlcXVlc3QKICAgICAqCiAgICAgKiBEaXNwYXRjaCBXZWJEQVYgcmVxdWVzdCB0byB0aGUgYXByb3ByaWF0ZSBtZXRob2Qgd3JhcHBlcgogICAgICoKICAgICAqIEBwYXJhbSB2b2lkCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgZnVuY3Rpb24gaGFuZGxlUmVxdWVzdCgpCiAgICB7CiAgICAgICAgLy8gaWRlbnRpZnkgb3Vyc2VsdmVzCiAgICAgICAgaWYgKGVtcHR5KCR0aGlzLT5kYXZfcG93ZXJlZF9ieSkpIHsKICAgICAgICAgICAgJHRoaXMtPmRhdl9wb3dlcmVkX2J5ID0gJ1BIUCBjbGFzczogJyAuIGdldF9jbGFzcygkdGhpcyk7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5zZXRSZXNwb25zZUhlYWRlcignWC1EYXYtUG93ZXJlZC1CeTogJyAuICR0aGlzLT5kYXZfcG93ZXJlZF9ieSk7CgogICAgICAgIC8vIHNldCBwYXRoCiAgICAgICAgaWYgKGVtcHR5KCR0aGlzLT5wYXRoKSkgewogICAgICAgICAgICAkdGhpcy0+cGF0aCA9ICR0aGlzLT5fdXJsZGVjb2RlKCRfU0VSVkVSWydQQVRIX0lORk8nXSk7CiAgICAgICAgICAgICR0aGlzLT5wYXRoID0gdHJpbSgkdGhpcy0+cGF0aCwgJy8nKTsKICAgICAgICB9CgogICAgICAgIGlmIChpbmlfZ2V0KCdtYWdpY19xdW90ZXNfZ3BjJykpIHsKICAgICAgICAgICAgJHRoaXMtPnBhdGggPSBzdHJpcHNsYXNoZXMoJHRoaXMtPnBhdGgpOwogICAgICAgIH0KCiAgICAgICAgLy8gc2V0IGJhc2UgVVJMCiAgICAgICAgaWYgKGVtcHR5KCR0aGlzLT5iYXNlVXJsKSkgewogICAgICAgICAgICAkdGhpcy0+YmFzZVVybCA9IHBhcnNlX3VybCgKICAgICAgICAgICAgICAgICJodHRwOi8vJF9TRVJWRVJbSFRUUF9IT1NUXSRfU0VSVkVSW1JFUVVFU1RfVVJJXSIpOwogICAgICAgICAgICAkdGhpcy0+YmFzZVVybFsncGF0aCddID0gc3Vic3RyKCR0aGlzLT5iYXNlVXJsWydwYXRoJ10sIDAsCiAgICAgICAgICAgICAgICBzdHJsZW4oJHRoaXMtPmJhc2VVcmxbJ3BhdGgnXSkgLSBzdHJsZW4oJF9TRVJWRVJbJ1BBVEhfSU5GTyddKSk7CiAgICAgICAgfQoKICAgICAgICAvLyBjaGVjayBhdXRoZW50aWNhdGlvbgogICAgICAgIGlmICghJHRoaXMtPmNoZWNrX2F1dGhfd3JhcHBlcigpKSB7CgogICAgICAgICAgICAvLyBSRkMyNTE4IHNheXMgd2UgbXVzdCB1c2UgRGlnZXN0IGluc3RlYWQgb2YgQmFzaWMgYnV0IE1pY3Jvc29mdAogICAgICAgICAgICAvLyBjbGllbnRzIGRvIG5vdCBzdXBwb3J0IERpZ2VzdCBhbmQgd2UgZG9uJ3Qgc3VwcG9ydCBOVExNIG9yCiAgICAgICAgICAgIC8vIEtlcmJlcm9zIHNvIHdlIGFyZSBzdHVjayB3aXRoIEJhc2ljIGhlcmUKICAgICAgICAgICAgJHRoaXMtPnNldFJlc3BvbnNlSGVhZGVyKCdXV1ctQXV0aGVudGljYXRlOiBCYXNpYyByZWFsbT0iJwogICAgICAgICAgICAgICAgLiAkdGhpcy0+aHR0cF9hdXRoX3JlYWxtIC4gJyInKTsKCiAgICAgICAgICAgIC8vIFdpbmRvd3Mgc2VlbXMgdG8gcmVxdWlyZSB0aGlzIGJlaW5nIHRoZSBsYXN0IGhlYWRlciBzZW50CiAgICAgICAgICAgIC8vIChjaGFuZ2VkIGFjY29yZGluZyB0byBQRUNMIGJ1ZyAjMzEzOCkKICAgICAgICAgICAgJHRoaXMtPnNldFJlc3BvbnNlU3RhdHVzKCc0MDEgQXV0aGVudGljYXRpb24gUmVxdWlyZWQnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gY2hlY2sKICAgICAgICBpZiAoISR0aGlzLT5fY2hlY2tfaWZfaGVhZGVyX2NvbmRpdGlvbnMoKSkgewogICAgICAgICAgICAkdGhpcy0+c2V0UmVzcG9uc2VTdGF0dXMoJzQxMiBQcmVjb25kaXRpb24gRmFpbGVkJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIGRldGVjdCByZXF1ZXN0ZWQgbWV0aG9kIG5hbWVzCiAgICAgICAgJG1ldGhvZCA9IHN0cnRvbG93ZXIoJF9TRVJWRVJbJ1JFUVVFU1RfTUVUSE9EJ10pOwogICAgICAgICR3cmFwcGVyID0gJG1ldGhvZCAuICdfd3JhcHBlcic7CgogICAgICAgIC8vIGVtdWxhdGUgSEVBRCB1c2luZyBHRVQgaWYgbm8gSEVBRCBtZXRob2QgZm91bmQKICAgICAgICBpZiAoJHdyYXBwZXIgPT0gJ2hlYWRfd3JhcHBlcicgJiYKICAgICAgICAgICAgICAgICFtZXRob2RfZXhpc3RzKCR0aGlzLCAnaGVhZCcpKSB7CiAgICAgICAgICAgICRtZXRob2QgPSAnZ2V0JzsKICAgICAgICB9CgogICAgICAgIGlmIChtZXRob2RfZXhpc3RzKCR0aGlzLCAkbWV0aG9kKSAmJgogICAgICAgICAgICAgICAgbWV0aG9kX2V4aXN0cygkdGhpcywgJHdyYXBwZXIpIHx8CiAgICAgICAgICAgICAgICAkbWV0aG9kID09ICdvcHRpb25zJykgewogICAgICAgICAgICAkdGhpcy0+JHdyYXBwZXIoKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gbWV0aG9kIG5vdCBmb3VuZC9pbXBsZW1lbnRlZAogICAgICAgIGlmICgkbWV0aG9kID09ICdsb2NrJykgewogICAgICAgICAgICAkdGhpcy0+c2V0UmVzcG9uc2VTdGF0dXMoJzQxMiBQcmVjb25kaXRpb24gRmFpbGVkJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIHRlbGwgY2xpZW50IHdoYXQncyBhbGxvd2VkCiAgICAgICAgJHRoaXMtPnNldFJlc3BvbnNlU3RhdHVzKCc0MDUgTWV0aG9kIE5vdCBBbGxvd2VkJyk7CiAgICAgICAgJHRoaXMtPnNldFJlc3BvbnNlSGVhZGVyKCdBbGxvdzogJyAuIGltcGxvZGUoJywgJywgJHRoaXMtPl9hbGxvdygpKSk7CiAgICB9CgogICAgLy8gfX19CgogICAgLy8ge3t7IGFic3RyYWN0IFdlYkRBViBtZXRob2RzCgogICAgLy8ge3t7IFBST1BGSU5ECgogICAgLyoqCiAgICAgKiBQUk9QRklORCBpbXBsZW1lbnRhdGlvbgogICAgICoKICAgICAqIEBhYnN0cmFjdAogICAgICogQHBhcmFtIGFycmF5ICYkcGFyYW1zCiAgICAgKiBAcmV0dXJucyBpbnQgSFRUUC1TdGF0dXNjb2RlCiAgICAgKi8KCiAgICAvKiBhYnN0cmFjdAogICAgICAgZnVuY3Rpb24gcHJvcGZpbmQoKQogICAgICAgewogICAgICAgICAgIC8vIGR1bW15IGVudHJ5IGZvciBQSFBEb2MKICAgICAgIH0KICAgICovCgogICAgLy8gfX19CgogICAgLy8ge3t7IFBST1BQQVRDSAoKICAgIC8qKgogICAgICogUFJPUFBBVENIIGltcGxlbWVudGF0aW9uCiAgICAgKgogICAgICogQGFic3RyYWN0CiAgICAgKiBAcGFyYW0gYXJyYXkgJiRwYXJhbXMKICAgICAqIEByZXR1cm5zIGludCBIVFRQLVN0YXR1c2NvZGUKICAgICAqLwoKICAgIC8qIGFic3RyYWN0CiAgICAgICBmdW5jdGlvbiBwcm9wcGF0Y2goKQogICAgICAgewogICAgICAgICAgIC8vIGR1bW15IGVudHJ5IGZvciBQSFBEb2MKICAgICAgIH0KICAgICovCgogICAgLy8gfX19CgogICAgLy8ge3t7IE1LQ09MCgogICAgLyoqCiAgICAgKiBNS0NPTCBpbXBsZW1lbnRhdGlvbgogICAgICoKICAgICAqIEBhYnN0cmFjdAogICAgICogQHBhcmFtIGFycmF5ICYkcGFyYW1zCiAgICAgKiBAcmV0dXJucyBpbnQgSFRUUC1TdGF0dXNjb2RlCiAgICAgKi8KCiAgICAvKiBhYnN0cmFjdAogICAgICAgZnVuY3Rpb24gbWtjb2woKQogICAgICAgewogICAgICAgICAgIC8vIGR1bW15IGVudHJ5IGZvciBQSFBEb2MKICAgICAgIH0KICAgICovCgogICAgLy8gfX19CgogICAgLy8ge3t7IEdFVAoKICAgIC8qKgogICAgICogR0VUIGltcGxlbWVudGF0aW9uCiAgICAgKgogICAgICogT3ZlcmxvYWQgdGhpcyBtZXRob2QgdG8gcmV0cmlldmUgcmVzb3VyY2VzIGZyb20geW91ciBzZXJ2ZXIKICAgICAqCiAgICAgKiBAYWJzdHJhY3QKICAgICAqIEBwYXJhbSBhcnJheSAmJHBhcmFtcyBhcnJheSBvZiBpbnB1dCBhbmQgb3V0cHV0IHBhcmFtZXRlcnMKICAgICAqIDxicj48Yj5pbnB1dDwvYj48dWw+CiAgICAgKiA8bGk+IHBhdGggLQogICAgICogPC91bD4KICAgICAqIDxicj48Yj5vdXRwdXQ8L2I+PHVsPgogICAgICogPGxpPiBzaXplIC0KICAgICAqIDwvdWw+CiAgICAgKiBAcmV0dXJucyBpbnQgSFRUUC1TdGF0dXNjb2RlCiAgICAgKi8KCiAgICAvKiBhYnN0cmFjdAogICAgICAgZnVuY3Rpb24gZ2V0KCkKICAgICAgIHsKICAgICAgICAgICAvLyBkdW1teSBlbnRyeSBmb3IgUEhQRG9jCiAgICAgICB9CiAgICAqLwoKICAgIC8vIH19fQoKICAgIC8vIHt7eyBERUxFVEUKCiAgICAvKioKICAgICAqIERFTEVURSBpbXBsZW1lbnRhdGlvbgogICAgICoKICAgICAqIEBhYnN0cmFjdAogICAgICogQHBhcmFtIGFycmF5ICYkcGFyYW1zCiAgICAgKiBAcmV0dXJucyBpbnQgSFRUUC1TdGF0dXNjb2RlCiAgICAgKi8KCiAgICAvKiBhYnN0cmFjdAogICAgICAgZnVuY3Rpb24gZGVsZXRlKCkKICAgICAgIHsKICAgICAgICAgICAvLyBkdW1teSBlbnRyeSBmb3IgUEhQRG9jCiAgICAgICB9CiAgICAqLwoKICAgIC8vIH19fQoKICAgIC8vIHt7eyBQVVQKCiAgICAvKioKICAgICAqIFBVVCBpbXBsZW1lbnRhdGlvbgogICAgICoKICAgICAqIEBhYnN0cmFjdAogICAgICogQHBhcmFtIGFycmF5ICYkcGFyYW1zCiAgICAgKiBAcmV0dXJucyBpbnQgSFRUUC1TdGF0dXNjb2RlCiAgICAgKi8KCiAgICAvKiBhYnN0cmFjdAogICAgICAgZnVuY3Rpb24gcHV0KCkKICAgICAgIHsKICAgICAgICAgICAvLyBkdW1teSBlbnRyeSBmb3IgUEhQRG9jCiAgICAgICB9CiAgICAqLwoKICAgIC8vIH19fQoKICAgIC8vIHt7eyBDT1BZCgogICAgLyoqCiAgICAgKiBDT1BZIGltcGxlbWVudGF0aW9uCiAgICAgKgogICAgICogQGFic3RyYWN0CiAgICAgKiBAcGFyYW0gYXJyYXkgJiRwYXJhbXMKICAgICAqIEByZXR1cm5zIGludCBIVFRQLVN0YXR1c2NvZGUKICAgICAqLwoKICAgIC8qIGFic3RyYWN0CiAgICAgICBmdW5jdGlvbiBjb3B5KCkKICAgICAgIHsKICAgICAgICAgICAvLyBkdW1teSBlbnRyeSBmb3IgUEhQRG9jCiAgICAgICB9CiAgICAqLwoKICAgIC8vIH19fQoKICAgIC8vIHt7eyBNT1ZFCgogICAgLyoqCiAgICAgKiBNT1ZFIGltcGxlbWVudGF0aW9uCiAgICAgKgogICAgICogQGFic3RyYWN0CiAgICAgKiBAcGFyYW0gYXJyYXkgJiRwYXJhbXMKICAgICAqIEByZXR1cm5zIGludCBIVFRQLVN0YXR1c2NvZGUKICAgICAqLwoKICAgIC8qIGFic3RyYWN0CiAgICAgICBmdW5jdGlvbiBtb3ZlKCkKICAgICAgIHsKICAgICAgICAgICAvLyBkdW1teSBlbnRyeSBmb3IgUEhQRG9jCiAgICAgICB9CiAgICAqLwoKICAgIC8vIH19fQoKICAgIC8vIHt7eyBMT0NLCgogICAgLyoqCiAgICAgKiBMT0NLIGltcGxlbWVudGF0aW9uCiAgICAgKgogICAgICogQGFic3RyYWN0CiAgICAgKiBAcGFyYW0gYXJyYXkgJiRwYXJhbXMKICAgICAqIEByZXR1cm5zIGludCBIVFRQLVN0YXR1c2NvZGUKICAgICAqLwoKICAgIC8qIGFic3RyYWN0CiAgICAgICBmdW5jdGlvbiBsb2NrKCkKICAgICAgIHsKICAgICAgICAgICAvLyBkdW1teSBlbnRyeSBmb3IgUEhQRG9jCiAgICAgICB9CiAgICAqLwoKICAgIC8vIH19fQoKICAgIC8vIHt7eyBVTkxPQ0sKCiAgICAvKioKICAgICAqIFVOTE9DSyBpbXBsZW1lbnRhdGlvbgogICAgICoKICAgICAqIEBhYnN0cmFjdAogICAgICogQHBhcmFtIGFycmF5ICYkcGFyYW1zCiAgICAgKiBAcmV0dXJucyBpbnQgSFRUUC1TdGF0dXNjb2RlCiAgICAgKi8KCiAgICAvKiBhYnN0cmFjdAogICAgICAgZnVuY3Rpb24gdW5sb2NrKCkKICAgICAgIHsKICAgICAgICAgICAvLyBkdW1teSBlbnRyeSBmb3IgUEhQRG9jCiAgICAgICB9CiAgICAqLwoKICAgIC8vIH19fQoKICAgIC8vIH19fQoKICAgIC8vIHt7eyBvdGhlciBhYnN0cmFjdCBtZXRob2RzCgogICAgLy8ge3t7IGNoZWNrQXV0aAoKICAgIC8qKgogICAgICogQ2hlY2sgYXV0aGVudGljYXRpb24KICAgICAqCiAgICAgKiBPdmVybG9hZCB0aGlzIG1ldGhvZCB0byByZXRyaWV2ZSBhbmQgY29uZmlybSBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbgogICAgICoKICAgICAqIEBhYnN0cmFjdAogICAgICogQHBhcmFtIHN0cmluZyB0eXBlIEF1dGhlbnRpY2F0aW9uIHR5cGUsIGUuZy4gImJhc2ljIiBvciAiZGlnZXN0IgogICAgICogQHBhcmFtIHN0cmluZyB1c2VybmFtZSBUcmFuc21pdHRlZCB1c2VybmFtZQogICAgICogQHBhcmFtIHN0cmluZyBwYXNzd29ydCBUcmFuc21pdHRlZCBwYXNzd29yZAogICAgICogQHJldHVybnMgYm9vbCBBdXRoZW50aWNhdGlvbiBzdGF0dXMKICAgICAqLwoKICAgIC8qIGFic3RyYWN0CiAgICAgICBmdW5jdGlvbiBjaGVja0F1dGgoJHR5cGUsICR1c2VybmFtZSwgJHBhc3N3b3JkKQogICAgICAgewogICAgICAgICAgIC8vIGR1bW15IGVudHJ5IGZvciBQSFBEb2MKICAgICAgIH0KICAgICovCgogICAgLy8gfX19CgogICAgLy8ge3t7IGdldExvY2tzCgogICAgLyoqCiAgICAgKiBHZXQgbG9jayBlbnRyaWVzIGZvciBhIHJlc291cmNlCiAgICAgKgogICAgICogT3ZlcmxvYWQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHNoYXJlZCBhbmQgZXhjbHVzaXZlIGxvY2tzIGFjdGl2ZSBmb3IKICAgICAqIHRoaXMgcmVzb3VyY2UKICAgICAqCiAgICAgKiBAYWJzdHJhY3QKICAgICAqIEBwYXJhbSBzdHJpbmcgcmVzb3VyY2UgcGF0aCB0byBjaGVjawogICAgICogQHJldHVybnMgYXJyYXkgb2YgbG9jayBlbnRyaWVzIGVhY2ggY29uc2lzdGluZwogICAgICogICAgICAgICAgICAgICAgb2YgJ3R5cGUnICgnc2hhcmVkJy8nZXhjbHVzaXZlJyksICd0b2tlbicgYW5kICd0aW1lb3V0JwogICAgICovCgogICAgLyogYWJzdHJhY3QKICAgICAgIGZ1bmN0aW9uIGdldExvY2tzKCRwYXRoKQogICAgICAgewogICAgICAgICAgIC8vIGR1bW15IGVudHJ5IGZvciBQSFBEb2MKICAgICAgIH0KICAgICovCgogICAgLy8gfX19CgogICAgLy8gfX19CgogICAgLy8ge3t7IFdlYkRBViBIVFRQIG1ldGhvZCB3cmFwcGVycwoKICAgIC8vIHt7eyBvcHRpb25zCgogICAgLyoqCiAgICAgKiBPUFRJT05TIG1ldGhvZCBoYW5kbGVyCiAgICAgKgogICAgICogVGhlIE9QVElPTlMgbWV0aG9kIGhhbmRsZXIgY3JlYXRlcyBhIHZhbGlkIE9QVElPTlMgcmVwbHkgaW5jbHVkaW5nIERhdjoKICAgICAqIGFuZCBBbGxvd2VkOiBoZWFlcnMgYmFzZWQgb24gdGhlIGltcGxlbWVudGVkIG1ldGhvZHMgZm91bmQgaW4gdGhlIGFjdHVhbAogICAgICogaW5zdGFuY2UKICAgICAqCiAgICAgKiBAcGFyYW0gdm9pZAogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIGZ1bmN0aW9uIG9wdGlvbnMoKQogICAgewogICAgICAgIC8vIGdldCBhbGxvd2VkIG1ldGhvZHMKICAgICAgICAkYWxsb3cgPSAkdGhpcy0+X2FsbG93KCk7CgogICAgICAgIC8vIGRhdiBoZWFkZXIKICAgICAgICAkZGF2ID0gYXJyYXkoMSk7IC8vIGFzc3VtZSB3ZSBhcmUgYWx3YXlzIGRhdiBjbGFzcyAxIGNvbXBsaWFudAogICAgICAgIGlmIChpbl9hcnJheSgnTE9DSycsICRhbGxvdykgJiYgaW5fYXJyYXkoJ1VOTE9DSycsICRhbGxvdykpIHsKICAgICAgICAgICAgJGRhdltdID0gMjsgLy8gZGF2IGNsYXNzIDIgcmVxdWlyZXMgdGhhdCBsb2NraW5nIGlzIHN1cHBvcnRlZAogICAgICAgIH0KCiAgICAgICAgLy8gdGVsbCBjbGllbnRzIHdoYXQgd2UgZm91bmQKICAgICAgICAkdGhpcy0+c2V0UmVzcG9uc2VIZWFkZXIoJ0FsbG93OiAnIC4gaW1wbG9kZSgnLCAnLCAkYWxsb3cpKTsKICAgICAgICAkdGhpcy0+c2V0UmVzcG9uc2VIZWFkZXIoJ0RBVjogJyAuIGltcGxvZGUoJywnLCAkZGF2KSk7CiAgICAgICAgJHRoaXMtPnNldFJlc3BvbnNlSGVhZGVyKCdDb250ZW50LUxlbmd0aDogMCcpOwoKICAgICAgICAvLyBNaWNyb3NvZnQgY2xpZW50cyBkZWZhdWx0IHRvIHRoZSBGcm9udHBhZ2UgcHJvdG9jb2wgdW5sZXNzIHdlIHRlbGwKICAgICAgICAvLyB0aGVtIHRvIHVzZSBXZWJEQVYKICAgICAgICAkdGhpcy0+c2V0UmVzcG9uc2VIZWFkZXIoJ01TLUF1dGhvci1WaWE6IERBVicpOwoKICAgICAgICAkdGhpcy0+c2V0UmVzcG9uc2VTdGF0dXMoJzIwMCBPSycpOwogICAgfQoKICAgIC8vIH19fQoKICAgIC8vIHt7eyBwcm9wZmluZF9yZXF1ZXN0X2hlbHBlcgoKICAgIC8qKgogICAgICogUFJPUEZJTkQgcmVxdWVzdCBoZWxwZXIgLSBwcmVwYXJlcyBkYXRhLXN0cnVjdHVyZXMgZnJvbSBQUk9QRklORCByZXF1ZXN0cwogICAgICoKICAgICAqIEBwYXJhbSBvcHRpb25zCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgZnVuY3Rpb24gcHJvcGZpbmRfcmVxdWVzdF9oZWxwZXIoJiRvcHRpb25zKQogICAgewogICAgICAgICRvcHRpb25zID0gYXJyYXkoKTsKICAgICAgICAkb3B0aW9uc1sncGF0aCddID0gJHRoaXMtPnBhdGg7CgogICAgICAgIC8vIGdldCBkZXB0aCBmcm9tIGhlYWRlciAoZGVmYXVsdCBpcyAnaW5maW5pdHknKQogICAgICAgICRvcHRpb25zWydkZXB0aCddID0gJ2luZmluaXR5JzsKICAgICAgICBpZiAoIWVtcHR5KCRfU0VSVkVSWydIVFRQX0RFUFRIJ10pKSB7CiAgICAgICAgICAgICRvcHRpb25zWydkZXB0aCddID0gJF9TRVJWRVJbJ0hUVFBfREVQVEgnXTsKICAgICAgICB9CgogICAgICAgIC8vIGFuYWx5emUgcmVxdWVzdCBwYXlsb2FkCiAgICAgICAgJHBhcnNlciA9IG5ldyBfcGFyc2VfcHJvcGZpbmQoJHRoaXMtPm9wZW5SZXF1ZXN0Qm9keSgpKTsKICAgICAgICBpZiAoISRwYXJzZXItPnN1Y2Nlc3MpIHsKICAgICAgICAgICAgJHRoaXMtPnNldFJlc3BvbnNlU3RhdHVzKCc0MDAgQmFkIFJlcXVlc3QnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJG9wdGlvbnNbJ3Byb3BzJ10gPSAkcGFyc2VyLT5wcm9wczsKCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLy8gfX19CgogICAgLy8ge3t7IHByb3BmaW5kX3Jlc3BvbnNlX2hlbHBlcgoKICAgIC8qKgogICAgICogUFJPUEZJTkQgcmVzcG9uc2UgaGVscGVyIC0gZm9ybWF0IFBST1BGSU5EIHJlc3BvbnNlCiAgICAgKgogICAgICogQHBhcmFtIG9wdGlvbnMKICAgICAqIEBwYXJhbSBmaWxlcwogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIGZ1bmN0aW9uIHByb3BmaW5kX3Jlc3BvbnNlX2hlbHBlcigkb3B0aW9ucywgJGZpbGVzKQogICAgewogICAgICAgICRyZXNwb25zZXMgPSBhcnJheSgpOwoKICAgICAgICAvLyBub3cgbG9vcCBvdmVyIGFsbCByZXR1cm5lZCBmaWxlcwogICAgICAgIGZvcmVhY2ggKCRmaWxlcyBhcyAkZmlsZSkgewogICAgICAgICAgICAkcmVzcG9uc2UgPSBhcnJheSgpOwoKICAgICAgICAgICAgaWYgKGVtcHR5KCRmaWxlWydocmVmJ10pKSB7CiAgICAgICAgICAgICAgICAkcmVzcG9uc2VbJ2hyZWYnXSA9ICR0aGlzLT5nZXRIcmVmKCRmaWxlWydwYXRoJ10pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHJlc3BvbnNlWydocmVmJ10gPSAkZmlsZVsnaHJlZiddOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkcmVzcG9uc2VbJ3Byb3BzdGF0J10gPSBhcnJheSgpOwoKICAgICAgICAgICAgLy8gY29sbGVjdCBuYW1lc3BhY2VzIGhlcmUKICAgICAgICAgICAgJHJlc3BvbnNlWyduYW1lc3BhY2VzJ10gPSBhcnJheSgpOwogICAgICAgICAgICBpZiAoIWVtcHR5KCRvcHRpb25zWyduYW1lc3BhY2VzJ10pKSB7CiAgICAgICAgICAgICAgICAkcmVzcG9uc2VbJ25hbWVzcGFjZXMnXSA9ICRvcHRpb25zWyduYW1lc3BhY2VzJ107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIE1pY3Jvc29mdCBuZWVkcyB0aGlzIHNwZWNpYWwgbmFtZXNwYWNlIGZvciBkYXRlIGFuZCB0aW1lIHZhbHVlcwogICAgICAgICAgICAkcmVzcG9uc2VbJ25hbWVzcGFjZXMnXVtIVFRQX1dFQkRBVl9TRVJWRVJfREFUQVRZUEVfTkFNRVNQQUNFXSA9CiAgICAgICAgICAgICAgICAnbnMnIC4gY291bnQoJHJlc3BvbnNlWyduYW1lc3BhY2VzJ10pOwoKICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRvcHRpb25zWydwcm9wcyddKSkgewoKICAgICAgICAgICAgICAgIC8vIGxvb3Agb3ZlciBhbGwgcmVxdWVzdGVkIHByb3BlcnRpZXMKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRvcHRpb25zWydwcm9wcyddIGFzICRyZXFwcm9wKSB7CiAgICAgICAgICAgICAgICAgICAgJHN0YXR1cyA9ICcyMDAgT0snOwogICAgICAgICAgICAgICAgICAgICRwcm9wID0gJHRoaXMtPmdldFByb3AoJHJlcXByb3AsICRmaWxlLCAkb3B0aW9ucyk7CgogICAgICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJHByb3BbJ3N0YXR1cyddKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkc3RhdHVzID0gJHByb3BbJ3N0YXR1cyddOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGVtcHR5KCRyZXNwb25zZVsncHJvcHN0YXQnXVskc3RhdHVzXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3BvbnNlWydwcm9wc3RhdCddWyRzdGF0dXNdID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRyZXNwb25zZVsncHJvcHN0YXQnXVskc3RhdHVzXVtdID0gJHByb3A7CgogICAgICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBoYW5kbGluZwogICAgICAgICAgICAgICAgICAgIGlmIChlbXB0eSgkcHJvcFsnbnMnXSkgfHwgLy8gZW1wdHkgbmFtZXNwYWNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJvcFsnbnMnXSA9PSAnREFWOicgfHwgLy8gZGVmYXVsdCBuYW1lc3BhY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICFlbXB0eSgkcmVzcG9uc2VbJ25hbWVzcGFjZXMnXVskcHJvcFsnbnMnXV0pKSB7IC8vIGFscmVhZHkga25vd24KICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyByZWdpc3RlciBuYW1lc3BhY2UKICAgICAgICAgICAgICAgICAgICAkcmVzcG9uc2VbJ25hbWVzcGFjZXMnXVskcHJvcFsnbnMnXV0gPSAnbnMnIC4gY291bnQoJHJlc3BvbnNlWyduYW1lc3BhY2VzJ10pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKGlzX2FycmF5KCRmaWxlWydwcm9wcyddKSkgewoKICAgICAgICAgICAgICAgIC8vIGxvb3Agb3ZlciBhbGwgcmV0dXJuZWQgcHJvcGVydGllcwogICAgICAgICAgICAgICAgZm9yZWFjaCAoJGZpbGVbJ3Byb3BzJ10gYXMgJHByb3ApIHsKICAgICAgICAgICAgICAgICAgICAkc3RhdHVzID0gJzIwMCBPSyc7CgogICAgICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJHByb3BbJ3N0YXR1cyddKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkc3RhdHVzID0gJHByb3BbJ3N0YXR1cyddOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGVtcHR5KCRyZXNwb25zZVsncHJvcHN0YXQnXVskc3RhdHVzXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3BvbnNlWydwcm9wc3RhdCddWyRzdGF0dXNdID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICgkb3B0aW9uc1sncHJvcHMnXSA9PSAncHJvcG5hbWUnKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IG5hbWVzIG9mIGFsbCBleGlzdGluZyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHJlbW92ZSB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICAgICAgdW5zZXQoJHByb3BbJ3ZhbHVlJ10pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJHJlc3BvbnNlWydwcm9wc3RhdCddWyRzdGF0dXNdW10gPSAkcHJvcDsKICAgICAgICAgICAgICAgICAgICAgICAgdW5zZXQoJHByb3BbJ3ZhbHVlJ10pOwoKICAgICAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgaGFuZGxpbmcKICAgICAgICAgICAgICAgICAgICBpZiAoZW1wdHkoJHByb3BbJ25zJ10pIHx8IC8vIGVtcHR5IG5hbWVzcGFjZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHByb3BbJ25zJ10gPT0gJ0RBVjonIHx8IC8vIGRlZmF1bHQgbmFtZXNwYWNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZW1wdHkoJHJlc3BvbnNlWyduYW1lc3BhY2VzJ11bJHByb3BbJ25zJ11dKSkgeyAvLyBhbHJlYWR5IGtub3duCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgbmFtZXNwYWNlCiAgICAgICAgICAgICAgICAgICAgJHJlc3BvbnNlWyduYW1lc3BhY2VzJ11bJHByb3BbJ25zJ11dID0gJ25zJyAuIGNvdW50KCRyZXNwb25zZVsnbmFtZXNwYWNlcyddKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHJlc3BvbnNlc1tdID0gJHJlc3BvbnNlOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPl9tdWx0aXN0YXR1c1Jlc3BvbnNlSGVscGVyKCRyZXNwb25zZXMpOwogICAgfQoKICAgIC8vIH19fQoKICAgIC8vIHt7eyBwcm9wZmluZF93cmFwcGVyCgogICAgLyoqCiAgICAgKiBQUk9QRklORCBtZXRob2Qgd3JhcHBlcgogICAgICoKICAgICAqIEBwYXJhbSB2b2lkCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgZnVuY3Rpb24gcHJvcGZpbmRfd3JhcHBlcigpCiAgICB7CiAgICAgICAgLy8gcHJlcGFyZSBkYXRhLXN0cnVjdHVyZSBmcm9tIFBST1BGSU5EIHJlcXVlc3QKICAgICAgICBpZiAoISR0aGlzLT5wcm9wZmluZF9yZXF1ZXN0X2hlbHBlcigkb3B0aW9ucykpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gY2FsbCB1c2VyIGhhbmRsZXIKICAgICAgICBpZiAoISR0aGlzLT5wcm9wZmluZCgkb3B0aW9ucywgJGZpbGVzKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBmb3JtYXQgUFJPUEZJTkQgcmVzcG9uc2UKICAgICAgICAkdGhpcy0+cHJvcGZpbmRfcmVzcG9uc2VfaGVscGVyKCRvcHRpb25zLCAkZmlsZXMpOwogICAgfQoKICAgIC8vIH19fQoKICAgIC8vIHt7eyBwcm9wcGF0Y2hfcmVxdWVzdF9oZWxwZXIKCiAgICAvKioKICAgICAqIFBST1BQQVRDSCByZXF1ZXN0IGhlbHBlciAtIHByZXBhcmVzIGRhdGEtc3RydWN0dXJlcyBmcm9tIFBST1BQQVRDSCByZXF1ZXN0cwogICAgICoKICAgICAqIEBwYXJhbSBvcHRpb25zCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgZnVuY3Rpb24gcHJvcHBhdGNoX3JlcXVlc3RfaGVscGVyKCYkb3B0aW9ucykKICAgIHsKICAgICAgICAkb3B0aW9ucyA9IGFycmF5KCk7CiAgICAgICAgJG9wdGlvbnNbJ3BhdGgnXSA9ICR0aGlzLT5wYXRoOwoKICAgICAgICAkcHJvcGluZm8gPSBuZXcgX3BhcnNlX3Byb3BwYXRjaCgkdGhpcy0+b3BlblJlcXVlc3RCb2R5KCkpOwoKICAgICAgICBpZiAoISRwcm9waW5mby0+c3VjY2VzcykgewogICAgICAgICAgICAkdGhpcy0+c2V0UmVzcG9uc2VTdGF0dXMoJzQwMCBCYWQgUmVxdWVzdCcpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAkb3B0aW9uc1sncHJvcHMnXSA9ICRwcm9waW5mby0+cHJvcHM7CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8vIH19fQoKICAgIC8vIHt7eyBwcm9wcGF0Y2hfcmVzcG9uc2VfaGVscGVyCgogICAgLyoqCiAgICAgKiBQUk9QUEFUQ0ggcmVzcG9uc2UgaGVscGVyIC0gZm9ybWF0IFBST1BQQVRDSCByZXNwb25zZQogICAgICoKICAgICAqIEBwYXJhbSBvcHRpb25zCiAgICAgKiBAcGFyYW0gcmVzcG9uc2VkZXNjcgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIGZ1bmN0aW9uIHByb3BwYXRjaF9yZXNwb25zZV9oZWxwZXIoJG9wdGlvbnMsICRyZXNwb25zZWRlc2NyaXB0aW9uPW51bGwpCiAgICB7CiAgICAgICAgJHJlc3BvbnNlID0gYXJyYXkoKTsKCiAgICAgICAgaWYgKGVtcHR5KCRvcHRpb25zWydocmVmJ10pKSB7CiAgICAgICAgICAgICRyZXNwb25zZVsnaHJlZiddID0gJHRoaXMtPmdldEhyZWYoJG9wdGlvbnNbJ3BhdGgnXSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHJlc3BvbnNlWydocmVmJ10gPSAkb3B0aW9uc1snaHJlZiddOwogICAgICAgIH0KCiAgICAgICAgJHJlc3BvbnNlWydwcm9wc3RhdCddID0gYXJyYXkoKTsKCiAgICAgICAgLy8gY29sbGVjdCBuYW1lc3BhY2VzIGhlcmUKICAgICAgICAkcmVzcG9uc2VbJ25hbWVzcGFjZXMnXSA9IGFycmF5KCk7CiAgICAgICAgaWYgKCFlbXB0eSgkb3B0aW9uc1snbmFtZXNwYWNlcyddKSkgewogICAgICAgICAgICAkcmVzcG9uc2VbJ25hbWVzcGFjZXMnXSA9ICRvcHRpb25zWyduYW1lc3BhY2VzJ107CiAgICAgICAgfQoKICAgICAgICBpZiAoIWVtcHR5KCRvcHRpb25zWydwcm9wcyddKSAmJiBpc19hcnJheSgkb3B0aW9uc1sncHJvcHMnXSkpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJG9wdGlvbnNbJ3Byb3BzJ10gYXMgJHByb3ApIHsKICAgICAgICAgICAgICAgICRzdGF0dXMgPSAnMjAwIE9LJzsKICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJHByb3BbJ3N0YXR1cyddKSkgewogICAgICAgICAgICAgICAgICAgICRzdGF0dXMgPSAkcHJvcFsnc3RhdHVzJ107CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGVtcHR5KCRyZXNwb25zZVsncHJvcHN0YXQnXVskc3RhdHVzXSkpIHsKICAgICAgICAgICAgICAgICAgICAkcmVzcG9uc2VbJ3Byb3BzdGF0J11bJHN0YXR1c10gPSBhcnJheSgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRyZXNwb25zZVsncHJvcHN0YXQnXVskc3RhdHVzXVtdID0gJHByb3A7CgogICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGhhbmRsaW5nCiAgICAgICAgICAgICAgICBpZiAoZW1wdHkoJHByb3BbJ25zJ10pIHx8IC8vIGVtcHR5IG5hbWVzcGFjZQogICAgICAgICAgICAgICAgICAgICAgICAkcHJvcFsnbnMnXSA9PSAnREFWOicgfHwgLy8gZGVmYXVsdCBuYW1lc3BhY2UKICAgICAgICAgICAgICAgICAgICAgICAgIWVtcHR5KCRyZXNwb25zZVsnbmFtZXNwYWNlcyddWyRwcm9wWyducyddXSkpIHsgLy8gYWxyZWFkeSBrbm93bgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIG5hbWVzcGFjZQogICAgICAgICAgICAgICAgJHJlc3BvbnNlWyduYW1lc3BhY2VzJ11bJHByb3BbJ25zJ11dID0gJ25zJyAuIGNvdW50KCRyZXNwb25zZVsnbmFtZXNwYWNlcyddKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJHJlc3BvbnNlWydyZXNwb25zZWRlc2NyaXB0aW9uJ10gPSAkcmVzcG9uc2VkZXNjcmlwdGlvbjsKCiAgICAgICAgJHRoaXMtPl9tdWx0aXN0YXR1c1Jlc3BvbnNlSGVscGVyKGFycmF5KCRyZXNwb25zZSkpOwogICAgfQoKICAgIC8vIH19fQoKICAgIC8vIHt7eyBwcm9wcGF0Y2hfd3JhcHBlcgoKICAgIC8qKgogICAgICogUFJPUFBBVENIIG1ldGhvZCB3cmFwcGVyCiAgICAgKgogICAgICogQHBhcmFtIHZvaWQKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBmdW5jdGlvbiBwcm9wcGF0Y2hfd3JhcHBlcigpCiAgICB7CiAgICAgICAgLy8gY2hlY2sgcmVzb3VyY2UgaXMgbm90IGxvY2tlZAogICAgICAgIGlmICghJHRoaXMtPmNoZWNrX2xvY2tzX3dyYXBwZXIoJHRoaXMtPnBhdGgpKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRSZXNwb25zZVN0YXR1cygnNDIzIExvY2tlZCcpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBwZXJwYXJlIGRhdGEtc3RydWN0dXJlIGZyb20gUFJPUEFUQ0ggcmVxdWVzdAogICAgICAgIGlmICghJHRoaXMtPnByb3BwYXRjaF9yZXF1ZXN0X2hlbHBlcigkb3B0aW9ucykpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gY2FsbCB1c2VyIGhhbmRsZXIKICAgICAgICAkcmVzcG9uc2VkZXNjcmlwdGlvbiA9ICR0aGlzLT5wcm9wcGF0Y2goJG9wdGlvbnMpOwoKICAgICAgICAvLyBmb3JtYXQgUFJPUFBBVENIIHJlc3BvbnNlCiAgICAgICAgJHRoaXMtPnByb3BwYXRjaF9yZXNwb25zZV9oZWxwZXIoJG9wdGlvbnMsICRyZXNwb25zZWRlc2NyaXB0aW9uKTsKICAgIH0KCiAgICAvLyB9fX0KCiAgICAvLyB7e3sgbWtjb2xfd3JhcHBlcgoKICAgIC8qKgogICAgICogTUtDT0wgbWV0aG9kIHdyYXBwZXIKICAgICAqCiAgICAgKiBAcGFyYW0gdm9pZAogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1rY29sX3dyYXBwZXIoKQogICAgewogICAgICAgICRvcHRpb25zID0gYXJyYXkoKTsKICAgICAgICAkb3B0aW9uc1sncGF0aCddID0gJHRoaXMtPnBhdGg7CgogICAgICAgICRzdGF0dXMgPSAkdGhpcy0+bWtjb2woJG9wdGlvbnMpOwoKICAgICAgICAkdGhpcy0+c2V0UmVzcG9uc2VTdGF0dXMoJHN0YXR1cyk7CiAgICB9CgogICAgLy8gfX19CgogICAgLy8ge3t7IGdldF9yZXF1ZXN0X2hlbHBlcgoKICAgIC8qKgogICAgICogR0VUIHJlcXVlc3QgaGVscGVyIC0gcHJlcGFyZXMgZGF0YS1zdHJ1Y3R1cmVzIGZyb20gR0VUIHJlcXVlc3RzCiAgICAgKgogICAgICogQHBhcmFtIG9wdGlvbnMKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBmdW5jdGlvbiBnZXRfcmVxdWVzdF9oZWxwZXIoJiRvcHRpb25zKQogICAgewogICAgICAgIC8vIFRPRE8gY2hlY2sgZm9yIGludmFsaWQgc3RyZWFtCgogICAgICAgICRvcHRpb25zID0gYXJyYXkoKTsKICAgICAgICAkb3B0aW9uc1sncGF0aCddID0gJHRoaXMtPnBhdGg7CgogICAgICAgICR0aGlzLT5fZ2V0X3Jhbmdlcygkb3B0aW9ucyk7CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogUGFyc2UgSFRUUCBSYW5nZTogaGVhZGVyCiAgICAgKgogICAgICogQHBhcmFtICBhcnJheSBvcHRpb25zIGFycmF5IHRvIHN0b3JlIHJlc3VsdCBpbgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9nZXRfcmFuZ2VzKCYkb3B0aW9ucykKICAgIHsKICAgICAgICAvLyBwcm9jZXNzIFJhbmdlOiBoZWFkZXIgaWYgcHJlc2VudAogICAgICAgIGlmICghZW1wdHkoJF9TRVJWRVJbJ0hUVFBfUkFOR0UnXSkpIHsKCiAgICAgICAgICAgIC8vIHdlIG9ubHkgc3VwcG9ydCBzdGFuZGFyZCAnYnl0ZXMnIHJhbmdlIHNwZWNpZmljYXRpb25zIGZvciBub3cKICAgICAgICAgICAgaWYgKGVyZWcoJ2J5dGVzW1s6c3BhY2U6XV0qPVtbOnNwYWNlOl1dKiguKyknLCAkX1NFUlZFUlsnSFRUUF9SQU5HRSddLCAkbWF0Y2hlcykpIHsKICAgICAgICAgICAgICAgICRvcHRpb25zWydyYW5nZXMnXSA9IGFycmF5KCk7CgogICAgICAgICAgICAgICAgLy8gcmFuZ2VzIGFyZSBjb21tYSBzZXBhcmF0ZWQKICAgICAgICAgICAgICAgIGZvcmVhY2ggKGV4cGxvZGUoJywnLCAkbWF0Y2hlc1sxXSkgYXMgJHJhbmdlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gcmFuZ2VzIGFyZSBlaXRoZXIgZnJvbS10byBwYWlycyBvciBqdXN0IGVuZCBwb3NpdGlvbnMKICAgICAgICAgICAgICAgICAgICBsaXN0KCRzdGFydCwgJGVuZCkgPSBleHBsb2RlKCctJywgJHJhbmdlKTsKICAgICAgICAgICAgICAgICAgICAkb3B0aW9uc1sncmFuZ2VzJ11bXSA9ICgkc3RhcnQgPT09ICcnKSA/IGFycmF5KCdsYXN0JyA9PiAkZW5kKSA6IGFycmF5KCdzdGFydCcgPT4gJHN0YXJ0LCAnZW5kJyA9PiAkZW5kKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvLyB9fX0KCiAgICAvLyB7e3sgZ2V0X3Jlc3BvbnNlX2hlbHBlcgoKICAgIC8qKgogICAgICogR0VUIHJlc3BvbnNlIGhlbHBlciAtIGZvcm1hdCBHRVQgcmVzcG9uc2UKICAgICAqCiAgICAgKiBAcGFyYW0gb3B0aW9ucwogICAgICogQHBhcmFtIHN0YXR1cwogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldF9yZXNwb25zZV9oZWxwZXIoJG9wdGlvbnMsICRzdGF0dXMpCiAgICB7CiAgICAgICAgaWYgKGVtcHR5KCRzdGF0dXMpKSB7CiAgICAgICAgICAgICRzdGF0dXMgPSAnNDA0IE5vdCBGb3VuZCc7CiAgICAgICAgfQoKICAgICAgICAvLyBzZXQgaGVhZGVycyBiZWZvcmUgd2Ugc3RhcnQgcHJpbnRpbmcKICAgICAgICAkdGhpcy0+c2V0UmVzcG9uc2VTdGF0dXMoJHN0YXR1cyk7CgogICAgICAgIGlmICgkc3RhdHVzICE9PSB0cnVlKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmIChlbXB0eSgkb3B0aW9uc1snbWltZXR5cGUnXSkpIHsKICAgICAgICAgICAgJG9wdGlvbnNbJ21pbWV0eXBlJ10gPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKICAgICAgICB9CiAgICAgICAgJHRoaXMtPnNldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGU6ICRvcHRpb25zW21pbWV0eXBlXSIpOwoKICAgICAgICBpZiAoIWVtcHR5KCRvcHRpb25zWydtdGltZSddKSkgewogICAgICAgICAgICAkdGhpcy0+c2V0UmVzcG9uc2VIZWFkZXIoJ0xhc3QtTW9kaWZpZWQ6JwogICAgICAgICAgICAgICAgLiBnbWRhdGUoJ0QsIGQgTSBZIEg6aTpzJywgJG9wdGlvbnNbJ210aW1lJ10pIC4gJ0dNVCcpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRvcHRpb25zWydzdHJlYW0nXSkgewogICAgICAgICAgICAvLyBHRVQgaGFuZGxlciByZXR1cm5lZCBhIHN0cmVhbQoKICAgICAgICAgICAgaWYgKCFlbXB0eSgkb3B0aW9uc1sncmFuZ2VzJ10pICYmCiAgICAgICAgICAgICAgICAgICAgKGZzZWVrKCRvcHRpb25zWydzdHJlYW0nXSwgMCwgU0VFS19TRVQpID09PSAwKSkgewogICAgICAgICAgICAgICAgLy8gcGFydGlhbCByZXF1ZXN0IGFuZCBzdHJlYW0gaXMgc2Vla2FibGUKCiAgICAgICAgICAgICAgICBpZiAoY291bnQoJG9wdGlvbnNbJ3JhbmdlcyddKSA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICRyYW5nZSA9ICRvcHRpb25zWydyYW5nZXMnXVswXTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkcmFuZ2VbJ3N0YXJ0J10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZzZWVrKCRvcHRpb25zWydzdHJlYW0nXSwgJHJhbmdlWydzdGFydCddLCBTRUVLX1NFVCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmZW9mKCRvcHRpb25zWydzdHJlYW0nXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZXRSZXNwb25zZVN0YXR1cygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNDE2IFJlcXVlc3RlZCBSYW5nZSBOb3QgU2F0aXNmaWFibGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkcmFuZ2VbJ2VuZCddKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNpemUgPSAkcmFuZ2VbJ2VuZCddIC0gJHJhbmdlWydzdGFydCddICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZXRSZXNwb25zZVN0YXR1cygnMjA2IFBhcnRpYWwnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1MZW5ndGg6ICRzaXplIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2V0UmVzcG9uc2VIZWFkZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbnRlbnQtUmFuZ2U6ICRyYW5nZVtzdGFydF0tJHJhbmdlW2VuZF0vIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gKCFlbXB0eSgkb3B0aW9uc1snc2l6ZSddKSA/ICRvcHRpb25zWydzaXplJ10gOiAnKicpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgkc2l6ZSAmJiAhZmVvZigkb3B0aW9uc1snc3RyZWFtJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlciA9IGZyZWFkKCRvcHRpb25zWydzdHJlYW0nXSwgNDA5Nik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNpemUgLT0gc3RybGVuKCRidWZmZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJGJ1ZmZlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZXRSZXNwb25zZVN0YXR1cygnMjA2IFBhcnRpYWwnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJG9wdGlvbnNbJ3NpemUnXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtTGVuZ3RoOiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gKCRvcHRpb25zWydzaXplJ10gLSAkcmFuZ2VbJ3N0YXJ0J10pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2V0UmVzcG9uc2VIZWFkZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb250ZW50LVJhbmdlOiAkcmFuZ2Vbc3RhcnRdLSRyYW5nZVtlbmRdLyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAoIWVtcHR5KCRvcHRpb25zWydzaXplJ10pID8gJG9wdGlvbnNbJ3NpemUnXSA6ICcqJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnBhc3N0aHJ1KCRvcHRpb25zWydzdHJlYW0nXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtTGVuZ3RoOiAkcmFuZ2VbbGFzdF0iKTsKICAgICAgICAgICAgICAgICAgICAgICAgZnNlZWsoJG9wdGlvbnNbJ3N0cmVhbSddLCAtJHJhbmdlWydsYXN0J10sIFNFRUtfRU5EKTsKICAgICAgICAgICAgICAgICAgICAgICAgZnBhc3N0aHJ1KCRvcHRpb25zWydzdHJlYW0nXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+X211bHRpcGFydF9ieXRlcmFuZ2VfaGVhZGVyKCk7IC8vIGluaXQgbXVsdGlwYXJ0CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJG9wdGlvbnNbJ3JhbmdlcyddIGFzICRyYW5nZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyB3aGF0IGlmIHNpemUgdW5rbm93bj8gNTAwPwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRyYW5nZVsnc3RhcnQnXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmcm9tID0gJHJhbmdlWydzdGFydCddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRvID0gIWVtcHR5KCRyYW5nZVsnZW5kJ10pID8gJHJhbmdlWydlbmQnXSA6ICRvcHRpb25zWydzaXplJ10gLSAxOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZyb20gPSAkb3B0aW9uc1snc2l6ZSddIC0gJHJhbmdlWydsYXN0J10gLSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRvID0gJG9wdGlvbnNbJ3NpemUnXSAtIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJHRvdGFsID0gIWVtcHR5KCRvcHRpb25zWydzaXplJ10pID8gJG9wdGlvbnNbJ3NpemUnXSA6ICcqJzsKICAgICAgICAgICAgICAgICAgICAgICAgJHNpemUgPSAkdG8gLSAkZnJvbSArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5fbXVsdGlwYXJ0X2J5dGVyYW5nZV9oZWFkZXIoJG9wdGlvbnNbJ21pbWV0eXBlJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZnJvbSwgJHRvLCAkdG90YWwpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZnNlZWsoJG9wdGlvbnNbJ3N0cmVhbSddLCAkc3RhcnQsIFNFRUtfU0VUKTsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCRzaXplICYmICFmZW9mKCRvcHRpb25zWydzdHJlYW0nXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRidWZmZXIgPSBmcmVhZCgkb3B0aW9uc1snc3RyZWFtJ10sIDQwOTYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNpemUgLT0gc3RybGVuKCRidWZmZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAkYnVmZmVyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBlbmQgbXVsdGlwYXJ0CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPl9tdWx0aXBhcnRfYnl0ZXJhbmdlX2hlYWRlcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gbm9ybWFsIHJlcXVlc3Qgb3Igc3RyZWFtIGlzbid0IHNlZWthYmxlLCByZXR1cm4gZnVsbCBjb250ZW50CiAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRvcHRpb25zWydzaXplJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LUxlbmd0aDogJG9wdGlvbnNbc2l6ZV0iKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBmcGFzc3RocnUoJG9wdGlvbnNbJ3N0cmVhbSddKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoIWVtcHR5KCRvcHRpb25zWydkYXRhJ10pKSAgewogICAgICAgICAgICBpZiAoaXNfYXJyYXkoJG9wdGlvbnNbJ2RhdGEnXSkpIHsKICAgICAgICAgICAgICAgIC8vIHJlcGx5IHRvIHBhcnRpYWwgcmVxdWVzdAogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHRoaXMtPnNldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LUxlbmd0aDogIgogICAgICAgICAgICAgICAgICAgIC4gc3RybGVuKCRvcHRpb25zWydkYXRhJ10pKTsKICAgICAgICAgICAgICAgIGVjaG8gJG9wdGlvbnNbJ2RhdGEnXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEdlbmVyYXRlIHNlcGFyYXRvciBoZWFkZXJzIGZvciBtdWx0aXBhcnQgcmVzcG9uc2UKICAgICAqCiAgICAgKiBGaXJzdCBhbmQgbGFzdCBjYWxsIGhhcHBlbiB3aXRob3V0IHBhcmFtZXRlcnMgdG8gZ2VuZXJhdGUgdGhlIGluaXRpYWwKICAgICAqIGhlYWRlciBhbmQgY2xvc2luZyBzZXF1ZW5jZSwgYWxsIGNhbGxzIGluYmV0d2VlbiByZXF1aXJlIGNvbnRlbnQKICAgICAqIG1pbWV0eXBlLCBzdGFydCBhbmQgZW5kIGJ5dGUgcG9zaXRpb24gYW5kIG9wdGlvbmFseSB0aGUgdG90YWwgYnl0ZQogICAgICogbGVuZ3RoIG9mIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nIG1pbWV0eXBlCiAgICAgKiBAcGFyYW0gaW50IHN0YXJ0IGJ5dGUgcG9zaXRpb24KICAgICAqIEBwYXJhbSBpbnQgZW5kIGJ5dGUgcG9zaXRpb24KICAgICAqIEBwYXJhbSBpbnQgdG90YWwgcmVzb3VyY2UgYnl0ZSBzaXplCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9tdWx0aXBhcnRfYnl0ZXJhbmdlX2hlYWRlcigkbWltZXR5cGUgPSBmYWxzZSwgJGZyb20gPSBmYWxzZSwKICAgICAgICAkdG8gPSBmYWxzZSwgJHRvdGFsID0gZmFsc2UpCiAgICB7CiAgICAgICAgaWYgKCRtaW1ldHlwZSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgaWYgKGVtcHR5KCR0aGlzLT5tdWx0aXBhcnRfc2VwYXJhdG9yKSkgewogICAgICAgICAgICAgICAgLy8gaW5pdAogICAgICAgICAgICAgICAgLy8gYSBsaXR0bGUgbmFpdmUsIHRoaXMgc2VxdWVuY2UgKm1pZ2h0KiBiZSBwYXJ0IG9mIHRoZSBjb250ZW50CiAgICAgICAgICAgICAgICAvLyBidXQgaXQncyByZWFsbHkgbm90IGxpa2VseSBhbmQgcmF0aGVyIGV4cGVuc2l2ZSB0byBjaGVjawogICAgICAgICAgICAgICAgJHRoaXMtPm11bHRpcGFydF9zZXBhcmF0b3IgPSAnU0VQQVJBVE9SXycgLiBtZDUobWljcm90aW1lKCkpOwoKICAgICAgICAgICAgICAgIC8vIGdlbmVyYXRlIEhUVFAgaGVhZGVyCiAgICAgICAgICAgICAgICAkdGhpcy0+c2V0UmVzcG9uc2VIZWFkZXIoCiAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2J5dGVyYW5nZXM7IGJvdW5kYXJ5PScKICAgICAgICAgICAgICAgICAgICAuICR0aGlzLT5tdWx0aXBhcnRfc2VwYXJhdG9yKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZW5kCiAgICAgICAgICAgIC8vIGdlbmVyYXRlIGNsb3NpbmcgbXVsdGlwYXJ0IHNlcXVlbmNlCiAgICAgICAgICAgIGVjaG8gIlxuLS17JHRoaXMtPm11bHRpcGFydF9zZXBhcmF0b3J9LS0iOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBnZW5lcmF0ZSBzZXBhcmF0b3IgYW5kIGhlYWRlciBmb3IgbmV4dCBwYXJ0CiAgICAgICAgZWNobyAiXG4tLXskdGhpcy0+bXVsdGlwYXJ0X3NlcGFyYXRvcn1cbiI7CiAgICAgICAgZWNobyAiQ29udGVudC1UeXBlOiAkbWltZXR5cGVcbiI7CiAgICAgICAgZWNobyAiQ29udGVudC1SYW5nZTogJGZyb20tJHRvLyIKICAgICAgICAgICAgLiAoJHRvdGFsID09PSBmYWxzZSA/ICIqIiA6ICR0b3RhbCkgLiAiXG5cbiI7CiAgICB9CgogICAgLy8gfX19CgogICAgLy8ge3t7IGdldF93cmFwcGVyCgogICAgLyoqCiAgICAgKiBHRVQgbWV0aG9kIHdyYXBwZXIKICAgICAqCiAgICAgKiBAcGFyYW0gdm9pZAogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldF93cmFwcGVyKCkKICAgIHsKICAgICAgICAvLyBwZXJwYXJlIGRhdGEtc3RydWN0dXJlIGZyb20gR0VUIHJlcXVlc3QKICAgICAgICBpZiAoISR0aGlzLT5nZXRfcmVxdWVzdF9oZWxwZXIoJG9wdGlvbnMpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIGNhbGwgdXNlciBoYW5kbGVyCiAgICAgICAgJHN0YXR1cyA9ICR0aGlzLT5nZXQoJG9wdGlvbnMpOwoKICAgICAgICAvLyBmb3JtYXQgR0VUIHJlc3BvbnNlCiAgICAgICAgJHRoaXMtPmdldF9yZXNwb25zZV9oZWxwZXIoJG9wdGlvbnMsICRzdGF0dXMpOwogICAgfQoKICAgIC8vIH19fQoKICAgIC8vIHt7eyBoZWFkX3Jlc3BvbnNlX2hlbHBlcgoKICAgIC8qKgogICAgICogSEVBRCByZXNwb25zZSBoZWxwZXIgLSBmb3JtYXQgSEVBRCByZXNwb25zZQogICAgICoKICAgICAqIEBwYXJhbSBvcHRpb25zCiAgICAgKiBAcGFyYW0gc3RhdHVzCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgZnVuY3Rpb24gaGVhZF9yZXNwb25zZV9oZWxwZXIoJG9wdGlvbnMsICRzdGF0dXMpCiAgICB7CiAgICAgICAgaWYgKGVtcHR5KCRzdGF0dXMpKSB7CiAgICAgICAgICAgICRzdGF0dXMgPSAnNDA0IE5vdCBGb3VuZCc7CiAgICAgICAgfQoKICAgICAgICAvLyBzZXQgaGVhZGVycyBiZWZvcmUgd2Ugc3RhcnQgcHJpbnRpbmcKICAgICAgICAkdGhpcy0+c2V0UmVzcG9uc2VTdGF0dXMoJHN0YXR1cyk7CgogICAgICAgIGlmICgkc3RhdHVzICE9PSB0cnVlKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmIChlbXB0eSgkb3B0aW9uc1snbWltZXR5cGUnXSkpIHsKICAgICAgICAgICAgJG9wdGlvbnNbJ21pbWV0eXBlJ10gPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKICAgICAgICB9CiAgICAgICAgJHRoaXMtPnNldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGU6ICRvcHRpb25zW21pbWV0eXBlXSIpOwoKICAgICAgICBpZiAoIWVtcHR5KCRvcHRpb25zWydtdGltZSddKSkgewogICAgICAgICAgICAkdGhpcy0+c2V0UmVzcG9uc2VIZWFkZXIoJ0xhc3QtTW9kaWZpZWQ6JwogICAgICAgICAgICAgICAgLiBnbWRhdGUoJ0QsIGQgTSBZIEg6aTpzJywgJG9wdGlvbnNbJ210aW1lJ10pIC4gJ0dNVCcpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFlbXB0eSgkb3B0aW9uc1snc3RyZWFtJ10pKSB7CiAgICAgICAgICAgIC8vIEdFVCBoYW5kbGVyIHJldHVybmVkIGEgc3RyZWFtCgogICAgICAgICAgICBpZiAoIWVtcHR5KCRvcHRpb25zWydyYW5nZXMnXSkKICAgICAgICAgICAgICAgICAgICAmJiAoZnNlZWsoJG9wdGlvbnNbJ3N0cmVhbSddLCAwLCBTRUVLX1NFVCkgPT09IDApKSB7CiAgICAgICAgICAgICAgICAvLyBwYXJ0aWFsIHJlcXVlc3QgYW5kIHN0cmVhbSBpcyBzZWVrYWJsZQoKICAgICAgICAgICAgICAgIGlmIChjb3VudCgkb3B0aW9uc1sncmFuZ2VzJ10pID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgJHJhbmdlID0gJG9wdGlvbnNbJ3JhbmdlcyddWzBdOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRyYW5nZVsnc3RhcnQnXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnNlZWsoJG9wdGlvbnNbJ3N0cmVhbSddLCAkcmFuZ2VbJ3N0YXJ0J10sIFNFRUtfU0VUKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZlb2YoJG9wdGlvbnNbJ3N0cmVhbSddKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNldFJlc3BvbnNlU3RhdHVzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc0MTYgUmVxdWVzdGVkIFJhbmdlIE5vdCBTYXRpc2ZpYWJsZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRyYW5nZVsnZW5kJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2l6ZSA9ICRyYW5nZVsnZW5kJ10gLSAkcmFuZ2VbJ3N0YXJ0J10gKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNldFJlc3BvbnNlU3RhdHVzKCcyMDYgUGFydGlhbCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LUxlbmd0aDogJHNpemUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZXRSZXNwb25zZUhlYWRlcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29udGVudC1SYW5nZTogJHJhbmdlW3N0YXJ0XS0kcmFuZ2VbZW5kXS8iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAoIWVtcHR5KCRvcHRpb25zWydzaXplJ10pID8gJG9wdGlvbnNbJ3NpemUnXSA6ICcqJykpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNldFJlc3BvbnNlU3RhdHVzKCcyMDYgUGFydGlhbCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkb3B0aW9uc1snc2l6ZSddKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1MZW5ndGg6ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAoJG9wdGlvbnNbJ3NpemUnXSAtICRyYW5nZVsnc3RhcnQnXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZXRSZXNwb25zZUhlYWRlcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbnRlbnQtUmFuZ2U6ICRzdGFydC0kZW5kLyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAoIWVtcHR5KCRvcHRpb25zWydzaXplJ10pID8gJG9wdGlvbnNbJ3NpemUnXSA6ICcqJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNldFJlc3BvbnNlSGVhZGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbnRlbnQtTGVuZ3RoOiAkcmFuZ2VbbGFzdF0iKTsKICAgICAgICAgICAgICAgICAgICAgICAgZnNlZWsoJG9wdGlvbnNbJ3N0cmVhbSddLCAtJHJhbmdlWydsYXN0J10sIFNFRUtfRU5EKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5fbXVsdGlwYXJ0X2J5dGVyYW5nZV9oZWFkZXIoKTsgLy8gaW5pdCBtdWx0aXBhcnQKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkb3B0aW9uc1sncmFuZ2VzJ10gYXMgJHJhbmdlKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIHdoYXQgaWYgc2l6ZSB1bmtub3duPyA1MDA/CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJHJhbmdlWydzdGFydCddKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZyb20gPSAkcmFuZ2VbJ3N0YXJ0J107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdG8gPSAhZW1wdHkoJHJhbmdlWydlbmQnXSkgPyAkcmFuZ2VbJ2VuZCddIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkb3B0aW9uc1snc2l6ZSddIC0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmcm9tID0gJG9wdGlvbnNbJ3NpemUnXSAtICRyYW5nZVsnbGFzdCddIC0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0byA9ICRvcHRpb25zWydzaXplJ10gLSAxOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICR0b3RhbCA9ICFlbXB0eSgkb3B0aW9uc1snc2l6ZSddKSA/ICRvcHRpb25zWydzaXplJ10gOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyonOwogICAgICAgICAgICAgICAgICAgICAgICAkc2l6ZSA9ICR0byAtICRmcm9tICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPl9tdWx0aXBhcnRfYnl0ZXJhbmdlX2hlYWRlcigkb3B0aW9uc1snbWltZXR5cGUnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmcm9tLCAkdG8sICR0b3RhbCk7CgogICAgICAgICAgICAgICAgICAgICAgICBmc2Vlaygkb3B0aW9uc1snc3RyZWFtJ10sICRzdGFydCwgU0VFS19TRVQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+X211bHRpcGFydF9ieXRlcmFuZ2VfaGVhZGVyKCk7IC8vIGVuZCBtdWx0aXBhcnQKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIG5vcm1hbCByZXF1ZXN0IG9yIHN0cmVhbSBpc24ndCBzZWVrYWJsZSwgcmV0dXJuIGZ1bGwgY29udGVudAogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkb3B0aW9uc1snc2l6ZSddKSkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1MZW5ndGg6ICRvcHRpb25zW3NpemVdIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKCFlbXB0eSgkb3B0aW9uc1snZGF0YSddKSkgIHsKICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRvcHRpb25zWydkYXRhJ10pKSB7CiAgICAgICAgICAgICAgICAvLyByZXBseSB0byBwYXJ0aWFsIHJlcXVlc3QKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICR0aGlzLT5zZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1MZW5ndGg6ICIKICAgICAgICAgICAgICAgICAgICAuIHN0cmxlbigkb3B0aW9uc1snZGF0YSddKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLy8gfX19CgogICAgLy8ge3t7IGhlYWRfd3JhcHBlcgoKICAgIC8qKgogICAgICogSEVBRCBtZXRob2Qgd3JhcHBlcgogICAgICoKICAgICAqIEBwYXJhbSB2b2lkCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgZnVuY3Rpb24gaGVhZF93cmFwcGVyKCkKICAgIHsKICAgICAgICAkb3B0aW9ucyA9IGFycmF5KCk7CiAgICAgICAgJG9wdGlvbnNbJ3BhdGgnXSA9ICR0aGlzLT5wYXRoOwoKICAgICAgICAvLyBjYWxsIHVzZXIgaGFuZGxlcgogICAgICAgIGlmIChtZXRob2RfZXhpc3RzKCR0aGlzLCAnaGVhZCcpKSB7CiAgICAgICAgICAgICRzdGF0dXMgPSAkdGhpcy0+aGVhZCgkb3B0aW9ucyk7CiAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgIC8vIGNhbiBlbXVsYXRlIEhFQUQgdXNpbmcgR0VUCiAgICAgICAgICAgIG9iX3N0YXJ0KCk7CiAgICAgICAgICAgICRzdGF0dXMgPSAkdGhpcy0+Z2V0KCRvcHRpb25zKTsKICAgICAgICAgICAgb2JfZW5kX2NsZWFuKCk7CiAgICAgICAgfQoKICAgICAgICAvLyBmb3JtYXQgSEVBRCByZXNwb25zZQogICAgICAgICR0aGlzLT5oZWFkX3Jlc3BvbnNlX2hlbHBlcigkb3B0aW9ucywgJHN0YXR1cyk7CiAgICB9CgogICAgLy8gfX19CgogICAgLy8ge3t7IHB1dF9yZXF1ZXN0X2hlbHBlcgoKICAgIC8qKgogICAgICogUFVUIHJlcXVlc3QgaGVscGVyIC0gcHJlcGFyZXMgZGF0YS1zdHJ1Y3R1cmVzIGZyb20gUFVUIHJlcXVlc3RzCiAgICAgKgogICAgICogQHBhcmFtIG9wdGlvbnMKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBmdW5jdGlvbiBwdXRfcmVxdWVzdF9oZWxwZXIoJiRvcHRpb25zKQogICAgewogICAgICAgICRvcHRpb25zID0gYXJyYXkoKTsKICAgICAgICAkb3B0aW9uc1sncGF0aCddID0gJHRoaXMtPnBhdGg7CgogICAgICAgIC8qIENvbnRlbnQtTGVuZ3RoIG1heSBiZSB6ZXJvICovCiAgICAgICAgaWYgKCFpc3NldCgkX1NFUlZFUlsnQ09OVEVOVF9MRU5HVEgnXSkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkb3B0aW9uc1snY29udGVudF9sZW5ndGgnXSA9ICRfU0VSVkVSWydDT05URU5UX0xFTkdUSCddOwoKICAgICAgICAvLyBkZWZhdWx0IGNvbnRlbnQgdHlwZSBpZiBub25lIGdpdmVuCiAgICAgICAgJG9wdGlvbnNbJ2NvbnRlbnRfdHlwZSddID0gJ2FwcGxpY2F0aW9uL3Vua25vd24nOwoKICAgICAgICAvLyBnZXQgdGhlIGNvbnRlbnQtdHlwZQogICAgICAgIGlmICghZW1wdHkoJF9TRVJWRVJbJ0NPTlRFTlRfVFlQRSddKSkgewoKICAgICAgICAgICAgLy8gZm9yIG5vdyB3ZSBkbyBub3Qgc3VwcG9ydCBhbnkgc29ydCBvZiBtdWx0aXBhcnQgcmVxdWVzdHMKICAgICAgICAgICAgaWYgKCFzdHJuY21wKCRfU0VSVkVSWydDT05URU5UX1RZUEUnXSwgJ211bHRpcGFydC8nLCAxMCkpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5zZXRSZXNwb25zZVN0YXR1cygnNTAxIE5vdCBJbXBsZW1lbnRlZCcpOwogICAgICAgICAgICAgICAgZWNobyAnVGhlIHNlcnZpY2UgZG9lcyBub3Qgc3VwcG9ydCBtdWxpcGFydCBQVVQgcmVxdWVzdHMnOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkb3B0aW9uc1snY29udGVudF90eXBlJ10gPSAkX1NFUlZFUlsnQ09OVEVOVF9UWVBFJ107CiAgICAgICAgfQoKICAgICAgICAvLyBSRkMyNjE2IDIuNjogVGhlIHJlY2lwaWVudCBvZiB0aGUgZW50aXR5IE1VU1QgTk9UIGlnbm9yZSBhbnkKICAgICAgICAvLyBDb250ZW50LSogKGUuZy4gQ29udGVudC1SYW5nZSkgaGVhZGVycyB0aGF0IGl0IGRvZXMgbm90IHVuZGVyc3RhbmQKICAgICAgICAvLyBvciBpbXBsZW1lbnQgYW5kIE1VU1QgcmV0dXJuIGEgNTAxIChOb3QgSW1wbGVtZW50ZWQpIHJlc3BvbnNlIGluCiAgICAgICAgLy8gc3VjaCBjYXNlcy4KICAgICAgICBmb3JlYWNoICgkX1NFUlZFUiBhcyAka2V5ID0+ICR2YWx1ZSkgewogICAgICAgICAgICBpZiAoc3RybmNtcCgka2V5LCAnSFRUUF9DT05URU5UJywgMTEpKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3dpdGNoICgka2V5KSB7CiAgICAgICAgICAgIGNhc2UgJ0hUVFBfQ09OVEVOVF9FTkNPRElORyc6IC8vIFJGQzI2MTYgMTQuMTEKCiAgICAgICAgICAgICAgICAvLyBUT0RPIHN1cHBvcnQgdGhpcyBpZiBleHQvemxpYiBmaWx0ZXJzIGFyZSBhdmFpbGFibGUKICAgICAgICAgICAgICAgICR0aGlzLT5zZXRSZXNwb25zZVN0YXR1cygnNTAxIE5vdCBJbXBsZW1lbnRlZCcpOwogICAgICAgICAgICAgICAgZWNobyAiVGhlIHNlcnZpY2UgZG9lcyBub3Qgc3VwcG9ydCAnJHZhbHVlJyBjb250ZW50IGVuY29kaW5nIjsKICAgICAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgICAgIGNhc2UgJ0hUVFBfQ09OVEVOVF9MQU5HVUFHRSc6IC8vIFJGQzI2MTYgMTQuMTIKCiAgICAgICAgICAgICAgICAvLyB3ZSBhc3N1bWUgaXQgaXMgbm90IGNyaXRpY2FsIGlmIHRoaXMgb25lIGlzIGlnbm9yZWQgaW4gdGhlCiAgICAgICAgICAgICAgICAvLyBhY3R1YWwgUFVUIGltcGxlbWVudGF0aW9uCiAgICAgICAgICAgICAgICAkb3B0aW9uc1snY29udGVudF9sYW5ndWFnZSddID0gJHZhbHVlOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICdIVFRQX0NPTlRFTlRfTEVOR1RIJzoKCiAgICAgICAgICAgICAgICAvLyBkZWZpbmVkIG9uIElJUyBhbmQgaGFzIHRoZSBzYW1lIHZhbHVlIGFzIENPTlRFTlRfTEVOR1RICiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgJ0hUVFBfQ09OVEVOVF9MT0NBVElPTic6IC8vIFJGQzI2MTYgMTQuMTQKCiAgICAgICAgICAgICAgICAvLyBtZWFuaW5nIG9mIHRoZSBDb250ZW50LUxvY2F0aW9uIGhlYWRlciBpbiBQVVQgb3IgUE9TVAogICAgICAgICAgICAgICAgLy8gcmVxdWVzdHMgaXMgdW5kZWZpbmVkOyBzZXJ2ZXJzIGFyZSBmcmVlIHRvIGlnbm9yZSBpdCBpbgogICAgICAgICAgICAgICAgLy8gdGhvc2UgY2FzZXMKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAnSFRUUF9DT05URU5UX1JBTkdFJzogLy8gUkZDMjYxNiAxNC4xNgoKICAgICAgICAgICAgICAgIC8vIHNpbmdsZSBieXRlIHJhbmdlIHJlcXVlc3RzIGFyZSBzdXBwb3J0ZWQKICAgICAgICAgICAgICAgIC8vIHRoZSBoZWFkZXIgZm9ybWF0IGlzIGFsc28gc3BlY2lmaWVkIGluIFJGQzI2MTYgMTQuMTYKICAgICAgICAgICAgICAgIC8vIFRPRE8gd2UgaGF2ZSB0byBlbnN1cmUgdGhhdCBpbXBsZW1lbnRhdGlvbnMgc3VwcG9ydCB0aGlzIG9yIHNlbmQgNTAxIGluc3RlYWQKICAgICAgICAgICAgICAgIGlmICghcHJlZ19tYXRjaCgnQGJ5dGVzXHMrKFxkKyktKFxkKykvKChcZCspfFwqKUAnLCAkdmFsdWUsICRtYXRjaGVzKSkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZXRSZXNwb25zZVN0YXR1cygnNDAwIEJhZCBSZXF1ZXN0Jyk7CiAgICAgICAgICAgICAgICAgICAgZWNobyAnVGhlIHNlcnZpY2UgZG9lcyBvbmx5IHN1cHBvcnQgc2luZ2xlIGJ5dGUgcmFuZ2VzJzsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJHJhbmdlID0gYXJyYXkoJ3N0YXJ0JyA9PiAkbWF0Y2hlc1sxXSwgJ2VuZCcgPT4gJG1hdGNoZXNbMl0pOwogICAgICAgICAgICAgICAgaWYgKGlzX251bWVyaWMoJG1hdGNoZXNbM10pKSB7CiAgICAgICAgICAgICAgICAgICAgJHJhbmdlWyd0b3RhbF9sZW5ndGgnXSA9ICRtYXRjaGVzWzNdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJG9wdGlvblsncmFuZ2VzJ11bXSA9ICRyYW5nZTsKCiAgICAgICAgICAgICAgICAvLyBUT0RPIG1ha2Ugc3VyZSB0aGUgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgcGFydGlhbCBQVVQKICAgICAgICAgICAgICAgIC8vIHRoaXMgaGFzIHRvIGJlIGRvbmUgaW4gYWR2YW5jZSB0byBhdm9pZCBkYXRhIGJlaW5nIG92ZXJ3cml0dGVuCiAgICAgICAgICAgICAgICAvLyBvbiBpbXBsZW1lbnRhdGlvbnMgdGhhdCBkbyBub3Qgc3VwcG9ydCB0aGlzLi4uCiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgJ0hUVFBfQ09OVEVOVF9NRDUnOiAvLyBSRkMyNjE2IDE0LjE1CgogICAgICAgICAgICAgICAgLy8gVE9ETyBtYXliZSB3ZSBjYW4ganVzdCBwcmV0ZW5kIGhlcmU/CiAgICAgICAgICAgICAgICAkdGhpcy0+c2V0UmVzcG9uc2VTdGF0dXMoJzUwMSBOb3QgSW1wbGVtZW50ZWQnKTsKICAgICAgICAgICAgICAgIGVjaG8gJ1RoZSBzZXJ2aWNlIGRvZXMgbm90IHN1cHBvcnQgY29udGVudCBNRDUgY2hlY2tzdW0gdmVyaWZpY2F0aW9uJzsKICAgICAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgICAgIGNhc2UgJ0hUVFBfQ09OVEVOVF9UWVBFJzoKCiAgICAgICAgICAgICAgICAvLyBkZWZpbmVkIG9uIElJUyBhbmQgaGFzIHRoZSBzYW1lIHZhbHVlIGFzIENPTlRFTlRfVFlQRQogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBkZWZhdWx0OgoKICAgICAgICAgICAgICAgIC8vIGFueSBvdGhlciB1bmtub3duIENvbnRlbnQtKiBoZWFkZXJzCiAgICAgICAgICAgICAgICAkdGhpcy0+c2V0UmVzcG9uc2VTdGF0dXMoJzUwMSBOb3QgSW1wbGVtZW50ZWQnKTsKICAgICAgICAgICAgICAgIGVjaG8gIlRoZSBzZXJ2aWNlIGRvZXMgbm90IHN1cHBvcnQgJyRrZXknIjsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJG9wdGlvbnNbJ3N0cmVhbSddID0gJHRoaXMtPm9wZW5SZXF1ZXN0Qm9keSgpOwoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvLyB9fX0KCiAgICAvLyB7e3sgcHV0X3Jlc3BvbnNlX2hlbHBlcgoKICAgIC8qKgogICAgICogUFVUIHJlc3BvbnNlIGhlbHBlciAtIGZvcm1hdCBQVVQgcmVzcG9uc2UKICAgICAqCiAgICAgKiBAcGFyYW0gb3B0aW9ucwogICAgICogQHBhcmFtIHN0YXR1cwogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIGZ1bmN0aW9uIHB1dF9yZXNwb25zZV9oZWxwZXIoJG9wdGlvbnMsICRzdGF0dXMpCiAgICB7CiAgICAgICAgaWYgKGVtcHR5KCRzdGF0dXMpKSB7CiAgICAgICAgICAgICRzdGF0dXMgPSAnNDAzIEZvcmJpZGRlbic7CiAgICAgICAgfSBlbHNlIGlmIChpc19yZXNvdXJjZSgkc3RhdHVzKQogICAgICAgICAgICAgICAgJiYgZ2V0X3Jlc291cmNlX3R5cGUoJHN0YXR1cykgPT0gJ3N0cmVhbScpIHsKICAgICAgICAgICAgJHN0cmVhbSA9ICRzdGF0dXM7CiAgICAgICAgICAgICRzdGF0dXMgPSBpc3NldCgkb3B0aW9uc1snbmV3J10pICYmICRvcHRpb25zWyduZXcnXSA9PT0gZmFsc2UgPyAnMjA0IE5vIENvbnRlbnQnIDogJzIwMSBDcmVhdGVkJzsKCiAgICAgICAgICAgIGlmICghZW1wdHkoJG9wdGlvbnNbJ3JhbmdlcyddKSkgewoKICAgICAgICAgICAgICAgIC8vIFRPRE8gbXVsdGlwYXJ0IHN1cHBvcnQgaXMgbWlzc2luZyAoc2VlIGFsc28gYWJvdmUpCiAgICAgICAgICAgICAgICBpZiAoMCA9PSBmc2Vlaygkc3RyZWFtLCAkcmFuZ2VbMF1bJ3N0YXJ0J10sIFNFRUtfU0VUKSkgewogICAgICAgICAgICAgICAgICAgICRsZW5ndGggPSAkcmFuZ2VbMF1bJ2VuZCddIC0gJHJhbmdlWzBdWydzdGFydCddICsgMTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWZ3cml0ZSgkc3RyZWFtLCBmcmVhZCgkb3B0aW9uc1snc3RyZWFtJ10sICRsZW5ndGgpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkc3RhdHVzID0gJzQwMyBGb3JiaWRkZW4nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHN0YXR1cyA9ICc0MDMgRm9yYmlkZGVuJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHdoaWxlICghZmVvZigkb3B0aW9uc1snc3RyZWFtJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgJGJ1ZiA9IGZyZWFkKCRvcHRpb25zWydzdHJlYW0nXSwgNDA5Nik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZ3cml0ZSgkc3RyZWFtLCAkYnVmKSAhPSA0MDk2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZmNsb3NlKCRzdHJlYW0pOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNldFJlc3BvbnNlU3RhdHVzKCRzdGF0dXMpOwogICAgfQoKICAgIC8vIH19fQoKICAgIC8vIHt7eyBwdXRfd3JhcHBlcgoKICAgIC8qKgogICAgICogUFVUIG1ldGhvZCB3cmFwcGVyCiAgICAgKgogICAgICogQHBhcmFtIHZvaWQKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBmdW5jdGlvbiBwdXRfd3JhcHBlcigpCiAgICB7CiAgICAgICAgLy8gY2hlY2sgcmVzb3VyY2UgaXMgbm90IGxvY2tlZAogICAgICAgIGlmICghJHRoaXMtPmNoZWNrX2xvY2tzX3dyYXBwZXIoJHRoaXMtPnBhdGgpKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRSZXNwb25zZVN0YXR1cygnNDIzIExvY2tlZCcpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBwZXJwYXJlIGRhdGEtc3RydWN0dXJlIGZyb20gUFVUIHJlcXVlc3QKICAgICAgICBpZiAoISR0aGlzLT5wdXRfcmVxdWVzdF9oZWxwZXIoJG9wdGlvbnMpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIGNhbGwgdXNlciBoYW5kbGVyCiAgICAgICAgJHN0YXR1cyA9ICR0aGlzLT5wdXQoJG9wdGlvbnMpOwoKICAgICAgICAvLyBmb3JtYXQgUFVUIHJlc3BvbnNlCiAgICAgICAgJHRoaXMtPnB1dF9yZXNwb25zZV9oZWxwZXIoJG9wdGlvbnMsICRzdGF0dXMpOwogICAgfQoKICAgIC8vIH19fQoKICAgIC8vIHt7eyBkZWxldGVfd3JhcHBlcgoKICAgIC8qKgogICAgICogREVMRVRFIG1ldGhvZCB3cmFwcGVyCiAgICAgKgogICAgICogQHBhcmFtIHZvaWQKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBmdW5jdGlvbiBkZWxldGVfd3JhcHBlcigpCiAgICB7CiAgICAgICAgLy8gUkZDMjUxOCA5LjIgbGFzdCBwYXJhZ3JhcGgKICAgICAgICBpZiAoIWVtcHR5KCRfU0VSVkVSWydIVFRQX0RFUFRIJ10pCiAgICAgICAgICAgICAgICAmJiAkX1NFUlZFUlsnSFRUUF9ERVBUSCddICE9ICdpbmZpbml0eScpIHsKICAgICAgICAgICAgJHRoaXMtPnNldFJlc3BvbnNlU3RhdHVzKCc0MDAgQmFkIFJlcXVlc3QnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gY2hlY2sgcmVzb3VyY2UgaXMgbm90IGxvY2tlZAogICAgICAgIGlmICghJHRoaXMtPmNoZWNrX2xvY2tzX3dyYXBwZXIoJHRoaXMtPnBhdGgpKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRSZXNwb25zZVN0YXR1cygnNDIzIExvY2tlZCcpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAkb3B0aW9ucyA9IGFycmF5KCk7CiAgICAgICAgJG9wdGlvbnNbJ3BhdGgnXSA9ICR0aGlzLT5wYXRoOwoKICAgICAgICAvLyBjYWxsIHVzZXIgaGFuZGxlcgogICAgICAgICRzdGF0dXMgPSAkdGhpcy0+ZGVsZXRlKCRvcHRpb25zKTsKICAgICAgICBpZiAoJHN0YXR1cyA9PT0gdHJ1ZSkgewogICAgICAgICAgICAkc3RhdHVzID0gJzIwNCBObyBDb250ZW50JzsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5zZXRSZXNwb25zZVN0YXR1cygkc3RhdHVzKTsKICAgIH0KCiAgICAvLyB9fX0KCiAgICAvLyB7e3sgY29weW1vdmVfcmVxdWVzdF9oZWxwZXIKCiAgICAvKioKICAgICAqIENPUFkvTU9WRSByZXF1ZXN0IGhlbHBlciAtIHByZXBhcmVzIGRhdGEtc3RydWN0dXJlcyBmcm9tIENPUFkvTU9WRQogICAgICogcmVxdWVzdHMKICAgICAqCiAgICAgKiBAcGFyYW0gb3B0aW9ucwogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvcHltb3ZlX3JlcXVlc3RfaGVscGVyKCYkb3B0aW9ucykKICAgIHsKICAgICAgICAkb3B0aW9ucyA9IGFycmF5KCk7CiAgICAgICAgJG9wdGlvbnNbJ3BhdGgnXSA9ICR0aGlzLT5wYXRoOwoKICAgICAgICAkb3B0aW9uc1snZGVwdGgnXSA9ICdpbmZpbml0eSc7CiAgICAgICAgaWYgKCFlbXB0eSgkX1NFUlZFUlsnSFRUUF9ERVBUSCddKSkgewogICAgICAgICAgICAkb3B0aW9uc1snZGVwdGgnXSA9ICRfU0VSVkVSWydIVFRQX0RFUFRIJ107CiAgICAgICAgfQoKICAgICAgICAvLyBSRkMyNTE4IDkuNiwgOC44LjQgYW5kIDguOS4zCiAgICAgICAgJG9wdGlvbnNbJ292ZXJ3cml0ZSddID0gdHJ1ZTsKICAgICAgICBpZiAoIWVtcHR5KCRfU0VSVkVSWydIVFRQX09WRVJXUklURSddKSkgewogICAgICAgICAgICAkb3B0aW9uc1snb3ZlcndyaXRlJ10gPSAkX1NFUlZFUlsnSFRUUF9PVkVSV1JJVEUnXSA9PSAnVCc7CiAgICAgICAgfQoKICAgICAgICAkdXJsID0gcGFyc2VfdXJsKCRfU0VSVkVSWydIVFRQX0RFU1RJTkFUSU9OJ10pOwoKICAgICAgICAvLyBkb2VzIHRoZSBkZXN0aW5hdGlvbiByZXNvdXJjZSBiZWxvbmcgb24gdGhpcyBzZXJ2ZXI/CiAgICAgICAgaWYgKCR1cmxbJ2hvc3QnXSA9PSAkdGhpcy0+YmFzZVVybFsnaG9zdCddCiAgICAgICAgICAgICAgICAmJiAoZW1wdHkoJHVybFsncG9ydCddKSA/IDgwIDogJHVybFsncG9ydCddKSA9PSAoZW1wdHkoJHRoaXMtPmJhc2VVcmxbJ3BvcnQnXSkgPyA4MCA6ICR0aGlzLT5iYXNlVXJsWydwb3J0J10pCiAgICAgICAgICAgICAgICAmJiAhc3RybmNtcCgkdXJsWydwYXRoJ10sICR0aGlzLT5iYXNlVXJsWydwYXRoJ10sIHN0cmxlbigkdGhpcy0+YmFzZVVybFsncGF0aCddKSkpIHsKICAgICAgICAgICAgaWYgKCFlbXB0eSgkdGhpcy0+YmFzZXVybFsncXVlcnknXSkpIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKGV4cGxvZGUoJyYnLCAkdGhpcy0+YmFzZVVybFsncXVlcnknXSkgYXMgJHF1ZXJ5Q29tcG9uZW50KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFpbl9hcnJheSgkcXVlcnlDb21wb25lbnQsIGV4cGxvZGUoJyYnLCAkdXJsWydxdWVyeSddKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJG9wdGlvbnNbJ2Rlc3RfdXJsJ10gPSAkX1NFUlZFUlsnSFRUUF9ERVNUSU5BVElPTiddOwoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkb3B0aW9uc1snZGVzdCddID0KICAgICAgICAgICAgICAgIHN1YnN0cigkdXJsWydwYXRoJ10sIHN0cmxlbigkdGhpcy0+YmFzZVVybFsncGF0aCddKSk7CgogICAgICAgICAgICAkb3B0aW9uc1snZGVzdCddID0gJHRoaXMtPl91cmxkZWNvZGUoJG9wdGlvbnNbJ2Rlc3QnXSk7CiAgICAgICAgICAgICRvcHRpb25zWydkZXN0J10gPSB0cmltKCRvcHRpb25zWydkZXN0J10sICcvJyk7CgogICAgICAgICAgICAvLyBjaGVjayBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFyZSBub3QgdGhlIHNhbWUgLSBkYXRhIGNvdWxkIGJlIGxvc3QKICAgICAgICAgICAgLy8gaWYgb3ZlcndyaXRlIGlzIHRydWUgLSBSRkMyNTE4IDguOC41CiAgICAgICAgICAgIGlmICgkb3B0aW9uc1snZGVzdCddID09ICR0aGlzLT5wYXRoKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+c2V0UmVzcG9uc2VTdGF0dXMoJzQwMyBGb3JiaWRkZW4nKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAkb3B0aW9uc1snZGVzdF91cmwnXSA9ICRfU0VSVkVSWydIVFRQX0RFU1RJTkFUSU9OJ107CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8vIH19fQoKICAgIC8vIHt7eyBjb3B5X3dyYXBwZXIKCiAgICAvKioKICAgICAqIENPUFkgbWV0aG9kIHdyYXBwZXIKICAgICAqCiAgICAgKiBAcGFyYW0gdm9pZAogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvcHlfd3JhcHBlcigpCiAgICB7CiAgICAgICAgLy8gbm8gbmVlZCB0byBjaGVjayBzb3VyY2UgaXMgbm90IGxvY2tlZAoKICAgICAgICAvLyBwZXJwYXJlIGRhdGEtc3RydWN0dXJlIGZyb20gQ09QWSByZXF1ZXN0CiAgICAgICAgaWYgKCEkdGhpcy0+Y29weW1vdmVfcmVxdWVzdF9oZWxwZXIoJG9wdGlvbnMpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIGNoZWNrIGRlc3RpbmF0aW9uIGlzIG5vdCBsb2NrZWQKICAgICAgICBpZiAoIWVtcHR5KCRvcHRpb25zWydkZXN0J10pICYmCiAgICAgICAgICAgICAgICAhJHRoaXMtPmNoZWNrX2xvY2tzX3dyYXBwZXIoJG9wdGlvbnNbJ2Rlc3QnXSkpIHsKICAgICAgICAgICAgJHRoaXMtPnNldFJlc3BvbnNlU3RhdHVzKCc0MjMgTG9ja2VkJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIGNhbGwgdXNlciBoYW5kbGVyCiAgICAgICAgJHN0YXR1cyA9ICR0aGlzLT5jb3B5KCRvcHRpb25zKTsKICAgICAgICBpZiAoJHN0YXR1cyA9PT0gdHJ1ZSkgewogICAgICAgICAgICAkc3RhdHVzID0gJG9wdGlvbnNbJ25ldyddID09PSBmYWxzZSA/ICcyMDQgTm8gQ29udGVudCcgOgogICAgICAgICAgICAgICAgJzIwMSBDcmVhdGVkJzsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5zZXRSZXNwb25zZVN0YXR1cygkc3RhdHVzKTsKICAgIH0KCiAgICAvLyB9fX0KCiAgICAvLyB7e3sgbW92ZV93cmFwcGVyCgogICAgLyoqCiAgICAgKiBNT1ZFIG1ldGhvZCB3cmFwcGVyCiAgICAgKgogICAgICogQHBhcmFtIHZvaWQKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBmdW5jdGlvbiBtb3ZlX3dyYXBwZXIoKQogICAgewogICAgICAgIC8vIGNoZWNrIHJlc291cmNlIGlzIG5vdCBsb2NrZWQKICAgICAgICBpZiAoISR0aGlzLT5jaGVja19sb2Nrc193cmFwcGVyKCR0aGlzLT5wYXRoKSkgewogICAgICAgICAgICAkdGhpcy0+c2V0UmVzcG9uc2VTdGF0dXMoJzQyMyBMb2NrZWQnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gcGVycGFyZSBkYXRhLXN0cnVjdHVyZSBmcm9tIE1PVkUgcmVxdWVzdAogICAgICAgIGlmICghJHRoaXMtPmNvcHltb3ZlX3JlcXVlc3RfaGVscGVyKCRvcHRpb25zKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBjaGVjayBkZXN0aW5hdGlvbiBpcyBub3QgbG9ja2VkCiAgICAgICAgaWYgKCFlbXB0eSgkb3B0aW9uc1snZGVzdCddKSAmJgogICAgICAgICAgICAgICAgISR0aGlzLT5jaGVja19sb2Nrc193cmFwcGVyKCRvcHRpb25zWydkZXN0J10pKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRSZXNwb25zZVN0YXR1cygnNDIzIExvY2tlZCcpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBjYWxsIHVzZXIgaGFuZGxlcgogICAgICAgICRzdGF0dXMgPSAkdGhpcy0+bW92ZSgkb3B0aW9ucyk7CiAgICAgICAgaWYgKCRzdGF0dXMgPT09IHRydWUpIHsKICAgICAgICAgICAgJHN0YXR1cyA9ICRvcHRpb25zWyduZXcnXSA9PT0gZmFsc2UgPyAnMjA0IE5vIENvbnRlbnQnIDoKICAgICAgICAgICAgICAgICcyMDEgQ3JlYXRlZCc7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+c2V0UmVzcG9uc2VTdGF0dXMoJHN0YXR1cyk7CiAgICB9CgogICAgLy8gfX19CgogICAgLy8ge3t7IGxvY2tfcmVxdWVzdF9oZWxwZXIKCiAgICAvKioKICAgICAqIExPQ0sgcmVxdWVzdCBoZWxwZXIgLSBwcmVwYXJlcyBkYXRhLXN0cnVjdHVyZXMgZnJvbSBMT0NLIHJlcXVlc3RzCiAgICAgKgogICAgICogQHBhcmFtIG9wdGlvbnMKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBmdW5jdGlvbiBsb2NrX3JlcXVlc3RfaGVscGVyKCYkb3B0aW9ucykKICAgIHsKICAgICAgICAkb3B0aW9ucyA9IGFycmF5KCk7CiAgICAgICAgJG9wdGlvbnNbJ3BhdGgnXSA9ICR0aGlzLT5wYXRoOwoKICAgICAgICAvLyBhIExPQ0sgcmVxdWVzdCB3aXRoIGFuIElmIGhlYWRlciBidXQgd2l0aG91dCBhIGJvZHkgaXMgdXNlZCB0bwogICAgICAgIC8vIHJlZnJlc2ggYSBsb2NrLiAgQ29udGVudC1MZW5naHQgbWF5IGJlIHVuc2V0IG9yIHplcm8uCiAgICAgICAgaWYgKGVtcHR5KCRfU0VSVkVSWydDT05URU5UX0xFTkdUSCddKSAmJiAhZW1wdHkoJF9TRVJWRVJbJ0hUVFBfSUYnXSkpIHsKCiAgICAgICAgICAgIC8vIEZJWE1FOiBSZWZyZXNoIG11bHRpcGxlIGxvY2tzPwogICAgICAgICAgICAkb3B0aW9uc1sndXBkYXRlJ10gPSBzdWJzdHIoJF9TRVJWRVJbJ0hUVFBfSUYnXSwgMiwgLTIpOwoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAkb3B0aW9uc1snZGVwdGgnXSA9ICdpbmZpbml0eSc7CiAgICAgICAgaWYgKCFlbXB0eSgkX1NFUlZFUlsnSFRUUF9ERVBUSCddKSkgewogICAgICAgICAgICAkb3B0aW9uc1snZGVwdGgnXSA9ICRfU0VSVkVSWydIVFRQX0RFUFRIJ107CiAgICAgICAgfQoKICAgICAgICBpZiAoIWVtcHR5KCRfU0VSVkVSWydIVFRQX1RJTUVPVVQnXSkpIHsKICAgICAgICAgICAgJG9wdGlvbnNbJ3RpbWVvdXQnXSA9IGV4cGxvZGUoJywnLCAkX1NFUlZFUlsnSFRUUF9USU1FT1VUJ10pOwogICAgICAgIH0KCiAgICAgICAgLy8gZXh0cmFjdCBsb2NrIHJlcXVlc3QgaW5mb3JtYXRpb24gZnJvbSByZXF1ZXN0IFhNTCBwYXlsb2FkCiAgICAgICAgJGxvY2tpbmZvID0gbmV3IF9wYXJzZV9sb2NraW5mbygkdGhpcy0+b3BlblJlcXVlc3RCb2R5KCkpOwogICAgICAgIGlmICghJGxvY2tpbmZvLT5zdWNjZXNzKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRSZXNwb25zZVN0YXR1cygnNDAwIEJhZCBSZXF1ZXN0Jyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIG5ldyBsb2NrCiAgICAgICAgJG9wdGlvbnNbJ3Njb3BlJ10gPSAkbG9ja2luZm8tPmxvY2tzY29wZTsKICAgICAgICAkb3B0aW9uc1sndHlwZSddICA9ICRsb2NraW5mby0+bG9ja3R5cGU7CiAgICAgICAgJG9wdGlvbnNbJ293bmVyJ10gPSAkbG9ja2luZm8tPm93bmVyOwoKICAgICAgICAkb3B0aW9uc1sndG9rZW4nXSA9ICR0aGlzLT5fbmV3X2xvY2t0b2tlbigpOwoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvLyB9fX0KCiAgICAvLyB7e3sgbG9ja19yZXNwb25zZV9oZWxwZXIKCiAgICAvKioKICAgICAqIExPQ0sgcmVzcG9uc2UgaGVscGVyIC0gZm9ybWF0IExPQ0sgcmVzcG9uc2UKICAgICAqCiAgICAgKiBAcGFyYW0gb3B0aW9ucwogICAgICogQHBhcmFtIHN0YXR1cwogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIGZ1bmN0aW9uIGxvY2tfcmVzcG9uc2VfaGVscGVyKCRvcHRpb25zLCAkc3RhdHVzKQogICAgewogICAgICAgIGlmICghZW1wdHkoJG9wdGlvbnNbJ2xvY2tzJ10pICYmIGlzX2FycmF5KCRvcHRpb25zWydsb2NrcyddKSkgewogICAgICAgICAgICAkdGhpcy0+c2V0UmVzcG9uc2VTdGF0dXMoJzQwOSBDb25mbGljdCcpOwoKICAgICAgICAgICAgJHJlc3BvbnNlcyA9IGFycmF5KCk7CiAgICAgICAgICAgIGZvcmVhY2ggKCRvcHRpb25zWydsb2NrcyddIGFzICRsb2NrKSB7CiAgICAgICAgICAgICAgICAkcmVzcG9uc2UgPSBhcnJheSgpOwoKICAgICAgICAgICAgICAgIGlmIChlbXB0eSgkbG9ja1snaHJlZiddKSkgewogICAgICAgICAgICAgICAgICAgICRyZXNwb25zZVsnaHJlZiddID0gJHRoaXMtPmdldEhyZWYoJGxvY2tbJ3BhdGgnXSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRyZXNwb25zZVsnaHJlZiddID0gJGxvY2tbJ2hyZWYnXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkcmVzcG9uc2VbJ3N0YXR1cyddID0gJzQyMyBMb2NrZWQnOwoKICAgICAgICAgICAgICAgICRyZXNwb25zZXNbXSA9ICRyZXNwb25zZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPl9tdWx0aXN0YXR1c1Jlc3BvbnNlSGVscGVyKCRyZXNwb25zZXMpOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRzdGF0dXMgPT09IHRydWUpIHsKICAgICAgICAgICAgJHN0YXR1cyA9ICcyMDAgT0snOwogICAgICAgIH0gZWxzZSBpZiAoJHN0YXR1cyA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgJHN0YXR1cyA9ICc0MjMgTG9ja2VkJzsKICAgICAgICB9CgogICAgICAgIC8vIHNldCBoZWFkZXJzIGJlZm9yZSB3ZSBzdGFydCBwcmludGluZwogICAgICAgICR0aGlzLT5zZXRSZXNwb25zZVN0YXR1cygkc3RhdHVzKTsKCiAgICAgICAgaWYgKCRzdGF0dXN7MH0gPT0gMikgeyAvLyAyeHggc3RhdGVzIGFyZSBvawogICAgICAgICAgICAkdGhpcy0+c2V0UmVzcG9uc2VIZWFkZXIoJ0NvbnRlbnQtVHlwZTogdGV4dC94bWw7IGNoYXJzZXQ9InV0Zi04IicpOwoKICAgICAgICAgICAgLy8gUkZDMjUxOCA4LjEwLjE6IEluIG9yZGVyIHRvIGluZGljYXRlIHRoZSBsb2NrIHRva2VuIGFzc29jaWF0ZWQKICAgICAgICAgICAgLy8gd2l0aCBhIG5ld2x5IGNyZWF0ZWQgbG9jaywgYSBMb2NrLVRva2VuIHJlc3BvbnNlIGhlYWRlciBNVVNUIGJlCiAgICAgICAgICAgIC8vIGluY2x1ZGVkIGluIHRoZSByZXNwb25zZSBmb3IgZXZlcnkgc3VjY2Vzc2Z1bCBMT0NLIHJlcXVlc3QgZm9yIGEKICAgICAgICAgICAgLy8gbmV3IGxvY2suICBOb3RlIHRoYXQgdGhlIExvY2stVG9rZW4gaGVhZGVyIHdvdWxkIG5vdCBiZSByZXR1cm5lZAogICAgICAgICAgICAvLyBpbiB0aGUgcmVzcG9uc2UgZm9yIGEgc3VjY2Vzc2Z1bCByZWZyZXNoIExPQ0sgcmVxdWVzdCBiZWNhdXNlIGEKICAgICAgICAgICAgLy8gbmV3IGxvY2sgd2FzIG5vdCBjcmVhdGVkLgogICAgICAgICAgICBpZiAoZW1wdHkoJG9wdGlvbnNbJ3VwZGF0ZSddKSB8fCAhZW1wdHkoJG9wdGlvbnNbJ3Rva2VuJ10pKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+c2V0UmVzcG9uc2VIZWFkZXIoIkxvY2stVG9rZW46IDwkb3B0aW9uc1t0b2tlbl0+Iik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRsb2NrID0gYXJyYXkoKTsKICAgICAgICAgICAgZm9yZWFjaCAoYXJyYXkoJ3Njb3BlJywgJ3R5cGUnLCAnZGVwdGgnLCAnb3duZXInKSBhcyAka2V5KSB7CiAgICAgICAgICAgICAgICAkbG9ja1ska2V5XSA9ICRvcHRpb25zWyRrZXldOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWVtcHR5KCRvcHRpb25zWydleHBpcmVzJ10pKSB7CiAgICAgICAgICAgICAgICAkbG9ja1snZXhwaXJlcyddID0gJG9wdGlvbnNbJ2V4cGlyZXMnXTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRsb2NrWyd0aW1lb3V0J10gPSAkb3B0aW9uc1sndGltZW91dCddOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWVtcHR5KCRvcHRpb25zWyd1cGRhdGUnXSkpIHsKICAgICAgICAgICAgICAgICRsb2NrWyd0b2tlbiddID0gJG9wdGlvbnNbJ3VwZGF0ZSddOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGxvY2tbJ3Rva2VuJ10gPSAkb3B0aW9uc1sndG9rZW4nXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZWNobyAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwidXRmLThcIiA/PlxuIjsKICAgICAgICAgICAgZWNobyAiPEQ6cHJvcCB4bWxuczpEPVwiREFWOlwiPlxuIjsKICAgICAgICAgICAgZWNobyAiICA8RDpsb2NrZGlzY292ZXJ5PlxuIjsKICAgICAgICAgICAgZWNobyAnICAgICcgLiAkdGhpcy0+X2FjdGl2ZWxvY2tzUmVzcG9uc2VIZWxwZXIoYXJyYXkoJGxvY2spKQogICAgICAgICAgICAgICAgLiAiXG4iOwogICAgICAgICAgICBlY2hvICIgIDwvRDpsb2NrZGlzY292ZXJ5PlxuIjsKICAgICAgICAgICAgZWNobyAiPC9EOnByb3A+XG4iOwogICAgICAgIH0KICAgIH0KCiAgICAvLyB9fX0KCiAgICAvLyB7e3sgbG9ja193cmFwcGVyCgogICAgLyoqCiAgICAgKiBMT0NLIG1ldGhvZCB3cmFwcGVyCiAgICAgKgogICAgICogQHBhcmFtIHZvaWQKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBmdW5jdGlvbiBsb2NrX3dyYXBwZXIoKQogICAgewogICAgICAgIC8vIHBlcnBhcmUgZGF0YS1zdHJ1Y3R1cmUgZnJvbSBMT0NLIHJlcXVlc3QKICAgICAgICBpZiAoISR0aGlzLT5sb2NrX3JlcXVlc3RfaGVscGVyKCRvcHRpb25zKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBjaGVjayByZXNvdXJjZSBpcyBub3QgbG9ja2VkCiAgICAgICAgaWYgKCFlbXB0eSgkb3B0aW9uc1sndXBkYXRlJ10pCiAgICAgICAgICAgICAgICAmJiAhJHRoaXMtPmNoZWNrX2xvY2tzX3dyYXBwZXIoCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnBhdGgsICRvcHRpb25zWydzY29wZSddID09ICdzaGFyZWQnKSkgewogICAgICAgICAgICAkdGhpcy0+c2V0UmVzcG9uc2VTdGF0dXMoJzQyMyBMb2NrZWQnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJG9wdGlvbnNbJ2xvY2tzJ10gPSAkdGhpcy0+Z2V0RGVzY2VuZGVudHNMb2NrcygkdGhpcy0+cGF0aCk7CiAgICAgICAgaWYgKGVtcHR5KCRvcHRpb25zWydsb2NrcyddKSkgewoKICAgICAgICAgICAgLy8gY2FsbCB1c2VyIGhhbmRsZXIKICAgICAgICAgICAgJHN0YXR1cyA9ICR0aGlzLT5sb2NrKCRvcHRpb25zKTsKICAgICAgICB9CgogICAgICAgIC8vIGZvcm1hdCBMT0NLIHJlc3BvbnNlCiAgICAgICAgJHRoaXMtPmxvY2tfcmVzcG9uc2VfaGVscGVyKCRvcHRpb25zLCAkc3RhdHVzKTsKICAgIH0KCiAgICAvLyB9fX0KCiAgICAvLyB7e3sgdW5sb2NrX3JlcXVlc3RfaGVscGVyCgogICAgLyoqCiAgICAgKiBVTkxPQ0sgcmVxdWVzdCBoZWxwZXIgLSBwcmVwYXJlcyBkYXRhLXN0cnVjdHVyZXMgZnJvbSBVTkxPQ0sgcmVxdWVzdHMKICAgICAqCiAgICAgKiBAcGFyYW0gb3B0aW9ucwogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIGZ1bmN0aW9uIHVubG9ja19yZXF1ZXN0X2hlbHBlcigmJG9wdGlvbnMpCiAgICB7CiAgICAgICAgJG9wdGlvbnMgPSBhcnJheSgpOwogICAgICAgICRvcHRpb25zWydwYXRoJ10gPSAkdGhpcy0+cGF0aDsKCiAgICAgICAgaWYgKGVtcHR5KCRfU0VSVkVSWydIVFRQX0xPQ0tfVE9LRU4nXSkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gc3RyaXAgc3Vycm91bmRpbmcgPD4KICAgICAgICAkb3B0aW9uc1sndG9rZW4nXSA9IHN1YnN0cih0cmltKCRfU0VSVkVSWydIVFRQX0xPQ0tfVE9LRU4nXSksIDEsIC0xKTsKCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLy8gfX19CgogICAgLy8ge3t7IHVubG9ja193cmFwcGVyCgogICAgLyoqCiAgICAgKiBVTkxPQ0sgbWV0aG9kIHdyYXBwZXIKICAgICAqCiAgICAgKiBAcGFyYW0gdm9pZAogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIGZ1bmN0aW9uIHVubG9ja193cmFwcGVyKCkKICAgIHsKICAgICAgICAvLyBwZXJwYXJlIGRhdGEtc3RydWN0dXJlIGZyb20gREVMRVRFIHJlcXVlc3QKICAgICAgICBpZiAoISR0aGlzLT51bmxvY2tfcmVxdWVzdF9oZWxwZXIoJG9wdGlvbnMpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIGNhbGwgdXNlciBoYW5kbGVyCiAgICAgICAgJHN0YXR1cyA9ICR0aGlzLT51bmxvY2soJG9wdGlvbnMpOwoKICAgICAgICAvLyBSRkMyNTE4IDguMTEuMQogICAgICAgIGlmICgkc3RhdHVzID09PSB0cnVlKSB7CiAgICAgICAgICAgICRzdGF0dXMgPSAnMjA0IE5vIENvbnRlbnQnOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNldFJlc3BvbnNlU3RhdHVzKCRzdGF0dXMpOwogICAgfQoKICAgIC8vIH19fQoKICAgIGZ1bmN0aW9uIF9tdWx0aXN0YXR1c1Jlc3BvbnNlSGVscGVyKCRyZXNwb25zZXMpCiAgICB7CiAgICAgICAgLy8gbm93IHdlIGdlbmVyYXRlIHRoZSByZXNwb25zZSBoZWFkZXIuLi4KICAgICAgICAkdGhpcy0+c2V0UmVzcG9uc2VTdGF0dXMoJzIwNyBNdWx0aS1TdGF0dXMnLCBmYWxzZSk7CiAgICAgICAgJHRoaXMtPnNldFJlc3BvbnNlSGVhZGVyKCdDb250ZW50LVR5cGU6IHRleHQveG1sOyBjaGFyc2V0PSJ1dGYtOCInKTsKCiAgICAgICAgLy8gLi4uJiBwYXlsb2FkCiAgICAgICAgZWNobyAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwidXRmLThcIiA/PlxuIjsKICAgICAgICBlY2hvICI8RDptdWx0aXN0YXR1cyB4bWxuczpEPVwiREFWOlwiPlxuIjsKCiAgICAgICAgZm9yZWFjaCAoJHJlc3BvbnNlcyBhcyAkcmVzcG9uc2UpIHsKCiAgICAgICAgICAgIC8vIGlnbm9yZSBlbXB0eSBvciBpbmNvbXBsZXRlIGVudHJpZXMKICAgICAgICAgICAgaWYgKCFpc19hcnJheSgkcmVzcG9uc2UpIHx8IGVtcHR5KCRyZXNwb25zZSkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkbmFtZXNwYWNlcyA9ICcnOwogICAgICAgICAgICBpZiAoIWVtcHR5KCRyZXNwb25zZVsnbmFtZXNwYWNlcyddKSkgewogICAgICAgICAgICAgICAgZm9yZWFjaCAoJHJlc3BvbnNlWyduYW1lc3BhY2VzJ10gYXMgJG5hbWUgPT4gJHByZWZpeCkgewogICAgICAgICAgICAgICAgICAgICRuYW1lc3BhY2VzIC49ICIgeG1sbnM6JHByZWZpeD1cIiRuYW1lXCIiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVjaG8gIiAgPEQ6cmVzcG9uc2UkbmFtZXNwYWNlcz5cbiI7CiAgICAgICAgICAgIGVjaG8gIiAgICA8RDpocmVmPiRyZXNwb25zZVtocmVmXTwvRDpocmVmPlxuIjsKCiAgICAgICAgICAgIC8vIHJlcG9ydCBhbGwgZm91bmQgcHJvcGVydGllcyBhbmQgdGhlaXIgdmFsdWVzIChpZiBhbnkpCiAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJldHVyZW5kIGZvciBhIGZpbGUKICAgICAgICAgICAgaWYgKCFlbXB0eSgkcmVzcG9uc2VbJ3Byb3BzdGF0J10pICYmCiAgICAgICAgICAgICAgICAgICAgaXNfYXJyYXkoJHJlc3BvbnNlWydwcm9wc3RhdCddKSkgewoKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRyZXNwb25zZVsncHJvcHN0YXQnXSBhcyAkc3RhdHVzID0+ICRwcm9wcykgewogICAgICAgICAgICAgICAgICAgIGVjaG8gIiAgICA8RDpwcm9wc3RhdD5cbiI7CiAgICAgICAgICAgICAgICAgICAgZWNobyAiICAgICAgPEQ6cHJvcD5cbiI7CgogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRwcm9wcyBhcyAkcHJvcCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX2FycmF5KCRwcm9wKSB8fCBlbXB0eSgkcHJvcFsnbmFtZSddKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVtcHR5IHByb3BlcnRpZXMgKGNhbm5vdCB1c2UgZW1wdHkgZm9yIGNoZWNrIGFzICcwJwogICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBhIGxlZ2FsIHZhbHVlIGhlcmUpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbXB0eSgkcHJvcFsndmFsdWUnXSkgJiYgKCFpc3NldCgkcHJvcFsndmFsdWUnXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAkcHJvcFsndmFsdWUnXSAhPT0gMCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkcHJvcFsnbnMnXSA9PSAnREFWOicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICIgICAgICAgIDxEOiRwcm9wW25hbWVdLz5cbiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkcHJvcFsnbnMnXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcgICAgICAgIDwnIC4gJHJlc3BvbnNlWyduYW1lc3BhY2VzJ11bJHByb3BbJ25zJ11dIC4gIjokcHJvcFtuYW1lXS8+XG4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIiAgICAgICAgPCRwcm9wW25hbWVdIHhtbG5zPVwiXCIvPiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc29tZSBXZWJEQVYgcHJvcGVydGllcyBuZWVkIHNwZWNpYWwgdHJlYXRtZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkcHJvcFsnbnMnXSA9PSAnREFWOicpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCRwcm9wWyduYW1lJ10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NyZWF0aW9uZGF0ZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnICAgICAgICA8RDpjcmVhdGlvbmRhdGUgJyAuICRyZXNwb25zZVsnbmFtZXNwYWNlcyddW0hUVFBfV0VCREFWX1NFUlZFUl9EQVRBVFlQRV9OQU1FU1BBQ0VdIC4gJzpkdD0iZGF0ZVRpbWUudHoiPicgLiBnbWRhdGUoJ1ktbS1kXFRIOmk6c1xaJywgJHByb3BbJ3ZhbHVlJ10pIC4gIjwvRDpjcmVhdGlvbmRhdGU+XG4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2dldGxhc3Rtb2RpZmllZCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnICAgICAgICA8RDpnZXRsYXN0bW9kaWZpZWQgJyAuICRyZXNwb25zZVsnbmFtZXNwYWNlcyddW0hUVFBfV0VCREFWX1NFUlZFUl9EQVRBVFlQRV9OQU1FU1BBQ0VdIC4gJzpkdD0iZGF0ZVRpbWUucmZjMTEyMyI+JyAuIGdtZGF0ZSgnRCwgZCBNIFkgSDppOnMnLCAkcHJvcFsndmFsdWUnXSkgLiAiIFVUQzwvRDpnZXRsYXN0bW9kaWZpZWQ+XG4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Jlc291cmNldHlwZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiICAgICAgICA8RDpyZXNvdXJjZXR5cGU+PEQ6JHByb3BbdmFsdWVdLz48L0Q6cmVzb3VyY2V0eXBlPlxuIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzdXBwb3J0ZWRsb2NrJzoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRwcm9wWyd2YWx1ZSddKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJvcFsndmFsdWUnXSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+X2xvY2tlbnRyaWVzUmVzcG9uc2VIZWxwZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHByb3BbJ3ZhbHVlJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICIgICAgICAgIDxEOnN1cHBvcnRlZGxvY2s+XG4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIiAgICAgICAgICAkcHJvcFt2YWx1ZV1cbiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiICAgICAgICA8L0Q6c3VwcG9ydGVkbG9jaz5cbiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbG9ja2Rpc2NvdmVyeSc6CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc19hcnJheSgkcHJvcFsndmFsdWUnXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHByb3BbJ3ZhbHVlJ10gPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPl9hY3RpdmVsb2Nrc1Jlc3BvbnNlSGVscGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwcm9wWyd2YWx1ZSddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiICAgICAgICA8RDpsb2NrZGlzY292ZXJ5PlxuIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICIgICAgICAgICAgJHByb3BbdmFsdWVdXG4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIiAgICAgICAgPC9EOmxvY2tkaXNjb3Zlcnk+XG4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiICAgICAgICA8RDokcHJvcFtuYW1lXT4iIC4gJHRoaXMtPl9wcm9wX2VuY29kZShodG1sc3BlY2lhbGNoYXJzKCRwcm9wWyd2YWx1ZSddKSkgLiAiPC9EOiRwcm9wW25hbWVdPlxuIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkcHJvcFsnbnMnXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJyAgICAgICAgPCcgLiAkcmVzcG9uc2VbJ25hbWVzcGFjZXMnXVskcHJvcFsnbnMnXV0gLiAiOiRwcm9wW25hbWVdPiIgLiAkdGhpcy0+X3Byb3BfZW5jb2RlKGh0bWxzcGVjaWFsY2hhcnMoJHByb3BbJ3ZhbHVlJ10pKSAuICc8LycgLiAkcmVzcG9uc2VbJ25hbWVzcGFjZXMnXVskcHJvcFsnbnMnXV0gLiAiOiRwcm9wW25hbWVdPlxuIjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiICAgICAgICA8JHByb3BbbmFtZV0geG1sbnM9XCJcIj4iIC4gJHRoaXMtPl9wcm9wX2VuY29kZShodG1sc3BlY2lhbGNoYXJzKCRwcm9wWyd2YWx1ZSddKSkgLiAiPC8kcHJvcFtuYW1lXT5cbiI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBlY2hvICIgICAgICA8L0Q6cHJvcD5cbiI7CiAgICAgICAgICAgICAgICAgICAgZWNobyAiICAgICAgPEQ6c3RhdHVzPkhUVFAvMS4xICRzdGF0dXM8L0Q6c3RhdHVzPlxuIjsKICAgICAgICAgICAgICAgICAgICBlY2hvICIgICAgPC9EOnByb3BzdGF0PlxuIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFlbXB0eSgkcmVzcG9uc2VbJ3N0YXR1cyddKSkgewogICAgICAgICAgICAgICAgZWNobyAiICAgIDxEOnN0YXR1cz5IVFRQLzEuMSAkcmVzcG9uc2Vbc3RhdHVzXTwvRDpzdGF0dXM+XG4iOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWVtcHR5KCRyZXNwb25zZVsncmVzcG9uc2VkZXNjcmlwdGlvbiddKSkgewogICAgICAgICAgICAgICAgZWNobyAnICAgIDxEOnJlc3BvbnNlZGVzY3JpcHRpb24+JyAuICR0aGlzLT5fcHJvcF9lbmNvZGUoaHRtbHNwZWNpYWxjaGFycygkcmVzcG9uc2VbJ3Jlc3BvbnNlZGVzY3JpcHRpb24nXSkpIC4gIjwvRDpyZXNwb25zZWRlc2NyaXB0aW9uPlxuIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZWNobyAiICA8L0Q6cmVzcG9uc2U+XG4iOwogICAgICAgIH0KCiAgICAgICAgZWNobyAiPC9EOm11bHRpc3RhdHVzPlxuIjsKICAgIH0KCiAgICBmdW5jdGlvbiBfYWN0aXZlbG9ja3NSZXNwb25zZUhlbHBlcigkbG9ja3MpCiAgICB7CiAgICAgICAgaWYgKCFpc19hcnJheSgkbG9ja3MpIHx8IGVtcHR5KCRsb2NrcykpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJGxvY2tzIGFzICRrZXkgPT4gJGxvY2spIHsKICAgICAgICAgICAgaWYgKCFpc19hcnJheSgkbG9jaykgfHwgZW1wdHkoJGxvY2spKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY2hlY2sgZm9yICd0aW1lb3V0JyBvciAnZXhwaXJlcycKICAgICAgICAgICAgJHRpbWVvdXQgPSAnSW5maW5pdGUnOwogICAgICAgICAgICBpZiAoIWVtcHR5KCRsb2NrWydleHBpcmVzJ10pKSB7CiAgICAgICAgICAgICAgICAkdGltZW91dCA9ICdTZWNvbmQtJyAuICgkbG9ja1snZXhwaXJlcyddIC0gdGltZSgpKTsKICAgICAgICAgICAgfSBlbHNlIGlmICghZW1wdHkoJGxvY2tbJ3RpbWVvdXQnXSkpIHsKCiAgICAgICAgICAgICAgICAvLyBtb3JlIHRoYW4gYSBtaWxsaW9uIGlzIGNvbnNpZGVyZWQgYW4gYWJzb2x1dGUgdGltZXN0YW1wCiAgICAgICAgICAgICAgICAvLyBsZXNzIGlzIG1vcmUgbGlrZWx5IGEgcmVsYXRpdmUgdmFsdWUKICAgICAgICAgICAgICAgICR0aW1lb3V0ID0gIlNlY29uZC0kbG9ja1t0aW1lb3V0XSI7CiAgICAgICAgICAgICAgICBpZiAoJGxvY2tbJ3RpbWVvdXQnXSA+IDEwMDAwMDApIHsKICAgICAgICAgICAgICAgICAgICAkdGltZW91dCA9ICdTZWNvbmQtJyAuICgkbG9ja1sndGltZW91dCddIC0gdGltZSgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZ2VucmVhdGUgcmVzcG9uc2UgYmxvY2sKICAgICAgICAgICAgJGxvY2tzWyRrZXldID0gIjxEOmFjdGl2ZWxvY2s+CiAgICAgICAgICAgIDxEOmxvY2tzY29wZT48RDokbG9ja1tzY29wZV0vPjwvRDpsb2Nrc2NvcGU+CiAgICAgICAgICAgIDxEOmxvY2t0eXBlPjxEOiRsb2NrW3R5cGVdLz48L0Q6bG9ja3R5cGU+CiAgICAgICAgICAgIDxEOmRlcHRoPiIgLiAoJGxvY2tbJ2RlcHRoJ10gPT0gJ2luZmluaXR5JyA/ICdJbmZpbml0eScgOiAkbG9ja1snZGVwdGgnXSkgLiAiPC9EOmRlcHRoPgogICAgICAgICAgICA8RDpvd25lcj4kbG9ja1tvd25lcl08L0Q6b3duZXI+CiAgICAgICAgICAgIDxEOnRpbWVvdXQ+JHRpbWVvdXQ8L0Q6dGltZW91dD4KICAgICAgICAgICAgPEQ6bG9ja3Rva2VuPjxEOmhyZWY+JGxvY2tbdG9rZW5dPC9EOmhyZWY+PC9EOmxvY2t0b2tlbj4KICAgICAgICAgIDwvRDphY3RpdmVsb2NrPiI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaW1wbG9kZSgnJywgJGxvY2tzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBfbG9ja2VudHJpZXNSZXNwb25zZUhlbHBlcigkbG9ja3MpCiAgICB7CiAgICAgICAgaWYgKCFpc19hcnJheSgkbG9ja3MpIHx8IGVtcHR5KCRsb2NrcykpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJGxvY2tzIGFzICRrZXkgPT4gJGxvY2spIHsKICAgICAgICAgICAgaWYgKCFpc19hcnJheSgkbG9jaykgfHwgZW1wdHkoJGxvY2spKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGxvY2tzWyRrZXldID0gIjxEOmxvY2tlbnRyeT4KICAgICAgICAgICAgPEQ6bG9ja3Njb3BlPjxEOiRsb2NrW3Njb3BlXS8+PC9EOmxvY2tzY29wZT4KICAgICAgICAgICAgPEQ6bG9ja3R5cGU+PEQ6JGxvY2tbdHlwZV0vPjwvRDpsb2NrdHlwZT4KICAgICAgICAgIDwvRDpsb2NrZW50cnk+IjsKICAgICAgICB9CgogICAgICAgIHJldHVybiBpbXBsb2RlKCcnLCAkbG9ja3MpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldEhyZWYoJHBhdGgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5iYXNlVXJsWydwYXRoJ10gLiAnLycgLiAkcGF0aDsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRQcm9wKCRyZXFwcm9wLCAkZmlsZSwgJG9wdGlvbnMpCiAgICB7CiAgICAgICAgLy8gY2hlY2sgaWYgcHJvcGVydHkgZXhpc3RzIGluIHJlc3BvbnNlCiAgICAgICAgZm9yZWFjaCAoJGZpbGVbJ3Byb3BzJ10gYXMgJHByb3ApIHsKICAgICAgICAgICAgaWYgKCRyZXFwcm9wWyduYW1lJ10gPT0gJHByb3BbJ25hbWUnXQogICAgICAgICAgICAgICAgICAgICYmICRyZXFwcm9wWyducyddID09ICRwcm9wWyducyddKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHByb3A7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkcmVxcHJvcFsnbmFtZSddID09ICdsb2NrZGlzY292ZXJ5JwogICAgICAgICAgICAgICAgJiYgJHJlcXByb3BbJ25zJ10gPT0gJ0RBVjonCiAgICAgICAgICAgICAgICAmJiBtZXRob2RfZXhpc3RzKCR0aGlzLCAnZ2V0TG9ja3MnKSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPm1rcHJvcCgnREFWOicsICdsb2NrZGlzY292ZXJ5JywKICAgICAgICAgICAgICAgICR0aGlzLT5nZXRMb2NrcygkZmlsZVsncGF0aCddKSk7CiAgICAgICAgfQoKICAgICAgICAvLyBpbmNhc2UgdGhlIHJlcXVlc3RlZCBwcm9wZXJ0eSBoYWQgYSB2YWx1ZSwgbGlrZSBjYWxlbmRhci1kYXRhCiAgICAgICAgdW5zZXQoJHJlcXByb3BbJ3ZhbHVlJ10pOwogICAgICAgICRyZXFwcm9wWydzdGF0dXMnXSA9ICc0MDQgTm90IEZvdW5kJzsKCiAgICAgICAgcmV0dXJuICRyZXFwcm9wOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldERlc2NlbmRlbnRzTG9ja3MoJHBhdGgpCiAgICB7CiAgICAgICAgJG9wdGlvbnMgPSBhcnJheSgpOwogICAgICAgICRvcHRpb25zWydwYXRoJ10gPSAkcGF0aDsKICAgICAgICAkb3B0aW9uc1snZGVwdGgnXSA9ICdpbmZpbml0eSc7CiAgICAgICAgJG9wdGlvbnNbJ3Byb3BzJ10gPSBhcnJheSgpOwogICAgICAgICRvcHRpb25zWydwcm9wcyddW10gPSAkdGhpcy0+bWtwcm9wKCdEQVY6JywgJ2xvY2tkaXNjb3ZlcnknLCBudWxsKTsKCiAgICAgICAgLy8gY2FsbCB1c2VyIGhhbmRsZXIKICAgICAgICBpZiAoISR0aGlzLT5wcm9wZmluZCgkb3B0aW9ucywgJGZpbGVzKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGZpbGVzOwogICAgfQoKICAgIC8vIHt7eyBfYWxsb3coKQoKICAgIC8qKgogICAgICogTGlzdCBpbXBsZW1lbnRlZCBtZXRob2RzCiAgICAgKgogICAgICogQHBhcmFtIHZvaWQKICAgICAqIEByZXR1cm4gYXJyYXkgc29tZXRoaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9hbGxvdygpCiAgICB7CiAgICAgICAgLy8gT1BUSU9OUyBpcyBhbHdheXMgdGhlcmUKICAgICAgICAkYWxsb3cgPSBhcnJheSgnT1BUSU9OUycpOwoKICAgICAgICAvLyBhbGwgb3RoZXIgbWV0aG9kcyBuZWVkIGJvdGggYSBtZXRob2Rfd3JhcHBlcigpIGFuZCBhIG1ldGhvZCgpCiAgICAgICAgLy8gaW1wbGVtZW50YXRpb24KICAgICAgICAvLyB0aGUgYmFzZSBjbGFzcyBkZWZpbmVzIG9ubHkgd3JhcHBlcnMKICAgICAgICBmb3JlYWNoKGdldF9jbGFzc19tZXRob2RzKCR0aGlzKSBhcyAkbWV0aG9kKSB7CgogICAgICAgICAgICAvLyBzdHJuY21wIGJyZWFrcyB3aXRoIG5lZ2F0aXZlIGxlbiAtCiAgICAgICAgICAgIC8vIGh0dHA6Ly9idWdzLnBocC5uZXQvYnVnLnBocD9pZD0zNjk0NAogICAgICAgICAgICAvL2lmICghc3RybmNtcCgnX3dyYXBwZXInLCAkbWV0aG9kLCAtOCkpIHsKICAgICAgICAgICAgaWYgKCFzdHJjbXAoc3Vic3RyKCRtZXRob2QsIC04KSwgJ193cmFwcGVyJykpIHsKICAgICAgICAgICAgICAgICRtZXRob2QgPSBzdHJ0b2xvd2VyKHN1YnN0cigkbWV0aG9kLCAwLCAtOCkpOwogICAgICAgICAgICAgICAgaWYgKG1ldGhvZF9leGlzdHMoJHRoaXMsICRtZXRob2QpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICgkbWV0aG9kICE9ICdsb2NrJyAmJiAkbWV0aG9kICE9ICd1bmxvY2snIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9leGlzdHMoJHRoaXMsICdnZXRMb2NrcycpKSkgewogICAgICAgICAgICAgICAgICAgICRhbGxvd1tdID0gJG1ldGhvZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gd2UgY2FuIGVtdWxhdGUgYSBtaXNzaW5nIEhFQUQgaW1wbGVtZXRhdGlvbiB1c2luZyBHRVQKICAgICAgICBpZiAoaW5fYXJyYXkoJ0dFVCcsICRhbGxvdykpIHsKICAgICAgICAgICAgJGFsbG93W10gPSAnSEVBRCc7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGFsbG93OwogICAgfQoKICAgIC8vIH19fQoKICAgIC8vIHt7eyBta3Byb3AKCiAgICAvKioKICAgICAqIEhlbHBlciBmb3IgcHJvcGVydHkgZWxlbWVudCBjcmVhdGlvbgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgWE1MIG5hbWVzcGFjZSAob3B0aW9uYWwpCiAgICAgKiBAcGFyYW0gc3RyaW5nIHByb3BlcnR5IG5hbWUKICAgICAqIEBwYXJhbSBzdHJpbmcgcHJvcGVydHkgdmFsdWUKICAgICAqIEByZXR1cm4gYXJyYXkgcHJvcGVydHkgYXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gbWtwcm9wKCkKICAgIHsKICAgICAgICAkYXJncyA9IGZ1bmNfZ2V0X2FyZ3MoKTsKCiAgICAgICAgJHByb3AgPSBhcnJheSgpOwogICAgICAgICRwcm9wWyducyddID0gJ0RBVjonOwogICAgICAgIGlmIChjb3VudCgkYXJncykgPiAyKSB7CiAgICAgICAgICAgICRwcm9wWyducyddID0gYXJyYXlfc2hpZnQoJGFyZ3MpOwogICAgICAgIH0KCiAgICAgICAgJHByb3BbJ25hbWUnXSA9IGFycmF5X3NoaWZ0KCRhcmdzKTsKICAgICAgICAkcHJvcFsndmFsdWUnXSA9IGFycmF5X3NoaWZ0KCRhcmdzKTsKICAgICAgICAkcHJvcFsnc3RhdHVzJ10gPSBhcnJheV9zaGlmdCgkYXJncyk7CgogICAgICAgIHJldHVybiAkcHJvcDsKICAgIH0KCiAgICAvLyB9fX0KCiAgICAvLyB7e3sgY2hlY2tfYXV0aF93cmFwcGVyCgogICAgLyoqCiAgICAgKiBDaGVjayBhdXRoZW50aWNhdGlvbiBpZiBpbXBsZW1lbnRlZAogICAgICoKICAgICAqIEBwYXJhbSB2b2lkCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBhdXRoZW50aWNhdGlvbiBzdWNjZWRlZCBvciBub3QgbmVjZXNzYXJ5CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNoZWNrX2F1dGhfd3JhcHBlcigpCiAgICB7CiAgICAgICAgaWYgKG1ldGhvZF9leGlzdHMoJHRoaXMsICdjaGVja0F1dGgnKSkgewoKICAgICAgICAgICAgLy8gUEVBUiBzdHlsZSBtZXRob2QgbmFtZQogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmNoZWNrQXV0aChAJF9TRVJWRVJbJ0FVVEhfVFlQRSddLAogICAgICAgICAgICAgICAgQCRfU0VSVkVSWydQSFBfQVVUSF9VU0VSJ10sCiAgICAgICAgICAgICAgICBAJF9TRVJWRVJbJ1BIUF9BVVRIX1BXJ10pOwogICAgICAgIH0KCiAgICAgICAgaWYgKG1ldGhvZF9leGlzdHMoJHRoaXMsICdjaGVja19hdXRoJykpIHsKCiAgICAgICAgICAgIC8vIG9sZCAocHJlIDEuMCkgbWV0aG9kIG5hbWUKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5jaGVja19hdXRoKEAkX1NFUlZFUlsnQVVUSF9UWVBFJ10sCiAgICAgICAgICAgICAgICBAJF9TRVJWRVJbJ1BIUF9BVVRIX1VTRVInXSwKICAgICAgICAgICAgICAgIEAkX1NFUlZFUlsnUEhQX0FVVEhfUFcnXSk7CiAgICAgICAgfQoKICAgICAgICAvLyBubyBtZXRob2QgZm91bmQgLT4gbm8gYXV0aGVudGljYXRpb24gcmVxdWlyZWQKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvLyB9fX0KCiAgICAvLyB7e3sgVVVJRCBzdHVmZgoKICAgIC8qKgogICAgICogR2VuZXJhdGUgVW5pcXVlIFVuaXZlcnNhbCBJRGVudGlmaWVyIGZvciBsb2NrIHRva2VuCiAgICAgKgogICAgICogQHBhcmFtIHZvaWQKICAgICAqIEByZXR1cm4gc3RyaW5nIGEgbmV3IFVVSUQKICAgICAqLwogICAgZnVuY3Rpb24gX25ld191dWlkKCkKICAgIHsKICAgICAgICAvLyB1c2UgdXVpZCBleHRlbnNpb24gZnJvbSBQRUNMIGlmIGF2YWlsYWJsZQogICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3V1aWRfY3JlYXRlJykpIHsKICAgICAgICAgICAgcmV0dXJuIHV1aWRfY3JlYXRlKCk7CiAgICAgICAgfQoKICAgICAgICAvLyBmYWxsYmFjawogICAgICAgICR1dWlkID0gbWQ1KG1pY3JvdGltZSgpIC4gZ2V0bXlwaWQoKSk7IC8vIHRoaXMgc2hvdWxkIGJlIHJhbmRvbSBlbm91Z2ggZm9yIG5vdwoKICAgICAgICAvLyBzZXQgdmFyaWFudCBhbmQgdmVyc2lvbiBmaWVsZHMgZm9yICd0cnVlJyByYW5kb20gdXVpZAogICAgICAgICR1dWlkezEyfSA9ICc0JzsKICAgICAgICAkbiA9IDggKyAob3JkKCR1dWlkezE2fSkgJiAzKTsKICAgICAgICAkaGV4ID0gJzAxMjM0NTY3ODlhYmNkZWYnOwogICAgICAgICR1dWlkezE2fSA9ICRoZXh7JG59OwoKICAgICAgICAvLyByZXR1cm4gZm9ybWF0ZWQgdXVpZAogICAgICAgIHJldHVybiBzdWJzdHIoJHV1aWQsICAwLCA4KQogICAgICAgICAgICAuICctJyAuIHN1YnN0cigkdXVpZCwgIDgsIDQpCiAgICAgICAgICAgIC4gJy0nIC4gc3Vic3RyKCR1dWlkLCAxMiwgNCkKICAgICAgICAgICAgLiAnLScgLiBzdWJzdHIoJHV1aWQsIDE2LCA0KQogICAgICAgICAgICAuICctJyAuIHN1YnN0cigkdXVpZCwgMjApOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlIGEgbmV3IG9wYXF1ZSBsb2NrIHRva2VuIGFzIGRlZmluZWQgaW4gUkZDMjUxOAogICAgICoKICAgICAqIEBwYXJhbSB2b2lkCiAgICAgKiBAcmV0dXJuIHN0cmluZyBuZXcgUkZDMjUxOCBvcGFxdWUgbG9jayB0b2tlbgogICAgICovCiAgICBmdW5jdGlvbiBfbmV3X2xvY2t0b2tlbigpCiAgICB7CiAgICAgICAgcmV0dXJuICdvcGFxdWVsb2NrdG9rZW46JyAuICR0aGlzLT5fbmV3X3V1aWQoKTsKICAgIH0KCiAgICAvLyB9fX0KCiAgICAvLyB7e3sgV2ViREFWIElmOiBoZWFkZXIgcGFyc2luZwoKICAgIC8qKgogICAgICoKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nIGhlYWRlciBzdHJpbmcgdG8gcGFyc2UKICAgICAqIEBwYXJhbSBpbnQgY3VycmVudCBwYXJzaW5nIHBvc2l0aW9uCiAgICAgKiBAcmV0dXJuIGFycmF5IG5leHQgdG9rZW4gKHR5cGUgYW5kIHZhbHVlKQogICAgICovCiAgICBmdW5jdGlvbiBfaWZfaGVhZGVyX2xleGVyKCRzdHJpbmcsICYkcG9zKQogICAgewogICAgICAgIC8vIHNraXAgd2hpdGVzcGFjZQogICAgICAgIHdoaWxlIChjdHlwZV9zcGFjZSgkc3RyaW5neyRwb3N9KSkgewogICAgICAgICAgICArKyRwb3M7CiAgICAgICAgfQoKICAgICAgICAvLyBhbHJlYWR5IGF0IGVuZCBvZiBzdHJpbmc/CiAgICAgICAgaWYgKHN0cmxlbigkc3RyaW5nKSA8PSAkcG9zKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIGdldCBuZXh0IGNoYXJhY3RlcgogICAgICAgICRjID0gJHN0cmluZ3skcG9zKyt9OwoKICAgICAgICAvLyBub3cgaXQgZGVwZW5kcyBvbiB3aGF0IHdlIGZvdW5kCiAgICAgICAgc3dpdGNoICgkYykgewoKICAgICAgICAgICAgLy8gVVJMcyBhcmUgZW5jbG9zZWQgaW4gPC4uLj4KICAgICAgICAgICAgY2FzZSAnPCc6CiAgICAgICAgICAgICAgICAkcG9zMiA9IHN0cnBvcygkc3RyaW5nLCAnPicsICRwb3MpOwogICAgICAgICAgICAgICAgJHVyaSA9IHN1YnN0cigkc3RyaW5nLCAkcG9zLCAkcG9zMiAtICRwb3MpOwogICAgICAgICAgICAgICAgJHBvcyA9ICRwb3MyICsgMTsKICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgnVVJJJywgJHVyaSk7CgogICAgICAgICAgICAvLyBFVGFncyBhcmUgZW5jbG9zZWQgaW4gWy4uLl0KICAgICAgICAgICAgY2FzZSAnWyc6CiAgICAgICAgICAgICAgICAkdHlwZSA9ICdFVEFHX1NUUk9ORyc7CiAgICAgICAgICAgICAgICBpZiAoJHN0cmluZ3skcG9zfSA9PSAnVycpIHsKICAgICAgICAgICAgICAgICAgICAkdHlwZSA9ICdFVEFHX1dFQUsnOwogICAgICAgICAgICAgICAgICAgICRwb3MgKz0gMjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkcG9zMiA9IHN0cnBvcygkc3RyaW5nLCAnXScsICRwb3MpOwogICAgICAgICAgICAgICAgJGV0YWcgPSBzdWJzdHIoJHN0cmluZywgJHBvcyArIDEsICRwb3MyIC0gJHBvcyAtIDIpOwogICAgICAgICAgICAgICAgJHBvcyA9ICRwb3MyICsgMTsKICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgkdHlwZSwgJGV0YWcpOwoKICAgICAgICAgICAgLy8gJ04nIGluZGljYXRlcyBuZWdhdGlvbgogICAgICAgICAgICBjYXNlICdOJzoKICAgICAgICAgICAgICAgICRwb3MgKz0gMjsKICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgnTk9UJywgJ05vdCcpOwoKICAgICAgICAgICAgLy8gYW55dGhpbmcgZWxzZSBpcyBwYXNzZWQgdmVyYmF0aW0gY2hhciBieSBjaGFyCiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoJ0NIQVInLCAkYyk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUGFyc2UgSWY6IGhlYWRlcgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgaGVhZGVyIHN0cmluZwogICAgICogQHJldHVybiBhcnJheSBVUkxzIGFuZCB0aGVpciBjb25kaXRpb25zCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9pZl9oZWFkZXJfcGFyc2VyKCRzdHIpCiAgICB7CiAgICAgICAgJHBvcyA9IDA7CiAgICAgICAgJGxlbiA9IHN0cmxlbigkc3RyKTsKCiAgICAgICAgJHVyaXMgPSBhcnJheSgpOwoKICAgICAgICAvLyBwYXJzZXIgbG9vcAogICAgICAgIHdoaWxlICgkcG9zIDwgJGxlbikgewoKICAgICAgICAgICAgLy8gZ2V0IG5leHQgdG9rZW4KICAgICAgICAgICAgJHRva2VuID0gJHRoaXMtPl9pZl9oZWFkZXJfbGV4ZXIoJHN0ciwgJHBvcyk7CgogICAgICAgICAgICAvLyBjaGVjayBmb3IgVVJMCiAgICAgICAgICAgICR1cmkgPSAnJzsKICAgICAgICAgICAgaWYgKCR0b2tlblswXSA9PSAnVVJJJykgewogICAgICAgICAgICAgICAgJHVyaSA9ICR0b2tlblsxXTsgLy8gcmVtZW1iZXIgVVJMCiAgICAgICAgICAgICAgICAkdG9rZW4gPSAkdGhpcy0+X2lmX2hlYWRlcl9sZXhlcigkc3RyLCAkcG9zKTsgLy8gZ2V0IG5leHQgdG9rZW4KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc2FuaXR5IGNoZWNrCiAgICAgICAgICAgIGlmICgkdG9rZW5bMF0gIT0gJ0NIQVInIHx8ICR0b2tlblsxXSAhPSAnKCcpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGxpc3QgPSBhcnJheSgpOwogICAgICAgICAgICAkbGV2ZWwgPSAxOwogICAgICAgICAgICB3aGlsZSAoJGxldmVsKSB7CiAgICAgICAgICAgICAgICAkdG9rZW4gPSAkdGhpcy0+X2lmX2hlYWRlcl9sZXhlcigkc3RyLCAkcG9zKTsKCiAgICAgICAgICAgICAgICAkbm90ID0gJyc7CiAgICAgICAgICAgICAgICBpZiAoJHRva2VuWzBdID09ICdOT1QnKSB7CiAgICAgICAgICAgICAgICAgICAgJG5vdCA9ICchJzsKICAgICAgICAgICAgICAgICAgICAkdG9rZW4gPSAkdGhpcy0+X2lmX2hlYWRlcl9sZXhlcigkc3RyLCAkcG9zKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzd2l0Y2ggKCR0b2tlblswXSkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgJ0NIQVInOgogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCR0b2tlblsxXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnKCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxldmVsKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnKSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxldmVsLS07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgIGNhc2UgJ1VSSSc6CiAgICAgICAgICAgICAgICAgICAgICAgICRsaXN0W10gPSAkbm90IC4gIjwkdG9rZW5bMV0+IjsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgIGNhc2UgJ0VUQUdfV0VBSyc6CiAgICAgICAgICAgICAgICAgICAgICAgICRsaXN0W10gPSAkbm90IC4gIltXLyckdG9rZW5bMV0nXSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICBjYXNlICdFVEFHX1NUUk9ORyc6CiAgICAgICAgICAgICAgICAgICAgICAgICRsaXN0W10gPSAkbm90IC4gIlsnJHRva2VuWzFdJ10iOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBSRkMyNTE4IDkuNC4xOiBUaGUgTm8tdGFnLWxpc3QgcHJvZHVjdGlvbiBkZXNjcmliZXMgYSBzZXJpZXMgb2YKICAgICAgICAgICAgLy8gc3RhdGUgdG9rZW5zIGFuZCBFVGFncy4gIElmIG11bHRpcGxlIE5vLXRhZy1saXN0IHByb2R1Y3Rpb25zIGFyZQogICAgICAgICAgICAvLyB1c2VkIHRoZW4gb25lIG9ubHkgbmVlZHMgdG8gbWF0Y2ggdGhlIHN0YXRlIG9mIHRoZSByZXNvdXJjZSBmb3IKICAgICAgICAgICAgLy8gdGhlIG1ldGhvZCB0byBiZSBhbGxvd2VkIHRvIGNvbnRpbnVlLgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBGSVhNRTogU2luY2Ugb25seSBvbmUgbGlzdCBvZiBjb25kaXRpb25zIG11c3QgYmUgc2F0aXNmaWVkLCBpdAogICAgICAgICAgICAvLyBpcyBhIG1pc3Rha2UgdG8gbWVyZ2UgYWxsIGxpc3RzIG9mIGNvbmRpdGlvbnMuICBJbnN0ZWFkLCBhIFVSTAogICAgICAgICAgICAvLyBzaG91bGQgcmVmZXJlbmNlIGFuIGFycmF5IG9mIGFycmF5cyBvZiBjb25kaXRpb25zLCB0aGUgaW5uZXIKICAgICAgICAgICAgLy8gYXJyYXkgcmVwcmVzZW50aW5nIGEgY29uanVuY3Rpb24gYW5kIHRoZSBvdXRlciBhcnJheQogICAgICAgICAgICAvLyByZXByZXNlbnRpbmcgYSBkaXNqdW5jdGlvbiwgb3IgJHVyaXMgc2hvdWxkbid0IGJlIGFzc29jaWF0aXZlLAogICAgICAgICAgICAvLyBidXQgYmUgYW4gYXJyYXkgb2YgcHJvZHVjdGlvbnMgYXJyYXkoJ2hyZWYnID0+ICRocmVmLAogICAgICAgICAgICAvLyAnY29uZGl0aW9ucycgPT4gYXJyYXkoJGNvbmRpdGlvbiwgLi4uKSkKICAgICAgICAgICAgaWYgKCFlbXB0eSgkdXJpc1skdXJpXSkpIHsKICAgICAgICAgICAgICAgICR1cmlzWyR1cmldID0gYXJyYXlfbWVyZ2UoJHVyaXNbJHVyaV0sICRsaXN0KTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR1cmlzWyR1cmldID0gJGxpc3Q7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHVyaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGVjayBpZiBjb25kaXRpb25zIGZyb20gSWY6IGhlYWRlcnMgYXJlIG1ldAogICAgICoKICAgICAqIFRoZSBJZjogaGVhZGVyIGlzIGFuIGV4dGVuc2lvbiB0byBIVFRQLzEuMSBkZWZpbmVkIGluIFJGQzI1MTggOS40CiAgICAgKgogICAgICogQHBhcmFtIHZvaWQKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBmdW5jdGlvbiBfY2hlY2tfaWZfaGVhZGVyX2NvbmRpdGlvbnMoKQogICAgewogICAgICAgIGlmIChlbXB0eSgkX1NFUlZFUlsnSFRUUF9JRiddKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5faWZfaGVhZGVyX3VyaXMgPQogICAgICAgICAgICAkdGhpcy0+X2lmX2hlYWRlcl9wYXJzZXIoJF9TRVJWRVJbJ0hUVFBfSUYnXSk7CgogICAgICAgIC8vIGFueSBtYXRjaCBpcyBvawogICAgICAgIGZvcmVhY2ggKCR0aGlzLT5faWZfaGVhZGVyX3VyaXMgYXMgJHVyaSA9PiAkY29uZGl0aW9ucykgewoKICAgICAgICAgICAgLy8gUkZDMjUxOCA5LjQuMTogSWYgYSBtZXRob2QsIGR1ZSB0byB0aGUgcHJlc2VuY2Ugb2YgYSBEZXB0aCBvcgogICAgICAgICAgICAvLyBEZXN0aW5hdGlvbiBoZWFkZXIsIGlzIGFwcGxpZWQgdG8gbXVsdGlwbGUgcmVzb3VyY2VzIHRoZW4gdGhlCiAgICAgICAgICAgIC8vIE5vLXRhZy1saXN0IHByb2R1Y3Rpb24gTVVTVCBiZSBhcHBsaWVkIHRvIGVhY2ggcmVzb3VyY2UgdGhlCiAgICAgICAgICAgIC8vIG1ldGhvZCBpcyBhcHBsaWVkIHRvLgogICAgICAgICAgICBpZiAoZW1wdHkoJHVyaSkpIHsKICAgICAgICAgICAgICAgICR1cmkgPSAkdGhpcy0+Z2V0SHJlZigkdGhpcy0+cGF0aCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFsbCBtdXN0IG1hdGNoCiAgICAgICAgICAgIGZvcmVhY2ggKCRjb25kaXRpb25zIGFzICRjb25kaXRpb24pIHsKCiAgICAgICAgICAgICAgICAvLyBsb2NrIHRva2VucyBtYXkgYmUgZnJlZSBmb3JtIChSRkMyNTE4IDYuMykKICAgICAgICAgICAgICAgIC8vIGJ1dCBpZiBvcGFxdWVsb2NrdG9rZW5zIGFyZSB1c2VkIChSRkMyNTE4IDYuNCkKICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gY2hlY2sgdGhlIGZvcm1hdCAobGl0bXVzIHRlc3RzIHRoaXMpCiAgICAgICAgICAgICAgICBpZiAoIXN0cm5jbXAoJGNvbmRpdGlvbiwgJzxvcGFxdWVsb2NrdG9rZW46Jywgc3RybGVuKCc8b3BhcXVlbG9ja3Rva2VuJykpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFlcmVnKCdePG9wYXF1ZWxvY2t0b2tlbjpbWzp4ZGlnaXQ6XV17OH0tW1s6eGRpZ2l0Ol1dezR9LVtbOnhkaWdpdDpdXXs0fS1bWzp4ZGlnaXQ6XV17NH0tW1s6eGRpZ2l0Ol1dezEyfT4kJywgJGNvbmRpdGlvbikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT5fY2hlY2tfdXJpX2NvbmRpdGlvbigkdXJpLCAkY29uZGl0aW9uKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIENoZWNrIGEgc2luZ2xlIFVSTCBjb25kaXRpb24gcGFyc2VkIGZyb20gYW4gaWYtaGVhZGVyCiAgICAgKgogICAgICogQGFic3RyYWN0CiAgICAgKiBAcGFyYW0gc3RyaW5nIFVSTCB0byBjaGVjawogICAgICogQHBhcmFtIHN0cmluZyBjb25kaXRpb24gdG8gY2hlY2sgZm9yIHRoaXMgVVJMCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gY29uZGl0aW9uIGNoZWNrIHJlc3VsdAogICAgICovCiAgICBmdW5jdGlvbiBfY2hlY2tfdXJpX2NvbmRpdGlvbigkdXJpLCAkY29uZGl0aW9uKQogICAgewogICAgICAgIC8vIG5vdCByZWFsbHkgaW1wbGVtZW50ZWQgaGVyZSwKICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbnMgbXVzdCBvdmVycmlkZQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogRm9yIGVhY2ggbG9jayBvbiB0aGUgcmVxdWVzdGVkIHJlc291cmNlLCBjaGVjayB0aGF0IHRoZSBsb2NrIHRva2VuIGlzIGluCiAgICAgKiB0aGUgSWYgaGVhZGVyLiAgSWYgcmVxdWVzdGluZyBhIHNoYXJlZCBsb2NrLCBjaGVjayBvbmx5IGV4Y2x1c2l2ZSBsb2NrcwogICAgICogb24gdGhlIHJlcXVlc3RlZCByZXNvdXJjZS4KICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgb2YgbG9ja3MKICAgICAqIEBwYXJhbSBzdHJpbmcgcGF0aCBvZiByZXNvdXJjZSB0byBjaGVjawogICAgICogQHBhcmFtIGJvb2xlYW4gZXhjbHVzaXZlIGxvY2s/CiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiB0aGUgcmVxdWVzdCBpcyBhbGxvd2VkCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNoZWNrX2xvY2tzX2hlbHBlcigkbG9ja3MsICRwYXRoLCAkZXhjbHVzaXZlX29ubHk9ZmFsc2UpCiAgICB7CiAgICAgICAgJGNvbmRpdGlvbnMgPSBhcnJheSgpOwogICAgICAgIGlmICghZW1wdHkoJF9TRVJWRVJbJ0hUVFBfSUYnXSkpIHsKICAgICAgICAgICAgJGNvbmRpdGlvbnMgPSAkdGhpcy0+X2lmX2hlYWRlcl9wYXJzZXIoJF9TRVJWRVJbJ0hUVFBfSUYnXSk7CiAgICAgICAgfQoKICAgICAgICBmb3JlYWNoICgkbG9ja3MgYXMgJGxvY2spIHsKICAgICAgICAgICAgaWYgKCRleGNsdXNpdmVfb25seSAmJiAoJGxvY2tbJ3Njb3BlJ10gPT0gJ3NoYXJlZCcpKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZm9yIGJvdGggVGFnZ2VkLWxpc3QgYW5kIE5vLXRhZy1saXN0IHByb2R1Y3Rpb25zCiAgICAgICAgICAgIGZvcmVhY2ggKGFycmF5KCR0aGlzLT5nZXRIcmVmKCRwYXRoKSwgJycpIGFzICRocmVmKSB7CiAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRjb25kaXRpb25zWyRocmVmXSkKICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW5fYXJyYXkoIjwkbG9ja1t0b2tlbl0+IiwgJGNvbmRpdGlvbnNbJGhyZWZdKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHN0cmluZyBwYXRoIG9mIHJlc291cmNlIHRvIGNoZWNrCiAgICAgKiBAcGFyYW0gYm9vbGVhbiBleGNsdXNpdmUgbG9jaz8KICAgICAqLwogICAgZnVuY3Rpb24gY2hlY2tfbG9ja3Nfd3JhcHBlcigkcGF0aCwgJGV4Y2x1c2l2ZV9vbmx5PWZhbHNlKQogICAgewogICAgICAgIGlmICghbWV0aG9kX2V4aXN0cygkdGhpcywgJ2dldExvY2tzJykpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPmNoZWNrX2xvY2tzX2hlbHBlcigKICAgICAgICAgICAgJHRoaXMtPmdldExvY2tzKCRwYXRoKSwgJHBhdGgsICRleGNsdXNpdmVfb25seSk7CiAgICB9CgogICAgLy8gfX19CgogICAgLyoqCiAgICAgKiBPcGVuIHJlcXVlc3QgYm9keSBpbnB1dCBzdHJlYW0KICAgICAqCiAgICAgKiBCZWNhdXNlIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHdyaXRlIHRvIHBocDovL2lucHV0ICh1bmxpa2UgdGhlIHBvdGVudGlhbAogICAgICogdG8gc2V0IHJlcXVlc3QgdmFyaWFibGVzKSBhbmQgbm90IHBvc3NpYmxlIHVudGlsIFBIUCA1LjEgdG8gcmVnaXN0ZXIKICAgICAqIGFsdGVybmF0aXZlIHN0cmVhbSB3cmFwcGVycyB3aXRoIHBocDovLyBVUkxzLCB0aGlzIGZ1bmN0aW9uIGVuYWJsZXMKICAgICAqIHN1Yi1jbGFzc2VzIHRvIG92ZXJyaWRlIHRoZSByZXF1ZXN0IGJvZHkuICBHYWxsZXJ5IHVzZXMgdGhpcyBmb3IgdW5pdAogICAgICogdGVzdGluZy4gIFRoaXMgZnVuY3Rpb24gYWxzbyBjb2xsZWN0cyBhbGwgaW5zdGFuY2VzIG9mIG9wZW5pbmcgdGhlCiAgICAgKiByZXF1ZXN0IGJvZHkgaW4gb25lIHBsYWNlLgogICAgICoKICAgICAqIEByZXR1cm4gcmVzb3VyY2UgYSBmaWxlIGRlc2NyaXB0b3IKICAgICAqLwogICAgZnVuY3Rpb24gb3BlblJlcXVlc3RCb2R5KCkKICAgIHsKICAgICAgICByZXR1cm4gZm9wZW4oJ3BocDovL2lucHV0JywgJ3JiJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgSFRUUCByZXNwb25zZSBoZWFkZXIKICAgICAqCiAgICAgKiBUaGlzIGZ1bmN0aW9uIGVuYWJsZXMgc3ViLWNsYXNzZXMgdG8gb3ZlcnJpZGUgaGVhZGVyLXNldHRpbmcuICBHYWxsZXJ5CiAgICAgKiB1c2VzIHRoaXMgdG8gYXZvaWQgcmVwbGFjaW5nIGhlYWRlcnMgZWxzZXdoZXJlIGluIHRoZSBhcHBsaWNhdGlvbiwgYW5kCiAgICAgKiBmb3IgdGVzdGFiaWxpdHkuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyBzdGF0dXMgY29kZSBhbmQgbWVzc2FnZQogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldFJlc3BvbnNlSGVhZGVyKCRoZWFkZXIsICRyZXBsYWNlPXRydWUpCiAgICB7CiAgICAgICAgJGtleSA9ICdzdGF0dXMnOwogICAgICAgIGlmIChzdHJuY2FzZWNtcCgkaGVhZGVyLCAnSFRUUC8nLCA1KSAhPT0gMCkgewogICAgICAgICAgICAka2V5ID0gc3RydG9sb3dlcihzdWJzdHIoJGhlYWRlciwgMCwgc3RycG9zKCRoZWFkZXIsICc6JykpKTsKICAgICAgICB9CgogICAgICAgIGlmICgkcmVwbGFjZSB8fCBlbXB0eSgkdGhpcy0+aGVhZGVyc1ska2V5XSkpIHsKICAgICAgICAgICAgaGVhZGVyKCRoZWFkZXIpOwogICAgICAgICAgICAkdGhpcy0+aGVhZGVyc1ska2V5XSA9ICRoZWFkZXI7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogU2V0IEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGFuZCBtaXJyb3IgaXQgaW4gYSBwcml2YXRlIGhlYWRlcgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgc3RhdHVzIGNvZGUgYW5kIG1lc3NhZ2UKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBmdW5jdGlvbiBzZXRSZXNwb25zZVN0YXR1cygkc3RhdHVzLCAkcmVwbGFjZT10cnVlKQogICAgewogICAgICAgIC8vIHNpbXBsaWZpZWQgc3VjY2VzcyBjYXNlCiAgICAgICAgaWYgKCRzdGF0dXMgPT09IHRydWUpIHsKICAgICAgICAgICAgJHN0YXR1cyA9ICcyMDAgT0snOwogICAgICAgIH0KCiAgICAgICAgLy8gZGlkbid0IHNldCBhIG1vcmUgc3BlY2lmaWMgc3RhdHVzIGNvZGUKICAgICAgICBpZiAoZW1wdHkoJHN0YXR1cykpIHsKICAgICAgICAgICAgJHN0YXR1cyA9ICc1MDAgSW50ZXJuYWwgU2VydmVyIEVycm9yJzsKICAgICAgICB9CgogICAgICAgIC8vIGdlbmVyYXRlIEhUVFAgc3RhdHVzIHJlc3BvbnNlCiAgICAgICAgJHRoaXMtPnNldFJlc3BvbnNlSGVhZGVyKCJIVFRQLzEuMSAkc3RhdHVzIiwgJHJlcGxhY2UpOwogICAgICAgICR0aGlzLT5zZXRSZXNwb25zZUhlYWRlcigiWC1XZWJEQVYtU3RhdHVzOiAkc3RhdHVzIiwgJHJlcGxhY2UpOwogICAgfQoKICAgIC8qKgogICAgICogUHJpdmF0ZSBtaW5pbWFsaXN0aWMgdmVyc2lvbiBvZiBQSFAgdXJsZW5jb2RlCiAgICAgKgogICAgICogT25seSBibGFua3MgYW5kIFhNTCBzcGVjaWFsIGNoYXJzIG11c3QgYmUgZW5jb2RlZCBoZXJlLiAgRnVsbCB1cmxlbmNvZGUKICAgICAqIGVuY29kaW5nIGNvbmZ1c2VzIHNvbWUgY2xpZW50cy4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nIFVSTCB0byBlbmNvZGUKICAgICAqIEByZXR1cm4gc3RyaW5nIGVuY29kZWQgVVJMCiAgICAgKi8KICAgIGZ1bmN0aW9uIF91cmxlbmNvZGUoJHVybCkKICAgIHsKICAgICAgICByZXR1cm4gc3RydHIoJHVybCwgYXJyYXkoJyAnID0+ICclMjAnLAogICAgICAgICAgICAgICAgJyYnID0+ICclMjYnLAogICAgICAgICAgICAgICAgJzwnID0+ICclM0MnLAogICAgICAgICAgICAgICAgJz4nID0+ICclM0UnKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBQcml2YXRlIHZlcnNpb24gb2YgUEhQIHVybGRlY29kZQogICAgICoKICAgICAqIE5vdCByZWFsbHkgbmVlZGVkIGJ1dCBhZGRlZCBmb3IgY29tcGxldGVuZXMuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyBVUkwgdG8gZGVjb2RlCiAgICAgKiBAcmV0dXJuIHN0cmluZyBkZWNvZGVkIFVSTAogICAgICovCiAgICBmdW5jdGlvbiBfdXJsZGVjb2RlKCRwYXRoKQogICAgewogICAgICAgIHJldHVybiB1cmxkZWNvZGUoJHBhdGgpOwogICAgfQoKICAgIC8qKgogICAgICogVVRGLTggZW5jb2RlIHByb3BlcnR5IHZhbHVlcyBpZiBub3QgYWxyZWFkeSBkb25lIHNvCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyB0ZXh0IHRvIGVuY29kZQogICAgICogQHJldHVybiBzdHJpbmcgVVRGLTggZW5jb2RlZCB0ZXh0CiAgICAgKi8KICAgIGZ1bmN0aW9uIF9wcm9wX2VuY29kZSgkdGV4dCkKICAgIHsKICAgICAgICBzd2l0Y2ggKHN0cnRvbG93ZXIoJHRoaXMtPl9wcm9wX2VuY29kaW5nKSkgewogICAgICAgIGNhc2UgJ3V0Zi04JzoKICAgICAgICAgICAgcmV0dXJuICR0ZXh0OwogICAgICAgIGNhc2UgJ2lzby04ODU5LTEnOgogICAgICAgIGNhc2UgJ2lzby04ODU5LTE1JzoKICAgICAgICBjYXNlICdsYXRpbi0xJzoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gdXRmOF9lbmNvZGUoJHRleHQpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIE1ha2Ugc3VyZSBwYXRoIGVuZHMgaW4gYSBzbGFzaAogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgZGlyZWN0b3J5IHBhdGgKICAgICAqIEByZXR1cm4gc3RyaW5nIGRpcmVjdG9yeSBwYXRoIHdpdGggdHJhaWxpbmcgc2xhc2gKICAgICAqLwogICAgZnVuY3Rpb24gX3NsYXNoaWZ5KCRwYXRoKQogICAgewogICAgICAgIGlmIChzdWJzdHIoJHBhdGgsIC0xKSAhPSAnLycpIHsKICAgICAgICAgICAgJHBhdGggLj0gJy8nOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRwYXRoOwogICAgfQp9CgovLyBMb2NhbCB2YXJpYWJsZXM6Ci8vIHRhYi13aWR0aDogNAovLyBjLWJhc2ljLW9mZnNldDogNAovLyBFbmQ6Cj8+Cg==');
expand_6421a0d81d($outputDir, 'lib/HTTP/WebDAV/Tools/_parse_lockinfo.php', 'PD9waHAKLy8KLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vIHwgUEhQIFZlcnNpb24gNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAovLyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gfCBDb3B5cmlnaHQgKGMpIDE5OTctMjAwMyBUaGUgUEhQIEdyb3VwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci8vICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLyB8IFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB2ZXJzaW9uIDIuMDIgb2YgdGhlIFBIUCBsaWNlbnNlLCAgICAgIHwKLy8gfCB0aGF0IGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2UgaW4gdGhlIGZpbGUgTElDRU5TRSwgYW5kIGlzICAgICAgICB8Ci8vIHwgYXZhaWxhYmxlIGF0IHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfAovLyB8IGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzJfMDIudHh0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZiB0aGUgUEhQIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG8gICB8Ci8vIHwgb2J0YWluIGl0IHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViLCBwbGVhc2Ugc2VuZCBhIG5vdGUgdG8gICAgICAgICAgfAovLyB8IGxpY2Vuc2VAcGhwLm5ldCBzbyB3ZSBjYW4gbWFpbCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LiAgICAgICAgICAgICAgIHwKLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vIHwgQXV0aG9yczogSGFydG11dCBIb2x6Z3JhZWZlIDxoaG9semdyYUBwaHAubmV0PiAgICAgICAgICAgICAgICAgICAgICAgfAovLyB8ICAgICAgICAgIENocmlzdGlhbiBTdG9ja2VyIDxjaHJlZ3VAYml0Zmx1eC5jaD4gICAgICAgICAgICAgICAgICAgICAgIHwKLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vCi8vICRJZDogX3BhcnNlX2xvY2tpbmZvLnBocCAxNTM0MiAyMDA2LTEyLTAxIDIxOjE0OjQ2WiBhbmR5X3N0ICQKCi8qKgogKiBIZWxwZXIgY2xhc3MgZm9yIHBhcnNpbmcgTE9DSyByZXF1ZXN0IGJvZGllcwogKgogKiBAcGFja2FnZSBIVFRQX1dlYkRBVl9TZXJ2ZXIKICogQGF1dGhvciBIYXJ0bXV0IEhvbHpncmFlZmUgPGhob2x6Z3JhQHBocC5uZXQ+CiAqIEB2ZXJzaW9uIDAuOTkuMWRldgogKi8KY2xhc3MgX3BhcnNlX2xvY2tpbmZvCnsKICAgIC8qKgogICAgICogU3VjY2VzcyBzdGF0ZSBmbGFnCiAgICAgKgogICAgICogQHZhciBib29sZWFuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICovCiAgICB2YXIgJHN1Y2Nlc3MgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIExvY2sgdHlwZSwgY3VycmVudGx5IG9ubHkgd3JpdGUKICAgICAqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqLwogICAgdmFyICRsb2NrdHlwZSA9ICcnOwoKICAgIC8qKgogICAgICogTG9jayBzY29wZSwgc2hhcmVkIG9yIGV4Y2x1c2l2ZQogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICovCiAgICB2YXIgJGxvY2tzY29wZSA9ICcnOwoKICAgIC8qKgogICAgICogTG9jayBvd25lciBpbmZvcm1hdGlvbgogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICovCiAgICB2YXIgJG93bmVyID0gJyc7CgogICAgLyoqCiAgICAgKiBGbGFnIHRoYXQgaXMgc2V0IGR1cmluZyBsb2NrIG93bmVyIHJlYWQKICAgICAqCiAgICAgKiBAdmFyIGJvb2xlYW4KICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICB2YXIgJGNvbGxlY3Rfb3duZXIgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIENvbnN0cnVjdG9yCiAgICAgKgogICAgICogQHBhcmFtIHJlc291cmNlIGlucHV0IHN0cmVhbSBmaWxlIGRlc2NyaXB0b3IKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9wYXJzZV9sb2NraW5mbygkaGFuZGxlKQogICAgewogICAgICAgIC8vIG9wZW4gaW5wdXQgc3RyZWFtCiAgICAgICAgaWYgKCEkaGFuZGxlKSB7CiAgICAgICAgICAgICR0aGlzLT5zdWNjZXNzID0gZmFsc2U7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIHN1Y2Nlc3Mgc3RhdGUgZmxhZwogICAgICAgICR0aGlzLT5zdWNjZXNzID0gdHJ1ZTsKCiAgICAgICAgLy8gcmVtZW1iZXIgaWYgYW55IGlucHV0IHdhcyBwYXJzZWQKICAgICAgICAkaGFkX2lucHV0ID0gZmFsc2U7CgogICAgICAgIC8vIGNyZWF0ZSBuYW1lc3BhY2UgYXdhcmUgWE1MIHBhcnNlcgogICAgICAgICRwYXJzZXIgPSB4bWxfcGFyc2VyX2NyZWF0ZV9ucygnVVRGLTgnLCAnICcpOwoKICAgICAgICAvLyBzZXQgdGFnICYgZGF0YSBoYW5kbGVycwogICAgICAgIHhtbF9zZXRfZWxlbWVudF9oYW5kbGVyKCRwYXJzZXIsIGFycmF5KCYkdGhpcywgJ19zdGFydEVsZW1lbnQnKSwKICAgICAgICAgICAgYXJyYXkoJiR0aGlzLCAiX2VuZEVsZW1lbnQiKSk7CgogICAgICAgIHhtbF9zZXRfY2hhcmFjdGVyX2RhdGFfaGFuZGxlcigkcGFyc2VyLCBhcnJheSgmJHRoaXMsICdfZGF0YScpKTsKCiAgICAgICAgLy8gd2Ugd2FudCBhIGNhc2Ugc2Vuc2l0aXZlIHBhcnNlcgogICAgICAgIHhtbF9wYXJzZXJfc2V0X29wdGlvbigkcGFyc2VyLCBYTUxfT1BUSU9OX0NBU0VfRk9MRElORywgZmFsc2UpOwoKICAgICAgICAvLyBwYXJzZSBpbnB1dAogICAgICAgIHdoaWxlICgkdGhpcy0+c3VjY2VzcyAmJiAhZmVvZigkaGFuZGxlKSkgewogICAgICAgICAgICAkbGluZSA9IGZnZXRzKCRoYW5kbGUpOwogICAgICAgICAgICBpZiAoaXNfc3RyaW5nKCRsaW5lKSkgewogICAgICAgICAgICAgICAgJGhhZF9pbnB1dCA9IHRydWU7CiAgICAgICAgICAgICAgICAkdGhpcy0+c3VjY2VzcyAmPSB4bWxfcGFyc2UoJHBhcnNlciwgJGxpbmUsIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gZmluaXNoIHBhcnNpbmcKICAgICAgICBpZiAoJGhhZF9pbnB1dCkgewogICAgICAgICAgICAkdGhpcy0+c3VjY2VzcyAmPSB4bWxfcGFyc2UoJHBhcnNlciwgJycsIHRydWUpOwogICAgICAgIH0KCiAgICAgICAgLy8gY2hlY2sgaWYgcmVxdWlyZWQgdGFncyB3aGVyZSBmb3VuZAogICAgICAgICR0aGlzLT5zdWNjZXNzICY9ICFlbXB0eSgkdGhpcy0+bG9ja3R5cGUpOwogICAgICAgICR0aGlzLT5zdWNjZXNzICY9ICFlbXB0eSgkdGhpcy0+bG9ja3Njb3BlKTsKCiAgICAgICAgLy8gZnJlZSBwYXJzZXIgcmVzb3VyY2UKICAgICAgICB4bWxfcGFyc2VyX2ZyZWUoJHBhcnNlcik7CgogICAgICAgIC8vIGNsb3NlIGlucHV0IHN0cmVhbQogICAgICAgIGZjbG9zZSgkaGFuZGxlKTsKICAgIH0KCiAgICAvKioKICAgICAqIFN0YXJ0IHRhZyBoYW5kbGVyCiAgICAgKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKiBAcGFyYW0gcmVzb3VyY2UgcGFyc2VyCiAgICAgKiBAcGFyYW0gc3RyaW5nIHRhZyBuYW1lCiAgICAgKiBAcGFyYW0gYXJyYXkgdGFnIGF0dHJpYnV0ZXMKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBmdW5jdGlvbiBfc3RhcnRFbGVtZW50KCRwYXJzZXIsICRuYW1lLCAkYXR0cnMpCiAgICB7CiAgICAgICAgLy8gbmFtZXNwYWNlIGhhbmRsaW5nCiAgICAgICAgaWYgKHN0cnN0cigkbmFtZSwgJyAnKSkgewogICAgICAgICAgICBsaXN0ICgkbnMsICRuYW1lKSA9IGV4cGxvZGUoJyAnLCAkbmFtZSk7CiAgICAgICAgICAgIGlmIChlbXB0eSgkbnMpKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+c3VjY2VzcyA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBldmVyeXRoaW5nIHdpdGhpbiB0aGUgPG93bmVyPiB0YWcgbmVlZHMgdG8gYmUgY29sbGVjdGVkCiAgICAgICAgaWYgKCR0aGlzLT5jb2xsZWN0X293bmVyKSB7CiAgICAgICAgICAgICRuc19zaG9ydCA9ICcnOwogICAgICAgICAgICAkbnNfYXR0ciA9ICcnOwogICAgICAgICAgICBpZiAoJG5zKSB7CiAgICAgICAgICAgICAgICBpZiAoJG5zID09ICdEQVY6JykgewogICAgICAgICAgICAgICAgICAgICRuc19zaG9ydCA9ICdEOic7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRuc19hdHRyID0gJyB4bWxucz0iJyAuICRucyAuICciJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkdGhpcy0+b3duZXIgLj0gIjwkbnNfc2hvcnQkbmFtZSRuc19hdHRyPiI7CiAgICAgICAgfSBlbHNlIGlmICgkbnMgPT0gJ0RBVjonKSB7CiAgICAgICAgICAgIC8vIHBhcnNlIG9ubHkgdGhlIGVzc2VudGlhbCB0YWdzCiAgICAgICAgICAgIHN3aXRjaCAoJG5hbWUpIHsKICAgICAgICAgICAgY2FzZSAnd3JpdGUnOgogICAgICAgICAgICAgICAgJHRoaXMtPmxvY2t0eXBlID0gJG5hbWU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnZXhjbHVzaXZlJzoKICAgICAgICAgICAgY2FzZSAnc2hhcmVkJzoKICAgICAgICAgICAgICAgICR0aGlzLT5sb2Nrc2NvcGUgPSAkbmFtZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdvd25lcic6CiAgICAgICAgICAgICAgICAkdGhpcy0+Y29sbGVjdF9vd25lciA9IHRydWU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEVuZCB0YWcgaGFuZGxlcgogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICogQHBhcmFtIHJlc291cmNlIHBhcnNlcgogICAgICogQHBhcmFtIHN0cmluZyB0YWcgbmFtZQogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9lbmRFbGVtZW50KCRwYXJzZXIsICRuYW1lKQogICAgewogICAgICAgIC8vIG5hbWVzcGFjZSBoYW5kbGluZwogICAgICAgIGlmIChzdHJzdHIoJG5hbWUsICcgJykpIHsKICAgICAgICAgICAgbGlzdCAoJG5zLCAkbmFtZSkgPSBleHBsb2RlKCcgJywgJG5hbWUpOwoJfSBlbHNlIHsKCSAgICAkbnMgPSAnJzsKCX0KCiAgICAgICAgLy8gPG93bmVyPiBmaW5pc2hlZD8KICAgICAgICBpZiAoJG5zID09ICdEQVY6JyAmJiAkbmFtZSA9PSAnb3duZXInKSB7CiAgICAgICAgICAgICR0aGlzLT5jb2xsZWN0X293bmVyID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvLyB3aXRoaW4gPG93bmVyPiB3ZSBoYXZlIHRvIGNvbGxlY3QgZXZlcnl0aGluZwogICAgICAgIGlmICgkdGhpcy0+Y29sbGVjdF9vd25lcikgewogICAgICAgICAgICAkbnNfc2hvcnQgPSAnJzsKICAgICAgICAgICAgJG5zX2F0dHIgPSAnJzsKICAgICAgICAgICAgaWYgKCRucykgewogICAgICAgICAgICAgICAgaWYgKCRucyA9PSAnREFWOicpIHsKICAgICAgICAgICAgICAgICAgICAkbnNfc2hvcnQgPSAnRDonOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkbnNfYXR0ciA9ICcgeG1sbnM9IicgLiAkbnMgLiAnIic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRoaXMtPm93bmVyIC49ICI8LyRuc19zaG9ydCRuYW1lJG5zX2F0dHI+IjsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGFyYWN0ZXIgZGF0YSBoYW5kbGVyCiAgICAgKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKiBAcGFyYW0gcmVzb3VyY2UgcGFyc2VyCiAgICAgKiBAcGFyYW0gc3RyaW5nIGRhdGEKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBmdW5jdGlvbiBfZGF0YSgkcGFyc2VyLCAkZGF0YSkKICAgIHsKICAgICAgICAvLyBvbmx5IHRoZSA8b3duZXI+IHRhZyBoYXMgZGF0YSBjb250ZW50CiAgICAgICAgaWYgKCR0aGlzLT5jb2xsZWN0X293bmVyKSB7CiAgICAgICAgICAgICR0aGlzLT5vd25lciAuPSAkZGF0YTsKICAgICAgICB9CiAgICB9Cn0KPz4K');
expand_6421a0d81d($outputDir, 'lib/HTTP/WebDAV/Tools/_parse_propfind.php', 'PD9waHAKLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vIHwgUEhQIFZlcnNpb24gNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAovLyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gfCBDb3B5cmlnaHQgKGMpIDE5OTctMjAwMyBUaGUgUEhQIEdyb3VwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci8vICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLyB8IFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB2ZXJzaW9uIDIuMDIgb2YgdGhlIFBIUCBsaWNlbnNlLCAgICAgIHwKLy8gfCB0aGF0IGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2UgaW4gdGhlIGZpbGUgTElDRU5TRSwgYW5kIGlzICAgICAgICB8Ci8vIHwgYXZhaWxhYmxlIGF0IHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfAovLyB8IGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzJfMDIudHh0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZiB0aGUgUEhQIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG8gICB8Ci8vIHwgb2J0YWluIGl0IHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViLCBwbGVhc2Ugc2VuZCBhIG5vdGUgdG8gICAgICAgICAgfAovLyB8IGxpY2Vuc2VAcGhwLm5ldCBzbyB3ZSBjYW4gbWFpbCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LiAgICAgICAgICAgICAgIHwKLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vIHwgQXV0aG9yczogSGFydG11dCBIb2x6Z3JhZWZlIDxoaG9semdyYUBwaHAubmV0PiAgICAgICAgICAgICAgICAgICAgICAgfAovLyB8ICAgICAgICAgIENocmlzdGlhbiBTdG9ja2VyIDxjaHJlZ3VAYml0Zmx1eC5jaD4gICAgICAgICAgICAgICAgICAgICAgIHwKLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vCi8vICRJZDogX3BhcnNlX3Byb3BmaW5kLnBocCAxNTM0MiAyMDA2LTEyLTAxIDIxOjE0OjQ2WiBhbmR5X3N0ICQKCi8qKgogKiBIZWxwZXIgY2xhc3MgZm9yIHBhcnNpbmcgUFJPUEZJTkQgcmVxdWVzdCBib2RpZXMKICoKICogQHBhY2thZ2UgSFRUUF9XZWJEQVZfU2VydmVyCiAqIEBhdXRob3IgSGFydG11dCBIb2x6Z3JhZWZlIDxoaG9semdyYUBwaHAubmV0PgogKiBAdmVyc2lvbiAwLjk5LjFkZXYKICovCmNsYXNzIF9wYXJzZV9wcm9wZmluZAp7CiAgICAvKioKICAgICAqIFN1Y2Nlc3Mgc3RhdGUgZmxhZwogICAgICoKICAgICAqIEB2YXIgYm9vbGVhbgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqLwogICAgdmFyICRzdWNjZXNzID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBGb3VuZCBwcm9wZXJ0aWVzIGFyZSBjb2xsZWN0ZWQgaGVyZQogICAgICoKICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKi8KICAgIHZhciAkcHJvcHMgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogSW50ZXJuYWwgdGFnIG5lc3RpbmcgZGVwdGggY291bnRlcgogICAgICoKICAgICAqIEB2YXIgaW50CiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgdmFyICRkZXB0aCA9IDA7CgogICAgLyoqCiAgICAgKiBDb25zdHJ1Y3RvcgogICAgICoKICAgICAqIEBwYXJhbSByZXNvdXJjZSBpbnB1dCBzdHJlYW0gZmlsZSBkZXNjcmlwdG9yCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICovCiAgICBmdW5jdGlvbiBfcGFyc2VfcHJvcGZpbmQoJGhhbmRsZSkKICAgIHsKICAgICAgICAvLyBvcGVuIGlucHV0IHN0cmVhbQogICAgICAgIGlmICghJGhhbmRsZSkgewogICAgICAgICAgICAkdGhpcy0+c3VjY2VzcyA9IGZhbHNlOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBzdWNjZXNzIHN0YXRlIGZsYWcKICAgICAgICAkdGhpcy0+c3VjY2VzcyA9IHRydWU7CgogICAgICAgIC8vIHJlbWVtYmVyIGlmIGFueSBpbnB1dCB3YXMgcGFyc2VkCiAgICAgICAgJGhhZF9pbnB1dCA9IGZhbHNlOwoKICAgICAgICAvLyBjcmVhdGUgbmFtZXNwYWNlIGF3YXJlIFhNTCBwYXJzZXIKICAgICAgICAkcGFyc2VyID0geG1sX3BhcnNlcl9jcmVhdGVfbnMoJ1VURi04JywgJyAnKTsKCiAgICAgICAgLy8gc2V0IHRhZyAmIGRhdGEgaGFuZGxlcnMKICAgICAgICB4bWxfc2V0X2VsZW1lbnRfaGFuZGxlcigkcGFyc2VyLCBhcnJheSgmJHRoaXMsICdfc3RhcnRFbGVtZW50JyksCiAgICAgICAgICAgIGFycmF5KCYkdGhpcywgJ19lbmRFbGVtZW50JykpOwoKICAgICAgICAvLyB3ZSB3YW50IGEgY2FzZSBzZW5zaXRpdmUgcGFyc2VyCiAgICAgICAgeG1sX3BhcnNlcl9zZXRfb3B0aW9uKCRwYXJzZXIsIFhNTF9PUFRJT05fQ0FTRV9GT0xESU5HLCBmYWxzZSk7CgogICAgICAgIC8vIHBhcnNlIGlucHV0CiAgICAgICAgd2hpbGUgKCR0aGlzLT5zdWNjZXNzICYmICFmZW9mKCRoYW5kbGUpKSB7CiAgICAgICAgICAgICRsaW5lID0gZmdldHMoJGhhbmRsZSk7CiAgICAgICAgICAgIGlmIChpc19zdHJpbmcoJGxpbmUpKSB7CiAgICAgICAgICAgICAgICAkaGFkX2lucHV0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICR0aGlzLT5zdWNjZXNzICY9IHhtbF9wYXJzZSgkcGFyc2VyLCAkbGluZSwgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBmaW5pc2ggcGFyc2luZwogICAgICAgIGlmICgkaGFkX2lucHV0KSB7CiAgICAgICAgICAgICR0aGlzLT5zdWNjZXNzICY9IHhtbF9wYXJzZSgkcGFyc2VyLCAnJywgdHJ1ZSk7CiAgICAgICAgfQoKICAgICAgICAvLyBmcmVlIHBhcnNlciByZXNvdXJjZQogICAgICAgIHhtbF9wYXJzZXJfZnJlZSgkcGFyc2VyKTsKCiAgICAgICAgLy8gY2xvc2UgaW5wdXQgc3RyZWFtCiAgICAgICAgZmNsb3NlKCRoYW5kbGUpOwoKICAgICAgICAvLyBpZiBubyBpbnB1dCB3YXMgcGFyc2VkIGl0IHdhcyBhIHJlcXVlc3QKICAgICAgICBpZiAoZW1wdHkoJHRoaXMtPnByb3BzKSkgewogICAgICAgICAgICAkdGhpcy0+cHJvcHMgPSAnYWxscHJvcCc7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogU3RhcnQgdGFnIGhhbmRsZXIKICAgICAqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqIEBwYXJhbSByZXNvdXJjZSBwYXJzZXIKICAgICAqIEBwYXJhbSBzdHJpbmcgdGFnIG5hbWUKICAgICAqIEBwYXJhbSBhcnJheSB0YWcgYXR0cmlidXRlcwogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9zdGFydEVsZW1lbnQoJHBhcnNlciwgJG5hbWUsICRhdHRycykKICAgIHsKICAgICAgICAvLyBuYW1lIHNwYWNlIGhhbmRsaW5nCiAgICAgICAgaWYgKHN0cnN0cigkbmFtZSwgJyAnKSkgewogICAgICAgICAgICBsaXN0ICgkbnMsICRuYW1lKSA9IGV4cGxvZGUoJyAnLCAkbmFtZSk7CiAgICAgICAgICAgIGlmIChlbXB0eSgkbnMpKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+c3VjY2VzcyA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBzcGVjaWFsIHRhZ3MgYXQgbGV2ZWwgMTogPGFsbHByb3A+ICYgPHByb3BuYW1lPgogICAgICAgIGlmICgkdGhpcy0+ZGVwdGggPT0gMSkgewogICAgICAgICAgICBpZiAoJG5hbWUgPT0gJ2FsbHByb3AnIHx8ICRuYW1lID09ICdwcm9wbmFtZScpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5wcm9wcyA9ICRuYW1lOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyByZXF1ZXN0ZWQgcHJvcGVydGllcyBhcmUgZm91bmQgYXQgbGV2ZWwgMgogICAgICAgIGlmICgkdGhpcy0+ZGVwdGggPT0gMikgewogICAgICAgICAgICAkcHJvcCA9IGFycmF5KCduYW1lJyA9PiAkbmFtZSk7CiAgICAgICAgICAgIGlmICgkbnMpIHsKICAgICAgICAgICAgICAgICRwcm9wWyducyddID0gJG5zOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aGlzLT5wcm9wc1tdID0gJHByb3A7CiAgICAgICAgfQoKICAgICAgICAvLyBpbmNyZW1lbnQgZGVwdGggY291bnQKICAgICAgICAkdGhpcy0+ZGVwdGgrKzsKICAgIH0KCiAgICAvKioKICAgICAqIEVuZCB0YWcgaGFuZGxlcgogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICogQHBhcmFtIHJlc291cmNlIHBhcnNlcgogICAgICogQHBhcmFtIHN0cmluZyB0YWcgbmFtZQogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9lbmRFbGVtZW50KCRwYXJzZXIsICRuYW1lKQogICAgewogICAgICAgIC8vIGhlcmUgd2Ugb25seSBuZWVkIHRvIGRlY3JlbWVudCB0aGUgZGVwdGggY291bnQKICAgICAgICAkdGhpcy0+ZGVwdGgtLTsKICAgIH0KfQo/Pgo=');
expand_6421a0d81d($outputDir, 'lib/HTTP/WebDAV/Tools/_parse_proppatch.php', 'PD9waHAKLy8KLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vIHwgUEhQIFZlcnNpb24gNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAovLyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gfCBDb3B5cmlnaHQgKGMpIDE5OTctMjAwMyBUaGUgUEhQIEdyb3VwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci8vICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLyB8IFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB2ZXJzaW9uIDIuMDIgb2YgdGhlIFBIUCBsaWNlbnNlLCAgICAgIHwKLy8gfCB0aGF0IGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2UgaW4gdGhlIGZpbGUgTElDRU5TRSwgYW5kIGlzICAgICAgICB8Ci8vIHwgYXZhaWxhYmxlIGF0IHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfAovLyB8IGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzJfMDIudHh0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZiB0aGUgUEhQIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG8gICB8Ci8vIHwgb2J0YWluIGl0IHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViLCBwbGVhc2Ugc2VuZCBhIG5vdGUgdG8gICAgICAgICAgfAovLyB8IGxpY2Vuc2VAcGhwLm5ldCBzbyB3ZSBjYW4gbWFpbCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LiAgICAgICAgICAgICAgIHwKLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vIHwgQXV0aG9yczogSGFydG11dCBIb2x6Z3JhZWZlIDxoaG9semdyYUBwaHAubmV0PiAgICAgICAgICAgICAgICAgICAgICAgfAovLyB8ICAgICAgICAgIENocmlzdGlhbiBTdG9ja2VyIDxjaHJlZ3VAYml0Zmx1eC5jaD4gICAgICAgICAgICAgICAgICAgICAgIHwKLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vCi8vICRJZDogX3BhcnNlX3Byb3BwYXRjaC5waHAgMTUzNDIgMjAwNi0xMi0wMSAyMToxNDo0NlogYW5keV9zdCAkCgovKioKICogSGVscGVyIGNsYXNzIGZvciBwYXJzaW5nIFBST1BQQVRDSCByZXF1ZXN0IGJvZGllcwogKiAKICogQHBhY2thZ2UgSFRUUF9XZWJEQVZfU2VydmVyCiAqIEBhdXRob3IgSGFydG11dCBIb2x6Z3JhZWZlIDxoaG9semdyYUBwaHAubmV0PgogKiBAdmVyc2lvbiAwLjk5LjFkZXYKICovCmNsYXNzIF9wYXJzZV9wcm9wcGF0Y2ggCnsKICAgIC8qKgogICAgICogU3VjY2VzcyBzdGF0ZSBmbGFnCiAgICAgKiAKICAgICAqIEB2YXIgYm9vbGVhbgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqLwogICAgdmFyICRzdWNjZXNzID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBGb3VuZCBwcm9wZXJ0aWVzIGFyZSBjb2xsZWN0ZWQgaGVyZQogICAgICogCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICovCiAgICB2YXIgJHByb3BzID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIEludGVybmFsIHRhZyBuZXN0aW5nIGRlcHRoIGNvdW50ZXIKICAgICAqIAogICAgICogQHZhciBpbnQKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICB2YXIgJGRlcHRoID0gMDsKCiAgICAvKioKICAgICAqCiAgICAgKiAKICAgICAqIEB2YXIKICAgICAqIEBhY2Nlc3MKICAgICAqLwogICAgdmFyICRtb2RlOwoKICAgIC8qKgogICAgICoKICAgICAqIAogICAgICogQHZhcgogICAgICogQGFjY2VzcwogICAgICovCiAgICB2YXIgJGN1cnJlbnQ7CgogICAgLyoqCiAgICAgKiBDb25zdHJ1Y3RvcgogICAgICogCiAgICAgKiBAcGFyYW0gcmVzb3VyY2UgaW5wdXQgc3RyZWFtIGZpbGUgZGVzY3JpcHRvcgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqLwogICAgZnVuY3Rpb24gX3BhcnNlX3Byb3BwYXRjaCgkaGFuZGxlKSAKICAgIHsKICAgICAgICAvLyBvcGVuIGlucHV0IHN0cmVhbQogICAgICAgIGlmICghJGhhbmRsZSkgewogICAgICAgICAgICAkdGhpcy0+c3VjY2VzcyA9IGZhbHNlOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBzdWNjZXNzIHN0YXRlIGZsYWcKICAgICAgICAkdGhpcy0+c3VjY2VzcyA9IHRydWU7CgogICAgICAgIC8vIHJlbWVtYmVyIGlmIGFueSBpbnB1dCB3YXMgcGFyc2VkCiAgICAgICAgJGhhZF9pbnB1dCA9IGZhbHNlOwoKICAgICAgICAvLyBjcmVhdGUgbmFtZXNwYWNlIGF3YXJlIFhNTCBwYXJzZXIKICAgICAgICAkcGFyc2VyID0geG1sX3BhcnNlcl9jcmVhdGVfbnMoJ1VURi04JywgJyAnKTsKCiAgICAgICAgLy8gc2V0IHRhZyAmIGRhdGEgaGFuZGxlcnMKICAgICAgICB4bWxfc2V0X2VsZW1lbnRfaGFuZGxlcigkcGFyc2VyLCBhcnJheSgmJHRoaXMsICdfc3RhcnRFbGVtZW50JyksCiAgICAgICAgICAgIGFycmF5KCYkdGhpcywgJ19lbmRFbGVtZW50JykpOwoKICAgICAgICB4bWxfc2V0X2NoYXJhY3Rlcl9kYXRhX2hhbmRsZXIoJHBhcnNlciwgYXJyYXkoJiR0aGlzLCAnX2RhdGEnKSk7CgogICAgICAgIC8vIHdlIHdhbnQgYSBjYXNlIHNlbnNpdGl2ZSBwYXJzZXIKICAgICAgICB4bWxfcGFyc2VyX3NldF9vcHRpb24oJHBhcnNlciwgWE1MX09QVElPTl9DQVNFX0ZPTERJTkcsIGZhbHNlKTsKCiAgICAgICAgLy8gcGFyc2UgaW5wdXQKICAgICAgICB3aGlsZSAoJHRoaXMtPnN1Y2Nlc3MgJiYgIWZlb2YoJGhhbmRsZSkpIHsKICAgICAgICAgICAgJGxpbmUgPSBmZ2V0cygkaGFuZGxlKTsKICAgICAgICAgICAgaWYgKGlzX3N0cmluZygkbGluZSkpIHsKICAgICAgICAgICAgICAgICRoYWRfaW5wdXQgPSB0cnVlOwogICAgICAgICAgICAgICAgJHRoaXMtPnN1Y2Nlc3MgJj0geG1sX3BhcnNlKCRwYXJzZXIsICRsaW5lLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IAogICAgICAgIAogICAgICAgIC8vIGZpbmlzaCBwYXJzaW5nCiAgICAgICAgaWYgKCRoYWRfaW5wdXQpIHsKICAgICAgICAgICAgJHRoaXMtPnN1Y2Nlc3MgJj0geG1sX3BhcnNlKCRwYXJzZXIsICcnLCB0cnVlKTsKICAgICAgICB9CgogICAgICAgIC8vIGZyZWUgcGFyc2VyIHJlc291cmNlCiAgICAgICAgeG1sX3BhcnNlcl9mcmVlKCRwYXJzZXIpOwoKICAgICAgICAvLyBjbG9zZSBpbnB1dCBzdHJlYW0KICAgICAgICBmY2xvc2UoJGhhbmRsZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBTdGFydCB0YWcgaGFuZGxlcgogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICogQHBhcmFtIHJlc291cmNlIHBhcnNlcgogICAgICogQHBhcmFtIHN0cmluZyB0YWcgbmFtZQogICAgICogQHBhcmFtIGFycmF5IHRhZyBhdHRyaWJ1dGVzCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgZnVuY3Rpb24gX3N0YXJ0RWxlbWVudCgkcGFyc2VyLCAkbmFtZSwgJGF0dHJzKSAKICAgIHsKICAgICAgICAvLyBuYW1lIHNwYWNlIGhhbm5kbGluZwogICAgICAgIGlmIChzdHJzdHIoJG5hbWUsICcgJykpIHsKICAgICAgICAgICAgbGlzdCAoJG5zLCAkbmFtZSkgPSBleHBsb2RlKCcgJywgJG5hbWUpOwogICAgICAgICAgICBpZiAoZW1wdHkoJG5zKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPnN1Y2Nlc3MgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5kZXB0aCA9PSAxKSB7CiAgICAgICAgICAgICR0aGlzLT5tb2RlID0gJG5hbWU7CiAgICAgICAgfSAKCiAgICAgICAgaWYgKCR0aGlzLT5kZXB0aCA9PSAzKSB7CiAgICAgICAgICAgICRwcm9wID0gYXJyYXkoJ25hbWUnID0+ICRuYW1lKTsKICAgICAgICAgICAgJHRoaXMtPmN1cnJlbnQgPSBhcnJheSgnbmFtZScgPT4gJG5hbWUsCiAgICAgICAgICAgICAgICAnbnMnID0+ICRucywKICAgICAgICAgICAgICAgICdzdGF0dXMnID0+ICcyMDAgT0snKTsKICAgICAgICAgICAgaWYgKCR0aGlzLT5tb2RlID09ICdzZXQnKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+Y3VycmVudFsndmFsdWUnXSA9ICcnOyAvLyBzZXQgZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPmRlcHRoID49IDQpIHsKICAgICAgICAgICAgJHRoaXMtPmN1cnJlbnRbJ3ZhbHVlJ10gLj0gIjwkbmFtZSI7CiAgICAgICAgICAgIGZvcmVhY2ggKCRhdHRyIGFzICRrZXkgPT4gJHZhbHVlKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+Y3VycmVudFsndmFsdWUnXSAuPSAnICcgLiAka2V5IC4gJz0iJwogICAgICAgICAgICAgICAgICAgIC4gc3RyX3JlcGxhY2UoJyInLCAnJnF1b3Q7JywgJHZhbHVlKSAuICciJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkdGhpcy0+Y3VycmVudFsndmFsdWUnXSAuPSAnPic7CiAgICAgICAgfQoKICAgICAgICAvLyBpbmNyZW1lbm50IGRlcHRoIGNvdW50CiAgICAgICAgJHRoaXMtPmRlcHRoKys7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbmQgdGFnIGhhbmRsZXIKICAgICAqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqIEBwYXJhbSByZXNvdXJjZSBwYXJzZXIKICAgICAqIEBwYXJhbSBzdHJpbmcgdGFnIG5hbWUKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBmdW5jdGlvbiBfZW5kRWxlbWVudCgkcGFyc2VyLCAkbmFtZSkgCiAgICB7CiAgICAgICAgaWYgKHN0cnN0cigkbmFtZSwgJyAnKSkgewogICAgICAgICAgICBsaXN0KCRucywgJG5hbWUpID0gZXhwbG9kZSgnICcsICRuYW1lKTsKICAgICAgICAgICAgaWYgKGVtcHR5KCRucykpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5zdWNjZXNzID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIGRlY3JlbWVudCB0aGUgZGVwdGggY291bnQKICAgICAgICAkdGhpcy0+ZGVwdGgtLTsKCiAgICAgICAgaWYgKCR0aGlzLT5kZXB0aCA+PSA0KSB7CiAgICAgICAgICAgICR0aGlzLT5jdXJyZW50Wyd2YWx1ZSddIC49ICI8LyRuYW1lPiI7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPmRlcHRoID09IDMpIHsKICAgICAgICAgICAgaWYgKGlzc2V0KCR0aGlzLT5jdXJyZW50KSkgewogICAgICAgICAgICAgICAgJHRoaXMtPnByb3BzW10gPSAkdGhpcy0+Y3VycmVudDsKICAgICAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5jdXJyZW50KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIENoYXJhY3RlciBkYXRhIGhhbmRsZXIKICAgICAqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqIEBwYXJhbSByZXNvdXJjZSBwYXJzZXIKICAgICAqIEBwYXJhbSBzdHJpbmcgZGF0YQogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9kYXRhKCRwYXJzZXIsICRkYXRhKSB7CiAgICAgICAgaWYgKGlzc2V0KCR0aGlzLT5jdXJyZW50KSkgewogICAgICAgICAgICAkdGhpcy0+Y3VycmVudFsndmFsdWUnXSAuPSAkZGF0YTsKICAgICAgICB9CiAgICB9Cn0KPz4K');
expand_6421a0d81d($outputDir, 'module.inc', 'PD9waHAKLyoKICogR2FsbGVyeSAtIGEgd2ViIGJhc2VkIHBob3RvIGFsYnVtIHZpZXdlciBhbmQgZWRpdG9yCiAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA3IEJoYXJhdCBNZWRpcmF0dGEKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CiAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAogKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KICovCgovKioKICogV2ViREFWIE1vZHVsZS4gIE1vdW50IEdhbGxlcnkgb24geW91ciBkZXNrdG9wLgogKiBAcGFja2FnZSBXZWJEYXYKICogQGF1dGhvciBKYWNrIEJhdGVzIDxtczQxOUBmcmVlem9uZS5jby51az4KICogQHZlcnNpb24gJFJldmlzaW9uOiAxNjQ3MSAkCiAqLwpjbGFzcyBXZWJEYXZNb2R1bGUgZXh0ZW5kcyBHYWxsZXJ5TW9kdWxlIC8qIGFuZCBHYWxsZXJ5RXZlbnRMaXN0ZW5lciAqLyB7CgogICAgZnVuY3Rpb24gV2ViRGF2TW9kdWxlKCkgewoJZ2xvYmFsICRnYWxsZXJ5OwoKCSR0aGlzLT5zZXRJZCgnd2ViZGF2Jyk7CgkkdGhpcy0+c2V0TmFtZSgkZ2FsbGVyeS0+aTE4bignV2ViREFWJykpOwoJJHRoaXMtPnNldFZlcnNpb24oJzEuMC4wLjInKTsgLyogVXBkYXRlIHVwZ3JhZGUoKSB0b28hICovCgkkdGhpcy0+c2V0RGVzY3JpcHRpb24oJGdhbGxlcnktPmkxOG4oJ01vdW50IEdhbGxlcnkgb24geW91ciBkZXNrdG9wLicpKTsKCSR0aGlzLT5zZXRHcm91cCgnaW50ZXJmYWNlcycsICRnYWxsZXJ5LT5pMThuKCdSZW1vdGUgSW50ZXJmYWNlcycpKTsKCSR0aGlzLT5zZXRDYWxsYmFja3MoJ2dldEl0ZW1MaW5rc3xnZXRTaXRlQWRtaW5WaWV3c3xyZWdpc3RlckV2ZW50TGlzdGVuZXJzJyk7CgkkdGhpcy0+c2V0UmVxdWlyZWRDb3JlQXBpKGFycmF5KDcsIDE3KSk7CgkkdGhpcy0+c2V0UmVxdWlyZWRNb2R1bGVBcGkoYXJyYXkoMywgNSkpOwogICAgfQoKICAgIC8qKgogICAgICogQHNlZSBHYWxsZXJ5TW9kdWxlOjpwZXJmb3JtRmFjdG9yeVJlZ2lzdHJhdGlvbnMKICAgICAqLwogICAgZnVuY3Rpb24gcGVyZm9ybUZhY3RvcnlSZWdpc3RyYXRpb25zKCkgewoJJHJldCA9IEdhbGxlcnlDb3JlQXBpOjpyZWdpc3RlckZhY3RvcnlJbXBsZW1lbnRhdGlvbigKCSAgICAnSXRlbUFkZFBsdWdpbicsICdJdGVtQWRkV2ViRGF2JywgJ0l0ZW1BZGRXZWJEYXYnLAoJICAgICdtb2R1bGVzL3dlYmRhdi9JdGVtQWRkV2ViRGF2LmluYycsICd3ZWJkYXYnLCBudWxsKTsKCWlmICgkcmV0KSB7CgkgICAgcmV0dXJuICRyZXQ7Cgl9CiAgICB9CgogICAgLyoqCiAgICAgKiBAc2VlIEdhbGxlcnlNb2R1bGU6OnJlZ2lzdGVyRXZlbnRMaXN0ZW5lcnMKICAgICAqLwogICAgZnVuY3Rpb24gcmVnaXN0ZXJFdmVudExpc3RlbmVycygpIHsKCXJldHVybiBHYWxsZXJ5Q29yZUFwaTo6cmVnaXN0ZXJFdmVudExpc3RlbmVyKAoJICAgICdHYWxsZXJ5OjpBY3RpdmF0ZVBsdWdpbicsIG5ldyBXZWJEYXZNb2R1bGUoKSwgdHJ1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAc2VlIEdhbGxlcnlNb2R1bGU6OnVwZ3JhZGUKICAgICAqLwogICAgZnVuY3Rpb24gdXBncmFkZSgkY3VycmVudFZlcnNpb24pIHsKCWdsb2JhbCAkZ2FsbGVyeTsKCglzd2l0Y2ggKCRjdXJyZW50VmVyc2lvbikgewoJY2FzZSBudWxsOgoJICAgIC8qIEluaXRpYWwgaW5zdGFsbCAqLwoKCSAgICAvKiBBY3RpdmF0ZSBlc3NlbnRpYWwgcmV3cml0ZSBydWxlcyAqLwoJICAgICRyZXQgPSAkdGhpcy0+X2FjdGl2YXRlUmV3cml0ZVJ1bGVzKCk7CgkgICAgaWYgKCRyZXQgJiYgISgkcmV0LT5nZXRFcnJvckNvZGUoKSAmIEVSUk9SX0NPTkZJR1VSQVRJT05fUkVRVUlSRUQpKSB7CgkJcmV0dXJuICRyZXQ7CgkgICAgfQoKCSAgICBicmVhazsKCgljYXNlICcwLjAuMyc6CgkgICAgLyogQWRkIFdlYkRhdlNpdGVBZG1pbiBhbmQgV2ViRGF2TG9ja01hcCAqLwoKCWNhc2UgJzAuMC40JzoKCSAgICAvKiBBZGQgbW9kdWxlcy93ZWJkYXYvd2ViZGF2LnBocCBhbmQgV2ViRGF2VXJsR2VuZXJhdG9yICovCgoJY2FzZSAnMC4wLjUnOgoJICAgIC8qIEFkZCBXZWJEYXZJbml0RXZlbnRMaXN0ZW5lciAqLwoKCWNhc2UgJzAuMC42JzoKCSAgICAvKiBBZGQgaXRlbSBsaW5rICovCgoJY2FzZSAnMC4yLjAnOgoJICAgIC8qCgkgICAgICogQWN0aXZhdGUgZXNzZW50aWFsIHNob3J0IFVSTCBydWxlcyBhdXRvbWF0aWNhbGx5CgkgICAgICogU2V0IEhUVFAgcmVzcG9uc2Ugc3RhdHVzIG9uIGFsbCBlcnJvcnMKCSAgICAgKi8KCgljYXNlICcwLjMuMCc6CgkgICAgLyoKCSAgICAgKiBFbGltaW5hdGUgV2ViRGF2VXJsR2VuZXJhdG9yLCBXZWJEYXZJbml0RXZlbnRMaXN0ZW5lciBhbmQgV2ViRGF2U2l0ZUFkbWluCgkgICAgICogUmVnaXN0ZXIgV2ViRGF2QWN0aXZhdGVQbHVnaW5FdmVudExpc3RlbmVyCgkgICAgICovCgoJY2FzZSAnMC40LjAnOgoJICAgIC8qCgkgICAgICogTW92ZSBwYXJzZVBhdGggZnJvbSBXZWJEYXZIZWxwZXIgdG8gV2ViRGF2UmV3cml0ZUhlbHBlciwgdG8gYXZvaWQgbG9hZGluZwoJICAgICAqIFdlYkRhdkhlbHBlciBqdXN0IHRvIGdlbmVyYXRlIFVSTHMKCSAgICAgKi8KCgljYXNlICcwLjQuMSc6CgkgICAgLyogQWRkIEdhbGxlcnlWaWV3Ojppc0NvbnRyb2xsZXJMaWtlIHRvIFdlYkRBViB2aWV3ICovCgoJY2FzZSAnMC40LjInOgoJICAgIC8qIEFkZCBzdXBwb3J0IGZvciB0aGUgcGhwLWNnaSBzZXJ2ZXIgQVBJICovCgoJY2FzZSAnMC42LjAnOgoJICAgIC8qIFJlbW92ZSB2aWV3IHdpdGggV2ViREFWIHBlcm1pc3Npb24gKi8KCSAgICAkcmV0ID0gR2FsbGVyeUNvcmVBcGk6OnVucmVnaXN0ZXJNb2R1bGVQZXJtaXNzaW9ucygkdGhpcy0+Z2V0SWQoKSk7CgkgICAgaWYgKCRyZXQpIHsKCQlyZXR1cm4gJHJldDsKCSAgICB9CgljYXNlICcwLjYuMSc6CgkgICAgLyoKCSAgICAgKiBBZGQgZGVwZW5kZW5jeSBvbiBsYXRlc3QgY2hhbmdlcyBpbiBHYWxsZXJ5TW9kdWxlOjpnZXRSZXdyaXRlUnVsZXMgYW5kIG9uCgkgICAgICogR2FsbGVyeVVybEdlbmVyYXRvcjo6Z2VuZXJhdGVVcmwncyBwcm90b2NvbCBvcHRpb24uCgkgICAgICovCgoJY2FzZSAnMC42LjInOgoJICAgIC8qIEFkZCBjb25maWd1cmF0aW9uIGNoZWNrcyAqLwoJY2FzZSAnMC43LjAnOgoJICAgIC8qIEFkZCB3aGl0ZWxpc3QgZm9yIGV4dGVybmFsIGludGVyZmFjZSAqLwoJY2FzZSAnMC43LjEnOgoJICAgIC8qIFJlbmFtZSBXZWJEYXZNb3VudCB0byBEb3dubG9hZERhdk1vdW50ICovCgljYXNlICcwLjcuMic6CgkgICAgLyogQWRkIEh0dHBBdXRoIGNoZWNrIHRocm91Z2ggaW50ZXJmYWNlICovCgljYXNlICcwLjcuMyc6CgkgICAgLyogVmVyc2lvbiAxLjAuMCBmb3IgR2FsbGVyeSAyLjIgcmVsZWFzZSAqLwoKCWNhc2UgJzEuMC4wJzoKCSAgICAvKiBBdm9pZCBtYXRjaGluZyBwYXRocyBzdGFydGluZyB3aXRoICd3W14vXScgd2l0aCBVUkwgcmV3cml0ZSBydWxlIGtleXdvcmQgKi8KCSAgICAkcmV0ID0gJHRoaXMtPl9hY3RpdmF0ZVJld3JpdGVSdWxlcygpOwoJICAgIGlmICgkcmV0ICYmICEoJHJldC0+Z2V0RXJyb3JDb2RlKCkgJiBFUlJPUl9DT05GSUdVUkFUSU9OX1JFUVVJUkVEKSkgewoJCXJldHVybiAkcmV0OwoJICAgIH0KCWNhc2UgJzEuMC4wLjEnOgoJICAgIC8qIEZpeCBlbnRpdHktdHlwZSBidWcgKDE2ODE0MDYpICovCgoJY2FzZSAnZW5kIG9mIHVwZ3JhZGUgcGF0aCc6CgkgICAgYnJlYWs7CgoJZGVmYXVsdDoKCSAgICByZXR1cm4gR2FsbGVyeUNvcmVBcGk6OmVycm9yKEVSUk9SX0JBRF9QTFVHSU4sIF9fRklMRV9fLCBfX0xJTkVfXywKCQlzcHJpbnRmKCdVbmtub3duIG1vZHVsZSB2ZXJzaW9uICVzJywgJGN1cnJlbnRWZXJzaW9uKSk7Cgl9CiAgICB9CgogICAgLyoqCiAgICAgKiBAc2VlIEdhbGxlcnlNb2R1bGU6OmFjdGl2YXRlCiAgICAgKiBAdG9kbyBUaGUgZXhwbGljaXQgcmV3cml0ZSBtb2R1bGUgdmVyc2lvbiBjaGVjayBjYW4gYmUgcmVtb3ZlZCBvbiB0aGUgbmV4dCBtYWpvciBNb2R1bGUgQVBJCiAgICAgKiAgICAgICB2ZXJzaW9uLgogICAgICovCiAgICBmdW5jdGlvbiBhY3RpdmF0ZSgkcG9zdEFjdGl2YXRpb25FdmVudD10cnVlKSB7CgkvKiBFbnN1cmUgdGhlIHJld3JpdGUgbW9kdWxlIGlzIGNvbXBhdGlibGUsICdwYXR0ZXJuJyBpcyBvcHRpb25hbCBzaW5jZSB2MS4xLjggb2YgcmV3cml0ZSAqLwoJbGlzdCAoJHJldCwgJG1vZHVsZXMpID0gR2FsbGVyeUNvcmVBcGk6OmZldGNoUGx1Z2luTGlzdCgnbW9kdWxlJyk7CglpZiAoJHJldCkgewoJICAgIHJldHVybiBhcnJheSgkcmV0LCBudWxsKTsKCX0KCglpZiAoaXNzZXQoJG1vZHVsZXNbJ3Jld3JpdGUnXSkpIHsKCSAgICBsaXN0ICgkcmV0LCAkcmV3cml0ZSkgPSBHYWxsZXJ5Q29yZUFwaTo6bG9hZFBsdWdpbignbW9kdWxlJywgJ3Jld3JpdGUnLCB0cnVlKTsKCSAgICBpZiAoJHJldCkgewoJCXJldHVybiBhcnJheSgkcmV0LCBudWxsKTsKCSAgICB9CgoJICAgIGlmICh2ZXJzaW9uX2NvbXBhcmUoJHJld3JpdGUtPmdldFZlcnNpb24oKSwgJzEuMS44JywgJzwnKSkgewoJCXJldHVybiBhcnJheShHYWxsZXJ5Q29yZUFwaTo6ZXJyb3IoRVJST1JfQ09ORklHVVJBVElPTl9SRVFVSVJFRCksIG51bGwpOwoJICAgIH0KCX0KCglsaXN0ICgkcmV0LCAkcmVkaXJlY3QpID0gcGFyZW50OjphY3RpdmF0ZSgkcG9zdEFjdGl2YXRpb25FdmVudCk7CglpZiAoJHJldCkgewoJICAgIHJldHVybiBhcnJheSgkcmV0LCBudWxsKTsKCX0KCglyZXR1cm4gYXJyYXkobnVsbCwgJHJlZGlyZWN0KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBzZWUgR2FsbGVyeU1vZHVsZTo6Z2V0SXRlbUxpbmtzCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldEl0ZW1MaW5rcygkaXRlbXMsICR3YW50c0RldGFpbGVkTGlua3MsICRwZXJtaXNzaW9ucywgJHVzZXJJZCkgewoJJGxpbmtzID0gYXJyYXkoKTsKCWZvcmVhY2ggKCRpdGVtcyBhcyAkaXRlbSkgewoJICAgIGlmICghJGl0ZW0tPmdldENhbkNvbnRhaW5DaGlsZHJlbigpIHx8IGVtcHR5KCR3YW50c0RldGFpbGVkTGlua3NbJGl0ZW0tPmdldElkKCldKSkgewoJCWNvbnRpbnVlOwoJICAgIH0KCSAgICAkbGlua3NbJGl0ZW0tPmdldElkKCldW10gPSBhcnJheSgKCQkJJ3RleHQnID0+ICR0aGlzLT50cmFuc2xhdGUoJ01vdW50IHdpdGggV2ViREFWJyksCgkJCSdwYXJhbXMnID0+IGFycmF5KCd2aWV3JyA9PiAnd2ViZGF2LldlYkRhdk1vdW50JywKCQkJCQkgICdpdGVtSWQnID0+ICRpdGVtLT5nZXRJZCgpKSk7Cgl9CgoJcmV0dXJuIGFycmF5KG51bGwsICRsaW5rcyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAc2VlIEdhbGxlcnlNb2R1bGU6OmdldFNpdGVBZG1pblZpZXdzCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFNpdGVBZG1pblZpZXdzKCkgewoJcmV0dXJuIGFycmF5KG51bGwsIGFycmF5KGFycmF5KCduYW1lJyA9PiAkdGhpcy0+dHJhbnNsYXRlKCR0aGlzLT5nZXROYW1lKCkpLAoJCQkJICAgICAgICd2aWV3JyA9PiAnd2ViZGF2LldlYkRhdlNpdGVBZG1pbicpKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAc2VlIEdhbGxlcnlNb2R1bGU6OmdldFJld3JpdGVSdWxlcwogICAgICovCiAgICBmdW5jdGlvbiBnZXRSZXdyaXRlUnVsZXMoKSB7CglnbG9iYWwgJGdhbGxlcnk7CgkkdXJsR2VuZXJhdG9yID0mICRnYWxsZXJ5LT5nZXRVcmxHZW5lcmF0b3IoKTsKCgkkcnVsZXMgPSBhcnJheSgpOwoKCS8qIFVzZSBzaG9ydCBVUkwgYmVjYXVzZSBtb3N0IFdlYkRBViBjbGllbnRzIGRvbid0IHN1cHBvcnQgcXVlcnkgc3RyaW5ncyAqLwoJJHJ1bGVzWydjb25uZWN0J10gPSBhcnJheSgKCSAgICAnY29tbWVudCcgPT4gJHRoaXMtPnRyYW5zbGF0ZSgnQ29ubmVjdCB0byBXZWJEQVYnKSwKCSAgICAnaGVscCcgPT4gJHRoaXMtPnRyYW5zbGF0ZSgKCQknVXNlIHNob3J0IFVSTCBiZWNhdXNlIG1vc3QgV2ViREFWIGNsaWVudHMgZG9uXCd0IHN1cHBvcnQgcXVlcnkgc3RyaW5ncy4nCgkJLiAnICBUaGUgV2luZG93cyBXZWJEQVYgY2xpZW50IHJlcXVpcmVzIHRoYXQgeW91IGRvblwndCBhZGQgYSBzbGFzaCBiZWZvcmUgdGhlJwoJCS4gJyAlcGF0aCUgdmFyaWFibGUuJyksCgkgICAgJ21hdGNoJyA9PiBhcnJheSgnY29udHJvbGxlcicgPT4gJ3dlYmRhdi5XZWJEYXYnKSwKCSAgICAncGF0dGVybicgPT4gJ3clcGF0aCUnLAoJICAgICdrZXl3b3JkcycgPT4gYXJyYXkoCgkJJ3BhdGgnID0+IGFycmF5KAoJCSAgICAncGF0dGVybicgPT4gJygvW14/XSopPycsCgkJICAgICdmdW5jdGlvbicgPT4gYXJyYXkoJ3dlYmRhdicsICdXZWJEYXZSZXdyaXRlSGVscGVyJywgJ3BhcnNlUGF0aCcpLAoJCSAgICAnaGVscCcgPT4gJHRoaXMtPnRyYW5zbGF0ZSgnUGF0aCB0byBhbiBpdGVtIChlZy4gL2FsYnVtL2ltYWdlLmpwZy5odG1sKScpKSkpOwoKCS8qIEdpdmUgZGF2bW91bnQgcmVzb3VyY2VzIHRoZSBjb3JyZWN0IGV4dGVuc2lvbiAqLwoJJHJ1bGVzWydkYXZtb3VudCddID0gYXJyYXkoCgkgICAgJ2NvbW1lbnQnID0+ICR0aGlzLT50cmFuc2xhdGUoJ01vdW50IFdlYkRBVicpLAoJICAgICdoZWxwJyA9PiAkdGhpcy0+dHJhbnNsYXRlKAoJCSdHaXZlIGRhdm1vdW50IHJlc291cmNlcyB0aGUgY29ycmVjdCBleHRlbnNpb24uJyksCgkgICAgJ21hdGNoJyA9PiBhcnJheSgndmlldycgPT4gJ3dlYmRhdi5Eb3dubG9hZERhdk1vdW50JyksCgoJICAgIC8qIFRPRE86IEhvdyB0byB3b3JrIHdpdGggdGhlIHJvb3QgYWxidW0/ICovCgkgICAgJ3BhdHRlcm4nID0+ICd2LyVwYXRoJS5kYXZtb3VudCcsCgkgICAgJ2tleXdvcmRzJyA9PiBhcnJheSgKCQkncGF0aCcgPT4gYXJyYXkoCgkJICAgICdwYXR0ZXJuJyA9PiAnKFteP10rKScsCgkJICAgICdmdW5jdGlvbicgPT4gYXJyYXkoJ3Jld3JpdGUnLCAnUmV3cml0ZVNpbXBsZUhlbHBlcicsICdwYXJzZVBhdGgnKSwKCQkgICAgJ2hlbHAnID0+ICR0aGlzLT50cmFuc2xhdGUoJ1BhdGggdG8gYW4gaXRlbSAoZWcuIC9hbGJ1bS9pbWFnZS5qcGcuaHRtbCknKSkpLAoJICAgICdvbkxvYWQnID0+IGFycmF5KCdyZXdyaXRlJywgJ1Jld3JpdGVTaW1wbGVIZWxwZXInLCAnbG9hZEl0ZW1JZEZyb21QYXRoJykpOwoKCS8qCgkgKiBPbmx5IGRlZmluZSB0aGUgcnVsZSB0byByZWRpcmVjdCBPUFRJT05TIHJlcXVlc3RzIHNvIHdlIGNhbiBzZXQgREFWIGhlYWRlcnMgaWYgaXQgaXMKCSAqIGFscmVhZHkgYWN0aXZlLCBvciBpZiBPUFRJT05TIHJlc3BvbnNlcyBhcmUgbWlzc2luZyBEQVYgaGVhZGVycwoJICovCglsaXN0ICgkcmV0LCAkcmV3cml0ZUFwaSkgPSBHYWxsZXJ5Q29yZUFwaTo6bmV3RmFjdG9yeUluc3RhbmNlKCdSZXdyaXRlQXBpJyk7CglpZiAoJHJldCkgewoJICAgIGlmICgkZ2FsbGVyeS0+Z2V0RGVidWcoKSkgewoJCSRnYWxsZXJ5LT5kZWJ1ZygnRXJyb3IgaW4gV2ViRGF2TW9kdWxlOjpnZXRSZXdyaXRlUnVsZXM6ICcgLiAkcmV0LT5nZXRBc1RleHQoKSk7CgkgICAgfQoJICAgIHJldHVybiAkcnVsZXM7Cgl9CglpZiAoIWlzc2V0KCRyZXdyaXRlQXBpKSkgewoJICAgIHJldHVybiAkcnVsZXM7Cgl9CgoJbGlzdCAoJHJldCwgJGlzQ29tcGF0aWJsZSkgPSAkcmV3cml0ZUFwaS0+aXNDb21wYXRpYmxlV2l0aEFwaShhcnJheSgxLCAxKSk7CglpZiAoJHJldCkgewoJICAgIGlmICgkZ2FsbGVyeS0+Z2V0RGVidWcoKSkgewoJCSRnYWxsZXJ5LT5kZWJ1ZygnRXJyb3IgaW4gV2ViRGF2TW9kdWxlOjpnZXRSZXdyaXRlUnVsZXM6ICcgLiAkcmV0LT5nZXRBc1RleHQoKSk7CgkgICAgfQoJICAgIHJldHVybiAkcnVsZXM7Cgl9CglpZiAoISRpc0NvbXBhdGlibGUpIHsKCSAgICByZXR1cm4gJHJ1bGVzOwoJfQoKCWxpc3QgKCRyZXQsICRhY3RpdmVSdWxlcykgPSAkcmV3cml0ZUFwaS0+ZmV0Y2hBY3RpdmVSdWxlc0Zvck1vZHVsZSgkdGhpcy0+Z2V0SWQoKSk7CglpZiAoJHJldCkgewoJICAgIGlmICgkZ2FsbGVyeS0+Z2V0RGVidWcoKSkgewoJCSRnYWxsZXJ5LT5kZWJ1ZygnRXJyb3IgaW4gV2ViRGF2TW9kdWxlOjpnZXRSZXdyaXRlUnVsZXM6ICcgLiAkcmV0LT5nZXRBc1RleHQoKSk7CgkgICAgfQoJICAgIHJldHVybiAkcnVsZXM7Cgl9CglpZiAoIWluX2FycmF5KCdvcHRpb25zJywgJGFjdGl2ZVJ1bGVzKSkgewoJICAgIC8qIENoZWNrIHRoYXQgT1BUSU9OUyByZXNwb25zZXMgaW5jbHVkZSB0aGUgREFWIGhlYWRlcnMgKi8KCSAgICBHYWxsZXJ5Q29yZUFwaTo6cmVxdWlyZU9uY2UoJ21vZHVsZXMvd2ViZGF2L2NsYXNzZXMvV2ViRGF2SGVscGVyLmNsYXNzJyk7CgkgICAgaWYgKFdlYkRhdkhlbHBlcjo6Y2hlY2tEYXZIZWFkZXJzKCR1cmxHZW5lcmF0b3ItPmdlbmVyYXRlVXJsKAoJCSAgICBhcnJheSgnY29udHJvbGxlcicgPT4gJ3dlYmRhdi5XZWJEYXYnKSwKCQkgICAgYXJyYXkoJ2ZvcmNlRnVsbFVybCcgPT4gdHJ1ZSwKCQkJICAnaHRtbEVudGl0aWVzJyA9PiBmYWxzZSkpKSkgewoJCXJldHVybiAkcnVsZXM7CgkgICAgfQoJfQoKCS8qIFJlZGlyZWN0IE9QVElPTlMgcmVxdWVzdHMgc28gd2UgY2FuIHNldCBEQVYgaGVhZGVycyAqLwoJJHJ1bGVzWydvcHRpb25zJ10gPSBhcnJheSgKCSAgICAnY29tbWVudCcgPT4gJHRoaXMtPnRyYW5zbGF0ZSgnT1BUSU9OUyBSZXF1ZXN0cycpLAoJICAgICdoZWxwJyA9PiAkdGhpcy0+dHJhbnNsYXRlKAoJCSdSZWRpcmVjdCBPUFRJT05TIHJlcXVlc3RzIHNvIHdlIGNhbiBzZXQgREFWIGhlYWRlcnMuJyksCgoJICAgIC8qIFVzZSB0cmFpbGluZyAnLycgdG8gYXZvaWQgMzAxIE1vdmVkIFBlcm1hbmVudGx5ICovCgkgICAgJ21hdGNoJyA9PiBhcnJheSgnaHJlZicgPT4gJ21vZHVsZXMvd2ViZGF2L2RhdGEvb3B0aW9ucy8nKSwKCSAgICAnY29uZGl0aW9ucycgPT4gYXJyYXkoYXJyYXkoJ3Rlc3QnID0+ICdSRVFVRVNUX01FVEhPRCcsCgkJCQkJJ3BhdHRlcm4nID0+ICdPUFRJT05TJykpKTsKCglyZXR1cm4gJHJ1bGVzOwogICAgfQoKICAgIC8qKgogICAgICogQHNlZSBHYWxsZXJ5RXZlbnRMaXN0ZW5lcjo6aGFuZGxlRXZlbnQKICAgICAqLwogICAgZnVuY3Rpb24gaGFuZGxlRXZlbnQoJGV2ZW50KSB7Cglzd2l0Y2ggKCRldmVudC0+Z2V0RXZlbnROYW1lKCkpIHsKCWNhc2UgJ0dhbGxlcnk6OkFjdGl2YXRlUGx1Z2luJzoKCSAgICAkZGF0YSA9ICRldmVudC0+Z2V0RGF0YSgpOwoJICAgIGlmICgkZGF0YVsncGx1Z2luVHlwZSddICE9ICdtb2R1bGUnIHx8ICRkYXRhWydwbHVnaW5JZCddICE9ICdyZXdyaXRlJykgewoJCXJldHVybiBhcnJheShudWxsLCBudWxsKTsKCSAgICB9CgoJICAgICRyZXQgPSAkdGhpcy0+X2FjdGl2YXRlUmV3cml0ZVJ1bGVzKCk7CgkgICAgaWYgKCRyZXQgJiYgISgkcmV0LT5nZXRFcnJvckNvZGUoKSAmIEVSUk9SX0NPTkZJR1VSQVRJT05fUkVRVUlSRUQpKSB7CgkJcmV0dXJuIGFycmF5KCRyZXQsIG51bGwpOwoJICAgIH0KCgkgICAgcmV0dXJuIGFycmF5KG51bGwsIG51bGwpOwoKCWNhc2UgJ0dhbGxlcnk6OkVycm9yJzoKCSAgICAkZGF0YSA9ICRldmVudC0+Z2V0RGF0YSgpOwoJICAgIGlmICgoJGRhdGFbJ2Vycm9yJ10tPmdldEVycm9yQ29kZSgpICYgRVJST1JfUEVSTUlTU0lPTl9ERU5JRUQpKSB7CgkJLyogUHJvbXB0IGZvciBhdXRoZW50aWNhdGlvbiAqLwoJCWxpc3QgKCRyZXQsICRodHRwQXV0aEludGVyZmFjZSkgPQoJCSAgICBHYWxsZXJ5Q29yZUFwaTo6bmV3RmFjdG9yeUluc3RhbmNlKCdIdHRwQXV0aEludGVyZmFjZV8xXzAnKTsKCQlpZiAoJHJldCkgewoJCSAgICByZXR1cm4gYXJyYXkoJHJldCwgbnVsbCk7CgkJfQoJCWlmIChpc3NldCgkaHR0cEF1dGhJbnRlcmZhY2UpKSB7CgkJICAgICRyZXQgPSAkaHR0cEF1dGhJbnRlcmZhY2UtPnJlcXVlc3RBdXRoZW50aWNhdGlvbigpOwoJCSAgICBpZiAoJHJldCkgewoJCQlyZXR1cm4gYXJyYXkoJHJldCwgbnVsbCk7CgkJICAgIH0KCQl9CgkgICAgfQoKCSAgICAvKiBTdXBwcmVzcyBnZW5lcmF0aW5nIEhUTUwgZXJyb3IgcGFnZXMgZm9yIFdlYkRBViBjbGllbnRzICovCgkgICAgcmV0dXJuIGFycmF5KG51bGwsIGFycmF5KCdzdXBwcmVzc0JvZHknID0+IHRydWUpKTsKCX0KCglyZXR1cm4gYXJyYXkobnVsbCwgbnVsbCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBY3RpdmF0ZSBlc3NlbnRpYWwgcmV3cml0ZSBydWxlcy4KICAgICAqIEByZXR1cm4gb2JqZWN0IEdhbGxlcnlTdGF0dXMgYSBzdGF0dXMgY29kZQogICAgICovCiAgICBmdW5jdGlvbiBfYWN0aXZhdGVSZXdyaXRlUnVsZXMoKSB7CglsaXN0ICgkcmV0LCAkcmV3cml0ZUFwaSkgPSBHYWxsZXJ5Q29yZUFwaTo6bmV3RmFjdG9yeUluc3RhbmNlKCdSZXdyaXRlQXBpJyk7CglpZiAoJHJldCkgewoJICAgIHJldHVybiAkcmV0OwoJfQoJaWYgKCFpc3NldCgkcmV3cml0ZUFwaSkpIHsKCSAgICByZXR1cm4gR2FsbGVyeUNvcmVBcGk6OmVycm9yKEVSUk9SX0NPTkZJR1VSQVRJT05fUkVRVUlSRUQpOwoJfQoKCWxpc3QgKCRyZXQsICRpc0NvbXBhdGlibGUpID0gJHJld3JpdGVBcGktPmlzQ29tcGF0aWJsZVdpdGhBcGkoYXJyYXkoMSwgMSkpOwoJaWYgKCRyZXQpIHsKCSAgICByZXR1cm4gJHJldDsKCX0KCWlmICghJGlzQ29tcGF0aWJsZSkgewoJICAgIHJldHVybiBHYWxsZXJ5Q29yZUFwaTo6ZXJyb3IoRVJST1JfQ09ORklHVVJBVElPTl9SRVFVSVJFRCk7Cgl9CgoJbGlzdCAoJHJldCwgJHN1Y2Nlc3MpID0gJHJld3JpdGVBcGktPmFjdGl2YXRlUmV3cml0ZVJ1bGVzRm9yTW9kdWxlKCR0aGlzLT5nZXRJZCgpKTsKCWlmICgkcmV0KSB7CgkgICAgcmV0dXJuICRyZXQ7Cgl9CglpZiAoISRzdWNjZXNzKSB7CgkgICAgcmV0dXJuIEdhbGxlcnlDb3JlQXBpOjplcnJvcihFUlJPUl9DT05GSUdVUkFUSU9OX1JFUVVJUkVEKTsKCX0KCglyZXR1cm4gbnVsbDsKICAgIH0KfQo/Pgo=');
expand_6421a0d81d($outputDir, 'po/GNUmakefile', 'R0FMTEVSWURJUiA/PSAuLi8uLi8uLgpUT09MRElSID89ICQoR0FMTEVSWURJUikvbGliL3Rvb2xzCgppbmNsdWRlICQoVE9PTERJUikvcG8vR05VbWFrZWZpbGUuaW5jCgo=');
expand_6421a0d81d($outputDir, 'po/strings.raw', 'IyAkSWQ6IHN0cmluZ3MucmF3IDE1NzQ5IDIwMDctMDEtMzAgMDE6MzU6NTBaIG1pbmRsZXNzICQKCi8qIEl0ZW1BZGRXZWJEYXYuaW5jICovCmdldHRleHQoIldlYkRBViIpIC8qIGFsc28gaW46IG1vZHVsZS5pbmMgKi8KCi8qIFdlYkRhdk1vdW50LmluYyAqLwpnZXR0ZXh0KCJNb3VudCB3aXRoIFdlYkRBViIpIC8qIGFsc28gaW46IG1vZHVsZS5pbmMgKi8KCi8qIG1vZHVsZS5pbmMgKi8KZ2V0dGV4dCgiTW91bnQgR2FsbGVyeSBvbiB5b3VyIGRlc2t0b3AuIikKZ2V0dGV4dCgiUmVtb3RlIEludGVyZmFjZXMiKQpnZXR0ZXh0KCJDb25uZWN0IHRvIFdlYkRBViIpCmdldHRleHQoIlVzZSBzaG9ydCBVUkwgYmVjYXVzZSBtb3N0IFdlYkRBViBjbGllbnRzIGRvbid0IHN1cHBvcnQgcXVlcnkgc3RyaW5ncy4gIFRoZSBXaW5kb3dzIFdlYkRBViBjbGllbnQgcmVxdWlyZXMgdGhhdCB5b3UgZG9uJ3QgYWRkIGEgc2xhc2ggYmVmb3JlIHRoZSAlcGF0aCUgdmFyaWFibGUuIikKZ2V0dGV4dCgiUGF0aCB0byBhbiBpdGVtIChlZy4gL2FsYnVtL2ltYWdlLmpwZy5odG1sKSIpCmdldHRleHQoIk1vdW50IFdlYkRBViIpCmdldHRleHQoIkdpdmUgZGF2bW91bnQgcmVzb3VyY2VzIHRoZSBjb3JyZWN0IGV4dGVuc2lvbi4iKQpnZXR0ZXh0KCJPUFRJT05TIFJlcXVlc3RzIikKZ2V0dGV4dCgiUmVkaXJlY3QgT1BUSU9OUyByZXF1ZXN0cyBzbyB3ZSBjYW4gc2V0IERBViBoZWFkZXJzLiIpCgovKiB0ZW1wbGF0ZXMvV2ViRGF2TW91bnQudHBsICovCmdldHRleHQoIldlYkRBViBNb3VudCBJbnN0cnVjdGlvbnMiKQpnZXR0ZXh0KCIlc0NsaWNrIGhlcmUlcyB0byBtb3VudCBHYWxsZXJ5IG9uIHlvdXIgZGVza3RvcCB3aXRoIGEgV2ViREFWIGNsaWVudC4gIERvY3VtZW50YXRpb24gb24gbW91bnRpbmcgR2FsbGVyeSB3aXRoIFdlYkRBViBpcyBpbiB0aGUgJXNHYWxsZXJ5IENvZGV4JXMuIikKZ2V0dGV4dCgiQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBlbnRlciB0aGUgZm9sbG93aW5nIFVSTCBpbiB5b3VyIFdlYkRBViBjbGllbnQ6IikKCi8qIHRlbXBsYXRlcy9XZWJEYXZTaXRlQWRtaW4udHBsICovCmdldHRleHQoIldlYkRBViBTZXR0aW5ncyIpCmdldHRleHQoIkNvbmZpZ3VyYXRpb24gY2hlY2tlZCBzdWNjZXNzZnVsbHkiKQpnZXR0ZXh0KCJNb3N0IFdlYkRBViBjbGllbnRzIHdpbGwgc3VjY2Vzc2Z1bGx5IGNvbm5lY3QuICBEb2N1bWVudGF0aW9uIG9uIG1vdW50aW5nIEdhbGxlcnkgd2l0aCBXZWJEQVYgaXMgaW4gdGhlICVzR2FsbGVyeSBDb2RleCVzLiIpCmdldHRleHQoIlRoZSBVUkwgdG8gY29ubmVjdCB0byBHYWxsZXJ5IHdpdGggV2ViREFWIGlzOiIpCmdldHRleHQoIlBIUCBoYXMgbm8gWE1MIHN1cHBvcnQiKQpnZXR0ZXh0KCJZb3UgY2FuJ3QgY29ubmVjdCB3aXRoIFdlYkRBViBiZWNhdXNlIFBIUCBoYXMgbm8gWE1MIHN1cHBvcnQgb24gdGhpcyBzZXJ2ZXIuICBUcm91Ymxlc2hvb3RpbmcgZG9jdW1lbnRhdGlvbiBpcyBpbiB0aGUgJXNHYWxsZXJ5IENvZGV4JXMuIikKZ2V0dGV4dCgiV2ViREFWIHJlcXVlc3RzIG5vdCBoYW5kbGVkIikKZ2V0dGV4dCgiWW91IGNhbid0IGNvbm5lY3Qgd2l0aCBXZWJEQVYgYmVjYXVzZSB0aGlzIHNlcnZlciBkb2Vzbid0IHBhc3MgV2ViREFWIHJlcXVlc3RzIHRvIEdhbGxlcnkuICBUcm91Ymxlc2hvb3RpbmcgZG9jdW1lbnRhdGlvbiBpcyBpbiB0aGUgJXNHYWxsZXJ5IENvZGV4JXMuIikKZ2V0dGV4dCgiSFRUUCBhdXRoIG1vZHVsZSBkaXNhYmxlZCIpCmdldHRleHQoIllvdSBjYW4gY29ubmVjdCB3aXRoIFdlYkRBViBhbm9ueW1vdXNseSwgYnV0IHlvdSBjYW4ndCBkbyBhbnl0aGluZyB3aGljaCByZXF1aXJlcyB5b3UgdG8gbG9naW4gYmVjYXVzZSB0aGUgSFRUUCBhdXRoIG1vZHVsZSBpcyBkaXNhYmxlZC4gIFlvdSBzaG91bGQgYWN0aXZhdGUgdGhlIEhUVFAgYXV0aCBtb2R1bGUgaW4gdGhlICVzU2l0ZSBBZG1pbiBQbHVnaW5zIG9wdGlvbiVzLiAgVHJvdWJsZXNob290aW5nIGRvY3VtZW50YXRpb24gaXMgaW4gdGhlICVzR2FsbGVyeSBDb2RleCVzLiIpCmdldHRleHQoIkhUVFAgYXV0aCBwbHVnaW4gZGlzYWJsZWQiKQpnZXR0ZXh0KCJZb3UgY2FuIGNvbm5lY3Qgd2l0aCBXZWJEQVYgYW5vbnltb3VzbHksIGJ1dCB5b3UgY2FuJ3QgZG8gYW55dGhpbmcgd2hpY2ggcmVxdWlyZXMgeW91IHRvIGxvZ2luIGJlY2F1c2UgbmVpdGhlciBIVFRQIGF1dGhlbnRpY2F0aW9uIG5vciBzZXJ2ZXIgYXV0aGVudGljYXRpb24gYXJlIGVuYWJsZWQgaW4gdGhlIEhUVFAgYXV0aCBtb2R1bGUuICBZb3Ugc2hvdWxkIGFjdGl2YXRlIEhUVFAgYXV0aGVudGljYXRpb24gaW4gdGhlIHNldHRpbmdzIG9mIHRoZSBIVFRQIGF1dGggbW9kdWxlLiIpCmdldHRleHQoIidDb25uZWN0IHRvIFdlYkRBVicgcnVsZSBkaXNhYmxlZCIpCmdldHRleHQoIk1vc3QgV2ViREFWIGNsaWVudHMgd2lsbCBmYWlsIHRvIGNvbm5lY3QgYmVjYXVzZSB0aGUgVVJMIHJld3JpdGUgcnVsZSB0byBnZW5lcmF0ZSBzaG9ydCBXZWJEQVYgVVJMcyBpcyBkaXNhYmxlZC4gIFlvdSBzaG91bGQgYWN0aXZhdGUgdGhlICdDb25uZWN0IHRvIFdlYkRBVicgcnVsZSBpbiB0aGUgJXNTaXRlIEFkbWluIFVSTCBSZXdyaXRlIG9wdGlvbiVzLiAgVHJvdWJsZXNob290aW5nIGRvY3VtZW50YXRpb24gaXMgaW4gdGhlICVzR2FsbGVyeSBDb2RleCVzLiIpCmdldHRleHQoIk1pc3NpbmcgREFWIGhlYWRlcnMiKQpnZXR0ZXh0KCJTb21lIFdlYkRBViBjbGllbnRzLCBlLmcuIE1hYyBPUyBYIFdlYkRBVkZTLCB3aWxsIGZhaWwgdG8gY29ubmVjdCBiZWNhdXNlIE9QVElPTlMgcmVzcG9uc2VzIGFyZSBtaXNzaW5nIERBViBoZWFkZXJzLiAgVHJvdWJsZXNob290aW5nIGRvY3VtZW50YXRpb24gaXMgaW4gdGhlICVzR2FsbGVyeSBDb2RleCVzLiIpCmdldHRleHQoIkFsdGVybmF0aXZlIFVSTCBtaXNzaW5nIERBViBoZWFkZXJzIikKZ2V0dGV4dCgiQmVjYXVzZSBPUFRJT05TIHJlc3BvbnNlcyBhcmUgbWlzc2luZyBEQVYgaGVhZGVycywgd2UgdHJ5IHRvIGZhbGwgYmFjayBvbiBhbiBhbHRlcm5hdGl2ZSBVUkwsIGJ1dCBhbHRlcm5hdGl2ZSBVUkwgcmVzcG9uc2VzIGFyZSBhbHNvIG1pc3NpbmcgREFWIGhlYWRlcnMuICBUcm91Ymxlc2hvb3RpbmcgZG9jdW1lbnRhdGlvbiBpcyBpbiB0aGUgJXNHYWxsZXJ5IENvZGV4JXMuIikKZ2V0dGV4dCgiVVJMIHJld3JpdGUgbW9kdWxlIGRpc2FibGVkIikKZ2V0dGV4dCgiTW9zdCBXZWJEQVYgY2xpZW50cyB3aWxsIGZhaWwgdG8gY29ubmVjdCBiZWNhdXNlIHRoZSBVUkwgcmV3cml0ZSBtb2R1bGUgaXMgZGlzYWJsZWQuICBZb3Ugc2hvdWxkIGFjdGl2YXRlIHRoZSBVUkwgcmV3cml0ZSBtb2R1bGUgaW4gdGhlICVzU2l0ZSBBZG1pbiBQbHVnaW5zIG9wdGlvbiVzIGFuZCBjaG9vc2UgZWl0aGVyIEFwYWNoZSBtb2RfcmV3cml0ZSBvciBJU0FQSV9SZXdyaXRlLiAgVHJvdWJsZXNob290aW5nIGRvY3VtZW50YXRpb24gaXMgaW4gdGhlICVzR2FsbGVyeSBDb2RleCVzLiIpCmdldHRleHQoIkJhZCBVUkwgcmV3cml0ZSBjb25maWd1cmF0aW9uIikKZ2V0dGV4dCgiUEhQIFBhdGhJbmZvIHJld3JpdGUgZG9lc24ndCBzdXBwb3J0IHRoZSBydWxlIHRvIGZhbGwgYmFjayBvbiBhbiBhbHRlcm5hdGl2ZSBVUkwuICBZb3Ugc2hvdWxkIHVuaW5zdGFsbCBhbmQgcmVpbnN0YWxsIHRoZSBVUkwgcmV3cml0ZSBtb2R1bGUgaW4gdGhlICVzU2l0ZSBBZG1pbiBQbHVnaW5zIG9wdGlvbiVzIGFuZCBjaG9vc2UgZWl0aGVyIEFwYWNoZSBtb2RfcmV3cml0ZSBvciBJU0FQSV9SZXdyaXRlLiAgVHJvdWJsZXNob290aW5nIGluZm9ybWF0aW9uIGlzIGluIHRoZSAlc0dhbGxlcnkgQ29kZXglcy4iKQpnZXR0ZXh0KCInT1BUSU9OUyBSZXF1ZXN0cycgcnVsZSBkaXNhYmxlZCIpCmdldHRleHQoIlRoZSBVUkwgcmV3cml0ZSBydWxlIHRvIGZhbGwgYmFjayBvbiBhbiBhbHRlcm5hdGl2ZSBVUkwgaXMgZGlzYWJsZWQuICBZb3Ugc2hvdWxkIGFjdGl2YXRlIHRoZSBXZWJEQVYgJ09QVElPTlMgUmVxdWVzdHMnIHJ1bGUgaW4gdGhlICVzU2l0ZSBBZG1pbiBVUkwgUmV3cml0ZSBvcHRpb24lcy4gIFRyb3VibGVzaG9vdGluZyBkb2N1bWVudGF0aW9uIGlzIGluIHRoZSAlc0dhbGxlcnkgQ29kZXglcy4iKQpnZXR0ZXh0KCJVbmtub3duIENhdXNlIikKZ2V0dGV4dCgiU29tZSBXZWJEQVYgY2xpZW50cywgZS5nLiBNYWMgT1MgWCBXZWJEQVZGUywgd2lsbCBmYWlsIHRvIGNvbm5lY3QgYW5kIGF1dG9tYXRlZCBjaGVja3MgZmFpbGVkIHRvIGZpbmQgYSBjYXVzZS4gIFRyb3VibGVzaG9vdGluZyBkb2N1bWVudGF0aW9uIGlzIGluIHRoZSAlc0dhbGxlcnkgQ29kZXglcy4iKQoKLyogdGVtcGxhdGVzL2Jsb2Nrcy9XZWJEYXZVcmwudHBsICovCmdldHRleHQoIldlYkRBViBVUkwiKSAvKiBhbHNvIGluOiB0ZW1wbGF0ZXMvYmxvY2tzL2Jsb2Nrcy5pbmMgKi8K');
expand_6421a0d81d($outputDir, 'templates/ItemAddWebDav.tpl', 'eyoKICogJFJldmlzaW9uOiAxNTcwNCAkCiAqIElmIHlvdSB3YW50IHRvIGN1c3RvbWl6ZSB0aGlzIGZpbGUsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5IHNpbmNlIGZ1dHVyZSB1cGdyYWRlcwogKiBtYXkgb3ZlcndyaXRlIGl0LiAgSW5zdGVhZCwgY29weSBpdCBpbnRvIGEgbmV3IGRpcmVjdG9yeSBjYWxsZWQgImxvY2FsIiBhbmQgZWRpdCB0aGF0CiAqIHZlcnNpb24uICBHYWxsZXJ5IHdpbGwgbG9vayBmb3IgdGhhdCBmaWxlIGZpcnN0IGFuZCB1c2UgaXQgaWYgaXQgZXhpc3RzLgogKn0KPGRpdiBjbGFzcz0iZ2JCbG9jayI+CntpbmNsdWRlIGZpbGU9ImdhbGxlcnk6bW9kdWxlcy93ZWJkYXYvdGVtcGxhdGVzL1dlYkRhdk1vdW50LnRwbCIgaXNWaWV3PWZhbHNlfQo8L2Rpdj4K');
expand_6421a0d81d($outputDir, 'templates/WebDavMount.tpl', 'eyoKICogJFJldmlzaW9uOiAxNTc2MyAkCiAqIElmIHlvdSB3YW50IHRvIGN1c3RvbWl6ZSB0aGlzIGZpbGUsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5IHNpbmNlIGZ1dHVyZSB1cGdyYWRlcwogKiBtYXkgb3ZlcndyaXRlIGl0LiAgSW5zdGVhZCwgY29weSBpdCBpbnRvIGEgbmV3IGRpcmVjdG9yeSBjYWxsZWQgImxvY2FsIiBhbmQgZWRpdCB0aGF0CiAqIHZlcnNpb24uICBHYWxsZXJ5IHdpbGwgbG9vayBmb3IgdGhhdCBmaWxlIGZpcnN0IGFuZCB1c2UgaXQgaWYgaXQgZXhpc3RzLgogKn0Ke2lmIGVtcHR5KCRpdGVtKX0ge2Fzc2lnbiB2YXI9aXRlbSB2YWx1ZT0kdGhlbWUuaXRlbX0gey9pZn0KeyogU3dpdGNoIGJldHdlZW4gdmlldyAvIGJsb2NrIGxheW91dCAqfQp7YXNzaWduIHZhcj1pc1ZpZXcgdmFsdWU9JGlzVmlld3xkZWZhdWx0OnRydWV9Cgp7Zy0+Y2FsbGJhY2sgdHlwZT0id2ViZGF2LkxvYWRNb3VudExpbmsiIGl0ZW1JZD0kaXRlbS5pZH0Ke2Fzc2lnbiB2YXI9bGluayB2YWx1ZT0kYmxvY2sud2ViZGF2LkxvYWRNb3VudExpbmt9Cgp7KiBPbmx5IHNob3cgdGhlIGJsb2NrIGZvciBhbGJ1bXMgKn0Ke2lmICRpc1ZpZXcgb3IgJGl0ZW0uY2FuQ29udGFpbkNoaWxkcmVufQoKe2lmICRpc1ZpZXd9CjxkaXYgY2xhc3M9ImdiQmxvY2sgZ2NCYWNrZ3JvdW5kMSI+CiAgPGgyPiB7Zy0+dGV4dCB0ZXh0PSJXZWJEQVYgTW91bnQgSW5zdHJ1Y3Rpb25zIn0gPC9oMj4KPC9kaXY+Cgo8ZGl2IGNsYXNzPSJnYkJsb2NrIj4Key9pZn0KICA8ZGl2IGNsYXNzPSJnaURlc2NyaXB0aW9uIj4KICAgIDxwPgogICAgCiAgICAgIHtjYXB0dXJlIG5hbWU9bW91bnRMaW5rfTxhIGhyZWY9InskbGluay5ocmVmfSJ7aWYgaXNzZXQoJGxpbmsuc2NyaXB0KX0gb25jbGljaz0ieyRsaW5rLnNjcmlwdH0iey9pZn0geyRsaW5rLmF0dHJzfT57L2NhcHR1cmV9IAogICAgICB7Zy0+dGV4dCB0ZXh0PSIlc0NsaWNrIGhlcmUlcyB0byBtb3VudCBHYWxsZXJ5IG9uIHlvdXIgZGVza3RvcCB3aXRoIGEgV2ViREFWIGNsaWVudC4gIERvY3VtZW50YXRpb24gb24gbW91bnRpbmcgR2FsbGVyeSB3aXRoIFdlYkRBViBpcyBpbiB0aGUgJXNHYWxsZXJ5IENvZGV4JXMuIgogICAgICAgICAgICAgICBhcmcxPSRzbWFydHkuY2FwdHVyZS5tb3VudExpbmsgYXJnMj0iPC9hPiIKICAgICAgICAgICAgICAgYXJnMz0iPGEgaHJlZj1cImh0dHA6Ly9jb2RleC5nYWxsZXJ5Mi5vcmcvaW5kZXgucGhwL0dhbGxlcnkyOk1vZHVsZXM6d2ViZGF2OnVzZXJcIj4iIGFyZzQ9IjwvYT4ifQogICAgPC9wPgogICAgPHA+CiAgICAgIHtjYXB0dXJlIG5hbWU9Y29ubmVjdFVybH17Zy0+dXJsIGFyZzE9ImNvbnRyb2xsZXI9d2ViZGF2LldlYkRhdiIgYXJnMj0iaXRlbUlkPWAkaXRlbS5pZGAiIGZvcmNlRnVsbFVybD10cnVlIGZvcmNlU2Vzc2lvbklkPWZhbHNlIHVzZUF1dGhUb2tlbj1mYWxzZX17L2NhcHR1cmV9CiAgICAgIHtnLT50ZXh0IHRleHQ9IkFsdGVybmF0aXZlbHksIHlvdSBjYW4gZW50ZXIgdGhlIGZvbGxvd2luZyBVUkwgaW4geW91ciBXZWJEQVYgY2xpZW50OiJ9CiAgICAgICA8YSBocmVmPSJ7JHNtYXJ0eS5jYXB0dXJlLmNvbm5lY3RVcmx9Ij57JHNtYXJ0eS5jYXB0dXJlLmNvbm5lY3RVcmx9PC9hPgogICAgPC9wPgogIDwvZGl2Pgp7aWYgJGlzVmlld30KPC9kaXY+CnsvaWZ9CnsvaWZ9Cg==');
expand_6421a0d81d($outputDir, 'templates/WebDavSiteAdmin.tpl', 'eyoKICogJFJldmlzaW9uOiAxNTcyMSAkCiAqIElmIHlvdSB3YW50IHRvIGN1c3RvbWl6ZSB0aGlzIGZpbGUsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5IHNpbmNlIGZ1dHVyZSB1cGdyYWRlcwogKiBtYXkgb3ZlcndyaXRlIGl0LiAgSW5zdGVhZCwgY29weSBpdCBpbnRvIGEgbmV3IGRpcmVjdG9yeSBjYWxsZWQgImxvY2FsIiBhbmQgZWRpdCB0aGF0CiAqIHZlcnNpb24uICBHYWxsZXJ5IHdpbGwgbG9vayBmb3IgdGhhdCBmaWxlIGZpcnN0IGFuZCB1c2UgaXQgaWYgaXQgZXhpc3RzLgogKn0KPGRpdiBjbGFzcz0iZ2JCbG9jayBnY0JhY2tncm91bmQxIj4KICA8aDI+IHtnLT50ZXh0IHRleHQ9IldlYkRBViBTZXR0aW5ncyJ9IDwvaDI+CjwvZGl2PgoKe2lmICEkV2ViRGF2U2l0ZUFkbWluLmNvZGV9CiAgPGRpdiBjbGFzcz0iZ2JCbG9jayI+CiAgICA8aDMgY2xhc3M9ImdpU3VjY2VzcyI+IHtnLT50ZXh0IHRleHQ9IkNvbmZpZ3VyYXRpb24gY2hlY2tlZCBzdWNjZXNzZnVsbHkifSA8L2gzPgoKICAgIDxwIGNsYXNzPSJnaURlc2NyaXB0aW9uIj4KICAgICAge2ctPnRleHQgdGV4dD0iTW9zdCBXZWJEQVYgY2xpZW50cyB3aWxsIHN1Y2Nlc3NmdWxseSBjb25uZWN0LiAgRG9jdW1lbnRhdGlvbiBvbiBtb3VudGluZyBHYWxsZXJ5IHdpdGggV2ViREFWIGlzIGluIHRoZSAlc0dhbGxlcnkgQ29kZXglcy4iIGFyZzE9IjxhIGhyZWY9XCJodHRwOi8vY29kZXguZ2FsbGVyeTIub3JnL2luZGV4LnBocC9HYWxsZXJ5MjpNb2R1bGVzOndlYmRhdjp1c2VyXCI+IiBhcmcyPSI8L2E+In0KICAgIDwvcD4KCiAgICA8cCBjbGFzcz0iZ2lEZXNjcmlwdGlvbiI+CiAgICAgIHtnLT50ZXh0IHRleHQ9IlRoZSBVUkwgdG8gY29ubmVjdCB0byBHYWxsZXJ5IHdpdGggV2ViREFWIGlzOiJ9IDxhIGhyZWY9IntnLT51cmwgYXJnMT0iY29udHJvbGxlcj13ZWJkYXYuV2ViRGF2IiBmb3JjZUZ1bGxVcmw9dHJ1ZSBmb3JjZVNlc3Npb25JZD1mYWxzZSB1c2VBdXRoVG9rZW49ZmFsc2V9Ij4ge2ctPnVybCBhcmcxPSJjb250cm9sbGVyPXdlYmRhdi5XZWJEYXYiIGZvcmNlRnVsbFVybD10cnVlIGZvcmNlU2Vzc2lvbklkPWZhbHNlIHVzZUF1dGhUb2tlbj1mYWxzZX0gPC9hPgogICAgPC9wPgogIDwvZGl2Pgp7L2lmfQoKe2lmICRXZWJEYXZTaXRlQWRtaW4uY29kZSAmIFdFQkRBVl9TVEFUVVNfTk9fWE1MX1BBUlNFUn0KICA8ZGl2IGNsYXNzPSJnYkJsb2NrIj4KICAgIDxoMyBjbGFzcz0iZ2lFcnJvciI+IHtnLT50ZXh0IHRleHQ9IlBIUCBoYXMgbm8gWE1MIHN1cHBvcnQifSA8L2gzPgoKICAgIDxwIGNsYXNzPSJnaURlc2NyaXB0aW9uIj4KICAgICAge2ctPnRleHQgdGV4dD0iWW91IGNhbid0IGNvbm5lY3Qgd2l0aCBXZWJEQVYgYmVjYXVzZSBQSFAgaGFzIG5vIFhNTCBzdXBwb3J0IG9uIHRoaXMgc2VydmVyLiAgVHJvdWJsZXNob290aW5nIGRvY3VtZW50YXRpb24gaXMgaW4gdGhlICVzR2FsbGVyeSBDb2RleCVzLiIgYXJnMT0iPGEgaHJlZj1cImh0dHA6Ly9jb2RleC5nYWxsZXJ5Mi5vcmcvaW5kZXgucGhwL0dhbGxlcnkyOk1vZHVsZXM6d2ViZGF2OmFkbWluXCI+IiBhcmcyPSI8L2E+In0KICAgIDwvcD4KICA8L2Rpdj4Key9pZn0KCntpZiAkV2ViRGF2U2l0ZUFkbWluLmNvZGUgJiBXRUJEQVZfU1RBVFVTX01FVEhPRF9OT1RfSEFORExFRH0KICA8ZGl2IGNsYXNzPSJnYkJsb2NrIj4KICAgIDxoMyBjbGFzcz0iZ2lFcnJvciI+IHtnLT50ZXh0IHRleHQ9IldlYkRBViByZXF1ZXN0cyBub3QgaGFuZGxlZCJ9IDwvaDM+CgogICAgPHAgY2xhc3M9ImdpRGVzY3JpcHRpb24iPgogICAgICB7Zy0+dGV4dCB0ZXh0PSJZb3UgY2FuJ3QgY29ubmVjdCB3aXRoIFdlYkRBViBiZWNhdXNlIHRoaXMgc2VydmVyIGRvZXNuJ3QgcGFzcyBXZWJEQVYgcmVxdWVzdHMgdG8gR2FsbGVyeS4gIFRyb3VibGVzaG9vdGluZyBkb2N1bWVudGF0aW9uIGlzIGluIHRoZSAlc0dhbGxlcnkgQ29kZXglcy4iIGFyZzE9IjxhIGhyZWY9XCJodHRwOi8vY29kZXguZ2FsbGVyeTIub3JnL2luZGV4LnBocC9HYWxsZXJ5MjpNb2R1bGVzOndlYmRhdjphZG1pblwiPiIgYXJnMj0iPC9hPiJ9CiAgICA8L3A+CiAgPC9kaXY+CnsvaWZ9Cgp7aWYgJFdlYkRhdlNpdGVBZG1pbi5jb2RlICYgV0VCREFWX1NUQVRVU19IVFRQQVVUSF9NT0RVTEVfRElTQUJMRUR9CiAgPGRpdiBjbGFzcz0iZ2JCbG9jayI+CiAgICA8aDMgY2xhc3M9ImdpV2FybmluZyI+IHtnLT50ZXh0IHRleHQ9IkhUVFAgYXV0aCBtb2R1bGUgZGlzYWJsZWQifSA8L2gzPgoKICAgIDxwIGNsYXNzPSJnaURlc2NyaXB0aW9uIj4KICAgICAge2NhcHR1cmUgYXNzaWduPSJhZG1pblBsdWdpbnNVcmwifXtnLT51cmwgYXJnMT0idmlldz1jb3JlLlNpdGVBZG1pbiIgYXJnMj0ic3ViVmlldz1jb3JlLkFkbWluUGx1Z2lucyIgcmV0dXJuPXRydWV9ey9jYXB0dXJlfQogICAgICB7Zy0+dGV4dCB0ZXh0PSJZb3UgY2FuIGNvbm5lY3Qgd2l0aCBXZWJEQVYgYW5vbnltb3VzbHksIGJ1dCB5b3UgY2FuJ3QgZG8gYW55dGhpbmcgd2hpY2ggcmVxdWlyZXMgeW91IHRvIGxvZ2luIGJlY2F1c2UgdGhlIEhUVFAgYXV0aCBtb2R1bGUgaXMgZGlzYWJsZWQuICBZb3Ugc2hvdWxkIGFjdGl2YXRlIHRoZSBIVFRQIGF1dGggbW9kdWxlIGluIHRoZSAlc1NpdGUgQWRtaW4gUGx1Z2lucyBvcHRpb24lcy4gIFRyb3VibGVzaG9vdGluZyBkb2N1bWVudGF0aW9uIGlzIGluIHRoZSAlc0dhbGxlcnkgQ29kZXglcy4iIGFyZzE9IjxhIGhyZWY9XCIkYWRtaW5QbHVnaW5zVXJsXCI+IiBhcmcyPSI8L2E+IiBhcmczPSI8YSBocmVmPVwiaHR0cDovL2NvZGV4LmdhbGxlcnkyLm9yZy9pbmRleC5waHAvR2FsbGVyeTI6TW9kdWxlczp3ZWJkYXY6YWRtaW5cIj4iIGFyZzQ9IjwvYT4ifQogICAgPC9wPgogIDwvZGl2Pgp7ZWxzZWlmICRXZWJEYXZTaXRlQWRtaW4uY29kZSAmIFdFQkRBVl9TVEFUVVNfSFRUUEFVVEhfQVVUSF9QTFVHSU5TX0RJU0FCTEVEfQogIDxkaXYgY2xhc3M9ImdiQmxvY2siPgogICAgPGgzIGNsYXNzPSJnaVdhcm5pbmciPiB7Zy0+dGV4dCB0ZXh0PSJIVFRQIGF1dGggcGx1Z2luIGRpc2FibGVkIn0gPC9oMz4KCiAgICA8cCBjbGFzcz0iZ2lEZXNjcmlwdGlvbiI+CiAgICAgIHtnLT50ZXh0IHRleHQ9IllvdSBjYW4gY29ubmVjdCB3aXRoIFdlYkRBViBhbm9ueW1vdXNseSwgYnV0IHlvdSBjYW4ndCBkbyBhbnl0aGluZyB3aGljaCByZXF1aXJlcyB5b3UgdG8gbG9naW4gYmVjYXVzZSBuZWl0aGVyIEhUVFAgYXV0aGVudGljYXRpb24gbm9yIHNlcnZlciBhdXRoZW50aWNhdGlvbiBhcmUgZW5hYmxlZCBpbiB0aGUgSFRUUCBhdXRoIG1vZHVsZS4gIFlvdSBzaG91bGQgYWN0aXZhdGUgSFRUUCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgc2V0dGluZ3Mgb2YgdGhlIEhUVFAgYXV0aCBtb2R1bGUuIn0KICAgIDwvcD4KICA8L2Rpdj4KCnsvaWZ9Cgp7aWYgJFdlYkRhdlNpdGVBZG1pbi5jb2RlICYgV0VCREFWX1NUQVRVU19DT05ORUNUX1JVTEVfRElTQUJMRUR9CiAgPGRpdiBjbGFzcz0iZ2JCbG9jayI+CiAgICA8aDMgY2xhc3M9ImdpV2FybmluZyI+IHtnLT50ZXh0IHRleHQ9IidDb25uZWN0IHRvIFdlYkRBVicgcnVsZSBkaXNhYmxlZCJ9IDwvaDM+CgogICAgPHAgY2xhc3M9ImdpRGVzY3JpcHRpb24iPgogICAgICB7Y2FwdHVyZSBhc3NpZ249ImFkbWluUmV3cml0ZVVybCJ9e2ctPnVybCBhcmcxPSJ2aWV3PWNvcmUuU2l0ZUFkbWluIiBhcmcyPSJzdWJWaWV3PXJld3JpdGUuQWRtaW5SZXdyaXRlIiByZXR1cm49dHJ1ZX17L2NhcHR1cmV9CiAgICAgIHtnLT50ZXh0IHRleHQ9Ik1vc3QgV2ViREFWIGNsaWVudHMgd2lsbCBmYWlsIHRvIGNvbm5lY3QgYmVjYXVzZSB0aGUgVVJMIHJld3JpdGUgcnVsZSB0byBnZW5lcmF0ZSBzaG9ydCBXZWJEQVYgVVJMcyBpcyBkaXNhYmxlZC4gIFlvdSBzaG91bGQgYWN0aXZhdGUgdGhlICdDb25uZWN0IHRvIFdlYkRBVicgcnVsZSBpbiB0aGUgJXNTaXRlIEFkbWluIFVSTCBSZXdyaXRlIG9wdGlvbiVzLiAgVHJvdWJsZXNob290aW5nIGRvY3VtZW50YXRpb24gaXMgaW4gdGhlICVzR2FsbGVyeSBDb2RleCVzLiIgYXJnMT0iPGEgaHJlZj1cIiRhZG1pblJld3JpdGVVcmxcIj4iIGFyZzI9IjwvYT4iIGFyZzM9IjxhIGhyZWY9XCJodHRwOi8vY29kZXguZ2FsbGVyeTIub3JnL2luZGV4LnBocC9HYWxsZXJ5MjpNb2R1bGVzOndlYmRhdjphZG1pblwiPiIgYXJnND0iPC9hPiJ9CiAgICA8L3A+CgogICAgPHAgY2xhc3M9ImdpRGVzY3JpcHRpb24iPgogICAgICB7Zy0+dGV4dCB0ZXh0PSJUaGUgVVJMIHRvIGNvbm5lY3QgdG8gR2FsbGVyeSB3aXRoIFdlYkRBViBpczoifSA8YSBocmVmPSJ7Zy0+dXJsIGFyZzE9ImNvbnRyb2xsZXI9d2ViZGF2LldlYkRhdiIgZm9yY2VGdWxsVXJsPXRydWUgZm9yY2VTZXNzaW9uSWQ9ZmFsc2UgdXNlQXV0aFRva2VuPWZhbHNlfSI+IHtnLT51cmwgYXJnMT0iY29udHJvbGxlcj13ZWJkYXYuV2ViRGF2IiBmb3JjZUZ1bGxVcmw9dHJ1ZSBmb3JjZVNlc3Npb25JZD1mYWxzZSB1c2VBdXRoVG9rZW49ZmFsc2V9IDwvYT4KICAgIDwvcD4KICA8L2Rpdj4Key9pZn0KCntpZiAkV2ViRGF2U2l0ZUFkbWluLmNvZGUgJiBXRUJEQVZfU1RBVFVTX01JU1NJTkdfREFWX0hFQURFUlN9CiAgPGRpdiBjbGFzcz0iZ2JCbG9jayI+CiAgICA8aDMgY2xhc3M9ImdpV2FybmluZyI+IHtnLT50ZXh0IHRleHQ9Ik1pc3NpbmcgREFWIGhlYWRlcnMifSA8L2gzPgoKICAgIDxwIGNsYXNzPSJnaURlc2NyaXB0aW9uIj4KICAgICAge2ctPnRleHQgdGV4dD0iU29tZSBXZWJEQVYgY2xpZW50cywgZS5nLiBNYWMgT1MgWCBXZWJEQVZGUywgd2lsbCBmYWlsIHRvIGNvbm5lY3QgYmVjYXVzZSBPUFRJT05TIHJlc3BvbnNlcyBhcmUgbWlzc2luZyBEQVYgaGVhZGVycy4gIFRyb3VibGVzaG9vdGluZyBkb2N1bWVudGF0aW9uIGlzIGluIHRoZSAlc0dhbGxlcnkgQ29kZXglcy4iIGFyZzE9IjxhIGhyZWY9XCJodHRwOi8vY29kZXguZ2FsbGVyeTIub3JnL2luZGV4LnBocC9HYWxsZXJ5MjpNb2R1bGVzOndlYmRhdjphZG1pblwiPiIgYXJnMj0iPC9hPiJ9CiAgICA8L3A+CiAgPC9kaXY+CnsvaWZ9Cgp7aWYgJFdlYkRhdlNpdGVBZG1pbi5jb2RlICYgV0VCREFWX1NUQVRVU19BTFRFUk5BVElWRV9VUkxfSEVBREVSU30KICA8ZGl2IGNsYXNzPSJnYkJsb2NrIj4KICAgIDxoMyBjbGFzcz0iZ2lXYXJuaW5nIj4ge2ctPnRleHQgdGV4dD0iQWx0ZXJuYXRpdmUgVVJMIG1pc3NpbmcgREFWIGhlYWRlcnMifSA8L2gzPgoKICAgIDxwIGNsYXNzPSJnaURlc2NyaXB0aW9uIj4KICAgICAge2ctPnRleHQgdGV4dD0iQmVjYXVzZSBPUFRJT05TIHJlc3BvbnNlcyBhcmUgbWlzc2luZyBEQVYgaGVhZGVycywgd2UgdHJ5IHRvIGZhbGwgYmFjayBvbiBhbiBhbHRlcm5hdGl2ZSBVUkwsIGJ1dCBhbHRlcm5hdGl2ZSBVUkwgcmVzcG9uc2VzIGFyZSBhbHNvIG1pc3NpbmcgREFWIGhlYWRlcnMuICBUcm91Ymxlc2hvb3RpbmcgZG9jdW1lbnRhdGlvbiBpcyBpbiB0aGUgJXNHYWxsZXJ5IENvZGV4JXMuIiBhcmcxPSI8YSBocmVmPVwiaHR0cDovL2NvZGV4LmdhbGxlcnkyLm9yZy9pbmRleC5waHAvR2FsbGVyeTI6TW9kdWxlczp3ZWJkYXY6YWRtaW5cIj4iIGFyZzI9IjwvYT4ifQogICAgPC9wPgogIDwvZGl2Pgp7L2lmfQoKe2lmICRXZWJEYXZTaXRlQWRtaW4uY29kZSAmIFdFQkRBVl9TVEFUVVNfUkVXUklURV9NT0RVTEVfRElTQUJMRUR9CiAgPGRpdiBjbGFzcz0iZ2JCbG9jayI+CiAgICA8aDMgY2xhc3M9ImdpV2FybmluZyI+IHtnLT50ZXh0IHRleHQ9IlVSTCByZXdyaXRlIG1vZHVsZSBkaXNhYmxlZCJ9IDwvaDM+CgogICAgPHAgY2xhc3M9ImdpRGVzY3JpcHRpb24iPgogICAgICB7Y2FwdHVyZSBhc3NpZ249ImFkbWluUGx1Z2luc1VybCJ9e2ctPnVybCBhcmcxPSJ2aWV3PWNvcmUuU2l0ZUFkbWluIiBhcmcyPSJzdWJWaWV3PWNvcmUuQWRtaW5QbHVnaW5zIiByZXR1cm49dHJ1ZX17L2NhcHR1cmV9CiAgICAgIHtnLT50ZXh0IHRleHQ9Ik1vc3QgV2ViREFWIGNsaWVudHMgd2lsbCBmYWlsIHRvIGNvbm5lY3QgYmVjYXVzZSB0aGUgVVJMIHJld3JpdGUgbW9kdWxlIGlzIGRpc2FibGVkLiAgWW91IHNob3VsZCBhY3RpdmF0ZSB0aGUgVVJMIHJld3JpdGUgbW9kdWxlIGluIHRoZSAlc1NpdGUgQWRtaW4gUGx1Z2lucyBvcHRpb24lcyBhbmQgY2hvb3NlIGVpdGhlciBBcGFjaGUgbW9kX3Jld3JpdGUgb3IgSVNBUElfUmV3cml0ZS4gIFRyb3VibGVzaG9vdGluZyBkb2N1bWVudGF0aW9uIGlzIGluIHRoZSAlc0dhbGxlcnkgQ29kZXglcy4iIGFyZzE9IjxhIGhyZWY9XCIkYWRtaW5QbHVnaW5zVXJsXCI+IiBhcmcyPSI8L2E+IiBhcmczPSI8YSBocmVmPVwiaHR0cDovL2NvZGV4LmdhbGxlcnkyLm9yZy9pbmRleC5waHAvR2FsbGVyeTI6TW9kdWxlczp3ZWJkYXY6YWRtaW5cIj4iIGFyZzQ9IjwvYT4ifQogICAgPC9wPgogIDwvZGl2Pgp7L2lmfQoKe2lmICRXZWJEYXZTaXRlQWRtaW4uY29kZSAmIFdFQkRBVl9TVEFUVVNfQkFEX1JFV1JJVEVfUEFSU0VSfQogIDxkaXYgY2xhc3M9ImdiQmxvY2siPgogICAgPGgzIGNsYXNzPSJnaVdhcm5pbmciPiB7Zy0+dGV4dCB0ZXh0PSJCYWQgVVJMIHJld3JpdGUgY29uZmlndXJhdGlvbiJ9IDwvaDM+CgogICAgPHAgY2xhc3M9ImdpRGVzY3JpcHRpb24iPgogICAgICB7Y2FwdHVyZSBhc3NpZ249ImFkbWluUGx1Z2luc1VybCJ9e2ctPnVybCBhcmcxPSJ2aWV3PWNvcmUuU2l0ZUFkbWluIiBhcmcyPSJzdWJWaWV3PWNvcmUuQWRtaW5QbHVnaW5zIiByZXR1cm49dHJ1ZX17L2NhcHR1cmV9CiAgICAgIHtnLT50ZXh0IHRleHQ9IlBIUCBQYXRoSW5mbyByZXdyaXRlIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgcnVsZSB0byBmYWxsIGJhY2sgb24gYW4gYWx0ZXJuYXRpdmUgVVJMLiAgWW91IHNob3VsZCB1bmluc3RhbGwgYW5kIHJlaW5zdGFsbCB0aGUgVVJMIHJld3JpdGUgbW9kdWxlIGluIHRoZSAlc1NpdGUgQWRtaW4gUGx1Z2lucyBvcHRpb24lcyBhbmQgY2hvb3NlIGVpdGhlciBBcGFjaGUgbW9kX3Jld3JpdGUgb3IgSVNBUElfUmV3cml0ZS4gIFRyb3VibGVzaG9vdGluZyBpbmZvcm1hdGlvbiBpcyBpbiB0aGUgJXNHYWxsZXJ5IENvZGV4JXMuIiBhcmcxPSI8YSBocmVmPVwiJGFkbWluUGx1Z2luc1VybFwiPiIgYXJnMj0iPC9hPiIgYXJnMz0iPGEgaHJlZj1cImh0dHA6Ly9jb2RleC5nYWxsZXJ5Mi5vcmcvaW5kZXgucGhwL0dhbGxlcnkyOk1vZHVsZXM6d2ViZGF2OmFkbWluXCI+IiBhcmc0PSI8L2E+In0KICAgIDwvcD4KICA8L2Rpdj4Key9pZn0KCntpZiAkV2ViRGF2U2l0ZUFkbWluLmNvZGUgJiBXRUJEQVZfU1RBVFVTX09QVElPTlNfUlVMRV9ESVNBQkxFRH0KICA8ZGl2IGNsYXNzPSJnYkJsb2NrIj4KICAgIDxoMyBjbGFzcz0iZ2lXYXJuaW5nIj4ge2ctPnRleHQgdGV4dD0iJ09QVElPTlMgUmVxdWVzdHMnIHJ1bGUgZGlzYWJsZWQifSA8L2gzPgoKICAgIDxwIGNsYXNzPSJnaURlc2NyaXB0aW9uIj4KICAgICAge2NhcHR1cmUgYXNzaWduPSJhZG1pblJld3JpdGVVcmwifXtnLT51cmwgYXJnMT0idmlldz1jb3JlLlNpdGVBZG1pbiIgYXJnMj0ic3ViVmlldz1yZXdyaXRlLkFkbWluUmV3cml0ZSIgcmV0dXJuPXRydWV9ey9jYXB0dXJlfQogICAgICB7Zy0+dGV4dCB0ZXh0PSJUaGUgVVJMIHJld3JpdGUgcnVsZSB0byBmYWxsIGJhY2sgb24gYW4gYWx0ZXJuYXRpdmUgVVJMIGlzIGRpc2FibGVkLiAgWW91IHNob3VsZCBhY3RpdmF0ZSB0aGUgV2ViREFWICdPUFRJT05TIFJlcXVlc3RzJyBydWxlIGluIHRoZSAlc1NpdGUgQWRtaW4gVVJMIFJld3JpdGUgb3B0aW9uJXMuICBUcm91Ymxlc2hvb3RpbmcgZG9jdW1lbnRhdGlvbiBpcyBpbiB0aGUgJXNHYWxsZXJ5IENvZGV4JXMuIiBhcmcxPSI8YSBocmVmPVwiJGFkbWluUmV3cml0ZVVybFwiPiIgYXJnMj0iPC9hPiIgYXJnMz0iPGEgaHJlZj1cImh0dHA6Ly9jb2RleC5nYWxsZXJ5Mi5vcmcvaW5kZXgucGhwL0dhbGxlcnkyOk1vZHVsZXM6d2ViZGF2OmFkbWluXCI+IiBhcmc0PSI8L2E+In0KICAgIDwvcD4KICA8L2Rpdj4Key9pZn0KCntpZiAkV2ViRGF2U2l0ZUFkbWluLmNvZGUgJiBXRUJEQVZfU1RBVFVTX0VSUk9SX1VOS05PV059CiAgPGRpdiBjbGFzcz0iZ2JCbG9jayI+CiAgICA8aDMgY2xhc3M9ImdpV2FybmluZyI+IHtnLT50ZXh0IHRleHQ9IlVua25vd24gQ2F1c2UifSA8L2gzPgoKICAgIDxwIGNsYXNzPSJnaURlc2NyaXB0aW9uIj4KICAgICAge2ctPnRleHQgdGV4dD0iU29tZSBXZWJEQVYgY2xpZW50cywgZS5nLiBNYWMgT1MgWCBXZWJEQVZGUywgd2lsbCBmYWlsIHRvIGNvbm5lY3QgYW5kIGF1dG9tYXRlZCBjaGVja3MgZmFpbGVkIHRvIGZpbmQgYSBjYXVzZS4gIFRyb3VibGVzaG9vdGluZyBkb2N1bWVudGF0aW9uIGlzIGluIHRoZSAlc0dhbGxlcnkgQ29kZXglcy4iIGFyZzE9IjxhIGhyZWY9XCJodHRwOi8vY29kZXguZ2FsbGVyeTIub3JnL2luZGV4LnBocC9HYWxsZXJ5MjpNb2R1bGVzOndlYmRhdjphZG1pblwiPiIgYXJnMj0iPC9hPiJ9CiAgICA8L3A+CiAgPC9kaXY+CnsvaWZ9Cg==');
expand_6421a0d81d($outputDir, 'templates/blocks/WebDavUrl.tpl', 'eyoKICogJFJldmlzaW9uOiAxNTcwNCAkCiAqIElmIHlvdSB3YW50IHRvIGN1c3RvbWl6ZSB0aGlzIGZpbGUsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5IHNpbmNlIGZ1dHVyZSB1cGdyYWRlcwogKiBtYXkgb3ZlcndyaXRlIGl0LiAgSW5zdGVhZCwgY29weSBpdCBpbnRvIGEgbmV3IGRpcmVjdG9yeSBjYWxsZWQgImxvY2FsIiBhbmQgZWRpdCB0aGF0CiAqIHZlcnNpb24uICBHYWxsZXJ5IHdpbGwgbG9vayBmb3IgdGhhdCBmaWxlIGZpcnN0IGFuZCB1c2UgaXQgaWYgaXQgZXhpc3RzLgogKn0KPGRpdiBjbGFzcz0ieyRjbGFzc30iPgogIDxoMz4ge2ctPnRleHQgdGV4dD0iV2ViREFWIFVSTCJ9IDwvaDM+CntpbmNsdWRlIGZpbGU9ImdhbGxlcnk6bW9kdWxlcy93ZWJkYXYvdGVtcGxhdGVzL1dlYkRhdk1vdW50LnRwbCIgaXNWaWV3PWZhbHNlfQo8L2Rpdj4KIA==');
expand_6421a0d81d($outputDir, 'templates/blocks/blocks.inc', 'PD9waHAKJGJsb2NrcyA9IGFycmF5KAogICAgJ1dlYkRhdlVybCcgPT4gYXJyYXkoCgknZGVzY3JpcHRpb24nID0+ICRnYWxsZXJ5LT5pMThuKCdXZWJEQVYgVVJMJykpKTsKPz4K');
}
function expand_6421a0d81d($outputDir, $relativePath, $data) {
$fd = fopen($outputDir . $relativePath, 'w');
fwrite($fd, base64_decode($data));
fclose($fd);
}
$unpackFunction = "unpack_6421a0d81d";
?>
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists